diff --git a/.gitignore b/.gitignore index 3256e6cd..6d44b432 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.so # Distribution / packaging +vendor/github.com/therecipe/qt/ # Configuration *.vscode diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 3d590374..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "vendor/github.com/SkycoinProject/skycoin"] - path = vendor/github.com/SkycoinProject/skycoin - url = https://github.com/SkycoinProject/skycoin diff --git a/.travis.yml b/.travis.yml index baea3bee..7aacf301 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,16 @@ go: - 1.12.6 services: - docker + - xvfb go_import_path: github.com/fibercrypto/fibercryptowallet cache: directories: - $GOPATH/src/github.com/therecipe - $GOPATH/bin +env: + global: + - XARGS="-screen 0 1024x768x24" + matrix: include: - stage: RPI @@ -38,15 +43,29 @@ matrix: - make run-docker CMD='make test' - make run-docker CMD='make install coveralls ; make test-cover-travis' - stage: Linux + before_install: + - source ./ci-scripts/install-$TRAVIS_OS_NAME.sh install: - make install-docker-deps - make install-deps-no-envs - make install-linters + before_script: + - echo "PATH=$PATH"; + - echo "PIP=$PIP"; + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet clean + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet/tiny-firmware/protob install-deps-nanopb + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet/tiny-firmware/protob/nanopb/vendor/nanopb/generator/proto + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet emulator + - make -C ./tmp/hardware-wallet run-emulator & true; + # Run self-tests + - ps aux | grep emulator + script: - make clean - DEFAULT_TARGET=linux make build-docker - make clean - make run-docker CMD='make test' + - make run-docker CMD='make test-skyhw' - make lint - make run-docker CMD='make install-coveralls ; make test-cover-travis' # FIXME: Restore Windows builds @@ -78,13 +97,28 @@ matrix: - stage: MacOS os: osx osx_image: xcode10.2 + before_install: + - source ./ci-scripts/install-$TRAVIS_OS_NAME.sh install: - make install-deps - make install-coveralls + before_script: + - echo "PATH=$PATH"; + - echo "PIP=$PIP"; + # Start Xvfb on osx + - ( sudo Xvfb :99 -ac ${XARGS}; echo "Xvfb ok" )& export DISPLAY=:99 + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet clean + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet/tiny-firmware/protob install-deps-nanopb + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet/tiny-firmware/protob/nanopb/vendor/nanopb/generator/proto + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet emulator + - make -C ./tmp/hardware-wallet run-emulator & true; + # Run self-tests + - ps aux | grep emulator script: - make clean - make build - make test + - make test-skyhw - make build-icon - make lint - make test-cover-travis diff --git a/Gopkg.lock b/Gopkg.lock index 8289871f..00f9b782 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,12 +2,15 @@ [[projects]] + digest = "1:632e5f740de6cafce1c08f659bfa10e75f7e7938dfaeb3d99c82fcbf484484e2" name = "github.com/NYTimes/gziphandler" packages = ["."] + pruneopts = "NUT" revision = "dd0439581c7657cb652dfe5c71d7d48baf39541d" version = "v1.1.1" [[projects]] + digest = "1:016b62efaf0947541de680c1d4ce92085a9954581c8a423847c6455c4aca18c3" name = "github.com/SkycoinProject/skycoin" packages = [ "src/api", @@ -54,180 +57,276 @@ "src/visor/blockdb", "src/visor/dbutil", "src/visor/historydb", - "src/wallet" + "src/wallet", ] + pruneopts = "" revision = "66f5df5849d339d403a475d523ebe7d1a4c92c31" version = "v0.27.0" [[projects]] + digest = "1:707ebe952a8b3d00b343c01536c79c73771d100f63ec6babeaed5c79e2b8a8dd" name = "github.com/beorn7/perks" packages = ["quantile"] + pruneopts = "NUT" revision = "37c8de3658fcb183f997c4e13e8337516ab753e6" version = "v1.0.1" [[projects]] + digest = "1:45c41cd27a8d986998680bfc86da0bbff5fa4f90d0f446c00636c8b099028ffe" name = "github.com/blang/semver" packages = ["."] + pruneopts = "NUT" revision = "ba2c2ddd89069b46a7011d4106f6868f17ee1705" version = "v3.6.1" [[projects]] + digest = "1:a12d94258c5298ead75e142e8001224bf029f302fed9e96cd39c0eaf90f3954d" name = "github.com/boltdb/bolt" packages = ["."] + pruneopts = "NUT" revision = "2f1ce7a837dcb8da3ec595b1dac9d0632f0f99e8" version = "v1.3.1" [[projects]] + digest = "1:063db6a0b87d39e99b3102a293cf675c23bb82074acea0a3e9276b3331216c2a" name = "github.com/cenkalti/backoff" packages = ["."] + pruneopts = "NUT" revision = "61153c768f31ee5f130071d08fc82b85208528de" version = "v1.1.0" [[projects]] + digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" name = "github.com/davecgh/go-spew" packages = ["spew"] + pruneopts = "NUT" revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" version = "v1.1.1" [[projects]] - name = "github.com/golang/protobuf" + branch = "develop" + digest = "1:93c50d5f0b1e381b8116b0b644bf8890b0d8bfedb7fe18d8304c0e5ad4488f79" + name = "github.com/fibercrypto/skywallet-go" + packages = [ + "src/integration/proxy", + "src/skywallet", + "src/skywallet/usb", + "src/skywallet/wire", + "src/usb/lowlevel/hidapi", + "src/usb/lowlevel/libusb", + ] + pruneopts = "T" + revision = "8e10440cf9e721a0944f046dcf78c07e97489cf3" + +[[projects]] + branch = "develop" + digest = "1:ec1a1f7bbfba1362708324d1b7aff4153086c837cdfe13eabd241a4cc9bac44d" + name = "github.com/fibercrypto/skywallet-protob" + packages = [ + "go", + "go/google/protobuf", + ] + pruneopts = "NUT" + revision = "81be0e9029a26fadc841a14e84bd8a822b2dd8b5" + +[[projects]] + digest = "1:d439e7c59417e2221733a69fadeabc351a64c96ed02dde6b9d41b009d4139f83" + name = "github.com/gogo/protobuf" packages = ["proto"] - revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" - version = "v1.3.2" + pruneopts = "NUT" + revision = "5628607bb4c51c3157aacc3a50f0ab707582b805" + version = "v1.3.1" + +[[projects]] + digest = "1:a06187c7498a14ab96bb909e09af9ce1687678f355b775bcf1dc84729e2a2100" + name = "github.com/golang/protobuf" + packages = [ + "proto", + "ptypes", + "ptypes/any", + "ptypes/duration", + "ptypes/timestamp", + ] + pruneopts = "NUT" + revision = "d23c5127dc24889085f8ccea5c9d560a57a879d8" + version = "v1.3.3" [[projects]] + digest = "1:406338ad39ab2e37b7f4452906442a3dbf0eb3379dd1f06aafb5c07e769a5fbb" name = "github.com/inconshreveable/mousetrap" packages = ["."] + pruneopts = "NUT" revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" [[projects]] + digest = "1:58999a98719fddbac6303cb17e8d85b945f60b72f48e3a2df6b950b97fa926f1" name = "github.com/konsorten/go-windows-terminal-sequences" packages = ["."] + pruneopts = "NUT" revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" version = "v1.0.2" [[projects]] + digest = "1:bced2617aac935b7931d43bdd5fd5ef3eacbb52291c61e423afe8037f6dd95f9" name = "github.com/mattn/go-colorable" packages = ["."] + pruneopts = "NUT" revision = "98ec13f34aabf44cc914c65a1cfb7b9bc815aef1" version = "v0.1.4" [[projects]] + digest = "1:4c2c63bfd4c2ae0c5a9d7f75cab1f4fac4e8c2ce58f52a73322cefc9bdb4c5bd" name = "github.com/mattn/go-isatty" packages = ["."] - revision = "88ba11cfdc67c7588b30042edf244b2875f892b6" - version = "v0.0.10" + pruneopts = "NUT" + revision = "7b513a986450394f7bbf1476909911b3aa3a55ce" + version = "v0.0.12" [[projects]] + digest = "1:5985ef4caf91ece5d54817c11ea25f182697534f8ae6521eadcd628c142ac4b6" name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] + pruneopts = "NUT" revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" [[projects]] branch = "master" + digest = "1:063d55b87e200bced5e2be658cc70acafb4c5bbc4afa04d4b82f66298b73d089" name = "github.com/mgutz/ansi" packages = ["."] + pruneopts = "NUT" revision = "9520e82c474b0a04dd04f8a40959027271bab992" [[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" name = "github.com/pmezard/go-difflib" packages = ["difflib"] + pruneopts = "NUT" revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" [[projects]] + digest = "1:03bca087b180bf24c4f9060775f137775550a0834e18f0bca0520a868679dbd7" name = "github.com/prometheus/client_golang" packages = [ "prometheus", - "prometheus/promhttp" + "prometheus/promhttp", ] + pruneopts = "NUT" revision = "c5b7fccd204277076155f10851dad72b76a49317" version = "v0.8.0" [[projects]] - branch = "master" + digest = "1:0db23933b8052702d980a3f029149b3f175f7c0eea0cff85b175017d0f2722c0" name = "github.com/prometheus/client_model" packages = ["go"] - revision = "14fe0d1b01d4d5fc031dd4bec1823bd3ebbe8016" + pruneopts = "NUT" + revision = "7bc5445566f0fe75b15de23e6b93886e982d7bf9" + version = "v0.2.0" [[projects]] + digest = "1:0c9d56afe4f5b3ab5658a3270a680db8f6936d7794377fa0b9880663958b18b0" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", - "model" + "model", ] - revision = "287d3e634a1e550c9e463dd7e5a75a422c614505" - version = "v0.7.0" + pruneopts = "NUT" + revision = "d978bcb1309602d68bb4ba69cf3f8ed900e07308" + version = "v0.9.1" [[projects]] + digest = "1:a4b063a766f50cdadc1fce12053e3bde8599f1f8b7621d7e293cd2fc86543a44" name = "github.com/prometheus/procfs" packages = [ ".", "internal/fs", - "internal/util" + "internal/util", ] - revision = "499c85531f756d1129edd26485a5f73871eeb308" - version = "v0.0.5" + pruneopts = "NUT" + revision = "6d489fc7f1d9cd890a250f3ea3431b1744b9623f" + version = "v0.0.8" [[projects]] + digest = "1:c109c5d92f0de1ceeea77ae0d13a20bf0f8e4ef5d3b0e69a40a6d7ac470836bc" name = "github.com/rs/cors" packages = ["."] + pruneopts = "NUT" revision = "db0fe48135e83b5812a5a31be0eea66984b1b521" version = "v1.7.0" [[projects]] + digest = "1:11afe1ad32273aeda2ff5e80317638da5006aff881263b995038900a89494eff" name = "github.com/shopspring/decimal" packages = ["."] + pruneopts = "NUT" revision = "cd690d0c9e2447b1ef2a129a6b7b49077da89b8e" version = "1.1.0" [[projects]] + digest = "1:f4aaa07a6c33f2b354726d0571acbc8ca118837c75709f6353203ae1a3f8eeab" name = "github.com/sirupsen/logrus" packages = ["."] + pruneopts = "NUT" revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" version = "v1.4.2" [[projects]] + branch = "develop" + digest = "1:296eddda33403e4c506e3398ace25de0dfabf46156c86db86e6e0aa69ca43d9d" name = "github.com/skycoin/skycoin" packages = [ - "src/util/file", - "src/util/logging" + "src/cipher", + "src/cipher/base58", + "src/cipher/ripemd160", + "src/cipher/secp256k1-go", + "src/cipher/secp256k1-go/secp256k1-go2", + "src/util/logging", ] - revision = "ff754084df0912bc0d151529e2893ca86618fb3f" - version = "v0.26.0" + pruneopts = "NUT" + revision = "d7e4b2f3e31ea96bdcaba595507fde42baa156b9" [[projects]] + digest = "1:d3533ee568fc00a971617ec09dc0f0b3eddfb4adbc1275f8f6332553d67506b4" name = "github.com/spf13/cobra" packages = ["."] + pruneopts = "NUT" revision = "f2b07da1e2c38d5f12845a4f607e2e1018cbb1f5" version = "v0.0.5" [[projects]] + digest = "1:d115708a27806831d1babbc6f28a7478ddf8e32a7095507c816e2515fb03a810" name = "github.com/spf13/pflag" packages = ["."] + pruneopts = "NUT" revision = "2e9d26c8c37aae03e3f9d4e90b7116f5accb7cab" version = "v1.0.5" [[projects]] + digest = "1:f139b10b830b064ab218c79a5c3f770c2e94c48c92e0d0085099a458490acfde" name = "github.com/stretchr/objx" packages = ["."] + pruneopts = "NUT" revision = "ea4fe68685ee0d3cee7032121851b57e7494e8ea" version = "v0.2.0" [[projects]] + digest = "1:9c5200504d96cb7a3df099e8f79a45cf5df91f575bb51095f8c3355eeed38aa7" name = "github.com/stretchr/testify" packages = [ "assert", "mock", - "require" + "require", ] + pruneopts = "NUT" revision = "2aa2c176b9dab406a6970f6a55f513e8a8c8b18f" [[projects]] branch = "master" + digest = "1:7d48359beaf9338737095261d796704f4df17776183141813200aab4d4b0131c" name = "github.com/therecipe/qt" packages = [ "core", @@ -235,39 +334,81 @@ "internal/binding/runtime", "network", "qml", - "widgets" ] - revision = "2b818d970888dab6bbf6aa2702bc28c1e6fbdb83" + pruneopts = "NUT" + revision = "5074eb6d8c41fdae5d1956af7c286160a40dd8fd" [[projects]] branch = "master" + digest = "1:059bf4e6350ea6202b837cb24216b735d997e29e407f299be040a826c0bc026c" name = "golang.org/x/crypto" packages = [ "bcrypt", "blowfish", "pbkdf2", - "ssh/terminal" + "ssh/terminal", ] - revision = "87dc89f01550277dc22b74ffcf4cd89fa2f40f4c" + pruneopts = "NUT" + revision = "86ce3cb696783b739e41e834e2eead3e1b4aa3fb" [[projects]] branch = "master" + digest = "1:76ee51c3f468493aff39dbacc401e8831fbb765104cbf613b89bef01cf4bad70" name = "golang.org/x/net" packages = ["context"] - revision = "ec77196f6094c3492a8b61f2c11cf937f78992ae" + pruneopts = "NUT" + revision = "16171245cfb220d5317888b716d69c1fb4e7992b" [[projects]] branch = "master" + digest = "1:4e1eac2eb79906608c99a7c513b8a48a0b95ca5478b808eac95abed09bc7860d" name = "golang.org/x/sys" packages = [ "unix", - "windows" + "windows", ] - revision = "b4ff53e7a1cb8ab8ce2e12d50d5d63530183e1a9" + pruneopts = "NUT" + revision = "12a6c2dcc1e4cb348b57847c73987099e261714b" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "8a88de6f7dd20ec8303246d694b5a7239e9652ae9127e78b67210e99ea8bdbf3" + input-imports = [ + "github.com/SkycoinProject/skycoin/src/api", + "github.com/SkycoinProject/skycoin/src/cipher", + "github.com/SkycoinProject/skycoin/src/cipher/base58", + "github.com/SkycoinProject/skycoin/src/cipher/bip39", + "github.com/SkycoinProject/skycoin/src/cipher/testsuite", + "github.com/SkycoinProject/skycoin/src/cli", + "github.com/SkycoinProject/skycoin/src/coin", + "github.com/SkycoinProject/skycoin/src/params", + "github.com/SkycoinProject/skycoin/src/readable", + "github.com/SkycoinProject/skycoin/src/testutil", + "github.com/SkycoinProject/skycoin/src/util/droplet", + "github.com/SkycoinProject/skycoin/src/util/file", + "github.com/SkycoinProject/skycoin/src/util/logging", + "github.com/SkycoinProject/skycoin/src/visor", + "github.com/SkycoinProject/skycoin/src/visor/dbutil", + "github.com/SkycoinProject/skycoin/src/wallet", + "github.com/boltdb/bolt", + "github.com/davecgh/go-spew/spew", + "github.com/fibercrypto/skywallet-go/src/integration/proxy", + "github.com/fibercrypto/skywallet-go/src/skywallet", + "github.com/fibercrypto/skywallet-go/src/skywallet/usb", + "github.com/fibercrypto/skywallet-go/src/skywallet/wire", + "github.com/fibercrypto/skywallet-protob/go", + "github.com/gogo/protobuf/proto", + "github.com/mgutz/ansi", + "github.com/sirupsen/logrus", + "github.com/stretchr/testify/assert", + "github.com/stretchr/testify/mock", + "github.com/stretchr/testify/require", + "github.com/therecipe/qt/core", + "github.com/therecipe/qt/gui", + "github.com/therecipe/qt/qml", + "golang.org/x/crypto/bcrypt", + "golang.org/x/crypto/pbkdf2", + "golang.org/x/crypto/ssh/terminal", + ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 37c0be45..7af3aced 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -28,18 +28,50 @@ ignored = [ "github.com/therecipe/qt" ] +[[constraint]] + name = "github.com/SkycoinProject/skycoin" + version = "0.27.0" + +[[constraint]] + name = "github.com/boltdb/bolt" + version = "1.3.1" + +[[constraint]] + branch = "develop" + name = "github.com/fibercrypto/skywallet-protob" + +[[constraint]] + branch = "develop" + name = "github.com/fibercrypto/skywallet-go" + +[[constraint]] + name = "github.com/gogo/protobuf" + version = "1.3.1" + +[[constraint]] + branch = "master" + name = "github.com/mgutz/ansi" + [[constraint]] name = "github.com/sirupsen/logrus" version = "1.4.2" [[constraint]] - name = "github.com/SkycoinProject/skycoin" - version = "0.27.0" + branch = "master" + name = "golang.org/x/crypto" [prune] go-tests = true unused-packages = true + non-go = true -[[constraint]] - branch = "master" - name = "golang.org/x/crypto" + [[prune.project]] + name = "github.com/fibercrypto/skywallet-go" + non-go = false + unused-packages = false + + [[prune.project]] + name = "github.com/SkycoinProject/skycoin" + non-go = false + unused-packages = false + go-tests = false diff --git a/Makefile b/Makefile index 1cdce040..3a566a6c 100644 --- a/Makefile +++ b/Makefile @@ -101,7 +101,7 @@ DOCKER_QT_TEST ?= simelotech/qt-test deps: ## Add dependencies dep ensure - rm -rf rm -rf vendor/github.com/therecipe + rm -rf vendor/github.com/therecipe # Targets run: $(BINPATH) ## Run FiberCrypto Wallet. @@ -250,6 +250,8 @@ clean-build: ## Remove temporary files clean: clean-test clean-build ## Remove temporary files gen-mocks-core: ## Generate mocks for core interface types + mockery -name Devicer -dir ./vendor/github.com/fibercrypto/skywallet-go/src/skywallet -output ./src/contrib/skywallet/mocks -case underscore + mockery -name DeviceDriver -dir ./vendor/github.com/fibercrypto/skywallet-go/src/skywallet -output ./src/contrib/skywallet/mocks -case underscore mockery -all -output src/coin/mocks -outpkg mocks -dir src/core gen-mocks-sky: ## Generate mocks for internal Skycoin types @@ -260,6 +262,10 @@ gen-mocks: gen-mocks-core gen-mocks-sky ## Generate mocks for interface types $(COVERAGEFILE): echo 'mode: set' > $(COVERAGEFILE) +test-skyhw: build ## Run Hardware wallet tests + go test -coverprofile=$(COVERAGETEMP) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/contrib/skywallet + cat $(COVERAGETEMP) | grep -v '^mode: set$$' >> $(COVERAGEFILE) + test-sky: ## Run Skycoin plugin test suite go test -coverprofile=$(COVERAGETEMP) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin cat $(COVERAGETEMP) | grep -v '^mode: set$$' >> $(COVERAGEFILE) @@ -284,6 +290,8 @@ test-cover-travis: clean-test $(GOPATH)/bin/goveralls -coverprofile=$(COVERAGEFILE) -service=travis-ci -repotoken 1zkcSxi8TkcxpL2zTQOK9G5FFoVgWjceP go test -cover -covermode=count -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin $(GOPATH)/bin/goveralls -coverprofile=$(COVERAGEFILE) -service=travis-ci -repotoken 1zkcSxi8TkcxpL2zTQOK9G5FFoVgWjceP + go test -cover -covermode=count -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/contrib/skywallet + $(GOPATH)/bin/goveralls -coverprofile=$(COVERAGEFILE) -service=travis-ci -repotoken 1zkcSxi8TkcxpL2zTQOK9G5FFoVgWjceP test-cover: test test-html-cover ## Show more details of test coverage @@ -292,7 +300,7 @@ test: clean-test $(COVERAGEFILE) test-core test-sky test-data ## Run project tes run-docker: DOCKER_GOPATH=$(shell docker inspect $(DOCKER_QT):$(DEFAULT_ARCH) | grep '"GOPATH=' | head -n1 | cut -d = -f2 | cut -d '"' -f1) run-docker: install-docker-deps ## Run CMD inside Docker container @echo "Docker container GOPATH found at $(DOCKER_GOPATH)" - docker run --rm -v $(PWD):$(DOCKER_GOPATH)/$(GOPATH_SRC) $(DOCKER_QT_TEST):$(DEFAULT_ARCH) bash -c 'cd $(DOCKER_GOPATH)/$(GOPATH_SRC) ; $(CMD)' + docker run --network="host" --rm -v $(PWD):$(DOCKER_GOPATH)/$(GOPATH_SRC) $(DOCKER_QT_TEST):$(DEFAULT_ARCH) bash -c 'cd $(DOCKER_GOPATH)/$(GOPATH_SRC) ; $(CMD)' install-linters: ## Install linters go get -u github.com/FiloSottile/vendorcheck diff --git a/ci-scripts/install-linux.sh b/ci-scripts/install-linux.sh new file mode 100644 index 00000000..a8d8e11e --- /dev/null +++ b/ci-scripts/install-linux.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -x + +sudo apt-get update +# PIP +sudo apt-get install python3-pip +# OpenGL swrast driver for xvfb +sudo apt install mesa-utils and libgl1-mesa-glx +# Hardware wallet for running tests against emulator +mkdir -p tmp/hardware-wallet +git clone --depth=1 --single-branch --branch develop https://github.com/skycoin/hardware-wallet.git tmp/hardware-wallet +git -C tmp/hardware-wallet submodule update --init --recursive +( cd ./tmp/hardware-wallet && sh "ci-scripts/install-linux.sh" ) +export PATH="/usr/local/bin:$(pwd)/tmp/hardware-wallet/protoc/bin:$PATH" diff --git a/ci-scripts/install-osx.sh b/ci-scripts/install-osx.sh new file mode 100644 index 00000000..c51a4f5e --- /dev/null +++ b/ci-scripts/install-osx.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -x + +brew update +# USB HID enumeration libraries +# SDL for building hardware wallet emulator +brew install sdl2_image sdl2 mesa mesalib-glw + +brew update +# USB HID enumeration libraries +brew install libusb +# Install OS-specific test and build dependencies for hardware-wallet +mkdir -p tmp/hardware-wallet +git clone --depth=1 --single-branch --branch develop https://github.com/skycoin/hardware-wallet.git tmp/hardware-wallet +git -C tmp/hardware-wallet submodule update --init --recursive +( cd ./tmp/hardware-wallet && sh "ci-scripts/install-osx.sh" ) +# Include paths for brew packages e.g. SDL2 +export SDL_INCLUDE="$(brew --prefix sdl2)/include/SDL2"; \ No newline at end of file diff --git a/ci-scripts/version.sh b/ci-scripts/version.sh new file mode 100755 index 00000000..abf9c82e --- /dev/null +++ b/ci-scripts/version.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +version=$(git describe --tags --exact-match HEAD 2> /dev/null) +if [ $? -ne 0 ] +then + version=$(cat ./VERSION 2> /dev/null) + if [ $? -ne 0 ] + then + version='v0.0.0' + fi +fi +echo $version diff --git a/src/coin/mocks/PersistibleSet.go b/src/coin/mocks/PersistibleSet.go new file mode 100644 index 00000000..87125a38 --- /dev/null +++ b/src/coin/mocks/PersistibleSet.go @@ -0,0 +1,127 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import core "github.com/fibercrypto/fibercryptowallet/src/core" +import mock "github.com/stretchr/testify/mock" + +// PersistibleSet is an autogenerated mock type for the PersistibleSet type +type PersistibleSet struct { + mock.Mock +} + +// CreateWallet provides a mock function with given fields: name, seed, walletType, isEncryptrd, pwd, scanAddressesN +func (_m *PersistibleSet) CreateWallet(name string, seed string, walletType string, isEncryptrd bool, pwd core.PasswordReader, scanAddressesN int) (core.Wallet, error) { + ret := _m.Called(name, seed, walletType, isEncryptrd, pwd, scanAddressesN) + + var r0 core.Wallet + if rf, ok := ret.Get(0).(func(string, string, string, bool, core.PasswordReader, int) core.Wallet); ok { + r0 = rf(name, seed, walletType, isEncryptrd, pwd, scanAddressesN) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string, bool, core.PasswordReader, int) error); ok { + r1 = rf(name, seed, walletType, isEncryptrd, pwd, scanAddressesN) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Decrypt provides a mock function with given fields: walletName, password +func (_m *PersistibleSet) Decrypt(walletName string, password core.PasswordReader) { + _m.Called(walletName, password) +} + +// DefaultWalletType provides a mock function with given fields: +func (_m *PersistibleSet) DefaultWalletType() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// Encrypt provides a mock function with given fields: walletName, password +func (_m *PersistibleSet) Encrypt(walletName string, password core.PasswordReader) { + _m.Called(walletName, password) +} + +// GetWallet provides a mock function with given fields: id +func (_m *PersistibleSet) GetWallet(id string) core.Wallet { + ret := _m.Called(id) + + var r0 core.Wallet + if rf, ok := ret.Get(0).(func(string) core.Wallet); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Wallet) + } + } + + return r0 +} + +// IsEncrypted provides a mock function with given fields: walletName +func (_m *PersistibleSet) IsEncrypted(walletName string) (bool, error) { + ret := _m.Called(walletName) + + var r0 bool + if rf, ok := ret.Get(0).(func(string) bool); ok { + r0 = rf(walletName) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(walletName) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ListWallets provides a mock function with given fields: +func (_m *PersistibleSet) ListWallets() core.WalletIterator { + ret := _m.Called() + + var r0 core.WalletIterator + if rf, ok := ret.Get(0).(func() core.WalletIterator); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.WalletIterator) + } + } + + return r0 +} + +// SupportedWalletTypes provides a mock function with given fields: +func (_m *PersistibleSet) SupportedWalletTypes() []string { + ret := _m.Called() + + var r0 []string + if rf, ok := ret.Get(0).(func() []string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + return r0 +} diff --git a/src/coin/mocks/TxnSigner.go b/src/coin/mocks/TxnSigner.go index 1a6b3f40..12194381 100644 --- a/src/coin/mocks/TxnSigner.go +++ b/src/coin/mocks/TxnSigner.go @@ -11,7 +11,7 @@ type TxnSigner struct { } // GetSignerDescription provides a mock function with given fields: -func (_m *TxnSigner) GetSignerDescription() string { +func (_m *TxnSigner) GetSignerDescription() (string, error) { ret := _m.Called() var r0 string @@ -21,11 +21,18 @@ func (_m *TxnSigner) GetSignerDescription() string { r0 = ret.Get(0).(string) } - return r0 + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 } // GetSignerUID provides a mock function with given fields: -func (_m *TxnSigner) GetSignerUID() core.UID { +func (_m *TxnSigner) GetSignerUID() (core.UID, error) { ret := _m.Called() var r0 core.UID @@ -35,7 +42,14 @@ func (_m *TxnSigner) GetSignerUID() core.UID { r0 = ret.Get(0).(core.UID) } - return r0 + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 } // ReadyForTxn provides a mock function with given fields: _a0, _a1 diff --git a/src/coin/mocks/WalletEnv.go b/src/coin/mocks/WalletEnv.go index b3cc6724..ae58970c 100644 --- a/src/coin/mocks/WalletEnv.go +++ b/src/coin/mocks/WalletEnv.go @@ -41,3 +41,26 @@ func (_m *WalletEnv) GetWalletSet() core.WalletSet { return r0 } + +// LookupWallet provides a mock function with given fields: firstAddr +func (_m *WalletEnv) LookupWallet(firstAddr string) (core.Wallet, error) { + ret := _m.Called(firstAddr) + + var r0 core.Wallet + if rf, ok := ret.Get(0).(func(string) core.Wallet); ok { + r0 = rf(firstAddr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(firstAddr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/coin/skycoin/models/coin.go b/src/coin/skycoin/models/coin.go index 14d957aa..8cc8fc57 100644 --- a/src/coin/skycoin/models/coin.go +++ b/src/coin/skycoin/models/coin.go @@ -313,7 +313,7 @@ func (skyTxn *SkycoinUninjectedTransaction) GetStatus() core.TransactionStatus { func (skyTxn *SkycoinUninjectedTransaction) GetInputs() []core.TransactionInput { logCoin.Info("Getting inputs from un injected transactions") - if skyTxn.inputs == nil { + if len(skyTxn.inputs) == 0 { inputs, err := getSkycoinTransactionInputsFromInputsHashes(skyTxn.txn.In) if err != nil { // TODO: This method should also returns error @@ -428,7 +428,7 @@ func (txn *SkycoinTransaction) GetStatus() core.TransactionStatus { func (txn *SkycoinTransaction) GetInputs() []core.TransactionInput { logCoin.Info("Getting inputs from transaction") - if txn.inputs == nil { + if len(txn.inputs) == 0 { ins, err := getSkycoinTransactionInputsFromTxnHash(txn.skyTxn.Hash) if err != nil { return nil @@ -945,7 +945,7 @@ func (txn *SkycoinCreatedTransaction) GetStatus() core.TransactionStatus { // GetInputs return inputs spent by this transaction func (txn *SkycoinCreatedTransaction) GetInputs() []core.TransactionInput { - if txn.inputs == nil { + if len(txn.inputs) == 0 { txn.inputs = newCreatedTransactionInputs(txn.skyTxn.In) } return txn.inputs diff --git a/src/coin/skycoin/models/main_test.go b/src/coin/skycoin/models/main_test.go index d81d42bf..670b6d94 100644 --- a/src/coin/skycoin/models/main_test.go +++ b/src/coin/skycoin/models/main_test.go @@ -3,33 +3,19 @@ package skycoin import ( "encoding/hex" "fmt" + "github.com/stretchr/testify/mock" "os" "sort" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" - "github.com/fibercrypto/fibercryptowallet/src/util/logging" - "github.com/fibercrypto/fibercryptowallet/src/core" util "github.com/fibercrypto/fibercryptowallet/src/util" - "github.com/stretchr/testify/mock" - "github.com/fibercrypto/fibercryptowallet/src/params" ) -var global_mock *SkycoinApiMock - -var logModelTest = logging.MustGetLogger("Skycoin Model Test") - -// CleanGlobalMock util when is needed to change the values of an - -// API method used in other test with different values. -func CleanGlobalMock() { - global_mock.ExpectedCalls = []*mock.Call{} -} //Prepare the mock API for all test func TestMain(m *testing.M) { diff --git a/src/coin/skycoin/models/sky_test.go b/src/coin/skycoin/models/sky_test.go deleted file mode 100644 index 6367f3e3..00000000 --- a/src/coin/skycoin/models/sky_test.go +++ /dev/null @@ -1,195 +0,0 @@ -package skycoin - -/** - * This file contains test code copied from github.com/SkycoinProject/skycoin codebase - * for it is needed by test suite and functions not exported in upstream package. - * - * Please only add in here code copied from Skycoin codebase. Make sure it's strictly necessary. - */ - -import ( - "crypto/rand" - "path/filepath" - "testing" - - "github.com/SkycoinProject/skycoin/src/cipher" - skytestsuite "github.com/SkycoinProject/skycoin/src/cipher/testsuite" - "github.com/SkycoinProject/skycoin/src/coin" - "github.com/SkycoinProject/skycoin/src/readable" - "github.com/SkycoinProject/skycoin/src/testutil" - "github.com/SkycoinProject/skycoin/src/util/file" - "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/testsuite" - "github.com/stretchr/testify/require" -) - -func makeAddress() cipher.Address { - p, _ := cipher.GenerateKeyPair() - return cipher.AddressFromPubKey(p) -} - -func makeTransactionFromUxOuts(t *testing.T, uxs []coin.UxOut, secs []cipher.SecKey) coin.Transaction { - require.Equal(t, len(uxs), len(secs)) - - txn := coin.Transaction{} - - err := txn.PushOutput(makeAddress(), 1e6, 50) - require.NoError(t, err) - err = txn.PushOutput(makeAddress(), 5e6, 50) - require.NoError(t, err) - - for _, ux := range uxs { - err = txn.PushInput(ux.Hash()) - require.NoError(t, err) - } - - txn.SignInputs(secs) - - err = txn.UpdateHeader() - require.NoError(t, err) - return txn -} - -func makeTransactionFromUxOut(t *testing.T, ux coin.UxOut, s cipher.SecKey) coin.Transaction { - return makeTransactionFromUxOuts(t, []coin.UxOut{ux}, []cipher.SecKey{s}) -} - -var ( - seedPairIndex = 0 - seedContinuation []byte - seedMnemonic string - seedEntropy []byte - seedData *skytestsuite.SeedTestData - _, genSecret = cipher.GenerateKeyPair() -) - -type KeyData struct { - SecKey cipher.SecKey - PubKey cipher.PubKey - Mnemonic string - Entropy []byte - AddressIndex int -} - -// generateTestKeyPair provides deterministic sequence of test keys -// that can be recovered later inside a wallet -func generateTestKeyPair(t *testing.T) (*KeyData, error) { - var err error - if seedEntropy == nil { - // Load suite test data - fn := filepath.Join(testsuite.GetSkycoinCipherTestDataDir(), testsuite.ManyAddressesFilename) - - var dataJSON skytestsuite.SeedTestDataJSON - err := file.LoadJSON(fn, &dataJSON) - require.NoError(t, err) - - data, err := skytestsuite.SeedTestDataFromJSON(&dataJSON) - require.NoError(t, err) - - // Initialize internal test state - seedEntropy = []byte(data.Seed) - seedContinuation = seedEntropy - seedMnemonic = string(data.Seed) - seedData = data - seedPairIndex = 0 - } - - var keytestData KeyData - seedContinuation, keytestData.PubKey, keytestData.SecKey, err = cipher.DeterministicKeyPairIterator(seedContinuation) - if err != nil { - return nil, err - } - keytestData.Mnemonic = seedMnemonic - keytestData.Entropy = seedEntropy - keytestData.AddressIndex = seedPairIndex - seedPairIndex++ - if keytestData.AddressIndex < len(seedData.Keys) { - // Confirm that deterministic address sequence is correct - require.Equal(t, seedData.Keys[keytestData.AddressIndex].Public, keytestData.PubKey) - require.Equal(t, seedData.Keys[keytestData.AddressIndex].Secret, keytestData.SecKey) - } - return &keytestData, nil -} - -func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, *KeyData, error) { - keydata, err := generateTestKeyPair(t) - if err != nil { - return coin.UxBody{}, nil, err - } - return coin.UxBody{ - SrcTransaction: testutil.RandSHA256(t), - Address: cipher.AddressFromPubKey(keydata.PubKey), - Coins: 1e6, - Hours: 100, - }, keydata, nil -} - -func makeUxOutWithSecret(t *testing.T) (coin.UxOut, *KeyData, error) { - body, kd, err := makeUxBodyWithSecret(t) - if err != nil { - return coin.UxOut{}, nil, err - } - return coin.UxOut{ - Head: coin.UxHead{ - Time: 100, - BkSeq: 2, - }, - Body: body, - }, kd, nil -} - -func makeTransaction(t *testing.T) (coin.Transaction, error) { - ux, kd, err := makeUxOutWithSecret(t) - if err != nil { - return coin.Transaction{}, err - } - return makeTransactionFromUxOut(t, ux, kd.SecKey), nil -} - -func makeTransactionMultipleInputs(t *testing.T, n int) (coin.Transaction, []KeyData, []coin.UxOut, error) { - uxs := make([]coin.UxOut, n) - keysdata := make([]KeyData, n) - secs := make([]cipher.SecKey, n) - for i := 0; i < n; i++ { - ux, kd, err := makeUxOutWithSecret(t) - if err != nil { - return coin.Transaction{}, nil, nil, err - } - uxs[i] = ux - secs[i] = kd.SecKey - keysdata[i] = *kd - } - return makeTransactionFromUxOuts(t, uxs, secs), keysdata, uxs, nil -} - -func makeTransactions(t *testing.T, n int) (coin.Transactions, error) { //nolint:unparam,megacheck - txns := make(coin.Transactions, n) - for i := range txns { - var err error - txns[i], err = makeTransaction(t) - if err != nil { - return nil, err - } - } - return txns, nil -} - -func makeSpentOutput(uxout coin.UxOut, spentBkSeq uint64, spentTxId cipher.SHA256) (rOut readable.SpentOutput) { - rOut.Uxid = uxout.Hash().Hex() - rOut.Time = uxout.Head.Time - rOut.SrcBkSeq = uxout.Head.BkSeq - rOut.SrcTx = uxout.Body.SrcTransaction.Hex() - rOut.OwnerAddress = uxout.Body.Address.String() - rOut.Coins = uxout.Body.Coins - rOut.Hours = uxout.Body.Hours - rOut.SpentBlockSeq = spentBkSeq - rOut.SpentTxnID = spentTxId.Hex() - return -} - -func randBytes(t *testing.T, n int) []byte { - b := make([]byte, n) - x, err := rand.Read(b) - require.Equal(t, n, x) - require.Nil(t, err) - return b -} diff --git a/src/coin/skycoin/models/sky_test_utils.go b/src/coin/skycoin/models/sky_test_utils.go new file mode 100644 index 00000000..714bbadf --- /dev/null +++ b/src/coin/skycoin/models/sky_test_utils.go @@ -0,0 +1,197 @@ +// This file comes from Skycoin projects as is + +package skycoin + +/** + * This file contains test code copied from github.com/SkycoinProject/skycoin codebase + * for it is needed by test suite and functions not exported in upstream package. + * + * Please only add in here code copied from Skycoin codebase. Make sure it's strictly necessary. + */ + +import ( + "crypto/rand" + "path/filepath" + "testing" + + "github.com/SkycoinProject/skycoin/src/cipher" + skytestsuite "github.com/SkycoinProject/skycoin/src/cipher/testsuite" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/testsuite" + "github.com/stretchr/testify/require" +) + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeTransactionFromUxOuts(t *testing.T, uxs []coin.UxOut, secs []cipher.SecKey) coin.Transaction { + require.Equal(t, len(uxs), len(secs)) + + txn := coin.Transaction{} + + err := txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + + for _, ux := range uxs { + err = txn.PushInput(ux.Hash()) + require.NoError(t, err) + } + + txn.SignInputs(secs) + + err = txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +func makeTransactionFromUxOut(t *testing.T, ux coin.UxOut, s cipher.SecKey) coin.Transaction { + return makeTransactionFromUxOuts(t, []coin.UxOut{ux}, []cipher.SecKey{s}) +} + +var ( + seedPairIndex = 0 + seedContinuation []byte + seedMnemonic string + seedEntropy []byte + seedData *skytestsuite.SeedTestData + _, genSecret = cipher.GenerateKeyPair() +) + +type KeyData struct { + SecKey cipher.SecKey + PubKey cipher.PubKey + Mnemonic string + Entropy []byte + AddressIndex int +} + +// generateTestKeyPair provides deterministic sequence of test keys +// that can be recovered later inside a wallet +func generateTestKeyPair(t *testing.T) (*KeyData, error) { + var err error + if seedEntropy == nil { + // Load suite test data + fn := filepath.Join(testsuite.GetSkycoinCipherTestDataDir(), testsuite.ManyAddressesFilename) + + var dataJSON skytestsuite.SeedTestDataJSON + err := file.LoadJSON(fn, &dataJSON) + require.NoError(t, err) + + data, err := skytestsuite.SeedTestDataFromJSON(&dataJSON) + require.NoError(t, err) + + // Initialize internal test state + seedEntropy = []byte(data.Seed) + seedContinuation = seedEntropy + seedMnemonic = string(data.Seed) + seedData = data + seedPairIndex = 0 + } + + var keytestData KeyData + seedContinuation, keytestData.PubKey, keytestData.SecKey, err = cipher.DeterministicKeyPairIterator(seedContinuation) + if err != nil { + return nil, err + } + keytestData.Mnemonic = seedMnemonic + keytestData.Entropy = seedEntropy + keytestData.AddressIndex = seedPairIndex + seedPairIndex++ + if keytestData.AddressIndex < len(seedData.Keys) { + // Confirm that deterministic address sequence is correct + require.Equal(t, seedData.Keys[keytestData.AddressIndex].Public, keytestData.PubKey) + require.Equal(t, seedData.Keys[keytestData.AddressIndex].Secret, keytestData.SecKey) + } + return &keytestData, nil +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, *KeyData, error) { + keydata, err := generateTestKeyPair(t) + if err != nil { + return coin.UxBody{}, nil, err + } + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(keydata.PubKey), + Coins: 1e6, + Hours: 100, + }, keydata, nil +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, *KeyData, error) { + body, kd, err := makeUxBodyWithSecret(t) + if err != nil { + return coin.UxOut{}, nil, err + } + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, kd, nil +} + +func makeTransaction(t *testing.T) (coin.Transaction, error) { + ux, kd, err := makeUxOutWithSecret(t) + if err != nil { + return coin.Transaction{}, err + } + return makeTransactionFromUxOut(t, ux, kd.SecKey), nil +} + +func makeTransactionMultipleInputs(t *testing.T, n int) (coin.Transaction, []KeyData, []coin.UxOut, error) { + uxs := make([]coin.UxOut, n) + keysdata := make([]KeyData, n) + secs := make([]cipher.SecKey, n) + for i := 0; i < n; i++ { + ux, kd, err := makeUxOutWithSecret(t) + if err != nil { + return coin.Transaction{}, nil, nil, err + } + uxs[i] = ux + secs[i] = kd.SecKey + keysdata[i] = *kd + } + return makeTransactionFromUxOuts(t, uxs, secs), keysdata, uxs, nil +} + +func makeTransactions(t *testing.T, n int) (coin.Transactions, error) { //nolint:unparam,megacheck + txns := make(coin.Transactions, n) + for i := range txns { + var err error + txns[i], err = makeTransaction(t) + if err != nil { + return nil, err + } + } + return txns, nil +} + +func makeSpentOutput(uxout coin.UxOut, spentBkSeq uint64, spentTxId cipher.SHA256) (rOut readable.SpentOutput) { + rOut.Uxid = uxout.Hash().Hex() + rOut.Time = uxout.Head.Time + rOut.SrcBkSeq = uxout.Head.BkSeq + rOut.SrcTx = uxout.Body.SrcTransaction.Hex() + rOut.OwnerAddress = uxout.Body.Address.String() + rOut.Coins = uxout.Body.Coins + rOut.Hours = uxout.Body.Hours + rOut.SpentBlockSeq = spentBkSeq + rOut.SpentTxnID = spentTxId.Hex() + return +} + +func randBytes(t *testing.T, n int) []byte { + b := make([]byte, n) + x, err := rand.Read(b) + require.Equal(t, n, x) + require.Nil(t, err) + return b +} diff --git a/src/coin/skycoin/models/skyapi_mock_test.go b/src/coin/skycoin/models/skyapi_test_mocks.go similarity index 100% rename from src/coin/skycoin/models/skyapi_mock_test.go rename to src/coin/skycoin/models/skyapi_test_mocks.go diff --git a/src/coin/skycoin/models/testsutils.go b/src/coin/skycoin/models/testsutils.go new file mode 100644 index 00000000..105b4f8b --- /dev/null +++ b/src/coin/skycoin/models/testsutils.go @@ -0,0 +1,295 @@ +package skycoin + +import ( + "github.com/SkycoinProject/skycoin/src/wallet" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/testsuite" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "github.com/SkycoinProject/skycoin/src/cipher" + skytestsuite "github.com/SkycoinProject/skycoin/src/cipher/testsuite" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "io/ioutil" + "path/filepath" + "strings" + "testing" +) + +func makeUninjectedTransaction(t *testing.T, txn *coin.Transaction, fee uint64) *SkycoinUninjectedTransaction { + if txn == nil { + skyTxn, err := makeTransaction(t) + require.NoError(t, err) + txn = &skyTxn + } + uitxn, err := NewUninjectedTransaction(txn, fee) + require.NoError(t, err) + return uitxn +} + +func makeLocalWallet(t *testing.T) core.Wallet { + _, kd, err := makeUxOutWithSecret(t) + require.NoError(t, err) + require.NoError(t, err) + wallets := makeLocalWalletsFromKeyData(t, []KeyData{*kd}) + wallet := wallets[0] + seed, seckeys, err2 := cipher.GenerateDeterministicKeyPairsSeed([]byte(kd.Mnemonic), kd.AddressIndex+1) + require.NoError(t, err2) + require.Equal(t, kd.SecKey, seckeys[kd.AddressIndex]) + _, _, err3 := cipher.GenerateDeterministicKeyPair(seed) + require.NoError(t, err3) + wallet.GenAddresses(core.AccountAddress, uint32(kd.AddressIndex), 2, nil) + return wallet +} + +var ( + tmpWalletDir string + testWalletEnv core.WalletEnv +) + +func loadTestWalletEnv(t *testing.T) core.WalletEnv { + if tmpWalletDir == "" { + tmpDir, err := ioutil.TempDir("", testsuite.TestIDToken) + require.NoError(t, err) + tmpWalletDir = tmpDir + } + if testWalletEnv == nil { + testWalletEnv = NewWalletDirectory(tmpWalletDir) + } + return testWalletEnv +} + +var whitespaceReplacer = strings.NewReplacer(" ", "-") + +func makeLocalWalletsFromKeyData(t *testing.T, keysData []KeyData) []core.Wallet { + walletsCache := make(map[string]core.Wallet) + wallets := make([]core.Wallet, len(keysData)) + walletSet := loadTestWalletEnv(t).GetWalletSet() + for i, kd := range keysData { + walletID := whitespaceReplacer.Replace(kd.Mnemonic) + var w core.Wallet + var isFound bool + var err error + if w, isFound = walletsCache[kd.Mnemonic]; !isFound { + if w = walletSet.GetWallet(walletID); w == nil { + w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, wallet.WalletTypeDeterministic, false, util.EmptyPassword, 0) + require.NoError(t, err) + } + walletsCache[kd.Mnemonic] = w + } + wallets[i] = w + w.GenAddresses(core.AccountAddress, 0, uint32(kd.AddressIndex+1), nil) + w.GenAddresses(core.ChangeAddress, 0, uint32(kd.AddressIndex+1), nil) + } + return wallets +} + +type TransferOptions struct { + values map[string]interface{} +} + +func (tOpt *TransferOptions) GetValue(key string) interface{} { + return tOpt.values[key] +} + +func (tOpt *TransferOptions) SetValue(key string, value interface{}) { + tOpt.values[key] = value +} + +// GenerateTestKeyPair provides deterministic sequence of test keys +// that can be recovered later inside a wallet +func GenerateTestKeyPair(t *testing.T) (*KeyData, error) { + var err error + if seedEntropy == nil { + // Load suite test data + fn := filepath.Join(testsuite.GetSkycoinCipherTestDataDir(), testsuite.ManyAddressesFilename) + + var dataJSON skytestsuite.SeedTestDataJSON + err := file.LoadJSON(fn, &dataJSON) + require.NoError(t, err) + + data, err := skytestsuite.SeedTestDataFromJSON(&dataJSON) + require.NoError(t, err) + + // Initialize internal test state + seedEntropy = []byte(data.Seed) + seedContinuation = seedEntropy + seedMnemonic = string(data.Seed) + seedData = data + seedPairIndex = 0 + } + + var keytestData KeyData + seedContinuation, keytestData.PubKey, keytestData.SecKey, err = cipher.DeterministicKeyPairIterator(seedContinuation) + if err != nil { + return nil, err + } + keytestData.Mnemonic = seedMnemonic + keytestData.Entropy = seedEntropy + keytestData.AddressIndex = seedPairIndex + seedPairIndex++ + if keytestData.AddressIndex < len(seedData.Keys) { + // Confirm that deterministic address sequence is correct + require.Equal(t, seedData.Keys[keytestData.AddressIndex].Public, keytestData.PubKey) + require.Equal(t, seedData.Keys[keytestData.AddressIndex].Secret, keytestData.SecKey) + } + return &keytestData, nil +} + +var global_mock *SkycoinApiMock + +var logModelTest = logging.MustGetLogger("Skycoin Model Test") +// API method used in other test with different values. + +// CleanGlobalMock util when is needed to change the values of an +func CleanGlobalMock() { + if global_mock == nil { + global_mock = new(SkycoinApiMock) + } else { + global_mock.ExpectedCalls = []*mock.Call{} + } +} + +func SetGlobalMock(mock *SkycoinApiMock) { + global_mock = mock +} + +func TransactionSignInputTestSkyHwImpl(t *testing.T, signers []core.TxnSigner, setWallet func(*testing.T, core.TxnSigner, core.Wallet)) { + _, keysData, _, err := makeTransactionMultipleInputs(t, 3) + require.NoError(t, err) + // Load local wallets + wallets := makeLocalWalletsFromKeyData(t, keysData) + for idx := range signers { + setWallet(t, signers[idx], wallets[idx]) + } + TransactionSignInputTestImpl(t, signers) +} + +func TransactionSignInputTestImpl(t *testing.T, signers []core.TxnSigner) { + txn, keysData, uxspent, err := makeTransactionMultipleInputs(t, 3) + require.NoError(t, err) + // Mock UxOut API calls + for _, ux := range uxspent { + mockSkyApiUxOut(global_mock, ux) + } + + uiTxn := makeUninjectedTransaction(t, &txn, 1) + var signedCoreTxn core.Transaction + var isFullySigned bool + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) + + // Load local wallets + wallets := makeLocalWalletsFromKeyData(t, keysData) + for _, signer := range signers { + err = util.AttachSignService(signer) + require.NoError(t, err) + } + + // Input is already signed + var signer core.TxnSigner + if len(signers) > 0 { + signer = signers[0] + } + _, err = wallets[0].Sign(uiTxn, signer, util.EmptyPassword, []string{"#0"}) + testutil.RequireError(t, err, "Transaction is fully signed") + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) + + // Input is not signed + txn.Sigs[1] = cipher.Sig{} + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + if len(signers) > 1 { + signer = signers[1] + } + signedCoreTxn, err = wallets[1].Sign(uiTxn, signer, nil, []string{"#1"}) + require.NoError(t, err) + signedTxn, isUninjected := signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + require.NotEqual(t, uiTxn.txn, signedTxn.txn) + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + isFullySigned, err = signedTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) + if len(signers) > 2 { + signer = signers[2] + } + _, err = wallets[1].Sign(signedTxn, signer, nil, []string{"#1"}) + testutil.RequireError(t, err, "Transaction is fully signed") + // Repeat using UXID + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + uxId := txn.In[1].Hex() + if len(signers) > 1 { + signer = signers[1] + } + signedCoreTxn, err = wallets[1].Sign(uiTxn, signer, nil, []string{uxId}) + require.NoError(t, err) + signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + require.NotEqual(t, uiTxn.txn, signedTxn.txn) + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + isFullySigned, err = signedTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) + if len(signers) > 1 { + signer = signers[1] + } + _, err = wallets[1].Sign(signedTxn, signer, nil, []string{"#1"}) + testutil.RequireError(t, err, "Transaction is fully signed") + + // Transaction has no sigs; sigs array is initialized + txn.Sigs = nil + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + if len(signers) > 2 { + signer = signers[2] + } + signedCoreTxn, err = wallets[2].Sign(uiTxn, signer, nil, []string{"#2"}) + require.NoError(t, err) + signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + require.NotEqual(t, uiTxn.txn, signedTxn.txn) + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + require.Len(t, signedTxn.txn.Sigs, 3) + require.True(t, signedTxn.txn.Sigs[0].Null()) + require.True(t, signedTxn.txn.Sigs[1].Null()) + require.False(t, signedTxn.txn.Sigs[2].Null()) + + // Signing the rest of the inputs individually works + if len(signers) > 1 { + signer = signers[1] + } + signedCoreTxn, err = wallets[1].Sign(signedTxn, signer, nil, []string{"#1"}) + require.NoError(t, err) + signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + isFullySigned, err = signedTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + if len(signers) > 0 { + signer = signers[0] + } + signedCoreTxn, err = wallets[0].Sign(signedTxn, signer, nil, []string{"#0"}) + require.NoError(t, err) + signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + isFullySigned, err = signedTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) +} diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index cd48fc9e..7fbb3f66 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -292,6 +292,10 @@ type WalletNode struct { poolSection string } +func (wltEnv *WalletNode) LookupWallet(firstAddr string) (core.Wallet, error) { + return lookupWallet(wltEnv, firstAddr) +} + func (wltEnv *WalletNode) GetStorage() core.WalletStorage { logWallet.Info("Getting wallet node storage") if wltEnv.wltService == nil { @@ -727,7 +731,7 @@ func (wlt *RemoteWallet) SignTransaction(txn core.Transaction, pwdReader core.Pa if strIdxs == nil { indices = nil } else { - indices, err = getHashIndices(txn.GetInputs(), strIdxs) + indices, err = GetHashIndices(txn.GetInputs(), strIdxs) if err != nil { logWallet.Error("Error parsing Skycoin transaction input indices array for signing") return nil, err @@ -737,7 +741,7 @@ func (wlt *RemoteWallet) SignTransaction(txn core.Transaction, pwdReader core.Pa return } -func getHashIndices(ins []core.TransactionInput, strIdxs []string) (indices []int, err error) { +func GetHashIndices(ins []core.TransactionInput, strIdxs []string) (indices []int, err error) { cache := make(map[string]int, len(ins)) indices = make([]int, len(strIdxs)) scanIdx := 0 @@ -773,12 +777,12 @@ func getHashIndices(ins []core.TransactionInput, strIdxs []string) (indices []in return indices, nil } -func (wlt *RemoteWallet) GetSignerUID() core.UID { - return SignerIDRemoteWallet +func (wlt *RemoteWallet) GetSignerUID() (core.UID, error) { + return SignerIDRemoteWallet, nil } -func (wlt *RemoteWallet) GetSignerDescription() string { - return "Remote Skycoin wallet " + wlt.Id +func (wlt *RemoteWallet) GetSignerDescription() (string, error) { + return "Remote Skycoin wallet " + wlt.Id, nil } func walletResponseToWallet(wltR api.WalletResponse) *RemoteWallet { @@ -812,7 +816,31 @@ func NewWalletDirectory(dirPath string) *WalletDirectory { type WalletDirectory struct { // Implements WallentEnv interface WalletDir string - wltService *SkycoinLocalWallet + wltService core.PersistibleSet +} + +func (wd *WalletDirectory) SetWltService(wltSrv core.PersistibleSet) { + wd.wltService = wltSrv +} + +func lookupWallet(env core.WalletEnv, firstAddr string) (core.Wallet, error) { + ws := env.GetWalletSet() + wls := ws.ListWallets() + for wls.Next() { + w := wls.Value() + addrs := w.GenAddresses(core.AccountAddress, 0, 1, nil) + if addrs.Next() { + addr := addrs.Value() + if addr.String() == firstAddr { + return w, nil + } + } + } + return nil, errors.ErrWltFromAddrNotFound +} + +func (wltDir *WalletDirectory) LookupWallet(firstAddr string) (core.Wallet, error) { + return lookupWallet(wltDir, firstAddr) } func (wltDir *WalletDirectory) GetStorage() core.WalletStorage { @@ -1675,7 +1703,7 @@ func (wlt *LocalWallet) SignTransaction(txn core.Transaction, pwdReader core.Pas if strIdxs == nil { indices = nil } else { - indices, err = getHashIndices(txn.GetInputs(), strIdxs) + indices, err = GetHashIndices(txn.GetInputs(), strIdxs) if err != nil { logWallet.Error("Error parsing Skycoin transaction input indices array for signing") return nil, err @@ -1685,12 +1713,12 @@ func (wlt *LocalWallet) SignTransaction(txn core.Transaction, pwdReader core.Pas return } -func (wlt *LocalWallet) GetSignerUID() core.UID { - return SignerIDLocalWallet +func (wlt *LocalWallet) GetSignerUID() (core.UID, error) { + return SignerIDLocalWallet, nil } -func (wlt *LocalWallet) GetSignerDescription() string { - return "Remote Skycoin wallet " + wlt.Id +func (wlt *LocalWallet) GetSignerDescription() (string, error) { + return "Remote Skycoin wallet " + wlt.Id, nil } // Typoe assertions diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 235520e5..8d9b2360 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -2,12 +2,10 @@ package skycoin import ( "fmt" - "io/ioutil" "math" "path/filepath" "sort" "strconv" - "strings" "testing" "time" @@ -15,7 +13,6 @@ import ( "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" - "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/testsuite" "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/fibercrypto/fibercryptowallet/src/util" @@ -266,18 +263,6 @@ func TestRemoteWalletSetLabel(t *testing.T) { wlt.SetLabel("wallet") } -type TransferOptions struct { - values map[string]interface{} -} - -func (tOpt *TransferOptions) GetValue(key string) interface{} { - return tOpt.values[key] -} - -func (tOpt *TransferOptions) SetValue(key string, value interface{}) { - tOpt.values[key] = value -} - func NewTransferOptions() *TransferOptions { tOptions := TransferOptions{ values: make(map[string]interface{}), @@ -586,17 +571,6 @@ func TestRemoteWalletGetLoadedAddresses(t *testing.T) { require.Equal(t, 1, items) } -func makeUninjectedTransaction(t *testing.T, txn *coin.Transaction, fee uint64) *SkycoinUninjectedTransaction { - if txn == nil { - skyTxn, err := makeTransaction(t) - require.NoError(t, err) - txn = &skyTxn - } - uitxn, err := NewUninjectedTransaction(txn, fee) - require.NoError(t, err) - return uitxn -} - func TestUninjectedTransactionVerifySigned(t *testing.T) { // Mismatch header hash txn, err := makeTransaction(t) @@ -774,143 +748,8 @@ func TestUninjectedTransactionVerifyUnsigned(t *testing.T) { require.NoError(t, err) } -var ( - tmpWalletDir string - testWalletEnv core.WalletEnv -) - -func loadTestWalletEnv(t *testing.T) core.WalletEnv { - if tmpWalletDir == "" { - tmpDir, err := ioutil.TempDir("", testsuite.TestIDToken) - require.NoError(t, err) - tmpWalletDir = tmpDir - } - if testWalletEnv == nil { - testWalletEnv = NewWalletDirectory(tmpWalletDir) - } - return testWalletEnv -} - -var whitespaceReplacer = strings.NewReplacer(" ", "-") - -func makeLocalWalletsFromKeyData(t *testing.T, keysData []KeyData) []core.Wallet { - walletsCache := make(map[string]core.Wallet) - wallets := make([]core.Wallet, len(keysData)) - walletSet := loadTestWalletEnv(t).GetWalletSet() - for i, kd := range keysData { - walletID := whitespaceReplacer.Replace(kd.Mnemonic) - var w core.Wallet - var isFound bool - var err error - if w, isFound = walletsCache[kd.Mnemonic]; !isFound { - if w = walletSet.GetWallet(walletID); w == nil { - w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, wallet.WalletTypeDeterministic, false, util.EmptyPassword, 0) - require.NoError(t, err) - } - walletsCache[kd.Mnemonic] = w - } - wallets[i] = w - w.GenAddresses(core.AccountAddress, 0, uint32(kd.AddressIndex+1), nil) - w.GenAddresses(core.ChangeAddress, 0, uint32(kd.AddressIndex+1), nil) - } - return wallets -} - func TestTransactionSignInput(t *testing.T) { - txn, keysData, uxspent, err := makeTransactionMultipleInputs(t, 3) - require.NoError(t, err) - // Mock UxOut API calls - for _, ux := range uxspent { - mockSkyApiUxOut(global_mock, ux) - } - - uiTxn := makeUninjectedTransaction(t, &txn, 1) - var signedCoreTxn core.Transaction - var isFullySigned bool - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) - - // Load local wallets - wallets := makeLocalWalletsFromKeyData(t, keysData) - - // Input is already signed - _, err = wallets[0].Sign(uiTxn, nil, util.EmptyPassword, []string{"#0"}) - testutil.RequireError(t, err, "Transaction is fully signed") - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) - - // Input is not signed - txn.Sigs[1] = cipher.Sig{} - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - signedCoreTxn, err = wallets[1].Sign(uiTxn, nil, nil, []string{"#1"}) - require.NoError(t, err) - signedTxn, isUninjected := signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - require.NotEqual(t, uiTxn.txn, signedTxn.txn) - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - isFullySigned, err = signedTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) - _, err = wallets[1].Sign(signedTxn, nil, nil, []string{"#1"}) - testutil.RequireError(t, err, "Transaction is fully signed") - // Repeat using UXID - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - uxId := txn.In[1].Hex() - signedCoreTxn, err = wallets[1].Sign(uiTxn, nil, nil, []string{uxId}) - require.NoError(t, err) - signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - require.NotEqual(t, uiTxn.txn, signedTxn.txn) - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - isFullySigned, err = signedTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) - _, err = wallets[1].Sign(signedTxn, nil, nil, []string{"#1"}) - testutil.RequireError(t, err, "Transaction is fully signed") - - // Transaction has no sigs; sigs array is initialized - txn.Sigs = nil - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - signedCoreTxn, err = wallets[2].Sign(uiTxn, nil, nil, []string{"#2"}) - require.NoError(t, err) - signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - require.NotEqual(t, uiTxn.txn, signedTxn.txn) - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - require.Len(t, signedTxn.txn.Sigs, 3) - require.True(t, signedTxn.txn.Sigs[0].Null()) - require.True(t, signedTxn.txn.Sigs[1].Null()) - require.False(t, signedTxn.txn.Sigs[2].Null()) - - // Signing the rest of the inputs individually works - signedCoreTxn, err = wallets[1].Sign(signedTxn, nil, nil, []string{"#1"}) - require.NoError(t, err) - signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - isFullySigned, err = signedTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - signedCoreTxn, err = wallets[0].Sign(signedTxn, nil, nil, []string{"#0"}) - require.NoError(t, err) - signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - isFullySigned, err = signedTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) + TransactionSignInputTestImpl(t, nil) } func TestTransactionSignInputs(t *testing.T) { @@ -977,21 +816,6 @@ func TestTransactionSignInputs(t *testing.T) { require.Error(t, cipher.VerifyAddressSignedHash(a2, signedTxn.txn.Sigs[0], cipher.AddSHA256(h, signedTxn.txn.In[1]))) } -func makeLocalWallet(t *testing.T) core.Wallet { - _, kd, err := makeUxOutWithSecret(t) - require.NoError(t, err) - require.NoError(t, err) - wallets := makeLocalWalletsFromKeyData(t, []KeyData{*kd}) - wallet := wallets[0] - seed, seckeys, err2 := cipher.GenerateDeterministicKeyPairsSeed([]byte(kd.Mnemonic), kd.AddressIndex+1) - require.NoError(t, err2) - require.Equal(t, kd.SecKey, seckeys[kd.AddressIndex]) - _, _, err3 := cipher.GenerateDeterministicKeyPair(seed) - require.NoError(t, err3) - wallet.GenAddresses(core.AccountAddress, uint32(kd.AddressIndex), 2, nil) - return wallet -} - func makeSkycoinBlockchain() core.BlockchainTransactionAPI { return NewSkycoinBlockchain(0) } @@ -1889,12 +1713,20 @@ func TestWalletsReadyForTxn(t *testing.T) { func TestWalletFunctions(t *testing.T) { id := "local-id" wlt := &LocalWallet{Id: id} - require.Equal(t, core.UID(SignerIDLocalWallet), wlt.GetSignerUID()) - require.Equal(t, "Remote Skycoin wallet "+id, wlt.GetSignerDescription()) + signerUuid, err := wlt.GetSignerUID() + require.NoError(t, err) + require.Equal(t, core.UID(SignerIDLocalWallet), signerUuid) + signerDescription, err := wlt.GetSignerDescription() + require.NoError(t, err) + require.Equal(t, "Remote Skycoin wallet "+id, signerDescription) rmt := &RemoteWallet{Id: id} - require.Equal(t, core.UID(SignerIDRemoteWallet), rmt.GetSignerUID()) - require.Equal(t, "Remote Skycoin wallet "+id, rmt.GetSignerDescription()) + signerUuid, err = rmt.GetSignerUID() + require.NoError(t, err) + require.Equal(t, core.UID(SignerIDRemoteWallet), signerUuid) + signerDescription, err = rmt.GetSignerDescription() + require.NoError(t, err) + require.Equal(t, "Remote Skycoin wallet "+id, signerDescription) } func TestWalletNodeGetWalletSet(t *testing.T) { diff --git a/src/contrib/skywallet/mocks/device_driver.go b/src/contrib/skywallet/mocks/device_driver.go new file mode 100644 index 00000000..dd299e1e --- /dev/null +++ b/src/contrib/skywallet/mocks/device_driver.go @@ -0,0 +1,113 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" +import skywallet "github.com/fibercrypto/skywallet-go/src/skywallet" +import usb "github.com/fibercrypto/skywallet-go/src/skywallet/usb" +import wire "github.com/fibercrypto/skywallet-go/src/skywallet/wire" + +// DeviceDriver is an autogenerated mock type for the DeviceDriver type +type DeviceDriver struct { + mock.Mock +} + +// Close provides a mock function with given fields: +func (_m *DeviceDriver) Close() { + _m.Called() +} + +// DeviceType provides a mock function with given fields: +func (_m *DeviceDriver) DeviceType() skywallet.DeviceType { + ret := _m.Called() + + var r0 skywallet.DeviceType + if rf, ok := ret.Get(0).(func() skywallet.DeviceType); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(skywallet.DeviceType) + } + + return r0 +} + +// GetDevice provides a mock function with given fields: +func (_m *DeviceDriver) GetDevice() (usb.Device, error) { + ret := _m.Called() + + var r0 usb.Device + if rf, ok := ret.Get(0).(func() usb.Device); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(usb.Device) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetDeviceInfos provides a mock function with given fields: +func (_m *DeviceDriver) GetDeviceInfos() ([]usb.Info, error) { + ret := _m.Called() + + var r0 []usb.Info + if rf, ok := ret.Get(0).(func() []usb.Info); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]usb.Info) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SendToDevice provides a mock function with given fields: dev, chunks +func (_m *DeviceDriver) SendToDevice(dev usb.Device, chunks [][64]byte) (wire.Message, error) { + ret := _m.Called(dev, chunks) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(usb.Device, [][64]byte) wire.Message); ok { + r0 = rf(dev, chunks) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(usb.Device, [][64]byte) error); ok { + r1 = rf(dev, chunks) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SendToDeviceNoAnswer provides a mock function with given fields: dev, chunks +func (_m *DeviceDriver) SendToDeviceNoAnswer(dev usb.Device, chunks [][64]byte) error { + ret := _m.Called(dev, chunks) + + var r0 error + if rf, ok := ret.Get(0).(func(usb.Device, [][64]byte) error); ok { + r0 = rf(dev, chunks) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/src/contrib/skywallet/mocks/devicer.go b/src/contrib/skywallet/mocks/devicer.go new file mode 100644 index 00000000..a0e40408 --- /dev/null +++ b/src/contrib/skywallet/mocks/devicer.go @@ -0,0 +1,459 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import messages "github.com/fibercrypto/skywallet-protob/go" +import mock "github.com/stretchr/testify/mock" +import skywallet "github.com/fibercrypto/skywallet-go/src/skywallet" +import wire "github.com/fibercrypto/skywallet-go/src/skywallet/wire" + +// Devicer is an autogenerated mock type for the Devicer type +type Devicer struct { + mock.Mock +} + +// AddressGen provides a mock function with given fields: addressN, startIndex, confirmAddress, walletType +func (_m *Devicer) AddressGen(addressN uint32, startIndex uint32, confirmAddress bool, walletType string) (wire.Message, error) { + ret := _m.Called(addressN, startIndex, confirmAddress, walletType) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(uint32, uint32, bool, string) wire.Message); ok { + r0 = rf(addressN, startIndex, confirmAddress, walletType) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint32, uint32, bool, string) error); ok { + r1 = rf(addressN, startIndex, confirmAddress, walletType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ApplySettings provides a mock function with given fields: usePassphrase, label, language +func (_m *Devicer) ApplySettings(usePassphrase *bool, label string, language string) (wire.Message, error) { + ret := _m.Called(usePassphrase, label, language) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(*bool, string, string) wire.Message); ok { + r0 = rf(usePassphrase, label, language) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*bool, string, string) error); ok { + r1 = rf(usePassphrase, label, language) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Available provides a mock function with given fields: +func (_m *Devicer) Available() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Backup provides a mock function with given fields: +func (_m *Devicer) Backup() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ButtonAck provides a mock function with given fields: +func (_m *Devicer) ButtonAck() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Cancel provides a mock function with given fields: +func (_m *Devicer) Cancel() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ChangePin provides a mock function with given fields: removePin +func (_m *Devicer) ChangePin(removePin *bool) (wire.Message, error) { + ret := _m.Called(removePin) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(*bool) wire.Message); ok { + r0 = rf(removePin) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*bool) error); ok { + r1 = rf(removePin) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CheckMessageSignature provides a mock function with given fields: message, signature, address +func (_m *Devicer) CheckMessageSignature(message string, signature string, address string) (wire.Message, error) { + ret := _m.Called(message, signature, address) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string, string, string) wire.Message); ok { + r0 = rf(message, signature, address) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string) error); ok { + r1 = rf(message, signature, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Close provides a mock function with given fields: +func (_m *Devicer) Close() { + _m.Called() +} + +// Connect provides a mock function with given fields: +func (_m *Devicer) Connect() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Connected provides a mock function with given fields: +func (_m *Devicer) Connected() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Disconnect provides a mock function with given fields: +func (_m *Devicer) Disconnect() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// FirmwareUpload provides a mock function with given fields: payload, hash +func (_m *Devicer) FirmwareUpload(payload []byte, hash [32]byte) error { + ret := _m.Called(payload, hash) + + var r0 error + if rf, ok := ret.Get(0).(func([]byte, [32]byte) error); ok { + r0 = rf(payload, hash) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GenerateMnemonic provides a mock function with given fields: wordCount, usePassphrase +func (_m *Devicer) GenerateMnemonic(wordCount uint32, usePassphrase bool) (wire.Message, error) { + ret := _m.Called(wordCount, usePassphrase) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(uint32, bool) wire.Message); ok { + r0 = rf(wordCount, usePassphrase) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint32, bool) error); ok { + r1 = rf(wordCount, usePassphrase) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetFeatures provides a mock function with given fields: +func (_m *Devicer) GetFeatures() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PassphraseAck provides a mock function with given fields: passphrase +func (_m *Devicer) PassphraseAck(passphrase string) (wire.Message, error) { + ret := _m.Called(passphrase) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string) wire.Message); ok { + r0 = rf(passphrase) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(passphrase) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PinMatrixAck provides a mock function with given fields: p +func (_m *Devicer) PinMatrixAck(p string) (wire.Message, error) { + ret := _m.Called(p) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string) wire.Message); ok { + r0 = rf(p) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(p) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Recovery provides a mock function with given fields: wordCount, usePassphrase, dryRun +func (_m *Devicer) Recovery(wordCount uint32, usePassphrase *bool, dryRun bool) (wire.Message, error) { + ret := _m.Called(wordCount, usePassphrase, dryRun) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(uint32, *bool, bool) wire.Message); ok { + r0 = rf(wordCount, usePassphrase, dryRun) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint32, *bool, bool) error); ok { + r1 = rf(wordCount, usePassphrase, dryRun) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SetAutoPressButton provides a mock function with given fields: simulateButtonPress, simulateButtonType +func (_m *Devicer) SetAutoPressButton(simulateButtonPress bool, simulateButtonType skywallet.ButtonType) error { + ret := _m.Called(simulateButtonPress, simulateButtonType) + + var r0 error + if rf, ok := ret.Get(0).(func(bool, skywallet.ButtonType) error); ok { + r0 = rf(simulateButtonPress, simulateButtonType) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetMnemonic provides a mock function with given fields: mnemonic +func (_m *Devicer) SetMnemonic(mnemonic string) (wire.Message, error) { + ret := _m.Called(mnemonic) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string) wire.Message); ok { + r0 = rf(mnemonic) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(mnemonic) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SignMessage provides a mock function with given fields: addressN, addressIndex, message, walletType +func (_m *Devicer) SignMessage(addressN int, addressIndex int, message string, walletType string) (wire.Message, error) { + ret := _m.Called(addressN, addressIndex, message, walletType) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(int, int, string, string) wire.Message); ok { + r0 = rf(addressN, addressIndex, message, walletType) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(int, int, string, string) error); ok { + r1 = rf(addressN, addressIndex, message, walletType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionSign provides a mock function with given fields: inputs, outputs, walletType +func (_m *Devicer) TransactionSign(inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput, walletType string) (wire.Message, error) { + ret := _m.Called(inputs, outputs, walletType) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func([]*messages.SkycoinTransactionInput, []*messages.SkycoinTransactionOutput, string) wire.Message); ok { + r0 = rf(inputs, outputs, walletType) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func([]*messages.SkycoinTransactionInput, []*messages.SkycoinTransactionOutput, string) error); ok { + r1 = rf(inputs, outputs, walletType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Wipe provides a mock function with given fields: +func (_m *Devicer) Wipe() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WordAck provides a mock function with given fields: word +func (_m *Devicer) WordAck(word string) (wire.Message, error) { + ret := _m.Called(word) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string) wire.Message); ok { + r0 = rf(word) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(word) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/contrib/skywallet/sky-wallet.go b/src/contrib/skywallet/sky-wallet.go new file mode 100644 index 00000000..03f17cca --- /dev/null +++ b/src/contrib/skywallet/sky-wallet.go @@ -0,0 +1,393 @@ +package hardware + +import ( + "encoding/hex" + "errors" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + skycoin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/skytypes" + "github.com/fibercrypto/fibercryptowallet/src/core" + fce "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "github.com/fibercrypto/skywallet-go/src/skywallet" + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" + "github.com/fibercrypto/skywallet-protob/go" + "github.com/gogo/protobuf/proto" + "github.com/sirupsen/logrus" +) + +var logSkyWallet = logging.MustGetLogger("Skycoin hardware wallet") + +type SkyWallet struct { + wlt core.Wallet + dev skyWallet.Devicer +} + +const ( + urnPrefix = "signer:skywallet:" +) + +// HwFirstAddr return the first address in the deterministic sequence if there is a configured +// device connected, error if not device found or some thing fail. +func HwFirstAddr(dev skyWallet.Devicer, derivationType string) (string, error) { + msg, err := dev.AddressGen(1, 0, false, derivationType) + if err != nil { + logSkyWallet.WithError(err).Debugln("error getting address from device") + return "", fce.ErrHwUnexpected + } + addrs, err := skywallet.DecodeResponseSkycoinAddress(msg) + if err != nil { + logSkyWallet.WithError(err).Error("error decoding device response") + return "", fce.ErrHwUnexpected + } + if len(addrs) != 1 { + logSkyWallet.WithField("addr_len", len(addrs)).Error("unexpected address count in response") + return "", fce.ErrHwUnexpected + } + return addrs[0], nil +} + +func hwMatchWallet(hw SkyWallet, wlt core.Wallet) bool { + checkForDerivation := func(dt string) bool { + firstAddr, err := HwFirstAddr(hw.dev, dt) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get first address from hw") + return false + } + addrs := wlt.GenAddresses(core.AccountAddress, 0, 1, nil) + if addrs.Next() { + addr := addrs.Value() + return addr.String() == firstAddr + } + return false + } + if checkForDerivation(skyWallet.WalletTypeDeterministic) { + return true + } + return checkForDerivation(skyWallet.WalletTypeBip44) +} + +func (sw SkyWallet) ReadyForTxn(wlt core.Wallet, txn core.Transaction) (bool, error) { + if txn != nil { + _, isSkycoinTxn := txn.(skytypes.SkycoinTxn) + if !isSkycoinTxn { + return false, nil + } + } + _, isSkycoinWlt := wlt.(skytypes.SkycoinWallet) + if !isSkycoinWlt { + return false, errors.New("a non Skycoin wallet received in ReadyForTxn") + } + return hwMatchWallet(sw, wlt), nil +} + +// NewSkyWallet create a new sky wallet instance +func NewSkyWallet(wlt core.Wallet, dev skyWallet.Devicer) *SkyWallet { + return &SkyWallet{ + wlt: wlt, + dev: dev, + } +} + +func getAllIndexesFromTxn(txn core.Transaction) []int { + inputs := txn.GetInputs() + indexes := make([]int, len(inputs), cap(inputs)) + for i := 0; i < len(inputs); i++ { + indexes[i] = i + } + return indexes +} + +func findValInSlice(val int, arr []int) bool { + for i := 0; i < len(arr); i++ { + if arr[i] == val { + return true + } + } + return false +} + +func getInputs(txn coin.Transaction, indexes []int) (inputs []*messages.SkycoinTransactionInput, err error) { + for idx, input := range txn.In { + var transactionInput messages.SkycoinTransactionInput + transactionInput.HashIn = proto.String(input.String()) + if findValInSlice(idx, indexes) { + transactionInput.Index = proto.Uint32(uint32(idx)) + } + inputs = append(inputs, &transactionInput) + } + return inputs, nil +} + +func getAddrIndex(wlt core.Wallet, addr string) (uint32, error) { + addrs, err := wlt.GetLoadedAddresses() + if err != nil { + return 0, err + } + for i := uint32(0); addrs.Next(); i++ { + if addrs.Value().String() == addr { + return i, nil + } + } + return 0, errors.New("unable to find a matching address from wallet") +} + +func getOutputs(wlt core.Wallet, tr coin.Transaction) (inputs []*messages.SkycoinTransactionOutput, err error) { + for _, output := range tr.Out { + var transactionOutput messages.SkycoinTransactionOutput + transactionOutput.Address = proto.String(output.Address.String()) + transactionOutput.Coin = proto.Uint64(output.Coins) + transactionOutput.Hour = proto.Uint64(output.Hours) + index, err := getAddrIndex(wlt, output.Address.String()) + if err == nil { + transactionOutput.AddressIndex = proto.Uint32(index) + } + inputs = append(inputs, &transactionOutput) + } + return +} + +func readableTxn2Transaction(txn skytypes.ReadableTxn) (*coin.Transaction, error) { + cTxn, err := txn.ToCreatedTransaction() + if err != nil { + return nil, err + } + skyTxn, err := cTxn.ToTransaction() + if err != nil { + return nil, err + } + return skyTxn, nil +} + +func rawTxn2Transaction (txn skytypes.SkycoinTxn) (*coin.Transaction, error) { + buf, err := txn.EncodeSkycoinTransaction() + if err != nil { + + } + skyTxn, err := coin.DeserializeTransaction(buf) + if err != nil { + + } + return &skyTxn, nil +} + +func toTransaction(txn core.Transaction) (*coin.Transaction, error) { + if rTxn, isReadableTxn := txn.(skytypes.ReadableTxn); isReadableTxn { + t, err := readableTxn2Transaction(rTxn) + if err != nil { + logSkyWallet.WithError(err).Errorln("error transforming core.Transaction to coin.Transaction") + return nil, fce.ErrInvalidTypeAssertion + } + return t, nil + } else { + // Raw transaction + unTxn, ok := txn.(*skycoin.SkycoinUninjectedTransaction) + if !ok { + logSkyWallet.Errorln("error transforming core.Transaction to coin.Transaction") + return nil, fce.ErrInvalidTypeAssertion + } + t, err := rawTxn2Transaction(unTxn) + if err != nil { + logSkyWallet.WithError(err).Errorln("error transforming core.Transaction to coin.Transaction") + return nil, fce.ErrInvalidTypeAssertion + } + return t, nil + } +} + +func coin2Core(txn *coin.Transaction, fee uint64) (core.Transaction, error) { + unTxn, err := skycoin.NewUninjectedTransaction(txn, fee) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to create uninjected transaction") + return nil, fce.ErrTxnSignFailure + } + return unTxn, nil +} + +func (sw *SkyWallet) signTxn(txn *coin.Transaction, idxs []int, dt string) (*coin.Transaction, error) { + transactionInputs, err := getInputs(*txn, idxs) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get inputs") + return nil, fce.ErrTxnSignFailure + } + transactionOutputs, err := getOutputs(sw.wlt, *txn) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get outputs") + return nil, fce.ErrTxnSignFailure + } + msg, err := sw.dev.TransactionSign(transactionInputs, transactionOutputs, dt) + if err != nil { + logSkyWallet.WithError(err).Error("error signing transaction") + return nil, fce.ErrTxnSignFailure + } + signatures, err := skyWallet.DecodeResponseTransactionSign(msg) + if err != nil { + logSkyWallet.WithError(err).Error("error decoding device response") + return nil, fce.ErrTxnSignFailure + } + if txn.Sigs == nil { + logSkyWallet.Warnln("nil slice in transaction signatures detected, creating a new one") + txn.Sigs = make([]cipher.Sig, len(transactionInputs)) + } + if len(signatures) != len(transactionInputs) { + logSkyWallet.WithFields( + logrus.Fields{ + "signatures_len": len(signatures), + "transactionInputs_len": len(transactionInputs)}).Errorln("signatures response len should match inputs one") + return nil, fce.ErrTxnSignFailure + } + for idx, sign := range signatures { + if !findValInSlice(idx, idxs) { + // NOTE only sign required inputs + continue + } + buf, err := hex.DecodeString(sign) + if err != nil { + logSkyWallet.WithError(err).Error("unable to decode signature") + return nil, fce.ErrTxnSignFailure + } + sgn, err := cipher.NewSig(buf) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get Skycoin address from buffer") + return nil, errors.New("unable to get Skycoin address from buffer") + } + txn.Sigs[idx] = sgn + } + return txn, nil +} + +func (sw SkyWallet) signTransaction(txn core.Transaction, idxs []int) (core.Transaction, error) { + fee, err := txn.ComputeFee(params.CoinHoursTicker) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get fee") + return nil, fce.ErrTxnSignFailure + } + t, err := toTransaction(txn) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get txn as coin.Transaction") + return nil, fce.ErrTxnSignFailure + } + dt := derivationType(txn) + signed, err := sw.signTxn(t, idxs, dt) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to sign transaction") + return nil, fce.ErrTxnSignFailure + } + return coin2Core(signed, fee) +} + +func derivationType(txn core.Transaction) string { + wt := skyWallet.WalletTypeDeterministic + inputs := txn.GetInputs() + if len(inputs) > 0 { + addr := inputs[0].GetSpentOutput().GetAddress() + if addr.IsBip32() { + wt = skyWallet.WalletTypeBip44 + } + } + return wt +} + +func verifyInputsGrouping(txn core.Transaction) error { + areBip32 := derivationType(txn) == skyWallet.WalletTypeBip44 + for _, in := range txn.GetInputs() { + addr := in.GetSpentOutput().GetAddress() + if addr.IsBip32() != areBip32 { + return errors.New("all inputs should be grouped by derivation type") + } + } + return nil +} + +// SignTransaction using hardware wallet +func (sw SkyWallet) SignTransaction(txn core.Transaction, pr core.PasswordReader, indexes []string) (core.Transaction, error) { + if sw.dev == nil { + logSkyWallet.Errorln("error creating hardware wallet device handler") + return nil, fce.ErrTxnSignFailure + } + //defer device.Close() + if err := verifyInputsGrouping(txn); err != nil { + logSkyWallet.WithError(err).Errorln("unable to sign transaction using skycoin hardware wallet") + return nil, fce.ErrTxnSignFailure + } + isFullySigned, err := txn.IsFullySigned() + if err != nil { + return txn, err + } + if isFullySigned { + // TODO named var, this should be used in tests assertions too + return nil, errors.New("Transaction is fully signed") + } + idxs, err := skycoin.GetHashIndices(txn.GetInputs(), indexes) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get indexes slice as int slice") + return nil, fce.ErrTxnSignFailure + } + if len(idxs) == 0 { + logSkyWallet.Debugln("not inputs to sign specified, assuming all") + idxs = getAllIndexesFromTxn(txn) + } + signedTxn, err := sw.signTransaction(txn, idxs) + if err != nil { + logSkyWallet.WithError(err).Errorln("error signing transaction with device") + return nil, fce.ErrTxnSignFailure + } + return signedTxn, nil +} + +func (sw SkyWallet) getDeviceFeatures() (messages.Features, error) { + if sw.dev == nil { + logSkyWallet.Error("error, nil hardware wallet device handler") + return messages.Features{}, fce.ErrHwUnexpected + } + // FIXME: This should not be closed, it's a lower level detail (check out in cli tool too). + // defer sw.dev.Close() + msg, err := sw.dev.GetFeatures() + if err != nil { + logSkyWallet.WithError(err).Error("error getting device features") + return messages.Features{}, fce.ErrHwUnexpected + } + features := messages.Features{} + err = proto.Unmarshal(msg.Data, &features) + if err != nil { + logSkyWallet.WithError(err).Error("error decoding device response") + return messages.Features{}, fce.ErrHwUnexpected + } + return features, nil +} + +// GetSignerUID this signer uid using the hardware wallet label +func (sw SkyWallet) GetSignerUID() (core.UID, error) { + features, err := sw.getDeviceFeatures() + if err != nil { + logSkyWallet.WithError(err).Error("unable to get device features") + return "", fce.ErrHwUnexpected + } + if features.DeviceId == nil { + logSkyWallet.WithField("devId", features.DeviceId).Errorln("unable to get device id") + return core.UID(""), fce.ErrNilValue + } + return core.UID(*features.DeviceId), nil +} + +// GetSignerDescription facilitates a human readable caption identifying this signing strategy +// in urn(https://en.wikipedia.org/wiki/Uniform_Resource_Name) format. +func (sw SkyWallet) GetSignerDescription() (string, error) { + features, err := sw.getDeviceFeatures() + if err != nil { + logSkyWallet.WithError(err).Error("unable to get device features") + return "", fce.ErrHwUnexpected + } + if features.Label == nil { + logSkyWallet.WithField("devLabel", features.Label).Errorln("unable to get device label") + return "", fce.ErrNilValue + } + return urnPrefix+*features.Label, nil +} + +// Type assertions +var ( + _ core.TxnSigner = &SkyWallet{} +) diff --git a/src/contrib/skywallet/sky-wallet_test.go b/src/contrib/skywallet/sky-wallet_test.go new file mode 100644 index 00000000..a102189b --- /dev/null +++ b/src/contrib/skywallet/sky-wallet_test.go @@ -0,0 +1,192 @@ +package hardware + +import ( + "errors" + "github.com/fibercrypto/fibercryptowallet/src/core" + fce "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/contrib/skywallet/mocks" + "github.com/fibercrypto/skywallet-go/src/skywallet/wire" + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/require" + "testing" + messages "github.com/fibercrypto/skywallet-protob/go" +) + + + +func TestGetSignerUIDShouldBeOk(t *testing.T) { + // Giving + dev := mocks.Devicer{} + expectedDevId := "c24a046d-7d7b-484d-baf6-abedd883023f" + f := messages.Features{ + DeviceId: proto.String(expectedDevId), + } + fb, err := proto.Marshal(&f) + require.Nil(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Features), + Data: fb, + } + dev.On("GetFeatures").Return(msg, nil) + sw := NewSkyWallet(nil, &dev) + + // When + devId, err := sw.GetSignerUID() + + // Then + require.NoError(t, err) + require.Equal(t, core.UID(expectedDevId), devId) +} + +func TestGetSignerUIDShouldFailForUninitializedDevice(t *testing.T) { + // Giving + sw := NewSkyWallet(nil, nil) + + // When + devId, err := sw.GetSignerUID() + + // Then + require.Error(t, err) + require.Equal(t, err, fce.ErrHwUnexpected) + require.Equal(t, core.UID(""), devId) +} + +func TestGetSignerUIDShouldFailOnDeviceError(t *testing.T) { + // Giving + dev := mocks.Devicer{} + dev.On("GetFeatures").Return(wire.Message{}, errors.New("")) + sw := NewSkyWallet(nil, &dev) + + // When + devId, err := sw.GetSignerUID() + + // Then + require.Error(t, err) + require.Equal(t, core.UID(""), devId) +} + +func TestGetSignerUIDShouldFailForFailResponse(t *testing.T) { + // Giving + dev := mocks.Devicer{} + f := messages.Failure{} + fb, err := proto.Marshal(&f) + require.Nil(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: fb, + } + dev.On("GetFeatures").Return(msg, nil) + sw := NewSkyWallet(nil, &dev) + + // When + devId, err := sw.GetSignerUID() + + // Then + require.Error(t, err) + require.Equal(t, core.UID(""), devId) +} + +func TestGetSignerUIDShouldFailForInvalidMessageType(t *testing.T) { + // Giving + dev := mocks.Devicer{} + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_PinMatrixAck), + } + dev.On("GetFeatures").Return(msg, nil) + sw := NewSkyWallet(nil, &dev) + + // When + devId, err := sw.GetSignerUID() + + // Then + require.Error(t, err) + require.Equal(t, core.UID(""), devId) +} + +func TestGetSignerDescriptionShouldBeOk(t *testing.T) { + // Giving + dev := mocks.Devicer{} + expectedDevDescription := urnPrefix+"c24a046d-7d7b-484d-baf6-abedd883023f" + f := messages.Features{ + Label: proto.String("c24a046d-7d7b-484d-baf6-abedd883023f"), + } + fb, err := proto.Marshal(&f) + require.Nil(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Features), + Data: fb, + } + dev.On("GetFeatures").Return(msg, nil) + sw := NewSkyWallet(nil, &dev) + + // When + devDescription, err := sw.GetSignerDescription() + + // Then + require.NoError(t, err) + require.Equal(t, expectedDevDescription, devDescription) +} + +func TestGetSignerDescriptionShouldFailForUninitializedDevice(t *testing.T) { + // Giving + sw := SkyWallet{} + + // When + devId, err := sw.GetSignerDescription() + + // Then + require.Error(t, err) + require.Equal(t, "", devId) +} + +func TestGetSignerDescriptionShouldFailOnDeviceError(t *testing.T) { + // Giving + dev := mocks.Devicer{} + dev.On("GetFeatures").Return(wire.Message{}, errors.New("")) + sw := NewSkyWallet(nil, &dev) + + // When + devId, err := sw.GetSignerDescription() + + // Then + require.Error(t, err) + require.Equal(t, "", devId) +} + +func TestGetSignerDescriptionShouldFailForFailResponse(t *testing.T) { + // Giving + dev := mocks.Devicer{} + f := messages.Failure{} + fb, err := proto.Marshal(&f) + require.Nil(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: fb, + } + dev.On("GetFeatures").Return(msg, nil) + sw := NewSkyWallet(nil, &dev) + + // When + devId, err := sw.GetSignerDescription() + + // Then + require.Error(t, err) + require.Equal(t, "", devId) +} + +func TestGetSignerDescriptionShouldFailForInvalidMessageType(t *testing.T) { + // Giving + dev := mocks.Devicer{} + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_PinMatrixAck), + } + dev.On("GetFeatures").Return(msg, nil) + sw := NewSkyWallet(nil, &dev) + + // When + devId, err := sw.GetSignerDescription() + + // Then + require.Error(t, err) + require.Equal(t, "", devId) +} \ No newline at end of file diff --git a/src/contrib/skywallet/skywallet_integration_test.go b/src/contrib/skywallet/skywallet_integration_test.go new file mode 100644 index 00000000..b9526801 --- /dev/null +++ b/src/contrib/skywallet/skywallet_integration_test.go @@ -0,0 +1,65 @@ +package hardware + +import ( + skycoin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + integrationtestutil "github.com/fibercrypto/fibercryptowallet/test/integration/util" + "github.com/fibercrypto/skywallet-go/src/integration/proxy" + "github.com/fibercrypto/skywallet-go/src/skywallet" + "github.com/stretchr/testify/require" + "os" + "testing" +) + +func emulatorDevice() skywallet.Devicer { + return proxy.NewSequencer( + skywallet.NewDevice( + skywallet.DeviceTypeEmulator), + true, + func()string{return ""}, + ) +} + +func setUpHardwareWallet(t *testing.T) { + util.RegisterAltcoin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + dev := emulatorDevice() + keyTestData, err := skycoin.GenerateTestKeyPair(t) + require.NoError(t, err) + integrationtestutil.ForceSetMnemonic(t, dev, keyTestData.Mnemonic) +} + +var logModelTest = logging.MustGetLogger("Skycoin Hardware Wallet Test") + +//Prepare the mock API for all test +func TestMain(m *testing.M) { + mock := new(skycoin.SkycoinApiMock) + skycoin.SetGlobalMock(mock) + err := core.GetMultiPool().CreateSection(skycoin.PoolSection, mock) + if err != nil { + logModelTest.WithError(err).Warn("Error creating pool section") + return + } + util.RegisterAltcoin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + os.Exit(m.Run()) +} + +func TestTransactionSignInputFromDevice(t *testing.T) { + skycoin.CleanGlobalMock() + setUpHardwareWallet(t) + dev := emulatorDevice() + hs1 := NewSkyWallet(nil, dev) + hs2 := NewSkyWallet(nil, dev) + hs3 := NewSkyWallet(nil, dev) + setWallet := func(t *testing.T, signer core.TxnSigner, wlt core.Wallet) { + hs, ok := signer.(*SkyWallet) + require.True(t, ok) + hs.wlt = wlt + } + signers := make([]core.TxnSigner, 3) + signers[0] = hs1 + signers[1] = hs2 + signers[2] = hs3 + skycoin.TransactionSignInputTestSkyHwImpl(t, signers, setWallet) +} diff --git a/src/core/cipher.go b/src/core/cipher.go index 6ffe3d7a..e1d64b68 100644 --- a/src/core/cipher.go +++ b/src/core/cipher.go @@ -58,12 +58,14 @@ type TxnSigner interface { // SignTransaction partially or in full SignTransaction(Transaction, PasswordReader, []string) (Transaction, error) // GetSignerUID provides the key identifying this signer among peer strategies supported by an object - GetSignerUID() UID + GetSignerUID() (UID, error) // GetSignerDescription facilitates a human readable caption identifying this signing strategy - GetSignerDescription() string + GetSignerDescription() (string, error) } // TxnSignerIterator enumerates a set if TxSigner strategies +// at the begin the iterator is in an invalid state, so to get the first +// value (using the Value function) a first call to Next is required type TxnSignerIterator interface { // Value of signer at iterator pointer position Value() TxnSigner diff --git a/src/core/wallet.go b/src/core/wallet.go index 0b01f1a7..1f5a94d7 100644 --- a/src/core/wallet.go +++ b/src/core/wallet.go @@ -24,6 +24,11 @@ type WalletSet interface { SupportedWalletTypes() []string } +type PersistibleSet interface { + WalletSet + WalletStorage +} + // WalletStorage provides access to the underlying wallets data store type WalletStorage interface { // Encrypt protects wallet data using cryptography @@ -101,4 +106,7 @@ type WalletEnv interface { GetStorage() WalletStorage // GetWalletSet loads wallets in this environment GetWalletSet() WalletSet + // LookupWallet allow you to get a wallet from the first address in the + // deterministic sequence, error if not found or some thing was happen + LookupWallet(firstAddr string) (Wallet, error) } diff --git a/src/errors/error.go b/src/errors/error.go index 2617b6f0..0985a768 100644 --- a/src/errors/error.go +++ b/src/errors/error.go @@ -45,6 +45,8 @@ var ( ErrInvalidAddressString = errors.New("Error decoding base58 address") // ErrTxnSignFailure signing strategy reported an error whie signing transaction ErrTxnSignFailure = errors.New("Transaction signing failed for txn") + // ErrNoMoreElements no more elements in a sequence or succession + ErrNoMoreElements = errors.New("No more elements in the sequence") // ErrUnexpectedUxOutAddress unexpected address ErrUnexpectedUxOutAddress = errors.New("Unexpected address") // ErrInvalidPoolObjectType clients in the pool do not match expected type @@ -53,8 +55,21 @@ var ( ErrInvalidWalletEntropy = errors.New("Entropy must be 128 or 256") // ErrInvalidValue invalid value was supplied in to function ErrInvalidValue = errors.New("Value errors") + // ErrInvalidTypeAssertion the current value have not the expected type + ErrInvalidTypeAssertion = errors.New("Invalid type assertion") // ErrWalletCantSign wallet can not sign transactions ErrWalletCantSign = errors.New("Wallet does not support transaction signing") // ErrNotImplemented feature not implemented ErrNotImplemented = errors.New("Feature not implemented") + // ErrWltFromAddrNotFound trying to find a wallet from the first address in the deterministic sequence failed + // wallet not found + ErrWltFromAddrNotFound = errors.New("Error getting wallet from addr, no wallet found") + // ErrInvalidIndex invalid index detected + ErrInvalidIndex = errors.New("Invalid index") + // ErrHwUnexpected unexpected error with sky-hw + ErrHwUnexpected = errors.New("Unexpected error with device") + // ErrHwSignTransactionCanceled cancelled by user in the physical device + ErrHwSignTransactionCanceled = errors.New("Sign transaction with hardware wallet has been canceled") + // ErrNilValue object should not be null + ErrNilValue = errors.New("Object should not be null") ) diff --git a/src/main/sign.go b/src/main/sign.go index bbb5b68c..f3214b06 100644 --- a/src/main/sign.go +++ b/src/main/sign.go @@ -8,7 +8,11 @@ import ( func (m *fibercryptoAltcoinManager) AttachSignService(signSrv core.TxnSigner) error { if signSrv != nil { - m.signers[signSrv.GetSignerUID()] = signSrv + uid, err := signSrv.GetSignerUID() + if err != nil { + return err + } + m.signers[uid] = signSrv } return nil } @@ -25,7 +29,10 @@ func (m *fibercryptoAltcoinManager) LookupSignService(id core.UID) core.TxnSigne } func (m *fibercryptoAltcoinManager) RemoveSignService(signSrv core.TxnSigner) error { - uid := signSrv.GetSignerUID() + uid, err := signSrv.GetSignerUID() + if err != nil { + return err + } if _, isBound := m.signers[uid]; isBound { delete(m.signers, uid) return nil diff --git a/src/models/models.go b/src/models/models.go index 6535bc43..1d262806 100644 --- a/src/models/models.go +++ b/src/models/models.go @@ -5,6 +5,8 @@ func init() { BlockchainStatusModel_QmlRegisterType2("BlockchainModels", 1, 0, "BlockchainStatusModel") WalletModel_QmlRegisterType2("WalletsManager", 1, 0, "WalletModel") QWallet_QmlRegisterType2("WalletsManager", 1, 0, "QWallet") + QSigner_QmlRegisterType2("WalletsManager", 1, 0, "QSigner") + SignerModel_QmlRegisterType2("WalletsManager", 1, 0, "SignerModel") AddressesModel_QmlRegisterType2("WalletsManager", 1, 0, "AddressModel") QAddress_QmlRegisterType2("WalletsManager", 1, 0, "QAddress") WalletManager_QmlRegisterType2("WalletsManager", 1, 0, "WalletManager") diff --git a/src/models/signersModel.go b/src/models/signersModel.go new file mode 100644 index 00000000..6956e18c --- /dev/null +++ b/src/models/signersModel.go @@ -0,0 +1,129 @@ +package models + +import ( + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/qml" + wlcore "github.com/fibercrypto/fibercryptowallet/src/main" +) + +const ( + SignerId = iota + int(core.Qt__UserRole) + 1 + SignerDescription +) + +var logSignersModel = logging.MustGetLogger("Signers Model") + +type SignerModel struct { + core.QAbstractListModel + + _ func() `constructor:"init"` + _ map[int]*core.QByteArray `property:"roles"` + _ []*QSigner `property:"signers"` + _ func(string) `slot:"loadModel"` + _ int `property:"count"` +} + +type QSigner struct { + core.QObject + + _ string `property:"id"` + _ string `property:"description"` +} + +func (signerModel *SignerModel) init() { + logWalletsModel.Debugln("Initialize Signer model") + signerModel.SetRoles(map[int]*core.QByteArray{ + SignerId: core.NewQByteArray2("id", -1), + SignerDescription: core.NewQByteArray2("description", -1), + }) + qml.QQmlEngine_SetObjectOwnership(signerModel, qml.QQmlEngine__CppOwnership) + signerModel.ConnectData(signerModel.data) + signerModel.ConnectRowCount(signerModel.rowCount) + signerModel.ConnectColumnCount(signerModel.columnCount) + signerModel.ConnectRoleNames(signerModel.roleNames) + signerModel.ConnectLoadModel(signerModel.loadModel) +} + +func (signerModel *SignerModel) data(index *core.QModelIndex, role int) *core.QVariant { + if !index.IsValid() { + return core.NewQVariant() + } + if index.Row() >= len(signerModel.Signers()) { + return core.NewQVariant() + } + var s = signerModel.Signers()[index.Row()] + switch role { + case SignerId: + { + return core.NewQVariant1(s.Id()) + } + case SignerDescription: + { + return core.NewQVariant1(s.Description()) + } + + default: + { + return core.NewQVariant() + } + } +} + +func (signerModel *SignerModel) rowCount(parent *core.QModelIndex) int { + return len(signerModel.Signers()) +} + +func (signersModel *SignerModel) columnCount(parent *core.QModelIndex) int { + return 1 +} + +func (signersModel *SignerModel) roleNames() map[int]*core.QByteArray { + return signersModel.Roles() +} + +func (signerModel *SignerModel) loadModel(wltId string) { + logSignersModel.Debugln("Loading signers", wltId) + wlt := walletManager.WalletEnv.GetWalletSet().GetWallet(wltId) + if wlt == nil { + return + } + am := wlcore.LoadAltcoinManager() + signers := am.EnumerateSignServices() + var qSigners []*QSigner + qSigner := NewQSigner(nil) + qml.QQmlEngine_SetObjectOwnership(qSigner, qml.QQmlEngine__CppOwnership) + qSigner.SetId(wlt.GetId()) + qSigner.SetDescription(wlt.GetLabel()) + qSigners = append(qSigners, qSigner) + for signers.Next() { + qSigner = NewQSigner(nil) + qml.QQmlEngine_SetObjectOwnership(qSigner, qml.QQmlEngine__CppOwnership) + signer := signers.Value() + sameSeedAsWlt, err := signer.ReadyForTxn(wlt, nil) + if err != nil { + logSignersModel.WithError(err).Errorln("unable to check wallet and signer compatibility") + return + } + if !sameSeedAsWlt { + continue + } + uid, err := signer.GetSignerUID() + if err != nil { + logSignersModel.WithError(err).Error("unable to get signer uid") + return + } + qSigner.SetId(string(uid)) + desc, err := signer.GetSignerDescription() + if err != nil { + logSignersModel.WithError(err).Error("unable to get signer description") + return + } + qSigner.SetDescription(desc) + qSigners = append(qSigners, qSigner) + } + signerModel.BeginResetModel() + signerModel.SetSigners(qSigners) + signerModel.SetCount(len(signerModel.Signers())) + signerModel.EndResetModel() +} diff --git a/src/models/walletsModel.go b/src/models/walletsModel.go index 0fc491b9..966dd784 100644 --- a/src/models/walletsModel.go +++ b/src/models/walletsModel.go @@ -2,12 +2,18 @@ package models import ( "strconv" + hardware "github.com/fibercrypto/fibercryptowallet/src/contrib/skywallet" coin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" "github.com/fibercrypto/fibercryptowallet/src/util" "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "github.com/fibercrypto/skywallet-go/src/integration/proxy" "github.com/therecipe/qt/core" "github.com/therecipe/qt/qml" + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" + wlcore "github.com/fibercrypto/fibercryptowallet/src/main" + fccore "github.com/fibercrypto/fibercryptowallet/src/core" + "time" ) const ( @@ -17,9 +23,13 @@ const ( CoinHours FileName Expand + HasHardwareWallet ) var logWalletsModel = logging.MustGetLogger("Wallets Model") +var dev skyWallet.Devicer +var hadHwConnected = false +var hwConnectedOn []int type WalletModel struct { core.QAbstractListModel @@ -34,6 +44,7 @@ type WalletModel struct { _ func(row int) `slot:"removeWallet"` _ func([]*QWallet) `slot:"loadModel"` _ func([]*QWallet) `slot:"updateModel"` + _ func() `slot:"sniffHw"` _ int `property:"count"` } @@ -45,10 +56,14 @@ type QWallet struct { _ string `property:"coinHours"` _ string `property:"fileName"` _ bool `property:"expand"` + _ bool `property:"hasHardwareWallet"` } func (walletModel *WalletModel) init() { logWalletsModel.Info("Initialize Wallet model") + dev = proxy.NewSequencer(skyWallet.NewDevice(skyWallet.DeviceTypeUSB), true, func() string{ + return "not implemented" + }) walletModel.SetRoles(map[int]*core.QByteArray{ Name: core.NewQByteArray2("name", -1), EncryptionEnabled: core.NewQByteArray2("encryptionEnabled", -1), @@ -56,6 +71,7 @@ func (walletModel *WalletModel) init() { CoinHours: core.NewQByteArray2("coinHours", -1), FileName: core.NewQByteArray2("fileName", -1), Expand: core.NewQByteArray2("expand", -1), + HasHardwareWallet: core.NewQByteArray2("hasHardwareWallet", -1), }) qml.QQmlEngine_SetObjectOwnership(walletModel, qml.QQmlEngine__CppOwnership) walletModel.ConnectData(walletModel.data) @@ -69,7 +85,70 @@ func (walletModel *WalletModel) init() { walletModel.ConnectRemoveWallet(walletModel.removeWallet) walletModel.ConnectLoadModel(walletModel.loadModel) walletModel.ConnectUpdateModel(walletModel.updateModel) + walletModel.ConnectSniffHw(walletModel.sniffHw) +} + +// attachHwAsSigner add a hw as signer +func attachHwAsSigner(wlt fccore.Wallet, dev skyWallet.Devicer) error { + hw := hardware.NewSkyWallet(wlt, dev) + am := wlcore.LoadAltcoinManager() + if err := am.AttachSignService(hw); err != nil { + logSignersModel.Errorln("error registering hardware wallet as signer") + return err + } + return nil +} + +// sniffHw notify the model about available hardware wallet device if any +func (walletModel *WalletModel) sniffHw() { + checkForDerivationType := func(dt string) { + addr, err := hardware.HwFirstAddr(dev, dt) + if err == nil { + wlt, err := walletManager.WalletEnv.LookupWallet(addr) + if err != nil { + logSignersModel.Warnln("can not find a wallet matching the hardware one") + // FIXME handle this scenario with a wallet registration. + return + } + err = attachHwAsSigner(wlt, dev) + if err != nil { + logSignersModel.WithError(err).Errorln("unable to attach signer") + return + } + hadHwConnected = true + walletModel.updateWallet(wlt.GetId()) + } else { + if hadHwConnected { + hadHwConnected = false + hwConnectedOn = []int{} + beginIndex := walletModel.Index(0, 0, core.NewQModelIndex()) + endIndex := walletModel.Index(walletModel.rowCount(core.NewQModelIndex())-1, 0, core.NewQModelIndex()) + walletModel.DataChanged(beginIndex, endIndex, []int{HasHardwareWallet}) + logSignersModel.WithError(err).Info("connection to hardware wallet was lose") + } + } + } + go func() { + for { + hwConnectedOn = []int{} + checkForDerivationType(skyWallet.WalletTypeDeterministic) + checkForDerivationType(skyWallet.WalletTypeBip44) + time.Sleep(time.Millisecond * 500) + } + }() +} +func (walletModel *WalletModel) updateWallet(fn string) { + index := &core.QModelIndex{} + for row := 0; row < walletModel.rowCount(core.NewQModelIndex()); row++ { + index = walletModel.Index(row, 0, core.NewQModelIndex()) + fileName := walletModel.data(index, FileName) + if fileName.ToString() == fn { + hwConnectedOn = append(hwConnectedOn, row) + walletModel.DataChanged(index, index, []int{HasHardwareWallet}) + break + } + } } func (walletModel *WalletModel) data(index *core.QModelIndex, role int) *core.QVariant { @@ -113,6 +192,20 @@ func (walletModel *WalletModel) data(index *core.QModelIndex, role int) *core.QV { return core.NewQVariant1(w.FileName()) } + case HasHardwareWallet: + { + valInSlice := func() bool { + for idx := range hwConnectedOn { + if hwConnectedOn[idx] == index.Row() && hadHwConnected { + return true + } + } + return false + } + // FIXME: consider a double checking here instead of hadHwConnected + // be careful this can have a big performance impact + return core.NewQVariant1(valInSlice()) + } case Expand: { return core.NewQVariant1(w.IsExpand()) @@ -228,7 +321,6 @@ func (walletModel *WalletModel) updateModel(wallets []*QWallet) { func (walletModel *WalletModel) loadModel(wallets []*QWallet) { logWalletsModel.Info("Loading wallets") for _, wlt := range wallets { - //wallets[i].SetSky(58) qml.QQmlEngine_SetObjectOwnership(wlt, qml.QQmlEngine__CppOwnership) } walletModel.BeginResetModel() diff --git a/src/ui/Delegates/WalletListDelegate.qml b/src/ui/Delegates/WalletListDelegate.qml index ba4b853d..ace348e5 100644 --- a/src/ui/Delegates/WalletListDelegate.qml +++ b/src/ui/Delegates/WalletListDelegate.qml @@ -42,6 +42,12 @@ Item { anchors.rightMargin: listWalletRightMargin spacing: listWalletSpacing + Rectangle { + width: 10 + height: 6 + visible: hasHardwareWallet + color: "red" + } Image { id: status source: statusIcon diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index 6152f780..09f64be8 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -14,6 +14,7 @@ Page { property alias advancedMode: switchAdvancedMode.checked property string walletSelected + property string signerSelected property string walletEncrypted property string destinationAddress property string amount @@ -181,7 +182,8 @@ Page { modal: true focus: true onAccepted: { - walletManager.signAndBroadcastTxnAsync(walletsAddresses[1], walletsAddresses[0],"", bridgeForPassword, [], txn) + signerSelected = stackView.currentItem.simplePage.getSignerSelected() + walletManager.signAndBroadcastTxnAsync(walletsAddresses[1], walletsAddresses[0],signerSelected, bridgeForPassword, [], txn) } } diff --git a/src/ui/PageWallets.qml b/src/ui/PageWallets.qml index 28ed2220..64954f57 100644 --- a/src/ui/PageWallets.qml +++ b/src/ui/PageWallets.qml @@ -96,6 +96,15 @@ Page { ScrollBar.horizontal.policy: ScrollBar.AlwaysOff ListView { + Timer { + interval: 4000 + repeat: false + running: true + onTriggered: { + walletModel.sniffHw() + } + } + id: walletList anchors.fill: parent clip: true // limit the painting to it's bounding rectangle diff --git a/src/ui/SubPageSendSimple.qml b/src/ui/SubPageSendSimple.qml index 53fc4abd..9b91e460 100644 --- a/src/ui/SubPageSendSimple.qml +++ b/src/ui/SubPageSendSimple.qml @@ -15,12 +15,17 @@ Page { id: root property string walletSelected property string walletSelectedName - property bool walletEncrypted: false + property string signerSelected + property bool walletEncrypted: false property string amount property string destinationAddress function getSelectedWallet(){ return walletSelected } + function getSignerSelected() { + return signerSelected; + } + function getAmount(){ return amount } @@ -95,44 +100,87 @@ getAddressList() anchors.rightMargin: 10 spacing: 20 - ColumnLayout { - id: columnLayoutSendFrom - - Layout.alignment: Qt.AlignTop - - Label { text: qsTr("Send from") } + RowLayout { + spacing: 20 + ColumnLayout { + id: columnLayoutSendFrom - ComboBox { - id: comboBoxWalletsSendFrom - - Layout.fillWidth: true - textRole: "name" - displayText: comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex] && comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].sky ? comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].name + " - " + comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].sky + " SKY (" + comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].coinHours + " CoinHours)" : "Select a wallet" - - model: WalletModel { - Component.onCompleted: { - loadModel(walletManager.getWallets()) - } - } + Layout.alignment: Qt.AlignTop + + Label { text: qsTr("Send from") } - // Taken from Qt 5.13.0 source code: - delegate: MenuItem { - width: parent.width - text: comboBoxWalletsSendFrom.textRole ? (Array.isArray(comboBoxWalletsSendFrom.model) ? modelData[comboBoxWalletsSendFrom.textRole] : model[comboBoxWalletsSendFrom.textRole] + " - "+model["sky"] + " SKY (" + model["coinHours"] + " CoinHours)") : " --- " + modelData - Material.foreground: comboBoxWalletsSendFrom.currentIndex === index ? parent.Material.accent : parent.Material.foreground - highlighted: comboBoxWalletsSendFrom.highlightedIndex === index - hoverEnabled: comboBoxWalletsSendFrom.hoverEnabled - leftPadding: highlighted ? 2*padding : padding // added - Behavior on leftPadding { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } // added + ComboBox { + Layout.fillWidth: true + id: comboBoxWalletsSendFrom + textRole: "name" + displayText: comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex] && comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].sky ? comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].name + " - " + comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].sky + " SKY (" + comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].coinHours + " CoinHours)" : "Select a wallet" + model: WalletModel { + Component.onCompleted: { + loadModel(walletManager.getWallets()) + } + } + + // Taken from Qt 5.13.0 source code: + delegate: MenuItem { + width: parent.width + text: comboBoxWalletsSendFrom.textRole ? (Array.isArray(comboBoxWalletsSendFrom.model) ? modelData[comboBoxWalletsSendFrom.textRole] : model[comboBoxWalletsSendFrom.textRole] + " - "+model["sky"] + " SKY (" + model["coinHours"] + " CoinHours)") : " --- " + modelData + Material.foreground: comboBoxWalletsSendFrom.currentIndex === index ? parent.Material.accent : parent.Material.foreground + highlighted: comboBoxWalletsSendFrom.highlightedIndex === index + hoverEnabled: comboBoxWalletsSendFrom.hoverEnabled + leftPadding: highlighted ? 2*padding : padding // added + Behavior on leftPadding { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } // added + } + + onActivated: { + root.walletSelected = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].fileName + root.walletSelectedName = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].name + root.walletEncrypted = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].encryptionEnabled + signerSelector.reset(root.walletSelected); + } + } // ComboBox + } // ColumnLayout (send from) + ColumnLayout { + id: signerSelectorId + Layout.alignment: Qt.AlignTop + visible: false + + Label { text: qsTr("Change signer") } + ComboBox { + Layout.fillWidth: true + id: signerSelector + textRole: "description" + model: SignerModel { + id: signerModelId + } + // Taken from Qt 5.13.0 source code: + delegate: MenuItem { + id: selectedSignerDelegateId + width: parent.width + text: signerSelector.textRole ? + (Array.isArray(signerSelector.model) + ? modelData[signerSelector.textRole] + : model[signerSelector.textRole]) + : modelData + Material.foreground: signerSelector.currentIndex === index ? parent.Material.accent : parent.Material.foreground + highlighted: signerSelector.highlightedIndex === index + hoverEnabled: signerSelector.hoverEnabled + leftPadding: highlighted ? 2*padding : padding // added + Behavior on leftPadding { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } // added + onClicked: { + root.signerSelected = + Array.isArray(signerSelector.model) + ? modelData["id"] : model["id"]; + } + } + function reset(wltId) { + currentIndex = -1; + signerModelId.loadModel(wltId) + signerSelectorId.visible = signerModelId.rowCount() > 1 + } } + } + } - onActivated: { - root.walletSelected = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].fileName - root.walletSelectedName = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].name - root.walletEncrypted = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].encryptionEnabled - } - } // ComboBox - } // ColumnLayout (send from) ColumnLayout { id: columnLayoutSendTo diff --git a/src/util/plugin_test.go b/src/util/plugin_test.go index e3ef995c..2706f9b1 100644 --- a/src/util/plugin_test.go +++ b/src/util/plugin_test.go @@ -55,7 +55,7 @@ func TestLookupSignerByUID(t *testing.T) { other := core.UID("otherid") ws := new(WalletSigner) - ws.TxnSigner.On("GetSignerUID").Return(uid) + ws.TxnSigner.On("GetSignerUID").Return(uid, nil) var signer core.TxnSigner = ws err := AttachSignService(signer) defer RemoveSignService(uid) // nolint gosec diff --git a/src/util/pluginutil.go b/src/util/pluginutil.go index b08591e1..40b0db98 100644 --- a/src/util/pluginutil.go +++ b/src/util/pluginutil.go @@ -36,9 +36,16 @@ func LookupSignerByUID(wlt core.Wallet, id core.UID) core.TxnSigner { } return nil } - // Wallet matches ID - if isSigner && wltSigner.GetSignerUID() == id { - return wltSigner + if isSigner { + // Wallet matches ID + uid, err := wltSigner.GetSignerUID() + if err != nil { + logUtil.WithError(err).Errorln("unable to get signer uid") + return nil + } + if uid == id { + return wltSigner + } } // Lookup global signers return local.LoadAltcoinManager().LookupSignService(id) diff --git a/src/util/sign.go b/src/util/sign.go index 2fecebe2..f3eb2ddf 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -64,7 +64,7 @@ func GetSignerDescription(signerID core.UID) (string, error) { if signer == nil { return "", errors.ErrInvalidID } - return signer.GetSignerDescription(), nil + return signer.GetSignerDescription() } // LookupSignServiceForWallet instantiate signing straegy identified by UID. Fall back to wallet if empty diff --git a/src/util/sign_test.go b/src/util/sign_test.go index 745777d2..dcbf5294 100644 --- a/src/util/sign_test.go +++ b/src/util/sign_test.go @@ -15,18 +15,22 @@ import ( func TestSignerMethods(t *testing.T) { signerID1 := core.UID("TestAddLookupSigner#1") signer1 := new(mocks.TxnSigner) - signer1.On("GetSignerUID").Return(signerID1) - signer1.On("GetSignerDescription").Return(string(signerID1)) - require.Equal(t, signer1.GetSignerUID(), signerID1) - require.Equal(t, signer1.GetSignerDescription(), string(signerID1)) - err := AttachSignService(signer1) + signer1.On("GetSignerUID").Return(signerID1, nil) + signer1.On("GetSignerDescription").Return(string(signerID1), nil) + uid, err := signer1.GetSignerUID() + require.NoError(t, err) + require.Equal(t, uid, signerID1) + desc, err := signer1.GetSignerDescription() + require.NoError(t, err) + require.Equal(t, desc, string(signerID1)) + err = AttachSignService(signer1) require.NoError(t, err) defer RemoveSignService(signerID1) // nolint gosec signer := LookupSignService(signerID1) require.NotNil(t, signer) require.Equal(t, signer, signer1) - desc, err := GetSignerDescription(signerID1) + desc, err = GetSignerDescription(signerID1) require.NoError(t, err) require.Equal(t, string(signerID1), desc) @@ -48,9 +52,11 @@ func TestSignersEnum(t *testing.T) { // Install global signers for i, uid := range signerIDs { signer := new(mocks.TxnSigner) - signer.On("GetSignerUID").Return(uid) - require.Equal(t, signer.GetSignerUID(), uid) - err := AttachSignService(signer) + signer.On("GetSignerUID").Return(uid, nil) + uid, err := signer.GetSignerUID() + require.NoError(t, err) + require.Equal(t, uid, uid) + err = AttachSignService(signer) require.NoError(t, err) signers[i] = signer } @@ -60,12 +66,13 @@ func TestSignersEnum(t *testing.T) { allSigners := EnumerateSignServices() signersFound := make(map[core.UID]struct{}) - for allSigners.HasNext() { - signerID := allSigners.Value().GetSignerUID() + for allSigners.Next() { + uid, err := allSigners.Value().GetSignerUID() + require.NoError(t, err) + signerID := uid _, wasFound := signersFound[signerID] require.False(t, wasFound) signersFound[signerID] = struct{}{} - allSigners.Next() } _, wasFound := signersFound[signerIDs[0]] require.True(t, wasFound) @@ -88,9 +95,11 @@ func TestSignersReadyForTxn(t *testing.T) { // Install global signers for i, uid := range signerIDs { signer := new(mocks.TxnSigner) - signer.On("GetSignerUID").Return(uid) - require.Equal(t, signer.GetSignerUID(), uid) - err := AttachSignService(signer) + signer.On("GetSignerUID").Return(uid, nil) + dUid, err := signer.GetSignerUID() + require.NoError(t, err) + require.Equal(t, dUid, uid) + err = AttachSignService(signer) require.NoError(t, err) signers[i] = signer } @@ -112,12 +121,12 @@ func TestSignersReadyForTxn(t *testing.T) { supportedSigners := SignServicesForTxn(wlt, txn) signersFound := make(map[core.UID]struct{}) - for supportedSigners.HasNext() { - signerID := supportedSigners.Value().GetSignerUID() + for supportedSigners.Next() { + signerID, err := supportedSigners.Value().GetSignerUID() + require.NoError(t, err) _, wasFound := signersFound[signerID] require.False(t, wasFound) signersFound[signerID] = struct{}{} - supportedSigners.Next() } _, wasFound := signersFound[signerIDs[0]] require.True(t, wasFound) @@ -165,7 +174,7 @@ func TestLookupSignServiceForWallet(t *testing.T) { other := core.UID("otherid") ws := new(WalletSigner) - ws.TxnSigner.On("GetSignerUID").Return(uid) + ws.TxnSigner.On("GetSignerUID").Return(uid, nil) var signer core.TxnSigner = ws err := AttachSignService(signer) defer RemoveSignService(uid) // nolint gosec @@ -202,7 +211,7 @@ func TestSignTransaction(t *testing.T) { uid := core.UID("signer_id") signer := new(mocks.TxnSigner) - signer.On("GetSignerUID").Return(uid) + signer.On("GetSignerUID").Return(uid, nil) attachErr := AttachSignService(signer) require.Nil(t, attachErr) defer RemoveSignService(uid) // nolint gosec @@ -236,7 +245,7 @@ func TestGenericMultiWalletSign(t *testing.T) { uid := core.UID("signer_id") signer := new(mocks.TxnSigner) - signer.On("GetSignerUID").Return(uid) + signer.On("GetSignerUID").Return(uid, nil) attachErr := AttachSignService(signer) require.Nil(t, attachErr) defer RemoveSignService(uid) // nolint gosec diff --git a/src/util/signutil/sign.go b/src/util/signutil/sign.go index bc8d1490..81db636e 100644 --- a/src/util/signutil/sign.go +++ b/src/util/signutil/sign.go @@ -12,7 +12,7 @@ func NewTxnSignerIteratorFromMap(signers map[core.UID]core.TxnSigner) core.TxnSi } return &DefaultTxnSignerIterator{ signers: signersSlice, - nextIdx: 0, + nextIdx: -1, } } @@ -26,7 +26,7 @@ func FilterSignersFromMap(signers map[core.UID]core.TxnSigner, cond func(core.Tx } return &DefaultTxnSignerIterator{ signers: signersSlice, - nextIdx: 0, + nextIdx: -1, } } @@ -38,21 +38,21 @@ type DefaultTxnSignerIterator struct { // Value of signer at iterator pointer position func (sm *DefaultTxnSignerIterator) Value() core.TxnSigner { - if sm.HasNext() { - return sm.signers[sm.nextIdx] - } - return nil + return sm.signers[sm.nextIdx] } // Next discards current value and moves iteration pointer up to next item func (sm *DefaultTxnSignerIterator) Next() bool { - sm.nextIdx++ - return sm.HasNext() + if sm.HasNext() { + sm.nextIdx++ + return true + } + return false } // HasNext may be used to query whether more items are to be expected in the sequence func (sm *DefaultTxnSignerIterator) HasNext() bool { - return sm.nextIdx < len(sm.signers) + return sm.nextIdx + 1 < len(sm.signers) } // Count total number of items in sequence diff --git a/test/integration/util/hardware-wallet.go b/test/integration/util/hardware-wallet.go new file mode 100644 index 00000000..645b120a --- /dev/null +++ b/test/integration/util/hardware-wallet.go @@ -0,0 +1,23 @@ +package util + +import ( + "github.com/fibercrypto/skywallet-go/src/skywallet" + messages "github.com/fibercrypto/skywallet-protob/go" + "github.com/stretchr/testify/require" + "testing" +) + +func forceWipe(t *testing.T, dev skywallet.Devicer) { + err := dev.SetAutoPressButton(true, skywallet.ButtonRight) + require.NoError(t, err) + msg, err := dev.Wipe() + require.NoError(t, err) + require.Equal(t, uint16(messages.MessageType_MessageType_Success), msg.Kind) +} + +func ForceSetMnemonic(t *testing.T, dev skywallet.Devicer, mnemonic string) { + forceWipe(t, dev) + msg, err := dev.SetMnemonic(mnemonic) + require.NoError(t, err) + require.Equal(t, uint16(messages.MessageType_MessageType_Success), msg.Kind) +} diff --git a/vendor/github.com/NYTimes/gziphandler/.gitignore b/vendor/github.com/NYTimes/gziphandler/.gitignore deleted file mode 100644 index 1377554e..00000000 --- a/vendor/github.com/NYTimes/gziphandler/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.swp diff --git a/vendor/github.com/NYTimes/gziphandler/.travis.yml b/vendor/github.com/NYTimes/gziphandler/.travis.yml deleted file mode 100644 index 94dfae36..00000000 --- a/vendor/github.com/NYTimes/gziphandler/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: go -go: - - 1.x - - tip -env: - - GO111MODULE=on -install: - - go mod download -script: - - go test -race -v diff --git a/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md b/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md deleted file mode 100644 index cdbca194..00000000 --- a/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -layout: code-of-conduct -version: v1.0 ---- - -This code of conduct outlines our expectations for participants within the **NYTimes/gziphandler** community, as well as steps to reporting unacceptable behavior. We are committed to providing a welcoming and inspiring community for all and expect our code of conduct to be honored. Anyone who violates this code of conduct may be banned from the community. - -Our open source community strives to: - -* **Be friendly and patient.** -* **Be welcoming**: We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability. -* **Be considerate**: Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language. -* **Be respectful**: Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one. -* **Be careful in the words that we choose**: we are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. -* **Try to understand why we disagree**: Disagreements, both social and technical, happen all the time. It is important that we resolve disagreements and differing views constructively. Remember that we’re different. The strength of our community comes from its diversity, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes. - -## Definitions - -Harassment includes, but is not limited to: - -- Offensive comments related to gender, gender identity and expression, sexual orientation, disability, mental illness, neuro(a)typicality, physical appearance, body size, race, age, regional discrimination, political or religious affiliation -- Unwelcome comments regarding a person’s lifestyle choices and practices, including those related to food, health, parenting, drugs, and employment -- Deliberate misgendering. This includes deadnaming or persistently using a pronoun that does not correctly reflect a person's gender identity. You must address people by the name they give you when not addressing them by their username or handle -- Physical contact and simulated physical contact (eg, textual descriptions like “*hug*†or “*backrub*â€) without consent or after a request to stop -- Threats of violence, both physical and psychological -- Incitement of violence towards any individual, including encouraging a person to commit suicide or to engage in self-harm -- Deliberate intimidation -- Stalking or following -- Harassing photography or recording, including logging online activity for harassment purposes -- Sustained disruption of discussion -- Unwelcome sexual attention, including gratuitous or off-topic sexual images or behaviour -- Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others -- Continued one-on-one communication after requests to cease -- Deliberate “outing†of any aspect of a person’s identity without their consent except as necessary to protect others from intentional abuse -- Publication of non-harassing private communication - -Our open source community prioritizes marginalized people’s safety over privileged people’s comfort. We will not act on complaints regarding: - -- ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’ -- Reasonable communication of boundaries, such as “leave me alone,†“go away,†or “I’m not discussing this with you†-- Refusal to explain or debate social justice concepts -- Communicating in a ‘tone’ you don’t find congenial -- Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions - - -### Diversity Statement - -We encourage everyone to participate and are committed to building a community for all. Although we will fail at times, we seek to treat everyone both as fairly and equally as possible. Whenever a participant has made a mistake, we expect them to take responsibility for it. If someone has been harmed or offended, it is our responsibility to listen carefully and respectfully, and do our best to right the wrong. - -Although this list cannot be exhaustive, we explicitly honor diversity in age, gender, gender identity or expression, culture, ethnicity, language, national origin, political beliefs, profession, race, religion, sexual orientation, socioeconomic status, and technical ability. We will not tolerate discrimination based on any of the protected -characteristics above, including participants with disabilities. - -### Reporting Issues - -If you experience or witness unacceptable behavior—or have any other concerns—please report it by contacting us via **code@nytimes.com**. All reports will be handled with discretion. In your report please include: - -- Your contact information. -- Names (real, nicknames, or pseudonyms) of any individuals involved. If there are additional witnesses, please -include them as well. Your account of what occurred, and if you believe the incident is ongoing. If there is a publicly available record (e.g. a mailing list archive or a public IRC logger), please include a link. -- Any additional information that may be helpful. - -After filing a report, a representative will contact you personally, review the incident, follow up with any additional questions, and make a decision as to how to respond. If the person who is harassing you is part of the response team, they will recuse themselves from handling your incident. If the complaint originates from a member of the response team, it will be handled by a different member of the response team. We will respect confidentiality requests for the purpose of protecting victims of abuse. - -### Attribution & Acknowledgements - -We all stand on the shoulders of giants across many open source communities. We'd like to thank the communities and projects that established code of conducts and diversity statements as our inspiration: - -* [Django](https://www.djangoproject.com/conduct/reporting/) -* [Python](https://www.python.org/community/diversity/) -* [Ubuntu](http://www.ubuntu.com/about/about-ubuntu/conduct) -* [Contributor Covenant](http://contributor-covenant.org/) -* [Geek Feminism](http://geekfeminism.org/about/code-of-conduct/) -* [Citizen Code of Conduct](http://citizencodeofconduct.org/) - -This Code of Conduct was based on https://github.com/todogroup/opencodeofconduct diff --git a/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md b/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md deleted file mode 100644 index b89a9eb4..00000000 --- a/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md +++ /dev/null @@ -1,30 +0,0 @@ -# Contributing to NYTimes/gziphandler - -This is an open source project started by handful of developers at The New York Times and open to the entire Go community. - -We really appreciate your help! - -## Filing issues - -When filing an issue, make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -## Contributing code - -Before submitting changes, please follow these guidelines: - -1. Check the open issues and pull requests for existing discussions. -2. Open an issue to discuss a new feature. -3. Write tests. -4. Make sure code follows the ['Go Code Review Comments'](https://github.com/golang/go/wiki/CodeReviewComments). -5. Make sure your changes pass `go test`. -6. Make sure the entire test suite passes locally and on Travis CI. -7. Open a Pull Request. -8. [Squash your commits](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) after receiving feedback and add a [great commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). - -Unless otherwise noted, the gziphandler source files are distributed under the Apache 2.0-style license found in the LICENSE.md file. diff --git a/vendor/github.com/NYTimes/gziphandler/README.md b/vendor/github.com/NYTimes/gziphandler/README.md deleted file mode 100644 index 6259acac..00000000 --- a/vendor/github.com/NYTimes/gziphandler/README.md +++ /dev/null @@ -1,56 +0,0 @@ -Gzip Handler -============ - -This is a tiny Go package which wraps HTTP handlers to transparently gzip the -response body, for clients which support it. Although it's usually simpler to -leave that to a reverse proxy (like nginx or Varnish), this package is useful -when that's undesirable. - -## Install -```bash -go get -u github.com/NYTimes/gziphandler -``` - -## Usage - -Call `GzipHandler` with any handler (an object which implements the -`http.Handler` interface), and it'll return a new handler which gzips the -response. For example: - -```go -package main - -import ( - "io" - "net/http" - "github.com/NYTimes/gziphandler" -) - -func main() { - withoutGz := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "text/plain") - io.WriteString(w, "Hello, World") - }) - - withGz := gziphandler.GzipHandler(withoutGz) - - http.Handle("/", withGz) - http.ListenAndServe("0.0.0.0:8000", nil) -} -``` - - -## Documentation - -The docs can be found at [godoc.org][docs], as usual. - - -## License - -[Apache 2.0][license]. - - - - -[docs]: https://godoc.org/github.com/NYTimes/gziphandler -[license]: https://github.com/NYTimes/gziphandler/blob/master/LICENSE diff --git a/vendor/github.com/NYTimes/gziphandler/go.mod b/vendor/github.com/NYTimes/gziphandler/go.mod deleted file mode 100644 index 80190127..00000000 --- a/vendor/github.com/NYTimes/gziphandler/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/NYTimes/gziphandler - -go 1.11 - -require github.com/stretchr/testify v1.3.0 diff --git a/vendor/github.com/NYTimes/gziphandler/go.sum b/vendor/github.com/NYTimes/gziphandler/go.sum deleted file mode 100644 index 4347755a..00000000 --- a/vendor/github.com/NYTimes/gziphandler/go.sum +++ /dev/null @@ -1,7 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/SkycoinProject/skycoin b/vendor/github.com/SkycoinProject/skycoin deleted file mode 160000 index 66f5df58..00000000 --- a/vendor/github.com/SkycoinProject/skycoin +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 66f5df5849d339d403a475d523ebe7d1a4c92c31 diff --git a/vendor/github.com/SkycoinProject/skycoin/.dockerignore b/vendor/github.com/SkycoinProject/skycoin/.dockerignore new file mode 100644 index 00000000..fbb5916a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.dockerignore @@ -0,0 +1,32 @@ +.DS_Store +.DS_Store? +._* +.Trashes +.vscode +.github +.dockerignore +.editorconfig +.gitignore +.golangci.yml +.travis.yml + +*.md +*.asc +*.class +*.dll +*.exe +*.o +*.so + + +Makefile +run-client.sh +run-daemon.sh +Gopkg.lock +Gopkg.toml + +**/node_modules/* +**/electron/* +**/ci-scripts/* +**/coverage/* + diff --git a/vendor/github.com/SkycoinProject/skycoin/.editorconfig b/vendor/github.com/SkycoinProject/skycoin/.editorconfig new file mode 100644 index 00000000..c48ee691 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.editorconfig @@ -0,0 +1,32 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# Use 4 spaces for the Python files +[*.py] +indent_size = 4 +max_line_length = 80 + +# The JSON files contain newlines inconsistently +[*.json] +insert_final_newline = ignore + +# Minified JavaScript files shouldn't be changed +[**.min.js] +indent_style = ignore +insert_final_newline = ignore + +# Makefiles always use tabs for indentation +[Makefile] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + diff --git a/vendor/github.com/SkycoinProject/skycoin/.github/pull_request_template.md b/vendor/github.com/SkycoinProject/skycoin/.github/pull_request_template.md new file mode 100644 index 00000000..e9e1808e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.github/pull_request_template.md @@ -0,0 +1,6 @@ +Fixes # + +Changes: +- + +Does this change need to mentioned in CHANGELOG.md? diff --git a/vendor/github.com/SkycoinProject/skycoin/.gitignore b/vendor/github.com/SkycoinProject/skycoin/.gitignore new file mode 100644 index 00000000..8bf4d113 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.gitignore @@ -0,0 +1,160 @@ +# Compiled source # +################### +*.class +*.dll +*.exe +*.o +*.so + +sb + +build +data +pkg +bin +_obj + +main + +test_node + +*~ +client + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +Icon? +ehthumbs.db +Thumbs.db + +*.pyx +#build +*~ + +*.orig + +.cache +release +.bin + +.skycoin + +*.prof +*.out + +# Binaries +/skycoind +/skycoin +/skycoindev +/blockchain +/generate_cert +/address_gen +/skycoin-integration + +*.pem + +# Deprecated +_deprecated/ + +blockchain.bin +blockchain.sigs +master.keys +*.bak +benefactor-wallet.json +masterdata/ +.genv + +src/gui/static/dev +src/mesh/gui/static/dev + +npm-debug.log + +node_modules + +electron/release +electron/.cache +electron/.electron_cache +electron/node_modules +electron/.gox_output +electron/.electron_output +electron/.standalone_output +electron/.daemon_output +electron/.cli_output +# Do not ignore the icons folder +!electron/build +!electron/build/icons + +.vscode/ + +#File generation sublime text +.do.cfg +.do.state +skycoin.do + +*.swo +*.swp + +src/mesh/TODO + +.idea/ + +*.iml +*.test +coverage.html +coverage/ +*.coverage.out + +src/api/integration/wallets/ +src/api/integration/wallets/ + +# FIXME: see #1027 - Temporary solution to deal with generated file +include/libskycoin.h + +# Eclipse temp files +.cproject +.metadata/** +.project + +# Generated docs +docs/libc/latex +docs/libc/man +docs/libc/xml + + +# Do not ignore Docker Cloud build +!hooks/build + +*.prof +*.profile +*.cpuprofile +*.memprofile + +# cli fiberAddressGen default output +addresses.txt +seeds.csv + +histogram diff --git a/vendor/github.com/SkycoinProject/skycoin/.golangci.yml b/vendor/github.com/SkycoinProject/skycoin/.golangci.yml new file mode 100644 index 00000000..6ddd02f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.golangci.yml @@ -0,0 +1,204 @@ +# This file contains all available configuration options +# Modified for linting cmd/ and src/ + +# options for analysis running +run: + # default concurrency is a available CPU number + concurrency: 4 + + # timeout for analysis, e.g. 30s, 5m, default is 1m + deadline: 3m + + # exit code when at least one issue was found, default is 1 + issues-exit-code: 1 + + # include test files or not, default is true + tests: true + + # list of build tags, all linters use it. Default is empty list. + build-tags: + + # which dirs to skip: they won't be analyzed; + # can use regexp here: generated.*, regexp is applied on full path; + # default value is empty list, but next dirs are always skipped independently + # from this option's value: + # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + skip-dirs: + + # which files to skip: they will be analyzed, but issues from them + # won't be reported. Default value is empty list, but there is + # no need to include all autogenerated files, we confidently recognize + # autogenerated files. If it's not please let us know. + skip-files: + + +# output configuration options +output: + # colored-line-number|line-number|json|tab|checkstyle, default is "colored-line-number" + format: colored-line-number + + # print lines of code with issue, default is true + print-issued-lines: true + + # print linter name in the end of issue text, default is true + print-linter-name: true + + +# all available settings of specific linters +linters-settings: + errcheck: + # report about not checking of errors in type assetions: `a := b.(MyStruct)`; + # default is false: such cases aren't reported by default. + check-type-assertions: false + + # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; + # default is false: such cases aren't reported by default. + check-blank: true + govet: + # report about shadowed variables + check-shadowing: true + + # Obtain type information from installed (to $GOPATH/pkg) package files: + # golangci-lint will execute `go install -i` and `go test -i` for analyzed packages + # before analyzing them. + # By default this option is disabled and govet gets type information by loader from source code. + # Loading from source code is slow, but it's done only once for all linters. + # Go-installing of packages first time is much slower than loading them from source code, + # therefore this option is disabled by default. + # But repeated installation is fast in go >= 1.10 because of build caching. + # Enable this option only if all conditions are met: + # 1. you use only "fast" linters (--fast e.g.): no program loading occurs + # 2. you use go >= 1.10 + # 3. you do repeated runs (false for CI) or cache $GOPATH/pkg or `go env GOCACHE` dir in CI. + use-installed-packages: false + golint: + # minimal confidence for issues, default is 0.8 + min-confidence: 0.8 + gofmt: + # simplify code: gofmt with `-s` option, true by default + simplify: true + gocyclo: + # minimal code complexity to report, 30 by default (but we recommend 10-20) + min-complexity: 10 + maligned: + # print struct with more effective memory layout or not, false by default + suggest-new: true + dupl: + # tokens count to trigger issue, 150 by default + threshold: 100 + goconst: + # minimal length of string constant, 3 by default + min-len: 3 + # minimal occurrences count to trigger, 3 by default + min-occurrences: 3 + depguard: + list-type: blacklist + include-go-root: false + packages: + - github.com/pkg/errors + misspell: + # Correct spellings using locale preferences for US or UK. + # Default is to use a neutral variety of English. + # Setting locale to US will correct the British spelling of 'colour' to 'color'. + locale: US + lll: + # max line length, lines longer will be reported. Default is 120. + # '\t' is counted as 1 character by default, and can be changed with the tab-width option + line-length: 120 + # tab width in spaces. Default to 1. + tab-width: 1 + unused: + # treat code as a program (not a library) and report unused exported identifiers; default is false. + # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find funcs usages. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + unparam: + # call graph construction algorithm (cha, rta). In general, use cha for libraries, + # and rta for programs with main packages. Default is cha. + algo: cha + + # Inspect exported functions, default is false. Set to true if no external program/library imports your code. + # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find external interfaces. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + nakedret: + # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 + max-func-lines: 30 + prealloc: + # XXX: we don't recommend using this linter before doing performance profiling. + # For most programs usage of prealloc will be a premature optimization. + + # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. + # True by default. + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + goimports: + local-prefixes: github.com/SkycoinProject/skycoin + + +linters: + enable: + - golint + - goimports + - varcheck + - unparam + - deadcode + - structcheck + - errcheck + - gosimple + - staticcheck + - unused + - ineffassign + - typecheck + - gosec + - megacheck + - misspell + - nakedret + - depguard + enable-all: false + disable: + disable-all: true + presets: + fast: false + + +issues: + # List of regexps of issue texts to exclude, empty list by default. + # But independently from this option we use default exclude patterns, + # it can be disabled by `exclude-use-default: false`. To list all + # excluded by default patterns execute `golangci-lint run --help` + exclude: + - "G304: Potential file inclusion via variable" + - "G204: Subprocess launched with variable" + - "G104: Errors unhandled" + - Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked + # unparam warns that return value is always nil for functions that have an obligatory error return value but cannot produce an error + - .*result 0 \(error\) is always nil + + exclude-rules: + - path: src/cipher/bip39/wordlists/ + linters: + - misspell + + # Independently from option `exclude` we use default exclude patterns, + # it can be disabled by this option. To list all + # excluded by default patterns execute `golangci-lint run --help`. + # Default value for this option is true. + exclude-use-default: false + + # Maximum issues count per one linter. Set to 0 to disable. Default is 50. + max-per-linter: 0 + + # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. + max-same: 0 + + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing + # large codebase. It's not practical to fix all existing issues at the moment + # of integration: much better don't allow issues in new code. + # Default is false. + new: false diff --git a/vendor/github.com/SkycoinProject/skycoin/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/.travis.yml new file mode 100644 index 00000000..b88f8f42 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.travis.yml @@ -0,0 +1,87 @@ +sudo: required +dist: xenial +language: go +go: + - "1.11.x" + +matrix: + include: + - os: linux + env: VERSION_UPGRADE_TEST_WAIT_TIMEOUT=45s + services: + - xvfb + - os: osx + # Do not start osx build for PR + if: type != pull_request + osx_image: xcode8 + env: VERSION_UPGRADE_TEST_WAIT_TIMEOUT=60s + - os: windows + # Do not start windows build for PR + if: type != pull_request + env: + - GOX_OUTPUT='.gox_output' + +env: + global: + - ELECTRON_CACHE: $HOME/.cache/electron + - ELECTRON_BUILDER_CACHE: $HOME/.cache/electron-builder + - BUILD_DIR: build + - BUILDLIB_DIR: $BUILD_DIR/libskycoin + - LIB_DIR: lib + - BUILD_UI_TRAVIS_DIR: $HOME/.skycoin-ui-travis + +cache: + directories: + - electron/node_modules + - electron/src/node_modules + - $HOME/.cache/electron + - $HOME/.cache/electron-builder + - $HOME/.npm/_prebuilds +# - src/gui/static/node_modules + +addons: + chrome: stable + +before_install: + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test && sudo apt-get update -qq; fi + +install: + # Install gox + - go get github.com/mitchellh/gox + # Install dependences for building wallet + - if [[ "$TRAVIS_OS_NAME" == "linux" && "$TRAVIS_PULL_REQUEST" == false ]]; then sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils libudev-dev libusb-1.0-0-dev; fi + - if [[ ! -d $GOPATH/src/github.com/SkycoinProject/skycoin ]]; then mkdir -p $GOPATH/src/github.com/SkycoinProject; ln -s $TRAVIS_BUILD_DIR $GOPATH/src/github.com/SkycoinProject/skycoin; fi + - cd $GOPATH/src/github.com/SkycoinProject/skycoin + - if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then nvm install 8.11.0 && nvm use 8.11.0; fi + - if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then make install-linters && make install-deps-ui; fi + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then ./ci-scripts/install-nodejs-win.sh; fi + +before_script: + - if [[ "$TRAVIS_OS_NAME" == "osx" ]] && [[ "$TRAVIS_BRANCH" =~ ^(master|develop)$ || -n "$TRAVIS_TAG" ]]; then ./ci-scripts/add-key.sh; fi + # Source the ~/.bashrc to update the PATH for windows + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then source $HOME/.bashrc; fi + +script: + - if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then ./ci-scripts/lint-and-test.sh; fi + - if [[ "$TRAVIS_PULL_REQUEST" == false ]] && [[ "$TRAVIS_BRANCH" =~ ^(master|develop)$ || -n "$TRAVIS_TAG" ]]; then ./ci-scripts/build-wallet.sh; fi + +deploy: + provider: s3 + access_key_id: $AWS_ACCESS_KEY_ID + secret_access_key: $AWS_SECRET_ACCESS_KEY + bucket: $AWS_BUCKET + skip_cleanup: true + local_dir: electron/release + upload-dir: wallet + acl: public_read + region: $AWS_REGION + edge: true # opt in to dpl v2 + on: + repo: SkycoinProject/skycoin + tags: true + +notifications: + email: + - travis@skycoin.com + # https://github.com/kvld/travisci-telegram TravisCI Telegram Bot integration + webhooks: https://fathomless-fjord-24024.herokuapp.com/notify diff --git a/vendor/github.com/SkycoinProject/skycoin/CHANGELOG.md b/vendor/github.com/SkycoinProject/skycoin/CHANGELOG.md new file mode 100644 index 00000000..11c80c60 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/CHANGELOG.md @@ -0,0 +1,581 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [0.27.0] - 2019-11-26 + +### Added + +- Add `createRawTransactionV2` CLI command, which calls the API of `/wallet/transaction` to create the transaction and can create then unsigned transaction. Once the API's performance issue has been fixed, we will replace the `createRawTransaction` with it. +- Add `signTransaction` CLI command to sign transaction. +- Do windows electron builds by travis and abandon the appveyor +- Migrate `skycoin.net` to `skycoin.com` +- Migrate project path to `SkycoinProject/skycoin` +- Use transaction history when scanning wallet addresses, instead of the current address balance +- Document the daemon's CLI options +- Add the ability to save transaction notes +- Add CLI `encodeJsonTransaction` command to retrieve raw transaction given its JSON representation +- Add `package bip44`, implementing the bip44 spec https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki +- Codesign daemon and standalone binaries +- Add a guided method for entering the seeds in the GUI +- Add new wallet type `collection` for wallets that are an arbitrary collection of private keys, rather than generated from a seed +- Add new wallet type `bip44` for hierarchical deterministic (HD) wallets obeying the bip44 protocol. + The Skycoin bip44 `coin` number is `8000`. + `bip44` wallets avoid address reuse, generating a new change address for each transaction. + Affects APIs are `POST /api/v1/wallet`, `GET /api/v1/wallets`, `GET /api/v1/wallet`, `POST /api/v1/wallet/seed` and `POST /api/v1/wallet/recover`. + Refer to the [API documentation](./src/api/README.md) for API changes. + `bip44` wallets support bip39 "seed passphrases". + More details are explained in https://github.com/skycoin/skycoin/wiki/Wallet-File-Formats-and-Types +- `cli walletCreate` support for `bip44` wallets added +- Add `bip44_coin` field to `GET /api/v1/health` `fiber` params +- Add the "bulk send" option to the GUI advanced form +- Add `cli walletKeyExport` command to export `xpub`, `xprv`, `pub` and `prv` key from a `bip44` wallet +- Add `xpub` type wallet, which can generate addresses without exposing private keys +- Add `block_publisher` flag to `/api/v1/health` +- Add `no_broadcast` option to `POST /api/v1/injectTransaction` to disable broadcast of the transaction. The transaction will only be added to the local pool. +- Add `cli distributeGenesis` command to split the genesis block into distribution addresses when setting up a new fiber coin + +### Fixed + +- #7, #162, corrupted file in ~/.skycoin/data/ dir makes the desktop wallet show ERROR #1. +- #87, can not run web gui from skycoin docker image. +- #2287 A `Content-Type` with a `charset` specified, for example `application/json; charset=utf-8`, will not return an HTTP 415 error anymore +- Fix `fiber.toml` transaction verification parameters ignored by newcoin +- #2373 Fix and clean-up further panics with various `skycoin-cli` commands (lastBlocks, checkdb) which were not correctly handling arguments. +- #2442 Reset the "trusted" flag to false for all peers on load, before registering default hardcoded peers in the peerlist +- #26 Add additional database corruption checks in ResetCorruptDB to detect encoder ErrBufferUnderflow and ErrMaxLenExceeded + +### Changed + +- `type` is now a required parameter for `POST /api/v1/wallet`. `type` can be `deterministic`, `bip44` or `xpub`. +- Add `display_name`, `ticker`, `coin_hours_display_name`, `coin_hours_display_name_singular`, `coin_hours_ticker`, `explorer_url` to the `/health` endpoint response +- `cli addPrivateKey` will only work on a `collection` type wallet. Create one with `cli walletCreate -t collection` +- Don't print the wallet in the terminal after `cli encryptWallet` or `cli decryptWallet` +- Remove `WALLET_DIR` and `WALLET_NAME` envvars from the `cli` tool. Commands which need to operate on a wallet file accept the wallet file on the command line instead. +- Now the modal window for showing QR codes in the GUI allows to request specific amounts of coins, as in mobile wallets. This changes did no include the ability to read QR codes or URLs. + +### Removed + +- Remove `-arbitrating` option from the daemon CLI options +- Remove `-print-web-interface-address` option from the daemon CLI options +- Remove `cli walletDir` command + +## [0.26.0] - 2019-05-21 + +### Added + +- When sending coins in the UI, the user can choose to send in SKY, or the equivalent amount of SKY in USD +- Add the option for changing the language of the GUI. +- Add Spanish and Simplified Chinese language options +- Add genesis block hash in `INTR` message +- Add `bip32` package for preliminary HD wallet support +- Add CLI `checkDBDecoding` command to verify the `skyencoder`-generated binary decoders match the reflect-based decoder +- Add CLI `addresscount` command to return the count of addresses that currently have unspent outputs (coins) associated with them. +- Add `-max-inc-msg-len` and `-max-out-msg-len` options to control the size of incoming and outgoing wire messages +- Add `-disable-header-check` flag to disable Host/Origin/Referer header checks for the node APIs +- Add `header_check_enabled` parameter in the `/health` endpoint response +- Add `unsigned` option to `POST /api/v1/wallet/transaction` to create unsigned transactions from a wallet +- Add `unsigned` option to `POST /api/v2/transaction/verify` for verifying an unsigned transaction +- Add `POST /api/v2/wallet/transaction/sign` to sign an unsigned transaction with a wallet +- Add `POST /api/v2/transaction` to create an unsigned transaction from addresses or unspent outputs without a wallet +- Add `/api/v2/data` APIs for transaction notes and generic key-value storage. +- Update `/metrics` endpoint to add metrics from `/health`: `unspent_outputs`, `unconfirmed_txns`, `time_since_last_block_seconds`, `open_connections`, `outgoing_connections`, `incoming_connections`, `start_at`, `uptime_seconds`, `last_block_seq`. +- Add to the GUI the ability to choose specific unspent outputs to spend + +### Fixed + +- Return a v2-style error for disabled API endpoints +- #2172 Fix electron build failure for linux systems +- Don't send wire protocol messages that exceed the configured 256kB limit, which caused peers to disconnect from the sender +- #2348 Fix panic in `skycoin-cli` `transaction` command if no (zero) arguments are passed. Exactly one argument is expected. + +### Changed + +- Duplicate wallets in the wallets folder will prevent the application from starting +- An empty wallet in the wallets folder will prevent the application from starting +- Use [`skyencoder`](https://github.com/skycoin/skyencoder)-generated binary encoders/decoders for network and database data, instead of the reflect-based encoders/decoders in `cipher/encoder`. +- Add `/api/v1/resendUnconfirmedTxns` to the `WALLET` API set +- In `POST /api/v1/wallet/transaction`, moved `wallet` parameters to the top level of the object +- Incoming wire message size limit increased to 1024kB +- Clients restrict the maximum number of blocks they will send in a `GiveBlocksMessage` to 20 +- `POST /api/v2/wallet/seed/verify` returns an error if the seed's checksum is invalid +- Increase the detail of error messages for invalid seeds sent to `POST /api/v2/wallet/seed/verify` +- Move package `github.com/skycoin/skycoin/src/cipher/go-bip39` to `github.com/skycoin/skycoin/src/cipher/bip39` +- The `Content-Security-Policy` header was modified to make it stricter +- Update `INTR` message verify logic to reject connection if blockchain pubkey not matched or provided +- Change the coinhour burn rate to 10% + +### Removed + +- `/api/v1/explorer/address` endpoint (use `GET /api/v1/transactions?verbose=1` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-explorer-address +- The unversioned REST API (the `-enable-unversioned-api` is removed, prefix your API requests with `/api/v1` if they don't have an `/api/vx` prefix already). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-unversioned-api +- JSON-RPC 2.0 interface (this is no longer used by the CLI tool, and the REST API supports everything the JSON-RPC 2.0 API does). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-jsonrpc-api +- `/api/v1/wallet/spend` endpoint (use `POST /api/v1/wallet/transaction` followed by `POST /api/v1/injectTransaction` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-spend +- Remove shell autocomplete files + +## [0.25.1] - 2019-02-08 + +### Added + +- Add CLI `addressTransactions` command +- Add `/api/v2/wallet/seed/verify` to verify if seed is a valid bip39 mnemonic seed +- Filter transactions in the History view in the UI + +### Fixed + +- `/api/v1/health` will return correct build info when running Docker containers based on `skycoin/skycoin` mainnet image. +- #2083, Windows desktop wallet sometimes shows "Error#1" on start + +### Changed + +- Extend URI specification to allow plain addresses (i.e. without a `skycoin:` prefix) +- Switch `skycoin-cli` from `urfave/cli` to `spf13/cobra`. + Now all options of a cli command must only use `--` prefix instead of a mix of `--` and `-` prefixes. + `-` prefix is only allowed when using shorthand notation. +- Use an optimized `base58` library for faster address decoding and encoding. +- `/api/v1/injectTransaction` will return 400 error for invalid transactions. + +### Removed + +- Remove libskycoin source code. Migrated to https://github.com/skycoin/libskycoin + +## [0.25.0] - 2018-12-19 + +### Upcoming deprecated method removal notice + +In the v0.26.0 these features and functions will be removed. If you have a need for any of these features, let us know. + +- JSON-RPC 2.0 interface (this is no longer used by the CLI tool, and the REST API supports everything the JSON-RPC 2.0 API does). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-jsonrpc-api +- `/api/v1/wallet/spend` endpoint (use `POST /api/v1/wallet/transaction` followed by `POST /api/v1/injectTransaction` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-spend +- The unversioned REST API (the `-enable-unversioned-api` option will be removed, prefix your API requests with `/api/v1`). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-unversioned-api +- `/api/v1/explorer/address` endpoint (use `GET /api/v1/transactions?verbose=1` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-explorer-address + +### Notice + +Nodes v0.23.0 and earlier will not be able to connect to v0.25.0 due to a change in the introduction packet message. + +Nodes v0.24.1 and earlier will not be able to connect to v0.26.0 due to a similar change. + +Make sure to upgrade to v0.25.0 so that your node will continue to connect once v0.26.0 is released. + +### Added + +- Add `-csv` option to `cli send` and `cli createRawTransaction`, which will send coins to multiple addresses defined in a csv file +- Add `-disable-default-peers` option to disable the default hardcoded peers and mark all cached peers as untrusted +- Add `-custom-peers-file` to load peers from disk. This peers file is a newline separate list of `ip:port` strings +- Add `user_agent`, `coin`, `csrf_enabled`, `csp_enabled`, `wallet_api_enabled`, `unversioned_api_enabled`, `gui_enabled` and `json_rpc_enabled`, `coinhour_burn_factor` configuration settings and `started_at` timestamp to the `/api/v1/health` endpoint response +- Add `verbose` flag to `/api/v1/block`, `/api/v1/blocks`, `/api/v1/last_blocks`, `/api/v1/pendingTxs`, `/api/v1/transaction`, `/api/v1/transactions`, `/api/v1/wallet/transactions` to return verbose block data, which includes the address, coins, hours and calculcated_hours of the block's transaction's inputs +- Add `encoded` flag to `/api/v1/transaction` to return an encoded transaction +- Add `-http-prof-host` option to choose the HTTP profiler's bind hostname (defaults to `localhost:6060`) +- Add `-enable-api-sets`, `-disable-api-sets`, `-enable-all-api-sets` options to choose which sets of API endpoints to enable. Options are `READ`, `STATUS`, `TXN`, `WALLET`, `PROMETHEUS`, `INSECURE_WALLET_SEED`, `DEPRECATED_WALLET_SPEND`. Multiple values must be comma separated. +- `/api/v1/wallet/spend` is deprecated and requires `-enable-api-set=DEPRECATED_WALLET_SPEND` to enable it. Use `/api/v1/wallet/transaction` and `/api/v1/injectTransaction` instead. +- Add `-host-whitelist` option to specify alternate allowed hosts when communicating with the API bound to a localhost interface +- Add the head block header to the response of `GET /api/v1/outputs` +- Add `"ux_hash"` to block headers in API responses +- Database verification will only be performed once when upgrading to the next version. Verification will not be performed on subsequent upgrades unless necessary. To force verification, use `-verify-db=true`. Note that it is unsafe to downgrade the skycoin node without erasing the database first. +- Add `seqs` parameter to `/api/v1/blocks` to query multiple blocks by sequences +- Add `/api/v2/wallet/recover` to recover an encrypted wallet by providing the seed +- Add HTTP Basic Auth options `-web-interface-username` and `-web-interface-password`. Auth is only available when using `-web-interface-https` unless `-web-interface-plaintext-auth` is also used. +- Go application metrics exported at `/api/v2/metrics` (API set `PROMETHEUS`) in Prometheus format +- Add `/api/v2/wallet/recover` to recover an encrypted wallet by providing the seed +- Add `fiberAddressGen` CLI command to generate distribution addresses for fiber coins +- Coinhour burn factor when creating transactions can be configured at runtime with `USER_BURN_FACTOR` envvar +- Max transaction size when creating transactions can be configured at runtime with `USER_MAX_TXN_SIZE` envvar +- Max decimals allowed when creating transactions can be configured at runtime with `USER_MAX_DECIMALS` envvar +- Daemon configured builds will be available on the [releases](https://github.com/skycoin/skycoin/releases) page. The builds available for previous versions are configured for desktop client use. +- `skycoin-cli` builds will be available on the [releases](https://github.com/skycoin/skycoin/releases) page. +- A user agent string is sent in the wire protocol's introduction packet +- `-max-connections` option to control total max connections +- `/api/v1/network/disconnect` to disconnect a peer +- Complete support for `cipher` package in `libskycoin` C API. +- Add `coin`, `wallet`, `util/droplet` and `util/fee` methods as part of `libskycoin` C API +- Add `make update-golden-files` to `Makefile` +- Add CLI `richlist` command +- Add `util/droplet` and `util/fee` API's as part of `libskycoin` +- Implement SWIG interfaces in order to generate client libraries for multiple programming languages + +### Fixed + +- Fix hanging process caused when the p2p listener port is already in use +- Fix exit status of CLI tool when wallet file cannot be loaded +- Fix `calculated_hours` and `fee` in `/api/v1/explorer/address` responses +- Fix `calculated_hours` and `fee` in `/api/v2/transaction/verify` responses for confirmed transactions +- `/api/v1/blocks` and `/api/v1/last_blocks` return `500` instead of `400` on database errors +- `POST /api/v1/wallet` returns `500` instead of `400` for internal errors +- Fix unspent output hashes in the `cli decodeRawTransaction` result +- `POST /api/v1/wallet/newAddress` and `POST /api/v1/wallet/spend` will correctly fail if the wallet is not encrypted but a password is provided +- Return `503` error for `/api/v1/injectTransaction` for all message broadcast failures (note that it is still possible for broadcast to fail but no error to be returned, in certain conditions) +- Fixed autogenerated HTTPS certs. Certs are now self-signed ECDSA certs, valid for 10 years, valid for localhost and all public interfaces found on the machine. The default cert and key are renamed from cert.pem, key.pem to skycoind.cert, skycoind.key +- `/api/v1/resendUnconfirmedTxns` will return `503 Service Unavailable` is no connections are available for broadcast +- #1979, Fix header check to allow `localhost:6420` + +### Changed + +- Add blockchain pubkey in introduction message, it would close the connection if the pubkey is not matched, but would accept it if pubkey is not provided. +- CLI tool uses the REST API instead of the deprecated webrpc API to communicate with the node +- `cli status` return value is now the response from `GET /api/v1/health`, which changes some fields +- `/api/v1/network/` endpoints will return an empty array for array values instead of `null` +- `/api/v1/blocks` will return an empty array for `"blocks"` instead of `null` +- `/api/v1/blockchain/progress` will return an empty array for `"peers"` instead of `null` +- `go run cmd/skycoin/skycoin.go` will have exit status 1 on failure and exit status 2 on panic +- The deprecated JSON 2.0 RPC interface is disabled by default for all run modes, since it is no longer needed for the CLI tool +- Remove `"unknown"` from the `"status"` field in responses from `/api/v1/explorer/address`, `/api/v1/transaction`, `/api/v1/transactions` +- `cli decodeRawTransaction` output format changed, see the [CLI README](./src/cli/README.md) +- `/api/v1/wallet/spend` is deprecated, disabled by default and requires `-enable-api-sets=DEPRECATED_WALLET_SPEND` to enable it. Use `/api/v1/wallet/transaction` and `/api/v1/injectTransaction` instead. +- Invalid password in `/api/v1/wallet` requests now return `400` instead of `401` +- Replace `cmd/address_gen/` and `cmd/address_gen2` with `go run cmd/cli/cli.go addressGen` +- `cli addressGen` arguments have changed +- `cli generateWallet` renamed to `cli walletCreate` +- `cli generateAddresses` renamed to `cli walletAddAddresses` +- `/api/v1/explorer/address` is deprecated in favor of `/api/v1/transactions?verbose=1` +- `/api/v1/balance`, `/api/v1/transactions`, `/api/v1/outputs` and `/api/v1/blocks` accept the `POST` method so that large request bodies can be sent to the server, which would not fit in a `GET` query string +- Send new `DISC` disconnect packet to peer before disconnecting +- `/api/v1/health` `"open_connections"` value now includes incoming connections. Added `"outgoing_connections"` and `"incoming_connections"` fields to separate the two. +- `run.sh` is now `run-client.sh` and a new `run-daemon.sh` script is added for running in server daemon mode +- `/api/v1/network/connection*` connection object's field `"introduced"` replaced with field `"state"` which may have the values `"pending"`, `"connected"` or `"introduced"` +- `/api/v1/network/connection*` field `"is_trusted_peer"` added to connection object to indicate if the peer is in the hardcoded list of default peers +- `/api/v1/network/connection*` field `"connected_at"`, `"unconfirmed_burn_factor"` and `"unconfirmed_max_transaction_size"` added to connection object +- `/api/v1/network/connections` now includes incoming connections. Filters are added to query connections by state and direction +- `/api/v1/resendUnconfirmedTxns` is now a `POST` method, previously was a `GET` method +- Transactions that violation soft constraints will propagate through the network +- Node will send more peers before disconnecting due to a full peer list +- Refactor CSRF to use HMAC tokens. +- Add transaction verification parameters to the `GET /health` response + +### Removed + +- Remove `USE_CSRF` envvar from the CLI tool. It uses the REST API client now, which will automatically detect CSRF as needed, so no additional configuration is necessary. Operators may still wish to disable CSRF on their remote node to reduce request overhead. +- Remove `-enable-wallet-api` and `-enable-seed-api` in place of including `WALLET` and `INSECURE_WALLET_SEED` in `-enable-api-sets`. +- Copies of the source code removed from release builds due to build artifact size + +## [0.24.1] - 2018-07-30 + +### Added + +- Add Content-Security-Policy header to http responses + +### Fixed + +- Fix portable browser version opening to blank page + +### Changed + +- Increase visor db timeout to 5000 `ms` +- Change `InitTransaction` to accept parameters for distributing genesis coin to distribution wallets + +### Removed + +## [0.24.0] - 2018-07-06 + +### Added + +- Minimum go version is go1.10 +- Add environment variable `DATA_DIR` in CLI +- `USE_CSRF` environment variable for CLI, if the remote node has CSRF enabled (CSRF is enabled by default, use `-disable-csrf` to disable) +- `cli showConfig` command to echo the cli's configuration back to the user +- Option to generate 12/24 word seed when creating new wallet +- libskycoin 0.0.1 released with bindings for cipher/address, cipher/hash, cipher/crypto, cli/create_rawtx +- Add `-version` flag to show node version +- Add transaction verification step to "Send" page +- Add more details about transaction in transaction history +- Add advanced spend UI +- Add CLI `encryptWallet` command +- Add CLI `decryptWallet` command +- Add CLI `showSeed` command +- Add `password` argument to the CLI commands of `addPrivateKey`, `createRawTransaction`, `generateAddresses`, `generateWallet`, `send` +- Support for decoding map values in cipher binary encoder +- Expose known block height of peer in brand new `height` field added in responses of `GET /api/v1/network/connections` API endpoints +- `-verify-db` option (default true), will verify the database integrity during startup and exit if a problem is found +- `-reset-corrupt-db` option (default false) will verify the database integrity during startup and reset the db if a problem is found +- `GET /explorer/address`: add `fee` to transaction objects and `calculated_hours` to transaction inputs +- Test data generator and test suite for verification of alternative `cipher` implementations +- Begin `/api/v2` API endpoints. These endpoints are in beta and subject to change. +- Add `POST /api/v2/transaction/verify` API endpoint +- Add `POST /api/v2/address/verify` API endpoint +- Add `ignore_unconfirmed` option to `POST /api/v1/wallet/transaction` to allow transactions to be created or spent even if there are unspent outputs in the unconfirmed pool. +- Add `uxouts` to `POST /api/v1/wallet/transaction`, to allow specific unspent outputs to be used in a transaction. +- Add Dockerfile in docker/images/dev-cli to build a docker image suitable for development. +- Coin creator tool, `cmd/newcoin`, to quickly bootstrap a new fiber coin +- Add Dockerfile in `docker/images/dev-dind` to build a docker in docker image based on skycoindev-cli. + +### Fixed + +- Reduce connection disconnects, improves syncing +- Fix #1171, update CLI to support wallet encryption +- Use `bolt.Tx` correctly for read operations +- Docker images for `arm32v5` and `ar32v7` architectures by using busybox as base in docker/images/mainnet/Dockerfile and docker/images/mainnet/hooks/ + +### Changed + +- JSON 2.0 RPC interface (used by the CLI tool) is now served on the same host interface as the REST API, port `6420`. The additional listener has been removed. +- CLI's `RPC_ADDR` environment variable must now start with a scheme e.g. `http://127.0.0.1:6420`, previously it did not use a scheme. +- API response will be gzip compressed if client sends request with 'Accept-Encoding' contains 'gzip' in the header. +- `GET /api/v1/wallet/balance` and `GET /api/v1/balance` now return an address balance list as well. +- API endpoints are prefixed with `/api/v1/`. API endpoints without the `/api/v1/` prefix are deprecated but can be enabled with `-enable-unversioned-api`. Please migrate to use `/api/v1/` prefix in URLs. +- Enable message protocol upgrade +- `change_address` is no longer required in `POST /api/v1/wallet/transaction`. If not provided, `change_address` will default to one of the addresses being spent from. +- In `POST /api/v1/wallet/transaction`, for `auto` type `share` mode requests, if extra coinhours remain after applying the `share_factor` but change cannot be made due to insufficient coins, the `share_factor` will switch to `1.0`. +- Support automatic port allocation of the API interface by specifying port 0 +- The web interface / API port is randomly allocated for the precompiled standalone client and electron client released on the website. + If you are using the CLI tool or another API client to communicate with the standalone client, use `-web-interface-port=6420` to continue using port 6420. + If the program is run from source (e.g. `go run`, `run.sh`, `make run`) there is no change, the API will still be on port 6420. +- Change number of outgoing connections to 8 from 16 +- Transaction history shows transactions between own addresses +- Client will only maintain one connection to the default hardcoded peers, instead of all of them + +### Removed + +- Remove `-rpc-interface-addr`, `-rpc-interface-port` options. The RPC interface is now on default port `6420` with the REST API. +- Remove `-rpc-thread-num` option +- Remove `-connect-to` option +- Remove `-print-web-interface-address` option +- Remove support for go1.9 + +## [0.23.0] - 2018-04-22 + +### Added + +- Add wallet setup wizard +- Add wallet encryption, using chacha20+poly1305 for encryption and authentication and scrypt for key derivation. Encrypted data is stored in the wallet file in a `"secrets"` metadata field +- Add `GET /health` endpoint +- Add `POST /wallet/transaction` API endpoint, creates a transaction, allowing control of spending address and multiple destinations +- Add `POST /wallet/encrypt` API endpoint, encrypts wallet and returns encrypted wallet without sensitive data +- Add `POST /wallet/decrypt` API endpoint, decrypts wallet and returns decrypted wallet without sensitive data +- Add `POST /wallet/seed` API endpoint, returns the seed of an encrypted wallet. Unencrypted wallets will not expose their seeds over the API. Requires `-enable-seed-api` option +- `-enable-seed-api` option to enable `POST /wallet/seed` +- Add `"size"` to block API response data (affects `GET /block`, `GET /blocks` and `GET /last_blocks`) +- Write [specification for skycoin URIs](https://github.com/skycoin/skycoin#uri-specification) (based upon bip21) + +### Fixed + +- #1309, Float imprecision error in frontend malformed some spend amounts, preventing the spend +- Fix one aspect of sync stalling caused by a 5-second blocking channel write by switching it to a non-blocking write, decreasing timeouts and increasing buffer sizes + +### Changed + +- `GET /wallet` API endpoint, remove sensitive data from the response, and fix the data format to be the same as `POST /wallet/create` +- `GET /wallets` API endpoint, remove sensitive data from the response +- `POST /wallet/create` API endpoint, add `encrypt(bool)` and `password` argument +- `POST /wallet/newAddress` API endpoint, add `password` argument +- `POST /wallet/spend` API endpoint, add `password` argument +- Change `-disable-wallet-api` to `-enable-wallet-api`, and disable the wallet API by default +- `-launch-browser` is set to false by default +- A default wallet will not be created on startup if there is no wallet. Instead, the wallet setup wizard will run +- Replace [op/go-logging](https://github.com/op/go-logging) with [logrus](https://github.com/sirupsen/logrus) +- Disable JSON-RPC 2.0 interface when running the application with `run.sh` and electron +- Whitespace will be trimmed from the seed string by the frontend client before creating or loading a wallet +- Notify the user when their wallets have unconfirmed transactions +- Return an error when providing a transaction that spends to the null address in `POST /injectTransaction` +- Change accepted `-log-level` values to `debug`, `info`, `warn`, `error`, `fatal` and `panic` (previously were `debug`, `info`, `notice`, `warning`, `error` and `critical`) +- Default log level is `info` + +### Removed + +- Remove `"seed"`, `"lastSeed"` and `"secret_key"` in address entries from wallet API responses. A wallet's seed can be accessed through `POST /wallet/seed` only if the wallet is encrypted and the node is run with `-enable-seed-api` +- Remove unused `-logtogui` and `-logbufsize` options + +## [0.22.0] - 2018-03-20 + +### Added + +- go1.10 support +- Add Dockerfile +- Add libskycoin C API wrapper +- New wallet UI +- Notify the user when a new version is available +- CLI and GUI integration tests against a stable and live blockchain +- #877, Add `-disable-wallet-api` CLI option +- HTTP API client +- `/richlist` API method, returns top n address balances +- `/addresscount` API method, returns the number of addresses that have any amount of coins +- `/transactions` API method, returns transactions of addresses +- `/wallet/unload` API method, removes the wallet of given id from wallet services + +### Fixed + +- #1021, remove `SendOr404` and `SendOr500` as they do not work properly due to typed nils +- Add Read, Write and Idle timeouts to the HTTP listener, preventing file descriptor leaks +- Support absolute and relative paths for `-data-dir` option +- Prevent creating transactions whose size exceeds the maximum block size +- Check addition and multiplication uint64 overflow +- Keep trusted peers in the peerlist permanently, even if they are unreachable +- #885, Add `Host` header check to localhost HTTP interfaces to prevent DNS rebinding attacks +- #896, Add CSRF check to wallet API +- Fix base58 address parsing, which allowed leading invalid characters and treated unknown characters as a '1' +- Fix occasional error which causes blockchain progress not to be shown in front-end + +### Changed + +- #1080, `/wallet/transactions` now returns a proper json object with pending transactions under `transactions` key +- #951, cap cli createRawTransaction and send command coinhour distribution, coinhours are capped to a maximum of receiving coins for the address with a minimum of 1 coinhour +- Upgrade to Angular 5 +- Add `total_coinhour_supply` and `current_coinhour_supply` to `/coinSupply` endpoint +- #800, Add entropy parameter to `/wallet/newSeed` endpoint. Entropy can be 128 (default) or 256, corresponding to 12- and 24-word seeds respectively +- #866, Include coins and hours in `/explorer/address` inputs +- Rename cached `peers.txt` file to `peers.json` + +### Removed + +- Remove `/lastTxs` API endpoint +- Remove `/logs` and log buffering due to possible crash +- Remove `/wallets/reload` endpoint +- Remove deprecated `/api/getEffectiveOutputs`, use `/coinSupply`. + +## [0.21.1] - 2017-12-14 + +### Fixed + +- Fix blank page issue in windows gui wallet, which was caused by misusing the flag of -download-peers-list in electron. + +## [0.21.0] - 2017-12-10 + +### Added + +- Require transactions to have an input with non-zero coinhours +- Add `-peerlist-size` and `-max-outgoing-connections` CLI options +- Add `-download-peerlist` and `-peerlist-url` CLI options, to get peers from a URL +- For electron clients, download a list of peers from https://downloads.skycoin.com/blockchain/peers.txt by default + +### Fixed + +- Fix change hours calculation. Previous gave 1/8 to change and destination addresses; now gives 1/4 to each +- #653, the peerlist size was too small and could be easily filled up; default changed to 65535 from 1000 + +### Changed + +- CLI's `walletBalance` and `addressBalance` commands return aggregate balances for confirmed, spendable and expected balances. Coins are formatted as droplet strings. Hours added as strings. +- When splitting an odd number of hours in a spend, give the extra hour to the fee +- Add `block_seq` to `get_outputs` and `/outputs` API response +- Improve UxOut spend selection. Previously, they were spent oldest first. Now they are spent to ensure a non-zero coinhour input and otherwise minimize coinhours. +- `create_rawtx` will try to minimize the number of UxOuts used to create a transaction. +- `/wallet/spend` will try to maximize the number of UxOuts used to create a transaction. +- Update the default peerlist size to 65535 from 1000 +- When loading a wallet, 100 addresses will be scanned ahead to find one with a balance + +## [0.20.4] - 2017-11-22 + +### Added + +- Add `/logs` api to filter skycoin logs, so that we can add a debug panel to the GUI wallet to show logs + +## [0.20.3] - 2017-10-23 + +### Fixed + +- Fix block sync stall (mostly affected Windows users, but any OS was potentially affected) + +## [0.20.2] - 2017-10-12 + +### Fixed + +- Fixed Linux .AppImage missing "Category" field +- Clean up electron build script, switch to yarn and remove gulp + +## [0.20.1] - 2017-10-12 + +### Fixed + +- Fixed app icon padding + +## [0.20.0] - 2017-10-10 + +### Added + +- New wallet frontend in angular4. This is a complete rewrite and fixes many of the old wallet issues. +- New wallet has preliminary support for OTC functionality +- Create `webrpc.Client` for JSON-2.0 RPC calls. +- Add this CHANGELOG.md file. +- Add Installation.md file, with install instructions for go. +- Timelock distribution addresses. The first 25% of the distribution is spendable. After that 25% is spent, a timestamp will be added to the code to enable further distribution. +- Add `/coinSupply` endpoint. Correctly returns total, locked and unlocked coin amounts. +- `testutil` package for common test setup methods. +- `/version` endpoint, which will return the current node version number and the HEAD commit id when build the node +- `-no-ping-log` option to disable ping/pong log output +- Check for invalid block signatures during startup and recreate the database if they are corrupted. +- Add methods for converting fixed-point decimal strings to droplets and vice versa. +- Add `make run`, `make test`, `make lint`, `make check` to `Makefile` + +### Changed + +- Flag peers as incoming or outgoing. +- Refactor to decouple `wallet` and `visor` package. +- Refactor `cli` package for use as a library. +- `README` improvements. +- Set default wallet's label as "Your Wallet" +- Use BIP32 mnemomic seeds by default in `address_gen`. +- Add `-x` option to `address_gen`, to generate a random base64-encoded 128-bit seed instead of a BIP32 mnemomic seed. +- Add `-v` option to `address_gen` to print all address information (pubkey, seckey, address, seed) to stdout as JSON. +- All API and CLI methods with "coin"-related arguments must be a string and can use decimal notation to specify coin amounts. +- CLI's `walletHistory` command prints amounts as fixed-point decimal strings. Previously, it printed amounts as integers representing whole skycoin amounts, and did not support droplets / fractional skycoins. +- A user is prevented from broadcasting a new transaction with unspent outputs that they have already sent as an unconfirmed transaction. + +### Deprecated + +- `/api/getEffectiveOutputs` is deprecated in favor of `/coinSupply`. + +### Removed + +- Old wallet +- `/api/create-address` endpoint (use the `address_gen` tool) + +### Fixed + +- Wallet folder path loading. +- #371 Fix `/wallet/spend`, will return only when pending transaction is confirmed. +- #443 Fix predicted balance in `/wallet/spend` API call. +- #444 Fix bug in `/blockchain/progress` API call. +- Removed globals in `gui` package that caused race condition with wallet API calls. +- #494 Clean invalid unconfirmed transactions during startup. +- Various race conditions around the bolt.DB blockchain DB +- Missing `strand()` call in `daemon.Visor.AnnounceTxns`. + +### Security + +## [0.19.1] - 2017-08-26 + +### Fixed + +- #459 dist folder in repo out of date, wallet gui does not load + +## [0.19.0] - 2017-07-11 + +### Added + +- Add synchronize indicator when downloading blocks. +- #352 Store unspent pool in db for quick recovery when node restart +- Speed up the time the node start the browser +- Cache unspent pool in memory to speed up query action +- #411 Add button to hide seed +- #380 Move anything with heavy imports into util sub package + +### Fixed + +- #421 Sort wallet transaction history by time +- #398 Remove seeds from DOM +- #390 Make `go test ./src/...` work +- #383 Error during installation from skycoin source code +- #375 Node can't recovery from zero connections +- #376 Explorer api `/explorer/address` does not return spend transactions +- #373 Block publisher node will be closed if there're no transactions need to execute +- #360 Node will crash when do ctrl+c while downloading blocks +- #350 Wallet name always 'undefined' after loading wallet from seed + +[Unreleased]: https://github.com/skycoin/skycoin/compare/master...develop +[0.26.0]: https://github.com/skycoin/skycoin/compare/v0.25.1...v0.26.0 +[0.25.1]: https://github.com/skycoin/skycoin/compare/v0.25.0...v0.25.1 +[0.25.0]: https://github.com/skycoin/skycoin/compare/v0.24.1...v0.25.0 +[0.24.1]: https://github.com/skycoin/skycoin/compare/v0.24.0...v0.24.1 +[0.24.0]: https://github.com/skycoin/skycoin/compare/v0.23.0...v0.24.0 +[0.23.0]: https://github.com/skycoin/skycoin/compare/v0.22.0...v0.23.0 +[0.22.0]: https://github.com/skycoin/skycoin/compare/v0.21.1...v0.22.0 +[0.21.1]: https://github.com/skycoin/skycoin/compare/v0.21.0...v0.21.1 +[0.21.0]: https://github.com/skycoin/skycoin/compare/v0.20.4...v0.21.0 +[0.20.4]: https://github.com/skycoin/skycoin/compare/v0.20.3...v0.20.4 +[0.20.3]: https://github.com/skycoin/skycoin/compare/v0.20.2...v0.20.3 +[0.20.2]: https://github.com/skycoin/skycoin/compare/v0.20.1...v0.20.2 +[0.20.1]: https://github.com/skycoin/skycoin/compare/v0.20.0...v0.20.1 +[0.20.0]: https://github.com/skycoin/skycoin/compare/v0.19.1...v0.20.0 +[0.19.1]: https://github.com/skycoin/skycoin/compare/v0.19.0...v0.19.1 +[0.19.0]: https://github.com/skycoin/skycoin/commit/dd924e1f2de8fab945e05b3245dbeabf267f2910 diff --git a/vendor/github.com/SkycoinProject/skycoin/Gopkg.lock b/vendor/github.com/SkycoinProject/skycoin/Gopkg.lock new file mode 100644 index 00000000..ea05cca3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/Gopkg.lock @@ -0,0 +1,438 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + digest = "1:0803645e1f57fb5271a6edc7570b9ea59bac2e5de67957075a43f3d74c8dbd97" + name = "github.com/NYTimes/gziphandler" + packages = ["."] + pruneopts = "UT" + revision = "2600fb119af974220d3916a5916d6e31176aac1b" + version = "v1.0.1" + +[[projects]] + branch = "master" + digest = "1:8a50c4460a24ce3cff0f50d094fa086db29119b4a0b58e70b87e922274526804" + name = "github.com/SkycoinProject/encodertest" + packages = ["."] + pruneopts = "UT" + revision = "14c2e31898b98265cc642f54d53f7280998e7208" + +[[projects]] + branch = "master" + digest = "1:86d119ee8a0fb122f2d0e0fbbbd5d2f65953029248743462ee3908a21ae04247" + name = "github.com/andreyvit/diff" + packages = ["."] + pruneopts = "UT" + revision = "c7f18ee00883bfd3b00e0a2bf7607827e0148ad4" + +[[projects]] + branch = "master" + digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" + name = "github.com/beorn7/perks" + packages = ["quantile"] + pruneopts = "UT" + revision = "3a771d992973f24aa725d07868b467d1ddfceafb" + +[[projects]] + digest = "1:705c40022f5c03bf96ffeb6477858d88565064485a513abcd0f11a0911546cb6" + name = "github.com/blang/semver" + packages = ["."] + pruneopts = "UT" + revision = "2ee87856327ba09384cabd113bc6b5d174e9ec0f" + version = "v3.5.1" + +[[projects]] + digest = "1:0f98f59e9a2f4070d66f0c9c39561f68fcd1dc837b22a852d28d0003aebd1b1e" + name = "github.com/boltdb/bolt" + packages = ["."] + pruneopts = "UT" + revision = "2f1ce7a837dcb8da3ec595b1dac9d0632f0f99e8" + version = "v1.3.1" + +[[projects]] + digest = "1:4ba637038f22c9065994c0cd734118fc75e0c744f855fd3edbd3b923d1f41d44" + name = "github.com/cenkalti/backoff" + packages = ["."] + pruneopts = "UT" + revision = "61153c768f31ee5f130071d08fc82b85208528de" + version = "v1.1.0" + +[[projects]] + digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" + name = "github.com/davecgh/go-spew" + packages = ["spew"] + pruneopts = "UT" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" + +[[projects]] + digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" + name = "github.com/fsnotify/fsnotify" + packages = ["."] + pruneopts = "UT" + revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" + version = "v1.4.7" + +[[projects]] + digest = "1:97df918963298c287643883209a2c3f642e6593379f97ab400c2a2e219ab647d" + name = "github.com/golang/protobuf" + packages = ["proto"] + pruneopts = "UT" + revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" + version = "v1.2.0" + +[[projects]] + digest = "1:d2754cafcab0d22c13541618a8029a70a8959eb3525ff201fe971637e2274cd0" + name = "github.com/google/go-cmp" + packages = [ + "cmp", + "cmp/cmpopts", + "cmp/internal/diff", + "cmp/internal/function", + "cmp/internal/value", + ] + pruneopts = "UT" + revision = "3af367b6b30c263d47e8895973edcca9a49cf029" + version = "v0.2.0" + +[[projects]] + digest = "1:c0d19ab64b32ce9fe5cf4ddceba78d5bc9807f0016db6b1183599da3dcc24d10" + name = "github.com/hashicorp/hcl" + packages = [ + ".", + "hcl/ast", + "hcl/parser", + "hcl/printer", + "hcl/scanner", + "hcl/strconv", + "hcl/token", + "json/parser", + "json/scanner", + "json/token", + ] + pruneopts = "UT" + revision = "8cb6e5b959231cc1119e43259c4a608f9c51a241" + version = "v1.0.0" + +[[projects]] + digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" + name = "github.com/inconshreveable/mousetrap" + packages = ["."] + pruneopts = "UT" + revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" + version = "v1.0" + +[[projects]] + digest = "1:0a69a1c0db3591fcefb47f115b224592c8dfa4368b7ba9fae509d5e16cdc95c8" + name = "github.com/konsorten/go-windows-terminal-sequences" + packages = ["."] + pruneopts = "UT" + revision = "5c8c8bd35d3832f5d134ae1e1e375b69a4d25242" + version = "v1.0.1" + +[[projects]] + digest = "1:c568d7727aa262c32bdf8a3f7db83614f7af0ed661474b24588de635c20024c7" + name = "github.com/magiconair/properties" + packages = ["."] + pruneopts = "UT" + revision = "c2353362d570a7bfa228149c62842019201cfb71" + version = "v1.8.0" + +[[projects]] + digest = "1:c658e84ad3916da105a761660dcaeb01e63416c8ec7bc62256a9b411a05fcd67" + name = "github.com/mattn/go-colorable" + packages = ["."] + pruneopts = "UT" + revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" + version = "v0.0.9" + +[[projects]] + digest = "1:0981502f9816113c9c8c4ac301583841855c8cf4da8c72f696b3ebedf6d0e4e5" + name = "github.com/mattn/go-isatty" + packages = ["."] + pruneopts = "UT" + revision = "6ca4dbf54d38eea1a992b3c722a76a5d1c4cb25c" + version = "v0.0.4" + +[[projects]] + digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" + name = "github.com/matttproud/golang_protobuf_extensions" + packages = ["pbutil"] + pruneopts = "UT" + revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" + version = "v1.0.1" + +[[projects]] + branch = "master" + digest = "1:2b32af4d2a529083275afc192d1067d8126b578c7a9613b26600e4df9c735155" + name = "github.com/mgutz/ansi" + packages = ["."] + pruneopts = "UT" + revision = "9520e82c474b0a04dd04f8a40959027271bab992" + +[[projects]] + digest = "1:53bc4cd4914cd7cd52139990d5170d6dc99067ae31c56530621b18b35fc30318" + name = "github.com/mitchellh/mapstructure" + packages = ["."] + pruneopts = "UT" + revision = "3536a929edddb9a5b34bd6861dc4a9647cb459fe" + version = "v1.1.2" + +[[projects]] + digest = "1:95741de3af260a92cc5c7f3f3061e85273f5a81b5db20d4bd68da74bd521675e" + name = "github.com/pelletier/go-toml" + packages = ["."] + pruneopts = "UT" + revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" + version = "v1.2.0" + +[[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + pruneopts = "UT" + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + digest = "1:d14a5f4bfecf017cb780bdde1b6483e5deb87e12c332544d2c430eda58734bcb" + name = "github.com/prometheus/client_golang" + packages = [ + "prometheus", + "prometheus/promhttp", + ] + pruneopts = "UT" + revision = "c5b7fccd204277076155f10851dad72b76a49317" + version = "v0.8.0" + +[[projects]] + branch = "master" + digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" + name = "github.com/prometheus/client_model" + packages = ["go"] + pruneopts = "UT" + revision = "5c3871d89910bfb32f5fcab2aa4b9ec68e65a99f" + +[[projects]] + branch = "master" + digest = "1:db712fde5d12d6cdbdf14b777f0c230f4ff5ab0be8e35b239fc319953ed577a4" + name = "github.com/prometheus/common" + packages = [ + "expfmt", + "internal/bitbucket.org/ww/goautoneg", + "model", + ] + pruneopts = "UT" + revision = "7e9e6cabbd393fc208072eedef99188d0ce788b6" + +[[projects]] + branch = "master" + digest = "1:ef74914912f99c79434d9c09658274678bc85080ebe3ab32bec3940ebce5e1fc" + name = "github.com/prometheus/procfs" + packages = [ + ".", + "internal/util", + "nfs", + "xfs", + ] + pruneopts = "UT" + revision = "185b4288413d2a0dd0806f78c90dde719829e5ae" + +[[projects]] + digest = "1:b0c25f00bad20d783d259af2af8666969e2fc343fa0dc9efe52936bbd67fb758" + name = "github.com/rs/cors" + packages = ["."] + pruneopts = "UT" + revision = "9a47f48565a795472d43519dd49aac781f3034fb" + version = "v1.6.0" + +[[projects]] + digest = "1:d917313f309bda80d27274d53985bc65651f81a5b66b820749ac7f8ef061fd04" + name = "github.com/sergi/go-diff" + packages = ["diffmatchpatch"] + pruneopts = "UT" + revision = "1744e2970ca51c86172c8190fadad617561ed6e7" + version = "v1.0.0" + +[[projects]] + digest = "1:81e02c4edb639c80559c0650f9401d3e2dcc3256d1fa215382bb7c83c1db9126" + name = "github.com/shopspring/decimal" + packages = ["."] + pruneopts = "UT" + revision = "cd690d0c9e2447b1ef2a129a6b7b49077da89b8e" + version = "1.1.0" + +[[projects]] + digest = "1:3f53e9e4dfbb664cd62940c9c4b65a2171c66acd0b7621a1a6b8e78513525a52" + name = "github.com/sirupsen/logrus" + packages = ["."] + pruneopts = "UT" + revision = "ad15b42461921f1fb3529b058c6786c6a45d5162" + version = "v1.1.1" + +[[projects]] + digest = "1:6a4a11ba764a56d2758899ec6f3848d24698d48442ebce85ee7a3f63284526cd" + name = "github.com/spf13/afero" + packages = [ + ".", + "mem", + ] + pruneopts = "UT" + revision = "d40851caa0d747393da1ffb28f7f9d8b4eeffebd" + version = "v1.1.2" + +[[projects]] + digest = "1:516e71bed754268937f57d4ecb190e01958452336fa73dbac880894164e91c1f" + name = "github.com/spf13/cast" + packages = ["."] + pruneopts = "UT" + revision = "8965335b8c7107321228e3e3702cab9832751bac" + version = "v1.2.0" + +[[projects]] + digest = "1:645cabccbb4fa8aab25a956cbcbdf6a6845ca736b2c64e197ca7cbb9d210b939" + name = "github.com/spf13/cobra" + packages = ["."] + pruneopts = "UT" + revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385" + version = "v0.0.3" + +[[projects]] + digest = "1:68ea4e23713989dc20b1bded5d9da2c5f9be14ff9885beef481848edd18c26cb" + name = "github.com/spf13/jwalterweatherman" + packages = ["."] + pruneopts = "UT" + revision = "4a4406e478ca629068e7768fc33f3f044173c0a6" + version = "v1.0.0" + +[[projects]] + digest = "1:c1b1102241e7f645bc8e0c22ae352e8f0dc6484b6cb4d132fa9f24174e0119e2" + name = "github.com/spf13/pflag" + packages = ["."] + pruneopts = "UT" + revision = "298182f68c66c05229eb03ac171abe6e309ee79a" + version = "v1.0.3" + +[[projects]] + digest = "1:214775c11fd26da94a100111a62daa25339198a4f9c57cb4aab352da889f5b93" + name = "github.com/spf13/viper" + packages = ["."] + pruneopts = "UT" + revision = "2c12c60302a5a0e62ee102ca9bc996277c2f64f5" + version = "v1.2.1" + +[[projects]] + digest = "1:ac83cf90d08b63ad5f7e020ef480d319ae890c208f8524622a2f3136e2686b02" + name = "github.com/stretchr/objx" + packages = ["."] + pruneopts = "UT" + revision = "477a77ecc69700c7cdeb1fa9e129548e1c1c393c" + version = "v0.1.1" + +[[projects]] + digest = "1:afa503f22c5464c93393d25b1c3b8743fe1a96ff0db2b99cbb2091214995bf4b" + name = "github.com/stretchr/testify" + packages = [ + "assert", + "mock", + "require", + ] + pruneopts = "UT" + revision = "2aa2c176b9dab406a6970f6a55f513e8a8c8b18f" + +[[projects]] + digest = "1:e1cd343b3883ced86b6873fe4d2f76799259fba3d1656df6ac0a7fa92644c049" + name = "github.com/toqueteos/webbrowser" + packages = ["."] + pruneopts = "UT" + revision = "3232c91b8ede8ca86e8962981d881af78875542f" + version = "v1.1.0" + +[[projects]] + digest = "1:b24d38b282bacf9791408a080f606370efa3d364e4b5fd9ba0f7b87786d3b679" + name = "github.com/urfave/cli" + packages = ["."] + pruneopts = "UT" + revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1" + version = "v1.20.0" + +[[projects]] + branch = "master" + digest = "1:3f3a05ae0b95893d90b9b3b5afdb79a9b3d96e4e36e099d841ae602e4aca0da8" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + pruneopts = "UT" + revision = "0c41d7ab0a0ee717d4590a44bcb987dfd9e183eb" + +[[projects]] + branch = "master" + digest = "1:76ee51c3f468493aff39dbacc401e8831fbb765104cbf613b89bef01cf4bad70" + name = "golang.org/x/net" + packages = ["context"] + pruneopts = "UT" + revision = "9b4f9f5ad5197c79fd623a3638e70d8b26cef344" + +[[projects]] + branch = "master" + digest = "1:899c684138eb2844811b7f97e264d3c65d533dbedc59549fa58fc2bf316f83a1" + name = "golang.org/x/sys" + packages = [ + "unix", + "windows", + ] + pruneopts = "UT" + revision = "44b849a8bc13eb42e95e6c6c5e360481b73ec710" + +[[projects]] + digest = "1:8029e9743749d4be5bc9f7d42ea1659471767860f0cdc34d37c3111bd308a295" + name = "golang.org/x/text" + packages = [ + "internal/gen", + "internal/triegen", + "internal/ucd", + "transform", + "unicode/cldr", + "unicode/norm", + ] + pruneopts = "UT" + revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" + version = "v0.3.0" + +[[projects]] + digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "UT" + revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" + version = "v2.2.1" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "github.com/NYTimes/gziphandler", + "github.com/SkycoinProject/encodertest", + "github.com/andreyvit/diff", + "github.com/blang/semver", + "github.com/boltdb/bolt", + "github.com/cenkalti/backoff", + "github.com/google/go-cmp/cmp", + "github.com/google/go-cmp/cmp/cmpopts", + "github.com/mgutz/ansi", + "github.com/prometheus/client_golang/prometheus", + "github.com/prometheus/client_golang/prometheus/promhttp", + "github.com/rs/cors", + "github.com/shopspring/decimal", + "github.com/sirupsen/logrus", + "github.com/spf13/cobra", + "github.com/spf13/pflag", + "github.com/spf13/viper", + "github.com/stretchr/testify/assert", + "github.com/stretchr/testify/mock", + "github.com/stretchr/testify/require", + "github.com/toqueteos/webbrowser", + "github.com/urfave/cli", + "golang.org/x/crypto/ssh/terminal", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/SkycoinProject/skycoin/Gopkg.toml b/vendor/github.com/SkycoinProject/skycoin/Gopkg.toml new file mode 100644 index 00000000..cb1e605e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/Gopkg.toml @@ -0,0 +1,56 @@ + +# Gopkg.toml example +# +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +[prune] + unused-packages = true + go-tests = true + +[[constraint]] + name = "github.com/boltdb/bolt" + version = "1.0.0" + +[[constraint]] + name = "github.com/toqueteos/webbrowser" + version = "1.0.0" + +[[constraint]] + name = "github.com/urfave/cli" + version = "1.19.1" + +[[constraint]] + name = "github.com/stretchr/testify" + revision = "2aa2c176b9dab406a6970f6a55f513e8a8c8b18f" + +[[constraint]] + name = "github.com/cenkalti/backoff" + version = "v1.1.0" + +[[constraint]] + name = "github.com/NYTimes/gziphandler" + version = "1.0.1" + +[[constraint]] + name = "github.com/prometheus/client_golang" + version = "0.8.0" + +[[constraint]] + name = "github.com/shopspring/decimal" + version = "1.1.0" diff --git a/vendor/github.com/SkycoinProject/skycoin/INSTALLATION.md b/vendor/github.com/SkycoinProject/skycoin/INSTALLATION.md new file mode 100644 index 00000000..2cc66a8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/INSTALLATION.md @@ -0,0 +1,102 @@ +# Installing go + +Skycoin supports go1.10+. + +## For OSX +First you need to have `homebrew` installed, if you don't have it yet. + +```sh +/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" +``` + +Then, let's install go's latest version. + +```sh +brew install go +``` + +Lastly, let's install Mercurial and Bazaar + +```sh +brew install mercurial bzr +``` + +## For linux +We need to install linux dependencies on the correct distribution. + +#### Ubuntu and Debian +```sh +sudo apt-get update && sudo apt-get upgrade -y +sudo apt-get install -y curl git mercurial make binutils gcc bzr bison libgmp3-dev screen gcc build-essential +``` + +#### Centos and Fedora +```sh +sudo yum update -y && sudo yum upgrade -y +sudo yum install -y git curl make gcc mercurial binutils bzr bison screen +if [[ "$(cat /etc/redhat-release | grep -o CentOS)" == "CentOS" ]]; then sudo yum install -y build-essential libgmp3-dev; else sudo yum groupinstall -y "Development Tools" "Development Libraries" && sudo yum install -y gmp; fi; +``` +#### Archlinux +First update the system and ensure the dependancies are met +```sh +sudo pacman -Syy && sudo pacman -Syu +sudo pacman -S base-devel +``` + +Install the latest version of go on Archlinux with: +```sh +sudo pacman -S go +``` + +## Install Go manually +### Install Go + +Let's go to home directory and declare `go`'s version that you want to download. + +```sh +cd ~ +export GOV=1.11.1 # golang version +``` + +After that, let's download and uncompress golang source. + +```sh +curl -sS https://storage.googleapis.com/golang/go$GOV.linux-amd64.tar.gz > go$GOV.linux-amd64.tar.gz +tar xvf go$GOV.linux-amd64.tar.gz +rm go$GOV.linux-amd64.tar.gz +``` + +lastly, let's install `go`. + +```sh +sudo mv go /usr/local/go +sudo ln -s /usr/local/go/bin/go /usr/local/bin/go +sudo ln -s /usr/local/go/bin/godoc /usr/local/bin/godoc +sudo ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt +``` + +Note: Find any golang source version at [Go Website](https://golang.org/dl/) + +### Setup your GOPATH +The $GOPATH environment variable specifies the location of your workspace. It defaults to a directory named `go` inside your home directory, so $HOME/go on Unix. + +Create your workspace directory with it's respective inner folders: + +```sh +mkdir -p $HOME/go +mkdir -p $HOME/go/bin +mkdir -p $HOME/go/src +mkdir -p $HOME/go/pkg +``` + +Setup $GOPATH variable, add it to ~/.bashrc. After editing, run `source ~/.bashrc` or open a new tab. + +```sh +export GOROOT=/usr/local/go +export GOPATH=$HOME/go +export GOBIN=$GOPATH/bin +export PATH=$PATH:$GOBIN +``` + +## Test your Go installation +Create and run the hello.go application described here: https://golang.org/doc/install#testing to check if your Go installation is working. diff --git a/vendor/github.com/SkycoinProject/skycoin/INTEGRATION.md b/vendor/github.com/SkycoinProject/skycoin/INTEGRATION.md new file mode 100644 index 00000000..38e0e325 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/INTEGRATION.md @@ -0,0 +1,349 @@ +# Skycoin Exchange Integration + +A Skycoin node offers a REST API on port 6420 (when running from source; if you are using the releases downloaded from the website, the port is randomized) + +A CLI tool is provided in `cmd/skycoin-cli/skycoin-cli.go`. This tool communicates over the REST API. + +The API interfaces do not support authentication or encryption so they should only be used over localhost. + +If your application is written in Go, you can use these client libraries to interface with the node: + +* [Skycoin REST API Client Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client) +* [Skycoin CLI Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/cli) + +*Note*: The CLI interface will be deprecated and replaced with a better one in the future. + +The wallet APIs in the REST API operate on wallets loaded from and saved to `~/.skycoin/wallets`. +Use the CLI tool to perform seed generation and transaction signing outside of the Skycoin node. + +The Skycoin node's wallet APIs can be enabled from the command line. +`-enable-all-api-sets` will enable all of the APIs which includes the wallet APIs, +or for more control it can specified in a list of API sets, e.g. `-enable-api-sets=READ,STATUS,WALLET`. +See the [REST API](src/api/README.md) for information on API sets. + +For a node used to support another application, +it is recommended to use the REST API for blockchain queries and disable the wallet APIs, +and to use the CLI tool for wallet operations (seed and address generation, transaction signing). + + + +- [Running the skycoin node](#running-the-skycoin-node) +- [API Documentation](#api-documentation) + - [Wallet REST API](#wallet-rest-api) + - [Skycoin command line interface](#skycoin-command-line-interface) + - [Skycoin REST API Client Documentation](#skycoin-rest-api-client-documentation) + - [Skycoin Go Library Documentation](#skycoin-go-library-documentation) + - [libskycoin Documentation](#libskycoin-documentation) +- [Implementation guidelines](#implementation-guidelines) + - [Scanning deposits](#scanning-deposits) + - [Using the CLI](#using-the-cli) + - [Using the REST API](#using-the-rest-api) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application) + - [Sending coins](#sending-coins) + - [General principles](#general-principles) + - [Using the CLI](#using-the-cli-1) + - [Using the REST API](#using-the-rest-api-1) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-1) + - [Coinhours](#coinhours) + - [REST API](#rest-api) + - [CLI](#cli) + - [Verifying addresses](#verifying-addresses) + - [Using the CLI](#using-the-cli-2) + - [Using the REST API](#using-the-rest-api-2) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-2) + - [Using skycoin as a library in other applications](#using-skycoin-as-a-library-in-other-applications) + - [Checking Skycoin node connections](#checking-skycoin-node-connections) + - [Using the CLI](#using-the-cli-3) + - [Using the REST API](#using-the-rest-api-3) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-3) + - [Checking Skycoin node status](#checking-skycoin-node-status) + - [Using the CLI](#using-the-cli-4) + - [Using the REST API](#using-the-rest-api-4) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-4) +- [xpub wallets](#xpub-wallets) + - [Create a bip44 HD wallet](#create-a-bip44-hd-wallet) + - [Using the CLI](#using-the-cli-5) + - [Using the REST API](#using-the-rest-api-5) + - [Export an xpub key from a bip44 wallet](#export-an-xpub-key-from-a-bip44-wallet) + - [Using the CLI](#using-the-cli-6) + - [Using the REST API](#using-the-rest-api-6) + - [Create an xpub wallet](#create-an-xpub-wallet) + - [Using the CLI](#using-the-cli-7) + - [Using the REST API](#using-the-rest-api-7) + + + +## Running the skycoin node + +For integrations, the skycoin node should be run from source with `./run-daemon.sh`. This requires go1.10+ to be installed. + +## API Documentation + +### Wallet REST API + +[Wallet REST API](src/api/README.md). + +### Skycoin command line interface + +[CLI command API](cmd/skycoin-cli/README.md). + +### Skycoin REST API Client Documentation + +[Skycoin REST API Client](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client) + +### Skycoin Go Library Documentation + +[Skycoin Godoc](https://godoc.org/github.com/SkycoinProject/skycoin) + +### libskycoin Documentation + +`libskycoin` provides a C library for Skycoin's cryptographic operations. +This allows python, ruby, C#, Java, etc applications to perform operations +such as transaction signing and address verification, without using the Skycoin daemon API +or calling the CLI tool from the shell. + +[libskycoin documentation](https://github.com/skycoin/libskycoin) + +## Implementation guidelines + +### Scanning deposits + +There are multiple approaches to scanning for deposits, depending on your implementation. + +One option is to watch for incoming blocks and check them for deposits made to a list of known deposit addresses. +Another option is to check the unspent outputs for a list of known deposit addresses. + +#### Using the CLI + +To scan the blockchain, use `skycoin-cli lastBlocks` or `skycoin-cli blocks`. These will return block data as JSON +and new unspent outputs sent to an address can be detected. + +To check address outputs, use `skycoin-cli addressOutputs`. If you only want the balance, you can use `skycoin-cli addressBalance`. + +#### Using the REST API + +To scan the blockchain, call `GET /api/v1/last_blocks?num=` or `GET /api/v1/blocks?start=&end=`. There will return block data as JSON +and new unspent outputs sent to an address can be detected. + +To check address outputs, call `GET /api/v1/outputs?addrs=`. If you only want the balance, you can call `GET /api/v1/balance?addrs=`. + +* [`GET /api/v1/last_blocks` docs](src/api/README.md#get-last-n-blocks) +* [`GET /api/v1/blocks` docs](src/api/README.md#get-blocks-in-specific-range) +* [`GET /api/v1/outputs` docs](src/api/README.md#get-unspent-output-set-of-address-or-hash) +* [`GET /api/v1/balance` docs](src/api/README.md#get-balance-of-addresses) + +#### Using skycoin as a library in a Go application + +We recommend using the [Skycoin REST API Client](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client). + +### Sending coins + +#### General principles + +After each spend, wait for the transaction to confirm before trying to spend again. + +For higher throughput, combine multiple spends into one transaction. + +Skycoin uses "coin hours" to ratelimit transactions. +The total number of coinhours in a transaction's outputs must be 50% or less than the number of coinhours in a transaction's inputs, +or else the transaction is invalid and will not be accepted. A transaction must have at least 1 input with at least 1 coin hour. +Sending too many transactions in quick succession will use up all available coinhours. +Coinhours are earned at a rate of 1 coinhour per coin per hour, calculated per second. +This means that 3600 coins will earn 1 coinhour per second. +However, coinhours are only updated when a new block is published to the blockchain. +New blocks are published every 10 seconds, but only if there are pending transactions in the network. + +To avoid running out of coinhours in situations where the application may frequently send, +the sender should batch sends into a single transaction and send them on a +30 second to 1 minute interval. + +There are other strategies to minimize the likelihood of running out of coinhours, such +as splitting up balances into many unspent outputs and having a large balance which generates +coinhours quickly. + +#### Using the CLI + +When sending coins from the CLI tool, a wallet file local to the caller is used. +The CLI tool allows you to specify the wallet file on disk to use for operations. + +See [CLI command API](cmd/skycoin-cli/README.md) for documentation of the CLI interface. + +To perform a send, the preferred method follows these steps in a loop: + +* `skycoin-cli createRawTransaction $WALLET_FILE -m '[{"addr:"$addr1,"coins:"$coins1"}, ...]` - `-m` flag is send-to-many +* `skycoin-cli broadcastTransaction` - returns `txid` +* `skycoin-cli transaction $txid` - repeat this command until `"status"` is `"confirmed"` + +That is, create a raw transaction, broadcast it, and wait for it to confirm. + +#### Using the REST API + +The wallet APIs must be enabled with `-enable-api-sets=WALLET,READ`. + +Create a transaction with [POST /wallet/transaction](https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#create-transaction), +then inject it to the network with [POST /injectTransaction](https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#inject-raw-transaction). + +When using `POST /wallet/transaction`, a wallet file local to the skycoin node is used. +The wallet file is specified by wallet ID, and all wallet files are in the +configured data directory (which is `$HOME/.skycoin/wallets` by default). + +#### Using skycoin as a library in a Go application + +If your application is written in Go, you can interface with the CLI library +directly, see [Skycoin CLI Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/cli). + +A REST API client is also available: [Skycoin REST API Client Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client). + +#### Coinhours + +Transaction fees in skycoin is paid in coinhours and is currently set to `50%`, +every transaction created burns `50%` of the total coinhours in all the input +unspents. + +You need a minimum of `1` of coinhour to create a transaction. + +Coinhours are generated at a rate of `1 coinsecond` per `second` +which are then converted to `coinhours`, `1` coinhour = `3600` coinseconds. + +> Note: Coinhours don't have decimals and only show up in whole numbers. + +##### REST API + +When using the REST API, the coin hours sent to the destination and change can be controlled. +The 50% burn fee is still required. + +See the [POST /wallet/transaction](https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#create-transaction) +documentation for more information on how to control the coin hours. + +We recommend sending at least 1 coin hour to each destination, otherwise the receiver will have to +wait for another coin hour to accumulate before they can make another transaction. + +##### CLI + +When using the CLI the amount of coinhours sent to the receiver is capped to +the number of coins they receive with a minimum of `1` coinhour for transactions +with `<1` skycoin being sent. + +The coinhours left after burning `50%` and sending to receivers are sent to the change address. + +For eg. If an address has `10` skycoins and `50` coinhours and only `1` unspent. +If we send `5` skycoins to another address then that address will receive +`5` skycoins and `5` coinhours, `26` coinhours will be burned. +The sending address will be left with `5` skycoins and `19` coinhours which +will then be sent to the change address. + + +### Verifying addresses + +#### Using the CLI + +```sh +skycoin-cli verifyAddress $addr +``` + +#### Using the REST API + +Not directly supported, but API calls that have an address argument will return `400 Bad Request` if they receive an invalid address. + +#### Using skycoin as a library in a Go application + +https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher#DecodeBase58Address + +```go +if _, err := cipher.DecodeBase58Address(address); err != nil { + fmt.Println("Invalid address:", err) + return +} +``` + +#### Using skycoin as a library in other applications + +Address validation is available through a C wrapper, `libskycoin`. + +See the [libskycoin documentation](/lib/cgo/README.md) for usage instructions. + +### Checking Skycoin node connections + +#### Using the CLI + +Not implemented + +#### Using the REST API + +* `GET /api/v1/network/connections` + +#### Using skycoin as a library in a Go application + +Use the [Skycoin REST API Client](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client) + +### Checking Skycoin node status + +#### Using the CLI + +```sh +skycoin-cli status +``` + +#### Using the REST API + +A method similar to `skycoin-cli status` is not implemented, but these endpoints can be used: + +* `GET /api/v1/health` +* `GET /api/v1/version` +* `GET /api/v1/blockchain/metadata` +* `GET /api/v1/blockchain/progress` + +#### Using skycoin as a library in a Go application + +Use the [Skycoin CLI package](https://godoc.org/github.com/SkycoinProject/skycoin/src/cli) + +## xpub wallets + +You can create a wallet from an `xpub` key, which allows you to generate new +addresses without exposing secret keys. You can use any `xpub` key from an +existing Bitcoin or Ethereum HD wallet you may already have, or you can create +a new HD wallet in Skycoin. + +To create an xpub wallet from scratch: + +1. Create a bip44 wallet +2. Export an xpub key from the bip44 wallet +3. Create the xpub wallet + +If you already have an xpub key, you can skip to step 3. + +### Create a bip44 HD wallet + +#### Using the CLI + +```sh +skycoin-cli bip44-wallet.wlt -t bip44 +``` + +#### Using the REST API + +* `POST /api/v1/wallet/create` + +### Export an xpub key from a bip44 wallet + +#### Using the CLI + +```sh +skycoin-cli walletKeyExport bip44-wallet.wlt -k xpub --path "0/0" +``` + +#### Using the REST API + +Not possible + +### Create an xpub wallet + +#### Using the CLI + +```sh +skycoin-cli walletCreate xpub-wallet.wlt -t xpub --xpub $MY_XPUB_KEY +``` + +#### Using the REST API + +* `POST /api/v1/wallet/create` diff --git a/vendor/github.com/SkycoinProject/skycoin/Makefile b/vendor/github.com/SkycoinProject/skycoin/Makefile new file mode 100644 index 00000000..048ba278 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/Makefile @@ -0,0 +1,235 @@ +.DEFAULT_GOAL := help +.PHONY: run-client run-daemon run-help +.PHONY: test test-386 test-amd64 +.PHONY: check check-newcoin +.PHONY: run-integration-test-live +.PHONY: run-integration-test-live-disable-csrf +.PHONY: run-integration-test-live-disable-networking +.PHONY: run-integration-test-live-cover +.PHONY: run-integration-test-live-cover-disable-csrf +.PHONY: run-integration-test-live-cover-disable-networking +.PHONY: integration-tests-stable +.PHONY: integration-test-stable +.PHONY: integration-test-stable-disable-csrf +.PHONY: integration-test-stable-disable-wallet-api +.PHONY: integration-test-stable-enable-seed-api +.PHONY: integration-test-stable-disable-gui +.PHONY: integration-test-stable-db-no-unconfirmed +.PHONY: integration-test-stable-auth +.PHONY: integration-test-live integration-test-live-wallet +.PHONY: install-linters format release clean-release clean-coverage +.PHONY: install-deps-ui build-ui build-ui-travis help newcoin merge-coverage +.PHONY: generate update-golden-files +.PHONY: fuzz-base58 fuzz-encoder + +COIN ?= skycoin + +# Static files directory +GUI_STATIC_DIR = src/gui/static + +# Electron files directory +ELECTRON_DIR = electron + +# Platform specific checks +OSNAME = $(TRAVIS_OS_NAME) + +run-client: ## Run skycoin with desktop client configuration. To add arguments, do 'make ARGS="--foo" run'. + ./run-client.sh ${ARGS} + +run-daemon: ## Run skycoin with server daemon configuration. To add arguments, do 'make ARGS="--foo" run'. + ./run-daemon.sh ${ARGS} + +run-help: ## Show skycoin node help + @go run cmd/$(COIN)/$(COIN).go --help + +run-integration-test-live: ## Run the skycoin node configured for live integration tests + ./ci-scripts/run-live-integration-test-node.sh + +run-integration-test-live-disable-csrf: ## Run the skycoin node configured for live integration tests with CSRF disabled + ./ci-scripts/run-live-integration-test-node.sh -disable-csrf + +run-integration-test-live-disable-networking: ## Run the skycoin node configured for live integration tests with networking disabled + ./ci-scripts/run-live-integration-test-node.sh -disable-networking + +run-integration-test-live-cover: ## Run the skycoin node configured for live integration tests with coverage + ./ci-scripts/run-live-integration-test-node-cover.sh + +run-integration-test-live-cover-disable-csrf: ## Run the skycoin node configured for live integration tests with CSRF disabled and with coverage + ./ci-scripts/run-live-integration-test-node-cover.sh -disable-csrf + +run-integration-test-live-cover-disable-networking: ## Run the skycoin node configured for live integration tests with networking disabled and with coverage + ./ci-scripts/run-live-integration-test-node-cover.sh -disable-networking + +test: ## Run tests for Skycoin + @mkdir -p coverage/ + COIN=$(COIN) go test -coverpkg="github.com/$(COIN)/$(COIN)/..." -coverprofile=coverage/go-test-cmd.coverage.out -timeout=5m ./cmd/... + COIN=$(COIN) go test -coverpkg="github.com/$(COIN)/$(COIN)/..." -coverprofile=coverage/go-test-src.coverage.out -timeout=5m ./src/... + +test-386: ## Run tests for Skycoin with GOARCH=386 + GOARCH=386 COIN=$(COIN) go test ./cmd/... -timeout=5m + GOARCH=386 COIN=$(COIN) go test ./src/... -timeout=5m + +test-amd64: ## Run tests for Skycoin with GOARCH=amd64 + GOARCH=amd64 COIN=$(COIN) go test ./cmd/... -timeout=5m + GOARCH=amd64 COIN=$(COIN) go test ./src/... -timeout=5m + +lint: ## Run linters. Use make install-linters first. + vendorcheck ./... + golangci-lint run -c .golangci.yml ./... + @# The govet version in golangci-lint is out of date and has spurious warnings, run it separately + go vet -all ./... + +check-newcoin: newcoin ## Check that make newcoin succeeds and no templated files are changed. + @if [ "$(shell git diff ./cmd/skycoin/skycoin.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make newcoin' ; exit 2 ; fi + @if [ "$(shell git diff ./cmd/skycoin/skycoin_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make newcoin' ; exit 2 ; fi + @if [ "$(shell git diff ./src/params/params.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make newcoin' ; exit 2 ; fi + +check: lint clean-coverage test test-386 integration-tests-stable check-newcoin ## Run tests and linters + +integration-tests-stable: integration-test-stable \ + integration-test-stable-disable-csrf \ + integration-test-stable-disable-wallet-api \ + integration-test-stable-enable-seed-api \ + integration-test-stable-disable-gui \ + integration-test-stable-auth \ + integration-test-stable-db-no-unconfirmed ## Run all stable integration tests + +integration-test-stable: ## Run stable integration tests + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -c -x -n enable-csrf-header-check + +integration-test-stable-disable-header-check: ## Run stable integration tests with header check disabled + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -n disable-header-check + +integration-test-stable-disable-csrf: ## Run stable integration tests with CSRF disabled + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -n disable-csrf + +integration-test-stable-disable-wallet-api: ## Run disable wallet api integration tests + COIN=$(COIN) ./ci-scripts/integration-test-disable-wallet-api.sh + +integration-test-stable-enable-seed-api: ## Run enable seed api integration test + COIN=$(COIN) ./ci-scripts/integration-test-enable-seed-api.sh + +integration-test-stable-disable-gui: ## Run tests with the GUI disabled + COIN=$(COIN) ./ci-scripts/integration-test-disable-gui.sh + +integration-test-stable-db-no-unconfirmed: ## Run stable tests against the stable database that has no unconfirmed transactions + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -d -n no-unconfirmed + +integration-test-stable-auth: ## Run stable tests with HTTP Basic auth enabled + COIN=$(COIN) ./ci-scripts/integration-test-auth.sh + +integration-test-live: ## Run live integration tests + COIN=$(COIN) ./ci-scripts/integration-test-live.sh -c + +integration-test-live-wallet: ## Run live integration tests with wallet + COIN=$(COIN) ./ci-scripts/integration-test-live.sh -w + +integration-test-live-enable-header-check: ## Run live integration tests against a node with header check enabled + COIN=$(COIN) ./ci-scripts/integration-test-live.sh + +integration-test-live-disable-csrf: ## Run live integration tests against a node with CSRF disabled + COIN=$(COIN) ./ci-scripts/integration-test-live.sh + +integration-test-live-disable-networking: ## Run live integration tests against a node with networking disabled (requires wallet) + COIN=$(COIN) ./ci-scripts/integration-test-live.sh -c -k + +install-linters: ## Install linters + go get -u github.com/FiloSottile/vendorcheck + # For some reason this install method is not recommended, see https://github.com/golangci/golangci-lint#install + # However, they suggest `curl ... | bash` which we should not do + # go get -u github.com/golangci/golangci-lint/cmd/golangci-lint + # Change to use go get -u with version when go is v1.12+ + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(shell go env GOPATH)/bin v1.18.0 + +format: ## Formats the code. Must have goimports installed (use make install-linters). + goimports -w -local github.com/SkycoinProject/skycoin ./cmd + goimports -w -local github.com/SkycoinProject/skycoin ./src + +install-deps-ui: ## Install the UI dependencies + cd $(GUI_STATIC_DIR) && npm install + +lint-ui: ## Lint the UI code + cd $(GUI_STATIC_DIR) && npm run lint + +test-ui: ## Run UI tests + cd $(GUI_STATIC_DIR) && npm run test + +test-ui-e2e: ## Run UI e2e tests + ./ci-scripts/ui-e2e.sh + +build-ui: ## Builds the UI + cd $(GUI_STATIC_DIR) && npm run build + +build-ui-travis: ## Builds the UI for travis + cd $(GUI_STATIC_DIR) && npm run build-travis + +release: ## Build electron, standalone and daemon apps. Use osarch=${osarch} to specify the platform. Example: 'make release osarch=darwin/amd64', multiple platform can be supported in this way: 'make release osarch="darwin/amd64 windows/amd64"'. Supported architectures are: darwin/amd64 windows/amd64 windows/386 linux/amd64 linux/arm, the builds are located in electron/release folder. + cd $(ELECTRON_DIR) && ./build.sh ${osarch} + @echo release files are in the folder of electron/release + +release-standalone: ## Build standalone apps. Use osarch=${osarch} to specify the platform. Example: 'make release-standalone osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-standalone-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-electron: ## Build electron apps. Use osarch=${osarch} to specify the platform. Example: 'make release-electron osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-electron-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-daemon: ## Build daemon apps. Use osarch=${osarch} to specify the platform. Example: 'make release-daemon osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-daemon-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-cli: ## Build CLI apps. Use osarch=${osarch} to specify the platform. Example: 'make release-cli osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-cli-release.sh ${osarch} + @echo release files are in the folder of electron/release + +clean-release: ## Remove all electron build artifacts + rm -rf $(ELECTRON_DIR)/release + rm -rf $(ELECTRON_DIR)/.gox_output + rm -rf $(ELECTRON_DIR)/.daemon_output + rm -rf $(ELECTRON_DIR)/.cli_output + rm -rf $(ELECTRON_DIR)/.standalone_output + rm -rf $(ELECTRON_DIR)/.electron_output + +clean-coverage: ## Remove coverage output files + rm -rf ./coverage/ + +newcoin: ## Rebuild cmd/$COIN/$COIN.go file from the template. Call like "make newcoin COIN=foo". + go run cmd/newcoin/newcoin.go createcoin --coin $(COIN) + +generate: ## Generate test interface mocks and struct encoders + go generate ./src/... + # mockery can't generate the UnspentPooler mock in package visor, patch it + mv ./src/visor/blockdb/mock_unspent_pooler_test.go ./src/visor/mock_unspent_pooler_test.go + sed -i "" -e 's/package blockdb/package visor/g' ./src/visor/mock_unspent_pooler_test.go + sed -i "" -e 's/AddressHashes/blockdb.AddressHashes/g' ./src/visor/mock_unspent_pooler_test.go + goimports -w -local github.com/SkycoinProject/skycoin ./src/visor/mock_unspent_pooler_test.go + +install-generators: ## Install tools used by go generate + go get github.com/vektra/mockery/.../ + go get github.com/SkycoinProject/skyencoder/cmd/skyencoder + +update-golden-files: ## Run integration tests in update mode + ./ci-scripts/integration-test-stable.sh -u >/dev/null 2>&1 || true + ./ci-scripts/integration-test-stable.sh -c -x -u >/dev/null 2>&1 || true + ./ci-scripts/integration-test-stable.sh -d -u >/dev/null 2>&1 || true + ./ci-scripts/integration-test-stable.sh -c -x -d -u >/dev/null 2>&1 || true + +merge-coverage: ## Merge coverage files and create HTML coverage output. gocovmerge is required, install with `go get github.com/wadey/gocovmerge` + @echo "To install gocovmerge do:" + @echo "go get github.com/wadey/gocovmerge" + gocovmerge coverage/*.coverage.out > coverage/all-coverage.merged.out + go tool cover -html coverage/all-coverage.merged.out -o coverage/all-coverage.html + @echo "Total coverage HTML file generated at coverage/all-coverage.html" + @echo "Open coverage/all-coverage.html in your browser to view" + +fuzz-base58: ## Fuzz the base58 package. Requires https://github.com/dvyukov/go-fuzz + go-fuzz-build github.com/SkycoinProject/skycoin/src/cipher/base58/internal + go-fuzz -bin=base58fuzz-fuzz.zip -workdir=src/cipher/base58/internal + +fuzz-encoder: ## Fuzz the encoder package. Requires https://github.com/dvyukov/go-fuzz + go-fuzz-build github.com/SkycoinProject/skycoin/src/cipher/encoder/internal + go-fuzz -bin=encoderfuzz-fuzz.zip -workdir=src/cipher/encoder/internal + +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/vendor/github.com/SkycoinProject/skycoin/README.md b/vendor/github.com/SkycoinProject/skycoin/README.md new file mode 100644 index 00000000..2ae884dc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/README.md @@ -0,0 +1,870 @@ +![skycoin logo](https://user-images.githubusercontent.com/26845312/32426705-d95cb988-c281-11e7-9463-a3fce8076a72.png) + +# Skycoin + +[![Build Status](https://travis-ci.com/SkycoinProject/skycoin.svg)](https://travis-ci.com/SkycoinProject/skycoin) +[![GoDoc](https://godoc.org/github.com/SkycoinProject/skycoin?status.svg)](https://godoc.org/github.com/SkycoinProject/skycoin) +[![Go Report Card](https://goreportcard.com/badge/github.com/SkycoinProject/skycoin)](https://goreportcard.com/report/github.com/SkycoinProject/skycoin) + +Skycoin is a next-generation cryptocurrency. + +Skycoin was written from scratch and designed over four years to realize the +ideal of Bitcoin and represents the apex of cryptocurrency design. +Skycoin is not designed to add features to Bitcoin, +but rather improves Bitcoin by increasing simplicity, +security and stripping out everything non-essential. + +Some people have hyped the Skycoin Project as leading into "Bitcoin 3.0". +The coin itself is not "Bitcoin 3.0", +but is rather "Bitcoin 1.0". Bitcoin is a prototype crypto-coin. +Skycoin was designed to be what Bitcoin would look like if it were built from +scratch, to remedy the rough edges in the Bitcoin design. + +- no duplicate coin-base outputs +- enforced checks for hash collisions +- simple deterministic wallets +- no transaction malleability +- no signature malleability +- removal of the scripting language +- CoinJoin and normal transactions are indistinguishable +- elimination of edge-cases that prevent independent node implementations +- <=10 second transaction times +- elimination of the need for mining to achieve blockchain consensus + +## Links + +* [skycoin.com](https://www.skycoin.com) +* [Skycoin Blog](https://www.skycoin.com/blog) +* [Skycoin Docs](https://www.skycoin.com/docs) +* [Skycoin Blockchain Explorer](https://explorer.skycoin.com) +* [Skycoin Development Telegram Channel](https://t.me/skycoindev) +* [Skycoin Github Wiki](https://github.com/SkycoinProject/skycoin/wiki) + +## Table of Contents + + + +- [Changelog](#changelog) +- [Installation](#installation) + - [Go 1.10+ Installation and Setup](#go-110-installation-and-setup) + - [Go get skycoin](#go-get-skycoin) + - [Run Skycoin from the command line](#run-skycoin-from-the-command-line) + - [Show Skycoin node options](#show-skycoin-node-options) + - [Run Skycoin with options](#run-skycoin-with-options) + - [Docker image](#docker-image) + - [Building your own images](#building-your-own-images) + - [Development image](#development-image) +- [API Documentation](#api-documentation) + - [REST API](#rest-api) + - [Skycoin command line interface](#skycoin-command-line-interface) +- [Integrating Skycoin with your application](#integrating-skycoin-with-your-application) +- [Contributing a node to the network](#contributing-a-node-to-the-network) +- [Creating a new coin](#creating-a-new-coin) +- [Daemon CLI Options](#daemon-cli-options) +- [URI Specification](#uri-specification) +- [Wire protocol user agent](#wire-protocol-user-agent) +- [Offline transaction signing](#offline-transaction-signing) +- [Deploy a public Skycoin API node with HTTPS](#deploy-a-public-skycoin-api-node-with-https) +- [Development](#development) + - [Modules](#modules) + - [Client libraries](#client-libraries) + - [Running Tests](#running-tests) + - [Running Integration Tests](#running-integration-tests) + - [Stable Integration Tests](#stable-integration-tests) + - [Live Integration Tests](#live-integration-tests) + - [Debugging Integration Tests](#debugging-integration-tests) + - [Update golden files in integration testdata](#update-golden-files-in-integration-testdata) + - [Test coverage](#test-coverage) + - [Test coverage for the live node](#test-coverage-for-the-live-node) + - [Formatting](#formatting) + - [Code Linting](#code-linting) + - [Profiling](#profiling) + - [Fuzzing](#fuzzing) + - [base58](#base58) + - [encoder](#encoder) + - [Dependencies](#dependencies) + - [Rules](#rules) + - [Management](#management) + - [Configuration Modes](#configuration-modes) + - [Development Desktop Client Mode](#development-desktop-client-mode) + - [Server Daemon Mode](#server-daemon-mode) + - [Electron Desktop Client Mode](#electron-desktop-client-mode) + - [Standalone Desktop Client Mode](#standalone-desktop-client-mode) + - [Wallet GUI Development](#wallet-gui-development) + - [Translations](#translations) + - [Releases](#releases) + - [Update the version](#update-the-version) + - [Pre-release testing](#pre-release-testing) + - [Creating release builds](#creating-release-builds) + - [Release signing](#release-signing) +- [Responsible Disclosure](#responsible-disclosure) + + + +## Changelog + +[CHANGELOG.md](CHANGELOG.md) + +## Installation + +Skycoin supports go1.10+. + +### Go 1.10+ Installation and Setup + +[Golang 1.10+ Installation/Setup](./INSTALLATION.md) + +### Go get skycoin + +```sh +$ go get github.com/SkycoinProject/skycoin/cmd/... +``` + +This will download `github.com/SkycoinProject/skycoin` to `$GOPATH/src/github.com/SkycoinProject/skycoin`. + +You can also clone the repo directly with `git clone https://github.com/SkycoinProject/skycoin`, +but it must be cloned to this path: `$GOPATH/src/github.com/SkycoinProject/skycoin`. + +### Run Skycoin from the command line + +```sh +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ make run-client +``` + +### Show Skycoin node options + +```sh +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ make run-help +``` + +### Run Skycoin with options + +Example: + +```sh +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ make ARGS="--launch-browser=false -data-dir=/custom/path" run +``` + +### Docker image + +This is the quickest way to start using Skycoin using Docker. + +```sh +$ docker volume create skycoin-data +$ docker volume create skycoin-wallet +$ docker run -ti --rm \ + -v skycoin-data:/data/.skycoin \ + -v skycoin-wallet:/wallet \ + -p 6000:6000 \ + -p 6420:6420 \ + SkycoinProject/skycoin +``` + +This image has a `skycoin` user for the skycoin daemon to run, with UID and GID 10000. +When you mount the volumes, the container will change their owner, so you +must be aware that if you are mounting an existing host folder any content you +have there will be own by 10000. + +The container will run with some default options, but you can change them +by just appending flags at the end of the `docker run` command. The following +example will show you the available options. + +```sh +$ docker run --rm SkycoinProject/skycoin -help +``` + +Access the dashboard: [http://localhost:6420](http://localhost:6420). + +Access the API: [http://localhost:6420/version](http://localhost:6420/version). + +### Building your own images + +[Building your own images](docker/images/mainnet/README.md). + +### Development image + +The [SkycoinProject/skycoindev-cli docker image](docker/images/dev-cli/README.md) is provided in order to make +easy to start developing Skycoin. It comes with the compiler, linters, debugger +and the vim editor among other tools. + +The [SkycoinProject/skycoindev-dind docker image](docker/images/dev-docker/README.md) comes with docker installed +and all tools available on `SkycoinProject/skycoindev-cli:develop` docker image. + +Also, the [SkycoinProject/skycoindev-vscode docker image](docker/images/dev-vscode/README.md) is provided +to facilitate the setup of the development process with [Visual Studio Code](https://code.visualstudio.com) +and useful tools included in `SkycoinProject/skycoindev-cli`. + +## API Documentation + +### REST API + +[REST API](src/api/README.md). + +### Skycoin command line interface + +[CLI command API](cmd/skycoin-cli/README.md). + +## Integrating Skycoin with your application + +[Skycoin Integration Documentation](INTEGRATION.md) + +## Contributing a node to the network + +Add your node's `ip:port` to the [peers.txt](peers.txt) file. +This file will be periodically uploaded to https://downloads.skycoin.com/blockchain/peers.txt +and used to seed client with peers. + +*Note*: Do not add Skywire nodes to `peers.txt`. +Only add Skycoin nodes with high uptime and a static IP address (such as a Skycoin node hosted on a VPS). + +## Creating a new coin + +See the [newcoin tool README](./cmd/newcoin/README.md) + +## Daemon CLI Options + +See the [Skycoin Daemon CLI options](./cmd/skycoin/README.md) + +## URI Specification + +Skycoin URIs obey the same rules as specified in Bitcoin's [BIP21](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki). +They use the same fields, except with the addition of an optional `hours` parameter, specifying the coin hours. + +Example Skycoin URIs: + +* `skycoin:2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY` +* `skycoin:2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY?amount=123.456&hours=70` +* `skycoin:2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY?amount=123.456&hours=70&label=friend&message=Birthday%20Gift` + +Additonally, if no `skycoin:` prefix is present when parsing, the string may be treated as an address: + +* `2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY` + +However, do not use this URI in QR codes displayed to the user, because the address can't be disambiguated from other Skyfiber coins. + +## Wire protocol user agent + +[Wire protocol user agent description](https://github.com/SkycoinProject/skycoin/wiki/Wire-protocol-user-agent) + +## Offline transaction signing + +Before doing the offline transaction signing, we need to have the unsigned transaction created. Using the `skycoin-cli` tool to create an unsigned transaction in hot wallet, and copy the hex encoded transaction to the computer where the cold wallet is installed. Then use the `skycoin-cli` tool to sign it offline. + +### Create an unsigned transaction + +The `skycoin-cli` tool replys on the APIs of the `skycoin node`, hence we have to start the node before running the tool. + + Go to the project root and run: + +```bash +$ ./run-client.sh -launch-browser=false +``` + +Once the node is started, we could use the following command to create an unsigned transaction. + +```bash +$ skycoin-cli createRawTransactionV2 $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT --unsign +``` + +> Note: Don't forget the `--unsign` flag, otherwise it would try to sign the transaction. + +
+ View Output + +```json +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ +Copy and save the generated transaction string. We will sign it with a cold wallet offline in the next section. + +### Sign the transaction + +The `skycoin node` needs to have the most recently `DB` so that the user would not lose much coin hours when signing the transaction. We could copy the full synchronized `data.db` from the hot wallet to the computer where the cold wallet is installed. And place it in `$HOME/.skycoin/data.db`. Then start the node with the network disabled. + +```bash +$ ./run-client.sh -launch-browser=false -disable-networking +``` + +Run the following command to sign the transaction: + +```bash +$ skycoin-cli signTransaction $RAW_TRANSACTION +``` + +The `$RAW_TRANSACTION` is the transaction string that we generated in the hot wallet. + +If the cold wallet is encrypted, you will be prompted to enter the password to sign the transaction. + +
+ View Output + +```json +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ +Once the transaction is signed, we could copy and save the signed transaction string and broadcast it in the hot wallet. + +```bash +$ skycoin-cli broadcastTransaction $SIGNED_RAW_TRANSACTION +``` + +A transaction id would be returned and you can check it in the [explorer](https://explorer.skycoin.com). + +## Deploy a public Skycoin API node with HTTPS + +We recommend using [caddy server](https://caddyserver.com/) to deploy a public Skycoin API node on a +Linux server. The public API node should have the `HTTPS` support, which could be handled automatically +by the `caddy server`. But we need to have a domain and create a DNS record to bind the server ip address +to it. + +Suppose we're going to deploy a Skycoin API node on `apitest.skycoin.com`, and we have already bound +the server's IP to it. Follow the steps below to complete the deployment. + +### Install and run a skycoin api node + +```bash +# Create a skycoin folder so that the files could be isolated +$ mkdir $HOME/skycoin && cd $HOME/skycoin +# Download the skycoin binary file +$ wget https://downloads.skycoin.com/wallet/skycoin-0.26.0-gui-standalone-linux-x64.tar.gz +$ tar -zxvf skycoin-0.26.0-gui-standalone-linux-x64.tar.gz +$ cd skycoin-0.26.0-gui-standalone-linux-x64 +$ ./skycoin -web-interface-port=6420 -host-whitelist=$DOMAIN_NAME -enable-api-sets="READ,TXN" +``` + +> Note: we should running the `skycoin` node with `-host-whitelist` flag, otherwise it would +> throw `403 Forbidden` error. + +### Install the caddy server + +```bash +# Create a caddy folder +$ mkdir $HOME/caddy && cd $HOME/caddy +# Download the caddy server binary file +$ wget https://github.com/caddyserver/caddy/releases/download/v1.0.4/caddy_v1.0.4_linux_amd64.tar.gz +$ tar -zxvf caddy_v1.0.4_linux_amd64.tar.gz +$ cd caddy_v1.0.4_linux_amd64 +``` + +The `caddy` tool would be exist in the folder, let's create a `Caddyfile` to define the reverse proxy +rules now. + +```bash +cat <Caddyfile +apitest.skycoin.com { + proxy / localhost:6420 { + transparent + } +} +EOF +``` + +Then run the caddy server + +```bash +$ ./caddy +``` + +You will be prompted to enter an email address to receive the notifications from let's Encrypt. +That's all about the deployment, check the https://apitest.skycoin.com/api/v1/version to see if +the Skycoin API node is working correctly. + +## Development + +We have two branches: `master` and `develop`. + +`develop` is the default branch and will have the latest code. + +`master` will always be equal to the current stable release on the website, and should correspond with the latest release tag. + +### Modules + +* `api` - REST API interface +* `cipher` - cryptographic library (key generation, addresses, hashes) +* `cipher/base58` - Base58 encoding +* `cipher/encoder` - reflect-based deterministic runtime binary encoder +* `cipher/encrypt` - at-rest data encryption (chacha20poly1305+scrypt) +* `cipher/go-bip39` - BIP-39 seed generation +* `cli` - CLI library +* `coin` - blockchain data structures (blocks, transactions, unspent outputs) +* `daemon` - top-level application manager, combining all components (networking, database, wallets) +* `daemon/gnet` - networking library +* `daemon/pex` - peer management +* `params` - configurable transaction verification parameters +* `readable` - JSON-encodable representations of internal structures +* `skycoin` - core application initialization and configuration +* `testutil` - testing utility methods +* `transaction` - methods for creating transactions +* `util` - miscellaneous utilities +* `visor` - top-level blockchain database layer +* `visor/blockdb` - low-level blockchain database layer +* `visor/historydb` - low-level blockchain database layer for historical blockchain metadata +* `wallet` - wallet file management + +### Client libraries + +Skycoin implements client libraries which export core functionality for usage from +other programming languages. + +* [libskycoin C client library and SWIG interface](https://github.com/skycoin/libskycoin) +* [skycoin-lite: Javascript and mobile bindings](https://github.com/SkycoinProject/skycoin-lite) + +### Running Tests + +```sh +$ make test +``` + +### Running Integration Tests + +There are integration tests for the CLI and HTTP API interfaces. They have two +run modes, "stable" and "live". + +The stable integration tests will use a skycoin daemon +whose blockchain is synced to a specific point and has networking disabled so that the internal +state does not change. + +The live integration tests should be run against a synced or syncing node with networking enabled. + +#### Stable Integration Tests + +```sh +$ make integration-test-stable +``` + +or + +```sh +$ ./ci-scripts/integration-test-stable.sh -v -w +``` + +The `-w` option, run wallet integrations tests. + +The `-v` option, show verbose logs. + +#### Live Integration Tests + +The live integration tests run against a live runnning skycoin node, so before running the test, we +need to start a skycoin node: + +```sh +$ ./run-daemon.sh +``` + +After the skycoin node is up, run the following command to start the live tests: + +```sh +$ make integration-test-live +``` + +The above command will run all tests except the wallet-related tests. To run wallet tests, we +need to manually specify a wallet file, and it must have at least `2 coins` and `256 coinhours`, +it also must have been loaded by the node. + +We can specify the wallet by setting two environment variables: + +* `API_WALLET_ID`, which is the filename (without path), that is loaded by the daemon to test against. + This is the `"id"` field in API requests. It is used by the API integration tests. + The wallet directory that the daemon uses can be controlled with the `-wallet-dir` option. +* `CLI_WALLET_FILE`, which is the filename (with path), to be used by the CLI integration tests + +If the wallet is encrypted, also set `WALLET_PASSWORD`. + +Example of running the daemon with settings for integration tests: + +```sh +$ export API_WALLET_ID="$valid_wallet_filename" +$ export CLI_WALLET_FILE="$HOME/.skycoin/wallets/$valid_wallet_filename" +$ export WALLET_PASSWORD="$wallet_password" +$ make run-integration-test-live +``` + +Then run the tests with the following command: + +```sh +$ make integration-test-live-wallet +``` + +There are two other live integration test modes for CSRF disabled and networking disabled. + +To run the CSRF disabled tests: + +```sh +$ export API_WALLET_ID="$valid_wallet_filename" +$ export CLI_WALLET_FILE="$HOME/.skycoin/wallets/$valid_wallet_filename" +$ export WALLET_PASSWORD="$wallet_password" +$ make run-integration-test-live-disable-csrf +``` + +```sh +$ make integration-test-live-disable-csrf +``` + +To run the networking disabled tests, which require a live wallet: + +```sh +$ export API_WALLET_ID="$valid_wallet_filename" +$ export CLI_WALLET_FILE="$HOME/.skycoin/wallets/$valid_wallet_filename" +$ export WALLET_PASSWORD="$wallet_password" +$ make run-integration-test-live-disable-networking +``` + +Then run the tests with the following command: + +```sh +$ make integration-test-live-wallet +``` + +#### Debugging Integration Tests + +Run specific test case: + +It's annoying and a waste of time to run all tests to see if the test we real care +is working correctly. There's an option: `-r`, which can be used to run specific test case. +For example: if we only want to test `TestStableAddressBalance` and see the result, we can run: + +```sh +$ ./ci-scripts/integration-test-stable.sh -v -r TestStableAddressBalance +``` + +#### Update golden files in integration testdata + +Golden files are expected data responses from the CLI or HTTP API saved to disk. +When the tests are run, their output is compared to the golden files. + +To update golden files, use the provided `make` command: + +```sh +$ make update-golden-files +``` + +We can also update a specific test case's golden file with the `-r` option. +For example: +```sh +$ ./ci-scripts/integration-test-stable.sh -v -u -r TestStableAddressBalance +``` + +### Test coverage + +Coverage is automatically generated for `make test` and integration tests run against a stable node. +This includes integration test coverage. The coverage output files are placed in `coverage/`. + +To merge coverage from all tests into a single HTML file for viewing: + +```sh +$ make check +$ make merge-coverage +``` + +Then open `coverage/all-coverage.html` in the browser. + +#### Test coverage for the live node + +Some tests can only be run with a live node, for example wallet spending tests. +To generate coverage for this, build and run the skycoin node in test mode before running the live integration tests. + +In one shell: + +```sh +$ make run-integration-test-live-cover +``` + +In another shell: + +```sh +$ make integration-test-live +``` + +After the tests have run, CTRL-C to exit the process from the first shell. +A coverage file will be generated at `coverage/skycoin-live.coverage.out`. + +Merge the coverage with `make merge-coverage` then open the `coverage/all-coverage.html` file to view it, +or generate the HTML coverage in isolation with `go tool cover -html` + +### Formatting + +All `.go` source files should be formatted `goimports`. You can do this with: + +```sh +$ make format +``` + +### Code Linting + +Install prerequisites: + +```sh +$ make install-linters +``` + +Run linters: + +```sh +$ make lint +``` + +### Profiling + +A full CPU profile of the program from start to finish can be obtained by running the node with the `-profile-cpu` flag. +Once the node terminates, a profile file is written to `-profile-cpu-file` (defaults to `cpu.prof`). +This profile can be analyzed with + +```sh +$ go tool pprof cpu.prof +``` + +The HTTP interface for obtaining more profiling data or obtaining data while running can be enabled with `-http-prof`. +The HTTP profiling interface can be controlled with `-http-prof-host` and listens on `localhost:6060` by default. + +See https://golang.org/pkg/net/http/pprof/ for guidance on using the HTTP profiler. + +Some useful examples include: + +```sh +$ go tool pprof http://localhost:6060/debug/pprof/profile?seconds=10 +$ go tool pprof http://localhost:6060/debug/pprof/heap +``` + +A web page interface is provided by http/pprof at http://localhost:6060/debug/pprof/. + +### Fuzzing + +Fuzz tests are run with [go-fuzz](https://github.com/dvyukov/go-fuzz). +[Follow the instructions on the go-fuzz page](https://github.com/dvyukov/go-fuzz) to install it. + +Fuzz tests are written for the following packages: + +#### base58 + +To fuzz the `cipher/base58` package, + +```sh +$ make fuzz-base58 +``` + +#### encoder + +To fuzz the `cipher/encoder` package, + +```sh +$ make fuzz-encoder +``` + +### Dependencies + +#### Rules + +Dependencies must not require `cgo`. This means dependencies cannot be wrappers around C libraries. +Requiring `cgo` breaks cross compilation and interferes with repeatable (deterministic) builds. + +Critical cryptographic dependencies used by code in package `cipher` are archived inside the `cipher` folder, +rather than in the `vendor` folder. This prevents a user of the `cipher` package from accidentally using a +different version of the `cipher` dependencies than were developed, which could have catastrophic but hidden problems. + +#### Management + +Dependencies are managed with [dep](https://github.com/golang/dep). + +To [install `dep` for development](https://github.com/golang/dep/blob/master/docs/installation.md#development): + +```sh +$ go get -u github.com/golang/dep/cmd/dep +``` + +`dep` vendors all dependencies into the repo. + +If you change the dependencies, you should update them as needed with `dep ensure`. + +Use `dep help` for instructions on vendoring a specific version of a dependency, or updating them. + +When updating or initializing, `dep` will find the latest version of a dependency that will compile. + +Examples: + +Initialize all dependencies: + +```sh +$ dep init +``` + +Update all dependencies: + +```sh +$ dep ensure -update -v +``` + +Add a single dependency (latest version): + +```sh +$ dep ensure github.com/foo/bar +``` + +Add a single dependency (more specific version), or downgrade an existing dependency: + +```sh +$ dep ensure github.com/foo/bar@tag +``` + +### Configuration Modes +There are 4 configuration modes in which you can run a skycoin node: +- Development Desktop Daemon +- Server Daemon +- Electron Desktop Client +- Standalone Desktop Client + +#### Development Desktop Client Mode +This mode is configured via `run-client.sh` +```bash +$ ./run-client.sh +``` + +#### Server Daemon Mode +The default settings for a skycoin node are chosen for `Server Daemon`, which is typically run from source. +This mode is usually preferred to be run with security options, though `-disable-csrf` is normal for server daemon mode, it is left enabled by default. + +```bash +$ ./run-daemon.sh +``` + +To disable CSRF: + +```bash +$ ./run-daemon.sh -disable-csrf +``` + +#### Electron Desktop Client Mode +This mode configures itself via electron-main.js + +#### Standalone Desktop Client Mode +This mode is configured by compiling with `STANDALONE_CLIENT` build tag. +The configuration is handled in `cmd/skycoin/skycoin.go` + +### Wallet GUI Development + +The compiled wallet source should be checked in to the repo, so that others do not need to install node to run the software. + +Instructions for doing this: + +[Wallet GUI Development README](src/gui/static/README.md) + +#### Translations + +You can find information about how to work with translation files in the [Translations README](./src/gui/static/src/assets/i18n/README.md). + +### Releases + +#### Update the version + +0. If the `master` branch has commits that are not in `develop` (e.g. due to a hotfix applied to `master`), merge `master` into `develop` +0. Make sure the translations are up to date. See the [i18n README](./src/gui/static/src/assets/i18n/README.md) for instructions on how to update translations and how to check if they are up to date. +0. Compile the `src/gui/static/dist/` to make sure that it is up to date (see [Wallet GUI Development README](src/gui/static/README.md)) +0. Update version strings to the new version in the following files: `electron/package-lock.json`, `electron/package.json`, `electron/skycoin/current-skycoin.json`, `src/cli/cli.go`, `src/gui/static/src/current-skycoin.json`, `src/cli/integration/testdata/status*.golden`, `template/coin.template`, `README.md` files . +0. If changes require a new database verification on the next upgrade, update `src/SkycoinProject/skycoin.go`'s `DBVerifyCheckpointVersion` value +0. Update `CHANGELOG.md`: move the "unreleased" changes to the version and add the date +0. Update the files in https://github.com/skycoin/repo-info by following the [metadata update procedure](https://github.com/skycoin/repo-info/#updating-skycoin-repository-metadate), +0. Merge these changes to `develop` +0. Follow the steps in [pre-release testing](#pre-release-testing) +0. Make a PR merging `develop` into `master` +0. Review the PR and merge it +0. Tag the `master` branch with the version number. Version tags start with `v`, e.g. `v0.20.0`. + Sign the tag. If you have your GPG key in github, creating a release on the Github website will automatically tag the release. + It can be tagged from the command line with `git tag -as v0.20.0 $COMMIT_ID`, but Github will not recognize it as a "release". +0. Make sure that the client runs properly from the `master` branch +0. Release builds are created and uploaded by travis. To do it manually, checkout the `master` branch and follow the [create release builds](electron/README.md) instructions. + +If there are problems discovered after merging to `master`, start over, and increment the 3rd version number. +For example, `v0.20.0` becomes `v0.20.1`, for minor fixes. + +#### Pre-release testing + +Performs these actions before releasing: + +* `make check` +* `make integration-test-live` +* `make integration-test-live-disable-networking` (requires node run with `-disable-networking`) +* `make integration-test-live-disable-csrf` (requires node run with `-disable-csrf`) +* `make intergration-test-live-wallet` (see [live integration tests](#live-integration-tests)) 6 times: with an unencrypted and encrypted wallet for each wallet type: `deterministic`, `bip44` and `collection` +* `go run cmd/skycoin-cli/skycoin-cli.go checkdb` against a fully synced database +* `go run cmd/skycoin-cli/skycoin-cli.go checkDBDecoding` against a fully synced database +* On all OSes, make sure that the client runs properly from the command line (`./run-client.sh` and `./run-daemon.sh`) +* Build the releases and make sure that the Electron client runs properly on Windows, Linux and macOS. + * Use a clean data directory with no wallets or database to sync from scratch and verify the wallet setup wizard. + * Load a test wallet with nonzero balance from seed to confirm wallet loading works + * Send coins to another wallet to confirm spending works + * Restart the client, confirm that it reloads properly +* For both the Android and iOS mobile wallets, configure the node url to be https://staging.node.skycoin.com + and test all operations to ensure it will work with the new node version. + +#### Creating release builds + +[Create Release builds](electron/README.md). + +#### Release signing + +Releases are signed with this PGP key: + +`0x913BBD5206B19620` + +The fingerprint for this key is: + +``` +pub ed25519 2019-09-17 [SC] [expires: 2023-09-16] + 98F934F04F9334B81DFA3398913BBD5206B19620 +uid [ultimate] iketheadore skycoin +sub cv25519 2019-09-17 [E] [expires: 2023-09-16] +``` + +Keybase.io account: https://keybase.io/iketheadore + +Follow the [Tor Project's instructions for verifying signatures](https://www.torproject.org/docs/verifying-signatures.html.en). + +If you can't or don't want to import the keys from a keyserver, the signing key is available in the repo: [iketheadore.asc](iketheadore.asc). + +Releases and their signatures can be found on the [releases page](https://github.com/SkycoinProject/skycoin/releases). + +Instructions for generating a PGP key, publishing it, signing the tags and binaries: +https://gist.github.com/iketheadore/6485585ce2d22231c2cb3cbc77e1d7b7 + +## Responsible Disclosure + +Security flaws in skycoin source or infrastructure can be sent to security@skycoin.com. +Bounties are available for accepted critical bug reports. + +PGP Key for signing: + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEXYCYPxYJKwYBBAHaRw8BAQdAeDPi3n9xLv5xGsxbcbwZjfV4h772W+GPZ3Mz +RS17STm0L2lrZXRoZWFkb3JlIHNreWNvaW4gPGx1eGFpcmxha2VAcHJvdG9ubWFp +bC5jb20+iJYEExYIAD4WIQSY+TTwT5M0uB36M5iRO71SBrGWIAUCXYCYPwIbAwUJ +B4TOAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCRO71SBrGWID0NAP0VRiNA +2Kq2uakPMqV29HY39DVhc9QgxJfMIwXWtFxKAwEAn0NqGRV/iKXNf+qxqAtMWa5X +F2S36hkEfDHO5W44DwC4OARdgJg/EgorBgEEAZdVAQUBAQdAeiEz/tUmCgOA67Rq +ANmHmX2vrdZp/SfJ9KOI2ANCCm8DAQgHiH4EGBYIACYWIQSY+TTwT5M0uB36M5iR +O71SBrGWIAUCXYCYPwIbDAUJB4TOAAAKCRCRO71SBrGWIJOJAQDTaqxpcLtAw5kH +Hp2jWvUnLudIONeqeUTCmkLJhcNv1wD+PFJZWMKD1btIG4pkXRW9YoA7M7t5by5O +x5I+LywZNww= +=p6Gq +-----END PGP PUBLIC KEY BLOCK----- +``` + + +Key ID: [0x913BBD5206B19620](https://pgp.mit.edu/pks/lookup?search=0x913BBD5206B19620&op=index) + +The fingerprint for this key is: + +``` +pub ed25519 2019-09-17 [SC] [expires: 2023-09-16] + 98F934F04F9334B81DFA3398913BBD5206B19620 +uid [ultimate] iketheadore skycoin +sub cv25519 2019-09-17 [E] [expires: 2023-09-16] +``` + +Keybase.io account: https://keybase.io/iketheadore diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/add-key.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/add-key.sh new file mode 100755 index 00000000..9a00d55d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/add-key.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +KEY_CHAIN=login.keychain +echo "security create keychain" +if ! security show-keychain-info $KEY_CHAIN ; then + security create-keychain -p $OSX_KEYCHAIN_PWD $KEY_CHAIN ; +fi +# Make the keychain the default so identities are found +echo "security default-keychain" +security default-keychain -s $KEY_CHAIN +# Unlock the keychain +echo "unlock the keychain" +security unlock-keychain -p $OSX_KEYCHAIN_PWD $KEY_CHAIN +# Set keychain locking timeout to 3600 seconds +echo "set keychain locking timeout to 3600" +security set-keychain-settings -t 3600 -u $KEY_CHAIN + +# Add certificates to keychain and allow codesign to access them +# security import ./electron/ci-scripts/certs/dist.cer -k $KEY_CHAIN -T /usr/bin/codesign +# security import ./electron/ci-scripts/certs/dev.cer -k $KEY_CHAIN -T /usr/bin/codesign +echo "import distp12" +security import $GOPATH/src/github.com/SkycoinProject/skycoin/ci-scripts/certs/dist.p12 -k $KEY_CHAIN -P $CERT_PWD -A /usr/bin/codesign + +echo "list keychains: " +security list-keychains +echo " ****** " + +echo "find indentities keychains: " +security find-identity -p codesigning ~/Library/Keychains/$KEY_CHAIN +echo " ****** " diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/build-wallet.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/build-wallet.sh new file mode 100755 index 00000000..cc43f2be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/build-wallet.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +echo "start to build wallets..." +pushd "electron" >/dev/null +if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./build.sh 'linux/amd64 linux/arm' ;fi +if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./build.sh 'darwin/amd64' ;fi +if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then ./build.sh 'windows/amd64 windows/386'; fi +ls release/ +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/certs/dist.p12 b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/certs/dist.p12 new file mode 100644 index 00000000..03e1889e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/certs/dist.p12 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-golangci-lint.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-golangci-lint.sh new file mode 100755 index 00000000..5e40dd1d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-golangci-lint.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +if [ -z "$VERSION" ]; then + echo "VERSION must be set" + exit 1 +fi + +# In alpine linux (as it does not come with curl by default) +wget -O - -q https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $GOPATH/bin v$VERSION + +golangci-lint --version diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-nodejs-win.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-nodejs-win.sh new file mode 100755 index 00000000..15a1780d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-nodejs-win.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +# Install nodejs with choco +choco install nodejs --version=8.11.0 -y +echo 'export PATH="/c/Program Files/nodejs:${PATH}";' >> ~/.bashrc diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-auth.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-auth.sh new file mode 100755 index 00000000..ae18083a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-auth.sh @@ -0,0 +1,166 @@ +#!/bin/bash +# Runs "stable"-mode tests against a skycoin node configured with a pinned database +# "stable" mode tests assume the blockchain data is static, in order to check API responses more precisely +# $TEST defines which test to run i.e, cli or api; If empty both are run + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN="${COIN:-skycoin}" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="stable" +BINARY="${COIN}-integration-auth.test" +TEST="" +UPDATE="" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +DISABLE_CSRF="-disable-csrf" +USE_CSRF="" +DISABLE_HEADER_CHECK="" +HEADER_CHECK="1" +DB_NO_UNCONFIRMED="" +DB_FILE="blockchain-180.db" +WEB_USERNAME="foobar" +WEB_PASSWORD="abcdef123" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-r -- Run test with -run flag" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-c -- Run tests with CSRF enabled" + echo "-d -- Run tests without unconfirmed transactions" + echo "-x -- Run test with header check disabled" + exit 1 +} + +while getopts "h?t:r:n:uvcd" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + r ) RUN_TESTS="-run ${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + d ) DB_NO_UNCONFIRMED="1"; DB_FILE="blockchain-180-no-unconfirmed.db";; + c ) DISABLE_CSRF=""; USE_CSRF="1";; + x ) DISABLE_HEADER_CHECK="-disable-header-check"; HEADER_CHECK=""; + esac +done + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) +GOLDFLAGS="-X ${CMDPKG}.Commit=${COMMIT} -X ${CMDPKG}.Branch=${BRANCH}" + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -ldflags "${GOLDFLAGS}" -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/$DB_FILE \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -web-interface-username=$WEB_USERNAME \ + -web-interface-password=$WEB_PASSWORD \ + -web-interface-plaintext-auth=true \ + -enable-all-api-sets=true \ + -wallet-dir="$WALLET_DIR" \ + $DISABLE_CSRF \ + $DISABLE_HEADER_CHECK \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE \ +SKYCOIN_NODE_HOST=$HOST SKYCOIN_NODE_USERNAME=$WEB_USERNAME SKYCOIN_NODE_PASSWORD=$WEB_PASSWORD \ +USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK DB_NO_UNCONFIRMED=$DB_NO_UNCONFIRMED \ + go test -count=1 ./src/api/integration/... $UPDATE -timeout=10m $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE \ +RPC_ADDR=$RPC_ADDR RPC_USER=$WEB_USERNAME RPC_PASS=$WEB_PASSWORD \ +USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK DB_NO_UNCONFIRMED=$DB_NO_UNCONFIRMED \ + go test -count=1 ./src/cli/integration/... $UPDATE -timeout=10m $VERBOSE $RUN_TESTS + +CLI_FAIL=$? + +fi + + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then + exit $CLI_FAIL +else + exit 0 +fi +# exit $FAIL diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-gui.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-gui.sh new file mode 100755 index 00000000..b53c4eee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-gui.sh @@ -0,0 +1,123 @@ +#!/bin/bash +# Runs "disable-gui"-mode tests against a skycoin node configured with -enable-gui=false +# and /api/v1/api endpoint should return 404 Not Found error + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN="${COIN:-skycoin}" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="disable-gui" +BINARY="${COIN}-integration-disable-gui.test" +TEST="" +RUN_TESTS="" +# run go test with -v flag +VERBOSE="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-v -- Run test with -v flag" + exit 1 +} + +while getopts "h?t:r:v" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + v ) VERBOSE="-v";; + r ) RUN_TESTS="-run ${OPTARG}";; + esac +done + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-all-api-sets=true \ + -enable-api-sets=INSECURE_WALLET_SEED \ + -enable-gui=false \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ + go test -count=1 ./src/api/integration/... -timeout=30s $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +else + exit 0 +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-wallet-api.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-wallet-api.sh new file mode 100755 index 00000000..1731d1d3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-wallet-api.sh @@ -0,0 +1,122 @@ +#!/bin/bash +# Runs "disable-wallet-api"-mode tests against a skycoin node configured with the wallet API disabled. +# "disable-wallet-api"-mode confirms that no wallet-related apis work, that the main index.html page +# does not load, and that a new wallet file is not created. + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN="${COIN:-skycoin}" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="disable-wallet-api" +BINARY="${COIN}-integration-disable-wallet-api.test" +UPDATE="" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +FAILFAST="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-r -- Run test with -run flag" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-f -- Run test with -failfast flag" + exit 1 +} + +while getopts "h?t:r:uvf" args; do + case $args in + h|\?) + usage; + exit;; + r ) RUN_TESTS="-run ${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + f ) FAILFAST="-failfast" + esac +done + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X ${CMDPKG}.Commit=${COMMIT} -X ${CMDPKG}.Branch=${BRANCH}" + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -ldflags "${GOLDFLAGS}" -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-all-api-sets=true \ + -disable-api-sets=WALLET \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST API_WALLET_DIR=$WALLET_DIR \ + go test -count=1 ./src/api/integration/... $FAILFAST $UPDATE -timeout=30s $VERBOSE $RUN_TESTS + +FAIL=$? + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + +exit $FAIL diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-enable-seed-api.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-enable-seed-api.sh new file mode 100755 index 00000000..68563dd5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-enable-seed-api.sh @@ -0,0 +1,135 @@ +#!/bin/bash +# Runs "enable-seed-api"-mode tests against a skycoin node configured with -enable-seed-api=true +# and /api/v1/wallet/seed api endpoint should return coresponding seed + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN=${COIN:-skycoin} +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="enable-seed-api" +BINARY="${COIN}-integration-enable-seed-api.test" +TEST="" +RUN_TESTS="" +# run go test with -v flag +VERBOSE="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-v -- Run test with -v flag" + exit 1 +} + +while getopts "h?t:r:v" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + v ) VERBOSE="-v";; + r ) RUN_TESTS="-run ${OPTARG}";; + esac +done + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-all-api-sets=true \ + -enable-api-sets=INSECURE_WALLET_SEED \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ + go test -count=1 ./src/api/integration/... -timeout=300s $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +# SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ +# go test -count=1 ./src/cli/integration/... -timeout=300s $VERBOSE $RUN_TESTS + +CLI_FAIL=$? + +fi + + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then + exit $CLI_FAIL +else + exit 0 +fi +# exit $FAIL diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-live.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-live.sh new file mode 100755 index 00000000..3fa175f6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-live.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Runs "live"-mode tests against a skycoin node that is already running +# "live" mode tests assume the blockchain data is active and may change at any time +# Data is checked for the appearance of correctness but the values themselves are not verified +# The skycoin node must be run with the wallet API enabled. + +#Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +COIN=${COIN:-skycoin} +PORT="6420" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="live" +TEST="" +UPDATE="" +TIMEOUT="60m" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +# run wallet tests +TEST_LIVE_WALLET="" +FAILFAST="" +USE_CSRF="" +HEADER_CHECK="1" +DISABLE_NETWORKING="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-r -- Run test with -run flag" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-w -- Run wallet tests" + echo "-f -- Run test with -failfast flag" + echo "-c -- Pass this argument if the node has CSRF enabled" + echo "-x -- Pass this argument if the node has header check disabled" + echo "-k -- Run the tests that require networking disabled (live node must be run with -disable-networking)" + exit 1 +} + +while getopts "h?t:r:uvwfck" args; do +case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + r ) RUN_TESTS="-run ${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + w ) TEST_LIVE_WALLET="--test-live-wallet";; + f ) FAILFAST="-failfast";; + c ) USE_CSRF="1";; + x ) HEADER_CHECK="";; + k ) DISABLE_NETWORKING="true" + esac +done + +set -euxo pipefail + +echo "checking if $COIN node is running" + +HEALTH="$HOST/api/v1/health" + +http_proxy="" https_proxy="" wget -O- $HEALTH 2>&1 >/dev/null + +if [ ! $? -eq 0 ]; then + echo "$COIN node is not running on $HOST" + exit 1 +fi + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST \ + LIVE_DISABLE_NETWORKING=$DISABLE_NETWORKING \ + go test -count=1 ./src/api/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ + SKYCOIN_NODE_HOST=$HOST USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK LIVE_DISABLE_NETWORKING=$DISABLE_NETWORKING \ + go test -count=1 ./src/cli/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET + +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-stable.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-stable.sh new file mode 100755 index 00000000..5ab32f26 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-stable.sh @@ -0,0 +1,163 @@ +#!/bin/bash +# Runs "stable"-mode tests against a skycoin node configured with a pinned database +# "stable" mode tests assume the blockchain data is static, in order to check API responses more precisely +# $TEST defines which test to run i.e, cli or api; If empty both are run + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN="${COIN:-skycoin}" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="stable" +NAME="" +TEST="" +UPDATE="" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +DISABLE_CSRF="-disable-csrf" +USE_CSRF="" +DISABLE_HEADER_CHECK="" +HEADER_CHECK="1" +DB_NO_UNCONFIRMED="" +DB_FILE="blockchain-180.db" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-r -- Run test with -run flag" + echo "-n -- Specific name for this test, affects coverage output files" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-c -- Run tests with CSRF enabled" + echo "-x -- Run test with header check disabled" + echo "-d -- Run tests without unconfirmed transactions" + exit 1 +} + +while getopts "h?t:r:n:uvcxd" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + r ) RUN_TESTS="-run ${OPTARG}";; + n ) NAME="-${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + d ) DB_NO_UNCONFIRMED="1"; DB_FILE="blockchain-180-no-unconfirmed.db";; + c ) DISABLE_CSRF=""; USE_CSRF="1";; + x ) DISABLE_HEADER_CHECK="-disable-header-check"; HEADER_CHECK=""; + esac +done + +BINARY="${COIN}-integration${NAME}.test" + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) +GOLDFLAGS="-X ${CMDPKG}.Commit=${COMMIT} -X ${CMDPKG}.Branch=${BRANCH}" + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -ldflags "${GOLDFLAGS}" -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/$DB_FILE \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -enable-all-api-sets=true \ + -wallet-dir="$WALLET_DIR" \ + $DISABLE_CSRF \ + $DISABLE_HEADER_CHECK \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST \ + USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK DB_NO_UNCONFIRMED=$DB_NO_UNCONFIRMED COIN=$COIN \ + go test -count=1 ./src/api/integration/... $UPDATE -timeout=10m $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ + USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK DB_NO_UNCONFIRMED=$DB_NO_UNCONFIRMED COIN=$COIN \ + go test -count=1 ./src/cli/integration/... $UPDATE -timeout=10m $VERBOSE $RUN_TESTS + +CLI_FAIL=$? + +fi + + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then + exit $CLI_FAIL +else + exit 0 +fi +# exit $FAIL diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/lint-and-test.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/lint-and-test.sh new file mode 100755 index 00000000..de9f9fc0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/lint-and-test.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +make check-newcoin +make lint +make test-386 +make test-amd64 +make integration-tests-stable +make lint-ui +make build-ui-travis +make test-ui +make test-ui-e2e diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node-cover.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node-cover.sh new file mode 100755 index 00000000..a163bbfd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node-cover.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +# Runs the node with configuration necessary for running the live integration tests, +# with coverage enabled + +set -exu + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +pushd "$DIR/.." >/dev/null + +COIN=${COIN:-skycoin} +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" +BINARY="${COIN}-live.test" +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +go test -c -ldflags "-X ${CMDPKG}.Commit=$COMMIT -X ${CMDPKG}.Branch=${BRANCH}" -tags testrunmain -o "${BINARY}" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +./${BINARY} \ + -gui-dir="${DIR}/src/gui/static/" \ + -launch-browser=false \ + -enable-all-api-sets=true \ + -enable-api-sets=INSECURE_WALLET_SEED \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node.sh new file mode 100755 index 00000000..a8b010bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +# Runs the node with configuration necessary for running the live integration tests + +set -exu + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +pushd "$DIR/.." >/dev/null + +COIN=${COIN:-skycoin} +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +go run -ldflags "${GOLDFLAGS}" cmd/${COIN}/${COIN}.go \ + -gui-dir="${DIR}/src/gui/static/" \ + -launch-browser=false \ + -enable-all-api-sets=true \ + -enable-api-sets=INSECURE_WALLET_SEED \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/ui-e2e.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/ui-e2e.sh new file mode 100755 index 00000000..94323f45 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/ui-e2e.sh @@ -0,0 +1,123 @@ +#!/bin/bash +# Runs UI e2e tests against a skycoin node configured with a pinned database + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_ADDR="127.0.0.1:$PORT" +HOST="http://127.0.0.1:$PORT" +BINARY="skycoin-integration" +E2E_PROXY_CONFIG=$(mktemp -t e2e-proxy.config.XXXXXX.js) + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Create a dummy wallet with an address existing in the blockchain-180.db dataset +mkdir "$WALLET_DIR" +cat >"${WALLET_DIR}/test_wallet.wlt" <$E2E_PROXY_CONFIG < 64 { + wg.Done() + continue + } + + j.jobID = i + go func(jb job) { + defer wg.Done() + data := generateBip32SeedTestData(jb) + signBip32SeedTestData(data, inputs.Hashes) + seedTestData <- data + }(j) + } + wg.Wait() + + close(seedTestData) + + <-writeDone +} + +func generateInputTestData(inputsCount int) *testsuite.InputTestData { + var hashes []cipher.SHA256 + + // Add a hash which is all zeroes + hashes = append(hashes, cipher.SumSHA256(bytes.Repeat([]byte{0}, 32))) + // Add a hash which is all ones + hashes = append(hashes, cipher.SumSHA256(bytes.Repeat([]byte{1}, 32))) + + for i := 0; i < inputsCount; i++ { + hashes = append(hashes, cipher.SumSHA256(cipher.RandByte(32))) + } + + return &testsuite.InputTestData{ + Hashes: hashes, + } +} + +func generateSeedTestData(j job) *testsuite.SeedTestData { + data := &testsuite.SeedTestData{ + Seed: j.seed, + Keys: make([]testsuite.KeysTestData, j.addressCount), + } + + keys := cipher.MustGenerateDeterministicKeyPairs(j.seed, j.addressCount) + + for i, s := range keys { + data.Keys[i].Secret = s + + p := cipher.MustPubKeyFromSecKey(s) + data.Keys[i].Public = p + + addr := cipher.AddressFromPubKey(p) + data.Keys[i].Address = addr + + bitcoinAddr := cipher.BitcoinAddressFromPubKey(p) + data.Keys[i].BitcoinAddress = bitcoinAddr + } + + return data +} + +func signSeedTestData(data *testsuite.SeedTestData, hashes []cipher.SHA256) { + for i := range data.Keys { + for _, h := range hashes { + sig := cipher.MustSignHash(h, data.Keys[i].Secret) + data.Keys[i].Signatures = append(data.Keys[i].Signatures, sig) + } + } +} + +func generateBip32SeedTestData(j job) *testsuite.Bip32SeedTestData { + basePath := "m/44'/0'/0'/0" + + // Generate paths 0-4, 100, FirstHardenedChild-1 + childNumbers := []uint32{ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + bip32.FirstHardenedChild - 100, + bip32.FirstHardenedChild - 1, + } + + data := &testsuite.Bip32SeedTestData{ + Seed: j.seed, + BasePath: basePath, + ChildNumbers: childNumbers, + Keys: make([]testsuite.Bip32KeysTestData, len(childNumbers)), + } + + mk, err := bip32.NewPrivateKeyFromPath(j.seed, basePath) + if err != nil { + panic(err) + } + + // Generate child addresses for various indices + for i, n := range childNumbers { + pk, err := mk.NewPrivateChildKey(n) + if err != nil { + panic(err) + } + + secKey := cipher.MustNewSecKey(pk.Key) + pubKey := cipher.MustPubKeyFromSecKey(secKey) + + data.Keys[i] = testsuite.Bip32KeysTestData{ + Path: fmt.Sprintf("%s/%d", basePath, n), + XPriv: pk, + KeysTestData: testsuite.KeysTestData{ + Secret: secKey, + Public: pubKey, + Address: cipher.AddressFromPubKey(pubKey), + BitcoinAddress: cipher.BitcoinAddressFromPubKey(pubKey), + }, + } + } + + return data +} + +func signBip32SeedTestData(data *testsuite.Bip32SeedTestData, hashes []cipher.SHA256) { + for i := range data.Keys { + for _, h := range hashes { + sig := cipher.MustSignHash(h, data.Keys[i].Secret) + data.Keys[i].Signatures = append(data.Keys[i].Signatures, sig) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/connection/connection.go b/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/connection/connection.go new file mode 100644 index 00000000..0e27822e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/connection/connection.go @@ -0,0 +1,220 @@ +package connection + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "net" + "reflect" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/util/iputil" +) + +const ( + // Byte size of the length prefix in message, sizeof(int32) + messagePrefixLength = 4 +) + +var ( + maxMessageLength = gnet.NewConfig().MaxIncomingMessageLength +) + +// Connection is a connection to the peer +type Connection struct { + IP string + Port uint16 + ConnectTimeout time.Duration + ReadTimeout time.Duration + conn net.Conn +} + +func init() { + gnet.RegisterMessage(gnet.MessagePrefixFromString("INTR"), daemon.IntroductionMessage{}) +} + +// NewConnection constructs new connection +func NewConnection(addr string, connectTimeout, readTimeout time.Duration) (*Connection, error) { + ip, port, err := iputil.SplitAddr(addr) + if err != nil { + return nil, err + } + + return &Connection{ + IP: ip, + Port: port, + ConnectTimeout: connectTimeout, + ReadTimeout: readTimeout, + }, nil +} + +// Connect tries to connect to the node +func (c *Connection) Connect() error { + conn, err := net.DialTimeout("tcp", + fmt.Sprintf("%s:%v", c.IP, c.Port), c.ConnectTimeout) + if err != nil { + return err + } + + c.conn = conn + + return nil +} + +// TryReadIntroductionMessage tries to read the introduction message from the peer. If +// it succeeds - returns the received message for further processing +func (c *Connection) TryReadIntroductionMessage() (*daemon.IntroductionMessage, error) { + reader := bufio.NewReader(c.conn) + buf := make([]byte, 1024) + buffer := &bytes.Buffer{} + + for { + if err := c.conn.SetReadDeadline(time.Now().Add(c.ReadTimeout)); err != nil { + return nil, err + } + + bytesWritten, err := writeToBuffer(buffer, reader, buf) + if err != nil { + return nil, err + } + if bytesWritten == 0 { + continue + } + + // decode data + msgBytes, err := fetchNextMessage(buffer, maxMessageLength) + if err != nil { + return nil, err + } + + if len(msgBytes) > 0 { + m, err := convertToMessage(msgBytes) + if err != nil { + return nil, err + } + + introductionMessage, ok := m.(*daemon.IntroductionMessage) + if !ok { + // TODO: fix error message + return nil, fmt.Errorf("wrong message") + } + + return introductionMessage, nil + } + } +} + +// Disconnect disconnects from the peer +func (c *Connection) Disconnect() error { + return c.conn.Close() +} + +// writeToBuffer reads from `src` and writes the received data to `dst`. Reuses `buf` +// to avoid reallocations +func writeToBuffer(dst *bytes.Buffer, src io.Reader, buf []byte) (int, error) { + c, err := src.Read(buf) + if err != nil { + return 0, err + } + if c == 0 { + return 0, nil + } + + return dst.Write(buf[:c]) +} + +// convertToMessage converts the byte array to the gnet.Message +func convertToMessage(msg []byte) (gnet.Message, error) { + msgID := [4]byte{} + if len(msg) < len(msgID) { + return nil, gnet.ErrDisconnectTruncatedMessageID + } + + copy(msgID[:], msg[:len(msgID)]) + + msg = msg[len(msgID):] + t, ok := gnet.MessageIDReverseMap[msgID] + if !ok { + return nil, gnet.ErrDisconnectUnknownMessage + } + + v := reflect.New(t) + m, ok := (v.Interface()).(gnet.Message) + if !ok { + return nil, errors.New("MessageIdMaps contain non-Message") + } + + used, err := deserializeMessage(msg, v) + if err != nil { + return nil, gnet.ErrDisconnectMalformedMessage + } + + if used != uint64(len(msg)) { + return nil, gnet.ErrDisconnectMessageDecodeUnderflow + } + + return m, nil +} + +// deserializeMessage wraps Serializer.Decode and traps panics as an error +func deserializeMessage(msg []byte, v reflect.Value) (n uint64, err error) { + defer func() { + if r := recover(); r != nil { + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("message deserialization failed") + } + } + }() + + iface := v.Interface() + x, ok := iface.(gnet.Serializer) + if !ok { + return 0, errors.New("deserializeMessage object does not have Serializer interface") + } + + return x.Decode(msg) +} + +// fetchNextMessage retrieves single message from `buf` if any +func fetchNextMessage(buf *bytes.Buffer, maxMsgLength int) ([]byte, error) { + var data []byte + + if buf.Len() > messagePrefixLength { + prefix := buf.Bytes()[:messagePrefixLength] + // decode message length + tmpLength, _, err := encoder.DeserializeUint32(prefix) + if err != nil { + return nil, err + } + + length := int(tmpLength) + + // Disconnect if we received an invalid length + if length < messagePrefixLength || length > maxMsgLength { + return []byte{}, gnet.ErrDisconnectInvalidMessageLength + } + + if buf.Len()-messagePrefixLength < length { + return []byte{}, nil + } + + buf.Next(messagePrefixLength) // strip the length prefix + data = make([]byte, length) + _, err = buf.Read(data) + if err != nil { + return []byte{}, err + } + } + + return data, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/monitor-peers.go b/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/monitor-peers.go new file mode 100644 index 00000000..35ec73ac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/monitor-peers.go @@ -0,0 +1,306 @@ +/* +monitor-peers checks the status of peers. + +It takes in a list of peers (ip:ports, newline separated, skipping comments and empty lines). +The tool connects to each of the peers, waits for the introduction packet (or times out) +and produces a report with the status of the peer (unreachable, reachable, sent_introduction, introduction_parameters). +Introduction_parameters were added in v0.25.0 so will be absent for earlier peer versions. +*/ +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "net" + "os" + "regexp" + "strconv" + "strings" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/cmd/monitor-peers/connection" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// PeerState is a current state of the peer +type PeerState string + +const ( + // StateUnreachable is set when a peer couldn't be reached + StateUnreachable = "unreachable" + // StateReachable is set when a connection to the peer was successful + StateReachable = "reachable" + // StateSentIntroduction is set when an introduction message was received from the peer + // and successfully parsed + StateSentIntroduction = "introduced" +) + +// Report contains remote `peers.txt` report data. +type Report []ReportEntry + +// ReportEntry contains report data of a peer. +type ReportEntry struct { + Address string + State PeerState + Introduction *daemon.IntroductionMessage + IntroValidationErr error +} + +func (re ReportEntry) String() string { + uaCoin := "-" + uaVersion := "-" + uaRemark := "-" + verifyTxBurnFactor := "-" + verifyTxMaxTxSize := "-" + verifyTxMaxDropletPrecision := "-" + introValidationErr := "-" + + if re.Introduction != nil { + if re.Introduction.UserAgent.Coin != "" { + uaCoin = re.Introduction.UserAgent.Coin + } + if re.Introduction.UserAgent.Version != "" { + uaVersion = re.Introduction.UserAgent.Version + } + if re.Introduction.UserAgent.Remark != "" { + uaRemark = re.Introduction.UserAgent.Remark + } + + verifyTxBurnFactor = strconv.FormatUint(uint64(re.Introduction.UnconfirmedVerifyTxn.BurnFactor), 10) + verifyTxMaxTxSize = strconv.FormatUint(uint64(re.Introduction.UnconfirmedVerifyTxn.MaxTransactionSize), 10) + verifyTxMaxDropletPrecision = strconv. + FormatUint(uint64(re.Introduction.UnconfirmedVerifyTxn.MaxDropletPrecision), 10) + } + + if re.IntroValidationErr != nil { + introValidationErr = re.IntroValidationErr.Error() + } + + return fmt.Sprintf(reportFormat, re.Address, re.State, uaCoin, uaVersion, uaRemark, + verifyTxBurnFactor, verifyTxMaxTxSize, verifyTxMaxDropletPrecision, introValidationErr) +} + +// Append constructs the new report entry and appends it to the report +func (r Report) Append(addr string, state PeerState, introduction *daemon.IntroductionMessage, + introValidationErr error) Report { + entry := ReportEntry{ + Address: addr, + State: state, + IntroValidationErr: introValidationErr, + Introduction: introduction, + } + + return append(r, entry) +} + +const ( + blockchainPubKey = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" + defaultConnectTimeout = "1s" + defaultReadTimeout = "1s" + defaultPeersFile = "peers.txt" + addrWidth = "25" + stateWidth = "15" + uaCoinWidth = "10" + uaVersionWidth = "10" + uaRemarkWidth = "10" + verifyTxBurnFactorWidth = "10" + verifyTxMaxTxSizeWidth = "10" + verifyTxMaxDropletPrecisionWidth = "20" + reportFormat = "%-" + addrWidth + "s\t%-" + stateWidth + "s\t%-" + uaCoinWidth + "s\t%-" + + uaVersionWidth + "s\t%-" + uaRemarkWidth + "s\t%-" + verifyTxBurnFactorWidth + "s\t%-" + + verifyTxMaxTxSizeWidth + "s\t%-" + verifyTxMaxDropletPrecisionWidth + "s\t%v\n" +) + +var ( + logger = logging.MustGetLogger("main") + // For removing inadvertent whitespace from addresses + whitespaceFilter = regexp.MustCompile(`\s`) + help = fmt.Sprintf(`monitor-peers checks the status of peers. + +By default it gets peers list from %s. May be overridden with -f flag. + +The default connect timeout is %s. May be overridden with -ctimeout flag. The timeout is parsed by time.ParseDuration. + +The default read timeout is %s. May be overridden with -rtimeout flag. The timeout is parsed by time.ParseDuration. + +It generates a report for each peer which contains the peer address and status. Status may be one of the following: + +- unreachable +No connection made. + +- reachable +Connection made, no introduction message received. + +- introduced +Connection made, introduction message received. +`, defaultPeersFile, defaultConnectTimeout, defaultReadTimeout) +) + +func init() { + flag.Usage = func() { + fmt.Fprintf(flag.CommandLine.Output(), "%s\n\nUsage of %s:\n", help, os.Args[0]) + flag.PrintDefaults() + } +} + +func main() { + peersFile := flag.String("f", defaultPeersFile, "file containing peers") + connectTimeoutStr := flag.String("ctimeout", defaultConnectTimeout, "connect timeout for each peer") + readTimeoutStr := flag.String("rtimeout", defaultReadTimeout, "read timeout for each peer") + + flag.Parse() + + connectTimeout, err := time.ParseDuration(*connectTimeoutStr) + if err != nil { + fmt.Fprintln(os.Stderr, "Bad connect timeout: ", *connectTimeoutStr) + os.Exit(1) + } + + logger.Infof("Peer connection threshold is %v", connectTimeout) + + readTimeout, err := time.ParseDuration(*readTimeoutStr) + if err != nil { + fmt.Fprintln(os.Stderr, "Bad read timeout: ", *readTimeoutStr) + os.Exit(1) + } + + logger.Infof("Peer read threshold is %v", readTimeout) + + peers, err := getPeersListFromFile(*peersFile) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + report := getPeersReport(peers, connectTimeout, readTimeout) + logger.Infof("Report:\n%v", buildReport(report)) +} + +// getPeersListFromFile parses a local `filePath` file +// The peers list format is newline separated list of ip:port strings +// Empty lines and lines that begin with # are treated as comment lines +// Otherwise, the line is parsed as an ip:port +// If the line fails to parse, an error is returned +// Localhost addresses are allowed if allowLocalhost is true +func getPeersListFromFile(filePath string) ([]string, error) { + body, err := ioutil.ReadFile(filePath) + if err != nil { + return nil, err + } + + var peers []string + for _, addr := range strings.Split(string(body), "\n") { + addr = whitespaceFilter.ReplaceAllString(addr, "") + if addr == "" { + continue + } + + if strings.HasPrefix(addr, "#") { + continue + } + + a, err := validateAddress(addr, true) + if err != nil { + err = fmt.Errorf("peers list has invalid address %s: %v", addr, err) + logger.WithError(err).Error() + return nil, err + } + + peers = append(peers, a) + } + + return peers, nil +} + +// getPeersReport loops through `peers`, connects to each and tries to read the introduction +// message. Builds and returns the report +func getPeersReport(peers []string, connectTimeout, readTimeout time.Duration) Report { + dc := daemon.NewDaemonConfig() + dc.BlockchainPubkey = cipher.MustPubKeyFromHex(blockchainPubKey) + + report := make(Report, 0, len(peers)) + + for _, addr := range peers { + conn, err := connection.NewConnection(addr, connectTimeout, readTimeout) + if err != nil { + logger.WithError(err).Error() + continue + } + + if err := conn.Connect(); err != nil { + report = report.Append(addr, StateUnreachable, nil, nil) + continue + } + + introduction, err := conn.TryReadIntroductionMessage() + if err != nil { + report = report.Append(addr, StateReachable, nil, nil) + continue + } + + if err := introduction.Verify(dc, logrus.Fields{ + "addr": addr, + }); err != nil { + report = report.Append(addr, StateSentIntroduction, introduction, err) + continue + } + + report = report.Append(addr, StateSentIntroduction, introduction, nil) + + if err := conn.Disconnect(); err != nil { + logger.WithError(err).Error() + } + } + + return report +} + +// buildReport builds a report to a string output +func buildReport(report Report) string { + var sb strings.Builder + + sb.WriteString(fmt.Sprintf(reportFormat, "Address", "Status", "Coin", "Version", "Remark", + "Burn factor", "Max tx size", "Max droplet precision", "Intro validation error")) + for _, entry := range report { + sb.WriteString(entry.String()) + } + + return sb.String() +} + +// validateAddress returns a sanitized address if valid, otherwise an error +func validateAddress(ipPort string, allowLocalhost bool) (string, error) { + ipPort = whitespaceFilter.ReplaceAllString(ipPort, "") + pts := strings.Split(ipPort, ":") + if len(pts) != 2 { + return "", pex.ErrInvalidAddress + } + + ip := net.ParseIP(pts[0]) + if ip == nil { + return "", pex.ErrInvalidAddress + } else if ip.IsLoopback() { + if !allowLocalhost { + return "", pex.ErrNoLocalhost + } + } else if !ip.IsGlobalUnicast() { + return "", pex.ErrNotExternalIP + } + + port, err := strconv.ParseUint(pts[1], 10, 16) + if err != nil { + return "", pex.ErrInvalidAddress + } + + if port < 1024 { + return "", pex.ErrPortTooLow + } + + return ipPort, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/README.md b/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/README.md new file mode 100644 index 00000000..8b14e071 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/README.md @@ -0,0 +1,69 @@ +# Fiber Coin Creator CLI Documention +This tool can be used to create a new fiber coin easily from a config file. +- [Install](#install) + - [Usage](#usage) + - [Create New Coin](#create-new-coin) + - [Example](#example) + +## Install + +```bash +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin/cmd/newcoin +$ go install ./... +``` + +## Usage + +After the installation, you can run `newcoin` to see the usage: + +``` +$ newcoin + +NAME: + newcoin - newcoin is a helper tool for creating new fiber coins + +USAGE: + newcoin [global options] command [command options] [arguments...] + +VERSION: + 0.1 + +COMMANDS: + createcoin Create a new coin from a template file + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS: + --help, -h show help + --version, -v print the version +``` + +### Create New Coin +When using the `newcoin` command, you should run it from the `$GOPATH/src/github.com/SkycoinProject/skycoin` folder to utilise the built in default templates. + +```bash +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ newcoin createcoin [command options] +``` + +``` +OPTIONS: + --coin value name of the coin to create (default: "skycoin") + --template-dir value, --td value template directory path (default: "./template") + --coin-template-file value, --ct value coin template file (default: "coin.template") + --visor-template-file value, --vt value visor template file (default: "visor_parameters.template") + --config-dir value, --cd value config directory path (default: "./") + --config-file value, --cf value config file path (default: "fiber.toml") +``` + +#### Example +Create a test coin using application defaults. + +```bash +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ newcoin createcoin --coin testcoin +``` + +This will create a new directory, `testcoin`, in `cmd` folder and a `testcoin.go` file inside that folder. +It will also use the built-in defaul options (specified above) and draw template configuration from `$GOPATH/src/github.com/SkycoinProject/skycoin/template` + +This file can be used to run a "testcoin" node. diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/newcoin.go b/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/newcoin.go new file mode 100644 index 00000000..db434610 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/newcoin.go @@ -0,0 +1,231 @@ +/* +newcoin generates a new coin cmd from a toml configuration file +*/ +package main + +import ( + "fmt" + "regexp" + + "os" + "path/filepath" + "text/template" + + "github.com/urfave/cli" + + "github.com/SkycoinProject/skycoin/src/fiber" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +const ( + // Version is the cli version + Version = "0.1" +) + +var ( + app = cli.NewApp() + log = logging.MustGetLogger("newcoin") +) + +func init() { + app.Name = "newcoin" + app.Usage = "newcoin is a helper tool for creating new fiber coins" + app.Version = Version + commands := cli.Commands{ + createCoinCommand(), + } + + app.Commands = commands + app.EnableBashCompletion = true + app.OnUsageError = func(context *cli.Context, err error, _ bool) error { + fmt.Fprintf(context.App.Writer, "error: %v\n\n", err) + return cli.ShowAppHelp(context) + } + app.CommandNotFound = func(_ *cli.Context, command string) { + tmp := fmt.Sprintf("{{.HelpName}}: '%s' is not a {{.HelpName}} "+ + "command. See '{{.HelpName}} --help'. \n", command) + cli.HelpPrinter(app.Writer, tmp, app) + } +} + +func createCoinCommand() cli.Command { + name := "createcoin" + return cli.Command{ + Name: name, + Usage: "Create a new coin from a template file", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "coin", + Usage: "name of the coin to create", + Value: "skycoin", + }, + cli.StringFlag{ + Name: "template-dir, td", + Usage: "template directory path", + Value: "./template", + }, + cli.StringFlag{ + Name: "coin-template-file, ct", + Usage: "coin template file", + Value: "coin.template", + }, + cli.StringFlag{ + Name: "coin-test-template-file, ctt", + Usage: "coin test template file", + Value: "coin_test.template", + }, + cli.StringFlag{ + Name: "params-template-file, pt", + Usage: "params template file", + Value: "params.template", + }, + cli.StringFlag{ + Name: "config-dir, cd", + Usage: "config directory path", + Value: "./", + }, + cli.StringFlag{ + Name: "config-file, cf", + Usage: "config file path", + Value: "fiber.toml", + }, + }, + Action: func(c *cli.Context) error { + // -- parse flags -- // + + coinName := c.String("coin") + + if err := validateCoinName(coinName); err != nil { + return err + } + + templateDir := c.String("template-dir") + + coinTemplateFile := c.String("coin-template-file") + coinTestTemplateFile := c.String("coin-test-template-file") + paramsTemplateFile := c.String("params-template-file") + + // check that the coin template file exists + if _, err := os.Stat(filepath.Join(templateDir, coinTemplateFile)); os.IsNotExist(err) { + return err + } + // check that the coin test template file exists + if _, err := os.Stat(filepath.Join(templateDir, coinTestTemplateFile)); os.IsNotExist(err) { + return err + } + // check that the params template file exists + if _, err := os.Stat(filepath.Join(templateDir, paramsTemplateFile)); os.IsNotExist(err) { + return err + } + + configFile := c.String("config-file") + configDir := c.String("config-dir") + + configFilepath := filepath.Join(configDir, configFile) + // check that the config file exists + if _, err := os.Stat(configFilepath); os.IsNotExist(err) { + return err + } + + // -- parse template and create new coin.go and config blockchain.go -- // + + config, err := fiber.NewConfig(configFile, configDir) + if err != nil { + log.Errorf("failed to create new fiber coin config") + return err + } + + coinDir := fmt.Sprintf("./cmd/%s", coinName) + // create new coin directory + // MkdirAll does not error out if the directory already exists + err = os.MkdirAll(coinDir, 0750) + if err != nil { + log.Errorf("failed to create new coin directory %s", coinDir) + return err + } + + // we have to always create a new file otherwise the templating gives an error + coinFilePath := fmt.Sprintf("./cmd/%[1]s/%[1]s.go", coinName) + coinFile, err := os.Create(coinFilePath) + if err != nil { + log.Errorf("failed to create new coin file %s", coinFilePath) + return err + } + defer coinFile.Close() + + coinTestFilePath := fmt.Sprintf("./cmd/%[1]s/%[1]s_test.go", coinName) + coinTestFile, err := os.Create(coinTestFilePath) + if err != nil { + log.Errorf("failed to create new coin test file %s", coinTestFilePath) + return err + } + defer coinTestFile.Close() + + paramsFilePath := "./src/params/params.go" + paramsFile, err := os.Create(paramsFilePath) + if err != nil { + log.Errorf("failed to create new file %s", paramsFilePath) + return err + } + defer paramsFile.Close() + + // change dir so that text/template can parse the file + err = os.Chdir(templateDir) + if err != nil { + log.Errorf("failed to change directory to %s", templateDir) + return err + } + + templateFiles := []string{ + coinTemplateFile, + coinTestTemplateFile, + paramsTemplateFile, + } + + t := template.New(coinTemplateFile) + t, err = t.ParseFiles(templateFiles...) + if err != nil { + log.Errorf("failed to parse template files: %v", templateFiles) + return err + } + + config.Node.CoinName = coinName + config.Node.DataDirectory = "$HOME/." + coinName + + err = t.ExecuteTemplate(coinFile, coinTemplateFile, config.Node) + if err != nil { + log.Error("failed to parse coin template variables") + return err + } + + err = t.ExecuteTemplate(coinTestFile, coinTestTemplateFile, nil) + if err != nil { + log.Error("failed to parse coin test template variables") + return err + } + + err = t.ExecuteTemplate(paramsFile, paramsTemplateFile, config.Params) + if err != nil { + log.Error("failed to parse params template variables") + return err + } + + return nil + }, + } +} + +func validateCoinName(s string) error { + x := regexp.MustCompile(fmt.Sprintf(`^%s$`, useragent.NamePattern)) + if !x.MatchString(s) { + return fmt.Errorf("invalid coin name. must only contain the characters %s", useragent.NamePattern) + } + return nil +} + +func main() { + if e := app.Run(os.Args); e != nil { + log.Fatal(e) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/README.md b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/README.md new file mode 100644 index 00000000..c7ad94b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/README.md @@ -0,0 +1,3132 @@ +# CLI Documentation + +Skycoin command line interface + +The CLI command APIs can be used directly from a Go application, see [Skycoin CLI Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/cli). + + + +- [Install](#install) +- [Environment Settings](#environment-settings) + - [RPC_ADDR](#rpc_addr) + - [RPC_USER](#rpc_user) + - [RPC_PASS](#rpc_pass) +- [Usage](#usage) + - [Add Private Key](#add-private-key) + - [Check address balance](#check-address-balance) + - [Generate addresses](#generate-addresses) + - [Generate distribution addresses for a new fiber coin](#generate-distribution-addresses-for-a-new-fiber-coin) + - [Check address outputs](#check-address-outputs) + - [Check block data](#check-block-data) + - [Check database integrity](#check-database-integrity) + - [Create a raw transaction](#create-a-raw-transaction) + - [Create an unsigned raw transaction](#create-an-unsigned-raw-transaction) + - [Sign an unsigned raw transaction](#sign-an-unsigned-raw-transaction) + - [Decode a raw transaction](#decode-a-raw-transaction) + - [Encode a JSON transaction](#encode-a-json-transaction) + - [Broadcast a raw transaction](#broadcast-a-raw-transaction) + - [Create a wallet](#create-a-wallet) + - [Add addresses to a wallet](#add-addresses-to-a-wallet) + - [Export a specific key from an HD wallet](#export-a-specific-key-from-an-hd-wallet) + - [Encrypt Wallet](#encrypt-wallet) + - [Examples](#examples) + - [Decrypt Wallet](#decrypt-wallet) + - [Example](#example) + - [Last blocks](#last-blocks) + - [List wallet addresses](#list-wallet-addresses) + - [List wallets](#list-wallets) + - [Rich list](#rich-list) + - [Send](#send) + - [Show Seed](#show-seed) + - [Show Config](#show-config) + - [Status](#status) + - [Get transaction](#get-transaction) + - [Get address transactions](#get-address-transactions) + - [Verify address](#verify-address) + - [Check wallet balance](#check-wallet-balance) + - [List wallet transaction history](#list-wallet-transaction-history) + - [List wallet outputs](#list-wallet-outputs) + - [Richlist](#richlist) + - [Address Count](#address-count) + - [CLI version](#cli-version) + - [Distribute coins from genesis block](#distribute-coins-from-genesis-block) + + + + +## Install + +```bash +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin/cmd/skycoin-cli +$ go install ./... +``` + +## Environment Settings + +The CLI uses environment variable to manage the configurations. + +### RPC_ADDR + +CLI will connect to skycoin node REST API address `http://127.0.0.1:6420` by default. +You can change the address by setting the `RPC_ADDR` environment variable +with the following command: + +```bash +$ export RPC_ADDR=http://127.0.0.1:6420 +``` + +Note: `RPC_ADDR` must be in `scheme://host` format. + +### RPC_USER + +A username for authenticating requests to the skycoin node. + +```bash +$ export RPC_USER=... +``` + +### RPC_PASS + +A password for authenticating requests to the skycoin node. + +```bash +$ export RPC_PASS=... +``` + +## Usage + +After the installation, you can run `skycoin-cli` to see the usage: + +``` +$ skycoin-cli + +USAGE: + skycoin-cli [command] [flags] [arguments...] + +DESCRIPTION: + The skycoin command line interface + +COMMANDS: + addPrivateKey Add a private key to wallet + addressBalance Check the balance of specific addresses + addressGen Generate skycoin or bitcoin addresses + addressOutputs Display outputs of specific addresses + addressTransactions Show detail for transaction associated with one or more specified addresses + addresscount Get the count of addresses with unspent outputs (coins) + blocks Lists the content of a single block or a range of blocks + broadcastTransaction Broadcast a raw transaction to the network + checkDBDecoding Verify the database data encoding + checkdb Verify the database + createRawTransaction Create a raw transaction that can be broadcast to the network later + decodeRawTransaction Decode raw transaction + decryptWallet Decrypt a wallet + distributeGenesis Distributes the genesis block coins into the configured distribution addresses + encodeJsonTransaction Encode JSON transaction + encryptWallet Encrypt wallet + fiberAddressGen Generate addresses and seeds for a new fiber coin + help Help about any command + lastBlocks Displays the content of the most recently N generated blocks + listAddresses Lists all addresses in a given wallet + listWallets Lists all wallets stored in the wallet directory + pendingTransactions Get all unconfirmed transactions + richlist Get skycoin richlist + send Send skycoin from a wallet or an address to a recipient address + showConfig Show cli configuration + showSeed Show wallet seed and seed passphrase + status Check the status of current Skycoin node + transaction Show detail info of specific transaction + verifyAddress Verify a skycoin address + verifyTransaction Verify if the specific transaction is spendable + version List the current version of Skycoin components + walletAddAddresses Generate additional addresses for a deterministic, bip44 or xpub wallet + walletBalance Check the balance of a wallet + walletCreate Create a new wallet + walletHistory Display the transaction history of specific wallet. Requires skycoin node rpc. + walletKeyExport Export a specific key from an HD wallet + walletOutputs Display outputs of specific wallet + +FLAGS: + -h, --help help for skycoin-cli + --version version for skycoin-cli + +Use "skycoin-cli [command] --help" for more information about a command. + +ENVIRONMENT VARIABLES: + RPC_ADDR: Address of RPC node. Must be in scheme://host format. Default "http://127.0.0.1:6420" + RPC_USER: Username for RPC API, if enabled in the RPC. + RPC_PASS: Password for RPC API, if enabled in the RPC. + COIN: Name of the coin. Default "skycoin" + DATA_DIR: Directory where everything is stored. Default "$HOME/.$COIN/" +``` + +### Add Private Key +Add a private key to a skycoin wallet. Wallet type must be "collection". + +```bash +$ skycoin-cli addPrivateKey [wallet] [private key] +``` + +``` +FLAGS: + -p, --password string Wallet password +``` + +#### Example +```bash +$ skycoin-cli addPrivateKey $WALLET_FILE $PRIVATE_KEY +``` + +``` +$ success +``` + +### Check address balance +Check balance of specific addresses, join multiple addresses with space. + +```bash +$ skycoin-cli addressBalance [addresses] +``` + +#### Example +```bash +$ skycoin-cli addressBalance 2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc 2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv +``` +
+ View Output + +```json +{ + "confirmed": { + "coins": "324951.932000", + "hours": "166600293" + }, + "spendable": { + "coins": "324951.932000", + "hours": "166600293" + }, + "expected": { + "coins": "324951.932000", + "hours": "166600293" + }, + "addresses": [ + { + "confirmed": { + "coins": "2.000000", + "hours": "1158" + }, + "spendable": { + "coins": "2.000000", + "hours": "1158" + }, + "expected": { + "coins": "2.000000", + "hours": "1158" + }, + "address": "2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc" + }, + { + "confirmed": { + "coins": "324949.932000", + "hours": "166599135" + }, + "spendable": { + "coins": "324949.932000", + "hours": "166599135" + }, + "expected": { + "coins": "324949.932000", + "hours": "166599135" + }, + "address": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv" + } + ] +} +``` +
+ +### Generate addresses +Generate skycoin or bitcoin addresses. + +```bash +$ skycoin-cli addressGen [flags] +``` + +``` +FLAGS: + -c, --coin string Coin type. Must be skycoin or bitcoin. If bitcoin, secret keys are in Wallet Import Format instead of hex. (default "skycoin") + -x, --encrypt Encrypt the wallet when printing a JSON wallet + -e, --entropy int Entropy of the autogenerated bip39 seed, when the seed is not provided. Can be 128 or 256 (default 128) + --hex Use hex(sha256sum(rand(1024))) (CSPRNG-generated) as the seed if not seed is not provided + -i, --hide-secrets Hide the secret key and seed from the output when printing a JSON wallet file + -l, --label string Wallet label to use when printing or writing a wallet file + -m, --mode string Output mode. Options are wallet (prints a full JSON wallet), addresses (prints addresses in plain text), secrets (prints secret keys in plain text) (default "wallet") + -n, --num int Number of addresses to generate (default 1) + -s, --seed string Seed for deterministic key generation. Will use bip39 as the seed if not provided. + -t, --strict-seed Seed should be a valid bip39 mnemonic seed. +``` + +#### Examples +##### Generate `n` number of skycoin addresses +```bash +$ skycoin-cli addressGen --num 2 +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "seed": "genius canyon asset swallow picture torch awkward radar nest bunker walnut garage" + }, + "entries": [ + { + "address": "2KC8vSgNXVZ6GMYY8edUqvRsbupZVwWKETe", + "public_key": "0215682c10f6293bf52c543787613e898f4e4af70aa87eac8848b0535d8b8c05f1", + "secret_key": "31d6f561dad49f2c60c02a97395a2f3df67bb9e092806356ddbb952556c96e82" + }, + { + "address": "yzkv7v2T4fbQmZKdiLcq8tAHEVrVbrvGvh", + "public_key": "02dc8409077376bc8a834185739133f47805764f061103c88a4b5b0d2809b310b7", + "secret_key": "3ba5855ad3b1ec7e02918d5329dc5425690a93331514370d739f58556236c1ce" + } + ] +} +``` +
+ + +##### Generate `n` number of bitcoin addresses +```bash +$ skycoin-cli addressGen --num 2 --coin bitcoin +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "bitcoin", + "seed": "sun resemble crisp clerk square initial like urge abstract picnic impulse robot" + }, + "entries": [ + { + "address": "15FW6YEZuwr68h54DrXD3Tv1Cc1aKHoynF", + "public_key": "024529a5b1f1c110dd122598052115717a7a042b4831acbf234fe01968f82d1312", + "secret_key": "L3crKysGdHmKQ2j27wfgew4timWiUrPxwUi8FNE75S872C1K9pns" + }, + { + "address": "1EBKC7u29ea1jPtEoC5LLMcXwpZBTmFxhs", + "public_key": "03faaff073f752cafccb3f639b2174e6c48b04a24cbdefafbfdbda2f54ba5e81a9", + "secret_key": "KxomKUvagGTviuxAr9HNRfXEaim4evvFJVGmuk2LYA5ZLXznvX6k" + } + ] +} +``` +
+ +##### Hide secret in output +```bash +$ skycoin-cli addressGen --num 2 --hide-secrets +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "seed": "walnut wise pluck sniff weird enable document special soul era mercy you" + }, + "entries": [ + { + "address": "27ohsY7Hg5dEDySUg17gStEQRzLFxE8mVrU", + "public_key": "02ead2834f41f91dd3847924f6257b2b852390708cd2c91db80f017fd21f9768af", + "secret_key": "" + }, + { + "address": "2FHuME9U7CEN3vWwwRzJAgP4K2JKPfoRxzp", + "public_key": "03af027c379b380c009cbefc3b251e7b42af9753125a8d9ef0a50249e97060c673", + "secret_key": "" + } + ] +} +``` +
+ +##### Output only an address list +```bash +$ skycoin-cli addressGen --num 2 --mode addresses +``` + +``` +7HVmKni3ggMdtseynSkNkqoCnsH7vkS6cg +2j5QSbHgLWXA2qXZvLzJHRo6Cissxer4CSt +``` + +> NOTE: If no seed is provided with the `--seed flag` and `--hex` flag is not used then bip39 is used to generate a seed + +##### Use a predefined seed value +```bash +$ skycoin-cli addressGen --num 2 --seed "my super secret seed" +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "seed": "my super secret seed" + }, + "entries": [ + { + "address": "NMwevFV1NhPSp8H4QHPQyDuKCkLjsQ5zRb", + "public_key": "03a0571ef3ac621aa1fe950753110187bd096a32cc791f227406badbc21676743c", + "secret_key": "0977909e18ef6b3dbc522e79c26c3113ab6d4ae7a9f4a848dcd49e5b4634a77c" + }, + { + "address": "a1ec9zaxj5ndhteyJeocdhYFLHfvm86UPG", + "public_key": "021990611d33bdc3ca70da07b1e4f8a1928a6cb369fb343d4b2ce0c0b123273387", + "secret_key": "e08dd4de4920edc1ae5aa2260167657e64a5ff146b90d21fb1a39294c94c940c" + } + ] +} +``` +
+ +##### Generate addresses with a hex (CSPRNG-generated) seed +```bash +skycoin-cli addressGen --num 2 --hex +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "seed": "d5fa95cc3bd265c9ef99e7c2b300f0ede75375fbb76b2329bd5877631c315068" + }, + "entries": [ + { + "address": "2URMzEQ2A1xuf3GGN6Tr8tucCzJKYVpj9Fz", + "public_key": "03d5e38c96829dbc8b873822ba29ebb7cf5c8c32c386348f032d523f0640c31640", + "secret_key": "e0eccbd416b9fb8a109426681e890362a24491072edd8275a29b1878874fc9b4" + }, + { + "address": "2Qct8BmaCvMfPUnMCtTj5sMLNNoLbshAxoe", + "public_key": "0241404173e29d9ae4a16c6496baff72cfd94fca16c727b7b1192bdeb736ced278", + "secret_key": "972c0596a442d495fda1bba055df6334aa0121376248f19194ddc602368bda30" + } + ] +} +``` +
+ +### Generate distribution addresses for a new fiber coin +```bash +skycoin-cli fiberAddressGen [flags] +``` + +``` +DESCRIPTION: + Addresses are written in a format that can be copied into fiber.toml + for configuring distribution addresses. Addresses along with their seeds are written to a csv file, + these seeds can be imported into the wallet to access distribution coins. + +FLAGS: + -a, --addres-file string Output file for the generated addresses in fiber.toml format (default "addresses.txt") + -e, --entropy int Entropy of the autogenerated bip39 seeds. Can be 128 or 256 (default 128) + -n, --num int Number of addresses to generate (default 100) + -o, --overwrite Allow overwriting any existing addrs-file or seeds-file + -s, --seeds-file string Output file for the generated addresses and seeds in a csv (default "seeds.csv") +``` + + +#### Examples +```bash +skycoin-cli fiberAddressGen +``` + +### Check address outputs +Display outputs of specific addresses, join multiple addresses with space. + +```bash +$ skycoin-cli addressOutputs [address list] +``` + +#### Example +```bash +skycoin-cli addressOutputs tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V 29fDBQuJs2MDLymJsjyWH6rDjsyv995SrGU +``` + +
+ View Output + +```json +{ + "outputs": { + "head_outputs": [ + { + "hash": "f5f838edf75b68882cacb7fa071538bcf800515d5a7f42e3a8c5e6d681879a82", + "time": 1522603686, + "block_seq": 20256, + "src_tx": "cd0725e9cfc23cfed279aeda70b765238d0cc282406c48f811c6ad2874593f03", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "0.500000", + "hours": 43, + "calculated_hours": 122 + }, + { + "hash": "b2182ec3481f7af9884e4839016a145c07b66fce68c3b9ff04d897d1f1db5717", + "time": 1522603586, + "block_seq": 20255, + "src_tx": "48b385567796725212ed8195a9437b15d5cd82186205b9d8fd027fa75f98060e", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "0.500000", + "hours": 173, + "calculated_hours": 252 + }, + { + "hash": "86ba8131756b4db5e163d38aa119ff07e4bd3fe05bbf3c28cef8471648d77080", + "time": 1517145975, + "block_seq": 12675, + "src_tx": "ad191f910e5508e0b0e0ab24ba815e784a1a2b63ca21043e7746bebf25106742", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 1232, + "calculated_hours": 2906 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} +``` +
+ +### Check block data +Lists the content of a single block or a range of blocks + +```bash +$ skycoin-cli blocks [starting block or single block seq] [ending block seq] +``` + +#### Example +```bash +$ skycoin-cli blocks 41 42 +``` + +
+ View Output + +```json +{ + "blocks": [ + { + "header": { + "seq": 41, + "block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "previous_block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "timestamp": 1429058524, + "fee": 4561, + "version": 0, + "tx_body_hash": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "ux_hash": "d3f60f0d20aeac951aacab8d849696cac54c7057da741cfd90b63018100818d0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 42, + "block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "previous_block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "timestamp": 1429058594, + "fee": 292512, + "version": 0, + "tx_body_hash": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "ux_hash": "9173768496bc49e2a34d5a7ea65d05ad6507dfdb489836e861b3c03d35efeb7a" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + ] + }, + "size": 317 + } + ] +} +``` +
+ +### Check database integrity +Checks if the given database file contains valid skycoin blockchain data +If no argument is given, the default `data.db` in `$HOME/.$COIN/` will be checked. + +```bash +$ skycoin-cli checkdb [db path] +``` + +#### Example +```bash +$ skycoin-cli checkdb $DB_PATH +``` + +
+ View Output + +``` +check db success +``` +
+ +### Create a raw transaction +Create a raw transaction that can be broadcasted later. +A raw transaction is a binary encoded hex string. + +```bash +$ skycoin-cli createRawTransaction [wallet] [to address] [amount] [flags] +``` + +``` +FLAGS: + -c, --change-address string Specify the change address. + Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets). + --csv string CSV file containing addresses and amounts to send + -a, --from-address string From address in wallet + -j, --json Returns the results in JSON format. + -m, --many string use JSON string to set multiple receive addresses and coins, + example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]' + -p, --password string Wallet password +``` + +#### Examples +##### Sending to a single address from a specified wallet +```bash +$ skycoin-cli createRawTransaction $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRESS +``` + +##### Sending to a specific change address + +```bash +$ skycoin-cli createRawTransaction $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRESS -c $CHANGE_ADDRESS +``` + +
+ View Output + +``` +dc00000000c7425e5a49fce496d78ea9b04fc47e4126b91f675b00c16b3a7515c1555c252001000000115112dbb438b423dccd5f1afb7bce3d0cd4b87b57fd9fd3e5a26ee24e05fb696f0c7f3d6a84eafd80e051117162d790fa0e57c01a0e570b8ac0ae5faa5bf782000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f000000000001000000000000000056500d41a1a6f1967ffe0074bb171148667ce20d0024f400000000009a05000000000000 +``` +
+ +##### Sending to multiple addresses +```bash +$ skycoin-cli createRawTransaction $WALLET_FILE -a $FROM_ADDRESS -m '[{"addr":"$ADDR1", "coins": "$AMT1"}, {"addr":"$ADDR2", "coins": "$AMT2"}]' +``` + +##### Sending to addresses in a CSV file +```bash +$ cat < $CSV_FILE +2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP,123.1 +2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd,456.045 +yExu4fryscnahAEMKa7XV4Wc1mY188KvGw,0.3 +EOF +$ skycoin-cli createRawTransaction $WALLET_FILE -a $FROM_ADDRESS --csv $CSV_FILE +``` + +
+ View Output + +``` +01010000000e2a5bf4964604006fea5cf8cbd705e82bebb055467f10681ef01ce5c8db654801000000d951d4e34a7b35b1b165e8302cd47e09b6433ea443a8864dc8428537dbe8b76e00ee58bb195d7de3d28935ed4fc3684f1cac5593c09c4bafb016705b7e2b3393000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634030000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f000000000001000000000000000056500d41a1a6f1967ffe0074bb171148667ce20d40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec09c0e1e400000000009a05000000000000 +``` +
+ +> NOTE: When sending to multiple addresses each combination of address and coins need to be unique + Otherwise you get, `ERROR: Duplicate output in transaction` + + +##### Generate a JSON output +```bash +$ skycoin-cli createRawTransaction $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRESS --json +``` + +
+ View Output + +```json +{ + "rawtx": "dc00000000c7425e5a49fce496d78ea9b04fc47e4126b91f675b00c16b3a7515c1555c252001000000115112dbb438b423dccd5f1afb7bce3d0cd4b87b57fd9fd3e5a26ee24e05fb696f0c7f3d6a84eafd80e051117162d790fa0e57c01a0e570b8ac0ae5faa5bf782000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f000000000001000000000000000056500d41a1a6f1967ffe0074bb171148667ce20d0024f400000000009a05000000000000" +} +``` +
+ +### Create an unsigned raw transaction + +```bash +$ skycoin-cli createRawTransactionV2 [wallet] [to address] [amount] [flags] +``` + +### Example + +```bash +$ skycoin-cli createRawTransactionV2 $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT --unsign +``` + +
+ View Output + +```json +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ +### Sign an unsigned raw transaction + +```bash +$ skycoin-cli signTransaction [wallet] [raw transaction] +``` + +### Example + +```bash +$ skycoin-cli signTransaction $WALLET_FILE $RAW_TRANSACTION +``` + +
+ View Output + +```json +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ + +### Decode a raw transaction +```bash +$ skycoin-cli decodeRawTransaction [raw transaction] +``` + +Decode a raw skycoin transaction. + +#### Example + +```bash +skycoin-cli decodeRawTransaction dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000 +``` + +
+ View Output + +```json +{ + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634" + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] +} +``` +
+ +### Encode a JSON transaction + +Encode JSON Skycoin transaction. + +```bash +$ skycoin-cli encodeJsonTransaction [file path or -] +``` + +``` +FLAGS: + -j, --json Returns the results in JSON format. + -f, --fix Recompute transaction inner and outer hashes +``` + +#### Example +##### Read JSON transaction from stdin +```bash +$ echo ' { + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634" + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] + }' | skycoin-cli encodeJsonTransaction - +``` + +
+ View Output + +``` +dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000 +``` + +
+ +##### Read JSON transaction from file +```bash +$ echo ' { + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634" + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] + }' > $FILEPATH + +$ skycoin-cli encodeJsonTransaction $FILEPATH +``` + +
+ View Output + +``` +dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000 +``` + +
+ +##### Recompute Hashes +```bash +$ echo ' { + "length": 183, + "type": 0, + "txid": "9b102b8a9882cd5dc2df8955fc1b8a1a75e11b9de61d272313c4da822920872b", + "inner_hash": "6b1a69b76b2412314b2b928ad5e97c31c034be5734f9fa77f31f11b6b933b976", + "sigs": [ + "ddf4bd79f66ea9c7849c5240a27d9a4745ad4661bdac2179184447088512bb3e62c89efa4fd2cee05980c59b38ef23ddbd09bb77e54e94a0f9123d968a090d4201" + ], + "inputs": [ + f7c183c1823266aff172928f8d06aa65531643456f97ccca6bd34d15e92fac7d" + ], + "outputs": [ + { + "uxid": "d1e30a79ebaac4948c69ce8f61714320f996193544a815b58b6837bade5d86c3", + "dst": "2fRQzhdNP2QMG75GkZnm44H649QBcj2mZY", + "coins": "0.001000", + "hours": 22 + } + ] + }' > $FILEPATH + +$ skycoin-cli encodeJsonTransaction -f $FILEPATH +``` + +##### Generate a JSON output +```bash +$ echo ' { + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634" + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] + }' > $FILEPATH + +$ skycoin-cli encodeJsonTransaction --json $FILEPATH +``` + +
+ View Output + +``` +{ + "rawtx": "dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000" +} +``` + +
+ +### Broadcast a raw transaction +Broadcast a raw skycoin transaction. +Output is the transaction id. + +```bash +$ skycoin-cli broadcastTransaction [raw transaction] +``` + +```bash +$ skycoin-cli broadcastTransaction dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000 +``` +
+ View Output + +``` +ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5 +``` +
+ +### Create a wallet +Create a new Skycoin wallet. + +```bash +$ skycoin-cli walletCreate [wallet] [flags] +``` + +Note: the `wallet` argument must be a filename that ends with `.wlt`. + +``` +FLAGS: + --bip44-coin uint32 BIP44 coin type (default 8000) + -c, --coin string Wallet address coin type (options: skycoin, bitcoin) (default "skycoin") + -x, --crypto-type string The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor (default "scrypt-chacha20poly1305") + -e, --encrypt Create encrypted wallet. + -l, --label string Label used to identify your wallet. + -m, --mnemonic A mnemonic seed consisting of 12 dictionary words will be generated + -n, --num uint Number of addresses to generate. (default 1) + -p, --password string Wallet password + -r, --random A random alpha numeric seed will be generated. + -s, --seed string Your seed + --seed-passphrase string Seed passphrase (bip44 wallets only) + -t, --type string Wallet type. Types are "collection", "deterministic", "bip44" or "xpub" (default "deterministic") + -w, --wordcount uint Number of seed words to use for mnemonic. Must be 12, 15, 18, 21 or 24 (default 12) + --xpub string xpub key for "xpub" type wallets +``` + +#### Examples +##### Create a deterministic wallet + +Creates a deterministic wallet using the [Skycoin deterministic address generator](https://github.com/SkycoinProject/skycoin/wiki/Deterministic-Keypair-Generation-Method). +Alternatively, you can create a `bip44` type wallet. + +```bash +$ skycoin-cli walletCreate $WALLET_FILE -t deterministic +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "781576ec74bfa2cc9eb06f8613b96db9be21438b9cd6b6ded09df3bc5b9da279", + "secrets": "", + "seed": "foster blossom glare cube reopen october refuse about journey arrange music alone", + "tm": "1523176366", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "FSkC7V5rAkCnNrtCe1HBnD2iTm1J8jn63V", + "public_key": "03a16c8e9ea86ea2358364757431b84cc388b34be776bb6a23ed2b83731957d33a", + "secret_key": "3938826649631e2abc1c47c050d0fea5ceac7c45e3fa6cd3ddf1621bdd519150" + } + ] +} +``` +
+ +> NOTE: If a wallet with the same name already exists then the cli exits with an error. + +##### Create a wallet with a random alpha numeric seed +```bash +$ skycoin-cli walletCreate $WALLET_FILE -r +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "fdaf0729903fbd5962301f16531a1da102bf0875b4a636cb43ce24b967b932ac", + "secrets": "", + "seed": "8af187f04c306538544a1c2c4d0a51e9220bd17fc2fcb3fd72ba2ca3ce7aa212", + "tm": "1523177044", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "9YogvtjYgeLn3gQX2wzsXDpZn7LuoArdzZ", + "public_key": "022b4bd33f0ad037756ae19f8dfab935fed1118980b4067b4a6b7f03333ba5ccae", + "secret_key": "b4cf1731be9f930ba3a67179eed5dca5af2adee1ce4df96383923f775bf575c0" + } + ] +} +``` +
+ +##### Create a wallet with a 12 word mnemomic seed +```bash +$ skycoin-cli walletCreate $WALLET_FILE -m +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "f219c2e902940f27ea735d866a495372debcbd01da287a2ec1226d0eb43b9890", + "secrets": "", + "seed": "motor cross wrap intact soup critic club allow track come dizzy cool", + "tm": "1523177162", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "E9p6Eck7Q6bYBnEkCdB3vCDf3YYkQxCHwv", + "public_key": "02c41e7b03a6a848a417d7d270b9d83c4d9534c2cd5eace8046c67d012b920f1db", + "secret_key": "41b6aa1780f425dac942c8bd1570248ebfca24778e866705a6573b17ead57a4d" + } + ] +} +``` +
+ +##### Create a wallet with a specified seed +```bash +$ skycoin-cli walletCreate $WALLET_FILE -s "this is the super secret seed everyone needs but does not have" +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "c34a83b473ea4d2f9dc394d0b9c1c0d4578012252b842ef1bfce9950cfe50b06", + "secrets": "", + "seed": "this is the super secret everyone needs but does not have", + "tm": "1523178336", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "NEQVmBJPidzo3SfDRJHNDMHL7VbqNa7Cku", + "public_key": "0348400c3c1a733a6e25c77f1ffea64c887bc9344a0366821ef07b9b3abadcaf10", + "secret_key": "42e3906d86ca25eb408d2af90b0810d7831b7d777e756021b607bca6538952eb" + } + ] +} +``` +
+ + +##### Create more than 1 default address +```bash +$ skycoin-cli walletCreate $WALLET_FILE -n 2 +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "861a8989e6c85fb69cf5968586fe9d5a1e26936ab122c5d542bf78fb35e0d247", + "secrets": "", + "seed": "cause custom canal kitchen short cement round cat shine renew pair crowd", + "tm": "1523178418", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2accTtyD7tqzLh7c62BE9zjGiyEpoMyQ3bb", + "public_key": "027c30928161755c913e1b3db208f95a66be0f550b9620cefd44902b5354365b73", + "secret_key": "89b2f71fb773a00480637fd83c93e27499fd5e55f69a6e2b58f0847c3ce5040c" + }, + { + "address": "goyx9VE3q73zAWntmwwyaUoTZhtTyG4vt", + "public_key": "025c0b06471b865cb5eab23f9a9dc0a992fe70d0576eb400aa4978ddd0a2124b95", + "secret_key": "75deabceedb9b09a109f5d982fba13a56622d93916a8ef81ddccca69fcc9d7e3" + } + ] +} +``` +
+ + +##### Create a wallet with a custom wallet label +By default the wallet label is an empty field +```bash +$ skycoin-cli walletCreate $WALLET_FILE -l "cli wallet" +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "cli wallet", + "lastSeed": "b3b3c13419a8343f8845a8de30543fa33680e25251a3a1bda3e49346f1d640f9", + "secrets": "", + "seed": "offer spoil crane trial submit kite venture edit repair mushroom fetch bounce", + "tm": "1523178769", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "public_key": "03784cf30195259e4bf89e15d343417d38ecd05b2f61fd2b2f71020ad7b1de3577", + "secret_key": "8f6f2e3b63310f94c1440ba230eb170dbc1ffd2ad355274c05b169c290216a3c" + } + ] +} +``` +
+ +##### Create a collection wallet + +Create an empty collection wallet. Use `addPrivateKey` to add keys to it after creation. + +```bash +$ skycoin-cli walletCreate $WALLET_FILE -t collection +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "collection-test2.wlt", + "label": "", + "lastSeed": "", + "secrets": "", + "seed": "", + "seedPassphrase": "", + "tm": "1563205581", + "type": "collection", + "version": "0.4", + "xpub": "" + }, + "entries": [] +} +``` +
+ +##### Create a BIP44 wallet + +Create a bip44 wallet. BIP44 wallets use the same mnemonic seeds as `deterministic` +wallets, but are supported on 3rd party wallets such as Trezor. + +```bash +$ skycoin-cli walletCreate $WALLET_FILE -t bip44 +``` + +
+ View Output + +```json +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "bip44-cli-test.wlt", + "label": "", + "lastSeed": "", + "secrets": "", + "seed": "bacon crush gate artist outer true aware topple pupil include neutral stamp", + "seedPassphrase": "", + "tm": "1563205737", + "type": "bip44", + "version": "0.4", + "xpub": "" + }, + "entries": [ + { + "address": "zbqJ8tGRKNEpR3X2RxHTyodCFtVDB7wFKf", + "public_key": "0255a1148a188d5b5f08c3296ad5de6577e08f8cd035b2e53d974aad56f748abb9", + "secret_key": "8f49323cc06089df5e74fbab8bc211ccc8fc21b44cf495e67fc5c4613bde11af", + "child_number": 0, + "change": 0 + } + ] +} +``` +
+ +##### Create an xpub wallet + +Create an xpub wallet. Obtain an xpub key from a BIP44 wallet with `walletKeyExport`. + +```bash +$ skycoin-cli walletCreate $WALLET_FILE -t xpub --xpub xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV +``` + +
+ View Output + +```json + +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "xpub-test-cli.wlt", + "label": "", + "lastSeed": "", + "secrets": "", + "seed": "", + "seedPassphrase": "", + "tm": "1563205611", + "type": "xpub", + "version": "0.4", + "xpub": "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV" + }, + "entries": [ + { + "address": "2as3T8JqSVm41k47phe4vbnrzbTqBEaAwG7", + "public_key": "02df12b7035bdac8e3bab862a3a83d06ea6b17b6753d52edecba9be46f5d09e076", + "secret_key": "", + "child_number": 0 + } + ] +} +``` +
+ + +### Add addresses to a wallet +Add new addresses to a skycoin wallet. + +```bash +$ skycoin-cli walletAddAddresses [wallet] [flags] +``` + +``` +FLAGS: + -j, --json Returns the results in JSON format + -n, --num uint Number of addresses to generate (default 1) + -p, --password string wallet password +``` + +#### Examples + +##### Add 1 address to a wallet + +```bash +$ skycoin-cli walletAddAddresses $WALLET_FILE +``` + +
+ View Output + +``` +2mEgmYt6NZHA1erYqbAeXmGPD5gqLZ9toFv +``` +
+ +##### Add `n` addresses +```bash +$ skycoin-cli walletAddAddresses $WALLET_FILE -n 2 +``` + +
+ View Output + +``` +2UrEV3Vyu5RJABZNukKRq25ggrrg96RUwdH,LJN5qGmLbJxLswzD3nFn3RFcmWJyZ2LGHY +``` +
+ +##### Add an address to a wallet with JSON output +```bash +$ skycoin-cli walletAddAddresses $WALLET_FILE --json +``` + +
+ View Output + +```json +{ + "addresses": [ + "QuLaPirJNUkBpMoe5tzzY7j6nJ5maUVJF1" + ] +} +``` +
+ +### Export a specific key from an HD wallet +Export a specific key from an HD wallet (bip44 wallet). + +```bash +$ skycoin-cli walletKeyExport [wallet] [flags] +``` + +``` +FLAGS: + -k, --key string key type ("xpub", "xprv", "pub", "prv") (default "xpub") + -p, --path string bip44 account'/change subpath (default "0/0") +``` + +The `path` arg is the `account'/change` portion of the bip44 path. +It can have 1 to 3 nodes (i.e. `0`, `0/0` and `0/0/0`). +The apostrophe for the `account` node is omitted. + +##### Export the xpub key for the external chain +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k xpub -p "0/0" +``` + +
+ View Output + +``` +xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8 +``` +
+ +##### Export the xprv key for the change chain +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k xprv -p "0/1" +``` + +
+ View Output + +``` +xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7 +``` +
+ +##### Export the pub key for the 5th child in the external chain +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k pub -p "0/0/5" +``` + +
+ View Output + +``` +035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56 +``` +
+ + +##### Export the prv key for the 5th child in the change chain +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k prv -p "0/1/5" +``` + +
+ View Output + +``` +d647077f0f6824a25af7cd934ff196e611f5122bff4310f8eb0f2e643c5213cd +``` +
+ + +##### Export the xpub key for account number 2 +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k xpub -p "2" +``` + +
+ View Output + +``` +xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV +``` +
+ + +### Encrypt Wallet +Encrypt a wallet seed + +```bash +$ skycoin-cli encryptWallet [wallet] [flags] +``` + +``` +FLAGS: + -x, --crypto-type string The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor + -p, --password string wallet password +``` + +### Examples +#### Encrypt wallet +```bash +$ skycoin-cli encryptWallet $WALLET_FILE -p test +``` + +
+ View Output + + ```json + { + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "", + "secrets": "dgB7Im4iOjEwNDg1NzYsInIiOjgsInAiOjEsImtleUxlbiI6MzIsInNhbHQiOiJRNVRSVHh0VFpieERpUWt0dnkzc01SYTl6U0t2aFJqVlpUUHQzeldSVGs4PSIsIm5vbmNlIjoiSUt5VG8zdWdGdFY3MWYxTiJ9LB7Cu3bvZFzsmKqToPi3bjARIRfmhL8HBUdnwLzS5Rxu4uw1tIlDDmEKUpgDWV3RvB+xDz3sHchQr5BpK72LDOwbZ6BubMHovTqC4+lx9hKc2qnDGwsymxLQJHQrQ23DkHMioSUVYNZv1/DwzJ2qI0WIOTkb+L34e9f60YV+2zF7v+C/nTS8AjMwjGYldKinPEjyDXkpxB2d4Sd3EnfUm8u76TvTKxqZpZ/tr+in/OfRsJsN7dC7rMFRZukoCJYNnWv/wgPn/NMu4DIxqF+WUQhCsCgqk6oMderdK/E/xtLJmKnbHRLH4PO/Dh4ypLXg2EzW+JBN6RpzVEXxYdvVCqmKfs7d+hnHWDmDtCLGqYyPsUa+d4PPhylruNE=", + "seed": "", + "tm": "1540305209", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2gvvvS5jziMDQTUPB98LFipCTDjm1H723k2", + "public_key": "032fe2ceacabc1a6acad8c93bd3493a3570fb76a9f8dc625dd200d13f96abed3e0", + "secret_key": "" + } + ] + } + ``` +
+ + +#### Encrypt wallet with different crypto type +```bash +$ skycoin-cli encryptWallet $WALLET_FILE -x sha256-xor -p test +``` + +
+ View Output + + ```json + { + "meta": { + "coin": "skycoin", + "cryptoType": "sha256-xor", + "encrypted": "true", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "", + "secrets": "mJ4g+/NgncOVp7gKIZqVPysmrRYKjprSuMvvpq3HLt7ajjMOheEdyU0PGtueDQADIhhTFZlQh/eaaYXF3fecS7OrGa79F+2lRRdD7Tva/MueiL9TL0ng12x0I7dXkUVsXLTl3MJK27JwS9hKedcVvnmFysJA6W3lX2aE7Qn+v6cyMbfgR8r89OHGaUZ9SPZn2HKOhhIcXt66Q/t0kVWU0XEH+G + xUyX23ksN3scQoAshVidLAgXwpkgExEl+qjCpDNQga3MncZV+WuQxpIKodJ3l5TKoJAA0/Taz9O9Se0tIoiK2ls2m6JUayev3Id0+hkmNNSUKQ53Ni3xwjNzZXoPQAemMWpkdUSv8qNuhh7C/4gBBrZROM6ZyxmsdlWgcG0Yfrh8o505D0i4mtubkdZSGi8Djm9j1mpWTZi3VuUjtGvBAmH3Qzdma+nvORZj11QuEuCcO+ + 8jmQB9bVxcTL9u4Nan2+cYijVNul93m7xWik/mSB7uIFVIJAm4kSMiJm", + "seed": "", + "tm": "1540305209", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2gvvvS5jziMDQTUPB98LFipCTDjm1H723k2", + "public_key": "032fe2ceacabc1a6acad8c93bd3493a3570fb76a9f8dc625dd200d13f96abed3e0", + "secret_key": "" + } + ] + } + ``` +
+ +### Decrypt Wallet +Decrypt a wallet seed + +```bash +$ skycoin-cli decryptWallet [wallet] [flags] +``` + +``` +FLAGS: + -p, --password string wallet password +``` + +### Example +```bash +$ skycoin-cli decryptWallet $WALLET_FILE -p test +``` + +
+ View Output + + ```json + { + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "522dba68fe58c179f3467f9e799c02b25552143b250626cc03281faa28c262c0", + "secrets": "", + "seed": "select salute trip target blur short link suspect river ready senior bleak", + "tm": "1540305209", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2gvvvS5jziMDQTUPB98LFipCTDjm1H723k2", + "public_key": "032fe2ceacabc1a6acad8c93bd3493a3570fb76a9f8dc625dd200d13f96abed3e0", + "secret_key": "080bfb86463da87e06f816c4326a11b84806c9744235bb7ce7bc8d63acb4f6c2" + } + ] + } + ``` +
+ +### Last blocks +Show the last `n` skycoin blocks. +By default the last block is shown. + +```bash +$ skycoin-cli lastBlocks [numberOfBlocks] +``` + +#### Examples +##### Get the last block +```bash +$ skycoin-cli lastBlocks +``` + +
+ View Output + +```json +{ + "blocks": [ + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7" + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` +
+ +##### Get the last `n` blocks +```bash +$ skycoin-cli lastBlocks 3 +``` + +
+ View Output + +```json +{ + "blocks": [ + { + "header": { + "seq": 58892, + "block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "previous_block_hash": "d9ca9442febd8788de0a3093158943beca228017bf8c9c9b8529a382fad8d991", + "timestamp": 1537580914, + "fee": 94694, + "version": 0, + "tx_body_hash": "9895f8af790e33a618004dc61f48ecc16bd642751a3fff6b05cecb8815c80942", + "ux_hash": "bb188dcaaf28613d49b926636675dacf67a739a4e316253b1207ad674709252b" + }, + "body": { + "txns": [ + { + "length": 1190, + "type": 0, + "txid": "9895f8af790e33a618004dc61f48ecc16bd642751a3fff6b05cecb8815c80942", + "inner_hash": "8bff0b7572bb49ccde4b2b313e921e5cf302a11fd9f786a2ef97a7c0ddfee261", + "sigs": [ + "f843861b301eb025e58bacfb934d615f263419704b0a59f2645845344f2702fa1a7a967651f01933af4d56752c656a7e759e942b9278e228362f2ef273d4ff5200", + "06f15e2522e7413f25dedb5aee67ae880bd98bb7df11a1a92241d88db9bb976d2c707e77a4a3ddfd8d123ad04701fe2538ea2d0f78cfbcdc44e70fd2320a72b500", + "dc32fe308274f9aaa21e09046384a83b4b2c6bf800c6b9ff492af8bd3f5cd7717b245c9d460c242139034c73cd15aca9f288cb69e8ae4c33df2a807ff3b373aa00", + "18d83a122f0ca3629f0c82e21ea3d6fbdfd1ea07ba062ffb6647b7e2c3aa9a1d7c112dc5543435ddd0bccd163f839d9802eb344f6203372deea7402d8476679501", + "26a8723c1ac22dca2b61d807ca2279e341a9f5a371c4d14333f49e52b90ec87f08ab7930e5804367c1dffb01b197d976619ab26f0c8afe8837c41b0df809a23301", + "fe190749475cd66afcdd295b22b007c63726db0fd834acef4ecde9c41ae7d15d54c2c180c8aba5c894d3843405f6243b7ff964f974f607b38298c195d7b523c401", + "d58e8283a28faed377161605e252cd929959e40fd8b996f928049f2b446bc920468d1086a2bc34a8fcaedefdc471427266cc67b9770d9b0482f5f4f22729a79a00", + "2be852a5b589ce49f9d3678fa44a758c2e4d7372620a8241d71c41451c5244387ac337bbee5010b98fc8c38fc44619ed8a7beb2af06385a11ecb53eb0112a8a700", + "b6376cc54078f775da6438960e828c799c780349c8590508b4500f0e6dd9ecbc760992599d698209b078220d8aaa9db9f80091290a18cd0753efd1805515d06600", + "958e17753d4cedc3203b95a39d585314ac10efc00332befa81c8049b4178222d2514ba1d68385b2518d976835dee48f2bb540db0d0e728acbf59d8562cbb7baa00", + "d921e2aa2b1b6778a84efdc7f1d016c7aad66dfc13c0be4fee6a5f303a2c3cf465fa0d549ca5fc57d3a26832bffcaec842837905a78e8ca3fa553522d931571d01" + ], + "inputs": [ + "c551da99c0b74b64511aaaf99536cb6d263958064890ef6c27be36e8f5a14fb8", + "64875d950120b16d0f0f84c708e3e48b26fb9c32f36c0fba71764dfc53e7ae05", + "ba50cb14fc26bcf658ace9a3b5d6e0d257fa022e80613902c693ab57a1c0924a", + "b388fdb6dc7c91cab7e72a4786967e18834350c1ccd149790a0a2270bdf91bf9", + "94f87596cb7471e2b96b7e1ddd8194d44ca4858d97ed29f83e926bcdf36601c1", + "dd2a4d942ba1ad4dc55f46adc31e3f62e7326b9a0d511f1faf83911af77018f1", + "35b82981a9648ba871c2c08604cb95f130baafa26761139c7134f5b9e4575b9d", + "aa0f74c067347b0178c6963d8409c6bdf7a39051641f9ba1a5d5c37d88dce7f0", + "5a34d07536c2964338aa89f19ab7ff857056f6ffd16e936ae13229077387afb5", + "dc93bb4a131cea3d3f2b523408f077779384c816a4516dfbe0817845938a26ef", + "53f92392b71ce79ead8452e5c31c8a404acf9770a71d4dc234f2fe54a8671495" + ], + "outputs": [ + { + "uxid": "061a639996b85d2c0f19cf929a83c5abe2667a411de31fbdbd16c1da6c8e4880", + "dst": "2gXHek83jtEdDndgrKkEwgwZZDsHXKfNaD", + "coins": "87.990000", + "hours": 1 + }, + { + "uxid": "f210a8ed58c92094832ccb4d5a4ae7271df1df0d7176b18d5c7b149ed36a7d80", + "dst": "27ckSMTwxMxHanUM1VmF8BV9JuWdQd4Gd9S", + "coins": "0.010000", + "hours": 94693 + } + ] + } + ] + }, + "size": 1190 + }, + { + "header": { + "seq": 58893, + "block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "previous_block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "timestamp": 1537581594, + "fee": 970389, + "version": 0, + "tx_body_hash": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "ux_hash": "bf35652af199779bc40cbeb339e8a782ff70673b07779e5c5621d37dfe13b42b" + }, + "body": { + "txns": [ + { + "length": 377, + "type": 0, + "txid": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "inner_hash": "a25232405bcef0c007bb2d7d3520f2a389e17e11125c252ab6c00168ec52c08d", + "sigs": [ + "2ff7390c3b66c6b0fbb2b4c59c8e218291d4cbb82a836bb577c7264677f4a8320f6f3ad72d804e3014728baa214c223ecced8725b64be96fe3b51332ad1eda4201", + "9e7c715f897b3c987c00ee8c6b14e4b90bb3e4e11d003b481f82042b1795b3c75eaa3d563cd0358cdabdab77cfdbead7323323cf73e781f9c1a8cf6d9b4f8ac100", + "5c9748314f2fe0cd442df5ebb8f211087111d22e9463355bf9eee583d44df1bd36addb510eb470cb5dafba0732615f8533072f80ae05fc728c91ce373ada1e7b00" + ], + "inputs": [ + "5f634c825b2a53103758024b3cb8578b17d56d422539e23c26b91ea397161703", + "16ac52084ffdac2e9169b9e057d44630dec23d18cfb90b9437d28220a3dc585d", + "8d3263890d32382e182b86f8772c7685a8f253ed475c05f7d530e9296f692bc9" + ], + "outputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388 + } + ] + } + ] + }, + "size": 377 + }, + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7" + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` +
+ + +### List wallet addresses +List addresses in a skycoin wallet. + +```bash +$ skycoin-cli listAddresses [wallet] +``` + +#### Example + +```bash +$ skycoin-cli listAddresses $WALLET_FILE +``` + +
+ View Output + +```json +{ + "addresses": [ + "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "2mEgmYt6NZHA1erYqbAeXmGPD5gqLZ9toFv", + "2cET6L4c6Bee5jucuzsTQUXFxWX76GZoDqv", + "2UrEV3Vyu5RJABZNukKRq25ggrrg96RUwdH", + "LJN5qGmLbJxLswzD3nFn3RFcmWJyZ2LGHY", + "QuLaPirJNUkBpMoe5tzzY7j6nJ5maUVJF1" + ] +} +``` +
+ +### List wallets +List wallets in the Skycoin wallet directory (`$DATA_DIR/wallets`) or in a specific directory. + +```bash +$ skycoin-cli listWallets [directory] +``` + +#### Examples + +##### List wallets in default wallets directory + +```bash +$ skycoin-cli listWallets +``` + +
+ View Output + +```json +{ + "directory": "/home/foo/.skycoin/wallets", + "wallets": [ + { + "name": "2018_02_04_45bc.wlt", + "label": "Your Wallet", + "address_num": 60 + }, + { + "name": "2018_03_22_6e61.wlt", + "label": "craptopia", + "address_num": 3 + }, + { + "name": "2018_04_01_198c.wlt", + "label": "wings", + "address_num": 2 + }, + { + "name": "secret_wallet.wlt", + "label": "", + "address_num": 1 + }, + { + "name": "skycoin_cli.wlt", + "label": "cli wallet", + "address_num": 6 + } + ] +} +``` +
+ +##### List wallets in specific wallet directory + +```bash +$ skycoin-cli listWallets . +``` + +
+ View Output + +```json +{ + "directory": "/home/foo/github.com/skycoin", + "wallets": [ + { + "name": "2018_02_04_45bc.wlt", + "label": "Your Wallet", + "address_num": 60 + }, + { + "name": "skycoin_cli.wlt", + "label": "cli wallet", + "address_num": 6 + } + ] +} +``` +
+ + +### Rich list +Returns the top N address (default 20) balances (based on unspent outputs). Optionally include distribution addresses (exluded by default). + +```bash +$ skycoin-cli richlist [top N addresses] [include distribution addresses] +``` + +#### Example +```bash +$ skycoin-cli richlist 5 false +``` + +
+ View Output + +```json +{ + "richlist": [ + { + "address": "2iNNt6fm9LszSWe51693BeyNUKX34pPaLx8", + "coins": "1072264.838000", + "locked": false + }, + { + "address": "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + "coins": "500000.000000", + "locked": false + }, + { + "address": "2jNwfvZNUoRLiFzJtmnevSF6TKPfSehvrc1", + "coins": "252297.068000", + "locked": false + }, + { + "address": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "236884.364000", + "locked": false + }, + { + "address": "2fR8BkeTRQC4R3ATNnujHsQQXcaB6m4Aqwo", + "coins": "173571.990000", + "locked": false + } + ] +} +``` +
+ +### Send +Make a skycoin transaction. + +```bash +$ skycoin-cli send [wallet] [to address] [amount] [flags] +``` + +``` +FLAGS: + -c, --change-address string Specify the change address. + Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets). + --csv string CSV file containing addresses and amounts to send + -a, --from-address string From address in wallet + -j, --json Returns the results in JSON format. + -m, --many string use JSON string to set multiple receive addresses and coins, + example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]' + -p, --password string Wallet password +``` + +#### Examples + +##### Sending to one receiver +```bash +$ skycoin-cli send $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT +``` + +##### Sending from a specific address in a wallet +```bash +$ skycoin-cli send $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRRESS +``` + +##### Sending change to a specific change address +```bash +$ skycoin-cli send $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRESS -c $CHANGE_ADDRESS +``` + +##### Sending to multiple addresses +```bash +$ skycoin-cli send $WALLET_FILE -a $FROM_ADDRESS -m '[{"addr":"$ADDR1", "coins": "$AMT1"}, {"addr":"$ADDR2", "coins": "$AMT2"}]' +``` + +##### Sending to addresses in a CSV file +```bash +$ cat < $CSV_FILE +2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP,123.1 +2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd,456.045 +yExu4fryscnahAEMKa7XV4Wc1mY188KvGw,0.3 +EOF +$ skycoin-cli send $WALLET_FILE -a $FROM_ADDRESS --csv $CSV_FILE +``` + +
+ View Output + +``` +txid:$TRANSACTION_ID +``` +
+ +> NOTE: When sending to multiple addresses each combination of address and coins need to be unique + Otherwise you get, `ERROR: Duplicate output in transaction` + +##### Generate a JSON output +```bash +$ skycoin-cli send $WALLET_FILE -a $FROM_ADDRESS --json $RECIPIENT_ADDRESS $AMOUNT +``` + +
+ View Output + +```json +{ + "txid": "$TRANSACTION_ID" +} +``` +
+ +### Show Seed +Show seed and seed passphrase of a wallet. + + +```bash +$ skycoin-cli showSeed [wallet] [flags] +``` + +``` +FLAGS: + -j, --json Returns the results in JSON format. + -p, --password string Wallet password +``` + +#### Examples + +##### Wallet with a seed + +```bash +$ skycoin-cli showSeed $WALLET_FILE +``` + +
+ View Output + ``` + eternal turtle seek nominee narrow much melody kite worth giggle shrimp horse + ``` +
+ +##### Wallet with a seed and a seed passphrase + +```bash +$ skycoin-cli showSeed $WALLET_FILE +``` + +
+ View Output +``` +eternal turtle seek nominee narrow much melody kite worth giggle shrimp horse +mypassphrase +``` +
+ +##### Wallet with a seed and a seed passphrase in JSON format + +```bash +$ skycoin-cli showSeed $WALLET_FILE -j +``` + +
+ View Output +```json +{ + "seed": "eternal turtle seek nominee narrow much melody kite worth giggle shrimp horse", + "seed_passphrase": "mypassphrase" +} +``` +
+ + + +### Show Config +Show the CLI tool's local configuration. + +#### Example +```bash +$ skycoin-cli showConfig +``` + +
+ View Output + +```json +{ + "data_directory": "/home/user/.skycoin", + "coin": "skycoin", + "rpc_address": "http://127.0.0.1:6420" +} +``` +
+ +### Status +#### Example +```bash +$ skycoin-cli status +``` + +
+ View Output + +```json +{ + "status": { + "blockchain": { + "head": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "unspents": 38171, + "unconfirmed": 1, + "time_since_last_block": "7m44s" + }, + "version": { + "version": "0.25.0", + "commit": "620405485d3276c16c0379bc3b88b588e34c45e1", + "branch": "develop" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.25.0", + "open_connections": 8, + "outgoing_connections": 5, + "incoming_connections": 3, + "uptime": "4h1m23.697072461s", + "csrf_enabled": true, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": true, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 1558864387, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com" + } + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:6420" + } +} +``` +
+ +### Get transaction +Get transaction data from a `txid`. + +```bash +$ skycoin-cli transaction [transaction id] +``` + +#### Example +```bash +$ skycoin-cli transaction 824d421a25f81aa7565d042a54b3e1e8fdc58bed4eefe8f8a90748da6d77d135 +``` + +
+ View Output + +```json +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 864 + }, + "txn": { + "length": 220, + "type": 0, + "txid": "824d421a25f81aa7565d042a54b3e1e8fdc58bed4eefe8f8a90748da6d77d135", + "inner_hash": "708a21c685041ba409b9634843003f263c7a00d99459925e319049f3e36f1163", + "timestamp": 1492141347, + "sigs": [ + "6772c4e1370faf7acd8fc37f6dba3bea06ad1beb1300074c33b2c6fa9b11ed7d2bcc01b7008f235aa918b9c146078dfb8e1c8ce55b0893ea5f111597b42331ba01" + ], + "inputs": [ + "c38c108ac3c76e5faffce0bb83153ec98bc1355a98e1a9b0f95ab1b98ef9f00e" + ], + "outputs": [ + { + "uxid": "b0586a8e731c475e87eb61ef0b845d7893cf39120a1e97cf05f78585f1a49e3c", + "dst": "2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy", + "coins": "166365", + "hours": 0 + }, + { + "uxid": "49c64719d8df905a7fd4a1c46c2a9c358a8c5ae14befb0d57dcfe1b1d36a1758", + "dst": "ep3axwpJ3hWWQcACu48z9sMKUB7snXBm94", + "coins": "1300", + "hours": 0 + } + ] + } + } +} +``` +
+ +### Get address transactions +Get transaction for one or more addresses - including listing of both inputs and outputs. + +```bash +$ skycoin-cli addressTransactions [addr1 addr2 addr3] +``` + +#### Example +#### Single Address +```bash +$ skycoin-cli addressTransactions 21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda +``` + +
+ View Output + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66119, + "block_seq": 21213 + }, + "time": 1523180676, + "txn": { + "timestamp": 1523180676, + "length": 220, + "type": 0, + "txid": "8cdf82ec42e8316007ed99c0b1de1d0dfd9221c757f41fdec0b36009df74085f", + "inner_hash": "c543f08bfe7b99a19f7bc4068a02e437ed4a043130e976551188c4d38b89ce8d", + "fee": 726, + "sigs": [ + "f1021744902892eb47c60f7240ce6964de3c7bf77777ce267b58df8879e208e57bd044d15a36d78bebab2897c2c61ecbbceb348cfc45152efb105960799364c401" + ], + "inputs": [ + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "owner": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "0020ae8da2bcc7657f3b234cbb59e0fd2486c53d7ef3f05cda6ff613587c8441", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "9d79ad07a90fee10b59bea1bd6f566f0b69f6bf9a9e735c1bec4b0e5eb4b33cb", + "dst": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "coins": "15.000000", + "hours": 725 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66111, + "block_seq": 21221 + }, + "time": 1523184376, + "txn": { + "timestamp": 1523184376, + "length": 183, + "type": 0, + "txid": "f3c5cfd462d95e724b7d35b1688c53f25a5f358f2eb9a6f87b63cdf31deb2bf8", + "inner_hash": "8269589c228be4bc33d75f6ee5b334856e8680b7d6ec275f897406c01da8340b", + "fee": 370, + "sigs": [ + "33879494d644df45b5c6c7111c0e453cd42f6fe718614a9411d9fbabd57ab24749813cdf47424dcac5ed097a0de0ac7b557154d2ec93f81b12b1dfdee5138df701" + ], + "inputs": [ + { + "uxid": "9d79ad07a90fee10b59bea1bd6f566f0b69f6bf9a9e735c1bec4b0e5eb4b33cb", + "owner": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "coins": "15.000000", + "hours": 725, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "c51b2692aa9f296a3cd2f37b14f39c496c82f5c5ae01c54701ea60b7353f27e2", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "15.000000", + "hours": 369 + } + ] + } + } +] +``` +
+ +#### Multiple Address +```bash +$ skycoin-cli addressTransactions 21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda 3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd +``` + +
+ View Output + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66143, + "block_seq": 21189 + }, + "time": 1523176026, + "txn": { + "timestamp": 1523176026, + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "fee": 1442, + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + { + "uxid": "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634", + "owner": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "17.000000", + "hours": 139, + "calculated_hours": 2875 + } + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66142, + "block_seq": 21190 + }, + "time": 1523176126, + "txn": { + "timestamp": 1523176126, + "length": 183, + "type": 0, + "txid": "8c137774a2485beeaa3f8e861097ba6dffb144fb2c2f2c357c9261a324b02013", + "inner_hash": "92da4c2d6e93a6f0a62899225a9195b95eb274f8e926b0a2ce5d259f84015014", + "fee": 1, + "sigs": [ + "84f9c7b5d1f88245b53d50e4e8d4fd8719089768940a4ff9d8c3d88b15c300e57f91fa07a0789bbfac8e7c77aebda83d39c6b77aa80cd70a613bf175c316b6cc00" + ], + "inputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "owner": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "5250017c47070e011cc71c44472d5ab8e957c25c9c57fc7885e0a4301c7c014c", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66119, + "block_seq": 21213 + }, + "time": 1523180676, + "txn": { + "timestamp": 1523180676, + "length": 220, + "type": 0, + "txid": "8cdf82ec42e8316007ed99c0b1de1d0dfd9221c757f41fdec0b36009df74085f", + "inner_hash": "c543f08bfe7b99a19f7bc4068a02e437ed4a043130e976551188c4d38b89ce8d", + "fee": 726, + "sigs": [ + "f1021744902892eb47c60f7240ce6964de3c7bf77777ce267b58df8879e208e57bd044d15a36d78bebab2897c2c61ecbbceb348cfc45152efb105960799364c401" + ], + "inputs": [ + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "owner": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "0020ae8da2bcc7657f3b234cbb59e0fd2486c53d7ef3f05cda6ff613587c8441", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "9d79ad07a90fee10b59bea1bd6f566f0b69f6bf9a9e735c1bec4b0e5eb4b33cb", + "dst": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "coins": "15.000000", + "hours": 725 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66118, + "block_seq": 21214 + }, + "time": 1523180976, + "txn": { + "timestamp": 1523180976, + "length": 220, + "type": 0, + "txid": "be67302e8f6f579423ba38be29de0de19815ec3c91352c6540e5f75439eb9f22", + "inner_hash": "ef091437da13980547e33aa8647cdd1462384ec73cd57caf289e5410e3a96cf0", + "fee": 2243, + "sigs": [ + "d8636af89bf7f7c6aeaf32a994f8efc6e62bc25bd4e2d7b0a4deeb1e0e2888c234895f978e051985964f8b522e7d68794b90d6404809464d6c86af7153d5896e01" + ], + "inputs": [ + { + "uxid": "c981f19ff129c5746940cbf4e57383bcdf524a02055219c629e5fc4ff74067ab", + "owner": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "3.000000", + "hours": 111, + "calculated_hours": 4486 + } + ], + "outputs": [ + { + "uxid": "ba74051563bbe6aac1836780770a66bf782a4b3a90c5ea341b43cb85a7f9d51b", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "80ad81c7de66f2839b24896340890c77a79b8409abdf8e9956f5e3b65baa545b", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "2.000000", + "hours": 2242 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66117, + "block_seq": 21215 + }, + "time": 1523181146, + "txn": { + "timestamp": 1523181146, + "length": 183, + "type": 0, + "txid": "5b6318a95f32487a6340f35a03cd46cba8c87d261e80ad3106a0e67d4cd4601b", + "inner_hash": "33144c33224f1a59f75fba415a67834260e7253958d7130a0e9c0fe342ff608e", + "fee": 1, + "sigs": [ + "231ac8febcb4b34f6742e2c6b20690c09acffea135707fb5b6679b9cf943b9b529a06cb161e3b51d0c37e5126ce9dbf59e87eaeac511ae06d2beca5d2300611500" + ], + "inputs": [ + { + "uxid": "0020ae8da2bcc7657f3b234cbb59e0fd2486c53d7ef3f05cda6ff613587c8441", + "owner": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "2a5d9458199c977779347d160f7db4978059c70217c44f8fc34716be43b7c6f1", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66112, + "block_seq": 21220 + }, + "time": 1523184176, + "txn": { + "timestamp": 1523184176, + "length": 183, + "type": 0, + "txid": "4acd61d7aa7dfe20795e517d7560643d049036af9451bcbd762793bcb6a4a6de", + "inner_hash": "c01a389f1018cf41d4ef36d550162999d82211f24f3d8b2cbf40a88edfaf690b", + "fee": 1, + "sigs": [ + "8ce6eff33887a8c2e31b669138163e2bcc2161782754d79c3a4c6839b4cf1fbc5a7d5e0576060d0378fbd9ee5c0f4863f949c77e7f724a4d66d75b2aed9123ae00" + ], + "inputs": [ + { + "uxid": "ba74051563bbe6aac1836780770a66bf782a4b3a90c5ea341b43cb85a7f9d51b", + "owner": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "a0777af14223bbbd5aeb8bf3cfd6ba94c776c6eec731310caaaaee49b9feb9a5", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66111, + "block_seq": 21221 + }, + "time": 1523184376, + "txn": { + "timestamp": 1523184376, + "length": 183, + "type": 0, + "txid": "f3c5cfd462d95e724b7d35b1688c53f25a5f358f2eb9a6f87b63cdf31deb2bf8", + "inner_hash": "8269589c228be4bc33d75f6ee5b334856e8680b7d6ec275f897406c01da8340b", + "fee": 370, + "sigs": [ + "33879494d644df45b5c6c7111c0e453cd42f6fe718614a9411d9fbabd57ab24749813cdf47424dcac5ed097a0de0ac7b557154d2ec93f81b12b1dfdee5138df701" + ], + "inputs": [ + { + "uxid": "9d79ad07a90fee10b59bea1bd6f566f0b69f6bf9a9e735c1bec4b0e5eb4b33cb", + "owner": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "coins": "15.000000", + "hours": 725, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "c51b2692aa9f296a3cd2f37b14f39c496c82f5c5ae01c54701ea60b7353f27e2", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "15.000000", + "hours": 369 + } + ] + } + } +] +``` +
+ +### Verify address +Verify whether a given address is a valid skycoin addres or not. + +```bash +$ skycoin-cli verifyAddress [skycoin address] +``` + +#### Example +##### Valid addresss + +```bash +$ skycoin-cli verifyAddress 21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda +``` + +``` +No Output +``` + +##### Invalid Address +###### Invalid checksum +```bash +$ skycoin-cli verifyAddress 21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsdx +``` + +
+ View Output + +``` +Invalid checksum +``` +
+ +###### Invalid address length +```bash +$ skycoin-cli verifyAddress 21YPg +``` + +
+ View Output + +``` +Invalid address length +``` +
+ + +### Check wallet balance +Check the wallet a skycoin wallet. + +```bash +$ skycoin-cli walletBalance [wallet] +``` + +#### Example +##### Balance of default wallet +```bash +$ skycoin-cli walletBalance +``` + +
+ View Output + +```json +{ + "confirmed": { + "coins": "123.000000", + "hours": "456" + }, + "spendable": { + "coins": "123.000000", + "hours": "456" + }, + "expected": { + "coins": "123.000000", + "hours": "456" + }, + "addresses": [ + { + "confirmed": { + "coins": "123.000000", + "hours": "456" + }, + "spendable": { + "coins": "123.000000", + "hours": "456" + }, + "expected": { + "coins": "123.000000", + "hours": "456" + }, + "address": "2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc" + }, { + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "address": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv" + } + ] +} +``` +
+ + +##### Balance of a specific wallet +```bash +$ skycoin-cli walletBalance 2018_04_01_198c.wlt +``` +*OR* + +```bash +$ skycoin-cli walletBalance ~/.skycoin/wallets/2018_04_01_198c.wlt +``` + +
+ View Output + +```json +{ + "confirmed": { + "coins": "31.000000", + "hours": "25255" + }, + "spendable": { + "coins": "31.000000", + "hours": "25255" + }, + "expected": { + "coins": "31.000000", + "hours": "25255" + }, + "addresses": [ + { + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "address": "29fDBQuJs2MDLymJsjyWH6rDjsyv995SrGU" + }, + { + "confirmed": { + "coins": "31.000000", + "hours": "25255" + }, + "spendable": { + "coins": "31.000000", + "hours": "25255" + }, + "expected": { + "coins": "31.000000", + "hours": "25255" + }, + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V" + } + ] +} +``` +
+ +### List wallet transaction history +Show all previous transactions made by the addresses in a wallet. + +```bash +$ skycoin-cli walletHistory [wallet] +``` + +#### Example + +```bash +$ skycoin-cli walletHistory $WALLET_FILE +``` + +
+ View Output + +```json +[ + { + "txid": "d1ded06a49b7588b897a2186bbe76de7ee93f49084ad35e1a7f47cbf6cd3a7fa", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "amount": "1.000000", + "timestamp": "2018-01-28T13:11:15Z", + "status": 1 + }, + { + "txid": "ad191f910e5508e0b0e0ab24ba815e784a1a2b63ca21043e7746bebf25106742", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "amount": "1.000000", + "timestamp": "2018-01-28T13:26:15Z", + "status": 1 + } +] +``` +
+ +### List wallet outputs +List unspent outputs of all addresses in a wallet. + +```bash +$ skycoin-cli walletOutputs [wallet] +``` + +#### Example + +```bash +$ skycoin-cli walletHistory $WALLET_FILE +``` + +
+ View Output + +```json +{ + "outputs": { + "head_outputs": [ + { + "hash": "c51b2692aa9f296a3cd2f37b14f39c496c82f5c5ae01c54701ea60b7353f27e2", + "time": 1523184376, + "block_seq": 21221, + "src_tx": "f3c5cfd462d95e724b7d35b1688c53f25a5f358f2eb9a6f87b63cdf31deb2bf8", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "15.000000", + "hours": 369, + "calculated_hours": 370 + }, + { + "hash": "a0777af14223bbbd5aeb8bf3cfd6ba94c776c6eec731310caaaaee49b9feb9a5", + "time": 1523184176, + "block_seq": 21220, + "src_tx": "4acd61d7aa7dfe20795e517d7560643d049036af9451bcbd762793bcb6a4a6de", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} +``` +
+ +### Richlist +Returns top N address (default 20) balances (based on unspent outputs). Optionally include distribution addresses (exluded by default). + +```bash +$ skycoin-cli richlist [top N addresses (20 default)] [include distribution addresses (false default)] +``` + +#### Example +##### Without distribution addresses +```bash +$ skycoin-cli richlist 2 +``` +
+ View Output + +```json +{ + "richlist": [ + { + "address": "zVzkqNj3Ueuzo54sbACcYBqqGBPCGAac5W", + "coins": "2922927.299000", + "locked": false + }, + { + "address": "2iNNt6fm9LszSWe51693BeyNUKX34pPaLx8", + "coins": "675256.308000", + "locked": false + } + ] +} +``` +
+ +##### Including distribution addresses +```bash +$ skycoin-cli richlist 2 true +``` + +
+ View Output + +```json +{ + "richlist": [ + { + "address": "zVzkqNj3Ueuzo54sbACcYBqqGBPCGAac5W", + "coins": "2922927.299000", + "locked": false + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.010000", + "locked": true + } + ] +} +``` +
+ +### Address Count +Returns the count of all addresses that currently have unspent outputs (coins) associated with them. + +```bash +$ skycoin-cli addresscount +``` + +#### Example +```bash +$ skycoin-cli addresscount +``` +
+ View Output + +```json +12961 +``` +
+ + +### CLI version +Get version of current skycoin cli. + +```bash +$ skycoin-cli version [flags] +``` + +``` +FLAGS: + -j, --json Returns the results in JSON format +``` + +#### Examples +##### Text output +```bash +$ skycoin-cli version +``` + +
+ View Output + +``` +skycoin:0.23.0 +cli:0.23.0 +rpc:0.23.0 +wallet:0.23.0 +``` +
+ +##### JSON output +```bash +$ skycoin-cli version --json +``` + +
+ View Output + +```json +{ + "skycoin": "0.23.0", + "cli": "0.23.0", + "rpc": "0.23.0", + "wallet": "0.23.0" +} +``` +
+ +### Distribute coins from genesis block + +Distribute the genesis block coins into the configured distribution addresses. +This is part of the fiber coin initialization procedure. After creating genesis +key configuration and running the initial node, use this command to divide the +genesis block into distribution addresses. + +```bash +$ skycoin-cli distributeGenesis [genesis address secret key] +``` + +The secret key is the secret key of the genesis address, which you would have +created when setting up the genesis block parameters. + +#### Example + +```bash +$ skycoin-cli distributeGenesis 87b2ae65a7475481f73288b617242261e2a451815e1c6a5478862dbb95e23e3e +``` + +
+ View Output + +There is no output in the terminal if the command succeeds. + +``` +``` +
diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli.go b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli.go new file mode 100644 index 00000000..571e37d5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli.go @@ -0,0 +1,34 @@ +/* +cli is a command line client for interacting with a skycoin node and offline wallet management +*/ +package main + +import ( + "fmt" + "os" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cli" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +func main() { + logging.SetLevel(logrus.WarnLevel) + + cfg, err := cli.LoadConfig() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + skyCLI, err := cli.NewCLI(cfg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := skyCLI.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli_test.go b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli_test.go new file mode 100644 index 00000000..86f01a22 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli_test.go @@ -0,0 +1,10 @@ +// +build testrunmain + +// This file allows us to run the entire program with test coverage enabled, useful for integration tests +package main + +import "testing" + +func TestRunMain(t *testing.T) { + main() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/README.md b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/README.md new file mode 100644 index 00000000..ac0df24e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/README.md @@ -0,0 +1,719 @@ +# Skycoin Daemon CLI Options + + + +- [Preface](#preface) +- [Scenarios](#scenarios) + - [Control which API endpoints are exposed](#control-which-api-endpoints-are-exposed) + - [Run a public API node](#run-a-public-api-node) + - [Run a public API node with a self-signed cert](#run-a-public-api-node-with-a-self-signed-cert) + - [Control which peers the node connects to](#control-which-peers-the-node-connects-to) + - [Add Basic auth to the REST API interface](#add-basic-auth-to-the-rest-api-interface) +- [Options](#options) + - [address](#address) + - [block-publisher](#block-publisher) + - [blockchain-public-key](#blockchain-public-key) + - [blockchain-secret-key](#blockchain-secret-key) + - [burn-factor-create-block](#burn-factor-create-block) + - [burn-factor-unconfirmed](#burn-factor-unconfirmed) + - [color-log](#color-log) + - [connection-rate](#connection-rate) + - [custom-peers-file](#custom-peers-file) + - [data-dir](#data-dir) + - [db-path](#db-path) + - [db-read-only](#db-read-only) + - [disable-api-sets](#disable-api-sets) + - [disable-csp](#disable-csp) + - [disable-csrf](#disable-csrf) + - [disable-default-peers](#disable-default-peers) + - [disable-header-check](#disable-header-check) + - [disable-incoming](#disable-incoming) + - [disable-outgoing](#disable-outgoing) + - [disable-pex](#disable-pex) + - [download-peerlist](#download-peerlist) + - [enable-all-api-sets](#enable-all-api-sets) + - [enable-api-sets](#enable-api-sets) + - [enable-gui](#enable-gui) + - [genesis-address](#genesis-address) + - [genesis-signature](#genesis-signature) + - [genesis-timestamp](#genesis-timestamp) + - [gui-dir](#gui-dir) + - [host-whitelist](#host-whitelist) + - [http-prof](#http-prof) + - [http-prof-host](#http-prof-host) + - [launch-browser](#launch-browser) + - [localhost-only](#localhost-only) + - [log-level](#log-level) + - [logtofile](#logtofile) + - [max-block-size](#max-block-size) + - [max-connections](#max-connections) + - [max-decimals-create-block](#max-decimals-create-block) + - [max-decimals-unconfirmed](#max-decimals-unconfirmed) + - [max-default-peer-outgoing-connections](#max-default-peer-outgoing-connections) + - [max-incoming-connections](#max-incoming-connections) + - [max-in-msg-len](#max-in-msg-len) + - [max-out-msg-len](#max-out-msg-len) + - [max-outgoing-connections](#max-outgoing-connections) + - [max-txn-size-create-block](#max-txn-size-create-block) + - [max-txn-size-unconfirmed](#max-txn-size-unconfirmed) + - [no-ping-log](#no-ping-log) + - [peerlist-size](#peerlist-size) + - [peerlist-url](#peerlist-url) + - [port](#port) + - [profile-cpu](#profile-cpu) + - [profile-cpu-file](#profile-cpu-file) + - [reset-corrupt-db](#reset-corrupt-db) + - [storage-dir](#storage-dir) + - [user-agent-remark](#user-agent-remark) + - [verify-db](#verify-db) + - [version](#version) + - [wallet-crypto-type](#wallet-crypto-type) + - [wallet-dir](#wallet-dir) + - [web-interface](#web-interface) + - [web-interface-addr](#web-interface-addr) + - [web-interface-cert](#web-interface-cert) + - [web-interface-https](#web-interface-https) + - [web-interface-key](#web-interface-key) + - [web-interface-password](#web-interface-password) + - [web-interface-plaintext-auth](#web-interface-plaintext-auth) + - [web-interface-port](#web-interface-port) + - [web-interface-username](#web-interface-username) +- [Development Environment Variables](#development-environment-variables) + - [USER_BURN_FACTOR](#userburnfactor) + - [USER_MAX_TXN_SIZE](#usermax_txnsize) + - [USER_MAX_DECIMALS](#usermaxdecimals) + + + + +## Preface + +*Note: The defaults shown below can vary depending on the build configuration.* + +``` +» go run cmd/skycoin/skycoin.go --help + +Usage: + -address string + IP Address to run application on. Leave empty to default to a public interface + -block-publisher + run the daemon as a block publisher + -blockchain-public-key string + public key of the blockchain (default "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a") + -blockchain-secret-key string + secret key of the blockchain + -burn-factor-create-block uint + coinhour burn factor applied when creating blocks (default 10) + -burn-factor-unconfirmed uint + coinhour burn factor applied to unconfirmed transactions (default 10) + -color-log + Add terminal colors to log output (default true) + -connection-rate duration + How often to make an outgoing connection (default 5s) + -custom-peers-file string + load custom peers from a newline separate list of ip:port in a file. Note that this is different from the peers.json file in the data directory + -data-dir string + directory to store app data (defaults to ~/.skycoin) (default "$HOME/.skycoin") + -db-path string + path of database file (defaults to ~/.skycoin/data.db) + -db-read-only + open bolt db read-only + -disable-api-sets string + disable API set. Options are READ, STATUS, WALLET, TXN, PROMETHEUS, NET_CTRL, INSECURE_WALLET_SEED, STORAGE. Multiple values should be separated by comma + -disable-csp + disable content-security-policy in http response + -disable-csrf + disable CSRF check + -disable-default-peers + disable the hardcoded default peers + -disable-header-check + disables the host, origin and referer header checks. + -disable-incoming + Don't allow incoming connections + -disable-networking + Disable all network activity + -disable-outgoing + Don't make outgoing connections + -disable-pex + disable PEX peer discovery + -download-peerlist + download a peers.txt from -peerlist-url (default true) + -enable-all-api-sets + enable all API sets, except for deprecated or insecure sets. This option is applied before -disable-api-sets. + -enable-api-sets string + enable API set. Options are READ, STATUS, WALLET, TXN, PROMETHEUS, NET_CTRL, INSECURE_WALLET_SEED, STORAGE. Multiple values should be separated by comma (default "READ,TXN") + -enable-gui + Enable GUI + -genesis-address string + genesis address (default "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6") + -genesis-signature string + genesis block signature (default "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700") + -genesis-timestamp uint + genesis block timestamp (default 1426562704) + -gui-dir string + static content directory for the HTML interface (default "./src/gui/static/") + -help + Show help + -host-whitelist string + Hostnames to whitelist in the Host header check. Only applies when the web interface is bound to localhost. + -http-prof + run the HTTP profiling interface + -http-prof-host string + hostname to bind the HTTP profiling interface to (default "localhost:6060") + -launch-browser + launch system default webbrowser at client startup + -localhost-only + Run on localhost and only connect to localhost peers + -log-level string + Choices are: debug, info, warn, error, fatal, panic (default "INFO") + -logtofile + log to file + -max-block-size uint + maximum total size of transactions in a block (default 32768) + -max-connections int + Maximum number of total connections allowed (default 128) + -max-decimals-create-block uint + max number of decimal places applied when creating blocks (default 3) + -max-decimals-unconfirmed uint + max number of decimal places applied to unconfirmed transactions (default 3) + -max-default-peer-outgoing-connections int + The maximum default peer outgoing connections allowed (default 1) + -max-in-msg-len int + Maximum length of incoming wire messages (default 1048576) + -max-out-msg-len int + Maximum length of outgoing wire messages (default 262144) + -max-outgoing-connections int + Maximum number of outgoing connections allowed (default 8) + -max-txn-size-create-block uint + maximum size of a transaction applied when creating blocks (default 32768) + -max-txn-size-unconfirmed uint + maximum size of an unconfirmed transaction (default 32768) + -no-ping-log + disable "reply to ping" and "received pong" debug log messages + -peerlist-size int + Max number of peers to track in peerlist (default 65535) + -peerlist-url string + with -download-peerlist=true, download a peers.txt file from this url (default "https://downloads.skycoin.com/blockchain/peers.txt") + -port int + Port to run application on (default 6000) + -profile-cpu + enable cpu profiling + -profile-cpu-file string + where to write the cpu profile file (default "cpu.prof") + -reset-corrupt-db + reset the database if corrupted, and continue running instead of exiting + -storage-dir string + location of the storage data files. Defaults to ~/.skycoin/data/ + -user-agent-remark string + additional remark to include in the user agent sent over the wire protocol + -verify-db + check the database for corruption + -version + show node version + -wallet-crypto-type string + wallet crypto type. Can be sha256-xor or scrypt-chacha20poly1305 (default "scrypt-chacha20poly1305") + -wallet-dir string + location of the wallet files. Defaults to ~/.skycoin/wallet/ + -web-interface + enable the web interface (default true) + -web-interface-addr string + addr to serve web interface on (default "127.0.0.1") + -web-interface-cert string + skycoind.cert file for web interface HTTPS. If not provided, will autogenerate or use skycoind.cert in --data-dir + -web-interface-https + enable HTTPS for web interface + -web-interface-key string + skycoind.key file for web interface HTTPS. If not provided, will autogenerate or use skycoind.key in --data-dir + -web-interface-password string + password for the web interface + -web-interface-plaintext-auth + allow web interface auth without https + -web-interface-port int + port to serve web interface on (default 6420) + -web-interface-username string + username for the web interface +``` + +## Scenarios + +### Control which API endpoints are exposed + +API endpoints are grouped into "API sets", and can be toggled on or off through CLI options. + +There are three options for controlling the API sets that are enabled: + +* `--enable-api-sets` +* `--enable-all-api-sets` +* `--disable-api-sets` + +To blacklist specific API sets, combine `--enable-all-api-sets` with `--disable-api-sets`. + +To whitelist specific API sets, use `--enable-api-sets`. + +Note that certain API sets must be explicitly enabled. These API sets are either deprecated or have security implications. + +Read more about API sets here: https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#api-sets + +### Run a public API node + +This example does not use HTTPS. We recommend you follow the nginx guide below +to add HTTPS to your API node. + +```sh +$ go run cmd/skycoin/skycoin.go \ + --web-interface-addr=0.0.0.0 \ + --enable-api-sets=READ,TXN +``` + +This will expose your node's API on your server's public IP and on the default port 6420. + +### Run a public API node with a self-signed cert + +When you run with the HTTPS option, the daemon will use a cert and key file from the `data-dir`. +This cert and key file will be autogenerated if they are missing from the `data-dir`. + +```sh +go run cmd/skycoin/skycoin.go \ + --web-interface-https \ + --web-interface-addr=0.0.0.0 \ + --enable-api-sets=READ,TXN +``` + +Alternatively, you can specify the cert and key files to be some other location. If specified, they will not be autogenerated. +The specified files must exist: + +```sh +go run cmd/skycoin/skycoin.go \ + --web-interface-https \ + --web-interface-key=/var/local/skycoind.key \ + --web-interface-cert=/var/local/skycoind.cert \ + --enable-api-sets=READ,TXN +``` + +If you want to use a signed cert, we recommend handling that with nginx, which will also help you bind to port 80/443. + +### Control which peers the node connects to + +First, make sure the `peers.json` file in the `data-dir` is empty or does not exist. + +Provide a `custom-peers-file`, which is a newline separated list of ip:port entries. + +Disable the default bootstrap peers, and disable the remote peerlist bootstrap. + +There is no explicit setting for max incoming connections; it is equal to the difference between `--max-connections` and `--max-outgoing-connections`, +so set these two options to the same value. + +```sh +go run cmd/skycoin/skycoin.go \ + --custom-peers-file=peers-whitelist.txt \ + --disable-default-peers \ + --download-peerlist=false \ + --max-connections=8 \ + --max-outgoing-connections=8 \ + --disable-pex \ + --disable-incoming +``` + +### Add Basic auth to the REST API interface + +This will enable `Basic` auth on the REST API interface. It will use HTTPS with an autogenerated self-signed cert. +Your client will need to be configured to accept this cert in requests. + +*TODO - describe how to configure the cli client to use the self-signed cert* + +```sh +$ go run cmd/skycoin/skycoin.go \ + --web-interface-https \ + --web-interface-username=abcdef \ + --web-interface-password='aCN@9xA)(CZasdmc' +``` + +## Options + +### address + +The bind interface address for the wire protocol. Binds to a public interface by default. + +### block-publisher + +Runs the node as a block publisher. Must set `blockchain-secret-key`. + +### blockchain-public-key + +The public key of the block signer + +### blockchain-secret-key + +The secret key of the block signer. Required for `block-publisher` mode. + +### burn-factor-create-block + +The coin hour burn factor applied to transactions when creating blocks. +Transactions that don't satisfy this burn factor will not be included in blocks. +Only applies when running in `block-publisher` mode. + +### burn-factor-unconfirmed + +The coin hour burn factor applied to unconfirmed transactions received over the network. +Transactions that don't satisfy this burn factor will not be propagated to peers. + +### color-log + +Use color highlighting in the log output. Disable this when logging to a file. + +### connection-rate + +How often an outgoing connection attempt is made. +A faster rate will establish a stable connection sooner, but if it is too fast +it can overconnect and churn connections. + +### custom-peers-file + +Load peers from this file into the peer database. The file format is a newline-separated list of ip:port entries. +These peers are *added* to any existing peer database; it does not restrict the peers to those in this file. + +### data-dir + +The storage location for application data. By default, the database, wallets, peers cache and other data files +will be saved into this folder. + +On Linux and MacOS, this folder defaults to `$HOME/.skycoin` (`~/.skycoin`). +On Windows release builds, this folder defaults to `%HOMEPATH%\.skycoin` (`C:\Users\{user}\.skycoin`). +On Windows development builds, this folder defaults to `C:\.skycoin`. *(Note: this is a bug and will change in the future)* + +### db-path + +The path of the blockchain database file. Defaults to a file named `data.db` in `data-dir`. + +### db-read-only + +Open the database file in read-only mode. + +### disable-api-sets + +Disable one or more API sets. Possible API sets are: +`READ`, `STATUS`, `WALLET`, `TXN`, `PROMETHEUS`, `NET_CTRL`, `INSECURE_WALLET_SEED`, `STORAGE`. +Multiple values should be separated by comma. Combine with `enable-all-api-sets` to blacklist specific API sets. + +Read more about API sets here: https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#api-sets + +### disable-csp + +Disable the Content Security Policy header sent in REST API responses. + +### disable-csrf + +Disable the CSRF check for the REST API. The REST API requires a CSRF token for all `POST` and `DELETE` requests. +This is to protect the wallet client from certain attacks. If you do not have a hot wallet or do not expose your node +to a browser, it is safe to disable CSRF. + +### disable-default-peers + +Disable the default hardcoded peer list. These peers are treated differently than others; the node will always try to maintain +at least `max-default-peer-outgoing-connections` connections to peers in this list. These peers should be disabled when configuring the +node for network isolation. + +### disable-header-check + +As a security policy, the REST API will require certain values for the +`Host`, `Origin` and `Referer` headers in requests unless disabled by this option. + +### disable-incoming + +Disable all incoming connections on the wire interface. The listener will not bind to the configured `address`. + +### disable-outgoing + +Don't make any outgoing connections. + +### disable-pex + +Don't request or accept peers over the wire. + +### download-peerlist + +If true, a peer list will be downloaded from `--peerlist-url`. The peer list file format is a newline-separated list of +ip:port entries. This list helps to bootstrap the initial peer database. These peers are considered "regular" peers, as opposed +to the peers from the hardcoded default peer list which are handled slightly differently. + +### enable-all-api-sets + +Enable all API sets except for those marked `INSECURE` or `DEPRECATED`. +Combine with `disable-api-sets` to blacklist specific API sets. +Use `enable-api-sets` in addition to `enable-all-api-sets` in order to enable specific `INSECURE` or `DEPRECATED` API sets. + +Read more about API sets here: https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#api-sets + +### enable-api-sets + +Enable one or more API sets. Possible API sets are: +`READ`, `STATUS`, `WALLET`, `TXN`, `PROMETHEUS`, `NET_CTRL`, `INSECURE_WALLET_SEED`, `STORAGE`. +Multiple values should be separated by comma. + +Read more about API sets here: https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#api-sets + +### enable-gui + +Serve the wallet GUI pages over the `web-interface-addr` and `web-interface-port` on the root path `/`. + +### genesis-address + +The genesis address in the genesis block. This is used to reconstruct the genesis block, which is hardcoded in every client. + +### genesis-signature + +After the genesis block was created, it should have been signed by the `blockchain-secret-key`. This signature is configured here. + +### genesis-timestamp + +The timestamp of the genesis block. This is used to reconstruct the genesis, which is hardcoded in every client. + +### gui-dir + +The static content directory for the wallet GUI interface. + +### host-whitelist + +A comma separated list of hostnames to allow in the `Host`, `Origin` and `Referer` headers. +Use this when hosting the web interface on a domain name or proxying it through another IP address. +Or, these header checks can be disabled entirely with `disable-header-check`. + +### http-prof + +Enables go's http profiler interface, `pprof`. + +Read more about `pprof`: https://github.com/SkycoinProject/skycoin/wiki/Profiling-with-pprof + +### http-prof-host + +The interface address to bind the http profiler to. + +### launch-browser + +Open the web interface in the user's default browser. + +### localhost-only + +Bind the wire protocol `address` to localhost and only make connections to other localhost peers. + +### log-level + +Choose the log level verbosity. Choices are: `debug`, `info`, `warn`, `error`, `fatal`, `panic`. + +### logtofile + +Write the log output to a file in `data-dir`. The logs will still be written to stdout. + +### max-block-size + +Maximum total size of transactions allowed when creating a new block. This value does not affect existing blocks. +The size of a transaction is the length of its byte representation in the [Skycoin binary encoding format](https://github.com/SkycoinProject/skycoin/wiki/Skycoin-Binary-Encoding-Format). +Note that `max-block-size` is only the size limit of the transactions portion of a block; this limit does not include block metadata. +Only applies when running in `block-publisher` mode. + +### max-connections + +The maximum total number of connections to make over the wire protocol. + +### max-decimals-create-block + +The maximum number of decimal places applied to transactions when creating blocks. +Transactions that create outputs that exceed the decimal place limit will not be included in blocks. +Only applies when running in `block-publisher` mode. + +### max-decimals-unconfirmed + +The maximum number of decimal places applied to unconfirmed transactions received over the network. +Transactions that create outputs that exceed the decimal place limit will not be propagated to peers. + +### max-default-peer-outgoing-connections + +The maximum number of connections to maintain to peers from the hardcoded default peer list. +The peers in the hardcoded default peer list are maintained by Skycoin and are kept up to date with current +configurations. This value is 1 by default, to ensure at least one known stable connection is held. +More than 1 connections are not typically made, to avoid saturating the default peer connections. + +### max-incoming-connections + +**This is not an option.** This value is equal to `max-connections` minus `max-outgoing-connections`. + +### max-in-msg-len + +Maximum length of incoming wire messages. Wire messages can include block and transaction data, so this limit should +be in accordance with `max-txn-size` and `max-block-size`. +If a peer sends a message that exceeds this limit, we disconnect from that peer. + +### max-out-msg-len + +Maximum length of outgoing wire messages. Wire messages can include block and transaction data, so this limit should +be in accordance with `max-txn-size` and `max-block-size`. +If we send a message that exceeds a peer's `max-in-msg-len`, they'll disconnect from us. + +### max-outgoing-connections + +The maximum total number of outgoing connections to make over the wire protocol. + +### max-txn-size-create-block + +The maximum transaction size applied to transactions when creating blocks. +The size of a transaction is the length of its byte representation in the [Skycoin binary encoding format](https://github.com/SkycoinProject/skycoin/wiki/Skycoin-Binary-Encoding-Format). +Transactions that exceed this size will not be included in blocks. +Only applies when running in `block-publisher` mode. + +### max-txn-size-unconfirmed + +The maximum transaction size applied to unconfirmed transactions received over the network. +The size of a transaction is the length of its byte representation in the [Skycoin binary encoding format](https://github.com/SkycoinProject/skycoin/wiki/Skycoin-Binary-Encoding-Format). +Transactions that exceed this size will not be propagated to peers. + +### no-ping-log + +Disable the "reply to ping" and "received pong" debug log messages. +These are particularly noisy, and unfortunately we only have one log level for debug, +so this option was added to disable them explicitly. + +### peerlist-size + +Maximum number of peers to track in the local peer database. + +### peerlist-url + +The URL of the remote peer list bootstrap file. Defaults to https://downloads.skycoin.com/blockchain/peers.txt. + +### port + +Port to bind for the wire protocol interface. + +### profile-cpu + +Enable the CPU profiler with `pprof`. + +Read more about `pprof`: https://github.com/SkycoinProject/skycoin/wiki/Profiling-with-pprof + +### profile-cpu-file + +Where to write the CPU profile data to, on exit. + +### reset-corrupt-db + +If the database is detected to be corrupted during startup, reset the database and continue running. +Otherwise, the application will abort if it detect a corrupted database. + +The database is not always checked for corruption; it is only checked when upgrading the software and +if the upgraded version determines a corruption check is necessary. However, if `verify-db` is enabled, +then the database is always checked for corruption. + +### storage-dir + +Location where the generic data storage files are saved. Defaults to a folder named `data` inside of the `data-dir`. + +### user-agent-remark + +An additional remark to include in the user agent that is sent in the introduction packet over the wire protocol + +### verify-db + +Unconditionally check the database for corruption on start. + +The database is not always checked for corruption; it is only checked when upgrading the software and +if the upgraded version determines a corruption check is necessary. + +### version + +Print the node version and exit. + +### wallet-crypto-type + +Choose the encryption method for encrypted wallet data. Options are `sha256-xor` or `scrypt-chacha20poly1305`. +Do not use this option unless you know exactly what you are choosing; not every option provides meaningful encryption. + +### wallet-dir + +Location where the wallet files are saved. Defaults to a folder named `wallet` inside of the `data-dir`. + +### web-interface + +Enable the REST API interface. By default, it serves on http://127.0.0.1:6420. + +### web-interface-addr + +Address to bind the REST API interface to. Default `127.0.0.1`. Use `0.0.0.0` to bind to the machine's public IP interface. + +### web-interface-cert + +The certificate file for the HTTPS REST API. If not provided and HTTPS is enabled, the cert defaults to a file named `skycoind.cert` +in the `data-dir`. If this file does not exist, it will be autogenerated. + +### web-interface-https + +Use HTTPS for the REST API interface. + +### web-interface-key + +The key file for the HTTPS REST API. If not provided and HTTPS is enabled, the cert defaults to a file named `skycoind.key` +in the `data-dir`. If this file does not exist, it will be autogenerated. + +### web-interface-password + +Optional password for the REST API. Used in `Basic` authentication. + +### web-interface-plaintext-auth + +If this setting is not true, the application will not run if the REST API does not have HTTPS enabled and +is configured to use a username and/or password +(that is, if at least one of `web-interface-username` or `web-interface-password` are set). +This is to avoid sending authorization credentials in plaintext accidentally. The user must enable this setting explicitly to +send credentials in plain text. + +### web-interface-port + +Port number for the REST API interface. Default `6420`. + +### web-interface-username + +Optional username for the REST API. Used in `Basic` authentication. + +## Development Environment Variables + +These environment variables are for *development purposes only*. They are not intended +as part of the normal configuration API. That is why they are not included in the normal +configuration API (i.e. through cli `--options` or a configuration file). + +### USER_BURN_FACTOR + +The coin hour burn factor is the denominator in the ratio of coinhours that must be burned by a transaction. +For example, a burn factor of 2 means 1/2 of hours must be burned. A burn factor of 10 means 1/10 of coin hours must be burned. + +The coin hour burn factor can be configured with a `USER_BURN_FACTOR` envvar. It cannot be configured through the command line. + +```sh +$ USER_BURN_FACTOR=999 ./run-client.sh +``` + +This burn factor applies to user-created transactions. + +To control the burn factor in other scenarios, use `burn-factor-unconfirmed` and `burn-factor-create-block`. + +### USER_MAX_TXN_SIZE + +```sh +$ USER_MAX_TXN_SIZE=1024 ./run-client.sh +``` + +This maximum transaction size applies to user-created transactions. + +To control the transaction size in other scenarios, use `max-txn-size-unconfirmed` and `max-txn-size-create-block`. + +To control the max block size, use `max-block-size`. + +Transaction and block size are measured in bytes. + +### USER_MAX_DECIMALS + +```sh +$ USER_MAX_DECIMALS=4 ./run-client.sh +``` + +This maximum transaction size applies to user-created transactions. + +To control the maximum decimals in other scenarios, use `max-decimals-unconfirmed` and `max-decimals-create-block`. diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin.go b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin.go new file mode 100644 index 00000000..073aa3e8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin.go @@ -0,0 +1,130 @@ +/* +skycoin daemon +*/ +package main + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +import ( + "flag" + _ "net/http/pprof" + "os" + + "github.com/SkycoinProject/skycoin/src/fiber" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/skycoin" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + // Version of the node. Can be set by -ldflags + Version = "0.27.0" + // Commit ID. Can be set by -ldflags + Commit = "" + // Branch name. Can be set by -ldflags + Branch = "" + // ConfigMode (possible values are "", "STANDALONE_CLIENT"). + // This is used to change the default configuration. + // Can be set by -ldflags + ConfigMode = "" + + logger = logging.MustGetLogger("main") + + // CoinName name of coin + CoinName = "skycoin" + + // GenesisSignatureStr hex string of genesis signature + GenesisSignatureStr = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" + // GenesisAddressStr genesis address string + GenesisAddressStr = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" + // BlockchainPubkeyStr pubic key string + BlockchainPubkeyStr = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" + // BlockchainSeckeyStr empty private key string + BlockchainSeckeyStr = "" + + // GenesisTimestamp genesis block create unix time + GenesisTimestamp uint64 = 1426562704 + // GenesisCoinVolume represents the coin capacity + GenesisCoinVolume uint64 = 100000000000000 + + // DefaultConnections the default trust node addresses + DefaultConnections = []string{ + "139.162.121.185:6000", + "172.104.164.147:6000", + "139.162.248.183:6000", + "45.56.109.228:6000", + "173.230.130.174:6000", + "139.162.39.186:6000", + "45.33.111.142:6000", + "109.237.27.172:6000", + "172.104.41.14:6000", + } + + nodeConfig = skycoin.NewNodeConfig(ConfigMode, fiber.NodeConfig{ + CoinName: CoinName, + GenesisSignatureStr: GenesisSignatureStr, + GenesisAddressStr: GenesisAddressStr, + GenesisCoinVolume: GenesisCoinVolume, + GenesisTimestamp: GenesisTimestamp, + BlockchainPubkeyStr: BlockchainPubkeyStr, + BlockchainSeckeyStr: BlockchainSeckeyStr, + DefaultConnections: DefaultConnections, + PeerListURL: "https://downloads.skycoin.com/blockchain/peers.txt", + Port: 6000, + WebInterfacePort: 6420, + DataDirectory: "$HOME/.skycoin", + + UnconfirmedBurnFactor: 10, + UnconfirmedMaxTransactionSize: 32768, + UnconfirmedMaxDropletPrecision: 3, + CreateBlockBurnFactor: 10, + CreateBlockMaxTransactionSize: 32768, + CreateBlockMaxDropletPrecision: 3, + MaxBlockTransactionsSize: 32768, + + DisplayName: "Skycoin", + Ticker: "SKY", + CoinHoursName: "Coin Hours", + CoinHoursNameSingular: "Coin Hour", + CoinHoursTicker: "SCH", + ExplorerURL: "https://explorer.skycoin.com", + VersionURL: "https://version.skycoin.com/skycoin/version.txt", + Bip44Coin: 8000, + }) + + parseFlags = true +) + +func init() { + nodeConfig.RegisterFlags() +} + +func main() { + if parseFlags { + flag.Parse() + } + + // create a new fiber coin instance + coin := skycoin.NewCoin(skycoin.Config{ + Node: nodeConfig, + Build: readable.BuildInfo{ + Version: Version, + Commit: Commit, + Branch: Branch, + }, + }, logger) + + // parse config values + if err := coin.ParseConfig(); err != nil { + logger.Error(err) + os.Exit(1) + } + + // run fiber coin node + if err := coin.Run(); err != nil { + os.Exit(1) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin_test.go b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin_test.go new file mode 100644 index 00000000..7f3a2d17 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin_test.go @@ -0,0 +1,20 @@ +// +build testrunmain + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +// This file allows us to run the entire program with test coverage enabled, useful for integration tests +package main + +import "testing" + +func init() { + // Disable flag.Parse because go's test runner calls it instead + parseFlags = false +} + +func TestRunMain(t *testing.T) { + main() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/Dockerfile b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/Dockerfile new file mode 100644 index 00000000..4b1e5d4e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/Dockerfile @@ -0,0 +1,228 @@ +# Creates an image for skycoin development +FROM golang:1.11-stretch + +ARG BDATE="test_build" +ARG SCOMMIT="develop" + +# Image labels (see ./hooks/build for ARGS) +LABEL "org.label-schema.name"="skycoindev-cli" \ + "org.label-schema.description"="Docker image with go, node and command line tools for Skycoin developers" \ + "org.label-schema.vendor"="Skycoin project" \ + "org.label-schema.url"="skycoin.com" \ + "org.label-schema.schema-version"="1.0" \ + "org.label-schema.build-date"=$BDATE \ + "org.label-schema.vcs-url"="https://github.com/SkycoinProject/skycoin.git" \ + "org.label-schema.vcs-ref"=$SCOMMIT \ + "org.label-schema.usage"="https://github.com/SkycoinProject/skycoin/blob/"$SCOMMIT"/docker/images/dev-cli/README.md" \ + "org.label-schema.version"="1.0.0-rc.1" \ + "org.label-schema.docker.cmd"="mkdir src; docker run --rm -v src:/go/src SkycoinProject/skycoindev-cli ; go get github.com/SkycoinProject/skycoin ; sudo chown -R `whoami` src" + +# Installs nodejs and npm. Needed for moxygen. + +# Packages installed in buildpack-deps:stretch +RUN set -ex; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + autoconf \ + automake \ + bzip2 \ + dpkg-dev \ + file \ + g++ \ + gcc \ + imagemagick \ + libbz2-dev \ + libc6-dev \ + libcurl4-openssl-dev \ + libdb-dev \ + libevent-dev \ + libffi-dev \ + libgdbm-dev \ + libgeoip-dev \ + libglib2.0-dev \ + libjpeg-dev \ + libkrb5-dev \ + liblzma-dev \ + libmagickcore-dev \ + libmagickwand-dev \ + libncurses5-dev \ + libncursesw5-dev \ + libpng-dev \ + libpq-dev \ + libreadline-dev \ + libsqlite3-dev \ + libssl-dev \ + libtool \ + libwebp-dev \ + libxml2-dev \ + libxslt-dev \ + libyaml-dev \ + make \ + patch \ + xz-utils \ + zlib1g-dev \ + build-essential \ + ruby \ + ruby-dev \ + \ +# No need for MySQL client +# +# # https://lists.debian.org/debian-devel-announce/2016/09/msg00000.html +# $( \ +# # if we use just "apt-cache show" here, it returns zero because "Can't select versions from package 'libmysqlclient-dev' as it is purely virtual", hence the pipe to grep +# if apt-cache show 'default-libmysqlclient-dev' 2>/dev/null | grep -q '^Version:'; then \ +# echo 'default-libmysqlclient-dev'; \ +# else \ +# echo 'libmysqlclient-dev'; \ +# fi \ +# ) \ + ; \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* + +# Build steps in node:10 (uid=2000) +RUN groupadd --gid 2000 node \ + && useradd --uid 2000 --gid node --shell /bin/bash --create-home node + +# gpg keys listed at https://github.com/nodejs/node#release-team +RUN set -ex \ + && for key in \ + 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ + FD3A5288F042B6850C66B31F09FE44734EB7990E \ + 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ + DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ + C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ + B9AE9905FFD7803F25714661B63B535A4C206CA9 \ + 56730D5401028683275BD23C23EFEFE93C4CFFFE \ + 77984A986EBC2AA786BC0F66B01FBB92821C587A \ + ; do \ + gpg --no-tty --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ + gpg --no-tty --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ + gpg --no-tty --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ + done + +ENV NODE_VERSION 10.13.0 + +RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \ + && case "${dpkgArch##*-}" in \ + amd64) ARCH='x64';; \ + ppc64el) ARCH='ppc64le';; \ + s390x) ARCH='s390x';; \ + arm64) ARCH='arm64';; \ + armhf) ARCH='armv7l';; \ + i386) ARCH='x86';; \ + *) echo "unsupported architecture"; exit 1 ;; \ + esac \ + && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \ + && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ + && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ + && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ + && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ + && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ + && ln -s /usr/local/bin/node /usr/local/bin/nodejs + +ENV YARN_VERSION 1.12.3 + +RUN set -ex \ + && for key in \ + 6A010C5166006599AA17F08146C2130DFD2497F5 \ + ; do \ + gpg --no-tty --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ + gpg --no-tty --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ + gpg --no-tty --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ + done \ + && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \ + && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \ + && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \ + && mkdir -p /opt \ + && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \ + && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \ + && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \ + && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz + +# Installs software +RUN set -ex ; \ + apt-get update ; \ + apt-get install -y --no-install-recommends \ + cmake \ + libpcre3-dev \ + gdbserver \ + gdb \ + vim \ + less \ + ctags \ + vim-scripts \ + screen \ + sudo \ + doxygen \ + valgrind \ + bsdmainutils \ + texlive-latex-base \ + ; \ + apt-get clean ; \ + rm -rf /var/lib/apt/lists/* ; \ + npm install moxygen -g ; \ + \ + \ + echo 'Installing Criterion ...' ; \ + git clone --recurse-submodules -j8 https://github.com/skycoin/Criterion /go/Criterion ; \ + cd /go/Criterion ; \ + cmake . ; \ + make install ; \ + rm -r /go/Criterion ; \ + echo 'Success nstalling Criterion ...' + +# Installs go development tools +RUN go get -u github.com/derekparker/delve/cmd/dlv && \ + go get -u github.com/FiloSottile/vendorcheck && \ + go get -u github.com/alecthomas/gometalinter && \ + gometalinter --vendored-linters --install && \ + go get -u github.com/zmb3/gogetdoc && \ + go get -u golang.org/x/tools/cmd/guru && \ + go get -u github.com/davidrjenni/reftools/cmd/fillstruct && \ + go get -u github.com/rogpeppe/godef && \ + go get -u github.com/fatih/motion && \ + go get -u github.com/nsf/gocode && \ + go get -u github.com/jstemmer/gotags && \ + go get -u github.com/josharian/impl && \ + go get -u github.com/fatih/gomodifytags && \ + go get -u github.com/dominikh/go-tools/cmd/keyify && \ + go get -u golang.org/x/tools/cmd/gorename && \ + go get -u github.com/klauspost/asmfmt/cmd/asmfmt && \ + go get -u github.com/vektra/mockery/.../ && \ + go get -u github.com/wadey/gocovmerge && \ + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + + +# Install vim-go development tools +RUN git clone https://github.com/fatih/vim-go /usr/share/vim/vim80/pack/dev/start/vim-go && \ + git clone https://github.com/tpope/vim-fugitive /usr/share/vim/vim80/pack/dev/start/vim-fugitive && \ + git clone https://github.com/Shougo/vimshell.vim /usr/share/vim/vim80/pack/dev/start/0vimshell && \ + git clone https://github.com/Shougo/vimproc.vim /usr/share/vim/vim80/pack/dev/start/0vimproc && \ + git clone https://github.com/w0rp/ale.git /usr/share/vim/vim80/pack/dev/start/ale && \ + cd /usr/share/vim/vim80/pack/dev/start/0vimproc && make ;\ + git clone https://github.com/iberianpig/tig-explorer.vim.git /tmp/tig-explorer;\ + cp /tmp/tig-explorer/autoload/tig_explorer.vim /usr/share/vim/vim80/autoload;\ + cp /tmp/tig-explorer/plugin/tig_explorer.vim /usr/share/vim/vim80/plugin;\ + rm -rf /tmp/tig-explorer + + +# Install SWIG-3.0.12 +RUN cd /tmp/; \ + wget http://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz && \ + tar -zxf swig-3.0.12.tar.gz ; \ + cd swig-3.0.12 ;\ + ./configure --prefix=/usr && make && make install && \ + rm -rf /tmp/swig-* +# Install Travis CLI +# Install golangci-lint +ENV GOLANGCI_LINT 1.12.3 +RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b $GOPATH/bin v$GOLANGCI_LINT + +# Install Travis CLI +RUN gem install travis + +WORKDIR $GOPATH/src/github.com/skycoin +VOLUME $GOPATH/src/ + +ENV LD_LIBRARY_PATH=/usr/local/lib diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/README.md b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/README.md new file mode 100644 index 00000000..9eea4972 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/README.md @@ -0,0 +1,83 @@ +# Supported tags and respective `Dockerfile` links + +## Simple Tags + +- [`latest` (*docker/images/dev-cli/Dockerfile*)](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-cli/Dockerfile) + +# Skycoin development image + +This image has the necessary tools to build, test, edit, lint and version the Skycoin +source code. It comes with the Vim editor installed, along with some plugins +to ease go development and version control with git. + +_Plase note that there is also a sister image with ["docker in docker"](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-docker/) feature on it._ + +# How to use this image + +## Initialize your development environment. + +```sh +$ mkdir src +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + go get github.com/SkycoinProject/skycoin +$ sudo chown -R `whoami` src +``` + +This downloads the skycoin source to src/SkycoinProject/skycoin and changes the owner +to your user. This is necessary, because all processes inside the container run +as root and the files created by it are therefore owned by root. + +If you already have a Go development environment installed, you just need to +mount the src directory from your $GOPATH in the /go/src volume of the +container. + +## Running commands inside the container + +You can run commands by just passing the them to the image. Everything is run +in a container and deleted when finished. + +### Running tests + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + sh -c "cd skycoin; make test" +``` + +### Running lint + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + sh -c "cd skycoin; make lint" +``` + +### Editing code + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + vim +``` + +## Additional tools and packages installed + +### Packages + +- dep +- tig +- swig + +### Vim's plugins + +- Ale +- tig-explorer + +## Automated builds + +Docker Cloud is configured to build images from `develop` branch on every push. +The same process is triggered for all feature branches matching the pattern +`/^([^_]+)_t([0-9]+)_.*docker.*/`. The tag generated for those images will be of the form +`feature-{\1}-{\2}`. + diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/Dockerfile b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/Dockerfile new file mode 100644 index 00000000..57f1e7b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/Dockerfile @@ -0,0 +1,79 @@ +# Creates an image for skycoin development with docker in docker +FROM SkycoinProject/skycoindev-cli:develop +ARG BDATE +ARG SCOMMIT + +# Image labels +LABEL "org.label-schema.name"="skycoindev-cli:dind" \ + "org.label-schema.description"="Skycoin cli develop image with docker in docker support" \ + "org.label-schema.vcs-url"="https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-docker" \ + "org.label-schema.vendor"="Skycoin project" \ + "org.label-schema.url"="skycoin.com" \ + "org.label-schema.schema-version"="1.0" \ + "org.label-schema.build-date"=$BDATE \ + "org.label-schema.vcs-ref"=$SCOMMIT \ + "org.label-schema.version"="1.0.0-rc.1" \ + "org.label-schema.usage"="https://github.com/SkycoinProject/skycoin/blob/"$SCOMMIT"/docker/images/dev-docker/README.md" \ + "org.label-schema.docker.cmd"="mkdir src; docker run --privileged --rm -v src:/go/src SkycoinProject/skycoindev-cli:dind go get github.com/SkycoinProject/skycoin; sudo chown -R `whoami` src" + +# Install docker + +RUN curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - +RUN apt-key fingerprint 0EBFCD88 +RUN set -ex; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + lsb-release \ + software-properties-common \ + apt-transport-https ;\ + apt clean + +RUN add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/debian \ + $(lsb_release -cs) \ + stable" + +RUN set -ex; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + btrfs-progs \ + e2fsprogs \ + iptables \ + xfsprogs \ + ca-certificates \ + gnupg2 \ + software-properties-common \ + pigz \ + docker-ce ;\ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* + +COPY modprobe.sh /usr/local/bin/modprobe + +RUN set -x \ + && groupadd dockremap \ + && useradd -g dockremap dockremap \ + && echo 'dockremap:165536:65536' >> /etc/subuid \ + && echo 'dockremap:165536:65536' >> /etc/subgid + +ENV DIND_COMMIT 3b5fac462d21ca164b3778647420016315289034 + +RUN set -ex; \ + wget -O /usr/local/bin/dind "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind"; \ + chmod +x /usr/local/bin/dind; + +COPY dockerd-entrypoint.sh /usr/local/bin/ + +RUN ["chmod", "+x", "/usr/local/bin/dockerd-entrypoint.sh","/usr/local/bin/modprobe"] + +VOLUME /var/lib/docker + +EXPOSE 2375 + +#WORKDIR $GOPATH/src/github.com/skycoin +#VOLUME $GOPATH/src/ + +#ENV LD_LIBRARY_PATH=/usr/local/lib + +ENTRYPOINT ["/usr/local/bin/dockerd-entrypoint.sh"] +CMD [] diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/README.md b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/README.md new file mode 100644 index 00000000..f95d69c9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/README.md @@ -0,0 +1,84 @@ +# Supported tags and respective `Dockerfile` links + +## Simple Tags + +- [`dind` (*docker/images/dev-docker/Dockerfile*)](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-docker/Dockerfile) + +# Skycoin development image including [docker in docker](https://hub.docker.com/_/docker/) + +This image has the necessary tools to build, test, edit, lint and version the Skycoin +source code. It comes with the Vim editor installed, along with some plugins +to ease go development and version control with git, besides it comes with docker installed. + +# How to use this image + +## Initialize your development environment. + +```sh +$ mkdir src +$ docker run --privileged --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli:dind \ + go get github.com/SkycoinProject/skycoin +$ sudo chown -R `whoami` src +``` + +This downloads the skycoin source to src/SkycoinProject/skycoin and changes the owner +to your user. This is necessary, because all processes inside the container run +as root and the files created by it are therefore owned by root. + +If you already have a Go development environment installed, you just need to +mount the src directory from your $GOPATH in the /go/src volume of the +container. + +## Running commands inside the container + +You can run commands by just passing them to the image. Everything is run +in a container and deleted when finished. + +### Running tests + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli:dind \ + sh -c "cd skycoin; make test" +``` + +### Running lint + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli:dind \ + sh -c "cd skycoin; make lint" +``` + +### Editing code + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli:dind \ + vim +``` + +## How to use docker in docker image + +### Start a daemon instance + +```sh +$ docker run --privileged --name some-name -d SkycoinProject/skycoindev-cli:dind +``` + +### Where to store data + +Create a data directory on the host system (outside the container) and mount this to a directory visible from inside the container. + +The downside is that you need to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. + +1. Create a data directory on a suitable volume on your host system, e.g. /my/own/var-lib-docker. +2. Start your docker container like this: + +```sh +$ docker run --privileged --name some-name -v /my/own/var-lib-docker:/var/lib/docker \ +-d SkycoinProject/skycoindev-cli:dind +``` + + diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/dockerd-entrypoint.sh b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/dockerd-entrypoint.sh new file mode 100644 index 00000000..05cc91b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/dockerd-entrypoint.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +# no arguments passed +# or first arg is `-f` or `--some-option` +if [ "$#" -eq 0 -o "${1#-}" != "$1" ]; then + # add our default arguments + set -- dockerd \ + --host=unix:///var/run/docker.sock \ + --host=tcp://0.0.0.0:2375 \ + "$@" +fi + +if [ "$1" = 'dockerd' ]; then + # if we're running Docker, let's pipe through dind + # (and we'll run dind explicitly with "sh" since its shebang is /bin/bash) + set -- sh "$(which dind)" "$@" +fi + +exec "$@" diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/modprobe.sh b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/modprobe.sh new file mode 100644 index 00000000..b357d893 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/modprobe.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -eu + +# "modprobe" without modprobe +# https://twitter.com/lucabruno/status/902934379835662336 + +# this isn't 100% fool-proof, but it'll have a much higher success rate than simply using the "real" modprobe + +# Docker often uses "modprobe -va foo bar baz" +# so we ignore modules that start with "-" +for module; do + if [ "${module#-}" = "$module" ]; then + ip link show "$module" || true + lsmod | grep "$module" || true + fi +done + +# remove /usr/local/... from PATH so we can exec the real modprobe as a last resort +export PATH='/usr/sbin:/usr/bin:/sbin:/bin' +exec modprobe "$@" diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/Dockerfile b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/Dockerfile new file mode 100755 index 00000000..b0ecd45f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/Dockerfile @@ -0,0 +1,106 @@ +ARG IMAGE_FROM=SkycoinProject/skycoindev-cli:develop +FROM $IMAGE_FROM + +ARG BDATE +ARG SCOMMIT +ARG VS_EXTENSIONS + +# Image labels (see ./hooks/build for ARGS) +LABEL "org.label-schema.name"="skycoindev-cli" \ + "org.label-schema.description"="Docker image with go, node, dev tools and Visual Studio Code for Skycoin developers" \ + "org.label-schema.vendor"="Skycoin project" \ + "org.label-schema.url"="skycoin.com" \ + "org.label-schema.version"="1.0.0-rc.1" \ + "org.label-schema.schema-version"="1.0" \ + "org.label-schema.build-date"=$BDATE \ + "org.label-schema.vcs-url"="https://github.com/SkycoinProject/skycoin.git" \ + "org.label-schema.vcs-ref"=$SCOMMIT \ + "org.label-schema.usage"="https://github.com/SkycoinProject/skycoin/blob/"$SCOMMIT"/docker/images/dev-vscode/README.md" \ + "org.label-schema.docker.cmd"="xhost +; cd src; docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -v $PWD:/go/src -w /go/src -e DISPLAY=$DISPLAY SkycoinProject/skycoindev-vscode:develop" + +# Tell debconf to run in non-interactive mode +ENV DEBIAN_FRONTEND noninteractive + +# Create a diferent user to run VS Code +ENV HOME /home/skydev +RUN useradd --create-home --home-dir $HOME skydev \ + && chown -R skydev:skydev $HOME + +# Install dependencies for vs code +# Create and assign permissions to `user` folders +# Install golang and npm necessaries dependencies to VS Code extensions +# Add the vscode debian repo +# Install VS Code extensions passed on build arg VS_EXTENSIONS +RUN apt-get update \ + && apt-get install -y \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg \ + apt-utils \ + libasound2 \ + libatk1.0-0 \ + libcairo2 \ + libcups2 \ + libexpat1 \ + libfontconfig1 \ + libfreetype6 \ + libgtk2.0-0 \ + libpango-1.0-0 \ + libx11-xcb1 \ + libxcomposite1 \ + libxcursor1 \ + libxdamage1 \ + libxext6 \ + libxfixes3 \ + libxi6 \ + libxrandr2 \ + libxrender1 \ + libxss1 \ + libxtst6 \ + openssh-client \ + xdg-utils \ + dconf-editor \ + dbus-x11 \ + libfile-mimeinfo-perl \ + xdg-user-dirs \ + xsel \ + --no-install-recommends \ + && mkdir -p $HOME/.cache/dconf \ + && mkdir -p $HOME/.config/dconf \ + && chown skydev:skydev -R $HOME/.config \ + && chown skydev:skydev -R $HOME/.cache \ + && go get -v github.com/ramya-rao-a/go-outline \ + && go get -v github.com/uudashr/gopkgs/cmd/gopkgs \ + && go get -v github.com/acroca/go-symbols \ + && go get -v github.com/stamblerre/gocode \ + && go get -v github.com/ianthehat/godef \ + && go get -v github.com/sqs/goreturns \ + && ln -s /go/bin/gocode /go/bin/gocode-gomod \ + && ln -s /go/bin/godef /go/bin/godef-gomod \ + && npm install -g tslint typescript \ + && curl -sSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | apt-key add - \ + && echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list \ + && apt-get update \ + && apt-get -y install code \ + && for ext in $VS_EXTENSIONS; do code --user-data-dir $HOME --install-extension $ext; done \ + && apt clean \ + && rm -rf /var/lib/apt/lists/* + +# Change to `skydev` and generate default user folders to avoid config problems in future +USER skydev +RUN xdg-user-dirs-update --force + +# Back to root user +USER root + +# Copy start.sh script to use it as our Docker ENTRYPOINT +COPY ./start.sh /usr/local/bin/start.sh +# backwards compat +RUN ln -s usr/local/bin/start.sh / + +WORKDIR $GOPATH/src/github.com/skycoin/ + +ENTRYPOINT ["start.sh"] + +#CMD [ "su", "skydev", "-p", "-c", "/usr/share/code/code" ] diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/README.md b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/README.md new file mode 100755 index 00000000..34837b00 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/README.md @@ -0,0 +1,214 @@ +# Supported tags and respective `Dockerfile` links + +## Simple Tags + +- [`develop` (*docker/images/dev-vscode/Dockerfile*)](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-vscode/Dockerfile) +- [`vscode` (*docker/images/dev-vscode/Dockerfile*)](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-vscode/Dockerfile) + +# Skycoin Docker image for development with [VS Code](https://code.visualstudio.com/) IDE + +This image has the necessary tools to build, test, edit, lint and version the Skycoin +source code. It comes with [Visual Studio Code](https://code.visualstudio.com/) installed and some extensions +ot speed up workspace setup for Skycoin developers. + +# How use this image + +## Initialize your development environment. + +0. Make sure you're on a system running [X](https://en.wikipedia.org/wiki/X_Window_System). + - *GNU/Linux* users should be ready to go + - *Mac OS* users can follow the following steps + * `brew install xquartz` + * **Important** Log out and log back into OS/X +1. Disable X access control (don't do this on a public-facing machine): + - *GNU/Linux* : `$ xhost +` or `$ xhost +local:docker` + - *Mac OS* : XQuartz users should follow these steps + * `open -a Xquartz` + * With `xterm` active, open up `XQuartz` in menu bar => `Preferences` => `Security`. There make sure the `Allow connections from network clients` is checked `on`. +2. `$ cd` to a path where you want to write some code (e.g. a working copy of [`SkycoinProject/skycoin`](https://github.com/SkycoinProject/skycoin) ) +3. Since Visual Studio Code inside docker container runs as user `skydev`, it's necessary apply permissions to files. + ```sh + $ sudo chown -R 777 . + ``` +4. Run docker image, either `SkycoinProject/skycoindev-vscode:develop` or `SkycoinProject/skycoindev-vscode:dind` + - *GNU/Linux* + ```sh + $ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $(pwd):$GOPATH/src/github.com/SkycoinProject/skycoin \ + -w $GOPATH/src/github.com/SkycoinProject/skycoin \ + -e DISPLAY=$DISPLAY \ + SkycoinProject/skycoindev-vscode:develop + ``` + - *Mac OS* users running XQuartz should launch `socat` for Docker to be able to connect to the X server. Assuming `en0` is your primary network interface + ```sh + $ brew install socat + $ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\" + $ export IP=$(ifconfig en0 | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p') + $ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $(pwd):$GOPATH/src/github.com/SkycoinProject/skycoin \ + -w $GOPATH/src/github.com/SkycoinProject/skycoin \ + -e DISPLAY=$IP:0 \ + SkycoinProject/skycoindev-vscode:develop + ``` +5. You should see vscode pop up. +6. Have fun. Write some code. Close VS Code IDE window when you're done, and press `Ctrl+C` to shut down the container. Your files will be in the host machine at the same path chosen in step `2` above. +7. __Reenable X access control:__ `$ xhost -` + +For the sake of brevity, the examples that follow only include the invocation of `docker` command for GNU/Linux. Beware of the fact that there will be differences in running the Docker images on other operating systems. The hints provided above will still be valid, though. + +## Add more VS Code extensions + +If you want add more extensions, you must define `VS_EXTENSIONS` environment variable to the command-line with extensions you prefer. + +```sh + $ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix + -v $PWD:/go/src/github.com/SkycoinProject/skycoin \ + -w $GOPATH/src/github.com/SkycoinProject/skycoin \ + -e DISPLAY=$DISPLAY \ + -e VS_EXTENSIONS="ms-python.python rebornix.Ruby" \ + SkycoinProject/skycoindev-vscode:dind +``` + +This downloads the skycoin source to src/SkycoinProject/skycoin and changes the owner +to your user. This is necessary, because all processes inside the container run +as root and the files created by it are therefore owned by root. + +If you already have a Go development environment installed, you just need to +mount the src directory from your `$GOPATH` at path `/go/src` inside the +container. + +```sh + $ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix + -v $GOPATH/src:$GOPATH/src \ + -w $GOPATH/src/github.com/SkycoinProject/skycoin \ + -e DISPLAY=$DISPLAY \ + -e VS_EXTENSIONS="ms-python.python rebornix.Ruby" \ + SkycoinProject/skycoindev-vscode:dind +``` + +# Build your own images + +The following arguments influence the Docker build process. + +- `SOURCE_COMMIT`: the SHA1 hash of the commit being tested. +- `IMAGE_NAME`: the name and tag of the Docker repository being built. +- `DOCKERFILE_PATH`: the dockerfile currently being built. + +For instance, the following commands can be executed in order to build this VS Code dev image using `skycoindev-cli:develop` as base image. + +```sh +$ git clone https://github.com/SkycoinProject/skycoin +$ cd skycoin +$ SOURCE_COMMIT=$(git rev-parse HEAD) +$ IMAGE_NAME=SkycoinProject/skycoindev-vscode:develop +$ DOCKERFILE_PATH=docker/images/dev-vscode/Dockerfile +$ docker build --build-arg BDATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \ + --build-arg SCOMMIT=$SOURCE_COMMIT \ + --build-arg VS_EXTENSIONS="ms-vscode.Go windmilleng.vscode-go-autotest defaltd.go-coverage-viewer" \ + -f $DOCKERFILE_PATH \ + -t "$IMAGE_NAME" . +``` + +Or, if a decision has been made for including a Docker daemon then specify `skycoindev-cli:dind` instead and run: + +```sh +$ git clone https://github.com/SkycoinProject/skycoin +$ cd skycoin +$ SOURCE_COMMIT=$(git rev-parse HEAD) +$ IMAGE_NAME=SkycoinProject/skycoindev-vscode:dind +$ DOCKERFILE_PATH=docker/images/dev-vscode/Dockerfile +$ docker build --build-arg IMAGE_FROM="SkycoinProject/skycoindev-cli:dind" \ + --build-arg BDATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \ + --build-arg SCOMMIT=$SOURCE_COMMIT \ + --build-arg VS_EXTENSIONS="ms-python.python rebornix.Ruby" + -f $DOCKERFILE_PATH \ + -t "$IMAGE_NAME" . +``` + +As a result of following theses steps two new images will be obtained: + +`SkycoinProject/skycoindev-vscode:develop` based on [SkycoinProject/skycoindev-cli:develop](skycoin/docker/images/dev-cli) +`SkycoinProject/skycoindev-vscode:dind` based on [SkycoinProject/skycoindev-cli:dind](skycoin/docker/images/dev-docker) + +## Running commands inside the container + +You can run commands by just passing the them to the image. Everything is run +in a container and deleted when finished. + +### Running tests + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + sh -c "cd skycoin; make test" +``` + +### Running lint + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + sh -c "cd skycoin; make lint" +``` + +### Editing code with terminal + +Comman line tools are still available . For instance it's possible to run `vim` + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + vim +``` + +## How to use docker in docker image + +### Start a daemon instance + +```sh +$ docker run --privileged --name some-name -d SkycoinProject/skycoindev-vscode:dind +``` + +### Where to store data + +Create a data directory on the host system (outside the container) and mount this to a directory visible from inside the container. + +The downside is that you need to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. + +1. Create a data directory on a suitable volume on your host system, e.g. /my/own/var-lib-docker. +2. Start your docker container like this: + +```sh +$ docker run --privileged --name some-name -v /my/own/var-lib-docker:/var/lib/docker \ +-d SkycoinProject/skycoindev-vscode:dind +``` + +## Additional tools and packages installed + +### Packages + +- dep +- tig +- swig + +### Vim plugins + +- Ale +- tig-explorer + +### VS Code extensions + +- [Go](https://marketplace.visualstudio.com/items?itemName=ms-vscode.Go) +- [Go Autotest](https://marketplace.visualstudio.com/items?itemName=windmilleng.vscode-go-autotest) +- [Go Coverage Viewer](https://marketplace.visualstudio.com/items?itemName=defaltd.go-coverage-viewer) +- [TSLint](https://marketplace.visualstudio.com/items?itemName=eg2.tslint) +- [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) +- [Vim](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim) + +## Automated builds + +Docker Cloud is configured to build images from `develop` branch on every push. +The same process is triggered for all feature branches matching the pattern +`/^([^_]+)_t([0-9]+)_.*vscode/`. The tag generated for those images will be of the form +`feature-{\1}-{\2}-vscode`. + diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/hooks/push b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/hooks/push new file mode 100755 index 00000000..f9e243fc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/hooks/push @@ -0,0 +1,7 @@ +#!/bin/bash + +docker push $IMAGE_NAME + +if [ "$CACHE_TAG" -eq "develop" ]; then + docker push $DOCKER_REPO:dind +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/start.sh b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/start.sh new file mode 100755 index 00000000..45bba448 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/start.sh @@ -0,0 +1,38 @@ +#!/bin/bash +set -e +set -o pipefail + +# Install vscode extensions declared on VS_EXTENSIONS +if [[ -n "$VS_EXTENSIONS" ]]; then + for ext in $VS_EXTENSIONS; do code --user-data-dir $HOME --install-extension $ext; done +fi + +# Check if skycoindev-vscode:dind image has been started +if [[ -n "$DIND_COMMIT" ]]; then + # no arguments passed + # or first arg is `-f` or `--some-option` + if [ "$#" -eq 0 -o "${1#-}" != "$1" ]; then + # add our default arguments + set -- dockerd \ + --host=unix:///var/run/docker.sock \ + --host=tcp://0.0.0.0:2375 \ + "$@" + fi + + if [ "$1" = 'dockerd' ]; then + # if we're running Docker, let's pipe through dind + # (and we'll run dind explicitly with "sh" since its shebang is /bin/bash) + set -- sh "$(which dind)" "$@" + fi +fi + +# Apply correct permissions to avoid problems when VS Code is open +chmod -R 777 /home/skydev/ + +# If user pass a command when run docker image VS Code it will be executed, +# else, we run VS Code +if [[ -n "$@" ]]; then + exec "$@" +else + su skydev -p -c /usr/share/code/code +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/Dockerfile b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/Dockerfile new file mode 100644 index 00000000..8dff4118 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/Dockerfile @@ -0,0 +1,86 @@ +# skycoin build +# reference https://github.com/SkycoinProject/skycoin +ARG IMAGE_FROM=busybox +FROM golang:1.11-stretch AS build +ARG ARCH=amd64 +ARG GOARM +ARG SKYCOIN_VERSION +ARG SCOMMIT +ARG SBRANCH +ARG STAG + +ADD cmd $GOPATH/src/github.com/SkycoinProject/skycoin/cmd +ADD src $GOPATH/src/github.com/SkycoinProject/skycoin/src +ADD vendor $GOPATH/src/github.com/SkycoinProject/skycoin/vendor +ADD template $GOPATH/src/github.com/SkycoinProject/skycoin/template +ADD fiber.toml $GOPATH/src/github.com/SkycoinProject/skycoin/fiber.toml + +# This code checks if SKYCOIN_VERSION is set and checkouts to that version if +# so. The git stash line prevents the build to fail if there are any uncommited +# changes in the working copy. It won't affect the host working copy. +RUN sh -c \ + 'if test ${SKYCOIN_VERSION};then \ + echo "Revision is set to: "${SKYCOIN_VERSION}; \ + cd $GOPATH/src/github.com/SkycoinProject/skycoin; \ + git stash; \ + git checkout ${SKYCOIN_VERSION}; \ + fi' + +ENV GOARCH="$ARCH" \ + GOARM="$GOARM" \ + CGO_ENABLED="0" \ + GOOS="linux" \ + GOLDFLAGS="-X main.Commit=${SCOMMIT} -X main.Branch=${SBRANCH}" + +RUN cd $GOPATH/src/github.com/SkycoinProject/skycoin && \ + echo "Building with GOLDFLAGS=$GOLDFLAGS GOARCH=$GOARCH GOARM=$GOARM CGO_ENABLED=$CGO_ENABLED GOOS=$GOOS " && \ + go install -ldflags "${GOLDFLAGS}" ./cmd/... && \ + sh -c "if test -d $GOPATH/bin/linux_arm ; then mv $GOPATH/bin/linux_arm/* $GOPATH/bin/; fi; \ + if test -d $GOPATH/bin/linux_arm64 ; then mv $GOPATH/bin/linux_arm64/* $GOPATH/bin/; fi" + +RUN apt-get update && \ + apt-get install -y ca-certificates + + +RUN /bin/bash -c 'mkdir -p /tmp/files/{usr/bin,/usr/local/skycoin/src/gui/static,/usr/local/bin/,/etc/ssl}' +RUN cp -r /go/bin/* /tmp/files/usr/bin/ +RUN cp -r /go/src/github.com/SkycoinProject/skycoin/src/gui/static /tmp/files/usr/local/skycoin/src/gui/ +RUN cp -r /etc/ssl/certs /tmp/files/etc/ssl/certs +COPY docker_launcher.sh /tmp/files/usr/local/bin/docker_launcher.sh + +# skycoin image +FROM $IMAGE_FROM +ARG BDATE +ARG SCOMMIT +ARG SBRANCH +ARG STAG + +# Image labels +LABEL "org.label-schema.name"="Skycoin" \ + "org.label-schema.description"="Skycoin core docker image" \ + "org.label-schema.vcs-url"="https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/mainnet" \ + "org.label-schema.vendor"="Skycoin project" \ + "org.label-schema.url"="skycoin.com" \ + "org.label-schema.schema-version"="1.0" \ + "org.label-schema.build-date"=$BDATE \ + "org.label-schema.vcs-ref"=$SCOMMIT \ + "org.label-schema.version"=$STAG \ + "org.label-schema.usage"="https://github.com/SkycoinProject/skycoin/blob/"$SCOMMIT"/docker/images/mainnet/README.md" \ + "org.label-schema.docker.cmd"="docker volume create skycoin-data; docker volume create skycoin-wallet; docker run -d -v skycoin-data:/data/.skycoin -v skycoin-wallet:/wallet -p 6000:6000 -p 6420:6420 --name skycoin-node-stable SkycoinProject/skycoin" + +ENV COIN="skycoin" +ENV RPC_ADDR="http://0.0.0.0:6420" \ + DATA_DIR="/data/.$COIN" \ + WALLET_DIR="/wallet" \ + WALLET_NAME="$COIN_cli.wlt" + +# copy all the binaries +COPY --from=build /tmp/files / + +# volumes +VOLUME $WALLET_DIR +VOLUME $DATA_DIR + +EXPOSE 6000 6420 + +ENTRYPOINT ["docker_launcher.sh", "--web-interface-addr=0.0.0.0", "--gui-dir=/usr/local/skycoin/src/gui/static"] diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/README.md b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/README.md new file mode 100644 index 00000000..b7edcf6d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/README.md @@ -0,0 +1,128 @@ +# Supported tags + +## Simple Tags + +- latest +- latest-arm32v5 +- latest-arm32v6 +- latest-arm32v7 +- latest-arm64v8 +- develop +- develop-arm32v5 +- develop-arm32v6 +- develop-arm32v7 +- develop-arm64v8 +- release-v0.23.0 +- release-v0.23.0-arm32v5 +- release-v0.23.0-arm32v6 +- release-v0.23.0-arm32v7 +- release-v0.23.0-arm64v8 +- release-v0.22.0 + +## Building your own images + +This Dockerfile build your working copy by default, but if you pass the +SKYCOIN_VERSION build argument to the `docker build` command, it will checkout +to the branch, a tag or a commit you specify on that variable. + +Example + +```sh +$ git clone https://github.com/SkycoinProject/skycoin +$ cd skycoin +$ SKYCOIN_VERSION=v0.24.0 +$ docker build -f docker/images/mainnet/Dockerfile \ + --build-arg=SKYCOIN_VERSION=$SKYCOIN_VERSION \ + -t skycoin:$SKYCOIN_VERSION . +``` + +or just + +```sh +$ docker build -f docker/images/mainnet/Dockerfile \ + --build-arg=SKYCOIN_VERSION=v0.24.0 \ + -t skycoin:v0.24.0 +``` + +## ARM Architecture + +Build arguments are provided to make it easy if you want to build for the ARM +architecture. + +Example for ARMv5. + +```sh +$ git clone https://github.com/SkycoinProject/skycoin +$ cd skycoin +$ docker build -f docker/images/mainnet/Dockerfile \ + --build-arg=ARCH=arm \ + --build-arg=GOARM=5 \ + --build-arg=IMAGE_FROM="arm32v5/alpine" \ + -t skycoin:$SKYCOIN_VERSION-arm32v5 . +``` + +## How to use this images + +### Run a Skycoin node + +This command pulls latest stable image from Docker Hub, and launches a node inside a Docker container that runs as a service daemon in the background. It is possible to use the tags listed above to run another version of the node + +```sh +$ docker volume create skycoin-data +$ docker volume create skycoin-wallet +$ docker run -d -v skycoin-data:/data/.skycoin \ + -v skycoin-wallet:/wallet \ + -p 6000:6000 -p 6420:6420 \ + --name skycoin-node-stable SkycoinProject/skycoin +``` + +When invoking the container this way the options of the skycoin command are set to their respective default values , except the following + +| Parameter | Value | +| ------------- | ------------- | +| web-interface-addr | 0.0.0.0 | +| gui-dir | /usr/local/skycoin/src/gui/static | + +In order to stop the container , just run + +```sh +$ docker stop skycoin-node-stable +``` + +Restart it once again by executing + +```sh +$ docker start skycoin-node-stable +``` + +### Customizing node server with parameters + +The container accepts parameters in order to customize the execution of the skycoin node. For instance, in order to run the bleeding edge development image and listen for REST API requests at a non-standard port (e.g. `6421`) it is possible to execute the following command. + +```sh + $ docker run --rm -d -v skycoin-data:/data/.skycoin \ + -v skycoin-wallet:/wallet \ + -p 6000:6000 -p 6421:6421 \ + --name skycoin-node-develop SkycoinProject/skycoin:develop -web-interface-port 6421 +``` + +Notice that the value of node parameter (e.g. `-web-interface-port`) affects the execution context inside the container. Therefore, in this particular case, the port mapping should be updated accordingly. + +To get a full list of skycoin's parameters, just run + +```sh + $ docker run --rm SkycoinProject/skycoin:develop -help +``` + +To run multiple nodes concurrently in the same host, it is highly recommended to create separate volumes for each node. For example, in order to run a block publisher node along with the one launched above, it is necessary to execute + +```sh +$ docker volume create skycoin-block-publisher-data +$ docker volume create skycoin-block-publisher-wallet +$ docker run -d -v skycoin-block-publisher-data:/data/.skycoin \ + -v skycoin-block-publisher-wallet:/wallet \ + -p 6001:6000 -p 6421:6420 \ + --name skycoin-block-publisher-stable SkycoinProject/skycoin -block-publisher +``` + +Notice that the host's port must be changed since collisions of two services listening at the same port are not allowed by the low-level operating system socket libraries. diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/hooks/push b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/hooks/push new file mode 100644 index 00000000..5fab9459 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/hooks/push @@ -0,0 +1,6 @@ +#!/bin/bash +docker push $IMAGE_NAME +docker push $IMAGE_NAME-arm32v5 +docker push $IMAGE_NAME-arm32v6 +docker push $IMAGE_NAME-arm32v7 +docker push $IMAGE_NAME-arm64v8 diff --git a/vendor/github.com/SkycoinProject/skycoin/docker_launcher.sh b/vendor/github.com/SkycoinProject/skycoin/docker_launcher.sh new file mode 100755 index 00000000..c87c321d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker_launcher.sh @@ -0,0 +1,16 @@ +#!/bin/sh +COMMAND="skycoin --data-dir $DATA_DIR --wallet-dir $WALLET_DIR $@" + +adduser -D -u 10000 skycoin + +if [[ \! -d $DATA_DIR ]]; then + mkdir -p $DATA_DIR +fi +if [[ \! -d $WALLET_DIR ]]; then + mkdir -p $WALLET_DIR +fi + +chown -R skycoin:skycoin $( realpath $DATA_DIR ) +chown -R skycoin:skycoin $( realpath $WALLET_DIR ) + +su skycoin -c "$COMMAND" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/README.md b/vendor/github.com/SkycoinProject/skycoin/electron/README.md new file mode 100644 index 00000000..8fb54b83 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/README.md @@ -0,0 +1,132 @@ +# Build system + +The GUI client is an Electron (http://electron.atom.io/) app. + +It cross compiles for osx, linux and windows 64 bit systems. + +## Requirements + +gox (go cross compiler), node and npm. + +### gox + +To install gox: + +```sh +go get github.com/gz-c/gox +``` + +### NPM + +Node and npm installation is system dependent. + +#### Linux + +```sh +sudo apt-get install npm +sudo apt-get install nodejs-legacy +sudo npm cache clean -f + +sudo npm install -g n +sudo n stable + +node -v +npm -v +``` + +## Make sure that the wallet dist is up to date + +Recompile the wallet frontend. See [Wallet GUI Development README](../src/gui/static/README.md) for instructions. + +## Use electron-builder to pack and create app installer + +### Install electron-builder + +```sh +sudo npm install --global electron-builder +``` + +### Install electron-download + +```sh +sudo npm install --global electron-download +``` + +### For macOS + +Use brew to install required packages. + +To build app for Windows on macOS: + +```sh +brew install wine --without-x11 +brew install mono +``` + +To build app for Linux on macOS: + +```sh +brew install gnu-tar graphicsmagick xz +``` + +### Code signing + +Set the `CSC_IDENTITY_AUTO_DISCOVERY` environment variable to false if you don't want to do code signing, +otherwise, you can create a certificate in login.keychain for testing purpose. + +Create new certificate: + +> Keychain Access -> Certificate Assistant -> Create a Certificate... + +Set certificate name and select `Code Signing` as `Certificate Type`. + +Once you generated the certificate, you can use it by setting your environment variable: + +```sh +export CSC_NAME="Certificate Name" +``` + +Now, when you run electron-builder, it will choose the name and sign the app with the certificate. + +## For Linux + +To build app in distributable format for Linux: + +```sh +sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils +``` + +To build app for Windows on Linux: + +* Install Wine (1.8+ is required): + +```sh +sudo apt-get install software-properties-common +sudo add-apt-repository ppa:ubuntu-wine/ppa -y +sudo apt-get update +sudo apt-get install --no-install-recommends -y wine1.8 +``` + +* Install Mono (4.2+ is required): + +```sh +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF +echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list +sudo apt-get update +sudo apt-get install --no-install-recommends -y mono-devel ca-certificates-mono +``` + +To build app in 32 bit from a machine with 64 bit: + +```sh +sudo apt-get install --no-install-recommends -y gcc-multilib g++-multilib +``` + + +## Building + +```sh +./build.sh +``` + +Final results are placed in the `release/` folder. diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/Info.plist b/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/Info.plist new file mode 100644 index 00000000..434eb1e8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/Info.plist @@ -0,0 +1,37 @@ + + + + + CFBundleExecutable + Skycoin + CFBundleIdentifier + org.skycoin.Skycoin + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Skycoin + CFBundlePackageType + APPL + LSMinimumSystemVersion + 10.7.0 + NSPrincipalClass + NSApplication + CFBundleSignature + ???? + CFBundleIconFile + appIcon.icns + LSUIElement + + CFBundleURLTypes + + + CFBundleURLName + Skycoin + CFBundleURLSchemes + + skycoin + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/appIcon.icns b/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/appIcon.icns new file mode 100644 index 00000000..69e608fe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/appIcon.icns differ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-cli-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-cli-release.sh new file mode 100755 index 00000000..7747b163 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-cli-release.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -e -o pipefail + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SKIP_COMPILATION=${SKIP_COMPILATION:-0} + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +if [ $SKIP_COMPILATION -ne 1 ]; then + CMD="skycoin-cli" CONFIG_MODE= ./gox.sh "$GOX_OSARCH" "$GOX_CLI_OUTPUT_DIR" "$GOX_CLI_OUTPUT_NAME" +fi + +echo +echo "===========================" +echo "Packaging cli release" +./package-cli-release.sh "$GOX_OSARCH" + +echo "------------------------------" +echo "Compressing cli release" +./compress-cli-release.sh "$GOX_OSARCH" + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-conf.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-conf.sh new file mode 100755 index 00000000..e92c2ff0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-conf.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# These values are also in package.json and must be equal + +# Get skycoin build version from package.json +APP_VERSION=`grep version package.json | sed 's/[,\", ]//g'| awk '{split($0,a,":");print a[2]}'` + + +# package name +PKG_NAME=`grep productName package.json | sed 's/[,\", ]//g' | awk '{split($0,s,":");print tolower(s[2])}'` + +# product name +PDT_NAME=`grep productName package.json | sed 's/[,\", ]//g' | awk '{split($0,s,":");print s[2]}'` + +ELN_VERSION="v1.4.13" +ELN_OUTPUT_BASE=".electron_output" +ELN_OUTPUT_DIR="${ELN_OUTPUT_BASE}/${ELN_VERSION}" + + +if [ -n "$1" ]; then + GOX_OSARCH="$@" +else + GOX_OSARCH="linux/amd64 linux/arm windows/amd64 windows/386 darwin/amd64" +fi + +GOX_OUTPUT_DIR=".gox_output" +GOX_GUI_OUTPUT_DIR="${GOX_OUTPUT_DIR}/gui" +GOX_DMN_OUTPUT_DIR="${GOX_OUTPUT_DIR}/daemon" +GOX_CLI_OUTPUT_DIR="${GOX_OUTPUT_DIR}/cli" +GOX_CLI_OUTPUT_NAME="${PKG_NAME}-cli" + +STL_OUTPUT_DIR=".standalone_output" +DMN_OUTPUT_DIR=".daemon_output" +CLI_OUTPUT_DIR=".cli_output" + +FINAL_OUTPUT_DIR="release" + +GUI_DIST_DIR="../src/gui/static/dist" # Do not append "/" to this path + +# Variable suffix guide: +# _APP -- name of the OS X app +# _ELN_PLT -- directory name created by electron for its build of this platform +# _ELN -- our name for electron gui releases +# _ELN_ZIP -- our compressed name for electron gui releases +# _STL -- our name for standalone gui releases +# _STL_ZIP -- our compressed name for standalone gui releases +# _DMN -- our name for daemon releases +# _DMN_ZIP -- our compressed name for daemon releases +# _CLI -- our name for cli releases +# _CLI_ZIP -- our compressed name for cli releases + +if [[ $GOX_OSARCH == *"darwin/amd64"* ]]; then + OSX64_APP="${PDT_NAME}.app" + OSX64_ELN_PLT="darwin-x64" + OSX64_ELN="${PKG_NAME}-${APP_VERSION}-gui-electron-osx-darwin-x64" + OSX64_ELN_ZIP="${OSX64_ELN}.zip" + OSX64_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-osx-darwin-x64" + OSX64_STL_ZIP="${OSX64_STL}.zip" + OSX64_DMN="${PKG_NAME}-${APP_VERSION}-daemon-osx-darwin-x64" + OSX64_DMN_ZIP="${OSX64_DMN}.zip" + OSX64_CLI="${PKG_NAME}-${APP_VERSION}-cli-osx-darwin-x64" + OSX64_CLI_ZIP="${OSX64_CLI}.zip" + OSX64_OUT="mac_x64" +fi + +if [[ $GOX_OSARCH == *"linux/amd64"* ]]; then + LNX64_ELN="${PKG_NAME}-${APP_VERSION}-gui-electron-linux-x64" + LNX64_ELN_PLT="linux-x64" + LNX64_ELN_ZIP="${LNX64_ELN}.tar.gz" + LNX64_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-linux-x64" + LNX64_STL_ZIP="${LNX64_STL}.tar.gz" + LNX64_DMN="${PKG_NAME}-${APP_VERSION}-daemon-linux-x64" + LNX64_DMN_ZIP="${LNX64_DMN}.tar.gz" + LNX64_CLI="${PKG_NAME}-${APP_VERSION}-cli-linux-x64" + LNX64_CLI_ZIP="${LNX64_CLI}.tar.gz" + LNX64_OUT="linux_x64" +fi + +if [[ $GOX_OSARCH == *"windows/amd64"* ]]; then + WIN64_ELN="${PKG_NAME}-${APP_VERSION}-gui-electron-win-x64" + WIN64_ELN_PLT="win32-x64" + WIN64_ELN_ZIP="${WIN64_ELN}.zip" + WIN64_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-win-x64" + WIN64_STL_ZIP="${WIN64_STL}.zip" + WIN64_DMN="${PKG_NAME}-${APP_VERSION}-daemon-win-x64" + WIN64_DMN_ZIP="${WIN64_DMN}.zip" + WIN64_CLI="${PKG_NAME}-${APP_VERSION}-cli-win-x64" + WIN64_CLI_ZIP="${WIN64_CLI}.zip" + WIN64_OUT="win_x64" +fi + +if [[ $GOX_OSARCH == *"windows/386"* ]]; then + WIN32_ELN="${PKG_NAME}-${APP_VERSION}-gui-electron-win-x86" + WIN32_ELN_PLT="win32-ia32" + WIN32_ELN_ZIP="${WIN32_ELN}.zip" + WIN32_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-win-x86" + WIN32_STL_ZIP="${WIN32_STL}.zip" + WIN32_DMN="${PKG_NAME}-${APP_VERSION}-daemon-win-x86" + WIN32_DMN_ZIP="${WIN32_DMN}.zip" + WIN32_CLI="${PKG_NAME}-${APP_VERSION}-cli-win-x86" + WIN32_CLI_ZIP="${WIN32_CLI}.zip" + WIN32_OUT="win_ia32" +fi + +if [[ $GOX_OSARCH == *"linux/arm"* ]]; then + LNX_ARM_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-linux-arm" + LNX_ARM_STL_ZIP="${LNX_ARM_STL}.tar.gz" + LNX_ARM_DMN="${PKG_NAME}-${APP_VERSION}-daemon-linux-arm" + LNX_ARM_DMN_ZIP="${LNX_ARM_DMN}.tar.gz" + LNX_ARM_CLI="${PKG_NAME}-${APP_VERSION}-cli-linux-arm" + LNX_ARM_CLI_ZIP="${LNX_ARM_CLI}.tar.gz" + LNX_ARM_OUT="linux_arm" +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-daemon-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-daemon-release.sh new file mode 100755 index 00000000..218cbae9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-daemon-release.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -e -o pipefail + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SKIP_COMPILATION=${SKIP_COMPILATION:-0} + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +if [ $SKIP_COMPILATION -ne 1 ]; then + CONFIG_MODE= ./gox.sh "$GOX_OSARCH" "$GOX_DMN_OUTPUT_DIR" +fi + +echo +echo "===========================" +echo "Packaging daemon release" +./package-daemon-release.sh "$GOX_OSARCH" + +echo "------------------------------" +echo "Compressing daemon release" +./compress-daemon-release.sh "$GOX_OSARCH" + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-electron-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-electron-release.sh new file mode 100755 index 00000000..c5d4e2b0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-electron-release.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds an entire electron-based GUI for release + +# Implemented architectures: +# darwin/amd64 +# windows/amd64 +# windows/386 +# linux/amd64 +# +# By default builds all architectures. +# A single arch can be built by specifying it using gox's arch names + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SKIP_COMPILATION=${SKIP_COMPILATION:-0} + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +if [ $SKIP_COMPILATION -ne 1 ]; then + CONFIG_MODE=STANDALONE_CLIENT ./gox.sh "$GOX_OSARCH" "$GOX_GUI_OUTPUT_DIR" +fi + +if [ -e "$ELN_OUTPUT_DIR" ]; then + rm -r "$ELN_OUTPUT_DIR" +fi + +if [ ! -z "$WIN64_ELN" ] && [ ! -z "$WIN32_ELN" ]; then + npm run dist-win +elif [ ! -z "$WIN64_ELN" ]; then + npm run dist-win64 +elif [ ! -z "$WIN32_ELN" ]; then + npm run dist-win32 +fi + +if [ ! -z "$LNX64_ELN" ]; then + npm run dist-linux +fi + +if [ ! -z "$OSX64_ELN" ]; then + if [[ "$OSTYPE" == "darwin"* ]]; then + echo "run dist-mac" + npm run dist-mac + else + echo "Can not run build script in $OSTYPE" + fi +fi + +pushd "$FINAL_OUTPUT_DIR" >/dev/null +if [ -e "mac" ]; then + pushd "mac" >/dev/null + if [ -e "${PDT_NAME}-${APP_VERSION}.dmg" ]; then + mv "${PDT_NAME}-${APP_VERSION}.dmg" "../${PKG_NAME}-${APP_VERSION}-gui-electron-osx-x64.dmg" + elif [ -e "${PDT_NAME}.app" ]; then + rm -rf "${PDT_NAME}.app" + fi + popd >/dev/null + rm -rf "mac" +fi + +IMG="${PKG_NAME}-${APP_VERSION}-x86_64.AppImage" +DEST_IMG="${PKG_NAME}-${APP_VERSION}-gui-electron-linux-x64.AppImage" +if [ -e $IMG ]; then + mv "$IMG" "$DEST_IMG" + chmod +x "$DEST_IMG" +fi + +EXE="${PDT_NAME} Setup ${APP_VERSION}.exe" +if [ -e "$EXE" ]; then + if [ ! -z $WIN32_ELN ] && [ ! -z $WIN64_ELN ]; then + mv "$EXE" "${PKG_NAME}-${APP_VERSION}-gui-electron-win-setup.exe" + elif [ ! -z $WIN32_ELN ]; then + mv "$EXE" "${WIN32_ELN}.exe" + elif [ ! -z $WIN64_ELN ]; then + mv "$EXE" "${WIN64_ELN}.exe" + fi +fi + +# rename dmg file name +DMG="${PKG_NAME}-${APP_VERSION}.dmg" +if [ -e "$DMG" ]; then + mv "$DMG" "${PKG_NAME}-${APP_VERSION}-gui-electron-osx.dmg" +fi + +# delete app zip file +MZIP="${PKG_NAME}-${APP_VERSION}-mac.zip" +if [ -e "$MZIP" ]; then + rm "$MZIP" +fi + +# delete github and latest-mac.yml +if [ -d "github" ]; then rm -rf github ;fi +if [ -e "latest-mac.yml" ]; then rm latest-mac.yml ;fi + +# clean unpacked folders +rm -rf *-unpacked + +# delete blockmap and electron-builder.yaml +rm -f *.blockmap +rm -f *.yaml + +popd >/dev/null + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-standalone-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-standalone-release.sh new file mode 100755 index 00000000..01a671ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-standalone-release.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -e -o pipefail + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SKIP_COMPILATION=${SKIP_COMPILATION:-0} + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +if [ $SKIP_COMPILATION -ne 1 ]; then + CONFIG_MODE=STANDALONE_CLIENT ./gox.sh "$GOX_OSARCH" "$GOX_GUI_OUTPUT_DIR" +fi + +echo +echo "===========================" +echo "Packaging standalone release" +./package-standalone-release.sh "$GOX_OSARCH" + +echo "------------------------------" +echo "Compressing standalone release" +./compress-standalone-release.sh "$GOX_OSARCH" + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build.sh new file mode 100755 index 00000000..dd13502b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds both the electron and standalone releases + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +echo "Compiling with gox" +pwd +# Build the client mode with gox here so that the standalone and electron releases don't need to compile twice +CONFIG_MODE=STANDALONE_CLIENT ./gox.sh "$GOX_OSARCH" "$GOX_GUI_OUTPUT_DIR" + +echo "Installing node modules" +./install-node-modules.sh + +echo +echo "===========================" +echo "Building standalone release" + +SKIP_COMPILATION=1 ./build-standalone-release.sh "$GOX_OSARCH" + +echo +echo "===========================" +echo "Building electron release" + +SKIP_COMPILATION=1 ./build-electron-release.sh "$GOX_OSARCH" + +echo +echo "===========================" +echo "Building daemon release" + +./build-daemon-release.sh "$GOX_OSARCH" + +echo +echo "===========================" +echo "Building cli release" + +./build-cli-release.sh "$GOX_OSARCH" + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.icns b/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.icns new file mode 100644 index 00000000..69e608fe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.icns differ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.ico b/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.ico new file mode 100644 index 00000000..4af3f729 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.ico differ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build/icons/icon512x512.png b/vendor/github.com/SkycoinProject/skycoin/electron/build/icons/icon512x512.png new file mode 100644 index 00000000..8eabd213 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/electron/build/icons/icon512x512.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/clean-static-libs.sh b/vendor/github.com/SkycoinProject/skycoin/electron/clean-static-libs.sh new file mode 100755 index 00000000..cc82079b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/clean-static-libs.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# Removes lib.a files cached under $GOPATH. +# Sometimes these are not regenerated by go when doing `go run` + +rm ${GOPATH}/pkg/*/github.com/SkycoinProject/skycoin/src/*.a +rm ${GOPATH}/pkg/*/github.com/SkycoinProject/skycoin/src/lib/*.a +rm ${GOPATH}/pkg/*/github.com/SkycoinProject/*.a diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/clean.sh b/vendor/github.com/SkycoinProject/skycoin/electron/clean.sh new file mode 100755 index 00000000..783faf5d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/clean.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -e -o pipefail + +. build-conf.sh + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +function rmnofail { + for dir in "$@"; do + if [ -e "$dir" ]; then + rm -r "$dir" + echo "removed $dir" + fi + done +} + +rmnofail "$ELN_OUTPUT_BASE" "$STL_OUTPUT_DIR" "$GOX_OUTPUT_DIR" "$FINAL_OUTPUT_DIR" + +# don't remove the electron cache by default, most of the time when we want +# to clean up build artifacts we don't want to clean this up, and downloading +# it again is slow +# rm -r .electron_cache + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/compress-cli-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/compress-cli-release.sh new file mode 100755 index 00000000..5d0c3c63 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/compress-cli-release.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Compresses packaged cli release after +# ./package-cli-release.sh is done + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +# Compress archives +pushd "$CLI_OUTPUT_DIR" >/dev/null + +FINALS=() + +# OS X +if [ -e "$OSX64_CLI" ]; then + if [ -e "$OSX64_CLI_ZIP" ]; then + echo "Removing old $OSX64_CLI_ZIP" + rm "$OSX64_CLI_ZIP" + fi + echo "Zipping $OSX64_CLI_ZIP" + # -y preserves symlinks, + # so that the massive .framework library isn't duplicated + zip -r -y --quiet "$OSX64_CLI_ZIP" "$OSX64_CLI" + FINALS+=("$OSX64_CLI_ZIP") +fi + +# Windows 64bit +if [ -e "$WIN64_CLI" ]; then + if [ -e "$WIN64_CLI_ZIP" ]; then + echo "Removing old $WIN64_CLI_ZIP" + rm "$WIN64_CLI_ZIP" + fi + echo "Zipping $WIN64_CLI_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN64_CLI_ZIP" "$WIN64_CLI" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN64_CLI_ZIP" "$WIN64_CLI" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN64_CLI_ZIP" "$WIN64_CLI" + fi + FINALS+=("$WIN64_CLI_ZIP") +fi + +# Windows 32bit +if [ -e "$WIN32_CLI" ]; then + if [ -e "$WIN32_CLI_ZIP" ]; then + echo "Removing old $WIN32_CLI_ZIP" + rm "$WIN32_CLI_ZIP" + fi + echo "Zipping $WIN32_CLI_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN32_CLI_ZIP" "$WIN32_CLI" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN32_CLI_ZIP" "$WIN32_CLI" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN32_CLI_ZIP" "$WIN32_CLI" + fi + FINALS+=("$WIN32_CLI_ZIP") +fi + +# Linux +if [ -e "$LNX64_CLI" ]; then + if [ -e "$LNX64_CLI_ZIP" ]; then + echo "Removing old $LNX64_CLI_ZIP" + rm "$LNX64_CLI_ZIP" + fi + echo "Zipping $LNX64_CLI_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX64_CLI_ZIP" --owner=0 --group=0 "$LNX64_CLI" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX64_CLI_ZIP" "$LNX64_CLI" + fi + FINALS+=("$LNX64_CLI_ZIP") +fi + +# Linux arm +if [ -e "$LNX_ARM_CLI" ]; then + if [ -e "$LNX_ARM_CLI_ZIP" ]; then + echo "Removing old $LNX_ARM_CLI_ZIP" + rm "$LNX_ARM_CLI_ZIP" + fi + echo "Zipping $LNX_ARM_CLI_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX_ARM_CLI_ZIP" --owner=0 --group=0 "$LNX_ARM_CLI" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX_ARM_CLI_ZIP" "$LNX_ARM_CLI" + fi + FINALS+=("$LNX_ARM_CLI_ZIP") +fi + +popd >/dev/null + +# Move to final release dir +mkdir -p "$FINAL_OUTPUT_DIR" +for var in "${FINALS[@]}"; do + mv "${CLI_OUTPUT_DIR}/${var}" "$FINAL_OUTPUT_DIR" +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/compress-daemon-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/compress-daemon-release.sh new file mode 100755 index 00000000..72adc31c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/compress-daemon-release.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Compresses packaged daemon release after +# ./package-daemon-release.sh is done + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +# Compress archives +pushd "$DMN_OUTPUT_DIR" >/dev/null + +FINALS=() + +# OS X +if [ -e "$OSX64_DMN" ]; then + if [ -e "$OSX64_DMN_ZIP" ]; then + echo "Removing old $OSX64_DMN_ZIP" + rm "$OSX64_DMN_ZIP" + fi + echo "Zipping $OSX64_DMN_ZIP" + # -y preserves symlinks, + # so that the massive .framework library isn't duplicated + zip -r -y --quiet "$OSX64_DMN_ZIP" "$OSX64_DMN" + FINALS+=("$OSX64_DMN_ZIP") +fi + +# Windows 64bit +if [ -e "$WIN64_DMN" ]; then + if [ -e "$WIN64_DMN_ZIP" ]; then + echo "Removing old $WIN64_DMN_ZIP" + rm "$WIN64_DMN_ZIP" + fi + echo "Zipping $WIN64_DMN_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN64_DMN_ZIP" "$WIN64_DMN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN64_DMN_ZIP" "$WIN64_DMN" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN64_DMN_ZIP" "$WIN64_DMN" + fi + FINALS+=("$WIN64_DMN_ZIP") +fi + +# Windows 32bit +if [ -e "$WIN32_DMN" ]; then + if [ -e "$WIN32_DMN_ZIP" ]; then + echo "Removing old $WIN32_DMN_ZIP" + rm "$WIN32_DMN_ZIP" + fi + echo "Zipping $WIN32_DMN_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN32_DMN_ZIP" "$WIN32_DMN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN32_DMN_ZIP" "$WIN32_DMN" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN32_DMN_ZIP" "$WIN32_DMN" + fi + FINALS+=("$WIN32_DMN_ZIP") +fi + +# Linux +if [ -e "$LNX64_DMN" ]; then + if [ -e "$LNX64_DMN_ZIP" ]; then + echo "Removing old $LNX64_DMN_ZIP" + rm "$LNX64_DMN_ZIP" + fi + echo "Zipping $LNX64_DMN_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX64_DMN_ZIP" --owner=0 --group=0 "$LNX64_DMN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX64_DMN_ZIP" "$LNX64_DMN" + fi + FINALS+=("$LNX64_DMN_ZIP") +fi + +# Linux arm +if [ -e "$LNX_ARM_DMN" ]; then + if [ -e "$LNX_ARM_DMN_ZIP" ]; then + echo "Removing old $LNX_ARM_DMN_ZIP" + rm "$LNX_ARM_DMN_ZIP" + fi + echo "Zipping $LNX_ARM_DMN_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX_ARM_DMN_ZIP" --owner=0 --group=0 "$LNX_ARM_DMN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX_ARM_DMN_ZIP" "$LNX_ARM_DMN" + fi + FINALS+=("$LNX_ARM_DMN_ZIP") +fi + +popd >/dev/null + +# Move to final release dir +mkdir -p "$FINAL_OUTPUT_DIR" +for var in "${FINALS[@]}"; do + mv "${DMN_OUTPUT_DIR}/${var}" "$FINAL_OUTPUT_DIR" +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/compress-electron-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/compress-electron-release.sh new file mode 100755 index 00000000..b29565bc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/compress-electron-release.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Compresses packaged electron apps after +# ./package-electron-release.sh is done + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +# Compress archives +pushd "$ELN_OUTPUT_DIR" >/dev/null + +FINALS=() + +# OS X +if [ -e "$OSX64_ELN_PLT" ]; then + pushd "$OSX64_ELN_PLT" >/dev/null + + if [ -e "$OSX64_ELN_ZIP" ]; then + echo "Removing old $OSX64_ELN_ZIP" + rm "$OSX64_ELN_ZIP" + fi + echo "Zipping $OSX64_ELN_ZIP" + # -y preserves symlinks, + # so that the massive .framework library isn't duplicated + zip -r -y --quiet "$OSX64_ELN_ZIP" "$OSX64_APP" + mv "$OSX64_ELN_ZIP" "../$OSX64_ELN_ZIP" + FINALS+=("$OSX64_ELN_ZIP") + + popd >/dev/null +fi + +# Windows 64bit +if [ -e "$WIN64_ELN_PLT" ]; then + if [ -e "$WIN64_ELN_ZIP" ]; then + echo "Removing old $WIN64_ELN_ZIP" + rm "$WIN64_ELN_ZIP" + fi + echo "Zipping $WIN64_ELN_ZIP" + mv "$WIN64_ELN_PLT" "$WIN64_ELN" + zip -r --quiet "$WIN64_ELN_ZIP" "$WIN64_ELN" + mv "$WIN64_ELN" "$WIN64_ELN_PLT" + FINALS+=("$WIN64_ELN_ZIP") +fi + +# Windows 32bit +if [ -e "$WIN32_ELN_PLT" ]; then + if [ -e "$WIN32_ELN_ZIP" ]; then + echo "Removing old $WIN32_ELN_ZIP" + rm "$WIN32_ELN_ZIP" + fi + echo "Zipping $WIN32_ELN_ZIP" + mv "$WIN32_ELN_PLT" "$WIN32_ELN" + zip -r --quiet "$WIN32_ELN_ZIP" "$WIN32_ELN" + mv "$WIN32_ELN" "$WIN32_ELN_PLT" + FINALS+=("$WIN32_ELN_ZIP") +fi + +# Linux +if [ -e "$LNX64_ELN_PLT" ]; then + if [ -e "$LNX64_ELN_ZIP" ]; then + echo "Removing old $LNX64_ELN_ZIP" + rm "$LNX64_ELN_ZIP" + fi + echo "Zipping $LNX64_ELN_ZIP" + mv "$LNX64_ELN_PLT" "$LNX64_ELN" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX64_ELN_ZIP" --owner=0 --group=0 "$LNX64_ELN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX64_ELN_ZIP" "$LNX64_ELN" + fi + mv "$LNX64_ELN" "$LNX64_ELN_PLT" + FINALS+=("$LNX64_ELN_ZIP") +fi + +popd >/dev/null + +# Move to final release dir +mkdir -p "$FINAL_OUTPUT_DIR" +for var in "${FINALS[@]}"; do + mv "${ELN_OUTPUT_DIR}/${var}" "$FINAL_OUTPUT_DIR" +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/compress-standalone-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/compress-standalone-release.sh new file mode 100755 index 00000000..92c5ac1c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/compress-standalone-release.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Compresses packaged standalone release after +# ./package-standalone-release.sh is done + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +# Compress archives +pushd "$STL_OUTPUT_DIR" >/dev/null + +FINALS=() + +# OS X +if [ -e "$OSX64_STL" ]; then + if [ -e "$OSX64_STL_ZIP" ]; then + echo "Removing old $OSX64_STL_ZIP" + rm "$OSX64_STL_ZIP" + fi + echo "Zipping $OSX64_STL_ZIP" + # -y preserves symlinks, + # so that the massive .framework library isn't duplicated + zip -r -y --quiet "$OSX64_STL_ZIP" "$OSX64_STL" + FINALS+=("$OSX64_STL_ZIP") +fi + +# Windows 64bit +if [ -e "$WIN64_STL" ]; then + if [ -e "$WIN64_STL_ZIP" ]; then + echo "Removing old $WIN64_STL_ZIP" + rm "$WIN64_STL_ZIP" + fi + echo "Zipping $WIN64_STL_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN64_STL_ZIP" "$WIN64_STL" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN64_STL_ZIP" "$WIN64_STL" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN64_STL_ZIP" "$WIN64_STL" + fi + FINALS+=("$WIN64_STL_ZIP") +fi + +# Windows 32bit +if [ -e "$WIN32_STL" ]; then + if [ -e "$WIN32_STL_ZIP" ]; then + echo "Removing old $WIN32_STL_ZIP" + rm "$WIN32_STL_ZIP" + fi + echo "Zipping $WIN32_STL_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN32_STL_ZIP" "$WIN32_STL" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN32_STL_ZIP" "$WIN32_STL" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN32_STL_ZIP" "$WIN32_STL" + fi + FINALS+=("$WIN32_STL_ZIP") +fi + +# Linux +if [ -e "$LNX64_STL" ]; then + if [ -e "$LNX64_STL_ZIP" ]; then + echo "Removing old $LNX64_STL_ZIP" + rm "$LNX64_STL_ZIP" + fi + echo "Zipping $LNX64_STL_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX64_STL_ZIP" --owner=0 --group=0 "$LNX64_STL" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX64_STL_ZIP" "$LNX64_STL" + fi + FINALS+=("$LNX64_STL_ZIP") +fi + +# Linux arm +if [ -e "$LNX_ARM_STL" ]; then + if [ -e "$LNX_ARM_STL_ZIP" ]; then + echo "Removing old $LNX_ARM_STL_ZIP" + rm "$LNX_ARM_STL_ZIP" + fi + echo "Zipping $LNX_ARM_STL_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX_ARM_STL_ZIP" --owner=0 --group=0 "$LNX_ARM_STL" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX_ARM_STL_ZIP" "$LNX_ARM_STL" + fi + FINALS+=("$LNX_ARM_STL_ZIP") +fi + +popd >/dev/null + +# Move to final release dir +mkdir -p "$FINAL_OUTPUT_DIR" +for var in "${FINALS[@]}"; do + mv "${STL_OUTPUT_DIR}/${var}" "$FINAL_OUTPUT_DIR" +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/electron-downloader.sh b/vendor/github.com/SkycoinProject/skycoin/electron/electron-downloader.sh new file mode 100755 index 00000000..8fb2ac0b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/electron-downloader.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +. build-conf.sh + +VER=$(echo "$ELN_VERSION" | cut -c2-20) + +# download windows electron +electron-download --version="${VER}" --platform="win32" --arch=x64 +electron-download --version="${VER}" --platform="win32" --arch=ia32 + +# download linux electron +electron-download --version="${VER}" --platform="linux" --arch=x64 + +# download mac osx electron +electron-download --version="${VER}" --platform="darwin" + + diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/gox.sh b/vendor/github.com/SkycoinProject/skycoin/electron/gox.sh new file mode 100755 index 00000000..79497e24 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/gox.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +set -e -o pipefail + +. build-conf.sh + +USAGE="./gox.sh \"osarch\" [output directory] [with builder] + +Builds gox with the osarch string (see 'gox --help' for specifications) + +Optionally specify an output directory for the build files. Will be created +if it does not exist. Defaults to the working directory. + +" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +CMDDIR="../cmd" # relative to compile/electron/ +CMD="${CMD:-$PKG_NAME}" # name of folder in ../cmd to build. defaults to PKG_NAME which is the name of the coin + +OSARCH="$1" +OUTPUT_DIR="$2" +BIN_NAME="${3:-$CMD}" + +CONFIG_MODE=${CONFIG_MODE:-} + +if [ -z "$OSARCH" ]; then + echo "$USAGE" + exit 1 +fi + +case "$OUTPUT_DIR" in +"") + ;; +*/) + ;; +*) + OUTPUT_DIR+="/" + ;; +esac + +pushd "$SCRIPTDIR" >/dev/null + +if [ -n "$OUTPUT_DIR" ]; then + mkdir -p "$OUTPUT_DIR" +fi + +COMMIT=`git rev-parse HEAD` + +CLI_IMPORT_PATH=`go list ../src/cli` + +gox -osarch="$OSARCH" \ + -gcflags="-trimpath=${HOME}" \ + -asmflags="-trimpath=${HOME}" \ + -ldflags="-X main.Version=${APP_VERSION} -X main.Commit=${COMMIT} -X main.ConfigMode=${CONFIG_MODE} -X ${CLI_IMPORT_PATH}.Version=${APP_VERSION}" \ + -output="${OUTPUT_DIR}{{.Dir}}_{{.OS}}_{{.Arch}}" \ + "${CMDDIR}/${CMD}" + +# move the executable files into ${os}_${arch} folders, electron-builder will pack +# the file into corresponding packages. + +platforms=$(echo $OSARCH | tr ";" "\n") + +for plt in $platforms +do + set -- "$plt" + IFS="/"; declare -a s=($*) + case "${s[0]}" in + "windows") + if [ "${s[1]}" = "386" ]; then + OUT="${OUTPUT_DIR}${WIN32_OUT}" + echo "mkdir $OUT" + mkdir -p "$OUT" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}.exe" "${OUT}/${BIN_NAME}.exe" + else + OUT="${OUTPUT_DIR}${WIN64_OUT}" + mkdir -p "${OUT}" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}.exe" "${OUT}/${BIN_NAME}.exe" + fi + ;; + "darwin") + OUT="${OUTPUT_DIR}${OSX64_OUT}" + echo "mkdir ${OUT}" + mkdir -p "${OUT}" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}" "${OUT}/${BIN_NAME}" + ;; + "linux") + if [ "${s[1]}" = "amd64" ]; then + OUT="${OUTPUT_DIR}${LNX64_OUT}" + echo "mkdir ${OUT}" + mkdir -p "${OUT}" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}" "${OUT}/${BIN_NAME}" + elif [ "${s[1]}" = "arm" ]; then + OUT="${OUTPUT_DIR}${LNX_ARM_OUT}" + echo "mkdir ${OUT}" + mkdir -p "${OUT}" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}" "${OUT}/${BIN_NAME}" + fi + ;; + esac +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/install-node-modules.sh b/vendor/github.com/SkycoinProject/skycoin/electron/install-node-modules.sh new file mode 100755 index 00000000..d449d75a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/install-node-modules.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# installs the node modules for the skycoin electron app +# and for the electron build process + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +npm install +cd src/ +./install-dependencies.sh + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-cli-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-cli-release.sh new file mode 100755 index 00000000..78d4da43 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-cli-release.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds the cli release + +GOX_OSARCH="$@" + +echo "In package cli release: $GOX_OSARCH" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +DESTSRCS=() + +function copy_if_exists { + if [ -z "$1" -o -z "$2" -o -z "$3" ]; then + echo "copy_if_exists requires 3 args" + exit 1 + fi + + BIN="${GOX_CLI_OUTPUT_DIR}/${1}" + DESTDIR="$2" + DESTSRC="$3" + + if [ -f "$BIN" ]; then + if [ -e "$DESTDIR" ]; then + rm -r "$DESTDIR" + fi + mkdir -p "$DESTDIR" + + # Copy binary to app + echo "Copying $BIN to $DESTDIR" + cp "$BIN" "$DESTDIR" + + # Copy changelog to app + echo "Copying CHANGELOG.md to $DESTDIR" + cp ../CHANGELOG.md "$DESTDIR" + + # Copy cmd/skycoin-cli/README.md to app + echo "Copying cmd/skycoin-cli/README.md to $DESTDIR" + cp ../cmd/skycoin-cli/README.md "$DESTDIR" + + echo "Adding $DESTSRC to package-source.sh list" + DESTSRCS+=("$DESTSRC") + else + echo "$BIN does not exsit" + fi +} + +echo "Copying ${GOX_CLI_OUTPUT_NAME} binaries" + +# OS X +if [ ! -z "$OSX64_CLI" ]; then + OSX64="${CLI_OUTPUT_DIR}/${OSX64_CLI}" + OSX64_SRC="${OSX64}/src" + copy_if_exists "${OSX64_OUT}/${GOX_CLI_OUTPUT_NAME}" "$OSX64" "$OSX64_SRC" +fi + +# Linux amd64 +if [ ! -z "$LNX64_CLI" ]; then + LNX64="${CLI_OUTPUT_DIR}/${LNX64_CLI}" + LNX64_SRC="${LNX64}/src" + copy_if_exists "${LNX64_OUT}/${GOX_CLI_OUTPUT_NAME}" "$LNX64" "$LNX64_SRC" +fi + +# Linux arm +if [ ! -z "$LNX_ARM_CLI" ]; then + LNX_ARM="${CLI_OUTPUT_DIR}/${LNX_ARM_CLI}" + LNX_ARM_SRC="${LNX_ARM}/src" + copy_if_exists "${LNX_ARM_OUT}/${GOX_CLI_OUTPUT_NAME}" "$LNX_ARM" "$LNX_ARM_SRC" +fi + +# Windows amd64 +if [ ! -z "$WIN64_CLI" ]; then + WIN64="${CLI_OUTPUT_DIR}/${WIN64_CLI}" + WIN64_SRC="${WIN64}/src" + copy_if_exists "${WIN64_OUT}/${GOX_CLI_OUTPUT_NAME}.exe" "$WIN64" "$WIN64_SRC" +fi + +# Windows 386 +if [ ! -z "$WIN32_CLI" ]; then + WIN32="${CLI_OUTPUT_DIR}/${WIN32_CLI}" + WIN32_SRC="${WIN32}/src" + copy_if_exists "${WIN32_OUT}/${GOX_CLI_OUTPUT_NAME}.exe" "$WIN32" "$WIN32_SRC" +fi + +# # Copy the source for reference +# # tar it with filters, move it, then untar in order to do this +# echo "Copying source snapshot" + +# ./package-source.sh "${DESTSRCS[@]}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-daemon-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-daemon-release.sh new file mode 100755 index 00000000..6001d76b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-daemon-release.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds the daemon release + +GOX_OSARCH="$@" + +echo "In package daemon release: $GOX_OSARCH" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +DESTSRCS=() + +function copy_if_exists { + if [ -z "$1" -o -z "$2" -o -z "$3" ]; then + echo "copy_if_exists requires 3 args" + exit 1 + fi + + BIN="${GOX_DMN_OUTPUT_DIR}/${1}" + DESTDIR="$2" + DESTSRC="$3" + + if [ -f "$BIN" ]; then + if [ -e "$DESTDIR" ]; then + rm -r "$DESTDIR" + fi + mkdir -p "$DESTDIR" + + # Copy binary to app + echo "Copying $BIN to $DESTDIR" + cp "$BIN" "$DESTDIR" + + # Copy changelog to app + echo "Copying CHANGELOG.md to $DESTDIR" + cp ../CHANGELOG.md "$DESTDIR" + + echo "Adding $DESTSRC to package-source.sh list" + DESTSRCS+=("$DESTSRC") + else + echo "$BIN does not exsit" + fi +} + +function codesign_if_exists { + if [ -z "$1" ]; then + echo "codesign_if_exists requires binary path" + exit 1 + fi + + BIN="${GOX_GUI_OUTPUT_DIR}/${1}" + + if [ -f "$BIN" ]; then + echo "signing daemon binary" + codesign --force --sign "Developer ID Application: yunfei mao" "${BIN}" + else + echo "$BIN does not exsit" + fi +} + +echo "Copying ${PKG_NAME} binaries" + +# OS X +if [ ! -z "$OSX64_DMN" ]; then + OSX64="${DMN_OUTPUT_DIR}/${OSX64_DMN}" + OSX64_SRC="${OSX64}/src" + codesign_if_exists "${OSX64_OUT}/${PKG_NAME}" + copy_if_exists "${OSX64_OUT}/${PKG_NAME}" "$OSX64" "$OSX64_SRC" +fi + +# Linux amd64 +if [ ! -z "$LNX64_DMN" ]; then + LNX64="${DMN_OUTPUT_DIR}/${LNX64_DMN}" + LNX64_SRC="${LNX64}/src" + copy_if_exists "${LNX64_OUT}/${PKG_NAME}" "$LNX64" "$LNX64_SRC" +fi + +# Linux arm +if [ ! -z "$LNX_ARM_DMN" ]; then + LNX_ARM="${DMN_OUTPUT_DIR}/${LNX_ARM_DMN}" + LNX_ARM_SRC="${LNX_ARM}/src" + copy_if_exists "${LNX_ARM_OUT}/${PKG_NAME}" "$LNX_ARM" "$LNX_ARM_SRC" +fi + +# Windows amd64 +if [ ! -z "$WIN64_DMN" ]; then + WIN64="${DMN_OUTPUT_DIR}/${WIN64_DMN}" + WIN64_SRC="${WIN64}/src" + copy_if_exists "${WIN64_OUT}/${PKG_NAME}.exe" "$WIN64" "$WIN64_SRC" +fi + +# Windows 386 +if [ ! -z "$WIN32_DMN" ]; then + WIN32="${DMN_OUTPUT_DIR}/${WIN32_DMN}" + WIN32_SRC="${WIN32}/src" + copy_if_exists "${WIN32_OUT}/${PKG_NAME}.exe" "$WIN32" "$WIN32_SRC" +fi + +# # Copy the source for reference +# # tar it with filters, move it, then untar in order to do this +# echo "Copying source snapshot" + +# ./package-source.sh "${DESTSRCS[@]}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-electron-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-electron-release.sh new file mode 100755 index 00000000..a88add7e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-electron-release.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Copies gox-compiled binaries and compiled GUI assets +# into an electron package + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +OSX64="${ELN_OUTPUT_DIR}/${OSX64_ELN_PLT}" +WIN64="${ELN_OUTPUT_DIR}/${WIN64_ELN_PLT}" +WIN32="${ELN_OUTPUT_DIR}/${WIN32_ELN_PLT}" +LNX64="${ELN_OUTPUT_DIR}/${LNX64_ELN_PLT}" + +OSX64_RES="${OSX64}/${OSX64_APP}/Contents/Resources/app" +WIN64_RES="${WIN64}/resources/app" +WIN32_RES="${WIN32}/resources/app" +LNX64_RES="${LNX64}/resources/app" + +OSX64_SRC="${OSX64_RES}/src" +WIN64_SRC="${WIN64}/src" +WIN32_SRC="${WIN32}/src" +LNX64_SRC="${LNX64}/src" + +# Capitalize OS X .app for convention +if [ -e "${OSX64}/${PKG_NAME}.app" ]; then + mv "${OSX64}/${PKG_NAME}.app" "${OSX64}/${OSX64_APP}" +fi + +DESTSRCS=() + +function copy_if_exists { + if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" ]; then + echo "copy_if_exists requires 4 args" + exit 1 + fi + + BIN="${GOX_GUI_OUTPUT_DIR}/${1}" + DESTDIR="$2" + DESTBIN="${DESTDIR}/${3}" + DESTSRC="$4" + + if [ -f "$BIN" ]; then + # Copy binary to electron app + echo "Copying $BIN to $DESTBIN" + # mkdir -p $DESTBIN + cp "$BIN" "$DESTBIN" + + # Copy static resources to electron app + echo "Copying $GUI_DIST_DIR to $DESTDIR" + cp -R "$GUI_DIST_DIR" "$DESTDIR" + + # Copy changelog to app + echo "Copying CHANGELOG.md to $DESTDIR" + cp ../CHANGELOG.md "$DESTDIR" + + DESTSRCS+=("$DESTSRC") + else + echo "$BIN does not exist" + fi +} + +echo "Copying ${PKG_NAME} binaries" + +copy_if_exists "${PKG_NAME}_darwin_amd64" "$OSX64_RES" "${PKG_NAME}" "$OSX64_SRC" +copy_if_exists "${PKG_NAME}_windows_amd64.exe" "$WIN64_RES" "${PKG_NAME}.exe" "$WIN64_SRC" +copy_if_exists "${PKG_NAME}_windows_386.exe" "$WIN32_RES" "${PKG_NAME}.exe" "$WIN32_SRC" +copy_if_exists "${PKG_NAME}_linux_amd64" "$LNX64_RES" "${PKG_NAME}" "$LNX64_SRC" + +# # Copy the source for reference +# # tar it with filters, move it, then untar in order to do this +# echo "Copying source snapshot" + +# ./package-source.sh "${DESTSRCS[@]}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-lock.json b/vendor/github.com/SkycoinProject/skycoin/electron/package-lock.json new file mode 100644 index 00000000..98894a73 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-lock.json @@ -0,0 +1,2780 @@ +{ + "name": "skycoin", + "version": "0.27.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "7zip-bin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-3.1.0.tgz", + "integrity": "sha512-juYJNi8JEpTUWXwz8ssa8Oop4n/kwJ/pIQP22vJAVAe6RTRD+0m+e9LRNnfK2EDaX8uwmUzLNGviFQRD6SxeOw==", + "dev": true, + "requires": { + "7zip-bin-linux": "1.3.1", + "7zip-bin-mac": "1.0.1", + "7zip-bin-win": "2.2.0" + } + }, + "7zip-bin-linux": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/7zip-bin-linux/-/7zip-bin-linux-1.3.1.tgz", + "integrity": "sha512-Wv1uEEeHbTiS1+ycpwUxYNuIcyohU6Y6vEqY3NquBkeqy0YhVdsNUGsj0XKSRciHR6LoJSEUuqYUexmws3zH7Q==", + "dev": true, + "optional": true + }, + "7zip-bin-mac": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz", + "integrity": "sha1-Pmh3i78JJq3GgVlCcHRQXUdVXAI=", + "dev": true, + "optional": true + }, + "7zip-bin-win": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin-win/-/7zip-bin-win-2.2.0.tgz", + "integrity": "sha512-uPHXapEmUtlUKTBx4asWMlxtFUWXzEY0KVEgU7QKhgO2LJzzM3kYxM6yOyUZTtYE6mhK4dDn3FDut9SCQWHzgg==", + "dev": true, + "optional": true + }, + "@types/node": { + "version": "8.10.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.45.tgz", + "integrity": "sha512-tGVTbA+i3qfXsLbq9rEq/hezaHY55QxQLeXQL2ejNgFAxxrgu8eMmYIOsRcl7hN1uTLVsKOOYacV/rcJM3sfgQ==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.2" + } + }, + "app-builder-bin": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.8.6.tgz", + "integrity": "sha512-jQiCV8fxW3SPtPnU/BnTEQqawWtBmanCgydzRuzsptFVb/6Q4OKWdB5T3B+XHOf8lqaH89+XeJf6oA1b/QQEnQ==", + "dev": true, + "requires": { + "app-builder-bin-linux": "1.8.6", + "app-builder-bin-mac": "1.8.6", + "app-builder-bin-win": "1.8.6" + } + }, + "app-builder-bin-linux": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin-linux/-/app-builder-bin-linux-1.8.6.tgz", + "integrity": "sha512-IZSv5Wcz3/OYZENwn3iaTLjDSSVPVFobBiJjUrP3hXeOnitRvB0aI8X5KMFYzfkv7kIhSlyPnRsvNjPqgbjyrw==", + "dev": true, + "optional": true + }, + "app-builder-bin-mac": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin-mac/-/app-builder-bin-mac-1.8.6.tgz", + "integrity": "sha512-lWIpI2zmOmQ4JCp1IGxK6KngKAEN6QO9nu5k8h+ZzMxHBTCk8+kbBTE+R36BSRGX9q/4FhHBpYGXHVj+N9xOXg==", + "dev": true, + "optional": true + }, + "app-builder-bin-win": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin-win/-/app-builder-bin-win-1.8.6.tgz", + "integrity": "sha512-nlceArzkRtWgqNoif6OFKaAKNNZ3uZuiG+9UkpOPLf/EDoYdeAq4YdvKWaQx1RHsNNfQTx0s/IODvlD0AdUmPA==", + "dev": true, + "optional": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bluebird-lst": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz", + "integrity": "sha512-Ey0bDNys5qpYPhZ/oQ9vOEvD0TYQDTILMXWP2iGfvMg7rSDde+oV4aQQgqRH+CvBFNz2BSDQnPGMUl6LKBUUQA==", + "dev": true, + "requires": { + "bluebird": "3.5.1" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, + "builder-util": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.8.1.tgz", + "integrity": "sha512-jWqFPUMO2FBrumqA6U6/UppVkftbwCP+2YM8y9DA7g2rJHzHRZ3J6fHDpPCSWIYYEHbAiEwONTWuVKbwu3oYIw==", + "dev": true, + "requires": { + "7zip-bin": "3.1.0", + "app-builder-bin": "1.8.6", + "bluebird-lst": "1.0.5", + "builder-util-runtime": "4.2.1", + "chalk": "2.4.1", + "debug": "3.1.0", + "fs-extra-p": "4.6.1", + "is-ci": "1.1.0", + "js-yaml": "3.12.0", + "lazy-val": "1.0.3", + "semver": "5.5.0", + "source-map-support": "0.5.6", + "stat-mode": "0.2.2", + "temp-file": "3.1.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "builder-util-runtime": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.2.1.tgz", + "integrity": "sha512-6Ufp6ExT40RDYNXQgD4xG0fgtpUHyc8XIld6lptKr0re1DNnUrQP4sSV/lJOajpzyercMP/YIzO60/mNuAFiWg==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "debug": "3.1.0", + "fs-extra-p": "4.6.1", + "sax": "1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "dmg-builder": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-4.1.8.tgz", + "integrity": "sha512-OuGpvbnzu5MC7stpTdYSE3rWiPPOd550X2N/Djomz5PbIZ4Xd96IBM1qd2TDhrZUnIT/un++ns0/FWqd1Wopyg==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "electron-builder-lib": "20.13.3", + "fs-extra-p": "4.6.1", + "iconv-lite": "0.4.23", + "js-yaml": "3.12.0", + "parse-color": "1.0.0", + "sanitize-filename": "1.6.1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", + "dev": true + }, + "dotenv-expand": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", + "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "electron": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.18.tgz", + "integrity": "sha512-PQRHtFvLxHdJzMMIwTddUtkS+Te/fZIs+PHO+zPmTUTBE76V3Od3WRGzMQwiJHxN679licmCKhJpMyxZfDEVWQ==", + "dev": true, + "requires": { + "@types/node": "8.10.45", + "electron-download": "3.3.0", + "extract-zip": "1.6.7" + } + }, + "electron-builder": { + "version": "20.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.13.3.tgz", + "integrity": "sha512-OnPNIPjJ/Gp50yKWz8M0BP+WMl+CPPkwbipjrWiNCm1UviIUmRq/q1gT2So3Bdn9b37L5MfcFRorF8xWk37WMw==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "builder-util-runtime": "4.2.1", + "chalk": "2.4.1", + "dmg-builder": "4.1.8", + "electron-builder-lib": "20.13.3", + "electron-download-tf": "4.3.4", + "fs-extra-p": "4.6.1", + "is-ci": "1.1.0", + "lazy-val": "1.0.3", + "read-config-file": "3.0.1", + "sanitize-filename": "1.6.1", + "update-notifier": "2.5.0", + "yargs": "11.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "electron-download-tf": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/electron-download-tf/-/electron-download-tf-4.3.4.tgz", + "integrity": "sha512-SQYDGMLpTgty1bx3NycuDb7dNPzktVSdK2sqPZjyRocauq/uN/V4S2lcpFVLupaHhKlD8zozm9fTpm5UdohvTg==", + "dev": true, + "requires": { + "debug": "3.1.0", + "env-paths": "1.0.0", + "fs-extra": "4.0.3", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "3.0.0", + "rc": "1.2.8", + "semver": "5.5.0", + "sumchecker": "2.0.2" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "dev": true, + "requires": { + "debug": "2.6.9" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "electron-builder-lib": { + "version": "20.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.13.3.tgz", + "integrity": "sha512-UMr7aAfLzKxwTFI1GRUf+Gj9kyeYUSYZ9Hi5qRtlBDTEjSYH+zNkNK+P6KbJ0SPsbKwcGF4eF1UxAsbnpJ3A4w==", + "dev": true, + "requires": { + "7zip-bin": "3.1.0", + "app-builder-bin": "1.8.6", + "async-exit-hook": "2.0.1", + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "builder-util-runtime": "4.2.1", + "chromium-pickle-js": "0.2.0", + "debug": "3.1.0", + "ejs": "2.6.1", + "electron-osx-sign": "0.4.10", + "electron-publish": "20.13.2", + "fs-extra-p": "4.6.1", + "hosted-git-info": "2.7.1", + "is-ci": "1.1.0", + "isbinaryfile": "3.0.2", + "js-yaml": "3.12.0", + "lazy-val": "1.0.3", + "minimatch": "3.0.4", + "normalize-package-data": "2.4.0", + "plist": "3.0.1", + "read-config-file": "3.0.1", + "sanitize-filename": "1.6.1", + "semver": "5.5.0", + "temp-file": "3.1.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "electron-download": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", + "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "dev": true, + "requires": { + "debug": "2.6.9", + "fs-extra": "0.30.0", + "home-path": "1.0.6", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "2.1.0", + "rc": "1.2.8", + "semver": "5.5.0", + "sumchecker": "1.3.1" + } + }, + "electron-osx-sign": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz", + "integrity": "sha1-vk87ibKnWh3F8eckkIGrKSnKOiY=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "compare-version": "0.1.2", + "debug": "2.6.9", + "isbinaryfile": "3.0.2", + "minimist": "1.2.0", + "plist": "2.1.0" + }, + "dependencies": { + "plist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", + "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", + "dev": true, + "requires": { + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", + "xmldom": "0.1.27" + } + } + } + }, + "electron-publish": { + "version": "20.13.2", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.13.2.tgz", + "integrity": "sha512-Mg/GdDZdUgQep9Ex/NpWM8yeq1Lp2z5k42FB1awW5rz+mSvS/O0MQLJVZ7RaSzEFEgkhBoNlhU7GqirzSxJQTw==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "builder-util-runtime": "4.2.1", + "chalk": "2.4.1", + "fs-extra-p": "4.6.1", + "lazy-val": "1.0.3", + "mime": "2.3.1" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es6-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.19" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.3" + } + }, + "fs-extra-p": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-4.6.1.tgz", + "integrity": "sha512-IsTMbUS0svZKZTvqF4vDS9c/L7Mw9n8nZQWWeSzAGacOSe+8CzowhUN0tdZEZFIJNP5HC7L9j3MMikz/G4hDeQ==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "fs-extra": "6.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "home-path": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", + "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-val": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz", + "integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "dev": true, + "requires": { + "mime-db": "1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.7.1", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "dev": true, + "requires": { + "debug": "2.6.9", + "minimist": "1.2.0", + "pretty-bytes": "1.0.4", + "progress-stream": "1.2.0", + "request": "2.87.0", + "single-line-log": "1.1.2", + "throttleit": "0.0.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.3.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "dev": true, + "requires": { + "color-convert": "0.5.3" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "dev": true + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.2" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "xmlbuilder": "9.0.7", + "xmldom": "0.1.27" + }, + "dependencies": { + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + } + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "dev": true, + "requires": { + "speedometer": "0.1.4", + "through2": "0.2.3" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-config-file": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.0.1.tgz", + "integrity": "sha512-xMKmxBYENBqcTMc7r/VteufWgqI9c7oASnOxFa6Crlk4d/nVTOTOJKDhAHJCiGpD8cWzUY9t7K1+M3d75w4f9A==", + "dev": true, + "requires": { + "ajv": "6.5.2", + "ajv-keywords": "3.2.0", + "bluebird-lst": "1.0.5", + "dotenv": "5.0.1", + "dotenv-expand": "4.2.0", + "fs-extra-p": "4.6.1", + "js-yaml": "3.12.0", + "json5": "1.0.1", + "lazy-val": "1.0.3" + }, + "dependencies": { + "ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "1.2.8", + "safe-buffer": "5.1.2" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.8" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.19", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sanitize-filename": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz", + "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=", + "dev": true, + "requires": { + "truncate-utf8-bytes": "1.0.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "source-map": "0.6.1" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "sumchecker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", + "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "es6-promise": "4.2.6" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "temp-file": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.1.3.tgz", + "integrity": "sha512-oz2J77loDE9sGrlRTqBzwbsUvoBD2BpyXeaRPKyGwBIwaamSs2jdqAfhutw7Tch9llr1u8E2ruoug09rNPa3PA==", + "dev": true, + "requires": { + "async-exit-hook": "2.0.1", + "bluebird-lst": "1.0.5", + "fs-extra-p": "4.6.1", + "lazy-val": "1.0.3" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "xtend": "2.1.2" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "1.0.4" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", + "dev": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "0.4.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-source.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-source.sh new file mode 100755 index 00000000..a10149db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-source.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -e -o pipefail + +SRC_TAR="tmp-src-snapshot.tar" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "${SCRIPTDIR}" + +if [[ "$OSTYPE" == "linux"* ]]; then + tar -C .. -cvPf "${SRC_TAR}" --owner=0 --group=0 --exclude=electron \ + --exclude=node_modules --exclude=_deprecated --exclude='.*' \ + src cmd run-client.sh run-daemon.sh README.md INSTALLATION.md CHANGELOG.md INTEGRATION.md \ + >/dev/null +elif [[ "$OSTYPE" == "darwin"* ]]; then + tar -C .. -cvf "${SRC_TAR}" --exclude=electron \ + --exclude=node_modules --exclude=_deprecated --exclude='.*' \ + src cmd run-client.sh run-daemon.sh README.md INSTALLATION.md CHANGELOG.md INTEGRATION.md \ + >/dev/null +elif [[ "$OSTYPE" == "msys"* ]]; then + tar -C .. -cvPf "${SRC_TAR}" --owner=0 --group=0 --exclude=electron \ + --exclude=node_modules --exclude=_deprecated --exclude='.*' \ + src cmd run-client.sh run-daemon.sh README.md INSTALLATION.md CHANGELOG.md INTEGRATION.md \ + >/dev/null +fi + +popd >/dev/null + +function copy_source { + echo "Copying source tree to $1" + mkdir -p "$1" + cp "${SRC_TAR}" "$1" + pushd "$1" + tar xvPf "${SRC_TAR}" >/dev/null + rm "${SRC_TAR}" + popd >/dev/null +} + +for var in "$@"; do + copy_source "$var" +done + +rm "${SRC_TAR}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-standalone-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-standalone-release.sh new file mode 100755 index 00000000..b242ab84 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-standalone-release.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds the release without electron + +GOX_OSARCH="$@" + +echo "In package standalone release: $GOX_OSARCH" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +DESTSRCS=() + +function copy_if_exists { + if [ -z "$1" -o -z "$2" -o -z "$3" ]; then + echo "copy_if_exists requires 3 args" + exit 1 + fi + + BIN="${GOX_GUI_OUTPUT_DIR}/${1}" + DESTDIR="$2" + DESTSRC="$3" + + if [ -f "$BIN" ]; then + if [ -e "$DESTDIR" ]; then + rm -r "$DESTDIR" + fi + mkdir -p "$DESTDIR" + + # Copy binary to electron app + echo "Copying $BIN to $DESTDIR" + cp "$BIN" "$DESTDIR" + + # Copy static resources to electron app + echo "Copying $GUI_DIST_DIR to ${DESTDIR}/src/gui/static" + mkdir -p "${DESTDIR}/src/gui/static" + cp -R "$GUI_DIST_DIR" "${DESTDIR}/src/gui/static" + + # Copy changelog to app + echo "Copying CHANGELOG.md to $DESTDIR" + cp ../CHANGELOG.md "$DESTDIR" + + echo "Adding $DESTSRC to package-source.sh list" + DESTSRCS+=("$DESTSRC") + else + echo "$BIN does not exsit" + fi +} + +function codesign_if_exists { + if [ -z "$1" ]; then + echo "codesign_if_exists requires binary path" + exit 1 + fi + + BIN="${GOX_GUI_OUTPUT_DIR}/${1}" + + if [ -f "$BIN" ]; then + echo "signing standalone binary" + codesign --force --sign "Developer ID Application: yunfei mao" "${BIN}" + else + echo "$BIN does not exsit" + fi +} + +echo "Copying ${PKG_NAME} binaries" + +# OS X +if [ ! -z "$OSX64_STL" ]; then + OSX64="${STL_OUTPUT_DIR}/${OSX64_STL}" + OSX64_SRC="${OSX64}/src" + codesign_if_exists "${OSX64_OUT}/${PKG_NAME}" + copy_if_exists "${OSX64_OUT}/${PKG_NAME}" "$OSX64" "$OSX64_SRC" +fi + +# Linux amd64 +if [ ! -z "$LNX64_STL" ]; then + LNX64="${STL_OUTPUT_DIR}/${LNX64_STL}" + LNX64_SRC="${LNX64}/src" + copy_if_exists "${LNX64_OUT}/${PKG_NAME}" "$LNX64" "$LNX64_SRC" +fi + +# Linux arm +if [ ! -z "$LNX_ARM_STL" ]; then + LNX_ARM="${STL_OUTPUT_DIR}/${LNX_ARM_STL}" + LNX_ARM_SRC="${LNX_ARM}/src" + copy_if_exists "${LNX_ARM_OUT}/${PKG_NAME}" "$LNX_ARM" "$LNX_ARM_SRC" +fi + +# Windows amd64 +if [ ! -z "$WIN64_STL" ]; then + WIN64="${STL_OUTPUT_DIR}/${WIN64_STL}" + WIN64_SRC="${WIN64}/src" + copy_if_exists "${WIN64_OUT}/${PKG_NAME}.exe" "$WIN64" "$WIN64_SRC" +fi + +# Windows 386 +if [ ! -z "$WIN32_STL" ]; then + WIN32="${STL_OUTPUT_DIR}/${WIN32_STL}" + WIN32_SRC="${WIN32}/src" + copy_if_exists "${WIN32_OUT}/${PKG_NAME}.exe" "$WIN32" "$WIN32_SRC" +fi + +# # Copy the source for reference +# # tar it with filters, move it, then untar in order to do this +# echo "Copying source snapshot" + +# ./package-source.sh "${DESTSRCS[@]}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package.json b/vendor/github.com/SkycoinProject/skycoin/electron/package.json new file mode 100644 index 00000000..d65adc3a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package.json @@ -0,0 +1,82 @@ +{ + "name": "skycoin", + "productName": "Skycoin", + "author": "skycoin", + "main": "src/electron-main.js", + "version": "0.27.0", + "description": "skycoin wallet", + "license": "MIT", + "build": { + "appId": "org.skycoin.skycoin", + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true + }, + "mac": { + "category": "public.app-category.productivity", + "extraFiles": [ + { + "from": ".gox_output/gui/${os}_${arch}", + "to": "./Resources/app" + } + ] + }, + "win": { + "target": "nsis", + "extraFiles": [ + { + "from": ".gox_output/gui/${os}_${arch}", + "to": "./resources/app" + } + ] + }, + "linux": { + "category": "Network", + "extraFiles": [ + { + "from": ".gox_output/gui/${os}_${arch}", + "to": "./resources/app" + }, + { + "from": "build/icons/icon512x512.png", + "to": "./Resources" + } + ] + }, + "files": [ + "!**/*", + "src/**/*" + ], + "extraResources": [ + { + "from": "../src/gui/static/dist/", + "to": "./app/dist/", + "filter": [ + "**/*" + ] + }, + { + "from": "./skycoin/", + "to": "./app/dist/" + } + ], + "directories": { + "output": "release" + } + }, + "scripts": { + "start": "electron ./src/electron-main.js dev", + "dist-win32": "build -w --ia32 -p=never", + "dist-win64": "build -w --x64 -p=never", + "dist-win": "build -w --x64 --ia32 -p=never", + "dist-linux": "build -l --x64 -p=never", + "dist-mac": "build -m --x64 -p=never", + "pack-mac": "build --dir -m -p=never", + "postinstall": "electron-builder install-app-deps" + }, + "devDependencies": { + "electron": "^2.0.18", + "electron-builder": "20.13.3" + }, + "dependencies": {} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/skycoin/current-skycoin.json b/vendor/github.com/SkycoinProject/skycoin/electron/skycoin/current-skycoin.json new file mode 100644 index 00000000..9e88679f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/skycoin/current-skycoin.json @@ -0,0 +1 @@ +versionData='{ "version": "0.27.0" }'; diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/.snyk b/vendor/github.com/SkycoinProject/skycoin/electron/src/.snyk new file mode 100644 index 00000000..4747845e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/.snyk @@ -0,0 +1,9 @@ +# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. +version: v1.13.1 +# ignores vulnerabilities until expiry date; change duration by modifying expiry date +ignore: + 'npm:chownr:20180731': + - '*': + reason: No fix available + expires: '2019-06-25T15:35:33.473Z' +patch: {} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/README.md b/vendor/github.com/SkycoinProject/skycoin/electron/src/README.md new file mode 100644 index 00000000..6607c49e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/README.md @@ -0,0 +1,8 @@ +# Electron code + +This folder contains the JS code that is executed by Electron + +## Install How to install/update the dependencies + +To install/update the code dependencies, instead of using `npm install` run `./install-dependencies.sh`. This way the +native dependencies are compiled for the current platform, something that is necessary for the code to run. diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-api.js b/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-api.js new file mode 100644 index 00000000..8a3ea383 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-api.js @@ -0,0 +1,2 @@ +window.isElectron = true; +window.ipcRenderer = require('electron').ipcRenderer; \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-main.js b/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-main.js new file mode 100644 index 00000000..bcea05ab --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-main.js @@ -0,0 +1,383 @@ +'use strict' + +const { app, Menu, BrowserWindow, shell, session } = require('electron'); + +const path = require('path'); + +const childProcess = require('child_process'); + +const axios = require('axios'); + +//const hwCode = require('./hardware-wallet'); + +// This adds refresh and devtools console keybindings +// Page can refresh with cmd+r, ctrl+r, F5 +// Devtools can be toggled with cmd+alt+i, ctrl+shift+i, F12 +require('electron-debug')({enabled: true, showDevTools: false}); +require('electron-context-menu')({}); + + +global.eval = function() { throw new Error('bad!!'); } + +let currentURL; +let splashLoaded = false + +// Detect if the code is running with the "dev" arg. The "dev" arg is added when running npm +// start. If this is true, a local node will not be started, but one is expected to be running, +// the contents served in http://localhost:4200 will be displayed and it will be allowed to +// reload the URLs using the Electron window, so that it is easier to test the changes made to +// the UI using npm start. +let dev = process.argv.find(arg => arg === 'dev') ? true : false; + +// Force everything localhost, in case of a leak +app.commandLine.appendSwitch('host-rules', 'MAP * 127.0.0.1, EXCLUDE api.coinpaprika.com, EXCLUDE swaplab.cc, EXCLUDE version.skycoin.com, EXCLUDE downloads.skycoin.com'); +app.commandLine.appendSwitch('ssl-version-fallback-min', 'tls1.2'); +app.commandLine.appendSwitch('--no-proxy-server'); +app.setAsDefaultProtocolClient('skycoin'); + + + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let win; + +var skycoin = null; + +function startSkycoin() { + if (!dev) { + console.log('Starting skycoin from electron'); + + if (skycoin) { + console.log('Skycoin already running'); + app.emit('skycoin-ready'); + return + } + + var reset = () => { + skycoin = null; + } + + // Resolve skycoin binary location + var appPath = app.getPath('exe'); + var exe = (() => { + switch (process.platform) { + case 'darwin': + return path.join(appPath, '../../Resources/app/skycoin'); + case 'win32': + // Use only the relative path on windows due to short path length + // limits + return './resources/app/skycoin.exe'; + case 'linux': + return path.join(path.dirname(appPath), './resources/app/skycoin'); + default: + return './resources/app/skycoin'; + } + })() + + var args = [ + '-launch-browser=false', + '-gui-dir=' + path.dirname(exe), + '-color-log=false', // must be disabled for web interface detection + '-logtofile=true', + '-download-peerlist=true', + '-enable-all-api-sets=true', + '-enable-api-sets=INSECURE_WALLET_SEED', + '-disable-csrf=false', + '-reset-corrupt-db=true', + '-enable-gui=true', + '-web-interface-port=0' // random port assignment + // will break + // broken (automatically generated certs do not work): + // '-web-interface-https=true', + ] + skycoin = childProcess.spawn(exe, args); + + createWindow(); + + skycoin.on('error', (e) => { + showError(); + app.quit(); + }); + + skycoin.stdout.on('data', (data) => { + console.log(data.toString()); + if (currentURL) { + return + } + + const marker = 'Starting web interface on '; + + data.toString().split('\n').forEach(line => { + if (line.indexOf(marker) !== -1) { + currentURL = 'http://' + line.split(marker)[1].trim(); + var id = setInterval(function() { + // wait till the splash page loading is finished + if (splashLoaded) { + app.emit('skycoin-ready', { url: currentURL }); + clearInterval(id); + } + }, 500); + } + }); + }); + + skycoin.stderr.on('data', (data) => { + console.log(data.toString()); + }); + + skycoin.on('close', (code) => { + // log.info('Skycoin closed'); + console.log('Skycoin closed'); + showError(); + reset(); + }); + + skycoin.on('exit', (code) => { + // log.info('Skycoin exited'); + console.log('Skycoin exited'); + showError(); + reset(); + }); + + } else { + // If in dev mode, simply open the dev server URL. + currentURL = 'http://localhost:4200/'; + app.emit('skycoin-ready', { url: currentURL }); + + axios + .get('http://localhost:4200/api/v1/wallets/folderName') + .then(response => { + walletsFolder = response.data.address; + //hwCode.setWalletsFolderPath(walletsFolder); + }) + .catch(() => {}); + } +} + +function showError() { + if (win) { + win.loadURL('file://' + process.resourcesPath + '/app/dist/assets/error-alert/index.html'); + console.log('Showing the error message'); + } +} + +function createWindow(url) { + // To fix appImage doesn't show icon in dock issue. + var appPath = app.getPath('exe'); + var iconPath = (() => { + switch (process.platform) { + case 'linux': + return path.join(path.dirname(appPath), './resources/icon512x512.png'); + } + })() + + // Create the browser window. + win = new BrowserWindow({ + width: 1200, + height: 900, + backgroundColor: '#000000', + title: 'Skycoin', + icon: iconPath, + nodeIntegration: false, + webPreferences: { + webgl: false, + webaudio: false, + contextIsolation: false, + webviewTag: false, + nodeIntegration: false, + nodeIntegrationInWorker: false, + allowRunningInsecureContent: false, + webSecurity: true, + plugins: false, + preload: __dirname + '/electron-api.js', + }, + }); + //hwCode.setWinRef(win); + + win.webContents.on('did-finish-load', function() { + if (!splashLoaded) { + splashLoaded = true; + } + }); + + // patch out eval + win.eval = global.eval; + win.webContents.executeJavaScript('window.eval = 0;'); + + const ses = win.webContents.session + ses.clearCache(function () { + console.log('Cleared the caching of the skycoin wallet.'); + }); + + if (url) { + win.loadURL(url); + } else { + win.loadURL('file://' + __dirname + '/splash/index.html'); + } + + // Open the DevTools. + // win.webContents.openDevTools(); + + // Emitted when the window is closed. + win.on('closed', () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + win = null; + //hwCode.setWinRef(win); + }); + + // If in dev mode, allow to open URLs. + if (!dev) { + win.webContents.on('will-navigate', function(e, url) { + e.preventDefault(); + require('electron').shell.openExternal(url); + }); + } + + // Open links with target='_blank' in the default browser. + win.webContents.on('new-window', function(e, url) { + e.preventDefault(); + require('electron').shell.openExternal(url); + }); + + // create application's main menu + var template = [{ + label: 'Skycoin', + submenu: [ + { label: 'Quit', accelerator: 'Command+Q', click: function() { app.quit(); } } + ] + }, { + label: 'Edit', + submenu: [ + { label: 'Undo', accelerator: 'CmdOrCtrl+Z', role: 'undo' }, + { label: 'Redo', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, + { type: 'separator' }, + { label: 'Cut', accelerator: 'CmdOrCtrl+X', role: 'cut' }, + { label: 'Copy', accelerator: 'CmdOrCtrl+C', role: 'copy' }, + { label: 'Paste', accelerator: 'CmdOrCtrl+V', role: 'paste' }, + { label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectall' } + ] + }, { + label: 'Show', + submenu: [ + { + label: 'Wallets folder', + click: () => { + if (walletsFolder) { + shell.showItemInFolder(walletsFolder) + } else { + shell.showItemInFolder(path.join(app.getPath("home"), '.skycoin', 'wallets')); + } + }, + }, + { + label: 'Logs folder', + click: () => { + if (walletsFolder) { + shell.showItemInFolder(walletsFolder.replace('wallets', 'logs')) + } else { + shell.showItemInFolder(path.join(app.getPath("home"), '.skycoin', 'logs')); + } + }, + }, + { + label: 'DevTools', + accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', + click: (item, focusedWindow) => { + if (focusedWindow) { + focusedWindow.toggleDevTools(); + } + } + }, + ] + }]; + + Menu.setApplicationMenu(Menu.buildFromTemplate(template)); + + session + .fromPartition('') + .setPermissionRequestHandler((webContents, permission, callback) => { + return callback(false); + }); +} + +// Enforce single instance +const alreadyRunning = app.makeSingleInstance((commandLine, workingDirectory) => { + // Someone tried to run a second instance, we should focus our window. + if (win) { + if (win.isMinimized()) { + win.restore(); + } + win.focus(); + } else { + createWindow(currentURL); + } +}); + +if (alreadyRunning) { + app.quit(); + return; +} + +let walletsFolder = null; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', startSkycoin); + +app.on('skycoin-ready', (e) => { + if (win) { + win.loadURL(e.url); + } else { + createWindow(e.url); + } + + axios + .get(e.url + '/api/v1/wallets/folderName') + .then(response => { + walletsFolder = response.data.address; + //hwCode.setWalletsFolderPath(walletsFolder); + }) + .catch(() => {}); +}); + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + // On OS X it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (win === null) { + createWindow(currentURL); + } +}); + +app.on('will-quit', () => { + if (skycoin) { + skycoin.kill('SIGINT'); + } +}); + +app.on('web-contents-created', (event, contents) => { + contents.on('will-attach-webview', (event, webPreferences, params) => { + // Strip away preload scripts if unused or verify their location is legitimate + delete webPreferences.preload + delete webPreferences.preloadURL + + // Disable Node.js integration + webPreferences.nodeIntegration = false + + // Verify URL being loaded + if (!params.src.startsWith(url)) { + event.preventDefault(); + } + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/hardware-wallet.js b/vendor/github.com/SkycoinProject/skycoin/electron/src/hardware-wallet.js new file mode 100644 index 00000000..4050b76c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/hardware-wallet.js @@ -0,0 +1,249 @@ +// Code for using the hw wallet js library. Here only for precaution, should be deleted soon. +// If for some reason it have be reactivated, it should be checked, since due to various updates +// in the js library and the hw wallet firmware some parts could fail. Also, for reactivating it +// code should be uncommented in install-dependencies.sh and the package.son file must have the +// following dependency (probably updated to the lastest commit): +// "hardware-wallet-js": "git+https://git@github.com/skycoin/hardware-wallet-js.git#ddf7265" +// +// More changes could be needed in /src/gui/static/src/app/services/hw-wallet.service.ts + +/* +'use strict' + +const { ipcMain } = require('electron'); + +const deviceWallet = require('hardware-wallet-js/device-wallet'); + +const { Observable, of } = require('rxjs'); + +const HID = require('node-hid'); + +const fs = require('fs'); + +const path = require('path'); + +// Global reference of the window object. +let win; + +function setWinRef(winRef) { + win = winRef; +} + +let fullWalletsFilePath; +let walletsFilePath; +let getSavedWalletsDataSyncEvent; + +function setWalletsFolderPath(folderPath) { + fullWalletsFilePath = path.join(folderPath, 'hw.data'); + walletsFilePath = folderPath; + + if (getSavedWalletsDataSyncEvent) { + getSavedWalletsData(getSavedWalletsDataSyncEvent); + getSavedWalletsDataSyncEvent = undefined; + } +} + +deviceWallet.setDeviceType(deviceWallet.DeviceTypeEnum.USB); +ipcMain.on('hwCompatibilityActivated', (event) => { + event.returnValue = true; +}); + +let checkHwSubscription; +let hwConnected = false; + +function checkHw(wait) { + if (checkHwSubscription) { + checkHwSubscription.unsubscribe(); + } + + checkHwSubscription = Observable.of(1) + .delay(wait ? (hwConnected ? 2000 : 10000) : 0) + .subscribe( + () => { + const connected = HID.devices().find((d) => d.manufacturer === "SkycoinFoundation"); + if (connected && !hwConnected) { + hwConnected = true; + if (win) { + win.webContents.send('hwConnectionEvent', true); + } + } else if (!connected && hwConnected) { + hwConnected = false; + if (win) { + win.webContents.send('hwConnectionEvent', false); + } + } + checkHw(true); + } + ); +} + +checkHw(false); + +ipcMain.on('hwGetDeviceConnectedSync', (event) => { + event.returnValue = HID.devices().find((d) => d.manufacturer && d.manufacturer === "SkycoinFoundation") !== undefined; + checkHw(false); +}); + +ipcMain.on('hwGetSavedWalletsDataSync', (event) => { + if (fullWalletsFilePath) { + getSavedWalletsData(event); + } else { + getSavedWalletsDataSyncEvent = event; + } +}); + +function getSavedWalletsData(event) { + if (fs.existsSync(fullWalletsFilePath)) { + event.returnValue = fs.readFileSync(fullWalletsFilePath, 'utf8'); + } else { + event.returnValue = ''; + } +} + +ipcMain.on('hwSaveWalletsDataSync', (event, data) => { + if (!fs.existsSync(walletsFilePath)) { + fs.mkdirSync(walletsFilePath, { recursive: true }); + } + fs.writeFileSync(fullWalletsFilePath, data, 'utf8'); + event.returnValue = null; +}); + +let lastPinPromiseResolve; +let lastPinPromiseReject; + +const pinEvent = function() { + return new Promise((resolve, reject) => { + lastPinPromiseResolve = resolve; + lastPinPromiseReject = reject; + + console.log("Hardware wallet pin requested"); + if (win) { + win.webContents.send('hwPinRequested'); + } + }); +}; + +ipcMain.on('hwSendPin', (event, pin) => { + lastPinPromiseResolve(pin); +}); + +ipcMain.on('hwCancelPin', (event) => { + lastPinPromiseReject(new Error("Cancelled")) +}); + +let lastSeedWordPromiseResolve; +let lastSeedWordPromiseReject; + +const requestSeedWordEvent = function() { + return new Promise((resolve, reject) => { + lastSeedWordPromiseResolve = resolve; + lastSeedWordPromiseReject = reject; + + console.log("Hardware wallet seed word requested"); + if (win) { + win.webContents.send('hwSeedWordRequested'); + } + }); +}; + +ipcMain.on('hwSendSeedWord', (event, word) => { + if (word) { + lastSeedWordPromiseResolve(word); + } else { + lastSeedWordPromiseReject(new Error("Cancelled")) + } +}); + +ipcMain.on('hwCancelLastAction', (event, requestId) => { + const promise = deviceWallet.devCancelRequest(); + promise.then( + result => { console.log("Cancel promise resolved", result); event.sender.send('hwCancelLastActionResponse', requestId, ''); }, + error => { console.log("Cancel promise errored: ", error); event.sender.send('hwCancelLastActionResponse', requestId, ''); } + ); +}); + +ipcMain.on('hwGetFeatures', (event, requestId) => { + const promise = deviceWallet.devGetFeatures(); + promise.then( + result => { console.log("Features promise resolved", result); event.sender.send('hwGetFeaturesResponse', requestId, result); }, + error => { console.log("Features promise errored: ", error); event.sender.send('hwGetFeaturesResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwGetAddresses', (event, requestId, addressN, startIndex, confirm) => { + const promise = deviceWallet.devAddressGen(addressN, startIndex, confirm, pinEvent); + promise.then( + addresses => { console.log("Addresses promise resolved", addresses); event.sender.send('hwGetAddressesResponse', requestId, addresses); }, + error => { console.log("Addresses promise errored: ", error); event.sender.send('hwGetAddressesResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwChangePin', (event, requestId) => { + const promise = deviceWallet.devChangePin(pinEvent); + promise.then( + result => { console.log("Change pin promise resolved", result); event.sender.send('hwChangePinResponse', requestId, result); }, + error => { console.log("Change pin promise errored: ", error); event.sender.send('hwChangePinResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwGenerateMnemonic', (event, requestId, wordCount) => { + const promise = deviceWallet.devGenerateMnemonic(wordCount, false); + promise.then( + result => { console.log("Generate mnemonic promise resolved", result); event.sender.send('hwGenerateMnemonicResponse', requestId, result); }, + error => { console.log("Generate mnemonic promise errored: ", error); event.sender.send('hwGenerateMnemonicResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwRecoverMnemonic', (event, requestId, wordCount, dryRun) => { + const promise = deviceWallet.devRecoveryDevice(wordCount, false, requestSeedWordEvent, dryRun); + promise.then( + result => { console.log("Recover mnemonic promise resolved", result); event.sender.send('hwRecoverMnemonicResponse', requestId, result); }, + error => { console.log("Recover mnemonic promise errored: ", error); event.sender.send('hwRecoverMnemonicResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwBackupDevice', (event, requestId) => { + const promise = deviceWallet.devBackupDevice(pinEvent); + promise.then( + result => { console.log("Backup device promise resolved", result); event.sender.send('hwBackupDeviceResponse', requestId, result); }, + error => { console.log("Backup device promise errored: ", error); event.sender.send('hwBackupDeviceResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwWipe', (event, requestId) => { + const promise = deviceWallet.devWipeDevice(); + promise.then( + result => { console.log("Wipe promise resolved", result); event.sender.send('hwWipeResponse', requestId, result); }, + error => { console.log("Wipe promise errored: ", error); event.sender.send('hwWipeResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwSignMessage', (event, requestId, addressIndex, message) => { + const promise = deviceWallet.devSkycoinSignMessage(addressIndex, message, pinEvent); + promise.then( + result => { console.log("Signature promise resolved", result); event.sender.send('hwSignMessageResponse', requestId, result); }, + error => { console.log("Signature promise errored: ", error); event.sender.send('hwSignMessageResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwSignTransaction', (event, requestId, inputs, outputs) => { + const promise = deviceWallet.devSkycoinTransactionSign(inputs, outputs, pinEvent); + promise.then( + result => { console.log("Sign transaction promise resolved", result); event.sender.send('hwSignTransactionResponse', requestId, result); }, + error => { console.log("Sign transaction promise errored: ", error); event.sender.send('hwSignTransactionResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwChangeLabel', (event, requestId, label) => { + const promise = deviceWallet.devApplySettings(null, label, null, pinEvent); + promise.then( + result => { console.log("Change label promise resolved", result); event.sender.send('hwChangeLabelResponse', requestId, result); }, + error => { console.log("Change label promise errored: ", error); event.sender.send('hwChangeLabelResponse', requestId, { error: error.toString() }); } + ); +}); + +module.exports = { + setWinRef, + setWalletsFolderPath +} +*/ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/install-dependencies.sh b/vendor/github.com/SkycoinProject/skycoin/electron/src/install-dependencies.sh new file mode 100755 index 00000000..3fc0c861 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/install-dependencies.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +npm install + +# Code for compiling the hw wallet js library native dependencies. Here only for precaution, should be deleted soon. +# ./node_modules/.bin/electron-rebuild --only="node-hid" +# cd node_modules/hardware-wallet-js +# npm run make-protobuf-files +# cd ../.. \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/package-lock.json b/vendor/github.com/SkycoinProject/skycoin/electron/src/package-lock.json new file mode 100644 index 00000000..09f05271 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/package-lock.json @@ -0,0 +1,1544 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "requires": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-context-menu": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/electron-context-menu/-/electron-context-menu-0.9.1.tgz", + "integrity": "sha1-7U3yDAgEkcPJlqv8s2MVmUajgFg=", + "requires": { + "electron-dl": "^1.2.0", + "electron-is-dev": "^0.1.1" + } + }, + "electron-debug": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-1.5.0.tgz", + "integrity": "sha512-23CLHQXW+gMgdlJbeW1EinPX7DpwuLtfdzSuFL0OnsqEhKGJVJufAZTyq2hc3sr+R53rr3P+mJiYoR5VzAHKJQ==", + "requires": { + "electron-is-dev": "^0.3.0", + "electron-localshortcut": "^3.0.0" + }, + "dependencies": { + "electron-is-dev": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", + "integrity": "sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4=" + } + } + }, + "electron-dl": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-1.12.0.tgz", + "integrity": "sha512-UMc2CL45Ybpvu66LDPYzwmDRmYK4Ivz+wdnTM0eXcNMztvQwhixAk2UPme1c7McqG8bAlKEkQpZn3epmQy4EWg==", + "requires": { + "ext-name": "^5.0.0", + "pupa": "^1.0.0", + "unused-filename": "^1.0.0" + } + }, + "electron-is-accelerator": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", + "integrity": "sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns=" + }, + "electron-is-dev": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.1.2.tgz", + "integrity": "sha1-ihBD4ys6HaHD9VPc4oznZCRhZ+M=" + }, + "electron-localshortcut": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz", + "integrity": "sha512-MgL/j5jdjW7iA0R6cI7S045B0GlKXWM1FjjujVPjlrmyXRa6yH0bGSaIAfxXAF9tpJm3pLEiQzerYHkRh9JG/A==", + "requires": { + "debug": "^2.6.8", + "electron-is-accelerator": "^0.1.0", + "keyboardevent-from-electron-accelerator": "^1.1.0", + "keyboardevents-areequal": "^0.2.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "electron-rebuild": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.8.2.tgz", + "integrity": "sha512-EeR4dgb6NN7ybxduUWMeeLhU/EuF+FzwFZJfMJXD0bx96K+ttAieCXOn9lTO5nA9Qn3hiS7pEpk8pZ9StpGgSg==", + "dev": true, + "requires": { + "colors": "^1.2.0", + "debug": "^2.6.3", + "detect-libc": "^1.0.3", + "fs-extra": "^3.0.1", + "node-abi": "^2.0.0", + "node-gyp": "^3.6.0", + "ora": "^1.2.0", + "rimraf": "^2.6.1", + "spawn-rx": "^2.0.10", + "yargs": "^7.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "follow-redirects": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.1.tgz", + "integrity": "sha512-v9GI1hpaqq1ZZR6pBD1+kI7O24PhDvNGNodjS3MdcEqyrahCp8zbtpv+2B/krUnSmUH80lbAS7MrdeK5IylgKg==", + "requires": { + "debug": "^3.1.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + }, + "dependencies": { + "combined-stream": { + "version": "1.0.6", + "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + } + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keyboardevent-from-electron-accelerator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-1.1.0.tgz", + "integrity": "sha512-VDC4vKWGrR3VgIKCE4CsXnvObGgP8C2idnTKEMUkuEuvDGE1GEBX9FtNdJzrD00iQlhI3xFxRaeItsUmlERVng==" + }, + "keyboardevents-areequal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", + "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, + "requires": { + "mime-db": "~1.36.0" + }, + "dependencies": { + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "modify-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", + "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node-abi": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.4.tgz", + "integrity": "sha512-DQ9Mo2mf/XectC+s6+grPPRQ1Z9gI3ZbrGv6nyXRkjwT3HrE0xvtvrfnH7YHYBLgC/KLadg+h3XHnhZw1sv88A==", + "dev": true, + "requires": { + "semver": "^5.4.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "ora": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", + "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.0.1", + "log-symbols": "^2.1.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "pupa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-1.0.0.tgz", + "integrity": "sha1-mpVopa9+ZXuEYqbp1TKHQ1YM7/Y=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "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" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "requires": { + "sort-keys": "^1.0.0" + } + }, + "spawn-rx": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-2.0.12.tgz", + "integrity": "sha512-gOPXiQQFQ9lTOLuys0iMn3jfxxv9c7zzwhbYLOEbQGvEShHVJ5sSR1oD3Daj88os7jKArDYT7rbOKdvNhe7iEg==", + "dev": true, + "requires": { + "debug": "^2.5.1", + "lodash.assign": "^4.2.0", + "rxjs": "^5.1.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "spdx-correct": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.1.tgz", + "integrity": "sha512-hxSPZbRZvSDuOvADntOElzJpenIR7wXJkuoUcUtS0erbgt2fgeaoPIYretfKpslMhfFDY4k0MZ2F5CUzhBsSvQ==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unused-filename": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-1.0.0.tgz", + "integrity": "sha1-00CID3GuIRXrqhMlvvBcxmhEacY=", + "requires": { + "modify-filename": "^1.1.0", + "path-exists": "^3.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/package.json b/vendor/github.com/SkycoinProject/skycoin/electron/src/package.json new file mode 100644 index 00000000..a1979c0d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/package.json @@ -0,0 +1,14 @@ +{ + "main": "electron-main.js", + "license": "MIT", + "description": "skycoin wallet", + "dependencies": { + "axios": "^0.18.0", + "electron-context-menu": "^0.9.1", + "electron-debug": "^1.5.0", + "rxjs": "^5.5.12" + }, + "devDependencies": { + "electron-rebuild": "^1.8.2" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/splash/index.html b/vendor/github.com/SkycoinProject/skycoin/electron/src/splash/index.html new file mode 100644 index 00000000..546f99e8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/splash/index.html @@ -0,0 +1,44 @@ + + + + + + + + +
+
+ +
+ +
+
+
+ + diff --git a/vendor/github.com/SkycoinProject/skycoin/fiber.toml b/vendor/github.com/SkycoinProject/skycoin/fiber.toml new file mode 100644 index 00000000..c8ce5860 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/fiber.toml @@ -0,0 +1,149 @@ +# fiber configuration +# Defaults are shown, commented out +# Some values have no defaults and must be filled in +[node] +genesis_signature_str = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" +genesis_address_str = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" +blockchain_pubkey_str = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +blockchain_seckey_str = "" +genesis_timestamp = 1426562704 +# genesis_coin_volume = 100e12 +default_connections = [ + "139.162.121.185:6000", + "172.104.164.147:6000", + "139.162.248.183:6000", + "45.56.109.228:6000", + "173.230.130.174:6000", + "139.162.39.186:6000", + "45.33.111.142:6000", + "109.237.27.172:6000", + "172.104.41.14:6000" +] +peer_list_url = "https://downloads.skycoin.com/blockchain/peers.txt" +# port = 6000 +# web_interface_port = 6420 +# unconfirmed_burn_factor = 10 +# unconfirmed_max_transaction_size = 32 * 1024 +# unconfirmed_max_decimals = 3 +# create_block_burn_factor = 10 +# create_block_max_transaction_size = 32 * 1024 +# create_block_max_decimals = 3 +# max_block_transactions_size = 32 * 1024 +# display_name = "Skycoin" +# ticker = "SKY" +# coin_hours_display_name = "Coin Hours" +# coin_hours_display_name_singular = "Coin Hour" +# coin_hours_ticker = "SCH" +# explorer_url = "https://explorer.skycoin.com" +# bip44_coin = 8000 + +[params] +# max_coin_supply = 1e8 +# initial_unlocked_count = 25 +# unlock_address_rate = 5 +# unlock_time_interval = 60 * 60 * 24 * 365 +# user_max_decimals = 3 +# user_max_transaction_size = 32 * 1024 +# user_burn_factor = 10 +distribution_addresses = [ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", +] diff --git a/vendor/github.com/SkycoinProject/skycoin/iketheadore.asc b/vendor/github.com/SkycoinProject/skycoin/iketheadore.asc new file mode 100644 index 00000000..e92bb2cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/iketheadore.asc @@ -0,0 +1,14 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEXYCYPxYJKwYBBAHaRw8BAQdAeDPi3n9xLv5xGsxbcbwZjfV4h772W+GPZ3Mz +RS17STm0L2lrZXRoZWFkb3JlIHNreWNvaW4gPGx1eGFpcmxha2VAcHJvdG9ubWFp +bC5jb20+iJYEExYIAD4WIQSY+TTwT5M0uB36M5iRO71SBrGWIAUCXYCYPwIbAwUJ +B4TOAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCRO71SBrGWID0NAP0VRiNA +2Kq2uakPMqV29HY39DVhc9QgxJfMIwXWtFxKAwEAn0NqGRV/iKXNf+qxqAtMWa5X +F2S36hkEfDHO5W44DwC4OARdgJg/EgorBgEEAZdVAQUBAQdAeiEz/tUmCgOA67Rq +ANmHmX2vrdZp/SfJ9KOI2ANCCm8DAQgHiH4EGBYIACYWIQSY+TTwT5M0uB36M5iR +O71SBrGWIAUCXYCYPwIbDAUJB4TOAAAKCRCRO71SBrGWIJOJAQDTaqxpcLtAw5kH +Hp2jWvUnLudIONeqeUTCmkLJhcNv1wD+PFJZWMKD1btIG4pkXRW9YoA7M7t5by5O +x5I+LywZNww= +=p6Gq +-----END PGP PUBLIC KEY BLOCK----- diff --git a/vendor/github.com/SkycoinProject/skycoin/peers.txt b/vendor/github.com/SkycoinProject/skycoin/peers.txt new file mode 100644 index 00000000..8fd3feac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/peers.txt @@ -0,0 +1,13 @@ +118.178.135.93:6000 +139.162.33.154:6000 +45.63.21.232:6000 +172.105.210.184:6000 +139.162.39.186:6000 +45.33.111.142:6000 +109.237.27.172:6000 +172.104.41.14:6000 +139.162.121.185:6000 +172.104.164.147:6000 +139.162.248.183:6000 +45.56.109.228:6000 +173.230.130.174:6000 diff --git a/vendor/github.com/SkycoinProject/skycoin/run-client.sh b/vendor/github.com/SkycoinProject/skycoin/run-client.sh new file mode 100755 index 00000000..9d168042 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/run-client.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Runs skycoin in desktop client configuration + +set -x + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +echo "skycoin binary dir:" "$DIR" +pushd "$DIR" >/dev/null + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="${GOLDFLAGS} -X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +GORUNFLAGS=${GORUNFLAGS:-} + +go run -ldflags "${GOLDFLAGS}" $GORUNFLAGS cmd/skycoin/skycoin.go \ + -gui-dir="${DIR}/src/gui/static/" \ + -launch-browser=true \ + -enable-all-api-sets=true \ + -enable-gui=true \ + -log-level=debug \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/run-daemon.sh b/vendor/github.com/SkycoinProject/skycoin/run-daemon.sh new file mode 100755 index 00000000..5761eec6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/run-daemon.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +# Runs skycoin in daemon mode configuration + +set -x + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +echo "skycoin binary dir:" "$DIR" +pushd "$DIR" >/dev/null + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +GORUNFLAGS=${GORUNFLAGS:-} + +go run -ldflags "${GOLDFLAGS}" $GORUNFLAGS cmd/skycoin/skycoin.go \ + -enable-gui=false \ + -launch-browser=false \ + -log-level=debug \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/README.md b/vendor/github.com/SkycoinProject/skycoin/src/api/README.md new file mode 100644 index 00000000..1999f121 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/README.md @@ -0,0 +1,4528 @@ +# REST API Documentation + +API default service port is `6420`. However, if running the desktop or standalone releases from the website, the port is randomized by default. + +A REST API implemented in Go is available, +see [Skycoin REST API Client Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client). + +The API has two versions, `/api/v1` and `/api/v2`. + + + +- [API Version 1](#api-version-1) +- [API Version 2](#api-version-2) +- [API Sets](#api-sets) +- [Authentication](#authentication) +- [CSRF](#csrf) + - [Get current csrf token](#get-current-csrf-token) +- [General system checks](#general-system-checks) + - [Health check](#health-check) + - [Version info](#version-info) + - [Prometheus metrics](#prometheus-metrics) +- [Simple query APIs](#simple-query-apis) + - [Get balance of addresses](#get-balance-of-addresses) + - [Get unspent output set of address or hash](#get-unspent-output-set-of-address-or-hash) + - [Verify an address](#verify-an-address) +- [Wallet APIs](#wallet-apis) + - [Get wallet](#get-wallet) + - [Get unconfirmed transactions of a wallet](#get-unconfirmed-transactions-of-a-wallet) + - [Get wallets](#get-wallets) + - [Get wallet folder name](#get-wallet-folder-name) + - [Generate wallet seed](#generate-wallet-seed) + - [Verify wallet Seed](#verify-wallet-seed) + - [Create wallet](#create-wallet) + - [Generate new address in wallet](#generate-new-address-in-wallet) + - [Change wallet label](#change-wallet-label) + - [Get wallet balance](#get-wallet-balance) + - [Create transaction](#create-transaction) + - [Sign transaction](#sign-transaction) + - [Unload wallet](#unload-wallet) + - [Encrypt wallet](#encrypt-wallet) + - [Decrypt wallet](#decrypt-wallet) + - [Get wallet seed](#get-wallet-seed) + - [Recover encrypted wallet by seed](#recover-encrypted-wallet-by-seed) +- [Key-value storage APIs](#key-value-storage-apis) + - [Get all storage values](#get-all-storage-values) + - [Add value to storage](#add-value-to-storage) + - [Remove value from storage](#remove-value-from-storage) +- [Transaction APIs](#transaction-apis) + - [Get unconfirmed transactions](#get-unconfirmed-transactions) + - [Create transaction from unspent outputs or addresses](#create-transaction-from-unspent-outputs-or-addresses) + - [Get transaction info by id](#get-transaction-info-by-id) + - [Get raw transaction by id](#get-raw-transaction-by-id) + - [Inject raw transaction](#inject-raw-transaction) + - [Get transactions for addresses](#get-transactions-for-addresses) + - [Resend unconfirmed transactions](#resend-unconfirmed-transactions) + - [Verify encoded transaction](#verify-encoded-transaction) +- [Block APIs](#block-apis) + - [Get blockchain metadata](#get-blockchain-metadata) + - [Get blockchain progress](#get-blockchain-progress) + - [Get block by hash or seq](#get-block-by-hash-or-seq) + - [Get blocks in specific range](#get-blocks-in-specific-range) + - [Get last N blocks](#get-last-n-blocks) +- [Uxout APIs](#uxout-apis) + - [Get uxout](#get-uxout) + - [Get historical unspent outputs for an address](#get-historical-unspent-outputs-for-an-address) +- [Coin supply related information](#coin-supply-related-information) + - [Coin supply](#coin-supply) + - [Richlist show top N addresses by uxouts](#richlist-show-top-n-addresses-by-uxouts) + - [Count unique addresses](#count-unique-addresses) +- [Network status](#network-status) + - [Get information for a specific connection](#get-information-for-a-specific-connection) + - [Get a list of all connections](#get-a-list-of-all-connections) + - [Get a list of all default connections](#get-a-list-of-all-default-connections) + - [Get a list of all trusted connections](#get-a-list-of-all-trusted-connections) + - [Get a list of all connections discovered through peer exchange](#get-a-list-of-all-connections-discovered-through-peer-exchange) + - [Disconnect a peer](#disconnect-a-peer) +- [Migrating from the unversioned API](#migrating-from-the-unversioned-api) +- [Migrating from the JSONRPC API](#migrating-from-the-jsonrpc-api) +- [Migrating from /api/v1/spend](#migrating-from-apiv1spend) +- [Migration from /api/v1/explorer/address](#migration-from-apiv1exploreraddress) + + + +## API Version 1 + +`/api/v1` endpoints have no standard format. Most of them accept formdata in POST requests, +but a few accept `application/json` instead. Most of them return JSON but one or two +return a plaintext string. + +All endpoints will set an appropriate HTTP status code, using `200` for success and codes greater than or equal to `400` for error. + +`/api/v1` endpoints guarantee backwards compatibility. + +## API Version 2 + +*Note: API Version 2 is under development, and not stable. The guidelines here are subject to change.* + +`/api/v2` endpoints have a standard format. + +All `/api/v2` `POST` endpoints accept only `application/json` and return `application/json`. + +All `/api/v2` `GET` requires accept data in the query string. +In the future we may have choose to have `GET` requests also accept `POST` with a JSON body, +to support requests with a large query body, such as when requesting data for a large number +of addresses or transactions. + +`/api/v2` responses are always JSON. If there is an error, the JSON object will +look like this: + +```json +{ + "error": { + "code": 400, + "message": "bad arguments", + } +} +``` + +Response data will be included in a `"data"` field, which will always be a JSON object (not an array). + +Some endpoints may return both `"error"` and `"data"`. This will be noted in the documentation for that endpoint. + +All responses will set an appropriate HTTP status code indicating an error, and it will be equal to the value of `response["error"]["code"]`. + +Since `/api/v2` is still under development, there are no guarantees for backwards compatibility. +However, any changes to the API will be recorded in the [changelog](../../CHANGELOG.md). + +Under some circumstances an error response body may not be valid JSON. +Any client consuming the API should accomodate this and conditionally parse JSON for non-`200` responses. + +## API Sets + +API endpoints are grouped into "sets" which can be toggled with the command line parameters +`-enable-api-sets`, `-disable-api-sets` and `-enable-all-api-sets`. + +These API sets are: + +* `READ` - All query-related endpoints, they do not modify the state of the program +* `STATUS` - A subset of `READ`, these endpoints report the application, network or blockchain status +* `TXN` - Enables `/api/v1/injectTransaction` and `/api/v1/resendUnconfirmedTxns` without enabling wallet endpoints +* `WALLET` - These endpoints operate on local wallet files +* `PROMETHEUS` - This is the `/api/v2/metrics` method exposing in Prometheus text format the default metrics for Skycoin node application +* `NET_CTRL` - The `/api/v1/network/connection/disconnect` method, intended for network administration endpoints +* `INSECURE_WALLET_SEED` - This is the `/api/v1/wallet/seed` endpoint, used to decrypt and return the seed from an encrypted wallet. It is only intended for use by the desktop client. +* `STORAGE` - This is the `/api/v2/data` endpoint, used to interact with the key-value storage. + +## Authentication + +Authentication can be enabled with the `-web-interface-username` and `-web-interface-password` options. +The username and password should be provided in an `Authorization: Basic` header. + +Authentication can only be enabled when using HTTPS with `-web-interface-https`, unless `-web-interface-plaintext-auth` is enabled. + +## CSRF + +All `POST`, `PUT` and `DELETE` requests require a CSRF token, obtained with a `GET /api/v1/csrf` call. +The token must be placed in the `X-CSRF-Token` header. A token is only valid +for 30 seconds and it is expected that the client obtains a new CSRF token +for each request. Requesting a CSRF token invalidates any previous CSRF token. + +A request rejected for invalid or expired CSRF will respond with `403 Forbidden - invalid CSRF token` +as the response body. + +### Get current csrf token + +API sets: any + +``` +URI: /api/v1/csrf +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/csrf +``` + +Result: + +```json +{ + "csrf_token": "klSgXoMOFTvEnt8KptBvHjhlFnW0OIkzyFVn4i8frDvIus9iLsFukqA9sM9Rxf3pLZHRLr82vBQxTq50vbYA8g" +} +``` + +## General system checks + +### Health check + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/health +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/health +``` + +Response: + +```json +{ + "blockchain": { + "head": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "unspents": 38171, + "unconfirmed": 1, + "time_since_last_block": "4m46s" + }, + "version": { + "version": "0.25.0", + "commit": "8798b5ee43c7ce43b9b75d57a1a6cd2c1295cd1e", + "branch": "develop" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.25.0", + "open_connections": 8, + "outgoing_connections": 5, + "incoming_connections": 3, + "uptime": "6m30.629057248s", + "csrf_enabled": true, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": true, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 1542443907, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com", + "bip44_coin": 8000 + } +} +``` + +### Version info + +API sets: any + +``` +URI: /api/v1/version +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/version +``` + +Result: + +```json +{ + "version": "0.20.0", + "commit": "cc733e9922d85c359f5f183d3a3a6e42c73ccb16", + "branch": "develop" +} +``` + +### Prometheus metrics + +API sets: `PROMETHEUS` + +``` +URI: /api/v2/metrics +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v2/metrics +``` + +Result: + +``` +# HELP go_gc_duration_seconds A summary of the GC invocation durations. +# TYPE go_gc_duration_seconds summary +go_gc_duration_seconds{quantile="0"} 5.31e-05 +go_gc_duration_seconds{quantile="0.25"} 0.000158 +go_gc_duration_seconds{quantile="0.5"} 0.0001789 +go_gc_duration_seconds{quantile="0.75"} 0.0002216 +go_gc_duration_seconds{quantile="1"} 0.0005878 +go_gc_duration_seconds_sum 0.3881053 +go_gc_duration_seconds_count 1959 +# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 30 +# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. +# TYPE go_memstats_alloc_bytes gauge +go_memstats_alloc_bytes 2.862168e+06 +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 4.462792584e+09 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 1.794588e+06 +# HELP go_memstats_frees_total Total number of frees. +# TYPE go_memstats_frees_total counter +go_memstats_frees_total 4.7917586e+07 +# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. +# TYPE go_memstats_gc_sys_bytes gauge +go_memstats_gc_sys_bytes 2.392064e+06 +# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. +# TYPE go_memstats_heap_alloc_bytes gauge +go_memstats_heap_alloc_bytes 2.862168e+06 +# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. +# TYPE go_memstats_heap_idle_bytes gauge +go_memstats_heap_idle_bytes 6.0973056e+07 +# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. +# TYPE go_memstats_heap_inuse_bytes gauge +go_memstats_heap_inuse_bytes 5.087232e+06 +# HELP go_memstats_heap_objects Number of allocated objects. +# TYPE go_memstats_heap_objects gauge +go_memstats_heap_objects 16326 +# HELP go_memstats_heap_released_bytes_total Total number of heap bytes released to OS. +# TYPE go_memstats_heap_released_bytes_total counter +go_memstats_heap_released_bytes_total 0 +# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. +# TYPE go_memstats_heap_sys_bytes gauge +go_memstats_heap_sys_bytes 6.6060288e+07 +# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. +# TYPE go_memstats_last_gc_time_seconds gauge +go_memstats_last_gc_time_seconds 1.5366276699863462e+09 +# HELP go_memstats_lookups_total Total number of pointer lookups. +# TYPE go_memstats_lookups_total counter +go_memstats_lookups_total 0 +# HELP go_memstats_mallocs_total Total number of mallocs. +# TYPE go_memstats_mallocs_total counter +go_memstats_mallocs_total 4.7933912e+07 +# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. +# TYPE go_memstats_mcache_inuse_bytes gauge +go_memstats_mcache_inuse_bytes 6912 +# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. +# TYPE go_memstats_mcache_sys_bytes gauge +go_memstats_mcache_sys_bytes 16384 +# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. +# TYPE go_memstats_mspan_inuse_bytes gauge +go_memstats_mspan_inuse_bytes 76000 +# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. +# TYPE go_memstats_mspan_sys_bytes gauge +go_memstats_mspan_sys_bytes 180224 +# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. +# TYPE go_memstats_next_gc_bytes gauge +go_memstats_next_gc_bytes 5.576912e+06 +# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. +# TYPE go_memstats_other_sys_bytes gauge +go_memstats_other_sys_bytes 792284 +# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. +# TYPE go_memstats_stack_inuse_bytes gauge +go_memstats_stack_inuse_bytes 1.048576e+06 +# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. +# TYPE go_memstats_stack_sys_bytes gauge +go_memstats_stack_sys_bytes 1.048576e+06 +# HELP go_memstats_sys_bytes Number of bytes obtained by system. Sum of all system allocations. +# TYPE go_memstats_sys_bytes gauge +go_memstats_sys_bytes 7.2284408e+07 +# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 36.04 +# HELP process_max_fds Maximum number of open file descriptors. +# TYPE process_max_fds gauge +process_max_fds 1.048576e+06 +# HELP process_open_fds Number of open file descriptors. +# TYPE process_open_fds gauge +process_open_fds 15 +# HELP process_resident_memory_bytes Resident memory size in bytes. +# TYPE process_resident_memory_bytes gauge +process_resident_memory_bytes 4.9025024e+07 +# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.53662761869e+09 +# HELP process_virtual_memory_bytes Virtual memory size in bytes. +# TYPE process_virtual_memory_bytes gauge +process_virtual_memory_bytes 8.22317056e+08 +``` + + +## Simple query APIs + +### Get balance of addresses + +API sets: `READ` + +``` +URI: /api/v1/balance +Method: GET, POST +Args: + addrs: comma-separated list of addresses. must contain at least one address +``` + +Returns the cumulative and individual balances of one or more addresses. +The `POST` method can be used if many addresses need to be queried. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/balance?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq,2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6 +``` + +Result: + +```json +{ + "confirmed": { + "coins": 21000000, + "hours": 142744 + }, + "predicted": { + "coins": 21000000, + "hours": 142744 + }, + "addresses": { + "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + }, + "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD": { + "confirmed": { + "coins": 9000000, + "hours": 88075 + }, + "predicted": { + "coins": 9000000, + "hours": 88075 + } + }, + "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq": { + "confirmed": { + "coins": 12000000, + "hours": 54669 + }, + "predicted": { + "coins": 12000000, + "hours": 54669 + } + } + } +} +``` + +### Get unspent output set of address or hash + +API sets: `READ` + +``` +URI: /api/v1/outputs +Method: GET, POST +Args: + addrs: address list, joined with "," + hashes: hash list, joined with "," +``` + +Addrs and hashes cannot be combined. + +In the response, `"head_outputs"` are outputs in the current unspent output set, +`"outgoing_outputs"` are head outputs that are being spent by an unconfirmed transaction, +and `"incoming_outputs"` are outputs that will be created by an unconfirmed transaction. + +The current head block header is returned as `"head"`. + +The `POST` method can be used if many addresses or hashes need to be queried. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/outputs?addrs=6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY +``` + +or + +```sh +curl http://127.0.0.1:6420/api/v1/outputs?hashes=7669ff7350d2c70a88093431a7b30d3e69dda2319dcb048aa80fa0d19e12ebe0 +``` + +Result: + +```json +{ + "head": { + "seq": 58891, + "block_hash": "d9ca9442febd8788de0a3093158943beca228017bf8c9c9b8529a382fad8d991", + "previous_block_hash": "098ea5c6e12370c38529ef7c7c38779f83d05f707affb747022eee77332ba510", + "timestamp": 1537580414, + "fee": 2165, + "version": 0, + "tx_body_hash": "c488835c85ccb153a6d42b39aaae01c3e30d16de33de282f4b3f6fa1ccf6f7eb", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "head_outputs": [ + { + "hash": "7669ff7350d2c70a88093431a7b30d3e69dda2319dcb048aa80fa0d19e12ebe0", + "block_seq": 22, + "time": 1494275011, + "src_tx": "b51e1933f286c4f03d73e8966186bafb25f64053db8514327291e690ae8aafa5", + "address": "6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY", + "coins": "2.000000", + "hours": 633, + "calculated_hours": 10023 + }, + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} +``` + +### Verify an address + +API sets: `READ` + +``` +URI: /api/v2/address/verify +Method: POST +Content-Type: application/json +Args: {"address": "
"} +``` + +Parses and validates a Skycoin address. Returns the address version in the response. + +Error responses: + +* `400 Bad Request`: The request body is not valid JSON or the address is missing from the request body +* `422 Unprocessable Entity`: The address is invalid + +Example for a valid address: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/address/verify \ + -H 'Content-Type: application/json' \ + -d '{"address":"2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2"}' +``` + +Result: + +```json +{ + "data": { + "version": 0, + } +} +``` + +Example for an invalid address: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/address/verify \ + -H 'Content-Type: application/json' \ + -d '{"address":"2aTnQe3ZupkG6k8S81brNC3JycGV2Em71F2"}' +``` + +Result: + +```json +{ + "error": { + "message": "Invalid checksum", + "code": 422 + } +} +``` + +## Wallet APIs + +### Get wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet +Method: GET +Args: + id: Wallet ID [required] +``` + +Example ("deterministic" wallet): + +```sh +curl http://127.0.0.1:6420/api/v1/wallet?id=2017_11_25_e5fb.wlt +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + }, + { + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3" + } + ] +} +``` + +Example ("bip44" wallet): + +```sh +curl http://127.0.0.1:6420/api/v1/wallet?id=2017_11_25_e5fb.wlt +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "bip44", + "version": "0.3", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false, + "bip44_coin": 8000, + }, + "entries": [ + { + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0, + "change": 0 + }, + { + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3", + "child_number": 1, + "change": 0 + }, + { + "address": "8C5icxR9zdkYTZZTVV3cCX7QoK4EkLuK4p", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0, + "change": 1 + } + ] +} +``` + + +### Get unconfirmed transactions of a wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/transactions +Method: GET +Args: + id: Wallet ID + verbose: [bool] include verbose transaction input data +``` + +Returns all unconfirmed transactions for all addresses in a given wallet + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are based upon the current system time, and are approximately +equal to the hours the output would have if it become confirmed immediately. + + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/transactions?id=2017_11_25_e5fb.wlt +``` + +Result: + +```json +{ + "transactions": [ + { + "transaction": { + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "inputs": [ + "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91" + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + }, + "received": "2018-03-16T18:03:57.139109904+05:30", + "checked": "2018-03-16T18:03:57.139109904+05:30", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } + ] +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/transactions?id=2017_11_25_e5fb.wlt&verbose=1 +``` + +Result: + +```json +{ + "transactions": [ + { + "transaction": { + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "fee": 495076, + "inputs": [ + { + "uxid": "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "owner": "8C5icxR9zdkYTZZTVV3cCX7QoK4EkLuK4p", + "coins": "997.000000", + "hours": 880000, + "calculated_hours": 990000 + }, + { + "uxid": "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91", + "owner": "23A1EWMZopUFLCwtXMe2CU9xTCbi5Gth643", + "coins": "2.000000", + "hours": 10, + "calculated_hours": 152 + } + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + }, + "received": "2018-03-16T18:03:57.139109904+05:30", + "checked": "2018-03-16T18:03:57.139109904+05:30", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } + ] +} +``` + +### Get wallets + +API sets: `WALLET` + +``` +URI: /api/v1/wallets +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallets +``` + +Result: + +```json +[ + { + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "8C5icxR9zdkYTZZTVV3cCX7QoK4EkLuK4p", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + }, + { + "address": "23A1EWMZopUFLCwtXMe2CU9xTCbi5Gth643", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3" + } + ] + } +] +``` + +### Get wallet folder name + +API sets: `WALLET` + +``` +URI: /api/v1/wallets/folderName +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallets/folderName +``` + +Result: + +```json +{ + "address": "/Users/user/.skycoin/wallets" +} +``` + +### Generate wallet seed + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/newSeed +Method: GET +Args: + entropy: seed entropy [optional] + can either be 128 or 256; 128 = 12 word seed, 256 = 24 word seed + default: 128 +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/newSeed +``` + +Result: + +```json +{ + "seed": "helmet van actor peanut differ icon trial glare member cancel marble rack" +} +``` + +### Verify wallet Seed + +API sets: `WALLET` + +``` +URI: /api/v2/wallet/seed/verify +Method: POST +Args: + seed: seed to be verified +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/seed/verify \ + -H 'Content-type: application/json' \ + -d '{ "seed": "nut wife logic sample addict shop before tobacco crisp bleak lawsuit affair" }' +``` + +Result: + +```json +{ + "data": {} +} +``` + +Example (wrong bip39 seed): + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/seed/verify \ + -H 'Content-type: application/json' \ + -d '{ "seed": "wrong seed" }' +``` + +Result: + +```json +{ + "error": { + "message": "Mnemonic must have 12, 15, 18, 21 or 24 words", + "code": 422 + } +} +``` + +### Create wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/create +Method: POST +Args: + seed: wallet seed [required] + seed-passphrase: wallet seed passphrase [optional, bip44 type wallet only] + type: wallet type [required, one of "deterministic", "bip44" or "xpub"] + bip44-coin: BIP44 coin type [optional, defaults to 8000 (skycoin's coin type), only valid if type is "bip44"] + xpub: xpub key [required for xpub wallets] + label: wallet label [required] + scan: the number of addresses to scan ahead for balances [optional, must be > 0] + encrypt: encrypt wallet [optional, bool value] + password: wallet password [optional, must be provided if encrypt is true] +``` + +Example (deterministic): + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/create \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'seed=$seed' \ + -d 'type=deterministic' \ + -d 'label=$label' \ + -d 'scan=5' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_05_09_d554.wlt", + "label": "test", + "type": "deterministic", + "version": "0.3", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "y2JeYS4RS8L9GYM7UKdjLRyZanKHXumFoH", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + } + ] +} +``` + +Example (bip44): + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/create \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'seed=$seed' \ + -d 'seed-passphrase=$seed' \ + -d 'type=bip44' \ + -d 'label=$label' \ + -d 'scan=5' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_05_09_d554.wlt", + "label": "test", + "type": "bip44", + "version": "0.3", + "crypto_type": "scrypt-chacha20poly1305", + "timestamp": 1511640884, + "encrypted": true, + "bip44_coin": 8000, + }, + "entries": [ + { + "address": "y2JeYS4RS8L9GYM7UKdjLRyZanKHXumFoH", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0, + "change": 0 + } + ] +} +``` + +Example (xpub): + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/create \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'type=xpub' \ + -d 'xpub=xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8' \ + -d 'label=$label' \ + -d 'scan=5' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_05_09_d554.wlt", + "label": "test", + "type": "bip44", + "version": "0.4", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false, + "xpub": "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8" + }, + "entries": [ + { + "address": "y2JeYS4RS8L9GYM7UKdjLRyZanKHXumFoH", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0 + } + ] +} +``` + +### Generate new address in wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/newAddress +Method: POST +Args: + id: wallet file name + num: the number you want to generate + password: wallet password +``` + +For `bip44` type wallets, the new addresses will be generated on the `external` chain (`change=0`). + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/newAddress \ + -H 'Content-Type: x-www-form-urlencoded' \ + -d 'id=2017_05_09_d554.wlt' \ + -d 'num=2' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "addresses": [ + "TDdQmMgbEVTwLe8EAiH2AoRc4SjoEFKrHB" + ] +} +``` + +### Change wallet label + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/update +Method: POST +Args: + id: wallet file name + label: wallet label +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/update \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'id=$id' \ + -d 'label=$label' +``` + +Result: + +```json +"success" +``` + +### Get wallet balance + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/balance +Method: GET +Args: + id: wallet file name +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/balance?id=2018_03_07_3088.wlt +``` + +Result: + +```json +{ + "confirmed": { + "coins": 210400000, + "hours": 1873147 + }, + "predicted": { + "coins": 210400000, + "hours": 1873147 + }, + "addresses": { + "AXrFisGovRhRHipsbGahs4u2hXX7pDRT5p": { + "confirmed": { + "coins": 1250000, + "hours": 941185 + }, + "predicted": { + "coins": 1250000, + "hours": 941185 + } + }, + "AtNorKBpCgkSRL7zES7aAQyNjqjqPp2QJU": { + "confirmed": { + "coins": 1150000, + "hours": 61534 + }, + "predicted": { + "coins": 1150000, + "hours": 61534 + } + }, + "VUv9ehMZWmDvwWV36BQ3eL1ujb4MQ5TGyK": { + "confirmed": { + "coins": 208000000, + "hours": 870428 + }, + "predicted": { + "coins": 208000000, + "hours": 870428 + } + }, + "j4mbF1fTe8jgXbrRARZSBjDpD1hMGSe1E4": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + }, + "uyqBPcRCWucHXs18e9VZyNEeuNsD5tFDhy": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} +``` + +### Create transaction + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/transaction +Method: POST +Content-Type: application/json +Args: JSON body, see examples +``` + +Creates a transaction, returning the transaction preview and the encoded, serialized transaction. +The `encoded_transaction` can be provided to `POST /api/v1/injectTransaction` to broadcast it to the network +if the transaction is fully signed. + +The request body includes: + +* An optional change address +* A wallet to spend from with the optional ability to restrict which addresses or which unspent outputs in the wallet to use +* A list of destinations with address and coins specified, as well as optionally specifying hours +* A configuration for how destination hours are distributed, either manual or automatic +* Additional options + +`change_address` is optional. If not provided and the wallet is a `deterministic` type +wallet, then the change address will default to an address from one of the +unspent outputs being spent as a transaction input. If the wallet is a `bip44` type +wallet, then a new, unused change address will be created. + +Example request body with manual hours selection type, unencrypted wallet and all wallet addresses may spend: + +```json +{ + "hours_selection": { + "type": "manual" + }, + "wallet_id": "foo.wlt", + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032", + "hours": "7" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2", + "hours": "0" + }], + "unsigned": false, + "ignore_unconfirmed": false +} +``` + +Example request body with auto hours selection type, encrypted wallet, specified spending addresses: + +```json +{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "wallet_id": "foo.wlt", + "password": "foobar", + "addresses": ["2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc"], + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2" + }], + "unsigned": false, + "ignore_unconfirmed": false +} +``` + +Example request body with manual hours selection type, unencrypted wallet and spending specific unspent outputs: + +```json +{ + "hours_selection": { + "type": "manual" + }, + "wallet_id": "foo.wlt", + "unspents": ["519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85"], + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032", + "hours": "7" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2", + "hours": "0" + }], + "unsigned": false, + "ignore_unconfirmed": false +} +``` + + +The `hours_selection` field has two types: `manual` or `auto`. + +If `manual`, all destination hours must be specified. + +If `auto`, the `mode` field must be set. The only valid value for `mode` is `"share"`. +For the `"share"` mode, `share_factor` must also be set. This must be a decimal value greater than or equal to 0 and less than or equal to 1. +In the auto share mode, the remaining hours after the fee are shared between the destination addresses as a whole, +and the change address. Amongst the destination addresses, the shared hours are distributed proportionally. + +When using the `auto` `"share"` `mode`, if there are remaining coin hours as change, +but no coins are available as change from the wallet (which are needed to retain the coin hours as change), +the `share_factor` will switch to `1.0` so that extra coin hours are distributed to the outputs +instead of being burned as an additional fee. +For the `manual` mode, if there are leftover coin hours but no coins to make change with, +the leftover coin hours will be burned in addition to the required fee. + +All objects in `to` must be unique; a single transaction cannot create multiple outputs with the same `address`, `coins` and `hours`. + +For example, this is a valid value for `to`, if `hours_selection.type` is `"manual"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "1" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "2" +}] +``` + +But this is an invalid value for `to`, if `hours_selection.type` is `"manual"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "1" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "1" +}] +``` + +And this is a valid value for `to`, if `hours_selection.type` is `"auto"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.201" +}] +``` + +But this is an invalid value for `to`, if `hours_selection.type` is `"auto"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2" +}] +``` + +To control which addresses to spend from, specify `addresses`. +A subset of the unspent outputs associated with these addresses will be chosen for spending, +based upon an internal selection algorithm. + +To control which unspent outputs to spend from, specify `unspents`. +A subset of these unspent outputs will be chosen for spending, +based upon an internal selection algorithm. + +`addresses` and `unspents` cannot be combined. + +If neither `addresses` nor `unspents` are specified, +then all outputs associated with all addresses in the wallet may be chosen from to spend with. + +`change_address` is optional. +If set, it is not required to be an address in the wallet. +If not set, it will default to one of the addresses associated with the unspent outputs being spent in the transaction. + +`ignore_unconfirmed` is optional and defaults to `false`. +When `false`, the API will return an error if any of the unspent outputs +associated with the wallet addresses or the wallet outputs appear as spent in +a transaction in the unconfirmed transaction pool. +When `true`, the API will ignore unspent outputs that appear as spent in +a transaction in the unconfirmed transaction pool when building the transaction, +but not return an error. + +`unsigned` is optional and defaults to `false`. +When `true`, the transaction will not be signed by the wallet. +An unsigned transaction will be returned. +The `"txid"` value of the `"transaction"` object will need to be updated +after signing the transaction. +The unsigned `encoded_transaction` can be sent to `POST /api/v2/wallet/transaction/sign` for signing. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/transaction -H 'content-type: application/json' -d '{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "wallet_id": "foo.wlt", + "change_address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "to": [{ + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1" + }, { + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.99" + }] +}' +``` + +Result: + +```json +{ + "transaction": { + "length": 257, + "type": 0, + "txid": "5f060918d2da468a784ff440fbba80674c829caca355a27ae067f465d0a5e43e", + "inner_hash": "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + "fee": "437691", + "sigs": [ + "6120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100" + ], + "inputs": [ + { + "uxid": "7068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b", + "address": "g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", + "coins": "10.000000", + "hours": "853667", + "calculated_hours": "862290", + "timestamp": 1524242826, + "block": 23575, + "txid": "ccfbb51e94cb58a619a82502bc986fb028f632df299ce189c2ff2932574a03e7" + } + ], + "outputs": [ + { + "uxid": "519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1.000000", + "hours": "22253" + }, + { + "uxid": "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.990000", + "hours": "200046" + }, + { + "uxid": "fdeb3f77408f39e50a8e3b6803ce2347aac2eba8118c494424f9fa4959bab507", + "address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "0.010000", + "hours": "222300" + } + ] + }, + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" +} +``` + + +### Sign transaction + +API sets: `WALLET` + +``` +URI: /api/v2/wallet/transaction/sign +Method: POST +Content-Type: application/json +Args: JSON body, see examples +``` + +Signs an unsigned transaction, returning the transaction with updated signatures and the encoded, serialized transaction. +The transaction must spendable to be signed. If the inputs of the transaction are not in the unspent pool, signing fails. + +Specific transaction inputs may be signed by specifying `sign_indexes`, otherwise all transaction inputs will be signed. +`sign_indexes` is an array of positional indexes for the transaction's signature array. Indexes start at 0. + +Signing an input that is already signed in the transaction is an error. + +The `encoded_transaction` can be provided to `POST /api/v1/injectTransaction` to broadcast it to the network, if the transaction is fully signed. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/transaction/sign -H 'content-type: application/json' -d '{ + "wallet_id": "foo.wlt", + "password": "password", + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" +}' +``` + +Example with `sign_indexes`: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/transaction/sign -H 'content-type: application/json' -d '{ + "wallet_id": "foo.wlt", + "password": "password", + "sign_indexes": [1, 2], + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" +}' +``` + +Result: + +```json +{ + "data": { + "transaction": { + "length": 257, + "type": 0, + "txid": "5f060918d2da468a784ff440fbba80674c829caca355a27ae067f465d0a5e43e", + "inner_hash": "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + "fee": "437691", + "sigs": [ + "6120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100" + ], + "inputs": [ + { + "uxid": "7068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b", + "address": "g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", + "coins": "10.000000", + "hours": "853667", + "calculated_hours": "862290", + "timestamp": 1524242826, + "block": 23575, + "txid": "ccfbb51e94cb58a619a82502bc986fb028f632df299ce189c2ff2932574a03e7" + } + ], + "outputs": [ + { + "uxid": "519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1.000000", + "hours": "22253" + }, + { + "uxid": "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.990000", + "hours": "200046" + }, + { + "uxid": "fdeb3f77408f39e50a8e3b6803ce2347aac2eba8118c494424f9fa4959bab507", + "address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "0.010000", + "hours": "222300" + } + ] + }, + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" + } +} +``` + + +### Unload wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/unload +Method: POST +Args: + id: wallet file name +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/unload \ + -H 'Content-Type: x-www-form-urlencoded' \ + -d 'id=2017_05_09_d554.wlt' +``` + +### Encrypt wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/encrypt +Method: POST +Args: + id: wallet id + password: wallet password +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/encrypt \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'id=test.wlt' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "test.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "scrypt-chacha20poly1305", + "timestamp": 1521083044, + "encrypted": true + }, + "entries": [ + { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + } + ] +} +``` + +### Decrypt wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/decrypt +Method: POST +Args: + id: wallet id + password: wallet password +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/decrypt \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'id=test.wlt' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "test.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1521083044, + "encrypted": false + }, + "entries": [ + { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "public_key": "032a1218cbafc8a93233f363c19c667cf02d42fa5a8a07c0d6feca79e82d72753d" + } + ] +} +``` + +### Get wallet seed + +API sets: `INSECURE_WALLET_SEED` + +``` +URI: /api/v1/wallet/seed +Method: POST +Args: + id: wallet id + password: wallet password +``` + +This endpoint only works for encrypted wallets. +If the wallet is unencrypted, the seed will not be returned. + +If the wallet is of type `bip44` and has a seed passphrase, it will be included +in the response. Otherwise, the seed passphrase will be missing. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/seed \ + -H 'Content-type: application/x-www-form-urlencoded' \ + -d 'id=test.wlt' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "seed": "your wallet seed", + "seed_passphrase": "your optional wallet seed-passphrase" +} +``` + +### Recover encrypted wallet by seed + +API sets: `INSECURE_WALLET_SEED` + +``` +URI: /api/v2/wallet/recover +Method: POST +Args: + id: wallet id + seed: wallet seed + seed passphrase: wallet seed passphrase (bip44 wallets only) + password: [optional] password to encrypt the recovered wallet with +``` + +Recovers an encrypted wallet by providing the wallet seed and optional seed passphrase. + +Example: + +```sh +curl -X POST http://127.0.0.1/api/v2/wallet/recover + -H 'Content-Type: application/json' \ + -d '{"id":"2017_11_25_e5fb.wlt","seed":"your wallet seed","seed_passphrase":"your seed passphrase"}' +``` + +Result: + +```json +{ + "data": { + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + }, + { + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3" + } + ] + } +} +``` + +## Key-value storage APIs + +Endpoints interact with the key-value storage. Each request require the `type` argument to +be passed. + +Currently allowed types: + +* `txid`: used for transaction notes +* `client`: used for generic client data, instead of using e.g. LocalStorage in the browser + +### Get all storage values + +API sets: `STORAGE` + +``` +Method: GET +URI: /api/v2/data +Args: + type: storage type + key [string]: key of the specific value to get +``` + +If key is passed, only the specific value will be returned from the storage. +Otherwise the whole dataset will be returned. + +If the key does not exist, a 404 error is returned. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v2/data?type=txid +``` + +Result: + +```json +{ + "data": { + "key1": "value", + "key2": "{\"key\":\"value\"}", + } +} +``` + +Example (key): + +```sh +curl http://127.0.0.1:6420/api/v2/data?type=txid&key=key1 +``` + +Result: + +```json +{ + "data": "value" +} +``` + +### Add value to storage + +API sets: `STORAGE` + +``` +Method: POST +URI: /api/v2/data +Args: JSON Body, see examples +``` + +Sets one or more values by key. Existing values will be overwritten. + +Example request body: + +```json +{ + "type": "txid", + "key": "key1", + "val": "val1" +} +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/data -H 'Content-Type: application/json' -d '{ + "type": "txid", + "key": "key1", + "val": "val1" +}' +``` + +Result: + +```json +{} +``` + +### Remove value from storage + +API sets: `STORAGE` + +``` +Method: DELETE +URI: /api/v2/data +Args: + type: storage type + key: key of the specific value to get +``` + +Deletes a value by key. Returns a 404 error if the key does not exist. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v2/data?type=txid&key=key1 +``` + +Result: + +```json +{} +``` + +## Transaction APIs + +### Get unconfirmed transactions + +API sets: `READ` + +``` +URI: /api/v1/pendingTxs +Method: GET +Args: + verbose [bool] include verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are calculated based upon the current system time, and provide an approximate +coin hour value of the output if it were to be confirmed at that instant. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/pendingTxs +``` + +Result: + +```json +[ + { + "transaction": { + "length": 317, + "type": 0, + "txid": "89578005d8730fe1789288ee7dea036160a9bd43234fb673baa6abd91289a48b", + "inner_hash": "cac977eee019832245724aa643ceff451b9d8b24612b2f6a58177c79e8a4c26f", + "sigs": [ + "3f084a0c750731dd985d3137200f9b5fc3de06069e62edea0cdd3a91d88e56b95aff5104a3e797ab4d6d417861af0c343efb0fff2e5ba9e7cf88ab714e10f38101", + "e9a8aa8860d189daf0b1dbfd2a4cc309fc0c7250fa81113aa7258f9603d19727793c1b7533131605db64752aeb9c1f4465198bb1d8dd597213d6406a0a81ed3701" + ], + "inputs": [ + "bb89d4ed40d0e6e3a82c12e70b01a4bc240d2cd4f252cfac88235abe61bd3ad0", + "170d6fd7be1d722a1969cb3f7d45cdf4d978129c3433915dbaf098d4f075bbfc" + ], + "outputs": [ + { + "uxid": "ec9cf2f6052bab24ec57847c72cfb377c06958a9e04a077d07b6dd5bf23ec106", + "dst": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "coins": "60.000000", + "hours": 2458 + }, + { + "uxid": "be40210601829ba8653bac1d6ecc4049955d97fb490a48c310fd912280422bd9", + "dst": "2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc", + "coins": "1.000000", + "hours": 2458 + } + ] + }, + "received": "2017-05-09T10:11:57.14303834+02:00", + "checked": "2017-05-09T10:19:58.801315452+02:00", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } +] +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/pendingTxs?verbose=1 +``` + +Result: + +```json +[ + { + "transaction": { + "length": 220, + "type": 0, + "txid": "d455564dcf1fb666c3846cf579ff33e21c203e2923938c6563fe7fcb8573ba44", + "inner_hash": "4e73155db8ed04a3bd2b953218efcc9122ebfbf4c55f08f50d1563e48eacf71d", + "fee": 12855964, + "sigs": [ + "17330c256a50e2117ddccf51f1980fc14380f0f9476432196ade3043668759847b97e1b209961458745684d9239541f79d9ca9255582864d30a540017ab84f2b01" + ], + "inputs": [ + { + "uxid": "27e7bc48ceca4d47e806a87100a8a98592b7618702e1cd479bf4c190462a6d09", + "owner": "23MjQipM9YsPKkYiuaBmf6m7fD54wrzHxpd", + "coins": "7815.000000", + "hours": 279089, + "calculated_hours": 13101146 + } + ], + "outputs": [ + { + "uxid": "4b4ebf62acbaece798d0dfc92fcea85768a2874dad8a9b8eb5454288deae468c", + "dst": "23MjQipM9YsPKkYiuaBmf6m7fD54wrzHxpd", + "coins": "586.000000", + "hours": 122591 + }, + { + "uxid": "781cfb134d5fdad48f3c937dfcfc66b169a305adc8abdfe92a0ec94c564913f2", + "dst": "2ehrG4VKLRuvBNWYz3U7tS75QWvzyWR89Dg", + "coins": "7229.000000", + "hours": 122591 + } + ] + }, + "received": "2018-06-20T14:14:52.415702671+08:00", + "checked": "2018-08-26T19:47:45.328131142+08:00", + "announced": "2018-08-26T19:51:47.356083569+08:00", + "is_valid": true + } +] +``` + +### Create transaction from unspent outputs or addresses + +API sets: `TXN` + +``` +URI: /api/v2/transaction +Method: POST +Args: JSON Body, see examples +``` + +Creates an unsigned transaction from a pool of unspent outputs or addresses. +`addresses` and `unspents` cannot be combined, and at least one must have elements in their array. + +The transaction will choose unspent outputs from the provided pool to construct a transaction +that satisfies the requested outputs in the `to` field. Not all unspent outputs will necessarily be used +in the transaction. + +If `ignore_unconfirmed` is true, the transaction will not use any outputs which are being spent by an unconfirmed transaction. +If `ignore_unconfirmed` is false, the endpoint returns an error if any unspent output is spent by an unconfirmed transaction. + +`change_address` is optional. If not provided then the change address will +default to an address from one of the +unspent outputs being spent as a transaction input. + +Refer to `POST /api/v1/wallet/transaction` for creating a transaction from a specific wallet. + +`POST /api/v2/wallet/transaction/sign` can be used to sign the transaction with a wallet, +but `POST /api/v1/wallet/transaction` can create and sign a transaction with a wallet in one operation instead. +Otherwise, sign the transaction separately from the API. + +The transaction must be fully valid and spendable (except for the lack of signatures) or else an error is returned. + +Example request body with manual hours selection type, spending from specific addresses, ignoring unconfirmed unspent outputs: + +```json +{ + "hours_selection": { + "type": "manual" + }, + "addresses": ["g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS"], + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032", + "hours": "7" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2", + "hours": "0" + }], + "ignore_unconfirmed": false +} +``` + +Example request body with auto hours selection type, spending specific uxouts: + +```json +{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "unspents": ["519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85"], + "change_address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "to": [{ + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1" + }, { + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.99" + }] +} +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/transaction -H 'Content-Type: application/json' -d '{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "addresses": ["g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp"], + "change_address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "to": [{ + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1" + }, { + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.99" + }] +}' +``` + +Result: + +```json +{ + "data": { + "transaction": { + "length": 257, + "type": 0, + "txid": "5f060918d2da468a784ff440fbba80674c829caca355a27ae067f465d0a5e43e", + "inner_hash": "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + "fee": "437691", + "sigs": [ + "6120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100" + ], + "inputs": [ + { + "uxid": "7068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b", + "address": "g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", + "coins": "10.000000", + "hours": "853667", + "calculated_hours": "862290", + "timestamp": 1524242826, + "block": 23575, + "txid": "ccfbb51e94cb58a619a82502bc986fb028f632df299ce189c2ff2932574a03e7" + } + ], + "outputs": [ + { + "uxid": "519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1.000000", + "hours": "22253" + }, + { + "uxid": "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.990000", + "hours": "200046" + }, + { + "uxid": "fdeb3f77408f39e50a8e3b6803ce2347aac2eba8118c494424f9fa4959bab507", + "address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "0.010000", + "hours": "222300" + } + ] + }, + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" + } +} +``` + +### Get transaction info by id + +API sets: `READ` + +``` +URI: /api/v1/transaction +Method: GET +Args: + txid: transaction id + verbose: [bool] include verbose transaction input data + encoded: [bool] return the transaction as hex-encoded serialized bytes +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +If the transaction is confirmed, the calculated hours are the hours the transaction had in the block in which it was executed.. +If the transaction is unconfirmed, the calculated hours are based upon the current system time, and are approximately +equal to the hours the output would have if it become confirmed immediately. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/transaction?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3 +``` + +Result: + +```json +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 1178 + }, + "txn": { + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "timestamp": 1494275231, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191" + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/transaction?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3&verbose=1 +``` + +Result: + +```json +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53107, + "block_seq": 1178 + }, + "time": 1494275231, + "txn": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53107, + "block_seq": 1178 + }, + "timestamp": 1494275231, + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "fee": 6523, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454, + "calculated_hours": 7454 + } + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } +} +``` + +Example (encoded): + +```sh +curl http://127.0.0.1:6420/api/v1/transaction?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3&encoded=1 +``` + +Result: + +```json +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53267, + "block_seq": 1178 + }, + "time": 1494275231, + "encoded_transaction": "b700000000075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e010000009b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00010000005287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191010000000010722f061aa262381dce35193d43eceb112373c300127a0000000000a303000000000000" +} +``` + +### Get raw transaction by id + +API sets: `READ` + +``` +URI: /api/v1/rawtx +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/rawtx?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3 +``` + +Result: + +```json +"b700000000075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e010000009b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00010000005287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191010000000010722f061aa262381dce35193d43eceb112373c300127a0000000000a303000000000000" +``` + +### Inject raw transaction + +API sets: `TXN`, `WALLET` + +``` +URI: /api/v1/injectTransaction +Method: POST +Content-Type: application/json +Body: {"rawtx": "hex-encoded serialized transaction string"} +Errors: + 400 - Bad input + 500 - Other + 503 - Network unavailable (transaction failed to broadcast) +``` + +Broadcasts a hex-encoded, serialized transaction to the network. +Transactions are serialized with the `encoder` package. +See [`coin.Transaction.Serialize`](https://godoc.org/github.com/SkycoinProject/skycoin/src/coin#Transaction.Serialize). + +If there are no available connections, the API responds with a `503 Service Unavailable` error. + +Note that in some circumstances the transaction can fail to broadcast but this endpoint will still return successfully. +This can happen if the node's network has recently become unavailable but its connections have not timed out yet. + +The recommended way to handle transaction injections from your system is to inject the transaction then wait +for the transaction to be confirmed. Transactions typically confirm quickly, so if it is not confirmed after some +timeout such as 1 minute, the application can continue to retry the broadcast with `/api/v1/resendUnconfirmedTxns`. +Broadcast only fails without an error if the node's peers disconnect or timeout after the broadcast was initiated, +which is a network problem that may recover, so rebroadcasting with `/api/v1/resendUnconfirmedTxns` will resolve it, +or else the network is unavailable. + +`POST /api/v1/transaction` accepts an `ignore_unconfirmed` option to allow transactions to be created without waiting +for unconfirmed transactions to confirm. + +Any unconfirmed transactions found in the database at startup are resent. So, if the network broadcast failed but +the transaction was saved to the database, when you restart the client, it will resend. + +It is safe to retry the injection after a `503` failure. + +To disable the network broadcast, add `"no_broadcast": true` to the JSON request body. +The transaction will be added to the local transaction pool but not be broadcast at the same time. +Note that transactions from the pool are periodically announced, so this transaction will still +be announced eventually if the daemon continues running with connectivity for enough time. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/injectTransaction -H 'content-type: application/json' -d '{ + "rawtx":"dc0000000008b507528697b11340f5a3fcccbff031c487bad59d26c2bdaea0cd8a0199a1720100000017f36c9d8bce784df96a2d6848f1b7a8f5c890986846b7c53489eb310090b91143c98fd233830055b5959f60030b3ca08d95f22f6b96ba8c20e548d62b342b5e0001000000ec9cf2f6052bab24ec57847c72cfb377c06958a9e04a077d07b6dd5bf23ec106020000000072116096fe2207d857d18565e848b403807cd825c044840300000000330100000000000000575e472f8c5295e8fa644e9bc5e06ec10351c65f40420f000000000066020000000000000" +}' +``` + +Result: + +```json +"3615fc23cc12a5cb9190878a2151d1cf54129ff0cd90e5fc4f4e7debebad6868" +``` + +Example, without broadcasting the transaction: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/injectTransaction -H 'content-type: application/json' -d '{ + "rawtx":"dc0000000008b507528697b11340f5a3fcccbff031c487bad59d26c2bdaea0cd8a0199a1720100000017f36c9d8bce784df96a2d6848f1b7a8f5c890986846b7c53489eb310090b91143c98fd233830055b5959f60030b3ca08d95f22f6b96ba8c20e548d62b342b5e0001000000ec9cf2f6052bab24ec57847c72cfb377c06958a9e04a077d07b6dd5bf23ec106020000000072116096fe2207d857d18565e848b403807cd825c044840300000000330100000000000000575e472f8c5295e8fa644e9bc5e06ec10351c65f40420f000000000066020000000000000", + "no_broadcast": true +}' +``` + +Result: + +```json +"3615fc23cc12a5cb9190878a2151d1cf54129ff0cd90e5fc4f4e7debebad6868" +``` + + +### Get transactions for addresses + +API sets: `READ` + +``` +URI: /api/v1/transactions +Method: GET, POST +Args: + addrs: Comma separated addresses [optional, returns all transactions if no address is provided] + confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] + verbose: [bool] include verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +If the transaction is confirmed, the calculated hours are the hours the transaction had in the block in which it was executed. +If the transaction is unconfirmed, the calculated hours are based upon the current system time, and are approximately +equal to the hours the output would have if it become confirmed immediately. + +The `"time"` field at the top level of each object in the response array indicates either the confirmed timestamp of a confirmed +transaction or the last received timestamp of an unconfirmed transaction. + +The `POST` method can be used if many addresses need to be queried. + +To get confirmed transactions for one or more addresses: + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY&confirmed=1 +``` + +To get unconfirmed transactions for one or more addresses: + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY&confirmed=0 +``` + +To get both confirmed and unconfirmed transactions for one or more addresses: + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY +``` + +Result: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10492, + "block_seq": 1177 + }, + "time": 1494275011, + "txn": { + "length": 317, + "type": 0, + "txid": "b09cd3a8baef6a449848f50a1b97943006ca92747d4e485d0647a3ea74550eca", + "inner_hash": "2cb370051c92521a04ba5357e229d8ffa90d9d1741ea223b44dd60a1483ee0e5", + "timestamp": 1494275011, + "sigs": [ + "a55155ca15f73f0762f79c15917949a936658cff668647daf82a174eed95703a02622881f9cf6c7495536676f931b2d91d389a9e7b034232b3a1519c8da6fb8800", + "cc7d7cbd6f31adabd9bde2c0deaa9277c0f3cf807a4ec97e11872817091dc3705841a6adb74acb625ee20ab6d3525350b8663566003276073d94c3bfe22fe48e01" + ], + "inputs": [ + "4f4b0078a9cd19b3395e54b3f42af6adc997f77f04e0ca54016c67c4f2384e3c", + "36f4871646b6564b2f1ab72bd768a67579a1e0242bc68bcbcf1779bc75b3dddd" + ], + "outputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454 + }, + { + "uxid": "a1268e9bd2033b49b44afa765d20876467254f51e5515626780467267a65c563", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "1.000000", + "hours": 7454 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10491, + "block_seq": 1178 + }, + "time": 1494275231, + "txn": { + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "timestamp": 1494275231, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191" + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8730, + "block_seq": 2939 + }, + "time": 1505205561, + "txn": { + "length": 474, + "type": 0, + "txid": "b45e571988bc07bd0b623c999655fa878fb9bdd24c8cd24fde179bf4b26ae7b7", + "inner_hash": "393804eca6afadc05db80cfb9e1024ef5761231c70705c406301bad33161f8bf", + "timestamp": 1505205561, + "sigs": [ + "fb9dd021cdff51ab56891cca0fd1600877f6e0691136dbe3f8324c3f4f7ee5bc624ded4954c1d70d8cb776ce3454d8f195bbb252e48b0f2cd388f5a733697d9301", + "0639e61ba87a61f10b0e0114008ddd4e7090d9397370de28da27b7852b231b8e66c36d10fe3424c9b23a41266fd2c50f169233009713b332d6a48ce9c128ccef01", + "055afe17222aab66c48c8e08e03a406bf2b8719f5221ec54c8e678078033bcd56b66bbc46a866f2be5e3f9ca454e3fbc2021630d0430b72e18c24d02df03c03100", + "8cf56fb96e11d49bea728cb35ba5953fbc640817fac01b82e62a959ef8d4c3105298f2a6ea127bb07552abd905a667b58f6c79717e9f05258079de08d91f10a500" + ], + "inputs": [ + "dea9266aa7b687f4391e92f04436407c51a834274a5a33bc8bcf3189732e82e3", + "e811bdce52ddac0d952d2546fdca8d1ac4e0ad32f170d3d73b724fb37c802652", + "e94ccdbc07cc62fb41140b4daa7969438c749837c0808acf20dde113bdf1876b", + "534afc496a7aee2ec55c71d85abfc27f35d16c56506f663b24d8ee4815583b6e" + ], + "outputs": [ + { + "uxid": "732e129fc1630aba3f06d833ce0a7a25f05dae5df3e7a135b5f82e99222e8c28", + "dst": "2hAjmdPP9R3um9JhKczeVdJUVugY6SPJBDm", + "coins": "6.000000", + "hours": 204 + } + ] + } + } +] +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT&verbose=1 +``` + +Result: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53207, + "block_seq": 1131 + }, + "time": 1494192581, + "txn": { + "timestamp": 1494192581, + "length": 220, + "type": 0, + "txid": "b785dc57a9b53dbf0390213480dd9dffc32356fb79b82fa622a2607894bfab98", + "inner_hash": "5279e944502d6bdaff25af7b7fb7c6e503c62ae70a01084031e1cb563afe2e2c", + "fee": 317021, + "sigs": [ + "f8cd208acc6674de79fa1192e5177325cda871c26707242dbd6fb9df245bf34b2fbc3dfe32e61eefa0543934556cb073bdeab6e555d7bfe6b7220f1ae575613d01" + ], + "inputs": [ + { + "uxid": "004d3ef83af64c542701b923ec5c727734de9d88837bcea37a2927a569dd3f0d", + "owner": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "904.000000", + "hours": 14, + "calculated_hours": 422693 + } + ], + "outputs": [ + { + "uxid": "4047c5cbbaf0ed927caa1391d5456d58e0857ef188f2eec8ee987a30b3f53aed", + "dst": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "903.000000", + "hours": 52836 + }, + { + "uxid": "4f4b0078a9cd19b3395e54b3f42af6adc997f77f04e0ca54016c67c4f2384e3c", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "1.000000", + "hours": 52836 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53206, + "block_seq": 1132 + }, + "time": 1494192731, + "txn": { + "timestamp": 1494192731, + "length": 220, + "type": 0, + "txid": "dc39c39bea82e5b56a1a77ce8485d9b06fda694e04ddf63af1273351c87dd077", + "inner_hash": "b8f36a57212a68f4b3ecf9d699f286dafcdb624551e07c35a983832ffd37326c", + "fee": 39628, + "sigs": [ + "1005adda19efe31b5cd85caa85b4a42599263f649103fd26761f2261f3ee00460d9693c45406d782b0e04613aa412a5ef6b275c2a665a9f13167912da91777a700" + ], + "inputs": [ + { + "uxid": "4047c5cbbaf0ed927caa1391d5456d58e0857ef188f2eec8ee987a30b3f53aed", + "owner": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "903.000000", + "hours": 52836, + "calculated_hours": 52836 + } + ], + "outputs": [ + { + "uxid": "a6662ea872dabee2fae96a4561d67728d16cb3da372d4b7bbc74a18f2bc3fecf", + "dst": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "895.000000", + "hours": 6604 + }, + { + "uxid": "36f4871646b6564b2f1ab72bd768a67579a1e0242bc68bcbcf1779bc75b3dddd", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 6604 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53161, + "block_seq": 1177 + }, + "time": 1494275011, + "txn": { + "timestamp": 1494275011, + "length": 317, + "type": 0, + "txid": "b09cd3a8baef6a449848f50a1b97943006ca92747d4e485d0647a3ea74550eca", + "inner_hash": "2cb370051c92521a04ba5357e229d8ffa90d9d1741ea223b44dd60a1483ee0e5", + "fee": 44726, + "sigs": [ + "a55155ca15f73f0762f79c15917949a936658cff668647daf82a174eed95703a02622881f9cf6c7495536676f931b2d91d389a9e7b034232b3a1519c8da6fb8800", + "cc7d7cbd6f31adabd9bde2c0deaa9277c0f3cf807a4ec97e11872817091dc3705841a6adb74acb625ee20ab6d3525350b8663566003276073d94c3bfe22fe48e01" + ], + "inputs": [ + { + "uxid": "4f4b0078a9cd19b3395e54b3f42af6adc997f77f04e0ca54016c67c4f2384e3c", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "1.000000", + "hours": 52836, + "calculated_hours": 52857 + }, + { + "uxid": "36f4871646b6564b2f1ab72bd768a67579a1e0242bc68bcbcf1779bc75b3dddd", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 6604, + "calculated_hours": 6777 + } + ], + "outputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454 + }, + { + "uxid": "a1268e9bd2033b49b44afa765d20876467254f51e5515626780467267a65c563", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "1.000000", + "hours": 7454 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53160, + "block_seq": 1178 + }, + "time": 1494275231, + "txn": { + "timestamp": 1494275231, + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "fee": 6523, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454, + "calculated_hours": 7454 + } + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } + } +] +``` + +### Resend unconfirmed transactions + +API sets: `TXN`, `WALLET` + +``` +URI: /api/v1/resendUnconfirmedTxns +Method: POST +``` + +Example: + +```sh +curl -X POST 'http://127.0.0.1:6420/api/v1/resendUnconfirmedTxns' +``` + +Result: + +```json +{ + "txids":[ + "b45e571988bc07bd0b623c999655fa878fb9bdd24c8cd24fde179bf4b26ae7b7", + "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3" + ] +} +``` + +### Verify encoded transaction + +API sets: `READ` + +``` +URI: /api/v2/transaction/verify +Method: POST +Content-Type: application/json +Args: {"unsigned": false, "encoded_transaction": ""} +``` + +If the transaction can be parsed, passes validation and has not been spent, returns `200 OK` with the decoded transaction data, +and the `"confirmed"` field will be `false`. + +If the transaction is structurally valid, passes validation but has been spent, returns `422 Unprocessable Entity` with the decoded transaction data, +and the `"confirmed"` field will be `true`. The `"error"` `"message"` will be `"transaction has been spent"`. + +`"unsigned"` may be specified in the request. If `true`, the transaction will report an error if it is fully signed. +It will not report an error if the transaction is missing at least one signature, and the remainder of the transaction is valid. +In the response, if the transaction has any unsigned inputs, the `"unsigned"` field will be `true`. +If the request did not specify `"unsigned"` or specified it as `false`, the response will return an error for an unsigned transaction. + +If the transaction can be parsed but does not pass validation, returns `422 Unprocessable Entity` with the decoded transaction data. +The `"error"` object will be included in the response with the reason why. +If the transaction's inputs cannot be found in the unspent pool nor in the historical archive of unspents, +the transaction `"inputs"` metadata will be absent and only `"uxid"` will be present. + +If the transaction can not be parsed, returns `400 Bad Request` and the `"error"` object will be included in the response with the reason why. + +Example of valid transaction that has not been spent: + +```sh +curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:6420/api/v2/transaction/verify \ +-d '{"encoded_transaction": "dc000000004fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074010000007635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df1581000100000019ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d02000000003f0555073e17ea6e45283f0f1115b520d0698d03a086010000000000010000000000000000b90dc595d102c48d3281b47428670210415f585200f22b0000000000ff01000000000000"}' +``` + +Result: + +```json +{ + "data": { + "unsigned": false, + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "82b5fcb182e3d70c285e59332af6b02bf11d8acc0b1407d7d82b82e9eeed94c0", + "inner_hash": "4fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074", + "fee": "1042", + "sigs": [ + "7635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df158100" + ], + "inputs": [ + { + "uxid": "19ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.980000", + "hours": "985", + "calculated_hours": "1554", + "timestamp": 1527080354, + "block": 30074, + "txid": "94204347ef52d90b3c5d6c31a3fced56ae3f74fd8f1f5576931aeb60847f0e59" + } + ], + "outputs": [ + { + "uxid": "b0911a5fc4dfe4524cdb82f6db9c705f4849af42fcd487a3c4abb2d17573d234", + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "coins": "0.100000", + "hours": "1" + }, + { + "uxid": "a492e6b85a434866be40da7e287bfcf14efce9803ff2fcd9d865c4046e81712a", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.880000", + "hours": "511" + } + ] + } + } +} +``` + +Example of valid transaction that *has* been spent: + +```sh +curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:6420/api/v2/transaction/verify \ +-d '{"encoded_transaction": "dc000000004fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074010000007635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df1581000100000019ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d02000000003f0555073e17ea6e45283f0f1115b520d0698d03a086010000000000010000000000000000b90dc595d102c48d3281b47428670210415f585200f22b0000000000ff01000000000000"}' +``` + +Result: + +```json +{ + "error": { + "message": "transaction has been spent", + "code": 422 + }, + "data": { + "unsigned": false, + "confirmed": true, + "transaction": { + "length": 220, + "type": 0, + "txid": "82b5fcb182e3d70c285e59332af6b02bf11d8acc0b1407d7d82b82e9eeed94c0", + "inner_hash": "4fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074", + "fee": "1042", + "sigs": [ + "7635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df158100" + ], + "inputs": [ + { + "uxid": "19ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.980000", + "hours": "985", + "calculated_hours": "1554", + "timestamp": 1527080354, + "block": 30074, + "txid": "94204347ef52d90b3c5d6c31a3fced56ae3f74fd8f1f5576931aeb60847f0e59" + } + ], + "outputs": [ + { + "uxid": "b0911a5fc4dfe4524cdb82f6db9c705f4849af42fcd487a3c4abb2d17573d234", + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "coins": "0.100000", + "hours": "1" + }, + { + "uxid": "a492e6b85a434866be40da7e287bfcf14efce9803ff2fcd9d865c4046e81712a", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.880000", + "hours": "511" + } + ] + } + } +} +``` + +Example of valid, unsigned transaction that has not been spent, with the unsigned parameter set to true in the request: + +```sh +curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:6420/api/v2/transaction/verify \ +-d '{"unsigned": true, "encoded_transaction": "dc000000004fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074010000007635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df1581000100000019ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d02000000003f0555073e17ea6e45283f0f1115b520d0698d03a086010000000000010000000000000000b90dc595d102c48d3281b47428670210415f585200f22b0000000000ff01000000000000"}' +``` + +Result: + +```json +{ + "data": { + "unsigned": true, + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "82b5fcb182e3d70c285e59332af6b02bf11d8acc0b1407d7d82b82e9eeed94c0", + "inner_hash": "4fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074", + "fee": "1042", + "sigs": [ + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "inputs": [ + { + "uxid": "19ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.980000", + "hours": "985", + "calculated_hours": "1554", + "timestamp": 1527080354, + "block": 30074, + "txid": "94204347ef52d90b3c5d6c31a3fced56ae3f74fd8f1f5576931aeb60847f0e59" + } + ], + "outputs": [ + { + "uxid": "b0911a5fc4dfe4524cdb82f6db9c705f4849af42fcd487a3c4abb2d17573d234", + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "coins": "0.100000", + "hours": "1" + }, + { + "uxid": "a492e6b85a434866be40da7e287bfcf14efce9803ff2fcd9d865c4046e81712a", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.880000", + "hours": "511" + } + ] + } + } +} +``` + + +## Block APIs + +### Get blockchain metadata + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/blockchain/metadata +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/blockchain/metadata +``` + +Result: + +```json +{ + "head": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "unspents": 38171, + "unconfirmed": 1 +} +``` + +### Get blockchain progress + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/blockchain/progress +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/blockchain/progress +``` + +Result: + +```json +{ + "current": 2760, + "highest": 2760, + "peers": [ + { + "address": "35.157.164.126:6000", + "height": 2760 + }, + { + "address": "63.142.253.76:6000", + "height": 2760 + }, + ] +} +``` + +### Get block by hash or seq + +API sets: `READ` + +``` +URI: /api/v1/block +Method: GET +Args: + hash: get block by hash + seq: get block by sequence number + verbose: [bool] return verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are the hours the transaction had in the block in which it was executed. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/block?hash=6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30 +``` + +or + +```sh +curl http://127.0.0.1:6420/api/v1/block?seq=2760 +``` + +Result: + +```json +{ + "header": { + "seq": 2760, + "block_hash": "6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30", + "previous_block_hash": "eaccd527ef263573c29000dbfb3c782ee175153c63f42abb671588b7071e877f", + "timestamp": 1504220821, + "fee": 196130, + "version": 0, + "tx_body_hash": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "ux_hash": "366af6bd80cfce79ce1ef63b45fb3ae8d9a6afc92a8590f14e18220884bd9d22" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "inner_hash": "312e5dd55e06be5f9a0ee43a00d447f2fea47a7f1fb9669ecb477d2768ab04fd", + "sigs": [ + "f0d0eb337e3440af6e8f0c105037ec205f36c83770d26a9e3a0fb4b7ec1a2be64764f4e31cbaf6629933c971613d10d58e6acb592704a7d511f19836441f09fb00" + ], + "inputs": [ + "e7594379c9a6bb111205cbfa6fac908cac1d136e207960eb0429f15fde09ac8c" + ], + "outputs": [ + { + "uxid": "840d0ee483c1dc085e6518e1928c68979af61188b809fc74da9fca982e6a61ba", + "dst": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "998.000000", + "hours": 35390 + }, + { + "uxid": "38177c437ff42f29dc8d682e2f7c278f2203b6b02f42b1a88f9eb6c2392a7f70", + "dst": "2YHKP9yH7baLvkum3U6HCBiJjnAUCLS5Z9U", + "coins": "2.000000", + "hours": 70780 + } + ] + } + ] + }, + "size": 220 +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/block?hash=6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30&verbose=1 +``` + +or + +```sh +curl http://127.0.0.1:6420/api/v1/block?seq=2760&verbose=1 +``` + +Result: + +```json +{ + "header": { + "seq": 2760, + "block_hash": "6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30", + "previous_block_hash": "eaccd527ef263573c29000dbfb3c782ee175153c63f42abb671588b7071e877f", + "timestamp": 1504220821, + "fee": 196130, + "version": 0, + "tx_body_hash": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "ux_hash": "366af6bd80cfce79ce1ef63b45fb3ae8d9a6afc92a8590f14e18220884bd9d22" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "inner_hash": "312e5dd55e06be5f9a0ee43a00d447f2fea47a7f1fb9669ecb477d2768ab04fd", + "fee": 196130, + "sigs": [ + "f0d0eb337e3440af6e8f0c105037ec205f36c83770d26a9e3a0fb4b7ec1a2be64764f4e31cbaf6629933c971613d10d58e6acb592704a7d511f19836441f09fb00" + ], + "inputs": [ + { + "uxid": "e7594379c9a6bb111205cbfa6fac908cac1d136e207960eb0429f15fde09ac8c", + "owner": "kbbzyrUKNVJsJDGFLAjVT5neVcx5SQjFx5", + "coins": "1000.000000", + "hours": 283123, + "calculated_hours": 302300 + } + ], + "outputs": [ + { + "uxid": "840d0ee483c1dc085e6518e1928c68979af61188b809fc74da9fca982e6a61ba", + "dst": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "998.000000", + "hours": 35390 + }, + { + "uxid": "38177c437ff42f29dc8d682e2f7c278f2203b6b02f42b1a88f9eb6c2392a7f70", + "dst": "2YHKP9yH7baLvkum3U6HCBiJjnAUCLS5Z9U", + "coins": "2.000000", + "hours": 70780 + } + ] + } + ] + }, + "size": 220 +} +``` + + +### Get blocks in specific range + +API sets: `READ` + +``` +URI: /api/v1/blocks +Method: GET, POST +Args: + start: start seq + end: end seq + seqs: comma-separated list of block seqs + verbose: [bool] return verbose transaction input data +``` + +This endpoint has two modes: range and seqs. +The `seqs` parameter cannot be combined with `start`, `end`. + +If `start` and/or `end` are provided, returns blocks in the range [`start`, `end`]. +Both start and end sequences are included in the returned array of blocks. + +If `seqs` is provided, returns blocks matching the specified sequences. +`seqs` must not contain any duplicate values. +If a block does not exist for any of the given sequence numbers, a `404` error is returned. + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are the hours the transaction had in the block in which it was executed. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/blocks?start=101&end=102 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + } + ] +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/blocks?start=101&end=102&verbose=1 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "fee": 710046, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54, + "calculated_hours": 811481 + } + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + } + ] +} +``` + +Example (seqs): + +```sh +curl http://127.0.0.1:6420/api/v1/blocks?seqs=3,5,7 +``` + +```json +{ + "blocks": [ + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} +``` + + +### Get last N blocks + +API sets: `READ` + +``` +URI: /api/v1/last_blocks +Method: GET +Args: + num: number of most recent blocks to return + verbose: [bool] return verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are the hours the transaction had in the block in which it was executed. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/last_blocks?num=2 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 58893, + "block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "previous_block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "timestamp": 1537581594, + "fee": 970389, + "version": 0, + "tx_body_hash": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "ux_hash": "bf35652af199779bc40cbeb339e8a782ff70673b07779e5c5621d37dfe13b42b" + }, + "body": { + "txns": [ + { + "length": 377, + "type": 0, + "txid": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "inner_hash": "a25232405bcef0c007bb2d7d3520f2a389e17e11125c252ab6c00168ec52c08d", + "sigs": [ + "2ff7390c3b66c6b0fbb2b4c59c8e218291d4cbb82a836bb577c7264677f4a8320f6f3ad72d804e3014728baa214c223ecced8725b64be96fe3b51332ad1eda4201", + "9e7c715f897b3c987c00ee8c6b14e4b90bb3e4e11d003b481f82042b1795b3c75eaa3d563cd0358cdabdab77cfdbead7323323cf73e781f9c1a8cf6d9b4f8ac100", + "5c9748314f2fe0cd442df5ebb8f211087111d22e9463355bf9eee583d44df1bd36addb510eb470cb5dafba0732615f8533072f80ae05fc728c91ce373ada1e7b00" + ], + "inputs": [ + "5f634c825b2a53103758024b3cb8578b17d56d422539e23c26b91ea397161703", + "16ac52084ffdac2e9169b9e057d44630dec23d18cfb90b9437d28220a3dc585d", + "8d3263890d32382e182b86f8772c7685a8f253ed475c05f7d530e9296f692bc9" + ], + "outputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388 + } + ] + } + ] + }, + "size": 377 + }, + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7" + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/last_blocks?num=2&verbose=1 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 58893, + "block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "previous_block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "timestamp": 1537581594, + "fee": 970389, + "version": 0, + "tx_body_hash": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "ux_hash": "bf35652af199779bc40cbeb339e8a782ff70673b07779e5c5621d37dfe13b42b" + }, + "body": { + "txns": [ + { + "length": 377, + "type": 0, + "txid": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "inner_hash": "a25232405bcef0c007bb2d7d3520f2a389e17e11125c252ab6c00168ec52c08d", + "fee": 970389, + "sigs": [ + "2ff7390c3b66c6b0fbb2b4c59c8e218291d4cbb82a836bb577c7264677f4a8320f6f3ad72d804e3014728baa214c223ecced8725b64be96fe3b51332ad1eda4201", + "9e7c715f897b3c987c00ee8c6b14e4b90bb3e4e11d003b481f82042b1795b3c75eaa3d563cd0358cdabdab77cfdbead7323323cf73e781f9c1a8cf6d9b4f8ac100", + "5c9748314f2fe0cd442df5ebb8f211087111d22e9463355bf9eee583d44df1bd36addb510eb470cb5dafba0732615f8533072f80ae05fc728c91ce373ada1e7b00" + ], + "inputs": [ + { + "uxid": "5f634c825b2a53103758024b3cb8578b17d56d422539e23c26b91ea397161703", + "owner": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.910000", + "hours": 7745, + "calculated_hours": 17458 + }, + { + "uxid": "16ac52084ffdac2e9169b9e057d44630dec23d18cfb90b9437d28220a3dc585d", + "owner": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "1.000000", + "hours": 1915246, + "calculated_hours": 1915573 + }, + { + "uxid": "8d3263890d32382e182b86f8772c7685a8f253ed475c05f7d530e9296f692bc9", + "owner": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.003000", + "hours": 7745, + "calculated_hours": 7746 + } + ], + "outputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388 + } + ] + } + ] + }, + "size": 377 + }, + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "fee": 485194, + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "owner": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388, + "calculated_hours": 970388 + } + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` + +## Uxout APIs + +### Get uxout + +API sets: `READ` + +``` +URI: /api/v1/uxout +Method: GET +Args: + uxid +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/uxout?uxid=8b64d9b058e10472b9457fd2d05a1d89cbbbd78ce1d97b16587d43379271bed1 +``` + +Result: + +```json +{ + "uxid": "8b64d9b058e10472b9457fd2d05a1d89cbbbd78ce1d97b16587d43379271bed1", + "time": 1502870712, + "src_block_seq": 2545, + "src_tx": "ded9e671510ab300a4ea3ee126fe8e2d50b995021e2db4589c6fb4ac000fe7bb", + "owner_address": "c9zyTYwgR4n89KyzknpmGaaDarUCPEs9mV", + "coins": 2000000, + "hours": 5039, + "spent_block_seq": 2556, + "spent_tx": "b51e1933f286c4f03d73e8966186bafb25f64053db8514327291e690ae8aafa5" +} +``` + +### Get historical unspent outputs for an address + +API sets: `READ` + +``` +URI: /api/v1/address_uxouts +Method: GET +Args: + address +``` + +Returns the historical, spent outputs of a given address. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/address_uxouts?address=6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY +``` + +Result: + +```json +[ + { + "uxid": "7669ff7350d2c70a88093431a7b30d3e69dda2319dcb048aa80fa0d19e12ebe0", + "time": 1502936862, + "src_block_seq": 2556, + "src_tx": "b51e1933f286c4f03d73e8966186bafb25f64053db8514327291e690ae8aafa5", + "owner_address": "6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY", + "coins": 2000000, + "hours": 633, + "spent_block_seq": 0, + "spent_tx": "0000000000000000000000000000000000000000000000000000000000000000" + } +] +``` + +## Coin supply related information + +### Coin supply + +API sets: `READ` + +``` +URI: /api/v1/coinSupply +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/coinSupply +``` + +Result: + +```json +{ + "current_supply": "7187500.000000", + "total_supply": "25000000.000000", + "max_supply": "100000000.000000", + "current_coinhour_supply": "23499025077", + "total_coinhour_supply": "93679828577", + "unlocked_distribution_addresses": [ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm" + ], + "locked_distribution_addresses": [ + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm" + ] +} +``` + +### Richlist show top N addresses by uxouts + +API sets: `READ` + +``` +URI: /api/v1/richlist +Method: GET +Args: + n: top N addresses, [default 20, returns all if <= 0]. + include-distribution: include distribution addresses or not, default false. +``` + +Example: + +```sh +curl "http://127.0.0.1:6420/api/v1/richlist?n=4&include-distribution=true" +``` + +Result: + +```json +{ + "richlist": [ + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "locked": true + } + ] +} +``` + +### Count the addresses that currently have unspent outputs (coins) + +API sets: `READ` + +``` +URI: /api/v1/addresscount +Method: GET +``` + +Example: + +```sh +curl "http://127.0.0.1:6420/api/v1/addresscount" +``` + +Result: + +```json +{ + "count": 10103 +} +``` + +## Network status + +### Get information for a specific connection + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connection +Method: GET +Args: + addr: ip:port address of a known connection +``` + +Connection `"state"` value can be `"pending"`, `"connected"` or `"introduced"`. + +* The `"pending"` state is prior to connection establishment. +* The `"connected"` state is after connection establishment, but before the introduction handshake has completed. +* The `"introduced"` state is after the introduction handshake has completed. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connection?addr=176.9.84.75:6000' +``` + +Result: + +```json +{ + "id": 109548, + "address": "176.9.84.75:6000", + "last_sent": 1520675817, + "last_received": 1520675817, + "connected_at": 1520675700, + "outgoing": false, + "state": "introduced", + "mirror": 719118746, + "height": 181, + "listen_port": 6000, + "user_agent": "skycoin:0.25.0", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + } +} +``` + +### Get a list of all connections + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connections +Method: GET +Args: + states: [optional] comma-separated list of connection states ("pending", "connected" or "introduced"). Defaults to "connected,introduced" + direction: [optional] "outgoing" or "incoming". If not provided, both are included. +``` + +Connection `"state"` value can be `"pending"`, `"connected"` or `"introduced"`. + +* The `"pending"` state is prior to connection establishment. +* The `"connected"` state is after connection establishment, but before the introduction handshake has completed. +* The `"introduced"` state is after the introduction handshake has completed. + +By default, both incoming and outgoing connections in the `"connected"` or `"introduced"` state are returned. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connections' +``` + +Result: + +```json +{ + "connections": [ + { + "id": 99107, + "address": "139.162.161.41:20002", + "last_sent": 1520675750, + "last_received": 1520675750, + "connected_at": 1520675500, + "outgoing": false, + "state": "introduced", + "mirror": 1338939619, + "listen_port": 20002, + "height": 180, + "user_agent": "skycoin:0.25.0", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + } + }, + { + "id": 109548, + "address": "176.9.84.75:6000", + "last_sent": 1520675751, + "last_received": 1520675751, + "connected_at": 1520675751, + "state": "connected", + "outgoing": true, + "mirror": 0, + "listen_port": 6000, + "height": 0, + "user_agent": "", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 0, + "max_transaction_size": 0, + "max_decimals": 0 + } + }, + { + "id": 99115, + "address": "185.120.34.60:6000", + "last_sent": 1520675754, + "last_received": 1520675754, + "connected_at": 1520673013, + "outgoing": false, + "state": "introduced", + "mirror": 1931713869, + "listen_port": 6000, + "height": 180, + "user_agent": "", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 0, + "max_transaction_size": 0, + "max_decimals": 0 + } + } + ] +} +``` + + +### Get a list of all default connections + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/defaultConnections +Method: GET +``` + +Returns addresses in the default hardcoded list of peers. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/defaultConnections' +``` + +Result: + +```json +[ + "104.237.142.206:6000", + "118.178.135.93:6000", + "139.162.7.132:6000", + "172.104.85.6:6000", + "176.58.126.224:6000", + "47.88.33.156:6000" +] +``` + +### Get a list of all trusted connections + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connections/trust +Method: GET +``` + +Returns addresses marked as trusted in the peerlist. +This is typically equal to the list of addresses in the default hardcoded list of peers. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connections/trust' +``` + +Result: + +```json +[ + "104.237.142.206:6000", + "118.178.135.93:6000", + "139.162.7.132:6000", + "172.104.85.6:6000", + "176.58.126.224:6000", + "47.88.33.156:6000" +] +``` + +### Get a list of all connections discovered through peer exchange + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connections/exchange +Method: GET +``` + +Returns addresses from the peerlist that are known to have an open port. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connections/exchange' +``` + +Result: + +```json +[ + "104.237.142.206:6000", + "116.62.220.158:7200", + "118.237.210.163:6000", + "139.162.161.41:20000", + "139.162.161.41:20001", + "139.162.161.41:20002", + "139.162.33.154:6000", + "139.162.7.132:6000", + "155.94.137.34:6000", + "164.132.108.92:6000", + "165.227.199.63:6000", + "172.104.145.6:6000", + "172.104.52.230:7200", + "172.104.85.6:6000", + "173.212.205.184:6000", + "173.249.30.221:6000", + "176.58.126.224:6000", + "176.9.84.75:6000", + "185.120.34.60:6000", + "35.201.160.163:6000", + "47.88.33.156:6000" +] +``` + +### Disconnect a peer + +API sets: `NET_CTRL` + +``` +URI: /api/v1/network/connection/disconnect +Method: POST +Args: + id: ID of the connection + +Returns 404 if the connection is not found. +``` + +Disconnects a peer by ID. + +Example: + +```sh +curl -X POST 'http://127.0.0.1:6420/api/v1/network/connection/disconnect?id=999' +``` + +Result: + +```json +{} +``` + +## Migrating from the unversioned API + +The unversioned API are the API endpoints without an `/api` prefix. +These endpoints are all prefixed with `/api/v1` now. + +`-enable-unversioned-api` was added as an option to assist migration to `/api/v1` +but this option was removed in v0.26.0. + +To migrate from the unversioned API, add `/api/v1` to all endpoints that you call +that do not have an `/api` prefix already. + +For example, `/block` would become `/api/v1/block`. + +## Migrating from the JSONRPC API + +The JSONRPC-2.0 RPC API was deprecated in v0.25.0 and removed in v0.26.0. + +Anyone still using this can follow this guide to migrate to the REST API: + +* `get_status` is replaced by `/api/v1/blockchain/metadata` and `/api/v1/health` +* `get_lastblocks` is replaced by `/api/v1/last_blocks` +* `get_blocks` is replaced by `/api/v1/blocks` +* `get_outputs` is replaced by `/api/v1/outputs` +* `inject_transaction` is replaced by `/api/v1/injectTransaction` +* `get_transaction` is replaced by `/api/v1/transaction` + +## Migrating from /api/v1/spend + +The `POST /api/v1/spend` endpoint is deprecated and will be removed in v0.26.0. + +To migrate from it, use [`POST /api/v1/wallet/transaction`](#create-transaction) followed by [`POST /api/v1/injectTransaction`](#inject-raw-transaction). +Do not create another transaction before injecting the created transaction, otherwise you might create two conflicting transactions. + +`POST /api/v1/wallet/transaction` has more options for creating the transaction than the `/api/v1/spend` endpoint. +To replicate the same behavior as `/api/v1/spend`, use the following request body template: + +```json +{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5", + }, + "wallet": { + "id": "$wallet_id", + "password": "$password" + }, + "to": [{ + "address": "$dst", + "coins": "$coins" + }] +} +``` + +You must use a string for `"coins"` instead of an integer measured in "droplets" (the smallest unit of currency in Skycoin, 1/1000000 of a skycoin). +For example, if you sent 1 Skycoin with `/api/v1/spend` you would have specified the `coins` field as `1000000`. +Now, you would specify it as `"1"`. + +Some examples: + +* 123.456 coins: before `123456000`, now `"123.456"` +* 0.1 coins: before `100000`, now `"0.1"` +* 1 coin: before `1000000`, now `"1"` + +Extra zeros on the `"coins"` string are ok, for example `"1"` is the same as `"1.0"` or `"1.000000"`. + +Only provide `"password"` if the wallet is encrypted. Note that decryption can take a few seconds, and this can impact +throughput. + +The request header `Content-Type` must be `application/json`. + +The response to `POST /api/v1/wallet/transaction` will include a verbose decoded transaction with details +and the hex-encoded binary transaction in the `"encoded_transaction"` field. +Use the value of `"encoded_transaction"` as the `"rawtx"` value in the request to `/api/v1/injectTransaction`. + +## Migration from /api/v1/explorer/address + +The `GET /api/v1/explorer/address` was deprecated in v0.25.0 and removed in v0.26.0. + +To migrate from it, use [`GET /api/v1/transactions?verbose=1`](#get-transactions-for-addresses). + +`/api/v1/explorer/address` accepted a single `address` query parameter. `/api/v1/transactions` uses an `addrs` query parameter and +accepts multiple addresses at once. + +The response data is the same but the structure is slightly different. Compare the follow two example responses: + +`/api/v1/explorer/address?address=WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC`: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38076, + "block_seq": 15493 + }, + "timestamp": 1518878675, + "length": 183, + "type": 0, + "txid": "6d8e2f8b436a2f38d604b3aa1196ef2176779c5e11e33fbdd09f993fe659c39f", + "inner_hash": "8da7c64dcedeeb6aa1e0d21fb84a0028dcd68e6801f1a3cc0224fdd50682046f", + "fee": 126249, + "sigs": [ + "c60e43980497daad59b4c72a2eac053b1584f960c57a5e6ac8337118dccfcee4045da3f60d9be674867862a13fdd87af90f4b85cbf39913bde13674e0a039b7800" + ], + "inputs": [ + { + "uxid": "349b06e5707f633fd2d8f048b687b40462d875d968b246831434fb5ab5dcac38", + "owner": "WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC", + "coins": "125.000000", + "hours": 34596, + "calculated_hours": 178174 + } + ], + "outputs": [ + { + "uxid": "5b4a79c7de2e9099e083bbc8096619ae76ba6fbe34875c61bbe2d3bfa6b18b99", + "dst": "2NfNKsaGJEndpSajJ6TsKJfsdDjW2gFsjXg", + "coins": "125.000000", + "hours": 51925 + } + ] + } +] +``` + +`/api/v1/transactions?verbose=1&addrs=WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC`: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57564, + "block_seq": 7498 + }, + "time": 1514743602, + "txn": { + "timestamp": 1514743602, + "length": 220, + "type": 0, + "txid": "df5bcef198fe6e96d496c30482730f895cabc1d55b338afe5633b0c2889d02f9", + "inner_hash": "4677ff9b9b56485495a45693cc09f8496199929fccb52091d32f2d3cf2ee8a41", + "fee": 69193, + "sigs": [ + "8e1f6f621a11f737ac2031be975d4b2fc17bf9f17a0da0a2fe219ee018011ab506e2ad0367be302a8d859cc355c552313389cd0aa9fa98dc7d2085a52f11ef5a00" + ], + "inputs": [ + { + "uxid": "2374201ff29f1c024ccfc6c53160e741d06720562853ad3613c121acd8389031", + "owner": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "162768.000000", + "hours": 485, + "calculated_hours": 138385 + } + ], + "outputs": [ + { + "uxid": "63f299fc85fe6fc34d392718eee55909837c7231b6ffd93e5a9a844c4375b313", + "dst": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "162643.000000", + "hours": 34596 + }, + { + "uxid": "349b06e5707f633fd2d8f048b687b40462d875d968b246831434fb5ab5dcac38", + "dst": "WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC", + "coins": "125.000000", + "hours": 34596 + } + ] + } + } +] +``` + +The transaction data is wrapped in a `"txn"` field. A `"time"` field is present at the top level. This `"time"` field +is either the confirmation timestamp of a confirmed transaction or the last received time of an unconfirmed transaction. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/address.go b/vendor/github.com/SkycoinProject/skycoin/src/api/address.go new file mode 100644 index 00000000..93f2e83d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/address.go @@ -0,0 +1,56 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +// VerifyAddressRequest is the request data for POST /api/v2/address/verify +type VerifyAddressRequest struct { + Address string `json:"address"` +} + +// VerifyAddressResponse is returned by POST /api/v2/address/verify +type VerifyAddressResponse struct { + Version byte `json:"version"` +} + +// addressVerifyHandler verifies a Skycoin address +// Method: POST +// URI: /api/v2/address/verify +func addressVerifyHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyAddressRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.Address == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "address is required") + writeHTTPResponse(w, resp) + return + } + + addr, err := cipher.DecodeBase58Address(req.Address) + + if err != nil { + resp := NewHTTPErrorResponse(http.StatusUnprocessableEntity, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: VerifyAddressResponse{ + Version: addr.Version, + }, + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/address_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/address_test.go new file mode 100644 index 00000000..9d2fdc39 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/address_test.go @@ -0,0 +1,148 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func toJSON(t *testing.T, r interface{}) string { + b, err := json.Marshal(r) + require.NoError(t, err) + return string(b) +} + +func TestVerifyAddress(t *testing.T) { + cases := []struct { + name string + method string + status int + contentType string + csrfDisabled bool + httpBody string + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: ContentTypeForm, + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 - EOF", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + + { + name: "400 - Missing address", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: "{}", + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "address is required"), + }, + + { + name: "422 - Invalid checksum", + method: http.MethodPost, + status: http.StatusUnprocessableEntity, + httpBody: toJSON(t, VerifyAddressRequest{ + Address: "7apQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: NewHTTPErrorResponse(http.StatusUnprocessableEntity, "Invalid checksum"), + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(t, VerifyAddressRequest{ + Address: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: HTTPResponse{ + Data: VerifyAddressResponse{ + Version: 0, + }, + }, + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(t, VerifyAddressRequest{ + Address: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: HTTPResponse{ + Data: VerifyAddressResponse{ + Version: 0, + }, + }, + csrfDisabled: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/address/verify" + gateway := &MockGatewayer{} + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Set("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var addrRsp VerifyAddressResponse + err := json.Unmarshal(rsp.Data, &addrRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(VerifyAddressResponse), addrRsp) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain.go b/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain.go new file mode 100644 index 00000000..a986ca3a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain.go @@ -0,0 +1,395 @@ +package api + +// APIs for blockchain related information + +import ( + "errors" + "fmt" + "net/http" + "strconv" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// blockchainMetadataHandler returns the blockchain metadata +// Method: GET +// URI: /api/v1/blockchain/metadata +func blockchainMetadataHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + visorMetadata, err := gateway.GetBlockchainMetadata() + if err != nil { + err = fmt.Errorf("gateway.GetBlockchainMetadata failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // This can happen if the node is shut down at the right moment, guard against a panic + if visorMetadata == nil { + err = errors.New("gateway.GetBlockchainMetadata metadata is nil") + wh.Error500(w, err.Error()) + return + } + + metadata := readable.NewBlockchainMetadata(*visorMetadata) + + wh.SendJSONOr500(logger, w, metadata) + } +} + +// blockchainProgressHandler returns the blockchain sync progress +// Method: GET +// URI: /api/v1/blockchain/progress +func blockchainProgressHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + headSeq, _, err := gateway.HeadBkSeq() + if err != nil { + err = fmt.Errorf("gateway.HeadBkSeq failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + progress := gateway.GetBlockchainProgress(headSeq) + + // This can happen if the node is shut down at the right moment, guard against a panic + if progress == nil { + err = errors.New("gateway.GetBlockchainProgress progress is nil") + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, readable.NewBlockchainProgress(progress)) + } +} + +func parseBoolFlag(v string) (bool, error) { + if v == "" { + return false, nil + } + + return strconv.ParseBool(v) +} + +// blockHandler returns a block by hash or seq +// Method: GET +// URI: /api/v1/block +// Args: +// hash [transaction hash string] +// seq [int] +// Note: only one of hash or seq is allowed +func blockHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + hash := r.FormValue("hash") + seq := r.FormValue("seq") + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + switch { + case hash == "" && seq == "": + wh.Error400(w, "should specify one filter, hash or seq") + return + case hash != "" && seq != "": + wh.Error400(w, "should only specify one filter, hash or seq") + return + } + + var h cipher.SHA256 + if hash != "" { + var err error + h, err = cipher.SHA256FromHex(hash) + if err != nil { + wh.Error400(w, err.Error()) + return + } + } + + var uSeq uint64 + if seq != "" { + var err error + uSeq, err = strconv.ParseUint(seq, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid seq value %q", seq)) + return + } + } + + if verbose { + var b *coin.SignedBlock + var inputs [][]visor.TransactionInput + + switch { + case hash != "": + b, inputs, err = gateway.GetSignedBlockByHashVerbose(h) + case seq != "": + b, inputs, err = gateway.GetSignedBlockBySeqVerbose(uSeq) + } + + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if b == nil { + wh.Error404(w, "") + return + } + + rb, err := readable.NewBlockVerbose(b.Block, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + return + } + + var b *coin.SignedBlock + switch { + case hash != "": + b, err = gateway.GetSignedBlockByHash(h) + case seq != "": + b, err = gateway.GetSignedBlockBySeq(uSeq) + } + + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if b == nil { + wh.Error404(w, "") + return + } + + rb, err := readable.NewBlock(b.Block) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} + +// blocksHandler returns blocks between a start and end point, +// or an explicit list of sequences. +// If using start and end, the block sequences include both the start and end point. +// Explicit sequences cannot be combined with start and end. +// Method: GET, POST +// URI: /api/v1/blocks +// Args: +// start [int] +// end [int] +// seqs [comma separated list of ints] +// verbose [bool] +func blocksHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + sStart := r.FormValue("start") + sEnd := r.FormValue("end") + sSeqs := r.FormValue("seqs") + + if sSeqs != "" && (sStart != "" || sEnd != "") { + wh.Error400(w, "seqs cannot be used with start or end") + return + } + + if sSeqs == "" && sStart == "" && sEnd == "" { + wh.Error400(w, "At least one of seqs or start or end are required") + return + } + + var start uint64 + var end uint64 + var seqs []uint64 + + if sStart != "" { + var err error + start, err = strconv.ParseUint(sStart, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid start value %q", sStart)) + return + } + } + + if sEnd != "" { + var err error + end, err = strconv.ParseUint(sEnd, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid end value %q", sEnd)) + return + } + } + + if sSeqs != "" { + ssSeqs := strings.Split(sSeqs, ",") + seqs = make([]uint64, len(ssSeqs)) + seqsMap := make(map[uint64]struct{}, len(ssSeqs)) + for i, s := range ssSeqs { + x, err := strconv.ParseUint(s, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid sequence %q at seqs[%d]", s, i)) + return + } + + if _, ok := seqsMap[x]; ok { + wh.Error400(w, fmt.Sprintf("Duplicate sequence %d at seqs[%d]", x, i)) + return + } + seqsMap[x] = struct{}{} + + seqs[i] = x + } + } + + if verbose { + var blocks []coin.SignedBlock + var inputs [][][]visor.TransactionInput + var err error + + if len(seqs) > 0 { + blocks, inputs, err = gateway.GetBlocksVerbose(seqs) + } else { + blocks, inputs, err = gateway.GetBlocksInRangeVerbose(start, end) + } + + if err != nil { + switch err.(type) { + case visor.ErrBlockNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + return + } + + rb, err := readable.NewBlocksVerbose(blocks, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } else { + var blocks []coin.SignedBlock + var err error + + if len(seqs) > 0 { + blocks, err = gateway.GetBlocks(seqs) + } else { + blocks, err = gateway.GetBlocksInRange(start, end) + } + + if err != nil { + switch err.(type) { + case visor.ErrBlockNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + return + } + + rb, err := readable.NewBlocks(blocks) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } + } +} + +// lastBlocksHandler returns the most recent N blocks on the blockchain +// Method: GET +// URI: /api/v1/last_blocks +// Args: +// num [int] +// verbose [bool] +func lastBlocksHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + num := r.FormValue("num") + n, err := strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid num value %q", num)) + return + } + + if verbose { + blocks, inputs, err := gateway.GetLastBlocksVerbose(n) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rb, err := readable.NewBlocksVerbose(blocks, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + return + } + + blocks, err := gateway.GetLastBlocks(n) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rb, err := readable.NewBlocks(blocks) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain_test.go new file mode 100644 index 00000000..47353b93 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain_test.go @@ -0,0 +1,1222 @@ +package api + +import ( + "io" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "encoding/json" + + "math" + + "github.com/stretchr/testify/require" + + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func TestGetBlockchainMetadata(t *testing.T) { + cases := []struct { + name string + method string + status int + err string + getBlockchainMetadataResult *visor.BlockchainMetadata + getBlockchainMetadataErr error + result readable.BlockchainMetadata + }{ + { + name: "405 method not allowed", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - GetBlockchainMetadata error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBlockchainMetadata failed: GetBlockchainMetadata error", + getBlockchainMetadataErr: errors.New("GetBlockchainMetadata error"), + }, + { + name: "500 - nil visor.BlockchainMetadata", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBlockchainMetadata metadata is nil", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getBlockchainMetadataResult: &visor.BlockchainMetadata{ + HeadBlock: coin.SignedBlock{}, + Unspents: 12, + Unconfirmed: 13, + }, + result: readable.BlockchainMetadata{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Unspents: 12, + Unconfirmed: 13, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetBlockchainMetadata").Return(tc.getBlockchainMetadataResult, tc.getBlockchainMetadataErr) + + endpoint := "/api/v1/blockchain/metadata" + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v` %s", status, tc.status, strings.TrimSpace(rr.Body.String())) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg readable.BlockchainMetadata + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetBlockchainProgress(t *testing.T) { + addr1 := testutil.MakeAddress() + addr2 := testutil.MakeAddress() + + cases := []struct { + name string + method string + status int + err string + headBkSeq uint64 + headBkSeqErr error + getBlockchainProgressResult *daemon.BlockchainProgress + result readable.BlockchainProgress + }{ + { + name: "405 method not allowed", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "500 - HeadBkSeq error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.HeadBkSeq failed: HeadBkSeq error", + headBkSeqErr: errors.New("HeadBkSeq error"), + }, + + { + name: "500 - nil daemon.BlockchainProgress", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBlockchainProgress progress is nil", + }, + + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + headBkSeq: 99, + getBlockchainProgressResult: &daemon.BlockchainProgress{ + Peers: []daemon.PeerBlockchainHeight{ + { + Address: addr1.String(), + Height: 101, + }, + { + Address: addr2.String(), + Height: 102, + }, + }, + Current: 99, + Highest: 102, + }, + result: readable.BlockchainProgress{ + Peers: []readable.PeerBlockchainHeight{ + { + Address: addr1.String(), + Height: 101, + }, + { + Address: addr2.String(), + Height: 102, + }, + }, + Current: 99, + Highest: 102, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("HeadBkSeq").Return(tc.headBkSeq, true, tc.headBkSeqErr) + gateway.On("GetBlockchainProgress", tc.headBkSeq).Return(tc.getBlockchainProgressResult) + + endpoint := "/api/v1/blockchain/progress" + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v` %s", status, tc.status, strings.TrimSpace(rr.Body.String())) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg readable.BlockchainProgress + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func makeBadBlock(t *testing.T) *coin.Block { + genPublic, _ := cipher.GenerateKeyPair() + genAddress := cipher.AddressFromPubKey(genPublic) + var genCoins uint64 = 1000e6 + var genTime uint64 = 1000 + now := genTime + 100 + preBlock, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + uxHash := testutil.RandSHA256(t) + txn := coin.Transaction{ + In: []cipher.SHA256{ + testutil.RandSHA256(t), + }, + } + err = txn.PushOutput(genAddress, math.MaxInt64+1, 255) + require.NoError(t, err) + b, err := coin.NewBlock(*preBlock, now, uxHash, coin.Transactions{txn}, func(t *coin.Transaction) (uint64, error) { + return 0, nil + }) + require.NoError(t, err) + require.NotEqual(t, b.Head.BkSeq, uint64(0)) + require.NotEmpty(t, b.Body.Transactions) + for i, txn := range b.Body.Transactions { + require.NotEmpty(t, txn.In, "txn %d/%d", i+1, len(b.Body.Transactions)) + } + return b +} + +func TestGetBlock(t *testing.T) { + badBlock := makeBadBlock(t) + validHashString := testutil.RandSHA256(t).Hex() + validSHA256, err := cipher.SHA256FromHex(validHashString) + require.NoError(t, err) + + type verboseResult struct { + Block *coin.SignedBlock + Inputs [][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + hash string + sha256 cipher.SHA256 + seqStr string + seq uint64 + verbose bool + verboseStr string + gatewayGetBlockByHashResult *coin.SignedBlock + gatewayGetBlockByHashErr error + gatewayGetBlockBySeqResult *coin.SignedBlock + gatewayGetBlockBySeqErr error + gatewayGetBlockByHashVerboseResult verboseResult + gatewayGetBlockByHashVerboseErr error + gatewayGetBlockBySeqVerboseResult verboseResult + gatewayGetBlockBySeqVerboseErr error + response interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - no seq and hash", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - should specify one filter, hash or seq", + }, + { + name: "400 - seq and hash simultaneously", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - should only specify one filter, hash or seq", + hash: "hash", + seqStr: "seq", + }, + { + name: "400 - hash error: encoding/hex err invalid byte: U+0068 'h'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0068 'h'", + hash: "hash", + }, + { + name: "400 - hash error: encoding/hex: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + hash: "1234abc", + }, + { + name: "400 - hash error: Invalid hex length", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid hex length", + hash: "1234abcd", + }, + { + name: "404 - block by hash does not exist", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + hash: validHashString, + sha256: validSHA256, + }, + { + name: "400 - seq error: invalid syntax", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid seq value \"badseq\"", + seqStr: "badseq", + }, + { + name: "404 - block by seq does not exist", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + seqStr: "1", + seq: 1, + }, + { + name: "500 - readable.NewBlock error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqResult: &coin.SignedBlock{ + Block: *badBlock, + }, + }, + { + name: "500 - get block by hash error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetSignedBlockByHash failed", + hash: validHashString, + sha256: validSHA256, + gatewayGetBlockByHashErr: errors.New("GetSignedBlockByHash failed"), + }, + { + name: "500 - get block by seq error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetSignedBlockBySeq failed", + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqErr: errors.New("GetSignedBlockBySeq failed"), + }, + { + name: "200 - get block by seq", + method: http.MethodGet, + status: http.StatusOK, + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqResult: &coin.SignedBlock{}, + response: &readable.Block{ + Head: readable.BlockHeader{ + BkSeq: 0x0, + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + { + name: "200 - get block by hash", + method: http.MethodGet, + status: http.StatusOK, + hash: validHashString, + sha256: validSHA256, + gatewayGetBlockByHashResult: &coin.SignedBlock{}, + response: &readable.Block{ + Head: readable.BlockHeader{ + BkSeq: 0x0, + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + + { + name: "200 - get block by hash verbose", + method: http.MethodGet, + status: http.StatusOK, + hash: validHashString, + sha256: validSHA256, + verbose: true, + verboseStr: "1", + gatewayGetBlockByHashVerboseResult: verboseResult{ + Block: &coin.SignedBlock{}, + Inputs: nil, + }, + response: &readable.BlockVerbose{ + Head: readable.BlockHeader{ + BkSeq: 0x0, + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + + { + name: "200 - get block by seq verbose", + method: http.MethodGet, + status: http.StatusOK, + seq: 1, + seqStr: "1", + verbose: true, + verboseStr: "1", + gatewayGetBlockBySeqVerboseResult: verboseResult{ + Block: &coin.SignedBlock{}, + Inputs: nil, + }, + response: &readable.BlockVerbose{ + Head: readable.BlockHeader{ + BkSeq: 0x0, + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + + { + name: "500 - get block by hash verbose error", + method: http.MethodGet, + status: http.StatusInternalServerError, + hash: validHashString, + sha256: validSHA256, + verbose: true, + verboseStr: "1", + gatewayGetBlockByHashVerboseErr: errors.New("GetSignedBlockByHashVerbose failed"), + err: "500 Internal Server Error - GetSignedBlockByHashVerbose failed", + }, + + { + name: "500 - get block by seq verbose error", + method: http.MethodGet, + status: http.StatusInternalServerError, + seq: 1, + seqStr: "1", + verbose: true, + verboseStr: "1", + gatewayGetBlockBySeqVerboseErr: errors.New("GetSignedBlockBySeqVerbose failed"), + err: "500 Internal Server Error - GetSignedBlockBySeqVerbose failed", + }, + + { + name: "404 - get block by hash verbose not found", + method: http.MethodGet, + status: http.StatusNotFound, + hash: validHashString, + sha256: validSHA256, + verbose: true, + verboseStr: "1", + err: "404 Not Found", + }, + + { + name: "404 - get block by seq verbose not found", + method: http.MethodGet, + status: http.StatusNotFound, + seq: 1, + seqStr: "1", + verbose: true, + verboseStr: "1", + err: "404 Not Found", + }, + + { + name: "400 - invalid verbose flag", + method: http.MethodGet, + status: http.StatusBadRequest, + seq: 1, + seqStr: "1", + verbose: true, + verboseStr: "asdasdasd", + err: "400 Bad Request - Invalid value for verbose", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + + gateway.On("GetSignedBlockByHash", tc.sha256).Return(tc.gatewayGetBlockByHashResult, tc.gatewayGetBlockByHashErr) + gateway.On("GetSignedBlockBySeq", tc.seq).Return(tc.gatewayGetBlockBySeqResult, tc.gatewayGetBlockBySeqErr) + gateway.On("GetSignedBlockByHashVerbose", tc.sha256).Return(tc.gatewayGetBlockByHashVerboseResult.Block, + tc.gatewayGetBlockByHashVerboseResult.Inputs, tc.gatewayGetBlockByHashVerboseErr) + gateway.On("GetSignedBlockBySeqVerbose", tc.seq).Return(tc.gatewayGetBlockBySeqVerboseResult.Block, + tc.gatewayGetBlockBySeqVerboseResult.Inputs, tc.gatewayGetBlockBySeqVerboseErr) + + endpoint := "/api/v1/block" + + v := url.Values{} + if tc.hash != "" { + v.Add("hash", tc.hash) + } + if tc.seqStr != "" { + v.Add("seq", tc.seqStr) + } + if tc.verboseStr != "" { + v.Add("verbose", tc.verboseStr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + if tc.verbose { + var msg *readable.BlockVerbose + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response.(*readable.BlockVerbose), msg) + } else { + var msg *readable.Block + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response.(*readable.Block), msg) + } + } + }) + } +} + +func TestGetBlocks(t *testing.T) { + type httpBody struct { + Start string + End string + Seqs string + Verbose string + } + + type verboseResult struct { + Blocks []coin.SignedBlock + Inputs [][][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + body *httpBody + start uint64 + end uint64 + seqs []uint64 + verbose bool + gatewayGetBlocksInRangeResult []coin.SignedBlock + gatewayGetBlocksInRangeError error + gatewayGetBlocksInRangeVerboseResult verboseResult + gatewayGetBlocksInRangeVerboseError error + gatewayGetBlocksResult []coin.SignedBlock + gatewayGetBlocksError error + gatewayGetBlocksVerboseResult verboseResult + gatewayGetBlocksVerboseError error + response interface{} + }{ + { + name: "405", + method: http.MethodDelete, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty start, end and seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - At least one of seqs or start or end are required", + }, + { + name: "400 - bad start", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid start value \"badStart\"", + body: &httpBody{ + Start: "badStart", + }, + }, + { + name: "400 - bad end", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid end value \"badEnd\"", + body: &httpBody{ + Start: "1", + End: "badEnd", + }, + start: 1, + }, + { + name: "400 - bad verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + body: &httpBody{ + Start: "1", + End: "2", + Verbose: "foo", + }, + }, + { + name: "400 - seqs combined with start", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - seqs cannot be used with start or end", + body: &httpBody{ + Seqs: "1,2,3", + Start: "1", + }, + }, + { + name: "400 - seqs combined with end", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - seqs cannot be used with start or end", + body: &httpBody{ + Seqs: "1,2,3", + End: "1", + }, + }, + { + name: "400 - bad seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid sequence \"a\" at seqs[2]", + body: &httpBody{ + Seqs: "1,2,a", + }, + }, + { + name: "400 - bad seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid sequence \"\" at seqs[1]", + body: &httpBody{ + Seqs: "1,,2", + }, + }, + { + name: "400 - bad seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid sequence \"foo\" at seqs[0]", + body: &httpBody{ + Seqs: "foo", + }, + }, + { + name: "400 - duplicate seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Duplicate sequence 2 at seqs[3]", + body: &httpBody{ + Seqs: "1,2,3,2", + }, + }, + + { + name: "404 - block seq not found", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found - block does not exist seq=4", + body: &httpBody{ + Seqs: "1,2,4", + }, + seqs: []uint64{1, 2, 4}, + gatewayGetBlocksError: visor.NewErrBlockNotExist(4), + }, + + { + name: "404 - block seq not found verbose", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found - block does not exist seq=4", + body: &httpBody{ + Seqs: "1,2,4", + Verbose: "1", + }, + seqs: []uint64{1, 2, 4}, + verbose: true, + gatewayGetBlocksVerboseError: visor.NewErrBlockNotExist(4), + }, + + { + name: "500 - gatewayGetBlocksInRangeError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetBlocksInRangeError", + body: &httpBody{ + Start: "1", + End: "3", + }, + start: 1, + end: 3, + gatewayGetBlocksInRangeError: errors.New("gatewayGetBlocksInRangeError"), + }, + { + name: "500 - gatewayGetBlocksInRangeVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetBlocksInRangeVerboseError", + body: &httpBody{ + Start: "1", + End: "3", + Verbose: "1", + }, + start: 1, + end: 3, + verbose: true, + gatewayGetBlocksInRangeVerboseError: errors.New("gatewayGetBlocksInRangeVerboseError"), + }, + + { + name: "500 - gatewayGetBlocksError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetBlocksError", + body: &httpBody{ + Seqs: "1,2,3", + }, + seqs: []uint64{1, 2, 3}, + gatewayGetBlocksError: errors.New("gatewayGetBlocksError"), + }, + { + name: "500 - gatewayGetBlocksVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetBlocksVerboseError", + body: &httpBody{ + Seqs: "1,2,3", + Verbose: "1", + }, + seqs: []uint64{1, 2, 3}, + verbose: true, + gatewayGetBlocksVerboseError: errors.New("gatewayGetBlocksVerboseError"), + }, + + { + name: "200 range", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Start: "1", + End: "3", + }, + start: 1, + end: 3, + gatewayGetBlocksInRangeResult: []coin.SignedBlock{{}}, + response: &readable.Blocks{ + Blocks: []readable.Block{ + readable.Block{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + }, + }, + { + name: "200 range verbose", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Start: "1", + End: "3", + Verbose: "1", + }, + start: 1, + end: 3, + verbose: true, + gatewayGetBlocksInRangeVerboseResult: verboseResult{ + Blocks: []coin.SignedBlock{{}}, + Inputs: [][][]visor.TransactionInput{{}}, + }, + response: &readable.BlocksVerbose{ + Blocks: []readable.BlockVerbose{ + readable.BlockVerbose{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + }, + }, + + { + name: "200 seqs", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Seqs: "1,2,3", + }, + seqs: []uint64{1, 2, 3}, + gatewayGetBlocksResult: []coin.SignedBlock{{}}, + response: &readable.Blocks{ + Blocks: []readable.Block{ + readable.Block{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + }, + }, + { + name: "200 seqs verbose", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Seqs: "1,2,3", + Verbose: "1", + }, + seqs: []uint64{1, 2, 3}, + verbose: true, + gatewayGetBlocksVerboseResult: verboseResult{ + Blocks: []coin.SignedBlock{{}}, + Inputs: [][][]visor.TransactionInput{{}}, + }, + response: &readable.BlocksVerbose{ + Blocks: []readable.BlockVerbose{ + readable.BlockVerbose{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + }, + }, + + { + name: "200 seqs POST", + method: http.MethodPost, + status: http.StatusOK, + body: &httpBody{ + Seqs: "1,2,3", + }, + seqs: []uint64{1, 2, 3}, + gatewayGetBlocksResult: []coin.SignedBlock{{}}, + response: &readable.Blocks{ + Blocks: []readable.Block{ + readable.Block{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetBlocksInRange", tc.start, tc.end).Return(tc.gatewayGetBlocksInRangeResult, tc.gatewayGetBlocksInRangeError) + gateway.On("GetBlocksInRangeVerbose", tc.start, tc.end).Return(tc.gatewayGetBlocksInRangeVerboseResult.Blocks, + tc.gatewayGetBlocksInRangeVerboseResult.Inputs, tc.gatewayGetBlocksInRangeVerboseError) + gateway.On("GetBlocks", tc.seqs).Return(tc.gatewayGetBlocksResult, tc.gatewayGetBlocksError) + gateway.On("GetBlocksVerbose", tc.seqs).Return(tc.gatewayGetBlocksVerboseResult.Blocks, + tc.gatewayGetBlocksVerboseResult.Inputs, tc.gatewayGetBlocksVerboseError) + + endpoint := "/api/v1/blocks" + + v := url.Values{} + if tc.body != nil { + if tc.body.Start != "" { + v.Add("start", tc.body.Start) + } + if tc.body.End != "" { + v.Add("end", tc.body.End) + } + if tc.body.Verbose != "" { + v.Add("verbose", tc.body.Verbose) + } + if tc.body.Seqs != "" { + v.Add("seqs", tc.body.Seqs) + } + } + + var reqBody io.Reader + if len(v) > 0 { + if tc.method == http.MethodPost { + reqBody = strings.NewReader(v.Encode()) + } else { + endpoint += "?" + v.Encode() + } + } + + req, err := http.NewRequest(tc.method, endpoint, reqBody) + require.NoError(t, err) + + if tc.method == http.MethodPost { + req.Header.Set("Content-Type", ContentTypeForm) + } + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg *readable.BlocksVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } else { + var msg *readable.Blocks + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + } + }) + } +} + +func TestGetLastBlocks(t *testing.T) { + type httpBody struct { + Num string + Verbose string + } + + type verboseResult struct { + Blocks []coin.SignedBlock + Inputs [][][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + body httpBody + num uint64 + verbose bool + gatewayGetLastBlocksResult []coin.SignedBlock + gatewayGetLastBlocksError error + gatewayGetLastBlocksVerboseResult verboseResult + gatewayGetLastBlocksVerboseError error + response interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + body: httpBody{ + Num: "1", + }, + }, + { + name: "400 - empty num value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid num value \"\"", + }, + { + name: "400 - bad num value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid num value \"badNumValue\"", + body: httpBody{ + Num: "badNumValue", + }, + }, + { + name: "400 - bad verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + body: httpBody{ + Num: "1", + Verbose: "foo", + }, + }, + { + name: "500 - gatewayGetLastBlocksError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetLastBlocksError", + body: httpBody{ + Num: "1", + }, + num: 1, + gatewayGetLastBlocksError: errors.New("gatewayGetLastBlocksError"), + }, + { + name: "500 - gatewayGetLastBlocksVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetLastBlocksVerboseError", + body: httpBody{ + Num: "1", + Verbose: "1", + }, + num: 1, + verbose: true, + gatewayGetLastBlocksVerboseError: errors.New("gatewayGetLastBlocksVerboseError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + body: httpBody{ + Num: "1", + }, + num: 1, + gatewayGetLastBlocksResult: []coin.SignedBlock{{}}, + response: &readable.Blocks{ + Blocks: []readable.Block{ + readable.Block{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + }, + }, + { + name: "200 verbose", + method: http.MethodGet, + status: http.StatusOK, + body: httpBody{ + Num: "1", + Verbose: "1", + }, + num: 1, + verbose: true, + gatewayGetLastBlocksVerboseResult: verboseResult{ + Blocks: []coin.SignedBlock{{}}, + Inputs: [][][]visor.TransactionInput{{}}, + }, + response: &readable.BlocksVerbose{ + Blocks: []readable.BlockVerbose{ + readable.BlockVerbose{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/last_blocks" + gateway := &MockGatewayer{} + + gateway.On("GetLastBlocks", tc.num).Return(tc.gatewayGetLastBlocksResult, tc.gatewayGetLastBlocksError) + gateway.On("GetLastBlocksVerbose", tc.num).Return(tc.gatewayGetLastBlocksVerboseResult.Blocks, + tc.gatewayGetLastBlocksVerboseResult.Inputs, tc.gatewayGetLastBlocksVerboseError) + + v := url.Values{} + if tc.body.Num != "" { + v.Add("num", tc.body.Num) + } + if tc.body.Verbose != "" { + v.Add("verbose", tc.body.Verbose) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + handler := newServerMux(defaultMuxConfig(), gateway) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg *readable.BlocksVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } else { + var msg *readable.Blocks + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/client.go b/vendor/github.com/SkycoinProject/skycoin/src/api/client.go new file mode 100644 index 00000000..3038adc4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/client.go @@ -0,0 +1,1314 @@ +package api + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/kvstorage" + "github.com/SkycoinProject/skycoin/src/readable" +) + +const ( + dialTimeout = 60 * time.Second + httpClientTimeout = 120 * time.Second + tlsHandshakeTimeout = 60 * time.Second + + // ContentTypeJSON json content type header + ContentTypeJSON = "application/json" + // ContentTypeForm form data content type header + ContentTypeForm = "application/x-www-form-urlencoded" +) + +// ClientError is used for non-200 API responses +type ClientError struct { + Status string + StatusCode int + Message string +} + +// NewClientError creates a ClientError +func NewClientError(status string, statusCode int, message string) ClientError { + return ClientError{ + Status: status, + StatusCode: statusCode, + Message: strings.TrimRight(message, "\n"), + } +} + +func (e ClientError) Error() string { + return e.Message +} + +// ReceivedHTTPResponse parsed a HTTPResponse received by the Client, for the V2 API +type ReceivedHTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data json.RawMessage `json:"data"` +} + +// Client provides an interface to a remote node's HTTP API +type Client struct { + HTTPClient *http.Client + Addr string + Username string + Password string +} + +// NewClient creates a Client +func NewClient(addr string) *Client { + transport := &http.Transport{ + Dial: (&net.Dialer{ + Timeout: dialTimeout, + }).Dial, + TLSHandshakeTimeout: tlsHandshakeTimeout, + } + httpClient := &http.Client{ + Transport: transport, + Timeout: httpClientTimeout, + } + addr = strings.TrimRight(addr, "/") + addr += "/" + + return &Client{ + Addr: addr, + HTTPClient: httpClient, + } +} + +// SetAuth configures the Client's request authentication +func (c *Client) SetAuth(username, password string) { + c.Username = username + c.Password = password +} + +func (c *Client) applyAuth(req *http.Request) { + if c.Username == "" && c.Password == "" { + return + } + + req.SetBasicAuth(c.Username, c.Password) +} + +// GetV2 makes a GET request to an endpoint and unmarshals the response to respObj. +// If the response is not 200 OK, returns an error +func (c *Client) GetV2(endpoint string, respObj interface{}) (bool, error) { + return c.requestV2(http.MethodGet, endpoint, nil, respObj) +} + +// Get makes a GET request to an endpoint and unmarshals the response to obj. +// If the response is not 200 OK, returns an error +func (c *Client) Get(endpoint string, obj interface{}) error { + resp, err := c.get(endpoint) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return NewClientError(resp.Status, resp.StatusCode, string(body)) + } + + if obj == nil { + return nil + } + + d := json.NewDecoder(resp.Body) + d.DisallowUnknownFields() + return d.Decode(obj) +} + +// get makes a GET request to an endpoint. Caller must close response body. +func (c *Client) get(endpoint string) (*http.Response, error) { + return c.makeRequestWithoutBody(endpoint, http.MethodGet) +} + +// makeRequestWithoutBody makes a `method` request to an endpoint. Caller must close response body. +func (c *Client) makeRequestWithoutBody(endpoint, method string) (*http.Response, error) { + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(method, endpoint, nil) + if err != nil { + return nil, err + } + + c.applyAuth(req) + + return c.HTTPClient.Do(req) +} + +// DeleteV2 makes a DELETE request to an endpoint with body of json data, +// and parses the standard JSON response. +func (c *Client) DeleteV2(endpoint string, respObj interface{}) (bool, error) { + return c.requestV2(http.MethodDelete, endpoint, nil, respObj) +} + +// PostForm makes a POST request to an endpoint with body of ContentTypeForm formated data. +func (c *Client) PostForm(endpoint string, body io.Reader, obj interface{}) error { + return c.Post(endpoint, ContentTypeForm, body, obj) +} + +// PostJSON makes a POST request to an endpoint with body of json data. +func (c *Client) PostJSON(endpoint string, reqObj, respObj interface{}) error { + body, err := json.Marshal(reqObj) + if err != nil { + return err + } + + return c.Post(endpoint, ContentTypeJSON, bytes.NewReader(body), respObj) +} + +// Post makes a POST request to an endpoint. +func (c *Client) Post(endpoint string, contentType string, body io.Reader, obj interface{}) error { + csrf, err := c.CSRF() + if err != nil { + return err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(http.MethodPost, endpoint, body) + if err != nil { + return err + } + + c.applyAuth(req) + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + req.Header.Set("Content-Type", contentType) + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return NewClientError(resp.Status, resp.StatusCode, string(body)) + } + + if obj == nil { + return nil + } + + decoder := json.NewDecoder(resp.Body) + decoder.DisallowUnknownFields() + return decoder.Decode(obj) +} + +// PostJSONV2 makes a POST request to an endpoint with body of json data, +// and parses the standard JSON response. +func (c *Client) PostJSONV2(endpoint string, reqObj, respObj interface{}) (bool, error) { + body, err := json.Marshal(reqObj) + if err != nil { + return false, err + } + + return c.requestV2(http.MethodPost, endpoint, bytes.NewReader(body), respObj) +} + +func (c *Client) requestV2(method, endpoint string, body io.Reader, respObj interface{}) (bool, error) { + csrf, err := c.CSRF() + if err != nil { + return false, err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(method, endpoint, body) + if err != nil { + return false, err + } + + c.applyAuth(req) + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + switch method { + case http.MethodPost: + req.Header.Set("Content-Type", ContentTypeJSON) + } + + req.Header.Set("Accept", ContentTypeJSON) + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return false, err + } + + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return false, err + } + + decoder := json.NewDecoder(bytes.NewReader(respBody)) + decoder.DisallowUnknownFields() + + var wrapObj ReceivedHTTPResponse + if err := decoder.Decode(&wrapObj); err != nil { + // In some cases, the server can send an error response in a non-JSON format, + // such as a 404 when the endpoint is not registered, or if a 500 error + // occurs in the go HTTP stack, outside of the application's control. + // If this happens, treat the entire response body as the error message. + if resp.StatusCode != http.StatusOK { + return false, NewClientError(resp.Status, resp.StatusCode, string(respBody)) + } + + return false, err + } + + // The JSON decoder stops at the end of the first valid JSON object. + // Check that there is no trailing data after the end of the first valid JSON object. + // This could occur if an endpoint mistakenly wrote an object twice, for example. + // This line returns the decoder's underlying read buffer. Read(nil) will return io.EOF + // if the buffer was completely consumed. + if _, err := decoder.Buffered().Read(nil); err != io.EOF { + return false, NewClientError(resp.Status, resp.StatusCode, "Response has additional bytes after the first JSON object: "+string(respBody)) + } + + var rspErr error + if resp.StatusCode != http.StatusOK { + rspErr = NewClientError(resp.Status, resp.StatusCode, wrapObj.Error.Message) + } + + if wrapObj.Data == nil { + return false, rspErr + } + + decoder = json.NewDecoder(bytes.NewReader(wrapObj.Data)) + decoder.DisallowUnknownFields() + + if err := decoder.Decode(respObj); err != nil { + return false, err + } + + return true, rspErr +} + +// CSRF returns a CSRF token. If CSRF is disabled on the node, returns an empty string and nil error. +func (c *Client) CSRF() (string, error) { + resp, err := c.get("/api/v1/csrf") + if err != nil { + return "", err + } + + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + case http.StatusNotFound: + // CSRF is disabled on the node + return "", nil + default: + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return "", NewClientError(resp.Status, resp.StatusCode, string(body)) + } + + d := json.NewDecoder(resp.Body) + d.DisallowUnknownFields() + + var m map[string]string + if err := d.Decode(&m); err != nil { + return "", err + } + + token, ok := m["csrf_token"] + if !ok { + return "", errors.New("csrf_token not found in response") + } + + return token, nil +} + +// Version makes a request to GET /api/v1/version +func (c *Client) Version() (*readable.BuildInfo, error) { + var bi readable.BuildInfo + if err := c.Get("/api/v1/version", &bi); err != nil { + return nil, err + } + return &bi, nil +} + +// Outputs makes a request to GET /api/v1/outputs +func (c *Client) Outputs() (*readable.UnspentOutputsSummary, error) { + var o readable.UnspentOutputsSummary + if err := c.Get("/api/v1/outputs", &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForAddresses makes a request to POST /api/v1/outputs?addrs=xxx +func (c *Client) OutputsForAddresses(addrs []string) (*readable.UnspentOutputsSummary, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + + endpoint := "/api/v1/outputs" + + var o readable.UnspentOutputsSummary + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForHashes makes a request to POST /api/v1/outputs?hashes=zzz +func (c *Client) OutputsForHashes(hashes []string) (*readable.UnspentOutputsSummary, error) { + v := url.Values{} + v.Add("hashes", strings.Join(hashes, ",")) + endpoint := "/api/v1/outputs" + + var o readable.UnspentOutputsSummary + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &o); err != nil { + return nil, err + } + return &o, nil +} + +// CoinSupply makes a request to GET /api/v1/coinSupply +func (c *Client) CoinSupply() (*CoinSupply, error) { + var cs CoinSupply + if err := c.Get("/api/v1/coinSupply", &cs); err != nil { + return nil, err + } + return &cs, nil +} + +// BlockByHash makes a request to GET /api/v1/block?hash=xxx +func (c *Client) BlockByHash(hash string) (*readable.Block, error) { + v := url.Values{} + v.Add("hash", hash) + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.Block + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockByHashVerbose makes a request to GET /api/v1/block?hash=xxx&verbose=1 +func (c *Client) BlockByHashVerbose(hash string) (*readable.BlockVerbose, error) { + v := url.Values{} + v.Add("hash", hash) + v.Add("verbose", "1") + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.BlockVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockBySeq makes a request to GET /api/v1/block?seq=xxx +func (c *Client) BlockBySeq(seq uint64) (*readable.Block, error) { + v := url.Values{} + v.Add("seq", fmt.Sprint(seq)) + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.Block + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockBySeqVerbose makes a request to GET /api/v1/block?seq=xxx&verbose=1 +func (c *Client) BlockBySeqVerbose(seq uint64) (*readable.BlockVerbose, error) { + v := url.Values{} + v.Add("seq", fmt.Sprint(seq)) + v.Add("verbose", "1") + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.BlockVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// Blocks makes a request to POST /api/v1/blocks?seqs= +func (c *Client) Blocks(seqs []uint64) (*readable.Blocks, error) { + sSeqs := make([]string, len(seqs)) + for i, x := range seqs { + sSeqs[i] = fmt.Sprint(x) + } + + v := url.Values{} + v.Add("seqs", strings.Join(sSeqs, ",")) + endpoint := "/api/v1/blocks" + + var b readable.Blocks + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlocksVerbose makes a request to POST /api/v1/blocks?verbose=1&seqs= +func (c *Client) BlocksVerbose(seqs []uint64) (*readable.BlocksVerbose, error) { + sSeqs := make([]string, len(seqs)) + for i, x := range seqs { + sSeqs[i] = fmt.Sprint(x) + } + + v := url.Values{} + v.Add("seqs", strings.Join(sSeqs, ",")) + v.Add("verbose", "1") + endpoint := "/api/v1/blocks" + + var b readable.BlocksVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlocksInRange makes a request to GET /api/v1/blocks?start=&end= +func (c *Client) BlocksInRange(start, end uint64) (*readable.Blocks, error) { + v := url.Values{} + v.Add("start", fmt.Sprint(start)) + v.Add("end", fmt.Sprint(end)) + endpoint := "/api/v1/blocks?" + v.Encode() + + var b readable.Blocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlocksInRangeVerbose makes a request to GET /api/v1/blocks?verbose=1&start=&end= +func (c *Client) BlocksInRangeVerbose(start, end uint64) (*readable.BlocksVerbose, error) { + v := url.Values{} + v.Add("start", fmt.Sprint(start)) + v.Add("end", fmt.Sprint(end)) + v.Add("verbose", "1") + endpoint := "/api/v1/blocks?" + v.Encode() + + var b readable.BlocksVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// LastBlocks makes a request to GET /api/v1/last_blocks +func (c *Client) LastBlocks(n uint64) (*readable.Blocks, error) { + v := url.Values{} + v.Add("num", fmt.Sprint(n)) + endpoint := "/api/v1/last_blocks?" + v.Encode() + + var b readable.Blocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// LastBlocksVerbose makes a request to GET /api/v1/last_blocks?verbose=1 +func (c *Client) LastBlocksVerbose(n uint64) (*readable.BlocksVerbose, error) { + v := url.Values{} + v.Add("num", fmt.Sprint(n)) + v.Add("verbose", "1") + endpoint := "/api/v1/last_blocks?" + v.Encode() + + var b readable.BlocksVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainMetadata makes a request to GET /api/v1/blockchain/metadata +func (c *Client) BlockchainMetadata() (*readable.BlockchainMetadata, error) { + var b readable.BlockchainMetadata + if err := c.Get("/api/v1/blockchain/metadata", &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainProgress makes a request to GET /api/v1/blockchain/progress +func (c *Client) BlockchainProgress() (*readable.BlockchainProgress, error) { + var b readable.BlockchainProgress + if err := c.Get("/api/v1/blockchain/progress", &b); err != nil { + return nil, err + } + return &b, nil +} + +// Balance makes a request to POST /api/v1/balance?addrs=xxx +func (c *Client) Balance(addrs []string) (*BalanceResponse, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/balance" + + var b BalanceResponse + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &b); err != nil { + return nil, err + } + return &b, nil +} + +// UxOut makes a request to GET /api/v1/uxout?uxid=xxx +func (c *Client) UxOut(uxID string) (*readable.SpentOutput, error) { + v := url.Values{} + v.Add("uxid", uxID) + endpoint := "/api/v1/uxout?" + v.Encode() + + var b readable.SpentOutput + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// AddressUxOuts makes a request to GET /api/v1/address_uxouts +func (c *Client) AddressUxOuts(addr string) ([]readable.SpentOutput, error) { + v := url.Values{} + v.Add("address", addr) + endpoint := "/api/v1/address_uxouts?" + v.Encode() + + var b []readable.SpentOutput + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return b, nil +} + +// Wallet makes a request to GET /api/v1/wallet +func (c *Client) Wallet(id string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet?" + v.Encode() + + var wr WalletResponse + if err := c.Get(endpoint, &wr); err != nil { + return nil, err + } + + return &wr, nil +} + +// Wallets makes a request to GET /api/v1/wallets +func (c *Client) Wallets() ([]WalletResponse, error) { + var wrs []WalletResponse + if err := c.Get("/api/v1/wallets", &wrs); err != nil { + return nil, err + } + + return wrs, nil +} + +// CreateWalletOptions are the options for creating a wallet +type CreateWalletOptions struct { + Type string + Seed string + SeedPassphrase string + Label string + Password string + ScanN int + XPub string + Encrypt bool +} + +// CreateWallet makes a request to POST /api/v1/wallet/create and creates a wallet. +// If scanN is <= 0, the scan number defaults to 1 +func (c *Client) CreateWallet(o CreateWalletOptions) (*WalletResponse, error) { + v := url.Values{} + v.Add("type", o.Type) + v.Add("seed", o.Seed) + v.Add("seed-passphrase", o.SeedPassphrase) + v.Add("label", o.Label) + v.Add("password", o.Password) + v.Add("encrypt", fmt.Sprint(o.Encrypt)) + v.Add("xpub", o.XPub) + + if o.ScanN > 0 { + v.Add("scan", fmt.Sprint(o.ScanN)) + } + + var w WalletResponse + if err := c.PostForm("/api/v1/wallet/create", strings.NewReader(v.Encode()), &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewWalletAddress makes a request to POST /api/v1/wallet/newAddress +// if n is <= 0, defaults to 1 +func (c *Client) NewWalletAddress(id string, n int, password string) ([]string, error) { + v := url.Values{} + v.Add("id", id) + if n > 0 { + v.Add("num", fmt.Sprint(n)) + } + + v.Add("password", password) + + var obj struct { + Addresses []string `json:"addresses"` + } + if err := c.PostForm("/api/v1/wallet/newAddress", strings.NewReader(v.Encode()), &obj); err != nil { + return nil, err + } + return obj.Addresses, nil +} + +// WalletBalance makes a request to GET /api/v1/wallet/balance +func (c *Client) WalletBalance(id string) (*BalanceResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/balance?" + v.Encode() + + var b BalanceResponse + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// CreateTransactionRequest is sent to /api/v2/transaction +type CreateTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection HoursSelection `json:"hours_selection"` + ChangeAddress *string `json:"change_address,omitempty"` + To []Receiver `json:"to"` + UxOuts []string `json:"unspents,omitempty"` + Addresses []string `json:"addresses,omitempty"` +} + +// HoursSelection defines options for hours distribution +type HoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor string `json:"share_factor,omitempty"` +} + +// Receiver specifies a spend destination +type Receiver struct { + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours,omitempty"` +} + +// WalletCreateTransactionRequest is sent to /api/v1/wallet/transaction +type WalletCreateTransactionRequest struct { + Unsigned bool `json:"unsigned"` + WalletID string `json:"wallet_id"` + Password string `json:"password"` + CreateTransactionRequest +} + +// WalletCreateTransaction makes a request to POST /api/v1/wallet/transaction +func (c *Client) WalletCreateTransaction(req WalletCreateTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v1/wallet/transaction" + if err := c.PostJSON(endpoint, req, &r); err != nil { + return nil, err + } + + return &r, nil +} + +// WalletSignTransaction makes a request to POST /api/v2/wallet/transaction/sign +func (c *Client) WalletSignTransaction(req WalletSignTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v2/wallet/transaction/sign" + ok, err := c.PostJSONV2(endpoint, req, &r) + if ok { + return &r, err + } + return nil, err +} + +// CreateTransaction makes a request to POST /api/v2/transaction +func (c *Client) CreateTransaction(req CreateTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v2/transaction" + ok, err := c.PostJSONV2(endpoint, req, &r) + if ok { + return &r, err + } + return nil, err +} + +// WalletUnconfirmedTransactions makes a request to GET /api/v1/wallet/transactions +func (c *Client) WalletUnconfirmedTransactions(id string) (*UnconfirmedTxnsResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/transactions?" + v.Encode() + + var utx *UnconfirmedTxnsResponse + if err := c.Get(endpoint, &utx); err != nil { + return nil, err + } + return utx, nil +} + +// WalletUnconfirmedTransactionsVerbose makes a request to GET /api/v1/wallet/transactions&verbose=1 +func (c *Client) WalletUnconfirmedTransactionsVerbose(id string) (*UnconfirmedTxnsVerboseResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("verbose", "1") + endpoint := "/api/v1/wallet/transactions?" + v.Encode() + + var utx *UnconfirmedTxnsVerboseResponse + if err := c.Get(endpoint, &utx); err != nil { + return nil, err + } + return utx, nil +} + +// UpdateWallet makes a request to POST /api/v1/wallet/update +func (c *Client) UpdateWallet(id, label string) error { + v := url.Values{} + v.Add("id", id) + v.Add("label", label) + + return c.PostForm("/api/v1/wallet/update", strings.NewReader(v.Encode()), nil) +} + +// WalletFolderName makes a request to GET /api/v1/wallets/folderName +func (c *Client) WalletFolderName() (*WalletFolder, error) { + var w WalletFolder + if err := c.Get("/api/v1/wallets/folderName", &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewSeed makes a request to GET /api/v1/wallet/newSeed +// entropy must be 128 or 256 +func (c *Client) NewSeed(entropy int) (string, error) { + v := url.Values{} + v.Add("entropy", fmt.Sprint(entropy)) + endpoint := "/api/v1/wallet/newSeed?" + v.Encode() + + var r struct { + Seed string `json:"seed"` + } + if err := c.Get(endpoint, &r); err != nil { + return "", err + } + return r.Seed, nil +} + +// VerifySeed verifies whether the given seed is a valid bip39 mnemonic or not +func (c *Client) VerifySeed(seed string) (bool, error) { + ok, err := c.PostJSONV2("/api/v2/wallet/seed/verify", VerifySeedRequest{ + Seed: seed, + }, &struct{}{}) + if err != nil { + return false, err + } + return ok, nil +} + +// WalletSeed makes a request to POST /api/v1/wallet/seed +func (c *Client) WalletSeed(id string, password string) (*WalletSeedResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + + var r WalletSeedResponse + if err := c.PostForm("/api/v1/wallet/seed", strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + + return &r, nil +} + +// NetworkConnection makes a request to GET /api/v1/network/connection +func (c *Client) NetworkConnection(addr string) (*readable.Connection, error) { + v := url.Values{} + v.Add("addr", addr) + endpoint := "/api/v1/network/connection?" + v.Encode() + + var dc readable.Connection + if err := c.Get(endpoint, &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkConnectionsFilter filters for network connections +type NetworkConnectionsFilter struct { + States []daemon.ConnectionState // "pending", "connected" and "introduced" + Direction string // "incoming" or "outgoing" +} + +// NetworkConnections makes a request to GET /api/v1/network/connections. +// Connections can be filtered by state and direction. By default, "connected" and "introduced" connections +// of both directions are returned. +func (c *Client) NetworkConnections(filters *NetworkConnectionsFilter) (*Connections, error) { + v := url.Values{} + if filters != nil { + if len(filters.States) != 0 { + states := make([]string, len(filters.States)) + for i, s := range filters.States { + states[i] = string(s) + } + v.Add("states", strings.Join(states, ",")) + } + if filters.Direction != "" { + v.Add("direction", filters.Direction) + } + } + endpoint := "/api/v1/network/connections?" + v.Encode() + + var dc Connections + if err := c.Get(endpoint, &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkDefaultPeers makes a request to GET /api/v1/network/defaultConnections +func (c *Client) NetworkDefaultPeers() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/defaultConnections", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkTrustedPeers makes a request to GET /api/v1/network/connections/trust +func (c *Client) NetworkTrustedPeers() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/trust", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkExchangedPeers makes a request to GET /api/v1/network/connections/exchange +func (c *Client) NetworkExchangedPeers() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/exchange", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// PendingTransactions makes a request to GET /api/v1/pendingTxs +func (c *Client) PendingTransactions() ([]readable.UnconfirmedTransactions, error) { + var v []readable.UnconfirmedTransactions + if err := c.Get("/api/v1/pendingTxs", &v); err != nil { + return nil, err + } + return v, nil +} + +// PendingTransactionsVerbose makes a request to GET /api/v1/pendingTxs?verbose=1 +func (c *Client) PendingTransactionsVerbose() ([]readable.UnconfirmedTransactionVerbose, error) { + var v []readable.UnconfirmedTransactionVerbose + if err := c.Get("/api/v1/pendingTxs?verbose=1", &v); err != nil { + return nil, err + } + return v, nil +} + +// Transaction makes a request to GET /api/v1/transaction +func (c *Client) Transaction(txid string) (*readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/transaction?" + v.Encode() + + var r readable.TransactionWithStatus + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// TransactionVerbose makes a request to GET /api/v1/transaction?verbose=1 +func (c *Client) TransactionVerbose(txid string) (*readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("txid", txid) + v.Add("verbose", "1") + endpoint := "/api/v1/transaction?" + v.Encode() + + var r readable.TransactionWithStatusVerbose + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// TransactionEncoded makes a request to GET /api/v1/transaction?encoded=1 +func (c *Client) TransactionEncoded(txid string) (*TransactionEncodedResponse, error) { + v := url.Values{} + v.Add("txid", txid) + v.Add("encoded", "1") + endpoint := "/api/v1/transaction?" + v.Encode() + + var r TransactionEncodedResponse + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// Transactions makes a request to POST /api/v1/transactions +func (c *Client) Transactions(addrs []string) ([]readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatus + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// ConfirmedTransactions makes a request to POST /api/v1/transactions?confirmed=true +func (c *Client) ConfirmedTransactions(addrs []string) ([]readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "true") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatus + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// UnconfirmedTransactions makes a request to POST /api/v1/transactions?confirmed=false +func (c *Client) UnconfirmedTransactions(addrs []string) ([]readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "false") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatus + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// TransactionsVerbose makes a request to POST /api/v1/transactions?verbose=1 +func (c *Client) TransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("verbose", "1") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatusVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// ConfirmedTransactionsVerbose makes a request to POST /api/v1/transactions?confirmed=true&verbose=1 +func (c *Client) ConfirmedTransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "true") + v.Add("verbose", "1") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatusVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// UnconfirmedTransactionsVerbose makes a request to POST /api/v1/transactions?confirmed=false&verbose=1 +func (c *Client) UnconfirmedTransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "false") + v.Add("verbose", "1") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatusVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// InjectTransaction makes a request to POST /api/v1/injectTransaction. +func (c *Client) InjectTransaction(txn *coin.Transaction) (string, error) { + rawTxn, err := txn.SerializeHex() + if err != nil { + return "", err + } + return c.InjectEncodedTransaction(rawTxn) +} + +// InjectTransactionNoBroadcast makes a request to POST /api/v1/injectTransaction +// but does not broadcast the transaction. +func (c *Client) InjectTransactionNoBroadcast(txn *coin.Transaction) (string, error) { + rawTxn, err := txn.SerializeHex() + if err != nil { + return "", err + } + return c.InjectEncodedTransactionNoBroadcast(rawTxn) +} + +// InjectEncodedTransaction makes a request to POST /api/v1/injectTransaction. +// rawTxn is a hex-encoded, serialized transaction +func (c *Client) InjectEncodedTransaction(rawTxn string) (string, error) { + return c.injectEncodedTransaction(rawTxn, false) +} + +// InjectEncodedTransactionNoBroadcast makes a request to POST /api/v1/injectTransaction +// but does not broadcast the transaction. +// rawTxn is a hex-encoded, serialized transaction +func (c *Client) InjectEncodedTransactionNoBroadcast(rawTxn string) (string, error) { + return c.injectEncodedTransaction(rawTxn, true) +} + +func (c *Client) injectEncodedTransaction(rawTxn string, noBroadcast bool) (string, error) { + v := InjectTransactionRequest{ + RawTxn: rawTxn, + NoBroadcast: noBroadcast, + } + + var txid string + if err := c.PostJSON("/api/v1/injectTransaction", v, &txid); err != nil { + return "", err + } + return txid, nil +} + +// ResendUnconfirmedTransactions makes a request to POST /api/v1/resendUnconfirmedTxns +func (c *Client) ResendUnconfirmedTransactions() (*ResendResult, error) { + endpoint := "/api/v1/resendUnconfirmedTxns" + var r ResendResult + if err := c.PostForm(endpoint, strings.NewReader(""), &r); err != nil { + return nil, err + } + return &r, nil +} + +// RawTransaction makes a request to GET /api/v1/rawtx +func (c *Client) RawTransaction(txid string) (string, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/rawtx?" + v.Encode() + + var rawTxn string + if err := c.Get(endpoint, &rawTxn); err != nil { + return "", err + } + return rawTxn, nil +} + +// VerifyTransaction makes a request to POST /api/v2/transaction/verify. +func (c *Client) VerifyTransaction(req VerifyTransactionRequest) (*VerifyTransactionResponse, error) { + var rsp VerifyTransactionResponse + ok, err := c.PostJSONV2("/api/v2/transaction/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// VerifyAddress makes a request to POST /api/v2/address/verify +// The API may respond with an error but include data useful for processing, +// so both return values may be non-nil. +func (c *Client) VerifyAddress(addr string) (*VerifyAddressResponse, error) { + req := VerifyAddressRequest{ + Address: addr, + } + + var rsp VerifyAddressResponse + ok, err := c.PostJSONV2("/api/v2/address/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// RichlistParams are arguments to the /richlist endpoint +type RichlistParams struct { + N int + IncludeDistribution bool +} + +// Richlist makes a request to GET /api/v1/richlist +func (c *Client) Richlist(params *RichlistParams) (*Richlist, error) { + endpoint := "/api/v1/richlist" + + if params != nil { + v := url.Values{} + v.Add("n", fmt.Sprint(params.N)) + v.Add("include-distribution", fmt.Sprint(params.IncludeDistribution)) + endpoint = "/api/v1/richlist?" + v.Encode() + } + + var r Richlist + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// AddressCount makes a request to GET /api/v1/addresscount +func (c *Client) AddressCount() (uint64, error) { + var r struct { + Count uint64 `json:"count"` + } + if err := c.Get("/api/v1/addresscount", &r); err != nil { + return 0, err + } + return r.Count, nil + +} + +// UnloadWallet makes a request to POST /api/v1/wallet/unload +func (c *Client) UnloadWallet(id string) error { + v := url.Values{} + v.Add("id", id) + return c.PostForm("/api/v1/wallet/unload", strings.NewReader(v.Encode()), nil) +} + +// Health makes a request to GET /api/v1/health +func (c *Client) Health() (*HealthResponse, error) { + var r HealthResponse + if err := c.Get("/api/v1/health", &r); err != nil { + return nil, err + } + + return &r, nil +} + +// EncryptWallet makes a request to POST /api/v1/wallet/encrypt to encrypt a specific wallet with the given password +func (c *Client) EncryptWallet(id, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/encrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} + +// DecryptWallet makes a request to POST /api/v1/wallet/decrypt to decrypt a wallet +func (c *Client) DecryptWallet(id, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/decrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} + +// RecoverWallet makes a request to POST /api/v2/wallet/recover to recover an encrypted wallet by seed. +// The password argument is optional, if provided, the recovered wallet will be encrypted with this password, +// otherwise the recovered wallet will be unencrypted. +func (c *Client) RecoverWallet(req WalletRecoverRequest) (*WalletResponse, error) { + var rsp WalletResponse + ok, err := c.PostJSONV2("/api/v2/wallet/recover", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// Disconnect disconnect a connections by ID +func (c *Client) Disconnect(id uint64) error { + v := url.Values{} + v.Add("id", fmt.Sprint(id)) + + var obj struct{} + return c.PostForm("/api/v1/network/connection/disconnect", strings.NewReader(v.Encode()), &obj) +} + +// GetAllStorageValues makes a GET request to /api/v2/data to get all the values from the storage of +// `storageType` type +func (c *Client) GetAllStorageValues(storageType kvstorage.Type) (map[string]string, error) { + var values map[string]string + ok, err := c.GetV2(fmt.Sprintf("/api/v2/data?type=%s", storageType), &values) + if !ok { + return nil, err + } + + return values, err +} + +// GetStorageValue makes a GET request to /api/v2/data to get the value associated with `key` from storage +// of `storageType` type +func (c *Client) GetStorageValue(storageType kvstorage.Type, key string) (string, error) { + var value string + ok, err := c.GetV2(fmt.Sprintf("/api/v2/data?type=%s&key=%s", storageType, key), &value) + if !ok { + return "", err + } + + return value, err +} + +// AddStorageValue make a POST request to /api/v2/data to add a value with the key to the storage +// of `storageType` type +func (c *Client) AddStorageValue(storageType kvstorage.Type, key, val string) error { + _, err := c.PostJSONV2("/api/v2/data", StorageRequest{ + StorageType: storageType, + Key: key, + Val: val, + }, nil) + + return err +} + +// RemoveStorageValue makes a DELETE request to /api/v2/data to remove a value associated with the `key` +// from the storage of `storageType` type +func (c *Client) RemoveStorageValue(storageType kvstorage.Type, key string) error { + _, err := c.DeleteV2(fmt.Sprintf("/api/v2/data?type=%s&key=%s", storageType, key), nil) + + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/csrf.go b/vendor/github.com/SkycoinProject/skycoin/src/api/csrf.go new file mode 100644 index 00000000..48024a0e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/csrf.go @@ -0,0 +1,165 @@ +package api + +import ( + "net/http" + "time" + + "crypto/hmac" + "crypto/sha256" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +const ( + // CSRFHeaderName is the name of the CSRF header + CSRFHeaderName = "X-CSRF-Token" + + // CSRFMaxAge is the lifetime of a CSRF token in seconds + CSRFMaxAge = time.Second * 30 + + csrfSecretLength = 64 + + csrfNonceLength = 64 +) + +var ( + // ErrCSRFInvalid is returned when the the CSRF token is in invalid format + ErrCSRFInvalid = errors.New("invalid CSRF token") + // ErrCSRFInvalidSignature is returned when the signature of the csrf token is invalid + ErrCSRFInvalidSignature = errors.New("invalid CSRF token signature") + // ErrCSRFExpired is returned when the csrf token has expired + ErrCSRFExpired = errors.New("csrf token expired") +) + +var csrfSecretKey []byte + +func init() { + csrfSecretKey = cipher.RandByte(csrfSecretLength) +} + +// CSRFToken csrf token +type CSRFToken struct { + Nonce []byte + ExpiresAt time.Time +} + +// newCSRFToken generates a new CSRF Token +func newCSRFToken() (string, error) { + return newCSRFTokenWithTime(time.Now().Add(CSRFMaxAge)) +} + +func newCSRFTokenWithTime(expiresAt time.Time) (string, error) { + token := &CSRFToken{ + Nonce: cipher.RandByte(csrfNonceLength), + ExpiresAt: expiresAt, + } + + tokenJSON, err := json.Marshal(token) + if err != nil { + return "", err + } + + h := hmac.New(sha256.New, csrfSecretKey) + _, err = h.Write([]byte(tokenJSON)) + if err != nil { + return "", err + } + + sig := base64.RawURLEncoding.EncodeToString(h.Sum(nil)) + + signingString := base64.RawURLEncoding.EncodeToString(tokenJSON) + + return strings.Join([]string{signingString, sig}, "."), nil +} + +// verifyCSRFToken checks validity of the given token +func verifyCSRFToken(headerToken string) error { + tokenParts := strings.Split(headerToken, ".") + if len(tokenParts) != 2 { + return ErrCSRFInvalid + } + + signingString, err := base64.RawURLEncoding.DecodeString(tokenParts[0]) + if err != nil { + return err + } + + h := hmac.New(sha256.New, csrfSecretKey) + _, err = h.Write([]byte(signingString)) + if err != nil { + return err + } + + sig := base64.RawURLEncoding.EncodeToString(h.Sum(nil)) + + if sig != tokenParts[1] { + return ErrCSRFInvalidSignature + } + + var csrfToken CSRFToken + err = json.Unmarshal(signingString, &csrfToken) + if err != nil { + return err + } + + if time.Now().After(csrfToken.ExpiresAt) { + return ErrCSRFExpired + } + + return nil +} + +// Creates a new CSRF token. Previous CSRF tokens are invalidated by this call. +// URI: /api/v1/csrf +// Method: GET +// Response: +// csrf_token: CSRF token to use in POST requests +func getCSRFToken(disabled bool) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + if disabled { + logger.Warning("CSRF check disabled") + wh.Error404(w, "") + return + } + + // generate a new token + csrfToken, err := newCSRFToken() + if err != nil { + logger.Error(err) + wh.Error500(w, fmt.Sprintf("Failed to create a csrf token: %v", err)) + return + } + + wh.SendJSONOr500(logger, w, &map[string]string{"csrf_token": csrfToken}) + } +} + +// CSRFCheck verifies X-CSRF-Token header value +func CSRFCheck(apiVersion string, disabled bool, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !disabled { + switch r.Method { + case http.MethodPost, http.MethodPut, http.MethodDelete: + token := r.Header.Get(CSRFHeaderName) + if err := verifyCSRFToken(token); err != nil { + logger.Errorf("CSRF token invalid: %v", err) + writeError(w, apiVersion, http.StatusForbidden, err.Error()) + return + } + } + } + + handler.ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/csrf_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/csrf_test.go new file mode 100644 index 00000000..b30f29bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/csrf_test.go @@ -0,0 +1,266 @@ +package api + +import ( + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + "time" + + "encoding/json" + "sync" + + "github.com/stretchr/testify/require" +) + +const ( + tokenValid = "token_valid" + tokenInvalid = "token_invalid" + tokenInvalidSignature = "token_invalid_signature" + tokenExpired = "token_expired" + tokenEmpty = "token_empty" +) + +func setCSRFParameters(t *testing.T, tokenType string, req *http.Request) { + token, err := newCSRFToken() + require.NoError(t, err) + // token check + switch tokenType { + case tokenValid: + req.Header.Set("X-CSRF-Token", token) + case tokenInvalid: + // add invalid token value + req.Header.Set("X-CSRF-Token", "xcasadsadsa") + case tokenInvalidSignature: + req.Header.Set("X-CSRF-Token", "YXNkc2Fkcw.YXNkc2Fkcw") + case tokenExpired: + // set some old unix time + expiredToken, err := newCSRFTokenWithTime(time.Unix(1517509381, 10)) + require.NoError(t, err) + req.Header.Set("X-CSRF-Token", expiredToken) + case tokenEmpty: + // add empty token + req.Header.Set("X-CSRF-Token", "") + } +} + +func TestCSRFWrapper(t *testing.T) { + methods := []string{http.MethodPost, http.MethodPut, http.MethodDelete} + cases := []string{tokenInvalid, tokenExpired, tokenEmpty, tokenInvalidSignature} + + for endpoint := range endpointsMethods { + for _, method := range methods { + for _, c := range cases { + name := fmt.Sprintf("%s %s %s", method, endpoint, c) + t.Run(name, func(t *testing.T) { + gateway := &MockGatewayer{} + + req, err := http.NewRequest(method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, c, req) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + + var errMsg error + switch c { + case tokenInvalid, tokenEmpty: + errMsg = ErrCSRFInvalid + case tokenInvalidSignature: + errMsg = ErrCSRFInvalidSignature + case tokenExpired: + errMsg = ErrCSRFExpired + } + + if isAPIV2 { + require.Equal(t, fmt.Sprintf("{\n \"error\": {\n \"message\": \"%s\",\n \"code\": 403\n }\n}", errMsg), rr.Body.String()) + } else { + require.Equal(t, fmt.Sprintf("403 Forbidden - %s\n", errMsg), rr.Body.String()) + } + }) + } + } + } +} + +func TestCSRFWrapperConcurrent(t *testing.T) { + methods := []string{http.MethodPost, http.MethodPut, http.MethodDelete} + cases := []string{tokenInvalid, tokenExpired, tokenEmpty, tokenInvalidSignature} + + gateway := &MockGatewayer{} + + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + + var wg sync.WaitGroup + + for i := 0; i < 6; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for endpoint := range endpointsMethods { + for _, method := range methods { + for _, c := range cases { + name := fmt.Sprintf("%s %s %s", method, endpoint, c) + t.Run(name, func(t *testing.T) { + + req, err := http.NewRequest(method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, c, req) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + rr := httptest.NewRecorder() + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + + var errMsg error + switch c { + case tokenInvalid, tokenEmpty: + errMsg = ErrCSRFInvalid + case tokenInvalidSignature: + errMsg = ErrCSRFInvalidSignature + case tokenExpired: + errMsg = ErrCSRFExpired + } + + if isAPIV2 { + require.Equal(t, fmt.Sprintf("{\n \"error\": {\n \"message\": \"%s\",\n \"code\": 403\n }\n}", errMsg), rr.Body.String()) + } else { + require.Equal(t, fmt.Sprintf("403 Forbidden - %s\n", errMsg), rr.Body.String()) + } + }) + } + } + } + }() + } + wg.Wait() + +} + +func TestCSRF(t *testing.T) { + updateWalletLabel := func(csrfToken string) *httptest.ResponseRecorder { + gateway := &MockGatewayer{} + gateway.On("UpdateWalletLabel", "fooid", "foolabel").Return(nil) + + endpoint := "/api/v1/wallet/update" + + v := url.Values{} + v.Add("id", "fooid") + v.Add("label", "foolabel") + + req, err := http.NewRequest(http.MethodPost, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + if csrfToken != "" { + req.Header.Set("X-CSRF-Token", csrfToken) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + + handler.ServeHTTP(rr, req) + + return rr + } + + // First request to POST /wallet/update is rejected because of missing CSRF + rr := updateWalletLabel("") + require.Equal(t, http.StatusForbidden, rr.Code) + require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) + + // Make a request to /csrf to get a token + gateway := &MockGatewayer{} + cfg := defaultMuxConfig() + cfg.disableCSRF = false + handler := newServerMux(cfg, gateway) + + // non-GET request to /csrf is invalid + req, err := http.NewRequest(http.MethodPost, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusMethodNotAllowed, rr.Code) + + // CSRF disabled 404s + cfg.disableCSRF = true + handler = newServerMux(cfg, gateway) + + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusNotFound, rr.Code) + + cfg.disableCSRF = false + handler = newServerMux(cfg, gateway) + + // Request a CSRF token, use it in a request + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var msg map[string]string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + + token := msg["csrf_token"] + require.NotEmpty(t, token) + + req, err = http.NewRequest(http.MethodPost, "/api/v1/version", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + // Make a request to POST /wallet/update again, using the CSRF token + rr = updateWalletLabel(token) + require.Equal(t, http.StatusOK, rr.Code) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/explorer.go b/vendor/github.com/SkycoinProject/skycoin/src/api/explorer.go new file mode 100644 index 00000000..115e7665 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/explorer.go @@ -0,0 +1,242 @@ +package api + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/droplet" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +// CoinSupply records the coin supply info +type CoinSupply struct { + // Coins distributed beyond the project: + CurrentSupply string `json:"current_supply"` + // TotalSupply is CurrentSupply plus coins held by the distribution addresses that are spendable + TotalSupply string `json:"total_supply"` + // MaxSupply is the maximum number of coins to be distributed ever + MaxSupply string `json:"max_supply"` + // CurrentCoinHourSupply is coins hours in non distribution addresses + CurrentCoinHourSupply string `json:"current_coinhour_supply"` + // TotalCoinHourSupply is coin hours in all addresses including unlocked distribution addresses + TotalCoinHourSupply string `json:"total_coinhour_supply"` + // Distribution addresses which count towards total supply + UnlockedAddresses []string `json:"unlocked_distribution_addresses"` + // Distribution addresses which are locked and do not count towards total supply + LockedAddresses []string `json:"locked_distribution_addresses"` +} + +func newAddrSet(addrs []cipher.Address) map[cipher.Address]struct{} { + s := make(map[cipher.Address]struct{}, len(addrs)) + for _, a := range addrs { + s[a] = struct{}{} + } + return s +} + +// coinSupplyHandler returns coin distribution supply stats +// Method: GET +// URI: /api/v1/coinSupply +func coinSupplyHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + allUnspents, err := gateway.GetUnspentOutputsSummary(nil) + if err != nil { + err = fmt.Errorf("gateway.GetUnspentOutputsSummary failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + dist := gateway.VisorConfig().Distribution + + unlockedAddrs := dist.UnlockedAddressesDecoded() + // Search map of unlocked addresses, used to filter unspents + unlockedAddrSet := newAddrSet(unlockedAddrs) + + var unlockedSupply uint64 + // check confirmed unspents only + for _, u := range allUnspents.Confirmed { + // check if address is an unlocked distribution address + if _, ok := unlockedAddrSet[u.Body.Address]; ok { + var err error + unlockedSupply, err = mathutil.AddUint64(unlockedSupply, u.Body.Coins) + if err != nil { + err = fmt.Errorf("uint64 overflow while adding up unlocked supply coins: %v", err) + wh.Error500(w, err.Error()) + return + } + } + } + + // "total supply" is the number of coins unlocked. + // Each distribution address was allocated distribution.AddressInitialBalance coins. + totalSupply := uint64(len(unlockedAddrs)) * dist.AddressInitialBalance() + totalSupply *= droplet.Multiplier + + // "current supply" is the number of coins distributed from the unlocked pool + currentSupply := totalSupply - unlockedSupply + + currentSupplyStr, err := droplet.ToString(currentSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return + } + + totalSupplyStr, err := droplet.ToString(totalSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return + } + + maxSupplyStr, err := droplet.ToString(dist.MaxCoinSupply * droplet.Multiplier) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return + } + + // locked distribution addresses + lockedAddrs := dist.LockedAddressesDecoded() + lockedAddrSet := newAddrSet(lockedAddrs) + + // get total coins hours which excludes locked distribution addresses + var totalCoinHours uint64 + for _, out := range allUnspents.Confirmed { + if _, ok := lockedAddrSet[out.Body.Address]; !ok { + var err error + totalCoinHours, err = mathutil.AddUint64(totalCoinHours, out.CalculatedHours) + if err != nil { + err = fmt.Errorf("uint64 overflow while adding up total coin hours: %v", err) + wh.Error500(w, err.Error()) + return + } + } + } + + // get current coin hours which excludes all distribution addresses + var currentCoinHours uint64 + for _, out := range allUnspents.Confirmed { + // check if address not in locked distribution addresses + if _, ok := lockedAddrSet[out.Body.Address]; !ok { + // check if address not in unlocked distribution addresses + if _, ok := unlockedAddrSet[out.Body.Address]; !ok { + currentCoinHours += out.CalculatedHours + } + } + } + + if err != nil { + err = fmt.Errorf("Failed to get total coinhours: %v", err) + wh.Error500(w, err.Error()) + return + } + + cs := CoinSupply{ + CurrentSupply: currentSupplyStr, + TotalSupply: totalSupplyStr, + MaxSupply: maxSupplyStr, + CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), + TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), + UnlockedAddresses: dist.UnlockedAddresses(), + LockedAddresses: dist.LockedAddresses(), + } + + wh.SendJSONOr500(logger, w, cs) + } +} + +// Richlist contains top address balances +type Richlist struct { + Richlist []readable.RichlistBalance `json:"richlist"` +} + +// richlistHandler returns the top skycoin holders +// Method: GET +// URI: /richlist?n=${number}&include-distribution=${bool} +// Args: +// n [int, number of results to include] +// include-distribution [bool, include the distribution addresses in the richlist] +func richlistHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + var topn int + topnStr := r.FormValue("n") + if topnStr == "" { + topn = 20 + } else { + var err error + topn, err = strconv.Atoi(topnStr) + if err != nil { + wh.Error400(w, "invalid n") + return + } + } + + var includeDistribution bool + includeDistributionStr := r.FormValue("include-distribution") + if includeDistributionStr == "" { + includeDistribution = false + } else { + var err error + includeDistribution, err = strconv.ParseBool(includeDistributionStr) + if err != nil { + wh.Error400(w, "invalid include-distribution") + return + } + } + + richlist, err := gateway.GetRichlist(includeDistribution) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if topn > 0 && topn < len(richlist) { + richlist = richlist[:topn] + } + + readableRichlist, err := readable.NewRichlistBalances(richlist) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, Richlist{ + Richlist: readableRichlist, + }) + } +} + +// addressCountHandler returns the total number of unique address that have coins +// Method: GET +// URI: /addresscount +func addressCountHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addrCount, err := gateway.AddressCount() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, &map[string]uint64{"count": addrCount}) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/explorer_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/explorer_test.go new file mode 100644 index 00000000..a1fc875f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/explorer_test.go @@ -0,0 +1,553 @@ +package api + +import ( + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "net/url" + "strconv" + "strings" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func makeSuccessCoinSupplyResult(t *testing.T, allUnspents readable.UnspentOutputsSummary) *CoinSupply { + unlockedAddrs := params.MainNetDistribution.UnlockedAddressesDecoded() + var unlockedSupply uint64 + // check confirmed unspents only + // Search map of unlocked addresses + // used to filter unspents + unlockedAddrSet := newAddrSet(unlockedAddrs) + for _, u := range allUnspents.HeadOutputs { + // check if address is an unlocked distribution address + if _, ok := unlockedAddrSet[cipher.MustDecodeBase58Address(u.Address)]; ok { + coins, err := droplet.FromString(u.Coins) + require.NoError(t, err) + unlockedSupply += coins + } + } + // "total supply" is the number of coins unlocked. + // Each distribution address was allocated params.MainNetDistribution.AddressInitialBalance coins. + totalSupply := uint64(len(unlockedAddrs)) * params.MainNetDistribution.AddressInitialBalance() + totalSupply *= droplet.Multiplier + + // "current supply" is the number of coins distribution from the unlocked pool + currentSupply := totalSupply - unlockedSupply + + currentSupplyStr, err := droplet.ToString(currentSupply) + require.NoError(t, err) + + totalSupplyStr, err := droplet.ToString(totalSupply) + require.NoError(t, err) + + maxSupplyStr, err := droplet.ToString(params.MainNetDistribution.MaxCoinSupply * droplet.Multiplier) + require.NoError(t, err) + + // locked distribution addresses + lockedAddrs := params.MainNetDistribution.LockedAddressesDecoded() + lockedAddrSet := newAddrSet(lockedAddrs) + + // get total coins hours which excludes locked distribution addresses + var totalCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + if _, ok := lockedAddrSet[cipher.MustDecodeBase58Address(out.Address)]; !ok { + totalCoinHours += out.Hours + } + } + + // get current coin hours which excludes all distribution addresses + var currentCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + // check if address not in locked distribution addresses + if _, ok := lockedAddrSet[cipher.MustDecodeBase58Address(out.Address)]; !ok { + // check if address not in unlocked distribution addresses + if _, ok := unlockedAddrSet[cipher.MustDecodeBase58Address(out.Address)]; !ok { + currentCoinHours += out.Hours + } + } + } + + cs := CoinSupply{ + CurrentSupply: currentSupplyStr, + TotalSupply: totalSupplyStr, + MaxSupply: maxSupplyStr, + CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), + TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), + UnlockedAddresses: params.MainNetDistribution.UnlockedAddresses(), + LockedAddresses: params.MainNetDistribution.LockedAddresses(), + } + return &cs +} + +func TestCoinSupply(t *testing.T) { + addrs := []cipher.Address{ + testutil.MakeAddress(), + testutil.MakeAddress(), + } + + unlockedAddrs := params.MainNetDistribution.UnlockedAddressesDecoded() + successGatewayGetUnspentOutputsResult := readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + readable.UnspentOutput{ + Address: addrs[0].String(), + Coins: "0", + }, + readable.UnspentOutput{ + Address: addrs[1].String(), + Coins: "0", + }, + }, + } + + var filterInUnlocked []visor.OutputsFilter + filterInUnlocked = append(filterInUnlocked, visor.FbyAddresses(unlockedAddrs)) + tt := []struct { + name string + method string + status int + err string + gatewayGetUnspentOutputsArg []visor.OutputsFilter + gatewayGetUnspentOutputsResult *visor.UnspentOutputsSummary + gatewayGetUnspentOutputsErr error + result *CoinSupply + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - gatewayGetUnspentOutputsErr", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputsSummary failed: gatewayGetUnspentOutputsErr", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), + }, + { + name: "500 - gatewayGetUnspentOutputsErr", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputsSummary failed: gatewayGetUnspentOutputsErr", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), + }, + { + name: "500 - too large HeadOutputs item", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Failed to convert coins to string: Droplet string conversion failed: Value is too large", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsResult: &visor.UnspentOutputsSummary{ + Confirmed: []visor.UnspentOutput{ + visor.UnspentOutput{ + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 9223372036854775807, + Address: unlockedAddrs[0], + }, + }, + }, + visor.UnspentOutput{ + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 1000000, + Address: unlockedAddrs[0], + }, + }, + }, + }, + }, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsResult: &visor.UnspentOutputsSummary{ + Confirmed: []visor.UnspentOutput{ + visor.UnspentOutput{ + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 0, + Address: addrs[0], + }, + }, + }, + visor.UnspentOutput{ + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 0, + Address: addrs[1], + }, + }, + }, + }, + }, + result: makeSuccessCoinSupplyResult(t, successGatewayGetUnspentOutputsResult), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/coinSupply" + gateway := &MockGatewayer{} + gateway.On("GetUnspentOutputsSummary", mock.Anything).Return(tc.gatewayGetUnspentOutputsResult, tc.gatewayGetUnspentOutputsErr) + gateway.On("VisorConfig").Return(visor.Config{ + Distribution: params.MainNetDistribution, + }) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *CoinSupply + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetRichlist(t *testing.T) { + type httpParams struct { + topn string + includeDistribution string + } + tt := []struct { + name string + method string + status int + err string + httpParams *httpParams + includeDistribution bool + gatewayGetRichlistResult visor.Richlist + gatewayGetRichlistErr error + result Richlist + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - bad topn param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid n", + httpParams: &httpParams{ + topn: "bad topn", + }, + }, + { + name: "400 - include-distribution", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid include-distribution", + httpParams: &httpParams{ + topn: "1", + includeDistribution: "bad include-distribution", + }, + }, + { + name: "500 - gw GetRichlist error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetRichlistErr", + httpParams: &httpParams{ + topn: "1", + includeDistribution: "false", + }, + gatewayGetRichlistErr: errors.New("gatewayGetRichlistErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpParams: &httpParams{ + topn: "3", + includeDistribution: "false", + }, + gatewayGetRichlistResult: visor.Richlist{ + { + Address: cipher.MustDecodeBase58Address("2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF"), + Coins: 1000000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1"), + Coins: 500000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW"), + Coins: 500000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs"), + Coins: 244458e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C"), + Coins: 195503e6, + Locked: false, + }, + }, + result: Richlist{ + Richlist: []readable.RichlistBalance{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + }, + }, + }, + { + name: "200 no limit", + method: http.MethodGet, + status: http.StatusOK, + httpParams: &httpParams{ + topn: "0", + includeDistribution: "false", + }, + gatewayGetRichlistResult: visor.Richlist{ + { + Address: cipher.MustDecodeBase58Address("2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF"), + Coins: 1000000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1"), + Coins: 500000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW"), + Coins: 500000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs"), + Coins: 244458e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C"), + Coins: 195503e6, + Locked: false, + }, + }, + result: Richlist{ + Richlist: []readable.RichlistBalance{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", + Coins: "244458.000000", + Locked: false, + }, + { + Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", + Coins: "195503.000000", + Locked: false, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/richlist" + gateway := &MockGatewayer{} + gateway.On("GetRichlist", tc.includeDistribution).Return(tc.gatewayGetRichlistResult, tc.gatewayGetRichlistErr) + + v := url.Values{} + if tc.httpParams != nil { + if tc.httpParams.topn != "" { + v.Add("n", tc.httpParams.topn) + } + if tc.httpParams.includeDistribution != "" { + v.Add("include-distribution", tc.httpParams.includeDistribution) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: tc.csrfDisabled, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Richlist + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetAddressCount(t *testing.T) { + type Result struct { + Count uint64 + } + tt := []struct { + name string + method string + status int + err string + gatewayGetAddressCountResult uint64 + gatewayGetAddressCountErr error + result Result + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - gw GetAddressCount error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetAddressCountErr", + gatewayGetAddressCountErr: errors.New("gatewayGetAddressCountErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + gatewayGetAddressCountResult: 1, + result: Result{ + Count: 1, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/addresscount" + gateway := &MockGatewayer{} + gateway.On("AddressCount").Return(tc.gatewayGetAddressCountResult, tc.gatewayGetAddressCountErr) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: tc.csrfDisabled, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Result + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/gateway.go b/vendor/github.com/SkycoinProject/skycoin/src/api/gateway.go new file mode 100644 index 00000000..83c2a7e3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/gateway.go @@ -0,0 +1,120 @@ +package api + +import ( + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/kvstorage" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/historydb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +//go:generate mockery -name Gatewayer -case underscore -inpkg -testonly + +// Gateway bundles daemon.Daemon, Visor, wallet.Service and kvstorage.Manager into a single object +type Gateway struct { + *daemon.Daemon + *visor.Visor + *wallet.Service + *kvstorage.Manager +} + +// NewGateway creates a Gateway +func NewGateway(d *daemon.Daemon, v *visor.Visor, w *wallet.Service, m *kvstorage.Manager) *Gateway { + return &Gateway{ + Daemon: d, + Visor: v, + Service: w, + Manager: m, + } +} + +// Gatewayer interface for Gateway methods +type Gatewayer interface { + Daemoner + Visorer + Walleter + Storer +} + +// Daemoner interface for daemon.Daemon methods used by the API +type Daemoner interface { + DaemonConfig() daemon.DaemonConfig + GetConnection(addr string) (*daemon.Connection, error) + GetConnections(f func(c daemon.Connection) bool) ([]daemon.Connection, error) + DisconnectByGnetID(gnetID uint64) error + GetDefaultConnections() []string + GetTrustConnections() []string + GetExchgConnection() []string + GetBlockchainProgress(headSeq uint64) *daemon.BlockchainProgress + InjectBroadcastTransaction(txn coin.Transaction) error + InjectTransaction(txn coin.Transaction) error +} + +// Visorer interface for visor.Visor methods used by the API +type Visorer interface { + VisorConfig() visor.Config + StartedAt() time.Time + HeadBkSeq() (uint64, bool, error) + GetBlockchainMetadata() (*visor.BlockchainMetadata, error) + ResendUnconfirmedTxns() ([]cipher.SHA256, error) + GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockByHashVerbose(hash cipher.SHA256) (*coin.SignedBlock, [][]visor.TransactionInput, error) + GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) + GetSignedBlockBySeqVerbose(seq uint64) (*coin.SignedBlock, [][]visor.TransactionInput, error) + GetBlocks(seqs []uint64) ([]coin.SignedBlock, error) + GetBlocksVerbose(seqs []uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) + GetBlocksInRange(start, end uint64) ([]coin.SignedBlock, error) + GetBlocksInRangeVerbose(start, end uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) + GetLastBlocks(num uint64) ([]coin.SignedBlock, error) + GetLastBlocksVerbose(num uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) + GetUnspentOutputsSummary(filters []visor.OutputsFilter) (*visor.UnspentOutputsSummary, error) + GetBalanceOfAddresses(addrs []cipher.Address) ([]wallet.BalancePair, error) + VerifyTxnVerbose(txn *coin.Transaction, signed visor.TxnSignedFlag) ([]visor.TransactionInput, bool, error) + AddressCount() (uint64, error) + GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) + GetSpentOutputsForAddresses(addr []cipher.Address) ([][]historydb.UxOut, error) + GetVerboseTransactionsForAddress(a cipher.Address) ([]visor.Transaction, [][]visor.TransactionInput, error) + GetRichlist(includeDistribution bool) (visor.Richlist, error) + GetAllUnconfirmedTransactions() ([]visor.UnconfirmedTransaction, error) + GetAllUnconfirmedTransactionsVerbose() ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) + GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) + GetTransactionWithInputs(txid cipher.SHA256) (*visor.Transaction, []visor.TransactionInput, error) + GetTransactions(flts []visor.TxFilter) ([]visor.Transaction, error) + GetTransactionsWithInputs(flts []visor.TxFilter) ([]visor.Transaction, [][]visor.TransactionInput, error) + AddressesActivity(addrs []cipher.Address) ([]bool, error) + GetWalletUnconfirmedTransactions(wltID string) ([]visor.UnconfirmedTransaction, error) + GetWalletUnconfirmedTransactionsVerbose(wltID string) ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) + GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalances, error) + CreateTransaction(p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) + WalletCreateTransaction(wltID string, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) + WalletCreateTransactionSigned(wltID string, password []byte, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) + WalletSignTransaction(wltID string, password []byte, txn *coin.Transaction, signIndexes []int) (*coin.Transaction, []visor.TransactionInput, error) +} + +// Walleter interface for wallet.Service methods used by the API +type Walleter interface { + UnloadWallet(wltID string) error + EncryptWallet(wltID string, password []byte) (wallet.Wallet, error) + DecryptWallet(wltID string, password []byte) (wallet.Wallet, error) + GetWalletSeed(wltID string, password []byte) (string, string, error) + CreateWallet(wltName string, options wallet.Options, bg wallet.TransactionsFinder) (wallet.Wallet, error) + RecoverWallet(wltID, seed, seedPassphrase string, password []byte) (wallet.Wallet, error) + NewAddresses(wltID string, password []byte, n uint64) ([]cipher.Address, error) + GetWallet(wltID string) (wallet.Wallet, error) + GetWallets() (wallet.Wallets, error) + UpdateWalletLabel(wltID, label string) error + WalletDir() (string, error) +} + +// Storer interface for kvstorage.Manager methods used by the API +type Storer interface { + GetStorageValue(storageType kvstorage.Type, key string) (string, error) + GetAllStorageValues(storageType kvstorage.Type) (map[string]string, error) + AddStorageValue(storageType kvstorage.Type, key, val string) error + RemoveStorageValue(storageType kvstorage.Type, key string) error +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/health.go b/vendor/github.com/SkycoinProject/skycoin/src/api/health.go new file mode 100644 index 00000000..a10db54c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/health.go @@ -0,0 +1,118 @@ +package api + +import ( + "fmt" + "net/http" + "time" + + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +// BlockchainMetadata extends visor.BlockchainMetadata to include the time since the last block +type BlockchainMetadata struct { + readable.BlockchainMetadata + TimeSinceLastBlock wh.Duration `json:"time_since_last_block"` +} + +// HealthResponse is returned by the /health endpoint +type HealthResponse struct { + BlockchainMetadata BlockchainMetadata `json:"blockchain"` + Version readable.BuildInfo `json:"version"` + CoinName string `json:"coin"` + DaemonUserAgent string `json:"user_agent"` + OpenConnections int `json:"open_connections"` + OutgoingConnections int `json:"outgoing_connections"` + IncomingConnections int `json:"incoming_connections"` + Uptime wh.Duration `json:"uptime"` + CSRFEnabled bool `json:"csrf_enabled"` + HeaderCheckEnabled bool `json:"header_check_enabled"` + CSPEnabled bool `json:"csp_enabled"` + WalletAPIEnabled bool `json:"wallet_api_enabled"` + GUIEnabled bool `json:"gui_enabled"` + BlockPublisher bool `json:"block_publisher"` + UserVerifyTxn readable.VerifyTxn `json:"user_verify_transaction"` + UnconfirmedVerifyTxn readable.VerifyTxn `json:"unconfirmed_verify_transaction"` + StartedAt int64 `json:"started_at"` + Fiber readable.FiberConfig `json:"fiber"` +} + +func getHealthData(c muxConfig, gateway Gatewayer) (*HealthResponse, error) { + metadata, err := gateway.GetBlockchainMetadata() + if err != nil { + return nil, fmt.Errorf("gateway.GetBlockchainMetadata failed: %v", err) + } + + conns, err := gateway.GetConnections(func(c daemon.Connection) bool { + return c.State != daemon.ConnectionStatePending + }) + if err != nil { + return nil, fmt.Errorf("gateway.GetConnections failed: %v", err) + } + + outgoingConns := 0 + incomingConns := 0 + for _, c := range conns { + if c.Outgoing { + outgoingConns++ + } else { + incomingConns++ + } + } + + elapsedBlockTime := time.Now().UTC().Unix() - int64(metadata.HeadBlock.Head.Time) + timeSinceLastBlock := time.Second * time.Duration(elapsedBlockTime) + + _, walletAPIEnabled := c.enabledAPISets[EndpointsWallet] + + userAgent, err := c.health.DaemonUserAgent.Build() + if err != nil { + return nil, err + } + + return &HealthResponse{ + BlockchainMetadata: BlockchainMetadata{ + BlockchainMetadata: readable.NewBlockchainMetadata(*metadata), + TimeSinceLastBlock: wh.FromDuration(timeSinceLastBlock), + }, + Version: c.health.BuildInfo, + CoinName: c.health.Fiber.Name, + Fiber: c.health.Fiber, + DaemonUserAgent: userAgent, + OpenConnections: len(conns), + OutgoingConnections: outgoingConns, + IncomingConnections: incomingConns, + CSRFEnabled: !c.disableCSRF, + HeaderCheckEnabled: !c.disableHeaderCheck, + CSPEnabled: !c.disableCSP, + GUIEnabled: c.enableGUI, + BlockPublisher: c.health.BlockPublisher, + WalletAPIEnabled: walletAPIEnabled, + UserVerifyTxn: readable.NewVerifyTxn(params.UserVerifyTxn), + UnconfirmedVerifyTxn: readable.NewVerifyTxn(gateway.DaemonConfig().UnconfirmedVerifyTxn), + Uptime: wh.FromDuration(time.Since(gateway.StartedAt())), + StartedAt: gateway.StartedAt().Unix(), + }, nil +} + +// healthHandler returns node health data +// URI: /api/v1/health +// Method: GET +func healthHandler(c muxConfig, gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + health, err := getHealthData(c, gateway) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, health) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/health_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/health_test.go new file mode 100644 index 00000000..6065ea0e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/health_test.go @@ -0,0 +1,260 @@ +package api + +import ( + "errors" + "net/http" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "encoding/json" + "net/http/httptest" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func TestHealthHandler(t *testing.T) { + cases := []struct { + name string + method string + code int + err string + getBlockchainMetadataErr error + getConnectionsErr error + cfg muxConfig + walletAPIEnabled bool + }{ + { + name: "405 method not allowed", + method: http.MethodPost, + code: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + cfg: defaultMuxConfig(), + }, + + { + name: "gateway.GetBlockchainMetadata error", + method: http.MethodGet, + code: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBlockchainMetadata failed: GetBlockchainMetadata failed", + getBlockchainMetadataErr: errors.New("GetBlockchainMetadata failed"), + cfg: defaultMuxConfig(), + }, + + { + name: "gateway.GetConnections error", + method: http.MethodGet, + code: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetConnections failed: GetConnections failed", + getConnectionsErr: errors.New("GetConnections failed"), + cfg: defaultMuxConfig(), + }, + + { + name: "valid response", + method: http.MethodGet, + code: http.StatusOK, + cfg: defaultMuxConfig(), + walletAPIEnabled: true, + }, + + { + name: "valid response, opposite config", + method: http.MethodGet, + code: http.StatusOK, + cfg: muxConfig{ + health: HealthConfig{ + BlockPublisher: true, + }, + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableCSP: false, + enableGUI: true, + enabledAPISets: map[string]struct{}{ + EndpointsStatus: struct{}{}, + EndpointsRead: struct{}{}, + }, + }, + walletAPIEnabled: false, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + unspents := uint64(10) + unconfirmed := uint64(20) + + uxHash, err := cipher.SHA256FromHex("8a3e0aac619551ae009cfb28c2b36bb1300925f74da770d1512072314f6a4c80") + require.NoError(t, err) + + prevHash, err := cipher.SHA256FromHex("001eb7911b6a6ab7c75feb88726dd2bc8b87133aebc82201c4404537eb74f7ac") + require.NoError(t, err) + + bodyHash, err := cipher.SHA256FromHex("36be8d70d1e9f70b340ea7ecf0b247c27086bad10568044c1196fe150f6cea1b") + require.NoError(t, err) + + metadata := visor.BlockchainMetadata{ + HeadBlock: coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 21175, + UxHash: uxHash, + PrevHash: prevHash, + Time: 1523168686, + Fee: 2, + Version: 0, + BodyHash: bodyHash, + }, + }, + }, + Unspents: unspents, + Unconfirmed: unconfirmed, + } + + buildInfo := readable.BuildInfo{ + Version: "1.0.0", + Commit: "abcdef", + Branch: "develop", + } + tc.cfg.health.BuildInfo = buildInfo + + tc.cfg.health.Fiber.Name = "skycoin" + tc.cfg.health.DaemonUserAgent = useragent.Data{ + Coin: "skycoin", + Version: "0.25.0", + Remark: "test", + } + + conns := []daemon.Connection{ + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + State: daemon.ConnectionStateConnected, + }, + }, + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: false, + State: daemon.ConnectionStateIntroduced, + }, + }, + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + State: daemon.ConnectionStateIntroduced, + }, + }, + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: false, + State: daemon.ConnectionStateConnected, + }, + }, + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + State: daemon.ConnectionStateConnected, + }, + }, + } + + gateway := &MockGatewayer{} + + if tc.getBlockchainMetadataErr != nil { + gateway.On("GetBlockchainMetadata").Return(nil, tc.getBlockchainMetadataErr) + } else { + gateway.On("GetBlockchainMetadata").Return(&metadata, nil) + } + + if tc.getConnectionsErr != nil { + gateway.On("GetConnections", mock.Anything).Return(nil, tc.getConnectionsErr) + } else { + gateway.On("GetConnections", mock.Anything).Return(conns, nil) + } + + startedAt := time.Now().Add(time.Second * -4) + + gateway.On("StartedAt").Return(startedAt) + + dc := daemon.DaemonConfig{ + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: params.UserVerifyTxn.BurnFactor * 2, + MaxTransactionSize: params.UserVerifyTxn.MaxTransactionSize * 2, + MaxDropletPrecision: params.UserVerifyTxn.MaxDropletPrecision - 1, + }, + } + + gateway.On("DaemonConfig").Return(dc) + + endpoint := "/api/v1/health" + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(tc.cfg, gateway) + handler.ServeHTTP(rr, req) + if tc.code != http.StatusOK { + require.Equal(t, tc.code, rr.Code) + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + return + } + + require.Equal(t, http.StatusOK, rr.Code) + + r := &HealthResponse{} + err = json.Unmarshal(rr.Body.Bytes(), r) + require.NoError(t, err) + + require.Equal(t, buildInfo.Version, r.Version.Version) + require.Equal(t, buildInfo.Commit, r.Version.Commit) + require.Equal(t, buildInfo.Branch, r.Version.Branch) + // Put uptime in a range in case the test scheduler is slow and there is a pause. + // Should be at least 4 seconds since startedAt was computed to be 4 seconds ago. + require.True(t, time.Second*4 <= r.Uptime.Duration && time.Second*8 >= r.Uptime.Duration, "uptime should be a little over 4 seconds") + + require.Equal(t, 3, r.OutgoingConnections) + require.Equal(t, 2, r.IncomingConnections) + require.Equal(t, len(conns), r.OpenConnections) + require.Equal(t, "skycoin", r.CoinName) + require.Equal(t, "skycoin:0.25.0(test)", r.DaemonUserAgent) + require.Equal(t, tc.cfg.health.BlockPublisher, r.BlockPublisher) + + require.Equal(t, unconfirmed, r.BlockchainMetadata.Unconfirmed) + require.Equal(t, unspents, r.BlockchainMetadata.Unspents) + require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) + + require.Equal(t, metadata.HeadBlock.Block.Head.BkSeq, r.BlockchainMetadata.Head.BkSeq) + require.Equal(t, metadata.HeadBlock.Block.Head.Time, r.BlockchainMetadata.Head.Time) + require.Equal(t, metadata.HeadBlock.Block.Head.Fee, r.BlockchainMetadata.Head.Fee) + require.Equal(t, metadata.HeadBlock.Block.Head.Version, r.BlockchainMetadata.Head.Version) + require.Equal(t, metadata.HeadBlock.Block.Head.PrevHash.Hex(), r.BlockchainMetadata.Head.PreviousHash) + require.Equal(t, metadata.HeadBlock.Block.Head.Hash().Hex(), r.BlockchainMetadata.Head.Hash) + require.Equal(t, metadata.HeadBlock.Block.Head.BodyHash.Hex(), r.BlockchainMetadata.Head.BodyHash) + + require.Equal(t, !tc.cfg.disableCSRF, r.CSRFEnabled) + require.Equal(t, !tc.cfg.disableCSP, r.CSPEnabled) + require.Equal(t, tc.cfg.enableGUI, r.GUIEnabled) + require.Equal(t, tc.walletAPIEnabled, r.WalletAPIEnabled) + + require.Equal(t, uint32(10), r.UserVerifyTxn.BurnFactor) + require.Equal(t, uint32(32*1024), r.UserVerifyTxn.MaxTransactionSize) + require.Equal(t, uint8(3), r.UserVerifyTxn.MaxDropletPrecision) + + require.Equal(t, dc.UnconfirmedVerifyTxn.BurnFactor, r.UnconfirmedVerifyTxn.BurnFactor) + require.Equal(t, dc.UnconfirmedVerifyTxn.MaxTransactionSize, r.UnconfirmedVerifyTxn.MaxTransactionSize) + require.Equal(t, dc.UnconfirmedVerifyTxn.MaxDropletPrecision, r.UnconfirmedVerifyTxn.MaxDropletPrecision) + require.True(t, time.Now().Unix() > r.StartedAt) + + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/http.go b/vendor/github.com/SkycoinProject/skycoin/src/api/http.go new file mode 100644 index 00000000..517b7ebe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/http.go @@ -0,0 +1,703 @@ +/* +Package api implements the REST API interface +*/ +package api + +import ( + "crypto/tls" + "encoding/json" + "fmt" + "io/ioutil" + "net" + "net/http" + "path/filepath" + "strings" + "time" + "unicode" + + "github.com/NYTimes/gziphandler" + "github.com/rs/cors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/file" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +var ( + logger = logging.MustGetLogger("api") +) + +const ( + resourceDir = "dist/" + devDir = "dev/" + indexPage = "index.html" + + apiVersion1 = "v1" + apiVersion2 = "v2" + + defaultReadTimeout = time.Second * 10 + defaultWriteTimeout = time.Second * 60 + defaultIdleTimeout = time.Second * 120 + + // EndpointsRead endpoints with no side-effects and no changes in node state + EndpointsRead = "READ" + // EndpointsStatus endpoints offer (meta,runtime)data to dashboard and monitoring clients + EndpointsStatus = "STATUS" + // EndpointsTransaction endpoints export operations on transactions that modify node state + EndpointsTransaction = "TXN" + // EndpointsWallet endpoints implement wallet interface + EndpointsWallet = "WALLET" + // EndpointsInsecureWalletSeed endpoints implement wallet interface + EndpointsInsecureWalletSeed = "INSECURE_WALLET_SEED" + // EndpointsPrometheus endpoints for Go application metrics + EndpointsPrometheus = "PROMETHEUS" + // EndpointsNetCtrl endpoints for managing network connections + EndpointsNetCtrl = "NET_CTRL" + // EndpointsStorage endpoints implement interface for key-value storage for arbitrary data + EndpointsStorage = "STORAGE" +) + +// Server exposes an HTTP API +type Server struct { + server *http.Server + listener net.Listener + done chan struct{} +} + +// Config configures Server +type Config struct { + StaticDir string + DisableCSRF bool + DisableHeaderCheck bool + DisableCSP bool + EnableGUI bool + ReadTimeout time.Duration + WriteTimeout time.Duration + IdleTimeout time.Duration + Health HealthConfig + HostWhitelist []string + EnabledAPISets map[string]struct{} + Username string + Password string +} + +// HealthConfig configuration data exposed in /health +type HealthConfig struct { + BuildInfo readable.BuildInfo + Fiber readable.FiberConfig + DaemonUserAgent useragent.Data + BlockPublisher bool +} + +type muxConfig struct { + host string + appLoc string + enableGUI bool + disableCSRF bool + disableHeaderCheck bool + disableCSP bool + enabledAPISets map[string]struct{} + hostWhitelist []string + username string + password string + health HealthConfig +} + +// HTTPResponse represents the http response struct +type HTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data interface{} `json:"data,omitempty"` +} + +// HTTPError is included in an HTTPResponse +type HTTPError struct { + Message string `json:"message"` + Code int `json:"code"` +} + +// NewHTTPErrorResponse returns an HTTPResponse with the Error field populated +func NewHTTPErrorResponse(code int, msg string) HTTPResponse { + if msg == "" { + msg = http.StatusText(code) + } + + return HTTPResponse{ + Error: &HTTPError{ + Code: code, + Message: msg, + }, + } +} + +func writeHTTPResponse(w http.ResponseWriter, resp HTTPResponse) { + out, err := json.MarshalIndent(resp, "", " ") + if err != nil { + wh.Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", ContentTypeJSON) + + if resp.Error == nil { + w.WriteHeader(http.StatusOK) + } else { + if resp.Error.Code < 400 || resp.Error.Code >= 600 { + logger.Critical().Errorf("writeHTTPResponse invalid error status code: %d", resp.Error.Code) + w.WriteHeader(http.StatusInternalServerError) + } else { + w.WriteHeader(resp.Error.Code) + } + } + + if _, err := w.Write(out); err != nil { + logger.WithError(err).Error("http Write failed") + } +} + +func create(host string, c Config, gateway Gatewayer) (*Server, error) { + var appLoc string + if c.EnableGUI { + var err error + appLoc, err = file.DetermineResourcePath(c.StaticDir, resourceDir, devDir) + if err != nil { + return nil, err + } + logger.Infof("Web resources directory: %s", appLoc) + } + + if c.DisableCSRF { + logger.Warning("CSRF check disabled") + } + + if c.DisableHeaderCheck { + logger.Warning("Header check disabled") + } + + if c.ReadTimeout == 0 { + c.ReadTimeout = defaultReadTimeout + } + if c.WriteTimeout == 0 { + c.WriteTimeout = defaultWriteTimeout + } + if c.IdleTimeout == 0 { + c.IdleTimeout = defaultIdleTimeout + } + + mc := muxConfig{ + host: host, + appLoc: appLoc, + enableGUI: c.EnableGUI, + disableCSRF: c.DisableCSRF, + disableHeaderCheck: c.DisableHeaderCheck, + disableCSP: c.DisableCSP, + health: c.Health, + enabledAPISets: c.EnabledAPISets, + hostWhitelist: c.HostWhitelist, + username: c.Username, + password: c.Password, + } + + srvMux := newServerMux(mc, gateway) + srv := &http.Server{ + Handler: srvMux, + ReadTimeout: c.ReadTimeout, + WriteTimeout: c.WriteTimeout, + IdleTimeout: c.IdleTimeout, + // MaxHeaderBytes: http.DefaultMaxHeaderBytes, // adjust this to allow longer GET queries + } + + return &Server{ + server: srv, + done: make(chan struct{}), + }, nil +} + +// Create creates a new Server instance that listens on HTTP +func Create(host string, c Config, gateway Gatewayer) (*Server, error) { + logger.Warning("HTTPS not in use!") + + listener, err := net.Listen("tcp", host) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + if closeErr := s.listener.Close(); closeErr != nil { + logger.WithError(err).Warning("s.listener.Close() error") + } + return nil, err + } + + s.listener = listener + + return s, nil +} + +// CreateHTTPS creates a new Server instance that listens on HTTPS +func CreateHTTPS(host string, c Config, gateway Gatewayer, certFile, keyFile string) (*Server, error) { + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + return nil, err + } + + logger.Infof("Using %s for the certificate", certFile) + logger.Infof("Using %s for the key", keyFile) + + listener, err := tls.Listen("tcp", host, &tls.Config{ + Certificates: []tls.Certificate{cert}, + }) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + if closeErr := s.listener.Close(); closeErr != nil { + logger.WithError(err).Warning("s.listener.Close() error") + } + return nil, err + } + + s.listener = listener + + return s, nil +} + +// Addr returns the listening address of the Server +func (s *Server) Addr() string { + if s == nil || s.listener == nil { + return "" + } + return s.listener.Addr().String() +} + +// Serve serves the web interface on the configured host +func (s *Server) Serve() error { + logger.Infof("Starting web interface on %s", s.listener.Addr()) + defer logger.Info("Web interface closed") + defer close(s.done) + + if err := s.server.Serve(s.listener); err != nil { + if err != http.ErrServerClosed { + return err + } + } + return nil +} + +// Shutdown closes the HTTP service. This can only be called after Serve or ServeHTTPS has been called. +func (s *Server) Shutdown() { + if s == nil { + return + } + + logger.Info("Shutting down web interface") + defer logger.Info("Web interface shut down") + if err := s.listener.Close(); err != nil { + logger.WithError(err).Warning("s.listener.Close() error") + } + <-s.done +} + +// newServerMux creates an http.ServeMux with handlers registered +func newServerMux(c muxConfig, gateway Gatewayer) *http.ServeMux { + mux := http.NewServeMux() + + allowedOrigins := []string{fmt.Sprintf("http://%s", c.host)} + for _, s := range c.hostWhitelist { + allowedOrigins = append(allowedOrigins, fmt.Sprintf("http://%s", s)) + } + + corsHandler := cors.New(cors.Options{ + AllowedOrigins: allowedOrigins, + Debug: false, + AllowedMethods: []string{http.MethodGet, http.MethodPost}, + AllowedHeaders: []string{"Origin", "Accept", "Content-Type", "X-Requested-With", CSRFHeaderName}, + AllowCredentials: false, // credentials are not used, but it would be safe to enable if necessary + OptionsPassthrough: false, + }) + + headerCheck := func(apiVersion, host string, hostWhitelist []string, handler http.Handler) http.Handler { + handler = originRefererCheck(apiVersion, host, hostWhitelist, handler) + handler = hostCheck(apiVersion, host, hostWhitelist, handler) + return handler + } + + forMethodAPISets := func(apiVersion string, f http.Handler, methodsAPISets map[string][]string) http.Handler { + if len(methodsAPISets) == 0 { + logger.Panic("methodsAPISets should not be empty") + } + + switch apiVersion { + case apiVersion1, apiVersion2: + default: + logger.Panicf("Invalid API version %q", apiVersion) + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + apiSets := methodsAPISets[r.Method] + + // If no API sets are specified for a given method, return 405 Method Not Allowed + if len(apiSets) == 0 { + switch apiVersion { + case apiVersion1: + wh.Error405(w) + case apiVersion2: + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + } + return + } + + for _, k := range apiSets { + if _, ok := c.enabledAPISets[k]; ok { + f.ServeHTTP(w, r) + return + } + } + + switch apiVersion { + case apiVersion1: + wh.Error403(w, "Endpoint is disabled") + case apiVersion2: + resp := NewHTTPErrorResponse(http.StatusForbidden, "Endpoint is disabled") + writeHTTPResponse(w, resp) + } + }) + } + + webHandlerWithOptionals := func(apiVersion, endpoint string, handlerFunc http.Handler, checkCSRF, checkHeaders bool) { + handler := wh.ElapsedHandler(logger, handlerFunc) + + handler = corsHandler.Handler(handler) + + if checkCSRF { + handler = CSRFCheck(apiVersion, c.disableCSRF, handler) + } + + if checkHeaders { + handler = headerCheck(apiVersion, c.host, c.hostWhitelist, handler) + } + + if apiVersion == apiVersion2 { + handler = ContentTypeJSONRequired(handler) + } + + handler = basicAuth(apiVersion, c.username, c.password, "skycoin daemon", handler) + handler = gziphandler.GzipHandler(handler) + mux.Handle(endpoint, handler) + } + + webHandler := func(apiVersion, endpoint string, handler http.Handler, methodAPISets map[string][]string) { + // methodAPISets can be nil to ignore the concept of API sets for an endpoint. It will always be enabled. + // Explicitly check nil, caller should not pass empty initialized map + if methodAPISets != nil { + handler = forMethodAPISets(apiVersion, handler, methodAPISets) + } + + webHandlerWithOptionals(apiVersion, endpoint, handler, true, !c.disableHeaderCheck) + } + + webHandlerV1 := func(endpoint string, handler http.Handler, methodAPISets map[string][]string) { + webHandler(apiVersion1, "/api/v1"+endpoint, handler, methodAPISets) + } + + webHandlerV2 := func(endpoint string, handler http.Handler, methodAPISets map[string][]string) { + webHandler(apiVersion2, "/api/v2"+endpoint, handler, methodAPISets) + } + + indexHandler := newIndexHandler(c.appLoc, c.enableGUI) + if !c.disableCSP { + indexHandler = CSPHandler(indexHandler, ContentSecurityPolicy) + } + webHandler(apiVersion1, "/", indexHandler, nil) + + if c.enableGUI { + fileInfos, err := ioutil.ReadDir(c.appLoc) + if err != nil { + logger.WithError(err).Panicf("ioutil.ReadDir(%s) failed", c.appLoc) + } + + fs := http.FileServer(http.Dir(c.appLoc)) + if !c.disableCSP { + fs = CSPHandler(fs, ContentSecurityPolicy) + } + + for _, fileInfo := range fileInfos { + route := fmt.Sprintf("/%s", fileInfo.Name()) + if fileInfo.IsDir() { + route = route + "/" + } + + webHandler(apiVersion1, route, fs, nil) + } + } + + // get the current CSRF token + csrfHandlerV1 := func(endpoint string, handler http.Handler) { + webHandlerWithOptionals(apiVersion1, "/api/v1"+endpoint, handler, false, !c.disableHeaderCheck) + } + csrfHandlerV1("/csrf", getCSRFToken(c.disableCSRF)) // csrf is always available, regardless of the API set + + // Status endpoints + webHandlerV1("/version", versionHandler(c.health.BuildInfo), nil) // version is always available, regardless of the API set + webHandlerV1("/health", healthHandler(c, gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + + // Wallet endpoints + webHandlerV1("/wallet", walletHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/create", walletCreateHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/newAddress", walletNewAddressesHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/balance", walletBalanceHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/transaction", walletCreateTransactionHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV2("/wallet/transaction/sign", walletSignTransactionHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/transactions", walletTransactionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/update", walletUpdateHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallets", walletsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallets/folderName", walletFolderHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/newSeed", newSeedHandler(), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/seed", walletSeedHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsInsecureWalletSeed}, + }) + webHandlerV2("/wallet/seed/verify", http.HandlerFunc(walletVerifySeedHandler), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + + webHandlerV1("/wallet/unload", walletUnloadHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/encrypt", walletEncryptHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/decrypt", walletDecryptHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV2("/wallet/recover", walletRecoverHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + + // Blockchain interface + webHandlerV1("/blockchain/metadata", blockchainMetadataHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/blockchain/progress", blockchainProgressHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/block", blockHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/blocks", blocksHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/last_blocks", lastBlocksHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + + // Network stats endpoints + webHandlerV1("/network/connection", connectionHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/connections", connectionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/defaultConnections", defaultConnectionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/connections/trust", trustConnectionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/connections/exchange", exchgConnectionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + + // Network admin endpoints + webHandlerV1("/network/connection/disconnect", disconnectHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsNetCtrl}, + }) + + // Transaction related endpoints + webHandlerV1("/pendingTxs", pendingTxnsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/transaction", transactionHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV2("/transaction", transactionHandlerV2(gateway), map[string][]string{ + // http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsTransaction}, + }) + webHandlerV2("/transaction/verify", verifyTxnHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/transactions", transactionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/injectTransaction", injectTransactionHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsTransaction, EndpointsWallet}, + }) + webHandlerV1("/resendUnconfirmedTxns", resendUnconfirmedTxnsHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsTransaction, EndpointsWallet}, + }) + webHandlerV1("/rawtx", rawTxnHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + + // Unspent output related endpoints + webHandlerV1("/outputs", outputsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/balance", balanceHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/uxout", uxOutHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/address_uxouts", addrUxOutsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + + // golang process internal metrics for Prometheus + webHandlerV2("/metrics", metricsHandler(c, gateway), map[string][]string{ + http.MethodGet: []string{EndpointsPrometheus}, + }) + + // Address related endpoints + webHandlerV2("/address/verify", http.HandlerFunc(addressVerifyHandler), map[string][]string{ + http.MethodPost: []string{EndpointsRead}, + }) + + // Explorer endpoints + webHandlerV1("/coinSupply", coinSupplyHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/richlist", richlistHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/addresscount", addressCountHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + + // Storage endpoint + webHandlerV2("/data", storageHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsStorage}, + http.MethodPost: []string{EndpointsStorage}, + http.MethodDelete: []string{EndpointsStorage}, + }) + + return mux +} + +// newIndexHandler returns a http.Handler for index.html, where index.html is in appLoc +func newIndexHandler(appLoc string, enableGUI bool) http.Handler { + // Serves the main page + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !enableGUI { + wh.Error404(w, "") + return + } + + if r.URL.Path != "/" { + wh.Error404(w, "") + return + } + + if r.URL.Path == "/" { + page := filepath.Join(appLoc, indexPage) + logger.Debugf("Serving index page: %s", page) + http.ServeFile(w, r, page) + } + }) +} + +// splitCommaString splits a string separated by commas or whitespace into tokens +// and returns an array of unique tokens split from that string +func splitCommaString(s string) []string { + words := strings.FieldsFunc(s, func(r rune) bool { + return r == ',' || unicode.IsSpace(r) + }) + + // Deduplicate + var dedupWords []string + wordsMap := make(map[string]struct{}) + for _, w := range words { + if _, ok := wordsMap[w]; !ok { + dedupWords = append(dedupWords, w) + } + wordsMap[w] = struct{}{} + } + + return dedupWords +} + +// parseAddressesFromStr parses comma-separated addresses string into []cipher.Address +func parseAddressesFromStr(s string) ([]cipher.Address, error) { + addrsStr := splitCommaString(s) + + addrs := make([]cipher.Address, len(addrsStr)) + for i, s := range addrsStr { + a, err := cipher.DecodeBase58Address(s) + if err != nil { + return nil, fmt.Errorf("address %q is invalid: %v", s, err) + } + + addrs[i] = a + } + + return addrs, nil +} + +// parseAddressesFromStr parses comma-separated hashes string into []cipher.SHA256 +func parseHashesFromStr(s string) ([]cipher.SHA256, error) { + hashesStr := splitCommaString(s) + + hashes := make([]cipher.SHA256, len(hashesStr)) + for i, s := range hashesStr { + h, err := cipher.SHA256FromHex(s) + if err != nil { + return nil, fmt.Errorf("SHA256 hash %q is invalid: %v", s, err) + } + + hashes[i] = h + } + + return hashes, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/http_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/http_test.go new file mode 100644 index 00000000..508420e1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/http_test.go @@ -0,0 +1,531 @@ +package api + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "strings" + "sync" + "testing" + + "github.com/stretchr/testify/require" +) + +const configuredHost = "127.0.0.1:6420" + +var allAPISetsEnabled = map[string]struct{}{ + EndpointsRead: struct{}{}, + EndpointsTransaction: struct{}{}, + EndpointsStatus: struct{}{}, + EndpointsWallet: struct{}{}, + EndpointsInsecureWalletSeed: struct{}{}, + EndpointsPrometheus: struct{}{}, + EndpointsNetCtrl: struct{}{}, + EndpointsStorage: struct{}{}, +} + +func defaultMuxConfig() muxConfig { + return muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: true, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + } +} + +var endpointsMethods = map[string][]string{ + "/api/v1/address_uxouts": []string{ + http.MethodGet, + }, + "/api/v1/addresscount": []string{ + http.MethodGet, + }, + "/api/v1/balance": []string{ + http.MethodGet, + http.MethodPost, + }, + "/api/v1/block": []string{ + http.MethodGet, + }, + "/api/v1/blockchain/metadata": []string{ + http.MethodGet, + }, + "/api/v1/blockchain/progress": []string{ + http.MethodGet, + }, + "/api/v1/blocks": []string{ + http.MethodGet, + http.MethodPost, + }, + "/api/v1/coinSupply": []string{ + http.MethodGet, + }, + "/api/v1/health": []string{ + http.MethodGet, + }, + "/api/v1/injectTransaction": []string{ + http.MethodPost, + }, + "/api/v1/last_blocks": []string{ + http.MethodGet, + }, + "/api/v1/version": []string{ + http.MethodGet, + }, + "/api/v1/network/connection": []string{ + http.MethodGet, + }, + "/api/v1/network/connections": []string{ + http.MethodGet, + }, + "/api/v1/network/connections/exchange": []string{ + http.MethodGet, + }, + "/api/v1/network/connections/trust": []string{ + http.MethodGet, + }, + "/api/v1/network/defaultConnections": []string{ + http.MethodGet, + }, + "/api/v1/network/connection/disconnect": []string{ + http.MethodPost, + }, + "/api/v1/outputs": []string{ + http.MethodGet, + http.MethodPost, + }, + "/api/v1/pendingTxs": []string{ + http.MethodGet, + }, + "/api/v1/rawtx": []string{ + http.MethodGet, + }, + "/api/v1/richlist": []string{ + http.MethodGet, + }, + "/api/v1/resendUnconfirmedTxns": []string{ + http.MethodPost, + }, + "/api/v1/transaction": []string{ + http.MethodGet, + }, + "/api/v1/transactions": []string{ + http.MethodGet, + http.MethodPost, + }, + "/api/v1/uxout": []string{ + http.MethodGet, + }, + "/api/v1/wallet": []string{ + http.MethodGet, + }, + "/api/v1/wallet/balance": []string{ + http.MethodGet, + }, + "/api/v1/wallet/create": []string{ + http.MethodPost, + }, + "/api/v1/wallet/newAddress": []string{ + http.MethodPost, + }, + "/api/v1/wallet/newSeed": []string{ + http.MethodGet, + }, + "/api/v1/wallet/seed": []string{ + http.MethodPost, + }, + "/api/v1/wallet/transaction": []string{ + http.MethodPost, + }, + "/api/v1/wallet/transactions": []string{ + http.MethodGet, + }, + "/api/v1/wallet/unload": []string{ + http.MethodPost, + }, + "/api/v1/wallet/update": []string{ + http.MethodPost, + }, + "/api/v1/wallets": []string{ + http.MethodGet, + }, + "/api/v1/wallets/folderName": []string{ + http.MethodGet, + }, + + "/api/v2/transaction/verify": []string{ + http.MethodPost, + }, + "/api/v2/address/verify": []string{ + http.MethodPost, + }, + "/api/v2/wallet/recover": []string{ + http.MethodPost, + }, + "/api/v2/wallet/seed/verify": []string{ + http.MethodPost, + }, + "/api/v2/wallet/transaction/sign": []string{ + http.MethodPost, + }, + "/api/v2/transaction": []string{ + http.MethodPost, + }, + + "/api/v2/data": []string{ + http.MethodGet, + http.MethodPost, + http.MethodDelete, + }, +} + +func allEndpoints() []string { + endpoints := make([]string, len(endpointsMethods)) + i := 0 + for e := range endpointsMethods { + endpoints[i] = e + i++ + } + return endpoints +} + +// TestEnableGUI tests enable gui option, EnableGUI isn't part of Gateway API, +// we can't control the output by mocking the Gateway like other tests. Instead, +// we create a full webserver for each test case. +func TestEnableGUI(t *testing.T) { + tt := []struct { + name string + enableGUI bool + endpoint string + appLoc string + expectCode int + expectBody string + }{ + { + name: "disable gui GET /", + enableGUI: false, + endpoint: "/", + appLoc: "", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + { + name: "disable gui GET /invalid-path", + enableGUI: false, + endpoint: "/invalid-path", + appLoc: "", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + { + name: "enable gui GET /", + enableGUI: true, + endpoint: "/", + appLoc: "../gui/static", + expectCode: http.StatusOK, + expectBody: "", + }, + { + name: "enable gui GET /invalid-path", + enableGUI: true, + endpoint: "/invalid-path", + appLoc: "../gui/static", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + req, err := http.NewRequest(http.MethodGet, tc.endpoint, nil) + require.NoError(t, err) + + gateway := &MockGatewayer{} + + rr := httptest.NewRecorder() + cfg := defaultMuxConfig() + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + c := Config{ + EnableGUI: tc.enableGUI, + DisableCSRF: true, + StaticDir: tc.appLoc, + } + + host := "127.0.0.1:6423" + s, err := Create(host, c, gateway) + require.NoError(t, err) + + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + err := s.Serve() + if err != nil && err.Error() != fmt.Sprintf("accept tcp %s: use of closed network connection", host) { + require.NoError(t, err) + } + }() + + defer func() { + s.listener.Close() + wg.Wait() + }() + + url := fmt.Sprintf("http://%s/%s", host, tc.endpoint) + rsp, err := http.Get(url) //nolint:gosec + require.NoError(t, err) + + defer rsp.Body.Close() + require.Equal(t, tc.expectCode, rsp.StatusCode) + + body, err := ioutil.ReadAll(rr.Body) + require.NoError(t, err) + + if rsp.StatusCode != http.StatusOK { + require.Equal(t, tc.expectBody, string(body)) + } + }) + } +} + +func TestAPISetDisabled(t *testing.T) { + tf := func(t *testing.T, endpoint, method string, disableCSRF bool) { + req, err := http.NewRequest(method, endpoint, nil) + require.NoError(t, err) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2/") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + cfg := defaultMuxConfig() + cfg.disableCSRF = disableCSRF + cfg.enabledAPISets = map[string]struct{}{} // disable all API sets + + handler := newServerMux(cfg, &MockGatewayer{}) + + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + switch endpoint { + case "/api/v1/csrf", "/api/v1/version": // always enabled + require.Equal(t, http.StatusOK, rr.Code) + default: + require.Equal(t, http.StatusForbidden, rr.Code) + if isAPIV2 { + require.Equal(t, "{\n \"error\": {\n \"message\": \"Endpoint is disabled\",\n \"code\": 403\n }\n}", rr.Body.String()) + } else { + require.Equal(t, "403 Forbidden - Endpoint is disabled", strings.TrimSpace(rr.Body.String())) + } + } + } + + for e, methods := range endpointsMethods { + for _, m := range methods { + t.Run(fmt.Sprintf("%s %s", m, e), func(t *testing.T) { + tf(t, e, m, true) + }) + } + } + + t.Run("GET /api/v1/csrf", func(t *testing.T) { + tf(t, "/api/v1/csrf", http.MethodGet, false) + }) +} + +func TestCORS(t *testing.T) { + cases := []struct { + name string + origin string + hostWhitelist []string + valid bool + }{ + { + name: "options no whitelist", + origin: configuredHost, + valid: true, + }, + { + name: "options whitelist", + origin: "example.com", + hostWhitelist: []string{"example.com"}, + valid: true, + }, + { + name: "options no whitelist not whitelisted", + origin: "example.com", + valid: false, + }, + } + + for _, e := range append(allEndpoints(), "/api/v1/csrf") { + for _, tc := range cases { + for _, m := range []string{http.MethodPost, http.MethodGet} { + name := fmt.Sprintf("%s %s %s", tc.name, m, e) + t.Run(name, func(t *testing.T) { + cfg := defaultMuxConfig() + cfg.disableCSRF = false + cfg.hostWhitelist = tc.hostWhitelist + + req, err := http.NewRequest(http.MethodOptions, e, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + isAPIV2 := strings.HasPrefix(e, "/api/v2/") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + req.Header.Set("Origin", fmt.Sprintf("http://%s", tc.origin)) + req.Header.Set("Access-Control-Request-Method", m) + + requestHeaders := strings.ToLower(fmt.Sprintf("%s, Content-Type", CSRFHeaderName)) + req.Header.Set("Access-Control-Request-Headers", requestHeaders) + + handler := newServerMux(cfg, &MockGatewayer{}) + + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + resp := rr.Result() + + allowOrigins := resp.Header.Get("Access-Control-Allow-Origin") + allowHeaders := resp.Header.Get("Access-Control-Allow-Headers") + allowMethods := resp.Header.Get("Access-Control-Allow-Methods") + + if tc.valid { + require.Equal(t, fmt.Sprintf("http://%s", tc.origin), allowOrigins) + require.Equal(t, requestHeaders, strings.ToLower(allowHeaders)) + require.Equal(t, m, allowMethods) + } else { + require.Empty(t, allowOrigins) + require.Empty(t, allowHeaders) + require.Empty(t, allowMethods) + } + + allowCreds := resp.Header.Get("Access-Control-Allow-Credentials") + require.Empty(t, allowCreds) + }) + } + } + } +} + +func TestHTTPBasicAuthInvalid(t *testing.T) { + username := "foo" + badUsername := "foof" + password := "bar" + badPassword := "barb" + + userPassCombos := []struct { + u, p string + }{ + {}, + { + u: username, + }, + { + p: password, + }, + { + u: username, + p: password, + }, + } + + reqUserPassCombos := []struct { + u, p string + }{ + {}, + { + u: username, + }, + { + u: badUsername, + }, + { + p: password, + }, + { + p: badPassword, + }, + { + u: username, + p: password, + }, + { + u: badUsername, + p: badPassword, + }, + { + u: username, + p: badPassword, + }, + { + u: badUsername, + p: password, + }, + } + + type testCase struct { + username string + password string + reqUsername string + reqPassword string + authorized bool + } + + cases := []testCase{} + + for _, a := range userPassCombos { + for _, b := range reqUserPassCombos { + cases = append(cases, testCase{ + username: a.u, + password: a.p, + reqUsername: b.u, + reqPassword: b.p, + authorized: a.u == b.u && a.p == b.p, + }) + } + } + + for _, e := range append(allEndpoints(), []string{"/api/v1/csrf"}...) { + for _, tc := range cases { + name := fmt.Sprintf("u=%s p=%s ru=%s rp=%s auth=%v e=%s", tc.username, tc.password, tc.reqUsername, tc.reqPassword, tc.authorized, e) + t.Run(name, func(t *testing.T) { + // Use a made-up request method so that any authorized request + // is guaranteed to fail before it reaches the mock gateway, + // which will panic without the mocks configured + req, err := http.NewRequest("FOOBAR", e, nil) + require.NoError(t, err) + + req.SetBasicAuth(tc.reqUsername, tc.reqPassword) + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + cfg.username = tc.username + cfg.password = tc.password + + handler := newServerMux(cfg, &MockGatewayer{}) + + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + if !tc.authorized { + require.Equal(t, http.StatusUnauthorized, rr.Code) + if strings.HasPrefix(e, "/api/v2") { + require.Equal(t, "{\n \"error\": {\n \"message\": \"Unauthorized\",\n \"code\": 401\n }\n}", rr.Body.String()) + } else { + require.Equal(t, "401 Unauthorized", strings.TrimSpace(rr.Body.String())) + } + } else { + require.NotEqual(t, http.StatusUnauthorized, rr.Code) + } + }) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/empty.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/empty.go new file mode 100644 index 00000000..68976fb9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/empty.go @@ -0,0 +1,2 @@ +// Package integration implements API integration tests +package integration diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/integration_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/integration_test.go new file mode 100644 index 00000000..b91af085 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/integration_test.go @@ -0,0 +1,3848 @@ +// Package integration_test implements API integration tests +package integration_test + +import ( + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "path/filepath" + "reflect" + "sort" + "strconv" + "strings" + "testing" + "time" + + "github.com/andreyvit/diff" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/visor" +) + +/* Runs HTTP API tests against a running skycoin node + +Set envvar SKYCOIN_INTEGRATION_TESTS=1 to enable them +Set SKYCOIN_NODE_HOST to the node's address (defaults to http://127.0.0.1:6420) +Set SKYCOIN_INTEGRATION_TEST_MODE to either "stable" or "live" (defaults to "stable") + +Each test has two modes: + 1. against a stable, pinned blockchain + 2. against a live, active blockchain + +When running mode 1, API responses do not change. The exact responses are compared to saved responses on disk. +Make sure the skycoin node is running against the pinned blockchain data provided in this package's folder. + +When running mode 2, API responses may change (such as /coinSupply). The exact responses are not compared, +but the response is checked to be unmarshallable to a known JSON object. + +When update flag is set to true all tests pass +*/ + +const ( + testModeStable = "stable" + testModeLive = "live" + testModeDisableWalletAPI = "disable-wallet-api" + testModeEnableSeedAPI = "enable-seed-api" + testModeDisableGUI = "disable-gui" + + testFixturesDir = "testdata" +) + +type TestData struct { + actual interface{} + expected interface{} +} + +var update = flag.Bool("update", false, "update golden files") +var testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") + +func nodeAddress() string { + addr := os.Getenv("SKYCOIN_NODE_HOST") + if addr == "" { + return "http://127.0.0.1:6420" + } + return addr +} + +func nodeUsername() string { + return os.Getenv("SKYCOIN_NODE_USERNAME") +} + +func nodePassword() string { + return os.Getenv("SKYCOIN_NODE_PASSWORD") +} + +func newClient() *api.Client { + c := api.NewClient(nodeAddress()) + c.SetAuth(nodeUsername(), nodePassword()) + return c +} + +func mode(t *testing.T) string { + mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") + switch mode { + case "": + mode = testModeStable + case testModeLive, + testModeStable, + testModeDisableWalletAPI, + testModeEnableSeedAPI, + testModeDisableGUI: + default: + t.Fatal("Invalid test mode, must be stable, live or disable-wallet-api") + } + return mode +} + +func enabled() bool { + return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" +} + +func useCSRF(t *testing.T) bool { + x := os.Getenv("USE_CSRF") + if x == "" { + return false + } + + useCSRF, err := strconv.ParseBool(x) + require.NoError(t, err) + return useCSRF +} + +func doHeaderCheck(t *testing.T) bool { + x := os.Getenv("HEADER_CHECK") + if x == "" { + return false + } + + doHeaderCheck, err := strconv.ParseBool(x) + require.NoError(t, err) + return doHeaderCheck +} + +func doStable(t *testing.T) bool { + if enabled() && mode(t) == testModeStable { + return true + } + + t.Skip("Stable tests disabled") + return false +} + +func doLive(t *testing.T) bool { + if enabled() && mode(t) == testModeLive { + return true + } + + t.Skip("Live tests disabled") + return false +} + +func doDisableWalletAPI(t *testing.T) bool { + if enabled() && mode(t) == testModeDisableWalletAPI { + return true + } + + t.Skip("DisableWalletApi tests disabled") + return false +} + +func doEnableSeedAPI(t *testing.T) bool { + if enabled() && mode(t) == testModeEnableSeedAPI { + return true + } + + t.Skip("EnableSeedAPI tests disabled") + return false +} + +func doDisableGUI(t *testing.T) bool { + if enabled() && mode(t) == testModeDisableGUI { + return true + } + + t.Skip("DisableGUIAPI tests disabled") + return false +} + +func doLiveOrStable(t *testing.T) bool { + if enabled() { + switch mode(t) { + case testModeStable, testModeLive: + return true + } + } + + t.Skip("Live and stable tests disabled") + return false +} + +func doLiveWallet(t *testing.T) bool { + if *testLiveWallet { + return true + } + + t.Skip("Tests requiring wallet envvars are disabled") + return false +} + +func envParseBool(t *testing.T, key string) bool { + x := os.Getenv(key) + if x == "" { + return false + } + + v, err := strconv.ParseBool(x) + require.NoError(t, err) + return v +} + +func dbNoUnconfirmed(t *testing.T) bool { + return envParseBool(t, "DB_NO_UNCONFIRMED") +} + +func liveDisableNetworking(t *testing.T) bool { + return envParseBool(t, "LIVE_DISABLE_NETWORKING") +} + +func loadGoldenFile(t *testing.T, filename string, testData TestData) { + require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") + + goldenFile := filepath.Join(testFixturesDir, filename) + + if *update { + updateGoldenFile(t, goldenFile, testData.actual) + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + d := json.NewDecoder(f) + d.DisallowUnknownFields() + + err = d.Decode(testData.expected) + require.NoError(t, err, filename) +} + +func updateGoldenFile(t *testing.T, filename string, content interface{}) { + contentJSON, err := json.MarshalIndent(content, "", "\t") + require.NoError(t, err) + contentJSON = append(contentJSON, '\n') + err = ioutil.WriteFile(filename, contentJSON, 0644) + require.NoError(t, err) +} + +func checkGoldenFile(t *testing.T, goldenFile string, td TestData) { + loadGoldenFile(t, goldenFile, td) + require.Equal(t, reflect.Indirect(reflect.ValueOf(td.expected)).Interface(), td.actual) + + // Serialize expected to JSON and compare to the goldenFile's contents + // This will detect field changes that could be missed otherwise + b, err := json.MarshalIndent(td.expected, "", "\t") + require.NoError(t, err) + + goldenFile = filepath.Join(testFixturesDir, goldenFile) + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + c, err := ioutil.ReadAll(f) + require.NoError(t, err) + + sc := string(c) + sb := string(b) + "\n" + + require.Equal(t, sc, sb, "JSON struct output differs from golden file, was a field added to the struct?\nDiff:\n"+diff.LineDiff(sc, sb)) +} + +func assertResponseError(t *testing.T, err error, errCode int, errMsg string) { + require.Error(t, err) + require.IsType(t, api.ClientError{}, err) + require.Equal(t, errCode, err.(api.ClientError).StatusCode, err.(api.ClientError).Message) + require.Equal(t, errMsg, err.(api.ClientError).Message) +} + +func TestStableCoinSupply(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cs, err := c.CoinSupply() + require.NoError(t, err) + + var expected api.CoinSupply + checkGoldenFile(t, "coinsupply.golden", TestData{*cs, &expected}) +} + +func TestLiveCoinSupply(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cs, err := c.CoinSupply() + require.NoError(t, err) + + require.NotEmpty(t, cs.CurrentSupply) + require.NotEmpty(t, cs.TotalSupply) + require.NotEmpty(t, cs.MaxSupply) + require.Equal(t, "100000000.000000", cs.MaxSupply) + require.NotEmpty(t, cs.CurrentCoinHourSupply) + require.NotEmpty(t, cs.TotalCoinHourSupply) + require.Equal(t, 100, len(cs.UnlockedAddresses)+len(cs.LockedAddresses)) +} + +func TestVersion(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := newClient() + + v, err := c.Version() + require.NoError(t, err) + + require.NotEmpty(t, v.Version) +} + +func TestVerifyAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + addr string + errCode int + errMsg string + }{ + { + name: "valid address", + golden: "verify-address.golden", + addr: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }, + + { + name: "invalid address", + addr: "7apQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + errCode: http.StatusUnprocessableEntity, + errMsg: "Invalid checksum", + }, + + { + name: "missing address", + addr: "", + errCode: http.StatusBadRequest, + errMsg: "address is required", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + resp, err := c.VerifyAddress(tc.addr) + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected api.VerifyAddressResponse + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + }) + } +} + +func TestStableVerifyTransaction(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + badSigStr := "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + badSigBytes, err := hex.DecodeString(badSigStr) + require.NoError(t, err) + badSig := cipher.MustNewSig(badSigBytes) + + inputHash := "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e" + input := testutil.SHA256FromHex(t, inputHash) + + destAddrStr := "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD" + destAddr, err := cipher.DecodeBase58Address(destAddrStr) + require.NoError(t, err) + + inputAddrStr := "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5" + inputAddr, err := cipher.DecodeBase58Address(inputAddrStr) + require.NoError(t, err) + + badSignatureTxn := coin.Transaction{ + Sigs: []cipher.Sig{badSig}, + In: []cipher.SHA256{input}, + Out: []coin.TransactionOutput{ + { + Address: destAddr, + Coins: 1e3, + Hours: 10, + }, + { + Address: inputAddr, + Coins: 22100e6 - 1e3, + Hours: 188761, + }, + }, + } + err = badSignatureTxn.UpdateHeader() + require.NoError(t, err) + + cases := []struct { + name string + golden string + txn coin.Transaction + unsigned bool + errCode int + errMsg string + }{ + { + name: "unsigned=false invalid transaction empty", + txn: coin.Transaction{}, + golden: "verify-transaction-invalid-empty.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates soft constraint: Transaction has zero coinhour fee", + }, + + { + name: "unsigned=false invalid transaction bad signature", + txn: badSignatureTxn, + golden: "verify-transaction-invalid-bad-sig.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates hard constraint: Signature not valid for hash", + }, + + { + name: "unsigned=true invalid transaction empty", + txn: coin.Transaction{}, + unsigned: true, + golden: "verify-transaction-invalid-empty.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates soft constraint: Transaction has zero coinhour fee", + }, + + { + name: "unsigned=true invalid transaction bad signature", + txn: badSignatureTxn, + unsigned: true, + golden: "verify-transaction-invalid-bad-sig.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates hard constraint: Signature not valid for hash", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + resp, err := c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: tc.txn.MustSerializeHex(), + Unsigned: tc.unsigned, + }) + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + if tc.errCode != http.StatusUnprocessableEntity { + return + } + } + + if tc.errCode != http.StatusUnprocessableEntity { + require.NoError(t, err) + } + + var expected api.VerifyTransactionResponse + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + }) + } + +} + +func TestStableNoUnconfirmedOutputs(t *testing.T) { + if !doStable(t) || !dbNoUnconfirmed(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + addrs []string + hashes []string + errCode int + errMsg string + }{ + { + name: "no addrs or hashes", + golden: "no-unconfirmed-outputs-noargs.golden", + }, + { + name: "only addrs", + addrs: []string{ + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + }, + golden: "no-unconfirmed-outputs-addrs.golden", + }, + { + name: "only hashes", + hashes: []string{ + "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + }, + golden: "no-unconfirmed-outputs-hashes.golden", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, tc.addrs != nil && tc.hashes != nil) + + var outputs *readable.UnspentOutputsSummary + var err error + switch { + case tc.addrs == nil && tc.hashes == nil: + outputs, err = c.Outputs() + case tc.addrs != nil: + outputs, err = c.OutputsForAddresses(tc.addrs) + case tc.hashes != nil: + outputs, err = c.OutputsForHashes(tc.hashes) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected readable.UnspentOutputsSummary + checkGoldenFile(t, tc.golden, TestData{*outputs, &expected}) + + require.Equal(t, len(expected.HeadOutputs), len(outputs.HeadOutputs)) + require.Equal(t, len(expected.OutgoingOutputs), len(outputs.OutgoingOutputs)) + require.Equal(t, len(expected.IncomingOutputs), len(outputs.IncomingOutputs)) + + for i, o := range expected.HeadOutputs { + require.Equal(t, o, outputs.HeadOutputs[i], "mismatch at index %d", i) + } + }) + } +} + +func TestStableOutputs(t *testing.T) { + if !doStable(t) || dbNoUnconfirmed(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + addrs []string + hashes []string + errCode int + errMsg string + }{ + { + name: "no addrs or hashes", + golden: "outputs-noargs.golden", + }, + { + name: "only addrs", + addrs: []string{ + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + }, + golden: "outputs-addrs.golden", + }, + { + name: "only hashes", + hashes: []string{ + "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + }, + golden: "outputs-hashes.golden", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, tc.addrs != nil && tc.hashes != nil) + + var outputs *readable.UnspentOutputsSummary + var err error + switch { + case tc.addrs == nil && tc.hashes == nil: + outputs, err = c.Outputs() + case tc.addrs != nil: + outputs, err = c.OutputsForAddresses(tc.addrs) + case tc.hashes != nil: + outputs, err = c.OutputsForHashes(tc.hashes) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected readable.UnspentOutputsSummary + checkGoldenFile(t, tc.golden, TestData{*outputs, &expected}) + + require.Equal(t, len(expected.HeadOutputs), len(outputs.HeadOutputs)) + require.Equal(t, len(expected.OutgoingOutputs), len(outputs.OutgoingOutputs)) + require.Equal(t, len(expected.IncomingOutputs), len(outputs.IncomingOutputs)) + + for i, o := range expected.HeadOutputs { + require.Equal(t, o, outputs.HeadOutputs[i], "mismatch at index %d", i) + } + }) + } +} + +func TestLiveOutputs(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + // Request all outputs and check that HeadOutputs is not empty + // OutgoingOutputs and IncomingOutputs are variable and could be empty + outputs, err := c.Outputs() + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) + + outputs, err = c.OutputsForAddresses(nil) + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) + + outputs, err = c.OutputsForHashes(nil) + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) +} + +func TestStableBlock(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocks(t) +} + +// These blocks were affected by the coinhour overflow issue or by coinhour fee calculation bugs, +// make sure that they can be queried +var knownBadBlockSeqs = []uint64{ + // coinhour fee calculation mistake, related to distribution addresses: + 297, + 741, + 743, + 749, + 796, + 4956, + 10125, + // coinhour overflow related: + 11685, + 11707, + 11710, + 11709, + 11705, + 11708, + 11711, + 11706, + 11699, + 13277, +} + +func TestLiveBlock(t *testing.T) { + if !doLive(t) { + return + } + + if liveDisableNetworking(t) { + t.Skip("Skipping slow block tests when networking disabled") + return + } + + testKnownBlocks(t) + + // Check the knownBadBlockSeqs + c := newClient() + for _, seq := range knownBadBlockSeqs { + b, err := c.BlockBySeq(seq) + require.NoError(t, err) + require.Equal(t, seq, b.Head.BkSeq) + } +} + +func testKnownBlocks(t *testing.T) { + c := newClient() + + cases := []struct { + name string + golden string + hash string + seq uint64 + errCode int + errMsg string + }{ + { + name: "unknown hash", + hash: "80744ec25e6233f40074d35bf0bfdbddfac777869b954a96833cb89f44204444", + errCode: http.StatusNotFound, + errMsg: "404 Not Found", + }, + { + name: "valid hash", + golden: "block-hash.golden", + hash: "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + }, + { + name: "genesis hash", + golden: "block-hash-genesis.golden", + hash: "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + }, + { + name: "genesis seq", + golden: "block-seq-0.golden", + seq: 0, + }, + { + name: "seq 1", + golden: "block-seq-1.golden", + seq: 1, + }, + { + name: "seq 100", + golden: "block-seq-100.golden", + seq: 100, + }, + { + name: "unknown seq", + seq: 99999999999999, + errCode: http.StatusNotFound, + errMsg: "404 Not Found", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var b *readable.Block + var err error + + if tc.hash != "" { + b, err = c.BlockByHash(tc.hash) + } else { + b, err = c.BlockBySeq(tc.seq) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NotNil(t, b) + + var expected readable.Block + checkGoldenFile(t, tc.golden, TestData{*b, &expected}) + }) + } + + t.Logf("Querying every block in the blockchain") + + // Scan every block by seq + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var prevBlock *readable.Block + for i := uint64(0); i < progress.Current; i++ { + t.Run(fmt.Sprintf("block-seq-%d", i), func(t *testing.T) { + b, err := c.BlockBySeq(i) + require.NoError(t, err) + require.NotNil(t, b) + require.Equal(t, i, b.Head.BkSeq) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash, "%s != %s", prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHash(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, bHash) + + prevBlock = b + }) + } +} + +func TestStableBlockVerbose(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocksVerbose(t) +} + +func TestLiveBlockVerbose(t *testing.T) { + if !doLive(t) { + return + } + + if liveDisableNetworking(t) { + t.Skip("Skipping slow block tests when networking disabled") + return + } + + testKnownBlocksVerbose(t) + + // Check the knownBadBlockSeqs + c := newClient() + for _, seq := range knownBadBlockSeqs { + b, err := c.BlockBySeqVerbose(seq) + require.NoError(t, err) + require.Equal(t, seq, b.Head.BkSeq) + assertVerboseBlockFee(t, b) + } +} + +func testKnownBlocksVerbose(t *testing.T) { + c := newClient() + + cases := []struct { + name string + golden string + hash string + seq uint64 + errCode int + errMsg string + }{ + { + name: "unknown hash", + hash: "80744ec25e6233f40074d35bf0bfdbddfac777869b954a96833cb89f44204444", + errCode: http.StatusNotFound, + errMsg: "404 Not Found", + }, + { + name: "valid hash", + golden: "block-hash-verbose.golden", + hash: "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + }, + { + name: "genesis hash", + golden: "block-hash-verbose-genesis.golden", + hash: "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + }, + { + name: "genesis seq", + golden: "block-seq-verbose-0.golden", + seq: 0, + }, + { + name: "seq 1", + golden: "block-seq-verbose-1.golden", + seq: 1, + }, + { + name: "seq 100", + golden: "block-seq-verbose-100.golden", + seq: 100, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var b *readable.BlockVerbose + var err error + + if tc.hash != "" { + b, err = c.BlockByHashVerbose(tc.hash) + } else { + b, err = c.BlockBySeqVerbose(tc.seq) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NotNil(t, b) + assertVerboseBlockFee(t, b) + + var expected readable.BlockVerbose + checkGoldenFile(t, tc.golden, TestData{*b, &expected}) + }) + } + + t.Logf("Querying every block in the blockchain") + + // Scan every block by seq + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var prevBlock *readable.BlockVerbose + for i := uint64(0); i < progress.Current; i++ { + t.Run(fmt.Sprintf("block-seq-verbose-%d", i), func(t *testing.T) { + b, err := c.BlockBySeqVerbose(i) + require.NoError(t, err) + require.NotNil(t, b) + require.Equal(t, i, b.Head.BkSeq) + assertVerboseBlockFee(t, b) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, bHash) + + prevBlock = b + }) + } +} + +// assertVerboseBlockFee checks that the block's fee matches the calculated fee of the block's transactions +func assertVerboseBlockFee(t *testing.T, b *readable.BlockVerbose) { + fee := uint64(0) + for _, txn := range b.Body.Transactions { + var err error + fee, err = mathutil.AddUint64(fee, txn.Fee) + require.NoError(t, err) + } + + // The estimated transaction fees should equal the block fee, but in a few cases + // it doesn't due to older bugs in fee calculation + if b.Head.Fee != fee { + switch b.Head.BkSeq { + case 297: + require.Equal(t, b.Head.Fee, uint64(3477395194)) + require.Equal(t, fee, uint64(8601490771)) + case 741: + require.Equal(t, b.Head.Fee, uint64(2093567995)) + require.Equal(t, fee, uint64(17465854723)) + case 743: + require.Equal(t, b.Head.Fee, uint64(2093809661)) + require.Equal(t, fee, uint64(17466096389)) + case 749: + require.Equal(t, b.Head.Fee, uint64(1572050737)) + require.Equal(t, fee, uint64(16944337465)) + case 796: + require.Equal(t, b.Head.Fee, uint64(3197771253)) + require.Equal(t, fee, uint64(13445962405)) + case 4956: + require.Equal(t, b.Head.Fee, uint64(2309386399)) + require.Equal(t, fee, uint64(22805768703)) + case 10125: + require.Equal(t, b.Head.Fee, uint64(1938082460)) + require.Equal(t, fee, uint64(22434464764)) + case 13277: + // In this case, the hours overflow, so the API reports calculated_hours and fee as 0 + require.Equal(t, b.Head.Fee, uint64(3)) + require.Equal(t, fee, uint64(0)) + default: + require.Equal(t, b.Head.Fee, fee, "Block seq=%d fee does not match sum of transaction fees %d != %d", b.Head.BkSeq, b.Head.Fee, fee) + } + } +} + +func TestStableBlockchainMetadata(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + metadata, err := c.BlockchainMetadata() + require.NoError(t, err) + + var expected readable.BlockchainMetadata + + goldenFile := "blockchain-metadata.golden" + if dbNoUnconfirmed(t) { + goldenFile = "blockchain-metadata-no-unconfirmed.golden" + } + + checkGoldenFile(t, goldenFile, TestData{*metadata, &expected}) +} + +func TestLiveBlockchainMetadata(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + metadata, err := c.BlockchainMetadata() + require.NoError(t, err) + + require.NotEqual(t, uint64(0), metadata.Head.BkSeq) +} + +func TestStableBlockchainProgress(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var expected readable.BlockchainProgress + checkGoldenFile(t, "blockchain-progress.golden", TestData{*progress, &expected}) +} + +func TestLiveBlockchainProgress(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + require.NotEqual(t, uint64(0), progress.Current) + + if liveDisableNetworking(t) { + require.Empty(t, progress.Peers) + require.Equal(t, progress.Current, progress.Highest) + } else { + require.NotEmpty(t, progress.Peers) + require.True(t, progress.Current <= progress.Highest) + } +} + +func TestStableBalance(t *testing.T) { + if !doStable(t) { + return + } + + type balanceTestCase struct { + name string + golden string + addrs []string + } + + c := newClient() + + cases := []balanceTestCase{ + { + name: "unknown address", + addrs: []string{"prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9"}, + golden: "balance-noaddrs.golden", + }, + { + name: "one address", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, + golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", + }, + { + name: "duplicate addresses", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, + golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", + }, + { + name: "two addresses", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5"}, + golden: "balance-two-addrs.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, balanceTestCase{ + name: "balance affected by unconfirmed transaction", + addrs: []string{"R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + golden: "balance-affected-by-unconfirmed-txns.golden", + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + balance, err := c.Balance(tc.addrs) + require.NoError(t, err) + + var expected api.BalanceResponse + checkGoldenFile(t, tc.golden, TestData{*balance, &expected}) + }) + } +} + +func TestLiveBalance(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + // Genesis address check, should not have a balance + b, err := c.Balance([]string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}) + require.NoError(t, err) + require.Equal(t, api.BalanceResponse{ + Addresses: readable.AddressBalances{ + "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6": readable.BalancePair{}, + }, + }, *b) + + // Balance of final distribution address. Should have the same coins balance + // for the next 15-20 years. + b, err = c.Balance([]string{"ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}) + require.NoError(t, err) + require.Equal(t, b.Confirmed, b.Predicted) + require.NotEmpty(t, b.Confirmed.Hours) + // Add 1e4 because someone sent 0.01 coins to it + expectedBalance := uint64(1e6*1e6 + 1e4) + require.Equal(t, expectedBalance, b.Confirmed.Coins) + + // Check that the balance is queryable for addresses known to be affected + // by the coinhour overflow problem + addrs := []string{ + "n7AR1VMW1pK7F9TxhYdnr3HoXEQ3g9iTNP", + "2aTzmXi9jyiq45oTRFCP9Y7dcvnT6Rsp7u", + "FjFLnus2ePxuaPTXFXfpw6cVAE5owT1t3P", + "KT9vosieyWhn9yWdY8w7UZ6tk31KH4NAQK", + } + for _, a := range addrs { + _, err := c.Balance([]string{a}) + require.NoError(t, err, "Failed to get balance of address %s", a) + } + _, err = c.Balance(addrs) + require.NoError(t, err) +} + +func TestStableUxOut(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + uxID string + }{ + { + name: "valid uxID", + golden: "uxout.golden", + uxID: "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.UxOut(tc.uxID) + require.NoError(t, err) + + var expected readable.SpentOutput + checkGoldenFile(t, tc.golden, TestData{*ux, &expected}) + }) + } + + // Scan all uxouts from the result of /outputs + scanUxOuts(t) +} + +func TestLiveUxOut(t *testing.T) { + if !doLive(t) { + return + } + + if liveDisableNetworking(t) { + t.Skip("Skipping slow ux out tests when networking disabled") + return + } + + c := newClient() + + // A spent uxout should never change + ux, err := c.UxOut("fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20") + require.NoError(t, err) + + var expected readable.SpentOutput + checkGoldenFile(t, "uxout-spent.golden", TestData{*ux, &expected}) + require.NotEqual(t, uint64(0), ux.SpentBlockSeq) + + // Scan all uxouts from the result of /outputs + scanUxOuts(t) +} + +func scanUxOuts(t *testing.T) { + c := newClient() + + outputs, err := c.Outputs() + require.NoError(t, err) + + for _, ux := range outputs.HeadOutputs { + t.Run(ux.Hash, func(t *testing.T) { + foundUx, err := c.UxOut(ux.Hash) + require.NoError(t, err) + + require.Equal(t, ux.Hash, foundUx.Uxid) + require.Equal(t, ux.Time, foundUx.Time) + require.Equal(t, ux.BkSeq, foundUx.SrcBkSeq) + require.Equal(t, ux.SourceTransaction, foundUx.SrcTx) + require.Equal(t, ux.Address, foundUx.OwnerAddress) + require.Equal(t, ux.Hours, foundUx.Hours) + coinsStr, err := droplet.ToString(foundUx.Coins) + require.NoError(t, err) + require.Equal(t, ux.Coins, coinsStr) + + if foundUx.SpentBlockSeq == 0 { + require.Equal(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxnID) + } else { + require.NotEqual(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxnID) + } + }) + } +} + +func TestStableAddressUxOuts(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + errCode int + errMsg string + golden string + addr string + }{ + { + name: "no addresses", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - address is empty", + }, + { + name: "unknown address", + addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", + golden: "uxout-noaddr.golden", + }, + { + name: "one address", + addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + golden: "uxout-addr.golden", + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.AddressUxOuts(tc.addr) + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + require.NoError(t, err) + var expected []readable.SpentOutput + checkGoldenFile(t, tc.golden, TestData{ux, &expected}) + }) + } +} + +func TestLiveAddressUxOuts(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cases := []struct { + name string + errCode int + errMsg string + addr string + moreThanZero bool + }{ + { + name: "no addresses", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - address is empty", + }, + { + name: "invalid address length", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - Invalid address length", + addr: "prRXwTcDK24hs6AFxj", + }, + { + name: "unknown address", + addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", + }, + { + name: "one address", + addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.AddressUxOuts(tc.addr) + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + require.NoError(t, err) + if tc.moreThanZero { + require.NotEqual(t, 0, len(ux)) + } + }) + } +} + +func TestStableBlocksInRange(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var lastNBlocks uint64 = 10 + require.True(t, progress.Current > lastNBlocks+1) + + cases := []struct { + name string + golden string + start uint64 + end uint64 + errCode int + errMsg string + }{ + { + name: "first 10", + golden: "blocks-first-10.golden", + start: 1, + end: 10, + }, + { + name: "last 10", + golden: "blocks-last-10.golden", + start: progress.Current - lastNBlocks, + end: progress.Current, + }, + { + name: "first block", + golden: "blocks-first-1.golden", + start: 1, + end: 1, + }, + { + name: "all blocks", + golden: "blocks-all.golden", + start: 0, + end: progress.Current, + }, + { + name: "start > end", + golden: "blocks-end-less-than-start.golden", + start: 10, + end: 9, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocksInRange(t, tc.start, tc.end) + + var expected readable.Blocks + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + _, err := c.BlocksInRange(tc.start, tc.end) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocksInRange(t *testing.T) { + if !doLive(t) { + return + } + + testBlocksInRange(t, 1, 10) +} + +func testBlocksInRange(t *testing.T, start, end uint64) *readable.Blocks { + c := newClient() + + blocks, err := c.BlocksInRange(start, end) + require.NoError(t, err) + + if start > end { + require.Empty(t, blocks.Blocks) + } else { + require.Len(t, blocks.Blocks, int(end-start+1)) + } + + var prevBlock *readable.Block + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHash(b.Head.Hash) + require.Equal(t, uint64(idx)+start, b.Head.BkSeq) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } + + return blocks +} + +func TestStableBlocksInRangeVerbose(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var lastNBlocks uint64 = 10 + require.True(t, progress.Current > lastNBlocks+1) + + cases := []struct { + name string + golden string + start uint64 + end uint64 + errCode int + errMsg string + }{ + { + name: "genesis", + golden: "blocks-verbose-genesis.golden", + start: 0, + end: 0, + }, + { + name: "first 10", + golden: "blocks-verbose-first-10.golden", + start: 1, + end: 10, + }, + { + name: "last 10", + golden: "blocks-verbose-last-10.golden", + start: progress.Current - lastNBlocks, + end: progress.Current, + }, + { + name: "first block", + golden: "blocks-verbose-first-1.golden", + start: 1, + end: 1, + }, + { + name: "all blocks", + golden: "blocks-verbose-all.golden", + start: 0, + end: progress.Current, + }, + { + name: "start > end", + golden: "blocks-verbose-end-less-than-start.golden", + start: 10, + end: 9, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocksInRangeVerbose(t, tc.start, tc.end) + + var expected readable.BlocksVerbose + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + blocks, err := c.BlocksInRangeVerbose(tc.start, tc.end) + require.Nil(t, blocks) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocksInRangeVerbose(t *testing.T) { + if !doLive(t) { + return + } + + testBlocksInRangeVerbose(t, 1, 10) +} + +func testBlocksInRangeVerbose(t *testing.T, start, end uint64) *readable.BlocksVerbose { + c := newClient() + + blocks, err := c.BlocksInRangeVerbose(start, end) + require.NoError(t, err) + + if start > end { + require.Empty(t, blocks.Blocks) + } else { + require.Len(t, blocks.Blocks, int(end-start+1)) + } + + var prevBlock *readable.BlockVerbose + for idx, b := range blocks.Blocks { + assertVerboseBlockFee(t, &b) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.Equal(t, uint64(idx)+start, b.Head.BkSeq) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } + + return blocks +} + +func TestStableBlocks(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + seqs []uint64 + errCode int + errMsg string + }{ + { + name: "multiple sequences", + golden: "blocks-3-5-7.golden", + seqs: []uint64{3, 5, 7}, + }, + { + name: "block seq not found", + seqs: []uint64{3, 5, 7, 99999}, + errCode: http.StatusNotFound, + errMsg: "404 Not Found - block does not exist seq=99999", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocks(t, tc.seqs) + + var expected readable.Blocks + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + _, err := c.Blocks(tc.seqs) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocks(t *testing.T) { + if !doLive(t) { + return + } + + testBlocks(t, []uint64{3, 5, 7}) +} + +func testBlocks(t *testing.T, seqs []uint64) *readable.Blocks { + c := newClient() + + blocks, err := c.Blocks(seqs) + require.NoError(t, err) + + require.Equal(t, len(seqs), len(blocks.Blocks)) + + seqsMap := make(map[uint64]struct{}, len(seqs)) + for _, x := range seqs { + seqsMap[x] = struct{}{} + } + + for _, b := range blocks.Blocks { + _, ok := seqsMap[b.Head.BkSeq] + require.True(t, ok) + delete(seqsMap, b.Head.BkSeq) + + bHash, err := c.BlockByHash(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + } + + require.Empty(t, seqsMap) + + return blocks +} + +func TestStableBlocksVerbose(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + seqs []uint64 + errCode int + errMsg string + }{ + { + name: "multiple sequences", + golden: "blocks-3-5-7-verbose.golden", + seqs: []uint64{3, 5, 7}, + }, + { + name: "block seq not found", + seqs: []uint64{3, 5, 7, 99999}, + errCode: http.StatusNotFound, + errMsg: "404 Not Found - block does not exist seq=99999", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocksVerbose(t, tc.seqs) + + var expected readable.BlocksVerbose + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + blocks, err := c.BlocksVerbose(tc.seqs) + require.Nil(t, blocks) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocksVerbose(t *testing.T) { + if !doLive(t) { + return + } + + testBlocksVerbose(t, []uint64{3, 5, 7}) +} + +func testBlocksVerbose(t *testing.T, seqs []uint64) *readable.BlocksVerbose { + c := newClient() + + blocks, err := c.BlocksVerbose(seqs) + require.NoError(t, err) + + require.Equal(t, len(seqs), len(blocks.Blocks)) + + seqsMap := make(map[uint64]struct{}, len(seqs)) + for _, x := range seqs { + seqsMap[x] = struct{}{} + } + + for _, b := range blocks.Blocks { + _, ok := seqsMap[b.Head.BkSeq] + require.True(t, ok) + delete(seqsMap, b.Head.BkSeq) + + assertVerboseBlockFee(t, &b) + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + } + + require.Empty(t, seqsMap) + + return blocks +} + +func TestStableLastBlocks(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + blocks, err := c.LastBlocks(1) + require.NoError(t, err) + + var expected *readable.Blocks + checkGoldenFile(t, "block-last.golden", TestData{blocks, &expected}) + + var prevBlock *readable.Block + blocks, err = c.LastBlocks(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHash(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestLiveLastBlocks(t *testing.T) { + if !doLive(t) { + return + } + c := newClient() + var prevBlock *readable.Block + blocks, err := c.LastBlocks(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHash(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestStableLastBlocksVerbose(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + blocks, err := c.LastBlocksVerbose(1) + require.NoError(t, err) + + var expected *readable.BlocksVerbose + checkGoldenFile(t, "block-last-verbose.golden", TestData{blocks, &expected}) + + blocks, err = c.LastBlocksVerbose(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + + var prevBlock *readable.BlockVerbose + for idx, b := range blocks.Blocks { + assertVerboseBlockFee(t, &b) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestLiveLastBlocksVerbose(t *testing.T) { + if !doLive(t) { + return + } + c := newClient() + + blocks, err := c.LastBlocksVerbose(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + + var prevBlock *readable.BlockVerbose + for idx, b := range blocks.Blocks { + assertVerboseBlockFee(t, &b) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestStableNetworkConnections(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + connections, err := c.NetworkConnections(nil) + require.NoError(t, err) + require.Empty(t, connections.Connections) + + connection, err := c.NetworkConnection("127.0.0.1:4444") + assertResponseError(t, err, http.StatusNotFound, "404 Not Found") + require.Nil(t, connection) +} + +func TestLiveNetworkConnections(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + connections, err := c.NetworkConnections(nil) + require.NoError(t, err) + + if liveDisableNetworking(t) { + require.Empty(t, connections.Connections) + return + } + + require.NotEmpty(t, connections.Connections) + + checked := false + + for _, cc := range connections.Connections { + connection, err := c.NetworkConnection(cc.Addr) + + // The connection may have disconnected by now + if err != nil { + assertResponseError(t, err, http.StatusNotFound, "404 Not Found") + continue + } + + require.NoError(t, err) + require.NotEmpty(t, cc.Addr) + require.Equal(t, cc.Addr, connection.Addr) + require.Equal(t, cc.GnetID, connection.GnetID) + require.Equal(t, cc.ListenPort, connection.ListenPort) + require.Equal(t, cc.Mirror, connection.Mirror) + + switch cc.State { + case daemon.ConnectionStateIntroduced: + // If the connection was introduced it should stay introduced + require.Equal(t, daemon.ConnectionStateIntroduced, connection.State) + case daemon.ConnectionStateConnected: + // If the connection was connected it should stay connected or have become introduced + require.NotEqual(t, daemon.ConnectionStatePending, connection.State) + } + + // The GnetID should be 0 if pending, otherwise it should not be 0 + if cc.State == daemon.ConnectionStatePending { + require.Equal(t, uint64(0), cc.GnetID) + } else { + require.NotEmpty(t, cc.GnetID) + } + + require.Equal(t, cc.Outgoing, connection.Outgoing) + require.True(t, cc.LastReceived <= connection.LastReceived) + require.True(t, cc.LastSent <= connection.LastSent) + require.Equal(t, cc.ConnectedAt, connection.ConnectedAt) + + checked = true + } + + // This could unfortunately occur if a connection disappeared in between the two calls, + // which will require a test re-run. + require.True(t, checked, "Was not able to find any connection by address, despite finding connections when querying all") + + connections, err = c.NetworkConnections(&api.NetworkConnectionsFilter{ + States: []daemon.ConnectionState{daemon.ConnectionStatePending}, + }) + require.NoError(t, err) + + for _, cc := range connections.Connections { + require.Equal(t, daemon.ConnectionStatePending, cc.State) + } + + connections, err = c.NetworkConnections(&api.NetworkConnectionsFilter{ + Direction: "incoming", + }) + require.NoError(t, err) + + for _, cc := range connections.Connections { + require.False(t, cc.Outgoing) + } +} + +func TestNetworkDefaultConnections(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := newClient() + connections, err := c.NetworkDefaultPeers() + require.NoError(t, err) + require.NotEmpty(t, connections) + sort.Strings(connections) + + var expected []string + checkGoldenFile(t, "network-default-peers.golden", TestData{connections, &expected}) +} + +func TestNetworkTrustedConnections(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := newClient() + connections, err := c.NetworkTrustedPeers() + require.NoError(t, err) + require.NotEmpty(t, connections) + sort.Strings(connections) + + var expected []string + checkGoldenFile(t, "network-trusted-peers.golden", TestData{connections, &expected}) +} + +func TestStableNetworkExchangeableConnections(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + connections, err := c.NetworkExchangedPeers() + require.NoError(t, err) + + var expected []string + checkGoldenFile(t, "network-exchanged-peers.golden", TestData{connections, &expected}) +} + +func TestLiveNetworkExchangeableConnections(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + _, err := c.NetworkExchangedPeers() + require.NoError(t, err) +} + +type transactionTestCase struct { + name string + txID string + err api.ClientError + goldenFile string +} + +func TestLiveTransaction(t *testing.T) { + if !doLive(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txID", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "empty txID", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + }, + { + name: "OK", + txID: "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + goldenFile: "transaction-block-517.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.Transaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + // tx.Status.Height is how many blocks are above this transaction, + // make sure it is past some checkpoint height + require.True(t, tx.Status.Height >= 50836) + + // readable.TransactionWithStatus.Status.Height is not stable + tx.Status.Height = 0 + + var expected readable.TransactionWithStatus + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, &expected, tx) + }) + } +} + +func TestStableTransaction(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txId", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + goldenFile: "", + }, + { + name: "not exist", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found", + }, + goldenFile: "", + }, + { + name: "empty txId", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + goldenFile: "", + }, + { + name: "genesis transaction", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + goldenFile: "genesis-transaction.golden", + }, + { + name: "transaction in block 101", + txID: "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + goldenFile: "transaction-block-101.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionTestCase{ + name: "unconfirmed", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + goldenFile: "transaction-unconfirmed.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.Transaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + var expected readable.TransactionWithStatus + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, &expected, tx) + }) + } +} + +func TestLiveTransactionVerbose(t *testing.T) { + if !doLive(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txID", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "empty txID", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + }, + { + name: "OK", + txID: "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + goldenFile: "transaction-verbose-block-517.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.TransactionVerbose(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + // tx.Status.Height is how many blocks are above this transaction, + // make sure it is past some checkpoint height + require.True(t, tx.Status.Height >= 50836) + + // readable.TransactionWithStatus.Status.Height is not stable + tx.Status.Height = 0 + + var expected readable.TransactionWithStatusVerbose + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, &expected, tx) + }) + } +} + +func TestStableTransactionVerbose(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txId", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + goldenFile: "", + }, + { + name: "not exist", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found", + }, + goldenFile: "", + }, + { + name: "empty txId", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + goldenFile: "", + }, + { + name: "genesis transaction", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + goldenFile: "genesis-transaction-verbose.golden", + }, + { + name: "transaction in block 101", + txID: "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + goldenFile: "transaction-verbose-block-101.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionTestCase{ + name: "unconfirmed", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + goldenFile: "transaction-unconfirmed-verbose.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.TransactionVerbose(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + var expected readable.TransactionWithStatusVerbose + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, &expected, tx) + }) + } +} + +func TestLiveTransactionEncoded(t *testing.T) { + if !doLive(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txID", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "empty txID", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + }, + { + name: "OK", + txID: "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + goldenFile: "transaction-encoded.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testTransactionEncoded(t, c, tc, false) + }) + } +} + +func TestStableTransactionEncoded(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txId", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + goldenFile: "", + }, + { + name: "not exist", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found", + }, + goldenFile: "", + }, + { + name: "empty txId", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + goldenFile: "", + }, + { + name: "genesis transaction", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + goldenFile: "genesis-transaction-encoded.golden", + }, + { + name: "transaction in block 101", + txID: "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + goldenFile: "transaction-encoded-block-101.golden", + }, + { + name: "transaction in block 105", + txID: "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + goldenFile: "transaction-encoded-block-105.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionTestCase{ + name: "unconfirmed", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + goldenFile: "transaction-unconfirmed-encoded.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testTransactionEncoded(t, c, tc, true) + }) + } +} + +func testTransactionEncoded(t *testing.T, c *api.Client, tc transactionTestCase, stable bool) { + encodedTxn, err := c.TransactionEncoded(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + if !stable { + encodedTxn.Status.Height = 0 + } + + decodedTxn, err := coin.DeserializeTransactionHex(encodedTxn.EncodedTransaction) + require.NoError(t, err) + + txnResult, err := readable.NewTransactionWithStatus(&visor.Transaction{ + Transaction: decodedTxn, + Status: visor.TransactionStatus{ + Confirmed: encodedTxn.Status.Confirmed, + Height: encodedTxn.Status.Height, + BlockSeq: encodedTxn.Status.BlockSeq, + }, + Time: encodedTxn.Time, + }) + require.NoError(t, err) + + txn, err := c.Transaction(tc.txID) + require.NoError(t, err) + + if !stable { + txn.Status.Height = 0 + } + + require.Equal(t, txn, txnResult) + + var expected api.TransactionEncodedResponse + loadGoldenFile(t, tc.goldenFile, TestData{encodedTxn, &expected}) + require.Equal(t, &expected, encodedTxn) +} + +func TestLiveTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + addrs := []string{ + "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + } + txns, err := c.Transactions(addrs) + require.NoError(t, err) + require.True(t, len(txns) > 0) + assertNoTransactionsDupes(t, txns) + + // Two addresses with a mutual transaction between the two, to test deduplication + addrs = []string{ + "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + } + txns, err = c.Transactions(addrs) + require.NoError(t, err) + // There were 4 transactions amonst these two addresses at the time this was written + require.True(t, len(txns) >= 4) + assertNoTransactionsDupes(t, txns) +} + +type transactionsTestCase struct { + name string + addrs []string + err api.ClientError + goldenFile string +} + +func TestStableTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txId is empty", + }, + goldenFile: "empty-addrs-transactions.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "single-addr-transactions.golden", + }, + { + name: "genesis", + addrs: []string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}, + goldenFile: "genesis-addr-transactions.golden", + }, + { + name: "multiple addrs", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + goldenFile: "multiple-addr-transactions.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionsTestCase{ + name: "confirmed and unconfirmed transactions", + addrs: []string{"212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + goldenFile: "confirmed-and-unconfirmed-transactions.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.Transactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupes(t, txnResult) + + var expected []readable.TransactionWithStatus + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestLiveConfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cTxsSingle, err := c.ConfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(cTxsSingle) > 0) + assertNoTransactionsDupes(t, cTxsSingle) + + cTxsAll, err := c.ConfirmedTransactions([]string{}) + require.NoError(t, err) + require.True(t, len(cTxsAll) > 0) + require.True(t, len(cTxsAll) > len(cTxsSingle)) + assertNoTransactionsDupes(t, cTxsAll) +} + +func TestStableConfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "empty-addrs-transactions.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "single-addr-transactions.golden", + }, + { + name: "genesis", + addrs: []string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}, + goldenFile: "genesis-addr-transactions.golden", + }, + { + name: "multiple addrs", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + goldenFile: "multiple-addr-transactions.golden", + }, + { + name: "unconfirmed should be excluded", + addrs: []string{"212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + goldenFile: "unconfirmed-excluded-from-transactions.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.ConfirmedTransactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupes(t, txnResult) + + var expected []readable.TransactionWithStatus + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestStableUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + } + + if dbNoUnconfirmed(t) { + cases = append(cases, transactionsTestCase{ + name: "empty addrs", + addrs: []string{}, + goldenFile: "no-unconfirmed-txns.golden", + }) + } else { + cases = append(cases, transactionsTestCase{ + name: "empty addrs (all unconfirmed txns)", + addrs: []string{}, + goldenFile: "all-unconfirmed-txns.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.UnconfirmedTransactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupes(t, txnResult) + + var expected []readable.TransactionWithStatus + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestLiveUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cTxsSingle, err := c.UnconfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(cTxsSingle) >= 0) + assertNoTransactionsDupes(t, cTxsSingle) + + cTxsAll, err := c.UnconfirmedTransactions([]string{}) + require.NoError(t, err) + require.True(t, len(cTxsAll) >= 0) + require.True(t, len(cTxsAll) >= len(cTxsSingle)) + assertNoTransactionsDupes(t, cTxsAll) +} + +func assertNoTransactionsDupes(t *testing.T, r []readable.TransactionWithStatus) { + txids := make(map[string]struct{}) + + for _, x := range r { + _, ok := txids[x.Transaction.Hash] + require.False(t, ok) + txids[x.Transaction.Hash] = struct{}{} + } +} + +func TestLiveTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + addrs := []string{ + "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + } + txns, err := c.TransactionsVerbose(addrs) + require.NoError(t, err) + require.True(t, len(txns) > 0) + assertNoTransactionsDupesVerbose(t, txns) +} + +func TestStableTransactionsVerbose(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "empty-addrs-transactions-verbose.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "single-addr-transactions-verbose.golden", + }, + { + name: "genesis", + addrs: []string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}, + goldenFile: "genesis-addr-transactions-verbose.golden", + }, + { + name: "multiple addrs", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + goldenFile: "multiple-addr-transactions-verbose.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionsTestCase{ + name: "confirmed and unconfirmed transactions", + addrs: []string{"212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + goldenFile: "confirmed-and-unconfirmed-transactions-verbose.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.TransactionsVerbose(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupesVerbose(t, txnResult) + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestLiveConfirmedTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cTxsSingle, err := c.ConfirmedTransactionsVerbose([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(cTxsSingle) > 0) + assertNoTransactionsDupesVerbose(t, cTxsSingle) + + cTxsAll, err := c.ConfirmedTransactionsVerbose([]string{}) + require.NoError(t, err) + require.True(t, len(cTxsAll) > 0) + require.True(t, len(cTxsAll) > len(cTxsSingle)) + assertNoTransactionsDupesVerbose(t, cTxsAll) +} + +func TestStableConfirmedTransactionsVerbose(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "empty-addrs-transactions-verbose.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "single-addr-transactions-verbose.golden", + }, + { + name: "genesis", + addrs: []string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}, + goldenFile: "genesis-addr-transactions-verbose.golden", + }, + { + name: "multiple addrs", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + goldenFile: "multiple-addr-transactions-verbose.golden", + }, + { + name: "unconfirmed should be excluded", + addrs: []string{"212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + goldenFile: "unconfirmed-excluded-from-transactions-verbose.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.ConfirmedTransactionsVerbose(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupesVerbose(t, txnResult) + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestStableUnconfirmedTransactionsVerbose(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + } + + if dbNoUnconfirmed(t) { + cases = append(cases, transactionsTestCase{ + name: "empty addrs", + addrs: []string{}, + goldenFile: "no-unconfirmed-txns.golden", + }) + } else { + cases = append(cases, transactionsTestCase{ + name: "empty addrs (all unconfirmed txns)", + addrs: []string{}, + goldenFile: "all-unconfirmed-txns-verbose.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.UnconfirmedTransactionsVerbose(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupesVerbose(t, txnResult) + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func assertNoTransactionsDupesVerbose(t *testing.T, r []readable.TransactionWithStatusVerbose) { + txids := make(map[string]struct{}) + + for _, x := range r { + _, ok := txids[x.Transaction.Hash] + require.False(t, ok) + txids[x.Transaction.Hash] = struct{}{} + } +} + +func TestLiveUnconfirmedTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + c := newClient() + + cTxsSingle, err := c.UnconfirmedTransactionsVerbose([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(cTxsSingle) >= 0) + + cTxsAll, err := c.UnconfirmedTransactionsVerbose([]string{}) + require.NoError(t, err) + require.True(t, len(cTxsAll) >= 0) + require.True(t, len(cTxsAll) >= len(cTxsSingle)) +} + +func TestStableResendUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + c := newClient() + _, err := c.ResendUnconfirmedTransactions() + require.NotNil(t, err) + respErr, ok := err.(api.ClientError) + require.True(t, ok) + require.Equal(t, fmt.Sprintf("503 Service Unavailable - %s", daemon.ErrNetworkingDisabled), respErr.Message) + require.Equal(t, http.StatusServiceUnavailable, respErr.StatusCode) +} + +func TestLiveResendUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + c := newClient() + _, err := c.ResendUnconfirmedTransactions() + + if liveDisableNetworking(t) { + require.NotNil(t, err) + respErr, ok := err.(api.ClientError) + require.True(t, ok) + require.Equal(t, fmt.Sprintf("503 Service Unavailable - %s", daemon.ErrNetworkingDisabled), respErr.Message) + require.Equal(t, http.StatusServiceUnavailable, respErr.StatusCode) + } else { + require.NoError(t, err) + } +} + +type rawTransactionTestCase struct { + name string + txID string + err api.ClientError + rawTxn string +} + +func TestStableRawTransaction(t *testing.T) { + if !doStable(t) { + return + } + + cases := []rawTransactionTestCase{ + { + name: "invalid hex length", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "not found", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found", + }, + }, + { + name: "odd length hex string", + txID: "abcdeffedca", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - encoding/hex: odd length hex string", + }, + }, + { + name: "OK", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + rawTxn: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, rawTransactionTestCase{ + name: "unconfirmed", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + rawTxn: "dc00000000f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124010000003981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f320001000000fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f2002000000003be2537f8c0893fddcddc878518f38ea493d949e008988068d0000002739570000000000009037ff169fbec6db95e2537e4ff79396c050aeeb00e40b54020000002739570000000000", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.RawTransaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + require.Equal(t, tc.rawTxn, txnResult, "case: "+tc.name) + }) + } +} + +func TestLiveRawTransaction(t *testing.T) { + if !doLive(t) { + return + } + + cases := []rawTransactionTestCase{ + { + name: "invalid hex length", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "odd length hex string", + txID: "abcdeffedca", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - encoding/hex: odd length hex string", + }, + }, + { + name: "OK - genesis tx", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + rawTxn: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", + }, + { + name: "OK", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + rawTxn: "3d0100000088b4e967d77a8b7155c5378a85c199fabf94048aa84833ef5eab7818545bcda80200000071985c70041fe5a6408a2dfac2ea4963820bc603059521259debb114b2f6630b5658e7ff665b2db7878ce9b0d1d051ec66b5dea23274e52642bc7e451b273a90008afb06133958b03c4795d5a7acd001f3942cc6d3b19e93d357d2675fe9ba8bbf3db30b3cda779e441fced581aee88f48c8af017b30dc276b15be25d4bb44260c000200000050386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf8993454767afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f70200000000ef3b60779f014b3c7acf27c16c9acc3ff3bea61600a8b54b06000000c2ba2400000000000037274869aaa4c2e2e5c91595024c65f8f9458102404b4c0000000000c2ba240000000000", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.RawTransaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + require.Equal(t, tc.rawTxn, txnResult, "case: "+tc.name) + }) + } +} + +type addressTransactionsTestCase struct { + name string + address string + golden string + errCode int + errMsg string +} + +func TestStableAddressTransactions(t *testing.T) { + // Formerly tested /api/v1/explorer/address, now tests /api/v1/transactions?verbose=1 + if !doStable(t) { + return + } + + cases := []addressTransactionsTestCase{ + { + name: "genesis address", + address: "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + golden: "address-transactions-2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6.golden", + }, + { + name: "address with transactions", + address: "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + golden: "address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden", + }, + { + name: "address without transactions", + address: "2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9", + golden: "address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden", + }, + { + name: "invalid address", + address: "prRXwTcDK24hs6AFxj", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - parse parameter: 'addrs' failed: address \"prRXwTcDK24hs6AFxj\" is invalid: Invalid address length", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, []addressTransactionsTestCase{ + { + name: "address with outgoing transaction", + address: "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + golden: "address-transactions-outgoing-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden", + }, + { + name: "address with incoming transaction", + address: "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + golden: "address-transactions-incoming-212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN.golden", + }, + }...) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := c.TransactionsVerbose([]string{tc.address}) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.golden, TestData{txns, &expected}) + }) + } +} + +func TestLiveAddressTransactions(t *testing.T) { + // Formerly tested /api/v1/explorer/address, now tests /api/v1/transactions?verbose=1 + if !doLive(t) { + return + } + + cases := []addressTransactionsTestCase{ + { + name: "address with transactions", + // This is the first distribution address which has spent all of its coins + // Its transactions list should not change, unless someone sends coins to it + address: "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + golden: "address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden", + }, + { + name: "address without transactions", + // This is a randomly generated address, never used + // It should never see new transactions + // (if it ever does, somebody managed to generate this address for use and there is a serious bug) + address: "2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D", + golden: "address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden", + }, + { + name: "invalid address", + address: "prRXwTcDK24hs6AFxj", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - parse parameter: 'addrs' failed: address \"prRXwTcDK24hs6AFxj\" is invalid: Invalid address length", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := c.TransactionsVerbose([]string{tc.address}) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + // Unset height since it is not stable + for i := range txns { + txns[i].Status.Height = 0 + } + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.golden, TestData{txns, &expected}) + }) + } +} + +func TestStableRichlist(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + richlist, err := c.Richlist(nil) + require.NoError(t, err) + + var expected api.Richlist + checkGoldenFile(t, "richlist-default.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 0, + IncludeDistribution: false, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-all.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 0, + IncludeDistribution: true, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-all-include-distribution.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 8, + IncludeDistribution: false, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-8.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 150, + IncludeDistribution: true, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-150-include-distribution.golden", TestData{*richlist, &expected}) +} + +func TestLiveRichlist(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + richlist, err := c.Richlist(nil) + require.NoError(t, err) + + require.NotEmpty(t, richlist.Richlist) + require.Len(t, richlist.Richlist, 20) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 150, + IncludeDistribution: true, + }) + require.NoError(t, err) + + require.Len(t, richlist.Richlist, 150) +} + +func TestStableAddressCount(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + count, err := c.AddressCount() + require.NoError(t, err) + + require.Equal(t, uint64(155), count) +} + +func TestLiveAddressCount(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + count, err := c.AddressCount() + require.NoError(t, err) + + // 5296 addresses as of 2018-03-06, the count could decrease but is unlikely to + require.True(t, count > 5000) +} + +func TestStableNoUnconfirmedPendingTransactions(t *testing.T) { + if !doStable(t) || !dbNoUnconfirmed(t) { + return + } + + c := newClient() + + txns, err := c.PendingTransactions() + require.NoError(t, err) + require.Empty(t, txns) +} + +func TestStablePendingTransactions(t *testing.T) { + if !doStable(t) || dbNoUnconfirmed(t) { + return + } + + c := newClient() + + txns, err := c.PendingTransactions() + require.NoError(t, err) + + // Convert Received and Checked times to UTC for stable comparison + for i, txn := range txns { + require.False(t, txn.Received.IsZero()) + require.False(t, txn.Checked.IsZero()) + + txns[i].Received = txn.Received.UTC() + txns[i].Checked = txn.Checked.UTC() + } + + var expect []readable.UnconfirmedTransactions + checkGoldenFile(t, "pending-transactions.golden", TestData{txns, &expect}) +} + +func TestLivePendingTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + _, err := c.PendingTransactions() + require.NoError(t, err) +} + +func TestStableNoUnconfirmedPendingTransactionsVerbose(t *testing.T) { + if !doStable(t) || !dbNoUnconfirmed(t) { + return + } + + c := newClient() + + txns, err := c.PendingTransactionsVerbose() + require.NoError(t, err) + require.Empty(t, txns) +} + +func TestStablePendingTransactionsVerbose(t *testing.T) { + if !doStable(t) || dbNoUnconfirmed(t) { + return + } + + c := newClient() + + txns, err := c.PendingTransactionsVerbose() + require.NoError(t, err) + + // Convert Received and Checked times to UTC for stable comparison + for i, txn := range txns { + require.False(t, txn.Received.IsZero()) + require.False(t, txn.Checked.IsZero()) + + txns[i].Received = txn.Received.UTC() + txns[i].Checked = txn.Checked.UTC() + } + + var expect []readable.UnconfirmedTransactionVerbose + checkGoldenFile(t, "verbose-pending-transactions.golden", TestData{txns, &expect}) +} + +func TestLivePendingTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + _, err := c.PendingTransactionsVerbose() + require.NoError(t, err) +} + +func TestDisableWalletAPI(t *testing.T) { + if !doDisableWalletAPI(t) { + return + } + + changeAddress := testutil.MakeAddress().String() + + type testCase struct { + name string + method string + endpoint string + contentType string + body func() io.Reader + json func() interface{} + expectErr string + code int + } + + tt := []testCase{ + { + name: "get wallet", + method: http.MethodGet, + endpoint: "/api/v1/wallet?id=test.wlt", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "create wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/create", + body: func() io.Reader { + v := url.Values{} + v.Add("seed", "seed") + v.Add("label", "label") + v.Add("scan", "1") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "generate new address", + method: http.MethodPost, + endpoint: "/api/v1/wallet/newAddress", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallet balance", + method: http.MethodGet, + endpoint: "/api/v1/wallet/balance?id=test.wlt", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallet unconfirmed transactions", + method: http.MethodGet, + endpoint: "/api/v1/wallet/transactions?id=test.wlt", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "update wallet label", + method: http.MethodPost, + endpoint: "/api/v1/wallet/update", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("label", "label") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "new seed", + method: http.MethodGet, + endpoint: "/api/v1/wallet/newSeed", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "new seed", + method: http.MethodPost, + endpoint: "/api/v1/wallet/seed", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallets", + method: http.MethodGet, + endpoint: "/api/v1/wallets", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallets folder name", + method: http.MethodGet, + endpoint: "/api/v1/wallets/folderName", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "main index.html 404 not found", + method: http.MethodGet, + endpoint: "/api/v1/", + expectErr: "404 Not Found", + code: http.StatusNotFound, + }, + { + name: "encrypt wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/encrypt", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "decrypt wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/decrypt", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallet seed", + method: http.MethodPost, + endpoint: "/api/v1/wallet/seed", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "create transaction", + method: http.MethodPost, + endpoint: "/api/v1/wallet/transaction", + contentType: api.ContentTypeJSON, + json: func() interface{} { + return api.WalletCreateTransactionRequest{ + WalletID: "test.wlt", + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []api.Receiver{ + { + Address: changeAddress, + Coins: "0.001", + Hours: "1", + }, + }, + }, + } + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + } + + c := newClient() + for _, tc := range tt { + f := func(tc testCase) func(t *testing.T) { + return func(t *testing.T) { + var err error + switch tc.method { + case http.MethodGet: + err = c.Get(tc.endpoint, nil) + case http.MethodPost: + switch tc.contentType { + case api.ContentTypeJSON: + err = c.PostJSON(tc.endpoint, tc.json(), nil) + default: + err = c.PostForm(tc.endpoint, tc.body(), nil) + } + } + assertResponseError(t, err, tc.code, tc.expectErr) + } + } + + t.Run(tc.name, f(tc)) + } + + // Confirms that no new wallet is created + // API_WALLET_DIR environment variable is set in ci-script/integration-test-disable-wallet-api.sh + walletDir := os.Getenv("API_WALLET_DIR") + if walletDir == "" { + t.Fatal("API_WALLET_DIR is not set") + } + + // Confirms that the wallet directory does not exist + testutil.RequireFileNotExists(t, walletDir) +} + +func checkHealthResponse(t *testing.T, r *api.HealthResponse) { + require.NotEmpty(t, r.BlockchainMetadata.Unspents) + require.NotEmpty(t, r.BlockchainMetadata.Head.BkSeq) + require.NotEmpty(t, r.BlockchainMetadata.Head.Time) + require.NotEmpty(t, r.Version.Version) + require.True(t, r.Uptime.Duration > time.Duration(0)) + require.NotEmpty(t, r.CoinName) + require.NotEmpty(t, r.DaemonUserAgent) + + _, err := useragent.Parse(r.DaemonUserAgent) + require.NoError(t, err) +} + +func TestStableHealth(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + r, err := c.Health() + require.NoError(t, err) + + checkHealthResponse(t, r) + + require.Equal(t, 0, r.OpenConnections) + require.Equal(t, 0, r.IncomingConnections) + require.Equal(t, 0, r.OutgoingConnections) + + require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) + + // The stable node is always run with the commit and branch ldflags, so they should appear + require.NotEmpty(t, r.Version.Commit) + require.NotEmpty(t, r.Version.Branch) + + coinName := os.Getenv("COIN") + require.Equal(t, coinName, r.CoinName) + require.Equal(t, fmt.Sprintf("%s:%s", coinName, r.Version.Version), r.DaemonUserAgent) + + _, err = useragent.Parse(r.DaemonUserAgent) + require.NoError(t, err) + + require.Equal(t, useCSRF(t), r.CSRFEnabled) + require.Equal(t, doHeaderCheck(t), r.HeaderCheckEnabled) + require.True(t, r.CSPEnabled) + require.True(t, r.WalletAPIEnabled) + require.False(t, r.GUIEnabled) +} + +func TestLiveHealth(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + r, err := c.Health() + require.NoError(t, err) + + checkHealthResponse(t, r) + + if liveDisableNetworking(t) { + require.Equal(t, 0, r.OpenConnections) + require.Equal(t, 0, r.OutgoingConnections) + require.Equal(t, 0, r.IncomingConnections) + } else { + require.NotEqual(t, 0, r.OpenConnections) + } + + require.Equal(t, r.OutgoingConnections+r.IncomingConnections, r.OpenConnections) + + // The TimeSinceLastBlock can be any value, including negative values, due to clock skew + // The live node is not necessarily run with the commit and branch ldflags, so don't check them +} + +func TestDisableGUIAPI(t *testing.T) { + if !doDisableGUI(t) { + return + } + + c := newClient() + err := c.Get("/", nil) + assertResponseError(t, err, http.StatusNotFound, "404 Not Found") +} + +func TestInvalidAuth(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + user := nodeUsername() + pass := nodePassword() + + c := newClient() + + require.Equal(t, user, c.Username) + require.Equal(t, pass, c.Password) + + if user == "" && pass == "" { + // If neither user nor pass are set, assume the node is run without auth, + // and check that providing auth returns a 401 error + testInvalidAuthNoAuthConfigured(t) + } else { + // If either user or pass are set, assume the node is run with auth, + // and check that missing or invalid auth returns a 401 error + testInvalidAuthAuthConfigured(t) + } +} + +func testInvalidAuthAuthConfigured(t *testing.T) { + cases := []struct { + user string + pass string + }{ + {}, // both missing + { + user: nodeUsername(), // user right, pass missing + }, + { + pass: nodePassword(), // pass right, user missing + }, + { + user: nodeUsername() + "x", // user wrong, pass missing + }, + { + pass: nodePassword() + "x", // pass wrong, user missing + }, + { + user: nodeUsername() + "x", // both wrong + pass: nodePassword() + "x", + }, + { + user: nodeUsername(), // user right, pass wrong + pass: nodePassword() + "x", + }, + { + user: nodeUsername() + "x", // user wrong, pass right + pass: nodePassword(), + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("u=%s p=%s", tc.user, tc.pass) + t.Run(name, func(t *testing.T) { + c := newClient() + c.SetAuth(tc.user, tc.pass) + require.Equal(t, tc.user, c.Username) + require.Equal(t, tc.pass, c.Password) + + _, err := c.Health() + assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized") + }) + } +} + +func testInvalidAuthNoAuthConfigured(t *testing.T) { + cases := []struct { + user string + pass string + }{ + { + user: "foo", + }, + { + pass: "bar", + }, + { + user: "foo", + pass: "bar", + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("u=%s p=%s", tc.user, tc.pass) + t.Run(name, func(t *testing.T) { + c := newClient() + c.SetAuth(tc.user, tc.pass) + require.Equal(t, tc.user, c.Username) + require.Equal(t, tc.pass, c.Password) + + _, err := c.Health() + assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized") + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/storage_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/storage_test.go new file mode 100644 index 00000000..68d5a147 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/storage_test.go @@ -0,0 +1,80 @@ +package integration_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/kvstorage" +) + +func TestStableStorageGetAllValues(t *testing.T) { + if !doStable(t) { + return + } + + wantVals := map[string]string{ + "key": "val", + } + + c := newClient() + + err := c.AddStorageValue(kvstorage.TypeTxIDNotes, "key", "val") + require.NoError(t, err) + + vals, err := c.GetAllStorageValues(kvstorage.TypeTxIDNotes) + require.NoError(t, err) + require.Equal(t, wantVals, vals) +} + +func TestStableStorageGetValue(t *testing.T) { + if !doStable(t) { + return + } + + wantVal := "val" + + c := newClient() + + err := c.AddStorageValue(kvstorage.TypeTxIDNotes, "key", "val") + require.NoError(t, err) + + val, err := c.GetStorageValue(kvstorage.TypeTxIDNotes, "key") + require.NoError(t, err) + require.Equal(t, wantVal, val) +} + +func TestStableStorageAddValue(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + err := c.AddStorageValue(kvstorage.TypeTxIDNotes, "key", "val") + require.NoError(t, err) +} + +func TestStableStorageRemoveValue(t *testing.T) { + if !doStable(t) { + return + } + + wantVals := map[string]string{ + "key": "val", + } + + c := newClient() + + err := c.AddStorageValue(kvstorage.TypeTxIDNotes, "key", "val") + require.NoError(t, err) + err = c.AddStorageValue(kvstorage.TypeTxIDNotes, "key2", "val2") + require.NoError(t, err) + + err = c.RemoveStorageValue(kvstorage.TypeTxIDNotes, "key2") + require.NoError(t, err) + + vals, err := c.GetAllStorageValues(kvstorage.TypeTxIDNotes) + require.NoError(t, err) + require.Equal(t, wantVals, vals) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6.golden new file mode 100644 index 00000000..50c8707a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6.golden @@ -0,0 +1,1311 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "fee": 60, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78, + "calculated_hours": 78 + } + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "fee": 8, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + } + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "fee": 9, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + }, + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "fee": 1, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "fee": 0, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "fee": 0, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "fee": 0, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden new file mode 100644 index 00000000..b7f686a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden @@ -0,0 +1,633 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden new file mode 100644 index 00000000..fcb48875 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden @@ -0,0 +1,7192 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 2 + }, + "time": 1427927651, + "txn": { + "timestamp": 1427927651, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 3 + }, + "time": 1427927671, + "txn": { + "timestamp": 1427927671, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 4 + }, + "time": 1428793611, + "txn": { + "timestamp": 1428793611, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 5 + }, + "time": 1428798821, + "txn": { + "timestamp": 1428798821, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 26 + }, + "time": 1429011077, + "txn": { + "timestamp": 1429011077, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "fee": 3407635, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 4543507 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 27 + }, + "time": 1429011137, + "txn": { + "timestamp": 1429011137, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "fee": 425954, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 567938 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 38 + }, + "time": 1429058484, + "txn": { + "timestamp": 1429058484, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "fee": 2335473, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 3113963 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 40 + }, + "time": 1429058514, + "txn": { + "timestamp": 1429058514, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "fee": 36493, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 48655 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 41 + }, + "time": 1429058524, + "txn": { + "timestamp": 1429058524, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "fee": 4561, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 6081 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 45 + }, + "time": 1429071074, + "txn": { + "timestamp": 1429071074, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "fee": 2402820, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3203760 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 57 + }, + "time": 1429077584, + "txn": { + "timestamp": 1429077584, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "fee": 10088, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 13450 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 61 + }, + "time": 1429077654, + "txn": { + "timestamp": 1429077654, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "fee": 9118, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 12156 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 64 + }, + "time": 1429077694, + "txn": { + "timestamp": 1429077694, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "fee": 7026, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 9366 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 67 + }, + "time": 1429077874, + "txn": { + "timestamp": 1429077874, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "fee": 8718, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 11622 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 68 + }, + "time": 1429077914, + "txn": { + "timestamp": 1429077914, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "fee": 1090, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 69 + }, + "time": 1429077944, + "txn": { + "timestamp": 1429077944, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "fee": 137, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 181 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 70 + }, + "time": 1429077964, + "txn": { + "timestamp": 1429077964, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "fee": 18, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 22 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 77 + }, + "time": 1429147880, + "txn": { + "timestamp": 1429147880, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "fee": 5860904, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 7814538 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 81 + }, + "time": 1429164440, + "txn": { + "timestamp": 1429164440, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "fee": 754183, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 1005575 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 85 + }, + "time": 1429164620, + "txn": { + "timestamp": 1429164620, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "fee": 121202, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 161602 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 86 + }, + "time": 1429164720, + "txn": { + "timestamp": 1429164720, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "fee": 15150, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 20200 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 90 + }, + "time": 1429164810, + "txn": { + "timestamp": 1429164810, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "fee": 16229, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 21637 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 94 + }, + "time": 1429164870, + "txn": { + "timestamp": 1429164870, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "fee": 10977, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 14635 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 98 + }, + "time": 1429274566, + "txn": { + "timestamp": 1429274566, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "fee": 71088, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 94784 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 106 + }, + "time": 1429279796, + "txn": { + "timestamp": 1429279796, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "fee": 835759, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 962798 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11903 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7564 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 132080 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 107 + }, + "time": 1429280596, + "txn": { + "timestamp": 1429280596, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "fee": 104471, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 139293 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 109 + }, + "time": 1429302756, + "txn": { + "timestamp": 1429302756, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "fee": 42555, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 56739 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 111 + }, + "time": 1429348072, + "txn": { + "timestamp": 1429348072, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "fee": 13386, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 17848 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 112 + }, + "time": 1429348102, + "txn": { + "timestamp": 1429348102, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "fee": 8332864, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11108253 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2231 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 114 + }, + "time": 1429348502, + "txn": { + "timestamp": 1429348502, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "fee": 130201, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 173601 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 115 + }, + "time": 1429348712, + "txn": { + "timestamp": 1429348712, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "fee": 16276, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 21700 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 117 + }, + "time": 1429351912, + "txn": { + "timestamp": 1429351912, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "fee": 125795, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 167725 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 122 + }, + "time": 1429382898, + "txn": { + "timestamp": 1429382898, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "fee": 283986, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 378646 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 124 + }, + "time": 1429522086, + "txn": { + "timestamp": 1429522086, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "fee": 4438, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 5916 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 125 + }, + "time": 1429578056, + "txn": { + "timestamp": 1429578056, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "fee": 555, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 127 + }, + "time": 1429848410, + "txn": { + "timestamp": 1429848410, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "fee": 3170256, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1175478 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3051530 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 128 + }, + "time": 1429849170, + "txn": { + "timestamp": 1429849170, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "fee": 41968911, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55430171 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528376 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 131 + }, + "time": 1430330041, + "txn": { + "timestamp": 1430330041, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "fee": 76257058, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 101676076 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 132 + }, + "time": 1430330311, + "txn": { + "timestamp": 1430330311, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "fee": 9532133, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12709509 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 133 + }, + "time": 1430330421, + "txn": { + "timestamp": 1430330421, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "fee": 1191516, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1588688 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 134 + }, + "time": 1430330481, + "txn": { + "timestamp": 1430330481, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "fee": 148940, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 198586 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 135 + }, + "time": 1430330591, + "txn": { + "timestamp": 1430330591, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "fee": 18619, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 24823 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 136 + }, + "time": 1430330851, + "txn": { + "timestamp": 1430330851, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "fee": 2328, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 3102 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 137 + }, + "time": 1430504186, + "txn": { + "timestamp": 1430504186, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "fee": 291, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 138 + }, + "time": 1430504236, + "txn": { + "timestamp": 1430504236, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "fee": 36, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 48 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 139 + }, + "time": 1430504536, + "txn": { + "timestamp": 1430504536, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "fee": 6, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 140 + }, + "time": 1430504746, + "txn": { + "timestamp": 1430504746, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "fee": 0, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 141 + }, + "time": 1430504846, + "txn": { + "timestamp": 1430504846, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "fee": 0, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 142 + }, + "time": 1430504966, + "txn": { + "timestamp": 1430504966, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "fee": 0, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 143 + }, + "time": 1430505086, + "txn": { + "timestamp": 1430505086, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "fee": 0, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 144 + }, + "time": 1430505176, + "txn": { + "timestamp": 1430505176, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "fee": 0, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 146 + }, + "time": 1430641376, + "txn": { + "timestamp": 1430641376, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "fee": 6894507, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 9192675 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 147 + }, + "time": 1430641536, + "txn": { + "timestamp": 1430641536, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "fee": 861814, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1149084 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 148 + }, + "time": 1430642006, + "txn": { + "timestamp": 1430642006, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "fee": 107727, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 143635 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 149 + }, + "time": 1430642106, + "txn": { + "timestamp": 1430642106, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "fee": 13466, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 17954 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 150 + }, + "time": 1430642306, + "txn": { + "timestamp": 1430642306, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "fee": 1684, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 2244 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 151 + }, + "time": 1430642426, + "txn": { + "timestamp": 1430642426, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "fee": 210, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 280 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 152 + }, + "time": 1430642546, + "txn": { + "timestamp": 1430642546, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "fee": 27, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 153 + }, + "time": 1430642816, + "txn": { + "timestamp": 1430642816, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "fee": 4, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 154 + }, + "time": 1430643706, + "txn": { + "timestamp": 1430643706, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "fee": 0, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 155 + }, + "time": 1430643906, + "txn": { + "timestamp": 1430643906, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "fee": 0, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 156 + }, + "time": 1430644036, + "txn": { + "timestamp": 1430644036, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "fee": 0, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 157 + }, + "time": 1430673946, + "txn": { + "timestamp": 1430673946, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "fee": 0, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 158 + }, + "time": 1430674696, + "txn": { + "timestamp": 1430674696, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "fee": 0, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 159 + }, + "time": 1430715196, + "txn": { + "timestamp": 1430715196, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "fee": 0, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 160 + }, + "time": 1430784172, + "txn": { + "timestamp": 1430784172, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "fee": 0, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 161 + }, + "time": 1430784312, + "txn": { + "timestamp": 1430784312, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "fee": 0, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 162 + }, + "time": 1430784372, + "txn": { + "timestamp": 1430784372, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "fee": 0, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 163 + }, + "time": 1430784932, + "txn": { + "timestamp": 1430784932, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "fee": 0, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 165 + }, + "time": 1430790152, + "txn": { + "timestamp": 1430790152, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "fee": 0, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 167 + }, + "time": 1430791902, + "txn": { + "timestamp": 1430791902, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "fee": 201915, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 269219 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 168 + }, + "time": 1430792072, + "txn": { + "timestamp": 1430792072, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "fee": 25240, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 33652 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 171 + }, + "time": 1430870562, + "txn": { + "timestamp": 1430870562, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 173 + }, + "time": 1430871512, + "txn": { + "timestamp": 1430871512, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 175 + }, + "time": 1430908702, + "txn": { + "timestamp": 1430908702, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 179 + }, + "time": 1431339429, + "txn": { + "timestamp": 1431339429, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 181 + }, + "time": 1431757585, + "txn": { + "timestamp": 1431757585, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 184 + }, + "time": 1432327272, + "txn": { + "timestamp": 1432327272, + "length": 220, + "type": 0, + "txid": "a230d5b5b745bb51d40e86b11e6508dc84a486f5ffd3584b0d45818ab8520802", + "inner_hash": "e6acee381aaefcd94f28b3a7ef5e6c34232fd5e78e96816d71c9c60248d6c5c6", + "fee": 25433321, + "sigs": [ + "2e70883dc210920e639b5f22efd820a5f04b5290bc65b6ef4c52cd6283ef7a2e580fec499d33a71700a61dcab9200ee09a08a695affa9c12ef00d6d07cb0164001" + ], + "inputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263, + "calculated_hours": 33911093 + } + ], + "outputs": [ + { + "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565700.000000", + "hours": 4238886 + }, + { + "uxid": "d66dad2d285942e38e13fd5d921cd142e86489a16b0f83ece7249e72704f6536", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "40000.000000", + "hours": 4238886 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 190 + }, + "time": 1433229543, + "txn": { + "timestamp": 1433229543, + "length": 220, + "type": 0, + "txid": "655651b51d288fae2ca80dd8231fbc8927e7f0203d698bdf0dc47e1e9c63652d", + "inner_hash": "472ae342c5dcb47ec7cf0b63fba1414d5e4a32c63e974ce390d55fb668972151", + "fee": 109513205, + "sigs": [ + "7dfbaddfb6b73fd84f23644a755c025b8480ab8754ad2e1a1c95d53ff52ed87e45030465ead44995235678e6e53ead91926da4af940367bef53ba7ae229edb7901" + ], + "inputs": [ + { + "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565700.000000", + "hours": 4238886, + "calculated_hours": 146017605 + } + ], + "outputs": [ + { + "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565100.000000", + "hours": 18252200 + }, + { + "uxid": "8cb546636d5039df6d4bda41a10322ea6dcd0fa0c766d3e2f45a6f30040765e0", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "600.000000", + "hours": 18252200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 192 + }, + "time": 1433331745, + "txn": { + "timestamp": 1433331745, + "length": 220, + "type": 0, + "txid": "cff22d57daf828015489bba3b01538369f5627cc89ad0f139261bb0be0dac4a8", + "inner_hash": "4fd9cd0aab064ef8cf67e2b6b0102aa1cd4df52cf60b00206cc7b5619bcf5acc", + "fee": 16746812, + "sigs": [ + "36a79d8ce7050bf1df11c9e839ecbb75f889161c7f3a81539a5da630953dad30159d0db804123c48f3bcabe2314887614bd57be64f951f7162ffc08f5810d23101" + ], + "inputs": [ + { + "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565100.000000", + "hours": 18252200, + "calculated_hours": 22329082 + } + ], + "outputs": [ + { + "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "564100.000000", + "hours": 2791135 + }, + { + "uxid": "79fc203078f4a201ed7bfb09977a75a5b22794645606aef22824d3fda9285932", + "dst": "2fcUG6oQSsaWZK9Crqkh6LzGfZexqUqtHWg", + "coins": "1000.000000", + "hours": 2791135 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 193 + }, + "time": 1433334775, + "txn": { + "timestamp": 1433334775, + "length": 220, + "type": 0, + "txid": "1b83454b4e61348b9c643815c26350b4e34796170593895961f329a759cbadf8", + "inner_hash": "d551018fa96bcf1df6ae0136f75bfb5db002e6e41723fa80ab4fb5a1857bfcde", + "fee": 2093353, + "sigs": [ + "9c02e3b3c6cc517badf9a4408bb9bf9d8d72fad0e2cc3f04f2e176bcfc2a7fee1b4740c4bc4eaa4ae008a9a18eda3f0cace91199613b14d2c34178cca1ac8ac500" + ], + "inputs": [ + { + "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "564100.000000", + "hours": 2791135, + "calculated_hours": 2791135 + } + ], + "outputs": [ + { + "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561700.000000", + "hours": 348891 + }, + { + "uxid": "6a349ba12c5d2827de6c24773d3dd8f6572e86adba4c8954a6d6e68df9e165e2", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "2400.000000", + "hours": 348891 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 195 + }, + "time": 1437050608, + "txn": { + "timestamp": 1437050608, + "length": 220, + "type": 0, + "txid": "fa7a60f6d4a22404e28ce9d1600442c19237552d8678bd610793cb8e6b3353d4", + "inner_hash": "cc33e2831789b20ec4eb187a6b44a9f772aa243f3f5f6262cb46087a0a6ac3f5", + "fee": 254679355, + "sigs": [ + "9b8e90365377deb3da537fdda4653f117c1c7de525b611d9d07f23139b5d4c642af80ad70779aa012b6399e73af8e08e87952f085edf8060f0832635e3244cb400" + ], + "inputs": [ + { + "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561700.000000", + "hours": 348891, + "calculated_hours": 339572471 + } + ], + "outputs": [ + { + "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561600.000000", + "hours": 42446558 + }, + { + "uxid": "054e39b1d37f10a4e1ee6598d66bd7cdd8f97b5ef0de2666120ef710c053af98", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "100.000000", + "hours": 42446558 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 197 + }, + "time": 1437051128, + "txn": { + "timestamp": 1437051128, + "length": 220, + "type": 0, + "txid": "b18ed75097ed7910315e3be9042c0ca0b734d30a1afb8f9346bbe18acddd3a8a", + "inner_hash": "847e1acbed683214ad9e0fe164204db0ae8f2ce1cc420cb25aa63c76a4739580", + "fee": 31868850, + "sigs": [ + "523ef82bcc586c5c885ca0fc7f2ffe5057573556a8bfaa3d9eb30b6316e698e93ac11a9e0d8a3c2a8ace763d80edd8e059153b61a4a35fa6f0b214d8ba0c485d00" + ], + "inputs": [ + { + "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561600.000000", + "hours": 42446558, + "calculated_hours": 42491798 + } + ], + "outputs": [ + { + "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527520.000000", + "hours": 5311474 + }, + { + "uxid": "bd55382fd8ca5b623b167dd7180ee0165eca5e74a6b2be453536ce8b5e1231e0", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "34080.000000", + "hours": 5311474 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 198 + }, + "time": 1437139506, + "txn": { + "timestamp": 1437139506, + "length": 220, + "type": 0, + "txid": "cd6fae6c021e64768cbb2e0a17ec6853db94b5dde52b417f872371dc3c24a27f", + "inner_hash": "8dde5734f617c1313288ac9d1b762a7d1e88b68846945b83c35935bcce1fdd8a", + "fee": 3983606, + "sigs": [ + "1221df811e418338ca156c42fc881d1cd7384b819a6683d4a54ab6e78521e32761452bcbb7ad856fa345a8f80c6206b19bd178c09975b87180f86448994ba07c00" + ], + "inputs": [ + { + "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527520.000000", + "hours": 5311474, + "calculated_hours": 5311474 + } + ], + "outputs": [ + { + "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527220.000000", + "hours": 663934 + }, + { + "uxid": "42ec7e7302b1464d94e99c7b842e477d10e55328257aa5d1987052a3bdcc8690", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "300.000000", + "hours": 663934 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 200 + }, + "time": 1438939186, + "txn": { + "timestamp": 1438939186, + "length": 220, + "type": 0, + "txid": "2e05ca5b53cdaf3d65102aa6a4a707a324e5bfa7fa46e9b3b7328d1e0363822a", + "inner_hash": "08832259284fe4965625e2ef97d1ff3b40d7832b159b3d5369fc086ebb95479f", + "fee": 47086261, + "sigs": [ + "820dc5d47540b0978818356b512731ae47517c061a1b660e7fd47e8f3d6420700377fd2ec04b618504cd3dadf642111df2f6c1f6edf2a4067fd460c69e8eb07301" + ], + "inputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785, + "calculated_hours": 62781681 + } + ], + "outputs": [ + { + "uxid": "6e4110a8ed6f2b8b8772516466032a99b4851de65cf9ce1b5c5673946b7408a9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25400.000000", + "hours": 7847710 + }, + { + "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 7847710 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 225 + }, + "time": 1440298886, + "txn": { + "timestamp": 1440298886, + "length": 317, + "type": 0, + "txid": "5a348a2f9d4e70f1f0d68fa9abc66d8eb4adcd45942c89d79a4121033e7dfc39", + "inner_hash": "a282319ed05751e5df08ece9dfe9fdcc73ee03b3efa2227c78ed1fd65a072c23", + "fee": 344422847, + "sigs": [ + "c2e5060c13dbcbe8bd76cbe8d7fa2aab8a8738bc6b1c1acf50366f211cbda18611feb1e218df129d1e6a6f957310ad08a139c03555d6ba2b99f52fd988e0a96800", + "90ed23dacf21e05817442155cf7ae9867a9531ee0e1c4b575caaec7c65ede2f73344e1b12e093b4d1ebb11e457f066560d1a280cf8cb48fbf7e937202c329fa001" + ], + "inputs": [ + { + "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527220.000000", + "hours": 663934, + "calculated_hours": 451028438 + }, + { + "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 7847710, + "calculated_hours": 8202023 + } + ], + "outputs": [ + { + "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "518220.000000", + "hours": 57403807 + }, + { + "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 57403807 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 226 + }, + "time": 1440299046, + "txn": { + "timestamp": 1440299046, + "length": 317, + "type": 0, + "txid": "e91d2553c18538d90847e7d432c75978abb0f6f84edeea2f942d018e7306074b", + "inner_hash": "e16c45b163f87caefb9d231d4608e6a9b67b5d379a7bff3aebd6587cfa349df6", + "fee": 86105712, + "sigs": [ + "cdcc51cad962fa4c6da30a44222c1a7d91501d07ba358c5a017b1105ec6f95091ba4ed430a95220492b228cd1b48a74f19c08ef550108cb639a7451e6d80cb1100", + "6969d30799e0687d3c80ce026bc510f920171ed4fb592ce3bf7ba1c142ec515230856a3c5b618495b449f264dd4ca1c1cea6e0e95756b2d0201d280571ba41e301" + ], + "inputs": [ + { + "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 57403807, + "calculated_hours": 57403807 + }, + { + "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "518220.000000", + "hours": 57403807, + "calculated_hours": 57403807 + } + ], + "outputs": [ + { + "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528170.000000", + "hours": 14350951 + }, + { + "uxid": "dfb90c1854bbf56bb87452a2870b4270214ca163df7d77f37c6bbf9d4ee2878a", + "dst": "2F4uJss1tkD7LNUp5RmxF1DPqgyzKVJm5tb", + "coins": "50.000000", + "hours": 14350951 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 227 + }, + "time": 1440299156, + "txn": { + "timestamp": 1440299156, + "length": 220, + "type": 0, + "txid": "71f762590ff2ca5e0591405ca5bb81aa2540981ea6e5cb71da1b30e4f91124a0", + "inner_hash": "024a7d284281f46931f4068a7dc377064aaf51b1c841e8d43a9f80f19aa52a8e", + "fee": 10763215, + "sigs": [ + "dac9b5146b34a81f1c167cb54a15584e4323cb1910bf8de6c3b999f903a88b25473df3474c5ebce317dc40b121c632a79ecc8e9081406cc5d4b7a9848bd13d0f01" + ], + "inputs": [ + { + "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528170.000000", + "hours": 14350951, + "calculated_hours": 14350951 + } + ], + "outputs": [ + { + "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528120.000000", + "hours": 1793868 + }, + { + "uxid": "b79723cfa4ff5c819de20392e8f73e16d353dc4af31eb0c7857735d74f0b1469", + "dst": "ywucfMPRof9HqQPXM9xaY865THKsK2bgsS", + "coins": "50.000000", + "hours": 1793868 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 228 + }, + "time": 1440299256, + "txn": { + "timestamp": 1440299256, + "length": 220, + "type": 0, + "txid": "8ca1a46e2ea862c0886adccc211140ff394315c580a8f2da711eeed39d6326eb", + "inner_hash": "e026ab911b2370df6ef3cf8ee91e2005ab9fa978efd4074a8415aa272b0c19a9", + "fee": 1345402, + "sigs": [ + "2805ab4816da23f9e1fc26c8940b5b5b27f90c910201229e239fa2b8f3cb4f9a5d1b57a62c48d5fc21ed11ccc121d22a8269af51a9de1359dd897a78a068d9a300" + ], + "inputs": [ + { + "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528120.000000", + "hours": 1793868, + "calculated_hours": 1793868 + } + ], + "outputs": [ + { + "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528070.000000", + "hours": 224233 + }, + { + "uxid": "03db7662bf54eadcf812dc76fad91d4022dc55b895ce8be3a4f13bda048bd281", + "dst": "23t2jE6DAMUUan6bgqQZchHtwtZo5sRUgR7", + "coins": "50.000000", + "hours": 224233 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 229 + }, + "time": 1440339226, + "txn": { + "timestamp": 1440339226, + "length": 220, + "type": 0, + "txid": "ac0737f4a51a7274f6a32f337d21af0681eff77276f6365c1809a1a73564e850", + "inner_hash": "b0faed6dd74071ff4e4083f9e5f73ff5af90fda24b4e52a00962bae7eaadf5f8", + "fee": 168175, + "sigs": [ + "34abcaa9a093713d2a19323e234d216169d3f75336b3170c1ab7c281386d42da0e97cf5e444a7473a0b1806d3d887e9622a329770c57f27c7532f3b69e3a6b9100" + ], + "inputs": [ + { + "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528070.000000", + "hours": 224233, + "calculated_hours": 224233 + } + ], + "outputs": [ + { + "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526970.000000", + "hours": 28029 + }, + { + "uxid": "db47ae0c8f6fb640a199a01ceb12c63c26303fd866840f964b634b2f1a7490ab", + "dst": "2bJVVKi3UU9FKEAnZpvNQRWMom9Pp1SYp8k", + "coins": "1100.000000", + "hours": 28029 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 230 + }, + "time": 1440400166, + "txn": { + "timestamp": 1440400166, + "length": 220, + "type": 0, + "txid": "26746e5734590a1ef50f6d8ec6f58c25ed4b2bc57324f9e321f5543807f8830a", + "inner_hash": "66744475146d04a7d95866e1e19b97e1d903e95bc5e8ea96223b281b7b95dbf7", + "fee": 21023, + "sigs": [ + "199134f5ee986ec6a7a86d01920a98c8930be6f224dfeddece5c94155c9b4cea59b78c855887769f00aa6aeb76eb8e632f25b58bd5409fd481fb6663c30db67201" + ], + "inputs": [ + { + "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526970.000000", + "hours": 28029, + "calculated_hours": 28029 + } + ], + "outputs": [ + { + "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526920.000000", + "hours": 3503 + }, + { + "uxid": "10c9fb1e6e6eb1a70af6e6714c1c0edb9588478cddfdbccb9ac5b2194abcbbfd", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "50.000000", + "hours": 3503 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 231 + }, + "time": 1440400256, + "txn": { + "timestamp": 1440400256, + "length": 220, + "type": 0, + "txid": "4553ac3bd00bc61bb9deb8a2bf3c606ecf78b857da710728f5b86fdd20434958", + "inner_hash": "0a23fd3f113c52b6b36d397256fe0161a3d7edc77f128ac974173fac90927fb9", + "fee": 2629, + "sigs": [ + "883145c4d76b5032ab0489407e991b247edeac0f89334c0588b8ede6d4ea052a2c330a94598fc9953cf9d25afeee7cf00ecea4d14744657ec9d888fe39b0d55c01" + ], + "inputs": [ + { + "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526920.000000", + "hours": 3503, + "calculated_hours": 3503 + } + ], + "outputs": [ + { + "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526870.000000", + "hours": 437 + }, + { + "uxid": "e161482d33d132611f343987fc55f400d83de9ce3e51b1e5bd47e2b526c1c567", + "dst": "mkzYUmbUSnBAvweQ3QqqHZM3esy97ubWwQ", + "coins": "50.000000", + "hours": 437 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 232 + }, + "time": 1440412792, + "txn": { + "timestamp": 1440412792, + "length": 220, + "type": 0, + "txid": "ca448d0b9f00c3f779acd75ea6e5d09cb93b4dee8ae417e43cecc58b121155f2", + "inner_hash": "bdcb4cfeae31a07ac42547510c4763b26b139ae2b61d411d7d4a78678a89f4e4", + "fee": 329, + "sigs": [ + "8d5c007633116141c43ff4c87e1394052c4b6832c250ebf5f49781c7b0879ab12261bfd92f41fa6963c4b74e96c2bf8c96e8708f5dd04d4781fdb780c8307bb001" + ], + "inputs": [ + { + "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526870.000000", + "hours": 437, + "calculated_hours": 437 + } + ], + "outputs": [ + { + "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "511870.000000", + "hours": 54 + }, + { + "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "15000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 233 + }, + "time": 1440510872, + "txn": { + "timestamp": 1440510872, + "length": 317, + "type": 0, + "txid": "688395456432e777e9bcef2482950d047259da990199d26d88f113ba37e870e6", + "inner_hash": "97a6db93329382d3a23dad5caf203056e6747dca4722c7e8e8d1f316b5f79503", + "fee": 82, + "sigs": [ + "b3a6984d1440aeceb4dac0304215a1bf8d017ab581f19c550b4d8f859f9a15270b54a8e599bff4f4a3a5fb3fcbe2f5bb95b7d61d4d48735696d7dd3c16f8fa7a01", + "5209b5d255a1308f3e25ad6115ed005e34479f4b9155c16c27b40b28da08332b646cc7fb29d82e07f6e8f0de780a4e6a6980ccf4c80214c9fbd0a3fe7eadf84900" + ], + "inputs": [ + { + "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "511870.000000", + "hours": 54, + "calculated_hours": 54 + }, + { + "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "15000.000000", + "hours": 54, + "calculated_hours": 54 + } + ], + "outputs": [ + { + "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526093.000000", + "hours": 13 + }, + { + "uxid": "121d93a2019c2bdcd69d58ca47cd4087c5ccc56c5ddc2486885dff8a6febcfb7", + "dst": "2N1izdmWPnPLUSvkRH8Q7aKES7crLYxBo5k", + "coins": "777.000000", + "hours": 13 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 234 + }, + "time": 1440543822, + "txn": { + "timestamp": 1440543822, + "length": 220, + "type": 0, + "txid": "036ad7678b828002f9f75645cd66e8c4a2d2ef66d4866bf7cfe5797be691a648", + "inner_hash": "0751142c1e40396fb2ea4e03cc64f8a7fabc12c1466d44726fa0dd9b2fab4b9e", + "fee": 3773616, + "sigs": [ + "9093c6beef08fc75a1341830aa8da696a9a1f6e043ab8abc48c63f8527c186b26e7f5e802e1743e095031a94b1fee4876245285de8bc76133ea78b403b34b38800" + ], + "inputs": [ + { + "uxid": "18ffebf7d8410a48f00b6bbfa5272ba374c0b70c6c31172975b4c503542d4193", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25390.000000", + "hours": 980963, + "calculated_hours": 5031486 + } + ], + "outputs": [ + { + "uxid": "a715e01bf641734804ed64e468ec35aa43658dc618784e6aed2f67d10c811f5d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "24390.000000", + "hours": 628935 + }, + { + "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 628935 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 238 + }, + "time": 1440675932, + "txn": { + "timestamp": 1440675932, + "length": 317, + "type": 0, + "txid": "768dc6803457ca6ba774e251f0a8f482d8f7134a5a8347831ae1d84ff39040b3", + "inner_hash": "63020c4af6f170888d1ed626be016d895568d3a0aead892b979e55e5d0bd8800", + "fee": 18586963, + "sigs": [ + "442db1af0d6925a01bf9510a5b8ba1dc1787373ba0851b99825533c2bc02f5246cdd56ac98ca2c1039d010f52e7a153c4118fe00dce63692b63dd04cefcce0f701", + "9d3c03789af3832c7cae849eed9ac2b1d5b1c3f89daee13ad46f10d256cd8774431d60b98ab3803709430cceefe1cdb55543064843240af9123ab9ffbb2ffccf01" + ], + "inputs": [ + { + "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526093.000000", + "hours": 13, + "calculated_hours": 24116992 + }, + { + "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 628935, + "calculated_hours": 665623 + } + ], + "outputs": [ + { + "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514593.000000", + "hours": 3097826 + }, + { + "uxid": "2b724147fb8daced3ad03b0a94e291410ab70df7f22346ed836bb864904a24ab", + "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", + "coins": "12500.000000", + "hours": 3097826 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 239 + }, + "time": 1440676112, + "txn": { + "timestamp": 1440676112, + "length": 220, + "type": 0, + "txid": "60ba5bab66295f08c5c96411f53bdf38bdf2b985b6dec3989b7754a8e2919ef8", + "inner_hash": "e765990d43208cc3e4f2168abd1139b36eeb280d18d8f98b13c14708371a5109", + "fee": 2323370, + "sigs": [ + "91a610f22d4aec320cb9a39a831eea7ff8b5fe5e18d402fda01bf732ccce2ad801d3709a073d0a95d18c8424ea8cb69cce38194a5b12ab11f6bb5278f9a7941d01" + ], + "inputs": [ + { + "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514593.000000", + "hours": 3097826, + "calculated_hours": 3097826 + } + ], + "outputs": [ + { + "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514093.000000", + "hours": 387228 + }, + { + "uxid": "52d2c4bda60fcd5e144d1c229a4d31c559a3d1f060b689737148918d4c04e128", + "dst": "Zu5GRV7HcKu1zV4ymwXUBCNogbwFW1sbhA", + "coins": "500.000000", + "hours": 387228 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 240 + }, + "time": 1440677762, + "txn": { + "timestamp": 1440677762, + "length": 220, + "type": 0, + "txid": "8839c0de129a84bb3025f8e314dae4d331b0da6a446a9893ad11225eec650e5e", + "inner_hash": "dd8ca4280d163c57c12c9792b544df85a2535e06b20b2c661d91b6aec80ba8fc", + "fee": 290422, + "sigs": [ + "7ab23848784fdf05602660e838be997277a7c33b2907ba81ae324d735b39864a2235ed3a0bfff86fa3cd7dcec7c6ab519d78e5f42b39443ee3aa4a1e44b9e26400" + ], + "inputs": [ + { + "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514093.000000", + "hours": 387228, + "calculated_hours": 387228 + } + ], + "outputs": [ + { + "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "513793.000000", + "hours": 48403 + }, + { + "uxid": "3e2b813ec4bdb29dd5bc232e00722c00beabf7cbbc2ca8b4e348f2f083978bd3", + "dst": "X7y5AqjNaLEuBGPxF2Rpip7d1AByHWWaXz", + "coins": "300.000000", + "hours": 48403 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 241 + }, + "time": 1440677792, + "txn": { + "timestamp": 1440677792, + "length": 220, + "type": 0, + "txid": "6cf290b9b63988d6126b6101c10992f6d9340988731e67867f011790f1fdf8de", + "inner_hash": "7e4018b41a6906ddfd84f67d271d79ae89ade34ed5de0ae609a6eeddb37f5991", + "fee": 36303, + "sigs": [ + "da30c4a5cd8670d84a8f7f8b7c7cf9ae0da0f5bf806720824ad2d59716b200d349070158bbac66723c1a434747a8c438dec3e40c9e199cf8a2ee6d5622eb6b5901" + ], + "inputs": [ + { + "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "513793.000000", + "hours": 48403, + "calculated_hours": 48403 + } + ], + "outputs": [ + { + "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512793.000000", + "hours": 6050 + }, + { + "uxid": "3a87d255b1d892d58d606d622196b75e818690e55e74db6e0173b1e28b58e2a9", + "dst": "vneQ7V3nuPwRbSRqvFXhWkXaVou11ynXfC", + "coins": "1000.000000", + "hours": 6050 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 242 + }, + "time": 1440679322, + "txn": { + "timestamp": 1440679322, + "length": 220, + "type": 0, + "txid": "8ca9114947a591d12c8bcb3aed6c2b6f6f50c13ebea44fe62fcfd783b4716166", + "inner_hash": "0aa4f96969cccacc1c03e2d7f8a1719ffb6de7c85ee563f6d55f3da14a377502", + "fee": 4538, + "sigs": [ + "2373f45b0d10eb272c0304af8b75bac0570fc265ae3a446ec74b0bea87e494d86101e9b0c042a84fb20bd2061e694f2791cc76c734e8dcba0f3a601651cd405601" + ], + "inputs": [ + { + "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512793.000000", + "hours": 6050, + "calculated_hours": 6050 + } + ], + "outputs": [ + { + "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512743.000000", + "hours": 756 + }, + { + "uxid": "051a357d1fe7f7b417a5892531f1e8b25b5bb78011ed4b440a5af47cfe241605", + "dst": "26AzDqDncyr5VKg5PfAxfTVdDtJf9AnMvoV", + "coins": "50.000000", + "hours": 756 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 243 + }, + "time": 1440682532, + "txn": { + "timestamp": 1440682532, + "length": 220, + "type": 0, + "txid": "6b056847543ff37d8dbb7506d85514b3e18001ce973b7aac2a1a198a7f3be318", + "inner_hash": "583525d962728c33c80c1a511f3f407df0b09f0b22d571b9b857dba3488c0b13", + "fee": 568, + "sigs": [ + "b625dcc6040f599b04f00e9812f93f6e087a68b8277a03efcb49a2e88cf86ea4314ac1d50e5299b9ec48921fed1b56e0221bbb8df5a3df386d524fbcb9fe9aa100" + ], + "inputs": [ + { + "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512743.000000", + "hours": 756, + "calculated_hours": 756 + } + ], + "outputs": [ + { + "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500243.000000", + "hours": 94 + }, + { + "uxid": "e7a20c799176f6567f3ad37f67ef0bfe5dd957404bd436d12f378eb35e624430", + "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", + "coins": "12500.000000", + "hours": 94 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 244 + }, + "time": 1440911542, + "txn": { + "timestamp": 1440911542, + "length": 220, + "type": 0, + "txid": "7732aba0b8f9773c975158578159f5f6e98e9864d1cd2b0cef23cac03783cb99", + "inner_hash": "0337a9c8ebc9c389166e782b1da8777b01c29894b19d2c34290d9a3b81cd2ee1", + "fee": 72, + "sigs": [ + "c185a7bac79fa042884330bf37c97ad27d9b4726ced145d91aec91dfb1cd9bf71e2c2e0de33837b43b241eddff2ac7067144ab3859859bef3e926b99aab4e5da01" + ], + "inputs": [ + { + "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500243.000000", + "hours": 94, + "calculated_hours": 94 + } + ], + "outputs": [ + { + "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "497843.000000", + "hours": 11 + }, + { + "uxid": "5b9ecc773b66edd04478a15c82f019986b973fbc24be45c933e1e8ef62e0b223", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "2400.000000", + "hours": 11 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 248 + }, + "time": 1441590662, + "txn": { + "timestamp": 1441590662, + "length": 220, + "type": 0, + "txid": "c8cbf96c9875e5a7f9f20cc301e9541f41182ac02747953f299d97a971e861e8", + "inner_hash": "f2c27d1b408cdd4796f628bff892e43cdfaeb8725b3a83bd0eddc374d9ce3ad1", + "fee": 37709542, + "sigs": [ + "314620c86df48d65a6fcfeb82d028f48660f01b78004a01c0b5e8d5ba5e38e297331862b3f2786cf682e03e81fab3a413068f4eb72991d574b90d6a857b32d6201" + ], + "inputs": [ + { + "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "497843.000000", + "hours": 11, + "calculated_hours": 50279388 + } + ], + "outputs": [ + { + "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "492843.000000", + "hours": 6284923 + }, + { + "uxid": "6ade5ea7988126cda24ab050d714172ce41b0ba33359e0d06d319be60e83db9d", + "dst": "SiS1P3maLEzpscmggF6yvBHQ3yn7tA5ZdJ", + "coins": "5000.000000", + "hours": 6284923 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 251 + }, + "time": 1441735522, + "txn": { + "timestamp": 1441735522, + "length": 220, + "type": 0, + "txid": "7c2da40e69c1ab57129cda200cbc4916fc67673436209b549c0496a4991f73be", + "inner_hash": "2d2c7b9c7e9e7c2dac513d277e2ed378a4ccdc5263560e2173b6507e4d70670d", + "fee": 19557508, + "sigs": [ + "9de55cef7a0e80984d48ecfd30acf98d220bb5556d456af477c6879e80ba1bf143e75d6b64a018c1023f1854e538f1b72df3efe932db13d0eb20adf31c38ff9f01" + ], + "inputs": [ + { + "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "492843.000000", + "hours": 6284923, + "calculated_hours": 26076676 + } + ], + "outputs": [ + { + "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491843.000000", + "hours": 3259584 + }, + { + "uxid": "5e41c4784a2ed9b538d07c20c2cadc89e3566ea17653b965715dd8db2015b986", + "dst": "KXSR2KLsButg6ndwUDYoyJ4FE9vGPLvtAj", + "coins": "1000.000000", + "hours": 3259584 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 252 + }, + "time": 1441735692, + "txn": { + "timestamp": 1441735692, + "length": 220, + "type": 0, + "txid": "6638eac25e01cb7aabc20e0bd8fff66267bfa88ef4d3b021cda4248f6c8538a3", + "inner_hash": "ce2201218b3d8b5c734bc18666e409174b77ae022c0e48c30c5a9949edff6b0d", + "fee": 2444688, + "sigs": [ + "94a8d11ba959af4d2160d141989d9a3e21f875b829d07969d1be040b54317c901c47ebcc9431f3cc0af88d4fbc0ac924785de50d27a3af4e4e4dc31a9980e0eb01" + ], + "inputs": [ + { + "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491843.000000", + "hours": 3259584, + "calculated_hours": 3259584 + } + ], + "outputs": [ + { + "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491743.000000", + "hours": 407448 + }, + { + "uxid": "4ce358e15868adaf6c5ca420f900d3dd0f737510b5412646e10548fa3d37653d", + "dst": "29vxf99tti4sFPZpg8ghEWV9fhoHSbjeRYd", + "coins": "100.000000", + "hours": 407448 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 260 + }, + "time": 1444883250, + "txn": { + "timestamp": 1444883250, + "length": 220, + "type": 0, + "txid": "22b65c63f88e188f8da71f42e41102cde030d9550cfc990b4391e0339a4cb2dd", + "inner_hash": "0f2f563f1fdf52d53dcc414228d347dc677c4143cb3be4471945709fed3d29f0", + "fee": 296075479, + "sigs": [ + "f0ace9ccccb936a5b46073085d83ca357692dfe0de9635d36292289f6d3a6e4505bd42c7de08dc8642823b8ee2b986c0b926c62df834f694a4d44695ced6690000" + ], + "inputs": [ + { + "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491743.000000", + "hours": 407448, + "calculated_hours": 394767303 + } + ], + "outputs": [ + { + "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "479243.000000", + "hours": 49345912 + }, + { + "uxid": "d79a747561a4ae09c22e5ec0baf0eb861b56b1d9b1411868c474d32e9ef392dc", + "dst": "6QpWfvS8PxrWVJLKLFtQVUHvAwUg2oX6GW", + "coins": "12500.000000", + "hours": 49345912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 262 + }, + "time": 1447060608, + "txn": { + "timestamp": 1447060608, + "length": 220, + "type": 0, + "txid": "bc35493562cbe89797ce21a6202c8b43fc8514910ccb197c2f971c624b1fa5dd", + "inner_hash": "ff7c2bc8682df6f1a080061ca6d646c47636474b9e291dbf9d549fe5e63fddfe", + "fee": 111184070, + "sigs": [ + "d1ffeea69fb213eaa7aea1e5f0d5a09e414247ba07a3860fb66c3af0b7ed611e2e630bfd292b4013e0d1bd9234290f068d49f5922ce895785c18cc4ada578a0e00" + ], + "inputs": [ + { + "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "479243.000000", + "hours": 49345912, + "calculated_hours": 148245426 + } + ], + "outputs": [ + { + "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478743.000000", + "hours": 18530678 + }, + { + "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500.000000", + "hours": 18530678 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 263 + }, + "time": 1448245188, + "txn": { + "timestamp": 1448245188, + "length": 317, + "type": 0, + "txid": "32c585c56c5879158e3075f299998f6cf922b06b9620f272ebb4cb4a2353d4eb", + "inner_hash": "e0dcb3b201be487c7feaf513b3f245b08e0f86335fd2bd9a9dba7ca70684e8a7", + "fee": 27796018, + "sigs": [ + "2b0585dc3ac3d497e9b139be51a0e5f6e0520c54e244678459169a82d386f5050f23dd92685efee03bad45f7e166992fb34c3fc036c1fd9204bc0280decb7c8000", + "adcd4b6cb6dc7816416f44649ce1dc4ce3489e9dbac70f4de610d0663e12ed556f3d1fda1781ecb6237652358cd6d1118ec9c2b5795dde594d92c47830c493f500" + ], + "inputs": [ + { + "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500.000000", + "hours": 18530678, + "calculated_hours": 18530678 + }, + { + "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478743.000000", + "hours": 18530678, + "calculated_hours": 18530678 + } + ], + "outputs": [ + { + "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478243.000000", + "hours": 4632669 + }, + { + "uxid": "08c0b08d114154a06a39cf418dd39eb018a55c1c4ee7a96257b33bc6f413d577", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "1000.000000", + "hours": 4632669 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 264 + }, + "time": 1450942022, + "txn": { + "timestamp": 1450942022, + "length": 220, + "type": 0, + "txid": "97ed144d626d0ff6fca09745735aec22a103d182971a45989500a3aa757358d4", + "inner_hash": "4bafee81f542c63b988af48da3250dd56215a42b520892b1ebbb8e9c5271588b", + "fee": 3474503, + "sigs": [ + "c4047afd7722520fea778426868ef461a602a3954b82051c2245107491efdfff54d701d18f5408ef20a7dcea37ae4c1c3555bfe1bc387b1f3a516d076420139e00" + ], + "inputs": [ + { + "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478243.000000", + "hours": 4632669, + "calculated_hours": 4632669 + } + ], + "outputs": [ + { + "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "476243.000000", + "hours": 579083 + }, + { + "uxid": "8745efaccbb21edd35d337233d7d1ae0e2c75723e72767c9b42cd27c46146abc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "2000.000000", + "hours": 579083 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 265 + }, + "time": 1450942402, + "txn": { + "timestamp": 1450942402, + "length": 220, + "type": 0, + "txid": "b5ffbbb48c9900feb663f79c3b3e1c89328a08b592f96071fd4d3171197a5ff7", + "inner_hash": "b6d4ab02e9b05a532402a1b65185e098d4c730854c6f34d20e71da1262524195", + "fee": 434313, + "sigs": [ + "b116c94fd9e32cc371bba4f9a88ad672112d53be861aaa5c77cd335d1553fe0a24fc334d79c61aed344b618a3de49e791cc8aebe83bead076ed2f38dccd9aaee00" + ], + "inputs": [ + { + "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "476243.000000", + "hours": 579083, + "calculated_hours": 579083 + } + ], + "outputs": [ + { + "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "456263.000000", + "hours": 72385 + }, + { + "uxid": "c33a3ad731a1375220c0701da00a462e13a11bab4cff684061ce173982227a2d", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "19980.000000", + "hours": 72385 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 266 + }, + "time": 1453191853, + "txn": { + "timestamp": 1453191853, + "length": 220, + "type": 0, + "txid": "981c2bb64f9e6717353cad40e21f3e97bd188381fde77862298488a516c31252", + "inner_hash": "cae5fc5f829da5ccb165c97b1140ed161e22e4ba290b1bee703b31a986c3c45c", + "fee": 54289, + "sigs": [ + "e3fb8400221770861288bcb1018a495548af5cd617724aa22efd219f350047086ea0ed5aa7f95e488045d5c31d8551a6cffcdf796d91ebbf573c1ef6492bb25701" + ], + "inputs": [ + { + "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "456263.000000", + "hours": 72385, + "calculated_hours": 72385 + } + ], + "outputs": [ + { + "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "455263.000000", + "hours": 9048 + }, + { + "uxid": "d7eb0e6bd0ccbf9fd59e314999c37e8f97c652001e1ac1834f9b3c95665a746d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "1000.000000", + "hours": 9048 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 267 + }, + "time": 1461084047, + "txn": { + "timestamp": 1461084047, + "length": 220, + "type": 0, + "txid": "4edf7e4859bd537481164719a563af45b2603d2caf1b676d6fe1e08713b0d6f3", + "inner_hash": "ac615d16f9c8be45bc50359496bdd6d489b374846f11586c19dc865c3217c1b9", + "fee": 6786, + "sigs": [ + "7ae17fdc81bb3b71304db642c6af046e67ca00e8499d8f3d19f7489cd13ca4b75f2415d1e9639e0a7a26791852331189f5e2bfdde574ccf6c0adbca2fb0c933100" + ], + "inputs": [ + { + "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "455263.000000", + "hours": 9048, + "calculated_hours": 9048 + } + ], + "outputs": [ + { + "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "450263.000000", + "hours": 1131 + }, + { + "uxid": "fd99ca48c87575437fcbedd1bf05cf5c4f6a2d199616119ec99dfe61eb085ee5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5000.000000", + "hours": 1131 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 268 + }, + "time": 1461280957, + "txn": { + "timestamp": 1461280957, + "length": 220, + "type": 0, + "txid": "76b704d474896c5a3179b45a48c3ad327d5ebc27a6681ea7f514a90ba625bac3", + "inner_hash": "a60b2257f963b247a98f083828bf58d88aa3f327839c599bf1eaf0ee55a325a1", + "fee": 849, + "sigs": [ + "15e30848b1d0aaf92e13f8927115314341ab4452a31f0a61f665c986c952ef6838753688759e98f393b5af088ad0fa4e9aa4e83695afe5734c45e4eb6c15b76f01" + ], + "inputs": [ + { + "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "450263.000000", + "hours": 1131, + "calculated_hours": 1131 + } + ], + "outputs": [ + { + "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "437332.000000", + "hours": 141 + }, + { + "uxid": "c85d1d533bf13c0725af9a30bb101670505ed192f6987d55c1db5dd70fb2e4b3", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "12931.000000", + "hours": 141 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 269 + }, + "time": 1461296767, + "txn": { + "timestamp": 1461296767, + "length": 220, + "type": 0, + "txid": "8ecc2fb1efa47e6ad0c4670281b364a2828bfe86d59fbc14105c5b3a3c34fd17", + "inner_hash": "0600d27b083aea0d64ba83749b3bb60cbde6dd2cdaa4ec2101adb8de668cdeec", + "fee": 107, + "sigs": [ + "aaa9847aead8e1e43fdeb1548317046c252ddc8b61e9447c18006b8af5805f5c1dbf81b898f25ecbbd0bb97c2d6d89da0e25f7da979932b2a774c7c5e6f2281d01" + ], + "inputs": [ + { + "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "437332.000000", + "hours": 141, + "calculated_hours": 141 + } + ], + "outputs": [ + { + "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "434832.000000", + "hours": 17 + }, + { + "uxid": "7bb51af714bcae27ed5c092c6e721f10ca1ac167a61add8bd2989f15c968bab8", + "dst": "28nWDjroTJGr3rmZj9iiiVQK1wEVURcvsSc", + "coins": "2500.000000", + "hours": 17 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 274 + }, + "time": 1461749167, + "txn": { + "timestamp": 1461749167, + "length": 220, + "type": 0, + "txid": "2c97923aba19d8846f8f90db6dc89da7d433ead3ea8dc3155294ab4c9e7e61a4", + "inner_hash": "7d3af96a796daba12cbb863731c09e148f21302064d65945316473ad522e8ca8", + "fee": 40951223, + "sigs": [ + "6f3c6fb3e971ec8b4eb3a352c94b2abcb347a3f476d1b5e3097ce239a32467bd0703a4436ce7c9b4beb1668a9056f6d93055b53aa7a36374c2b3d12793a6ea3900" + ], + "inputs": [ + { + "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "434832.000000", + "hours": 17, + "calculated_hours": 54601629 + } + ], + "outputs": [ + { + "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "433832.000000", + "hours": 6825203 + }, + { + "uxid": "df7cae650d11e13a5308ea9f10662060c57ad749538d5ea1f476556de3257270", + "dst": "A19fNE1BNGAELCJ5bCVgo8t5Y9UPtoxy2F", + "coins": "1000.000000", + "hours": 6825203 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 284 + }, + "time": 1462264727, + "txn": { + "timestamp": 1462264727, + "length": 220, + "type": 0, + "txid": "7c3f991c9cb5098648da480666613a048267678dcf7033c6138b0ac619003bcb", + "inner_hash": "35e2f253fd5936f6086464b4f3bae2a39770f91b2d846533bdd677554a760bbf", + "fee": 11717668, + "sigs": [ + "bd5e540c58e54ccc58d1f7021657665d1f7a1770cc575b47a46bc16f5e3f3c86338f61be266c851201e8441ea5aa3ac91fa1cbf3b77365826c3b76f8f6441b0700" + ], + "inputs": [ + { + "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "433832.000000", + "hours": 6825203, + "calculated_hours": 15623556 + } + ], + "outputs": [ + { + "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333832.000000", + "hours": 1952944 + }, + { + "uxid": "fba32b8a7e10d7aad23bb8511dd61b9ad67b844142b5acd7ef22d03e540888fb", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "100000.000000", + "hours": 1952944 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 288 + }, + "time": 1462711117, + "txn": { + "timestamp": 1462711117, + "length": 220, + "type": 0, + "txid": "4c41f200b398abbba12cb9ad5b935a5dad3bb6283093f062c82ae7c7904747a5", + "inner_hash": "5263bdcff23761f158c7286664908839983135936f1e53bdd2513e7fa317d05f", + "fee": 18014431, + "sigs": [ + "39c94d70cedadb426004bea6137aa774ba757b78c44aad072143eb55cb9207aa7f02be91cd67c27f39f898a2303791665bfb5414a18df62a304c9cbdd4ffb5ff00" + ], + "inputs": [ + { + "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333832.000000", + "hours": 1952944, + "calculated_hours": 24019239 + } + ], + "outputs": [ + { + "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333732.000000", + "hours": 3002404 + }, + { + "uxid": "111b2d823bc70d9e8f42063eca3a457abe385b994d59f602d35bafe3e1402233", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "100.000000", + "hours": 3002404 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 289 + }, + "time": 1462711187, + "txn": { + "timestamp": 1462711187, + "length": 220, + "type": 0, + "txid": "6778a6900cf26b0ad69d2ead927663bd2bbaccd9b97d0dffb74655a08757ee5a", + "inner_hash": "53e042fba89ab6233f73a2bd08df87d84d5979b7a1bed5705156b8badc44f5b3", + "fee": 2251804, + "sigs": [ + "006025e5067252a8e37eb4c911d7e2c5283b137f0be2c8ffae27cac8f5a21f723d25745c157e49783354751f3e0bf4ce25fe6271748bd78d31487e826685a59801" + ], + "inputs": [ + { + "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333732.000000", + "hours": 3002404, + "calculated_hours": 3002404 + } + ], + "outputs": [ + { + "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "283732.000000", + "hours": 375300 + }, + { + "uxid": "4729461061ba3e308d1fea8846b8326bb8300d3dcc8b66b242323ba0aa5a3ccb", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "50000.000000", + "hours": 375300 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 290 + }, + "time": 1462715237, + "txn": { + "timestamp": 1462715237, + "length": 220, + "type": 0, + "txid": "99988a504cb60473ad8b5047a9be9049dff3dd2ee13879707a12736ed52ea9a5", + "inner_hash": "13285dd910aca69020333f17bc6d0a9ad3424bba2610acbd062712a3b4b46b6b", + "fee": 281476, + "sigs": [ + "cc4df545eddf94086f0aaf2bb28321d8e3822f835bb3a71ab51674a3a7dc305c57df3609b6dc3a434fa8e2a4c36b5406cdf2fe6833c74049b4b77cf098ca664c01" + ], + "inputs": [ + { + "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "283732.000000", + "hours": 375300, + "calculated_hours": 375300 + } + ], + "outputs": [ + { + "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278732.000000", + "hours": 46912 + }, + { + "uxid": "a0e76e9cfd75deeb37f2db7bd67c95c95c3896c635ef104a548b77cafa65dd04", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 46912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 291 + }, + "time": 1462715257, + "txn": { + "timestamp": 1462715257, + "length": 220, + "type": 0, + "txid": "714a3b2ba4479d0a95ad0ebae11bc1198eabc6392dabe776c15e7a68e0d82cf8", + "inner_hash": "32aa300316d5aff19a3aa0a99bfbca6398eef9462cc6c975fe7f41d1ecb9f6d5", + "fee": 35184, + "sigs": [ + "a886ba759476985a6aec555b7acb5b3f7ea7d14201b66bd043bc172206bf4b7c0269959f3f8aac5c7a06a376a628221c67ae89cbd141c96987f852c2e2f4e73400" + ], + "inputs": [ + { + "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278732.000000", + "hours": 46912, + "calculated_hours": 46912 + } + ], + "outputs": [ + { + "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278232.000000", + "hours": 5864 + }, + { + "uxid": "0637e5ea11dba513d8839c02e4d564ec31a8377e5aca51fdef4c854cb5eaa332", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "500.000000", + "hours": 5864 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 292 + }, + "time": 1462715267, + "txn": { + "timestamp": 1462715267, + "length": 220, + "type": 0, + "txid": "7e8d02180c5e49cd36b545c8986ffaadc7e90840259d3fe10ceaff3e4cd931c4", + "inner_hash": "8e1d9f79f43372290c3d497314271a711c33474fdec555b4be6f3f0d7c608d76", + "fee": 4398, + "sigs": [ + "61f0c36e996c391c61daaddd6dced605e79cdabc643d994d99c7a6a479aad25c4030619f1cf7420dbe2d673a2e124f2bae744277b246173342d7fdbddea78bc200" + ], + "inputs": [ + { + "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278232.000000", + "hours": 5864, + "calculated_hours": 5864 + } + ], + "outputs": [ + { + "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277732.000000", + "hours": 733 + }, + { + "uxid": "9ab52d70129ef181bbd69a630a3fa929bb12357c5c31bc70173388b71327dab7", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "500.000000", + "hours": 733 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 321 + }, + "time": 1467090951, + "txn": { + "timestamp": 1467090951, + "length": 220, + "type": 0, + "txid": "7388dab349f2d2a59ab071fc592c0173acfa357f23fd17dae1561089da55e74f", + "inner_hash": "a0f3bfacdee3107342adb96e8dcb38a265af8054624dadc0b27d71c55854e6b5", + "fee": 163980409, + "sigs": [ + "dda5202c4c44a5ab8eceb8cf8a7acc1c2714529eee0a69bd396cb74a98706dfe1c7686c1b0f2bf760b5d211ce535c21077944bd1d89bc0baade9606cd561147800" + ], + "inputs": [ + { + "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277732.000000", + "hours": 733, + "calculated_hours": 218640543 + } + ], + "outputs": [ + { + "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277632.000000", + "hours": 27330067 + }, + { + "uxid": "f16b87d2e0ea2e7f43434d058fb4435705cb15f4d01de6c6aa242ab7fcd9a80b", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "100.000000", + "hours": 27330067 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 322 + }, + "time": 1469074433, + "txn": { + "timestamp": 1469074433, + "length": 220, + "type": 0, + "txid": "5733f006dda42be6198d3fb035170c9160428ad321c8255b851574776e03c34f", + "inner_hash": "993a366ebfc7210951eeda4c459389f396a2038f41025f4b729edab75d1dc9c5", + "fee": 20497551, + "sigs": [ + "0612105a7d427841f1f9038bbb778c8c1db52e0dfe5fd7c9409b44bb03fc72a74d60913ad46fef4a525d3314a48e1ee49d4a5da69941075fe816c02ef691979001" + ], + "inputs": [ + { + "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277632.000000", + "hours": 27330067, + "calculated_hours": 27330067 + } + ], + "outputs": [ + { + "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "276632.000000", + "hours": 3416258 + }, + { + "uxid": "02b48571a1a1f628a0e78b5b158a682262a88610cd0614697e17201f35c9ee98", + "dst": "22cmbaPHWozJRJfbxTUbfoy2FfM3oFvFs7k", + "coins": "1000.000000", + "hours": 3416258 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 323 + }, + "time": 1469074773, + "txn": { + "timestamp": 1469074773, + "length": 220, + "type": 0, + "txid": "725698203caf11e909360449956f0285735d44f4573c81413852d25b220e61b0", + "inner_hash": "ef1dc1d55aa04aa6a240a796f6f9c47af2317fdfa7f4843f3884e71cdb79c442", + "fee": 2562194, + "sigs": [ + "77fd6d8da8b2efd32dd50ca558e44fde0f62d8cd15ab084650759ff61d51e3200b7c025488908a7d0f784de819764506ab8a67f9d5c384ab7962c30908695d3700" + ], + "inputs": [ + { + "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "276632.000000", + "hours": 3416258, + "calculated_hours": 3416258 + } + ], + "outputs": [ + { + "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275632.000000", + "hours": 427032 + }, + { + "uxid": "f575c8f632e92d9e3c7335f68e4e6c24d69d20fddbd05f794016b4d18d4d9c66", + "dst": "8CHWZqQEnBj9dTdZ78iqs1MVy83qgCuTs4", + "coins": "1000.000000", + "hours": 427032 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 327 + }, + "time": 1469463291, + "txn": { + "timestamp": 1469463291, + "length": 220, + "type": 0, + "txid": "823a284da9b7e49180e599552e824c60c23d28cc9fd4915e57037ac6ba5e364f", + "inner_hash": "83da271ca66c1da0f8ba30224552791e51f5334fb2868c01a95aa09aa5d8f8c4", + "fee": 22629699, + "sigs": [ + "bd8a3cfd554c7fcf06c2fbdb0efe399f31d30373c96a0846edd52a3163dca1b43060014bda1db9abbacda35addcd3cd89625fe8e4753067aaf9a2de226fd692c01" + ], + "inputs": [ + { + "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275632.000000", + "hours": 427032, + "calculated_hours": 30172931 + } + ], + "outputs": [ + { + "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 3771616 + }, + { + "uxid": "f809efa66df51ff86023c6a514e91274a93dc303c34a191c37deb7e3467b9944", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1.000000", + "hours": 3771616 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 350 + }, + "time": 1471358102, + "txn": { + "timestamp": 1471358102, + "length": 220, + "type": 0, + "txid": "ccf809db24bde3af9083bb6ba590e91f71cd93335c945ccae3f815ef68994843", + "inner_hash": "18e96e61845c7f9134eec568476ae5f8909417230382a261384a4116cb6ea980", + "fee": 85052942, + "sigs": [ + "07220c9f545b585905db91d51aa1b00bd3c3c4ad251bd88c48cc1377c2ea86702ac6fb8354188abdf228cd9c05c8d8c0c8185e337f60fb824b06ca5c3893757f00" + ], + "inputs": [ + { + "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 3771616, + "calculated_hours": 113403922 + } + ], + "outputs": [ + { + "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "274631.000000", + "hours": 14175490 + }, + { + "uxid": "6e269a47dc13704da1058890e839f246fe6f57c52718687c863e0d16adbfbb3e", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000.000000", + "hours": 14175490 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 354 + }, + "time": 1472066732, + "txn": { + "timestamp": 1472066732, + "length": 220, + "type": 0, + "txid": "e348450f03f57e10e3cb1227b6874186d72f090c1cb6468b400b4906807cef02", + "inner_hash": "79e866fddd91dea1ba6c8bdb88bc880216d25c812145bb476e91590396146b3f", + "fee": 18254345, + "sigs": [ + "67d3293742ce7cd95612d1a01c0b307a94166fc0b7bdc01efcd312606f88a5a474affc18a56adf6fece4f9b6b593dd1479a70fac8d92d4d285e1af579eafb90b01" + ], + "inputs": [ + { + "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "274631.000000", + "hours": 14175490, + "calculated_hours": 24339125 + } + ], + "outputs": [ + { + "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "273631.000000", + "hours": 3042390 + }, + { + "uxid": "26974a5d7ccd20eebd9c832b5fd40d62fb6bae48227fffa65dd4e5be26d12f84", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000.000000", + "hours": 3042390 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 355 + }, + "time": 1472069152, + "txn": { + "timestamp": 1472069152, + "length": 220, + "type": 0, + "txid": "c97bf2e161844d70686539eaec694b32678b130539946af8c3ec36f905e47d9a", + "inner_hash": "1e1f7265be9a1806a23a7f490fbd2f5c179e910102509dc4667e631115cad927", + "fee": 22951218, + "sigs": [ + "085b5436b72b9ccd1b0e8001c42408ff90ecb544a027da4e18dd550933a7ef8f7a9b5a44939856f9f8d47a8805091696148ba86cc174cfe73604f0b34e43290400" + ], + "inputs": [ + { + "uxid": "a0ba6219e79ab6470430b6b387602b58c96ef57a850e9dc94af8da0dfedfcad1", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25314.000000", + "hours": 10499712, + "calculated_hours": 30601622 + } + ], + "outputs": [ + { + "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24314.000000", + "hours": 3825202 + }, + { + "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 3825202 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 356 + }, + "time": 1472069172, + "txn": { + "timestamp": 1472069172, + "length": 220, + "type": 0, + "txid": "7ca2667f49dc21f893f2273c592618b0238959ec9aecc881150d6507c6a1755e", + "inner_hash": "06516c42bb9cd1d9584281fc41497afbcdbcf50d227e33d56016d003f426e262", + "fee": 2868902, + "sigs": [ + "8172d96cbb9f33bbe1a2852745015abd99c4702af53aa10a0124efe0a3e1a32766ec459367d62f21dce3b08361feda40eef78dc273577ee4c8f7a0ee5551bc6d00" + ], + "inputs": [ + { + "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24314.000000", + "hours": 3825202, + "calculated_hours": 3825202 + } + ], + "outputs": [ + { + "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23314.000000", + "hours": 478150 + }, + { + "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 478150 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 357 + }, + "time": 1472069232, + "txn": { + "timestamp": 1472069232, + "length": 220, + "type": 0, + "txid": "ccf714517563cfb8a9d694a7a0ac534da01cb74e18d8a9cd0d410081970d8015", + "inner_hash": "0470dddb1c719ccb518dc8df7d0150373c61e19e3bbe0d2ced04a6ca66d71215", + "fee": 358614, + "sigs": [ + "8d29d25b00cd13891c3af52b6481d173d186ac4281afdf5a9c0646a55664addd0edbde30ce3d51c3952571ba37f056f289adefc1dedb1dde3465d2a16de6a02c01" + ], + "inputs": [ + { + "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23314.000000", + "hours": 478150, + "calculated_hours": 478150 + } + ], + "outputs": [ + { + "uxid": "7e527dff560de74654aada4257259085486ea81716b577f7d8519a44beff78da", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22314.000000", + "hours": 59768 + }, + { + "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 59768 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 374 + }, + "time": 1473696472, + "txn": { + "timestamp": 1473696472, + "length": 511, + "type": 0, + "txid": "7a05ca15c9860700b34642339e91427ce0b211a8fe14805751d730f8ca0e5363", + "inner_hash": "34ef2b9ef8af1fb8d76b9ea9690356f2e0c20d1f672598020fa4e65aff25a9f5", + "fee": 88703844, + "sigs": [ + "a45592c587087f22e42bbf5ea9061e0668bd7e8fb3daa9c8bde6a1f2644c2a373c91d0b874a2fa95a4ce94284cf663035f83bba786c0c356ae055b89cedd623301", + "d422b1658a5a49642bd1126a269eaa1c939849dd9ca179db7992f0c274a16d313c4b2c9bb8dba458895ad7f12590da944af0880cb75592c0f4185c9b510747c900", + "a4250a03285edf63270784bc3e0d655b709622dfdfdd99af0b6f85060d3f540e36eeba0ed719a415f67d3c542e2efdc93c0fcfd9b0c946cca5c0fa5abc9837d901", + "e89be88a2dfd2beb052d0b628a2b4c09c38c3d19751e0551a65a22b6d9b4ed305974e673c7cb5d7c0259eeea76f2044f708c1ea2abf8cf5d92c84c81eed30b4201" + ], + "inputs": [ + { + "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "273631.000000", + "hours": 3042390, + "calculated_hours": 112708374 + }, + { + "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 3825202, + "calculated_hours": 4225310 + }, + { + "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 478150, + "calculated_hours": 878252 + }, + { + "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 59768, + "calculated_hours": 459854 + } + ], + "outputs": [ + { + "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 14783973 + }, + { + "uxid": "aa975eb226edc45f46bc54bbbf08143ae1cc0cfedea598c536e1810b36d26258", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "1000.000000", + "hours": 14783973 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 375 + }, + "time": 1473696502, + "txn": { + "timestamp": 1473696502, + "length": 220, + "type": 0, + "txid": "9da07bf85e25c466daeb9e4bb8825161e2f2eb60ce470fecff30a557d8ab8d58", + "inner_hash": "2bf9ee9274c70c66f52d81df6b1f56bdbba9b17d3a67371ee45c94c0d91ffdad", + "fee": 11087981, + "sigs": [ + "13d93765e882705c482307678fc2d7d4d10ec733626066d59a6ee0d83be0c3840f66e43dec32bc09b2dea074675e8cf1fb0e768891191657ff1e8895f6d24edc01" + ], + "inputs": [ + { + "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 14783973, + "calculated_hours": 14783973 + } + ], + "outputs": [ + { + "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "265631.000000", + "hours": 1847996 + }, + { + "uxid": "cb7e5dd3539b632b7c8de80bdd2bede4890d306ddde001854b21003546bdeb4a", + "dst": "bVMBhye4BsMtB9bC6t6VnQoYkbLH5JEb5A", + "coins": "10000.000000", + "hours": 1847996 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 423 + }, + "time": 1474976262, + "txn": { + "timestamp": 1474976262, + "length": 220, + "type": 0, + "txid": "c0b00aa1fac000b225f3d59983d7be04b41dded7e70549cd118648c0f4120622", + "inner_hash": "409996e4103fb8a6d0a508cd1b4b3f3c0145f255461ed590e013a4a1cec87f53", + "fee": 71142912, + "sigs": [ + "f11babcb58c0526909ab684968566c79f015a35eb5e800382847c58c12cd198b53cd8f5513139ba289ee547cbbbda6313516a8d18e10ee5497805d135020171c01" + ], + "inputs": [ + { + "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "265631.000000", + "hours": 1847996, + "calculated_hours": 94857214 + } + ], + "outputs": [ + { + "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "244831.000000", + "hours": 11857151 + }, + { + "uxid": "9e5bd56c83575b8628dc1c497b7987bccd3cea12267782be95bf7cc9b47d6364", + "dst": "kW69Hh12ng6hqD6GsScVq6Bo6VDGTgq7Gx", + "coins": "20800.000000", + "hours": 11857151 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 491 + }, + "time": 1478603012, + "txn": { + "timestamp": 1478603012, + "length": 414, + "type": 0, + "txid": "127cae7ab2e851738fc4c9894dade853173c658317e5e551c0618f3c14de0c6e", + "inner_hash": "ae44ad68c8a6f83d22436a19ff274d5eeeceb7c515348c910cf09abea87b4449", + "fee": 258638492, + "sigs": [ + "0a332a5c2c501b5fcf6d8ce21ef1aa6c82324dcaf5a4162a0ab8f6cada1ae56b19be195564263ace98db8a0b0b4c37a5ac080c5a55c76b2c9315980a025307b001", + "b2a3d81f2a2bd12ed1fc0d5bb9daa781a2553410902a25cfcf4c179165ef52936b86c4774ad3e9a4fbc2188f8fe7e5ad1949715c307ab4499b4d2bc2536bb2b600", + "e660d1823b2d2637c2da6080443410dadf90c8559e17b37b17fe51d553e2f26c0b71ee1b3a652b522b0f1cc17baef65f63457259b06fd6126fe4e2b1bf101e7d01" + ], + "inputs": [ + { + "uxid": "22f6cbb46c9d8566f6cdb3882dbd77bc473432c097b704c14457babd66da993d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "400.000000", + "hours": 3128290, + "calculated_hours": 3397714 + }, + { + "uxid": "d0e6c3ff06b1125d70a707f57b4888a96aa56fe26fbf0fc80ce7d560acc77f63", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "400.000000", + "hours": 27225, + "calculated_hours": 489283 + }, + { + "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "244831.000000", + "hours": 11857151, + "calculated_hours": 258504661 + } + ], + "outputs": [ + { + "uxid": "4594bb2382ac97aa0cf3ae0eeeae2d2a0dbe96a6293d0bd715e2ce7165080977", + "dst": "2X6eRFh6pp6rUHj74NJXLcmTg1TnDaPyYCw", + "coins": "1000.000000", + "hours": 1876583 + }, + { + "uxid": "931267f628963f9faccfaaa4973cb20a4d28a02a8c97a89f83f91d3413af7af7", + "dst": "Qq7dG2S5jwNgpayJzBf7kTtfWmpfSQPCQ6", + "coins": "244631.000000", + "hours": 1876583 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-incoming-212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-incoming-212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN.golden new file mode 100644 index 00000000..6279e632 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-incoming-212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN.golden @@ -0,0 +1,168 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-outgoing-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-outgoing-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden new file mode 100644 index 00000000..4d0dd8a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-outgoing-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden @@ -0,0 +1,4661 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 179, + "block_seq": 2 + }, + "time": 1427927651, + "txn": { + "timestamp": 1427927651, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 178, + "block_seq": 3 + }, + "time": 1427927671, + "txn": { + "timestamp": 1427927671, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 177, + "block_seq": 4 + }, + "time": 1428793611, + "txn": { + "timestamp": 1428793611, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 176, + "block_seq": 5 + }, + "time": 1428798821, + "txn": { + "timestamp": 1428798821, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 155, + "block_seq": 26 + }, + "time": 1429011077, + "txn": { + "timestamp": 1429011077, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "fee": 3407635, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 4543507 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 154, + "block_seq": 27 + }, + "time": 1429011137, + "txn": { + "timestamp": 1429011137, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "fee": 425954, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 567938 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 143, + "block_seq": 38 + }, + "time": 1429058484, + "txn": { + "timestamp": 1429058484, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "fee": 2335473, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 3113963 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 141, + "block_seq": 40 + }, + "time": 1429058514, + "txn": { + "timestamp": 1429058514, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "fee": 36493, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 48655 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 140, + "block_seq": 41 + }, + "time": 1429058524, + "txn": { + "timestamp": 1429058524, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "fee": 4561, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 6081 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 136, + "block_seq": 45 + }, + "time": 1429071074, + "txn": { + "timestamp": 1429071074, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "fee": 2402820, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3203760 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 124, + "block_seq": 57 + }, + "time": 1429077584, + "txn": { + "timestamp": 1429077584, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "fee": 10088, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 13450 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 120, + "block_seq": 61 + }, + "time": 1429077654, + "txn": { + "timestamp": 1429077654, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "fee": 9118, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 12156 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 117, + "block_seq": 64 + }, + "time": 1429077694, + "txn": { + "timestamp": 1429077694, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "fee": 7026, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 9366 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 114, + "block_seq": 67 + }, + "time": 1429077874, + "txn": { + "timestamp": 1429077874, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "fee": 8718, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 11622 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 113, + "block_seq": 68 + }, + "time": 1429077914, + "txn": { + "timestamp": 1429077914, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "fee": 1090, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 112, + "block_seq": 69 + }, + "time": 1429077944, + "txn": { + "timestamp": 1429077944, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "fee": 137, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 181 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 111, + "block_seq": 70 + }, + "time": 1429077964, + "txn": { + "timestamp": 1429077964, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "fee": 18, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 22 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 104, + "block_seq": 77 + }, + "time": 1429147880, + "txn": { + "timestamp": 1429147880, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "fee": 5860904, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 7814538 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 100, + "block_seq": 81 + }, + "time": 1429164440, + "txn": { + "timestamp": 1429164440, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "fee": 754183, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 1005575 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 96, + "block_seq": 85 + }, + "time": 1429164620, + "txn": { + "timestamp": 1429164620, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "fee": 121202, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 161602 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 95, + "block_seq": 86 + }, + "time": 1429164720, + "txn": { + "timestamp": 1429164720, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "fee": 15150, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 20200 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 91, + "block_seq": 90 + }, + "time": 1429164810, + "txn": { + "timestamp": 1429164810, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "fee": 16229, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 21637 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 87, + "block_seq": 94 + }, + "time": 1429164870, + "txn": { + "timestamp": 1429164870, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "fee": 10977, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 14635 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 83, + "block_seq": 98 + }, + "time": 1429274566, + "txn": { + "timestamp": 1429274566, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "fee": 71088, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 94784 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 75, + "block_seq": 106 + }, + "time": 1429279796, + "txn": { + "timestamp": 1429279796, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "fee": 835759, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 962798 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11903 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7564 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 132080 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 74, + "block_seq": 107 + }, + "time": 1429280596, + "txn": { + "timestamp": 1429280596, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "fee": 104471, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 139293 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 72, + "block_seq": 109 + }, + "time": 1429302756, + "txn": { + "timestamp": 1429302756, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "fee": 42555, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 56739 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 70, + "block_seq": 111 + }, + "time": 1429348072, + "txn": { + "timestamp": 1429348072, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "fee": 13386, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 17848 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 69, + "block_seq": 112 + }, + "time": 1429348102, + "txn": { + "timestamp": 1429348102, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "fee": 8332864, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11108253 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2231 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 67, + "block_seq": 114 + }, + "time": 1429348502, + "txn": { + "timestamp": 1429348502, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "fee": 130201, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 173601 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66, + "block_seq": 115 + }, + "time": 1429348712, + "txn": { + "timestamp": 1429348712, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "fee": 16276, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 21700 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 64, + "block_seq": 117 + }, + "time": 1429351912, + "txn": { + "timestamp": 1429351912, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "fee": 125795, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 167725 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 59, + "block_seq": 122 + }, + "time": 1429382898, + "txn": { + "timestamp": 1429382898, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "fee": 283986, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 378646 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57, + "block_seq": 124 + }, + "time": 1429522086, + "txn": { + "timestamp": 1429522086, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "fee": 4438, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 5916 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 56, + "block_seq": 125 + }, + "time": 1429578056, + "txn": { + "timestamp": 1429578056, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "fee": 555, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 54, + "block_seq": 127 + }, + "time": 1429848410, + "txn": { + "timestamp": 1429848410, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "fee": 3170256, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1175478 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3051530 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53, + "block_seq": 128 + }, + "time": 1429849170, + "txn": { + "timestamp": 1429849170, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "fee": 41968911, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55430171 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528376 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 50, + "block_seq": 131 + }, + "time": 1430330041, + "txn": { + "timestamp": 1430330041, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "fee": 76257058, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 101676076 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 49, + "block_seq": 132 + }, + "time": 1430330311, + "txn": { + "timestamp": 1430330311, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "fee": 9532133, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12709509 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 48, + "block_seq": 133 + }, + "time": 1430330421, + "txn": { + "timestamp": 1430330421, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "fee": 1191516, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1588688 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 47, + "block_seq": 134 + }, + "time": 1430330481, + "txn": { + "timestamp": 1430330481, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "fee": 148940, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 198586 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46, + "block_seq": 135 + }, + "time": 1430330591, + "txn": { + "timestamp": 1430330591, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "fee": 18619, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 24823 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45, + "block_seq": 136 + }, + "time": 1430330851, + "txn": { + "timestamp": 1430330851, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "fee": 2328, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 3102 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 44, + "block_seq": 137 + }, + "time": 1430504186, + "txn": { + "timestamp": 1430504186, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "fee": 291, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 43, + "block_seq": 138 + }, + "time": 1430504236, + "txn": { + "timestamp": 1430504236, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "fee": 36, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 48 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 42, + "block_seq": 139 + }, + "time": 1430504536, + "txn": { + "timestamp": 1430504536, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "fee": 6, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 41, + "block_seq": 140 + }, + "time": 1430504746, + "txn": { + "timestamp": 1430504746, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "fee": 0, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 40, + "block_seq": 141 + }, + "time": 1430504846, + "txn": { + "timestamp": 1430504846, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "fee": 0, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 39, + "block_seq": 142 + }, + "time": 1430504966, + "txn": { + "timestamp": 1430504966, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "fee": 0, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38, + "block_seq": 143 + }, + "time": 1430505086, + "txn": { + "timestamp": 1430505086, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "fee": 0, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 37, + "block_seq": 144 + }, + "time": 1430505176, + "txn": { + "timestamp": 1430505176, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "fee": 0, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 35, + "block_seq": 146 + }, + "time": 1430641376, + "txn": { + "timestamp": 1430641376, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "fee": 6894507, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 9192675 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 34, + "block_seq": 147 + }, + "time": 1430641536, + "txn": { + "timestamp": 1430641536, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "fee": 861814, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1149084 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 33, + "block_seq": 148 + }, + "time": 1430642006, + "txn": { + "timestamp": 1430642006, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "fee": 107727, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 143635 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 32, + "block_seq": 149 + }, + "time": 1430642106, + "txn": { + "timestamp": 1430642106, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "fee": 13466, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 17954 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 31, + "block_seq": 150 + }, + "time": 1430642306, + "txn": { + "timestamp": 1430642306, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "fee": 1684, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 2244 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 30, + "block_seq": 151 + }, + "time": 1430642426, + "txn": { + "timestamp": 1430642426, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "fee": 210, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 280 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 29, + "block_seq": 152 + }, + "time": 1430642546, + "txn": { + "timestamp": 1430642546, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "fee": 27, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 28, + "block_seq": 153 + }, + "time": 1430642816, + "txn": { + "timestamp": 1430642816, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "fee": 4, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 27, + "block_seq": 154 + }, + "time": 1430643706, + "txn": { + "timestamp": 1430643706, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "fee": 0, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 26, + "block_seq": 155 + }, + "time": 1430643906, + "txn": { + "timestamp": 1430643906, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "fee": 0, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 25, + "block_seq": 156 + }, + "time": 1430644036, + "txn": { + "timestamp": 1430644036, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "fee": 0, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 24, + "block_seq": 157 + }, + "time": 1430673946, + "txn": { + "timestamp": 1430673946, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "fee": 0, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 23, + "block_seq": 158 + }, + "time": 1430674696, + "txn": { + "timestamp": 1430674696, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "fee": 0, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 22, + "block_seq": 159 + }, + "time": 1430715196, + "txn": { + "timestamp": 1430715196, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "fee": 0, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 21, + "block_seq": 160 + }, + "time": 1430784172, + "txn": { + "timestamp": 1430784172, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "fee": 0, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 20, + "block_seq": 161 + }, + "time": 1430784312, + "txn": { + "timestamp": 1430784312, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "fee": 0, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 19, + "block_seq": 162 + }, + "time": 1430784372, + "txn": { + "timestamp": 1430784372, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "fee": 0, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 18, + "block_seq": 163 + }, + "time": 1430784932, + "txn": { + "timestamp": 1430784932, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "fee": 0, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 16, + "block_seq": 165 + }, + "time": 1430790152, + "txn": { + "timestamp": 1430790152, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "fee": 0, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 14, + "block_seq": 167 + }, + "time": 1430791902, + "txn": { + "timestamp": 1430791902, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "fee": 201915, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 269219 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 13, + "block_seq": 168 + }, + "time": 1430792072, + "txn": { + "timestamp": 1430792072, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "fee": 25240, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 33652 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10, + "block_seq": 171 + }, + "time": 1430870562, + "txn": { + "timestamp": 1430870562, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8, + "block_seq": 173 + }, + "time": 1430871512, + "txn": { + "timestamp": 1430871512, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 6, + "block_seq": 175 + }, + "time": 1430908702, + "txn": { + "timestamp": 1430908702, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 2, + "block_seq": 179 + }, + "time": 1431339429, + "txn": { + "timestamp": 1431339429, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns-verbose.golden new file mode 100644 index 00000000..131bffd2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns-verbose.golden @@ -0,0 +1,45 @@ +[ + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns.golden new file mode 100644 index 00000000..6b5f05cf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns.golden @@ -0,0 +1,38 @@ +[ + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden new file mode 100644 index 00000000..1904596a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 1000000000000, + "hours": 1013371112 + }, + "predicted": { + "coins": 1000000000000, + "hours": 1013371112 + }, + "addresses": { + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf": { + "confirmed": { + "coins": 1000000000000, + "hours": 1013371112 + }, + "predicted": { + "coins": 1000000000000, + "hours": 1013371112 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-affected-by-unconfirmed-txns.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-affected-by-unconfirmed-txns.golden new file mode 100644 index 00000000..fa633b3e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-affected-by-unconfirmed-txns.golden @@ -0,0 +1,32 @@ +{ + "confirmed": { + "coins": 616700000000, + "hours": 45935222 + }, + "predicted": { + "coins": 616700000000, + "hours": 11637641 + }, + "addresses": { + "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN": { + "confirmed": { + "coins": 1000000000, + "hours": 205115 + }, + "predicted": { + "coins": 11000000000, + "hours": 5921378 + } + }, + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ": { + "confirmed": { + "coins": 615700000000, + "hours": 45730107 + }, + "predicted": { + "coins": 605700000000, + "hours": 5716263 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-noaddrs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-noaddrs.golden new file mode 100644 index 00000000..5113473a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-noaddrs.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-two-addrs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-two-addrs.golden new file mode 100644 index 00000000..fdf5ffc3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-two-addrs.golden @@ -0,0 +1,32 @@ +{ + "confirmed": { + "coins": 1022100000000, + "hours": 1013748655 + }, + "predicted": { + "coins": 1022100000000, + "hours": 1013748655 + }, + "addresses": { + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf": { + "confirmed": { + "coins": 1000000000000, + "hours": 1013371112 + }, + "predicted": { + "coins": 1000000000000, + "hours": 1013371112 + } + }, + "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5": { + "confirmed": { + "coins": 22100000000, + "hours": 377543 + }, + "predicted": { + "coins": 22100000000, + "hours": 377543 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-genesis.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-genesis.golden new file mode 100644 index 00000000..b21bc8a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-genesis.golden @@ -0,0 +1,33 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose-genesis.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose-genesis.golden new file mode 100644 index 00000000..7634ffe2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose-genesis.golden @@ -0,0 +1,34 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose.golden new file mode 100644 index 00000000..3fe1ca5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose.golden @@ -0,0 +1,50 @@ +{ + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "ux_hash": "47d440eb55e32969f35f46450636ca919195977ab8bb5fa3d1e9f0f4b48d7fa1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "fee": 0, + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash.golden new file mode 100644 index 00000000..622ce74b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash.golden @@ -0,0 +1,43 @@ +{ + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "ux_hash": "47d440eb55e32969f35f46450636ca919195977ab8bb5fa3d1e9f0f4b48d7fa1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last-verbose.golden new file mode 100644 index 00000000..2713e8af --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last-verbose.golden @@ -0,0 +1,54 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "fee": 2265261, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586, + "calculated_hours": 3020347 + } + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last.golden new file mode 100644 index 00000000..cccffcd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last.golden @@ -0,0 +1,47 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-0.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-0.golden new file mode 100644 index 00000000..b21bc8a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-0.golden @@ -0,0 +1,33 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-1.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-1.golden new file mode 100644 index 00000000..e4fc6e8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-1.golden @@ -0,0 +1,631 @@ +{ + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-100.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-100.golden new file mode 100644 index 00000000..4bdbb31f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-100.golden @@ -0,0 +1,37 @@ +{ + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "ux_hash": "ff354e4774397b6c1ab46e56920c82f79e54ac8edce2f0fc4a2e6f472a5e5aca" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-0.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-0.golden new file mode 100644 index 00000000..7634ffe2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-0.golden @@ -0,0 +1,34 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-1.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-1.golden new file mode 100644 index 00000000..b9697e16 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-1.golden @@ -0,0 +1,638 @@ +{ + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-100.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-100.golden new file mode 100644 index 00000000..8bf91b1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-100.golden @@ -0,0 +1,44 @@ +{ + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "ux_hash": "ff354e4774397b6c1ab46e56920c82f79e54ac8edce2f0fc4a2e6f472a5e5aca" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "fee": 613712, + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294, + "calculated_hours": 701385 + } + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180-no-unconfirmed.db b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180-no-unconfirmed.db new file mode 100644 index 00000000..f0908f2d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180-no-unconfirmed.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180.db b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180.db new file mode 100644 index 00000000..817ab5d6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata-no-unconfirmed.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata-no-unconfirmed.golden new file mode 100644 index 00000000..251174a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata-no-unconfirmed.golden @@ -0,0 +1,14 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata.golden new file mode 100644 index 00000000..96d25d84 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata.golden @@ -0,0 +1,14 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-progress.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-progress.golden new file mode 100644 index 00000000..41f23bcd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-progress.golden @@ -0,0 +1,5 @@ +{ + "current": 180, + "highest": 180, + "peers": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7-verbose.golden new file mode 100644 index 00000000..e58b8875 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7-verbose.golden @@ -0,0 +1,156 @@ +{ + "blocks": [ + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "fee": 0, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7.golden new file mode 100644 index 00000000..3f51e310 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7.golden @@ -0,0 +1,129 @@ +{ + "blocks": [ + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-all.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-all.golden new file mode 100644 index 00000000..eb45b072 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-all.golden @@ -0,0 +1,8327 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + }, + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "ux_hash": "dad0a423ff7b1c5c6021698c5c75da34df37b9fc0a5b0c60bcbb50e8665c0610" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "ux_hash": "34174a65e1b34d0d7dd0e219f7969e303d4117024b14f8fa5ecc58c29c4c417c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "ux_hash": "4f560eea54f060c029cedc78480a59f6ca549d4fd6cb84fb0388001dcd11b5b7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "ux_hash": "dc4b68b8067932c191922c68504bc443c46144ef904c12b50008b3d77ae91aeb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "ux_hash": "47d440eb55e32969f35f46450636ca919195977ab8bb5fa3d1e9f0f4b48d7fa1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 12, + "block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "previous_block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "timestamp": 1428814821, + "fee": 0, + "version": 0, + "tx_body_hash": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "ux_hash": "33777b4a681c64d95213939b1488991d9b055b243fa30e49842d0177224b4d98" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953" + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 13, + "block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "previous_block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "timestamp": 1428814891, + "fee": 2, + "version": 0, + "tx_body_hash": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "ux_hash": "000f0d2c246891541cbab3efd2cfad6a1b241c1c716c2e942819eaa59a44370b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c" + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 14, + "block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "previous_block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "timestamp": 1428815131, + "fee": 0, + "version": 0, + "tx_body_hash": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "ux_hash": "634b6bb24e8d1c21ea35c83322a18546b3d69b754865c8c8381f3c00ceeaf648" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8" + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 15, + "block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "previous_block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "timestamp": 1428820169, + "fee": 51, + "version": 0, + "tx_body_hash": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "ux_hash": "162569c321e9d7b1740490a856caec4556df25b5219ddbce1a3c6105158c53d4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840" + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 16, + "block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "previous_block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "timestamp": 1428820629, + "fee": 0, + "version": 0, + "tx_body_hash": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "ux_hash": "9be6e3e08898bb1dd9e22e3e46a69abd580bbeec7a27daa891ba795afe3cfdb7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3" + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 17, + "block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "previous_block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "timestamp": 1428989855, + "fee": 2020394, + "version": 0, + "tx_body_hash": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "ux_hash": "8a65d3fbb5226c9f26466ceecfb8343a5182d46d9088d0d73ac94eebce208a46" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 18, + "block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "previous_block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "timestamp": 1428989925, + "fee": 0, + "version": 0, + "tx_body_hash": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "ux_hash": "178eb5802c1c8a49b0886009dde215b34ca386cd3794500d0e5695e0ddc5a139" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 19, + "block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "previous_block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "timestamp": 1428990115, + "fee": 1134, + "version": 0, + "tx_body_hash": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "ux_hash": "e4e2573c61942302d19d29f41de3894da2998a8dcd70379b053c0fb06929c8ae" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159" + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 20, + "block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "previous_block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "timestamp": 1428990135, + "fee": 756, + "version": 0, + "tx_body_hash": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "ux_hash": "3b1a3ef6e15819213a7187b8bc8d03577195f09f0213b205c132b5526a299dae" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d" + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 21, + "block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "previous_block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "timestamp": 1428991365, + "fee": 504, + "version": 0, + "tx_body_hash": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "ux_hash": "8564c5d554513f0213063e68c6f30940950bac9e4f7d149b0a75ce27fbe08dbf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c" + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 22, + "block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "previous_block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "timestamp": 1428991585, + "fee": 0, + "version": 0, + "tx_body_hash": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "ux_hash": "c0e9ab176138c41212fdfe67ff5bafdf1f847047be08bccb3fb6e86e7ba6ca98" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6" + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 23, + "block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "previous_block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "timestamp": 1428991605, + "fee": 0, + "version": 0, + "tx_body_hash": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "ux_hash": "87372b955f6c577e7b320721d6b0af7f4629c440ca109894ad873af5c5f48291" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846" + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 24, + "block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "previous_block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "timestamp": 1428991635, + "fee": 0, + "version": 0, + "tx_body_hash": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "ux_hash": "8460866d61c0680981b655f485a26ce122dcdecc03c3a376a1877bb280303780" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c" + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 25, + "block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "previous_block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "timestamp": 1428991665, + "fee": 0, + "version": 0, + "tx_body_hash": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "ux_hash": "0da490050bc42511d86b8cfcf63172c24ec736ffd6595bce0d2df48596016869" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e" + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 26, + "block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "previous_block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "timestamp": 1429011077, + "fee": 3407635, + "version": 0, + "tx_body_hash": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "ux_hash": "51bdbf6235d29ffb41102b2eb33ca48a86c49be6e3d6c8f9b2becdb440b43f3d" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef" + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 27, + "block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "previous_block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "timestamp": 1429011137, + "fee": 425954, + "version": 0, + "tx_body_hash": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "ux_hash": "c8d8839903bb3f82d6beb62accf60b505048fb587c62f4364031c815c9808f81" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba" + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 28, + "block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "previous_block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "timestamp": 1429020387, + "fee": 214, + "version": 0, + "tx_body_hash": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "ux_hash": "3f71dfad629418433c00eaac3126d584daa269951e286790172c89eadc92a00c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452" + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 29, + "block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "previous_block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "timestamp": 1429020687, + "fee": 551, + "version": 0, + "tx_body_hash": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "ux_hash": "ad32a8a9357e41dac2a7a38e120862439441f8b78ef187c9b041b5fcd77aed1b" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f" + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 30, + "block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "previous_block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "timestamp": 1429021044, + "fee": 31, + "version": 0, + "tx_body_hash": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "ux_hash": "18a38d48eba01d3bf392cfd7c92ae5a1f95d7bc0f91b26abcbb9fdfe11bbf581" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea" + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 31, + "block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "previous_block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "timestamp": 1429021184, + "fee": 60, + "version": 0, + "tx_body_hash": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "ux_hash": "011f23d6473dfdf9802a866ec50b1a4d26984b97c3bc9152ce40a341c35db446" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 32, + "block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "previous_block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "timestamp": 1429021214, + "fee": 8, + "version": 0, + "tx_body_hash": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "ux_hash": "ccf0002e9020c40441ac01fefb32ab5736833f82e5842473c2ddbe3db4f86418" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 33, + "block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "previous_block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "timestamp": 1429021674, + "fee": 9, + "version": 0, + "tx_body_hash": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "ux_hash": "924f087d5681f12417a20ff9cfc7fc7d92f0e72a3cc75177c0d1194e76e61216" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 34, + "block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "previous_block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "timestamp": 1429021994, + "fee": 1, + "version": 0, + "tx_body_hash": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "ux_hash": "e75a837820ec1bf43a7fbab324c1eec1cefc436d65a12d2bdfd45ecd8c0b0a48" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 35, + "block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "previous_block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "timestamp": 1429022034, + "fee": 0, + "version": 0, + "tx_body_hash": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "ux_hash": "55d2c6ea4d79cd339b7c76d630333f75cc62dd224357ff78ed43066dff854fb3" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 36, + "block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "previous_block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "timestamp": 1429022064, + "fee": 0, + "version": 0, + "tx_body_hash": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "ux_hash": "3f5d59f0677d598dbe7c5e4415ae99a50be414c2e831198cdf09fbeb00b47798" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 37, + "block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "previous_block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "timestamp": 1429022094, + "fee": 0, + "version": 0, + "tx_body_hash": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "ux_hash": "9741ded2fb1b032ac1f5a914e4763508a5a8debfa3e3c1309770696ed4119d39" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 38, + "block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "previous_block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "timestamp": 1429058484, + "fee": 2335473, + "version": 0, + "tx_body_hash": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "ux_hash": "92ad4d294c00edfa740be4a8bcd37c0986e5c8dacf8504eaa8aad37661030eb9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33" + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 39, + "block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "previous_block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "timestamp": 1429058494, + "fee": 291935, + "version": 0, + "tx_body_hash": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "ux_hash": "4fb04fb3ff93092a37bebaa62d5b2a3676d801268a86e184ba19a55e8d101df3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 40, + "block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "previous_block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "timestamp": 1429058514, + "fee": 36493, + "version": 0, + "tx_body_hash": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "ux_hash": "9e0f4fdc945df9ffcd31adbaddd5469c9ff39b297308fc76469af04bd8349080" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6" + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 41, + "block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "previous_block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "timestamp": 1429058524, + "fee": 4561, + "version": 0, + "tx_body_hash": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "ux_hash": "d3f60f0d20aeac951aacab8d849696cac54c7057da741cfd90b63018100818d0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 42, + "block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "previous_block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "timestamp": 1429058594, + "fee": 292512, + "version": 0, + "tx_body_hash": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "ux_hash": "9173768496bc49e2a34d5a7ea65d05ad6507dfdb489836e861b3c03d35efeb7a" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 43, + "block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "previous_block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "timestamp": 1429070374, + "fee": 1596, + "version": 0, + "tx_body_hash": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "ux_hash": "46d8cf99e912e732164aa7910ab409e056f7190492d00075499d77dbb8108f94" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403" + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 44, + "block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "previous_block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "timestamp": 1429070414, + "fee": 199, + "version": 0, + "tx_body_hash": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "ux_hash": "5a8a9e30aa37f987b7f3fe0ae6c6048585b168ffacc602392d6d3855bf2cf64e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9" + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 45, + "block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "previous_block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "timestamp": 1429071074, + "fee": 2402820, + "version": 0, + "tx_body_hash": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "ux_hash": "ad85d15310a5086ec9f2c9478a540fa5e3d23298f2f2124a5142ae089b4bd567" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5" + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 46, + "block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "previous_block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "timestamp": 1429077374, + "fee": 300354, + "version": 0, + "tx_body_hash": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "ux_hash": "d444545422cfd535553abee015965d916ad0a9f3e6446222a2c5c248343dec1c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 47, + "block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "previous_block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "timestamp": 1429077384, + "fee": 37544, + "version": 0, + "tx_body_hash": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "ux_hash": "68ade91c1b0a98b80fbdbb5829a75e95ea2e4a97776883b4576a245bfce271a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 48, + "block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "previous_block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "timestamp": 1429077394, + "fee": 4693, + "version": 0, + "tx_body_hash": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "ux_hash": "bf2c980d37c36e3a6d1179a698d43ef1d659c438bba0c84b3b09518a94a8a706" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 49, + "block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "previous_block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "timestamp": 1429077404, + "fee": 588, + "version": 0, + "tx_body_hash": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "ux_hash": "b705b08e59a5ec4ae59f16940fa182f83326ab7278809e25c2094ef2202e3992" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 50, + "block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "previous_block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "timestamp": 1429077474, + "fee": 71833, + "version": 0, + "tx_body_hash": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "ux_hash": "589b1ba02530656309a8dddec9b9450d16e4b5b2c8b64708ba0a8b453c5b0b5e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead" + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 51, + "block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "previous_block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "timestamp": 1429077484, + "fee": 44061, + "version": 0, + "tx_body_hash": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "ux_hash": "f893ff5304a0ad87aec6345e962bb6648411b2b0dfad95940725b676f4e558cd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86" + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 52, + "block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "previous_block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "timestamp": 1429077494, + "fee": 8996, + "version": 0, + "tx_body_hash": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "ux_hash": "3241684b9e1c9b5d244b302446b9f947097a312397c04e59bc10ce01212e533d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6" + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 53, + "block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "previous_block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "timestamp": 1429077514, + "fee": 17787, + "version": 0, + "tx_body_hash": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "ux_hash": "84e514782cf16533fd2794f2f58b184ca4e4e3459ef4ca9a39da4e1be0b4c3bc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 54, + "block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "previous_block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "timestamp": 1429077524, + "fee": 1153, + "version": 0, + "tx_body_hash": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "ux_hash": "3d81d11b54c9272629d1384de9c386c84337aafb9ffb604cea3a6cebacd0078a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09" + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 55, + "block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "previous_block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "timestamp": 1429077544, + "fee": 5583, + "version": 0, + "tx_body_hash": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "ux_hash": "64c7ad66527c657e10c2813b87dfc40a0c0a8638c47b925e0d5988ef7282b768" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2" + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 56, + "block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "previous_block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "timestamp": 1429077554, + "fee": 76179, + "version": 0, + "tx_body_hash": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "ux_hash": "06ec76934a86bc53c39937cff9ba786c83ae1b1e6695bad5a3864611014f9861" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 57, + "block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "previous_block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "timestamp": 1429077584, + "fee": 10088, + "version": 0, + "tx_body_hash": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "ux_hash": "453b6d29b16a4858982f81e90d8189d94878d6b215cb1f949982e650576bef8f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea" + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 58, + "block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "previous_block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "timestamp": 1429077604, + "fee": 220, + "version": 0, + "tx_body_hash": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "ux_hash": "0b67862cfc42f6128307f583efe4ee78167523cc90d6308a0616f9c9a5470b45" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f" + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 59, + "block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "previous_block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "timestamp": 1429077614, + "fee": 799, + "version": 0, + "tx_body_hash": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "ux_hash": "790eb4c054ec7664e0775a7012ace595d6daa8fb8b87ce11196592fdc713d56c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a" + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 60, + "block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "previous_block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "timestamp": 1429077624, + "fee": 9636, + "version": 0, + "tx_body_hash": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "ux_hash": "89c92403dce794e750618b5abcfcb03ccf102d8a2475196dee462bbeb3d8d9e9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 61, + "block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "previous_block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "timestamp": 1429077654, + "fee": 9118, + "version": 0, + "tx_body_hash": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "ux_hash": "ada8c5ad5da401c9859ccd0b505b2052be5d3e71865fe4ba0b05a17073e2b287" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731" + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 62, + "block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "previous_block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "timestamp": 1429077664, + "fee": 79, + "version": 0, + "tx_body_hash": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "ux_hash": "4e0cf3e7a61064664738416c30a67af01c33bfc031bc662c935e14221fe1ab81" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49" + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 63, + "block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "previous_block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "timestamp": 1429077684, + "fee": 1271, + "version": 0, + "tx_body_hash": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "ux_hash": "146aa609909e365dfa1e1537f21e2679a729846224f4cc906fbc79e11f2547dc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 64, + "block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "previous_block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "timestamp": 1429077694, + "fee": 7026, + "version": 0, + "tx_body_hash": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "ux_hash": "a2484ef64ef7dbfc9f694aa080d3a333972e795371b3762a973549c929136e3f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648" + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 65, + "block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "previous_block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "timestamp": 1429077724, + "fee": 36, + "version": 0, + "tx_body_hash": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "ux_hash": "6231253b3d6f8a4d8383f750e1f98cecb128cf73820ad6e19a251abe76970e94" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36" + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 66, + "block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "previous_block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "timestamp": 1429077734, + "fee": 259, + "version": 0, + "tx_body_hash": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "ux_hash": "47b6b7ce444902e1a0c96aea06bcb6e70ad6b41476e02ba536cc82c765743f8b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900" + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 67, + "block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "previous_block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "timestamp": 1429077874, + "fee": 8718, + "version": 0, + "tx_body_hash": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "ux_hash": "afb39102e6b76ffcae61504432b16a5309cc6839766b3fb365b5bdbcad318dd2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639" + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 68, + "block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "previous_block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "timestamp": 1429077914, + "fee": 1090, + "version": 0, + "tx_body_hash": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "ux_hash": "1f34f1f16f2e80571b058019258b893019e01bb338870e631711c1755fa0e4fa" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a" + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 69, + "block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "previous_block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "timestamp": 1429077944, + "fee": 137, + "version": 0, + "tx_body_hash": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "ux_hash": "0fb49592b74e8fd720494fc2bd6a768099381137872e93db7aaba814ca8848a4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698" + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 70, + "block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "previous_block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "timestamp": 1429077964, + "fee": 18, + "version": 0, + "tx_body_hash": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "ux_hash": "2b0d5300dd48c11d46e185ee52c7906ef5f1f547a19cced5376335696c1cfc78" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3" + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 71, + "block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "previous_block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "timestamp": 1429077974, + "fee": 2, + "version": 0, + "tx_body_hash": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "ux_hash": "589b2ec4bab9cad26ab92dd189e3b4cc64701e8a82d97c6b19efcab980d44824" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 72, + "block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "previous_block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "timestamp": 1429078004, + "fee": 558, + "version": 0, + "tx_body_hash": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "ux_hash": "62b5aa989f79cc3d398f4047a7d5df9f35ca6098fbca504d819b95529bd77222" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb" + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 73, + "block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "previous_block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "timestamp": 1429091164, + "fee": 2326, + "version": 0, + "tx_body_hash": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "ux_hash": "3ba29e2a1959b76b8e90a94686427e1ee461e6a90ab12dbbec5cfa6352e6dc74" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 74, + "block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "previous_block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "timestamp": 1429091944, + "fee": 43640, + "version": 0, + "tx_body_hash": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "ux_hash": "5704cffe1444e6e24bccba99acf0d6175cb6c6db3e2619cf3b1a9add81e110c7" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad" + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 75, + "block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "previous_block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "timestamp": 1429096344, + "fee": 5455, + "version": 0, + "tx_body_hash": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "ux_hash": "ea36ebaf2a3e4a37487a1aac964240f60aa1b2b96aeb4e42c0d443d57218430c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1" + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 76, + "block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "previous_block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "timestamp": 1429110544, + "fee": 432263, + "version": 0, + "tx_body_hash": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "ux_hash": "6c5bfb09207562e126ba386e7b106669fb86b94d33b3376c711c15eb47594ca1" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a" + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 77, + "block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "previous_block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "timestamp": 1429147880, + "fee": 5860904, + "version": 0, + "tx_body_hash": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "ux_hash": "e16c215cddf959cbd0fc5143c4ab211dac70731fc4609e1124b7a5fa5263356d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642" + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 78, + "block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "previous_block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "timestamp": 1429147900, + "fee": 407859, + "version": 0, + "tx_body_hash": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "ux_hash": "0980923d75cda1985847ebfbd48e0c7bf853fd08eb38cd09277dd09cf60020f5" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048" + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 79, + "block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "previous_block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "timestamp": 1429147950, + "fee": 466755, + "version": 0, + "tx_body_hash": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "ux_hash": "869ce7a7d48b54f32c34faa2a3517aa7d67db11f5ce59325f9725c030c7151ed" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 80, + "block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "previous_block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "timestamp": 1429148000, + "fee": 51265, + "version": 0, + "tx_body_hash": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "ux_hash": "ae92c3b70cd1ee84ab8240daacbdf01e2ba39ccf7a590b74658d8afa005c4b28" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a" + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 81, + "block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "previous_block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "timestamp": 1429164440, + "fee": 754183, + "version": 0, + "tx_body_hash": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "ux_hash": "7c481dd4fe40fc2b01ada90537c14a1266dc638a333ef72d38005e9c2c288916" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f" + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 82, + "block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "previous_block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "timestamp": 1429164460, + "fee": 558303, + "version": 0, + "tx_body_hash": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "ux_hash": "46d65f755f018ad9a85c79773f57d048e9178178f63c1dd354c8db6cd97a46e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa" + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 83, + "block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "previous_block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "timestamp": 1429164480, + "fee": 164971, + "version": 0, + "tx_body_hash": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "ux_hash": "a64f119533068375ed5a85cda7224a0cb794c41500727c2909d1e08575e4ab80" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 84, + "block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "previous_block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "timestamp": 1429164590, + "fee": 20623, + "version": 0, + "tx_body_hash": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "ux_hash": "c989c40c9ac5f17f49281254bca90873f4c196c220eef96209e0e60e7927554f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 85, + "block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "previous_block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "timestamp": 1429164620, + "fee": 121202, + "version": 0, + "tx_body_hash": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "ux_hash": "b5f5c67fc21c9259f089688afad62d15bbdacc51704d81b50d432e0a57fc35a1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0" + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 86, + "block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "previous_block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "timestamp": 1429164720, + "fee": 15150, + "version": 0, + "tx_body_hash": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "ux_hash": "dafc5be48e442e64240d3e432457f737fea6a0ee9b3cc6d5b192aa50cccb1252" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2" + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 87, + "block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "previous_block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "timestamp": 1429164730, + "fee": 96974, + "version": 0, + "tx_body_hash": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "ux_hash": "01793218345b2cb5af94baffc6b43d78439bd89e63c9c124e7d640ba07934597" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9" + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 88, + "block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "previous_block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "timestamp": 1429164790, + "fee": 71476, + "version": 0, + "tx_body_hash": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "ux_hash": "78a3643517aa6a128fedef4feb99693c629d1dbd749280dac09c6dc13c1aad20" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd" + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 89, + "block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "previous_block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "timestamp": 1429164800, + "fee": 3816, + "version": 0, + "tx_body_hash": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "ux_hash": "2036f6edf1a278ca56ff144b61e7d92ae59a071979092a0a5cce1be9662334d8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 90, + "block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "previous_block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "timestamp": 1429164810, + "fee": 16229, + "version": 0, + "tx_body_hash": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "ux_hash": "88b0746b83b29bf1614beb8304ab1cd34327f04f0d857ccbc26f3eb7092d4668" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e" + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 91, + "block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "previous_block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "timestamp": 1429164830, + "fee": 12539, + "version": 0, + "tx_body_hash": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "ux_hash": "20f35999317908d338a5ce6d4eb236a43660ebebb3dfcc1152b3011aa65838c8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9" + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 92, + "block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "previous_block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "timestamp": 1429164850, + "fee": 9176, + "version": 0, + "tx_body_hash": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "ux_hash": "231a4ef65f5f0944392cf5fb548419c0a6cc70f20fb6865da290a1dbb7f23a24" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49" + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 93, + "block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "previous_block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "timestamp": 1429164860, + "fee": 775, + "version": 0, + "tx_body_hash": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "ux_hash": "5a500555ded8514cdb5f77dea04889edcbfcc595b1589d3ce6edbd9ebe1621c5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 94, + "block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "previous_block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "timestamp": 1429164870, + "fee": 10977, + "version": 0, + "tx_body_hash": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "ux_hash": "a67e3c8993f7952295c7f365535f8d61002a0d7a969c5fc01cfdee36edd06b12" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44" + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 95, + "block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "previous_block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "timestamp": 1429164880, + "fee": 1767, + "version": 0, + "tx_body_hash": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "ux_hash": "bc8b3f415d75b9045fe6211e52e550a73869991ad60553af6139c2b5ac6d37e0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38" + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 96, + "block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "previous_block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "timestamp": 1429164900, + "fee": 1322, + "version": 0, + "tx_body_hash": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "ux_hash": "830c7a3f304e0740f30a7cd2051a024498f4eedef43d58372618d916fbe8fb8e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806" + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 97, + "block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "previous_block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "timestamp": 1429165260, + "fee": 328, + "version": 0, + "tx_body_hash": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "ux_hash": "73546a733b7b17ce6611435dd1a5214a7e4f05a312bd60d4a3daa1eb6751614a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 98, + "block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "previous_block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "timestamp": 1429274566, + "fee": 71088, + "version": 0, + "tx_body_hash": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "ux_hash": "1663bee92c91aeafa18ec37ca21ba4b19a6fe54de74f4d925cdf002c9deb6fc4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb" + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 99, + "block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "previous_block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "timestamp": 1429274616, + "fee": 52573, + "version": 0, + "tx_body_hash": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "ux_hash": "c400f9dfcc2254feba80475a1e7acad4c88178152a1d9ca1b3e7883f85cc5a25" + }, + "body": { + "txns": [ + { + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + ] + }, + "size": 571 + }, + { + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "ux_hash": "ff354e4774397b6c1ab46e56920c82f79e54ac8edce2f0fc4a2e6f472a5e5aca" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 103, + "block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "previous_block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "timestamp": 1429278106, + "fee": 76077, + "version": 0, + "tx_body_hash": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "ux_hash": "dfb414ebbf9f28662f3e07596d5b6016d38ad1132b595a1f9f16241eaf97417e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 104, + "block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "previous_block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "timestamp": 1429278406, + "fee": 82382, + "version": 0, + "tx_body_hash": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "ux_hash": "b3131bb22af0869b73d57590358b6b60b72e26e3e7adb544317651c926e4704e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29" + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 105, + "block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "previous_block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "timestamp": 1429278556, + "fee": 11173, + "version": 0, + "tx_body_hash": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "ux_hash": "affd2919f37d6bb63b543be3e221802ab6043335a61f9ab1ed10a6c720902c8e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 106, + "block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "previous_block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "timestamp": 1429279796, + "fee": 835759, + "version": 0, + "tx_body_hash": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "ux_hash": "499137c1cc882d5461d87c843a38df8315b9efb9dde9d7e7928666c2be4077dd" + }, + "body": { + "txns": [ + { + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274" + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + ] + }, + "size": 511 + }, + { + "header": { + "seq": 107, + "block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "previous_block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "timestamp": 1429280596, + "fee": 104471, + "version": 0, + "tx_body_hash": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "ux_hash": "e571d0336b141a1162ef3ad14779b36ecdbcaa08780c31c5a903d717d137a3a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0" + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 108, + "block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "previous_block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "timestamp": 1429280756, + "fee": 20746, + "version": 0, + "tx_body_hash": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "ux_hash": "ee0f2a6bdc9d816c4887e7674daccd9fec8a50e7ff6fc3da4bffa4f6caf64bb8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef" + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 109, + "block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "previous_block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "timestamp": 1429302756, + "fee": 42555, + "version": 0, + "tx_body_hash": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "ux_hash": "7d753a823379eee4f6636d7f663af82e60fabf7b8e52d07d3a48015b1c3d3bb5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968" + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 110, + "block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "previous_block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "timestamp": 1429326351, + "fee": 107094, + "version": 0, + "tx_body_hash": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "ux_hash": "c6fc1679469a1ae4801f7893f58ddb98f84484debca51069ab2a671d52a6ccfb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614" + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 111, + "block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "previous_block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "timestamp": 1429348072, + "fee": 13386, + "version": 0, + "tx_body_hash": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "ux_hash": "010bd2fb29f6d5c89ba63e224358a639758aac6ae6d260f94910e2f515b1284a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54" + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 112, + "block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "previous_block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "timestamp": 1429348102, + "fee": 8332864, + "version": 0, + "tx_body_hash": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "ux_hash": "7c6f051b8f1edf6bac4aeb4fe434f56074b6b1cd259ae764f9905d241d6719f7" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0" + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 113, + "block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "previous_block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "timestamp": 1429348172, + "fee": 1041608, + "version": 0, + "tx_body_hash": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "ux_hash": "6e57bb2b61fdbc6288ee89183ede904a77500e9e41b9cc2d765f6ece0225b5d7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 114, + "block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "previous_block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "timestamp": 1429348502, + "fee": 130201, + "version": 0, + "tx_body_hash": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "ux_hash": "c0fba7a0e2d3de73f62277b2e8147fcb6a1e3ef1386dca06c6a6448d80460031" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9" + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 115, + "block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "previous_block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "timestamp": 1429348712, + "fee": 16276, + "version": 0, + "tx_body_hash": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "ux_hash": "81bc3ae9527ef4693109ea9d2ed4e8d55f00c0bda6b215947c195551b6d66681" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4" + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 116, + "block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "previous_block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "timestamp": 1429349392, + "fee": 388717, + "version": 0, + "tx_body_hash": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "ux_hash": "913ca96659cadafaabb4c433fb184e35cd0eeaa9dc7f6a4c52e6b6f8c9433eef" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 117, + "block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "previous_block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "timestamp": 1429351912, + "fee": 125795, + "version": 0, + "tx_body_hash": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "ux_hash": "fcd1a68f49962723c919b82780797740cd0428c05a072fa9f320028803ee720f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3" + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 118, + "block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "previous_block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "timestamp": 1429364072, + "fee": 184620, + "version": 0, + "tx_body_hash": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "ux_hash": "ef651e6ce43c864fed7fc0f0be888a988e299e277bed9554eb5a926eec66e37e" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 119, + "block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "previous_block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "timestamp": 1429364282, + "fee": 23077, + "version": 0, + "tx_body_hash": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "ux_hash": "06cd243747bd5b7e42c8be4e076fbc25c25beda3d983bd943b45590a5ca35b56" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd" + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 120, + "block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "previous_block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "timestamp": 1429364452, + "fee": 3366, + "version": 0, + "tx_body_hash": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "ux_hash": "b63369302476aaa7e57b3b32b6f141f24bde99208f619b25077ea7a547dc8b72" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 121, + "block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "previous_block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "timestamp": 1429382678, + "fee": 2271879, + "version": 0, + "tx_body_hash": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "ux_hash": "4eef95855584018e0cc70e78fa5b77f5c0447bf2456713e80274a3a35b4df479" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 122, + "block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "previous_block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "timestamp": 1429382898, + "fee": 283986, + "version": 0, + "tx_body_hash": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "ux_hash": "6fe7b36354ce50054dcb32e1eb108bfdaffe14c2c94514d517a3909b725c4ce9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c" + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 123, + "block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "previous_block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "timestamp": 1429451746, + "fee": 35498, + "version": 0, + "tx_body_hash": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "ux_hash": "cc22c972949b69f79394815aed9a9d4d7d73b988bb94e8efa10eefa8b8ff1c70" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 124, + "block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "previous_block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "timestamp": 1429522086, + "fee": 4438, + "version": 0, + "tx_body_hash": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "ux_hash": "045e587e05099db06ca4abad61b4d9ca2b410c8cfc192b13208c1b2b7ced3fc1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a" + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 125, + "block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "previous_block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "timestamp": 1429578056, + "fee": 555, + "version": 0, + "tx_body_hash": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "ux_hash": "61157b2d787b3955cee3d5c9b2c1793917e35a96122e1e2d751db4c7c2acfe30" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4" + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 126, + "block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "previous_block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "timestamp": 1429680646, + "fee": 103861, + "version": 0, + "tx_body_hash": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "ux_hash": "37e69db1869c70e70a342737933dc309a62528fd90ca96c7ace47ef25f28383f" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9" + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 127, + "block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "previous_block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "timestamp": 1429848410, + "fee": 3170256, + "version": 0, + "tx_body_hash": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "ux_hash": "68180bffce77e7786aeac57c0db2e74788e72528a91bf51f00ad0d5a045811ae" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958" + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 128, + "block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "previous_block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "timestamp": 1429849170, + "fee": 41968911, + "version": 0, + "tx_body_hash": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "ux_hash": "506be1cdd8502e4d353f48440b18be3b9556b0512b1d418af79e2cacb2c9b494" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528" + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 129, + "block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "previous_block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "timestamp": 1429849180, + "fee": 401128, + "version": 0, + "tx_body_hash": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "ux_hash": "6bf11335504e4445ab91ac1d5cc80cce680a17758c343c41e69a804e74e795c3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591" + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 130, + "block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "previous_block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "timestamp": 1430311531, + "fee": 50142, + "version": 0, + "tx_body_hash": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "ux_hash": "b8b18ef9d97022d3f5397bdc35b9e5d411aaff0e598baa3437da9e1fc2c75f3a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94" + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 131, + "block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "previous_block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "timestamp": 1430330041, + "fee": 76257058, + "version": 0, + "tx_body_hash": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "ux_hash": "0a32c89b53d12fb3b3c8ecb1de09a0d60f6a8fca12f7faa74ea5041bd469c617" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca" + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 132, + "block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "previous_block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "timestamp": 1430330311, + "fee": 9532133, + "version": 0, + "tx_body_hash": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "ux_hash": "727fd416b2e4a362417cc32f425a0c6ce6ed339ac79d3fe08c43038a1a627ee3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58" + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 133, + "block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "previous_block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "timestamp": 1430330421, + "fee": 1191516, + "version": 0, + "tx_body_hash": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "ux_hash": "8451012a69e56bc0d528bb5da1a1a7d07e3cc08a7c2b563edbb58382a6634415" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191" + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 134, + "block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "previous_block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "timestamp": 1430330481, + "fee": 148940, + "version": 0, + "tx_body_hash": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "ux_hash": "a106098a9e2bf084efe238342aff5a777f7292219deb38a6bb2b6c97fd3fc1c5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768" + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 135, + "block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "previous_block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "timestamp": 1430330591, + "fee": 18619, + "version": 0, + "tx_body_hash": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "ux_hash": "4324929e8fd4832ca1e5552636ad4d21883c4aefa5ca0b4bab47d35b6283128f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552" + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 136, + "block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "previous_block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "timestamp": 1430330851, + "fee": 2328, + "version": 0, + "tx_body_hash": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "ux_hash": "7f9134d8a5f432976a4fa787df29a481f8d74e2a8da7138cd19662b3bef08ffe" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e" + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 137, + "block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "previous_block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "timestamp": 1430504186, + "fee": 291, + "version": 0, + "tx_body_hash": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "ux_hash": "1a75b074da1b7e3e6fe9b26cd4a175ebe89e16c3f8917cfffa0ecaa458a5e075" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab" + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 138, + "block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "previous_block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "timestamp": 1430504236, + "fee": 36, + "version": 0, + "tx_body_hash": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "ux_hash": "b113407099fd9542a9925c4b1e09e62350b2d6151731358a1c8187a7ee38024d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4" + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 139, + "block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "previous_block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "timestamp": 1430504536, + "fee": 6, + "version": 0, + "tx_body_hash": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "ux_hash": "f594d0d454c7216dd6575d60f64b00ab88b064110b324058e094e1d632c40301" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d" + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 140, + "block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "previous_block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "timestamp": 1430504746, + "fee": 0, + "version": 0, + "tx_body_hash": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "ux_hash": "1ae1ea96ca1845708759569144b21b6646d615c0e4d5237a7b6a55d868f9dd27" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d" + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 141, + "block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "previous_block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "timestamp": 1430504846, + "fee": 0, + "version": 0, + "tx_body_hash": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "ux_hash": "62c012a54d2808a078f06d0bde3bdfb54c5a1eb4df241600068b4b5726a081a6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0" + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 142, + "block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "previous_block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "timestamp": 1430504966, + "fee": 0, + "version": 0, + "tx_body_hash": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "ux_hash": "f115d4e6e4f10823d5ebb04e913f61a42f6c77a5184d5f5f4af9a5691d94e1a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f" + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 143, + "block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "previous_block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "timestamp": 1430505086, + "fee": 0, + "version": 0, + "tx_body_hash": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "ux_hash": "54090e16ca9d400aabf58a043688129ad46451dc200abcc9acaaee6278af6707" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed" + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 144, + "block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "previous_block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "timestamp": 1430505176, + "fee": 0, + "version": 0, + "tx_body_hash": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "ux_hash": "95f733b768d9fa3958e49d04e9f0c7c69cfc909c57d80895e76893271d294106" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05" + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 145, + "block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "previous_block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "timestamp": 1430550936, + "fee": 693939, + "version": 0, + "tx_body_hash": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "ux_hash": "44eb50878e0a7eef3d8a7c026d9aec54507eb2d28c4898a8172f682a806e1480" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28" + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 146, + "block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "previous_block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "timestamp": 1430641376, + "fee": 6894507, + "version": 0, + "tx_body_hash": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "ux_hash": "f0108adf2f599f235b4ead2f672d7d8625243d6e0b2d1e880e2c77248a574e0b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c" + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 147, + "block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "previous_block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "timestamp": 1430641536, + "fee": 861814, + "version": 0, + "tx_body_hash": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "ux_hash": "4b96fbb3a8ee726762486b7de743da01f7d5e70f6eeb3d3ed9ee1d27b5a07acd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299" + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 148, + "block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "previous_block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "timestamp": 1430642006, + "fee": 107727, + "version": 0, + "tx_body_hash": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "ux_hash": "39f1cd4b28dc61b08253bc51d39405ad8a35df87bee822f95e5259cb3dd202bd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce" + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 149, + "block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "previous_block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "timestamp": 1430642106, + "fee": 13466, + "version": 0, + "tx_body_hash": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "ux_hash": "ad890aa64b317d35948020e68f3e655ab582914fc4e92d62c58c00d3dc5c9478" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275" + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 150, + "block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "previous_block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "timestamp": 1430642306, + "fee": 1684, + "version": 0, + "tx_body_hash": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "ux_hash": "95367619af0f79026961c6458133ca702e8e98850a9a45295b8951d5f25feb8c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab" + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 151, + "block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "previous_block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "timestamp": 1430642426, + "fee": 210, + "version": 0, + "tx_body_hash": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "ux_hash": "4b266d1cb0d20833a2a43044948aaa83c1b4881144b7616ae02b3ee85c13c292" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7" + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 152, + "block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "previous_block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "timestamp": 1430642546, + "fee": 27, + "version": 0, + "tx_body_hash": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "ux_hash": "170ad8a7f0d8441091341dc79a0c7c04d46ea47e60e58623a71b442656050a68" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066" + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 153, + "block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "previous_block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "timestamp": 1430642816, + "fee": 4, + "version": 0, + "tx_body_hash": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "ux_hash": "9fd52eaacfbcc7b88318fae11a7723eddf1184868d159dd7083bce0cb025e375" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1" + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 154, + "block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "previous_block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "timestamp": 1430643706, + "fee": 0, + "version": 0, + "tx_body_hash": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "ux_hash": "56b56c56ad0aaaf6b7ce3e3845f74776049887c452974d68b46af72e8ca30136" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c" + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 155, + "block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "previous_block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "timestamp": 1430643906, + "fee": 0, + "version": 0, + "tx_body_hash": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "ux_hash": "6f2840ca10cb769938ff77900c1bead9f5636b33a59fbd7141b00e9b8ea35e85" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da" + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 156, + "block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "previous_block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "timestamp": 1430644036, + "fee": 0, + "version": 0, + "tx_body_hash": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "ux_hash": "f407bdb9a454483ea14752c56c622b4268b2bd74f3fc6aab24dc769beba45c4d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac" + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 157, + "block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "previous_block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "timestamp": 1430673946, + "fee": 0, + "version": 0, + "tx_body_hash": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "ux_hash": "477f749b867d0a5c50ada0728e9781a15380ad5a23d4fd62c91c617164739b40" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee" + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 158, + "block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "previous_block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "timestamp": 1430674696, + "fee": 0, + "version": 0, + "tx_body_hash": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "ux_hash": "bec25fbd537da53dd0516ad735e35e48355955e4c07c1eba0d1c0c1cfe9d0b43" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3" + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 159, + "block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "previous_block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "timestamp": 1430715196, + "fee": 0, + "version": 0, + "tx_body_hash": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "ux_hash": "1ee9f722d9a194c61afb295639ca3ffcce249a1c11c46a0d66670d3bb8fd4a6c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef" + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 160, + "block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "previous_block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "timestamp": 1430784172, + "fee": 0, + "version": 0, + "tx_body_hash": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "ux_hash": "d7596292f43d66b82b0e121d29bf996fff6dcc40a3aa7f5cc89f093410615cf7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714" + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 161, + "block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "previous_block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "timestamp": 1430784312, + "fee": 0, + "version": 0, + "tx_body_hash": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "ux_hash": "379551206d8cec6a0b2b35f661957e53687a500dbca0a050b81d55110b5ee077" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072" + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 162, + "block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "previous_block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "timestamp": 1430784372, + "fee": 0, + "version": 0, + "tx_body_hash": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "ux_hash": "ca4b55c8abee72fb01a725e4daf45494ae5352fb3494d68334ccb140a4505bc6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d" + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 163, + "block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "previous_block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "timestamp": 1430784932, + "fee": 0, + "version": 0, + "tx_body_hash": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "ux_hash": "d667c86a072e96b43b096d1f4909d91368c089433adafeef2c0219df9973a9fe" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5" + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 164, + "block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "previous_block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "timestamp": 1430790052, + "fee": 0, + "version": 0, + "tx_body_hash": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "ux_hash": "b9f75495ffa7bc8af5bd2fa4ec693b58516d9b4fd312b5ce5fa2e764116343d6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 165, + "block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "previous_block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "timestamp": 1430790152, + "fee": 0, + "version": 0, + "tx_body_hash": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "ux_hash": "39db90f061f4054b49c458a63cb76f70ef863d90f7d57f6eeac2654793772cf0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a" + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 166, + "block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "previous_block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "timestamp": 1430791622, + "fee": 2964031, + "version": 0, + "tx_body_hash": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "ux_hash": "1386a916d2f0e59c5d1fcfbb8707a2cba527fd15486585a42bef96f52a4f9fc4" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb" + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 167, + "block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "previous_block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "timestamp": 1430791902, + "fee": 201915, + "version": 0, + "tx_body_hash": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "ux_hash": "7501b8b1ce87f4bb964972942450137fceb82361fb33f604b45719b9a7a32e45" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396" + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 168, + "block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "previous_block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "timestamp": 1430792072, + "fee": 25240, + "version": 0, + "tx_body_hash": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "ux_hash": "524c84abf87fc6ba4ee491a3181c2b0ed8d0e3e7002d4f9e5c7bb9bf229fedd2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748" + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 169, + "block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "previous_block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "timestamp": 1430836392, + "fee": 421, + "version": 0, + "tx_body_hash": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "ux_hash": "5c583bd423444d9974a543bbe59e648ca0c252a899fba4731642b02b4d3e28bf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "ux_hash": "d954806eed41026d3c60bc88e8fb569b3aa9007a9679e03ac61724ee3e723b01" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "ux_hash": "e06be06b42f1aa65940658c601cf7132041f7a1eeaffdeede72cef54d9465e66" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "ux_hash": "41c039e8b2ade1a2cd9f7a58873d57729c30d3639a33755b0317ceff66e6f7a9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "ux_hash": "abc08f5bf1ed183dd5dfa6dda09d9de6adfa23e310454861ae1fb938e0384321" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "ux_hash": "4f36b853bdb042046c522f2f5e397ccb24b59a5ef6931dd1cb1d48cc87a1ffc9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "ux_hash": "4013a4dd63875f19f124c440685a727e9654d8c2de3298f416bd98c2bbcf2ac9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "ux_hash": "5ad39ab834a65739085413db13fb8c152a641ba28b2b45322d1da9c6d9aa05ef" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "ux_hash": "c9b05516880ca6665a0f4fa52e7feb6fe83c1ffd6f4d2874877dfa67265524e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "ux_hash": "428b5ba5d4928fa538d9a031bf9fa3eb215b47d780e43e69bcd71d87758ada2f" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-end-less-than-start.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-end-less-than-start.golden new file mode 100644 index 00000000..b5b27b9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-end-less-than-start.golden @@ -0,0 +1,3 @@ +{ + "blocks": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-1.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-1.golden new file mode 100644 index 00000000..c92f9af9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-1.golden @@ -0,0 +1,635 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-10.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-10.golden new file mode 100644 index 00000000..8f1975cc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-10.golden @@ -0,0 +1,1018 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "ux_hash": "dad0a423ff7b1c5c6021698c5c75da34df37b9fc0a5b0c60bcbb50e8665c0610" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "ux_hash": "34174a65e1b34d0d7dd0e219f7969e303d4117024b14f8fa5ecc58c29c4c417c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "ux_hash": "4f560eea54f060c029cedc78480a59f6ca549d4fd6cb84fb0388001dcd11b5b7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "ux_hash": "dc4b68b8067932c191922c68504bc443c46144ef904c12b50008b3d77ae91aeb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-last-10.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-last-10.golden new file mode 100644 index 00000000..f90b580c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-last-10.golden @@ -0,0 +1,491 @@ +{ + "blocks": [ + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "ux_hash": "d954806eed41026d3c60bc88e8fb569b3aa9007a9679e03ac61724ee3e723b01" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "ux_hash": "e06be06b42f1aa65940658c601cf7132041f7a1eeaffdeede72cef54d9465e66" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "ux_hash": "41c039e8b2ade1a2cd9f7a58873d57729c30d3639a33755b0317ceff66e6f7a9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "ux_hash": "abc08f5bf1ed183dd5dfa6dda09d9de6adfa23e310454861ae1fb938e0384321" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "ux_hash": "4f36b853bdb042046c522f2f5e397ccb24b59a5ef6931dd1cb1d48cc87a1ffc9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "ux_hash": "4013a4dd63875f19f124c440685a727e9654d8c2de3298f416bd98c2bbcf2ac9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "ux_hash": "5ad39ab834a65739085413db13fb8c152a641ba28b2b45322d1da9c6d9aa05ef" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "ux_hash": "c9b05516880ca6665a0f4fa52e7feb6fe83c1ffd6f4d2874877dfa67265524e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "ux_hash": "428b5ba5d4928fa538d9a031bf9fa3eb215b47d780e43e69bcd71d87758ada2f" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-all.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-all.golden new file mode 100644 index 00000000..cac46022 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-all.golden @@ -0,0 +1,9834 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + }, + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "ux_hash": "dad0a423ff7b1c5c6021698c5c75da34df37b9fc0a5b0c60bcbb50e8665c0610" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "fee": 0, + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "fee": 0, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "ux_hash": "34174a65e1b34d0d7dd0e219f7969e303d4117024b14f8fa5ecc58c29c4c417c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "fee": 0, + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "ux_hash": "4f560eea54f060c029cedc78480a59f6ca549d4fd6cb84fb0388001dcd11b5b7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "fee": 0, + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "ux_hash": "dc4b68b8067932c191922c68504bc443c46144ef904c12b50008b3d77ae91aeb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "fee": 0, + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "ux_hash": "47d440eb55e32969f35f46450636ca919195977ab8bb5fa3d1e9f0f4b48d7fa1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "fee": 0, + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 12, + "block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "previous_block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "timestamp": 1428814821, + "fee": 0, + "version": 0, + "tx_body_hash": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "ux_hash": "33777b4a681c64d95213939b1488991d9b055b243fa30e49842d0177224b4d98" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "fee": 0, + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "owner": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 13, + "block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "previous_block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "timestamp": 1428814891, + "fee": 2, + "version": 0, + "tx_body_hash": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "ux_hash": "000f0d2c246891541cbab3efd2cfad6a1b241c1c716c2e942819eaa59a44370b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "fee": 2, + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 14, + "block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "previous_block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "timestamp": 1428815131, + "fee": 0, + "version": 0, + "tx_body_hash": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "ux_hash": "634b6bb24e8d1c21ea35c83322a18546b3d69b754865c8c8381f3c00ceeaf648" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "fee": 0, + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "owner": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 15, + "block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "previous_block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "timestamp": 1428820169, + "fee": 51, + "version": 0, + "tx_body_hash": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "ux_hash": "162569c321e9d7b1740490a856caec4556df25b5219ddbce1a3c6105158c53d4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "fee": 51, + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0, + "calculated_hours": 153 + } + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 16, + "block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "previous_block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "timestamp": 1428820629, + "fee": 0, + "version": 0, + "tx_body_hash": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "ux_hash": "9be6e3e08898bb1dd9e22e3e46a69abd580bbeec7a27daa891ba795afe3cfdb7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "fee": 0, + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "owner": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 17, + "block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "previous_block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "timestamp": 1428989855, + "fee": 2020394, + "version": 0, + "tx_body_hash": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "ux_hash": "8a65d3fbb5226c9f26466ceecfb8343a5182d46d9088d0d73ac94eebce208a46" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 18, + "block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "previous_block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "timestamp": 1428989925, + "fee": 0, + "version": 0, + "tx_body_hash": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "ux_hash": "178eb5802c1c8a49b0886009dde215b34ca386cd3794500d0e5695e0ddc5a139" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 19, + "block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "previous_block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "timestamp": 1428990115, + "fee": 1134, + "version": 0, + "tx_body_hash": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "ux_hash": "e4e2573c61942302d19d29f41de3894da2998a8dcd70379b053c0fb06929c8ae" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "fee": 1134, + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102, + "calculated_hours": 3402 + } + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 20, + "block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "previous_block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "timestamp": 1428990135, + "fee": 756, + "version": 0, + "tx_body_hash": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "ux_hash": "3b1a3ef6e15819213a7187b8bc8d03577195f09f0213b205c132b5526a299dae" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "fee": 756, + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268, + "calculated_hours": 2268 + } + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 21, + "block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "previous_block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "timestamp": 1428991365, + "fee": 504, + "version": 0, + "tx_body_hash": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "ux_hash": "8564c5d554513f0213063e68c6f30940950bac9e4f7d149b0a75ce27fbe08dbf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "fee": 504, + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512, + "calculated_hours": 1512 + } + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 22, + "block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "previous_block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "timestamp": 1428991585, + "fee": 0, + "version": 0, + "tx_body_hash": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "ux_hash": "c0e9ab176138c41212fdfe67ff5bafdf1f847047be08bccb3fb6e86e7ba6ca98" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "fee": 0, + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 23, + "block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "previous_block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "timestamp": 1428991605, + "fee": 0, + "version": 0, + "tx_body_hash": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "ux_hash": "87372b955f6c577e7b320721d6b0af7f4629c440ca109894ad873af5c5f48291" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "fee": 0, + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 24, + "block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "previous_block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "timestamp": 1428991635, + "fee": 0, + "version": 0, + "tx_body_hash": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "ux_hash": "8460866d61c0680981b655f485a26ce122dcdecc03c3a376a1877bb280303780" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "fee": 0, + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "owner": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "owner": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 25, + "block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "previous_block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "timestamp": 1428991665, + "fee": 0, + "version": 0, + "tx_body_hash": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "ux_hash": "0da490050bc42511d86b8cfcf63172c24ec736ffd6595bce0d2df48596016869" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "fee": 0, + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 26, + "block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "previous_block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "timestamp": 1429011077, + "fee": 3407635, + "version": 0, + "tx_body_hash": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "ux_hash": "51bdbf6235d29ffb41102b2eb33ca48a86c49be6e3d6c8f9b2becdb440b43f3d" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "fee": 3407635, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 4543507 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 27, + "block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "previous_block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "timestamp": 1429011137, + "fee": 425954, + "version": 0, + "tx_body_hash": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "ux_hash": "c8d8839903bb3f82d6beb62accf60b505048fb587c62f4364031c815c9808f81" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "fee": 425954, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 567938 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 28, + "block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "previous_block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "timestamp": 1429020387, + "fee": 214, + "version": 0, + "tx_body_hash": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "ux_hash": "3f71dfad629418433c00eaac3126d584daa269951e286790172c89eadc92a00c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "fee": 214, + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 284 + } + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 29, + "block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "previous_block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "timestamp": 1429020687, + "fee": 551, + "version": 0, + "tx_body_hash": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "ux_hash": "ad32a8a9357e41dac2a7a38e120862439441f8b78ef187c9b041b5fcd77aed1b" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "fee": 551, + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 629 + } + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 30, + "block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "previous_block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "timestamp": 1429021044, + "fee": 31, + "version": 0, + "tx_body_hash": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "ux_hash": "18a38d48eba01d3bf392cfd7c92ae5a1f95d7bc0f91b26abcbb9fdfe11bbf581" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "fee": 31, + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 31, + "block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "previous_block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "timestamp": 1429021184, + "fee": 60, + "version": 0, + "tx_body_hash": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "ux_hash": "011f23d6473dfdf9802a866ec50b1a4d26984b97c3bc9152ce40a341c35db446" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "fee": 60, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78, + "calculated_hours": 78 + } + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 32, + "block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "previous_block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "timestamp": 1429021214, + "fee": 8, + "version": 0, + "tx_body_hash": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "ux_hash": "ccf0002e9020c40441ac01fefb32ab5736833f82e5842473c2ddbe3db4f86418" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "fee": 8, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + } + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 33, + "block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "previous_block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "timestamp": 1429021674, + "fee": 9, + "version": 0, + "tx_body_hash": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "ux_hash": "924f087d5681f12417a20ff9cfc7fc7d92f0e72a3cc75177c0d1194e76e61216" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "fee": 9, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + }, + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 34, + "block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "previous_block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "timestamp": 1429021994, + "fee": 1, + "version": 0, + "tx_body_hash": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "ux_hash": "e75a837820ec1bf43a7fbab324c1eec1cefc436d65a12d2bdfd45ecd8c0b0a48" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "fee": 1, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 35, + "block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "previous_block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "timestamp": 1429022034, + "fee": 0, + "version": 0, + "tx_body_hash": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "ux_hash": "55d2c6ea4d79cd339b7c76d630333f75cc62dd224357ff78ed43066dff854fb3" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "fee": 0, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 36, + "block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "previous_block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "timestamp": 1429022064, + "fee": 0, + "version": 0, + "tx_body_hash": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "ux_hash": "3f5d59f0677d598dbe7c5e4415ae99a50be414c2e831198cdf09fbeb00b47798" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "fee": 0, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 37, + "block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "previous_block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "timestamp": 1429022094, + "fee": 0, + "version": 0, + "tx_body_hash": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "ux_hash": "9741ded2fb1b032ac1f5a914e4763508a5a8debfa3e3c1309770696ed4119d39" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "fee": 0, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 38, + "block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "previous_block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "timestamp": 1429058484, + "fee": 2335473, + "version": 0, + "tx_body_hash": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "ux_hash": "92ad4d294c00edfa740be4a8bcd37c0986e5c8dacf8504eaa8aad37661030eb9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "fee": 2335473, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 3113963 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 39, + "block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "previous_block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "timestamp": 1429058494, + "fee": 291935, + "version": 0, + "tx_body_hash": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "ux_hash": "4fb04fb3ff93092a37bebaa62d5b2a3676d801268a86e184ba19a55e8d101df3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 40, + "block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "previous_block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "timestamp": 1429058514, + "fee": 36493, + "version": 0, + "tx_body_hash": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "ux_hash": "9e0f4fdc945df9ffcd31adbaddd5469c9ff39b297308fc76469af04bd8349080" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "fee": 36493, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 48655 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 41, + "block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "previous_block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "timestamp": 1429058524, + "fee": 4561, + "version": 0, + "tx_body_hash": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "ux_hash": "d3f60f0d20aeac951aacab8d849696cac54c7057da741cfd90b63018100818d0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "fee": 4561, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 6081 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 42, + "block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "previous_block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "timestamp": 1429058594, + "fee": 292512, + "version": 0, + "tx_body_hash": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "ux_hash": "9173768496bc49e2a34d5a7ea65d05ad6507dfdb489836e861b3c03d35efeb7a" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "fee": 292512, + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245, + "calculated_hours": 389256 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760, + "calculated_hours": 760 + } + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 43, + "block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "previous_block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "timestamp": 1429070374, + "fee": 1596, + "version": 0, + "tx_body_hash": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "ux_hash": "46d8cf99e912e732164aa7910ab409e056f7190492d00075499d77dbb8108f94" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "fee": 1596, + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008, + "calculated_hours": 2035 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35, + "calculated_hours": 56 + }, + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 44, + "block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "previous_block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "timestamp": 1429070414, + "fee": 199, + "version": 0, + "tx_body_hash": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "ux_hash": "5a8a9e30aa37f987b7f3fe0ae6c6048585b168ffacc602392d6d3855bf2cf64e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "fee": 199, + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265, + "calculated_hours": 265 + } + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 45, + "block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "previous_block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "timestamp": 1429071074, + "fee": 2402820, + "version": 0, + "tx_body_hash": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "ux_hash": "ad85d15310a5086ec9f2c9478a540fa5e3d23298f2f2124a5142ae089b4bd567" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "fee": 2402820, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3203760 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 46, + "block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "previous_block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "timestamp": 1429077374, + "fee": 300354, + "version": 0, + "tx_body_hash": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "ux_hash": "d444545422cfd535553abee015965d916ad0a9f3e6446222a2c5c248343dec1c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 47, + "block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "previous_block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "timestamp": 1429077384, + "fee": 37544, + "version": 0, + "tx_body_hash": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "ux_hash": "68ade91c1b0a98b80fbdbb5829a75e95ea2e4a97776883b4576a245bfce271a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 48, + "block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "previous_block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "timestamp": 1429077394, + "fee": 4693, + "version": 0, + "tx_body_hash": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "ux_hash": "bf2c980d37c36e3a6d1179a698d43ef1d659c438bba0c84b3b09518a94a8a706" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 49, + "block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "previous_block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "timestamp": 1429077404, + "fee": 588, + "version": 0, + "tx_body_hash": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "ux_hash": "b705b08e59a5ec4ae59f16940fa182f83326ab7278809e25c2094ef2202e3992" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 50, + "block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "previous_block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "timestamp": 1429077474, + "fee": 71833, + "version": 0, + "tx_body_hash": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "ux_hash": "589b1ba02530656309a8dddec9b9450d16e4b5b2c8b64708ba0a8b453c5b0b5e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "fee": 71833, + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752, + "calculated_hours": 95777 + } + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 51, + "block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "previous_block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "timestamp": 1429077484, + "fee": 44061, + "version": 0, + "tx_body_hash": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "ux_hash": "f893ff5304a0ad87aec6345e962bb6648411b2b0dfad95940725b676f4e558cd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "fee": 44061, + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081, + "calculated_hours": 58747 + } + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 52, + "block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "previous_block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "timestamp": 1429077494, + "fee": 8996, + "version": 0, + "tx_body_hash": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "ux_hash": "3241684b9e1c9b5d244b302446b9f947097a312397c04e59bc10ce01212e533d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "fee": 8996, + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972, + "calculated_hours": 11994 + } + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 53, + "block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "previous_block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "timestamp": 1429077514, + "fee": 17787, + "version": 0, + "tx_body_hash": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "ux_hash": "84e514782cf16533fd2794f2f58b184ca4e4e3459ef4ca9a39da4e1be0b4c3bc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 54, + "block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "previous_block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "timestamp": 1429077524, + "fee": 1153, + "version": 0, + "tx_body_hash": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "ux_hash": "3d81d11b54c9272629d1384de9c386c84337aafb9ffb604cea3a6cebacd0078a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "fee": 1153, + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499, + "calculated_hours": 1537 + } + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 55, + "block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "previous_block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "timestamp": 1429077544, + "fee": 5583, + "version": 0, + "tx_body_hash": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "ux_hash": "64c7ad66527c657e10c2813b87dfc40a0c0a8638c47b925e0d5988ef7282b768" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "fee": 5583, + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343, + "calculated_hours": 7443 + } + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 56, + "block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "previous_block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "timestamp": 1429077554, + "fee": 76179, + "version": 0, + "tx_body_hash": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "ux_hash": "06ec76934a86bc53c39937cff9ba786c83ae1b1e6695bad5a3864611014f9861" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "fee": 76179, + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655, + "calculated_hours": 101571 + } + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 57, + "block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "previous_block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "timestamp": 1429077584, + "fee": 10088, + "version": 0, + "tx_body_hash": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "ux_hash": "453b6d29b16a4858982f81e90d8189d94878d6b215cb1f949982e650576bef8f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "fee": 10088, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 13450 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 58, + "block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "previous_block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "timestamp": 1429077604, + "fee": 220, + "version": 0, + "tx_body_hash": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "ux_hash": "0b67862cfc42f6128307f583efe4ee78167523cc90d6308a0616f9c9a5470b45" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "fee": 220, + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192, + "calculated_hours": 292 + } + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 59, + "block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "previous_block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "timestamp": 1429077614, + "fee": 799, + "version": 0, + "tx_body_hash": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "ux_hash": "790eb4c054ec7664e0775a7012ace595d6daa8fb8b87ce11196592fdc713d56c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "fee": 799, + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930, + "calculated_hours": 1063 + } + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 60, + "block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "previous_block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "timestamp": 1429077624, + "fee": 9636, + "version": 0, + "tx_body_hash": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "ux_hash": "89c92403dce794e750618b5abcfcb03ccf102d8a2475196dee462bbeb3d8d9e9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "fee": 9636, + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696, + "calculated_hours": 12846 + } + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 61, + "block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "previous_block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "timestamp": 1429077654, + "fee": 9118, + "version": 0, + "tx_body_hash": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "ux_hash": "ada8c5ad5da401c9859ccd0b505b2052be5d3e71865fe4ba0b05a17073e2b287" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "fee": 9118, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 12156 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 62, + "block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "previous_block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "timestamp": 1429077664, + "fee": 79, + "version": 0, + "tx_body_hash": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "ux_hash": "4e0cf3e7a61064664738416c30a67af01c33bfc031bc662c935e14221fe1ab81" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "fee": 79, + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36, + "calculated_hours": 105 + } + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 63, + "block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "previous_block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "timestamp": 1429077684, + "fee": 1271, + "version": 0, + "tx_body_hash": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "ux_hash": "146aa609909e365dfa1e1537f21e2679a729846224f4cc906fbc79e11f2547dc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "fee": 1271, + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605, + "calculated_hours": 1693 + } + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 64, + "block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "previous_block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "timestamp": 1429077694, + "fee": 7026, + "version": 0, + "tx_body_hash": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "ux_hash": "a2484ef64ef7dbfc9f694aa080d3a333972e795371b3762a973549c929136e3f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "fee": 7026, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 9366 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 65, + "block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "previous_block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "timestamp": 1429077724, + "fee": 36, + "version": 0, + "tx_body_hash": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "ux_hash": "6231253b3d6f8a4d8383f750e1f98cecb128cf73820ad6e19a251abe76970e94" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "fee": 36, + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13, + "calculated_hours": 46 + } + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 66, + "block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "previous_block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "timestamp": 1429077734, + "fee": 259, + "version": 0, + "tx_body_hash": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "ux_hash": "47b6b7ce444902e1a0c96aea06bcb6e70ad6b41476e02ba536cc82c765743f8b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "fee": 259, + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132, + "calculated_hours": 345 + } + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 67, + "block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "previous_block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "timestamp": 1429077874, + "fee": 8718, + "version": 0, + "tx_body_hash": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "ux_hash": "afb39102e6b76ffcae61504432b16a5309cc6839766b3fb365b5bdbcad318dd2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "fee": 8718, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 11622 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 68, + "block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "previous_block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "timestamp": 1429077914, + "fee": 1090, + "version": 0, + "tx_body_hash": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "ux_hash": "1f34f1f16f2e80571b058019258b893019e01bb338870e631711c1755fa0e4fa" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "fee": 1090, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 69, + "block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "previous_block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "timestamp": 1429077944, + "fee": 137, + "version": 0, + "tx_body_hash": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "ux_hash": "0fb49592b74e8fd720494fc2bd6a768099381137872e93db7aaba814ca8848a4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "fee": 137, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 181 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 70, + "block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "previous_block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "timestamp": 1429077964, + "fee": 18, + "version": 0, + "tx_body_hash": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "ux_hash": "2b0d5300dd48c11d46e185ee52c7906ef5f1f547a19cced5376335696c1cfc78" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "fee": 18, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 22 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 71, + "block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "previous_block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "timestamp": 1429077974, + "fee": 2, + "version": 0, + "tx_body_hash": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "ux_hash": "589b2ec4bab9cad26ab92dd189e3b4cc64701e8a82d97c6b19efcab980d44824" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 72, + "block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "previous_block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "timestamp": 1429078004, + "fee": 558, + "version": 0, + "tx_body_hash": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "ux_hash": "62b5aa989f79cc3d398f4047a7d5df9f35ca6098fbca504d819b95529bd77222" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "fee": 558, + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43, + "calculated_hours": 443 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22, + "calculated_hours": 230 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2, + "calculated_hours": 71 + } + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 73, + "block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "previous_block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "timestamp": 1429091164, + "fee": 2326, + "version": 0, + "tx_body_hash": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "ux_hash": "3ba29e2a1959b76b8e90a94686427e1ee461e6a90ab12dbbec5cfa6352e6dc74" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "fee": 2326, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964, + "calculated_hours": 3100 + } + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 74, + "block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "previous_block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "timestamp": 1429091944, + "fee": 43640, + "version": 0, + "tx_body_hash": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "ux_hash": "5704cffe1444e6e24bccba99acf0d6175cb6c6db3e2619cf3b1a9add81e110c7" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "fee": 43640, + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "owner": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752, + "calculated_hours": 57799 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "owner": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 75, + "block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "previous_block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "timestamp": 1429096344, + "fee": 5455, + "version": 0, + "tx_body_hash": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "ux_hash": "ea36ebaf2a3e4a37487a1aac964240f60aa1b2b96aeb4e42c0d443d57218430c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "fee": 5455, + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "owner": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273, + "calculated_hours": 7273 + } + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 76, + "block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "previous_block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "timestamp": 1429110544, + "fee": 432263, + "version": 0, + "tx_body_hash": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "ux_hash": "6c5bfb09207562e126ba386e7b106669fb86b94d33b3376c711c15eb47594ca1" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "fee": 432263, + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33, + "calculated_hours": 393 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470, + "calculated_hours": 575956 + } + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 77, + "block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "previous_block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "timestamp": 1429147880, + "fee": 5860904, + "version": 0, + "tx_body_hash": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "ux_hash": "e16c215cddf959cbd0fc5143c4ab211dac70731fc4609e1124b7a5fa5263356d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "fee": 5860904, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 7814538 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 78, + "block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "previous_block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "timestamp": 1429147900, + "fee": 407859, + "version": 0, + "tx_body_hash": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "ux_hash": "0980923d75cda1985847ebfbd48e0c7bf853fd08eb38cd09277dd09cf60020f5" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "fee": 407859, + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5, + "calculated_hours": 58468 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93, + "calculated_hours": 485343 + } + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 79, + "block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "previous_block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "timestamp": 1429147950, + "fee": 466755, + "version": 0, + "tx_body_hash": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "ux_hash": "869ce7a7d48b54f32c34faa2a3517aa7d67db11f5ce59325f9725c030c7151ed" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "fee": 466755, + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211, + "calculated_hours": 136742 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 485597 + } + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 80, + "block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "previous_block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "timestamp": 1429148000, + "fee": 51265, + "version": 0, + "tx_body_hash": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "ux_hash": "ae92c3b70cd1ee84ab8240daacbdf01e2ba39ccf7a590b74658d8afa005c4b28" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "fee": 51265, + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976, + "calculated_hours": 68351 + } + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 81, + "block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "previous_block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "timestamp": 1429164440, + "fee": 754183, + "version": 0, + "tx_body_hash": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "ux_hash": "7c481dd4fe40fc2b01ada90537c14a1266dc638a333ef72d38005e9c2c288916" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "fee": 754183, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 1005575 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 82, + "block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "previous_block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "timestamp": 1429164460, + "fee": 558303, + "version": 0, + "tx_body_hash": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "ux_hash": "46d65f755f018ad9a85c79773f57d048e9178178f63c1dd354c8db6cd97a46e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "fee": 558303, + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93, + "calculated_hours": 744403 + } + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 83, + "block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "previous_block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "timestamp": 1429164480, + "fee": 164971, + "version": 0, + "tx_body_hash": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "ux_hash": "a64f119533068375ed5a85cda7224a0cb794c41500727c2909d1e08575e4ab80" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "fee": 164971, + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792, + "calculated_hours": 219961 + } + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 84, + "block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "previous_block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "timestamp": 1429164590, + "fee": 20623, + "version": 0, + "tx_body_hash": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "ux_hash": "c989c40c9ac5f17f49281254bca90873f4c196c220eef96209e0e60e7927554f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "fee": 20623, + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495, + "calculated_hours": 27495 + } + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 85, + "block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "previous_block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "timestamp": 1429164620, + "fee": 121202, + "version": 0, + "tx_body_hash": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "ux_hash": "b5f5c67fc21c9259f089688afad62d15bbdacc51704d81b50d432e0a57fc35a1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "fee": 121202, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 161602 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 86, + "block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "previous_block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "timestamp": 1429164720, + "fee": 15150, + "version": 0, + "tx_body_hash": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "ux_hash": "dafc5be48e442e64240d3e432457f737fea6a0ee9b3cc6d5b192aa50cccb1252" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "fee": 15150, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 20200 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 87, + "block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "previous_block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "timestamp": 1429164730, + "fee": 96974, + "version": 0, + "tx_body_hash": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "ux_hash": "01793218345b2cb5af94baffc6b43d78439bd89e63c9c124e7d640ba07934597" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "fee": 96974, + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543, + "calculated_hours": 129298 + } + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 88, + "block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "previous_block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "timestamp": 1429164790, + "fee": 71476, + "version": 0, + "tx_body_hash": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "ux_hash": "78a3643517aa6a128fedef4feb99693c629d1dbd749280dac09c6dc13c1aad20" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "fee": 71476, + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050, + "calculated_hours": 95300 + } + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 89, + "block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "previous_block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "timestamp": 1429164800, + "fee": 3816, + "version": 0, + "tx_body_hash": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "ux_hash": "2036f6edf1a278ca56ff144b61e7d92ae59a071979092a0a5cce1be9662334d8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "fee": 3816, + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436, + "calculated_hours": 5086 + } + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 90, + "block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "previous_block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "timestamp": 1429164810, + "fee": 16229, + "version": 0, + "tx_body_hash": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "ux_hash": "88b0746b83b29bf1614beb8304ab1cd34327f04f0d857ccbc26f3eb7092d4668" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "fee": 16229, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 21637 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 91, + "block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "previous_block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "timestamp": 1429164830, + "fee": 12539, + "version": 0, + "tx_body_hash": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "ux_hash": "20f35999317908d338a5ce6d4eb236a43660ebebb3dfcc1152b3011aa65838c8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "fee": 12539, + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162, + "calculated_hours": 16717 + } + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 92, + "block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "previous_block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "timestamp": 1429164850, + "fee": 9176, + "version": 0, + "tx_body_hash": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "ux_hash": "231a4ef65f5f0944392cf5fb548419c0a6cc70f20fb6865da290a1dbb7f23a24" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "fee": 9176, + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912, + "calculated_hours": 12234 + } + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 93, + "block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "previous_block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "timestamp": 1429164860, + "fee": 775, + "version": 0, + "tx_body_hash": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "ux_hash": "5a500555ded8514cdb5f77dea04889edcbfcc595b1589d3ce6edbd9ebe1621c5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "fee": 775, + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635, + "calculated_hours": 1033 + } + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 94, + "block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "previous_block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "timestamp": 1429164870, + "fee": 10977, + "version": 0, + "tx_body_hash": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "ux_hash": "a67e3c8993f7952295c7f365535f8d61002a0d7a969c5fc01cfdee36edd06b12" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "fee": 10977, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 14635 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 95, + "block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "previous_block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "timestamp": 1429164880, + "fee": 1767, + "version": 0, + "tx_body_hash": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "ux_hash": "bc8b3f415d75b9045fe6211e52e550a73869991ad60553af6139c2b5ac6d37e0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "fee": 1767, + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089, + "calculated_hours": 2355 + } + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 96, + "block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "previous_block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "timestamp": 1429164900, + "fee": 1322, + "version": 0, + "tx_body_hash": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "ux_hash": "830c7a3f304e0740f30a7cd2051a024498f4eedef43d58372618d916fbe8fb8e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "fee": 1322, + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529, + "calculated_hours": 1762 + } + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 97, + "block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "previous_block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "timestamp": 1429165260, + "fee": 328, + "version": 0, + "tx_body_hash": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "ux_hash": "73546a733b7b17ce6611435dd1a5214a7e4f05a312bd60d4a3daa1eb6751614a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "fee": 328, + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129, + "calculated_hours": 436 + } + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 98, + "block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "previous_block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "timestamp": 1429274566, + "fee": 71088, + "version": 0, + "tx_body_hash": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "ux_hash": "1663bee92c91aeafa18ec37ca21ba4b19a6fe54de74f4d925cdf002c9deb6fc4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "fee": 71088, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 94784 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 99, + "block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "previous_block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "timestamp": 1429274616, + "fee": 52573, + "version": 0, + "tx_body_hash": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "ux_hash": "c400f9dfcc2254feba80475a1e7acad4c88178152a1d9ca1b3e7883f85cc5a25" + }, + "body": { + "txns": [ + { + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + ] + }, + "size": 571 + }, + { + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "ux_hash": "ff354e4774397b6c1ab46e56920c82f79e54ac8edce2f0fc4a2e6f472a5e5aca" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "fee": 613712, + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294, + "calculated_hours": 701385 + } + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "fee": 710046, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54, + "calculated_hours": 811481 + } + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 103, + "block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "previous_block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "timestamp": 1429278106, + "fee": 76077, + "version": 0, + "tx_body_hash": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "ux_hash": "dfb414ebbf9f28662f3e07596d5b6016d38ad1132b595a1f9f16241eaf97417e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "fee": 76077, + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435, + "calculated_hours": 101435 + } + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 104, + "block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "previous_block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "timestamp": 1429278406, + "fee": 82382, + "version": 0, + "tx_body_hash": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "ux_hash": "b3131bb22af0869b73d57590358b6b60b72e26e3e7adb544317651c926e4704e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "fee": 82382, + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673, + "calculated_hours": 109842 + } + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 105, + "block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "previous_block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "timestamp": 1429278556, + "fee": 11173, + "version": 0, + "tx_body_hash": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "ux_hash": "affd2919f37d6bb63b543be3e221802ab6043335a61f9ab1ed10a6c720902c8e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "fee": 11173, + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679, + "calculated_hours": 14895 + } + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 106, + "block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "previous_block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "timestamp": 1429279796, + "fee": 835759, + "version": 0, + "tx_body_hash": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "ux_hash": "499137c1cc882d5461d87c843a38df8315b9efb9dde9d7e7928666c2be4077dd" + }, + "body": { + "txns": [ + { + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "fee": 835759, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 962798 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11903 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7564 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 132080 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + ] + }, + "size": 511 + }, + { + "header": { + "seq": 107, + "block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "previous_block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "timestamp": 1429280596, + "fee": 104471, + "version": 0, + "tx_body_hash": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "ux_hash": "e571d0336b141a1162ef3ad14779b36ecdbcaa08780c31c5a903d717d137a3a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "fee": 104471, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 139293 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 108, + "block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "previous_block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "timestamp": 1429280756, + "fee": 20746, + "version": 0, + "tx_body_hash": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "ux_hash": "ee0f2a6bdc9d816c4887e7674daccd9fec8a50e7ff6fc3da4bffa4f6caf64bb8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "fee": 20746, + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730, + "calculated_hours": 27660 + } + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 109, + "block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "previous_block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "timestamp": 1429302756, + "fee": 42555, + "version": 0, + "tx_body_hash": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "ux_hash": "7d753a823379eee4f6636d7f663af82e60fabf7b8e52d07d3a48015b1c3d3bb5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "fee": 42555, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 56739 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 110, + "block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "previous_block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "timestamp": 1429326351, + "fee": 107094, + "version": 0, + "tx_body_hash": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "ux_hash": "c6fc1679469a1ae4801f7893f58ddb98f84484debca51069ab2a671d52a6ccfb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "fee": 107094, + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457, + "calculated_hours": 142790 + } + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 111, + "block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "previous_block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "timestamp": 1429348072, + "fee": 13386, + "version": 0, + "tx_body_hash": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "ux_hash": "010bd2fb29f6d5c89ba63e224358a639758aac6ae6d260f94910e2f515b1284a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "fee": 13386, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 17848 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 112, + "block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "previous_block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "timestamp": 1429348102, + "fee": 8332864, + "version": 0, + "tx_body_hash": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "ux_hash": "7c6f051b8f1edf6bac4aeb4fe434f56074b6b1cd259ae764f9905d241d6719f7" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "fee": 8332864, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11108253 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2231 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 113, + "block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "previous_block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "timestamp": 1429348172, + "fee": 1041608, + "version": 0, + "tx_body_hash": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "ux_hash": "6e57bb2b61fdbc6288ee89183ede904a77500e9e41b9cc2d765f6ece0225b5d7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 114, + "block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "previous_block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "timestamp": 1429348502, + "fee": 130201, + "version": 0, + "tx_body_hash": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "ux_hash": "c0fba7a0e2d3de73f62277b2e8147fcb6a1e3ef1386dca06c6a6448d80460031" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "fee": 130201, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 173601 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 115, + "block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "previous_block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "timestamp": 1429348712, + "fee": 16276, + "version": 0, + "tx_body_hash": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "ux_hash": "81bc3ae9527ef4693109ea9d2ed4e8d55f00c0bda6b215947c195551b6d66681" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "fee": 16276, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 21700 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 116, + "block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "previous_block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "timestamp": 1429349392, + "fee": 388717, + "version": 0, + "tx_body_hash": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "ux_hash": "913ca96659cadafaabb4c433fb184e35cd0eeaa9dc7f6a4c52e6b6f8c9433eef" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "fee": 388717, + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861, + "calculated_hours": 518287 + } + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 117, + "block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "previous_block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "timestamp": 1429351912, + "fee": 125795, + "version": 0, + "tx_body_hash": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "ux_hash": "fcd1a68f49962723c919b82780797740cd0428c05a072fa9f320028803ee720f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "fee": 125795, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 167725 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 118, + "block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "previous_block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "timestamp": 1429364072, + "fee": 184620, + "version": 0, + "tx_body_hash": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "ux_hash": "ef651e6ce43c864fed7fc0f0be888a988e299e277bed9554eb5a926eec66e37e" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "fee": 184620, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387, + "calculated_hours": 72454 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601, + "calculated_hours": 173704 + } + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 119, + "block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "previous_block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "timestamp": 1429364282, + "fee": 23077, + "version": 0, + "tx_body_hash": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "ux_hash": "06cd243747bd5b7e42c8be4e076fbc25c25beda3d983bd943b45590a5ca35b56" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "fee": 23077, + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "owner": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769, + "calculated_hours": 30769 + } + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 120, + "block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "previous_block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "timestamp": 1429364452, + "fee": 3366, + "version": 0, + "tx_body_hash": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "ux_hash": "b63369302476aaa7e57b3b32b6f141f24bde99208f619b25077ea7a547dc8b72" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "fee": 3366, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "owner": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846, + "calculated_hours": 3846 + } + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 121, + "block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "previous_block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "timestamp": 1429382678, + "fee": 2271879, + "version": 0, + "tx_body_hash": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "ux_hash": "4eef95855584018e0cc70e78fa5b77f5c0447bf2456713e80274a3a35b4df479" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 122, + "block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "previous_block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "timestamp": 1429382898, + "fee": 283986, + "version": 0, + "tx_body_hash": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "ux_hash": "6fe7b36354ce50054dcb32e1eb108bfdaffe14c2c94514d517a3909b725c4ce9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "fee": 283986, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 378646 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 123, + "block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "previous_block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "timestamp": 1429451746, + "fee": 35498, + "version": 0, + "tx_body_hash": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "ux_hash": "cc22c972949b69f79394815aed9a9d4d7d73b988bb94e8efa10eefa8b8ff1c70" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 124, + "block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "previous_block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "timestamp": 1429522086, + "fee": 4438, + "version": 0, + "tx_body_hash": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "ux_hash": "045e587e05099db06ca4abad61b4d9ca2b410c8cfc192b13208c1b2b7ced3fc1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "fee": 4438, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 5916 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 125, + "block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "previous_block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "timestamp": 1429578056, + "fee": 555, + "version": 0, + "tx_body_hash": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "ux_hash": "61157b2d787b3955cee3d5c9b2c1793917e35a96122e1e2d751db4c7c2acfe30" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "fee": 555, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 126, + "block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "previous_block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "timestamp": 1429680646, + "fee": 103861, + "version": 0, + "tx_body_hash": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "ux_hash": "37e69db1869c70e70a342737933dc309a62528fd90ca96c7ace47ef25f28383f" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "fee": 103861, + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "owner": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436, + "calculated_hours": 37891 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "owner": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200, + "calculated_hours": 100590 + } + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 127, + "block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "previous_block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "timestamp": 1429848410, + "fee": 3170256, + "version": 0, + "tx_body_hash": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "ux_hash": "68180bffce77e7786aeac57c0db2e74788e72528a91bf51f00ad0d5a045811ae" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "fee": 3170256, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1175478 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3051530 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 128, + "block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "previous_block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "timestamp": 1429849170, + "fee": 41968911, + "version": 0, + "tx_body_hash": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "ux_hash": "506be1cdd8502e4d353f48440b18be3b9556b0512b1d418af79e2cacb2c9b494" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "fee": 41968911, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55430171 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528376 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 129, + "block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "previous_block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "timestamp": 1429849180, + "fee": 401128, + "version": 0, + "tx_body_hash": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "ux_hash": "6bf11335504e4445ab91ac1d5cc80cce680a17758c343c41e69a804e74e795c3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "fee": 401128, + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376, + "calculated_hours": 534836 + } + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 130, + "block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "previous_block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "timestamp": 1430311531, + "fee": 50142, + "version": 0, + "tx_body_hash": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "ux_hash": "b8b18ef9d97022d3f5397bdc35b9e5d411aaff0e598baa3437da9e1fc2c75f3a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "fee": 50142, + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854, + "calculated_hours": 66854 + } + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 131, + "block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "previous_block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "timestamp": 1430330041, + "fee": 76257058, + "version": 0, + "tx_body_hash": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "ux_hash": "0a32c89b53d12fb3b3c8ecb1de09a0d60f6a8fca12f7faa74ea5041bd469c617" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "fee": 76257058, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 101676076 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 132, + "block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "previous_block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "timestamp": 1430330311, + "fee": 9532133, + "version": 0, + "tx_body_hash": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "ux_hash": "727fd416b2e4a362417cc32f425a0c6ce6ed339ac79d3fe08c43038a1a627ee3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "fee": 9532133, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12709509 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 133, + "block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "previous_block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "timestamp": 1430330421, + "fee": 1191516, + "version": 0, + "tx_body_hash": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "ux_hash": "8451012a69e56bc0d528bb5da1a1a7d07e3cc08a7c2b563edbb58382a6634415" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "fee": 1191516, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1588688 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 134, + "block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "previous_block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "timestamp": 1430330481, + "fee": 148940, + "version": 0, + "tx_body_hash": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "ux_hash": "a106098a9e2bf084efe238342aff5a777f7292219deb38a6bb2b6c97fd3fc1c5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "fee": 148940, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 198586 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 135, + "block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "previous_block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "timestamp": 1430330591, + "fee": 18619, + "version": 0, + "tx_body_hash": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "ux_hash": "4324929e8fd4832ca1e5552636ad4d21883c4aefa5ca0b4bab47d35b6283128f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "fee": 18619, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 24823 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 136, + "block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "previous_block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "timestamp": 1430330851, + "fee": 2328, + "version": 0, + "tx_body_hash": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "ux_hash": "7f9134d8a5f432976a4fa787df29a481f8d74e2a8da7138cd19662b3bef08ffe" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "fee": 2328, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 3102 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 137, + "block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "previous_block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "timestamp": 1430504186, + "fee": 291, + "version": 0, + "tx_body_hash": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "ux_hash": "1a75b074da1b7e3e6fe9b26cd4a175ebe89e16c3f8917cfffa0ecaa458a5e075" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "fee": 291, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 138, + "block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "previous_block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "timestamp": 1430504236, + "fee": 36, + "version": 0, + "tx_body_hash": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "ux_hash": "b113407099fd9542a9925c4b1e09e62350b2d6151731358a1c8187a7ee38024d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "fee": 36, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 48 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 139, + "block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "previous_block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "timestamp": 1430504536, + "fee": 6, + "version": 0, + "tx_body_hash": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "ux_hash": "f594d0d454c7216dd6575d60f64b00ab88b064110b324058e094e1d632c40301" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "fee": 6, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 140, + "block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "previous_block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "timestamp": 1430504746, + "fee": 0, + "version": 0, + "tx_body_hash": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "ux_hash": "1ae1ea96ca1845708759569144b21b6646d615c0e4d5237a7b6a55d868f9dd27" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "fee": 0, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 141, + "block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "previous_block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "timestamp": 1430504846, + "fee": 0, + "version": 0, + "tx_body_hash": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "ux_hash": "62c012a54d2808a078f06d0bde3bdfb54c5a1eb4df241600068b4b5726a081a6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "fee": 0, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 142, + "block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "previous_block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "timestamp": 1430504966, + "fee": 0, + "version": 0, + "tx_body_hash": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "ux_hash": "f115d4e6e4f10823d5ebb04e913f61a42f6c77a5184d5f5f4af9a5691d94e1a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "fee": 0, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 143, + "block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "previous_block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "timestamp": 1430505086, + "fee": 0, + "version": 0, + "tx_body_hash": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "ux_hash": "54090e16ca9d400aabf58a043688129ad46451dc200abcc9acaaee6278af6707" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "fee": 0, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 144, + "block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "previous_block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "timestamp": 1430505176, + "fee": 0, + "version": 0, + "tx_body_hash": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "ux_hash": "95f733b768d9fa3958e49d04e9f0c7c69cfc909c57d80895e76893271d294106" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "fee": 0, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 145, + "block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "previous_block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "timestamp": 1430550936, + "fee": 693939, + "version": 0, + "tx_body_hash": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "ux_hash": "44eb50878e0a7eef3d8a7c026d9aec54507eb2d28c4898a8172f682a806e1480" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "fee": 693939, + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5, + "calculated_hours": 396519 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43, + "calculated_hours": 396554 + } + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 146, + "block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "previous_block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "timestamp": 1430641376, + "fee": 6894507, + "version": 0, + "tx_body_hash": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "ux_hash": "f0108adf2f599f235b4ead2f672d7d8625243d6e0b2d1e880e2c77248a574e0b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "fee": 6894507, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 9192675 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 147, + "block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "previous_block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "timestamp": 1430641536, + "fee": 861814, + "version": 0, + "tx_body_hash": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "ux_hash": "4b96fbb3a8ee726762486b7de743da01f7d5e70f6eeb3d3ed9ee1d27b5a07acd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "fee": 861814, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1149084 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 148, + "block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "previous_block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "timestamp": 1430642006, + "fee": 107727, + "version": 0, + "tx_body_hash": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "ux_hash": "39f1cd4b28dc61b08253bc51d39405ad8a35df87bee822f95e5259cb3dd202bd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "fee": 107727, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 143635 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 149, + "block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "previous_block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "timestamp": 1430642106, + "fee": 13466, + "version": 0, + "tx_body_hash": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "ux_hash": "ad890aa64b317d35948020e68f3e655ab582914fc4e92d62c58c00d3dc5c9478" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "fee": 13466, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 17954 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 150, + "block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "previous_block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "timestamp": 1430642306, + "fee": 1684, + "version": 0, + "tx_body_hash": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "ux_hash": "95367619af0f79026961c6458133ca702e8e98850a9a45295b8951d5f25feb8c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "fee": 1684, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 2244 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 151, + "block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "previous_block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "timestamp": 1430642426, + "fee": 210, + "version": 0, + "tx_body_hash": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "ux_hash": "4b266d1cb0d20833a2a43044948aaa83c1b4881144b7616ae02b3ee85c13c292" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "fee": 210, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 280 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 152, + "block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "previous_block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "timestamp": 1430642546, + "fee": 27, + "version": 0, + "tx_body_hash": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "ux_hash": "170ad8a7f0d8441091341dc79a0c7c04d46ea47e60e58623a71b442656050a68" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "fee": 27, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 153, + "block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "previous_block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "timestamp": 1430642816, + "fee": 4, + "version": 0, + "tx_body_hash": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "ux_hash": "9fd52eaacfbcc7b88318fae11a7723eddf1184868d159dd7083bce0cb025e375" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "fee": 4, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 154, + "block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "previous_block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "timestamp": 1430643706, + "fee": 0, + "version": 0, + "tx_body_hash": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "ux_hash": "56b56c56ad0aaaf6b7ce3e3845f74776049887c452974d68b46af72e8ca30136" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "fee": 0, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 155, + "block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "previous_block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "timestamp": 1430643906, + "fee": 0, + "version": 0, + "tx_body_hash": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "ux_hash": "6f2840ca10cb769938ff77900c1bead9f5636b33a59fbd7141b00e9b8ea35e85" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "fee": 0, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 156, + "block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "previous_block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "timestamp": 1430644036, + "fee": 0, + "version": 0, + "tx_body_hash": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "ux_hash": "f407bdb9a454483ea14752c56c622b4268b2bd74f3fc6aab24dc769beba45c4d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "fee": 0, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 157, + "block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "previous_block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "timestamp": 1430673946, + "fee": 0, + "version": 0, + "tx_body_hash": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "ux_hash": "477f749b867d0a5c50ada0728e9781a15380ad5a23d4fd62c91c617164739b40" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "fee": 0, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 158, + "block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "previous_block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "timestamp": 1430674696, + "fee": 0, + "version": 0, + "tx_body_hash": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "ux_hash": "bec25fbd537da53dd0516ad735e35e48355955e4c07c1eba0d1c0c1cfe9d0b43" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "fee": 0, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 159, + "block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "previous_block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "timestamp": 1430715196, + "fee": 0, + "version": 0, + "tx_body_hash": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "ux_hash": "1ee9f722d9a194c61afb295639ca3ffcce249a1c11c46a0d66670d3bb8fd4a6c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "fee": 0, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 160, + "block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "previous_block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "timestamp": 1430784172, + "fee": 0, + "version": 0, + "tx_body_hash": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "ux_hash": "d7596292f43d66b82b0e121d29bf996fff6dcc40a3aa7f5cc89f093410615cf7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "fee": 0, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 161, + "block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "previous_block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "timestamp": 1430784312, + "fee": 0, + "version": 0, + "tx_body_hash": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "ux_hash": "379551206d8cec6a0b2b35f661957e53687a500dbca0a050b81d55110b5ee077" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "fee": 0, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 162, + "block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "previous_block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "timestamp": 1430784372, + "fee": 0, + "version": 0, + "tx_body_hash": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "ux_hash": "ca4b55c8abee72fb01a725e4daf45494ae5352fb3494d68334ccb140a4505bc6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "fee": 0, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 163, + "block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "previous_block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "timestamp": 1430784932, + "fee": 0, + "version": 0, + "tx_body_hash": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "ux_hash": "d667c86a072e96b43b096d1f4909d91368c089433adafeef2c0219df9973a9fe" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "fee": 0, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 164, + "block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "previous_block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "timestamp": 1430790052, + "fee": 0, + "version": 0, + "tx_body_hash": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "ux_hash": "b9f75495ffa7bc8af5bd2fa4ec693b58516d9b4fd312b5ce5fa2e764116343d6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 165, + "block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "previous_block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "timestamp": 1430790152, + "fee": 0, + "version": 0, + "tx_body_hash": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "ux_hash": "39db90f061f4054b49c458a63cb76f70ef863d90f7d57f6eeac2654793772cf0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "fee": 0, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 166, + "block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "previous_block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "timestamp": 1430791622, + "fee": 2964031, + "version": 0, + "tx_body_hash": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "ux_hash": "1386a916d2f0e59c5d1fcfbb8707a2cba527fd15486585a42bef96f52a4f9fc4" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "fee": 2964031, + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356, + "calculated_hours": 141306 + }, + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356, + "calculated_hours": 3810733 + } + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 167, + "block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "previous_block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "timestamp": 1430791902, + "fee": 201915, + "version": 0, + "tx_body_hash": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "ux_hash": "7501b8b1ce87f4bb964972942450137fceb82361fb33f604b45719b9a7a32e45" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "fee": 201915, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 269219 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 168, + "block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "previous_block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "timestamp": 1430792072, + "fee": 25240, + "version": 0, + "tx_body_hash": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "ux_hash": "524c84abf87fc6ba4ee491a3181c2b0ed8d0e3e7002d4f9e5c7bb9bf229fedd2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "fee": 25240, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 33652 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 169, + "block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "previous_block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "timestamp": 1430836392, + "fee": 421, + "version": 0, + "tx_body_hash": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "ux_hash": "5c583bd423444d9974a543bbe59e648ca0c252a899fba4731642b02b4d3e28bf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "ux_hash": "d954806eed41026d3c60bc88e8fb569b3aa9007a9679e03ac61724ee3e723b01" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "ux_hash": "e06be06b42f1aa65940658c601cf7132041f7a1eeaffdeede72cef54d9465e66" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "ux_hash": "41c039e8b2ade1a2cd9f7a58873d57729c30d3639a33755b0317ceff66e6f7a9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "fee": 849078, + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004, + "calculated_hours": 1132102 + } + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "ux_hash": "abc08f5bf1ed183dd5dfa6dda09d9de6adfa23e310454861ae1fb938e0384321" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "ux_hash": "4f36b853bdb042046c522f2f5e397ccb24b59a5ef6931dd1cb1d48cc87a1ffc9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "fee": 111521, + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512, + "calculated_hours": 148693 + } + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "ux_hash": "4013a4dd63875f19f124c440685a727e9654d8c2de3298f416bd98c2bbcf2ac9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "ux_hash": "5ad39ab834a65739085413db13fb8c152a641ba28b2b45322d1da9c6d9aa05ef" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "fee": 2711954, + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 1748 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605, + "calculated_hours": 510237 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696, + "calculated_hours": 610213 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704, + "calculated_hours": 487118 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102, + "calculated_hours": 163688 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 112148 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 73857 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0, + "calculated_hours": 340570 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0, + "calculated_hours": 5180 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 32930 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129, + "calculated_hours": 1124989 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512, + "calculated_hours": 152098 + } + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "ux_hash": "c9b05516880ca6665a0f4fa52e7feb6fe83c1ffd6f4d2874877dfa67265524e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "fee": 338994, + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "ux_hash": "428b5ba5d4928fa538d9a031bf9fa3eb215b47d780e43e69bcd71d87758ada2f" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "fee": 395493, + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "owner": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "fee": 2265261, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586, + "calculated_hours": 3020347 + } + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-end-less-than-start.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-end-less-than-start.golden new file mode 100644 index 00000000..b5b27b9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-end-less-than-start.golden @@ -0,0 +1,3 @@ +{ + "blocks": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-1.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-1.golden new file mode 100644 index 00000000..c024e19f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-1.golden @@ -0,0 +1,642 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-10.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-10.golden new file mode 100644 index 00000000..365dfc2a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-10.golden @@ -0,0 +1,1094 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "ux_hash": "dad0a423ff7b1c5c6021698c5c75da34df37b9fc0a5b0c60bcbb50e8665c0610" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "fee": 0, + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "fee": 0, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "ux_hash": "34174a65e1b34d0d7dd0e219f7969e303d4117024b14f8fa5ecc58c29c4c417c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "fee": 0, + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "ux_hash": "4f560eea54f060c029cedc78480a59f6ca549d4fd6cb84fb0388001dcd11b5b7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "fee": 0, + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "ux_hash": "dc4b68b8067932c191922c68504bc443c46144ef904c12b50008b3d77ae91aeb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "fee": 0, + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-genesis.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-genesis.golden new file mode 100644 index 00000000..b9123399 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-genesis.golden @@ -0,0 +1,38 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-last-10.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-last-10.golden new file mode 100644 index 00000000..807419ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-last-10.golden @@ -0,0 +1,646 @@ +{ + "blocks": [ + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "ux_hash": "d954806eed41026d3c60bc88e8fb569b3aa9007a9679e03ac61724ee3e723b01" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "ux_hash": "e06be06b42f1aa65940658c601cf7132041f7a1eeaffdeede72cef54d9465e66" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "ux_hash": "41c039e8b2ade1a2cd9f7a58873d57729c30d3639a33755b0317ceff66e6f7a9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "fee": 849078, + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004, + "calculated_hours": 1132102 + } + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "ux_hash": "abc08f5bf1ed183dd5dfa6dda09d9de6adfa23e310454861ae1fb938e0384321" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "ux_hash": "4f36b853bdb042046c522f2f5e397ccb24b59a5ef6931dd1cb1d48cc87a1ffc9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "fee": 111521, + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512, + "calculated_hours": 148693 + } + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "ux_hash": "4013a4dd63875f19f124c440685a727e9654d8c2de3298f416bd98c2bbcf2ac9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "ux_hash": "5ad39ab834a65739085413db13fb8c152a641ba28b2b45322d1da9c6d9aa05ef" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "fee": 2711954, + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 1748 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605, + "calculated_hours": 510237 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696, + "calculated_hours": 610213 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704, + "calculated_hours": 487118 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102, + "calculated_hours": 163688 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 112148 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 73857 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0, + "calculated_hours": 340570 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0, + "calculated_hours": 5180 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 32930 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129, + "calculated_hours": 1124989 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512, + "calculated_hours": 152098 + } + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "ux_hash": "c9b05516880ca6665a0f4fa52e7feb6fe83c1ffd6f4d2874877dfa67265524e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "fee": 338994, + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "ux_hash": "428b5ba5d4928fa538d9a031bf9fa3eb215b47d780e43e69bcd71d87758ada2f" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "fee": 395493, + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "owner": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "fee": 2265261, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586, + "calculated_hours": 3020347 + } + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/coinsupply.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/coinsupply.golden new file mode 100644 index 00000000..2ac17eb8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/coinsupply.golden @@ -0,0 +1,111 @@ +{ + "current_supply": "384300.000000", + "total_supply": "25000000.000000", + "max_supply": "100000000.000000", + "current_coinhour_supply": "202549286", + "total_coinhour_supply": "24569186081", + "unlocked_distribution_addresses": [ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm" + ], + "locked_distribution_addresses": [ + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm" + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions-verbose.golden new file mode 100644 index 00000000..6279e632 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions-verbose.golden @@ -0,0 +1,168 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions.golden new file mode 100644 index 00000000..ecc1d6f9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions.golden @@ -0,0 +1,140 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions-verbose.golden new file mode 100644 index 00000000..4ddf3f5b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions-verbose.golden @@ -0,0 +1,8565 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 179, + "block_seq": 2 + }, + "time": 1427927651, + "txn": { + "timestamp": 1427927651, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 178, + "block_seq": 3 + }, + "time": 1427927671, + "txn": { + "timestamp": 1427927671, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 177, + "block_seq": 4 + }, + "time": 1428793611, + "txn": { + "timestamp": 1428793611, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 176, + "block_seq": 5 + }, + "time": 1428798821, + "txn": { + "timestamp": 1428798821, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 175, + "block_seq": 6 + }, + "time": 1428806251, + "txn": { + "timestamp": 1428806251, + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "fee": 0, + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 174, + "block_seq": 7 + }, + "time": 1428807671, + "txn": { + "timestamp": 1428807671, + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "fee": 0, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 173, + "block_seq": 8 + }, + "time": 1428807691, + "txn": { + "timestamp": 1428807691, + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "fee": 0, + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 172, + "block_seq": 9 + }, + "time": 1428807711, + "txn": { + "timestamp": 1428807711, + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "fee": 0, + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 171, + "block_seq": 10 + }, + "time": 1428807771, + "txn": { + "timestamp": 1428807771, + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "fee": 0, + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 170, + "block_seq": 11 + }, + "time": 1428808851, + "txn": { + "timestamp": 1428808851, + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "fee": 0, + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 169, + "block_seq": 12 + }, + "time": 1428814821, + "txn": { + "timestamp": 1428814821, + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "fee": 0, + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "owner": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 168, + "block_seq": 13 + }, + "time": 1428814891, + "txn": { + "timestamp": 1428814891, + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "fee": 2, + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 167, + "block_seq": 14 + }, + "time": 1428815131, + "txn": { + "timestamp": 1428815131, + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "fee": 0, + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "owner": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 166, + "block_seq": 15 + }, + "time": 1428820169, + "txn": { + "timestamp": 1428820169, + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "fee": 51, + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0, + "calculated_hours": 153 + } + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 165, + "block_seq": 16 + }, + "time": 1428820629, + "txn": { + "timestamp": 1428820629, + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "fee": 0, + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "owner": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 162, + "block_seq": 19 + }, + "time": 1428990115, + "txn": { + "timestamp": 1428990115, + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "fee": 1134, + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102, + "calculated_hours": 3402 + } + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 161, + "block_seq": 20 + }, + "time": 1428990135, + "txn": { + "timestamp": 1428990135, + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "fee": 756, + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268, + "calculated_hours": 2268 + } + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 160, + "block_seq": 21 + }, + "time": 1428991365, + "txn": { + "timestamp": 1428991365, + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "fee": 504, + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512, + "calculated_hours": 1512 + } + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 159, + "block_seq": 22 + }, + "time": 1428991585, + "txn": { + "timestamp": 1428991585, + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "fee": 0, + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 158, + "block_seq": 23 + }, + "time": 1428991605, + "txn": { + "timestamp": 1428991605, + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "fee": 0, + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 157, + "block_seq": 24 + }, + "time": 1428991635, + "txn": { + "timestamp": 1428991635, + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "fee": 0, + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "owner": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "owner": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 156, + "block_seq": 25 + }, + "time": 1428991665, + "txn": { + "timestamp": 1428991665, + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "fee": 0, + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 155, + "block_seq": 26 + }, + "time": 1429011077, + "txn": { + "timestamp": 1429011077, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "fee": 3407635, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 4543507 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 154, + "block_seq": 27 + }, + "time": 1429011137, + "txn": { + "timestamp": 1429011137, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "fee": 425954, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 567938 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 153, + "block_seq": 28 + }, + "time": 1429020387, + "txn": { + "timestamp": 1429020387, + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "fee": 214, + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 284 + } + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 152, + "block_seq": 29 + }, + "time": 1429020687, + "txn": { + "timestamp": 1429020687, + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "fee": 551, + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 629 + } + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 151, + "block_seq": 30 + }, + "time": 1429021044, + "txn": { + "timestamp": 1429021044, + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "fee": 31, + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "fee": 60, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78, + "calculated_hours": 78 + } + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "fee": 8, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + } + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "fee": 9, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + }, + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "fee": 1, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "fee": 0, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "fee": 0, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "fee": 0, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 143, + "block_seq": 38 + }, + "time": 1429058484, + "txn": { + "timestamp": 1429058484, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "fee": 2335473, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 3113963 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 141, + "block_seq": 40 + }, + "time": 1429058514, + "txn": { + "timestamp": 1429058514, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "fee": 36493, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 48655 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 140, + "block_seq": 41 + }, + "time": 1429058524, + "txn": { + "timestamp": 1429058524, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "fee": 4561, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 6081 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 139, + "block_seq": 42 + }, + "time": 1429058594, + "txn": { + "timestamp": 1429058594, + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "fee": 292512, + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245, + "calculated_hours": 389256 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760, + "calculated_hours": 760 + } + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 138, + "block_seq": 43 + }, + "time": 1429070374, + "txn": { + "timestamp": 1429070374, + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "fee": 1596, + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008, + "calculated_hours": 2035 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35, + "calculated_hours": 56 + }, + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 137, + "block_seq": 44 + }, + "time": 1429070414, + "txn": { + "timestamp": 1429070414, + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "fee": 199, + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265, + "calculated_hours": 265 + } + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 136, + "block_seq": 45 + }, + "time": 1429071074, + "txn": { + "timestamp": 1429071074, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "fee": 2402820, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3203760 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 131, + "block_seq": 50 + }, + "time": 1429077474, + "txn": { + "timestamp": 1429077474, + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "fee": 71833, + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752, + "calculated_hours": 95777 + } + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 130, + "block_seq": 51 + }, + "time": 1429077484, + "txn": { + "timestamp": 1429077484, + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "fee": 44061, + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081, + "calculated_hours": 58747 + } + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 129, + "block_seq": 52 + }, + "time": 1429077494, + "txn": { + "timestamp": 1429077494, + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "fee": 8996, + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972, + "calculated_hours": 11994 + } + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 127, + "block_seq": 54 + }, + "time": 1429077524, + "txn": { + "timestamp": 1429077524, + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "fee": 1153, + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499, + "calculated_hours": 1537 + } + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 126, + "block_seq": 55 + }, + "time": 1429077544, + "txn": { + "timestamp": 1429077544, + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "fee": 5583, + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343, + "calculated_hours": 7443 + } + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56 + }, + "time": 1429077554, + "txn": { + "timestamp": 1429077554, + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "fee": 76179, + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655, + "calculated_hours": 101571 + } + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 124, + "block_seq": 57 + }, + "time": 1429077584, + "txn": { + "timestamp": 1429077584, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "fee": 10088, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 13450 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 123, + "block_seq": 58 + }, + "time": 1429077604, + "txn": { + "timestamp": 1429077604, + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "fee": 220, + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192, + "calculated_hours": 292 + } + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 122, + "block_seq": 59 + }, + "time": 1429077614, + "txn": { + "timestamp": 1429077614, + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "fee": 799, + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930, + "calculated_hours": 1063 + } + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60 + }, + "time": 1429077624, + "txn": { + "timestamp": 1429077624, + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "fee": 9636, + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696, + "calculated_hours": 12846 + } + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 120, + "block_seq": 61 + }, + "time": 1429077654, + "txn": { + "timestamp": 1429077654, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "fee": 9118, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 12156 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 119, + "block_seq": 62 + }, + "time": 1429077664, + "txn": { + "timestamp": 1429077664, + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "fee": 79, + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36, + "calculated_hours": 105 + } + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63 + }, + "time": 1429077684, + "txn": { + "timestamp": 1429077684, + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "fee": 1271, + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605, + "calculated_hours": 1693 + } + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 117, + "block_seq": 64 + }, + "time": 1429077694, + "txn": { + "timestamp": 1429077694, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "fee": 7026, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 9366 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 116, + "block_seq": 65 + }, + "time": 1429077724, + "txn": { + "timestamp": 1429077724, + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "fee": 36, + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13, + "calculated_hours": 46 + } + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 115, + "block_seq": 66 + }, + "time": 1429077734, + "txn": { + "timestamp": 1429077734, + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "fee": 259, + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132, + "calculated_hours": 345 + } + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 114, + "block_seq": 67 + }, + "time": 1429077874, + "txn": { + "timestamp": 1429077874, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "fee": 8718, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 11622 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 113, + "block_seq": 68 + }, + "time": 1429077914, + "txn": { + "timestamp": 1429077914, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "fee": 1090, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 112, + "block_seq": 69 + }, + "time": 1429077944, + "txn": { + "timestamp": 1429077944, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "fee": 137, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 181 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 111, + "block_seq": 70 + }, + "time": 1429077964, + "txn": { + "timestamp": 1429077964, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "fee": 18, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 22 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 109, + "block_seq": 72 + }, + "time": 1429078004, + "txn": { + "timestamp": 1429078004, + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "fee": 558, + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43, + "calculated_hours": 443 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22, + "calculated_hours": 230 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2, + "calculated_hours": 71 + } + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "fee": 2326, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964, + "calculated_hours": 3100 + } + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 107, + "block_seq": 74 + }, + "time": 1429091944, + "txn": { + "timestamp": 1429091944, + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "fee": 43640, + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "owner": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752, + "calculated_hours": 57799 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "owner": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 106, + "block_seq": 75 + }, + "time": 1429096344, + "txn": { + "timestamp": 1429096344, + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "fee": 5455, + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "owner": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273, + "calculated_hours": 7273 + } + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 105, + "block_seq": 76 + }, + "time": 1429110544, + "txn": { + "timestamp": 1429110544, + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "fee": 432263, + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33, + "calculated_hours": 393 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470, + "calculated_hours": 575956 + } + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 104, + "block_seq": 77 + }, + "time": 1429147880, + "txn": { + "timestamp": 1429147880, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "fee": 5860904, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 7814538 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 103, + "block_seq": 78 + }, + "time": 1429147900, + "txn": { + "timestamp": 1429147900, + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "fee": 407859, + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5, + "calculated_hours": 58468 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93, + "calculated_hours": 485343 + } + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79 + }, + "time": 1429147950, + "txn": { + "timestamp": 1429147950, + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "fee": 466755, + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211, + "calculated_hours": 136742 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 485597 + } + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 101, + "block_seq": 80 + }, + "time": 1429148000, + "txn": { + "timestamp": 1429148000, + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "fee": 51265, + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976, + "calculated_hours": 68351 + } + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 100, + "block_seq": 81 + }, + "time": 1429164440, + "txn": { + "timestamp": 1429164440, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "fee": 754183, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 1005575 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 99, + "block_seq": 82 + }, + "time": 1429164460, + "txn": { + "timestamp": 1429164460, + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "fee": 558303, + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93, + "calculated_hours": 744403 + } + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83 + }, + "time": 1429164480, + "txn": { + "timestamp": 1429164480, + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "fee": 164971, + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792, + "calculated_hours": 219961 + } + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84 + }, + "time": 1429164590, + "txn": { + "timestamp": 1429164590, + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "fee": 20623, + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495, + "calculated_hours": 27495 + } + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 96, + "block_seq": 85 + }, + "time": 1429164620, + "txn": { + "timestamp": 1429164620, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "fee": 121202, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 161602 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 95, + "block_seq": 86 + }, + "time": 1429164720, + "txn": { + "timestamp": 1429164720, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "fee": 15150, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 20200 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 94, + "block_seq": 87 + }, + "time": 1429164730, + "txn": { + "timestamp": 1429164730, + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "fee": 96974, + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543, + "calculated_hours": 129298 + } + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 93, + "block_seq": 88 + }, + "time": 1429164790, + "txn": { + "timestamp": 1429164790, + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "fee": 71476, + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050, + "calculated_hours": 95300 + } + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89 + }, + "time": 1429164800, + "txn": { + "timestamp": 1429164800, + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "fee": 3816, + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436, + "calculated_hours": 5086 + } + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 91, + "block_seq": 90 + }, + "time": 1429164810, + "txn": { + "timestamp": 1429164810, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "fee": 16229, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 21637 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 90, + "block_seq": 91 + }, + "time": 1429164830, + "txn": { + "timestamp": 1429164830, + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "fee": 12539, + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162, + "calculated_hours": 16717 + } + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 89, + "block_seq": 92 + }, + "time": 1429164850, + "txn": { + "timestamp": 1429164850, + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "fee": 9176, + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912, + "calculated_hours": 12234 + } + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93 + }, + "time": 1429164860, + "txn": { + "timestamp": 1429164860, + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "fee": 775, + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635, + "calculated_hours": 1033 + } + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 87, + "block_seq": 94 + }, + "time": 1429164870, + "txn": { + "timestamp": 1429164870, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "fee": 10977, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 14635 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 86, + "block_seq": 95 + }, + "time": 1429164880, + "txn": { + "timestamp": 1429164880, + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "fee": 1767, + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089, + "calculated_hours": 2355 + } + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 85, + "block_seq": 96 + }, + "time": 1429164900, + "txn": { + "timestamp": 1429164900, + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "fee": 1322, + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529, + "calculated_hours": 1762 + } + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97 + }, + "time": 1429165260, + "txn": { + "timestamp": 1429165260, + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "fee": 328, + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129, + "calculated_hours": 436 + } + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 83, + "block_seq": 98 + }, + "time": 1429274566, + "txn": { + "timestamp": 1429274566, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "fee": 71088, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 94784 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 81, + "block_seq": 100 + }, + "time": 1429274636, + "txn": { + "timestamp": 1429274636, + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "fee": 613712, + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294, + "calculated_hours": 701385 + } + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102 + }, + "time": 1429274686, + "txn": { + "timestamp": 1429274686, + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "fee": 710046, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54, + "calculated_hours": 811481 + } + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103 + }, + "time": 1429278106, + "txn": { + "timestamp": 1429278106, + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "fee": 76077, + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435, + "calculated_hours": 101435 + } + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 77, + "block_seq": 104 + }, + "time": 1429278406, + "txn": { + "timestamp": 1429278406, + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "fee": 82382, + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673, + "calculated_hours": 109842 + } + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "txn": { + "timestamp": 1429278556, + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "fee": 11173, + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679, + "calculated_hours": 14895 + } + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 75, + "block_seq": 106 + }, + "time": 1429279796, + "txn": { + "timestamp": 1429279796, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "fee": 835759, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 962798 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11903 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7564 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 132080 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 74, + "block_seq": 107 + }, + "time": 1429280596, + "txn": { + "timestamp": 1429280596, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "fee": 104471, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 139293 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 73, + "block_seq": 108 + }, + "time": 1429280756, + "txn": { + "timestamp": 1429280756, + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "fee": 20746, + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730, + "calculated_hours": 27660 + } + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 72, + "block_seq": 109 + }, + "time": 1429302756, + "txn": { + "timestamp": 1429302756, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "fee": 42555, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 56739 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 71, + "block_seq": 110 + }, + "time": 1429326351, + "txn": { + "timestamp": 1429326351, + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "fee": 107094, + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457, + "calculated_hours": 142790 + } + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 70, + "block_seq": 111 + }, + "time": 1429348072, + "txn": { + "timestamp": 1429348072, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "fee": 13386, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 17848 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 69, + "block_seq": 112 + }, + "time": 1429348102, + "txn": { + "timestamp": 1429348102, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "fee": 8332864, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11108253 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2231 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 67, + "block_seq": 114 + }, + "time": 1429348502, + "txn": { + "timestamp": 1429348502, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "fee": 130201, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 173601 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66, + "block_seq": 115 + }, + "time": 1429348712, + "txn": { + "timestamp": 1429348712, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "fee": 16276, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 21700 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116 + }, + "time": 1429349392, + "txn": { + "timestamp": 1429349392, + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "fee": 388717, + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861, + "calculated_hours": 518287 + } + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 64, + "block_seq": 117 + }, + "time": 1429351912, + "txn": { + "timestamp": 1429351912, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "fee": 125795, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 167725 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "fee": 184620, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387, + "calculated_hours": 72454 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601, + "calculated_hours": 173704 + } + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 62, + "block_seq": 119 + }, + "time": 1429364282, + "txn": { + "timestamp": 1429364282, + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "fee": 23077, + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "owner": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769, + "calculated_hours": 30769 + } + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "fee": 3366, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "owner": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846, + "calculated_hours": 3846 + } + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 59, + "block_seq": 122 + }, + "time": 1429382898, + "txn": { + "timestamp": 1429382898, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "fee": 283986, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 378646 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57, + "block_seq": 124 + }, + "time": 1429522086, + "txn": { + "timestamp": 1429522086, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "fee": 4438, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 5916 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 56, + "block_seq": 125 + }, + "time": 1429578056, + "txn": { + "timestamp": 1429578056, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "fee": 555, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 55, + "block_seq": 126 + }, + "time": 1429680646, + "txn": { + "timestamp": 1429680646, + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "fee": 103861, + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "owner": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436, + "calculated_hours": 37891 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "owner": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200, + "calculated_hours": 100590 + } + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 54, + "block_seq": 127 + }, + "time": 1429848410, + "txn": { + "timestamp": 1429848410, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "fee": 3170256, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1175478 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3051530 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53, + "block_seq": 128 + }, + "time": 1429849170, + "txn": { + "timestamp": 1429849170, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "fee": 41968911, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55430171 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528376 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 52, + "block_seq": 129 + }, + "time": 1429849180, + "txn": { + "timestamp": 1429849180, + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "fee": 401128, + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376, + "calculated_hours": 534836 + } + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 51, + "block_seq": 130 + }, + "time": 1430311531, + "txn": { + "timestamp": 1430311531, + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "fee": 50142, + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854, + "calculated_hours": 66854 + } + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 50, + "block_seq": 131 + }, + "time": 1430330041, + "txn": { + "timestamp": 1430330041, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "fee": 76257058, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 101676076 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 49, + "block_seq": 132 + }, + "time": 1430330311, + "txn": { + "timestamp": 1430330311, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "fee": 9532133, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12709509 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 48, + "block_seq": 133 + }, + "time": 1430330421, + "txn": { + "timestamp": 1430330421, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "fee": 1191516, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1588688 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 47, + "block_seq": 134 + }, + "time": 1430330481, + "txn": { + "timestamp": 1430330481, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "fee": 148940, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 198586 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46, + "block_seq": 135 + }, + "time": 1430330591, + "txn": { + "timestamp": 1430330591, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "fee": 18619, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 24823 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45, + "block_seq": 136 + }, + "time": 1430330851, + "txn": { + "timestamp": 1430330851, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "fee": 2328, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 3102 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 44, + "block_seq": 137 + }, + "time": 1430504186, + "txn": { + "timestamp": 1430504186, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "fee": 291, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 43, + "block_seq": 138 + }, + "time": 1430504236, + "txn": { + "timestamp": 1430504236, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "fee": 36, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 48 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 42, + "block_seq": 139 + }, + "time": 1430504536, + "txn": { + "timestamp": 1430504536, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "fee": 6, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 41, + "block_seq": 140 + }, + "time": 1430504746, + "txn": { + "timestamp": 1430504746, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "fee": 0, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 40, + "block_seq": 141 + }, + "time": 1430504846, + "txn": { + "timestamp": 1430504846, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "fee": 0, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 39, + "block_seq": 142 + }, + "time": 1430504966, + "txn": { + "timestamp": 1430504966, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "fee": 0, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38, + "block_seq": 143 + }, + "time": 1430505086, + "txn": { + "timestamp": 1430505086, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "fee": 0, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 37, + "block_seq": 144 + }, + "time": 1430505176, + "txn": { + "timestamp": 1430505176, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "fee": 0, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 36, + "block_seq": 145 + }, + "time": 1430550936, + "txn": { + "timestamp": 1430550936, + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "fee": 693939, + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5, + "calculated_hours": 396519 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43, + "calculated_hours": 396554 + } + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 35, + "block_seq": 146 + }, + "time": 1430641376, + "txn": { + "timestamp": 1430641376, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "fee": 6894507, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 9192675 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 34, + "block_seq": 147 + }, + "time": 1430641536, + "txn": { + "timestamp": 1430641536, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "fee": 861814, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1149084 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 33, + "block_seq": 148 + }, + "time": 1430642006, + "txn": { + "timestamp": 1430642006, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "fee": 107727, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 143635 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 32, + "block_seq": 149 + }, + "time": 1430642106, + "txn": { + "timestamp": 1430642106, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "fee": 13466, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 17954 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 31, + "block_seq": 150 + }, + "time": 1430642306, + "txn": { + "timestamp": 1430642306, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "fee": 1684, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 2244 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 30, + "block_seq": 151 + }, + "time": 1430642426, + "txn": { + "timestamp": 1430642426, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "fee": 210, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 280 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 29, + "block_seq": 152 + }, + "time": 1430642546, + "txn": { + "timestamp": 1430642546, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "fee": 27, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 28, + "block_seq": 153 + }, + "time": 1430642816, + "txn": { + "timestamp": 1430642816, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "fee": 4, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 27, + "block_seq": 154 + }, + "time": 1430643706, + "txn": { + "timestamp": 1430643706, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "fee": 0, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 26, + "block_seq": 155 + }, + "time": 1430643906, + "txn": { + "timestamp": 1430643906, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "fee": 0, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 25, + "block_seq": 156 + }, + "time": 1430644036, + "txn": { + "timestamp": 1430644036, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "fee": 0, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 24, + "block_seq": 157 + }, + "time": 1430673946, + "txn": { + "timestamp": 1430673946, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "fee": 0, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 23, + "block_seq": 158 + }, + "time": 1430674696, + "txn": { + "timestamp": 1430674696, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "fee": 0, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 22, + "block_seq": 159 + }, + "time": 1430715196, + "txn": { + "timestamp": 1430715196, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "fee": 0, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 21, + "block_seq": 160 + }, + "time": 1430784172, + "txn": { + "timestamp": 1430784172, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "fee": 0, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 20, + "block_seq": 161 + }, + "time": 1430784312, + "txn": { + "timestamp": 1430784312, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "fee": 0, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 19, + "block_seq": 162 + }, + "time": 1430784372, + "txn": { + "timestamp": 1430784372, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "fee": 0, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 18, + "block_seq": 163 + }, + "time": 1430784932, + "txn": { + "timestamp": 1430784932, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "fee": 0, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 16, + "block_seq": 165 + }, + "time": 1430790152, + "txn": { + "timestamp": 1430790152, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "fee": 0, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 15, + "block_seq": 166 + }, + "time": 1430791622, + "txn": { + "timestamp": 1430791622, + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "fee": 2964031, + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356, + "calculated_hours": 141306 + }, + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356, + "calculated_hours": 3810733 + } + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 14, + "block_seq": 167 + }, + "time": 1430791902, + "txn": { + "timestamp": 1430791902, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "fee": 201915, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 269219 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 13, + "block_seq": 168 + }, + "time": 1430792072, + "txn": { + "timestamp": 1430792072, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "fee": 25240, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 33652 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10, + "block_seq": 171 + }, + "time": 1430870562, + "txn": { + "timestamp": 1430870562, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 9, + "block_seq": 172 + }, + "time": 1430870592, + "txn": { + "timestamp": 1430870592, + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "fee": 849078, + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004, + "calculated_hours": 1132102 + } + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8, + "block_seq": 173 + }, + "time": 1430871512, + "txn": { + "timestamp": 1430871512, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 7, + "block_seq": 174 + }, + "time": 1430871622, + "txn": { + "timestamp": 1430871622, + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "fee": 111521, + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512, + "calculated_hours": 148693 + } + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 6, + "block_seq": 175 + }, + "time": 1430908702, + "txn": { + "timestamp": 1430908702, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 5, + "block_seq": 176 + }, + "time": 1431162639, + "txn": { + "timestamp": 1431162639, + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "fee": 2711954, + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 1748 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605, + "calculated_hours": 510237 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696, + "calculated_hours": 610213 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704, + "calculated_hours": 487118 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102, + "calculated_hours": 163688 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 112148 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 73857 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0, + "calculated_hours": 340570 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0, + "calculated_hours": 5180 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 32930 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129, + "calculated_hours": 1124989 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512, + "calculated_hours": 152098 + } + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 4, + "block_seq": 177 + }, + "time": 1431162689, + "txn": { + "timestamp": 1431162689, + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "fee": 338994, + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 3, + "block_seq": 178 + }, + "time": 1431162729, + "txn": { + "timestamp": 1431162729, + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "fee": 395493, + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "owner": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 2, + "block_seq": 179 + }, + "time": 1431339429, + "txn": { + "timestamp": 1431339429, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 180 + }, + "time": 1431574528, + "txn": { + "timestamp": 1431574528, + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "fee": 2265261, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586, + "calculated_hours": 3020347 + } + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions.golden new file mode 100644 index 00000000..acd0dcfa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions.golden @@ -0,0 +1,7058 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 179, + "block_seq": 2 + }, + "time": 1427927651, + "txn": { + "timestamp": 1427927651, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 178, + "block_seq": 3 + }, + "time": 1427927671, + "txn": { + "timestamp": 1427927671, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 177, + "block_seq": 4 + }, + "time": 1428793611, + "txn": { + "timestamp": 1428793611, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 176, + "block_seq": 5 + }, + "time": 1428798821, + "txn": { + "timestamp": 1428798821, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 175, + "block_seq": 6 + }, + "time": 1428806251, + "txn": { + "timestamp": 1428806251, + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 174, + "block_seq": 7 + }, + "time": 1428807671, + "txn": { + "timestamp": 1428807671, + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 173, + "block_seq": 8 + }, + "time": 1428807691, + "txn": { + "timestamp": 1428807691, + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 172, + "block_seq": 9 + }, + "time": 1428807711, + "txn": { + "timestamp": 1428807711, + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 171, + "block_seq": 10 + }, + "time": 1428807771, + "txn": { + "timestamp": 1428807771, + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 170, + "block_seq": 11 + }, + "time": 1428808851, + "txn": { + "timestamp": 1428808851, + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 169, + "block_seq": 12 + }, + "time": 1428814821, + "txn": { + "timestamp": 1428814821, + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953" + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 168, + "block_seq": 13 + }, + "time": 1428814891, + "txn": { + "timestamp": 1428814891, + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c" + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 167, + "block_seq": 14 + }, + "time": 1428815131, + "txn": { + "timestamp": 1428815131, + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8" + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 166, + "block_seq": 15 + }, + "time": 1428820169, + "txn": { + "timestamp": 1428820169, + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840" + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 165, + "block_seq": 16 + }, + "time": 1428820629, + "txn": { + "timestamp": 1428820629, + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3" + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 162, + "block_seq": 19 + }, + "time": 1428990115, + "txn": { + "timestamp": 1428990115, + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159" + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 161, + "block_seq": 20 + }, + "time": 1428990135, + "txn": { + "timestamp": 1428990135, + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d" + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 160, + "block_seq": 21 + }, + "time": 1428991365, + "txn": { + "timestamp": 1428991365, + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c" + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 159, + "block_seq": 22 + }, + "time": 1428991585, + "txn": { + "timestamp": 1428991585, + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6" + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 158, + "block_seq": 23 + }, + "time": 1428991605, + "txn": { + "timestamp": 1428991605, + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846" + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 157, + "block_seq": 24 + }, + "time": 1428991635, + "txn": { + "timestamp": 1428991635, + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c" + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 156, + "block_seq": 25 + }, + "time": 1428991665, + "txn": { + "timestamp": 1428991665, + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e" + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 155, + "block_seq": 26 + }, + "time": 1429011077, + "txn": { + "timestamp": 1429011077, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef" + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 154, + "block_seq": 27 + }, + "time": 1429011137, + "txn": { + "timestamp": 1429011137, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba" + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 153, + "block_seq": 28 + }, + "time": 1429020387, + "txn": { + "timestamp": 1429020387, + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452" + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 152, + "block_seq": 29 + }, + "time": 1429020687, + "txn": { + "timestamp": 1429020687, + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f" + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 151, + "block_seq": 30 + }, + "time": 1429021044, + "txn": { + "timestamp": 1429021044, + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea" + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 143, + "block_seq": 38 + }, + "time": 1429058484, + "txn": { + "timestamp": 1429058484, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33" + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 141, + "block_seq": 40 + }, + "time": 1429058514, + "txn": { + "timestamp": 1429058514, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6" + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 140, + "block_seq": 41 + }, + "time": 1429058524, + "txn": { + "timestamp": 1429058524, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 139, + "block_seq": 42 + }, + "time": 1429058594, + "txn": { + "timestamp": 1429058594, + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 138, + "block_seq": 43 + }, + "time": 1429070374, + "txn": { + "timestamp": 1429070374, + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403" + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 137, + "block_seq": 44 + }, + "time": 1429070414, + "txn": { + "timestamp": 1429070414, + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9" + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 136, + "block_seq": 45 + }, + "time": 1429071074, + "txn": { + "timestamp": 1429071074, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5" + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 131, + "block_seq": 50 + }, + "time": 1429077474, + "txn": { + "timestamp": 1429077474, + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead" + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 130, + "block_seq": 51 + }, + "time": 1429077484, + "txn": { + "timestamp": 1429077484, + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86" + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 129, + "block_seq": 52 + }, + "time": 1429077494, + "txn": { + "timestamp": 1429077494, + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6" + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 127, + "block_seq": 54 + }, + "time": 1429077524, + "txn": { + "timestamp": 1429077524, + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09" + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 126, + "block_seq": 55 + }, + "time": 1429077544, + "txn": { + "timestamp": 1429077544, + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2" + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56 + }, + "time": 1429077554, + "txn": { + "timestamp": 1429077554, + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 124, + "block_seq": 57 + }, + "time": 1429077584, + "txn": { + "timestamp": 1429077584, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea" + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 123, + "block_seq": 58 + }, + "time": 1429077604, + "txn": { + "timestamp": 1429077604, + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f" + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 122, + "block_seq": 59 + }, + "time": 1429077614, + "txn": { + "timestamp": 1429077614, + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a" + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60 + }, + "time": 1429077624, + "txn": { + "timestamp": 1429077624, + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 120, + "block_seq": 61 + }, + "time": 1429077654, + "txn": { + "timestamp": 1429077654, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731" + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 119, + "block_seq": 62 + }, + "time": 1429077664, + "txn": { + "timestamp": 1429077664, + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49" + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63 + }, + "time": 1429077684, + "txn": { + "timestamp": 1429077684, + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 117, + "block_seq": 64 + }, + "time": 1429077694, + "txn": { + "timestamp": 1429077694, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648" + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 116, + "block_seq": 65 + }, + "time": 1429077724, + "txn": { + "timestamp": 1429077724, + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36" + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 115, + "block_seq": 66 + }, + "time": 1429077734, + "txn": { + "timestamp": 1429077734, + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900" + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 114, + "block_seq": 67 + }, + "time": 1429077874, + "txn": { + "timestamp": 1429077874, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639" + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 113, + "block_seq": 68 + }, + "time": 1429077914, + "txn": { + "timestamp": 1429077914, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a" + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 112, + "block_seq": 69 + }, + "time": 1429077944, + "txn": { + "timestamp": 1429077944, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698" + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 111, + "block_seq": 70 + }, + "time": 1429077964, + "txn": { + "timestamp": 1429077964, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3" + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 109, + "block_seq": 72 + }, + "time": 1429078004, + "txn": { + "timestamp": 1429078004, + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb" + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 107, + "block_seq": 74 + }, + "time": 1429091944, + "txn": { + "timestamp": 1429091944, + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad" + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 106, + "block_seq": 75 + }, + "time": 1429096344, + "txn": { + "timestamp": 1429096344, + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1" + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 105, + "block_seq": 76 + }, + "time": 1429110544, + "txn": { + "timestamp": 1429110544, + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a" + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 104, + "block_seq": 77 + }, + "time": 1429147880, + "txn": { + "timestamp": 1429147880, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642" + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 103, + "block_seq": 78 + }, + "time": 1429147900, + "txn": { + "timestamp": 1429147900, + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048" + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79 + }, + "time": 1429147950, + "txn": { + "timestamp": 1429147950, + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 101, + "block_seq": 80 + }, + "time": 1429148000, + "txn": { + "timestamp": 1429148000, + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a" + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 100, + "block_seq": 81 + }, + "time": 1429164440, + "txn": { + "timestamp": 1429164440, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f" + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 99, + "block_seq": 82 + }, + "time": 1429164460, + "txn": { + "timestamp": 1429164460, + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa" + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83 + }, + "time": 1429164480, + "txn": { + "timestamp": 1429164480, + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84 + }, + "time": 1429164590, + "txn": { + "timestamp": 1429164590, + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 96, + "block_seq": 85 + }, + "time": 1429164620, + "txn": { + "timestamp": 1429164620, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0" + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 95, + "block_seq": 86 + }, + "time": 1429164720, + "txn": { + "timestamp": 1429164720, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2" + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 94, + "block_seq": 87 + }, + "time": 1429164730, + "txn": { + "timestamp": 1429164730, + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9" + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 93, + "block_seq": 88 + }, + "time": 1429164790, + "txn": { + "timestamp": 1429164790, + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd" + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89 + }, + "time": 1429164800, + "txn": { + "timestamp": 1429164800, + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 91, + "block_seq": 90 + }, + "time": 1429164810, + "txn": { + "timestamp": 1429164810, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e" + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 90, + "block_seq": 91 + }, + "time": 1429164830, + "txn": { + "timestamp": 1429164830, + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9" + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 89, + "block_seq": 92 + }, + "time": 1429164850, + "txn": { + "timestamp": 1429164850, + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49" + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93 + }, + "time": 1429164860, + "txn": { + "timestamp": 1429164860, + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 87, + "block_seq": 94 + }, + "time": 1429164870, + "txn": { + "timestamp": 1429164870, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44" + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 86, + "block_seq": 95 + }, + "time": 1429164880, + "txn": { + "timestamp": 1429164880, + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38" + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 85, + "block_seq": 96 + }, + "time": 1429164900, + "txn": { + "timestamp": 1429164900, + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806" + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97 + }, + "time": 1429165260, + "txn": { + "timestamp": 1429165260, + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 83, + "block_seq": 98 + }, + "time": 1429274566, + "txn": { + "timestamp": 1429274566, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb" + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 81, + "block_seq": 100 + }, + "time": 1429274636, + "txn": { + "timestamp": 1429274636, + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102 + }, + "time": 1429274686, + "txn": { + "timestamp": 1429274686, + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103 + }, + "time": 1429278106, + "txn": { + "timestamp": 1429278106, + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 77, + "block_seq": 104 + }, + "time": 1429278406, + "txn": { + "timestamp": 1429278406, + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29" + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "txn": { + "timestamp": 1429278556, + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 75, + "block_seq": 106 + }, + "time": 1429279796, + "txn": { + "timestamp": 1429279796, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274" + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 74, + "block_seq": 107 + }, + "time": 1429280596, + "txn": { + "timestamp": 1429280596, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0" + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 73, + "block_seq": 108 + }, + "time": 1429280756, + "txn": { + "timestamp": 1429280756, + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef" + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 72, + "block_seq": 109 + }, + "time": 1429302756, + "txn": { + "timestamp": 1429302756, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968" + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 71, + "block_seq": 110 + }, + "time": 1429326351, + "txn": { + "timestamp": 1429326351, + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614" + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 70, + "block_seq": 111 + }, + "time": 1429348072, + "txn": { + "timestamp": 1429348072, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54" + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 69, + "block_seq": 112 + }, + "time": 1429348102, + "txn": { + "timestamp": 1429348102, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0" + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 67, + "block_seq": 114 + }, + "time": 1429348502, + "txn": { + "timestamp": 1429348502, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9" + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66, + "block_seq": 115 + }, + "time": 1429348712, + "txn": { + "timestamp": 1429348712, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4" + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116 + }, + "time": 1429349392, + "txn": { + "timestamp": 1429349392, + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 64, + "block_seq": 117 + }, + "time": 1429351912, + "txn": { + "timestamp": 1429351912, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3" + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 62, + "block_seq": 119 + }, + "time": 1429364282, + "txn": { + "timestamp": 1429364282, + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd" + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 59, + "block_seq": 122 + }, + "time": 1429382898, + "txn": { + "timestamp": 1429382898, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c" + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57, + "block_seq": 124 + }, + "time": 1429522086, + "txn": { + "timestamp": 1429522086, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a" + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 56, + "block_seq": 125 + }, + "time": 1429578056, + "txn": { + "timestamp": 1429578056, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4" + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 55, + "block_seq": 126 + }, + "time": 1429680646, + "txn": { + "timestamp": 1429680646, + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9" + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 54, + "block_seq": 127 + }, + "time": 1429848410, + "txn": { + "timestamp": 1429848410, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958" + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53, + "block_seq": 128 + }, + "time": 1429849170, + "txn": { + "timestamp": 1429849170, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528" + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 52, + "block_seq": 129 + }, + "time": 1429849180, + "txn": { + "timestamp": 1429849180, + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591" + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 51, + "block_seq": 130 + }, + "time": 1430311531, + "txn": { + "timestamp": 1430311531, + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94" + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 50, + "block_seq": 131 + }, + "time": 1430330041, + "txn": { + "timestamp": 1430330041, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca" + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 49, + "block_seq": 132 + }, + "time": 1430330311, + "txn": { + "timestamp": 1430330311, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58" + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 48, + "block_seq": 133 + }, + "time": 1430330421, + "txn": { + "timestamp": 1430330421, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191" + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 47, + "block_seq": 134 + }, + "time": 1430330481, + "txn": { + "timestamp": 1430330481, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768" + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46, + "block_seq": 135 + }, + "time": 1430330591, + "txn": { + "timestamp": 1430330591, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552" + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45, + "block_seq": 136 + }, + "time": 1430330851, + "txn": { + "timestamp": 1430330851, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e" + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 44, + "block_seq": 137 + }, + "time": 1430504186, + "txn": { + "timestamp": 1430504186, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab" + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 43, + "block_seq": 138 + }, + "time": 1430504236, + "txn": { + "timestamp": 1430504236, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4" + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 42, + "block_seq": 139 + }, + "time": 1430504536, + "txn": { + "timestamp": 1430504536, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d" + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 41, + "block_seq": 140 + }, + "time": 1430504746, + "txn": { + "timestamp": 1430504746, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d" + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 40, + "block_seq": 141 + }, + "time": 1430504846, + "txn": { + "timestamp": 1430504846, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0" + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 39, + "block_seq": 142 + }, + "time": 1430504966, + "txn": { + "timestamp": 1430504966, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f" + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38, + "block_seq": 143 + }, + "time": 1430505086, + "txn": { + "timestamp": 1430505086, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed" + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 37, + "block_seq": 144 + }, + "time": 1430505176, + "txn": { + "timestamp": 1430505176, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05" + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 36, + "block_seq": 145 + }, + "time": 1430550936, + "txn": { + "timestamp": 1430550936, + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28" + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 35, + "block_seq": 146 + }, + "time": 1430641376, + "txn": { + "timestamp": 1430641376, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c" + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 34, + "block_seq": 147 + }, + "time": 1430641536, + "txn": { + "timestamp": 1430641536, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299" + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 33, + "block_seq": 148 + }, + "time": 1430642006, + "txn": { + "timestamp": 1430642006, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce" + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 32, + "block_seq": 149 + }, + "time": 1430642106, + "txn": { + "timestamp": 1430642106, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275" + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 31, + "block_seq": 150 + }, + "time": 1430642306, + "txn": { + "timestamp": 1430642306, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab" + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 30, + "block_seq": 151 + }, + "time": 1430642426, + "txn": { + "timestamp": 1430642426, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7" + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 29, + "block_seq": 152 + }, + "time": 1430642546, + "txn": { + "timestamp": 1430642546, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066" + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 28, + "block_seq": 153 + }, + "time": 1430642816, + "txn": { + "timestamp": 1430642816, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1" + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 27, + "block_seq": 154 + }, + "time": 1430643706, + "txn": { + "timestamp": 1430643706, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c" + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 26, + "block_seq": 155 + }, + "time": 1430643906, + "txn": { + "timestamp": 1430643906, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da" + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 25, + "block_seq": 156 + }, + "time": 1430644036, + "txn": { + "timestamp": 1430644036, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac" + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 24, + "block_seq": 157 + }, + "time": 1430673946, + "txn": { + "timestamp": 1430673946, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee" + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 23, + "block_seq": 158 + }, + "time": 1430674696, + "txn": { + "timestamp": 1430674696, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3" + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 22, + "block_seq": 159 + }, + "time": 1430715196, + "txn": { + "timestamp": 1430715196, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef" + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 21, + "block_seq": 160 + }, + "time": 1430784172, + "txn": { + "timestamp": 1430784172, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714" + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 20, + "block_seq": 161 + }, + "time": 1430784312, + "txn": { + "timestamp": 1430784312, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072" + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 19, + "block_seq": 162 + }, + "time": 1430784372, + "txn": { + "timestamp": 1430784372, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d" + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 18, + "block_seq": 163 + }, + "time": 1430784932, + "txn": { + "timestamp": 1430784932, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5" + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 16, + "block_seq": 165 + }, + "time": 1430790152, + "txn": { + "timestamp": 1430790152, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a" + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 15, + "block_seq": 166 + }, + "time": 1430791622, + "txn": { + "timestamp": 1430791622, + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb" + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 14, + "block_seq": 167 + }, + "time": 1430791902, + "txn": { + "timestamp": 1430791902, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396" + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 13, + "block_seq": 168 + }, + "time": 1430792072, + "txn": { + "timestamp": 1430792072, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748" + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10, + "block_seq": 171 + }, + "time": 1430870562, + "txn": { + "timestamp": 1430870562, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 9, + "block_seq": 172 + }, + "time": 1430870592, + "txn": { + "timestamp": 1430870592, + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8, + "block_seq": 173 + }, + "time": 1430871512, + "txn": { + "timestamp": 1430871512, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 7, + "block_seq": 174 + }, + "time": 1430871622, + "txn": { + "timestamp": 1430871622, + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 6, + "block_seq": 175 + }, + "time": 1430908702, + "txn": { + "timestamp": 1430908702, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 5, + "block_seq": 176 + }, + "time": 1431162639, + "txn": { + "timestamp": 1431162639, + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 4, + "block_seq": 177 + }, + "time": 1431162689, + "txn": { + "timestamp": 1431162689, + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 3, + "block_seq": 178 + }, + "time": 1431162729, + "txn": { + "timestamp": 1431162729, + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 2, + "block_seq": 179 + }, + "time": 1431339429, + "txn": { + "timestamp": 1431339429, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 180 + }, + "time": 1431574528, + "txn": { + "timestamp": 1431574528, + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions-verbose.golden new file mode 100644 index 00000000..50c8707a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions-verbose.golden @@ -0,0 +1,1311 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "fee": 60, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78, + "calculated_hours": 78 + } + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "fee": 8, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + } + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "fee": 9, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + }, + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "fee": 1, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "fee": 0, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "fee": 0, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "fee": 0, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions.golden new file mode 100644 index 00000000..1c93994e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions.golden @@ -0,0 +1,1162 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + } +] diff --git a/vendor/github.com/spf13/pflag/go.sum b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-raw-tx.golden similarity index 100% rename from vendor/github.com/spf13/pflag/go.sum rename to vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-raw-tx.golden diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-encoded.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-encoded.golden new file mode 100644 index 00000000..94902af2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-encoded.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "encoded_transaction": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-verbose.golden new file mode 100644 index 00000000..1daaf62b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-verbose.golden @@ -0,0 +1,27 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction.golden new file mode 100644 index 00000000..448ae158 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction.golden @@ -0,0 +1,26 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions-verbose.golden new file mode 100644 index 00000000..26a78fbd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions-verbose.golden @@ -0,0 +1,909 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56 + }, + "time": 1429077554, + "txn": { + "timestamp": 1429077554, + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "fee": 76179, + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655, + "calculated_hours": 101571 + } + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60 + }, + "time": 1429077624, + "txn": { + "timestamp": 1429077624, + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "fee": 9636, + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696, + "calculated_hours": 12846 + } + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63 + }, + "time": 1429077684, + "txn": { + "timestamp": 1429077684, + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "fee": 1271, + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605, + "calculated_hours": 1693 + } + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "fee": 2326, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964, + "calculated_hours": 3100 + } + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79 + }, + "time": 1429147950, + "txn": { + "timestamp": 1429147950, + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "fee": 466755, + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211, + "calculated_hours": 136742 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 485597 + } + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83 + }, + "time": 1429164480, + "txn": { + "timestamp": 1429164480, + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "fee": 164971, + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792, + "calculated_hours": 219961 + } + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84 + }, + "time": 1429164590, + "txn": { + "timestamp": 1429164590, + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "fee": 20623, + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495, + "calculated_hours": 27495 + } + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89 + }, + "time": 1429164800, + "txn": { + "timestamp": 1429164800, + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "fee": 3816, + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436, + "calculated_hours": 5086 + } + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93 + }, + "time": 1429164860, + "txn": { + "timestamp": 1429164860, + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "fee": 775, + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635, + "calculated_hours": 1033 + } + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97 + }, + "time": 1429165260, + "txn": { + "timestamp": 1429165260, + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "fee": 328, + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129, + "calculated_hours": 436 + } + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102 + }, + "time": 1429274686, + "txn": { + "timestamp": 1429274686, + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "fee": 710046, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54, + "calculated_hours": 811481 + } + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103 + }, + "time": 1429278106, + "txn": { + "timestamp": 1429278106, + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "fee": 76077, + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435, + "calculated_hours": 101435 + } + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "txn": { + "timestamp": 1429278556, + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "fee": 11173, + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679, + "calculated_hours": 14895 + } + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116 + }, + "time": 1429349392, + "txn": { + "timestamp": 1429349392, + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "fee": 388717, + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861, + "calculated_hours": 518287 + } + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "fee": 184620, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387, + "calculated_hours": 72454 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601, + "calculated_hours": 173704 + } + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "fee": 3366, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "owner": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846, + "calculated_hours": 3846 + } + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions.golden new file mode 100644 index 00000000..e4d5d51c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions.golden @@ -0,0 +1,750 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56 + }, + "time": 1429077554, + "txn": { + "timestamp": 1429077554, + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60 + }, + "time": 1429077624, + "txn": { + "timestamp": 1429077624, + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63 + }, + "time": 1429077684, + "txn": { + "timestamp": 1429077684, + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79 + }, + "time": 1429147950, + "txn": { + "timestamp": 1429147950, + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83 + }, + "time": 1429164480, + "txn": { + "timestamp": 1429164480, + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84 + }, + "time": 1429164590, + "txn": { + "timestamp": 1429164590, + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89 + }, + "time": 1429164800, + "txn": { + "timestamp": 1429164800, + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93 + }, + "time": 1429164860, + "txn": { + "timestamp": 1429164860, + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97 + }, + "time": 1429165260, + "txn": { + "timestamp": 1429165260, + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102 + }, + "time": 1429274686, + "txn": { + "timestamp": 1429274686, + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103 + }, + "time": 1429278106, + "txn": { + "timestamp": 1429278106, + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "txn": { + "timestamp": 1429278556, + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116 + }, + "time": 1429349392, + "txn": { + "timestamp": 1429349392, + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-default-peers.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-default-peers.golden new file mode 100644 index 00000000..ba385bcc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-default-peers.golden @@ -0,0 +1,11 @@ +[ + "109.237.27.172:6000", + "139.162.121.185:6000", + "139.162.248.183:6000", + "139.162.39.186:6000", + "172.104.164.147:6000", + "172.104.41.14:6000", + "173.230.130.174:6000", + "45.33.111.142:6000", + "45.56.109.228:6000" +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-exchanged-peers.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-exchanged-peers.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-exchanged-peers.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-trusted-peers.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-trusted-peers.golden new file mode 100644 index 00000000..ba385bcc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-trusted-peers.golden @@ -0,0 +1,11 @@ +[ + "109.237.27.172:6000", + "139.162.121.185:6000", + "139.162.248.183:6000", + "139.162.39.186:6000", + "172.104.164.147:6000", + "172.104.41.14:6000", + "173.230.130.174:6000", + "45.33.111.142:6000", + "45.56.109.228:6000" +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-addrs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-addrs.golden new file mode 100644 index 00000000..198f4c51 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-addrs.golden @@ -0,0 +1,46 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-hashes.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-hashes.golden new file mode 100644 index 00000000..a9805388 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-hashes.golden @@ -0,0 +1,56 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-noargs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-noargs.golden new file mode 100644 index 00000000..c8e228ed --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-noargs.golden @@ -0,0 +1,2196 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "time": 1431162729, + "block_seq": 178, + "src_tx": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499, + "calculated_hours": 57070 + }, + { + "hash": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499, + "calculated_hours": 622777 + }, + { + "hash": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499, + "calculated_hours": 2344493 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "time": 1430871622, + "block_seq": 174, + "src_tx": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586, + "calculated_hours": 994844 + }, + { + "hash": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "time": 1430871512, + "block_seq": 173, + "src_tx": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440, + "calculated_hours": 2470826 + }, + { + "hash": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "time": 1430836422, + "block_seq": 170, + "src_tx": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8, + "calculated_hours": 2058 + }, + { + "hash": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "time": 1430836392, + "block_seq": 169, + "src_tx": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70, + "calculated_hours": 203057 + }, + { + "hash": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "time": 1430792072, + "block_seq": 168, + "src_tx": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206, + "calculated_hours": 221554 + }, + { + "hash": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "time": 1430791902, + "block_seq": 167, + "src_tx": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652, + "calculated_hours": 55391 + }, + { + "hash": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "time": 1430791622, + "block_seq": 166, + "src_tx": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004, + "calculated_hours": 602740 + }, + { + "hash": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "time": 1430784932, + "block_seq": 163, + "src_tx": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219332 + }, + { + "hash": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "time": 1430784312, + "block_seq": 161, + "src_tx": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219504 + }, + { + "hash": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "time": 1430784172, + "block_seq": 160, + "src_tx": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219543 + }, + { + "hash": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "time": 1430674696, + "block_seq": 158, + "src_tx": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 6248833 + }, + { + "hash": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "time": 1430673946, + "block_seq": 157, + "src_tx": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0, + "calculated_hours": 4502910 + }, + { + "hash": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "time": 1430644036, + "block_seq": 156, + "src_tx": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258470 + }, + { + "hash": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "time": 1430643906, + "block_seq": 155, + "src_tx": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0, + "calculated_hours": 77551 + }, + { + "hash": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "time": 1430643706, + "block_seq": 154, + "src_tx": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258561 + }, + { + "hash": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "time": 1430642546, + "block_seq": 152, + "src_tx": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4, + "calculated_hours": 258887 + }, + { + "hash": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "time": 1430642426, + "block_seq": 151, + "src_tx": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35, + "calculated_hours": 258952 + }, + { + "hash": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "time": 1430642306, + "block_seq": 150, + "src_tx": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280, + "calculated_hours": 26175 + }, + { + "hash": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "time": 1430642106, + "block_seq": 149, + "src_tx": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244, + "calculated_hours": 261250 + }, + { + "hash": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "time": 1430642006, + "block_seq": 148, + "src_tx": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954, + "calculated_hours": 276987 + }, + { + "hash": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "time": 1430641536, + "block_seq": 147, + "src_tx": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635, + "calculated_hours": 402799 + }, + { + "hash": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "time": 1430641376, + "block_seq": 146, + "src_tx": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084, + "calculated_hours": 1408292 + }, + { + "hash": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "time": 1430550936, + "block_seq": 145, + "src_tx": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134, + "calculated_hours": 667796 + }, + { + "hash": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "time": 1430505176, + "block_seq": 144, + "src_tx": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297042 + }, + { + "hash": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "time": 1430505086, + "block_seq": 143, + "src_tx": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0, + "calculated_hours": 148533 + }, + { + "hash": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "time": 1430504846, + "block_seq": 141, + "src_tx": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0, + "calculated_hours": 742834 + }, + { + "hash": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "time": 1430504746, + "block_seq": 140, + "src_tx": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297161 + }, + { + "hash": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "time": 1430504536, + "block_seq": 139, + "src_tx": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297220 + }, + { + "hash": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "time": 1430504236, + "block_seq": 138, + "src_tx": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6, + "calculated_hours": 356770 + }, + { + "hash": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "time": 1430504186, + "block_seq": 137, + "src_tx": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48, + "calculated_hours": 297365 + }, + { + "hash": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "time": 1430330851, + "block_seq": 136, + "src_tx": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387, + "calculated_hours": 345852 + }, + { + "hash": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "time": 1430330481, + "block_seq": 134, + "src_tx": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823, + "calculated_hours": 59379 + }, + { + "hash": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "time": 1430330421, + "block_seq": 133, + "src_tx": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586, + "calculated_hours": 371378 + }, + { + "hash": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "time": 1430330311, + "block_seq": 132, + "src_tx": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688, + "calculated_hours": 1934303 + }, + { + "hash": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "time": 1430330041, + "block_seq": 131, + "src_tx": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509, + "calculated_hours": 13124338 + }, + { + "hash": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "time": 1429849180, + "block_seq": 129, + "src_tx": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854, + "calculated_hours": 546117 + }, + { + "hash": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "time": 1429849170, + "block_seq": 128, + "src_tx": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818, + "calculated_hours": 7474084 + }, + { + "hash": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310, + "calculated_hours": 538127 + }, + { + "hash": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310, + "calculated_hours": 22570 + }, + { + "hash": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "time": 1429578056, + "block_seq": 125, + "src_tx": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92, + "calculated_hours": 6932286 + }, + { + "hash": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "time": 1429522086, + "block_seq": 124, + "src_tx": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739, + "calculated_hours": 2851352 + }, + { + "hash": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "time": 1429451746, + "block_seq": 123, + "src_tx": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916, + "calculated_hours": 5902532 + }, + { + "hash": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "time": 1429382898, + "block_seq": 122, + "src_tx": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330, + "calculated_hours": 21963630 + }, + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "time": 1429364282, + "block_seq": 119, + "src_tx": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846, + "calculated_hours": 11213 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + }, + { + "hash": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "time": 1429351912, + "block_seq": 117, + "src_tx": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965, + "calculated_hours": 6194898 + }, + { + "hash": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785, + "calculated_hours": 16382449 + }, + { + "hash": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785, + "calculated_hours": 126594 + }, + { + "hash": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "time": 1429348712, + "block_seq": 115, + "src_tx": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712, + "calculated_hours": 64540 + }, + { + "hash": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "time": 1429348502, + "block_seq": 114, + "src_tx": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700, + "calculated_hours": 83534 + }, + { + "hash": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "time": 1429326351, + "block_seq": 110, + "src_tx": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848, + "calculated_hours": 80297 + }, + { + "hash": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "time": 1429302756, + "block_seq": 109, + "src_tx": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092, + "calculated_hours": 1900235 + }, + { + "hash": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "time": 1429280756, + "block_seq": 108, + "src_tx": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457, + "calculated_hours": 67172 + }, + { + "hash": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "time": 1429280596, + "block_seq": 107, + "src_tx": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411, + "calculated_hours": 81131 + }, + { + "hash": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "time": 1429279796, + "block_seq": 106, + "src_tx": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293, + "calculated_hours": 203035 + }, + { + "hash": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "time": 1429278556, + "block_seq": 105, + "src_tx": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861, + "calculated_hours": 65638 + }, + { + "hash": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "time": 1429278406, + "block_seq": 104, + "src_tx": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730, + "calculated_hours": 77511 + }, + { + "hash": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "time": 1429278106, + "block_seq": 103, + "src_tx": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679, + "calculated_hours": 76468 + }, + { + "hash": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "time": 1429165260, + "block_seq": 97, + "src_tx": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54, + "calculated_hours": 669295 + }, + { + "hash": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "time": 1429164900, + "block_seq": 96, + "src_tx": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220, + "calculated_hours": 669561 + }, + { + "hash": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "time": 1429164880, + "block_seq": 95, + "src_tx": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294, + "calculated_hours": 669640 + }, + { + "hash": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "time": 1429164870, + "block_seq": 94, + "src_tx": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829, + "calculated_hours": 671178 + }, + { + "hash": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "time": 1429164860, + "block_seq": 93, + "src_tx": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129, + "calculated_hours": 669481 + }, + { + "hash": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "time": 1429164850, + "block_seq": 92, + "src_tx": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529, + "calculated_hours": 670884 + }, + { + "hash": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "time": 1429164830, + "block_seq": 91, + "src_tx": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089, + "calculated_hours": 671449 + }, + { + "hash": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "time": 1429164800, + "block_seq": 89, + "src_tx": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635, + "calculated_hours": 670003 + }, + { + "hash": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "time": 1429164790, + "block_seq": 88, + "src_tx": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912, + "calculated_hours": 681283 + }, + { + "hash": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "time": 1429164730, + "block_seq": 87, + "src_tx": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162, + "calculated_hours": 685550 + }, + { + "hash": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "time": 1429164720, + "block_seq": 86, + "src_tx": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525, + "calculated_hours": 671916 + }, + { + "hash": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "time": 1429164480, + "block_seq": 83, + "src_tx": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495, + "calculated_hours": 696952 + }, + { + "hash": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "time": 1429164460, + "block_seq": 82, + "src_tx": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050, + "calculated_hours": 762513 + }, + { + "hash": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "time": 1429148000, + "block_seq": 80, + "src_tx": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543, + "calculated_hours": 682578 + }, + { + "hash": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "time": 1429147950, + "block_seq": 79, + "src_tx": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792, + "calculated_hours": 751841 + }, + { + "hash": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "time": 1429147900, + "block_seq": 78, + "src_tx": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976, + "calculated_hours": 742039 + }, + { + "hash": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "time": 1429147880, + "block_seq": 77, + "src_tx": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817, + "calculated_hours": 1650885 + }, + { + "hash": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043, + "calculated_hours": 17213842 + }, + { + "hash": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043, + "calculated_hours": 75465 + }, + { + "hash": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909, + "calculated_hours": 31886 + }, + { + "hash": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909, + "calculated_hours": 4350 + }, + { + "hash": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "time": 1429091944, + "block_seq": 74, + "src_tx": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273, + "calculated_hours": 665847 + }, + { + "hash": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "time": 1429077914, + "block_seq": 68, + "src_tx": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181, + "calculated_hours": 693684 + }, + { + "hash": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "time": 1429077874, + "block_seq": 67, + "src_tx": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452, + "calculated_hours": 694967 + }, + { + "hash": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "time": 1429077694, + "block_seq": 64, + "src_tx": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170, + "calculated_hours": 694735 + }, + { + "hash": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "time": 1429077684, + "block_seq": 63, + "src_tx": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211, + "calculated_hours": 693778 + }, + { + "hash": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "time": 1429077664, + "block_seq": 62, + "src_tx": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13, + "calculated_hours": 693586 + }, + { + "hash": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "time": 1429077654, + "block_seq": 61, + "src_tx": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519, + "calculated_hours": 695095 + }, + { + "hash": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "time": 1429077614, + "block_seq": 59, + "src_tx": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132, + "calculated_hours": 693719 + }, + { + "hash": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "time": 1429077604, + "block_seq": 58, + "src_tx": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36, + "calculated_hours": 693626 + }, + { + "hash": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "time": 1429077584, + "block_seq": 57, + "src_tx": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681, + "calculated_hours": 695276 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + }, + { + "hash": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "time": 1429077544, + "block_seq": 55, + "src_tx": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930, + "calculated_hours": 694536 + }, + { + "hash": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "time": 1429077524, + "block_seq": 54, + "src_tx": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192, + "calculated_hours": 693804 + }, + { + "hash": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "time": 1429077494, + "block_seq": 52, + "src_tx": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499, + "calculated_hours": 695119 + }, + { + "hash": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "time": 1429077484, + "block_seq": 51, + "src_tx": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343, + "calculated_hours": 700966 + }, + { + "hash": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "time": 1429077474, + "block_seq": 50, + "src_tx": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972, + "calculated_hours": 705598 + }, + { + "hash": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "time": 1429070414, + "block_seq": 44, + "src_tx": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33, + "calculated_hours": 3510 + }, + { + "hash": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "time": 1429070374, + "block_seq": 43, + "src_tx": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265, + "calculated_hours": 3742 + }, + { + "hash": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "time": 1429011137, + "block_seq": 27, + "src_tx": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992, + "calculated_hours": 135076 + }, + { + "hash": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "time": 1429011077, + "block_seq": 26, + "src_tx": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938, + "calculated_hours": 575058 + }, + { + "hash": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 717 + }, + { + "hash": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "time": 1428991635, + "block_seq": 24, + "src_tx": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "time": 1428990135, + "block_seq": 20, + "src_tx": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "time": 1428990115, + "block_seq": 19, + "src_tx": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1529 + }, + { + "hash": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0, + "calculated_hours": 2294 + }, + { + "hash": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "time": 1428807711, + "block_seq": 9, + "src_tx": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "time": 1428807691, + "block_seq": 8, + "src_tx": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "time": 1428807671, + "block_seq": 7, + "src_tx": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-txns.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-txns.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-txns.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-addrs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-addrs.golden new file mode 100644 index 00000000..cbca9952 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-addrs.golden @@ -0,0 +1,77 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "time": 1430836422, + "block_seq": 170, + "src_tx": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8, + "calculated_hours": 2058 + }, + { + "hash": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "time": 1430836392, + "block_seq": 169, + "src_tx": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70, + "calculated_hours": 203057 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [ + { + "hash": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "time": 1431574528, + "block_seq": 180, + "src_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263, + "calculated_hours": 5716263 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-hashes.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-hashes.golden new file mode 100644 index 00000000..1f80cb92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-hashes.golden @@ -0,0 +1,67 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + } + ], + "outgoing_outputs": [ + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "incoming_outputs": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-noargs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-noargs.golden new file mode 100644 index 00000000..3b1d0032 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-noargs.golden @@ -0,0 +1,2228 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "time": 1431162729, + "block_seq": 178, + "src_tx": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499, + "calculated_hours": 57070 + }, + { + "hash": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499, + "calculated_hours": 622777 + }, + { + "hash": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499, + "calculated_hours": 2344493 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "time": 1430871622, + "block_seq": 174, + "src_tx": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586, + "calculated_hours": 994844 + }, + { + "hash": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "time": 1430871512, + "block_seq": 173, + "src_tx": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440, + "calculated_hours": 2470826 + }, + { + "hash": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "time": 1430836422, + "block_seq": 170, + "src_tx": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8, + "calculated_hours": 2058 + }, + { + "hash": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "time": 1430836392, + "block_seq": 169, + "src_tx": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70, + "calculated_hours": 203057 + }, + { + "hash": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "time": 1430792072, + "block_seq": 168, + "src_tx": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206, + "calculated_hours": 221554 + }, + { + "hash": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "time": 1430791902, + "block_seq": 167, + "src_tx": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652, + "calculated_hours": 55391 + }, + { + "hash": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "time": 1430791622, + "block_seq": 166, + "src_tx": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004, + "calculated_hours": 602740 + }, + { + "hash": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "time": 1430784932, + "block_seq": 163, + "src_tx": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219332 + }, + { + "hash": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "time": 1430784312, + "block_seq": 161, + "src_tx": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219504 + }, + { + "hash": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "time": 1430784172, + "block_seq": 160, + "src_tx": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219543 + }, + { + "hash": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "time": 1430674696, + "block_seq": 158, + "src_tx": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 6248833 + }, + { + "hash": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "time": 1430673946, + "block_seq": 157, + "src_tx": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0, + "calculated_hours": 4502910 + }, + { + "hash": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "time": 1430644036, + "block_seq": 156, + "src_tx": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258470 + }, + { + "hash": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "time": 1430643906, + "block_seq": 155, + "src_tx": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0, + "calculated_hours": 77551 + }, + { + "hash": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "time": 1430643706, + "block_seq": 154, + "src_tx": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258561 + }, + { + "hash": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "time": 1430642546, + "block_seq": 152, + "src_tx": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4, + "calculated_hours": 258887 + }, + { + "hash": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "time": 1430642426, + "block_seq": 151, + "src_tx": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35, + "calculated_hours": 258952 + }, + { + "hash": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "time": 1430642306, + "block_seq": 150, + "src_tx": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280, + "calculated_hours": 26175 + }, + { + "hash": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "time": 1430642106, + "block_seq": 149, + "src_tx": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244, + "calculated_hours": 261250 + }, + { + "hash": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "time": 1430642006, + "block_seq": 148, + "src_tx": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954, + "calculated_hours": 276987 + }, + { + "hash": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "time": 1430641536, + "block_seq": 147, + "src_tx": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635, + "calculated_hours": 402799 + }, + { + "hash": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "time": 1430641376, + "block_seq": 146, + "src_tx": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084, + "calculated_hours": 1408292 + }, + { + "hash": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "time": 1430550936, + "block_seq": 145, + "src_tx": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134, + "calculated_hours": 667796 + }, + { + "hash": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "time": 1430505176, + "block_seq": 144, + "src_tx": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297042 + }, + { + "hash": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "time": 1430505086, + "block_seq": 143, + "src_tx": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0, + "calculated_hours": 148533 + }, + { + "hash": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "time": 1430504846, + "block_seq": 141, + "src_tx": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0, + "calculated_hours": 742834 + }, + { + "hash": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "time": 1430504746, + "block_seq": 140, + "src_tx": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297161 + }, + { + "hash": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "time": 1430504536, + "block_seq": 139, + "src_tx": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297220 + }, + { + "hash": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "time": 1430504236, + "block_seq": 138, + "src_tx": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6, + "calculated_hours": 356770 + }, + { + "hash": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "time": 1430504186, + "block_seq": 137, + "src_tx": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48, + "calculated_hours": 297365 + }, + { + "hash": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "time": 1430330851, + "block_seq": 136, + "src_tx": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387, + "calculated_hours": 345852 + }, + { + "hash": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "time": 1430330481, + "block_seq": 134, + "src_tx": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823, + "calculated_hours": 59379 + }, + { + "hash": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "time": 1430330421, + "block_seq": 133, + "src_tx": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586, + "calculated_hours": 371378 + }, + { + "hash": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "time": 1430330311, + "block_seq": 132, + "src_tx": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688, + "calculated_hours": 1934303 + }, + { + "hash": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "time": 1430330041, + "block_seq": 131, + "src_tx": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509, + "calculated_hours": 13124338 + }, + { + "hash": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "time": 1429849180, + "block_seq": 129, + "src_tx": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854, + "calculated_hours": 546117 + }, + { + "hash": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "time": 1429849170, + "block_seq": 128, + "src_tx": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818, + "calculated_hours": 7474084 + }, + { + "hash": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310, + "calculated_hours": 538127 + }, + { + "hash": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310, + "calculated_hours": 22570 + }, + { + "hash": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "time": 1429578056, + "block_seq": 125, + "src_tx": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92, + "calculated_hours": 6932286 + }, + { + "hash": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "time": 1429522086, + "block_seq": 124, + "src_tx": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739, + "calculated_hours": 2851352 + }, + { + "hash": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "time": 1429451746, + "block_seq": 123, + "src_tx": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916, + "calculated_hours": 5902532 + }, + { + "hash": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "time": 1429382898, + "block_seq": 122, + "src_tx": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330, + "calculated_hours": 21963630 + }, + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "time": 1429364282, + "block_seq": 119, + "src_tx": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846, + "calculated_hours": 11213 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + }, + { + "hash": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "time": 1429351912, + "block_seq": 117, + "src_tx": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965, + "calculated_hours": 6194898 + }, + { + "hash": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785, + "calculated_hours": 16382449 + }, + { + "hash": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785, + "calculated_hours": 126594 + }, + { + "hash": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "time": 1429348712, + "block_seq": 115, + "src_tx": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712, + "calculated_hours": 64540 + }, + { + "hash": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "time": 1429348502, + "block_seq": 114, + "src_tx": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700, + "calculated_hours": 83534 + }, + { + "hash": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "time": 1429326351, + "block_seq": 110, + "src_tx": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848, + "calculated_hours": 80297 + }, + { + "hash": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "time": 1429302756, + "block_seq": 109, + "src_tx": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092, + "calculated_hours": 1900235 + }, + { + "hash": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "time": 1429280756, + "block_seq": 108, + "src_tx": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457, + "calculated_hours": 67172 + }, + { + "hash": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "time": 1429280596, + "block_seq": 107, + "src_tx": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411, + "calculated_hours": 81131 + }, + { + "hash": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "time": 1429279796, + "block_seq": 106, + "src_tx": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293, + "calculated_hours": 203035 + }, + { + "hash": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "time": 1429278556, + "block_seq": 105, + "src_tx": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861, + "calculated_hours": 65638 + }, + { + "hash": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "time": 1429278406, + "block_seq": 104, + "src_tx": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730, + "calculated_hours": 77511 + }, + { + "hash": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "time": 1429278106, + "block_seq": 103, + "src_tx": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679, + "calculated_hours": 76468 + }, + { + "hash": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "time": 1429165260, + "block_seq": 97, + "src_tx": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54, + "calculated_hours": 669295 + }, + { + "hash": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "time": 1429164900, + "block_seq": 96, + "src_tx": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220, + "calculated_hours": 669561 + }, + { + "hash": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "time": 1429164880, + "block_seq": 95, + "src_tx": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294, + "calculated_hours": 669640 + }, + { + "hash": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "time": 1429164870, + "block_seq": 94, + "src_tx": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829, + "calculated_hours": 671178 + }, + { + "hash": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "time": 1429164860, + "block_seq": 93, + "src_tx": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129, + "calculated_hours": 669481 + }, + { + "hash": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "time": 1429164850, + "block_seq": 92, + "src_tx": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529, + "calculated_hours": 670884 + }, + { + "hash": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "time": 1429164830, + "block_seq": 91, + "src_tx": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089, + "calculated_hours": 671449 + }, + { + "hash": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "time": 1429164800, + "block_seq": 89, + "src_tx": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635, + "calculated_hours": 670003 + }, + { + "hash": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "time": 1429164790, + "block_seq": 88, + "src_tx": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912, + "calculated_hours": 681283 + }, + { + "hash": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "time": 1429164730, + "block_seq": 87, + "src_tx": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162, + "calculated_hours": 685550 + }, + { + "hash": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "time": 1429164720, + "block_seq": 86, + "src_tx": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525, + "calculated_hours": 671916 + }, + { + "hash": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "time": 1429164480, + "block_seq": 83, + "src_tx": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495, + "calculated_hours": 696952 + }, + { + "hash": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "time": 1429164460, + "block_seq": 82, + "src_tx": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050, + "calculated_hours": 762513 + }, + { + "hash": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "time": 1429148000, + "block_seq": 80, + "src_tx": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543, + "calculated_hours": 682578 + }, + { + "hash": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "time": 1429147950, + "block_seq": 79, + "src_tx": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792, + "calculated_hours": 751841 + }, + { + "hash": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "time": 1429147900, + "block_seq": 78, + "src_tx": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976, + "calculated_hours": 742039 + }, + { + "hash": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "time": 1429147880, + "block_seq": 77, + "src_tx": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817, + "calculated_hours": 1650885 + }, + { + "hash": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043, + "calculated_hours": 17213842 + }, + { + "hash": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043, + "calculated_hours": 75465 + }, + { + "hash": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909, + "calculated_hours": 31886 + }, + { + "hash": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909, + "calculated_hours": 4350 + }, + { + "hash": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "time": 1429091944, + "block_seq": 74, + "src_tx": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273, + "calculated_hours": 665847 + }, + { + "hash": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "time": 1429077914, + "block_seq": 68, + "src_tx": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181, + "calculated_hours": 693684 + }, + { + "hash": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "time": 1429077874, + "block_seq": 67, + "src_tx": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452, + "calculated_hours": 694967 + }, + { + "hash": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "time": 1429077694, + "block_seq": 64, + "src_tx": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170, + "calculated_hours": 694735 + }, + { + "hash": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "time": 1429077684, + "block_seq": 63, + "src_tx": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211, + "calculated_hours": 693778 + }, + { + "hash": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "time": 1429077664, + "block_seq": 62, + "src_tx": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13, + "calculated_hours": 693586 + }, + { + "hash": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "time": 1429077654, + "block_seq": 61, + "src_tx": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519, + "calculated_hours": 695095 + }, + { + "hash": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "time": 1429077614, + "block_seq": 59, + "src_tx": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132, + "calculated_hours": 693719 + }, + { + "hash": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "time": 1429077604, + "block_seq": 58, + "src_tx": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36, + "calculated_hours": 693626 + }, + { + "hash": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "time": 1429077584, + "block_seq": 57, + "src_tx": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681, + "calculated_hours": 695276 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + }, + { + "hash": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "time": 1429077544, + "block_seq": 55, + "src_tx": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930, + "calculated_hours": 694536 + }, + { + "hash": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "time": 1429077524, + "block_seq": 54, + "src_tx": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192, + "calculated_hours": 693804 + }, + { + "hash": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "time": 1429077494, + "block_seq": 52, + "src_tx": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499, + "calculated_hours": 695119 + }, + { + "hash": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "time": 1429077484, + "block_seq": 51, + "src_tx": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343, + "calculated_hours": 700966 + }, + { + "hash": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "time": 1429077474, + "block_seq": 50, + "src_tx": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972, + "calculated_hours": 705598 + }, + { + "hash": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "time": 1429070414, + "block_seq": 44, + "src_tx": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33, + "calculated_hours": 3510 + }, + { + "hash": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "time": 1429070374, + "block_seq": 43, + "src_tx": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265, + "calculated_hours": 3742 + }, + { + "hash": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "time": 1429011137, + "block_seq": 27, + "src_tx": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992, + "calculated_hours": 135076 + }, + { + "hash": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "time": 1429011077, + "block_seq": 26, + "src_tx": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938, + "calculated_hours": 575058 + }, + { + "hash": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 717 + }, + { + "hash": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "time": 1428991635, + "block_seq": 24, + "src_tx": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "time": 1428990135, + "block_seq": 20, + "src_tx": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "time": 1428990115, + "block_seq": 19, + "src_tx": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1529 + }, + { + "hash": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0, + "calculated_hours": 2294 + }, + { + "hash": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "time": 1428807711, + "block_seq": 9, + "src_tx": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "time": 1428807691, + "block_seq": 8, + "src_tx": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "time": 1428807671, + "block_seq": 7, + "src_tx": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [ + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "incoming_outputs": [ + { + "hash": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "time": 1431574528, + "block_seq": 180, + "src_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263, + "calculated_hours": 5716263 + }, + { + "hash": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "time": 1431574528, + "block_seq": 180, + "src_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263, + "calculated_hours": 5716263 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/pending-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/pending-transactions.golden new file mode 100644 index 00000000..27c07b45 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/pending-transactions.golden @@ -0,0 +1,34 @@ +[ + { + "transaction": { + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + }, + "received": "2018-08-30T14:00:20.406949Z", + "checked": "2018-08-30T14:00:20.406949Z", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-150-include-distribution.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-150-include-distribution.golden new file mode 100644 index 00000000..a13a4671 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-150-include-distribution.golden @@ -0,0 +1,754 @@ +{ + "richlist": [ + { + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "locked": false + }, + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + }, + { + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "3000.000000", + "locked": false + }, + { + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "2000.000000", + "locked": false + }, + { + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "2000.000000", + "locked": false + }, + { + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "2000.000000", + "locked": false + }, + { + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "2000.000000", + "locked": false + }, + { + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "2000.000000", + "locked": false + }, + { + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1500.000000", + "locked": false + }, + { + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "1290.000000", + "locked": false + }, + { + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1100.000000", + "locked": false + }, + { + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1100.000000", + "locked": false + }, + { + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1100.000000", + "locked": false + }, + { + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1010.000000", + "locked": false + }, + { + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1002.000000", + "locked": false + }, + { + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "locked": false + }, + { + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "locked": false + }, + { + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "locked": false + }, + { + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "locked": false + }, + { + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "110.000000", + "locked": false + }, + { + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "locked": false + }, + { + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "100.000000", + "locked": false + }, + { + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "locked": false + }, + { + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "locked": false + }, + { + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-8.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-8.golden new file mode 100644 index 00000000..7aade80e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-8.golden @@ -0,0 +1,44 @@ +{ + "richlist": [ + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all-include-distribution.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all-include-distribution.golden new file mode 100644 index 00000000..01bf8a1e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all-include-distribution.golden @@ -0,0 +1,779 @@ +{ + "richlist": [ + { + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "locked": false + }, + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + }, + { + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "3000.000000", + "locked": false + }, + { + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "2000.000000", + "locked": false + }, + { + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "2000.000000", + "locked": false + }, + { + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "2000.000000", + "locked": false + }, + { + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "2000.000000", + "locked": false + }, + { + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "2000.000000", + "locked": false + }, + { + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1500.000000", + "locked": false + }, + { + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "1290.000000", + "locked": false + }, + { + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1100.000000", + "locked": false + }, + { + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1100.000000", + "locked": false + }, + { + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1100.000000", + "locked": false + }, + { + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1010.000000", + "locked": false + }, + { + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1002.000000", + "locked": false + }, + { + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "locked": false + }, + { + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "locked": false + }, + { + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "locked": false + }, + { + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "locked": false + }, + { + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "110.000000", + "locked": false + }, + { + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "locked": false + }, + { + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "100.000000", + "locked": false + }, + { + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "locked": false + }, + { + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "locked": false + }, + { + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "locked": false + }, + { + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "locked": false + }, + { + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "locked": false + }, + { + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "locked": false + }, + { + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "locked": false + }, + { + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all.golden new file mode 100644 index 00000000..8db70a9b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all.golden @@ -0,0 +1,279 @@ +{ + "richlist": [ + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + }, + { + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "3000.000000", + "locked": false + }, + { + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "2000.000000", + "locked": false + }, + { + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "2000.000000", + "locked": false + }, + { + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "2000.000000", + "locked": false + }, + { + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "2000.000000", + "locked": false + }, + { + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "2000.000000", + "locked": false + }, + { + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1500.000000", + "locked": false + }, + { + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "1290.000000", + "locked": false + }, + { + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1100.000000", + "locked": false + }, + { + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1100.000000", + "locked": false + }, + { + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1100.000000", + "locked": false + }, + { + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1010.000000", + "locked": false + }, + { + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1002.000000", + "locked": false + }, + { + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "locked": false + }, + { + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "locked": false + }, + { + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "locked": false + }, + { + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "locked": false + }, + { + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "110.000000", + "locked": false + }, + { + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "locked": false + }, + { + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "100.000000", + "locked": false + }, + { + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "locked": false + }, + { + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "locked": false + }, + { + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "locked": false + }, + { + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "locked": false + }, + { + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "locked": false + }, + { + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "locked": false + }, + { + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "locked": false + }, + { + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-default.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-default.golden new file mode 100644 index 00000000..2c6b03a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-default.golden @@ -0,0 +1,104 @@ +{ + "richlist": [ + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions-verbose.golden new file mode 100644 index 00000000..e2776cc3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions-verbose.golden @@ -0,0 +1,262 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "fee": 2326, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964, + "calculated_hours": 3100 + } + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "fee": 184620, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387, + "calculated_hours": 72454 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601, + "calculated_hours": 173704 + } + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "fee": 3366, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "owner": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846, + "calculated_hours": 3846 + } + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions.golden new file mode 100644 index 00000000..ea3846f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions.golden @@ -0,0 +1,214 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-101.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-101.golden new file mode 100644 index 00000000..23ef8dc1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-101.golden @@ -0,0 +1,30 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-517.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-517.golden new file mode 100644 index 00000000..f4f87764 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-517.golden @@ -0,0 +1,38 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 517 + }, + "time": 1479100522, + "txn": { + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "timestamp": 1479100522, + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "inputs": [ + "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91" + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-101.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-101.golden new file mode 100644 index 00000000..6c074e02 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-101.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "encoded_transaction": "b70000000045da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d060100000009bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001010000006002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f401000000003be2537f8c0893fddcddc878518f38ea493d949e004e534906000000f991010000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-105.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-105.golden new file mode 100644 index 00000000..1a531fff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-105.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "encoded_transaction": "dc00000000614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba01000000bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00010000001e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc9680200000000bb202804300d62db2fcfae5ee720eeb28493e3f800e9852b0600000045070000000000000083fb4cc7a3ee6548f47b5967e2c48bc74e3b2ff400e1f505000000004507000000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded.golden new file mode 100644 index 00000000..087063a9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 517 + }, + "time": 1479100522, + "encoded_transaction": "3d010000005d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a02000000464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f6001155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c910102000000782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db910200000000d48d9376d63dc1a1e97d6ae0abcb3bb05d3bbedb80457c3b00000000f2c603000000000000e48181af6ff468288eb5e4f550549a2d73c0e79940420f0000000000f2c6030000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-encoded.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-encoded.golden new file mode 100644 index 00000000..444c33a9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-encoded.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "encoded_transaction": "dc00000000f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124010000003981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f320001000000fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f2002000000003be2537f8c0893fddcddc878518f38ea493d949e008988068d0000002739570000000000009037ff169fbec6db95e2537e4ff79396c050aeeb00e40b54020000002739570000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-verbose.golden new file mode 100644 index 00000000..7ee325f5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-verbose.golden @@ -0,0 +1,43 @@ +{ + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed.golden new file mode 100644 index 00000000..0462adc0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed.golden @@ -0,0 +1,36 @@ +{ + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-101.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-101.golden new file mode 100644 index 00000000..81f2b7e0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-101.golden @@ -0,0 +1,37 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-517.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-517.golden new file mode 100644 index 00000000..7844d294 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-517.golden @@ -0,0 +1,51 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 517 + }, + "time": 1479100522, + "txn": { + "timestamp": 1479100522, + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "fee": 1485232, + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "inputs": [ + { + "uxid": "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "owner": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 230999, + "calculated_hours": 1718944 + }, + { + "uxid": "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91", + "owner": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "1.000000", + "hours": 259874, + "calculated_hours": 261364 + } + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions-verbose.golden new file mode 100644 index 00000000..579478b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions-verbose.golden @@ -0,0 +1,125 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions.golden new file mode 100644 index 00000000..5c8fc9db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions.golden @@ -0,0 +1,104 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-addr.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-addr.golden new file mode 100644 index 00000000..c9d35960 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-addr.golden @@ -0,0 +1,13 @@ +[ + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "src_block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "owner_address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": 1000000000000, + "hours": 1, + "spent_block_seq": 0, + "spent_tx": "0000000000000000000000000000000000000000000000000000000000000000" + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-noaddr.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-noaddr.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-noaddr.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-spent.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-spent.golden new file mode 100644 index 00000000..4ed814e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-spent.golden @@ -0,0 +1,11 @@ +{ + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "src_block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "owner_address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": 615700000000, + "hours": 5521648, + "spent_block_seq": 181, + "spent_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout.golden new file mode 100644 index 00000000..b45c139b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout.golden @@ -0,0 +1,11 @@ +{ + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "src_block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "owner_address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": 615700000000, + "hours": 5521648, + "spent_block_seq": 0, + "spent_tx": "0000000000000000000000000000000000000000000000000000000000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verbose-pending-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verbose-pending-transactions.golden new file mode 100644 index 00000000..cf18807c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verbose-pending-transactions.golden @@ -0,0 +1,41 @@ +[ + { + "transaction": { + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + }, + "received": "2018-08-30T14:00:20.406949Z", + "checked": "2018-08-30T14:00:20.406949Z", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-address.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-address.golden new file mode 100644 index 00000000..268bb847 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-address.golden @@ -0,0 +1,3 @@ +{ + "version": 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden new file mode 100644 index 00000000..27233b52 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden @@ -0,0 +1,40 @@ +{ + "unsigned": false, + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "de977ea93c0090ebe6e0c2dea002ffaf4fc314d08d06534120d96b96cc0042ce", + "inner_hash": "c30ba73f9422e909c601777ace12c777db329e06875cc6b29383bac3766acdc7", + "fee": "188772", + "sigs": [ + "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + ], + "inputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": "377543", + "calculated_hours": "377543", + "timestamp": 1431574528, + "block": 180, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + } + ], + "outputs": [ + { + "uxid": "4ac148c444b86560bde4005fcf5d9f53ae18226b35a60911ab777dfe00e4cb89", + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "0.001000", + "hours": "10" + }, + { + "uxid": "a7369917d622df48d8f205e0935144a825df4d8318d82c8bd9492ab3ee11f102", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22099.999000", + "hours": "188761" + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-empty.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-empty.golden new file mode 100644 index 00000000..11d34b1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-empty.golden @@ -0,0 +1,14 @@ +{ + "unsigned": true, + "confirmed": false, + "transaction": { + "length": 0, + "type": 0, + "txid": "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": "0", + "sigs": [], + "inputs": [], + "outputs": [] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-bip44.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-bip44.golden new file mode 100644 index 00000000..797f638e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-bip44.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "2VPNXUuSueeGUts8amEpa5McXeuzrReZzkU": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-deterministic.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-deterministic.golden new file mode 100644 index 00000000..3b861459 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-deterministic.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "27nAhbBjHLcvD3UdbrH1YouKWYwmG94K9cw": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-xpub.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-xpub.golden new file mode 100644 index 00000000..1f5789a1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-xpub.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "ZkExZ2bprtVVgXgYN5Rg8jHrse1LUtDQKF": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions-verbose.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions-verbose.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions-verbose.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions-verbose.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions-verbose.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions-verbose.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/transactions_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/transactions_test.go new file mode 100644 index 00000000..88c9f263 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/transactions_test.go @@ -0,0 +1,2172 @@ +package integration_test + +import ( + "errors" + "fmt" + "math" + "math/rand" + "net/http" + "os" + "sort" + "strconv" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func TestStableInjectTransaction(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + txn coin.Transaction + code int + err string + }{ + { + name: "database is read only", + txn: coin.Transaction{}, + code: http.StatusInternalServerError, + err: "500 Internal Server Error - database is in read-only mode", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + result, err := c.InjectTransaction(&tc.txn) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + // Result should be a valid txid + require.NotEmpty(t, result) + h, err := cipher.SHA256FromHex(result) + require.NoError(t, err) + require.NotEqual(t, cipher.SHA256{}, h) + }) + } +} + +func TestLiveInjectTransactionDisableNetworking(t *testing.T) { + if !doLive(t) { + return + } + + if !liveDisableNetworking(t) { + t.Skip("Networking must be disabled for this test") + return + } + + requireWalletEnv(t) + + c := newClient() + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + defaultChangeAddress := w.GetEntryAt(0).Address.String() + + type testCase struct { + name string + createTxnReq api.WalletCreateTransactionRequest + err string + code int + } + + cases := []testCase{ + { + name: "valid request, networking disabled", + err: "503 Service Unavailable - Outgoing connections are disabled", + code: http.StatusServiceUnavailable, + createTxnReq: api.WalletCreateTransactionRequest{ + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: fmt.Sprint(totalHours / 2), + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResp, err := c.WalletCreateTransaction(tc.createTxnReq) + require.NoError(t, err) + + txid, err := c.InjectEncodedTransaction(txnResp.EncodedTransaction) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + + // A second injection will fail with the same error, + // since the transaction should not be saved to the DB + _, err = c.InjectEncodedTransaction(txnResp.EncodedTransaction) + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NotEmpty(t, txid) + require.Equal(t, txnResp.Transaction.TxID, txid) + + h, err := cipher.SHA256FromHex(txid) + require.NoError(t, err) + require.NotEqual(t, cipher.SHA256{}, h) + }) + } +} + +func TestLiveInjectTransactionEnableNetworking(t *testing.T) { + if !doLive(t) { + return + } + + if liveDisableNetworking(t) { + t.Skip("This tests requires networking enabled") + return + } + + requireWalletEnv(t) + + c := newClient() + w, totalCoins, _, password := prepareAndCheckWallet(t, c, 2e6, 2) + + defaultChangeAddress := w.GetEntryAt(0).Address.String() + + // prepareTxnFunc prepares a valid transaction + prepareTxnFunc := func(t *testing.T, toAddr string, coins uint64, shareFactor string) (coin.Transaction, *api.CreateTransactionResponse) { + createTxnReq := api.WalletCreateTransactionRequest{ + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: shareFactor, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + // Address: w.GetEntryAt(1).Address.String(), + Address: toAddr, + Coins: toDropletString(t, coins), + }, + }, + }, + } + + txnResp, err := c.WalletCreateTransaction(createTxnReq) + require.NoError(t, err) + + txn, err := coin.DeserializeTransactionHex(txnResp.EncodedTransaction) + require.NoError(t, err) + return txn, txnResp + } + + reSignTxnFunc := func(t *testing.T, txn coin.Transaction, txnRsp *api.CreateTransactionResponse, wlt wallet.Wallet) coin.Transaction { + walletPassword := os.Getenv("WALLET_PASSWORD") + err := wallet.GuardView(wlt, []byte(walletPassword), func(unlockWlt wallet.Wallet) error { + keyMap := make(map[string]cipher.SecKey, unlockWlt.EntriesLen()) + for _, e := range unlockWlt.GetEntries() { + addr := cipher.MustAddressFromSecKey(e.Secret) + keyMap[addr.String()] = e.Secret + } + + // Get seckeys in wallet of input addresses + keys := make([]cipher.SecKey, len(txnRsp.Transaction.In)) + for i, in := range txnRsp.Transaction.In { + k, ok := keyMap[in.Address] + if !ok { + t.Fatal("seckey does not exist") + return errors.New("seckey does not exist") + } + keys[i] = k + } + // clear the old signatures + txn.Sigs = []cipher.Sig{} + txn.SignInputs(keys) + return nil + }) + require.NoError(t, err) + return txn + } + + tt := []struct { + name string + createTxn func(t *testing.T) *coin.Transaction + code int + err string + checkTxn func(t *testing.T, tx *readable.TransactionWithStatus) + }{ + { + name: "send all coins to the first address", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + return &txn + }, + checkTxn: func(t *testing.T, tx *readable.TransactionWithStatus) { + // Confirms the total output coins are equal to the totalCoins + var coins uint64 + for _, o := range tx.Transaction.Out { + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + coins, err = mathutil.AddUint64(coins, c) + require.NoError(t, err) + } + + // Confirms the address balance are equal to the totalCoins + coins, _ = getAddressBalance(t, c, w.GetEntryAt(0).Address.String()) + require.Equal(t, totalCoins, coins) + }, + code: http.StatusOK, + }, + { + // send 0.003 coin to the second address, + // this amount is chosen to not interfere with TestLiveWalletCreateTransaction + name: "send 0.003 coin to second address", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(1).Address.String(), 3e3, "0.5") + return &txn + }, + checkTxn: func(t *testing.T, tx *readable.TransactionWithStatus) { + // Confirms there're two outputs, one to the second address, one as change output to the first address. + require.Len(t, tx.Transaction.Out, 2) + + // Gets the output of the second address in the transaction + getAddrOutputInTxn := func(t *testing.T, tx *readable.TransactionWithStatus, addr string) *readable.TransactionOutput { + for _, output := range tx.Transaction.Out { + if output.Address == addr { + return &output + } + } + t.Fatalf("transaction doesn't have output to address: %v", addr) + return nil + } + + out := getAddrOutputInTxn(t, tx, w.GetEntryAt(1).Address.String()) + + // Confirms the second address has 0.003 coin + require.Equal(t, out.Coins, "0.003000") + require.Equal(t, out.Address, w.GetEntryAt(1).Address.String()) + + coin, err := droplet.FromString(out.Coins) + require.NoError(t, err) + + // Gets the expected change coins + expectChangeCoins := totalCoins - coin + + // Gets the real change coins + changeOut := getAddrOutputInTxn(t, tx, w.GetEntryAt(0).Address.String()) + changeCoins, err := droplet.FromString(changeOut.Coins) + require.NoError(t, err) + // Confirms the change coins are matched. + require.Equal(t, expectChangeCoins, changeCoins) + }, + code: http.StatusOK, + }, + { + name: "send to null address", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + + // set the transaction output address as null + txn.Out[0].Address = cipher.Address{} + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates user constraint: Transaction output is sent to the null address", + }, + { + // Use an input from block 1024: 2f842b0fbf5ef2dd59c8b5127795f1e88bfa6b510a41c62eac28fc2006d279e3 + name: "double spend", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + + hash, err := cipher.SHA256FromHex("2f842b0fbf5ef2dd59c8b5127795f1e88bfa6b510a41c62eac28fc2006d279e3") + require.NoError(t, err) + txn.In[0] = hash + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: unspent output of 2f842b0fbf5ef2dd59c8b5127795f1e88bfa6b510a41c62eac28fc2006d279e3 does not exist", + }, + { + name: "output hours overflow", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(1).Address.String(), 1e6, "1") + + // set one output hours as math.MaxUint64 + txn.Out[0].Hours = math.MaxUint64 - 1 + txn.Out[1].Hours = 100 + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Transaction output hours overflow", + }, + { + name: "no inputs", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + + txn.In = []cipher.SHA256{} + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: No inputs", + }, + { + name: "no outputs", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + + txn.Out = []coin.TransactionOutput{} + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: No outputs", + }, + { + name: "invalid number of signatures", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Sigs = []cipher.Sig{} + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Invalid number of signatures", + }, + { + name: "duplicate spend", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Make duplicate inputs + txn.In = append(txn.In, txn.In[0]) + // Make duplicate sigs + txn.Sigs = append(txn.Sigs, txn.Sigs[0]) + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Duplicate spend", + }, + { + name: "transaction type invalid", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Type = 1 + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: transaction type invalid", + }, + { + name: "zero coin output", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Out[0].Coins = 0 + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Zero coin output", + }, + { + name: "output coins overflow", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), 1e6, "1") + txn.Out[0].Coins = math.MaxUint64 - 1 + txn.Out[1].Coins = 2 + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Output coins overflow", + }, + { + name: "incorrect transaction length", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Length = 1 + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Incorrect transaction length", + }, + { + name: "duplicate output", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Out = append(txn.Out, txn.Out[0]) + txn.InnerHash = txn.HashInner() + size, _, err := txn.SizeHash() + require.NoError(t, err) + txn.Length = size + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Duplicate output in transaction", + }, + { + name: "inner hash does not match", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.InnerHash = testutil.RandSHA256(t) + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: InnerHash does not match computed hash", + }, + { + name: "unsigned input", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Sigs[0] = cipher.Sig{} + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Unsigned input in transaction", + }, + { + name: "invalid sig", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Sigs[0] = testutil.RandSig(t) + + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Failed to recover pubkey from signature", + }, + { + name: "signature not valid for output being spent", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Use a wrong private key to sign txn.In[0] and change txn.Sigs[0] + _, seckey := cipher.GenerateKeyPair() + h := cipher.AddSHA256(txn.InnerHash, txn.In[0]) + txn.Sigs[0] = cipher.MustSignHash(h, seckey) + + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Signature not valid for output being spent", + }, + { + name: "insufficient coins", + createTxn: func(t *testing.T) *coin.Transaction { + txn, txnRsp := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Make output coins > input coins + txn.Out[0].Coins = txn.Out[0].Coins + 1 + txn.InnerHash = txn.HashInner() + // Sign txn again as the inner hash is changed + txn = reSignTxnFunc(t, txn, txnRsp, w) + + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Insufficient coins", + }, + { + name: "transaction may not destry coins", + createTxn: func(t *testing.T) *coin.Transaction { + txn, txnRsp := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Make output coins < input coins + txn.Out[0].Coins = txn.Out[0].Coins - 1 + txn.InnerHash = txn.HashInner() + // Sign the txn again as the inner hash is changed + txn = reSignTxnFunc(t, txn, txnRsp, w) + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Transactions may not destroy coins", + }, + { + name: "insufficient coin hours", + createTxn: func(t *testing.T) *coin.Transaction { + txn, txnRsp := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Make up more output coin hours + txn.Out[0].Hours = txn.Out[0].Hours + 1e6 + // Recalculate inner hash + txn.InnerHash = txn.HashInner() + // Sign the txn again + txn = reSignTxnFunc(t, txn, txnRsp, w) + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Insufficient coin hours", + }, + { + name: "invalid amount, too many decimal places", + createTxn: func(t *testing.T) *coin.Transaction { + // Make a txn with txn.Out[0].Coins equal 1e3, as we have at least 2e6 coins + // so there will have at least two outputs. + txn, txnRsp := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), 1e3, "1") + // Make txn.Out[0].Coins too many decimal places + txn.Out[0].Coins = 5e2 + // Move the remaining 5e2 from the first output to the second output, so that + // we won't lose coins + txn.Out[1].Coins = txn.Out[1].Coins + 5e2 + txn.InnerHash = txn.HashInner() + + txn = reSignTxnFunc(t, txn, txnRsp, w) + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates soft constraint: invalid amount, too many decimal places", + }, + } + // TODO: + // The following test cases can not be added here, as we cannot use the big size + // transaction is not allowed in encoder/decoder, which will fail the test + // in building transaction step. + // + // 1. Make up a txn which exceeds max block size to violate the soft constraint + // 2. Make up a transaction that can exceed max block size + // expected err: "400 Bad Request - Transaction violates hard constraint: Transaction size bigger than max block size" + // 3. Make up a transaction that has inputs/outputs exceed max + // expected err: + // - "400 Bad Request - Transaction violates hard constraint: Too many signatures and inputs" + // - "400 Bad Request - Transaction violates hard constraint: Too many outputs" + // TODO: + // 1. Add test case to inject transaction who has inputs locked. + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + txn := tc.createTxn(t) + txid, err := c.InjectTransaction(txn) + if tc.code != http.StatusOK { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + require.Equal(t, txn.Hash().Hex(), txid) + + tk := time.NewTicker(time.Second) + var txnStatus *readable.TransactionWithStatus + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Waiting for transaction to be confirmed timeout") + case <-tk.C: + txnStatus = getTransaction(t, c, txn.Hash().Hex()) + if txnStatus.Status.Confirmed { + break loop + } + } + } + tc.checkTxn(t, txnStatus) + }) + } + + // Test to inject invalid rawtx + _, err := c.InjectEncodedTransaction("invalidrawtx") + assertResponseError(t, err, 400, "400 Bad Request - Transaction violates user constraint: Transaction output is sent to the null address") + +} + +func TestLiveWalletSignTransaction(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + + w, _, _, password := prepareAndCheckWallet(t, c, 2e6, 20) + + // Fetch outputs held by the wallet + addrs := make([]string, w.EntriesLen()) + for i, e := range w.GetEntries() { + addrs[i] = e.SkycoinAddress().String() + } + + summary, err := c.OutputsForAddresses(addrs) + require.NoError(t, err) + // Abort if the transaction is spending summary + require.Empty(t, summary.OutgoingOutputs) + // Need at least 2 summary for the created transaction + require.True(t, len(summary.HeadOutputs) > 1) + + // Use the first two outputs for a transaction + headOutputs := summary.HeadOutputs[:2] + outputs, err := headOutputs.ToUxArray() + require.NoError(t, err) + totalCoins, err := outputs.Coins() + require.NoError(t, err) + totalCoinsStr, err := droplet.ToString(totalCoins) + require.NoError(t, err) + + uxOutHashes := make([]string, len(outputs)) + for i, o := range outputs { + uxOutHashes[i] = o.Hash().Hex() + } + + // Create an unsigned transaction using two inputs + // Ensure at least 2 inputs + // Specify outputs in the request to create txn + // Specify unsigned in the request to create txn + txnResp, err := c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + Unsigned: true, + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + UxOuts: uxOutHashes, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).SkycoinAddress().String(), + Coins: totalCoinsStr, + }, + }, + }, + }) + require.NoError(t, err) + + // Create an invalid txn with an extra null sig + invalidTxn := coin.MustDeserializeTransactionHex(txnResp.EncodedTransaction) + invalidTxn.Sigs = append(invalidTxn.Sigs, cipher.Sig{}) + require.NotEqual(t, len(invalidTxn.In), len(invalidTxn.Sigs)) + + type testCase struct { + name string + req api.WalletSignTransactionRequest + fullySigned bool + err string + code int + } + + cases := []testCase{ + { + name: "sign one input", + req: api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + SignIndexes: []int{1}, + EncodedTransaction: txnResp.EncodedTransaction, + }, + fullySigned: false, + }, + + { + name: "sign all inputs", + req: api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + SignIndexes: nil, + EncodedTransaction: txnResp.EncodedTransaction, + }, + fullySigned: true, + }, + + { + name: "sign invalid txn", + req: api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + SignIndexes: nil, + EncodedTransaction: invalidTxn.MustSerializeHex(), + }, + code: http.StatusBadRequest, + err: "Transaction violates hard constraint: Invalid number of signatures", + }, + } + + doTest := func(tc testCase) { + t.Run(tc.name, func(t *testing.T) { + resp, err := c.WalletSignTransaction(tc.req) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + txn, err := coin.DeserializeTransactionHex(tc.req.EncodedTransaction) + require.NoError(t, err) + + // TxID should have changed + require.NotEqual(t, txn.Hash(), resp.Transaction.TxID) + // Length, InnerHash should not have changed + require.Equal(t, txn.Length, resp.Transaction.Length) + require.Equal(t, txn.InnerHash.Hex(), resp.Transaction.InnerHash) + + _, err = c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: resp.EncodedTransaction, + Unsigned: false, + }) + if tc.fullySigned { + require.NoError(t, err) + } else { + testutil.RequireError(t, err, "Transaction violates hard constraint: Unsigned input in transaction") + } + + _, err = c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: resp.EncodedTransaction, + Unsigned: true, + }) + if tc.fullySigned { + testutil.RequireError(t, err, "Transaction violates hard constraint: Unsigned transaction must contain a null signature") + } else { + require.NoError(t, err) + } + }) + } + + for _, tc := range cases { + doTest(tc) + } + + // Create a partially signed transaction then sign the remainder of it + resp, err := c.WalletSignTransaction(api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + SignIndexes: []int{1}, + EncodedTransaction: txnResp.EncodedTransaction, + }) + require.NoError(t, err) + + doTest(testCase{ + name: "sign partially signed transaction", + req: api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + EncodedTransaction: resp.EncodedTransaction, + }, + fullySigned: true, + }) +} + +func toDropletString(t *testing.T, i uint64) string { + x, err := droplet.ToString(i) + require.NoError(t, err) + return x +} + +func TestStableCreateTransaction(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + unknownHash := testutil.RandSHA256(t).Hex() + + cases := []struct { + name string + req api.CreateTransactionRequest + err string + code int + }{ + { + name: "invalid no uxouts for addresses", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: []string{testutil.MakeAddress().String()}, + To: []api.Receiver{ + { + Address: testutil.MakeAddress().String(), + Coins: "1.000000", + Hours: "100", + }, + }, + }, + code: http.StatusBadRequest, + err: "no unspents to spend", + }, + + { + name: "invalid uxouts do not exist", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + UxOuts: []string{unknownHash}, + To: []api.Receiver{ + { + Address: testutil.MakeAddress().String(), + Coins: "1.000000", + Hours: "100", + }, + }, + }, + code: http.StatusBadRequest, + err: fmt.Sprintf("unspent output of %s does not exist", unknownHash), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.NotEmpty(t, tc.err) + _, err := c.CreateTransaction(tc.req) + assertResponseError(t, err, tc.code, tc.err) + }) + } +} + +type liveCreateTxnTestCase struct { + name string + req api.CreateTransactionRequest + outputs []coin.TransactionOutput + outputsSubset []coin.TransactionOutput + err string + code int + ignoreHours bool + additionalRespVerify func(t *testing.T, r *api.CreateTransactionResponse) +} + +func makeLiveCreateTxnTestCases(t *testing.T, w wallet.Wallet, totalCoins, totalHours uint64) []liveCreateTxnTestCase { + remainingHours := fee.RemainingHours(totalHours, params.UserVerifyTxn.BurnFactor) + require.True(t, remainingHours > 1) + unknownOutput := testutil.RandSHA256(t) + defaultChangeAddress := w.GetEntryAt(0).Address.String() + + // Get all outputs + c := newClient() + outputs, err := c.Outputs() + require.NoError(t, err) + + // Split outputs into those held by the wallet and those not + addresses := make([]string, w.EntriesLen()) + addressMap := make(map[string]struct{}, w.EntriesLen()) + for i, e := range w.GetEntries() { + addresses[i] = e.Address.String() + addressMap[e.Address.String()] = struct{}{} + } + + var walletOutputHashes []string + var walletOutputs readable.UnspentOutputs + walletAuxs := make(map[string][]string) + for _, o := range outputs.HeadOutputs { + if _, ok := addressMap[o.Address]; ok { + walletOutputs = append(walletOutputs, o) + walletOutputHashes = append(walletOutputHashes, o.Hash) + walletAuxs[o.Address] = append(walletAuxs[o.Address], o.Hash) + } + } + + require.NotEmpty(t, walletOutputs) + + return []liveCreateTxnTestCase{ + { + name: "invalid decimals", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "0.0001", + Hours: "1", + }, + }, + }, + err: "to[0].coins has too many decimal places", + code: http.StatusBadRequest, + }, + + { + name: "overflowing hours", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "0.001", + Hours: "1", + }, + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "0.001", + Hours: fmt.Sprint(uint64(math.MaxUint64)), + }, + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "0.001", + Hours: fmt.Sprint(uint64(math.MaxUint64) - 1), + }, + }, + }, + err: "total output hours error: uint64 addition overflow", + code: http.StatusBadRequest, + }, + + { + name: "insufficient coins", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: fmt.Sprint(totalCoins + 1), + Hours: "1", + }, + }, + }, + err: "balance is not sufficient", + code: http.StatusBadRequest, + }, + + { + name: "insufficient hours", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: fmt.Sprint(totalHours + 1), + }, + }, + }, + err: "hours are not sufficient", + code: http.StatusBadRequest, + }, + + { + // NOTE: this test will fail if "totalCoins - 1e3" does not require + // all of the outputs to be spent, e.g. if there is an output with + // "totalCoins - 1e3" coins in it. + // TODO -- Check that the wallet does not have an output of 0.001, + // because then this test cannot be performed, since there is no + // way to use all outputs and produce change in that case. + name: "valid request, manual one output with change, spend all", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + + { + // NOTE: this test will fail if "totalCoins - 1e3" does not require + // all of the outputs to be spent, e.g. if there is an output with + // "totalCoins - 1e3" coins in it. + // TODO -- Check that the wallet does not have an output of 0.001, + // because then this test cannot be performed, since there is no + // way to use all outputs and produce change in that case. + name: "valid request, manual one output with change, spend all, unspecified change address", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + // Address omitted -- will be checked later in the test body + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + + { + name: "valid request, manual one output with change, don't spend all", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, 1e3), + Hours: "1", + }, + }, + }, + outputsSubset: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: 1e3, + Hours: 1, + }, + // NOTE: change omitted, + // change is too difficult to predict in this case, we are + // just checking that not all uxouts get spent in the transaction + }, + }, + + { + name: "valid request, manual one output no change", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins, + Hours: 1, + }, + }, + }, + + { + // NOTE: no reliable way to test the ignore unconfirmed behavior, + // this test only checks that if IgnoreUnconfirmed is specified, + // the API doesn't throw up some parsing error + name: "valid request, manual one output no change, ignore unconfirmed", + req: api.CreateTransactionRequest{ + IgnoreUnconfirmed: true, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins, + Hours: 1, + }, + }, + }, + + { + name: "valid request, auto one output no change, share factor recalculates to 1.0", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins, + Hours: remainingHours, + }, + }, + }, + + { + name: "valid request, auto two outputs with change", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, 1e3), + }, + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-2e3), + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: 1e3, + }, + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 2e3, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + }, + }, + ignoreHours: true, // the hours are too unpredictable + }, + + { + name: "uxout does not exist", + req: api.CreateTransactionRequest{ + UxOuts: []string{unknownOutput.Hex()}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: "1", + }, + }, + }, + err: fmt.Sprintf("unspent output of %s does not exist", unknownOutput.Hex()), + code: http.StatusBadRequest, + }, + + { + name: "insufficient balance with uxouts", + req: api.CreateTransactionRequest{ + UxOuts: []string{walletOutputs[0].Hash}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins+1e3), + Hours: "1", + }, + }, + }, + err: "balance is not sufficient", + code: http.StatusBadRequest, + }, + + { + // NOTE: expects wallet to have multiple outputs with non-zero coins + name: "insufficient hours with uxouts", + req: api.CreateTransactionRequest{ + UxOuts: []string{walletOutputs[0].Hash}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, 1e3), + Hours: fmt.Sprint(totalHours + 1), + }, + }, + }, + err: "hours are not sufficient", + code: http.StatusBadRequest, + }, + + { + name: "valid request, uxouts specified", + req: api.CreateTransactionRequest{ + // NOTE: all uxouts are provided, which has the same behavior as + // not providing any uxouts or addresses. + // Using a subset of uxouts makes the wallet setup very + // difficult, especially to make deterministic, in the live test + // More complex cases should be covered by unit tests + UxOuts: walletOutputHashes, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + additionalRespVerify: func(t *testing.T, r *api.CreateTransactionResponse) { + require.Equal(t, len(walletOutputHashes), len(r.Transaction.In)) + }, + }, + + { + name: "valid request, addresses specified", + req: api.CreateTransactionRequest{ + // NOTE: all addresses are provided, which has the same behavior as + // not providing any addresses. + // Using a subset of addresses makes the wallet setup very + // difficult, especially to make deterministic, in the live test + // More complex cases should be covered by unit tests + Addresses: addresses, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + } +} + +func TestLiveCreateTransaction(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + + w, totalCoins, totalHours, _ := prepareAndCheckWallet(t, c, 2e6, 20) + + cases := makeLiveCreateTxnTestCases(t, w, totalCoins, totalHours) + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, len(tc.outputs) != 0 && len(tc.outputsSubset) != 0, "outputs and outputsSubset can't both be set") + + result, err := c.CreateTransaction(tc.req) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + assertCreateTransactionResult(t, c, tc, result, true, nil) + }) + } +} + +func TestLiveWalletCreateTransactionSpecificUnsigned(t *testing.T) { + testLiveWalletCreateTransactionSpecific(t, true) +} + +func TestLiveWalletCreateTransactionSpecificSigned(t *testing.T) { + testLiveWalletCreateTransactionSpecific(t, false) +} + +func testLiveWalletCreateTransactionSpecific(t *testing.T, unsigned bool) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + remainingHours := fee.RemainingHours(totalHours, params.UserVerifyTxn.BurnFactor) + require.True(t, remainingHours > 1) + + // Split outputs into those held by the wallet and those not + addresses := make([]string, w.EntriesLen()) + addressMap := make(map[string]struct{}, w.EntriesLen()) + for i, e := range w.GetEntries() { + addresses[i] = e.Address.String() + addressMap[e.Address.String()] = struct{}{} + } + + outputs, err := c.Outputs() + require.NoError(t, err) + + var walletOutputs readable.UnspentOutputs + walletAuxs := make(map[string][]string) + var nonWalletOutputs readable.UnspentOutputs + for _, o := range outputs.HeadOutputs { + if _, ok := addressMap[o.Address]; ok { + walletOutputs = append(walletOutputs, o) + walletAuxs[o.Address] = append(walletAuxs[o.Address], o.Hash) + } else { + nonWalletOutputs = append(nonWalletOutputs, o) + } + } + + require.NotEmpty(t, walletOutputs) + require.NotEmpty(t, nonWalletOutputs) + + defaultChangeAddress := w.GetEntryAt(0).Address.String() + + baseCases := makeLiveCreateTxnTestCases(t, w, totalCoins, totalHours) + + type liveWalletCreateTxnTestCase struct { + liveCreateTxnTestCase + password string + walletID string + } + + cases := make([]liveWalletCreateTxnTestCase, len(baseCases)) + for i, tc := range baseCases { + cases[i] = liveWalletCreateTxnTestCase{ + liveCreateTxnTestCase: tc, + walletID: w.Filename(), + password: password, + } + } + + cases = append(cases, []liveWalletCreateTxnTestCase{ + { + walletID: w.Filename(), + password: password, + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "uxout not held by the wallet", + req: api.CreateTransactionRequest{ + UxOuts: []string{nonWalletOutputs[0].Hash}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: nonWalletOutputs[0].Coins, + Hours: "1", + }, + }, + }, + err: "uxout is not owned by any address in the wallet", + code: http.StatusBadRequest, + }, + }, + + { + walletID: w.Filename(), + password: password, + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "specified addresses not in wallet", + req: api.CreateTransactionRequest{ + Addresses: []string{testutil.MakeAddress().String()}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: "1", + }, + }, + }, + err: "address not found in wallet", + code: http.StatusBadRequest, + }, + }, + + { + walletID: w.Filename(), + password: password, + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "valid request, addresses and uxouts not specified", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + }, + }...) + + if w.IsEncrypted() { + cases = append(cases, liveWalletCreateTxnTestCase{ + walletID: w.Filename(), + password: password + "foo", + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "invalid password", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "invalid password", + code: http.StatusBadRequest, + }, + }) + + cases = append(cases, liveWalletCreateTxnTestCase{ + walletID: w.Filename(), + password: "", + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "password not provided", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "missing password", + code: http.StatusBadRequest, + }, + }) + + } else { + err := "wallet is not encrypted" + if unsigned { + err = "password must not be used for unsigned transactions" + } + + cases = append(cases, liveWalletCreateTxnTestCase{ + walletID: w.Filename(), + password: password + "foo", + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "password provided for unencrypted wallet", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: err, + code: http.StatusBadRequest, + }, + }) + } + + for _, tc := range cases { + name := fmt.Sprintf("unsigned=%v %s", unsigned, tc.name) + t.Run(name, func(t *testing.T) { + require.False(t, len(tc.outputs) != 0 && len(tc.outputsSubset) != 0, "outputs and outputsSubset can't both be set") + + // Fetch a copy of the wallet to look for modifications to the wallet + // after the transaction is created + w, err := c.Wallet(tc.walletID) + require.NoError(t, err) + + req := api.WalletCreateTransactionRequest{ + CreateTransactionRequest: tc.req, + WalletID: tc.walletID, + Password: tc.password, + Unsigned: unsigned, + } + + if tc.err != "" { + tc.err = fmt.Sprintf("%d %s - %s", tc.code, http.StatusText(tc.code), tc.err) + } + + result, err := c.WalletCreateTransaction(req) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + assertCreateTransactionResult(t, c, tc.liveCreateTxnTestCase, result, unsigned, w) + }) + } +} + +func getLastChangeEntry(t *testing.T, w *api.WalletResponse) *readable.WalletEntry { + require.Equal(t, wallet.WalletTypeBip44, w.Meta.Type) + + // Find the last "change" entry + require.NotEmpty(t, w.Entries) + sort.Slice(w.Entries, func(i, j int) bool { + if *w.Entries[i].Change == *w.Entries[j].Change { + return *w.Entries[i].ChildNumber > *w.Entries[j].ChildNumber + } + return *w.Entries[i].Change > *w.Entries[j].Change + }) + + lastChangeEntry := w.Entries[0] + if *lastChangeEntry.Change != bip44.ChangeChainIndex { + // no change entry + return nil + } + + return &lastChangeEntry +} + +func isNullAddress(a string) bool { + if a == "" { + return true + } + + addr := cipher.MustDecodeBase58Address(a) + return addr.Null() +} + +func assertCreateTransactionResult(t *testing.T, c *api.Client, tc liveCreateTxnTestCase, result *api.CreateTransactionResponse, unsigned bool, w *api.WalletResponse) { + if len(tc.outputsSubset) == 0 { + require.Equal(t, len(tc.outputs), len(result.Transaction.Out)) + } + + for i, o := range tc.outputs { + coins, err := droplet.FromString(result.Transaction.Out[i].Coins) + require.NoError(t, err) + require.Equal(t, o.Coins, coins, "[%d] %d != %d", i, o.Coins, coins) + + if !tc.ignoreHours { + hours, err := strconv.ParseUint(result.Transaction.Out[i].Hours, 10, 64) + require.NoError(t, err) + require.Equal(t, o.Hours, hours, "[%d] %d != %d", i, o.Hours, hours) + } + + if o.Address.Null() { + // The final change output may not have the address specified, + // if the ChangeAddress was not specified in the wallet params. + require.Equal(t, i, len(tc.outputs)-1) + require.Nil(t, tc.req.ChangeAddress) + changeAddr := result.Transaction.Out[i].Address + require.False(t, isNullAddress(changeAddr)) + + if w != nil && w.Meta.Type == wallet.WalletTypeBip44 { + // Check that the change address was a new address generated + // from the wallet's change path + + // Get the update wallet from the API. + // Look for the last change address. + // It should match the change address that was used. + // Compare it to the previous wallet + w2, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + lastChangeEntry := getLastChangeEntry(t, w2) + + // Compare it to the initial wallet state. + // It should be a new address with an incremented child number + prevLastChangeEntry := getLastChangeEntry(t, w) + require.NotEqual(t, prevLastChangeEntry, lastChangeEntry) + if prevLastChangeEntry == nil { + require.Equal(t, uint32(0), *lastChangeEntry.ChildNumber) + } else { + require.Equal(t, *prevLastChangeEntry.ChildNumber+1, *lastChangeEntry.ChildNumber) + } + + // Make sure that the last change address in the wallet was used + require.False(t, isNullAddress(lastChangeEntry.Address)) + require.Equal(t, changeAddr, lastChangeEntry.Address) + } else { + // Check that the automatically-selected change address was one + // of the addresses for the UTXOs spent by the transaction + changeAddrFound := false + for _, x := range result.Transaction.In { + require.False(t, isNullAddress(x.Address)) + if changeAddr == x.Address { + changeAddrFound = true + break + } + } + + require.True(t, changeAddrFound) + } + } else { + require.Equal(t, o.Address.String(), result.Transaction.Out[i].Address) + } + } + + // The wallet should be unmodified if the wallet type is not bip44 + if w != nil && w.Meta.Type != wallet.WalletTypeBip44 { + w2, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, w, w2) + } + + assertEncodeTxnMatchesTxn(t, result) + assertRequestedCoins(t, tc.req.To, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + + if tc.req.HoursSelection.Type == transaction.HoursSelectionTypeManual { + assertRequestedHours(t, tc.req.To, result.Transaction.Out) + } + + if tc.additionalRespVerify != nil { + tc.additionalRespVerify(t, result) + } + + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) +} + +func TestLiveWalletCreateTransactionRandomUnsigned(t *testing.T) { + testLiveWalletCreateTransactionRandom(t, true) +} + +func TestLiveWalletCreateTransactionRandomSigned(t *testing.T) { + testLiveWalletCreateTransactionRandom(t, false) +} + +func testLiveWalletCreateTransactionRandom(t *testing.T, unsigned bool) { + if !doLive(t) { + return + } + + debug := false + tLog := func(t *testing.T, args ...interface{}) { + if debug { + t.Log(args...) + } + } + tLogf := func(t *testing.T, msg string, args ...interface{}) { + if debug { + t.Logf(msg, args...) + } + } + + requireWalletEnv(t) + + c := newClient() + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + if w.IsEncrypted() { + t.Skip("Skipping TestLiveWalletCreateTransactionRandom tests with encrypted wallet") + return + } + + remainingHours := fee.RemainingHours(totalHours, params.UserVerifyTxn.BurnFactor) + require.True(t, remainingHours > 1) + + assertTxnOutputCount := func(t *testing.T, changeAddress string, nOutputs int, result *api.CreateTransactionResponse) { + nResultOutputs := len(result.Transaction.Out) + require.True(t, nResultOutputs == nOutputs || nResultOutputs == nOutputs+1) + hasChange := nResultOutputs == nOutputs+1 + changeOutput := result.Transaction.Out[nResultOutputs-1] + if hasChange { + require.Equal(t, changeOutput.Address, changeAddress) + } + + tLog(t, "hasChange", hasChange) + if hasChange { + tLog(t, "changeCoins", changeOutput.Coins) + tLog(t, "changeHours", changeOutput.Hours) + } + } + + iterations := 250 + maxOutputs := 10 + destAddrs := make([]cipher.Address, maxOutputs) + for i := range destAddrs { + destAddrs[i] = testutil.MakeAddress() + } + + for i := 0; i < iterations; i++ { + tLog(t, "iteration", i) + tLog(t, "totalCoins", totalCoins) + tLog(t, "totalHours", totalHours) + + spendableHours := fee.RemainingHours(totalHours, params.UserVerifyTxn.BurnFactor) + tLog(t, "spendableHours", spendableHours) + + coins := rand.Intn(int(totalCoins)) + 1 + coins -= coins % int(params.UserVerifyTxn.MaxDropletDivisor()) + if coins == 0 { + coins = int(params.UserVerifyTxn.MaxDropletDivisor()) + } + hours := rand.Intn(int(spendableHours + 1)) + nOutputs := rand.Intn(maxOutputs) + 1 + + tLog(t, "sendCoins", coins) + tLog(t, "sendHours", hours) + + changeAddress := w.GetEntryAt(0).Address.String() + + shareFactor := strconv.FormatFloat(rand.Float64(), 'f', 8, 64) + + tLog(t, "shareFactor", shareFactor) + + to := make([]api.Receiver, 0, nOutputs) + remainingHours := hours + remainingCoins := coins + for i := 0; i < nOutputs; i++ { + if remainingCoins == 0 { + break + } + + receiver := api.Receiver{} + receiver.Address = destAddrs[rand.Intn(len(destAddrs))].String() + + if i == nOutputs-1 { + var err error + receiver.Coins, err = droplet.ToString(uint64(remainingCoins)) + require.NoError(t, err) + receiver.Hours = fmt.Sprint(remainingHours) + + remainingCoins = 0 + remainingHours = 0 + } else { + receiverCoins := rand.Intn(remainingCoins) + 1 + receiverCoins -= receiverCoins % int(params.UserVerifyTxn.MaxDropletDivisor()) + if receiverCoins == 0 { + receiverCoins = int(params.UserVerifyTxn.MaxDropletDivisor()) + } + + var err error + receiver.Coins, err = droplet.ToString(uint64(receiverCoins)) + require.NoError(t, err) + remainingCoins -= receiverCoins + + receiverHours := rand.Intn(remainingHours + 1) + receiver.Hours = fmt.Sprint(receiverHours) + remainingHours -= receiverHours + } + + to = append(to, receiver) + } + + // Remove duplicate outputs + dup := make(map[api.Receiver]struct{}, len(to)) + newTo := make([]api.Receiver, 0, len(dup)) + for _, o := range to { + if _, ok := dup[o]; !ok { + dup[o] = struct{}{} + newTo = append(newTo, o) + } + } + to = newTo + + nOutputs = len(to) + tLog(t, "nOutputs", nOutputs) + + rand.Shuffle(len(to), func(i, j int) { + to[i], to[j] = to[j], to[i] + }) + + for i, o := range to { + tLogf(t, "to[%d].Hours %s\n", i, o.Hours) + } + + autoTo := make([]api.Receiver, len(to)) + for i, o := range to { + autoTo[i] = api.Receiver{ + Address: o.Address, + Coins: o.Coins, + Hours: "", + } + } + + // Remove duplicate outputs + dup = make(map[api.Receiver]struct{}, len(autoTo)) + newAutoTo := make([]api.Receiver, 0, len(dup)) + for _, o := range autoTo { + if _, ok := dup[o]; !ok { + dup[o] = struct{}{} + newAutoTo = append(newAutoTo, o) + } + } + autoTo = newAutoTo + + nAutoOutputs := len(autoTo) + tLog(t, "nAutoOutputs", nAutoOutputs) + + for i, o := range autoTo { + tLogf(t, "autoTo[%d].Coins %s\n", i, o.Coins) + } + + // Auto, random share factor + + result, err := c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + WalletID: w.Filename(), + Password: password, + Unsigned: unsigned, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: shareFactor, + }, + ChangeAddress: &changeAddress, + To: autoTo, + }, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) + + // Auto, share factor 0 + + result, err = c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + WalletID: w.Filename(), + Password: password, + Unsigned: unsigned, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "0", + }, + ChangeAddress: &changeAddress, + To: autoTo, + }, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) + + // Check that the non-change outputs have 0 hours + for _, o := range result.Transaction.Out[:nAutoOutputs] { + require.Equal(t, "0", o.Hours) + } + + // Auto, share factor 1 + + result, err = c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + Unsigned: unsigned, + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "1", + }, + ChangeAddress: &changeAddress, + To: autoTo, + }, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) + + // Check that the change output has 0 hours + if len(result.Transaction.Out) > nAutoOutputs { + require.Equal(t, "0", result.Transaction.Out[nAutoOutputs].Hours) + } + + // Manual + + result, err = c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + Unsigned: unsigned, + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: to, + }, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nOutputs, result) + assertRequestedCoins(t, to, result.Transaction.Out) + assertRequestedHours(t, to, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) + } +} + +func assertEncodeTxnMatchesTxn(t *testing.T, result *api.CreateTransactionResponse) { + require.NotEmpty(t, result.EncodedTransaction) + emptyTxn := &coin.Transaction{} + require.NotEqual(t, emptyTxn.MustSerializeHex(), result.EncodedTransaction) + + txn, err := result.Transaction.ToTransaction() + require.NoError(t, err) + + require.Equal(t, txn.MustSerializeHex(), result.EncodedTransaction) + require.Equal(t, int(txn.Length), len(txn.MustSerialize())) +} + +func assertRequestedCoins(t *testing.T, to []api.Receiver, out []api.CreatedTransactionOutput) { + var requestedCoins uint64 + for _, o := range to { + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + requestedCoins += c + } + + var sentCoins uint64 + for _, o := range out[:len(to)] { // exclude change output + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + sentCoins += c + } + + require.Equal(t, requestedCoins, sentCoins) +} + +func assertRequestedHours(t *testing.T, to []api.Receiver, out []api.CreatedTransactionOutput) { + for i, o := range out[:len(to)] { // exclude change output + toHours, err := strconv.ParseUint(to[i].Hours, 10, 64) + require.NoError(t, err) + + outHours, err := strconv.ParseUint(o.Hours, 10, 64) + require.NoError(t, err) + require.Equal(t, toHours, outHours) + } +} + +func assertVerifyTransaction(t *testing.T, encodedTransaction string, unsigned bool) { + c := newClient() + _, err := c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: encodedTransaction, + Unsigned: false, + }) + if unsigned { + assertResponseError(t, err, http.StatusUnprocessableEntity, "Transaction violates hard constraint: Unsigned input in transaction") + } else { + require.NoError(t, err) + } + + _, err = c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: encodedTransaction, + Unsigned: true, + }) + if unsigned { + require.NoError(t, err) + } else { + assertResponseError(t, err, http.StatusUnprocessableEntity, "Transaction violates hard constraint: Unsigned transaction must contain a null signature") + } +} + +func assertCreatedTransactionValid(t *testing.T, r api.CreatedTransaction, unsigned bool) { + require.NotEmpty(t, r.In) + require.NotEmpty(t, r.Out) + + require.Equal(t, len(r.In), len(r.Sigs)) + if unsigned { + for _, s := range r.Sigs { + ss := cipher.MustSigFromHex(s) + require.True(t, ss.Null()) + } + } + + fee, err := strconv.ParseUint(r.Fee, 10, 64) + require.NoError(t, err) + + require.NotEqual(t, uint64(0), fee) + + var inputHours uint64 + var inputCoins uint64 + for _, in := range r.In { + require.NotNil(t, in.CalculatedHours) + calculatedHours, err := strconv.ParseUint(in.CalculatedHours, 10, 64) + require.NoError(t, err) + inputHours, err = mathutil.AddUint64(inputHours, calculatedHours) + require.NoError(t, err) + + require.NotNil(t, in.Hours) + hours, err := strconv.ParseUint(in.Hours, 10, 64) + require.NoError(t, err) + + require.True(t, hours <= calculatedHours) + + require.NotNil(t, in.Coins) + coins, err := droplet.FromString(in.Coins) + require.NoError(t, err) + inputCoins, err = mathutil.AddUint64(inputCoins, coins) + require.NoError(t, err) + } + + var outputHours uint64 + var outputCoins uint64 + for _, out := range r.Out { + hours, err := strconv.ParseUint(out.Hours, 10, 64) + require.NoError(t, err) + outputHours, err = mathutil.AddUint64(outputHours, hours) + require.NoError(t, err) + + coins, err := droplet.FromString(out.Coins) + require.NoError(t, err) + outputCoins, err = mathutil.AddUint64(outputCoins, coins) + require.NoError(t, err) + } + + require.True(t, inputHours > outputHours) + require.Equal(t, inputHours-outputHours, fee) + + require.Equal(t, inputCoins, outputCoins) + + require.Equal(t, uint8(0), r.Type) + require.NotEmpty(t, r.Length) +} + +func getTransaction(t *testing.T, c *api.Client, txid string) *readable.TransactionWithStatus { + tx, err := c.Transaction(txid) + if err != nil { + t.Fatalf("%v", err) + } + + return tx +} + +// getAddressBalance gets balance of given address. +// Returns coins and coin hours. +func getAddressBalance(t *testing.T, c *api.Client, addr string) (uint64, uint64) { //nolint:unparam + bp, err := c.Balance([]string{addr}) + if err != nil { + t.Fatalf("%v", err) + } + return bp.Confirmed.Coins, bp.Confirmed.Hours +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/wallet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/wallet_test.go new file mode 100644 index 00000000..eb3449a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/wallet_test.go @@ -0,0 +1,1159 @@ +package integration_test + +import ( + "encoding/hex" + "fmt" + "net/http" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func skipWalletIfLive(t *testing.T) bool { + skip := enabled() && mode(t) == testModeLive && !doLiveWallet(t) + if skip { + t.Skip("live wallet tests disabled") + } + return skip +} + +func TestWalletNewSeed(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + cases := []struct { + name string + entropy int + numWords int + errCode int + errMsg string + }{ + { + name: "entropy 128", + entropy: 128, + numWords: 12, + }, + { + name: "entropy 256", + entropy: 256, + numWords: 24, + }, + { + name: "entropy 100", + entropy: 100, + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - entropy length must be 128 or 256", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + seed, err := c.NewSeed(tc.entropy) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + words := strings.Split(seed, " ") + require.Len(t, words, tc.numWords) + + // no extra whitespace on the seed + require.Equal(t, seed, strings.TrimSpace(seed)) + + // should generate a different seed each time + seed2, err := c.NewSeed(tc.entropy) + require.NoError(t, err) + require.NotEqual(t, seed, seed2) + }) + } +} + +func TestCreateWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + mnemonicSeed := bip39.MustNewDefaultMnemonic() + + cases := []struct { + name string + seed string + seedPassphrase string + xpub string + walletType string + encrypted bool + }{ + { + name: "deterministic encrypted", + seed: "fooseed2", + walletType: wallet.WalletTypeDeterministic, + encrypted: true, + }, + { + name: "deterministic unencrypted", + seed: "fooseed2", + walletType: wallet.WalletTypeDeterministic, + }, + + { + name: "bip44 with seed passphrase encrypted", + seed: mnemonicSeed, + seedPassphrase: "foobar", + walletType: wallet.WalletTypeBip44, + encrypted: true, + }, + { + name: "bip44 without seed passphrase encrypted", + seed: mnemonicSeed, + seedPassphrase: "", + walletType: wallet.WalletTypeBip44, + encrypted: true, + }, + { + name: "bip44 with seed passphrase unencrypted", + seed: mnemonicSeed, + seedPassphrase: "foobar", + walletType: wallet.WalletTypeBip44, + }, + { + name: "bip44 without seed passphrase unencrypted", + seed: mnemonicSeed, + seedPassphrase: "", + walletType: wallet.WalletTypeBip44, + }, + + { + name: "xpub wallet", + xpub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + walletType: wallet.WalletTypeXPub, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + pwd := "" + if tc.encrypted { + pwd = "pwd" + } + + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + Password: pwd, + Encrypt: tc.encrypted, + XPub: tc.xpub, + }) + defer clean() + require.Equal(t, tc.encrypted, w.Meta.Encrypted) + + walletDir := getWalletDir(t, c) + + // Confirms the wallet does exist + walletPath := filepath.Join(walletDir, w.Meta.Filename) + _, err := os.Stat(walletPath) + require.NoError(t, err) + + // Loads the wallet and confirms that the wallet has the same seed + lw, err := wallet.Load(walletPath) + require.NoError(t, err) + require.Equal(t, len(w.Entries), lw.EntriesLen()) + require.Equal(t, tc.walletType, lw.Type()) + + if tc.encrypted { + require.True(t, lw.IsEncrypted()) + require.Empty(t, lw.Seed()) + require.Empty(t, lw.SeedPassphrase()) + } else { + require.False(t, lw.IsEncrypted()) + require.Equal(t, tc.seed, lw.Seed()) + require.Equal(t, tc.seedPassphrase, lw.SeedPassphrase()) + } + + for i := range w.Entries { + require.Equal(t, w.Entries[i].Address, lw.GetEntryAt(i).Address.String()) + require.Equal(t, w.Entries[i].Public, lw.GetEntryAt(i).Public.Hex()) + + if tc.encrypted || tc.walletType == wallet.WalletTypeXPub { + require.True(t, lw.GetEntryAt(i).Secret.Null()) + } else { + require.False(t, lw.GetEntryAt(i).Secret.Null()) + } + + switch tc.walletType { + case wallet.WalletTypeBip44: + require.NotNil(t, w.Entries[i].ChildNumber) + require.Equal(t, uint32(i), *w.Entries[i].ChildNumber) + require.NotNil(t, w.Entries[i].Change) + require.Equal(t, bip44.ExternalChainIndex, *w.Entries[i].Change) + case wallet.WalletTypeXPub: + require.NotNil(t, w.Entries[i].ChildNumber) + require.Equal(t, uint32(i), *w.Entries[i].ChildNumber) + require.Nil(t, w.Entries[i].Change) + default: + require.Nil(t, w.Entries[i].ChildNumber) + require.Nil(t, w.Entries[i].Change) + } + } + }) + } +} + +func TestGetWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + // Create a wallet + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + // Confirms the wallet can be acquired + w1, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, *w, *w1) + }) + } +} + +func TestGetWallets(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + // Creates 2 new wallets of each type + var ws []api.WalletResponse + for i := 0; i < 2; i++ { + for _, walletType := range createWalletTypes { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + ws = append(ws, *w) + } + } + + // Gets wallet from node + wlts, err := c.Wallets() + require.NoError(t, err) + + // Create the wallet map + walletMap := make(map[string]api.WalletResponse) + for _, w := range wlts { + walletMap[w.Meta.Filename] = w + } + + // Confirms the returned wallets contains the wallet we created. + for _, w := range ws { + retW, ok := walletMap[w.Meta.Filename] + require.True(t, ok) + require.Equal(t, w, retW) + } +} + +// TestWalletNewAddress will generate 30 wallets for testing, and they will +// be removed automatically after testing. +func TestWalletNewAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + seed := bip39.MustNewDefaultMnemonic() + + cases := []struct { + name string + seed string + seedPassphrase string + walletType string + expectErr error + postWalletHandle func(t *testing.T, c *api.Client, wltName string) + }{ + { + name: "deterministic", + seed: seed, + walletType: wallet.WalletTypeDeterministic, + expectErr: nil, + }, + { + name: "deterministic writable=false", + seed: seed, + walletType: wallet.WalletTypeDeterministic, + postWalletHandle: func(t *testing.T, c *api.Client, wltName string) { + dir := getWalletDir(t, c) + wltPath := filepath.Join(dir, wltName) + err := os.Chmod(wltPath, 0555) // Remove write permission + require.NoError(t, err) + }, + expectErr: api.NewClientError("400 Bad Request", http.StatusBadRequest, "400 Bad Request - saving wallet permission denied"), + }, + { + name: "bip44 without seed passphrase", + seed: seed, + walletType: wallet.WalletTypeBip44, + expectErr: nil, + }, + { + name: "bip44 with seed passphrase", + seed: seed, + seedPassphrase: "foobar", + walletType: wallet.WalletTypeBip44, + expectErr: nil, + }, + } + + // We only test 30 cases, because the more addresses we generate, the longer + // it takes, we don't want to spend much time here. + for _, tc := range cases { + for i := 1; i <= 30; i++ { + name := fmt.Sprintf("%s generate %v addresses", tc.name, i) + t.Run(name, func(t *testing.T) { + c := newClient() + var encrypt bool + var password string + // Test wallet with encryption only when i == 2, so that + // the tests won't time out. + if i == 2 { + encrypt = true + password = "pwd" + } + + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + Password: password, + Encrypt: encrypt, + }) + defer clean() + if tc.postWalletHandle != nil { + tc.postWalletHandle(t, c, w.Meta.Filename) + } + + addrs, err := c.NewWalletAddress(w.Meta.Filename, i, password) + require.Equal(t, tc.expectErr, err) + + // Confirms no intermediate tmp file exists + walletDir := getWalletDir(t, c) + wltPath := filepath.Join(walletDir, w.Meta.Filename) + ".tmp" + _, existErr := os.Stat(wltPath) + require.True(t, os.IsNotExist(existErr)) + + if err != nil { + return + } + + switch tc.walletType { + case wallet.WalletTypeDeterministic: + seckeys := cipher.MustGenerateDeterministicKeyPairs([]byte(tc.seed), i+1) + var as []string + for _, k := range seckeys { + as = append(as, cipher.MustAddressFromSecKey(k).String()) + } + + // Confirms that the new generated addresses match + require.Equal(t, len(addrs), len(as)-1) + for i := range addrs { + require.Equal(t, as[i+1], addrs[i]) + } + case wallet.WalletTypeBip44: + ss, err := bip39.NewSeed(tc.seed, tc.seedPassphrase) + require.NoError(t, err) + + cc, err := bip44.NewCoin(ss, bip44.CoinTypeSkycoin) + require.NoError(t, err) + + acct, err := cc.Account(0) + require.NoError(t, err) + + ext, err := acct.External() + require.NoError(t, err) + + var as []string + for j := uint32(0); j < uint32(i+1); j++ { + k, err := ext.NewPrivateChildKey(j) + require.NoError(t, err) + sk := cipher.MustNewSecKey(k.Key) + as = append(as, cipher.MustAddressFromSecKey(sk).String()) + } + + // Confirms that the new generated addresses match + require.Equal(t, len(addrs), len(as)-1) + for i := range addrs { + require.Equal(t, as[i+1], addrs[i]) + } + default: + t.Fatalf("unhandled wallet type %q", tc.walletType) + } + }) + } + } +} + +func TestStableWalletBalance(t *testing.T) { + if !doStable(t) { + return + } + + seed := "casino away claim road artist where blossom warrior demise royal still palm" + xpub := "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v" + c := newClient() + + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + opts := api.CreateWalletOptions{ + Type: walletType, + } + + switch walletType { + case wallet.WalletTypeBip44, wallet.WalletTypeDeterministic: + opts.Seed = seed + case wallet.WalletTypeXPub: + opts.XPub = xpub + } + + w, _, clean := createWallet(t, c, opts) + defer clean() + + bp, err := c.WalletBalance(w.Meta.Filename) + require.NoError(t, err) + + var expect api.BalanceResponse + checkGoldenFile(t, fmt.Sprintf("wallet-balance-%s.golden", walletType), TestData{*bp, &expect}) + }) + } +} + +func TestLiveWalletBalance(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + _, walletName, _ := getWalletFromEnv(t, c) + bp, err := c.WalletBalance(walletName) + require.NoError(t, err) + require.NotNil(t, bp) + require.NotNil(t, bp.Addresses) +} + +func TestWalletUpdate(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + err := c.UpdateWallet(w.Meta.Filename, "new wallet") + require.NoError(t, err) + + // Confirms the wallet has label of "new wallet" + w1, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, w1.Meta.Label, "new wallet") + }) + } +} + +func TestStableWalletUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + txns, err := c.WalletUnconfirmedTransactions(w.Meta.Filename) + require.NoError(t, err) + + goldenFile := fmt.Sprintf("wallet-%s-transactions.golden", walletType) + var expect api.UnconfirmedTxnsResponse + checkGoldenFile(t, goldenFile, TestData{*txns, &expect}) + }) + } +} + +func TestLiveWalletUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + w, _, _, _ := prepareAndCheckWallet(t, c, 1e6, 1) + txns, err := c.WalletUnconfirmedTransactions(w.Filename()) + require.NoError(t, err) + + bp, err := c.WalletBalance(w.Filename()) + require.NoError(t, err) + // There's pending transactions if predicted coins are not the same as confirmed coins + if bp.Predicted.Coins != bp.Confirmed.Coins { + require.NotEmpty(t, txns.Transactions) + return + } + + require.Empty(t, txns.Transactions) +} + +func TestStableWalletUnconfirmedTransactionsVerbose(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + txns, err := c.WalletUnconfirmedTransactionsVerbose(w.Meta.Filename) + require.NoError(t, err) + + goldenFile := fmt.Sprintf("wallet-%s-transactions-verbose.golden", walletType) + var expect api.UnconfirmedTxnsVerboseResponse + checkGoldenFile(t, goldenFile, TestData{*txns, &expect}) + }) + } +} + +func TestLiveWalletUnconfirmedTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + w, _, _, _ := prepareAndCheckWallet(t, c, 1e6, 1) + txns, err := c.WalletUnconfirmedTransactionsVerbose(w.Filename()) + require.NoError(t, err) + + bp, err := c.WalletBalance(w.Filename()) + require.NoError(t, err) + // There's pending transactions if predicted coins are not the same as confirmed coins + if bp.Predicted.Coins != bp.Confirmed.Coins { + require.NotEmpty(t, txns.Transactions) + return + } + + require.Empty(t, txns.Transactions) +} + +func TestWalletFolderName(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + folderName, err := c.WalletFolderName() + require.NoError(t, err) + + require.NotNil(t, folderName) + require.NotEmpty(t, folderName.Address) +} + +func TestEncryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + // Create a unencrypted wallet + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + // Encrypts the wallet + rlt, err := c.EncryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + require.NotEmpty(t, rlt.Meta.CryptoType) + require.True(t, rlt.Meta.Encrypted) + + // Encrypt the wallet again, should returns error + _, err = c.EncryptWallet(w.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is encrypted") + + // Confirms that no sensitive data do exist in wallet file + wf, err := c.WalletFolderName() + require.NoError(t, err) + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + require.Empty(t, lw.Seed()) + require.Empty(t, lw.LastSeed()) + require.NotEmpty(t, lw.Secrets()) + + // Decrypts the wallet, and confirms that the + // seed and address entries are the same as it was before being encrypted. + dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + require.Equal(t, w, dw) + }) + } +} + +func TestDecryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, seed, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + Password: "pwd", + Encrypt: true, + }) + defer clean() + + // Decrypt wallet with different password, must fail + _, err := c.DecryptWallet(w.Meta.Filename, "pwd1") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - invalid password") + + // Decrypt wallet with no password, must fail + _, err = c.DecryptWallet(w.Meta.Filename, "") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password") + + // Decrypts wallet with correct password + dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Confirms that no sensitive data are returned + require.Empty(t, dw.Meta.CryptoType) + require.False(t, dw.Meta.Encrypted) + + // Loads wallet from file + wf, err := c.WalletFolderName() + require.NoError(t, err) + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + + require.Equal(t, lw.Seed(), seed) + require.Equal(t, 1, lw.EntriesLen()) + + switch walletType { + case wallet.WalletTypeDeterministic: + // Confirms the last seed matches + lseed, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 1) + require.Equal(t, hex.EncodeToString(lseed), lw.LastSeed()) + + // Confirms that the first address is derived from the private key + pubkey := cipher.MustPubKeyFromSecKey(seckeys[0]) + require.Equal(t, w.Entries[0].Address, cipher.AddressFromPubKey(pubkey).String()) + require.Equal(t, lw.GetEntryAt(0).Address.String(), w.Entries[0].Address) + require.Empty(t, lw.XPub()) + + case wallet.WalletTypeBip44: + require.Empty(t, lw.LastSeed()) + require.Empty(t, lw.XPub()) + + case wallet.WalletTypeXPub: + require.Empty(t, lw.Seed()) + require.Empty(t, lw.LastSeed()) + require.NotEmpty(t, lw.XPub()) + + default: + t.Fatalf("unhandled wallet type %q", walletType) + } + }) + } +} + +func TestRecoverWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + // Create an encrypted wallet with some addresses pregenerated, + // to make sure recover recovers the same number of addresses + c := newClient() + wf, err := c.WalletFolderName() + require.NoError(t, err) + + // Load the wallet from disk to check that it was saved + checkWalletOnDisk := func(w *api.WalletResponse) { + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + lwr, err := api.NewWalletResponse(lw) + require.NoError(t, err) + require.Equal(t, w, lwr) + } + + cases := []struct { + name string + seed string + seedPassphrase string + badSeed string + walletType string + }{ + { + name: "deterministic", + seed: "fooseed", + badSeed: "fooseed2", + walletType: wallet.WalletTypeDeterministic, + }, + { + name: "bip44 with seed passphrase", + seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + seedPassphrase: "foobar", + badSeed: "mule seed lady practice desk length roast tongue attract heavy spirit focus", + walletType: wallet.WalletTypeBip44, + }, + { + name: "bip44 without seed passphrase", + seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + seedPassphrase: "", + badSeed: "mule seed lady practice desk length roast tongue attract heavy spirit focus", + walletType: wallet.WalletTypeBip44, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + }) + defer clean() + + _, err = c.NewWalletAddress(w.Meta.Filename, 10, "") + require.NoError(t, err) + + w, err = c.Wallet(w.Meta.Filename) + require.NoError(t, err) + + // Recover fails if the wallet is not encrypted + _, err = c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + }) + assertResponseError(t, err, http.StatusBadRequest, "wallet is not encrypted") + + _, err = c.EncryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Recovery fails if the seed doesn't match + _, err = c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.badSeed, + SeedPassphrase: tc.seedPassphrase, + }) + assertResponseError(t, err, http.StatusBadRequest, "wallet recovery seed or seed passphrase is wrong") + + // Recovery fails if the seed passphrase doesn't match + _, err = c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase + "2", + }) + + switch tc.walletType { + case wallet.WalletTypeBip44: + assertResponseError(t, err, http.StatusBadRequest, "wallet recovery seed or seed passphrase is wrong") + case wallet.WalletTypeDeterministic: + assertResponseError(t, err, http.StatusBadRequest, "RecoverWallet failed to create temporary wallet for fingerprint comparison: seedPassphrase is only used for \"bip44\" wallets") + default: + t.Fatalf("unhandled wallet type %q", tc.walletType) + } + + // Successful recovery with no new password + w2, err := c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + }) + require.NoError(t, err) + require.False(t, w2.Meta.Encrypted) + checkWalletOnDisk(w2) + require.Equal(t, w, w2) + + _, err = c.EncryptWallet(w.Meta.Filename, "pwd2") + require.NoError(t, err) + + // Successful recovery with a new password + w3, err := c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + Password: "pwd3", + }) + require.NoError(t, err) + require.True(t, w3.Meta.Encrypted) + require.Equal(t, wallet.CryptoTypeScryptChacha20poly1305, w3.Meta.CryptoType) + checkWalletOnDisk(w3) + w3.Meta.Encrypted = w.Meta.Encrypted + w3.Meta.CryptoType = w.Meta.CryptoType + require.Equal(t, w, w3) + + w4, err := c.DecryptWallet(w.Meta.Filename, "pwd3") + require.NoError(t, err) + require.False(t, w.Meta.Encrypted) + require.Equal(t, w, w4) + }) + } +} + +func TestVerifyWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + c := newClient() + + // check with correct seed + isValid, err := c.VerifySeed("nut wife logic sample addict shop before tobacco crisp bleak lawsuit affair") + require.NoError(t, err) + require.True(t, isValid) + + // check with incorrect seed + isValid, err = c.VerifySeed("nut ") + require.False(t, isValid) + assertResponseError(t, err, http.StatusUnprocessableEntity, bip39.ErrSurroundingWhitespace.Error()) +} + +func TestGetWalletSeedDisabledAPI(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if mode(t) == testModeLive && !*testLiveWallet { + t.Skip("Skipping tests because live mode enabled but wallet tests disabled") + } + + if mode(t) == testModeEnableSeedAPI { + t.Skip("Skipping because enable seed API tests is on") + } + + c := newClient() + + for _, walletType := range []string{ + wallet.WalletTypeBip44, + wallet.WalletTypeDeterministic, + } { + t.Run(walletType, func(t *testing.T) { + // Create an encrypted wallet + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + Password: "pwd", + Encrypt: true, + }) + defer clean() + + _, err := c.WalletSeed(w.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusForbidden, "403 Forbidden - Endpoint is disabled") + }) + } +} + +func TestGetWalletSeedEnabledAPI(t *testing.T) { + if !doEnableSeedAPI(t) { + return + } + + c := newClient() + + cases := []struct { + name string + walletType string + seed1 string + seed2 string + seedPassphrase string + }{ + { + name: "deterministic", + walletType: wallet.WalletTypeDeterministic, + seed1: bip39.MustNewDefaultMnemonic(), + seed2: bip39.MustNewDefaultMnemonic(), + }, + { + name: "bip44 without seed passphrase", + walletType: wallet.WalletTypeBip44, + seed1: bip39.MustNewDefaultMnemonic(), + seed2: bip39.MustNewDefaultMnemonic(), + }, + { + name: "bip44 with seed passphrase", + walletType: wallet.WalletTypeBip44, + seed1: bip39.MustNewDefaultMnemonic(), + seed2: bip39.MustNewDefaultMnemonic(), + seedPassphrase: "foobar", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.NotEmpty(t, tc.seed1) + require.NotEmpty(t, tc.seed2) + + // Create an encrypted wallet + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed1, + SeedPassphrase: tc.seedPassphrase, + Password: "pwd", + Encrypt: true, + }) + defer clean() + + resp, err := c.WalletSeed(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Confirms the seed are matched + require.Equal(t, tc.seed1, resp.Seed) + require.Equal(t, tc.seedPassphrase, resp.SeedPassphrase) + + // Get seed of wrong wallet id + _, err = c.WalletSeed("w.wlt", "pwd") + assertResponseError(t, err, http.StatusNotFound, "404 Not Found") + + // Check with invalid password + _, err = c.WalletSeed(w.Meta.Filename, "wrong password") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - invalid password") + + // Check with missing password + _, err = c.WalletSeed(w.Meta.Filename, "") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password") + + // Create unencrypted wallet to check against + nw, _, nclean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed2, + SeedPassphrase: tc.seedPassphrase, + }) + defer nclean() + _, err = c.WalletSeed(nw.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is not encrypted") + }) + } +} + +// prepareAndCheckWallet gets wallet from environment, and confirms: +// 1. The minimal coins and coin hours requirements are met. +// 2. The wallet has at least two address entry. +// Returns the loaded wallet, total coins, total coin hours and password of the wallet. +func prepareAndCheckWallet(t *testing.T, c *api.Client, minCoins, minCoinHours uint64) (wallet.Wallet, uint64, uint64, string) { + walletDir, walletName, password := getWalletFromEnv(t, c) + walletPath := filepath.Join(walletDir, walletName) + + // Checks if the wallet does exist + if _, err := os.Stat(walletPath); os.IsNotExist(err) { + t.Fatalf("Wallet %v doesn't exist", walletPath) + } + + w, err := wallet.Load(walletPath) + if err != nil { + t.Fatalf("Load wallet %v failed: %v", walletPath, err) + } + + if w.IsEncrypted() && password == "" { + t.Fatalf("Wallet is encrypted, must set WALLET_PASSWORD env var") + } + + // Generate more addresses if address entries less than 2. + if w.EntriesLen() < 2 { + _, err := c.NewWalletAddress(w.Filename(), 2-w.EntriesLen(), password) + if err != nil { + t.Fatalf("New wallet address failed: %v", err) + } + + w, err = wallet.Load(walletPath) + if err != nil { + t.Fatalf("Reload wallet %v failed: %v", walletPath, err) + } + } + + coins, hours := getWalletBalance(t, c, walletName) + if coins < minCoins { + t.Fatalf("Wallet must have at least %d coins", minCoins) + } + + if hours < minCoinHours { + t.Fatalf("Wallet must have at least %d coin hours", minCoinHours) + } + + if err := wallet.Save(w, walletDir); err != nil { + t.Fatalf("%v", err) + } + + return w, coins, hours, password +} + +// getWalletFromEnv loads wallet from environment variables. +// Returns wallet dir, wallet name and wallet password is any. +func getWalletFromEnv(t *testing.T, c *api.Client) (string, string, string) { + walletDir := getWalletDir(t, c) + + walletName := os.Getenv("API_WALLET_ID") + if walletName == "" { + t.Fatal("Missing API_WALLET_ID environment value") + } + + walletPassword := os.Getenv("WALLET_PASSWORD") + return walletDir, walletName, walletPassword +} + +func requireWalletEnv(t *testing.T) { + if !doLiveWallet(t) { + return + } + + walletName := os.Getenv("API_WALLET_ID") + if walletName == "" { + t.Fatal("missing API_WALLET_ID environment value") + } +} + +// getWalletBalance gets wallet balance. +// Returns coins and hours +func getWalletBalance(t *testing.T, c *api.Client, walletName string) (uint64, uint64) { + wp, err := c.WalletBalance(walletName) + if err != nil { + t.Fatalf("Get wallet balance of %v failed: %v", walletName, err) + } + + return wp.Confirmed.Coins, wp.Confirmed.Hours +} + +func getWalletDir(t *testing.T, c *api.Client) string { + wf, err := c.WalletFolderName() + if err != nil { + t.Fatalf("%v", err) + } + return wf.Address +} + +var createWalletTypes = []string{ + wallet.WalletTypeDeterministic, + wallet.WalletTypeBip44, + wallet.WalletTypeXPub, + // wallet.WalletTypeCollection, // TODO +} + +func createWallet(t *testing.T, c *api.Client, o api.CreateWalletOptions) (*api.WalletResponse, string, func()) { + switch o.Type { + case wallet.WalletTypeDeterministic, wallet.WalletTypeBip44: + if o.Seed == "" { + o.Seed = bip39.MustNewDefaultMnemonic() + } + case wallet.WalletTypeXPub: + if o.XPub == "" { + o.XPub = testutil.RandXPub(t).String() + } + } + + if o.Label == "" { + o.Label = hex.EncodeToString(testutil.RandBytes(t, 6)) + } + + w, err := c.CreateWallet(o) + require.NoError(t, err) + + walletDir := getWalletDir(t, c) + + return w, o.Seed, func() { + // Cleaner function to delete the wallet and bak wallet + walletPath := filepath.Join(walletDir, w.Meta.Filename) + err = os.Remove(walletPath) + require.NoError(t, err) + + bakWalletPath := walletPath + ".bak" + if _, err := os.Stat(bakWalletPath); !os.IsNotExist(err) { + // Return directly if no .bak file does exist + err = os.Remove(bakWalletPath) + require.NoError(t, err) + } + + require.NoError(t, err) + + // Removes the wallet from memory + err = c.UnloadWallet(w.Meta.Filename) + require.NoError(t, err) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/metrics.go b/vendor/github.com/SkycoinProject/skycoin/src/api/metrics.go new file mode 100644 index 00000000..fd73b906 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/metrics.go @@ -0,0 +1,85 @@ +package api + +import ( + "net/http" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +var ( + promUnspents = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "unspent_outputs", + Help: "Number of unspent outputs", + }) + promUnconfirmedTxns = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "unconfirmed_txns", + Help: "Number of unconfirmed transactions", + }) + promTimeSinceLastBlock = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "time_since_last_block_seconds", + Help: "Time since the last block created", + }) + promOpenConns = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "open_connections", + Help: "Number of open connections", + }) + promOutgoingConns = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "outgoing_connections", + Help: "Number of outgoing connections", + }) + promIncomingConns = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "incoming_connections", + Help: "Number of incoming connections", + }) + promStartedAt = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "started_at", + Help: "Node start time, in unixtime", + }) + promLastBlockSeq = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "last_block_seq", + Help: "Last block sequence number", + }) +) + +func init() { + prometheus.MustRegister(promUnspents) + prometheus.MustRegister(promUnconfirmedTxns) + prometheus.MustRegister(promTimeSinceLastBlock) + prometheus.MustRegister(promOpenConns) + prometheus.MustRegister(promOutgoingConns) + prometheus.MustRegister(promIncomingConns) + prometheus.MustRegister(promStartedAt) + prometheus.MustRegister(promLastBlockSeq) +} + +func metricsHandler(c muxConfig, gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + health, err := getHealthData(c, gateway) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + promUnspents.Set(float64(health.BlockchainMetadata.Unspents)) + promUnconfirmedTxns.Set(float64(health.BlockchainMetadata.Unconfirmed)) + promTimeSinceLastBlock.Set(health.BlockchainMetadata.TimeSinceLastBlock.Seconds()) + promOpenConns.Set(float64(health.OpenConnections)) + promOutgoingConns.Set(float64(health.OutgoingConnections)) + promIncomingConns.Set(float64(health.IncomingConnections)) + promStartedAt.Set(float64(gateway.StartedAt().Unix())) + promLastBlockSeq.Set(float64(health.BlockchainMetadata.Head.BkSeq)) + + promhttp.Handler().ServeHTTP(w, r) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/middleware.go b/vendor/github.com/SkycoinProject/skycoin/src/api/middleware.go new file mode 100644 index 00000000..357883b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/middleware.go @@ -0,0 +1,208 @@ +package api + +import ( + "crypto/subtle" + "fmt" + "net/http" + "net/url" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/iputil" +) + +// ContentSecurityPolicy represents the value of content-security-policy +// header in http response +const ContentSecurityPolicy = "default-src 'self'" + + "; connect-src 'self' https://api.coinpaprika.com https://swaplab.cc https://version.skycoin.com https://downloads.skycoin.com http://127.0.0.1:9510" + + "; img-src 'self' 'unsafe-inline' data:" + + "; style-src 'self' 'unsafe-inline'" + + "; object-src 'none'" + + "; form-action 'none'" + + "; frame-ancestors 'none'" + + "; block-all-mixed-content" + + "; base-uri 'self'" + +// CSPHandler sets the Content-Security-Policy header +func CSPHandler(handler http.Handler, policy string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Security-Policy", policy) + handler.ServeHTTP(w, r) + }) +} + +// ContentTypeJSONRequired enforces Content-Type: application/json in a POST request. +// Return 415 Unsupported Media Type if the Content-Type is not application/json, +// in the V2 error format. +func ContentTypeJSONRequired(handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodPost { + contentType := r.Header.Get("Content-Type") + if !isContentTypeJSON(contentType) { + resp := NewHTTPErrorResponse(http.StatusUnsupportedMediaType, "") + writeHTTPResponse(w, resp) + return + } + } + + handler.ServeHTTP(w, r) + }) +} + +// isContentTypeJSON returns true if the content type is application/json, +// allowing the content-type string to include extra parameters like charset=utf-8, +// for example `Content-Type: application/json; charset=utf-8` will return true. +func isContentTypeJSON(contentType string) bool { + return contentType == ContentTypeJSON || strings.HasPrefix(contentType, ContentTypeJSON+";") +} + +// HostCheck checks that the request's Host header is 127.0.0.1:$port or localhost:$port +// if the HTTP interface host is also a localhost address. +// This prevents DNS rebinding attacks, where an attacker uses a DNS rebinding service +// to bypass CORS checks. +// If the HTTP interface host is not a localhost address, +// the Host header is not checked. This is considered a public interface. +// If the Host header is not set, it is not checked. +// All major browsers send the Host header as required by the HTTP spec. +// hostWhitelist allows additional Host header values to be accepted. +func HostCheck(host string, hostWhitelist []string, handler http.Handler) http.Handler { + return hostCheck(apiVersion1, host, hostWhitelist, handler) +} + +func hostCheck(apiVersion, host string, hostWhitelist []string, handler http.Handler) http.Handler { + addr := host + var port uint16 + if strings.Contains(host, ":") { + var err error + addr, port, err = iputil.SplitAddr(host) + if err != nil { + logger.Panic(err) + } + } + + isLocalhost := iputil.IsLocalhost(addr) + + if isLocalhost && port == 0 { + logger.Panic("localhost with no port specified is unsupported") + } + + hostWhitelistMap := make(map[string]struct{}, len(hostWhitelist)+2) + for _, k := range hostWhitelist { + hostWhitelistMap[k] = struct{}{} + } + hostWhitelistMap[fmt.Sprintf("127.0.0.1:%d", port)] = struct{}{} + hostWhitelistMap[fmt.Sprintf("localhost:%d", port)] = struct{}{} + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // NOTE: The "Host" header is not in http.Request.Header, it's put in the http.Request.Host field + _, isWhitelisted := hostWhitelistMap[r.Host] + if isLocalhost && r.Host != "" && !isWhitelisted { + logger.Critical().Errorf("Detected DNS rebind attempt - configured-host=%s header-host=%s", host, r.Host) + writeError(w, apiVersion, http.StatusForbidden, "Invalid Host") + return + } + + handler.ServeHTTP(w, r) + }) +} + +// OriginRefererCheck checks the Origin header if present, falling back on Referer. +// The Origin or Referer hostname must match the configured host. +// If neither are present, the request is allowed. All major browsers will set +// at least one of these values. If neither are set, assume it is a request +// from curl/wget. +func OriginRefererCheck(host string, hostWhitelist []string, handler http.Handler) http.Handler { + return originRefererCheck(apiVersion1, host, hostWhitelist, handler) +} + +func originRefererCheck(apiVersion, host string, hostWhitelist []string, handler http.Handler) http.Handler { + hostWhitelistMap := make(map[string]struct{}, len(hostWhitelist)+2) + for _, k := range hostWhitelist { + hostWhitelistMap[k] = struct{}{} + } + + if addr, port, _ := iputil.SplitAddr(host); iputil.IsLocalhost(addr) { //nolint:errcheck + hostWhitelistMap[fmt.Sprintf("127.0.0.1:%d", port)] = struct{}{} + hostWhitelistMap[fmt.Sprintf("localhost:%d", port)] = struct{}{} + } else { + hostWhitelistMap[host] = struct{}{} + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + origin := r.Header.Get("Origin") + referer := r.Header.Get("Referer") + toCheck := origin + toCheckHeader := "Origin" + if toCheck == "" { + toCheck = referer + toCheckHeader = "Referer" + } + + if toCheck != "" { + u, err := url.Parse(toCheck) + if err != nil { + logger.Critical().Errorf("Invalid URL in %s header: %s %v", toCheckHeader, toCheck, err) + writeError(w, apiVersion, http.StatusForbidden, "Invalid URL in Origin or Referer header") + return + } + + if _, isWhitelisted := hostWhitelistMap[u.Host]; !isWhitelisted { + logger.Critical().Errorf("%s header value %s does not match host and is not whitelisted", toCheckHeader, toCheck) + writeError(w, apiVersion, http.StatusForbidden, "Invalid Origin or Referer") + return + } + } + + handler.ServeHTTP(w, r) + }) +} + +func basicAuth(apiVersion, username, password, realm string, f http.Handler) http.HandlerFunc { + needsAuth := username != "" || password != "" + usernamePasswordHash := cipher.SumSHA256(append([]byte(username), []byte(password)...)) + authHeader := fmt.Sprintf("Basic realm=%q", realm) + + return func(w http.ResponseWriter, r *http.Request) { + user, pass, ok := r.BasicAuth() + + if needsAuth { + if !ok { + w.Header().Set("WWW-Authenticate", authHeader) + writeError(w, apiVersion, http.StatusUnauthorized, "") + return + } + + userPassHash := cipher.SumSHA256(append([]byte(user), []byte(pass)...)) + + if subtle.ConstantTimeCompare(userPassHash[:], usernamePasswordHash[:]) != 1 { + w.Header().Set("WWW-Authenticate", authHeader) + writeError(w, apiVersion, http.StatusUnauthorized, "") + return + } + } else { + // If auth is not configured but the request provides auth, reject + // This will avoid a mistake where the daemon is not configured with auth, + // but the client is, and does not realize the daemon is not configured with auth + // because all requests are accepted + if user != "" || pass != "" { + w.Header().Set("WWW-Authenticate", authHeader) + writeError(w, apiVersion, http.StatusUnauthorized, "") + return + } + } + + f.ServeHTTP(w, r) + } +} + +func writeError(w http.ResponseWriter, apiVersion string, code int, msg string) { + switch apiVersion { + case apiVersion1: + wh.ErrorXXX(w, code, msg) + case apiVersion2: + writeHTTPResponse(w, NewHTTPErrorResponse(code, msg)) + default: + wh.Error500(w, "Invalid internal API version") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/middleware_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/middleware_test.go new file mode 100644 index 00000000..835c2d94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/middleware_test.go @@ -0,0 +1,284 @@ +package api + +import ( + "fmt" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestOriginRefererCheck(t *testing.T) { + cases := []struct { + name string + origin string + referer string + enableHeaderCheck bool + status int + errV1 string + errV2 string + hostWhitelist []string + }{ + { + name: "unparseable origin header", + origin: ":?4foo", + enableHeaderCheck: true, + status: http.StatusForbidden, + errV1: "403 Forbidden - Invalid URL in Origin or Referer header\n", + errV2: "{\n \"error\": {\n \"message\": \"Invalid URL in Origin or Referer header\",\n \"code\": 403\n }\n}", + }, + { + name: "mismatched origin header", + origin: "http://example.com/", + enableHeaderCheck: true, + status: http.StatusForbidden, + errV1: "403 Forbidden - Invalid Origin or Referer\n", + errV2: "{\n \"error\": {\n \"message\": \"Invalid Origin or Referer\",\n \"code\": 403\n }\n}", + }, + { + name: "mismatched referer header", + referer: "http://example.com/", + enableHeaderCheck: true, + status: http.StatusForbidden, + errV1: "403 Forbidden - Invalid Origin or Referer\n", + errV2: "{\n \"error\": {\n \"message\": \"Invalid Origin or Referer\",\n \"code\": 403\n }\n}", + }, + { + name: "whitelisted referer header", + referer: "http://example.com/", + enableHeaderCheck: true, + hostWhitelist: []string{"example.com"}, + }, + { + name: "whitelisted origin header", + referer: "http://example.com/", + enableHeaderCheck: true, + hostWhitelist: []string{"example.com"}, + }, + { + name: "mismatched referer header", + referer: "http://example.com/", + enableHeaderCheck: false, + }, + { + name: "mismatched origin header", + origin: "http://example.com/", + enableHeaderCheck: false, + }, + } + + for _, endpoint := range allEndpoints() { + for _, tc := range cases { + name := fmt.Sprintf("%s %s", tc.name, endpoint) + t.Run(name, func(t *testing.T) { + gateway := &MockGatewayer{} + + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + if tc.origin != "" { + req.Header.Set("Origin", tc.origin) + } + if tc.referer != "" { + req.Header.Set("Referer", tc.referer) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + cfg.disableHeaderCheck = !tc.enableHeaderCheck + // disable all api sets to avoid mocking gateway methods + cfg.enabledAPISets = map[string]struct{}{} + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + switch tc.status { + case http.StatusForbidden: + require.Equal(t, tc.status, rr.Code) + + if isAPIV2 { + require.Equal(t, tc.errV2, rr.Body.String()) + } else { + require.Equal(t, tc.errV1, rr.Body.String()) + } + default: + if tc.enableHeaderCheck || tc.hostWhitelist == nil { + // Arbitrary endpoints could return any status, since we don't customize the request per endpoint + // Make sure that the request only didn't return the origin check error + require.False(t, strings.Contains("Invalid URL in Origin or Referer header", rr.Body.String())) + require.False(t, strings.Contains("Invalid Origin or Referer", rr.Body.String())) + } + } + + }) + } + } +} + +func TestHostCheck(t *testing.T) { + cases := []struct { + name string + host string + status int + enableHeaderCheck bool + errV1 string + errV2 string + hostWhitelist []string + }{ + { + name: "invalid host", + host: "example.com", + status: http.StatusForbidden, + enableHeaderCheck: true, + errV1: "403 Forbidden - Invalid Host\n", + errV2: "{\n \"error\": {\n \"message\": \"Invalid Host\",\n \"code\": 403\n }\n}", + }, + { + name: "invalid host is whitelisted", + host: "example.com", + hostWhitelist: []string{"example.com"}, + enableHeaderCheck: true, + }, + { + name: "invalid host - header check disabled", + host: "example.com", + enableHeaderCheck: false, + }, + } + + for endpoint, methods := range endpointsMethods { + for _, m := range methods { + for _, tc := range cases { + name := fmt.Sprintf("%s %s %s", tc.name, m, endpoint) + t.Run(name, func(t *testing.T) { + gateway := &MockGatewayer{} + + req, err := http.NewRequest(m, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + req.Host = "example.com" + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableHeaderCheck: !tc.enableHeaderCheck, + disableCSP: true, + hostWhitelist: tc.hostWhitelist, + }, gateway) + + handler.ServeHTTP(rr, req) + + switch tc.status { + case http.StatusForbidden: + require.Equal(t, http.StatusForbidden, rr.Code) + if isAPIV2 { + require.Equal(t, tc.errV2, rr.Body.String()) + } else { + require.Equal(t, tc.errV1, rr.Body.String()) + } + default: + if tc.enableHeaderCheck || tc.hostWhitelist == nil { + // Arbitrary endpoints could return any status, since we don't customize the request per endpoint + // Make sure that the request only didn't return the invalid host error + require.False(t, strings.Contains("Invalid Host", rr.Body.String())) + } + } + }) + } + } + } +} + +func TestContentSecurityPolicy(t *testing.T) { + tt := []struct { + name string + endpoint string + enableCSP bool + appLoc string + expectCSPHeader string + enableGUI bool + }{ + { + name: "enable CSP GET /", + endpoint: "/", + enableCSP: true, + appLoc: "../gui/static/dist", + expectCSPHeader: "default-src 'self'; connect-src 'self' https://api.coinpaprika.com https://swaplab.cc https://version.skycoin.com https://downloads.skycoin.com http://127.0.0.1:9510; img-src 'self' 'unsafe-inline' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; form-action 'none'; frame-ancestors 'none'; block-all-mixed-content; base-uri 'self'", + enableGUI: true, + }, + { + name: "disable CSP GET /", + endpoint: "/", + enableCSP: false, + appLoc: "../gui/static/dist", + expectCSPHeader: "", + enableGUI: true, + }, + { + // Confirms that the /csrf api won't be affected by the csp setting + name: "enable CSP GET /csrf", + endpoint: "/api/v1/csrf", + enableCSP: true, + appLoc: "", + expectCSPHeader: "", + enableGUI: false, + }, + { + // Confirms that the /version api won't be affected by the csp setting + name: "enable CSP GET /version", + endpoint: "/api/v1/version", + enableCSP: true, + appLoc: "", + expectCSPHeader: "", + enableGUI: false, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + req, err := http.NewRequest(http.MethodGet, tc.endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: tc.appLoc, + enableGUI: tc.enableGUI, + disableCSP: !tc.enableCSP, + disableCSRF: true, + }, &MockGatewayer{}) + handler.ServeHTTP(rr, req) + + csp := rr.Header().Get("Content-Security-Policy") + require.Equal(t, tc.expectCSPHeader, csp) + }) + } +} + +func TestIsContentTypeJSON(t *testing.T) { + require.True(t, isContentTypeJSON(ContentTypeJSON)) + require.True(t, isContentTypeJSON("application/json")) + require.True(t, isContentTypeJSON("application/json; charset=utf-8")) + require.False(t, isContentTypeJSON("application/x-www-form-urlencoded")) + require.False(t, isContentTypeJSON(ContentTypeForm)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/mock_gatewayer_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/mock_gatewayer_test.go new file mode 100644 index 00000000..496807fd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/mock_gatewayer_test.go @@ -0,0 +1,1471 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package api + +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import daemon "github.com/SkycoinProject/skycoin/src/daemon" +import historydb "github.com/SkycoinProject/skycoin/src/visor/historydb" +import kvstorage "github.com/SkycoinProject/skycoin/src/kvstorage" +import mock "github.com/stretchr/testify/mock" +import time "time" +import transaction "github.com/SkycoinProject/skycoin/src/transaction" +import visor "github.com/SkycoinProject/skycoin/src/visor" +import wallet "github.com/SkycoinProject/skycoin/src/wallet" + +// MockGatewayer is an autogenerated mock type for the Gatewayer type +type MockGatewayer struct { + mock.Mock +} + +// AddStorageValue provides a mock function with given fields: storageType, key, val +func (_m *MockGatewayer) AddStorageValue(storageType kvstorage.Type, key string, val string) error { + ret := _m.Called(storageType, key, val) + + var r0 error + if rf, ok := ret.Get(0).(func(kvstorage.Type, string, string) error); ok { + r0 = rf(storageType, key, val) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AddressCount provides a mock function with given fields: +func (_m *MockGatewayer) AddressCount() (uint64, error) { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AddressesActivity provides a mock function with given fields: addrs +func (_m *MockGatewayer) AddressesActivity(addrs []cipher.Address) ([]bool, error) { + ret := _m.Called(addrs) + + var r0 []bool + if rf, ok := ret.Get(0).(func([]cipher.Address) []bool); ok { + r0 = rf(addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]bool) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.Address) error); ok { + r1 = rf(addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateTransaction provides a mock function with given fields: p, wp +func (_m *MockGatewayer) CreateTransaction(p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(p, wp) + + var r0 *coin.Transaction + if rf, ok := ret.Get(0).(func(transaction.Params, visor.CreateTransactionParams) *coin.Transaction); ok { + r0 = rf(p, wp) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(transaction.Params, visor.CreateTransactionParams) []visor.TransactionInput); ok { + r1 = rf(p, wp) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(transaction.Params, visor.CreateTransactionParams) error); ok { + r2 = rf(p, wp) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// CreateWallet provides a mock function with given fields: wltName, options, bg +func (_m *MockGatewayer) CreateWallet(wltName string, options wallet.Options, bg wallet.TransactionsFinder) (wallet.Wallet, error) { + ret := _m.Called(wltName, options, bg) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string, wallet.Options, wallet.TransactionsFinder) wallet.Wallet); ok { + r0 = rf(wltName, options, bg) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, wallet.Options, wallet.TransactionsFinder) error); ok { + r1 = rf(wltName, options, bg) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DaemonConfig provides a mock function with given fields: +func (_m *MockGatewayer) DaemonConfig() daemon.DaemonConfig { + ret := _m.Called() + + var r0 daemon.DaemonConfig + if rf, ok := ret.Get(0).(func() daemon.DaemonConfig); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(daemon.DaemonConfig) + } + + return r0 +} + +// DecryptWallet provides a mock function with given fields: wltID, password +func (_m *MockGatewayer) DecryptWallet(wltID string, password []byte) (wallet.Wallet, error) { + ret := _m.Called(wltID, password) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string, []byte) wallet.Wallet); ok { + r0 = rf(wltID, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, []byte) error); ok { + r1 = rf(wltID, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DisconnectByGnetID provides a mock function with given fields: gnetID +func (_m *MockGatewayer) DisconnectByGnetID(gnetID uint64) error { + ret := _m.Called(gnetID) + + var r0 error + if rf, ok := ret.Get(0).(func(uint64) error); ok { + r0 = rf(gnetID) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EncryptWallet provides a mock function with given fields: wltID, password +func (_m *MockGatewayer) EncryptWallet(wltID string, password []byte) (wallet.Wallet, error) { + ret := _m.Called(wltID, password) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string, []byte) wallet.Wallet); ok { + r0 = rf(wltID, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, []byte) error); ok { + r1 = rf(wltID, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetAllStorageValues provides a mock function with given fields: storageType +func (_m *MockGatewayer) GetAllStorageValues(storageType kvstorage.Type) (map[string]string, error) { + ret := _m.Called(storageType) + + var r0 map[string]string + if rf, ok := ret.Get(0).(func(kvstorage.Type) map[string]string); ok { + r0 = rf(storageType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]string) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(kvstorage.Type) error); ok { + r1 = rf(storageType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetAllUnconfirmedTransactions provides a mock function with given fields: +func (_m *MockGatewayer) GetAllUnconfirmedTransactions() ([]visor.UnconfirmedTransaction, error) { + ret := _m.Called() + + var r0 []visor.UnconfirmedTransaction + if rf, ok := ret.Get(0).(func() []visor.UnconfirmedTransaction); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.UnconfirmedTransaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetAllUnconfirmedTransactionsVerbose provides a mock function with given fields: +func (_m *MockGatewayer) GetAllUnconfirmedTransactionsVerbose() ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) { + ret := _m.Called() + + var r0 []visor.UnconfirmedTransaction + if rf, ok := ret.Get(0).(func() []visor.UnconfirmedTransaction); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.UnconfirmedTransaction) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func() [][]visor.TransactionInput); ok { + r1 = rf() + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func() error); ok { + r2 = rf() + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetBalanceOfAddresses provides a mock function with given fields: addrs +func (_m *MockGatewayer) GetBalanceOfAddresses(addrs []cipher.Address) ([]wallet.BalancePair, error) { + ret := _m.Called(addrs) + + var r0 []wallet.BalancePair + if rf, ok := ret.Get(0).(func([]cipher.Address) []wallet.BalancePair); ok { + r0 = rf(addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]wallet.BalancePair) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.Address) error); ok { + r1 = rf(addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlockchainMetadata provides a mock function with given fields: +func (_m *MockGatewayer) GetBlockchainMetadata() (*visor.BlockchainMetadata, error) { + ret := _m.Called() + + var r0 *visor.BlockchainMetadata + if rf, ok := ret.Get(0).(func() *visor.BlockchainMetadata); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*visor.BlockchainMetadata) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlockchainProgress provides a mock function with given fields: headSeq +func (_m *MockGatewayer) GetBlockchainProgress(headSeq uint64) *daemon.BlockchainProgress { + ret := _m.Called(headSeq) + + var r0 *daemon.BlockchainProgress + if rf, ok := ret.Get(0).(func(uint64) *daemon.BlockchainProgress); ok { + r0 = rf(headSeq) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*daemon.BlockchainProgress) + } + } + + return r0 +} + +// GetBlocks provides a mock function with given fields: seqs +func (_m *MockGatewayer) GetBlocks(seqs []uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(seqs) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func([]uint64) []coin.SignedBlock); ok { + r0 = rf(seqs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]uint64) error); ok { + r1 = rf(seqs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlocksInRange provides a mock function with given fields: start, end +func (_m *MockGatewayer) GetBlocksInRange(start uint64, end uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(start, end) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64, uint64) []coin.SignedBlock); ok { + r0 = rf(start, end) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64, uint64) error); ok { + r1 = rf(start, end) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlocksInRangeVerbose provides a mock function with given fields: start, end +func (_m *MockGatewayer) GetBlocksInRangeVerbose(start uint64, end uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) { + ret := _m.Called(start, end) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64, uint64) []coin.SignedBlock); ok { + r0 = rf(start, end) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 [][][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(uint64, uint64) [][][]visor.TransactionInput); ok { + r1 = rf(start, end) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(uint64, uint64) error); ok { + r2 = rf(start, end) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetBlocksVerbose provides a mock function with given fields: seqs +func (_m *MockGatewayer) GetBlocksVerbose(seqs []uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) { + ret := _m.Called(seqs) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func([]uint64) []coin.SignedBlock); ok { + r0 = rf(seqs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 [][][]visor.TransactionInput + if rf, ok := ret.Get(1).(func([]uint64) [][][]visor.TransactionInput); ok { + r1 = rf(seqs) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func([]uint64) error); ok { + r2 = rf(seqs) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetConnection provides a mock function with given fields: addr +func (_m *MockGatewayer) GetConnection(addr string) (*daemon.Connection, error) { + ret := _m.Called(addr) + + var r0 *daemon.Connection + if rf, ok := ret.Get(0).(func(string) *daemon.Connection); ok { + r0 = rf(addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*daemon.Connection) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetConnections provides a mock function with given fields: f +func (_m *MockGatewayer) GetConnections(f func(daemon.Connection) bool) ([]daemon.Connection, error) { + ret := _m.Called(f) + + var r0 []daemon.Connection + if rf, ok := ret.Get(0).(func(func(daemon.Connection) bool) []daemon.Connection); ok { + r0 = rf(f) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]daemon.Connection) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(func(daemon.Connection) bool) error); ok { + r1 = rf(f) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetDefaultConnections provides a mock function with given fields: +func (_m *MockGatewayer) GetDefaultConnections() []string { + ret := _m.Called() + + var r0 []string + if rf, ok := ret.Get(0).(func() []string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + return r0 +} + +// GetExchgConnection provides a mock function with given fields: +func (_m *MockGatewayer) GetExchgConnection() []string { + ret := _m.Called() + + var r0 []string + if rf, ok := ret.Get(0).(func() []string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + return r0 +} + +// GetLastBlocks provides a mock function with given fields: num +func (_m *MockGatewayer) GetLastBlocks(num uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(num) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64) []coin.SignedBlock); ok { + r0 = rf(num) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(num) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBlocksVerbose provides a mock function with given fields: num +func (_m *MockGatewayer) GetLastBlocksVerbose(num uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) { + ret := _m.Called(num) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64) []coin.SignedBlock); ok { + r0 = rf(num) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 [][][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(uint64) [][][]visor.TransactionInput); ok { + r1 = rf(num) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(uint64) error); ok { + r2 = rf(num) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetRichlist provides a mock function with given fields: includeDistribution +func (_m *MockGatewayer) GetRichlist(includeDistribution bool) (visor.Richlist, error) { + ret := _m.Called(includeDistribution) + + var r0 visor.Richlist + if rf, ok := ret.Get(0).(func(bool) visor.Richlist); ok { + r0 = rf(includeDistribution) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(visor.Richlist) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(bool) error); ok { + r1 = rf(includeDistribution) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockByHash provides a mock function with given fields: hash +func (_m *MockGatewayer) GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { + ret := _m.Called(hash) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(cipher.SHA256) *coin.SignedBlock); ok { + r0 = rf(hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(cipher.SHA256) error); ok { + r1 = rf(hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockByHashVerbose provides a mock function with given fields: hash +func (_m *MockGatewayer) GetSignedBlockByHashVerbose(hash cipher.SHA256) (*coin.SignedBlock, [][]visor.TransactionInput, error) { + ret := _m.Called(hash) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(cipher.SHA256) *coin.SignedBlock); ok { + r0 = rf(hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(cipher.SHA256) [][]visor.TransactionInput); ok { + r1 = rf(hash) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(cipher.SHA256) error); ok { + r2 = rf(hash) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetSignedBlockBySeq provides a mock function with given fields: seq +func (_m *MockGatewayer) GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) { + ret := _m.Called(seq) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64) *coin.SignedBlock); ok { + r0 = rf(seq) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(seq) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockBySeqVerbose provides a mock function with given fields: seq +func (_m *MockGatewayer) GetSignedBlockBySeqVerbose(seq uint64) (*coin.SignedBlock, [][]visor.TransactionInput, error) { + ret := _m.Called(seq) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64) *coin.SignedBlock); ok { + r0 = rf(seq) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(uint64) [][]visor.TransactionInput); ok { + r1 = rf(seq) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(uint64) error); ok { + r2 = rf(seq) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetSpentOutputsForAddresses provides a mock function with given fields: addr +func (_m *MockGatewayer) GetSpentOutputsForAddresses(addr []cipher.Address) ([][]historydb.UxOut, error) { + ret := _m.Called(addr) + + var r0 [][]historydb.UxOut + if rf, ok := ret.Get(0).(func([]cipher.Address) [][]historydb.UxOut); ok { + r0 = rf(addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([][]historydb.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.Address) error); ok { + r1 = rf(addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetStorageValue provides a mock function with given fields: storageType, key +func (_m *MockGatewayer) GetStorageValue(storageType kvstorage.Type, key string) (string, error) { + ret := _m.Called(storageType, key) + + var r0 string + if rf, ok := ret.Get(0).(func(kvstorage.Type, string) string); ok { + r0 = rf(storageType, key) + } else { + r0 = ret.Get(0).(string) + } + + var r1 error + if rf, ok := ret.Get(1).(func(kvstorage.Type, string) error); ok { + r1 = rf(storageType, key) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransaction provides a mock function with given fields: txid +func (_m *MockGatewayer) GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) { + ret := _m.Called(txid) + + var r0 *visor.Transaction + if rf, ok := ret.Get(0).(func(cipher.SHA256) *visor.Transaction); ok { + r0 = rf(txid) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*visor.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(cipher.SHA256) error); ok { + r1 = rf(txid) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransactionWithInputs provides a mock function with given fields: txid +func (_m *MockGatewayer) GetTransactionWithInputs(txid cipher.SHA256) (*visor.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(txid) + + var r0 *visor.Transaction + if rf, ok := ret.Get(0).(func(cipher.SHA256) *visor.Transaction); ok { + r0 = rf(txid) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*visor.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(cipher.SHA256) []visor.TransactionInput); ok { + r1 = rf(txid) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(cipher.SHA256) error); ok { + r2 = rf(txid) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetTransactions provides a mock function with given fields: flts +func (_m *MockGatewayer) GetTransactions(flts []visor.TxFilter) ([]visor.Transaction, error) { + ret := _m.Called(flts) + + var r0 []visor.Transaction + if rf, ok := ret.Get(0).(func([]visor.TxFilter) []visor.Transaction); ok { + r0 = rf(flts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]visor.TxFilter) error); ok { + r1 = rf(flts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransactionsWithInputs provides a mock function with given fields: flts +func (_m *MockGatewayer) GetTransactionsWithInputs(flts []visor.TxFilter) ([]visor.Transaction, [][]visor.TransactionInput, error) { + ret := _m.Called(flts) + + var r0 []visor.Transaction + if rf, ok := ret.Get(0).(func([]visor.TxFilter) []visor.Transaction); ok { + r0 = rf(flts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.Transaction) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func([]visor.TxFilter) [][]visor.TransactionInput); ok { + r1 = rf(flts) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func([]visor.TxFilter) error); ok { + r2 = rf(flts) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetTrustConnections provides a mock function with given fields: +func (_m *MockGatewayer) GetTrustConnections() []string { + ret := _m.Called() + + var r0 []string + if rf, ok := ret.Get(0).(func() []string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + return r0 +} + +// GetUnspentOutputsSummary provides a mock function with given fields: filters +func (_m *MockGatewayer) GetUnspentOutputsSummary(filters []visor.OutputsFilter) (*visor.UnspentOutputsSummary, error) { + ret := _m.Called(filters) + + var r0 *visor.UnspentOutputsSummary + if rf, ok := ret.Get(0).(func([]visor.OutputsFilter) *visor.UnspentOutputsSummary); ok { + r0 = rf(filters) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*visor.UnspentOutputsSummary) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]visor.OutputsFilter) error); ok { + r1 = rf(filters) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUxOutByID provides a mock function with given fields: id +func (_m *MockGatewayer) GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) { + ret := _m.Called(id) + + var r0 *historydb.UxOut + if rf, ok := ret.Get(0).(func(cipher.SHA256) *historydb.UxOut); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*historydb.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(cipher.SHA256) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetVerboseTransactionsForAddress provides a mock function with given fields: a +func (_m *MockGatewayer) GetVerboseTransactionsForAddress(a cipher.Address) ([]visor.Transaction, [][]visor.TransactionInput, error) { + ret := _m.Called(a) + + var r0 []visor.Transaction + if rf, ok := ret.Get(0).(func(cipher.Address) []visor.Transaction); ok { + r0 = rf(a) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.Transaction) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(cipher.Address) [][]visor.TransactionInput); ok { + r1 = rf(a) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(cipher.Address) error); ok { + r2 = rf(a) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetWallet provides a mock function with given fields: wltID +func (_m *MockGatewayer) GetWallet(wltID string) (wallet.Wallet, error) { + ret := _m.Called(wltID) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string) wallet.Wallet); ok { + r0 = rf(wltID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(wltID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetWalletBalance provides a mock function with given fields: wltID +func (_m *MockGatewayer) GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalances, error) { + ret := _m.Called(wltID) + + var r0 wallet.BalancePair + if rf, ok := ret.Get(0).(func(string) wallet.BalancePair); ok { + r0 = rf(wltID) + } else { + r0 = ret.Get(0).(wallet.BalancePair) + } + + var r1 wallet.AddressBalances + if rf, ok := ret.Get(1).(func(string) wallet.AddressBalances); ok { + r1 = rf(wltID) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(wallet.AddressBalances) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string) error); ok { + r2 = rf(wltID) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetWalletSeed provides a mock function with given fields: wltID, password +func (_m *MockGatewayer) GetWalletSeed(wltID string, password []byte) (string, string, error) { + ret := _m.Called(wltID, password) + + var r0 string + if rf, ok := ret.Get(0).(func(string, []byte) string); ok { + r0 = rf(wltID, password) + } else { + r0 = ret.Get(0).(string) + } + + var r1 string + if rf, ok := ret.Get(1).(func(string, []byte) string); ok { + r1 = rf(wltID, password) + } else { + r1 = ret.Get(1).(string) + } + + var r2 error + if rf, ok := ret.Get(2).(func(string, []byte) error); ok { + r2 = rf(wltID, password) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetWalletUnconfirmedTransactions provides a mock function with given fields: wltID +func (_m *MockGatewayer) GetWalletUnconfirmedTransactions(wltID string) ([]visor.UnconfirmedTransaction, error) { + ret := _m.Called(wltID) + + var r0 []visor.UnconfirmedTransaction + if rf, ok := ret.Get(0).(func(string) []visor.UnconfirmedTransaction); ok { + r0 = rf(wltID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.UnconfirmedTransaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(wltID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetWalletUnconfirmedTransactionsVerbose provides a mock function with given fields: wltID +func (_m *MockGatewayer) GetWalletUnconfirmedTransactionsVerbose(wltID string) ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) { + ret := _m.Called(wltID) + + var r0 []visor.UnconfirmedTransaction + if rf, ok := ret.Get(0).(func(string) []visor.UnconfirmedTransaction); ok { + r0 = rf(wltID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.UnconfirmedTransaction) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(string) [][]visor.TransactionInput); ok { + r1 = rf(wltID) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string) error); ok { + r2 = rf(wltID) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetWallets provides a mock function with given fields: +func (_m *MockGatewayer) GetWallets() (wallet.Wallets, error) { + ret := _m.Called() + + var r0 wallet.Wallets + if rf, ok := ret.Get(0).(func() wallet.Wallets); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallets) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// HeadBkSeq provides a mock function with given fields: +func (_m *MockGatewayer) HeadBkSeq() (uint64, bool, error) { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 bool + if rf, ok := ret.Get(1).(func() bool); ok { + r1 = rf() + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func() error); ok { + r2 = rf() + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// InjectBroadcastTransaction provides a mock function with given fields: txn +func (_m *MockGatewayer) InjectBroadcastTransaction(txn coin.Transaction) error { + ret := _m.Called(txn) + + var r0 error + if rf, ok := ret.Get(0).(func(coin.Transaction) error); ok { + r0 = rf(txn) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// InjectTransaction provides a mock function with given fields: txn +func (_m *MockGatewayer) InjectTransaction(txn coin.Transaction) error { + ret := _m.Called(txn) + + var r0 error + if rf, ok := ret.Get(0).(func(coin.Transaction) error); ok { + r0 = rf(txn) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// NewAddresses provides a mock function with given fields: wltID, password, n +func (_m *MockGatewayer) NewAddresses(wltID string, password []byte, n uint64) ([]cipher.Address, error) { + ret := _m.Called(wltID, password, n) + + var r0 []cipher.Address + if rf, ok := ret.Get(0).(func(string, []byte, uint64) []cipher.Address); ok { + r0 = rf(wltID, password, n) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.Address) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, []byte, uint64) error); ok { + r1 = rf(wltID, password, n) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RecoverWallet provides a mock function with given fields: wltID, seed, seedPassphrase, password +func (_m *MockGatewayer) RecoverWallet(wltID string, seed string, seedPassphrase string, password []byte) (wallet.Wallet, error) { + ret := _m.Called(wltID, seed, seedPassphrase, password) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string, string, string, []byte) wallet.Wallet); ok { + r0 = rf(wltID, seed, seedPassphrase, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string, []byte) error); ok { + r1 = rf(wltID, seed, seedPassphrase, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RemoveStorageValue provides a mock function with given fields: storageType, key +func (_m *MockGatewayer) RemoveStorageValue(storageType kvstorage.Type, key string) error { + ret := _m.Called(storageType, key) + + var r0 error + if rf, ok := ret.Get(0).(func(kvstorage.Type, string) error); ok { + r0 = rf(storageType, key) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ResendUnconfirmedTxns provides a mock function with given fields: +func (_m *MockGatewayer) ResendUnconfirmedTxns() ([]cipher.SHA256, error) { + ret := _m.Called() + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func() []cipher.SHA256); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StartedAt provides a mock function with given fields: +func (_m *MockGatewayer) StartedAt() time.Time { + ret := _m.Called() + + var r0 time.Time + if rf, ok := ret.Get(0).(func() time.Time); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(time.Time) + } + + return r0 +} + +// UnloadWallet provides a mock function with given fields: wltID +func (_m *MockGatewayer) UnloadWallet(wltID string) error { + ret := _m.Called(wltID) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(wltID) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// UpdateWalletLabel provides a mock function with given fields: wltID, label +func (_m *MockGatewayer) UpdateWalletLabel(wltID string, label string) error { + ret := _m.Called(wltID, label) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string) error); ok { + r0 = rf(wltID, label) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// VerifyTxnVerbose provides a mock function with given fields: txn, signed +func (_m *MockGatewayer) VerifyTxnVerbose(txn *coin.Transaction, signed visor.TxnSignedFlag) ([]visor.TransactionInput, bool, error) { + ret := _m.Called(txn, signed) + + var r0 []visor.TransactionInput + if rf, ok := ret.Get(0).(func(*coin.Transaction, visor.TxnSignedFlag) []visor.TransactionInput); ok { + r0 = rf(txn, signed) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.TransactionInput) + } + } + + var r1 bool + if rf, ok := ret.Get(1).(func(*coin.Transaction, visor.TxnSignedFlag) bool); ok { + r1 = rf(txn, signed) + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func(*coin.Transaction, visor.TxnSignedFlag) error); ok { + r2 = rf(txn, signed) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// VisorConfig provides a mock function with given fields: +func (_m *MockGatewayer) VisorConfig() visor.Config { + ret := _m.Called() + + var r0 visor.Config + if rf, ok := ret.Get(0).(func() visor.Config); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(visor.Config) + } + + return r0 +} + +// WalletCreateTransaction provides a mock function with given fields: wltID, p, wp +func (_m *MockGatewayer) WalletCreateTransaction(wltID string, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(wltID, p, wp) + + var r0 *coin.Transaction + if rf, ok := ret.Get(0).(func(string, transaction.Params, visor.CreateTransactionParams) *coin.Transaction); ok { + r0 = rf(wltID, p, wp) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(string, transaction.Params, visor.CreateTransactionParams) []visor.TransactionInput); ok { + r1 = rf(wltID, p, wp) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string, transaction.Params, visor.CreateTransactionParams) error); ok { + r2 = rf(wltID, p, wp) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// WalletCreateTransactionSigned provides a mock function with given fields: wltID, password, p, wp +func (_m *MockGatewayer) WalletCreateTransactionSigned(wltID string, password []byte, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(wltID, password, p, wp) + + var r0 *coin.Transaction + if rf, ok := ret.Get(0).(func(string, []byte, transaction.Params, visor.CreateTransactionParams) *coin.Transaction); ok { + r0 = rf(wltID, password, p, wp) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(string, []byte, transaction.Params, visor.CreateTransactionParams) []visor.TransactionInput); ok { + r1 = rf(wltID, password, p, wp) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string, []byte, transaction.Params, visor.CreateTransactionParams) error); ok { + r2 = rf(wltID, password, p, wp) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// WalletDir provides a mock function with given fields: +func (_m *MockGatewayer) WalletDir() (string, error) { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WalletSignTransaction provides a mock function with given fields: wltID, password, txn, signIndexes +func (_m *MockGatewayer) WalletSignTransaction(wltID string, password []byte, txn *coin.Transaction, signIndexes []int) (*coin.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(wltID, password, txn, signIndexes) + + var r0 *coin.Transaction + if rf, ok := ret.Get(0).(func(string, []byte, *coin.Transaction, []int) *coin.Transaction); ok { + r0 = rf(wltID, password, txn, signIndexes) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(string, []byte, *coin.Transaction, []int) []visor.TransactionInput); ok { + r1 = rf(wltID, password, txn, signIndexes) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string, []byte, *coin.Transaction, []int) error); ok { + r2 = rf(wltID, password, txn, signIndexes) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/network.go b/vendor/github.com/SkycoinProject/skycoin/src/api/network.go new file mode 100644 index 00000000..7d3a33ae --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/network.go @@ -0,0 +1,228 @@ +package api + +// APIs for network-related information + +import ( + "fmt" + "net/http" + "sort" + "strconv" + "strings" + + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +// connectionHandler returns a specific connection +// URI: /api/v1/network/connections +// Method: GET +// Args: +// addr - An IP:Port string +func connectionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("addr") + if addr == "" { + wh.Error400(w, "addr is required") + return + } + + c, err := gateway.GetConnection(addr) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if c == nil { + wh.Error404(w, "") + return + } + + wh.SendJSONOr500(logger, w, readable.NewConnection(c)) + } +} + +// Connections wraps []Connection +type Connections struct { + Connections []readable.Connection `json:"connections"` +} + +// NewConnections copies []daemon.Connection to a struct with json tags +func NewConnections(dconns []daemon.Connection) Connections { + conns := make([]readable.Connection, len(dconns)) + for i, dc := range dconns { + conns[i] = readable.NewConnection(&dc) + } + + return Connections{ + Connections: conns, + } +} + +// connectionsHandler returns all outgoing connections +// URI: /api/v1/network/connections +// Method: GET +// Args: +// states: [optional] comma-separated list of connection states ("pending", "connected" or "introduced"). Defaults to "connected,introduced" +// direction: [optional] "outgoing" or "incoming". If not provided, both are included. +func connectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + formStates := r.FormValue("states") + statesMap := make(map[daemon.ConnectionState]struct{}, 3) + if formStates != "" { + states := strings.Split(formStates, ",") + for _, s := range states { + switch daemon.ConnectionState(s) { + case daemon.ConnectionStatePending, + daemon.ConnectionStateConnected, + daemon.ConnectionStateIntroduced: + statesMap[daemon.ConnectionState(s)] = struct{}{} + default: + wh.Error400(w, fmt.Sprintf("Invalid state in states. Valid states are %q, %q or %q", daemon.ConnectionStatePending, daemon.ConnectionStateConnected, daemon.ConnectionStateIntroduced)) + return + } + } + } + + // "connected" and "introduced" are the defaults, if not specified + if len(statesMap) == 0 { + statesMap[daemon.ConnectionStateConnected] = struct{}{} + statesMap[daemon.ConnectionStateIntroduced] = struct{}{} + } + + direction := r.FormValue("direction") + switch direction { + case "incoming", "outgoing", "": + default: + wh.Error400(w, "Invalid direction. Valid directions are \"outgoing\" or \"incoming\"") + return + } + + conns, err := gateway.GetConnections(func(c daemon.Connection) bool { + switch direction { + case "outgoing": + if !c.Outgoing { + return false + } + case "incoming": + if c.Outgoing { + return false + } + } + + if _, ok := statesMap[c.State]; !ok { + return false + } + + return true + }) + + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, NewConnections(conns)) + } +} + +// defaultConnectionsHandler returns the list of default hardcoded bootstrap addresses. +// They are not necessarily connected to. +// URI: /api/v1/network/defaultConnections +// Method: GET +func defaultConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetDefaultConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +// trustConnectionsHandler returns all trusted connections +// In the default configuration, these will be a subset of the default hardcoded bootstrap addresses +// URI: /api/v1/network/trust +// Method: GET +func trustConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetTrustConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +// exchgConnectionsHandler returns all connections found through peer exchange +// URI: /api/v1/network/exchange +// Method: GET +func exchgConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetExchgConnection() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +// disconnectHandler disconnects a connection by ID or address +// URI: /api/v1/network/connection/disconnect +// Method: POST +// Args: +// id: ID of the connection +func disconnectHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + formID := r.FormValue("id") + if formID == "" { + wh.Error400(w, "id is required") + return + } + + id, err := strconv.ParseUint(formID, 10, 64) + if err != nil || id == 0 { // gnet IDs are non-zero + wh.Error400(w, "invalid id") + return + } + + if err := gateway.DisconnectByGnetID(uint64(id)); err != nil { + switch err { + case daemon.ErrConnectionNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, struct{}{}) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/network_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/network_test.go new file mode 100644 index 00000000..c474aa4d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/network_test.go @@ -0,0 +1,630 @@ +package api + +import ( + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +func TestConnection(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + addr string + gatewayGetConnectionResult *daemon.Connection + gatewayGetConnectionError error + result *readable.Connection + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty addr", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addr is required", + addr: "", + gatewayGetConnectionResult: nil, + result: nil, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + addr: "addr", + gatewayGetConnectionResult: &daemon.Connection{ + Addr: "127.0.0.1:6061", + Gnet: daemon.GnetConnectionDetails{ + ID: 1, + LastSent: time.Unix(99999, 0), + LastReceived: time.Unix(1111111, 0), + }, + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + ConnectedAt: time.Unix(222222, 0), + State: daemon.ConnectionStateIntroduced, + Mirror: 6789, + ListenPort: 9877, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + }, + Pex: pex.Peer{ + Trusted: false, + }, + }, + result: &readable.Connection{ + Addr: "127.0.0.1:6061", + GnetID: 1, + LastSent: 99999, + LastReceived: 1111111, + ConnectedAt: 222222, + Outgoing: true, + State: daemon.ConnectionStateIntroduced, + Mirror: 6789, + ListenPort: 9877, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + IsTrustedPeer: false, + }, + }, + + { + name: "500 - GetConnection failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetConnection failed", + addr: "addr", + gatewayGetConnectionError: errors.New("GetConnection failed"), + }, + + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + addr: "addr", + err: "404 Not Found", + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connection" + gateway := &MockGatewayer{} + gateway.On("GetConnection", tc.addr).Return(tc.gatewayGetConnectionResult, tc.gatewayGetConnectionError) + + v := url.Values{} + if tc.addr != "" { + v.Add("addr", tc.addr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *readable.Connection + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestConnections(t *testing.T) { + intrOut := daemon.Connection{ + Addr: "127.0.0.1:6061", + Gnet: daemon.GnetConnectionDetails{ + ID: 1, + LastSent: time.Unix(99999, 0), + LastReceived: time.Unix(1111111, 0), + }, + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + State: daemon.ConnectionStateIntroduced, + ConnectedAt: time.Unix(222222, 0), + Mirror: 9876, + ListenPort: 9877, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + }, + Pex: pex.Peer{ + Trusted: true, + }, + } + + intrIn := daemon.Connection{ + Addr: "127.0.0.2:6062", + Gnet: daemon.GnetConnectionDetails{ + ID: 2, + LastSent: time.Unix(99999, 0), + LastReceived: time.Unix(1111111, 0), + }, + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: false, + State: daemon.ConnectionStateIntroduced, + ConnectedAt: time.Unix(222222, 0), + Mirror: 9877, + ListenPort: 9879, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + }, + } + + readIntrOut := readable.Connection{ + Addr: "127.0.0.1:6061", + GnetID: 1, + LastSent: 99999, + LastReceived: 1111111, + ConnectedAt: 222222, + Outgoing: true, + State: daemon.ConnectionStateIntroduced, + Mirror: 9876, + ListenPort: 9877, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + IsTrustedPeer: true, + } + + readIntrIn := readable.Connection{ + Addr: "127.0.0.2:6062", + GnetID: 2, + LastSent: 99999, + LastReceived: 1111111, + ConnectedAt: 222222, + Outgoing: false, + State: daemon.ConnectionStateIntroduced, + Mirror: 9877, + ListenPort: 9879, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + IsTrustedPeer: false, + } + + conns := []daemon.Connection{intrOut, intrIn} + readConns := []readable.Connection{readIntrOut, readIntrIn} + + tt := []struct { + name string + method string + status int + states string + direction string + err string + gatewayGetSolicitedConnectionsResult []daemon.Connection + gatewayGetSolicitedConnectionsError error + result Connections + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "200 defaults", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 incoming", + method: http.MethodGet, + status: http.StatusOK, + direction: "incoming", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 outgoing", + method: http.MethodGet, + status: http.StatusOK, + direction: "outgoing", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 pending,connected", + method: http.MethodGet, + status: http.StatusOK, + states: "pending,connected", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 pending,connected outgoing", + method: http.MethodGet, + status: http.StatusOK, + states: "pending,connected", + direction: "outgoing", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 pending,introduced,connected", + method: http.MethodGet, + status: http.StatusOK, + states: "pending,introduced,connected", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "400 - bad state", + method: http.MethodGet, + status: http.StatusBadRequest, + states: "pending,foo", + err: "400 Bad Request - Invalid state in states. Valid states are \"pending\", \"connected\" or \"introduced\"", + }, + + { + name: "400 - bad direction", + method: http.MethodGet, + status: http.StatusBadRequest, + direction: "foo", + err: "400 Bad Request - Invalid direction. Valid directions are \"outgoing\" or \"incoming\"", + }, + + { + name: "500 - GetConnections failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetConnections failed", + gatewayGetSolicitedConnectionsError: errors.New("GetConnections failed"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections" + gateway := &MockGatewayer{} + gateway.On("GetConnections", mock.Anything).Return(tc.gatewayGetSolicitedConnectionsResult, tc.gatewayGetSolicitedConnectionsError) + + v := url.Values{} + if tc.states != "" { + v.Add("states", tc.states) + } + if tc.direction != "" { + v.Add("direction", tc.direction) + } + + endpoint += "?" + v.Encode() + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Connections + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestDefaultConnections(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetDefaultConnectionsResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetDefaultConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/defaultConnections" + gateway := &MockGatewayer{} + gateway.On("GetDefaultConnections").Return(tc.gatewayGetDefaultConnectionsResult) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetTrustConnections(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetTrustConnectionsResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetTrustConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections/trust" + gateway := &MockGatewayer{} + gateway.On("GetTrustConnections").Return(tc.gatewayGetTrustConnectionsResult) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetExchgConnection(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetExchgConnectionResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetExchgConnectionResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections/exchange" + gateway := &MockGatewayer{} + gateway.On("GetExchgConnection").Return(tc.gatewayGetExchgConnectionResult) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestDisconnect(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + disconnectErr error + id string + gnetID uint64 + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "400 missing ID", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - id is required", + }, + + { + name: "400 invalid ID 0", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid id", + id: "0", + }, + + { + name: "400 invalid ID negative", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid id", + id: "-100", + }, + + { + name: "404 Disconnect connection not found", + method: http.MethodPost, + status: http.StatusNotFound, + err: "404 Not Found", + disconnectErr: daemon.ErrConnectionNotExist, + id: "100", + gnetID: 100, + }, + + { + name: "500 Disconnect error", + method: http.MethodPost, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - foo", + disconnectErr: errors.New("foo"), + id: "100", + gnetID: 100, + }, + + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + id: "100", + gnetID: 100, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("DisconnectByGnetID", tc.gnetID).Return(tc.disconnectErr) + + endpoint := "/api/v1/network/connection/disconnect" + v := url.Values{} + if tc.id != "" { + v.Add("id", tc.id) + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var obj struct{} + err = json.Unmarshal(rr.Body.Bytes(), &obj) + require.NoError(t, err) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/outputs.go b/vendor/github.com/SkycoinProject/skycoin/src/api/outputs.go new file mode 100644 index 00000000..db6288db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/outputs.go @@ -0,0 +1,77 @@ +package api + +import ( + "fmt" + "net/http" + + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// outputsHandler returns UxOuts filtered by a set of addresses or a set of hashes +// URI: /api/v1/outputs +// Method: GET, POST +// Args: +// addrs: comma-separated list of addresses +// hashes: comma-separated list of uxout hashes +// If neither addrs nor hashes are specificed, return all unspent outputs. +// If only one filter is specified, then return outputs match the filter. +// Both filters cannot be specified. +func outputsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + addrStr := r.FormValue("addrs") + hashStr := r.FormValue("hashes") + + if addrStr != "" && hashStr != "" { + wh.Error400(w, "addrs and hashes cannot be specified together") + return + } + + var filters []visor.OutputsFilter + + if addrStr != "" { + addrs, err := parseAddressesFromStr(addrStr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if len(addrs) > 0 { + filters = append(filters, visor.FbyAddresses(addrs)) + } + } + + if hashStr != "" { + hashes, err := parseHashesFromStr(hashStr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if len(hashes) > 0 { + filters = append(filters, visor.FbyHashes(hashes)) + } + } + + summary, err := gateway.GetUnspentOutputsSummary(filters) + if err != nil { + err = fmt.Errorf("gateway.GetUnspentOutputsSummary failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + rSummary, err := readable.NewUnspentOutputsSummary(summary) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rSummary) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/outputs_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/outputs_test.go new file mode 100644 index 00000000..ca7f36dc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/outputs_test.go @@ -0,0 +1,162 @@ +package api + +import ( + "encoding/json" + "errors" + "io" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func TestGetOutputsHandler(t *testing.T) { + validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" + invalidAddr := "invalidAddr" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + + type httpBody struct { + addrs string + hashStr string + } + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getUnspentOutputsResponse *visor.UnspentOutputsSummary + getUnspentOutputsError error + httpResponse *readable.UnspentOutputsSummary + }{ + { + name: "405", + method: http.MethodDelete, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - addrs and hashes together", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs and hashes cannot be specified together", + httpBody: &httpBody{ + addrs: validAddr, + hashStr: validHash, + }, + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address \"invalidAddr\" is invalid: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddr, + }, + }, + { + name: "500 - getUnspentOutputsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputsSummary failed: getUnspentOutputsError", + getUnspentOutputsResponse: nil, + getUnspentOutputsError: errors.New("getUnspentOutputsError"), + }, + { + name: "200 - OK", + method: http.MethodGet, + status: http.StatusOK, + getUnspentOutputsResponse: &visor.UnspentOutputsSummary{ + HeadBlock: &coin.SignedBlock{}, + }, + httpResponse: &readable.UnspentOutputsSummary{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + HeadOutputs: readable.UnspentOutputs{}, + OutgoingOutputs: readable.UnspentOutputs{}, + IncomingOutputs: readable.UnspentOutputs{}, + }, + }, + { + name: "200 - OK POST", + method: http.MethodPost, + status: http.StatusOK, + getUnspentOutputsResponse: &visor.UnspentOutputsSummary{ + HeadBlock: &coin.SignedBlock{}, + }, + httpResponse: &readable.UnspentOutputsSummary{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + HeadOutputs: readable.UnspentOutputs{}, + OutgoingOutputs: readable.UnspentOutputs{}, + IncomingOutputs: readable.UnspentOutputs{}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + endpoint := "/api/v1/outputs" + gateway.On("GetUnspentOutputsSummary", mock.Anything).Return(tc.getUnspentOutputsResponse, tc.getUnspentOutputsError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.hashStr != "" { + v.Add("hashes", tc.httpBody.hashStr) + } + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + } + + var reqBody io.Reader + if len(v) > 0 { + if tc.method == http.MethodPost { + reqBody = strings.NewReader(v.Encode()) + } else { + endpoint += "?" + v.Encode() + } + } + + req, err := http.NewRequest(tc.method, endpoint, reqBody) + require.NoError(t, err) + + if tc.method == http.MethodPost { + req.Header.Set("Content-Type", ContentTypeForm) + } + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + var msg *readable.UnspentOutputsSummary + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/spend.go b/vendor/github.com/SkycoinProject/skycoin/src/api/spend.go new file mode 100644 index 00000000..94bd61b0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/spend.go @@ -0,0 +1,748 @@ +package api + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + + "github.com/shopspring/decimal" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/fee" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// CreateTransactionResponse is returned by /wallet/transaction +type CreateTransactionResponse struct { + Transaction CreatedTransaction `json:"transaction"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// NewCreateTransactionResponse creates a CreateTransactionResponse +func NewCreateTransactionResponse(txn *coin.Transaction, inputs []visor.TransactionInput) (*CreateTransactionResponse, error) { + cTxn, err := NewCreatedTransaction(txn, inputs) + if err != nil { + return nil, err + } + + txnHex, err := txn.SerializeHex() + if err != nil { + return nil, err + } + + return &CreateTransactionResponse{ + Transaction: *cTxn, + EncodedTransaction: txnHex, + }, nil +} + +// CreatedTransaction represents a transaction created by /wallet/transaction +type CreatedTransaction struct { + Length uint32 `json:"length"` + Type uint8 `json:"type"` + TxID string `json:"txid"` + InnerHash string `json:"inner_hash"` + Fee string `json:"fee"` + + Sigs []string `json:"sigs"` + In []CreatedTransactionInput `json:"inputs"` + Out []CreatedTransactionOutput `json:"outputs"` +} + +// NewCreatedTransaction returns a CreatedTransaction +func NewCreatedTransaction(txn *coin.Transaction, inputs []visor.TransactionInput) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + for _, o := range txn.Out { + var err error + outputHours, err = mathutil.AddUint64(outputHours, o.Hours) + if err != nil { + return nil, err + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = mathutil.AddUint64(inputHours, i.CalculatedHours) + if err != nil { + return nil, err + } + } + + if inputHours < outputHours { + return nil, errors.New("inputHours unexpectedly less than output hours") + } + + fee := inputHours - outputHours + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txID := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txID) + if err != nil { + return nil, err + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(inputs)) + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + return nil, err + } + in[i] = *ci + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txID.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} + +// ToTransaction converts a CreatedTransaction back to a coin.Transaction +func (r *CreatedTransaction) ToTransaction() (*coin.Transaction, error) { + t := coin.Transaction{} + + t.Length = r.Length + t.Type = r.Type + + var err error + t.InnerHash, err = cipher.SHA256FromHex(r.InnerHash) + if err != nil { + return nil, err + } + + sigs := make([]cipher.Sig, len(r.Sigs)) + for i, s := range r.Sigs { + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + + t.Sigs = sigs + + in := make([]cipher.SHA256, len(r.In)) + for i, n := range r.In { + in[i], err = cipher.SHA256FromHex(n.UxID) + if err != nil { + return nil, err + } + } + + t.In = in + + out := make([]coin.TransactionOutput, len(r.Out)) + for i, o := range r.Out { + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return nil, err + } + + coins, err := droplet.FromString(o.Coins) + if err != nil { + return nil, err + } + + hours, err := strconv.ParseUint(o.Hours, 10, 64) + if err != nil { + return nil, err + } + + out[i] = coin.TransactionOutput{ + Address: addr, + Coins: coins, + Hours: hours, + } + } + + t.Out = out + + hash, err := cipher.SHA256FromHex(r.TxID) + if err != nil { + return nil, err + } + + if t.Hash() != hash { + return nil, fmt.Errorf("readable.Transaction.Hash %s does not match parsed transaction hash %s", t.Hash().Hex(), hash.Hex()) + } + + return &t, nil +} + +// CreatedTransactionOutput is a transaction output +type CreatedTransactionOutput struct { + UxID string `json:"uxid"` + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours"` +} + +// NewCreatedTransactionOutput creates CreatedTransactionOutput +func NewCreatedTransactionOutput(out coin.TransactionOutput, txid cipher.SHA256) (*CreatedTransactionOutput, error) { + coins, err := droplet.ToString(out.Coins) + if err != nil { + return nil, err + } + + return &CreatedTransactionOutput{ + UxID: out.UxID(txid).Hex(), + Address: out.Address.String(), + Coins: coins, + Hours: fmt.Sprint(out.Hours), + }, nil +} + +// CreatedTransactionInput is a verbose transaction input +type CreatedTransactionInput struct { + UxID string `json:"uxid"` + Address string `json:"address,omitempty"` + Coins string `json:"coins,omitempty"` + Hours string `json:"hours,omitempty"` + CalculatedHours string `json:"calculated_hours,omitempty"` + Time uint64 `json:"timestamp,omitempty"` + Block uint64 `json:"block,omitempty"` + TxID string `json:"txid,omitempty"` +} + +// NewCreatedTransactionInput creates CreatedTransactionInput +func NewCreatedTransactionInput(out visor.TransactionInput) (*CreatedTransactionInput, error) { + coins, err := droplet.ToString(out.UxOut.Body.Coins) + if err != nil { + return nil, err + } + + if out.UxOut.Body.SrcTransaction.Null() { + return nil, errors.New("NewCreatedTransactionInput UxOut.SrcTransaction is not initialized") + } + + addr := out.UxOut.Body.Address.String() + hours := fmt.Sprint(out.UxOut.Body.Hours) + calculatedHours := fmt.Sprint(out.CalculatedHours) + txID := out.UxOut.Body.SrcTransaction.Hex() + + return &CreatedTransactionInput{ + UxID: out.UxOut.Hash().Hex(), + Address: addr, + Coins: coins, + Hours: hours, + CalculatedHours: calculatedHours, + Time: out.UxOut.Head.Time, + Block: out.UxOut.Head.BkSeq, + TxID: txID, + }, nil +} + +// createTransactionRequest is sent to POST /api/v2/transaction +type createTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection hoursSelection `json:"hours_selection"` + ChangeAddress *wh.Address `json:"change_address,omitempty"` + To []receiver `json:"to"` + UxOuts []wh.SHA256 `json:"unspents,omitempty"` + Addresses []wh.Address `json:"addresses,omitempty"` +} + +// hoursSelection defines options for hours distribution +type hoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor *decimal.Decimal `json:"share_factor,omitempty"` +} + +// receiver specifies a spend destination +type receiver struct { + Address wh.Address `json:"address"` + Coins wh.Coins `json:"coins"` + Hours *wh.Hours `json:"hours,omitempty"` +} + +// Validate validates createTransactionRequest data +func (r createTransactionRequest) Validate() error { + if r.ChangeAddress != nil && r.ChangeAddress.Null() { + return errors.New("change_address must not be the null address") + } + + switch r.HoursSelection.Type { + case transaction.HoursSelectionTypeAuto: + for i, to := range r.To { + if to.Hours != nil { + return fmt.Errorf("to[%d].hours must not be specified for auto hours_selection.mode", i) + } + } + + switch r.HoursSelection.Mode { + case transaction.HoursSelectionModeShare: + case "": + return errors.New("missing hours_selection.mode") + default: + return errors.New("invalid hours_selection.mode") + } + + case transaction.HoursSelectionTypeManual: + for i, to := range r.To { + if to.Hours == nil { + return fmt.Errorf("to[%d].hours must be specified for manual hours_selection.mode", i) + } + } + + if r.HoursSelection.Mode != "" { + return errors.New("hours_selection.mode cannot be used for manual hours_selection.type") + } + + case "": + return errors.New("missing hours_selection.type") + default: + return errors.New("invalid hours_selection.type") + } + + if r.HoursSelection.ShareFactor == nil { + if r.HoursSelection.Mode == transaction.HoursSelectionModeShare { + return errors.New("missing hours_selection.share_factor when hours_selection.mode is share") + } + } else { + if r.HoursSelection.Mode != transaction.HoursSelectionModeShare { + return errors.New("hours_selection.share_factor can only be used when hours_selection.mode is share") + } + + switch { + case r.HoursSelection.ShareFactor.LessThan(decimal.New(0, 0)): + return errors.New("hours_selection.share_factor cannot be negative") + case r.HoursSelection.ShareFactor.GreaterThan(decimal.New(1, 0)): + return errors.New("hours_selection.share_factor cannot be more than 1") + } + } + + if len(r.UxOuts) != 0 && len(r.Addresses) != 0 { + return errors.New("unspents and addresses cannot be combined") + } + + addressMap := make(map[cipher.Address]struct{}, len(r.Addresses)) + for i, a := range r.Addresses { + if a.Null() { + return fmt.Errorf("addresses[%d] is empty", i) + } + + if _, ok := addressMap[a.Address]; ok { + return errors.New("addresses contains duplicate values") + } + + addressMap[a.Address] = struct{}{} + } + + // Check for duplicate spending uxouts + uxouts := make(map[cipher.SHA256]struct{}, len(r.UxOuts)) + for _, o := range r.UxOuts { + if _, ok := uxouts[o.SHA256]; ok { + return errors.New("unspents contains duplicate values") + } + + uxouts[o.SHA256] = struct{}{} + } + + if len(r.To) == 0 { + return errors.New("to is empty") + } + + for i, to := range r.To { + if to.Address.Null() { + return fmt.Errorf("to[%d].address is empty", i) + } + + if to.Coins == 0 { + return fmt.Errorf("to[%d].coins must not be zero", i) + } + + if to.Coins.Value()%params.UserVerifyTxn.MaxDropletDivisor() != 0 { + return fmt.Errorf("to[%d].coins has too many decimal places", i) + } + } + + // Check for duplicate created outputs, a transaction can't have outputs with + // the same (address, coins, hours) + // Auto mode would distribute hours to the outputs and could hypothetically + // avoid assigning duplicate hours in many cases, but the complexity for doing + // so is very high, so also reject duplicate (address, coins) for auto mode. + outputs := make(map[coin.TransactionOutput]struct{}, len(r.To)) + for _, to := range r.To { + var hours uint64 + if to.Hours != nil { + hours = to.Hours.Value() + } + + txo := coin.TransactionOutput{ + Address: to.Address.Address, + Coins: to.Coins.Value(), + Hours: hours, + } + + if _, ok := outputs[txo]; ok { + return errors.New("to contains duplicate values") + } + + outputs[txo] = struct{}{} + } + + return nil +} + +// TransactionParams converts createTransactionRequest to transaction.Params +func (r createTransactionRequest) TransactionParams() transaction.Params { + to := make([]coin.TransactionOutput, len(r.To)) + for i, t := range r.To { + var hours uint64 + if t.Hours != nil { + hours = t.Hours.Value() + } + + to[i] = coin.TransactionOutput{ + Address: t.Address.Address, + Coins: t.Coins.Value(), + Hours: hours, + } + } + + var changeAddress *cipher.Address + if r.ChangeAddress != nil { + changeAddress = &r.ChangeAddress.Address + } + + return transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: r.HoursSelection.Type, + Mode: r.HoursSelection.Mode, + ShareFactor: r.HoursSelection.ShareFactor, + }, + ChangeAddress: changeAddress, + To: to, + } +} + +func (r createTransactionRequest) VisorParams() visor.CreateTransactionParams { + return visor.CreateTransactionParams{ + IgnoreUnconfirmed: r.IgnoreUnconfirmed, + Addresses: r.addresses(), + UxOuts: r.uxOuts(), + } +} + +func (r createTransactionRequest) addresses() []cipher.Address { + if len(r.Addresses) == 0 { + return nil + } + addresses := make([]cipher.Address, len(r.Addresses)) + for i, a := range r.Addresses { + addresses[i] = a.Address + } + return addresses +} + +func (r createTransactionRequest) uxOuts() []cipher.SHA256 { + if len(r.UxOuts) == 0 { + return nil + } + uxouts := make([]cipher.SHA256, len(r.UxOuts)) + for i, o := range r.UxOuts { + uxouts[i] = o.SHA256 + } + return uxouts +} + +// transactionHandlerV2 creates a transaction from provided outputs and parameters +// Method: POST +// URI: /api/v2/transaction +// Args: JSON body +func transactionHandlerV2(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req createTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if err := req.Validate(); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + // Check that addresses or unspents are not empty + // This is not checked in Validate() because POST /api/v1/wallet/transaction + // allows both to be empty + if len(req.Addresses) == 0 && len(req.UxOuts) == 0 { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "one of addresses or unspents must not be empty") + writeHTTPResponse(w, resp) + return + } + + txn, inputs, err := gateway.CreateTransaction(req.TransactionParams(), req.VisorParams()) + if err != nil { + var resp HTTPResponse + switch err.(type) { + case blockdb.ErrUnspentNotExist, transaction.Error, visor.UserError, wallet.Error: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + default: + switch err { + case fee.ErrTxnNoFee, fee.ErrTxnInsufficientCoinHours: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + } + writeHTTPResponse(w, resp) + return + } + + txnResp, err := NewCreateTransactionResponse(txn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, fmt.Sprintf("NewCreateTransactionResponse failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: txnResp, + }) + } +} + +// walletCreateTransactionRequest is sent to POST /api/v1/wallet/transaction +type walletCreateTransactionRequest struct { + Unsigned bool `json:"unsigned"` + WalletID string `json:"wallet_id"` + Password string `json:"password"` + createTransactionRequest +} + +// Validate validates walletCreateTransactionRequest data +func (r walletCreateTransactionRequest) Validate() error { + if r.WalletID == "" { + return errors.New("missing wallet_id") + } + + if r.Unsigned && len(r.Password) != 0 { + return errors.New("password must not be used for unsigned transactions") + } + + return r.createTransactionRequest.Validate() +} + +// walletCreateTransactionHandler creates a transaction +// Method: POST +// URI: /api/v1/wallet/transaction +// Args: JSON body +func walletCreateTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + if !isContentTypeJSON(r.Header.Get("Content-Type")) { + wh.Error415(w) + return + } + + var req walletCreateTransactionRequest + err := json.NewDecoder(r.Body).Decode(&req) + if err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + if err := req.Validate(); err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + var txn *coin.Transaction + var inputs []visor.TransactionInput + if req.Unsigned { + txn, inputs, err = gateway.WalletCreateTransaction(req.WalletID, req.TransactionParams(), req.VisorParams()) + } else { + txn, inputs, err = gateway.WalletCreateTransactionSigned(req.WalletID, []byte(req.Password), req.TransactionParams(), req.VisorParams()) + } + if err != nil { + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error400(w, err.Error()) + } + case blockdb.ErrUnspentNotExist, + transaction.Error, + visor.UserError: + wh.Error400(w, err.Error()) + default: + switch err { + case fee.ErrTxnNoFee, + fee.ErrTxnInsufficientCoinHours: + wh.Error400(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + } + return + } + + txnResp, err := NewCreateTransactionResponse(txn, inputs) + if err != nil { + err = fmt.Errorf("NewCreateTransactionResponse failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnResp) + } +} + +// WalletSignTransactionRequest is the request body object for /api/v2/wallet/transaction/sign +type WalletSignTransactionRequest struct { + WalletID string `json:"wallet_id"` + Password string `json:"password"` + EncodedTransaction string `json:"encoded_transaction"` + SignIndexes []int `json:"sign_indexes"` +} + +// walletSignTransactionHandler signs an unsigned transaction +// Method: POST +// URI: /api/v2/wallet/transaction/sign +// Args: JSON body +func walletSignTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req WalletSignTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.WalletID == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "wallet_id is required") + writeHTTPResponse(w, resp) + return + } + + if req.EncodedTransaction == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required") + writeHTTPResponse(w, resp) + return + } + + txn, err := decodeTxn(req.EncodedTransaction) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, fmt.Sprintf("Decode transaction failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + // Check that number of sign_indexes does not exceed number of inputs + if len(req.SignIndexes) > len(txn.In) { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "Too many values in sign_indexes") + writeHTTPResponse(w, resp) + return + } + + // Check that values in sign_indexes are in the range of txn inputs + for _, i := range req.SignIndexes { + if i < 0 || i >= len(txn.In) { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "Value in sign_indexes exceeds range of transaction inputs array") + writeHTTPResponse(w, resp) + return + } + } + + // Check for duplicate values in sign_indexes + signIndexesMap := make(map[int]struct{}, len(req.SignIndexes)) + for _, i := range req.SignIndexes { + if _, ok := signIndexesMap[i]; ok { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "Duplicate value in sign_indexes") + writeHTTPResponse(w, resp) + return + } + signIndexesMap[i] = struct{}{} + } + + signedTxn, inputs, err := gateway.WalletSignTransaction(req.WalletID, []byte(req.Password), txn, req.SignIndexes) + if err != nil { + var resp HTTPResponse + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletNotExist: + resp = NewHTTPErrorResponse(http.StatusNotFound, err.Error()) + case wallet.ErrWalletAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, err.Error()) + default: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + } + case visor.ErrTxnViolatesSoftConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesUserConstraint, + blockdb.ErrUnspentNotExist: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + txnResp, err := NewCreateTransactionResponse(signedTxn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: txnResp, + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/spend_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/spend_test.go new file mode 100644 index 00000000..12c6a925 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/spend_test.go @@ -0,0 +1,2193 @@ +package api + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +type rawHoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor *string `json:"share_factor,omitempty"` +} + +type rawReceiver struct { + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours,omitempty"` +} + +type rawCreateTxnRequest struct { + UxOuts []string `json:"unspents,omitempty"` + Addresses []string `json:"addresses,omitempty"` + HoursSelection rawHoursSelection `json:"hours_selection"` + ChangeAddress string `json:"change_address,omitempty"` + To []rawReceiver `json:"to"` + Password string `json:"password"` +} + +func TestCreateTransaction(t *testing.T) { + changeAddress := testutil.MakeAddress() + destinationAddress := testutil.MakeAddress() + emptyAddress := cipher.Address{} + + txn := &coin.Transaction{ + Length: 100, + Type: 0, + InnerHash: testutil.RandSHA256(t), + In: []cipher.SHA256{testutil.RandSHA256(t)}, + Out: []coin.TransactionOutput{ + { + Address: destinationAddress, + Coins: 1e6, + Hours: 100, + }, + }, + } + + inputs := []visor.TransactionInput{ + { + UxOut: coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }, + CalculatedHours: 200, + }, + } + + createdTxn, err := NewCreatedTransaction(txn, inputs) + require.NoError(t, err) + + createTxnResponse := CreateTransactionResponse{ + Transaction: *createdTxn, + EncodedTransaction: txn.MustSerializeHex(), + } + + validBody := &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + UxOuts: []string{testutil.RandSHA256(t).Hex(), testutil.RandSHA256(t).Hex()}, + } + + walletInput := testutil.RandSHA256(t) + + tt := []struct { + name string + method string + status int + body *rawCreateTxnRequest + rawBody string + + gatewayCreateTransactionResult *coin.Transaction + gatewayCreateTransactionInputs []visor.TransactionInput + gatewayCreateTransactionErr error + + csrfDisabled bool + contentType string + + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + contentType: ContentTypeForm, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 - missing hours selection type", + method: http.MethodPost, + body: &rawCreateTxnRequest{}, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "missing hours_selection.type"), + }, + + { + name: "400 - invalid hours selection type", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: "foo", + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid hours_selection.type"), + }, + + { + name: "400 - missing hours selection mode", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "missing hours_selection.mode"), + }, + + { + name: "400 - invalid hours selection mode", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: "foo", + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid hours_selection.mode"), + }, + + { + name: "400 - missing hours selection share factor", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "missing hours_selection.share_factor when hours_selection.mode is share"), + }, + + { + name: "400 - share factor set but mode is not share", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + ShareFactor: newStrPtr("0.5"), + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "hours_selection.share_factor can only be used when hours_selection.mode is share"), + }, + + { + name: "400 - negative share factor", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("-1"), + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "hours_selection.share_factor cannot be negative"), + }, + + { + name: "400 - share factor greater than 1", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("1.1"), + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "hours_selection.share_factor cannot be more than 1"), + }, + + { + name: "400 - empty sender address", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{""}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid address: Invalid base58 string"), + }, + + { + name: "400 - invalid sender address", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{"xxx"}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid address: Invalid address length"), + }, + + { + name: "400 - invalid change address", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: "xxx", + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid address: Invalid address length"), + }, + + { + name: "400 - empty change address", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: emptyAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "change_address must not be the null address"), + }, + + { + name: "400 - auto type destination has hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Hours: "100", + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].hours must not be specified for auto hours_selection.mode"), + }, + + { + name: "400 - manual type destination missing hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].hours must be specified for manual hours_selection.mode"), + }, + + { + name: "400 - manual type has mode set", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + Mode: transaction.HoursSelectionModeShare, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "hours_selection.mode cannot be used for manual hours_selection.type"), + }, + + { + name: "400 - address is empty", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{emptyAddress.String()}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "addresses[0] is empty"), + }, + + { + name: "400 - to address is empty", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: emptyAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].address is empty"), + }, + + { + name: "400 - to coins is zero", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].coins must not be zero"), + }, + + { + name: "400 - invalid to coins", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1a", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "can't convert 0.1a to decimal"), + }, + + { + name: "400 - invalid to hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1", + Hours: "100.1", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid hours value: strconv.ParseUint: parsing \"100.1\": invalid syntax"), + }, + + { + name: "400 - empty string to coins", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "", + Hours: "", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "can't convert to decimal"), + }, + + { + name: "400 - coins has too many decimals", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.1234", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].coins has too many decimal places"), + }, + + { + name: "400 - empty to", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to is empty"), + }, + + { + name: "400 - manual duplicate outputs", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to contains duplicate values"), + }, + + { + name: "400 - auto duplicate outputs", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to contains duplicate values"), + }, + + { + name: "400 - both uxouts and addresses specified", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + Addresses: []string{destinationAddress.String()}, + UxOuts: []string{walletInput.Hex()}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unspents and addresses cannot be combined"), + }, + + { + name: "400 - missing uxouts and addresses", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "one of addresses or unspents must not be empty"), + }, + + { + name: "400 - duplicate uxouts", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + UxOuts: []string{walletInput.Hex(), walletInput.Hex()}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unspents contains duplicate values"), + }, + + { + name: "400 - duplicate addresses", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + Addresses: []string{destinationAddress.String(), destinationAddress.String()}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "addresses contains duplicate values"), + }, + + { + name: "200 - auto type split even", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{changeAddress.String()}, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: createTxnResponse, + }, + }, + + { + name: "200 - manual type zero hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "0", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{changeAddress.String()}, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: createTxnResponse, + }, + }, + + { + name: "200 - manual type nonzero hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{changeAddress.String()}, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: createTxnResponse, + }, + }, + + { + name: "200 - manual type nonzero hours - csrf disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: createTxnResponse, + }, + csrfDisabled: true, + }, + + { + name: "500 - misc error", + method: http.MethodPost, + body: validBody, + status: http.StatusInternalServerError, + gatewayCreateTransactionErr: errors.New("unhandled error"), + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "unhandled error"), + }, + + { + name: "400 - no fee", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnNoFee, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Transaction has zero coinhour fee"), + }, + + { + name: "400 - insufficient coin hours", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnInsufficientCoinHours, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Insufficient coinhours for transaction outputs"), + }, + + { + name: "400 - uxout doesn't exist", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: blockdb.NewErrUnspentNotExist("foo"), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unspent output of foo does not exist"), + }, + + { + name: "400 - visor error", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: visor.ErrSpendingUnconfirmed, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Please spend after your pending transaction is confirmed"), + }, + + { + name: "400 - txn create error", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: transaction.ErrInsufficientBalance, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "balance is not sufficient"), + }, + + { + name: "400 - invalid json", + method: http.MethodPost, + rawBody: "{ca", + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid character 'c' looking for beginning of object key string"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + + // If the rawRequestBody can be deserialized to CreateTransactionRequest, use it to mock gateway.WalletCreateTransaction + serializedBody, err := json.Marshal(tc.body) + require.NoError(t, err) + var body walletCreateTransactionRequest + err = json.Unmarshal(serializedBody, &body) + if err == nil { + x := gateway.On("CreateTransaction", body.TransactionParams(), body.VisorParams()) + x.Return(tc.gatewayCreateTransactionResult, tc.gatewayCreateTransactionInputs, tc.gatewayCreateTransactionErr) + } + + endpoint := "/api/v2/transaction" + + bodyText := []byte(tc.rawBody) + if len(bodyText) == 0 { + bodyText, err = json.Marshal(tc.body) + require.NoError(t, err) + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBuffer(bodyText)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Add("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v` (%v)", status, tc.status, rr.Body) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var msg CreateTransactionResponse + err := json.Unmarshal(rsp.Data, &msg) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(CreateTransactionResponse), msg) + } + }) + } +} + +func TestWalletCreateTransaction(t *testing.T) { + type rawWalletCreateTxnRequest struct { + rawCreateTxnRequest + WalletID string `json:"wallet_id"` + Password string `json:"password"` + Unsigned bool `json:"unsigned"` + } + + changeAddress := testutil.MakeAddress() + destinationAddress := testutil.MakeAddress() + emptyAddress := cipher.Address{} + + txn := &coin.Transaction{ + Length: 100, + Type: 0, + InnerHash: testutil.RandSHA256(t), + In: []cipher.SHA256{testutil.RandSHA256(t)}, + Out: []coin.TransactionOutput{ + { + Address: destinationAddress, + Coins: 1e6, + Hours: 100, + }, + }, + } + + inputs := []visor.TransactionInput{ + { + UxOut: coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }, + CalculatedHours: 200, + }, + } + + createdTxn, err := NewCreatedTransaction(txn, inputs) + require.NoError(t, err) + + createTxnResponse := &CreateTransactionResponse{ + Transaction: *createdTxn, + EncodedTransaction: txn.MustSerializeHex(), + } + + validBody := rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + } + + walletInput := testutil.RandSHA256(t) + + type testCase struct { + name string + method string + body rawWalletCreateTxnRequest + rawBody string + status int + err string + gatewayCreateTransactionResult *coin.Transaction + gatewayCreateTransactionInputs []visor.TransactionInput + gatewayCreateTransactionErr error + createTransactionResponse *CreateTransactionResponse + csrfDisabled bool + contentType string + } + + baseCases := []testCase{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + body: rawWalletCreateTxnRequest{}, + err: "405 Method Not Allowed", + }, + + { + name: "415", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + body: rawWalletCreateTxnRequest{}, + contentType: ContentTypeForm, + err: "415 Unsupported Media Type", + }, + + { + name: "400 - missing hours selection type", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.type", + }, + + { + name: "400 - invalid hours selection type", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: "foo", + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours_selection.type", + }, + + { + name: "400 - missing hours selection mode", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.mode", + }, + + { + name: "400 - invalid hours selection mode", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: "foo", + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours_selection.mode", + }, + + { + name: "400 - missing hours selection share factor", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.share_factor when hours_selection.mode is share", + }, + + { + name: "400 - share factor set but mode is not share", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + ShareFactor: newStrPtr("0.5"), + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor can only be used when hours_selection.mode is share", + }, + + { + name: "400 - negative share factor", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("-1"), + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor cannot be negative", + }, + + { + name: "400 - share factor greater than 1", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("1.1"), + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor cannot be more than 1", + }, + + { + name: "400 - empty sender address", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: []string{""}, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid base58 string", + }, + + { + name: "400 - invalid sender address", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{"xxx"}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid address length", + }, + + { + name: "400 - invalid change address", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: "xxx", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid address length", + }, + + { + name: "400 - empty change address", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: emptyAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - change_address must not be the null address", + }, + + { + name: "400 - auto type destination has hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Hours: "100", + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].hours must not be specified for auto hours_selection.mode", + }, + + { + name: "400 - manual type destination missing hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].hours must be specified for manual hours_selection.mode", + }, + + { + name: "400 - manual type has mode set", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + Mode: transaction.HoursSelectionModeShare, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.mode cannot be used for manual hours_selection.type", + }, + + { + name: "400 - missing wallet ID", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet_id", + }, + + { + name: "400 - address is empty", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{emptyAddress.String()}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - addresses[0] is empty", + }, + + { + name: "400 - to address is empty", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: emptyAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].address is empty", + }, + + { + name: "400 - to coins is zero", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].coins must not be zero", + }, + + { + name: "400 - invalid to coins", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1a", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - can't convert 0.1a to decimal", + }, + + { + name: "400 - invalid to hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1", + Hours: "100.1", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours value: strconv.ParseUint: parsing \"100.1\": invalid syntax", + }, + + { + name: "400 - empty string to coins", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "", + Hours: "", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - can't convert to decimal", + }, + + { + name: "400 - coins has too many decimals", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.1234", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].coins has too many decimal places", + }, + + { + name: "400 - empty to", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to is empty", + }, + + { + name: "400 - manual duplicate outputs", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to contains duplicate values", + }, + + { + name: "400 - auto duplicate outputs", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to contains duplicate values", + }, + + { + name: "400 - both uxouts and addresses specified", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + Addresses: []string{destinationAddress.String()}, + UxOuts: []string{walletInput.Hex()}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - unspents and addresses cannot be combined", + }, + + { + name: "400 - duplicate uxouts", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + UxOuts: []string{walletInput.Hex(), walletInput.Hex()}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - unspents contains duplicate values", + }, + + { + name: "400 - duplicate addresses", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + Addresses: []string{destinationAddress.String(), destinationAddress.String()}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - addresses contains duplicate values", + }, + + { + name: "200 - auto type split even", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type zero hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "0", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type nonzero hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type nonzero hours - csrf disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + csrfDisabled: true, + }, + + { + name: "500 - misc error", + method: http.MethodPost, + body: validBody, + status: http.StatusInternalServerError, + gatewayCreateTransactionErr: errors.New("unhandled error"), + err: "500 Internal Server Error - unhandled error", + }, + + { + name: "400 - no fee", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnNoFee, + err: "400 Bad Request - Transaction has zero coinhour fee", + }, + + { + name: "400 - insufficient coin hours", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnInsufficientCoinHours, + err: "400 Bad Request - Insufficient coinhours for transaction outputs", + }, + + { + name: "400 - uxout doesn't exist", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: blockdb.NewErrUnspentNotExist("foo"), + err: "400 Bad Request - unspent output of foo does not exist", + }, + + { + name: "400 - invalid json", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{}, + rawBody: "{ca", + status: http.StatusBadRequest, + err: "400 Bad Request - invalid character 'c' looking for beginning of object key string", + }, + + { + name: "400 - other wallet error", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: wallet.ErrWalletEncrypted, + err: "400 Bad Request - wallet is encrypted", + }, + + { + name: "404 - wallet not found", + method: http.MethodPost, + body: validBody, + status: http.StatusNotFound, + gatewayCreateTransactionErr: wallet.ErrWalletNotExist, + err: "404 Not Found - wallet doesn't exist", + }, + + { + name: "403 - wallet API disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusForbidden, + gatewayCreateTransactionErr: wallet.ErrWalletAPIDisabled, + err: "403 Forbidden", + }, + } + + cases := make([]testCase, len(baseCases)*2) + copy(cases, baseCases) + copy(cases[len(baseCases):], baseCases) + for i := range baseCases { + cases[i].body.Unsigned = true + } + + cases = append(cases, testCase{ + name: "400 - password provided for unsigned request", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + Password: "foo", + Unsigned: true, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - password must not be used for unsigned transactions", + }) + + for _, tc := range cases { + name := fmt.Sprintf("unsigned=%v %s", tc.body.Unsigned, tc.name) + t.Run(name, func(t *testing.T) { + gateway := &MockGatewayer{} + + // If the rawRequestBody can be deserialized to CreateTransactionRequest, use it to mock gateway.WalletCreateTransaction + serializedBody, err := json.Marshal(tc.body) + require.NoError(t, err) + var body walletCreateTransactionRequest + err = json.Unmarshal(serializedBody, &body) + if err == nil { + if tc.body.Unsigned { + x := gateway.On("WalletCreateTransaction", body.WalletID, body.TransactionParams(), body.VisorParams()) + x.Return(tc.gatewayCreateTransactionResult, tc.gatewayCreateTransactionInputs, tc.gatewayCreateTransactionErr) + } else { + x := gateway.On("WalletCreateTransactionSigned", body.WalletID, []byte(body.Password), body.TransactionParams(), body.VisorParams()) + x.Return(tc.gatewayCreateTransactionResult, tc.gatewayCreateTransactionInputs, tc.gatewayCreateTransactionErr) + + } + } + + endpoint := "/api/v1/wallet/transaction" + + bodyText := []byte(tc.rawBody) + if len(bodyText) == 0 { + bodyText, err = json.Marshal(tc.body) + require.NoError(t, err) + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBuffer(bodyText)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Add("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + var msg CreateTransactionResponse + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.NotNil(t, tc.createTransactionResponse) + require.Equal(t, *tc.createTransactionResponse, msg) + } + }) + } +} + +func newStrPtr(s string) *string { + return &s +} + +func TestWalletSignTransaction(t *testing.T) { + destinationAddress := testutil.MakeAddress() + + signedTxn := coin.Transaction{ + Length: 100, + Type: 0, + InnerHash: testutil.RandSHA256(t), + Sigs: []cipher.Sig{testutil.RandSig(t), testutil.RandSig(t)}, + In: []cipher.SHA256{testutil.RandSHA256(t), testutil.RandSHA256(t)}, + Out: []coin.TransactionOutput{ + { + Address: destinationAddress, + Coins: 1e6, + Hours: 100, + }, + }, + } + + txn := signedTxn + txn.Sigs = make([]cipher.Sig, len(txn.In)) + + inputs := []visor.TransactionInput{ + { + UxOut: coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }, + CalculatedHours: 200, + }, + { + UxOut: coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }, + CalculatedHours: 200, + }, + } + + signedTxnResp, err := NewCreateTransactionResponse(&signedTxn, inputs) + require.NoError(t, err) + + validBody := &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: txn.MustSerializeHex(), + } + + tt := []struct { + name string + method string + body *WalletSignTransactionRequest + rawBody string + status int + gatewaySignTransactionResult *coin.Transaction + gatewaySignTransactionInputs []visor.TransactionInput + gatewaySignTransactionErr error + csrfDisabled bool + contentType string + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + contentType: ContentTypeForm, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 wallet ID required", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + EncodedTransaction: validBody.EncodedTransaction, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "wallet_id is required"), + }, + + { + name: "400 encoded_transaction is required", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required"), + }, + + { + name: "400 decode transaction failed", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: "abc", + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Decode transaction failed: encoding/hex: odd length hex string"), + }, + + { + name: "400 too many sign indexes", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: validBody.EncodedTransaction, + SignIndexes: []int{0, 1, 2}, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Too many values in sign_indexes"), + }, + + { + name: "400 sign indexes out of range", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: validBody.EncodedTransaction, + SignIndexes: []int{5}, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Value in sign_indexes exceeds range of transaction inputs array"), + }, + + { + name: "400 duplicate sign indexes", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: validBody.EncodedTransaction, + SignIndexes: []int{1, 1}, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Duplicate value in sign_indexes"), + }, + + { + name: "500 - misc error", + method: http.MethodPost, + body: validBody, + status: http.StatusInternalServerError, + gatewaySignTransactionErr: errors.New("unhandled error"), + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "unhandled error"), + }, + + { + name: "400 - wallet not encrypted", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewaySignTransactionErr: wallet.ErrWalletNotEncrypted, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "wallet is not encrypted"), + }, + + { + name: "400 - wallet encrypted", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewaySignTransactionErr: wallet.ErrWalletEncrypted, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "wallet is encrypted"), + }, + + { + name: "400 - violates hard constraint", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewaySignTransactionErr: visor.NewErrTxnViolatesHardConstraint(errors.New("bad txn")), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Transaction violates hard constraint: bad txn"), + }, + + { + name: "400 - unspents do not exist", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewaySignTransactionErr: blockdb.NewErrUnspentNotExist("foo"), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unspent output of foo does not exist"), + }, + + { + name: "400 - invalid json", + method: http.MethodPost, + rawBody: "{ca", + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid character 'c' looking for beginning of object key string"), + }, + + { + name: "404 - wallet not found", + method: http.MethodPost, + body: validBody, + status: http.StatusNotFound, + gatewaySignTransactionErr: wallet.ErrWalletNotExist, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "wallet doesn't exist"), + }, + + { + name: "403 - wallet API disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusForbidden, + gatewaySignTransactionErr: wallet.ErrWalletAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, "wallet api is disabled"), + }, + + { + name: "200 - no password", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewaySignTransactionResult: &signedTxn, + gatewaySignTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: *signedTxnResp, + }, + }, + + { + name: "200 - no password csrf disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewaySignTransactionResult: &signedTxn, + gatewaySignTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: *signedTxnResp, + }, + csrfDisabled: true, + }, + + { + name: "200 - password", + method: http.MethodPost, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + Password: "foo", + EncodedTransaction: validBody.EncodedTransaction, + }, + status: http.StatusOK, + gatewaySignTransactionResult: &signedTxn, + gatewaySignTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: *signedTxnResp, + }, + }, + + { + name: "200 - sign indexes", + method: http.MethodPost, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + SignIndexes: []int{1}, + EncodedTransaction: validBody.EncodedTransaction, + }, + status: http.StatusOK, + gatewaySignTransactionResult: &signedTxn, + gatewaySignTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: *signedTxnResp, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + + var txn *coin.Transaction + if tc.body != nil { + // Decode the transaction used in the request body, but ignore an error in case the + // transaction is intentionally malformed + txnx, err := coin.DeserializeTransactionHex(tc.body.EncodedTransaction) + if err == nil { + txn = &txnx + } + } + + if tc.body != nil { + gateway.On("WalletSignTransaction", tc.body.WalletID, []byte(tc.body.Password), txn, tc.body.SignIndexes).Return(tc.gatewaySignTransactionResult, tc.gatewaySignTransactionInputs, tc.gatewaySignTransactionErr) + } + + endpoint := "/api/v2/wallet/transaction/sign" + + bodyText := []byte(tc.rawBody) + if len(bodyText) == 0 { + var err error + bodyText, err = json.Marshal(tc.body) + require.NoError(t, err) + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBuffer(bodyText)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Add("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var cRsp CreateTransactionResponse + err := json.Unmarshal(rsp.Data, &cRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(CreateTransactionResponse), cRsp) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/storage.go b/vendor/github.com/SkycoinProject/skycoin/src/api/storage.go new file mode 100644 index 00000000..9ddf189a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/storage.go @@ -0,0 +1,190 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/SkycoinProject/skycoin/src/kvstorage" +) + +// Dispatches /data endpoint. +// Method: GET, POST, DELETE +// URI: /api/v2/data +func storageHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodGet: + getStorageValuesHandler(w, r, gateway) + case http.MethodPost: + addStorageValueHandler(w, r, gateway) + case http.MethodDelete: + removeStorageValueHandler(w, r, gateway) + default: + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + } + } +} + +// serves GET requests for /data enpdoint +func getStorageValuesHandler(w http.ResponseWriter, r *http.Request, gateway Gatewayer) { + storageType := r.FormValue("type") + if storageType == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "type is required") + writeHTTPResponse(w, resp) + return + } + + key := r.FormValue("key") + + if key == "" { + getAllStorageValuesHandler(w, gateway, kvstorage.Type(storageType)) + } else { + getStorageValueHandler(w, gateway, kvstorage.Type(storageType), key) + } +} + +// Returns all existing storage values of a given storage type. +// Args: +// type: storage type to get values from +func getAllStorageValuesHandler(w http.ResponseWriter, gateway Gatewayer, storageType kvstorage.Type) { + data, err := gateway.GetAllStorageValues(kvstorage.Type(storageType)) + if err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: data, + }) +} + +// Returns value from storage of a given type by key. +// Args: +// key: key for a value to be retrieved +func getStorageValueHandler(w http.ResponseWriter, gateway Gatewayer, storageType kvstorage.Type, key string) { + val, err := gateway.GetStorageValue(storageType, key) + if err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + case kvstorage.ErrNoSuchKey: + resp = NewHTTPErrorResponse(http.StatusNotFound, "") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: val, + }) +} + +// StorageRequest is the request data for POST /api/v2/data +type StorageRequest struct { + StorageType kvstorage.Type `json:"type"` + Key string `json:"key"` + Val string `json:"val"` +} + +// Adds the value to the storage of a given type +// Args: +// type: storage type +// key: key +// val: value +func addStorageValueHandler(w http.ResponseWriter, r *http.Request, gateway Gatewayer) { + var req StorageRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.StorageType == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "type is required") + writeHTTPResponse(w, resp) + return + } + + if req.Key == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "key is required") + writeHTTPResponse(w, resp) + return + } + + if err := gateway.AddStorageValue(req.StorageType, req.Key, req.Val); err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{}) +} + +// Removes the value by key from the storage of a given type +// Args: +// type: storage type +// key: key +func removeStorageValueHandler(w http.ResponseWriter, r *http.Request, gateway Gatewayer) { + storageType := r.FormValue("type") + if storageType == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "type is required") + writeHTTPResponse(w, resp) + return + } + + key := r.FormValue("key") + if key == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "key is required") + writeHTTPResponse(w, resp) + return + } + + if err := gateway.RemoveStorageValue(kvstorage.Type(storageType), key); err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + case kvstorage.ErrNoSuchKey: + resp = NewHTTPErrorResponse(http.StatusNotFound, "") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{}) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/storage_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/storage_test.go new file mode 100644 index 00000000..b5ea910e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/storage_test.go @@ -0,0 +1,773 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/kvstorage" +) + +func TestGetAllStorageValuesHandler(t *testing.T) { + tt := []struct { + name string + method string + contentType string + query string + status int + storageType kvstorage.Type + getAllStorageValuesResult map[string]string + getAllStorageValuesErr error + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPut, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusMethodNotAllowed, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: make(map[string]string), + getAllStorageValuesErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "403", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: nil, + getAllStorageValuesErr: kvstorage.ErrStorageAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "400 - missing type", + method: http.MethodGet, + contentType: ContentTypeForm, + status: http.StatusBadRequest, + storageType: "", + getAllStorageValuesResult: nil, + getAllStorageValuesErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "type is required"), + }, + { + name: "400 - unknown type", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{"unknown"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: "unknown", + getAllStorageValuesResult: nil, + getAllStorageValuesErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage"), + }, + { + name: "404 - storage not loaded", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: nil, + getAllStorageValuesErr: kvstorage.ErrNoSuchStorage, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded"), + }, + { + name: "200", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + getAllStorageValuesErr: nil, + httpResponse: HTTPResponse{ + Data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + { + name: "200 - csrf disabled", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + getAllStorageValuesErr: nil, + httpResponse: HTTPResponse{ + Data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetAllStorageValues", tc.storageType).Return(tc.getAllStorageValuesResult, + tc.getAllStorageValuesErr) + + endpoint := "/api/v2/data" + + if tc.query != "" { + endpoint += "?" + tc.query + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader("")) + require.NoError(t, err) + + req.Header.Set("Content-Type", tc.contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var getAllStorageValuesRsp map[string]string + err := json.Unmarshal(rsp.Data, &getAllStorageValuesRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data, getAllStorageValuesRsp) + } + }) + } +} + +func TestGetStorageValueHandler(t *testing.T) { + tt := []struct { + name string + method string + contentType string + query string + status int + storageType kvstorage.Type + key string + getStorageValueResult string + getStorageValueErr error + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPut, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusMethodNotAllowed, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "some value", + getStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "403", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrStorageAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "400 - missing type", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "key": []string{"test1"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: "", + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "type is required"), + }, + { + name: "400 - unknown type", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{"unknown"}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: "unknown", + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage"), + }, + { + name: "404 - storage not loaded", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrNoSuchStorage, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded"), + }, + { + name: "400 - not found", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrNoSuchKey, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, ""), + }, + { + name: "200", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "some value", + getStorageValueErr: nil, + httpResponse: HTTPResponse{ + Data: "some value", + }, + }, + { + name: "200 - csrf disabled", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "some value", + getStorageValueErr: nil, + httpResponse: HTTPResponse{ + Data: "some value", + }, + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetStorageValue", tc.storageType, tc.key).Return(tc.getStorageValueResult, + tc.getStorageValueErr) + + endpoint := "/api/v2/data" + + if tc.query != "" { + endpoint += "?" + tc.query + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader("")) + require.NoError(t, err) + + req.Header.Set("Content-Type", tc.contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var getStorageValueRsp string + err := json.Unmarshal(rsp.Data, &getStorageValueRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data, getStorageValueRsp) + } + }) + } +} + +func TestAddStorageValueHandler(t *testing.T) { + tt := []struct { + name string + method string + contentType string + httpBody string + status int + storageType kvstorage.Type + key string + val string + addStorageValueErr error + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPut, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusMethodNotAllowed, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "403", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: kvstorage.ErrStorageAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "415", + method: http.MethodPost, + contentType: ContentTypeForm, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusUnsupportedMediaType, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + { + name: "400 - EOF", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: "", + status: http.StatusBadRequest, + storageType: "", + key: "", + val: "", + addStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "400 - missing type", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + Key: "test", + Val: "qwe", + }), + status: http.StatusBadRequest, + storageType: "", + key: "test", + val: "qwe", + addStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "type is required"), + }, + { + name: "400 - unknown type", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: "unknown", + Key: "test", + Val: "qwe", + }), + status: http.StatusBadRequest, + storageType: "unknown", + key: "test", + val: "qwe", + addStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage"), + }, + { + name: "404 - storage not loaded", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: kvstorage.ErrNoSuchStorage, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded"), + }, + { + name: "400 - missing key", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Val: "qwe", + }), + status: http.StatusBadRequest, + storageType: kvstorage.TypeTxIDNotes, + val: "qwe", + addStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "key is required"), + }, + { + name: "200", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: nil, + httpResponse: HTTPResponse{}, + }, + { + name: "403 - csrf disabled", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, "invalid CSRF token"), + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("AddStorageValue", tc.storageType, tc.key, tc.val).Return(tc.addStorageValueErr) + + endpoint := "/api/v2/data" + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + req.Header.Set("Content-Type", tc.contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + } + }) + } +} + +func TestRemoveStorageValueHandler(t *testing.T) { + tt := []struct { + name string + method string + query string + status int + storageType kvstorage.Type + key string + removeStorageValueErr error + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPut, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusMethodNotAllowed, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "403", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: kvstorage.ErrStorageAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "400 - missing type", + method: http.MethodDelete, + query: url.Values{ + "key": []string{"test"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "type is required"), + }, + { + name: "400 - unknown type", + method: http.MethodDelete, + query: url.Values{ + "type": []string{"unknown"}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: "unknown", + key: "test", + removeStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage"), + }, + { + name: "404 - storage not loaded", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: kvstorage.ErrNoSuchStorage, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded"), + }, + { + name: "400 - missing key", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusBadRequest, + storageType: kvstorage.TypeTxIDNotes, + removeStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "key is required"), + }, + { + name: "404 - not found", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: kvstorage.ErrNoSuchKey, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, ""), + }, + { + name: "200", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: nil, + httpResponse: HTTPResponse{}, + }, + { + name: "403 - csrf disabled", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, "invalid CSRF token"), + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("RemoveStorageValue", tc.storageType, tc.key).Return(tc.removeStorageValueErr) + + endpoint := "/api/v2/data" + + if tc.query != "" { + endpoint += "?" + tc.query + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader("")) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/api/transaction.go new file mode 100644 index 00000000..f32ebd77 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/transaction.go @@ -0,0 +1,685 @@ +package api + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "net/http" + "sort" + "strconv" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// pendingTxnsHandler returns pending (unconfirmed) transactions +// Method: GET +// URI: /api/v1/pendingTxs +// Args: +// verbose: [bool] include verbose transaction input data +func pendingTxnsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + if verbose { + txns, inputs, err := gateway.GetAllUnconfirmedTransactionsVerbose() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + vb, err := readable.NewUnconfirmedTransactionsVerbose(txns, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, vb) + } else { + txns, err := gateway.GetAllUnconfirmedTransactions() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + ret, err := readable.NewUnconfirmedTransactions(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, ret) + } + } +} + +// TransactionEncodedResponse represents the data struct of the response to /api/v1/transaction?encoded=1 +type TransactionEncodedResponse struct { + Status readable.TransactionStatus `json:"status"` + Time uint64 `json:"time"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// transactionHandler returns a transaction identified by its txid hash +// Method: GET +// URI: /api/v1/transaction +// Args: +// txid: transaction hash +// verbose: [bool] include verbose transaction input data +// encoded: [bool] return as a raw encoded transaction +func transactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + encoded, err := parseBoolFlag(r.FormValue("encoded")) + if err != nil { + wh.Error400(w, "Invalid value for encoded") + return + } + + if verbose && encoded { + wh.Error400(w, "verbose and encoded cannot be combined") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if verbose { + txn, inputs, err := gateway.GetTransactionWithInputs(h) + if err != nil { + wh.Error500(w, err.Error()) + return + } + if txn == nil { + wh.Error404(w, "") + return + } + + rTxn, err := readable.NewTransactionWithStatusVerbose(txn, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rTxn) + return + } + + txn, err := gateway.GetTransaction(h) + if err != nil { + wh.Error500(w, err.Error()) + return + } + if txn == nil { + wh.Error404(w, "") + return + } + + if encoded { + txnHex, err := txn.Transaction.SerializeHex() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, TransactionEncodedResponse{ + EncodedTransaction: txnHex, + Status: readable.NewTransactionStatus(txn.Status), + Time: txn.Time, + }) + return + } + + rTxn, err := readable.NewTransactionWithStatus(txn) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rTxn) + } +} + +// TransactionsWithStatus array of transaction results +type TransactionsWithStatus struct { + Transactions []readable.TransactionWithStatus `json:"txns"` +} + +// Sort sorts transactions chronologically, using txid for tiebreaking +func (r TransactionsWithStatus) Sort() { + sort.Slice(r.Transactions, func(i, j int) bool { + a := r.Transactions[i] + b := r.Transactions[j] + + if a.Time == b.Time { + return strings.Compare(a.Transaction.Hash, b.Transaction.Hash) < 0 + } + + return a.Time < b.Time + }) +} + +// NewTransactionsWithStatus converts []Transaction to TransactionsWithStatus +func NewTransactionsWithStatus(txns []visor.Transaction) (*TransactionsWithStatus, error) { + txnRlts := make([]readable.TransactionWithStatus, 0, len(txns)) + for _, txn := range txns { + rTxn, err := readable.NewTransactionWithStatus(&txn) + if err != nil { + return nil, err + } + txnRlts = append(txnRlts, *rTxn) + } + + return &TransactionsWithStatus{ + Transactions: txnRlts, + }, nil +} + +// TransactionsWithStatusVerbose array of transaction results +type TransactionsWithStatusVerbose struct { + Transactions []readable.TransactionWithStatusVerbose `json:"txns"` +} + +// Sort sorts transactions chronologically, using txid for tiebreaking +func (r TransactionsWithStatusVerbose) Sort() { + sort.Slice(r.Transactions, func(i, j int) bool { + a := r.Transactions[i] + b := r.Transactions[j] + + if a.Time == b.Time { + return strings.Compare(a.Transaction.Hash, b.Transaction.Hash) < 0 + } + + return a.Time < b.Time + }) +} + +// NewTransactionsWithStatusVerbose converts []Transaction to []TransactionsWithStatusVerbose +func NewTransactionsWithStatusVerbose(txns []visor.Transaction, inputs [][]visor.TransactionInput) (*TransactionsWithStatusVerbose, error) { + if len(txns) != len(inputs) { + return nil, errors.New("NewTransactionsWithStatusVerbose: len(txns) != len(inputs)") + } + + txnRlts := make([]readable.TransactionWithStatusVerbose, len(txns)) + for i, txn := range txns { + rTxn, err := readable.NewTransactionWithStatusVerbose(&txn, inputs[i]) + if err != nil { + return nil, err + } + txnRlts[i] = *rTxn + } + + return &TransactionsWithStatusVerbose{ + Transactions: txnRlts, + }, nil +} + +// Returns transactions that match the filters. +// Method: GET, POST +// URI: /api/v1/transactions +// Args: +// addrs: Comma separated addresses [optional, returns all transactions if no address provided] +// confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] +// verbose: [bool] include verbose transaction input data +func transactionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + // Gets 'addrs' parameter value + addrs, err := parseAddressesFromStr(r.FormValue("addrs")) + if err != nil { + wh.Error400(w, fmt.Sprintf("parse parameter: 'addrs' failed: %v", err)) + return + } + + // Initialize transaction filters + flts := []visor.TxFilter{visor.NewAddrsFilter(addrs)} + + // Gets the 'confirmed' parameter value + confirmedStr := r.FormValue("confirmed") + if confirmedStr != "" { + confirmed, err := strconv.ParseBool(confirmedStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid 'confirmed' value: %v", err)) + return + } + + flts = append(flts, visor.NewConfirmedTxFilter(confirmed)) + } + + if verbose { + txns, inputs, err := gateway.GetTransactionsWithInputs(flts) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns, err := NewTransactionsWithStatusVerbose(txns, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns.Sort() + + wh.SendJSONOr500(logger, w, rTxns.Transactions) + } else { + txns, err := gateway.GetTransactions(flts) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns, err := NewTransactionsWithStatus(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns.Sort() + + wh.SendJSONOr500(logger, w, rTxns.Transactions) + } + } +} + +// InjectTransactionRequest is sent to POST /api/v1/injectTransaction +type InjectTransactionRequest struct { + RawTxn string `json:"rawtx"` + NoBroadcast bool `json:"no_broadcast,omitempty"` +} + +// URI: /api/v1/injectTransaction +// Method: POST +// Content-Type: application/json +// Body: {"rawtx": ""} +// Response: +// 200 - ok, returns the transaction hash in hex as string +// 400 - bad transaction +// 500 - other error +// 503 - network unavailable for broadcasting transaction +func injectTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + var v InjectTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&v); err != nil { + wh.Error400(w, err.Error()) + return + } + + if v.RawTxn == "" { + wh.Error400(w, "rawtx is required") + return + } + + txn, err := coin.DeserializeTransactionHex(v.RawTxn) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if v.NoBroadcast { + if err := gateway.InjectTransaction(txn); err != nil { + switch err.(type) { + case visor.ErrTxnViolatesUserConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesSoftConstraint: + wh.Error400(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + return + } + } else { + if err := gateway.InjectBroadcastTransaction(txn); err != nil { + switch err.(type) { + case visor.ErrTxnViolatesUserConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesSoftConstraint: + wh.Error400(w, err.Error()) + default: + if daemon.IsBroadcastFailure(err) { + wh.Error503(w, err.Error()) + } else { + wh.Error500(w, err.Error()) + } + } + return + } + } + + wh.SendJSONOr500(logger, w, txn.Hash().Hex()) + } +} + +// ResendResult the result of rebroadcasting transaction +type ResendResult struct { + Txids []string `json:"txids"` +} + +// NewResendResult creates a ResendResult from a list of transaction ID hashes +func NewResendResult(hashes []cipher.SHA256) ResendResult { + txids := make([]string, len(hashes)) + for i, h := range hashes { + txids[i] = h.Hex() + } + return ResendResult{ + Txids: txids, + } +} + +// URI: /api/v1/resendUnconfirmedTxns +// Method: POST +// Broadcasts all unconfirmed transactions from the unconfirmed transaction pool +// Response: +// 200 - ok, returns the transaction hashes that were resent +// 405 - method not POST +// 500 - other error +// 503 - network unavailable for broadcasting transaction +func resendUnconfirmedTxnsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + hashes, err := gateway.ResendUnconfirmedTxns() + if err != nil { + if daemon.IsBroadcastFailure(err) { + wh.Error503(w, err.Error()) + } else { + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, NewResendResult(hashes)) + } +} + +// URI: /api/v1/rawtx +// Method: GET +// Args: +// txid: transaction ID hash +// Returns the hex-encoded byte serialization of a transaction. +// The transaction may be confirmed or unconfirmed. +func rawTxnHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + txn, err := gateway.GetTransaction(h) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if txn == nil { + wh.Error404(w, "") + return + } + + txnHex, err := txn.Transaction.SerializeHex() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnHex) + } +} + +// VerifyTransactionRequest represents the data struct of the request for /api/v2/transaction/verify +type VerifyTransactionRequest struct { + Unsigned bool `json:"unsigned"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// VerifyTransactionResponse the response data struct for /api/v2/transaction/verify +type VerifyTransactionResponse struct { + Unsigned bool `json:"unsigned"` + Confirmed bool `json:"confirmed"` + Transaction CreatedTransaction `json:"transaction"` +} + +// Decode and verify an encoded transaction +// Method: POST +// URI: /api/v2/transaction/verify +func verifyTxnHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.EncodedTransaction == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required") + writeHTTPResponse(w, resp) + return + } + + txn, err := decodeTxn(req.EncodedTransaction) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, fmt.Sprintf("decode transaction failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + signed := visor.TxnSigned + if req.Unsigned { + signed = visor.TxnUnsigned + } + + var resp HTTPResponse + inputs, isTxnConfirmed, err := gateway.VerifyTxnVerbose(txn, signed) + if err != nil { + switch err.(type) { + case visor.ErrTxnViolatesSoftConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesUserConstraint: + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: err.Error(), + } + default: + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + } + + verifyTxnResp := VerifyTransactionResponse{ + Confirmed: isTxnConfirmed, + Unsigned: !txn.IsFullySigned(), + } + + if len(inputs) != len(txn.In) { + inputs = nil + } + verboseTxn, err := newCreatedTransactionFuzzy(txn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + verifyTxnResp.Transaction = *verboseTxn + + resp.Data = verifyTxnResp + + if isTxnConfirmed && resp.Error == nil { + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "transaction has been spent", + } + } + + writeHTTPResponse(w, resp) + } +} + +func decodeTxn(encodedTxn string) (*coin.Transaction, error) { + var txn coin.Transaction + b, err := hex.DecodeString(encodedTxn) + if err != nil { + return nil, err + } + + txn, err = coin.DeserializeTransaction(b) + if err != nil { + return nil, err + } + + return &txn, nil +} + +// newCreatedTransactionFuzzy creates a CreatedTransaction but accommodates possibly invalid txn input +func newCreatedTransactionFuzzy(txn *coin.Transaction, inputs []visor.TransactionInput) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) && len(inputs) != 0 { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + var feeInvalid bool + for _, o := range txn.Out { + var err error + outputHours, err = mathutil.AddUint64(outputHours, o.Hours) + if err != nil { + feeInvalid = true + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = mathutil.AddUint64(inputHours, i.CalculatedHours) + if err != nil { + feeInvalid = true + } + } + + if inputHours < outputHours { + feeInvalid = true + } + + var fee uint64 + if !feeInvalid { + fee = inputHours - outputHours + } + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txID := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txID) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionOutput failed") + continue + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(txn.In)) + if len(inputs) == 0 { + for i, h := range txn.In { + in[i] = CreatedTransactionInput{ + UxID: h.Hex(), + } + } + } else { + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionInput failed") + continue + } + in[i] = *ci + } + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txID.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/transaction_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/transaction_test.go new file mode 100644 index 00000000..c401e3ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/transaction_test.go @@ -0,0 +1,1663 @@ +package api + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "errors" + "io" + "math" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func createUnconfirmedTxn(t *testing.T) visor.UnconfirmedTransaction { + ut := visor.UnconfirmedTransaction{} + ut.Transaction = coin.Transaction{} + ut.Transaction.InnerHash = testutil.RandSHA256(t) + ut.Transaction.In = []cipher.SHA256{testutil.RandSHA256(t)} + ut.Received = time.Now().UTC().UnixNano() + ut.Checked = ut.Received + ut.Announced = time.Time{}.UnixNano() + return ut +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeTransaction(t *testing.T) coin.Transaction { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + txn.SignInputs([]cipher.SecKey{s}) + err = txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +func TestGetPendingTxs(t *testing.T) { + invalidTxn := createUnconfirmedTxn(t) + invalidTxn.Transaction.Out = append(invalidTxn.Transaction.Out, coin.TransactionOutput{ + Coins: math.MaxInt64 + 1, + }) + + type verboseResult struct { + Transactions []visor.UnconfirmedTransaction + Inputs [][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + verbose bool + verboseStr string + getAllUnconfirmedTxnsResponse []visor.UnconfirmedTransaction + getAllUnconfirmedTxnsErr error + getAllUnconfirmedTxnsVerboseResponse verboseResult + getAllUnconfirmedTxnsVerboseErr error + httpResponse interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTransaction{}, + }, + { + name: "400 - bad verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + verboseStr: "foo", + }, + { + name: "500 - bad unconfirmedTxn", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTransaction{ + invalidTxn, + }, + }, + { + name: "500 - get unconfirmedTxn error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetAllUnconfirmedTransactions failed", + getAllUnconfirmedTxnsErr: errors.New("GetAllUnconfirmedTransactions failed"), + }, + { + name: "500 - get unconfirmedTxnVerbose error", + method: http.MethodGet, + status: http.StatusInternalServerError, + verboseStr: "1", + verbose: true, + err: "500 Internal Server Error - GetAllUnconfirmedTransactionsVerbose failed", + getAllUnconfirmedTxnsVerboseErr: errors.New("GetAllUnconfirmedTransactionsVerbose failed"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTransaction{}, + httpResponse: []readable.UnconfirmedTransactions{}, + }, + { + name: "200 verbose", + method: http.MethodGet, + status: http.StatusOK, + verboseStr: "1", + verbose: true, + getAllUnconfirmedTxnsVerboseResponse: verboseResult{ + Transactions: []visor.UnconfirmedTransaction{}, + Inputs: [][]visor.TransactionInput{}, + }, + httpResponse: []readable.UnconfirmedTransactionVerbose{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/pendingTxs" + gateway := &MockGatewayer{} + gateway.On("GetAllUnconfirmedTransactions").Return(tc.getAllUnconfirmedTxnsResponse, tc.getAllUnconfirmedTxnsErr) + gateway.On("GetAllUnconfirmedTransactionsVerbose").Return(tc.getAllUnconfirmedTxnsVerboseResponse.Transactions, + tc.getAllUnconfirmedTxnsVerboseResponse.Inputs, tc.getAllUnconfirmedTxnsVerboseErr) + + v := url.Values{} + if tc.verboseStr != "" { + v.Add("verbose", tc.verboseStr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg []readable.UnconfirmedTransactionVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } else { + var msg []readable.UnconfirmedTransactions + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } + }) + } +} + +func TestGetTransactionByID(t *testing.T) { + oddHash := "cafcb" + invalidHash := "cabrca" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + validHashRaw, err := cipher.SHA256FromHex(validHash) + require.NoError(t, err) + + validAddr := "28ATuZGXJm6dJDGyJbdknFWgv8kbBX9hAdN" + validAddrRaw, err := cipher.DecodeBase58Address(validAddr) + require.NoError(t, err) + + validSig := "cca1595fb27375789da47bb1cf78e14febc2be6f3c3034247fea6f700b853cddbab5d16f4ffc1912fca8373f10e468b745d6a1d686cb73ade1e3c3b3653b2f9d7f" + validSigRaw, err := cipher.SigFromHex(validSig) + require.NoError(t, err) + + type httpBody struct { + txid string + verbose string + encoded string + } + + type verboseResult struct { + Transaction *visor.Transaction + Inputs []visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + verbose bool + encoded bool + txid cipher.SHA256 + getTransactionReponse *visor.Transaction + getTransactionError error + getTransactionResultVerboseReponse verboseResult + getTransactionResultVerboseError error + httpResponse interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + txid: testutil.RandSHA256(t), + }, + + { + name: "400 - empty txid", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - txid is empty", + httpBody: &httpBody{ + txid: "", + }, + txid: testutil.RandSHA256(t), + }, + + { + name: "400 - invalid hash: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + txid: oddHash, + }, + txid: testutil.RandSHA256(t), + }, + + { + name: "400 - invalid hash: invalid byte: U+0072 'r'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + txid: invalidHash, + }, + txid: testutil.RandSHA256(t), + }, + + { + name: "400 - invalid verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + httpBody: &httpBody{ + txid: validHash, + verbose: "foo", + }, + }, + + { + name: "400 - invalid encoded", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for encoded", + httpBody: &httpBody{ + txid: validHash, + encoded: "foo", + }, + }, + + { + name: "400 - verbose and encoded combined", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - verbose and encoded cannot be combined", + httpBody: &httpBody{ + txid: validHash, + verbose: "1", + encoded: "1", + }, + }, + + { + name: "500 - getTransactionError encoded", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + encoded: "1", + }, + encoded: true, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + + { + name: "500 - getTransactionError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + }, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + + { + name: "500 - getTransactionResultVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionResultVerboseError", + httpBody: &httpBody{ + txid: validHash, + verbose: "1", + }, + verbose: true, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionResultVerboseError: errors.New("getTransactionResultVerboseError"), + }, + + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + }, + txid: testutil.SHA256FromHex(t, validHash), + }, + + { + name: "404 verbose", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + verbose: "1", + }, + verbose: true, + txid: testutil.SHA256FromHex(t, validHash), + }, + + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + }, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionReponse: &visor.Transaction{ + Transaction: coin.Transaction{ + Sigs: []cipher.Sig{validSigRaw}, + In: []cipher.SHA256{validHashRaw}, + Out: []coin.TransactionOutput{ + { + Coins: 9999, + Hours: 1111, + Address: validAddrRaw, + }, + }, + }, + Status: visor.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + }, + httpResponse: &readable.TransactionWithStatus{ + Status: readable.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + Transaction: readable.Transaction{ + Hash: "b64525bc14edb3c838ff3ef4f01bd74712432b32c18463dbda59b431959b2e52", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Sigs: []string{validSig}, + In: []string{validHash}, + Out: []readable.TransactionOutput{ + { + Hash: "87ec4d440fd64bb4c26839d58684e567e499265ca396649c03304b928378720b", + Coins: "0.009999", + Hours: 1111, + Address: validAddr, + }, + }, + }, + }, + }, + + { + name: "200 verbose", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + verbose: "1", + }, + verbose: true, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionResultVerboseReponse: verboseResult{ + Transaction: &visor.Transaction{ + Transaction: coin.Transaction{ + Sigs: []cipher.Sig{validSigRaw}, + In: []cipher.SHA256{validHashRaw}, + Out: []coin.TransactionOutput{ + { + Coins: 9999, + Hours: 1111, + Address: validAddrRaw, + }, + }, + }, + Status: visor.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + }, + Inputs: []visor.TransactionInput{ + { + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 9999, + Hours: 1111, + Address: validAddrRaw, + }, + }, + CalculatedHours: 3333, + }, + }, + }, + httpResponse: &readable.TransactionWithStatusVerbose{ + Status: readable.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + Transaction: readable.TransactionVerbose{ + BlockTransactionVerbose: readable.BlockTransactionVerbose{ + Fee: 2222, + Hash: "b64525bc14edb3c838ff3ef4f01bd74712432b32c18463dbda59b431959b2e52", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Sigs: []string{validSig}, + In: []readable.TransactionInput{ + { + Hash: "50e8ad459e29a051d969f221f1fb9775e26248e8b443982fef0cfaa117ee6c0c", + Coins: "0.009999", + Hours: 1111, + CalculatedHours: 3333, + Address: validAddr, + }, + }, + Out: []readable.TransactionOutput{ + { + Hash: "87ec4d440fd64bb4c26839d58684e567e499265ca396649c03304b928378720b", + Coins: "0.009999", + Hours: 1111, + Address: validAddr, + }, + }, + }, + }, + }, + }, + + { + name: "200 encoded", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + encoded: "1", + }, + encoded: true, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionReponse: &visor.Transaction{ + Transaction: coin.Transaction{ + Sigs: []cipher.Sig{validSigRaw}, + In: []cipher.SHA256{validHashRaw}, + Out: []coin.TransactionOutput{ + { + Coins: 9999, + Hours: 1111, + Address: validAddrRaw, + }, + }, + }, + Status: visor.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + }, + httpResponse: &TransactionEncodedResponse{ + Status: readable.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + EncodedTransaction: "0000000000000000000000000000000000000000000000000000000000000000000000000001000000cca1595fb27375789da47bb1cf78e14febc2be6f3c3034247fea6f700b853cddbab5d16f4ffc1912fca8373f10e468b745d6a1d686cb73ade1e3c3b3653b2f9d7f0100000079216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b0100000000a1f1da0612c870cbb2d88fb3d7f95ba7118d6efb0f270000000000005704000000000000", + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/transaction" + gateway := &MockGatewayer{} + gateway.On("GetTransaction", tc.txid).Return(tc.getTransactionReponse, tc.getTransactionError) + gateway.On("GetTransactionWithInputs", tc.txid).Return(tc.getTransactionResultVerboseReponse.Transaction, + tc.getTransactionResultVerboseReponse.Inputs, tc.getTransactionResultVerboseError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.txid != "" { + v.Add("txid", tc.httpBody.txid) + } + if tc.httpBody.verbose != "" { + v.Add("verbose", tc.httpBody.verbose) + } + if tc.httpBody.encoded != "" { + v.Add("encoded", tc.httpBody.encoded) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg readable.TransactionWithStatusVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, &msg, tc.name) + } else if tc.encoded { + var msg TransactionEncodedResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, &msg, tc.name) + } else { + var msg readable.TransactionWithStatus + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, &msg, tc.name) + } + } + + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + }) + } +} + +func TestInjectTransaction(t *testing.T) { + validTransaction := makeTransaction(t) + + validTxnBody := &InjectTransactionRequest{ + RawTxn: validTransaction.MustSerializeHex(), + } + validTxnBodyJSON, err := json.Marshal(validTxnBody) + require.NoError(t, err) + + validTxnBodyNoBroadcast := &InjectTransactionRequest{ + RawTxn: validTransaction.MustSerializeHex(), + NoBroadcast: true, + } + validTxnBodyNoBroadcastJSON, err := json.Marshal(validTxnBodyNoBroadcast) + require.NoError(t, err) + + b := &InjectTransactionRequest{ + RawTxn: hex.EncodeToString(testutil.RandBytes(t, 128)), + } + invalidTxnBodyJSON, err := json.Marshal(b) + require.NoError(t, err) + + tt := []struct { + name string + method string + status int + err string + httpBody string + injectTransactionArg coin.Transaction + injectTransactionError error + httpResponse string + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + injectTransactionArg: validTransaction, + }, + { + name: "400 - EOF", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - EOF", + }, + { + name: "400 - rawtx required", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - rawtx is required", + httpBody: `{"wrongKey":"wrongValue"}`, + }, + { + name: "400 - encoding/hex: odd length hex string", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: `{"rawtx":"aab"}`, + }, + { + name: "400 - rawtx deserialization error", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid transaction: Not enough buffer data to deserialize", + httpBody: string(invalidTxnBodyJSON), + }, + { + name: "503 - daemon.ErrNetworkingDisabled", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - Networking is disabled", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: daemon.ErrNetworkingDisabled, + }, + { + name: "503 - gnet.ErrNoReachableConnections", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - All pool connections are unreachable at this time", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: gnet.ErrNoReachableConnections, + }, + { + name: "503 - gnet.ErrPoolEmpty", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - Connection pool is empty after filtering connections", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: gnet.ErrPoolEmpty, + }, + { + name: "500 - other injectBroadcastTransactionError", + method: http.MethodPost, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - injectBroadcastTransactionError", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: errors.New("injectBroadcastTransactionError"), + }, + { + name: "500 - no broadcast other injectTransactionError", + method: http.MethodPost, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - injectTransactionError", + httpBody: string(validTxnBodyNoBroadcastJSON), + injectTransactionArg: validTransaction, + injectTransactionError: errors.New("injectTransactionError"), + }, + { + name: "400 - txn constraint violation", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: bad transaction", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: visor.ErrTxnViolatesHardConstraint{ + Err: errors.New("bad transaction"), + }, + }, + { + name: "400 - no broadcast txn constraint violation", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: bad transaction", + httpBody: string(validTxnBodyNoBroadcastJSON), + injectTransactionArg: validTransaction, + injectTransactionError: visor.ErrTxnViolatesHardConstraint{ + Err: errors.New("bad transaction"), + }, + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + }, + { + name: "200 no broadcast", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyNoBroadcastJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/injectTransaction" + gateway := &MockGatewayer{} + gateway.On("InjectBroadcastTransaction", tc.injectTransactionArg).Return(tc.injectTransactionError) + gateway.On("InjectTransaction", tc.injectTransactionArg).Return(tc.injectTransactionError) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + + } + + rr := httptest.NewRecorder() + + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") + require.NoError(t, err) + require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) + } + }) + } +} + +func TestResendUnconfirmedTxns(t *testing.T) { + validHash1 := testutil.RandSHA256(t) + validHash2 := testutil.RandSHA256(t) + + tt := []struct { + name string + method string + status int + err string + httpBody string + resendUnconfirmedTxnsResponse []cipher.SHA256 + resendUnconfirmedTxnsErr error + httpResponse ResendResult + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "500 resend failed network error", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - All pool connections are unreachable at this time", + resendUnconfirmedTxnsErr: gnet.ErrNoReachableConnections, + }, + + { + name: "500 resend failed unknown error", + method: http.MethodPost, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - ResendUnconfirmedTxns failed", + resendUnconfirmedTxnsErr: errors.New("ResendUnconfirmedTxns failed"), + }, + + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + resendUnconfirmedTxnsResponse: nil, + httpResponse: ResendResult{ + Txids: []string{}, + }, + }, + + { + name: "200 with hashes", + method: http.MethodPost, + status: http.StatusOK, + resendUnconfirmedTxnsResponse: []cipher.SHA256{validHash1, validHash2}, + httpResponse: ResendResult{ + Txids: []string{validHash1.Hex(), validHash2.Hex()}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/resendUnconfirmedTxns" + gateway := &MockGatewayer{} + gateway.On("ResendUnconfirmedTxns").Return(tc.resendUnconfirmedTxnsResponse, tc.resendUnconfirmedTxnsErr) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg ResendResult + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetRawTxn(t *testing.T) { + oddHash := "cafcb" + invalidHash := "cabrca" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + type httpBody struct { + txid string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getTransactionArg cipher.SHA256 + getTransactionResponse *visor.Transaction + getTransactionError error + httpResponse string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - txid is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - txid is empty", + httpBody: &httpBody{}, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + txid: oddHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: invalid byte: U+0072 'r'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + txid: invalidHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - getTransactionError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionResponse: &visor.Transaction{}, + httpResponse: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/rawtx" + gateway := &MockGatewayer{} + gateway.On("GetTransaction", tc.getTransactionArg).Return(tc.getTransactionResponse, tc.getTransactionError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.txid != "" { + v.Add("txid", tc.httpBody.txid) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") + require.NoError(t, err) + require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) + } + }) + } +} + +func TestGetTransactions(t *testing.T) { + invalidAddrsStr := "invalid,addrs" + addrsStr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ,2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE" + var addrs []cipher.Address + for _, item := range []string{"2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE"} { + addr, err := cipher.DecodeBase58Address(item) + require.NoError(t, err) + addrs = append(addrs, addr) + } + + type httpBody struct { + addrs string + confirmed string + verbose string + } + + type verboseResult struct { + Transactions []visor.Transaction + Inputs [][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + verbose bool + getTransactionsArg []visor.TxFilter + getTransactionsResponse []visor.Transaction + getTransactionsError error + getTransactionsVerboseResponse verboseResult + getTransactionsVerboseError error + httpResponse interface{} + }{ + { + name: "405", + method: http.MethodDelete, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "400 - invalid `addrs` param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - parse parameter: 'addrs' failed: address \"invalid\" is invalid: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddrsStr, + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + }, + }, + + { + name: "400 - invalid `confirmed` param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid 'confirmed' value: strconv.ParseBool: parsing \"invalidConfirmed\": invalid syntax", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "invalidConfirmed", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + }, + }, + + { + name: "400 - invalid verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + httpBody: &httpBody{ + addrs: addrsStr, + verbose: "foo", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + }, + }, + + { + name: "500 - getTransactionsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionsError", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsError: errors.New("getTransactionsError"), + }, + + { + name: "500 - getTransactionsVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionsVerboseError", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + verbose: "1", + }, + verbose: true, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsVerboseError: errors.New("getTransactionsVerboseError"), + }, + + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsResponse: []visor.Transaction{}, + httpResponse: []readable.TransactionWithStatus{}, + }, + + { + name: "200 verbose", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + verbose: "1", + }, + verbose: true, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsVerboseResponse: verboseResult{ + Transactions: []visor.Transaction{}, + Inputs: [][]visor.TransactionInput{}, + }, + httpResponse: []readable.TransactionWithStatusVerbose{}, + }, + + { + name: "200 POST", + method: http.MethodPost, + status: http.StatusOK, + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsResponse: []visor.Transaction{}, + httpResponse: []readable.TransactionWithStatus{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/transactions" + gateway := &MockGatewayer{} + + // Custom argument matching function for matching TxFilter args + matchFunc := mock.MatchedBy(func(flts []visor.TxFilter) bool { + if len(flts) != len(tc.getTransactionsArg) { + return false + } + + for i, f := range flts { + switch f.(type) { + case visor.AddrsFilter: + flt, ok := tc.getTransactionsArg[i].(visor.AddrsFilter) + if !ok { + return false + } + + if len(flt.Addrs) != len(f.(visor.AddrsFilter).Addrs) { + return false + } + + for j, a := range flt.Addrs { + ab := a.Bytes() + bb := f.(visor.AddrsFilter).Addrs[j].Bytes() + if !bytes.Equal(ab[:], bb[:]) { + return false + } + } + + case visor.BaseFilter: + // This part assumes that the filter is a ConfirmedTxFilter + flt, ok := tc.getTransactionsArg[i].(visor.BaseFilter) + if !ok { + return false + } + + dummyTxn := &visor.Transaction{ + Status: visor.TransactionStatus{ + Confirmed: true, + }, + } + + if flt.F(dummyTxn) != f.(visor.BaseFilter).F(dummyTxn) { + return false + } + + default: + return false + } + } + + return true + }) + + gateway.On("GetTransactions", matchFunc).Return(tc.getTransactionsResponse, tc.getTransactionsError) + gateway.On("GetTransactionsWithInputs", matchFunc).Return(tc.getTransactionsVerboseResponse.Transactions, + tc.getTransactionsVerboseResponse.Inputs, tc.getTransactionsVerboseError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + if tc.httpBody.confirmed != "" { + v.Add("confirmed", tc.httpBody.confirmed) + } + if tc.httpBody.verbose != "" { + v.Add("verbose", tc.httpBody.verbose) + } + } + + var reqBody io.Reader + if len(v) > 0 { + if tc.method == http.MethodPost { + reqBody = strings.NewReader(v.Encode()) + } else { + endpoint += "?" + v.Encode() + } + } + + req, err := http.NewRequest(tc.method, endpoint, reqBody) + require.NoError(t, err) + + if tc.method == http.MethodPost { + req.Header.Set("Content-Type", ContentTypeForm) + } + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg []readable.TransactionWithStatusVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } else { + var msg []readable.TransactionWithStatus + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } + }) + } +} + +type transactionAndInputs struct { + txn coin.Transaction + inputs []visor.TransactionInput +} + +func newVerifyTxnResponseJSON(t *testing.T, txn *coin.Transaction, inputs []visor.TransactionInput, isTxnConfirmed, isUnsigned bool) VerifyTransactionResponse { + ctxn, err := newCreatedTransactionFuzzy(txn, inputs) + require.NoError(t, err) + return VerifyTransactionResponse{ + Transaction: *ctxn, + Confirmed: isTxnConfirmed, + Unsigned: isUnsigned, + } +} + +func prepareTxnAndInputs(t *testing.T) transactionAndInputs { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + txn.SignInputs([]cipher.SecKey{s}) + err = txn.UpdateHeader() + require.NoError(t, err) + + input, err := visor.NewTransactionInput(ux, uint64(time.Now().UTC().Unix())) + require.NoError(t, err) + + return transactionAndInputs{ + txn: txn, + inputs: []visor.TransactionInput{input}, + } +} + +func makeTransactionWithEmptyAddressOutput(t *testing.T) transactionAndInputs { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(cipher.Address{}, 5e6, 50) + require.NoError(t, err) + txn.SignInputs([]cipher.SecKey{s}) + err = txn.UpdateHeader() + require.NoError(t, err) + + input, err := visor.NewTransactionInput(ux, uint64(time.Now().UTC().Unix())) + require.NoError(t, err) + + return transactionAndInputs{ + txn: txn, + inputs: []visor.TransactionInput{input}, + } +} + +func TestVerifyTransaction(t *testing.T) { + txnAndInputs := prepareTxnAndInputs(t) + type httpBody struct { + Unsigned bool `json:"unsigned"` + EncodedTransaction string `json:"encoded_transaction"` + } + + validTxnBody := &httpBody{ + EncodedTransaction: txnAndInputs.txn.MustSerializeHex(), + } + validTxnBodyJSON, err := json.Marshal(validTxnBody) + require.NoError(t, err) + + b := &httpBody{ + EncodedTransaction: hex.EncodeToString(testutil.RandBytes(t, 128)), + } + invalidTxnBodyJSON, err := json.Marshal(b) + require.NoError(t, err) + + invalidTxnEmptyAddress := makeTransactionWithEmptyAddressOutput(t) + invalidTxnEmptyAddressBody := &httpBody{ + EncodedTransaction: invalidTxnEmptyAddress.txn.MustSerializeHex(), + } + invalidTxnEmptyAddressBodyJSON, err := json.Marshal(invalidTxnEmptyAddressBody) + require.NoError(t, err) + + unsignedTxnAndInputs := prepareTxnAndInputs(t) + unsignedTxnAndInputs.txn.Sigs = make([]cipher.Sig, len(unsignedTxnAndInputs.txn.Sigs)) + err = unsignedTxnAndInputs.txn.UpdateHeader() + require.NoError(t, err) + unsignedTxnBody := &httpBody{ + EncodedTransaction: unsignedTxnAndInputs.txn.MustSerializeHex(), + } + unsignedTxnBodyJSON, err := json.Marshal(unsignedTxnBody) + require.NoError(t, err) + + unsignedTxnBodyUnsigned := &httpBody{ + Unsigned: true, + EncodedTransaction: unsignedTxnAndInputs.txn.MustSerializeHex(), + } + unsignedTxnBodyUnsignedJSON, err := json.Marshal(unsignedTxnBodyUnsigned) + require.NoError(t, err) + + type verifyTxnVerboseResult struct { + Uxouts []visor.TransactionInput + IsTxnConfirmed bool + Err error + } + + tt := []struct { + name string + method string + contentType string + status int + httpBody string + gatewayVerifyTxnVerboseArg coin.Transaction + gatewayVerifyTxnVerboseSigned visor.TxnSignedFlag + gatewayVerifyTxnVerboseResult verifyTxnVerboseResult + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "400 - EOF", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: "", + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + { + name: "400 - encoded_transaction is required", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: `{"wrongKey":"wrongValue"}`, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required"), + }, + { + name: "400 - encoding/hex: odd length hex string", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: `{"encoded_transaction":"aab"}`, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: encoding/hex: odd length hex string"), + }, + { + name: "400 - deserialization error", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: string(invalidTxnBodyJSON), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: Invalid transaction: Not enough buffer data to deserialize"), + }, + { + name: "422 - txn sends to empty address", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusUnprocessableEntity, + httpBody: string(invalidTxnEmptyAddressBodyJSON), + gatewayVerifyTxnVerboseArg: invalidTxnEmptyAddress.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: invalidTxnEmptyAddress.inputs, + Err: visor.NewErrTxnViolatesUserConstraint(errors.New("Transaction.Out contains an output sending to an empty address")), + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &invalidTxnEmptyAddress.txn, invalidTxnEmptyAddress.inputs, false, false), + Error: &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "Transaction violates user constraint: Transaction.Out contains an output sending to an empty address", + }, + }, + }, + { + name: "422 - txn is unsigned", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusUnprocessableEntity, + httpBody: string(unsignedTxnBodyJSON), + gatewayVerifyTxnVerboseArg: unsignedTxnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: unsignedTxnAndInputs.inputs, + Err: visor.NewErrTxnViolatesUserConstraint(errors.New("Transaction.Out contains an output sending to an empty address")), + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &unsignedTxnAndInputs.txn, unsignedTxnAndInputs.inputs, false, true), + Error: &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "Transaction violates user constraint: Transaction.Out contains an output sending to an empty address", + }, + }, + }, + { + name: "500 - internal server error", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusInternalServerError, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Err: errors.New("verify transaction failed"), + }, + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "verify transaction failed"), + }, + { + name: "422 - txn is confirmed", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusUnprocessableEntity, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: txnAndInputs.inputs, + IsTxnConfirmed: true, + }, + httpResponse: HTTPResponse{ + Error: &HTTPError{ + Message: "transaction has been spent", + Code: http.StatusUnprocessableEntity, + }, + Data: newVerifyTxnResponseJSON(t, &txnAndInputs.txn, txnAndInputs.inputs, true, false), + }, + }, + { + name: "200 - unsigned", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusOK, + httpBody: string(unsignedTxnBodyUnsignedJSON), + gatewayVerifyTxnVerboseArg: unsignedTxnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnUnsigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: unsignedTxnAndInputs.inputs, + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &unsignedTxnAndInputs.txn, unsignedTxnAndInputs.inputs, false, true), + }, + }, + { + name: "200", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: txnAndInputs.inputs, + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &txnAndInputs.txn, txnAndInputs.inputs, false, false), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/transaction/verify" + gateway := &MockGatewayer{} + gateway.On("VerifyTxnVerbose", &tc.gatewayVerifyTxnVerboseArg, tc.gatewayVerifyTxnVerboseSigned).Return(tc.gatewayVerifyTxnVerboseResult.Uxouts, + tc.gatewayVerifyTxnVerboseResult.IsTxnConfirmed, tc.gatewayVerifyTxnVerboseResult.Err) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + req.Header.Set("Content-Type", tc.contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var txnRsp VerifyTransactionResponse + err := json.Unmarshal(rsp.Data, &txnRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(VerifyTransactionResponse), txnRsp) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/uxout.go b/vendor/github.com/SkycoinProject/skycoin/src/api/uxout.go new file mode 100644 index 00000000..7eb478f9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/uxout.go @@ -0,0 +1,87 @@ +package api + +import ( + "net/http" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +// URI: /api/v1/uxout +// Method: GET +// Args: +// uxid: unspent output ID hash +// Returns an unspent output by ID +func uxOutHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + uxid := r.FormValue("uxid") + if uxid == "" { + wh.Error400(w, "uxid is empty") + return + } + + id, err := cipher.SHA256FromHex(uxid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxout, err := gateway.GetUxOutByID(id) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if uxout == nil { + wh.Error404(w, "") + return + } + + wh.SendJSONOr500(logger, w, readable.NewSpentOutput(uxout)) + } +} + +// URI: /api/v1/address_uxouts +// Method: GET +// Args: +// address +// Returns the historical, spent outputs associated with an address +func addrUxOutsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("address") + if addr == "" { + wh.Error400(w, "address is empty") + return + } + + cipherAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxs, err := gateway.GetSpentOutputsForAddresses([]cipher.Address{cipherAddr}) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + ret := make([]readable.SpentOutput, 0) + for _, u := range uxs { + ret = append(ret, readable.NewSpentOutputs(u)...) + } + + wh.SendJSONOr500(logger, w, ret) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/uxout_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/uxout_test.go new file mode 100644 index 00000000..8c47608b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/uxout_test.go @@ -0,0 +1,280 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "errors" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +func TestGetUxOutByID(t *testing.T) { + invalidHash := "carccb" + oddHash := "caccb" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + + type httpBody struct { + uxid string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + uxid string + getGetUxOutByIDArg cipher.SHA256 + getGetUxOutByIDResponse *historydb.UxOut + getGetUxOutByIDError error + httpResponse readable.SpentOutput + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - uxid is empty", + httpBody: &httpBody{ + uxid: "", + }, + }, + { + name: "400 - odd length uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + uxid: oddHash, + }, + uxid: oddHash, + }, + { + name: "400 - invalid uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + uxid: invalidHash, + }, + uxid: invalidHash, + }, + { + name: "400 - getGetUxOutByIDError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getGetUxOutByIDError", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + getGetUxOutByIDError: errors.New("getGetUxOutByIDError"), + }, + { + name: "404 - uxout == nil", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "404 Not Found", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + getGetUxOutByIDResponse: &historydb.UxOut{}, + httpResponse: readable.NewSpentOutput(&historydb.UxOut{}), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + endpoint := "/api/v1/uxout" + gateway.On("GetUxOutByID", tc.getGetUxOutByIDArg).Return(tc.getGetUxOutByIDResponse, tc.getGetUxOutByIDError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.uxid != "" { + v.Add("uxid", tc.httpBody.uxid) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg readable.SpentOutput + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetAddrUxOuts(t *testing.T) { + addressForGwError := testutil.MakeAddress() + addressForGwResponse := testutil.MakeAddress() + type httpBody struct { + address string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getSpentOutputsForAddressesArg []cipher.Address + getSpentOutputsForAddressesResponse [][]historydb.UxOut + getSpentOutputsForAddressesError error + httpResponse []readable.SpentOutput + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - address is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address is empty", + httpBody: &httpBody{ + address: "", + }, + }, + { + name: "400 - cipher.DecodeBase58Address error", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid address length", + httpBody: &httpBody{ + address: "abcd", + }, + }, + { + name: "400 - gateway.GetSpentOutputsForAddresses error", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getSpentOutputsForAddressesError", + httpBody: &httpBody{ + address: addressForGwError.String(), + }, + getSpentOutputsForAddressesArg: []cipher.Address{addressForGwError}, + getSpentOutputsForAddressesError: errors.New("getSpentOutputsForAddressesError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + address: addressForGwResponse.String(), + }, + getSpentOutputsForAddressesArg: []cipher.Address{addressForGwResponse}, + getSpentOutputsForAddressesResponse: [][]historydb.UxOut{{}}, + httpResponse: []readable.SpentOutput{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/address_uxouts" + gateway := &MockGatewayer{} + gateway.On("GetSpentOutputsForAddresses", tc.getSpentOutputsForAddressesArg).Return(tc.getSpentOutputsForAddressesResponse, tc.getSpentOutputsForAddressesError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.address != "" { + v.Add("address", tc.httpBody.address) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []readable.SpentOutput + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/version.go b/vendor/github.com/SkycoinProject/skycoin/src/api/version.go new file mode 100644 index 00000000..bdbd0d85 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/version.go @@ -0,0 +1,22 @@ +package api + +import ( + "net/http" + + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +// versionHandler returns the application version info +// URI: /api/v1/version +// Method: GET +func versionHandler(bi readable.BuildInfo) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wh.SendJSONOr500(logger, w, bi) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/api/wallet.go new file mode 100644 index 00000000..5ca4e974 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/wallet.go @@ -0,0 +1,986 @@ +package api + +// APIs for wallet-related information + +import ( + "encoding/json" + "fmt" + "net/http" + "sort" + "strconv" + + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// UnconfirmedTxnsResponse contains unconfirmed transaction data +type UnconfirmedTxnsResponse struct { + Transactions []readable.UnconfirmedTransactions `json:"transactions"` +} + +// UnconfirmedTxnsVerboseResponse contains verbose unconfirmed transaction data +type UnconfirmedTxnsVerboseResponse struct { + Transactions []readable.UnconfirmedTransactionVerbose `json:"transactions"` +} + +// BalanceResponse address balance summary struct +type BalanceResponse struct { + readable.BalancePair + Addresses readable.AddressBalances `json:"addresses"` +} + +// WalletResponse wallet response struct for http apis +type WalletResponse struct { + Meta readable.WalletMeta `json:"meta"` + Entries []readable.WalletEntry `json:"entries"` +} + +// NewWalletResponse creates WalletResponse struct from wallet.Wallet +func NewWalletResponse(w wallet.Wallet) (*WalletResponse, error) { + var wr WalletResponse + + wr.Meta.Coin = w.Coin() + wr.Meta.Filename = w.Filename() + wr.Meta.Label = w.Label() + wr.Meta.Type = w.Type() + wr.Meta.Version = w.Version() + wr.Meta.CryptoType = w.CryptoType() + wr.Meta.Encrypted = w.IsEncrypted() + wr.Meta.Timestamp = w.Timestamp() + + switch w.Type() { + case wallet.WalletTypeBip44: + bip44Coin := w.Bip44Coin() + wr.Meta.Bip44Coin = &bip44Coin + case wallet.WalletTypeXPub: + wr.Meta.XPub = w.XPub() + } + + entries := w.GetEntries() + wr.Entries = make([]readable.WalletEntry, len(entries)) + + for i, e := range entries { + wr.Entries[i] = readable.WalletEntry{ + Address: e.Address.String(), + Public: e.Public.Hex(), + } + + switch w.Type() { + // Copy these values to another ref to avoid having a pointer + // to an element of Entry which could affect GC of the Entry, + // which could cause retention/copying of secret data in the Entry. + // This is speculative. I don't know if this matters to the go runtime + case wallet.WalletTypeBip44: + childNumber := e.ChildNumber + wr.Entries[i].ChildNumber = &childNumber + change := e.Change + wr.Entries[i].Change = &change + case wallet.WalletTypeXPub: + childNumber := e.ChildNumber + wr.Entries[i].ChildNumber = &childNumber + } + } + + return &wr, nil +} + +// Returns the wallet's balance, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1/wallet/balance +// Method: GET +// Args: +// id: wallet id [required] +func walletBalanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + walletBalance, addressBalances, err := gateway.GetWalletBalance(wltID) + if err != nil { + logger.Errorf("Get wallet balance failed: %v", err) + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: readable.NewBalancePair(walletBalance), + Addresses: readable.NewAddressBalances(addressBalances), + }) + } +} + +// Returns the balance of one or more addresses, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1s/balance +// Method: GET, POST +// Args: +// addrs: command separated list of addresses [required] +func balanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + addrsParam := r.FormValue("addrs") + addrs, err := parseAddressesFromStr(addrsParam) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if len(addrs) == 0 { + wh.Error400(w, "addrs is required") + return + } + + bals, err := gateway.GetBalanceOfAddresses(addrs) + if err != nil { + err = fmt.Errorf("gateway.GetBalanceOfAddresses failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // create map of address to balance + addressBalances := make(readable.AddressBalances, len(addrs)) + for idx, addr := range addrs { + addressBalances[addr.String()] = readable.NewBalancePair(bals[idx]) + } + + var balance wallet.BalancePair + for _, bal := range bals { + var err error + balance.Confirmed, err = balance.Confirmed.Add(bal.Confirmed) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + balance.Predicted, err = balance.Predicted.Add(bal.Predicted) + if err != nil { + wh.Error500(w, err.Error()) + return + } + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: readable.NewBalancePair(balance), + Addresses: addressBalances, + }) + } +} + +// Loads wallet from seed, will scan ahead N address and +// load addresses till the last one that have coins. +// URI: /api/v1/wallet/create +// Method: POST +// Args: +// seed: wallet seed [required] +// seed-passphrase: wallet seed passphrase [optional, bip44 type wallet only] +// type: wallet type [required, one of "deterministic", "bip44" or "xpub"] +// bip44-coin: BIP44 coin type [optional, defaults to 8000 (skycoin's coin type), only valid if type is "bip44"] +// xpub: xpub key [required for xpub wallets] +// label: wallet label [required] +// scan: the number of addresses to scan ahead for balances [optional, must be > 0] +// encrypt: bool value, whether encrypt the wallet [optional] +// password: password for encrypting wallet [optional, must be provided if "encrypt" is set] +func walletCreateHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + walletType := r.FormValue("type") + if walletType == "" { + wh.Error400(w, "missing type") + return + } + + seed := r.FormValue("seed") + switch walletType { + case wallet.WalletTypeDeterministic, wallet.WalletTypeBip44: + if seed == "" { + wh.Error400(w, "missing seed") + return + } + } + + label := r.FormValue("label") + if label == "" { + wh.Error400(w, "missing label") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + var encrypt bool + encryptStr := r.FormValue("encrypt") + if encryptStr != "" { + var err error + encrypt, err = strconv.ParseBool(encryptStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid encrypt value: %v", err)) + return + } + } + + if encrypt && len(password) == 0 { + wh.Error400(w, "missing password") + return + } + + if !encrypt && len(password) > 0 { + wh.Error400(w, "encrypt must be true as password is provided") + return + } + + scanNStr := r.FormValue("scan") + var scanN uint64 = 1 + if scanNStr != "" { + var err error + scanN, err = strconv.ParseUint(scanNStr, 10, 64) + if err != nil { + wh.Error400(w, "invalid scan value") + return + } + } + + if scanN == 0 { + wh.Error400(w, "scan must be > 0") + return + } + + var bip44Coin *bip44.CoinType + bip44CoinStr := r.FormValue("bip44-coin") + if bip44CoinStr != "" { + if walletType != wallet.WalletTypeBip44 { + wh.Error400(w, "bip44-coin is only valid for bip44 type wallets") + return + } + + bip44CoinInt, err := strconv.ParseUint(bip44CoinStr, 10, 32) + if err != nil { + wh.Error400(w, "invalid bip44-coin value") + return + } + + c := bip44.CoinType(bip44CoinInt) + bip44Coin = &c + } + + wlt, err := gateway.CreateWallet("", wallet.Options{ + Seed: seed, + Label: label, + Encrypt: encrypt, + Password: []byte(password), + ScanN: scanN, + Type: walletType, + SeedPassphrase: r.FormValue("seed-passphrase"), + Bip44Coin: bip44Coin, + XPub: r.FormValue("xpub"), + }, gateway) + if err != nil { + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + return + default: + wh.Error400(w, err.Error()) + return + } + default: + wh.Error500(w, err.Error()) + return + } + + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Genreates new addresses +// URI: /api/v1/wallet/newAddress +// Method: POST +// Args: +// id: wallet id [required] +// num: number of address need to create [optional, if not set the default value is 1] +// password: wallet password [optional, must be provided if the wallet is encrypted] +func walletNewAddressesHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + // Compute the number of addresses to create, default is 1 + var n uint64 = 1 + var err error + num := r.FormValue("num") + if num != "" { + n, err = strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, "invalid num value") + return + } + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + addrs, err := gateway.NewAddresses(wltID, []byte(password), n) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + + var rlt = struct { + Addresses []string `json:"addresses"` + }{} + + for _, a := range addrs { + rlt.Addresses = append(rlt.Addresses, a.String()) + } + + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Update wallet label +// URI: /api/v1/wallet/update +// Method: POST +// Args: +// id: wallet id [required] +// label: the label the wallet will be updated to [required] +func walletUpdateHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + // Update wallet + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + label := r.FormValue("label") + if label == "" { + wh.Error400(w, "missing label") + return + } + + if err := gateway.UpdateWalletLabel(wltID, label); err != nil { + logger.Errorf("update wallet label failed: %v", err) + + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, "success") + } +} + +// Returns a wallet by id +// URI: /api/v1/wallet +// Method: GET +// Args: +// id: wallet id [required] +func walletHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, fmt.Sprintf("missing wallet id")) + return + } + + wlt, err := gateway.GetWallet(wltID) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// walletTransactionsHandler returns all unconfirmed transactions for all addresses in a given wallet +// URI: /api/v1/wallet/transactions +// Method: GET +// Args: +// id: wallet id [required] +// verbose: [bool] include verbose transaction input data +func walletTransactionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + handleWalletError := func(err error) { + switch err { + case nil: + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + } + + if verbose { + txns, inputs, err := gateway.GetWalletUnconfirmedTransactionsVerbose(wltID) + if err != nil { + logger.Errorf("get wallet unconfirmed transactions verbose failed: %v", err) + handleWalletError(err) + return + } + + vb := make([]readable.UnconfirmedTransactionVerbose, len(txns)) + for i, txn := range txns { + v, err := readable.NewUnconfirmedTransactionVerbose(&txn, inputs[i]) + if err != nil { + wh.Error500(w, err.Error()) + return + } + vb[i] = *v + } + + wh.SendJSONOr500(logger, w, UnconfirmedTxnsVerboseResponse{ + Transactions: vb, + }) + } else { + txns, err := gateway.GetWalletUnconfirmedTransactions(wltID) + if err != nil { + logger.Errorf("get wallet unconfirmed transactions failed: %v", err) + handleWalletError(err) + return + } + + unconfirmedTxns, err := readable.NewUnconfirmedTransactions(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, UnconfirmedTxnsResponse{ + Transactions: unconfirmedTxns, + }) + } + } +} + +// Returns all loaded wallets +// URI: /api/v1/wallets +// Method: GET +func walletsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wlts, err := gateway.GetWallets() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wrs := make([]*WalletResponse, 0, len(wlts)) + for _, wlt := range wlts { + wr, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wrs = append(wrs, wr) + } + + sort.Slice(wrs, func(i, j int) bool { + return wrs[i].Meta.Timestamp < wrs[j].Meta.Timestamp + }) + + wh.SendJSONOr500(logger, w, wrs) + } +} + +// WalletFolder struct +type WalletFolder struct { + Address string `json:"address"` +} + +// Returns the wallet directory path +// URI: /api/v1/wallets/folderName +// Method: GET +func walletFolderHandler(s Walleter) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr, err := s.WalletDir() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + ret := WalletFolder{ + Address: addr, + } + wh.SendJSONOr500(logger, w, ret) + } +} + +// Generates wallet seed +// URI: /api/v1/wallet/newSeed +// Method: GET +// Args: +// entropy: entropy bitsize [optional, default value of 128 will be used if not set] +func newSeedHandler() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + entropyValue := r.FormValue("entropy") + if entropyValue == "" { + entropyValue = "128" + } + + entropyBits, err := strconv.Atoi(entropyValue) + if err != nil { + wh.Error400(w, "invalid entropy") + return + } + + // Entropy bit size can either be 128 or 256 + if entropyBits != 128 && entropyBits != 256 { + wh.Error400(w, "entropy length must be 128 or 256") + return + } + + entropy, err := bip39.NewEntropy(entropyBits) + if err != nil { + err = fmt.Errorf("bip39.NewEntropy failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + mnemonic, err := bip39.NewMnemonic(entropy) + if err != nil { + err = fmt.Errorf("bip39.NewDefaultMnemonic failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + var rlt = struct { + Seed string `json:"seed"` + }{ + mnemonic, + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// WalletSeedResponse is returned by /api/v1/wallet/seed +type WalletSeedResponse struct { + Seed string `json:"seed"` + SeedPassphrase string `json:"seed_passphrase,omitempty"` +} + +// Returns seed and seed passphrase of wallet of given id +// URI: /api/v1/wallet/seed +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletSeedHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + seed, seedPassphrase, err := gateway.GetWalletSeed(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, + wallet.ErrWalletNotEncrypted, + wallet.ErrInvalidPassword: + wh.Error400(w, err.Error()) + case wallet.ErrWalletAPIDisabled, wallet.ErrSeedAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + v := WalletSeedResponse{ + Seed: seed, + SeedPassphrase: seedPassphrase, + } + + wh.SendJSONOr500(logger, w, v) + } +} + +// VerifySeedRequest is the request data for POST /api/v2/wallet/seed/verify +type VerifySeedRequest struct { + Seed string `json:"seed"` +} + +// walletVerifySeedHandler verifies a wallet seed +// Method: POST +// URI: /api/v2/wallet/seed/verify +func walletVerifySeedHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifySeedRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.Seed == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "seed is required") + writeHTTPResponse(w, resp) + return + } + + if err := bip39.ValidateMnemonic(req.Seed); err != nil { + resp := NewHTTPErrorResponse(http.StatusUnprocessableEntity, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{Data: struct{}{}}) +} + +// Unloads wallet from the wallet service +// URI: /api/v1/wallet/unload +// Method: POST +// Args: +// id: wallet id +func walletUnloadHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + if err := gateway.UnloadWallet(id); err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + } + } +} + +// Encrypts wallet +// URI: /api/v1/wallet/encrypt +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletEncryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.EncryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrWalletEncrypted, + wallet.ErrMissingPassword, + wallet.ErrInvalidPassword: + wh.Error400(w, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + // Make sure the sensitive data are wiped + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Decrypts wallet +// URI: /api/v1/wallet/decrypt +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletDecryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.DecryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, + wallet.ErrWalletNotEncrypted, + wallet.ErrInvalidPassword: + wh.Error400(w, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// WalletRecoverRequest is the request data for POST /api/v2/wallet/recover +type WalletRecoverRequest struct { + ID string `json:"id"` + Seed string `json:"seed"` + SeedPassphrase string `json:"seed_passphrase"` + Password string `json:"password"` +} + +// URI: /api/v2/wallet/recover +// Method: POST +// Args: +// id: wallet id +// seed: wallet seed +// password: [optional] new password +// Recovers an encrypted wallet by providing the seed. +// The first address will be generated from seed and compared to the first address +// of the specified wallet. If they match, the wallet will be regenerated +// with an optional password. +// If the wallet is not encrypted, an error is returned. +func walletRecoverHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req WalletRecoverRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.ID == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "id is required") + writeHTTPResponse(w, resp) + return + } + + if req.Seed == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "seed is required") + writeHTTPResponse(w, resp) + return + } + + var password []byte + if req.Password != "" { + password = []byte(req.Password) + } + + defer func() { + req.Seed = "" + req.SeedPassphrase = "" + req.Password = "" + password = nil + }() + + wlt, err := gateway.RecoverWallet(req.ID, req.Seed, req.SeedPassphrase, password) + if err != nil { + var resp HTTPResponse + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletNotExist: + resp = NewHTTPErrorResponse(http.StatusNotFound, "") + case wallet.ErrWalletAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + default: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + } + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: rlt, + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/wallet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/wallet_test.go new file mode 100644 index 00000000..e26b142f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/wallet_test.go @@ -0,0 +1,2978 @@ +package api + +import ( + "errors" + "io" + "math" + "net/http" + "net/http/httptest" + "net/url" + "strconv" + "strings" + "testing" + + "encoding/json" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func TestGetBalanceHandler(t *testing.T) { + type httpBody struct { + addrs string + } + invalidAddr := "invalidAddr" + validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" + address, err := cipher.DecodeBase58Address(validAddr) + require.NoError(t, err) + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getBalanceOfAddrsArg []cipher.Address + getBalanceOfAddrsResponse []wallet.BalancePair + getBalanceOfAddrsError error + httpResponse readable.BalancePair + }{ + { + name: "405", + method: http.MethodDelete, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address \"invalidAddr\" is invalid: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddr, + }, + }, + { + name: "400 - no addresses", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs is required", + httpBody: &httpBody{}, + }, + { + name: "500 - GetBalanceOfAddrsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBalanceOfAddresses failed: GetBalanceOfAddrsError", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsError: errors.New("GetBalanceOfAddrsError"), + }, + { + name: "500 - balance Confirmed coins uint64 addition overflow", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - uint64 addition overflow", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + }, + { + name: "500 - balance Predicted coins uint64 addition overflow", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - uint64 addition overflow", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + }, + }, + }, + { + name: "200 - OK", + method: http.MethodGet, + status: http.StatusOK, + err: "200 - OK", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + httpResponse: readable.BalancePair{}, + }, + { + name: "200 - OK POST", + method: http.MethodPost, + status: http.StatusOK, + err: "200 - OK", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + httpResponse: readable.BalancePair{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + endpoint := "/api/v1/balance" + gateway.On("GetBalanceOfAddresses", tc.getBalanceOfAddrsArg).Return(tc.getBalanceOfAddrsResponse, tc.getBalanceOfAddrsError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + } + + var reqBody io.Reader + if len(v) > 0 { + if tc.method == http.MethodPost { + reqBody = strings.NewReader(v.Encode()) + } else { + endpoint += "?" + v.Encode() + } + } + + req, err := http.NewRequest(tc.method, endpoint, reqBody) + require.NoError(t, err) + + if tc.method == http.MethodPost { + req.Header.Set("Content-Type", ContentTypeForm) + } + + rr := httptest.NewRecorder() + + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + var msg readable.BalancePair + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestWalletGet(t *testing.T) { + entries, resEntries := makeEntries([]byte("seed"), 5) + type httpBody struct { + WalletID string + Dst string + Coins string + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + gatewayGetWalletResultFunc func(string) wallet.Wallet + responseBody WalletResponse + gatewayGetWalletErr error + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "", + }, + { + name: "400 - error from the `gateway.GetWallet(wltID)`", + method: http.MethodGet, + body: &httpBody{ + WalletID: "123", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet 123 doesn't exist", + walletID: "123", + gatewayGetWalletResultFunc: func(_ string) wallet.Wallet { + var p *wallet.DeterministicWallet + return p + }, + gatewayGetWalletErr: errors.New("wallet 123 doesn't exist"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "1234", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "1234", + gatewayGetWalletResultFunc: func(_ string) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{"seed": "seed", "lastSeed": "seed"}, + Entries: []wallet.Entry{}, + } + }, + gatewayGetWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "1234", + }, + status: http.StatusOK, + walletID: "1234", + gatewayGetWalletResultFunc: func(_ string) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{"seed": "seed", "lastSeed": "seed"}, + Entries: cloneEntries(entries), + } + }, + responseBody: WalletResponse{Entries: resEntries[:]}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetWallet", tc.walletID).Return(tc.gatewayGetWalletResultFunc, tc.gatewayGetWalletErr) + + v := url.Values{} + + endpoint := "/api/v1/wallet" + + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), + "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var rlt WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &rlt) + require.NoError(t, err) + require.Equal(t, tc.responseBody, rlt) + } + }) + } +} + +func TestWalletBalanceHandler(t *testing.T) { + type httpBody struct { + WalletID string + Dst string + Coins string + } + + type balanceResult struct { + BalancePair wallet.BalancePair + Addresses wallet.AddressBalances + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + gatewayGetWalletBalanceResult balanceResult + gatewayBalanceErr error + result *readable.BalancePair + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "0", + }, + { + name: "404 - gw `wallet doesn't exist` error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "notFoundId", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "notFoundId", + gatewayGetWalletBalanceResult: balanceResult{}, + gatewayBalanceErr: wallet.ErrWalletNotExist, + result: &readable.BalancePair{ + Confirmed: readable.Balance{Coins: 0, Hours: 0}, + Predicted: readable.Balance{Coins: 0, Hours: 0}, + }, + }, + { + name: "500 - gw other error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "someId", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayBalanceError", + walletID: "someId", + gatewayGetWalletBalanceResult: balanceResult{}, + gatewayBalanceErr: errors.New("gatewayBalanceError"), + result: &readable.BalancePair{ + Confirmed: readable.Balance{Coins: 0, Hours: 0}, + Predicted: readable.Balance{Coins: 0, Hours: 0}, + }, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletBalanceResult: balanceResult{}, + gatewayBalanceErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + result: &readable.BalancePair{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetWalletBalance", tc.walletID).Return(tc.gatewayGetWalletBalanceResult.BalancePair, + tc.gatewayGetWalletBalanceResult.Addresses, tc.gatewayBalanceErr) + + endpoint := "/api/v1/wallet/balance" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + if status != tc.status { + t.Errorf("got `%v` want `%v`", status, tc.status) + } + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg readable.BalancePair + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, &msg, tc.name) + } + }) + } +} + +func TestUpdateWalletLabelHandler(t *testing.T) { + type httpBody struct { + WalletID string + Label string + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + label string + gatewayUpdateWalletLabelErr error + responseBody string + }{ + { + name: "405", + method: http.MethodGet, + body: &httpBody{}, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "400 - missing label", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing label", + walletID: "foo", + }, + { + name: "404 - gateway.UpdateWalletLabel ErrWalletNotExist", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: wallet.ErrWalletNotExist, + }, + { + name: "500 - gateway.UpdateWalletLabel error", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.UpdateWalletLabel error", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: errors.New("gateway.UpdateWalletLabel error"), + }, + { + name: "403 Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 OK", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: nil, + responseBody: "\"success\"", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("UpdateWalletLabel", tc.walletID, tc.label).Return(tc.gatewayUpdateWalletLabelErr) + + endpoint := "/api/v1/wallet/update" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + if tc.body.Label != "" { + v.Add("label", tc.body.Label) + } + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + require.Equal(t, tc.responseBody, rr.Body.String(), tc.name) + } + }) + } +} + +func TestWalletTransactionsHandler(t *testing.T) { + type httpBody struct { + walletID string + verbose string + } + + uTxn := &visor.UnconfirmedTransaction{ + Transaction: coin.Transaction{ + In: []cipher.SHA256{testutil.RandSHA256(t)}, + }, + } + + unconfirmedTxn, err := readable.NewUnconfirmedTransaction(uTxn) + require.NoError(t, err) + + unconfirmedTxnVerbose, err := readable.NewUnconfirmedTransactionVerbose(uTxn, []visor.TransactionInput{ + visor.TransactionInput{}, + }) + require.NoError(t, err) + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + verbose bool + gatewayGetWalletUnconfirmedTxnsResult []visor.UnconfirmedTransaction + gatewayGetWalletUnconfirmedTxnsErr error + gatewayGetWalletUnconfirmedTxnsVerboseResult []readable.UnconfirmedTransactionVerbose + gatewayGetWalletUnconfirmedTxnsVerboseErr error + responseBody interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "400 - missing wallet id", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + + { + name: "400 - invalid verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + body: &httpBody{ + verbose: "foo", + }, + err: "400 Bad Request - Invalid value for verbose", + }, + + { + name: "500 - gateway.GetWalletUnconfirmedTransactions error", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetWalletUnconfirmedTransactions error", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: errors.New("gateway.GetWalletUnconfirmedTransactions error"), + }, + + { + name: "500 - gateway.GetWalletUnconfirmedTransactionsVerbose error", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + verbose: "1", + }, + verbose: true, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetWalletUnconfirmedTransactionsVerbose error", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsVerboseErr: errors.New("gateway.GetWalletUnconfirmedTransactionsVerbose error"), + }, + + { + name: "404 - wallet doesn't exist", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletNotExist, + }, + + { + name: "404 - wallet doesn't exist verbose", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + verbose: "1", + }, + verbose: true, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsVerboseErr: wallet.ErrWalletNotExist, + }, + + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletAPIDisabled, + }, + + { + name: "403 - Forbidden - wallet API disabled verbose", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + verbose: "1", + }, + verbose: true, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsVerboseErr: wallet.ErrWalletAPIDisabled, + }, + + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + }, + status: http.StatusOK, + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsResult: make([]visor.UnconfirmedTransaction, 1), + responseBody: UnconfirmedTxnsResponse{ + Transactions: []readable.UnconfirmedTransactions{ + *unconfirmedTxn, + }, + }, + }, + + { + name: "200 - OK verbose", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + verbose: "1", + }, + verbose: true, + status: http.StatusOK, + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsVerboseResult: make([]readable.UnconfirmedTransactionVerbose, 1), + responseBody: UnconfirmedTxnsVerboseResponse{ + Transactions: []readable.UnconfirmedTransactionVerbose{ + *unconfirmedTxnVerbose, + }, + }, + }, + } + + for _, tc := range tt { + gateway := &MockGatewayer{} + gateway.On("GetWalletUnconfirmedTransactions", tc.walletID).Return(tc.gatewayGetWalletUnconfirmedTxnsResult, tc.gatewayGetWalletUnconfirmedTxnsErr) + gateway.On("GetWalletUnconfirmedTransactionsVerbose", tc.walletID).Return(tc.gatewayGetWalletUnconfirmedTxnsVerboseResult, tc.gatewayGetWalletUnconfirmedTxnsVerboseErr) + + endpoint := "/api/v1/wallet/transactions" + + v := url.Values{} + if tc.body != nil { + if tc.body.walletID != "" { + v.Add("id", tc.body.walletID) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + return + } + + if tc.verbose { + var msg UnconfirmedTxnsVerboseResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // require.Equal on whole response might result in flaky tests as there is a time field attached to unconfirmed txn response + require.IsType(t, msg, tc.responseBody) + require.Len(t, msg.Transactions, 1) + require.Equal(t, msg.Transactions[0].Transaction, tc.responseBody.(UnconfirmedTxnsVerboseResponse).Transactions[0].Transaction) + } else { + var msg UnconfirmedTxnsResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // require.Equal on whole response might result in flaky tests as there is a time field attached to unconfirmed txn response + require.IsType(t, msg, tc.responseBody) + require.Len(t, msg.Transactions, 1) + require.Equal(t, msg.Transactions[0].Transaction, tc.responseBody.(UnconfirmedTxnsResponse).Transactions[0].Transaction) + } + } +} + +func TestWalletCreateHandler(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type httpBody struct { + Seed string + Label string + ScanN string + Encrypt bool + Password string + Type string + SeedPassphrase string + Bip44Coin string + XPub string + } + tt := []struct { + name string + method string + body *httpBody + status int + err string + wltName string + options wallet.Options + gatewayCreateWalletResult func(string, wallet.Options, wallet.TransactionsFinder) wallet.Wallet + gatewayCreateWalletErr error + responseBody WalletResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + wltName: "foo", + }, + { + name: "400 - missing type", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing type", + wltName: "foo", + }, + { + name: "400 - missing seed", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing seed", + wltName: "foo", + }, + { + name: "400 - missing label", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing label", + wltName: "foo", + }, + { + name: "400 - invalid scan value", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "bad scanN", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid scan value", + wltName: "foo", + }, + { + name: "400 - scan must be > 0", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "0", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - scan must be > 0", + wltName: "foo", + }, + { + name: "400 - invalid bip44 coin", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeBip44, + Seed: bip39.MustNewDefaultMnemonic(), + Label: "bar", + ScanN: "1", + Bip44Coin: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid bip44-coin value", + wltName: "foo", + }, + { + name: "400 - invalid bip44 coin 2", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeBip44, + Seed: bip39.MustNewDefaultMnemonic(), + Label: "bar", + ScanN: "1", + Bip44Coin: "4294967296", // MaxUint32+1: Bip44Coin must be uint32 + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid bip44-coin value", + wltName: "foo", + }, + { + name: "400 - bip44 coin does not match type", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: bip39.MustNewDefaultMnemonic(), + Label: "bar", + ScanN: "1", + Bip44Coin: "8000", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - bip44-coin is only valid for bip44 type wallets", + wltName: "foo", + }, + { + name: "400 - seed in use", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - a wallet already exists with this seed", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + }, + gatewayCreateWalletErr: wallet.ErrSeedUsed, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + var p *wallet.DeterministicWallet + return p + }, + }, + { + name: "500 - gateway.CreateWallet error", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "1", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.CreateWallet error", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + }, + gatewayCreateWalletErr: errors.New("gateway.CreateWallet error"), + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + var p *wallet.DeterministicWallet + return p + }, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletErr: wallet.ErrWalletAPIDisabled, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + var p *wallet.DeterministicWallet + return p + }, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + }, + Entries: responseEntries[:], + }, + }, + { + name: "200 - OK - with seed passphrase", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeBip44, + Seed: "foo", + Label: "bar", + ScanN: "2", + SeedPassphrase: "foobar", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeBip44, + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + SeedPassphrase: "foobar", + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + }, + Entries: responseEntries[:], + }, + }, + { + name: "200 - OK - xpub", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeXPub, + Label: "bar", + ScanN: "2", + XPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeXPub, + Label: "bar", + Password: []byte{}, + ScanN: 2, + XPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + }, + Entries: responseEntries[:], + }, + }, + // CSRF Tests + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + }, + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + }, + Entries: []readable.WalletEntry{}, + }, + csrfDisabled: true, + }, + { + name: "200 - OK - Encrypted", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + Encrypt: true, + Password: "pwd", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 2, + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + "label": "bar", + "encrypted": "true", + "secrets": "secrets", + }, + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + Label: "bar", + Encrypted: true, + }, + Entries: []readable.WalletEntry{}, + }, + }, + { + name: "400 Bad request - encrypt without password", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + Encrypt: true, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing password", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + if tc.options.ScanN == 0 { + tc.options.ScanN = 1 + } + gateway.On("CreateWallet", "", tc.options, gateway).Return(tc.gatewayCreateWalletResult, tc.gatewayCreateWalletErr) + + endpoint := "/api/v1/wallet/create" + + v := url.Values{} + if tc.body != nil { + if tc.body.Seed != "" { + v.Add("seed", tc.body.Seed) + } + if tc.body.Label != "" { + v.Add("label", tc.body.Label) + } + if tc.body.ScanN != "" { + v.Add("scan", tc.body.ScanN) + } + + if tc.body.Encrypt { + v.Add("encrypt", strconv.FormatBool(tc.body.Encrypt)) + } + + if tc.body.Password != "" { + v.Add("password", tc.body.Password) + } + + if tc.body.Type != "" { + v.Add("type", tc.body.Type) + } + + if tc.body.SeedPassphrase != "" { + v.Add("seed-passphrase", tc.body.SeedPassphrase) + } + + if tc.body.Bip44Coin != "" { + v.Add("bip44-coin", tc.body.Bip44Coin) + } + + if tc.body.XPub != "" { + v.Add("xpub", tc.body.XPub) + } + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + req.Header.Add("Content-Type", ContentTypeForm) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + body := strings.TrimSpace(rr.Body.String()) + require.Equal(t, tc.err, body, "got `%v`| %d, want `%v`", body, status, tc.err) + return + } + + var msg WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.responseBody, msg, tc.name) + }) + } +} + +func TestWalletNewSeed(t *testing.T) { + type httpBody struct { + Entropy string + } + tt := []struct { + name string + method string + body *httpBody + status int + err string + entropy string + resultLen int + }{ + { + name: "405", + method: http.MethodPut, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid entropy type", + method: http.MethodGet, + body: &httpBody{ + Entropy: "xx", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid entropy", + entropy: "xx", + }, + { + name: "400 - `wrong entropy length` error", + method: http.MethodGet, + body: &httpBody{ + Entropy: "200", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - entropy length must be 128 or 256", + entropy: "200", + }, + { + name: "200 - OK with no entropy", + method: http.MethodGet, + body: &httpBody{}, + status: http.StatusOK, + entropy: "128", + resultLen: 12, + }, + { + name: "200 - OK | 12 word seed", + method: http.MethodGet, + body: &httpBody{ + Entropy: "128", + }, + status: http.StatusOK, + entropy: "128", + resultLen: 12, + }, + { + name: "200 - OK | 24 word seed", + method: http.MethodGet, + body: &httpBody{ + Entropy: "256", + }, + status: http.StatusOK, + entropy: "256", + resultLen: 24, + }, + } + + // Loop over each test case + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + + endpoint := "/api/v1/wallet/newSeed" + + // Add request parameters to url + v := url.Values{} + if tc.body != nil { + if tc.body.Entropy != "" { + v.Add("entropy", tc.body.Entropy) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` expected `%v`", tc.name, status, tc.status) + if status != tc.status { + t.Errorf("got `%v` want `%v`", status, tc.status) + } + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, expected `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg struct { + Seed string `json:"seed"` + } + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // check that expected length is equal to response length + require.Equal(t, tc.resultLen, len(strings.Fields(msg.Seed)), tc.name) + } + }) + } +} + +func TestVerifySeed(t *testing.T) { + cases := []struct { + name string + method string + status int + contentType string + csrfDisabled bool + httpBody string + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: ContentTypeForm, + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 - EOF", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "400 - Missing Seed", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: "{}", + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "seed is required"), + }, + { + name: "400 - Invalid seed", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusUnprocessableEntity, + httpBody: toJSON(t, VerifySeedRequest{ + Seed: "bag attitude butter flock slab desk ship brain famous scheme clerk", + }), + httpResponse: NewHTTPErrorResponse(http.StatusUnprocessableEntity, bip39.ErrInvalidNumberOfWords.Error()), + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(t, VerifySeedRequest{ + Seed: "chief stadium sniff exhibit ostrich exit fruit noodle good lava coin supply", + }), + httpResponse: HTTPResponse{Data: struct{}{}}, + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(t, VerifySeedRequest{ + Seed: "chief stadium sniff exhibit ostrich exit fruit noodle good lava coin supply", + }), + httpResponse: HTTPResponse{Data: struct{}{}}, + csrfDisabled: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/wallet/seed/verify" + gateway := &MockGatewayer{} + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Set("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var addrRsp struct{} + err := json.Unmarshal(rsp.Data, &addrRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data, addrRsp) + } + + }) + } +} + +func TestGetWalletSeed(t *testing.T) { + tt := []struct { + name string + method string + wltID string + password string + gatewayReturnArgs []interface{} + expectStatus int + expectSeed string + expectSeedPassphrase string + expectErr string + csrfDisabled bool + }{ + { + name: "200 - OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + "seed-passphrase", + nil, + }, + expectStatus: http.StatusOK, + expectSeed: "seed", + expectSeedPassphrase: "seed-passphrase", + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + "", + nil, + }, + expectStatus: http.StatusOK, + expectSeed: "seed", + expectSeedPassphrase: "", + csrfDisabled: true, + }, + { + name: "400 - missing wallet id ", + method: http.MethodPost, + wltID: "", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + "", + nil, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 - missing password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturnArgs: []interface{}{ + "", + "", + wallet.ErrMissingPassword, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 Bad Request - Invalid password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "", + "", + wallet.ErrInvalidPassword, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - invalid password", + }, + { + name: "400 - wallet not encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "", + "", + wallet.ErrWalletNotEncrypted, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is not encrypted", + }, + { + name: "404 - wallet does not exist", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "", + "", + wallet.ErrWalletNotExist, + }, + expectStatus: http.StatusNotFound, + expectErr: "404 Not Found", + }, + { + name: "405 - Method Not Allowed", + method: http.MethodGet, + expectStatus: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetWalletSeed", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturnArgs...) + + endpoint := "/api/v1/wallet/seed" + + v := url.Values{} + v.Add("id", tc.wltID) + if len(tc.password) > 0 { + v.Add("password", tc.password) + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.expectStatus, status) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + } else { + var r WalletSeedResponse + err := json.Unmarshal(rr.Body.Bytes(), &r) + require.NoError(t, err) + require.Equal(t, tc.expectSeed, r.Seed) + require.Equal(t, tc.expectSeedPassphrase, r.SeedPassphrase) + } + }) + } +} + +func TestWalletNewAddressesHandler(t *testing.T) { + type httpBody struct { + ID string + Num string + Password string + } + type Addresses struct { + Address []string `json:"addresses"` + } + + var responseAddresses = Addresses{} + var responseEmptyAddresses = Addresses{} + + var emptyAddrs = make([]cipher.Address, 0) + var addrs = make([]cipher.Address, 3) + + for i := 0; i < 3; i++ { + pub, _ := cipher.MustGenerateDeterministicKeyPair(cipher.RandByte(32)) + addrs[i] = cipher.AddressFromPubKey(pub) + responseAddresses.Address = append(responseAddresses.Address, addrs[i].String()) + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + n uint64 + password string + gatewayNewAddressesResult []cipher.Address + gatewayNewAddressesErr error + responseBody Addresses + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "400 - invalid num value", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "bar", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid num value", + }, + { + name: "400 - gateway.NewAddresses error", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - gateway.NewAddresses error", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: errors.New("gateway.NewAddresses error"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "400 Bad Request - missing password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing password", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrMissingPassword, + }, + { + name: "400 Bad Request - Invalid password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid password", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrInvalidPassword, + }, + { + name: "400 Bad Request - permission denied", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - saving wallet permission denied", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrWalletPermission, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + }, + { + name: "200 - OK with password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + Password: "pwd", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + }, + { + name: "200 - OK empty addresses", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "0", + }, + status: http.StatusOK, + walletID: "foo", + n: 0, + gatewayNewAddressesResult: emptyAddrs, + responseBody: responseEmptyAddresses, + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("NewAddresses", tc.walletID, []byte(tc.password), tc.n).Return(tc.gatewayNewAddressesResult, tc.gatewayNewAddressesErr) + + endpoint := "/api/v1/wallet/newAddress" + + v := url.Values{} + if tc.body != nil { + if tc.body.ID != "" { + v.Add("id", tc.body.ID) + } + if tc.body.Num != "" { + v.Add("num", tc.body.Num) + } + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Addresses + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.responseBody, msg, tc.name) + } + }) + } +} + +func TestGetWalletFolderHandler(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + getWalletDirResponse string + getWalletDirErr error + httpResponse WalletFolder + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getWalletDirResponse: "/wallet/folder/address", + httpResponse: WalletFolder{ + Address: "/wallet/folder/address", + }, + }, + { + name: "403 - wallet API disabled", + method: http.MethodGet, + status: http.StatusForbidden, + err: "403 Forbidden", + getWalletDirErr: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + gateway := &MockGatewayer{} + gateway.On("WalletDir").Return(tc.getWalletDirResponse, tc.getWalletDirErr) + + endpoint := "/api/v1/wallets/folderName" + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg WalletFolder + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } +} + +func TestGetWallets(t *testing.T) { + var pubkeys []cipher.PubKey + var seckeys []cipher.SecKey + var addrs []cipher.Address + + for i := 0; i < 4; i++ { + pubkey, seckey := cipher.GenerateKeyPair() + addr := cipher.AddressFromPubKey(pubkey) + pubkeys = append(pubkeys, pubkey) + seckeys = append(seckeys, seckey) + addrs = append(addrs, addr) + } + + cases := []struct { + name string + method string + status int + err string + getWalletsResponse wallet.Wallets + getWalletsErr error + httpResponse []*WalletResponse + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "403 - wallet API disabled", + method: http.MethodGet, + status: http.StatusForbidden, + err: "403 Forbidden", + getWalletsErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 no wallets", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: nil, + httpResponse: []*WalletResponse{}, + }, + { + name: "200 no wallets 2", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: wallet.Wallets{}, + httpResponse: []*WalletResponse{}, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: wallet.Wallets{ + "foofilename": &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "foo": "bar", + "seed": "fooseed", + "lastSeed": "foolastseed", + "coin": "foocoin", + "filename": "foofilename", + "label": "foolabel", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "345678", + "encrypted": "true", + }, + Entries: []wallet.Entry{ + { + Address: addrs[0], + Public: pubkeys[0], + Secret: seckeys[0], + }, + }, + }, + "foofilename2": &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "foo": "bar2", + "seed": "fooseed2", + "lastSeed": "foolastseed2", + "coin": "foocoin", + "filename": "foofilename2", + "label": "foolabel2", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "123456", + "encrypted": "false", + }, + Entries: []wallet.Entry{ + { + Address: addrs[1], + Public: pubkeys[1], + Secret: seckeys[1], + }, + }, + }, + "foofilename3": &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "foo": "bar3", + "seed": "fooseed3", + "lastSeed": "foolastseed3", + "coin": "foocoin", + "filename": "foofilename3", + "label": "foolabel3", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "234567", + "encrypted": "true", + }, + Entries: []wallet.Entry{ + { + Address: addrs[2], + Public: pubkeys[2], + Secret: seckeys[2], + }, + { + Address: addrs[3], + Public: pubkeys[3], + Secret: seckeys[3], + }, + }, + }, + }, + httpResponse: []*WalletResponse{ + { + Meta: readable.WalletMeta{ + Coin: "foocoin", + Filename: "foofilename2", + Label: "foolabel2", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 123456, + Encrypted: false, + }, + Entries: []readable.WalletEntry{ + { + Address: addrs[1].String(), + Public: pubkeys[1].Hex(), + }, + }, + }, + { + Meta: readable.WalletMeta{ + Coin: "foocoin", + Filename: "foofilename3", + Label: "foolabel3", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 234567, + Encrypted: true, + }, + Entries: []readable.WalletEntry{ + { + Address: addrs[2].String(), + Public: pubkeys[2].Hex(), + }, + { + Address: addrs[3].String(), + Public: pubkeys[3].Hex(), + }, + }, + }, + { + Meta: readable.WalletMeta{ + Coin: "foocoin", + Filename: "foofilename", + Label: "foolabel", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 345678, + Encrypted: true, + }, + Entries: []readable.WalletEntry{ + { + Address: addrs[0].String(), + Public: pubkeys[0].Hex(), + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + gateway := &MockGatewayer{} + gateway.On("GetWallets").Return(tc.getWalletsResponse, tc.getWalletsErr) + + endpoint := "/api/v1/wallets" + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []*WalletResponse + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.NotNil(t, msg) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } +} + +func TestWalletUnloadHandler(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + walletID string + unloadWalletErr error + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "wallet.wlt", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "wallet.wlt", + unloadWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - ok", + method: http.MethodPost, + status: http.StatusOK, + walletID: "wallet.wlt", + }, + { + name: "200 - ok, csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + walletID: "wallet.wlt", + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("UnloadWallet", tc.walletID).Return(tc.unloadWalletErr) + + endpoint := "/api/v1/wallet/unload" + v := url.Values{} + v.Add("id", tc.walletID) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } + }) + } +} + +func TestEncryptWallet(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type gatewayReturnPair struct { + w wallet.Wallet + err error + } + tt := []struct { + name string + method string + wltID string + password string + gatewayReturn gatewayReturnPair + status int + expectWallet WalletResponse + expectErr string + }{ + { + name: "200 - OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "wallet.wlt", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "secrets", + "encrypted": "true", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "wallet.wlt", + Encrypted: true, + }, + Entries: responseEntries, + }, + }, + { + name: "403 Forbidden", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + status: http.StatusForbidden, + expectErr: "403 Forbidden", + }, + { + name: "405 Method Not Allowed", + method: http.MethodGet, + wltID: "wallet.wlt", + password: "pwd", + status: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + { + name: "400 - Missing Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrMissingPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 - Missing Wallet Id", + method: http.MethodPost, + wltID: "", + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 Bad Request - Invalid Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrInvalidPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - invalid password", + }, + { + name: "404 - Wallet Not Found", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + status: http.StatusNotFound, + expectErr: "404 Not Found", + }, + { + name: "400 - Wallet Is Encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletEncrypted, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is encrypted", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("EncryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + + endpoint := "/api/v1/wallet/encrypt" + v := url.Values{} + v.Add("id", tc.wltID) + v.Add("password", tc.password) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`, body: %v", status, tc.status, rr.Body.String()) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + return + } + + var rsp WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + require.Equal(t, tc.expectWallet, rsp) + }) + } +} + +func TestDecryptWallet(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type gatewayReturnPair struct { + w wallet.Wallet + err error + } + + tt := []struct { + name string + method string + wltID string + password string + gatewayReturn gatewayReturnPair + status int + expectWallet WalletResponse + expectErr string + csrfDisabled bool + }{ + { + name: "200 OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "wallet", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "", + "encrypted": "false", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "wallet", + Encrypted: false, + }, + Entries: responseEntries, + }, + }, + { + name: "200 OK CSRF disabled", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "wallet", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "", + "encrypted": "false", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "wallet", + Encrypted: false, + }, + Entries: responseEntries, + }, + csrfDisabled: true, + }, + + { + name: "403 Forbidden", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + status: http.StatusForbidden, + expectErr: "403 Forbidden", + }, + { + name: "405 Method Not Allowed", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + { + name: "400 - Missing Wallet ID", + method: http.MethodPost, + wltID: "", + password: "", + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 - Missing Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrMissingPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 - Wallet IS Not Encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotEncrypted, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is not encrypted", + }, + { + name: "400 Bad Request - Invalid Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrInvalidPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - invalid password", + }, + { + name: "404 - Wallet Does Not Exist", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + status: http.StatusNotFound, + expectErr: "404 Not Found", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("DecryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + + endpoint := "/api/v1/wallet/decrypt" + v := url.Values{} + v.Add("id", tc.wltID) + v.Add("password", tc.password) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + return + } + + var rsp WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + require.Equal(t, tc.expectWallet, rsp) + }) + } +} + +// makeEntries derives N wallet address entries from given seed +// Returns set of wallet.Entry and wallet.ReadableEntry, the readable +// entries' secrets are removed. +func makeEntries(seed []byte, n int) ([]wallet.Entry, []readable.WalletEntry) { //nolint:unparam + seckeys := cipher.MustGenerateDeterministicKeyPairs(seed, n) + var entries []wallet.Entry + var responseEntries []readable.WalletEntry + for i, seckey := range seckeys { + pubkey := cipher.MustPubKeyFromSecKey(seckey) + entries = append(entries, wallet.Entry{ + Address: cipher.AddressFromPubKey(pubkey), + Public: pubkey, + Secret: seckey, + }) + responseEntries = append(responseEntries, readable.WalletEntry{ + Address: entries[i].Address.String(), + Public: entries[i].Public.Hex(), + }) + } + return entries, responseEntries +} + +func cloneEntries(es []wallet.Entry) []wallet.Entry { + var entries []wallet.Entry + entries = append(entries, es...) + return entries +} + +func TestWalletRecover(t *testing.T) { + type gatewayReturnPair struct { + w wallet.Wallet + err error + } + + okWalletUnencrypted, err := wallet.NewWallet("foo", wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Coin: wallet.CoinTypeSkycoin, + Label: "foolabel", + Seed: "fooseed", + GenerateN: 10, + }) + require.NoError(t, err) + okWalletUnencryptedResponse, err := NewWalletResponse(okWalletUnencrypted) + require.NoError(t, err) + + okWalletEncrypted, err := wallet.NewWallet("foo", wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Coin: wallet.CoinTypeSkycoin, + Label: "foolabel", + Seed: "fooseed", + Encrypt: true, + Password: []byte("foopassword"), + CryptoType: wallet.CryptoTypeScryptChacha20poly1305Insecure, + GenerateN: 10, + }) + require.NoError(t, err) + okWalletEncryptedResponse, err := NewWalletResponse(okWalletEncrypted) + require.NoError(t, err) + + cases := []struct { + name string + method string + status int + contentType string + req *WalletRecoverRequest + httpBody string + httpResponse HTTPResponse + gatewayReturn gatewayReturnPair + }{ + { + name: "method not allowed", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + contentType: ContentTypeJSON, + httpBody: toJSON(t, WalletRecoverRequest{}), + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, "Method Not Allowed"), + }, + { + name: "wrong content-type", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + contentType: ContentTypeForm, + httpBody: toJSON(t, WalletRecoverRequest{}), + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, "Unsupported Media Type"), + }, + { + name: "empty json body", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + httpBody: "", + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "id missing", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + Seed: "fooseed", + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "id is required"), + }, + { + name: "seed missing", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "seed is required"), + }, + { + name: "wallet not encrypted", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotEncrypted, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, wallet.ErrWalletNotEncrypted.Error()), + }, + { + name: "wallet seed wrong", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletRecoverSeedWrong, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, wallet.ErrWalletRecoverSeedWrong.Error()), + }, + { + name: "wallet does not exist", + method: http.MethodPost, + status: http.StatusNotFound, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "Not Found"), + }, + { + name: "wallet api disabled", + method: http.MethodPost, + status: http.StatusForbidden, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "wallet other error", + method: http.MethodPost, + status: http.StatusInternalServerError, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: errors.New("wallet error"), + }, + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "wallet error"), + }, + { + name: "ok, no password", + method: http.MethodPost, + status: http.StatusOK, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + w: okWalletUnencrypted, + }, + httpResponse: HTTPResponse{ + Data: *okWalletUnencryptedResponse, + }, + }, + { + name: "ok, seed passphrase, no password", + method: http.MethodPost, + status: http.StatusOK, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + SeedPassphrase: "fooseedpassphrase", + }, + gatewayReturn: gatewayReturnPair{ + w: okWalletUnencrypted, + }, + httpResponse: HTTPResponse{ + Data: *okWalletUnencryptedResponse, + }, + }, + { + name: "ok, password", + method: http.MethodPost, + status: http.StatusOK, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + Password: "foopassword", + }, + gatewayReturn: gatewayReturnPair{ + w: okWalletEncrypted, + }, + httpResponse: HTTPResponse{ + Data: *okWalletEncryptedResponse, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + if tc.req != nil { + var password []byte + if tc.req.Password != "" { + password = []byte(tc.req.Password) + } + gateway.On("RecoverWallet", tc.req.ID, tc.req.Seed, tc.req.SeedPassphrase, password).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + } + + if tc.httpBody == "" && tc.req != nil { + tc.httpBody = toJSON(t, tc.req) + } + + endpoint := "/api/v2/wallet/recover" + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Set("Content-Type", contentType) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var wltRsp WalletResponse + err := json.Unmarshal(rsp.Data, &wltRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(WalletResponse), wltRsp) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/address.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/address.go new file mode 100644 index 00000000..3ada34ac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/address.go @@ -0,0 +1,183 @@ +package cipher + +import ( + "errors" + "log" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +var ( + // ErrAddressInvalidLength Unexpected size of address bytes buffer + ErrAddressInvalidLength = errors.New("Invalid address length") + // ErrAddressInvalidChecksum Computed checksum did not match expected value + ErrAddressInvalidChecksum = errors.New("Invalid checksum") + // ErrAddressInvalidVersion Unsupported address version value + ErrAddressInvalidVersion = errors.New("Address version invalid") + // ErrAddressInvalidPubKey Public key invalid for address + ErrAddressInvalidPubKey = errors.New("Public key invalid for address") + // ErrAddressInvalidFirstByte Invalid first byte in wallet import format string + ErrAddressInvalidFirstByte = errors.New("first byte invalid") + // ErrAddressInvalidLastByte 33rd byte in wallet import format string is invalid + ErrAddressInvalidLastByte = errors.New("invalid 33rd byte") +) + +/* +Addresses are the Ripemd160 of the double SHA256 of the public key +- public key must be in compressed format + +In the block chain the address is 20+1 bytes +- the first byte is the version byte +- the next twenty bytes are RIPMD160(SHA256(SHA256(pubkey))) + +In base 58 format the address is 20+1+4 bytes +- the first 20 bytes are RIPMD160(SHA256(SHA256(pubkey))). +-- this is to allow for any prefix in vanity addresses +- the next byte is the version byte +- the next 4 bytes are a checksum +-- the first 4 bytes of the SHA256 of the 21 bytes that come before + +*/ + +// Checksum 4 bytes +type Checksum [4]byte + +// Addresser defines an interface for cryptocurrency addresses +type Addresser interface { + Bytes() []byte + String() string + Checksum() Checksum + Verify(PubKey) error + Null() bool +} + +// PubKeyRipemd160 returns ripemd160(sha256(sha256(pubkey))) +func PubKeyRipemd160(pubKey PubKey) Ripemd160 { + r1 := SumSHA256(pubKey[:]) + r2 := SumSHA256(r1[:]) + return HashRipemd160(r2[:]) +} + +// Address version is after Key to enable better vanity address generation +// Address struct is a 25 byte with a 20 byte public key hash, 1 byte address +// type and 4 byte checksum. +type Address struct { + Version byte //1 byte + Key Ripemd160 //20 byte pubkey hash +} + +// AddressFromPubKey creates Address from PubKey as ripemd160(sha256(sha256(pubkey))) +func AddressFromPubKey(pubKey PubKey) Address { + return Address{ + Version: 0, + Key: PubKeyRipemd160(pubKey), + } +} + +// AddressFromSecKey generates address from secret key +func AddressFromSecKey(secKey SecKey) (Address, error) { + p, err := PubKeyFromSecKey(secKey) + if err != nil { + return Address{}, err + } + return AddressFromPubKey(p), nil +} + +// MustAddressFromSecKey generates address from secret key, panics on error +func MustAddressFromSecKey(secKey SecKey) Address { + return AddressFromPubKey(MustPubKeyFromSecKey(secKey)) +} + +// DecodeBase58Address creates an Address from its base58 encoding +func DecodeBase58Address(addr string) (Address, error) { + b, err := base58.Decode(addr) + if err != nil { + return Address{}, err + } + return AddressFromBytes(b) +} + +// MustDecodeBase58Address creates an Address from its base58 encoding, panics on error +func MustDecodeBase58Address(addr string) Address { + a, err := DecodeBase58Address(addr) + if err != nil { + log.Panicf("Invalid address %s: %v", addr, err) + } + return a +} + +// AddressFromBytes converts []byte to an Address +func AddressFromBytes(b []byte) (Address, error) { + if len(b) != 20+1+4 { + return Address{}, ErrAddressInvalidLength + } + a := Address{} + copy(a.Key[0:20], b[0:20]) + a.Version = b[20] + + chksum := a.Checksum() + var checksum [4]byte + copy(checksum[0:4], b[21:25]) + + if checksum != chksum { + return Address{}, ErrAddressInvalidChecksum + } + + if a.Version != 0 { + return Address{}, ErrAddressInvalidVersion + } + + return a, nil +} + +// MustAddressFromBytes converts []byte to an Address, panics on error +func MustAddressFromBytes(b []byte) Address { + addr, err := AddressFromBytes(b) + if err != nil { + log.Panic(err) + } + + return addr +} + +// Null returns true if the address is null (0x0000....) +func (addr Address) Null() bool { + return addr == Address{} +} + +// Bytes return address as a byte slice +func (addr Address) Bytes() []byte { + b := make([]byte, 20+1+4) + copy(b[0:20], addr.Key[0:20]) + b[20] = addr.Version + chksum := addr.Checksum() + copy(b[21:25], chksum[0:4]) + return b +} + +// Verify checks that the address appears valid for the public key +func (addr Address) Verify(pubKey PubKey) error { + if addr.Version != 0x00 { + return ErrAddressInvalidVersion + } + + if addr.Key != PubKeyRipemd160(pubKey) { + return ErrAddressInvalidPubKey + } + + return nil +} + +// String address as Base58 encoded string +func (addr Address) String() string { + return string(base58.Encode(addr.Bytes())) +} + +// Checksum returns Address Checksum which is the first 4 bytes of sha256(key+version) +func (addr Address) Checksum() Checksum { + r1 := append(addr.Key[:], []byte{addr.Version}...) + r2 := SumSHA256(r1[:]) + c := Checksum{} + copy(c[:], r2[:len(c)]) + return c +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/address_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/address_test.go new file mode 100644 index 00000000..48817035 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/address_test.go @@ -0,0 +1,232 @@ +package cipher + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +func TestMustDecodeBase58Address(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + require.Panics(t, func() { MustDecodeBase58Address("") }) + require.Panics(t, func() { MustDecodeBase58Address("cascs") }) + b := a.Bytes() + h := string(base58.Encode(b[:len(b)/2])) + require.Panics(t, func() { MustDecodeBase58Address(h) }) + h = string(base58.Encode(b)) + require.NotPanics(t, func() { MustDecodeBase58Address(h) }) + a2 := MustDecodeBase58Address(h) + require.Equal(t, a, a2) + + require.NotPanics(t, func() { MustDecodeBase58Address(a.String()) }) + a2 = MustDecodeBase58Address(a.String()) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + badAddr := " " + a.String() + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + // preceding zeroes are invalid + badAddr = "000" + a.String() + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + // trailing whitespace is invalid + badAddr = a.String() + " " + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + // trailing zeroes are invalid + badAddr = a.String() + "000" + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + null := "1111111111111111111111111" + require.Panics(t, func() { MustDecodeBase58Address(null) }) +} + +func TestDecodeBase58Address(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + _, err := DecodeBase58Address("") + require.Error(t, err) + + _, err = DecodeBase58Address("cascs") + require.Error(t, err) + + b := a.Bytes() + h := string(base58.Encode(b[:len(b)/2])) + _, err = DecodeBase58Address(h) + require.Error(t, err) + + h = string(base58.Encode(b)) + a2, err := DecodeBase58Address(h) + require.NoError(t, err) + require.Equal(t, a, a2) + + as := a.String() + a2, err = DecodeBase58Address(as) + require.NoError(t, err) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + as2 := " " + as + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // preceding zeroes are invalid + as2 = "000" + as + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // trailing whitespace is invalid + as2 = as + " " + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // trailing zeroes are invalid + as2 = as + "000" + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // null address is invalid + null := "1111111111111111111111111" + _, err = DecodeBase58Address(null) + require.Error(t, err) + require.Equal(t, ErrAddressInvalidChecksum, err) +} + +func TestAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2, err := AddressFromBytes(a.Bytes()) + require.NoError(t, err) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.Bytes() + _, err = AddressFromBytes(b[:len(b)-2]) + require.EqualError(t, err, "Invalid address length") + + // Invalid checksum + b[len(b)-1] += byte(1) + _, err = AddressFromBytes(b) + require.EqualError(t, err, "Invalid checksum") + + a.Version = 2 + b = a.Bytes() + _, err = AddressFromBytes(b) + require.EqualError(t, err, "Address version invalid") +} + +func TestMustAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2 := MustAddressFromBytes(a.Bytes()) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.Bytes() + require.Panics(t, func() { + MustAddressFromBytes(b[:len(b)-2]) + }) + + // Invalid checksum + b[len(b)-1] += byte(1) + require.Panics(t, func() { + MustAddressFromBytes(b) + }) + + a.Version = 2 + b = a.Bytes() + require.Panics(t, func() { + MustAddressFromBytes(b) + }) +} + +func TestAddressRoundtrip(t *testing.T) { + // Tests encode and decode + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2, err := AddressFromBytes(a.Bytes()) + require.NoError(t, err) + require.Equal(t, a, a2) + require.Equal(t, a.String(), a2.String()) +} + +func TestAddressVerify(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + // Invalid pubkey + require.Error(t, a.Verify(PubKey{})) + p2, _ := GenerateKeyPair() + require.Error(t, a.Verify(p2)) + // Bad version + a.Version = 0x01 + require.Error(t, a.Verify(p)) +} + +func TestAddressString(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + s := a.String() + a2, err := DecodeBase58Address(s) + require.NoError(t, err) + require.Equal(t, a2, a) + s2 := a2.String() + a3, err := DecodeBase58Address(s2) + require.NoError(t, err) + require.Equal(t, a2, a3) +} + +func TestAddressBulk(t *testing.T) { + for i := 0; i < 1024; i++ { + pub, _, err := GenerateDeterministicKeyPair(RandByte(32)) + require.NoError(t, err) + + a := AddressFromPubKey(pub) + require.NoError(t, a.Verify(pub)) + s := a.String() + a2, err := DecodeBase58Address(s) + require.NoError(t, err) + require.Equal(t, a2, a) + } +} + +func TestAddressNull(t *testing.T) { + var a Address + require.True(t, a.Null()) + + p, _ := GenerateKeyPair() + a = AddressFromPubKey(p) + require.False(t, a.Null()) +} + +func TestAddressFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + a, err := AddressFromSecKey(s) + require.NoError(t, err) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + + _, err = AddressFromSecKey(SecKey{}) + require.Equal(t, errors.New("Attempt to load null seckey, unsafe"), err) +} + +func TestMustAddressFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + a := MustAddressFromSecKey(s) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + + require.Panics(t, func() { + MustAddressFromSecKey(SecKey{}) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE new file mode 100644 index 00000000..9d58fbb4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE @@ -0,0 +1,24 @@ +MIT License + +Copyright (c) 2017 Denis Subbotin +Copyright (c) 2017 Nika Jones +Copyright (c) 2017 Philip Schlump +Copyright (c) 2019 gz-c + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE_old b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE_old new file mode 100644 index 00000000..58da01b3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE_old @@ -0,0 +1,27 @@ +Copyright (c) 2012 ThePiachu. All rights reserved. +Copyright (c) 2019 gz-c, Skycoin developers. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * The name of ThePiachu may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/README.md new file mode 100644 index 00000000..94251a44 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/README.md @@ -0,0 +1,47 @@ +# Fast Implementation of Base58 encoding + +[![GoDoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/base58?status.svg)](https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/base58) + +Fast implementation of base58 encoding in Go. + +This code is a fork of https://github.com/mr-tron/base58 + +Base algorithm is copied from https://github.com/trezor/trezor-crypto/blob/master/base58.c +Which was copied from an older version of libbase58 https://github.com/bitcoin/libbase58 + +## Performance + +Other base58 golang libraries use `big.Int` which has a lot of malloc overhead and shows up as a common bottleneck when profiling. + +This version removes the use of `big.Int`. + +## Usage example + +```go +package main + +import ( + "fmt" + "os" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +func main() { + encoded := "1QCaxc8hutpdZ62iKZsn1TCG3nh7uPZojq" + bin, err := base58.Decode(encoded) + if err != nil { + fmt.Println("Decode error:", err) + os.Exit(1) + } + + chk := base58.Encode(bin) + if encoded == string(chk) { + fmt.Println("Successfully decoded then re-encoded") + } +} +``` + +## base58-old + +The old base58 code is retained here as a reference and used in tests to compare the output is equivalent. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58.go new file mode 100644 index 00000000..c18ae5a8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58.go @@ -0,0 +1,178 @@ +package base58 + +import ( + "errors" + "fmt" +) + +var ( + // ErrInvalidChar Invalid base58 character + ErrInvalidChar = errors.New("Invalid base58 character") + // ErrInvalidString Invalid base58 string + ErrInvalidString = errors.New("Invalid base58 string") +) + +// Alphabet is a a b58 alphabet. +type Alphabet struct { + decode [128]int8 + encode [58]byte +} + +// NewAlphabet creates a new alphabet from the passed string. +// +// It panics if the passed string is not 58 bytes long or isn't valid ASCII. +func NewAlphabet(s string) *Alphabet { + if len(s) != 58 { + panic("base58 alphabets must be 58 bytes long") + } + + ret := &Alphabet{} + + copy(ret.encode[:], s) + + for i := range ret.decode { + ret.decode[i] = -1 + } + for i, b := range ret.encode { + ret.decode[b] = int8(i) + } + + return ret +} + +// btcAlphabet is the bitcoin base58 alphabet. +var btcAlphabet = NewAlphabet("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") + +// Encode encodes the passed bytes into a base58 encoded string. +func Encode(bin []byte) string { + return fastBase58EncodingAlphabet(bin, btcAlphabet) +} + +// fastBase58EncodingAlphabet encodes the passed bytes into a base58 encoded +// string with the passed alphabet. +func fastBase58EncodingAlphabet(bin []byte, alphabet *Alphabet) string { + binsz := len(bin) + var i, j, zcount, high int + var carry uint32 + + for zcount < binsz && bin[zcount] == 0 { + zcount++ + } + + size := (binsz-zcount)*138/100 + 1 + var buf = make([]uint32, size) + + high = size - 1 + for i = zcount; i < binsz; i++ { + j = size - 1 + for carry = uint32(bin[i]); j > high || carry != 0; j-- { + carry += buf[j] << 8 + buf[j] = carry % 58 + carry /= 58 + } + high = j + } + + for j = 0; j < size && buf[j] == 0; j++ { + } + + var b58 = make([]byte, size-j+zcount) + + if zcount != 0 { + for i = 0; i < zcount; i++ { + b58[i] = '1' + } + } + + for i = zcount; j < size; i++ { + b58[i] = alphabet.encode[buf[j]] + j++ + } + + return string(b58) +} + +// Decode decodes the base58 encoded bytes. +func Decode(str string) ([]byte, error) { + return fastBase58DecodingAlphabet(str, btcAlphabet) +} + +// fastBase58DecodingAlphabet decodes the base58 encoded bytes using the given +// b58 alphabet. +func fastBase58DecodingAlphabet(str string, alphabet *Alphabet) ([]byte, error) { + if len(str) == 0 { + return nil, ErrInvalidString + } + + var ( + t, c uint64 + zmask uint32 + zcount int + + b58u = []rune(str) + b58sz = len(b58u) + + outisz = (b58sz + 3) >> 2 + binu = make([]byte, (b58sz+3)*3) + bytesleft = b58sz & 3 + ) + + if bytesleft > 0 { + zmask = 0xffffffff << uint32(bytesleft*8) + } else { + bytesleft = 4 + } + + var outi = make([]uint32, outisz) + + for i := 0; i < b58sz && b58u[i] == '1'; i++ { + zcount++ + } + + for _, r := range b58u { + if r > 127 { + return nil, ErrInvalidChar + } + if alphabet.decode[r] == -1 { + return nil, ErrInvalidChar + } + + c = uint64(alphabet.decode[r]) + + for j := outisz - 1; j >= 0; j-- { + t = uint64(outi[j])*58 + c + c = (t >> 32) & 0x3f + outi[j] = uint32(t & 0xffffffff) + } + + // Neither of these should occur because the buffer is allocated ourselves + if c > 0 { + return nil, fmt.Errorf("output number too big (carry to the next int32)") + } + + if outi[0]&zmask != 0 { + return nil, fmt.Errorf("output number too big (last int32 filled too far)") + } + } + + var j, cnt int + for j, cnt = 0, 0; j < outisz; j++ { + for mask := byte(bytesleft-1) * 8; mask <= 0x18; mask, cnt = mask-8, cnt+1 { + binu[cnt] = byte(outi[j] >> mask) + } + if j == 0 { + bytesleft = 4 // because it could be less than 4 the first time through + } + } + + for n, v := range binu { + if v > 0 { + start := n - zcount + if start < 0 { + start = 0 + } + return binu[start:cnt], nil + } + } + return binu[:cnt], nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_old.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_old.go new file mode 100644 index 00000000..ffa4bca5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_old.go @@ -0,0 +1,190 @@ +// Copyright 2011 ThePiachu. All rights reserved. +// Copyright 2019 gz-c, Skycoin developers. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package base58 + +import ( + "errors" + "fmt" + "math/big" +) + +//alphabet used by Bitcoins +var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + +var ( + // errInvalidBase58Char Invalid base58 character + errInvalidBase58Char = errors.New("Invalid base58 character") + // errInvalidBase58String Invalid base58 string + errInvalidBase58String = errors.New("Invalid base58 string") + // errInvalidBase58Length Invalid base58 length + errInvalidBase58Length = errors.New("base58 invalid length") +) + +// oldBase58 type to hold the oldBase58 string +type oldBase58 string + +//reverse alphabet used for quckly converting base58 strings into numbers +var revalp = map[string]int{ + "1": 0, "2": 1, "3": 2, "4": 3, "5": 4, "6": 5, "7": 6, "8": 7, "9": 8, "A": 9, + "B": 10, "C": 11, "D": 12, "E": 13, "F": 14, "G": 15, "H": 16, "J": 17, "K": 18, "L": 19, + "M": 20, "N": 21, "P": 22, "Q": 23, "R": 24, "S": 25, "T": 26, "U": 27, "V": 28, "W": 29, + "X": 30, "Y": 31, "Z": 32, "a": 33, "b": 34, "c": 35, "d": 36, "e": 37, "f": 38, "g": 39, + "h": 40, "i": 41, "j": 42, "k": 43, "m": 44, "n": 45, "o": 46, "p": 47, "q": 48, "r": 49, + "s": 50, "t": 51, "u": 52, "v": 53, "w": 54, "x": 55, "y": 56, "z": 57, +} + +// oldHex2Big converts hex to big +func oldHex2Big(b []byte) *big.Int { + answer := big.NewInt(0) + + for i := 0; i < len(b); i++ { + answer.Lsh(answer, 8) + answer.Add(answer, big.NewInt(int64(b[i]))) + } + + return answer +} + +// ToBig convert base58 to big.Int +func (b oldBase58) ToBig() (*big.Int, error) { + answer := new(big.Int) + for i := 0; i < len(b); i++ { + answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return nil, errInvalidBase58Char + } + answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter + } + return answer, nil +} + +// ToInt converts base58 to int +func (b oldBase58) ToInt() (int, error) { + answer := 0 + for i := 0; i < len(b); i++ { + answer *= 58 //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return 0, errInvalidBase58Char + } + answer += c //add value of the current letter + } + return answer, nil +} + +//ToHex converts base58 to hex bytes +func (b oldBase58) ToHex() ([]byte, error) { + value, err := b.ToBig() //convert to big.Int + if err != nil { + return nil, err + } + oneCount := 0 + bs := string(b) + if len(bs) == 0 { + return nil, fmt.Errorf("%v - len(bs) == 0", errInvalidBase58String) + } + for bs[oneCount] == '1' { + oneCount++ + if oneCount >= len(bs) { + return nil, fmt.Errorf("%v - oneCount >= len(bs)", errInvalidBase58String) + } + } + //convert big.Int to bytes + return append(make([]byte, oneCount), value.Bytes()...), nil +} + +// Base582Big converts base58 to big +func (b oldBase58) Base582Big() (*big.Int, error) { + answer := new(big.Int) + for i := 0; i < len(b); i++ { + answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return nil, errInvalidBase58Char + } + answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter + } + return answer, nil +} + +// Base582Int converts base58 to int +func (b oldBase58) Base582Int() (int, error) { + answer := 0 + for i := 0; i < len(b); i++ { + answer *= 58 //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return 0, errInvalidBase58Char + } + answer += c //add value of the current letter + } + return answer, nil +} + +// oldBase582Hex converts base58 to hex bytes +func oldBase582Hex(b string) ([]byte, error) { + return oldBase58(b).ToHex() +} + +// BitHex converts base58 to hexes used by Bitcoins (keeping the zeroes on the front, 25 bytes long) +func (b oldBase58) BitHex() ([]byte, error) { + value, err := b.ToBig() //convert to big.Int + if err != nil { + return nil, err + } + + tmp := value.Bytes() //convert to hex bytes + if len(tmp) == 25 { //if it is exactly 25 bytes, return + return tmp, nil + } else if len(tmp) > 25 { //if it is longer than 25, return nothing + return nil, errInvalidBase58Length + } + answer := make([]byte, 25) //make 25 byte container + for i := 0; i < len(tmp); i++ { //copy converted bytes + answer[24-i] = tmp[len(tmp)-1-i] + } + return answer, nil +} + +// oldBig2Base58 encodes big.Int to base58 string +func oldBig2Base58(val *big.Int) oldBase58 { + answer := "" + valCopy := new(big.Int).Abs(val) //copies big.Int + + if val.Cmp(big.NewInt(0)) <= 0 { //if it is less than 0, returns empty string + return oldBase58("") + } + + tmpStr := "" + tmp := new(big.Int) + for valCopy.Cmp(big.NewInt(0)) > 0 { //converts the number into base58 + tmp.Mod(valCopy, big.NewInt(58)) //takes modulo 58 value + valCopy.Div(valCopy, big.NewInt(58)) //divides the rest by 58 + tmpStr += alphabet[tmp.Int64() : tmp.Int64()+1] //encodes + } + for i := (len(tmpStr) - 1); i > -1; i-- { + answer += tmpStr[i : i+1] //reverses the order + } + return oldBase58(answer) //returns +} + +// oldHex2Base58 encodes hex bytes into base58 +func oldHex2Base58(val []byte) oldBase58 { + tmp := oldBig2Base58(oldHex2Big(val)) //encoding of the number without zeroes in front + + //looking for zeros at the beginning + i := 0 + for i = 0; val[i] == 0 && i < len(val); i++ { + } + answer := "" + for j := 0; j < i; j++ { //adds zeroes from the front + answer += alphabet[0:1] + } + answer += string(tmp) //concatenates + + return oldBase58(answer) //returns +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_test.go new file mode 100644 index 00000000..447fcab5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_test.go @@ -0,0 +1,1199 @@ +/* +Package base58 implements base58 encoding, used for Skycoin and Bitcoin addresses +*/ +package base58 + +// Useful materials: +// https://en.bitcoin.it/wiki/Base_58_Encoding +// http://www.strongasanox.co.uk/2011/03/11/base58-encoding-in-python/ + +import ( + "bytes" + "crypto/rand" + "testing" + + "github.com/stretchr/testify/require" +) + +var benchmarkAddr = "BbZ79o3JNbvi4fifByyopgdS5q6uT9ytmj" + +func BenchmarkEncode(b *testing.B) { + b.ReportAllocs() + if _, err := Decode(benchmarkAddr); err != nil { + b.Fail() + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _, _ = Decode(benchmarkAddr) //nolint:errcheck + } +} + +func BenchmarkEncodeOld(b *testing.B) { + b.ReportAllocs() + if _, err := oldBase582Hex(benchmarkAddr); err != nil { + b.Fail() + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _, _ = oldBase582Hex(benchmarkAddr) //nolint:errcheck + } +} + +func BenchmarkDecode(b *testing.B) { + b.ReportAllocs() + d, err := Decode(benchmarkAddr) + if err != nil { + b.Fail() + } + + e := Encode(d) + if e != benchmarkAddr { + b.Fail() + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = Encode(d) + } +} + +func BenchmarkDecodeOld(b *testing.B) { + b.ReportAllocs() + d, err := oldBase582Hex(benchmarkAddr) + if err != nil { + b.Fail() + } + + e := oldHex2Base58(d) + if string(e) != benchmarkAddr { + b.Fail() + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = oldHex2Base58(d) + } +} + +func testEncodeDecode(t *testing.T, a string) { + bin, err := Decode(a) + require.NoError(t, err) + chk := Encode(bin) + require.Equal(t, a, chk) + + // The old base58 package cannot decode strings of all 1s + allZeros := true + for _, c := range a { + if c != '1' { + allZeros = false + break + } + } + if allZeros { + return + } + + bin2, err := oldBase582Hex(a) + require.NoError(t, err) + require.True(t, bytes.Equal(bin, bin2)) + + chk2 := oldHex2Base58(bin) + require.Equal(t, chk, string(chk2)) +} + +func randBase58String(t *testing.T, n int) string { + b := make([]byte, n) + _, err := rand.Read(b) + require.NoError(t, err) + for i, c := range b { + b[i] = btcAlphabet.encode[c%58] + } + return string(b) +} + +func TestEncodeDecodeRandom(t *testing.T) { + strlen := 127 + n := strlen * 1000 + + for i := 0; i < n; i++ { + x := randBase58String(t, (i%strlen)+1) + t.Run(x, func(t *testing.T) { + testEncodeDecode(t, x) + }) + } + + for i := 128; i < 1024; i++ { + x := randBase58String(t, i) + t.Run(x, func(t *testing.T) { + testEncodeDecode(t, x) + }) + } +} + +func TestEncodeDecodeEmpty(t *testing.T) { + b, err := Decode("") + require.Nil(t, b) + require.Equal(t, ErrInvalidString, err) + + x := Encode(nil) + require.Equal(t, x, "") + + x = Encode([]byte{}) + require.Equal(t, x, "") +} + +func TestDecodeBadChar(t *testing.T) { + x := []byte("1111") + + for i := 0; i < 256; i++ { + if i < 128 && btcAlphabet.decode[i] != -1 { + continue + } + y := append(x, byte(i)) + _, err := Decode(string(y)) + require.Equal(t, ErrInvalidChar, err) + } + + bad := []string{ + " bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx", // preceding whitespace + " bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx", // preceding whitespaces + "0bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx", // preceding 0 + "00000bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx", // preceding 0s + "bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx0", // trailing 0 + "bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx0000", // trailing 0s + "-0xaA7F2DfD73e7035-93___x___6P3Or9N81_1____n__285_nJ25WTRQ_vexQWdN14S__9.9274920729751111", + "-05425.-2-___0xfF.037171326036317302-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-07771-0x2f6E663acEaDdaae7e", + } + + for _, y := range bad { + _, err := Decode(y) + require.Equal(t, ErrInvalidChar, err) + } +} + +func TestEncodeDecodeKnownAddrs(t *testing.T) { + testAddr := []string{ + // Empty address + "1111111111111111111111111", + + // Example addresses from mr-tron/base58 + "1QCaxc8hutpdZ62iKZsn1TCG3nh7uPZojq", + "1DhRmSGnhPjUaVPAj48zgPV9e2oRhAQFUb", + "17LN2oPYRYsXS9TdYdXCCDvF2FegshLDU2", + "14h2bDLZSuvRFhUL45VjPHJcW667mmRAAn", + + // Randomly generated Skycoin addresses + "968o2vpiSDAMBCNNAAMCdVHYVvZcxgH2eW", + "CBKuGtiSttzgy6JyYYUTx9JTesxjhXKSHo", + "UBWDAVvH6ZmKX8KH86EWLfA7Du2qKVgKNw", + "21G6AU7rpRzCMuFp2UCstD6PZY3Mcjage4W", + "rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6", + "28QAWt5iBxYnJVtpSayLHsqqWUSQp6XDNE8", + "DVjnRXWnxyr1ueeSYpVKWn61jxbYyYND4X", + "4gWTKmjDvpJe34i9i2i33riVZiew21V3P6", + "2gcpPYo9XLjSfAcFS1mV4NJR9jF7528L7TU", + "pxUF2qJ34aKgNLWSsoTHm8iuMH9bgyXyAB", + "2jsTjaKPWwomBGzHoa5qZm22wdt59LmkFwb", + "Nadb59i6pkMeTkwbXMfWbftoaTj8Qx1o7Z", + "2iEPcNEQg6YQYt2GLjSGJwJEDdLcLvgnatA", + "2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH", + "oq4yRyppcigt4S25Sdjx1Ncpmzyxw67SLe", + "2NauYwSe9RPsHY7oZaLuakP44ofYziv5wte", + "Y9jPpWaLfoTQYkhrFzgnKbCpjMrrTDvWX2", + "TQfQQQ8ciaSz2DT8tBzqyoVzA5vg3qZm8n", + "yUn7TxndNzRoZ34hMijhMyh7CQnYA7dAn4", + "26rQC5KKEgYyiLhSWpef94gHXKjYWPdjQx2", + "8i4EU2R8aiS1QE1PMhE6qvgqencUowHZnp", + "TbFtcHeUqef3JeKMBrRxzRvBXK4nJtRoe7", + "w1tyShnSfWH3sUjz4HcK6rPVHvzgdhLwJz", + "m7QJ6LxNFnGs2vD3dXYrbisfT56QqkW15b", + "2VtEEEvHDSCMGq72KBjzyS27ZADwKG4kjgd", + "2LCYUfj3rwu4N5NY4wqNX7STAkyXu3LfdYC", + "WVmwB9KMYnd2c1xRfESa7wdgGuNLMU4cni", + "cj29Fobo9aRSSEJuWEtfBihHsgHExuYVBD", + "ZLyUpWtSMDqHHse2xA55zbefa84cx8ykUd", + "PBENV7bgFYMsnvUbDJJfUF46JukjAvf7Dm", + "UY7vLUfL8cRLCLuRdGTPRxye5sRxrxFTbV", + "27q7HQnk73eBwKSLd1yTocrMuwiTAy8Q7mp", + "Vb4Qa9uhz2erHQvFZfV9Ns449WDj3rfCwm", + "upWBoRfwhi4Fh6AytmypNgpXVVZTydhtzM", + "2GwBqNwooQcZWcToHZPJXu8oe6zM1GDSssz", + "SpV85zojCcHQAvarwo2i1EDVmTyh1FzffJ", + "eniYXrjCMu2R83kVzjmSq4peLwPWEyBHJj", + "2R5mhWq2ruoBAqpR4o1rrkz7UzmVdfs5eWw", + "24fhrKkXGSTjJHLdSiHNYQCWXHJAq6sevKq", + "hHHRHkDv3Qzmg3nTpdkao3Fy6FFQNmtEJS", + "PV1EuQjLv62DK6b2dgd8mgE3idK9mJZTmY", + "2hQH3Ku45HYYQR4pyjaNwxRY84GbKXVkypB", + "iAJ8FTFQRvb546QX2i5GP3u5s52GwBJme7", + "2ivAdyrhQmAHqMzxEXUvv6B6gdUSuoT77uF", + "v2KqYbcPvBRpAbC2mf5xnJ5WTUmGHdwc3U", + "2Xe6Y6LMghjUnYv27MXPUNukSgKpWUSeLPG", + "2mWaLTPRU2ZjdGZNrrCEvP9jFuNxSq54NUb", + "2eEYNokgJJheKu3ooFqCQTUFCx7H2oaPHs6", + "24PwdbES8vCVRnLhnazrD4Eh6NQ2oUQTaUy", + "TuHr8eDRWQL2T9ZkpjeFVFknEBdHpWG3Qa", + "29ebg5EJRsQDhx9NWMpvx8vsWaJmHEa3Jc3", + "bgVmUpTcA5DN4gT4vpprY1pTeWvUcoMpu9", + "eFP8myi627SNbPr31TcV9KixvcRGyvjAf7", + "2hasdKBRdiZ6D4h9qPWyrQJepvbFBxwrQQE", + "25UaV7LCx3Xbof9Qb2rwkhw41Diqb8zZWAL", + "2XKjCqmATQVNdg7QabYfDTr87ngym71Fk5q", + "S7NPCyF2M3HMGUtahnxBNf7hkjhZrrvTkp", + "e9Yp46wQtFcraRj7h7KnxuRZEEBt7wWKwv", + "2FPW4JERBWzSf9n6jruTYPGAAVuMP4QFtNB", + "2FgrEY92rrs4TYQxw7GSCeg6tR4CSg58CnU", + "5N3XbiQoLX4wSd9ZAi1KVT89j5pqkDAARY", + "224TYwgFgaxZ4Wa9NMzvvD9ejG6mWBboDCF", + "S996QG5U5Kbe5p3pDVLgss2GUDxQdG7PHE", + "aDBFEf9dXw4voDYNVY4fvwG2GkTGH6X5D5", + "MyvhxtWXo88FKFhUjw3AXbjK6YtMiXYjv8", + "2iVHso1BsyZJyaFurJjuhTBHSM6i7dU34Av", + "GqciZuy28KkK6AKb4U7rgb897xLtyqwe1Y", + "UvZSTRe6XfwtLSFN9tEkVQL3qoAT5hQk4s", + "2A5fRgBV4hf3vesoboUsJQDsGo4wFbBpHcg", + "DnmQebrTbSRwq6aqZNKnVpKPUkNhEdVJYh", + "o9BccckziLRNxM7paqdCmMDS36qV4uy3pC", + "jC48GN98UjrRkMgqAse4CcWrW4D1kjuE9p", + "2fsc1SRRoBt2f6RLEEWnTS85Vmj57oXyUHT", + "AKBqyAJd9L2eVY2EZfsjrzFgKYZufg7sHd", + "FbxYyQBVLFihSokT5bR66HgmZ2cnbqpmAL", + "ktHsYrPsjRBYfhaXfhQc4eoTAN11SELmvA", + "WyKgazrVaN4XteQqw4G6o34E1MtcKZAzun", + "WH8WiwzXH5vpnZe8xGwU55vzpHZoaWreZL", + "2aQC5HrMfXnjUyDfTpUv2nN7mpZcM6JZpUo", + "nT5FpoERESCs29c1DAsL9EFLyEVxkvSDjJ", + "UkR5f61ptH8sBC4WdRogrNKRpMyHtw4iB", + "D1F9egTEGr6dZ4mizzKtUEuZDFaqGwNf3t", + "Ahskhos7U4cBeV3JjLu1A7PDrqGmRw9Chf", + "26HRUBYwWnGUrg7MCozbcjgny3kraS4AG4T", + "2QhZvWvSx3kY2PqLf1CcQ6SxjrWTxN8SnLQ", + "2icM26PGcD53GhtWvnwnDRgtLHmV16qSucZ", + "quWXbQGiPbNmrK2bxv3wzem4vBgvF8uYyP", + "pX6AYyWV7dHxf8p7T2LSTxqrFWsmZPeGvK", + "E1wqrVyf1ZfbVGBoEZRDMUv3kVQu3Pkq8x", + "obzkDamYMoe4SwHj7wS5By8C7eKU8GBNic", + "pD5aLHXrL6eo1QBeNYoc2TKHN7cS7ewqgD", + "2eZxS4UnNNcStV6S17UpYauK2mS5bSxom4o", + "Lc7GM5ZEcWQpVExM8Xxw1YMxtth2dZpQDs", + "AjKGaucxKzt6s3T2RDBSkjz4Kmu1eDiNtX", + "PgYHzrzQw2MXK8YGmeRoiUysMhQgK5DmQq", + "2hmh5piFh7myRwfhbsCE7VRSSLnxFAsf1me", + "2CrYxhD4DZZEZMzmid8LHh4RPmuRzGVQe7Q", + "RupPXqWnE3qQpYeYPqvG9w72ywWyPu7znM", + "2G6WxnQxVqRXxYsnccnBD3eg2G4Ai6mTswW", + "BbZ79o3JNbvi4fifByyopgdS5q6uT9ytmj", + "2Y8Agusra9684LaXkmbcTYTmYLm4E6vV7M2", + "29zJ7qwq8pQpSEjR9qGMnpUwAHX5ufruaiK", + "AtcW5LJNTzm4inSbuMzxs5a2nFezVxzysC", + "zGPm8xVsbdYqLqsC7RjKNvHsQ9kWuMEE9r", + "od1i8rihfJE55yW63FxHL8o911QqVNqotW", + "2FUrR8Tietcz9hT2PKktgHU57xFs26ahtqV", + "2b2Cw64hQBCwrtDTuuaXyapLwq1BJgb3VUV", + "9RbKMTftN9NmZNhN5wE4efHrS2T7KFMrPn", + "Dp3ayfLQC5d9izUyttG9d4c4HVYmHeWWUW", + "ssYjtzYAiz1MPsbuYzXgx6v82mjgCGaYBM", + "9xpM5rijPu3hmsUkGcvqUwPSbW8EVyxL8W", + "25T4ptpFRKAKnPDbF6XdL2KLdC4yf3kvvQ8", + "xtCU2AkDdBAGRRt8CVe422ys718EJfevoi", + "TWwozvxWJUeH322fNmUc5DurgihJMMTt7v", + "2eoLN4nKupyfHvZpNCwJuh54d2ZXMBmMTe8", + "tQPc7ZDnmab7XCoX5zhnXBhUbDTDinhbpZ", + "7yPsXcyaBRMZAvc7kbFLgvAqyFgkKtF1zP", + "2AUkoPcTtV7n34r6GEjJ5NpB4Tvxe38J1zX", + "vKVLoMtZqY2Z6mGBjZqHtXKkMCQU4YNKHk", + "2d1hagw2Nc9GCcMgFbHJmdjJz4ZYHfXeNHy", + "2juX5e7E9Hd71Sgy2QouFp25oCo1JtnC185", + "2SZ7GsR2GiDRxSpc9dAFbrULfLjRaq79scQ", + "2L7LtusSY1Mbf3XXEeUvnhayVXvdNDJLpkN", + "dtWjBFwsm8bGWTX6hPHyrhD5PU6pmyTjKJ", + "crRaWgbh95SMSj9RFtqkT7Dv4f5AuaSiA2", + "MHNy4X42aTmpstxd75S8UMTZVLyVtsaTP7", + "29Z3CUJutadX9qwP86BaY3k5fkPKo4M44JL", + "JiQYF3Y4ZG2qbHeCfLsWu7KTeLoWYHRpp7", + "JwhyzTPruhtkuMsCF8RiBx3nX7ancW4rfg", + "2MGxsK46oqWiYBzTaMMABDtNDD58u1uKJ84", + "2CP7cXex8MnNWrRbpbGQYmNCSwuuztPV6dm", + "X3jWBpMKqHVUGBvWFL1VXj7JAUQx1Hd6NL", + "2QbwgXpfxRapxL3NfQfxBp8xNsH6yieC1b", + "6yMo7f4eQQGRn5C4pr9T9GvCCkNcNEHFqc", + "dwSMDngNY4TCv3KzjxtWqLPHy1M4jDtbGU", + "2S9PBRNJsYXa1ZoKahHttQwp9bfF89SHURj", + "2eFu9YJokP8A4FPnqN9PecZSwBKwXjAZWGS", + "uqjUcBkrMoieS5dF7H7v2mpA7o5MA2gU6", + "2hUFEB1bBdRWJP4CM756ZH6z54Vzx3VhXp3", + "CW42KnE5fu1TEzFevYM4HWge3oYS4KjoCz", + "2EdGc2LXy5Jha1uJoACWiBaWL8KuuRExXjP", + "S4RT6pKPxzH8zZb3ZX5L22F1fKsugfe9QM", + "j1AvZ3FYGEjeK5zMA6JqYy26mKkSgHCik7", + "2BriifqsgCbshuaPDvXKF6qtAauc6Y28M9f", + "xTwV8bL6cqG6XzfhjZq2RhAwAq1sCpEd1u", + "KxuGSVGkW2otJjkZqtT2SBciaxq8Y8rgXt", + "tsrbLTBEs9z62mGRQSe4koEd1cBiMBXhSo", + "rXjQwusifw9KGYe5yefVwaJ81z8S7ufnPY", + "zk9efvbDD8SvBnTCXneWPN9tQNLUb5FwGr", + "2WxkLNq5dhTSdUL1TF6ewjuYomPdpwV7Ebz", + "x49WSdipZ8d8aibBSUrxxTYeqaTiDE6quk", + "zVyoz9W2zSCfYhWwSWjsQ1xrHSVkuEYJ43", + "24zBSMs4abJXH4rmHfCMYGUZkaQf5NFSutL", + "2mZs6wDTJrEoRSWkYaub4VpgiGg2CZE4jVZ", + "2DFRuFFHJBbfePD1ZvrbforZo3ntPg32eHM", + "Ak54Z28R8ov6zwWXz4fZ2m9jYC66rKxZvh", + "2Wkn3PfetHFQzkm5xkJVK4NGcETokvDj6MH", + "2M1XpNSr3gRide7aRyufQeky9mHhVcPhtgA", + "2U9rNTcUvTT7F9pdMf9g8QPdjETmU2ux1Vi", + "2NTowTEg7K1876jhggYLAbr2AyVE8j3vPRN", + "jZDVtUiSXEvxwgnU1uTapFzPT6pfyHWNgc", + "aH3qZEo2cytHemDurzdo9hHveDmkyi6jcR", + "2XDHzAcfZu3H27kmCzT7DmEH1N8PHg5sMbc", + "Cd3Z7Lxrvdgb3EuuuyqNmqCJu2VAiionvU", + "BdU8LDbRz817PDiyJRbUzX9kvwgJuRJL4v", + "2fD34aN1kxUkKSHAVUkcTSZmVpV1ZPMK4jY", + "2SGdzLKVwRY7dA6vrfZTZqioUuR7yEWHb8", + "t4aPvPTwy4NQr4sHUbXFPCbEpPHMnHn9fw", + "2fywmk1JFBWfrbYKpyivF2qt1XjV7rTuCqD", + "zSP3W2ZbzCWwvk69JqvREPxHEvb1U9Q68G", + "2QHvvvKBKNraiCvoGx4fU3Xwq9tgrrc5arR", + "2kVXSkF2EXE7LxbcSwLs6Gyh9CgUXf2gYgE", + "PmSgmhtqHJq5Rs7LxvMTFuZH5TQzZgHamz", + "28CeHJSraNtzbtFRCVCf35ju3sMrmKGJwwX", + "22KKg3ZgPeay3rQirrQmaARYwqEqinHyppQ", + "2k8z7Me72JErTCZ1LsZby2fp8NewHKST1iV", + "VMvAaPF5xer1ajGXZRdjGLVpCMLpTc9MeZ", + "2Qj61y52vYpAJvSLwgBABADvLZ5F4BErJHE", + "2grhyrLNiRNyqTWJcGsvAbR8y14M4zuHCDY", + "y6xApWEtFdG52uzi2ZJudJUiNMsmCBFxgr", + "2dvXKoFtbt8Gwqvb2HsxWvsxf8wFfArnGg4", + "2PZCcqs48BZRm6mBQEbTC4gG7t64nNgqEi3", + "sq7PPbj2JyWywT46BNsEnnwmH9tPVnGKSp", + "PCWi3JbuFvkbpE9swb7F1SYW6aFk2tDYbo", + "2GfvH3qbf1SFs7cPJCHEVzYqjdKiXuqJ2gt", + "vgXornG4bZRsg4NUWBqrhT2Aooh8ejxY6t", + "RBV2tdZuUnj2UWZSocwTEmTkpw6y4YbLr7", + "2L3oRRE9GkyLLarwnCw4anARV5UVmNW6eD2", + "2bJgFYgXe7tGddAHSaRY9h36s6AGEg3S2Hc", + "2hjQgYU2p4mdDqHe5y4bt79vvzTeKJReqMv", + "v5e2svHhrgZSrNBkiHwjFf7r5sS5jF6vkc", + "2VphWiCSLxM4gPdNpoSJBTHQeBTAMTb4H3R", + "2DYvZpmSiM8tsCRmy8syW72jE4ZHfctorUd", + "r9iTn1j4FHt71asV4sLkF22AcwtRNvmBmL", + "cseFYUEh1qhDgfaLkSwZCZBdNWKam4gJPf", + "27jdv47Ja6E361DSKqRcnsiDM7zDongfwvp", + "2GQsqSbrkY9gfWpFrBUMJb4W4rq2tAPeWnp", + "2SkNmxHNGXFjCgFRd1xrt6Fr59LDyXwhDzT", + "2f4WVaas2bLAG6x275qgvgpaWnbMejYA7uh", + "kNzATym7CgPeLLZ7H2nTBgfBeoYR8QjHrz", + "S6zBom4WwXEQzE5Spa8DAJm3qemBnv6yxM", + "wv53C1kFaEtEdw9fRWvcMurpKfCRLj9jRS", + "fcRHD2WWVu6RqMwvaWk5KpQcDWnpPbZr7e", + "26rugbJW2TUpQW9q9ypLX17pKVjMMC1CuWu", + "scXdT4VzVWBAzZ1br9xSjpC21GvdMk48rj", + "X1GkgcZNSBJkuQ9BSQUAtmds23z34amY3d", + "24R69LPg37jUVAMmyHeS3dqM7j2mdX5uiZ", + "2PVAfoEp8aPL2Jjb2zGNGLNjTqx6A6ZsNRD", + "2AS42RwRamadzj6b4txfrurW9vcXmfBDih3", + "2kwtSmvkSDB9uWT6euiYrP96Lc1NUH5SQx1", + "qqM6vDSRNRxahM67yPuBvrJNt5EVuykEss", + "2j4FF9MWZwJPt8N39LvP7eGGUTbMuvqiwd2", + "FaQUteg23WSWdxqvZ39G6cxJgCJcAyuFzd", + "bpDBL8w4nkiViH6xz3wk5qYAfT1eNra3Ss", + "oHBvU5gzsMhigpN145k3uHL1xJFEinK9BJ", + "FzWD5iUccjFDEp3rFKeyzFnd4Y8YSpCeov", + "ys2svmjLCs77rjyDXBeKzusSxYx2dQBpgM", + "2DcbwH1WyBtvkkw3zbFHx6hRno9tE2CTqwB", + "23SpMyB611QbNvHuoYUpm6Bg7Z7KscfkafE", + "21YPWiGiaRGLcKKfqnt1GjNUAxSYkgbGRp5", + "2icA39FHL4o8VnSjT2EK9RkJ9qKPo1ajZFf", + "2FZBJr7yzpd9VkVToCNwCyyvHuLw7F7oBfT", + "2MCtyY5LMVWjZufukWRQPiN1ekwX9xdZ8SK", + "2faXP6FNQe5UU6iuJsG1rcsoQ2Y4NAFXGtj", + "r5Z3kHMN26WgHUtmgoQZ5qYRaKoDzmYdyM", + "2Lc8KDF5F6PtJtZCK8D37ogxdLuyAx6cPKr", + "pPbh3MUE1jGizzjTN7cDg7Kz8wHSFUU3yC", + "B58XCUERBveC3qwq7nW2HCrSjQYTCFBe3m", + "2ACaa3SBQtnyKifQuCcP9ScGzzcywJh8g2Z", + "VbQuu42eVtCdrYHyqZnPMrSaWWTiL6jRbP", + "cHxLEALyiKNV9aRuLD6AJBMdJb3mGpVqJK", + "7ygN2yK3oQ7iMndkSwfqwsX5sRUGMy4EJr", + "d3JNUvvLrgQwiBYqsZqf4swF7eRFZ6LzSZ", + "JaFL1fTrFqGEi6TRWfsEb6XfP9r3FUEiby", + "2SxTvW6rroUZuCtCo5knrnQXAXBGnyzHuB6", + "qttTHjfMpRgPzcjcWCEYaNB4nNZVVU51EB", + "AtfRrwvMjcvBTrBbsxoBCpw5Lte73hy8ei", + "r8ZLUe5q8z2FpEZmQDiQ9VAcp3jzmPsgPZ", + "2ZWmujCztGX39TYED9imhn2v2eQUP25pYyj", + "2dATBrygCj6R4F589c8XPweZ4FHnyJ4hnd1", + "2DY9iaqgXwhAeEVD3xyEeNwcR3YQkMEQbi5", + "HsN7mEWu5h2puz2od3xhLWUKd68a9bsFE5", + "V2r1gZtgXE5yseBigyQAScnT6YScRSrmMS", + "gp2LPg1eDMH3DE4SW41uTXz521Kh1TnHuh", + "j5218YBFmnyMtvL6R9H4upiRsCQiwxthX", + "2LvEjhkp2mzYUMQwZDE2oQzdVQuFEjaJ1qd", + "3BCoLWCcwhd4MzTvNY4zK8DkKN6PMfD5i7", + "zePVaeyXvbGdcdEBgMmyTuWny3msTvmhbh", + "2iS7zccqPhzCLWwpJnrCYrigDFVQypby4HJ", + "Ac9nPU5cdbc3xyK8gq8ibucqYcvzbK8XX3", + "2LdJtjTs2DqLVukKwK4uuURrXvsr3pfdjVs", + "28WU8Q2XPD75abALS3QQfURNAWU42esV3Ef", + "2HmjBLrJpBVHLWGZ4nMcA34Atkt4UFpmqRV", + "odB8hai7RDuaas42sC6UC4JDXbuXosDyoF", + "QeSQftaAK7auZYjieieA5x51R2QrkPNx4i", + "T7xJKGwc6bP4HCCfzCeZujkbDhEobis441", + "2Wyqg6Ub6QHv9zba1vCAvFh2aZNzxXZD1y", + "9JXQZZJRBXq89jNasT5A397KTcy9nhMLi1", + "2JWQE7JJ8fKP3sgNvTrQU1iWV6LCCsgTCLJ", + "i8fhbbMLHJry3JJzck6yRxGn5WQe749raj", + "WfVL4C1LwQBWAAn9acvryuSJkWmzFWQXbr", + "2WGbaZtSxj15MeYnPWV7UFGUQzcSUYmdEb1", + "2MNLJARNutG75d1Sonm69hbiwwWnEZJToMm", + "QWESFNiqAuw2xDq53XLsYBtmitRx67Mduu", + "pv4bUUkzG1J1V98c44E2xEpPu5xZMnzG9y", + "26iMZ8fVzHPkf2cnyRLiqLW9FG68eDhwZhT", + "Za3Lz5KBpVQxLJRwiwt21xV9g3skHhnJtY", + "2D1NrC32foTBDcowbx3DGsYQnHhwKpEFrRw", + "WHUQ1LScVYtScdj4zbsVSiKrkokVMYkT29", + "Q8ct6Uo3rZvbu8wM9QvtK79UgYW3u7US4o", + "sD2etFo4bsxVzQzqXNRvppG5mxjs5593Kb", + "LaB7KFHWyYp42bXnfMxrpDJz5fPr1Fo7Mg", + "x1tnyYT2GvcGG8HxV5oVfYfaZQYxTtVF1C", + "2iXFMtz3fBjyWUEBRvus4M9UZxNMjGg54CP", + "UhjjML6iwVhjF2cyQVow87c5tsMzFEEL4J", + "m6XgSPMLn25pQKErbjcN6ySNdGzJK6Czi7", + "RiihQXtVyb3gUqgVYz9J4oXoZJiWZcrNGA", + "2UxCaHF3JmC8u2z9wJYncxWvximAnAQVQPf", + "tS7pMxfb4YMaJrjQtA8Pj654raEdQWw4YJ", + "LogPXpHU1KSgNtunRisL3oCsPh56ov1mh7", + "VpHJKb1fF5EEJKAG5pzSxfwPVT84wvST3K", + "2ZDbmk9wq6GvDPMTx1V6fMSwXs3nta2BmEw", + "2DmmMLt8xSoDMgmWG2kzEgyyN8P9EywTGNA", + "2RHNDJ4c1CTA8gjgJLyfxKFZBfCMjVZjJtW", + "2fPR3QNRuK5BksW5EKoETC92UhQmwpQ1P47", + "2FKoApfy88pA8v5jMhRbo6Zqfa1t8KZ25fz", + "2Dv6XTJWUkDscKJYAkXakKQ8o695s4BBjdE", + "EVRDLK9n8RduQcXZDAR2jciwnmNjYfULBX", + "SANvVBkc79rUbdcYyYhAgXFaqNTEYRm5T9", + "2zNM1cfutEVYSkeDKsHy7pLEMu7voXaFJU", + "2QFCHCM7kApUjq8F8tgULK7Yyk8ryNucnCe", + "2Uj2ZerjUsjiwf6R21eccURZZa31anBdACo", + "TYLS8yFs36C99U7rYK3N1CUTj5JQ3Y64bh", + "H6qZgezxVK36ctSChodvGtKpRUoKzhgoYC", + "t6tp91kpqsYCLFEenK11h5X5SvpCZJwyuY", + "2BETM51cYTqnzC2vyrjTBKi7HwPfiGrvm5G", + "2DRyRcJxfSJB4UBv9arEcKkQQsdxmbk7L9c", + "2JfYhANaA9cV6wPr1eUgcXznUbEhdekZQaN", + "J2T8duWvN1vdrekZis3bE9B2GJzowEnaAP", + "Abcsp4svT7L1L5YG7WCr56UAkMZNcnexCj", + "ZTwiXNTh57ox33BJKBLrTvgAd44nM5ocTc", + "iqvHjmBh6om9yeoWttwvdEcS8c7ikQVFhN", + "x5xx8onr5N8ZdD19uoWMAdr2KN3pATid6h", + "2LKxjyNUa3wJWifsEhsemD3D5VYEBWuR6hB", + "WWyYjDKsdH9c6k42vYV7xUVeE3W5QMoDRP", + "2FvRFAkzyWVnEsobsLdUXaKWHziZXgPYY4B", + "pgfDSRXW8YoGJMbTygVcmGAocnacifgWeN", + "9hPAFWvNbuncxpnZSJ8VTBmvbtsNyrAAjU", + "2XSct4fJN4PbfYyUf1ptTrQGJYEZjN61QMf", + "GUuQkaZHEJi9CSKrkDvgMPRtUugJR1e1SG", + "2UDLvfTcYPXHQigHtntKEHm8omNUhxHjJ3y", + "YbB29S65seuZj11QQ2HwLPirBC21rCzGWu", + "NQozKm4H3JucTXApyYrb1xSiAVCRm92Egh", + "rnqkTxcpoJpvJ3YWBr6FBKLf2bHmeagWEj", + "7Sy46MPugGv8LfXd4HYqVKKDJUeR13Mbcj", + "ZmYsjwMDxaxS8dDHNctyqii8exgzGZGHxB", + "2PK83Ah6KW5zCAXTew6YbJTKFfUZ2Be1uqG", + "2eBv3rnJWUTY6J1uGHZwrFfs9hdEG8Qp7vy", + "2cpdD3eBPqEGC9KBnrwVjQu2MWtMSsweLXu", + "EbusqpeXdHSGWveCe37xB1LuBkRHa7HHiA", + "23dWjaxitheagVKRrv6wyp5PpeTcEWL1aKi", + "D8Cmz8fjmxrPgeuU1P2ade72x6G4srKt22", + "uGvLVnDZmaWxR9XVTr33uhJ6zgbabnjd7B", + "bhZoVKietn2YYQqN6FuoZVdaJD7BQDTp53", + "22Pr5b6ThHzveHyBHYhTV2PxcH1uCKUhgj2", + "USHbaDyDJvbut4JYjDq7Pk82VA6fp5eWXB", + "EFc1NuPKFLHpJiqS4Jhtjrqxw18ECVL5dh", + "2Wiu3sYsbbB6JXPdJkg1JQc5CWSUKoEWmn3", + "2GZAg7zBNucXt8RvYqtnUYhELVgNBvn7d1T", + "AsXziWrAtba2TeG1meq1UiFBSw99skaPZk", + "kSFHuhrtHBWrsaN81A3RnBCd86V4RFxETW", + "FhbRyXNp9PhSJZwPiXSr99p5yHxvYFwcs9", + "kWYWfkhuW63JeY9bQk5wP8QevS2pXEwQNE", + "2KjSeTh1LJezE5nfSBv31z5frLdbJDtoVDq", + "WGo3AmKPy2S7sfosmFSUeUWnrKo7htgePz", + "o7Qs8DZF2z9jYTqs5iwn7SdurQ5VkuNqiE", + "UJw1vB7bkB2vVcrvcXK1dWvJE7GrXxcc9m", + "6DXNuZqS4Qz2Duip7H8jLy1warLCLfwriD", + "5fGVmbKSah57EKmqXdfdeuULqWFGhWwKwX", + "2VFbTvHqRWe6xFazo5YfTAauMupcEdAc5iL", + "vhByUiBJEQMLFhJMndvfeN2fZ3H21rGHK8", + "n1Bq6U2q51rZkxvjfkYyfJYdkzU36S7ERu", + "2CsTf7QcA6x2yiqJSg4LPs3ekwx2B7ca6ey", + "ZdBvpEYeZ1FBU6yhWwnm7hQseMT6d2GS5Z", + "2M2CLXodzgmFUaNoJHzRn8ybK3Q5YNxwUSj", + "8o8EDreff7XVuuW6CMHxL7dCZXRfwqio5Q", + "zcfm9q1sJYmwFRcmorfUcY9pfyXDt5V5M1", + "24z7yH2uGTLGwQXxeB1eYxSp5n6U4iUcRV8", + "pNz3yFCLwHkWoEucDfmLx7de6rDVtAP6ye", + "2Gji3WZif3m2bwsXHMXC3kk5KjxQJxbAbDX", + "279rNP8buEFnxgH91TChnd7BjEdUFjhCKbM", + "Y9AeMqziJEKRjFeFS2ndQP74RAfxkPCiPd", + "9DSHXhSnRjUvU7wg7wK9wrf3Cws1rWqxdy", + "2jSc6aubgKxfGi5LEGLfqsKn6ErbnDWxz7f", + "fAwgBYeqkNsVEJuCYwtrwi9EAbjzFMagPy", + "BTTjycRbzKiq7ANJunQYeDskRD1DkWzuui", + "2B7Gfyp3vCu6ZTnmvn3yXGWdogJJUzZ6Y3W", + "u9ytRd75EitwfcdyF4mKtFMKoT7vRbuVQ4", + "sVTmfs1U49RA2tDv49mpFPtxe572ghySrh", + "dzrZPdWmYg96EbrimjCQMTQ4jXN1CfCNVB", + "9ZTPux2h63jCiwcWG56pjeYcc4VqVRaMRw", + "73wFGG5hQvP2fRfLchVSuoLLf6fD65mPqK", + "2EMjHmxZffXofkgV5mxdhvgKaKFGHJPPvhz", + "2JVq3V3XZkkmkauMrXrxhiFjvhSyVhjkHvV", + "28PpwQyRdScWBaPtbZ8Xs9QxaZ5LhsELuAe", + "jLMUJxfiBSBNF863czaNmGBUzX9USvGqW8", + "2A3ytdxzegtxC4UPc7dzJjLLsDkwRL5fUDu", + "6FaqwhbVTBKExZCo52Xrw3NVrLsa4U8RJx", + "KGAYZE98subRmLpUneDqJfmwZTfs5GiJvo", + "KHyAUg5Rm9udYgkQbvDn8HGa1i8qCHiaqT", + "qEbtRTcnF9382iD61xd384JEmuGnamTMNU", + "2TUA6iWeuMXSLPkg7mQ7kAcPTjJinF9fcoV", + "d8q9PuocjHRKkpViEgcMruihTZ7LBxPQtt", + "VTe4PKZ4m7PdxmzQMK6aEgBTPd3rM9FxpL", + "D35H9k6v7MQHv1S3JX6auDyxRUizNRthUa", + "aKeJsYKw8H7DHSgMRQ4TNegy6uHukr8zsZ", + "2WBvZtBY8NJoNk1rXvRoD6t2Tsa5dirouah", + "Wxp3BHydpoHvh8amF6CfPnpWdnZfYykFoi", + "QZ6qoEFWKqnat2gEJqpvdjYapwH1aURKYv", + "q3TfzjM2jXATnLyYswDCenn4w2nRbFpate", + "G51YQhi4WdekifpV9UF78AECxN4Ew4yo29", + "Mo4XtmT9SZFhN78w7ByqBFhAr8H5k2Nno7", + "2ATrnekWcP8mZuPJ6FtjHBRFyMsNpbuxJZ4", + "rKQyC5gwQdtXLruXRzK4KWoFE3YCN51J3s", + "2EbyKP1GoGoQGEc1nqP3jsU8jH95jdQaZ6K", + "fdFjQhPpUybaEoxSSUWcVBwpQNM57Q2dEe", + "ipToi36PJLhumbp1HtzZ7YEerqS58ypJgm", + "2EAUuc4EyQk5aCQYXpAdmNsnp3BHawKV5vX", + "2QsXdXiNettFYYEbzXMfbRQUsQjZsxFBcT6", + "2fWKm871YjbvcTBcyVxdoZZBdo1VP9GdDH6", + "22jGbfa5XJZ4JUUYNK9diNBvCy575nFsUKW", + "zYF1pA9UkjKeRLEBqQig1iz5jtH9YFBiEj", + "2FB7346MUZY3XimDZ9RTM9WhGnuRzdJXd2x", + "kSVPyoAWXSszkzUQjVxM1zo1xLKYwbQLz2", + "2ZD4TvbXQwpvQ2pGJL1oLUqVbtdQ5H3C7mf", + "2HD8hwurNHcKxmW68zjvvqa2HGTVKc1uve9", + "mCr2XgYuPL1fRULFU8vM1C9bouJKrFD2tJ", + "21mJNT98GNcQvY6bCVC1k5xqJbqhhSm7sk", + "qX3c2ZUXUpWEVaf97Z5uJpUUpDszfmFHpm", + "2my7qAW3rgLqCZ8bvfnkqvn332fJDLf9Q7v", + "2PFXBcUikRwEDiuE5PRxeisJ3VnvR7sCgT4", + "iTHmpJqSaKR3gzgZv24x711SLPjmXF5vfz", + "2dFeubDMugcGSHN7yvpu54Z3NiKdfoBZQGV", + "qAw5Dg1vH9VW5zgthhjpApUob5RcKCphxR", + "2X7yaNvNeSyUZ9odXPKVBZNC2sK6mxd59dm", + "275S5zxqgdb3QkQFvEZvmnpN8HjQdM9gcg9", + "264RKB64NHgRUsm8N27NRQgBWhUQCNZQ8Px", + "2G67wabyeqfAFn8f45bv75D3FiP5yc3fgT5", + "2Pmw5G7bm6PUZ4tuh98bWMLK5JsEnouHoxY", + "2gVSrUYSRcXFfAQ84N8euMqxiAY4C1Ma9Mw", + "pTW6o9Uu1y6TX3uPMpthkP4hFzGn2rhbRn", + "28kJVjf7DrD6dQwdS6eNccjDFeLZyqHgit", + "2B2vmEJnUPALMtBWk4SVwjF1ieipCti1Whp", + "VUzo7YVBJW2RGYmCzt58mqXuxnHCuGgNRT", + "2KhY53kJWQXS1bAd1rAsuxQTfwihUTZJbm7", + "23Bm4w2N6yvjztzBFh9m3cwhWaVaDCACKXD", + "dC1CbqNLVmGjidDpCLnWGvCVErX2cStu7k", + "2N9Kpdkc7RMFc7YoSMwLnCBrJwuHrq1GfTC", + "2Gp7BCQ1Mcop8mDxfHqw919LsHi4uYvPqB7", + "bhgzNjYzMNBdCKPobBQu8Nr3ymxApUUdbG", + "wjPB8B6AyWFiXdncfYGyaVzn9UaHL8SNLt", + "2965DLJePnk3P7gmJr8iBxBmbEvMreVH9pg", + "U93sPPLeCUm2zYq2Xr1m8bEDnMC2qkSccY", + "ZScxXN8aMTRUKQY83qa4YMP1t9wVBbcbAb", + "2K3UXfrcdPhvfibbJabjVzoUmgCVahk89my", + "2P7chzgs6ySFe2BMNVHpv3ALgaCZXvKDvW5", + "2UiS8X5DzCjkXab86BPpsLEZWTZP38kWdTG", + "2SYwoSzatN2srLEXNRFi6g9xTzgmfkx6GDL", + "2H2eDvPEMgzVsQVjPCPKKgwBigusgT74Ad1", + "wKwnsaDu6W19FJ2LgAH49Hgr93wwzceR8Q", + "2ZC5pnUGAzuZz6YVqJ1KB8X5EVAsNw9gVer", + "2RmXy98mxKRCLcWgGbaW72zNwduM9ESc6oy", + "22temNXH8CaoAjcgp4ckMmpPX51TcjUCrtV", + "2bxk56j8SzAorKkPLFvuK7rARaLrW5nxDKe", + "2citeCcLqiga6gvXT84gNgTuFQV7eZZQUbz", + "PWnDMFTpQHypn2NCgpGxUbbpFznjnsYKCT", + "qKi7sYfkX3Ho97v5jh6bnenLREUmDaVmVZ", + "2YyFV36bxB5YgnbyjKvf7DG8hg1RRRRW6QM", + "2mKeR4Zon97znL2YN6wWYG1Z2Vb9n8c11c4", + "2YQgNreV5K1Ddi1Tg4vDrgs2g4Rr4Ve68ET", + "71hXWX4ZWZjjVCBypYSoKqrUJYShxCgB1o", + "2Zh9AooP5QqPDxwD2CyJ1jpZz9Eh8uJQmFK", + "mvt7fKqNxaRmu67wRbGKa6esaTkmKrVPbW", + "4hd48TitidFfVJA7PgeEjTo5uCLYqdVx6n", + "2kVrcp5e5fMQ5nobLGTj1as4PubjUvVdzEh", + "2KXtdeAaG7Sit3Dn2e8J7qUkT5UnF1e8GSD", + "Qk6ppegaZsKzBafYnGWmvvA4A43pCEyV4F", + "2gGTSiyYR1FHnJWsM2ZwAVP51SLTS9Ytong", + "32xUWZdeEQqrA258ofviDMJKydvJB5nBBp", + "n3SNQqZseF67wssSTR2Uey32oDjgkEcrgG", + "a55rAF1QrVk2AvncsjBh2cWrz3qe7BNPSQ", + "qEWewbfwoF933ZHq2MY5cQK6ERX7jMbrcz", + "22x77efFKUiKkMAMsLK5rHZz9AnwfRZEoq6", + "DjRAQSCHqrcLpta3BN4QMYWkn32pxXSieB", + "svgWUw8e7UJ6FfYhke12NH1RHkVp1QnrKn", + "2PtLXN2AdGA6EkjyKGTUPnwwiv469sVsLcR", + "2krE2Y4SM3adGuvLrbcsWVjDjmarK6fNLC9", + "hXj3uCN4qAAjdHutkFZmgQV2frZPsroccv", + "xiNdrpYhC49FuxCAS32AJTA5W7234YLXdw", + "2ZBzmkycL5aM54hQqYwQF7FRcC2K1FhbMY6", + "2ev996qFXc14ipF2onNre4doPzJwdGdz5Lt", + "2TY4q3ZX8XNLDsLbj2BpcZMT7BTfENVq1FC", + "29mUGDmVzaxB8eSxnhHeKUM8Loq2WVV8bgJ", + "GdybrYrqnZhCMZAFQbjfYsWvipzAXKzXaJ", + "2HXhnSVQziUTxCJ7mSUuU5sX6Kd1Go9nV6t", + "272aiBoYgCHu15C8XTZYghoMJhbPSvLggJk", + "5pqf7jE2YmvrzpHMsdxPAeT7yDgkoDNQwa", + "2EdhWc1AJqDHAfxt2EWSNGy92KeyD5VrrmX", + "pChD8xx1qaCKUz4AWDKmqadDPbKsKPk8z", + "GRSTtaK2iUi62WARETPSrqbPJaAmWVJ7TR", + "2iyXPWZQfyED5keLrCvFJ9dSnDEQ4KC5jtq", + "kW9FaFMHciY54CQbjwtUVxD7aNpEbPYs98", + "VY3CwaiMFF3A26CWA3oVR1bVvGMTGq1HTM", + "g9TXfNhdHLs7LPFrff1SRVKtv8r8Eh4we9", + "w8n9mL1mvg5AuRmcXzfKAfz3KTUqireetq", + "3jXUJUNypj2PWPAPGU6RvDR6kLPQSo99rf", + "2EhPvEwE9v1uR9JWPqyVhs3C4EDgh6A83Tm", + "FGd8PaHwVmLKe7Bb2QtaWygh1xsU5jXpdy", + "zBgRHaKFhCTUrjoFmaFv45KsthnvWd8zgM", + "2kERzcke41xND8amAghL1ZGqqENALwmSqEQ", + "2g4vmC8eYjxsEjTqicVYfZ4GL4G4cWLQ9bt", + "9xa2eXd5Lcj8SeHz9Zf5r4dTdKx5f4mJtu", + "tQP5PShYf8Myw2b2GjNtCnJSBkc6Hmm8zq", + "24zys4ATNj1CQBA3jPkSb77kPkf4XUUA2Aa", + "2MEv6A9AJ46VDRTtHVCZgZBmc3gQCtVdWhA", + "Lwxvt1Bp6rkMDnD3BHkjoyjk9SWguswnyq", + "gqW3mrYhxh2k9gRzzNBuMyELVU3RwvFLPg", + "2iuD9JdwqmHX32uHBT279sm9uEMPahLFsNa", + "wkEnW3fP1bcsaPfSagbjVAkFczF2Bf6e9h", + "HJg4eisTopK9xwQojdiZk7WPEuDeexQQxe", + "2cfqJC7Yy8qksPBV1hHkjrcu2XwtcC5MLug", + "j65P9RrMBqJxHHttYFJkotAbLMtkaskFKD", + "2G9jtJG5f3iJ5Xg1mipUfo3Cqg1ob4heY7q", + "2RY2PtFPfLWuMaE2CRcfA9mpvpE442ZnUJ4", + "2JQDSNYehQMrDhYnBDouBiB27gjpzGFXUTJ", + "SecSSp2bWg12g9wvL3w9cM9a3YeNwj2Z7h", + "yZeGyGdR96oVj6tDdCu8hu9uUit2TNU9iB", + "2WoB1ZrT2pSfUC9DABmouhsA2ymwx5D2Y7u", + "2a1Y54DLBV1tvjCXhoEHnRHRi1SEpJr6zwX", + "m6A48nPJu8x7zCFKXjdLhR6tP7GMPiqfCF", + "2D5NbU6awwaBu6DVvN5aWn8wjVfF8Yrgvyx", + "27WnC8X8S4vmzTkG3DivVDNAEUh73wMvkT1", + "2eioRV2JveEzseGV8tZ5EwV8pgqzfRzkcKa", + "2EWdcFgAcJXEeQvsqsT5TkSizPCAq4Q4gw1", + "NXjbWdD4E4nVUVJr9hFCgUMvAk8vKVv4no", + "2kBbcZPh9ESgDiGQD9Chgnuqp15hp4M4d49", + "2kMgnRmiJusFHFzRhcx9NhN8iyhgYUNyZ4G", + "2XeiysuxPjCr6LQDCViz2baEZqLe4dRopvD", + "gheVR16FBFRPB2nqyZeh3Z7BvG8AaQbjfm", + "mqKZhBAdnwRNu9zfSLhkFbunw7JDebw1KJ", + "2ShXZ3ABrVUgJS7x2BjnkQ76NAjqZMoAac8", + "jFTEEjkzbcEy3siZMPW6MNUvLfSfTHKbk7", + "2KRhnJRGzFQZk6b5JdXeSGnPoZ93FNHa8Av", + "28HC12dpjRYwuGYokVZqFWG4yb2PohDvqZ3", + "EngRrHn6H8XWibuC3umWVwKUZu3fubn5Wk", + "KJ2SrNrpVRu4k6LGHWXCtS7u791WyPZsxz", + "2Gj6RaT3GdnZGTLZhSSdq1YLftnWiq3Rn1U", + "2G82D85gXbTNrh3omKGo2dhU3QX19ahpPct", + "9Q9eAKKF6gW81Y1Lt1fCRWqxsy74LALLxG", + "dWf7P9kHNixeLXezF7ALSnyKRzv3tb1oPP", + "amStoiSTVCh6Macih36WCQjfesHrLfZwTC", + "2mZDB97w1uHfzDMZySeJttXnbT3cpWbfJim", + "2AVAusdbM7qx6hN9M4CMTitvoBjHaXdb6B9", + "JBnibxjtgNRSHRjniQbkWEg9CczT8vikkb", + "fJ9RcPoAZsfC5Z7xVNKV5K1f6p76kpqPB1", + "aNkM9Y9rzSnapxPwuJ8S2mPzSpoJGeAi3H", + "NTcWsoz4mEDmpLUqSayMHacDcMp6PbigCs", + "UARa6yBWSYAdutsFGUZksVpLzuvE8VRpue", + "hLCpMLHxfCqSDpd4d7EtGiTiu9eqNHVv7y", + "sZDwAoDuLNv9jgzVbCYMorNvsKYgyxDtwm", + "WBuffV1ZEnVxkxge1oqaKM4LxeBHhiXQMP", + "i4Sw4wKLk3rwuK84BpTkm3FaXt3Dd5Fzst", + "VQV2axCh8vUhDCuvQH6j718PxRNK9pRf62", + "27wF2RLDdzX2MQPexSVHqpD3YmgoWC6VSkk", + "22Q4YZpZbXiJnHCejynUUT2f2bZiaWPm5ZS", + "2Jd2JaBEG5J66ynwxLjvKcAQDWhAA8Zfy3t", + "2CZmbuyiNSBScu2ySM1zyHw2Nm4rnx1qA29", + "mR5Zh2qRosvdntUHXp9FNBaGizS37RrR3s", + "2CxZNSjcbwF84SaURg29Ekf7Q83dbkTWzdL", + "nifeEr5FMsJ8P2s9uov3JtEj6GtQAPVRYV", + "XzMY8DzegifK476oax5RCrKTrfHP1GvbSV", + "2UL8eo2pmRsZm14Wk5GEKdKhQXt4n7RNReo", + "2R3kJ93ydK9biwoW4wNytu9atugmZFfapZY", + "5SppvUZrFhDJr1HL9RK4cYWpkW5XyMa3T8", + "2YaKHDtcsBPDsruivjW3WU1bk4oWYysKWN1", + "hqqJyFuJGqraAdENHnmk3tjqn2KCCzNuCu", + "doWGCkfbZfPUwtwDkiTUvjqbSMPtF5iqRN", + "29p5vKRkfKNyRNzZezQ367dSCmQ2WQfCd8W", + "5v1WsP98EtmyFGRkV9eZzmFwhoKYoCUjxG", + "dJWPjQ9bK2Q5e4d1R4TN8ELmBvE9CtWUjk", + "df4G7zUS3q71hREM7gDeKs2Jdy3xMYaKmk", + "2kTitsnyqf3iFck7pzEcBexN2di5q626bGT", + "22EMNTEUr5rjgyuNdJDjf4EE9vu1UweXks2", + "XWewC5ys9aL2HTkXpSR9EePaeY9d4JqWY6", + "2CL9NnXUTJSUnT6rVkETjkajgTiKgxkpehB", + "1HdYyhcJ1gs34DJdrw92q47kGdVhJpqGUw", + "2hXC4pYWmYAH4pHm1QhdUWu9rAxWSDSiSYD", + "gZSgkE59bV8xq22wRKLL9cbAxAybekMVNk", + "nPeoMYwR1qcKu8uWkCUBvdtduEapgoJ6cr", + "2g6WYh3uDwuRWxdqb8dkQ3pA8DoJuVVepQA", + "1JfGCbVEtodwrh8ge1a5BWLCizftsKohpd", + "PL6T69QRxPEYhh57nVW5ZP2frgEDakE3yg", + "Ek4ZVJPkJcAYMBXmVK77VCxWWzj5dHcUBD", + "tDGXNZUk7NhyXVD91R92RPrC8nEX8C4KnJ", + "2S7nLTpD8oBk77jbmrK4cbFzjjb5ULfJutM", + "NcqCL64x9cLFupo2Cp8VBiEG4jZ6RkweDx", + "9EWpoRyT3LcCBx2XDcSVqG24p2JHjZdMQk", + "2YjHEM53twokKsv9vNgXCgZPx7yx2f7WUi5", + "oVxPm4zQVFB8Tn93fTjDySAwoBLg7qC4u2", + "2erUMeaiMxGgbSnGg8SrMtNSCFfKtL1RMm4", + "ah1EdcvTbnRiSQzmjmys7bsPYiELZp3uX", + "2fJHwfLQHJKarRT7aGspuNeD9foL5mGR8Bj", + "JmS8nQL5hm5GPZg2kdFhbKEcAAE61zrGEs", + "27vpLnkjnkbxCWCxK4E78SdT1xaSwQFrYFt", + "miqaYxDjRhHxiT9pciQJrkns9mbcpXZGPA", + "6BZ5cmEFMt3z1zty8zdMJS9fB72DeDb1mi", + "257ZuvtWwfdcUWpgguM571CLsTHMdAh8BSM", + "2PLGyxDpMuXkD3K6Qxoui5RQeJmTP3JM5aU", + "hSmBxbq2bS7Ap5VdkRiqZnopAAoZWYPc2c", + "MG1RMWzA8CzHMMLkDZ3M3P5QkPoEGMR4iY", + "4HPd8g5iSZ24vyAgsMWCczw2MntXEnjcn9", + "FUue9XroCvaApvgtC6vP6aFsS9raujbboZ", + "x3BRXMaE1Vq1B88ijxZcfGVyH1L3o3UE3E", + "kFt65AqGUcZ6BnYwxkg8ouLvMU65EfnpSG", + "EgToqreozYyjLoP1RwJbEwbDL6BxVGu3Hi", + "2c8Ma4k7SFFut9KH6zFJDj3AWm49JVwfSGG", + "2kjAKoUJaPuvT6LLf9MJHJsipaFeXxvZGFS", + "2ko72nZJLWF2uRK8hdgdpA8TwZQAa3XbKLY", + "bVTQrQD9nn6FU5EW4FGTZfhGsBSgNmAwRw", + "2AGXtMso9sm5P47TwYaVKTrRyK1SdeU3yjg", + "LhtGk6r77ExeewBzTMbBbb16mR5Y8Rnpbi", + "t47gigvmPnC9a2EdrfbLzLrcNdNUAZQyta", + "RPZucq2gsguqnbyAxSMrMFydaFnjtacE9k", + "2QJ92zVRimrktnLab8GFB7QUe4dvSUr3oBv", + "2buZakH1rVkNHmjxmfAfW2mZXEHncsL8eip", + "22wD4qBLR11JoimzcE6miwtgG3ngEbhYmts", + "aiS6DEwjHwVybB8eyU9kGq9SN3uVBxRACW", + "sPjLfyfnkBidqif8hRywECKUsaSoNb6Yhv", + "2jXw7Nu2DgH2crp5f5ZrYTGk7RMSAfSSGVy", + "295YKvNdC8r3qDwV2pHF7bRnFz4sX18rLqg", + "BJU2EkxAaxfxLQ87uoQtmk5MyzYXyE5395", + "2huiXTLXLt1nL1n6oaft9Z6hiLDB1CvoyZY", + "2e5741PuQ6t6my7pgJZajK4ZSWCQusw3zAB", + "27ekJKoVe2HoLeeBCuvTrwjFALC2QT6wPQ5", + "28qetYhMqtMX223SnCG84uc5z6Ba3o3kXez", + "pabLSpoZ7R3oD2Xb4S817USF75RdLA58wz", + "3xRRkeRJiTSUAAftxCucttZ58KctQhi76D", + "2XcuDdxW6HawGcDEUkJRkXvBc4ZdXofcL53", + "4o1a5fFaFQETj5dKNDGpFA6s6cYofQw3Ly", + "2ZWnE8qXSiitCPf1qoJBGKnsgTZnXZbBocS", + "2eMDQHRoXkf2HaE5jnpfwsm2whPhBUnZ8ev", + "XTutpLyat2NHDCqtNU5ZeEmsyNFf5BbV2W", + "7BMFBvJMMCna4qWGU4xA9fCBdc6du76tBL", + "tN9hPYbBqqWm6oywzCEnttYgevHt5EtpJi", + "2Vmv5mgessEsoLRzRVHeErhGh1BgbhUX9vN", + "28nJZQJXcyCXcRQL68SKpgigDgXxdsxKwJo", + "FutR6b55AZEbmpjBxnvw43SKgJ9yz8347Y", + "LBP6mi9rz4LkK5uT8KdGoZoBBWNQ4EcMXZ", + "2JUkgNUX6CbrfHA693MaVZVg2EhmsFjBCE9", + "dDurygy5tph6k6CbenucjHq2pMeDY7LxXW", + "8Arek1skSnERYfL8DJD2aoJoyArjwm8TBi", + "2hsoYhBY6XhfREDLQsJ59hQ5fbrVYxaSt5C", + "2fXEJLW8ryBb9wyZFyGAp7vEjNPjSnTMLo3", + "U6sW3LibpVwJM2UA6oCVMyNS1up9XTH9Y4", + "FL2igxLzxxe4v9DgtLnZeAPvcnimq9S2h5", + "pxLypSbcXC7mFn2aL9sW5w2bEiiwGsSAnB", + "PXoDpxstsNGarHJbYym42cQPxRUfrhKPng", + "kUtHWMzuSuXRjqDjCF7a5Bu8HM2Ea5eXUi", + "2LAfD9yJNeaBAdhyKmD6S3kMcegV2J7J9Xp", + "8ZP42ww8jAJRd1sYPaeGVN9XT1amDEDVMy", + "2anN6ZShHz1fsXPDKpyHZAzTjomA5Xcd1f3", + "LrjjNpBM9QAxKYCqtsVd1gBFFoNKKFHxrm", + "2dktQJfAcAHcYznAXUAySxR6KDyE4fSZDok", + "2RuYSz89YVpxbbJSiUzAh312hFSHgDgejbs", + "2E5E6krKnyCiMKq98RSwCMxPwSVVGcddL5m", + "c44rh2ch6zmBbm5vWbTQyDmTic98bn3GbR", + "6kzn1ehUgWAnf5rKHAa36nFTTDg2yuE4Ge", + "KBo4PbckAGLcGaww3Q68HVynww5obFgfUM", + "sVB21HAJZaSQYmoEvPzwW3MaL8XdfqCrdC", + "2Xx1gA93rtLhdC2nYdXHDFgoJ4vqMVEGUGK", + "2ht9CvsP3K9kJGxw6tvAVhQNYscwarbr5m3", + "VM5iCziZpxRvcoKht3PEp6xjd4iC4Ltq5R", + "zHpt3Hh9BnYSVDBQtjgrSTbxx6TX9NK22i", + "yQZxBn9cDU16NacqgqG1E1CN1bVPvFpHP5", + "26njdygvPE4qwZZ3Yj8r8Nr6kAPL1ahaega", + "XE9ZGsSoD9D6yyc1fmSWVvhymHtALc5gq1", + "uqXZWnWQi8924AnD14Qefo4Cqp9oyD1fdg", + "A3kW6XJAtocb3RZzxp1hhKUi7x3prwARst", + "hcRypWRZ95k7W54cDEQyhXbo3jQJhntSxL", + "R19BH293zm9LtwHUmYbwY1nRMkdiNdcjUW", + "y6vz4cEbAYLxo5YpuCATXmpBHHXp8baW6k", + "MVXpZvBBZ1hKXpoBb6ADEZ5PskhfmQoAY7", + "7nxQpV5JTLdET8BrS5u1QBKBdXdoi1n8uu", + "dNwTPXscUyB8DDDei4uhaFNVn1zwZZXSXV", + "HzqUKWAye8ELT2dFYJXSh7nxTEaGmKwwqQ", + "E7ecz6ByxYPH15qi61dZxVTnGVfiVSKXLz", + "PbrcqhsS7nxABkacLbS5D1TcGNmbQjNJvw", + "2AbQzSf3NJF24Wbz1Q8yoNnb14XkHQS4Skk", + "2feEwyW7kthjXyDA2PE3Qc8zK3wZiZmpHb4", + "2hujgC8BN6mm2ynJEWkUr9u9PRTmGpW4Quh", + "2ZQNF6xDTS6u3PdsFZkUUw92x6X2E3heG6Z", + "2PYEWoh9vtehcTiXk3aKbaU9MSKzCFmdEdf", + "VbAJiS94usC6xc2g9gC18B8jJ2KJgJtNdZ", + "Db9Psfwdn7J2JsnLn5PSVYkEP6WtMPp5H7", + "BTmPvxVKb3o7B3qP9brwomqcaWDaxG4JTB", + "2AZ8TkwAxiYE6dp6MmEdajMCJFT9mJ6SCsW", + "eCirqjde3tABttJq8nWQHhEtybfKBGiYRT", + "FtuE4z7jeWMMT3GGwyrzc49w6EfVpx5ACL", + "2JbSrKi8iLmGEEtAiaRXv5vjgf7hCDxvfae", + "26CWn2LeVZf7nGb6zS1T2Qq1sMbDMWpDfSk", + "WrNnqNhLJRaSg43oNRn27znvUL85Faj2G7", + "zvhWMuLG3yn4DNSWnZv2PC8KL7uf4zzA7H", + "2Vv1fmjXqwEtqm1sFmbVCQFEtvRR5nhYic6", + "nNEjceCZGZ39r1rEDkNNi1tvF1vFeHgjd5", + "qNuPoX1Pa2GTL4VTqtST5mFUH9514nCiYB", + "4aMDuFNdZLL8GUHwXynv9yRsDvkT1eYwbW", + "2BJ1a7MMZ4LyLJHyYmUDJXTz4BwW2m8NpD2", + "2g5HsThBpsWyBJCH3vt9n5sue8cY5F6ShnY", + "2ANR6AQVnBP1ELMF888y9bvMXBGotyPF27d", + "U4kMG3nE55vggZhY4g5W2b7LJFnri38nXS", + "vP8LuC5f3JsyuxdNnjQE4cYX1x1Jneq91U", + "MnedMSKUUcFWDH7t6wQCHUVbLpYCVz54E6", + "2bYCbfrHuKT1qoipEF2WCaqYF2VLiWVmStr", + "21g3DaraHoi3ErJPnqVhmAUhEKYjaMjUX7z", + "KycARv1ZHFhHjMQRi8USeT3fA1vfpvixg4", + "PeVNeU814LHqysUkWjBY4g6HDFAWuvWU6g", + "y3TRuV9sGEkLydFFeTUv63rbKmD8P9tdMM", + "Qk45V9xFiTBGzc3V5KuthUYvm4rwsdCcjM", + "v5DJHsHz9Hxk9qtjGrWhhBirDF6jxAQcw8", + "2YunxooVtNTGUTuU4nymP1TstdePX3CjgfJ", + "qcUNUmuC2PxS349R7Zn3f8rHs5Zr54cTeF", + "3oizXQ9A5Faaz2eUfL2ai8VSZQrKUrq4KZ", + "28AfnQzpVgh5PvrBBktYWQrFXxzeNoFeZab", + "jZ3aqq8Gpvqx6EEyufA9XbwAtaeo1Z4XTW", + "2KAjjMvCdY8hD1NpYJ3N4PoqAQhxJxsLW9X", + "2EXCRGeRVSG9fWMa8TAdFozZ51BM5wQQemb", + "26SrUQWBqXuSiLJtPpSuEHQAmKKrSopVanP", + "21TCNYspXtny11NsSB3XyHnmKhHMYb4kCQx", + "xHj8ZYniXjXxt5nKNP2SpHAS9CHecYPEyE", + "ooV4AyjEuTxDbGjRv9H28EQNrZamr3gkFs", + "2fG1VLNPHRHx2STRwmzRGRPYUMoy3crF1SK", + "7Uv8eKHSRSF2v529FQtdSiqj25KrwUdtQr", + "2m2zaBUFoxDisNJDvYAiHpniVzhPKXyHKer", + "FWZeG7EFVAPqPSuv726QNoPEkJTfMJs7sW", + "R3z5YsC9UdeyateCNM6cseofr6mr2YHiF6", + "2bEee3HGuCFBEXfo5ptYvJxauAX3Z491ne3", + "YUcseh4SwGq5s1o1z3Je1AxyvYxbHaXH1M", + "2FtFHEEjpUZABFnYUdxfwJgN2f8cNshQBNK", + "2A2tQEmDSVu4r5e4V8XpHjsU7sCUGKg3k6H", + "2iEtyRcCr8BJDjZPRdkhmjs9DPdVeZAXAv7", + "2aDtoXE8n8tqt74Nf1t4vewhKni96mxs1Hd", + "28aWLBqsAWvV9FZzWGyFZbvfCcbXASCtDs6", + "2TQa7jL32GxVjpDURjA7MA9ttoPh1LxPac9", + "5D2kD3VjH3uHRPZR1KGsDqq1pG4gg1L9pH", + "2jCh9sVAttBSApgpQbnXneWDmEABEcUWes", + "2HWkxMq5wse8eMzdSg7SFRGdL78dhCrUnQF", + "2USF76oow7qg2JYZevCso3MVZ6oiLrKajnT", + "2k4dhY4LoyRm8wNFvxpSYWpzNUdEmpNwAeM", + "BYPEpZi8MMavCg72qYgrjfamrMefywbNUX", + "EXqYUC9qGhkocaAS977mYiiHTzxcE5iLjP", + "YL1xTa11Q5P8W9dvDhotR7HidkEt8cqDTk", + "DcLFpRpQs8DnUvx1nButqKjsgrVJCM3gA4", + "tUyQ3qtuLXY16DA8ChmavF8k2iSghuEZba", + "2bSgdeeuQcACouNKCHr77Myc2UckCHgLwoa", + "2LuiyDaLRELuPVoAt73U5jxokVhUzQVTkY7", + "tJp2cDzzjc3thS1peTdHqojjoeJHQdmWVw", + "24AAqR7Z84r7nWBvDsCEF7WLKwPhNsrZTfd", + "QR9XKx2hcYwQZSn7s9uZdTpuPhCD3SPU8Q", + "euPtyPekuzTWm9MtsEYtwMSfw5X6vfV1n4", + "2TmLQvUuow1UAQ5ZQ648sJfMieajJFyDyee", + "r8W8463DSkaeMXsHVk31M3H6fKf3Tad1da", + "2P5bpaSiWB4PTu5ReLmzrU9F28Q3Nzi67FD", + "M6ptsP2BtArEYywwfs62Bm6wpjvgi8KUHf", + "2STvXAePrTriUngyEB2FXgHyjoJjovDn6CL", + "2h8SZ7HZqChSidBXBR7N1KFRBrM9MgQxhkf", + "2daoffo1BrUSQvySftTVngVk1pRXFwmUjzd", + "QyipQphGo6eMWZJcGYXjN7tVNNRKXXGJfZ", + "zHLNxJnUiW2Xu7TQkXodaGXVe5kcPrrjhz", + "fbGDKVQwg8b9RZmmA7ruce82t2LNvPtQ8G", + "2CezKLkxkZk3uQs5k9YrunQ77GPVhz6xWXb", + "295jZueDnavv4qNSN3KFbYME4N35hirB2z4", + "CFkEWjxcuV9HP3QFQbozd8tiPq1UUNBVk9", + "uRJaiydoRpcEVMMDPaLC79Udh2kYLeWtbm", + "3aKVUkAw2uwD7yiVYoYpRhu81kLTySHpNX", + "3WiEk7ZmtwteTTuytNMf2xTr4Y2zcYc6SR", + "YFhB65fLnp23BdvCcWuZcBegQ5Gts8kbUH", + "2RQaD4ex4LBKRSTAYhrXnZ4w7cMguM3dMHN", + "sPdiieYPLeroaSec3qmuAmP2VrZp4YfvxD", + "29bB7wKVhKhBYpLB9HLt1ehbVRDvCjkxSXp", + "DvXK9casvN59sojtam1rYVVENAgKva1fC5", + "BRcWLz687gDQiMoGzdH9ExNXgjUadhxDbv", + "CfXTPXYceco11bEZ7WpwzXsu9i4buiGHdG", + "tvwyK36nRQUbt1TJhaNRKWnTYJLgHi9eGn", + "xVyUggaKkYhNiW9bEaztZ9epKY483kbn5x", + "2dWFKMC2c3oUksE8QmRWwo8K57iW1SPTGXs", + "MLVKyKDSbirCranKJFmiTnHfdHvtf4MaMb", + "27vLouPtqdFmrCkECctwAt6zQ1wpQ3vbCJu", + "2aScLc7V9im4HwnUa6FsXcNFRxMYZ2i8evw", + "c5hqkgrZCN2U3DdpXNaT1mghv9qWjLJqoE", + "2k3hToJKR62vQbNEHcj8FFn6ttgwGyDRAA8", + "2EiqFfDYciqBFcHKECQTYAajppNq14a9DKn", + "2N6awRsijdC6ZSrGsZStoc4n6vLtTuSFi5u", + "2dp2984zEz6RYFziJo9oGmiL9rNam4umhv2", + "2aZoaj5o1Ws94ciu3RGamaow8yotwk1QoZS", + "32jJQGued6qthCZGJsjeEyErVRBXW8YERZ", + "2k2vekekt5fZGkJDvcuL2y9npEsNGRyo8tx", + "Ht65zgYDWE2KLUWxKjVkeJx83pS6xGHZwH", + "W1i9YxYwzwDS3wG2RwnV1cERbs7ZTNyrMn", + "2gRyTf9pXQigUxgcn3HJT3fk9E3ur1vJkX1", + "GRJrCk8QMVuM4CYfFiLM6v5uj1kTA51uMF", + "fS6d7x6FGDsJVNsqgp6hmDDY7zXHFvLDVg", + "fbB3oweWooiSniSPN2Uhnkk7GQmiD54FUV", + "2eGzpSwFLVxs89eCKDuFXnRK8PaPr65GDD5", + "2AZ5xbx8tRVyFW7VUHw9uCzfFQSAtFwcU1A", + "2ZMrWv6PDN3wu4ar46WoiTqrHwrKkY7w4m8", + "22GyZB2fGxVsVkHstTNCUNpSt1ydhjfqwTK", + "2g81ii6LVKj6vpcuupEcZV9zuPVoxVgA9Mo", + "uoCGmWNtezqosyaKY6kP1iw1p7xfDG16wH", + "2aUzxeDp1iewqNjr72QwFB7DBx6ZvgTUEjM", + "22fDSGFdhti7Py7zykMqbja48SVkQfedsBA", + "ixRXVfn6hMRUsdsJTE7GgMm3Eid4UanKcK", + "C4HyC45crxL2Dy3va8PFhJEayicUSNcmPF", + "2TEgtqLSYXH9QVAU3H3NsY29begjFLs8iFi", + "23tWavj2UgBg1Jsk3G8Ns1HeYoGkqtNFis2", + "hNHihCGa73WtGv9cfZFrbqorAH3pvtcuuZ", + "2Lwtn55kqb9d6BNvD5ecJW7yBfZTxF52rhn", + "2eMfihWbmnvZ4KvSJPbRiSTTL3oFv3nuMTL", + "2JQ4BWC9BTHUUSHpd3Xc8S34xrenukdUSUv", + "2i3ZhPSdnp8NswPsw2p9883cfm4zqUWkMFN", + "44uk8fU7k2gFqerwkAKTFzWvwPayWmjTCx", + "2gDeQvfwJnmeDVtQt516hUbxUK1xTZfraay", + "2GtoNJMcB3RBxvNq8qAo5xvZiFHSJ7dGKi", + "289R19783EYott6pMQAPCCA5MkKpDSrUBoN", + "BFP3PK4WWqfD24dLp45tvGWWg6RznWRF9X", + "2mPjq2MP3jDs9hfvjJPewuWui4GurBUmcGV", + "2Mfb2mini3tccBzstfLvbjXN8a32pv55Gjq", + "eGmq3kfnftYqhv8igCHdBfYPfiSJyjL1AT", + "hMTQToHnS8wyu9mmt6KtZqhZ4JxSJrbGxh", + "VzyfHd1eos6Vsmhikpr2iZPHtdzMKSYM5X", + "W9Zgr6oM5baXiQSVDFCemfNpoKCn4Semhj", + "hJtq5WKgFE7xWJmoHwhqi9S297YwKNxpSA", + "86kvVQHJQMZrNBHctbqmuWNvRemU1RhL88", + "PGgDzvKoVmK7MVy1r9gFPKNRMRAjAEhGAg", + "2WawfhEctHJCXbX71vXg3NyECnZYmjpHqQS", + "2BBtShwjUwPD8g2kXABNo8fNfNB4zUL1x9M", + "EnXRAsuNMnNPjXE9zJDgamtdnjAcgE6qB5", + "bRMDHVuxgK7nVWRrHbM8m2387KS47C2Sdo", + "HMM8ocaqGax5YqB1tgx8xxtFiX2G99AvGa", + "wqMj7Cdd5AffBtNbd6hT7Kp8XvmTB8w3wz", + "VTJeVgM7vdHCSCUZftuADNgEubFWaBnmP1", + "3UVQ74z9hLVxV7hoghseqyKgGcok7uR2YC", + "2cF8jAYUp42i8HRJPu55GwFKor1Ur5UQt1i", + "2FuLm7pRUJtmDox91PYhLjuk1VX6CRYAdSB", + "2g14ENUNkP77iRgT9YNZsZvmg3MAToEe2iP", + "v2L1JbbYFAZdVezpZdw9crruveeaYNmmqD", + "vwT5HtduJmX8vPJCEdKps8xm1EeXdSP4qR", + "EJQdcnbL2qRD7DSEFLtKYntAKGuSkvarZS", + "jpotWYe8jjXErZZgYjbeRvVjav8Wi8Raqs", + "QTcmdbXUHgqAvnm6s86i9gXX2YKc87Bcko", + "fDFrEE4eZJ7RKSj2zMLD5b9FycuowTgq1p", + "zg1vUUgNRKPHua9Z3h2cjrComgyvEfzAjZ", + "2FPvP8Yv1JJr9ufeZWTg3Lf1qfBgTGatMWz", + "jr4ZwmRgGFSD4ZH3hNhZx3udHp8LdvanAf", + "msZD8PQsmt2fWufG68VGzyRRi1qvpsJdQ6", + "2YeyFYSEwvA4Zif3US662Wmkf6VEsJHKJ7S", + "DbNKRPLiiyqMuC75W83wzMsrf87Wcvjt8Z", + "2jS1HqNnnFKiPsitjFmMgZsSJ9yxXy7ZPGW", + "2FE453QFdNnjJ8RMA7QyxtsFGpi4wH2q2i3", + "25Sf84m7VBrdMQK1kLDF65ve22bEX5LGxua", + "xU4LQ1vRi1dyYWFseNnPFWyJeYMtohyoLZ", + "Ms5uBZoBoDxH1iFGj9bGPo3kpEqSuLR9Z7", + "cngBTW2gGvUcGkxtixnRgJ1fnj9GrABYSg", + "mSWApCCUJgTpT4HtABQDYSVupEd4UoL7xf", + "FjzvUD45SqbN2Zv5xRGWN3SNgLG3B1quPB", + "25ddKzdgp3TmpoEyqQTPc1yqrYfmcsJqXac", + "2gA5kcj8gx3b4zhFXN28JHDG5obB4wM2ZJC", + "2exkzZ39ZXx2Hvt7XMAbAGoMb9kRetQC9xN", + "29VCcYNC1soY2RnyjjG2c1FNhYcxdPPmDwV", + "2d6CABNcvWznWgxunfjqt57AD6N5VjbtUnG", + "23kXjScid5HCyfmvtJZ5pdpA3PucTCxiJoj", + "fFRZH7xwVihKMGiDUSUoWZMrvtQ9j3awxX", + "GxFd4XqpLQQWyaH6Hbtt1piCcXJ3rqdjZY", + "24iVPSDSRLktUj23YdXp3531s2Dbd4XvNpn", + "dQkEJxUmR9MRYKz6iVRa1ms22q72nYn4iL", + "dnjXVAWJv6Gt58oNTtHD63Z77uVkRfAHos", + "qckoWihwox9rv33CE7e54dgWLaDY4itqrf", + "2D2dkjUMVgiR4yU75WvedcKvQSmwCj6W6qk", + "2BvfGqZYwyFaXE1nvzsJ7Pei25x7v4d41yR", + "wzxU9YGrkjLFuX72F2YdbsRm1NFR5D5CMF", + "2YbDyeXPvC4bHMVczmgQbvY6gJUYpxVRkB3", + "dFVDtdMt6R8ZyALFiAvBKTTCqKBsU7E3DF", + "2fuX8DA98usnxbChNFLQV4iLE5upuWup6W3", + "j2YAkSPuE3pRw5jEwozATxZGPdYcETedj", + "wsBi211Y5PXahQaxrwKU3P49ZhQbubeZVj", + "2Bh7Dh4JsMR5wNttAiFtfoK8oBcbGLt8nDg", + "21cxcry6r3Y8UU4dfQUJ4bNqtgf5LWZNX4b", + "iU9oD7yPQPzxdacx1GCuaypoyUDDVUe4rN", + "2JgLq6FqPbKiQgM8u5JpgcgiQzn19psNfgn", + "2aSVoqpBng4KFqKQtsQVyCCf5zKqH7dWHEY", + "22Wi1Fno3wNCDFnZfQjDNoEbS9TDpNNq78H", + "Mhvb5fHdboaap923fJxtGXxZEojtY9VNU4", + "Pe6tpFpqsEu4m2o3FkDmDpHU6w2dCB71fk", + "2f28YxxZCAGkVxkr6DVRWxTvVzKue8HPnSk", + "nqAJNrLP96e1WJofgHQJrtSA9gTpM5L86v", + "2XD7UGAGJupLTuk1Yj22iQ5CwBEdykMBsP7", + "LKa5BryDBB7ug2dZhrncoS8dz2cUv5K4Rb", + "N7RTfu8LMhDEQS3eSeJjQzBuHU4Yj3rLwd", + "nr7MwYTRWKKB8WFshUmfsDkQrjrax2H4y7", + "2QocRUM19a8LVT7CnjoR6HJWXntXDJsmmDF", + "58FY3KLFKkEBAWna8nH2oquov9rCyY5QJ2", + "2MR1MzzQzfD4AUCoXurnjdwxwhgh2mkcSwj", + "7uHb3zmZTmSQeSz1HARZgZoDErWuDhhXBA", + "icXsPHrk6NcLhUQAyMxZTFRegNLqbkajkp", + "XnsKrf9qkQnZAD2usiUvF8aKCXhVb5Da7d", + "oEBRgWgDt2GcfBCcWMEpJ8RBctd9yFuGAg", + "24RGKPsnsQCiVkes14R1RdDEhscy7meGA1f", + "2hyLKdVomKv2Tko8hEeQMkDn8HqaeauThcw", + "2GMUDBMXe6hepJV7uefZwGYiB4invamLZ87", + "2NSk3tJpFCuGybSR3bNngirXUeykPfVHr6e", + "TtBZd52cZhhjdJ7t5QXUnPXo3eYkQVuUuR", + "4rkTmJ82Db8tMxb2yZQtAboVnUUUBaBy6k", + "rqdH4MwHbFHUVUc2692jXtdXZqcAhxjmkh", + "2Ra18ScFZ1wdv2gTq589fQoYDfCJR74k7HR", + "JQz5ohVZEt8tZXTsPdMJE4Cpgb6WdcH9um", + "Ckdc3PiH32snnm1PFMwcjjEbLn49evTU7Z", + "o69vXRUxV8aX8w3FDauDjeVd6RcDcaxV51", + "2j4DCNfztT2cBPBdFEaf1Unk2HjYRA7o3bs", + "24Y8B4NsqZo9PH5GSeFqWwRaKDcwSpRwX3Z", + "htTbpfjWK8gm2wmpy4FRnLPSTpe9BeAVHH", + "SqGxx6t6iqn8AZsf14mUBmtUT11A6Zq7tZ", + "2QBb8ikJsYv3WdrFHjTPNF4PuLgwkSgqvPf", + "2Qb4D16HgVzNndycVjZXRrQyYzdEe5f1kEt", + "WqEbGKqH94Xtkzjh7pGWAK5v3UfspRUpfg", + "5aGZPV7q3vowUbhS1VAhTCXtouYc4o4srj", + "2SgENwkuMyKh2s3wdufjWg3JW3sCSjwFaRr", + "2W3k2kdexCsayjWpP9wnK7JF2Khw61nvhGa", + "4KYYn3BErgD5eswHs3rsEQZZWpsVYkXHUX", + "mY1ZbgmxqvP1JFqdq4YzC31SQNd8oTGw2c", + "qC6deJVWhZqKPbRYW7JXeiUNf8RjrAZsD", + "2YKjavRXaqwzauLALMV3vECrtjBJXVd2CRX", + "2A3uXa8GWNomPRJmt1KspWpTuYgUJbySkwx", + "2XJe7KXzxUoHXYdAnhkvDTr1EJU1xqhP85Q", + "NfaqAXcAAri6fjf6PMZGMugwiwiYHY1Q7z", + "2T6Qhq7uWCx1YguXya7weFtgtChhaV29bEF", + "22xPFCd49usGrtNyAbcsmQtyCDSUd9f7N2U", + "pPsLH84x8r8ZJat1M6cBMuh1jcTXnq3sLf", + "kyACjo6QicoctHQ7AyRxTCviFzqJKstxBK", + "2TZk4CMbXby81a6hajgeQRQoiL8Kw8YmUuw", + "Ap3j7fzSCDYeLeaqDyRhngsaZbvX7GwyRs", + "UvDfq7gGsCxVwcDGag3kjjT5g5AQht3J32", + "xKZWXzMkoHLyGYRhVpRtAmbJU9qNqHiFp", + "KfUZUpLCAoASRtSgeFqeieYBGFBNLTQJFV", + "2eit8zm9DPNrnhoHy7zs8Koz6Jg2TpS7sLu", + "2cJEWMdNjZaTWttc3yqsNkTaMyQcqYSinyu", + "BQJRWm6W9zFXMKaqAR8Su1TWXNvyN8PRVb", + "dPpQ91cFJJHGLCnK73re86f3dZcvUbsptA", + "2Tn7ndbNiTtAdcRYv9YdVYQKm9wzSe9BjP5", + "dzTmuPoa7uiwtZjTmyu79f4UgniD9mFsVR", + "229kyj2TCuMjjojymiTe26qxguA1BkZwSoZ", + "2bcZkbEbtUSe6J18F2JXh3uCJ7sVNg2UmVR", + "2fu9DukFeEyfGVkAfb8iWBFy2mDghVQUcj7", + "2fxkpW9HxwHU1bC6z3dzHTb6gEWzoy8Xs9L", + "2VvuBQEJBCTFRgJdHWUxgLonqC4QpnsfDaf", + "24vAY9PQ7Qi2R8WyS8PNqPoE3ao9GoHPRZb", + "qkv9hF4p4pBTtx9d9gZsE1umdV62auJw51", + "nqZxyANHHZRGfMCX1piVVTxNpyqefaKDYK", + "yXWPxHDZ9H692aXryEcCzmvj1fq9m9QEe9", + "5eryPdnvguPh6RMt7L9ipmiheNqNfDKgFE", + "235epnEHmGYLDUKt9VkUmtJZhd3WMYUEpNB", + "21MiQWFa8aPHmFD8g2SK9b6V3in6rPmk9ss", + "sGKq1txePv5iQRe5rnPLVTTKttCs3zjmDz", + "2LvUuM9G6TamL9RuVxvyvGVqjwHiiYBRotZ", + "2jZGHc1LKCie4agCG71cZYe8Kq5611fLfAL", + "21YArvzZEMNxN76H7S2bbdUDA7ZXAXoeGqr", + "sEDoamsSRKqRZtGf6G1GdXh7vR58UvzKgC", + "2bWPKVnhPpAM7gn1QUoyJNwwSvqBNMh7GFm", + "2juNZeS8hvQWVtgBtAkdyJh9oZgmaR4u4LA", + "2jEMQeDGuNs9Cjjbwnd6zfX9j5Cgk78qZQz", + "2aZLbTLJNvHN1KLS6bfedEYqqLk1NedrqQR", + "TexLgwbxQtVkZreqfd8ts7MgZXAxsKhqwa", + "fQ71HRkSJasCCMVJmAevQa5fpanCuoegUh", + "EQLWYk8bzDzVpXGHeAbs1EkS1bxDyStqJq", + "rHimzsNiYrjTDi2eyAmMVE9BKBNqwBzv3X", + "2cieRLhQMY6636tbZnwfsu2B9pxjJieh6u2", + "21MbG627zkijtP9EfWvdqPytiP7E8gZs4e1", + "2PuYo6dYwkNKUSPEPi7NU1Q4Jseg3sPYc7k", + "2jY2JbZJWzW5cF5uPnS1k1CXgQf1s8dkbdt", + "2RH3mjLtsqkiCAg6cauiuFaxkvosTBq51WM", + "Lm72QmciFF3gvn3XttqFPQroPiaC2j4qnQ", + "2XEMsTyFd5DLA4MHaY67YLpxKUxMeRTmCKG", + "4AM2uaS51GhjomXqtDkQtovc1jS7iMRETG", + "JMpqpGE2eykKCWishNiCXXaN4agU5zpw2C", + "2SjQ63GgZaMy5ChNipekx9nC6B61Z6zyhE7", + "xZryS9tNPZDcdZMFgtdGEWbzvrURYMHgqH", + "W7GgbZWJLV4z1mWxyuYGBZabgPCfvRcVAP", + "Sqsyw19LsXHw7jkTHEANmc9sepQoNFitCo", + "2jPE5oFdGbWtwgmZxTt6uhDyHVeod3yphN6", + "6pUf4J3qUcQcRQ6Zpm4FD2XiYksWhNLVS6", + "PT2XJ2hzoEMEMNrBoy1Cy3Kp5nxyqygkh5", + "96NQ8YvrHTU9y41iUYMqM1Epk6JwwQcmJu", + "2RL2yhBwN5WreMkchJrn2vDDWJHQcRtEaFt", + "2gNoXa9m67NoaTy6eZ4GMpBmvdcQ9nriUop", + "G3n5VmgdwuwX8yk9cWpPEp3FHKEey5YmHa", + "kfaNrSPWjRAepn7QWtdEMABi96MsihhFnS", + "EHUQJ6c2wsSbAKB6ZcxVLWVf8Q3sgNUx3E", + "84wW1qSfVA5g8T2CiNTdxJ4JqfevRghgpU", + "2LTs4BuSTWjHivxPuUP41w2PA71u46dCz2p", + "ErnM32JwBMDYJSKNRM9Y8JtWoYFZ6LnnhY", + "5Tw8R7YdSBTTVj6xhQNi9GZ1g7MR97inE9", + "2RDKpGhkpsPfnjE63BdfhrBvkxLuSipQR2m", + "2LAtjkk4wS1npFGEdcTpjgtNBmSS6u6ArUo", + "5bRNsJqBiF5gvC5nQnqZ74nvcKtDCwtPGU", + "j6SatM2gF3R2PQVMA6PUPu4D3ZbKQJCg57", + "2iA7RoAcMhrtfJvmqM9azcmYYrJXXXGpxd8", + "27QyjoaHdbBYqUTXYYB1eFbUL66SxYpSs2u", + "u4yJk7eP9oPA3GYRaHwurA7LMsjVx4sBuK", + "fBnytDvmJgRrVJfuUDmzKoy1NoQ3m8SKQz", + "2FAS9ewd3wfjAyNhYuXasdx4udC37mcuhCZ", + "6u1DL9SoPYKGp2ighH5rEgam1F2QRumj2T", + "2ZVj2H1qdvZuBymu6oxR16y3uAfas5AiVUq", + "2WhMD7E3AKesy4nUMMEp2CTrmE9VPukdyAs", + "227F4gBrr8fjR9cG4MAjnLb8bvoXTRe3ZWU", + "2mft21a6b9xMdXAAURPSoQNaLCsmPc5hqZg", + "pyyySNdtVfDm8gv2TNhhrEgdNZgmMat5bL", + "6MfnPVFmhXFJKpFgqgjKpfTBGCaZ2ZT42T", + "jNQSAN3UfGdfTECx4ZZvLTYGhEX7ZyxsJD", + "2g4apJrWacF6mwKUnvzt5QQV9W2Hmb5NknG", + "2MrL5PtWHqhsnh2oRnfLp3db7eCQTFUitD2", + "92dAsJKwHqGbprAT9EMXjFc373KpotysZn", + "2AwGo5UKYbKnwSg3B5aRzrEqNW7weUpYver", + "8ieRD9NwcKpxMYz6c7kQZ9Zke33cbzHaew", + "21zAWa4MmzNW1oCaDdpCo5PQDgXNiiAswD", + "6cJBYvqCfzaegYugFKbLgyHrrfYKo1X5Xr", + "ZGDXhCBa4BguMuqMfimsYXThgY3aQU85oR", + "23DeMFwzFJdBNhvQEzSKpcJMtbdQ3SbuSq9", + "SLzPyGEMg5U7piPRjVrvpTqUP8w2zaYNQM", + "2fzxDPhzcLVNf4ZccVuAHqMxYBEP4km6mr", + "FUqsNrZpKCY8uXL1yvUhycbXuDoWmdG5ZX", + "YL7KAnjsBPQHobWAZzPq3E9MSzviErY6RA", + "YxMo7jCkihzzMR3KMPmWkHhK5464B2B6tC", + } + + for _, a := range testAddr { + t.Run(a, func(t *testing.T) { + testEncodeDecode(t, a) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/base58fuzz.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/base58fuzz.go new file mode 100644 index 00000000..70fa5f77 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/base58fuzz.go @@ -0,0 +1,62 @@ +package base58fuzz + +import ( + "bytes" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +// To use the fuzzer: +// Follow the install instructions from https://github.com/dvyukov/go-fuzz +// Then, from the repo root, +// $ go-fuzz-build github.com/SkycoinProject/skycoin/src/cipher/base58/internal +// This creates a file base58fuzz-fuzz.zip +// Then, +// $ go-fuzz -bin=base58fuzz-fuzz.zip -workdir=src/cipher/base58/internal +// New corpus and crash objects will be put in src/cipher/base58/internal + +// Fuzz is the entrypoint for go-fuzz +func Fuzz(b []byte) int { + decodeErr := encodeDecode(b) + encodeErr := decodeEncode(b) + + if decodeErr == nil || encodeErr == nil { + return 1 + } + + return 0 +} + +func decodeEncode(b []byte) error { + x, err := base58.Decode(string(b)) + if err != nil { + if x != nil { + panic("x != nil on error number 2") + } + } else { + s := base58.Encode(x) + + if s != string(b) { + panic("encoded strings are not equal") + } + } + + return err +} + +func encodeDecode(b []byte) error { + s := base58.Encode(b) + + x, err := base58.Decode(s) + if err != nil { + if x != nil { + panic("x != nil on error") + } + } else { + if !bytes.Equal(b, x) { + panic("decoded bytes are not equal") + } + } + + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111bad b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111bad new file mode 100644 index 00000000..89f55c21 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111bad @@ -0,0 +1 @@ +1111~ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111x b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111x new file mode 100644 index 00000000..7e275eb6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111x @@ -0,0 +1 @@ +1111x diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/29e2dcfbb16f63bb0254df7585a15bb6fb5e927d-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/29e2dcfbb16f63bb0254df7585a15bb6fb5e927d-2 new file mode 100644 index 00000000..4227ca4e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/29e2dcfbb16f63bb0254df7585a15bb6fb5e927d-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f-2 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/63cc529d9461baca5d2c91e0324ca72f5cb1aed7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/63cc529d9461baca5d2c91e0324ca72f5cb1aed7 new file mode 100644 index 00000000..f19fc8b1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/63cc529d9461baca5d2c91e0324ca72f5cb1aed7 @@ -0,0 +1,26 @@ +h_U_cLjkQkiYTG_0KGGN_G___2y__6___lzph_QC8__e5Ubb__j_zAZW809_-1547645227.04710714. +-40e58665688-b87_q060.-0510149274920729751111 +/0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832)0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198* +}0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198 +-7411872254212360590982.-6477118781916455-3_x_oT_iX__pI--0xfEe-5529h_U_cLjkQkiYTG_0KGGN_G___2y__6___lzph_QC8__e5Ubb__j_zAZW809_?0xdF76eCFe-04543351643.- +-0xaA7F2DfD73e7035-ycXY_2HT_4u9_3DSr8_79_F41_r_5x88xSQ__4G4__uh2I_a244PAeR_OU3_0G_c1_Rn___f_kB.-07.-0xbcb15DE4BdBf10B1D3f6cA +/0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832&0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198 +-006.-0126566107155424362540334--0x69B15a9bf58bBcfd8C9dfA21CeCfFbCe-49766235370341764003880900701-8B_83t4cZ.79722470717.7 +-006.-0126566107155424362540334- --0xfEe-5529-22n7s__l2__3Yt24_n.-067 +973342690560.-033315306155657-0xF43e0xd5C-70-8KpqE.0xf96EDffe3De6EBbAedaadFebE5Ca4De.-024731004146461.-0xaFc2A9CaBB77Da0EC42Ec0cE7D61d +02413.99738449662581951489162355177-0xF43e0xd5CrRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp60f_wjhe_g_78O_B_t_M_lF_hN59__9--06413567043453004025375136.-0726--.0xd9386 +0xe5fe-00.-E__nu2G_DpB_iqH__b_a__0ldOo40z87bLW_Wt_Kj___qk48s_bpD_p_5L5y_2E_d__1_pMX0_nHA_95Ji4_Yt2J-0544.-0xf6a62aD04t.-0511732120653234107227532274473555373747.-6114476950521989-0xfAD3f7Fcbee8c5F79Aea2bbdEC2Be29bc9B2e-0x66B5f1b +0532764.-0xB46cCE5fA06e062c.0x7BC9D78b6Bd35c8EacFFfec9cwJ4a49A_eFT1_VUlzfr6__K5J8__a9j6N7_P_IP5P_7yX_____z____805440xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-0xf6a62aD-.0660346107762416e-0405201517 +-531079164626289269122874709106613365093_t_An_Q__809_2__c3EtW60bYo_qd7IQTN___Z6371_CduR__-0136.-7541495148-03333030442064660713611034e-0xcf450xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980x3Fe0x4d06135571321300035.-65762-0724.032520566567 +-066.070QE-0xEd-006.-0126566107155424362540334--0xAe09-5529-22n7s__l2__3Yt24_n.0xa5.0x2eBA5dDEADfc^0x2cEaDd1a0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198"bS70QCM2___8n_VFvfx.116902415149383881445049750374663834--0xD3de0xaCc578118448500e-07170xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980035731632473632074163523342667103253e +-239518260546888e-0x7dEa9bebea-A0xfF.037171326036317302-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x0CCCAadd7ab7e0x9-0176323111240613221322102216402611110660.835591737428 +066T7xNq_Y56bj_3K5p1rX_f9-04177052174.-17010190548677gL\037.0110205 +2678.-004-0xF43e0xd5C-70-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-00565567031731e-0xeA6Ff4b0abA +02413.99738449662581951489162355177-0xF43e0xd5CrRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp60f_wjhe_g_78O_B_t_M_lF_hN59__9--3574278248121-Grj0y.0xbbE64EBAaAFa1ebEDf832e-071507355270540660341000120303 +-070xF43e0xd5C22615989569092723004268082692631328470446.06604t.-0060422115.0xAbCc67068131293555.0x010 +--.-0641542152157751106534234666315-0xBBBd1fA5B9d9DA8c0eF4f5-- +0063101735516635143766111.0x7BC9D78b6Bd35c8EacFFfec9cwJ4a49A_eFT1_VUlzfr6__K5J8__a9j6N7_P_IP5P_7yX_____z____805440xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0xA.-0443322224---02122e0552701355250304-577747724149231321899038152296.-045553275121627314 +-531079164626289269122874709106613365093_t_An_Q__809_2__c3EtW60bYo_qd7IQTN___Z6371_CduR__-594941773e-0xFB-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-14668.97131243923-0724.032520566567 +0x53E7.-06723-0QE--0x2a4DAC1EDBe0x6D0dd6DbFfd-21340583824958-0x2f6E663acEaDdaae7e0x2cEaDd1a0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x6c3e9A14FDAc4bBbAB0xDc6Fe23D4ec9Cd2464bbA4808.19591.052502005310236253677310151064230xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980035731632473632074163523342667103253e-053860xAe-01704760226311444217422004 +*-8__o_0tg0_UVB_0xfF.037171326036317302-0xaAd-00404e-330xDA +-0e20xF43e0xd5C0xF43e0xd5C \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7722745105e9e02e8f1aaf17f7b3aac5c56cd805-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7722745105e9e02e8f1aaf17f7b3aac5c56cd805-4 new file mode 100644 index 00000000..ab2c6846 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7722745105e9e02e8f1aaf17f7b3aac5c56cd805-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7f39d13d5e2aa7375797fb77077e6aa12a60ae0a b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7f39d13d5e2aa7375797fb77077e6aa12a60ae0a new file mode 100644 index 00000000..405644f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7f39d13d5e2aa7375797fb77077e6aa12a60ae0a @@ -0,0 +1,4 @@ +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH +ec__x0_A__T6_F1_9Zyg__5Zm0_c_G46___j12U15H6R___4_MpvuUIVzGM_r__Zjzv_Jk10_5_6_YlSJ__Ncfd_8U_1o +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/81b1b384bb7472094196462c7df78a379f7b138d b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/81b1b384bb7472094196462c7df78a379f7b138d new file mode 100644 index 00000000..ac225529 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/81b1b384bb7472094196462c7df78a379f7b138d @@ -0,0 +1 @@ +_t_An_Q__809_2__c3EtW60bYo_qd7IQTN___Z6371_CduR__ \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/82571bcccd0d67578b68076a0a3e5d5613e0d645-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/82571bcccd0d67578b68076a0a3e5d5613e0d645-1 new file mode 100644 index 00000000..3e255c63 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/82571bcccd0d67578b68076a0a3e5d5613e0d645-1 @@ -0,0 +1 @@ +LNmw2BHSH2WBKTdT5KPgQ8ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHS \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8696cf0f4655636cc93c566c1be2dad311da646c-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8696cf0f4655636cc93c566c1be2dad311da646c-7 new file mode 100644 index 00000000..5516e8f9 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8696cf0f4655636cc93c566c1be2dad311da646c-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8c1e6ab4270792c51304ea06f47dc20ce51ba57b-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8c1e6ab4270792c51304ea06f47dc20ce51ba57b-2 new file mode 100644 index 00000000..195ee381 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8c1e6ab4270792c51304ea06f47dc20ce51ba57b-2 @@ -0,0 +1 @@ +È \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8d9f954cc9a4c3ef1840c989f2b71e18873f0589 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8d9f954cc9a4c3ef1840c989f2b71e18873f0589 new file mode 100644 index 00000000..c7b23917 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8d9f954cc9a4c3ef1840c989f2b71e18873f0589 @@ -0,0 +1 @@ +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSHP6160f7w2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSHnLt_a2QE diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473-3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473-3 new file mode 100644 index 00000000..593f4708 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473-3 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/930e9a975a3e73d83f90ea559a52017e69bd0a00 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/930e9a975a3e73d83f90ea559a52017e69bd0a00 new file mode 100644 index 00000000..b3d2771a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/930e9a975a3e73d83f90ea559a52017e69bd0a00 @@ -0,0 +1 @@ +-6401412389804551415228303801292635.-066275545551367501325533-0xF43e0xd5C-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-0x2f6E663acEaDdaae7e diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/931613845dd0e72f1b1a5ba0c89f1c34e5cc089d-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/931613845dd0e72f1b1a5ba0c89f1c34e5cc089d-8 new file mode 100644 index 00000000..34886a1c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/931613845dd0e72f1b1a5ba0c89f1c34e5cc089d-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9694c4ebd673a5e2fd26e4b2e64f92e914ebd95f-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9694c4ebd673a5e2fd26e4b2e64f92e914ebd95f-5 new file mode 100644 index 00000000..cb43b5ce Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9694c4ebd673a5e2fd26e4b2e64f92e914ebd95f-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/979280a6ddd4c774e8f1747337ee9a95b0a8a515-3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/979280a6ddd4c774e8f1747337ee9a95b0a8a515-3 new file mode 100644 index 00000000..3214a50e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/979280a6ddd4c774e8f1747337ee9a95b0a8a515-3 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/990f38b139e8a5d4b80012947e7512c6fc32c58b-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/990f38b139e8a5d4b80012947e7512c6fc32c58b-2 new file mode 100644 index 00000000..669587f7 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/990f38b139e8a5d4b80012947e7512c6fc32c58b-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a0b42fa23623c8d15ac8477d74c13d5299ac8461-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a0b42fa23623c8d15ac8477d74c13d5299ac8461-1 new file mode 100644 index 00000000..7e02db91 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a0b42fa23623c8d15ac8477d74c13d5299ac8461-1 @@ -0,0 +1 @@ +8ZxXGpoYtbaJ5UPYnVLNmw2BHS \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a614af7858f3baeec55490a10c3b9e6283838faf b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a614af7858f3baeec55490a10c3b9e6283838faf new file mode 100644 index 00000000..14c8ccd6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a614af7858f3baeec55490a10c3b9e6283838faf @@ -0,0 +1,12 @@ +h_U_cLjkQkiYTG_0KGGN_G___2y__6___lzph_QC8__e5Ubb__j_zAZW809_-1679479854121560.047673640521410216331613771373351.- +-0xaA7F2DfD73e7035-ycXY_2HT_4u9_3DSr8_79_F41_r_5x88xSQ__4G4__uh2I_a244PAeR_OU3_0G_c1_Rn___f_kB.9274920729751111 +/0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198* +-006.-0126566107155424362540334-3_x_oT_iX__pI--0xfEe-5529-22n7s__l2__3Yt24_n.79722470717.7 +2678.-004-0xF43e0xd5C-70-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0xf96EDffe3De6EBbAedaadFebE5Ca4De.-024731004146461.-0xaFc2A9CaBB77Da0EC42Ec0cE7D61d +02413.99738449662581951489162355177-0xF43e0xd5CrRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp60f_wjhe_g_78O_B_t_M_lF_hN59__9--06413567043453004025375136.-0726-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0xbbE64EBAaAFa1ebEDf832e-071507355270540660341000120303 +0016e00047021416122.-070xF43e0xd5C-0544.-0xf6a62aD-04t.-0060422115.0xAbCc-0x2f6E663acEaDdaae7e +0063101735516635143766111.0x7BC9D78b6Bd35c8EacFFfec9cwJ4a49A_eFT1_VUlzfr6__K5J8__a9j6N7_P_IP5P_7yX_____z____805440xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-0xf6a62aD--.9274920729751111-577747724149231321899038152296.-045553275121627314 +-531079164626289269122874709106613365093_t_An_Q__809_2__c3EtW60bYo_qd7IQTN___Z6371_CduR__-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-274-0724.032520566567 +-066.07-0QE--0x0e-21340583824958-0x2cEaDd1a0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x6c3e9A14FDAc4bBbAB0xDc6Fe23D4ec9Cd2464bbA4808.-0xbA9b2FDE9abCeA0-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980035731632473632074163523342667103253e-05386-0xaAd +-05425.-2-___0xfF.037171326036317302-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-07771-0x2f6E663acEaDdaae7e +-6401412389804551415228303801292635.-0662755455513675013255330xF43e0xd5C-050101147315 \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a770e927c71c77a0a9ba32e12cd7eae07148f0e7-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a770e927c71c77a0a9ba32e12cd7eae07148f0e7-6 new file mode 100644 index 00000000..bd6ceca6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a770e927c71c77a0a9ba32e12cd7eae07148f0e7-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/abcd b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/abcd new file mode 100644 index 00000000..acbe86c7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/abcd @@ -0,0 +1 @@ +abcd diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/b6589fc6ab0dc82cf12099d1c2d40ab994e8410c b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/b6589fc6ab0dc82cf12099d1c2d40ab994e8410c new file mode 100644 index 00000000..c2270834 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/b6589fc6ab0dc82cf12099d1c2d40ab994e8410c @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/bfcb34f317e08e8d0b3d10c2e03c3704cb99242d b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/bfcb34f317e08e8d0b3d10c2e03c3704cb99242d new file mode 100644 index 00000000..ddf99bd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/bfcb34f317e08e8d0b3d10c2e03c3704cb99242d @@ -0,0 +1 @@ +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHS \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d5aa874081d093c9ba2af462799ba66d98033b8c b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d5aa874081d093c9ba2af462799ba66d98033b8c new file mode 100644 index 00000000..b4e14256 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d5aa874081d093c9ba2af462799ba66d98033b8c @@ -0,0 +1,3 @@ +rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6 +rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6 +rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6 diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d775adbd66b5eeebfeb273d73655a908fcad5498 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d775adbd66b5eeebfeb273d73655a908fcad5498 new file mode 100644 index 00000000..65c31d3a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d775adbd66b5eeebfeb273d73655a908fcad5498 @@ -0,0 +1,5 @@ +0f_wjhe_g_78O_B_t_M_lF_hN59__9-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-0041650170332e-244041227875243-0x2f6E663acEaDdaae7e +0xee7BBbf2DA412fF7bF4FC8B6E580c2d.-070xF43e0xd5C-0544.-0xf6a62aD-04t.-0060422115.0xAbCc-0x2f6E663acEaDdaae7e +-6401412389804551415228303801292635.-066275545551367501325533-wJ4a49A_eFT1_VUlzfr6__K5J8__a9j6N7_P_IP5P_7yX_____z____80544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-0x2f6E663acEaDdaae7e +-0670xF43e0xd5C-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-0xfdc1.0167425-0724.032520566567 +-0xD30ca73-0QE-0xDC80eFCf1f3b299e-0x2cEaDd1a0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x6c3e9A14FDAc4bBbAB0xDc6Fe23D4ec9Cd2464bbA \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709-1 new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da6ce8d669450d7c33af7d22a55b97e3b7123734-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da6ce8d669450d7c33af7d22a55b97e3b7123734-1 new file mode 100644 index 00000000..8dce517d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da6ce8d669450d7c33af7d22a55b97e3b7123734-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/e93a7ad811a68a06a65b11f91bd7266fb29a9f79 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/e93a7ad811a68a06a65b11f91bd7266fb29a9f79 new file mode 100644 index 00000000..d9ccde48 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/e93a7ad811a68a06a65b11f91bd7266fb29a9f79 @@ -0,0 +1 @@ +ec__x0_A__T6_F1_9Zyg__5Zm0_c_G46___j12U15H6R___4_MpvuUIVzGM_r__Zjzv_Jk10_5_6_YlSJ__Ncfd_8U_1o diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/ec541f6dcf03854cc36fb729db91fb04e6421ea0-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/ec541f6dcf03854cc36fb729db91fb04e6421ea0-2 new file mode 100644 index 00000000..f219ddff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/ec541f6dcf03854cc36fb729db91fb04e6421ea0-2 @@ -0,0 +1 @@ +51 \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/empty b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/empty new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f061cd9b3021c1d204229980a55e56546bf1978b b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f061cd9b3021c1d204229980a55e56546bf1978b new file mode 100644 index 00000000..a22b940a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f061cd9b3021c1d204229980a55e56546bf1978b @@ -0,0 +1,9 @@ +5160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-803523175500423 +-6401412389804551415228303801292635.-06627554555136750132553332M_3LSTwZ8to_Z87l_ +-0xaA7F2DfD73e7035-93___x___6P3Or9N81_1____n__285_nJ25WTRQ_vexQWdN14S__9.9274920729751111 +-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198* +-6401412389804551415228303801292635.-066275545551367501325533-3_x_oT_iX__pI-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x4 +-6401412389804551415228303801292635.-066275545551367501325533-0xF43e0xd5C--70-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0xf96EDffe3De6EBbAedaadFebE5Ca4De.-024731004146461.-0xaFc2A9CaBB77Da0EC42Ec0cE7D61d +-33.00-0xF43e0xd5CrRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6-04664647530616632576752600-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-0xaAd +073-0xF43e0xd5C0xfF.037171326036317302-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-07771-0x2f6E663acEaDdaae7e +-6401412389804551415228303801292635.-0662755455513675013255330xF43e0xd5C-050101147315107e0x3AD3A__7G3_f_d_4U__71A2G8nLQK5v1bBda_2Z_WZzkuW_R_pY0oXq165_m0h4C59eU433Zjv \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f62410abfef601b7470b42124a59aa0d0ec3a673-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f62410abfef601b7470b42124a59aa0d0ec3a673-1 new file mode 100644 index 00000000..b80aa6fc Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f62410abfef601b7470b42124a59aa0d0ec3a673-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test1 new file mode 100644 index 00000000..5f2f16bf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test1 @@ -0,0 +1 @@ +1111 diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test2 new file mode 100644 index 00000000..58073b33 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test2 @@ -0,0 +1 @@ +rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6 diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test3 new file mode 100644 index 00000000..71e7af17 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test3 @@ -0,0 +1 @@ +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/LICENSE b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/LICENSE new file mode 100644 index 00000000..23d5c3ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2017 Tyler Smith +Copyright (c) 2019 Skycoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/README.md new file mode 100644 index 00000000..e113c426 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/README.md @@ -0,0 +1,102 @@ +# go-bip32 + +An implementation of the BIP32 spec for Hierarchical Deterministic Bitcoin addresses as a simple Go library. The semantics of derived keys are up to the user. +[BIP43](https://github.com/bitcoin/bips/blob/master/bip-0043.mediawiki) and [BIP44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) are good schemes to implement with this library. +An additional library for either or both of those on top of this library should be developed. + +Modified for use in Skycoin, derived from https://github.com/tyler-smith/go-bip32 + +## Example + +It's very unlikely, but possible, that a given index does not produce a valid +private key. Error checking is skipped in this example for brevity but should be +handled in real code. In such a case, an error of type `Error` is returned and it's +method `ImpossibleChild()` will return true. + +An example for handling this: + +```go +func tryNewPrivateKeyFromPath() (*bip32.PrivateKey, error) { + k, err := bip32.NewPrivateKeyFromPath([]byte("abc123"), "m/1'/1'/0/1") + if err != nil { + if bip32.IsImpossibleChildError(err) { + fmt.Println("Child number 1 generated an invalid key, use the next child number") + } + return err + } + + return k, nil +} +``` + +Any valid private key will have a valid public key so that `PrivateKey.PublicKey()` +method never returns an error. + +```go +package main + +import ( + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "fmt" + "log" +) + +// Example address creation for a fictitious company ComputerVoice Inc. where +// each department has their own wallet to manage +func main(){ + // Generate a mnemonic to determine all keys from. Don't lose it. + mnemonic := bip39.MustNewDefaultMnemonic() + + // Derivce a seed from the mnemonic + seed, err := bip39.NewSeed(mnemonic, "") + if err != nil { + log.Fatalln("Error generating seed:", err) + } + + // Create master private key from seed + computerVoiceMasterKey, err := bip32.NewMasterKey(seed) + if err != nil { + log.Fatalln("NewMasterKey failed:", err) + } + + // Map departments to keys + // There is a very small chance a given child index is invalid (less than 1 in 2^127) + // If so your real program should handle this by skipping the index + departmentKeys := map[string]*bip32.Key{} + departmentKeys["Sales"], err = computerVoiceMasterKey.NewChildKey(0) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + departmentKeys["Marketing"], err = computerVoiceMasterKey.NewChildKey(1) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + departmentKeys["Engineering"], err = computerVoiceMasterKey.NewChildKey(2) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + departmentKeys["Customer Support"], err = computerVoiceMasterKey.NewChildKey(3) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + + // Create public keys for record keeping, auditors, payroll, etc + departmentAuditKeys := map[string]*bip32.Key{} + departmentAuditKeys["Sales"] = departmentKeys["Sales"].PublicKey() + departmentAuditKeys["Marketing"] = departmentKeys["Marketing"].PublicKey() + departmentAuditKeys["Engineering"] = departmentKeys["Engineering"].PublicKey() + departmentAuditKeys["Customer Support"] = departmentKeys["Customer Support"].PublicKey() + + // Print public keys + for department, pubKey := range departmentAuditKeys { + fmt.Println(department, pubKey) + } +} +``` + +## Thanks + +The developers at [Factom](https://www.factom.com/) have contributed a lot to this library and have made many great improvements to it. Please check out their project(s) and give them a thanks if you use this library. + +Thanks to [bartekn](https://github.com/bartekn) from Stellar for some important bug catches. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32.go new file mode 100644 index 00000000..0d9a04d7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32.go @@ -0,0 +1,632 @@ +/* +Package bip32 implements the bip32 spec https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki +*/ +package bip32 + +import ( + "bytes" + "crypto/hmac" + "crypto/sha512" + "encoding/binary" + "errors" + "fmt" + "log" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +const ( + // FirstHardenedChild is the index of the firxt "hardened" child key as per the + // bip32 spec + FirstHardenedChild = uint32(0x80000000) + + // masterKey is the "Key" value specified by bip32 for the master key + masterKey = "Bitcoin seed" +) + +// Error wraps bip32 errors +type Error struct { + error + impossibleChild bool +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + log.Panic("NewError called with nil error") + } + return Error{ + error: err, + } +} + +// ImpossibleChild returns true if this error indicates +// that a given child number cannot produce a valid key. +// If the caller receives this error, they should skip this child and go to the next number. +// The probability of this happening is less than 1 in 2^127. +func (err Error) ImpossibleChild() bool { + return err.impossibleChild +} + +// NewImpossibleChildError creates an Error flagged as an ImpossibleChild error +func NewImpossibleChildError(err error, childNumber uint32) error { + if err == nil { + log.Panic("NewImpossibleChildError called with nil error") + } + return Error{ + error: fmt.Errorf("childNumber=%d %v", childNumber, err), + impossibleChild: true, + } +} + +// IsImpossibleChildError returns true if the error is an ImpossibleChild Error +func IsImpossibleChildError(err error) bool { + if err == nil { + return false + } + + switch t := err.(type) { + case Error: + return t.ImpossibleChild() + default: + return false + } +} + +var ( + // PrivateWalletVersion is the version flag for serialized private keys ("xpriv") + PrivateWalletVersion = []byte{0x04, 0x88, 0xAD, 0xE4} + + // PublicWalletVersion is the version flag for serialized public keys ("xpub") + PublicWalletVersion = []byte{0x04, 0x88, 0xB2, 0x1E} + + // ErrSerializedKeyWrongSize is returned when trying to deserialize a key that + // has an incorrect length + ErrSerializedKeyWrongSize = NewError(errors.New("Serialized keys should be exactly 82 bytes")) + + // ErrHardenedChildPublicKey is returned when trying to create a harded child + // of the public key + ErrHardenedChildPublicKey = NewError(errors.New("Can't create hardened child for public key")) + + // ErrInvalidChecksum is returned when deserializing a key with an incorrect checksum + ErrInvalidChecksum = NewError(errors.New("Checksum doesn't match")) + + // ErrDerivedInvalidPrivateKey is returned when an invalid private key was derived + ErrDerivedInvalidPrivateKey = NewError(errors.New("Derived invalid private key")) + + // ErrDerivedInvalidPublicKey is returned when an invalid public key was derived + ErrDerivedInvalidPublicKey = NewError(errors.New("Derived invalid public key")) + + // ErrInvalidPrivateKeyVersion is returned when a deserializing a private key without the 'xprv' prefix + ErrInvalidPrivateKeyVersion = NewError(errors.New("Invalid private key version")) + + // ErrInvalidPublicKeyVersion is returned when a deserializing a public key without the 'xpub' prefix + ErrInvalidPublicKeyVersion = NewError(errors.New("Invalid public key version")) + + // ErrInvalidSeedLength is returned when generating a master key with an invalid number of seed bits + ErrInvalidSeedLength = NewError(errors.New("Invalid master key seed length")) + + // ErrDeserializePrivateFromPublic attempted to deserialize a private key from an encoded public key + ErrDeserializePrivateFromPublic = NewError(errors.New("Cannot deserialize a private key from a public key")) + + // ErrInvalidKeyVersion is returned if the key version is not 'xpub' or 'xprv' + ErrInvalidKeyVersion = NewError(errors.New("Invalid key version")) + + // ErrInvalidFingerprint is returned if a deserialized key has an invalid fingerprint + ErrInvalidFingerprint = NewError(errors.New("Invalid key fingerprint")) + + // ErrInvalidChildNumber is returned if a deserialized key has an invalid child number + ErrInvalidChildNumber = NewError(errors.New("Invalid key child number")) + + // ErrInvalidPrivateKey is returned if a deserialized xprv key's private key is invalid + ErrInvalidPrivateKey = NewError(errors.New("Invalid private key")) + + // ErrInvalidPublicKey is returned if a deserialized xpub key's public key is invalid + ErrInvalidPublicKey = NewError(errors.New("Invalid public key")) + + // ErrMaxDepthReached maximum allowed depth (255) reached for child key + ErrMaxDepthReached = NewError(errors.New("Maximum child depth reached")) +) + +// key represents a bip32 extended key +type key struct { + Version []byte // 4 bytes + Depth byte // 1 bytes + ParentFingerprint []byte // 4 bytes + childNumber []byte // 4 bytes + ChainCode []byte // 32 bytes + Key []byte // 33 bytes for public keys; 32 bytes for private keys +} + +func (k key) ChildNumber() uint32 { + return binary.BigEndian.Uint32(k.childNumber) +} + +// PrivateKey represents a bip32 extended private key +type PrivateKey struct { + key +} + +// PublicKey represents a bip32 extended public key +type PublicKey struct { + key +} + +// NewMasterKey creates a new master extended key from a seed. +// Seed should be between 128 and 512 bits; 256 bits are recommended. +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#master-key-generation +func NewMasterKey(seed []byte) (*PrivateKey, error) { + if len(seed) < 16 || len(seed) > 64 { + return nil, ErrInvalidSeedLength + } + + return newMasterKey(seed) +} + +func newMasterKey(seed []byte) (*PrivateKey, error) { + // Generate key and chaincode + hmac := hmac.New(sha512.New, []byte(masterKey)) + if _, err := hmac.Write(seed); err != nil { + log.Panic(err) + } + intermediary := hmac.Sum(nil) + + // Split it into our key and chain code + keyBytes := intermediary[:32] + chainCode := intermediary[32:] + + // Validate key + if err := validatePrivateKey(keyBytes); err != nil { + return nil, err + } + + // Create the key struct + key := &PrivateKey{ + key: key{ + Version: PrivateWalletVersion, + ChainCode: chainCode, + Key: keyBytes, + Depth: 0x0, + childNumber: []byte{0x00, 0x00, 0x00, 0x00}, + ParentFingerprint: []byte{0x00, 0x00, 0x00, 0x00}, + }, + } + + return key, nil +} + +// NewPrivateKeyFromPath returns a private key at a given bip32 path. +// The path must be a full path starting with m/, and the initial seed +// must be provided. +// This method can return an ImpossibleChild error. +func NewPrivateKeyFromPath(seed []byte, p string) (*PrivateKey, error) { + path, err := ParsePath(p) + if err != nil { + return nil, err + } + + k, err := NewMasterKey(seed) + if err != nil { + return nil, err + } + + if len(path.Elements) > 1 { + return k.DeriveSubpath(path.Elements[1:]) + } + + return k, nil +} + +// DeriveSubpath derives a PrivateKey at at bip32 subpath, e.g. `0'/1'/0`. +// The nodes argument must not be empty. +// This method can return an ImpossibleChild error. +func (k *PrivateKey) DeriveSubpath(nodes []PathNode) (*PrivateKey, error) { + if len(nodes) == 0 { + return nil, errors.New("Path nodes array empty when deriving a bip32 subpath") + } + + ck, err := k.newPrivateChildKeyFromPathNode(nodes[0]) + if err != nil { + return nil, err + } + + for _, e := range nodes[1:] { + ck, err = ck.newPrivateChildKeyFromPathNode(e) + if err != nil { + return nil, err + } + } + + return ck, nil +} + +func (k *PrivateKey) newPrivateChildKeyFromPathNode(n PathNode) (*PrivateKey, error) { + if n.Master { + return nil, errors.New("PathNode is Master at a non-zero depth") + } + + return k.NewPrivateChildKey(n.ChildNumber) +} + +// PublicKey returns the public version of key or return a copy +// The 'Neuter' function from the bip32 spec, N((k, c) -> (K, c). +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#private-parent-key--public-child-key +func (k *PrivateKey) PublicKey() *PublicKey { + pubKey, err := publicKeyForPrivateKey(k.Key) + if err != nil { + log.Panicf("PrivateKey.PublicKey failed: %v", err) + } + return &PublicKey{ + key: key{ + Version: PublicWalletVersion, + Key: pubKey, + Depth: k.Depth, + childNumber: k.childNumber, + ChainCode: k.ChainCode, + ParentFingerprint: k.ParentFingerprint, + }, + } +} + +// Fingerprint returns the key fingerprint +func (k *PrivateKey) Fingerprint() []byte { + // "Extended keys can be identified by the Hash160 (RIPEMD160 after SHA256) + // of the serialized ECDSA public key K, ignoring the chain code." + return k.PublicKey().Fingerprint() +} + +// Identifier returns the key ID +func (k *PrivateKey) Identifier() []byte { + return k.PublicKey().Identifier() +} + +// Fingerprint returns the key fingerprint +func (k *PublicKey) Fingerprint() []byte { + return fingerprint(k.Key) +} + +// Identifier returns the key ID +func (k *PublicKey) Identifier() []byte { + return identifier(k.Key) +} + +func identifier(key []byte) []byte { + // "Extended keys can be identified by the Hash160 (RIPEMD160 after SHA256) + // of the serialized ECDSA public key K, ignoring the chain code." + + // ripemd160(sha256(key)) + return hash160(key) +} + +func fingerprint(key []byte) []byte { + id := identifier(key) + // "The first 32 bits of the identifier are called the key fingerprint." + return id[:4] +} + +// NewPrivateChildKey derives a private child key from a given parent as outlined by bip32, CDKpriv(). +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#private-parent-key--private-child-key +// This method can return an ImpossibleChild error. +func (k *PrivateKey) NewPrivateChildKey(childIdx uint32) (*PrivateKey, error) { + if k.Depth == 0xFF { + return nil, ErrMaxDepthReached + } + + intermediary := k.ckdPrivHMAC(childIdx) + + iL := intermediary[:32] // used for computing the next key + chainCode := intermediary[32:] // iR + + // ki = parse256(IL) + kpar (mod n) + // In case parse256(IL) ≥ n or ki = 0, the resulting key is invalid + newKey, err := addPrivateKeys(iL, k.Key) + if err != nil { + return nil, NewImpossibleChildError(err, childIdx) + } + + return &PrivateKey{ + key: key{ + Version: PrivateWalletVersion, + childNumber: uint32Bytes(childIdx), + ChainCode: chainCode, + Depth: k.Depth + 1, + Key: newKey, + ParentFingerprint: k.Fingerprint(), + }, + }, nil +} + +// NewPublicChildKey derives a public child key from an extended public key, N(CKDpriv()). +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#private-parent-key--public-child-key +// This method can return an ImpossibleChild error. +func (k *PrivateKey) NewPublicChildKey(childIdx uint32) (*PublicKey, error) { + k2, err := k.NewPrivateChildKey(childIdx) + if err != nil { + return nil, err + } + return k2.PublicKey(), nil +} + +// NewPublicChildKey derives a public child key from an extended public key, CKDpub(). +// Hardened child keys cannot be derived; the value of childIdx must be less than 2^31. +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#public-parent-key--public-child-key +// This method can return an ImpossibleChild error. +func (k *PublicKey) NewPublicChildKey(childIdx uint32) (*PublicKey, error) { + if k.Depth == 0xFF { + return nil, ErrMaxDepthReached + } + + // CKDPub step 1 + intermediary, err := k.ckdPubHMAC(childIdx) + if err != nil { + return nil, err + } + + // CKDPub step 2 + iL := intermediary[:32] // used for computing the next key + + // CKDPub step 3: Ki = point(parse256(IL)) + Kpar + // CKDPub step 5: In case parse256(IL) ≥ n or Ki is the point at infinity, the resulting key is invalid + keyBytes, err := publicKeyForPrivateKey(iL) + if err != nil { + return nil, NewImpossibleChildError(err, childIdx) + } + + // CKDPub step 4 + chainCode := intermediary[32:] // iR + + newKey, err := addPublicKeys(keyBytes[:], k.Key) + if err != nil { + return nil, err + } + + // Create child Key with data common to all both scenarios + return &PublicKey{ + key: key{ + Version: PublicWalletVersion, + childNumber: uint32Bytes(childIdx), + ChainCode: chainCode, + Depth: k.Depth + 1, + Key: newKey, + ParentFingerprint: k.Fingerprint(), + }, + }, nil +} + +// ckdPrivHMAC computes the first step of the CKDPriv function, which computes an HMAC +func (k *key) ckdPrivHMAC(childIdx uint32) []byte { + // Get intermediary to create key and chaincode. + // Hardened children are based on the private key. + // Non-hardened children are based on the public key. + + var data []byte + if childIdx >= FirstHardenedChild { + // Hardened child + // I = HMAC-SHA512(Key = cpar, Data = 0x00 || ser256(kpar) || ser32(i)) + // 0x00 || ser256(kpar) + data = append([]byte{0x0}, k.Key...) + } else { + // Non-hardened child + // I = HMAC-SHA512(Key = cpar, Data = serP(point(kpar)) || ser32(i)) + // The equation below is "convert private key to compressed public key" + // serP(point(kpar)) + var err error + data, err = publicKeyForPrivateKey(k.Key) + if err != nil { + log.Panic(err) + } + } + + // Append the child index as big-endian serialized bytes + // || ser32(i) + childIndexBytes := uint32Bytes(childIdx) + data = append(data, childIndexBytes...) + + // HMAC-SHA512(Key = cpar, Data) + hmac := hmac.New(sha512.New, k.ChainCode) + if _, err := hmac.Write(data); err != nil { + log.Panic(err) + } + + return hmac.Sum(nil) +} + +// ckdPubHMAC computes the first step of the CKDPub function, which computes an HMAC +func (k *key) ckdPubHMAC(childIdx uint32) ([]byte, error) { + // Get intermediary to create key and chaincode. + // Hardened children are based on the private key. + // Non-hardened children are based on the public key. + + if childIdx >= FirstHardenedChild { + // Public keys can't derive hardened child keys + return nil, ErrHardenedChildPublicKey + } + + // I = HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i)) + + // serP(Kpar) + data := make([]byte, len(k.Key)) + copy(data, k.Key) + + // ser32(i) + childIndexBytes := uint32Bytes(childIdx) + + // serP(Kpar) || ser32(i) + data = append(data, childIndexBytes...) + + // HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i)) + hmac := hmac.New(sha512.New, k.ChainCode) + if _, err := hmac.Write(data); err != nil { + log.Panic(err) + } + + return hmac.Sum(nil), nil +} + +// Serialize a Key to a 78 byte byte slice +func (k *PrivateKey) Serialize() []byte { + // Private keys should be prepended with a single null byte + return k.serialize(append([]byte{0x0}, k.Key...)) +} + +// Serialize a Key to a 78 byte byte slice +func (k *PublicKey) Serialize() []byte { + return k.serialize(k.Key) +} + +// serialize a Key to a 78 byte byte slice +func (k *key) serialize(key []byte) []byte { + n := len(k.Version) + n++ // k.Depth + n += len(k.ParentFingerprint) + n += len(k.childNumber) + n += len(k.ChainCode) + n += len(key) + + buffer := &bytes.Buffer{} + buffer.Grow(n) + + // Write fields to buffer in order + buffer.Write(k.Version) + buffer.WriteByte(k.Depth) + buffer.Write(k.ParentFingerprint) + buffer.Write(k.childNumber) + buffer.Write(k.ChainCode) + buffer.Write(key) + + // Append the standard doublesha256 checksum + return addChecksumToBytes(buffer.Bytes()) +} + +// String encodes the Key in the standard Bitcoin base58 encoding +func (k *PrivateKey) String() string { + return base58.Encode(k.Serialize()) +} + +// String encodes the Key in the standard Bitcoin base58 encoding +func (k *PublicKey) String() string { + return base58.Encode(k.Serialize()) +} + +// DeserializeEncodedPrivateKey deserializes a base58 xprv key to a PrivateKey +func DeserializeEncodedPrivateKey(xprv string) (*PrivateKey, error) { + b, err := base58.Decode(xprv) + if err != nil { + return nil, err + } + return DeserializePrivateKey(b) +} + +// DeserializePrivateKey deserializes the []byte serialization of a PrivateKey +func DeserializePrivateKey(data []byte) (*PrivateKey, error) { + k, err := deserialize(data, true) + if err != nil { + return nil, err + } + + if len(k.Key) != 32 { + log.Panic("DeserializePrivateKey expected 32 bytes key length") + } + if !bytes.Equal(k.Version, PrivateWalletVersion) { + log.Panic("DeserializePrivateKey expected xprv prefix") + } + + return &PrivateKey{ + key: *k, + }, nil +} + +// DeserializeEncodedPublicKey deserializes a base58 xpub key to a PublicKey +func DeserializeEncodedPublicKey(xpub string) (*PublicKey, error) { + b, err := base58.Decode(xpub) + if err != nil { + return nil, err + } + return DeserializePublicKey(b) +} + +// DeserializePublicKey deserializes the []byte serialization of a PublicKey +func DeserializePublicKey(data []byte) (*PublicKey, error) { + k, err := deserialize(data, false) + if err != nil { + return nil, err + } + + if len(k.Key) != 33 { + log.Panic("DeserializePublicKey expected 33 bytes key length") + } + if !bytes.Equal(k.Version, PublicWalletVersion) { + log.Panic("DeserializePublicKey expected xpub prefix") + } + + return &PublicKey{ + key: *k, + }, nil +} + +// deserialize a byte slice into a Key. +// If the Key.Key length is 32 bytes it is a private key, otherwise it is a public key. +func deserialize(data []byte, wantPrivate bool) (*key, error) { + if len(data) != 82 { + return nil, ErrSerializedKeyWrongSize + } + + // Validate checksum + cs1 := checksum(data[0 : len(data)-4]) + cs2 := data[len(data)-4:] + if !bytes.Equal(cs1, cs2) { + return nil, ErrInvalidChecksum + } + + k := &key{} + k.Version = data[0:4] + k.Depth = data[4] + k.ParentFingerprint = data[5:9] + k.childNumber = data[9:13] + k.ChainCode = data[13:45] + + isPrivate := bytes.Equal(k.Version, PrivateWalletVersion) + isPublic := bytes.Equal(k.Version, PublicWalletVersion) + + if !isPrivate && !isPublic { + return nil, ErrInvalidKeyVersion + } + + if wantPrivate && !isPrivate { + return nil, ErrInvalidPrivateKeyVersion + } + + if !wantPrivate && !isPublic { + return nil, ErrInvalidPublicKeyVersion + } + + // Master keys (depth=0) have an empty fingerprint and a ChildNumber of 0 + if k.Depth == 0 { + var emptyBytes [4]byte + if !bytes.Equal(k.ParentFingerprint, emptyBytes[:]) { + return nil, ErrInvalidFingerprint + } + + if k.ChildNumber() != 0 { + return nil, ErrInvalidChildNumber + } + } + + // Private keys must have a 0 byte prefix padding + if isPrivate { + if data[45] != 0 { + return nil, ErrInvalidPrivateKey + } + k.Key = data[46:78] + if err := validatePrivateKey(k.Key); err != nil { + return nil, ErrInvalidPrivateKey + } + } else { + k.Key = data[45:78] + if err := validatePublicKey(k.Key); err != nil { + return nil, ErrInvalidPublicKey + } + } + + return k, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32_test.go new file mode 100644 index 00000000..2d2f559e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32_test.go @@ -0,0 +1,1221 @@ +package bip32 + +import ( + "encoding/hex" + "errors" + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +type testMasterKey struct { + seed string + children []testChildKey + privKey string + pubKey string + hexPubKey string + wifPrivKey string + fingerprint string + identifier string + chainCode string + childNumber uint32 + depth byte +} + +type testChildKey struct { + path string + privKey string + pubKey string + fingerprint string + identifier string + chainCode string + hexPubKey string + wifPrivKey string + childNumber uint32 + depth byte +} + +func TestBip32TestVectors(t *testing.T) { + // vector1,2,3 test cases from: + // https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#test-vectors + // https://en.bitcoin.it/wiki/BIP_0032_TestVectors + // Note: the 2nd link lacks the detailed values of test vector 3 + vector1 := testMasterKey{ + seed: "000102030405060708090a0b0c0d0e0f", + privKey: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + pubKey: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + hexPubKey: "0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2", + wifPrivKey: "L52XzL2cMkHxqxBXRyEpnPQZGUs3uKiL3R11XbAdHigRzDozKZeW", + fingerprint: "3442193e", + identifier: "3442193e1bb70916e914552172cd4e2dbc9df811", + chainCode: "873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508", + childNumber: 0, + depth: 0, + children: []testChildKey{ + { + path: "m/0'", + privKey: "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", + pubKey: "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw", + fingerprint: "5c1bd648", + identifier: "5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7", + chainCode: "47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141", + hexPubKey: "035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56", + wifPrivKey: "L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT", + childNumber: 2147483648, + depth: 1, + }, + { + path: "m/0'/1", + privKey: "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs", + pubKey: "xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ", + fingerprint: "bef5a2f9", + identifier: "bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe", + chainCode: "2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19", + hexPubKey: "03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c", + wifPrivKey: "KyFAjQ5rgrKvhXvNMtFB5PCSKUYD1yyPEe3xr3T34TZSUHycXtMM", + childNumber: 1, + depth: 2, + }, + { + path: "m/0'/1/2'", + privKey: "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM", + pubKey: "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5", + fingerprint: "ee7ab90c", + identifier: "ee7ab90cde56a8c0e2bb086ac49748b8db9dce72", + chainCode: "04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f", + hexPubKey: "0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2", + wifPrivKey: "L43t3od1Gh7Lj55Bzjj1xDAgJDcL7YFo2nEcNaMGiyRZS1CidBVU", + childNumber: 2 + FirstHardenedChild, + depth: 3, + }, + { + path: "m/0'/1/2'/2", + privKey: "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", + pubKey: "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV", + fingerprint: "d880d7d8", + identifier: "d880d7d893848509a62d8fb74e32148dac68412f", + chainCode: "cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd", + hexPubKey: "02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29", + wifPrivKey: "KwjQsVuMjbCP2Zmr3VaFaStav7NvevwjvvkqrWd5Qmh1XVnCteBR", + childNumber: 2, + depth: 4, + }, + { + path: "m/0'/1/2'/2/1000000000", + privKey: "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76", + pubKey: "xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy", + fingerprint: "d69aa102", + identifier: "d69aa102255fed74378278c7812701ea641fdf32", + chainCode: "c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e", + hexPubKey: "022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011", + wifPrivKey: "Kybw8izYevo5xMh1TK7aUr7jHFCxXS1zv8p3oqFz3o2zFbhRXHYs", + childNumber: 1000000000, + depth: 5, + }, + }, + } + + vector2 := testMasterKey{ + seed: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + privKey: "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", + pubKey: "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB", + fingerprint: "bd16bee5", + identifier: "bd16bee53961a47d6ad888e29545434a89bdfe95", + chainCode: "60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689", + hexPubKey: "03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7", + wifPrivKey: "KyjXhyHF9wTphBkfpxjL8hkDXDUSbE3tKANT94kXSyh6vn6nKaoy", + children: []testChildKey{ + { + path: "m/0", + privKey: "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt", + pubKey: "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH", + fingerprint: "5a61ff8e", + identifier: "5a61ff8eb7aaca3010db97ebda76121610b78096", + chainCode: "f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c", + hexPubKey: "02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea", + wifPrivKey: "L2ysLrR6KMSAtx7uPqmYpoTeiRzydXBattRXjXz5GDFPrdfPzKbj", + childNumber: 0, + depth: 1, + }, + { + path: "m/0/2147483647'", + privKey: "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9", + pubKey: "xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a", + fingerprint: "d8ab4937", + identifier: "d8ab493736da02f11ed682f88339e720fb0379d1", + chainCode: "be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9", + hexPubKey: "03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b", + wifPrivKey: "L1m5VpbXmMp57P3knskwhoMTLdhAAaXiHvnGLMribbfwzVRpz2Sr", + childNumber: 2147483647 + FirstHardenedChild, + depth: 2, + }, + { + path: "m/0/2147483647'/1", + privKey: "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef", + pubKey: "xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon", + fingerprint: "78412e3a", + identifier: "78412e3a2296a40de124307b6485bd19833e2e34", + chainCode: "f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb", + hexPubKey: "03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9", + wifPrivKey: "KzyzXnznxSv249b4KuNkBwowaN3akiNeEHy5FWoPCJpStZbEKXN2", + childNumber: 1, + depth: 3, + }, + { + path: "m/0/2147483647'/1/2147483646'", + privKey: "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc", + pubKey: "xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL", + fingerprint: "31a507b8", + identifier: "31a507b815593dfc51ffc7245ae7e5aee304246e", + chainCode: "637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29", + hexPubKey: "02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0", + wifPrivKey: "L5KhaMvPYRW1ZoFmRjUtxxPypQ94m6BcDrPhqArhggdaTbbAFJEF", + childNumber: 2147483646 + FirstHardenedChild, + depth: 4, + }, + { + path: "m/0/2147483647'/1/2147483646'/2", + privKey: "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j", + pubKey: "xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt", + fingerprint: "26132fdb", + identifier: "26132fdbe7bf89cbc64cf8dafa3f9f88b8666220", + chainCode: "9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271", + hexPubKey: "024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c", + wifPrivKey: "L3WAYNAZPxx1fr7KCz7GN9nD5qMBnNiqEJNJMU1z9MMaannAt4aK", + childNumber: 2, + depth: 5, + }, + }, + } + + vector3 := testMasterKey{ + seed: "4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be", + privKey: "xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6", + pubKey: "xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13", + fingerprint: "41d63b50", + identifier: "41d63b50d8dd5e730cdf4c79a56fc929a757c548", + chainCode: "01d28a3e53cffa419ec122c968b3259e16b65076495494d97cae10bbfec3c36f", + hexPubKey: "03683af1ba5743bdfc798cf814efeeab2735ec52d95eced528e692b8e34c4e5669", + wifPrivKey: "KwFPqAq9SKx1sPg15Qk56mqkHwrfGPuywtLUxoWPkiTSBoxCs8am", + children: []testChildKey{ + { + path: "m/0'", + privKey: "xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L", + pubKey: "xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y", + fingerprint: "c61368bb", + identifier: "c61368bb50e066acd95bd04a0b23d3837fb75698", + chainCode: "e5fea12a97b927fc9dc3d2cb0d1ea1cf50aa5a1fdc1f933e8906bb38df3377bd", + hexPubKey: "027c3591221e28939e45f8ea297d62c3640ebb09d7058b01d09c963d984a40ad49", + wifPrivKey: "L3z3MSqZtDQ1FPHKi7oWf1nc9rMEGFtZUDCoFa7n4F695g5qZiSu", + childNumber: FirstHardenedChild, + depth: 1, + }, + }, + } + + // Test case copied from: + // https://github.com/bitcoinjs/bip32/blob/master/test/fixtures/index.json + vector4 := testMasterKey{ + seed: "d13de7bd1e54422d1a3b3b699a27fb460de2849e7e66a005c647e8e4a54075cb", + privKey: "xprv9s21ZrQH143K3zWpEJm5QtHFh93eNJrNbNqzqLN5XoE9MvC7gs5TmBFaL2PpaXpDc8FBYVe5EChc73ApjSQ5fWsXS7auHy1MmG6hdpywE1q", + pubKey: "xpub661MyMwAqRbcGUbHLLJ5n2DzFAt8mmaDxbmbdimh68m8EiXGEQPiJya4BJat5yMzy4e68VSUoLGCu5uvzf8dUoGvwuJsLE6F1cibmWsxFNn", + fingerprint: "1a87677b", + identifier: "1a87677be6f73cc9655e8b4c5d2fd0aeeb1b23c7", + chainCode: "c23ab32b36ddff49fae350a1bed8ec6b4d9fc252238dd789b7273ba4416054eb", + hexPubKey: "0298ccc720d5dea817c7077605263bae52bca083cf8888fee77ff4c1b4797ee180", + wifPrivKey: "KwDiCU5bs8xQwsRgxjhkcJcVuR7NE4Mei8X9uSAVviVTE7JmMoS6", + children: []testChildKey{ + { + path: "m/44'/0'/0'/0/0'", + privKey: "xprvA3cqPFaMpr7n1wRh6BPtYfwdYRoKCaPzgDdQnUmgMrz1WxWNEW3EmbBr9ieh9BJAsRGKFPLvotb4p4Aq79jddUVKPVJt7exVzLHcv777JVf", + pubKey: "xpub6GcBnm7FfDg5ERWACCvtuotN6Tdoc37r3SZ1asBHvCWzPkqWn3MVKPWKzy6GsfmdMUGanR3D12dH1cp5tJauuubwc4FAJDn67SH2uUjwAT1", + fingerprint: "e371d69b", + identifier: "e371d69b5dae6eacee832a130ee9f55545275a09", + chainCode: "ca27553aa89617e982e621637d6478f564b32738f8bbe2e48d0a58a8e0f6da40", + hexPubKey: "027c3591221e28939e45f8ea297d62c3640ebb09d7058b01d09c963d984a40ad49", + wifPrivKey: "L3z3MSqZtDQ1FPHKi7oWf1nc9rMEGFtZUDCoFa7n4F695g5qZiSu", + childNumber: FirstHardenedChild, + depth: 5, + }, + }, + } + + vectors := []testMasterKey{ + vector1, + vector2, + vector3, + vector4, + } + + for _, v := range vectors { + t.Run(v.seed, func(t *testing.T) { + testVectorKeyPairs(t, v) + }) + } +} + +func testVectorKeyPairs(t *testing.T, vector testMasterKey) { + // Decode master seed into hex + seed, err := hex.DecodeString(vector.seed) + require.NoError(t, err) + + // Generate a master private and public key + privKey, err := NewMasterKey(seed) + require.NoError(t, err) + + pubKey := privKey.PublicKey() + + require.Equal(t, byte(0), privKey.Depth) + require.Equal(t, byte(0), pubKey.Depth) + + require.Equal(t, uint32(0), privKey.ChildNumber()) + require.Equal(t, uint32(0), pubKey.ChildNumber()) + + require.Equal(t, vector.privKey, privKey.String()) + require.Equal(t, vector.pubKey, pubKey.String()) + + require.Equal(t, vector.hexPubKey, hex.EncodeToString(pubKey.Key)) + + wif := cipher.BitcoinWalletImportFormatFromSeckey(cipher.MustNewSecKey(privKey.Key)) + require.Equal(t, vector.wifPrivKey, wif) + + require.Equal(t, vector.chainCode, hex.EncodeToString(privKey.ChainCode)) + require.Equal(t, vector.chainCode, hex.EncodeToString(pubKey.ChainCode)) + + require.Equal(t, vector.fingerprint, hex.EncodeToString(privKey.Fingerprint())) + require.Equal(t, vector.fingerprint, hex.EncodeToString(pubKey.Fingerprint())) + + require.Equal(t, vector.identifier, hex.EncodeToString(privKey.Identifier())) + require.Equal(t, vector.identifier, hex.EncodeToString(pubKey.Identifier())) + + require.Equal(t, vector.depth, privKey.Depth) + require.Equal(t, vector.depth, pubKey.Depth) + + require.Equal(t, vector.childNumber, privKey.ChildNumber()) + require.Equal(t, vector.childNumber, pubKey.ChildNumber()) + + // Serialize and deserialize both keys and ensure they're the same + assertPrivateKeySerialization(t, privKey, vector.privKey) + assertPublicKeySerialization(t, pubKey, vector.pubKey) + + b58pk, err := base58.Decode(vector.privKey) + require.NoError(t, err) + privKey2, err := DeserializePrivateKey(b58pk) + require.NoError(t, err) + require.Equal(t, privKey, privKey2) + + // Test that DeserializeEncodedPrivateKey + // is equivalent to DeserializePrivateKey(base58.Decode(key)) + privKey3, err := DeserializeEncodedPrivateKey(vector.privKey) + require.NoError(t, err) + require.Equal(t, privKey2, privKey3) + + // Iterate over the entire child chain and test the given keys + for _, testChildKey := range vector.children { + t.Run(testChildKey.path, func(t *testing.T) { + // Get the private key at the given key tree path + privKey, err := NewPrivateKeyFromPath(seed, testChildKey.path) + require.NoError(t, err) + + // Get this private key's public key + pubKey := privKey.PublicKey() + + // Test DeserializePrivateKey + ppk, err := base58.Decode(testChildKey.privKey) + require.NoError(t, err) + xx, err := DeserializePrivateKey(ppk) + require.NoError(t, err) + + require.Equal(t, xx, privKey) + + // Assert correctness + require.Equal(t, testChildKey.privKey, privKey.String()) + require.Equal(t, testChildKey.pubKey, pubKey.String()) + + require.Equal(t, testChildKey.chainCode, hex.EncodeToString(privKey.ChainCode)) + require.Equal(t, testChildKey.chainCode, hex.EncodeToString(pubKey.ChainCode)) + + require.Equal(t, testChildKey.fingerprint, hex.EncodeToString(privKey.Fingerprint())) + require.Equal(t, testChildKey.fingerprint, hex.EncodeToString(pubKey.Fingerprint())) + + require.Equal(t, testChildKey.identifier, hex.EncodeToString(privKey.Identifier())) + require.Equal(t, testChildKey.identifier, hex.EncodeToString(pubKey.Identifier())) + + require.Equal(t, testChildKey.depth, privKey.Depth) + require.Equal(t, testChildKey.depth, pubKey.Depth) + + require.Equal(t, testChildKey.childNumber, privKey.ChildNumber()) + require.Equal(t, testChildKey.childNumber, pubKey.ChildNumber()) + + // Serialize and deserialize both keys and ensure they're the same + assertPrivateKeySerialization(t, privKey, testChildKey.privKey) + assertPublicKeySerialization(t, pubKey, testChildKey.pubKey) + }) + } +} + +func TestParentPublicChildDerivation(t *testing.T) { + // Generated using https://iancoleman.github.io/bip39/ + // Root key: + // xprv9s21ZrQH143K2Cfj4mDZBcEecBmJmawReGwwoAou2zZzG45bM6cFPJSvobVTCB55L6Ld2y8RzC61CpvadeAnhws3CHsMFhNjozBKGNgucYm + // Derivation Path m/44'/60'/0'/0: + // xprv9zy5o7z1GMmYdaeQdmabWFhUf52Ytbpe3G5hduA4SghboqWe7aDGWseN8BJy1GU72wPjkCbBE1hvbXYqpCecAYdaivxjNnBoSNxwYD4wHpW + // xpub6DxSCdWu6jKqr4isjo7bsPeDD6s3J4YVQV1JSHZg12Eagdqnf7XX4fxqyW2sLhUoFWutL7tAELU2LiGZrEXtjVbvYptvTX5Eoa4Mamdjm9u + + extendedMasterPublicBytes, err := base58.Decode("xpub6DxSCdWu6jKqr4isjo7bsPeDD6s3J4YVQV1JSHZg12Eagdqnf7XX4fxqyW2sLhUoFWutL7tAELU2LiGZrEXtjVbvYptvTX5Eoa4Mamdjm9u") + require.NoError(t, err) + + extendedMasterPublic, err := DeserializePublicKey(extendedMasterPublicBytes) + require.NoError(t, err) + + extendedMasterPrivateBytes, err := base58.Decode("xprv9zy5o7z1GMmYdaeQdmabWFhUf52Ytbpe3G5hduA4SghboqWe7aDGWseN8BJy1GU72wPjkCbBE1hvbXYqpCecAYdaivxjNnBoSNxwYD4wHpW") + require.NoError(t, err) + + extendedMasterPrivate, err := DeserializePrivateKey(extendedMasterPrivateBytes) + require.NoError(t, err) + + expectedChildren := []testChildKey{ + { + path: "m/0", + hexPubKey: "0243187e1a2ba9ba824f5f81090650c8f4faa82b7baf93060d10b81f4b705afd46", + wifPrivKey: "KyNPkzzaQ9xa7d2iFacTBgjP4rM3SydTzUZW7uwDh6raePWRJkeM", + }, + { + path: "m/1", + hexPubKey: "023790d11eb715c4320d8e31fba3a09b700051dc2cdbcce03f44b11c274d1e220b", + wifPrivKey: "KwVyk5XXaamsPPiGLHciv6AjhUV88CM7xTto7sRMCEy12GfwZzZQ", + }, + { + path: "m/2", + hexPubKey: "0302c5749c3c75cea234878ae3f4d8f65b75d584bcd7ed0943b016d6f6b59a2bad", + wifPrivKey: "L1o7CpgTjkcBYmbeuNigVpypgJ9GKq87WNqz8QDjWMqdKVKFf826", + }, + { + path: "m/3", + hexPubKey: "03f0440c94e5b14ea5b15875934597afff541bec287c6e65dc1102cafc07f69699", + wifPrivKey: "KzmYqf8WSUNzf2LhAWJjxv7pYX34XhFeLLxSoaSD8y9weJ4j6Z7q", + }, + { + path: "m/4", + hexPubKey: "026419d0d8996707605508ac44c5871edc7fe206a79ef615b74f2eea09c5852e2b", + wifPrivKey: "KzezMKd7Yc4jwJd6ASji2DwXX8jB8XwNTggLoAJU78zPAfXhzRLD", + }, + { + path: "m/5", + hexPubKey: "02f63c6f195eea98bdb163c4a094260dea71d264b21234bed4df3899236e6c2298", + wifPrivKey: "Kwxik5cHiQCZYy5g9gdfQmr7c3ivLDhFjpSF7McHKHeox6iu6MjL", + }, + { + path: "m/6", + hexPubKey: "02d74709cd522081064858f393d009ead5a0ecd43ede3a1f57befcc942025cb5f9", + wifPrivKey: "KwGhZYHovZoczyfupFRgZcr2xz1nHTSKx79uZuWhuzDSU7L7LrxE", + }, + { + path: "m/7", + hexPubKey: "03e54bb92630c943d38bbd8a4a2e65fca7605e672d30a0e545a7198cbb60729ceb", + wifPrivKey: "L4iGJ3JCfnMU1ia2bMQeF88hs6tkkS9QrmLbWPsj1ULHrUJid4KT", + }, + { + path: "m/8", + hexPubKey: "027e9d5acd14d39c4938697fba388cd2e8f31fc1c5dc02fafb93a10a280de85199", + wifPrivKey: "L3xfynMTDMR8vs6G5VxxjoKLBQyihvtcBHF4KHY5wvFMwevLjZKU", + }, + { + path: "m/9", + hexPubKey: "02a167a9f0d57468fb6abf2f3f7967e2cadf574314753a06a9ef29bc76c54638d2", + wifPrivKey: "KxiUV7CcdCuF3bLajqaP6qMFERQFvzsRj9aeCCf3TNWXioLwwJAm", + }, + + { + path: "m/100", + hexPubKey: "020db9ba00ddf68428e3f5bfe54252bbcd75b21e42f51bf3bfc4172bf0e5fa7905", + wifPrivKey: "L5ipKgExgKZYaxsQPEmyjrhoSepoxuSAxSWgK1GX5kaTUN3zGCU7", + }, + { + path: "m/101", + hexPubKey: "0299e3790956570737d6164e6fcda5a3daa304065ca95ba46bc73d436b84f34d46", + wifPrivKey: "L1iUjHWpYSead5vYZycMdMzCZDFQzveG3S6NviAi5BvvGdnuQbi6", + }, + { + path: "m/102", + hexPubKey: "0202e0732c4c5d2b1036af173640e01957998cfd4f9cdaefab6ffe76eb869e2c59", + wifPrivKey: "KybjnK4e985dgzxL5pgXTfq8YFagG8gB9HWAjLimagR4pdodCSNo", + }, + { + path: "m/103", + hexPubKey: "03d050adbd996c0c5d737ff638402dfbb8c08e451fef10e6d62fb57887c1ac6cb2", + wifPrivKey: "Kx9bf5cyf29fp7uuMVnqn47692xRwXStVmnL75w9i1sLQDjbFHP5", + }, + { + path: "m/104", + hexPubKey: "038d466399e2d68b4b16043ad4d88893b3b2f84fc443368729a973df1e66f4f530", + wifPrivKey: "L5myg7MNjKHcgVMS9ytmHgBftiWAi1awGpeC6p9dygsEQV9ZRvpz", + }, + { + path: "m/105", + hexPubKey: "034811e2f0c8c50440c08c2c9799b99c911c036e877e8325386ff61723ae3ffdce", + wifPrivKey: "L1KHrLBPhaJnvysjKUYk5QwkyWDb6uHgDM8EmE4eKtfqyJ13a7HC", + }, + { + path: "m/106", + hexPubKey: "026339fd5842921888e711a6ba9104a5f0c94cc0569855273cf5faefdfbcd3cc29", + wifPrivKey: "Kz4WPV43po7LRkatwHf9YGknGZRYfvo7TkvojinzxoFRXRYXyfDn", + }, + { + path: "m/107", + hexPubKey: "02833705c1069fab2aa92c6b0dac27807290d72e9f52378d493ac44849ca003b22", + wifPrivKey: "L3PxeN4w336kTk1becdFsAnR8ihh8SeMYXRHEzSmRNQTjtmcUjr9", + }, + { + path: "m/108", + hexPubKey: "032d2639bde1eb7bdf8444bd4f6cc26a9d1bdecd8ea15fac3b992c3da68d9d1df5", + wifPrivKey: "L2wf8FYiA888qrhDzHkFkZ3ZRBntysjtJa1QfcxE1eFiyDUZBRSi", + }, + { + path: "m/109", + hexPubKey: "02479c6d4a64b93a2f4343aa862c938fbc658c99219dd7bebb4830307cbd76c9e9", + wifPrivKey: "L5A5hcupWnYTNJTLTWDDfWyb3hnrJgdDgyN7c4PuF17bsY1tNjxS", + }, + } + + for _, child := range expectedChildren { + t.Run(fmt.Sprint(child.path), func(t *testing.T) { + path, err := ParsePath(child.path) + require.NoError(t, err) + require.Len(t, path.Elements, 2) + + pubKey, err := extendedMasterPublic.NewPublicChildKey(path.Elements[1].ChildNumber) + require.NoError(t, err) + require.Equal(t, child.hexPubKey, hex.EncodeToString(pubKey.Key)) + + pubKey2, err := extendedMasterPrivate.NewPublicChildKey(path.Elements[1].ChildNumber) + require.NoError(t, err) + require.Equal(t, pubKey, pubKey2) + + privKey, err := extendedMasterPrivate.NewPrivateChildKey(path.Elements[1].ChildNumber) + require.NoError(t, err) + + expectedPrivKey, err := cipher.SecKeyFromBitcoinWalletImportFormat(child.wifPrivKey) + require.NoError(t, err) + + require.Equal(t, expectedPrivKey[:], privKey.Key) + + pubKey3 := privKey.PublicKey() + require.Equal(t, pubKey, pubKey3) + }) + } +} + +// func TestPrivateParentPublicChildKey(childIdx + +func TestNewMasterKey(t *testing.T) { + tests := []struct { + seed []byte + base58 string + }{ + {[]byte{}, "xprv9s21ZrQH143K4YUcKrp6cVxQaX59ZFkN6MFdeZjt8CHVYNs55xxQSvZpHWfojWMv6zgjmzopCyWPSFAnV4RU33J4pwCcnhsB4R4mPEnTsMC"}, + {[]byte{1}, "xprv9s21ZrQH143K3YSbAXLMPCzJso5QAarQksAGc5rQCyZCBfw4Rj2PqVLFNgezSBhktYkiL3Ta2stLPDF9yZtLMaxk6Spiqh3DNFG8p8MVeEC"}, + {[]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, "xprv9s21ZrQH143K2hKT3jMKPFEcQLbx2XD55NtqQA7B4C5U9mTZY7gBeCdoFgurN4pxkQshzP8AQhBmUNgAo5djj5FzvUFh5pKH6wcRMSXVuc1"}, + } + + for _, test := range tests { + key, err := newMasterKey(test.seed) + require.NoError(t, err) + assertPrivateKeySerialization(t, key, test.base58) + } + + // NewMasterKey requires a seed length >=16 and <=64 bytes + badSeeds := [][]byte{ + nil, + []byte{}, + []byte{1}, + make([]byte, 15), + make([]byte, 65), + } + + for _, b := range badSeeds { + _, err := NewMasterKey(b) + require.Equal(t, ErrInvalidSeedLength, err) + } +} + +func TestDeserializePrivateInvalidStrings(t *testing.T) { + // Some test cases sourced from bitcoinjs-lib: + // https://github.com/bitcoinjs/bitcoinjs-lib/blob/4b4f32ffacb1b6e269ac3f16d68dba803c564c16/test/fixtures/hdnode.json + tests := []struct { + err error + base58 string + }{ + { + err: ErrSerializedKeyWrongSize, + base58: "xprv9s21ZrQH143K4YUcKrp6cVxQaX59ZFkN6MFdeZjt8CHVYNs55xxQSvZpHWfojWMv6zgjmzopCyWPSFAnV4RU33J4pwCcnhsB4R4mPEnTsM", + }, + { + err: ErrInvalidChecksum, + base58: "xprv9s21ZrQH143K3YSbAXLMPCzJso5QAarQksAGc5rQCyZCBfw4Rj2PqVLFNgezSBhktYkiL3Ta2stLPDF9yZtLMaxk6Spiqh3DNFG8p8MVeEc", + }, + { + err: ErrInvalidPrivateKeyVersion, + base58: "xpub6DxSCdWu6jKqr4isjo7bsPeDD6s3J4YVQV1JSHZg12Eagdqnf7XX4fxqyW2sLhUoFWutL7tAELU2LiGZrEXtjVbvYptvTX5Eoa4Mamdjm9u", + }, + { + err: ErrInvalidKeyVersion, + base58: "8FH81Rao5EgGmdScoN66TJAHsQP7phEMeyMTku9NBJd7hXgaj3HTvSNjqJjoqBpxdbuushwPEM5otvxXt2p9dcw33AqNKzZEPMqGHmz7Dpayi6Vb", + }, + { + err: ErrInvalidChecksum, + base58: "xprvQQQQQQQQQQQQQQQQCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", + }, + { + err: ErrSerializedKeyWrongSize, + base58: "HAsbc6CgKmTYEQg2CTz7m5STEPAB", + }, + { + err: ErrInvalidFingerprint, + base58: "xprv9tnJFvAXAXPfPnMTKfwpwnkty7MzJwELVgp4NTBquaKXy4RndyfJJCJJf7zNaVpBpzrwVRutZNLRCVLEcZHcvuCNG3zGbGBcZn57FbNnmSP", + }, + { + err: ErrInvalidPrivateKey, + base58: "xprv9s21ZrQH143K3yLysFvsu3n1dMwhNusmNHr7xArzAeCc7MQYqDBBStmqnZq6WLi668siBBNs3SjiyaexduHu9sXT9ixTsqptL67ADqcaBdm", + }, + { + err: ErrInvalidChildNumber, + base58: "xprv9s21ZrQYdgnodnKW4Drm1Qg7poU6Gf2WUDsjPxvYiK7iLBMrsjbnF1wsZZQgmXNeMSG3s7jmHk1b3JrzhG5w8mwXGxqFxfrweico7k8DtxR", + }, + { + err: ErrInvalidKeyVersion, + base58: "1111111111111adADjFaSNPxwXqLjHLj4mBfYxuewDPbw9hEj1uaXCzMxRPXDFF3cUoezTFYom4sEmEVSQmENPPR315cFk9YUFVek73wE9", + }, + { + err: ErrSerializedKeyWrongSize, + base58: "9XpNiB4DberdMn4jZiMhNGtuZUd7xUrCEGw4MG967zsVNvUKBEC9XLrmVmFasanWGp15zXfTNw4vW4KdvUAynEwyKjdho9QdLMPA2H5uyt", + }, + { + err: ErrSerializedKeyWrongSize, + base58: "7JJikZQ2NUXjSAnAF2SjFYE3KXbnnVxzRBNddFE1DjbDEHVGEJzYC7zqSgPoauBJS3cWmZwsER94oYSFrW9vZ4Ch5FtGeifdzmtS3FGYDB1vxFZsYKgMc", + }, + } + + for _, test := range tests { + t.Run(test.base58, func(t *testing.T) { + b, err := base58.Decode(test.base58) + require.NoError(t, err) + + _, err = DeserializePrivateKey(b) + require.Equal(t, test.err, err) + }) + } +} + +func TestDeserializePublicInvalidStrings(t *testing.T) { + // Some test cases sourced from bitcoinjs-lib: + // https://github.com/bitcoinjs/bitcoinjs-lib/blob/4b4f32ffacb1b6e269ac3f16d68dba803c564c16/test/fixtures/hdnode.json + tests := []struct { + err error + base58 string + }{ + { + err: ErrSerializedKeyWrongSize, + base58: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet888", + }, + { + err: ErrInvalidChecksum, + base58: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W11GMcet8", + }, + { + err: ErrInvalidPublicKeyVersion, + base58: "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", + }, + { + err: ErrInvalidFingerprint, + base58: "xpub67tVq9SuNQCfm2PXBqjGRAtNZ935kx2uHJaURePth4JBpMfEy6jum7Euj7FTpbs7fnjhfZcNEktCucWHcJf74dbKLKNSTZCQozdDVwvkJhs", + }, + { + err: ErrInvalidChildNumber, + base58: "xpub661MyMwTWkfYZq6BEh3ywGVXFvNj5hhzmWMhFBHSqmub31B1LZ9wbJ3DEYXZ8bHXGqnHKfepTud5a2XxGdnnePzZa2m2DyzTnFGBUXtaf9M", + }, + { + err: ErrInvalidPublicKey, + base58: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gYymDsxxRe3WWeZQ7TadaLSdKUffezzczTCpB8j3JP96UwE2n6w1", + }, + { + err: ErrInvalidKeyVersion, + base58: "8FH81Rao5EgGmdScoN66TJAHsQP7phEMeyMTku9NBJd7hXgaj3HTvSNjqJjoqBpxdbuushwPEM5otvxXt2p9dcw33AqNKzZEPMqGHmz7Dpayi6Vb", + }, + { + err: ErrInvalidKeyVersion, + base58: "1111111111111adADjFaSNPxwXqLjHLj4mBfYxuewDPbw9hEj1uaXCzMxRPXDFF3cUoezTFYom4sEmEVSQmENPPR315cFk9YUFVek73wE9", + }, + { + err: ErrSerializedKeyWrongSize, + base58: "7JJikZQ2NUXjSAnAF2SjFYE3KXbnnVxzRBNddFE1DjbDEHVGEJzYC7zqSgPoauBJS3cWmZwsER94oYSFrW9vZ4Ch5FtGeifdzmtS3FGYDB1vxFZsYKgMc", + }, + } + + for _, test := range tests { + t.Run(test.base58, func(t *testing.T) { + b, err := base58.Decode(test.base58) + require.NoError(t, err) + + _, err = DeserializePublicKey(b) + require.Equal(t, test.err, err) + }) + } +} + +func TestCantCreateHardenedPublicChild(t *testing.T) { + key, err := NewMasterKey(make([]byte, 32)) + require.NoError(t, err) + + // Test that it works for private keys + _, err = key.NewPrivateChildKey(FirstHardenedChild - 1) + require.NoError(t, err) + _, err = key.NewPrivateChildKey(FirstHardenedChild) + require.NoError(t, err) + _, err = key.NewPrivateChildKey(FirstHardenedChild + 1) + require.NoError(t, err) + + // Test that it throws an error for public keys if hardened + pubkey := key.PublicKey() + + _, err = pubkey.NewPublicChildKey(FirstHardenedChild - 1) + require.NoError(t, err) + _, err = pubkey.NewPublicChildKey(FirstHardenedChild) + require.Equal(t, ErrHardenedChildPublicKey, err) + _, err = pubkey.NewPublicChildKey(FirstHardenedChild + 1) + require.Equal(t, ErrHardenedChildPublicKey, err) +} + +func assertPrivateKeySerialization(t *testing.T, key *PrivateKey, expected string) { + expectedBytes, err := base58.Decode(expected) + require.NoError(t, err) + + serialized := key.Serialize() + + require.Equal(t, expectedBytes, serialized) + + key2, err := DeserializePrivateKey(serialized) + require.NoError(t, err) + require.Equal(t, key, key2) + + key3, err := DeserializeEncodedPrivateKey(expected) + require.NoError(t, err) + require.Equal(t, key2, key3) +} + +func assertPublicKeySerialization(t *testing.T, key *PublicKey, expected string) { + expectedBytes, err := base58.Decode(expected) + require.NoError(t, err) + + serialized := key.Serialize() + + require.Equal(t, expectedBytes, serialized) + + key2, err := DeserializePublicKey(serialized) + require.NoError(t, err) + require.Equal(t, key, key2) + + key3, err := DeserializeEncodedPublicKey(expected) + require.NoError(t, err) + require.Equal(t, key2, key3) +} + +func TestValidatePrivateKey(t *testing.T) { + cases := []struct { + name string + key []byte + }{ + { + name: "null key", + key: make([]byte, 32), + }, + + { + name: "nil key", + key: nil, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := validatePrivateKey(tc.key) + require.Error(t, err) + }) + } +} + +func TestValidatePublicKey(t *testing.T) { + cases := []struct { + name string + key []byte + }{ + { + name: "null key", + key: make([]byte, 33), + }, + + { + name: "nil key", + key: nil, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := validatePublicKey(tc.key) + require.Error(t, err) + }) + } +} + +func TestAddPrivateKeys(t *testing.T) { + _, validKey := cipher.GenerateKeyPair() + + cases := []struct { + name string + key []byte + keyPar []byte + keyInvalid bool + keyParInvalid bool + }{ + { + name: "null key", + key: make([]byte, 32), + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "nil key", + key: nil, + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "null keyPar", + key: validKey[:], + keyPar: make([]byte, 32), + keyParInvalid: true, + }, + + { + name: "nil keyPar", + key: validKey[:], + keyPar: nil, + keyParInvalid: true, + }, + + { + name: "invalid length keyPar", + key: validKey[:], + keyPar: make([]byte, 30), + keyParInvalid: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + _, err := addPrivateKeys(tc.key, tc.keyPar) + require.Error(t, err) + + if tc.keyInvalid && tc.keyParInvalid { + t.Fatal("keyInvalid and keyParInvalid can't both be true") + } + + if tc.keyInvalid { + require.True(t, strings.HasPrefix(err.Error(), "addPrivateKeys: key is invalid"), err.Error()) + } else { + require.True(t, strings.HasPrefix(err.Error(), "addPrivateKeys: keyPar is invalid"), err.Error()) + } + }) + } +} + +func TestAddPublicKeys(t *testing.T) { + validKey, _ := cipher.GenerateKeyPair() + + cases := []struct { + name string + key []byte + keyPar []byte + keyInvalid bool + keyParInvalid bool + }{ + { + name: "null key", + key: make([]byte, 33), + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "nil key", + key: nil, + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "null keyPar", + key: validKey[:], + keyPar: make([]byte, 33), + keyParInvalid: true, + }, + + { + name: "nil keyPar", + key: validKey[:], + keyPar: nil, + keyParInvalid: true, + }, + + { + name: "invalid length keyPar", + key: validKey[:], + keyPar: make([]byte, 30), + keyParInvalid: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + _, err := addPublicKeys(tc.key, tc.keyPar) + require.Error(t, err) + + if tc.keyInvalid && tc.keyParInvalid { + t.Fatal("keyInvalid and keyParInvalid can't both be true") + } + + if tc.keyInvalid { + require.True(t, strings.HasPrefix(err.Error(), "addPublicKeys: key is invalid"), err.Error()) + } else { + require.True(t, strings.HasPrefix(err.Error(), "addPublicKeys: keyPar is invalid"), err.Error()) + } + }) + } +} + +func TestPublicKeyForPrivateKey(t *testing.T) { + + cases := []struct { + name string + key []byte + }{ + { + name: "null key", + key: make([]byte, 33), + }, + + { + name: "nil key", + key: nil, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + _, err := publicKeyForPrivateKey(tc.key) + require.Error(t, err) + }) + } +} + +func TestNewPrivateKeyFromPath(t *testing.T) { + cases := []struct { + seed string + path string + key string + err error + }{ + { + seed: "6162636465666768696A6B6C6D6E6F707172737475767778797A", + path: "m", + key: "xprv9s21ZrQH143K3GfuLFf1UxUB4GzmFav1hrzTG1bPorBTejryu4YfYVxZn6LNmwfvsi6uj1Wyv9vLDPsfKDuuqwEqYier1ZsbgWVd9NCieNv", + }, + + { + seed: "6162636465666768696A6B6C6D6E6F707172737475767778797A", + path: "m/1'", + key: "xprv9uWf8oyvCHcAUg3kSjSroz67s7M3qJRWmNcdVwYGf91GFsaAatsVVp1bjH7z3WiWevqB7WK92B415oBwcahjoMvvb4mopPyqZUDeVW4168c", + }, + + { + seed: "6162636465666768696A6B6C6D6E6F707172737475767778797A", + path: "m/1'/foo", + err: ErrPathNodeNotNumber, + }, + + { + seed: "6162", + path: "m/1'", + err: ErrInvalidSeedLength, + }, + } + + for _, tc := range cases { + t.Run(tc.path, func(t *testing.T) { + seed, err := hex.DecodeString(tc.seed) + require.NoError(t, err) + + k, err := NewPrivateKeyFromPath(seed, tc.path) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.key, k.String()) + }) + } +} + +func TestParsePath(t *testing.T) { + cases := []struct { + path string + err error + p *Path + hardenedDepths []int + }{ + { + path: "m", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }}, + }, + }, + + { + path: "m/0", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: 0, + }}, + }, + }, + + { + path: "m/0'", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: FirstHardenedChild, + }}, + }, + hardenedDepths: []int{1}, + }, + + { + path: "m/2147483647", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: 2147483647, + }}, + }, + }, + + { + path: "m/2147483647'", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: 4294967295, + }}, + }, + hardenedDepths: []int{1}, + }, + + { + path: "m/1'/1", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: FirstHardenedChild + 1, + }, { + ChildNumber: 1, + }}, + }, + hardenedDepths: []int{1}, + }, + + { + path: "m/44'/0'/0'/0/0'", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: FirstHardenedChild + 44, + }, { + ChildNumber: FirstHardenedChild, + }, { + ChildNumber: FirstHardenedChild, + }, { + ChildNumber: 0, + }, { + ChildNumber: FirstHardenedChild, + }}, + }, + hardenedDepths: []int{1, 2, 3, 5}, + }, + + { + path: "m'/1'/1", + err: ErrPathNoMaster, + }, + + { + path: "foo", + err: ErrPathNoMaster, + }, + + { + path: "1'/1", + err: ErrPathNoMaster, + }, + + { + path: "m/1\"/1", + err: ErrPathNodeNotNumber, + }, + + { + path: "m/1'/f/1", + err: ErrPathNodeNotNumber, + }, + + { + path: "m/1'/m/1", + err: ErrPathChildMaster, + }, + + { + path: "m/1'/1/4294967296", // maxuint32+1 + err: ErrPathNodeNotNumber, + }, + + { + path: "m/1'/1/2147483648", // maxint32+1 + err: ErrPathNodeNumberTooLarge, + }, + } + + for _, tc := range cases { + t.Run(tc.path, func(t *testing.T) { + + p, err := ParsePath(tc.path) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + require.Equal(t, tc.p, p) + + hardenedDepthsMap := make(map[int]struct{}, len(tc.hardenedDepths)) + for _, x := range tc.hardenedDepths { + hardenedDepthsMap[x] = struct{}{} + } + + for i, n := range p.Elements { + _, ok := hardenedDepthsMap[i] + require.Equal(t, ok, n.Hardened()) + } + }) + } +} + +func TestMaxChildDepthError(t *testing.T) { + key, err := NewMasterKey(make([]byte, 32)) + require.NoError(t, err) + + reached := false + for i := 0; i < 256; i++ { + key, err = key.NewPrivateChildKey(0) + switch i { + case 255: + require.Equal(t, err, ErrMaxDepthReached) + reached = true + default: + require.NoError(t, err) + } + } + + require.True(t, reached) +} + +func TestImpossibleChildError(t *testing.T) { + baseErr := errors.New("foo") + childNumber := uint32(4) + + err := NewImpossibleChildError(baseErr, childNumber) + + switch x := err.(type) { + case Error: + require.True(t, x.ImpossibleChild()) + default: + t.Fatal("Expected err type Error") + } + + require.True(t, IsImpossibleChildError(err)) + + switch x := ErrHardenedChildPublicKey.(type) { + case Error: + require.False(t, x.ImpossibleChild()) + default: + t.Fatal("Expected err type Error") + } + + require.False(t, IsImpossibleChildError(ErrHardenedChildPublicKey)) + + require.False(t, IsImpossibleChildError(nil)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/path.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/path.go new file mode 100644 index 00000000..d95e6af3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/path.go @@ -0,0 +1,108 @@ +package bip32 + +import ( + "errors" + "log" + "strconv" + "strings" +) + +// Path represents a parsed HD wallet path +type Path struct { + Elements []PathNode +} + +// PathNode is an element of an HD wallet path +type PathNode struct { + Master bool + ChildNumber uint32 +} + +// Hardened returns true if this path node is hardened +func (p PathNode) Hardened() bool { + return p.ChildNumber >= FirstHardenedChild +} + +var ( + // ErrPathNoMaster HD wallet path does not start with m + ErrPathNoMaster = errors.New("Path must start with m") + // ErrPathChildMaster HD wallet path contains m in a child node + ErrPathChildMaster = errors.New("Path contains m as a child node") + // ErrPathNodeNotNumber HD wallet path node is not a valid uint32 number + ErrPathNodeNotNumber = errors.New("Path node is not a valid uint32 number") + // ErrPathNodeNumberTooLarge HD wallet path node is >= 2^31 + ErrPathNodeNumberTooLarge = errors.New("Path node must be less than 2^31") +) + +// ParsePath parses a bip32 HD wallet path. The path must start with m/. +func ParsePath(p string) (*Path, error) { + pts := strings.Split(p, "/") + + path := &Path{ + Elements: []PathNode{ + { + Master: true, + ChildNumber: 0, + }, + }, + } + + for i, x := range pts { + if i == 0 { + if x != "m" { + return nil, ErrPathNoMaster + } + // Path.Elements already initialized with master node + continue + } else if x == "m" { + return nil, ErrPathChildMaster + } + + n, err := parseNode(x) + if err != nil { + return nil, err + } + + path.Elements = append(path.Elements, n) + } + + return path, nil +} + +func parseNode(x string) (PathNode, error) { + // Hardened nodes have an apostrophe ' appended + hardened := false + if strings.HasSuffix(x, "'") { + hardened = true + x = x[:len(x)-1] + } + + // Node element (minus a single trailing apostrophe) must be a valid uint32 number + n, err := strconv.ParseUint(x, 10, 32) + if err != nil { + return PathNode{}, ErrPathNodeNotNumber + } + + // Node number must be <2^31. If hardened, 2^31 will be added to it + if n >= uint64(FirstHardenedChild) { + return PathNode{}, ErrPathNodeNumberTooLarge + } + + nn := uint32(n) + + // Add 2^31 to the base number for hardened nodes + if hardened { + nnn := nn + FirstHardenedChild + + // Sanity check + if nnn < nn { + log.Panic("Unexpected overflow of path number when adjusting hardened child number") + } + nn = nnn + } + + return PathNode{ + Master: false, + ChildNumber: nn, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/utils.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/utils.go new file mode 100644 index 00000000..5034dbc1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/utils.go @@ -0,0 +1,171 @@ +package bip32 + +import ( + "crypto/sha256" + "encoding/binary" + "fmt" + "log" + "math/big" + + "github.com/SkycoinProject/skycoin/src/cipher/ripemd160" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" + secp256k1go "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2" +) + +// +// Hashes +// + +func hashSHA256(data []byte) []byte { + h := sha256.New() + h.Write(data) //nolint:errcheck + return h.Sum(nil) +} + +func hashDoubleSHA256(data []byte) []byte { + hash1 := hashSHA256(data) + hash2 := hashSHA256(hash1) + return hash2 +} + +func hashRipemd160(data []byte) []byte { + h := ripemd160.New() + h.Write(data) //nolint:errcheck + return h.Sum(nil) +} + +func hash160(data []byte) []byte { + hash1 := hashSHA256(data) + hash2 := hashRipemd160(hash1) + return hash2 +} + +// +// Checksum +// + +func checksum(data []byte) []byte { + hash := hashDoubleSHA256(data) + return hash[:4] +} + +func addChecksumToBytes(data []byte) []byte { + checksum := checksum(data) + return append(data, checksum...) +} + +// +// Keys +// + +// publicKeyForPrivateKey converts a private key to a public key. +// Equivalent to `serP(point(k))` in the bip32 spec +func publicKeyForPrivateKey(key []byte) ([]byte, error) { + // From bip32: If parse256(IL) ≥ n, fail + if err := validatePrivateKey(key); err != nil { + return nil, err + } + + b := secp256k1.PubkeyFromSeckey(key) + if b == nil { + log.Panic("publicKeyForPrivateKey: invalid private key") + } + + // From bip32: If Ki == 0 fail + if err := validatePublicKey(b); err != nil { + return nil, err + } + + return b, nil +} + +func addPublicKeys(key, keyPar []byte) ([]byte, error) { + if code := secp256k1.VerifyPubkey(key); code != 1 { + return nil, fmt.Errorf("addPublicKeys: key is invalid, secp256k1.VerifyPubkey error code %d", code) + } + if code := secp256k1.VerifyPubkey(keyPar); code != 1 { + return nil, fmt.Errorf("addPublicKeys: keyPar is invalid, secp256k1.VerifyPubkey error code %d", code) + } + + // expandPublicKey + var pk1, pk2 secp256k1go.XY + if err := pk1.ParsePubkey(key); err != nil { + log.Panicf("addPublicKeys: invalid pubkey1: %v", err) + } + if err := pk2.ParsePubkey(keyPar); err != nil { + log.Panicf("addPublicKeys: invalid pubkey1: %v", err) + } + + // add public keys + pk1.AddXY(&pk2) + + // compress + newKey := pk1.Bytes() + + if code := secp256k1.VerifyPubkey(newKey); code != 1 { + return nil, fmt.Errorf("addPublicKeys: newKey is invalid, secp256k1.VerifyPubkey error code %d", code) + } + + return newKey, nil +} + +// addPrivateKeys computes the CKDPriv equation `parse256(IL) + kpar (mod n)` +// and verifies the result +func addPrivateKeys(key, keyPar []byte) ([]byte, error) { + // From bip32: If parse256(IL) ≥ n, fail + if code := secp256k1.VerifySeckey(key); code != 1 { + return nil, fmt.Errorf("addPrivateKeys: key is invalid, secp256k1.VerifySeckey error code %d", code) + } + if code := secp256k1.VerifySeckey(keyPar); code != 1 { + return nil, fmt.Errorf("addPrivateKeys: keyPar is invalid, secp256k1.VerifySeckey error code %d", code) + } + + var keyInt big.Int + var keyParInt big.Int + keyInt.SetBytes(key) + keyParInt.SetBytes(keyPar) + + // Computes this CKDPriv equation: + // parse256(IL) + kpar (mod n) + keyInt.Add(&keyInt, &keyParInt) + keyInt.Mod(&keyInt, &secp256k1go.TheCurve.Order.Int) + + newKey := secp256k1go.LeftPadBytes(keyInt.Bytes(), 32) + + // From bip32: If ki == 0 fail + if code := secp256k1.VerifySeckey(newKey); code != 1 { + return nil, fmt.Errorf("addPrivateKeys: newKey is invalid, secp256k1.VerifySeckey error code %d", code) + } + + return newKey, nil +} + +// validatePrivateKey verifies that the secret key is not zero and that it is inside the curve +// Corresponds to bip32 spec constraints `parse256(IL) < n && ki != 0` +func validatePrivateKey(key []byte) error { + // VerifySeckey checks that the key is > 0 and inside the curve + if secp256k1.VerifySeckey(key) != 1 { + return ErrDerivedInvalidPrivateKey + } + + return nil +} + +func validatePublicKey(key []byte) error { + if secp256k1.VerifyPubkey(key) != 1 { + return ErrDerivedInvalidPublicKey + } + + return nil +} + +// +// Numerical +// + +// uint32Bytes serializes a uint32 as bytes in big-endian form +func uint32Bytes(i uint32) []byte { + bytes := make([]byte, 4) + binary.BigEndian.PutUint32(bytes, i) + return bytes +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/LICENSE b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/LICENSE new file mode 100644 index 00000000..1dc11de8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Tyler Smith and contributors +Copyright (c) 2018-2019 Skycoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/README.md new file mode 100644 index 00000000..529edcd3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/README.md @@ -0,0 +1,43 @@ +# bip39 +[![Documentation](https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/bip39?status.svg)](http://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/bip39) + +A golang implementation of the BIP0039 spec for mnemonic seeds. + +Forked from https://github.com/tyler-smith/go-bip39 to manually vendor the code in the `cipher/` path +and to make some structural modifications. + +## Example + +```go +package main + +import ( + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/tyler-smith/go-bip32" + "fmt" +) + +func main(){ + // Generate a mnemonic for memorization or user-friendly seeds + entropy, _ := bip39.NewEntropy(256) + mnemonic, _ := bip39.NewMnemonic(entropy) + + // Generate a Bip32 HD wallet for the mnemonic and a user supplied password + seed := bip39.NewSeed(mnemonic, "Secret Passphrase") + + masterKey, _ := bip32.NewMasterKey(seed) + publicKey := masterKey.PublicKey() + + // Display mnemonic and keys + fmt.Println("Mnemonic: ", mnemonic) + fmt.Println("Master private key: ", masterKey) + fmt.Println("Master public key: ", publicKey) +} +``` + +## Credits + +Wordlists are from the [bip39 spec](https://github.com/bitcoin/bips/tree/master/bip-0039). + +Test vectors are from the standard Python BIP0039 implementation from the +Trezor team: [https://github.com/trezor/python-mnemonic](https://github.com/trezor/python-mnemonic) diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39.go new file mode 100644 index 00000000..2ee376b6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39.go @@ -0,0 +1,408 @@ +// Package bip39 is the Golang implementation of the BIP39 spec. +// +// The official BIP39 spec can be found at +// https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki +package bip39 + +import ( + "bytes" + "crypto/sha256" + "crypto/sha512" + "encoding/binary" + "errors" + "fmt" + "math/big" + "strings" + "sync" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists" + + "github.com/SkycoinProject/skycoin/src/cipher/pbkdf2" +) + +var ( + // Some bitwise operands for working with big.Ints + last11BitsMask = big.NewInt(2047) + shift11BitsMask = big.NewInt(2048) + bigOne = big.NewInt(1) + bigTwo = big.NewInt(2) + + // used to isolate the checksum bits from the entropy+checksum byte array + wordLengthChecksumMasksMapping = map[int]*big.Int{ + 12: big.NewInt(15), + 15: big.NewInt(31), + 18: big.NewInt(63), + 21: big.NewInt(127), + 24: big.NewInt(255), + } + // used to use only the desired x of 8 available checksum bits. + // 256 bit (word length 24) requires all 8 bits of the checksum, + // and thus no shifting is needed for it (we would get a divByZero crash if we did) + wordLengthChecksumShiftMapping = map[int]*big.Int{ + 12: big.NewInt(16), + 15: big.NewInt(8), + 18: big.NewInt(4), + 21: big.NewInt(2), + } + + // wordList is the set of words to use + wordList []string + + // wordMap is a reverse lookup map for wordList + wordMap map[string]int + + // wordListMutex is held when changing wordList + // TODO -- make wordList non-global + wordListMutex sync.Mutex +) + +var ( + // ErrInvalidEntropyLength is returned when trying to use an entropy set with + // an invalid size. + ErrInvalidEntropyLength = errors.New("Entropy length must be [128, 256] and a multiple of 32") + + // ErrChecksumIncorrect is returned when entropy has the incorrect checksum. + ErrChecksumIncorrect = errors.New("Mnemonic checksum incorrect") + + // ErrSurroundingWhitespace is returned if a mnemonic sentence has extra whitespace around it + ErrSurroundingWhitespace = errors.New("Mnemonic has extra whitespace around it") + + // ErrInvalidSeparator is returned if the words in a mnemonic sentence are not separated by a single ASCII space + ErrInvalidSeparator = errors.New("Mnemonic must be separated by single spaces") + + // ErrUnknownWord is returned if a mnemonic sentence contains an unrecognized word + ErrUnknownWord = errors.New("Mnemonic contains an unrecognized word") + + // ErrInvalidNumberOfWords is returned if a mnemonic sentence does not have 12, 15, 18, 21 or 24 words + ErrInvalidNumberOfWords = errors.New("Mnemonic must have 12, 15, 18, 21 or 24 words") +) + +func init() { + setWordList(wordlists.English) +} + +// setWordList sets the list of words to use for mnemonics. Currently the list +// that is set is used package-wide. +func setWordList(list []string) { + wordListMutex.Lock() + defer wordListMutex.Unlock() + wordList = list + wordMap = map[string]int{} + for i, v := range wordList { + wordMap[v] = i + } +} + +// getWordList gets the list of words to use for mnemonics. +func getWordList() []string { + wordListMutex.Lock() + defer wordListMutex.Unlock() + return wordList +} + +// getWordIndex gets word index in wordMap. +func getWordIndex(word string) (int, bool) { + wordListMutex.Lock() + defer wordListMutex.Unlock() + idx, ok := wordMap[word] + return idx, ok +} + +// DefaultMnemonicEntropyBitSize is the default bit size for NewDefaultMnemonic's entropy +// TODO -- make 24 word seeds default? (256 bits entropy - recommended for HD wallets) +const DefaultMnemonicEntropyBitSize = 128 + +// NewDefaultMnemonic returns a generated mnemonic using entropy with bitSize 128 +func NewDefaultMnemonic() (string, error) { + entropy, err := NewEntropy(DefaultMnemonicEntropyBitSize) + if err != nil { + return "", err + } + + return NewMnemonic(entropy) +} + +// MustNewDefaultMnemonic returns a generated mnemonic using entropy with bitSize 128 and panics if there is an error +func MustNewDefaultMnemonic() string { + seed, err := NewDefaultMnemonic() + if err != nil { + panic(err) + } + return seed +} + +// NewEntropy will create random entropy bytes +// so long as the requested size bitSize is an appropriate size. +// +// bitSize has to be a multiple of 32 and be within the inclusive range of {128, 256} +func NewEntropy(bitSize int) ([]byte, error) { + err := validateEntropyBitSize(bitSize) + if err != nil { + return nil, err + } + + entropy := cipher.RandByte(bitSize / 8) + return entropy, err +} + +// EntropyFromMnemonic takes a mnemonic generated by this library, +// and returns the input entropy used to generate the given mnemonic. +// An error is returned if the given mnemonic is invalid. +func EntropyFromMnemonic(mnemonic string) ([]byte, error) { + words, err := splitMnemonicWords(mnemonic) + if err != nil { + return nil, err + } + + // Decode the words into a big.Int. + b := big.NewInt(0) + for _, v := range words { + index, found := wordMap[v] + if !found { + // This should have been caught by splitMnemonicWords() + panic(fmt.Sprintf("word %q not found in reverse map", v)) + } + var wordBytes [2]byte + binary.BigEndian.PutUint16(wordBytes[:], uint16(index)) + b = b.Mul(b, shift11BitsMask) + b = b.Or(b, big.NewInt(0).SetBytes(wordBytes[:])) + } + + // Build and add the checksum to the big.Int. + checksum := big.NewInt(0) + checksumMask := wordLengthChecksumMasksMapping[len(words)] + checksum = checksum.And(b, checksumMask) + + b.Div(b, big.NewInt(0).Add(checksumMask, bigOne)) + + // The entropy is the underlying bytes of the big.Int. Any upper bytes of + // all 0's are not returned so we pad the beginning of the slice with empty + // bytes if necessary. + entropy := b.Bytes() + entropy = padByteSlice(entropy, len(words)/3*4) + + // Generate the checksum and compare with the one we got from the mnemonic. + entropyChecksumBytes := computeChecksum(entropy) + entropyChecksum := big.NewInt(int64(entropyChecksumBytes[0])) + if l := len(words); l != 24 { + checksumShift := wordLengthChecksumShiftMapping[l] + entropyChecksum.Div(entropyChecksum, checksumShift) + } + + if checksum.Cmp(entropyChecksum) != 0 { + return nil, ErrChecksumIncorrect + } + + return entropy, nil +} + +// NewMnemonic will return a string consisting of the mnemonic words for +// the given entropy. +// If the provide entropy is invalid, an error will be returned. +func NewMnemonic(entropy []byte) (string, error) { + // Compute some lengths for convenience. + entropyBitLength := len(entropy) * 8 + checksumBitLength := entropyBitLength / 32 + sentenceLength := (entropyBitLength + checksumBitLength) / 11 + + // Validate that the requested size is supported. + err := validateEntropyBitSize(entropyBitLength) + if err != nil { + return "", err + } + + // Add checksum to entropy. + entropy = addChecksum(entropy) + + // Break entropy up into sentenceLength chunks of 11 bits. + // For each word AND mask the rightmost 11 bits and find the word at that index. + // Then bitshift entropy 11 bits right and repeat. + // Add to the last empty slot so we can work with LSBs instead of MSB. + + // Entropy as an int so we can bitmask without worrying about bytes slices. + entropyInt := new(big.Int).SetBytes(entropy) + + // Slice to hold words in. + words := make([]string, sentenceLength) + + // Throw away big.Int for AND masking. + word := big.NewInt(0) + + for i := sentenceLength - 1; i >= 0; i-- { + // Get 11 right most bits and bitshift 11 to the right for next time. + word.And(entropyInt, last11BitsMask) + entropyInt.Div(entropyInt, shift11BitsMask) + + // Get the bytes representing the 11 bits as a 2 byte slice. + wordBytes := padByteSlice(word.Bytes(), 2) + + // Convert bytes to an index and add that word to the list. + words[i] = wordList[binary.BigEndian.Uint16(wordBytes)] + } + + return strings.Join(words, " "), nil +} + +// NewSeed creates a hashed seed output given the mnemonic string and a password. +// An error is returned if the mnemonic is not valid. +func NewSeed(mnemonic string, password string) ([]byte, error) { + if err := ValidateMnemonic(mnemonic); err != nil { + return nil, err + } + + return newSeed(mnemonic, password), nil +} + +// newSeed creates a hashed seed output given a provided string and password. +// No checking is performed to validate that the string provided is a valid mnemonic. +func newSeed(mnemonic, password string) []byte { + return pbkdf2.Key([]byte(mnemonic), []byte("mnemonic"+password), 2048, 64, sha512.New) +} + +// ValidateMnemonic returns an error if a mnemonic is invalid. It can be invalid +// for these reasons: +// - Number of words not a multiple of 3 and not at least 12 or at most 24 words +// - Words are not separated by exactly one ascii space +// - Mnemonic string has leading or trailing whitespace +// - Any word is not present in the wordlist +// - The mnemonic checksum is incorrect +// Note: this only works on ascii wordlists. Japanese, Chinese etc are not supported yet. +func ValidateMnemonic(mnemonic string) error { + words, err := splitMnemonicWords(mnemonic) + if err != nil { + return err + } + + if !isMnemonicChecksumValid(words) { + return ErrChecksumIncorrect + } + + return nil +} + +// splitMnemonicWords attempts to verify that the provided mnemonic is valid. +// Validity is determined by both the number of words being appropriate, +// and that all the words in the mnemonic are present in the word list. +func splitMnemonicWords(mnemonic string) ([]string, error) { + // Make sure no leading/trailing whitespace + if mnemonic != strings.TrimSpace(mnemonic) { + return nil, ErrSurroundingWhitespace + } + + // Create a list of all the words in the mnemonic sentence + words := strings.Split(mnemonic, " ") + + // Detect duplicate whitespace + for _, w := range words { + if w == "" { + return nil, ErrInvalidSeparator + } + } + + numOfWords := len(words) + + // The number of words should be 12, 15, 18, 21 or 24 + if numOfWords%3 != 0 || numOfWords < 12 || numOfWords > 24 { + return nil, ErrInvalidNumberOfWords + } + + // Check if all words belong in the wordlist + for _, word := range words { + if _, ok := wordMap[word]; !ok { + return nil, ErrUnknownWord + } + } + + return words, nil +} + +// isMnemonicChecksumValid validates the checksum value of a mnemonic +func isMnemonicChecksumValid(words []string) bool { + if len(words)%3 != 0 || len(words) < 12 || len(words) > 24 { + panic("invalid number of words") // caller should validate words before passing to this function + } + + var ( + entropyBitSize = len(words) * 11 + checksumBitSize = entropyBitSize % 32 + fullByteSize = (entropyBitSize-checksumBitSize)/8 + 1 + checksumByteSize = fullByteSize - (fullByteSize % 4) + ) + + // Convert word indices to a big.Int representing the entropy. + checksummedEntropy := big.NewInt(0) + modulo := big.NewInt(2048) + for _, v := range words { + index := big.NewInt(int64(wordMap[v])) + checksummedEntropy.Mul(checksummedEntropy, modulo) + checksummedEntropy.Add(checksummedEntropy, index) + } + + // Calculate the unchecksummed entropy so we can validate that the checksum is + // correct. + checksumModulo := big.NewInt(0).Exp(bigTwo, big.NewInt(int64(checksumBitSize)), nil) + rawEntropy := big.NewInt(0).Div(checksummedEntropy, checksumModulo) + + // Convert big.Ints to byte padded byte slices. + rawEntropyBytes := padByteSlice(rawEntropy.Bytes(), checksumByteSize) + checksummedEntropyBytes := padByteSlice(checksummedEntropy.Bytes(), fullByteSize) + + // Validate that the checksum is correct. + newChecksummedEntropyBytes := padByteSlice(addChecksum(rawEntropyBytes), fullByteSize) + return bytes.Equal(checksummedEntropyBytes, newChecksummedEntropyBytes) +} + +// Appends to data the first (len(data) / 32)bits of the result of sha256(data) +// Currently only supports data up to 32 bytes +func addChecksum(data []byte) []byte { + // Get first byte of sha256 + hash := computeChecksum(data) + firstChecksumByte := hash[0] + + // len() is in bytes so we divide by 4 + checksumBitLength := uint(len(data) / 4) + + // For each bit of check sum we want we shift the data one the left + // and then set the (new) right most bit equal to checksum bit at that index + // staring from the left + dataBigInt := new(big.Int).SetBytes(data) + for i := uint(0); i < checksumBitLength; i++ { + // Bitshift 1 left + dataBigInt.Mul(dataBigInt, bigTwo) + + // Set rightmost bit if leftmost checksum bit is set + if uint8(firstChecksumByte&(1<<(7-i))) > 0 { + dataBigInt.Or(dataBigInt, bigOne) + } + } + + return dataBigInt.Bytes() +} + +func computeChecksum(data []byte) []byte { + hasher := sha256.New() + hasher.Write(data) //nolint:errcheck + return hasher.Sum(nil) +} + +// validateEntropyBitSize ensures that entropy is the correct size for being a +// mnemonic. +func validateEntropyBitSize(bitSize int) error { + if (bitSize%32) != 0 || bitSize < 128 || bitSize > 256 { + return ErrInvalidEntropyLength + } + return nil +} + +// padByteSlice returns a byte slice of the given size with contents of the +// given slice left padded and any empty spaces filled with 0's. +func padByteSlice(slice []byte, length int) []byte { + offset := length - len(slice) + if offset <= 0 { + return slice + } + newSlice := make([]byte, length) + copy(newSlice[offset:], slice) + return newSlice +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39_test.go new file mode 100644 index 00000000..3fff978c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39_test.go @@ -0,0 +1,553 @@ +package bip39 + +import ( + "crypto/rand" + "encoding/hex" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists" +) + +type vector struct { + entropy string + mnemonic string + seed string + err error +} + +func TestGetWordList(t *testing.T) { + require.Equal(t, wordlists.English, getWordList()) +} + +func TestGetWordIndex(t *testing.T) { + for expectedIdx, word := range wordList { + actualIdx, ok := getWordIndex(word) + require.True(t, ok) + require.Equal(t, actualIdx, expectedIdx) + } + + for _, word := range []string{"a", "set", "of", "invalid", "words"} { + actualIdx, ok := getWordIndex(word) + require.False(t, ok) + require.Equal(t, actualIdx, 0) + } +} + +func TestNewMnemonic(t *testing.T) { + for _, vector := range testVectors() { + entropy, err := hex.DecodeString(vector.entropy) + require.NoError(t, err) + + mnemonic, err := NewMnemonic(entropy) + require.NoError(t, err) + require.Equal(t, vector.mnemonic, mnemonic) + + seed, err := NewSeed(mnemonic, "TREZOR") + require.NoError(t, err) + require.Equal(t, vector.seed, hex.EncodeToString(seed)) + } +} + +func TestNewMnemonicInvalidEntropy(t *testing.T) { + _, err := NewMnemonic([]byte{}) + require.Error(t, err) + require.Equal(t, ErrInvalidEntropyLength, err) +} + +func TestNewSeedCheckingInvalidMnemonics(t *testing.T) { + for _, vector := range badMnemonicSentences() { + t.Run(vector.mnemonic, func(t *testing.T) { + _, err := NewSeed(vector.mnemonic, "TREZOR") + require.Error(t, err) + require.Equal(t, vector.err, err) + }) + } +} + +func TestValidateMnemonic(t *testing.T) { + for _, vector := range badMnemonicSentences() { + t.Run(vector.mnemonic, func(t *testing.T) { + err := ValidateMnemonic(vector.mnemonic) + require.Error(t, err) + require.Equal(t, vector.err, err) + }) + } + + for _, vector := range testVectors() { + t.Run(vector.mnemonic, func(t *testing.T) { + err := ValidateMnemonic(vector.mnemonic) + require.NoError(t, err) + }) + } +} + +func TestValidateMnemonic2(t *testing.T) { + m := MustNewDefaultMnemonic() + require.NoError(t, ValidateMnemonic(m)) + + m, err := NewDefaultMnemonic() + require.NoError(t, err) + require.NoError(t, ValidateMnemonic(m)) + + // Truncated + m = m[:len(m)-15] + err = ValidateMnemonic(m) + require.Error(t, err) + // Multiple kinds of errors can result from a truncated random mnemonic; + // don't bother comparing to any specific one + + // Trailing whitespace + m, err = NewDefaultMnemonic() + require.NoError(t, err) + m += " " + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrSurroundingWhitespace, err) + + m, err = NewDefaultMnemonic() + require.NoError(t, err) + m += "\n" + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrSurroundingWhitespace, err) + + // Preceding whitespace + m, err = NewDefaultMnemonic() + require.NoError(t, err) + m = " " + m + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrSurroundingWhitespace, err) + + m, err = NewDefaultMnemonic() + require.NoError(t, err) + m = "\n" + m + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrSurroundingWhitespace, err) + + // Extra whitespace between words + m, err = NewDefaultMnemonic() + require.NoError(t, err) + ms := strings.Split(m, " ") + m = strings.Join(ms, " ") + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrInvalidSeparator, err) + + // Contains invalid word + m, err = NewDefaultMnemonic() + require.NoError(t, err) + ms = strings.Split(m, " ") + ms[2] = "foo" + m = strings.Join(ms, " ") + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrUnknownWord, err) + + // Invalid number of words + m, err = NewDefaultMnemonic() + require.NoError(t, err) + ms = strings.Split(m, " ") + m = strings.Join(ms[:len(ms)-1], " ") + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrInvalidNumberOfWords, err) +} + +func TestInvalidMnemonicChecksum(t *testing.T) { + badChecksumMnemonics := []string{ + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon yellow", + "chief stadium sniff exhibit ostrich exit fruit noodle good coin coin supply", + } + + for _, m := range badChecksumMnemonics { + t.Run(m, func(t *testing.T) { + err := ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrChecksumIncorrect, err) + }) + } +} + +func TestNewEntropy(t *testing.T) { + // Good tests. + for i := 128; i <= 256; i += 32 { + _, err := NewEntropy(i) + require.NoError(t, err) + } + // Bad Values + for i := 0; i <= 256; i++ { + if i%8 != 0 { + _, err := NewEntropy(i) + require.Error(t, err) + require.Equal(t, ErrInvalidEntropyLength, err) + } + } +} + +func TestIsMnemonicChecksumValidForDifferentArrayLangths(t *testing.T) { + max := 1000 + for i := 0; i < max; i++ { + //16, 20, 24, 28, 32 + length := 16 + (i%5)*4 + seed := make([]byte, length) + if n, err := rand.Read(seed); err != nil { + t.Errorf("%v", err) + } else if n != length { + t.Errorf("Wrong number of bytes read: %d", n) + } + + mnemonic, err := NewMnemonic(seed) + if err != nil { + t.Errorf("%v", err) + } + + isValid := isMnemonicChecksumValid(strings.Split(mnemonic, " ")) + require.True(t, isValid) + } +} + +func TestPadByteSlice(t *testing.T) { + require.Equal(t, []byte{0}, padByteSlice([]byte{}, 1)) + require.Equal(t, []byte{0, 1}, padByteSlice([]byte{1}, 2)) + require.Equal(t, []byte{1, 1}, padByteSlice([]byte{1, 1}, 2)) + require.Equal(t, []byte{1, 1, 1}, padByteSlice([]byte{1, 1, 1}, 2)) +} + +func TestIsMnemonicChecksumValidForZeroLeadingSeeds(t *testing.T) { + ms := []string{ + "00000000000000000000000000000000", + "00a84c51041d49acca66e6160c1fa999", + "00ca45df1673c76537a2020bfed1dafd", + "0019d5871c7b81fd83d474ef1c1e1dae", + "00dcb021afb35ffcdd1d032d2056fc86", + "0062be7bd09a27288b6cf0eb565ec739", + "00dc705b5efa0adf25b9734226ba60d4", + "0017747418d54c6003fa64fade83374b", + "000d44d3ee7c3dfa45e608c65384431b", + "008241c1ef976b0323061affe5bf24b9", + "00a6aec77e4d16bea80b50a34991aaba", + "0011527b8c6ddecb9d0c20beccdeb58d", + "001c938c503c8f5a2bba2248ff621546", + "0002f90aaf7a8327698f0031b6317c36", + "00bff43071ed7e07f77b14f615993bac", + "00da143e00ef17fc63b6fb22dcc2c326", + "00ffc6764fb32a354cab1a3ddefb015d", + "0062ef47e0985e8953f24760b7598cdd", + "003bf9765064f71d304908d906c065f5", + "00993851503471439d154b3613947474", + "007ad0ffe9eae753a483a76af06dfa67", + "00091824db9ec19e663bee51d64c83cc", + "00f48ac621f7e3cb39b2012ac3121543", + "0072917415cdca24dfa66c4a92c885b4", + "0027ced2b279ea8a91d29364487cdbf4", + "00b9c0d37fb10ba272e55842ad812583", + "004b3d0d2b9285946c687a5350479c8c", + "00c7c12a37d3a7f8c1532b17c89b724c", + "00f400c5545f06ae17ad00f3041e4e26", + "001e290be10df4d209f247ac5878662b", + "00bf0f74568e582a7dd1ee64f792ec8b", + "00d2e43ecde6b72b847db1539ed89e23", + "00cecba6678505bb7bfec8ed307251f6", + "000aeed1a9edcbb4bc88f610d3ce84eb", + "00d06206aadfc25c2b21805d283f15ae", + "00a31789a2ab2d54f8fadd5331010287", + "003493c5f520e8d5c0483e895a121dc9", + "004706112800b76001ece2e268bc830e", + "00ab31e28bb5305be56e38337dbfa486", + "006872fe85df6b0fa945248e6f9379d1", + "00717e5e375da6934e3cfdf57edaf3bd", + "007f1b46e7b9c4c76e77c434b9bccd6b", + "00dc93735aa35def3b9a2ff676560205", + "002cd5dcd881a49c7b87714c6a570a76", + "0013b5af9e13fac87e0c505686cfb6bf", + "007ab1ec9526b0bc04b64ae65fd42631", + "00abb4e11d8385c1cca905a6a65e9144", + "00574fc62a0501ad8afada2e246708c3", + "005207e0a815bb2da6b4c35ec1f2bf52", + "00f3460f136fb9700080099cbd62bc18", + "007a591f204c03ca7b93981237112526", + "00cfe0befd428f8e5f83a5bfc801472e", + "00987551ac7a879bf0c09b8bc474d9af", + "00cadd3ce3d78e49fbc933a85682df3f", + "00bfbf2e346c855ccc360d03281455a1", + "004cdf55d429d028f715544ce22d4f31", + "0075c84a7d15e0ac85e1e41025eed23b", + "00807dddd61f71725d336cab844d2cb5", + "00422f21b77fe20e367467ed98c18410", + "00b44d0ac622907119c626c850a462fd", + "00363f5e7f22fc49f3cd662a28956563", + "000fe5837e68397bbf58db9f221bdc4e", + "0056af33835c888ef0c22599686445d3", + "00790a8647fd3dfb38b7e2b6f578f2c6", + "00da8d9009675cb7beec930e263014fb", + "00d4b384540a5bb54aa760edaa4fb2fe", + "00be9b1479ed680fdd5d91a41eb926d0", + "009182347502af97077c40a6e74b4b5c", + "00f5c90ee1c67fa77fd821f8e9fab4f1", + "005568f9a2dd6b0c0cc2f5ba3d9cac38", + "008b481f8678577d9cf6aa3f6cd6056b", + "00c4323ece5e4fe3b6cd4c5c932931af", + "009791f7550c3798c5a214cb2d0ea773", + "008a7baab22481f0ad8167dd9f90d55c", + "00f0e601519aafdc8ff94975e64c946d", + "0083b61e0daa9219df59d697c270cd31", + } + + for _, m := range ms { + seed, err := hex.DecodeString(m) + require.NoError(t, err) + + mnemonic, err := NewMnemonic(seed) + require.NoError(t, err) + + isValid := isMnemonicChecksumValid(strings.Split(mnemonic, " ")) + require.True(t, isValid) + } +} + +func TestEntropyFromMnemonic128(t *testing.T) { + testEntropyFromMnemonic(t, 128) +} + +func TestEntropyFromMnemonic160(t *testing.T) { + testEntropyFromMnemonic(t, 160) +} + +func TestEntropyFromMnemonic192(t *testing.T) { + testEntropyFromMnemonic(t, 192) +} + +func TestEntropyFromMnemonic224(t *testing.T) { + testEntropyFromMnemonic(t, 224) +} + +func TestEntropyFromMnemonic256(t *testing.T) { + testEntropyFromMnemonic(t, 256) +} + +func TestEntropyFromMnemonicInvalidChecksum(t *testing.T) { + _, err := EntropyFromMnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon yellow") + require.Equal(t, ErrChecksumIncorrect, err) +} + +func TestEntropyFromMnemonicInvalidMnemonicSize(t *testing.T) { + for _, mnemonic := range []string{ + "a a a a a a a a a a a a a a a a a a a a a a a a a", // Too many words + "a", // Too few + "a a a a a a a a a a a a a a", // Not multiple of 3 + } { + _, err := EntropyFromMnemonic(mnemonic) + require.Equal(t, ErrInvalidNumberOfWords, err) + } +} + +func testEntropyFromMnemonic(t *testing.T, bitSize int) { + for i := 0; i < 512; i++ { + expectedEntropy, err := NewEntropy(bitSize) + require.NoError(t, err) + require.True(t, len(expectedEntropy) != 0) + + mnemonic, err := NewMnemonic(expectedEntropy) + require.NoError(t, err) + require.True(t, len(mnemonic) != 0) + + actualEntropy, err := EntropyFromMnemonic(mnemonic) + require.NoError(t, err) + require.Equal(t, expectedEntropy, actualEntropy) + } +} + +func testVectors() []vector { + return []vector{ + { + entropy: "00000000000000000000000000000000", + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + seed: "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04", + }, + { + entropy: "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow", + seed: "2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607", + }, + { + entropy: "80808080808080808080808080808080", + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage above", + seed: "d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8", + }, + { + entropy: "ffffffffffffffffffffffffffffffff", + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", + seed: "ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069", + }, + { + entropy: "000000000000000000000000000000000000000000000000", + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", + seed: "035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa", + }, + { + entropy: "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", + seed: "f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd", + }, + { + entropy: "808080808080808080808080808080808080808080808080", + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", + seed: "107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65", + }, + { + entropy: "ffffffffffffffffffffffffffffffffffffffffffffffff", + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", + seed: "0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528", + }, + { + entropy: "0000000000000000000000000000000000000000000000000000000000000000", + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", + seed: "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8", + }, + { + entropy: "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", + seed: "bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87", + }, + { + entropy: "8080808080808080808080808080808080808080808080808080808080808080", + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", + seed: "c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f", + }, + { + entropy: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", + seed: "dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad", + }, + { + entropy: "77c2b00716cec7213839159e404db50d", + mnemonic: "jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge", + seed: "b5b6d0127db1a9d2226af0c3346031d77af31e918dba64287a1b44b8ebf63cdd52676f672a290aae502472cf2d602c051f3e6f18055e84e4c43897fc4e51a6ff", + }, + { + entropy: "b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b", + mnemonic: "renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap", + seed: "9248d83e06f4cd98debf5b6f010542760df925ce46cf38a1bdb4e4de7d21f5c39366941c69e1bdbf2966e0f6e6dbece898a0e2f0a4c2b3e640953dfe8b7bbdc5", + }, + { + entropy: "3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982", + mnemonic: "dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic", + seed: "ff7f3184df8696d8bef94b6c03114dbee0ef89ff938712301d27ed8336ca89ef9635da20af07d4175f2bf5f3de130f39c9d9e8dd0472489c19b1a020a940da67", + }, + { + entropy: "0460ef47585604c5660618db2e6a7e7f", + mnemonic: "afford alter spike radar gate glance object seek swamp infant panel yellow", + seed: "65f93a9f36b6c85cbe634ffc1f99f2b82cbb10b31edc7f087b4f6cb9e976e9faf76ff41f8f27c99afdf38f7a303ba1136ee48a4c1e7fcd3dba7aa876113a36e4", + }, + { + entropy: "72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f", + mnemonic: "indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left", + seed: "3bbf9daa0dfad8229786ace5ddb4e00fa98a044ae4c4975ffd5e094dba9e0bb289349dbe2091761f30f382d4e35c4a670ee8ab50758d2c55881be69e327117ba", + }, + { + entropy: "2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416", + mnemonic: "clutch control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste", + seed: "fe908f96f46668b2d5b37d82f558c77ed0d69dd0e7e043a5b0511c48c2f1064694a956f86360c93dd04052a8899497ce9e985ebe0c8c52b955e6ae86d4ff4449", + }, + { + entropy: "eaebabb2383351fd31d703840b32e9e2", + mnemonic: "turtle front uncle idea crush write shrug there lottery flower risk shell", + seed: "bdfb76a0759f301b0b899a1e3985227e53b3f51e67e3f2a65363caedf3e32fde42a66c404f18d7b05818c95ef3ca1e5146646856c461c073169467511680876c", + }, + { + entropy: "7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78", + mnemonic: "kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment", + seed: "ed56ff6c833c07982eb7119a8f48fd363c4a9b1601cd2de736b01045c5eb8ab4f57b079403485d1c4924f0790dc10a971763337cb9f9c62226f64fff26397c79", + }, + { + entropy: "4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef", + mnemonic: "exile ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top", + seed: "095ee6f817b4c2cb30a5a797360a81a40ab0f9a4e25ecd672a3f58a0b5ba0687c096a6b14d2c0deb3bdefce4f61d01ae07417d502429352e27695163f7447a8c", + }, + { + entropy: "18ab19a9f54a9274f03e5209a2ac8a91", + mnemonic: "board flee heavy tunnel powder denial science ski answer betray cargo cat", + seed: "6eff1bb21562918509c73cb990260db07c0ce34ff0e3cc4a8cb3276129fbcb300bddfe005831350efd633909f476c45c88253276d9fd0df6ef48609e8bb7dca8", + }, + { + entropy: "18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4", + mnemonic: "board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief", + seed: "f84521c777a13b61564234bf8f8b62b3afce27fc4062b51bb5e62bdfecb23864ee6ecf07c1d5a97c0834307c5c852d8ceb88e7c97923c0a3b496bedd4e5f88a9", + }, + { + entropy: "15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419", + mnemonic: "beyond stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut", + seed: "b15509eaa2d09d3efd3e006ef42151b30367dc6e3aa5e44caba3fe4d3e352e65101fbdb86a96776b91946ff06f8eac594dc6ee1d3e82a42dfe1b40fef6bcc3fd", + }, + } +} + +func badMnemonicSentences() []vector { + return []vector{ + { + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow yellow", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice caged above", + err: ErrUnknownWord, + }, + { + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo, wrong", + err: ErrUnknownWord, + }, + { + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will will will", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always.", + err: ErrUnknownWord, + }, + { + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo why", + err: ErrUnknownWord, + }, + { + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art art", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "legal winner thank year wave sausage worth useful legal winner thanks year wave worth useful legal winner thank year wave sausage worth title", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letters advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", + err: ErrUnknownWord, + }, + { + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo voted", + err: ErrUnknownWord, + }, + { + mnemonic: "jello better achieve collect unaware mountain thought cargo oxygen act hood bridge", + err: ErrUnknownWord, + }, + { + mnemonic: "renew, stay, biology, evidence, goat, welcome, casual, join, adapt, armor, shuffle, fault, little, machine, walk, stumble, urge, swap", + err: ErrUnknownWord, + }, + { + mnemonic: "dignity pass list indicate nasty", + err: ErrInvalidNumberOfWords, + }, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/example_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/example_test.go new file mode 100644 index 00000000..78fc9e62 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/example_test.go @@ -0,0 +1,37 @@ +package bip39_test + +import ( + "encoding/hex" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/bip39" +) + +func ExampleNewMnemonic() { + // the entropy can be any byte slice, generated how pleased, + // as long its bit size is a multiple of 32 and is within + // the inclusive range of {128,256} + entropy, err := hex.DecodeString("066dca1a2bb7e8a1db2832148ce9933eea0f3ac9548d793112d9a95c9407efad") + if err != nil { + panic(err) + } + + // generate a mnemomic + mnemomic, err := bip39.NewMnemonic(entropy) + if err != nil { + panic(err) + } + fmt.Println(mnemomic) + // output: + // all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform +} + +func ExampleNewSeed() { + seed, err := bip39.NewSeed("all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform", "TREZOR") + if err != nil { + panic(err) + } + fmt.Println(hex.EncodeToString(seed)) + // output: + // 26e975ec644423f4a4c4f4215ef09b4bd7ef924e85d1d17c4cf3f136c2863cf6df0a475045652c57eb5fb41513ca2a2d67722b77e954b4b3fc11f7590449191d +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go new file mode 100644 index 00000000..0ee29727 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt + // $ crc32 chinese_simplified.txt + // e3721bbf + checksum := crc32.ChecksumIEEE([]byte(chineseSimplified)) + if fmt.Sprintf("%x", checksum) != "e3721bbf" { + panic("chineseSimplified checksum invalid") + } +} + +// ChineseSimplified is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt +var ChineseSimplified = strings.Split(strings.TrimSpace(chineseSimplified), "\n") +var chineseSimplified = `çš„ +一 +是 +在 +ä¸ +了 +有 +å’Œ +人 +è¿™ +中 +大 +为 +上 +个 +国 +我 +以 +è¦ +ä»– +æ—¶ +æ¥ +用 +们 +生 +到 +作 +地 +于 +出 +å°± +分 +对 +æˆ +会 +å¯ +主 +å‘ +å¹´ +动 +åŒ +å·¥ +也 +能 +下 +过 +å­ +说 +产 +ç§ +é¢ +而 +æ–¹ +åŽ +多 +定 +è¡Œ +å­¦ +法 +所 +æ°‘ +å¾— +ç» +å +三 +之 +è¿› +ç€ +ç­‰ +部 +度 +家 +电 +力 +里 +如 +æ°´ +化 +高 +自 +二 +ç† +èµ· +å° +物 +现 +实 +加 +é‡ +都 +两 +体 +制 +机 +当 +使 +点 +从 +业 +本 +去 +把 +性 +好 +应 +å¼€ +它 +åˆ +还 +å›  +ç”± +å…¶ +些 +然 +å‰ +外 +天 +政 +å›› +æ—¥ +é‚£ +社 +义 +事 +å¹³ +å½¢ +相 +å…¨ +表 +é—´ +æ · +与 +å…³ +å„ +é‡ +æ–° +线 +内 +æ•° +æ­£ +心 +å +ä½  +明 +看 +原 +åˆ +么 +利 +比 +或 +但 +è´¨ +æ°” +第 +å‘ +é“ +命 +æ­¤ +å˜ +æ¡ +åª +没 +结 +解 +é—® +æ„ +建 +月 +å…¬ +æ—  +ç³» +军 +很 +情 +者 +最 +ç«‹ +代 +想 +å·² +通 +并 +æ +ç›´ +题 +å…š +程 +展 +五 +æžœ +æ–™ +象 +员 +é© +ä½ +å…¥ +常 +æ–‡ +总 +次 +å“ +å¼ +æ´» +设 +åŠ +管 +特 +件 +é•¿ +求 +è€ +头 +基 +资 +è¾¹ +æµ +è·¯ +级 +å°‘ +图 +å±± +统 +接 +知 +较 +å°† +组 +è§ +计 +别 +她 +手 +角 +期 +æ ¹ +论 +è¿ +农 +指 +几 +ä¹ +区 +强 +放 +决 +西 +被 +å¹² +åš +å¿… +战 +å…ˆ +回 +则 +ä»» +å– +æ® +处 +队 +å— +ç»™ +色 +å…‰ +é—¨ +å³ +ä¿ +æ²» +北 +造 +百 +规 +热 +领 +七 +æµ· +å£ +东 +导 +器 +压 +å¿— +世 +金 +增 +争 +济 +阶 +æ²¹ +æ€ +术 +æž +交 +å— +è” +什 +认 +å…­ +å…± +æƒ +收 +è¯ +改 +清 +美 +å† +采 +转 +æ›´ +å• +风 +切 +打 +白 +æ•™ +速 +花 +带 +安 +场 +身 +车 +例 +真 +务 +å…· +万 +æ¯ +ç›® +至 +è¾¾ +èµ° +积 +示 +è®® +声 +报 +æ–— +完 +ç±» +å…« +离 +åŽ +å +ç¡® +æ‰ +科 +å¼  +ä¿¡ +马 +节 +è¯ +ç±³ +æ•´ +空 +å…ƒ +况 +今 +集 +温 +ä¼  +土 +许 +æ­¥ +群 +广 +石 +è®° +需 +段 +ç ” +ç•Œ +拉 +æž— +律 +å« +且 +究 +观 +越 +织 +装 +å½± +ç®— +低 +æŒ +音 +ä¼— +书 +布 +å¤ +容 +å„¿ +é¡» +é™… +商 +éž +验 +è¿ž +æ–­ +æ·± +éš¾ +è¿‘ +矿 +åƒ +周 +委 +ç´  +技 +备 +åŠ +办 +é’ +çœ +列 +ä¹  +å“ +约 +支 +般 +å² +æ„Ÿ +劳 +便 +团 +å¾€ +é…¸ +历 +市 +å…‹ +何 +除 +消 +æž„ +府 +称 +太 +准 +ç²¾ +值 +å· +率 +æ— +ç»´ +划 +选 +æ ‡ +写 +å­˜ +候 +毛 +亲 +å¿« +效 +æ–¯ +院 +查 +江 +åž‹ +眼 +王 +按 +æ ¼ +å…» +易 +ç½® +æ´¾ +层 +片 +始 +å´ +专 +状 +育 +厂 +京 +识 +适 +属 +圆 +包 +ç« +ä½ +è°ƒ +满 +县 +å±€ +ç…§ +å‚ +红 +细 +引 +å¬ +该 +é“ +ä»· +严 +首 +底 +液 +官 +å¾· +éš +ç—… +è‹ +失 +å°” +æ­» +讲 +é… +女 +黄 +推 +显 +è°ˆ +罪 +神 +艺 +å‘¢ +席 +å« +ä¼ +望 +密 +批 +è¥ +项 +防 +举 +çƒ +英 +æ°§ +势 +å‘Š +æŽ +å° +è½ +木 +帮 +è½® +ç ´ +亚 +师 +å›´ +注 +è¿œ +å­— +æ +排 +ä¾› +æ²³ +æ€ +å° +å¦ +æ–½ +å‡ +æ ‘ +溶 +怎 +æ­¢ +案 +言 +士 +å‡ +æ­¦ +固 +å¶ +é±¼ +æ³¢ +视 +ä»… +è´¹ +ç´§ +爱 +å·¦ +ç«  +æ—© +æœ +害 +ç»­ +è½» +æœ +试 +食 +å…… +å…µ +æº +判 +护 +å¸ +足 +æŸ +练 +å·® +致 +æ¿ +ç”° +é™ +黑 +犯 +è´Ÿ +击 +范 +继 +å…´ +ä¼¼ +ä½™ +åš +曲 +输 +ä¿® +æ•… +城 +夫 +够 +é€ +笔 +船 +å  +å³ +è´¢ +åƒ +富 +春 +èŒ +觉 +汉 +ç”» +功 +å·´ +è·Ÿ +虽 +æ‚ +飞 +检 +å¸ +助 +å‡ +阳 +互 +åˆ +创 +抗 +考 +投 +å +ç­– +å¤ +径 +æ¢ +未 +è·‘ +ç•™ +é’¢ +曾 +端 +è´£ +ç«™ +简 +è¿° +é’± +副 +å°½ +å¸ +å°„ +è‰ +冲 +承 +独 +令 +é™ +阿 +宣 +环 +åŒ +请 +超 +å¾® +让 +控 +å·ž +良 +è½´ +找 +å¦ +纪 +益 +ä¾ +优 +顶 +ç¡€ +è½½ +倒 +房 +çª +å +粉 +æ•Œ +ç•¥ +客 +è¢ +冷 +胜 +ç» +æž +å— +剂 +测 +ä¸ +å +诉 +念 +陈 +ä» +ç½— +ç› +å‹ +æ´‹ +é”™ +苦 +夜 +刑 +移 +频 +é€ +é  +æ·· +æ¯ +短 +çš® +终 +èš +æ±½ +æ‘ +云 +哪 +æ—¢ +è· +å« +åœ +烈 +央 +察 +烧 +è¿… +境 +è‹¥ +å° +æ´² +刻 +括 +æ¿€ +å­” +æž +甚 +室 +å¾… +æ ¸ +æ ¡ +æ•£ +ä¾µ +å§ +甲 +游 +ä¹… +èœ +味 +æ—§ +模 +æ¹– +è´§ +æŸ +预 +阻 +毫 +æ™® +稳 +ä¹™ +妈 +æ¤ +æ¯ +扩 +银 +语 +挥 +é…’ +守 +æ‹¿ +åº +纸 +医 +缺 +雨 +å— +é’ˆ +刘 +å•Š +急 +å”± +误 +è®­ +æ„¿ +审 +附 +获 +茶 +鲜 +ç²® +æ–¤ +å­© +脱 +ç¡« +è‚¥ +å–„ +é¾™ +æ¼” +父 +æ¸ +è¡€ +欢 +械 +掌 +æ­Œ +æ²™ +刚 +æ”» +è°“ +盾 +讨 +晚 +ç²’ +ä¹± +燃 +矛 +乎 +æ€ +è¯ +å® +é² +è´µ +é’Ÿ +ç…¤ +读 +ç­ +伯 +香 +介 +è¿« +å¥ +丰 +培 +æ¡ +å…° +æ‹… +弦 +蛋 +沉 +å‡ +ç©¿ +执 +ç­” +ä¹ +è° +顺 +烟 +缩 +å¾ +脸 +å–œ +æ¾ +è„š +å›° +异 +å… +背 +星 +ç¦ +ä¹° +染 +井 +概 +æ…¢ +怕 +ç£ +å€ +祖 +皇 +促 +é™ +è¡¥ +评 +ç¿» +肉 +è·µ +å°¼ +è¡£ +宽 +扬 +棉 +希 +伤 +æ“ +åž‚ +秋 +宜 +æ°¢ +套 +ç£ +振 +架 +亮 +末 +宪 +庆 +ç¼– +牛 +触 +映 +é›· +销 +诗 +座 +å±… +抓 +裂 +胞 +呼 +娘 +景 +å¨ +绿 +晶 +厚 +盟 +è¡¡ +鸡 +å­™ +延 +å± +胶 +屋 +乡 +临 +陆 +顾 +掉 +å‘€ +ç¯ +å² +措 +æŸ +è€ +剧 +玉 +èµµ +è·³ +å“¥ +å­£ +课 +凯 +胡 +é¢ +款 +ç» +å· +é½ +伟 +è’¸ +æ®– +æ°¸ +å®— +è‹— +å· +炉 +岩 +å¼± +零 +æ¨ +å¥ +沿 +露 +æ† +探 +滑 +镇 +饭 +浓 +航 +怀 +赶 +库 +夺 +伊 +çµ +税 +途 +ç­ +èµ› +å½’ +å¬ +鼓 +æ’­ +盘 +è£ +险 +康 +唯 +录 +èŒ +纯 +借 +ç³– +ç›– +横 +符 +ç§ +努 +å ‚ +域 +枪 +润 +å¹… +哈 +ç«Ÿ +熟 +虫 +æ³½ +è„‘ +壤 +碳 +欧 +é +侧 +寨 +æ•¢ +å½» +虑 +æ–œ +è–„ +庭 +纳 +å¼¹ +饲 +伸 +折 +麦 +湿 +æš— +è· +瓦 +å¡ž +床 +ç­‘ +æ¶ +户 +访 +å¡” +奇 +é€ +æ¢ +刀 +æ—‹ +迹 +å¡ +æ°¯ +é‡ +份 +毒 +æ³¥ +退 +æ´— +摆 +ç° +彩 +å– +耗 +å¤ +æ‹© +å¿™ +é“œ +献 +硬 +予 +ç¹ +圈 +雪 +函 +亦 +抽 +篇 +阵 +阴 +ä¸ +å°º +追 +å † +雄 +è¿Ž +æ³› +爸 +楼 +é¿ +è°‹ +å¨ +野 +猪 +æ—— +ç´¯ +å +å…¸ +馆 +ç´¢ +秦 +è„‚ +æ½® +爷 +豆 +忽 +托 +惊 +å¡‘ +é— +愈 +朱 +替 +纤 +ç²— +倾 +å°š +ç—› +楚 +è°¢ +奋 +è´­ +磨 +å› +æ±  +æ— +碎 +骨 +监 +æ• +弟 +æš´ +割 +è´¯ +殊 +释 +è¯ +亡 +å£ +é¡¿ +å® +åˆ +å°˜ +é—» +æ­ +ç‚® +残 +冬 +æ¡¥ +妇 +è­¦ +综 +æ‹› +å´ +付 +æµ® +é­ +å¾ +您 +摇 +è°· +赞 +ç®± +éš” +订 +ç”· +å¹ +å›­ +纷 +å” +è´¥ +宋 +玻 +å·¨ +耕 +å¦ +è£ +é—­ +æ¹¾ +é”® +凡 +é©» +é”… +æ•‘ +æ© +剥 +å‡ +碱 +齿 +截 +炼 +麻 +纺 +ç¦ +废 +ç›› +版 +缓 +净 +ç› +昌 +å©š +涉 +ç­’ +嘴 +æ’ +岸 +朗 +庄 +è¡— +è— +姑 +è´¸ +è… +奴 +啦 +惯 +乘 +ä¼™ +æ¢ +匀 +纱 +扎 +辩 +耳 +彪 +臣 +亿 +ç’ƒ +抵 +脉 +秀 +è¨ +ä¿„ +网 +舞 +店 +å–· +纵 +寸 +æ±— +挂 +æ´ª +è´º +é—ª +柬 +爆 +烯 +æ´¥ +稻 +墙 +软 +勇 +åƒ +滚 +厘 +è’™ +芳 +肯 +å¡ +柱 +è¡ +è…¿ +仪 +æ—… +å°¾ +轧 +冰 +è´¡ +ç™» +黎 +削 +é’» +å‹’ +逃 +éšœ +æ°¨ +郭 +å³° +å¸ +港 +ä¼ +轨 +亩 +毕 +擦 +莫 +刺 +浪 +秘 +æ´ +æ ª +å¥ +å”® +è‚¡ +å²› +甘 +泡 +ç¡ +ç«¥ +铸 +汤 +阀 +休 +汇 +èˆ +牧 +绕 +炸 +哲 +磷 +绩 +朋 +æ·¡ +å°– +å¯ +é™· +柴 +呈 +å¾’ +颜 +泪 +ç¨ +忘 +æ³µ +è“ +æ‹– +æ´ž +授 +é•œ +è¾› +壮 +锋 +è´« +虚 +弯 +æ‘© +æ³° +å¹¼ +å»· +å°Š +窗 +纲 +弄 +隶 +ç–‘ +æ° +宫 +å§ +震 +ç‘ž +怪 +å°¤ +ç´ +循 +æ +膜 +è¿ +夹 +è…° +缘 +ç  +ç©· +森 +æž +竹 +沟 +催 +绳 +忆 +邦 +剩 +幸 +浆 +æ  +æ‹¥ +牙 +è´® +礼 +滤 +é’  +纹 +ç½¢ +æ‹ +å’± +å–Š +袖 +埃 +勤 +罚 +焦 +潜 +ä¼ +墨 +欲 +ç¼ +姓 +刊 +饱 +仿 +奖 +é“ +鬼 +丽 +è·¨ +默 +挖 +链 +扫 +å– +袋 +ç‚­ +污 +幕 +诸 +弧 +励 +梅 +奶 +æ´ +ç¾ +舟 +鉴 +苯 +讼 +抱 +æ¯ +懂 +寒 +智 +埔 +寄 +届 +è·ƒ +渡 +挑 +丹 +艰 +è´ +碰 +æ‹” +爹 +戴 +ç  +梦 +芽 +熔 +赤 +渔 +å“­ +敬 +颗 +奔 +é“… +仲 +虎 +稀 +妹 +ä¹ +ç +申 +æ¡Œ +éµ +å… +隆 +螺 +仓 +é­ +é” +晓 +æ°® +å…¼ +éš +ç¢ +赫 +拨 +å¿  +肃 +缸 +牵 +抢 +åš +å·§ +壳 +å…„ +æœ +讯 +诚 +碧 +祥 +柯 +页 +å·¡ +矩 +悲 +çŒ +龄 +伦 +票 +寻 +æ¡‚ +铺 +圣 +æ +æ° +郑 +趣 +抬 +è’ +è…¾ +è´´ +柔 +æ»´ +猛 +阔 +辆 +妻 +å¡« +æ’¤ +储 +ç­¾ +é—¹ +扰 +ç´« +ç ‚ +递 +æˆ +åŠ +陶 +ä¼ +å–‚ +ç–— +瓶 +婆 +抚 +臂 +摸 +å¿ +虾 +蜡 +é‚» +胸 +å·© +挤 +å¶ +弃 +槽 +劲 +ä¹³ +é‚“ +å‰ +ä» +烂 +ç – +租 +乌 +舰 +ä¼´ +ç“œ +æµ… +丙 +æš‚ +燥 +æ©¡ +柳 +è¿· +æš– +牌 +秧 +胆 +详 +ç°§ +è¸ +ç“· +è°± +呆 +宾 +糊 +æ´› +辉 +愤 +ç«ž +éš™ +怒 +粘 +乃 +绪 +è‚© +ç± +æ• +涂 +熙 +皆 +侦 +悬 +掘 +享 +纠 +醒 +ç‹‚ +é” +æ·€ +æ¨ +牲 +霸 +爬 +èµ +逆 +玩 +陵 +ç¥ +秒 +æµ™ +貌 +å½¹ +å½¼ +悉 +鸭 +趋 +凤 +晨 +ç•œ +辈 +秩 +åµ +ç½² +梯 +ç‚Ž +滩 +棋 +驱 +ç­› +峡 +冒 +å•¥ +寿 +译 +浸 +泉 +帽 +è¿Ÿ +ç¡… +ç–† +è´· +æ¼ +稿 +冠 +å«© +èƒ +芯 +牢 +å› +蚀 +奥 +鸣 +å²­ +羊 +凭 +串 +塘 +绘 +é…µ +èž +盆 +锡 +庙 +ç­¹ +冻 +è¾… +æ‘„ +袭 +ç­‹ +æ‹’ +僚 +æ—± +é’¾ +鸟 +漆 +沈 +眉 +ç– +æ·» +棒 +ç©— +ç¡ +韩 +逼 +扭 +侨 +凉 +挺 +碗 +æ ½ +ç‚’ +æ¯ +æ‚£ +é¦ +åŠ +豪 +è¾½ +勃 +鸿 +æ—¦ +å +æ‹œ +ç‹— +埋 +辊 +掩 +饮 +æ¬ +骂 +辞 +勾 +扣 +ä¼° +è’‹ +ç»’ +雾 +丈 +朵 +姆 +æ‹Ÿ +宇 +辑 +陕 +雕 +å¿ +è“„ +å´‡ +剪 +倡 +厅 +å’¬ +驶 +è–¯ +刷 +æ–¥ +番 +赋 +奉 +ä½› +浇 +漫 +曼 +扇 +é’™ +桃 +扶 +ä»” +è¿” +ä¿— +äº +è…” +éž‹ +棱 +覆 +框 +æ‚„ +å” +æ’ž +骗 +勘 +æ—º +沸 +å­¤ +å +å­Ÿ +渠 +屈 +ç–¾ +妙 +惜 +ä»° +ç‹  +胀 +è° +抛 +霉 +æ¡‘ +å²— +嘛 +è¡° +ç›— +渗 +è„ +èµ– +涌 +甜 +曹 +阅 +è‚Œ +å“© +厉 +烃 +纬 +毅 +昨 +伪 +ç—‡ +ç…® +å¹ +é’‰ +æ­ +茎 +笼 +é…· +å· +弓 +锥 +æ’ +æ° +å‘ +é¼» +翼 +纶 +å™ +狱 +逮 +ç½ +络 +棚 +抑 +膨 +蔬 +寺 +骤 +穆 +冶 +枯 +册 +å°¸ +凸 +ç»… +å¯ +牺 +ç„° +è½° +欣 +晋 +瘦 +御 +é”­ +锦 +丧 +æ—¬ +é”» +åž„ +æœ +扑 +é‚€ +亭 +é…¯ +迈 +舒 +脆 +é…¶ +é—² +忧 +é…š +顽 +ç¾½ +涨 +å¸ +ä»— +陪 +辟 +惩 +æ­ +姚 +è‚š +æ‰ +飘 +漂 +昆 +欺 +å¾ +郎 +烷 +æ± +呵 +饰 +è§ +é›… +é‚® +è¿ +燕 +æ’’ +姻 +èµ´ +å®´ +烦 +债 +å¸ +æ–‘ +铃 +æ—¨ +醇 +è‘£ +饼 +é› +姿 +æ‹Œ +å‚… +è…¹ +妥 +æ‰ +è´¤ +拆 +æ­ª +è‘¡ +胺 +丢 +浩 +å¾½ +昂 +åž« +挡 +览 +è´ª +æ…° +ç¼´ +汪 +æ…Œ +冯 +诺 +姜 +è°Š +凶 +劣 +诬 +耀 +æ˜ +躺 +盈 +骑 +ä¹” +溪 +丛 +å¢ +抹 +é—· +å’¨ +刮 +驾 +缆 +æ‚Ÿ +摘 +é“’ +掷 +颇 +å¹» +柄 +惠 +惨 +ä½³ +仇 +è…Š +çª +涤 +剑 +瞧 +å ¡ +æ³¼ +葱 +罩 +éœ +æž +胎 +è‹ +滨 +ä¿© +æ… +湘 +ç  +霞 +邵 +è„ +ç–¯ +æ·® +é‚ +熊 +粪 +烘 +宿 +æ¡£ +戈 +驳 +å«‚ +裕 +å¾™ +ç®­ +æ +è‚  +æ’‘ +æ™’ +辨 +殿 +莲 +æ‘Š +æ… +é…± +å± +ç–« +å“€ +蔡 +å µ +沫 +çš± +ç•… +å  +é˜ +莱 +敲 +è¾– +é’© +ç—• +å +å·· +饿 +祸 +丘 +玄 +溜 +æ›° +逻 +å½­ +å° +å¿ +妨 +艇 +åž +韦 +怨 +矮 +æ­‡ +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go new file mode 100644 index 00000000..83812cee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt + // $ crc32 chinese_traditional.txt + // 3c20b443 + checksum := crc32.ChecksumIEEE([]byte(chineseTraditional)) + if fmt.Sprintf("%x", checksum) != "3c20b443" { + panic("chineseTraditional checksum invalid") + } +} + +// ChineseTraditional is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt +var ChineseTraditional = strings.Split(strings.TrimSpace(chineseTraditional), "\n") +var chineseTraditional = `çš„ +一 +是 +在 +ä¸ +了 +有 +å’Œ +人 +這 +中 +大 +為 +上 +個 +國 +我 +以 +è¦ +ä»– +時 +來 +用 +們 +生 +到 +作 +地 +æ–¼ +出 +å°± +分 +å° +æˆ +會 +å¯ +主 +發 +å¹´ +å‹• +åŒ +å·¥ +也 +能 +下 +éŽ +å­ +說 +產 +種 +é¢ +而 +æ–¹ +後 +多 +定 +è¡Œ +å­¸ +法 +所 +æ°‘ +å¾— +經 +å +三 +之 +進 +è‘— +ç­‰ +部 +度 +家 +é›» +力 +裡 +如 +æ°´ +化 +高 +自 +二 +ç† +èµ· +å° +物 +ç¾ +實 +加 +é‡ +都 +å…© +é«” +制 +æ©Ÿ +當 +使 +點 +從 +業 +本 +去 +把 +性 +好 +應 +é–‹ +它 +åˆ +é‚„ +å›  +ç”± +å…¶ +些 +然 +å‰ +外 +天 +政 +å›› +æ—¥ +é‚£ +社 +義 +事 +å¹³ +å½¢ +相 +å…¨ +表 +é–“ +樣 +與 +é—œ +å„ +é‡ +æ–° +ç·š +å…§ +數 +æ­£ +心 +å +ä½  +明 +看 +原 +åˆ +麼 +利 +比 +或 +但 +質 +æ°£ +第 +å‘ +é“ +命 +æ­¤ +變 +æ¢ +åª +æ²’ +çµ +解 +å• +æ„ +建 +月 +å…¬ +ç„¡ +ç³» +è» +很 +情 +者 +最 +ç«‹ +代 +想 +å·² +通 +並 +æ +ç›´ +é¡Œ +黨 +程 +展 +五 +æžœ +æ–™ +象 +å“¡ +é© +ä½ +å…¥ +常 +æ–‡ +總 +次 +å“ +å¼ +æ´» +設 +åŠ +管 +特 +件 +é•· +求 +è€ +é ­ +基 +資 +é‚Š +æµ +è·¯ +ç´š +å°‘ +圖 +å±± +çµ± +接 +知 +較 +å°‡ +組 +見 +計 +別 +她 +手 +角 +期 +æ ¹ +è«– +é‹ +è¾² +指 +å¹¾ +ä¹ +å€ +å¼· +放 +決 +西 +被 +å¹¹ +åš +å¿… +戰 +å…ˆ +回 +則 +ä»» +å– +æ“š +處 +隊 +å— +給 +色 +å…‰ +é–€ +å³ +ä¿ +æ²» +北 +造 +百 +è¦ +熱 +é ˜ +七 +æµ· +å£ +æ± +å°Ž +器 +壓 +å¿— +世 +金 +增 +爭 +æ¿Ÿ +階 +æ²¹ +æ€ +è¡“ +極 +交 +å— +è¯ +什 +èª +å…­ +å…± +權 +收 +è­‰ +改 +清 +美 +å† +採 +轉 +æ›´ +å–® +風 +切 +打 +白 +æ•™ +速 +花 +帶 +安 +å ´ +身 +車 +例 +真 +å‹™ +å…· +è¬ +æ¯ +ç›® +至 +é” +èµ° +ç© +示 +è­° +è² +å ± +鬥 +完 +é¡ž +å…« +離 +è¯ +å +確 +æ‰ +科 +å¼µ +ä¿¡ +馬 +節 +話 +ç±³ +æ•´ +空 +å…ƒ +æ³ +今 +集 +溫 +傳 +土 +許 +æ­¥ +群 +廣 +石 +記 +需 +段 +ç ” +ç•Œ +拉 +æž— +律 +å« +且 +究 +觀 +越 +ç¹” +è£ +å½± +ç®— +低 +æŒ +音 +眾 +書 +布 +å¤ +容 +å…’ +é ˆ +éš› +商 +éž +é©— +連 +æ–· +æ·± +難 +è¿‘ +礦 +åƒ +週 +委 +ç´  +技 +å‚™ +åŠ +辦 +é’ +çœ +列 +ç¿’ +響 +ç´„ +支 +般 +å² +æ„Ÿ +å‹ž +便 +團 +å¾€ +é…¸ +æ­· +市 +å…‹ +何 +除 +消 +構 +府 +稱 +太 +準 +ç²¾ +值 +號 +率 +æ— +維 +劃 +é¸ +標 +寫 +å­˜ +候 +毛 +親 +å¿« +效 +æ–¯ +院 +查 +江 +åž‹ +眼 +王 +按 +æ ¼ +養 +易 +ç½® +æ´¾ +層 +片 +始 +å» +å°ˆ +ç‹€ +育 +å»  +京 +è­˜ +é© +屬 +圓 +包 +ç« +ä½ +調 +滿 +縣 +å±€ +ç…§ +åƒ +ç´… +ç´° +引 +è½ +該 +éµ +價 +åš´ +首 +底 +液 +官 +å¾· +隨 +ç—… +蘇 +失 +爾 +æ­» +講 +é… +女 +黃 +推 +顯 +談 +罪 +神 +è— +å‘¢ +席 +å« +ä¼ +望 +密 +批 +營 +é … +防 +舉 +çƒ +英 +æ°§ +å‹¢ +å‘Š +æŽ +å° +è½ +木 +幫 +輪 +ç ´ +亞 +師 +åœ +注 +é  +å­— +æ +排 +ä¾› +æ²³ +æ…‹ +å° +å¦ +æ–½ +減 +樹 +溶 +怎 +æ­¢ +案 +言 +士 +å‡ +æ­¦ +固 +葉 +é­š +æ³¢ +視 +僅 +è²» +ç·Š +æ„› +å·¦ +ç«  +æ—© +æœ +害 +續 +輕 +æœ +試 +食 +å…… +å…µ +æº +判 +è­· +å¸ +足 +æŸ +ç·´ +å·® +致 +æ¿ +ç”° +é™ +黑 +犯 +è²  +æ“Š +范 +ç¹¼ +興 +ä¼¼ +餘 +å … +曲 +輸 +ä¿® +æ•… +城 +夫 +夠 +é€ +ç­† +船 +ä½” +å³ +財 +åƒ +富 +春 +è· +覺 +æ¼¢ +ç•« +功 +å·´ +è·Ÿ +é›– +雜 +飛 +檢 +å¸ +助 +昇 +陽 +互 +åˆ +創 +抗 +考 +投 +壞 +ç­– +å¤ +徑 +æ› +未 +è·‘ +ç•™ +鋼 +曾 +端 +責 +ç«™ +ç°¡ +è¿° +錢 +副 +盡 +å¸ +å°„ +è‰ +è¡ +承 +ç¨ +令 +é™ +阿 +宣 +ç’° +é›™ +è«‹ +超 +å¾® +讓 +控 +å·ž +良 +軸 +找 +å¦ +ç´€ +益 +ä¾ +優 +é ‚ +礎 +載 +倒 +房 +çª +å +粉 +敵 +ç•¥ +客 +è¢ +冷 +å‹ +絕 +æž +å¡Š +劑 +測 +çµ² +å” +訴 +念 +陳 +ä» +ç¾… +é¹½ +å‹ +æ´‹ +錯 +苦 +夜 +刑 +移 +é » +é€ +é  +æ·· +æ¯ +短 +çš® +終 +èš +æ±½ +æ‘ +雲 +哪 +æ—¢ +è· +è¡› +åœ +烈 +央 +察 +燒 +è¿… +境 +è‹¥ +å° +æ´² +刻 +括 +æ¿€ +å­” +æž +甚 +室 +å¾… +æ ¸ +æ ¡ +æ•£ +ä¾µ +å§ +甲 +éŠ +ä¹… +èœ +味 +舊 +模 +æ¹– +貨 +æ +é  +阻 +毫 +æ™® +ç©© +ä¹™ +媽 +æ¤ +æ¯ +æ“´ +銀 +語 +æ® +é…’ +守 +æ‹¿ +åº +ç´™ +醫 +缺 +雨 +å—Ž +é‡ +劉 +å•Š +急 +å”± +誤 +訓 +願 +審 +附 +ç² +茶 +é®® +糧 +æ–¤ +å­© +è„« +ç¡« +è‚¥ +å–„ +é¾ +æ¼” +父 +漸 +è¡€ +æ­¡ +械 +掌 +æ­Œ +æ²™ +剛 +æ”» +謂 +盾 +討 +晚 +ç²’ +亂 +燃 +矛 +乎 +殺 +è—¥ +寧 +é­¯ +è²´ +é˜ +ç…¤ +讀 +ç­ +伯 +香 +介 +è¿« +å¥ +è± +培 +æ¡ +蘭 +æ“” +弦 +蛋 +沉 +å‡ +ç©¿ +執 +ç­” +樂 +誰 +é † +ç…™ +縮 +å¾µ +臉 +å–œ +æ¾ +è…³ +å›° +ç•° +å… +背 +星 +ç¦ +è²· +染 +井 +概 +æ…¢ +怕 +ç£ +å€ +祖 +皇 +促 +éœ +補 +è©• +ç¿» +肉 +è¸ +å°¼ +è¡£ +寬 +æš +棉 +希 +å‚· +æ“ +åž‚ +秋 +宜 +æ°« +套 +ç£ +振 +架 +亮 +末 +憲 +æ…¶ +ç·¨ +牛 +觸 +映 +é›· +銷 +è©© +座 +å±… +抓 +裂 +胞 +呼 +娘 +景 +å¨ +綠 +晶 +厚 +盟 +è¡¡ +雞 +å­« +延 +å± +膠 +屋 +鄉 +臨 +陸 +顧 +掉 +å‘€ +燈 +æ­² +措 +æŸ +è€ +劇 +玉 +趙 +è·³ +å“¥ +å­£ +課 +凱 +胡 +é¡ +款 +ç´¹ +å· +齊 +å‰ +è’¸ +æ®– +æ°¸ +å®— +è‹— +å· +çˆ +岩 +å¼± +零 +楊 +å¥ +沿 +露 +æ¡¿ +探 +滑 +鎮 +飯 +濃 +航 +懷 +趕 +庫 +奪 +伊 +éˆ +稅 +途 +æ»… +è³½ +æ­¸ +å¬ +鼓 +æ’­ +盤 +è£ +險 +康 +唯 +錄 +èŒ +ç´” +借 +ç³– +è“‹ +æ©« +符 +ç§ +努 +å ‚ +域 +æ§ +潤 +å¹… +哈 +ç«Ÿ +熟 +蟲 +澤 +è…¦ +壤 +碳 +æ­ +é +å´ +寨 +æ•¢ +å¾¹ +æ…® +æ–œ +è–„ +庭 +ç´ +彈 +飼 +伸 +折 +麥 +æ¿• +æš— +è· +瓦 +å¡ž +床 +築 +惡 +戶 +訪 +å¡” +奇 +é€ +æ¢ +刀 +æ—‹ +è·¡ +å¡ +æ°¯ +é‡ +份 +毒 +æ³¥ +退 +æ´— +擺 +ç° +彩 +è³£ +耗 +å¤ +擇 +å¿™ +銅 +ç» +硬 +予 +ç¹ +圈 +雪 +函 +亦 +抽 +篇 +陣 +é™° +ä¸ +å°º +追 +å † +雄 +è¿Ž +æ³› +爸 +樓 +é¿ +謀 +噸 +野 +豬 +æ—— +ç´¯ +å +å…¸ +館 +ç´¢ +秦 +è„‚ +æ½® +爺 +豆 +忽 +托 +é©š +å¡‘ +éº +愈 +朱 +替 +纖 +ç²— +傾 +å°š +ç—› +楚 +è¬ +奮 +è³¼ +磨 +å› +æ±  +æ— +碎 +骨 +監 +æ• +弟 +æš´ +割 +貫 +殊 +釋 +è©ž +亡 +å£ +é “ +寶 +åˆ +塵 +èž +æ­ +ç‚® +殘 +冬 +æ©‹ +婦 +è­¦ +綜 +æ‹› +å³ +付 +æµ® +é­ +å¾ +您 +æ– +è°· +è´Š +ç®± +éš” +訂 +ç”· +å¹ +園 +ç´› +å” +æ•— +宋 +玻 +å·¨ +耕 +å¦ +榮 +é–‰ +ç£ +éµ +凡 +é§ +é‹ +æ•‘ +æ© +å‰ +å‡ +é¹¼ +é½’ +截 +ç…‰ +麻 +ç´¡ +ç¦ +廢 +ç›› +版 +ç·© +æ·¨ +ç› +昌 +å©š +涉 +ç­’ +嘴 +æ’ +岸 +朗 +莊 +è¡— +è— +姑 +貿 +è… +奴 +啦 +æ…£ +乘 +夥 +æ¢ +å‹» +ç´— +扎 +辯 +耳 +彪 +臣 +å„„ +ç’ƒ +抵 +脈 +秀 +è–© +ä¿„ +網 +舞 +店 +å™´ +縱 +寸 +æ±— +掛 +æ´ª +è³€ +é–ƒ +柬 +爆 +烯 +æ´¥ +稻 +牆 +軟 +勇 +åƒ +滾 +厘 +è’™ +芳 +肯 +å¡ +柱 +盪 +è…¿ +å„€ +æ—… +å°¾ +軋 +冰 +è²¢ +ç™» +黎 +削 +鑽 +å‹’ +逃 +éšœ +æ°¨ +郭 +å³° +å¹£ +港 +ä¼ +軌 +ç• +ç•¢ +擦 +莫 +刺 +浪 +秘 +æ´ +æ ª +å¥ +å”® +è‚¡ +島 +甘 +泡 +ç¡ +ç«¥ +é‘„ +湯 +é–¥ +休 +匯 +èˆ +牧 +繞 +炸 +哲 +磷 +績 +朋 +æ·¡ +å°– +å•Ÿ +é™· +柴 +呈 +å¾’ +é¡ +æ·š +ç¨ +忘 +æ³µ +è— +æ‹– +æ´ž +授 +é¡ +è¾› +壯 +é‹’ +貧 +è™› +彎 +æ‘© +æ³° +å¹¼ +å»· +å°Š +窗 +綱 +弄 +隸 +ç–‘ +æ° +å®® +å§ +震 +ç‘ž +怪 +å°¤ +ç´ +循 +æ +膜 +é• +夾 +è…° +ç·£ +ç  +窮 +森 +æž +竹 +æº +催 +繩 +憶 +邦 +剩 +幸 +漿 +欄 +æ“ +牙 +貯 +禮 +濾 +鈉 +ç´‹ +ç½· +æ‹ +å’± +å–Š +袖 +埃 +勤 +ç½° +焦 +æ½› +ä¼ +墨 +欲 +縫 +姓 +刊 +飽 +仿 +çŽ +é‹ +鬼 +麗 +è·¨ +默 +挖 +éˆ +掃 +å– +袋 +ç‚­ +污 +幕 +諸 +弧 +勵 +梅 +奶 +æ½” +ç½ +舟 +é‘‘ +苯 +訟 +抱 +毀 +懂 +寒 +智 +埔 +寄 +屆 +èº +渡 +挑 +丹 +艱 +è² +碰 +æ‹” +爹 +戴 +碼 +夢 +芽 +熔 +赤 +æ¼ +å“­ +敬 +顆 +奔 +鉛 +仲 +虎 +稀 +妹 +ä¹ +ç +申 +æ¡Œ +éµ +å… +隆 +螺 +倉 +é­ +銳 +曉 +æ°® +å…¼ +éš± +礙 +赫 +æ’¥ +å¿  +è‚… +缸 +牽 +æ¶ +åš +å·§ +殼 +å…„ +æœ +訊 +誠 +碧 +祥 +柯 +é  +å·¡ +矩 +悲 +çŒ +齡 +倫 +票 +å°‹ +æ¡‚ +鋪 +è– +æ +æ° +é„­ +趣 +抬 +è’ +騰 +è²¼ +柔 +æ»´ +猛 +é—Š +è¼› +妻 +å¡« +æ’¤ +儲 +ç°½ +鬧 +擾 +ç´« +ç ‚ +éž +戲 +åŠ +陶 +ä¼ +餵 +療 +瓶 +婆 +æ’« +臂 +摸 +å¿ +è¦ +è Ÿ +é„° +胸 +éž +æ“  +å¶ +棄 +槽 +å‹ +ä¹³ +鄧 +å‰ +ä» +爛 +磚 +租 +çƒ +艦 +ä¼´ +ç“œ +æ·º +丙 +æš« +燥 +æ©¡ +柳 +è¿· +æš– +牌 +秧 +膽 +詳 +ç°§ +è¸ +ç“· +è­œ +呆 +賓 +糊 +æ´› +è¼ +憤 +競 +éš™ +怒 +粘 +乃 +ç·’ +è‚© +ç± +æ• +å¡— +熙 +皆 +åµ +懸 +掘 +享 +ç³¾ +醒 +ç‹‚ +鎖 +æ·€ +æ¨ +牲 +霸 +爬 +賞 +逆 +玩 +陵 +ç¥ +秒 +æµ™ +貌 +å½¹ +å½¼ +悉 +é´¨ +趨 +é³³ +晨 +ç•œ +輩 +秩 +åµ +ç½² +梯 +ç‚Ž +ç˜ +棋 +é©… +篩 +å³½ +冒 +å•¥ +壽 +è­¯ +浸 +泉 +帽 +é² +矽 +ç–† +貸 +æ¼ +稿 +冠 +å«© +è„… +芯 +牢 +å› +è• +奧 +é³´ +嶺 +羊 +憑 +串 +塘 +繪 +é…µ +èž +盆 +錫 +廟 +籌 +å‡ +è¼” +æ” +襲 +ç­‹ +æ‹’ +僚 +æ—± +鉀 +é³¥ +漆 +沈 +眉 +ç– +æ·» +棒 +ç©— +ç¡ +韓 +逼 +扭 +僑 +涼 +挺 +碗 +æ ½ +ç‚’ +æ¯ +æ‚£ +餾 +勸 +豪 +é¼ +勃 +é´» +æ—¦ +å +æ‹œ +ç‹— +埋 +è¼¥ +掩 +飲 +æ¬ +ç½µ +è¾­ +勾 +扣 +ä¼° +蔣 +絨 +霧 +丈 +朵 +姆 +擬 +宇 +輯 +é™ +雕 +å„Ÿ +è“„ +å´‡ +剪 +倡 +廳 +å’¬ +駛 +è–¯ +刷 +æ–¥ +番 +賦 +奉 +ä½› +澆 +漫 +曼 +扇 +鈣 +桃 +扶 +ä»” +è¿” +ä¿— +虧 +è…” +éž‹ +棱 +覆 +框 +æ‚„ +å” +æ’ž +騙 +勘 +æ—º +沸 +å­¤ +å +å­Ÿ +渠 +屈 +ç–¾ +妙 +惜 +ä»° +ç‹  +脹 +諧 +æ‹‹ +é»´ +æ¡‘ +å´— +嘛 +è¡° +盜 +滲 +臟 +è³´ +湧 +甜 +曹 +é–± +è‚Œ +å“© +厲 +烴 +ç·¯ +毅 +昨 +å½ +ç—‡ +ç…® +嘆 +釘 +æ­ +莖 +ç±  +é…· +å· +弓 +éŒ +æ† +å‚‘ +å‘ +é¼» +翼 +綸 +敘 +ç„ +逮 +ç½ +絡 +棚 +抑 +膨 +蔬 +寺 +é©Ÿ +穆 +冶 +枯 +冊 +å± +凸 +ç´³ +å¯ +犧 +ç„° +轟 +欣 +晉 +瘦 +禦 +錠 +錦 +å–ª +æ—¬ +é› +壟 +æœ +æ’² +é‚€ +亭 +é…¯ +é‚ +舒 +脆 +é…¶ +é–’ +憂 +é…š +é ‘ +ç¾½ +æ¼² +å¸ +ä»— +陪 +é—¢ +懲 +æ­ +姚 +è‚š +æ‰ +飄 +漂 +昆 +欺 +å¾ +郎 +烷 +æ± +呵 +飾 +è•­ +é›… +郵 +é· +燕 +æ’’ +姻 +èµ´ +å®´ +ç…© +債 +帳 +æ–‘ +鈴 +æ—¨ +醇 +è‘£ +餅 +é›› +姿 +æ‹Œ +å‚… +è…¹ +妥 +æ‰ +è³¢ +拆 +æ­ª +è‘¡ +胺 +丟 +浩 +å¾½ +昂 +墊 +æ“‹ +覽 +貪 +æ…° +ç¹³ +汪 +æ…Œ +馮 +諾 +姜 +誼 +å…‡ +劣 +誣 +耀 +æ˜ +躺 +盈 +騎 +å–¬ +溪 +å¢ +盧 +抹 +悶 +è«® +刮 +駕 +纜 +æ‚Ÿ +摘 +鉺 +擲 +é — +å¹» +柄 +惠 +æ…˜ +ä½³ +仇 +臘 +窩 +滌 +åŠ +瞧 +å ¡ +潑 +蔥 +罩 +éœ +æ’ˆ +胎 +è’¼ +濱 +倆 +æ… +湘 +ç  +霞 +邵 +è„ +瘋 +æ·® +é‚ +熊 +糞 +烘 +宿 +檔 +戈 +é§ +å«‚ +裕 +å¾™ +ç®­ +æ +è…¸ +æ’ +曬 +辨 +殿 +è“® +攤 +攪 +醬 +å± +ç–« +å“€ +蔡 +å µ +沫 +皺 +暢 +ç–Š +é–£ +èŠ +敲 +轄 +鉤 +ç—• +壩 +å·· +餓 +ç¦ +丘 +玄 +溜 +æ›° +é‚ +å½­ +嘗 +å¿ +妨 +艇 +åž +韋 +怨 +矮 +æ­‡ +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/english.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/english.go new file mode 100644 index 00000000..f69e8a47 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/english.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt + // $ crc32 english.txt + // c1dbd296 + checksum := crc32.ChecksumIEEE([]byte(english)) + if fmt.Sprintf("%x", checksum) != "c1dbd296" { + panic("english checksum invalid") + } +} + +// English is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt +var English = strings.Split(strings.TrimSpace(english), "\n") +var english = `abandon +ability +able +about +above +absent +absorb +abstract +absurd +abuse +access +accident +account +accuse +achieve +acid +acoustic +acquire +across +act +action +actor +actress +actual +adapt +add +addict +address +adjust +admit +adult +advance +advice +aerobic +affair +afford +afraid +again +age +agent +agree +ahead +aim +air +airport +aisle +alarm +album +alcohol +alert +alien +all +alley +allow +almost +alone +alpha +already +also +alter +always +amateur +amazing +among +amount +amused +analyst +anchor +ancient +anger +angle +angry +animal +ankle +announce +annual +another +answer +antenna +antique +anxiety +any +apart +apology +appear +apple +approve +april +arch +arctic +area +arena +argue +arm +armed +armor +army +around +arrange +arrest +arrive +arrow +art +artefact +artist +artwork +ask +aspect +assault +asset +assist +assume +asthma +athlete +atom +attack +attend +attitude +attract +auction +audit +august +aunt +author +auto +autumn +average +avocado +avoid +awake +aware +away +awesome +awful +awkward +axis +baby +bachelor +bacon +badge +bag +balance +balcony +ball +bamboo +banana +banner +bar +barely +bargain +barrel +base +basic +basket +battle +beach +bean +beauty +because +become +beef +before +begin +behave +behind +believe +below +belt +bench +benefit +best +betray +better +between +beyond +bicycle +bid +bike +bind +biology +bird +birth +bitter +black +blade +blame +blanket +blast +bleak +bless +blind +blood +blossom +blouse +blue +blur +blush +board +boat +body +boil +bomb +bone +bonus +book +boost +border +boring +borrow +boss +bottom +bounce +box +boy +bracket +brain +brand +brass +brave +bread +breeze +brick +bridge +brief +bright +bring +brisk +broccoli +broken +bronze +broom +brother +brown +brush +bubble +buddy +budget +buffalo +build +bulb +bulk +bullet +bundle +bunker +burden +burger +burst +bus +business +busy +butter +buyer +buzz +cabbage +cabin +cable +cactus +cage +cake +call +calm +camera +camp +can +canal +cancel +candy +cannon +canoe +canvas +canyon +capable +capital +captain +car +carbon +card +cargo +carpet +carry +cart +case +cash +casino +castle +casual +cat +catalog +catch +category +cattle +caught +cause +caution +cave +ceiling +celery +cement +census +century +cereal +certain +chair +chalk +champion +change +chaos +chapter +charge +chase +chat +cheap +check +cheese +chef +cherry +chest +chicken +chief +child +chimney +choice +choose +chronic +chuckle +chunk +churn +cigar +cinnamon +circle +citizen +city +civil +claim +clap +clarify +claw +clay +clean +clerk +clever +click +client +cliff +climb +clinic +clip +clock +clog +close +cloth +cloud +clown +club +clump +cluster +clutch +coach +coast +coconut +code +coffee +coil +coin +collect +color +column +combine +come +comfort +comic +common +company +concert +conduct +confirm +congress +connect +consider +control +convince +cook +cool +copper +copy +coral +core +corn +correct +cost +cotton +couch +country +couple +course +cousin +cover +coyote +crack +cradle +craft +cram +crane +crash +crater +crawl +crazy +cream +credit +creek +crew +cricket +crime +crisp +critic +crop +cross +crouch +crowd +crucial +cruel +cruise +crumble +crunch +crush +cry +crystal +cube +culture +cup +cupboard +curious +current +curtain +curve +cushion +custom +cute +cycle +dad +damage +damp +dance +danger +daring +dash +daughter +dawn +day +deal +debate +debris +decade +december +decide +decline +decorate +decrease +deer +defense +define +defy +degree +delay +deliver +demand +demise +denial +dentist +deny +depart +depend +deposit +depth +deputy +derive +describe +desert +design +desk +despair +destroy +detail +detect +develop +device +devote +diagram +dial +diamond +diary +dice +diesel +diet +differ +digital +dignity +dilemma +dinner +dinosaur +direct +dirt +disagree +discover +disease +dish +dismiss +disorder +display +distance +divert +divide +divorce +dizzy +doctor +document +dog +doll +dolphin +domain +donate +donkey +donor +door +dose +double +dove +draft +dragon +drama +drastic +draw +dream +dress +drift +drill +drink +drip +drive +drop +drum +dry +duck +dumb +dune +during +dust +dutch +duty +dwarf +dynamic +eager +eagle +early +earn +earth +easily +east +easy +echo +ecology +economy +edge +edit +educate +effort +egg +eight +either +elbow +elder +electric +elegant +element +elephant +elevator +elite +else +embark +embody +embrace +emerge +emotion +employ +empower +empty +enable +enact +end +endless +endorse +enemy +energy +enforce +engage +engine +enhance +enjoy +enlist +enough +enrich +enroll +ensure +enter +entire +entry +envelope +episode +equal +equip +era +erase +erode +erosion +error +erupt +escape +essay +essence +estate +eternal +ethics +evidence +evil +evoke +evolve +exact +example +excess +exchange +excite +exclude +excuse +execute +exercise +exhaust +exhibit +exile +exist +exit +exotic +expand +expect +expire +explain +expose +express +extend +extra +eye +eyebrow +fabric +face +faculty +fade +faint +faith +fall +false +fame +family +famous +fan +fancy +fantasy +farm +fashion +fat +fatal +father +fatigue +fault +favorite +feature +february +federal +fee +feed +feel +female +fence +festival +fetch +fever +few +fiber +fiction +field +figure +file +film +filter +final +find +fine +finger +finish +fire +firm +first +fiscal +fish +fit +fitness +fix +flag +flame +flash +flat +flavor +flee +flight +flip +float +flock +floor +flower +fluid +flush +fly +foam +focus +fog +foil +fold +follow +food +foot +force +forest +forget +fork +fortune +forum +forward +fossil +foster +found +fox +fragile +frame +frequent +fresh +friend +fringe +frog +front +frost +frown +frozen +fruit +fuel +fun +funny +furnace +fury +future +gadget +gain +galaxy +gallery +game +gap +garage +garbage +garden +garlic +garment +gas +gasp +gate +gather +gauge +gaze +general +genius +genre +gentle +genuine +gesture +ghost +giant +gift +giggle +ginger +giraffe +girl +give +glad +glance +glare +glass +glide +glimpse +globe +gloom +glory +glove +glow +glue +goat +goddess +gold +good +goose +gorilla +gospel +gossip +govern +gown +grab +grace +grain +grant +grape +grass +gravity +great +green +grid +grief +grit +grocery +group +grow +grunt +guard +guess +guide +guilt +guitar +gun +gym +habit +hair +half +hammer +hamster +hand +happy +harbor +hard +harsh +harvest +hat +have +hawk +hazard +head +health +heart +heavy +hedgehog +height +hello +helmet +help +hen +hero +hidden +high +hill +hint +hip +hire +history +hobby +hockey +hold +hole +holiday +hollow +home +honey +hood +hope +horn +horror +horse +hospital +host +hotel +hour +hover +hub +huge +human +humble +humor +hundred +hungry +hunt +hurdle +hurry +hurt +husband +hybrid +ice +icon +idea +identify +idle +ignore +ill +illegal +illness +image +imitate +immense +immune +impact +impose +improve +impulse +inch +include +income +increase +index +indicate +indoor +industry +infant +inflict +inform +inhale +inherit +initial +inject +injury +inmate +inner +innocent +input +inquiry +insane +insect +inside +inspire +install +intact +interest +into +invest +invite +involve +iron +island +isolate +issue +item +ivory +jacket +jaguar +jar +jazz +jealous +jeans +jelly +jewel +job +join +joke +journey +joy +judge +juice +jump +jungle +junior +junk +just +kangaroo +keen +keep +ketchup +key +kick +kid +kidney +kind +kingdom +kiss +kit +kitchen +kite +kitten +kiwi +knee +knife +knock +know +lab +label +labor +ladder +lady +lake +lamp +language +laptop +large +later +latin +laugh +laundry +lava +law +lawn +lawsuit +layer +lazy +leader +leaf +learn +leave +lecture +left +leg +legal +legend +leisure +lemon +lend +length +lens +leopard +lesson +letter +level +liar +liberty +library +license +life +lift +light +like +limb +limit +link +lion +liquid +list +little +live +lizard +load +loan +lobster +local +lock +logic +lonely +long +loop +lottery +loud +lounge +love +loyal +lucky +luggage +lumber +lunar +lunch +luxury +lyrics +machine +mad +magic +magnet +maid +mail +main +major +make +mammal +man +manage +mandate +mango +mansion +manual +maple +marble +march +margin +marine +market +marriage +mask +mass +master +match +material +math +matrix +matter +maximum +maze +meadow +mean +measure +meat +mechanic +medal +media +melody +melt +member +memory +mention +menu +mercy +merge +merit +merry +mesh +message +metal +method +middle +midnight +milk +million +mimic +mind +minimum +minor +minute +miracle +mirror +misery +miss +mistake +mix +mixed +mixture +mobile +model +modify +mom +moment +monitor +monkey +monster +month +moon +moral +more +morning +mosquito +mother +motion +motor +mountain +mouse +move +movie +much +muffin +mule +multiply +muscle +museum +mushroom +music +must +mutual +myself +mystery +myth +naive +name +napkin +narrow +nasty +nation +nature +near +neck +need +negative +neglect +neither +nephew +nerve +nest +net +network +neutral +never +news +next +nice +night +noble +noise +nominee +noodle +normal +north +nose +notable +note +nothing +notice +novel +now +nuclear +number +nurse +nut +oak +obey +object +oblige +obscure +observe +obtain +obvious +occur +ocean +october +odor +off +offer +office +often +oil +okay +old +olive +olympic +omit +once +one +onion +online +only +open +opera +opinion +oppose +option +orange +orbit +orchard +order +ordinary +organ +orient +original +orphan +ostrich +other +outdoor +outer +output +outside +oval +oven +over +own +owner +oxygen +oyster +ozone +pact +paddle +page +pair +palace +palm +panda +panel +panic +panther +paper +parade +parent +park +parrot +party +pass +patch +path +patient +patrol +pattern +pause +pave +payment +peace +peanut +pear +peasant +pelican +pen +penalty +pencil +people +pepper +perfect +permit +person +pet +phone +photo +phrase +physical +piano +picnic +picture +piece +pig +pigeon +pill +pilot +pink +pioneer +pipe +pistol +pitch +pizza +place +planet +plastic +plate +play +please +pledge +pluck +plug +plunge +poem +poet +point +polar +pole +police +pond +pony +pool +popular +portion +position +possible +post +potato +pottery +poverty +powder +power +practice +praise +predict +prefer +prepare +present +pretty +prevent +price +pride +primary +print +priority +prison +private +prize +problem +process +produce +profit +program +project +promote +proof +property +prosper +protect +proud +provide +public +pudding +pull +pulp +pulse +pumpkin +punch +pupil +puppy +purchase +purity +purpose +purse +push +put +puzzle +pyramid +quality +quantum +quarter +question +quick +quit +quiz +quote +rabbit +raccoon +race +rack +radar +radio +rail +rain +raise +rally +ramp +ranch +random +range +rapid +rare +rate +rather +raven +raw +razor +ready +real +reason +rebel +rebuild +recall +receive +recipe +record +recycle +reduce +reflect +reform +refuse +region +regret +regular +reject +relax +release +relief +rely +remain +remember +remind +remove +render +renew +rent +reopen +repair +repeat +replace +report +require +rescue +resemble +resist +resource +response +result +retire +retreat +return +reunion +reveal +review +reward +rhythm +rib +ribbon +rice +rich +ride +ridge +rifle +right +rigid +ring +riot +ripple +risk +ritual +rival +river +road +roast +robot +robust +rocket +romance +roof +rookie +room +rose +rotate +rough +round +route +royal +rubber +rude +rug +rule +run +runway +rural +sad +saddle +sadness +safe +sail +salad +salmon +salon +salt +salute +same +sample +sand +satisfy +satoshi +sauce +sausage +save +say +scale +scan +scare +scatter +scene +scheme +school +science +scissors +scorpion +scout +scrap +screen +script +scrub +sea +search +season +seat +second +secret +section +security +seed +seek +segment +select +sell +seminar +senior +sense +sentence +series +service +session +settle +setup +seven +shadow +shaft +shallow +share +shed +shell +sheriff +shield +shift +shine +ship +shiver +shock +shoe +shoot +shop +short +shoulder +shove +shrimp +shrug +shuffle +shy +sibling +sick +side +siege +sight +sign +silent +silk +silly +silver +similar +simple +since +sing +siren +sister +situate +six +size +skate +sketch +ski +skill +skin +skirt +skull +slab +slam +sleep +slender +slice +slide +slight +slim +slogan +slot +slow +slush +small +smart +smile +smoke +smooth +snack +snake +snap +sniff +snow +soap +soccer +social +sock +soda +soft +solar +soldier +solid +solution +solve +someone +song +soon +sorry +sort +soul +sound +soup +source +south +space +spare +spatial +spawn +speak +special +speed +spell +spend +sphere +spice +spider +spike +spin +spirit +split +spoil +sponsor +spoon +sport +spot +spray +spread +spring +spy +square +squeeze +squirrel +stable +stadium +staff +stage +stairs +stamp +stand +start +state +stay +steak +steel +stem +step +stereo +stick +still +sting +stock +stomach +stone +stool +story +stove +strategy +street +strike +strong +struggle +student +stuff +stumble +style +subject +submit +subway +success +such +sudden +suffer +sugar +suggest +suit +summer +sun +sunny +sunset +super +supply +supreme +sure +surface +surge +surprise +surround +survey +suspect +sustain +swallow +swamp +swap +swarm +swear +sweet +swift +swim +swing +switch +sword +symbol +symptom +syrup +system +table +tackle +tag +tail +talent +talk +tank +tape +target +task +taste +tattoo +taxi +teach +team +tell +ten +tenant +tennis +tent +term +test +text +thank +that +theme +then +theory +there +they +thing +this +thought +three +thrive +throw +thumb +thunder +ticket +tide +tiger +tilt +timber +time +tiny +tip +tired +tissue +title +toast +tobacco +today +toddler +toe +together +toilet +token +tomato +tomorrow +tone +tongue +tonight +tool +tooth +top +topic +topple +torch +tornado +tortoise +toss +total +tourist +toward +tower +town +toy +track +trade +traffic +tragic +train +transfer +trap +trash +travel +tray +treat +tree +trend +trial +tribe +trick +trigger +trim +trip +trophy +trouble +truck +true +truly +trumpet +trust +truth +try +tube +tuition +tumble +tuna +tunnel +turkey +turn +turtle +twelve +twenty +twice +twin +twist +two +type +typical +ugly +umbrella +unable +unaware +uncle +uncover +under +undo +unfair +unfold +unhappy +uniform +unique +unit +universe +unknown +unlock +until +unusual +unveil +update +upgrade +uphold +upon +upper +upset +urban +urge +usage +use +used +useful +useless +usual +utility +vacant +vacuum +vague +valid +valley +valve +van +vanish +vapor +various +vast +vault +vehicle +velvet +vendor +venture +venue +verb +verify +version +very +vessel +veteran +viable +vibrant +vicious +victory +video +view +village +vintage +violin +virtual +virus +visa +visit +visual +vital +vivid +vocal +voice +void +volcano +volume +vote +voyage +wage +wagon +wait +walk +wall +walnut +want +warfare +warm +warrior +wash +wasp +waste +water +wave +way +wealth +weapon +wear +weasel +weather +web +wedding +weekend +weird +welcome +west +wet +whale +what +wheat +wheel +when +where +whip +whisper +wide +width +wife +wild +will +win +window +wine +wing +wink +winner +winter +wire +wisdom +wise +wish +witness +wolf +woman +wonder +wood +wool +word +work +world +worry +worth +wrap +wreck +wrestle +wrist +write +wrong +yard +year +yellow +you +young +youth +zebra +zero +zone +zoo +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/french.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/french.go new file mode 100644 index 00000000..1ae685d3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/french.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt + // $ crc32 french.txt + // 3e56b216 + checksum := crc32.ChecksumIEEE([]byte(french)) + if fmt.Sprintf("%x", checksum) != "3e56b216" { + panic("french checksum invalid") + } +} + +// French is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt +var French = strings.Split(strings.TrimSpace(french), "\n") +var french = `abaisser +abandon +abdiquer +abeille +abolir +aborder +aboutir +aboyer +abrasif +abreuver +abriter +abroger +abrupt +absence +absolu +absurde +abusif +abyssal +acadeÌmie +acajou +acarien +accabler +accepter +acclamer +accolade +accroche +accuser +acerbe +achat +acheter +aciduler +acier +acompte +acqueÌrir +acronyme +acteur +actif +actuel +adepte +adeÌquat +adheÌsif +adjectif +adjuger +admettre +admirer +adopter +adorer +adoucir +adresse +adroit +adulte +adverbe +aeÌrer +aeÌronef +affaire +affecter +affiche +affreux +affubler +agacer +agencer +agile +agiter +agrafer +agreÌable +agrume +aider +aiguille +ailier +aimable +aisance +ajouter +ajuster +alarmer +alchimie +alerte +algeÌ€bre +algue +alieÌner +aliment +alleÌger +alliage +allouer +allumer +alourdir +alpaga +altesse +alveÌole +amateur +ambigu +ambre +ameÌnager +amertume +amidon +amiral +amorcer +amour +amovible +amphibie +ampleur +amusant +analyse +anaphore +anarchie +anatomie +ancien +aneÌantir +angle +angoisse +anguleux +animal +annexer +annonce +annuel +anodin +anomalie +anonyme +anormal +antenne +antidote +anxieux +apaiser +apeÌritif +aplanir +apologie +appareil +appeler +apporter +appuyer +aquarium +aqueduc +arbitre +arbuste +ardeur +ardoise +argent +arlequin +armature +armement +armoire +armure +arpenter +arracher +arriver +arroser +arsenic +arteÌriel +article +aspect +asphalte +aspirer +assaut +asservir +assiette +associer +assurer +asticot +astre +astuce +atelier +atome +atrium +atroce +attaque +attentif +attirer +attraper +aubaine +auberge +audace +audible +augurer +aurore +automne +autruche +avaler +avancer +avarice +avenir +averse +aveugle +aviateur +avide +avion +aviser +avoine +avouer +avril +axial +axiome +badge +bafouer +bagage +baguette +baignade +balancer +balcon +baleine +balisage +bambin +bancaire +bandage +banlieue +bannieÌ€re +banquier +barbier +baril +baron +barque +barrage +bassin +bastion +bataille +bateau +batterie +baudrier +bavarder +belette +beÌlier +belote +beÌneÌfice +berceau +berger +berline +bermuda +besace +besogne +beÌtail +beurre +biberon +bicycle +bidule +bijou +bilan +bilingue +billard +binaire +biologie +biopsie +biotype +biscuit +bison +bistouri +bitume +bizarre +blafard +blague +blanchir +blessant +blinder +blond +bloquer +blouson +bobard +bobine +boire +boiser +bolide +bonbon +bondir +bonheur +bonifier +bonus +bordure +borne +botte +boucle +boueux +bougie +boulon +bouquin +bourse +boussole +boutique +boxeur +branche +brasier +brave +brebis +breÌ€che +breuvage +bricoler +brigade +brillant +brioche +brique +brochure +broder +bronzer +brousse +broyeur +brume +brusque +brutal +bruyant +buffle +buisson +bulletin +bureau +burin +bustier +butiner +butoir +buvable +buvette +cabanon +cabine +cachette +cadeau +cadre +cafeÌine +caillou +caisson +calculer +calepin +calibre +calmer +calomnie +calvaire +camarade +cameÌra +camion +campagne +canal +caneton +canon +cantine +canular +capable +caporal +caprice +capsule +capter +capuche +carabine +carbone +caresser +caribou +carnage +carotte +carreau +carton +cascade +casier +casque +cassure +causer +caution +cavalier +caverne +caviar +ceÌdille +ceinture +ceÌleste +cellule +cendrier +censurer +central +cercle +ceÌreÌbral +cerise +cerner +cerveau +cesser +chagrin +chaise +chaleur +chambre +chance +chapitre +charbon +chasseur +chaton +chausson +chavirer +chemise +chenille +cheÌquier +chercher +cheval +chien +chiffre +chignon +chimeÌ€re +chiot +chlorure +chocolat +choisir +chose +chouette +chrome +chute +cigare +cigogne +cimenter +cineÌma +cintrer +circuler +cirer +cirque +citerne +citoyen +citron +civil +clairon +clameur +claquer +classe +clavier +client +cligner +climat +clivage +cloche +clonage +cloporte +cobalt +cobra +cocasse +cocotier +coder +codifier +coffre +cogner +coheÌsion +coiffer +coincer +coleÌ€re +colibri +colline +colmater +colonel +combat +comeÌdie +commande +compact +concert +conduire +confier +congeler +connoter +consonne +contact +convexe +copain +copie +corail +corbeau +cordage +corniche +corpus +correct +corteÌ€ge +cosmique +costume +coton +coude +coupure +courage +couteau +couvrir +coyote +crabe +crainte +cravate +crayon +creÌature +creÌditer +creÌmeux +creuser +crevette +cribler +crier +cristal +criteÌ€re +croire +croquer +crotale +crucial +cruel +crypter +cubique +cueillir +cuilleÌ€re +cuisine +cuivre +culminer +cultiver +cumuler +cupide +curatif +curseur +cyanure +cycle +cylindre +cynique +daigner +damier +danger +danseur +dauphin +deÌbattre +deÌbiter +deÌborder +deÌbrider +deÌbutant +deÌcaler +deÌcembre +deÌchirer +deÌcider +deÌclarer +deÌcorer +deÌcrire +deÌcupler +deÌdale +deÌductif +deÌesse +deÌfensif +deÌfiler +deÌfrayer +deÌgager +deÌgivrer +deÌglutir +deÌgrafer +deÌjeuner +deÌlice +deÌloger +demander +demeurer +deÌmolir +deÌnicher +deÌnouer +dentelle +deÌnuder +deÌpart +deÌpenser +deÌphaser +deÌplacer +deÌposer +deÌranger +deÌrober +deÌsastre +descente +deÌsert +deÌsigner +deÌsobeÌir +dessiner +destrier +deÌtacher +deÌtester +deÌtourer +deÌtresse +devancer +devenir +deviner +devoir +diable +dialogue +diamant +dicter +diffeÌrer +digeÌrer +digital +digne +diluer +dimanche +diminuer +dioxyde +directif +diriger +discuter +disposer +dissiper +distance +divertir +diviser +docile +docteur +dogme +doigt +domaine +domicile +dompter +donateur +donjon +donner +dopamine +dortoir +dorure +dosage +doseur +dossier +dotation +douanier +double +douceur +douter +doyen +dragon +draper +dresser +dribbler +droiture +duperie +duplexe +durable +durcir +dynastie +eÌblouir +eÌcarter +eÌcharpe +eÌchelle +eÌclairer +eÌclipse +eÌclore +eÌcluse +eÌcole +eÌconomie +eÌcorce +eÌcouter +eÌcraser +eÌcreÌmer +eÌcrivain +eÌcrou +eÌcume +eÌcureuil +eÌdifier +eÌduquer +effacer +effectif +effigie +effort +effrayer +effusion +eÌgaliser +eÌgarer +eÌjecter +eÌlaborer +eÌlargir +eÌlectron +eÌleÌgant +eÌleÌphant +eÌleÌ€ve +eÌligible +eÌlitisme +eÌloge +eÌlucider +eÌluder +emballer +embellir +embryon +eÌmeraude +eÌmission +emmener +eÌmotion +eÌmouvoir +empereur +employer +emporter +emprise +eÌmulsion +encadrer +encheÌ€re +enclave +encoche +endiguer +endosser +endroit +enduire +eÌnergie +enfance +enfermer +enfouir +engager +engin +englober +eÌnigme +enjamber +enjeu +enlever +ennemi +ennuyeux +enrichir +enrobage +enseigne +entasser +entendre +entier +entourer +entraver +eÌnumeÌrer +envahir +enviable +envoyer +enzyme +eÌolien +eÌpaissir +eÌpargne +eÌpatant +eÌpaule +eÌpicerie +eÌpideÌmie +eÌpier +eÌpilogue +eÌpine +eÌpisode +eÌpitaphe +eÌpoque +eÌpreuve +eÌprouver +eÌpuisant +eÌquerre +eÌquipe +eÌriger +eÌrosion +erreur +eÌruption +escalier +espadon +espeÌ€ce +espieÌ€gle +espoir +esprit +esquiver +essayer +essence +essieu +essorer +estime +estomac +estrade +eÌtageÌ€re +eÌtaler +eÌtanche +eÌtatique +eÌteindre +eÌtendoir +eÌternel +eÌthanol +eÌthique +ethnie +eÌtirer +eÌtoffer +eÌtoile +eÌtonnant +eÌtourdir +eÌtrange +eÌtroit +eÌtude +euphorie +eÌvaluer +eÌvasion +eÌventail +eÌvidence +eÌviter +eÌvolutif +eÌvoquer +exact +exageÌrer +exaucer +exceller +excitant +exclusif +excuse +exeÌcuter +exemple +exercer +exhaler +exhorter +exigence +exiler +exister +exotique +expeÌdier +explorer +exposer +exprimer +exquis +extensif +extraire +exulter +fable +fabuleux +facette +facile +facture +faiblir +falaise +fameux +famille +farceur +farfelu +farine +farouche +fasciner +fatal +fatigue +faucon +fautif +faveur +favori +feÌbrile +feÌconder +feÌdeÌrer +feÌlin +femme +feÌmur +fendoir +feÌodal +fermer +feÌroce +ferveur +festival +feuille +feutre +feÌvrier +fiasco +ficeler +fictif +fideÌ€le +figure +filature +filetage +filieÌ€re +filleul +filmer +filou +filtrer +financer +finir +fiole +firme +fissure +fixer +flairer +flamme +flasque +flatteur +fleÌau +fleÌ€che +fleur +flexion +flocon +flore +fluctuer +fluide +fluvial +folie +fonderie +fongible +fontaine +forcer +forgeron +formuler +fortune +fossile +foudre +fougeÌ€re +fouiller +foulure +fourmi +fragile +fraise +franchir +frapper +frayeur +freÌgate +freiner +frelon +freÌmir +freÌneÌsie +freÌ€re +friable +friction +frisson +frivole +froid +fromage +frontal +frotter +fruit +fugitif +fuite +fureur +furieux +furtif +fusion +futur +gagner +galaxie +galerie +gambader +garantir +gardien +garnir +garrigue +gazelle +gazon +geÌant +geÌlatine +geÌlule +gendarme +geÌneÌral +geÌnie +genou +gentil +geÌologie +geÌomeÌ€tre +geÌranium +germe +gestuel +geyser +gibier +gicler +girafe +givre +glace +glaive +glisser +globe +gloire +glorieux +golfeur +gomme +gonfler +gorge +gorille +goudron +gouffre +goulot +goupille +gourmand +goutte +graduel +graffiti +graine +grand +grappin +gratuit +gravir +grenat +griffure +griller +grimper +grogner +gronder +grotte +groupe +gruger +grutier +gruyeÌ€re +gueÌpard +guerrier +guide +guimauve +guitare +gustatif +gymnaste +gyrostat +habitude +hachoir +halte +hameau +hangar +hanneton +haricot +harmonie +harpon +hasard +heÌlium +heÌmatome +herbe +heÌrisson +hermine +heÌron +heÌsiter +heureux +hiberner +hibou +hilarant +histoire +hiver +homard +hommage +homogeÌ€ne +honneur +honorer +honteux +horde +horizon +horloge +hormone +horrible +houleux +housse +hublot +huileux +humain +humble +humide +humour +hurler +hydromel +hygieÌ€ne +hymne +hypnose +idylle +ignorer +iguane +illicite +illusion +image +imbiber +imiter +immense +immobile +immuable +impact +impeÌrial +implorer +imposer +imprimer +imputer +incarner +incendie +incident +incliner +incolore +indexer +indice +inductif +ineÌdit +ineptie +inexact +infini +infliger +informer +infusion +ingeÌrer +inhaler +inhiber +injecter +injure +innocent +inoculer +inonder +inscrire +insecte +insigne +insolite +inspirer +instinct +insulter +intact +intense +intime +intrigue +intuitif +inutile +invasion +inventer +inviter +invoquer +ironique +irradier +irreÌel +irriter +isoler +ivoire +ivresse +jaguar +jaillir +jambe +janvier +jardin +jauger +jaune +javelot +jetable +jeton +jeudi +jeunesse +joindre +joncher +jongler +joueur +jouissif +journal +jovial +joyau +joyeux +jubiler +jugement +junior +jupon +juriste +justice +juteux +juveÌnile +kayak +kimono +kiosque +label +labial +labourer +laceÌrer +lactose +lagune +laine +laisser +laitier +lambeau +lamelle +lampe +lanceur +langage +lanterne +lapin +largeur +larme +laurier +lavabo +lavoir +lecture +leÌgal +leÌger +leÌgume +lessive +lettre +levier +lexique +leÌzard +liasse +libeÌrer +libre +licence +licorne +lieÌ€ge +lieÌ€vre +ligature +ligoter +ligue +limer +limite +limonade +limpide +lineÌaire +lingot +lionceau +liquide +lisieÌ€re +lister +lithium +litige +littoral +livreur +logique +lointain +loisir +lombric +loterie +louer +lourd +loutre +louve +loyal +lubie +lucide +lucratif +lueur +lugubre +luisant +lumieÌ€re +lunaire +lundi +luron +lutter +luxueux +machine +magasin +magenta +magique +maigre +maillon +maintien +mairie +maison +majorer +malaxer +maleÌfice +malheur +malice +mallette +mammouth +mandater +maniable +manquant +manteau +manuel +marathon +marbre +marchand +mardi +maritime +marqueur +marron +marteler +mascotte +massif +mateÌriel +matieÌ€re +matraque +maudire +maussade +mauve +maximal +meÌchant +meÌconnu +meÌdaille +meÌdecin +meÌditer +meÌduse +meilleur +meÌlange +meÌlodie +membre +meÌmoire +menacer +mener +menhir +mensonge +mentor +mercredi +meÌrite +merle +messager +mesure +meÌtal +meÌteÌore +meÌthode +meÌtier +meuble +miauler +microbe +miette +mignon +migrer +milieu +million +mimique +mince +mineÌral +minimal +minorer +minute +miracle +miroiter +missile +mixte +mobile +moderne +moelleux +mondial +moniteur +monnaie +monotone +monstre +montagne +monument +moqueur +morceau +morsure +mortier +moteur +motif +mouche +moufle +moulin +mousson +mouton +mouvant +multiple +munition +muraille +mureÌ€ne +murmure +muscle +museÌum +musicien +mutation +muter +mutuel +myriade +myrtille +mysteÌ€re +mythique +nageur +nappe +narquois +narrer +natation +nation +nature +naufrage +nautique +navire +neÌbuleux +nectar +neÌfaste +neÌgation +neÌgliger +neÌgocier +neige +nerveux +nettoyer +neurone +neutron +neveu +niche +nickel +nitrate +niveau +noble +nocif +nocturne +noirceur +noisette +nomade +nombreux +nommer +normatif +notable +notifier +notoire +nourrir +nouveau +novateur +novembre +novice +nuage +nuancer +nuire +nuisible +numeÌro +nuptial +nuque +nutritif +obeÌir +objectif +obliger +obscur +observer +obstacle +obtenir +obturer +occasion +occuper +oceÌan +octobre +octroyer +octupler +oculaire +odeur +odorant +offenser +officier +offrir +ogive +oiseau +oisillon +olfactif +olivier +ombrage +omettre +onctueux +onduler +oneÌreux +onirique +opale +opaque +opeÌrer +opinion +opportun +opprimer +opter +optique +orageux +orange +orbite +ordonner +oreille +organe +orgueil +orifice +ornement +orque +ortie +osciller +osmose +ossature +otarie +ouragan +ourson +outil +outrager +ouvrage +ovation +oxyde +oxygeÌ€ne +ozone +paisible +palace +palmareÌ€s +palourde +palper +panache +panda +pangolin +paniquer +panneau +panorama +pantalon +papaye +papier +papoter +papyrus +paradoxe +parcelle +paresse +parfumer +parler +parole +parrain +parsemer +partager +parure +parvenir +passion +pasteÌ€que +paternel +patience +patron +pavillon +pavoiser +payer +paysage +peigne +peintre +pelage +peÌlican +pelle +pelouse +peluche +pendule +peÌneÌtrer +peÌnible +pensif +peÌnurie +peÌpite +peÌplum +perdrix +perforer +peÌriode +permuter +perplexe +persil +perte +peser +peÌtale +petit +peÌtrir +peuple +pharaon +phobie +phoque +photon +phrase +physique +piano +pictural +pieÌ€ce +pierre +pieuvre +pilote +pinceau +pipette +piquer +pirogue +piscine +piston +pivoter +pixel +pizza +placard +plafond +plaisir +planer +plaque +plastron +plateau +pleurer +plexus +pliage +plomb +plonger +pluie +plumage +pochette +poeÌsie +poeÌ€te +pointe +poirier +poisson +poivre +polaire +policier +pollen +polygone +pommade +pompier +ponctuel +pondeÌrer +poney +portique +position +posseÌder +posture +potager +poteau +potion +pouce +poulain +poumon +pourpre +poussin +pouvoir +prairie +pratique +preÌcieux +preÌdire +preÌfixe +preÌlude +preÌnom +preÌsence +preÌtexte +preÌvoir +primitif +prince +prison +priver +probleÌ€me +proceÌder +prodige +profond +progreÌ€s +proie +projeter +prologue +promener +propre +prospeÌ€re +proteÌger +prouesse +proverbe +prudence +pruneau +psychose +public +puceron +puiser +pulpe +pulsar +punaise +punitif +pupitre +purifier +puzzle +pyramide +quasar +querelle +question +quieÌtude +quitter +quotient +racine +raconter +radieux +ragondin +raideur +raisin +ralentir +rallonge +ramasser +rapide +rasage +ratisser +ravager +ravin +rayonner +reÌactif +reÌagir +reÌaliser +reÌanimer +recevoir +reÌciter +reÌclamer +reÌcolter +recruter +reculer +recycler +reÌdiger +redouter +refaire +reÌflexe +reÌformer +refrain +refuge +reÌgalien +reÌgion +reÌglage +reÌgulier +reÌiteÌrer +rejeter +rejouer +relatif +relever +relief +remarque +remeÌ€de +remise +remonter +remplir +remuer +renard +renfort +renifler +renoncer +rentrer +renvoi +replier +reporter +reprise +reptile +requin +reÌserve +reÌsineux +reÌsoudre +respect +rester +reÌsultat +reÌtablir +retenir +reÌticule +retomber +retracer +reÌunion +reÌussir +revanche +revivre +reÌvolte +reÌvulsif +richesse +rideau +rieur +rigide +rigoler +rincer +riposter +risible +risque +rituel +rival +rivieÌ€re +rocheux +romance +rompre +ronce +rondin +roseau +rosier +rotatif +rotor +rotule +rouge +rouille +rouleau +routine +royaume +ruban +rubis +ruche +ruelle +rugueux +ruiner +ruisseau +ruser +rustique +rythme +sabler +saboter +sabre +sacoche +safari +sagesse +saisir +salade +salive +salon +saluer +samedi +sanction +sanglier +sarcasme +sardine +saturer +saugrenu +saumon +sauter +sauvage +savant +savonner +scalpel +scandale +sceÌleÌrat +sceÌnario +sceptre +scheÌma +science +scinder +score +scrutin +sculpter +seÌance +seÌcable +seÌcher +secouer +seÌcreÌter +seÌdatif +seÌduire +seigneur +seÌjour +seÌlectif +semaine +sembler +semence +seÌminal +seÌnateur +sensible +sentence +seÌparer +seÌquence +serein +sergent +seÌrieux +serrure +seÌrum +service +seÌsame +seÌvir +sevrage +sextuple +sideÌral +sieÌ€cle +sieÌger +siffler +sigle +signal +silence +silicium +simple +sinceÌ€re +sinistre +siphon +sirop +sismique +situer +skier +social +socle +sodium +soigneux +soldat +soleil +solitude +soluble +sombre +sommeil +somnoler +sonde +songeur +sonnette +sonore +sorcier +sortir +sosie +sottise +soucieux +soudure +souffle +soulever +soupape +source +soutirer +souvenir +spacieux +spatial +speÌcial +spheÌ€re +spiral +stable +station +sternum +stimulus +stipuler +strict +studieux +stupeur +styliste +sublime +substrat +subtil +subvenir +succeÌ€s +sucre +suffixe +suggeÌrer +suiveur +sulfate +superbe +supplier +surface +suricate +surmener +surprise +sursaut +survie +suspect +syllabe +symbole +symeÌtrie +synapse +syntaxe +systeÌ€me +tabac +tablier +tactile +tailler +talent +talisman +talonner +tambour +tamiser +tangible +tapis +taquiner +tarder +tarif +tartine +tasse +tatami +tatouage +taupe +taureau +taxer +teÌmoin +temporel +tenaille +tendre +teneur +tenir +tension +terminer +terne +terrible +teÌtine +texte +theÌ€me +theÌorie +theÌrapie +thorax +tibia +tieÌ€de +timide +tirelire +tiroir +tissu +titane +titre +tituber +toboggan +toleÌrant +tomate +tonique +tonneau +toponyme +torche +tordre +tornade +torpille +torrent +torse +tortue +totem +toucher +tournage +tousser +toxine +traction +trafic +tragique +trahir +train +trancher +travail +treÌ€fle +tremper +treÌsor +treuil +triage +tribunal +tricoter +trilogie +triomphe +tripler +triturer +trivial +trombone +tronc +tropical +troupeau +tuile +tulipe +tumulte +tunnel +turbine +tuteur +tutoyer +tuyau +tympan +typhon +typique +tyran +ubuesque +ultime +ultrason +unanime +unifier +union +unique +unitaire +univers +uranium +urbain +urticant +usage +usine +usuel +usure +utile +utopie +vacarme +vaccin +vagabond +vague +vaillant +vaincre +vaisseau +valable +valise +vallon +valve +vampire +vanille +vapeur +varier +vaseux +vassal +vaste +vecteur +vedette +veÌgeÌtal +veÌhicule +veinard +veÌloce +vendredi +veÌneÌrer +venger +venimeux +ventouse +verdure +veÌrin +vernir +verrou +verser +vertu +veston +veÌteÌran +veÌtuste +vexant +vexer +viaduc +viande +victoire +vidange +videÌo +vignette +vigueur +vilain +village +vinaigre +violon +vipeÌ€re +virement +virtuose +virus +visage +viseur +vision +visqueux +visuel +vital +vitesse +viticole +vitrine +vivace +vivipare +vocation +voguer +voile +voisin +voiture +volaille +volcan +voltiger +volume +vorace +vortex +voter +vouloir +voyage +voyelle +wagon +xeÌnon +yacht +zeÌ€bre +zeÌnith +zeste +zoologie +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/italian.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/italian.go new file mode 100644 index 00000000..32cd2cf6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/italian.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt + // $ crc32 italian.txt + // 2fc7d07e + checksum := crc32.ChecksumIEEE([]byte(italian)) + if fmt.Sprintf("%x", checksum) != "2fc7d07e" { + panic("italian checksum invalid") + } +} + +// Italian is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt +var Italian = strings.Split(strings.TrimSpace(italian), "\n") +var italian = `abaco +abbaglio +abbinato +abete +abisso +abolire +abrasivo +abrogato +accadere +accenno +accusato +acetone +achille +acido +acqua +acre +acrilico +acrobata +acuto +adagio +addebito +addome +adeguato +aderire +adipe +adottare +adulare +affabile +affetto +affisso +affranto +aforisma +afoso +africano +agave +agente +agevole +aggancio +agire +agitare +agonismo +agricolo +agrumeto +aguzzo +alabarda +alato +albatro +alberato +albo +albume +alce +alcolico +alettone +alfa +algebra +aliante +alibi +alimento +allagato +allegro +allievo +allodola +allusivo +almeno +alogeno +alpaca +alpestre +altalena +alterno +alticcio +altrove +alunno +alveolo +alzare +amalgama +amanita +amarena +ambito +ambrato +ameba +america +ametista +amico +ammasso +ammenda +ammirare +ammonito +amore +ampio +ampliare +amuleto +anacardo +anagrafe +analista +anarchia +anatra +anca +ancella +ancora +andare +andrea +anello +angelo +angolare +angusto +anima +annegare +annidato +anno +annuncio +anonimo +anticipo +anzi +apatico +apertura +apode +apparire +appetito +appoggio +approdo +appunto +aprile +arabica +arachide +aragosta +araldica +arancio +aratura +arazzo +arbitro +archivio +ardito +arenile +argento +argine +arguto +aria +armonia +arnese +arredato +arringa +arrosto +arsenico +arso +artefice +arzillo +asciutto +ascolto +asepsi +asettico +asfalto +asino +asola +aspirato +aspro +assaggio +asse +assoluto +assurdo +asta +astenuto +astice +astratto +atavico +ateismo +atomico +atono +attesa +attivare +attorno +attrito +attuale +ausilio +austria +autista +autonomo +autunno +avanzato +avere +avvenire +avviso +avvolgere +azione +azoto +azzimo +azzurro +babele +baccano +bacino +baco +badessa +badilata +bagnato +baita +balcone +baldo +balena +ballata +balzano +bambino +bandire +baraonda +barbaro +barca +baritono +barlume +barocco +basilico +basso +batosta +battuto +baule +bava +bavosa +becco +beffa +belgio +belva +benda +benevole +benigno +benzina +bere +berlina +beta +bibita +bici +bidone +bifido +biga +bilancia +bimbo +binocolo +biologo +bipede +bipolare +birbante +birra +biscotto +bisesto +bisnonno +bisonte +bisturi +bizzarro +blando +blatta +bollito +bonifico +bordo +bosco +botanico +bottino +bozzolo +braccio +bradipo +brama +branca +bravura +bretella +brevetto +brezza +briglia +brillante +brindare +broccolo +brodo +bronzina +brullo +bruno +bubbone +buca +budino +buffone +buio +bulbo +buono +burlone +burrasca +bussola +busta +cadetto +caduco +calamaro +calcolo +calesse +calibro +calmo +caloria +cambusa +camerata +camicia +cammino +camola +campale +canapa +candela +cane +canino +canotto +cantina +capace +capello +capitolo +capogiro +cappero +capra +capsula +carapace +carcassa +cardo +carisma +carovana +carretto +cartolina +casaccio +cascata +caserma +caso +cassone +castello +casuale +catasta +catena +catrame +cauto +cavillo +cedibile +cedrata +cefalo +celebre +cellulare +cena +cenone +centesimo +ceramica +cercare +certo +cerume +cervello +cesoia +cespo +ceto +chela +chiaro +chicca +chiedere +chimera +china +chirurgo +chitarra +ciao +ciclismo +cifrare +cigno +cilindro +ciottolo +circa +cirrosi +citrico +cittadino +ciuffo +civetta +civile +classico +clinica +cloro +cocco +codardo +codice +coerente +cognome +collare +colmato +colore +colposo +coltivato +colza +coma +cometa +commando +comodo +computer +comune +conciso +condurre +conferma +congelare +coniuge +connesso +conoscere +consumo +continuo +convegno +coperto +copione +coppia +copricapo +corazza +cordata +coricato +cornice +corolla +corpo +corredo +corsia +cortese +cosmico +costante +cottura +covato +cratere +cravatta +creato +credere +cremoso +crescita +creta +criceto +crinale +crisi +critico +croce +cronaca +crostata +cruciale +crusca +cucire +cuculo +cugino +cullato +cupola +curatore +cursore +curvo +cuscino +custode +dado +daino +dalmata +damerino +daniela +dannoso +danzare +datato +davanti +davvero +debutto +decennio +deciso +declino +decollo +decreto +dedicato +definito +deforme +degno +delegare +delfino +delirio +delta +demenza +denotato +dentro +deposito +derapata +derivare +deroga +descritto +deserto +desiderio +desumere +detersivo +devoto +diametro +dicembre +diedro +difeso +diffuso +digerire +digitale +diluvio +dinamico +dinnanzi +dipinto +diploma +dipolo +diradare +dire +dirotto +dirupo +disagio +discreto +disfare +disgelo +disposto +distanza +disumano +dito +divano +divelto +dividere +divorato +doblone +docente +doganale +dogma +dolce +domato +domenica +dominare +dondolo +dono +dormire +dote +dottore +dovuto +dozzina +drago +druido +dubbio +dubitare +ducale +duna +duomo +duplice +duraturo +ebano +eccesso +ecco +eclissi +economia +edera +edicola +edile +editoria +educare +egemonia +egli +egoismo +egregio +elaborato +elargire +elegante +elencato +eletto +elevare +elfico +elica +elmo +elsa +eluso +emanato +emblema +emesso +emiro +emotivo +emozione +empirico +emulo +endemico +enduro +energia +enfasi +enoteca +entrare +enzima +epatite +epilogo +episodio +epocale +eppure +equatore +erario +erba +erboso +erede +eremita +erigere +ermetico +eroe +erosivo +errante +esagono +esame +esanime +esaudire +esca +esempio +esercito +esibito +esigente +esistere +esito +esofago +esortato +esoso +espanso +espresso +essenza +esso +esteso +estimare +estonia +estroso +esultare +etilico +etnico +etrusco +etto +euclideo +europa +evaso +evidenza +evitato +evoluto +evviva +fabbrica +faccenda +fachiro +falco +famiglia +fanale +fanfara +fango +fantasma +fare +farfalla +farinoso +farmaco +fascia +fastoso +fasullo +faticare +fato +favoloso +febbre +fecola +fede +fegato +felpa +feltro +femmina +fendere +fenomeno +fermento +ferro +fertile +fessura +festivo +fetta +feudo +fiaba +fiducia +fifa +figurato +filo +finanza +finestra +finire +fiore +fiscale +fisico +fiume +flacone +flamenco +flebo +flemma +florido +fluente +fluoro +fobico +focaccia +focoso +foderato +foglio +folata +folclore +folgore +fondente +fonetico +fonia +fontana +forbito +forchetta +foresta +formica +fornaio +foro +fortezza +forzare +fosfato +fosso +fracasso +frana +frassino +fratello +freccetta +frenata +fresco +frigo +frollino +fronde +frugale +frutta +fucilata +fucsia +fuggente +fulmine +fulvo +fumante +fumetto +fumoso +fune +funzione +fuoco +furbo +furgone +furore +fuso +futile +gabbiano +gaffe +galateo +gallina +galoppo +gambero +gamma +garanzia +garbo +garofano +garzone +gasdotto +gasolio +gastrico +gatto +gaudio +gazebo +gazzella +geco +gelatina +gelso +gemello +gemmato +gene +genitore +gennaio +genotipo +gergo +ghepardo +ghiaccio +ghisa +giallo +gilda +ginepro +giocare +gioiello +giorno +giove +girato +girone +gittata +giudizio +giurato +giusto +globulo +glutine +gnomo +gobba +golf +gomito +gommone +gonfio +gonna +governo +gracile +grado +grafico +grammo +grande +grattare +gravoso +grazia +greca +gregge +grifone +grigio +grinza +grotta +gruppo +guadagno +guaio +guanto +guardare +gufo +guidare +ibernato +icona +identico +idillio +idolo +idra +idrico +idrogeno +igiene +ignaro +ignorato +ilare +illeso +illogico +illudere +imballo +imbevuto +imbocco +imbuto +immane +immerso +immolato +impacco +impeto +impiego +importo +impronta +inalare +inarcare +inattivo +incanto +incendio +inchino +incisivo +incluso +incontro +incrocio +incubo +indagine +india +indole +inedito +infatti +infilare +inflitto +ingaggio +ingegno +inglese +ingordo +ingrosso +innesco +inodore +inoltrare +inondato +insano +insetto +insieme +insonnia +insulina +intasato +intero +intonaco +intuito +inumidire +invalido +invece +invito +iperbole +ipnotico +ipotesi +ippica +iride +irlanda +ironico +irrigato +irrorare +isolato +isotopo +isterico +istituto +istrice +italia +iterare +labbro +labirinto +lacca +lacerato +lacrima +lacuna +laddove +lago +lampo +lancetta +lanterna +lardoso +larga +laringe +lastra +latenza +latino +lattuga +lavagna +lavoro +legale +leggero +lembo +lentezza +lenza +leone +lepre +lesivo +lessato +lesto +letterale +leva +levigato +libero +lido +lievito +lilla +limatura +limitare +limpido +lineare +lingua +liquido +lira +lirica +lisca +lite +litigio +livrea +locanda +lode +logica +lombare +londra +longevo +loquace +lorenzo +loto +lotteria +luce +lucidato +lumaca +luminoso +lungo +lupo +luppolo +lusinga +lusso +lutto +macabro +macchina +macero +macinato +madama +magico +maglia +magnete +magro +maiolica +malafede +malgrado +malinteso +malsano +malto +malumore +mana +mancia +mandorla +mangiare +manifesto +mannaro +manovra +mansarda +mantide +manubrio +mappa +maratona +marcire +maretta +marmo +marsupio +maschera +massaia +mastino +materasso +matricola +mattone +maturo +mazurca +meandro +meccanico +mecenate +medesimo +meditare +mega +melassa +melis +melodia +meninge +meno +mensola +mercurio +merenda +merlo +meschino +mese +messere +mestolo +metallo +metodo +mettere +miagolare +mica +micelio +michele +microbo +midollo +miele +migliore +milano +milite +mimosa +minerale +mini +minore +mirino +mirtillo +miscela +missiva +misto +misurare +mitezza +mitigare +mitra +mittente +mnemonico +modello +modifica +modulo +mogano +mogio +mole +molosso +monastero +monco +mondina +monetario +monile +monotono +monsone +montato +monviso +mora +mordere +morsicato +mostro +motivato +motosega +motto +movenza +movimento +mozzo +mucca +mucosa +muffa +mughetto +mugnaio +mulatto +mulinello +multiplo +mummia +munto +muovere +murale +musa +muscolo +musica +mutevole +muto +nababbo +nafta +nanometro +narciso +narice +narrato +nascere +nastrare +naturale +nautica +naviglio +nebulosa +necrosi +negativo +negozio +nemmeno +neofita +neretto +nervo +nessuno +nettuno +neutrale +neve +nevrotico +nicchia +ninfa +nitido +nobile +nocivo +nodo +nome +nomina +nordico +normale +norvegese +nostrano +notare +notizia +notturno +novella +nucleo +nulla +numero +nuovo +nutrire +nuvola +nuziale +oasi +obbedire +obbligo +obelisco +oblio +obolo +obsoleto +occasione +occhio +occidente +occorrere +occultare +ocra +oculato +odierno +odorare +offerta +offrire +offuscato +oggetto +oggi +ognuno +olandese +olfatto +oliato +oliva +ologramma +oltre +omaggio +ombelico +ombra +omega +omissione +ondoso +onere +onice +onnivoro +onorevole +onta +operato +opinione +opposto +oracolo +orafo +ordine +orecchino +orefice +orfano +organico +origine +orizzonte +orma +ormeggio +ornativo +orologio +orrendo +orribile +ortensia +ortica +orzata +orzo +osare +oscurare +osmosi +ospedale +ospite +ossa +ossidare +ostacolo +oste +otite +otre +ottagono +ottimo +ottobre +ovale +ovest +ovino +oviparo +ovocito +ovunque +ovviare +ozio +pacchetto +pace +pacifico +padella +padrone +paese +paga +pagina +palazzina +palesare +pallido +palo +palude +pandoro +pannello +paolo +paonazzo +paprica +parabola +parcella +parere +pargolo +pari +parlato +parola +partire +parvenza +parziale +passivo +pasticca +patacca +patologia +pattume +pavone +peccato +pedalare +pedonale +peggio +peloso +penare +pendice +penisola +pennuto +penombra +pensare +pentola +pepe +pepita +perbene +percorso +perdonato +perforare +pergamena +periodo +permesso +perno +perplesso +persuaso +pertugio +pervaso +pesatore +pesista +peso +pestifero +petalo +pettine +petulante +pezzo +piacere +pianta +piattino +piccino +picozza +piega +pietra +piffero +pigiama +pigolio +pigro +pila +pilifero +pillola +pilota +pimpante +pineta +pinna +pinolo +pioggia +piombo +piramide +piretico +pirite +pirolisi +pitone +pizzico +placebo +planare +plasma +platano +plenario +pochezza +poderoso +podismo +poesia +poggiare +polenta +poligono +pollice +polmonite +polpetta +polso +poltrona +polvere +pomice +pomodoro +ponte +popoloso +porfido +poroso +porpora +porre +portata +posa +positivo +possesso +postulato +potassio +potere +pranzo +prassi +pratica +precluso +predica +prefisso +pregiato +prelievo +premere +prenotare +preparato +presenza +pretesto +prevalso +prima +principe +privato +problema +procura +produrre +profumo +progetto +prolunga +promessa +pronome +proposta +proroga +proteso +prova +prudente +prugna +prurito +psiche +pubblico +pudica +pugilato +pugno +pulce +pulito +pulsante +puntare +pupazzo +pupilla +puro +quadro +qualcosa +quasi +querela +quota +raccolto +raddoppio +radicale +radunato +raffica +ragazzo +ragione +ragno +ramarro +ramingo +ramo +randagio +rantolare +rapato +rapina +rappreso +rasatura +raschiato +rasente +rassegna +rastrello +rata +ravveduto +reale +recepire +recinto +recluta +recondito +recupero +reddito +redimere +regalato +registro +regola +regresso +relazione +remare +remoto +renna +replica +reprimere +reputare +resa +residente +responso +restauro +rete +retina +retorica +rettifica +revocato +riassunto +ribadire +ribelle +ribrezzo +ricarica +ricco +ricevere +riciclato +ricordo +ricreduto +ridicolo +ridurre +rifasare +riflesso +riforma +rifugio +rigare +rigettato +righello +rilassato +rilevato +rimanere +rimbalzo +rimedio +rimorchio +rinascita +rincaro +rinforzo +rinnovo +rinomato +rinsavito +rintocco +rinuncia +rinvenire +riparato +ripetuto +ripieno +riportare +ripresa +ripulire +risata +rischio +riserva +risibile +riso +rispetto +ristoro +risultato +risvolto +ritardo +ritegno +ritmico +ritrovo +riunione +riva +riverso +rivincita +rivolto +rizoma +roba +robotico +robusto +roccia +roco +rodaggio +rodere +roditore +rogito +rollio +romantico +rompere +ronzio +rosolare +rospo +rotante +rotondo +rotula +rovescio +rubizzo +rubrica +ruga +rullino +rumine +rumoroso +ruolo +rupe +russare +rustico +sabato +sabbiare +sabotato +sagoma +salasso +saldatura +salgemma +salivare +salmone +salone +saltare +saluto +salvo +sapere +sapido +saporito +saraceno +sarcasmo +sarto +sassoso +satellite +satira +satollo +saturno +savana +savio +saziato +sbadiglio +sbalzo +sbancato +sbarra +sbattere +sbavare +sbendare +sbirciare +sbloccato +sbocciato +sbrinare +sbruffone +sbuffare +scabroso +scadenza +scala +scambiare +scandalo +scapola +scarso +scatenare +scavato +scelto +scenico +scettro +scheda +schiena +sciarpa +scienza +scindere +scippo +sciroppo +scivolo +sclerare +scodella +scolpito +scomparto +sconforto +scoprire +scorta +scossone +scozzese +scriba +scrollare +scrutinio +scuderia +scultore +scuola +scuro +scusare +sdebitare +sdoganare +seccatura +secondo +sedano +seggiola +segnalato +segregato +seguito +selciato +selettivo +sella +selvaggio +semaforo +sembrare +seme +seminato +sempre +senso +sentire +sepolto +sequenza +serata +serbato +sereno +serio +serpente +serraglio +servire +sestina +setola +settimana +sfacelo +sfaldare +sfamato +sfarzoso +sfaticato +sfera +sfida +sfilato +sfinge +sfocato +sfoderare +sfogo +sfoltire +sforzato +sfratto +sfruttato +sfuggito +sfumare +sfuso +sgabello +sgarbato +sgonfiare +sgorbio +sgrassato +sguardo +sibilo +siccome +sierra +sigla +signore +silenzio +sillaba +simbolo +simpatico +simulato +sinfonia +singolo +sinistro +sino +sintesi +sinusoide +sipario +sisma +sistole +situato +slitta +slogatura +sloveno +smarrito +smemorato +smentito +smeraldo +smilzo +smontare +smottato +smussato +snellire +snervato +snodo +sobbalzo +sobrio +soccorso +sociale +sodale +soffitto +sogno +soldato +solenne +solido +sollazzo +solo +solubile +solvente +somatico +somma +sonda +sonetto +sonnifero +sopire +soppeso +sopra +sorgere +sorpasso +sorriso +sorso +sorteggio +sorvolato +sospiro +sosta +sottile +spada +spalla +spargere +spatola +spavento +spazzola +specie +spedire +spegnere +spelatura +speranza +spessore +spettrale +spezzato +spia +spigoloso +spillato +spinoso +spirale +splendido +sportivo +sposo +spranga +sprecare +spronato +spruzzo +spuntino +squillo +sradicare +srotolato +stabile +stacco +staffa +stagnare +stampato +stantio +starnuto +stasera +statuto +stelo +steppa +sterzo +stiletto +stima +stirpe +stivale +stizzoso +stonato +storico +strappo +stregato +stridulo +strozzare +strutto +stuccare +stufo +stupendo +subentro +succoso +sudore +suggerito +sugo +sultano +suonare +superbo +supporto +surgelato +surrogato +sussurro +sutura +svagare +svedese +sveglio +svelare +svenuto +svezia +sviluppo +svista +svizzera +svolta +svuotare +tabacco +tabulato +tacciare +taciturno +tale +talismano +tampone +tannino +tara +tardivo +targato +tariffa +tarpare +tartaruga +tasto +tattico +taverna +tavolata +tazza +teca +tecnico +telefono +temerario +tempo +temuto +tendone +tenero +tensione +tentacolo +teorema +terme +terrazzo +terzetto +tesi +tesserato +testato +tetro +tettoia +tifare +tigella +timbro +tinto +tipico +tipografo +tiraggio +tiro +titanio +titolo +titubante +tizio +tizzone +toccare +tollerare +tolto +tombola +tomo +tonfo +tonsilla +topazio +topologia +toppa +torba +tornare +torrone +tortora +toscano +tossire +tostatura +totano +trabocco +trachea +trafila +tragedia +tralcio +tramonto +transito +trapano +trarre +trasloco +trattato +trave +treccia +tremolio +trespolo +tributo +tricheco +trifoglio +trillo +trincea +trio +tristezza +triturato +trivella +tromba +trono +troppo +trottola +trovare +truccato +tubatura +tuffato +tulipano +tumulto +tunisia +turbare +turchino +tuta +tutela +ubicato +uccello +uccisore +udire +uditivo +uffa +ufficio +uguale +ulisse +ultimato +umano +umile +umorismo +uncinetto +ungere +ungherese +unicorno +unificato +unisono +unitario +unte +uovo +upupa +uragano +urgenza +urlo +usanza +usato +uscito +usignolo +usuraio +utensile +utilizzo +utopia +vacante +vaccinato +vagabondo +vagliato +valanga +valgo +valico +valletta +valoroso +valutare +valvola +vampata +vangare +vanitoso +vano +vantaggio +vanvera +vapore +varano +varcato +variante +vasca +vedetta +vedova +veduto +vegetale +veicolo +velcro +velina +velluto +veloce +venato +vendemmia +vento +verace +verbale +vergogna +verifica +vero +verruca +verticale +vescica +vessillo +vestale +veterano +vetrina +vetusto +viandante +vibrante +vicenda +vichingo +vicinanza +vidimare +vigilia +vigneto +vigore +vile +villano +vimini +vincitore +viola +vipera +virgola +virologo +virulento +viscoso +visione +vispo +vissuto +visura +vita +vitello +vittima +vivanda +vivido +viziare +voce +voga +volatile +volere +volpe +voragine +vulcano +zampogna +zanna +zappato +zattera +zavorra +zefiro +zelante +zelo +zenzero +zerbino +zibetto +zinco +zircone +zitto +zolla +zotico +zucchero +zufolo +zulu +zuppa +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/japanese.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/japanese.go new file mode 100644 index 00000000..23a76a34 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/japanese.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt + // $ crc32 japanese.txt + // 0acc1419 + checksum := crc32.ChecksumIEEE([]byte(japanese)) + if fmt.Sprintf("%x", checksum) != "acc1419" { + panic(fmt.Sprintf("japanese checksum invalid: %x", checksum)) + } +} + +// Japanese is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt +var Japanese = strings.Split(strings.TrimSpace(japanese), "\n") +var japanese = `ã‚ã„ã“ãã—ã‚“ +ã‚ã„ã•ã¤ +ã‚ã„ãŸã‚™ +ã‚ãŠã゙ら +ã‚ã‹ã¡ã‚ƒã‚“ +ã‚ãã‚‹ +ã‚ã‘ã‹ã‚™ãŸ +ã‚ã‘ã‚‹ +ã‚ã“ã‹ã‚™ã‚Œã‚‹ +ã‚ã•ã„ +ã‚ã•ã² +ã‚ã—ã‚㨠+ã‚ã—ã‚™ã‚ㆠ+ã‚ã™ã‚™ã‹ã‚‹ +ã‚ã™ã‚™ã +ã‚ããµã‚™ +ã‚ãŸãˆã‚‹ +ã‚ãŸãŸã‚ã‚‹ +ã‚ãŸã‚Šã¾ãˆ +ã‚ãŸã‚‹ +ã‚ã¤ã„ +ã‚ã¤ã‹ã† +ã‚ã£ã—ã‚…ã +ã‚ã¤ã¾ã‚Š +ã‚ã¤ã‚ã‚‹ +ã‚ã¦ãª +ã‚ã¦ã¯ã¾ã‚‹ +ã‚ã²ã‚‹ +ã‚ãµã‚™ã‚‰ +ã‚ãµã‚™ã‚‹ +ã‚ãµã‚Œã‚‹ +ã‚ã¾ã„ +ã‚ã¾ã¨ã‚™ +ã‚ã¾ã‚„ã‹ã™ +ã‚ã¾ã‚Š +ã‚ã¿ã‚‚ã® +ã‚ã‚ã‚Šã‹ +ã‚ã‚„ã¾ã‚‹ +ã‚ゆむ +ã‚らã„ã゙㾠+ã‚ら㗠+ã‚らã™ã—ã‚™ +ã‚らãŸã‚ã‚‹ +ã‚らゆる +ã‚らã‚ã™ +ã‚ã‚Šã‹ã‚™ã¨ã† +ã‚ã‚ã›ã‚‹ +ã‚ã‚ã¦ã‚‹ +ã‚ã‚“ã„ +ã‚ã‚“ã‹ã‚™ã„ +ã‚ã‚“ã“ +ã‚ã‚“ã›ã‚™ã‚“ +ã‚ã‚“ã¦ã„ +ã‚ã‚“ãªã„ +ã‚ã‚“ã¾ã‚Š +ã„ã„ãŸã‚™ã™ +ã„ãŠã‚“ +ã„ã‹ã‚™ã„ +ã„ã‹ã‚™ã +ã„ããŠã„ +ã„ããªã‚Š +ã„ãã‚‚ã® +ã„ãã‚‹ +ã„ãã—ã‚™ +ã„ããµã‚™ã‚“ +ã„ã‘ã¯ã‚™ãª +ã„ã‘ã‚“ +ã„ã“ㆠ+ã„ã“ã +ã„ã“㤠+ã„ã•ã¾ã—ã„ +ã„ã•ã‚“ +ã„ã—ã +ã„ã—゙ゅㆠ+ã„ã—゙ょㆠ+ã„ã—ã‚™ã‚ã‚‹ +ã„ã™ã‚™ã¿ +ã„ã™ã‚™ã‚Œ +ã„ã›ã„ +ã„ã›ãˆã²ã‚™ +ã„ã›ã‹ã„ +ã„ã›ã +ã„ã›ã‚™ã‚“ +ã„ãã†ã‚ㆠ+ã„ãã‹ã‚™ã—ã„ +ã„ãŸã‚™ã„ +ã„ãŸã‚™ã +ã„ãŸã™ã‚™ã‚‰ +ã„ãŸã¿ +ã„ãŸã‚Šã‚ +ã„ã¡ãŠã† +ã„ã¡ã—ã‚™ +ã„ã¡ã¨ã‚™ +ã„ã¡ã¯ã‚™ +ã„ã¡ãµã‚™ +ã„ã¡ã‚Šã‚…ㆠ+ã„ã¤ã‹ +ã„ã£ã—ã‚…ã‚“ +ã„ã£ã›ã„ +ã„ã£ãㆠ+ã„ã£ãŸã‚“ +ã„ã£ã¡ +ã„ã£ã¦ã„ +ã„ã£ã»ã‚šã† +ã„ã¦ã•ã‚™ +ã„ã¦ã‚“ +ã„ã¨ã‚™ã† +ã„ã¨ã“ +ã„ãªã„ +ã„ãªã‹ +ã„ã­ã‚€ã‚Š +ã„ã®ã¡ +ã„ã®ã‚‹ +ã„ã¯ã¤ +ã„ã¯ã‚™ã‚‹ +ã„ã¯ã‚“ +ã„ã²ã‚™ã +ã„ã²ã‚“ +ã„ãµã +ã„ã¸ã‚“ +ã„ã»ã† +ã„ã¿ã‚“ +ã„ã‚‚ã†ã¨ +ã„ã‚‚ãŸã‚Œ +ã„ã‚‚ã‚Š +ã„ã‚„ã‹ã‚™ã‚‹ +ã„ã‚„ã™ +ã„よã‹ã‚“ +ã„よã +ã„らㄠ+ã„らã™ã¨ +ã„ã‚Šã゙㡠+ã„りょㆠ+ã„れㄠ+ã„れも㮠+ã„れる +ã„ã‚ãˆã‚“ã²ã‚šã¤ +ã„ã‚ã„ +ã„ã‚ㆠ+ã„ã‚ã‹ã‚“ +ã„ã‚ã¯ã‚™ +ã„ã‚ゆる +ã„ã‚“ã‘゙んã¾ã‚ +ã„ã‚“ã•ã¤ +ã„ã‚“ã—ょㆠ+ã„んよㆠ+ã†ãˆã +ã†ãˆã‚‹ +ã†ãŠã•ã‚™ +ã†ã‹ã‚™ã„ +ã†ã‹ãµã‚™ +ã†ã‹ã¸ã‚™ã‚‹ +ã†ãã‚ +ã†ãらã„㪠+ã†ãれれ +ã†ã‘ãŸã¾ã‚ã‚‹ +ã†ã‘ã¤ã‘ +ã†ã‘ã¨ã‚‹ +ã†ã‘も㤠+ã†ã‘ã‚‹ +ã†ã“ã‚™ã‹ã™ +ã†ã“ã‚™ã +ã†ã“ã‚“ +ã†ã•ãã‚™ +ã†ã—ãªã† +ã†ã—ã‚ã‹ã‚™ã¿ +ã†ã™ã„ +ã†ã™ãã‚™ +ã†ã™ã゙らㄠ+ã†ã™ã‚ã‚‹ +ã†ã›ã¤ +ã†ã¡ã‚ã‚ã› +ã†ã¡ã‹ã‚™ã‚ +ã†ã¡ã +ã†ã¡ã‚…ㆠ+ã†ã£ã‹ã‚Š +ã†ã¤ãã—ã„ +ã†ã£ãŸãˆã‚‹ +ã†ã¤ã‚‹ +ã†ã¨ã‚™ã‚“ +ã†ãªãã‚™ +ã†ãªã—ã‚™ +ã†ãªã™ã‚™ã +ã†ãªã‚‹ +ã†ã­ã‚‹ +ã†ã®ã† +ã†ãµã‚™ã‘ã‚™ +ã†ãµã‚™ã“゙㈠+ã†ã¾ã‚Œã‚‹ +ã†ã‚ã‚‹ +ã†ã‚‚ㆠ+ã†ã‚„ã¾ã† +ã†ã‚ˆã +ã†ã‚‰ã‹ã‚™ãˆã™ +ã†ã‚‰ã゙㡠+ã†ã‚‰ãªã„ +ã†ã‚Šã‚ã‘ã‚™ +ã†ã‚Šãã‚Œ +ã†ã‚‹ã•ã„ +ã†ã‚Œã—ã„ +ã†ã‚Œã‚†ã +ã†ã‚Œã‚‹ +ã†ã‚ã“ +ã†ã‚ã +ã†ã‚ã• +ã†ã‚“ã“ㆠ+ã†ã‚“ã¡ã‚“ +ã†ã‚“ã¦ã‚“ +ã†ã‚“ã¨ã‚™ã† +ãˆã„ãˆã‚“ +ãˆã„ã‹ã‚™ +ãˆã„ãょㆠ+ãˆã„ã“ã‚™ +ãˆã„ã›ã„ +ãˆã„ãµã‚™ã‚“ +ãˆã„よㆠ+ãˆã„ã‚ +ãˆãŠã‚Š +ãˆã‹ã‚™ãŠ +ãˆã‹ã‚™ã +ãˆããŸã„ +ãˆãã›ã‚‹ +ãˆã—ゃã +ãˆã™ã¦ +ãˆã¤ã‚‰ã‚“ +ãˆã®ãã‚™ +ãˆã»ã†ã¾ã +ãˆã»ã‚“ +ãˆã¾ã +ãˆã‚‚ã—ã‚™ +ãˆã‚‚ã® +ãˆã‚‰ã„ +ãˆã‚‰ãµã‚™ +ãˆã‚Šã‚ +ãˆã‚“ãˆã‚“ +ãˆã‚“ã‹ã„ +ãˆã‚“ãã‚™ +ãˆã‚“ã‘ã‚™ã +ãˆã‚“ã—ゅㆠ+ãˆã‚“ã›ã‚™ã¤ +ãˆã‚“ãã +ãˆã‚“ã¡ã‚‡ã† +ãˆã‚“ã¨ã¤ +ãŠã„ã‹ã‘ã‚‹ +ãŠã„ã“ã™ +ãŠã„ã—ã„ +ãŠã„ã¤ã +ãŠã†ãˆã‚“ +ãŠã†ã•ã¾ +ãŠã†ã—ã‚™ +ãŠã†ã›ã¤ +ãŠã†ãŸã„ +ãŠã†ãµã +ãŠã†ã¸ã‚™ã„ +ãŠã†ã‚ˆã† +ãŠãˆã‚‹ +ãŠãŠã„ +ãŠãŠã† +ãŠãŠã¨ã‚™ãŠã‚Š +ãŠãŠã‚„ +ãŠãŠã‚ˆã +ãŠã‹ãˆã‚Š +ãŠã‹ã™ã‚™ +ãŠã‹ã‚™ã‚€ +ãŠã‹ã‚ã‚Š +ãŠãã‚™ãªã† +ãŠãã‚‹ +ãŠãã•ã¾ +ãŠãã—゙ょㆠ+ãŠãã‚Šã‹ã‚™ãª +ãŠãã‚‹ +ãŠãれる +ãŠã“ã™ +ãŠã“ãªã† +ãŠã“ã‚‹ +ãŠã•ãˆã‚‹ +ãŠã•ãªã„ +ãŠã•ã‚ã‚‹ +ãŠã—ã„ã‚Œ +ãŠã—ãˆã‚‹ +ãŠã—ã‚™ãã‚™ +ãŠã—ã‚™ã•ã‚“ +ãŠã—ゃれ +ãŠãらã +ãŠãã‚ã‚‹ +ãŠãŸã‹ã‚™ã„ +ãŠãŸã +ãŠãŸã‚™ã‚„ã‹ +ãŠã¡ã¤ã +ãŠã£ã¨ +ãŠã¤ã‚Š +ãŠã¦ã‚™ã‹ã‘ +ãŠã¨ã—ã‚‚ã® +ãŠã¨ãªã—ã„ +ãŠã¨ã‚™ã‚Š +ãŠã¨ã‚™ã‚ã‹ã™ +ãŠã¯ã‚™ã•ã‚“ +ãŠã¾ã„ã‚Š +ãŠã‚ã¦ã‚™ã¨ã† +ãŠã‚‚ã„ã¦ã‚™ +ãŠã‚‚ㆠ+ãŠã‚‚ãŸã„ +ãŠã‚‚ã¡ã‚ƒ +ãŠã‚„㤠+ãŠã‚„ゆã²ã‚™ +ãŠã‚ˆã»ã‚™ã™ +ãŠã‚‰ã‚“ãŸã‚™ +ãŠã‚ã™ +ãŠã‚“ã‹ã‚™ã +ãŠã‚“ã‘ã„ +ãŠã‚“ã—ゃ +ãŠã‚“ã›ã‚“ +ãŠã‚“ãŸã‚™ã‚“ +ãŠã‚“ã¡ã‚…ㆠ+ãŠã‚“ã¨ã‚™ã‘ã„ +ã‹ã‚㤠+ã‹ã„ã‹ã‚™ +ã‹ã‚™ã„ã +ã‹ã‚™ã„ã‘ã‚“ +ã‹ã‚™ã„ã“ㆠ+ã‹ã„ã•ã¤ +ã‹ã„ã—ゃ +ã‹ã„ã™ã„よã +ã‹ã„ã›ã‚™ã‚“ +ã‹ã„ãã‚™ã†ã¨ã‚™ +ã‹ã„ã¤ã† +ã‹ã„ã¦ã‚“ +ã‹ã„ã¨ã† +ã‹ã„ãµã +ã‹ã‚™ã„ã¸ã +ã‹ã„ã»ã† +ã‹ã„よㆠ+ã‹ã‚™ã„らㄠ+ã‹ã„ã‚ +ã‹ãˆã‚‹ +ã‹ãŠã‚Š +ã‹ã‹ãˆã‚‹ +ã‹ã‹ã‚™ã +ã‹ã‹ã‚™ã— +ã‹ã‹ã‚™ã¿ +ã‹ãã“ã‚™ +ã‹ãã¨ã +ã‹ã•ã‚™ã‚‹ +ã‹ã‚™ã゙ㆠ+ã‹ãŸã„ +ã‹ãŸã¡ +ã‹ã‚™ã¡ã‚‡ã† +ã‹ã‚™ã£ãゅㆠ+ã‹ã‚™ã£ã“ㆠ+ã‹ã‚™ã£ã•ã‚“ +ã‹ã‚™ã£ã—ょㆠ+ã‹ãªã•ã‚™ã‚ã— +ã‹ã®ã† +ã‹ã‚™ã¯ã +ã‹ãµã‚™ã‹ +ã‹ã»ã† +ã‹ã»ã“ã‚™ +ã‹ã¾ã† +ã‹ã¾ã»ã‚™ã“ +ã‹ã‚ã‚ŒãŠã‚“ +ã‹ã‚†ã„ +ã‹ã‚ˆã†ã²ã‚™ +ã‹ã‚‰ã„ +ã‹ã‚‹ã„ +ã‹ã‚ㆠ+ã‹ã‚ã +ã‹ã‚ら +ã‹ã‚™ã‚“ã‹ +ã‹ã‚“ã‘ã„ +ã‹ã‚“ã“ㆠ+ã‹ã‚“ã—ゃ +ã‹ã‚“ãㆠ+ã‹ã‚“ãŸã‚“ +ã‹ã‚“ã¡ +ã‹ã‚™ã‚“ã¯ã‚™ã‚‹ +ãã‚ã„ +ãã‚㤠+ãã„ã‚ +ãã‚™ã„ã‚“ +ãã†ã„ +ãã†ã‚“ +ããˆã‚‹ +ããŠã† +ããŠã +ããŠã¡ +ããŠã‚“ +ãã‹ã„ +ãã‹ã +ãã‹ã‚“ã—ゃ +ãã㦠+ããã¯ã‚™ã‚Š +ããらã‘ã‚™ +ãã‘ã‚“ã›ã„ +ãã“ㆠ+ãã“ãˆã‚‹ +ãã“ã +ãã•ã„ +ãã•ã +ãã•ã¾ +ãã•ã‚‰ãã‚™ +ãã‚™ã—ã‚™ã‹ã‹ã‚™ã +ãã‚™ã—ã +ãã‚™ã—ã‚™ãŸã„ã‘ã‚“ +ãã‚™ã—ã‚™ã«ã£ã¦ã„ +ãã‚™ã—゙ゅã¤ã—ゃ +ãã™ã† +ãã›ã„ +ãã›ã +ãã›ã¤ +ããㆠ+ããã‚™ã +ãã゙ん +ããŸãˆã‚‹ +ãã¡ã‚‡ã† +ãã¤ãˆã‚“ +ãã‚™ã£ã¡ã‚Š +ãã¤ã¤ã +ãã¤ã­ +ãã¦ã„ +ãã¨ã‚™ã† +ãã¨ã‚™ã +ããªã„ +ããªã‹ã‚™ +ããªã“ +ãã¬ã“゙㗠+ãã­ã‚“ +ãã®ã† +ãã®ã—㟠+ãã¯ã +ãã²ã‚™ã—ã„ +ãã²ã‚“ +ããµã +ããµã‚™ã‚“ +ãã»ã‚™ã† +ãã»ã‚“ +ãã¾ã‚‹ +ãã¿ã¤ +ãã‚€ã™ã‚™ã‹ã—ã„ +ãã‚ã‚‹ +ãã‚‚ãŸã‚™ã‚ã— +ãã‚‚ã¡ +ãã‚‚ã® +ãゃã +ãã‚„ã +ã゙ゅã†ã«ã +ãよㆠ+ãょã†ã‚Šã‚…ㆠ+ãらㄠ+ãらã +ãã‚Šã‚“ +ãれㄠ+ãれ㤠+ãã‚ã +ãã‚™ã‚ã‚“ +ãã‚ã‚ã‚‹ +ã゙んã„ã‚ +ãã‚“ã‹ãã—ã‚™ +ãã‚“ã—゙ょ +ãんよã†ã²ã‚™ +ãã‚™ã‚ã„ +ãã„ã™ã‚™ +ãã†ã‹ã‚“ +ãã†ã +ãã†ã゙ん +ãã†ã“ㆠ+ãã‚™ã†ã›ã„ +ãã†ãㆠ+ãã‚™ã†ãŸã‚‰ +ãã†ãµã +ãã†ã»ã‚™ +ãã‹ã‚“ +ããょㆠ+ãã‘゙ん +ãã‚™ã“ㆠ+ãã•ã„ +ãã•ã +ãã•ã¯ã‚™ãª +ãã•ã‚‹ +ãã—ゃ㿠+ãã—ょㆠ+ãã™ã®ã +ãã™ã‚Šã‚†ã²ã‚™ +ãã›ã‘ã‚™ +ãã›ã‚“ +ãã‚™ãŸã„ã¦ã +ããŸã‚™ã•ã‚‹ +ããŸã²ã‚™ã‚Œã‚‹ +ãã¡ã“ã¿ +ãã¡ã•ã +ãã¤ã—㟠+ãã‚™ã£ã™ã‚Š +ãã¤ã‚ãã‚™ +ãã¨ã†ã¦ã‚“ +ãã¨ã‚™ã +ããªã‚“ +ãã­ãã­ +ãã®ã† +ããµã† +ãã¿ã‚ã‚ã› +ãã¿ãŸã¦ã‚‹ +ãã‚ã‚‹ +ãã‚„ãã—ょ +ãら㙠+ãらã¸ã‚™ã‚‹ +ãã‚‹ã¾ +ãれる +ãã‚ㆠ+ãã‚ã—ã„ +ã゙んã‹ã‚“ +ã゙んã—ょã +ã゙んãŸã„ +ã゙ん㦠+ã‘ã‚㪠+ã‘ã„ã‹ã +ã‘ã„ã‘ã‚“ +ã‘ã„ã“ +ã‘ã„ã•ã¤ +ã‘ã‚™ã„ã—゙ゅ㤠+ã‘ã„ãŸã„ +ã‘ã‚™ã„ã®ã†ã—゙ん +ã‘ã„ã‚Œã +ã‘ã„ã‚ +ã‘ãŠã¨ã™ +ã‘ãŠã‚Šã‚‚ã® +ã‘ã‚™ãã‹ +ã‘ã‚™ãã‘゙ん +ã‘ã‚™ããŸã‚™ã‚“ +ã‘ã‚™ãã¡ã‚“ +ã‘ã‚™ãã¨ã¤ +ã‘ã‚™ã㯠+ã‘ã‚™ãã‚„ã +ã‘ã‚™ã“ㆠ+ã‘ã‚™ã“ãã—゙ょㆠ+ã‘ã‚™ã•ã‚™ã„ +ã‘ã•ã +ã‘ã‚™ã•ã‚™ã‚“ +ã‘ã—ã +ã‘ã—ã“゙む +ã‘ã—ょㆠ+ã‘ã‚™ã™ã¨ +ã‘ãŸã¯ã‚™ +ã‘ã¡ã‚ƒã£ãµã‚š +ã‘ã¡ã‚‰ã™ +ã‘ã¤ã‚㤠+ã‘ã¤ã„ +ã‘ã¤ãˆã +ã‘ã£ã“ã‚“ +ã‘ã¤ã—゙ょ +ã‘ã£ã›ã +ã‘ã£ã¦ã„ +ã‘ã¤ã¾ã¤ +ã‘ã‚™ã¤ã‚ˆã†ã²ã‚™ +ã‘ã‚™ã¤ã‚Œã„ +ã‘ã¤ã‚ã‚“ +ã‘ã‚™ã¨ã‚™ã +ã‘ã¨ã¯ã‚™ã™ +ã‘ã¨ã‚‹ +ã‘ãªã‘ã‚™ +ã‘ãªã™ +ã‘ãªã¿ +ã‘ã¬ã +ã‘ã‚™ã­ã¤ +ã‘ã­ã‚“ +ã‘ã¯ã„ +ã‘ã‚™ã²ã‚“ +ã‘ãµã‚™ã‹ã„ +ã‘ã‚™ã»ã‚™ã +ã‘ã¾ã‚Š +ã‘ã¿ã‹ã‚‹ +ã‘む㗠+ã‘むり +ã‘ã‚‚ã® +ã‘らㄠ+ã‘ã‚ã‘ã‚ +ã‘ã‚ã—ã„ +ã‘ã‚“ã„ +ã‘ã‚“ãˆã¤ +ã‘ん㊠+ã‘ã‚“ã‹ +ã‘゙んã +ã‘ã‚“ã‘゙ん +ã‘ã‚“ã“ㆠ+ã‘ã‚“ã•ã +ã‘ã‚“ã—ゅㆠ+ã‘ã‚“ã™ã† +ã‘゙んãㆠ+ã‘ã‚“ã¡ã +ã‘ã‚“ã¦ã„ +ã‘ã‚“ã¨ã† +ã‘ã‚“ãªã„ +ã‘ã‚“ã«ã‚“ +ã‘゙んãµã‚™ã¤ +ã‘ã‚“ã¾ +ã‘ã‚“ã¿ã‚“ +ã‘ã‚“ã‚ã„ +ã‘んらん +ã‘ã‚“ã‚Š +ã“ã‚ãã¾ +ã“ã„㬠+ã“ã„ã²ã‚™ã¨ +ã“ã‚™ã†ã„ +ã“ã†ãˆã‚“ +ã“ã†ãŠã‚“ +ã“ã†ã‹ã‚“ +ã“ã‚™ã†ãゅㆠ+ã“ã‚™ã†ã‘ã„ +ã“ã†ã“ㆠ+ã“ã†ã•ã„ +ã“ã†ã—ã‚™ +ã“ã†ã™ã„ +ã“ã‚™ã†ã›ã„ +ã“ã†ãã +ã“ã†ãŸã„ +ã“ã†ã¡ã‚ƒ +ã“ã†ã¤ã† +ã“ã†ã¦ã„ +ã“ã†ã¨ã‚™ã† +ã“ã†ãªã„ +ã“ã†ã¯ã„ +ã“ã‚™ã†ã»ã† +ã“ã‚™ã†ã¾ã‚“ +ã“ã†ã‚‚ã +ã“ã†ã‚Šã¤ +ã“ãˆã‚‹ +ã“ãŠã‚Š +ã“ã‚™ã‹ã„ +ã“ã‚™ã‹ã‚™ã¤ +ã“ã‚™ã‹ã‚“ +ã“ãã“ã‚™ +ã“ãã•ã„ +ã“ãã¨ã† +ã“ããªã„ +ã“ãã¯ã +ã“ã゙㾠+ã“ã‘ã„ +ã“ã‘ã‚‹ +ã“ã“ã®ã‹ +ã“ã“ã‚ +ã“ã•ã‚ +ã“ã—㤠+ã“ã™ã† +ã“ã›ã„ +ã“ã›ã +ã“ã›ã‚™ã‚“ +ã“ããŸã‚™ã¦ +ã“ãŸã„ +ã“ãŸãˆã‚‹ +ã“ãŸã¤ +ã“ã¡ã‚‡ã† +ã“ã£ã‹ +ã“ã¤ã“㤠+ã“ã¤ã¯ã‚™ã‚“ +ã“ã¤ãµã‚™ +ã“ã¦ã„ +ã“ã¦ã‚“ +ã“ã¨ã‹ã‚™ã‚‰ +ã“ã¨ã— +ã“ã¨ã¯ã‚™ +ã“ã¨ã‚Š +ã“ãªã“゙㪠+ã“ã­ã“ã­ +ã“ã®ã¾ã¾ +ã“ã®ã¿ +ã“ã®ã‚ˆ +ã“ã‚™ã¯ã‚“ +ã“ã²ã¤ã—ã‚™ +ã“ãµã† +ã“ãµã‚“ +ã“ã»ã‚™ã‚Œã‚‹ +ã“ã‚™ã¾ã‚ãµã‚™ã‚‰ +ã“ã¾ã‹ã„ +ã“ã‚™ã¾ã™ã‚Š +ã“ã¾ã¤ãª +ã“ã¾ã‚‹ +ã“ã‚€ã゙㓠+ã“ã‚‚ã—ã‚™ +ã“ã‚‚ã¡ +ã“ã‚‚ã® +ã“ã‚‚ã‚“ +ã“ã‚„ã +ã“ã‚„ã¾ +ã“ゆㆠ+ã“ゆã²ã‚™ +ã“よㄠ+ã“よㆠ+ã“ã‚Šã‚‹ +ã“ã‚Œãã—ょん +ã“ã‚ã£ã‘ +ã“ã‚も㦠+ã“ã‚れる +ã“ã‚“ã„ã‚“ +ã“ã‚“ã‹ã„ +ã“ã‚“ã +ã“ã‚“ã—ゅㆠ+ã“ã‚“ã™ã„ +ã“ã‚“ãŸã‚™ã¦ +ã“ã‚“ã¨ã‚“ +ã“ã‚“ãªã‚“ +ã“ã‚“ã²ã‚™ã« +ã“ã‚“ã»ã‚šã‚“ +ã“ã‚“ã¾ã‘ +ã“ã‚“ã‚„ +ã“んれㄠ+ã“ã‚“ã‚ã +ã•ã‚™ã„ãˆã +ã•ã„ã‹ã„ +ã•ã„ãã‚“ +ã•ã‚™ã„ã‘゙ん +ã•ã‚™ã„ã“ +ã•ã„ã—ょ +ã•ã„ã›ã„ +ã•ã‚™ã„ãŸã +ã•ã‚™ã„ã¡ã‚…ㆠ+ã•ã„ã¦ã +ã•ã‚™ã„りょㆠ+ã•ã†ãª +ã•ã‹ã„ã— +ã•ã‹ã‚™ã™ +ã•ã‹ãª +ã•ã‹ã¿ã¡ +ã•ã‹ã‚™ã‚‹ +ã•ã゙ょㆠ+ã•ãã— +ã•ãã²ã‚“ +ã•ãら +ã•ã“ã +ã•ã“㤠+ã•ã™ã‚™ã‹ã‚‹ +ã•ã‚™ã›ã +ã•ãŸã‚“ +ã•ã¤ãˆã„ +ã•ã‚™ã¤ãŠã‚“ +ã•ã‚™ã£ã‹ +ã•ã‚™ã¤ã‹ã‚™ã +ã•ã£ãょã +ã•ã‚™ã£ã— +ã•ã¤ã—゙ん +ã•ã‚™ã£ãㆠ+ã•ã¤ãŸã¯ã‚™ +ã•ã¤ã¾ã„ã‚‚ +ã•ã¦ã„ +ã•ã¨ã„ã‚‚ +ã•ã¨ã† +ã•ã¨ãŠã‚„ +ã•ã¨ã— +ã•ã¨ã‚‹ +ã•ã®ã† +ã•ã¯ã‚™ã +ã•ã²ã‚™ã—ã„ +ã•ã¸ã‚™ã¤ +ã•ã»ã† +ã•ã»ã¨ã‚™ +ã•ã¾ã™ +ã•ã¿ã—ã„ +ã•ã¿ãŸã‚™ã‚Œ +ã•ã‚€ã‘ +ã•ã‚ã‚‹ +ã•ã‚„ãˆã‚“ã¨ã‚™ã† +ã•ã‚†ã† +ã•ã‚ˆã† +ã•ã‚ˆã +ã•ã‚‰ãŸã‚™ +ã•ã‚™ã‚‹ãã¯ã‚™ +ã•ã‚ã‚„ã‹ +ã•ã‚ã‚‹ +ã•ã‚“ã„ã‚“ +ã•ã‚“ã‹ +ã•ã‚“ãゃã +ã•ã‚“ã“ㆠ+ã•ã‚“ã•ã„ +ã•ã‚™ã‚“ã—ょ +ã•ã‚“ã™ã† +ã•ã‚“ã›ã„ +ã•ã‚“ã +ã•ã‚“ã¡ +ã•ã‚“ã¾ +ã•ã‚“ã¿ +ã•ã‚“らん +ã—ã‚ã„ +ã—ã‚ã‘ã‚™ +ã—ã‚ã•ã£ã¦ +ã—ã‚ã‚ã› +ã—ã„ã +ã—ã„ã‚“ +ã—ã†ã¡ +ã—ãˆã„ +ã—ãŠã‘ +ã—ã‹ã„ +ã—ã‹ã +ã—ã‚™ã‹ã‚“ +ã—ã“゙㨠+ã—ã™ã† +ã—ã‚™ãŸã‚™ã„ +ã—ãŸã†ã‘ +ã—ãŸãã‚™ +ã—ãŸã¦ +ã—ãŸã¿ +ã—ã¡ã‚‡ã† +ã—ã¡ã‚Šã‚“ +ã—ã£ã‹ã‚Š +ã—ã¤ã—ã‚™ +ã—ã¤ã‚‚ã‚“ +ã—ã¦ã„ +ã—ã¦ã +ã—ã¦ã¤ +ã—ã‚™ã¦ã‚“ +ã—ã‚™ã¨ã‚™ã† +ã—ãªã゙れ +ã—ãªã‚‚ã® +ã—ãªã‚“ +ã—ã­ã¾ +ã—ã­ã‚“ +ã—ã®ãã‚™ +ã—ã®ãµã‚™ +ã—ã¯ã„ +ã—ã¯ã‚™ã‹ã‚Š +ã—ã¯ã¤ +ã—ã¯ã‚‰ã„ +ã—ã¯ã‚“ +ã—ã²ã‚‡ã† +ã—ãµã +ã—ã‚™ãµã‚™ã‚“ +ã—ã¸ã„ +ã—ã»ã† +ã—ã»ã‚“ +ã—ã¾ã† +ã—ã¾ã‚‹ +ã—ã¿ã‚“ +ã—ã‚€ã‘ã‚‹ +ã—゙むã—ょ +ã—ã‚ã„ +ã—ã‚ã‚‹ +ã—ã‚‚ã‚“ +ã—ゃã„ã‚“ +ã—ゃã†ã‚“ +ã—ゃãŠã‚“ +ã—゙ゃã‹ã‚™ã„ã‚‚ +ã—ã‚„ãã—ょ +ã—ゃãã»ã† +ã—ゃã‘ã‚“ +ã—ゃ㓠+ã—ゃã•ã‚™ã„ +ã—ゃã—ã‚“ +ã—ゃã›ã‚“ +ã—ゃãㆠ+ã—ゃãŸã„ +ã—ゃã¡ã‚‡ã† +ã—ゃã£ãã‚“ +ã—゙ゃ㾠+ã—ゃりん +ã—ゃれㄠ+ã—゙ゆㆠ+ã—゙ゅã†ã—ょ +ã—ã‚…ãã¯ã +ã—゙ゅã—ã‚“ +ã—ã‚…ã£ã›ã +ã—ã‚…ã¿ +ã—ゅらã¯ã‚™ +ã—゙ゅんã¯ã‚™ã‚“ +ã—ょã†ã‹ã„ +ã—ょããŸã +ã—ょã£ã‘ã‚“ +ã—ょã¨ã‚™ã† +ã—ょも㤠+ã—らã›ã‚‹ +ã—らã¸ã‚™ã‚‹ +ã—ã‚“ã‹ +ã—ã‚“ã“ㆠ+ã—゙んã—゙ゃ +ã—ã‚“ã›ã„ã—ã‚™ +ã—ã‚“ã¡ã +ã—ã‚“ã‚Šã‚“ +ã™ã‚ã‘ã‚™ +ã™ã‚ã— +ã™ã‚㪠+ã™ã‚™ã‚ã‚“ +ã™ã„ãˆã„ +ã™ã„ã‹ +ã™ã„ã¨ã† +ã™ã‚™ã„ãµã‚™ã‚“ +ã™ã„よã†ã²ã‚™ +ã™ã†ã‹ã‚™ã +ã™ã†ã—゙㤠+ã™ã†ã›ã‚“ +ã™ãŠã¨ã‚™ã‚Š +ã™ãã¾ +ã™ãㆠ+ã™ããªã„ +ã™ã‘ã‚‹ +ã™ã“゙ㄠ+ã™ã“ã— +ã™ã‚™ã•ã‚“ +ã™ã™ã‚™ã—ã„ +ã™ã™ã‚€ +ã™ã™ã‚ã‚‹ +ã™ã£ã‹ã‚Š +ã™ã‚™ã£ã—ã‚Š +ã™ã‚™ã£ã¨ +ã™ã¦ã +ã™ã¦ã‚‹ +ã™ã­ã‚‹ +ã™ã®ã“ +ã™ã¯ãŸã‚™ +ã™ã¯ã‚™ã‚‰ã—ã„ +ã™ã‚™ã²ã‚‡ã† +ã™ã‚™ãµã‚™ã¬ã‚Œ +ã™ãµã‚™ã‚Š +ã™ãµã‚Œ +ã™ã¸ã‚™ã¦ +ã™ã¸ã‚™ã‚‹ +ã™ã‚™ã»ã† +ã™ã»ã‚™ã‚“ +ã™ã¾ã„ +ã™ã‚ã— +ã™ã‚‚ㆠ+ã™ã‚„ã +ã™ã‚‰ã™ã‚‰ +ã™ã‚‹ã‚ +ã™ã‚Œã¡ã‹ã‚™ã† +ã™ã‚ã£ã¨ +ã™ã‚ã‚‹ +ã™ã‚“ã›ã‚™ã‚“ +ã™ã‚“ã»ã‚šã† +ã›ã‚ãµã‚™ã‚‰ +ã›ã„ã‹ã¤ +ã›ã„ã‘゙ん +ã›ã„ã—ã‚™ +ã›ã„よㆠ+ã›ãŠã† +ã›ã‹ã„ã‹ã‚“ +ã›ãã«ã‚“ +ã›ãã‚€ +ã›ãゆ +ã›ãらんã†ã‚“ +ã›ã‘ã‚“ +ã›ã“ㆠ+ã›ã™ã—ã‚™ +ã›ãŸã„ +ã›ãŸã‘ +ã›ã£ã‹ã +ã›ã£ãゃã +ã›ã‚™ã£ã +ã›ã£ã‘ã‚“ +ã›ã£ã“㤠+ã›ã£ã•ãŸãã¾ +ã›ã¤ãã‚™ã +ã›ã¤ãŸã‚™ã‚“ +ã›ã¤ã¦ã‚™ã‚“ +ã›ã£ã¯ã‚šã‚“ +ã›ã¤ã²ã‚™ +ã›ã¤ãµã‚™ã‚“ +ã›ã¤ã‚ã„ +ã›ã¤ã‚Šã¤ +ã›ãªã‹ +ã›ã®ã²ã‚™ +ã›ã¯ã¯ã‚™ +ã›ã²ã‚™ã‚ +ã›ã»ã‚™ã­ +ã›ã¾ã„ +ã›ã¾ã‚‹ +ã›ã‚ã‚‹ +ã›ã‚‚ãŸã‚Œ +ã›ã‚Šãµ +ã›ã‚™ã‚“ã‚ã +ã›ã‚“ã„ +ã›ã‚“ãˆã„ +ã›ã‚“ã‹ +ã›ã‚“ãょ +ã›ã‚“ã +ã›ã‚“ã‘゙ん +ã›ã‚™ã‚“ã“ã‚™ +ã›ã‚“ã•ã„ +ã›ã‚“ã—ã‚… +ã›ã‚“ã™ã„ +ã›ã‚“ã›ã„ +ã›ã‚“ãã‚™ +ã›ã‚“ãŸã +ã›ã‚“ã¡ã‚‡ã† +ã›ã‚“ã¦ã„ +ã›ã‚“ã¨ã† +ã›ã‚“ã¬ã +ã›ã‚“ã­ã‚“ +ã›ã‚“ã¯ã‚šã„ +ã›ã‚™ã‚“ãµã‚™ +ã›ã‚™ã‚“ã»ã‚šã† +ã›ã‚“ã‚€ +ã›ã‚“ã‚ã‚“ã—゙ょ +ã›ã‚“ã‚‚ã‚“ +ã›ã‚“ã‚„ã +ã›ã‚“ゆㆠ+ã›ã‚“よㆠ+ã›ã‚™ã‚“ら +ã›ã‚™ã‚“りゃã +ã›ã‚“れㄠ+ã›ã‚“ã‚ +ãã‚ã +ãã„ã¨ã‘゙る +ãã„ã­ +ãã†ã‹ã‚™ã‚“ãょㆠ+ãã†ã +ãã†ã“ã‚™ +ãã†ã—ã‚“ +ãã†ãŸã‚™ã‚“ +ãã†ãªã‚“ +ãã†ã²ã‚™ +ãã†ã‚ã‚“ +ãã†ã‚Š +ããˆã‚‚ã® +ããˆã‚“ +ãã‹ã‚™ã„ +ãã‘ã‚™ã +ãã“ㆠ+ãã“ãã“ +ãã•ã‚™ã„ +ãã—㪠+ãã›ã„ +ãã›ã‚“ +ãããã‚™ +ããŸã‚™ã¦ã‚‹ +ãã¤ã† +ãã¤ãˆã‚“ +ãã£ã‹ã‚“ +ãã¤ã゙ょㆠ+ãã£ã‘㤠+ãã£ã“ㆠ+ãã£ã›ã‚“ +ãã£ã¨ +ãã¨ã‹ã‚™ã‚ +ãã¨ã¤ã‚™ã‚‰ +ããªãˆã‚‹ +ããªãŸ +ããµã»ã‚™ +ãã»ã‚™ã +ãã»ã‚™ã‚ +ãã¾ã¤ +ãã¾ã‚‹ +ãã‚€ã +ãむり㈠+ãã‚ã‚‹ +ãã‚‚ãã‚‚ +ãよã‹ã›ã‚™ +ãらã¾ã‚ +ãã‚ㆠ+ãã‚“ã‹ã„ +ãã‚“ã‘ã„ +ãã‚“ã•ã‚™ã„ +ãã‚“ã—㤠+ãã‚“ãã‚™ã +ãã‚“ã¡ã‚‡ã† +ã゙んã²ã‚™ +ã゙んãµã‚™ã‚“ +ãã‚“ã¿ã‚“ +ãŸã‚ã„ +ãŸã„ã„ã‚“ +ãŸã„ã†ã‚“ +ãŸã„ãˆã +ãŸã„ãŠã† +ãŸã‚™ã„ã‹ã‚™ã +ãŸã„ã +ãŸã„ã゙ㆠ+ãŸã„ã‘ã‚“ +ãŸã„ã“ +ãŸã„ã•ã‚™ã„ +ãŸã‚™ã„ã—゙ょã†ãµã‚™ +ãŸã‚™ã„ã™ã +ãŸã„ã›ã¤ +ãŸã„ãㆠ+ãŸã‚™ã„ãŸã„ +ãŸã„ã¡ã‚‡ã† +ãŸã„ã¦ã„ +ãŸã‚™ã„ã¨ã‚™ã“ã‚ +ãŸã„ãªã„ +ãŸã„ã­ã¤ +ãŸã„ã®ã† +ãŸã„ã¯ã‚“ +ãŸã‚™ã„ã²ã‚‡ã† +ãŸã„ãµã† +ãŸã„ã¸ã‚“ +ãŸã„ã» +ãŸã„ã¾ã¤ã¯ã‚™ãª +ãŸã„ã¿ã‚“ãã‚™ +ãŸã„ã‚€ +ãŸã„ã‚ã‚“ +ãŸã„ã‚„ã +ãŸã„よㆠ+ãŸã„ら +ãŸã„りょã +ãŸã„ã‚‹ +ãŸã„ã‚ã‚“ +ãŸã†ãˆ +ãŸãˆã‚‹ +ãŸãŠã™ +ãŸãŠã‚‹ +ãŸãŠã‚Œã‚‹ +ãŸã‹ã„ +ãŸã‹ã­ +ãŸãã²ã‚™ +ãŸãã•ã‚“ +ãŸã“ã +ãŸã“ã‚„ã +ãŸã•ã„ +ãŸã—ã•ã‚™ã‚“ +ãŸã‚™ã—゙ゃれ +ãŸã™ã‘ã‚‹ +ãŸã™ã‚™ã•ã‚ã‚‹ +ãŸãã‹ã‚™ã‚Œ +ãŸãŸã‹ã† +ãŸãŸã +ãŸãŸã‚™ã—ã„ +ãŸãŸã¿ +ãŸã¡ã¯ã‚™ãª +ãŸã‚™ã£ã‹ã„ +ãŸã‚™ã£ãゃã +ãŸã‚™ã£ã“ +ãŸã‚™ã£ã—ゅ㤠+ãŸã‚™ã£ãŸã„ +ãŸã¦ã‚‹ +ãŸã¨ãˆã‚‹ +ãŸãªã¯ã‚™ãŸ +ãŸã«ã‚“ +ãŸã¬ã +ãŸã®ã—ã¿ +ãŸã¯ã¤ +ãŸãµã‚™ã‚“ +ãŸã¸ã‚™ã‚‹ +ãŸã»ã‚™ã† +ãŸã¾ã“ã‚™ +ãŸã¾ã‚‹ +ãŸã‚™ã‚€ã‚‹ +ãŸã‚ã„ã +ãŸã‚ã™ +ãŸã‚ã‚‹ +ãŸã‚‚㤠+ãŸã‚„ã™ã„ +ãŸã‚ˆã‚‹ +ãŸã‚‰ã™ +ãŸã‚Šãã»ã‚“ã‹ã‚™ã‚“ +ãŸã‚Šã‚‡ã† +ãŸã‚Šã‚‹ +ãŸã‚‹ã¨ +ãŸã‚Œã‚‹ +ãŸã‚Œã‚“㨠+ãŸã‚ã£ã¨ +ãŸã‚むれる +ãŸã‚™ã‚“ã‚㤠+ãŸã‚“ã„ +ãŸã‚“ãŠã‚“ +ãŸã‚“ã‹ +ãŸã‚“ã +ãŸã‚“ã‘ã‚“ +ãŸã‚“ã“ã‚™ +ãŸã‚“ã•ã‚“ +ãŸã‚“ã—゙ょã†ã²ã‚™ +ãŸã‚™ã‚“ã›ã„ +ãŸã‚“ãã +ãŸã‚“ãŸã„ +ãŸã‚™ã‚“ã¡ +ãŸã‚“ã¦ã„ +ãŸã‚“ã¨ã† +ãŸã‚™ã‚“㪠+ãŸã‚“ã«ã‚“ +ãŸã‚™ã‚“ã­ã¤ +ãŸã‚“ã®ã† +ãŸã‚“ã²ã‚šã‚“ +ãŸã‚™ã‚“ã»ã‚™ã† +ãŸã‚“ã¾ã¤ +ãŸã‚“ã‚ã„ +ãŸã‚™ã‚“れ㤠+ãŸã‚™ã‚“ã‚ +ãŸã‚™ã‚“ã‚ +ã¡ã‚ã„ +ã¡ã‚ã‚“ +ã¡ã„ã +ã¡ã„ã•ã„ +ã¡ãˆã‚“ +ã¡ã‹ã„ +ã¡ã‹ã‚‰ +ã¡ãゅㆠ+ã¡ãã‚“ +ã¡ã‘ã„ã™ã‚™ +ã¡ã‘ã‚“ +ã¡ã“ã +ã¡ã•ã„ +ã¡ã—ã +ã¡ã—りょㆠ+ã¡ã›ã„ +ã¡ãㆠ+ã¡ãŸã„ +ã¡ãŸã‚“ +ã¡ã¡ãŠã‚„ +ã¡ã¤ã—゙ょ +ã¡ã¦ã +ã¡ã¦ã‚“ +ã¡ã¬ã +ã¡ã¬ã‚Š +ã¡ã®ã† +ã¡ã²ã‚‡ã† +ã¡ã¸ã„ã›ã‚“ +ã¡ã»ã† +ã¡ã¾ãŸ +ã¡ã¿ã¤ +ã¡ã¿ã¨ã‚™ã‚ +ã¡ã‚ã„ã¨ã‚™ +ã¡ã‚ƒã‚“ã“ãªã¸ã‚™ +ã¡ã‚…ã†ã„ +ã¡ã‚†ã‚Šã‚‡ã +ã¡ã‚‡ã†ã— +ã¡ã‚‡ã•ãã‘ã‚“ +ã¡ã‚‰ã— +ã¡ã‚‰ã¿ +ã¡ã‚Šã‹ã‚™ã¿ +ã¡ã‚Šã‚‡ã† +ã¡ã‚‹ã¨ã‚™ +ã¡ã‚ã‚ +ã¡ã‚“ãŸã„ +ã¡ã‚“ã‚‚ã +ã¤ã„ã‹ +ã¤ã„ãŸã¡ +ã¤ã†ã‹ +ã¤ã†ã—゙ょㆠ+ã¤ã†ã¯ã‚“ +ã¤ã†ã‚ +ã¤ã‹ã† +ã¤ã‹ã‚Œã‚‹ +ã¤ãã­ +ã¤ãã‚‹ +ã¤ã‘ã­ +ã¤ã‘ã‚‹ +ã¤ã“゙ㆠ+ã¤ãŸãˆã‚‹ +ã¤ã¤ã‚™ã +ã¤ã¤ã—ã‚™ +ã¤ã¤ã‚€ +ã¤ã¨ã‚ã‚‹ +ã¤ãªã‹ã‚™ã‚‹ +ã¤ãªã¿ +ã¤ã­ã¤ã‚™ã­ +ã¤ã®ã‚‹ +ã¤ãµã‚™ã™ +ã¤ã¾ã‚‰ãªã„ +ã¤ã¾ã‚‹ +ã¤ã¿ã +ã¤ã‚ãŸã„ +ã¤ã‚‚ã‚Š +ã¤ã‚‚ã‚‹ +ã¤ã‚ˆã„ +ã¤ã‚‹ã»ã‚™ +ã¤ã‚‹ã¿ã +ã¤ã‚ã‚‚ã® +ã¤ã‚ã‚Š +ã¦ã‚ã— +ã¦ã‚㦠+ã¦ã‚ã¿ +ã¦ã„ãŠã‚“ +ã¦ã„ã‹ +ã¦ã„ã +ã¦ã„ã‘ã„ +ã¦ã„ã“ã +ã¦ã„ã•ã¤ +ã¦ã„ã— +ã¦ã„ã›ã„ +ã¦ã„ãŸã„ +ã¦ã„ã¨ã‚™ +ã¦ã„ã­ã„ +ã¦ã„ã²ã‚‡ã† +ã¦ã„ã¸ã‚“ +ã¦ã„ã»ã‚™ã† +ã¦ã†ã¡ +ã¦ãŠãã‚Œ +ã¦ãã¨ã† +ã¦ãã²ã‚™ +ã¦ã‚™ã“ã»ã‚™ã“ +ã¦ã•ã゙ょㆠ+ã¦ã•ã‘ã‚™ +ã¦ã™ã‚Š +ã¦ãㆠ+ã¦ã¡ã‹ã‚™ã„ +ã¦ã¡ã‚‡ã† +ã¦ã¤ã‹ã‚™ã +ã¦ã¤ã¤ã‚™ã +ã¦ã‚™ã£ã¯ã‚š +ã¦ã¤ã»ã‚™ã† +ã¦ã¤ã‚„ +ã¦ã‚™ã¬ã‹ãˆ +ã¦ã¬ã +ã¦ã¬ã゙ㄠ+ã¦ã®ã²ã‚‰ +ã¦ã¯ã„ +ã¦ãµã‚™ãã‚ +ã¦ãµãŸã‚™ +ã¦ã»ã¨ã‚™ã +ã¦ã»ã‚“ +ã¦ã¾ãˆ +ã¦ã¾ãã™ã‚™ã— +ã¦ã¿ã—゙㋠+ã¦ã¿ã‚„ã‘ã‚™ +ã¦ã‚‰ã™ +ã¦ã‚Œã²ã‚™ +ã¦ã‚ã‘ +ã¦ã‚ãŸã— +ã¦ã‚™ã‚“ã‚㤠+ã¦ã‚“ã„ã‚“ +ã¦ã‚“ã‹ã„ +ã¦ã‚“ã +ã¦ã‚“ãã‚™ +ã¦ã‚“ã‘ã‚“ +ã¦ã‚“ã“ã‚™ã +ã¦ã‚“ã•ã„ +ã¦ã‚“ã— +ã¦ã‚“ã™ã† +ã¦ã‚™ã‚“ã¡ +ã¦ã‚“ã¦ã +ã¦ã‚“ã¨ã† +ã¦ã‚“ãªã„ +ã¦ã‚“ãµã‚šã‚‰ +ã¦ã‚“ã»ã‚™ã†ãŸã‚™ã„ +ã¦ã‚“ã‚㤠+ã¦ã‚“らんã‹ã„ +ã¦ã‚™ã‚“りょã +ã¦ã‚™ã‚“ã‚ +ã¨ã‚™ã‚ã„ +ã¨ã„ã‚Œ +ã¨ã‚™ã†ã‹ã‚“ +ã¨ã†ãゅㆠ+ã¨ã‚™ã†ãã‚™ +ã¨ã†ã— +ã¨ã†ã‚€ãã‚™ +ã¨ãŠã„ +ã¨ãŠã‹ +ã¨ãŠã +ã¨ãŠã™ +ã¨ãŠã‚‹ +ã¨ã‹ã„ +ã¨ã‹ã™ +ã¨ããŠã‚Š +ã¨ãã¨ã‚™ã +ã¨ãã„ +ã¨ãã—ゅㆠ+ã¨ãã¦ã‚“ +ã¨ãã« +ã¨ãã¸ã‚™ã¤ +ã¨ã‘ã„ +ã¨ã‘ã‚‹ +ã¨ã“ã‚„ +ã¨ã•ã‹ +ã¨ã—ょã‹ã‚“ +ã¨ãㆠ+ã¨ãŸã‚“ +ã¨ã¡ã‚…ㆠ+ã¨ã£ãゅㆠ+ã¨ã£ãã‚“ +ã¨ã¤ã›ã‚™ã‚“ +ã¨ã¤ã«ã‚…ㆠ+ã¨ã¨ã‚™ã‘ã‚‹ +ã¨ã¨ã®ãˆã‚‹ +ã¨ãªã„ +ã¨ãªãˆã‚‹ +ã¨ãªã‚Š +ã¨ã®ã•ã¾ +ã¨ã¯ã‚™ã™ +ã¨ã‚™ãµã‚™ã‹ã‚™ã‚ +ã¨ã»ã† +ã¨ã¾ã‚‹ +ã¨ã‚ã‚‹ +ã¨ã‚‚ãŸã‚™ã¡ +ã¨ã‚‚ã‚‹ +ã¨ã‚™ã‚ˆã†ã²ã‚™ +ã¨ã‚‰ãˆã‚‹ +ã¨ã‚“ã‹ã¤ +ã¨ã‚™ã‚“ãµã‚™ã‚Š +ãªã„ã‹ã +ãªã„ã“ㆠ+ãªã„ã—ょ +ãªã„ã™ +ãªã„ã›ã‚“ +ãªã„ãㆠ+ãªãŠã™ +ãªã‹ã‚™ã„ +ãªãã™ +ãªã‘゙る +ãªã“ã†ã¨ã‚™ +ãªã•ã‘ +ãªãŸã¦ã‚™ã“ã“ +ãªã£ã¨ã† +ãªã¤ã‚„ã™ã¿ +ãªãªãŠã— +ãªã«ã“゙㨠+ãªã«ã‚‚ã® +ãªã«ã‚ +ãªã®ã‹ +ãªãµãŸã‚™ +ãªã¾ã„ã +ãªã¾ãˆ +ãªã¾ã¿ +ãªã¿ãŸã‚™ +ãªã‚ら㋠+ãªã‚ã‚‹ +ãªã‚„ã‚€ +ãªã‚‰ã† +ãªã‚‰ã²ã‚™ +ãªã‚‰ãµã‚™ +ãªã‚Œã‚‹ +ãªã‚ã¨ã²ã‚™ +ãªã‚ã¯ã‚™ã‚Š +ã«ã‚ㆠ+ã«ã„ã‹ã‚™ãŸ +ã«ã†ã‘ +ã«ãŠã„ +ã«ã‹ã„ +ã«ã‹ã‚™ã¦ +ã«ãã²ã‚™ +ã«ãã—ã¿ +ã«ãã¾ã‚“ +ã«ã‘゙る +ã«ã•ã‚“ã‹ãŸã‚“ã +ã«ã—ã +ã«ã›ã‚‚ã® +ã«ã¡ã—゙ょㆠ+ã«ã¡ã‚ˆã†ã²ã‚™ +ã«ã£ã‹ +ã«ã£ã +ã«ã£ã‘ã„ +ã«ã£ã“ㆠ+ã«ã£ã•ã‚“ +ã«ã£ã—ょã +ã«ã£ã™ã† +ã«ã£ã›ã +ã«ã£ã¦ã„ +ã«ãªã† +ã«ã»ã‚“ +ã«ã¾ã‚ +ã«ã‚‚㤠+ã«ã‚„ã‚Š +ã«ã‚…ã†ã„ã‚“ +ã«ã‚Šã‚“ã—ゃ +ã«ã‚ã¨ã‚Š +ã«ã‚“ã„ +ã«ã‚“ã‹ +ã«ã‚“ã +ã«ã‚“ã‘゙ん +ã«ã‚“ã—ã +ã«ã‚“ã™ã‚™ã† +ã«ã‚“ãㆠ+ã«ã‚“ãŸã„ +ã«ã‚“ã¡ +ã«ã‚“ã¦ã„ +ã«ã‚“ã«ã +ã«ã‚“ãµã‚š +ã«ã‚“ã¾ã‚Š +ã«ã‚“ã‚€ +ã«ã‚“ã‚ã„ +ã«ã‚“よㆠ+ã¬ã„ããã‚™ +ã¬ã‹ã™ +ã¬ãã‚™ã„ã¨ã‚‹ +ã¬ã゙ㆠ+ã¬ãã‚‚ã‚Š +ã¬ã™ã‚€ +ã¬ã¾ãˆã²ã‚™ +ã¬ã‚ã‚Š +ã¬ã‚‰ã™ +ã¬ã‚“ã¡ã‚ƒã +ã­ã‚ã‘ã‚™ +ã­ã„ã +ã­ã„ã‚‹ +ã­ã„ã‚ +ã­ã゙㛠+ã­ããŸã„ +ã­ãら +ã­ã“ã›ã‚™ +ã­ã“ã‚€ +ã­ã•ã‘ã‚™ +ã­ã™ã“゙㙠+ã­ãã¸ã‚™ã‚‹ +ã­ãŸã‚™ã‚“ +ã­ã¤ã„ +ã­ã£ã—ã‚“ +ã­ã¤ã゙ㆠ+ã­ã£ãŸã„ã゙ょ +ã­ãµã‚™ãã +ã­ãµãŸã‚™ +ã­ã»ã‚™ã† +ã­ã»ã‚Šã¯ã»ã‚Š +ã­ã¾ã +ã­ã¾ã‚ã— +ã­ã¿ã¿ +ã­ã‚€ã„ +ã­ã‚€ãŸã„ +ã­ã‚‚㨠+ã­ã‚‰ã† +ã­ã‚ã•ã‚™ +ã­ã‚“ã„ã‚Š +ã­ã‚“ãŠã— +ã­ã‚“ã‹ã‚“ +ã­ã‚“ãã‚“ +ã­ã‚“ãã‚™ +ã­ã‚“ã•ã‚™ +ã­ã‚“ã— +ã­ã‚“ã¡ã‚ƒã +ã­ã‚“ã¨ã‚™ +ã­ã‚“ã²ã‚š +ã­ã‚“ãµã‚™ã¤ +ã­ã‚“ã¾ã¤ +ã­ã‚“りょㆠ+ã­ã‚“れㄠ+ã®ã„ã™ã‚™ +ã®ãŠã¤ã‚™ã¾ +ã®ã‹ã‚™ã™ +ã®ããªã¿ +ã®ã“ã゙り +ã®ã“ã™ +ã®ã“ã‚‹ +ã®ã›ã‚‹ +ã®ãã‚™ã +ã®ã゙む +ã®ãŸã¾ã† +ã®ã¡ã»ã¨ã‚™ +ã®ã£ã +ã®ã¯ã‚™ã™ +ã®ã¯ã‚‰ +ã®ã¸ã‚™ã‚‹ +ã®ã»ã‚™ã‚‹ +ã®ã¿ã‚‚ã® +ã®ã‚„ã¾ +ã®ã‚‰ã„㬠+ã®ã‚‰ã­ã“ +ã®ã‚Šã‚‚ã® +ã®ã‚Šã‚†ã +ã®ã‚Œã‚“ +ã®ã‚“ã +ã¯ã‚™ã‚ã„ +ã¯ã‚ã +ã¯ã‚™ã‚ã•ã‚“ +ã¯ã‚™ã„ã‹ +ã¯ã‚™ã„ã +ã¯ã„ã‘ã‚“ +ã¯ã„ã“ã‚™ +ã¯ã„ã—ã‚“ +ã¯ã„ã™ã„ +ã¯ã„ã›ã‚“ +ã¯ã„ãㆠ+ã¯ã„ã¡ +ã¯ã‚™ã„ã¯ã‚™ã„ +ã¯ã„れ㤠+ã¯ãˆã‚‹ +ã¯ãŠã‚‹ +ã¯ã‹ã„ +ã¯ã‚™ã‹ã‚Š +ã¯ã‹ã‚‹ +ã¯ãã—ã‚… +ã¯ã‘ã‚“ +ã¯ã“ãµã‚™ +ã¯ã•ã¿ +ã¯ã•ã‚“ +ã¯ã—ã“ã‚™ +ã¯ã‚™ã—ょ +ã¯ã—ã‚‹ +ã¯ã›ã‚‹ +ã¯ã‚šãã“ã‚“ +ã¯ãã‚“ +ã¯ãŸã‚“ +ã¯ã¡ã¿ã¤ +ã¯ã¤ãŠã‚“ +ã¯ã£ã‹ã +ã¯ã¤ã‚™ã +ã¯ã£ãã‚Š +ã¯ã£ã㤠+ã¯ã£ã‘ã‚“ +ã¯ã£ã“ㆠ+ã¯ã£ã•ã‚“ +ã¯ã£ã—ã‚“ +ã¯ã£ãŸã¤ +ã¯ã£ã¡ã‚…ㆠ+ã¯ã£ã¦ã‚“ +ã¯ã£ã²ã‚šã‚‡ã† +ã¯ã£ã»ã‚šã† +ã¯ãªã™ +ã¯ãªã²ã‚™ +ã¯ã«ã‹ã‚€ +ã¯ãµã‚™ã‚‰ã— +ã¯ã¿ã‹ã‚™ã +ã¯ã‚€ã‹ã† +ã¯ã‚㤠+ã¯ã‚„ã„ +ã¯ã‚„ã— +ã¯ã‚‰ã† +ã¯ã‚ã†ãƒã‚“ +ã¯ã‚ã„ +ã¯ã‚“ã„ +ã¯ã‚“ãˆã„ +ã¯ã‚“ãŠã‚“ +ã¯ã‚“ã‹ã +ã¯ã‚“ãょㆠ+ã¯ã‚™ã‚“ã゙㿠+ã¯ã‚“ã“ +ã¯ã‚“ã—ゃ +ã¯ã‚“ã™ã† +ã¯ã‚“ãŸã‚™ã‚“ +ã¯ã‚šã‚“ã¡ +ã¯ã‚šã‚“㤠+ã¯ã‚“ã¦ã„ +ã¯ã‚“ã¨ã— +ã¯ã‚“ã®ã† +ã¯ã‚“ã¯ã‚š +ã¯ã‚“ãµã‚™ã‚“ +ã¯ã‚“ã¸ã‚šã‚“ +ã¯ã‚“ã»ã‚™ã†ã +ã¯ã‚“ã‚ã„ +ã¯ã‚“らん +ã¯ã‚“ã‚ã‚“ +ã²ã„ã +ã²ã†ã‚“ +ã²ãˆã‚‹ +ã²ã‹ã +ã²ã‹ã‚Š +ã²ã‹ã‚‹ +ã²ã‹ã‚“ +ã²ãã„ +ã²ã‘㤠+ã²ã“ã†ã +ã²ã“ã +ã²ã•ã„ +ã²ã•ã—ãµã‚™ã‚Š +ã²ã•ã‚“ +ã²ã‚™ã—゙ゅã¤ã‹ã‚“ +ã²ã—ょ +ã²ãã‹ +ã²ãã‚€ +ã²ãŸã‚€ã +ã²ãŸã‚™ã‚Š +ã²ãŸã‚‹ +ã²ã¤ãã‚™ +ã²ã£ã“ã— +ã²ã£ã— +ã²ã¤ã—゙ゅã²ã‚“ +ã²ã£ã™ +ã²ã¤ã›ã‚™ã‚“ +ã²ã‚šã£ãŸã‚Š +ã²ã‚šã£ã¡ã‚Š +ã²ã¤ã‚ˆã† +ã²ã¦ã„ +ã²ã¨ã“゙㿠+ã²ãªã¾ã¤ã‚Š +ã²ãªã‚“ +ã²ã­ã‚‹ +ã²ã¯ã‚“ +ã²ã²ã‚™ã +ã²ã²ã‚‡ã† +ã²ã»ã† +ã²ã¾ã‚ã‚Š +ã²ã¾ã‚“ +ã²ã¿ã¤ +ã²ã‚ã„ +ã²ã‚ã—゙㗠+ã²ã‚„ã‘ +ã²ã‚„ã™ +ã²ã‚ˆã† +ã²ã‚™ã‚‡ã†ã +ã²ã‚‰ã‹ã‚™ãª +ã²ã‚‰ã +ã²ã‚Šã¤ +ã²ã‚Šã‚‡ã† +ã²ã‚‹ã¾ +ã²ã‚‹ã‚„ã™ã¿ +ã²ã‚Œã„ +ã²ã‚ã„ +ã²ã‚ㆠ+ã²ã‚ã +ã²ã‚ゆã +ã²ã‚“ã‹ã +ã²ã‚“ã‘㤠+ã²ã‚“ã“ã‚“ +ã²ã‚“ã—ã‚… +ã²ã‚“ãㆠ+ã²ã‚šã‚“ã¡ +ã²ã‚“ã¯ã‚šã‚“ +ã²ã‚™ã‚“ã»ã‚™ã† +ãµã‚ã‚“ +ãµã„ã†ã¡ +ãµã†ã‘ã„ +ãµã†ã›ã‚“ +ãµã‚šã†ãŸã‚ㆠ+ãµã†ã¨ã† +ãµã†ãµ +ãµãˆã‚‹ +ãµãŠã‚“ +ãµã‹ã„ +ãµãã‚“ +ãµãã•ã‚™ã¤ +ãµããµã‚™ãã‚ +ãµã“ㆠ+ãµã•ã„ +ãµã—ãã‚™ +ãµã—゙㿠+ãµã™ã¾ +ãµã›ã„ +ãµã›ãã‚™ +ãµãã +ãµã‚™ãŸã«ã +ãµãŸã‚“ +ãµã¡ã‚‡ã† +ãµã¤ã† +ãµã¤ã‹ +ãµã£ã‹ã¤ +ãµã£ã +ãµã£ã“ã +ãµã‚™ã¨ã‚™ã† +ãµã¨ã‚‹ +ãµã¨ã‚“ +ãµã®ã† +ãµã¯ã„ +ãµã²ã‚‡ã† +ãµã¸ã‚“ +ãµã¾ã‚“ +ãµã¿ã‚“ +ãµã‚㤠+ãµã‚ã‚“ +ãµã‚ˆã† +ãµã‚Šã“ +ãµã‚Šã‚‹ +ãµã‚‹ã„ +ãµã‚“ã„ã +ãµã‚™ã‚“ã‹ã‚™ã +ãµã‚™ã‚“ãã‚™ +ãµã‚“ã—㤠+ãµã‚™ã‚“ã›ã +ãµã‚“ãㆠ+ãµã‚™ã‚“ã»ã‚šã† +ã¸ã„ã‚ã‚“ +ã¸ã„ãŠã‚“ +ã¸ã„ã‹ã‚™ã„ +ã¸ã„ã +ã¸ã„ã‘゙ん +ã¸ã„ã“ㆠ+ã¸ã„ã• +ã¸ã„ã—ゃ +ã¸ã„ã›ã¤ +ã¸ã„ã +ã¸ã„ãŸã +ã¸ã„ã¦ã‚“ +ã¸ã„ã­ã¤ +ã¸ã„ã‚ +ã¸ãã‹ã‚™ +ã¸ã“ã‚€ +ã¸ã‚™ã«ã„ã‚ +ã¸ã‚™ã«ã—ょã†ã‹ã‚™ +ã¸ã‚‰ã™ +ã¸ã‚“ã‹ã‚“ +ã¸ã‚™ã‚“ãょㆠ+ã¸ã‚™ã‚“ã“゙㗠+ã¸ã‚“ã•ã„ +ã¸ã‚“ãŸã„ +ã¸ã‚™ã‚“ã‚Š +ã»ã‚ã‚“ +ã»ã„ã +ã»ã‚™ã†ã゙ょ +ã»ã†ã“ã +ã»ã†ãㆠ+ã»ã†ã»ã† +ã»ã†ã‚‚ã‚“ +ã»ã†ã‚Šã¤ +ã»ãˆã‚‹ +ã»ãŠã‚“ +ã»ã‹ã‚“ +ã»ãょㆠ+ã»ã‚™ãã‚“ +ã»ãã‚ +ã»ã‘㤠+ã»ã‘ã‚“ +ã»ã“ㆠ+ã»ã“ã‚‹ +ã»ã—ã„ +ã»ã—㤠+ã»ã—ã‚… +ã»ã—ょㆠ+ã»ã›ã„ +ã»ãã„ +ã»ãã +ã»ãŸã¦ +ã»ãŸã‚‹ +ã»ã‚šã¡ãµã‚™ãã‚ +ã»ã£ãょã +ã»ã£ã• +ã»ã£ãŸã‚“ +ã»ã¨ã‚“ã¨ã‚™ +ã»ã‚ã‚‹ +ã»ã‚“ã„ +ã»ã‚“ã +ã»ã‚“ã‘ +ã»ã‚“ã—㤠+ã»ã‚“ã‚„ã +ã¾ã„ã«ã¡ +ã¾ã‹ã„ +ã¾ã‹ã›ã‚‹ +ã¾ã‹ã‚™ã‚‹ +ã¾ã‘ã‚‹ +ã¾ã“㨠+ã¾ã•ã¤ +ã¾ã—゙゠+ã¾ã™ã +ã¾ã›ã‚™ã‚‹ +ã¾ã¤ã‚Š +ã¾ã¨ã‚ +ã¾ãªãµã‚™ +ã¾ã¬ã‘ +ã¾ã­ã +ã¾ã»ã† +ã¾ã‚‚ã‚‹ +ã¾ã‚†ã‘ã‚™ +ã¾ã‚ˆã† +ã¾ã‚ã‚„ã‹ +ã¾ã‚ã™ +ã¾ã‚ã‚Š +ã¾ã‚ã‚‹ +ã¾ã‚“ã‹ã‚™ +ã¾ã‚“ã㤠+ã¾ã‚“ãã‚™ã +ã¾ã‚“ãªã‹ +ã¿ã„ら +ã¿ã†ã¡ +ã¿ãˆã‚‹ +ã¿ã‹ã‚™ã +ã¿ã‹ãŸ +ã¿ã‹ã‚“ +ã¿ã‘ã‚“ +ã¿ã“ã‚“ +ã¿ã—ã‚™ã‹ã„ +ã¿ã™ã„ +ã¿ã™ãˆã‚‹ +ã¿ã›ã‚‹ +ã¿ã£ã‹ +ã¿ã¤ã‹ã‚‹ +ã¿ã¤ã‘ã‚‹ +ã¿ã¦ã„ +ã¿ã¨ã‚ã‚‹ +ã¿ãªã¨ +ã¿ãªã¿ã‹ã•ã„ +ã¿ã­ã‚‰ã‚‹ +ã¿ã®ã† +ã¿ã®ã‹ã‚™ã™ +ã¿ã»ã‚“ +ã¿ã‚‚㨠+ã¿ã‚„ã‘ã‚™ +ã¿ã‚‰ã„ +ã¿ã‚Šã‚‡ã +ã¿ã‚ã +ã¿ã‚“ã‹ +ã¿ã‚“ãã‚™ã +ã‚€ã„ã‹ +ã‚€ãˆã +ã‚€ãˆã‚“ +ã‚€ã‹ã„ +ã‚€ã‹ã† +ã‚€ã‹ãˆ +ã‚€ã‹ã— +ã‚€ãã‚™ã¡ã‚ƒ +ã‚€ã‘ã‚‹ +ã‚€ã‘゙ん +ã‚€ã•ã»ã‚™ã‚‹ +ã‚€ã—ã‚ã¤ã„ +ã‚€ã—ã¯ã‚™ +ã‚€ã—゙ゅん +ã‚€ã—ã‚ +ã‚€ã™ã† +ã‚€ã™ã“ +ã‚€ã™ãµã‚™ +ã‚€ã™ã‚ +ã‚€ã›ã‚‹ +ã‚€ã›ã‚“ +ã‚€ã¡ã‚…ㆠ+ã‚€ãªã—ã„ +ã‚€ã®ã† +むや㿠+むよㆠ+むらã•ã +むりょㆠ+ã‚€ã‚ã‚“ +ã‚ã„ã‚ã‚“ +ã‚ã„ã†ã‚“ +ã‚ã„ãˆã‚“ +ã‚ã„ã‹ã +ã‚ã„ãょã +ã‚ã„ã•ã„ +ã‚ã„ã— +ã‚ã„ãㆠ+ã‚ã„ãµã‚™ã¤ +ã‚ã„れㄠ+ã‚ã„ã‚ã +ã‚ãã‚™ã¾ã‚Œã‚‹ +ã‚ã•ã‚™ã™ +ã‚ã—㟠+ã‚ã™ã‚™ã‚‰ã—ã„ +ã‚ãŸã‚™ã¤ +ã‚ã¾ã„ +ã‚ã‚„ã™ +ã‚ã‚“ãょ +ã‚ã‚“ã›ã +ã‚ã‚“ã¨ã‚™ã† +ã‚‚ã†ã—ã‚ã‘゙る +ã‚‚ã†ã¨ã‚™ã†ã‘ã‚“ +ã‚‚ãˆã‚‹ +ã‚‚ãã— +ã‚‚ãã¦ã +ã‚‚ãよã†ã²ã‚™ +ã‚‚ã¡ã‚ã‚“ +ã‚‚ã¨ã‚™ã‚‹ +もらㆠ+ã‚‚ã‚“ã +ã‚‚ã‚“ãŸã‚™ã„ +ã‚„ãŠã‚„ +ã‚„ã‘ã‚‹ +ã‚„ã•ã„ +ã‚„ã•ã—ã„ +ã‚„ã™ã„ +ã‚„ã™ãŸã‚ㆠ+ã‚„ã™ã¿ +ã‚„ã›ã‚‹ +ã‚„ãㆠ+ã‚„ãŸã„ +ã‚„ã¡ã‚“ +ã‚„ã£ã¨ +ã‚„ã£ã¯ã‚šã‚Š +ã‚„ãµã‚™ã‚‹ +ã‚„ã‚ã‚‹ +ã‚„ã‚„ã“ã—ã„ +やよㄠ+ã‚„ã‚らã‹ã„ +ゆã†ã +ゆã†ã²ã‚™ã‚“ãょã +ゆã†ã¸ã‚™ +ゆã†ã‚ã„ +ゆã‘㤠+ゆã—ゅ㤠+ゆã›ã‚“ +ゆãㆠ+ゆãŸã‹ +ゆã¡ã‚ƒã +ゆã¦ã‚™ã‚‹ +ゆã«ã‚…ㆠ+ゆã²ã‚™ã‚ +ゆらㄠ+ゆれる +よã†ã„ +よã†ã‹ +よã†ãゅㆠ+よã†ã—ã‚™ +よã†ã™ +よã†ã¡ãˆã‚“ +よã‹ã›ã‚™ +よã‹ã‚“ +よãã‚“ +よãã›ã„ +よãã»ã‚™ã† +よã‘ã„ +よã“゙れる +よã•ã‚“ +よã—ゅㆠ+よãㆠ+よãã +よã£ã‹ +よã¦ã„ +よã¨ã‚™ã‹ã‚™ã‚ã +よã­ã¤ +よやã +よゆㆠ+よã‚ã“ãµã‚™ +よã‚ã—ã„ +らã„ㆠ+らãã‹ã‚™ã +らãã“ã‚™ +らãã•ã¤ +らããŸã‚™ +らã—ã‚“ã¯ã‚™ã‚“ +らã›ã‚“ +らãã‚™ã +らãŸã„ +らã£ã‹ +られ㤠+ã‚Šãˆã +ã‚Šã‹ã„ +ã‚Šãã•ã +ã‚Šãã›ã¤ +ã‚Šãã゙ん +ã‚Šã㤠+ã‚Šã‘ã‚“ +ã‚Šã“ㆠ+ã‚Šã›ã„ +ã‚Šãㆠ+ã‚Šãã +ã‚Šã¦ã‚“ +ã‚Šã­ã‚“ +りゆㆠ+ã‚Šã‚…ã†ã‹ã‚™ã +りよㆠ+りょã†ã‚Š +りょã‹ã‚“ +りょãã¡ã‚ƒ +りょã“ㆠ+ã‚Šã‚Šã +ã‚Šã‚Œã +ã‚Šã‚ã‚“ +ã‚Šã‚“ã“ã‚™ +ã‚‹ã„ã‘ã„ +ã‚‹ã„ã•ã„ +ã‚‹ã„ã—ã‚™ +ã‚‹ã„ã›ã +ã‚‹ã™ã¯ã‚™ã‚“ +ã‚‹ã‚Šã‹ã‚™ã‚ら +ã‚Œã„ã‹ã‚“ +ã‚Œã„ãã‚™ +ã‚Œã„ã›ã„ +ã‚Œã„ãã‚™ã†ã“ +ã‚Œã„ã¨ã† +ã‚Œã„ã»ã‚™ã† +ã‚Œãã— +ã‚ŒããŸã‚™ã„ +れんã‚ã„ +れんã‘ã„ +れんã“ã‚“ +れんã•ã„ +れんã—ゅㆠ+れんãã‚™ã +れんらã +ã‚ã†ã‹ +ã‚ã†ã“ã‚™ +ã‚ã†ã—゙ん +ã‚ã†ãã +ã‚ãã‹ã‚™ +ã‚ã“㤠+ã‚ã—ã‚™ã†ã‚‰ +ã‚ã—ゅ㤠+ã‚ã›ã‚“ +ã‚ã¦ã‚“ +ã‚ã‚ã‚“ +ã‚れ㤠+ã‚ã‚“ãã‚™ +ã‚ã‚“ã¯ã‚š +ã‚ã‚“ãµã‚™ã‚“ +ã‚ã‚“ã‚Š +ã‚ã‹ã™ +ã‚ã‹ã‚ +ã‚ã‹ã‚„ã¾ +ã‚ã‹ã‚Œã‚‹ +ã‚ã—㤠+ã‚ã—ã‚™ã¾ã— +ã‚ã™ã‚Œã‚‚ã® +ã‚らㆠ+ã‚れる +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/korean.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/korean.go new file mode 100644 index 00000000..1d317756 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/korean.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt + // $ crc32 korean.txt + // 4ef461eb + checksum := crc32.ChecksumIEEE([]byte(korean)) + if fmt.Sprintf("%x", checksum) != "4ef461eb" { + panic("korean checksum invalid") + } +} + +// Korean is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt +var Korean = strings.Split(strings.TrimSpace(korean), "\n") +var korean = `가격 +가á„ᅳᆷ +가난 +가능 +가득 +가르침 +가뭄 +가방 +가상 +가슴 +가운데 +가을 +가이드 +가입 +가장 +가정 +가족 +가죽 +각오 +각자 +간격 +간부 +간섭 +간장 +간접 +간판 +갈등 +갈비 +갈색 +갈증 +감각 +감기 +감소 +감수성 +감자 +감정 +갑자기 +강남 +강당 +강도 +강력히 +강변 +강북 +강사 +강수량 +강아지 +강원도 +강의 +강제 +강조 +같이 +개구리 +개나리 +개방 +개별 +개선 +개성 +개인 +객관적 +거실 +거액 +거울 +거짓 +거품 +걱정 +건강 +건물 +건설 +건조 +건축 +걸음 +검사 +검á„á…© +게시판 +게임 +겨울 +견해 +결과 +결국 +결론 +결석 +결승 +결심 +결정 +결혼 +경계 +경고 +경기 +경력 +경복궁 +경비 +경상도 +경영 +경우 +경쟁 +경제 +경주 +경찰 +경치 +경향 +경험 +계곡 +계단 +계란 +계산 +계속 +계약 +계절 +계층 +계획 +고객 +고구려 +고궁 +고급 +고등학생 +고무신 +고민 +고양이 +고장 +고전 +고집 +고춧가루 +고á„ᅩᆼ +고향 +곡식 +골목 +골á„ᅡ기 +골프 +공간 +공개 +공격 +공군 +공급 +공기 +공동 +공무원 +공부 +공사 +공식 +공업 +공연 +공원 +공장 +공á„á…¡ +공책 +공á„ᅩᆼ +공포 +공항 +공휴일 +과목 +과일 +과장 +과정 +과학 +관객 +관계 +관광 +관념 +관람 +관련 +관리 +관습 +관심 +관점 +관찰 +광경 +광고 +광장 +광주 +괴로움 +굉장히 +교과서 +교문 +교복 +교실 +교양 +교육 +교장 +교직 +교á„ᅩᆼ +교환 +교훈 +구경 +구름 +구멍 +구별 +구분 +구석 +구성 +구속 +구역 +구입 +구청 +구체적 +국가 +국기 +국내 +국립 +국물 +국민 +국수 +국어 +국왕 +국적 +국제 +국회 +군대 +군사 +군인 +궁극적 +권리 +권위 +권á„á…® +귀국 +귀신 +규정 +규칙 +균형 +그날 +그냥 +그늘 +그러나 +그룹 +그릇 +그림 +그제서야 +그á„ᅩ록 +극복 +극히 +근거 +근교 +근래 +근로 +근무 +근본 +근원 +근육 +근처 +글씨 +글자 +금강산 +금고 +금년 +금메달 +금액 +금연 +금요일 +금지 +긍정적 +기간 +기관 +기념 +기능 +기독교 +기둥 +기록 +기름 +기법 +기본 +기분 +기쁨 +기숙사 +기술 +기억 +기업 +기온 +기운 +기원 +기적 +기준 +기침 +기혼 +기획 +긴급 +긴장 +길이 +김밥 +김치 +김포공항 +á„ᅡᆨ두기 +á„ᅡᆷ빡 +á„ᅢ달음 +á„ᅢ소금 +á„ᅥᆸ질 +á„ᅩᆨ대기 +á„ᅩᆾ이ᇠ+나들이 +나란히 +나머지 +나물 +나침반 +나흘 +낙엽 +난방 +날개 +날씨 +날á„á…¡ +남녀 +남대문 +남매 +남산 +남자 +남편 +남학생 +낭비 +낱말 +내년 +내용 +내일 +냄비 +냄새 +냇물 +냉동 +냉면 +냉방 +냉장고 +넥á„á…¡á„‹á…µ +넷á„á…¢ +노동 +노란색 +노력 +노인 +녹음 +녹차 +녹화 +논리 +논문 +논쟁 +놀이 +농구 +농담 +농민 +농부 +농업 +농장 +농촌 +á„‚á…©á‡á„‹á…µ +눈동자 +눈물 +눈썹 +뉴욕 +á„‚á…³á„ᅵᆷ +늑대 +능동적 +능력 +다방 +다양성 +다음 +다이어á„á…³ +다행 +단계 +단골 +단독 +단맛 +단순 +단어 +단위 +단점 +단체 +단추 +단편 +단풍 +달걀 +달러 +달력 +달리 +닭고기 +담당 +담배 +담요 +담임 +답변 +답장 +당근 +당분간 +당연히 +당장 +대규모 +대낮 +대단히 +대답 +대도시 +대략 +대량 +대륙 +대문 +대부분 +대신 +대응 +대장 +대전 +대접 +대중 +대책 +대출 +대충 +대á„ᅩᆼ령 +대학 +대한민국 +대합실 +대형 +덩어리 +데이á„á…³ +도대체 +도덕 +도둑 +도망 +도서관 +도심 +도움 +도입 +도자기 +도저히 +도전 +도중 +도착 +독감 +독립 +독서 +독일 +독창적 +동화책 +뒷모습 +뒷산 +딸아이 +마누라 +마늘 +마당 +마라á„ᅩᆫ +마련 +마무리 +마사지 +마약 +마요네즈 +마을 +마음 +마이á„á…³ +마중 +마지막 +마찬가지 +마찰 +마흔 +막걸리 +막내 +막상 +만남 +만두 +만세 +만약 +만일 +만점 +만족 +만화 +많이 +말기 +말씀 +말á„á…® +맘대로 +망원경 +매년 +매달 +매력 +매번 +매스á„ᅥᆷ +매일 +매장 +맥주 +먹이 +먼저 +먼지 +멀리 +메일 +며느리 +며칠 +면담 +멸치 +명단 +명령 +명예 +명의 +명절 +명칭 +명함 +모금 +모니á„á…¥ +모델 +모든 +모범 +모습 +모양 +모임 +모조리 +모집 +모á„ᅮᆼ이 +목걸이 +목록 +목사 +목소리 +목숨 +목적 +목표 +몰래 +몸매 +몸무게 +몸살 +몸속 +몸짓 +몸á„ᅩᆼ +몹시 +무관심 +무궁화 +무더위 +무덤 +무르ᇠ+무슨 +무엇 +무역 +무용 +무조건 +무지개 +무척 +문구 +문득 +문법 +문서 +문제 +문학 +문화 +물가 +물건 +물결 +물고기 +물론 +물리학 +물음 +물질 +물체 +미국 +미디어 +미사일 +미술 +미역 +미용실 +미움 +미인 +미á„ᅵᆼ +미혼 +민간 +민족 +민주 +믿음 +밀가루 +밀리미á„á…¥ +밑바닥 +바가지 +바구니 +바나나 +바늘 +바닥 +바닷가 +바람 +바이러스 +바á„ᅡᆼ +박물관 +박사 +박수 +반대 +반드시 +반말 +반발 +반성 +반응 +반장 +반죽 +반지 +반찬 +받침 +발가락 +발걸음 +발견 +발달 +발레 +발목 +발바닥 +발생 +발음 +발자국 +발전 +발á„ᅩᆸ +발표 +밤하늘 +밥그릇 +밥맛 +밥상 +밥솥 +방금 +방면 +방문 +방바닥 +방법 +방송 +방식 +방안 +방울 +방지 +방학 +방해 +방향 +배경 +배á„ᅩᆸ +배달 +배드민á„ᅥᆫ +백두산 +백색 +백성 +백인 +백제 +백화점 +버릇 +버섯 +버á„ᅳᆫ +번개 +번역 +번지 +번호 +벌금 +벌레 +벌써 +범위 +범인 +범죄 +법률 +법원 +법적 +법칙 +베이징 +벨á„á…³ +변경 +변동 +변명 +변신 +변호사 +변화 +별도 +별명 +별일 +병실 +병아리 +병원 +보관 +보너스 +보라색 +보람 +보름 +보상 +보안 +보자기 +보장 +보전 +보존 +보á„ᅩᆼ +보편적 +보험 +복도 +복사 +복숭아 +복습 +볶음 +본격적 +본래 +본부 +본사 +본성 +본인 +본질 +볼펜 +봉사 +봉지 +봉á„á…® +부근 +부á„ᅳ러움 +부담 +부동산 +부문 +부분 +부산 +부상 +부엌 +부인 +부작용 +부장 +부정 +부족 +부지런히 +부친 +부á„ᅡᆨ +부품 +부회장 +북부 +북한 +분노 +분량 +분리 +분명 +분석 +분야 +분위기 +분필 +분홍색 +불고기 +불과 +불교 +불á„ᅩᆾ +불만 +불법 +불빛 +불안 +불이익 +불행 +브랜드 +비극 +비난 +비닐 +비둘기 +비디오 +비로소 +비만 +비명 +비밀 +비바람 +비빔밥 +비상 +비용 +비율 +비중 +비á„ᅡ민 +비판 +빌딩 +빗물 +빗방울 +빗줄기 +빛á„ᅡᆯ +빨간색 +빨래 +빨리 +사건 +사계절 +사나이 +사냥 +사람 +사랑 +사립 +사모님 +사물 +사방 +사상 +사생활 +사설 +사슴 +사실 +사업 +사용 +사월 +사장 +사전 +사진 +사촌 +사춘기 +사á„ᅡᆼ +사á„ᅮ리 +사흘 +산길 +산부인과 +산업 +산책 +살림 +살인 +살á„ᅡᆨ +삼계á„ᅡᆼ +삼국 +삼십 +삼월 +삼촌 +상관 +상금 +상대 +상류 +상반기 +상상 +상식 +상업 +상인 +상자 +상점 +상처 +상추 +상á„á…¢ +상표 +상품 +상황 +새벽 +색á„ᅡᆯ +색연필 +생각 +생명 +생물 +생방송 +생산 +생선 +생신 +생일 +생활 +서랍 +서른 +서명 +서민 +서비스 +서양 +서울 +서적 +서점 +서á„ᅩᆨ +서á„ᅳᆯ +석사 +석유 +선거 +선물 +선배 +선생 +선수 +선원 +선장 +선전 +선á„ᅢᆨ +선풍기 +설거지 +설날 +설렁á„ᅡᆼ +설명 +설문 +설사 +설악산 +설치 +설á„ᅡᆼ +섭씨 +성공 +성당 +성명 +성별 +성인 +성장 +성적 +성질 +성함 +세금 +세미나 +세상 +세월 +세종대왕 +세á„ᅡᆨ +센á„á…¥ +센á„ᅵ미á„á…¥ +셋á„á…¢ +소규모 +소극적 +소금 +소나기 +소년 +소득 +소망 +소문 +소설 +소속 +소아과 +소용 +소원 +소음 +소중히 +소지품 +소질 +소풍 +소형 +속담 +속도 +속옷 +손가락 +손길 +손녀 +손님 +손등 +손목 +손뼉 +손실 +손질 +손á„ᅩᆸ +손해 +솔직히 +솜씨 +송아지 +송이 +송편 +쇠고기 +쇼핑 +수건 +수년 +수단 +수돗물 +수동적 +수면 +수명 +수박 +수상 +수석 +수술 +수시로 +수업 +수염 +수영 +수입 +수준 +수집 +수출 +수á„ᅥᆺ +수필 +수학 +수험생 +수화기 +숙녀 +숙소 +숙제 +순간 +순서 +순수 +순식간 +순위 +숟가락 +술병 +술집 +숫자 +스님 +스물 +스스로 +스승 +스웨á„á…¥ +스위치 +스á„ᅦ이á„á…³ +스á„ᅲ디오 +스á„ᅳ레스 +스포츠 +슬á„ᅥᆨ +슬픔 +습관 +습기 +승객 +승리 +승부 +승용차 +승진 +시각 +시간 +시골 +시금치 +시나리오 +시댁 +시리즈 +시멘á„á…³ +시민 +시부모 +시선 +시설 +시스á„ᅦᆷ +시아버지 +시어머니 +시월 +시인 +시일 +시작 +시장 +시절 +시점 +시중 +시즌 +시집 +시청 +시합 +시험 +식구 +식기 +식당 +식량 +식료품 +식물 +식빵 +식사 +식생활 +식초 +식á„ᅡᆨ +식품 +신고 +신규 +신념 +신문 +신발 +신비 +신사 +신세 +신용 +신제품 +신청 +신체 +신화 +실감 +실내 +실력 +실례 +실망 +실수 +실습 +실시 +실장 +실정 +실질적 +실천 +실체 +실á„ᅥᆺ +실á„á…¢ +실패 +실험 +실현 +심리 +심부름 +심사 +심장 +심정 +심판 +쌍둥이 +씨름 +씨앗 +아가씨 +아나운서 +아드님 +아들 +아쉬움 +아스팔á„á…³ +아시아 +아울러 +아저씨 +아줌마 +아직 +아침 +á„‹á…¡á„‘á…¡á„á…³ +아프리á„á…¡ +아픔 +아홉 +아흔 +악기 +악몽 +악수 +안개 +안경 +안과 +안내 +안녕 +안동 +안방 +안부 +안주 +알루미늄 +알á„ᅩ올 +암시 +암á„ᅥᆺ +압력 +á„‹á…¡á‡á„‚ᅡᆯ +á„‹á…¡á‡á„†á…®á†« +애인 +애정 +액수 +앨범 +야간 +야단 +야옹 +약간 +약국 +약속 +약수 +약점 +약품 +약혼녀 +양념 +양력 +양말 +양배추 +양주 +양파 +어둠 +어려움 +어른 +어젯밤 +á„‹á…¥á„ᅢᆻ든 +á„‹á…¥á„ᅥ다가 +á„‹á…¥á„ᅥᆫ지 +언니 +언덕 +언론 +언어 +얼굴 +얼른 +얼음 +얼핏 +엄마 +업무 +업종 +업체 +엉덩이 +엉망 +엉á„ᅥ리 +엊그제 +에너지 +에어á„ᅥᆫ +엔진 +여건 +여고생 +여관 +여군 +여권 +여대생 +여덟 +여동생 +여든 +여론 +여름 +여섯 +여성 +여왕 +여인 +여전히 +여직원 +여학생 +여행 +역사 +역시 +역할 +연결 +연구 +연극 +연기 +연락 +연설 +연세 +연속 +연습 +연애 +연예인 +연인 +연장 +연주 +연출 +연필 +연합 +연휴 +열기 +열매 +열쇠 +열심히 +열정 +열차 +열흘 +염려 +엽서 +영국 +영남 +영상 +영양 +영역 +영웅 +영원히 +영하 +영향 +영혼 +영화 +á„‹á…§á‡á„€á…®á„…á…µ +á„‹á…§á‡á„‡á…¡á†¼ +á„‹á…§á‡á„Œá…µá†¸ +예감 +예금 +예방 +예산 +예상 +예선 +예술 +예습 +예식장 +예약 +예전 +예절 +예정 +á„‹á…¨á„ᅥᆫ대 +옛날 +오늘 +오락 +오랫동안 +오렌지 +오로지 +오른발 +오븐 +오십 +오염 +오월 +오전 +오직 +오징어 +오페라 +오피스á„ᅦᆯ +오히려 +옥상 +옥수수 +온갖 +온라인 +온몸 +온종일 +온á„ᅩᆼ +올가을 +올림픽 +올해 +옷차림 +와이셔츠 +와인 +완성 +완전 +왕비 +왕자 +왜냐하면 +왠지 +외갓집 +외국 +외로움 +외삼촌 +외출 +외침 +외할머니 +왼발 +왼손 +왼á„ᅩᆨ +요금 +요일 +요즘 +요청 +용기 +용서 +용어 +우산 +우선 +우승 +우연히 +우정 +우체국 +우편 +운동 +운명 +운반 +운전 +운행 +울산 +울음 +움직임 +웃어른 +웃음 +워낙 +원고 +원래 +원서 +원숭이 +원인 +원장 +원피스 +월급 +월드á„ᅥᆸ +월세 +월요일 +á„‹á…°á„‹á…µá„á…¥ +위반 +위법 +위성 +위원 +위험 +위협 +윗사람 +유난히 +유럽 +유명 +유물 +유산 +유적 +유치원 +유학 +유행 +유형 +육군 +육상 +육십 +육체 +은행 +음력 +음료 +음반 +음성 +음식 +음악 +음주 +의견 +의논 +의문 +의복 +의식 +의심 +의외로 +의욕 +의원 +의학 +이것 +이곳 +이념 +이놈 +이달 +이대로 +이동 +이렇게 +이력서 +이론적 +이름 +이민 +이발소 +이별 +이불 +이빨 +이상 +이성 +이슬 +이야기 +이용 +이웃 +이월 +이윽고 +이익 +이전 +이중 +á„‹á…µá„ᅳᆮ날 +á„‹á…µá„ᅳᆯ +이혼 +인간 +인격 +인공 +인구 +인근 +인기 +인도 +인류 +인물 +인생 +인쇄 +인연 +인원 +인재 +인종 +인천 +인체 +인á„ᅥ넷 +인하 +인형 +일곱 +일기 +일단 +일대 +일등 +일반 +일본 +일부 +일상 +일생 +일손 +일요일 +일월 +일정 +일종 +일주일 +일á„ᅵᆨ +일체 +일치 +일행 +일회용 +임금 +임무 +입대 +입력 +입맛 +입사 +입술 +입시 +입원 +입장 +입학 +자가용 +자격 +자극 +자동 +자랑 +자부심 +자식 +자신 +자연 +자원 +자율 +자전거 +자정 +자존심 +자판 +작가 +작년 +작성 +작업 +작용 +작은딸 +작품 +잔디 +잔뜩 +잔치 +잘못 +잠á„ᅡᆫ +잠수함 +잠시 +잠옷 +잠자리 +잡지 +장관 +장군 +장기간 +장래 +장례 +장르 +장마 +장면 +장모 +장미 +장비 +장사 +장소 +장식 +장애인 +장인 +장점 +장차 +장학금 +재능 +재빨리 +재산 +재생 +재작년 +재정 +재채기 +재판 +재학 +재활용 +저것 +저고리 +저곳 +저녁 +저런 +저렇게 +저번 +저울 +저절로 +저축 +적극 +적당히 +적성 +적용 +적응 +전개 +전공 +전기 +전달 +전라도 +전망 +전문 +전반 +전부 +전세 +전시 +전용 +전자 +전쟁 +전주 +전철 +전체 +전á„ᅩᆼ +전혀 +전후 +절대 +절망 +절반 +절약 +절차 +점검 +점수 +점심 +점원 +점점 +점차 +접근 +접시 +접촉 +젓가락 +정거장 +정도 +정류장 +정리 +정말 +정면 +정문 +정반대 +정보 +정부 +정비 +정상 +정성 +정오 +정원 +정장 +정지 +정치 +정확히 +제공 +제과점 +제대로 +제목 +제발 +제법 +제삿날 +제안 +제일 +제작 +제주도 +제출 +제품 +제한 +조각 +조건 +조금 +조깅 +조명 +조미료 +조상 +조선 +조용히 +조절 +조정 +조직 +존댓말 +존재 +졸업 +졸음 +종교 +종로 +종류 +종소리 +종업원 +종종 +종합 +좌석 +죄인 +주관적 +주름 +주말 +주머니 +주먹 +주문 +주민 +주방 +주변 +주식 +주인 +주일 +주장 +주전자 +주á„ᅢᆨ +준비 +줄거리 +줄기 +줄무늬 +중간 +중계방송 +중국 +중년 +중단 +중독 +중반 +중부 +중세 +중소기업 +중순 +중앙 +중요 +중학교 +즉석 +즉시 +즐거움 +증가 +증거 +증권 +증상 +증세 +지각 +지갑 +지경 +지극히 +지금 +지급 +지능 +지름길 +지리산 +지방 +지붕 +지식 +지역 +지우개 +지원 +지적 +지점 +지진 +지출 +직선 +직업 +직원 +직장 +진급 +진동 +진로 +진료 +진리 +진á„á…¡ +진찰 +진출 +진á„ᅩᆼ +진행 +질문 +질병 +질서 +짐작 +집단 +집안 +집중 +á„ᅡ증 +á„á…µá„ᅥ기 +차남 +á„Žá…¡á„…á…¡á„…á…µ +차량 +차림 +차별 +차선 +차츰 +착각 +찬물 +찬성 +참가 +참기름 +참새 +참석 +참여 +참외 +참조 +찻잔 +창가 +창고 +창구 +창문 +창밖 +창작 +창조 +채널 +채점 +책가방 +책방 +책상 +책임 +챔피언 +처벌 +처음 +천국 +천둥 +천장 +천재 +천천히 +철도 +철저히 +철학 +첫날 +첫á„á…¢ +청년 +청바지 +청소 +청춘 +체계 +체력 +체온 +체육 +체중 +체험 +초등학생 +초반 +초밥 +초상화 +초순 +초여름 +초원 +초저녁 +초점 +초청 +á„Žá…©á„ᅩᆯ릿 +촛불 +총각 +총리 +총장 +촬영 +최근 +최상 +최선 +최신 +최악 +최종 +추석 +추억 +추진 +추천 +추측 +축구 +축소 +축제 +축하 +출근 +출발 +출산 +출신 +출연 +출입 +출장 +출판 +충격 +충고 +충돌 +충분히 +충청도 +취업 +취직 +취향 +치약 +친구 +친척 +칠십 +칠월 +칠판 +침대 +침묵 +침실 +칫솔 +칭찬 +á„ᅡ메라 +á„ᅡ운á„á…¥ +á„ᅡᆯ국수 +á„ᅢ릭á„á…¥ +á„ᅢᆷ퍼스 +á„ᅢᆷ페인 +á„á…¥á„ᅳᆫ +á„ᅥᆫ디션 +á„ᅥᆯ러 +á„ᅥᆷ퓨á„á…¥ +á„á…©á„ᅵ리 +á„ᅩ미디 +á„ᅩᆫ서á„á…³ +á„ᅩᆯ라 +á„ᅩᆷ플렉스 +á„ᅩᆼ나물 +á„ᅫ감 +á„ᅮ데á„á…¡ +á„ᅳ림 +á„ᅳᆫ길 +á„ᅳᆫ딸 +á„ᅳᆫ소리 +á„ᅳᆫ아들 +á„ᅳᆫ어머니 +á„ᅳᆫ일 +á„ᅳᆫ절 +á„ᅳᆯ래식 +á„ᅳᆯ럽 +á„ᅵᆯ로 +á„ᅡ입 +á„ᅡ자기 +á„ᅡᆨ구 +á„ᅡᆨ자 +á„ᅡᆫ생 +á„ᅢ권도 +á„ᅢ양 +á„ᅢ풍 +á„ᅢᆨ시 +á„ᅢᆯ런á„á…³ +á„ᅥ널 +á„ᅥ미널 +á„ᅦ니스 +á„ᅦ스á„á…³ +á„ᅦ이블 +á„ᅦᆯ레비전 +á„ᅩ론 +á„ᅩ마á„á…© +á„ᅩ요일 +á„ᅩᆼ계 +á„ᅩᆼ과 +á„ᅩᆼ로 +á„ᅩᆼ신 +á„ᅩᆼ역 +á„ᅩᆼ일 +á„ᅩᆼ장 +á„ᅩᆼ제 +á„ᅩᆼ증 +á„ᅩᆼ합 +á„ᅩᆼ화 +á„ᅬ근 +á„ᅬ원 +á„ᅬ직금 +á„ᅱ김 +á„ᅳ럭 +á„ᅳᆨ급 +á„ᅳᆨ별 +á„ᅳᆨ성 +á„ᅳᆨ수 +á„ᅳᆨ징 +á„ᅳᆨ히 +á„ᅳᆫá„ᅳᆫ히 +á„ᅵ셔츠 +파란색 +파일 +파출소 +판결 +판단 +판매 +판사 +팔십 +팔월 +팝송 +패션 +팩스 +팩시밀리 +팬á„á…µ +퍼센á„á…³ +페인á„á…³ +편견 +편의 +편지 +편히 +평가 +평균 +평생 +평소 +평양 +평일 +평화 +포스á„á…¥ +포인á„á…³ +포장 +포함 +표면 +표정 +표준 +표현 +품목 +품질 +풍경 +풍속 +풍습 +프랑스 +프린á„á…¥ +플라스á„ᅵᆨ +피곤 +피망 +피아노 +필름 +필수 +필요 +필자 +필á„ᅩᆼ +핑계 +하느님 +하늘 +하드웨어 +하룻밤 +하반기 +하숙집 +하순 +á„’á…¡á„‹á…§á„ᅳᆫ +하지만 +하천 +하품 +하필 +학과 +학교 +학급 +학기 +학년 +학력 +학번 +학부모 +학비 +학생 +학술 +학습 +학용품 +학원 +학위 +학자 +학점 +한계 +한글 +한á„ᅥ번에 +한낮 +한눈 +한동안 +한때 +한라산 +한마디 +한문 +한번 +한복 +한식 +한여름 +한á„ᅩᆨ +할머니 +할아버지 +할인 +함á„á…¦ +함부로 +합격 +합리적 +항공 +항구 +항상 +항의 +해결 +해군 +해답 +해당 +해물 +해석 +해설 +해수욕장 +해안 +핵심 +핸드백 +햄버거 +햇볕 +햇살 +행동 +행복 +행사 +행운 +행위 +향기 +향상 +향수 +허락 +허용 +헬기 +현관 +현금 +현대 +현상 +현실 +현장 +현재 +현지 +혈액 +협력 +형부 +형사 +형수 +형식 +형제 +형á„á…¢ +형편 +á„’á…¨á„ᅢᆨ +호기심 +호남 +호랑이 +호박 +á„’á…©á„ᅦᆯ +호흡 +혹시 +홀로 +홈페이지 +홍보 +홍수 +홍차 +화면 +화분 +화살 +화요일 +화장 +화학 +확보 +확인 +확장 +확정 +환갑 +환경 +환영 +환율 +환자 +활기 +활동 +활발히 +활용 +활á„ᅡᆨ +회견 +회관 +회복 +회색 +회원 +회장 +회전 +횟수 +횡단보도 +효율적 +후반 +후춧가루 +훈련 +훨씬 +휴식 +휴일 +흉내 +흐름 +흑백 +흑인 +흔적 +흔히 +흥미 +흥분 +희곡 +희망 +희생 +흰색 +힘á„ᅥᆺ +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/spanish.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/spanish.go new file mode 100644 index 00000000..ad76da97 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/spanish.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt + // $ crc32 spanish.txt + // 266e4f3d + checksum := crc32.ChecksumIEEE([]byte(spanish)) + if fmt.Sprintf("%x", checksum) != "266e4f3d" { + panic("spanish checksum invalid") + } +} + +// Spanish is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt +var Spanish = strings.Split(strings.TrimSpace(spanish), "\n") +var spanish = `aÌbaco +abdomen +abeja +abierto +abogado +abono +aborto +abrazo +abrir +abuelo +abuso +acabar +academia +acceso +accioÌn +aceite +acelga +acento +aceptar +aÌcido +aclarar +acneÌ +acoger +acoso +activo +acto +actriz +actuar +acudir +acuerdo +acusar +adicto +admitir +adoptar +adorno +aduana +adulto +aeÌreo +afectar +aficioÌn +afinar +afirmar +aÌgil +agitar +agoniÌa +agosto +agotar +agregar +agrio +agua +agudo +aÌguila +aguja +ahogo +ahorro +aire +aislar +ajedrez +ajeno +ajuste +alacraÌn +alambre +alarma +alba +aÌlbum +alcalde +aldea +alegre +alejar +alerta +aleta +alfiler +alga +algodoÌn +aliado +aliento +alivio +alma +almeja +almiÌbar +altar +alteza +altivo +alto +altura +alumno +alzar +amable +amante +amapola +amargo +amasar +aÌmbar +aÌmbito +ameno +amigo +amistad +amor +amparo +amplio +ancho +anciano +ancla +andar +andeÌn +anemia +aÌngulo +anillo +aÌnimo +aniÌs +anotar +antena +antiguo +antojo +anual +anular +anuncio +añadir +añejo +año +apagar +aparato +apetito +apio +aplicar +apodo +aporte +apoyo +aprender +aprobar +apuesta +apuro +arado +araña +arar +aÌrbitro +aÌrbol +arbusto +archivo +arco +arder +ardilla +arduo +aÌrea +aÌrido +aries +armoniÌa +arneÌs +aroma +arpa +arpoÌn +arreglo +arroz +arruga +arte +artista +asa +asado +asalto +ascenso +asegurar +aseo +asesor +asiento +asilo +asistir +asno +asombro +aÌspero +astilla +astro +astuto +asumir +asunto +atajo +ataque +atar +atento +ateo +aÌtico +atleta +aÌtomo +atraer +atroz +atuÌn +audaz +audio +auge +aula +aumento +ausente +autor +aval +avance +avaro +ave +avellana +avena +avestruz +avioÌn +aviso +ayer +ayuda +ayuno +azafraÌn +azar +azote +azuÌcar +azufre +azul +baba +babor +bache +bahiÌa +baile +bajar +balanza +balcoÌn +balde +bambuÌ +banco +banda +baño +barba +barco +barniz +barro +baÌscula +bastoÌn +basura +batalla +bateriÌa +batir +batuta +bauÌl +bazar +bebeÌ +bebida +bello +besar +beso +bestia +bicho +bien +bingo +blanco +bloque +blusa +boa +bobina +bobo +boca +bocina +boda +bodega +boina +bola +bolero +bolsa +bomba +bondad +bonito +bono +bonsaÌi +borde +borrar +bosque +bote +botiÌn +boÌveda +bozal +bravo +brazo +brecha +breve +brillo +brinco +brisa +broca +broma +bronce +brote +bruja +brusco +bruto +buceo +bucle +bueno +buey +bufanda +bufoÌn +buÌho +buitre +bulto +burbuja +burla +burro +buscar +butaca +buzoÌn +caballo +cabeza +cabina +cabra +cacao +cadaÌver +cadena +caer +cafeÌ +caiÌda +caimaÌn +caja +cajoÌn +cal +calamar +calcio +caldo +calidad +calle +calma +calor +calvo +cama +cambio +camello +camino +campo +caÌncer +candil +canela +canguro +canica +canto +caña +cañoÌn +caoba +caos +capaz +capitaÌn +capote +captar +capucha +cara +carboÌn +caÌrcel +careta +carga +cariño +carne +carpeta +carro +carta +casa +casco +casero +caspa +castor +catorce +catre +caudal +causa +cazo +cebolla +ceder +cedro +celda +ceÌlebre +celoso +ceÌlula +cemento +ceniza +centro +cerca +cerdo +cereza +cero +cerrar +certeza +ceÌsped +cetro +chacal +chaleco +champuÌ +chancla +chapa +charla +chico +chiste +chivo +choque +choza +chuleta +chupar +cicloÌn +ciego +cielo +cien +cierto +cifra +cigarro +cima +cinco +cine +cinta +cipreÌs +circo +ciruela +cisne +cita +ciudad +clamor +clan +claro +clase +clave +cliente +clima +cliÌnica +cobre +coccioÌn +cochino +cocina +coco +coÌdigo +codo +cofre +coger +cohete +cojiÌn +cojo +cola +colcha +colegio +colgar +colina +collar +colmo +columna +combate +comer +comida +coÌmodo +compra +conde +conejo +conga +conocer +consejo +contar +copa +copia +corazoÌn +corbata +corcho +cordoÌn +corona +correr +coser +cosmos +costa +craÌneo +craÌter +crear +crecer +creiÌdo +crema +criÌa +crimen +cripta +crisis +cromo +croÌnica +croqueta +crudo +cruz +cuadro +cuarto +cuatro +cubo +cubrir +cuchara +cuello +cuento +cuerda +cuesta +cueva +cuidar +culebra +culpa +culto +cumbre +cumplir +cuna +cuneta +cuota +cupoÌn +cuÌpula +curar +curioso +curso +curva +cutis +dama +danza +dar +dardo +daÌtil +deber +deÌbil +deÌcada +decir +dedo +defensa +definir +dejar +delfiÌn +delgado +delito +demora +denso +dental +deporte +derecho +derrota +desayuno +deseo +desfile +desnudo +destino +desviÌo +detalle +detener +deuda +diÌa +diablo +diadema +diamante +diana +diario +dibujo +dictar +diente +dieta +diez +difiÌcil +digno +dilema +diluir +dinero +directo +dirigir +disco +diseño +disfraz +diva +divino +doble +doce +dolor +domingo +don +donar +dorado +dormir +dorso +dos +dosis +dragoÌn +droga +ducha +duda +duelo +dueño +dulce +duÌo +duque +durar +dureza +duro +eÌbano +ebrio +echar +eco +ecuador +edad +edicioÌn +edificio +editor +educar +efecto +eficaz +eje +ejemplo +elefante +elegir +elemento +elevar +elipse +eÌlite +elixir +elogio +eludir +embudo +emitir +emocioÌn +empate +empeño +empleo +empresa +enano +encargo +enchufe +enciÌa +enemigo +enero +enfado +enfermo +engaño +enigma +enlace +enorme +enredo +ensayo +enseñar +entero +entrar +envase +enviÌo +eÌpoca +equipo +erizo +escala +escena +escolar +escribir +escudo +esencia +esfera +esfuerzo +espada +espejo +espiÌa +esposa +espuma +esquiÌ +estar +este +estilo +estufa +etapa +eterno +eÌtica +etnia +evadir +evaluar +evento +evitar +exacto +examen +exceso +excusa +exento +exigir +exilio +existir +eÌxito +experto +explicar +exponer +extremo +faÌbrica +faÌbula +fachada +faÌcil +factor +faena +faja +falda +fallo +falso +faltar +fama +familia +famoso +faraoÌn +farmacia +farol +farsa +fase +fatiga +fauna +favor +fax +febrero +fecha +feliz +feo +feria +feroz +feÌrtil +fervor +festiÌn +fiable +fianza +fiar +fibra +ficcioÌn +ficha +fideo +fiebre +fiel +fiera +fiesta +figura +fijar +fijo +fila +filete +filial +filtro +fin +finca +fingir +finito +firma +flaco +flauta +flecha +flor +flota +fluir +flujo +fluÌor +fobia +foca +fogata +fogoÌn +folio +folleto +fondo +forma +forro +fortuna +forzar +fosa +foto +fracaso +fraÌgil +franja +frase +fraude +freiÌr +freno +fresa +friÌo +frito +fruta +fuego +fuente +fuerza +fuga +fumar +funcioÌn +funda +furgoÌn +furia +fusil +fuÌtbol +futuro +gacela +gafas +gaita +gajo +gala +galeriÌa +gallo +gamba +ganar +gancho +ganga +ganso +garaje +garza +gasolina +gastar +gato +gavilaÌn +gemelo +gemir +gen +geÌnero +genio +gente +geranio +gerente +germen +gesto +gigante +gimnasio +girar +giro +glaciar +globo +gloria +gol +golfo +goloso +golpe +goma +gordo +gorila +gorra +gota +goteo +gozar +grada +graÌfico +grano +grasa +gratis +grave +grieta +grillo +gripe +gris +grito +grosor +gruÌa +grueso +grumo +grupo +guante +guapo +guardia +guerra +guiÌa +guiño +guion +guiso +guitarra +gusano +gustar +haber +haÌbil +hablar +hacer +hacha +hada +hallar +hamaca +harina +haz +hazaña +hebilla +hebra +hecho +helado +helio +hembra +herir +hermano +heÌroe +hervir +hielo +hierro +hiÌgado +higiene +hijo +himno +historia +hocico +hogar +hoguera +hoja +hombre +hongo +honor +honra +hora +hormiga +horno +hostil +hoyo +hueco +huelga +huerta +hueso +huevo +huida +huir +humano +huÌmedo +humilde +humo +hundir +huracaÌn +hurto +icono +ideal +idioma +iÌdolo +iglesia +igluÌ +igual +ilegal +ilusioÌn +imagen +imaÌn +imitar +impar +imperio +imponer +impulso +incapaz +iÌndice +inerte +infiel +informe +ingenio +inicio +inmenso +inmune +innato +insecto +instante +intereÌs +iÌntimo +intuir +inuÌtil +invierno +ira +iris +ironiÌa +isla +islote +jabaliÌ +jaboÌn +jamoÌn +jarabe +jardiÌn +jarra +jaula +jazmiÌn +jefe +jeringa +jinete +jornada +joroba +joven +joya +juerga +jueves +juez +jugador +jugo +juguete +juicio +junco +jungla +junio +juntar +juÌpiter +jurar +justo +juvenil +juzgar +kilo +koala +labio +lacio +lacra +lado +ladroÌn +lagarto +laÌgrima +laguna +laico +lamer +laÌmina +laÌmpara +lana +lancha +langosta +lanza +laÌpiz +largo +larva +laÌstima +lata +laÌtex +latir +laurel +lavar +lazo +leal +leccioÌn +leche +lector +leer +legioÌn +legumbre +lejano +lengua +lento +leña +leoÌn +leopardo +lesioÌn +letal +letra +leve +leyenda +libertad +libro +licor +liÌder +lidiar +lienzo +liga +ligero +lima +liÌmite +limoÌn +limpio +lince +lindo +liÌnea +lingote +lino +linterna +liÌquido +liso +lista +litera +litio +litro +llaga +llama +llanto +llave +llegar +llenar +llevar +llorar +llover +lluvia +lobo +locioÌn +loco +locura +loÌgica +logro +lombriz +lomo +lonja +lote +lucha +lucir +lugar +lujo +luna +lunes +lupa +lustro +luto +luz +maceta +macho +madera +madre +maduro +maestro +mafia +magia +mago +maiÌz +maldad +maleta +malla +malo +mamaÌ +mambo +mamut +manco +mando +manejar +manga +maniquiÌ +manjar +mano +manso +manta +mañana +mapa +maÌquina +mar +marco +marea +marfil +margen +marido +maÌrmol +marroÌn +martes +marzo +masa +maÌscara +masivo +matar +materia +matiz +matriz +maÌximo +mayor +mazorca +mecha +medalla +medio +meÌdula +mejilla +mejor +melena +meloÌn +memoria +menor +mensaje +mente +menuÌ +mercado +merengue +meÌrito +mes +mesoÌn +meta +meter +meÌtodo +metro +mezcla +miedo +miel +miembro +miga +mil +milagro +militar +milloÌn +mimo +mina +minero +miÌnimo +minuto +miope +mirar +misa +miseria +misil +mismo +mitad +mito +mochila +mocioÌn +moda +modelo +moho +mojar +molde +moler +molino +momento +momia +monarca +moneda +monja +monto +moño +morada +morder +moreno +morir +morro +morsa +mortal +mosca +mostrar +motivo +mover +moÌvil +mozo +mucho +mudar +mueble +muela +muerte +muestra +mugre +mujer +mula +muleta +multa +mundo +muñeca +mural +muro +muÌsculo +museo +musgo +muÌsica +muslo +naÌcar +nacioÌn +nadar +naipe +naranja +nariz +narrar +nasal +natal +nativo +natural +naÌusea +naval +nave +navidad +necio +neÌctar +negar +negocio +negro +neoÌn +nervio +neto +neutro +nevar +nevera +nicho +nido +niebla +nieto +niñez +niño +niÌtido +nivel +nobleza +noche +noÌmina +noria +norma +norte +nota +noticia +novato +novela +novio +nube +nuca +nuÌcleo +nudillo +nudo +nuera +nueve +nuez +nulo +nuÌmero +nutria +oasis +obeso +obispo +objeto +obra +obrero +observar +obtener +obvio +oca +ocaso +oceÌano +ochenta +ocho +ocio +ocre +octavo +octubre +oculto +ocupar +ocurrir +odiar +odio +odisea +oeste +ofensa +oferta +oficio +ofrecer +ogro +oiÌdo +oiÌr +ojo +ola +oleada +olfato +olivo +olla +olmo +olor +olvido +ombligo +onda +onza +opaco +opcioÌn +oÌpera +opinar +oponer +optar +oÌptica +opuesto +oracioÌn +orador +oral +oÌrbita +orca +orden +oreja +oÌrgano +orgiÌa +orgullo +oriente +origen +orilla +oro +orquesta +oruga +osadiÌa +oscuro +osezno +oso +ostra +otoño +otro +oveja +oÌvulo +oÌxido +oxiÌgeno +oyente +ozono +pacto +padre +paella +paÌgina +pago +paiÌs +paÌjaro +palabra +palco +paleta +paÌlido +palma +paloma +palpar +pan +panal +paÌnico +pantera +pañuelo +papaÌ +papel +papilla +paquete +parar +parcela +pared +parir +paro +paÌrpado +parque +paÌrrafo +parte +pasar +paseo +pasioÌn +paso +pasta +pata +patio +patria +pausa +pauta +pavo +payaso +peatoÌn +pecado +pecera +pecho +pedal +pedir +pegar +peine +pelar +peldaño +pelea +peligro +pellejo +pelo +peluca +pena +pensar +peñoÌn +peoÌn +peor +pepino +pequeño +pera +percha +perder +pereza +perfil +perico +perla +permiso +perro +persona +pesa +pesca +peÌsimo +pestaña +peÌtalo +petroÌleo +pez +pezuña +picar +pichoÌn +pie +piedra +pierna +pieza +pijama +pilar +piloto +pimienta +pino +pintor +pinza +piña +piojo +pipa +pirata +pisar +piscina +piso +pista +pitoÌn +pizca +placa +plan +plata +playa +plaza +pleito +pleno +plomo +pluma +plural +pobre +poco +poder +podio +poema +poesiÌa +poeta +polen +policiÌa +pollo +polvo +pomada +pomelo +pomo +pompa +poner +porcioÌn +portal +posada +poseer +posible +poste +potencia +potro +pozo +prado +precoz +pregunta +premio +prensa +preso +previo +primo +priÌncipe +prisioÌn +privar +proa +probar +proceso +producto +proeza +profesor +programa +prole +promesa +pronto +propio +proÌximo +prueba +puÌblico +puchero +pudor +pueblo +puerta +puesto +pulga +pulir +pulmoÌn +pulpo +pulso +puma +punto +puñal +puño +pupa +pupila +pureÌ +quedar +queja +quemar +querer +queso +quieto +quiÌmica +quince +quitar +raÌbano +rabia +rabo +racioÌn +radical +raiÌz +rama +rampa +rancho +rango +rapaz +raÌpido +rapto +rasgo +raspa +rato +rayo +raza +razoÌn +reaccioÌn +realidad +rebaño +rebote +recaer +receta +rechazo +recoger +recreo +recto +recurso +red +redondo +reducir +reflejo +reforma +refraÌn +refugio +regalo +regir +regla +regreso +reheÌn +reino +reiÌr +reja +relato +relevo +relieve +relleno +reloj +remar +remedio +remo +rencor +rendir +renta +reparto +repetir +reposo +reptil +res +rescate +resina +respeto +resto +resumen +retiro +retorno +retrato +reunir +reveÌs +revista +rey +rezar +rico +riego +rienda +riesgo +rifa +riÌgido +rigor +rincoÌn +riñoÌn +riÌo +riqueza +risa +ritmo +rito +rizo +roble +roce +rociar +rodar +rodeo +rodilla +roer +rojizo +rojo +romero +romper +ron +ronco +ronda +ropa +ropero +rosa +rosca +rostro +rotar +rubiÌ +rubor +rudo +rueda +rugir +ruido +ruina +ruleta +rulo +rumbo +rumor +ruptura +ruta +rutina +saÌbado +saber +sabio +sable +sacar +sagaz +sagrado +sala +saldo +salero +salir +salmoÌn +saloÌn +salsa +salto +salud +salvar +samba +sancioÌn +sandiÌa +sanear +sangre +sanidad +sano +santo +sapo +saque +sardina +sarteÌn +sastre +sataÌn +sauna +saxofoÌn +seccioÌn +seco +secreto +secta +sed +seguir +seis +sello +selva +semana +semilla +senda +sensor +señal +señor +separar +sepia +sequiÌa +ser +serie +sermoÌn +servir +sesenta +sesioÌn +seta +setenta +severo +sexo +sexto +sidra +siesta +siete +siglo +signo +siÌlaba +silbar +silencio +silla +siÌmbolo +simio +sirena +sistema +sitio +situar +sobre +socio +sodio +sol +solapa +soldado +soledad +soÌlido +soltar +solucioÌn +sombra +sondeo +sonido +sonoro +sonrisa +sopa +soplar +soporte +sordo +sorpresa +sorteo +sosteÌn +soÌtano +suave +subir +suceso +sudor +suegra +suelo +sueño +suerte +sufrir +sujeto +sultaÌn +sumar +superar +suplir +suponer +supremo +sur +surco +sureño +surgir +susto +sutil +tabaco +tabique +tabla +tabuÌ +taco +tacto +tajo +talar +talco +talento +talla +taloÌn +tamaño +tambor +tango +tanque +tapa +tapete +tapia +tapoÌn +taquilla +tarde +tarea +tarifa +tarjeta +tarot +tarro +tarta +tatuaje +tauro +taza +tazoÌn +teatro +techo +tecla +teÌcnica +tejado +tejer +tejido +tela +teleÌfono +tema +temor +templo +tenaz +tender +tener +tenis +tenso +teoriÌa +terapia +terco +teÌrmino +ternura +terror +tesis +tesoro +testigo +tetera +texto +tez +tibio +tiburoÌn +tiempo +tienda +tierra +tieso +tigre +tijera +tilde +timbre +tiÌmido +timo +tinta +tiÌo +tiÌpico +tipo +tira +tiroÌn +titaÌn +tiÌtere +tiÌtulo +tiza +toalla +tobillo +tocar +tocino +todo +toga +toldo +tomar +tono +tonto +topar +tope +toque +toÌrax +torero +tormenta +torneo +toro +torpedo +torre +torso +tortuga +tos +tosco +toser +toÌxico +trabajo +tractor +traer +traÌfico +trago +traje +tramo +trance +trato +trauma +trazar +treÌbol +tregua +treinta +tren +trepar +tres +tribu +trigo +tripa +triste +triunfo +trofeo +trompa +tronco +tropa +trote +trozo +truco +trueno +trufa +tuberiÌa +tubo +tuerto +tumba +tumor +tuÌnel +tuÌnica +turbina +turismo +turno +tutor +ubicar +uÌlcera +umbral +unidad +unir +universo +uno +untar +uña +urbano +urbe +urgente +urna +usar +usuario +uÌtil +utopiÌa +uva +vaca +vaciÌo +vacuna +vagar +vago +vaina +vajilla +vale +vaÌlido +valle +valor +vaÌlvula +vampiro +vara +variar +varoÌn +vaso +vecino +vector +vehiÌculo +veinte +vejez +vela +velero +veloz +vena +vencer +venda +veneno +vengar +venir +venta +venus +ver +verano +verbo +verde +vereda +verja +verso +verter +viÌa +viaje +vibrar +vicio +viÌctima +vida +viÌdeo +vidrio +viejo +viernes +vigor +vil +villa +vinagre +vino +viñedo +violiÌn +viral +virgo +virtud +visor +viÌspera +vista +vitamina +viudo +vivaz +vivero +vivir +vivo +volcaÌn +volumen +volver +voraz +votar +voto +voz +vuelo +vulgar +yacer +yate +yegua +yema +yerno +yeso +yodo +yoga +yogur +zafiro +zanja +zapato +zarza +zona +zorro +zumo +zurdo +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44.go new file mode 100644 index 00000000..cb85d5a8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44.go @@ -0,0 +1,93 @@ +/* +Package bip44 implements the bip44 spec https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki +*/ +package bip44 + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/bip32" +) + +// Bip44's bip32 path: m / purpose' / coin_type' / account' / change / address_index + +var ( + // ErrInvalidCoinType coin_type is >= 0x80000000 + ErrInvalidCoinType = errors.New("invalid bip44 coin type") + + // ErrInvalidAccount account is >= 0x80000000 + ErrInvalidAccount = errors.New("bip44 account index must be < 0x80000000") +) + +// CoinType is the coin_type part of the bip44 path +type CoinType uint32 + +const ( + // CoinTypeBitcoin is the coin_type for Bitcoin + CoinTypeBitcoin CoinType = 0 + // CoinTypeBitcoinTestnet is the coin_type for Skycoin + CoinTypeBitcoinTestnet CoinType = 1 + // CoinTypeSkycoin is the coin_type for Skycoin + CoinTypeSkycoin CoinType = 8000 + + // ExternalChainIndex is the index of the external chain + ExternalChainIndex uint32 = 0 + // ChangeChainIndex is the index of the change chain + ChangeChainIndex uint32 = 1 +) + +// Coin is a bip32 node at the `coin_type` level of a bip44 path +type Coin struct { + *bip32.PrivateKey +} + +// NewCoin creates a bip32 node at the `coin_type` level of a bip44 path +func NewCoin(seed []byte, coinType CoinType) (*Coin, error) { + if uint32(coinType) >= bip32.FirstHardenedChild { + return nil, ErrInvalidCoinType + } + + path := fmt.Sprintf("m/44'/%d'", coinType) + pk, err := bip32.NewPrivateKeyFromPath(seed, path) + if err != nil { + return nil, err + } + + return &Coin{ + pk, + }, nil +} + +// Account creates a bip32 node at the `account'` level of the bip44 path. +// The account number should be as it would appear in the path string, without +// the apostrophe that indicates hardening +func (c *Coin) Account(account uint32) (*Account, error) { + if account >= bip32.FirstHardenedChild { + return nil, ErrInvalidAccount + } + + pk, err := c.NewPrivateChildKey(account + bip32.FirstHardenedChild) + if err != nil { + return nil, err + } + + return &Account{ + pk, + }, nil +} + +// Account is a bip32 node at the `account` level of a bip44 path +type Account struct { + *bip32.PrivateKey +} + +// External returns the external chain node, to be used for receiving coins +func (a *Account) External() (*bip32.PrivateKey, error) { + return a.NewPrivateChildKey(ExternalChainIndex) +} + +// Change returns the change chain node, to be used for change addresses +func (a *Account) Change() (*bip32.PrivateKey, error) { + return a.NewPrivateChildKey(ChangeChainIndex) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44_test.go new file mode 100644 index 00000000..413b8703 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44_test.go @@ -0,0 +1,76 @@ +package bip44 + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" +) + +func mustDefaultSeed(t *testing.T) []byte { + mnemonic := "dizzy cigar grant ramp inmate uniform gold success able payment faith practice" + passphrase := "" + seed, err := bip39.NewSeed(mnemonic, passphrase) + require.NoError(t, err) + require.Equal(t, "24e563fb095d766df3862c70432cc1b2210b24d232da69af7af09d2ec86d28782ce58035bae29994c84081836aebe36a9b46af1578262fefc53e37efbe94be57", hex.EncodeToString(seed)) + return seed +} + +func TestNewCoin(t *testing.T) { + // bad seed + _, err := NewCoin(make([]byte, 3), CoinTypeBitcoin) + require.Equal(t, err, bip32.ErrInvalidSeedLength) + + // bad coin_type + _, err = NewCoin(mustDefaultSeed(t), CoinType(bip32.FirstHardenedChild)) + require.Equal(t, err, ErrInvalidCoinType) + _, err = NewCoin(mustDefaultSeed(t), CoinType(1+bip32.FirstHardenedChild)) + require.Equal(t, err, ErrInvalidCoinType) + + c, err := NewCoin(mustDefaultSeed(t), CoinTypeBitcoin) + require.NoError(t, err) + + account, err := c.Account(0) + require.NoError(t, err) + require.Equal(t, "xprv9yKAFQtFghZSe4mfdpdqFm1WWmGeQbYMB4MSGUB85zbKGQgSxty4duZb8k6hNoHVd2UR7Y3QhWU3rS9wox9ewgVG7gDLyYTL4yzEuqUCjvF", account.String()) + require.Equal(t, "xpub6CJWevR9X57jrYr8jrAqctxF4o78p4GCYHH34rajeL8J9D1bWSHKBht4yzwiTQ4FP4HyQpx99iLxvU54rbEbcxBUgxzTGGudBVXb1N2gcHF", account.PublicKey().String()) + + account, err = c.Account(1) + require.NoError(t, err) + require.Equal(t, "xprv9yKAFQtFghZSgShGXkxHsYQfFaqMyutf3izng8tV4Tmp7gidQUPB8kCuv66yukidivM2oSaUvGus8ffnYvYKChB7DME2H2AvUq8LM2rXUzF", account.String()) + require.Equal(t, "xpub6CJWevR9X57jtvmjdnVJEgMPocfrPNcWQwvPUXJ6coJnzV3mx1hRgYXPmQJh5vLQvrVCY8LtJB5xLLiPJVmpSwBe2yhonQLoQuSsCF8YPLN", account.PublicKey().String()) + + _, err = c.Account(0x80000000) + require.Equal(t, err, ErrInvalidAccount) + _, err = c.Account(0x80000001) + require.Equal(t, err, ErrInvalidAccount) + + external, err := account.External() + require.NoError(t, err) + require.Equal(t, "xprv9zjsvjLiqSerDzbeRXPeXwz8tuQ7eRUABkgFAgLPHw1KzGKkgBhJhGaMYHM8j2KDXBZTCv4m19qjxrrD7gusrtdpZ7xzJywdXHaMZEjf3Uv", external.String()) + require.Equal(t, "xpub6DjELEscfpD9SUg7XYveu5vsSwEc3tC1Yybqy4jzrGYJs4euDj1ZF4tqPZYvViMn9cvBobHyubuuh69PZ1szaBBx5oxPiQzD492B6C4QDHe", external.PublicKey().String()) + + external0, err := external.NewPublicChildKey(0) + require.NoError(t, err) + require.Equal(t, "034d36f3bcd74e19204e75b81b9c0726e41b799858b92bab73f4cd7498308c5c8b", hex.EncodeToString(external0.Key)) + + external1, err := external.NewPublicChildKey(1) + require.NoError(t, err) + require.Equal(t, "02f7309e9f559d847ee9cc9ee144cfa490791e33e908fdbde2dade50a389408b01", hex.EncodeToString(external1.Key)) + + change, err := account.Change() + require.NoError(t, err) + require.Equal(t, "xprv9zjsvjLiqSerGzJyBrpZgCaGpQCeFDnZEuAV714WigmFyHT4nFLhZLeuHzLNE19PgkZeQ5Uf2pjFZjQTHbkugDbmw5TAPAvgo2jsaTnZo2A", change.String()) + require.Equal(t, "xpub6DjELEscfpD9VUPSHtMa3LX1NS38egWQc865uPU8H2JEr5nDKnex78yP9GxhFr5cnCRgiQF1dkv7aR7moraPrv73KHwSkDaXdWookR1Sh9p", change.PublicKey().String()) + + change0, err := change.NewPublicChildKey(0) + require.NoError(t, err) + require.Equal(t, "026d3eb891e81ecabedfa8560166af383457aedaf172af9d57d00508faa5f57c4c", hex.EncodeToString(change0.Key)) + + change1, err := change.NewPublicChildKey(1) + require.NoError(t, err) + require.Equal(t, "02681b301293fdf0292cd679b37d60b92a71b389fd994b2b57c8daf99532bfb4a5", hex.EncodeToString(change1.Key)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/example_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/example_test.go new file mode 100644 index 00000000..70bdec7e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/example_test.go @@ -0,0 +1,114 @@ +package bip44 + +import ( + "encoding/hex" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/bip39" +) + +func Example() { + // Create a bip39 seed from a mnenomic + // import "github.com/SkycoinProject/skycoin/src/cipher/bip39" + // mnemonic := bip39.NewDefaultMnemonic() + mnemonic := "dizzy cigar grant ramp inmate uniform gold success able payment faith practice" + passphrase := "" + seed, err := bip39.NewSeed(mnemonic, passphrase) + if err != nil { + panic(err) + } + fmt.Println("bip39 seed") + fmt.Println(hex.EncodeToString(seed)) + + // Create a root node for Bitcoin + c, err := NewCoin(seed, CoinTypeBitcoin) + if err != nil { + panic(err) + } + + // Create an account node + fmt.Println("m/44'/0'/0'") + account, err := c.Account(0) + if err != nil { + panic(err) + } + + fmt.Println(account.PrivateKey) + fmt.Println(account.PublicKey()) + + // Create an external address node + fmt.Println("m/44'/0'/0'/0") + external, err := account.External() + if err != nil { + panic(err) + } + + fmt.Println(external) + fmt.Println(external.PublicKey()) + + // Create the first child of the external address chain + fmt.Println("m/44'/0'/0'/0/0") + external0, err := external.NewPrivateChildKey(0) + if err != nil { + panic(err) + } + + fmt.Println("pubkey:", hex.EncodeToString(external0.PublicKey().Key)) + + // Create the second child of the external address chain + fmt.Println("m/44'/0'/0'/0/1") + external1, err := external.NewPrivateChildKey(1) + if err != nil { + panic(err) + } + + fmt.Println("pubkey:", hex.EncodeToString(external1.PublicKey().Key)) + + // Create a change address node + fmt.Println("m/44'/0'/0'/1") + change, err := account.Change() + if err != nil { + panic(err) + } + + fmt.Println(change) + fmt.Println(change.PublicKey()) + + // Create the first child of the change address chain + fmt.Println("m/44'/0'/0'/1/0") + change0, err := change.NewPrivateChildKey(0) + if err != nil { + panic(err) + } + + fmt.Println("pubkey:", hex.EncodeToString(change0.PublicKey().Key)) + + // Create the second child of the change address chain + fmt.Println("m/44'/0'/0'/1/1") + change1, err := change.NewPrivateChildKey(1) + if err != nil { + panic(err) + } + + fmt.Println("pubkey:", hex.EncodeToString(change1.PublicKey().Key)) + + // Output: bip39 seed + // 24e563fb095d766df3862c70432cc1b2210b24d232da69af7af09d2ec86d28782ce58035bae29994c84081836aebe36a9b46af1578262fefc53e37efbe94be57 + // m/44'/0'/0' + // xprv9yKAFQtFghZSe4mfdpdqFm1WWmGeQbYMB4MSGUB85zbKGQgSxty4duZb8k6hNoHVd2UR7Y3QhWU3rS9wox9ewgVG7gDLyYTL4yzEuqUCjvF + // xpub6CJWevR9X57jrYr8jrAqctxF4o78p4GCYHH34rajeL8J9D1bWSHKBht4yzwiTQ4FP4HyQpx99iLxvU54rbEbcxBUgxzTGGudBVXb1N2gcHF + // m/44'/0'/0'/0 + // xprv9zeGUHRUFEwnEAY21z9XBWsY2LpS1ZKhViJt9dhTqsqb8wjnhP2B2rv2mXAzvcUnUnSNZTzTs2sEUSqxAXaD6ptwjrLAmFrRHw6QkwN7KEa + // xpub6DdcsnxN5cW5SecV81gXYepGaNevR23YrwEUx275QDNa1k4wEvLRafEWcpP5gKP3AkR67td8nx2PykEWxzUvJCgeoUKuM8px7uhAmYCQWEg + // m/44'/0'/0'/0/0 + // pubkey: 021008142807feb53f67baa91c166d97cf74f7f059f3eb29f24ff8a6d1f2c80500 + // m/44'/0'/0'/0/1 + // pubkey: 020606c2577bb430dcaf405246e85456638dfb266d774c1e8386f9276892fd6fdc + // m/44'/0'/0'/1 + // xprv9zeGUHRUFEwnGcomH56JtQ7Xp66GYMH3o77jHDfVaLG1gN6dVtDp7ndvEcpvEK7JjYg3sTkteV8FziQ3HGjzSp3KxAcFAy3u84EQFYDqkPq + // xpub6DdcsnxN5cW5V6tEP6dKFY4GN7vkwozuAL3L5c578fnzZARn3RY4faxQ5rqy1dR8mY8GUWoQJtLBLyXnFiGE9j3r4ShiVb12W5NPSmkgrpp + // m/44'/0'/0'/1/0 + // pubkey: 030d61ebd6f36a4552127b35d1b8e13b1d8060534c6ccbb2f77c76cfbea56cf87f + // m/44'/0'/0'/1/1 + // pubkey: 03513484252259b77c8aeb594e2cfd0437e1650da18fe6296be8a3aa3979313219 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin.go new file mode 100644 index 00000000..61747e4f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin.go @@ -0,0 +1,195 @@ +package cipher + +import ( + "bytes" + "errors" + "log" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +var ( + // ErrInvalidLength Unexpected size of string or bytes buffer + ErrInvalidLength = errors.New("Invalid length") + // ErrBitcoinWIFInvalidFirstByte Unexpected value (!= 0x80) of first byte in Bitcoin Wallet Import Format + ErrBitcoinWIFInvalidFirstByte = errors.New("Bitcoin WIF: First byte invalid") + // ErrBitcoinWIFInvalidSuffix Unexpected value (!= 0x01) of 33rd byte in Bitcoin Wallet Import Format + ErrBitcoinWIFInvalidSuffix = errors.New("Bitcoin WIF: Invalid 33rd byte") + // ErrBitcoinWIFInvalidChecksum Invalid Checksum in Bitcoin WIF address + ErrBitcoinWIFInvalidChecksum = errors.New("Bitcoin WIF: Checksum fail") +) + +// BitcoinAddress is a bitcoin address +type BitcoinAddress struct { + Version byte // 1 byte + Key Ripemd160 // 20 byte pubkey hash +} + +// BitcoinPubKeyRipemd160 returns ripemd160(sha256(key)) +func BitcoinPubKeyRipemd160(pubKey PubKey) Ripemd160 { + r1 := SumSHA256(pubKey[:]) + return HashRipemd160(r1[:]) +} + +// BitcoinAddressFromPubKey creates a mainnet (version 0) BitcoinAddress from PubKey as ripemd160(sha256(pubkey))) +func BitcoinAddressFromPubKey(pubKey PubKey) BitcoinAddress { + return BitcoinAddress{ + Version: 0, + Key: BitcoinPubKeyRipemd160(pubKey), + } +} + +// BitcoinAddressFromSecKey generates a BitcoinAddress from SecKey +func BitcoinAddressFromSecKey(secKey SecKey) (BitcoinAddress, error) { + p, err := PubKeyFromSecKey(secKey) + if err != nil { + return BitcoinAddress{}, err + } + return BitcoinAddressFromPubKey(p), nil +} + +// MustBitcoinAddressFromSecKey generates a BitcoinAddress from SecKey, panics on error +func MustBitcoinAddressFromSecKey(secKey SecKey) BitcoinAddress { + return BitcoinAddressFromPubKey(MustPubKeyFromSecKey(secKey)) +} + +// DecodeBase58BitcoinAddress creates a BitcoinAddress from its base58 encoding +func DecodeBase58BitcoinAddress(addr string) (BitcoinAddress, error) { + b, err := base58.Decode(addr) + if err != nil { + return BitcoinAddress{}, err + } + return BitcoinAddressFromBytes(b) +} + +// MustDecodeBase58BitcoinAddress creates a BitcoinAddress from its base58 encoding, panics on error +func MustDecodeBase58BitcoinAddress(addr string) BitcoinAddress { + a, err := DecodeBase58BitcoinAddress(addr) + if err != nil { + log.Panicf("Invalid bitcoin address %s: %v", addr, err) + } + return a +} + +// BitcoinAddressFromBytes converts []byte to a BitcoinAddress. Only supports mainnet (version 0) addresses. +func BitcoinAddressFromBytes(b []byte) (BitcoinAddress, error) { + if len(b) != 20+1+4 { + return BitcoinAddress{}, ErrAddressInvalidLength + } + a := BitcoinAddress{} + copy(a.Key[0:20], b[1:21]) + a.Version = b[0] + + var checksum [4]byte + copy(checksum[0:4], b[21:25]) + + if checksum != a.Checksum() { + return BitcoinAddress{}, ErrAddressInvalidChecksum + } + + // BitcoinAddress only supports mainnet addresses for now + if a.Version != 0 { + return BitcoinAddress{}, ErrAddressInvalidVersion + } + + return a, nil +} + +// MustBitcoinAddressFromBytes converts []byte to a BitcoinAddress, panics on error +func MustBitcoinAddressFromBytes(b []byte) BitcoinAddress { + addr, err := BitcoinAddressFromBytes(b) + if err != nil { + log.Panic(err) + } + + return addr +} + +// Null returns true if the address is null (0x0000....) +func (addr BitcoinAddress) Null() bool { + return addr == BitcoinAddress{} +} + +// Bytes returns bitcoin address as byte slice +func (addr BitcoinAddress) Bytes() []byte { + b := make([]byte, 20+1+4) + b[0] = addr.Version + copy(b[1:21], addr.Key[0:20]) + chksum := addr.Checksum() + copy(b[21:25], chksum[0:4]) + return b +} + +// Verify checks that the bitcoin address appears valid for the public key +func (addr BitcoinAddress) Verify(key PubKey) error { + // BitcoinAddress only supports mainnet addresses for now + if addr.Version != 0x00 { + return ErrAddressInvalidVersion + } + if addr.Key != BitcoinPubKeyRipemd160(key) { + return ErrAddressInvalidPubKey + } + return nil +} + +// String convert bitcoin address to hex string +func (addr BitcoinAddress) String() string { + return string(base58.Encode(addr.Bytes())) +} + +// Checksum returns a bitcoin address Checksum which is the first 4 bytes of sha256(sha256(version+key)) +func (addr BitcoinAddress) Checksum() Checksum { + r1 := append([]byte{addr.Version}, addr.Key[:]...) + r2 := DoubleSHA256(r1[:]) + c := Checksum{} + copy(c[:], r2[:len(c)]) + return c +} + +// BitcoinWalletImportFormatFromSeckey exports seckey in wallet import format +// key must be compressed +func BitcoinWalletImportFormatFromSeckey(seckey SecKey) string { + b1 := append([]byte{byte(0x80)}, seckey[:]...) + b2 := append(b1[:], []byte{0x01}...) + b3 := DoubleSHA256(b2) //checksum + b4 := append(b2, b3[0:4]...) + return string(base58.Encode(b4)) +} + +// SecKeyFromBitcoinWalletImportFormat extracts a seckey from the bitcoin wallet import format +func SecKeyFromBitcoinWalletImportFormat(input string) (SecKey, error) { + b, err := base58.Decode(input) + if err != nil { + return SecKey{}, err + } + + //1+32+1+4 + if len(b) != 38 { + return SecKey{}, ErrInvalidLength + } + if b[0] != 0x80 { + return SecKey{}, ErrBitcoinWIFInvalidFirstByte + } + + if b[1+32] != 0x01 { + return SecKey{}, ErrBitcoinWIFInvalidSuffix + } + + b2 := DoubleSHA256(b[0:34]) + chksum := b[34:38] + + if !bytes.Equal(chksum, b2[0:4]) { + return SecKey{}, ErrBitcoinWIFInvalidChecksum + } + + return NewSecKey(b[1:33]) +} + +// MustSecKeyFromBitcoinWalletImportFormat extracts a seckey from the bitcoin wallet import format, panics on error +func MustSecKeyFromBitcoinWalletImportFormat(input string) SecKey { + seckey, err := SecKeyFromBitcoinWalletImportFormat(input) + if err != nil { + log.Panicf("MustSecKeyFromBitcoinWalletImportFormat, invalid seckey, %v", err) + } + return seckey +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin_test.go new file mode 100644 index 00000000..2e8e500f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin_test.go @@ -0,0 +1,376 @@ +package cipher + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +func TestBitcoinAddress(t *testing.T) { + cases := []struct { + seckey string + pubkey string + addr string + }{ + { + seckey: "1111111111111111111111111111111111111111111111111111111111111111", + pubkey: "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa", + addr: "1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", + }, + { + seckey: "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + pubkey: "02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd", + addr: "1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a", + }, + { + seckey: "47f7616ea6f9b923076625b4488115de1ef1187f760e65f89eb6f4f7ff04b012", + pubkey: "032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3", + addr: "19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV", + }, + } + + for _, tc := range cases { + t.Run(tc.addr, func(t *testing.T) { + seckey := MustSecKeyFromHex(tc.seckey) + + pubkey := MustPubKeyFromSecKey(seckey) + require.Equal(t, tc.pubkey, pubkey.Hex()) + + bitcoinAddr := BitcoinAddressFromPubKey(pubkey) + require.Equal(t, tc.addr, bitcoinAddr.String()) + + secAddr := MustBitcoinAddressFromSecKey(seckey) + require.Equal(t, tc.addr, secAddr.String()) + + secAddr, err := BitcoinAddressFromSecKey(seckey) + require.NoError(t, err) + require.Equal(t, tc.addr, secAddr.String()) + + pubAddr := BitcoinAddressFromPubKey(pubkey) + require.Equal(t, tc.addr, pubAddr.String()) + }) + } +} + +func TestMustDecodeBase58BitcoinAddress(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + require.Panics(t, func() { MustDecodeBase58BitcoinAddress("") }) + require.Panics(t, func() { MustDecodeBase58BitcoinAddress("cascs") }) + b := a.Bytes() + h := string(base58.Encode(b[:len(b)/2])) + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(h) }) + h = string(base58.Encode(b)) + require.NotPanics(t, func() { MustDecodeBase58BitcoinAddress(h) }) + a2 := MustDecodeBase58BitcoinAddress(h) + require.Equal(t, a, a2) + + require.NotPanics(t, func() { MustDecodeBase58BitcoinAddress(a.String()) }) + a2 = MustDecodeBase58BitcoinAddress(a.String()) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + badAddr := " " + a.String() + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(badAddr) }) + + // preceding zeroes are invalid + badAddr = "000" + a.String() + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(badAddr) }) + + // trailing whitespace is invalid + badAddr = a.String() + " " + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(badAddr) }) + + // trailing zeroes are invalid + badAddr = a.String() + "000" + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(badAddr) }) + + null := "1111111111111111111111111" + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(null) }) +} + +func TestDecodeBase58BitcoinAddress(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + _, err := DecodeBase58BitcoinAddress("") + require.Error(t, err) + + _, err = DecodeBase58BitcoinAddress("cascs") + require.Error(t, err) + + b := a.Bytes() + h := string(base58.Encode(b[:len(b)/2])) + _, err = DecodeBase58BitcoinAddress(h) + require.Error(t, err) + + h = string(base58.Encode(b)) + a2, err := DecodeBase58BitcoinAddress(h) + require.NoError(t, err) + require.Equal(t, a, a2) + + as := a.String() + a2, err = DecodeBase58BitcoinAddress(as) + require.NoError(t, err) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + as2 := " " + as + _, err = DecodeBase58BitcoinAddress(as2) + require.Error(t, err) + + // preceding zeroes are invalid + as2 = "000" + as + _, err = DecodeBase58BitcoinAddress(as2) + require.Error(t, err) + + // trailing whitespace is invalid + as2 = as + " " + _, err = DecodeBase58BitcoinAddress(as2) + require.Error(t, err) + + // trailing zeroes are invalid + as2 = as + "000" + _, err = DecodeBase58BitcoinAddress(as2) + require.Error(t, err) + + // null address is invalid + null := "1111111111111111111111111" + _, err = DecodeBase58BitcoinAddress(null) + require.Error(t, err) + require.Equal(t, ErrAddressInvalidChecksum, err) +} + +func TestBitcoinAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + a2, err := BitcoinAddressFromBytes(a.Bytes()) + require.NoError(t, err) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.Bytes() + _, err = BitcoinAddressFromBytes(b[:len(b)-2]) + require.EqualError(t, err, "Invalid address length") + + // Invalid checksum + b[len(b)-1] += byte(1) + _, err = BitcoinAddressFromBytes(b) + require.EqualError(t, err, "Invalid checksum") + + a.Version = 2 + b = a.Bytes() + _, err = BitcoinAddressFromBytes(b) + require.EqualError(t, err, "Address version invalid") +} + +func TestMustBitcoinAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + a2 := MustBitcoinAddressFromBytes(a.Bytes()) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.Bytes() + require.Panics(t, func() { + MustBitcoinAddressFromBytes(b[:len(b)-2]) + }) + + // Invalid checksum + b[len(b)-1] += byte(1) + require.Panics(t, func() { + MustBitcoinAddressFromBytes(b) + }) + + a.Version = 2 + b = a.Bytes() + require.Panics(t, func() { + MustBitcoinAddressFromBytes(b) + }) +} + +func TestBitcoinAddressFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + a, err := BitcoinAddressFromSecKey(s) + require.NoError(t, err) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + + _, err = BitcoinAddressFromSecKey(SecKey{}) + require.Equal(t, errors.New("Attempt to load null seckey, unsafe"), err) +} + +func TestMustBitcoinAddressFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + a := MustBitcoinAddressFromSecKey(s) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + + require.Panics(t, func() { + MustBitcoinAddressFromSecKey(SecKey{}) + }) +} + +func TestBitcoinAddressNull(t *testing.T) { + var a BitcoinAddress + require.True(t, a.Null()) + + p, _ := GenerateKeyPair() + a = BitcoinAddressFromPubKey(p) + require.False(t, a.Null()) +} + +func TestBitcoinAddressVerify(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + // Invalid pubkey + require.Error(t, a.Verify(PubKey{})) + p2, _ := GenerateKeyPair() + require.Error(t, a.Verify(p2)) + // Bad version + a.Version = 0x01 + require.Error(t, a.Verify(p)) +} + +func TestBitcoinWIFRoundTrip(t *testing.T) { + _, seckey1 := GenerateKeyPair() + wif1 := BitcoinWalletImportFormatFromSeckey(seckey1) + seckey2, err := SecKeyFromBitcoinWalletImportFormat(wif1) + wif2 := BitcoinWalletImportFormatFromSeckey(seckey2) + + require.NoError(t, err) + require.Equal(t, seckey1, seckey2) + require.Equal(t, seckey1.Hex(), seckey2.Hex()) + require.Equal(t, wif1, wif2) +} + +func TestBitcoinWIF(t *testing.T) { + cases := []struct { + wif string + pubkey string + addr string + }{ + { + wif: "KwntMbt59tTsj8xqpqYqRRWufyjGunvhSyeMo3NTYpFYzZbXJ5Hp", + pubkey: "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa", + addr: "1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", + }, + { + wif: "L4ezQvyC6QoBhxB4GVs9fAPhUKtbaXYUn8YTqoeXwbevQq4U92vN", + pubkey: "02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd", + addr: "1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a", + }, + { + wif: "KydbzBtk6uc7M6dXwEgTEH2sphZxSPbmDSz6kUUHi4eUpSQuhEbq", + pubkey: "032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3", + addr: "19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV", + }, + } + + for _, tc := range cases { + t.Run(tc.addr, func(t *testing.T) { + seckey, err := SecKeyFromBitcoinWalletImportFormat(tc.wif) + require.NoError(t, err) + + require.NotPanics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(tc.wif) + }) + + pubkey := MustPubKeyFromSecKey(seckey) + require.Equal(t, tc.pubkey, pubkey.Hex()) + + bitcoinAddr := BitcoinAddressFromPubKey(pubkey) + require.Equal(t, tc.addr, bitcoinAddr.String()) + }) + } +} + +func TestBitcoinWIFFailures(t *testing.T) { + a := " asdio" + _, err := SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Invalid base58 character"), err) + + a = string(base58.Encode(randBytes(t, 37))) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Invalid length"), err) + + a = string(base58.Encode(randBytes(t, 39))) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Invalid length"), err) + + b := randBytes(t, 38) + b[0] = 0x70 + a = string(base58.Encode(b)) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Bitcoin WIF: First byte invalid"), err) + + b = randBytes(t, 38) + b[0] = 0x80 + b[33] = 0x02 + a = string(base58.Encode(b)) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Bitcoin WIF: Invalid 33rd byte"), err) + + b = randBytes(t, 38) + b[0] = 0x80 + b[33] = 0x01 + hashed := DoubleSHA256(b[0:34]) + chksum := hashed[0:4] + chksum[0] = chksum[0] + 1 + copy(b[34:38], chksum[:]) + a = string(base58.Encode(b)) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Bitcoin WIF: Checksum fail"), err) +} + +func TestMustBitcoinWIFFailures(t *testing.T) { + a := " asdio" + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + a = string(base58.Encode(randBytes(t, 37))) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + a = string(base58.Encode(randBytes(t, 39))) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + b := randBytes(t, 38) + b[0] = 0x70 + a = string(base58.Encode(b)) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + b = randBytes(t, 38) + b[0] = 0x80 + b[33] = 0x02 + a = string(base58.Encode(b)) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + b = randBytes(t, 38) + b[0] = 0x80 + b[33] = 0x01 + hashed := DoubleSHA256(b[0:34]) + chksum := hashed[0:4] + chksum[0] = chksum[0] + 1 + copy(b[34:38], chksum[:]) + a = string(base58.Encode(b)) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go new file mode 100644 index 00000000..aa62b306 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go @@ -0,0 +1,83 @@ +// Copyright 2016 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 chacha20poly1305 implements the ChaCha20-Poly1305 AEAD as specified in RFC 7539. +package chacha20poly1305 // import "github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305" + +import ( + "crypto/cipher" + "errors" +) + +const ( + // KeySize is the size of the key used by this AEAD, in bytes. + KeySize = 32 + // NonceSize is the size of the nonce used with this AEAD, in bytes. + NonceSize = 12 +) + +type chacha20poly1305 struct { + key [32]byte +} + +// New returns a ChaCha20-Poly1305 AEAD that uses the given, 256-bit key. +func New(key []byte) (cipher.AEAD, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20poly1305: bad key length") + } + ret := new(chacha20poly1305) + copy(ret.key[:], key) + return ret, nil +} + +func (c *chacha20poly1305) NonceSize() int { + return NonceSize +} + +func (c *chacha20poly1305) Overhead() int { + return 16 +} + +func (c *chacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Seal") + } + + if uint64(len(plaintext)) > (1<<38)-64 { + panic("chacha20poly1305: plaintext too large") + } + + return c.seal(dst, nonce, plaintext, additionalData) +} + +var errOpen = errors.New("chacha20poly1305: message authentication failed") + +func (c *chacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Open") + } + if len(ciphertext) < 16 { + return nil, errOpen + } + if uint64(len(ciphertext)) > (1<<38)-48 { + panic("chacha20poly1305: ciphertext too large") + } + + return c.open(dst, nonce, ciphertext, additionalData) +} + +// sliceForAppend takes a slice and a requested number of bytes. It returns a +// slice with the contents of the given slice followed by that many bytes and a +// second slice that aliases into it and contains only the extra bytes. If the +// original slice has sufficient capacity then no allocation is performed. +func sliceForAppend(in []byte, n int) (head, tail []byte) { + if total := len(in) + n; cap(in) >= total { + head = in[:total] + } else { + head = make([]byte, total) + copy(head, in) + } + tail = head[len(in):] + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go new file mode 100644 index 00000000..7cd7ad83 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go @@ -0,0 +1,127 @@ +// Copyright 2016 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. + +// +build go1.7,amd64,!gccgo,!appengine + +package chacha20poly1305 + +import "encoding/binary" + +//go:noescape +func chacha20Poly1305Open(dst []byte, key []uint32, src, ad []byte) bool + +//go:noescape +func chacha20Poly1305Seal(dst []byte, key []uint32, src, ad []byte) + +// cpuid is implemented in chacha20poly1305_amd64.s. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in chacha20poly1305_amd64.s. +func xgetbv() (eax, edx uint32) + +var ( + useASM bool + useAVX2 bool +) + +func init() { + detectCPUFeatures() +} + +// detectCPUFeatures is used to detect if cpu instructions +// used by the functions implemented in assembler in +// chacha20poly1305_amd64.s are supported. +func detectCPUFeatures() { + maxID, _, _, _ := cpuid(0, 0) + if maxID < 1 { + return + } + + _, _, ecx1, _ := cpuid(1, 0) + + haveSSSE3 := isSet(9, ecx1) + useASM = haveSSSE3 + + haveOSXSAVE := isSet(27, ecx1) + + osSupportsAVX := false + // For XGETBV, OSXSAVE bit is required and sufficient. + if haveOSXSAVE { + eax, _ := xgetbv() + // Check if XMM and YMM registers have OS support. + osSupportsAVX = isSet(1, eax) && isSet(2, eax) + } + haveAVX := isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, _, _ := cpuid(7, 0) + haveAVX2 := isSet(5, ebx7) && haveAVX + haveBMI2 := isSet(8, ebx7) + + useAVX2 = haveAVX2 && haveBMI2 +} + +// isSet checks if bit at bitpos is set in value. +func isSet(bitpos uint, value uint32) bool { + return value&(1<+0x00(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x04(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x08(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x0c(SB)/4, $0x6b206574 +DATA ·chacha20Constants<>+0x10(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x14(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x18(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x1c(SB)/4, $0x6b206574 +// <<< 16 with PSHUFB +DATA ·rol16<>+0x00(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A +DATA ·rol16<>+0x10(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x18(SB)/8, $0x0D0C0F0E09080B0A +// <<< 8 with PSHUFB +DATA ·rol8<>+0x00(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x08(SB)/8, $0x0E0D0C0F0A09080B +DATA ·rol8<>+0x10(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x18(SB)/8, $0x0E0D0C0F0A09080B + +DATA ·avx2InitMask<>+0x00(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x08(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x10(SB)/8, $0x1 +DATA ·avx2InitMask<>+0x18(SB)/8, $0x0 + +DATA ·avx2IncMask<>+0x00(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x08(SB)/8, $0x0 +DATA ·avx2IncMask<>+0x10(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x18(SB)/8, $0x0 +// Poly1305 key clamp +DATA ·polyClampMask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·polyClampMask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +DATA ·polyClampMask<>+0x10(SB)/8, $0xFFFFFFFFFFFFFFFF +DATA ·polyClampMask<>+0x18(SB)/8, $0xFFFFFFFFFFFFFFFF + +DATA ·sseIncMask<>+0x00(SB)/8, $0x1 +DATA ·sseIncMask<>+0x08(SB)/8, $0x0 +// To load/store the last < 16 bytes in a buffer +DATA ·andMask<>+0x00(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x08(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x10(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0x18(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x20(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0x28(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x30(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0x38(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x40(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0x48(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x50(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0x58(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x60(SB)/8, $0x00ffffffffffffff +DATA ·andMask<>+0x68(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x70(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x78(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x80(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x88(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x90(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x98(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0xa0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xa8(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0xb0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xb8(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0xc0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xc8(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0xd0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xd8(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0xe0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xe8(SB)/8, $0x00ffffffffffffff + +GLOBL ·chacha20Constants<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol16<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol8<>(SB), (NOPTR+RODATA), $32 +GLOBL ·sseIncMask<>(SB), (NOPTR+RODATA), $16 +GLOBL ·avx2IncMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·avx2InitMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·polyClampMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·andMask<>(SB), (NOPTR+RODATA), $240 +// No PALIGNR in Go ASM yet (but VPALIGNR is present). +#define shiftB0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X3, X3 +#define shiftB1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x04 // PALIGNR $4, X4, X4 +#define shiftB2Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X5, X5 +#define shiftB3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X13, X13 +#define shiftC0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X6, X6 +#define shiftC1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x08 // PALIGNR $8, X7, X7 +#define shiftC2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc0; BYTE $0x08 // PALIGNR $8, X8, X8 +#define shiftC3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X14, X14 +#define shiftD0Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x0c // PALIGNR $12, X9, X9 +#define shiftD1Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x0c // PALIGNR $12, X10, X10 +#define shiftD2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X11, X11 +#define shiftD3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x0c // PALIGNR $12, X15, X15 +#define shiftB0Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X3, X3 +#define shiftB1Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x0c // PALIGNR $12, X4, X4 +#define shiftB2Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X5, X5 +#define shiftB3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X13, X13 +#define shiftC0Right shiftC0Left +#define shiftC1Right shiftC1Left +#define shiftC2Right shiftC2Left +#define shiftC3Right shiftC3Left +#define shiftD0Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x04 // PALIGNR $4, X9, X9 +#define shiftD1Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x04 // PALIGNR $4, X10, X10 +#define shiftD2Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X11, X11 +#define shiftD3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x04 // PALIGNR $4, X15, X15 +// Some macros +#define chachaQR(A, B, C, D, T) \ + PADDD B, A; PXOR A, D; PSHUFB ·rol16<>(SB), D \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $12, T; PSRLL $20, B; PXOR T, B \ + PADDD B, A; PXOR A, D; PSHUFB ·rol8<>(SB), D \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $7, T; PSRLL $25, B; PXOR T, B + +#define chachaQR_AVX2(A, B, C, D, T) \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol16<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $12, B, T; VPSRLD $20, B, B; VPXOR T, B, B \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol8<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $7, B, T; VPSRLD $25, B, B; VPXOR T, B, B + +#define polyAdd(S) ADDQ S, acc0; ADCQ 8+S, acc1; ADCQ $1, acc2 +#define polyMulStage1 MOVQ (0*8)(BP), AX; MOVQ AX, t2; MULQ acc0; MOVQ AX, t0; MOVQ DX, t1; MOVQ (0*8)(BP), AX; MULQ acc1; IMULQ acc2, t2; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2 MOVQ (1*8)(BP), AX; MOVQ AX, t3; MULQ acc0; ADDQ AX, t1; ADCQ $0, DX; MOVQ DX, acc0; MOVQ (1*8)(BP), AX; MULQ acc1; ADDQ AX, t2; ADCQ $0, DX +#define polyMulStage3 IMULQ acc2, t3; ADDQ acc0, t2; ADCQ DX, t3 +#define polyMulReduceStage MOVQ t0, acc0; MOVQ t1, acc1; MOVQ t2, acc2; ANDQ $3, acc2; MOVQ t2, t0; ANDQ $-4, t0; MOVQ t3, t1; SHRQ $2, t2:t3; SHRQ $2, t3; ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $0, acc2; ADDQ t2, acc0; ADCQ t3, acc1; ADCQ $0, acc2 + +#define polyMulStage1_AVX2 MOVQ (0*8)(BP), DX; MOVQ DX, t2; MULXQ acc0, t0, t1; IMULQ acc2, t2; MULXQ acc1, AX, DX; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2_AVX2 MOVQ (1*8)(BP), DX; MULXQ acc0, acc0, AX; ADDQ acc0, t1; MULXQ acc1, acc1, t3; ADCQ acc1, t2; ADCQ $0, t3 +#define polyMulStage3_AVX2 IMULQ acc2, DX; ADDQ AX, t2; ADCQ DX, t3 + +#define polyMul polyMulStage1; polyMulStage2; polyMulStage3; polyMulReduceStage +#define polyMulAVX2 polyMulStage1_AVX2; polyMulStage2_AVX2; polyMulStage3_AVX2; polyMulReduceStage +// ---------------------------------------------------------------------------- +TEXT polyHashADInternal<>(SB), NOSPLIT, $0 + // adp points to beginning of additional data + // itr2 holds ad length + XORQ acc0, acc0 + XORQ acc1, acc1 + XORQ acc2, acc2 + CMPQ itr2, $13 + JNE hashADLoop + +openFastTLSAD: + // Special treatment for the TLS case of 13 bytes + MOVQ (adp), acc0 + MOVQ 5(adp), acc1 + SHRQ $24, acc1 + MOVQ $1, acc2 + polyMul + RET + +hashADLoop: + // Hash in 16 byte chunks + CMPQ itr2, $16 + JB hashADTail + polyAdd(0(adp)) + LEAQ (1*16)(adp), adp + SUBQ $16, itr2 + polyMul + JMP hashADLoop + +hashADTail: + CMPQ itr2, $0 + JE hashADDone + + // Hash last < 16 byte tail + XORQ t0, t0 + XORQ t1, t1 + XORQ t2, t2 + ADDQ itr2, adp + +hashADTailLoop: + SHLQ $8, t1:t0 + SHLQ $8, t0 + MOVB -1(adp), t2 + XORQ t2, t0 + DECQ adp + DECQ itr2 + JNE hashADTailLoop + +hashADTailFinish: + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Finished AD +hashADDone: + RET + +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Open(dst, key, src, ad []byte) bool +TEXT ·chacha20Poly1305Open(SB), 0, $288-97 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + // Check for AVX2 support + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Open_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE openSSE128 // About 16% faster + + // For long buffers, prepare the poly key first + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + MOVO D0, T1 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + MOVO D0, ctr3Store + MOVQ $10, itr2 + +openSSEPreparePolyKey: + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + DECQ itr2 + JNE openSSEPreparePolyKey + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore; MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSEMainLoop: + CMPQ inl, $256 + JB openSSEMainLoopDone + + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + + // There are 10 ChaCha20 iterations of 2QR each, so for 6 iterations we hash 2 blocks, and for the remaining 4 only 1 block - for a total of 16 + MOVQ $4, itr1 + MOVQ inp, itr2 + +openSSEInternalLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(itr2)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(itr2), itr2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr1 + JGE openSSEInternalLoop + + polyAdd(0(itr2)) + polyMul + LEAQ (2*8)(itr2), itr2 + + CMPQ itr1, $-6 + JG openSSEInternalLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Load - xor - store + MOVO D3, tmpStore + MOVOU (0*16)(inp), D3; PXOR D3, A0; MOVOU A0, (0*16)(oup) + MOVOU (1*16)(inp), D3; PXOR D3, B0; MOVOU B0, (1*16)(oup) + MOVOU (2*16)(inp), D3; PXOR D3, C0; MOVOU C0, (2*16)(oup) + MOVOU (3*16)(inp), D3; PXOR D3, D0; MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), D0; PXOR D0, A1; MOVOU A1, (4*16)(oup) + MOVOU (5*16)(inp), D0; PXOR D0, B1; MOVOU B1, (5*16)(oup) + MOVOU (6*16)(inp), D0; PXOR D0, C1; MOVOU C1, (6*16)(oup) + MOVOU (7*16)(inp), D0; PXOR D0, D1; MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), D0; PXOR D0, A2; MOVOU A2, (8*16)(oup) + MOVOU (9*16)(inp), D0; PXOR D0, B2; MOVOU B2, (9*16)(oup) + MOVOU (10*16)(inp), D0; PXOR D0, C2; MOVOU C2, (10*16)(oup) + MOVOU (11*16)(inp), D0; PXOR D0, D2; MOVOU D2, (11*16)(oup) + MOVOU (12*16)(inp), D0; PXOR D0, A3; MOVOU A3, (12*16)(oup) + MOVOU (13*16)(inp), D0; PXOR D0, B3; MOVOU B3, (13*16)(oup) + MOVOU (14*16)(inp), D0; PXOR D0, C3; MOVOU C3, (14*16)(oup) + MOVOU (15*16)(inp), D0; PXOR tmpStore, D0; MOVOU D0, (15*16)(oup) + LEAQ 256(inp), inp + LEAQ 256(oup), oup + SUBQ $256, inl + JMP openSSEMainLoop + +openSSEMainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $64 + JBE openSSETail64 + CMPQ inl, $128 + JBE openSSETail128 + CMPQ inl, $192 + JBE openSSETail192 + JMP openSSETail256 + +openSSEFinalize: + // Hash in the PT, AAD lengths + ADDQ ad_len+80(FP), acc0; ADCQ src_len+56(FP), acc1; ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally, constant time compare to the tag at the end of the message + XORQ AX, AX + MOVQ $1, DX + XORQ (0*8)(inp), acc0 + XORQ (1*8)(inp), acc1 + ORQ acc1, acc0 + CMOVQEQ DX, AX + + // Return true iff tags are equal + MOVB AX, ret+96(FP) + RET + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 129 bytes +openSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +openSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE openSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore; MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSE128Open: + CMPQ inl, $16 + JB openSSETail16 + SUBQ $16, inl + + // Load for hashing + polyAdd(0(inp)) + + // Load for decryption + MOVOU (inp), T0; PXOR T0, A1; MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP openSSE128Open + +openSSETail16: + TESTQ inl, inl + JE openSSEFinalize + + // We can safely load the CT from the end, because it is padded with the MAC + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVOU (inp), T0 + ADDQ inl, inp + PAND -16(t0)(itr2*1), T0 + MOVO T0, 0+tmpStore + MOVQ T0, t0 + MOVQ 8+tmpStore, t1 + PXOR A1, T0 + + // We can only store one byte at a time, since plaintext can be shorter than 16 bytes +openSSETail16Store: + MOVQ T0, t3 + MOVB t3, (oup) + PSRLDQ $1, T0 + INCQ oup + DECQ inl + JNE openSSETail16Store + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + JMP openSSEFinalize + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of ciphertext +openSSETail64: + // Need to decrypt up to 64 bytes - prepare single block + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + XORQ itr2, itr2 + MOVQ inl, itr1 + CMPQ itr1, $16 + JB openSSETail64LoopB + +openSSETail64LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + SUBQ $16, itr1 + +openSSETail64LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + + CMPQ itr1, $16 + JAE openSSETail64LoopA + + CMPQ itr2, $160 + JNE openSSETail64LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0; PADDL state2Store, C0; PADDL ctr0Store, D0 + +openSSETail64DecLoop: + CMPQ inl, $16 + JB openSSETail64DecLoopDone + SUBQ $16, inl + MOVOU (inp), T0 + PXOR T0, A0 + MOVOU A0, (oup) + LEAQ 16(inp), inp + LEAQ 16(oup), oup + MOVO B0, A0 + MOVO C0, B0 + MOVO D0, C0 + JMP openSSETail64DecLoop + +openSSETail64DecLoopDone: + MOVO A0, A1 + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openSSETail128: + // Need to decrypt up to 128 bytes - prepare two blocks + MOVO ·chacha20Constants<>(SB), A1; MOVO state1Store, B1; MOVO state2Store, C1; MOVO ctr3Store, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr0Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr1Store + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSETail128LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + CMPQ itr2, itr1 + JB openSSETail128LoopA + + CMPQ itr2, $160 + JNE openSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr1Store, D0; PADDL ctr0Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + + SUBQ $64, inl + LEAQ 64(inp), inp + LEAQ 64(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of ciphertext +openSSETail192: + // Need to decrypt up to 192 bytes - prepare three blocks + MOVO ·chacha20Constants<>(SB), A2; MOVO state1Store, B2; MOVO state2Store, C2; MOVO ctr3Store, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr0Store + MOVO A2, A1; MOVO B2, B1; MOVO C2, C1; MOVO D2, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr2Store + + MOVQ inl, itr1 + MOVQ $160, itr2 + CMPQ itr1, $160 + CMOVQGT itr2, itr1 + ANDQ $-16, itr1 + XORQ itr2, itr2 + +openSSLTail192LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSLTail192LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + CMPQ itr2, itr1 + JB openSSLTail192LoopA + + CMPQ itr2, $160 + JNE openSSLTail192LoopB + + CMPQ inl, $176 + JB openSSLTail192Store + + polyAdd(160(inp)) + polyMul + + CMPQ inl, $192 + JB openSSLTail192Store + + polyAdd(176(inp)) + polyMul + +openSSLTail192Store: + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr2Store, D0; PADDL ctr1Store, D1; PADDL ctr0Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A2; PXOR T1, B2; PXOR T2, C2; PXOR T3, D2 + MOVOU A2, (0*16)(oup); MOVOU B2, (1*16)(oup); MOVOU C2, (2*16)(oup); MOVOU D2, (3*16)(oup) + + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + SUBQ $128, inl + LEAQ 128(inp), inp + LEAQ 128(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openSSETail256: + // Need to decrypt up to 256 bytes - prepare four blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + XORQ itr2, itr2 + +openSSETail256Loop: + // This loop inteleaves 8 ChaCha quarter rounds with 1 poly multiplication + polyAdd(0(inp)(itr2*1)) + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulStage3 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + ADDQ $2*8, itr2 + CMPQ itr2, $160 + JB openSSETail256Loop + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail256HashLoop: + polyAdd(0(inp)(itr2*1)) + polyMul + ADDQ $2*8, itr2 + CMPQ itr2, itr1 + JB openSSETail256HashLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + LEAQ 192(inp), inp + LEAQ 192(oup), oup + SUBQ $192, inl + MOVO A3, A0 + MOVO B3, B0 + MOVO C3, C0 + MOVO tmpStore, D0 + + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Open_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimization, for very short buffers + CMPQ inl, $192 + JBE openAVX2192 + CMPQ inl, $320 + JBE openAVX2320 + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, state2StoreAVX2 + VMOVDQA DD0, ctr3StoreAVX2 + MOVQ $10, itr2 + +openAVX2PreparePolyKey: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + DECQ itr2 + JNE openAVX2PreparePolyKey + + VPADDD ·chacha20Constants<>(SB), AA0, AA0 + VPADDD state1StoreAVX2, BB0, BB0 + VPADDD state2StoreAVX2, CC0, CC0 + VPADDD ctr3StoreAVX2, DD0, DD0 + + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for the first 64 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + + // Hash AD + first 64 bytes + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +openAVX2InitialHash64: + polyAdd(0(inp)(itr1*1)) + polyMulAVX2 + ADDQ $16, itr1 + CMPQ itr1, $64 + JNE openAVX2InitialHash64 + + // Decrypt the first 64 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), BB0, BB0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU BB0, (1*32)(oup) + LEAQ (2*32)(inp), inp + LEAQ (2*32)(oup), oup + SUBQ $64, inl + +openAVX2MainLoop: + CMPQ inl, $512 + JB openAVX2MainLoopDone + + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + +openAVX2InternalLoop: + // Lets just say this spaghetti loop interleaves 2 quarter rounds with 3 poly multiplications + // Effectively per 512 bytes of stream we hash 480 bytes of ciphertext + polyAdd(0*8(inp)(itr1*1)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(inp)(itr1*1)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(inp)(itr1*1)) + LEAQ (6*8)(itr1), itr1 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + CMPQ itr1, $480 + JNE openAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(480(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(496(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + LEAQ (32*16)(oup), oup + SUBQ $(32*16), inl + JMP openAVX2MainLoop + +openAVX2MainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $128 + JBE openAVX2Tail128 + CMPQ inl, $256 + JBE openAVX2Tail256 + CMPQ inl, $384 + JBE openAVX2Tail384 + JMP openAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +openAVX2192: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +openAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE openAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +openAVX2ShortOpen: + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openAVX2ShortOpenLoop: + CMPQ inl, $32 + JB openAVX2ShortTail32 + SUBQ $32, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + polyAdd(2*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP openAVX2ShortOpenLoop + +openAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2ShortDone + + SUBQ $16, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2ShortDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +openAVX2320: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +openAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE openAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP openAVX2ShortOpen + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD1 + VMOVDQA DD1, DD0 + + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + TESTQ itr1, itr1 + JE openAVX2Tail128LoopB + +openAVX2Tail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMulAVX2 + +openAVX2Tail128LoopB: + ADDQ $16, itr2 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail128LoopA + CMPQ itr2, $160 + JNE openAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC1, CC1 + VPADDD DD0, DD1, DD1 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + +openAVX2TailLoop: + CMPQ inl, $32 + JB openAVX2Tail + SUBQ $32, inl + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + JMP openAVX2TailLoop + +openAVX2Tail: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2TailDone + SUBQ $16, inl + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2TailDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare four blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + + // Compute the number of iterations that will hash data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $128, itr1 + SHRQ $4, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + +openAVX2Tail256LoopA: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail256LoopA + + CMPQ itr2, $10 + JNE openAVX2Tail256LoopB + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + + // Hash the remainder of data (if any) +openAVX2Tail256Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail256HashEnd + polyAdd (0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail256Hash + +// Store 128 bytes safely, then go to store loop +openAVX2Tail256HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, AA2; VPERM2I128 $0x02, CC0, DD0, BB2; VPERM2I128 $0x13, AA0, BB0, CC2; VPERM2I128 $0x13, CC0, DD0, DD2 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + + VPXOR (0*32)(inp), AA2, AA2; VPXOR (1*32)(inp), BB2, BB2; VPXOR (2*32)(inp), CC2, CC2; VPXOR (3*32)(inp), DD2, DD2 + VMOVDQU AA2, (0*32)(oup); VMOVDQU BB2, (1*32)(oup); VMOVDQU CC2, (2*32)(oup); VMOVDQU DD2, (3*32)(oup) + LEAQ (4*32)(inp), inp + LEAQ (4*32)(oup), oup + SUBQ $4*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +openAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare six blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, ctr0StoreAVX2 + VMOVDQA DD1, ctr1StoreAVX2 + VMOVDQA DD2, ctr2StoreAVX2 + + // Compute the number of iterations that will hash two blocks of data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $256, itr1 + SHRQ $4, itr1 + ADDQ $6, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail384LoopB: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + +openAVX2Tail384LoopA: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + + CMPQ itr2, itr1 + JB openAVX2Tail384LoopB + + CMPQ itr2, $10 + JNE openAVX2Tail384LoopA + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + +openAVX2Tail384Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail384HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail384Hash + +// Store 256 bytes safely, then go to store loop +openAVX2Tail384HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0; VPERM2I128 $0x02, CC0, DD0, TT1; VPERM2I128 $0x13, AA0, BB0, TT2; VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0; VPERM2I128 $0x02, CC1, DD1, TT1; VPERM2I128 $0x13, AA1, BB1, TT2; VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + LEAQ (8*32)(inp), inp + LEAQ (8*32)(oup), oup + SUBQ $8*32, inl + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +openAVX2Tail512: + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + MOVQ inp, itr2 + +openAVX2Tail512LoopB: + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ (2*8)(itr2), itr2 + +openAVX2Tail512LoopA: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(itr2)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(itr2)) + polyMulAVX2 + LEAQ (4*8)(itr2), itr2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + INCQ itr1 + CMPQ itr1, $4 + JLT openAVX2Tail512LoopB + + CMPQ itr1, $10 + JNE openAVX2Tail512LoopA + + MOVQ inl, itr1 + SUBQ $384, itr1 + ANDQ $-16, itr1 + +openAVX2Tail512HashLoop: + TESTQ itr1, itr1 + JE openAVX2Tail512HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + SUBQ $16, itr1 + JMP openAVX2Tail512HashLoop + +openAVX2Tail512HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + LEAQ (12*32)(inp), inp + LEAQ (12*32)(oup), oup + SUBQ $12*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Seal(dst, key, src, ad []byte) +TEXT ·chacha20Poly1305Seal(SB), 0, $288-96 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Seal_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE sealSSE128 // About 15% faster + + // In the seal case - prepare the poly key + 3 blocks of stream in the first iteration + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + + // Load state, increment counter blocks + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + MOVQ $10, itr2 + +sealSSEIntroLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JNE sealSSEIntroLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore + MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (4*16)(oup); MOVOU B2, (5*16)(oup); MOVOU C2, (6*16)(oup); MOVOU D2, (7*16)(oup) + + MOVQ $128, itr1 + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVO A3, A1; MOVO B3, B1; MOVO C3, C1; MOVO D3, D1 + + CMPQ inl, $64 + JBE sealSSE128SealHash + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (8*16)(oup); MOVOU B3, (9*16)(oup); MOVOU C3, (10*16)(oup); MOVOU D3, (11*16)(oup) + + ADDQ $64, itr1 + SUBQ $64, inl + LEAQ 64(inp), inp + + MOVQ $2, itr1 + MOVQ $8, itr2 + + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + CMPQ inl, $192 + JBE sealSSETail192 + +sealSSEMainLoop: + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + +sealSSEInnerLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(oup)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(oup), oup + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JGE sealSSEInnerLoop + polyAdd(0(oup)) + polyMul + LEAQ (2*8)(oup), oup + DECQ itr1 + JG sealSSEInnerLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVO tmpStore, D3 + + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + ADDQ $192, inp + MOVQ $192, itr1 + SUBQ $192, inl + MOVO A3, A1 + MOVO B3, B1 + MOVO C3, C1 + MOVO D3, D1 + CMPQ inl, $64 + JBE sealSSE128SealHash + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (12*16)(oup); MOVOU B3, (13*16)(oup); MOVOU C3, (14*16)(oup); MOVOU D3, (15*16)(oup) + LEAQ 64(inp), inp + SUBQ $64, inl + MOVQ $6, itr1 + MOVQ $4, itr2 + CMPQ inl, $192 + JG sealSSEMainLoop + + MOVQ inl, itr1 + TESTQ inl, inl + JE sealSSE128SealHash + MOVQ $6, itr1 + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + JMP sealSSETail192 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of plaintext +sealSSETail64: + // Need to encrypt up to 64 bytes - prepare single block, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A1 + MOVO state1Store, B1 + MOVO state2Store, C1 + MOVO ctr3Store, D1 + PADDL ·sseIncMask<>(SB), D1 + MOVO D1, ctr0Store + +sealSSETail64LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail64LoopB: + chachaQR(A1, B1, C1, D1, T1) + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A1, B1, C1, D1, T1) + shiftB1Right; shiftC1Right; shiftD1Right + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + DECQ itr1 + JG sealSSETail64LoopA + + DECQ itr2 + JGE sealSSETail64LoopB + PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B1 + PADDL state2Store, C1 + PADDL ctr0Store, D1 + + JMP sealSSE128Seal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of plaintext +sealSSETail128: + // Need to encrypt up to 128 bytes - prepare two blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + +sealSSETail128LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail128LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + DECQ itr1 + JG sealSSETail128LoopA + + DECQ itr2 + JGE sealSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr0Store, D0; PADDL ctr1Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + + MOVQ $64, itr1 + LEAQ 64(inp), inp + SUBQ $64, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of plaintext +sealSSETail192: + // Need to encrypt up to 192 bytes - prepare three blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr2Store + +sealSSETail192LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail192LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + DECQ itr1 + JG sealSSETail192LoopA + + DECQ itr2 + JGE sealSSETail192LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr0Store, D0; PADDL ctr1Store, D1; PADDL ctr2Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + MOVO A2, A1 + MOVO B2, B1 + MOVO C2, C1 + MOVO D2, D1 + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special seal optimization for buffers smaller than 129 bytes +sealSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +sealSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE sealSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore + MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealSSE128SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealSSE128Seal + polyAdd(0(oup)) + polyMul + + SUBQ $16, itr1 + ADDQ $16, oup + + JMP sealSSE128SealHash + +sealSSE128Seal: + CMPQ inl, $16 + JB sealSSETail + SUBQ $16, inl + + // Load for decryption + MOVOU (inp), T0 + PXOR T0, A1 + MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + + // Extract for hashing + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP sealSSE128Seal + +sealSSETail: + TESTQ inl, inl + JE sealSSEFinalize + + // We can only load the PT one byte at a time to avoid read after end of buffer + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVQ inl, itr1 + LEAQ -1(inp)(inl*1), inp + XORQ t2, t2 + XORQ t3, t3 + XORQ AX, AX + +sealSSETailLoadLoop: + SHLQ $8, t2, t3 + SHLQ $8, t2 + MOVB (inp), AX + XORQ AX, t2 + LEAQ -1(inp), inp + DECQ itr1 + JNE sealSSETailLoadLoop + MOVQ t2, 0+tmpStore + MOVQ t3, 8+tmpStore + PXOR 0+tmpStore, A1 + MOVOU A1, (oup) + MOVOU -16(t0)(itr2*1), T0 + PAND T0, A1 + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + ADDQ inl, oup + +sealSSEFinalize: + // Hash in the buffer lengths + ADDQ ad_len+80(FP), acc0 + ADCQ src_len+56(FP), acc1 + ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally store the tag at the end of the message + MOVQ acc0, (0*8)(oup) + MOVQ acc1, (1*8)(oup) + RET + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Seal_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimizations, for very short buffers + CMPQ inl, $192 + JBE seal192AVX2 // 33% faster + CMPQ inl, $320 + JBE seal320AVX2 // 17% faster + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3; VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3; VMOVDQA CC0, state2StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD0, DD1; VMOVDQA DD0, ctr0StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD1, DD2; VMOVDQA DD1, ctr1StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD2, DD3; VMOVDQA DD2, ctr2StoreAVX2 + VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr2 + +sealAVX2IntroLoop: + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr2 + JNE sealAVX2IntroLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + + VPERM2I128 $0x13, CC0, DD0, CC0 // Stream bytes 96 - 127 + VPERM2I128 $0x02, AA0, BB0, DD0 // The Poly1305 key + VPERM2I128 $0x13, AA0, BB0, AA0 // Stream bytes 64 - 95 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), DD0, DD0 + VMOVDQA DD0, rsStoreAVX2 + + // Hash AD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + // Can store at least 320 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), CC0, CC0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU CC0, (1*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (2*32)(inp), AA0, AA0; VPXOR (3*32)(inp), BB0, BB0; VPXOR (4*32)(inp), CC0, CC0; VPXOR (5*32)(inp), DD0, DD0 + VMOVDQU AA0, (2*32)(oup); VMOVDQU BB0, (3*32)(oup); VMOVDQU CC0, (4*32)(oup); VMOVDQU DD0, (5*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (6*32)(inp), AA0, AA0; VPXOR (7*32)(inp), BB0, BB0; VPXOR (8*32)(inp), CC0, CC0; VPXOR (9*32)(inp), DD0, DD0 + VMOVDQU AA0, (6*32)(oup); VMOVDQU BB0, (7*32)(oup); VMOVDQU CC0, (8*32)(oup); VMOVDQU DD0, (9*32)(oup) + + MOVQ $320, itr1 + SUBQ $320, inl + LEAQ 320(inp), inp + + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, CC3, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, CC3, DD3, DD0 + CMPQ inl, $128 + JBE sealAVX2SealHash + + VPXOR (0*32)(inp), AA0, AA0; VPXOR (1*32)(inp), BB0, BB0; VPXOR (2*32)(inp), CC0, CC0; VPXOR (3*32)(inp), DD0, DD0 + VMOVDQU AA0, (10*32)(oup); VMOVDQU BB0, (11*32)(oup); VMOVDQU CC0, (12*32)(oup); VMOVDQU DD0, (13*32)(oup) + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVQ $8, itr1 + MOVQ $2, itr2 + + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + CMPQ inl, $512 + JBE sealAVX2Tail512 + + // We have 448 bytes to hash, but main loop hashes 512 bytes at a time - perform some rounds, before the main loop + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + + SUBQ $16, oup // Adjust the pointer + MOVQ $9, itr1 + JMP sealAVX2InternalLoopStart + +sealAVX2MainLoop: + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr1 + +sealAVX2InternalLoop: + polyAdd(0*8(oup)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + +sealAVX2InternalLoopStart: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(oup)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(oup)) + LEAQ (6*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr1 + JNE sealAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(-2*8(oup)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + SUBQ $(32*16), inl + CMPQ inl, $512 + JG sealAVX2MainLoop + + // Tail can only hash 480 bytes + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ 32(oup), oup + + MOVQ $10, itr1 + MOVQ $0, itr2 + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + JMP sealAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +seal192AVX2: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +sealAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE sealAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +sealAVX2ShortSeal: + // Hash aad + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealAVX2SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealAVX2ShortSealLoop + polyAdd(0(oup)) + polyMul + SUBQ $16, itr1 + ADDQ $16, oup + JMP sealAVX2SealHash + +sealAVX2ShortSealLoop: + CMPQ inl, $32 + JB sealAVX2ShortTail32 + SUBQ $32, inl + + // Load for encryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + + // Now can hash + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP sealAVX2ShortSealLoop + +sealAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB sealAVX2ShortDone + + SUBQ $16, inl + + // Load for encryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + + // Hash + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +sealAVX2ShortDone: + VZEROUPPER + JMP sealSSETail + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +seal320AVX2: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +sealAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE sealAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP sealAVX2ShortSeal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +sealAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0 + VMOVDQA state1StoreAVX2, BB0 + VMOVDQA state2StoreAVX2, CC0 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VMOVDQA DD0, DD1 + +sealAVX2Tail128LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail128LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $4, DD0, DD0, DD0 + DECQ itr1 + JG sealAVX2Tail128LoopA + DECQ itr2 + JGE sealAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA1 + VPADDD state1StoreAVX2, BB0, BB1 + VPADDD state2StoreAVX2, CC0, CC1 + VPADDD DD1, DD0, DD1 + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + JMP sealAVX2ShortSealLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +sealAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + +sealAVX2Tail256LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr1 + JG sealAVX2Tail256LoopA + DECQ itr2 + JGE sealAVX2Tail256LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +sealAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, TT1; VMOVDQA DD1, TT2; VMOVDQA DD2, TT3 + +sealAVX2Tail384LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail384LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr1 + JG sealAVX2Tail384LoopA + DECQ itr2 + JGE sealAVX2Tail384LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1; VPADDD TT3, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0 + VPERM2I128 $0x02, CC1, DD1, TT1 + VPERM2I128 $0x13, AA1, BB1, TT2 + VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + MOVQ $256, itr1 + LEAQ 256(inp), inp + SUBQ $256, inl + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +sealAVX2Tail512: + // Need to decrypt up to 512 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + +sealAVX2Tail512LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail512LoopB: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(oup)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + + DECQ itr1 + JG sealAVX2Tail512LoopA + DECQ itr2 + JGE sealAVX2Tail512LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3 + VPXOR (0*32)(inp), CC3, CC3 + VMOVDQU CC3, (0*32)(oup) + VPERM2I128 $0x02, CC0, DD0, CC3 + VPXOR (1*32)(inp), CC3, CC3 + VMOVDQU CC3, (1*32)(oup) + VPERM2I128 $0x13, AA0, BB0, CC3 + VPXOR (2*32)(inp), CC3, CC3 + VMOVDQU CC3, (2*32)(oup) + VPERM2I128 $0x13, CC0, DD0, CC3 + VPXOR (3*32)(inp), CC3, CC3 + VMOVDQU CC3, (3*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + + MOVQ $384, itr1 + LEAQ 384(inp), inp + SUBQ $384, inl + VPERM2I128 $0x02, AA3, BB3, AA0 + VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0 + VPERM2I128 $0x13, AA3, BB3, CC0 + VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + JMP sealAVX2SealHash + +// func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuid(SB), NOSPLIT, $0-24 + MOVL eaxArg+0(FP), AX + MOVL ecxArg+4(FP), CX + CPUID + MOVL AX, eax+8(FP) + MOVL BX, ebx+12(FP) + MOVL CX, ecx+16(FP) + MOVL DX, edx+20(FP) + RET + +// func xgetbv() (eax, edx uint32) +TEXT ·xgetbv(SB),NOSPLIT,$0-8 + MOVL $0, CX + XGETBV + MOVL AX, eax+0(FP) + MOVL DX, edx+4(FP) + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go new file mode 100644 index 00000000..744282be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go @@ -0,0 +1,70 @@ +// Copyright 2016 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 chacha20poly1305 + +import ( + "encoding/binary" + + "github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20" + "github.com/SkycoinProject/skycoin/src/cipher/poly1305" +) + +func roundTo16(n int) int { + return 16 * ((n + 15) / 16) +} + +func (c *chacha20poly1305) sealGeneric(dst, nonce, plaintext, additionalData []byte) []byte { + var counter [16]byte + copy(counter[4:], nonce) + + var polyKey [32]byte + chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) + + ret, out := sliceForAppend(dst, len(plaintext)+poly1305.TagSize) + counter[0] = 1 + chacha20.XORKeyStream(out, plaintext, &counter, &c.key) + + polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(plaintext))+8+8) + copy(polyInput, additionalData) + copy(polyInput[roundTo16(len(additionalData)):], out[:len(plaintext)]) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(plaintext))) + + var tag [poly1305.TagSize]byte + poly1305.Sum(&tag, polyInput, &polyKey) + copy(out[len(plaintext):], tag[:]) + + return ret +} + +func (c *chacha20poly1305) openGeneric(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + var tag [poly1305.TagSize]byte + copy(tag[:], ciphertext[len(ciphertext)-16:]) + ciphertext = ciphertext[:len(ciphertext)-16] + + var counter [16]byte + copy(counter[4:], nonce) + + var polyKey [32]byte + chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) + + polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(ciphertext))+8+8) + copy(polyInput, additionalData) + copy(polyInput[roundTo16(len(additionalData)):], ciphertext) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(ciphertext))) + + ret, out := sliceForAppend(dst, len(ciphertext)) + if !poly1305.Verify(&tag, polyInput, &polyKey) { + for i := range out { + out[i] = 0 + } + return nil, errOpen + } + + counter[0] = 1 + chacha20.XORKeyStream(out, ciphertext, &counter, &c.key) + return ret, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go new file mode 100644 index 00000000..4c2eb703 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go @@ -0,0 +1,15 @@ +// Copyright 2016 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. + +// +build !amd64 !go1.7 gccgo appengine + +package chacha20poly1305 + +func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte { + return c.sealGeneric(dst, nonce, plaintext, additionalData) +} + +func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + return c.openGeneric(dst, nonce, ciphertext, additionalData) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_test.go new file mode 100644 index 00000000..7cda04dd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_test.go @@ -0,0 +1,221 @@ +// Copyright 2016 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 chacha20poly1305 + +import ( + "bytes" + cr "crypto/rand" + "encoding/hex" + mr "math/rand" + "testing" +) + +func TestVectors(t *testing.T) { + for i, test := range chacha20Poly1305Tests { + key, err := hex.DecodeString(test.key) + if err != nil { + t.Error(err) + continue + } + + nonce, err := hex.DecodeString(test.nonce) + if err != nil { + t.Error(err) + continue + } + + ad, err := hex.DecodeString(test.aad) + if err != nil { + t.Error(err) + continue + } + + plaintext, err := hex.DecodeString(test.plaintext) + if err != nil { + t.Error(err) + continue + } + + aead, err := New(key) + if err != nil { + t.Fatal(err) + } + + ct := aead.Seal(nil, nonce, plaintext, ad) + if ctHex := hex.EncodeToString(ct); ctHex != test.out { + t.Errorf("#%d: got %s, want %s", i, ctHex, test.out) + continue + } + + plaintext2, err := aead.Open(nil, nonce, ct, ad) + if err != nil { + t.Errorf("#%d: Open failed", i) + continue + } + + if !bytes.Equal(plaintext, plaintext2) { + t.Errorf("#%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) + continue + } + + if len(ad) > 0 { + alterAdIdx := mr.Intn(len(ad)) + ad[alterAdIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce, ct, ad); err == nil { + t.Errorf("#%d: Open was successful after altering additional data", i) + } + ad[alterAdIdx] ^= 0x80 + } + + alterNonceIdx := mr.Intn(aead.NonceSize()) + nonce[alterNonceIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce, ct, ad); err == nil { + t.Errorf("#%d: Open was successful after altering nonce", i) + } + nonce[alterNonceIdx] ^= 0x80 + + alterCtIdx := mr.Intn(len(ct)) + ct[alterCtIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce, ct, ad); err == nil { + t.Errorf("#%d: Open was successful after altering ciphertext", i) + } + ct[alterCtIdx] ^= 0x80 + } +} + +func TestRandom(t *testing.T) { + // Some random tests to verify Open(Seal) == Plaintext + for i := 0; i < 256; i++ { + var nonce [12]byte + var key [32]byte + + al := mr.Intn(128) + pl := mr.Intn(16384) + ad := make([]byte, al) + plaintext := make([]byte, pl) + _, err := cr.Read(key[:]) + if err != nil { + t.Error(err) + } + _, err = cr.Read(nonce[:]) + if err != nil { + t.Error(err) + } + _, err = cr.Read(ad) + if err != nil { + t.Error(err) + } + _, err = cr.Read(plaintext) + if err != nil { + t.Error(err) + } + + aead, err := New(key[:]) + if err != nil { + t.Fatal(err) + } + + ct := aead.Seal(nil, nonce[:], plaintext, ad) + + plaintext2, err := aead.Open(nil, nonce[:], ct, ad) + if err != nil { + t.Errorf("Random #%d: Open failed", i) + continue + } + + if !bytes.Equal(plaintext, plaintext2) { + t.Errorf("Random #%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) + continue + } + + if len(ad) > 0 { + alterAdIdx := mr.Intn(len(ad)) + ad[alterAdIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { + t.Errorf("Random #%d: Open was successful after altering additional data", i) + } + ad[alterAdIdx] ^= 0x80 + } + + alterNonceIdx := mr.Intn(aead.NonceSize()) + nonce[alterNonceIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { + t.Errorf("Random #%d: Open was successful after altering nonce", i) + } + nonce[alterNonceIdx] ^= 0x80 + + alterCtIdx := mr.Intn(len(ct)) + ct[alterCtIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { + t.Errorf("Random #%d: Open was successful after altering ciphertext", i) + } + ct[alterCtIdx] ^= 0x80 + } +} + +func benchamarkChaCha20Poly1305Seal(b *testing.B, buf []byte) { + b.SetBytes(int64(len(buf))) + + var key [32]byte + var nonce [12]byte + var ad [13]byte + var out []byte + + aead, err := New(key[:]) + if err != nil { + b.Fatal(err) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + out = aead.Seal(out[:0], nonce[:], buf[:], ad[:]) + } +} + +func benchamarkChaCha20Poly1305Open(b *testing.B, buf []byte) { + b.SetBytes(int64(len(buf))) + + var key [32]byte + var nonce [12]byte + var ad [13]byte + var ct []byte + var out []byte + + aead, err := New(key[:]) + if err != nil { + b.Fatal(err) + } + + ct = aead.Seal(ct[:0], nonce[:], buf[:], ad[:]) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + out, _ = aead.Open(out[:0], nonce[:], ct[:], ad[:]) //nolint:errcheck + } +} + +func BenchmarkChacha20Poly1305Open_64(b *testing.B) { + benchamarkChaCha20Poly1305Open(b, make([]byte, 64)) +} + +func BenchmarkChacha20Poly1305Seal_64(b *testing.B) { + benchamarkChaCha20Poly1305Seal(b, make([]byte, 64)) +} + +func BenchmarkChacha20Poly1305Open_1350(b *testing.B) { + benchamarkChaCha20Poly1305Open(b, make([]byte, 1350)) +} + +func BenchmarkChacha20Poly1305Seal_1350(b *testing.B) { + benchamarkChaCha20Poly1305Seal(b, make([]byte, 1350)) +} + +func BenchmarkChacha20Poly1305Open_8K(b *testing.B) { + benchamarkChaCha20Poly1305Open(b, make([]byte, 8*1024)) +} + +func BenchmarkChacha20Poly1305Seal_8K(b *testing.B) { + benchamarkChaCha20Poly1305Seal(b, make([]byte, 8*1024)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_vectors_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_vectors_test.go new file mode 100644 index 00000000..49f0da6b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_vectors_test.go @@ -0,0 +1,332 @@ +// Copyright 2016 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 chacha20poly1305 + +var chacha20Poly1305Tests = []struct { + plaintext, aad, key, nonce, out string +}{ + { + "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e", + "50515253c0c1c2c3c4c5c6c7", + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "070000004041424344454647", + "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd0600691", + }, + { + "1400000cebccee3bf561b292340fec60", + "00000000000000001603030010", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "2b487a2941bc07f3cc76d1a531662588ee7c2598e59778c24d5b27559a80d163", + }, + { + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "3f487a25aa70e9c8391763370569c9e83b7650dd1921c8b78869f241f25d2096c910b180930c5b8747fd90959fe8ca2dcadb4fa50fa1439f916b2301e1cc0810d6725775d3ab86721700f96e22709b0a7a8bef32627dd929b2dd3ba15772b669062bb558bc92e6c241a1d60d9f0035e80c335f854815fe1138ab8af653eab3e122135feeec7dfaba1cc24af82a2b7acccdd824899a7e03cc29c25be8a4f56a66673845b93bae1556f09dafc89a0d22af207718e2a6bb022e9d917597295992ea3b750cc0e7a7c3d33b23c5a8aeab45f5bb542f6c9e6c1747ae5a344aff483ba38577ad534b33b3abc7d284776ea33ed488c2a2475648a4fcda561745ea7787ed60f2368deb27c75adce6ff9b6cc6de1f5e72a741e2d59f64751b3ae482d714e0c90e83c671ff98ed611823afb39e6e5019a6ba548a2a72e829c7b7b4a101ac9deb90a25d3e0c50d22e1fc26c7c02296fa13c6d9c14767f68aaf46450a8d0fd5feb60d9d73c6e68623425b4984a79d619dd6bf896459aa77a681ec9c1a97f645e121f47779b051f8948a817f84d1f55da170d5bbbaf2f64e18b97ed3fd822db2819f523314f1e5ac72e8f69bbe6c87c22daddb0e1ac6790f8534071de2f258064b99789bfb165b065b8fe96f9127cd7dca9f7cb0368420f1e802faa3ca23792f2a5b93773dd405e71c320b211b54f7a26626b03c060e1ab87f32ac588abfa056ce090bd7c69913a700c80f325bfe824fa", + }, + { + "0967de57eefe1aaa999b9b746d88a1a248000d8734e0e938c6aa87", + "e4f0a3a4f90a8250f8806aa319053e8d73c62f150e2f239563037e9cc92823ad18c65111d0d462c954cc6c6ed2aafb45702a5a7e597d13bd8091594ab97cf7d1", + "f2db28620582e05f00f31c808475ca3df1c20e340bf14828352499466d79295f", + "4349e2131d44dc711148dfe3", + "bd06cc144fdc0d8b735fa4452eabbf78fd4ad2966ea41a84f68da40ca2da439777bc2ba6c4ec2de0d003eb", + }, + { + "c4c920fb52a56fe66eaa8aa3fa187c543e3db8e5c8094c4313dc4ed35dfc5821c5791d171e8cfe8d37883031a0ad", + "85deea3dc4", + "05ff881d1e151bab4ca3db7d44880222733fe62686f71ce1e4610f2ea19599a7", + "b34710f65aed442e4a40866b", + "b154452fb7e85d175dd0b0db08591565c5587a725cf22386922f5d27a01015aba778975510b38754b2182e24352f019b7ad493e1ed255906715644aec6e0", + }, + { + "c4b337df5e83823900c6c202e93541cf5bc8c677a9aad8b8d87a4d7221e294e595cbc4f34e462d4e0def50f62491c57f598cf60236cfba0f4908816aea154f80e013732e59a07c668fcc5cb35d2232b7ae29b9e4f874f3417c74ab6689fae6690d5a9766fa13cd8adf293d3d4b70f4f999adde9121d1d29d467d04cf77ea398444d0ea3fe4b7c9c3e106002c76f4260fa204a0c3d5", + "72611bef65eb664f24ea94f4d5d3d88c9c9c6da29c9a1991c02833c4c9f6993b57b5", + "dd0f2d4bb1c9e5ca5aa5f38d69bc8402f7dbb7229857b4a41b3044d481b7655e", + "2bbca0910cc47ca0b8517391", + "83aa28d6d98901e2981d21d3758ae4db8cce07fe08d82ca6f036a68daa88a7dda56eeb38040c942bdda0fd2d369eec44bd070e2c9314992f68dc16989a6ac0c3912c378cf3254f4bae74a66b075e828df6f855c0d8a827ffed3c03582c12a9112eeb7be43dfe8bd78beb2d1e56678b99a0372531727cb7f2b98d2f917ec10de93fe86267100c20356e80528c5066688c8b7acba76e591449952343f663993d5b642e59eb0f", + }, + { + "a9775b8e42b63335439cf1c79fe8a3560b3baebfdfc9ef239d70da02cea0947817f00659a63a8ee9d67fb1756854cc738f7a326e432191e1916be35f0b78d72268de7c0e180af7ee8aa864f2fc30658baa97f9edb88ace49f5b2a8002a8023925e9fa076a997643340c8253cf88ac8a221c190d94c5e224110cb423a4b65cca9046c1fad0483e1444c0680449148e7b20a778c56d5ae97e679d920c43eed6d42598cf05d10d1a15cd722a0686a871b74fea7cad45562bacf3bda937ac701bc218dac7e9d7d20f955429abdac21d821207febf4d54daea4898837035038bf71c66cef63e90f5d3e51f7fcfe18d41f38540a2c2958dacde16304e4b33da324030f1366f923c337", + "74ba3372d308910b5c9c3885f41252d57556", + "9cf77bd06a4ed8fb59349791b98ba40b6019611942f5768e8be2ee88477149e3", + "b928935c4c966c60fd6583c0", + "ec7fd64fd75b254961a2b7fc942470d8620f439258b871d0d00f58028b5e0bee5e139e8108ac439391465d6658f559b1df57aa21cf826ede1a28bc11af885e13eebfc009870928fae8abfdd943a60c54fca93f0502dc23d29c2fd5340f9bc0e6ef2a18b66ef627af95f796d5bbca50de22c8ec802da9397089b25c6ba5262468e3977b45dc112e51896c70731b0a52d7efec7c93b41995823436bf4b0c477ae79684407c9831b487928b2b8303caca752b3edf1f0598e15831155462706f94ef3fa3a9e5f937f37085afa9b4bbf939d275796a61b78f70597acfd25cd87f967021cd99328fc371b5eb5739869520657b30e4a5b0db7c8715cbe275dee78e719b357d3a9731f9eaba95986479bb2004a77822fc115a3d", + }, + { + "b3d3128bce6bbf66fd78f1a18352bae56bfcdae18b65c379ee0aeb37ee54fba1270d2df578ec5b75654d16e89fd1cd0acda7ec580dafd2fbbabd32a8112d49383a762db2638928c8d63eb0750f7e7fdd256b35321b072dd5c45f7dd58cc60dc63d3b79a0c4a1689adf180fef968eccbcfa01ee15091ceacd7b67a3082db0ce6aeb470aafe87249c88b58b721e783dde184ccf68de8e05b6347fe6b74ae3adf9a81e9496a5c9332e7ebe908d26ce6b3f0b2a97e9a89d9fdd0d7694585a3241f240d698e69fcc050e7a959ba153f6d06f117848ba05d887134f1b6b994dad9b9e74247513e08a125b1fadfc7394dcd2a6451b504ae3e75e22f2b9bc405747dedb6c43ef4ccdf1a7edaf9451346123eaa63f3af113124f361508e255503a242b96680ae3360c8b13ac1f64d08088bb26b7f617cb0866f11d6fd362b00d86eba3fee68724e302388f119d6f92161ac8ce00d08919377a26974d99575b1032ff0f1976240c785c8b89e9eb2bf005e4be06b5371ffca14683fedfdb49e00e38ff27af1324177faf91599abd5990920797574eb743effdc7decda318ada1419cc8e0bfecf82f9c99792746c2b", + "7e8da4f3018f673f8e43bd7a1dee05f8031ec49129c361abbc2a434e9eaf791c3c1d0f3dad767d3bba3ab6d728bbcf2bd994bd03571eae1348f161e6a1da03ddf7121ba4", + "7ee32dd501dce849cd492f6e23324c1a4567bfceff9f11d1352bcb8615f1b093", + "8998e043d2961afa51ea262a", + "ba85e72af18cb5ba85a4a0d6c28b4ac1e5509a3a2fdb0e3255cbc559df5e6a661fc560c756a0264dd99b72c61c51a4b7ad56ca4c8ccb7e8edfc48ff3cceac5d1e8ac5fc87096adc4d0e9a27492857b17604c3a694cfe0e70b22df106c8f3c61f840bcd634964cdb571840e125e381e7dd3a0d97972e965f16f775fa4ce555124318290bf508beb7bd77e633042deb0e863631478fc3dc9122862b3c31264471bcce54e0b74040c8bafd481cf798f332e8940f1134d3027d6f28e771d15e154fc89c6c25fe18a5d312807cc2e623bb1bbb4f0b6ec71d009407eb54bb0759f03682f65d0da8812f84d8e97483f6a8d76a8417efcd9526444abba24288647609791578887ef49780b0b89f51b072cae81c5b5014463da3633dda105b82add0f9c2f065dca46eedd2928be2570493c79a996fa78ea6aec0996497fe2dc444432ade4eaa662ee2255f0f4b92d593288a8e3ffe7a15a10e9d33b0203af23f4c9fd2cfcb6160db63b52810869ff1e65423dbe2c4415884b9f8dec3c968e14cd74f323c89053a96111bc9ce59ec483832c49c53a648e5f0f797f53642ac60170c94b473f1f2e7d8a38e46460b81219b52081263027f74cbf63a75af3a7", + }, + { + "68d5ba501e87994ef6bc8042d7c5a99693a835a4796ad044f0e536a0790a7ee1e03832fec0cb4cb688cdf85f92a1f526492acac2949a0684803c24f947a3da27db0c259bd87251603f49bfd1eab4f733dec2f5725cfcf6dc381ad57fbdb0a699bccc34943e86f47dcfb34eba6746ed4508e3b764dfad4117c8169785c63d1e8309531747d90cc4a8bf13622759506c613324c512d10629991dc01fe3fe3d6607907e4f698a1312492674707fc4dde0f701a609d2ac336cc9f38badf1c813f9599148c21b5bd4658249d5010db2e205b3880e863441f2fe357dab2645be1f9e5067616bc335d0457ea6468c5828910cb09f92e5e184e316018e3c464c5ce59cc34608867bd8cbfa7e1286d73a17e3ebb675d097f9b3adfa41ea408d46252a096b3290e70a5be1896d6760a87e439334b863ccb11679ab5763ebe4a9110eb37c4043634b9e44d40cab34b42977475e2faa2ae0c0a38b170776fbb0870a63044aa6679545ac6951579d0581144cdf43f60923b6acaecdb325c864acd2c7b01d6e18b2b3c41c041bb9099cce557b114b84350131e3cee4089648b5691065867e7d38314154355d0e3ef9dc9375eddef922df2a06ad0f0e4357c3ac672932e5a66b16e8bf4b45cd893ea91cb397faadb9d9d7bf86e6ceca3e9176a5baa98b6114a149d3ed8ea176cc4a9380e18d2d9b67045aedeb28b729ba2ece74d759d5ebfb1ebee8ac5f5e79aaf1f98b7f2626e62a81d315a98b3e", + "63b90dd89066ad7b61cc39497899a8f14399eace1810f5fe3b76d2501f5d8f83169c5ba602082164d45aad4df3553e36ef29050739fa067470d8c58f3554124bf06df1f27612564a6c04976059d69648ff9b50389556ad052e729563c6a7", + "7d5c4314a542aff57a454b274a7999dfdc5f878a159c29be27dabdfcf7c06975", + "aeb6159fa88bb1ffd51d036d", + "7597f7f44191e815a409754db7fea688e0105c987fa065e621823ea6dea617aed613092ad566c487cfa1a93f556615d2a575fb30ac34b11e19cd908d74545906f929dc9e59f6f1e1e6eaaabe182748ef87057ef7820ffcf254c40237d3ea9ff004472db783ed54b5a294a46cf90519bf89367b04fc01ce544c5bcdd3197eb1237923ce2c0c99921ca959c53b54176d292e97f6d9696ded6054711721aebda543e3e077c90e6f216cdc275b86d45603521c5aab24f08fd06833b0743c388382f941e19e0283ac7c4ef22383e1b9b08572882769c1382bab9ad127e7f3e09b5330b82d3e0c7d6f0df46edc93265999eef8e7afa0cb1db77df7accf5bff8631a320d146a5c751a637a80f627b0c9a41b44f09212f38c154226de02f4906ef34139bbeacc3f06739c8540e37334392d38ba1cbf4bc7debe77c09b35d2200216db15ed4389f43bfd8ae9bf76fd8243c3d869546e16b8e44a6cd1edbd2c58ef890b5a84cda889131e5cd9402ca4d8271052c6b4fe3f2dff54fb77bcb575c315b9109f90b14bc8e109919808a581c1809e2a188d29fd34ce639088a6683f641925f5b4b3529baa34e080bb47fb7ad9b43d0d67c9e6ae7cacb50527fa74e56d0c8b20149f5d332d686d48ebbe634c2b5d35fc84c69a5bcc93b93dedcf9fdf19a1fb9b75f6df9692d16f6c3490377a06294499e4b8ebeaa0cfd840bfa05fde21c0b5e94d13063b3f5da7b537caefe89069cfa9de9eb8f06e4d30125de64716f821bcc8279c0c7ea2e", + }, + { + "89c1ee38b6697d0190c87a2aa756892ee09fca095df1e31aeedbda5750f604d9b8f2116e5b8f70ec57ea16fe419f2d213ef72b9be90eb5d7e98f2e398632123e2524ac80b31c6c0a07820848223569602d94fc16a3b1ed8c411bc6c74ed80573fcb1f3afce60b9d5e2c21d04f78665241b613abe12274a5343101a91e91f04e5d1f7959f574e743a10913e0817a32c320467f0178e3b6ad14b856234a4661a755eaf14b5fd88ef0e192e1631d14263d6a954ed388f5709dadc6c0f81d229f630d80be6d593d5e3ad03f9ded53c41abe595981d24ef27ffcc930e4d653743960f4e7ce4e251c88f55c16d2afdaed5e3446d00685c276728ba757520acb9b6bb0732a0e9836878d829e5022794d70ad8440a40a132a8c9ec1d3f0ccaf8c285fff425e9788d6150b74753dedb2ae8b36ff2f310249bd911b9181d8310e00810d42ef94cbb5a9d72a1f0507c1a382f892b23994fbe7360778b7efa9c5e03ac3231a57fecff1c5fa10caf1d26e84db0137049622ebcc3a64841a0e49fa390d1d43550c1346c20d578cff39fb7404fcab0982dde55f0849d312581d0c811a19d46f25e7a5e7e50d74d43760583c5cf335dfc11b2ec964f1dbbd0ed83e18f2027817ea2dffcf2b64a352c4fb8f11eeb4f1bfc01079251254d2112d103a1f12a2270cc026cbeb8b6f3e505abd62496253f93274625786b73997e449c1f35c742a593441252fcc845e1cef1b8f287dd311a0477407ce3b31661f7b2802c79c2d20d06e45f03aca4e47a959c6c1d7a9d377e1577fbf82a115921c3d94e3d9c204aa204a9a5b04d8a2be3269700a035371f4aaf1a42d92b9bfbee74492b106975b36d1e581d6ce2484f09e04fa91586c85f35e2a10f0d3c0afcb05327c1bc9d7429bbcc4627af8f76b86fc561844c2ae3810c84901ac09a1670ed3d31a9daa5d296", + "7219bd21a834d917f93a9b45647ec77102578bc2f2a132dfde6489b9095b4f7b740c9c1c4075333ab0ce7f14", + "a7f849b054982cc8a4c8e5e53e181feee79e0233e58882839892134ad582da7c", + "4c46854e9e101090b1436f90", + "ab2e189baf60886bed88eb751bf3560a8bd3cdb6ee621d8c18b5fb3aa418f350048ecf359a7d542daf7090ec8688c3b0fe85914aa49d83be4ae3396f7bdc48051afae6a97fca7b42c0bf612a42d3c79ef6aadceb57f5cfe8d67f89d49add0ea1ffd423da058297239e72a85fa6cd1d82e243a503b1b0e12d7510a9ee98d7921dae2754d7581e52acb8ab9e7f9df3c73410789115cef6ce7c937a5441ad4edf2b7a8c0c6d152d5a5909c4ce839d59594a6163364038c4c71a1507389717f61e2bda1ea66a83ef477762e7834ebcfaa8f2ee61ced1605ba1380108236e1763bf40af5259da07dd3e3d0fb2801868c2e7c839e318678687cbe33384e2ef5750a0a0e2d2e19e869a4277e32a315ed4de79357f6a12a8a25d5b18291316d9bf40dad2d05d1b523ade76650669c700a1c2965f4e51337aa5d45ec7b4981072779401d6d30ed69034053334bccb18425ac68460becf2aeccc75aacd3d6709f07ee10366ed848c8a54904af4ea71fc2117de133f01e1cc031f2a4d0779b997b82682433ee615202d5dfffba6c916f11a00551d56ffde8c36b303263e14adaf45b6eab0bedf344e5214ce52f071d2f40154d788c6870020791a03d2fd4ec5879d9026241954ed45cfddef4937ea3d0d45647f252be31411237983a1be340fc65ebab9a5620abb0e8d475af4e89e842e895eda0cbd283bb5d0bf20236c62d956de733d60ebceb42fc0c9adbf9b69f8d66551b0aca0e260625ad41cad75d752a234af7caf7902c2c5b62f04b6a8e019a6179d44feeb2ad5859ef1c45371e66f1af1fe0de63997266c290e27f0dd62185c53f81e0a50c296a51ace7c90d9cf0dda8b2d7e72a347f64c44262e2a544d1acc7bb05734dc1783bbc1903279092fe7fe434610aa95fc2ce5fc5ee45858f5e8337d8fcb0a468464becb1cef6b7e5ea48ba383ad8a406df9c581f1cac057d8711fcb", + }, + { + "2dcfbb59975f217c445f95634d7c0250afe7d8316a70c47dba99ff94167ab74349729ce1d2bd5d161df27a6a6e7cba1e63924fcd03134abdad4952c3c409060d7ca2ee4e5f4c647c3edee7ad5aa1cbbd341a8a372ed4f4db1e469ee250a4efcc46de1aa52a7e22685d0915b7aae075defbff1529d40a04f250a2d4a046c36c8ca18631cb055334625c4919072a8ee5258efb4e6205525455f428f63aeb62c68de9f758ee4b8c50a7d669ae00f89425868f73e894c53ce9b964dff34f42b9dc2bb03519fbc169a397d25197cae5bc50742f3808f474f2add8d1a0281359043e0a395705fbc0a89293fa2a5ddfe6ae5416e65c0a5b4eb83320585b33b26072bc99c9c1948a6a271d64517a433728974d0ff4586a42109d6268f9961a5908d6f2d198875b02ae7866fff3a9361b41842a35dc9477ec32da542b706f8478457649ddfda5dfab1d45aa10efe12c3065566541ebdc2d1db6814826f0cc9e3642e813408df3ebaa3896bb2777e757dc3dbc1d28994a454fcb8d76bc5914f29cfc05dc89f8c734315def58d4d6b0b0136ccd3c05178155e30fcb9f68df9104dc96e0658fa899c0058818da5ec88a723558ae3a6f2f8f523e5af1a73a82ab16198c7ba8341568399d8013fc499e6e7ef61cb8654b48b88aa2a931dc2cdcf245686eed9c8355d620d5e91c1e878a9c7da655e3f29d9b7c3f44ad1c70890eb5f27ca28efff76420cd4e3cebd5c788536ddd365f7ad1dbb91588d58612e43b0460de9260d5f780a245bc8e1a83166df1f3a3506d742c268ab4fc10c6e04bca40295da0ff5420a199dd2fb36045215138c4a2a539ceccc382c8d349a81e13e848708947c4a9e85d861811e75d323896f6da3b2fa807f22bcfc57477e487602cf8e973bc925b1a19732b00d15d38675313a283bbaa75e6793b5af11fe2514bda3abe96cc19b0e58ddbe55e381ec58c31670fec1184d38bbf2d7cde0fcd29e907e780d30130b98e0c9eec44bcb1d0ed18dfda2a64adb523da3102eafe2bd3051353d8148491a290308ed4ec3fa5da5784b481e861360c3b670e256539f96a4c4c4360d0d40260049035f1cfdacb275e7fa847e0df531b466141ac9a3a16e7865947572e4ab732daec23aac6eed1256d796c4d58bf699f20aa4bbae461a16abbe9c1e9", + "33791b0d653fb72c2d88519b02bde85a7c51f99cfb4456dfa6f84a61e10b4a14846521", + "a0a7b73ca2fc9282a28acc036bd74d7f5cb2a146577a5c29dbc3963fe7ebfd87", + "eaa4d916d261676d632455be", + "c9a631de470fd04dcbf8ea9f4d8ac37c3988878b6381707ac2c91d3720edbb31576ba90731f433a5e13582aca2b3c76ae75ca8881a463ecfa789910d3a776a9ad4800521c6baa120b2f1afd10f32ef8da63f5b69f5e5fd88ee84bf66b0666b15d05c4050f5358a050b9d5cf1503719f56cd48ceba78f29efe2ae8092e37f5134df526831532f86ccb9339637e2c9e9b9036f83cc058fda23e826a188456e7fd3f4ee20f4e4a3221883fe3232b49db607b90a8956133ab95051c9ec33a908ea7e81a1bfa7bd06c09f0143d07bb23a3feeac7f0d7720269c93e2df19d03605828c8713b84d183c9a50954c12fe3b047511ad15ef03a63355520cbd224d06a34de67a671368e6a8f9feeefe48fc273764a8c69c00314e5d693f159cb5270544f3c4e1760b0529e3303ab308e9a6d03835a3a42aef2df5f7643696f707a574d1dcc676aeecdd9947ebe8c13bcf15d30b2d10d2cd95445a307c1d22d39450615ad38f9302c6eb9dc05764b0503d6a7eaff9feb94834853b47bc25660207be3e7c0e27cb3127b5402cb016396e5ff07ddc3df29861dd68a17f53bf660b23352b739d6da72381b8d19a9fc95da7efb79330a2b360dce4309860af429e3fd10cab235c4acc1d80d9e20d67019375bd161ab65648400f308815afe63cfc717f7d0eea150e687caac25b6603287d44dca4a7cc2f67c3bdd54450bd3170340253b03ba054ec003070eddf9c14fb9dc595e228e4968524900cb5d85af6d1e658a42d744e0e7eb6995023823a8dc33528c6715b2e1aa607782c8e1ddddad72026d657bf122ece8685f6e92236e809139325e4a3c069facf94c10b7896995bba01eb22c7b3a87ea2114a7649d7ed3e83d223e5e785c66a75119beab0968d3eaf0cbcc2d7ede95d024041e6db39a880ce3e19efea32fb89a40a2aae22f407e5fd615e51e48dbd50a8b4ec27ce95e2ba1928bf699d0418705482ed0ed7acc858dfbd690403c74667a88dd5221bb79940c6c4a268379c10343aaefb635982c14f33ad83d47ced9682961540bd4f75804d3d48ba8aa67fb2e3a1db83fbcbe57fec9e4ffb1b575e947f8bd8263c680357960e3a39382974774b5a013f2f8514b3c63c21dbfd314fd5d927d82ba616d76629ac018879f54ff84b5808e94af4fcfe1cf8845b65208ca5510b5b593ce6c109611652cd", + }, + { + "c335b055b752e083554b5aa2cbb6556cfcace658d5c11b6b000256fd89e9b24c1e62a2d5b582580acdb2ad9869020465aeeabe83acd9eeacdc44aa652d5cb24bbe542073d6787ea32b2b3c942d40f9db2bb75ed7914c836d902dd2be89840948d82abbaea23952cd648e6191ce5b6cf912cad0a3165410a781e3650b676e5340980eee3b484008acce6a3e9dc5aa96d775677b8bbb8b323c6e9747d6069a169ea904d9f145e29d134cdbb0118647e8fbae638669efb9a55d50ed33568749f5304ece2193b0bfa6fc9a570d209ef61b4c59a2b5485b5aa6ab47d902cf23f7ff71c5210476e0aa727a01809b9f76b6ebcf58a018b3fbbe5f42976111ba58112b1d322f9312da068cdb86277bfcde66cb3607e3ea02a1494439aa56f302671f1f994eb3ab28b937043f5f7f3b3de50673ecea5dee8ba633c45089b852f0d772892525344ede6b521dcad15807b65e7ba348d891d47fc498cf4d50223d2794c64db9fa9b9766edb430be0c38746ab317b38ba9870a6d1fdabb70fcf89790bfe449b97fe01f6c94502aa0889f0a3bb6bdc65f44d1cd64ab88d4a7806b373f5080f9cf60183cf4686694f0059e2bbc5cf21ba0c3e8046e70d815f1444c3094cc29632c429f20aa06b49b0b52c6c7aeb8e34f7bcb53e93c2cfe2d704a5d0416876742c90762730d160e1869d5e0178dc366098ebaf2cae6f1f7563b555a52dcc194a5c8f718d50d27ee76fcce8e8991f4921fae85ea9476e1eab1364403120698b7ce8fd0a49cf79213f360a17cf1950f104494fad80adcc3bb1207bf250d57dcdce6ac8082a312959672361363cc227310b66ee8c04aab7b5cb33a81c0915e9c770a1cfaae2e8f44a0c65703927977a22fe58aef2f366b8be9a50da9376b46ae7562a82391386831febf359039ac326891bc58c0f2c34bdb6858859fc3cb4e392df65cbe2ec4f02c8425bcbdd1ee2562ab7d229d406d79a9c6fe4889c996c2f68d1fb5bbe3a5e867caa4249b934afd3ec71fdb088c54b15252f9dc1b909e121dbdc7d8a16cc00836652dd1f877ce363eed11467966f7ccb8f1a8d48146e69e04ad76a51937ad4f9cda209451eeca90dbdbd65441ce20fabfc8ce400fb4de136154b87a8b65c92740e9bb91d78521b261f806a2c6279c85ef6ac5fe1ea3117ff7c9f9832fc2aa6fab660082eb22344c1a3befe0628b6551f62a5014cd6194c42b8d475a50f2c9fb58c97e43ebb29005ed7fe54f0a4aa10074f1154152a9067d364dd7863fa082976a00db55b26b5ba0ea40eff48b90", + "f5ff810a41d4b34751e9942970d4c9f26b33f24689a4b1e4449b243490afc485af468ff01a42376b2bcb949b9f5e8d0b917f511a", + "a74271c184a82cb074c14b131fd91eb05870cb7c73c9e511ec8140bfe2f34089", + "2403fe689e239c2ed261b381", + "af9be893d5fd23aab42e6a2e59a8e7cb13d4f543db02af87cb0802bc1af7c717cd0093cc8244994cf21189146922b69927ffd5745e57118bea07a6afe7c21d952c13ab636b3c2e461dc9ffb3ae701175360156338be94b1fa7115799831019455cfaf5114010fe45f8fb9c77ec50fe06f2c5a32423edccb3b2210ee1200a78e1a3130c567542377827586ca8cf0c14c19fa1449a2cce9c039bb441b04e9c0a3f9a743b31c828032174fcdb7c894349aa68f5adf97dfe9294d24e6b5fed95eb994397883f58487bf5c57b0aea5268be7cee9efeab370f89805ebe5373ab2e93658fc078955ccf68b554dd5605005751ee8531c35ca5336a5d0ce273370c0dc9307779b86e96d2d1daf2620d67d43e1fb7800ccf250ca3c02eb74047c1d2a2bc7f29fff8320301694b80d0fd975f834337d00d5f0e4215044d52aa4ca21e6a9d7e03f186d7cdd5c48e3765dc926fb0a46bb0f05c50d9f69c9c507527a60366b7dc251aae1d6bb0d9c73735dcfab959f6fd4382fe2a1f6ad07affb0601bb9040f81b55a48f6a6c5f8ac4a2acc2b0c9a6c439198f7926460695fa11e0b0b017e39de5cf0d5d5f84d972b5eee7b5d1e0343b5485cd84b92ad892e5b23f3e803f5b363f2398c11c15be9f13e59922b0d49902dc8483fb142850b4226da2fb84e9b434a34f6bb67f575a9e57fde3354bc3077a876e260311bb2481bb139aa9af55df5074749fe532d7b8a554218a90cc7e7ac69db280bae5d55a174dfc8d325b9909a8da1016d4e162fe5ba70cf8726cdf291f5e47083d9929cd5e32021cbfd982fd0975f6f9baf4322b553cb3174b11c007559879f308419ff9e4e18eee8d3640cec8aea082b90f69cf3c7676c28af0265c24c91cd58a06513198892ce6ce1ab3ee9ac0a2e937b973a9cac06a039a54f8d994c13d42c59187f677352e5feb32a417aebec4d852b2595e7e67450e06dbd183279e3b63022a3813b37257b085bf8454d6890875a2950d20210a8df4f9da746722f62687e92f0e9efc3e5d526d65ccfbcc042fcac7964dbe147932c73924bdcdf62f9eae58d29e8567ffed90048bcf0566b952e986efeae4c477944af18bd243c3eccf8d88c06d07279adad037450cb8547a8aa0a74223f4851747c803cb21a2dd027e7080aed75038cdcecbc4639d87763cdd41829a1b72cedf0d722b180d0d492a5740ea7607b95f3201df352fb1ab28149124d2df5d5ec106867897b537302c3431402348f94d28eebc701ae1b49d10adedea38f1654fbc48885e59e6e6dfd413c6b5a97d8c35dfb07a6cdefe317bf61cf91", + }, + { + "4aba5a776ace38b6e2578f0007e770d264e39c49f588ca3547ad2888365e3a811994f8836330394587c8458eb0b6611499fd5d8e8527c3cdd4ec550b4a8f8c632384e786b420cb3be911c999c72aad60270aefad31b27a069ecf11e95e9d4c81213308d554d3103de4d9d6ab04830c2b8dfbd8bead52c44c21d5357f72810193b5096809dc7846c1521c6c569f78812c735aea21acaf6dce84a24df7234e8ad857f3e1346b27f5bd436113e2da950e4deff96e9ba8db692c7db723a105ae795da15b910c8286cac6e7dda8c172b70f61b07dfd58596684d61da8772356f180f74c1103ce97cd947eab3d401df44f7fa4cc7cfc25e280fc002873237e64a375b0b4797f4b4613c9f150090f44588ee8250ae44aec6546ec8dba0f0c1eb281cf66fa4eb141617b32b28441f6ddcfdf02d9c34cc62893b2b64dc2c26b74433adb3e888c7fea07b19c8cf39269c2716b9c35b7625d4a141397d6d5034b193d2657c6b2d6b0ba874c467adeaf3d501ad985d13be21c4ff6b326cbb671e4f4973bba49116a0399b6491394f850e4122969e4644c00b442b3da0d6a4bf25ee22d182b3f822fd83878ebcc713cb183651a67ca66677ea81b58b685a3a8e385d5fbb0147ddfecb558d881c914324c794db443b31bc15c361912bbbcba9e418f99f2a416d190cb29684df27c7f3ff6ccf339800efbdc4514ee00d1a89f12373804db4fd66c1affd467f251e73147b3248033327b0f7790fd7861a51773dd4f78b89e4e24b94df9203f4a077091bb9411eec78dfe3e1dfbb67ea1cdf17e1d6936bbb75b74055495449e9cb52f5749404610cd444fea3f0568e0d35a5ef0c395ab7bf0208044b5c4e2517911a9c351efd31f33220972287253fbccb1eb8f46960a36b68a7a6b4f5cbdc86d668bbf555fde8881e7faa9594da425ff8fb54526bf7cdc4af64899530561c06bed7fc04c5d48cd4542779e901bc48fab79d4d13850ad8247f51b9afa7d5a656ada25b6376d837cb0fa1b4016dfcfc158a39290f43f133b352ed52fab2f951509bacb41284fbdd849d8185fb7e7200f8ab2a07ef2b3b927e18e568dbeeba2c7a66e08cebdc6a6069ebe6656a586652f3905ae2bb867529af6a827b494c97b3a378408f44aaefbe86c613e11e7a44020a9ee4b62569dfc4c462300daec7b1424ff1c1849ca1332367470475c14877cbe76c820cc651c18ab3f18852b93994f93b568dc7f7b0eb5f07ffc4c9384c851fa9071c6f68ddea1ccf627f889c0471c76aff9f52b07ab1b86a7671a2b2f6b25c0ddebb66ac95737bf7e2f493f7665b5265eaa5166556cecfdd3062802724ec24f3978b903d0f0c24e1f0b8d967142bccfed0d354279223f4c28684e9ab611e9ef89a3f25993b5a8b3c0354931780501651236a78b58e7d7814f251b053605f4c0a8e7193b9cc1ee5cf7378e6f3c8fd44ec57bd91e62b09fb1d6bab60cbfabcc6792e6a32ea7918a9ec9180d05a7e1546d5d2d8bbfde2a71b4e427c0a4d28d0b6473ae", + "921a401db90935c60edda8624a0590d5c46eff3522e35de2872f6f9394e24126fd8143b68a797c995624fba0298b75eef974", + "6a4d35ae03bf277f587da4541dcddf92bbd906dff45d5ff23c0f60ae53b062be", + "231b5780fedfb06d724450b3", + "ba40968282d98849b19d867f8b564ea5a81d657516099362926bca4cb6e9ae02719d10c8061f53008c727a0eeea5e1e36c9e55c117e9434e213316c96840231a1e356b254a9981d4a6ca3c66cfc61018bcaade1a4486506559e6aa3a86bac980d391d835fd5ded98d10f1394d84bf1bbf2cd3397890d704154802f7864ecc753db782fd3d19213ae65ace4770e1bacf32d61c6730aa5adcab4d7e2e437888c11c29abba4890a17a00f67a53b660becd94092df0598df5ac57326f6860593a519e28bd4a39f6481e1a4748881fd5f0456a3cd9f28d1d1e78dc64030cbd8fdb2c5abdab3f13d6ccccd187e71e989f8c486929efcdbf2a763effa95af62db5cef95e9081b818275c69267022fda4b7fdb8c650b491a785b03d4d0186625962b6326ec3f4e176373da4dc1f83a14815adf82c6bffa7c6967d77528d0249754bb4d17656bc4a89449b16152a4a1aea7eb0054a8892f271138971507d2f3b237ba5b620f444544e4a8c2b1ab4f9168762c27478c9f776c47ee2e9ff05bfa35ed127f0cabe7cc053640bb8aa01f8359b74bf89ef43ca94c48fcd201eae39d1835957eeccd6b3a852f4e1bbfef9a469f42c764481ff8408fe5871afeeae7676b58f4202199aad50a596626dff97c8e60d750cc59da9f595ce12ce9afdce14481cb1e39994de8fe4cce07845110d6703dc59d34734e93e9e57e1c52d61f44143a2d290220a4bad5098d098ee65ea4b6757d8a9bf5485aa3d697a7826d4a285186f5da10eff707566c23c6a15033365bcb498c44487c72d96402d1834753fdbf86770239761f03e0dc8963766441da99c0813e4f1df5a1d018c8799861a396562eb24ce305ca15f4022d83ea3c56b68d9a7ceac4742ec0ce50f4d36273df26005ec2b051fa071b319be2d8a5ed26eb75bc1ea83761b8454db234d15d84d6706cd178981c1f156e6d28f774aee3e9a4fade022e71b52b50aa532b8bc7fe464f22d6eb169c69671875d614e987658820c2f584a4fea3008afdcbb646dba3d69020fbf503f121be3480344db23efdda0d255aa058c3ff66abd3a5fe35db977521608bba7eddae72ae801f4fbb12a1de4133039e046ceb8db87e465e5ede1d79a08c857d59076d7ff858942c31e15cbbdae6fc15c3f9545a0825d6ff8583c0aba8a7d143d27b93f6caefb98c0d83bd8715abcab2a49087f55a9daf9090eacdf45be08ad80b5df5070e1719f68c4cc8f8711083f0f7823a09ec092f22df95fe9e95114fdf82a3f6eed0bfc9c0aa65222609442776154a474dbc9e662cd5dce66846572e52417ee5d7eb59287d07ef60a9537fe1f85c7fa74fe84dea0da235ac7574335e6649b54a6bd33397df4bf4a7976c4ab868aa702766d2bc8d2c82c2d1c2653fc8428b8d1e61852ac185a3a0b416dbcf8eb54c44967ff43c44f2b32c6d4a9dbf2c2f3a587b430aef50f0375cdb4c1b319ac9aca486d9bb321141b065f52f7b6decaf1985531ca7bbc3772a561eb1efb8a6297075920bc432131a5b211bf25e35fa31e12833bc77a9de14c7", + }, + { + "6c0056937faf1023032df1e2bfacbbc58bb022eba25ffa020d4eb26f0caf0678af5d0b2f0c1b520f4843f107f0adcc7b5dee66ff4d61025bafb4cabb64d133132e3e423a599549a1d83aa8c8e774444462aa44b00b460bbafad5755ea6a872d4e6b40e3f4957e0229288ea79fc2ebe5fd9020fe4481a9f42ef14a196bd136aa3c779e311d0c333624c1ddc484c9aa7259cb609e4d0a826c0bdc7567adac01da23900b30ac4e66c100348584fe200747eb67e6287268947e3509d5d2b5d7bcd977b80a13f660d4f6956a8b938a82db75eab19e5d2a22cb5f3c9131e278eebbe096b5f49d16c983ac240f3fbe821b247cccb2c9e6e59546122677f49f56a07fed56647a6d3e0e09520d49009f54250c10e7c607cd5b4ddf81b5c4110c6490e9baf56418236211856f5a85feaebafacf92c0c7501c052f9dbae3beb7484f90f334f50b68571cedc67763b5161ebfd5a1709cf18c92112a4cf4d8f43d1895204d8a2ba5e14883a7bff75cc6060cabb77d38a909daca2417befd1bfc05a11c432b47f90c807ca4306400f67a0d92218adaca84a584a8bd4395c93f9b6a4bde9583c79204444634a8473b1244cd33cf980e443d82ecfac672b3f60e2e41ecb3c5a445d9e88c0e90c339a31806e6d79ee52bdc6808c73e8b7b24899966664d3c1a9305f31f0483e24e36fa451dc1d3f2eda05af6678971e2bdfb7c1461c9407c5c466f6b5af34d992a37de3809a22ae75275ddba0f4f9cbd4b18c1acd212192e587889a36bd73c860f0abe08bcd8f00f5ecdb95e1d560b586eccf530df0e5f3776d8dae2a01768bf1226b7ceffa7ce4e75879c82dd97db3c64c06d33cebc6b35854618355d80e46fa79c3e9743fce5b974723c421a077e7ec7dba286881dbc1d53d442a1552700fcb33f83f73c69a0a0ebdcf2f5d461649c4d0712c514ded268a31509f83c1ae4ff4a68e676d29727be641aa4487c08d4b90ff78e24c6508d69759751a1a23690ec9f8763621e8b107295b4bb01bd9fcacd8748e24d996fa70ef6f8b0992f4185bec8e920d7643159f9f604fba394b6611bff435998b2f097a9e948430899c8c752a1e83a061983f00f88ebb32da214399167932a1a83c1b47d09f77593b03cf6521520583ea4483e2d33e14ad60584676d1791779b532c085d238df0d3bae735d0078e0eabd63cc90a2e13d023983780afc8f83b1c14437937c16a1b7c41414c48cf4ae49587ad9fa5b16fc949a749e96032248c4667f58e295f999590dae1d99a2cbe3fa45bcf4a1d3f0356d64d40367f64b2c5cca843e5f7dd7b88a85d52328a00622e6c317879607bc036c9006d38652ffe21c83207c00f8348a7d0aaea5aab4c89077df170de6d41052641726eb6925cd85a9ee01a9e636346340e209ea96d17b0eb0921b96662ce9cb430fb6ac348331dd7133875769bbbba99dc49333950e4145a15ddb0789c4d2ccd38878080ca9e57ddc6cd5452790eec45482f8e990392e319609391fce0beba19463a9a00d8f1de9fbf22f23821de7d69fdfbf3019ed61aff79acfc5a6ba663a1e10da2b9ff7149aea43bd6c61a543008402309df0924de72c1cacd2d6120cf422e61fc1de345cc8771934d8be77d9437a09e06a9b2d51c849fd9a200fa714328d34f36b684f33df6968b827df916a599a4bc3367814fec21198e2213ff653cd2a463892966c72ffd42a26b3bb91", + "0d55dcd08b54e58916f622f81761ef6a2e19b167ac47d3", + "e42e1d6d44138f3d2bf12c951f454686f18d590fd30057405b5a3dc2b317fa97", + "1e46a7486c5a03fd6758d938", + "fd3c1fac10cc82e49235fd57f5aea0ee7a7bd6d539b138d4b3fb623aee591615c1a61228ef9673113a3a90a3687a12d4c6367d5f7bc67d422fdc4106455084d79c2c42c5e86368dd164bcbce7925bfffe7d96c13a2f49aac8e9d1ada3554e3fdc21aab00455a0f33b0c1fdea91b3588e7ad301bfccf9940027332fbdf966463491f7a33c093e0a13831ea9d2183294f89f414cf7b5876af04fa68d594430194429df74fa5915394427259e832bc545c13400aef6cf16620d48280798a6e49773c9316d79fa1dc758e54cde2e2cdb856092d83f4e9b698385cb976fd6cc2538abe055273a5b34a784182ea5e7d3ac9019a05de5e5afe4308a7ed2d363cd50ed6a52df1c616e4a82f607ced768445d13ae4884f2ae1f9fd8313924e8a1a8a23905c92eb231f638dfa6f4cb27bbb9844e05afbbe2ca4d1a3b3a5b371bf33c9ab6f82a7387d61cf8bf662097624145a983839b0cb9f4bd07556800b4054fb3d0bac94f44bcc9b4ac49c39f5571fac4e02ff09f08b3ed5add4bf8bba934e9feb773c0590b45c45fa036382f3fe9782ad19107d4630321e414b7b442b64f18fdd5219039e5740f34b3ce8925d1afe8a39e35ce8db086060bab63b9720700499f82db19a62897c6d845389461260303f9cf2bc7235a898b4620c2191ef05604a5c8c783d58009533a86b27c12b0772635d34ac53993ccf174c9087073e5e69b26c0c3d9f768507ac4d4e2af847b65e3a6e1b7a6dafb0aefc190871cdae6c60f0b1d6137c351d4cb211870791cf4cb8af2ea446f6401eb9ec8a5bcebccce898d1dfb13454df6b35b81ed6d7637e6e261e004080c60944f3a08e8e5fc7e2e4939e7c2607c8cf07d1d10883ba3ad43e2611826f245df571857ae0a7a867df9659f2082c19f94ce400132e48c7f8de2b102c7f83ba5cd1e785597a0ba0d73bb81bba0c00300d4bcd6ec25fb73105a46122873bfa729c0979d8d314ab7ea52391aabab513dbfd1cf01c2990c0a3612f4511c2bcf0f5a07e659a881a7f99c3f1fc4a46e66904427fe26a4a80a904c047d090c861a075c0ae4e29bfbc18b9620aaa42237f4c6fa76ee7491ee638ab5f1cf0b440759828e1ec519679efc776eb1468999a00f667e87199ad6891e98b95fb682e02517b024a6bb803ed23c944010cb7bad0733eccc12d6ab6030c6e88d510ce92e2f98fdcfaa1e37e41fbfb4e99589c0e8efbefd40473db42b3a73b57b22a2f8c9bdaab16831f1b117dd83a77dd01ee8d0c2e92203adb670f4fd65e618823ad196220d70e014c1aafd8863797c61c16382c2600062683ed3a180c70891717c52da15191b02f25d1715ebf33a5e6037092421989c942082f4b836423cc3e976c9bcda185de36f06265dfc250a27d2de0bc48c73b3bff704f3b386f962522f572108458bdb283c6ab3fd33b3ac13a406268fd5d97e17db9c0f780b4b2a8f761d15a4d8b3a0cd73357ecf4d26a6492ee069f19325823ef50bcb2f73326719a57b67eeef506fe8915a1b1ba1a637592268257b91e9c7c5d33cdd947967efc1952005d82ccef9a3ad7ef8ffbb6b658983d64c51242ba53f8f8963245b87a25aa9324c527e53f8c11d55f30aab598401589acd13f090541b3b057b162190f27910718b02a6b8ddbb8ca6cf40bf0d2848f4b76341bd5e78f476862bcdbe2d1bac84c0566fb45b21388221ecd8483d99fe603646b1a9f38a49230cf4dbe5d7883d73eece01bf", + }, + { + "04892b94c65685f2eba438322b29bf8439938590d3e0eb10a29e279d356cb439f6dfcdbc3552af21f7e753221012a649a52bda780bc589ae63b04b981dffd113df9fcf14f17e35e865880a769bb1bf40dc99b9e85e4296c1f2e1590fe02b22bfcaf2d4bb7009a4d692ae4c2d5f0b6d3ca526240368bac55b9b1e6a7b498d3b137f0fcfef1873c5aa2111d7811d45bdc26be1c5d49b8a2f36a999b1f226ec06a5fbd59514485abe696c96ea89dba74b4688101a239b495944e30b3609f73caff3114407599ec5c30a5bad933655de7dddef97018ae15acec46504cd5d417c5052c057ac5f1c6f69781cfdae71db2b4fcac35054a4aa22681027356d68b2bdba721466d130d53ba8f23857631382b2de450232e9ad5551bd7c872ae439e79eabfb057d2bdab8d4ccf02b3003ade2e1f3e514dc92692e4fe5b579c9ee6067995b6c168647ce5a13be8543c23326a3260bb7029d2030ec05e565ced3c5366d20a283a6e95201fd108640d2b96676df712de20e4e12fa53f85f22cb24583844fabcebe40eece11e7221f12c88670bf994ed08e2000236f86258c386b0fccbaab8b68ec6a26fe41491d540193c4c12d1391ab3391de9317f41f505f1f1d09ca9862a6f289a533d2b297d4465c956360371ea3c8ed36e0d1563120654e3a2fd69cd6c9267bfcf92e84cd64e162c84199d6e552b42c33857264b5d7a2e007797cde32934a3f8c68b459cd95bc85e7466ccc9910e8dca65b315c32e43c3a5da908904c42cfc8ab74126919ceeef1054bbdae6ca67b02f1ac5f24808b5eee24577e609a3e3935a24b9ebc1a8dad1fc96abe26012928f2d5782755f3763427dda28867d0b1ad830d3c3f17b9ec278346e5a9480ed23ad44a523a4dd86e65a610ee0de1afab64ace7a3b4918fdc14c6b1ce0ec0903994da9bcf18643d7e0a4e6c08200bb394a89b385d2cb829417eeb0f7dab9fa7306a330f82973cf0917b5ca99b585d2ff0e8584e050077467f5245ecfdd5942e4fc72dc26e5ab2ffc61f996167e68168cee9a6d3ea1e1a696060465e35da8c75a1aa380004faffcb0a992c627fbdcb4e97721271802cdaf08d214ec2fbcb389d75709d7a6b9d35662661c8961f93d4a705e7188613f3769114c55400809cadf60d3b6068c8a5ceef078785171b59be1140c6a754ba1de5ced349df63d67d59d3a8ca3c716ffb506772d57e9e3f2caf7fe346c4ad64aa6c37e43b9bbaa8f58e51bfbac31fa6137728f8e5b728025697e5ad5c8301f6ff39eb2ad595d3cb24257adee88a84fbf1ade4d7550cd9ab94bf48e1424ae83184c35c5a5920157d45805c2e0ad129fc7f0ec3c41b9d6fa04cb8918ef379b0783d1cc2863cd80382585fa05320ca4f9fd90353e490b384ed6c166c6f802cd7bd39aa43667246e8da96992db7537d472c709b01114e95febaac5b1a3c77e1e9a18c2d180e63f0d8fa89f6a1ed63e909e4741af5c2a0e47d4d3f8779b7696358f58060f3f461cceeebb390c92779d30bfdedf1b08ed62dcc05a545bd0ea915f42976e81dd8a50cc4689d8d8007508bf53e7da5bd43c3894968cf0677681c6b818353af6bf8ac205139add1310e5d363ccadbfa0eaf735808325e7f9a6aeb1bee3ebb4a27576a88811859c216b6f84371c43d8063a0d87bd326eb6d81c6896ff534ba2c9c14a51d2cfedf33a5c787279bb4a7ff65706b389756a6191d2f791254233ee047d40d64c2dca878a42f903fd4382f39a89a723fe11848fe37b2008be53f7c2d037981d6462a4eea49df1a2e074957afd3c9dfb4d218a309cab395afe301ccf", + "67b5eccb1790babc2dab5e0d1ff3871c3024177d45a2ae", + "259603e1c3af3fd0ce3257eb627b02e0c0a48ea2f175de3d8c36570a445e5369", + "e14de73c4b17581a7e0d0649", + "33522e67ef932da5fa8abe628b51f3abd5049951dbc982ea95b7769652d4830c588fa45e3fcff094c8602b9008d7b2f9bf6c1c4a8cfb515401c7c44a7ec42ccb967722a710199e121a41160b1ec581507e9bd2e2e506b10c4b5a8d6977435aa08e27504957cd49e756e1574c4ccbbdde937de35128b7ee3455d2e665c596c2e97c253c94e405f85eb5de84874c099b4a97eb8f492d28f2e4bc64b228dd5984e76ca08376d7f1355ba8e0fa60fca96635075417d8b436278e0fb91e3bfc7d61ca8c7407086933c061b2d318f46f352099e1d317d6c44098539d1d2c1b7894db668e7a82ff991864fae236570cc420a4229883f1e2242d05aa07e175bc6abe11cc643cf1786a4456a2de8c066fb1a70fe387f149ffbe8cca7b110e256fd0c09b1d3bd7381cfa82fa700c8db1e79809ccf75ea52d0b349264557046e8703a191ddaace00ccfc513db5e78810eaac0a99d7bb1a5725e722d4e595216a0e12f3a7aab2e623ea9e1dad06169914bcd51b643016fea7dc3f2743b1e65877f1fd5581bee5ef206d86494a587ec8462a170746fcedb2c9f99090674ee687382711b4610ddac599732453dc063518aa36f5b4129098fb9fddc02eb8f8cfc2fdf0d904ef4d6d06014f977b29d0e9aab4044ce9c662a18b1a8db1ceea97854e90704430fe9b1046b221b27ac79054fcc68c3abd6fab7da66e255ff0cbd0506c852e961e619615c944cd9a05c25abb63742f5da7bd9939feb0f2f2208c8ce82f551a9d4d70e935dad018e3e4e6998e39670221601c3e34716ba75eb4e2fdf53c4d471c444330514986de45cf44d77f793c17e36a271fc65e6bf08943aef4c66547dc310c7a430e3fe7a54898de48f69f282f52bbdc4daabdb325cec7ab66fce1aea4e2fd932dc1a316c821f5220ea437447feae2fa478adade7cd515a27d8c132d0299b3ca1bc8516c9d9e7c65c38c238c69f03e104eb42a29cacc8d79b808ea6fb233a5056201e3697f81a2d49ccd8b8efd1ab0fd407c16a210767d1d3ca798ee53a4bbf1ce5090d321b1a64fc2c5f013c23829f5b0d2737936ca71595a1d02711c8a7b0e74654e5d76376ae26977dd49c68e3c0a7b36e047d44be42d732c31f681bd7b1b4b339f004ecd847960377acd005debfab13d0fb88355025877630aff753a7cfddf6851e8bcc8ec37b8f9149830f47e6b601098b2ba19a4c0808e31e8927b2525cb82bfddc9b4bcba2b46bbe768ee278fb89010243d16f9679f5ba4f13cfe76b5beb16c7b28daf99b0873098115c2233ee3402ac0f6c899a2cfcc83b2ccc06676999ad48017c4ace507080a26501993327ebdcbd1e2eaaaa99f4998b716cd9e36eb26b4573a03fd1d18047198fdf675ef4f979864ac85d230a011c69d8b6c45e9efbdc2a03f195c9731b4cefa60208ba845c0978e73d082bf6d6a513b93dc805a4f5973f4158f60a200167ca88704a15ac5ab1f38ed455a426f7c6a96b6bfea2ebc1ae1247cfe5ff29ee81bdbcb53b03b89568bae9a6f311d2b20e31c2d91bd18fd93a37be266d0de8015d52e325f78356dea0b77cc76f28e0f06e4ec705d1328340013a77b0b6196f44b7712fff4ae0ac7f6afab9456a95012b7c6d387285487476d189977e28f6c9d1a3f736320d61302c2d627d5a7ac8cde4988056b55eeba27efe7e640f94c115762ad5849423ae138c76f15b47bd2a2bde2c492489b7980aaf1c4e32a155f858d7be4fcd0f8a18e7b5d97c5a08d7885d6d56222ef49542c7f80498a14a8eed1c092543aac3439966d5b5d0cb9e602f4fd795c09d652b64f9ab67e38f48c88d18e30a9774f37e9c77b7a94cc7310d", + }, + { + "4ab8068988d4bbe0bf1e5bc2fe1c668cbe58019c958dd2ec97164aea7f3f41c9f747527f1c0e5fdb2cbb9d2ad704b6955cb731f14403dddb1a28c5996707635e4eb5dd6ac33d46eff8e319cfe7cf6443869534ca9812a5b23a6b4ca172afffc064dc2b28197117115431e03c00447f87d9b45172c6f724006270a1d41fa094847cbfac9630c3a785f488c1f5cc407ca6f4cd18bac43cba26ad5bfaccfb8f50784efc0e7fc0b504b43dc5a90a0525b0faf3c8b4b7046fdeb1cad87ec667ce3eb6cb4c358b01393f3ffee949030ef9fd01c1b2b9c5219777eb6ff5b1d7c3ef8d8e3bc2193dfb597cf942c5fc50befa527fac0b44cda2bbb811b06ae87459750295371cd232754e2bb7132807d1225950ce64949b0650531800bd0074177677acad937ee008cc0bbfdf33c6b0552000238494be8be412a3e5cfa359e619d092c76310a76bdcb22abbe6f16b3b116b5f95001d20e42fc3c9ff6723e580f378475788eec265a1ed2087de8cc2eff72184f73fa5dc6e68a56dcfc85350bccb97135386d5b827c2d9aea065708f5c921454d1b9303f21d5adf19e00415acbd86d1e5e42d78505b033a515a435713649c50702f54623cbf31469f355c3be2e30dd8c72b4127764451d79e952ea1f9bb0269da56dc07060d5d9542a9c1258ccefe53fa3f7b6073cd38026256b45c01b6c5dc0d91e3139f30a8d1da7a076738f5bb23352693a8e3cbbb46226fa22416680013f9e3278913d06aee4a62457357f0a68d173a360af5e1411840e34c574b4c6b352f92ce33632911ad8b6710d357b7607ee19679e777baffb8ae3c0fe9786b2e97fdeccb5105ecfe81441f549bc6b50ab84b749fb33f8f6bddcb6bb733d6d5dbc4b29725b8741439b8239e53fa435ea29ed3324202b1bdd07d1987b0e06d8cb51013dad897ef02401290940ce3f2af72c5d1b4c8836299008c10b16c7e3e119e41ec66d9db6929ee09bdeaeda08a50665c052edf77b7dff3d8815046bf71d5015e3bdb29a4f507aeb2e28c536cdcc9b8d1e89849a0683d78f99dbfa90f94aa5dc08587657a8f042d718080de5d4a973f232f78c387b63c7143fc2a4380c491414a18b6c4a7bae2194b62e798ad7ec7d09e409425f6d0973accb17e4d860f8ec0283584cff076d93bd9b0c4873f9c57cddcebe3c3bc8afe793c6cb6b26c4582847b07446b7e1d9757de6bdf0df826cbc502bf88cf3a773866d3ff293034abc4afa3091b2126a278f50e47f2f66ebebb616e342098ab690f7f5828bf8cc4742c677d378893e9f188e8397bee983a9a0998de2a31798330f8db59a8581e1c847589bc0e2d95ffa68e39226cc15cf6cae5c4f5174e7848375391dfabafec202565ec2383721339f04c5c5d1da953d88f18cda65745ee8e99805e35203a6545a0416923b38c5db3c8aa00d64354bed27d7c78c4b257534bd7a18107ebe64d8c27b6afdb330d8efba79fd1fae480cd51fd3626bf8d79fb651b7c6cf752aa737a5123558420d48fc86451b358d270aacfa6c17f343b7a9956e6f64e4990c1b3f1e5097605edf5ce4247819b19f245e9a90758dd42c36699ba5cd7f3ed99a7df7eb155749f4b42d192c47cacb6b2865fb9ef2cfca283865cd06e40cdf7f89d76a9e2eb393e2e0ac0e2776da929f3f8e3d325d075a966d289c51347bd0bd523a5c81edef63ce9b72f5114c88b08b16edbd73f518096240a5b37421843173be8df4ac7c587a17ca6f2916f7d9a10dc75f81bc778a1eb730d12b51555cc414eab9c066113a7edba9a7f1a18092ae47f12f0368ba211feaf34a3b48a7ff5c91b81cf7c95675a4001c95a19d284fe4197fe8823909a123fcec5e45935da12416be1bdf14918414ad19b54a41052f5b8417ddbd207ee01d6a3e62fd9b0321b1c13d91d6ce15ea7b2ea0c670a5f5cb290ca8e62c26c6499104ab8e9fafb05170ede246bbf7313625d1fc9576f1609ffd08852a2f4b73c04f1f4eeecefe3f3eeb2185a618b6dd3e87d9d3fdcb349cc83c21f26b6c662bbb857aa95378e991640a160a23cce76153c134508c68ec54a5", + "0d471079ad3c3432b6de852ec71692d12d9df4f984554d458a9dd1f28a2697976da8111ae4454c9a23d1c8eae75bbc14f8b00e7c065bc290f8938282b91a1a26c22b40a6708c40945d087e45633a595beb67d8f1c29a81", + "f3dac58738ce057d3140d68d2b3e651c00ff9dbb2ca0f913be50219dd36f23c6", + "bb2d033de71d570ddf824e85", + "238c4e6be84bfb151557327095c88f6dc2889bce2d6f0329e0c42a5cd7554ab16c8b5a4db26eab30f519c24766b1085e11d40823053ca77adfe2af387b4dcde12bc38502229510606ff086265f45b1087375dc4a022eb0b641101c74ad566ab6f230133b7aa61861aa8202b67beddc30dda506691a42032357010d45adc7ee633b536a2fefb3b2143837bb46db04f66a6e2bc628d6041b3d306ff78e96205ab66847036efa1fb6e6a387cf8d5a105738be7163df9da0db48e3d8fd6a786f0f887968e180ad6888e110fb3d7919c42a7f8c92491d795c813f30ea645fafcddf877f5035f133f864fd0ba1415b3d698f2349ebe03d9e76610355e7fc23221c5c72b1b2628a40b14badf93288fc4abeaff5306d274f21938650ab236a39496d3f8a6e9086eac058e365d4335b51eafac813f9175bb7bebb75605909ec3fde6515694e119f7b6e96aa1d6d6454c3a7dddeacc83bf0c1f5f6c2a9dd2f460f3e5b074a33b8d7904e6988ae43a22a87f0933f812e45c4c518bf83e606bad4c3c55422ab2207e9d3cfcbc5819049f55e35b9663273d9d3a6f8a897fa38b0dca77eb6c344290cc007b68d913187f2cd480a40262623a4e95d90d5701ac2b9d858d70a27f0672f919c2ded1fb89134ac9a8ba6ac62931c832372abb70e811dc50cce264ece65e87338231f18ac007c5f68f3b1c5904ffbb2e1dc361d53914917770d66afe28c547d8cd5896d892cbdadc34cd6af348c93bdb8b072f38b085361e62ded7a38b4368824c759ec7d2cf4caddb9191e5deedc8b8388bc4ba2c0672321bcda3a7343c9ea71ef03750912f35624d81da5fa8a6ee676c4efd99d0c7258b844ded7b35d8c8233a316b508d79c7c0b3edabad5db9543615179b1c111bfd78b79327ac5b4155336d670baa592d441c810cb1b7c07f3d35473a45b57e780b7d997782aeecfc0363976fb608d6967844ed00b63ba75996054d090aeb605c195b1ff86f9d9ab5892d27632cbb59c06b3ccd69d33ed5dea9398f00b7c6404fcfe2fcb5924e4cb75cbcae0a1b084ea8b15eaa5847431e9ab70e4afe15b4c82239f6165e243e3b76d6c91d23b16edecad8bcb16898641f8e323671452034a8ec9b42b29cec0db210bad0444f1c5bf3505cc41d514d5a270d556f0a34333bd06cd6509ba253a6ba7a6db8f1a60c99f0c3d566a038a72f1271a178cc3ff890b0df1e7438c0c1a12d9873643e2d7bfeb92379545de50834abe2a345faf7ca49beeab87ee516dd8598b71196b8cdb15e7200cb5bd814338babd74c565faaf33d9a8ed4209b417345a1ae611880ea22ab2e894d5d14a28fe3835d3b2718125f0e6daabd85327455646290ceab89e579ed5e1d72a0172e4a6d8da70290b5022c941f3866f96cc4218de5d2622d13af6dab15760a1ec5d10918267f9585284058aba611ba07b1d5711cef505869831699bedc2b190fe1d578814065c91d87a8c8dc9b0d4dae0c80cd241f0bda3a6d5e714c894b7a48b1e5eed4555f103eb03c9db30efcb855df422d7451a6d70f28174c7ebff536dd2cd2891f6c3f264d632ca924c4e0d84b37cf8e06e6f2e29efac6cf008cc27f062441278dbc9f09cf44987e0e9ca088a48437b0b89efb9cf00d3d0c5fb449fd4b64e21dc48cf300c2d80a502cb583219f1881e78e647783d91dd2f3b389a1594eefd8ea07d4786f983d13e33cf7a34e4c9a0ec4b791f1666a4eef4e63bde7a241f49b5cf615888bd8130743bc8a6d502bfc73ab64d1184ead9a611832b7e24483a1a0fc475d9ff6166b86a18a3dc96910ff182cf326456c4461ce8acb3467f801890eaf1ce0b24791da9c650876e718c0bf43c475174f9712dd4a228695e8f8b2b23fc4a06358b4a6a8e1afa87a0280c3e098f218f7a6d6bd716f8c105a7eb799ba0220837fa5a96c8a22a826a6f7ea9d7216a24acbc7b0133210cc17c8190507badb421bc54997ff9340cdc1ee415126ac46a4fec9fee12d40f06300f7e397b228250f36d6f0d2ddad5fe1898ea690e4c7cc3a116a70bfaf6d2dc996753fffae40ba5280b8356b7ab4ffbc914ec74eaa070581fdd1d9e5aa2", + }, + { + "4d81b652fee892d575bd13dad913d976cf0517c819d5183a72eba995b1f27efe743451721ce34791a15a6b7a6e44f13d4a080563dd1d9d4f0946e5ba3863b9ac970a1fb4ed66458ec1b1092ff5fa6c3f0271a2df8e3f2e97851352be760b6a0e1589c202f00791b1b89ae0ae944ced96bd90754bcfa3e355b735132d407d3b5507fd57f705e8a8bd82886b16d459ac91e921dcb8c5bf0d7cf420a9349ee589a5e2e19ce7c944a54ccc1062a0690f3152300d0bf5cd1871c1391bf6d7007f7ce26018ca2a5c6f76287fd8c8e9e7f93b1806460dd35f7f95989a8b6f9a0aeb7c6b0346955fb50b8735e34f1ecb4859e34ea0f022ff6fb797094206a34cf120b7f4664c531c57da513b296f0671c8e9bf68d9e1674998fe52da04f627f516dee97c2b3c988216e9bd3f58c3b021ac70898651f1cfeaef21c4f417ebe92dcad3aaf50f4277262c356584f816a5a5862f2bd720fac10f1b86033371ed603bc00a30cf4da8f579dd5bfdd571a37af7d2a5cef29f9001bb1605ee87f24ec3b259f381a69b771f78d21c4e43bfc83a916e08830d9885c8ae8ab6367c05f92e5eecaf0488262300f83f4e3bff177590857e149216995bc52311fb9f16f4cd74e07c7868a39b699bdbb7d7dace4c6a53ca7ee6e11741a63a52a1d96995a6dd752356dec6f14761ccfe38a6cd8511204f8f0630a747d6e19a77bb030c61e0828436604a28a7acf4a5e49b7269ac93b93b99e9e2e1c0c47b377f7e44e05ec6659526afbdcd5bb172404ce5a9f8786234114c16f20cda6d4359eb873a4a4d9fdf734e9c40aa4db3ea9a98939210f6c62142dd144eb78191116d194bb766ea96da38321ae27fcdcc196560ac75567297984fabe6072c771899906350f74de6d18518eb6898b934b11e945d94ead02b821fd6682602e03e9c70a1ec67eed33874eb24dc83dd1035fba5928f8f62ba1282907aa8935ae72fcb881b3277ee6bebda8fc75d6cd792677c25f70c87b11e094298b2d5f39904be211ff0980e5b83e8ea4a455622d8be9efdb5aa8466c88ea861407d54d98112faa10293af5e16974861dc9f83b45d21b112cc367894c421f5049e49dd205bd7c15e6a70bc810704e2e3a3659800864912527f8be743acdc474a26246a81fc2bdf669b9be7a2a0c986432e1e44b5675607e7e1ee2a8dcb72d8f1964272926e52f909ede0ac8daa32d1d850158db76b959e4d83c9da4e3bb23fd1f5b26463045d6cf13d187fe74a50c09a654d52d0e2f01d66b9f8b4f4aaf4c69fa62a02aa876f9bc4871aacd26a6c6ccfb9bea09cafbd0268b5b65d60aa23ff504d02fad4719698f8b044ca1bb037ea6af58a06a448080dfdbe6a5d698d5db9da5fb4aed04a46c8fa8b93153bca00a5bf8aab64d2b371d072db2ddb688a9442e948f0b99236828dc115a2fddfa2a29e2d4e02ff0173cf734efd4eb687e3f8712be82abe1fac4be0c1eddda090803fbdce41bccfb58c43038991ba1074b281a09bac5eba58a99a1a9678ba26f8f9e3c63ba095f02cd8f3b56aadc5de60477efbf3dcb54b854f651cc72042bf19268554c61b44f2f338a75de56c3c45b3ba40a697f5f21c4557380c777bcc91a151e5676c2a59606200bd476cf98d20b4cdc64bc3b8670810a014871be018bc32fe239e287cfe8a7cbcd1e8b55e08692ccfb4ef871cf797bc0b1fd7ec37931e35b6bc5d32bbe7ae77b9962c179f96436e4a32f566298d2235acf921e38c3f1942fb7674b65e222d17b95a2e58f072c63aa4bba1ce48c303f4bd24d84963f18c5e670015c52342dcdc9c0b348c7dfac721b568effe2bf2f2e816ca3279bbbed823beede8e12fc5bdccd0f1584deb1f6ea1875e9fb350919b675ccde0178bb83a4aa5232bd5e8e9a1b8daf905c6197367a0d106532297ef89f3bc690b48224592c768bd9c50a63d0881370d475081aef052b444744b33fd3fef674a37898fc950f887ed482d2a51ae615ef5b1dfa3a23257e6a6a319a4e2080b2c4094bb09e4b390d1fcbefc4d6c5dab620f8b05b1bd5d976300b007e2b8120ef8a6c9028b7d925c795058c6bdb6711fc5fc2476b9810d1d81bd24637537716edd3b7068b802c531531df710d3682f9865530e1ed51b3b56d860ba4e972bbc74662cdd1e2ea24f81bf469193afc02b14143a32e9556e3f2ecef97c65", + "2538d98b64b6aa9258f9141840a5abef66d6037a10356366a3a294719c10d6c148b04cac66f63ebff052d730f8821f5e5822d869573bcffbdd636c7973433abbf38767597da5186df8ef9df071bc4ecade2633366102313e659db8d8e0f293d379fa2df79f456497", + "a5049b0aa153e282457555bf6f82b60fc81aa6fd1c2ea3db031478ffb74b5b5d", + "350287a6bed5709dfba3d35c", + "849670914f5fe318eb01e8849e536374ec11e813acdbbe6a5e82a506f6aef4f916a3a7fb2e41db3adf990175e21f2386d1805af9bbc32a6ac156b13b1a9505958f68599019c4b7297314229c467114754277b10e9f49a4d12837ef24184629c8902ebe2a23f740dc826b01f8963d47100bf617b314835e436104eb207fa9a1079b8feba06d9369b9aa8222d38d87096b73678bc5db9a1add59394530e678b6ec93a80efc6e8320f2909e3e891306d69b016ade0d30cde64c2c903b401f9d01a29b5cb8619dc68ad6c21900b365a6b657f7d9ca4c145fe598a94eeea741e20a9329996b17aba5d7115c93623f2f5d6927068d0f190b49eb885429d771bbbb3980e9293e4d664a71c3cb629d869dc97e58fc3d328331b11df19a38d61e1705ec4c3d779168abe049e9d675337ff658e00d2d610c8f227d1341d1c41f1c01d8b5d83c4b1b30ae4318da9822f46402ee8cd5cfe9f3f22d90a5ec2d0aaa0baa85e10f5295cc6005c5a0887287b0c867a23da1a4c2196f91fe0bd4f0db1ab324c26fe6088d7583f3cd052b7f6fca38e8b21f98fd07fe78b7657da1f586f1fbd3d2b4079e20f21dccc0d269d53a29deb7c7fb63cc291d1d2c50ff163e08ce612310d3bd622f2416e193078ce4e1463f8a3490578af96ca98e665468281f1af9117a2ed23367df19b570885de9d6594f09aaba4090bdd1079720b08d54311793c97bbe14433b031c865b059cb4f75db74779b82c4f83eb4bd829c62eab995027b548063d7cab7d1a6f9642da6cf7181c0ac71594b97fc2c84b1768f81eb287091f63c76623c61e7ba90c922c74d46b9ae5d8094d9752bc1e8020a82601c356a201e0473d540053c707a88f4baad37826152dd245c4cee6b0019583c61e4327fdf6bdcae53584cdba8a503b835bfb5df9d649705fcc1f09376eec96c3da1e105accc1cbc21d90f527041a9beb85f8cbb1ee8db798838bb45374b741618f83b5d0801a3af2f640abdbe74ec3dc15d6711b4c1480aa8d6084defba82ed221ba359c9744705c4feee0955c27ef468cbb816694516f73fb541e0ad4ccf99ec8b67ef090505d1f7c4c3a8ed7e291c820261f12d92bbc6609da6c275349819848c9112826674f243acb9a29ab73f17c8f8af12c7437c11972c824f00db7ad284e51b9b508a925f0664bb259b4443d56463bffc9e5d845c9b9f79b24c1f457088fadd281f48238866e0b92d6253638eb188bbaa8bf6a81d2b1087904974752697cffb00b4ba05e5b7b842a3d2c0a743e4bd691625788fbe9df14600643b1d161bb2916176b6ee40aee38dbb594ec2735d41369ed3a0c6dd9073f1eb51d1b77eb9a967b53670a8ed755f3b2b73a6cb50a9e1ea7549346646dbe4b801c8aa642779d8761b6c2d2e1a9995e758ab92f07c4eb4a23c042171a4b354f434ced5f6d9ccd26cd6c2506e5023dc076ced15566fdabc7364f4a8594cd6ec404e1a9470f52a83052390e4f7789ade9179b069d9f84ca2c7ac9eea51035db817845aded7405bee90cbe92364c8c7cf8a366cbebd7a972438f2a9881395a8610a2cd0c06c46b60cdae5b1f473f4fd6ec48479cf35101656f05485198a470cd36af22838e7ba3e28863cd8ba7bbba7e3c2625c1106a6be44c9e3d9b9938679b26f0713c62c3757a2dc8b2d9eed5e652220a7711cd220bc91a9afd7c940dd8be71616ebb8b2cb0686dfa161c6ef56994a3cafaec5e79bd0a2531fd1c1a42771acb101a38988bcba51ad85bffcd8c67aebec5b37d526b29f7b9d31388e1e7ad7154f8e65516f0d80a30b88c2b868be2541d19ea1d2bcbadd30e2fbb1b4678bfef7f200e0f8309ac0701000c52ebbcd6fa00cb85c8d3ea9c5aceeb3adcf3773cfb3bfc9ac764d031d7c63ab888e9b03eb9fa74554dab4719d426d0875a508c8c86b22cabfeeb70b0f1461db4e5f639d2a2d28a089dbcc48e3f34394ff1acb887b89f75d3236c8143bb9b06273c3878744340ea1858a9f383f8bbdc259250e23a3c3992bf8b7ca7e1a66913547710402bb538a8866772d11cf4214060ed091d403e1c9ca3af75859259f88656a1cfecfdb49d57c193e60a2223627c681a2fbc7390140aeddc19df035a5207adde4f5736bc542bfdc943ae8b094f4a8701618688fadc2284fb423f602c41ad8ee11e5d9fdfa67fb7dc7d4dce7847d4875b3af667168ebb6082f6911c95", + }, + { + "67f0494a728fbfc84e2f4a043e121ee40f3b12b31616c78e157ed970db28674318b08d8b3f4c538d7b9d91b9b0b09ebfebb07201c6398fdbb8684c9390b3d6a8636333a3b086302b24c2e5d47283935d33065efa3fedd5f755218be5d4618d38c5c1db75470ba06bcd853f3f08d39c3cd9fa3618e70b103c2d9b2101fcaf39c1701436b720d723ed5c622d6535c9a10ec4d727abe237e80fd20911ceb84a90285fc6e07f9d036cfa65995f9b6300a927d7d0d2b907bac9d9c4daa87c2438a583fe85029c886f96ed08f5886bf53292cc0265850a1f4ee3e3288b604dc305d0c28ad35e1242f4ff4ae988b6deba48aabcad2fc6cd7eaab0a63510f3f915c4bb9f9719b1d90db123f639d9d4f3227eafcfad769c2b204dd2555dc54e738909122022c4f92f751d25aef6f9a1187750e825c68450e6d1223c2fe88aa27194b492b6788be6eda80b9b9f053cb77c8d9fa15324f23af5147624fc00c66e947b004bf38b31e1343c7cd341b98abe462a5f994e51d343664968624a2ed0dea9d0299d5c5a7e9097fa63d8b3ed96f917f693654766a9adb01110fa3fe0d8e9b102860d5c049df3fe00ccb2ed62ab05583e6aa0a5134d55245d4f643e274def29d3fc86d79979d599458786a8338b0071f6a01609ee6b2e4bba9289e2df780bb27491890d0b5ea650e62df819b8f98aae99a1b8870ce6d3c7785ca957d5b4094946925751f0fda1d62a9aefe3937a912c1b49b4272f87eea7e397feb84c0702929959e38a568460811e5064b1caf5dee53f920c6e19fb16fc9214b5de1cb770b510533f66d8a0e7f6f04ba8ba41869f8018abee31a6042d3919e217359988eaa9db2a10b3caf7aaba43527484d81304f0bef22165f74e9e1031b545ca3d2f74195984cc237b76ddbec85142a06446902339b1883000264031db85fb19b46f320ef3fe316f750f2d3d6070dec5b66ee8ef20701f20965f5171e44c8a99bcbca7afbbd81e30e74c6d48bc4b0d72baf562da6581fafbe14b6cc597f75e53b305036ede219ec56d0c0d29571a9c110ffeeb747fe56f6030dc26c8d3841b868a1ef56840932dad9f3bd7f75573086571f4d9f0d949510a2577d2f8fbed7e850c73ed4c071bf9a656d09dab43a610b49aeaa57333f67d586d4f50683dceee4942db9549f68eef4c5f8df8a2330857cdf2fc4025f2be7d5f0dcdc74a9cb593de91282787b716d416a3ccb8d6d40fa3c70be4ecfda26a5caf3724fad3d98db16ab6d8f26defc68392923b69664b0c2d56f01a549284b042bbd43c8faec940187f190aec08d06f9a62ab03c9f610f64c0010a0939451d5502511dfd3da1fec5a38f64640c7b6db2961def257eee9a3eff944828e9557deba68bd8e42dc7a9c1570e35537993061fa0f5351fd3cf4ec36386ec4cdc5a2882d5f16703b900c5000efa63888d69982e5ecd3e329c8cf5f003e23ce03c55631246ca15ffcadb0fc9d5634252ccda812ba7bf5e343c44244026512062a68374ed4d8add0855dcc22b30148e0cef0f2886be76bafabadf3ae1205b43c6deb8a41c338114895dd6b49deb329ada31b350e02a1bdad4eb05b61b50f9d22fa2863bd607406f552713e302467ddc78213d584b4933202438d63f99d011b97297f5589f35b7e45ccbd76f02453b7a7668c2b1a1f5d1d63eb805c8881771faaf67433eacfb22f9b6fa58b93f9423a5fcf667aeec39751ae17ad36992556431bca77059a29353598dac12bd3036633d2ccadc18f44123e5bc074f4e5ca380095af062fd83b647015259be929011cfbcdc9bc5d0dcf9b688f0f5d74da95746f447a9e1cb5028ccb2827b45129d04cf6990953a6d8ee0e67fe6bdbd8004f4744cae5607fe7ec4a0f14fe603dcead3367b6870d8e751cf57387d04b881f92cce9772d695f19b36e2db2cf6a807c9ee83225f5c09a11b50e99855921a4eced8e631af7c234aa31615c00ccdd7c6ac5ae8fba6e29cc233765a891864c7d73dae08ed1a3c27cd423d8d4efb550597afee8356c12018f496637daec83575f5e38ed2fdbafabafd38483c239d31cb4d104e93d16eacc6050033a3c86929be4ca8914a538bf540b43d7ce7daaea317bee1ab80504846554879f900d312bf2fbb406a0edc5f4f809cbc68675b0b7f09fd1a8a4d52c0929b3a8b9c1dae4b3d599b976867e6a7e8736450dabf5c49c949544386a71419324ea4ce5c4319899ca510f50d07ace57b013655b0929f79dbf3cd629ad17bdd10109b7c53a4f5f04a16e5471e823c898362df43f57ebdd1627b33fd4cafca6cc065d9140acf0454d5f99be47bc87e0f3b4d4320bbf0f21e7c261bb8d5d615963beeaa46bdbe9b83a8277813ffe6132b23564bef5", + "74dfdc364097c39ef91c01b707a522e28edb1c11529d5050ff820234e6c0295aa00591e09d547e9671804d7825705ab44b76c59d1315ed1297ef477db070d85076693013bdafa92e2ff6a654660008b176cd4e8ae23b9c792be3f7db54cf2bca385bddf50a8624397cca8ee3cb96944164e3cb461e68", + "b3b5ccd7ef49a27d2c6d13c0ae77a37abec2e27e0b2d3530cdbb7f36792a7d2c", + "c0494bb7249f864f69beab46", + "ed8d6e964bcde1df68e7f362243073941fd68ac77929c8e480c89f519f748b3dc337b1af6231632c975167a8425b174b42c2c60dfc0ec85a0a212bf5c9aada818a83f9664c8712d96de1036b5e5d8c8298786b753638de3a8da958549f16eb9c723355cdf7b999aac464ec39df7d6c1607e81b88b63043d1c847dab618f1b19336911b4b0145c2a694e61db71e021282006d48e37f10f3b6314dd012a07618228532c28ca84a936e0eff83723d117b2f2db857d14af5bbd5948a0e53018b31e57cc2a81f36aa013a844990753ccb347fe98fab294cbd252a8b8f7246276275d2780511fd3cb7baa2fd1548184f968c422230f7ad73ae9dde91295f79f6b799e7d234dfd6573fee6d6ae748b0a8cd7ed4862ebd957390826f276c2afb01fbb4b64b61a1bfc138508efd630e77580867bdc1e96a48a694cf0db6c2a11f05dd0bc8769e7200bb0749f5798b6f3559de55d0c281eb5df22b731fbbc109da9c68f209b888e61240c4c0ca006d105c0a7f43144021547d3316e5a99f6c429f9ea2f17d77dc68bc9d5125b6260f79bc8b3b8061972e6757d87b6544f21645c0b4debe5224f7c48142c09f35b8e144c0c1e6521f04c170519ff744d61abd59a56d25a26c5ed5972191b25e78e2140f3ce68fe17be9e59a79f6c69619a79b83614c670c7736d19c27fd22515fb5b896a6418cc0b4850e85c07b38b995cffafd9f69763cbbcfa9d1bbea6868244a66a5cc82e815fae09f5775d28437634926d571c2b0d200855e09cbdc67d10f85bd4cc334ded4c83aeea57f8e373a950f135997666b653e8de47a3bc0059525720045996bff500a47baeec97808fe971d7693dfde339e8beca3598fbc053121536c30d0af10f8f5d8e5eeaaaa9586d7abb563fd69e88351f93bcc46520f6d97c1a49ba9f8f6a25cdcfc11b2a722910aabe7435ac8f0dcda9f824fdde80850f21a2d4bcbfd2e9fcbd14dec05c117a9796db49e2f0dc55e74c7f0f615bd049fa7d0bfcf197dcda3ef3de90762e6f6f9f8a8936bd04fcf2a97cf18ecc8f2f118ffbf02b67f252097e4289d02f264161f6f90f79e1e1ef8414b01a9e1a77b88c039ad6eda6df1e28fcfe9370f0d574aa9e857dcebb19eb7ce8af9b19b4481c9fb3e1f0db3b02af483f737ce3ea824b2165e7c0fca8585383d4b0a16eab2c7e3ee5c038f939a97bc8e1c093cc5372ee45d81836c988f3ab3e6ee0e5f9549e4b7bc381a2afac2074cf75ed56b0e757e7966cb253d549fb0902da98294c6dd4de3c2e166b7e45098d2729b1393deb68471d4d3218dea3dfd0183b654ae4092a79357945eea4b28cfd06b40d30d1b4b8f19827895f6f908f0fe511f74ec84cbab2483ca4bdfc6ef50178eabad79b18b58529c9328c13c52c2869858cc20ec36ef7717e1c743d13f9607bbdb0b701d9df6aca7366814e883d23e51ee5b0f20ef70e2c4134ab037d213315fddc89009260981329a1872e541767adbd5ee9501e7df4ef0cdfae9769961f8716ee7dfbab0ec89b3f62e987387d5842e124a69b07245d359052ada50cfd67472d27ce2c4eacb5421b62dd7331da54ebf0989803797f4c8c781d0e2e6477b421c7d5cefc8146aacc0012af3f1f7cd71ce2b1045d86bf48c9a13fe469a1865294e160b4975023d0eb24ed26837afefc250a914f86f8b1f5d67d65e9737e841519148d4dd5dbf2b5a8b073861288ec9793d4b113d71c01727f67d791852fc3946dc912d60fc66bffccf4c45d859eed9f0bfc7f89086df5d5cd830ac919aa7cdb4504018052d67f6a3ca012ed69187cd5fbe91875cfade381bff1e804ba59cd59f0f75cb46dcfba234ab9832c3fb9aa8dde19fc1fb30677ac1793a38d94aefd9ffcd4e777e9e4f6d49e0cdac6c16a36bc2f3ed8e23b80350e3be6d866aaafbc8cbf7c69fe44c2aa80651164803150c23ebe262aa669c77ca94d215895d2ee9c3e325a0bf2c61e419a41e0f7b1ba8ee0508307d49301abccd5b74c054b6c7bd1aa67cffeafee033761d8226d9dbd7214b130a867764062cf4da685deefa23693b8549d5ef5e53df85c19bfb3c43c6bd073e7a836f849587a4747e1a9a3c7194f6d5472d2e3e4c81784a3061fc9bd3b94862c4784974d859134369486f2651f1db94f511c6f59f41da0d75307191602730b88e4e6101fc8d392c87687f3be454dd92fb8ec380715bcd88aadb63717cbce4db91a36821a572c363759d8d0a2ab007e5981b78731dfdea20d900b14f0c5ee6a4a9b532ed2134e6edb4dc267f001cb88dbe43aac4aad453b839d035697df7de98ca7a9ee7601228a79004b89796e9ab971aeb8e62c789bb21f38b77b492c57db402bf6a42ad0cee169e9251d865ea3e5f79b1801ef1e53797aa6c7060d6f9486081", + }, + { + "04cf92a64cbe135f7fc1d7223b95e41d13f04b482018039f4e7ccacba8aa15ac79a752c5666524e527fb076290ec80a3dccbebfce3ee9b316a65fd130f12bf88b9124d1f7772049e6d0c01fef881a1d44c8dd02f7b6b60e6d15df9e06fb86929cab64842284de09659e19451623525aec2f5dd3e603e24319b1d120bd57b34a0317ce25ac9c2f022a4847306b998b57c8d92baeed0de1f6cfb3177d0acab70de275238f1152813b9ac87bf651f74e1ad079b9bd779ba4374ecba459865b5768d08ae7e1dd691d6821895e8380ac9e5116580e8de3a2c5326e698bf4c4d35d955e45772bae8483d01de2539e8ee1ef9539ee132d80d85fff41dbe406af319c0d7703292587bcf5959f49241e2b03a364e1b682729ed261d0ae45d74d77634afe667413ee210983b042a7ce6dbb61c29d18450fa7176177b5a74f032ea24e1d08b220f6d32a7a836d1241cacda39d6acbd26a62f9dbeaaf7329a291dbf0aed4a2cfcb85ea360947585b1215feaf70ba71eb2d6bb7081b2a21bdcbfdae6ad2513a9dd714d3d06c2c2b7e322a1db2d48f9df1fb44fa066f2bb42b196295ebb3c0898ad55d5b317986afaba0bd5e754cec773821613e908ce2bba6454181f9020b73e758df18c255c87df675cc6bb2b8d2eada44196ac10c26674167f94a79f4be515d8d6a1fd3228dc9a85a355b030845dd4c5f481d5b6e74acc66de730629581b022fbcff61e5dcfb6a7f511aafd577849a6b057021ecbaee53986159c1ba74c3e930c34a159f467f1e9799cd6c1151067c56769e43308c96c8edef8aa7634d909310dba9af2128cdb8c29b24d3ec2a4f43a1ed86d1791c9a670b240e6e719f01827aaa319bd3ff53959a776886a1b7c942a54f141e6bae8576d294e44333e6c5ad90f74863f69bf890126016b318e0f6bd2f0adb9bb861118af5f6cd28dc93d56c8a1dd080b8c810ca29267d410673fe367dd9d1353ae2bf2fd88d57b4202c21aa49f12a01b93acbe260492367bc219d3afb6e6f35502f6529bcbcdddce9fe8632efb034a9eaff8b4a48afb105d04e3fcbbcae010ddd6636992213750b12fb3e01ab72aa957136e0bae591bfb5e0fe819cac82a98ae8df230af399160594540640c6b1d537e7b5f1cc47b08127ae02c35b846de56c4c08773fa18d4436e14b76a7fc4bdee301d0af4880306f2f33328ab79f6f24ec779b2b1928704f09bbc5b0b7108e9a115e4959df79c80eacfb98649a0788867e23b2974b22e654ddab0494bc922ecdf17727d0f0efde9dea7601857d890bfbacbd93f7df794bbc254f50e1e17eaed2f5d5a2e6c58083aff68434730d406fb9fd02b0dd7bfb99a04aea812b6830fe5e05a044ca21c77a174bae8b58eefa11ecfcc1c977bc6218064c9931b5c92f13cfd05799f11e130869c293c1b08dd29c899365014fc8195514b286c97cb6dc4b8633e47751f87fbaba137b6aa04d072ae06c2b2f34448449f60b1272c1efbd4722a2be749a3d2e5450aabef1f7c51bd8324607668a8caf8097c2f358b1b09fd3525d47ec9a7640eb20ffdc17c4f7eff63df75dc7830c471ace3a727feb11533d6e9a2a08106af33069cf482ec63724032e81cab18e12cb5c4c3ddc374e2f75bcc99fc5da09b80a738852a14e8ac552b8471c6ad52e35317b730db2c13c277e06c643e0d0fbea43833de4d2c7a9247ff040e9c56f1ff7ea92049c5341c4d1478a14275a10119d934e8165152b89951bca7ee1399dd8232fdcbf831d8354640e698b68799d060ceb877201b2fb96cec514affeb28721e163e1648164b9e5722271db9b0ee1a7f96819fa1b1590e9daa598d9571ffa3882db9d034056e9b2785a8d13686eba61d7d45cf2e9ecdbc391739ce89297211472be18b21401658c5bf29fc3615924382d802a166d05dafe7876e70a0d081e80c63632da379766928a0555eb5e7a238cfa4da267527c66caf34dd40055f2801b29b3f5604a5bf3d46048bfbec2e24abd2fed2481698a4b5cd71f5d2c12dd473b903c9bdb978eaff7d76fb69951005681ed7b0257054eb3dd6d10097fee51ba7e8d565925e4091cbb78d255c9d3ab4ac0264d172c9bcb0908db1288c9634248f198a1167daa323822058decd83936985f83b08b1e7b942756a7af200af168fb8a091107b4443fd649cdc22106f9b9657c69f19be485c23b2c715b3762c332eccc44f380883357d10019f20612ab6b8f155c2af9e2ec340e5d8f45bf5278ac1fbc9f9f44d2f615d21007d822b244b1c7a0dbc182c7f5912485d6e4d74e90f60a2f964e028c63d49c6aadbf1df170e4914ca514139ba538207b1cf7caaceed4db8423dd1086b2adf15f6c0e50dcf2e12898f53c339a745316904ae03c38b417bcd7f5cd5ea77a4f06e65d56c24f37ebe72d271ac79b6ddd2bb8bd67f0727ead49737aa71af4f620da53769ca3ae878adbaea5a249128074ca3ddbbbaf5a68f9cde2a0e8d69708b0ea7f4c8d2dd4180882bdaacccf2a409a681c551776bd10439fb12b7548342532b371c0e045d8e8c895929464bdd4fe25f0533c66104daaaffed52446094978bcbb389c", + "001084c8a5175c0ad43108f9215c35886c82321c800740c6118a3fcd45776a4588ee0e2d056a37d99b40d2bd9c0845088a77240b7e65d18fef105d3488c77910b5873dbbf275948db5", + "d614d2e671066e387f7eee07bca9f9313d86e6a4d1371360900d670e11ecf1e7", + "674a516f8f59f9067e0485e3", + "1ee376e9e3c89b2147bcf75480ff0dec1d0e8cd45ba812f34c84124871d484b4ca87bfc8cf99f85ad452c482933801426e2737a97468809fa36caebebe8eed07a626b3bc3614ef1ceb54f9221ecb16f413f0bd9ed4b3010c40632f05223484af7bf5948c2fb8a3d2ce04c53e3f2682494f3969a0f8eb738cf93c0141799c9e6b68924433f0326991e19626bb19e6fbb5dd46baf39f92e830f9b1ff465a007f031891fb1f1799cc122d3ae7a55624356b5297bd5d948d9ff2e414cd8adf00a53524df43f398938d33c93b2c06bcde2679566c0a7b0177b4a873f35874739d550712d5cfe3d25c19292ba97c01d84224738bb25546e5c252fe5e5f260ca881aaf176a271a6fca2edbb2cf23ae6d4c56c20daadadb8205c2e33881867cd67ae6e59132edccc3601f014b744ff8eb6aef5e09b358607695d3af42ab8fa30e9fdf99ce54427ba9da3699de19f7a8f9be368df47ff0607601a91e7a5fa6e72be50bb32b825427cdeda3972a18a23af290986cde14f5fb9cbddad336f5efcd2d7a0cf3d5b23e54b702352fd5ee52d7e3479441497d56e17d5868574c56cfc421ee47bb00e9c75b84262a1b9e2cbfcccfed9c4c386ef0d2c1be9a7b7556909b5d72a38b7258acdd624de2396c75386e077c34f005f92a2203c82d1072c8998f03b1df22de832ac733977705453b1d72336b8d371cf1ed3923f462ecd22075de5df68c83ab1e6648ede7fd5ee5794a744abcb32af73bcb182cf97d36f37c15535c4107b7c8f2321f9fe0e2b6ccbe74204df3d748c05bc1e0e2c55ae1aee2d4aa4a52e98ca7229d6d06576196ac8e4b14a9ce807075cdc876aaf904c9962741efa8c6caf41e6b87b2ecd6636e2e58f3ecf576e5d8b895162545e618960ff6e336ff17eacd5a1eb335001633fa78c41ed05466d904ef9b81b643a043298c0e291a085e4e67da72e329adfccc407f800709865147db49cbdf4232073b7bc7ad89b3dd901d927ee08ae6497e0f2f9d052ca8d7444d2e2ae2197f930a7b1c8af38d8739ad298464169823684612cb628c484f710cf9c552551b6837b575a43275100bf800b7a3d777adc44d07f67cee5000422b9049dcfbedfccded0f2aa4d189621579b01e3fdaedc4d772dcc593316ca85e7aa248d219dac21c561d318a4936ac0d3bd5c75311486c174e0e2182affdf69bdd6a086534e4a602efba2b9363beeb5346539b45336cbaf479da6b15b226a9ac026482216dedb84ae3443b306820d9f05f78dca7090d727c7481d82c6e5df80e189e24e46f5758e453e542bd91a58eb51a89e07c50afb543c6b998704432e863dc4c0d0236e0672835a7b0b64e14f5ced2904e54da4287597f920bb4d542c35d3b0271cf0eec055656d523d7d2cbd667445d3e8634854f8616b7d7a7f3e14fd32651e9df40e1daedfdff1371f16d5549ed5646adf2d417e4b3a4d145bbe0974ab388c2716861a08296b862e4fd035163281457877eff89dadb160eb2b780414435784804bf4fd36602699d8c2f6a8cbcb509198c38e2df2edaae7bd7c93313ca98a9c2d24419a12ce35b0b3d68c18840e3ff8739d70969927c7db9a6569787bdedf5c99948a9e79b2302a83a71159f4c789b3b3f05f1e574f8a24c899ae3457f8e73f9bd86976fbddd83b1af337eb8da4c0dbac3792921597e18a2fd3a0ac89a270794529d370d36bb6dc7452e754e903781cbf57c8646b92d5d02842e7df229b3d721f9b981f9d61a48f00e53948a5dbc4f739849609d94aba3e3f5f8163d40321576cb8eb8e89953b608a01184d41aafc13f40c47b12240e3ad49413473c26b6843f4514be221c2af632d1a54cba230457f23f00b2608485c381ae03b389ad0a1671fb416de4659cc7f7a9c4b6d9807789c307d061fcf613b96a2d79e5e3e20b863c8b1b75f35c982b40ac8dcb7d2712ef7df94901facef783e8015a9a48574aa6f0cfb0bf6c1a3409028f8d62137c347f5a35ad6a3cd60d71aeb29bae56bb4590f69226fb4e08fab7a9f41e58f4d5784540a70e7a97720c549c8440b089eabd0eb3e4d37a2e54b1160572ce568f4256dd244decec31fec555017ebf488e878945383750eff26a8a1cca73e7d6f52d8cb229d5603360a3bffec23029ee34145c4aade82d486758e0aea9e1b7bf0b4bfbd4fcc96aab66a27fb463b48c6a6c5c5a60253e2fbc5716ef55629277a5f3b89c300e21bf1226241ce0d587fe3f5b11e47f35614169dcfaa375ee1aa589be33a4363765368f5666d155cf72e851d426fa67b982aac4dbbc29356d71deb0715b34e00b9fd8876bbb09ca0701b15615f05cc45e128b3864b26003e6ffe801c4e27402f37b8997e0c29ebc273dc03358cd22fdb68d9cd3b56ff8248a727c2d4ac65acda4d0e0f511bc07ab06cefcf444f1002c151b953d7f7b19695668a86683497c2a2d2e69f19a4997148d2e8d158da859c8f44437d9ce9db92f84a88e89cbffc74c0ef4295088e2543a4f7c6ae9c908bd987bcfd7a074f83ffaf3888bd7f430dc5a5bb70d223c21b1bcd8bff2103408460df864dcc168486f6a66d67ded366c6e10f50bcddada93627cda711764a57ec36035ebc", + }, + { + "ce72c93caa49bb9850774149a87fcf8e23a0c53701554468645554553d54190bc6e247712b02097b794bc421ca94afed34742435ca689d2ebef183fb469c060c7f4d7daa508726c9d2eaeb9c7e9a89b30faee8d9168607d4778acfbd27d5caa623475073ce763ca061273cdfc2c692d1747baa8a01b15f783b2e36620400082747599a16cfd6b630fef310c0b9a2912d1d3bb71eec16972745cd8a49cd927014eb0a2abbe0e1ebded4fb9e8d9e2fbabb6a71da5688717ecd3e08160b9a861f86904a41702b2c4fff28ed8cc61d468187b75bde3fcc5c0c0a642215fea83584387fc5a9aaf2f8a91ae535e0027b618a32bd687289c47e9428a1a92649deab825d702b076223b07c08e55c0b60be95937bfd0504c18398e924420f6e20baf07e2b1b858d3e360a461b66517c24e60f9fe314a4a4973c8dbc7e9d2a9f571a1d8235a21073d81ab9f4800b70a5f17f44d593e8792a2507e6a3a41042fb2a5f7e5f028ed2daa88cce28973ecd88bd125d50fad77b1fde61c38272057d9c65fbfc6789ce41315a105af14e277a0c39d75c34aed7538c39160eab1c8c47818743e8111229426c399c5e88c4d894fdaff0315ec885ea019bf9acb785f3380c37201d494a60b583fc130bc0eb9fbe9b90eff95874e35910dc05c761f8006e2f208b786aeb2eeee841f9a82d9966c82956c181caa4dada81dfa2e2d7a25007c2dc7f2dc7ad1bafef14581cadbee4d614a557df4931b9ca105bade8fdfdefc0d96eeda11c08500b1ca827ca670ba07bb0f85af92914c43a6f71226d6e112d487f1ae99b2239a63ee2cd0849d8a9c488a11f82ca334604a2b7260f25373c6db75656527890f9b772c6bfbb9f687f27099ea9d4d1efd874a6ff83cc36c039ed1690408f20394692ff054d9e6eccc6776b6f4b3c5f24b0052334d159f40b470a9b8799bbc0df4dbfe59a5e536624cad193160ef23abef85df2c9b6e6d4fdf16f848a2a446a77044f1162a278866c491982570cbc16041908cdd0efa2cde011526a3c96d4b39a23c5fcc53d8232869cb4dea871f4ac8afc795aeb1b28cb2d7a3669100a1cab2ee1a7f31e2a25a5c6da836e4b771ad57393305faf582adcd26045e26b618d9943358c615fb206258c8993d700adac7440dcd3ef34fdcb065e10e9c9727662b5abee160aa01d2f2ca6c203a76fb01bb08cee9fc1eb6bc7497bb012ed2774a2d263b9dd03d60c307ccf33233ee33eee702c8e3118f9f86174a97462d0e804a24bbd7f4f938c7f105bb23399967288069e1637b60f2f1883d88ce5a874ea4bc0a7ca0f3b568e4bb1407e4bd6f0d3dc8fe91345f8435d7b1be961c45e4b0f1ef2d92d2d30bb78e1fbf72cd2e7ffae76e8c2bce005195c2003bde46108f37ffacdac28fd67a0de62970b347f0ae3f5f3a5b1d3aacb2fcaceecaf2ff4a2aeef6f5a176cc1b74b234f5658ce603bc353e075278a4056540e43033d37a6eb2615453d8206f5cd294423811283bcd5d79c4afe268a547b98977ed5cf24c0f53a0533bc0b2889356cacb67e2f7353060f9e04362859b1c1f02f96bf5457b58e5ce84a6810d39d7c7f53faaec64db5d6ebb90c1412bdd503ec6bc240c277ce1f5f18876feb24eb6a77e5193e33ce141e8720329add079dc9735f0a35d7d85436f1dba6dcff9147777760b5aa2ec9c8b5e9fb4fc602ec8f754c99ab2372ff5963dbff3fda91865108e606b214cf7acab875197e78060eed52a798751998ce7c73cebc4d5f429f6729a5193d7593072d0921ac8127ba6e796107ee7b9fbcf7128ab35fe9f6fe501fa4695c19fd64460685f287acacf5250efc13899bcf80ad5a340d432a0b9449affda5c8fa090f008e01873aae7d5fbc7972451542c5c29cf9cfdf23db736c8a7112536b1b626caa63f3e4117044cdeab612fff8d8c194d19174f56ce761f6587349c48fab30390f231d209461ee7e18007d10d83ea5aacf199f3b00003259747b1d03274d3c3670595604bb4482d345ffe31d3e88c70da16649a2677bfbdbf618de1d651a53d573aada2eee5c01335ce5519a6d18a70f7ff0b1e66bacc162c49f7f29b9d3fe2c7dd85b6b355c9f9141f02baf08d2be87c36f6d2e1b2e90dfcd100886e306b360df0ecb146a6aa5ac5ad05b63a219ea65885894a386248254348ada17908d776f9b438306ad28b208f80d6b9b265500aead945134b9d388ed5d6205edf07c5d8bbfe0916d0943750150e09c76359d24e3317517ea489fd8a501dd93f159f07d19d00e86d952fbdba2db771910143df346b30a30fba908a1abe5349c3f241958f428dece7ad9a91cb42035c43573b87b26c2ab216cb4c21799f6b3d81acd300ff50edd6fe7868b9ba6c160db3418565ada027b46b63e5d4f3411284fde585ed3673b424ec1cdea678e4a43c262991c3c9b988351d6e0a10af1c959cf21b7a288f2e4d7b3b2c11b400b5e036df71fa993b72ce48d0d8598fe4ef1ce70a970f89b55cf4f07906a479bc84a08bf6ab25221de37afebbc47ea0b38b87be128737d7d43cc84d336cc6ffe1677bd802910a2084751f30398dd0ed09589b2befd2f3b40fbc013318c822fa2faec2323fcc52b43161f47aefc557e92df3050dc5f8b1c5a4b2f8bd7b2ba7aaca79dcfa362fbe7781a2e261683a4a862d5f83e34845a8fcf8a1aa73cd521e87cbeb71f20b20698cc34bee3b8628b1a3784596c", + "08b3fbd73d157e79ea9f61665d19867dcb8c1598c1d37b793606936d8aecd992a0d46addeae857d488b83be5d1c1639d4d78350e4cb08782b61bef4107c9d3a79d3d85", + "a56f38b4bbe83b3d9e562cdf5ef5b30593f08a1a166676c4fb0d5861654e640b", + "8726dc5cae9497936658f603", + "88420357d1ad70e7c7bfd55b3cfd4bf06cd4e9b4ed5cba681045199a06985956d35fe86b28b9a4599964930d05d230a23c55a6a152f67082a453fc31f68489df05c553f9ae5cdb3f611445db384d79af865e52440a876fc4153d896b7a2318dbc2a4495ecdbb2e9dc68022326d35289e82aa55197aedc266dd91ba3018c7b474ba22b4e773773f3e9890ea84bc16a6b235e4bb69e785c40c1adc15b0e0ef03aa147b0d14e62341e27398b84a53f72c9199cc1c94cbcad2bd31aa69c96b06d01775b8c0f80278a43f526664bdd430164863c9c9140ad87798a5b8f38dfe90d37f54d1137709d5311136b728e6c799da244294daa4c8b44bfb0acc603a16c088a081129a0d2cff55ce1c4ccb486fa0ecc3098ef2196f47c49f9d253112bd5746fd99df5d2be577617dc2519c0ad04ee49ee1d7be3d50492017108fffc9a414ea227af39fe49fb2c895fcf00d927bf4a2d78c466fd44df4768e6775d39fa5c834b60979ca27ee9f00faf37a090838f56275a894ddadd265a8d2de74265e4d8d286639ce8f01eccd4f551cf6b4429eae3f08902b6ce6ef422cf91ce8946d9403fe8064784895b62a7f5df76ea294132c59da6b9f53d4195c1e9000bec499c14cf8bad460aebb024a76ac50616f0dcda71c0f56dd3239b11764f3ed6ed06c049b2ad673e4beea391dbb854fde1f01b1900858b9809259f3906b34f95a1c6ce8d24fdf0cf7c2ab7bde2202a7f1482baa6e51caaccef9f541c377da620bfbc63955cae0e6644ec8ed6878f704f1dea30d6b50d4291892bad19b0234582d50c6cc0b4165322cff24a9dc2ce1be35be0fdb3bb7abb777ff0b2f4cf16277388af5a89220d59f1f45ee9cc2a0fd7af9aa8e9e8d548fd65be4e47e7f8ef58f7701f93a42e7ff78f70e807fb63513157fcba96ad9731b2e8f80da85ef407d5c368ad16f0657620bfc122ba1b10d7ac2bf46d8133a9c6fec1fe04882f3d5765da8f825e1984a4313f72b67d806ed45c000dd3ddedd524d474b9b5788547d0712e8edb4c6c586d0cdf8f2384f1e093a7f6dffea6e79df9cb9398f5d0b9a7cbd63d489430fbfa397a0d03ef916b7702f33a54ebab84a7055b7ec6179b0ab7722f03e126ed343b1cdf2af3763df7e3a070162535514b01ad86c6cb051859aba1cc4766b12c8cd57b73fdd3c65af6961c45395aa7b885dd59e115db885f644e1c94bfa26b3804f767601c86e2c7dcecd4daa59955e6a40991a4b4701e63fc82b46dc0ccf59af40a8583171375551c868436ede535705f2e6380c5899cddfcaf9e94314794bab98846cd5ba9e9afbdbe1ea7fec5e22e7b2aae59fa598f4d6c0cc6f936a616e11bf01a2acc891cbfa2bc53c511a8a3a3da2e3aa5907d123ab2a4a3c0009fdb5235a3c33718fe4c504e1539abac6370e06150c402b5fc2f8c32608db4ce2eca9d1e4b96371ee195f6cd632f5b972385f9d5d357b87c78cb4e2c27aa9851534de14de923543f5fd9d55e34d6e8b7e1f3f2735df80046de01f79d0321066f9bbd76299c7386d285f7bf4ac15e033e89a040710c90f87aacc09fb8159f93c8b4860247eef079e32d05707e88aac734a2eadaa853f528d9986e0af3435b5c5f44ddfdab9b0c9ab3eea97676e920f80d1794740067f9b229fb018c804e595aa997533a5e967cb79ee58eea18995a90ac08333f1c69600b17ef4f454f540dbfa8b502457761bc4daa876d9053ae1f55001b6916ce559dc6268d01841255990e56614e6f4ee4ce04472dff0657360d75da4e83a71c852a2585110e53137e91bd89d64d99b5614ab2a5691c876f15d9931b092fc6729c0732db5cc40f966fe440ff99d7d05b24a872f552c27fb0cf2af443340b153214b407fb9ca3750d9c157aa75763b0b7600959663889d00f392d6ebc12835bd2f03ad802a21d0228f1d2e9731d0f0051eb2d5369ab790d1134c38e28d2bc2d5d57d6d897244742c176559961a1e40c84ee5c8225c8d72b92352a011e3785c262aac115cafccc2fe1b5e81a677a0220f207ebadd786b93f58e40eb6ade68ddda5b66c5f0f6b4b95cdb8241156110ba3303beb79acbd54423315768bb43b4fe8c4a465e50c4e63bce272c4d731ea4c797e14b2de31ce4264e2479179b906f67af4a23c56e817abafedc2c7a65aa45f0c89fcd0baba60561a8d013e2d5e0bdf9fbcc1346d3edb20e6e9f9c410982e1ac43039ad8fd0ebd453a6788376951fc20374b59946a6803498929d9fdf2e0f5e58c441329a79d1232e957b3a9ed17231c663b4819dcb6b4e33d205edaeb7d7ec466930bd84a064b40aa67fd76f6ca005408062b45b5aed6f8161836c7160a8c8313dc9aa1c6d42c2c16972a1065e41aea9c58db7916e1670cb42a8b54d85498561b4401761506860b19b446655f8988101fb4c45067e30edc3f00df8d88ee34111dd6626d605d993ff207be09704fd8dc242ce514bae77cecd20f10d4a38435a3f5e545882fdc224586a04ca6a162e118d23716240fa67892b78faf98a17916471f7f121fb9f85497a0b34bf5aaa4ee1ed8a4681bec55d1b4973d4368600115bea70f20a37c9e942b87f6cd1e2ab70fd401e703e3c8334c75fc338508e06d6370779578fbe737a75954b4701bfd92028ec32d3d7ae606caaf9f049d9774f70efa707c1c1174d9fcb5b0a0ae2a961c6f58e48ba82c2db14ebbbdc24288e42879f547b855c86dea9a3b9877e4b105515bd78cc43465", + }, + { + "bf7884fab52251e202afd7b5b46aa53f85bca5fb80a009d8016e276579e401385d853312a884f4aa33cc5fe7360426bbc0ccb7416cc0196e2e40d3a825d5e0825a1394029789acca550bb28b10d847d0a4fe1111be2b7fec6b5294902775128288a784203031ea853c9c104c75571d19552e2a1359a900c5fc9455230968a5920f2ab23f5b9cc49739d4e4ae2c01c7812ff295899b954e9729a3bb330b60c51a8a7759e5131d7d4cf261fa1e62c29f91b4341a4fc968e7f30ca2261702eb328d628b7275a9efc29b50bcb9b27e5844328d5e8256c76949d30b6fea0d5a1c9abca80d3251fcf4ec4db0a5ff2ffd43618aa2e3e1694c2a3c579a2665f443ffb1eb0ce33c09d7285687cd55b6ca9918553bfb36a44860e09ffa0604ef4904a034108370195a986fe165c598305eb08599abbb3df31b1d93162397056d9ba5a1ac2812c582aa356310fafb4058abc5f157802e4a9b4bddb16e75b6db105b7dbc838f820539b76949b1648909104efa67ce28b16a738f1be104d2bd142d3ad1b1c953b6020a1f4cbb84d5c49424befbf2e6ac5c593b783a3f4af75477312528fa78dffd82fe493d821e011642bf1135a5be91fef909383953308dcb61b2f35c2ad259acd1a2e953c0ea6a03a97b384e39c94c33d3846c26b4f9f116abe572d5b7cb81886d6adc2d544630fdc1684bfb32972e051b9a2bd0931de63e025813b923944290fe1ebd5264ee4f25569a2088314e8d4ce8b91c7bd602b9d85acc917d60d30d5ef1cbb055b9ff7b0f999b98caea2517d2de334eb436078c90d41e0e34f11b93e3e643389f43b3afdc4f47a7396cbe0b4bf159ff27618cb835aac6699be1fc7ec840b767836a165fb95d06f2cac4fe15b65714ddb8a095ed4a5b57e63d536405931b6c168683763fe07c32aa4130bff787d4d440746a2dbfc584a502d809076b257482abf7f8ead7741c82b54c41acd41581148aeb4149b0c6eeb39ef7ba091c2e8bc72583b2fdf8ce7fad1bc05aefd6db0360c644a9760a9729a88ee4b2ab123d7238c12435b9f3b4660e74c0fd4a9b00aa614453d84fea01f779e5a924f8e79630a8bb6561ae19c7bc8d88b9d823b98285fdd65d4cc05e443944ed5d3cd4f46c7cafd1dd5deaa519772dd24f508bd2d588a832d5689119a2d506ff11dbf37d57a24e35ff38da18af07eaff5775d12dfe795fd3e1f0ec83c5f283d6cd76532519a15a18d93431893b1b88929159bf8fd21f62b30f4e37d540baab0e30ff3349a08d627ac19303fcae8b8e3fe44eceb66d30697c7ea051bf5afdcd8bfc00d49c8d36164ec9194a78a4d8b78826863e93b6a810354861f4a35ec12e5ac102f74e390d9c0227e67acbbe3254e5b892786e3a88a383ea9726485854a319569a678fa70392cee90c9aa83eee8df6800565bb8e083e78a064c0f8b863120efd799ea57d3073663c0d0e7bfb9b717ca1d6372fdf75a77fd9677791cb899fc8033d6d806de1e6aaeef525ea909666316d9d604c1207cbeb6f427c3acc1b02cf59704fc65135703f2a9529bb2c8fec992c4de53e54b029c3f2a5fdbec1008d1a70dce0c11251003ce62af712b9e4abe631902485404e4933f346f1b4467fceb65baf776d0078aae6a2a1f95b85a441b635663c75b485a8a7cb9a5c12192ac874d940e2d9b88cc05a2db9b5b35df769925da508112ab0b8f64a1408633fd0d81810baf2c846b222736bd826c8cf905b2c35633d6013f5565e0a5ec1492e99613f53530799052a0d70023339d1c394fdf9f73a590a2faf68390d2a823bc3e47a173782b03dacbdadaef1e67fb47a7cad71b6067ce5b5e41fc20ea1fed28578e9bdfa99faa657a754488ed3fc084faa7a05b0f6eb66da0a28e9ab26bb319fa4ee993de840948f94dc1d68d926b783a0bd3396a89970b2c2595de8148e87b87c21f664618af4f567115d403715c3d7d2f66d7a90de2c5237893a4c18c20494e3faf94485ed39ecfe972c36acef0d7ee57bf8755924c790ad02dcc5c4e15aa7db53eb6040244c3ebb7874676782e54dfdddc256018ae6af8cc37450a4cef77f21e2e061062ca0c2a514290c960f5993ec1ce9eea6d09d3293118237e079b6015b966361c3032368174d74ae5cce4148ea2b3690fbd3c28ee544c5c5bd7bc618122979d52c9d3d44eab1f2467f338e695ec5f95998bbe77dffac42bc2809d43a324e0f5feb4ca3d5fd951b7dc8a9e6276ee080079b68849b14c7573cd02c76027a856165d1043acf99554c62fe32896d120974ae71f84986bfa0c28fcc399246bef3ab90f8e55f913aabf339dd7ca6f0861a9ef712e77dd28740615479f39a37e746c7df2b267066d1649fafe0459f665f3d5e7124db43ab1ba5ff94989acc7fe0935e0bbacf718b33103a1355d97ab416d8263ab369e6cf0ee563a77f2f265fc3856b7d54dc0887ed439a421c14f733ec1d6da086536f9539d23cb8026218c5e783423b5f4ac24c8d5d8faa7186dd5ea34afe299e6dbed73ffa8f415da706442a48808a9342d6209f65ca11eba76f8ef26db890da76671971f65bce9e6112c8aa92523dd5295d748e28857acff408c161c0513b37b855a8afb0764d118815bb1b68f8f09156641f7eea994ddea20f4062607b9919d041c880b71592402a4d5b92464b239caf431a99dc67787e76b8e1d7337af004bcb88473cd16b3f7640e8aaa59ad4609f060a2cdc71a4b3ed22c1506a7050a63bd8ed68aa58a8109980bb3f2b9f9fba9599d7620b8c25e8aee739095789af83529cfbfce5941d7f14c8ae30583deafdc7c25fc34e75bbed6ce4f6b47e9647c12333ce08c7db77dc94161cfc43f7ea0bba39def8bf8ae61c6fdcc0de6308af963c6d9ef43916d0cd2cedb970d5937c9fdd4b888cc66e99363b5a04ae62a4349f01c3933ada64080741b1781754e4a722303faef69e382cd9823177e4d5ac83e76017124a7b1a41bcdbb9c4209e7b42c", + "eaae1c53919e2029c137a80f91704d0871be2c1870d0333d8bcf7f94", + "4c434cddb399e52457113cc7e16f046c3f8301f5b6c296979f8a091a9ea557ea", + "b633c1a0e1ddf4727b149b3d", + "f1de487001a580cee6edadb1ef6b700c861a70c6ef16274447b8c61bb10d2d1efbf104d5f7d7172c6a5cf9c06d886165a2919ee9418e2e8f803d47832dae5ef232ee300d1f973a6298c22d777a1b16264353cc731a7a683cfe31e0abc704460788c555c0c24f281b81d7761235a955c736f17f213a896b40a034609ca8456ec3cf5906d01121b7580ce19d89347b6a59c81add318df487b2442a7a8b5e30df78467abbf46bcd5ee5b994a39ca5bd8846caba6f02f4f1335b73d4e20be0b6ad85966f86d1bb857713ebf947ae936782f1f4929498bbd66bdd5ad6fa252364a5a6b46180e93b54cc321b3cf63cf23d55392475c6b8c8c9dc707924b55544151c7c55ae0bf391f793e52bed70829fcd32b2926600f65be0943d6a9a96547675426b0dca9cc7b0f5dbc9d5439d0281014c6c159d055d6bd89d67828ba7fd2a0570ba82996037f7dcce297fe6518331270f6fd5ee63d406cc5081472bc5f2298a9208dba9398ccf807ce9af982885897715b3c5742456f756d79c70434a9baf7b4b6664c9d9f5696c5256b74099e593f97a2d4a469cb3430d0c3eb06083398cabd58af598945a85c9235a3fdd9ba7686e54d0de9afb594b1bb030be8e6bb839f6b45699dbcd2f771db64b0c62bbf6c8672fb412d60c00b3d87f82ffff6512e8308877573323c5a2d6a216ce3e2ce07c9763835ae59d44d7958fd873e3995b62b1b347e489ce86e023ae27a6cb03ddec27a38fb233499a714acd89232a91d38abce30299f38f437f7a46df647f2be862c1e7bcc1e4263c2147b13ee5b345b7fcb973f3ac71db8bc12309f67ddb62659bd73fbd20664eadcd23a79233386aeec1a6fcc8c592053954ee53826cb9b6bba22400648887311cdfa5414c96d5956fe193a3729be1434d923a3f9849f6c419f77ea05fb72f3c4f75ccec03b7f7aef8c8e55c8c5480ee505ae1a7594e6a911dfbc39dbb0ae8656f5972eb644c64203a920fe0078f3d050cc5666ed9747c23df7853d6913005d0156e741a5ead3bb1b22e5bd802c303a73a961f0b60d0fa698041c22577b44eba5d6071de4b545d9f5de24944c151de6a189bfdc223e0507c74ff929f06a2e7497e8c63073294b4aba110a006a6e9510a9617405d9ee711831e085940006761822672549d1d1c70e50002c2227f6f304b9a7f11dc05751be2dfd297087044d2e20ecfa0c091478d62c1bf5f0aacd25bb0384853762a51144b77d30418b633c4c10a6eda7b2eac46905641da0b685f85349749a91cdbaa4027fc50eb97a7dea9e8cbb5b5f386ace0363803ba579cd16ef80dc40ba1044b4ecd0e81e382635d7855e2341b18e0ca705ff46990282fe25093a248ca04a1fff64ebee25065350ea4b9e5990da4dd2e28688ab08b6d6fcb54d70f6d74fd7e5e05d21c12f5b140839aa966aea9ee094a923ee5ec704b5b709ff009c20ed89a75468c48b505d07c7a5ba1ad54ed610886c9d84468eaa598c71b017578404c909dbca431703e0cb1cfb975a696a1677bc015a75db007eccdcb21b9e5e119c48f148c2cffcf29e245e52156ba5ba0a8b0031570e4cbe7b3ac4646353594f0c4a9424c9d97845c5e1a4b4016df9be8df3013e5269484cf32258849afbdd733189ea11783f0f64d3aba9b4f48818011e868cc03ecaa44ff0ab83ed12981a6df445294ff672f3a16d6e0d19b90007d4646e967e0fb1763b3c879f548e1103a75c94f3a7f72be78555eafc086c1c58d1761aac60b843704f234c55b951a1303a12705f2120f784c2bc1494432a94c835d908f0edd5cbb169afd2d38087ca5bc5e5df9c3bd970dd2da4fb2a00933538148ebf669a20b5beef0402e53dbfc3a0f289b33b41ca27eb2f036a22f0d02e0617bd01e8c74be264515c9b46b9ab6fc67403a35837844580794088a9d3c14ad9309435daa0396f48017be524856ab6c191350529962ead64bab33171a01bb3c144b23bed406cb05102c693ce5df36eb541c47e871acf56f2b47de687eb9b3511ae83d06b1f69fbcef3225c3469c304741437fcd0ff4ae3484c117f51d24b6ae1363beb7d85d9b61e01e3dee901b90f2d3272eedb384ddb4d3b9594b9c0926595e500f8ce2e5cd407bd7a4e2c8e6f4315bf693e8c961ba5b8a6c7f5030c68a6b995e9d3f9eaee9eebc9d679eaf72a5f1cb6b2fc66edc7dffa2370dd778ea7ff446121999afba7bb35ceabf626c6269bc466d65f7f812c663bcb2fd87d3e09ab7d71e727f66d20ec48a5d2bf0aaf0aca05d1546d6e974f90df85c1393e3d45731f71ec7b5cb6cfb4e5c29976ead6944a99df2045056e198b19905362d4e9b765adb65eb089233a8b3777352665489c9456cceed593c6590d9f3cc4024d0bb92e1a0dc619bf8ae65be77456c18f8171e4d2d846073cf5c57ba93adbc0db9799e3d98934aa6899372acfa4d7d2ea32e20164b79c71d7bd33c94f9a781a25cbcafe563462eeacaec0e8d9d6c0199de85558a3a05d1ee3483351915d8a4e65ca0ab129a2386a9e26aff9b912c588babbcf25f8c467145061b9b8fbbff19d8c6ded8527d457be7c926c8f490bbcd627b3002044b7729a52e94147f95772591616f6074047e758597f410b3100f9efafaa4137dedfd0edfa85b0927804f0b4fcea1a174622116222004d42b36c2c73d04781f2f49d080f351e57154a3980005bcfb0ea34288e2fafec5bfd01e1f7901b3efc71ae58bf8df4cd7c045856103b77bd78073f0174aaaef4a3c0e8b5b46dc92db55478f012dc1b7d513e215e735573257f105d2390b5366f49b61809033c13ed4e1ebe19ab89313c947f2585f0788a0c5de90b41ad0dbbfc604a0d414d0e5390a0f3c9616cfce4097e38e05888b8bc6e55e40368bacdba7e5b76f4bd8fe619746155c30b38807a1ad325b00ecc3dbcf23014e79f1c39af7cdd0dc7ea58ce733e6611b7eae069deb047aeadfc21960e614db19d2e7e0905a9873268b9a24f856c28059321a742cd6cb3d1527", + }, + { + "c89c3cadc094bffd5ba06c600dabe30ea19ad037316fc13b895fe0e14ac8841264c1bf25557e22b01f8e102c3af43adb8e0a12bf79d3fa0232dae37ca3688e07294e2c7ecc4e2eebdd3f17173351f2c15b0480d4d77bd70955ba86f82214004b622cc92f7bf81a5837326f6a83612bdf65abb33c268a457c45cb7467e074b342a17c711c748c74abbee31541444020a9ecd4e5125e2a8ea3f6030bd677be18183a8a34af16a85ad48b7015cfb036789c0a5daf68883d0c7e401754b8d56cd00ff605be0cad19e03989f608392c81d636de859e66c2aae403c138bb96a58ba69b9064a83e7d8877067e7f40aa0016e0df9b7f455d292a60eb621b8107a727a3378c4b7509d3ec10526c50fc6c66dd4b015c915e85bbbf701ddaf2258119c8b9a5132eafe61bbf38870f35f375123f766ed0d4f38b9364a86e56cdef6f95a815a8d7c48ff283c77992fc6c070eab7d7c7b517006e5d4af532a7c429912ebaebac27249b4f5112d870d998e1c450b98c05d08c742dc769506f2d7a004c24ebf84c10838b619653e27ffcc4344d8db0435e4cb77c0410cc734e36738a6b5f72a7600632d19c86b40c737830b0f5f104443dbbb031dc7ca51ab318951e7817b5d81de8a9aa7f5db6e2d5e7a3cbd8a8100653c048204ced3af005d00e7de7b445f5acff901c4d46ff133e92ef073aff1d9ebf55befc32f9ec38c9eaa6a1aefc974bec2758297e474cacea2ba4151ab1a3ca0762c64a5ca273169d29b83c164f77f266c01bd5075871e17426068ed7aa58ef0d1f2959b19c604eb6187acc57e2becea2da93ba23159ba73b9226034c7ee2498e0ba34fa8038e5e2c092a73ebd9329ea3d648d6ebd47e1776941ab3130cfc91089fd0a0a36f0ecf68293343f275d2a64c1b7d27ffeb3f667f4a19824706235fa5f3f04952ff08bb183c0f1aa1d1b0edfd2e05ed093543788f5d0ac6532e15f912163275053b202d772f381900e906fe070cdb00421e78c16b7387be91adb7b3b3ea28b92548d69c780ea578e7ac66eeb931eefb4067bcabdb345a7cd2022085fc494f118215adfa2443630bffc9faa8fbd9943c3140d81c7532895734a9dd20e31c326531d06f5623c252139c4cbc882640c457819c63f6ceed4e03872b246a3766df69373ebf5af1116e8d5e1b15745bd9dbdd663fd4352d1238a43d5d1e74b3edddfb1c9d460daeb49afccfa0712b7a4cf8d07ccd0599ef3e4e1c9b5c814f3a6f3a46fc80449b34df87f47ff91fea3618cab2d5c04cb50e8ad199d752d901b21348ae939d39c86cc1bcecbadcc6f0e581a3bb51e070507b41ea4294b35456c69cf55a2a3f1296f0df73abac3a9c81cc303d1e20ad6e9bef48de83fc22dac2cfc01ce9ff3f70e00ee49bab2f282ceb6859f989075814e690e36a8d16354fd6056cbff49c30e49b1570363498531ff0ad0979a4518e9ae271f57f883abf5e301c0e24a83f09335479698911bca90269a28c0e040a98e67c9e55f4c91542f921511dd980270cd490766da22306b48ca9309aad3b2393b7b1e9ac7afeff64204081f9c0a8f6a5396d02eb9009901ca2c0a75ffbdae3a38ccd5007cc4f6bec8fedd64086cce5c039e8abc9e23bd694fc8de4e858c89bd585ebdd422b492eab26f4ebbdc1d17dfbba19b5ac458c31320a161a52dea638548205a6ad4ec54875ca34238c059177bfab2d5be0a98d12b3932d0661d33ec655446d0283224af8ec7f1c6874add03448fd8029a71d3c5aa06951123c9fd881d435845757df50444e6cacc31a8cf7537a778d1184b96c3512cd474f5d1fd1214555789d24c8d173358e36400b2d937595109729d9f35eecb0963c0da60d2eeb52a778876059fa95d820d5d34e7948d389dffd53d34c4083d27c917879b053cc57dc43c8263e5dfe5f33c19dad0a7126ea6e8abdbacb318d37c305a183596ddb25b1934beff13a4f24fbdcc2064de8e0bc639e672ecfe45692e9f8164365e1691784b4f775ef369aeb135ce15135c20da95064c810592ea33316b9767caaef842f948b9573b2205ec57d3026a2f2244c42991462e233061549cf9bc66a7b4a8a0fc61f73883fd24dad02644004989c4721a0aa03d3b0191d7fa4d3da102e541fe463936c9365ba30681e706ca70cb3c8ad5dcc710de59e7d8a6247aa809bba74ff4dd182a38bb31baa337841302c19ed89d65e87bbed05465f4ce0dfe89b44d7e9266a8ca21d984c41109d813ca76eb67dbd4e39aa437ff98050c968ec1e40c534ab51d6b8ea2309fab08b3757e9edc5972bff316f6f2affbff458ac0299613734b30dfdad20f797d172cf295cbcfee3d8ee25485d40380d3480a9372a1a6e5ecd7c4c6a9d34027ea6c197f37e86e757750c9fc24cc7cf814878b8628326c140930dbb2041bd9ee87f36ebfdbdc34522cfd4e50c9cb48dd52d4647a06d08e0f0069c104849bf30c8e61cb693dffbc69fc0ab9c5d502a227d606a1dcd630ebd799acdb1e47ce2ad52ff53f6cf4fbd5f0058fb5db915702675ea44334d42e0b6ddae78b22b5b5f7e5aa36519e31278e37b64312479b14aef9b8f12d8c1f39faf920851bd53b13bae5490c847b3312b2e956c430f1d8deea91cf171dee5017e7709d0346d81600bd5f0c41da3f548c28aa50589b293685ba059cd7f3edefdb5d8cdea364f4a42153b0632ef0b7ba18610b71fc34a781eead1dc5a00ab47b6840590ba44dafc6a16029cf50e089684194d93dc881beb62edb7ccee6304a4e71a35915f109db92690461b9e4ea21257ffb62477c20feaafc7a78e2aac2301b66893157920ce9fb114ab4f534d61bb3d17dfb4d9ef9f79a736f7c1d32ac3998356aefc876d8c38722787d564e980a1f15056cb3fe634d71d2c98e0475c79cab318b73a863362f85aeacdcfc44e61b5aeb870de9ea5b5abd24e8c19ab05e45e1e9b8894deeb9d29d65ae99aa94b5047f3c1168276cc2e491aba52b5b03703ced28c63a167f0cb3e4bb4d8e4f0292cf3ea4376510fa49a1a5efcc00f23c3cdf6402197b81262e66e17bf4307d87ffbc2b37213b316bddd65aa9d64ce6122c4a1545c5966bf4fc4c6ff17ded787ca9a3b3cadee435bbba8f6590dc4ba30895b84d5b4eb94f4b05be3c", + "82abb4ff5457b21f359754f151e456e2c0a185c8363d15918bcee0d6d49f12564ac655", + "b63b577e719494032062e3f63682098dcdcfe26cedea2a40893c847a331e4ce9", + "9f1d08be539f1244f0f69ad2", + "88dcdb0309f8c4a96ad5560f8210eda1f5afb31b85b7a8b15525777748967d4ed77c063f65d64ef19b31044f2adc690f5e457faa1abe2e127b38c626eaa94053c9ae1b6b4d0db1f02c8404b50f58210cc9fcc6fa4ecc615631da631031cd6253b4a13a3e88295ffdc775fd4bdf29655d9780dbe02b0a82aad4c4088e90b51f170909c0f98ff93ca3926067ec94be05841603db4f913b7025a9ee34b8d8bc629ed827a2a9857e0814d36b83cba21e670f8f94ceb4be5757e0b8782895b5d8605868e4f584b5bb6a5f3a94edd9b23fc2b6fa06914aec970c260fc370aa245ca68888c90c43eecb68474c9e45c53a7da055f5bfe39b56769fa56264dc8bf4c1616e30262bd501ff9fc5cd78f73ad89e093feba0393a11c6b2cbca765ba025c40dd0417dfa644fce96db5a0362235ad37a317145e7b5f3c7213c7fb3c393be57a1cb55035f06da1f0bf665653c5fe8a0f3ca67dbcbfc59852694d34819d0978cd09b508d103017168f6848258493be737cc24c2112f2afeabf41038bea1f74bc8656d9910b77d33cc691a0d9b12f7c518ecef93423cb4871949a518d2f06e5427823324275b97110f8f88b0d14788741e617f4b194e679a1627da50376a08d4f23b005c0446b46d4f534ed85e4692e7946ec818437089425ee30e47de995e8774b61003801de67939d9fed7bf0cdaf625798d0d0d04a61a2482217b890168e36f20cf1d6b81f9daf1a49a781567c4363ac2f3ebf0252d5adfbed17f98cc264ed2765aa279b7437410ee8b4cf42932e5055f4884deefd2a979ab1328f97cb750b3b7e4615b9c1c61659c90a5ff6d1c736e785587ec85040fb2c6decf789c2707974bfcbd0c7f699627b31e0762321d55bcc6acf1aabbd44abd7766d397bfbb68c424b311611d9eeb6598ca3126f569f688455da8d5ab86eb01f9c96186858c4b5e447aa2b9ca11aa5453f731beed4e09f95bb7376e200212e2f03551b8b09a19d6910f25898d692bc20bf6ed3ac9a0276db560de5c9e264f4db8fec6577042fbbd4510bb7070086508ac451a1fda26582c259412fbf1bd60cd5e921160c2604fde559b5ed4df52b805010b225f999450adadc6e108b70f169a3d8da6efbe1cce1c4908b004e928e3cdfdd0b4c5f742fd72a11c9585aa3517486201b6d9a98739b77970a88072750d29d005a291546f13b576b4249d71f04a9abf8f653ca206d98f738af2a1203bf0975f0a40138df054ee834ab73a3b1d7036567369a7ae15f808904e08adfc84b34a0e1356009d8a82e51c3e8f2170908179bfe47be8ad819cb12e85b6b76bba7c9b9398dfc00f550e32c171b4d5f2d9676063efee0b0b49660c10260ce052dd00addc3359e35c25dc33066d4b05bec7d93f71e0ad7d5ab83d844c7f33137894327f464260688ea4ce9847046e7dd0bfa48d4e15277a9586b4742daf0c5ecc59aceea6867068b03c20aad38d04a814472287d809a9285cd4dcdbf68f3f4ffb794701f4c265b2dff4aee55c9815938689162e08309df150538e60dccc03d495adcc560fb831444b922a6375845cef5dec56eff2910b5bde5f25f0e550ab5a13205de91d20896fe04a8ecc2c83d1371cf381424f8c43d2a5ced374878405f52bb92f4fa3c15d29ec151508488f9b4e42527921e245a8ee4b5d6ee95797f6ec4374d79acd7b467454a1d7eda05a8ae104534b23c46b27581abed6afc3ca555202dda94fc2b93501fe78867730a84f6f726dfd7364bc240b65d6c3022a04e09c89e36a809fbf244cc5522315110e9e33c8a4e1f1396e3e51fcdd53d9ae94fe7bf6c6ccef0ce02048a11441de3c25aa9787c577501977e486f8dfaa4c81e3183e648311148ce5cf3de56878847a9d14c0645777022c158670377dd9553eb63eb17e19ebb06202be8fd9bc2b24878cc86f9938e5996751ad9ca04b636497199f7f27dfa0f5ba2a01c3a491bec6dc5113d127f6aae38fa07ce7539a0c1817f7f0de0da538f4d85ffa394784a42eb50994e28530e3997e3345db28bafbb836fa463d34146d9f46d8d2b28b3954b9bc7f84046828e9b55e2fd663e562aa95caa97873f48f0a003d2251fb3ddbce0b6072fc17e0d3f99b655b8f41e8e6986ef7526544222e2d402489eabed4c219540605b9f5dd321ad902708601e85bc874c11efedd072aab7e10272c87b08b9457223de9fbc3abc2d1346656a524e9c67d79d4053c4257e886d6b430f5b7f57b2e5e92ae69273c1705a3074d5066def69fadea1af8fa9b3bf4890f9cda4b1833e5ed27f22bc4fe4cf452880c7b53320bc7cb748c0af6e7550ffa84e4714ec18d208131ae9e3edc6cd6fa2c60ab8ebc1ee56eafc01fbfba061e55014b9711eb58fdd01f8936d29dd081565de0b175b02989c5ff374e6f58c3383e9bc00d8a93903e6a221c7475e15aaef77594849af877f3807a76e03bdd54ff0b192bf34385d24d858d6f454810ee48141d73e3acf1aa3d19cd4c723a634cd8e25b4fb604c744e408dfd82961e46e8444f001d0991af24b3b6ec57ba41fb45122afc73ec6b25f501f1abd46181247945729337bf5083e5821968502a5a696043ee696c290095feac000957f968ac61ccb572ab2f37008830ab9a81d02456190af99873450b52df1888c3d8b6b13df65a9bb36a4b6d0538a0f179daebca2bed6f94b4670560fc5471c3770f2d004b6a138b8243068d754fd246e9881242638c6675f1611f237146f6e0f72ff2fba96f479fe0a662a81f40928f5400a0bbfb5ed07a87f457d5febdbdd6f323e2a59f749e6fc8a51d08b023734c762a91cc517401be57ffdf6a52b9174ea153abf2190ae2642955c3c02b4a15d72456c9d2f323de6fabbf56dfa3b566f1aa688c86b662bd34cf2511cc4a30621b6f1f1ac382bc1c4fa4c0d4d5a30ae90a5e54a9fb4afc1475e7c612eeb7f0e09e894c2004cd04126df9359d525d7f090e4b531916207c38c3512341c84218c86fc50061043ba1b89ddfb21cd756b391cb53e8c1cd55352be05efe562669e3986c022e30c79a97bdf087889a392e6da0d72cc7ea208aaf23408df23f3a9ea9bf9a935e49c9994a37a5dd0faf1267d5f7db47cf64ae1d3ec166466b2f882eb21698aa375cb50146c0e660e9bbb38d7bbc1c1c6d8333f7031d6a", + }, + { + "68ca38fccd585eb14f953358220027046c14ef965478d3d8f206f63fef4fe3571a1b53e774b298c347cc1b69cc426d39575ccfabd5a284c7a87a0698cae9efe40543cb79f5643c3c3057a5fc991235f06f059c44a7200b509a12e864fbd748001a14790f78b54ba80cf0a4a603da9672df32b68652c1d6edd3be51cf969acfb0ae49c026fe0bce0bfc72b1ff4c47712b7a27b2cce888b9bc470b8bdda55a8d53a34d79a25947ad55b95e5406a5c5311fece3ecd46ca590b3b01b9055761da8196b21bbc468681922c66d286c32598b1e3d77f2a91d835ccd9eec231409cb2e74ede9385552517718be9f84f0f9100e368701dfa4843b7222279537306065a54d4edda3a02f1ab9edba3ddeb34dece9d5edc8797103eb942a80cb5ae130ff2e7eddd11f0cecd8f9a615d75963c44238b10ab1230d9db7371d8291feb2912d306efe4f7aea2773903d4be9a00f2bd8c03589e342269a79441c0b42ce9c6fff0a6e4e845876f7e9b342d25351fe2b1233b4f576db90ef1facfa617b96d17aa03fc824973e1c80f15e5344b0516fc28424b7faff47ea1ef4e47f6f7b50e91b8fb14027f05ca7e1bafa266a4b952cd0b9e4cab82bb4d61f99568e14a6772f36296f5d19cb04fa86ff20f04ab61d1a6f01e5282c99fe4c3254da46fb5276317be58e94b1928e3791af27dc6544f6d445dbfc7275fbbea74f98ee4aea647b654909f9fa9c88312d3759099c9d0070e3db6d55506813f8b7abe602964a7dfb9387f58e237dbf50b4185a50b65ac099352dee8695017e4dac644f42aecc3e415333cf76b08fc764a721b45d7b74f6b0a2e43637e5b4849218d3d4c6a01208f345d76af56631590e520d6bcd82627d2446b45b2c68e0be81b3924753a54f47ea27b1e08de2399b34470701c9697eedaf3248db9b28991cdc2c632fd1b376bbda279b6709d5033d1c0a3ee573bdd222ef1afe8a4397a61fc30a4e94bdc55097ecebfef6c00133dc0b72c17e2f93a11eae9fa9f1364f10fa595e8e1623dead10caac068aad3967b9ab2837dabcd8f96a77a25baef16ba84bc93661ed150ffddfbb0369683cd021e8f959c2b531bb1fa95d7a574fe5ff9aae35fb9b4a0a9829c59b932ed8634fc05ca88211da3e30839baadaea8fd9843e0e80d9598a7282500d157ee579cda5d57628e7506617d301c2adec5186708f94f069ed7bdb70cbe88549cefe1673d48c9bbbdc01d2af03945cefe6e25f757750de64cbb9d496a25adf7058f5e32c827fe75e80ba0e834e6a72344dd2aac4228828ed42fd83e4576254af5737dcd9b6c338377d46baccb02d00fdffaac12133ea0e75e791593ef3aded4ae4c9249b8d5cd20aa28cd652b9d750b88111d9b4fbe729e27882206b2f0eb614d7daaf6436816fd80d452ac71c7a7f9e8c595287407c6ab9fe8a242e98da4270b4f1d4ea7243c27f89ed46a567c643f31f967b5f12e518106f3d3e08178078cc714cb6e39079631966a9becd6f02c18e983ceeaa2106ba9043f9985b791027eb5dddceed563106bcdbc48a4ac64bd95e87c708a8cdc33811bcd16c35e193203e70ef2bc7203183fbf60d46bc581f1bdfe62387b3e6c0c4a29130d872c3f8b134e7dcfb080e7e03048c49c0e468dbc44eff4b02e50bc6889cf7600fba58c0ee409ce948aa684baef4956fd8fd4a9c4c49e84e2ff314b7900b179fc66f5fb4affb9ef7a6064354fad8c3d2d50e6f2157576f864a843dda8f547955c4d80a73d4a86b7aaeaecea886927a5ba0e97df740ec7e8b70bb650010df55d4b75f478b07b205b560d45de666d84206c1bffd02ab7b8d1c37f21c47d1711b89d16214d8151a8e75eeeb5c54c39e5a855d578708d314240a064051d8b26c6183ce755be38fe9597dd5b5d198532b1db083a4b856b8dd60bf1db197cf1df852eb6daecffd97287a6cdd4c05307722e0fac798507f75b03e9361d5627ecdb56a3b633938fa61b2673efe6c6e768e4e7055e6c1d55c7113efd3e95151b606bbf169f4296455dccb93da370150c54fc11b3682f092f30381c6ecd218a3d9d39442c8bea61d9a71b174a8b2c56e028689380879cafb7c4bc2691dda0cf6ada039755edf93f851446df9f63267f8b8f030c069fabbe6457d4f63575b5905fb927a5a720d52c351bfbc48f12440a91471697e6b2564b1a2b314fa0e6dff090079637287b635d875f120671561102ad27aa83d9f0cee41bf023bcd703ad670b43ae23bf01713650834cc1e95dd486757f0a4f6fc9337bb95738805ad5e756198579c886eb0ee77e4ba957997dde0eecd84e4c9171c84ad8f0cb23c6a289e037f3a8beeea7965ce34fa47cbd727baa4ac9e6dc3baf17049fd2386674b246aca5ef6b8496f1d17a3175f6fee86299232c7fff682f066cbed895155d475bf9fd4b5571d257534c88c93377b1a600d4c280d42aafda975eb32c740073cffa610b5fd2dda7262a2fff5da7a0f3a875c62949e0c9247827d7a49bd8185bc27967124c34b9725ee961bc8102a029786652c2571be6cf33be63cf867c2b48e5826b31b714a415fe05c27f0862a870d8fb33200719ef4ac8530a4ecf2597b4a7f2e66f078a7505803774889a1cf963083c831f46725a1ec5545d8489e53921d81f80ef99f5e51a2d5992c7769c2a7ec8bd8e0f2fd81de53c7b69b650a2d838b269185c5efd668c470943bd956e3c5e1bba5d3b927b10cee68a75372d4d6fdfa6782c05659281bc9bc56a2123967f4f50cc7ae3379ba21e1617553354b5030b3d3f0092c1824f5d47b97e6b4fedaa90aa2573e1b115ffc72d44fa8209fd8d372c8dc9ee00193b47c2a9a302875da331731713243d02eb5a57d5dc51c35988ffd742ddd75c191f1eb2c2214a1fc47b82db8ea708818262d9583f2b1b98a40b6ff6e94742f25661a51882ef28475aab12d9422b6ac48e341cbd6f38460333b5fa1cfd4d0f43aeb46c21938468fe3f7bc771972246156652d2c58b18c8cecec2dbbc0feb0fae9f6bc022e029111f94e8913c0ad741612a1426b53cff73fbb24fb7b22ab750ba1310ecf339fe12ced6a3fae17b4c429550794a8d68be891b0e30cd28e81de2fb2ecfee58bdf11794951276005eb8a5af21e03c8aaeb595ace652c5ce60a8b98f6897d82698ffbb2e02213e50d9d3f00bb42c8652d22bffb87ec576ef6e206ed6c846fd5136a87f38c9ad899371799f35a6258878418830b04da79fabd80e7290456fe17c0850a4c20e2e657f97f4a53e1a3db65bb5e71bf38eab9f56aa11e6ef71c85b8a28f04c271", + "ea196b6a64be4b0799b1c2f72281300c3a2577db44e5d3606b8b02fa8fc46c7aded7e442", + "7c86a2c06b7520d60023d18fe73d09c514ed07a91d50d8fd5bff00e7550faed1", + "952f492fe00b26028c560fc6", + "b3f3294815ce461c8843172efe93f73a8254e58a0e71953e35c15aa89a7bd9dfee967853dcbfba73d3b87fa60449cbcabf13b1206d0cb27d2c3fedcfa695b6d41efda37bb6db35449bd470a23787619ee48f981d3f0b1c8e121725b2289b6d67858a4f9ab41683bdaec8a913ca2cc292a9640efe50fb85a1d1f7b286f45d4448f85b3242f45ab44e3281d759db24dfabbae4259f127d6546ecb914d7e93e2c19230c67fba8a6cba6069023ff7ea3d8a170289c2b4391bb97a7b899228d032b36186dfbb29ae8f0e6c06d753f4c6b21982d49ee682bef50a5c2c8434510c5fa2b9c0349592f33f8d7ad6f7243d42b292aee6d210c61e3f898875b91a17a89148275031b74cb34e628d7b701775dbfcf87c79ab279a73dad14d8eed365eb9f29a007b7d2ccc07ceb8cdcdaece67fa0166e135c9a4b939426882eeca98ab887ed2e4888bbebd5afc9f2da3e9162527262b0fa85903246bc8b80df3060c890ebaa516781a2b2a138b98001287e12a9c68471912dd297bc0beadccdc31a27b7c726baf31510cd355a28e4ef786b30084af66ef135909795aa73814cbbc6552270d5e11d46e9497ba30d6d8cecf343d16e7e3357bc9bbfbc7c1dcaa5fafd8a9b07056129da02e6228886463474c5af1d670bc14cf2868b816cc71578ad807a37477341c8192bfc2e8b1f7bfd58827e041f70384f92bb4c6acc415dde5099a1c2b27b709f9e53d1dab07c87a042ca4af7a2a6ee57b37bf2bb42259d372ecfeaf1dc55ac3a9f211f16fef3b2d5f11dc19fd1f425c14779580b2501ec6e0a84220e7e12baf9e0fee3e8cf499a7fba6721a746f598f04ee8ab4df31fb8fa5ce2d2419d5551155c009f2780cdd225ec2c19f94fb9c8b785ad4574b4da766eabfa696a1994e64a2518d1bcade6390cc683a6e80cf8b163c3e58cfa1134ee743079347f08a89c81478668df32ce9cdd7b853db5cf7af13436f3bbb11bcfa8f6b6d727a1df84f99fb3a5c248b8fd5baf669b68fd9af45298030f3251bf0351fa9b58b0b9fba53ecfd838300790ebd689744c1b7b333fbed76c8fb96fc669ecc6695ff5bf8379dd2a3c270af858cc60894be8922d69fb9707bd2a7825f2eec4a5056e5e91714f4dcfa86974259fcbfd5f20d55923a0a9936fb20e5ae9670e2019336e15f530c0be449fe355a7a02c0938d60720d5b8f4f59d2e4213ad5251c6058312b43d47c44ffc8946a98797f5ace279d3e126da63633c0eff1c412febdd47817aaee466c639e43637c1e179f606780ab490d3f0b3c2d79709f1262305fc87c02f68da2dc32f8c544e7b358c3a5d2c27986a19d13fe736c60a3524e94caa55e853eedeece985d16bfa6c487bed6583436cf82077fcdcf90a05f49db50588f46550f7a0c3a1cfca902d66d25dba8d2c53bb5557cc1d87c8a407898b3c30c4f0852df92d839859c191228d0a47324ea9ec2e0ae84513cbe4ff4aff85e77b8587f1044bcb9775099ebc2f28fbcd1cad58a8ce1f072f2228f559fbfdd8405d86f8262c27c3d95e01016b343c6a4e59dec81b59bb6e3c6109a4cffffa85e9752ed2149b5624417c0dfd1a27bd2630bf59814f15820c43bfa317be59ef6f433c95e8be154a8ae94765bcedadebb717f0d8c24e01e1952bd104ba9620f067554ae0faeb78f13c622c45d97b2b5774a3e30cb07f2cf0e8b19d1266d8a8861f3772305e24ec5c9cb714806c7d705a3bed6385f8be4e12562e17ec3df01afb4ef6f7427c48a1bc0e64fc65eb1c3d3ff2d6687e4c275a019f5ab5c63bbe47e3680fb1802d5835c4d494f0f394de1ae47f81eef005127d0971c4589c456ae6a69855f35635c28b590c1b93f155fabcab59b6c7cd8ea1c4ed1f67093aa782c54329cdcf9bf84a40400de707b894587d6e08cf7fd72fa45b6709a26e97ff5ec1269b8042358f872a79e8c2db1c7ebffac014d6b6f71b0c1c1945ddedaf5b6911668059b61b55eea4737aa307c829309c9ea548fba2bede023849bd61b5a467cd1ab1c61205ce64301e2531e5d58d03c74ecdafe1f5b74627be8716cad0d0a0be60984c9f9dfeae24a6c4949170ce2f589326e0a76c447a578ea3a5e4bd9f18884f18843eb1a78aa2fae06a7569a97551b227c34d429c8e1c8c5417ced93c30dcc607cb32a365d87328aaecb4ce57ab8e74f0d9099e267cfb747a3bca9f76b5f6dfb543bc4b5c06c3646062ec14f511058eb2939601913f8a0f1785249cb72b0bb1c12a9508b23caf490537eec53f614f3e06592eb61f75c1cecfa514cf7b500b0375095d5db74556220131390b77d0db72711c0c7229a5769b1d2b3f5105f3a4370beb1cacbd93ce32f89f1fc833c7949211dd204616c013a3399a22f5325f1a00008f4c8ee7dc5bd7476848721fef843123a6213cb0c0b6ae84233ed01a77a115d06e08990b8e60cfa4f41dbc9505cfae76463278b6c6b5ac7c3b83284caaba4a6a1d739c392528ff5b06bc3b82e98060e3001279a44aabaacc661fb14e7581d1235940cbe067c6b386da09454e0467c785ed0b65d41ff4cf36ba5f63d3ff2b45c11c6c22d3ea8ebbf1d52d770e0ebf2ba0c67c7d3641c145cab474a88119335990137fa82a340c2cc8c453752a3aa801127a47aeefe66d1af1a26ee1cd0e6d935bd548f6ce33a9c204be02ba08f9fa03c685665375db7c0c656ddf3e441ddd96b0d2018beff5086cc63339f26bc8332a5e6a1422bfedb69187a3443c23b630a28b02f8075faf3ff2fbeef6cdf02ba4af47a765003de2254b69f487bb5d038759a33ce6885611198b81b0b6fc5d7a531a7a90dbc3556aa758db1657698cb3698b8207b1c1b589efe5d52790667ac483dde9543953c6392d5eb8afdafa205d325e314f810e9c7722cbf5bb76fd6502733149bf21c60717ff5bc366b85ee9f206bb1f330ea72f61a9766090eabde747b1eb9c046cc8713d5a4f8d4b7dcd7c61f2496c5b467608cd9260382b8f11b04c318a5ebb6411a4c7fa060e08c295c6062ac644bd3d10bcbfcfe2e3748eba66f65d904ff21147faa8475f508f21238d42f62b697249b9fceb905127f7684c8130cb8663f09cd25ea038078e1980237389337d1446c3a77bce41b37b50b9c3a020526e7b7b3bef370cd7af71b225700627060eb65693899d277ed130ec5ed9eee75d4886f31aa93bbf302e0c69c9c4499396b43dceb67c02fafaff8b56698308393a03f60babde883f00de2c66831f024fafaf98b2fcf37a9ce01d4f34e95c9408395716dcf83fe86c7a0f5e3e6741c3b63b6ebe9964f1d5005eeb732ce66402007beb3e6a087053", + }, + { + "9100c5b2d7c5d5a854bce55e82f94b89a268da7b66357a661dcf75cba10a1b320ae0e4e1a5b989f9766e57f867a3810a0b5b857191ffd7aece4c796f5694a2617486421940cc12b63a6aaea20d2fac188b318a1c3061cafeae436e04d710654b96a864d674768caee03a50ed6afc06f52d90115df1db5c9f1ecaa4f5da094070b1a447251ad3d4fb0e24e87821ee6d4e7e7eac7059080f77d2b36cacbdac1c6e5063946a376865458c4ebdad3c2afcbba8a82b01b03a7882eee42eab904a19e0aead4ae515b02aa2fee74f3a114bf5b9f320baa35b3225491653f4a69e0d864cbbd031d0805b727e42c2b9530dae0c01cfc6a42af8ca730e1d67b4bb743a072f0a38008b937209d534c2284271344340fae76af2b1dd00cf44b48ab8ee92e8f9cae8845e5a8d338f505cd1c19014018bfb6b7dad487e7c8c32064421982c1a63149ec16f2bf4fe7b50cf3ce1e33d6cdea8e98bf067077c9a0ec1bba6edd5090273ca719ebf6f1a0f3e56f021945cff3c468b2dad92a947a06a024758d7505a4a1bcbe9da3a03e97859da99ed36982a7c23572ab60071566b749dc34bee1d9609e87fe32282cc9adba633c9ddcbf359ef4a83a54af5fbb5699978b487954a907dc9739f4b3f3927e66cf0c338e31c272da0cc7795c72dfe60a5b2e73bfd77b8c6ea58122a913910fe29d3360cef5d398f29b024f0dd225183d538bed2b076989aceaac460e3d45e0ca7941897f151261a024b0adf6d5b62429420144497adde6557a3c53b7723471fb760b6a8b1dcc2b327cd939528f5d7bc16ec00ad99df12f082d82bf9fb7318b3d3ce5b84ab1e38d2ebcb6713c03fd0d62bd083c4af96b4316ee02b6953431c261278aabd96e28f81adf7946e3664446135c825e45ed916ccb941350c84523296cadd5360bfe3e16dda75db10da1f710fe796f3456f0911294a4735cf9968656345b9c3049ca47176194c86f36cf702538df699fcffaa254af15b198ac37eed0837b00cd3547e496ecacf6136c6648a535a235059cd75a3bfd0bc49933b379b72e7a8463c268faaf05f0b27256fb179c9d4c923a13ec6600f83aaa2bee13e30c8e676040c06aefc65ba238a29d403f3a8cc164a0bdcaa1a5f54bc1d35fa4efee0c402eccab1e92f6b0cba94e1bd87898a9dd3957a7eafd9d26bf70866450646090833d4b91c032428bdb9097b409305de669a58e44931b7b428bf1a6dc56177cd944b87b04eabd80c64e287a5758c83db26dbc06f0c772335363ea2fb9f19c833644fe3b3fbbbbf5f9d460412d287eef862ae676f258aa45bc8465667601e9ac46e7d77693936c8d67ccde94e54d746b785ad26aa38ca0500105b6870790235e780ac50b9e3198f5fe678ae3a4ff4f1d4a2177edae183daf2de42625845973fc544907e27a90d868f8634c9d529bbaacbd228a5b4ac7fa68ac208e207a022cce4b24a0b5b5791eaddc6b3b3ef6e5dba41855ff531de9bbca0a39ea743c0732772bd32cd15c4b7f28a6ba579d902331a88920fb970aa75114e14b891d42cb947e9eb14feafccf1393796b21099e52b21773adae8e550f93364b1c438dd7d7fc76994c51860b652974d04a7e6ead207610de149f231422595f4e9ced1674d98d0e15ee841143ad8613f804729524e8a5f30d451611676f70a60c5dcc7127497f4d27f35e7ba0e48f98e9022e0deac400e809170970867a1682c7d2f3ef2c632c44568abff76f4f804841ae462c7247147b6e1debe48802674fd55b2ef1be5b4604d5f60c35358c7d773ab3a3ad0ab81868c6044d4e06a48ddbffacddadf813a2ce09aef34f3b60b666245a032f021b87c81fc506166983f25930cff728d399f6dd48ea1c745ad2da7f2cdd9e3ee915f708db0d1f3481018db1c174ea950ed17247bb8ebc065186758e5403bd4d19a445e4a15519326696e4280bcecd1a903f525bbe1e521f94d79df8db4b35f4ef7bd990c0f2c32789a75f95761ca0064bf251fa00b409a58b979e56d2c44bc2302552f118162891bd78272384c739c0c98bbaca3fc46fbb5bfe123eb25df0e27343e38b5a0c2d0774443af91b64b9d4e0649f20290edb84fcedb3bf4ba491bee8754a32716739e5ab64deb6c9888bb9fd2ada1629a59b16934ec5dee3678dcbdcc7fe5e2f3833da9d1281669b1d108837eaae5180396813883de26b957037623825b0675df431fb06b35191c06229f84cc849ccf1b1e079efc2e575331cd77b3297d2908c048b82b7dd14883f3e707bf6ca38f87c19625bec47c11f54988a97205d27ac51a32f19704391af72021b78cc4461386dc3844a1b45596fede3f70e311eba92b1d9ac221d3dc19f3fdd080c2169348f2cc8c9380e12a7ebf69efa37bda4ca6f7e66919b94532ac43022c0518c04d0a8cd99e0cbac88b7a317a1dac5469534b4fbc64080196b44498e149b0a196bb2d6f59392a21c4a4523ec1ff922a52de790e42810fd9355471169d22b734dde4a3361ecd57e271a92132a8b35cfa91d508d45618ad8c6c1ea209405a3d1d3ee1535caeaa3f20546052fc13aff7a584ff79db1726678344098d8563caa2a2abf6fe5aa03d7af49dccf1b17be85600e7cfdbfff54282394b0fbeafda615185574fdff78d59ec2a26dddba1c531a1ac007cabf5be2e2f0a3dedb9174e0a9da5597c9de6d68911fc66ec9d2b1e3fd71ebb83147ab14384ee303d067f47a324a01fc187f54a98f1b0848fdba2ceb3c18936d503e71887d548c4dbc70b7eecac9ead3393f8cb85a84f1484f2e237b36b6d886f54a0f629e8bb05b0c6839c722149a5b541703aeac04e6eb230a5659b12ed0a668d018f75bc94258218c1f5390b9aee4c0b2836cb76a47da649e2425bcf4cc15c4d51d109e5f78cfdb88137c31b2510264e46f1c4eb6e6b3450ad901ff9517b47a24d508844dc85fc5dbcc079e2d09f301691f401ff5f36500cc66f0617eb4dba389d427c7ac778d78438506608f0961f818a2080ea56d0f61c40fc342b49ee63e730df61f757387b9089e1987977b7fa02d87aec2e4be24b8bdf7fb6286d190f9df870944fa910df32f178ab692fa56b071f57366a3981f51800ab416dc4500abcc19e0c6aaeeb9ca063470993ec749a0bcbd07604516b1d51175ebedbaec8986f67a4d9158f75b5f3bcbe86a83220b4fdf12a0242951f94ac7d52882b1b209b82c4749753ea4d46a60bcc4f3eed033bde2d3d20c25cb46fd907f7052217a0a4db143b2efe8875a59441f4d22ef70d0c244b2de6a7e15581e84c860a6326ae3e3aea6d3972e2de0623d2d852c9e65eed318bd3d86d29595575df60d9050e1740f884796b6657718a294adcf2303adf61c6b23933db93885172e82a78f741b8efc6315a2c88ccb6b11692a346cd82a79334e0c610734e61e6378b5e2ecc161d924778bfcf4475805a0823a0d5a54768d9272ee99b7c4a81b3d5dfe1a2f5ff34", + "3c77f30bbb698b1571aeb54653fcae2c23dc16be58603f0c361eedd813ec0c4f63005a1e69e533da93e820e6e4ce1308aa29c60289060ebf24fc9738e8a4874ca4e26a0dc79ee75b8607416bd554737f", + "0223c0a6052bb3cdc99a284fa169ba76be2df53b677642a606090a9267a60769", + "7d3981073f90c6648c5e9c74", + "61ec5230306b70113f67b340575b77ef76d521ff75b754d551e4177591a02351ad382b2a4067f2b3af7e8e15431c7133e98be9d8293d17ef40161dbad9a4f1a4f30cdd557bb9a8b03b5f1b277c850e23ecfa0fc2ab1102e4b1d5e836a606883c3d43527fc3aa26955964b144a9a56cafa7b174d72a0635b80e7b4f871ead3838a955a14c4b8c5c3c66fd86a5e4ff10dfaa92105378bbc5f76ad29727e5bc4779ba3e6dc19bf45020f6ce4dfb3400df05cac51577d58eec21b22839b8f055226b204e641783bb3305b4461172f1c1d48eec56fe6f82aae564ac6688d7b0994747d9b23a24418e69f8a4fc548f854f86baacbdec78b7597b138c453349034c8cad2ff272781e0e6799ef2f8addaf18528736aef21ef8c2d213161e36b2c7815fcfc40747626e0165684e46a9a2275c533d548e52a9952a556168195d602ead86f6bd699e97ca59f4cb2050ff148f5bdfec358dc4542ff2f700db9861dfe5ba377ec7fdc0fcb2501e72fe6873c7cc76b95b4f300857f76e6e6e370119f403b556115b19fee7009f4f6675ad2d174f44002e35ddc360f309f20a3a1dbf39d90d7e5fa2106c53afb0bf445e4cede59cb50b8a7a2c0961d00b2c251f2d815309f74a46a424838ee87f1229273ff3b66dfb79e3b1ce11bd60e061e60e3f37bd7ac896b618cd78388590f44b1a276b965a4b95f2e3a7a175b30fb45dc7a71d4b3a1a33e98af30dbb46a217c50046ac21b8bbe9537c02f05a5780c8a5d796bd6424fd9e9f3ed5932069bc050bf4a1898a0ef0ca756aa2e2269b709cc92e0c5192ab49d692143388ede2bde4923c85eae8f59db5c7711dabeb33743c692be6dfebd815456958b5e1384a109f891f433e7b4a1031d4f30478b05766dd97eb964a28f2f7b55aa6c27c7f4ebf4d47ee8709bf99915426b3896412a855798e392e111789213af537cff7a976b4509e0eb6ffbb8e886a3596a242d16d95109b0ff562c624e06636a3611f804f9b2e252afe8a4e5e868b48e9e734f688f2da2012d7fdfe2d3aca75fd74730a85aae90353417fd52b92d28a5098b6af358a096b859859916bcd5a8f779676c6e04ea461fe62872050af92d08cdf1124bde1e889ace3c923457ecfe0a635ec757907a131ad7c2ca3f60e1317880f843c5e63f4ba59ab2882a492dd1e070b070af6f60e18cca29541206a7b267c3f75a5327fd9b8ffc9b36b57b73b36e586541d15c85253e17a2581e8f8a1518f275cc79afcf2b5c88a16e9bf553e757df089b5db90a9dcdc1867b788fe75abb5161dd7ee1cf37d3f0faa793ddb1bbf1eca13f4220ea63af8ef7c0e7144d999ba1c5a983e74d48cef708c1d28d3c0a168ab87d0ef70f381693f0d438ce013ffa2cba65a8cf6b498a7120209564535b7372690329cdbd74eaa76765962720f06aae58338a10064ad80f5a67395db2c31d36b1f5eb777306395f192599d2f737327afdcd9f14b3f24155a3f974915d3302427494fad756703b13afcd1764ef9735e7dbff920f1253cb668e9f40632aea1e0b4620db162138e4a97e6f0729b14be4a7c3256250d5e7423ba1238c704503c51cfc9cb68db7001b2f597a15e77138beea02e11e0bb98a72f2a77b7260e9172fe7e60483114ddd836addd966b69570db5eb26a0cfc4f8a8b80d26357ed51a70165bc0dd11ad7467688025bdb532e7222ea12f23c44d08d111b0ad4acb2f5b3d6b45c387d541ffc84466ed57acacefb1436ef00bcb5b6211dfd0650113ac369b9f3e4891acb2693c377467b1e9c949cc0ea6c4a72ef9292964275ed397cd2b1ed25fe1aa8f47e90cde362392da5e53893eef6e4f61decae1a75e3b726f0596f09c3cba62aa08bea89984b484d5768296a5afa8b0759dceba530a169d22b81979212b3343db35ce4e4766dd251ea6a47f5033cc090d6577efbed441bb4f8944937e812f12ef17ede76df621bd4cfa31567ade18b74583a2b783279150d584ca13c0d4784b70156afdf9be8ae96666b82def888465cd3df349de427d5f5b3572e4f963d33f968e6780e381ca196bc04a6664fe93fdc8558b21b84130dfa2a646950eb2e927885925af46d7a28d1507bcc3c02ba98318bfebe5b9eea1bd47935ad869eb701cbc35a9aef5efad88ff54eb350a34ccef2e159de8e16135b81105bf799fbd86aa11653b5ef93a1ab1c367231d61b42b8bdb4f04d8d05396d53247d51890be9b56c51cb19eec0fd1e6b8cdc98376b6c6b30963ac7ab02656ff94dec0e3a0eb3f3ffb8bebd99d5889df98e6c77093c370373dd5f17871fb334c7eb12c6ca22deb75bdac9eaf24281c965dffe03da9c940e13fb382fb6be332797813710a7cd2e7720f5b9e53fc0d98fcceeea4a8e9f787e670d60bfc4a849f34571e5d09b9e9c28cdf2b2d888eca9bb31ea8b9239bd19dca86880ad3e12b1583acc3a6d1f0a438ce3b5a337487279dc4ead1b214272d455e6a2c8cce4ae3bb29abfdbe77a67ababeaff5dd9c96b17f589cd4615c0209eba5e4b1c7167b4b739ca4b9957185961529d1082226f85068890c94aa1f1c244259ef7b120e40114926a49c4412b67b4caef1ff3ce6f3aea3c6107b830cd34df9f4d73d7d978b6b9d5c481e9d76e83d649e742b098334838fe50d80975fb567642d3b72c461ef3072ebb1d03c0099e97575bae6a12cd2352d9d296351df6965d736d7568c2911394a73d199743526ba54dd62c56c598f4e78495c0172739274c0b8c96755e489765723a24a8704093a94544f6c8764dcd1ce6b4bf2917cfad27d85e4442b4e5bd577ea1a88c2b79d61cc1be01ee9028235b36444483b4e45da1087bf6d45ca540620de5aacc644a0d5c4b807b582c7b058e140eebca539947502bf73c9abc81a0e3a618b39d3a38c4ff7f94767fd7e6b9eb61e629806bc3d183bdade7e369d180dd2f57fef677e22ce41be7224f11723a85a3f1d14d7b72dc98ccb2816b77e625ce3db3e2c5753af8b079e0d63939079a01910ee4699cb405d4d9c60e4ac86a7fda3a4c9c290662afbdb7678c3a84c87ff83470fa8a416511a06d3216a1445699d7ad7e6980491fd596d39762d576b08fcbf0825243c1fc01ec8300780857c429c607113160a8354f6699b368a87983464472a5754fd58943fca6f6779764fbe6cbb510d5280292df02c4a7ed9acec8c95ad67ebcda71d0f519ac18db9b43b28244cd34fe02c5d694df57410eb54c5e1ca0f8501e7776a811d7ee81eb9d8c80b2ca50a012b5eecd5428af965b217e7fdac80be88a01f76d473105b027eb557a523f13c55e1670ff34627667649573e0f19dda41c525a8c96c2866a88bd73e66c786767e1657960f6676d8a22be1c6024158a0f0e4ec761148b5a3d8ea481d8fed94855be82479ba23213190054f937838f0e35e00aa74c89b294c29ea25ad7e96b4b6fa952ea8f1cbe5397b7c86d0b74ccc25e22c88736b045fe86110bffa0679f28a1f27162b51410498cb7", + }, + { + "0fcff2c29cbb5cc40bfd2ec573ecf368275ade6a00e5730b77dab17e437b46524b3814e7f470acff6ddac4e0c6b748ed112657120bca1d83a4ce01e74a473995804d7c74bd28732a02370ac8ef52b600790d1284d82f077cfe096448509dddd0eb5944a882b7d384efdd4dde3003dea910f12de82035651e3ec9668e66435f519da3fa1f5bcda34aaaf028daf3068304f7b1ec18e65136241a9db281e011d27db5cc9c1099405a4430821e2488a228805314983966ce5d806b0f014c21d4c9d6a066e63aa6407ed6c29cfa4a3e22ca913762ca9d31271d9c371fe858f3b22e931814cdbe544b9416e88f6026b12bb8e88d8285beaaa35be1c24339b5f567480d7b16cbcf6160e549ef4570a0702889feaa0ebc54b11735735b6e2850d5715e5087291fe8890432784aa219bacaa2b874b075c9628cfed5e76dfe38426f9693f6bfb2de49b710c101b2dabb7c7c74f12de9ba8f75b8645d25629568d12bfbc7eaada63364b6f56569cf21e54c95d6797e9008f3496c506ecfe5d6a010d168fb7f0e2ee3c423492df36a133fffe9b87d7ac070c32cc131fba6089cb7d904b25812e03cd6048504f7ef1736ee00ee6b7aaedb3dda9c6fd6437772fa5076aca9888ce55e906a62875979bd477aabb2f4598d32342aa10a6d187c6768f213117a9ff6d830603bb7b9b475002e20b2237a4055ae6af6b8d70e343e76265188a0f07e7820dfb3d898684d99966d4bb9e78b0e95f5044dcc12810a89a75b11474c8fc06c6e734407db91a072ffeb2be6773a7c6c3ec939514b43daf29feb3aeb7afa57e96d9cf0492d90bb2c7be613f2208f5f5f5898b0a3db8a967a75d065efcabdd83759c88086583bb3d422c6c6425525a1adbd515199dbe71350b77940813618b88fe139153974c80d968ed4d9e3f97a91b7cce250a7c963f880dc38011250b9a131f2b76b677f78fd0e4cd6f1465182fd1d644dc42db0bcad8df4ae9f456841765af8e1c1775abf85a69577ece6f9e9035e36c88be784397479e713be4f5434aa4c166bc4702a4916c0c003a6baecaa182372a30af6dc7e6fc4912d13e662bd327829f6e85340fe130001babaee64d211d6761bcc52993c162a692a10cbe7434310392b64792a777a2b31341995072a6b7d4538cfde74e609dd1019a9f75cec0896186c0f42e3896d15be87aac5b11642f74e11d5c2f7de9f07f848ff543507ea4d73fa8f5683fc6b41831606352c482c7a5a013c51e0db59d824582c595f17a6d2113528943194d6b5aadcead62516507f178cd0f76729cf8b81fce4e0138ab224bfdbb8f16f8ea6196b90ef90a63f0fbdcbdfb5320984be8a80a26b932d1db7ecf870dd67fe838069136ff9b9ae087779e82cacf1b06a7b310ce6c439047c26fcec0364ea87e4549a544d540256cb7c3ef7282fa792aad89e919dd89519fe910501f5ef88da43232e917730e742ac2539d454e066feb9058f56dd246fdbb674dcab636585a788b338ffe41f4190447a65985acb9613d02669ad4ad888004c65acb0ca315752e58f51c9ae9259f20cbe8a668a207a5a46e30891bc909108f53db8bf6f0f11549e621d4cf4763e0035c867bfe9e1192fc421c080b25289a78f4167fe517852efdb6f3ccfe67ad01b4337da2c18f35bdc151c5dc76ee66efd27d5fc784e4e6829bea4f8a41ec8bf61ff998d178ce9f4a10551687337d7705eac6cd7fabb3f2379e31c1d01e4dc63e475f0fb01d9efa3de400b5177e2c2d68f2ead89e9ecad62cfc97fd0ad5b3391d0248dd2fd7c75dcbd802d3463ef0af21eb77b07a3286a72f1e9439f457630159abde7983a5c74f7dda12b40913632afedadb691d62003c70a46664fbd976457544cef8ea863858505b1c596e7f745d4a5fb657b1c694226afa9756c40d9c49425b323ce17a8531c5919b24010f715b5f27a300ee37334931ca9ff5c83c3f0a87713768ebccaaa15e35c56f3536ba945e5d954c94c885c68325bc4b51fb55d96c8d424849ece9a812af0747d5b1dc240f71609439f65acd1c17086e025e376eeb79a7255680cd692fc4b0f5768d1985fe8a1a387074f58c8bfdea8e5c11ed379b845ce2052a5b24ef0c1a658923eb87adf5b01e6aa59ae6937564ef97421722c67404cb9e5fe07d5bfad2e52ebe6cccb41ceb1eb2760545fb6a3582bc4ca572b0aa4e4f0a2ecc56299f3b485d980501a4e010576615ad518fd2d43c1f79aed013ed1f1e1bdb74357aaf7dc84772c9ec62da43c8ffe11a7fb3eeabc3584a936c37b28a438dfe78f89de6b0d5597ac1bc55057544e68fb49a6e505db69af122c2a3ad06219b7f2a2955db0ebf55c06baac5e0efac609436dee484857f75a8421945484ad0c7650a1d3008cc85c938208f19002b7994524878d6ddf85c763a65cb72a09c3a059657459f13cb584bfbd754fbf2de904517092be4f1786b2bde26ae8eb2d884592fc9e84395408f8117e47d1ab30d5fca167bbf07e41a33c230d240e3aac53cda9f251e24659da57d721288252fe7ff3653ae3e47b86209e9344accef0009b99f2ec7b3845558f1d77b89fc9b61ebc1b589fffd3261f71b9631e87541e22ed100e694854bed771358f10fe452fba61875a605b8080cc39e3eac13708e32518f28e60464c38b782c7c7800df63b6e7e95ced9154ea54e32900f6998f38eb1e51c112b6949e2eb11a96b1ea0a68c1e3b5af750a99c9fdb2cae44c5a1d37686ef87b158d19343e23daf00dd558cfb91e6f2e18f8e806abb2faf80d082f657717d08ca4e9c0d30d9bc30b612bcb1a3a3a3843231059dec344c6c04ce625b3fe064092e00175fd9d38f8fe54c4088efe30d211412be01460a6d4ad8d0a618b00a21de0a383de30ccd72f119b27a08958729a999e8aadff21829cbe8cfe398d90476e33db4c64981383a9aeab4a27f3bcb29d4b3d3b3a6ebdd71d3ac546b8658e269959630de176819b153cd53d2091efbddd2cf9178ba6ee98e1a3df9a095db0a2b713a0988a22239f5f08cc8f9abc3d67d9267f54dd5dedbf01bd490b0b09adb21d4e5aa7707e36cf77034f01bf8c7988a2e8dd7046bb2f486878436371f1258f3f7026afee6d7f6560be67103ad098edc9665e00118d4879f58bdd677cf2e6bc631d5c517acbb6db8a1debb4fe7492b7daf0b7ec7df056637c23caf926a1a589bef1db29cd81f547afd0fc9e459f46108ffdfcfdee43515a771c439dbde9177ceaf296a8749be0146cdca2b26be8c2ebd6cfd9b5032b1f7a375307f54c2f622711f8cf8684afaaf17c4da3e83666c40d26adc239c8d1a40024bbf560db5787ed404763d4e70ec6635c6a4b82c10f8ff7ad42217613c57648716ba94cb33129f3789dc86f9c8ec2e8e90e6bba0dfba1bb3dc3215188979a09f33346a6647099ed0e624c9ae10f83da0def840bdb25b718e8d86a616ff46b5327b1f99c22937920f5b5bbd6b53fa0b32f24befa4a7603234e6d94be51f00189a20b15c49e8ee58434a15ae9d10b9cf0204bfa7ab1fd9e006b22bebd22b036c4bb4c9949cb7ecdf01028d9f12466e144b2dbbf64d95d65347013e192d428678f64f0d9306f97208fb00a70d4615229143dd8890725ee3ba6021d38d6359055aa812edaf", + "0c5fb7075f5e15a6733737b614bf46871e29417e4b140bae6e10081623f5c52f557c36b4da4b5a4e82920497514b1e6f745fedbf73f86ee10976f82c6cbd5bc13a917514ddd062", + "e70954c812cac03e367e99f7b82a6dcc073d2f679f965d524872756ee58654cc", + "5f6267f6b3b21423267310e6", + "c53868c0fdc14e891ae1bc257fbb13be210a5d9cdbd9d18fe1b474f9a1929dbba3f25222d8fe8c1be3eef22352100064b922fd9642ad128a202b6382ae0a67c8affb0c5bfa1a80e55c1084cc372485243df872d677a80a3ef1ca3589908bca621f6f50133eb762cb9c05775d13db7dd3eb65ffd3eef96e8dd42928facc68390f6bbc50b17e1ef5ea6310d8756dd177be2cceb63a97bcceaa046794915589ca022d90756b02c22e8634c0ed44192abc3b8b1e2814c855ab27aaae3bdd801a73e6209fdd559ceb59a94fd98a66d12a31a643ca2f4b07ed910bc390f77ab89395d5cd1d783d8940dad4447f0452991b209cfcd998b0c814cebd08f9ff15052818bab0bf51c3b72ac1020d3b0974fbdf4ff941b1ab9c01f284fe82f2fd89c0aeb4b9fbb0a74ece08b3debc7b65e7263e2922fd4aba15ae3cba7885d04127c8e06a67f244e7aa4556f8694a5db6653f6e48d6de54f9e4024d25d3236d4f933205b6a358aa1506f832ef7d556c6a1bfe4aabfce51f3b5ac64bf6ab1e665bddb12fe13db9f07a55db3da3886df36ddb89f3a4939b1e9e5b701301570e3d01c0b947f498dcc6af438cc15e6038cb78a78986da0316cab67bca3e28c95e6b7e6b36cae9202cf4a77a0e15d3c3291d267aeee172dd587a944719b9fbe077603b4d39d4302b9a6415aa07af309a5e1cf7a9379552becdb4bc6a0b5c85d2e63bb141c405afc58a8b2b4188b3883a24eedf98dd50fc54725c440ccdb03514a6f37cab49296b6826b6bc7d7ad8cac0a3425eeb6866d94119acdad468cefe162a29e8831c77aa83321e8ae3e20e968cfe51dbf2b63f4e26c61536e6be4f63d61bbd06af38023b15f4fccb8ae0356d924dbf646bff69d1ac0d6e1c7f40b12d6d16e52d1c15958add5708bd38c514e47fe623a67c9ec211cd625b398fa7fd67a23e6e9f65d42dda2bae94524372fbc1a7e0ab3f1c451c126135536e73c573749aa60177dfb68843752b010e2cb9c1afaf51c94a48cf8ac7aab3fb200aaebcedefc6cccb581848da0121af92d9f4be002f0c2beffdfa65c36bec80e7f62d7009b1eb719d24b96e97059e6b50a52662c2c833738849f342391514349305228b29bfa9c7cf2a931558ca8e704c600148a28bd871465b23af499c11784aa45acd051f276d82789c58b14f12619372be4bc3a285f6cee21d65648d18e61752d6e7957736d3385f8ad36702c451c61ed475997d6d9f11c8be5257d8febce329aa701028aa2b5644b8515a95b5e866780e32754ac2e6f2e31b2c04a4ad35cbcbc25b23e9bf49cb1a5d877ca30880741757c29303af8676546760016f1538991b37cf0cd24ad3b1d877e5e1bd083e4b990af6ff5c0b28e530db3f463d21e76c928c8e1ffaa6c045937ea171a9071827a173e231f50e95430ae4895932c88ce048058ce6d0a50ca5c1842506158e98bb2912a61c7991a2256c97cb9050a4bb3ca32594622756291340561e9e584dd2e096263b6ff8eb898ae86f5f24500320d2d0ebb30d84cb4ef876a877dad23a611b39bf0cba5e22f2850e11c298fa23fed40691b83acc87136f8fa540b1dc40d1b0d0bd489ee9dad785c121955a094a2c6bd3353e142c04f7b88b2eb3305fd00d5eddb391b73fa2b16a6357aaa2abf2059ec979bd3ce06d5fff1c325bbe5c833a101615750613047d8155ac0c3a0734cc6aaeae7cb65d7501cb95f9d6d1161d09c961c0681547faf7983ed2efaf4e0fbb87a06169ecff1d0ee540a9223a73f75584441d4669cac09c2dbdb8aa2aed74eb9a2870f2021eb16e5f5c3e79a24d7110af4bece22a1086d27642550cadfa4f0e03f2c032a2745e1c9277a4f67fa4dc74ba056110fed3a63f643567d079c9430b8d5b3bf57a9b3f02d486d870229fee5462043b6bda8d265c745ddc1b8952bf91828d6db2edcfca7051e74df9dd456dca5e04ba469b9ff6a8130aab3903c05659b8f31cf4ba4c22511493a36541ff9d88c708dfb714d52a3c0356543e6efad37530b598bb63c3724772907abe4cad39c896c62daf5b30cd7d37eb36a7be2494353028c76e8d148b018c7bb755c45d2a33f61944071bae8316881e9aa37e4ec2374aac4f8436ed3c7db2092326538f07fc6644e0239899e3335f73c1e3c4602b12d19d7b639d4968974b6b2703ec1add8cd930cbafff4158f68f06aaac83bb4a2e31466e2ddc247ad71c5f4c49af7defd1394e21819cc24c78380caefb2ce87c0d1050680313037def12ca21cf67bb6692d6e4a9e90a9c9a0b7118ac300c6c6f636337aa25bc59cf1d9749dc183803cc0ccd1ff53210352795c6edb49ff1e5e8ebaee7b3eda6e3c0c340fa60594115e37fab60133b8a3b39d2e63db0bc6a03973e236fca801553912f93feafd8b96766049dd2066f3c5ac9222121ee9d36cbcd8f713adc8779949941f8a8dcc92ade62e46e9f1b292d5f7eced14c3bff50a811cb762ced1f103652773ef946e18569eb5892626627e085d4ffb3102c1586ddf88acbaeed903b22d3e7ccd8b8ddcdfddb872403240bc8e0e46a068f55bbddaf90fffb9a914187aac2ceedf21fefa1fe32fc7bdbb9fd76dcda1fca7b39107d308d11a118e47499dc4092ef0cd28d0d9af84440f095b4feb7adcba198894cd89a324c60ed0b996c520d4b33391bbbef1997256af7ba7ec1069244359066af81543ca23105742fee3480f890373d3205236bed566cd22a62bf69f8c0f27b714f84a203bca1605865e2cc2f9211389e0df7a4b3aab9d10826639357efe1f5fe64a1bd6d06d0b5605658c4d2d12e1bec77e70ea393b0a09043dd7d6684bd53f4c883f2f6928d99ba91873d063d43600f9105d503b11d8dc2b05e34b4fcf18e78b2b6c97d3b2c9249a2f6566ddab2a8a67fed6c9f8af2f4ef98dd579f2d4fb572e178489c503df5d5f03bee9920db347a6e734ed72ec7233387f1579c13725599a33a90915ddf03725dce20fd3806abc1029a20732380596057830ed63b6edcaa4d4418871bbfd58de1d1f2800588ed207f2016e11abd1baf1895f6096e2c75cc5916836a9ddc09cab4c28e53fadbd7d3080088131cc270095315b61011b0cea5b4d64b647bbcea54d20be1eec0992c72fc9c9771cae19191cf6a6f1840acec1deff605626d0a0d79ea8fe0af63ea75e80f8141fa8d7ca6f4c99dc7e78aeacc67762ed0134f1a0b053debfb9ccb145800b9818c2deb46f7124e8655f37c3291af107ed75384afcedb44518ca14cdea341c9657ec638531011cb957ed6b3434b736ae8c8199684cc58862638c5f6c07e1cbe8ae68c5582b1697ca9dbdd01e97023138a9173d6b1294cd99514a28102e6912b1c87ef22cdc611133bcc111e95c355a26b20a3d6f0ead66e932c5e1229b0fc17a7d6f78134c69beb362ca75017b1bf1105ac8970fad48acb8313cb3ff10e9d72c4ff11f95c2dab59575525c98653a9c7d31585a3742267c062d6ffc7a4303a3e81a45bf39e1ce2097623bba70f216aa612c64ba06ed6d596ad6abbdde69d56ab45e25ebcd4e485824449550232be26f987c14008f67c9db9d0f709f567fa44502b9e0839457e5f0aadec0395bf5c38ed8de7529708e58c0a895198fc8b2570fb6e68547630ca7f313526d392ac4776be973205f971854c300454d5", + }, + { + "95a17355dfa9d378a18ba20e58aa4b8711ea1d6e3c65e0b2d3c6382892c7d02768437d47ed50bf8edc619c340be7bb1cd1d88b0d3d6bbf1031f738c4be09eb264c686d39b92cc7958e63c9994a84b61b5c412999ace8a9dee0e2a29eeb8dc537f63271af5f3844ed9c0d86e6913c02ed7d2b862a132f08f311aa92fc3757342d89a5dce8dd20d5792d5c60be9862ab168d3140a061489472f2266f297da357064833ef2554c49f8120ff40b961ebcfee1d0f8e7e5722f049485f72c502c9cc4afdbb70517f0fd2a00e12596ffe285d1b37eb998e0e89d756e9491ceb13e83610a3a66122b533c2c3461b3244438f5f7a7af8088881dfdf6a29fb563ce38c4c8632ada8e7e06baa2686dc6aca6bc944e5c14d6e432c4dad554803912b8fddb1c18a59a86bc452914b2efc1599c5597f87a6edcad33a7728827bbaad0a975ecc22b7748d7cc71ec7f51adc8fe0350e67dcfb31af35a8d7b72391642e29c2fa4b796ed8f535f6bc2b1198baf1cec858aac38959f83130af55c21383ebd57d364eeb0e442104004c1599060667ce5e1191e76a89199a386e5c4bf147206e7d6e598bb27a90b3c6a54cccacb39a0ac42bf22eb40bc8ec7925376a6c57d8eac6317578ac052b72ab773f572ad961ee05531cb95ee5a6d70add4176351960fb4bd673f7db9f698616a8dd41823f2f87924c40f131e6c83bc40ab1f92312f46ee86765c306cf4a1d77275ef9668d80f9d9c1ea0aa7b2456bbcf764e009584ef1c0b4b4c683fee3fa2641f48ccf7485a8356fb3dd22f848deefadbef8050de9c5c19e8c449c6f3ec2b1324f80a7d428dc44dbb966d40244c3af03bcb410a57ad1430615e07553a22686f1a62dc6cf090aaac3707ec5b44274b7fe28c7a3a298e7a8adc71e016944875bebb421babd2b64809be3454f25b90723e2cec68467ad2d14744b15de8f9c397a505a340e85998e207cd46fa18d76c46f458af4ac3821c0ac6cd68afb72c376c31daad1a2435fc2bf333260c1a82430edaf2499e7455a93b1301eada2e12365ffcd36a1119664d0c996318a3e55bb2c04dfc5eb251f7fd64f9d83f27ea6577d748e1f85248355ed19867857dc3383e01249cc37684b0eb8e891aa663801e4ac8f0331b38686a19f0d19f6e94c7ac95ec395962be0a4e3c8358d2f6d8f13191e164ad29cd1733bde8c31c7d8ab90366e26cc9a06707dcfa60bfe139a112db827778ac348fdfe26892fed61db7e9849a464e3aad561797b6c778e0688bbbeaf3349727b4670a2d0a08f317b0dc9c4b12ea85c0309d57e754d0c7bd5c83985fb82f776c968189908a8ca83b5944767c2efc3c5f898436de54fe8bb17224012a437896d9fa106a749d12aff657266276129ec5ac12fc7a77eb06296d2a2a876d931e479d3ea201cbb4b1b20bd81471eaa33786c624013e1f07577c2171f38f0511c6924078a40c2d55ce392dd2ab0885e29f4c06907a1597c181b933853838970edad7777ed394c491cde27478eafa5b7a36520aa0779261f94b957e83ce058298dcfa07b08ecc425caeb6c599a11103d7631e77daa0d9d3fc6f42703d57f2c624ecddd56b9a27b848de7dd28f8ed656f1e4decc95a8908217e2f2453ae50b5fc1d9352d735ce5bc2b538eaae25501d449d090df793151811443c64f28d19eeaaac4081e10edca4c4148e723ade8f7e7b988b732ba08b3ce4c8a0d655bac4ff66048148135decd7727a49ac59d82ad470b5479c55d3d8399b790ff033d3ef99d770e1eacecdc140480aeca1e2167553cbbdef2090c7592b40681b733b0a0d127beefd49bcbe8904c975a5ab8b1afe56d7ed7667b5cf92f537ad6972b876843364817c20400524097ac9b405e4b35bbba0d12355a0b54bd763b4491b2acd4e8e4fcaaf8fcfd398499d4c4e81ffa93ca07a5ff51a1540f178f43a931e07e1ad56ab5ce57a2f7dc3ccca114dc9ba8a6934e95f4efe9f3f76947909b280ea5fd795bbbc0feb3ad2b704e305cd9d8f37d178961f77355eedc9d7f77c58e1db2f7797eb8682255939293c3ef7dacd2eab46c4cbbdf929aac301a13f59831a88fab173803399d96dc216abb9f079e79bbfab667ca590266891c8a7ea4bc1724573e5c5a67e9f1341b5bffaa538e240f78da7733237999ac86141b2ac0324f17609b71c885630c90befc3b027a5f01e33979165ce2a00968c414838446c2aba76e1d7fe3707c742f68af21d30e23b637accc848f6c8df820a27bb4e94e5090ac6e008fde7cf3fdd5931fa891335ec8d01b5d6f77db57a87dc35d6701adf7ae0bf82dda6511c83ab4d7d3460b221eeb3d6c4aa537924db5559b1c6739040534fc330f5144c78bf99f5f4faa715e85aebac043e2529197a82ca40f65a8149a9447a9e58c61618600b0c5ab221420c0cee114a133a648dbc2eceb2894ffc329376d1eb3ce7039cf30ff6a53038b23c26c38739fdebc7b919956ca2e468d577dea6621a8d66b78075ad26a6e6d8e20c9b694698540d516ea2bd108625e5fd038b5f1e19c5d5993b82bfe16897c375322dbbca81c81cef6ad900f0ffe5ed02714c208a12f5234d78e32ee07af155ad1e1077a0d8938f426d8f326c751f6ee66c8f707e8493cbfc76f9ddf1ea329e094315a91ba9385e16c890823db0f0231c7f939a042665009d5edd8e48102c515341fa6eea33cc00fb5d82380d735b29f2eec3f61428f7b186d43fcee46b2037ad1aa6974d729848cf1a80dc8ddb0580c9c876def06d8f7642cf45263a655ee77f047fcd76171546319622bf71283f3bf0b519e123a85765779c8bb201e99981ed184e642f63aa61f9cc206bf45fa6e514bfc637671d9cdfba2891bb112a3cff438a6372ee0dd3e7d9f352ce52f8b367b7799e1f963bfe50638f0c74b94873fcd3d66fc1e342a8bd36fb8b88f33eefabb78eca4dc9c89e2c57aaa010f2140dc5ea7c86cebe2f8bf42a167d1d546cc80bfa9258c35af6efb1a090c293a4cf588e4bdf5c090ee7fe38fd7b5551e71e5ce2b0b5a50bab95bc4c257edfc94d37579816b4a2249ba05c991bb2ea02d047e480fc8a8ba71f48f344c6d20d140a64ac20184e45b4eea14d0953370c237ef0a47a7a2f22997715dd3ee8ea52f24ffe12674d571b3bf968454ca051701e411499bc43bb55bbd033f9b81d4baa6c49bdd49614efd20d58175af868ca16a9deaf65216abbdc3beed5f30b209e786a5b4c006f3bd27d93e9d78b51a1a2fb7f5160a0bc1b7df70952ea1573888ddde3d9dd5314b0d0a899a733eb48d5e6c7274667e362e4da6b37c480aa4d0d8730e66483fb1453a3aefad69942ac7f09d3c571b6275590938c541336a121bdd20722550236a9a5e4a37c7de628fceffbc260b1e9b6417c4295907937b13609b8585ebb8f076073abdcf19104ed80ffafe1b09997f115d987a552be5689c70fe125ca702d2ae4d807d5690bc2e90b72cabb0b61ad203b34c68df21c16b92bf8def5680b204ce327214c32e4363d5600f96162a6819dda472acc6441858f396385a16fa5ee52cc0f9ffef3d53c49d535aa37db2cd4b573ff81d74006677969ec1ad891082b5d18ca5b0b9f975574ccffaca72b805c9f7fdd76bfe3dd384dc953255a5b50b7731a137fb9aad42e77d3da1eff5a7b9eda5814993cf2d289bb25ae1680ffcdf419e073d38b4701021adb2019359bb70ff4cca930be7bb979a0678f20665d14803d8753c8ce54cae92feb026486ba747a861daa449863bd38cb4d5831aa6db1e7f404b0c3587aac8765aeecec686066ee7d11321574f04d3f3da571e71222ce07277eca7ff97607", + "5e24f34a8d53b17bd0c2aee5369e3276dbd7e7c2ea0990f1300fbbb00831b76655aab1e2fd625ecd", + "c1d796f1e651a1ee825855d80206baff6818cc8c247ee6ce62b7531e6e9ac32f", + "240cb25aaae4d085bbb747a5", + "319e968ad291ea5d4a057c38f7afa4ddb9c9565962fa1a7b231e397a268ad8e0c5030a2df09dc4f99402ddf2e0d06e753bf55e1b318b3e5ff0108de2328d3b8d53e23e08bf7d84d59fededd60d47bbb52736b0491f82c616eb5f779c496abd6499555035e4513c8613e7204e6bff8d06dfecd9ce38c6b83efd8d0e41f84f7cfc9ae07113237987a4b2eaa87f7e0a310155e282e57858244e9071712fa026cb781e5a4bfe6fa1bc480e534096394459a3d1354e2d9a54aac6926a60b388410fd0b53f7a3a9116292f37406369c22ea674418c4deeead171e00f74f5cabae5d24a0686a4bcd8ba99aea613a23edd0a019a319daa3779c212fbdca9d772fc3fe612cf178c2aca2aeaf6bce2433494027a474eff699bba95fc7dcf79ca1d77b1e097439a9050a5cc78e0b78bf2e7f50f959ea2986a59be3880519cd84d0a673acb0432feb1945c603e70748445c74600ccfec60efcf9e4d02a7df5f967de4b473f63b0b0499ff4ba350ec1182f3a0ac17ef9ae28945fc9bc714c49909a7c1e2f311aa6ad7652e22e1f48bb51cf53814a2125152813752d86c7f9468a991d0ac84b1a2f3969b8081c228b7f5760718036e26a10e211ff04ea323acdaaddf9b06a08c92ed663d0fdf13fa601cda45c416c2d3803dd9b5ca29cba57e59cf4ad93176c65c64507b1995d638541c90b381ff758833a2ad67b0de44c280fdfd82b3c6d4353ae30b33768863cd3169a2032f26e37ddd57e7da1673cfc7375bf6e6792495a2b434155d684f2a6f2b919f944469d47be5aa7da74eed69d871e6f65c3ae08904a9ad042ba39905188f0b9158fd14094bd6a408fba6ef57566d69eccda86bb54cd3ca7381f51bffeaf8bcc1ae8df91d22c359888e21b70f640d6f3726a34e6100ee269124747f0ca05110f63deee07e3628bd6aacf926036ccec02c0b6bd7259db52ea8b7a686b36ba1d0296c85e43e25d72ce46c66a1e646301dafd2f4c502281e6f949011cea69459c026c65bd130d6ef06be17b23a9c9a84746e39d017b144135025ac527c1e653f233770cd68e9f232c3b623ceda836843b3e9ea313cc6a57d28ce71ccfb7265ce73b06bce1447220645e6f66caeb06b55129b97c8dd8db54c94d771504d24cedc86a8ec706a9f7dcbbcd7fc7cf38005b2913b1cfb77370bd23183ac7b5ca5135a2738cc91d05b2b22640469e3daeb6a7b0f14fc6652563663520f7754aba624a35e5d24529a6ee9f5ef0d019d83c04f5a93a38b68cbce0cecd42a11aae305475806326aebb4f673791f50c9f90894add51a0fd7c02807efd8c1bd21fa717a860e224bc9fa3f40975fd8d558e4844a09f8920256528450d77e546604e2ce2d38efadaf39a0ea3ea12156174aa8a20481e6c1190e448564675f9ca60bcef37cacec5aa218122e7bd25b571ff10f54979d62018b779a2a3d5d7d6cd56ae31efef2c844ba50ff9da88eba7a8e0d9fc5388a805ba4ad35eaa4798e395d2fe112083cce2f11cc850d25ca5c6e60a9996cee4789ca99d519daedb62f4fb1e535b742a35d71d7390117e93821ff18948a78c1fcdcb90a5f1211327d7ee0663ef16ff446e0e22d8cb7b2d3d05469b1c02864f4a87e2d9715f60c9e7be841e308d0a5f6c50161a4a0464aebafb88e0d2df8cefcead93c9623106d5518a9852f320235594be10c45bc0cf06c9daa007100ff97959357f9be8e49c870d0a11c884213e266c35e9131439fb3654fd5f1abd1e778ccb02b8c262753a22653a09272a0c33b6b2683c9045e8f967af756b98dc1797ff605c64ac5bda8252e9ebfe0e4d8d7ca754fcca5e3de3c4b63678da095281d76d60fa12ff4ca818825f346b9c4e426cee16db5818d78a527a901cd088bc2983f9b83430b50683018996996717a1738439680b68e3f61cbdcd0f0e1a6b436af8fa05d3ce2228054e319bad1dc6ac970c75313c552fc1136fabc302fcd1d09ef1b9138d18133a772cbd9cb197ff58c6e898f9e83e4e27206f3b15b6bf2778aaf9fb38e0d50152f8dbf5763816132a04b4b2e9639584b3dc8ea6d95ade024f9497944200ab0aeab206ef099859b9240aaa15f737c1e0fe6d015d04f47261ade4928e3c2ca21d1f5ab4a3f571f2ed92ebeeebf2493e6e39f0063ba931e165384ee1b5081f5f8d26ec24716757037f5158d35effbe67009080ad7b0381292a513f312eb28328cf5ff47a6599e36c14277c3eb5053c5aca530ff5954c21c03fb3fd5fc0facdac36dd819b0495fde421411e0440991da0cc4a20d294446115c0b79045037fbfacfeac574da3bf192fec4bf38c27cef71d03787430223b6069ba6d9273ec8679736a832277c657862ca791b559a5054ee8c7c07618083f75480c8aa01cb086c7317315911802e6cefb15bbe20494b14d97e3a885806db775c216dc15949e3b724f7cbb30bd2c46bd5a2fd6132352c2b21cc2b47891dd9794975f70a6fa7a0791ee761ccf4c263f27f64790826c1aa656c39483e029baef0855935e7e6c133a4035a3699925fbde131ca62948879373346af35bd7fa52b8d6c3338f213bbd9c79977c0d710028d1d386df614c5faf4a1f8fe5506a9af7059370893ff6d07d91383baba67a617b5d829e0e2eb20e541ed5c34be7ef0eaf6c6f6f52d7ca01933a2a4e8de46e422dc95161ba8ad354f6bc7c8e4cf8ab5e08607530147fcd7c9481afc621c5a3230a05e2c4db79db9e1e73f43556a8e8f0dff7ffe420282212f23d4c5f6f8d2febe129b9fe5ba7ddf27f72ae898a4eba270b5d2bb3b6b06e38c546ba80a9b2bc46097d0b47db5ae72485ef2c6419e856c33c2d66a861b9d474699e730eb8a8992e3ea9c1ed74316687d5d9fc611189eba2aa31af5ba8e81179866dc016bda977c59c595e40001c8ab3a4a44cec00ff84c6dbd9ad4be30bcc080e69b9398089d6ea464a70f536ace3b447693301c94850606d0de1299770b5f45e6d28f8ab83e3ffe52178522eb91fdaa9e4a696674ba0f52ee18e960b04415782f018d67479081b1bf9b4c9b90de026cbb66bf7d9d12cddccdd9b2c8ee2f010892571c6f0c0feac9555c71bf61f9cd69553cf7fc2be8d058e0c3430e134adb1ba28985fdc4f0cf71bd3cd09f5f82f303cded0de62f98404477bdd0a846c6c51e3e82ebf72f475afc8e6388aec57206018ba2528ede194345cc1ee95cb2023793f692f708aac3c9e8a682af36b078f5d6c7a3ed07475e9fe73b95d1eee048ab898edfee3fac4beda45f03eeb64b2128f6df9453ed77c6010e13c0270c068f704f49e62fb7410be90ffee47584ca2efc5287dae1f63bcc1819e7548eb9f0d8a3182f9ed00da3817255a2ff735876b75cd21cb25e86aa4b2893f9e5089dfac76194563f9a14335dd37ef06a501c89623caaf6feb4afb792092dfed515ba7518e278c341834a9dd17b50a0fc860b62ec621b69408cb3fbf7d4ab88a3e367fda84c82357376fa9b1161b739361c313b99dcbf4122f3870c8175093298cf432174217398928983ab6cea4759f18e7a21d71fe1b0f3cda05d241e12db0818b8763bd23d958d6e52981ce8d84cd6d82640d2000874a53c0bd14949ec99e48ce6c954ef0d08e6e319de5ebf7e142f25c0f50ff13f6acecde6a270c8d8de05ef4c310ce9e92f40f6f2b77d6e7aa3f056d4a20f7faa7cd0b93d82e3972343a50a26ff462caada10621bc953b73913944246d2a4da25fa52cc6ee1293c436ab9031ee2dc79cce39f139f44d473c236731257c6f65ca4d383e39cf8d33923afea3c80244021d36e0ed43230c44e7d1a1297d35464861f9149d869f26cc51879027169803e43c898d1b4a2a2480197500", + }, + { + "2158abc2472e1b9c061da2c01d0ad9e996fd687cccca331fe8a2baacd12c06f284b1b5cbdfd067e5ed09a60a137ff4a97c5c26482659680ffb22bbcd4ec1bfd272749e52440537320fdd3c225c30ccd98cf221b34b89c247ab7d14f93ed3ccb0486a028c6f3abe7e17fba1742b6d4db85f6e6baaf82df1a3aa059de8d9699821d39bad42d56cc1ec67626092cfad4a2e1cb5d814e2cab78ccf5474a8bd0dc990a877d37de394694af6cadcc57727f393dccba7bf955f4b65b3c00d71cdd701754ed4f231685b7b5e2557239d7e16305be2d81a773765dcea25ea5bf2c15d670f3159409ab5bbf8da121c779132a8ec1480068cb76b68a19152fd83135aeb228b446225f91d1ed4303a4bc16cf3ad8173b30d2a1e75ccafc8c933db231efeae6260d45c7ef230ae2c7b6f986f1c19e2cf260ded9cd99d64a2d03fc5ee3d73509e47ac1c39dcca655839fec75517a9243eb611da8fae3e317e7df66cbb6abd59b16975eb463f509e784e65cd660ef1a4c5027e54b1bc862f397c9cf4e6594d98c2c2830801d3a679220b46881a372cdf3aaa33eb66b91a9f36b6941c0fe1b4d2a437daa50b811f2d8c65b5a69de185d78bb9c2f172dc90a89324c5a2067974aab14f4fbcd06ee95cd49e03717f88480a410afbb4e68b5c79b0211cb69b90604cdfaf08af1ef10cf28f0f630e97ab18d9b5138d9b9ee9154e0b3104a6c164f2a114fa5032eb5c247a6b87880332a0dce7b36982515297a05dc8a4038a09f52b1def7b4fdad8735443fadc462c7c22132f8b9581de2d213bf5c53f7fce34aaeb24263afefead5341a72f88d3acaae6db367c5c14a97d4f9e438e1e11c3c8fde7ee37e5ece5382e8c68b660146046ef96c24caa6bc9fa0a0c88281e4bf01b32df5218cb3750f9c4b8af24cc106abca62d085198d14ba2ded3cafc1fbb17519a696965a1ba5f65720e893f1ef3fbc5200316b9d4615bb23426ae53e1c5a57b2f0ee0d0c83f353b4ebe7a6cb17531d278478b4ca8e6ffdd0cad30ed73d568a2e44972ac88a7e7d665614316d674e84ebc739b645a9a4166477254ba47bc5c2b05ced88e75bf64da21a7f1f71cd946d84de13ca77b7e0dc2f0617d371ed96323a83bb11dfa16f81bbde913d9c259b10f3aeeb6b56cc4775c25f49343cef667763118932c2e8b47ec745ac537b37746ed65fda2d1c11a2de60ec02adcb79152e8a9e614d8715cc4e6b6891d6a0063576560fa3621146308222432ffdbc351c36c37d844a934088fea92ac54920facf870a62e91ba9299dcb6cbdb918e2d54fb642c3f0d60489c4bda489f6c584b64c8f19359ab25f388dbbe636c4d90c048f5ed87024dcf9f98a9e738163f837a07750d61203254a80d120c795f9c3aa791272f9474fe330da81a45be5ac838613d46c25e781606862912ff88af393040605fd4d55d07e2052227c37ceffcdd2d42a08bbab69140dfa4406853799893daf768af546f915a91b81d0da719ebd45b8b5f1641f15621959689e810217bea18e3996c532ac6e4e2e4f289fddd5e5968bd6fa9aec5ca435c532b6c74a7568c8aeff9dd19bfc2fba3b484a191e2faf9a069a24e2e6d928ac0bdf635644cc1ef3bbacc547a8e4f1d42d4bed3b6b8cc56216fa550dc37da9cf4d1d1591d9348594d14adc7a3fde5e5d1a3b9875c85de7df483cdd0baa86dae793e0796d14fef1f649de6079acbec6b6fa5f2cb2bd0481f5316f00dbe5dbc379bc3cd6d13bd8c775a727ef43e6a5fad1051783b22c05a75d64a8394a73fcb430299b015563c8cb0ae0aa4ec750399855411c076d21aeca8656f3d0cae084fb0a1ffc6f73b52a7ea5d4bd6d24e7057a3811719533105fc967439a32241f2d3e3f299da2deb821748cdee1a1c5e71bfdf88d833bade2f505268f375a9e6488cd8e16705cce91d15b60b2fd269a19148296a7be348aa349a12270fbc0d5748e538afeb0598081a4f1349217ceab3c4141d40f765ea2bfffd530fb9606601469fb131a44939be984c07bac8f26d8c068accfdefb729eeb47cfd6ddc646e22031f53a7698c6501d86cbba05e282d64b2f962a1b08b9064078dd1e3f14006f45f599bc8e600cabe6d855fcbae8c3060859202361d929a241f6c0711ac0d050b67a1d44da19e0b0e236adad1f60a327c9c34b2b9c64cdde5b8e4f664f2fc70599d44a63ee2b14d051c27d71231098ecd3d4086038d63e84547dfaa39db1a92785e38b640ea0345062a1c185b25a72862e7ae6574114eba592d6492087e2580dc5d361c473a614d647e66c0a30de806f4976b69a8b92301e68794ee05b96ee116a5fd5edf5eab43dc1103801eec861383f17c2bab9f2d9126c1802b7aee0c909309ee72679ab644abb9c4caa54add283b5954e6f881781e42f849bce6554c7a5e3becc5d5a209805ccd4a0117272a53807e3978ffb19641a9dffd9034490a9284f658599961daf52f24f6464c2099cc9ed3459d84dbde2ebbdbbeef25c882a9beda03573bdd4c6a0143b14d634a1a021d5f9fa23a7ed0f5598ee57e56672814412b6c7c08b8e709fb98575fe2716100d000a20a7e7200d800e556564c7e6a8da9d609b18ff0bb8a8812e96b834a6b534b0d5dc97f5da17f42f8d58e763f1b201625d1a5158c2f9e9e190921637474ae81d278002f197f7211540088931ca8a941794e56067ef4a497fdc6fa713aa9f20c21f23c3a71ae4cc5aed459ca7c020bf55162fbcf56a066546660c5a009b8ad2aaae9651c97b1e145853a10013d1bf68e7df25dd492c328f823ed982da54557502ebc6cc56d4d0bf2881bf3c536ea53b4dcb0886e73b066969dfec343441b9372d7ff38454c4337d45e2b999415ec48f19cd05f0f80c5a61ec369610784f47a5cf3b2a13ff5d8145303ade7189a300936006846812dec9ff15500f8daf47236e724d72619af3a6cb3e854cb8284d5b8843dfe056beaa45c40a4541a98c7507feb27a605d6e07189c8c5554a492a03ce6701d3d2ec782e2c1c8346b54a963435bdda3a93bbac1d837172cebb9cd18903d25cd6bed404eaf18730a6d1c6da0783b5411770ed34f35fa6c11a4292a34565ff1b23d4200ec5a73e6b7905458088fac19f6aafd35e0e791f28bbb2cb0117ca1c3a9e3c4863e487ce5d8c14dd140e9eb4794d87d75b01f683bca84ebdbf19dafab716421bfac9e95755fd346a0cd31e8520a55c7ca652ff63fb4e20ba67fab41e11f7390bc02363162097802c6a9eb18b430d07ea60064d5b546d15bb68cada79c113848136e797577f1783e9b53574f9427be3a28230fdd69d139205dd6c7e9e7f031fb6eab70d69ce905384c5c77d084360aac590a89b2dbb2d339899b13619b455cf9f0cdc08db6c5b5f3223dc3a663ce42bcc8cc6f947f42cdf8dde15a6926b753177513a52be95b1f0b88d2a1ec90e49959b108fe204bbc29199d7382c42ad5dbaff970cbd2dbeade54bd70415e54daa805d396361f525f38efc2bba3fd818f9d7af0594dcc341c20f18c624fe13ce7e7108e1d2fd06c58b03f04642c95e3ba00d4035ea0476ac138f72378d85050bf60dedc90af38e96f67fdc38483a73e847b41d31b894ddcb234f02b0d507bbcb15a8941f9c23b592a291cbeacb3ed213f2f044aa842275a7717757467f121294bba6b357c969e96bfab455c6f328d9e5181d909c3f0543b17d9af7fcac099067b043be79aca8e5a75c3a6d4f6246357a63c516a3ca595447f34b43a055d3070517c67ec36e636aca9ed71a001d4f7b81149124deeb7826dec3697e183d861d544c9c17baff82849d599e9e77ed19f801aa1ce095940674576ff270ac788d00c429187e299a03c6f3a1646a8f7d6290287e70bd1276316ae624da929c67936191abdfba45e2803884e5a3136205a38a841448968a7900709dda033a42969bd3417a8d865d0dbee1f261f4556797dfebab278136a182a63e5ca9789e3f1371808efe06eb0cc5ccfe26c0538d573378035afa39fb7cdf3ad889b277c8c6e84954e74f3ff3140bf13bcb45c822784125d23b5eceb73e", + "088fc7ba068f80efd8d4d62813c93c1eba77e9ff400c7781314abc901873ce200295da09245bf8fd2fce254397616151d94b511957c89a881256182ac9e64acb7b25d4a080cc9daf9ac2f231235483fc9fd415f69caf7eaf0597", + "78d5f86b071bbf8a185e5e2d54faddd2a9e26983b1e7a74be0f0b979b9f4af31", + "d9ce7d249af9496e99c93b36", + "ad542824b49fc520f0b7ff8ce2bff8b3d47baacb4a1c95ed56a306483aac551fffba48e8a8f5e4cc536e9266182f6811d070fb9282f5c542cefb4993ccc7044b42cfd6fc71793dc8dd2de23c630f9ceaeddba45efed9d7fca25fcb07d193c000822478b19c2ee9fb31760cfe01475ba8a003db469d1130318a79345a29d054a9f9412dca1edf6d8f1498af5bb6fdbbd3d5f9a244ff176f62742c53779291ef6294df6540d841f4ee8c7c58fc8497ba74d9cf7947add5373427d81ae928305b93dd26cfc65e63b0ed0812ce759511bfbb10aca98f2abdbc9055c4e5ab82637f6a965bb74f592bdf11118b8eb79d50331e76cb4d10c6b4428cd4ec2ef4cb727bdba2b5375f5184d77772d0f9fd3a3c579a4a548b9c2dadc22c805ae959617af49a514b43f47af834313ed2e4d1fcec2c4b9ea87f328fa3d23129a36e6c54bcd08f7e30645de86e98ebb11bcaf99543503eb1e024bc9fd51fe6bd5e6d749033f2452cdf28b3d0f8a304111bdd26dbde641c02fcb15dc21b1a9baac5e86d35b4126ed1cc8a2c3c2a5b94c99fb9b2008daf1a0c090633bf9e31326428c75a50e821b1e72a6504c9d7bcfcaabecd929163d365832e8971f5efebff99ee3f5b95f957e8904d05b410936d8a81c60b4947f8605c58e5b727d491995c76fbe06e556c8ab5cc661a0c09ebc98d61010050f68b31fbe1f9de8f6481b2704204b0164d8433ba4dc1076908c782826e9b555e8d608463581099a466f92bfd6ac9796eacc0ab771a3f11d03806b0f33ec04c69cef6b87d58c11acb5d1374450ce61ba159456b915043c5c17cb03f0ba66d027105bb6fff41e6422f13e2a466f073358bf68149a3b577cfba7ea08b42f83fbc5a2aff17c5ee7dbdac3ff97389f5b8d1f3750e5c9be651209eeb9574127ea81bd7619da16d1cfab85754883543f6474c8c0cc9d5b80e34bf8262d2b4798f9917bcab4b880339397907a5bafe7d149247fd735523df3cbb17ae5e298846ad3bfb7d4f902aa549b7667d3ea945b002e7b209bc83842a7b120d6d27ce80631404371f31d1f61efc5423e1822032a1cbf4fa1a6b6fe79934a202d5add8c6e3595e49be3dd9553a569521c50e9653bc684ef2b73c3526ff7a0843fcac9cc9ecf46e63df5b9328a54c576bd299a366bbdc0f83a9de67b03f1da16244bd6d52e7e4b52c4ed693827735554b05b3a260cd01a41d7c944d0b7b58ae4b0eb052da34bc22b779d7ad46f90f3d4049c097e0adeaf71bbb30ed24b32ff5c7a65177db77492c2571e9cd99f15e613797e319ea7377038d53b28a4cd66a697e5e8f84cf16bd0f0430b34826114b4e1d1ebaaf2939dff7f9f4ce7c0861e51701c42d9cc9e871018b447ccaf4e402e3d63be164dcdf6799314a389ada8bf5e51a35148acf627e51481b9b0e4bec09c9e6d59229721b151fa9adf8323001fcf33afbc9a949643172f39b0d10ef57b37973683fdd9b9eb46e63054fd05ffbef889ff8fc8f251b0ab41fb00757ec1964ef373fceb8f6d148a7f7c89944b3cfc240d091601b23046188ba70a7cdf7b6f96eb93dcd3d24d4aebdc4a29a749bfe3cf5f6e1a025b62982ce188e6b57245d829c9fc1dcaaa5309a8b9557b8824a78eceef6e977721de4065b474ae008642b974001a5565ef5fe4250194e8b861cc45a8691c461817f10b646fb526bf0fe7790bb0db29d1356e8c7a197ec78df8310431d632a032b5490c2a458eb8d4327a9679d7e8ef8739797b0e820e2c567ce3562592e862a1dfcecd50bf77fcfcd00518db65ee0effb9eb3655d5d401a4a47808faa596d17b316f828cbbc14a7e018a0593da9320140a752f3824b5fcb66aa4c3cb94366ee8b821b09e7bea2c04ece15e8a7be1f58463b525e8cfcfc3fdd395ec5b0575094313557e632d0a65e3099e3c653111a5fb4f0eb2aa710229fc055a2bfd8a7147cbecc10823f1244fbb6894af1408ff9047d6483ef83573b5421b9798ee387dc38f166b11de6c33e9785e9b3d9d28bc24c37890e4f8f8ff24cca298b44d6fb1c6aad28cc634a67dd427205285521a172c2a4884ac5b038e261e38faf0086a02aa29195713cea335c47d03d67fa0dec7a8cb21db741519f5f0ba0143f14d71e33d82c75d6a19b3f7a42e6c16d762354daa2670ffa55bd400637de9cddf9e7964a03b4c8956f36bf54d89cf16de23e8c52957b52eb4572a11d1398be72bdb129e2c1abb58c65cc291bb7b0d2dc326c6125a441863a6c92de0f47a355222d58bf10af0d297a86a98b4e933a8f844fc7f1bbc8ba77919dfc50c41219e3db309b92ba056349faa758daf360b8ac05e43fc2069cd46e63fec399cd7764b111467fc65407ac06f5f84a3179930f6215ac5ec906146c19e0d3e162e77a2bca3582128284282b251cdcac03ecc204266ac3a9cfe8d8854008baf89c0ea0096a400d6a0d2f7c681c99462cf0105f7a3dde690ece0438fbb820b9c73c6cdf6208c336831101b904526cf8ac331d879d71615d8b1f750ac7f0ec692d97a5e21e17e194a98c10172b5c4bc1049a8743188ae7c4d70384a7e68c1353aab7882bb91aa383821046ed0ebabb4b2dd126ccb935f48646b299095cdb71ecd5cc402e4635a3f7a3c8a6f54f4076ba028dedb402bcc92f5668dec3d91dda7319f58382017e306237e42480ee2c1f5930564cf16fdf37a3434585336b8e4535bba87311cd47722b9da727250560624a5dde48a2090ee44592d2fc06edda634b600fad9f843c6b2eaa0697b42858afee8191dd2a31e5685bd104188e2ccb057dd0a8d4d1205d7c846f5b8ec0f06bff61c7f47ac4da30e1bc80a4e95af79b14a83e9af2e0f195cb92d14f752a5f12ff90a05765be453075d799694848fcddb07859336ec101c8052bdc273d4abc313cfb351b543fa340dcd01bf32fea59881ddb8f33c6023ccea70532814ce4a2d0c66c846347b86c29dfc34f6fa4db298911d4367c59939020a3d078194e6a3a3c5126c24ed182398468e77fd61a5b1271f5cb2a97868876954c3f7179d6a045f4bd770f681cd82216cd2b1ceeb4e724b3fddeb74481e662fbd7f5dd45bed6d4f89d21b8dd9c1009ad2b0b16954e97993ab8f3fdd9d61f8db102a945591b4552f419971a9e46a792dd8392c8d9502767c82d9b4f69e66071eb579859e9ca070cad5fe3b7fcb77b8474926ea991ce7ad201421f8a79c051b762a066027ab2b9595a1c97ad57f3149f5872ed4d8e99195d47bd3c03bbee590a50a99d8048e912aaeed797977b52f0240a6cf2c865b108456881adbfda60cf701454da17bae879cf098df808f34e50bccaada2d3edeb1aa73cfe3c512d814eb33897b6ff9d67d3d682517cc333c3c2552adc99860b1f0d1076390de9f84fcc9e802581f77e14f5254da01831c70cb8581630dadb44209377d90447a1a21cc8a2d6d897db62d8420afbcc6ed85ce42f3281255bd43e0afd3e86b27d3b957104ef54959282b0e1b381a26f16057246704c7888126055af5a1f494540f01897e8781e1a5c0193b7bef4b5588d0e9b9c8de74dcdb63f03f7b15cf48fbb71c7c3bbe9329e3d326988bad7d0cb85537c1e0b3cd88f37a3c7765f548f99e495ddc29daed8c7f15dadf2e5b79def91dbbea277c51a5da250e66c305604bcce4789ca2df9a10614d72824ba8e4f179f35ccae7119fd962cce13b282f0f970ca6c4776374c4bc438f0de98aa04fb3cf23d2c6800a4a666c15bd20c486e88e688ff9e5fce906b4ae96ec7c3388d7567ce6c8bc61f6d2373b93f9ddbb02b384084b3f28f54c9ddda232d3084daa5fac5ca356ac0059f2fd3fde5d6a9516d0954653b699aa986f70733538e19721daa41329abb95058450e602eb5726ad5a8b81aa474650659c6f7f6f53f8a6e635bf35f4b1191e0dbefad3be756c6141c7d55f007f4fd131e5d5eaa120ba31cc32b8d4c69d4fa784fe0af7dc272898789c774e7995cb252eb6c8e8053c9e7adb59c27f675952d161dba78bdfb15859fdfe4fe4a44c01efd394bf51d43c600aa9a527d9c490971e188e28b980e77a9c6ea0a4ef6bd38d11b47f5745ecdb", + }, + { + "9cd1c25b5bdab9b9080db3e5e05dc749e0783087c310777d89307138613bdffe0ca259677c13208420d4690031314a11a97a986d8b0fea143f5b4da0972c9ea3cef80b4b0b2bcf2bff392c306a764113f0d9807be86a9027c6ddc85d096600d85e0b236937f295362bc1679537a8a9278229a36a9433925a105ab719c0b7f11fc31488fa071d3032de97c81540713dc29ae02c2e13be8823183f3cd9f72ef8ba4280b4499ee47c7c7c4492bcb5cf7e4fafaa7ec26906e58146215a3d4f52f792d3abdb718f57ed0b9b7fc7504e45a0fdf01ebf5924a4da6ac635a715879ea75a4983cbd9dab9e47638acc687f16684e184443aa9e81513ae4abbc4d1596b2ca3eef77cc9b0603fe90c0570fe6cf4dff0381a99212fadcf7968934ac1ff7664ed6ee0b61e41f5074dfb774b676c2b57a445f1c5749e95ed062837c727ae2c151c0ccb3a4dc1429bbcb9e62325117aca566b8fca0924b70f4defd7749d0389b90f55f35d1635f8d2efdef514f06fde46db6e11e492c8f4dfb7cb5454cedd0ddd32013a4836321a25110f3a017f18475a86583e192132f8d8fd4c2dcb2a3aa95c3be3a57216bf9727cfd1284eea6fa870c8e689e91982c116ceeee2f8298b55646efad684b96eab883fd3d629437e9a0b6523f47ea5b59474a4766ccd01c13170bb08f47576a0fdb573d4dfb65279c1b79cb535426bcab60f4022dc42e40db29f15a6148b461241bae62070389932f035e7257752ef2d6130503d72344b24d360cae8ec11fa2dcbe04d3b18e66d081b552e93a71dc0094d1046bf4491e318f2ae00debffa0b8ada58c5f23e33fb598829ec2f46ad3894bd7f530210371a02e51ae0a414eb2eee43f3e08126dbdbae04c7de4b7416df32953234a6694ea84e6889f27c74206ab8144a393a2614e92adcc77550dd54827387b619f004c13f6c4a31e8bf525277669db0a0c3c589eda15063f12eb774a13e2aba2f2f7b6e9bc69f8485f1d6fc5773acf83671812412d28704003e78a17da25bacd1d61a6d9cb9f121abc71d023bcafa713b7c954e4e1c524e5bcaefd86c4a843e209eabbd579cde0263fc059ec6ff10017ba54fc9c2a1171d6b06f5d85079167117c12e6e5d0c71c008765fce756fd0f1141fbad6c1d2f32cd8e80429611a9a78dbc8e738d458f9ddce58ab43c77b34db9befb25cc1a588998e8dc2efa75c6883244fbbf9a7b4d6750c81b8d3fdedaf98dc61f49d067c369409f984b155ec347a3bef73e2a44957b0ca0f84c7fc335fd89453759ad0ac2fd9a5b38afa9fbe74daaee7bc52301302fb2286c21fb922f74d756de84519171fbecaa9b869682d431614ff6845126a4034f10253aa244bf89ab8e0dfd1f7fe8fc1a8472a10746d26896c8ece7ef80eb2e910069435518ccf096caeda63ad692455b04e6525bb8bae27197ca5118a57fb9a5d8fcfae1b9eb7874d91eafafa0e4fab5cb4d0173f7e3e58fae369843a641e98f3ee460e8cfe95d98f7fd38a8d2235e9d6050015833e6d7d21d7015c3b1ff42f0d3a3d9a38d373c8524752e06987c9408cca550f08c38c2a9a8d86d5ac7a04bab44254ed15c7b5670e0747788e11b81adb0d29e3d0b50d6a429340ee0d44a8c286fcaf9bc46403d26b4a4af95b021336103c1ae0f1274b33bb8b21c8cfca8a56c639f18a9df45d083fa7019aaa14d1ba50eb9a4112e574cd70969640602096265a87b1f77c0e00bbb501555f1626196611b4a824991cf10ab2874a12a8e0390267eaf9e3f8f99eadfbf40d111a26772cda1f50743c417eeec9c80171a83a730f246cf31c6691c96185d672a0fde9ccd7091c4b455dc93326913497396e0a4992773caeddcd783e534eb0f34b99bf23a2db6ee738381b5fc94ff603be014c507888ff55557793a8c5439b11dc5a347f35a2666eda81cda4d1c3a78fc4f3df3c7bde91d05524791b67142c446f60c3a4022912ddabdf817ca3280b671beaa496c935661e5adf39c1f4650563c5c807c8f21aa59df926199c4e2404690ea8ffd7dd65f637452ff93995fe9c5ac7a322b9bdc756b7ed6f533b9357a4a1ffa379dd096f144e9e0d87330c238ed3c6b08c8478e23b65518ea1e4e64585e5e9fec2f26dd7400ce4c73ff0eacdc3b07e4f34f6316f5b82fefc66e442ecc92bea8c1d58635d644724a3380e71fbbeef4bf3e57c6240ff603d65447f510eaa3c9ac794fd24f844489b7c560c7814fbc307e03f6a213eca5ea40fddf51d8731b74ec5b472bdf8ba59751065ed2461b02c41ef96622e60c0d26f9dc78c24f94372bef7e47cf09ed565ae3a52d39b02ffddf1953f1ff500f1659db9f1c2b23534702c19ec1cb7c18166fcd33997d53874c7cdb4e6c2b4d82751911913434e48b37a61a0971861187e5decb7f5c1ef6988bc1d6f7fd147a623d8bf361b0d7ece88df6e1ff8d037762d232e22e51d8c6ddaa9dc597b23ff9efbbfd416cc53e5543253732a23aba151cecf73b3ecff21c6a9fd1f24211fc21cde9633aae918ff1c6b72468f1de7e0ecb6539fa353c069fcbe8920dfa8e2fb86782e3062462f7eb2a2c441bfac21ab62744b05c70b6fc3c9f8e3a8a0c5a4263ed256a019861ecb28e20ce78e2d93f1a1def669e9652cb35d105bfdd5ff2313d27ab3eb00d1b628b4c20f42efa23390802af96a8f261ded3678ea0b780e1f4a88d23588a4ebb058adbf9a9c62ce2ce2f8264c874c697482e25f8d5a6daca4f57fd97d23c42d7b71ec150d4ee33931db5f7d63abe7d72dc936bb23a367c798e6a01509644284d52f9ae27d7d1bae597b2cbc26139354dcca0fff6d76c6065d661b66ca5eeb9f8d85810a029cb95b17e5173ef8ab92d475a1d3e21799e874ff04dbc962c668ef4be9f94d85b2a99d97c0db8f6b6d63e00e36c325cfab9aceaf7597113bff0086e8fad36eac7c0b443de6d3a8533789616d4c863df7200ba795a3b8d0a2b9568bb32af95fa604a3e3ea778c3dae159e1b612458584564ffda07b8aba9710134242b2d83d23127b51b9e41584c56f667b71bc01060240f3a2bc7e5d438e7095c1236e0e468079a83a5dbdcf132d258e9ed18f94d3c098867d06d3c09544565677b454be34ce567f1c143e2f3153bdc0353d65090dfd8f7af4633b89a781e01f4634dd7b0323ea1f38184e697bfc39a1299eaa278c39a2709cde0a346fea53a61f211112450b318d137fe68f6c102085aedabd2b045fab912da5c58d8019239f3a44b18f4fe30c5352e2e2bf030334a1dde1dcd23178636f1e38ec9e42102d8c54df0b94b207e804eacab3edddf89fabda6c8e1bd4e17ae31a57716c679ee8bc7de4412fec3934c6f3e8b4c1d1447dbba0fbc775dd3258f789ca53f1593cadc710fef6fd282bb41c0468ede5ad5b914e4758b4148b0d0c04c75ff6208ca3e79d92de8abafa4ec70ea7a4e454f0759337ce575c4954584e2bb8444c34e823d27b025d25fc9becfb4391df9882452bca0373164cd76e9af316df3f5bb7532e22557b485217254d5ab72ce349620f03758219b259784d4c9f1c7beac3cf08e624742e768b53b3d60ad0b94442c847b84a516a93d9b7d068c44c43980b4c7e2fb0ac964bf05a11fb2adb4f6d938715dde88061b238321afc7e5e84799b02a94baf3f879f89a98ab474ca12085137d639b837ebe069f6dcd8456141d063eb1c032aa392a44d1d58b1e77aba38a280625ab84e3b123507ea7a692c4acd1756c031fa52d637703ee957a993804c13e296cc20c1de55c9b8c032e50afffc51c02e5c12f48383237cdacd005b09243d9fe05e51cea42b77645e5c6f4e48c10e671d216b90a48f0d8f5c1dda553217f5126646d11a62587eb0a4ee0efdaf0d54bc2eb04cd34f5a529b682ce09a34d5acab2c8db58ed6244f7b024e68a14bcd5d7a7daa4dbcf490485cbd38e6f20e839d2b0142b9d766f9527937bb1a737877edf6122ba306bbfb5379243a6b22bdf85dcf3b079691f0e90b28a4259c1c9d8a02afa5b5a661a0f9dac52435e7d22e3591593d37eb2e10f646b51be2d1a96cd4490289ef642ad93eeffd64d7cf830d60dc4a98c768a9bdbf6ec9923062ff04abf19e8b65b95494a9420971018c7e6268b8fb2021a4ddd103976333fa52389643c711a980664e29a8479aa9c4091c2cc2074ce3ac1ab4afa217d39c6a1", + "c22add33457539a957d32dd07ec9110f8cdd2f00ab6ac256b4bc7732f63dd3b867b0ecac262555", + "e71f9a3dd457b4064df1d9055889f105af175a2d10dd7b8729da0d0116c2d9fd", + "7df9824e774c5f86d83cb5d8", + "689683c9e7aa9c48b9fda0cfffea0458ea0c3dedccd21efeb06126f1194780917c9f4f2f44b1daceec3f6b1f75506f4169bdacf12c1f65958784851056fe0b4b42a22aeb043ab35ca73747346ac58c550324c4b849a404c94b8860967b6fc58aff25dad0556f1952c045b91f56ec8eebf6f552c18b2a0641c037e6c6538b289601e1fd5a7bbe7b6e0b224124fec341bf77615183abafb52b3e30082a0abfc2cf224324338c132426011d9f800b382e6b834896ea48a8247f149d92ded7e69c7800096076cd2a729a1fe41c70dafb1f855ffa2ffc27b93e2f5f6827ade7118af60730033675d84de9cde6c260d3d615a945dfe0ed25f33b6cbd2c0e204ee919219d85c7536f4700f06fa61937f8dbbe9bda88db1f4ba8a8d195cd385eec62edd9ce673880800be9aa4430e5c10a5908f6dd349af70f32b32d8db38a7d73821af47b993b622bf168565082d07e88fc48231a440469adeca59263302438ece96d89de11cf8057454d1bfe8e4e36965a4d82618834a0847af39dd8776866d9558a5cff79a1cc9d1e3c22e050677e54ead68b3cf0094daa01330d41bb66708a8bbb8a196fae5c77dc6774629d38905e81d97c5b16d755182f687a8046e55d148419cf9c12139fee50c0533b0f04a805723ce1ea5595fca5b668e58f6b3b396f438308372489b640317cfa3a79392cf6d1afdd8c3359557a83790021a4eb418fa189ad15ba9be0f74182ac76076f102ec171117a3d16ca20b4d200e03e54f1f0ee6308e463a148c0c85aac3ccbe5781cf45b53a313f7c9975a45d1853ed9104a860c08634a8211b87500b5ffa3d8d9d56f22256d485b9b45b24d3873159adb8ae25966cc40f164f342519e88d1ead1e711e1b2bbd4be64c7e83f056f797c2d3a5cf7c5025f92be5637fa7738a1bbba55f761dcd1451ce4b1e85a6628b629a2f7917a86363b01516472c0f8614abe2ad1c9d5501b2a44a68e3eeeb34a64541125bf49138bcd15b7c82dfd40708414b85107d8b982c4f99783a03c707a37787a91a7198063f0e8a2d52dca61755105faaa09c063c7a0849570cba1aa7ddb3600eeba602c7e7c9b90ed00ec731d4d1d8e4bb42f9e9db21616c4aca48dc27b939428834404331288f03c2b5e887103c51748d0257519c3988f6492eb70cabbc2dd8a8a910d737a678d0970ec48bef3b81673bd10b687b37e11d49e7cf90c03c54826ecd833bfd9dbb8174274dd45b139d08371d5d248ee33298193194734c5863adf4bca92bc282bae2f47da5201fc240dd0710a22a8d922faf92c2071a7eede7ee17232d3b6ee5f3ebb1a8b230600b243c860968ab427a5f540912e5e7bfa0271201f288727f2bd5173539d5318e5c1c0a71cba4d9501b91c3bffa7bb61b3713f1751efe94a66e17d2b42da51d13c3df40f4db988dace42a6a1b9d138c4f590b7227990711afbf8f56fa63f2800cc019bbd4a7b3a0983c9b9e5f77562dcad6de96e3b2eb85cd99d28a021a10d6734400a91369236b48ed68528afc68f247d45c79318fc5d634ecb0f3ef8536d8ec2e877adc3308be906c5b96777d0e05970023e5c5dffed12310cc97249e4b95e32451c9acca8394fde699deda57e938bed7167e62e2cb62357f82fbe821ee73b4e09c6e2f512515412c2f27805762a8493e74a3d30bb409e499002a97354381318af28311ce484bdf7c39db53f08f73ca5793945e13fc8c66d503fa95506b37ce134ce2945d75b424ca6367ef4ed47b9cb8ba7de80e773279bf23ac888eb105385ea958b1b49b27c8db6b1e14a5c8ed5d28808a7d0b6bff1a58f24f9c57fd8b8f477a9d1365f89c698b8ba923896181299d474b93e05d3c915b10a69e61910761a6d8644933c593661b0828afeca590ca18e702322d9140d98fcf836c2f7a4f72b59eb529823a52ab05d919c3eee4db2cae1067213c5070450a160fd52fa44bc9bacc5c136701cd7adb1faf484da376477da08f6a4dcaa37af47c7b026c2da9d5fd0b30741357104cb2bc0d3cebd132b5fc7c873ebeceec5492aecab95ab393f35b93b923d2ca071e6bd8522c3ad8598a05e96646504f1620c045aa5734d665acbdda0ef73612be4ca4d95ba069041e042497f7b10445869989ce30f55206a1feb4e64890b7d1f7e9df2e88a352674a52ae4267c06592d425ed1d88101cf94588135892218ac11f3976ab2b47a27f02eb887696c94b13d48b4370eb11222274b5513a0fef905c66d0c1893832ffdb9b333178b65338fd8b81094d8f86f2e4e96a47e72032cd6fd47af87eec295c6e980f595b57f79abeb4654c4039fa03ade732b1e579551898b801ecd6e0fb1c5fd198335834b51673d074a8222640d2a969998f5b878bf897fdcf3426c4e24a7c599e5567643fa79ea5d20e7de581a873ee0181e3632a4e304f9dae09a81f882d4061ec17e588793b160c93a926874d5a8b78727f88de9bc125589a9562db5bb1c01012bbea1b2eeab68877871ce83455db43cc48455effbc71c436aebe362af22c6a319d134f65681c4d0d51f9aa42fb20f48ae3f7065664aeff5d8349624a5d79eb0bef3cbb2a1244ee445f560a6bf7a796b2c950a37dfb85ed5be11e8e305e835c9e077e676aa5ce23edb1f74806278548e3fa35059abc2f032289f9bd76043c8dd1352b6131cf34f66bcd0e7f1d13081f5b08ed0c69136f3b7ad8e05e9fe99a9b73624095f96740c1f40074e5d92ffeccdc0f15502082fdfcfc97a800be511c22b875f2832b2b891cb1aad2a17c7bd0be4427a4549404172f7c14d5e425e14498237c26a7813cd8612d048703cb180f1a6194f688b4644304950b078692faec7a2a5c5bbc482f3a7e8ef2825c4c19032a7a79a2908ca9774c6403e6b15625c485f2dd078902aff769dfee2dca9373704bf63ad981b51f61253910fd48c49ef10e3938f35ca8dd491a8e569baef675df30367b093f1088ebe8f876191dc32055481d074e5e47a4bd728efaea9fee3e83d8556255ffb2fa08194bdc66897d97d1557186d5f873169461494a83368ed8065b9a033fa4c2f07f7c60f945b60479e3c89233d58f674c0c6fa5918150bae0c6de2b65a09ccd490e2ad8571745bc37e70982411af667f3e8e9b9f7f75d863e5fef05c1f0d2acc7c86585a83ee32e0a64a9e67e75b80def5bfeb7cffe6e6822efa7a9cf049689b58336b081c039696e0fd3b2a2a6b0d177c9b3f8fe5cbb1c69ea93c1235b2c5b6934f603127eeafc4ed0728161612acdb2ba894a5ac376c4ef1fa8d49b4722379e5cb39752837395c413dd29a2a88c03849b6fb2221fd85ba6d5a50ba7ee9c09ecc5e6dc66afdaa1b021282cadc68f19529eadab809341187d57cfdfe01d0798ab8a94277b9b868612e575bd98f70de80ebe5f57637c511800373262eb5ac3836b03808ca5d5f732f286a5f18a7b7fb8cd8f60e4debe54731c9c524b84694c5469975443964ed28ccff2f4e8e0cf4c60c1c8a092e986cf12fa90a994e4f26ac89fabe8a0d1e27fdc00f1d3d3fdb73bb76809f93ea113e336cb0a5438147e454e262fbb7d656aa1be1288839bc342b48ba7d0e72c85a2e24be1a97dfb2db85b5d850481e62f3b11a28c6407686e73d550b9f1d0f010602e82af26813d2484a8db2da0814782c8404b2865abfbe3c98a07ffb37eea6de7992cad73a9b81ae96a9acb13ba213eb4111d868cc73b0432d2b6c2d7e0e0ca7ccbdce86d01576e1136871a07c76498eae53fb7ebf2e85fb8561d10dfba740400ef4495ece7eb33ce3bce26344eddd88cf1ed8028ec5fe8e71edda54dbdae08f50f8df6295f6d7ef1163f62262a200456a7777d0565d7f5832fcc7ac144b5c3e0ce3e5c9b7f880a54ed5e80662e96b356ff58f2e372b1dc0d73cb8b96c72caa9e5dd312841a8be23f838bc706d893e1a8a48b2c069874c293c41d00226f73f987aec8686046ac4c0c972c991c38b98cabce30e7255dbf16039b95dc7d103fde630b03441b15bd2c214763fece9d6778d1c6354d2c9478c226175c02cb006006715fffc879a6a2b4111f6234ee330d6c84d453c9ffac08efda1f380110a8ef8c2fe44e2ed644cc3e0146b4d02f76586fbb6d69b827be38b9add444e2bac4d7165007cdbf2ea8c4b967fc1bb70c68b229f19bc3f79cb13ee6265264885f04c09a96583f331ed46de3e5dcaf08313ba6053f3d0c1916a0f", + }, + { + "3ab6cbeebc18df951d371e0f3cce2697fb367476bd9d50ca9e668c77636eeb9d24b68be0ce6a75eca194fbde6221755d57e9d3148623de24896a9becd98789fd3d14de0c7e53f81fe7f3fd491472a66b5b797fe19c5d0525c7a111a0289a9e65ae7c712ccf694cb75c490070bca7db17205af9bdb7fee27f9ff41fc78ebd2d3d399e690908b5c064ffc0d5bb67b0d2880bcb45c2ca2741691b6131aa1e5ee758fc50610406216905e13ec049ee92d1f95e16bc283dfd91595ec2037d20ead51d3a362140578a4538c80581b79852b0f6686c1ea66aafffc872024592ec1aaf2650d167a75bace024b261db4ab48b401cf85ec2620dc12a7fc37012af8ac1d6db923d82eee962129bc4ede578782594708357d29118fd10dc6d228bf7e461d2769e556488b776237b6309f3dc2e884cb2df1f43f71c53d389765f805ac053d05fa835e75fab0adb0f13ceeb425637f43556372d728a00fb005f7c5a20cf2b7f776066d60b70b11a848005c6d63dba0c93f139067b39017c997dd6b94c0138c3619e9a6d0e4b8792cb8d58a2ca12ae5d03e7637f2065fbb9e2d1722fd3aaf234488ca157d829e9a3b642458054f3dd58da41d7fba6d2b488a327b776d1aaab1a364c710e755ab22b9cf7abf1eb8949c5ca20c070f275f8959cb00c6d5ab7879003f89f795351a4ef4850e033d929f9a349b9133b2e0bd1cabbdd381594bfa697b845100b96b5fade05db12de040b814ec49489f39f5abd5b37f570cbb516636d5b7378f12872d02d4de20b52ed8ca0b12029a4c084621bbb578b870ca2ea79fd5df1ef8664bfb3b1a1bf038e4ba33f6ccde42c5146470c9dd293aa747d2372db1561617920142ac1d32e4f1fd18e8b9e72b7efb8fefc56d08f00450d23b7e8381849b1385ddcf9310a4850dbd6db7a4992690190655760f557a5027b5ceab3743365ac9041a5c14bed1126c4eca00d7e0a0e0e6f666f64bd1466387150ece5835192149237d5dd25e703e9d3a4f652ae04601d6acf8228e4e86055394c3abc9dccd02f04a60c298d101260b408b2620c137f77e2019fc6eaff1b234c56dfe922b0192656254fe3356143e969f64b7609cbedebcc8cb2b68bcdd9d723b9c14669da6cbfffbca2351de51e87db6afde435ead0017682b8014f91d9734a9ab9b374257273e114a8fffac786d53183ba666d8a67e30c1fe45bb1bdcefb5787afcbad213f8e36e78d30ae1305df96bf450349ade655cccbb17d887f79e00728abb449ea427fd2d0af80e3b5607a74a57dbe5264131f2fc49cb74415974b3d43ff872d4106ff11b680f56be06fdf85ec9dd850b1f77f759337b9a9ce04e611036d3f45743e562abe4b959eba7424a712fcf7c3f3773886aef22f7cf6168efa83cd3ff70b9521cae1b6689b2b8c423d883a007bb138025f2a31db2147691bcb365ac242efe40cd09a746cc501ae0289e80205993b07f86538d486803da14b74fb0db6ebf1c2bb8c36275137d654c1be56c65891cd50f705247d85621fd0d61ade8c05cf4ec15b84e8adbcbe017d7d5743d5e91025e0154a5d9bac7c6b8297490e9c195c5d74e046219c042219817a5c56636c7c4382c6a01d721d88f4b4d20250eb5eae5f3ef481dbf8a3f47a1d51d080bd4cc33f12645c8481e57835b77a85a2d83301172782f22026e69a43376ac4f5b78734c9eb914e6c76c6a12d4127cf195ad030825322a279093cbc40a680355d086a27f3fb7560713b019e7c286d96833dc60590e9a709f2e3c632894668e74ed20e42cd83a23ebea3dc3bcc49d14f8697541780fb2072dee6a5672d0d4e7bdf5cbdacdf5fea9e03c6d9cf0faa1e954172acc26dcd344bb3d9b2e0e6015cc55d19713d795bdb7c21b44b305e69c69fdb7261483f9693f36f45d356462f1ba4498de1c2e8bc3e0a70893acef2006dcd73cf15b265a8a5d4ed792a34a846d8f1d3b9b3bb75f1c5e57a00b36c00203973ef4e2654f6cb29e4445318ed99f0de6ca992281e83ed03feedb66aeed6a461c6f2871ae95343cd9797e58430d5639d7ef5c59c78b29f76a055e18e2b85eff177770c60ca4f2d61e612e617e749b4653e7901b62ba02dcbf50e59219349120ac01e6b8a6e98eb54abd16b921a1ff85898f90fc49a3c8f8f4ae9b0dd32c3e7f2e1527c4feb67a496390f28532f20acc71abb8bb4f71b434104f41e36b705289858a4e8430b8cd9449b0198ca2244923cff1df0f63833373c275572de5a9a77b23e5ff54aebce8e86d02651f26ae32e69001e5f3951967579ebe8574682cef8c12dee0b18bc999f8cc0f07e2ad3ac94d3caf30c1c8a8295756aecbbecbbb4ade8a2b8015e52a0eb1290693c6316d036e0c443fc4ec591c32f7e7f1b3933c921d5812233d3c21ee5528822b59ef2ec7eb62f7b04f40cc8238a473ec37a07e54f8907825ccaa1421c2964d2c756be450dedc011e1cdd9045720421b9a4a00e9d3076c2fd10d71ee36d5c0fd2c7e42396b034a4cd0245027449242dfdc42c8af4a34df1b4150097726c9745247b78bb2bad5fe8af94eb13ee1f41dbd36e56d801a4c9c5b9ca5d3c26f4714b6fe9f69b87567426eb6f4ac97e8c9541eafc19fc90d3b24aae0f76c4f3f81063d206ff695d638048c2cb023147a78332939d2f2470d16f1ed0e5d3d4dde438affb2809488b99815e54938fac3b02deceaffde310cf422f9027f364f5e79da5d2b5af1b4138ac9f9d301f396b220829c1f60cd2b54ef24576e5ba6ccd4802900db1bb4eea57de7787eda0e30fa90cc19f099444488699bf7c442c398c2ed989d084c8cadc97325484e337848c34562b3dea6f7670f935ed3d5216c970e04351651c1c31a34e862821bdbcbde202d91fed38965e31cc3b6f1e52288f327bd0a787ecd92b3b6f535d1d000b0f02d41ee01ca54e4e6179ad7fcbd60f0e41dfa5c9cc7ee4f7de3844fb385ffa3b24092b30be697f1fd32c9faef29ead346e42fe2ab1d312901b678b43b7758edb7eaa1c2d038b4cd6a7dc759a6b12cec955bcf4179006a7ab6e22ef15986df107080d340b8870e2304d57caa87a9961c04655d7d66c7f71ca9260e02aced131d6de65d256d6b487141c51bc86eb1e4721742f07d09e799b30da7b5ba94c8d701ae34271ba06f8ce134a7a9a2598d1570cf05edd9ec868cfa2e41b4c20a8bc4b8bfebd45f5a60408f08e931617746d1464bbe1f3844ab3272ede635f771f9af30e483903ee4d0cdecbaff4d31451e7791dc97c92042fb932fe1c82652c1d682a55912e33de3b1299db076cef594458670dc4f911f4a244e2bec757dad4b0052a41235e2f5e60b929682608c16a61287826218a1ac3cf0d8286555d5b0552754685c365d4342f0d9c45065daf6786179da791a86b50a5edd6fb4b21f09d9747136aacf79ecbf52b00fb88b0630ec7f0a6699901ba4eff913a3ab33ac85a71ebb51ed343eac86eebb3e79c16e664078ccda09e77ef8e0919b8cc447116b65ccbd5200fbfe86e9bac5637b33c9bcac9596b57c14ad5da548e96a8ffad5f5c69247c68d464c770011da7b45a337f138cda6b4e15311879bfaf12af4c61fba596780e6adcd5dadde372823da6014122dbac70f0dd896a8d387d3c74df282a659028d06cfeab3ae22dcd1fc3ce60f69a0d678aeae0e5681952949e31ccb8975cd167c9d012f4b230b1c1f47022eb1a3042951b338a734cdd17db0ed483a621650deb3510efe74191a94611dc212c0c73b117a73b8ae41892cf176742bd98a7cb73dcdc53b42df56d640739852335f8d44d901fc884286b433fc285fd5b3db8df0a8522cea3182c071f559c328b8516c9252681a94eecec7ebf626c0a9014d9aaaa0c694d14855433dae06656657d1f8a939123d28e00513d72bd3802d211ad7c1e06b9228c0d5656edccad5339bcdddd5e01afdc01f10974be3187804324fc513ba583b7b2da1e9096bbe3d078c1adc6c34d92c54e9c49fccdc17d10e66962120ee5d9b1cfe852569436270cf7c4c3bb12568050e2ca4db08bbac16214238413195dd4d936272fca5d56d7551b9b002df1807ed44abc84c66746387b79bc9e830a635c308a7bfad7c2c22cee6d3d0c5ebd8b230837b7ceaefdf71a67a3a8eaae0c36de86b2d96e759b8b53f8b8604775eb7a7e13223cb21033dc87d775628581a954085c2d66c1c8f225b1aa86091061738e7495cb36a5ff032dc678904bfa39a00285cd6947865b6d4805e3411644b4a4c94a6fffe05ef31e156bae6165d801685dcec195552d029d22e5de393a82ddf3cd3de3ad8cd6bba2325a03982204f07fc3c21518ef17a601fd743b27f7191bb446ff61d3c61d7608777990997e911932532e5b3235f13423756f5b6c786720cf6682932c90092", + "50772c5a0e156ba13a9d86edc0e600021d56f7d31e7e452a74ad53a6775339c7ca6521d87a8c79b42900a1e9e6a1ec03f7e3d615611c3fd5c9927c40e5b508af1a298794b60148df01e9c9e78ab5ea8198c097fadcd6cfa6694be64e00eefe1a1885aece86f6ad87df766e692b58ebc41982bef5", + "93a2561a9904a1787a10e2a668cd6a814f2877a7b512698e94796805875c8d1a", + "588d9bc1d98210d9700ef488", + "165d8c9eabcd5e93e6eff7be122c8c242e1a7f284790c93324f924efabcec4a4ce48262011b7360c2833143d645ff295453853c92f0c48c6dfc2af7ec58d9bec0d13239c7e5593cdb39d49376c6341263df80c0ed2ed79fe9899d0c07de93f6ea95a5dfd307e49bdb5672b158a4df623ee86d54cd1a0fa9a60ce39d1f5f4b6b0ce9daf2a61a907cff3bdd3f29156ac439638e0910d728843ae17ea7368814ad7734732e7c023d4954e1cd5fd19fc9b76e9bb84b61dd4371478917757b14b366b4bfab4eab0d9de746088ad43d8742e2b9e58faff15c2eff084df5f4316111d5dd7d23cc0b1ee1000253f26cd260aa636f03f64a8342e531ca1515b3beecc3ee07a29184988325322d5c09754c278231f92c0d980adc919d4fccf4a1da1d37f1ddb58ca997d6d700946199fa007c43853b6caf5f8049233584087fb23c3952414ac487e452f0c3898486d04e5b008b843122501f9c8a294da9159a04119ad5c8e9f5c211411e34559d3a7bcf2ac10e0174f94f3f2968c80ebdf4498de172884dbdad0acc3a887f9bfe896a6004d54cc424567d53f1198ba33c56aa460edc6af0e437b34322c1144854bafb2434f00703c1992dbad0ceaa0616aec60a380676ca11558cece57a936959d6c2ffe0647eeffd37524fbafa9691f31499701b202d9dc9980e79ea517089eced779aa45b522c9ad193e63ea8b64e8a942f630d44370f23b7e9acfedac51dd9f139f8806b09a8fbbabc76fec3c3721fad5087a6d41f93973af8d787d8bc74a3122d99ea14e2f30a3c90be4b695c8b269784eefafa52d6a79e785eb47a23d72f037ca572b7029d2f37baabce57658119fb02c5b659e3aadfe0052f1cc3c0afc6fe4624533d9700388713945c20c1d175da53738fc73f48fe57fef8305e796b474b6f8d3fc5040042373a13384237d95bb045ce0c20934a964a8372acedfd6e559aa84180a86311a3996cc17bf7f73e5d85d4db2529989e5836edad490aaa5f56d17326825aa20608fd209903335de4b36b79f68b6a52194f6ea8ce42570533df650e65b50c367f69b9f08c32b3ce3e75318106b8b2c6b6d09369c781fbf2aaa35053af215b621f833814ec4778ac683de0dc22c418b077a917a6e405ccbde9f72ed523aa696be1a6f247b096b9235217bcf19b88d43178cce5a7d82335fccb4c079e00280bfd272b9f16ffefa7fea38d09dfb2e4874553b135052595812aed3fa15096abf1eebf9abd598289e0d156974de4c2654c60825d42b662ca7439816d9d3a0255f40a4965504f643f029da535d4b109e8658ec570e99859382ca0ede0b0495d508c63c7f1eff3f648c60e9b773590cc663a751178ba7603a11985ff519056661b9460c1aabc30e83bb0073a927682a06d1b8050c345f7920c1a37546d79587fae2a92c803a986248f90547f0b6c0ad0552d8260d2a0dc3cc76d092ab76b8c12f05dcf141167a6ea300bc23227933396ef6fe9d51a1ba5a754485950f06cfa6964db2d0fd1d4393cc36f0592fca25ac1a6aacda2a32f548ed20287e3d291661848a62d41504e4fcb1cd1785617fa5786712b3005f1a1041733df6cf838ea3ea0b93685889bc6b2857d80a9bc0e7a66f7fb3d805770402f049889311fc112dccc72a25bd127777fd87bf5ab56d39bfe6be2b45a8301c2f324dcc50b27540200d522c24941701f7293b8877ac84cf35638507c7d912a3a94e4384b68c507412df65d0c4ca8ec2da704bd4483eb2e0d13b68c0c2b68c106a55b9710ad0a1436d655a3cf3c419d5e6f027ddf5dcfc896a5b316a7dae9290a7bf81aed539a647c8c98e24e7ed6a4f7f00a11134ca715e5826625c250500f8f16b40de048b095b5dd08268407f58a91c86c36ca5a2bf4f8fc682adf1bf601da24414c74956e1a8fd2888b5260e980c32f6678a4dc4ff73220c22593d23144b84c2ff56920342248876d15ea54fc100c09a81b802dd15f030bda9aa08727ea49e34f0ca8693e0a06d0af06ea7ceddbf0584adfdebeb20510bbac683451d9f84cf0f4e85c34d979e550e07e7f414d6f1011cb3dc28d0df6d4aac113f2d5b04e4486ee2cdcd4157dafcbbd55e8330a7176d1b231d9f47a63da9ee30fec6cc2c5aba3a8c6154f79997af89d972743255355647235ee939f4f305ec655271e0cd562ff6f401b86dd5826c769298445108ad0d9e13c504551f74c507436911331db60ef0ea99dc259b13cfcb0596fa9b3c95cd7fc3b1611e3b012b6719afbcee7548939676dffc372276aecd08e6a14251407cf995266545427d49ae5ab245cd5d534c52542fc71b3973f0b766f3d234c8baaec8b74eaa8ba90abe160b4504769d02e08d7af4e7ecc167780c619cefa58865169b674b2b1e10d82f6560ba0be41a781f4afa46bd722566d941a8e6f87e4a5c03d89685a22a3470354f2922e2915f9d46288a5e8896ed13617dce694a595e379f25fe621dde8ba73d865976950954e5bd07db147a0fb74f87cb06aba49b073942b82fab33a878651df73df2721ef800b658bdc6c359d396f684598e93f38e79639b8736b02dfcc124fb9fc199c35f2fa1d0dc39939c57286e58a7deed7b6c76e02b99a14d9bbf11f65d8eb7fa096fe4baf0f78cb34736499a0ca550f10d7edc8909dc34b039e3abdf1aa67a51d37a2eaf4c07022897d4d8355d3325bcf392d91d02d462488ead90b366e9645b956c3802e4249d34b5b2b2484a1dec15a9477821df6bef5e1626ec5ee9832fc3bd0b63a3c4100d32fac3e9085f0b5ba43123f54beaa7ccbe6ba68231649f35a28acfcbbf97dea2d6cfd96025032b3950ec8437108d0f07baf1bc89e3afbc2cdbb5031d3cd9e20b19018adda466382059229e4c8c54b455eda4280bde43b36afa96e146e408c7104523d5f565d22ef86d4c7cbf9c6e0d0b30e37b37feb9332939c642eacfe19d0dae1259d3267635051ea5f9b518dd74786e45fb8bdf72cbe3753bd50bea2a961b49cc0e2d589e77fd25ebd962463fc728b1d288c38a79a182b124d345872afbcfe792d259e7e5334311244edc75d05f9a12eadb61fd3ff79fe8c097eb01a4ac1f0c339d3be74be3d96b0b6a15e8868d043a0f2007ee8aa51756d78b7a78ad90fd9a26afbcb51fdc20ed7a3947f715c833e363bb87504d8efc9f8b93a993e2e26430f79f3cce203b09093c9b456b1967212eb0db4f7688d4dccd4a523866f75c9d9e7ce07825ae34399c5607a60b771866a647b6d5e1e20795ca906e451f367d8c40ffe79a2cecfe7aa47a402f8d49be9084661c96ebb11f1b48e7e8abd2978ee626f962e98f99db4eb3c6a52aa2bb2e62194120ce1e773b9db784e8c9b5adcfb70e3bd5717293eebf014e9872c5c1bdf3fb296cb88eab5e97a5ac320092033b49f37d840dac23021c19ab2a89190f3c8dde927f6e6b41874bf71ba7747a616682bd5b3f17a1dad40f4993a1b186ce4f44afb4e36af7715450bac62cb1527eb8db1d87bbc4d9c99415d16660e48efd911e02f5777a77e72733af3c3f5315dd0c785d5212b79c46c3bccd74582c57cfac0d50fc0c85370476913f9d8e8e10d0f6602f2271994972de49ab1a91728713c3cfcedb0e61c270b5fb331a980965bcfe10b41251a0f7915d5943f49fb139626f1c424524f2fba3a407e77dd7513669894fd09fff4185fbb997b4e4677f6ea0b52892f013f1691bdb38eee9307a565e396bab484d91cea9268f49aed29e319b0add900b6a75f7461db5486aaf5366f98df05674361308931de753c70777de73337a996f6d4b0e06d63a69849ba7533bb0e446f062edbd6250e61a49f4120f84efc1cf74c1bd30cc61a2d719fa76991dab119fc814a7c56f48bd584c7935679c53bb0ac78905b5d961fcd89a4b567d17a5182651cb07146aa9a94972ce613e8ff9c878a8433c0244052f09980a52d800e97ba65e8ac186862def58c72b9feec91266e26aa5075b3337c7bb8716b3acafe666ffe2df32b78f9995661d3ba28f8a8780436aae1da2a3e6a0a16dc562b8d5df6f68391aab73a10508e0f55208f974a0505f0fc0d8a55049a7b631fc94fab91459ae1f199527362695b41972e50faee34c5cca9e35e8682099f5e9652f88cfe9fa990ff2154c89c1c2a4ed6bb8a889fecfdf048ee0aae7798c55d6cdfd062cbca97ca289578c832d658ceaf26faba54c9c3ee9eb5bac80698c1441b9cba287f749a5e30d5cc715a01c89353ceab0974ae77fecc1d2dfb31a5101783cbc002c73cd155dfd14685c2f9acc170dc437c649b6b4720b676848a7f9b56cc4787eabe72f6e3f2aed776f9bb1432fba93a63bfa44fbcfcb6eaa9ef4b79b32bdbd68cddbb9897cf5a02c6f99fc765790092edf0d5bca7c55cf232a03fbb6f3eae09b12e09a9b49a538e0589394700d16ebd3", + }, + { + "3497e8d61062e6f2084ebf72d00e9a47b550591edeee9746f31ea28039a1646d384c4348af293ab778f92a4807c48fbd14e8dbf3d67339c991dc4aca7dae38b5fb7bfeaaa538611d328b653950f4f664dcd257b345917cd66dc6a1ea75d99f70549d1af9d67b1608077b41576f38bb4c0a13ff4fa47b251142c6fbb79f9a27f43841ed0ebc0416c37f571aef8fd63b99e93ae88db50e9ef7d499ae7433d5686b165579d3598f96d9e7b1c876870310703df8fdf2069beadb34984f676eb7d3840c4c5766dcee3fc39f0739260a499647429339482e232362bc72c92a299cae36e9069cc5f4db8893e2c1b9ec0b4f334de26c951090b9724c2b3b7655d8248bc12a27861e020eb1e4cf6ad0dab903279b6fbdabff761d4ba159c1f631e681f210a8782faa86e08e554b5e30046157a0d1144bd08a691c2cc2dd22f3c3a4e5d44c5d03f7e3e385382ee4683345c0d316d41ee75f87038b49e0ad3ca45121789e7e7b95615e1a9a8dfe02c044c2935a97b141f639448182252ebfc980e0411e5fbcb3c01acd5aa7cc5d67101ffa6ab6acacace5f02d67155c26dedc071ffa66dbad26f67a819d46de0556fdffc1b4ab6d60905d8ef873ea1e51c62571c08b4c6db242e733e02e11e5840ee445c290b2232010b118839b37d4615c4521e8928e9ad475cdb4a3de9928ec7e6daf0e20d22e308347b31e7e877fdacda0c25f2e5c33a329e84707816ff4ffdca30dfc753c2cf883df16016795db34359e9363fac60624ae4d2b30bc1f2f99c23d953779c22ffca145fd08dad83c0f76cf727196799544c6c07483e0a41ca2e1b1da5a730956154f531d292b5a39a229ab13bf24a804eb68786e481c8aebfd3bc557afceadc41d00e1472c3b80ce652be1245089283bf1a1a93abd3325bb6eea121db8c0e1d6c0c31decfe9dba63c89b881824b0531651fc500f2f75ca9e5fdcbb179c9ded5d600a495ea704c2709f4a88c4fadcda4cd82a5b089f25a6fe0161159efe03fb5e0d44bdb5487f25e8c9adacc389860f62b06a6a4f8f104d9171622f70652ace736e8b28b70a4d9fd3fa4b9784d1a6e6811150d0a0601d31d17f6041e58a1058f99b80b0a6cd4f79c79a104b6bb731ecc881bc68e1d99ab358faf43d8504957ea0152e46e27dbfaa17d0f58287276e4fa82ab78a03513d5b4c3199d1362e4fd6447d1c26fadbd011abc69332ed0181952b391f2e8a5c89d68e22a7c451f69a9573b6bb6d918c7e3d52116f3f12f1d43d2af46bb450f58bde1732a268293cfd9cf2b90a844588c1979a30d6ac21aaea4b9e5500ef4a8bcd62bd70cae6acc8839f818d23c615e45daf14335c36dd46817c9b816be60c3848caa812b055da33f45bc01721d6fb7e850fb1e1458f27c70bc34876a955aef11f5703cfacde03a039c3b75b99b2d91fc18b00071a28ce25eb169b946b49858aa0885a4c665deca020a3fbba55d4d9175fd91e7901ec9eec0239806e8305f8238e5270f4af5c94d0008f8a5564636cc33c8a3d3e76db2a7915abe798b0dfbb3e322b33e188c7b188573bddbb9e4a7edbd4bb194b9743c4aceeab449f8affddbc2b109eb3d84f3b2f8b18ea2962680437241d82bb6146674ff1abee7baacc38d5dcd688b425c3e3b0dccdda3e36de755afcf7155d3d7cac2e279baad167e2a743b82ff8ddf3db8ecfa9680ddf468339427a4e9fb8ca4ce6f1e790c24e7269912a9989088c65965b0efe68ed44eb26876674261e3e72042f5995f1a7075b3932f4c23a8027d0db35ce4322122f489995bcc0b3fa32b7298c4c1b3354766c866a2fc0ea5690c58c5e08ae7037f70accb3ca7faefc37d78883f2bcd768285dd2571dbcaead813a0b8ae87cc1df868e93500d414c4418d5c80b919f73b9fd46111a02bfc884f9d30ee14fcfc1d55d54256b9572afad4777b8d8172c911472a22e7461f6f85aca063c19d6fdef3351149ee6864e93cdc54ca5dc7837f0ead91f5e3b155795df5dd1f933cee8671ffc05058353995019e5f6f55d2de6470605a5411afcd7fa5aa8f38d77dbf496d7fa9c5a4d35ab661aa15c77ce42bed44763166160ed5bba954e470c293ca301363f5b837406ea8ea746057588c34acf266030864d8c40e2da88ef04c49205fad1607d456767d30eadd884359bce04c12e35487bc1885d9b104c9fd4dea4ceaf054cf46cb3c77a619ffe963acc9bfcfad0447591ccd32cdd1fccb1fe7080ad75cca2e17f695ce0095a774327123f21e2839773506a9f2d896bde87dc5e35512ad733aa408f8a49e9018d1013cc32f550c968a03308cdbc73ab444f0a79a13450d4de906369da4c6a675d7e338f738358dc238be4f047579c8ba7a60448da541cb9e57f22bfcb8c26280a59b77edd0f5a009a3ef1e2958d6d3c3372840dc6a0c6ab1fe86aeb7590137feacbfdc7da57c77595b8572b45c4677836ec86fd8c4ca8ac351397aaa3aa298d752754507e1cc514d41c3f1ae0a692179218141f65bccb9acf6244730c6d00829455d21371972745b3665f930cf2aa9f0abebe6f7b89094aeb4dbdf7bbbe794f134b6284e289c995ef2929fc1bd39b259259950de29e57cdec15c4a7d33ef6e689596a6ce23301d25c2ace77fe699d90c2329da4d0f471bc093563dc735ac2fdb32c6995606a67bc953534939ed1236003c004d3b47590beabf39a1e4d5d1b00898496e9effda68433da17d1ab3a32aefa3681aeac116c5705077552649153ed15e9d704e67d8819579feb02d91db0d3533182ff43ee5648f5cc9a595ded4772d61e77bd9bffd6f29fc1f478dea44c32d5ce3118bc8860b254fb0bb1e85223bf709a7c0b9a52fd3914f1b1f295fd246bcb568388dee43a32df45e3c798068608a102143b5511746903255b98238003eed68776b46bb0e64af6c9118ecf9896709aaaabefbc1f58bf45b45768345b560ae2cdbe4d7da497736da8013c4098addb4258cafe7823bdbdd715250b707b155248d39fc6773639e4de3b201fd3cdfa1526c4149ee7d15bbee680c956fbdea844b1470a287d430c5c7e2d7b51fa756720397bbe214c19df3399a989958732d93979e361f7266e53a59bcef695435db67cd8749d258e7d582726e1bcad1395e68d7848849fb6d74451a53ae6e8989c64701102959f7fedc6a5cf8352e218396f9181f33037ca74886fae6e57460bbcb71cbe4cbb3d3a81e2090434eb1d6d5baeee4ede251952ad88001ce047279cfe435a4afe97847f798d84ad79a11bd44f09222d2f3b7fdcc47ff8a4c61f40c4629a0f603193e0aa2164579a05726e547c9081abcc0087907f8034469f740a020e19623fad42e9cea64068abb3d6ff2f6680da328061c200e1f646816a5083786ae5b71728a0e5cee14d7a942379c389fa9dbc7afe7e7ae075c061df11e4587bc90f92f1b077c091c43a25e7b3e870ad852c2883aba2632063c4ff74a857ef7267816317f823a8bc5dcda311b513be3a40e6bdeb89210bece50a608e624f00c9d063e0c8878884e45527f50a3ab4447a9a01652322700f087b6f96ddbe96a68ef98656800eda6563015a6d3c0eb1b6a9b21cccd58cdcdd074b73e40a098a980210ef831ec9e881cb42ee07519fbdfa52d9c62766a2046dee7752f880dc9082ed7f050b49ed8d14307b1b811bd87b6db2419418e49885d20fd7ca8fb45a11a1da17ac2304393734b552b5d02a303ddc72d1f456697a287851f207054c18a6262f5349348c806841d21e11fd4e4ed9c01fce1688483e009930079f7d2045a34f98ed83256dec66400a783d58c61619e6e42f6e2c6e6fc69e76651b96aabfe643ac69681955ce595f4696b80dadd1f3910061be6ed0840d47e928dd93e7c3d6932d3ead820d06e2539d9a604a6b53db6bb599da851de7cc060faa9af76d708a9aaf371dbc3eff0fdb99702504c3006f789a49feb730cabe40745837e2c8c17c77f999333798431231b337357637a5efd1eeed891fb7475f2c9f960e67578adf50241287bc5599ee08d0237f08c86ed9b75b62d612a9353e48cb4cb022d78f73fba1fab7f794a5ff64c97e6c91ec464847a81e5a5253989a1ee54a41bcd9b4b77bae6e72421471a7ddf0136edc59b72402d57e542916ee47fb3988b7123c6e8debddff2df171d4ce61e83c3d41f36143c9df97f2f68639f1bfc2a9d1fe175fe9f45e17e5cfebb330d3f06e15e3cf58acaff09ea576d896359a3f06985765824bc499319384e4c458d4326db801c564b0b503552bdbec60752b670d82cc8fce9028ff24ade3e805b81a72701b37d4ccedd72118b20d792739e035bbacc4893ded88619a6c499f246311947e48684a35406c4ef279c71ab2a74f6e5313f7900080f19aec3a39109d4aa41c930c66c84cd2163f4cdd59fe84a86cd8bb6468bce45a56d09490e032da844e6d90b436dd874c1cd32a75d1ae1d3e86d8a2ef948649eb56dd7b360f55ba5dc34a12f9279945436c6fb83d1ed57ba4ae1d9342a3dc2df9baa82fc9fee927c13439ba5bd2ff9f3e6f577b8d2df731db14c51db8a14bb15bf3e125f1ca4cb2fe856c5a576cf995db5010687d0799581c5e76d400c1855bb46680a631cc582f51c589a831", + "823d0cd34e7450550da9716c1f456ce0cbc79431483a6214939266581b0e899e4c95719a09c1ef166a618289a6ee6971b6fea3fe380512cb977823b387ac51d341c26d4a835c61eebde37764d2e1d588df7886177e98e3151106c898b3196bf4dbd83f5f", + "a4639c22fc7f370d8500a53819102df5e86c541c0ca10e8f6564e50b90c28f34", + "34a04df283c45655a52bdd84", + "cd8d1b2e5f65ddb3c0da8f12096134da22ad4d541444964077610aafc1f77f8da5ffc75bee807541cb6eb0526e78d57fd88fa9d9608914cf391ae7ccb8eedb0aa711889f9b6192601163b271c90df5d69fef487b6c05a24fc667469cf16cbd5afd58fc830119fc9f61b26dd50a96ed84c96825a615a3aee84ea4c950152323b20884346b25c9e2a6be3a93505ba059fbb114c224bed8f05f54eab76b2c9c23a0fd942eef9696ff67484b542c8347f1b1fd7df7242872b3528c9e45030447b2bc85eaf191963291e4223b75778335e5f1256618ff87bbd68b5a9e5cbd2ca1dc8aff4625c834edf8fb0d879b1f75ba9b85895a6bb4d7569a41bb3be6cdd020065bcc69b44a8fa335d9418ea2d090d8061e042e8e1a6ac03a6d5525079f14274079734ed42c5c9ab9986f0fee6bc9ee6c485e233e9b4d6de70664902529a135a5675ae129353eb2c00b73f226e84fe8c594272d6eceaca28b6da30492c92074250ec80beddb7208f9b5418944305b0864009b3bbb3dfbfb4cc2bba3313f8f7c6c19860f1dc0f5d7aa06e3b551adfc63dddac980a79d72bd2225d54a87a93717291c7b78bdfc5521f7f3239d5564fe9c9559dfefe76b77efc2e75991f31a0134529a6611ab9ef076491f2d2d81ffc5774ba8f8009dd7e5881e09ddf5116fcb5a44e576aef6cea91ebf52c56c742049639392cfb8b280dc2229252e04d8d394ffafa539290acdd8118656e7e1a4f7bfc0bb689448379e8cedff7590a09a3f5a29bf819fd87297b96ca07431a29a07ae126eb9d65e21824c16707db89868e127f17614a536de6ed268b1600a8b02aac2bca54a09b7cccf8e184448df334f95b9f0221187d56da7bd422f09b4d94228098b563df53414a5a86728962a2ea63023d8c3f03847b36db7cd189ccfef3e623b14842b8cccb18b4f80f01b32a4cec48f3009b98ffa25dbad76089c8700e90848da74aeca81d01f4dab2b7e844a3e48bef21f33c92734b821ab382bdf6d0b1048a9866e676b78ac9398678ff626d5c173a15a0a7514b2544405dd54eccaa2791605c87d7117bc9f8c0ad84623a9d3a2b1733304b492d4dec38f7981db9361b03a2837a95fe937976c7f4341a802dbf583366fbe368a3af3f92618046bb55696cf7af1f465a5a57ec5908621f431ffc762f35abe892f772a60a3f75ad8401321f67981e90083fdd1cce40903ce56a629120d6e13c8871523c4d848664331966298c8b31a5bc8174a8c14f61cbe98ae7ee3e90bc832b04318864d19a9b8b6d49a260f42bb120cef9afbe704faecf0f428d917ead9f020f5e9d772bc8f29600f8a7623d8971c1e3c5f1a3b094191e497bd70f85de124137cc4b9fe0617cb73cd44b89aada072625e25976e7aaa5a8fe9d9e3f32db47d1565aaef0e84d256bfce6aedfa1a2dce5a94976a2bb9a0da95941fb7ed444990b0e0e87627e35f3235a998019650a5e5cae804ecab8cf729a5c712f1e7d17486082dd50cbeb2ee1b0be6a7bf08a66ab3cf1fe9f49c7083f5b8ad183f32fb35fb8a41230e4041bcf0e5ef54bc3d21ecc1fceb08d95d745a997e8f2fc3c0f6b1b6c1c02e03ff02ae0d879d13eedd42d9f9949ca7ebb785764162ceb6c6f9944dcb3927b2f4eab23ab566b2b2bcc0c7d77b82579e88203602264064ce98b5b1ed992c1bb13edce579ae7f5e11697b493749f308b33e47512533350df5c07c3dadff656197884f359cdfcb736d29231aea1524b56e06c92f5a98ea663543f67e44003f5b41907a951dd792468c84c5e0e1b46149a5c9751295e153990b78c0cc712889a21b299b0315150dc50aa3b4f7fb0079ddd39d263a754b1dcc595c76ea9fea6c120384afb38d4bd40491c4689b1afc9dd096dd0327c84802bda6bb6b7a8830bc6c06b308ae9665a8666a5551ec954eb72adb827ef38f036c51698a28c92dc1c9e25c267532da2c04c1bf27f5b683ac750c3ef53a8460dc186331549bf82868f9327422c09afe1cd15e161bc41a70cab2f973efcfc8f01a380b86a432e1ae540e09d404d93d22a20dd5f685a52f0acb863dadea236288b1714700f23d1c19e40e219e8ed21f6a393e541abba850ffbbd4030e5f6567b7202fb66d86cc2a0beabd495814f6a50690e8d74cb8b093e4d43261fff80e7a67ca06dfe808899cbef84c09ece01414baac740cbe4c656b17991868e2a136f4785a0de311aeb18cc95ed33fbece22aaed8cc1e47f58cf6c09a6f92c96f37d2d2485b369093506f5e9f8534f8569655277d0399ddd3d33861bd40c71ac53a44d1981cd744d79202322d47a0228356c0e27efa2ff1009cf2a416fb6e8844eb76b8077a4a3961ff193e1c95b222e72688ba48be82ec5da498e58861ea613782ed1ab50a95b5cc236834af98e61528ab18453c20ff978551b81e1bcc0ff4b7092bdd9ab0b946b7324b7361ef05e1f7d7f6a336281b4bb2c671a95a6ab84be6bef1b9c8c3d2536edb8d79b40637e16d7281ec5243016232d7c9fc07ed9dfcf555055d8ae65f12ad150da81f62f2e1e82b3adacf6d623ee4759ad61a09038905bcf1dbbab671dd28fc1d10a0b7eaaef73a5862ab449bd84c8698d061e79fbe52a86739ba945a01353e0f3916667bd7b4356cc65451c7003927f2aa738d98245760550156dda529be741ce3ae1afdea0de35ada26ac241fcb5d518e6ee7f9930baf88bacf8bdaccbecfdb920f3b26285439912a8902ae029b07f28c1dbcfde780cd2bee6c6e5f4520c5c7ff3ab5448ec86cfb270c39586f80041f3764b5dc77dc5ced0695c89671cf90ed34c4067b4bd938b1493c7902dd94be824810a00bbde4915d138fcc7584790bb0b6682fc0799cd415441ac90c1caa008c7fde3ab4a3aae478c64991ebe07e6c4587d3046c9ebb8e125e795f0be9266bcee5a4e4355a2830c5b34e583b0355b34b89c08011db6f6b8371de003074704e8cdda37ce42c7e395b6a37bae3dfbe67bcfd1f125c9a262d56883ddc028773988270aa30c6dd326cbffee589f38286533e1d5c9486011170be591beab5e0ce98837cf91f0a58d69d872e364aa88daf9cfa71bad167129420282d99ed5884a1276dfffb2c4100c74a8b863b063c07937f2e9c12523deac4ea16178863d975e3a5be5efb5ffbea994d07f7ddc5326bed1f5c9415c1d4ee1667e3a581499bb573595158636ad94d84f7c6e4b8efc2b141f2bfab7932a050fd88a8c7b21877cddd488543db5b11138cc808e1248b6e2ef492faa8a32f9d93e3c060b5cec10f03794248f9662ed8c283a8e0eb493824e2750ec75b3b1292d80ce002083a3c64cc487afc31b20f84a778f386b012ef7bef46e638d0f1cd75487ea46e05621d608482637b3e642a9a2c5371bead4386eff968b3e007fc263086d8a930dc76a8431a4e6907ae35c7b3291075d1c723f02e4895714803c0e97d65b04c0f27d01d5d68001bdb3bbd44dfee1eff1754fe8c182cd9bc6ee273beb2a444ca1766f747d86f36cd8cef6eb1dafe0c38b9327a8cac6e83e076099188f02721cc4de3d940c3ef19d9b067be07b890c798a79ee8c44d96c5e05ee5d5202d941a674378386233a83bc85134dc8c46a7531b2b952fb277d8089cfb13e882bcf7545f0605271fe38bf4754f98dfa13fe6b635a62bcf962553882a8f28a9a5fc0b3f85509b702d4a7555d40c4f7d10fbe80d48b4826995fda7d15f14aa9b95fc6526101cf09c97fd74baca6bd26b4fce8a57b0726e0f68118969ec067e9ca39b2ba59fb0d78eb5cec5b872613b1b76763b3217d859bd6d991bbb5448bd4e49dd6597ddec9e46afb3f71d254aba828c91de51904139ab19138e36e6996a207da80323d96077c97a3e8994296376d4dcb602f1e77371efe8b020b7b6f6f7bd2bd733ad9c06c45b77a2893d73b4a8a57707969af74ba06b2fe7d4079bcad1cfeb3689ab95c8b1215fe0a855eb431f67df4ea589dadbf055086924e42cb142c9031e25b81e8e1167a54008ba1ad7fec6794f203b27f3092dd72bb766c9653a72b2e25c965f53487cf3baf74eb7742702380303af8c0a61cca3eec78d4b709e35e2cc5bd586263d9f56fc12454547bc6165e3f070ce7b2bcace5c8cbf52f987568dd90237cf190dabd4ee7a80494692a5379b013611f4eebeef8e1ab9a9c5ba61926095545e19c3dd61b7b404230729aff7d82b6bbbed6b4a926f6e49189e3bccb578fcb3537951fe9c78ac842350ddd80133275ac0bce3a669183776fee8288f874d29190b452d65bb7d8edfedc6fa0ae147102b92041af6dd8a566932e016763b60a5b9b1e3667f228cab075f966d1c525ac19d12046c6409345799adfd7154b6d8b51eeb1eab3a132ac6a2e08acd1a34bbbbdd019195af9f8a93c6ed5463765173e669cb0d42b6cffee1a4b45987853d43c02f920819f45a4fe0905d8c65aca182b4bf56fa0dc51cb53c642fef003d92c13ef4bc1bac571cbe2ba3673a49694f6311b7dfc17a4069759177930b179748d4403c7259e10a5d221cd0a6b745966e598f894e607b779dd5289fbdae0b4348141ad373a62c76aa454b35b39a7be875598bb30007fc300606ee2537cfcd7c22b6149880fb3cd8eb53054d698a0d20f26a5c3ce468255737a68706784", + }, + { + "5622aa8d2f308dd468a7e4959ccc01f0e80d91f79df65b8201eb44911f6abc758c6703bb97908fff377395d33f96c328a4541f414b7ac34c6607dd85729afbfe01feba988e4997c6bd2c99fcc35d2467b143a8fcbe6b49247226a9e4c0a4e3c1a29d5931e6f1f7a31d90a0e0edc4479f08ef9bc65ae4eacd0b93b1cb38948dda31e60b18d702bbf5935bd580201d1f280cbbee679fd834aa6be576a37a037eabe989c3c18c7fb61fda8b9ffaa8bf22b57a101c19e850c454353af7af3d755b26ff1ee78b9d9daa78294972d108958682a5a29c8ef260e2289ad9d7d74f32fd4e51e5d9ee828366abccd97dd56e035713a6f3a1985383c0ed5d98c4accac2fa1ba7d30a295670d5224952f7b7554fcbfb426c9496f054834dec48f9b70af3d2b1c6dcda1c4daf3e9601364e57851952c785e65d753be1c22729bbde33aeb1e4748dbe90da6ecf716f05bfc68ad819515dffafd33a909562b95140ecfff1d0747f8e0459fcd3ca6cd8893262614bb4bf4b639285f327e7ac782898781968ec98f6f0f2f3c4bc5f9c4691ffa7ddb3662816f8ad092095b598bd4d10d6b5fc6fabed619eb11dfd4d638f4c0b6cff7194156a411e8ad6d3229320336ad52fd9811c3a1fcd571d1bbbac67c6186737ac7ca1ed9b2bc46e4e578f81c164b09ae5cdd4059a2c22b5e7ce1dade684e49200867f9bb1430aff9b99805cfd31f7e3fecbe898f70a4eded86b8bbeef7050eff6cf8ba71395a7ae2e270a2b58010e56cdf6efc4003da3d8a82e96979ee68694b6113cc9a6e377d40a810063830eb95005a81405e5b7de8de67424845bab1911bc55da6338513742d237a555465fa54b07ba50ed712e7a57a39fdcfe4af50f064ae969823aa1c40cd86a621ec90769d0c1babd33e8388a8bd76689215b9827a5819127bb32ecc80a562a291f3192eff34cad2635e5b0c0bc174add72e2041864953f1fc72be7d28111fba0438d9036da3d5c0f220ccfde2319bb96fcbfae6055ed7f1c1967ee9a78e93bbb77cbf151084d602a5a2f087d49c3134582c1a5d7af24f4c88be26204cc9dbf4368b19470fef49a5823a2d66c65e9b1e8ab56bf5a7bb3220696840a6222caa58a7b39fb792d95d25038a8bd9d916e853cc5459640f8b8468e3d51f05f1b95e996cee40ffb7ae14cb289094f1b77d5573c1aee7c12a6c3a1e31491422f272cc5f510d4f18ab63d3c3f468c5abd61b2fa7ba0768d46392e2a4dc06c7ce79841dca916cd33cc0a700b50fc660e5d1808d8b87e65feb89428055495823b2dc317d6d9e50aa5ef7ab14076174ed32f56abe7d410e58ca40e92f8a31433d0d74ba7b130b1561f2b075fa11ead744d031f34d82f1a64d428f6cccb0a009be24b42937bf3e99a1ef1fabf0fa7335dab52918382abe756d3de229ee8223aca6d7c5de87047838e387d4e472481a4cfd4365256e13aacb518ce5300f18dcb5e0a28477a6fca08a74756ef6bd8933bacc98d02abc7ae60df7cb3e06d41abcc4bd313c543ddcdea2424d98ffc6dcaa83658aae11f5841ffd4f5df42368a0e815d2146a0fe138b223764b133d17cdb08d485e9f3dd2bf2b220d1f4565b02d7b9231d592130e4436849f49b1a70772244fc0c38da372a8c57fc80ad57828410a5a16ac6d14e093997fdd5b26e4cd4b248e0ea221715ae6e112e1b68b09f795540e31b1231244bc922207b906c4f42b5302dd7474286b653b4d1bb657134bab117d6c349fa0f121c2f8dac9cdcef510c1c28545eae0ab163db6cc84ca182feb858c10153d0136f00a01c9c7d0bed892715dd85c4e73627c3a2ef0f43710dfccacffd1d9f118c9fb1a83b2eb328b8da3e955f027d95294038184f7b895d77532c7570cb86fd6b37a5a66659cf1e330db3930f302838706050c0dcd91d532d49c89d144e9a7f864026ec99f50acc02bd5f11ee88495ee8991ec4723b189f84e03d992fd718b5173ea1b033ab7d3568dc4656648fb54d28d3119b0f293a930a772c394f45ee66838f17b73a94eca27033f9d5c2ae22eb813386905dc024673850a087958eed191d04d05798bcf909eff2deb2a0009d223323b290e3d6f71b2797a2bc2590d54294a5992d629336518514032614a04847c3fad8a7d1cfc2f86765b48cf58acf892f68b691fbece38100e6a71487ef5c4ae934f1ba03b4b26a1967f70ef1c697202e4eb22a3a95ab3b7b524f0241ab4d2adf3ee5e3f2974d0bfe4419ef0ab11039ffc26339570e74d260c4d5a16f22cb4f60b03253487f5e46c47836ce29460728086a615f78d631d89a06790928455889f58adc3d0a3a84ceb2ba9cdb00a403080e6567873b985fd59fd9dec71e375013c12c51cb67d599198f36f58fdaf897e85dfe6f9896cf6d35a84cfdc6834dd9447a2a10e1ffa9fa8edfef1db9e8b4a245b211de49e04b7e88977b4e1ac9285f43526f2452181ee0f80efeb1f6b2533b656519ae45652ccefca81c17714476b497e5d8e9fdf6c9f504c7a7fa7afa36df5f4f8da5b4b973b1618fc8d2d43e866b235e5420551d1659e5bd545fb78a3e17d9cbbc8e842f3fe6be07b892453ffd689d5188f26f9e4c545ba0b3132af12a03bce6914015d026d3d7df661c1e6384bbb50dae24abfa78079a2b1ac41c44c7d82a59183f293f12011e781d3cdca2f791afa5b55a9f2d6139587bfd74bfc54ce91e642847a33b48c1b366fd8f08f520b79ad5113a0273735aee71ceae361a97547fc09b22fbe4e4ae4ae13e52d65e0971341aab368d1e917c8f5f2ac57ac119f981b51b7c99ff2be3e16935b7c73e28fb58d332e6f2c36281228c479c4d6095cf15b14baeb0769191dfc649a70471a25d45d4433797a5b8ba31ff567e60ec4d759d99244d0fb5dfef7c2896809938ddde0d2015a4c5ce5ef6cdb5752da1c2a33e5bc78b6b7c6a5af892f0792c28560a357720da3cee3833bbeda8e98e6a8cccc6535831cfc28bc8557b4181a3978bd90eabb34b99eb7e55d9263e6790ca34561d8c87ec4e12b4a38df524318db00a9b5bbde6f5a8644a818a88e91b521d716fa9f95bf70b109b9905bfca926fd42ecb9114c039790abb0392a41ee4c190536a89ae6194befc2dc4bcf7562bcb84f65c99b69612c0511552f53436b6c489204d3881e1f67e0fba3a061165d2955c2e2e12c440d31556250a8a5cc04ee5e09b1d627c14e08bce1a92df7f6475db92a3ee57e4c16c3ae677c44237122818ad457a29595ab528744707f3ab7ccf3d20bd94047e013e647802a7af14cfc7c11441ea6e9b9f960fe69d03911ad2cf3a8f633e0d647c71dc7e188c92e75353fc953d6a30dd0040c39d4355b71524f1a4872fb1ecab22c8293b54bb22a80e1e3d4c886d2988adec26f041dd0565cfa9edfe5ad9aa7da1d3b8f68fda9e9df9dbe98148120af6ff30e6400deca6dc9593dbf06c856d0d582503e7ffa185f87c6e7ac58184bb80b4a1c0c18d669e23f9791365fe807356a5763ea418c39d94311759b29b14324fb6f3104359ae66532779b825f92b7c9ea2ba43ba7de04eaef7a86192bc93e17286f1b6e0a01c33c796ebed8f17692eb9237173a051c14e4869afda2643bb98c9ac4ea94c6bdc1401c80190df6abe988d2f0b2d80cc7bc8362ba25c6e5df4370a43e156aebd6aaf856b3f64d5fefc622d078faed40b760a361966a4765adb809dbcd74b7a41faffad3a64823860e5656874133c7f8a46b5a3ac591906359aa4f171ef6bb2ea6b5f24cfe25c2fc7c1973bd5d3bb5f197002c5ca1bccffb570f0265f5cd949c7386d961ac9c5e18b5d1d6030d8bf4a48c10f12dcdb11924b02b8ab5e91f425ca62bbe42b80c6b6dde3160ebbd55803966716734327058e29bd39874f2eac199067fdbbe8c372c5a688d3615e2b65f4937b67d6a26c64cc2a9e5379cc00925c678f174f538915f912e85b7014c064a73bcc7ddd38e1a9627ffddb4bfd6da764fdbfb45048c9495ab1a4cac5642f6c9ffbe97d33cb26964a23719620df3d85dcfc392c4502759fb31a6a797e99e51e94cf9bc79ac15de4e5cf7a05aeb88a8ab4c3b6f9c52b99794503f2c49cd7e230a67df7403e552523249f29d257b35c0c7712053c3d9eb583a1a7473d7f296d25a66566e4ba8b08de2a31b082e40c8e5b1e93985b324dded3f52511744e7e99f4e3ffd99d8ae17bb5122b37f637c5525558eab18a378f5e2cb56fa003ed3af8d139d16ec4b2ea79c415b0ba4d750ca2cdf653582ee3b65a9825fb9b123593e36e645232163cabda515b959ed0a1419e9894f6c677ac200fd11babe3503ec7bfa319f1b9559d94a6f82945c9ca8667621a5d28920949a1da644cbdb58b84742e9d65e7f2027b99fba4dec46f642bd17e88fa109143b26ba7fe285c89add0b74a369f3d381ad633bfb4f72e1822ff96aaf9a73b3c59a6e457cf40e17c1198c64737037f52d9b3118daa3fa5cd3e3c7738e3b3743c595893289974a4aa0d6bf1446e70964823a7d5cee67b9b25b7125d9ac5d1d61f2a6947c3deec6deb575e2fc5cec60df26de3c0545e5b79156dd6af33a78552d1ee9994cc8501b7dc5fe7a22eadaf201a92e06ef03be705a8bdb4db65392d3628c7cbf44cccac292c93cb5a407a7a5a0d5ac9fd95b0033d6eb719d3f14609190dd40d5aa1b983cd4c4e278cc8a1e7d5fbb0d39060d6cdce8de6a17e2dab973a7fa594205e17edab6514372eb51e03b0ced6402fac0efd3af49fb8214a505cc9f5f0ea5308d7fe6dec369ba154", + "9f522375925222a04f5c95ee14b6386412025903ecad0bc3ab78afe1145136b3a3592835ab4ad6faa66be9", + "d1ba82b3ced3e9817642aaacedf482e79bedd0560ef2754215ee792514bbf8e6", + "bb21211f342379370f2642d3", + "1a6683805d3f478ca1c1512b9846468378f83be27393db63956e151ec408368b47334afe610249182f54c4d0a01b704db2aa90a9755b8feb67ef9301f0715d7d6bdfa5cc4497cef1142a43eeb42f7c413e8f489af30d742a706d05a40a0c4a5991f9e2cc5d9fbca6ad3767682e20c146ac35aef38dfb2a77388b738fa022158d5c802e5f0761096bb45b50815ebf09172759521b5c5d459703ebe9ff669ee4d14a86e5d0650b597f4a082ba0aef366a924ea378b91c3262d99f48189eea19c76c0f644079f8415c11033cf24d30d6c149ab13ca5c29deafdc816e457257361c1af4b915da312d2e6c7fc712faa27be3e67c893f9005a0e2c28369991c1dab22d38961d1abd6d94c4d549cf491aa1f8d522be3ffa6d214825a5fde3c94c4e35c29b8d05b2627eb12c9d94f450a85eec6bc963a279a37c2344ca36eb604c4bd11c2bf2ecc0dc16c2c365bbbcad3541bd54f8d0bdbb3ca4a087b62fc19fcc1c13984eab807d2a6a1386643d90d412d027bcd0a638765498cdbb1f4cc1b91b69bd241eab3645f225ece85a56e5008d6094041f8cca6b9a0ae3b15585de6fe0695d79d348f8619431ece40e736957a7627224fe92bbe30df5124f476d97e36b5b08b3787e8e00f0c10013068eb156f82f3494a35d6edd5f7048d1e91954f1013ede22eca8b4ba41699ee08decedde87139180a567c6d169b672af0f12aa09ce20e9cac4e78b8067d31ba4f63606c00d1d787b868cf7643fbb170f8074667c9f7584d36af80b4e6557724013618c28d0dd40bfe9d4b25761b3c99558af528c2d290d04b09821bd7f992c044dd61dde9395bd0c9ddec6d0bf6e044ddf0b4b2d6753f5acf2e9c904caa4e9f310578527b85e6738803758da646919989f735b09c9a5744e63fed2c3982e59fd29d2baeb9771316bf8d29213a4956b66c78d5654436ffdd82d0d572530fd09507b988d13fd743f35333237681f8abbb301a8ea870159f802a57760659094d0e4902036c5a62c563f1fc86c4238e1ce89f5176ecaea194ca112fbdeefbef4fa7c203678cafd34486fe58b2af04f84a1cb620c6e123bfd96301e0a5e5e5abcc95d28b852d0cee2f51faa73e42f22fc335f50de4c3812ee14038633a195083f3944284c1086c34995832c3cceb7d385b4ce86af10685c16005495121105272d1d739c584a07ec7801c3667bb280987a8aa41f9537e9d1812a5dba5b385a0b71d2e9573c6f3e9ebf0bf7267528946a6aa6f43efce908d32525cdc3b825bb11c7239f1de412704d24c17455b9382fd6a873180f0d5d44dc449320973d5cd0d4e67e83946b6ef47e5fc3dabadd80751f1421404e56b1bce748b7bde63c6975ca81f3eaf52586a55242c9745dee3f7c796d4508e818eaa4fa50490c1a79624561b98d2e1139a328806414c905372356a22393ea0da51c83957029edd8c2dfcf46d9564264d74c1c0497034ec018b1dd4c14acebc34b6d2c1a616937c37b8b4a0ee5dcdf787a0de1173798ab929b72e0fa83a6c9b9a99d8024328d9c236a8f57550a4f83e8071eac76adb55939f85f5b5f514174b670a3e8dc2b54656f6201940a81fe4953d2680ae4ec58635ba74d15efab3e06dca6ac269711ef2d4dd49f731e24a92a3b935ebbb3fe8d001cd4062669ae4baa62c2947033afcfaca227d88a11769f87456d5cd1bb6606891e71d63aff9cd5a7d23263a78768ac2ac54ece1441fd37d096cd27e916e68891137fc3cca427febd1947cfb4d7ccfad75b2ec5e809c132111eadf25a73043d68333139bd2435de9941bbc61c5c509897cfc19a21645019eaaccb6d06371e3d0570c09c7556e41a727e44d9bd672fccd1f89cc7d58761c16df8fb75fb8a1dde2caaf088f02dad91b6489114398740e6798f3ea8c7b0cfd974e160a0106d703d9589ab09aae79108e3212f19cb950ea9c0798a1532bc2a065d5900a12054395c0545b0878ac0b1d461f553dccfc2a22bf254ced88dcb538e3889549960b77ba6237ab1458e158f4f46606372e797ec9d9ecc6534acaa1218e7540eef11030bb9c3e5a7816f3b33a590d970619bdd2dc04d5c6f4ec38b7cb4d525234b836eab57f65dd045e02367eede9049e219b8712b8d6fe178080c5f77b821f1a475259ae571a5578eb3b48863162d45486f71a28ecbcedb35b320e5b6401f9e7870aa5418449bf47502626e1f42abf481b48d5a6819c640bfdb64f873d583fc4e40187940a6c3373ea7b47195270a8657898f55568985018abcea9bce1c155d95b426f91a734b2a14ec2c7ca2011a4d30019fd9b3ef63a804e9c30c3de2651c4213e90285a4ba100b31ee402e8a7f23cf9d4dba003bbf982526bc63be5af102dca34e7d362d6fbf6f56046160d7af33b364f2a86074d1c0fdd54aae89b19480efde2a9caef9de7c0f9491e1cf43a48752cef405a0ff16b0fc67bbe433a3c1b9661406c3726092efdc076febd60c436476f24dab1b0b8f8893986d951ed72282990e8b1526f4dcf539b22c01c6a7eb5577cd540a16a81296ebeeb7ddda72e60fcf2840c5b42c5cba30eaea5402f267d1d04bc80da5ef0dd2bf3c7a2be986507617c9bdbc96c6273a0c9e586a0c48c98b4552113149c6f79557fc8ace0b1a512fec3aa09ef191f95c2163113ac5cdd940f0c2120509bc53c3ea493c54703effb902ef752c830c61e85636ca95429bf16937bf6786b3eae1b277bf08dcd69f521a0078d633beb33c9aa0cb33b238e1021ca67df122a403a3698452740bdcac81d22ccfe4ab5f835d1961708d1faf6d40f115f16c6094ea37a7ff15e0534f62c19a6f4ded0967be337cdbdd2a7c58ba16ba2e4c3686e9d075c6fa7d29b2a0335ab4940d2a95c4500295f4db84ae65e46c54b7300909cc5411c725a31fd962d239aa0e2007c285586b4c778e2ac7afec42cd8409a63d7cd9c677031f43f4aaf04258dcf1270c02a4764177aa66db2d8f860eeb1fd06d0b27587537410bcb641f90aaa7bfc6f12bd143f66e7c933a0f3ce6b5048913e1b2d79eaa6c19e7255d5eabd24d5f12426339541a22d600cdfd1781a1a3894740887840aa82e5a461fc324285b0223ac9b95c3eb88160353f168b3d4ae8a2e87b7715b5fd2671f66e6eaaf9365b3d9e3acd9a749faefba6009783771177aa4dc91f72fed7a5bf6b1b7738b84ac0a07b4a5a3f0a9134a39e1e7e3e2f9a92d5644295f31c5a356092bf07c709b4c34305ebf50e857a4f593dd1cce0439d3fd125c1ede1a48f583bbbe0eec7058345129ef78868a96f8a76ba7fbfd1c5eebf75f3e0eeeb9db87474b96f321b87fffc02433513fb467fb74e2fc8feb498d51530c753e9a173e95e0edc5ba9802641a45db281b2e2d87d409057b4fb1925e834e90fa5619ae3a9237d5b104e7ac67c2bdc31001eedb4ec7064b2f72e0379bf8780f67ec4b195db014a2d130e77b1778efe3dc703f1310a566a6d3b5c9b12b1d4e25815493ed1510a516a31ced3b64ca49a783ad63ea71a57290727fa31386d2fbfe41f12d36a618c6c28d8f10405eb3e0a33e8ac2e4133ba75c688c8c9a2bb33c8fa032eaf3ea0d2c27bf89269c4aec55f8232b292e7fa9fc24527184f19187d9d8a3f52335e2feb5dc6d997b9b773a79a31db832b752e5738963ee5d61a1b426414975693f986e165e52d46cb059fdd4f48f008e96d4c1a48306b7c002fd0c861721656074cf11173ca65cbdb694c79f58a3f3365e872b24670b691682c10261eb1ffb2b65da031d070e31542f49704b77970a78bcfb4c4ca517b4c966a4e8e27664704f633e90cb7d7917dc1d3a8b8b7fcf59ea3a8a81305761923cb182cebdd59255803a14ca8a75fd007670d79a25eacda1138d67a0fd1da981529dbf182fc4d7a700ba498e4476a1d415381c9e2ffa3bd46201cf2e454c4aaedbbe3893bb4121a6de02cbecc1f319155eb8c99d1030103bb6194bee51e74fa01f28dbe16092955b9599d5c1f1c3f356e26d48fcad7c4cdf0eef25c25273dd62171785c9d2c5a01b1f3da9b4786b1b399d890e2049b73c12de2fb7177f2bc3d9c645398111ebcfd83b73119897bb994f998f4a6fae1b3d6361e171059dba0bf9de9af7a5a1b21641790baf82a36278945d649cf5d310f3792fdefe8c58986a48118fd94647b786e47733ae703701e18992bc1b143b1da6110a98030bb9895c14d7b8eae1a155a550e219a5b6301b6d26d7956ecfe4c7023eec1ff62538b3606ebc7906a1243bf8357f593b6cfff32e3fc6b51f6a0ffaecb658d526f7a5e9faa6294e4808b779f4832318cc184e49e8957b72bea0d67366e040cf76a85889fc6b04e84afab0d02947d0d83e0de19f12966fa8372f6e82ff402bd7a69195eb1a7864a3375aa9e23736fa4d4b0224647e416474c01f72b7d4af240d7f43395b5b04c8fdef1165ce1d56ee8ba0e350e6ada893e0594facbfb5f0d8829ae203929525951584c21371b86deb0f76ef5daad5e847135a6488b35ea33e3a165fea502975d6421d4567a229bf3ce94605885453610eb9c82f9ea743bee9e14776bc3076a29af268cc72d9092a492d9ff08c345dc2eb2f8003b561d9912ae1198c58107f8b37a08b35075af9863110e6770425e9d59c2dfff9d9942c8bc3bf7904c2a952bcd573706caf1ee14420564ffc433c0f5871c4bda916f2530ac75819ade49fa1de21edacbbf6b7075dba21a84989411c566b7c356b81803c7215ab0f326a6b8910dbc62c1bee3af51f105fcdebc0dbc56a50b22cf81eda563bf8c2eff98b476e8", + }, + { + "99444e82c6c4c47070b164f298ffdf6955ee5bcb3070b9aa95ce658db4db084d2056cfe61a93568b44ba7ddcba5d450f4ba0da7b119425a6628b3416663c638692326cacc5c237097db5e537122b465dcb21d8dcb5fe831789b72deff3907685c2e23187a56990221e755930a09f8d6cc065487563cb8cec82b9dc754952fa0b342c92d99522fbb39854e338f470a4b4d5ed2a39b8b6253b7001b0b953abc588d757616c7a5d1f12b1024aa572ef5a47dc8480943aa6cfaaa78064fb2b29830280e46efa418d0cf38f57980146f2482276c9b6b16f865b1606bf1131e894336979a163ba2e70adbdc746be0d38062fafcfe5603e6bbb55717b66a263fbd5cc7476302ea4a0dc6167221f745a26a309f5886934f4258965a0ef0803eaddd05e54008df8a0695a078b797be59f1eef95a658c99a7d52001d4108212ce5f18a39f1173291808c980b0513f1a531e03ad7380372b65572d3967af4c25fe54d99d664cb67e557fff05c12e10143c13b1bfa3e8db093ff832a7978ecd85d3971349e3c9b83939b73f0ad55f1f1162d0c106b99c0ff98442911bc15e9194f5b4ded97e9702b84e31b31380c224f392e5fa5c720a45f64cd7020e25a3931b5871e4c708e77f4729225aa9f48f9d876597d3e79219dddee0efdd16836021dbd21692dafe121217347cc128fc5eb051e6843978ae17478ef714957a84c74656ddd931cbeb43e32fb0a448acf2f90ee98d38522b4fa9aa36be4fa13306e799d4c0cb90ac0f73cbc018146d1b0d6bf48aa446a5e3e0502aae9fcbd196b36b6b7426fc10367febf687f05392fdcf878863de2e47be7e625d0e3e3e94e199f055c0fc65f76c41ede43231873ff10eb854dcd6ac9b550ee8533d16f81eb0e86471d4da69311c47255e78ac8e79ab36ce880d6b135279fbb5a712adc5c3862a356af49e9c10d5b16f4e5dedb80914868111e194745b802a0292c7c8564de28ba8e71a44f7eff6573e5434e65d496cde5b5e62cfa9e2e9ac85a164dbff5767983e71dd2661d37d9027a27674ebe3433731a606db88e0880e91ecea8134421962b3f68915c9f6a5e1992c56750f99bc313fb30cb89384c72571a1a6a5e3c01897b691bd70985352217fa8a67f3252a06205bd1a9931d1cea3736559572561fedbf3ac4c8bff9ebd7f3753ee69a69ecbac4be6357db7f4213b697a828edc716ac01da75c1d46098c7d5d6ae6f3f9a2903588c5b340c9d47c234efea21b700cdb8db4279afa2117677e824e627bf0f2b179c864ba823926a57825478395545f130886bdf2a7c55a2647a888c3998b750343d9cdc602e46b7b09a2fe9ef74db1ffc46fe27c254c927ce51b307e96a571da7f3f907223fbed2daedbcc96197e95edde7859f3b4ec6099f791089e368a68a5ba0917ddf4f50b93c0c839ea36cfc8053811f8fcfe6986e5fa9f743119ecd6c3e5fea1dae3ad7eb465a89e9c68569190688a8d56e4143ceea3b11fbd9de67173d5134ec8b0bd7d16560ba2be52345ebacedc01a2e03e8183ef91317d87b2e15cc6301586ed829d438e4ff1d074408b332c8ce60ccb6790ab08c228807509dd4b39f2c227755f6b039f5cd413ad6f46c9ec2cc6a79457529d297b1d9e74ead9bedd9bd652fb31568a8e2a9e2b89e4e57601bc1d960360232cdb30cb502b950ef930d54c2c0692a684cd44b0472995bd2b41dac1553ae47216253d6640d2653a033a862f3118c5b5d60a662d240bda5f4da51092eff514f61a425c5b14b19517ec1b371d240cc30a0739273b34f18a72a69b1586802a7caa6cc8f5817a8a995695d063c9dd26c3d45feb0f84dc8a0773151cf9a537664f942f351599cfbee0558f441f5c7ad320cabe305f9aba570ddf6407749b6db42f9ce94526a8f4170e735b1dcfc5f0e090af10e039db3747aa9b4f1f26acc34639ac8b60557f7753e2c261a29852932901a4093b7f307319cbb228e26eec289898b3f8ee236032163293b8caf64be3f7ffed236f1da688d958a1bbb79dd45026884904bbb936c1ebca7aa6b0c68aa8b667dc1575729e4ecb4ffa82ddced2f4571bf902c52fc4a0ea3f47aaf5c243ac2a1fc19f825fde5d9fc8d06d97a351eebf4ae1846aa62554d57cffdb3f3377695338f8d598d723289ff3962796e8065632e7da9d8dffe2636cd23eac15a60568eefe3e77c561906555268cfc1e9342417b1cdf090cc16c79939b15a9311b0210094087dea22833f74eb0e35d44259ecf327dc84f3f24b8c2bfce7be0d97e00d2be88a150a0d557ff963b4cda60eb99935951d288768b4b2649b717133517f5e3909744417c9c3102c77ddd285976cba2c89e2b4f297665632d7c8652847c4625038a6670169772de0550066ec6c2018f503cce79a333ecc0a0632334df6959d2e3b052fa47c5c84d15ceabdc80bd6be0ea2a5a8d5e374e0e9a613369ca8d4cae3d9f98755560b27b2f6e47b01ba390f5ddeb732c22b12abd225e26ecdb639b08f3237e488430b3b39f0b63aaaef4907cd003a8f2b4c3bfd721d6c3fd3a5f062d72746606a529ba34251ddec4026f40d262e9d527ad84fecf5bb2cc8601c2a38437098aec2335104842ff1c455e5d17c136ece8d461d7a3bd9a60339c22d71059e09b3603c0565c0345684893b56054ec4d3db0bf15546cafb4a03bd7775c3157e7676bb7bdb7baf3100396c563eba1a12952503eb6ccde6b6d0a42d456743c4ddb97f5994fa08c5fa41315080eb6b928090956bfc6252b232f6e0785d233c3adcbb9370b59c35b0dd66005d516befd1fc843df8e68fab19858b91e2aecd1c8a88b0fa3d4c2fed2995ee87e65976b755fbf44ee183f9fa08848bea325807bce0b7b61e03e50b2c7af9b360532a17a8250cf6068fef0198738c82a5e58961c54017e343fcef7076e823d63b4deee472fada7989ca7a213d06a4e3eb2d44b16e5c94b1588321cf6c45a5a792938b058d667e1730f8386dfedc50ea0a959b78f12f2949b34b181f90bec622515227dfb8a5f6e89d2e559c0ba686153b218d2c50b67503018e22914ce9b49d3bdb7cf38172db1ea130baacd640c111614e3db204b3b50641d8978dc14b2afc27a7efa819cac6bafa8166d1c127e2237520d57ad38a80146217a12363cb1f8a720e328cd8f846d379ada43bd4865e4aa633c479bd448d205b2e43befa63486c717af84a733f1dececc127c047850aeeb8ce677612f5966e23d92c1d3c758aaeef82f862c1154fadd6766e1dfc780bb447732a5968c0c78b9af4a9d669338458b57cbb77910a24678092857c0b903152035bab6b1c73f7b667a08cd0d31128888de3ff1fed24866eb60beac19c1b139f77bf0b9332024999a2d56975e691fd7475fd93622119d0d725bb99c1d6ac604d6b6be09d6d29360fff9f84e5318259a67fec08a006d9772b9410ec6abd4cb828b898c625c2fc35c19cb9a6cd3b0073baec7b5af254d21de8e209539f560bc80ea38e33658a68262622cdf35dcd6618b9e272ac3644c91f27d372c6297d8e37201c6a86a7d3accdf579c15246276a0009ddac4021755f4848d10f714e9da86eba13f461e6a12edb1aef2d6117986120750d609682bfdfcb90ee3cde8be54d45f841a6dee2d5b9fdc4e65edb7ebffcf3cc5c8a4e1c6919ac57568be23bd8283319ce11fca3caf968b057432f163f22e29cac30b8154a646ca0ef4fdbc7770ee1451fdde9e9d651992d94c843d4eb2570975528ad9f8c193f7c681a43df28242547010e30d75fca04f39247c77d6c3715c25fc261ecdba16844bbab23e4d0482bd1565ca9b526ada9b8f5703661a84b23070d85f3e8265b2ce10750c5d798f1a8ef4d51a473ff4d2bf4be615566ac796db9fe61a224bcce05c31ecb9ab7bc43a609944a7c9398a7875609ddbcb556296f548a117847df7d0afe48a5b504e85b0d7ca589103d3197933a744fefca795e1e036f964a4f14554d5cfa0261e25d6e5e02f86e402906d3637a2352459cb1639f20faea6f0e3fbc6a39becb1b1b3a791e32e85e5bee31be685410adf0c11190e20b7a5119b90e83f2cc4f0de8898606bb6e64165c95d4c5eae472daa6836a888ee4d9a79de72b8fb47a9c9c0323a2be9106d4ee9ba8b3858c256032a9caba37af94df4c7b0adc2f8478cb879b6d452d73191b0fc1ce944df3f4809cbf3ad46eceb3ba4abd9679410f45c8aab20dd72626f235e7c0c934b4beb4507def24ebbdd7a507943c81d54bc69df578aacd9ed0bfd3b7809dec345ba084d88fa9c34d80685415a4d5eaef9b88e51432b2b2037186baf123a6257e47aa56d6531923d38178e8264dd315e95bfafd8dacaf901e354b0f58f135d638df2c0f32453205c7aaeeedf8c102e11cfddea9a98d3ac7c385d71b760cf2afeb1ebe1d64f0222b9b101893d11a74ed175297c1dfd188a2565fbecc6bb07b56ce3973322a965dc5a675587890cc65a71efc68fdcdf1a023505ef0bc0e6b12dca5860fcf1c6c94c2e2ec3a72b8a019d69c82d36a73738dc3d17d7fdfe992bc8e18cb5d3437f1f619dd318b95d1a56b6d273ed79ab2655d83e2dd63cb6f1f5987eab6bb21a7b13b84e2c619b36b842192c3f82c755d8af840675b0bd67a655d641b1886c3c9c147ac87615ff3e58085a879b21dd63c1616a3712279ec87d650a2eed665b797ad631f0ec312f343979cbc49b99385cfa92841cba12d52777df565545a1deb07800a15431c0987b4a543fd5ed6832e80ab6f4b4d9c9ec419932a6ded4759f5c7630a0b80139234b8d53117acb4452c60b477ad50157169a89bd796e2308baa9395b513a94747611c7978c82dbdf48d716c3ac181ac2b2a4702c02a324bd4c5e089d989d020ebec9963b5c721a95492158f54973b7fc1828181acb3cc8078ac095136d97221c60b847bd2a52427383ab68cd1f10b92738c13203fdfa0b78baa09c1837be2498667c459", + "0ce980442336d0f427db869a6799baa6785b5e030567c588e2a7d2680e96c11b7f415fa27730969e0b1c3973b5f3192d4e773153def6dcc09dae29ac44eac7c42c2666a356fd4262197bd5cf6eeefcbd662d104423ec05c19a2e6ddf1834a3445a09e8b1062a1320a5e8ef13d6ebd03c19e1813ccd86fd68b46a", + "1ac8a509db7bf4acb80d8d394a5abf47c273b2093f50f35049e749f3e16cb0fb", + "47cc9eea11f9f3f9aafa23bd", + "088888333340b3a057b05491fb2402301c8654948aa6d5ee1ec75eb045858c22056fef0873d6675f897126052923a47a30675b266ffb6181cbd29ce2da3720e36a227e4c6e53328d789913c0d9cd149a6e49293996b1be7d6c513b24d876445a950e723ade3efc36907c840b9b8cfdb1503811b4044d931a0009b381fd60a5bf1e73d16348cb57eea672709875fb9d56908dbc729d5d7d322a17a41d0f62c9af9a013ab1e19fb7b6c6e7fa0c0b18bec5e3d3e92546c77e3753193389e5fcdb6a6a1896cba461343e71ef7a156b136b27ae6f45be9368301cfade203e9b53824d70f07de9abfea1968b8ff8489b9804422ba05ac3c3adf23ba0848817fa51febab5e9b5500100310479e710b663f064c1ef101c9a5320367cd8bc6e52081a32f070e7d3fd6f4210cdffdb9fcab1de4af5b06a7c6d191dcc12b25b3053e58952bfd1f723afbf570796946c1df9579ad14ea9c8c30389c1de4d1e845c764fec5eb8faaf4c558c5eb5113018c6a21ef653ac7d7f5b6c7e1a8fd48c6f423e9913436202da176a86731287db7331db055508acc94168888040ee37b3c119c8a0d88360241d68745825fe480324a944d56e7cd0375d4d33a5fe7a3863c2aaa899b2d24f65b70bd804039116fe959c32442c9f0b5470463523eb4336985b71125fe5235cbca0c88a6f92416d038e144de5ff8ef6ca749a9e239f02db505bff8e16fad1cba8b1500445f067a674142b6413e9dc0f432242d8301879bfc11fa86d1ac9992ab12319fea8b703e10a13bfd4b017496222be26b56af3ef67610f904f0ca8a3e7cc249ca8122735a542b289f13922904ff23dd197f8883c7ac77150d7331316ef94e0cf13b6ad95070420513599100b0a6d117640b781c622ed7ef7ead29476b3c835bd9dbda2203930bcee7ac01c3b9c89da405ee436ee652ddcc3e96c7f1a94e200eec9a4a226f3cf7ae5725068916e73b61149497d11dd85157f895669f51978d1bea8fd2afabb18d082365daba2682ef623109988b7d0e27ae57bc14d86603f93b5ac040ae52d8db404ee27e6c34cd4246f40eccf9d3f8637a4615a4006918b01d34709bcbebd02ea72958d54db3e87d69e6d783de2f1841029d6975eb11f9b076c247108797d5368c656f888092b82aa81aa26e164e038b359bd68801c22fc107e4083a9d85fc254b002ece9d4545310b0cb22ec1af04a7ee31d210ede4b605dbdbcb70e4301989422ef46edf63f9c96de9cb3f70638b51df5c0abe79b7af8cd97148f2b7bf394bea0f7bbbf6925f83b901b87a6079f2c3b38a98fe1a86dc7f48bf97553701834f557451df4b41e7db984a34432823585380b45c1b84813d6aa21107cae252923fb4673cf660a541e65610ac0127d238285f53bf329b62169f3e42d5efe268dea62578e97da59a58a1314a1bd46cf7a7cae772814130b51411082e30062fdbda1c9e14d6b2bfff89d0379d32461f3b8e833b105f6a89532ae748b5fb43f283fc86450404e8befb8442b65e338aa0408303a70e9c27a1d923d9f2a06e7c6159c50bf2e3ba5b035420ecbd9d0b5fae478eb1ab72fa714f99d00188bb10e60380fa3a3a318c2d359ea3805c2fa0dde17ee52a504f70d6b466bd38d1dd4196be336a9ab4a9e573d1bc6404018a119f688c1dc2a8ed1433e8a8ebf455ce3808c245f0220f0c12d28c771757763bd111ab829294e2429a6f7a59858dfa1fe0b806e986d40aaff934589fefd75ab91097a979f26bc9352267efb2d82c4738e4e6c451b0d5adc398f546c646b9e6b8fc84e91651a1252d5b805a857c7798d102d1e6f90749252bc53588348ecec0897c79f514442fe3b27608c95d0cba999a7e0fbd7f601689b4dc63ecb9ff553ff12eca3e9b26e3eccbde28770bb6aff7c864ad6be77fc09f81f90df6efd0c4025d0916ab5197ab846dfe6121c462761d9cc87112ebbca197b0a222fd34a15b824b7eda06a56a6ffda760fae5f0b527e2798f01e205a3f47947a4bd190f6abfb1dab2e3a53131af95d593bb57e4f4af506440cf20636d9fccc449d9565bf43dec8b6877337ca5a43900c1dc600c877b290342914e909aad8c5f0755bc25652781535c057ed5ab2ff8ad4322a8edf3fc1b5311dae6361a7395919725f4cd87ce0ccba37c64eb3618f9c5a53644ada569b90cd07184fc048f1b589eb29852909e75e7116ef96a268ea85c2bd257cefdde9222d7eda875a2a3abcd3a02a1fb470ba967b20beb54914b8b0c6ed464ba978088d7f8b30d098966b0bde82a8f1210f5d0c3405c9bc73f703134d0b6ee13326f65fa0b8154f4e30808997d4afbd060285942ca1dededc3410a099881492b5730ab7bdc2a4cfd0068f67766d60b5d4945f121459d2083334ac878d067bef644b9ee427bbbd6c9351d7b019bfc051c05ac301ff3792a1c687546dbf6a07a0cf56717374bfa1191c22b7753f6ae02392f8aac9207d1ad0fcd57c5c8b35817574b7dd90a00cab75f508f8a234eabce6618305f94746cb6a8573389d336bb67e1b0d2b6e9bd3959ef344e1eb245b522c35222813b8c6e82df48987436b5592025e9786ca63b6d1a064223bfacf59ada713c2a3116611393aa8446ea79b3cb21e96d13b659ada2d6524686fd46ec66c1b4d8f5ae7831840c9e3db64d528f83a1cef1e0a586a783f8306cb261ed9c2905493e74d35883fcb39cfc5745c282104cc3ce804999231d13e1bc6f2c022f05999fb57575bbdaf00d7a990e17dd2f8b9dfe66a637b42f58ee49ba60f2dd9718d09d7025b6061b2087bc35f0a8c884f5b67a5e18c2b4e857d3b48b79dc7cab6b72f572d22987566238a7153ed6264578424f1ce091fd05b7f14563fe12c76104d3373367af3ed3aca694a21127b5912c0b7eb1ddf9d4a9f03f660d49f7a7f0fb42797fd112414c3eba2b75a04282dcb9645191fd3dbe376e7f60ab40bb7ca1e991053a1912854a68d7dcf854201d1f2c26c6cfaea32e29d80847e6288274713d2ca973b91dab97884326b280c6f06c65b8fd25d314be29139961051a1d8699467d02b67991baabc9b05629660c243ca3b0477362d5e6bf9eaa33beeb52cf399846c77fcae11a89cbfdb2058e443ddd44fe202a3ba5c2efce937d78b9639781b8b2b99077b433189cf3b0733ed73b59bb194c9a98c5aa0cba6e71d1c5522f193defb9e31fd2cd60f22bedaf7008c2fb0b55a8dd52731dfa2bc69b40f835ae95db040cda6a4a1588a5ba4769edfeb7369c1e9a3b1cda293255b4942881d94d771b7b82460004875e71be64c582f2830c5e80dd6de421a311c5852f4912bea1451b0328d01c7029867cf9af99284cdfc1e1f0aa0d8c19ba9bc035dc270b45724247137da5d3fc4daa09e7014fe1439889968eb23fe124f067825d5f7b304f17a983580e009e0e51630ea0006dbc74a30b512cd9eb4d0b315a0ffdbfb581609ea9661b0007cd234ce43c17c92269a7519bfe99c2ca94b5cd3e7654946e67b37d4270a369266db6804336a446022677a024d44cc02cb04108292dc12f790578a0d61cb6fada738902eed3afdf1850bafcb279f18b5798d7466752c6368a594533baff5dbd17974638ecc41753b184845206c79bbab84dfef148eb7f1390f8cb7346a14c88caf540c241cad11ce8869be3bec85d029ef490fc5edacf94fa962be39a33c8efefcbb6b43960d5bc35f8fb72038af3801466aed141b50e9ac7dcf1921f7a6abaf320ff02ac34bbfac265e05e27495e6e027e673a48a874e6f0c33827a050fa21c2efa789c1e3df2ecda95fc52ca7be35dbf17ff6c73f37cb236e5131542e002913d177ffb21ac450e2542e24b894650007c36c52d90f83731009a7c3239ccf11829cf0fb6510d9924e927f14d6a06f8dc772fc9b028a8bbd2d3388985f3e2609abbd08434c46642b97240c9380a831bbafdc5db77be63a1400cc9a4f7362a689b07a77162022c6ba7a1bb9f0446a0b6b460ebdd9111132694fa5f1b29da39be66c5179849ae9720b2da0a012d4bdfd1b18b8fbef0d5c32b92c351dcf2c599f069c3b53f622fc8e904f27584b2d97d43f779abcde6dc1413c0a677dd187b28cfbcf7fa6316f0967b53977432d45944ce8ebd2e265c0bf6b2870c75ae808fed52aa35421ef55667ecd6f9d279c9b91c9314bd9411bce267d6ad52b1d910b3e65147c3eb6021a0af98707408e66bb11ca5abf5e34b2bc85b144fd06ea56f5d7f8939fe0cfa4862e7f306de069cf85f4aa7aa97c6848594f5a6dbcc718d2af77497f4b9d5ffa217fc301127071e9bc9c2c9222ba90e286506e384f321e622f05d81c114953d0f7e9626b74f4a6bea8cfb86ceb4575e5cf4fb84e9efac8291d1f4153ad3cd9a34ce0ffcfbe30b6829c0f986a4f85d63b602ab99ff3934b1e0c46e55d56eb479b79ca0729beb59aed783e9a3ccd55db8d884733dbd93f9fd7a7209fb92fcc49826b2d4356ca676f01b0981637897b3d2f90f37bfd73b214a398a8e4e2f9e5abec01d8192ca690191255dd8304a2d95a69331288bce00385f462e942f4d694dc3560a263c8ac2b5cd1d2c63b90ec67c32eaf5bd947bd8ac730da9c09ebc6888b0b4f3bead157aa9d31c2802df8ff0e4d69b7abfed6f184bf35a16ffb5677ddfc4682322128932d57fe4c32f21e190e1147d8e673ae407b1dbbca31331310b299e9f3db08ebfd2dad3158562c2e47addcbcc831cef0194ac8ba9778d0103c2955c886d439967bf788eae688f2a7459b0ef3bd16808e8d768b8962a24588d918ceb2cd1cd611b504019f65216beca212f44600cb7fac77216b7645c49f18064a3acdc01399315084dc9ea151ee28534fb31628d190bc540ac6b6aba572ba51aee89544015e6fbca2b3c2330f2ac1f68849e99e1a1f7f523599eaee22720392ea52259e26f1101614d4edae481b3783af4e99082d75dcca549049290731bbadd1ec0a93789ad5c9afe8bae44e35b3e59e562362964", + }, + { + "0410d1f8bc890649c250a3819766f4496f339a6384e34acdd72b3a87266edd2a7eae223a372883f978277a108d6e59fca1f35f25d7a9f3aed42d35fa9b12241ac04754f76fd8f0e8ff6af88cd851887a45e89f1c9192ca66bfff605b128575d2ccc9ca3ba1ba23a0251b2cfd6db577b29d17ce2ea998946997f5c4a97a397c46024681a400a54425c071232d269adfc3b1adf15b4586c4dd7b8886f5c1023bc348bc674961ac6e221d914f432c2f06dddcf738227dfcfff88485ed45882809d0e57019461c88683919b87c45e78223c37a5be5f758e4f0dc6add22f2062bc2eb9bdc31b8649af17d526ec339f0e6fc6a41e26299c65276302f982235c3e5205ec1521625ec08a23e766577664b73d18d5533261c859c4cb4346feaf7540a56155c6c3a4874dc86ea42fd518d71221ac65541e2dadd2f8e129e7809f2835f07dfcc4128401dae2b5fac7ced1d9e07e3f348c6cd26f55b3893d4418557a18c366dcd5eadea0dd84ab95437d6f23eb9e5877fb2ad740ee507e2268c39c7186f34e5cee2d0dbba1a940f516a018f23e716a399c317a7a81f89cfabc296c432cba900ad79db67936f76e4d97874fc5f8a9ff84eb7a0f6d629c581ec5c451e27ef1ed468f93bfc68b2e0412a543d89dfdd812d9421236a4be9eb374531556c207340886c7b84d42d651557b952e0982f62c5c383e92dced21905174a5a836acdc3f2393e770d6cdc22c39575a42ea406f36889dc9558aeae5dc5f8b84862850b55bf4accccb6a8ef793d641d6b08235f70ad3b0605eab462afad1af80fa003645f4d302b03d81a7d167e9a8187bee0f76b1cfd7006b2d2b55fedad6e8db1d3ecfe031702dc327ff2b0197337d7542f42702cb276de852b3d72d9acff8a7feb8882028a5e340950e523c41cfa184b3d8878effe56742994e60240e58cbfd01541d39fa007a9f0ecccb409c6cc540354ccf35223677cb74e7ef7330bb60420f7d7bf97de6888cb343cd4fb0928fe5df5f1b018592ccfa7aac6dab57cded573b5950b94fd935f32cf332dd85b2b36501de6687612371dbcfdf77279d647ed8bdcf81fda8b7e0c5ab139330d64695d814fc6f761fd141dfb0c8f74e2d7616db3598d8de40b993fbdd272ca37db27b82aedb08bebc4a8e6d0385ab20fbc20c215ad50fab8e93975bcab3ff38667abb0545b3b3f20e325f01b80a32a3cc3ed51703d4b2826849ee22fddd5b544816599dca0d8fc84feed9f7e90caba53b70bc3f457eb1adb89fd0b67d2c0ab53264430c61d2c4a1b19ea99a9b453fc6b5ebf5fb5ab799134769c9b495c479c828bcc49a8f993c3127d5cbc31afb89c0e78fbc323755457ebf0f3344d3ad1cfc59d186e96ac31a9298e655b3d1df74b95f30fb868631053540388a13d597002f689708d35a2365e309bb96db8b1b94ea4c8060c2b165f7f19e72056409159371ac9c44f6bfaad9b9567094d18c29bbc8aa2c8b5b82735d20f55284fe68186004b4a4fb644fd52d9645b277c1dc238a764005c1d2791ef36e71786cd990ccee4571d9a9b1aec757e479cfa645e320bc33268e05af9cf90e0e616ae7f237c637a99fe15b4ea8a3232262d96855fa248920a28ec03f77ce4dd93925db60ec030a7be455ba9d08edbf6bb717b1a13c3ac1deb9821e21505c0a8971d5ea5dd8e4c9cd3a845a336209af191150ba5d9b8c2c450e3a765e8670d7f846b2461f971fdcd1942704f620a40f4204b99f9035bbd543f64b927cbc7a74f32cbb12c3caef955f169a45374e4479430e08d333c4a877baf41a27a0849ca3a157b6651295fa71ac94b6e3d30b5d160965e93d2a81b4d575cefd264399c9e4e17059f4064465b2d92c96ac27e3b221499b5e642d033992c236b905c072faa1e34495f9890bac6228330e4016c061605bbfc478c30e1b8534c49af54785972aca2d144328b0a540e3b3810a73e26acfa22f48652d53ea521875475ffade8ab50b9f08245fad753350f63dc4e898948ac7dcefe520ca47394f8e993a6d13ff68a2f78cf294f235f5f863bad10c4f5bc41c3ba93cf5e076357f0f7fdc136f34b656b1b8ebb3eed1ac429c7d4edbc902f7f4bc24ea9c9b200b9a9fd7adff0c6445ce1d2171fc031e3e9f8b8d6b448053393c8813d91333d4bdc3bc5bb2b8bff876cd29e8b92cf6f7bc727517b6f57ae031f3040b0637dfb40b8c1fbe44cfb6bb9cd0a445fd9b3daa1da2b1c4a82cb4da1fb8d525e0a4d9ec30e9aa75b951214621c58c1f60c9b97e6c6b330497e7dea790a3cd8158a76d898107ff3a5910707ae60c8a46c633b522aee83736d005de60b9abe202435f8bc4577b0eb08b7f2b617bb5a831e95d6488459bbf15919d764b39684d7cb7c9310f343fbfcfbeeb212a90d96c7a26c1026c5cb171ee4ef839785076e5084026077455c73404a2653f333e9bad555cafc1a9613387a02bb1287c380d7478238bec8943208de585bd18b448b6099565cb3ec70ec6672a778fa6af9d1b17b0970439da24c7bfaa74c85ecd8e5852e42391ab2258024ccf91e37f2f0e86df958b197fafd12f4a45f7990375f1665a14f7f5374ff7740f89677ea8660587fb80916b30629a7aa88213bbf80512421a0a37414a2eb549b81cc85072cdd87e4e69d97ecc63f974e60d20de0233101c3d475d777602b12e2f797e9237570085b0e9f48d4dedf233eb1301ed4621f9736946eadf599bfd79157c0b4cc31bc273f5c6f133a4e3679ff6797d3c9b76aff4bd8ad40726c1703c3d8b78f0974b748d0265b0a75928374f91b48c2d2b2c11d8b6e5efddb75009e4db72e562be59efb0bfa06808c89f585a43d4776ef08947a77f277526777f0b52f1e0b5a03aa560fa45c8f30e584b58ac1fc00b104942b7b86a3cdee1abea349dcaea4e058faeffc567e2c3b03e1c5c4ddc675e25aa15de1442bcf5ee972a8c5204ca5794694759c13a2d716839dda61635043bdf1a09e35cb6d93b4df3b7a00871f79cdb4ee69c79041dd14deb7754107b8fef8589d2d240ac1d8eafc52ea847263512651bbede2fccaf6da816b1b892319817bb6af9fc17078ab6cca95f03cf8426249fd4f2bf91921d39b8cee24af07a52bbe54ca7fc4422a310dbf2149b763ac0060fb2c59154d2cb0da1ad4892279b4e0ce7f5f92c189c3ce48e518ff48c4ffa9bf2b02d4792f84534958dc6bd2914ba010aa32d133f6a07bdbb87a237c7acc3ba5cf101efe947147ed4eb3bfdffe5fefa991c0dc8760586218d286944c52d0f221e0101f74826761d01a20af187f9ec1115e9e98bff6fbd7c8816c15d33c07f51c171490997bf269951218ae92b66fa3150d3bd40336abccb717e18b53e8806fff94009910f202a5041b5396d1c339e6d075bad4ab66a0637d81eed1696e4068024001123204b8371f0bcdf0ce07d79f7c917327f7138a75947846fde68665e9c767fbf96bb3308abffe7a8d05512c81e39fa8dab2334f46ab9543921ca97be31076dc7b2a0d05e90b7f7610d1a391b442398ef56cde3b18737faa8f282572389b4fb3c55cb8ae6737257708c808bc0a414bffae293bc69cba702ce2959e1a30edcdf64985a4b0bcc927c5912f819c71cc9b1ff5d6e5929055be72ea5c8c1a4a591093deb5449b7e6b60109be1ac0cae472ba31e1035ae65f3214f50ad699a077a2de52f7180addde0bd78c2698470b1af13cfbf497d243c9e738c4cdc265356543885c5b933a299f01a5b5a9ecb0b4ddfda0c28573064f6a3f142801795d66bcd5c31868fd3207fee7bd98c47e4da26bee64e1617b20cbaa34e3abbe31126b06d5737fc2b577b19d255a519397f3ff8668d0e7d401a37e368729e4b83c5fbf01c32ec478967605cbc0675f685b5eeeb42fc688216a0667e1204c995c9c485e6f7712d80d88edc9594528b1907790549756dcc8b0d32091f36d2b4009639e68daa130e83a1ea18353ca34f431c548d91c1591ccf8b25eec1f7a3c18ddca71b87bb290a5c13229250c5e193e1352072f6798ec504b3b4c6aa578737332f52baea7bc4468fe6d8dfabb9728cee93fee50c8caa113f5ed7e9b55e21e98d73a377ef68be7e4e965dfa50cf863e6285236f11ce80512c573ae2b55bcb43cf6ebabed6783c250f991f5f68a59dcb2ac13a3c8fba8dbb11c79dc6236809f2d7c4b0ad3cecd24b85f1aaed9748b8c109f2fd98ac8a53bd52f18475598d67305117de8e03b0d988a2847539cc2efad520f86dcd82c08ad4b10e490b9cb03bedc7197bcaca55526cd9c8a5a5f69f7a1697e7e31aa76eee597c386418e89f06b0b9817a83d6cdefaf9594548b33cea1cbb585e55df3d3b66f0b1a88f4b98ea4720f1ef5e6ebe4958078ea0bacb8ad776e325ccb252f81943b9b1c2f54aad3c7baf1bca0dda1355d191f69c5d8163c464898116dc89201032d1e3281c8054882f60522d3a65831bf779a854fb0c195f85aa66522386625658457e74d5c2fcf5234f226da4a579ac1f11f11a1e0a6993a4dfe5c856481ebe9d8d2363401058736f7ad104104aa03f5c91496aaba2fe4072d418d91c2787a9b4ab0cf4bb65681ad0392ef073cf2fc060692b0c0c194c8eed5558098cdfa3317ab02626159e40e5c76fd64b2ef60b8f5f368b6b4fd7ea3d2d3236aa01d9db7c8a01929f9fd38557335b926251ade1a0d47d0c1444e6416218781c1a51e786dbe9297b78fcf0d0304c62929e00744ed4e14af926313a9849b2a464048bead075044bee013cbe318920c4172138560629a0ff4fd229d81bdc7c7fd1086ab17d6efd5b603a1991b33a55ca5b9e2051b7c140f7937adfaf474c2f284489d9b1e8c71d58f126eaa451407eacde9f0e86504f7de3ba4d830199a229de2bf39014baad6dbbc448501588ceb2575db0ddae005b81ba9914bc22b6d600e2c990f7843e553ff29d8008265eba7dac7b5b5a7ba6dc263fe0e262a7b8638a81f4720622c7361554b61d7b04c7f8b133440baeead7d51ac8b77d606fd0eae1c55ce7e8141dfd68d40ae3d8d2dc8a061085b4fb6d8a06263183869154618329be6b01c2890f2b5d0a0f25dcdbbfe2ec3597d79311edb943613fd4b59157df4fc2e1024be03d98ea3cbec7186ea9f4a431dc3743b9f0871b205bc0c1b3a001768", + "113b261414b4b7dfa028668ac8b0cde5734120124991c54f4dd16a87d181efe2bc15f6d0caaeaf6ad615f59ec5c2833904a34b4d34109c82e10609b387f995430e8c13d83ac34310d838af9efa32d7fed6224c0a33", + "cd762390b93369f1e207eb15deeaeb0036f5331e82480d180f84a76c3e44550b", + "e88c14ef96c7768f5dba9de9", + "8d6aaa27892a76fb05a2e96cef9a9b4b7ae0670a12cff95f7b076372456889fbd3b9b4fb5fd98b3bd85b247f15009be2f4e7a0329dd118b6872199b314e159618ede0381dd97db28743461ace1a694c0383d8458150a501d6c45f4b50d5b1bd47e61a51f9ed4929bf2e564f201ed0e6825170027d93e482c1ce268459d2f81cab41f0e7ff281430c16b34a29b5c76630dba72ab9e751bae41122b26121d91f2af271a23e818263f46e05fdd52f319d58330bcabf66637a368c0a8aeeb20cad1916d966e5e0b0de74cc67ebe57e3d1fe01e9743d42a931cb4b98bb762ea43ab937d1e5c42eb08fd56e70e911bdcc1ca4ca0604a329c5364b262ce2de282b4732ea657b89300cc7b7127ba4a2d08c13f581f024fd093ac09c2bc245be60c80e102405597fa8082f4d28cc954a93217edffaba3d2a397bb59ee89c8cc0f33eded78f21183bd1acdce64a923dd609a0620d2911f61e81fb2c8ccad8ad9d81157223253a121ea2bc60d6a3670c563fe06bd75688572b3be83cd31dfeac6b17cf8455267b481219c42034b2252977f32b8e6588fb05166498fa37d17c2b002a655b5711bbc21175348225fdcca041b1f97fae48fb1e222c5bb46b5202191c00666b7e1b2d84aca3edbee7a97dc0f6d1330e929226f8a76c155e973c1ab62c867e1f87be37788754e51825ba31af9f4722b5782ef782fbb70c391a664f252d14e49a805e94790135ff6bd881a687f98b42da96fd34bf240eae4914488af739ec15f13f048a7eb5fa94af14e8b6ac5fae714cbef6268b114813ca2a3920a7a9d5eb506a2ca211758de292047eefdb5a97e18530dcd8410495fc42abed91b1204d9b8ba9d6aed11d2d0fa0d931d46f93f2c1a560ef9f5f7cee1497be770d3cb07c534215cec12c1458bb57aab4d95cf4a15a5e3a3bf8e650206d5cac4af3193d169f1a57638d9a50f6b7c6985d42f7138b9226451670d7359351c2affbca65680557693d03458341198b8e13d0ea6abb7496edea3cd4dee2eb93695e668c7c0901c6809b8ef434e88b85a8b22cab6508b9560fae62900056b7c5c29a8c899bed45a2b5159a1d4929476ef350101317f77f02d48a039cf4cf01c56319cbba16fe908c49ed6f3face88867c0ad3703452baa7b86fe58a00ab8f740b4e8055164b0385dd3fa44502ffbb99cdd843bc3287ea468aafe4cc298a3fc180f284dbf78aa09e0a2f7d8593356eab016ad8dc505420edd376b66598a3d0aaa848fd68c4e07419b8b50e40febe2b6b17ad07726fae1f87e86abd01490a0ce24fb57b533c765504ee0a9ca154187bcf5e6828e3addc7597532643cfd992558d63b1acd00e7aa41b9765094217480c08c43f4f0b3f0127120699b7f2a5ac07c655b6143e467777cdad4bc21d4b57da4d8f9b9a7e4523d8c6fba3614b7f7281e80ff0f9004577adcff1b79fe443c80ca9655ecc102d5df6aab2ff6c3401f344b77666c59ac7d5b92bf4f1e2322f74b75e6ef2bf43ad9e018f164ae76a91451e5221bdf5b65a4fbbaa8dc31e6063b451edbbf4965307f8e65bfae87b15f2453083bea8484017228a9cdc6edab1a28834eed8ce07430f776b916b3bdd2340798955ce9ffcf114c3f6a88bcc4c7b6f2e3842426488c340d00f2c4d2d6fd3b6263dcf7a57f5cea6c77efba7013297bd3320accf033acc0833aaa8e8f95cecba469704214f54a1ed581349878a591f9993371f1daf92e55b2a4faf8f952cf785c687a59b3c258daef1b6d7bf9f904123c7384a859933c3ac31e33edf648a1be4d6264ffade860915bd118f0b9aaec2eb8e16b2015fc25e68caac77a3accea53b9b178f6cf48d15029fac12963b4277df037b7a494cb29b1d9e6d2148531a1f7360519cba5657c080254f130a1cc3ccaadb4298d7ea0223897e63d798b4f4909577cf9b491a82de0275a246bb1211bc4144574c8ef176b382262c0e087975cbef33cc616d32e0131a9efdbe8ad3d9cb5f935d3f4f409852acca22ae2a6e7450e9a426ec3b9183f93b4b7f89d850e1c7053c661936e0cde23e831a261b319b430da45772f0fc0113679d06f025983bbf37ecfba35eeca28de5ff4815a490570491266e92faaf8d0ad4ac8df106faff8fe3c8d050ae9dfc03a01ad177c21d7b653509a80369a668a97eaa532dc9867c32aebaf89ed36586e1ebbe1045347766a354a86ec1e8b2f30c8fdfbb6c5d549e7a84db81b73fb828499c5c4be0d4b2b7ffb197133a0ee18abb5a4e371be0ec0a6535507029316f8decde30833ca47493ffcab781d028edfb91c138609baf1054ad52a5d8ccb98b3ca5b138f253d99bd556afd80f71b39f36e0d96fba4e0cbdb18926894968aa825392f12d98b6497ff85a0e4a91c97f37ba1dcad30fe688b54008b925805104a61dc22b712685202ecdb073fad9b10b5b9ee2ff781f23fd41ecdec87f85b369a304b85bd2af126d08f79d8a9e2bff0b18607a95c4efe35941c5493c94e3f2f3902e79f4cfe84c138b83c7f32d7c5a125b28c6107921e8ac92f1af7da015b46a2f9169369cede770292eee8a5f40d080ea1c267c33cb7d4187093d486dc3911bb2d6cae036cb508e81ca783ab5e95cec751e39f3038003081a252eefa7cd913baf136d4e27076251da9cbf0c7d2586fe02b62ec786790ef08fb3ff3d79bd06868eb1abd9875920e14fccf6dc144e898f578b7295fb5f4e84cbf683722ce3597aafe3195e194736fc317ed03ebbb00d956ce89f7a41a334020e1a88da355d3b47d5bd3965a290f6fbf5dfdc8c8e6347b4eb85151e53a960311582235f3b546ca80a670dcb628fef572dfae0c101bc08c80f78d5630a793bdfe402592c316227f2333b386839a67e6ee8d9396fabc9648ea656a407670efaf80966034958f4a70fe7b920c79dea3d5a0ff05f3ed0516537d51a686efcb258520936fdd415345251c9ac1143a41be295cf12da5d4319e78e1c57ce20507490e5213ca7be92afca8ec8b6a07b33571afe6940daa2afb0dd4dcc1c329474ff8e13d740488e5ced552074fff695a04fc1b70755245895a1e9c387fd9514261dbb0f600ae03f4896e795d1e72f421d8572543243d662f6811eb9402b6a3b8dbb0f32de95bb1ac01b1287663d3b6a3f52339a4f6b27789e15519b2b59f2f4fc8fd33ad1a6e4d02cf0ddf8499f45746da424ee78e72847e3cd3833551b6e6fd6b1aa98c688252b57a1d97660ff006ea1b970a0b8fc7d2e313ffd0b0b85299ded47b60cd2fe9bdd7ebace4b0c1072cdf67231a475045990b35ec761e1dc1dfbd0c402296566eb4b9462979d33c9d652a9295ae70943f38adb212b48bd8ebe82722b1712ab6a3be6060297e2aa54e7d0158e4aba6975237e7c7a1e22b29560b8d262125ff2a6e5c1332acd0f6b5ba15b4a82d3631891a01530321830aa8f2e8ab6b41bc5b5356957a4d0c3bc3eab04df7700305a95d0f9cd18d486c675c963876b25b1a0f78e245deb40dedd14dafdaa9d614fb06eb2538c5411e13be116c76fbd3377ff212eb07c5c035612e4cd7a1de2ceafe95832eff88a9bdb3595cc19287fa40b8d244afe9bd24dca40db49893602a59640d7a1b8e7475825b09cb0cee111864deba9d3d1beac03664279910accb9fac534ef099e398d7f6e3235cef7685fd1ae46e47da093135741894273c0c3486197c26057044b10faa57244721328b47e611633d16d3e4776d90309d68ce4a60d3ecda26c9f39c1c6da67ff79fde4977efc5653d79ad86c3b53090003bb72e78aeedcf4c8107185d9aa65221df4e2104640a1a083845c01000370371fea2a6bc8ae43fbe290949da4e559d3867c16df16b143fdc807616f51ebce8d05bb03c2b0bd587b95e3f6a15d907aa9a5b11622ddf4c81ff9fda4bb49d3e9577551bae649cf64ac0cfd646b02f6f16cdefde09a55e77afd16c74e8a3d777d80b7cc42c51f618a3c467968631119f11ca4385f0f5713e37ab1133b692de475db1d44fbfe9d274b9a09e673dac88aea74ba88cde8db3c831e9b5a0f1e40261281e5aea9d4dfd48c5d9e173f4d9cd56fe7fd610909c838bcbe1d6c729e151ecb4caef511a36a14b03cca7ec5d0feacb4647ea5212a11d18cbcbedf78443127680ac0b1bb65120b4197570288226830e2a92b380e32387bbcd3be2c77d6c7722054d849be9de459cc1832ec3ac8e7f60fba9c81cf5fbad37d228eba137a23227d56cd24970340f2b7599aada9d2424cdba8b50c2b97244dc83f7391e2ceba5bc0a11ba547c142126c791265b33a3db6238321a5f3273ffb01e42adee17b898153e41818b91413ec4f6386ab3dd48db875afe659db9eac94d16f850ac179d087d93784d607349e8711f5f96fd514e8d096de8b4a74122ba914520e93a11fa4adf006700e122e2531e1f39340cccbab4862708d69c117d3efbebabc14a0231916ae1ee8285727c9fc980051360346d53dfc76aa5a11fb1fc8f36f95f741e913bd2cd1031e508b320abd2d3a62baa400dc439969eb44e6abf8223b29d4025c3d1ca08d2dbdbbf9927c625270543e8c0cb5ac5bb5d504d224e66a1895719e4f975d819a95e54cecfa59ec8e385aaacbb023772fdddbe093afaf5a75e63a62d51926254e5b47da1e9b05851196644b9180734d05810dcf3502747c4ece652b67674c02aae74f20d07de2ad5993b3a68d10207eab6be5be34e52ada655aa96c1d82df9b24c2acec35e8f0bec9131c20d0ad8936880af87215611b80d07d7a741a12d8145bd05066c6ac171afd8684b92f72237bb0e4ca4aec1ec280e39f36928852d5d8d02fe463acbad8ecefc103083fd4298f399bb254e7bfa166638460b760ccf2b0f5fec0e3875206bdc8ce096274643824acfad71ba06441c74788356caebdd2208f6f077b056fa9d85aa4357e93bf064a776f5f3b0f288d0afdc51558c8f25cbee17247364c2bb24637dd69017f92bbb43024d9c773439626a02bd0cd44136a642c9c5ae593f32eada790c31a6704030f2e07f1173cbc0dabc410bf9864214c298a6283b3631acbf94b8371681ba81eed1aa81ccf258252d7f90fe733ac770b9744d0170cb554b39e6c72e05919cc237f8f4d7f3545f4d2732f4c9473c77401dcba04c0fd33efc73219f31c08dfab26abee9a7cd4ad3584730768fae899fc", + }, + { + "9c73ac05648e0c50a3ea3a8eea70841e8e06669c1e7520c5e25e093769c4b005375c0a9cea16ec8e00261ceb96a00924a66fc0c4e4e089c63e93fea857aead8e0ab82af4ce1682cf3c9fbad23fc3f7e632b7aa169834ddd6c7db7e1e892cac93e4d787b2ed0a812aa93bfce8fef3ce30ab794743ad241974ff989288c43e1ba815a25a03acdc2d5517293e161d0c46c8858d0b32b124a6b0bc3838807753288cf6838fa25fbcf876e6368c0342d3cbc860d6fa12faa1c2b7d9fb37504e60dd44e36ce74229dfb80f1545125718dd1f78b31a8aadbb4d6494489ce596fcc2dbdf2ec22157a1d966b61e780d36552daf084739b602861a96ceb67b65b23d40916c02b2c3a38c2a59aaa266e1f8939000dac9b6dc50d1731e87ee833a2cc3cb98c57e5b680a85c1b428289520bb252096efd7723fa8e55d2fd4e16900a435986ab3f3d2bd799471a1bc07c1772ce10d1bb8805a6065b8903999f9393d2ed1a7e1c57a9e3e0e10dfca17a04143814f5f3acfb99a34712a6e0a24a7485279ef343e69d27c77e25b41f9fb833d7cd29cb6a15551d5c77b43d19feb19f2640926a272f81eeadb792bd474ae11f080ada72103f8f7ca733a9b1325b50589be2b2b3023491afec246d336f4e4277592ce9695c68d5f39c8fa4cedaf51776d7ca29ea0ecb89eaefe71e5f3560c68e8dafe7da08cdcd954d626418677b8f3f45b9194474a32f548a4da3bfae6a3e2c0a25f602e3b3a821160c397d77c8bcbd71c5f1e669213af36eeea30d48e12953071f55eac2fe0bd8fa355671fe032f6fc9214632428125a16fc8aea8a9c7fba0d7518b9a4f876349ccb9bbbabcdb2a85fc60b83ee1ddd041967efa4036e5e10e377c9886f40bc0b0b57c7b724795f843f6a072e87e532a04c21445090a360731a2afb896ab795750e5c2c33d58bb714f5be427ca3751df09661402604a09a1eca95a8344d3daa5b99d68e6e6245825704c5d4a73af197d052d7f75778917542261d77735a21cff3f75d6159a3e4b1a7a9854ee376e6b3c8bdaa1f353b957862b2efd50d10a40007026261a546124cef979ad20d8085d53e30f5736b8aebcd3cdaa349ea474af249ac53eef2653ae1fcd5b3095538de9368d307d45df2a19acd44e3b78c2da9d5d9fcc4cb61feac5dd35f66299845bc0018c3d476b6761083baf33a4621e41cfae0e0c642de729fb2d206db6a4b976a635b3fd911b5e9946fddceb6feb2d2f893b2bed590317442037a1d6dc5b5d72910160221cbecb53bc983f1c736c3bfc9757e9e05af1248b28d651f521af67b2a0d7e4bd86a0013338404fabac7b9833c372142e6338a98c0efb7130aae8e34bb0c80937680a7a904aba3be735d41af9462f17b967b13566bcb697579f8a9340429c77baa6e24ae1ac86d8d25ae3cb9112e34a7a948fd141367898c5f33c0635c87de06f603b510cb229df0d0d9a9e107de88b12686c539ed4fc54c8285afde0c8ee502919a125cbcaf4c8c89f56e90d3f641f97c07326956f7b5d87c65b689f39b8b84359ee0f14d2c7ed621ec67f5e2a8ee5faf21c805187edd95e3941ed62fa95a65473a569566d46b87c0d27ca37b6b022a8cca30a4480d392ba15701d1015b3648958cddfb614983211bffc4966ac6c1f691f19bd9fed405a02c06712d62a775f73353f3949c76b6b7757a4ee0410fd6d20071abfe46b09e72b70f9f19b61410ea67037e037934bbefaf09cff018a5c218176d165d1eb5cfd5c46eee7b82fe65ea02e3ed7b18a86ac7b139b7c9df79e1f6e6f85304ad22d97190c7ec12c651fcc835ea434d92ae1444e7cb0dc644efbc2ae70f2f94310805c1d0f2d49643d05e78baa1c54d4fd99137a49efde88dba1374c94208fb4a0ebc1a0090b043610ebc1bb08168ff5bf936ff9834e825eefb9ab73da2b287b06fa2b0ff52f46061b07c1131e4108cde478c767b749b696f3520acd8d3338842d53941282da289dd1e9a0e02aa9be0f127566c9bf2d50a27f6b6ffc9e9880bbfc14ce7eeee70cb0c0ad90fb474efa69b46123638e8405fdef65fa7e0e7b29fa8fe8696edf661f9003a08b4aff85a4a3e6d817655c1d533b834da981b8c37c38abd5977b3ba71b3f57967a471c2eeaf2f6f258431fbb7e92f91814b1db80ea775681f282290db170942bb7b04aa2a331950b74a4b6e337affb4c51c6cd4c4e13ce3095e73e4767c2731f72bdb225ff572163fbd8573378427fda194d165750d487f6bbb63e1378a132fb6ee5115e3c32b2380b096b735bdb4d651853bc7928346fe3ea9df7534f2a4eae1f5ffc4b82ae738db7df0103ba4e68c2a2153bca499bae2439a57778cfc616df16032aa8a19e26597d275d2775b5ea17cb25d204b18028eb25a053e5666ac47c6def151f7d4b68ea62c601d87bfbe04711c24bc34274be6815024d7b7d01e7dae10cea6e485348ab195a83854663cc5826181b688cc9c091dc1e0d491fe51400e20e6f2a51a7d56af258e038bcbc80e2c4ac4b41661bd33229d07b39b59f3aa79d99c1ef41974a33e02a7cacd6fd8f9b99cadd0fd6a031f070bd3a364c64ddda0e9fb94036f374171de0b3f4ee3380780e6d77d50db9d58e670fb4a364827d631226a3491a27602808141ce657ad6e560ad62b088ff086e6f03b8a64bdf7c7d01e7b19289279509a9d6d80e50aef3b05b5561e4556952c46d0b6ab8eae735eccee77e570e1360b7ea38c53ae6b8eb420e4c2663b57827228392db6e79105a47f7d89e06ecfebdd63783101d3bfb5f494785acfdfed41f8166faefdf0b49260222c4080ec2c6e4f949f41784f076ce37fc7a34fa4e547bb44e6b9359b4b95cd67d64e4402ac83973bd50f8adc7c6e4c34019bd8f6d3843bba3d7155890712e0ed5134e00db877398d86b459f312a6272431f01b057446bfb1b8053acf181bac79408c7708f3a0867a64e06d7786849bb874a6bdf8fd6daaa572d5648ae100f4318d6b3a811bb0fb709168e817ed83c0622a7e5b17ebf5cd5ecb21d9ac32ddddb039083144c93cb55a95ad72732132d54bb120639d1620ebd142b58d75835b35cc6367012c93c6772963e9ac852c71c0dda2246ab845469997fc170d8f62334bc5aa4ce23e036967674303ec6f75bd3d17d197d026de69beda70bc59d2ff95a899d28ac7e5e42f4d37233996a8e6d3b0b86b80df49ea8e145b4a6e3e39f3d6c3c6518bac45baf97cde23037709d737b242b8918ca31f90fe59ff2c83e2f347a954d3559a8e4f075c620ad36be20b1e24b3afa156cf3255192171ad0474e4adc9b7f35436325b92945665f038611e5d14bdfe7b7d20c09642323346a717f460dfe7b5062a0098be66febe9f5fccfc747aeaeff81ba08e5dd2b1a489c998ea9970afaf9aa03859073707a686c492fb3f7ddb27897ba5e75e578bd82114b2ba85525a2002927909c970a04035334b64b1169c3a923211e0999db8baa26b6537cdcf57c051c0ca1b317a5b66ad96cb5ebd57994f99ab202348d8ddeb343312f1f26ab2442b8c5f5cf6bab394418ef2fed68c3e60275e836027515b6b946e5d86d91fdaf49c2a5182d5051726840a156a8653cabda25e1dd9af693533d782caa09295952ebfe6a194fbc8bb7fc2c0da5914a506c6f31490928dc5d6554890f5eb268b09d671bb6b6d7416dd36e7b78ffc5c86b34fab43d22909a87e5239643d5fef373650e291be56b89b9d90431d8c9fa44fdf4f83a1689d59d6ef833b1ce31a44197b36ab298d53b51ae3f8387087dcb0571c340874c1524ba0d576bdb88101c1fc387d25b5c0dad0b4d309255ad5d5b1e209ba56db0c927bd209399a8a3b5c8663c9ac199a76ea4f49e364a4b93a569b3400e20f0d748adf7db46a07efc68e43802a5d1a914759eb2abe8fe3e8d67f2cd7612bd4d5a6a4535b1e5b3ad4d97e54f3db7f8512c9603d87e01160b6908d8df1b952c750071abb1565e5ea3f643f233faeb84278187ff0089150bf21ee4d13979fdae796f592ac5b88869aecc5be1c64665edc8ececc87502d36720b73859313607aaa561d56a195dd3c7292fa8f0750ddd3df9ca056fccd9d6ec900f45c1454c6ceaad4154c69e288dc85735b8cc42950a3c5f0fab2be8811779905c3ad5a9a6bf56e7141d863caa4e93e0065f229b695efb790926618b3eda1b9a15f143bbb09aa3c4b72900617793417df364185cc213d5cc3a375778117212266356e214f085d8a7aed908256c4aa25faebabc70ce913c08c89380da06920069e8e27dd867567f152f883a9bd2dcfb8097b7f065482d6d11c0edebc67feb3068cead403503c04b324885ce1a62c99af9808a5ec8b7cbd978b8c43e37b06e9f7e1ce0b31fa0fe52e8842002e6e99cdf69263d31de080b56c0cf94f77f0397fd1f77b13e17af90ff33b00119999df802c33534a13d3ff7fd0e8cf58e8f8c8bae033cec1aec7d191f2d1a39c7b731c97a67fd1ca43c13a24b9f97d92e2364dc26a1c9408d4659ac7373e53a2a1704a47e01c0223ed4c489735b62a27ec67ea46747e4f48d3da101b0863bda9d3f7f1b413f3e7f130208875e6a29dc30a78198ef658c7ca32d7d53b4b92e51f8ad6d39ecabb800adc0870b2ab0e85b5769f346ce7fc371ad40c561f9f3b2f2a01f2b8ccae48c78a41383cfc36b2a1bd41d61a39c24144965d9aa5ecc5d506c7c7cf9476085bf049942d35caefd77821ad925b7fd3a006213abc1e008114c848d45cbedcb8af264cdc5c07bc338fddd1123940e5d95717040325048439dccd1e298bead22b011ef76d26a390a68161b8bab29e8409a5880cca9c8104694e1282c9fd64f50e73ec6b9a9ffc31115de9cc0088400a2dc806f85487fcbdd60f409ffca584fb197156b40142e512a0dedea1571ebb74d6b26d3b4a59e9105929a055cf3540e8a6a79ca7ea71ba8b40893c9797e81c6e9a7999d4d382e52cac95727bcac354616ae1094552b3d0a33d0d3ac4e547237fc0cd54944039b0eccf335889f6aceb518de496e0986783c564be8a4a05bdc9c67b1e5abb480b98173ef091259d8c772b611e0c09758fceea3e59243406edfa71fc452d4450b55b8fa5ecb543692c6eda3a6ad3bfea929a18ebbe5ce2ac4754989c71dced37286cdd1512107e4e7f4878da1c28b4beb2dd9a712a8d1d61d1a5fe5382db8aab4857b05a783e98e77711c1933a7641fd43dc6e6e597bd03b11ce8e94aa094fe250f03cc92ed5b0a5e7723911e87b0f3c476d9aa0d96adbfb395a8fd353cfb5a4cfe27deeb82e849f90bdb17928b0a5702e4010f7aaece2d43772a78b325d2ff24f9de0f7bc65974d2348c64", + "bf96bbc17abcd1f56a9f22ad164d25ca72f8c996f1a7a66d6effe140336da4f20460b47e1c8573872496343be35a055552ceec437692b0e4919224c4ffc8b603286a8245eff5cc148b004f6e5a54c4ac22b0f09842a07cd332a09732694d3591b8b7d6a7ada2bb38a30aa7fd5e6baa811b9a195d3a96306d", + "aa2f714d3a184a9883f4199e8e33fbc9c92b36fff2d59f07a9d0d335d7476e81", + "36c79f9f14d431cc8c077439", + "873d0617c986dc9d83e9cdfc50b1f916626a9d9e1c595dc7ccd99d1e993d25d89b04a893c89e205952eef8f1733054bbb55fa5e1b07135787d4fcfae226737b50cafa2c11276e8708451be9b4d7f662e98ef6b705c5c4fc64588728eab1dfee22a0a92bae61828a7394977b0ae8a3b6d0126a23583fec025becf0a72a28891391ac1495732a7a4a1d43a63ed8eb37b280b6d886096fbc4f77aadbc5e441e996334d0e10cd7f3dbba9bb7efb147297986509a07735385c681e0543186dc166291edc3b4664f5c8ffb0965c85bc30ff5e7769a69609c69ebb68f35d104bafe3dbd3e2a40e13865f19bca3612e48592aa930eaee29440b4ebc1c0a59f1c54519857c929709b086bfddd6d4a30940b592be48e0067976099efe71f45f956182dbb300e8076e1207baa32d59c1afef7f34171bd66099d2d7f07b39d16d0f8b085185bf2554c6ad66bcd656f07979e8f19575a116f5c4fb9700ec3b46a3254f28afa1ed51348c1af6dba26fd398098a76d7bfa2ff195eebab41330ef290bf75205a2ee570a2fa46bbaa74aa6ba68a0e63e2731dc1974eb44794f3c89ba58cf96f7a070fcca678185711d97cd9d7d8202351ed589e0b05a7a190e60ae4aa109254a7bcf7013f8addd07a64145e21226795ff7c7b1c225f40ed7c3552da8eb18b9bc9bc70c2e7ecb10c8b20c54f04b6e27b5044a7a67b558407eb330f2083444375c022565c45fe817dc00c7d24c23db320d15949b0b64fbbaedd310e73e423fcebe6e1e98a5cd232d97e6466642e5e3b23f06525ac1cdf8688650cd366b1b7ba2a9033e62d836b14bb73717757b76b9673671bd3d3b2a56628f5a309f3b86ad32abac0590c50f7c5a22e0a920d88dc9fbcb3add08b900a2a2fae4178aa100a0e645ab428e0e79bd90baf4af2755e48262b64838a6fbc21226e323c0a1ba5703e30738fc7b5a7df9eabec6199df5ff6ad58f9df5a734ccd6509e53ecb3de1c881732e26e52ab848a0335b04b25f2254aaf8c130c78b0c9a40b60d402673ac7ec7311d0b00c45bd176bc73ad81c2478611804f59e3c145110aacce922e473ef346f8acaabdbb9f313dd3f8d0a937d0c048e5af789e2e09a816146f9ea28170909caf2572a2f6e2d0d511242909de2815e9ec586b2d12183ddbeb7dd70f32424097e2ec28b4ba62cf78f547e2057a4c050cccdf6b582172343742ec8c85e2847efb1595bccf89ece3b3ebba824d2f097b1987ec26c6e5710544739d54a714060fa91b7995cff0161415eaf55758078772c0271d9d282354e47a25b673eb11497a6ed8db82267d65ad47412300ed525af96f943c5336b1de88676dc346e7339230032463d305b0442f934018bdf0242768511d20474c6ecc82fd752c0c0ca5cee1f3e06e679fa5835540f97870d47ccc6bab233290be7a3bbd4a73f1dc7682049bf7b3cbfb6687479c18d246e3c07161df5c889ee95d39cccd989625a8c9e80f951f8b1832f6378e05daa8566477d7fe547e49ae6e822a68de4df9fc4d6500d5219c3d3bd8887bd7f695151ba378da17c2e750399f7482973510a386721c59683a86003edb9f0ce1ea89bd7bb8a25c222df7ebedcc1b56c8ce18f367b2cae720e0591b477f6ffb498c3d7ce59cabb1b01d7cba84d7180b4b2a165d4b889a6ac361720e768f2913aa50b0b5c88e55c35bb4df4fbc4460338809605f1fd445a2bcd97ec1d2f269b5e779a18c8f215bbc5555c745424484ee5436119eb8754f5e9e91f51fe715353596baa1fbb0a690e99691636e6027cbd4b7be752bc278661e2677070ddc12dccc262d3dd47160345de51359ee8dcf2f61044f95dfdaf323881b2bbff68af6572348f786f6e52d1309cff871ad58148307d7eaedc93ef037922b6092ac62171433adc4934884efdee3052ebd60ee115f76f9dbd0eab7c4c0a77b4ce8078209d23d81d957335f331965b556ebd54732327b5aacc899f9ed0edacad9eb98cb845867f249efb0e1a5fa2483227f78decbf7f1f32d060ab0c01eb985d83920b2cc24b5f9a0d5d869e980129d3b78277fb87e5cda61e340a729d86b6617b8828dffc7c37d4c38080ef3515c2784935973dd184e0a8160f84bb78bcd8a5e691760be4a4d41ed6512ee436ce24650c0e17e7d74b5e01cc39b21e21514a84db262d673f24a82cfd5dfe2a162976171c538b24af16429bf8ed5fa8e37f89ec6e7d63ea1d83ac1087cf89e8f43161f225108889e922493d973e36b510074533cb1cb22174d21c4076959e4191a5df880a8b868b95a9cb5151a7ad47375fcd87725660cc0b59c88ceb86984941268493c49b8aa2baa8c531ecf497853ffc3d26b926a379e72188e246d42073041fbca453bd558f328881c8f8d9e099e898a912530c4be499f2b32229c359ea10e0befe6d94cba5ddafe51d164898166e890b22fd1eebd5724451511dce1f8f7431d712a3f1e50fa5f609da686253311af255b84b2106b09b803e94b51729cfa0826869945d46b9606547e7e33fd9961cf15b400d0f5e01d8fd4d92a83ae526934059d4514b9e0005317a70466aa0b6086d5fcfed201d958a0de55fd23f0919ea29b8aa02440031a9fc206b9feef362a73430a4204869354ec81b6fff92eca97e7f1bb12d25228eae466b8137b4806895ce34b57dc14bdcd107fe160776b0e5daab150ba06976eb884eaa574da393af4de355381c7caa4f611a2ee70a0c78df93a4276f55e6281997b4aeb36888a6d9638cc95444047e5202f41f8bdd787f1ff44a648cc7d39f05e49e5d6989fedb194c526780709763da81a780db0d1534a466cce57e11dd3a4c0e273d9873af1040d52a90e20101e1f80ef296d45769d204cd5417a84e022b6b336675d36d9cbdb16b0cbb08f5e240012967c8067c92f97f981cd19d449084400d76adfb7c610abb73bf21e161db04debe6665fca79d71c8cc50adc3ecf0e52d07773478ca97b8e9821a5704dc58acc647a5bc618d2b681f17942c46c266c73ec211ca403a7d47e42e12c775b370cd500d70a4aac7124f5f6d2d4ca78e1c17a96426c326bb60379ceb0c84a86200f3b450e5e9aaa11f45440f5260eee7675a8b9c47fbc58cf18a651a1dc7b39a911442504f12c103054bb50f15381e512dc6e3af7b414b3db26fe767d83a2a53d7181fec8f6b196c7874befd6628b31797ee3c9260c7b7853b137893e36696e2a47277add98462ea9a0edeb7d2d3c0f2805fd7db64c2c7eff353ff2b36f4de862a42779ffd4dbe77b6a79bc9f4ea3e909474ead915fa3fa990bc82b83a670b163e79300b627fb91c4502e96bb9dde00f716ae6ad14dac647c9f7c2e5b2e505708b5fee996b8e9113a8f4f2caaf414061ee72e76b8bf47ec4f781bd7c589adebc2c267448247e30d659998d8037783494a1fdadcc819d7ad7ea2674f75e10639c3d3055046a00814ddda0e463185454a4455d60b9780250183d591c3db6f27373cd2ce4f02f206ae10a8c32d71226e7cb8d5b05909445977164983c0073434d6c0f2bb62bda66a16792d6e53a49ccb5ac3e285a6baba935f30e9d1ddb812a018ce04f29e2009ad678ba72b6a7112d6e7cfcd3ee7b058ec954a6fd7fd01018a6eba6209687c3130de58147b07bcfa02ec1caf30b59daf87db4618b4a5fad34cbc8014a7529b9458e05eccb9a77ef1621aa95513c6fa4003b0877ffa6d48805e7867dcf53447caf348228ce926233f65d553146584d6ff3dc3ed3296db9bfe69dec6a07add13037b3aade118b2ac3c52350b9691a6cb32356ad93377059fb8ceab68de38d96876d6d383db01f3cf620e47cbfd471bf6dd1f601210482f7c3bdd4c3bd37dd0a7507e1f0fe515151634813dd4ecefe97b52eda28e7a7129993b0af311abd3a07bc463f3cbbcb4fb0eb265a5835663fdbab0d8b8b5a73837ac98ced6582348fdeb41ac8ea9e36f9818ab9c0a41bac1389a6b518ea17df043dd50550f32471645791bf59855ed695b84919aa5cb688e569122786660f06e3a919ef9cf18c355bb397b86710c367362cddb0239aa1d32d489328e4bf92b3abdc3d0dacd76ef1a1efa28fdb848e708aed6780e2d8efb19a2e26fea56b4440dc3eafd796896d73fd150bbd967871f5e6ee5db58995f2f85cc2a15077d7d472bec2e30430af6891193ef03dfc7761e2b3b3b54a72d4f1084a8fc541526fdeb0633dcba14e9485b43065aee8750397ea88d9ff13417149e0fa145be666e6f4afdabe7ad8e4864e777c20ee7a2842db44dedee22f3ce2f97d72919b9ff6059352083be816a7515c48c5140a99af8e81b9e18b10074dc73dab55fae66261421629c8e323d8134f08beefbda555660a51e4b55a9ba4573bdf0396cc413145a941c4175aa672586f7676027f9fe211db87fe07a23962f5b1ad8f566f0d5b13c5146457276f307a02e1e13d00c5032a06d225248215e4bc4be1b672f1eaff16ca95da42513fc4315c7a6663f9101aba80224acbf0c87fd3a2ee9dedd1808c1247c5bebf3cb8d77377a508ddb484ed91203a438ef5ed3ca14e087102bc5f3828d8c3437ecf5c92eeec0331ed93ae33520740abae9b7bfc45f097da70adbb9b9b879e46a7d655dbf75d89773f737b66fd8a8c13506cff7b44bd85dee279ea7053f3ed8447fe79c400cf23726fae800449d27af5e342ecf776378e2eb449a3af27a40fe4a9806487b81c942bfe1a4b0fc146c971a13f83669e0189e337cc9fa2024864436189a9165ade6b864698ecb797ea05fed0d60f0ab4b92cbae36c72ccb5aa45337cc02dd086afed9e5522ecdb75ccf389fcd63c5a4abbf60908e39cb3268c76a08687588be67a856a841eeaaee8ed016f6640ef0f5acce12ab8bb58dda380696e3fb22d0bae0788c4fb79d00cfa5ae3e479dcf7d08b45f4592c2d2a7f8081d5a9398659613ba4932ebfd7382d516b2648ec4ff4477648069b9b2e4decc89547c16ab82a0ad9cf293fee5adb17cea4c95ab7b8e386dcae6acac63ad0d1d13656dfd97d5623dbe45230de597751321bbe5a03c879c303fd7a0d837d48141decb6df4f0865717628c85dbfda29df9a8a69b2c956c75fc66e45c08960c23bbbc706e48395057f989dfe675305067b3ed8d046db339e504d5b2bc978ab4dc261d8afb325c5e794ec79d63d8db53f9dd24b623fbcc202679fae8f7d39f7f7e0667b142c714b6a723996e5254ad2ebafd63c3577f8909981ce6b3eb1a6ad67a4e93c45ac3b34587d153ec5ab67a2697a9741610d5a176cb9b5856bdccb98f69421061c84811dd6660495d9f30548efaa69e36ead246d997c95bad0ca3fdc1a08b4be31b12daf211d3e29d585cdac48af8f2268ec304bb35d", + }, + { + "ceb1f819497c0d631a9c9616655f419b5e3470fd3b19cd0e4fa556bd26cd9df57e960ec7121b2a2cb7c0421c1f84b77eb8277bf341490190ee574d1424eb09a281176a933394bfea5502077486bef23ee66e3127b732b7a58a04b9aeefc35170dabb030d4fc3f8a4c5ff194bbd0b89a379baca30ec81d576868f25755276e62c31e93a80ac322571313ebcee494592c3ff5cf3ecdec962645887d9aafdbfd62ea910af5542d4c7731283625bc9f41ec85012b42edb1792339e6cdd9c2bb3cad4c4792a064df17a5f74dcbb3dd0d90620ebba4fc6d1e1f9704dd60c798ad64d4e5077549d68cefdddaab81a7a91209b7ddbea43accb3d1c191328929dffdfeb4f5740ecbf0ee99cb9a1b73333d7ceb0b2b8f35f84307b9d44a42fe1a30ecdf2650dde251bc8c1d46978089c50d64c028f40611370ddb0b481df9624ed63165370f4788bbc396026b268c2023e0f04cd4f66e0bf439074c46f0ae85d6dfeb0ddf22868af61c8d5133097156fa61a3cf5801db5c3ad29871d336f7aa06d2a7d5f52e50eb3aee3c7de7bdc4d21f68a1776a7cc3954f5c071282febc89c1545fc672a0a1bd8eee2b769be048ab58ea12b356d658a6225fb8a55e752f1fc97ed64c2f87f9ae661514f1f56d9d4e47b001ae865a44b8a9fd5df8628d183bfbee781b6661c9cc76debe6c3c5bba840bbc228206673aa05498a8c715b0f3019f6b2d05cce6c233b5809ff1dc4a75d7f69859fcff94ad442d460b32f6fe348659518c16385e49fddee9efab2455732aedcd17dd51b5117efb2ca1e21ae6787437f48a7042d46e11be4dbcd2932ffd70fd154e4eca5fcdc57c6fa79746100b8e1485fe575a5c79089a25eb2d55d89e42eddc81b82c4f7da8bf153ff5353b7349b161911bbe0a14483fff6585d7f3c8b5c04a6dfc99db9548f0c53e25f0b16fa212f0bdd10ad2193ac18eb09972795f42b3bd3f4d98c4868989c4af7a760f1c88ffda59faac73256df1d607644f56a70303d6409c9ad716149bb58f01b4ab8ab475e4af1257d47049aa77adf9ce54fcd22b3d6ec60484da903a6991ff052ca37b01428d5916fd92c17530bb3385a805b0d57476e9f9417a23ab1c12a038b61b3a0898831f9615d10b468c3edc24448d09b8f3e3a2355dc5e069e880929eabcc97344fb6ca5587c5ac1404783848f531f1e915941e7359fedd328f7fd12b3c685f8c1f29d1a6ef7dbae3e5e32cdb251eb43aa2d2ae0cc18b3f40fb006c2778cba387e5852ec4f2d9b8e8ccd5b3e1f4781c974aca940c45d35d30d3b9584c750bd45a80f32f73dcd85c99ae107b92888839c342cdcf88911cb974d611b14b1d85a59e88c502559d6eef3b7f5addf7d307bb25c57aae669767db6d798ca887124e159b0317e09076cfdbe61aa9ddeda189036703b1cd9b1998f88325910a37ef1fc2e227a382ae635e847df8625b99eb6ef0ef10ce7a2a5762ad7d03a7a4e2b767c4df0b477d6e9601dc8e6438184f97193ea7d7a8c22f1b6fac1f0740f1beb8b68db40e0b22940cff2261273aa0be43df561b88184a9377e6a27f27942dd04abb9448b6b6ecb3a60f14dd39b58b8d94e1991cf9d3a071ba42e0e1d71eb211ca466a70fd4724a34639707feefbfd73dd9680d76a214924642a063b38b85cf30eb763fbfe889f34b20fa4a10ba214d938a5a092c6e9b73b13bd664c75b34f746aa360593c0f8dee0f328f0ad4a3e40d498490007e573b8204a1ce7a550deecfb15f18ed5ea6cb5dd95a68adfe4cab37c13b383f8273b1971580016a8df02a3f4f431c9de9e7ebb33244512080fc5852278081b9f4434109c3427441329e8071d19d0fbb74fb6ea73fbfc7c0ac1012d3a0948d94d7ceae9b0112ec43a16cb582f9c53e7eb0ad15e05ceda108fdb3dc9e585a332018d1cb19e4a75d86041308fdd8476c88e4826931601a3a5dce06fc16512f4669f10183d5a8d15bace4649abcac07358089aeb1e9b8fc3776f3239d5442d3be33d532097e13651af7c9a5b465ace9e626889800318447b8876b45dbbe1989e1eecbfb5cdf5067c71a0d7b7fba6555d0edede12f7228d7f9841dc532274f24060b1f52da6fbaa179b81ce962723f43601d248f8f4d5778c1653e038c8d27828836d562968004003810e9aa9318edf3260272b54fca2e012f6c04abe92c2e6152f3c3e973c7e9abe8c3467bdc246f0226d1b7669bd577bb317c571aa8758bfb694fe4dd17ce78f091cf6c6de3cb601a9d177128fce8d42e652b490d90c4f8fa04ddc71cac300d3dff699be3250bfdb2136edb0057af3ebcca77ba5b3ca34531810c5e2d4c5b5b3bc4e71ee9e30cac067b7706c326357fe0ad2a4bd9cd811b4e9d696bd9b4b70579ae246381210f879c769e5f9cc3cf8d70e9c94ab74a55f5d7bf61a17418b6edb6db4147fc40cf98c75de85421b7d192919add48e5334ebce2a06e56b915447fe085b7dcd677659dd55de1f705c389975e56e0338a2ef07ccf5ec3786407e8449d9011641786f1ecd4d3d3da975d61f5a442293e6119ab20686ea8cc7681010421226838a95a157e2de948c536aabadafcd4095dfda48e5613272289a8238dc945e5f1ef30075d5de096131740cdf23da1fb8b9fa009e5b321083cd93bba9271909460c09bbe1e8c54319394ff85c291814e21215816d4791f01424abbe4cc4c792d0d04db1b812f4d24b44caa76de2bc50f4d1d1611862512d87fcebd3c0b2659082b2423bc5360d107ad7b8e8ba7438ae4509105d6b618af25e75c51e272aafaaddf1e5a227f2b2a2c96a8a83dec23223cb428136a30b290181ee20a819cf52f6c03798e7294a89f3b5137693d5a8b7a0ea38d78e43008fc4eeaf6d077ebffd3ef7952620e0af1395c38a289832df391d1710ab5b103a1ffeea8c06684c03a74399cd63797c770e3f0136d8331611502d21fb883136a82f2034358880392fc3d2fc274b799e59b89f8f90d2a5a123d3c21e5bf3540323743858fdb8912c7c6329a3aea241075ae097ebb23c8cd50f4ff46b42486e65bda6beba5f4fe6dbb30f7e61b1bf690c9f00f7513c83274cd21bb71563257a20cc38da2b88c1063bd0849c8243058ee205853342085a8edb7545f0d96a6af936a3d4612b95676665eb02e72e0875100dfa444f039eddde1422ceed8d38e6c3dbba25064f8c6cb5786f9ca67712b7840cfbd40f99b1edadd4bb9a61f48124cf3b49d68bd642404eb1dcf428eeabadfba6810a4032f8ed06b38867a7098c7744d54dcfab8f0ff941ecee69da9916d54097e080cad86dd08bf53833fec4aa4399f7124586223ec70e2c31e8c647be06df9e86a976f37901e9b134e775de2a0fd53d545c5f92236dbf5455859c138b7bb1112427049d29ed4f5dd5c43cffd3113c276d9bba910879e55efe817189fc239a204a9ebe738c0dd161d10d60a51e9dcc8c38861d41ff029ffd841086803320a17ebf5ff14b6cc2ac3dcf0ce2eea9af7ae23597233599c2321dd2b99e06d93f84989e75e30a388f47079c2af545d96f270e064a43a00c76bddf2f5be5089a69a138de844216148a1eb0b413f58d831d9b8967df297455e7538442388cdda12d157fb25896c6e2b47696c76b234a88bed4f09dfd64f2e4b77627ef03049030190fe271a5a853591ee9218a0c6b12cb3f02683d665b211dd1480cd44c9c0566ace7d751902babae14cc3821374bec774d54b4b4afd5d1811ede556a7a5ad02642a878d2d32380e7efb9082604f49d51495105f827d77945b5cfaf2f2980566b28ce3dfbf1bee2e077eb067bdfa4cc28f5d2211ca99a615e69118d9391e3feb9b13cb4a2fa9682718189ec612db889228aaa3f3345a091aeb11f41420240fbb47caf567646d9e7c762d3288f8bb2b1165cf049a191db5042fa9185fcd180b04d3007c376e0aa3d427d66d10918821f74736816044366463df7cb3ac94cea167cf1daf2d1842f130295e40bad672a22da9238ded69e241395f04d5e3c3875b8294faafbd3d90ed56ff3e01c5a0a3e349d761273143686aa26d408620c7d1a35ccc430a09e3f750d3256298c6068c0fdded270f308f79d2fcba591d723ac0cef703d8f0e7c051bae5b453abbadfab98bcc297ed4201b03ebc195c2e441cfd3b10c63c08868db36c320707ecd6a37593661d70a81f30e6db4a32f98e4fe6b950ace55923631c8f95138781fa2af78d8104fe39242f1fff6942e8e782dfa0d37c863caff9492f8e5cb70046d207c4630cc29c20e1ac105aef093261d8d335456961e552ab14d107cbe14e9de912f0e5d58d16b729270208204469f917af4e710123c3bc38a4b3f485f2926f058344db105b9239829441a2d8ababf04aea615c0e350846d9bc3b5faecdbeb450f38f615f119ad1b5dc748e88107ec2fae01f0915174feec37b3e7248ed2699d0a5fb2fc785f17d6275fbea867aad815acc8a6fd3ca4ea7357d197e5a30082ad5f35a9d894c0aebb206c6487163c9cc20442c040e6aab33d7b4b221e4ba4cbabd975836e353129559d8ddcb3c97876cdba360da0e0c1dd5b0cff7957a444027db985ebefb6154453a221076c997d3954b347f49308d2ee14d1676b75ab6ef365f3de54aaf398fd96b9040253813ba734829bc78a6db59e3f1c0ab4c878a72d6b8681157919130fd3171126994dcdcdcf68955ad64af8156702c92f7a715ce6f7ddfb70f60e80c92691efbfdebc8cae252108fb6c0010d303d9027d4a5e63413b5fb2316d32fb93c3ea52a2a7df50cc0058c76c58d73f5bb041d9fb9f3c3cda9bee0c0920079ce4f1ef8698ced664ce2e2b3b86027ae2b3bcbbae5bf7ea3693d9429cf94938dd3a2763d3f53937c46763ffee6579d018358bc69182b1c7158a09b18352ea618c11c45f07fe97cb65faca535f43237879ae3e0a31efd14679daf8fd2ce25eb8f32218fa20afc586a98fd908d3fd804cabbf56dcae272328011b252dfd83e5f0a5fdebc6acb04c5540255e1322de5fce9db5aa4cdccd74dde8990ae51cefd6c1edc1879971d3efb1f94dc41b2b23e9c9d89415b46189914a229b2f3e8b05ff78c68711385a00e9534dae6f79d15842aaec575e4ee0f098028bc74016cd3f8e93c6a0cb21a0b574ee63e367343ca9de28003d76e02d0ee2b8d622cfa3615d3628fd02499eb7bd8c1aa1f34edd9c2d059c6a7c7c978a5e4f60801e03e17c3a09793c5217f310a30db1965b8e328893cef20f4a899aa8d9fa28f7fe0a733813ed7466046776a874273ecfb57158483f4a588ad4f232adec5ba4ea651822780596de09fd54b1717bf04130619979a0e3d12ab7c35d64afb8099a1d21bc952653742f50c8e1c244d10374329cedd27fbefd37815a9b3112a4cb2fc587c4ebda381b2b01fced45cdf0b9ff8ca7d10b65ce42e728de183a82e369486a2e3345664e70674a5dac174d6616d90de8e472b62759df057119875483cfbfb103041751747f9cd12bb31e91caf79eb2db1168026a4707dc618f30", + "e45eef9561f3acb3672b4f38570256e8cc4d877e2998e72b022e33de8fc20f7320fe0882f2b53559e084923786e8205336a7d15f3fb88a41e7bd20767f2feaa02df2221fa7577988db0bbf61f3dfb429868688c53e130725d0279c505686f083", + "475a44cde0cc931edf9a44b0c1e0001766f09ade023dfe6b59a6af800e549b55", + "7812a320691ca8442767a51a", + "eaa577bd67fe79ce4586f43355c94528e306c1678946e4f7a907d2a8ee7f4281270502522119a8b09b6f05d864921cb515fddf6a1000fc2f67b52d0627998591e2acf5b6faf71c278e5754b2703662ce670dd049da8d6e280c2b84d6a9b29ce28980563c40e03381a49c54608b72faec9b272ef05cfa41957d9eaf3e944b22610c725d8efea90aaac6e782848d368ffc08784d7fe37ea1effbbbb34952def29fc511fb10a1282bb0b6334328e4d00529a44de3259b522553a07d524dc75f431cc9670127c15670c0df419826617cfb5ebdd8788d5f528a9eb1e61324eac5c1746f339aae2e2e2fae598642a389da671482128acf2d69814258d83de98f186468136868b729aa5f0874fef2ff2575a1f87439d64e049e4d0637e9c99ecb7275417af654541306615f30b75a6caaa563e4790dfb28fe9f0e7881ea2d885eefdba99efa7f878925ce7d33e86d888154a1b03189429fe20af8fa3a68d65ced9b690a709031121425cfcd7e1890ed9614f9dc3ecbd0e38c6c84e453e3204978ddc1ef8d7fc6cae28c61a472d8e089e23209f0c36e80c994af771e6505e72ba90e5543f6bad6dcd31fdd468b13533a0254e44797825764ac1f63747d8d6ca019ff16fa732068ee94be382c46b168050ba725379df31a98ab81ec8eb266a3c3f2e1cd95e5f12b3bc79b8b435e4d94098c6184631cec57e9d8913458889223a2a4541f34d2f9df380f34c3e541fc587f0a6cf08c82e99476060eb84709a292f4c7a8551bda3a9eb6735787dbb9d7f1e83937c2e0e49f2cf6e0ab0ad84c40fbafc3c7e61886a8629bea816972fa0afd0f617b6340b1af19e341875e97565c8eb0b25fcf68696ee674d2abdc29396bfd0f282543d2b72a239c6470f76d3b5bff6d1d064e6e2d06f9deef2aae8a259c034373efc820f9a2fdbce36cc27f35dd6386de3b49509d0c305757257f8674d958c580a09e768c0f6ef237416fd53c31511badb2e7cdfee636508482f01899e72052b46b5d844799cf94708520178cfec2b61c8980fa7dfaad8915b0b75ce6eb57ed4a01edcb4a35c1dfcdf8d60f3191bbcdfd522a0e321ea41c2cd87a303522d0f98b82dcbe53232ecbf0e2528de7e1be75569584bf2ec574687fde67ffe9827ebbe78f2e5bc4fb368f3c9b0f588c97f7a139bd82fe86eb605b8e29cee75d07b510da1b24fd62cd2fb366f1621e7dbf268b15937f7f7ea4acf6e615775a32c90733769996dd2c5aebe08ecba73e0bc4781d33971992b2764c1b08aa972859cb61b003406479423254a01ea85a348ef249d408157cc0962d1e24cd9c426e6e6a3784dec6fe935be1f6730b01e8683d97e21d8774b2e2655f85db7149e930a44524d4f86004cd687d8a528b6ceadd890707458cab62809110ee28f61a7277ed79dc41e573fd4a59fabf15393ed4c21bf4d5138ac843e80bbf5e1c39ac2d7f2147f35996eb51a9e835db63faaa196b8aef1823ad72523fbfcb35b5560582a48a25ab770e7528e4b3ef291e6f62f5fac916e2162b3b56304287e46839858daf322b0de083d1691d6bda44d66d085ef0d0ad364eebacdd0a43a4456035e58910d0b2dacce45b1c0beabc784f3620a3e4390c345df6117b86d4fc386523b7ceeaecc21233a2865ec6b63bffba6689fb3323402119db8f0665a4730b2e26ca6411db04f1bcc78ce6272159ed2665a286f1ad7758d6d90090a6fd320e697dafbdfef575077e282b825bd64a4dbcf92d1fc0c6f795154e8466ee4b318f2d44b6f81c52523ab68ff8367e01090c2623e00b4008e784049df873a35c29e0abcfae7acbf27236adba0b913d19a15b4af4996669aba4c656c317084347ca962ac8df15cd2f849f522016eb92de4de62944b917d88200ef9aa2def0d13e5f4ae09d2eb4a2d0800af1d704cb01975f6d59768a2b50e39e78116147fd6dcdfbc08354c1b4033bf6772fa127856a4072556a9f07bd7516d01ef41bcb519005c0a3b2a04400427ec033f1b52fe5fdc1aed8e2521fd0fff663e203defc39d7546281a98a502b8a470af16cc62a6581c9985d7ca516864b799fcc55a803ce80711484f6b81591d2402bb1499c95dfb1dee9846679c22853be87c84b4547138dc4fd46b4e79ad12773a5392540a595954112f0cb1d9be4d4eb3aaa4286b6c01520558d58587d9d7f0df3a0282011ce01c9c17111d10ad61b3675b1826c1ad37fc562bdde951b43f890555d6f74ac4fbdb9abbe8bc1e80bb6d52c13de8960a3ff8f65201265e82981dbe39e0d65cf3f1fb6c56e11f9786210383d0150a5e0cbbdb52ca8b2bc45c12fb572657380df369082685b3de9847d5014beaeef815d63e203cc911061eb53d89a312d187f9f02760bfa71083fb643f5d8c324c410070b7ebde250a185e7359837899bb1568a43fa3418f39c12feb03b148b924bfb98b99352b1fbad3f07ac8e4302f85d1fe9ee4bf7507972670ff8beca105cdeb037f1cc4f944d6ca869d0281653de5ee93a7362420fdba8b01a375ff08fe27873655953ec1c00f53613c6ab8b244e2fc1b6babdca5311428d06f57aa4882dc870165deff75ba877dd2a04d1799f26ebfac97a1be53a83ab77dbc2cd4aa45bd779f61b1283eae1a1866ec8a9c150dd0a4deceb2ddea1bc0f4206cd435600a8f190b999b952337d9eb2bdeb3aba2cb2e7000319056629dc1f00901f0880278509417223a3ea0919fcdcf12bff0771c7cc725bdca292068478ccb2e1f35ae8964e0601789a73e7e7c1769ba53f865910fc3d0085c922d7f7849d27b6e7503d521371351f9d7dfd5afc5df0effdf6ac49617fa228501ad72154a73e07781dc4b07765dbfa721d95cf1dc41e161cbd34fc7883a25e3ba6b03e504b2c3b98c8b12ff629b965c2aefc26d74faff7f784baf09c3fc38c487a9d1f5818261162f97e9dff70cf42eb5dbcd7bebb66d68f26d917ddf2a3efc0db1e3372b170b4cd18da507e44c467943f73648dba74db1053b53f989e481c3054bac22c6342fca2c26d30a859a1312e9c353bf921f68136de2b1589747bc765153927c31ebe749dcdff98b5da84c4b66085451b4c87fe1ba2142f98636bcb268c33f7b8c2b96a6525298814578377aa189dd73d5bb27ec5cd2110d8751c18a3110273df2595d4c3a00809bdeda70d86c4a8169b7010c9cdeabfbc3dd3266518226d0ade9bcc4825f18198c854de329fb8fe456dd3bf35d89bd9d2384f3f3282f6872351a18a2f852bf173ea4426de6d01b3ef4b4685aa82df7dc45b99617a8b8c8a0c65a2237b3eaae8267e1f6c453f485432529d973924a080f6a1cc2cc18f804f53209383ce3601ad9361afc331707be1c88b4370404cb7fe0bc538df04adc5c8d9ced94b4c474b19619a53dca3fddb434cac09ce10c0293fea04e8e1b19fd3ff3d174baa988d91cb604fadc59ac0b61f4f87bfd07eee20f7f3ffd96766dd6f3555cd48da7ecd71d2fef34ab082678bfc4dd007669b3fc7a937a5a46269baa7e4e4e43eff1b2b847ea70b6c6c23905d6fb2fbccd944251087ac00c35c2eedba30641797d36ef9d3cb1afc0e3e8930f5b605a847ee77106995bd44047294d04350194369c5a7bf246d1108e1d18d9a638be0c051f695ce86579db613cd8922e86c683c91800b9a34fe6339e0dd79472daa662f78f04f0151a3acd18f11faa4e1216222843b521fb998c8490ab8bab27fde36395b456501307d07b484b453b189fa339282a634af30fea99c9af8f877e61871fe743238b2cee6cb69dbd17d574b5106ebe4b0fde4ef42fab469a5ba7d62c23b67d857f1af6ac981c320db70cdbb6be41bbca60bb7a159ee1c85cb82e0a220064359c06c660b75de6b49839eea68c80283b75d9d627aa4500c0c0f21edafe4a2cf7ee079d5310479da06ba58b142614fe69cb236c51447d63db31cdff91485b46325c26d40dc6d608d46a5e2fb01df06064a022ddf6d5cce0147d5b2a5aba5f9fadc5e778010a924e00a13e21daeea2cd330f45536ef4f42c2e77be00bb53b3f9a93d3eb327dbf30baccee5d26849cfad654ff3ef2b035b78dd3ef42de3302e5514551a968a205b823dffb040ac9452ae3efb43219b02436d0761ca11470405510e534d56caeaacc40eaf9c47a39475adad266f5ddc813e71223800dd46fa7c02b078353f870049806ed7ba57b40b7c3c6272296667500c4b97dd2d7026698b6bc4985bc01be99e0097013a2632c71740888ffaf902a02bf644b38cf9a42528880d9dd142de967cc2ad3e1f1737f0cb8dc5c59c252496e8cfe4e53c82f4a28d9ba2bfa62b6415ba3e5e09040d7f3e3abfeba53e46575e8817ac5eca806ec8a84c7cf77c9fa86c9dd2940f5b96b25a92d4a8f894d4717c8f80a62a35a51d8511f1e822fd79e6fc27cc3f3097d9e3272447de6f223971657ded9e660ee4f8836359742ce7616fd0ca2de6656c71b212b34b8edc71ff36bc84ac4af58eb1adcba4b2c0cb31468dbd2c2b7ee6752981ee1d152c4e4a9b25b2ce87796820def34b662381806d2e4fc77f0b69d7a87de43d94d62a6a6526a7f8c588392890e96f9c51bb58b4f438eb5d197477ce9b160d1c898c89ab408b3c1d648be93b531a5bb4988592c5a8999ae3acbe586d947fe6dd507cddb92dff4974ae17ab99aad5aec9d07b96bd29489876f51afa67570e86b69321d9e565d86001514638403f86666dbf93f18e0a62bf65db333bb85a3ae12d8411aa3c2a423a29bacbbfeebb8a5bafd90436bfded16f992232360211086a3084d9fd1980dd96631820a2cf25c3ac5c19d164cf5ab9a852399491962100ca4fd640146b7ea5460b4fb9e46bf8d23d508a4eeb8a3e9fad8249ece3648c2ec7705a7414eb8e8d602549204cb437f589161fe40de1447d14efa4d738b775d0333526c845cef5ffcbaf5c957df1d8022176b56eeb198e7ad2dfc3d7ea46b125ed432cd04c77efc011a2dad8573345080d7c3cdf5cc160fbc86c4ee1959ee1b8258056b0f3d9343c22dbb2f7858c5f162f08cffdca1acc866aa68e5f1c00b74f66544e8a61e429335adf6f73e32fa87e48e1adf15bb6c7aeacc93713dbc31cdccc9b0e52f922842679494039c395cc1d95eb97ae4df3bb8aba9a2584d97a236f87cb22f00c0a078b045044a5c456e22b2b94a76a559de2672c880660f9785b76bcc2aaed780e05212415c6e73880ca110654ed155a1004af45d5f15ae8e5bfd4817440c5d3d5589eea2c6c344ca0d85d91460638b37f877ea4cbbed35ea75678ef2335a5922cc8541987cc256c8f58045028d33a1c4899cc32265c619ac782ff998a478996be6a0c5b102a664831b395a884f18e77885d860d6b236c52a8066d2ced25432bce79a31b23117f405ef4ebdf3517de98d288f8c3baf04b63b6817c46c14b646308e9f97170b7dbbf9d1a36480338d8eb7466df56feb6baef42cba75512954fd7e33961d247b7393726e46c6e94e156d5776a89ad3e288554470ca0bc4cf4d2d2b0c01ae4fcafcb65ccd6ead03df1d4d6577bb", + }, + { + "228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a71e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b89696e3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32ad08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e3069313ea243933b47109af247fcbe0c70f9024ac5a41815655ab309fcaa282d03596ba59cfee0e40f7bd657689453e98d562442fa4c585f970b6983a581b0b8eb1c5e780b3f5c1abb326213c6b5fd440c2187066ddf55f4eabf88804139392c45979440c6f05b7222bd95e963832d7fa4a4760273cc075e8b8feeccb917e8feaf7d3f766d9ae880487e69bc01872ba62b91b8af5dbffdd93fdc95e8f47ed793fc070a5991f2e9ea61439662dab218f643c1959171937aa160008a548f51f87b58f2c4fae5aed556f26bb9cd1dc2b3518458e2f5ec5d974c6e11a0ed639958cc8c1db771cc8cc8bee8727bf6452f47c9782acf548856a0e67841c3dbdb1c98572a4fc8e6cc8195a504019b4930d302a90dc20d8628ae6c90e0206cbb3d05025744db4e115cd3b650e5519a1624acbf226ebca8875b05183b2584e65289f8b9cec3f7d010cb9671a0e80bb70ca8763f1722d79e8decb6b9023baf64b5981e745c06546cc1e", + "ade72c2ea29cf829ffe99c2d63840b2eef9b51a9919c02128347d2e88e9f063b86326928cf6252ce4beefbae7206dc61a22d0b33c90d464d551835e3b73c1e3d6e88663deab80c35a607e4180ec079b0ee84e3b7922904e7423acaf976e837", + "43348cf32211d7daa300de8a4218543c8e3c7373ad10950765c39760f80b733c", + "e4709d225a552e90fb357413", + "562050bfb40451f27b1181c389508550a0f46b53d14ca73143da9dae3d3d2b466e9618db39e3219675d2b6eadded7dd9c741d7c9bf3c5619a521189607acbcf6b3964d469d966fa134444aa06d80749c873f0f976e0c5efc5be8d00a2729f03eda6a7b8630575df8b3a19388ff88daf0d00bb3e7c35a525ded90a4511ce815fe6c8904406cf72d7bfa14ca533566f7b54268835285c5402e22a63f98b5d90c86dae0a76d65eacc1ba85b3f5a1499d5f3432dd5455fab9e8bfbd266e99283c2bddf9b556410956b2f061603d1fc91194766f90da841699ba7da3d53ed5abdd8e98034f8fe734446d92b458a731aa4c578552ec1ac5d1baaccc4153a67b48a290602d5f955d61a08436b27cfb0786a80afef76e1266310a42d90feeb3bcc40ae5c4506432dcc92f7e5758ceaf277255401f5c5f4b10df93a249e38edd9effe7bacdf7fecc451d3b2cea77c9bab0403450c41929775b8c0ace46f6928f4d9cf3adf86832d298ea32b236d3201464e2ff506ef01da0e1e389e26e2b3ddc553b369b48d1aa5dd43edd5cab065e276aeff72a4c43206063fc7eea3bcc783ba2221f5b615a7a43a75cecda6bca5aa159e9208bf66af61e2e465c2daee630c4c62077ea6ef0e8b4b4e272d4e93a5f5284f9da463e1a60f815a8a31698ecdc09dff2b62f00e37aea5fd4b07a110cef27e12466c1814d3b10017cb9b8e12f2f38f10cbe31296de2570d5662b16639fcdc05db81e0d48178d055ef873501148d00903ec771400fa4873c5579dc3265028f531538f6dab1e5607a15c8b90cbfa4835107cba6f453bbdc71d08c7e423f58b44be38a9c8a610469f2551ee6177edf639cde35fe8e02f76b7ed106d691a876a4fda3b42d8ace3e0d3d4e026206c5d7d4d56fdda9dcd30fd7b74217fab3c617903f1aeffb8363443ed128af94c391810e327704d6f655e57dece97658d41e074029823850ddf7c5937af41c64465046d8544bba65c691ac69121bd272107f7eef8cfdb6a25da5da16d1033cede09129d51f6abfe63905a6fba9a64d7832fa35825447150595a60163af848eea878fb31a5fb97b1859efbfcc8586eebce8cfe64386461a9b88aa5efc1db43c64dfd5d4a45aa74803fd178f9e16a3f59acfb6e13a564d645cedd73890d0a82fb6dffeef527694a7cf2a89aed9750c3675a67505bff77de8d046087bd39a85c90aedb085e99baf04c7e3bf92e350b332da1b8af85550a00d68904ca426da61add864496d6ff442bb0b848e9aa463bb0c2085cff1a83a47d6f702bd184cfb5c139752754c8978d27b58d364bd88722b9097ee3a6ae28eabb14ca7c31e40461101e92448dbbc63b55cfe56efd078d0058c5e6146c73bcd949c4b3ec9f881b9a5f7b41ca83301261e0c674f2d35d96761baa00ce0675c082bf73dc52dc726a3e605067569a372d2bb47fc8fe1e74f00078ce6f352a6d9d97fd2834670ba3a45aa6751eafc7ed6694e1e07542860c8ea516f296ee901a3ee16b00b40419c74bf6db12c7230325e85a918f412bc2f6469c1a13a5aa77f028e327749efd05b91053f49d9f1edf49aa552c58c68257233a168db60ac55b4086ddaea275b078869cda7b69493c4b371b4e9c8361357a7ac7d3d3bbb464c960addfa8df2b208b21b090d540c440241598212d33273203d484e0930e22469c2a8e866579a4a2b3db8f8344dbf8baa1b97be0c4d976f6aaf14cc09ec52630139b894b2b6f4dad3a205a7b286253f1522b1d6e43bfa37beaf06f831c6f0945cefb2593b9b298da13b0d910582086c5d7e256ed4067bfb476dbe01bcddb437d46ba716d6ace2ff9912c8e460ad33ab3d8f97b7b08dd4ba9e01968d1949ff85b4b9d5b8da291fc0f90ab1eab1d246f67d76092b7a37528ceb388dd76f8a8f0aabb7490f02a2c8bc6498cb26350d859c466dd611bf0ceb81a8b7899c67742c22697ccee21c4963acb003d15c1a2078112bab05595917584e417db3872a0ff0a29138bbca7314449b19827525340370d7e48fdf9f7c6b4a280e78d00775a291081a5e78e7a00ff915015dd5af5f0a45690baba8b1b503bf85f326c23136f4424be4a559aed03fbc81400ac27a33dadb2155d1704950d98043dcd86df1eee78f3f266c4d14deb8126708f74b59aa15e8b497c6a52924a473f999aaf0abd3d148fee8503a1568efec7bfb0bd463402f563e4019cc9c9e1eb498aa54dcb659f43b86df0a34de4e51ec558bbbade3d69511d3fea2baf44f67e85ada7398d7f72ecadcd9e981f82b0743ed74bd33088ba4cbc85b0c99dc5382c599706dd2d51aa9f470c25a98e7e8248dec216a155495630662bf6ba0b7a4baa2cdad30e9ce3e1a65e3c23d69d5f946606ee8504dd70830aa5a8ddd84f10e064695469727d2efeb46186c9d3b7a170057636f05b9ec4c2de7d935fba504a1e7eddf7a5a95226b253b0b9eccec976ca3c57599850db40c27a51ae755c1f30d392467cb74e5c8235861d11d0f8461b0e1d84f5718d64ea92da62f4de184a6499dba473e82b3d197305de0e494f118a263237c7b4c0652327977edb427ccded35552c00a5804b9557ccf2bca2484d9da2c33f6c1bbf2c666ea10b4644a21e3905e5c4eb417ac3572e783428d23dd7222e75c356b99e8183d033034e29e618c90e66ec2f1e9fca47d82c1cffda8ad14c96045159d9437e91ecef41d24cff89009ff57e18c1a422860aa9cd31dd2a85b07422c72a5decc614a9742e62a4988f394421b6918e51c2412d749bb53b1e8fed7b2ef0873ffe14fa77bc366bbd5fa1432be465f5e25266c6c12b55df1f19b1a491acfc5c9019f122c422243d751d8eaa8ff721397915171556e999b34425f7d3ad6f6c3323b8133b4618c65ac16cb5941edc979472734bdccafc73c08939c0b1e306ae3015faa9cfa09ed6560269a1dc54c2c046a12a178144f4381f7b6fd3fd2d28f778d444d9f7a0dae00ea96c6969b78ef326a962d23275f1518f0e6a2469440612f3710b53538fe99a6179471be8c5b2d682ab3e9a5126e41ed6de000cd9e92fec3974e0f4cb2d2245d03d6ee80d6a793b16efa829d75c796f34d4e918250f457703559bb48ff78f0896be1bda403b7f1fd6a319d68478ff70d88238f2b8afc7d20e51757bb9db3bffb35a8040fc0db913c4f03d48619af7fd24cb8986b3e139058be3cc253b3de9b3bb3f8dab7b8818638279b2e6a0c29cfe16fa7250d3c74362ffa07e2977cf562140fe28afba8f61d81f7c73bdd4a2faddb00752bb049d0a57d05c6475c7387e6716ee31974169930c9fd830cef138659cf56f2212de185186c3d683fc6b7fd36e7821f69d0de041a569765066dc4a1934870a7b80f174e8f9e484942e62404a42b21658467873865ef94fc262c231527f39e82dfec91215947b99567daf75c6a28073ee4e67d4307e4b35b46f85433abd9812f35438b34598ff3b6dbd60b60747ad64565391df45ac80b272d0141702ab807fa27c6a6ba2f42c3facfae0c773940cb2943bb1353b41298258bc0d07542b69483e17ab9ce709e4160b80a0968dae9af8fc7c0324c753ca4a11a6df32dfa79a87b445c988154bb3c503e6884cf6d8f5e062a16b4ff230fbda109a6127d35e3bf2b29bfd3b18ba275af773b1981d603300035e046ef023d51874aa105d136bfcc9c7323bd0513a6b2b397ffea71afb7a8d4695411d86164917099eef504f6cff3c5cefb88f23f56c4ae3e2b09a3f353fa55630f45f06c29e8912e8c3c4f493f25eda781680585580595bba43dca9cfd400d9eaf5081d2c6697da59e012dfd0b875336b88fe16609c2e9876737b9afb868ed52417ed0c6b359d582d585ff82d98edd4e63c6b65cf43d4f69eee2af4819157b8a433966953862d1ff2c6d0cba382644a1b0033ddb7be3d1fa9a204042d7b821b293bd659dca980c108ad1db740800b9bd2fc1a163f9b4066f7604f160a7910bd947cb48ce6c81e680fc6571ff0cd12a3ded9c8cd560970ca5cb480a70a8322d5072edcd257604eba8dcf55f9ec97ea2b14fdcc72fbf615131836fb14e42b8d7171d0a06d2fb3caec2e0759e86b0d8f21e312d9211ed7fe0b48669934ffb892baf1db9aa457c07820723e5446420334bf6479f2099e01ef8adf273adfdd9ed0b741931284515d69c211cc2efead8339e450b13be71b35c36c1f00c2b8ed0cfa9792e422912e14b5b1455ef6abdbbec0035480c6cb69d21321d12ee19d528dd48f43b142cf0502eae5304ce52b7fb827552db9ab885b93e83d56a33346135aef11b7e48efca7cd52e2499a7edab0bd0562862187ff4599b2446bff11c37181092fbb05d0e05220ca6bc37f529d6599e8c29acb9f25616c27df291d4fb07430188e6470df7002f73cfe5fe6907dab0b4f90bb58130fe90241c29c6063a22c9f45d032b282eb92c93736692bd5cbde2a17552e942b595b08e6ba0c91a03b9079e9117fbba8f26ce6c5d0500c69bb6e22e3562a50baece49109c2d42b6714250665afd0f0a7e951182012f21aef4b917cd434d9ca22661437608e32666497516be34652500def6c28ef8f56f2273de5416142ce9606faf7df92ab779ed6aa74cb99bb1bfe758ffd344e1d31f479807326d1a7b98f6811e275545d69198707b0fbf027dc6a5e4815d62ef191535569a452c27c4e25ecf139df949d70dd5935bddc04f33b2f0bcf5073c51fc51c15067963a20569b5659f0e7413b347d6d5ee38a92b7e6e656c199149f07ebafe5281db6b1b2ecd9e0384b6f5a8e27ecea9a0249c61b16564964054f5f9621471a98de132e102f518c1419829e2ae2c8c5fffd1270f0a0b33a383437b0034783d50bce8bd7420c059d16364eecbd55b6ac8df8a70382734d8127f4f5895cc9e508b13c000ea053ab59b87ee639745418ffc566ceebad37a17b842d24d3423ac3f086142c622eceaadc4106f8c90c5dae1f52f407fa0bf1e6bf9385cbcbf3b61006ea3b1e66b693ce704577ca9598587f41e05d36d1de424e0e51290a5f2e2f99f1960c0253a046a49b19eef249ca2dda2af1e8dd78411088eff1e9c23c31bd20abd4fc9e7eab19500827d202f76270fe9f90e95309516343e0fca48e5a12182e91c78ebf2cdd4644629afdc90bbccb77546cd765135910ba1cd8a3e3c00fa77e585865e898bfecd06c01a0a4d7be483801099c61941c4967154af5620b171b426cf229df59d2944ba50754140c3f305c16956953be376fe6e7cf31a2e9c276bb09cc24c4b86b2b26f039b0d8511853adcb7feb8502e7641a34e3242bf2c538006bb1983345ec3cacbf219ef10efc1681d52e6e1b1c60bb556b6b8a63d1d1f6869077841d1b816f3165a35833e33d39a8c6e62a2f7c482c395768fc6a0e3cbfc7a1a6d64da53adad66c8016f76eaa73df1b8ef83012ecbe75c92a8e39b48169433f951a539b28a034d5fdd00639a5e3e17ef14dafe869064d130c90c68be4d5ceddabed1bc94e97e2cdf7313f780cd6e175a9e3eba3eaed896fe464073fcf07ae7b5bd41d58c3160f66ac95a76fdaa7a8cbaebb304fe3c8f03cef927a1182ac2281c3b32378813b24bb99e42cb0774331ad78b74d46b8ce48bbf4ef8431a82d4240edfd61b910c38570ba0bfbd4a41665117e6d5f5a97908462e62d0b76160d06aa56cc6e17aaf4607ba8263648f2a0077e306c25486f5f39a75", + }, + { + "2f6210063cb3071b3d49339185c2cef8357b08ca826d8d1acd852540c16540f1c850f70404fe1f414853d3cd15a1c64a1cce149e3ca1b80926de4ae8438ad90bdad010decf2f201782f3e49794aae1b079f54eb59607bebde508a528927e346d4e444b1d736b34f65e198df2c36fa23c64f1f1fbf8b0b8ddb85d054bdb39b8297d0347f16f7be7cd9474c058e36294485386434b36fb28ee582e393367f15ce5f5a3d6641fbd31b331f10b1554a05da726a0f35c9b1b4af3498426b17582966a266cce452900f85af1046f45a4ccedca6ce02607fb70fa45f420f66aa38cd4c9f8a30e21a3067b940aebdaaeb7c77824a79e2ba20f26e70346dd6de96942b261e5c08288c7fe1cd1e9f680a0bdf8c46497f007a616eea95ccc17463559f8973eb919c68017e25100d9d1a196ca65fb615502076bf0b0c8bcc70ef22006895ebfa2243fba0791bae0625b762cc1718d1673948264454a200c58122d5e9b8b1e3eb05df8b7eeb297510e0d7dcf7f0be5f29f6756e4b177f109891e6825a9866359e35b10d20da7231bb5a0ea34abd0264b377d2fe9f420f27d3e5aa2e8e00541c46052966ef9b989ae5974e2054409507b867f647aa057f7deb19ac6929f0856005aec6e53a5f702fe6be403afed532b73d38fed73e6e551987f182a1e20801e7a6c8ccd1184cf0fefb4139fa166ca15395902ac40e7fed8661602853682a3b0ee307dffb44d0ea3012142a2880cb7c166ba6ea6a16c7e0882808db8023068f060e5ef1432fdb8331ffad6a7078d686d47d613e94291f1c4117e7c13aee4030fcaf223fcefdb300ed606b5dd931e4adbf45dc437eeb5fbff337812e15c15f026071423f6ef5305c559baa2ecd8ecc7cd498b043740ff3673774855d45d45fa64591d5b4970600ec91ab1b6f39d7dc0e709c41e49c355bd3b9d120ffb57095fb127bafa971a086135b917285794e83e9dac5ce76fb1a4aa4fb6b94a0dc3a9beea64b8817ec1e2b37af9dbd18ec30f2b6f6c12df1db6896c6c43b67a066038f0c4f17142b254f62c4dd1fedb950d07047919e397d06d033cb0bab6b61aefa6dee01720926b16beb9e8bc947dca9b8143b565da85d2dec182987838b267de9047f5b0d961c7971aaf54ae2c1e4aad61ff123c84e41a4566b2bd9e64247cf46b72a444d36bdced1a309b464ee5f4afe406eb68eb05ae51b76bf01b906c0ffbdeb440b11f1c9e3a4c3a809a1f7449047b356c663a1ab7f286a70d16141d11f2d151a4f06d422ab97cab539c1f9da09ad20c000c27b8fead5f0cc37329d466fa260aea934c154dc9c0a065df3d057a0f117a1c38321ae59226a8054f7d6b49a3753436c249838b0924f0e861f5627106dd8d3f0fa724a1cecda71d4a1267ed889b234ae4a7d5edcbc5d52cba389dc0152aff24d224c6a0f16dbd3b7f242807bf4b51a3f22690bdeb66eaa59e8766b3b265d784899d247a0ae1b58a06dd91c529e3691b09f9d9f55fc39afd4a00b0fc668880ef25a46a30861fba8cfd4b51262eba4138b41a2d13ddc71128c8c1242e49a51d6f49879fcfa7595ba4a4adcad3670b0b1b26382f03ff402bc70150f54bf513ba3e9a590e41b269e55616af297ebb3499e16cc8e46c0810330a602955553c0f93d668a1181a0bfd7021ad9a9f68ce39493b012da70a3dda149d0369f23f788616e0272efa322b6a54d804f340d32c890e2eb7b538f48f4c9293b584d22d0ae80d321607644271b81a76ac5b49d8e457069b0c3e909b8a222e3fa6016cb1e979e300804742f2005c68acb7b1849c088b3714c9c7af54e9de9390df0041c87924c8fa6b0aec6b6754171e059cba0d27f221f0b9d044a3aed8338dd8745651981e4b0329376f908b86ae9022699d495bbe3a148f7eb73d56eacb2e5e2180f63fcbfa680369f88eefa71f1210bc5b6b7b957f0a1437476a2112998033197673e470dbe7d9d476c97b95db8b5136f6cccc75d6e0ac1e4ace30e34e64fcc4d7e135b2c80e863ed701d3b28c25e982f1b5f8c895a4e6df7216c3c07abf8551a0ba0469c88aa7a08c7b5218a03b9b91f0935985373f65aa56286ad0e7ef2288a926f172b098123c136455b3a0f04590839e16bade7b6434a3cf048abe2612684c03dafd9cec39af508e63f07ea881014697bc24122058b5ef5d3fae835216d055f0cdf1dc06a12c95041d13ac9e15f235d11747f16ffce1cc3b8f508da520e395edd471f3759d8879ba9c2558b1188d822fd4739ed0546b0ce3bb9988db7c1dc8518ebbc62c4440e6e0653f917dcc13aca1864b71dbb67dbe7117474c936414e4f3cfab1f13eb05f3504484ce11977ab21ec523f97ba1b7ecb8fe384b634c30561cdb752fc67a2316bfa7e4d03f5f825d24a556a0460d8cfe0cc54a6f117ac52d553a5d1bb48031732716436675c5c3996b1939b127c6b0338bfaa29c7467cac9a127e455a715c9ce2b0c35a0d2f83a3d1273ee39399e6cc4980e610c752bd51652b96bf9cf34c7fa41fc9b13f5d55007483e4082ddac4675baa7822fd257452411b01de0e5e5da26e17539d64a89dd93c71d15a4c95b1a83039cb2d5f3f7fa04a817e48dfcbfb3de34ecb47f7592123caf27e17982fbfc8597af5b8aa6558f4e6c73db69328e47677afbe6ef8df82c3d1f0db6a108b2279f61822908d7b856432c32ac5ec0f3c53befab2a7ca356b9c2636f646b228b0a830d348be4ece2271814d477d4c73c0fb6e83a338b90ec4ef45cb25f7e3d6a014a9e8d2e8a6f55a383291a57f15667a73ea1daca31c7182523ca85a107efa2518d2f7f179ed4ba21fed479ef2be09669817133b2384bd85b155dfc1c4c9e6dd9ceecf06cc1ab8ebf7f07aeaae7441468b5471aed93f248a84f44c59be33274b11f651de010ab9f8fb24d3a99914e0147951c34280e7dd15ec196f9a4c86e55e7d373c7e31e6672d1b3ac6a45fa6c8c9088c0b8963d89f4ff1feea3e85cf9cf2f6c97128afd845bb131c6f62b3282bbba42745080fd457f1d3322058f1bd4be876bd01269546d1a853310b165926c1fd4e07054deb5d3fbe8f6007711d435994005aba95918c3df4cd390b165fcd139dd418ebbf661b6de57b655698a8a02ca8fad73e8c536c7110957c36e5494a831d536eccb97a2a9ef58fe58e2885aad170720ffcc57c7de601ea1cf723577a30aad8fd544317e33897c8b6c04e5191bec391ab990e197f10038c0726d371677e4a54c28d7ca5c6046e7cc4acde565b91f7f72af6109a0614160d3ae97e9257b8f71a4663b00c681e793cbb478306e97b0e04711eae7722b4845dadf2fff5bbe71ff24acffea2ee67df99bf62a098ddae9d4ebd3bc5dff04a2d9e3d1d83e8f493db3f63c9e24231b1dbe1147c79f21b0730c842f6983330c5c17dd34556d7e932074cfbe98f2dab5b0ebfd778a1e28fe2bac2d942f61a08b787ebfcdeb3d600bb130ca4922a4ffd38ffc4a1a1a7218451e45da4da67ad81ef898ece3d54cef877cb9d09f5dcf72eccbbc06e62f1e2b4d64059b0a807329780b155ce1614b68de04387d6108ef4dd3ab54b9da72e528d6eac3e16a360ae3421f3f23808a8b5e8ec3dbefcbca3c9f76905850033d78d9283bba9272c475b4e3b4d7643e62c2cc259ebbf168f890de88e82f8b26a7654ee31fe055e45609c70ae02b4942ee15678cd158f4c9e8d351d102ddf7a942458c6125e1457bea0d86ca38cf0c26e474b2b5cca77eb57ad0867cad7d25efc2b250e79396637ea3e948dbb855029cc9b452955bd04ad5a0d0514d4d773c0f298df7bc235a3ac64383a1fbd8a397a158e936b3ba81895a51daa89f51e4ae7a71a53794ff715a42f4fc3dcc9fd56df7bea4ab782534d3760e7b15605fc4dad16911656983c0ab77bce9445bbeb1537c55fef57a32c8f1404306a0a2ca7b73348cd99d0f9948875531cbb0ef7c036cd201614c33293d746c44140e0e8f82421c5bdf2bf428b249597df949fafdb5ccfe1618323f56a6ab9abab9a84a3beb6696ca918af244d34cc1cd95bbca4a87c860a0fa9ff6a04a905b0338a53f230bd5ee9c60e0e0332ca200c15dca0be5936b858d0a7b2e540b8958432e9767396c55d5cc35b60062580023b5cb2f9a5e9a1feba59a19f9a5a251e9d0e8500955a5df21da95213ced2260a2ed8f3d4b295c36cef750c89cf21985c302d5cc577aab7855409a912dbcf1d0a9800df4aa692a78607a40fd6d5a82305c58fcb3d2a82b27e8c5b91681aae62a2bf31ed55c494dbdc38eba30e83c6044945df76705228eede8470369f2e9941ddcb2f239fb3ff6bfcdb0efb5ec50f981adf0e8b213769ffbbea364b08cf8cd69abbfa2a6fe9865cc48558134a57bb5526b9d047e14a379d246de82d3d64f3c810ede280c768dd8bee25af287d5a8d94045ddbf5981382bc716ad9aedfcd66e0ab496172a24efe80649db8e1e83675fc8451e22c6564d8d6dfb285af7fec802b35f19dd8308c68952a11770247fcfecc4ed0e8a445c17b1573f0b4e3ed350f13269ceb572943fc435563459d5044699f1542335b03be6077af156b8c5a6a9f71078ad820cec4642427a9b187ee1b17036d5a5e6108cee8a7d444342eaec3afa64e77c71d3c2b3153d4e2dbb30df2b66b4d14cc45d3a4eda7e911d697e5763e23ee05311a20626df55549b8533c6ebe79737abf472f9cff08bec590943bdeb819d3f923f45b81f9a0cba1f3f800a261842d10cb4cbdba456c7fe5f0abb4a8b58891d97cfd6b669e2708922f1934809d51a1589e5f12e3bb82c9ac3e7e44e3f6e6cd63d428da624fd2f46eec38ff798a90d228efe50c9b67c63796347c8a2b53478f27605999a03c8e1f18b70e92419f646a7f49670aa12d324751aec17d0208fc296955b3098241189af8172d39a6819415cafb107c1842b369f174d6f37dd31cd728dfd0ab10f93609006342b6e4d6ccbfd1ed2bea2fdf5411442b04b1fe218916f159b20242f80b535b4e0a3024c6eff6a40bd0d3db24e51f5ff9c14e1b4a650ca4170ee70f0a3a5a58349a7d0b7a63af86347351696870b95231f76d8c5c6a20736907726341dcbb76672871d18c2157c094b929fd29d34f5bcaacd82706f89a60000cd341d98eb830b73a12335b69f3e0131ded3ce12c98bbd960d2d0696d40696a13ab43925374498d868cd8f070c9039ea6407fc2d92b9c39fe7c935bbcfcc5c0980952fb7dac79042951f49a1af828b138a87401c4104bc28cdf1e39dbd3fa63dd4d5f5ae9d85f032a43ad353bc5e6746e5a76326ab1f4e79103116ce70bc0b459200f32f85e461291e347dda92e421778b849e37a3ecb0b31ec6818e828dd3148dc74313aba43cc9d8b9a36a9dc4e229488060eb6c109f8ad6201958adec6d3bb3b04e5e558a272d44cb98e18f7a0ad8fa6ac3667a62f150830aa930f6166baac6b9081b44304988fbe1698a5b746255de26bb5988aca90bb6523cad68a7572f615f4aa58f932d8a749615cf0a7724e99de042268ceb31433e6df0a61547d576a6201b36b348c028ded5f7e94d1cd2eafc141088ff42cb3dafbbe4c402b93aa9d955df8d9d9fb57c75ac65c2c837acc44bbd4d4aff1888aed46c73d625ad7fff035e8ca0fe411c73ed8135b6b8e17a039ec74e9de0d64cb442bf8a676c0a666f68f21066332cd921ae0ed766f0516a8e19b82cf98e78add0373737a3419e13aa902310c44feae5fdf8bc64e80dce772686a31f141bcce452041bf545b908ef4a2b000e7beaf378e2afdccbbcaa42e330e5024400cf2852d3444718", + "fd5008477b0855f6f2486fd4f74b9fb4f6e19726c6996bc66893183bd76054d5b05c1c2b64722256ba912ab2dcca66d2abfdf972966438fff7513acfb18ea461eac08c4e32aea4ed3fcf9f1c9905ee4402e7b6984bef974340d212f160b6524b76de99a98d3e96cc0d35e8a63ad7ea3cbea1d40a906c4dd03e5fc19e1513e9", + "390a5e75c9ff4ad38fb6205ff47f209294337c1f25ff54a3c01eee8e1e220257", + "8bf183347ec1ca4bceff3374", + "19fa2641519e21293094e9d767ee1237f9e0715dc57172794867c3bbe2cb647f9b28a8d3f85c0ff557b91bad66f5ea16e0107757b0277fdd3ca05bf47c19bcb92a958a57e8c142a51af29bddb20af84377b6db65f77494e0dc4d2634a776b3a5d777319873bc0dacbbd4b9ebccfae849fa7e9769cdf54660ecca0d5cf4fa5190713726d54d02b3a3f21857125b8a808c0ca2f99d11dc430ed5113ee49ff8f00bcc08f0370dd510e8100e1285659a7b2c7457a6049f2af7786c4db1471ce5bd164e11c7a2165e83e03a135ae2b3429f82f677de044a067e99e0bda2d65a7270d629c00e1d528212d3aeb2896e58ee5145a93ed06a9c00705ad5c5988d3a192304c1d17661d45257c5d16799ef70771964435b12e3b2ee9d5b467c3b1992f45b7a59871b40d8daa1c280747ecb3d170257b91df1f549ce6d66455b5b6f60b7c6e95c92a67e20cffe8599ceb183de53f1dedfe19bae836447af8e053ba419660e0912cad064d6125b9e978e8d0d5f28f8a4e43ca3cdf2d4c0e9a11221d8184e9eb6c90761b0beac82d0d22793279aedb1c7db3632adbee323bc3bbde4801152694831abf5676979af26af7dcbadfba1cad1306b635840cbca76c558b37db0803b4c12befa27d16f21506b07ade4a838d6beba1816eb29ed5e3c4f132a752fc747bd9ba879156e87e6c1584e911da9f796e1fa4a055e427272559e4bd6d0f54b8257100f8a55d84c27b702bb1fe2f995425c85fd48b0a0610db5b39f7a5031407a12dae9f508b21b1378f14952d1beb2dea81d016b2d9b7f1a67b814569b69c0e619adea02a8683242d63a11d3317d060e5b4d85df5ad73127541ba5314715d187990735aa81f438f8b94070ec506ba536274d98b766c1694e54367891a602b99e370425b47a70b819277a249fa429c5bbd0530267f987e6022f25030c30f3baeedc0d13c95f3d5e4b2b87465d179a3a23b9f9e76a42ceea55226ce072f9488392f40621289124d786109d2498e74fb37e2ef466fe8bf3016d96e34204c32978775765aa80461cac48518157f86d59f6187bad4ee62fba1ddbe166b29452f4a59af1e057300c353440644a8e40ae8171ea028be2fa315804abf518847c7945e8228b7766cfdb08d3a3116b59aab8e94b6d8c8c9ef442c2dc7f923bc2cd3e5c663baca7dded976bf191fe36da16948c89c385fe71434f4aa5dd15fe0e925d2459e3b068b9d82a9cc8b8f9786bd9f5fef9baaaf2d67027d9bfd58bb2c58ec7c746b747ab62f9242e4b53ed14d6fc75f5280eca0de23717c97a2293826e19cc8eb47f946421516c349dc4ba49225b91e4e868874bdebd373700df1f3792aaa140597e58b88f90e163397dbad3941705b53d754e3e0c9003df836a7fb8d23f40362fcb5f3947a4281b24240be4ee89aa8e917b194f94345eeca224df0adc15f22a617b6427f29410bc48ea3f92216163785723efc36301d23ed52780c6fd7924bcfaa03269b13582b7c7ea9c0e4a451f38a469fbdb585dcb7c81452da77945ebe27eb26ff6e8c7b2decea289aac5af74746dc257c9bea44a0847f02c4f586e1d76f39d5bf952355a0875f177a666d1d354ad86ce5ec0aba2c2b20cab050eaffd31095395132f5af80a2d2d53b77bda49f948bbb37bdf31c8a690476488e14e542ff6841e7fbfc2eb84795696562d079dc1612274b6dff362567084f793f0bc2dd8de23392d05aeeeeac6991c9f74387153a4b7da94790375e336a00c8293bad0fcef2dd1880e7094e2e53f738247c860780ebe308410ca02ae409ae720e841f48c9677acc6e7d4ccd18c219c400f8b7e1257f692e09eaef96802b17a1cb7d93eb81d3bfcbc7af4cdf05b98e22556b3d1a8b56d6d83bb5f5724696f8f329839dbe477483ec3c09fa2e0628faeba1bf285c224bea3f6cdc7bbd768133c6ef1da14f248cc3b819b196588811b073a7291817bd1e89c65760435d8d17cbf9423744a92143e0f956e2977b39c54fdead5a57f3a04a0facca01bbf44d3b1fb9c4fa83ae1046985e3f26aa0a437999004dd8adc04c5111759849f919b93558dbc559173a23b069b59f800096d9fcf077c7640f59170bb9a6fffe64778bac272365d27ea62aa956559e90edd3f6393cc8775597bcf7d91990ab9511973d948324a27261059e93f4b5dd2f70caf12e1a08e0493cb05588618764391f355379578cf94dd33e616136eea997ec11c0d4ff064ff51a767e5558433a2e3a9a74c232d8e187f47b8cca010709eb9fea0dac8f1ea53bf18822e154ecd929c83b0eac366e30fffbd5ba6a46d734f58d26e7f5df538e18b3d827884aa857a680823131bcf30a76f1a555bcabb17b02b53aefad96fe76f7312da69719434c580d3ff1bcdcd594e6375935003d5d732cc577e11ea2abb1d04259f50aed4c3af9866e8c4a52a09809046ee330f05c4403acbc297a9416c5208fadb31ed4eb7a3b01b87bf08c75cf44c2b0df84df30872d021d6567ea649859268e5e1b5b6405e1b41e350a32c1af13722959c17c01b52c42241313b26b25995a1c89a53e248488724d280647226195746901929501df36d1e94815d7fe6c4ca2731f3181293217f71b9d7f59c2474856972013924ae4796db4cbd22d8905a6043c959941ca6b556c53d1688c439036c715d33a47a7dfc2fe40e53424c5093020d2e85e4b04aa4c704ea5bfe5a2384878da38319c59d41d66b6add2a443d9ea11edd8d18fa41004251653857733b388b453943eb33df93dcd5d549757fa2967ef0f9a5105836c48826c47fcccb2d9bc349032b286962136b848632bdcf186a08cbeaa52d195efcfc3a440bac154971d11ff4994f293b14fb8c3214ebe7ab8b3d0f2fe0b03ed7b145fafd7730a173e3cc1847f0cdf2cf629f5ea81a07bef716b1a67dd9e3b7a52fea1aaa7a393f53b5bdb5988df78a57a9dad19a8253316835acab8a6b9a9fb42d97bf29b2443322f46de386fd82bd3453ed68e2370c6eac4497b1bde7b42d569c452f377bd38bd50fa5a6792ef5c9ec6c647001149b86fedb3e2f18d4271e9cc4801aa16ecddb31b6a795fecabc613bfbc8e4f5636d71e74595c841fd11b6a6bc7f169317c1added56b82a71fc36d774bb4d661685363e9da5fd2e1f357006dc5b5bbf8b42ee3f869e75a541586fba558a8f490d641b78c27368b9b4c2db046354e9358ae9140e91cd95ebeffc6c0d2676a3ff4ab10d463bf32bed97023a80a79df191ab9858c43537a03072a17c30b1bd99efbd361590ed6b7d5b0ec4e2326fa35904ab9a48596f44491cbbc0112890f9386ed04dec30126be359a05e99b2b77fa2c8f6b7460a6cd590d71c73b2a1b23312ff89306b6e41c76ddc0a099bfa79498e36ae5cf0c560b8854dff32d2b690ce0ac4aabfa723ac6f2e97ad1083235196b464ad67fdd649aec01695d55c8b4bb198f30630ca635aa5a1915f3718341bcfd8b522f764015fa5479004d28eceea7fe67df7ee24a97a9708d528b89589f1899f13242a0d00f7464c3cdfce213699340e754533b934f4a8410224e111f31cf8e54d7b5e90cd8c68bf96edbc8d183894deefdf4fcc1a83162a3f6341dcd9a9aecf171c0df28257a68b1af1b67c54c43c3cff27fed89cc64bc46e23a49ec74a9efbab7981d9f0a018247441e4f0f5b5f68ba9325582f92de4cca4a5f878a0c5c387581e64324e3246d8f3205c838a29f1abeea24446e496421f0e742d411adb55f70272ae4a992e825a3d327e44b8b3762b25aa451d07eb4eac0322b431fa676462632daba2aba7bdeee1b438f051d21d4b1897e2ac2f95ee7c23f9996a805de8fffb3b30b855cd6c5b84c011accf4bf94d304d944079f04b5cadf8fcd6751c22a0f9165ab98998b2d89e6514641f1f3b91b8c0bf057d69c3d893fc4e041e06a2229e2ee58082ffb58cb920972ede58483287d0ace94c1becef26a410b93e4ff402e61dcc574b790d49679f18f4e2004f8b7cc357faba34a80e56821bb5b883d1a8b49c6605002152f270bbc36bc79095644e29ab08cc988deda765d67e4fff12b726d5de135ff9d0cbd9d5f9d440e548836633b93a38330d638468b59a32642da3375cdf70b062d14b46a78569c24a706e179baa2058dcae5c61fb6cadd9e015b017f26e9dbe3e6366cf5f1ec839aa3bbb21dd6c9b8e910245fa95b09b7d6cbf08a4c6c84bef257a70389be962dad14d97a893c128b73bf6580689e540d004f21edf8403f36b1ad7c9a2e83ffceb141af59700c316c8c1e3347187f24819c2ff0c9f9a2360dce354f3374374eab1643d2d8831310a8e3ca6768200ea7759822b82f7027cd450479fcc7f6d04802b15735a137ad489f1e1ee78434a253a9dd16684ad58fc91960cde6754f82e8b38edd5e798fdbbbf8fc2e2380a4e21dd94f8c1c063b18f29d8cd8d89f65deac5640799d4ca2caa29c1e72ad8bc417490d11e4051d94956fbc74289857e5f8e9e87b9a2d83074a994de0b10bc7782f6650cfbdb8c835c81cd88bdce5f04ca939b3c5cd010d4dc5d51224fcacbca9851694b8bf55b22dead859d023eee5a7ad3436a912c3fc0284456d5d72ea5f1afa8545c856676ac2dd9a057028bd3ca0f50e7070fa74152f13997c95c1834c3e67504f1a4165d2b49a96919b88f72caed60f56ca7ab5a3204fb12ad3592c725fdebb048732fc189c7dfed185c6c184a626e07d7356860d00389862d5b9701eaa4e5f7889e6db0f54633369b8d26805c08471de8fc3f8fa1fb0b0711d9e015add5373f7f8b64abaddbac3399c756244b1b07c579d33e4967e5e0cf16de29cb8a7efad07ff9039ca305772a6e45c76bd9b77e24949556766a8b8425c5e595efb431bde4ee222f9eb3fc2d002a1e2d14db2b23135266c942eea33bffd30eb0218405373240e0cd3040436ca895093bf056fd001c00ba59d90502042e6e6c0167105051628895c8164c9ab959400898309cabafdef12be53604fa57df44e0a90a81bd63c331291a93bffefe809e80db0679568f6e94e0d8e2edec0087c35bcb3c4f4725e6013bcf197156cd9d90612423348123383e45c14d27d8833f56ddb04083c069fd6e282fe69c940840f5f747dfb72ad72fd8cf9f3ded15c9e2f4727fd60b4f40e95dbe77a89b47dde7d5326942600554905d9dade9d145ab6da802643f2081678392609c2fdd1b79dd8caec137cbed315374c6f05c0758070f3bb17e23d81ccc39c6aa89913897e487fde889c5aacd422278f8571641cc4f0a93d9768aef9e45d6bd187d1ba637ce0fbd3c573d6778cf7bf5188c00dcdf13be3fd599143952b376220283e34e014e83b214bd5f64eb0ecb098ae8bef883949907cc36e22ece60b893b963cfa73d120513e285aaf70ce5add34edbdac60b3aa7b385b90e339058fb9b3cf984b06f79788016035c5ce490f2de7995b98a8c1c9c80f29603ae2b7fc41886663163e604275cb085f8453b27f4d795b9bad19ade2f98a1c99b43a7581bd991e5d0e5e1a6e713acc522ba9fe8302658a9782558e35436e714ac6bc85ad1d3cd008f24106901fa954f5fefb61210d6f8dc9ff35c480f1d14e59c0e501917a31ee9d00c6bdb06a00af5a8b08c3928cc5f37476248223627cb77eaf0e96213cb0a13e97d3fe9b9814d462690e8d68d02655a32fc271ee73db4f88a33386ea88a5857e15a28d9b3e3a96f00c7cd85aa53f9282ab8c8ca6d6a8afed43aa87fe7fc1ad59b0f0db2dd25c20af96e8c282c19fc883ef01a4060398926a1c82f07bcd3bc314580d7636b623b7bad8ddba05850291a6344df0f346fa4a321a85ee3e9c", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b", + "0942e506c433afcda3847f2dad", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff4b4086fbbd1b6cec23e45481eac5a25d", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", + "d3d934f75ea0f210a8f6059401", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f685eb7731024bbf6794c3f4c7c5a1cf925", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", + "d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc07cbb", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68a12d0f1cc99e132db9014100d9668c91", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9b", + "bc", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32d4d00a24b826b6efb16013ef54cbe170", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc0", + "7cbb22fce466da610b63af62bc83b4692f3affaf271693ac071fb86d11342d", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb37d04f8272e741da2802c54a9d9aaf8ecf38b36fc9ad0079523f6a4abd5281a22697a3180bc02662a7c13ee23599d18e5c48300dbb831509df4c172f53e524b3c15124a87ac73e5028cde6c94d8d", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525", + "", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb370a9bbc3187cc260ddac991f94ce4f0d5", + }, + { + "0fb826ddb2eb5e708de203d0438be12cf708d635ebdbae56278be09077009586b9bc646ba7c2db35a5de05e86ae71461efea96dac64430edcf117d461113cccacf303576f310ab98efb180599894ba877e50614494923163a3afa9b4c2757f91a6b40799c5b331b464b10dfc45c783c317e408ab76390e19e8b7ceaa2c4d3bd201436bc6f69c7a5a4d8756924ed95665bd5e1034971e4d80d51b2a", + "026866d46aa940309fdcabf92a324fbc", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "30f05cf8189bb7b8b4f560e746e228c4cc7e86e8f2fa66e1afe212d1855db51070acd5eb34ce80b2e223957df50fde4c2531d97fc9e573725e7a5e47f0dfc4da1942620320bb2deaf8b17937bae4218d04db8e76f6efe84a117292159507c9f8a09fb2c17921d7762510dbf1dac7b62b1bd7572e3e2cf008d01c445c7fa78833235034281ae180e051451c6a64f22ca9708634bd0d604e4cfcd971b13742efa5b6363e662a875daccb2b00", + }, + { + "c7d4f8790e4c47d4daecbddf5939973521ddbf3b832e564afc66f03b5583c41c58bd956609dc3ae3c8f7c2213059575236168dba44e3044049f47c9e7840bbd0fd5036062d70e9f567ac1797056ee93c8476f6c959fa09a3ee854166c6fc36c34d6cca7adcb36f435f86db65f4c4a1793b974294914b377fd179e697751c5ac289243c65d8aca93732849c27483da083d4e218652d4fe5fec8cb953ee7f00070143dd6ece97f241b03c0424bfee2cfd2c4e738f2361df0ffe8863dcf763d408a7a167763959b7f985bc1e359a4b22c6899645ad0814bcf69d10c38474978d1c48e482723e3a6bb3f689f980c51c474eb28cfbba91a8a12eb964b32dfc303a3524ccb752f71316ed9d007e521cb5a0cf429c79d4351b02ee7fb60c7be636a10af3586dfa7b74d80875466a820c0b514e97cb12cce615ab55cba7c1b1de72bcd1cb1acc368f944ef4eaa986e6a4d8253c9337f9795d94df193c90cb0b0387dcde929905223d441717ed9dfe826613bf094ba872993d41b269e27d74e5f541b497eac9ba180dc12ffb6f1e7dc5223cce6dd541071282b97c6526e15b2c330fb41dc96e25d72f45c28e543053766d11d44252db54e584c14abbb295d7e5a58bf36eea1936095ef897a338eb1995fcedd85fc92d354dfe7ff9a115c186bb4d7a1a27835030d248c87571a38f17906cefe0261d15740b9", + "56", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "f89c825ca43cae1ce3fbdee85c505edd1aabefe69a0f9efd740f027aa7dee48a91ad24e69ad061648f0a52b4afb19d7ffccdc21f4b4247dfd89f5f9f998cb3c02b226173fedb6f8770aceef9271e7236fefd19fb3b87d08a5c587ac7918e80aa4b477f22602189811e270d686bc4949137a41d11d95ec96ee9d26c6126f6e923ab37638b34d1538d2e46d6df6216da4f193a3cecb731e632e109ced643056a1673059355d2d1314df35ded8364efed7de490201090a6f2d1751748585f64d26041637ba3723cbc4b60e226f10a19699d223075bc1f27d82e7f560c0db630ea670b3f8a70a8950894af4d1c7b3f674a3fa00d19ee4cc2b6174c1d259a297424bf2c3943a29a16a9830ce11abaa79cd2eb77b53a02b365b1838e7bfd5ae1bd044ffc885c61c6b2186a357e8b8f732b7ab96517969aeb70c7b493bbaca9462a61815a3c6135c748bf9c8487ac0631807aa69243fa09cd3b8efb63f8d4e090ad30b6c2f08bf4e82f191cedfa5cbe2b42268d67ecd105918181e44fc9879efd642d20be84e6f74717e03fb94fcbaa6ed3b307431d2a9384b8a2b3e5825ffce8d99af48f177e43bb4272226d8a5edd37d53807f768feb9e0733b437a1d0f84779ab68a1804e92a5eecca56364f0fa6dca152203b249fdc8fbd950fdc37c1887596308a90ba3a5751c7096bfbd1cb177bb17847b33c4379b43938a67674459cd9a06e3017ccac5b", + }, + { + "135a28170fe89066da7bcff3a9ccc1b27dfe942a6f47b23835ef746aaea63dc10066d90f4e697528e5451b8e11dd408fdbd4b94a1c6c82515bf7bc099df9cb9d5fa4acad0d22d5f267f18078cec107a995c1f3b12d7603886dbf910ab85ca7180053c50e759b00dc8c81555a425c03d71df6894a6c8cd2d94b64e303c08a1bc1dee1cf537ccf300850856292e1656aff5bf349c87f1ca1ca8085cd400fe901edcad04146a0714ef0f6b083d715edd670e020385f3cda29bc5ff6fc6edffe5ca9ce9def6e0e3d5f04ede2db02cfb2", + "73afd2ab0e0e8537cae42dc6530dc4afb6934ca6", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "2c125232a59879aee36cacc4aca5085a4688c4f776667a8fbd86862b5cfb1d57c976688fdd652eafa2b88b1b8e358aa2110ff6ef13cdc1ceca9c9f087c35c38d89d6fbd8de89538070f17916ecb19ca3ef4a1c834f0bdaa1df62aaabef2e117106787056c909e61ecd208357dd5c363f11c5d6cf24992cc873cf69f59360a820fcf290bd90b2cab24c47286acb4e1033962b6d41e562a206a94796a8ab1c6b8bade804ff9bdf5ba6062d2c1f8fe0f4dfc05720bd9a612b92c26789f9f6a7ce43f5e8e3aee99a9cd7d6c11eaa611983c36935b0dda57d898a60a0ab7c4b54", + }, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go new file mode 100644 index 00000000..b017a731 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go @@ -0,0 +1,199 @@ +// Copyright 2016 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 chacha20 implements the core ChaCha20 function as specified in https://tools.ietf.org/html/rfc7539#section-2.3. +package chacha20 + +import "encoding/binary" + +const rounds = 20 + +// core applies the ChaCha20 core function to 16-byte input in, 32-byte key k, +// and 16-byte constant c, and puts the result into 64-byte array out. +func core(out *[64]byte, in *[16]byte, k *[32]byte) { + j0 := uint32(0x61707865) + j1 := uint32(0x3320646e) + j2 := uint32(0x79622d32) + j3 := uint32(0x6b206574) + j4 := binary.LittleEndian.Uint32(k[0:4]) + j5 := binary.LittleEndian.Uint32(k[4:8]) + j6 := binary.LittleEndian.Uint32(k[8:12]) + j7 := binary.LittleEndian.Uint32(k[12:16]) + j8 := binary.LittleEndian.Uint32(k[16:20]) + j9 := binary.LittleEndian.Uint32(k[20:24]) + j10 := binary.LittleEndian.Uint32(k[24:28]) + j11 := binary.LittleEndian.Uint32(k[28:32]) + j12 := binary.LittleEndian.Uint32(in[0:4]) + j13 := binary.LittleEndian.Uint32(in[4:8]) + j14 := binary.LittleEndian.Uint32(in[8:12]) + j15 := binary.LittleEndian.Uint32(in[12:16]) + + x0, x1, x2, x3, x4, x5, x6, x7 := j0, j1, j2, j3, j4, j5, j6, j7 + x8, x9, x10, x11, x12, x13, x14, x15 := j8, j9, j10, j11, j12, j13, j14, j15 + + for i := 0; i < rounds; i += 2 { + x0 += x4 + x12 ^= x0 + x12 = (x12 << 16) | (x12 >> (16)) + x8 += x12 + x4 ^= x8 + x4 = (x4 << 12) | (x4 >> (20)) + x0 += x4 + x12 ^= x0 + x12 = (x12 << 8) | (x12 >> (24)) + x8 += x12 + x4 ^= x8 + x4 = (x4 << 7) | (x4 >> (25)) + x1 += x5 + x13 ^= x1 + x13 = (x13 << 16) | (x13 >> 16) + x9 += x13 + x5 ^= x9 + x5 = (x5 << 12) | (x5 >> 20) + x1 += x5 + x13 ^= x1 + x13 = (x13 << 8) | (x13 >> 24) + x9 += x13 + x5 ^= x9 + x5 = (x5 << 7) | (x5 >> 25) + x2 += x6 + x14 ^= x2 + x14 = (x14 << 16) | (x14 >> 16) + x10 += x14 + x6 ^= x10 + x6 = (x6 << 12) | (x6 >> 20) + x2 += x6 + x14 ^= x2 + x14 = (x14 << 8) | (x14 >> 24) + x10 += x14 + x6 ^= x10 + x6 = (x6 << 7) | (x6 >> 25) + x3 += x7 + x15 ^= x3 + x15 = (x15 << 16) | (x15 >> 16) + x11 += x15 + x7 ^= x11 + x7 = (x7 << 12) | (x7 >> 20) + x3 += x7 + x15 ^= x3 + x15 = (x15 << 8) | (x15 >> 24) + x11 += x15 + x7 ^= x11 + x7 = (x7 << 7) | (x7 >> 25) + x0 += x5 + x15 ^= x0 + x15 = (x15 << 16) | (x15 >> 16) + x10 += x15 + x5 ^= x10 + x5 = (x5 << 12) | (x5 >> 20) + x0 += x5 + x15 ^= x0 + x15 = (x15 << 8) | (x15 >> 24) + x10 += x15 + x5 ^= x10 + x5 = (x5 << 7) | (x5 >> 25) + x1 += x6 + x12 ^= x1 + x12 = (x12 << 16) | (x12 >> 16) + x11 += x12 + x6 ^= x11 + x6 = (x6 << 12) | (x6 >> 20) + x1 += x6 + x12 ^= x1 + x12 = (x12 << 8) | (x12 >> 24) + x11 += x12 + x6 ^= x11 + x6 = (x6 << 7) | (x6 >> 25) + x2 += x7 + x13 ^= x2 + x13 = (x13 << 16) | (x13 >> 16) + x8 += x13 + x7 ^= x8 + x7 = (x7 << 12) | (x7 >> 20) + x2 += x7 + x13 ^= x2 + x13 = (x13 << 8) | (x13 >> 24) + x8 += x13 + x7 ^= x8 + x7 = (x7 << 7) | (x7 >> 25) + x3 += x4 + x14 ^= x3 + x14 = (x14 << 16) | (x14 >> 16) + x9 += x14 + x4 ^= x9 + x4 = (x4 << 12) | (x4 >> 20) + x3 += x4 + x14 ^= x3 + x14 = (x14 << 8) | (x14 >> 24) + x9 += x14 + x4 ^= x9 + x4 = (x4 << 7) | (x4 >> 25) + } + + x0 += j0 + x1 += j1 + x2 += j2 + x3 += j3 + x4 += j4 + x5 += j5 + x6 += j6 + x7 += j7 + x8 += j8 + x9 += j9 + x10 += j10 + x11 += j11 + x12 += j12 + x13 += j13 + x14 += j14 + x15 += j15 + + binary.LittleEndian.PutUint32(out[0:4], x0) + binary.LittleEndian.PutUint32(out[4:8], x1) + binary.LittleEndian.PutUint32(out[8:12], x2) + binary.LittleEndian.PutUint32(out[12:16], x3) + binary.LittleEndian.PutUint32(out[16:20], x4) + binary.LittleEndian.PutUint32(out[20:24], x5) + binary.LittleEndian.PutUint32(out[24:28], x6) + binary.LittleEndian.PutUint32(out[28:32], x7) + binary.LittleEndian.PutUint32(out[32:36], x8) + binary.LittleEndian.PutUint32(out[36:40], x9) + binary.LittleEndian.PutUint32(out[40:44], x10) + binary.LittleEndian.PutUint32(out[44:48], x11) + binary.LittleEndian.PutUint32(out[48:52], x12) + binary.LittleEndian.PutUint32(out[52:56], x13) + binary.LittleEndian.PutUint32(out[56:60], x14) + binary.LittleEndian.PutUint32(out[60:64], x15) +} + +// XORKeyStream crypts bytes from in to out using the given key and counters. +// In and out may be the same slice but otherwise should not overlap. Counter +// contains the raw ChaCha20 counter bytes (i.e. block counter followed by +// nonce). +func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { + var block [64]byte + var counterCopy [16]byte + copy(counterCopy[:], counter[:]) + + for len(in) >= 64 { + core(&block, &counterCopy, key) + for i, x := range block { + out[i] = in[i] ^ x + } + u := uint32(1) + for i := 0; i < 4; i++ { + u += uint32(counterCopy[i]) + counterCopy[i] = byte(u) + u >>= 8 + } + in = in[64:] + out = out[64:] + } + + if len(in) > 0 { + core(&block, &counterCopy, key) + for i, v := range in { + out[i] = v ^ block[i] + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_test.go new file mode 100644 index 00000000..b80d34cd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_test.go @@ -0,0 +1,33 @@ +// Copyright 2016 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 chacha20 + +import ( + "encoding/hex" + "testing" +) + +func TestCore(t *testing.T) { + // This is just a smoke test that checks the example from + // https://tools.ietf.org/html/rfc7539#section-2.3.2. The + // chacha20poly1305 package contains much more extensive tests of this + // code. + var key [32]byte + for i := range key { + key[i] = byte(i) + } + + var input [16]byte + input[0] = 1 + input[7] = 9 + input[11] = 0x4a + + var out [64]byte + XORKeyStream(out[:], out[:], &input, &key) + const expected = "10f1e7e4d13b5915500fdd1fa32071c4c7d1f4c733c068030422aa9ac3d46c4ed2826446079faa0914c2d705d98b02a2b5129cd1de164eb9cbd083e8a2503c4e" + if result := hex.EncodeToString(out[:]); result != expected { + t.Errorf("wanted %x but got %x", expected, result) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto.go new file mode 100644 index 00000000..f1f51902 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto.go @@ -0,0 +1,713 @@ +/* +Package cipher implements cryptographic methods. + +These methods include: + +* Public and private key generation +* Address generation +* Signing + +Private keys are secp256k1 keys. Addresses are base58 encoded. + +All dependencies are either from the go stdlib, or are manually vendored +below this package. This manual vendoring ensures that the exact same dependencies +are used by any user of this package, regardless of their gopath. +*/ +package cipher + +import ( + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "hash" + "log" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher/ripemd160" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" +) + +var ( + // DebugLevel1 debug level one + DebugLevel1 = true //checks for extremely unlikely conditions (10e-40) + // DebugLevel2 debug level two + DebugLevel2 = true //enable checks for impossible conditions + + // ErrInvalidLengthPubKey Invalid public key length + ErrInvalidLengthPubKey = errors.New("Invalid public key length") + // ErrPubKeyFromNullSecKey Attempt to load null seckey, unsafe + ErrPubKeyFromNullSecKey = errors.New("Attempt to load null seckey, unsafe") + // ErrPubKeyFromBadSecKey PubKeyFromSecKey, pubkey recovery failed. Function + ErrPubKeyFromBadSecKey = errors.New("PubKeyFromSecKey, pubkey recovery failed. Function assumes seckey is valid. Check seckey") + // ErrInvalidLengthSecKey Invalid secret key length + ErrInvalidLengthSecKey = errors.New("Invalid secret key length") + // ErrECHDInvalidPubKey ECDH invalid pubkey input + ErrECHDInvalidPubKey = errors.New("ECDH invalid pubkey input") + // ErrECHDInvalidSecKey ECDH invalid seckey input + ErrECHDInvalidSecKey = errors.New("ECDH invalid seckey input") + // ErrInvalidLengthSig Invalid signature length + ErrInvalidLengthSig = errors.New("Invalid signature length") + // ErrInvalidPubKey Invalid public key + ErrInvalidPubKey = errors.New("Invalid public key") + // ErrInvalidSecKey Invalid secret key + ErrInvalidSecKey = errors.New("Invalid secret key") + // ErrNullSignHash Attempted to sign null hash digest + ErrNullSignHash = errors.New("Cannot sign null hash digest") + // ErrInvalidSig Invalid signature + ErrInvalidSig = errors.New("Invalid signature") + // ErrInvalidSigPubKeyRecovery could not recover pubkey from sig + ErrInvalidSigPubKeyRecovery = errors.New("Failed to recover pubkey from signature") + // ErrInvalidAddressForSig the address derived from the pubkey recovered from the signature does not match a provided address + ErrInvalidAddressForSig = errors.New("Address does not match recovered signing address") + // ErrInvalidHashForSig Signature invalid for hash + ErrInvalidHashForSig = errors.New("Signature not valid for hash") + // ErrPubKeyRecoverMismatch Recovered pubkey does not match pubkey + ErrPubKeyRecoverMismatch = errors.New("Recovered pubkey does not match pubkey") + // ErrInvalidSigInvalidPubKey VerifySignatureRecoverPubKey, secp256k1.VerifyPubkey failed + ErrInvalidSigInvalidPubKey = errors.New("VerifySignatureRecoverPubKey, secp256k1.VerifyPubkey failed") + // ErrInvalidSigValidity VerifySignatureRecoverPubKey, VerifySignatureValidity failed + ErrInvalidSigValidity = errors.New("VerifySignatureRecoverPubKey, VerifySignatureValidity failed") + // ErrInvalidSigForMessage Invalid signature for this message + ErrInvalidSigForMessage = errors.New("Invalid signature for this message") + // ErrInvalidSecKyVerification Seckey secp256k1 verification failed + ErrInvalidSecKyVerification = errors.New("Seckey verification failed") + // ErrNullPubKeyFromSecKey Impossible error, TestSecKey, nil pubkey recovered + ErrNullPubKeyFromSecKey = errors.New("impossible error, TestSecKey, nil pubkey recovered") + // ErrInvalidDerivedPubKeyFromSecKey impossible error, TestSecKey, Derived Pubkey verification failed + ErrInvalidDerivedPubKeyFromSecKey = errors.New("impossible error, TestSecKey, Derived Pubkey verification failed") + // ErrInvalidPubKeyFromHash Recovered pubkey does not match signed hash + ErrInvalidPubKeyFromHash = errors.New("Recovered pubkey does not match signed hash") + // ErrPubKeyFromSecKeyMismatch impossible error TestSecKey, pubkey does not match recovered pubkey + ErrPubKeyFromSecKeyMismatch = errors.New("impossible error TestSecKey, pubkey does not match recovered pubkey") + // ErrEmptySeed Seed input is empty + ErrEmptySeed = errors.New("Seed input is empty") +) + +// PubKey public key +type PubKey [33]byte + +// RandByte returns rand N bytes +func RandByte(n int) []byte { + return secp256k1.RandByte(n) +} + +// NewPubKey converts []byte to a PubKey +func NewPubKey(b []byte) (PubKey, error) { + p := PubKey{} + if len(b) != len(p) { + return PubKey{}, ErrInvalidLengthPubKey + } + copy(p[:], b[:]) + + if err := p.Verify(); err != nil { + return PubKey{}, err + } + + return p, nil +} + +// MustNewPubKey converts []byte to a PubKey, panics on error +func MustNewPubKey(b []byte) PubKey { + p, err := NewPubKey(b) + if err != nil { + log.Panic(err) + } + return p +} + +// PubKeyFromHex generates PubKey from hex string +func PubKeyFromHex(s string) (PubKey, error) { + b, err := hex.DecodeString(s) + if err != nil { + return PubKey{}, ErrInvalidPubKey + } + return NewPubKey(b) +} + +// MustPubKeyFromHex decodes a hex encoded PubKey, panics on error +func MustPubKeyFromHex(s string) PubKey { + b, err := hex.DecodeString(s) + if err != nil { + log.Panic(err) + } + return MustNewPubKey(b) +} + +// PubKeyFromSecKey recovers the public key for a secret key +func PubKeyFromSecKey(seckey SecKey) (PubKey, error) { + if seckey.Null() { + return PubKey{}, ErrPubKeyFromNullSecKey + } + + b := secp256k1.PubkeyFromSeckey(seckey[:]) + if b == nil { + return PubKey{}, ErrPubKeyFromBadSecKey + } + + return NewPubKey(b) +} + +// MustPubKeyFromSecKey recovers the public key for a secret key. Panics on error. +func MustPubKeyFromSecKey(seckey SecKey) PubKey { + pk, err := PubKeyFromSecKey(seckey) + if err != nil { + log.Panic(err) + } + return pk +} + +// PubKeyFromSig recovers the public key from a signed hash +func PubKeyFromSig(sig Sig, hash SHA256) (PubKey, error) { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return PubKey{}, ErrInvalidSigPubKeyRecovery + } + return NewPubKey(rawPubKey) +} + +// MustPubKeyFromSig recovers the public key from a signed hash, panics on error +func MustPubKeyFromSig(sig Sig, hash SHA256) PubKey { + pk, err := PubKeyFromSig(sig, hash) + if err != nil { + log.Panic(err) + } + return pk +} + +// Verify attempts to determine if pubkey is valid. Returns nil on success +func (pk PubKey) Verify() error { + if secp256k1.VerifyPubkey(pk[:]) != 1 { + return ErrInvalidPubKey + } + return nil +} + +// Hex returns a hex encoded PubKey string +func (pk PubKey) Hex() string { + return hex.EncodeToString(pk[:]) +} + +// Null returns true if PubKey is the null PubKey +func (pk PubKey) Null() bool { + return pk == PubKey{} +} + +// SecKey secret key +type SecKey [32]byte + +// NewSecKey converts []byte to a SecKey +func NewSecKey(b []byte) (SecKey, error) { + p := SecKey{} + if len(b) != len(p) { + return SecKey{}, ErrInvalidLengthSecKey + } + copy(p[:], b[:]) + + // Disable the DebugLevel2 check here because it is too slow. + // If desired, perform the full Verify() check after using this method + if err := p.verify(false); err != nil { + return SecKey{}, err + } + + return p, nil +} + +// MustNewSecKey converts []byte to a SecKey. Panics is []byte is not the exact size +func MustNewSecKey(b []byte) SecKey { + p, err := NewSecKey(b) + if err != nil { + log.Panic(err) + } + return p +} + +// MustSecKeyFromHex decodes a hex encoded SecKey, or panics +func MustSecKeyFromHex(s string) SecKey { + b, err := hex.DecodeString(s) + if err != nil { + log.Panic(err) + } + return MustNewSecKey(b) +} + +// SecKeyFromHex decodes a hex encoded SecKey, or panics +func SecKeyFromHex(s string) (SecKey, error) { + b, err := hex.DecodeString(s) + if err != nil { + return SecKey{}, ErrInvalidSecKey + } + return NewSecKey(b) +} + +// Verify attempts to determine if SecKey is valid. Returns nil on success. +// If DebugLevel2, will do additional sanity checking +func (sk SecKey) Verify() error { + return sk.verify(DebugLevel2) +} + +func (sk SecKey) verify(debugLevel2Check bool) error { + if secp256k1.VerifySeckey(sk[:]) != 1 { + return ErrInvalidSecKey + } + + if debugLevel2Check { + if err := CheckSecKey(sk); err != nil { + log.Panicf("DebugLevel2, WARNING CRYPTO ARMAGEDDON: %v", err) + } + } + + return nil +} + +// Hex returns a hex encoded SecKey string +func (sk SecKey) Hex() string { + return hex.EncodeToString(sk[:]) +} + +// Null returns true if SecKey is the null SecKey +func (sk SecKey) Null() bool { + return sk == SecKey{} +} + +//ECDH generates a shared secret +// A: pub1,sec1 +// B: pub2,sec2 +// person A sends their public key pub1 +// person B sends an emphameral pubkey pub2 +// person A computes cipher.ECDH(pub2, sec1) +// person B computes cipher.ECDH(pub1, sec2) +// cipher.ECDH(pub2, sec1) equals cipher.ECDH(pub1, sec2) +// This is their shared secret +func ECDH(pub PubKey, sec SecKey) ([]byte, error) { + if err := pub.Verify(); err != nil { + return nil, ErrECHDInvalidPubKey + } + + // Don't perform the DebugLevel2 verification check for the secret key, + // it is too slow to use in an ECDH context and is not important for that use case + if err := sec.verify(false); err != nil { + return nil, ErrECHDInvalidSecKey + } + + buff := secp256k1.ECDH(pub[:], sec[:]) + ret := SumSHA256(buff) // hash this so they cant screw up + return ret[:], nil +} + +// MustECDH calls ECDH and panics on error +func MustECDH(pub PubKey, sec SecKey) []byte { + r, err := ECDH(pub, sec) + if err != nil { + log.Panic(err) + } + return r +} + +// Sig signature +type Sig [64 + 1]byte //64 byte signature with 1 byte for key recovery + +// NewSig converts []byte to a Sig +func NewSig(b []byte) (Sig, error) { + s := Sig{} + if len(b) != len(s) { + return Sig{}, ErrInvalidLengthSig + } + copy(s[:], b[:]) + return s, nil +} + +// MustNewSig converts []byte to a Sig. Panics is []byte is not the exact size +func MustNewSig(b []byte) Sig { + s := Sig{} + if len(b) != len(s) { + log.Panic("Invalid signature length") + } + copy(s[:], b[:]) + return s +} + +// SigFromHex converts a hex string to a signature +func SigFromHex(s string) (Sig, error) { + b, err := hex.DecodeString(s) + if err != nil { + return Sig{}, ErrInvalidSig + } + return NewSig(b) +} + +// MustSigFromHex converts a hex string to a signature, panics on error +func MustSigFromHex(s string) Sig { + sig, err := SigFromHex(s) + if err != nil { + log.Panic(err) + } + return sig +} + +func (s Sig) String() string { + return s.Hex() +} + +// Null returns true if the Sig is a null Sig +func (s Sig) Null() bool { + return s == Sig{} +} + +// Hex converts signature to hex string +func (s Sig) Hex() string { + return hex.EncodeToString(s[:]) +} + +// SignHash sign hash +func SignHash(hash SHA256, sec SecKey) (Sig, error) { + if secp256k1.VerifySeckey(sec[:]) != 1 { + // Can't use sec.Verify() because that calls SignHash again, with DebugLevel2 set + return Sig{}, ErrInvalidSecKey + } + + // Null hashes can't be signed + if hash.Null() { + return Sig{}, ErrNullSignHash + } + + s := secp256k1.Sign(hash[:], sec[:]) + + sig, err := NewSig(s) + if err != nil { + return Sig{}, err + } + + if DebugLevel2 || DebugLevel1 { + // Guard against coin loss; + // if the generated signature is somehow invalid, coins would be lost, + // make sure that the signature is valid + pubkey, err := PubKeyFromSig(sig, hash) + if err != nil { + log.Panic("SignHash error: pubkey from sig recovery failure") + } + if VerifyPubKeySignedHash(pubkey, sig, hash) != nil { + log.Panic("SignHash error: secp256k1.Sign returned non-null invalid non-null signature") + } + if VerifyAddressSignedHash(AddressFromPubKey(pubkey), sig, hash) != nil { + log.Panic("SignHash error: VerifyAddressSignedHash failed for signature") + } + } + + return sig, nil +} + +// MustSignHash sign hash, panics on error +func MustSignHash(hash SHA256, sec SecKey) Sig { + sig, err := SignHash(hash, sec) + if err != nil { + log.Panic(err) + } + return sig +} + +// VerifyAddressSignedHash checks whether PubKey corresponding to address hash signed hash +// - recovers the PubKey from sig and hash +// - fail if PubKey cannot be be recovered +// - computes the address from the PubKey +// - fail if recovered address does not match PubKey hash +// - verify that signature is valid for hash for PubKey +func VerifyAddressSignedHash(address Address, sig Sig, hash SHA256) error { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return ErrInvalidSigPubKeyRecovery + } + + pubKey, err := NewPubKey(rawPubKey) + if err != nil { + return err + } + + if address != AddressFromPubKey(pubKey) { + return ErrInvalidAddressForSig + } + + if secp256k1.VerifySignature(hash[:], sig[:], rawPubKey[:]) != 1 { + return ErrInvalidHashForSig + } + + return nil +} + +// VerifyPubKeySignedHash verifies that hash was signed by PubKey +func VerifyPubKeySignedHash(pubkey PubKey, sig Sig, hash SHA256) error { + pubkeyRec, err := PubKeyFromSig(sig, hash) // recovered pubkey + if err != nil { + return ErrInvalidSigPubKeyRecovery + } + if pubkeyRec != pubkey { + return ErrPubKeyRecoverMismatch + } + if secp256k1.VerifyPubkey(pubkey[:]) != 1 { + if DebugLevel2 { + if secp256k1.VerifySignature(hash[:], sig[:], pubkey[:]) == 1 { + log.Panic("VerifyPubKeySignedHash warning, invalid pubkey is valid for signature") + } + } + return ErrInvalidSigInvalidPubKey + } + if secp256k1.VerifySignatureValidity(sig[:]) != 1 { + return ErrInvalidSigValidity + } + if secp256k1.VerifySignature(hash[:], sig[:], pubkey[:]) != 1 { + return ErrInvalidSigForMessage + } + return nil +} + +// VerifySignatureRecoverPubKey this only checks that the signature can be converted to a public key. +// It does not check that the signature signed the hash. +// The original public key or address is required to verify that the signature signed the hash. +func VerifySignatureRecoverPubKey(sig Sig, hash SHA256) error { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return ErrInvalidSigPubKeyRecovery + } + if secp256k1.VerifySignature(hash[:], sig[:], rawPubKey) != 1 { + // This should always pass; the recovered pubkey should always be valid + return ErrInvalidHashForSig + } + return nil +} + +// GenerateKeyPair creates key pair +func GenerateKeyPair() (PubKey, SecKey) { + public, secret := secp256k1.GenerateKeyPair() + + secKey, err := NewSecKey(secret) + if err != nil { + log.Panicf("GenerateKeyPair: secp256k1.GenerateKeyPair returned invalid secKey: %v", err) + } + + pubKey, err := NewPubKey(public) + if err != nil { + log.Panicf("GenerateKeyPair: secp256k1.GenerateKeyPair returned invalid pubKey: %v", err) + } + + if DebugLevel1 { + if err := CheckSecKey(secKey); err != nil { + log.Panicf("DebugLevel1, GenerateKeyPair, generated private key failed CheckSecKey: %v", err) + } + + if MustPubKeyFromSecKey(secKey) != pubKey { + log.Panic("DebugLevel1, GenerateKeyPair, public key does not match private key") + } + } + + return pubKey, secKey +} + +// GenerateDeterministicKeyPair generates deterministic key pair +func GenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey, error) { + if len(seed) == 0 { + return PubKey{}, SecKey{}, ErrEmptySeed + } + + public, secret := secp256k1.GenerateDeterministicKeyPair(seed) + + secKey, err := NewSecKey(secret) + if err != nil { + log.Panicf("GenerateDeterministicKeyPair: secp256k1.GenerateDeterministicKeyPair returned invalid secKey: %v", err) + } + + pubKey, err := NewPubKey(public) + if err != nil { + log.Panicf("GenerateDeterministicKeyPair: secp256k1.GenerateDeterministicKeyPair returned invalid pubKey: %v", err) + } + + if DebugLevel1 { + if err := CheckSecKey(secKey); err != nil { + log.Panicf("DebugLevel1, GenerateDeterministicKeyPair, CheckSecKey failed: %v", err) + } + + if MustPubKeyFromSecKey(secKey) != pubKey { + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, public key does not match private key") + } + } + + return pubKey, secKey, nil +} + +// MustGenerateDeterministicKeyPair generates deterministic key pair, panics on error +func MustGenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey) { + p, s, err := GenerateDeterministicKeyPair(seed) + if err != nil { + log.Panic(err) + } + return p, s +} + +// DeterministicKeyPairIterator takes SHA256 value, returns a new +// SHA256 value and publickey and private key. Apply multiple times +// feeding the SHA256 value back into generate sequence of keys +func DeterministicKeyPairIterator(seed []byte) ([]byte, PubKey, SecKey, error) { + if len(seed) == 0 { + return nil, PubKey{}, SecKey{}, ErrEmptySeed + } + + hash, public, secret := secp256k1.DeterministicKeyPairIterator(seed) + + secKey := MustNewSecKey(secret) + pubKey := MustNewPubKey(public) + + if DebugLevel1 { + if err := CheckSecKey(secKey); err != nil { + log.Panicf("DebugLevel1, DeterministicKeyPairIterator, CheckSecKey failed: %v", err) + } + + if MustPubKeyFromSecKey(secKey) != pubKey { + log.Panic("DebugLevel1, DeterministicKeyPairIterator, public key does not match private key") + } + } + + return hash, pubKey, secKey, nil +} + +// MustDeterministicKeyPairIterator takes SHA256 value, returns a new +// SHA256 value and publickey and private key. Apply multiple times +// feeding the SHA256 value back into generate sequence of keys, panics on error +func MustDeterministicKeyPairIterator(seed []byte) ([]byte, PubKey, SecKey) { + hash, p, s, err := DeterministicKeyPairIterator(seed) + if err != nil { + log.Panic(err) + } + return hash, p, s +} + +// GenerateDeterministicKeyPairs returns sequence of n private keys from initial seed +func GenerateDeterministicKeyPairs(seed []byte, n int) ([]SecKey, error) { + _, keys, err := GenerateDeterministicKeyPairsSeed(seed, n) + return keys, err +} + +// MustGenerateDeterministicKeyPairs returns sequence of n private keys from initial seed, panics on error +func MustGenerateDeterministicKeyPairs(seed []byte, n int) []SecKey { + keys, err := GenerateDeterministicKeyPairs(seed, n) + if err != nil { + log.Panic(err) + } + return keys +} + +// GenerateDeterministicKeyPairsSeed returns sequence of n private keys from initial seed, and return the new seed +func GenerateDeterministicKeyPairsSeed(seed []byte, n int) ([]byte, []SecKey, error) { + var keys []SecKey + var seckey SecKey + for i := 0; i < n; i++ { + var err error + seed, _, seckey, err = DeterministicKeyPairIterator(seed) + if err != nil { + return nil, nil, err + } + keys = append(keys, seckey) + } + return seed, keys, nil +} + +// MustGenerateDeterministicKeyPairsSeed returns sequence of n private keys from initial seed, and return the new seed +func MustGenerateDeterministicKeyPairsSeed(seed []byte, n int) ([]byte, []SecKey) { + newSeed, keys, err := GenerateDeterministicKeyPairsSeed(seed, n) + if err != nil { + log.Panic(err) + } + return newSeed, keys +} + +// CheckSecKey test seckey hash +func CheckSecKey(seckey SecKey) error { + hash := SumSHA256([]byte(time.Now().String())) + return CheckSecKeyHash(seckey, hash) +} + +// CheckSecKeyHash performs a series of tests to determine if a seckey is valid. +// All generated keys and keys loaded from disc must pass the CheckSecKey suite. +// TestPrivKey returns error if a key fails any test in the test suite. +func CheckSecKeyHash(seckey SecKey, hash SHA256) error { + // check seckey with verify + if secp256k1.VerifySeckey(seckey[:]) != 1 { + return ErrInvalidSecKyVerification + } + + // check pubkey recovery + pubkey, err := PubKeyFromSecKey(seckey) + if err != nil { + return fmt.Errorf("PubKeyFromSecKey failed: %v", err) + } + if pubkey == (PubKey{}) { + return ErrNullPubKeyFromSecKey + } + // verify recovered pubkey + if secp256k1.VerifyPubkey(pubkey[:]) != 1 { + return ErrInvalidDerivedPubKeyFromSecKey + } + + // check signature production + sig, err := SignHash(hash, seckey) + if err != nil { + return fmt.Errorf("SignHash failed: %v", err) + } + + pubkey2, err := PubKeyFromSig(sig, hash) + if err != nil { + return fmt.Errorf("PubKeyFromSig failed: %v", err) + } + if pubkey != pubkey2 { + return ErrInvalidPubKeyFromHash + } + + // check pubkey recovered from sig + recoveredPubkey, err := PubKeyFromSig(sig, hash) + if err != nil { + return fmt.Errorf("impossible error, CheckSecKeyHash, pubkey recovery from signature failed: %v", err) + } + if pubkey != recoveredPubkey { + return ErrPubKeyFromSecKeyMismatch + } + + // verify produced signature + err = VerifyPubKeySignedHash(pubkey, sig, hash) + if err != nil { + return fmt.Errorf("impossible error, CheckSecKeyHash, VerifyPubKeySignedHash failed for sig: %v", err) + } + + // verify VerifyAddressSignedHash + addr := AddressFromPubKey(pubkey) + err = VerifyAddressSignedHash(addr, sig, hash) + if err != nil { + return fmt.Errorf("impossible error CheckSecKeyHash, VerifyAddressSignedHash Failed, should not get this far: %v", err) + } + + // verify VerifySignatureRecoverPubKey + err = VerifySignatureRecoverPubKey(sig, hash) + if err != nil { + return fmt.Errorf("VerifySignatureRecoverPubKey failed: %v", err) + } + + return nil +} + +func init() { + ripemd160HashPool = make(chan hash.Hash, ripemd160HashPoolSize) + for i := 0; i < ripemd160HashPoolSize; i++ { + ripemd160HashPool <- ripemd160.New() + } + + sha256HashPool = make(chan hash.Hash, sha256HashPoolSize) + for i := 0; i < sha256HashPoolSize; i++ { + sha256HashPool <- sha256.New() + } + + // Do not allow program to start if crypto tests fail + pubkey, seckey := GenerateKeyPair() + if err := CheckSecKey(seckey); err != nil { + log.Panicf("CRYPTOGRAPHIC INTEGRITY CHECK FAILED: TERMINATING PROGRAM TO PROTECT COINS: %v", err) + } + if MustPubKeyFromSecKey(seckey) != pubkey { + log.Panic("DebugLevel1, GenerateKeyPair, public key does not match private key") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto_test.go new file mode 100644 index 00000000..8d895d14 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto_test.go @@ -0,0 +1,753 @@ +package cipher + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/ripemd160" +) + +func TestNewPubKey(t *testing.T) { + _, err := NewPubKey(randBytes(t, 31)) + require.Equal(t, errors.New("Invalid public key length"), err) + _, err = NewPubKey(randBytes(t, 32)) + require.Equal(t, errors.New("Invalid public key length"), err) + _, err = NewPubKey(randBytes(t, 34)) + require.Equal(t, errors.New("Invalid public key length"), err) + _, err = NewPubKey(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid public key length"), err) + _, err = NewPubKey(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid public key length"), err) + + _, err = NewPubKey(make([]byte, len(PubKey{}))) + require.Equal(t, errors.New("Invalid public key"), err) + + p, _ := GenerateKeyPair() + p2, err := NewPubKey(p[:]) + require.NoError(t, err) + require.Equal(t, p, p2) +} + +func TestMustNewPubKey(t *testing.T) { + require.Panics(t, func() { MustNewPubKey(randBytes(t, 31)) }) + require.Panics(t, func() { MustNewPubKey(randBytes(t, 32)) }) + require.Panics(t, func() { MustNewPubKey(randBytes(t, 34)) }) + require.Panics(t, func() { MustNewPubKey(randBytes(t, 0)) }) + require.Panics(t, func() { MustNewPubKey(randBytes(t, 100)) }) + require.Panics(t, func() { MustNewPubKey(make([]byte, len(PubKey{}))) }) + + p, _ := GenerateKeyPair() + p2 := MustNewPubKey(p[:]) + require.Equal(t, p, p2) +} + +func TestPubKeyFromHex(t *testing.T) { + // Invalid hex + _, err := PubKeyFromHex("") + require.Equal(t, errors.New("Invalid public key length"), err) + + _, err = PubKeyFromHex("cascs") + require.Equal(t, errors.New("Invalid public key"), err) + + // Empty key + empty := PubKey{} + h := hex.EncodeToString(empty[:]) + _, err = PubKeyFromHex(h) + require.Equal(t, errors.New("Invalid public key"), err) + + // Invalid hex length + p, _ := GenerateKeyPair() + s := hex.EncodeToString(p[:len(p)/2]) + _, err = PubKeyFromHex(s) + require.Equal(t, errors.New("Invalid public key length"), err) + + // Valid + s = hex.EncodeToString(p[:]) + p2, err := PubKeyFromHex(s) + require.NoError(t, err) + require.Equal(t, p, p2) +} + +func TestMustPubKeyFromHex(t *testing.T) { + // Invalid hex + require.Panics(t, func() { MustPubKeyFromHex("") }) + require.Panics(t, func() { MustPubKeyFromHex("cascs") }) + + // Empty key + empty := PubKey{} + h := hex.EncodeToString(empty[:]) + require.Panics(t, func() { MustPubKeyFromHex(h) }) + + // Invalid hex length + p, _ := GenerateKeyPair() + s := hex.EncodeToString(p[:len(p)/2]) + require.Panics(t, func() { MustPubKeyFromHex(s) }) + + // Valid + s = hex.EncodeToString(p[:]) + require.NotPanics(t, func() { MustPubKeyFromHex(s) }) + require.Equal(t, p, MustPubKeyFromHex(s)) +} + +func TestPubKeyHex(t *testing.T) { + p, _ := GenerateKeyPair() + h := p.Hex() + p2, err := PubKeyFromHex(h) + require.NoError(t, err) + require.Equal(t, p2, p) + require.Equal(t, p2.Hex(), h) +} + +func TestNewPubKeyRandom(t *testing.T) { + // Random bytes should not be valid, most of the time + failed := false + for i := 0; i < 10; i++ { + b := randBytes(t, 33) + if _, err := NewPubKey(b); err != nil { + failed = true + break + } + } + require.True(t, failed) +} + +func TestPubKeyVerify(t *testing.T) { + // Random bytes should not be valid, most of the time + failed := false + for i := 0; i < 10; i++ { + b := randBytes(t, 33) + p := PubKey{} + copy(p[:], b[:]) + if p.Verify() != nil { + failed = true + break + } + } + require.True(t, failed) +} + +func TestPubKeyNullVerifyFails(t *testing.T) { + // Empty public key should not be valid + p := PubKey{} + require.Error(t, p.Verify()) +} + +func TestPubKeyVerifyDefault1(t *testing.T) { + // Generated pub key should be valid + p, _ := GenerateKeyPair() + require.NoError(t, p.Verify()) +} + +func TestPubKeyVerifyDefault2(t *testing.T) { + for i := 0; i < 1024; i++ { + p, _ := GenerateKeyPair() + require.NoError(t, p.Verify()) + } +} + +func TestPubKeyRipemd160(t *testing.T) { + p, _ := GenerateKeyPair() + h := PubKeyRipemd160(p) + // Should be Ripemd160(SHA256(SHA256())) + x := sha256.Sum256(p[:]) + x = sha256.Sum256(x[:]) + rh := ripemd160.New() + _, err := rh.Write(x[:]) + require.NoError(t, err) + y := rh.Sum(nil) + require.True(t, bytes.Equal(h[:], y)) +} + +func TestPubKeyToAddress(t *testing.T) { + p, _ := GenerateKeyPair() + addr := AddressFromPubKey(p) + //func (self Address) Verify(key PubKey) error { + err := addr.Verify(p) + require.NoError(t, err) + addrStr := addr.String() + _, err = DecodeBase58Address(addrStr) + //func DecodeBase58Address(addr string) (Address, error) { + require.NoError(t, err) +} + +func TestPubKeyToAddress2(t *testing.T) { + for i := 0; i < 1024; i++ { + p, _ := GenerateKeyPair() + addr := AddressFromPubKey(p) + //func (self Address) Verify(key PubKey) error { + err := addr.Verify(p) + require.NoError(t, err) + addrStr := addr.String() + _, err = DecodeBase58Address(addrStr) + //func DecodeBase58Address(addr string) (Address, error) { + require.NoError(t, err) + } +} + +func TestNewSecKey(t *testing.T) { + _, err := NewSecKey(randBytes(t, 31)) + require.Equal(t, errors.New("Invalid secret key length"), err) + _, err = NewSecKey(randBytes(t, 33)) + require.Equal(t, errors.New("Invalid secret key length"), err) + _, err = NewSecKey(randBytes(t, 34)) + require.Equal(t, errors.New("Invalid secret key length"), err) + _, err = NewSecKey(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid secret key length"), err) + _, err = NewSecKey(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid secret key length"), err) + + b := randBytes(t, 32) + p, err := NewSecKey(b) + require.NoError(t, err) + require.True(t, bytes.Equal(p[:], b)) +} + +func TestMustNewSecKey(t *testing.T) { + require.Panics(t, func() { MustNewSecKey(randBytes(t, 31)) }) + require.Panics(t, func() { MustNewSecKey(randBytes(t, 33)) }) + require.Panics(t, func() { MustNewSecKey(randBytes(t, 34)) }) + require.Panics(t, func() { MustNewSecKey(randBytes(t, 0)) }) + require.Panics(t, func() { MustNewSecKey(randBytes(t, 100)) }) + require.NotPanics(t, func() { MustNewSecKey(randBytes(t, 32)) }) + b := randBytes(t, 32) + p := MustNewSecKey(b) + require.True(t, bytes.Equal(p[:], b)) +} + +func TestSecKeyFromHex(t *testing.T) { + // Invalid hex + _, err := SecKeyFromHex("") + require.Equal(t, errors.New("Invalid secret key length"), err) + + _, err = SecKeyFromHex("cascs") + require.Equal(t, errors.New("Invalid secret key"), err) + + // Invalid hex length + p := MustNewSecKey(randBytes(t, 32)) + s := hex.EncodeToString(p[:len(p)/2]) + _, err = SecKeyFromHex(s) + require.Equal(t, errors.New("Invalid secret key length"), err) + + // Valid + s = hex.EncodeToString(p[:]) + p2, err := SecKeyFromHex(s) + require.NoError(t, err) + require.Equal(t, p2, p) +} + +func TestMustSecKeyFromHex(t *testing.T) { + // Invalid hex + require.Panics(t, func() { MustSecKeyFromHex("") }) + require.Panics(t, func() { MustSecKeyFromHex("cascs") }) + // Invalid hex length + p := MustNewSecKey(randBytes(t, 32)) + s := hex.EncodeToString(p[:len(p)/2]) + require.Panics(t, func() { MustSecKeyFromHex(s) }) + // Valid + s = hex.EncodeToString(p[:]) + require.NotPanics(t, func() { MustSecKeyFromHex(s) }) + require.Equal(t, p, MustSecKeyFromHex(s)) +} + +func TestSecKeyHex(t *testing.T) { + b := randBytes(t, 32) + p := MustNewSecKey(b) + h := p.Hex() + p2 := MustSecKeyFromHex(h) + require.Equal(t, p2, p) + require.Equal(t, p2.Hex(), h) +} + +func TestSecKeyVerify(t *testing.T) { + // Empty secret key should not be valid + p := SecKey{} + require.Error(t, p.Verify()) + + // Generated sec key should be valid + _, p = GenerateKeyPair() + require.NoError(t, p.Verify()) + + // Random bytes are usually valid +} + +func TestECDH(t *testing.T) { + pub1, sec1 := GenerateKeyPair() + pub2, sec2 := GenerateKeyPair() + + buf1, err := ECDH(pub2, sec1) + require.NoError(t, err) + buf2, err := ECDH(pub1, sec2) + require.NoError(t, err) + + require.True(t, bytes.Equal(buf1, buf2)) + + goodPub, goodSec := GenerateKeyPair() + var badPub PubKey + var badSec SecKey + + _, err = ECDH(badPub, goodSec) + require.Equal(t, errors.New("ECDH invalid pubkey input"), err) + _, err = ECDH(goodPub, badSec) + require.Equal(t, errors.New("ECDH invalid seckey input"), err) + + for i := 0; i < 128; i++ { + pub1, sec1 := GenerateKeyPair() + pub2, sec2 := GenerateKeyPair() + buf1, err := ECDH(pub2, sec1) + require.NoError(t, err) + buf2, err := ECDH(pub1, sec2) + require.NoError(t, err) + require.True(t, bytes.Equal(buf1, buf2)) + } +} + +func TestMustECDH(t *testing.T) { + goodPub, goodSec := GenerateKeyPair() + var badPub PubKey + var badSec SecKey + + require.Panics(t, func() { + MustECDH(badPub, goodSec) + }) + require.Panics(t, func() { + MustECDH(goodPub, badSec) + }) + + pub1, sec1 := GenerateKeyPair() + pub2, sec2 := GenerateKeyPair() + + buf1 := MustECDH(pub2, sec1) + buf2 := MustECDH(pub1, sec2) + + require.True(t, bytes.Equal(buf1, buf2)) +} + +func TestNewSig(t *testing.T) { + _, err := NewSig(randBytes(t, 64)) + require.Equal(t, errors.New("Invalid signature length"), err) + _, err = NewSig(randBytes(t, 66)) + require.Equal(t, errors.New("Invalid signature length"), err) + _, err = NewSig(randBytes(t, 67)) + require.Equal(t, errors.New("Invalid signature length"), err) + _, err = NewSig(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid signature length"), err) + _, err = NewSig(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid signature length"), err) + + b := randBytes(t, 65) + p, err := NewSig(b) + require.NoError(t, err) + require.True(t, bytes.Equal(p[:], b)) +} + +func TestMustNewSig(t *testing.T) { + require.Panics(t, func() { MustNewSig(randBytes(t, 64)) }) + require.Panics(t, func() { MustNewSig(randBytes(t, 66)) }) + require.Panics(t, func() { MustNewSig(randBytes(t, 67)) }) + require.Panics(t, func() { MustNewSig(randBytes(t, 0)) }) + require.Panics(t, func() { MustNewSig(randBytes(t, 100)) }) + + require.NotPanics(t, func() { MustNewSig(randBytes(t, 65)) }) + + b := randBytes(t, 65) + p := MustNewSig(b) + require.True(t, bytes.Equal(p[:], b)) +} + +func TestSigFromHex(t *testing.T) { + // Invalid hex + _, err := SigFromHex("") + require.Equal(t, errors.New("Invalid signature length"), err) + + _, err = SigFromHex("cascs") + require.Equal(t, errors.New("Invalid signature"), err) + + // Invalid hex length + p := MustNewSig(randBytes(t, 65)) + s := hex.EncodeToString(p[:len(p)/2]) + _, err = SigFromHex(s) + require.Equal(t, errors.New("Invalid signature length"), err) + + // Valid + s = hex.EncodeToString(p[:]) + s2, err := SigFromHex(s) + require.NoError(t, err) + require.Equal(t, p, s2) +} + +func TestMustSigFromHex(t *testing.T) { + // Invalid hex + require.Panics(t, func() { MustSigFromHex("") }) + require.Panics(t, func() { MustSigFromHex("cascs") }) + // Invalid hex length + p := MustNewSig(randBytes(t, 65)) + s := hex.EncodeToString(p[:len(p)/2]) + require.Panics(t, func() { MustSigFromHex(s) }) + // Valid + s = hex.EncodeToString(p[:]) + require.NotPanics(t, func() { MustSigFromHex(s) }) + require.Equal(t, p, MustSigFromHex(s)) +} + +func TestSigHex(t *testing.T) { + b := randBytes(t, 65) + p := MustNewSig(b) + h := p.Hex() + p2 := MustSigFromHex(h) + require.Equal(t, p2, p) + require.Equal(t, p2.Hex(), h) +} + +func TestVerifyAddressSignedHash(t *testing.T) { + p, s := GenerateKeyPair() + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + a := AddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + b := randBytes(t, 256) + h := SumSHA256(b) + sig := MustSignHash(h, s) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + // Empty sig should be invalid + require.Error(t, VerifyAddressSignedHash(a, Sig{}, h)) + // Random sigs should not pass + for i := 0; i < 100; i++ { + require.Error(t, VerifyAddressSignedHash(a, MustNewSig(randBytes(t, 65)), h)) + } + // Sig for one hash does not work for another hash + h2 := SumSHA256(randBytes(t, 256)) + sig2 := MustSignHash(h2, s) + require.NoError(t, VerifyAddressSignedHash(a, sig2, h2)) + require.Error(t, VerifyAddressSignedHash(a, sig2, h)) + require.Error(t, VerifyAddressSignedHash(a, sig, h2)) + + // Different secret keys should not create same sig + p2, s2 := GenerateKeyPair() + a2 := AddressFromPubKey(p2) + h = SumSHA256(randBytes(t, 256)) + sig = MustSignHash(h, s) + sig2 = MustSignHash(h, s2) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + require.NoError(t, VerifyAddressSignedHash(a2, sig2, h)) + require.NotEqual(t, sig, sig2) + h = SumSHA256(randBytes(t, 256)) + sig = MustSignHash(h, s) + sig2 = MustSignHash(h, s2) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + require.NoError(t, VerifyAddressSignedHash(a2, sig2, h)) + require.NotEqual(t, sig, sig2) + + // Bad address should be invalid + require.Error(t, VerifyAddressSignedHash(a, sig2, h)) + require.Error(t, VerifyAddressSignedHash(a2, sig, h)) + + // Empty hash should panic + require.Panics(t, func() { + MustSignHash(SHA256{}, s) + }) +} + +func TestSignHash(t *testing.T) { + p, s := GenerateKeyPair() + a := AddressFromPubKey(p) + h := SumSHA256(randBytes(t, 256)) + sig, err := SignHash(h, s) + require.NoError(t, err) + require.NotEqual(t, sig, Sig{}) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + require.NoError(t, VerifyPubKeySignedHash(p, sig, h)) + + p2, err := PubKeyFromSig(sig, h) + require.NoError(t, err) + require.Equal(t, p, p2) + + _, err = SignHash(h, SecKey{}) + require.Equal(t, ErrInvalidSecKey, err) + + _, err = SignHash(SHA256{}, s) + require.Equal(t, ErrNullSignHash, err) +} + +func TestMustSignHash(t *testing.T) { + p, s := GenerateKeyPair() + a := AddressFromPubKey(p) + h := SumSHA256(randBytes(t, 256)) + sig := MustSignHash(h, s) + require.NotEqual(t, sig, Sig{}) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + + require.Panics(t, func() { + MustSignHash(h, SecKey{}) + }) +} + +func TestPubKeyFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + p2, err := PubKeyFromSecKey(s) + require.NoError(t, err) + require.Equal(t, p2, p) + + _, err = PubKeyFromSecKey(SecKey{}) + require.Equal(t, errors.New("Attempt to load null seckey, unsafe"), err) +} + +func TestMustPubKeyFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + require.Equal(t, MustPubKeyFromSecKey(s), p) + require.Panics(t, func() { MustPubKeyFromSecKey(SecKey{}) }) +} + +func TestPubKeyFromSig(t *testing.T) { + p, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + sig := MustSignHash(h, s) + p2, err := PubKeyFromSig(sig, h) + require.Equal(t, p, p2) + require.NoError(t, err) + _, err = PubKeyFromSig(Sig{}, h) + require.Error(t, err) +} + +func TestMustPubKeyFromSig(t *testing.T) { + p, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + sig := MustSignHash(h, s) + p2 := MustPubKeyFromSig(sig, h) + require.Equal(t, p, p2) + + require.Panics(t, func() { + _ = MustPubKeyFromSig(Sig{}, h) + }) +} + +func TestVerifyPubKeySignedHash(t *testing.T) { + p, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + h2 := SumSHA256(randBytes(t, 256)) + sig := MustSignHash(h, s) + require.NoError(t, VerifyPubKeySignedHash(p, sig, h)) + require.Error(t, VerifyPubKeySignedHash(p, Sig{}, h)) + require.Error(t, VerifyPubKeySignedHash(p, sig, h2)) + p2, _ := GenerateKeyPair() + require.Error(t, VerifyPubKeySignedHash(p2, sig, h)) + require.Error(t, VerifyPubKeySignedHash(PubKey{}, sig, h)) +} + +func TestGenerateKeyPair(t *testing.T) { + for i := 0; i < 10; i++ { + p, s := GenerateKeyPair() + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + err := CheckSecKey(s) + require.NoError(t, err) + } +} + +func TestGenerateDeterministicKeyPair(t *testing.T) { + // TODO -- deterministic key pairs are useless as is because we can't + // generate pair n+1, only pair 0 + seed := randBytes(t, 32) + p, s := MustGenerateDeterministicKeyPair(seed) + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + p, s = MustGenerateDeterministicKeyPair(seed) + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + + _, _, err := GenerateDeterministicKeyPair(nil) + require.Equal(t, errors.New("Seed input is empty"), err) + + require.Panics(t, func() { + MustGenerateDeterministicKeyPair(nil) + }) +} + +func TestGenerateDeterministicKeyPairs(t *testing.T) { + seed := randBytes(t, 32) + keys, err := GenerateDeterministicKeyPairs(seed, 4) + require.NoError(t, err) + require.Len(t, keys, 4) + for _, s := range keys { + require.NoError(t, s.Verify()) + } + + keys2 := MustGenerateDeterministicKeyPairs(seed, 4) + require.Equal(t, keys, keys2) + + _, err = GenerateDeterministicKeyPairs(nil, 1) + require.Equal(t, errors.New("Seed input is empty"), err) + + require.Panics(t, func() { + MustGenerateDeterministicKeyPairs(nil, 1) + }) +} + +func TestGenerateDeterministicKeyPairsSeed(t *testing.T) { + seed := randBytes(t, 32) + newSeed, keys, err := GenerateDeterministicKeyPairsSeed(seed, 4) + require.NoError(t, err) + require.Len(t, newSeed, 32) + require.NotEqual(t, seed, newSeed) + require.Len(t, keys, 4) + for _, s := range keys { + require.NoError(t, s.Verify()) + } + + newSeed2, keys2 := MustGenerateDeterministicKeyPairsSeed(seed, 4) + require.Equal(t, newSeed, newSeed2) + require.Equal(t, keys, keys2) + + _, _, err = GenerateDeterministicKeyPairsSeed(nil, 4) + require.Equal(t, errors.New("Seed input is empty"), err) + + require.Panics(t, func() { + MustGenerateDeterministicKeyPairsSeed(nil, 4) + }) +} + +func TestDeterministicKeyPairIterator(t *testing.T) { + seed := randBytes(t, 32) + newSeed, p, s, err := DeterministicKeyPairIterator(seed) + require.NoError(t, err) + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + require.NotEqual(t, seed, newSeed) + require.Len(t, newSeed, 32) + + newSeed2, p2, s2 := MustDeterministicKeyPairIterator(seed) + require.Equal(t, newSeed, newSeed2) + require.Equal(t, p, p2) + require.Equal(t, s, s2) + + _, _, _, err = DeterministicKeyPairIterator(nil) + require.Equal(t, errors.New("Seed input is empty"), err) + + require.Panics(t, func() { + MustDeterministicKeyPairIterator(nil) + }) +} + +func TestCheckSecKey(t *testing.T) { + _, s := GenerateKeyPair() + require.NoError(t, CheckSecKey(s)) + require.Error(t, CheckSecKey(SecKey{})) +} + +func TestCheckSecKeyHash(t *testing.T) { + _, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + require.NoError(t, CheckSecKeyHash(s, h)) + require.Error(t, CheckSecKeyHash(SecKey{}, h)) +} + +func TestGenerateDeterministicKeyPairsUsesAllBytes(t *testing.T) { + // Tests that if a seed >128 bits is used, the generator does not ignore bits >128 + seed := "property diet little foster provide disagree witness mountain alley weekend kitten general" + seckeys := MustGenerateDeterministicKeyPairs([]byte(seed), 3) + seckeys2 := MustGenerateDeterministicKeyPairs([]byte(seed[:16]), 3) + require.NotEqual(t, seckeys, seckeys2) +} + +func TestPubkey1(t *testing.T) { + // This was migrated from coin/coin_test.go + a := "02fa939957e9fc52140e180264e621c2576a1bfe781f88792fb315ca3d1786afb8" + b, err := hex.DecodeString(a) + require.NoError(t, err) + + p, err := NewPubKey(b) + require.NoError(t, err) + require.NoError(t, p.Verify()) + + addr := AddressFromPubKey(p) + require.NoError(t, addr.Verify(p)) +} + +func TestSecKey1(t *testing.T) { + // This was migrated from coin/coin_test.go + a := "5a42c0643bdb465d90bf673b99c14f5fa02db71513249d904573d2b8b63d353d" + b, err := hex.DecodeString(a) + require.NoError(t, err) + require.Len(t, b, 32) + + seckey, err := NewSecKey(b) + require.NoError(t, err) + require.NoError(t, seckey.Verify()) + + pubkey, err := PubKeyFromSecKey(seckey) + require.NoError(t, err) + require.NoError(t, pubkey.Verify()) + + addr := AddressFromPubKey(pubkey) + require.NoError(t, addr.Verify(pubkey)) + + test := []byte("test message") + hash := SumSHA256(test) + err = CheckSecKeyHash(seckey, hash) + require.NoError(t, err) +} + +func TestSecKeyPubKeyNull(t *testing.T) { + var pk PubKey + require.True(t, pk.Null()) + pk[0] = 1 + require.False(t, pk.Null()) + + var sk SecKey + require.True(t, sk.Null()) + sk[0] = 1 + require.False(t, sk.Null()) + + sk, err := NewSecKey(randBytes(t, 32)) + require.NoError(t, err) + pk = MustPubKeyFromSecKey(sk) + + require.False(t, sk.Null()) + require.False(t, pk.Null()) +} + +func TestVerifySignatureRecoverPubKey(t *testing.T) { + h := MustSHA256FromHex("127e9b0d6b71cecd0363b366413f0f19fcd924ae033513498e7486570ff2a1c8") + sig := MustSigFromHex("63c035b0c95d0c5744fc1c0bdf38af02cef2d2f65a8f923732ab44e436f8a491216d9ab5ff795e3144f4daee37077b8b9db54d2ba3a3df8d4992f06bb21f724401") + + err := VerifySignatureRecoverPubKey(sig, h) + require.NoError(t, err) + + // Fails with ErrInvalidHashForSig + badSigHex := "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + badSig := MustSigFromHex(badSigHex) + err = VerifySignatureRecoverPubKey(badSig, h) + require.Equal(t, ErrInvalidHashForSig, err) + + // Fails with ErrInvalidSigPubKeyRecovery + badSig = MustSigFromHex("63c035b0c95d0c5744fc1c0bdf39af02cef2d2f65a8f923732ab44e436f8a491216d9ab5ff795e3144f4daee37077b8b9db54d2ba3a3df8d4992f06bb21f724401") + err = VerifySignatureRecoverPubKey(badSig, h) + require.Equal(t, ErrInvalidSigPubKeyRecovery, err) +} + +func TestHighSPointSigInvalid(t *testing.T) { + // Verify that signatures that were generated with forceLowS=false + // are not accepted as valid, to avoid a signature malleability case. + // Refer to secp256k1go's TestSigForceLowS for the reference test inputs + + h := MustSHA256FromHex("DD72CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + + // This signature has a high S point (the S point is above the half-order of the curve) + sigHexHighS := "8c20a668be1b5a910205de46095023fe4823a3757f4417114168925f28193bffadf317cc256cec28d90d5b2b7e1ce6a45cd5f3b10880ab5f99c389c66177d39a01" + s := MustSigFromHex(sigHexHighS) + err := VerifySignatureRecoverPubKey(s, h) + + require.Error(t, err) + require.Equal(t, "Signature not valid for hash", err.Error()) + + // This signature has a low S point (the S point is below the half-order of the curve). + // It is equal to forceLowS(sigHighS). + sigHexLowS := "8c20a668be1b5a910205de46095023fe4823a3757f4417114168925f28193bff520ce833da9313d726f2a4d481e3195a5dd8e935a6c7f4dc260ed4c66ebe6da700" + s2 := MustSigFromHex(sigHexLowS) + err = VerifySignatureRecoverPubKey(s2, h) + require.NoError(t, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/README.md new file mode 100644 index 00000000..20c62e92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/README.md @@ -0,0 +1,8 @@ +encoder +======= + +[![GoDoc](http://godoc.org/github.com//SkycoinProject/skycoin/src/cipher/encoder?status.png)](http://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/encoder) + +[Godoc generated documentation](https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/encoder) + +Binary struct encoder for Go. Fork of go's pkg encoding/binary. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/benchmark_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/benchmark_test.go new file mode 100644 index 00000000..76a20e8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/benchmark_test.go @@ -0,0 +1,33 @@ +package encoder + +import "testing" + +// benchmarkExample is the same struct used in https://github.com/gz-c/gosercomp benchmarks +type benchmarkExample struct { + ID int32 + Name string + Colors []string +} + +var benchmarkExampleObj = benchmarkExample{ + ID: 1, + Name: "Reds", + Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, +} + +func BenchmarkDeserializeRaw(b *testing.B) { + byt := Serialize(benchmarkExampleObj) + result := &benchmarkExample{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerialize(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + Serialize(&benchmarkExampleObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder.go new file mode 100644 index 00000000..da17043b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder.go @@ -0,0 +1,1027 @@ +// 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 encoder binary implements translation between struct data and byte sequences +// +// Fields can be ignored with the struct tag `enc:"-"` . +// Unexported struct fields are ignored by default . +// +// Fields can be skipped if empty with the struct tag `enc:",omitempty"` +// Note the comma, which follows package json's conventions. +// Only Slice, Map and String types recognize the omitempty tag. +// When omitempty is set, the no data will be written if the value is empty. +// If the value is empty and omitempty is not set, then a length prefix with value 0 would be written. +// omitempty can only be used for the last field in the struct +// +// Encoding of maps is supported, but note that the use of them results in non-deterministic output. +// If determinism is required, do not use map. +// +// A length restriction to certain fields can be applied when decoding. +// Use the tag `,maxlen=` on a struct field to apply this restriction. +// `maxlen` works for string and slice types. The length is interpreted as the length +// of the string or the number of elements in the slice. +// Note that maxlen does not affect serialization; it may serialize objects which could fail deserialization. +// Callers should check their length restricted values manually prior to serialization. +package encoder + +import ( + "errors" + "fmt" + "log" + "math" + "reflect" + "strconv" + "strings" +) + +var ( + // ErrBufferUnderflow bytes in input buffer not enough to deserialize expected type + ErrBufferUnderflow = errors.New("Not enough buffer data to deserialize") + // ErrBufferOverflow bytes in output buffer not enough to serialize expected type + ErrBufferOverflow = errors.New("Not enough buffer data to serialize") + // ErrInvalidOmitEmpty field tagged with omitempty and it's not last one in struct + ErrInvalidOmitEmpty = errors.New("omitempty only supported for the final field in the struct") + // ErrRemainingBytes bytes remain in buffer after deserializing object + ErrRemainingBytes = errors.New("Bytes remain in buffer after deserializing object") + // ErrMaxLenExceeded a specified maximum length was exceeded when serializing or deserializing a variable length field + ErrMaxLenExceeded = errors.New("Maximum length exceeded for variable length field") + // ErrMapDuplicateKeys encountered duplicate map keys while decoding a map + ErrMapDuplicateKeys = errors.New("Duplicate keys encountered while decoding a map") + // ErrInvalidBool is returned if the decoder encounters a value other than 0 or 1 for a bool type field + ErrInvalidBool = errors.New("Invalid value for bool type") +) + +// SerializeUint32 serializes a uint32 +func SerializeUint32(x uint32) []byte { + var b [4]byte + lePutUint32(b[:], x) + return b[:] +} + +// DeserializeUint32 serializes a uint32 +func DeserializeUint32(buf []byte) (uint32, uint64, error) { + if len(buf) < 4 { + return 0, 0, ErrBufferUnderflow + } + return leUint32(buf[:4]), 4, nil +} + +// SerializeAtomic encodes an integer or boolean contained in `data` to bytes. +// Panics if `data` is not an integer or boolean type. +func SerializeAtomic(data interface{}) []byte { + var b [8]byte + + switch v := data.(type) { + case bool: + if v { + b[0] = 1 + } else { + b[0] = 0 + } + return b[:1] + case int8: + b[0] = byte(v) + return b[:1] + case uint8: + b[0] = v + return b[:1] + case int16: + lePutUint16(b[:2], uint16(v)) + return b[:2] + case uint16: + lePutUint16(b[:2], v) + return b[:2] + case int32: + lePutUint32(b[:4], uint32(v)) + return b[:4] + case uint32: + lePutUint32(b[:4], v) + return b[:4] + case int64: + lePutUint64(b[:8], uint64(v)) + return b[:8] + case uint64: + lePutUint64(b[:8], v) + return b[:8] + default: + log.Panic("SerializeAtomic unhandled type") + return nil + } +} + +// DeserializeAtomic deserializes `in` buffer into `data` +// parameter. Panics if `data` is not an integer or boolean type. +// Returns the number of bytes read. +func DeserializeAtomic(in []byte, data interface{}) (uint64, error) { + switch v := data.(type) { + case *bool: + if len(in) < 1 { + return 0, ErrBufferUnderflow + } + if in[0] == 0 { + *v = false + } else { + *v = true + } + return 1, nil + case *int8: + if len(in) < 1 { + return 0, ErrBufferUnderflow + } + *v = int8(in[0]) + return 1, nil + case *uint8: + if len(in) < 1 { + return 0, ErrBufferUnderflow + } + *v = in[0] + return 1, nil + case *int16: + if len(in) < 2 { + return 0, ErrBufferUnderflow + } + *v = int16(leUint16(in[:2])) + return 2, nil + case *uint16: + if len(in) < 2 { + return 0, ErrBufferUnderflow + } + *v = leUint16(in[:2]) + return 2, nil + case *int32: + if len(in) < 4 { + return 0, ErrBufferUnderflow + } + *v = int32(leUint32(in[:4])) + return 4, nil + case *uint32: + if len(in) < 4 { + return 0, ErrBufferUnderflow + } + *v = leUint32(in[:4]) + return 4, nil + case *int64: + if len(in) < 8 { + return 0, ErrBufferUnderflow + } + *v = int64(leUint64(in[:8])) + return 8, nil + case *uint64: + if len(in) < 8 { + return 0, ErrBufferUnderflow + } + *v = leUint64(in[:8]) + return 8, nil + default: + log.Panic("DeserializeAtomic unhandled type") + return 0, nil + } +} + +// SerializeString serializes a string to []byte +func SerializeString(s string) []byte { + v := reflect.ValueOf(s) + size := datasizeWrite(v) + buf := make([]byte, size) + e := &Encoder{ + Buffer: buf, + } + e.value(v) + return buf +} + +// DeserializeString deserializes a string from []byte, returning the string and the number of bytes read +func DeserializeString(in []byte, maxlen int) (string, uint64, error) { + var s string + v := reflect.ValueOf(&s) + v = v.Elem() + + inlen := len(in) + d1 := &Decoder{ + Buffer: make([]byte, inlen), + } + copy(d1.Buffer, in) + + err := d1.value(v, maxlen) + if err != nil { + return "", 0, err + } + + return s, uint64(inlen - len(d1.Buffer)), nil +} + +// DeserializeRaw deserializes `in` buffer into return +// parameter. If `data` is not a Pointer or Map type an error +// is returned. If `in` buffer can't be deserialized, +// an error message is returned. +// Returns number of bytes read if no error. +func DeserializeRaw(in []byte, data interface{}) (uint64, error) { + v := reflect.ValueOf(data) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + case reflect.Map: + default: + return 0, fmt.Errorf("DeserializeRaw value must be a ptr, is %s", v.Kind().String()) + } + + inlen := len(in) + d1 := &Decoder{ + Buffer: make([]byte, inlen), + } + copy(d1.Buffer, in) + + if err := d1.value(v, 0); err != nil { + return 0, err + } + + return uint64(inlen - len(d1.Buffer)), nil +} + +// DeserializeRawExact deserializes `in` buffer into return +// parameter. If `data` is not a Pointer or Map type an error +// is returned. If `in` buffer can't be deserialized, +// an error message is returned. +// Returns number of bytes read if no error. +// If the number of bytes read does not equal the length of the input buffer, +// ErrRemainingBytes is returned. +func DeserializeRawExact(in []byte, data interface{}) error { + n, err := DeserializeRaw(in, data) + if err != nil { + return err + } + if n != uint64(len(in)) { + return ErrRemainingBytes + } + return nil +} + +// DeserializeRawToValue deserializes `in` buffer into +// `dst`'s type and returns the number of bytes used and +// the value of the buffer. If `data` is not either a +// Pointer type an error is returned. +// If `in` buffer can't be deserialized, the number of bytes read and an error message are returned. +func DeserializeRawToValue(in []byte, v reflect.Value) (uint64, error) { + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + case reflect.Map: + default: + return 0, fmt.Errorf("DeserializeRawToValue value must be a ptr, is %s", v.Kind().String()) + } + + inlen := len(in) + d1 := &Decoder{ + Buffer: make([]byte, inlen), + } + copy(d1.Buffer, in) + + err := d1.value(v, 0) + if err != nil { + return 0, err + } + + return uint64(inlen - len(d1.Buffer)), nil +} + +// Serialize returns serialized basic type-based `data` +// parameter. Encoding is reflect-based. Panics if `data` is not serializable. +func Serialize(data interface{}) []byte { + v := reflect.Indirect(reflect.ValueOf(data)) + size := datasizeWrite(v) + buf := make([]byte, size) + e := &Encoder{ + Buffer: buf, + } + e.value(v) + return buf +} + +// Size returns how many bytes would it take to encode the +// value v, which must be a fixed-size value (struct) or a +// slice of fixed-size values, or a pointer to such data. +// Reflect-based encoding is used. +func Size(v interface{}) uint64 { + return datasizeWrite(reflect.Indirect(reflect.ValueOf(v))) +} + +// isEmpty returns true if a value is "empty". +// Only supports Slice, Map and String. +// All other values are never considered empty. +func isEmpty(v reflect.Value) bool { + t := v.Type() + switch t.Kind() { + case reflect.String: + return v.Len() == 0 + case reflect.Map: + return v.IsNil() || v.Len() == 0 + case reflect.Slice: + return v.IsNil() || v.Len() == 0 + default: + return false + } +} + +// datasizeWrite returns the number of bytes the actual data represented by v occupies in memory. +// For compound structures, it sums the sizes of the elements. Thus, for instance, for a slice +// it returns the length of the slice times the element size and does not count the memory +// occupied by the header. +func datasizeWrite(v reflect.Value) uint64 { + t := v.Type() + switch t.Kind() { + case reflect.Interface: + return datasizeWrite(v.Elem()) + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8, reflect.Int8: + return uint64(v.Len()) + case reflect.Uint16, reflect.Int16: + return uint64(v.Len()) * 2 + case reflect.Uint32, reflect.Int32, reflect.Float32: + return uint64(v.Len()) * 4 + case reflect.Uint64, reflect.Int64, reflect.Float64: + return uint64(v.Len()) * 8 + default: + size := uint64(0) + for i := 0; i < v.Len(); i++ { + elem := v.Index(i) + s := datasizeWrite(elem) + size += s + } + return size + } + + case reflect.Slice: + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8, reflect.Int8: + return 4 + uint64(v.Len()) + case reflect.Uint16, reflect.Int16: + return 4 + uint64(v.Len())*2 + case reflect.Uint32, reflect.Int32, reflect.Float32: + return 4 + uint64(v.Len())*4 + case reflect.Uint64, reflect.Int64, reflect.Float64: + return 4 + uint64(v.Len())*8 + default: + size := uint64(0) + for i := 0; i < v.Len(); i++ { + elem := v.Index(i) + s := datasizeWrite(elem) + size += s + } + return 4 + size + } + + case reflect.Map: + // length prefix + size := uint64(4) + for _, key := range v.MapKeys() { + s := datasizeWrite(key) + size += s + elem := v.MapIndex(key) + s = datasizeWrite(elem) + size += s + } + return size + + case reflect.Struct: + sum := uint64(0) + nFields := t.NumField() + for i, n := 0, nFields; i < n; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := TagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if !omitempty || !isEmpty(fv) { + s := datasizeWrite(fv) + sum += s + } + } + return sum + + case reflect.Bool: + return 1 + + case reflect.String: + return 4 + uint64(v.Len()) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Float32, reflect.Float64: + return uint64(t.Size()) + + default: + log.Panicf("invalid type %s", t.String()) + return 0 + } +} + +// TagOmitempty returns true if the tag specifies omitempty +func TagOmitempty(tag string) bool { + return strings.Contains(tag, ",omitempty") +} + +func tagName(tag string) string { //nolint:deadcode,megacheck + commaIndex := strings.Index(tag, ",") + if commaIndex == -1 { + return tag + } + + return tag[:commaIndex] +} + +// TagMaxLen returns the maxlen value tagged on a struct. Returns 0 if no tag is present. +func TagMaxLen(tag string) int { + maxlenIndex := strings.Index(tag, ",maxlen=") + if maxlenIndex == -1 { + return 0 + } + + maxlenRem := tag[maxlenIndex+len(",maxlen="):] + commaIndex := strings.Index(maxlenRem, ",") + if commaIndex != -1 { + maxlenRem = maxlenRem[:commaIndex] + } + + maxlen, err := strconv.Atoi(maxlenRem) + if err != nil { + panic("maxlen must be a number") + } + + return maxlen +} + +/* + Internals +*/ + +func leUint16(b []byte) uint16 { return uint16(b[0]) | uint16(b[1])<<8 } + +func lePutUint16(b []byte, v uint16) { + b[0] = byte(v) + b[1] = byte(v >> 8) +} + +func leUint32(b []byte) uint32 { + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func lePutUint32(b []byte, v uint32) { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) +} + +func leUint64(b []byte) uint64 { + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func lePutUint64(b []byte, v uint64) { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) +} + +// Decoder decodes an object from the skycoin binary encoding format +type Decoder struct { + Buffer []byte +} + +// Encoder encodes an object to the skycoin binary encoding format +type Encoder struct { + Buffer []byte +} + +// Bool decodes bool +func (d *Decoder) Bool() (bool, error) { + if len(d.Buffer) < 1 { + return false, ErrBufferUnderflow + } + x := d.Buffer[0] + d.Buffer = d.Buffer[1:] // advance slice + + switch x { + case 0: + return false, nil + case 1: + return true, nil + default: + return false, ErrInvalidBool + } +} + +// Bool encodes bool +func (e *Encoder) Bool(x bool) { + if x { + e.Buffer[0] = 1 + } else { + e.Buffer[0] = 0 + } + e.Buffer = e.Buffer[1:] +} + +// Uint8 decodes uint8 +func (d *Decoder) Uint8() (uint8, error) { + if len(d.Buffer) < 1 { + return 0, ErrBufferUnderflow + } + + x := d.Buffer[0] + d.Buffer = d.Buffer[1:] // advance slice + return x, nil +} + +// Uint8 encodes uint8 +func (e *Encoder) Uint8(x uint8) { + e.Buffer[0] = x + e.Buffer = e.Buffer[1:] +} + +// Uint16 decodes uint16 +func (d *Decoder) Uint16() (uint16, error) { + if len(d.Buffer) < 2 { + return 0, ErrBufferUnderflow + } + + x := leUint16(d.Buffer[0:2]) + d.Buffer = d.Buffer[2:] + return x, nil +} + +// Uint16 encodes uint16 +func (e *Encoder) Uint16(x uint16) { + lePutUint16(e.Buffer[0:2], x) + e.Buffer = e.Buffer[2:] +} + +// Uint32 decodes a Uint32 +func (d *Decoder) Uint32() (uint32, error) { + if len(d.Buffer) < 4 { + return 0, ErrBufferUnderflow + } + + x := leUint32(d.Buffer[0:4]) + d.Buffer = d.Buffer[4:] + return x, nil +} + +// Uint32 encodes a Uint32 +func (e *Encoder) Uint32(x uint32) { + lePutUint32(e.Buffer[0:4], x) + e.Buffer = e.Buffer[4:] +} + +// Uint64 decodes uint64 +func (d *Decoder) Uint64() (uint64, error) { + if len(d.Buffer) < 8 { + return 0, ErrBufferUnderflow + } + + x := leUint64(d.Buffer[0:8]) + d.Buffer = d.Buffer[8:] + return x, nil +} + +// Uint64 encodes uint64 +func (e *Encoder) Uint64(x uint64) { + lePutUint64(e.Buffer[0:8], x) + e.Buffer = e.Buffer[8:] +} + +// ByteSlice encodes []byte +func (e *Encoder) ByteSlice(x []byte) { + e.Uint32(uint32(len(x))) + e.CopyBytes(x) +} + +// CopyBytes copies bytes to the buffer, without a length prefix +func (e *Encoder) CopyBytes(x []byte) { + if len(x) == 0 { + return + } + copy(e.Buffer, x) + e.Buffer = e.Buffer[len(x):] +} + +// Int8 decodes int8 +func (d *Decoder) Int8() (int8, error) { + u, err := d.Uint8() + if err != nil { + return 0, err + } + + return int8(u), nil +} + +// Int8 encodes int8 +func (e *Encoder) Int8(x int8) { + e.Uint8(uint8(x)) +} + +// Int16 decodes int16 +func (d *Decoder) Int16() (int16, error) { + u, err := d.Uint16() + if err != nil { + return 0, err + } + + return int16(u), nil +} + +// Int16 encodes int16 +func (e *Encoder) Int16(x int16) { + e.Uint16(uint16(x)) +} + +// Int32 decodes int32 +func (d *Decoder) Int32() (int32, error) { + u, err := d.Uint32() + if err != nil { + return 0, err + } + + return int32(u), nil +} + +// Int32 encodes int32 +func (e *Encoder) Int32(x int32) { + e.Uint32(uint32(x)) +} + +// Int64 decodes int64 +func (d *Decoder) Int64() (int64, error) { + u, err := d.Uint64() + if err != nil { + return 0, err + } + + return int64(u), nil +} + +// Int64 encodes int64 +func (e *Encoder) Int64(x int64) { + e.Uint64(uint64(x)) +} + +func (d *Decoder) value(v reflect.Value, maxlen int) error { + kind := v.Kind() + switch kind { + case reflect.Array: + + t := v.Type() + elem := t.Elem() + + // Arrays are a fixed size, so the length is not written + length := v.Len() + + switch elem.Kind() { + case reflect.Uint8: + if length > len(d.Buffer) { + return ErrBufferUnderflow + } + + reflect.Copy(v, reflect.ValueOf(d.Buffer[:length])) + d.Buffer = d.Buffer[length:] + default: + for i := 0; i < length; i++ { + if err := d.value(v.Index(i), 0); err != nil { + return err + } + } + } + + case reflect.Map: + ul, err := d.Uint32() + if err != nil { + return err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return ErrBufferUnderflow + } + + if length == 0 { + return nil + } + + t := v.Type() + key := t.Key() + elem := t.Elem() + + if v.IsNil() { + v.Set(reflect.Indirect(reflect.MakeMap(t))) + } + + for i := 0; i < length; i++ { + keyv := reflect.Indirect(reflect.New(key)) + elemv := reflect.Indirect(reflect.New(elem)) + if err := d.value(keyv, 0); err != nil { + return err + } + if err := d.value(elemv, 0); err != nil { + return err + } + v.SetMapIndex(keyv, elemv) + } + + if v.Len() != length { + return ErrMapDuplicateKeys + } + + case reflect.Slice: + ul, err := d.Uint32() + if err != nil { + return err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return ErrBufferUnderflow + } + + if length == 0 { + return nil + } + + if maxlen > 0 && length > maxlen { + return ErrMaxLenExceeded + } + + t := v.Type() + elem := t.Elem() + + switch elem.Kind() { + case reflect.Uint8: + v.SetBytes(d.Buffer[:length]) + d.Buffer = d.Buffer[length:] + default: + elemvs := reflect.MakeSlice(t, length, length) + for i := 0; i < length; i++ { + elemv := reflect.Indirect(elemvs.Index(i)) + if err := d.value(elemv, 0); err != nil { + return err + } + } + v.Set(elemvs) + } + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := TagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if fv.CanSet() && ff.Name != "_" { + maxlen := TagMaxLen(tag) + + if err := d.value(fv, maxlen); err != nil { + if err == ErrMaxLenExceeded { + return err + } + + // omitempty fields at the end of the buffer are ignored if missing + if !omitempty || len(d.Buffer) != 0 { + return err + } + } + } + } + + case reflect.String: + ul, err := d.Uint32() + if err != nil { + return err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return ErrBufferUnderflow + } + + if maxlen > 0 && length > maxlen { + return ErrMaxLenExceeded + } + + v.SetString(string(d.Buffer[:length])) + d.Buffer = d.Buffer[length:] + + case reflect.Bool: + b, err := d.Bool() + if err != nil { + return err + } + v.SetBool(b) + case reflect.Int8: + i, err := d.Int8() + if err != nil { + return err + } + v.SetInt(int64(i)) + case reflect.Int16: + i, err := d.Int16() + if err != nil { + return err + } + v.SetInt(int64(i)) + case reflect.Int32: + i, err := d.Int32() + if err != nil { + return err + } + v.SetInt(int64(i)) + case reflect.Int64: + i, err := d.Int64() + if err != nil { + return err + } + v.SetInt(i) + + case reflect.Uint8: + u, err := d.Uint8() + if err != nil { + return err + } + v.SetUint(uint64(u)) + case reflect.Uint16: + u, err := d.Uint16() + if err != nil { + return err + } + v.SetUint(uint64(u)) + case reflect.Uint32: + u, err := d.Uint32() + if err != nil { + return err + } + v.SetUint(uint64(u)) + case reflect.Uint64: + u, err := d.Uint64() + if err != nil { + return err + } + v.SetUint(u) + + case reflect.Float32: + u, err := d.Uint32() + if err != nil { + return err + } + v.SetFloat(float64(math.Float32frombits(u))) + case reflect.Float64: + u, err := d.Uint64() + if err != nil { + return err + } + v.SetFloat(math.Float64frombits(u)) + + default: + log.Panicf("Decode error: kind %s not handled", v.Kind().String()) + } + + return nil +} + +func (e *Encoder) value(v reflect.Value) { + switch v.Kind() { + case reflect.Interface: + e.value(v.Elem()) + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8: + reflect.Copy(reflect.ValueOf(e.Buffer), v) + e.Buffer = e.Buffer[v.Len():] + default: + for i := 0; i < v.Len(); i++ { + e.value(v.Index(i)) + } + } + + case reflect.Slice: + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8: + e.ByteSlice(v.Bytes()) + default: + e.Uint32(uint32(v.Len())) + for i := 0; i < v.Len(); i++ { + e.value(v.Index(i)) + } + } + + case reflect.Map: + e.Uint32(uint32(v.Len())) + for _, key := range v.MapKeys() { + e.value(key) + e.value(v.MapIndex(key)) + } + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + // see comment for corresponding code in Decoder.value() + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := TagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if !(omitempty && isEmpty(fv)) && (fv.CanSet() || ff.Name != "_") { + e.value(fv) + } + } + + case reflect.Bool: + e.Bool(v.Bool()) + + case reflect.String: + e.ByteSlice([]byte(v.String())) + + case reflect.Int8: + e.Int8(int8(v.Int())) + case reflect.Int16: + e.Int16(int16(v.Int())) + case reflect.Int32: + e.Int32(int32(v.Int())) + case reflect.Int64: + e.Int64(v.Int()) + + case reflect.Uint8: + e.Uint8(uint8(v.Uint())) + case reflect.Uint16: + e.Uint16(uint16(v.Uint())) + case reflect.Uint32: + e.Uint32(uint32(v.Uint())) + case reflect.Uint64: + e.Uint64(v.Uint()) + + case reflect.Float32: + e.Uint32(math.Float32bits(float32(v.Float()))) + case reflect.Float64: + e.Uint64(math.Float64bits(v.Float())) + + default: + log.Panicf("Encoding unhandled type %s", v.Type().Name()) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder_test.go new file mode 100644 index 00000000..10c44694 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder_test.go @@ -0,0 +1,1463 @@ +package encoder + +import ( + "bytes" + "crypto/rand" + "encoding/hex" + "errors" + "fmt" + "io/ioutil" + "math" + "os" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +func randBytes(t *testing.T, n uint64) []byte { //nolint:unparam + const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + var bytes = make([]byte, n) + _, err := rand.Read(bytes) + require.NoError(t, err) + for i, b := range bytes { + bytes[i] = alphanum[b%byte(len(alphanum))] + } + return bytes +} + +//Size of= 13 +type TestStruct struct { + X int32 + Y int64 + Z uint8 + K []byte + W bool + T string + U cipher.PubKey +} + +type TestStruct2 struct { + X int32 + Y int64 + Z uint8 + K [8]byte + W bool +} + +type TestStructIgnore struct { + X int32 + Y int64 + Z uint8 `enc:"-"` + K []byte +} + +type TestStructWithoutIgnore struct { + X int32 + Y int64 + K []byte +} + +func Test_Encode_1(t *testing.T) { + var ts TestStruct + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + ts.K = []byte("TEST6") + ts.W = true + ts.T = "hello" + ts.U = cipher.PubKey{1, 2, 3, 0, 5, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + + b := Serialize(ts) + + var ts2 TestStruct + n, err := DeserializeRaw(b, &ts2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + b2 := Serialize(ts2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +func Test_Encode_2a(t *testing.T) { + var ts TestStruct2 + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + ts.W = false + _tt := []byte("ASDSADFSDFASDFSD") + copy(ts.K[:], _tt) + + b := Serialize(ts) + + var ts2 TestStruct2 + n, err := DeserializeRaw(b, &ts2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + b2 := Serialize(ts2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +func Test_Encode_2b(t *testing.T) { + var ts TestStruct2 + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + _tt := []byte("ASDSADFSDFASDFSD") + copy(ts.K[:], _tt) + + b := Serialize(ts) + + var ts2 TestStruct2 + n, err := DeserializeRaw(b, &ts2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + b2 := Serialize(ts2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +type TestStruct3 struct { + X int32 + K []byte +} + +func Test_Encode_3a(t *testing.T) { + var t1 TestStruct3 + t1.X = 345535 + t1.K = randBytes(t, 32) + + b := Serialize(t1) + + var t2 TestStruct3 + n, err := DeserializeRaw(b, &t2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.False(t, t1.X != t2.X || len(t1.K) != len(t2.K) || !bytes.Equal(t1.K, t2.K)) + + b2 := Serialize(t2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +func Test_Encode_3b(t *testing.T) { + var t1 TestStruct3 + t1.X = 345535 + t1.K = randBytes(t, 32) + + b := Serialize(t1) + + var t2 TestStruct3 + n, err := DeserializeRaw(b, &t2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.False(t, t1.X != t2.X || len(t1.K) != len(t2.K) || !bytes.Equal(t1.K, t2.K)) + + b2 := Serialize(t2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +type TestStruct4 struct { + X int32 + Y int32 +} + +type TestStruct5 struct { + X int32 + A []TestStruct4 +} + +func Test_Encode_4(t *testing.T) { + var t1 TestStruct5 + t1.X = 345535 + + t1.A = make([]TestStruct4, 8) + + b := Serialize(t1) + + var t2 TestStruct5 + n, err := DeserializeRaw(b, &t2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, t1.X, t2.X, "TestStruct5.X not equal") + + require.Equal(t, len(t1.A), len(t2.A), "Slice lengths not equal: %d != %d", len(t1.A), len(t2.A)) + + for i, ts := range t1.A { + require.Equal(t, ts, t2.A[i], "Slice values not equal") + } + + b2 := Serialize(t2) + + require.True(t, bytes.Equal(b, b2)) +} + +func TestDeserializeRawToValue(t *testing.T) { + var ts TestStruct2 + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + + b1 := Serialize(ts) + + var tts = reflect.TypeOf(ts) + var v = reflect.New(tts) // pointer to type tts + + n, err := DeserializeRawToValue(b1, v) + require.NoError(t, err) + require.Equal(t, uint64(len(b1)), n) + + v = reflect.Indirect(v) + require.Equal(t, int64(ts.X), v.FieldByName("X").Int()) + require.Equal(t, ts.Y, v.FieldByName("Y").Int()) + require.Equal(t, uint64(ts.Z), v.FieldByName("Z").Uint()) + + ss := []string{"foo", "bar", "baz"} + expectedLen := (4+3)*3 + 4 + extraLen := 4 + b := Serialize(ss) + require.Equal(t, expectedLen, len(b)) + + // Pad extra bytes onto the array to test that it does not change the decoding + b = append(b, make([]byte, extraLen)...) + + var ssd []string + n, err = DeserializeRawToValue(b, reflect.ValueOf(&ssd)) + require.Equal(t, uint64(expectedLen), n) + require.NoError(t, err) + + // Not a pointer + _, err = DeserializeRawToValue(b, reflect.ValueOf(ts)) + require.Equal(t, errors.New("DeserializeRawToValue value must be a ptr, is struct"), err) + + // Map is ok + m := map[string]int64{"foo": 32, "bar": 64} + b = Serialize(m) + require.NotEmpty(t, b) + + mm := map[string]int64{} + _, err = DeserializeRawToValue(b, reflect.ValueOf(mm)) + require.NoError(t, err) + require.Equal(t, m, mm) + + // Map pointer is ok + mm = map[string]int64{} + _, err = DeserializeRawToValue(b, reflect.ValueOf(&mm)) + require.NoError(t, err) + require.Equal(t, m, mm) +} + +func Test_Encode_IgnoreTagSerialize(t *testing.T) { + var ts TestStructIgnore + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + ts.K = []byte("TEST6") + + b := Serialize(ts) + + var ts2 TestStructIgnore + ts.X = 0 + ts.Y = 0 + ts.Z = 0 + ts.K = []byte("") + n, err := DeserializeRaw(b, &ts2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, uint8(0), ts2.Z, "Z should not deserialize. It is %d", ts2.Z) + + var ts3 TestStructWithoutIgnore + n, err = DeserializeRaw(b, &ts3) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + b2 := Serialize(ts2) + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +type Contained struct { + X uint32 + Y uint64 + Bytes []uint8 + Ints []uint16 +} + +type Container struct { + Elements []Contained +} + +func TestEncodeNestedSlice(t *testing.T) { + size := uint64(0) + elems := make([]Contained, 4) + for i := range elems { + elems[i].X = uint32(i) + size += 4 + elems[i].Y = uint64(i) + size += 8 + elems[i].Bytes = make([]uint8, i) + for j := range elems[i].Bytes { + elems[i].Bytes[j] = uint8(j) + } + size += 4 + uint64(i*1) + elems[i].Ints = make([]uint16, i) + for j := range elems[i].Ints { + elems[i].Ints[j] = uint16(j) + } + size += 4 + uint64(i*2) + } + c := Container{elems} + n := datasizeWrite(reflect.ValueOf(c)) + require.False(t, n != size+4, "Wrong data size") + + b := Serialize(c) + d := Container{} + n, err := DeserializeRaw(b, &d) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + for i, e := range d.Elements { + require.Equal(t, c.Elements[i].X, e.X) + require.Equal(t, c.Elements[i].Y, e.Y) + require.Equal(t, len(c.Elements[i].Bytes), len(e.Bytes)) + for j, b := range c.Elements[i].Bytes { + require.Equal(t, c.Elements[i].Bytes[j], b) + } + require.Equal(t, len(c.Elements[i].Ints), len(e.Ints)) + for j, b := range c.Elements[i].Ints { + require.Equal(t, c.Elements[i].Ints[j], b) + } + } +} + +type Array struct { + Arr []int +} + +func TestDecodeNotEnoughLength(t *testing.T) { + b := make([]byte, 2) + var d Array + _, err := DeserializeRaw(b, &d) + require.Error(t, err) + require.Equal(t, ErrBufferUnderflow, err) + + // Test with slice + thing := make([]int, 3) + _, err = DeserializeRaw(b, &thing) + require.Error(t, err) + require.Equal(t, ErrBufferUnderflow, err) +} + +func TestFlattenMultidimensionalBytes(t *testing.T) { + var data [16][16]byte + for i := 0; i < 16; i++ { + for j := 0; j < 16; j++ { + data[i][j] = byte(i * j) + } + } + + b := Serialize(data) + require.Equal(t, 16*16, len(b)) +} + +func TestMultiArrays(t *testing.T) { + var data [16][16]byte + for i := 0; i < 16; i++ { + for j := 0; j < 16; j++ { + data[i][j] = byte(i * j) + } + } + + b := Serialize(data) + + var data2 [16][16]byte + + n, err := DeserializeRaw(b, &data2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + for i := 0; i < 16; i++ { + for j := 0; j < 16; j++ { + require.Equal(t, data[i][j], data2[i][j]) + } + } + + b2 := Serialize(data2) + require.True(t, bytes.Equal(b, b2)) + + require.Equal(t, 256, len(b)) +} + +func TestDeserializeAtomic(t *testing.T) { + var sp uint64 = 0x000C8A9E1809F720 + b := SerializeAtomic(sp) + + var i uint64 + n, err := DeserializeAtomic(b, &i) + require.Equal(t, uint64(len(b)), n) + require.NoError(t, err) + require.Equal(t, sp, i) +} + +func TestSerializeDeserializeAtomic(t *testing.T) { + var di64 int64 + n, err := DeserializeAtomic(nil, &di64) + require.Equal(t, uint64(0), n) + require.Equal(t, ErrBufferUnderflow, err) + + b := false + d := SerializeAtomic(b) + var bb bool + n, err = DeserializeAtomic(d, &bb) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, b, bb) + + b = true + bb = false + d = SerializeAtomic(b) + n, err = DeserializeAtomic(d, &bb) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, b, bb) + + var byt byte = 0xE4 + d = SerializeAtomic(byt) + var bytb byte + n, err = DeserializeAtomic(d, &bytb) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, byt, bytb) + + var u8 uint8 = 0xF7 + d = SerializeAtomic(u8) + var u8b uint8 + n, err = DeserializeAtomic(d, &u8b) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, u8, u8b) + + var u16 uint16 = 0xF720 + d = SerializeAtomic(u16) + var u16b uint16 + n, err = DeserializeAtomic(d, &u16b) + require.NoError(t, err) + require.Equal(t, uint64(2), n) + require.Equal(t, u16, u16b) + + var u32 uint32 = 0x1809F720 + d = SerializeAtomic(u32) + var u32b uint32 + n, err = DeserializeAtomic(d, &u32b) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + require.Equal(t, u32, u32b) + + var u64 uint64 = 0x000C8A9E1809F720 + d = SerializeAtomic(u64) + var u64b uint64 + n, err = DeserializeAtomic(d, &u64b) + require.NoError(t, err) + require.Equal(t, uint64(8), n) + require.Equal(t, u64, u64b) + + var i8 int8 = 0x69 + d = SerializeAtomic(i8) + var i8b int8 + n, err = DeserializeAtomic(d, &i8b) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, i8, i8b) + + var i16 int16 = 0x6920 + d = SerializeAtomic(i16) + var i16b int16 + n, err = DeserializeAtomic(d, &i16b) + require.NoError(t, err) + require.Equal(t, uint64(2), n) + require.Equal(t, i16, i16b) + + var i32 int32 = 0x1809F720 + d = SerializeAtomic(i32) + var i32b int32 + n, err = DeserializeAtomic(d, &i32b) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + require.Equal(t, i32, i32b) + + var i64 int64 = 0x000C8A9E1809F720 + d = SerializeAtomic(i64) + var i64b int64 + n, err = DeserializeAtomic(d, &i64b) + require.NoError(t, err) + require.Equal(t, uint64(8), n) + require.Equal(t, i64, i64b) +} + +type TestStruct5a struct { + Test uint64 +} + +func TestSerializeAtomicPanics(t *testing.T) { + var x float32 + require.PanicsWithValue(t, "SerializeAtomic unhandled type", func() { + SerializeAtomic(x) + }) + + var tst TestStruct5a + require.PanicsWithValue(t, "SerializeAtomic unhandled type", func() { + SerializeAtomic(&tst) + }) + require.PanicsWithValue(t, "SerializeAtomic unhandled type", func() { + SerializeAtomic(tst) + }) +} + +func TestDeserializeAtomicPanics(t *testing.T) { + var y int8 + require.PanicsWithValue(t, "DeserializeAtomic unhandled type", func() { + _, _ = DeserializeAtomic(nil, y) //nolint:errcheck + }) + + var x float32 + require.PanicsWithValue(t, "DeserializeAtomic unhandled type", func() { + _, _ = DeserializeAtomic(nil, &x) //nolint:errcheck + }) + + var tst TestStruct5a + d := make([]byte, 8) + require.PanicsWithValue(t, "DeserializeAtomic unhandled type", func() { + _, _ = DeserializeAtomic(d, &tst) //nolint:errcheck + }) +} + +func TestByteArray(t *testing.T) { + tstr := "7105a46cb4c2810f0c916e0bb4b4e4ef834ad42040c471b42c96d356a9fd1b21" + + d, err := hex.DecodeString(tstr) + require.NoError(t, err) + + buf := Serialize(d) + var buff2 [32]byte + copy(buff2[0:32], buf[0:32]) + + require.Equal(t, 32, len(buff2), "incorrect serialization length for fixed sized arrays: %d byte fixed sized array serialized to %d bytes", len(d), len(buff2)) +} + +func TestEncodeDictInt2Int(t *testing.T) { + m1 := map[uint8]uint64{0: 0, 1: 1, 2: 2} + buf := Serialize(m1) + require.Equal(t, len(buf), 4+(1+8)*len(m1)) + m2 := make(map[uint8]uint64) + n, err := DeserializeRaw(buf, m2) + require.NoError(t, err) + require.Equal(t, uint64(len(buf)), n) + + require.Equal(t, len(m1), len(m2), "Expected length %d but got %d", len(m1), len(m2)) + + for key := range m1 { + require.Equal(t, m1[key], m2[key], "Expected value %d for key %d but got %d", m1[key], key, m2[key]) + } +} + +type TestStructWithDict struct { + X int32 + Y int64 + M map[uint8]TestStruct + K []byte +} + +func TestEncodeDictNested(t *testing.T) { + s1 := TestStructWithDict{ + X: 0x01234567, + Y: 0x0123456789ABCDEF, + M: map[uint8]TestStruct{ + 0x01: TestStruct{ + X: 0x01234567, + Y: 0x0123456789ABCDEF, + Z: 0x01, + K: []byte{0, 1, 2}, + W: true, + T: "ab", + U: cipher.PubKey{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + }, + }, + 0x23: TestStruct{ + X: 0x01234567, + Y: 0x0123456789ABCDEF, + Z: 0x01, + K: []byte{0, 1, 2}, + W: true, + T: "cd", + U: cipher.PubKey{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + }, + }, + }, + K: []byte{0, 1, 2, 3, 4}, + } + buf := Serialize(s1) + require.NotEmpty(t, buf) + + s2 := TestStructWithDict{} + n, err := DeserializeRaw(buf, &s2) + require.NoError(t, err) + require.Equal(t, uint64(len(buf)), n) + + require.True(t, reflect.DeepEqual(s1, s2), "Expected %v but got %v", s1, s2) +} + +func TestEncodeDictString2Int64(t *testing.T) { + v := map[string]int64{ + "foo": 1, + "bar": 2, + } + + b := Serialize(v) + + v2 := make(map[string]int64) + n, err := DeserializeRaw(b, &v2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, v, v2) +} + +func TestOmitEmptyString(t *testing.T) { + + type omitString struct { + A string `enc:"a,omitempty"` + } + + cases := []struct { + name string + input omitString + outputShouldBeEmpty bool + }{ + { + name: "string not empty", + input: omitString{ + A: "foo", + }, + }, + + { + name: "string empty", + input: omitString{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitString + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, tc.input, y) + }) + } + +} + +func TestOmitEmptySlice(t *testing.T) { + type omitSlice struct { + B []byte `enc:"b,omitempty"` + } + + cases := []struct { + name string + input omitSlice + expect *omitSlice + outputShouldBeEmpty bool + }{ + { + name: "slice not empty", + input: omitSlice{ + B: []byte("foo"), + }, + }, + + { + name: "slice nil", + input: omitSlice{}, + outputShouldBeEmpty: true, + }, + + { + name: "slice empty but not nil", + input: omitSlice{ + B: []byte{}, + }, + expect: &omitSlice{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitSlice + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + expect := tc.expect + if expect == nil { + expect = &tc.input + } + + require.Equal(t, *expect, y) + }) + } +} + +func TestOmitEmptyMap(t *testing.T) { + + type omitMap struct { + C map[string]int64 `enc:"d,omitempty"` + } + + cases := []struct { + name string + input omitMap + expect *omitMap + outputShouldBeEmpty bool + }{ + { + name: "map not empty", + input: omitMap{ + C: map[string]int64{"foo": 1}, + }, + }, + + { + name: "map nil", + input: omitMap{}, + outputShouldBeEmpty: true, + }, + + { + name: "map empty but not nil", + input: omitMap{ + C: map[string]int64{}, + }, + expect: &omitMap{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitMap + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + expect := tc.expect + if expect == nil { + expect = &tc.input + } + + require.Equal(t, *expect, y) + }) + } +} + +func TestOmitEmptyMixedFinalByte(t *testing.T) { + type omitMixed struct { + A string + B []byte `enc:",omitempty"` + } + + cases := []struct { + name string + input omitMixed + expect omitMixed + }{ + { + name: "none empty", + input: omitMixed{ + A: "foo", + B: []byte("foo"), + }, + expect: omitMixed{ + A: "foo", + B: []byte("foo"), + }, + }, + + { + name: "byte nil", + input: omitMixed{ + A: "foo", + }, + expect: omitMixed{ + A: "foo", + }, + }, + + { + name: "byte empty but not nil", + input: omitMixed{ + A: "foo", + B: []byte{}, + }, + expect: omitMixed{ + A: "foo", + }, + }, + + { + name: "first string empty but not omitted", + input: omitMixed{ + B: []byte("foo"), + }, + expect: omitMixed{ + B: []byte("foo"), + }, + }, + + { + name: "all empty", + input: omitMixed{}, + expect: omitMixed{}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + require.NotEmpty(t, b) + + var y omitMixed + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, tc.expect, y) + }) + } +} + +func TestOmitEmptyFinalFieldOnly(t *testing.T) { + type bad struct { + A string + B string `enc:",omitempty"` + C string + } + + require.Panics(t, func() { + var b bad + Serialize(b) + }) +} + +func TestTagOmitempty(t *testing.T) { + cases := []struct { + tag string + omitempty bool + }{ + { + tag: "foo,omitempty", + omitempty: true, + }, + { + tag: "omitempty", + omitempty: false, + }, + { + tag: ",omitempty", + omitempty: true, + }, + { + tag: "", + omitempty: false, + }, + { + tag: "-", + omitempty: false, + }, + } + + for _, tc := range cases { + t.Run(tc.tag, func(t *testing.T) { + omitempty := TagOmitempty(tc.tag) + require.Equal(t, tc.omitempty, omitempty) + }) + } +} + +type primitiveInts struct { + A int8 + B uint8 + C int16 + D uint16 + E int32 + F uint32 + G int64 + H uint64 +} + +func TestPrimitiveInts(t *testing.T) { + cases := []struct { + name string + c primitiveInts + }{ + { + name: "all maximums", + c: primitiveInts{ + A: math.MaxInt8, + B: math.MaxUint8, + C: math.MaxInt16, + D: math.MaxUint16, + E: math.MaxInt32, + F: math.MaxUint32, + G: math.MaxInt64, + H: math.MaxUint64, + }, + }, + { + name: "negative integers", + c: primitiveInts{ + A: -99, + C: -99, + E: -99, + G: -99, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + bytes := Serialize(tc.c) + require.NotEmpty(t, bytes) + + var obj primitiveInts + n, err := DeserializeRaw(bytes, &obj) + require.NoError(t, err) + require.Equal(t, uint64(len(bytes)), n) + require.Equal(t, tc.c, obj) + }) + } +} + +type hasEveryType struct { + A int8 + B int16 + C int32 + D int64 + E uint8 + F uint16 + G uint32 + H uint64 + I bool + J byte + K string + L []byte // slice, byte type + M []int64 // slice, non-byte type + N [3]byte // array, byte type + O [3]int64 // array, non-byte type + P struct { + A int8 + B uint16 + } // struct + Q map[string]string // map + R float32 + S float64 +} + +func TestEncodeStable(t *testing.T) { + // Tests encoding against previously encoded data on disk to verify + // that encoding results have not changed + update := false + + x := hasEveryType{ + A: -127, + B: math.MaxInt16, + C: math.MaxInt32, + D: math.MaxInt64, + E: math.MaxInt8 + 1, + F: math.MaxInt16 + 1, + G: math.MaxInt32 + 1, + H: math.MaxInt64 + 1, + I: true, + J: byte(128), + K: "foo", + L: []byte("bar"), + M: []int64{math.MaxInt64, math.MaxInt64 / 2, -10000}, + N: [3]byte{'b', 'a', 'z'}, + O: [3]int64{math.MaxInt64, math.MaxInt64 / 2, -10000}, + P: struct { + A int8 + B uint16 + }{ + A: -127, + B: math.MaxUint16, + }, + Q: map[string]string{"foo": "bar"}, + R: float32(123.45), + S: float64(123.45), + } + + goldenFile := "testdata/encode-every-type.golden" + + if update { + f, err := os.Create(goldenFile) + require.NoError(t, err) + defer f.Close() + + b := Serialize(x) + _, err = f.Write(b) + require.NoError(t, err) + return + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + d, err := ioutil.ReadAll(f) + require.NoError(t, err) + + var y hasEveryType + n, err := DeserializeRaw(d, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(d)), n) + require.Equal(t, x, y) + + b := Serialize(x) + require.Equal(t, len(d), len(b)) + require.Equal(t, d, b) +} + +func TestEncodeByteSlice(t *testing.T) { + type foo struct { + W int8 + X []byte + Y int8 // these are added to make sure extra fields don't interact with the byte encoding + } + + f := foo{ + W: 1, + X: []byte("abc"), + Y: 2, + } + + expect := []byte{1, 3, 0, 0, 0, 97, 98, 99, 2} + + b := Serialize(f) + require.Equal(t, expect, b) +} + +func TestEncodeByteArray(t *testing.T) { + type foo struct { + W int8 + X [3]byte + Y int8 // these are added to make sure extra fields don't interact with the byte encoding + } + + f := foo{ + W: 1, + X: [3]byte{'a', 'b', 'c'}, + Y: 2, + } + + expect := []byte{1, 97, 98, 99, 2} + + b := Serialize(f) + require.Equal(t, expect, b) +} + +func TestEncodeEmptySlice(t *testing.T) { + // Decoding an empty slice should not allocate + type foo struct { + X []byte + Y []int64 + } + + f := &foo{} + b := Serialize(f) + + var g foo + n, err := DeserializeRaw(b, &g) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + require.Nil(t, g.X) + require.Nil(t, g.Y) +} + +func TestRandomGarbage(t *testing.T) { + // Basic fuzz test to check for panics, deserializes random data + + // initialize the struct with data in the variable sized fields + x := hasEveryType{ + K: "string", + L: []byte("bar"), + M: []int64{math.MaxInt64, math.MaxInt64 / 2, -10000}, + Q: map[string]string{"foo": "bar", "cat": "dog"}, + } + + size := datasizeWrite(reflect.ValueOf(x)) + + var y hasEveryType + for j := 0; j < 100; j++ { + for i := uint64(0); i < size*2; i++ { + b := randBytes(t, i) + _, _ = DeserializeRaw(b, &y) //nolint:errcheck + } + } + + for i := 0; i < 10000; i++ { + b := randBytes(t, size) + _, _ = DeserializeRaw(b, &y) //nolint:errcheck + } +} + +func TestDeserializeRawBufferRemains(t *testing.T) { + x := hasEveryType{} + b := Serialize(x) + require.NotEmpty(t, b) + + b = append(b, make([]byte, 3)...) + var y hasEveryType + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.NotEmpty(t, n) + require.True(t, uint64(len(b)) > n) +} + +func TestDeserializeRawNotPointer(t *testing.T) { + x := hasEveryType{ + E: math.MaxInt8 + 1, + F: math.MaxInt16 + 1, + G: math.MaxInt32 + 1, + H: math.MaxInt64 + 1, + } + b := Serialize(x) + require.NotEmpty(t, b) + + var y hasEveryType + n, err := DeserializeRaw(b, y) + require.Equal(t, errors.New("DeserializeRaw value must be a ptr, is struct"), err) + require.Empty(t, n) + + a := []string{"foo", "bar", "baz"} + b = Serialize(a) + require.NotEmpty(t, b) + + aa := make([]string, 0) + n, err = DeserializeRaw(b, aa) + require.Equal(t, errors.New("DeserializeRaw value must be a ptr, is slice"), err) + require.Empty(t, n) + + m := map[string]int64{"foo": 32, "bar": 64} + b = Serialize(m) + require.NotEmpty(t, b) +} + +func TestDeserializeMaxLenExceeded(t *testing.T) { + // maxlen for strings + type Foo struct { + X string `enc:",maxlen=2"` + } + + b := Serialize(Foo{X: "foo"}) + require.NotEmpty(t, b) + + var f Foo + n, err := DeserializeRaw(b, &f) + require.Equal(t, ErrMaxLenExceeded, err) + require.Empty(t, n) + + g := Foo{X: "fo"} + b = Serialize(g) + require.NotEmpty(t, b) + + f = Foo{} + n, err = DeserializeRaw(b, &f) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + require.Equal(t, g, f) + + // maxlen for slices + type Bar struct { + X []string `enc:",maxlen=2"` + } + + b = Serialize(Bar{X: []string{"f", "o", "o"}}) + require.NotEmpty(t, b) + + var k Bar + n, err = DeserializeRaw(b, &k) + require.Equal(t, ErrMaxLenExceeded, err) + require.Empty(t, n) + + c := Bar{X: []string{"f", "o"}} + b = Serialize(c) + require.NotEmpty(t, b) + + k = Bar{} + n, err = DeserializeRaw(b, &k) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + require.Equal(t, c, k) + + // Invalid maxlen value panics + type Baz struct { + X string `enc:",maxlen=foo"` + } + + b = Serialize(Baz{X: "foo"}) + require.NotEmpty(t, b) + + var z Baz + require.Panics(t, func() { + _, _ = DeserializeRaw(b, &z) //nolint:errcheck + }) + + // maxlen for final omitempty byte array + type Car struct { + X string + Y []byte `enc:",omitempty,maxlen=2"` + } + + car := Car{ + X: "foo", + Y: []byte("foo"), + } + b = Serialize(car) + require.NotEmpty(t, b) + + var w Car + n, err = DeserializeRaw(b, &w) + require.Equal(t, ErrMaxLenExceeded, err) + require.Empty(t, n) + + v := Car{ + X: "foo", + Y: []byte("fo"), + } + b = Serialize(v) + require.NotEmpty(t, b) + + w = Car{} + n, err = DeserializeRaw(b, &w) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + require.Equal(t, v, w) +} + +func TestSerializeString(t *testing.T) { + cases := []struct { + s string + x []byte + }{ + { + s: "", + x: []byte{0, 0, 0, 0}, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o'}, + }, + } + + for _, tc := range cases { + t.Run(tc.s, func(t *testing.T) { + require.Equal(t, tc.x, SerializeString(tc.s)) + }) + } +} + +func TestDeserializeString(t *testing.T) { + cases := []struct { + s string + x []byte + n uint64 + maxLen int + err error + }{ + { + s: "", + x: []byte{0, 0, 0, 0}, + n: 4, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o'}, + n: 7, + }, + { + x: []byte{3, 0, 0}, + err: ErrBufferUnderflow, + }, + { + x: nil, + err: ErrBufferUnderflow, + }, + { + x: []byte{3, 0, 0, 0, 'f'}, + err: ErrBufferUnderflow, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o', 'x'}, + n: 7, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o', 'x'}, + maxLen: 2, + err: ErrMaxLenExceeded, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o', 'x'}, + maxLen: 3, + n: 7, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("s=%s err=%v", tc.s, tc.err), func(t *testing.T) { + s, n, err := DeserializeString(tc.x, tc.maxLen) + if tc.err != nil { + require.Equal(t, tc.err, err) + require.Equal(t, tc.n, n) + return + } + + require.NoError(t, err) + require.Equal(t, tc.s, s) + require.Equal(t, tc.n, n) + }) + } +} + +func TestSerializeUint32(t *testing.T) { + cases := []struct { + x uint32 + }{ + { + x: 0, + }, + { + x: 1, + }, + { + x: 0xFF, + }, + { + x: 0xFFFF, + }, + { + x: 0xFFFFFF, + }, + { + x: 0xFFFFFFFF, + }, + { + x: math.MaxUint32, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.x), func(t *testing.T) { + b := SerializeUint32(tc.x) + y, n, err := DeserializeUint32(b) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + require.Equal(t, tc.x, y) + }) + } + + _, _, err := DeserializeUint32(make([]byte, 3)) + require.Equal(t, ErrBufferUnderflow, err) + + y, n, err := DeserializeUint32([]byte{1, 0, 0, 0, 0}) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + require.Equal(t, uint32(1), y) +} + +type BoolStruct struct { + B bool +} + +func TestEncodeBool(t *testing.T) { + bt := BoolStruct{ + B: true, + } + bf := BoolStruct{ + B: false, + } + + buf := Serialize(bt) + require.Equal(t, 1, len(buf)) + require.Equal(t, byte(1), buf[0]) + + var bb BoolStruct + n, err := DeserializeRaw(buf, &bb) + require.NoError(t, err) + require.Equal(t, uint64(len(buf)), n) + require.True(t, bb.B) + + buf = Serialize(bf) + require.Equal(t, 1, len(buf)) + require.Equal(t, byte(0), buf[0]) + + require.True(t, bb.B) + n, err = DeserializeRaw(buf, &bb) + require.NoError(t, err) + require.Equal(t, uint64(len(buf)), n) + require.False(t, bb.B) + + buf = []byte{2} + n, err = DeserializeRaw(buf, &bb) + require.Equal(t, ErrInvalidBool, err) + require.Empty(t, n) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/041b1e464b2ba38e33a5351a0a1e44224d8009c3-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/041b1e464b2ba38e33a5351a0a1e44224d8009c3-6 new file mode 100644 index 00000000..e8f784e4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/041b1e464b2ba38e33a5351a0a1e44224d8009c3-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/077dc23e8eb7e862e73b328d31933197c811c649-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/077dc23e8eb7e862e73b328d31933197c811c649-15 new file mode 100644 index 00000000..9a318316 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/077dc23e8eb7e862e73b328d31933197c811c649-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/089fa205b8b7238fa0c53ff2ee37eea31cc96cf0-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/089fa205b8b7238fa0c53ff2ee37eea31cc96cf0-5 new file mode 100644 index 00000000..eef4e6b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/089fa205b8b7238fa0c53ff2ee37eea31cc96cf0-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0bcb8572beb6f78163173d22d05d0b829eeb8536-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0bcb8572beb6f78163173d22d05d0b829eeb8536-9 new file mode 100644 index 00000000..911a6ea2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0bcb8572beb6f78163173d22d05d0b829eeb8536-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0ce250a330a226ac76e02b62fe67b2a5d4453768-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0ce250a330a226ac76e02b62fe67b2a5d4453768-9 new file mode 100644 index 00000000..35b02107 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0ce250a330a226ac76e02b62fe67b2a5d4453768-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0e2c5892a020afbfb4c69e6b3fbf62611894cbd3-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0e2c5892a020afbfb4c69e6b3fbf62611894cbd3-5 new file mode 100644 index 00000000..e29da459 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0e2c5892a020afbfb4c69e6b3fbf62611894cbd3-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/136480971168a1f51c8771dca4f98ec33b45ebed-19 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/136480971168a1f51c8771dca4f98ec33b45ebed-19 new file mode 100644 index 00000000..0f911d18 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/136480971168a1f51c8771dca4f98ec33b45ebed-19 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1872c242562f8c741cb523f7a8c67d1a6cbf6114-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1872c242562f8c741cb523f7a8c67d1a6cbf6114-14 new file mode 100644 index 00000000..2a0e9ea6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1872c242562f8c741cb523f7a8c67d1a6cbf6114-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1ccc50005fac8ad75770f8c59bd85ba9f732f4f9-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1ccc50005fac8ad75770f8c59bd85ba9f732f4f9-2 new file mode 100644 index 00000000..0f7697e9 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1ccc50005fac8ad75770f8c59bd85ba9f732f4f9-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2531e551ac6da0b5a8aa9a7be236f6c28f10fc86-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2531e551ac6da0b5a8aa9a7be236f6c28f10fc86-8 new file mode 100644 index 00000000..fabd306c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2531e551ac6da0b5a8aa9a7be236f6c28f10fc86-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/26f7b389dbc8fa0cba8e06dfec8119ab38b7169e-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/26f7b389dbc8fa0cba8e06dfec8119ab38b7169e-7 new file mode 100644 index 00000000..8e048ff1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/26f7b389dbc8fa0cba8e06dfec8119ab38b7169e-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2749b52ac05c6a17cff3b18309e67797a6e4eb23-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2749b52ac05c6a17cff3b18309e67797a6e4eb23-8 new file mode 100644 index 00000000..4c4f3c47 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2749b52ac05c6a17cff3b18309e67797a6e4eb23-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/29506ec6042c7ad6d573cc04fa6f5326d72393b1-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/29506ec6042c7ad6d573cc04fa6f5326d72393b1-4 new file mode 100644 index 00000000..7a94c9af Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/29506ec6042c7ad6d573cc04fa6f5326d72393b1-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2970bf40d22e53690825af48f0c5a2d207d6dc35-10 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2970bf40d22e53690825af48f0c5a2d207d6dc35-10 new file mode 100644 index 00000000..d7ba7eeb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2970bf40d22e53690825af48f0c5a2d207d6dc35-10 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2ccb8d1be0035433d872c000bbc2939790bda364-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2ccb8d1be0035433d872c000bbc2939790bda364-8 new file mode 100644 index 00000000..09738943 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2ccb8d1be0035433d872c000bbc2939790bda364-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/32fb84cb7eaa06c2e2df5fadc878538d31fbee4d-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/32fb84cb7eaa06c2e2df5fadc878538d31fbee4d-8 new file mode 100644 index 00000000..33907755 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/32fb84cb7eaa06c2e2df5fadc878538d31fbee4d-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3336f9e174fe5c484c9db9c7e9886f42f88161c0-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3336f9e174fe5c484c9db9c7e9886f42f88161c0-6 new file mode 100644 index 00000000..684750d9 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3336f9e174fe5c484c9db9c7e9886f42f88161c0-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33af649be84c4dae0f2f55db97dd4de0a73d655e-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33af649be84c4dae0f2f55db97dd4de0a73d655e-15 new file mode 100644 index 00000000..b039f374 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33af649be84c4dae0f2f55db97dd4de0a73d655e-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33c24c3476c3f9c874372c21a171b8fbacf3bcea-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33c24c3476c3f9c874372c21a171b8fbacf3bcea-2 new file mode 100644 index 00000000..d5ec52aa Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33c24c3476c3f9c874372c21a171b8fbacf3bcea-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/35539f3efc6318e51ba224be44807d0efbb7059b-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/35539f3efc6318e51ba224be44807d0efbb7059b-7 new file mode 100644 index 00000000..dc802438 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/35539f3efc6318e51ba224be44807d0efbb7059b-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/37338dc621d742a5c9d05865df851c9e39913bba-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/37338dc621d742a5c9d05865df851c9e39913bba-6 new file mode 100644 index 00000000..7ff6b438 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/37338dc621d742a5c9d05865df851c9e39913bba-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3a51db55e30887d6f3fe57ae7e762b99f3b904d2-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3a51db55e30887d6f3fe57ae7e762b99f3b904d2-9 new file mode 100644 index 00000000..4481e38f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3a51db55e30887d6f3fe57ae7e762b99f3b904d2-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3b8fee13e7d43ef5ee563571f37558527352cc2f-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3b8fee13e7d43ef5ee563571f37558527352cc2f-9 new file mode 100644 index 00000000..38d11be2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3b8fee13e7d43ef5ee563571f37558527352cc2f-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/420b9123c6f5e27a4b70457d2896711648f32587-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/420b9123c6f5e27a4b70457d2896711648f32587-9 new file mode 100644 index 00000000..d4120772 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/420b9123c6f5e27a4b70457d2896711648f32587-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4687701f52eb1ebf05ba1c5e511f0e3d3e9ec85a-13 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4687701f52eb1ebf05ba1c5e511f0e3d3e9ec85a-13 new file mode 100644 index 00000000..cc08cc84 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4687701f52eb1ebf05ba1c5e511f0e3d3e9ec85a-13 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4e29838ae6ef4fe445ac868b22e9110a55a5e45d-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4e29838ae6ef4fe445ac868b22e9110a55a5e45d-4 new file mode 100644 index 00000000..0375ef41 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4e29838ae6ef4fe445ac868b22e9110a55a5e45d-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4f7355e86769b5de8a676a0d6eb689cff5c86a73-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4f7355e86769b5de8a676a0d6eb689cff5c86a73-8 new file mode 100644 index 00000000..320c142e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4f7355e86769b5de8a676a0d6eb689cff5c86a73-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/503360a5973eb6690b249de0dcae67234dec5ebc-18 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/503360a5973eb6690b249de0dcae67234dec5ebc-18 new file mode 100644 index 00000000..d5cdc3ee Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/503360a5973eb6690b249de0dcae67234dec5ebc-18 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/549736bf7e173f6fce9fdbd4541f9edfff6946e7-11 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/549736bf7e173f6fce9fdbd4541f9edfff6946e7-11 new file mode 100644 index 00000000..694e8774 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/549736bf7e173f6fce9fdbd4541f9edfff6946e7-11 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/56f670c79df3276598ffdf7bb96f19790f0ca91a-16 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/56f670c79df3276598ffdf7bb96f19790f0ca91a-16 new file mode 100644 index 00000000..93d3a0d2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/56f670c79df3276598ffdf7bb96f19790f0ca91a-16 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5be6cccdfa04fc4b82c64c7645ee6a674d7c4e92-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5be6cccdfa04fc4b82c64c7645ee6a674d7c4e92-5 new file mode 100644 index 00000000..a0900da0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5be6cccdfa04fc4b82c64c7645ee6a674d7c4e92-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5fac2f16b26878136ec3590108d5037e25d0670b-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5fac2f16b26878136ec3590108d5037e25d0670b-4 new file mode 100644 index 00000000..7d8558f2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5fac2f16b26878136ec3590108d5037e25d0670b-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6187cd16bd7e898a241ab9da57c48d47a9cc0c51-10 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6187cd16bd7e898a241ab9da57c48d47a9cc0c51-10 new file mode 100644 index 00000000..c5a80e39 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6187cd16bd7e898a241ab9da57c48d47a9cc0c51-10 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/64321c57e11b3301c331fb0944ce5da1b2a6da30-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/64321c57e11b3301c331fb0944ce5da1b2a6da30-7 new file mode 100644 index 00000000..27ebe25e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/64321c57e11b3301c331fb0944ce5da1b2a6da30-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/66bc94bc50bd9e1e0154f3f9159b51c3afc65a6d-17 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/66bc94bc50bd9e1e0154f3f9159b51c3afc65a6d-17 new file mode 100644 index 00000000..049a3ce6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/66bc94bc50bd9e1e0154f3f9159b51c3afc65a6d-17 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/68ae7e24181f8835ab699edb50a469edb5a7e639-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/68ae7e24181f8835ab699edb50a469edb5a7e639-1 new file mode 100644 index 00000000..a49515a5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/68ae7e24181f8835ab699edb50a469edb5a7e639-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/69a32273a7f7947656fc987a6ed63ea2f840eccc-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/69a32273a7f7947656fc987a6ed63ea2f840eccc-1 new file mode 100644 index 00000000..0221d7a2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/69a32273a7f7947656fc987a6ed63ea2f840eccc-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6c509c4d239263ccb5763cfadea9a623cc7fba78-3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6c509c4d239263ccb5763cfadea9a623cc7fba78-3 new file mode 100644 index 00000000..783ddfbe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6c509c4d239263ccb5763cfadea9a623cc7fba78-3 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6ef7698bc2ff390365fdd219ff89238427d880b0-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6ef7698bc2ff390365fdd219ff89238427d880b0-4 new file mode 100644 index 00000000..fb1ecfec Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6ef7698bc2ff390365fdd219ff89238427d880b0-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/758131515c424fa182cf4c5a3913daffeff757f9-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/758131515c424fa182cf4c5a3913daffeff757f9-15 new file mode 100644 index 00000000..eef3cc0b Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/758131515c424fa182cf4c5a3913daffeff757f9-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7a9ce113e3f8e9a032f51e42b73febfa0c88102e-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7a9ce113e3f8e9a032f51e42b73febfa0c88102e-7 new file mode 100644 index 00000000..b8535fb6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7a9ce113e3f8e9a032f51e42b73febfa0c88102e-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7e084c67224f01361d2ebbe58842ec7c0374e687-11 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7e084c67224f01361d2ebbe58842ec7c0374e687-11 new file mode 100644 index 00000000..094ed574 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7e084c67224f01361d2ebbe58842ec7c0374e687-11 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/80264feff826888953082aa7e15c0ac885f9e599-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/80264feff826888953082aa7e15c0ac885f9e599-14 new file mode 100644 index 00000000..958026c0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/80264feff826888953082aa7e15c0ac885f9e599-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/860ce68c0e8febf9c801982f06471d4382198983-20 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/860ce68c0e8febf9c801982f06471d4382198983-20 new file mode 100644 index 00000000..7034a9ca Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/860ce68c0e8febf9c801982f06471d4382198983-20 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8a68666cb26cbc69b5e00716d6ff155b340c058c-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8a68666cb26cbc69b5e00716d6ff155b340c058c-4 new file mode 100644 index 00000000..7f1f07c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8a68666cb26cbc69b5e00716d6ff155b340c058c-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8caf69f543d97113462f8b4c5f036e06bb9b672f-17 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8caf69f543d97113462f8b4c5f036e06bb9b672f-17 new file mode 100644 index 00000000..c4f92a6a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8caf69f543d97113462f8b4c5f036e06bb9b672f-17 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473 new file mode 100644 index 00000000..593f4708 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9449700da8e8e406ff4c6c4db21ed97e251db2a5-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9449700da8e8e406ff4c6c4db21ed97e251db2a5-2 new file mode 100644 index 00000000..9f9b6705 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9449700da8e8e406ff4c6c4db21ed97e251db2a5-2 @@ -0,0 +1 @@ +^A¡é \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/95514c598a7891b09f368766d1533d7e66113639-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/95514c598a7891b09f368766d1533d7e66113639-9 new file mode 100644 index 00000000..4523681b Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/95514c598a7891b09f368766d1533d7e66113639-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9904b7300bd20f370a99fb47411a7aa0a4fc0745-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9904b7300bd20f370a99fb47411a7aa0a4fc0745-7 new file mode 100644 index 00000000..6d4c904f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9904b7300bd20f370a99fb47411a7aa0a4fc0745-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9d4cf58e90324733edca6e1b934e35f73d1ebea6-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9d4cf58e90324733edca6e1b934e35f73d1ebea6-15 new file mode 100644 index 00000000..c19b60f1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9d4cf58e90324733edca6e1b934e35f73d1ebea6-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9de6f2bbd4635419b74ed98081097765b68982fe-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9de6f2bbd4635419b74ed98081097765b68982fe-1 new file mode 100644 index 00000000..0073e64b Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9de6f2bbd4635419b74ed98081097765b68982fe-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a06c8725aa396d2dee53394f1f1a07cfae073a56-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a06c8725aa396d2dee53394f1f1a07cfae073a56-7 new file mode 100644 index 00000000..f63b214b Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a06c8725aa396d2dee53394f1f1a07cfae073a56-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1133dacbc19a4b3f59434944387897107e5ab09-17 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1133dacbc19a4b3f59434944387897107e5ab09-17 new file mode 100644 index 00000000..2dbdcf14 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1133dacbc19a4b3f59434944387897107e5ab09-17 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a14e6c14df85b1a05934e56f9dbb8adc194cf726-3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a14e6c14df85b1a05934e56f9dbb8adc194cf726-3 new file mode 100644 index 00000000..6953a7d0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a14e6c14df85b1a05934e56f9dbb8adc194cf726-3 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1c39fcf65469e76790a0e15bf52ae8b44567f5c-12 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1c39fcf65469e76790a0e15bf52ae8b44567f5c-12 new file mode 100644 index 00000000..7ed6e302 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1c39fcf65469e76790a0e15bf52ae8b44567f5c-12 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a2accc510a183328ff269a3487e16ce54714ed9f-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a2accc510a183328ff269a3487e16ce54714ed9f-6 new file mode 100644 index 00000000..6aedc9df Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a2accc510a183328ff269a3487e16ce54714ed9f-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a9935fff6d379203b62e011d39c85c69ab90bc25-13 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a9935fff6d379203b62e011d39c85c69ab90bc25-13 new file mode 100644 index 00000000..684cc050 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a9935fff6d379203b62e011d39c85c69ab90bc25-13 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/abe8937a39c3413fda2387eb5356a0b9eaf4ea7b-13 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/abe8937a39c3413fda2387eb5356a0b9eaf4ea7b-13 new file mode 100644 index 00000000..b45e6627 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/abe8937a39c3413fda2387eb5356a0b9eaf4ea7b-13 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/aef89a58363b964551a5f544be9c804e3fd53bd5-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/aef89a58363b964551a5f544be9c804e3fd53bd5-6 new file mode 100644 index 00000000..bb5c4597 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/aef89a58363b964551a5f544be9c804e3fd53bd5-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b041a0b90d9bc8c74a1cd879d336bb8204d10efc-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b041a0b90d9bc8c74a1cd879d336bb8204d10efc-14 new file mode 100644 index 00000000..80e75820 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b041a0b90d9bc8c74a1cd879d336bb8204d10efc-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b1b97c4860bd6b45e2a168e27018032a6327126f-13 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b1b97c4860bd6b45e2a168e27018032a6327126f-13 new file mode 100644 index 00000000..85ef4c70 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b1b97c4860bd6b45e2a168e27018032a6327126f-13 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/bf4b7e1d763d79835646d84b3e06b09be39fd40e-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/bf4b7e1d763d79835646d84b3e06b09be39fd40e-4 new file mode 100644 index 00000000..4726ba6a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/bf4b7e1d763d79835646d84b3e06b09be39fd40e-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c03f33b370fee562858b596818280c41f03fbe9a-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c03f33b370fee562858b596818280c41f03fbe9a-1 new file mode 100644 index 00000000..fd52921f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c03f33b370fee562858b596818280c41f03fbe9a-1 @@ -0,0 +1 @@ +^A¡éw»‘õª[q \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c52fe64291e1edc6709766b184bc55b4ae5c3bf5-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c52fe64291e1edc6709766b184bc55b4ae5c3bf5-1 new file mode 100644 index 00000000..92c09b6f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c52fe64291e1edc6709766b184bc55b4ae5c3bf5-1 @@ -0,0 +1 @@ +J:;© \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/caf902d1a7d48dc4474b888739e8ebf6bb4e4d21-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/caf902d1a7d48dc4474b888739e8ebf6bb4e4d21-8 new file mode 100644 index 00000000..d50f2cd0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/caf902d1a7d48dc4474b888739e8ebf6bb4e4d21-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/cf886c5afb98cd7ca1a40b2abdc7875aa84b231d-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/cf886c5afb98cd7ca1a40b2abdc7875aa84b231d-9 new file mode 100644 index 00000000..821d7d75 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/cf886c5afb98cd7ca1a40b2abdc7875aa84b231d-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d1d44dee03fb91be62e28827941afc04cb268057-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d1d44dee03fb91be62e28827941afc04cb268057-8 new file mode 100644 index 00000000..23bf7043 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d1d44dee03fb91be62e28827941afc04cb268057-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d71a8731a29c71e5ef7bcd09c0731cfcea3b0195-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d71a8731a29c71e5ef7bcd09c0731cfcea3b0195-9 new file mode 100644 index 00000000..c3be57c8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d71a8731a29c71e5ef7bcd09c0731cfcea3b0195-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d7bd05d8b31190fb1beea885eb5766671cb5189a-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d7bd05d8b31190fb1beea885eb5766671cb5189a-2 new file mode 100644 index 00000000..f3acdb76 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d7bd05d8b31190fb1beea885eb5766671cb5189a-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709 new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da6d6d7bd15a8a5eb93bdc25d79239aed62c2a89-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da6d6d7bd15a8a5eb93bdc25d79239aed62c2a89-14 new file mode 100644 index 00000000..afb52fff Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da6d6d7bd15a8a5eb93bdc25d79239aed62c2a89-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e1023efdabed24a21bbee19f16d38b849462102d-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e1023efdabed24a21bbee19f16d38b849462102d-14 new file mode 100644 index 00000000..7611e555 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e1023efdabed24a21bbee19f16d38b849462102d-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e3e1ce0d82369c7c4d77b97bbb36adb219301aaa-11 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e3e1ce0d82369c7c4d77b97bbb36adb219301aaa-11 new file mode 100644 index 00000000..d90bee4a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e3e1ce0d82369c7c4d77b97bbb36adb219301aaa-11 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e8a40e28e25690d4a7845adb423069822d20d9bf-11 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e8a40e28e25690d4a7845adb423069822d20d9bf-11 new file mode 100644 index 00000000..9bdb13b1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e8a40e28e25690d4a7845adb423069822d20d9bf-11 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ead0c77c531dc48ef7cb0e40ed5994b44bdd8351-18 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ead0c77c531dc48ef7cb0e40ed5994b44bdd8351-18 new file mode 100644 index 00000000..4e396484 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ead0c77c531dc48ef7cb0e40ed5994b44bdd8351-18 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ebfcdfbcdaa26064949184656376fb0e677dcece-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ebfcdfbcdaa26064949184656376fb0e677dcece-6 new file mode 100644 index 00000000..60d6f231 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ebfcdfbcdaa26064949184656376fb0e677dcece-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f3fb81782fdc71e47477802945ee2b84e0faaa20-12 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f3fb81782fdc71e47477802945ee2b84e0faaa20-12 new file mode 100644 index 00000000..a672d01a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f3fb81782fdc71e47477802945ee2b84e0faaa20-12 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f68374cd8433a09a006c2d80655691171a5141c9-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f68374cd8433a09a006c2d80655691171a5141c9-15 new file mode 100644 index 00000000..09a899cc Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f68374cd8433a09a006c2d80655691171a5141c9-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f793d6352b6d0d92c21660b6ff5c39bd628abad8-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f793d6352b6d0d92c21660b6ff5c39bd628abad8-5 new file mode 100644 index 00000000..a691c22c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f793d6352b6d0d92c21660b6ff5c39bd628abad8-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f7e04d0cfa0a3d927efc18ae1e7a1f73abb337cc-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f7e04d0cfa0a3d927efc18ae1e7a1f73abb337cc-7 new file mode 100644 index 00000000..e5658522 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f7e04d0cfa0a3d927efc18ae1e7a1f73abb337cc-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f82afcaf7653e5248862ce80ca989b2b2bceafe6-16 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f82afcaf7653e5248862ce80ca989b2b2bceafe6-16 new file mode 100644 index 00000000..f657eaed Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f82afcaf7653e5248862ce80ca989b2b2bceafe6-16 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fa57b5d7162c57a67c550c57e8d7ff4d2502f9ad-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fa57b5d7162c57a67c550c57e8d7ff4d2502f9ad-15 new file mode 100644 index 00000000..a141224c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fa57b5d7162c57a67c550c57e8d7ff4d2502f9ad-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fb348445b6108e2ae34d45d161e19de632a3ef8a-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fb348445b6108e2ae34d45d161e19de632a3ef8a-9 new file mode 100644 index 00000000..7156c278 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fb348445b6108e2ae34d45d161e19de632a3ef8a-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fcf3b78f943921415f4dfa801a1ac48d7a0b896f-12 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fcf3b78f943921415f4dfa801a1ac48d7a0b896f-12 new file mode 100644 index 00000000..29f88bd4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fcf3b78f943921415f4dfa801a1ac48d7a0b896f-12 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fe4236573e1ab50aa1ce65ac96905533eb03e0d2-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fe4236573e1ab50aa1ce65ac96905533eb03e0d2-5 new file mode 100644 index 00000000..bdb7574a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fe4236573e1ab50aa1ce65ac96905533eb03e0d2-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ffc89ebf75eda9a93566a2227bded8b2c23971b0-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ffc89ebf75eda9a93566a2227bded8b2c23971b0-4 new file mode 100644 index 00000000..eed51ae8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ffc89ebf75eda9a93566a2227bded8b2c23971b0-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing.serialized b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing.serialized new file mode 100644 index 00000000..967da0b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing.serialized differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing2.serialized b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing2.serialized new file mode 100644 index 00000000..28a052e6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing2.serialized differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing3.serialized b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing3.serialized new file mode 100644 index 00000000..f6ea45fd Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing3.serialized differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/encoderfuzz.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/encoderfuzz.go new file mode 100644 index 00000000..3bd6c7c5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/encoderfuzz.go @@ -0,0 +1,94 @@ +package encoderfuzz + +import ( + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// To use the fuzzer: +// Follow the install instructions from https://github.com/dvyukov/go-fuzz +// Then, from the repo root, +// $ go-fuzz-build github.com/SkycoinProject/skycoin/src/cipher/encoder/internal +// This creates a file encoderfuzz-fuzz.zip +// Then, +// $ go-fuzz -bin=encoderfuzz-fuzz.zip -workdir=src/cipher/encoder/internal +// New corpus and crash objects will be put in src/cipher/encoder/internal + +type thing struct { + X uint8 `enc:"-"` + A int8 + B uint32 + T innerThing + M map[uint64]int64 + F uint16 + G int16 + H []innerThing + Z []byte `enc:",omitempty"` +} + +type innerThing struct { + A [2]byte + C string `enc:",maxlen=128"` +} + +// Fuzz is the entrypoint for go-fuzz +func Fuzz(b []byte) int { + buf := encoder.SerializeString(string(b)) + if buf == nil { + panic("SerializeString buf == nil") + } + + s, x, errA := encoder.DeserializeString(b, 8) + if errA == nil { + if x != uint64(len(s)+4) { + panic(fmt.Sprintf("DeserializeString x != len(s) + 4 (%d = %d, %q)", x, len(s)+4, s)) + } + } + + var v uint32 + n, errB := encoder.DeserializeAtomic(b, &v) + if errB == nil { + if n != 4 { + panic("DeserializeAtomic uint32 n bytes read is not 4") + } + } + + var t thing + errC := encoder.DeserializeRawExact(b, &t) + + if errA == nil || errB == nil || errC == nil { + return 1 + } + + return 0 +} + +// Uncomment and change package name to "main", then "go run" this to write a serialized "thing" +// func main() { +// x := thing{ +// A: 12, +// B: 0xFF33AA01, +// T: innerThing{ +// A: [2]byte{0x40, 0xF7}, +// C: "foo", +// }, +// // M: map[uint64]int64{0x00FF134444: -1234567}, +// F: 0xAA11, +// G: -1000, +// H: []innerThing{{ +// A: [2]byte{0x01, 0x02}, +// C: "", +// }}, +// } + +// byt := encoder.Serialize(x) + +// f, err := os.Create("thing3.serialized") +// if err != nil { +// panic(err) +// } +// defer f.Close() + +// f.Write(byt) +// } diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/testdata/encode-every-type.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/testdata/encode-every-type.golden new file mode 100644 index 00000000..46f83bdb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/testdata/encode-every-type.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go new file mode 100644 index 00000000..d594d899 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go @@ -0,0 +1,171 @@ +/* +Package encrypt provides encryption methods. + +Encryption methods provided: + +* chacha20-poly1305 with scrypt key derivation +* sha256xor with sha256 key derivation + +The latter is insecure due to the insecure key derivation so should not be used. +The keys are easily brute forced. + +These methods are design for long-term (3-5 years) encryption of disk-persisted data. +They are not designed for network traffic encryption. +*/ +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "encoding/json" + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305" + "github.com/SkycoinProject/skycoin/src/cipher/scrypt" +) + +const ( + scryptChacha20MetaLengthSize = 2 // meta data length field size in bytes + scryptChacha20SaltSize = 32 // salt bytes number +) + +// Default scrypt paramenters +const ( + // ScryptN: scrypt N paramenter. 1<<20 is the recommended value for file encryption, it takes about 3 seconds in 2.9 GHz Intel core i7. + ScryptN = 1 << 20 + // ScryptR: scrypt r paramenter. Cache line size have not significantly increased since 2009, 8 should still be optimal for r. + ScryptR = 8 + // ScryptP: scrypt p paramenter. The parallel difficulty, 1 is still optimal. + ScryptP = 1 + // ScryptKeyLen: The length of returned byte slice that can be used as cryptographic key. + ScryptKeyLen = 32 +) + +// DefaultScryptChacha20poly1305 default ScryptChacha20poly1305 encryptor +var DefaultScryptChacha20poly1305 = ScryptChacha20poly1305{ + N: ScryptN, + R: ScryptR, + P: ScryptP, + KeyLen: ScryptKeyLen, +} + +// ScryptChacha20poly1305 provides methods for encryption/decryption with scrypt and chacha20poly1305 +type ScryptChacha20poly1305 struct { + N int + R int + P int + KeyLen int +} + +type meta struct { + N int `json:"n"` + R int `json:"r"` + P int `json:"p"` + KeyLen int `json:"keyLen"` + Salt []byte `json:"salt"` + Nonce []byte `json:"nonce"` +} + +// Encrypt encrypts data with password, +// 1. Scrypt derives the key from password +// 2. Chacha20poly1305 generates AEAD from the derived key +// 4. Puts scrypt paramenters, salt and nonce into metadata, json serialize it and get the serialized metadata length +// 5. AEAD.Seal encrypts the data, and use [length][metadata] as additional data +// 6. Final format: base64([[length][metadata]][ciphertext]), length is 2 bytes. +func (s ScryptChacha20poly1305) Encrypt(data, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + // Scyrpt derives key from password + salt := cipher.RandByte(scryptChacha20SaltSize) + dk, err := scrypt.Key(password, salt, s.N, s.R, s.P, s.KeyLen) + if err != nil { + return nil, err + } + + // Prepare metadata + m := meta{ + N: s.N, + R: s.R, + P: s.P, + KeyLen: s.KeyLen, + Salt: salt, + Nonce: cipher.RandByte(chacha20poly1305.NonceSize), + } + // json serialize the metadata + ms, err := json.Marshal(m) + if err != nil { + return nil, err + } + + if len(ms) > math.MaxUint16 { + return nil, errors.New("metadata length beyond the math.MaxUint16") + } + + length := make([]byte, scryptChacha20MetaLengthSize) + binary.LittleEndian.PutUint16(length, uint16(len(ms))) + + // Additional data for AEAD + ad := append(length, ms...) + aead, err := chacha20poly1305.New(dk) + if err != nil { + return nil, err + } + + ciphertext := aead.Seal(nil, m.Nonce, data, ad) + + // Base64 encode the [[length][metadata]][ciphertext] + rawData := append(ad, ciphertext...) + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(rawData))) + enc.Encode(buf, rawData) + return buf, nil +} + +// Decrypt decrypts the data with password +// 1. Base64 decodes the data +// 2. Reads the first [metaLengthSize] bytes data to get the metadata length, and reads out the metadata. +// 3. Scrypt derives key from password and paramenters in metadata +// 4. Chacha20poly1305 geneates AEAD +// 5. AEAD decrypts ciphertext with nonce in metadata and [length][metadata] as additional data. +func (s ScryptChacha20poly1305) Decrypt(data, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + enc := base64.StdEncoding + encData := make([]byte, enc.DecodedLen(len(data))) + n, err := enc.Decode(encData, data) + if err != nil { + return nil, err + } + encData = encData[:n] + + length := binary.LittleEndian.Uint16(encData[:scryptChacha20MetaLengthSize]) + if int(scryptChacha20MetaLengthSize+length) > len(encData) { + return nil, errors.New("invalid metadata length") + } + + var m meta + if err := json.Unmarshal(encData[scryptChacha20MetaLengthSize:scryptChacha20MetaLengthSize+length], &m); err != nil { + return nil, err + } + + ad := encData[:scryptChacha20MetaLengthSize+length] + // Scrypt derives key + dk, err := scrypt.Key(password, m.Salt, m.N, m.R, m.P, m.KeyLen) + if err != nil { + return nil, err + } + + // Geneates AEAD + aead, err := chacha20poly1305.New(dk) + if err != nil { + return nil, err + } + + return aead.Open(nil, m.Nonce, encData[scryptChacha20MetaLengthSize+length:], ad) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305_test.go new file mode 100644 index 00000000..8737da2f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305_test.go @@ -0,0 +1,85 @@ +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestScryptChacha20poly1305Encrypt(t *testing.T) { + for i := uint(1); i < 20; i++ { + name := fmt.Sprintf("N=1<<%v r=%v p=%v keyLen=%v", i, 8, 1, 32) + t.Run(name, func(t *testing.T) { + crypto := ScryptChacha20poly1305{N: 1 << i, R: 8, P: 1, KeyLen: 32} + encData, err := crypto.Encrypt([]byte("plaintext"), []byte("password")) + require.NoError(t, err) + + data, err := base64.StdEncoding.DecodeString(string(encData)) + require.NoError(t, err) + // Checks the prefix + ml := binary.LittleEndian.Uint16(data[:scryptChacha20MetaLengthSize]) + require.True(t, int(scryptChacha20MetaLengthSize+ml) <= len(data)) + var m meta + require.NoError(t, json.Unmarshal(data[scryptChacha20MetaLengthSize:scryptChacha20MetaLengthSize+ml], &m)) + require.Equal(t, m.N, 1< Add 32 bits length prefix to indicate the length of data. +// 2> Pad the length + data to 32 bytes with nulls at end +// 2> SHA256() and prefix the hash. +// 3> Split the whole data(hash+length+data+padding) into 256 bits(32 bytes) blocks +// 4> Each block is encrypted by XORing the unencrypted block with SHA256(SHA256(password), SHA256(index, SHA256(nonce)) +// - index is 0 for the first block of 32 bytes, 1 for the second block of 32 bytes, 2 for third block +// 5> Prefix nonce and SHA256 the nonce with blocks to get checksum, and prefix the checksum +// 6> Finally, the data format is: base64() +func (s Sha256Xor) Encrypt(data []byte, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, ErrMissingPassword + } + + if uint(len(data)) > math.MaxUint32 { + return nil, ErrDataTooLarge + } + + // Sets data length prefix + dataLenBytes := make([]byte, sha256XorDataLengthSize) + binary.LittleEndian.PutUint32(dataLenBytes, uint32(len(data))) + + // Prefixes data with length + ldata := append(dataLenBytes, data...) + + // Pads length + data with null to 32 bytes + l := len(ldata) // hash + length + data + n := l / sha256XorBlockSize + m := l % sha256XorBlockSize + if m > 0 { + paddingNull := make([]byte, sha256XorBlockSize-m) + ldata = append(ldata, paddingNull...) + n++ + } + + // Hash(length+data+padding) + dataHash := cipher.SumSHA256(ldata) + + // Initialize blocks with data hash + blocks := []cipher.SHA256{dataHash} + for i := 0; i < n; i++ { + var b cipher.SHA256 + copy(b[:], ldata[i*sha256XorBlockSize:(i+1)*sha256XorBlockSize]) + blocks = append(blocks, b) + } + + // Generates a nonce + nonce := cipher.RandByte(sha256XorNonceSize) + // Hash the nonce + hashNonce := cipher.SumSHA256(nonce) + // Derives key by secp256k1 hashing password + key := secp256k1.Secp256k1Hash(password) + + var encryptedData []byte + // Encodes the blocks + for i := range blocks { + // Hash(password, hash(index, hash(nonce))) + h := hashKeyIndexNonce(key, int64(i), hashNonce) + encryptedHash := blocks[i].Xor(h) + encryptedData = append(encryptedData, encryptedHash[:]...) + } + + // Prefix the nonce + nonceAndDataBytes := append(nonce, encryptedData...) + // Calculates the checksum + checkSum := cipher.SumSHA256(nonceAndDataBytes) + + finalData := append(checkSum[:], nonceAndDataBytes...) + + // Base64 encodes the data + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(finalData))) + enc.Encode(buf, finalData) + return buf, nil +} + +// Decrypt decrypts the data +func (s Sha256Xor) Decrypt(data []byte, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, ErrMissingPassword + } + + // Base64 decodes data + enc := base64.StdEncoding + encData := make([]byte, enc.DecodedLen(len(data))) + n, err := enc.Decode(encData, data) + if err != nil { + return nil, err + } + + encData = encData[:n] + + // Derives key by secp256k1 hashing password + key := secp256k1.Secp256k1Hash(password) + + buf := bytes.NewBuffer(encData) + + // Gets checksum + var checkSum cipher.SHA256 + n, err = buf.Read(checkSum[:]) + if err != nil { + return nil, err + } + + if n != sha256XorChecksumSize { + return nil, ErrInvalidChecksumLength + } + + // Checks the checksum + csh := cipher.SumSHA256(buf.Bytes()) + if csh != checkSum { + return nil, ErrInvalidChecksum + } + + // Gets the nonce + nonce := make([]byte, sha256XorNonceSize) + n, err = buf.Read(nonce) + if err != nil { + return nil, err + } + + if n != sha256XorNonceSize { + return nil, ErrInvalidNonceLength + } + + var decodeData []byte + hashNonce := cipher.SumSHA256(nonce) + i := 0 + for { + var block cipher.SHA256 + n, err := buf.Read(block[:]) + if err == io.EOF { + break + } + + if n != sha256XorBlockSize { + return nil, ErrInvalidBlockSize + } + + // Decodes the block + dataHash := block.Xor(hashKeyIndexNonce(key, int64(i), hashNonce)) + decodeData = append(decodeData, dataHash[:]...) + i++ + } + + buf = bytes.NewBuffer(decodeData) + + // Gets the hash + var dataHash cipher.SHA256 + n, err = buf.Read(dataHash[:]) + if err != nil { + return nil, fmt.Errorf("read data hash failed: %v", err) + } + + if n != 32 { + return nil, ErrReadDataHashFailed + } + + // Checks the hash + if dataHash != cipher.SumSHA256(buf.Bytes()) { + return nil, ErrInvalidPassword + } + + // Reads out the data length + dataLenBytes := make([]byte, sha256XorDataLengthSize) + n, err = buf.Read(dataLenBytes) + if err != nil { + return nil, err + } + + if n != sha256XorDataLengthSize { + return nil, ErrReadDataLengthFailed + } + + l := binary.LittleEndian.Uint32(dataLenBytes) + + if uint64(buf.Len()) > math.MaxUint32 { + return nil, ErrDataTooLarge + } + + if l > uint32(buf.Len()) { + return nil, ErrInvalidDataLength + } + + // Reads out the raw data + rawData := make([]byte, l) + n, err = buf.Read(rawData) + if err != nil { + return nil, err + } + + if uint32(n) != l { + return nil, fmt.Errorf("read data failed, expect %d bytes, but get %d bytes", l, n) + } + + return rawData, nil +} + +// hash(password, hash(index, hash(nonce))) +func hashKeyIndexNonce(key []byte, index int64, nonceHash cipher.SHA256) cipher.SHA256 { + // convert index to 256bit number + indexBytes := make([]byte, 32) + binary.PutVarint(indexBytes, index) + + // hash(index, nonceHash) + indexNonceHash := cipher.SumSHA256(append(indexBytes, nonceHash[:]...)) + + // hash(hash(password), indexNonceHash) + var keyHash cipher.SHA256 + copy(keyHash[:], key[:]) + return cipher.AddSHA256(keyHash, indexNonceHash) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/sha256xor_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/sha256xor_test.go new file mode 100644 index 00000000..12efa05c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/sha256xor_test.go @@ -0,0 +1,248 @@ +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestEncrypt(t *testing.T) { + tt := []struct { + name string + data []byte + password []byte + err error + }{ + { + "data length=1 password is empty=true", + testutil.RandBytes(t, 1), + nil, + errors.New("missing password"), + }, + { + "data length=1 password is empty=false", + testutil.RandBytes(t, 1), + []byte("key"), + nil, + }, + { + "data length<32 password is empty=false", + testutil.RandBytes(t, 2), + []byte("pwd"), + nil, + }, + { + "data length=32 password is empty=false", + testutil.RandBytes(t, 32), + []byte("pwd"), + nil, + }, + { + "data length=2*32 password is empty=false", + testutil.RandBytes(t, 64), + []byte("9JMkCPphe73NQvGhmab"), + nil, + }, + { + "data length>2*32 password is empty=false", + testutil.RandBytes(t, 65), + []byte("9JMkCPphe73NQvGhmab"), + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + edata, err := Sha256Xor{}.Encrypt(tc.data, tc.password) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + n := (sha256XorDataLengthSize + len(tc.data)) / sha256XorBlockSize + m := (sha256XorDataLengthSize + len(tc.data)) % sha256XorBlockSize + if m > 0 { + n++ + } + + rdata, err := base64.StdEncoding.DecodeString(string(edata)) + require.NoError(t, err) + + totalEncryptedDataLen := sha256XorChecksumSize + sha256XorNonceSize + 32 + n*sha256XorBlockSize // 32 is the hash data length + require.Equal(t, totalEncryptedDataLen, len(rdata)) + var checksum cipher.SHA256 + copy(checksum[:], rdata[:sha256XorChecksumSize]) + require.Equal(t, checksum, cipher.SumSHA256(rdata[sha256XorChecksumSize:])) + }) + } + + // test data of length range in 32 to 64, for testing the 32 bytes padding. + pwd := []byte("pwd") + for i := 33; i <= 64; i++ { + name := fmt.Sprintf("data length=%d password is empty=false", i) + t.Run(name, func(t *testing.T) { + data := testutil.RandBytes(t, i) + edata, err := Sha256Xor{}.Encrypt(data, pwd) + require.NoError(t, err) + + n := (sha256XorDataLengthSize + len(data)) / sha256XorBlockSize + m := (sha256XorDataLengthSize + len(data)) % sha256XorBlockSize + if m > 0 { + n++ + } + + rdata, err := base64.StdEncoding.DecodeString(string(edata)) + require.NoError(t, err) + + totalEncryptedDataLen := sha256XorChecksumSize + sha256XorNonceSize + 32 + n*sha256XorBlockSize // 32 is the hash data length + require.Equal(t, totalEncryptedDataLen, len(rdata)) + var checksum cipher.SHA256 + copy(checksum[:], rdata[:sha256XorChecksumSize]) + require.Equal(t, checksum, cipher.SumSHA256(rdata[sha256XorChecksumSize:])) + }) + } +} + +func TestDecrypt(t *testing.T) { + data := testutil.RandBytes(t, 32) + tt := []struct { + name string + encryptedData func() []byte // encrypted data + password []byte + err error + }{ + { + "invalid data length", + func() []byte { + return makeEncryptedData(t, data, 65, []byte("pwd")) + }, + []byte("pwd"), + errors.New("invalid data length"), + }, + { + "invalid checksum", + func() []byte { + edata := makeEncryptedData(t, data, 32, []byte("pwd")) + // Changes the encrypted data, so that the checksum could not match + rd, err := base64.StdEncoding.DecodeString(string(edata)) + require.NoError(t, err) + rd[len(rd)-1]++ + return []byte(base64.StdEncoding.EncodeToString(rd)) + }, + []byte("pwd"), + errors.New("invalid data, checksum is not matched"), + }, + { + "empty password", + func() []byte { + return makeEncryptedData(t, data, 32, []byte("pwd")) + }, + []byte(""), + errors.New("missing password"), + }, + { + "nil password", + func() []byte { + return makeEncryptedData(t, data, 32, []byte("pwd")) + }, + nil, + errors.New("missing password"), + }, + { + "invalid password", + func() []byte { + return makeEncryptedData(t, data, 32, []byte("pwd")) + }, + []byte("wrong password"), + errors.New("invalid password"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + edata := tc.encryptedData() + d, err := Sha256Xor{}.Decrypt(edata, tc.password) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.Equal(t, d, data) + }) + } + + // test data of length in range of 0 to 64 + for i := 0; i <= 64; i++ { + name := fmt.Sprintf("data length=%d", i) + t.Run(name, func(t *testing.T) { + data := testutil.RandBytes(t, i) + edata := makeEncryptedData(t, data, uint32(len(data)), []byte("pwd")) + d, err := Sha256Xor{}.Decrypt(edata, []byte("pwd")) + require.NoError(t, err) + require.Equal(t, data, d) + }) + } +} + +// encrypts data, manually set the data length, so we could test invalid data length cases. +func makeEncryptedData(t *testing.T, data []byte, dataLength uint32, password []byte) []byte { + dataLenBytes := make([]byte, sha256XorDataLengthSize) + binary.LittleEndian.PutUint32(dataLenBytes, dataLength) + + ldata := append(dataLenBytes, data...) + + // Pads length + data with null to 32 bytes + l := len(ldata) // hash + length + data + n := l / sha256XorBlockSize + m := l % sha256XorBlockSize + if m > 0 { + paddingNull := make([]byte, sha256XorBlockSize-m) + ldata = append(ldata, paddingNull...) + n++ + } + + // Hash(length+data+padding) + dataHash := cipher.SumSHA256(ldata) + + // Initialize blocks with data hash + blocks := []cipher.SHA256{dataHash} + for i := 0; i < n; i++ { + var b cipher.SHA256 + copy(b[:], ldata[i*sha256XorBlockSize:(i+1)*sha256XorBlockSize]) + blocks = append(blocks, b) + } + + // Generates a nonce + nonce := testutil.RandBytes(t, int(sha256XorNonceSize)) + // Hash the nonce + hashNonce := cipher.SumSHA256(nonce) + // Hash the password + key := secp256k1.Secp256k1Hash(password) + + var encryptedData []byte + // Encodes the blocks + for i := range blocks { + // Hash(password, hash(index, hash(nonce))) + h := hashKeyIndexNonce(key, int64(i), hashNonce) + encryptedHash := blocks[i].Xor(h) + encryptedData = append(encryptedData, encryptedHash[:]...) + } + + // Prefix the nonce + nonceAndDataBytes := append(nonce, encryptedData...) + // Calculates the checksum + checkSum := cipher.SumSHA256(nonceAndDataBytes) + rd := append(checkSum[:], nonceAndDataBytes...) + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(rd))) + enc.Encode(buf, rd) + return buf +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash.go new file mode 100644 index 00000000..039cf6a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash.go @@ -0,0 +1,208 @@ +package cipher + +import ( + "encoding/hex" + "errors" + "hash" + "log" +) + +var ( + // Memory pool for hashes + sha256HashPoolSize = 30 + sha256HashPool chan hash.Hash + ripemd160HashPoolSize = 30 + ripemd160HashPool chan hash.Hash +) + +var ( + // ErrInvalidLengthRipemd160 Invalid ripemd160 length + ErrInvalidLengthRipemd160 = errors.New("Invalid ripemd160 length") + // ErrInvalidLengthSHA256 Invalid sha256 length + ErrInvalidLengthSHA256 = errors.New("Invalid sha256 length") + // ErrInvalidHexLength Invalid hex length + ErrInvalidHexLength = errors.New("Invalid hex length") + // ErrInvalidBytesLength Invalid bytes length + ErrInvalidBytesLength = errors.New("Invalid bytes length") +) + +// Ripemd160 ripemd160 +type Ripemd160 [20]byte + +// MustSet sets value, panics on error +func (rd *Ripemd160) MustSet(b []byte) { + if len(b) != 20 { + log.Panic(ErrInvalidLengthRipemd160) + } + copy(rd[:], b[:]) +} + +// Set sets value +func (rd *Ripemd160) Set(b []byte) error { + if len(b) != 20 { + return ErrInvalidLengthRipemd160 + } + copy(rd[:], b[:]) + return nil +} + +// Ripemd160FromBytes converts []byte to Ripemd160 +func Ripemd160FromBytes(b []byte) (Ripemd160, error) { + h := Ripemd160{} + err := h.Set(b) + return h, err +} + +// MustRipemd160FromBytes converts []byte to Ripemd160, panics on error +func MustRipemd160FromBytes(b []byte) Ripemd160 { + h := Ripemd160{} + h.MustSet(b) + return h +} + +// HashRipemd160 hash data to Ripemd160 +func HashRipemd160(data []byte) Ripemd160 { + ripemd160Hash := <-ripemd160HashPool + ripemd160Hash.Reset() + // ripemd160.Write never returns an error + ripemd160Hash.Write(data) //nolint:errcheck + sum := ripemd160Hash.Sum(nil) + ripemd160HashPool <- ripemd160Hash + + h := Ripemd160{} + h.MustSet(sum) + return h +} + +// SHA256 32 bytes +type SHA256 [32]byte + +// MustSet sets value, panics on error +func (g *SHA256) MustSet(b []byte) { + if len(b) != 32 { + panic(ErrInvalidLengthSHA256) + } + copy(g[:], b[:]) +} + +// Set sets value +func (g *SHA256) Set(b []byte) error { + if len(b) != 32 { + return ErrInvalidLengthSHA256 + } + copy(g[:], b[:]) + return nil +} + +func (g SHA256) String() string { + return g.Hex() +} + +// Hex encode SHA256 to hex string +func (g SHA256) Hex() string { + return hex.EncodeToString(g[:]) +} + +// Null returns true if the hash is null (0x0000..) +func (g SHA256) Null() bool { + return g == SHA256{} +} + +// Xor xor +func (g *SHA256) Xor(b SHA256) SHA256 { + c := SHA256{} + for i := 0; i < 32; i++ { + c[i] = g[i] ^ b[i] + } + return c +} + +// SHA256FromHex decodes a hex encoded SHA256 hash to bytes +func SHA256FromHex(hs string) (SHA256, error) { + h := SHA256{} + b, err := hex.DecodeString(hs) + if err != nil { + return h, err + } + if len(b) != len(h) { + return h, ErrInvalidHexLength + } + h.MustSet(b) + return h, nil +} + +// MustSHA256FromHex decodes a hex encoded SHA256 hash to bytes, panics on error +func MustSHA256FromHex(hs string) SHA256 { + h, err := SHA256FromHex(hs) + if err != nil { + log.Panic(err) + } + return h +} + +// SHA256FromBytes converts []byte to SHA256 +func SHA256FromBytes(b []byte) (SHA256, error) { + h := SHA256{} + err := h.Set(b) + return h, err +} + +// MustSHA256FromBytes converts []byte to SHA256, panics on error +func MustSHA256FromBytes(b []byte) SHA256 { + h := SHA256{} + h.MustSet(b) + return h +} + +// SumSHA256 sum sha256 +func SumSHA256(b []byte) SHA256 { + sha256Hash := <-sha256HashPool + sha256Hash.Reset() + // sha256.Write never returns an error + sha256Hash.Write(b) //nolint:errcheck + sum := sha256Hash.Sum(nil) + sha256HashPool <- sha256Hash + + h := SHA256{} + h.MustSet(sum) + return h +} + +// DoubleSHA256 double SHA256 +func DoubleSHA256(b []byte) SHA256 { + h1 := SumSHA256(b) + h2 := SumSHA256(h1[:]) + return h2 +} + +// AddSHA256 returns the SHA256 hash of to two concatenated hashes +func AddSHA256(a SHA256, b SHA256) SHA256 { + c := append(a[:], b[:]...) + return SumSHA256(c) +} + +// Returns the next highest power of 2 above n, if n is not already a +// power of 2 +func nextPowerOfTwo(n uint64) uint64 { + var k uint64 = 1 + for k < n { + k *= 2 + } + return k +} + +// Merkle computes the merkle root of a hash array +// Array of hashes is padded with 0 hashes until next power of 2 +func Merkle(h0 []SHA256) SHA256 { + lh := uint64(len(h0)) + np := nextPowerOfTwo(lh) + h1 := append(h0, make([]SHA256, np-lh)...) + for len(h1) != 1 { + h2 := make([]SHA256, len(h1)/2) + for i := 0; i < len(h2); i++ { + h2[i] = AddSHA256(h1[2*i], h1[2*i+1]) + } + h1 = h2 + } + return h1[0] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash_test.go new file mode 100644 index 00000000..87baa288 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash_test.go @@ -0,0 +1,373 @@ +package cipher + +import ( + "bytes" + "crypto/rand" + "crypto/sha256" + "encoding/hex" + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/ripemd160" +) + +func freshSumRipemd160(t *testing.T, b []byte) Ripemd160 { + sh := ripemd160.New() + _, err := sh.Write(b) + require.NoError(t, err) + h := Ripemd160{} + h.MustSet(sh.Sum(nil)) + return h +} + +func freshSumSHA256(t *testing.T, b []byte) SHA256 { + sh := sha256.New() + _, err := sh.Write(b) + require.NoError(t, err) + h := SHA256{} + h.MustSet(sh.Sum(nil)) + return h +} + +func randBytes(t *testing.T, n int) []byte { + b := make([]byte, n) + x, err := rand.Read(b) + require.Equal(t, n, x) + require.Nil(t, err) + return b +} + +func TestHashRipemd160(t *testing.T) { + require.NotPanics(t, func() { HashRipemd160(randBytes(t, 128)) }) + r := HashRipemd160(randBytes(t, 160)) + require.NotEqual(t, r, Ripemd160{}) + // 2nd hash should not be affected by previous + b := randBytes(t, 256) + r2 := HashRipemd160(b) + require.NotEqual(t, r2, Ripemd160{}) + require.Equal(t, r2, freshSumRipemd160(t, b)) +} + +func TestRipemd160MustSet(t *testing.T) { + h := Ripemd160{} + require.Panics(t, func() { + h.MustSet(randBytes(t, 21)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 100)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 19)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 0)) + }) + require.NotPanics(t, func() { + h.MustSet(randBytes(t, 20)) + }) + b := randBytes(t, 20) + h.MustSet(b) + require.True(t, bytes.Equal(h[:], b)) +} + +func TestRipemd160Set(t *testing.T) { + h := Ripemd160{} + err := h.Set(randBytes(t, 21)) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + err = h.Set(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + err = h.Set(randBytes(t, 19)) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + err = h.Set(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + + b := randBytes(t, 20) + err = h.Set(b) + require.NoError(t, err) + require.True(t, bytes.Equal(h[:], b)) +} + +func TestSHA256MustSet(t *testing.T) { + h := SHA256{} + require.Panics(t, func() { + h.MustSet(randBytes(t, 33)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 100)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 31)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 0)) + }) + require.NotPanics(t, func() { + h.MustSet(randBytes(t, 32)) + }) + b := randBytes(t, 32) + h.MustSet(b) + require.True(t, bytes.Equal(h[:], b)) +} + +func TestRipemd160FromBytes(t *testing.T) { + b := randBytes(t, 20) + h, err := Ripemd160FromBytes(b) + require.NoError(t, err) + require.True(t, bytes.Equal(b[:], h[:])) + + b = randBytes(t, 19) + _, err = Ripemd160FromBytes(b) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + + b = randBytes(t, 21) + _, err = Ripemd160FromBytes(b) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + + _, err = Ripemd160FromBytes(nil) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) +} + +func TestMustRipemd160FromBytes(t *testing.T) { + b := randBytes(t, 20) + h := MustRipemd160FromBytes(b) + require.True(t, bytes.Equal(b[:], h[:])) + + b = randBytes(t, 19) + require.Panics(t, func() { + MustRipemd160FromBytes(b) + }) + + b = randBytes(t, 21) + require.Panics(t, func() { + MustRipemd160FromBytes(b) + }) + + require.Panics(t, func() { + MustRipemd160FromBytes(nil) + }) +} + +func TestSHA256Set(t *testing.T) { + h := SHA256{} + err := h.Set(randBytes(t, 33)) + require.Equal(t, errors.New("Invalid sha256 length"), err) + err = h.Set(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid sha256 length"), err) + err = h.Set(randBytes(t, 31)) + require.Equal(t, errors.New("Invalid sha256 length"), err) + err = h.Set(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid sha256 length"), err) + + b := randBytes(t, 32) + err = h.Set(b) + require.NoError(t, err) + require.True(t, bytes.Equal(h[:], b)) +} + +func TestSHA256Hex(t *testing.T) { + h := SHA256{} + h.MustSet(randBytes(t, 32)) + s := h.Hex() + h2, err := SHA256FromHex(s) + require.Nil(t, err) + require.Equal(t, h, h2) + require.Equal(t, h2.Hex(), s) +} + +func TestSHA256KnownValue(t *testing.T) { + vals := []struct { + input string + output string + }{ + // These values are generated by + // echo -n input | sha256sum + { + "skycoin", + "5a42c0643bdb465d90bf673b99c14f5fa02db71513249d904573d2b8b63d353d", + }, + { + "hello world", + "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", + }, + { + "hello world asd awd awd awdapodawpokawpod ", + "99d71f95cafe05ea2dddebc35b6083bd5af0e44850c9dc5139b4476c99950be4", + }, + } + for _, io := range vals { + require.Equal(t, io.output, SumSHA256([]byte(io.input)).Hex()) + } +} + +func TestSumSHA256(t *testing.T) { + b := randBytes(t, 256) + h1 := SumSHA256(b) + require.NotEqual(t, h1, SHA256{}) + // A second call to Sum should not be influenced by the original + c := randBytes(t, 256) + h2 := SumSHA256(c) + require.NotEqual(t, h2, SHA256{}) + require.Equal(t, h2, freshSumSHA256(t, c)) +} + +func TestSHA256FromHex(t *testing.T) { + // Invalid hex hash + _, err := SHA256FromHex("cawcd") + require.NotNil(t, err) + + // Truncated hex hash + h := SumSHA256(randBytes(t, 128)) + _, err = SHA256FromHex(hex.EncodeToString(h[:len(h)/2])) + require.NotNil(t, err) + + // Valid hex hash + h2, err := SHA256FromHex(hex.EncodeToString(h[:])) + require.Equal(t, h, h2) + require.Nil(t, err) +} + +func TestMustSHA256FromHex(t *testing.T) { + // Invalid hex hash + require.Panics(t, func() { MustSHA256FromHex("cawcd") }) + + // Truncated hex hash + h := SumSHA256(randBytes(t, 128)) + require.Panics(t, func() { + MustSHA256FromHex(hex.EncodeToString(h[:len(h)/2])) + }) + + // Valid hex hash + h2 := MustSHA256FromHex(hex.EncodeToString(h[:])) + require.Equal(t, h, h2) +} + +func TestSHA256FromBytes(t *testing.T) { + b := randBytes(t, 32) + h, err := SHA256FromBytes(b) + require.NoError(t, err) + require.True(t, bytes.Equal(b[:], h[:])) + + b = randBytes(t, 31) + _, err = SHA256FromBytes(b) + require.Equal(t, errors.New("Invalid sha256 length"), err) + + b = randBytes(t, 33) + _, err = SHA256FromBytes(b) + require.Equal(t, errors.New("Invalid sha256 length"), err) + + _, err = SHA256FromBytes(nil) + require.Equal(t, errors.New("Invalid sha256 length"), err) +} + +func TestMustSHA256FromBytes(t *testing.T) { + b := randBytes(t, 32) + h := MustSHA256FromBytes(b) + require.True(t, bytes.Equal(b[:], h[:])) + + b = randBytes(t, 31) + require.Panics(t, func() { + MustSHA256FromBytes(b) + }) + + b = randBytes(t, 33) + require.Panics(t, func() { + MustSHA256FromBytes(b) + }) + + require.Panics(t, func() { + MustSHA256FromBytes(nil) + }) +} + +func TestDoubleSHA256(t *testing.T) { + b := randBytes(t, 128) + h := DoubleSHA256(b) + require.NotEqual(t, h, SHA256{}) + require.NotEqual(t, h, freshSumSHA256(t, b)) +} + +func TestAddSHA256(t *testing.T) { + b := randBytes(t, 128) + h := SumSHA256(b) + c := randBytes(t, 64) + i := SumSHA256(c) + add := AddSHA256(h, i) + require.NotEqual(t, add, SHA256{}) + require.NotEqual(t, add, h) + require.NotEqual(t, add, i) + require.Equal(t, add, SumSHA256(append(h[:], i[:]...))) +} + +func TestXorSHA256(t *testing.T) { + b := randBytes(t, 128) + c := randBytes(t, 128) + h := SumSHA256(b) + i := SumSHA256(c) + require.NotEqual(t, h.Xor(i), h) + require.NotEqual(t, h.Xor(i), i) + require.NotEqual(t, h.Xor(i), SHA256{}) + require.Equal(t, h.Xor(i), i.Xor(h)) +} + +func TestSHA256Null(t *testing.T) { + var x SHA256 + require.True(t, x.Null()) + + b := randBytes(t, 128) + x = SumSHA256(b) + + require.False(t, x.Null()) +} + +func TestNextPowerOfTwo(t *testing.T) { + inputs := [][]uint64{ + {0, 1}, + {1, 1}, + {2, 2}, + {3, 4}, + {4, 4}, + {5, 8}, + {8, 8}, + {14, 16}, + {16, 16}, + {17, 32}, + {43345, 65536}, + {65535, 65536}, + {35657, 65536}, + {65536, 65536}, + {65537, 131072}, + } + for _, i := range inputs { + require.Equal(t, nextPowerOfTwo(i[0]), i[1]) + } + for i := uint64(2); i < 10000; i++ { + p := nextPowerOfTwo(i) + require.Equal(t, p%2, uint64(0)) + require.True(t, p >= i) + } +} + +func TestMerkle(t *testing.T) { + h := SumSHA256(randBytes(t, 128)) + // Single hash input returns hash + require.Equal(t, Merkle([]SHA256{h}), h) + h2 := SumSHA256(randBytes(t, 128)) + // 2 hashes should be AddSHA256 of them + require.Equal(t, Merkle([]SHA256{h, h2}), AddSHA256(h, h2)) + // 3 hashes should be Add(Add()) + h3 := SumSHA256(randBytes(t, 128)) + out := AddSHA256(AddSHA256(h, h2), AddSHA256(h3, SHA256{})) + require.Equal(t, Merkle([]SHA256{h, h2, h3}), out) + // 4 hashes should be Add(Add()) + h4 := SumSHA256(randBytes(t, 128)) + out = AddSHA256(AddSHA256(h, h2), AddSHA256(h3, h4)) + require.Equal(t, Merkle([]SHA256{h, h2, h3, h4}), out) + // 5 hashes + h5 := SumSHA256(randBytes(t, 128)) + out = AddSHA256(AddSHA256(h, h2), AddSHA256(h3, h4)) + out = AddSHA256(out, AddSHA256(AddSHA256(h5, SHA256{}), + AddSHA256(SHA256{}, SHA256{}))) + require.Equal(t, Merkle([]SHA256{h, h2, h3, h4, h5}), out) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2.go new file mode 100644 index 00000000..4408a9eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2.go @@ -0,0 +1,77 @@ +// Copyright 2012 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 pbkdf2 implements the key derivation function PBKDF2 as defined in RFC +2898 / PKCS #5 v2.0. + +A key derivation function is useful when encrypting data based on a password +or any other not-fully-random data. It uses a pseudorandom function to derive +a secure encryption key based on the password. + +While v2.0 of the standard defines only one pseudorandom function to use, +HMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved +Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To +choose, you can pass the `New` functions from the different SHA packages to +pbkdf2.Key. +*/ +package pbkdf2 // import "github.com/SkycoinProject/skycoin/src/cipher/pbkdf2" + +import ( + "crypto/hmac" + "hash" +) + +// Key derives a key from the password, salt and iteration count, returning a +// []byte of length keylen that can be used as cryptographic key. The key is +// derived based on the method described as PBKDF2 with the HMAC variant using +// the supplied hash function. +// +// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you +// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by +// doing: +// +// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New) +// +// Remember to get a good random salt. At least 8 bytes is recommended by the +// RFC. +// +// Using a higher iteration count will increase the cost of an exhaustive +// search but will also make derivation proportionally slower. +func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { + prf := hmac.New(h, password) + hashLen := prf.Size() + numBlocks := (keyLen + hashLen - 1) / hashLen + + var buf [4]byte + dk := make([]byte, 0, numBlocks*hashLen) + U := make([]byte, hashLen) + for block := 1; block <= numBlocks; block++ { + // N.B.: || means concatenation, ^ means XOR + // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter + // U_1 = PRF(password, salt || uint(i)) + prf.Reset() + prf.Write(salt) //nolint:errcheck,gosec + buf[0] = byte(block >> 24) + buf[1] = byte(block >> 16) + buf[2] = byte(block >> 8) + buf[3] = byte(block) + prf.Write(buf[:4]) //nolint:errcheck,gosec + dk = prf.Sum(dk) + T := dk[len(dk)-hashLen:] + copy(U, T) + + // U_n = PRF(password, U_(n-1)) + for n := 2; n <= iter; n++ { + prf.Reset() + prf.Write(U) //nolint:errcheck,gosec + U = U[:0] + U = prf.Sum(U) + for x := range U { + T[x] ^= U[x] + } + } + } + return dk[:keyLen] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2_test.go new file mode 100644 index 00000000..1fc814fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2_test.go @@ -0,0 +1,157 @@ +// Copyright 2012 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 pbkdf2 + +import ( + "bytes" + "crypto/sha1" //nolint:gosec + "crypto/sha256" + "hash" + "testing" +) + +type testVector struct { + password string + salt string + iter int + output []byte +} + +// Test vectors from RFC 6070, http://tools.ietf.org/html/rfc6070 +var sha1TestVectors = []testVector{ + { + "password", + "salt", + 1, + []byte{ + 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, + 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, + 0x2f, 0xe0, 0x37, 0xa6, + }, + }, + { + "password", + "salt", + 2, + []byte{ + 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, + 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, + 0xd8, 0xde, 0x89, 0x57, + }, + }, + { + "password", + "salt", + 4096, + []byte{ + 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, + 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, + 0x65, 0xa4, 0x29, 0xc1, + }, + }, + // // This one takes too long + // { + // "password", + // "salt", + // 16777216, + // []byte{ + // 0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4, + // 0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c, + // 0x26, 0x34, 0xe9, 0x84, + // }, + // }, + { + "passwordPASSWORDpassword", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", + 4096, + []byte{ + 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, + 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, + 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, + 0x38, + }, + }, + { + "pass\000word", + "sa\000lt", + 4096, + []byte{ + 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, + 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3, + }, + }, +} + +// Test vectors from +// http://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors +var sha256TestVectors = []testVector{ + { + "password", + "salt", + 1, + []byte{ + 0x12, 0x0f, 0xb6, 0xcf, 0xfc, 0xf8, 0xb3, 0x2c, + 0x43, 0xe7, 0x22, 0x52, 0x56, 0xc4, 0xf8, 0x37, + 0xa8, 0x65, 0x48, 0xc9, + }, + }, + { + "password", + "salt", + 2, + []byte{ + 0xae, 0x4d, 0x0c, 0x95, 0xaf, 0x6b, 0x46, 0xd3, + 0x2d, 0x0a, 0xdf, 0xf9, 0x28, 0xf0, 0x6d, 0xd0, + 0x2a, 0x30, 0x3f, 0x8e, + }, + }, + { + "password", + "salt", + 4096, + []byte{ + 0xc5, 0xe4, 0x78, 0xd5, 0x92, 0x88, 0xc8, 0x41, + 0xaa, 0x53, 0x0d, 0xb6, 0x84, 0x5c, 0x4c, 0x8d, + 0x96, 0x28, 0x93, 0xa0, + }, + }, + { + "passwordPASSWORDpassword", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", + 4096, + []byte{ + 0x34, 0x8c, 0x89, 0xdb, 0xcb, 0xd3, 0x2b, 0x2f, + 0x32, 0xd8, 0x14, 0xb8, 0x11, 0x6e, 0x84, 0xcf, + 0x2b, 0x17, 0x34, 0x7e, 0xbc, 0x18, 0x00, 0x18, + 0x1c, + }, + }, + { + "pass\000word", + "sa\000lt", + 4096, + []byte{ + 0x89, 0xb6, 0x9d, 0x05, 0x16, 0xf8, 0x29, 0x89, + 0x3c, 0x69, 0x62, 0x26, 0x65, 0x0a, 0x86, 0x87, + }, + }, +} + +func testHash(t *testing.T, h func() hash.Hash, hashName string, vectors []testVector) { + for i, v := range vectors { + o := Key([]byte(v.password), []byte(v.salt), v.iter, len(v.output), h) + if !bytes.Equal(o, v.output) { + t.Errorf("%s %d: expected %x, got %x", hashName, i, v.output, o) + } + } +} + +func TestWithHMACSHA1(t *testing.T) { + testHash(t, sha1.New, "SHA1", sha1TestVectors) +} + +func TestWithHMACSHA256(t *testing.T) { + testHash(t, sha256.New, "SHA256", sha256TestVectors) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305.go new file mode 100644 index 00000000..eb911984 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305.go @@ -0,0 +1,32 @@ +// Copyright 2012 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 poly1305 implements Poly1305 one-time message authentication code as specified in http://cr.yp.to/mac/poly1305-20050329.pdf. + +Poly1305 is a fast, one-time authentication function. It is infeasible for an +attacker to generate an authenticator for a message without the key. However, a +key must only be used for a single message. Authenticating two different +messages with the same key allows an attacker to forge authenticators for other +messages with the same key. + +Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was +used with a fixed key in order to generate one-time keys from an nonce. +However, in this package AES isn't used and the one-time key is specified +directly. +*/ +package poly1305 // import "github.com/SkycoinProject/skycoin/src/cipher/poly1305" + +import "crypto/subtle" + +// TagSize is the size, in bytes, of a poly1305 authenticator. +const TagSize = 16 + +// Verify returns true if mac is a valid authenticator for m with the given +// key. +func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { + var tmp [16]byte + Sum(&tmp, m, key) + return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305_test.go new file mode 100644 index 00000000..03b0e32d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305_test.go @@ -0,0 +1,159 @@ +// Copyright 2012 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 poly1305 + +import ( + "bytes" + "encoding/hex" + "flag" + "testing" + "unsafe" +) + +var stressFlag = flag.Bool("stress", false, "run slow stress tests") + +var testData = []struct { + in, k, correct []byte +}{ + { + []byte("Hello world!"), + []byte("this is 32-byte key for Poly1305"), + []byte{0xa6, 0xf7, 0x45, 0x00, 0x8f, 0x81, 0xc9, 0x16, 0xa2, 0x0d, 0xcc, 0x74, 0xee, 0xf2, 0xb2, 0xf0}, + }, + { + make([]byte, 32), + []byte("this is 32-byte key for Poly1305"), + []byte{0x49, 0xec, 0x78, 0x09, 0x0e, 0x48, 0x1e, 0xc6, 0xc2, 0x6b, 0x33, 0xb9, 0x1c, 0xcc, 0x03, 0x07}, + }, + { + make([]byte, 2007), + []byte("this is 32-byte key for Poly1305"), + []byte{0xda, 0x84, 0xbc, 0xab, 0x02, 0x67, 0x6c, 0x38, 0xcd, 0xb0, 0x15, 0x60, 0x42, 0x74, 0xc2, 0xaa}, + }, + { + make([]byte, 2007), + make([]byte, 32), + make([]byte, 16), + }, + { + // This test triggers an edge-case. See https://go-review.googlesource.com/#/c/30101/. + []byte{0x81, 0xd8, 0xb2, 0xe4, 0x6a, 0x25, 0x21, 0x3b, 0x58, 0xfe, 0xe4, 0x21, 0x3a, 0x2a, 0x28, 0xe9, 0x21, 0xc1, 0x2a, 0x96, 0x32, 0x51, 0x6d, 0x3b, 0x73, 0x27, 0x27, 0x27, 0xbe, 0xcf, 0x21, 0x29}, + []byte{0x3b, 0x3a, 0x29, 0xe9, 0x3b, 0x21, 0x3a, 0x5c, 0x5c, 0x3b, 0x3b, 0x05, 0x3a, 0x3a, 0x8c, 0x0d}, + []byte{0x6d, 0xc1, 0x8b, 0x8c, 0x34, 0x4c, 0xd7, 0x99, 0x27, 0x11, 0x8b, 0xbe, 0x84, 0xb7, 0xf3, 0x14}, + }, + { + // This test generates a result of (2^130-1) % (2^130-5). + []byte{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + []byte{4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + }, + { + // This test generates a result of (2^130-6) % (2^130-5). + []byte{ + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + []byte{0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + }, + { + // This test generates a result of (2^130-5) % (2^130-5). + []byte{ + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + }, +} + +func testSum(t *testing.T, unaligned bool) { + var out [16]byte + var key [32]byte + + for i, v := range testData { + in := v.in + if unaligned { + in = unalignBytes(in) + } + copy(key[:], v.k) + Sum(&out, in, &key) + if !bytes.Equal(out[:], v.correct) { + t.Errorf("%d: expected %x, got %x", i, v.correct, out[:]) + } + } +} + +func TestBurnin(t *testing.T) { + // This test can be used to sanity-check significant changes. It can + // take about many minutes to run, even on fast machines. It's disabled + // by default. + if !*stressFlag { + t.Skip("skipping without -stress") + } + + var key [32]byte + var input [25]byte + var output [16]byte + + for i := range key { + key[i] = 1 + } + for i := range input { + input[i] = 2 + } + + for i := uint64(0); i < 1e10; i++ { + Sum(&output, input[:], &key) + copy(key[0:], output[:]) + copy(key[16:], output[:]) + copy(input[:], output[:]) + copy(input[16:], output[:]) + } + + const expected = "5e3b866aea0b636d240c83c428f84bfa" + if got := hex.EncodeToString(output[:]); got != expected { + t.Errorf("expected %s, got %s", expected, got) + } +} + +func TestSum(t *testing.T) { testSum(t, false) } +func TestSumUnaligned(t *testing.T) { testSum(t, true) } + +func benchmark(b *testing.B, size int, unaligned bool) { + var out [16]byte + var key [32]byte + in := make([]byte, size) + if unaligned { + in = unalignBytes(in) + } + b.SetBytes(int64(len(in))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Sum(&out, in, &key) + } +} + +func Benchmark64(b *testing.B) { benchmark(b, 64, false) } +func Benchmark1K(b *testing.B) { benchmark(b, 1024, false) } +func Benchmark64Unaligned(b *testing.B) { benchmark(b, 64, true) } +func Benchmark1KUnaligned(b *testing.B) { benchmark(b, 1024, true) } + +func unalignBytes(in []byte) []byte { + out := make([]byte, len(in)+1) + if uintptr(unsafe.Pointer(&out[0]))&(unsafe.Alignof(uint32(0))-1) == 0 { //nolint:gosec + out = out[1:] + } else { + out = out[:len(in)] + } + copy(out, in) + return out +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.go new file mode 100644 index 00000000..4dd72fe7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.go @@ -0,0 +1,22 @@ +// Copyright 2012 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. + +// +build amd64,!gccgo,!appengine + +package poly1305 + +// This function is implemented in sum_amd64.s +//go:noescape +func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305(out, mPtr, uint64(len(m)), key) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.s b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.s new file mode 100644 index 00000000..2edae638 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.s @@ -0,0 +1,125 @@ +// Copyright 2012 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. + +// +build amd64,!gccgo,!appengine + +#include "textflag.h" + +#define POLY1305_ADD(msg, h0, h1, h2) \ + ADDQ 0(msg), h0; \ + ADCQ 8(msg), h1; \ + ADCQ $1, h2; \ + LEAQ 16(msg), msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ + MOVQ r0, AX; \ + MULQ h0; \ + MOVQ AX, t0; \ + MOVQ DX, t1; \ + MOVQ r0, AX; \ + MULQ h1; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ r0, t2; \ + IMULQ h2, t2; \ + ADDQ DX, t2; \ + \ + MOVQ r1, AX; \ + MULQ h0; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ DX, h0; \ + MOVQ r1, t3; \ + IMULQ h2, t3; \ + MOVQ r1, AX; \ + MULQ h1; \ + ADDQ AX, t2; \ + ADCQ DX, t3; \ + ADDQ h0, t2; \ + ADCQ $0, t3; \ + \ + MOVQ t0, h0; \ + MOVQ t1, h1; \ + MOVQ t2, h2; \ + ANDQ $3, h2; \ + MOVQ t2, t0; \ + ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ + ADDQ t0, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2; \ + SHRQ $2, t3, t2; \ + SHRQ $2, t3; \ + ADDQ t2, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2 + +DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +GLOBL ·poly1305Mask<>(SB), RODATA, $16 + +// func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]key) +TEXT ·poly1305(SB), $0-32 + MOVQ out+0(FP), DI + MOVQ m+8(FP), SI + MOVQ mlen+16(FP), R15 + MOVQ key+24(FP), AX + + MOVQ 0(AX), R11 + MOVQ 8(AX), R12 + ANDQ ·poly1305Mask<>(SB), R11 // r0 + ANDQ ·poly1305Mask<>+8(SB), R12 // r1 + XORQ R8, R8 // h0 + XORQ R9, R9 // h1 + XORQ R10, R10 // h2 + + CMPQ R15, $16 + JB bytes_between_0_and_15 + +loop: + POLY1305_ADD(SI, R8, R9, R10) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) + SUBQ $16, R15 + CMPQ R15, $16 + JAE loop + +bytes_between_0_and_15: + TESTQ R15, R15 + JZ done + MOVQ $1, BX + XORQ CX, CX + XORQ R13, R13 + ADDQ R15, SI + +flush_buffer: + SHLQ $8, BX, CX + SHLQ $8, BX + MOVB -1(SI), R13 + XORQ R13, BX + DECQ SI + DECQ R15 + JNZ flush_buffer + + ADDQ BX, R8 + ADCQ CX, R9 + ADCQ $0, R10 + MOVQ $16, R15 + JMP multiply + +done: + MOVQ R8, AX + MOVQ R9, BX + SUBQ $0xFFFFFFFFFFFFFFFB, AX + SBBQ $0xFFFFFFFFFFFFFFFF, BX + SBBQ $3, R10 + CMOVQCS R8, AX + CMOVQCS R9, BX + MOVQ key+24(FP), R8 + ADDQ 16(R8), AX + ADCQ 24(R8), BX + + MOVQ AX, 0(DI) + MOVQ BX, 8(DI) + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.go new file mode 100644 index 00000000..5dc321c2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.go @@ -0,0 +1,22 @@ +// Copyright 2015 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. + +// +build arm,!gccgo,!appengine,!nacl + +package poly1305 + +// This function is implemented in sum_arm.s +//go:noescape +func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305_auth_armv6(out, mPtr, uint32(len(m)), key) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.s b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.s new file mode 100644 index 00000000..f70b4ac4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.s @@ -0,0 +1,427 @@ +// Copyright 2015 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. + +// +build arm,!gccgo,!appengine,!nacl + +#include "textflag.h" + +// This code was translated into a form compatible with 5a from the public +// domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305. + +DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff +DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03 +DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff +DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff +DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff +GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20 + +// Warning: the linker may use R11 to synthesize certain instructions. Please +// take care and verify that no synthetic instructions use it. + +TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0 + // Needs 16 bytes of stack and 64 bytes of space pointed to by R0. (It + // might look like it's only 60 bytes of space but the final four bytes + // will be written by another function.) We need to skip over four + // bytes of stack because that's saving the value of 'g'. + ADD $4, R13, R8 + MOVM.IB [R4-R7], (R8) + MOVM.IA.W (R1), [R2-R5] + MOVW $·poly1305_init_constants_armv6<>(SB), R7 + MOVW R2, R8 + MOVW R2>>26, R9 + MOVW R3>>20, g + MOVW R4>>14, R11 + MOVW R5>>8, R12 + ORR R3<<6, R9, R9 + ORR R4<<12, g, g + ORR R5<<18, R11, R11 + MOVM.IA (R7), [R2-R6] + AND R8, R2, R2 + AND R9, R3, R3 + AND g, R4, R4 + AND R11, R5, R5 + AND R12, R6, R6 + MOVM.IA.W [R2-R6], (R0) + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + MOVM.IA.W [R2-R6], (R0) + MOVM.IA.W (R1), [R2-R5] + MOVM.IA [R2-R6], (R0) + ADD $20, R13, R0 + MOVM.DA (R0), [R4-R7] + RET + +#define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \ + MOVBU (offset+0)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+0)(Rdst); \ + MOVBU (offset+1)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+1)(Rdst); \ + MOVBU (offset+2)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+2)(Rdst); \ + MOVBU (offset+3)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+3)(Rdst) + +TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0 + // Needs 24 bytes of stack for saved registers and then 88 bytes of + // scratch space after that. We assume that 24 bytes at (R13) have + // already been used: four bytes for the link register saved in the + // prelude of poly1305_auth_armv6, four bytes for saving the value of g + // in that function and 16 bytes of scratch space used around + // poly1305_finish_ext_armv6_skip1. + ADD $24, R13, R12 + MOVM.IB [R4-R8, R14], (R12) + MOVW R0, 88(R13) + MOVW R1, 92(R13) + MOVW R2, 96(R13) + MOVW R1, R14 + MOVW R2, R12 + MOVW 56(R0), R8 + WORD $0xe1180008 // TST R8, R8 not working see issue 5921 + EOR R6, R6, R6 + MOVW.EQ $(1<<24), R6 + MOVW R6, 84(R13) + ADD $116, R13, g + MOVM.IA (R0), [R0-R9] + MOVM.IA [R0-R4], (g) + CMP $16, R12 + BLO poly1305_blocks_armv6_done + +poly1305_blocks_armv6_mainloop: + WORD $0xe31e0003 // TST R14, #3 not working see issue 5921 + BEQ poly1305_blocks_armv6_mainloop_aligned + ADD $100, R13, g + MOVW_UNALIGNED(R14, g, R0, 0) + MOVW_UNALIGNED(R14, g, R0, 4) + MOVW_UNALIGNED(R14, g, R0, 8) + MOVW_UNALIGNED(R14, g, R0, 12) + MOVM.IA (g), [R0-R3] + ADD $16, R14 + B poly1305_blocks_armv6_mainloop_loaded + +poly1305_blocks_armv6_mainloop_aligned: + MOVM.IA.W (R14), [R0-R3] + +poly1305_blocks_armv6_mainloop_loaded: + MOVW R0>>26, g + MOVW R1>>20, R11 + MOVW R2>>14, R12 + MOVW R14, 92(R13) + MOVW R3>>8, R4 + ORR R1<<6, g, g + ORR R2<<12, R11, R11 + ORR R3<<18, R12, R12 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, g, g + MOVW 84(R13), R3 + BIC $0xfc000000, R11, R11 + BIC $0xfc000000, R12, R12 + ADD R0, R5, R5 + ADD g, R6, R6 + ORR R3, R4, R4 + ADD R11, R7, R7 + ADD $116, R13, R14 + ADD R12, R8, R8 + ADD R4, R9, R9 + MOVM.IA (R14), [R0-R4] + MULLU R4, R5, (R11, g) + MULLU R3, R5, (R14, R12) + MULALU R3, R6, (R11, g) + MULALU R2, R6, (R14, R12) + MULALU R2, R7, (R11, g) + MULALU R1, R7, (R14, R12) + ADD R4<<2, R4, R4 + ADD R3<<2, R3, R3 + MULALU R1, R8, (R11, g) + MULALU R0, R8, (R14, R12) + MULALU R0, R9, (R11, g) + MULALU R4, R9, (R14, R12) + MOVW g, 76(R13) + MOVW R11, 80(R13) + MOVW R12, 68(R13) + MOVW R14, 72(R13) + MULLU R2, R5, (R11, g) + MULLU R1, R5, (R14, R12) + MULALU R1, R6, (R11, g) + MULALU R0, R6, (R14, R12) + MULALU R0, R7, (R11, g) + MULALU R4, R7, (R14, R12) + ADD R2<<2, R2, R2 + ADD R1<<2, R1, R1 + MULALU R4, R8, (R11, g) + MULALU R3, R8, (R14, R12) + MULALU R3, R9, (R11, g) + MULALU R2, R9, (R14, R12) + MOVW g, 60(R13) + MOVW R11, 64(R13) + MOVW R12, 52(R13) + MOVW R14, 56(R13) + MULLU R0, R5, (R11, g) + MULALU R4, R6, (R11, g) + MULALU R3, R7, (R11, g) + MULALU R2, R8, (R11, g) + MULALU R1, R9, (R11, g) + ADD $52, R13, R0 + MOVM.IA (R0), [R0-R7] + MOVW g>>26, R12 + MOVW R4>>26, R14 + ORR R11<<6, R12, R12 + ORR R5<<6, R14, R14 + BIC $0xfc000000, g, g + BIC $0xfc000000, R4, R4 + ADD.S R12, R0, R0 + ADC $0, R1, R1 + ADD.S R14, R6, R6 + ADC $0, R7, R7 + MOVW R0>>26, R12 + MOVW R6>>26, R14 + ORR R1<<6, R12, R12 + ORR R7<<6, R14, R14 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, R6, R6 + ADD R14<<2, R14, R14 + ADD.S R12, R2, R2 + ADC $0, R3, R3 + ADD R14, g, g + MOVW R2>>26, R12 + MOVW g>>26, R14 + ORR R3<<6, R12, R12 + BIC $0xfc000000, g, R5 + BIC $0xfc000000, R2, R7 + ADD R12, R4, R4 + ADD R14, R0, R0 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R8 + ADD R12, R6, R9 + MOVW 96(R13), R12 + MOVW 92(R13), R14 + MOVW R0, R6 + CMP $32, R12 + SUB $16, R12, R12 + MOVW R12, 96(R13) + BHS poly1305_blocks_armv6_mainloop + +poly1305_blocks_armv6_done: + MOVW 88(R13), R12 + MOVW R5, 20(R12) + MOVW R6, 24(R12) + MOVW R7, 28(R12) + MOVW R8, 32(R12) + MOVW R9, 36(R12) + ADD $48, R13, R0 + MOVM.DA (R0), [R4-R8, R14] + RET + +#define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst); \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst) + +#define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) + +// func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key) +TEXT ·poly1305_auth_armv6(SB), $196-16 + // The value 196, just above, is the sum of 64 (the size of the context + // structure) and 132 (the amount of stack needed). + // + // At this point, the stack pointer (R13) has been moved down. It + // points to the saved link register and there's 196 bytes of free + // space above it. + // + // The stack for this function looks like: + // + // +--------------------- + // | + // | 64 bytes of context structure + // | + // +--------------------- + // | + // | 112 bytes for poly1305_blocks_armv6 + // | + // +--------------------- + // | 16 bytes of final block, constructed at + // | poly1305_finish_ext_armv6_skip8 + // +--------------------- + // | four bytes of saved 'g' + // +--------------------- + // | lr, saved by prelude <- R13 points here + // +--------------------- + MOVW g, 4(R13) + + MOVW out+0(FP), R4 + MOVW m+4(FP), R5 + MOVW mlen+8(FP), R6 + MOVW key+12(FP), R7 + + ADD $136, R13, R0 // 136 = 4 + 4 + 16 + 112 + MOVW R7, R1 + + // poly1305_init_ext_armv6 will write to the stack from R13+4, but + // that's ok because none of the other values have been written yet. + BL poly1305_init_ext_armv6<>(SB) + BIC.S $15, R6, R2 + BEQ poly1305_auth_armv6_noblocks + ADD $136, R13, R0 + MOVW R5, R1 + ADD R2, R5, R5 + SUB R2, R6, R6 + BL poly1305_blocks_armv6<>(SB) + +poly1305_auth_armv6_noblocks: + ADD $136, R13, R0 + MOVW R5, R1 + MOVW R6, R2 + MOVW R4, R3 + + MOVW R0, R5 + MOVW R1, R6 + MOVW R2, R7 + MOVW R3, R8 + AND.S R2, R2, R2 + BEQ poly1305_finish_ext_armv6_noremaining + EOR R0, R0 + ADD $8, R13, R9 // 8 = offset to 16 byte scratch space + MOVW R0, (R9) + MOVW R0, 4(R9) + MOVW R0, 8(R9) + MOVW R0, 12(R9) + WORD $0xe3110003 // TST R1, #3 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_aligned + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8 + MOVWP_UNALIGNED(R1, R9, g) + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip8: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4 + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip4: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHUP_UNALIGNED(R1, R9, g) + B poly1305_finish_ext_armv6_skip2 + +poly1305_finish_ext_armv6_aligned: + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8_aligned + MOVM.IA.W (R1), [g-R11] + MOVM.IA.W [g-R11], (R9) + +poly1305_finish_ext_armv6_skip8_aligned: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4_aligned + MOVW.P 4(R1), g + MOVW.P g, 4(R9) + +poly1305_finish_ext_armv6_skip4_aligned: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHU.P 2(R1), g + MOVH.P g, 2(R9) + +poly1305_finish_ext_armv6_skip2: + WORD $0xe3120001 // TST $1, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip1 + MOVBU.P 1(R1), g + MOVBU.P g, 1(R9) + +poly1305_finish_ext_armv6_skip1: + MOVW $1, R11 + MOVBU R11, 0(R9) + MOVW R11, 56(R5) + MOVW R5, R0 + ADD $8, R13, R1 + MOVW $16, R2 + BL poly1305_blocks_armv6<>(SB) + +poly1305_finish_ext_armv6_noremaining: + MOVW 20(R5), R0 + MOVW 24(R5), R1 + MOVW 28(R5), R2 + MOVW 32(R5), R3 + MOVW 36(R5), R4 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R4 + ADD R12<<2, R12, R12 + ADD R12, R0, R0 + MOVW R0>>26, R12 + BIC $0xfc000000, R0, R0 + ADD R12, R1, R1 + MOVW R1>>26, R12 + BIC $0xfc000000, R1, R1 + ADD R12, R2, R2 + MOVW R2>>26, R12 + BIC $0xfc000000, R2, R2 + ADD R12, R3, R3 + MOVW R3>>26, R12 + BIC $0xfc000000, R3, R3 + ADD R12, R4, R4 + ADD $5, R0, R6 + MOVW R6>>26, R12 + BIC $0xfc000000, R6, R6 + ADD R12, R1, R7 + MOVW R7>>26, R12 + BIC $0xfc000000, R7, R7 + ADD R12, R2, g + MOVW g>>26, R12 + BIC $0xfc000000, g, g + ADD R12, R3, R11 + MOVW $-(1<<26), R12 + ADD R11>>26, R12, R12 + BIC $0xfc000000, R11, R11 + ADD R12, R4, R9 + MOVW R9>>31, R12 + SUB $1, R12 + AND R12, R6, R6 + AND R12, R7, R7 + AND R12, g, g + AND R12, R11, R11 + AND R12, R9, R9 + MVN R12, R12 + AND R12, R0, R0 + AND R12, R1, R1 + AND R12, R2, R2 + AND R12, R3, R3 + AND R12, R4, R4 + ORR R6, R0, R0 + ORR R7, R1, R1 + ORR g, R2, R2 + ORR R11, R3, R3 + ORR R9, R4, R4 + ORR R1<<26, R0, R0 + MOVW R1>>6, R1 + ORR R2<<20, R1, R1 + MOVW R2>>12, R2 + ORR R3<<14, R2, R2 + MOVW R3>>18, R3 + ORR R4<<8, R3, R3 + MOVW 40(R5), R6 + MOVW 44(R5), R7 + MOVW 48(R5), g + MOVW 52(R5), R11 + ADD.S R6, R0, R0 + ADC.S R7, R1, R1 + ADC.S g, R2, R2 + ADC.S R11, R3, R3 + MOVM.IA [R0-R3], (R8) + MOVW R5, R12 + EOR R0, R0, R0 + EOR R1, R1, R1 + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + EOR R7, R7, R7 + MOVM.IA.W [R0-R7], (R12) + MOVM.IA [R0-R7], (R12) + MOVW 4(R13), g + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_ref.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_ref.go new file mode 100644 index 00000000..b2805a5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_ref.go @@ -0,0 +1,141 @@ +// Copyright 2012 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. + +// +build !amd64,!arm gccgo appengine nacl + +package poly1305 + +import "encoding/binary" + +// Sum generates an authenticator for msg using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { + var ( + h0, h1, h2, h3, h4 uint32 // the hash accumulators + r0, r1, r2, r3, r4 uint64 // the r part of the key + ) + + r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) + r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) + r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) + r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) + r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) + + R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 + + for len(msg) >= TagSize { + // h += msg + h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + + msg = msg[TagSize:] + } + + if len(msg) > 0 { + var block [TagSize]byte + off := copy(block[:], msg) + block[off] = 0x01 + + // h += msg + h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + } + + // h %= p reduction + h2 += h1 >> 26 + h1 &= 0x3ffffff + h3 += h2 >> 26 + h2 &= 0x3ffffff + h4 += h3 >> 26 + h3 &= 0x3ffffff + h0 += 5 * (h4 >> 26) + h4 &= 0x3ffffff + h1 += h0 >> 26 + h0 &= 0x3ffffff + + // h - p + t0 := h0 + 5 + t1 := h1 + (t0 >> 26) + t2 := h2 + (t1 >> 26) + t3 := h3 + (t2 >> 26) + t4 := h4 + (t3 >> 26) - (1 << 26) + t0 &= 0x3ffffff + t1 &= 0x3ffffff + t2 &= 0x3ffffff + t3 &= 0x3ffffff + + // select h if h < p else h - p + t_mask := (t4 >> 31) - 1 + h_mask := ^t_mask + h0 = (h0 & h_mask) | (t0 & t_mask) + h1 = (h1 & h_mask) | (t1 & t_mask) + h2 = (h2 & h_mask) | (t2 & t_mask) + h3 = (h3 & h_mask) | (t3 & t_mask) + h4 = (h4 & h_mask) | (t4 & t_mask) + + // h %= 2^128 + h0 |= h1 << 26 + h1 = ((h1 >> 6) | (h2 << 20)) + h2 = ((h2 >> 12) | (h3 << 14)) + h3 = ((h3 >> 18) | (h4 << 8)) + + // s: the s part of the key + // tag = (h + s) % (2^128) + t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) + h0 = uint32(t) + t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) + h1 = uint32(t) + t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) + h2 = uint32(t) + t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) + h3 = uint32(t) + + binary.LittleEndian.PutUint32(out[0:], h0) + binary.LittleEndian.PutUint32(out[4:], h1) + binary.LittleEndian.PutUint32(out[8:], h2) + binary.LittleEndian.PutUint32(out[12:], h3) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripemd160block.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripemd160block.go new file mode 100644 index 00000000..2f45a532 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripemd160block.go @@ -0,0 +1,161 @@ +// 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. + +// RIPEMD-160 block step. +// In its own file so that a faster assembly or C version +// can be substituted easily. + +package ripemd160 + +// work buffer indices and roll amounts for one line +var _n = [80]uint{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13, +} + +var _r = [80]uint{ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6, +} + +// same for the other parallel one +var n_ = [80]uint{ //nolint:golint + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11, +} + +var r_ = [80]uint{ //nolint:golint + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11, +} + +func _Block(md *digest, p []byte) int { + n := 0 + var x [16]uint32 + var alpha, beta uint32 + for len(p) >= BlockSize { + a, b, c, d, e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4] + aa, bb, cc, dd, ee := a, b, c, d, e + j := 0 + for i := 0; i < 16; i++ { + x[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24 + j += 4 + } + + // round 1 + i := 0 + for i < 16 { + alpha = a + (b ^ c ^ d) + x[_n[i]] + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 2 + for i < 32 { + alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 3 + for i < 48 { + alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 4 + for i < 64 { + alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 5 + for i < 80 { + alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // combine results + dd += c + md.s[1] + md.s[1] = md.s[2] + d + ee + md.s[2] = md.s[3] + e + aa + md.s[3] = md.s[4] + a + bb + md.s[4] = md.s[0] + b + cc + md.s[0] = dd + + p = p[BlockSize:] + n += BlockSize + } + return n +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripmd_160.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripmd_160.go new file mode 100644 index 00000000..d406bbfe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripmd_160.go @@ -0,0 +1,121 @@ +// 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 ripemd160 implements the RIPEMD-160 hash algorithm. +package ripemd160 + +// RIPEMD-160 is designed by by Hans Dobbertin, Antoon Bosselaers, and Bart +// Preneel with specifications available at: +// http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf. + +import ( + "crypto" + "hash" +) + +func init() { + crypto.RegisterHash(crypto.RIPEMD160, New) +} + +// Size is the size of the checksum in bytes. +const Size = 20 + +// BlockSize is the block size of the hash algorithm in bytes. +const BlockSize = 64 + +const ( + _s0 = 0x67452301 + _s1 = 0xefcdab89 + _s2 = 0x98badcfe + _s3 = 0x10325476 + _s4 = 0xc3d2e1f0 +) + +// digest represents the partial evaluation of a checksum. +type digest struct { + s [5]uint32 // running context + x [BlockSize]byte // temporary buffer + nx int // index into x + tc uint64 // total count of bytes processed +} + +func (d *digest) Reset() { + d.s[0], d.s[1], d.s[2], d.s[3], d.s[4] = _s0, _s1, _s2, _s3, _s4 + d.nx = 0 + d.tc = 0 +} + +// New returns a new hash.Hash computing the checksum. +func New() hash.Hash { + result := new(digest) + result.Reset() + return result +} + +func (d *digest) Size() int { return Size } + +func (d *digest) BlockSize() int { return BlockSize } + +func (d *digest) Write(p []byte) (nn int, err error) { + nn = len(p) + d.tc += uint64(nn) + if d.nx > 0 { + n := len(p) + if n > BlockSize-d.nx { + n = BlockSize - d.nx + } + for i := 0; i < n; i++ { + d.x[d.nx+i] = p[i] + } + d.nx += n + if d.nx == BlockSize { + _Block(d, d.x[0:]) + d.nx = 0 + } + p = p[n:] + } + n := _Block(d, p) + p = p[n:] + if len(p) > 0 { + d.nx = copy(d.x[:], p) + } + return +} + +func (d0 *digest) Sum(in []byte) []byte { //nolint:golint + // Make a copy of d0 so that caller can keep writing and summing. + d := *d0 + + // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. + tc := d.tc + var tmp [64]byte + tmp[0] = 0x80 + if tc%64 < 56 { + + d.Write(tmp[0 : 56-tc%64]) //nolint:errcheck,gosec + } else { + d.Write(tmp[0 : 64+56-tc%64]) //nolint:errcheck,gosec + } + + // Length in bits. + tc <<= 3 + for i := uint(0); i < 8; i++ { + tmp[i] = byte(tc >> (8 * i)) + } + d.Write(tmp[0:8]) //nolint:errcheck,gosec + + if d.nx != 0 { + panic("d.nx != 0") + } + + var digest [Size]byte + for i, s := range d.s { + digest[i*4] = byte(s) + digest[i*4+1] = byte(s >> 8) + digest[i*4+2] = byte(s >> 16) + digest[i*4+3] = byte(s >> 24) + } + + return append(in, digest[:]...) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt.go new file mode 100644 index 00000000..57e6ace8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt.go @@ -0,0 +1,243 @@ +// Copyright 2012 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 scrypt implements the scrypt key derivation function as defined in +// Colin Percival's paper "Stronger Key Derivation via Sequential Memory-Hard +// Functions" (http://www.tarsnap.com/scrypt/scrypt.pdf). +package scrypt // import "github.com/SkycoinProject/skycoin/src/cipher/scrypt" + +import ( + "crypto/sha256" + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher/pbkdf2" +) + +const maxInt = int(^uint(0) >> 1) + +// blockCopy copies n numbers from src into dst. +func blockCopy(dst, src []uint32, n int) { + copy(dst, src[:n]) +} + +// blockXOR XORs numbers from dst with n numbers from src. +func blockXOR(dst, src []uint32, n int) { + for i, v := range src[:n] { + dst[i] ^= v + } +} + +// salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in, +// and puts the result into both both tmp and out. +func salsaXOR(tmp *[16]uint32, in, out []uint32) { + w0 := tmp[0] ^ in[0] + w1 := tmp[1] ^ in[1] + w2 := tmp[2] ^ in[2] + w3 := tmp[3] ^ in[3] + w4 := tmp[4] ^ in[4] + w5 := tmp[5] ^ in[5] + w6 := tmp[6] ^ in[6] + w7 := tmp[7] ^ in[7] + w8 := tmp[8] ^ in[8] + w9 := tmp[9] ^ in[9] + w10 := tmp[10] ^ in[10] + w11 := tmp[11] ^ in[11] + w12 := tmp[12] ^ in[12] + w13 := tmp[13] ^ in[13] + w14 := tmp[14] ^ in[14] + w15 := tmp[15] ^ in[15] + + x0, x1, x2, x3, x4, x5, x6, x7, x8 := w0, w1, w2, w3, w4, w5, w6, w7, w8 + x9, x10, x11, x12, x13, x14, x15 := w9, w10, w11, w12, w13, w14, w15 + + for i := 0; i < 8; i += 2 { + u := x0 + x12 + x4 ^= u<<7 | u>>(32-7) + u = x4 + x0 + x8 ^= u<<9 | u>>(32-9) + u = x8 + x4 + x12 ^= u<<13 | u>>(32-13) + u = x12 + x8 + x0 ^= u<<18 | u>>(32-18) + + u = x5 + x1 + x9 ^= u<<7 | u>>(32-7) + u = x9 + x5 + x13 ^= u<<9 | u>>(32-9) + u = x13 + x9 + x1 ^= u<<13 | u>>(32-13) + u = x1 + x13 + x5 ^= u<<18 | u>>(32-18) + + u = x10 + x6 + x14 ^= u<<7 | u>>(32-7) + u = x14 + x10 + x2 ^= u<<9 | u>>(32-9) + u = x2 + x14 + x6 ^= u<<13 | u>>(32-13) + u = x6 + x2 + x10 ^= u<<18 | u>>(32-18) + + u = x15 + x11 + x3 ^= u<<7 | u>>(32-7) + u = x3 + x15 + x7 ^= u<<9 | u>>(32-9) + u = x7 + x3 + x11 ^= u<<13 | u>>(32-13) + u = x11 + x7 + x15 ^= u<<18 | u>>(32-18) + + u = x0 + x3 + x1 ^= u<<7 | u>>(32-7) + u = x1 + x0 + x2 ^= u<<9 | u>>(32-9) + u = x2 + x1 + x3 ^= u<<13 | u>>(32-13) + u = x3 + x2 + x0 ^= u<<18 | u>>(32-18) + + u = x5 + x4 + x6 ^= u<<7 | u>>(32-7) + u = x6 + x5 + x7 ^= u<<9 | u>>(32-9) + u = x7 + x6 + x4 ^= u<<13 | u>>(32-13) + u = x4 + x7 + x5 ^= u<<18 | u>>(32-18) + + u = x10 + x9 + x11 ^= u<<7 | u>>(32-7) + u = x11 + x10 + x8 ^= u<<9 | u>>(32-9) + u = x8 + x11 + x9 ^= u<<13 | u>>(32-13) + u = x9 + x8 + x10 ^= u<<18 | u>>(32-18) + + u = x15 + x14 + x12 ^= u<<7 | u>>(32-7) + u = x12 + x15 + x13 ^= u<<9 | u>>(32-9) + u = x13 + x12 + x14 ^= u<<13 | u>>(32-13) + u = x14 + x13 + x15 ^= u<<18 | u>>(32-18) + } + x0 += w0 + x1 += w1 + x2 += w2 + x3 += w3 + x4 += w4 + x5 += w5 + x6 += w6 + x7 += w7 + x8 += w8 + x9 += w9 + x10 += w10 + x11 += w11 + x12 += w12 + x13 += w13 + x14 += w14 + x15 += w15 + + out[0], tmp[0] = x0, x0 + out[1], tmp[1] = x1, x1 + out[2], tmp[2] = x2, x2 + out[3], tmp[3] = x3, x3 + out[4], tmp[4] = x4, x4 + out[5], tmp[5] = x5, x5 + out[6], tmp[6] = x6, x6 + out[7], tmp[7] = x7, x7 + out[8], tmp[8] = x8, x8 + out[9], tmp[9] = x9, x9 + out[10], tmp[10] = x10, x10 + out[11], tmp[11] = x11, x11 + out[12], tmp[12] = x12, x12 + out[13], tmp[13] = x13, x13 + out[14], tmp[14] = x14, x14 + out[15], tmp[15] = x15, x15 +} + +func blockMix(tmp *[16]uint32, in, out []uint32, r int) { + blockCopy(tmp[:], in[(2*r-1)*16:], 16) + for i := 0; i < 2*r; i += 2 { + salsaXOR(tmp, in[i*16:], out[i*8:]) + salsaXOR(tmp, in[i*16+16:], out[i*8+r*16:]) + } +} + +func integer(b []uint32, r int) uint64 { + j := (2*r - 1) * 16 + return uint64(b[j]) | uint64(b[j+1])<<32 +} + +func smix(b []byte, r, N int, v, xy []uint32) { + var tmp [16]uint32 + x := xy + y := xy[32*r:] + + j := 0 + for i := 0; i < 32*r; i++ { + x[i] = uint32(b[j]) | uint32(b[j+1])<<8 | uint32(b[j+2])<<16 | uint32(b[j+3])<<24 + j += 4 + } + for i := 0; i < N; i += 2 { + blockCopy(v[i*(32*r):], x, 32*r) + blockMix(&tmp, x, y, r) + + blockCopy(v[(i+1)*(32*r):], y, 32*r) + blockMix(&tmp, y, x, r) + } + for i := 0; i < N; i += 2 { + j := int(integer(x, r) & uint64(N-1)) + blockXOR(x, v[j*(32*r):], 32*r) + blockMix(&tmp, x, y, r) + + j = int(integer(y, r) & uint64(N-1)) + blockXOR(y, v[j*(32*r):], 32*r) + blockMix(&tmp, y, x, r) + } + j = 0 + for _, v := range x[:32*r] { + b[j+0] = byte(v >> 0) + b[j+1] = byte(v >> 8) + b[j+2] = byte(v >> 16) + b[j+3] = byte(v >> 24) + j += 4 + } +} + +// Key derives a key from the password, salt, and cost parameters, returning +// a byte slice of length keyLen that can be used as cryptographic key. +// +// N is a CPU/memory cost parameter, which must be a power of two greater than 1. +// r and p must satisfy r * p < 2³â°. If the parameters do not satisfy the +// limits, the function returns a nil byte slice and an error. +// +// For example, you can get a derived key for e.g. AES-256 (which needs a +// 32-byte key) by doing: +// +// dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32) +// +// The recommended parameters for interactive logins as of 2009 are N=16384, +// r=8, p=1. They should be increased as memory latency and CPU parallelism +// increases. Remember to get a good random salt. +func Key(password, salt []byte, N, r, p, keyLen int) ([]byte, error) { + if N <= 1 || N&(N-1) != 0 { + return nil, errors.New("scrypt: N must be > 1 and a power of 2") + } + if uint64(r)*uint64(p) >= 1<<30 || r > maxInt/128/p || r > maxInt/256 || N > maxInt/128/r { + return nil, errors.New("scrypt: parameters are too large") + } + + xy := make([]uint32, 64*r) + v := make([]uint32, 32*N*r) + b := pbkdf2.Key(password, salt, 1, p*128*r, sha256.New) + + for i := 0; i < p; i++ { + smix(b[i*128*r:], r, N, v, xy) + } + + return pbkdf2.Key(password, b, 1, keyLen, sha256.New), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt_test.go new file mode 100644 index 00000000..127596c6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt_test.go @@ -0,0 +1,163 @@ +// Copyright 2012 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 scrypt + +import ( + "bytes" + "testing" +) + +type testVector struct { + password string + salt string + N, r, p int + output []byte +} + +var good = []testVector{ + { + "password", + "salt", + 2, 10, 10, + []byte{ + 0x48, 0x2c, 0x85, 0x8e, 0x22, 0x90, 0x55, 0xe6, 0x2f, + 0x41, 0xe0, 0xec, 0x81, 0x9a, 0x5e, 0xe1, 0x8b, 0xdb, + 0x87, 0x25, 0x1a, 0x53, 0x4f, 0x75, 0xac, 0xd9, 0x5a, + 0xc5, 0xe5, 0xa, 0xa1, 0x5f, + }, + }, + { + "password", + "salt", + 16, 100, 100, + []byte{ + 0x88, 0xbd, 0x5e, 0xdb, 0x52, 0xd1, 0xdd, 0x0, 0x18, + 0x87, 0x72, 0xad, 0x36, 0x17, 0x12, 0x90, 0x22, 0x4e, + 0x74, 0x82, 0x95, 0x25, 0xb1, 0x8d, 0x73, 0x23, 0xa5, + 0x7f, 0x91, 0x96, 0x3c, 0x37, + }, + }, + { + "this is a long \000 password", + "and this is a long \000 salt", + 16384, 8, 1, + []byte{ + 0xc3, 0xf1, 0x82, 0xee, 0x2d, 0xec, 0x84, 0x6e, 0x70, + 0xa6, 0x94, 0x2f, 0xb5, 0x29, 0x98, 0x5a, 0x3a, 0x09, + 0x76, 0x5e, 0xf0, 0x4c, 0x61, 0x29, 0x23, 0xb1, 0x7f, + 0x18, 0x55, 0x5a, 0x37, 0x07, 0x6d, 0xeb, 0x2b, 0x98, + 0x30, 0xd6, 0x9d, 0xe5, 0x49, 0x26, 0x51, 0xe4, 0x50, + 0x6a, 0xe5, 0x77, 0x6d, 0x96, 0xd4, 0x0f, 0x67, 0xaa, + 0xee, 0x37, 0xe1, 0x77, 0x7b, 0x8a, 0xd5, 0xc3, 0x11, + 0x14, 0x32, 0xbb, 0x3b, 0x6f, 0x7e, 0x12, 0x64, 0x40, + 0x18, 0x79, 0xe6, 0x41, 0xae, + }, + }, + { + "p", + "s", + 2, 1, 1, + []byte{ + 0x48, 0xb0, 0xd2, 0xa8, 0xa3, 0x27, 0x26, 0x11, 0x98, + 0x4c, 0x50, 0xeb, 0xd6, 0x30, 0xaf, 0x52, + }, + }, + + { + "", + "", + 16, 1, 1, + []byte{ + 0x77, 0xd6, 0x57, 0x62, 0x38, 0x65, 0x7b, 0x20, 0x3b, + 0x19, 0xca, 0x42, 0xc1, 0x8a, 0x04, 0x97, 0xf1, 0x6b, + 0x48, 0x44, 0xe3, 0x07, 0x4a, 0xe8, 0xdf, 0xdf, 0xfa, + 0x3f, 0xed, 0xe2, 0x14, 0x42, 0xfc, 0xd0, 0x06, 0x9d, + 0xed, 0x09, 0x48, 0xf8, 0x32, 0x6a, 0x75, 0x3a, 0x0f, + 0xc8, 0x1f, 0x17, 0xe8, 0xd3, 0xe0, 0xfb, 0x2e, 0x0d, + 0x36, 0x28, 0xcf, 0x35, 0xe2, 0x0c, 0x38, 0xd1, 0x89, + 0x06, + }, + }, + { + "password", + "NaCl", + 1024, 8, 16, + []byte{ + 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00, 0x78, + 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe, 0x7c, 0x6a, + 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30, 0xe7, 0x73, 0x76, + 0x63, 0x4b, 0x37, 0x31, 0x62, 0x2e, 0xaf, 0x30, 0xd9, + 0x2e, 0x22, 0xa3, 0x88, 0x6f, 0xf1, 0x09, 0x27, 0x9d, + 0x98, 0x30, 0xda, 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, + 0xee, 0x6d, 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, + 0x40, + }, + }, + { + "pleaseletmein", "SodiumChloride", + 16384, 8, 1, + []byte{ + 0x70, 0x23, 0xbd, 0xcb, 0x3a, 0xfd, 0x73, 0x48, 0x46, + 0x1c, 0x06, 0xcd, 0x81, 0xfd, 0x38, 0xeb, 0xfd, 0xa8, + 0xfb, 0xba, 0x90, 0x4f, 0x8e, 0x3e, 0xa9, 0xb5, 0x43, + 0xf6, 0x54, 0x5d, 0xa1, 0xf2, 0xd5, 0x43, 0x29, 0x55, + 0x61, 0x3f, 0x0f, 0xcf, 0x62, 0xd4, 0x97, 0x05, 0x24, + 0x2a, 0x9a, 0xf9, 0xe6, 0x1e, 0x85, 0xdc, 0x0d, 0x65, + 0x1e, 0x40, 0xdf, 0xcf, 0x01, 0x7b, 0x45, 0x57, 0x58, + 0x87, + }, + }, + /* + // Disabled: needs 1 GiB RAM and takes too long for a simple test. + { + "pleaseletmein", "SodiumChloride", + 1048576, 8, 1, + []byte{ + 0x21, 0x01, 0xcb, 0x9b, 0x6a, 0x51, 0x1a, 0xae, 0xad, + 0xdb, 0xbe, 0x09, 0xcf, 0x70, 0xf8, 0x81, 0xec, 0x56, + 0x8d, 0x57, 0x4a, 0x2f, 0xfd, 0x4d, 0xab, 0xe5, 0xee, + 0x98, 0x20, 0xad, 0xaa, 0x47, 0x8e, 0x56, 0xfd, 0x8f, + 0x4b, 0xa5, 0xd0, 0x9f, 0xfa, 0x1c, 0x6d, 0x92, 0x7c, + 0x40, 0xf4, 0xc3, 0x37, 0x30, 0x40, 0x49, 0xe8, 0xa9, + 0x52, 0xfb, 0xcb, 0xf4, 0x5c, 0x6f, 0xa7, 0x7a, 0x41, + 0xa4, + }, + }, + */ +} + +var bad = []testVector{ + {"p", "s", 0, 1, 1, nil}, // N == 0 + {"p", "s", 1, 1, 1, nil}, // N == 1 + {"p", "s", 7, 8, 1, nil}, // N is not power of 2 + {"p", "s", 16, maxInt / 2, maxInt / 2, nil}, // p * r too large +} + +func TestKey(t *testing.T) { + for i, v := range good { + k, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, len(v.output)) + if err != nil { + t.Errorf("%d: got unexpected error: %s", i, err) + } + if !bytes.Equal(k, v.output) { + t.Errorf("%d: expected %x, got %x", i, v.output, k) + } + } + for i, v := range bad { + _, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, 32) + if err == nil { + t.Errorf("%d: expected error, got nil", i) + } + } +} + +func BenchmarkKey(b *testing.B) { + for i := 0; i < b.N; i++ { + _, err := Key([]byte("password"), []byte("salt"), 16384, 8, 1, 64) + if err != nil { + b.Error(err) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/README.md new file mode 100644 index 00000000..6bbf7f4f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/README.md @@ -0,0 +1,5 @@ +# secp256k1-go + +golang secp256k1 library + +Implements cryptographic operations for the secp256k1 ECDSA curve used by Bitcoin. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_rand.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_rand.go new file mode 100644 index 00000000..3a785a9e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_rand.go @@ -0,0 +1,151 @@ +package secp256k1 + +import ( + crand "crypto/rand" // secure, system random number generator + "crypto/sha256" + "hash" + "io" + "log" + "os" + "strconv" + "strings" + "sync" + "time" +) + +var ( + // Memory pool for SHA256 hashes + sha256HashPoolSize = 30 + sha256HashPool chan hash.Hash +) + +// SumSHA256 sum sha256 +func SumSHA256(b []byte) []byte { + sha256Hash := <-sha256HashPool + sha256Hash.Reset() + // sha256.Write never returns an error + sha256Hash.Write(b) //nolint:errcheck + sum := sha256Hash.Sum(nil) + sha256HashPool <- sha256Hash + return sum[:] +} + +/* +Entropy pool needs +- state (an array of bytes) +- a compression function (two 256 bit blocks to single block) +- a mixing function across the pool + +- Xor is safe, as it cannot make value less random +-- apply compression function, then xor with current value +-- + +*/ + +// EntropyPool entropy pool +type EntropyPool struct { + Ent [32]byte // 256 bit accumulator + lock sync.Mutex +} + +// Mix256 mixes in 256 bits, outputs 256 bits +func (ep *EntropyPool) Mix256(in []byte) (out []byte) { + // hash input + val1 := SumSHA256(in) + // return value + ep.lock.Lock() + val2 := SumSHA256(append(val1, ep.Ent[:]...)) + // next ent value + val3 := SumSHA256(append(val1, val2...)) + + for i := 0; i < 32; i++ { + ep.Ent[i] = val3[i] + val3[i] = 0x00 + } + ep.lock.Unlock() + + return val2 +} + +// Mix take in N bytes, salts, return N +func (ep *EntropyPool) Mix(in []byte) []byte { + length := len(in) - len(in)%32 + 32 + buff := make([]byte, length) + for i := 0; i < len(in); i++ { + buff[i] = in[i] + } + iterations := (len(in) / 32) + 1 + for i := 0; i < iterations; i++ { + tmp := ep.Mix256(buff[32*i : 32+32*i]) //32 byte slice + for j := 0; j < 32; j++ { + buff[i*32+j] = tmp[j] + } + } + return buff[:len(in)] +} + +/* +Note: + +- On windows cryto/rand uses CrytoGenRandom which uses RC4 which is insecure +- Android random number generator is known to be insecure. +- Linux uses /dev/urandom , which is thought to be secure and uses entropy pool + +Therefore the output is salted. +*/ + +/* +Note: + +Should allow pseudo-random mode for repeatability for certain types of tests +*/ + +var _ent EntropyPool + +// seed pseudo random number generator with +// - hash of system time in nano seconds +// - hash of system environmental variables +// - hash of process id +func init() { + // init the hash reuse pool + sha256HashPool = make(chan hash.Hash, sha256HashPoolSize) + for i := 0; i < sha256HashPoolSize; i++ { + sha256HashPool <- sha256.New() + } + + seed1 := []byte(strconv.FormatUint(uint64(time.Now().UnixNano()), 16)) + seed2 := []byte(strings.Join(os.Environ(), "")) + seed3 := []byte(strconv.FormatUint(uint64(os.Getpid()), 16)) + + seed4 := make([]byte, 256) + _, err := io.ReadFull(crand.Reader, seed4) // system secure random number generator + if err != nil { + log.Panic(err) + } + + // seed entropy pool + _ent.Mix256(seed1) + _ent.Mix256(seed2) + _ent.Mix256(seed3) + _ent.Mix256(seed4) +} + +// RandByte Secure Random number generator for forwards security +// On Unix-like systems, Reader reads from /dev/urandom. +// On Windows systems, Reader uses the CryptGenRandom API. +// Pseudo-random sequence, seeded from program start time, environmental variables, +// and process id is mixed in for forward security. Future version should use entropy pool +func RandByte(n int) []byte { + buff := make([]byte, n) + _, err := io.ReadFull(crand.Reader, buff) // system secure random number generator + if err != nil { + log.Panic(err) + } + + // XORing in sequence, cannot reduce security (even if sequence is bad/known/non-random) + buff2 := _ent.Mix(buff) + for i := 0; i < n; i++ { + buff[i] ^= buff2[i] + } + return buff +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_test.go new file mode 100644 index 00000000..87afb3fd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_test.go @@ -0,0 +1,993 @@ +package secp256k1 + +import ( + "bytes" + "encoding/hex" + "log" + "testing" +) + +const TESTS = 10000 // number of tests to use for random tests + +func TestRandByte(t *testing.T) { + nonce := RandByte(32) + if len(nonce) != 32 { + t.Fatal() + } +} + +func TestBitTwiddle(t *testing.T) { + // test agreement for highest bit test + var b byte + for i := 0; i < 512; i++ { + bool1 := ((b >> 7) == 1) + bool2 := ((b & 0x80) == 0x80) + if bool1 != bool2 { + t.Fatal() + } + b++ + } +} + +// assertSigCompact tests for signature malleability +// highest bit of S must be 0; 32nd byte +func assertSigCompact(sig []byte) { + b := int(sig[32]) + if b < 0 { + log.Panic() + } + if ((b >> 7) == 1) != ((b & 0x80) == 0x80) { + log.Panicf("b=%v b2=%v", b, b>>7) + } + if (b & 0x80) == 0x80 { + log.Panicf("b=%v b2=%v", b, b&0x80) + } +} + +func TestGenerateKeyPairValidKeys(t *testing.T) { + pubkey, seckey := GenerateKeyPair() + if VerifySeckey(seckey) != 1 { + t.Fatal() + } + if VerifyPubkey(pubkey) != 1 { + t.Fatal() + } +} + +func TestPubkeyFromSeckey(t *testing.T) { + // test compressed pubkey from private key + // http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html + privkey, err := hex.DecodeString(`f19c523315891e6e15ae0608a35eec2e00ebd6d1984cf167f46336dabd9b2de4`) + if err != nil { + t.Fatal() + } + + desiredPubKey, err := hex.DecodeString(`03fe43d0c2c3daab30f9472beb5b767be020b81c7cc940ed7a7e910f0c1d9feef1`) + if err != nil { + t.Fatal() + } + + if pubkey := PubkeyFromSeckey(privkey); pubkey == nil { + t.Fatal() + } else if !bytes.Equal(pubkey, desiredPubKey) { + t.Fatal() + } +} + +func TestUncompressedPubkeyFromSeckey(t *testing.T) { + // test uncompressed pubkey from private key + // http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html + privkey, err := hex.DecodeString(`f19c523315891e6e15ae0608a35eec2e00ebd6d1984cf167f46336dabd9b2de4`) + if err != nil { + t.Fatal() + } + + desiredPubKey, err := hex.DecodeString(`04fe43d0c2c3daab30f9472beb5b767be020b81c7cc940ed7a7e910f0c1d9feef10fe85eb3ce193405c2dd8453b7aeb6c1752361efdbf4f52ea8bf8f304aab37ab`) + if err != nil { + t.Fatal() + } + + if pubkey := UncompressedPubkeyFromSeckey(privkey); pubkey == nil { + t.Fatal() + } else if !bytes.Equal(pubkey, desiredPubKey) { + t.Fatal() + } +} + +// returns random pubkey, seckey, hash and signature +func randX() ([]byte, []byte, []byte, []byte) { + pubkey, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + return pubkey, seckey, msg, sig +} + +func TestSignatureVerifyPubkey(t *testing.T) { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + if VerifyPubkey(pubkey1) == 0 { + t.Fail() + } + pubkey2 := RecoverPubkey(msg, sig) + if !bytes.Equal(pubkey1, pubkey2) { + t.Fatal("Recovered pubkey does not match") + } +} + +func TestVerifyFunctions(t *testing.T) { + pubkey, seckey, hash, sig := randX() + if VerifySeckey(seckey) == 0 { + t.Fail() + } + if VerifyPubkey(pubkey) == 0 { + t.Fail() + } + if VerifySignature(hash, sig, pubkey) == 0 { + t.Fail() + } +} + +func TestSignOutputSizes(t *testing.T) { + // test size of messages + pubkey, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + assertSigCompact(sig) + if sig == nil { + t.Fatal("Signature nil") + } + if len(pubkey) != 33 { + t.Fail() + } + if len(seckey) != 32 { + t.Fail() + } + if len(sig) != 64+1 { + t.Fail() + } + if int(sig[64]) > 4 { + t.Fail() + } // recovery ID, should be 0 to 4 +} + +func TestRecoverVerifySignature1(t *testing.T) { + // test signing message + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + if sig == nil { + t.Fatal("Signature nil") + } + + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + t.Fatal("Recovered pubkey invalid") + } + if !bytes.Equal(pubkey1, pubkey2) { + t.Fatal("Recovered pubkey does not match") + } + + ret := VerifySignature(msg, sig, pubkey1) + if ret != 1 { + t.Fatal("Signature invalid") + } +} + +func TestVerifySignatureFailure(t *testing.T) { + p, s := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, s) + if sig == nil { + t.Fatal("Signature nil") + } + + p2, _ := GenerateKeyPair() + + if bytes.Equal(p, p2) { + t.Fatal("GenerateKeyPair returned the same keys twice") + } + + // Signature has different pubkey + ret := VerifySignature(msg, sig, p2) + if ret == 1 { + t.Fatal("Signature unexpectedly valid") + } + + msg2 := RandByte(32) + sig2 := Sign(msg2, s) + + // Signature is for a different message + ret = VerifySignature(msg, sig2, p) + if ret == 1 { + t.Fatal("Signature unexpectedly valid") + } + + // Signature is for a different message + ret = VerifySignature(msg2, sig, p) + if ret == 1 { + t.Fatal("Signature unexpectedly valid") + } + + // Signature is for a different message + msg3 := RandByte(32) + ret = VerifySignature(msg3, sig, p) + if ret == 1 { + t.Fatal("Signature unexpectedly valid") + } +} + +func TestRecoverVerifySignature2(t *testing.T) { + // test pubkey recovery + pubkey1, seckey1 := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey1) + + if sig == nil { + t.Fatal("Signature nil") + } + ret := VerifySignature(msg, sig, pubkey1) + if ret != 1 { + t.Fatal("Signature invalid") + } + + pubkey2 := RecoverPubkey(msg, sig) + if len(pubkey1) != len(pubkey2) { + t.Fatal() + } + for i := range pubkey1 { + if pubkey1[i] != pubkey2[i] { + t.Fatal() + } + } + if !bytes.Equal(pubkey1, pubkey2) { + t.Fatal() + } +} + +func TestRecoverPubkey1(t *testing.T) { + // test random messages for the same pub/private key + _, seckey := GenerateKeyPair() + for i := 0; i < TESTS; i++ { + msg := RandByte(32) + sig := Sign(msg, seckey) + assertSigCompact(sig) + + sig[len(sig)-1] %= 4 + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + t.Fail() + } + } +} + +func TestRecoverPubkey2(t *testing.T) { + // test random messages for different pub/private keys + for i := 0; i < TESTS; i++ { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + assertSigCompact(sig) + + if sig[len(sig)-1] >= 4 { + t.Fail() + } + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + t.Fail() + } + if !bytes.Equal(pubkey1, pubkey2) { + t.Fail() + } + } +} + +func randSig() []byte { + sig := RandByte(65) + sig[32] &= 0x70 + sig[64] %= 4 + return sig +} + +func TestRecoverVerifySignature3(t *testing.T) { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + + if sig == nil { + t.Fail() + } + if len(sig) != 65 { + t.Fail() + } + for i := 0; i < TESTS; i++ { + sig = randSig() + pubkey2 := RecoverPubkey(msg, sig) + + if bytes.Equal(pubkey1, pubkey2) { + t.Fail() + } + + if pubkey2 != nil && VerifySignature(msg, sig, pubkey2) != 1 { + t.Fail() + } + + if VerifySignature(msg, sig, pubkey1) == 1 { + t.Fail() + } + } +} + +func TestRecoverVerifySignature4(t *testing.T) { + // test random messages against valid signature: should fail + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + + failCount := 0 + for i := 0; i < TESTS; i++ { + msg = RandByte(32) + pubkey2 := RecoverPubkey(msg, sig) + if bytes.Equal(pubkey1, pubkey2) { + t.Fail() + } + + if pubkey2 != nil && VerifySignature(msg, sig, pubkey2) != 1 { + t.Fail() + } + + if VerifySignature(msg, sig, pubkey1) == 1 { + t.Fail() + } + } + if failCount != 0 { + t.Errorf("ERROR: Accepted signature for %v of %v random messages", failCount, TESTS) + } +} + +/* + Deterministic Keypair Tests +*/ + +func TestDeterministicKeypairs00(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(64) + _, pub1, sec1 := DeterministicKeyPairIterator(seed) + pub2, sec2 := GenerateDeterministicKeyPair(seed) + + if !bytes.Equal(pub1, pub2) { + t.Fail() + } + if !bytes.Equal(sec1, sec2) { + t.Fail() + } + } +} + +func TestDeterministicKeypairs01(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(32) + _, pub1, sec1 := DeterministicKeyPairIterator(seed) + pub2, sec2 := GenerateDeterministicKeyPair(seed) + + if !bytes.Equal(pub1, pub2) { + t.Fail() + } + if !bytes.Equal(sec1, sec2) { + t.Fail() + } + } +} + +func TestDeterministicKeypairs02(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(32) + _, pub1, sec1 := DeterministicKeyPairIterator(seed) + pub2, sec2 := GenerateDeterministicKeyPair(seed) + + if !bytes.Equal(pub1, pub2) { + t.Fail() + } + if !bytes.Equal(sec1, sec2) { + t.Fail() + } + } +} + +func MustDecodeHex(str string) []byte { + b, err := hex.DecodeString(str) + if err != nil { + panic(err) + } + return b +} + +func TestDeterministicKeypairs03(t *testing.T) { + cases := []struct { + seed string + seckey string + pubkey string + }{ + { + seed: "tQ93w5Aqcunm9SGUfnmF4fJv", + seckey: "9b8c3e36adce64dedc80d6dfe51ff1742cc1d755bbad457ac01177c5a18a789f", + pubkey: "03996e65d79e957ce1eafb57453e55b55906e04c8de556e54961eb06a4836c06df", + }, + { + seed: "DC7qdQQtbWSSaekXnFmvQgse", + seckey: "d2deaf4a9ff7a5111fe1d429d6976cbde78811fdd075371a2a4449bb0f4d8bf9", + pubkey: "0283a86efb1b8d82147c336c83d991f8124f0c4ca62c1019d6af1db46ae34594be", + }, + { + seed: "X8EkuUZC7Td7PAXeS7Duc7vR", + seckey: "cad79b6dcf7bd21891cbe20a51c57d59689ae6e3dc482cd6ec22898ac00cd86b", + pubkey: "03f1fbd857b8a19de3ae35d616d41f179c0f3de94231e3caabf34eabf4674a1643", + }, + { + seed: "tVqPYHHNVPRWyEed62v7f23u", + seckey: "2a386e94e9ffaa409517cbed81b9b2d4e1c5fb4afe3cbd67ce8aba11af0b02fa", + pubkey: "03ebde2c29e3beadab6f324ceb82a71c23655678e47d97f1d92159c3d7e4b59be4", + }, + { + seed: "kCy4R57HDfLqF3pVhBWxuMcg", + seckey: "26a7c6d8809c476a56f7455209f58b5ff3f16435fcf208ff2931ece60067f305", + pubkey: "03b27bd3ae6b9034a4ffb2173381448c724f649fd0ec14ee0288758aa7812a7338", + }, + { + seed: "j8bjv86ZNjKqzafR6mtSUVCE", + seckey: "ea5c0f8c9f091a70bf38327adb9b2428a9293e7a7a75119920d759ecfa03a995", + pubkey: "0236b5d52711f8a11da664c57da4378690751016ecf3089eed4ed1833c610046b6", + }, + { + seed: "qShryAzVY8EtsuD3dsAc7qnG", + seckey: "331206176509bcae31c881dc51e90a4e82ec33cd7208a5fb4171ed56602017fa", + pubkey: "02da2aab09ec94e8a40d7381f72ff6585bf7d87e4a599d1408d2686ce5514692b1", + }, + { + seed: "5FGG7ZBa8wVMBJkmzpXj5ESX", + seckey: "4ea2ad82e7730d30c0c21d01a328485a0cf5543e095139ba613929be7739b52c", + pubkey: "02b7d159de0d705c99e24d609b1591b1fac86d46c2c99e2ce6cc20b7402e32215c", + }, + { + seed: "f46TZG4xJHXUGWx8ekbNqa9F", + seckey: "dcddd403d3534c4ef5703cc07a771c107ed49b7e0643c6a2985a96149db26108", + pubkey: "03e709fbdaf4f3b913b8c4ea887d1fea61ed356fcf0178ee7c2b556ce308cfc001", + }, + { + seed: "XkZdQJ5LT96wshN8JBH8rvEt", + seckey: "3e276219081f072dff5400ca29a9346421eaaf3c419ff1474ac1c81ad8a9d6e1", + pubkey: "03a34782043386f068780cc82d0deffcea1703e4e4bbe67537a89bda0fbd3240e0", + }, + { + seed: "GFDqXU4zYymhJJ9UGqRgS8ty", + seckey: "95be4163085b571e725edeffa83fff8e7a7db3c1ccab19d0f3c6e105859b5e10", + pubkey: "03ad4b4525c6031c2fa3c43722ca6dbde64b30d646b8914b0391096d8964e5d4da", + }, + { + seed: "tmwZksH2XyvuamnddYxyJ5Lp", + seckey: "2666dd54e469df56c02e82dffb4d3ea067daafe72c54dc2b4f08c4fb3a7b7e42", + pubkey: "03f127118872ac5cb83b9167e561a28d82f4691d06297051dc71fb97d00b42aa20", + }, + { + seed: "EuqZFsbAV5amTzkhgAMgjr7W", + seckey: "40c325c01f2e4087fcc97fcdbea6c35c88a12259ebf1bce0b14a4d77f075abbf", + pubkey: "03df10131650e63894e6c43427fc9ad0119a956ef1821c68f0e09e7d90411e6c39", + }, + { + seed: "TW6j8rMffZfmhyDEt2JUCrLB", + seckey: "e676e0685c5d1afd43ad823b83db5c6100135c35485146276ee0b0004bd6689e", + pubkey: "03f9ead3620dfcfcf731d42b0752a2e1549b0190070eed686002e02f58da955731", + }, + { + seed: "8rvkBnygfhWP8kjX9aXq68CY", + seckey: "21450a646eed0d4aa50a1736e6c9bf99fff006a470aab813a2eff3ee4d460ae4", + pubkey: "026ace328af3200b4abe13a29125545bd9d82cc32eed13b782371ef54fb6301d6c", + }, + { + seed: "phyRfPDuf9JMRFaWdGh7NXPX", + seckey: "ca7bc04196c504d0e815e125f7f1e086c8ae8c10d5e9df984aeab4b41bf9e398", + pubkey: "03fc05f68ef56235b777168c45d46dfb8f665d12e4f92265305b2e66aafe000351", + }, + } + + for _, tc := range cases { + t.Run(tc.seed, func(t *testing.T) { + seed := []byte(tc.seed) + sec1 := MustDecodeHex(tc.seckey) + pub1 := MustDecodeHex(tc.pubkey) + + pub2, sec2 := GenerateDeterministicKeyPair(seed) + if !bytes.Equal(sec1, sec2) { + t.Error("seckeys don't match") + } + + if !bytes.Equal(pub1, pub2) { + t.Errorf("pubkeys don't match: %s != %s", tc.pubkey, hex.EncodeToString(pub2)) + } + }) + } +} + +func TestDeterministicKeyPairIterator1(t *testing.T) { + cases := []struct { + seed string + seckey string + pubkey string + nextSeed string + }{ + { + seed: "90c56f5b8d78a46fb4cddf6fd9c6d88d6d2d7b0ec35917c7dac12c03b04e444e", + seckey: "94dd1a9de9ffd57b5516b8a7f090da67f142f7d22356fa5d1b894ee4d4fba95b", + pubkey: "03eb71274ba23438f4ce6ac125e20bb78cd8123dc9483b5f34ace67cb6972e4ca8", + nextSeed: "a70c36286be722d8111e69e910ce4490005bbf9135b0ce8e7a59f84eee24b88b", + }, + { + seed: "a3b08ccf8cbae4955c02f223be1f97d2bb41d92b7f0c516eb8467a17da1e6057", + seckey: "82fba4cc2bc29eef122f116f45d01d82ff488d7ee713f8a95c162a64097239e0", + pubkey: "02be1c44351c2e4295e4e9257667b164e2a0e471ecf499084357c13e1b5119b4c2", + nextSeed: "e9db072fe5817325504174253a056be7b53b512f1e588f576f1f5a82cdcad302", + }, + { + seed: "7048eb8fa93cec992b93dc8e93c5543be34aad05239d4c036cf9e587bbcf7654", + seckey: "44c059496aac871ac168bb6889b9dd3decdb9e1fa082442a95fcbca982643425", + pubkey: "028868f984547f2febcdd9087a1cc3528929598b1afc9feec0fa62233052bff401", + nextSeed: "5e9133e83c4add2b0420d485e1dcda5c00e283c6509388ab8ceb583b0485c13b", + }, + { + seed: "6d25375591bbfce7f601fc5eb40e4f3dde2e453dc4bf31595d8ec29e4370cd80", + seckey: "d709ceb1a6fb906de506ea091c844ca37c65e52778b8d257d1dd3a942ab367fb", + pubkey: "035f0b2cd081f6dd45178d87be62c88b020599292cf77834d8a4dab7a7aad6b1be", + nextSeed: "8d5579cd702c06c40fb98e1d55121ea0d29f3a6c42f5582b902ac243f29b571a", + }, + { + seed: "7214b4c09f584c5ddff971d469df130b9a3c03e0277e92be159279de39462120", + seckey: "5fe4986fa964773041e119d2b6549acb392b2277a72232af75cbfb62c357c1a7", + pubkey: "032e039b5885d2d6001b2b5eb4b0af473befa04d2d9fbc4c12ef78f30fe186e487", + nextSeed: "3a4e8c72921099a0e6a4e7f979df4c8bced63063097835cdfd5ee94548c9c41a", + }, + { + seed: "b13e78392d5446ae304b5fc9d45b85f26996982b2c0c86138afdac8d2ea9016e", + seckey: "f784abc2e7f11ee84b4adb72ea4730a6aabe27b09604c8e2b792d8a1a31881ac", + pubkey: "02f32b1960c1e61ccc58bb458b8e6fc74a2c37fcb1deb0708251b35e55ba11795e", + nextSeed: "462efa1bf4f639ffaedb170d6fb8ba363efcb1bdf0c5aef0c75afb59806b8053", + }, + { + seed: "9403bff4240a5999e17e0ab4a645d6942c3a7147c7834e092e461a4580249e6e", + seckey: "d495174b8d3f875226b9b939121ec53f9383bd560d34aa5ca3ac6b257512adf4", + pubkey: "03f60cefd9bcc6f38487ae082d475c86ee086f0dfed25ff8758c1a9b06862dd0b8", + nextSeed: "68dd702ea7c7352632876e9dc2333142fce857a542726e402bb480cad364f260", + }, + { + seed: "2665312a3e3628f4df0b9bc6334f530608a9bcdd4d1eef174ecda99f51a6db94", + seckey: "1fdc9fbfc6991b9416b3a8385c9942e2db59009aeb2d8de349b73d9f1d389374", + pubkey: "029a3b04c75549c8a509fb42a2fa4e8d8361bbe543ee93ccecea90411924f5ab5b", + nextSeed: "5db72c31d575c332e60f890c7e68d59bd3d0ac53a832e06e821d819476e1f010", + }, + { + seed: "6cb37532c80765b7c07698502a49d69351036f57a45a5143e33c57c236d841ca", + seckey: "c87c85a6f482964db7f8c31720981925b1e357a9fdfcc585bc2164fdef1f54d0", + pubkey: "02b0f062bdf46066a9a7adb9337a6741ffe95ec26c5652d178dfff88ad302c962d", + nextSeed: "0deb20ec503b4c678213979fd98018c56f24e9c1ec99af3cd84b43c161a9bb5c", + }, + { + seed: "8654a32fa120bfdb7ca02c487469070eba4b5a81b03763a2185fdf5afd756f3c", + seckey: "e2767d788d1c5620f3ef21d57f2d64559ab203c044f0a5f0730b21984e77019c", + pubkey: "03251fa5b85a9ada12787234e0ceb3dcc5bd58a49c15ac0749a4238f3bca6d9a1d", + nextSeed: "36f3ede761aa683813013ffa84e3738b870ce7605e0a958ed4ffb540cd3ea504", + }, + { + seed: "66d1945ceb6ef8014b1b6703cb624f058913e722f15d03225be27cb9d8aabe4a", + seckey: "3fcb80eb1d5b91c491408447ac4e221fcb2254c861adbb5a178337c2750b0846", + pubkey: "03975043476a76b72b093d684b8a0979d8b246c2f99f16f95760d6d3490c2e37a1", + nextSeed: "6bcb4819a96508efa7e32ee52b0227ccf5fbe5539687aae931677b24f6d0bbbd", + }, + { + seed: "22c7623bf0e850538329e3e6d9a6f9b1235350824a3feaad2580b7a853550deb", + seckey: "5577d4be25f1b44487140a626c8aeca2a77507a1fc4fd466dd3a82234abb6785", + pubkey: "0262e2054c89ad173f741e413d12f511a2cf98783c43f18f8dbb6274bdd584a3dc", + nextSeed: "8bb257a1a17fd2233935b33441d216551d5ff1553d02e4013e03f14962615c16", + }, + { + seed: "a5eebe3469d68c8922a1a8b5a0a2b55293b7ff424240c16feb9f51727f734516", + seckey: "c07275582d0681eb07c7b51f0bca0c48c056d571b7b83d84980ab40ac7d7d720", + pubkey: "03d80474b8e6002793374a99d884605cf022d216573459b7deb19b6ccb110d286a", + nextSeed: "d6b780983a63a3e4bcf643ee68b686421079c835a99eeba6962fe41bb355f8da", + }, + { + seed: "479ec3b589b14aa7290b48c2e64072e4e5b15ce395d2072a5a18b0a2cf35f3fd", + seckey: "f10e2b7675dfa557d9e3188469f12d3e953c2d46dce006cd177b6ae7f465cfc0", + pubkey: "0219d5b487ebdf719a994dcde094072e0227fc23e4cdbc4cce3b9d3e4a4ffe0668", + nextSeed: "39c5f108e7017e085fe90acfd719420740e57768ac14c94cb020d87e36d06752", + }, + { + seed: "63952334b731ec91d88c54614925576f82e3610d009657368fc866e7b1efbe73", + seckey: "0bcbebb39d8fe1cb3eab952c6f701656c234e462b945e2f7d4be2c80b8f2d974", + pubkey: "02b58d9eb9595c24438a6ae4a4be4a408c0cd7a3017c3780cba253171cc9e62627", + nextSeed: "79f654976732106c0e4a97ab3b6d16f343a05ebfcc2e1d679d69d396e6162a77", + }, + { + seed: "256472ee754ef6af096340ab1e161f58e85fb0cc7ae6e6866b9359a1657fa6c1", + seckey: "88ba6f6c66fc0ef01c938569c2dd1f05475cb56444f4582d06828e77d54ffbe6", + pubkey: "02dac6b246a06ac7c38a63f4f10b1344a8cd6f920a8fd74523bd2f5d4a9a3055b2", + nextSeed: "387883b86e2acc153aa334518cea48c0c481b573ccaacf17c575623c392f78b2", + }, + } + + for _, tc := range cases { + t.Run(tc.seed, func(t *testing.T) { + seed := MustDecodeHex(tc.seed) + seckey1 := MustDecodeHex(tc.seckey) + pubkey1 := MustDecodeHex(tc.pubkey) + nextSeed1 := MustDecodeHex(tc.nextSeed) + nextSeed2, pubkey2, seckey2 := DeterministicKeyPairIterator(seed) + if !bytes.Equal(seckey1, seckey2) { + t.Error("seckeys don't match") + } + if !bytes.Equal(pubkey1, pubkey2) { + t.Errorf("pubkeys don't match: %s != %s", tc.pubkey, hex.EncodeToString(pubkey2)) + } + if !bytes.Equal(nextSeed1, nextSeed2) { + t.Errorf("nextSeeds don't match: %s != %s", tc.nextSeed, hex.EncodeToString(nextSeed2)) + } + }) + } +} + +func TestSecp256k1Hash(t *testing.T) { + cases := []struct { + seed string + hash string + }{ + { + seed: "90c56f5b8d78a46fb4cddf6fd9c6d88d6d2d7b0ec35917c7dac12c03b04e444e", + hash: "a70c36286be722d8111e69e910ce4490005bbf9135b0ce8e7a59f84eee24b88b", + }, + { + seed: "a3b08ccf8cbae4955c02f223be1f97d2bb41d92b7f0c516eb8467a17da1e6057", + hash: "e9db072fe5817325504174253a056be7b53b512f1e588f576f1f5a82cdcad302", + }, + { + seed: "7048eb8fa93cec992b93dc8e93c5543be34aad05239d4c036cf9e587bbcf7654", + hash: "5e9133e83c4add2b0420d485e1dcda5c00e283c6509388ab8ceb583b0485c13b", + }, + { + seed: "6d25375591bbfce7f601fc5eb40e4f3dde2e453dc4bf31595d8ec29e4370cd80", + hash: "8d5579cd702c06c40fb98e1d55121ea0d29f3a6c42f5582b902ac243f29b571a", + }, + { + seed: "7214b4c09f584c5ddff971d469df130b9a3c03e0277e92be159279de39462120", + hash: "3a4e8c72921099a0e6a4e7f979df4c8bced63063097835cdfd5ee94548c9c41a", + }, + { + seed: "b13e78392d5446ae304b5fc9d45b85f26996982b2c0c86138afdac8d2ea9016e", + hash: "462efa1bf4f639ffaedb170d6fb8ba363efcb1bdf0c5aef0c75afb59806b8053", + }, + { + seed: "9403bff4240a5999e17e0ab4a645d6942c3a7147c7834e092e461a4580249e6e", + hash: "68dd702ea7c7352632876e9dc2333142fce857a542726e402bb480cad364f260", + }, + { + seed: "2665312a3e3628f4df0b9bc6334f530608a9bcdd4d1eef174ecda99f51a6db94", + hash: "5db72c31d575c332e60f890c7e68d59bd3d0ac53a832e06e821d819476e1f010", + }, + { + seed: "6cb37532c80765b7c07698502a49d69351036f57a45a5143e33c57c236d841ca", + hash: "0deb20ec503b4c678213979fd98018c56f24e9c1ec99af3cd84b43c161a9bb5c", + }, + { + seed: "8654a32fa120bfdb7ca02c487469070eba4b5a81b03763a2185fdf5afd756f3c", + hash: "36f3ede761aa683813013ffa84e3738b870ce7605e0a958ed4ffb540cd3ea504", + }, + { + seed: "66d1945ceb6ef8014b1b6703cb624f058913e722f15d03225be27cb9d8aabe4a", + hash: "6bcb4819a96508efa7e32ee52b0227ccf5fbe5539687aae931677b24f6d0bbbd", + }, + { + seed: "22c7623bf0e850538329e3e6d9a6f9b1235350824a3feaad2580b7a853550deb", + hash: "8bb257a1a17fd2233935b33441d216551d5ff1553d02e4013e03f14962615c16", + }, + { + seed: "a5eebe3469d68c8922a1a8b5a0a2b55293b7ff424240c16feb9f51727f734516", + hash: "d6b780983a63a3e4bcf643ee68b686421079c835a99eeba6962fe41bb355f8da", + }, + { + seed: "479ec3b589b14aa7290b48c2e64072e4e5b15ce395d2072a5a18b0a2cf35f3fd", + hash: "39c5f108e7017e085fe90acfd719420740e57768ac14c94cb020d87e36d06752", + }, + { + seed: "63952334b731ec91d88c54614925576f82e3610d009657368fc866e7b1efbe73", + hash: "79f654976732106c0e4a97ab3b6d16f343a05ebfcc2e1d679d69d396e6162a77", + }, + { + seed: "256472ee754ef6af096340ab1e161f58e85fb0cc7ae6e6866b9359a1657fa6c1", + hash: "387883b86e2acc153aa334518cea48c0c481b573ccaacf17c575623c392f78b2", + }, + } + + for _, tc := range cases { + t.Run(tc.seed, func(t *testing.T) { + seed := MustDecodeHex(tc.seed) + if len(seed) != 32 { + t.Fatal("expected seed to be 32 bytes") + } + hash := Secp256k1Hash(seed) + if len(hash) != 32 { + t.Fatal("expected hash to be 32 bytes") + } + if !bytes.Equal(MustDecodeHex(tc.hash), hash) { + t.Fatal("secp256k1Hash does not match") + } + }) + } +} + +func TestSecp256k1Equal(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(128) + + hash1 := Secp256k1Hash(seed) + hash2, _, _ := DeterministicKeyPairIterator(seed) + + if !bytes.Equal(hash1, hash2) { + t.Fail() + } + } +} + +func TestECDH(t *testing.T) { + pubkey1, seckey1 := GenerateKeyPair() + pubkey2, seckey2 := GenerateKeyPair() + + puba := ECDH(pubkey1, seckey2) + pubb := ECDH(pubkey2, seckey1) + + if puba == nil { + t.Fail() + } + + if pubb == nil { + t.Fail() + } + + if !bytes.Equal(puba, pubb) { + t.Fail() + } +} + +func TestECDH2(t *testing.T) { + for i := 0; i < 16*1024; i++ { + + pubkey1, seckey1 := GenerateKeyPair() + pubkey2, seckey2 := GenerateKeyPair() + + puba := ECDH(pubkey1, seckey2) + pubb := ECDH(pubkey2, seckey1) + + if puba == nil { + t.Fail() + } + + if pubb == nil { + t.Fail() + } + + if !bytes.Equal(puba, pubb) { + t.Fail() + } + } +} + +func TestDeterministicKeyPairIteratorStepRandom(t *testing.T) { + n := 32 * 1024 + for i := 0; i < n; i++ { + seed := RandByte(32) + + pubkey1, seckey1 := deterministicKeyPairIteratorStep(seed) + + if seckey1 == nil { + t.Fail() + } + + if pubkey1 == nil { + t.Fail() + } + + if VerifyPubkey(pubkey1) != 1 { + seedHex := hex.EncodeToString(seed) + seckeyHex := hex.EncodeToString(seckey1) + t.Logf("seed=%s", seedHex) + t.Logf("seckey=%s", seckeyHex) + t.Errorf("GenerateKeyPair, generates key that fails validation, run=%d", i) + } + } +} + +// problematic seckeys +// See: https://github.com/piotrnar/gocoin/issues/15 +// For additional information on the origin of these test vectors +var abnormalSecKeys = []struct { + sec string + pub string + ecdh []string +}{ + { + sec: "08efb79385c9a8b0d1c6f5f6511be0c6f6c2902963d874a3a4bacc18802528d3", + pub: "03c74332d6094b1f603d4902fc6b1aa09fb3ef81f3015a4000cc0077ff70543c16", + ecdh: []string{ + "", + "02e72655a3adf8308a078ee6fe948cf6baf95ef626b1e1fe6e434c737c7c2fef4e", + "03222fe59be5a69c38364dd313bd077b8b1c2216804a4a727e0078b3c77778bc45", + "021096aa98231eaa949542be029a1f3a93815e05e243c69e73d7449d719ff5d76d", + }, + }, + { + sec: "78298d9ecdc0640c9ae6883201a53f4518055442642024d23c45858f45d0c3e6", + pub: "02fa3e6e0b1fb76e26dffe7b1e01fd02677fedfed23a59000092c706b04214bee3", + ecdh: []string{ + "02e72655a3adf8308a078ee6fe948cf6baf95ef626b1e1fe6e434c737c7c2fef4e", + "", + "025617125b44ded369deed72f833535d56a3ed035afc44ff64fb7c65986f6ea2a5", + "03849b3f906180cf27c161045e9da551a44476b0d4f7f29d668ba17569953d0a11", + }, + }, + { + sec: "04e04fe65bfa6ded50a12769a3bd83d7351b2dbff08c9bac14662b23a3294b9e", + pub: "034f25c9400dd0f87a9c420b35b5a157d21caa086ef8fa00015bc3c8ab73a1cc4c", + ecdh: []string{ + "03222fe59be5a69c38364dd313bd077b8b1c2216804a4a727e0078b3c77778bc45", + "025617125b44ded369deed72f833535d56a3ed035afc44ff64fb7c65986f6ea2a5", + "", + "03fd41f8d279e2df640f17aef31c258a0a9aa6ddcaf4c4bc80f71dccff576b630c", + }, + }, + { + sec: "2f5141f1b75747996c5de77c911dae062d16ae48799052c04ead20ccd5afa113", + pub: "03fe58baefc491a9dcf0939ab6252f81f6d9515105bd89c000bb7f2a694e8a8b72", + ecdh: []string{ + "021096aa98231eaa949542be029a1f3a93815e05e243c69e73d7449d719ff5d76d", + "03849b3f906180cf27c161045e9da551a44476b0d4f7f29d668ba17569953d0a11", + "03fd41f8d279e2df640f17aef31c258a0a9aa6ddcaf4c4bc80f71dccff576b630c", + "", + }, + }, +} + +func TestAbnormalKeys2(t *testing.T) { + for _, tc := range abnormalSecKeys { + seckey1, err := hex.DecodeString(tc.sec) + if err != nil { + t.Error(err) + } + + pubkey1 := PubkeyFromSeckey(seckey1) + if pubkey1 == nil { + t.Fail() + } + + if seckey1 == nil { + t.Fail() + } + + if pubkey1 == nil { + t.Fail() + } + + if VerifyPubkey(pubkey1) != 1 { + t.Error("generates key that fails validation") + } + + hpubkey1 := hex.EncodeToString(pubkey1) + if hpubkey1 != tc.pub { + t.Errorf("pubkey does not match %s != %s", hpubkey1, tc.pub) + } + } +} + +func TestAbnormalKeys3(t *testing.T) { + // ECDH test + for i, tc := range abnormalSecKeys { + seckey1, err := hex.DecodeString(tc.sec) + if err != nil { + t.Error(err) + } + + pubkey1 := PubkeyFromSeckey(seckey1) + + if pubkey1 == nil { + t.Error("pubkey1 nil") + } + + if hex.EncodeToString(pubkey1) != tc.pub { + t.Error("pubkey1 does not match") + } + + for j, tc2 := range abnormalSecKeys { + if i == j { + continue + } + + seckey2, err := hex.DecodeString(tc2.sec) + if err != nil { + t.Error(err) + } + pubkey2 := PubkeyFromSeckey(seckey2) + + if pubkey2 == nil { + t.Error("pubkey2 nil") + } + + if hex.EncodeToString(pubkey2) != tc2.pub { + t.Error("pubkey2 does not match") + } + + puba := ECDH(pubkey1, seckey2) + pubb := ECDH(pubkey2, seckey1) + + if puba == nil { + t.Fail() + } + + if pubb == nil { + t.Fail() + } + + if !bytes.Equal(puba, pubb) { + t.Error("recovered ecdh keys do not match") + } + + hpuba := hex.EncodeToString(puba) + if hpuba != tc.ecdh[j] { + t.Errorf("ecdh does not match %d,%d %s != %s", i, j, hpuba, tc.ecdh[j]) + } + } + + } +} + +func TestDeterministicKeyPairIterator2(t *testing.T) { + cases := []struct { + seed string + sec string + pub string + n int + }{ + { + seed: "67c53b28b8c7b06be53b490c28c0a3b77724b5c31c4bf12b71cd44c6bb4586f3", + sec: "68c751a58f48d656e4d3ec31f6c1016e6e36583ac2f63129f576b29e764469b5", + pub: "02c32556c48bfe944e4b8f6ecb6c884112c71a468247d338cbbdc9c561ab7c6d3d", + n: 1, + }, + { + seed: "38363534613332666131323062666462376361303263343837343639303730656261346235613831623033373633613231383566646635616664373536663363", + sec: "10ba0325f1b8633ca463542950b5cd5f97753a9829ba23477c584e7aee9cfbd5", + pub: "0249964ac7e3fe1b2c182a2f10abe031784e374cc0c665a63bc76cc009a05bc7c6", + n: 1024, + }, + } + + for _, tc := range cases { + t.Run(tc.seed, func(t *testing.T) { + seed, err := hex.DecodeString(tc.seed) + if err != nil { + t.Fatalf("hex.DecodeString(%s) failed: %v", tc.seed, err) + return + } + + var pub []byte + var sec []byte + for i := 0; i < tc.n; i++ { + seed, pub, sec = DeterministicKeyPairIterator(seed) + } + + hsec := hex.EncodeToString(sec) + if hsec != tc.sec { + t.Fatalf("secret key does not match %s != %s", hsec, tc.sec) + } + + hpub := hex.EncodeToString(pub) + if hpub != tc.pub { + t.Fatalf("public key does not match %s != %s", hpub, tc.pub) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING new file mode 100644 index 00000000..a7fd60bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING @@ -0,0 +1,4 @@ +This single package (secp256k1) is distributed with the same license as +the original C implementation by sipa: + + * https://github.com/bitcoin/secp256k1/blob/master/COPYING diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/README.md new file mode 100644 index 00000000..f0466f40 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/README.md @@ -0,0 +1,5 @@ +Implementation of this package has been based on source code created by Pieter Wuille. + + * https://github.com/bitcoin/secp256k1 + +Modified by HaltingState \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go new file mode 100644 index 00000000..0ade1604 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go @@ -0,0 +1,202 @@ +package secp256k1go + +import ( + "bytes" + "log" +) + +// DecompressPoint decompresses point +func DecompressPoint(X []byte, off bool, Y []byte) { + var rx, ry, c, x2, x3 Field + rx.SetB32(X) + rx.Sqr(&x2) + rx.Mul(&x3, &x2) + c.SetInt(7) + c.SetAdd(&x3) + c.Sqrt(&ry) + ry.Normalize() + if ry.IsOdd() != off { + ry.Negate(&ry, 1) + } + ry.Normalize() + ry.GetB32(Y) +} + +// RecoverPublicKey recovers a public key from a signature and the message it signed. +// Returns nil on error with an int error code. Returns 1 on success. +func RecoverPublicKey(sigBytes, msgBytes []byte, recid int) ([]byte, int) { + if len(sigBytes) != 64 { + log.Panic("must pass in 64 byte pubkey") + } + + var pubkey XY + var sig Signature + var msg Number + + sig.ParseBytes(sigBytes[0:64]) + + if sig.R.Sign() <= 0 || sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + if sig.R.Sign() == 0 { + return nil, -1 + } + if sig.R.Sign() <= 0 { + return nil, -2 + } + if sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + return nil, -3 + } + return nil, -4 + } + if sig.S.Sign() <= 0 || sig.S.Cmp(&TheCurve.Order.Int) >= 0 { + return nil, -5 + } + + msg.SetBytes(msgBytes) + if !sig.Recover(&pubkey, &msg, recid) { + return nil, -6 + } + + return pubkey.Bytes(), 1 +} + +// Multiply standard EC multiplication k(xy) +// xy is the compressed public key format (33 bytes long) +func Multiply(xy, k []byte) []byte { + var pk XY + var xyz XYZ + var na, nzero Number + if err := pk.ParsePubkey(xy); err != nil { + return nil + } + xyz.SetXY(&pk) + na.SetBytes(k) + xyz.ECmult(&xyz, &na, &nzero) + pk.SetXYZ(&xyz) + + if !pk.IsValid() { + log.Panic("Multiply pk is invalid") + } + return pk.Bytes() +} + +// pubkeyTest panics if assumptions about pubkey are violated +func pubkeyTest(pk XY) { + if !pk.IsValid() { + log.Panic("IMPOSSIBLE3: pubkey invalid") + } + var pk2 XY + if err := pk2.ParsePubkey(pk.Bytes()); err != nil { + log.Panicf("IMPOSSIBLE2: parse failed: %v", err) + } + if !pk2.IsValid() { + log.Panic("IMPOSSIBLE3: parse failed non valid key") + } + if PubkeyIsValid(pk2.Bytes()) != 1 { + log.Panic("IMPOSSIBLE4: pubkey failed") + } +} + +// BaseMultiply base multiply +func BaseMultiply(k []byte) []byte { + var n Number + var pk XY + n.SetBytes(k) + r := ECmultGen(n) + pk.SetXYZ(&r) + if !pk.IsValid() { + log.Panic("BaseMultiply pk is invalid") + } + + pubkeyTest(pk) + + return pk.Bytes() +} + +// BaseMultiplyAdd computes G*k + xy +// Returns 33 bytes out (compressed pubkey). +func BaseMultiplyAdd(xy, k []byte) []byte { + var n Number + var pk XY + if err := pk.ParsePubkey(xy); err != nil { + return nil + } + n.SetBytes(k) + r := ECmultGen(n) + r.AddXY(&r, &pk) + pk.SetXYZ(&r) + + pubkeyTest(pk) + return pk.Bytes() +} + +// GeneratePublicKey generates a public key from secret key bytes. +// The secret key must 32 bytes. +func GeneratePublicKey(k []byte) []byte { + if len(k) != 32 { + log.Panic("secret key length must be 32 bytes") + } + var n Number + var pk XY + + // must not be zero + // must not be negative + // must be less than order of curve + n.SetBytes(k) + if n.Sign() <= 0 || n.Cmp(&TheCurve.Order.Int) >= 0 { + log.Panic("only call for valid seckey, check that seckey is valid first") + return nil + } + r := ECmultGen(n) + pk.SetXYZ(&r) + if !pk.IsValid() { + log.Panic("public key derived from secret key is unexpectedly valid") + } + pubkeyTest(pk) + return pk.Bytes() +} + +// SeckeyIsValid 1 on success +// Must be 32 bytes +// Must not be zero +// Must not be negative +// Must be less than order of curve +// The probability of any 32 bytes being an invalid secret key is ~2^-128 +func SeckeyIsValid(seckey []byte) int { + if len(seckey) != 32 { + log.Panic("SeckeyIsValid seckey must be 32 bytes") + } + var n Number + n.SetBytes(seckey) + // must not be zero + // must not be negative + // must be less than order of curve + if n.Sign() <= 0 { + return -1 + } + if n.Cmp(&TheCurve.Order.Int) >= 0 { + return -2 + } + return 1 +} + +// PubkeyIsValid returns 1 on success +func PubkeyIsValid(pubkey []byte) int { + if len(pubkey) != 33 { + log.Panic("public key length must be 33 bytes") + return -2 + } + var pubkey1 XY + if err := pubkey1.ParsePubkey(pubkey); err != nil { + return -1 + } + + if !bytes.Equal(pubkey1.Bytes(), pubkey) { + log.Panic("pubkey parses but serialize/deserialize roundtrip fails") + } + + if !pubkey1.IsValid() { + return -3 // invalid, point is infinity or some other problem + } + + return 1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec_test.go new file mode 100644 index 00000000..bef40af0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec_test.go @@ -0,0 +1,224 @@ +package secp256k1go + +import ( + "testing" +) + +//var ta = [][3]string{ +// // [0]-pubScr, [1]-sigScript, [2]-unsignedTx +// { +// "040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16", +// "3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01", +// "3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6", +// }, +// { +// "020eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d", +// "3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01", +// "3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6", +// }, +// { +// "0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3", +// "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901", +// "7a05c6145f10101e9d6325494245adf1297d80f8f38d4d576d57cdba220bcb19", +// }, +// { +// "0311db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c", +// "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901", +// "7a05c6145f10101e9d6325494245adf1297d80f8f38d4d576d57cdba220bcb19", +// }, +// { +// "0428f42723f81c70664e200088437282d0e11ae0d4ae139f88bdeef1550471271692970342db8e3f9c6f0123fab9414f7865d2db90c24824da775f00e228b791fd", +// "3045022100d557da5d9bf886e0c3f98fd6d5d337487cd01d5b887498679a57e3d32bd5d0af0220153217b63a75c3145b14f58c64901675fe28dba2352c2fa9f2a1579c74a2de1701", +// "c22de395adbb0720941e009e8a4e488791b2e428af775432ed94d2c7ec8e421a", +// }, +// { +// "0328f42723f81c70664e200088437282d0e11ae0d4ae139f88bdeef15504712716", +// "3045022100d557da5d9bf886e0c3f98fd6d5d337487cd01d5b887498679a57e3d32bd5d0af0220153217b63a75c3145b14f58c64901675fe28dba2352c2fa9f2a1579c74a2de1701", +// "c22de395adbb0720941e009e8a4e488791b2e428af775432ed94d2c7ec8e421a", +// }, +// { +// "041f2a00036b3cbd1abe71dca54d406a1e9dd5d376bf125bb109726ff8f2662edcd848bd2c44a86a7772442095c7003248cc619bfec3ddb65130b0937f8311c787", +// "3045022100ec6eb6b2aa0580c8e75e8e316a78942c70f46dd175b23b704c0330ab34a86a34022067a73509df89072095a16dbf350cc5f1ca5906404a9275ebed8a4ba219627d6701", +// "7c8e7c2cb887682ed04dc82c9121e16f6d669ea3d57a2756785c5863d05d2e6a", +// }, +// { +// "031f2a00036b3cbd1abe71dca54d406a1e9dd5d376bf125bb109726ff8f2662edc", +// "3045022100ec6eb6b2aa0580c8e75e8e316a78942c70f46dd175b23b704c0330ab34a86a34022067a73509df89072095a16dbf350cc5f1ca5906404a9275ebed8a4ba219627d6701", +// "7c8e7c2cb887682ed04dc82c9121e16f6d669ea3d57a2756785c5863d05d2e6a", +// }, +// { +// "04ee90bfdd4e07eb1cfe9c6342479ca26c0827f84bfe1ab39e32fc3e94a0fe00e6f7d8cd895704e974978766dd0f9fad3c97b1a0f23684e93b400cc9022b7ae532", +// "3045022100fe1f6e2c2c2cbc916f9f9d16497df2f66a4834e5582d6da0ee0474731c4a27580220682bad9359cd946dc97bb07ea8fad48a36f9b61186d47c6798ccce7ba20cc22701", +// "baff983e6dfb1052918f982090aa932f56d9301d1de9a726d2e85d5f6bb75464", +// }, +//} + +// func TestVerify1(t *testing.T) { +// for i := range ta { +// pkey, _ := hex.DecodeString(ta[i][0]) +// sign, _ := hex.DecodeString(ta[i][1]) +// hasz, _ := hex.DecodeString(ta[i][2]) + +// res := ecdsaVerify(pkey, sign, hasz) +// if res != 1 { +// log.Println("error code", res) +// t.Fatal("Verify failed at", i) +// } + +// hasz[0]++ +// res = ecdsaVerify(pkey, sign, hasz) +// if res != 0 { +// t.Error("Verify not failed while it should", i) +// } +// res = ecdsaVerify(pkey[:1], sign, hasz) +// if res >= 0 { +// t.Error("Negative result expected", res, i) +// } +// res = ecdsaVerify(pkey, sign[:1], hasz) +// if res >= 0 { +// t.Error("Yet negative result expected", res, i) +// } +// res = ecdsaVerify(pkey, sign, hasz[:1]) +// if res != 0 { +// t.Error("Zero expected", res, i) +// } +// } +// } + +// func BenchmarkVerifyUncompressed(b *testing.B) { +// key, _ := hex.DecodeString("040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") +// sig, _ := hex.DecodeString("3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01") +// msg, _ := hex.DecodeString("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") +// b.ResetTimer() +// for i := 0; i < b.N; i++ { +// ecdsaVerify(key, sig, msg) +// } +// } + +// func BenchmarkVerifyCompressed(b *testing.B) { +// keyCompr, _ := hex.DecodeString("020eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") +// sig, _ := hex.DecodeString("3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01") +// msg, _ := hex.DecodeString("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") +// b.ResetTimer() +// for i := 0; i < b.N; i++ { +// ecdsaVerify(keyCompr, sig, msg) +// } +// } + +func TestECmult(t *testing.T) { + var u1, u2 Number + var pubkeyj, expres, pr XYZ + + pubkeyj.X.SetHex("0EAEBCD1DF2DF853D66CE0E1B0FDA07F67D1CABEFDE98514AAD795B86A6EA66D") + pubkeyj.Y.SetHex("BEB26B67D7A00E2447BAECCC8A4CEF7CD3CAD67376AC1C5785AEEBB4F6441C16") + pubkeyj.Z.SetHex("0000000000000000000000000000000000000000000000000000000000000001") + + u1.SetHex("B618EBA71EC03638693405C75FC1C9ABB1A74471BAAF1A3A8B9005821491C4B4") + u2.SetHex("8554470195DE4678B06EDE9F9286545B51FF2D9AA756CE35A39011783563EA60") + + expres.X.SetHex("EB6752420B6BDB40A760AC26ADD7E7BBD080BF1DF6C0B009A0D310E4511BDF49") + expres.Y.SetHex("8E8CEB84E1502FC536FFE67967BC44314270A0B38C79865FFED5A85D138DCA6B") + expres.Z.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") + + pubkeyj.ECmult(&pr, &u2, &u1) + if !pr.Equals(&expres) { + t.Error("ECmult failed") + t.Logf("Got: %s", pr) + t.Logf("Exp: %s", expres) + } +} + +type wnafvec struct { + inp string + w uint + exp []int +} + +func TestWNAF(t *testing.T) { + var wnaf [129]int + var testvcs = []wnafvec{ + { + "3271156f58b59bd7aa542ca6972c1910", winA, + []int{0, 0, 0, 0, -15, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, -9, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, -11, 0, 0, 0, 0, 13, 0, 0, 0, 0, 1, 0, 0, 0, 0, -11, 0, 0, 0, 0, -11, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 11, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 15, 0, 0, 0, 0, 11, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 3}, + }, + { + "0a8a5afcb465a43b8277801311860430", winA, + []int{0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -9, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, -13, 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 1}, + }, + { + "b1a74471baaf1a3a8b9005821491c4b4", winG, + []int{0, 0, -3795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11}, + }, + { + "b618eba71ec03638693405c75fc1c9ab", winG, + []int{2475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1457}, + }, + } + for idx := range testvcs { + var xxx Number + xxx.SetHex(testvcs[idx].inp) + bits := ecmultWnaf(wnaf[:], &xxx, testvcs[idx].w) + if bits != len(testvcs[idx].exp) { + t.Error("Bad bits at idx", idx) + } + for i := range testvcs[idx].exp { + if wnaf[i] != testvcs[idx].exp[i] { + t.Error("Bad val at idx", idx, i) + } + } + } +} + +func TestPrecompileGej(t *testing.T) { + var exp, a XYZ + + a.X.SetHex("0eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") + a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + a.Z.SetHex("01") + exp.X.SetHex("ce5dcac5e26ab63868ead1440f359aff29d7ffade62abe801bca97b471bcd416") + exp.Y.SetHex("0cc6f63793a207751d507aa4be629f0776441e4873548095bd6d39d34ce8a9d7") + exp.Z.SetHex("122927e4908740d51df1f03dc921c00fef68c542e7f28aa270862619cf971815") + pre := a.precomp(winA) + if len(pre) != 8 { + t.Error("Bad result length") + } + if !pre[7].Equals(&exp) { + t.Error("Unexpcted value") + } + + a.X.SetHex("a45720c272cfa1f77f64be8a404a7d3149bd5410f9a173353f6eb75a5085ba98") + a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + a.Z.SetHex("01") + exp.X.SetHex("ce5dcac5e26ab63868ead1440f359aff29d7ffade62abe801bca97b471bcd416") + exp.Y.SetHex("0cc6f63793a207751d507aa4be629f0776441e4873548095bd6d39d34ce8a9d7") + exp.Z.SetHex("49f0fb9f1840e7a58d485c6cc394e597e521bf7d4598be2b367c27326949e507") + pre = a.precomp(winA) + if len(pre) != 8 { + t.Error("Bad result length") + } + if !pre[7].Equals(&exp) { + t.Error("Unexpcted value") + } +} + +func TestMultGen(t *testing.T) { + var nonce Number + var ex, ey, ez Field + nonce.SetHex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + r := ECmultGen(nonce) + ex.SetHex("02D1BF36D37ACD68E4DD00DB3A707FD176A37E42F81AEF9386924032D3428FF0") + ey.SetHex("FD52E285D33EC835230EA69F89D9C38673BD5B995716A4063C893AF02F938454") + ez.SetHex("4C6ACE7C8C062A1E046F66FD8E3981DC4E8E844ED856B5415C62047129268C1B") + r.X.Normalize() + r.Y.Normalize() + r.Z.Normalize() + if !ex.Equals(&r.X) { + t.Error("Bad X") + } + if !ey.Equals(&r.Y) { + t.Error("Bad Y") + } + if !ez.Equals(&r.Z) { + t.Error("Bad Y") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go new file mode 100644 index 00000000..1be6c817 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go @@ -0,0 +1,738 @@ +package secp256k1go + +import ( + "encoding/hex" + "math/big" +) + +// Field represents the signature field +type Field struct { + n [10]uint32 +} + +// String returns the hex string of the field +func (fd *Field) String() string { + var tmp [32]byte + b := *fd + b.Normalize() + b.GetB32(tmp[:]) + return hex.EncodeToString(tmp[:]) +} + +// GetBig returns big int +func (fd *Field) GetBig() (r *big.Int) { + fd.Normalize() + r = new(big.Int) + var tmp [32]byte + fd.GetB32(tmp[:]) + r.SetBytes(tmp[:]) + return +} + +// SetB32 sets +func (fd *Field) SetB32(a []byte) { + fd.n[0] = 0 + fd.n[1] = 0 + fd.n[2] = 0 + fd.n[3] = 0 + fd.n[4] = 0 + fd.n[5] = 0 + fd.n[6] = 0 + fd.n[7] = 0 + fd.n[8] = 0 + fd.n[9] = 0 + var v uint32 + for i := uint(0); i < 32; i++ { + for j := uint(0); j < 4; j++ { + limb := (8*i + 2*j) / 26 + shift := (8*i + 2*j) % 26 + v = (uint32)((a[31-i]>>(2*j))&0x3) << shift + fd.n[limb] |= v + } + } +} + +// SetBytes sets bytes +func (fd *Field) SetBytes(a []byte) { + if len(a) > 32 { + panic("too many bytes to set") + } + if len(a) == 32 { + fd.SetB32(a) + } else { + var buf [32]byte + copy(buf[32-len(a):], a) + fd.SetB32(buf[:]) + } +} + +// SetHex sets field in hex string +func (fd *Field) SetHex(s string) { + d, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + fd.SetBytes(d) +} + +// IsOdd check if odd +func (fd *Field) IsOdd() bool { + return (fd.n[0] & 1) != 0 +} + +// IsZero check if field is zero +func (fd *Field) IsZero() bool { + return (fd.n[0] == 0 && fd.n[1] == 0 && fd.n[2] == 0 && fd.n[3] == 0 && fd.n[4] == 0 && fd.n[5] == 0 && fd.n[6] == 0 && fd.n[7] == 0 && fd.n[8] == 0 && fd.n[9] == 0) +} + +// SetInt set fields with an int value +func (fd *Field) SetInt(a uint32) { + fd.n[0] = a + fd.n[1] = 0 + fd.n[2] = 0 + fd.n[3] = 0 + fd.n[4] = 0 + fd.n[5] = 0 + fd.n[6] = 0 + fd.n[7] = 0 + fd.n[8] = 0 + fd.n[9] = 0 +} + +// Normalize normalize the field +func (fd *Field) Normalize() { + c := fd.n[0] + t0 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[1] + t1 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[2] + t2 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[3] + t3 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[4] + t4 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[5] + t5 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[6] + t6 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[7] + t7 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[8] + t8 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[9] + t9 := c & 0x03FFFFF + c >>= 22 + + // The following code will not modify the t's if c is initially 0. + d := c*0x3D1 + t0 + t0 = d & 0x3FFFFFF + d = (d >> 26) + t1 + c*0x40 + t1 = d & 0x3FFFFFF + d = (d >> 26) + t2 + t2 = d & 0x3FFFFFF + d = (d >> 26) + t3 + t3 = d & 0x3FFFFFF + d = (d >> 26) + t4 + t4 = d & 0x3FFFFFF + d = (d >> 26) + t5 + t5 = d & 0x3FFFFFF + d = (d >> 26) + t6 + t6 = d & 0x3FFFFFF + d = (d >> 26) + t7 + t7 = d & 0x3FFFFFF + d = (d >> 26) + t8 + t8 = d & 0x3FFFFFF + d = (d >> 26) + t9 + t9 = d & 0x03FFFFF + + // Subtract p if result >= p + low := (uint64(t1) << 26) | uint64(t0) + //mask := uint64(-(int64)((t9 < 0x03FFFFF) | (t8 < 0x3FFFFFF) | (t7 < 0x3FFFFFF) | (t6 < 0x3FFFFFF) | (t5 < 0x3FFFFFF) | (t4 < 0x3FFFFFF) | (t3 < 0x3FFFFFF) | (t2 < 0x3FFFFFF) | (low < 0xFFFFEFFFFFC2F))) + var mask uint64 + if (t9 < 0x03FFFFF) || + (t8 < 0x3FFFFFF) || + (t7 < 0x3FFFFFF) || + (t6 < 0x3FFFFFF) || + (t5 < 0x3FFFFFF) || + (t4 < 0x3FFFFFF) || + (t3 < 0x3FFFFFF) || + (t2 < 0x3FFFFFF) || + (low < 0xFFFFEFFFFFC2F) { + mask = 0xFFFFFFFFFFFFFFFF + } + t9 &= uint32(mask) + t8 &= uint32(mask) + t7 &= uint32(mask) + t6 &= uint32(mask) + t5 &= uint32(mask) + t4 &= uint32(mask) + t3 &= uint32(mask) + t2 &= uint32(mask) + low -= ((mask ^ 0xFFFFFFFFFFFFFFFF) & 0xFFFFEFFFFFC2F) + + // push internal variables back + fd.n[0] = uint32(low) & 0x3FFFFFF + fd.n[1] = uint32(low>>26) & 0x3FFFFFF + fd.n[2] = t2 + fd.n[3] = t3 + fd.n[4] = t4 + fd.n[5] = t5 + fd.n[6] = t6 + fd.n[7] = t7 + fd.n[8] = t8 + fd.n[9] = t9 +} + +// GetB32 get B32, TODO: need further explanation +func (fd *Field) GetB32(r []byte) { + var i, j, c, limb, shift uint32 + for i = 0; i < 32; i++ { + c = 0 + for j = 0; j < 4; j++ { + limb = (8*i + 2*j) / 26 + shift = (8*i + 2*j) % 26 + c |= ((fd.n[limb] >> shift) & 0x3) << (2 * j) + } + r[31-i] = byte(c) + } +} + +// Equals check if field is the same as the given one +func (fd *Field) Equals(b *Field) bool { + return (fd.n[0] == b.n[0] && fd.n[1] == b.n[1] && fd.n[2] == b.n[2] && fd.n[3] == b.n[3] && fd.n[4] == b.n[4] && + fd.n[5] == b.n[5] && fd.n[6] == b.n[6] && fd.n[7] == b.n[7] && fd.n[8] == b.n[8] && fd.n[9] == b.n[9]) +} + +// SetAdd adds value to corresponding fields +func (fd *Field) SetAdd(a *Field) { + fd.n[0] += a.n[0] + fd.n[1] += a.n[1] + fd.n[2] += a.n[2] + fd.n[3] += a.n[3] + fd.n[4] += a.n[4] + fd.n[5] += a.n[5] + fd.n[6] += a.n[6] + fd.n[7] += a.n[7] + fd.n[8] += a.n[8] + fd.n[9] += a.n[9] +} + +// MulInt multiples the fields +func (fd *Field) MulInt(a uint32) { + fd.n[0] *= a + fd.n[1] *= a + fd.n[2] *= a + fd.n[3] *= a + fd.n[4] *= a + fd.n[5] *= a + fd.n[6] *= a + fd.n[7] *= a + fd.n[8] *= a + fd.n[9] *= a +} + +// Negate caculate the negate +func (fd *Field) Negate(r *Field, m uint32) { + r.n[0] = 0x3FFFC2F*(m+1) - fd.n[0] + r.n[1] = 0x3FFFFBF*(m+1) - fd.n[1] + r.n[2] = 0x3FFFFFF*(m+1) - fd.n[2] + r.n[3] = 0x3FFFFFF*(m+1) - fd.n[3] + r.n[4] = 0x3FFFFFF*(m+1) - fd.n[4] + r.n[5] = 0x3FFFFFF*(m+1) - fd.n[5] + r.n[6] = 0x3FFFFFF*(m+1) - fd.n[6] + r.n[7] = 0x3FFFFFF*(m+1) - fd.n[7] + r.n[8] = 0x3FFFFFF*(m+1) - fd.n[8] + r.n[9] = 0x03FFFFF*(m+1) - fd.n[9] +} + +// Inv new algo by peterdettman - https://github.com/sipa/TheCurve/pull/19 +func (fd *Field) Inv(r *Field) { + var x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1 Field + var j int + + fd.Sqr(&x2) + x2.Mul(&x2, fd) + + x2.Sqr(&x3) + x3.Mul(&x3, fd) + + x3.Sqr(&x6) + x6.Sqr(&x6) + x6.Sqr(&x6) + x6.Mul(&x6, &x3) + + x6.Sqr(&x9) + x9.Sqr(&x9) + x9.Sqr(&x9) + x9.Mul(&x9, &x3) + + x9.Sqr(&x11) + x11.Sqr(&x11) + x11.Mul(&x11, &x2) + + x11.Sqr(&x22) + for j = 1; j < 11; j++ { + x22.Sqr(&x22) + } + x22.Mul(&x22, &x11) + + x22.Sqr(&x44) + for j = 1; j < 22; j++ { + x44.Sqr(&x44) + } + x44.Mul(&x44, &x22) + + x44.Sqr(&x88) + for j = 1; j < 44; j++ { + x88.Sqr(&x88) + } + x88.Mul(&x88, &x44) + + x88.Sqr(&x176) + for j = 1; j < 88; j++ { + x176.Sqr(&x176) + } + x176.Mul(&x176, &x88) + + x176.Sqr(&x220) + for j = 1; j < 44; j++ { + x220.Sqr(&x220) + } + x220.Mul(&x220, &x44) + + x220.Sqr(&x223) + x223.Sqr(&x223) + x223.Sqr(&x223) + x223.Mul(&x223, &x3) + + x223.Sqr(&t1) + for j = 1; j < 23; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x22) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(&t1, fd) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(&t1, &x2) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(r, fd) +} + +// Sqrt new algo by peterdettman - https://github.com/sipa/TheCurve/pull/19 +func (fd *Field) Sqrt(r *Field) { + var x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1 Field + var j int + + fd.Sqr(&x2) + x2.Mul(&x2, fd) + + x2.Sqr(&x3) + x3.Mul(&x3, fd) + + x3.Sqr(&x6) + x6.Sqr(&x6) + x6.Sqr(&x6) + x6.Mul(&x6, &x3) + + x6.Sqr(&x9) + x9.Sqr(&x9) + x9.Sqr(&x9) + x9.Mul(&x9, &x3) + + x9.Sqr(&x11) + x11.Sqr(&x11) + x11.Mul(&x11, &x2) + + x11.Sqr(&x22) + for j = 1; j < 11; j++ { + x22.Sqr(&x22) + } + x22.Mul(&x22, &x11) + + x22.Sqr(&x44) + for j = 1; j < 22; j++ { + x44.Sqr(&x44) + } + x44.Mul(&x44, &x22) + + x44.Sqr(&x88) + for j = 1; j < 44; j++ { + x88.Sqr(&x88) + } + x88.Mul(&x88, &x44) + + x88.Sqr(&x176) + for j = 1; j < 88; j++ { + x176.Sqr(&x176) + } + x176.Mul(&x176, &x88) + + x176.Sqr(&x220) + for j = 1; j < 44; j++ { + x220.Sqr(&x220) + } + x220.Mul(&x220, &x44) + + x220.Sqr(&x223) + x223.Sqr(&x223) + x223.Sqr(&x223) + x223.Mul(&x223, &x3) + + x223.Sqr(&t1) + for j = 1; j < 23; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x22) + for j = 0; j < 6; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x2) + t1.Sqr(&t1) + t1.Sqr(r) +} + +// InvVar ... +func (fd *Field) InvVar(r *Field) { + var b [32]byte + c := *fd + c.Normalize() + c.GetB32(b[:]) + var n Number + n.SetBytes(b[:]) + n.modInv(&n, &TheCurve.p) + r.SetBytes(n.Bytes()) +} + +// Mul ... +func (fd *Field) Mul(r, b *Field) { + var c, d uint64 + var t0, t1, t2, t3, t4, t5, t6 uint64 + var t7, t8, t9, t10, t11, t12, t13 uint64 + var t14, t15, t16, t17, t18, t19 uint64 + + c = uint64(fd.n[0]) * uint64(b.n[0]) + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[1]) + + uint64(fd.n[1])*uint64(b.n[0]) + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[2]) + + uint64(fd.n[1])*uint64(b.n[1]) + + uint64(fd.n[2])*uint64(b.n[0]) + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[3]) + + uint64(fd.n[1])*uint64(b.n[2]) + + uint64(fd.n[2])*uint64(b.n[1]) + + uint64(fd.n[3])*uint64(b.n[0]) + t3 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[4]) + + uint64(fd.n[1])*uint64(b.n[3]) + + uint64(fd.n[2])*uint64(b.n[2]) + + uint64(fd.n[3])*uint64(b.n[1]) + + uint64(fd.n[4])*uint64(b.n[0]) + t4 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[5]) + + uint64(fd.n[1])*uint64(b.n[4]) + + uint64(fd.n[2])*uint64(b.n[3]) + + uint64(fd.n[3])*uint64(b.n[2]) + + uint64(fd.n[4])*uint64(b.n[1]) + + uint64(fd.n[5])*uint64(b.n[0]) + t5 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[6]) + + uint64(fd.n[1])*uint64(b.n[5]) + + uint64(fd.n[2])*uint64(b.n[4]) + + uint64(fd.n[3])*uint64(b.n[3]) + + uint64(fd.n[4])*uint64(b.n[2]) + + uint64(fd.n[5])*uint64(b.n[1]) + + uint64(fd.n[6])*uint64(b.n[0]) + t6 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[7]) + + uint64(fd.n[1])*uint64(b.n[6]) + + uint64(fd.n[2])*uint64(b.n[5]) + + uint64(fd.n[3])*uint64(b.n[4]) + + uint64(fd.n[4])*uint64(b.n[3]) + + uint64(fd.n[5])*uint64(b.n[2]) + + uint64(fd.n[6])*uint64(b.n[1]) + + uint64(fd.n[7])*uint64(b.n[0]) + t7 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[8]) + + uint64(fd.n[1])*uint64(b.n[7]) + + uint64(fd.n[2])*uint64(b.n[6]) + + uint64(fd.n[3])*uint64(b.n[5]) + + uint64(fd.n[4])*uint64(b.n[4]) + + uint64(fd.n[5])*uint64(b.n[3]) + + uint64(fd.n[6])*uint64(b.n[2]) + + uint64(fd.n[7])*uint64(b.n[1]) + + uint64(fd.n[8])*uint64(b.n[0]) + t8 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[9]) + + uint64(fd.n[1])*uint64(b.n[8]) + + uint64(fd.n[2])*uint64(b.n[7]) + + uint64(fd.n[3])*uint64(b.n[6]) + + uint64(fd.n[4])*uint64(b.n[5]) + + uint64(fd.n[5])*uint64(b.n[4]) + + uint64(fd.n[6])*uint64(b.n[3]) + + uint64(fd.n[7])*uint64(b.n[2]) + + uint64(fd.n[8])*uint64(b.n[1]) + + uint64(fd.n[9])*uint64(b.n[0]) + t9 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[1])*uint64(b.n[9]) + + uint64(fd.n[2])*uint64(b.n[8]) + + uint64(fd.n[3])*uint64(b.n[7]) + + uint64(fd.n[4])*uint64(b.n[6]) + + uint64(fd.n[5])*uint64(b.n[5]) + + uint64(fd.n[6])*uint64(b.n[4]) + + uint64(fd.n[7])*uint64(b.n[3]) + + uint64(fd.n[8])*uint64(b.n[2]) + + uint64(fd.n[9])*uint64(b.n[1]) + t10 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[2])*uint64(b.n[9]) + + uint64(fd.n[3])*uint64(b.n[8]) + + uint64(fd.n[4])*uint64(b.n[7]) + + uint64(fd.n[5])*uint64(b.n[6]) + + uint64(fd.n[6])*uint64(b.n[5]) + + uint64(fd.n[7])*uint64(b.n[4]) + + uint64(fd.n[8])*uint64(b.n[3]) + + uint64(fd.n[9])*uint64(b.n[2]) + t11 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[3])*uint64(b.n[9]) + + uint64(fd.n[4])*uint64(b.n[8]) + + uint64(fd.n[5])*uint64(b.n[7]) + + uint64(fd.n[6])*uint64(b.n[6]) + + uint64(fd.n[7])*uint64(b.n[5]) + + uint64(fd.n[8])*uint64(b.n[4]) + + uint64(fd.n[9])*uint64(b.n[3]) + t12 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[4])*uint64(b.n[9]) + + uint64(fd.n[5])*uint64(b.n[8]) + + uint64(fd.n[6])*uint64(b.n[7]) + + uint64(fd.n[7])*uint64(b.n[6]) + + uint64(fd.n[8])*uint64(b.n[5]) + + uint64(fd.n[9])*uint64(b.n[4]) + t13 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[5])*uint64(b.n[9]) + + uint64(fd.n[6])*uint64(b.n[8]) + + uint64(fd.n[7])*uint64(b.n[7]) + + uint64(fd.n[8])*uint64(b.n[6]) + + uint64(fd.n[9])*uint64(b.n[5]) + t14 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[6])*uint64(b.n[9]) + + uint64(fd.n[7])*uint64(b.n[8]) + + uint64(fd.n[8])*uint64(b.n[7]) + + uint64(fd.n[9])*uint64(b.n[6]) + t15 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[7])*uint64(b.n[9]) + + uint64(fd.n[8])*uint64(b.n[8]) + + uint64(fd.n[9])*uint64(b.n[7]) + t16 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[8])*uint64(b.n[9]) + + uint64(fd.n[9])*uint64(b.n[8]) + t17 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[9])*uint64(b.n[9]) + t18 = c & 0x3FFFFFF + c = c >> 26 + t19 = c + + c = t0 + t10*0x3D10 + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + t1 + t10*0x400 + t11*0x3D10 + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + t2 + t11*0x400 + t12*0x3D10 + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + t3 + t12*0x400 + t13*0x3D10 + r.n[3] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t4 + t13*0x400 + t14*0x3D10 + r.n[4] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t5 + t14*0x400 + t15*0x3D10 + r.n[5] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t6 + t15*0x400 + t16*0x3D10 + r.n[6] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t7 + t16*0x400 + t17*0x3D10 + r.n[7] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t8 + t17*0x400 + t18*0x3D10 + r.n[8] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t9 + t18*0x400 + t19*0x1000003D10 + r.n[9] = uint32(c) & 0x03FFFFF + c = c >> 22 + d = t0 + c*0x3D1 + r.n[0] = uint32(d) & 0x3FFFFFF + d = d >> 26 + d = d + t1 + c*0x40 + r.n[1] = uint32(d) & 0x3FFFFFF + d = d >> 26 + r.n[2] = uint32(t2 + d) +} + +// Sqr ... +func (fd *Field) Sqr(r *Field) { + var c, d uint64 + var t0, t1, t2, t3, t4, t5, t6 uint64 + var t7, t8, t9, t10, t11, t12, t13 uint64 + var t14, t15, t16, t17, t18, t19 uint64 + + c = uint64(fd.n[0]) * uint64(fd.n[0]) + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[1]) + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[2]) + + uint64(fd.n[1])*uint64(fd.n[1]) + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[3]) + + (uint64(fd.n[1])*2)*uint64(fd.n[2]) + t3 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[4]) + + (uint64(fd.n[1])*2)*uint64(fd.n[3]) + + uint64(fd.n[2])*uint64(fd.n[2]) + t4 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[5]) + + (uint64(fd.n[1])*2)*uint64(fd.n[4]) + + (uint64(fd.n[2])*2)*uint64(fd.n[3]) + t5 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[6]) + + (uint64(fd.n[1])*2)*uint64(fd.n[5]) + + (uint64(fd.n[2])*2)*uint64(fd.n[4]) + + uint64(fd.n[3])*uint64(fd.n[3]) + t6 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[7]) + + (uint64(fd.n[1])*2)*uint64(fd.n[6]) + + (uint64(fd.n[2])*2)*uint64(fd.n[5]) + + (uint64(fd.n[3])*2)*uint64(fd.n[4]) + t7 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[8]) + + (uint64(fd.n[1])*2)*uint64(fd.n[7]) + + (uint64(fd.n[2])*2)*uint64(fd.n[6]) + + (uint64(fd.n[3])*2)*uint64(fd.n[5]) + + uint64(fd.n[4])*uint64(fd.n[4]) + t8 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[9]) + + (uint64(fd.n[1])*2)*uint64(fd.n[8]) + + (uint64(fd.n[2])*2)*uint64(fd.n[7]) + + (uint64(fd.n[3])*2)*uint64(fd.n[6]) + + (uint64(fd.n[4])*2)*uint64(fd.n[5]) + t9 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[1])*2)*uint64(fd.n[9]) + + (uint64(fd.n[2])*2)*uint64(fd.n[8]) + + (uint64(fd.n[3])*2)*uint64(fd.n[7]) + + (uint64(fd.n[4])*2)*uint64(fd.n[6]) + + uint64(fd.n[5])*uint64(fd.n[5]) + t10 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[2])*2)*uint64(fd.n[9]) + + (uint64(fd.n[3])*2)*uint64(fd.n[8]) + + (uint64(fd.n[4])*2)*uint64(fd.n[7]) + + (uint64(fd.n[5])*2)*uint64(fd.n[6]) + t11 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[3])*2)*uint64(fd.n[9]) + + (uint64(fd.n[4])*2)*uint64(fd.n[8]) + + (uint64(fd.n[5])*2)*uint64(fd.n[7]) + + uint64(fd.n[6])*uint64(fd.n[6]) + t12 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[4])*2)*uint64(fd.n[9]) + + (uint64(fd.n[5])*2)*uint64(fd.n[8]) + + (uint64(fd.n[6])*2)*uint64(fd.n[7]) + t13 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[5])*2)*uint64(fd.n[9]) + + (uint64(fd.n[6])*2)*uint64(fd.n[8]) + + uint64(fd.n[7])*uint64(fd.n[7]) + t14 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[6])*2)*uint64(fd.n[9]) + + (uint64(fd.n[7])*2)*uint64(fd.n[8]) + t15 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[7])*2)*uint64(fd.n[9]) + + uint64(fd.n[8])*uint64(fd.n[8]) + t16 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[8])*2)*uint64(fd.n[9]) + t17 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[9])*uint64(fd.n[9]) + t18 = c & 0x3FFFFFF + c = c >> 26 + t19 = c + + c = t0 + t10*0x3D10 + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + t1 + t10*0x400 + t11*0x3D10 + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + t2 + t11*0x400 + t12*0x3D10 + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + t3 + t12*0x400 + t13*0x3D10 + r.n[3] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t4 + t13*0x400 + t14*0x3D10 + r.n[4] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t5 + t14*0x400 + t15*0x3D10 + r.n[5] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t6 + t15*0x400 + t16*0x3D10 + r.n[6] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t7 + t16*0x400 + t17*0x3D10 + r.n[7] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t8 + t17*0x400 + t18*0x3D10 + r.n[8] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t9 + t18*0x400 + t19*0x1000003D10 + r.n[9] = uint32(c) & 0x03FFFFF + c = c >> 22 + d = t0 + c*0x3D1 + r.n[0] = uint32(d) & 0x3FFFFFF + d = d >> 26 + d = d + t1 + c*0x40 + r.n[1] = uint32(d) & 0x3FFFFFF + d = d >> 26 + r.n[2] = uint32(t2 + d) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field_test.go new file mode 100644 index 00000000..0a978645 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field_test.go @@ -0,0 +1,42 @@ +package secp256k1go + +import ( + "crypto/rand" + "testing" +) + +func TestFeInv(t *testing.T) { + var in, out, exp Field + in.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") + exp.SetHex("7F586430EA30F914965770F6098E492699C62EE1DF6CAFFA77681C179FDF3117") + in.Inv(&out) + if !out.Equals(&exp) { + t.Error("fe.Inv() failed") + } +} + +func BenchmarkFieldSqrt(b *testing.B) { + var dat [32]byte + var f, tmp Field + _, err := rand.Read(dat[:]) + if err != nil { + b.Error(err) + } + f.SetB32(dat[:]) + for i := 0; i < b.N; i++ { + f.Sqrt(&tmp) + } +} + +func BenchmarkFieldInv(b *testing.B) { + var dat [32]byte + var f, tmp Field + _, err := rand.Read(dat[:]) + if err != nil { + b.Error(err) + } + f.SetB32(dat[:]) + for i := 0; i < b.N; i++ { + f.Inv(&tmp) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go new file mode 100644 index 00000000..07527d85 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go @@ -0,0 +1,100 @@ +package secp256k1go + +import ( + "math/big" +) + +var ( + // BigInt1 represents big int with value 1 + BigInt1 = new(big.Int).SetInt64(1) +) + +// Number wraps the big.Int +type Number struct { + big.Int +} + +func (num *Number) modMul(a, b, m *Number) { + num.Mul(&a.Int, &b.Int) + num.Mod(&num.Int, &m.Int) +} + +func (num *Number) modInv(a, b *Number) { + num.ModInverse(&a.Int, &b.Int) +} + +func (num *Number) mod(a *Number) { + num.Mod(&num.Int, &a.Int) +} + +// SetHex sets number from string +func (num *Number) SetHex(s string) { + if _, ok := num.SetString(s, 16); !ok { + panic("Number.SetHex failed") + } +} + +func (num *Number) maskBits(bits uint) { + mask := new(big.Int).Lsh(BigInt1, bits) + mask.Sub(mask, BigInt1) + num.Int.And(&num.Int, mask) +} + +func (num *Number) splitExp(r1, r2 *Number) { + var bnc1, bnc2, bnn2, bnt1, bnt2 Number + + bnn2.Int.Rsh(&TheCurve.Order.Int, 1) + + bnc1.Mul(&num.Int, &TheCurve.a1b2.Int) + bnc1.Add(&bnc1.Int, &bnn2.Int) + bnc1.Div(&bnc1.Int, &TheCurve.Order.Int) + + bnc2.Mul(&num.Int, &TheCurve.b1.Int) + bnc2.Add(&bnc2.Int, &bnn2.Int) + bnc2.Div(&bnc2.Int, &TheCurve.Order.Int) + + bnt1.Mul(&bnc1.Int, &TheCurve.a1b2.Int) + bnt2.Mul(&bnc2.Int, &TheCurve.a2.Int) + bnt1.Add(&bnt1.Int, &bnt2.Int) + r1.Sub(&num.Int, &bnt1.Int) + + bnt1.Mul(&bnc1.Int, &TheCurve.b1.Int) + bnt2.Mul(&bnc2.Int, &TheCurve.a1b2.Int) + r2.Sub(&bnt1.Int, &bnt2.Int) +} + +func (num *Number) split(rl, rh *Number, bits uint) { //nolint:unparam + rl.Int.Set(&num.Int) + rh.Int.Rsh(&rl.Int, bits) + rl.maskBits(bits) +} + +func (num *Number) rsh(bits uint) { //nolint:unparam + num.Rsh(&num.Int, bits) +} + +func (num *Number) inc() { + num.Add(&num.Int, BigInt1) +} + +func (num *Number) rshX(bits uint) (res int) { + res = int(new(big.Int).And(&num.Int, new(big.Int).SetUint64((1< length { + panic("buffer too small") + } + if len(b) == length { + return b + } + return append(make([]byte, length-len(b)), b...) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go new file mode 100644 index 00000000..1cbb4ae3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go @@ -0,0 +1,64 @@ +/* +Package secp256k1go implements the underlying secp256k1 primitives +*/ +package secp256k1go + +const winA = 5 +const winG = 14 + +// TheCurve is the secp256k1 curve +var TheCurve struct { + Order Number // the order of the base point (stdlib crypto/elliptic.CurveParams.N) + halfOrder Number // half of the Order value + G XY // (x, y) of the base point (stdlib crypto/elliptic.CurveParams.Gx, Gy) + beta Field // endomorphism optimization parameter (derived from Hal Finney's post https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565) + lambda, a1b2, b1, a2 Number // endomorphism optimization parameters (derived from Hal Finney's post https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565) + p Number // // the order of the underlying field (stdlib crypto/elliptic.CurveParams.P) +} + +func initConstants() { + TheCurve.Order.SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41}) + + TheCurve.halfOrder.SetBytes([]byte{ + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X5D, 0X57, 0X6E, 0X73, 0X57, 0XA4, 0X50, 0X1D, 0XDF, 0XE9, 0X2F, 0X46, 0X68, 0X1B, 0X20, 0XA0}) + + TheCurve.p.SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F}) + + TheCurve.G.X.SetB32([]byte{ + 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, 0x07, + 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98}) + + TheCurve.G.Y.SetB32([]byte{ + 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, 0xA8, + 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, 0xB8}) + + // See Hal Finney's post https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565 + // Backup archive: https://gist.github.com/gz-c/bf70ce96b2488e5ccca65900086c75f5 + // for explanation of the following constants: + + TheCurve.lambda.SetBytes([]byte{ + 0x53, 0x63, 0xad, 0x4c, 0xc0, 0x5c, 0x30, 0xe0, 0xa5, 0x26, 0x1c, 0x02, 0x88, 0x12, 0x64, 0x5a, + 0x12, 0x2e, 0x22, 0xea, 0x20, 0x81, 0x66, 0x78, 0xdf, 0x02, 0x96, 0x7c, 0x1b, 0x23, 0xbd, 0x72}) + + TheCurve.beta.SetB32([]byte{ + 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9, + 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee}) + + TheCurve.a1b2.SetBytes([]byte{ + 0x30, 0x86, 0xd2, 0x21, 0xa7, 0xd4, 0x6b, 0xcd, 0xe8, 0x6c, 0x90, 0xe4, 0x92, 0x84, 0xeb, 0x15}) + + TheCurve.b1.SetBytes([]byte{ + 0xe4, 0x43, 0x7e, 0xd6, 0x01, 0x0e, 0x88, 0x28, 0x6f, 0x54, 0x7f, 0xa9, 0x0a, 0xbf, 0xe4, 0xc3}) + + TheCurve.a2.SetBytes([]byte{ + 0x01, 0x14, 0xca, 0x50, 0xf7, 0xa8, 0xe2, 0xf3, 0xf6, 0x57, 0xc1, 0x10, 0x8d, 0x9d, 0x44, 0xcf, 0xd8}) +} + +func init() { + initConstants() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go new file mode 100644 index 00000000..2ea702c3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go @@ -0,0 +1,280 @@ +package secp256k1go + +import ( + "bytes" + "log" +) + +// Signature represents the signature +type Signature struct { + R, S Number +} + +// Verify verify the signature +func (sig *Signature) Verify(pubkey *XY, message *Number) bool { + var r2 Number + return sig.recompute(&r2, pubkey, message) && sig.R.Cmp(&r2.Int) == 0 +} + +func (sig *Signature) recompute(r2 *Number, pubkey *XY, message *Number) bool { + var sn, u1, u2 Number + + sn.modInv(&sig.S, &TheCurve.Order) + u1.modMul(&sn, message, &TheCurve.Order) + u2.modMul(&sn, &sig.R, &TheCurve.Order) + + var pr, pubkeyj XYZ + pubkeyj.SetXY(pubkey) + + pubkeyj.ECmult(&pr, &u2, &u1) + if pr.IsInfinity() { + return false + } + + var xr Field + pr.getX(&xr) + xr.Normalize() + var xrb [32]byte + xr.GetB32(xrb[:]) + r2.SetBytes(xrb[:]) + r2.Mod(&r2.Int, &TheCurve.Order.Int) + + return true +} + +/* +Reference code for Signature.Recover + +https://github.com/bitcoin-core/secp256k1/blob/e541a90ef6461007d9c6a74b9f9a7fb8aa34aaa8/src/modules/recovery/main_impl.h + +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar* sigs, secp256k1_ge *pubkey, const secp256k1_scalar *message, int recid) { + unsigned char brx[32]; + secp256k1_fe fx; + secp256k1_ge x; + secp256k1_gej xj; + secp256k1_scalar rn, u1, u2; + secp256k1_gej qj; + int r; + + if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { + return 0; + } + + secp256k1_scalar_get_b32(brx, sigr); + r = secp256k1_fe_set_b32(&fx, brx); + (void)r; + VERIFY_CHECK(r); // brx comes from a scalar, so is less than the order; certainly less than p + if (recid & 2) { + if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + return 0; + } + secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); + } + if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { + return 0; + } + secp256k1_gej_set_ge(&xj, &x); + secp256k1_scalar_inverse_var(&rn, sigr); + secp256k1_scalar_mul(&u1, &rn, message); + secp256k1_scalar_negate(&u1, &u1); + secp256k1_scalar_mul(&u2, &rn, sigs); + secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); + secp256k1_ge_set_gej_var(pubkey, &qj); + return !secp256k1_gej_is_infinity(&qj); +} +*/ + +// Recover recovers a pubkey XY point given the message that was signed to create +// this signature. +func (sig *Signature) Recover(pubkey *XY, msg *Number, recid int) bool { + var rx, rn, u1, u2 Number + var fx Field + var x XY + var xj, qj XYZ + + if sig.R.Sign() == 0 || sig.S.Sign() == 0 { + return false + } + + rx.Set(&sig.R.Int) + if (recid & 2) != 0 { + rx.Add(&rx.Int, &TheCurve.Order.Int) + if rx.Cmp(&TheCurve.p.Int) >= 0 { + return false + } + } + + fx.SetB32(LeftPadBytes(rx.Bytes(), 32)) + + x.SetXO(&fx, (recid&1) != 0) + if !x.IsValid() { + return false + } + + xj.SetXY(&x) + rn.modInv(&sig.R, &TheCurve.Order) + u1.modMul(&rn, msg, &TheCurve.Order) + u1.Sub(&TheCurve.Order.Int, &u1.Int) + u2.modMul(&rn, &sig.S, &TheCurve.Order) + xj.ECmult(&qj, &u2, &u1) + pubkey.SetXYZ(&qj) + return !qj.IsInfinity() +} + +/* +Reference code for Signature.Sign + +https://github.com/bitcoin-core/secp256k1/blob/master/src/ecdsa_impl.h + +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) { + unsigned char b[32]; + secp256k1_gej rp; + secp256k1_ge r; + secp256k1_scalar n; + int overflow = 0; + + secp256k1_ecmult_gen(ctx, &rp, nonce); + secp256k1_ge_set_gej(&r, &rp); + secp256k1_fe_normalize(&r.x); + secp256k1_fe_normalize(&r.y); + secp256k1_fe_get_b32(b, &r.x); + secp256k1_scalar_set_b32(sigr, b, &overflow); + // These two conditions should be checked before calling + VERIFY_CHECK(!secp256k1_scalar_is_zero(sigr)); + VERIFY_CHECK(overflow == 0); + + if (recid) { + // The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log + // of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria. + *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); + } + secp256k1_scalar_mul(&n, sigr, seckey); + secp256k1_scalar_add(&n, &n, message); + secp256k1_scalar_inverse(sigs, nonce); + secp256k1_scalar_mul(sigs, sigs, &n); + secp256k1_scalar_clear(&n); + secp256k1_gej_clear(&rp); + secp256k1_ge_clear(&r); + if (secp256k1_scalar_is_zero(sigs)) { + return 0; + } + if (secp256k1_scalar_is_high(sigs)) { + secp256k1_scalar_negate(sigs, sigs); + if (recid) { + *recid ^= 1; + } + } + return 1; +} +*/ + +// Sign signs the signature. Returns 1 on success, 0 on failure +func (sig *Signature) Sign(seckey, message, nonce *Number, recid *int) int { + var r XY + var n Number + var b [32]byte + + // r = nonce*G + rp := ECmultGen(*nonce) + r.SetXYZ(&rp) + r.X.Normalize() + r.Y.Normalize() + r.X.GetB32(b[:]) + sig.R.SetBytes(b[:]) + + if sig.R.Sign() == 0 { + log.Panic("sig R value should not be 0") + } + + if recid != nil { + *recid = 0 + // The overflow condition is cryptographically unreachable as hitting + // it requires finding the discrete log of some P where P.x >= order, + // and only 1 in about 2^127 points meet this criteria. + if sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + *recid |= 2 + } + if r.Y.IsOdd() { + *recid |= 1 + } + } + + sig.R.mod(&TheCurve.Order) + n.modMul(&sig.R, seckey, &TheCurve.Order) + n.Add(&n.Int, &message.Int) + n.mod(&TheCurve.Order) + sig.S.modInv(nonce, &TheCurve.Order) + sig.S.modMul(&sig.S, &n, &TheCurve.Order) + + if sig.S.Sign() == 0 { + return 0 + } + + // Break signature malleability + if sig.S.Cmp(&TheCurve.halfOrder.Int) == 1 { + sig.S.Sub(&TheCurve.Order.Int, &sig.S.Int) + if recid != nil { + *recid ^= 1 + } + } + + return 1 +} + +// ParseBytes parses a serialized R||S pair to Signature. +// R and S should be in big-endian encoding. +func (sig *Signature) ParseBytes(v []byte) { + if len(v) != 64 { + log.Panic("Signature.ParseBytes requires 64 bytes") + } + sig.R.SetBytes(v[0:32]) + sig.S.SetBytes(v[32:64]) +} + +//secp256k1_num_get_bin(sig64, 32, &sig.r); +//secp256k1_num_get_bin(sig64 + 32, 32, &sig.s); + +// Bytes serializes compressed signatures as bytes. +// The serialization format is R||S. R and S bytes are big-endian. +// R and S are left-padded with the NUL byte to ensure their length is 32 bytes. +func (sig *Signature) Bytes() []byte { + r := sig.R.Bytes() // big-endian + s := sig.S.Bytes() // big-endian + + for len(r) < 32 { + r = append([]byte{0}, r...) + } + for len(s) < 32 { + s = append([]byte{0}, s...) + } + + if len(r) != 32 || len(s) != 32 { + log.Panicf("signature size invalid: %d, %d", len(r), len(s)) + } + + res := new(bytes.Buffer) + if _, err := res.Write(r); err != nil { + log.Panic(err) + } + if _, err := res.Write(s); err != nil { + log.Panic(err) + } + + //test + if true { + ret := res.Bytes() + var sig2 Signature + sig2.ParseBytes(ret) + if !bytes.Equal(sig.R.Bytes(), sig2.R.Bytes()) { + log.Panic("serialization failed 1") + } + if !bytes.Equal(sig.S.Bytes(), sig2.S.Bytes()) { + log.Panic("serialization failed 2") + } + } + + if len(res.Bytes()) != 64 { + log.Panic("Signature.Bytes result bytes must be 64 bytes long") + } + return res.Bytes() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig_test.go new file mode 100644 index 00000000..15641a74 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig_test.go @@ -0,0 +1,351 @@ +package secp256k1go + +import ( + "encoding/hex" + "fmt" + "testing" +) + +func TestSigForceLowS(t *testing.T) { + // forceLowS was a hardcoded parameter that forced the Signature's S point + // to be "low", i.e. below the half-order of the curve. + // This is necessary to break signature malleability and should always be on, + // so the forceLowS parameter was removed, and the current code is equivalent + // to forceLowS=true. + + // Check that forceLowS forces the S point to the lower half of the curve + var sec, msg, non Number + sec.SetHex("7A642C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") + msg.SetHex("DD72CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + non.SetHex("9F3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + + // The signature when forceLowS is true (not malleable) + sigHexLowS := "8c20a668be1b5a910205de46095023fe4823a3757f4417114168925f28193bff520ce833da9313d726f2a4d481e3195a5dd8e935a6c7f4dc260ed4c66ebe6da7" + // The signature when forceLowS is false (malleable) + // "8c20a668be1b5a910205de46095023fe4823a3757f4417114168925f28193bffadf317cc256cec28d90d5b2b7e1ce6a45cd5f3b10880ab5f99c389c66177d39a" + + var sig Signature + var recid int + res := sig.Sign(&sec, &msg, &non, &recid) + if res != 1 { + t.Error("res failed", res) + return + } + + if recid != 0 { + t.Error("recid should be 0 because of forceLowS") + } + if sigHexLowS != hex.EncodeToString(sig.Bytes()) { + t.Error("forceLowS did not modify the S point as expected") + } +} + +func TestSigRecover(t *testing.T) { + cases := []struct { + r string + s string + msg string + recid int + x string + y string + }{ + { + r: "6028b9e3a31c9e725fcbd7d5d16736aaaafcc9bf157dfb4be62bcbcf0969d488", + s: "036d4a36fa235b8f9f815aa6f5457a607f956a71a035bf0970d8578bf218bb5a", + msg: "9cff3da1a4f86caf3683f865232c64992b5ed002af42b321b8d8a48420680487", + recid: 0, + x: "56dc5df245955302893d8dda0677cc9865d8011bc678c7803a18b5f6faafec08", + y: "54b5fbdcd8fac6468dac2de88fadce6414f5f3afbb103753e25161bef77705a6", + }, + { + r: "b470e02f834a3aaafa27bd2b49e07269e962a51410f364e9e195c31351a05e50", + s: "560978aed76de9d5d781f87ed2068832ed545f2b21bf040654a2daff694c8b09", + msg: "9ce428d58e8e4caf619dc6fc7b2c2c28f0561654d1f80f322c038ad5e67ff8a6", + recid: 1, + x: "15b7e7d00f024bffcd2e47524bb7b7d3a6b251e23a3a43191ed7f0a418d9a578", + y: "bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840", + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("%s,%s", tc.r, tc.s), func(t *testing.T) { + var sig Signature + var pubkey, expectedPubkey XY + var msg Number + + sig.R.SetHex(tc.r) + sig.S.SetHex(tc.s) + msg.SetHex(tc.msg) + + expectedPubkey.X.SetHex(tc.x) + expectedPubkey.Y.SetHex(tc.y) + + if sig.Recover(&pubkey, &msg, tc.recid) { + if !expectedPubkey.X.Equals(&pubkey.X) { + t.Error("X mismatch") + } + if !expectedPubkey.Y.Equals(&pubkey.Y) { + t.Error("Y mismatch") + } + } else { + t.Error("sig.Recover failed") + } + }) + } +} + +func TestSigRecover2(t *testing.T) { + cases := []struct { + msg string + sig string + pubkey string + recoverFails bool + }{ + { + msg: "016b81623cf98f45879f3a48fa34af77dde44b2ffa0ddd2bf9edb386f76ec0ef", + sig: "d2a8ec2b29ce3cf3e6048296188adff4b5dfcb337c1d1157f28654e445bb940b4e47d6b0c7ba43d072bf8618775f123a435e8d1a150cb39bbb1aa80da8c57ea100", + pubkey: "03c0b0e24d55255f7aefe3da7a947a63028b573f45356a9c22e9a3c103fd00c3d1", + }, + + { + msg: "176b81623cf98f45879f3a48fa34af77dde44b2ffa0ddd2bf9edb386f76ec0ef", + sig: "d2a8ec2b20ce3cf3e6048296188adff4b5dfcb337c1d1157f28654e445bb940b4e47d6b0c7ba43d072bf8618775f123a435e8d1a150cb39bbb1aa80da8c57ea100", + pubkey: "03cee91b6d329e00c344ad5d67cfd00d885ec36e8975b5d9097738939cb8c08b31", + }, + { + msg: "176b81623cf98f45879f3a48fa34af77dde44b2ffa0ddd2bf9edb386f76ec0ef", + sig: "d201ec2b29ce3cf3e6048296188adff4b5dfcb337c1d1157f28654e445bb940b4e47d6b0c7ba43d072bf8618775f123a435e8d1a150cb39bbb1aa80da8c57ea100", + recoverFails: true, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("%s-%s", tc.msg, tc.sig), func(t *testing.T) { + var sig Signature + var pubkey XY + var msg Number + + sigBytes, err := hex.DecodeString(tc.sig) + if err != nil { + t.Error("invalid sig hex") + } + recid := int(sigBytes[64]) + sig.R.SetBytes(sigBytes[:32]) + sig.S.SetBytes(sigBytes[32:64]) + msg.SetHex(tc.msg) + + if sig.Recover(&pubkey, &msg, recid) { + if tc.recoverFails { + t.Error("sig.Recover expected to fail") + } + + pubkeyHex := hex.EncodeToString(pubkey.Bytes()) + if tc.pubkey != pubkeyHex { + t.Errorf("pubkey does not match %s != %s", tc.pubkey, pubkeyHex) + } + } else { + if !tc.recoverFails { + t.Error("sig.Recover failed") + } + } + }) + } +} + +func TestSigVerify(t *testing.T) { + var msg Number + var sig Signature + var key XY + + //// len(65) keys are rejected now, this test case is invalid: + // msg.SetHex("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") + // sig.R.SetHex("fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b10") + // sig.S.SetHex("7d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c") + // xy, _ := hex.DecodeString("040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + // key.ParsePubkey(xy) + // if !sig.Verify(&key, &msg) { + // t.Error("sig.Verify 0") + // } + + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + sig.R.SetHex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980") + sig.S.SetHex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") + key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93") + key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602") + if !sig.Verify(&key, &msg) { + t.Error("sig.Verify 1") + } + + msg.SetHex("2c43a883f4edc2b66c67a7a355b9312a565bb3d33bb854af36a06669e2028377") + sig.R.SetHex("6b2fa9344462c958d4a674c2a42fbedf7d6159a5276eb658887e2e1b3915329b") + sig.S.SetHex("eddc6ea7f190c14a0aa74e41519d88d2681314f011d253665f301425caf86b86") + xy, err := hex.DecodeString("02a60d70cfba37177d8239d018185d864b2bdd0caf5e175fd4454cc006fd2d75ac") + if err != nil { + t.Fail() + } + + if err := key.ParsePubkey(xy); err != nil { + t.Errorf("ParsePubkey failed: %v", err) + } + if !sig.Verify(&key, &msg) { + t.Error("sig.Verify 2") + } +} + +func TestSigSign(t *testing.T) { + var sec, msg, non Number + var sig Signature + var recid int + sec.SetHex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + non.SetHex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + res := sig.Sign(&sec, &msg, &non, &recid) + if res != 1 { + t.Error("res failed", res) + } + if recid != 0 { + t.Error("recid failed", recid) + } + non.SetHex("98f9d784ba6c5c77bb7323d044c0fc9f2b27baa0a5b0718fe88596cc56681980") + if sig.R.Cmp(&non.Int) != 0 { + t.Error("R failed", sig.R.String()) + } + non.SetHex("1ca662aaefd6cc958ba4604fea999db133a75bf34c13334dabac7124ff0cfcc1") + if sig.S.Cmp(&non.Int) != 0 { + t.Error("S failed", sig.S.String()) + } + expectSig := "98f9d784ba6c5c77bb7323d044c0fc9f2b27baa0a5b0718fe88596cc566819801ca662aaefd6cc958ba4604fea999db133a75bf34c13334dabac7124ff0cfcc1" + if expectSig != hex.EncodeToString(sig.Bytes()) { + t.Error("signature doesnt match") + } +} + +func TestSigSignRecover(t *testing.T) { + cases := []struct { + // inputs + seckey string + digest string + nonce string + + // outputs + sig string + recid int + pubkey string + }{ + { + seckey: "597e27368656cab3c82bfcf2fb074cefd8b6101781a27709ba1b326b738d2c5a", + digest: "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7", + nonce: "01", + sig: "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179804641a7472bb90647fa60b4d30aef8c7279e4b68226f7b2713dab712ef122f8b", + recid: 1, + pubkey: "02df09821cff4874198a1dbdc462d224bd99728eeed024185879225762376132c7", + }, + + { + seckey: "597e27368656cab3c82bfcf2fb074cefd8b6101781a27709ba1b326b738d2c5a", + digest: "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7", + nonce: "fe25", + sig: "ee38f27be5f3c4b8db875c0ffbc0232e93f622d16ede888508a4920ab51c3c9906ea7426c5e251e4bea76f06f554fa7798a49b7968b400fa981c51531a5748d8", + recid: 1, + pubkey: "02df09821cff4874198a1dbdc462d224bd99728eeed024185879225762376132c7", + }, + + { + seckey: "597e27368656cab3c82bfcf2fb074cefd8b6101781a27709ba1b326b738d2c5a", + digest: "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7", + nonce: "fe250100", + sig: "d4d869ad39cb3a64fa1980b47d1f19bd568430d3f929e01c00f1e5b7c6840ba85e08d5781986ee72d1e8ebd4dd050386a64eee0256005626d2acbe3aefee9e25", + recid: 0, + pubkey: "02df09821cff4874198a1dbdc462d224bd99728eeed024185879225762376132c7", + }, + + { + seckey: "67a331669081d22624f16512ea61e1d44cb3f26af3333973d17e0e8d03733b78", + digest: "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7", + nonce: "1e2501ac", + sig: "eeee743d79b40aaa52d9eeb48791b0ae81a2f425bf99cdbc84180e8ed429300d457e8d669dbff1716b123552baf6f6f0ef67f16c1d9ccd44e6785d4240022126", + recid: 1, + pubkey: "0270b763664593c5f84dfb20d23ef79530fc317e5ee2ece0d9c50f432f62426ff9", + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("%s-%s-%s", tc.seckey, tc.digest, tc.nonce), func(t *testing.T) { + var sec, msg, non Number + var sig Signature + sec.SetHex(tc.seckey) + msg.SetHex(tc.digest) + non.SetHex(tc.nonce) + + recid := 0 + res := sig.Sign(&sec, &msg, &non, &recid) + if res != 1 { + t.Error("sig.Sign failed") + } + + if recid != tc.recid { + t.Error("recid doesn't match") + } + + sigHex := hex.EncodeToString(sig.Bytes()) + if tc.sig != sigHex { + t.Errorf("signature doesn't match %s != %s", tc.sig, sigHex) + } + + skb, err := hex.DecodeString(tc.seckey) + if err != nil { + t.Error(err) + } + + derivedPk := GeneratePublicKey(skb) + if derivedPk == nil { + t.Error("failed to derive pubkey from seckey") + } + derivedPkHex := hex.EncodeToString(derivedPk) + if tc.pubkey != derivedPkHex { + t.Errorf("derived pubkey doesn't match %s != %s", tc.pubkey, derivedPkHex) + } + + var pk XY + ret := sig.Recover(&pk, &msg, recid) + if !ret { + t.Error("sig.Recover failed") + } + + pkHex := hex.EncodeToString(pk.Bytes()) + if tc.pubkey != pkHex { + t.Errorf("recovered pubkey doesn't match %s != %s", tc.pubkey, pkHex) + } + }) + } +} + +func BenchmarkVerify(b *testing.B) { + var msg Number + var sig Signature + var key XY + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + sig.R.SetHex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980") + sig.S.SetHex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") + key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93") + key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602") + b.ResetTimer() + for i := 0; i < b.N; i++ { + if !sig.Verify(&key, &msg) { + b.Fatal("sig_verify failed") + } + } +} + +func BenchmarkSign(b *testing.B) { + var sec, msg, non Number + var sig Signature + var recid int + sec.SetHex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + non.SetHex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + b.ResetTimer() + for i := 0; i < b.N; i++ { + sig.Sign(&sec, &msg, &non, &recid) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go new file mode 100644 index 00000000..a6f9d6c8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go @@ -0,0 +1,244 @@ +package secp256k1go + +import ( + "errors" + "log" +) + +// XY is a point on the secp256k1 curve +type XY struct { + X, Y Field + Infinity bool +} + +func (xy *XY) String() string { + if xy.Infinity { + return "Infinity" + } + return xy.X.String() + "," + xy.Y.String() +} + +//edited + +/* + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + secp256k1_fe_set_b32(&x, pub+1); + return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + secp256k1_fe_set_b32(&x, pub+1); + secp256k1_fe_set_b32(&y, pub+33); + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) + return 0; + return secp256k1_ge_is_valid(elem); + } +*/ +//All compact keys appear to be valid by construction, but may fail +//is valid check + +// ParsePubkey parses a compressed pubkey to a point on the curve +func (xy *XY) ParsePubkey(pub []byte) error { + // ParsePubkey WARNING: for compact signatures, will succeed unconditionally + //however, elem.IsValid will fail + if len(pub) != 33 { + log.Panic("pubkey len must be 33 bytes") // do not permit invalid length inputs + return errors.New("pubkey len must be 33 bytes") + } + if len(pub) == 33 && (pub[0] == 0x02 || pub[0] == 0x03) { + xy.X.SetB32(pub[1:33]) + xy.SetXO(&xy.X, pub[0] == 0x03) + } else { + return errors.New("pubkey y-coordinate parity byte is invalid") // the leading bytes indicates if Y is odd or not + } + //THIS FAILS + //reenable later + //if !elem.IsValid() { + // return false + //} + + /* + else if len(pub) == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07) { + elem.X.SetB32(pub[1:33]) + elem.Y.SetB32(pub[33:65]) + if (pub[0] == 0x06 || pub[0] == 0x07) && elem.Y.IsOdd() != (pub[0] == 0x07) { + return false + } + } + */ + return nil +} + +// Bytes returns the compressed public key (33 bytes) in the format +// "<0x03> " or <0x02> ". The leading byte is 0x03 if the Y point is odd. +func (xy XY) Bytes() []byte { + xy.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + + raw := make([]byte, 33) + if xy.Y.IsOdd() { + raw[0] = 0x03 + } else { + raw[0] = 0x02 + } + xy.X.GetB32(raw[1:]) + return raw +} + +// BytesUncompressed returns serialized key in uncompressed format "<04> " +//65 bytes +func (xy *XY) BytesUncompressed() (raw []byte) { + xy.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + xy.Y.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + + raw = make([]byte, 65) + raw[0] = 0x04 + xy.X.GetB32(raw[1:33]) + xy.Y.GetB32(raw[33:65]) + return +} + +// SetXY sets x y fields +func (xy *XY) SetXY(X, Y *Field) { + xy.Infinity = false + xy.X = *X + xy.Y = *Y +} + +/* +int static secp256k1_ecdsa_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size) { + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + secp256k1_fe_set_b32(&x, pub+1); + return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + secp256k1_fe_set_b32(&x, pub+1); + secp256k1_fe_set_b32(&y, pub+33); + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) + return 0; + return secp256k1_ge_is_valid(elem); + } else { + return 0; + } +} +*/ + +// if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { +// secp256k1_fe_t x; +// secp256k1_fe_set_b32(&x, pub+1); +// return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + +// IsValid checks that the point is not infinity and is on the secp256k1 curve +func (xy *XY) IsValid() bool { + // Adopted from libsecp256k1: + // https://github.com/bitcoin-core/secp256k1/blob/2ebdad772af770b4587af0856de27c63de1b03be/src/group_impl.h#L292-L304 + /* + static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) { + secp256k1_fe y2, x3, c; + if (a->infinity) { + return 0; + } + // y^2 = x^3 + 7 // + secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_set_int(&c, CURVE_B); + secp256k1_fe_add(&x3, &c); + secp256k1_fe_normalize_weak(&x3); + return secp256k1_fe_equal_var(&y2, &x3); + } + */ + if xy.Infinity { + return false + } + var y2, x3, c Field + xy.Y.Sqr(&y2) + xy.X.Sqr(&x3) + x3.Mul(&x3, &xy.X) + c.SetInt(7) + x3.SetAdd(&c) + y2.Normalize() + x3.Normalize() + return y2.Equals(&x3) +} + +// SetXYZ sets X Y Z fields +func (xy *XY) SetXYZ(a *XYZ) { + var z2, z3 Field + a.Z.InvVar(&a.Z) + a.Z.Sqr(&z2) + a.Z.Mul(&z3, &z2) + a.X.Mul(&a.X, &z2) + a.Y.Mul(&a.Y, &z3) + a.Z.SetInt(1) + xy.Infinity = a.Infinity + xy.X = a.X + xy.Y = a.Y +} + +func (xy *XY) precomp(w int) []XY { //nolint:unused,megacheck + pre := make([]XY, (1 << (uint(w) - 2))) + pre[0] = *xy + var X, d, tmp XYZ + X.SetXY(xy) + X.Double(&d) + for i := 1; i < len(pre); i++ { + d.AddXY(&tmp, &pre[i-1]) + pre[i].SetXYZ(&tmp) + } + return pre +} + +// Neg caculates negate +func (xy *XY) Neg(r *XY) { + r.Infinity = xy.Infinity + r.X = xy.X + r.Y = xy.Y + r.Y.Normalize() + r.Y.Negate(&r.Y, 1) +} + +/* +int static secp256k1_ge_set_xo(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd) { + r->x = *x; + secp256k1_fe_t x2; secp256k1_fe_sqr(&x2, x); + secp256k1_fe_t x3; secp256k1_fe_mul(&x3, x, &x2); + r->infinity = 0; + secp256k1_fe_t c; secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&c, &x3); + if (!secp256k1_fe_sqrt(&r->y, &c)) + return 0; + secp256k1_fe_normalize(&r->y); + if (secp256k1_fe_is_odd(&r->y) != odd) + secp256k1_fe_negate(&r->y, &r->y, 1); + return 1; +} +*/ + +// SetXO sets the X and Y field from an X value and flag indicating whether or +// not Y is odd. +func (xy *XY) SetXO(X *Field, odd bool) { + var c, x2, x3 Field + xy.X = *X + X.Sqr(&x2) + X.Mul(&x3, &x2) + xy.Infinity = false + c.SetInt(7) + c.SetAdd(&x3) + c.Sqrt(&xy.Y) //does not return, can fail + if xy.Y.IsOdd() != odd { + xy.Y.Negate(&xy.Y, 1) + } + + //r.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + xy.Y.Normalize() +} + +// AddXY adds xy +func (xy *XY) AddXY(a *XY) { + var xyz XYZ + xyz.SetXY(xy) + xyz.AddXY(&xyz, a) + xy.SetXYZ(&xyz) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go new file mode 100644 index 00000000..88a0a1ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go @@ -0,0 +1,378 @@ +package secp256k1go + +// XYZ contains xyz fields +type XYZ struct { + X, Y, Z Field + Infinity bool +} + +func (xyz XYZ) String() string { + if xyz.Infinity { + return "INFINITY" + } + return xyz.X.String() + "," + xyz.Y.String() + "," + xyz.Z.String() +} + +// SetXY sets xy +func (xyz *XYZ) SetXY(a *XY) { + xyz.Infinity = a.Infinity + xyz.X = a.X + xyz.Y = a.Y + xyz.Z.SetInt(1) +} + +// IsInfinity check if xyz is infinity +func (xyz *XYZ) IsInfinity() bool { + return xyz.Infinity +} + +// IsValid check if xyz is valid +func (xyz *XYZ) IsValid() bool { + if xyz.Infinity { + return false + } + var y2, x3, z2, z6 Field + xyz.Y.Sqr(&y2) + xyz.X.Sqr(&x3) + x3.Mul(&x3, &xyz.X) + xyz.Z.Sqr(&z2) + z2.Sqr(&z6) + z6.Mul(&z6, &z2) + z6.MulInt(7) + x3.SetAdd(&z6) + y2.Normalize() + x3.Normalize() + return y2.Equals(&x3) +} + +func (xyz *XYZ) getX(r *Field) { + var zi2 Field + xyz.Z.InvVar(&zi2) + zi2.Sqr(&zi2) + xyz.X.Mul(r, &zi2) +} + +// Normalize normalize all fields +func (xyz *XYZ) Normalize() { + xyz.X.Normalize() + xyz.Y.Normalize() + xyz.Z.Normalize() +} + +// Equals checks if equal +func (xyz *XYZ) Equals(b *XYZ) bool { + if xyz.Infinity != b.Infinity { + return false + } + // TODO: is the normalize really needed here? + xyz.Normalize() + b.Normalize() + return xyz.X.Equals(&b.X) && xyz.Y.Equals(&b.Y) && xyz.Z.Equals(&b.Z) +} + +func (xyz *XYZ) precomp(w int) (pre []XYZ) { //nolint:unparam + var d XYZ + pre = make([]XYZ, (1 << (uint(w) - 2))) + pre[0] = *xyz + pre[0].Double(&d) + for i := 1; i < len(pre); i++ { + d.Add(&pre[i], &pre[i-1]) + } + return +} + +func ecmultWnaf(wnaf []int, a *Number, w uint) (ret int) { + var zeroes uint + var X Number + X.Set(&a.Int) + + for X.Sign() != 0 { + for X.Bit(0) == 0 { + zeroes++ + X.rsh(1) + } + word := X.rshX(w) + for zeroes > 0 { + wnaf[ret] = 0 + ret++ + zeroes-- + } + if (word & (1 << (w - 1))) != 0 { + X.inc() + wnaf[ret] = (word - (1 << w)) + } else { + wnaf[ret] = word + } + zeroes = w - 1 + ret++ + } + return +} + +// ECmult r = na*a + ng*G +func (xyz *XYZ) ECmult(r *XYZ, na, ng *Number) { + var na1, naLam, ng1, ng128 Number + + // split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) + na.splitExp(&na1, &naLam) + + // split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) + ng.split(&ng1, &ng128, 128) + + // build wnaf representation for na_1, na_lam, ng_1, ng_128 + var wnafNa1, wnafNaLam, wnafNg1, wnafNg128 [129]int + bitsNa1 := ecmultWnaf(wnafNa1[:], &na1, winA) + bitsNaLam := ecmultWnaf(wnafNaLam[:], &naLam, winA) + bitsNg1 := ecmultWnaf(wnafNg1[:], &ng1, winG) + bitsNg128 := ecmultWnaf(wnafNg128[:], &ng128, winG) + + // calculate a_lam = a*lambda + var aLam XYZ + xyz.mulLambda(&aLam) + + // calculate odd multiples of a and a_lam + preA1 := xyz.precomp(winA) + preALam := aLam.precomp(winA) + + bits := bitsNa1 + if bitsNaLam > bits { + bits = bitsNaLam + } + if bitsNg1 > bits { + bits = bitsNg1 + } + if bitsNg128 > bits { + bits = bitsNg128 + } + + r.Infinity = true + + var tmpj XYZ + var tmpa XY + var n int + + for i := bits - 1; i >= 0; i-- { + r.Double(r) + + if i < bitsNa1 { + n = wnafNa1[i] + if n > 0 { + r.Add(r, &preA1[((n)-1)/2]) + } else if n != 0 { + preA1[(-(n)-1)/2].Neg(&tmpj) + r.Add(r, &tmpj) + } + } + + if i < bitsNaLam { + n = wnafNaLam[i] + if n > 0 { + r.Add(r, &preALam[((n)-1)/2]) + } else if n != 0 { + preALam[(-(n)-1)/2].Neg(&tmpj) + r.Add(r, &tmpj) + } + } + + if i < bitsNg1 { + n = wnafNg1[i] + if n > 0 { + r.AddXY(r, &preG[((n)-1)/2]) + } else if n != 0 { + preG[(-(n)-1)/2].Neg(&tmpa) + r.AddXY(r, &tmpa) + } + } + + if i < bitsNg128 { + n = wnafNg128[i] + if n > 0 { + r.AddXY(r, &preG128[((n)-1)/2]) + } else if n != 0 { + preG128[(-(n)-1)/2].Neg(&tmpa) + r.AddXY(r, &tmpa) + } + } + } +} + +// Neg caculate neg +func (xyz *XYZ) Neg(r *XYZ) { + r.Infinity = xyz.Infinity + r.X = xyz.X + r.Y = xyz.Y + r.Z = xyz.Z + r.Y.Normalize() + r.Y.Negate(&r.Y, 1) +} + +func (xyz *XYZ) mulLambda(r *XYZ) { + *r = *xyz + r.X.Mul(&r.X, &TheCurve.beta) +} + +// Double cacule double +func (xyz *XYZ) Double(r *XYZ) { + var t1, t2, t3, t4, t5 Field + + t5 = xyz.Y + t5.Normalize() + if xyz.Infinity || t5.IsZero() { + r.Infinity = true + return + } + + t5.Mul(&r.Z, &xyz.Z) + r.Z.MulInt(2) + xyz.X.Sqr(&t1) + t1.MulInt(3) + t1.Sqr(&t2) + t5.Sqr(&t3) + t3.MulInt(2) + t3.Sqr(&t4) + t4.MulInt(2) + xyz.X.Mul(&t3, &t3) + r.X = t3 + r.X.MulInt(4) + r.X.Negate(&r.X, 4) + r.X.SetAdd(&t2) + t2.Negate(&t2, 1) + t3.MulInt(6) + t3.SetAdd(&t2) + t1.Mul(&r.Y, &t3) + t4.Negate(&t2, 2) + r.Y.SetAdd(&t2) + r.Infinity = false +} + +// AddXY adds XY +func (xyz *XYZ) AddXY(r *XYZ, b *XY) { + if xyz.Infinity { + r.Infinity = b.Infinity + r.X = b.X + r.Y = b.Y + r.Z.SetInt(1) + return + } + if b.Infinity { + *r = *xyz + return + } + r.Infinity = false + var z12, u1, u2, s1, s2 Field + xyz.Z.Sqr(&z12) + u1 = xyz.X + u1.Normalize() + b.X.Mul(&u2, &z12) + s1 = xyz.Y + s1.Normalize() + b.Y.Mul(&s2, &z12) + s2.Mul(&s2, &xyz.Z) + u1.Normalize() + u2.Normalize() + + if u1.Equals(&u2) { + s1.Normalize() + s2.Normalize() + if s1.Equals(&s2) { + xyz.Double(r) + } else { + r.Infinity = true + } + return + } + + var h, i, i2, h2, h3, t Field + u1.Negate(&h, 1) + h.SetAdd(&u2) + s1.Negate(&i, 1) + i.SetAdd(&s2) + i.Sqr(&i2) + h.Sqr(&h2) + h.Mul(&h3, &h2) + r.Z = xyz.Z + r.Z.Mul(&r.Z, &h) + u1.Mul(&t, &h2) + r.X = t + r.X.MulInt(2) + r.X.SetAdd(&h3) + r.X.Negate(&r.X, 3) + r.X.SetAdd(&i2) + r.X.Negate(&r.Y, 5) + r.Y.SetAdd(&t) + r.Y.Mul(&r.Y, &i) + h3.Mul(&h3, &s1) + h3.Negate(&h3, 1) + r.Y.SetAdd(&h3) +} + +// Add adds value +func (xyz *XYZ) Add(r, b *XYZ) { + if xyz.Infinity { + *r = *b + return + } + if b.Infinity { + *r = *xyz + return + } + r.Infinity = false + var z22, z12, u1, u2, s1, s2 Field + + b.Z.Sqr(&z22) + xyz.Z.Sqr(&z12) + xyz.X.Mul(&u1, &z22) + b.X.Mul(&u2, &z12) + xyz.Y.Mul(&s1, &z22) + s1.Mul(&s1, &b.Z) + b.Y.Mul(&s2, &z12) + s2.Mul(&s2, &xyz.Z) + u1.Normalize() + u2.Normalize() + if u1.Equals(&u2) { + s1.Normalize() + s2.Normalize() + if s1.Equals(&s2) { + xyz.Double(r) + } else { + r.Infinity = true + } + return + } + var h, i, i2, h2, h3, t Field + + u1.Negate(&h, 1) + h.SetAdd(&u2) + s1.Negate(&i, 1) + i.SetAdd(&s2) + i.Sqr(&i2) + h.Sqr(&h2) + h.Mul(&h3, &h2) + xyz.Z.Mul(&r.Z, &b.Z) + r.Z.Mul(&r.Z, &h) + u1.Mul(&t, &h2) + r.X = t + r.X.MulInt(2) + r.X.SetAdd(&h3) + r.X.Negate(&r.X, 3) + r.X.SetAdd(&i2) + r.X.Negate(&r.Y, 5) + r.Y.SetAdd(&t) + r.Y.Mul(&r.Y, &i) + h3.Mul(&h3, &s1) + h3.Negate(&h3, 1) + r.Y.SetAdd(&h3) +} + +// ECmultGen r = a*G +func ECmultGen(a Number) XYZ { + var n Number + var r XYZ + n.Set(&a.Int) + r.SetXY(&prec[0][n.rshX(4)]) + for j := 1; j < 64; j++ { + r.AddXY(&r, &prec[j][n.rshX(4)]) + } + r.AddXY(&r, &fin) + return r +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go new file mode 100644 index 00000000..0be6affb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go @@ -0,0 +1,49 @@ +package secp256k1go + +import ( + "testing" +) + +func TestGejDouble(t *testing.T) { + var a, aExp, r XYZ + a.X.SetHex("79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798") + a.Y.SetHex("483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") + a.Z.SetHex("01") + aExp.X.SetHex("7D152C041EA8E1DC2191843D1FA9DB55B68F88FEF695E2C791D40444B365AFC2") + aExp.Y.SetHex("56915849F52CC8F76F5FD7E4BF60DB4A43BF633E1B1383F85FE89164BFADCBDB") + aExp.Z.SetHex("9075B4EE4D4788CABB49F7F81C221151FA2F68914D0AA833388FA11FF621A970") + + a.Double(&r) + if !r.Equals(&aExp) { + t.Error("gej.Double failed") + } +} + +func TestGejMulLambda(t *testing.T) { + var a, aExp XYZ + a.X.SetHex("0eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") + a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + a.Z.SetHex("01") + aExp.X.SetHex("a45720c272cfa1f77f64be8a404a7d3149bd5410f9a173353f6eb75a5085ba98") + aExp.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + aExp.Z.SetHex("01") + aLam := a + aLam.mulLambda(&aLam) + if !aLam.Equals(&aExp) { + t.Error("mul_lambda failed") + } +} + +func TestGejGetX(t *testing.T) { + var a XYZ + var X, exp Field + a.X.SetHex("EB6752420B6BDB40A760AC26ADD7E7BBD080BF1DF6C0B009A0D310E4511BDF49") + a.Y.SetHex("8E8CEB84E1502FC536FFE67967BC44314270A0B38C79865FFED5A85D138DCA6B") + a.Z.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") + + exp.SetHex("fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b10") + a.getX(&X) + if !X.Equals(&exp) { + t.Error("get.get_x() fail") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go new file mode 100644 index 00000000..4b6c0f76 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go @@ -0,0 +1,9356 @@ +package secp256k1go + +var fin = XY{X: Field{[10]uint32{0x035871aa, 0x002dc101, 0x0059ab0f, 0x02cb297e, 0x00684bb5, 0x02585764, 0x02f3cceb, 0x002bdca3, 0x03dcb7cc, 0x0013cd56}}, Y: Field{[10]uint32{0x044d069d, 0x0603c088, 0x07541d4e, 0x04a4074d, 0x045fcba8, 0x05f00c34, 0x04bab268, 0x05fd8d65, 0x04e47151, 0x0071e924}}} + +var preG = []XY{ + {X: Field{[10]uint32{0x02f81798, 0x00a056c5, 0x028d959f, 0x036cb738, 0x03029bfc, 0x03a1c2c1, 0x0206295c, 0x02eeb156, 0x027ef9dc, 0x001e6f99}}, Y: Field{[10]uint32{0x0310d4b8, 0x01f423fe, 0x014199c4, 0x01229a15, 0x00fd17b4, 0x0384422a, 0x024fbfc0, 0x03119576, 0x027726a3, 0x00120eb6}}}, + {X: Field{[10]uint32{0x00e036f9, 0x007c44ef, 0x019b0860, 0x01160dbe, 0x01b531c8, 0x0227548a, 0x0344f85f, 0x030c4124, 0x02019258, 0x003e4c22}}, Y: Field{[10]uint32{0x00b8e672, 0x027f5d61, 0x0231b6cb, 0x0264d308, 0x026500a9, 0x028dfcd5, 0x02337e62, 0x03a0503f, 0x030f632d, 0x000e23de}}}, + {X: Field{[10]uint32{0x0240efe4, 0x02355a6c, 0x01ab7cba, 0x02f77186, 0x00e88b84, 0x0297144a, 0x034a7250, 0x00824d56, 0x024d1a07, 0x000be2f7}}, Y: Field{[10]uint32{0x02ac62d6, 0x021f4ea9, 0x02840dca, 0x006eac35, 0x02f78827, 0x01b27109, 0x01ba9dda, 0x038f5b53, 0x022636e5, 0x00362b08}}}, + {X: Field{[10]uint32{0x02c4f9bc, 0x02f77b72, 0x0239ce92, 0x01f80cc3, 0x023d419b, 0x00ba9e83, 0x018f365f, 0x02d3aa8e, 0x00646e5d, 0x00172f7c}}, Y: Field{[10]uint32{0x007264da, 0x02098a02, 0x027b5a50, 0x02e04ff7, 0x03a813d0, 0x01869536, 0x0178d6d8, 0x0165828c, 0x0240ba25, 0x001abaf2}}}, + {X: Field{[10]uint32{0x0027ccbe, 0x03c4437f, 0x02714c35, 0x025d315f, 0x01e09796, 0x03d566af, 0x02d178a9, 0x03d94c26, 0x00e2f0c7, 0x002b3521}}, Y: Field{[10]uint32{0x024f9c37, 0x03098ab1, 0x00e0f05c, 0x0290dd7e, 0x01add888, 0x018ed87a, 0x03809717, 0x0367f590, 0x0121b0a7, 0x00330ce2}}}, + {X: Field{[10]uint32{0x01a008cb, 0x0305e257, 0x03891bbe, 0x002f9705, 0x00564998, 0x003196ab, 0x034246b7, 0x0104797b, 0x03f858a9, 0x001dd2b9}}, Y: Field{[10]uint32{0x0153c61b, 0x035d3272, 0x016a8301, 0x038b7fe7, 0x01372db1, 0x01edecd9, 0x003dd56d, 0x01786409, 0x0032eb6b, 0x00366128}}}, + {X: Field{[10]uint32{0x01405aa8, 0x0377e3c6, 0x018cddee, 0x03198439, 0x01b075fb, 0x00dd2194, 0x011d205c, 0x00a22f1f, 0x03c2d975, 0x003ca1dc}}, Y: Field{[10]uint32{0x0303ed81, 0x0172d4b6, 0x0291f29b, 0x0369487e, 0x033a1a06, 0x01736bd1, 0x00212eb6, 0x002a25d6, 0x002e8d88, 0x0002ac24}}}, + {X: Field{[10]uint32{0x027e080e, 0x036f3e38, 0x0379e44a, 0x01bcf217, 0x0131e594, 0x0257fd04, 0x0065ae30, 0x03aa5969, 0x014f7d43, 0x0035e493}}, Y: Field{[10]uint32{0x02a26b58, 0x013727fd, 0x013a5c50, 0x00af625b, 0x03ea40af, 0x02331b7b, 0x0042ec22, 0x01ca9a0e, 0x0072a86c, 0x0016078a}}}, + {X: Field{[10]uint32{0x022d4a34, 0x013ea812, 0x0368766e, 0x02b9e6e5, 0x01eb9898, 0x01fab3c8, 0x020fee80, 0x01dd4290, 0x024cdb67, 0x0037bf7a}}, Y: Field{[10]uint32{0x0256eb77, 0x00667da7, 0x000f6cfb, 0x02812a57, 0x02ced1f4, 0x00aa4f6b, 0x017b0ead, 0x0145a3a6, 0x03069463, 0x0010846a}}}, + {X: Field{[10]uint32{0x00385b6c, 0x0159584e, 0x02d27747, 0x03af5fa1, 0x01f06acf, 0x0113d25e, 0x02f5cff4, 0x010f4a4f, 0x00a797a4, 0x000ad3a8}}, Y: Field{[10]uint32{0x01c09b7a, 0x00321539, 0x01763b57, 0x0031409a, 0x031a01f6, 0x02872184, 0x003083b5, 0x01764ecd, 0x03c03794, 0x00217a26}}}, + {X: Field{[10]uint32{0x01be59d5, 0x0102bbc9, 0x01071813, 0x0009c7e0, 0x001d9ad4, 0x0338cccc, 0x013fa332, 0x0049593e, 0x034a4cdd, 0x000d4aef}}, Y: Field{[10]uint32{0x0381998c, 0x034f62f3, 0x0039c67b, 0x00b9c6c4, 0x034a1b3b, 0x03768f87, 0x01c18259, 0x03d4d356, 0x00075348, 0x000c87ad}}}, + {X: Field{[10]uint32{0x02cacc3f, 0x0336b753, 0x03f29dc9, 0x037fbfd7, 0x00e42ab8, 0x0261e449, 0x03001055, 0x03446c08, 0x004d6b38, 0x000be884}}, Y: Field{[10]uint32{0x032b7d67, 0x02e9dad4, 0x02648423, 0x03b3f220, 0x00181d70, 0x02f57760, 0x00569335, 0x036196d9, 0x0068295d, 0x0000b784}}}, + {X: Field{[10]uint32{0x01453714, 0x028335fd, 0x032e269c, 0x02138255, 0x03263c3d, 0x01bb76a0, 0x021a9b06, 0x035a36ac, 0x039b09b4, 0x00249209}}, Y: Field{[10]uint32{0x03cb3402, 0x028cb3a5, 0x012ffe54, 0x00aa21e4, 0x033fc0de, 0x03a8ac7f, 0x01aa71bd, 0x02ab7974, 0x037bf234, 0x001cc05b}}}, + {X: Field{[10]uint32{0x01ee8729, 0x025b510f, 0x015c07e9, 0x00512fd8, 0x022f570e, 0x002fadd4, 0x030132fb, 0x02fc9e39, 0x032be3a8, 0x0036bb53}}, Y: Field{[10]uint32{0x00be1c55, 0x003948a4, 0x02726ab4, 0x00c3cebe, 0x003f83c2, 0x03be35c0, 0x021aca87, 0x0263a352, 0x024a7d6c, 0x0029a773}}}, + {X: Field{[10]uint32{0x0122e7db, 0x00ed7a1f, 0x001b0e6a, 0x03a7f7ca, 0x0011ecd9, 0x02ec67e4, 0x00f28d7c, 0x0204ba2b, 0x02c7065d, 0x00311344}}, Y: Field{[10]uint32{0x020e6482, 0x02418fc3, 0x021c5a03, 0x02187b7d, 0x000e106e, 0x0260bf6b, 0x0045926c, 0x01b371db, 0x0060ce32, 0x00084669}}}, + {X: Field{[10]uint32{0x0269e6b4, 0x031972f4, 0x00063b61, 0x014cdb0a, 0x03152b69, 0x03b58214, 0x01a20cfd, 0x02141322, 0x03f6dc69, 0x001a8916}}, Y: Field{[10]uint32{0x000d8a82, 0x0398d204, 0x03b6efd5, 0x01234108, 0x018b33ba, 0x005a892b, 0x03f5126f, 0x0129c22c, 0x0342c2bd, 0x003808b3}}}, + {X: Field{[10]uint32{0x010bd6a5, 0x02b95fc3, 0x01146f95, 0x002c2fb0, 0x00ce1330, 0x03950421, 0x037e3d2f, 0x03989f01, 0x03a6fd9d, 0x0005a5ff}}, Y: Field{[10]uint32{0x001b2396, 0x03a758f4, 0x00ae7ade, 0x00027926, 0x03a2cf15, 0x01155d0c, 0x0161506e, 0x01bd749d, 0x00f18680, 0x002e70e6}}}, + {X: Field{[10]uint32{0x027a7479, 0x008d17bc, 0x0361df98, 0x0183fedf, 0x019deb83, 0x020d32c3, 0x02d0f07e, 0x01c62e61, 0x03019981, 0x001816f6}}, Y: Field{[10]uint32{0x016b8c49, 0x00787a41, 0x00db43b0, 0x03a13ec5, 0x03c26bfa, 0x0325bf88, 0x0278d93e, 0x03481a06, 0x012de4f8, 0x0000a5cb}}}, + {X: Field{[10]uint32{0x007ff33d, 0x0071fa76, 0x0310cfe3, 0x00d52566, 0x00dcb01c, 0x02885784, 0x002fdc45, 0x02fd25d0, 0x01ab4150, 0x0018b453}}, Y: Field{[10]uint32{0x03b25eaf, 0x01590920, 0x0072235f, 0x00a59ead, 0x0301aa13, 0x003bb436, 0x0088a195, 0x02c04260, 0x02bd8cc5, 0x00203f01}}}, + {X: Field{[10]uint32{0x02308b6f, 0x01570be1, 0x00b425e5, 0x03d5ae6e, 0x032c50e9, 0x0102395a, 0x01b4b06c, 0x009f6b79, 0x02d0040f, 0x00203182}}, Y: Field{[10]uint32{0x030bd57a, 0x0007d590, 0x024eb1aa, 0x0132f9c0, 0x00a65eed, 0x03f9cbdc, 0x0266bad7, 0x030c3c9b, 0x003f1cc5, 0x00070e0c}}}, + {X: Field{[10]uint32{0x0203c8fb, 0x03aaec3e, 0x007049d5, 0x02521f61, 0x004cc5dc, 0x0331534d, 0x034c6348, 0x02b552a9, 0x01ad6167, 0x001ea4dd}}, Y: Field{[10]uint32{0x024dc7f7, 0x01267b08, 0x00e2b02d, 0x028431c3, 0x02bdc59e, 0x0249a411, 0x0159e0d7, 0x01c9a425, 0x03a9eca8, 0x0003438f}}}, + {X: Field{[10]uint32{0x03c3ffc9, 0x0147d166, 0x01f504bb, 0x030e6da3, 0x01bb408e, 0x01511e9e, 0x03a9ed04, 0x02d53241, 0x00d9b696, 0x00354a3b}}, Y: Field{[10]uint32{0x01409933, 0x01196d48, 0x00dbc063, 0x01017148, 0x02bc4345, 0x007f595b, 0x026f2188, 0x0397e665, 0x01253136, 0x003bb3d0}}}, + {X: Field{[10]uint32{0x00b45963, 0x00c6023e, 0x00b13872, 0x017929fb, 0x00526611, 0x023b36b4, 0x025f514e, 0x00d04ba8, 0x00a4b5f4, 0x000124dc}}, Y: Field{[10]uint32{0x02949c9a, 0x00c14a84, 0x02764b65, 0x02beed6d, 0x0254c3f3, 0x004bf58a, 0x03081b05, 0x03b50a2c, 0x0341afd6, 0x001d63cf}}}, + {X: Field{[10]uint32{0x00345d74, 0x004fac7f, 0x018e2f1c, 0x00783852, 0x03881d81, 0x0191c0bb, 0x03df930d, 0x0232ef5c, 0x00936ee8, 0x001dfc8c}}, Y: Field{[10]uint32{0x031c60d6, 0x03acf1d9, 0x037cbbe8, 0x00c365c1, 0x0096c953, 0x02e86cde, 0x008266e9, 0x02d90028, 0x002a7886, 0x002563bd}}}, + {X: Field{[10]uint32{0x0339f530, 0x0214c6dd, 0x00dbaeb2, 0x01d2ae75, 0x0258c800, 0x031f02f3, 0x004887e5, 0x0392e7a9, 0x0191cc4c, 0x003cb6b2}}, Y: Field{[10]uint32{0x003a3c37, 0x005f6e9c, 0x024fd1a1, 0x03ac1663, 0x039eb5fb, 0x03094c77, 0x021f32de, 0x0236b536, 0x009b3b2f, 0x003837b7}}}, + {X: Field{[10]uint32{0x0290d45b, 0x02921431, 0x023debcb, 0x037f276b, 0x025a216c, 0x03894804, 0x00be8fbb, 0x0087ec6d, 0x019f6626, 0x00118ecf}}, Y: Field{[10]uint32{0x02f7307e, 0x00ddec06, 0x01de31cb, 0x01f25c28, 0x03c622e2, 0x036188b5, 0x0114306d, 0x01b0d50c, 0x00d78c29, 0x0017b50c}}}, + {X: Field{[10]uint32{0x0198f247, 0x0125ad26, 0x022d1a32, 0x03050ca2, 0x036b98fa, 0x03ced665, 0x0232d4af, 0x01b8a824, 0x004244e4, 0x003c5be0}}, Y: Field{[10]uint32{0x00e31df6, 0x01e658b1, 0x00e26d65, 0x0309b973, 0x012a6c53, 0x03d38cf6, 0x01206fcd, 0x00fdf84f, 0x019b8220, 0x0033b6af}}}, + {X: Field{[10]uint32{0x011d41d1, 0x03857dc5, 0x03c65369, 0x0056b389, 0x015d2453, 0x010c46bd, 0x0352b7a1, 0x01158ec0, 0x00272dc8, 0x0032bdd5}}, Y: Field{[10]uint32{0x00a04476, 0x03e420c6, 0x032a5c32, 0x02de5888, 0x035f4fa9, 0x01791815, 0x01b643fa, 0x03d7ca90, 0x0260ef35, 0x0032d1d1}}}, + {X: Field{[10]uint32{0x03082120, 0x025ef21b, 0x017c1244, 0x001f2e1b, 0x0344a09c, 0x0265e762, 0x01d0f170, 0x02e61be1, 0x024b282c, 0x00098032}}, Y: Field{[10]uint32{0x027e4b40, 0x02fa51d6, 0x00ef44b0, 0x01d2ad7c, 0x015ac6be, 0x0376ed17, 0x013b03fc, 0x016f5a9a, 0x008753c1, 0x0010466e}}}, + {X: Field{[10]uint32{0x0198e435, 0x00a9dd1a, 0x03dc8c60, 0x0217893d, 0x0001c486, 0x0048882f, 0x00ec53cd, 0x010cb0ce, 0x0272d7e8, 0x001d8d72}}, Y: Field{[10]uint32{0x005b9c61, 0x01dbcc0b, 0x008bad9e, 0x018755c1, 0x034ecfc0, 0x03de39b5, 0x01d5e590, 0x027584f4, 0x00960948, 0x000246d9}}}, + {X: Field{[10]uint32{0x0356cc18, 0x0141d0ef, 0x028fbc1a, 0x00d1e751, 0x02b7f2b3, 0x03bba299, 0x03f4a87d, 0x015c336e, 0x0239f325, 0x001d538c}}, Y: Field{[10]uint32{0x00536683, 0x0366024f, 0x0295d0c5, 0x034065e9, 0x0023ee33, 0x013a9268, 0x00d0ed30, 0x028c3ecf, 0x0386e5bd, 0x00019cfe}}}, + {X: Field{[10]uint32{0x01d9b9e8, 0x009a51a4, 0x0152f9fe, 0x01987472, 0x00330800, 0x00b55c3c, 0x017859c8, 0x03a5abfd, 0x011071a1, 0x0038f9af}}, Y: Field{[10]uint32{0x020e37f5, 0x000abd24, 0x00c41670, 0x00e64fa4, 0x02a5a228, 0x01e68f2d, 0x000aa583, 0x039dbd03, 0x00bba394, 0x00167278}}}, + {X: Field{[10]uint32{0x004aa6eb, 0x011ff73c, 0x01f4b4cc, 0x03ccae8d, 0x01c4ccb1, 0x03dcca61, 0x02e73d88, 0x000ce09a, 0x003d056a, 0x00061ad2}}, Y: Field{[10]uint32{0x0280888b, 0x01e5fe1b, 0x038b4a4a, 0x02422544, 0x0321fb80, 0x0010602a, 0x017446e2, 0x03ddf8b8, 0x0132c67c, 0x000ee54b}}}, + {X: Field{[10]uint32{0x00e0963f, 0x00c85c93, 0x019c91a8, 0x034adcdf, 0x025442e6, 0x012f93dc, 0x0098561f, 0x01b39513, 0x00a6b987, 0x0037e75c}}, Y: Field{[10]uint32{0x02ba2417, 0x0231173c, 0x01da217b, 0x009c83be, 0x02b15722, 0x0370e752, 0x0062b785, 0x01b3357e, 0x01afd84d, 0x00157acb}}}, + {X: Field{[10]uint32{0x00ce7143, 0x019317cd, 0x018995de, 0x013e127b, 0x00ab5255, 0x0177383e, 0x03ca815d, 0x03a1e925, 0x00c23c51, 0x0017b757}}, Y: Field{[10]uint32{0x0399a868, 0x01c1aadc, 0x02905cdc, 0x030345e8, 0x00c13c66, 0x003226b4, 0x028cec03, 0x004c1987, 0x008dbc14, 0x003beba7}}}, + {X: Field{[10]uint32{0x00614fba, 0x034d8be1, 0x0317a722, 0x02870d56, 0x037aa3fb, 0x021fa79d, 0x012fe022, 0x01a0c368, 0x00c2b647, 0x000a41e6}}, Y: Field{[10]uint32{0x01943e7a, 0x000ebf50, 0x023146d0, 0x02536ca8, 0x015b29c0, 0x01e6bc97, 0x00d00bcf, 0x00188662, 0x036dcd44, 0x0038e369}}}, + {X: Field{[10]uint32{0x00053b45, 0x03f7b3bd, 0x0257362d, 0x00bf8d80, 0x01cd2955, 0x00542b0e, 0x00754efa, 0x03d6cc15, 0x023a95d9, 0x002bcf10}}, Y: Field{[10]uint32{0x018fd9c6, 0x03fb7b52, 0x01581bc2, 0x02999e85, 0x00c8cd5a, 0x00d73ed0, 0x013b0e6f, 0x00add26a, 0x03d831eb, 0x003e628f}}}, + {X: Field{[10]uint32{0x0084249a, 0x03fb5436, 0x018df8d2, 0x02c9b73e, 0x0106bb66, 0x026fc9d2, 0x00aa28c9, 0x039d1733, 0x0324d134, 0x001d9b6e}}, Y: Field{[10]uint32{0x03ac5996, 0x0093e5f2, 0x00edd2c9, 0x0197e81b, 0x0097584a, 0x00368e2e, 0x00c88798, 0x03978e37, 0x0152eacb, 0x001d12c4}}}, + {X: Field{[10]uint32{0x011abe3e, 0x00b99986, 0x02a58ce9, 0x013db165, 0x0245f7b4, 0x01e13d05, 0x01277c33, 0x01d66e88, 0x006f8c94, 0x001676fd}}, Y: Field{[10]uint32{0x02307f6e, 0x03885b12, 0x0398cd85, 0x0269e465, 0x0042ce73, 0x0120c268, 0x00ea6ce6, 0x02f0c03d, 0x0144175f, 0x00314d2b}}}, + {X: Field{[10]uint32{0x00fd87b8, 0x03718063, 0x0273cb62, 0x01c46a57, 0x00dd647e, 0x013a692a, 0x01e691e7, 0x0114dcc1, 0x0295103c, 0x003c4eb6}}, Y: Field{[10]uint32{0x02f5733d, 0x021066f6, 0x00257077, 0x0069a9d7, 0x026949e2, 0x020d07cc, 0x03f4bc80, 0x0137998e, 0x03b44ee1, 0x00384e05}}}, + {X: Field{[10]uint32{0x0288522c, 0x01540056, 0x01fb6488, 0x0301baeb, 0x00da1869, 0x01673293, 0x00167a2c, 0x033b41b5, 0x00fa0e8a, 0x001dd52d}}, Y: Field{[10]uint32{0x001163a2, 0x0122d5e1, 0x03cc537a, 0x00d42db2, 0x028d1e4e, 0x00082e3e, 0x00b967c3, 0x02760889, 0x02864e66, 0x000c3a4f}}}, + {X: Field{[10]uint32{0x02262519, 0x00a32678, 0x001d2a68, 0x02577a01, 0x0301858f, 0x02afbe75, 0x03874d46, 0x038122a8, 0x02df5990, 0x00252372}}, Y: Field{[10]uint32{0x0347d57e, 0x028b2b94, 0x031d2cbb, 0x03bef4bb, 0x01df9154, 0x012c6f09, 0x0128a322, 0x03965f57, 0x002537f6, 0x00392469}}}, + {X: Field{[10]uint32{0x017c77ab, 0x00a2a28f, 0x03a15703, 0x03d6b02f, 0x03fb224c, 0x0080bb0d, 0x007b48f8, 0x01b05a27, 0x014450c7, 0x001e5890}}, Y: Field{[10]uint32{0x01b83437, 0x03e96ca7, 0x02c5760a, 0x00147c12, 0x0312507a, 0x00fbdbda, 0x01c1fc13, 0x02d1d835, 0x010ec4ff, 0x000402d8}}}, + {X: Field{[10]uint32{0x03ec47ca, 0x0342144d, 0x0047bb0d, 0x01c896e2, 0x005a1697, 0x01364552, 0x01b16064, 0x012d52c5, 0x00783496, 0x000d4502}}, Y: Field{[10]uint32{0x02293311, 0x03456837, 0x0378b7e7, 0x01f05708, 0x006039e7, 0x03a049ff, 0x01652c48, 0x00151238, 0x03b20562, 0x003bc2be}}}, + {X: Field{[10]uint32{0x03527eaf, 0x010f4fde, 0x007b4429, 0x03ae37de, 0x0193e947, 0x0362f152, 0x01ce2c9d, 0x00f92f1e, 0x00ad6b48, 0x0034f30c}}, Y: Field{[10]uint32{0x02ede0a4, 0x00d36c13, 0x00630afb, 0x018a40d6, 0x023c2ad4, 0x03e5422b, 0x005e9be8, 0x009e3627, 0x0222d827, 0x0022cde2}}}, + {X: Field{[10]uint32{0x00847610, 0x016e83fd, 0x03649397, 0x00f6e44f, 0x032b2982, 0x03fbf822, 0x01c78fcb, 0x00a18338, 0x00478073, 0x00058936}}, Y: Field{[10]uint32{0x00078575, 0x01b8a901, 0x024c8cc0, 0x03d4a0af, 0x02896878, 0x03367532, 0x014448c6, 0x0240f824, 0x00f9b6da, 0x001a1947}}}, + {X: Field{[10]uint32{0x03c61cd4, 0x01ed3f57, 0x007da6df, 0x012d6bc8, 0x00519247, 0x00f98aa6, 0x002c9563, 0x02a289a4, 0x000da955, 0x001ccf3a}}, Y: Field{[10]uint32{0x01c5ea1d, 0x019cef07, 0x00578c54, 0x03808079, 0x023e1ef8, 0x036e7f33, 0x01a4d8b8, 0x037df521, 0x022bd2ba, 0x003d50d6}}}, + {X: Field{[10]uint32{0x001c045c, 0x01637eae, 0x02699ef2, 0x002485c7, 0x038966c5, 0x02f4ed27, 0x01a1c33b, 0x0141933c, 0x00125494, 0x00057651}}, Y: Field{[10]uint32{0x03e4070d, 0x01eefa7b, 0x00685fc3, 0x02eb3aff, 0x03434800, 0x00ee105d, 0x035137b7, 0x00f9c8d3, 0x030b6946, 0x00355bac}}}, + {X: Field{[10]uint32{0x00717940, 0x00e16674, 0x00aaaac1, 0x01f274ae, 0x031c2141, 0x0339c349, 0x012136e5, 0x0399d6d8, 0x00f2ec9d, 0x0028743f}}, Y: Field{[10]uint32{0x0197a629, 0x004b4e70, 0x033d5192, 0x029501c3, 0x02641462, 0x002599fc, 0x02907373, 0x028f2acb, 0x0350bcb5, 0x003b75df}}}, + {X: Field{[10]uint32{0x00b36980, 0x028dccc7, 0x01c06c7c, 0x037ba091, 0x01a790ba, 0x03e136fa, 0x000c0735, 0x0233315e, 0x0215c0af, 0x00388bef}}, Y: Field{[10]uint32{0x0131da06, 0x0341b5df, 0x0399be43, 0x00552591, 0x03a38289, 0x03d4e869, 0x03430a69, 0x03583222, 0x03abad5c, 0x0002a156}}}, + {X: Field{[10]uint32{0x02cfa9b3, 0x02514891, 0x02aa7400, 0x00e51c13, 0x0369635e, 0x004557d7, 0x0213473c, 0x03a3883b, 0x01dd9860, 0x000c4424}}, Y: Field{[10]uint32{0x006d8374, 0x003c2c4a, 0x02685bd8, 0x02993fbb, 0x00871ec5, 0x02301a0c, 0x011f0478, 0x03c13fff, 0x016f87d1, 0x0019b6d9}}}, + {X: Field{[10]uint32{0x02c2dbdf, 0x01f508cb, 0x00078186, 0x02d16a4d, 0x00883928, 0x00f9ab09, 0x01c0442d, 0x02fa26cc, 0x0104d301, 0x000d307f}}, Y: Field{[10]uint32{0x0273abee, 0x008615ee, 0x0043dc53, 0x03bad21d, 0x02d57f1c, 0x0005d04d, 0x03d46f73, 0x006d6552, 0x0285e97b, 0x00025051}}}, + {X: Field{[10]uint32{0x009b8d63, 0x02979ac1, 0x00affcc2, 0x02aef342, 0x028d13f3, 0x015fad0a, 0x014de5b5, 0x01c07070, 0x025d6b54, 0x003c867a}}, Y: Field{[10]uint32{0x000766d1, 0x00a58a90, 0x03fb8d8c, 0x00f01ec9, 0x01f4b08d, 0x03333dac, 0x03af4544, 0x0102c3dc, 0x0157e83d, 0x00132e56}}}, + {X: Field{[10]uint32{0x01a0b448, 0x01a4491a, 0x02708723, 0x0242f298, 0x02543a54, 0x03d17789, 0x03683db8, 0x03eeaac7, 0x000f74a8, 0x0035ee1d}}, Y: Field{[10]uint32{0x02a4593b, 0x0380c57a, 0x009b3411, 0x017b4f01, 0x02ff15db, 0x02b51c5f, 0x0010f337, 0x0324bb84, 0x028128d9, 0x003e9de5}}}, + {X: Field{[10]uint32{0x02a824bf, 0x0134c246, 0x014289fe, 0x00caaf76, 0x02ad5bcd, 0x00e8ccd7, 0x02f7c98d, 0x01bc3be1, 0x00222f8f, 0x000cb4c7}}, Y: Field{[10]uint32{0x022e1661, 0x03452e11, 0x02961118, 0x0279bc9b, 0x022e6dac, 0x016e7876, 0x00d3d791, 0x015b8e73, 0x02f58921, 0x0017cc0c}}}, + {X: Field{[10]uint32{0x018347b5, 0x03e1b2f0, 0x012c4340, 0x01f35656, 0x028793d7, 0x03660c7a, 0x0045a155, 0x02cc99c4, 0x0371914a, 0x001d187c}}, Y: Field{[10]uint32{0x00092ff6, 0x0211ecf3, 0x02ea6b39, 0x03d43261, 0x002eee1f, 0x02a91095, 0x01ddcae0, 0x02fb032f, 0x02238b96, 0x0023b02e}}}, + {X: Field{[10]uint32{0x03b2b2d6, 0x01a62eb5, 0x0053d287, 0x00b0f99d, 0x026d716b, 0x028e081a, 0x0356a25a, 0x021801d0, 0x02db1df1, 0x003b81e6}}, Y: Field{[10]uint32{0x001c8c1e, 0x02b11e7b, 0x00e25eba, 0x026bc131, 0x02a44698, 0x03317e7d, 0x01f37e0e, 0x02f97131, 0x012aafe3, 0x00237090}}}, + {X: Field{[10]uint32{0x029da6b5, 0x036185ae, 0x01dc72bf, 0x00c61d32, 0x03e65de3, 0x03b9883d, 0x03b18302, 0x020fc119, 0x03e447ec, 0x0005bb24}}, Y: Field{[10]uint32{0x01b0674d, 0x019de389, 0x01713962, 0x01a94392, 0x039d5818, 0x02960128, 0x028c2a7c, 0x03ed0343, 0x01150e62, 0x0017918c}}}, + {X: Field{[10]uint32{0x0137bd99, 0x02581975, 0x02aa485b, 0x025fe62d, 0x03d88558, 0x03e9c2da, 0x0178290a, 0x03dbc0e2, 0x0180c245, 0x003aa97e}}, Y: Field{[10]uint32{0x02dc07dc, 0x00104093, 0x0267fb18, 0x0275f9ba, 0x00d78486, 0x03265189, 0x02528391, 0x00b82066, 0x013e292c, 0x003d97d7}}}, + {X: Field{[10]uint32{0x01a49f51, 0x0312dacd, 0x0342ea96, 0x021dc544, 0x0158ae04, 0x028090e6, 0x02ee1910, 0x0304c9a4, 0x0007544a, 0x0001e325}}, Y: Field{[10]uint32{0x00a3ddb4, 0x019d7c65, 0x00d2462b, 0x0160f019, 0x00fa1fbd, 0x00e6979a, 0x00047955, 0x026e1755, 0x019169eb, 0x003cf80c}}}, + {X: Field{[10]uint32{0x002857a5, 0x015e365c, 0x00688726, 0x02b9e9bf, 0x0001cdc8, 0x00c6ba80, 0x01cd8384, 0x029dc05b, 0x03e219a1, 0x001253d2}}, Y: Field{[10]uint32{0x000d562c, 0x012c0c62, 0x02d6e55f, 0x00c35d9f, 0x02f925ce, 0x038dae8a, 0x03a7f075, 0x0297cce6, 0x02969283, 0x0010890a}}}, + {X: Field{[10]uint32{0x001fe9b5, 0x03079997, 0x0270ebf4, 0x03a963ea, 0x01d28211, 0x0113a952, 0x007f2f51, 0x0361b1af, 0x00030da6, 0x0029662a}}, Y: Field{[10]uint32{0x01864e6b, 0x009b6f4b, 0x0386a100, 0x02d96cd7, 0x0023fc63, 0x001cdebb, 0x00b4a714, 0x00b0c1f9, 0x016f8482, 0x000812d7}}}, + {X: Field{[10]uint32{0x00595997, 0x02b70f96, 0x00a184db, 0x003c495c, 0x00208f02, 0x036fabfb, 0x0192f5f2, 0x00ad7424, 0x02365abb, 0x00310645}}, Y: Field{[10]uint32{0x00fa9913, 0x01ba5ad6, 0x03fc0ed1, 0x01143cd2, 0x01d5caf9, 0x02261262, 0x01245b32, 0x01fbe927, 0x0351d008, 0x00013c50}}}, + {X: Field{[10]uint32{0x00742881, 0x01ce9545, 0x02acfe4c, 0x034b828d, 0x0392a2e0, 0x0280ef16, 0x0324604d, 0x03e91d69, 0x0063a586, 0x00210758}}, Y: Field{[10]uint32{0x028d6154, 0x00db7806, 0x0169ce7a, 0x0359d130, 0x00e62562, 0x01d50da6, 0x004f9a1c, 0x0167a064, 0x03f59c06, 0x0001ce19}}}, + {X: Field{[10]uint32{0x030e20d5, 0x004ab135, 0x03e4ded1, 0x020424a2, 0x03282b33, 0x0226f78b, 0x0026947f, 0x01c74dd8, 0x03399a69, 0x0017a56e}}, Y: Field{[10]uint32{0x02012865, 0x00e131d1, 0x0238b161, 0x03b5f62e, 0x01a99c9a, 0x004c4ddd, 0x03fc7118, 0x00216fba, 0x03366809, 0x000e7c8f}}}, + {X: Field{[10]uint32{0x00ef2f66, 0x011c6f28, 0x01d8bf99, 0x0192d4c5, 0x025ec075, 0x027f65d3, 0x0039f8a9, 0x023f51db, 0x001a5394, 0x000db919}}, Y: Field{[10]uint32{0x014c78fc, 0x01473d5a, 0x023e06fd, 0x0124ff55, 0x0056ea13, 0x01726aa5, 0x00227b08, 0x013ae059, 0x031b1abe, 0x00349092}}}, + {X: Field{[10]uint32{0x0179f726, 0x02c9f0b1, 0x0114faea, 0x01085c3a, 0x00f56438, 0x0141e907, 0x00191a2f, 0x02eeca43, 0x001ea7bf, 0x0000cd96}}, Y: Field{[10]uint32{0x02fda224, 0x03372af4, 0x01e0ef3d, 0x00504334, 0x0391f7ab, 0x01b95acc, 0x0252129b, 0x0386fa64, 0x0168595f, 0x003ab448}}}, + {X: Field{[10]uint32{0x03d43ede, 0x01d09c1a, 0x010c4849, 0x0097b5a2, 0x00037810, 0x03c03b21, 0x032634fc, 0x035ada87, 0x0016dadf, 0x0022ae26}}, Y: Field{[10]uint32{0x01cdd24e, 0x011ea44a, 0x0045858a, 0x0270fa26, 0x03503d45, 0x018904db, 0x02654aef, 0x03428113, 0x0309f2f6, 0x001bf73b}}}, + {X: Field{[10]uint32{0x00c5fb94, 0x0100a12e, 0x032544bb, 0x023a2b3f, 0x0220b093, 0x00a67f2a, 0x033344d9, 0x0315de04, 0x01a746c9, 0x00078cfc}}, Y: Field{[10]uint32{0x03f3b3b6, 0x029f4815, 0x03010e33, 0x0083c740, 0x032306d3, 0x03493b7f, 0x008ed618, 0x006ceaa7, 0x00257dd1, 0x00018198}}}, + {X: Field{[10]uint32{0x00f08f31, 0x000d87f6, 0x00fcfa41, 0x0330632f, 0x020ed1f4, 0x01e77482, 0x03f30ded, 0x0306dfb9, 0x01dcb3ce, 0x00216df0}}, Y: Field{[10]uint32{0x02999511, 0x03b4f0d7, 0x02633c6f, 0x0062575e, 0x00fcafad, 0x02a211fd, 0x01048f25, 0x03750fce, 0x01cdd026, 0x000f662a}}}, + {X: Field{[10]uint32{0x01ac5f51, 0x00a00198, 0x03af872a, 0x00ee1e29, 0x017fbe9a, 0x0175b517, 0x035f4b12, 0x01194249, 0x03bd8d9e, 0x000a77e7}}, Y: Field{[10]uint32{0x0227d84b, 0x021dbaca, 0x01e55cd2, 0x02187006, 0x03da61dc, 0x01e44e7f, 0x02d88621, 0x016981b8, 0x03e99c77, 0x0002d313}}}, + {X: Field{[10]uint32{0x01fce252, 0x00acb912, 0x0105c808, 0x028bdda0, 0x03dfe58c, 0x02abe2b7, 0x02a6e671, 0x0211e8ff, 0x02e06b0a, 0x00282c72}}, Y: Field{[10]uint32{0x02296cf2, 0x0012540e, 0x030e650f, 0x0060d2bf, 0x026b72da, 0x01e9a8a3, 0x00b19d91, 0x002563b1, 0x0102edde, 0x002b90d0}}}, + {X: Field{[10]uint32{0x00e121e5, 0x00fcb930, 0x03e4ba11, 0x02cec84c, 0x01b499df, 0x03a100a5, 0x01c7ff67, 0x03a684db, 0x02afb9b3, 0x00013a33}}, Y: Field{[10]uint32{0x0326683c, 0x01f398a8, 0x00502b82, 0x01a98d18, 0x01422c08, 0x0133971e, 0x008f6d53, 0x01b5e92d, 0x00118c8b, 0x0033c85d}}}, + {X: Field{[10]uint32{0x0389a33b, 0x01c970ad, 0x00919f42, 0x01a26804, 0x000a5076, 0x028bda42, 0x03b81c7c, 0x026dbd6b, 0x00e047e1, 0x00349291}}, Y: Field{[10]uint32{0x03ea8fa3, 0x03b105eb, 0x0244d2cd, 0x01a21ee0, 0x01013f99, 0x0303c71a, 0x03db50f1, 0x01be3f18, 0x01591b46, 0x001bee35}}}, + {X: Field{[10]uint32{0x023b35d4, 0x013a63a3, 0x0377b510, 0x00a2aeea, 0x00001edd, 0x032e6561, 0x01fdfcfa, 0x02737492, 0x006a7a6c, 0x003a8058}}, Y: Field{[10]uint32{0x023ea98d, 0x01948622, 0x03700cfd, 0x012f0a08, 0x01b7d449, 0x01e9ecf3, 0x03fe369f, 0x004ac33e, 0x00908c73, 0x000c8abd}}}, + {X: Field{[10]uint32{0x00e2131f, 0x0065b7a3, 0x031be4ad, 0x036317a8, 0x01252007, 0x03ae5994, 0x02328655, 0x007229b1, 0x01bf2b66, 0x002be2b7}}, Y: Field{[10]uint32{0x01749700, 0x03ef36dc, 0x02ac8f3d, 0x021a0389, 0x03252081, 0x0025a0da, 0x0034eafd, 0x0217d4a8, 0x027c029b, 0x0019d279}}}, + {X: Field{[10]uint32{0x00f45889, 0x03c38d14, 0x0215e722, 0x036af3f2, 0x01a674a3, 0x0383ec59, 0x00516d47, 0x01b281b3, 0x02197456, 0x000038eb}}, Y: Field{[10]uint32{0x030bd6a4, 0x0029cbba, 0x01f53342, 0x0121d3e0, 0x000de97e, 0x03d341cc, 0x0217f07b, 0x01440458, 0x027e4531, 0x000abaaf}}}, + {X: Field{[10]uint32{0x0397e246, 0x03aa33b4, 0x00802075, 0x03cfb496, 0x0301993f, 0x03b478f8, 0x036993ff, 0x0265c873, 0x0355313d, 0x001647b8}}, Y: Field{[10]uint32{0x03e5d196, 0x0263c692, 0x022bdeee, 0x014f4972, 0x001ff0b0, 0x011831e4, 0x00fc4775, 0x00c2fa98, 0x018a113c, 0x002c3a95}}}, + {X: Field{[10]uint32{0x01b52984, 0x033c0c95, 0x00945077, 0x0391ec21, 0x01fa8584, 0x02363698, 0x01aa9731, 0x013127c6, 0x0155fda5, 0x00044e5b}}, Y: Field{[10]uint32{0x03ea57a4, 0x019efaa4, 0x03be4c57, 0x02c06c95, 0x004ff536, 0x01efad1d, 0x01d5833a, 0x02b004a2, 0x00a8cd45, 0x0026631d}}}, + {X: Field{[10]uint32{0x0017aa7a, 0x010055f8, 0x00b64055, 0x0151a1d5, 0x038dcdfd, 0x02783102, 0x0000738c, 0x01685e40, 0x021ba39c, 0x000f174a}}, Y: Field{[10]uint32{0x001bd257, 0x01e72932, 0x00f6661f, 0x027f749c, 0x000f9b8b, 0x01bf062e, 0x014de739, 0x00d38be7, 0x0279995a, 0x002c8a10}}}, + {X: Field{[10]uint32{0x013cc030, 0x03be285e, 0x00078425, 0x02bec12b, 0x03fbc395, 0x027cba70, 0x0299a729, 0x0037be8e, 0x00b8a60a, 0x003321c1}}, Y: Field{[10]uint32{0x001f1b13, 0x02dd38eb, 0x01c4e940, 0x013f12f3, 0x00f395b7, 0x02cd1fe3, 0x01e0862d, 0x005e2074, 0x0039feed, 0x002f7518}}}, + {X: Field{[10]uint32{0x0089b197, 0x010466ca, 0x02e7ea20, 0x03f3314f, 0x017dd4de, 0x032b4a6e, 0x01777ac5, 0x0156ab36, 0x00f7ea85, 0x00314cf9}}, Y: Field{[10]uint32{0x03596096, 0x0383d17a, 0x03a26bb8, 0x02ed292c, 0x02d9b925, 0x03c690e8, 0x02fb6242, 0x037d0a68, 0x016bc5ef, 0x001bc289}}}, + {X: Field{[10]uint32{0x03da6593, 0x01b5238c, 0x03bbcf56, 0x00d3bb01, 0x0269ba8c, 0x000f325a, 0x01f6d08d, 0x01f5bc42, 0x00f2ccb2, 0x0003053e}}, Y: Field{[10]uint32{0x03dc3a38, 0x02192444, 0x035e6c0e, 0x03742601, 0x0075b740, 0x03f870a1, 0x00473e16, 0x0263dff5, 0x02923bb3, 0x0030d675}}}, + {X: Field{[10]uint32{0x0390e6ef, 0x007dcb82, 0x0321ce44, 0x03b5d7e3, 0x024c9739, 0x0285c456, 0x0024789f, 0x029142eb, 0x03046bc6, 0x0029b2f0}}, Y: Field{[10]uint32{0x03fa9b9f, 0x00abf585, 0x00313986, 0x01cf1c18, 0x0360ceb5, 0x0303e568, 0x030619e2, 0x02226ec4, 0x03f4680e, 0x000086b9}}}, + {X: Field{[10]uint32{0x0143cc38, 0x02ce7e67, 0x01ce6344, 0x00099f44, 0x03130a3c, 0x0166c72b, 0x03b86c13, 0x02249faf, 0x019a02c4, 0x000d1f5b}}, Y: Field{[10]uint32{0x01c74448, 0x027fc78c, 0x00cb1268, 0x02da1e1c, 0x006d565a, 0x03b24bc2, 0x0187f6ec, 0x01493472, 0x0361a353, 0x00183a9f}}}, + {X: Field{[10]uint32{0x0372656a, 0x03bdd0de, 0x008cf855, 0x02c6fcc7, 0x02d47c67, 0x017bd619, 0x037dcb37, 0x02e3660f, 0x01d2181d, 0x00369951}}, Y: Field{[10]uint32{0x03dc208a, 0x02a092dd, 0x03d897fe, 0x006d24d6, 0x01667305, 0x015a0317, 0x038f07ce, 0x01e29e79, 0x0315ab68, 0x00126e59}}}, + {X: Field{[10]uint32{0x03eb1111, 0x016652e3, 0x03146b9d, 0x02517595, 0x03ec25d6, 0x00271b79, 0x03b81483, 0x00b2c684, 0x03cc9d01, 0x003101d1}}, Y: Field{[10]uint32{0x020fa2d4, 0x03a0c0df, 0x014e1bb5, 0x0055ae54, 0x025db936, 0x032d2255, 0x01e6caf2, 0x0284bf1b, 0x00753be2, 0x00172958}}}, + {X: Field{[10]uint32{0x037f3502, 0x000fbd00, 0x03d34c82, 0x01c4cd22, 0x00338c7f, 0x03a1c39e, 0x033a610b, 0x025e6333, 0x00ec82c9, 0x001390b2}}, Y: Field{[10]uint32{0x03606437, 0x0111cda4, 0x03cc40a9, 0x01133152, 0x01a54921, 0x01de0cd0, 0x028b33a0, 0x03ee4a9e, 0x034ee5e0, 0x001d5c75}}}, + {X: Field{[10]uint32{0x030dedea, 0x008a86ce, 0x03432875, 0x036c3219, 0x02d251ca, 0x03dc2c8d, 0x02ba2e1a, 0x01abe08e, 0x037089bc, 0x000ddd6a}}, Y: Field{[10]uint32{0x01018cf7, 0x03658502, 0x02a2c42a, 0x01efde9d, 0x03ac8db1, 0x00a33e9f, 0x039736a8, 0x002762f2, 0x0107bcfa, 0x002f94b4}}}, + {X: Field{[10]uint32{0x02f74e26, 0x01678fa0, 0x03a88469, 0x01744c52, 0x02d95459, 0x034f5dd6, 0x014fb814, 0x03b0de76, 0x00bf7e34, 0x0033b8c7}}, Y: Field{[10]uint32{0x003b1c6d, 0x01228071, 0x014d80f4, 0x002f853b, 0x020149ef, 0x02f3dafe, 0x03947ae2, 0x0162709a, 0x0214c06b, 0x0023f592}}}, + {X: Field{[10]uint32{0x00b47986, 0x00680742, 0x02befcdc, 0x03f516c7, 0x02fddb58, 0x03ad5193, 0x036ea6a4, 0x0245d867, 0x02ea09b6, 0x002d3e7a}}, Y: Field{[10]uint32{0x0200682a, 0x02a2b01c, 0x0142eb24, 0x03004b29, 0x038bb131, 0x03185c9b, 0x033a4f18, 0x0152c1d0, 0x01925b5a, 0x000e7972}}}, + {X: Field{[10]uint32{0x02bcc60e, 0x0241de4b, 0x00cc1b77, 0x016bf0f7, 0x0284e251, 0x019b4c33, 0x0179a489, 0x03e48e80, 0x01fc3d2d, 0x0035098f}}, Y: Field{[10]uint32{0x02208d54, 0x0193848a, 0x00f7fae1, 0x01d82b5b, 0x0189e127, 0x01614f38, 0x0230d629, 0x023facc3, 0x0307a0f7, 0x0018b7eb}}}, + {X: Field{[10]uint32{0x017612c4, 0x00fbb6a2, 0x01e42223, 0x0302928b, 0x000032ac, 0x024c215f, 0x00d35eb6, 0x0299693e, 0x0124820f, 0x0012115d}}, Y: Field{[10]uint32{0x01bd0f77, 0x01daaa92, 0x00a9ae7a, 0x01f6cb58, 0x03dc6cc0, 0x03e870b9, 0x033c38a1, 0x01e7661c, 0x00ab3679, 0x000969d2}}}, + {X: Field{[10]uint32{0x011cceda, 0x0285d9f0, 0x0123f367, 0x0246454a, 0x02045e19, 0x00abf7f0, 0x01644f3a, 0x007cb2c4, 0x03188110, 0x0037fbbb}}, Y: Field{[10]uint32{0x029a7517, 0x020eb826, 0x03dff16a, 0x039d2d2e, 0x00c390bd, 0x0259e4f0, 0x0020bab3, 0x03810be5, 0x0056cf1d, 0x003b3edc}}}, + {X: Field{[10]uint32{0x00fae859, 0x00b7e0ee, 0x00ed36c8, 0x02f1818b, 0x035d89bc, 0x007ce260, 0x0173f44e, 0x03e0dcf1, 0x02b17543, 0x001b5fbd}}, Y: Field{[10]uint32{0x02712d10, 0x02c64372, 0x000bbf74, 0x02566cb6, 0x00c521a0, 0x01ffaa6f, 0x02fa10c5, 0x02261b7f, 0x02c33543, 0x00335143}}}, + {X: Field{[10]uint32{0x0204541f, 0x0096bd9b, 0x007035af, 0x024c8955, 0x03f3c88b, 0x02647cb8, 0x00500d3b, 0x029689a1, 0x01d59102, 0x0039d581}}, Y: Field{[10]uint32{0x03fad125, 0x0026438a, 0x00693836, 0x0314c22c, 0x014f729a, 0x0211cf8c, 0x039b4872, 0x007b9502, 0x0354a8f7, 0x003d7151}}}, + {X: Field{[10]uint32{0x01ed620c, 0x010ffbec, 0x008457dd, 0x0182af8e, 0x019a0c2e, 0x014082f2, 0x02be453d, 0x03ea81a8, 0x020f4c4d, 0x003ae619}}, Y: Field{[10]uint32{0x0099223e, 0x03d10400, 0x0131ce85, 0x022a5044, 0x00a0a7cd, 0x0349b348, 0x009af3ad, 0x02e14818, 0x00876d9c, 0x001b2e6a}}}, + {X: Field{[10]uint32{0x00dba942, 0x0158f8ee, 0x00336dc3, 0x01a50622, 0x02215459, 0x024ac664, 0x039f2e68, 0x00534d64, 0x03027d85, 0x0004fa1e}}, Y: Field{[10]uint32{0x02b8adf1, 0x00355591, 0x02beb257, 0x0295a35a, 0x02ac2b9d, 0x02fc7a46, 0x01624114, 0x029b7b17, 0x03c68059, 0x003fbd68}}}, + {X: Field{[10]uint32{0x01e5764a, 0x011245a4, 0x0308e7bf, 0x00dc7389, 0x0125424b, 0x016f9bf0, 0x0038f06a, 0x01bf805f, 0x0026e9fd, 0x003b858c}}, Y: Field{[10]uint32{0x016c62b2, 0x00c3682b, 0x02623e54, 0x03e856e5, 0x00f49ae3, 0x01c343d6, 0x0194ccc6, 0x0358710f, 0x010f255d, 0x0006b2c9}}}, + {X: Field{[10]uint32{0x03af3d80, 0x00b976cc, 0x02799993, 0x010d4161, 0x031e626d, 0x030b7226, 0x01e3a750, 0x007935e3, 0x01ef9ad5, 0x002c9a3d}}, Y: Field{[10]uint32{0x0216e423, 0x03a51684, 0x01614003, 0x013f5064, 0x018cf0d3, 0x03077b80, 0x01f77d41, 0x02e7aec6, 0x014b3c99, 0x0017cc43}}}, + {X: Field{[10]uint32{0x03c4750d, 0x03ff6ea4, 0x02ea3bf7, 0x0072a673, 0x002b02f0, 0x01b1eff9, 0x03ad85eb, 0x03c0d7a7, 0x03118a9d, 0x003fc1fc}}, Y: Field{[10]uint32{0x02d1f0d8, 0x00342633, 0x02ddd474, 0x0084538b, 0x01c1d294, 0x03b32eb7, 0x00440c38, 0x01628e97, 0x02d603e8, 0x0010e04d}}}, + {X: Field{[10]uint32{0x02b526a1, 0x03a30f38, 0x01ebec16, 0x02783609, 0x02a4b9f6, 0x03ed962f, 0x006fd20f, 0x014a8d05, 0x0055c7c0, 0x002362e6}}, Y: Field{[10]uint32{0x03036758, 0x00b9fd18, 0x03ceb30e, 0x03fb9475, 0x004bcf50, 0x0213a935, 0x03af44fb, 0x01e7e49a, 0x01eedc2d, 0x00336d56}}}, + {X: Field{[10]uint32{0x01a32b63, 0x0098c603, 0x031eba54, 0x033b2a46, 0x03e4b851, 0x01eb89b7, 0x029d472d, 0x02fc16fe, 0x035384df, 0x0014b6c2}}, Y: Field{[10]uint32{0x00a7b375, 0x012da761, 0x0279de92, 0x0240a1d5, 0x03b3180c, 0x01b6e7d5, 0x02baf66a, 0x0397508f, 0x017d050e, 0x00030ee6}}}, + {X: Field{[10]uint32{0x03d43352, 0x0150efb2, 0x008c6fff, 0x030fcfe9, 0x007d0f29, 0x02024673, 0x01efd24e, 0x007698e5, 0x0090d3d5, 0x00398be5}}, Y: Field{[10]uint32{0x00cafa7d, 0x001eff67, 0x02f5170e, 0x01647c76, 0x02f342c8, 0x031a0a18, 0x002ca280, 0x01ac2c8b, 0x017ba487, 0x001b626b}}}, + {X: Field{[10]uint32{0x02ab1193, 0x039f596a, 0x014fd6d8, 0x03d72dec, 0x011afa2f, 0x03ddf406, 0x03509c88, 0x0266d255, 0x022476b3, 0x001fcc3a}}, Y: Field{[10]uint32{0x037acaec, 0x03d2ffd8, 0x03e9880e, 0x02d9ec40, 0x01daff7b, 0x03d8c47a, 0x015389a5, 0x032530ec, 0x03d4b231, 0x003297bd}}}, + {X: Field{[10]uint32{0x000b7a00, 0x0280d860, 0x01d9ac60, 0x02d28774, 0x03ef0fb7, 0x029b240f, 0x02210fad, 0x0053ed1a, 0x031e1d9f, 0x0014263f}}, Y: Field{[10]uint32{0x0117ddc0, 0x016c4cbf, 0x03e5362a, 0x01035837, 0x02b3ee1b, 0x01d50801, 0x00d37c6e, 0x0323e021, 0x0141d81f, 0x00025cc4}}}, + {X: Field{[10]uint32{0x0378ad58, 0x00b20789, 0x01c96b9f, 0x03333911, 0x02e2f3c4, 0x0272fbe9, 0x0095be6b, 0x0144a9ca, 0x007de9ee, 0x000cade3}}, Y: Field{[10]uint32{0x00c8753c, 0x01c8dde5, 0x0275ba49, 0x0151eb88, 0x0073bb80, 0x038a0983, 0x03c3896e, 0x01c78cbb, 0x01f513df, 0x003b8612}}}, + {X: Field{[10]uint32{0x0147a4f7, 0x01605541, 0x01fc074b, 0x03c209a7, 0x00e37d50, 0x01f1cac3, 0x036eef2a, 0x027ef341, 0x00fddc8e, 0x0038b2dd}}, Y: Field{[10]uint32{0x005cc4a4, 0x006af2c0, 0x012be864, 0x038d848b, 0x03addea9, 0x01cdbac2, 0x022df062, 0x034891e9, 0x02d71c9d, 0x0034ea8b}}}, + {X: Field{[10]uint32{0x010ae3a8, 0x00366734, 0x00b141be, 0x00d7c8d7, 0x0026009a, 0x01aacd5d, 0x01c29949, 0x035efb6b, 0x007566d4, 0x00210e11}}, Y: Field{[10]uint32{0x02dd791f, 0x00109acb, 0x01c4f239, 0x01e4198c, 0x0334ef0d, 0x01ab4cc1, 0x0101ac5e, 0x00293697, 0x02091698, 0x00313840}}}, + {X: Field{[10]uint32{0x0311d67e, 0x019720b1, 0x00b878ab, 0x0311bd98, 0x030587d9, 0x01b0c221, 0x0184c6fc, 0x00080e6d, 0x0088b894, 0x001058b5}}, Y: Field{[10]uint32{0x00852649, 0x011eb968, 0x0295dbda, 0x00ae12d3, 0x03c1732f, 0x03ee28eb, 0x02f22c25, 0x00a27ddd, 0x02903236, 0x0019c58f}}}, + {X: Field{[10]uint32{0x035f683d, 0x02e9292f, 0x010684f3, 0x01ebb0f9, 0x00175d76, 0x0373d53f, 0x0389bfd2, 0x003cd3c3, 0x03a84caf, 0x000feb4f}}, Y: Field{[10]uint32{0x03e61826, 0x0083bf37, 0x012a53fa, 0x01cb9f43, 0x030cf718, 0x031c629c, 0x030ca647, 0x0101eecb, 0x007cb6cc, 0x0003346f}}}, + {X: Field{[10]uint32{0x02b1a86b, 0x0254cbeb, 0x0398f1c6, 0x02fc4dc1, 0x02c1fb84, 0x00174205, 0x00c1a7ce, 0x01e8015a, 0x0200a300, 0x0019d3c9}}, Y: Field{[10]uint32{0x020d38a5, 0x03bb31a7, 0x02259e09, 0x03682c60, 0x0370db57, 0x00011602, 0x0343b257, 0x00cecfb7, 0x01f9413f, 0x000a6748}}}, + {X: Field{[10]uint32{0x02e9f08f, 0x034a6f57, 0x00bcff87, 0x031a49c5, 0x023d82d6, 0x007ecec9, 0x01b815ad, 0x01d2aee0, 0x01a54ade, 0x0034cbd3}}, Y: Field{[10]uint32{0x033eea87, 0x0105a442, 0x01d582fc, 0x0114d4d6, 0x0382e14f, 0x00165c1d, 0x0299016c, 0x014ee5a3, 0x02738b8e, 0x003e50a7}}}, + {X: Field{[10]uint32{0x03ce3ff6, 0x02553c78, 0x008cb1ed, 0x00c7dcac, 0x036fbb69, 0x00d61174, 0x01936571, 0x021555b9, 0x02704353, 0x000c3939}}, Y: Field{[10]uint32{0x0388db7b, 0x0169567a, 0x0340dc69, 0x00d769c1, 0x010a878d, 0x00eef26c, 0x01935011, 0x02618e12, 0x03ce6198, 0x00118be6}}}, + {X: Field{[10]uint32{0x00cad297, 0x01c6c135, 0x0180bf19, 0x0042c079, 0x027f3dcd, 0x00c3937b, 0x02829043, 0x0330c011, 0x02003c51, 0x002f8818}}, Y: Field{[10]uint32{0x01ccb9bc, 0x0163b5cb, 0x002a0d55, 0x0242415a, 0x01b1c610, 0x01387195, 0x033d48a7, 0x03950a15, 0x03c49d61, 0x00188622}}}, + {X: Field{[10]uint32{0x035df04a, 0x026167ff, 0x01993c41, 0x0298077d, 0x01cb6e84, 0x030abc84, 0x01e0fb9a, 0x01147b4a, 0x0023ace3, 0x0024c511}}, Y: Field{[10]uint32{0x0037b47c, 0x00a9b44c, 0x039d1d90, 0x0093dcae, 0x00f10652, 0x01e6480e, 0x031a3f9d, 0x01097d71, 0x03b164c3, 0x001f0437}}}, + {X: Field{[10]uint32{0x017b112c, 0x01906305, 0x012a7cb6, 0x00171edf, 0x01978292, 0x030d3ee0, 0x01ca26d6, 0x032f73c8, 0x00044f5f, 0x002c057e}}, Y: Field{[10]uint32{0x023a1d5f, 0x03a85153, 0x008c1d3a, 0x01bea8c2, 0x003b3cdc, 0x037e357e, 0x00a655b2, 0x03a04dd1, 0x02086d04, 0x002ae307}}}, + {X: Field{[10]uint32{0x01a21b52, 0x03cabcd0, 0x000d36b3, 0x03795e85, 0x024f8a18, 0x0291968e, 0x00868117, 0x025f6279, 0x01da649d, 0x00357a78}}, Y: Field{[10]uint32{0x0327447a, 0x017a164b, 0x0080d895, 0x01708901, 0x03169346, 0x03537436, 0x01a13cc1, 0x03b5cc44, 0x0037f391, 0x00132c11}}}, + {X: Field{[10]uint32{0x036966bb, 0x0294c5b4, 0x02d6f996, 0x0335cb85, 0x01983005, 0x02e6490e, 0x03f8ed77, 0x03281976, 0x01047dd7, 0x0034eb90}}, Y: Field{[10]uint32{0x0125ac46, 0x00370534, 0x00a614b1, 0x035f7c2b, 0x0164f8cd, 0x0105f1b6, 0x010f0303, 0x03aec8a8, 0x0321ad22, 0x002f46ba}}}, + {X: Field{[10]uint32{0x0097b065, 0x002be1f2, 0x037b49f8, 0x002a0b8d, 0x0087197d, 0x02003c29, 0x026cdd22, 0x03e563f1, 0x0363d885, 0x00118f89}}, Y: Field{[10]uint32{0x02f7ca7f, 0x026499c7, 0x03508b79, 0x0187ef25, 0x0326b80c, 0x0137818a, 0x03a311a9, 0x003f5f7c, 0x00db0e5d, 0x002ffbeb}}}, + {X: Field{[10]uint32{0x00641917, 0x0377f244, 0x0347c83c, 0x03102ff9, 0x0158e597, 0x02d8fb0c, 0x0353ec1b, 0x00159f1b, 0x01fd127c, 0x001e617f}}, Y: Field{[10]uint32{0x0332ed03, 0x016f559f, 0x0308703a, 0x00783b19, 0x0124ed29, 0x038a26bb, 0x0325fe1d, 0x0218bbca, 0x02daf3d9, 0x00180f04}}}, + {X: Field{[10]uint32{0x027703e9, 0x03c550f6, 0x02d0ed5f, 0x0272e0f4, 0x019e74c5, 0x003ab1fe, 0x01d24941, 0x038e76cb, 0x016b5f76, 0x001d286b}}, Y: Field{[10]uint32{0x00e0db08, 0x00dff5e4, 0x00c33d57, 0x01a250ba, 0x00093e09, 0x00c6efa8, 0x0193d836, 0x0318f358, 0x03ef18c9, 0x00331855}}}, + {X: Field{[10]uint32{0x022f6da3, 0x034225ac, 0x03463a71, 0x00b1c9d1, 0x03c9bab4, 0x02e866df, 0x01416664, 0x01d7d80b, 0x02507033, 0x000c1a0a}}, Y: Field{[10]uint32{0x03a22ff8, 0x0053665d, 0x0273f177, 0x0383c672, 0x036290d0, 0x00c474c5, 0x00f39e7f, 0x02d3e9b2, 0x00f6b018, 0x00154f81}}}, + {X: Field{[10]uint32{0x0369ef57, 0x01b04d1d, 0x0352b1ee, 0x00ac9193, 0x03654e7a, 0x03e9e565, 0x03791efe, 0x0357c9b0, 0x00f0d7c0, 0x00278856}}, Y: Field{[10]uint32{0x01008373, 0x03efc98a, 0x038509e2, 0x023bcd68, 0x029ffd7c, 0x03e9dd8b, 0x003a3481, 0x014fc240, 0x00dd1b90, 0x0001c4bf}}}, + {X: Field{[10]uint32{0x02327d66, 0x0215fcef, 0x03ce7322, 0x019b8f13, 0x028172e5, 0x00094e30, 0x024029c2, 0x03273fae, 0x02989a43, 0x0005db89}}, Y: Field{[10]uint32{0x03a4b1c3, 0x01e0d307, 0x009ee7b4, 0x007d3bb8, 0x019aefd3, 0x023710f0, 0x0270b487, 0x03ae1df4, 0x01d04b29, 0x003b6332}}}, + {X: Field{[10]uint32{0x00374da8, 0x011e2314, 0x00f1b700, 0x00e4f7f1, 0x02cf1892, 0x00eb5d1f, 0x02bb89a1, 0x0079b9a2, 0x02fea377, 0x001d751b}}, Y: Field{[10]uint32{0x02a6bed8, 0x011c9961, 0x02e1a3ca, 0x008544d1, 0x00d7efc2, 0x02ce6a1a, 0x00b86fd2, 0x01d9e7f4, 0x010a9950, 0x0026148e}}}, + {X: Field{[10]uint32{0x01605721, 0x00c67d91, 0x029345b7, 0x00114721, 0x032310fb, 0x0097db57, 0x0298c4c8, 0x02403fed, 0x00c67d64, 0x00202688}}, Y: Field{[10]uint32{0x00e286c1, 0x03e97cfe, 0x03e6a5eb, 0x03315258, 0x003d096c, 0x01fe8105, 0x02b06192, 0x01f88add, 0x0180d991, 0x0027a652}}}, + {X: Field{[10]uint32{0x0172c180, 0x018d11be, 0x023528d5, 0x0073ca71, 0x03defece, 0x02b1c20f, 0x00500b4e, 0x03c453b5, 0x003a43f7, 0x0006ce24}}, Y: Field{[10]uint32{0x02f408f9, 0x02504676, 0x0272ad33, 0x01adbd76, 0x022708b2, 0x0354f792, 0x0353f77f, 0x002ba224, 0x01c931a6, 0x00100dbb}}}, + {X: Field{[10]uint32{0x00feef23, 0x01b1621a, 0x0166df4e, 0x0338b41d, 0x03263458, 0x03e8fbf9, 0x00b4e8dd, 0x012e7aac, 0x01b6eb29, 0x00242a03}}, Y: Field{[10]uint32{0x03cf91e6, 0x031dba4b, 0x01681442, 0x02c9eef6, 0x035ee050, 0x0278a4da, 0x0321145d, 0x03c6361f, 0x039f9754, 0x001d4f22}}}, + {X: Field{[10]uint32{0x036bea9b, 0x009751cd, 0x0146e6dc, 0x00152851, 0x023e6f36, 0x03d80d03, 0x01625460, 0x0166604b, 0x03844b70, 0x0030b203}}, Y: Field{[10]uint32{0x02a79c64, 0x02f5120e, 0x00f6123a, 0x029c0ad3, 0x0173b871, 0x0074ec6d, 0x03495b89, 0x03539c62, 0x020d68f4, 0x0021b285}}}, + {X: Field{[10]uint32{0x028e7553, 0x00f38468, 0x01692a32, 0x038757f3, 0x012d00cf, 0x0067ec99, 0x03989d3f, 0x02d7cff7, 0x02744cf4, 0x00273d81}}, Y: Field{[10]uint32{0x0247759d, 0x003144f0, 0x0385dc30, 0x0038f116, 0x03edd0f3, 0x03eb5a18, 0x017b6a3c, 0x03f3056d, 0x03f7b973, 0x002051f2}}}, + {X: Field{[10]uint32{0x02d82208, 0x023d6156, 0x005abce9, 0x0031d080, 0x02a6280b, 0x018364db, 0x0093fd60, 0x031ac969, 0x03a28742, 0x0015d223}}, Y: Field{[10]uint32{0x01a29574, 0x021e113c, 0x03921dc2, 0x03994084, 0x03af949a, 0x009ed1c2, 0x02dbe56c, 0x02fa9562, 0x02455073, 0x000c6cf2}}}, + {X: Field{[10]uint32{0x0099447d, 0x02f17ad2, 0x00dc84ed, 0x005b1d63, 0x02d40ed6, 0x01d658f0, 0x00df2b8d, 0x02ef2372, 0x00be6be8, 0x003c44cf}}, Y: Field{[10]uint32{0x0252f50f, 0x02ee24fd, 0x016870cb, 0x018375e8, 0x0110bd3a, 0x0359f558, 0x014626d8, 0x02c8fd5c, 0x00472225, 0x0015ff09}}}, + {X: Field{[10]uint32{0x03be89c0, 0x038105d6, 0x025050f4, 0x02ffcf90, 0x013f3d69, 0x00196ee0, 0x00989c79, 0x02f5e1fe, 0x02753301, 0x0025420f}}, Y: Field{[10]uint32{0x00b33482, 0x024fe925, 0x03c70cc5, 0x038055ac, 0x00ee4e92, 0x01dc1039, 0x017c73ca, 0x0037a518, 0x035ce7d1, 0x002112b6}}}, + {X: Field{[10]uint32{0x005c75c6, 0x000110ef, 0x01973621, 0x02cd8f23, 0x038668c7, 0x03266bd8, 0x0176ed29, 0x0159d579, 0x0355cbb7, 0x0006a420}}, Y: Field{[10]uint32{0x032454a2, 0x02b48b8b, 0x03f27057, 0x001d2d13, 0x00a73538, 0x01589f60, 0x03787222, 0x01b8d4bd, 0x026c6e55, 0x0035d951}}}, + {X: Field{[10]uint32{0x0349b648, 0x037cefbc, 0x01db4f04, 0x018f17cc, 0x038a2d1f, 0x02b65fe7, 0x0067308f, 0x010f56aa, 0x03740bd3, 0x0031648b}}, Y: Field{[10]uint32{0x027bd648, 0x014f251b, 0x00c4377f, 0x01108da9, 0x00da8118, 0x0362dd4b, 0x02605e50, 0x036fa204, 0x00687cfc, 0x001dec7c}}}, + {X: Field{[10]uint32{0x02c95dc9, 0x00d10839, 0x017d9964, 0x00c458e2, 0x02055dcf, 0x006c2d9c, 0x011a4043, 0x000a5dda, 0x01969f91, 0x0019386c}}, Y: Field{[10]uint32{0x0222550c, 0x02538ca4, 0x0371ddce, 0x034873bc, 0x029bfb77, 0x0240d6d9, 0x027fa26a, 0x030f27ac, 0x00c7c11f, 0x00305bd8}}}, + {X: Field{[10]uint32{0x03ce08de, 0x03edfa81, 0x01ce7808, 0x029d527a, 0x03c602f8, 0x00ccf74d, 0x0121bad3, 0x0113b5b1, 0x02766877, 0x0000cecb}}, Y: Field{[10]uint32{0x02988efd, 0x01444aa1, 0x038114c2, 0x032a9b79, 0x03d742e8, 0x03f7652f, 0x036c2437, 0x022ba573, 0x027fc8ed, 0x00386f3f}}}, + {X: Field{[10]uint32{0x01e4f294, 0x011cef91, 0x0275c951, 0x003fca52, 0x0189fbf3, 0x01ed2b0c, 0x02310331, 0x0228730a, 0x034c866d, 0x00083c63}}, Y: Field{[10]uint32{0x02d0ea0e, 0x032ba074, 0x0358943f, 0x027dc5cf, 0x030fe852, 0x034defb9, 0x00883363, 0x03ded3f6, 0x03c9d08e, 0x00235a15}}}, + {X: Field{[10]uint32{0x03b69a8b, 0x01105db5, 0x03befd14, 0x014d5190, 0x012df346, 0x038aa2e7, 0x02b4c685, 0x031c5a83, 0x03c944c9, 0x00134588}}, Y: Field{[10]uint32{0x0117be80, 0x0160e222, 0x02f7854f, 0x0357b654, 0x022b601b, 0x01bb0d25, 0x016bf6b9, 0x02b40fe6, 0x01fe8744, 0x00377c6e}}}, + {X: Field{[10]uint32{0x01b079e0, 0x0343fd4f, 0x027e2d4a, 0x02937436, 0x014faad0, 0x016251e1, 0x00d6b368, 0x00a4b4a0, 0x00dbe8ab, 0x002a406c}}, Y: Field{[10]uint32{0x03298a9d, 0x00398391, 0x023b301d, 0x03829ac1, 0x00716bc5, 0x0079eb99, 0x02f04dc6, 0x006986bd, 0x03e1834f, 0x000fc9f9}}}, + {X: Field{[10]uint32{0x03fc9a70, 0x007269ba, 0x0089b303, 0x013df202, 0x012f42a2, 0x0211916c, 0x03d66f44, 0x023ff542, 0x00713021, 0x001f82bc}}, Y: Field{[10]uint32{0x02aedb3f, 0x01b6de16, 0x003ab241, 0x005fd6f7, 0x010d5795, 0x017ac7a2, 0x013fbb23, 0x0343127d, 0x03f3926c, 0x00142f08}}}, + {X: Field{[10]uint32{0x02ebf20d, 0x00aaac16, 0x01da4ef8, 0x00a151ba, 0x00b47f05, 0x0102a40e, 0x005d3354, 0x00968b06, 0x007e1a7b, 0x001eea06}}, Y: Field{[10]uint32{0x02185187, 0x00924c26, 0x033a39ab, 0x02f39f62, 0x000527ef, 0x0329775e, 0x026c25c7, 0x00dc2be1, 0x026c9625, 0x001b9abb}}}, + {X: Field{[10]uint32{0x013a6807, 0x02128e76, 0x0277255b, 0x02583a49, 0x009767b7, 0x0063f28e, 0x0000816e, 0x02c9e6d8, 0x03c34d83, 0x00230143}}, Y: Field{[10]uint32{0x01174870, 0x026f104d, 0x023ce701, 0x0336073c, 0x015d699f, 0x0106604e, 0x03c29650, 0x023eca09, 0x00ef75b6, 0x002618c5}}}, + {X: Field{[10]uint32{0x019c2ec9, 0x02e2c6f2, 0x006202a7, 0x028b2fd4, 0x009d7201, 0x01492652, 0x0060583a, 0x037e1896, 0x009a78e4, 0x0014ede1}}, Y: Field{[10]uint32{0x03e469c0, 0x00b77e78, 0x012c544d, 0x00951ca3, 0x02e0a44d, 0x006f8b14, 0x024b22de, 0x01f41d77, 0x0212ac60, 0x00138c7a}}}, + {X: Field{[10]uint32{0x03313b33, 0x03149f94, 0x0278efeb, 0x0010c77b, 0x02b63350, 0x03f9d8af, 0x0075a010, 0x032655a8, 0x0267a5d0, 0x0026f7e7}}, Y: Field{[10]uint32{0x029d2bb0, 0x0252bf63, 0x00d5a17e, 0x00d9d8ba, 0x02907f26, 0x03c5b2b4, 0x00c27926, 0x00383b89, 0x0221a596, 0x00250991}}}, + {X: Field{[10]uint32{0x02381f34, 0x03f66412, 0x012fb429, 0x00b1bb0b, 0x0117d9f4, 0x01d81be2, 0x02c031a4, 0x02cef42e, 0x02b37a8a, 0x001f2a9c}}, Y: Field{[10]uint32{0x017303c9, 0x01f77597, 0x037f1ef8, 0x00781a0b, 0x03ff8fbd, 0x00804253, 0x023d6beb, 0x037a34d3, 0x03ab7ee5, 0x0016d614}}}, + {X: Field{[10]uint32{0x0193d81a, 0x01ae5f8e, 0x0093dde1, 0x031d54c9, 0x03925d62, 0x00fd236d, 0x000295fc, 0x01e5d5e7, 0x039f0982, 0x000bbca6}}, Y: Field{[10]uint32{0x03110753, 0x008cde8c, 0x015e89b4, 0x0090e1f6, 0x00a0afff, 0x02fd31c5, 0x0137ef96, 0x016e9829, 0x004dd987, 0x00125b25}}}, + {X: Field{[10]uint32{0x03317ff8, 0x030d2fa5, 0x00e6a9e5, 0x014bb0d5, 0x024029e9, 0x039740b1, 0x03c1860a, 0x01e1d55c, 0x00ad95b0, 0x0037c55f}}, Y: Field{[10]uint32{0x0284c162, 0x01bb8e04, 0x03ba470f, 0x00ba15a4, 0x00b629e6, 0x00acf30c, 0x01c979a0, 0x00ad4226, 0x02c77592, 0x003cbb32}}}, + {X: Field{[10]uint32{0x02454b1d, 0x02a61c05, 0x020e7b15, 0x00dadc64, 0x00e651d2, 0x02e7ad51, 0x0182e643, 0x02949ad8, 0x0150a29c, 0x00375570}}, Y: Field{[10]uint32{0x002e9368, 0x01788fd3, 0x00f5c4d9, 0x02af5dea, 0x00ac685a, 0x01a30944, 0x01605d42, 0x03a8bace, 0x03a542f4, 0x001131d5}}}, + {X: Field{[10]uint32{0x00227f27, 0x02792e26, 0x0172325b, 0x024e1fc0, 0x02c4d5d3, 0x018f4c95, 0x01477630, 0x00b1e464, 0x00f46ed4, 0x0005a21b}}, Y: Field{[10]uint32{0x0217fffb, 0x00e0c5c2, 0x00367ec5, 0x02378bd2, 0x02c824ed, 0x00f280f7, 0x02192fc9, 0x00ca6751, 0x02207ee7, 0x001d0868}}}, + {X: Field{[10]uint32{0x0360732f, 0x03aa9eca, 0x0345e56a, 0x0089213f, 0x0327968c, 0x01bc2b3f, 0x028b306d, 0x00186023, 0x00fcdaa3, 0x001bfc60}}, Y: Field{[10]uint32{0x029961a9, 0x00fa87bd, 0x038cc22f, 0x008baa16, 0x026c8d40, 0x018dd868, 0x0254dad0, 0x02bfc3f0, 0x0254f0c2, 0x001f45b5}}}, + {X: Field{[10]uint32{0x00395e36, 0x03323ab7, 0x005c4f8b, 0x0154e7da, 0x00aa912b, 0x003b99df, 0x034f51f4, 0x030a80fa, 0x0111a00d, 0x0000fa91}}, Y: Field{[10]uint32{0x03c9259d, 0x000d719c, 0x0049824b, 0x00d94a43, 0x030a2f2e, 0x010376d4, 0x02398393, 0x0008564e, 0x01f1528b, 0x001b27b4}}}, + {X: Field{[10]uint32{0x0253081d, 0x0332883c, 0x014b63c7, 0x002a0d79, 0x0153e415, 0x00cb7ee3, 0x00742d8f, 0x03a7aace, 0x0170dc3d, 0x0002e0b3}}, Y: Field{[10]uint32{0x01d0e24d, 0x012f02ab, 0x0326860d, 0x015aa48b, 0x0302effc, 0x00ca5d97, 0x02e20499, 0x01b9d74c, 0x03fe1f7f, 0x0003a2f2}}}, + {X: Field{[10]uint32{0x0196c77f, 0x00e2d5e8, 0x03d49b7b, 0x03c05cc9, 0x0206d056, 0x00169a69, 0x02e23bf1, 0x021d1613, 0x03e00074, 0x003f8bf0}}, Y: Field{[10]uint32{0x01bf3916, 0x02ef6dba, 0x0271d4f9, 0x007793f7, 0x007da856, 0x01601ec7, 0x01a32f69, 0x034a5f32, 0x001cc3c6, 0x000f8625}}}, + {X: Field{[10]uint32{0x03b7858b, 0x036fd5d2, 0x035ec845, 0x00511ba8, 0x02e8b001, 0x00b6e75b, 0x028778b1, 0x00da4d1f, 0x0176cdaa, 0x00012e40}}, Y: Field{[10]uint32{0x0173c154, 0x032abb2e, 0x03155295, 0x03f0bdea, 0x021fdad0, 0x02162031, 0x026e349b, 0x017f4fb2, 0x03ab6e9c, 0x003d8151}}}, + {X: Field{[10]uint32{0x0144c6d2, 0x03b04296, 0x028a0cd3, 0x01cbd654, 0x01defc42, 0x0036f27b, 0x00c86a9f, 0x01802d2e, 0x02511d34, 0x000d7ce0}}, Y: Field{[10]uint32{0x00b5ccd5, 0x00c8d2f4, 0x00daeae8, 0x02c6c4a8, 0x0043762b, 0x03e5b2a6, 0x0337a80c, 0x028797db, 0x01f6ef7f, 0x000a6a0d}}}, + {X: Field{[10]uint32{0x022cb94a, 0x0308dc5c, 0x011cdf3c, 0x02b0fc04, 0x03e1d0e9, 0x021f4fd6, 0x0027e265, 0x02dffe84, 0x02970311, 0x00075d2c}}, Y: Field{[10]uint32{0x00c2071e, 0x03307dca, 0x030e2606, 0x02ba771f, 0x0135dc99, 0x003d7183, 0x03bcfb81, 0x005382dc, 0x038b57f1, 0x00171ef3}}}, + {X: Field{[10]uint32{0x00450428, 0x0129a2a6, 0x013e6f93, 0x02df1056, 0x024f75d1, 0x027b1c8b, 0x0020737b, 0x03e5582c, 0x00f309c6, 0x00142825}}, Y: Field{[10]uint32{0x03778eee, 0x0243c7a0, 0x021b554a, 0x02da1a6a, 0x0089c86d, 0x02a07c11, 0x009eaba6, 0x0033f65a, 0x0222dfe1, 0x0028a1b8}}}, + {X: Field{[10]uint32{0x03c63db7, 0x0029b589, 0x0010599b, 0x036452d2, 0x00282dbc, 0x01d7b0e3, 0x02cf12e2, 0x0055f37f, 0x03812129, 0x0026d96e}}, Y: Field{[10]uint32{0x00223188, 0x0164ef06, 0x03d65528, 0x0102b423, 0x00660b4c, 0x007a629e, 0x013b2e95, 0x00890864, 0x031a3f0f, 0x003160b6}}}, + {X: Field{[10]uint32{0x02a4bc6b, 0x00200b4d, 0x02ca51c2, 0x03179883, 0x0085e7f1, 0x007720c7, 0x02c1115a, 0x0281b915, 0x00fc1fdf, 0x0022d151}}, Y: Field{[10]uint32{0x0220350d, 0x022c67de, 0x003b06ea, 0x02e6556c, 0x01e4116f, 0x02dc3993, 0x022af7f4, 0x00980b9c, 0x0041288f, 0x0038f9df}}}, + {X: Field{[10]uint32{0x020ab4aa, 0x02076577, 0x01e29d5f, 0x004f773b, 0x006cb2ae, 0x0155e3f7, 0x039b29cc, 0x03adf145, 0x0080b959, 0x001b1c26}}, Y: Field{[10]uint32{0x027c4bdc, 0x033144e7, 0x03b43c2d, 0x0314254f, 0x02ee2b59, 0x03cf7aae, 0x036c0c76, 0x02e9099c, 0x03aebd8e, 0x003278cf}}}, + {X: Field{[10]uint32{0x01537806, 0x02d59dcf, 0x001e7085, 0x019e00ae, 0x0076fc9d, 0x012821e8, 0x01891f79, 0x01a9c657, 0x035137ba, 0x001ddd82}}, Y: Field{[10]uint32{0x018e3a25, 0x0206af85, 0x037f0d7e, 0x037b9a39, 0x021b87ff, 0x03d105ef, 0x0358c7ed, 0x02962fd3, 0x00f5aaee, 0x003d480b}}}, + {X: Field{[10]uint32{0x02163102, 0x03109b9f, 0x025d0df4, 0x03e3bf58, 0x03e23cd4, 0x02324699, 0x02904a8a, 0x00320ba6, 0x03836a0b, 0x0006a2f5}}, Y: Field{[10]uint32{0x02285844, 0x0317f304, 0x01f2e4e9, 0x005adc02, 0x01c2a963, 0x03dd2a1f, 0x0174f282, 0x00b2b8f1, 0x00cab095, 0x00187f99}}}, + {X: Field{[10]uint32{0x024abc30, 0x02d4e421, 0x031d753d, 0x02679a51, 0x02a3fb30, 0x00936475, 0x01e453ed, 0x02644fec, 0x01b65907, 0x003f885f}}, Y: Field{[10]uint32{0x01730b58, 0x03dac0d3, 0x012538cd, 0x00714e5a, 0x0193a0c6, 0x007c11f5, 0x030f20fb, 0x017b5a02, 0x02bba962, 0x001773e6}}}, + {X: Field{[10]uint32{0x01b33b91, 0x02bb527d, 0x02c5f212, 0x035d232d, 0x0107e3ab, 0x03ab5a5b, 0x00f58b65, 0x0357af0e, 0x023754af, 0x00094135}}, Y: Field{[10]uint32{0x035d75d4, 0x0004eb5e, 0x03437b5e, 0x004159d7, 0x00ba7cec, 0x01cbeefd, 0x01321c6c, 0x011a713d, 0x034375f1, 0x001e69af}}}, + {X: Field{[10]uint32{0x03197b5c, 0x03772bf6, 0x0176b7fb, 0x02fd7322, 0x036160ab, 0x021c4170, 0x029bd3f6, 0x008b5e26, 0x0302f47b, 0x0002c1bd}}, Y: Field{[10]uint32{0x0332f63d, 0x017e4635, 0x007781cd, 0x01ff45e7, 0x005bd2fe, 0x02a8f7f9, 0x012a35b6, 0x035247d6, 0x03d419a4, 0x001d9a6e}}}, + {X: Field{[10]uint32{0x01044e23, 0x004a2983, 0x010acbc2, 0x027af48f, 0x00a6f3f9, 0x006d5120, 0x034eeb93, 0x0273e500, 0x003bb31f, 0x00200ec8}}, Y: Field{[10]uint32{0x0328d1c7, 0x014e0705, 0x006a954e, 0x02fd26e5, 0x03bfc9cc, 0x03e98aeb, 0x0320c5c7, 0x03dd6566, 0x008df271, 0x000c22af}}}, + {X: Field{[10]uint32{0x0302749a, 0x00a27f80, 0x028dcd57, 0x037a3a56, 0x02e52de1, 0x000e9cc4, 0x010e5bda, 0x033ab6ed, 0x00b4c5f5, 0x00099aa7}}, Y: Field{[10]uint32{0x02e0ae7e, 0x021bff11, 0x03baa8b3, 0x02e879f0, 0x033dc0ef, 0x03213b53, 0x0282877c, 0x02cbea8f, 0x030ba856, 0x0027baa5}}}, + {X: Field{[10]uint32{0x004eba94, 0x00d82f3e, 0x02a355d7, 0x0107a6af, 0x0364c4c1, 0x02058f7c, 0x019a7ab9, 0x01eb5496, 0x0195d80c, 0x003f62a7}}, Y: Field{[10]uint32{0x03b1030c, 0x035f5cf7, 0x01a713e2, 0x03691eff, 0x03a30377, 0x02b9ff4c, 0x032e2688, 0x014ecd66, 0x03021009, 0x002a7ec5}}}, + {X: Field{[10]uint32{0x01db0a7d, 0x02dbc9be, 0x038f8f2c, 0x0316dec2, 0x026e84ac, 0x02cb202f, 0x03c339a8, 0x023c8d67, 0x01f309f2, 0x0029cc8b}}, Y: Field{[10]uint32{0x02db6be6, 0x028ba85b, 0x00885c12, 0x0384c5c5, 0x03095f40, 0x03c4be95, 0x01b7f5b2, 0x025405ff, 0x029d2174, 0x0008bdbf}}}, + {X: Field{[10]uint32{0x03052d36, 0x00f1f932, 0x01ffc82c, 0x006ba95a, 0x00bd4c46, 0x03dfc3c6, 0x02104ddb, 0x0199258e, 0x010f336a, 0x0020aa30}}, Y: Field{[10]uint32{0x01f1dd0c, 0x0384a1e5, 0x038c118f, 0x03533411, 0x015e5c31, 0x02dc6d9c, 0x010501cc, 0x01c89e2e, 0x00a2c0ef, 0x001cdf3b}}}, + {X: Field{[10]uint32{0x0315d6df, 0x01e12a53, 0x00516c54, 0x02dd6e97, 0x026c4ef2, 0x01698309, 0x03cd12f0, 0x03de5401, 0x01b68e3b, 0x0026d434}}, Y: Field{[10]uint32{0x03ddd8fd, 0x01bfadf2, 0x02778737, 0x009cb51f, 0x02403fff, 0x03c63549, 0x003fd2a4, 0x01db6340, 0x0109b791, 0x000abf23}}}, + {X: Field{[10]uint32{0x02e08d32, 0x021657ee, 0x00b80671, 0x035fba0b, 0x02b8dcb9, 0x0074c15a, 0x023a8228, 0x008ff9f7, 0x03ddc8b4, 0x000fe420}}, Y: Field{[10]uint32{0x028fa758, 0x0257ff3c, 0x01376e21, 0x01b48330, 0x0081f77f, 0x03e80868, 0x020ed90a, 0x007646a7, 0x0152fd51, 0x0032c4f0}}}, + {X: Field{[10]uint32{0x02167faf, 0x0041d3bc, 0x00bfadbd, 0x00196754, 0x03c92317, 0x024999b2, 0x02ff6bd5, 0x0306895b, 0x01c1ee17, 0x0031d721}}, Y: Field{[10]uint32{0x00023a52, 0x02bc5a50, 0x00c8596d, 0x005b53df, 0x01bd698a, 0x0191fd23, 0x00ca8922, 0x010275d7, 0x02be5e09, 0x0006ad3a}}}, + {X: Field{[10]uint32{0x00656045, 0x02355da6, 0x03fb95c6, 0x00acf52d, 0x0060ea8e, 0x03deab5f, 0x010cf0d2, 0x03d74ed3, 0x03eaf8a0, 0x00314d07}}, Y: Field{[10]uint32{0x00e88915, 0x034eae5d, 0x023986e6, 0x035535c4, 0x02dc48a4, 0x009aae60, 0x00fa422a, 0x016e7e92, 0x00e9007e, 0x00257e7d}}}, + {X: Field{[10]uint32{0x00c2d89b, 0x01e80c98, 0x027fd896, 0x02ddd4b5, 0x02220852, 0x01c17748, 0x02bd4c68, 0x025f8354, 0x023e2a89, 0x0020eb36}}, Y: Field{[10]uint32{0x03c31df0, 0x03a5de46, 0x00e8e330, 0x00ef752e, 0x030a77cd, 0x025c45d5, 0x01b55809, 0x02e945fd, 0x02e1d655, 0x0037386e}}}, + {X: Field{[10]uint32{0x0025237b, 0x009e6cc0, 0x039625bd, 0x01c5b174, 0x00f1c0d5, 0x00a75653, 0x01c4164e, 0x0241d16e, 0x01468b29, 0x0016e064}}, Y: Field{[10]uint32{0x03625d8e, 0x0227d2bd, 0x034fcf69, 0x0329c6e8, 0x011c48d2, 0x00207cd6, 0x0188daab, 0x0377eafb, 0x02a03fdd, 0x00330d8d}}}, + {X: Field{[10]uint32{0x003b0e6c, 0x0241178b, 0x037219b8, 0x01934e35, 0x0332f5f6, 0x01984139, 0x00417961, 0x00e3bfe0, 0x0122214e, 0x00191de0}}, Y: Field{[10]uint32{0x0211a32d, 0x033e6111, 0x02f81974, 0x000e352b, 0x00d8b632, 0x02e29f47, 0x02afc4a0, 0x03bb1ee3, 0x00497e15, 0x000ca73c}}}, + {X: Field{[10]uint32{0x02f12323, 0x0032e7c6, 0x0017c43d, 0x0275b684, 0x002b475a, 0x02bba199, 0x01099099, 0x018bd1e5, 0x026afe57, 0x003b5360}}, Y: Field{[10]uint32{0x03e48e78, 0x00c6defd, 0x02274d05, 0x02696510, 0x01c4d88c, 0x02b1e467, 0x0296f928, 0x0297bb20, 0x01be3faf, 0x00231be0}}}, + {X: Field{[10]uint32{0x01109c4a, 0x01bad033, 0x02fe97a0, 0x00ad57de, 0x024d82ac, 0x011bf586, 0x016f5513, 0x03b30eb3, 0x0124419a, 0x000e2d0a}}, Y: Field{[10]uint32{0x03e05583, 0x032e4adc, 0x02b07b5a, 0x01a28b39, 0x02de49d7, 0x03cd669a, 0x030965a1, 0x00bdceca, 0x00962feb, 0x001fd0b0}}}, + {X: Field{[10]uint32{0x02138911, 0x02b0ba60, 0x016e3446, 0x018893c8, 0x01bb2a8f, 0x020fa185, 0x034cf701, 0x02529ed0, 0x00a8d8bb, 0x0030f2b5}}, Y: Field{[10]uint32{0x0282765e, 0x023b4e1c, 0x01b2759a, 0x00bbc6c9, 0x01420e37, 0x00b738e8, 0x0342ce38, 0x025d9081, 0x02278cad, 0x003d926f}}}, + {X: Field{[10]uint32{0x00bd6538, 0x02239295, 0x01a9e555, 0x015cd964, 0x00d9212e, 0x038faa7b, 0x03ae40dc, 0x00dbf553, 0x03f4d3d2, 0x000b5023}}, Y: Field{[10]uint32{0x00e815b7, 0x02816d43, 0x021324b9, 0x01c5616a, 0x0285e2a1, 0x00a66fbd, 0x02284bf0, 0x00a81af1, 0x01f0e869, 0x003565ab}}}, + {X: Field{[10]uint32{0x0233c854, 0x02dfaa9e, 0x03daebaf, 0x028e8f1b, 0x03d67423, 0x00fe223a, 0x0290cf81, 0x0097eddb, 0x036d247f, 0x003b9eb7}}, Y: Field{[10]uint32{0x027a8fb4, 0x03bf0754, 0x01801dea, 0x01c5e278, 0x01143f68, 0x01505a27, 0x010dd9ef, 0x03dc15b0, 0x004b4ae8, 0x00381dc6}}}, + {X: Field{[10]uint32{0x01144b34, 0x0047cf80, 0x0064b7c8, 0x028df26a, 0x01dd5d37, 0x01317a27, 0x011151dc, 0x02b284f6, 0x03c8a9ff, 0x000be515}}, Y: Field{[10]uint32{0x035e221d, 0x018d3839, 0x01cfbb40, 0x033acf4f, 0x02787120, 0x035bf122, 0x015407e1, 0x0355ce8a, 0x00489093, 0x003ad326}}}, + {X: Field{[10]uint32{0x03fec294, 0x00311bad, 0x01c277b3, 0x020fbd4c, 0x03601204, 0x03f86378, 0x023478ce, 0x00560873, 0x02b8a0f1, 0x0034fccc}}, Y: Field{[10]uint32{0x030b2155, 0x0085786e, 0x00f9f323, 0x0243bc4d, 0x01c8968b, 0x030dca50, 0x02f1c019, 0x01e18746, 0x01b25d71, 0x003a9d6e}}}, + {X: Field{[10]uint32{0x02152b91, 0x0337c7e3, 0x02f7e9a4, 0x02199ad4, 0x035f3ddb, 0x03bcdb75, 0x021fcd86, 0x016ab4d4, 0x00d338b0, 0x00060d02}}, Y: Field{[10]uint32{0x0241218c, 0x00d54dc5, 0x018095de, 0x01339126, 0x00210e20, 0x00326209, 0x01be21f2, 0x012b1bce, 0x01206edf, 0x0019a661}}}, + {X: Field{[10]uint32{0x0340374e, 0x02558257, 0x006863d3, 0x035b094d, 0x0321faff, 0x0273e269, 0x00f1f0ff, 0x01794eea, 0x005db114, 0x000a0ffb}}, Y: Field{[10]uint32{0x0032fefe, 0x006fa0af, 0x02f77851, 0x000f3ce6, 0x0008846e, 0x01729ba6, 0x0268e5f6, 0x015439a3, 0x023774af, 0x001c2c04}}}, + {X: Field{[10]uint32{0x0152fa62, 0x02837ef7, 0x016daf54, 0x01e5dc3f, 0x00ebc735, 0x0239f6ff, 0x03bd249d, 0x00f3e904, 0x030a4f94, 0x000339d5}}, Y: Field{[10]uint32{0x0375d41d, 0x01be73a2, 0x013907c3, 0x02260f81, 0x00bd5e5b, 0x02e8e617, 0x005bdf98, 0x02573fee, 0x014bef46, 0x0038456c}}}, + {X: Field{[10]uint32{0x038fd470, 0x02529320, 0x02b15377, 0x0055d32f, 0x01df7903, 0x03646549, 0x029f648c, 0x03b0fc49, 0x0319c8f4, 0x001fa713}}, Y: Field{[10]uint32{0x00fa5270, 0x037d73ac, 0x013e9c86, 0x0236b5af, 0x0060fafa, 0x03447d20, 0x015d6ccb, 0x03d732a1, 0x03fe8cf5, 0x003a7676}}}, + {X: Field{[10]uint32{0x00cb001b, 0x01146d19, 0x03ec23bf, 0x0131c8a8, 0x010ba04f, 0x03c8c27e, 0x007f919d, 0x016ffa9f, 0x03e60d5d, 0x0038aa6e}}, Y: Field{[10]uint32{0x02393fb0, 0x004691e1, 0x03f16984, 0x024741a9, 0x03d1925b, 0x039cb2dd, 0x0125bd67, 0x01ab1de2, 0x00e1c3cd, 0x003905df}}}, + {X: Field{[10]uint32{0x01271012, 0x0264009d, 0x00265e70, 0x006c5563, 0x00f55e64, 0x00aa5264, 0x03bf37d4, 0x03bd4390, 0x02a43e17, 0x00141144}}, Y: Field{[10]uint32{0x021ed18b, 0x029274b9, 0x0381b742, 0x02e5a265, 0x011f21c4, 0x02387cb3, 0x00b1f41e, 0x00eb3cb5, 0x03d857ba, 0x00255297}}}, + {X: Field{[10]uint32{0x005f850d, 0x032fa1ca, 0x03411cd5, 0x036285ec, 0x01859945, 0x029cb1c8, 0x02d1d51b, 0x00c97d2c, 0x0013a6bb, 0x0020747c}}, Y: Field{[10]uint32{0x00937193, 0x012f3177, 0x0071adce, 0x0127535c, 0x01259d3d, 0x0262c816, 0x01fe2492, 0x002154ec, 0x03b1f0c3, 0x000b574b}}}, + {X: Field{[10]uint32{0x01895022, 0x00ce0f47, 0x0387ca73, 0x0050528e, 0x01d90dd5, 0x0399b0cf, 0x02872767, 0x02099862, 0x02dfc1d2, 0x0016d9b0}}, Y: Field{[10]uint32{0x0154e0ff, 0x02d51cb5, 0x00f5449e, 0x03684b63, 0x0327fcae, 0x0101fa61, 0x017267b7, 0x0255a488, 0x038e3818, 0x0026f405}}}, + {X: Field{[10]uint32{0x00381186, 0x03e1a208, 0x00597afa, 0x0366bd63, 0x0399b583, 0x036ffe2a, 0x012d544b, 0x0178e36f, 0x030e98ec, 0x002bad7d}}, Y: Field{[10]uint32{0x0184427b, 0x02b705cd, 0x01a052e7, 0x01cc3cbd, 0x01691b09, 0x00cdb908, 0x00b76929, 0x029c37c2, 0x02b0d25c, 0x001862f5}}}, + {X: Field{[10]uint32{0x0105052e, 0x02a60849, 0x0353a707, 0x0329dab5, 0x02557679, 0x01ea700a, 0x0361e3c6, 0x0250ee11, 0x02ffe841, 0x0002ca27}}, Y: Field{[10]uint32{0x0079992c, 0x02e743fa, 0x01e330cf, 0x00e17974, 0x00530ed7, 0x0318920b, 0x034f895d, 0x018aa14e, 0x01f0c218, 0x0001ea60}}}, + {X: Field{[10]uint32{0x0219291c, 0x02f4d5bd, 0x01200f81, 0x005f9138, 0x003f5859, 0x03f4a0a2, 0x00c8360c, 0x006679ac, 0x01458b12, 0x002aeb8e}}, Y: Field{[10]uint32{0x01753f28, 0x02dd7bed, 0x02934233, 0x02ded99f, 0x000b2a81, 0x011a6c1a, 0x03be30b2, 0x01a717a0, 0x03cdb3d0, 0x002b6c8e}}}, + {X: Field{[10]uint32{0x01fbacaa, 0x02720255, 0x03013941, 0x02323646, 0x011e0f65, 0x0063aca7, 0x02c224a5, 0x01696a06, 0x03a6485b, 0x0012a560}}, Y: Field{[10]uint32{0x00e8dbca, 0x00558c6d, 0x037decea, 0x00466dec, 0x00803ecf, 0x01dda36d, 0x02375a8a, 0x010bd7b7, 0x009ee3c8, 0x0036000f}}}, + {X: Field{[10]uint32{0x00ebc169, 0x00404084, 0x017ae3a2, 0x0305183c, 0x02ea236a, 0x012ac367, 0x03cf4654, 0x03df2d97, 0x030edba6, 0x00354bd8}}, Y: Field{[10]uint32{0x030d26d0, 0x0304f84d, 0x003d9145, 0x003106f2, 0x0368e21a, 0x02801714, 0x01bea50d, 0x00ee20f9, 0x03489fa9, 0x00084555}}}, + {X: Field{[10]uint32{0x02dd6a4d, 0x00384826, 0x029bf8d1, 0x018cd6f2, 0x01c74a2a, 0x00b9307a, 0x0050fc05, 0x016163d7, 0x023782c7, 0x0002f714}}, Y: Field{[10]uint32{0x0034f189, 0x01010d9a, 0x0323e585, 0x00ef0755, 0x0312ff02, 0x02fd4a74, 0x014efbaf, 0x01d9a388, 0x01f87463, 0x002aec76}}}, + {X: Field{[10]uint32{0x019ad087, 0x038244b9, 0x00e8626e, 0x005a3c4f, 0x0288156d, 0x03ad859e, 0x0364e476, 0x02aae0ee, 0x02338bf0, 0x00111dc2}}, Y: Field{[10]uint32{0x0360a55c, 0x0170cf7b, 0x01b99c96, 0x008edca4, 0x036a3abd, 0x030b5915, 0x0393a895, 0x0102f2cc, 0x00f12e9c, 0x0016d64c}}}, + {X: Field{[10]uint32{0x015e1679, 0x00b64914, 0x021c83e3, 0x02363ba3, 0x02650310, 0x00f8d99c, 0x01ac2032, 0x012bb8c6, 0x03322e40, 0x002c579e}}, Y: Field{[10]uint32{0x01997e7a, 0x00f3abcf, 0x03d57a87, 0x00961cd1, 0x005ced5c, 0x001e5bd4, 0x002ed565, 0x02ca457e, 0x00190bbf, 0x001491aa}}}, + {X: Field{[10]uint32{0x01b00f22, 0x02f66bb7, 0x0019027b, 0x00235781, 0x01665ae1, 0x0287077e, 0x0050f758, 0x017343cb, 0x01570522, 0x00287b5d}}, Y: Field{[10]uint32{0x02791ee2, 0x0049dd9a, 0x001a13d2, 0x001024ca, 0x02d71dbd, 0x02143b40, 0x017e7464, 0x021d21ee, 0x005dad9f, 0x000f20c5}}}, + {X: Field{[10]uint32{0x01918af5, 0x022becc7, 0x037a23cf, 0x032708e8, 0x03479e9e, 0x03181603, 0x03fc43c2, 0x03183f66, 0x03616a1b, 0x003a2abc}}, Y: Field{[10]uint32{0x0279827c, 0x02dbc9e7, 0x03d3ec89, 0x000e96b0, 0x009ab9c3, 0x02e68356, 0x0141041a, 0x0319c9f8, 0x03b64a37, 0x001b39a4}}}, + {X: Field{[10]uint32{0x014c20a3, 0x00ea8dc1, 0x01b76c5a, 0x010ce28f, 0x020759c0, 0x0061e9b5, 0x024a4ef6, 0x01798d4a, 0x00cd2c85, 0x001771be}}, Y: Field{[10]uint32{0x026f4838, 0x01c05193, 0x03f0fbb8, 0x03d4b9a9, 0x000fe9f5, 0x0307620d, 0x031d1bc7, 0x02a6a359, 0x03428593, 0x003d80b0}}}, + {X: Field{[10]uint32{0x0342f3a6, 0x0281f2da, 0x0326a5f1, 0x0081186b, 0x00f65636, 0x00aa9227, 0x02063ef2, 0x0362bda2, 0x031167be, 0x0018cc9c}}, Y: Field{[10]uint32{0x034424a6, 0x0032e06d, 0x01f1a3ea, 0x00026a46, 0x02bf94a7, 0x01874f95, 0x00ca0367, 0x004c83c8, 0x03b22070, 0x002e3df0}}}, + {X: Field{[10]uint32{0x00080263, 0x008c3e52, 0x020d3535, 0x002b5e62, 0x03ad66e5, 0x03a19536, 0x005c2017, 0x00ece08c, 0x01259a39, 0x00229036}}, Y: Field{[10]uint32{0x019fcaff, 0x02d747e7, 0x01d6f6a7, 0x03326a69, 0x0143f9cb, 0x031985b4, 0x03f703a5, 0x01153b75, 0x034d9849, 0x002beda9}}}, + {X: Field{[10]uint32{0x0078645a, 0x037abe08, 0x0317dcdf, 0x022f3082, 0x02a6a02c, 0x02816df7, 0x017fd3f9, 0x01082bd4, 0x010727c7, 0x0039c51c}}, Y: Field{[10]uint32{0x0217daca, 0x00513ad0, 0x03055eaa, 0x02809606, 0x01a3561b, 0x025ac13e, 0x01d5dcdc, 0x03a753fb, 0x03cbc1ed, 0x00369f59}}}, + {X: Field{[10]uint32{0x0261c82d, 0x007da725, 0x026c0cae, 0x03a24700, 0x029922bc, 0x014e54b0, 0x0242a685, 0x02e1e007, 0x011cd95f, 0x00184c4a}}, Y: Field{[10]uint32{0x0130bf01, 0x03f0410b, 0x03b89384, 0x01e44dcc, 0x0042b894, 0x02b98cae, 0x014f9898, 0x00bf5167, 0x001c1334, 0x00058387}}}, + {X: Field{[10]uint32{0x01ca4951, 0x00af3c74, 0x003bfb78, 0x02a76940, 0x02fc5e2a, 0x01e22027, 0x029bfa81, 0x011a4b42, 0x0045b676, 0x0012f13e}}, Y: Field{[10]uint32{0x00b751f0, 0x03103f04, 0x0383cefd, 0x0315fec5, 0x0164c4a7, 0x029dbb01, 0x03055ff3, 0x0349538e, 0x01cbb9c3, 0x0021c24b}}}, + {X: Field{[10]uint32{0x02be67df, 0x039bb2a8, 0x0201f698, 0x017560a8, 0x0052865b, 0x02617cd9, 0x039bff5c, 0x03a77ca7, 0x00a27bbe, 0x00116a20}}, Y: Field{[10]uint32{0x0055fabb, 0x00cae8de, 0x00eb6131, 0x01ae3ba5, 0x02a831d4, 0x02af5643, 0x0279714d, 0x01afc7bd, 0x02a8b5e4, 0x003f9269}}}, + {X: Field{[10]uint32{0x02f4f2a4, 0x03c68352, 0x000d3f21, 0x0256c854, 0x01877e54, 0x00805174, 0x016847a2, 0x00321993, 0x0238317c, 0x001aa09a}}, Y: Field{[10]uint32{0x005f4513, 0x0117e1f8, 0x0322c154, 0x002ef081, 0x02f6b83f, 0x01b9ad1e, 0x02f14e0e, 0x02098f7c, 0x014efcc9, 0x00114865}}}, + {X: Field{[10]uint32{0x026a23a9, 0x03a28d0d, 0x0075f613, 0x0379f1b3, 0x028bd860, 0x0277395c, 0x008aa1b0, 0x03dfa5b3, 0x0106f255, 0x00054d59}}, Y: Field{[10]uint32{0x00110bf3, 0x014ec700, 0x034cee3e, 0x02d38d8a, 0x03122f37, 0x03e26977, 0x01e401f1, 0x03521435, 0x03bcd744, 0x0033456a}}}, + {X: Field{[10]uint32{0x02b89b91, 0x0387283c, 0x0043a2b5, 0x02973299, 0x00cacff3, 0x00b6b0bb, 0x00651780, 0x027d7dae, 0x02aef53d, 0x003cef04}}, Y: Field{[10]uint32{0x00e00957, 0x03294246, 0x03131368, 0x017fc91f, 0x01303e91, 0x0281cdeb, 0x03d0f367, 0x0047c907, 0x036beb2e, 0x0033f534}}}, + {X: Field{[10]uint32{0x035c0fd4, 0x00a0a5cc, 0x033736f7, 0x03bd6114, 0x0122320b, 0x02ce1d92, 0x0226ef18, 0x0294dbde, 0x006dfa04, 0x001f8f23}}, Y: Field{[10]uint32{0x01f7c189, 0x01c4a134, 0x03fe9155, 0x01362339, 0x02b6a129, 0x000f008d, 0x032400b3, 0x00cdb4cc, 0x02b532a7, 0x001cba85}}}, + {X: Field{[10]uint32{0x010369d8, 0x0111822b, 0x03223d88, 0x026f5b85, 0x026943ab, 0x0214557f, 0x021c696d, 0x017f0b05, 0x03cfa057, 0x0006632f}}, Y: Field{[10]uint32{0x013cf7ae, 0x01cac985, 0x006c2f29, 0x025209e9, 0x03032159, 0x039ee8b9, 0x019fe0ef, 0x00908af9, 0x028b3095, 0x00357989}}}, + {X: Field{[10]uint32{0x03b0e5e8, 0x02c4d42b, 0x01fd63ae, 0x02a9e02c, 0x015a147c, 0x00226e43, 0x0183c089, 0x03cd6888, 0x0289b68c, 0x0007815b}}, Y: Field{[10]uint32{0x003f32b9, 0x0011cae5, 0x008379f8, 0x00e431be, 0x003e258a, 0x01b505bd, 0x02d6ff38, 0x01315f76, 0x0053abc4, 0x002e0905}}}, + {X: Field{[10]uint32{0x02faaa21, 0x031ca79c, 0x018fb3fa, 0x011339fe, 0x03d81081, 0x02991b51, 0x0173b2f1, 0x01f9fa98, 0x01748d82, 0x00371ffe}}, Y: Field{[10]uint32{0x030c4914, 0x00b9ffb9, 0x02a1aaaf, 0x001c51b6, 0x013e3d5f, 0x01105f1c, 0x038e1c5c, 0x01bc3ff2, 0x005aef4c, 0x00307f6b}}}, + {X: Field{[10]uint32{0x03d28e79, 0x027686cb, 0x00ec29a9, 0x03c2fe3e, 0x0036b2ef, 0x0337ef12, 0x0354bc11, 0x00781c14, 0x02fcc498, 0x001c6e57}}, Y: Field{[10]uint32{0x03d684cc, 0x010b31bb, 0x03fa30af, 0x02c269cd, 0x011f3695, 0x00faef14, 0x004752cc, 0x01abbb0c, 0x01976fad, 0x003f568c}}}, + {X: Field{[10]uint32{0x02542b3a, 0x01a20eb7, 0x004ae687, 0x008625c1, 0x03f6b961, 0x0096eea0, 0x033e8ffa, 0x00af5b27, 0x00af29dc, 0x0010e153}}, Y: Field{[10]uint32{0x009c6c81, 0x02d1200f, 0x03f36fd8, 0x02957072, 0x0034c5c9, 0x02893d56, 0x01e31677, 0x018cbe37, 0x01760897, 0x00158d94}}}, + {X: Field{[10]uint32{0x0027b222, 0x00bb3cb5, 0x0396145c, 0x0243ee1d, 0x00b6eff9, 0x0357f421, 0x00c9b730, 0x027e71c2, 0x0217090e, 0x0000ab7f}}, Y: Field{[10]uint32{0x03abd7ed, 0x01b66d14, 0x010cd4c8, 0x008301a5, 0x02c44398, 0x0334a244, 0x00ae425c, 0x0367188b, 0x01605d6d, 0x002d738c}}}, + {X: Field{[10]uint32{0x03a9d6f9, 0x038fa089, 0x00620471, 0x0152b8cf, 0x0209f70c, 0x02cffcc6, 0x033a5343, 0x02bcc456, 0x012c2b7e, 0x002848d1}}, Y: Field{[10]uint32{0x01e3b4eb, 0x0053337b, 0x0396e8fa, 0x029bdde7, 0x03f53e37, 0x03f15179, 0x008194aa, 0x007d10de, 0x008378a7, 0x0024cf4d}}}, + {X: Field{[10]uint32{0x02c0a6ab, 0x01b8cb33, 0x00a603d0, 0x02b9f7b3, 0x03aab166, 0x004d21cd, 0x00152176, 0x016a061b, 0x03c2ca99, 0x0026e268}}, Y: Field{[10]uint32{0x03731232, 0x02a322b9, 0x0141480b, 0x034150ed, 0x03cbea83, 0x0092b020, 0x03c48302, 0x012c4af5, 0x0301a872, 0x000a9f4d}}}, + {X: Field{[10]uint32{0x01e9e9b2, 0x01e59184, 0x032edc90, 0x00ce7b62, 0x03384b04, 0x031149ca, 0x022b9a0d, 0x035ce423, 0x0057e7d9, 0x0019375d}}, Y: Field{[10]uint32{0x023c470e, 0x00a430e0, 0x03885b29, 0x031de03b, 0x014e311d, 0x019a6626, 0x0208a723, 0x03b85bb5, 0x00aae214, 0x003aa43e}}}, + {X: Field{[10]uint32{0x03a2176c, 0x015d9f5b, 0x0150a6b3, 0x010871fd, 0x0320abba, 0x03adc721, 0x027fd714, 0x01f1af4c, 0x0031be60, 0x0016489d}}, Y: Field{[10]uint32{0x0061d598, 0x01449712, 0x03d0b870, 0x02c4b254, 0x00796da2, 0x00f3cfce, 0x03d289ea, 0x01549d96, 0x01c4071c, 0x0032dd5c}}}, + {X: Field{[10]uint32{0x015fe2c2, 0x0041bbde, 0x03bdc8c5, 0x00229c8d, 0x03843b7d, 0x024dd0d8, 0x000ddf19, 0x01ba7872, 0x01cdadb2, 0x0014f5d9}}, Y: Field{[10]uint32{0x017c287b, 0x0269016b, 0x000bec98, 0x00ec4a29, 0x00a66d4f, 0x01351454, 0x0187f819, 0x025ceddb, 0x0198eb39, 0x001eeeec}}}, + {X: Field{[10]uint32{0x03bb66af, 0x02d46695, 0x03fc16d7, 0x02426d9b, 0x010452ee, 0x03d7fdb0, 0x03a989c0, 0x00efcd48, 0x029ec16b, 0x003941f7}}, Y: Field{[10]uint32{0x03f7892a, 0x014078a3, 0x0195259a, 0x03401320, 0x0251b6d3, 0x022566b4, 0x008b3950, 0x0379b8f7, 0x002a8272, 0x0028bcbc}}}, + {X: Field{[10]uint32{0x01b4a6f2, 0x027260ce, 0x03983556, 0x01db8a95, 0x0265601d, 0x027d82de, 0x0103b8cb, 0x013eca06, 0x00c60eb8, 0x00005bd2}}, Y: Field{[10]uint32{0x0132b289, 0x023d40f7, 0x016a441d, 0x00a43d25, 0x03d827b6, 0x02dbbd13, 0x031e75d5, 0x01a0759b, 0x03848398, 0x002184ee}}}, + {X: Field{[10]uint32{0x01446056, 0x02d8ce78, 0x03af90ca, 0x00e0a8ec, 0x010bb98e, 0x00f44b61, 0x00b51323, 0x01978c9c, 0x01ae7742, 0x0019411c}}, Y: Field{[10]uint32{0x01a50306, 0x009c92a9, 0x03cda4e6, 0x00c85765, 0x01187b40, 0x00d670ce, 0x0290a62d, 0x01bf9b2b, 0x039334aa, 0x0020e39d}}}, + {X: Field{[10]uint32{0x0021dda8, 0x02ab0aaf, 0x00821559, 0x0287f5eb, 0x02348d1b, 0x026097eb, 0x010e19d6, 0x01613f32, 0x0016fa34, 0x000577a9}}, Y: Field{[10]uint32{0x00433047, 0x01c090ea, 0x01c15d40, 0x03d7517e, 0x00010fa5, 0x012f44c1, 0x012a3d28, 0x0339a3b8, 0x03f21e19, 0x00007f2a}}}, + {X: Field{[10]uint32{0x005b46e2, 0x032e81ec, 0x00751dc5, 0x001ed3df, 0x02ee9d6a, 0x00d5ee91, 0x03900878, 0x01c3b4f6, 0x00954f1f, 0x002d0ac9}}, Y: Field{[10]uint32{0x0169ed71, 0x0065a802, 0x03ec69f9, 0x02d31546, 0x034851f5, 0x00110f18, 0x0328d6da, 0x036f9b5b, 0x03eb0e0b, 0x003855c8}}}, + {X: Field{[10]uint32{0x00230f83, 0x03f15ff0, 0x00960a17, 0x01fa3894, 0x006ab10b, 0x03b26d18, 0x02b1125d, 0x02b0c476, 0x00f5c6ae, 0x00023a79}}, Y: Field{[10]uint32{0x03959ab2, 0x01db4c6a, 0x03dee645, 0x00d358a1, 0x03f1e32c, 0x0016899f, 0x03d4e53a, 0x02ede5e2, 0x0211c79f, 0x003fec38}}}, + {X: Field{[10]uint32{0x03e1ac2e, 0x0127fa4f, 0x03528295, 0x0207e012, 0x03d6f2bb, 0x0353542f, 0x027fb63b, 0x012dce18, 0x032373bd, 0x0021ef9c}}, Y: Field{[10]uint32{0x0294e1a4, 0x01087e1f, 0x00288ce8, 0x01f5d589, 0x021ae553, 0x03038956, 0x00844b2e, 0x02e6d7ff, 0x006ff147, 0x003daa46}}}, + {X: Field{[10]uint32{0x019d60f7, 0x01c9f859, 0x02c95002, 0x019abcd2, 0x01d2cfd4, 0x01722493, 0x029514ab, 0x00e1d217, 0x0161c836, 0x0010d807}}, Y: Field{[10]uint32{0x03bc2c2a, 0x039d6d60, 0x02b099a5, 0x00d999e7, 0x00113335, 0x02316eef, 0x028034b8, 0x032536cc, 0x00007c09, 0x0021e470}}}, + {X: Field{[10]uint32{0x02b49d0d, 0x02abe8ca, 0x020aca0d, 0x0250a895, 0x026902e3, 0x0299abe5, 0x01f0bcbb, 0x01c714d9, 0x0180f830, 0x000d06c5}}, Y: Field{[10]uint32{0x00877b20, 0x00d38519, 0x01d941c0, 0x0386e840, 0x037e8fdb, 0x0119271b, 0x03564d2d, 0x024099ff, 0x0313c549, 0x0012e616}}}, + {X: Field{[10]uint32{0x014dad95, 0x009c5c7c, 0x012eb576, 0x02a39592, 0x0033ac1a, 0x01e7ec55, 0x03181e2c, 0x00e90df1, 0x00b3ce4a, 0x0005d79f}}, Y: Field{[10]uint32{0x01135b0d, 0x0363f0a0, 0x01d9ce92, 0x01558f29, 0x02581301, 0x00da5bd0, 0x038703f9, 0x03d4bbf3, 0x01a87834, 0x000c7398}}}, + {X: Field{[10]uint32{0x007165ad, 0x0391704c, 0x03a98249, 0x02553202, 0x0089c1e4, 0x0328fb2b, 0x033c8482, 0x0071878e, 0x00cc64e6, 0x0016b50c}}, Y: Field{[10]uint32{0x0251c791, 0x033b3aa4, 0x03fbeac7, 0x01b86b08, 0x009ead5f, 0x016a2e17, 0x03ca083c, 0x004ef0c5, 0x0060505c, 0x002fa8a8}}}, + {X: Field{[10]uint32{0x01b8b837, 0x03fbe983, 0x009f28ae, 0x038f75f4, 0x01080f0c, 0x01fea130, 0x00602df0, 0x038c6262, 0x00d96dac, 0x00107738}}, Y: Field{[10]uint32{0x02827928, 0x03fe3434, 0x02e333cd, 0x0247e137, 0x02088500, 0x0154c8ed, 0x02635ea8, 0x01ba7225, 0x003fed9a, 0x001d258b}}}, + {X: Field{[10]uint32{0x01961bcc, 0x0330508e, 0x03e5ba23, 0x017810cb, 0x039aed2d, 0x00819d90, 0x03c1dc25, 0x01376840, 0x00988710, 0x00297bd1}}, Y: Field{[10]uint32{0x0122db3a, 0x02c3587c, 0x009f0696, 0x0099d96c, 0x02a165c5, 0x0194ee9e, 0x02ecc328, 0x038364f9, 0x003ea363, 0x00072f3e}}}, + {X: Field{[10]uint32{0x033a9d45, 0x015c8d7e, 0x01e626db, 0x00b8b5b5, 0x0218225f, 0x014a8b2f, 0x03df68b8, 0x01800ce2, 0x02ce9ad4, 0x0013689b}}, Y: Field{[10]uint32{0x01fae659, 0x037a427a, 0x029c73d3, 0x001b9ee8, 0x0061b0a8, 0x030f587d, 0x0210e2d1, 0x011aff31, 0x02637ab5, 0x003442d6}}}, + {X: Field{[10]uint32{0x018f4763, 0x03b71a7e, 0x0111129d, 0x0214479a, 0x03e9d955, 0x0286693d, 0x00d8eb16, 0x01023922, 0x026f53d2, 0x001b9887}}, Y: Field{[10]uint32{0x00ea1a19, 0x017f540f, 0x0048e4bb, 0x00b2d4b1, 0x007b945a, 0x00d0b1ef, 0x01ad4779, 0x02c4c4d0, 0x02f273e1, 0x001ec523}}}, + {X: Field{[10]uint32{0x038be83b, 0x01553549, 0x02ab6da4, 0x002a3c20, 0x0066bae2, 0x028e56a4, 0x017ea758, 0x01d1a66d, 0x03645bed, 0x003aebd5}}, Y: Field{[10]uint32{0x03cfbba7, 0x02ae782f, 0x02028650, 0x01298049, 0x02d91631, 0x0227b8f9, 0x029ea943, 0x00c0cd78, 0x00e06c65, 0x001611fd}}}, + {X: Field{[10]uint32{0x0310182f, 0x03fd8d4c, 0x0017a6a6, 0x028450e3, 0x02faa38c, 0x014ac574, 0x0355dbf0, 0x018cb492, 0x0271711b, 0x00303e22}}, Y: Field{[10]uint32{0x010676ff, 0x027913b3, 0x012481c5, 0x02605069, 0x03fb2e98, 0x002020be, 0x0211eec4, 0x01c08619, 0x014d16c0, 0x000b2feb}}}, + {X: Field{[10]uint32{0x035c6350, 0x00a1ec16, 0x00ae01b5, 0x02dcf3dc, 0x02dc1cdd, 0x018a48b1, 0x0244fbf2, 0x02526318, 0x001884b7, 0x001766db}}, Y: Field{[10]uint32{0x017fdf1d, 0x0144431f, 0x0297e5e8, 0x02316dab, 0x0118db17, 0x02d53321, 0x03e1644b, 0x0058b12a, 0x031d2f2b, 0x000ca3a0}}}, + {X: Field{[10]uint32{0x0202e21c, 0x03127c13, 0x00016654, 0x02555641, 0x03e57d75, 0x008e94ed, 0x03214c63, 0x01b9a753, 0x020f37ed, 0x0034744d}}, Y: Field{[10]uint32{0x01d15e4e, 0x007ce51b, 0x02b6a152, 0x0351b248, 0x006eba68, 0x002a2c40, 0x01594144, 0x02d4fe51, 0x0293c6c9, 0x00189fba}}}, + {X: Field{[10]uint32{0x02411731, 0x01a732fb, 0x00703e49, 0x020d959d, 0x02ace29a, 0x01ec6cac, 0x02cfa189, 0x00ebd562, 0x03cbf102, 0x003bf261}}, Y: Field{[10]uint32{0x01740c69, 0x026f10bd, 0x01dbbe15, 0x03f27d59, 0x02e38242, 0x02f3bd0c, 0x02429863, 0x002fb1c5, 0x0265d379, 0x0006569a}}}, + {X: Field{[10]uint32{0x00284ff0, 0x0243ea86, 0x02b01310, 0x01ee0fbd, 0x00968d1d, 0x00e19120, 0x0388b787, 0x03cef586, 0x0397163d, 0x003cc09a}}, Y: Field{[10]uint32{0x0211509b, 0x015ab06d, 0x030e9a6c, 0x01321359, 0x035f8764, 0x0167c1bf, 0x0281615d, 0x018eaefc, 0x02616823, 0x0005df0e}}}, + {X: Field{[10]uint32{0x002c5873, 0x0082435a, 0x0030b562, 0x03e5a3fe, 0x020deeec, 0x03273fd1, 0x02c92c68, 0x016da64a, 0x035f123b, 0x00174d3f}}, Y: Field{[10]uint32{0x01955ac8, 0x02d989b1, 0x02ff3d49, 0x03ea03e2, 0x0025443e, 0x023ac586, 0x0204df14, 0x0281950c, 0x039c8eab, 0x000b4682}}}, + {X: Field{[10]uint32{0x028447f4, 0x019ca011, 0x030bbdac, 0x0074c6a6, 0x00e0ee59, 0x010c2332, 0x01da0658, 0x01491f0e, 0x021794a9, 0x0032fe6e}}, Y: Field{[10]uint32{0x00461736, 0x009e5ab4, 0x005381b8, 0x0075d3c0, 0x03405810, 0x00d044b4, 0x025fade9, 0x02ba8408, 0x00c310fe, 0x001526c6}}}, + {X: Field{[10]uint32{0x03dcd31f, 0x032b3531, 0x03a5379a, 0x02e0da35, 0x008e7747, 0x015e9cd1, 0x01982a6b, 0x00986efd, 0x01ba09e2, 0x0024825d}}, Y: Field{[10]uint32{0x00b46dbd, 0x039d8e2b, 0x03dcb434, 0x012f5516, 0x016367d2, 0x0255040c, 0x0221f5ae, 0x01543424, 0x010881af, 0x003a5781}}}, + {X: Field{[10]uint32{0x03eeca64, 0x033c4c81, 0x000ff33f, 0x0048ef06, 0x00391323, 0x02d3c974, 0x02cdce82, 0x02d57649, 0x02e46fdc, 0x002056ca}}, Y: Field{[10]uint32{0x01b8c971, 0x022d3f92, 0x01512c96, 0x021d57c9, 0x0199285b, 0x0194462e, 0x01e2e268, 0x018dd23c, 0x03c67d88, 0x0018bd8d}}}, + {X: Field{[10]uint32{0x03e0b16e, 0x00f1153d, 0x019260de, 0x0097688c, 0x0227ca80, 0x02934e1f, 0x02a86397, 0x0352e8c3, 0x02c28e28, 0x0006ee69}}, Y: Field{[10]uint32{0x00d7ab93, 0x03bf1277, 0x01a94f56, 0x0355040d, 0x03206349, 0x031f8051, 0x004265ea, 0x005c7206, 0x00165e32, 0x002832f0}}}, + {X: Field{[10]uint32{0x0268bc22, 0x00cdf1b6, 0x00c3d34d, 0x02e9e3ad, 0x019c05a4, 0x03789e3c, 0x019d29dd, 0x020faac2, 0x03fedffd, 0x001bc054}}, Y: Field{[10]uint32{0x03f0c626, 0x00147e79, 0x02f824d5, 0x019c3838, 0x039fc499, 0x0288c7ca, 0x00041d3a, 0x00fe167d, 0x000d3501, 0x00294cb4}}}, + {X: Field{[10]uint32{0x0320258a, 0x032dea46, 0x028552e9, 0x039b1b6b, 0x02ed23e5, 0x006fd556, 0x000d3847, 0x01de9034, 0x033b3bee, 0x000d153d}}, Y: Field{[10]uint32{0x00d18dde, 0x023e54b6, 0x0128f23a, 0x00e8fd03, 0x03992683, 0x01af7b70, 0x025bcaa0, 0x007a3cff, 0x0046cfdf, 0x0024b082}}}, + {X: Field{[10]uint32{0x030e9a86, 0x024c5f08, 0x01f02fc5, 0x021903b7, 0x001dfcf6, 0x0354a00c, 0x00c2616a, 0x01ad386e, 0x03c9a360, 0x000d9e01}}, Y: Field{[10]uint32{0x016ecae6, 0x012904b0, 0x01a14830, 0x00bc00a0, 0x03fdc4f9, 0x00902572, 0x01ba14c1, 0x03b39c0f, 0x032fa2bb, 0x0007c08f}}}, + {X: Field{[10]uint32{0x001af62b, 0x02965048, 0x00909acb, 0x0105d7f1, 0x0101b825, 0x03112e05, 0x034e06f0, 0x03dabc4d, 0x01c39891, 0x0023b13f}}, Y: Field{[10]uint32{0x034e5f1b, 0x015b3dfb, 0x01751137, 0x033d7f0a, 0x00fe067b, 0x00f1e63e, 0x01ca0e50, 0x03621e0f, 0x02e5cac2, 0x000b71b2}}}, + {X: Field{[10]uint32{0x0178a263, 0x026c1aa4, 0x03842872, 0x014546e2, 0x03ffa085, 0x017ea4df, 0x0142f91e, 0x0093e451, 0x026d4c5b, 0x00173092}}, Y: Field{[10]uint32{0x037da472, 0x027573fe, 0x00b98da1, 0x02a0f76f, 0x02ca8d55, 0x0067e87f, 0x0338a4e4, 0x00687efe, 0x02358153, 0x002c76a1}}}, + {X: Field{[10]uint32{0x03599e9f, 0x013f1378, 0x02a21913, 0x01414314, 0x0292602a, 0x02a04374, 0x0244a6cd, 0x00170ea5, 0x0126c039, 0x0020e416}}, Y: Field{[10]uint32{0x0246089a, 0x0038315e, 0x01e16cf2, 0x022c8767, 0x00909429, 0x02a0dd8e, 0x00b115ea, 0x019e4a88, 0x020fe8af, 0x0010a4c9}}}, + {X: Field{[10]uint32{0x0189b6c7, 0x02ca6159, 0x00822481, 0x0050d2b9, 0x02e8fa6c, 0x034e1e3e, 0x0204ac30, 0x03a777e0, 0x017e4721, 0x002512c2}}, Y: Field{[10]uint32{0x03d6ddf6, 0x03d2e5a6, 0x00e8ee8a, 0x013011d9, 0x011525bd, 0x039d16e6, 0x03796431, 0x02c257e2, 0x016530e9, 0x0017f11d}}}, + {X: Field{[10]uint32{0x0023b73d, 0x017aefcd, 0x0030107b, 0x00797ea4, 0x0117327a, 0x018e9ccc, 0x00aaf04a, 0x0304d387, 0x023fcfb7, 0x002ac2d2}}, Y: Field{[10]uint32{0x0296c9da, 0x00efc6b3, 0x00781376, 0x034de170, 0x02b84944, 0x02bb334e, 0x038c92cf, 0x02ea2b35, 0x0263a5bb, 0x003879e4}}}, + {X: Field{[10]uint32{0x03e8b85f, 0x00f7fb83, 0x010bcf80, 0x0361efc2, 0x031aa2c3, 0x0168b939, 0x03f7fbf0, 0x00ac3bde, 0x00b5220f, 0x0015e8d1}}, Y: Field{[10]uint32{0x01a7d04e, 0x0398e6ec, 0x00f10576, 0x00f059e3, 0x01a9e11a, 0x00e9caa5, 0x00c9f135, 0x02588392, 0x010e08ef, 0x003e0adf}}}, + {X: Field{[10]uint32{0x00d81ac5, 0x02498ff2, 0x0188da1a, 0x025bb118, 0x033608e3, 0x033c3d3f, 0x038c4c95, 0x01f13147, 0x021a800b, 0x001b814f}}, Y: Field{[10]uint32{0x015e7473, 0x0363124e, 0x03dbadc3, 0x01e5c80b, 0x0362e365, 0x03390a30, 0x035384ff, 0x008f2786, 0x0298e3c8, 0x00218e27}}}, + {X: Field{[10]uint32{0x02485cb7, 0x03ab8973, 0x03f1c59d, 0x03b1fc20, 0x0148a289, 0x0159ed51, 0x00d4a7c7, 0x01c5fecc, 0x00061804, 0x0018b5d9}}, Y: Field{[10]uint32{0x0268be84, 0x03f2506d, 0x020fc4ca, 0x00b6989a, 0x03d1509b, 0x011c3ed4, 0x031d57b9, 0x007e3614, 0x014b661d, 0x003c758c}}}, + {X: Field{[10]uint32{0x0129250f, 0x011fcc77, 0x006589e3, 0x00020b4d, 0x025c4d08, 0x02f49126, 0x00cf1080, 0x02caaa0c, 0x00f2219f, 0x003976ca}}, Y: Field{[10]uint32{0x008bd453, 0x023f9a22, 0x00b248e5, 0x034bcd7e, 0x03324fcf, 0x02b512db, 0x03b7012e, 0x01f756e8, 0x024632f9, 0x0030a5b9}}}, + {X: Field{[10]uint32{0x01b32729, 0x02057c42, 0x00ab23fe, 0x026f0a65, 0x03733ec8, 0x03ffe0c7, 0x013177c9, 0x00379229, 0x03e9a3d0, 0x0011c96c}}, Y: Field{[10]uint32{0x01f8e778, 0x0279a26e, 0x02e12d4a, 0x0334a5e7, 0x02324127, 0x0120aed4, 0x01fdb741, 0x03003c51, 0x0347de38, 0x002b0edd}}}, + {X: Field{[10]uint32{0x01d72b3e, 0x0278d190, 0x00569bbe, 0x017a9db8, 0x03b036b6, 0x0004f8d1, 0x00ed9187, 0x01cb9ce5, 0x03b6492c, 0x003434eb}}, Y: Field{[10]uint32{0x0202fef3, 0x010bede3, 0x03f1396f, 0x002c0bd8, 0x00bd952b, 0x0028a158, 0x0061caa0, 0x03f81d4c, 0x005b94aa, 0x000b74e9}}}, + {X: Field{[10]uint32{0x0304632c, 0x0241a3f0, 0x00b4c786, 0x03b73d2d, 0x03104143, 0x0092b3fc, 0x0385654a, 0x03215e5e, 0x0335d717, 0x001e14f9}}, Y: Field{[10]uint32{0x021efadd, 0x00d4d577, 0x00e69cb5, 0x0068524e, 0x02bae3a3, 0x01680a48, 0x0377a8fb, 0x03452b09, 0x03d9e70f, 0x00002a1c}}}, + {X: Field{[10]uint32{0x02e904a4, 0x02778ce3, 0x032ca778, 0x0325fe75, 0x02ee44e2, 0x013248d5, 0x021a01a1, 0x0371644e, 0x02b37d4f, 0x0001b6c9}}, Y: Field{[10]uint32{0x031941fb, 0x00a2ba58, 0x01b6854a, 0x02498e1a, 0x02d8adf7, 0x02612712, 0x001c409e, 0x028330a3, 0x0225bf2b, 0x00053f88}}}, + {X: Field{[10]uint32{0x032848df, 0x028bbe3a, 0x00ce699a, 0x003d8ea7, 0x02538e40, 0x01a7e90f, 0x02f7f5c6, 0x02bcf02c, 0x0069bb98, 0x002d4bc2}}, Y: Field{[10]uint32{0x0107be5a, 0x005b85e2, 0x03858bb6, 0x02329dbe, 0x028b821c, 0x00395eda, 0x03378cca, 0x01152b9e, 0x032455bc, 0x0009159a}}}, + {X: Field{[10]uint32{0x0197b448, 0x007e4e80, 0x037e4c1e, 0x03004e13, 0x03234152, 0x01c3e9f0, 0x034a9e99, 0x02bc0fac, 0x01e11ee6, 0x00218537}}, Y: Field{[10]uint32{0x0372f3cc, 0x0134f31e, 0x02ba15e5, 0x015762e9, 0x024e5c7e, 0x008c3103, 0x0222b5ad, 0x01a1c0ae, 0x01a2ac99, 0x000a8449}}}, + {X: Field{[10]uint32{0x038c1cfa, 0x00824de4, 0x00ab2dbc, 0x03ad6743, 0x008b3308, 0x03c82f74, 0x0271c180, 0x01b96de3, 0x03ae625f, 0x00260a8d}}, Y: Field{[10]uint32{0x02a40d0c, 0x014c26ad, 0x017dc18e, 0x00af75b1, 0x032a689e, 0x02d41c2f, 0x01249e20, 0x0144a164, 0x016f00a6, 0x0019c7f8}}}, + {X: Field{[10]uint32{0x003e703a, 0x0068bf53, 0x01d9b408, 0x02bc8b2a, 0x00627a09, 0x0248c700, 0x019742fc, 0x020a73b2, 0x030526b4, 0x001afaa4}}, Y: Field{[10]uint32{0x019a6cc1, 0x00ac1652, 0x014832b0, 0x0043116f, 0x01d7541f, 0x00650f9a, 0x0344d14b, 0x01ed307c, 0x002a5451, 0x002bb150}}}, + {X: Field{[10]uint32{0x02583edb, 0x01ef4a65, 0x019200ba, 0x026481cc, 0x0054016a, 0x01b445ac, 0x00188b33, 0x0121f9f3, 0x03818694, 0x002d5c91}}, Y: Field{[10]uint32{0x03845cdc, 0x03d8a19d, 0x03ec6208, 0x02ced35f, 0x011d278f, 0x02f163ff, 0x018262de, 0x0292f4f5, 0x01861f80, 0x00172ef4}}}, + {X: Field{[10]uint32{0x017c5412, 0x03a78b66, 0x01bb62e0, 0x00d1c13b, 0x024df5a5, 0x022b14e4, 0x02f4f531, 0x003a45e1, 0x02627ba0, 0x003786b7}}, Y: Field{[10]uint32{0x022021e0, 0x03fba76b, 0x01a8e4bf, 0x039b8742, 0x03a9d003, 0x007019cf, 0x02dc15a4, 0x00efeff1, 0x02c50bf2, 0x001fbd21}}}, + {X: Field{[10]uint32{0x0398c0a0, 0x01b4dbcc, 0x0166dd47, 0x0262f004, 0x03337203, 0x02e03875, 0x01e465df, 0x0071067e, 0x017cb172, 0x000dce29}}, Y: Field{[10]uint32{0x030c22f5, 0x01529e2d, 0x00bfd118, 0x01b14a49, 0x0243df56, 0x03610e16, 0x028a629a, 0x02c5b5b4, 0x03b21662, 0x00387c96}}}, + {X: Field{[10]uint32{0x0281885d, 0x00001b9e, 0x02e37694, 0x02e2dd40, 0x021955fe, 0x0377db6a, 0x01575f12, 0x0048e6a1, 0x01c16b2a, 0x00132b88}}, Y: Field{[10]uint32{0x00dc99c3, 0x03d5972d, 0x019e237a, 0x026ca755, 0x0225fa2c, 0x020a0cac, 0x0271e89c, 0x0183609d, 0x00553886, 0x000abffa}}}, + {X: Field{[10]uint32{0x00c2bd7b, 0x00bebe37, 0x02039573, 0x03b86ea9, 0x0397bfa7, 0x016f30e9, 0x037cf558, 0x002f8db8, 0x021fba8a, 0x00131446}}, Y: Field{[10]uint32{0x025651af, 0x029172ac, 0x0372d8a6, 0x01a621f0, 0x03abb272, 0x02575a0c, 0x0000fd4a, 0x02affc8d, 0x03945c6b, 0x003a9a7d}}}, + {X: Field{[10]uint32{0x005a7e29, 0x0145e79d, 0x01f8320c, 0x012cae94, 0x02c2e4a4, 0x03a4db02, 0x007c25ad, 0x010dc098, 0x00c4323b, 0x00360476}}, Y: Field{[10]uint32{0x03c05345, 0x037652b9, 0x0293c3c4, 0x00fda7e7, 0x0346c6df, 0x02d2438e, 0x020aeabc, 0x011fe036, 0x00a217bf, 0x001bfe5c}}}, + {X: Field{[10]uint32{0x02c43eee, 0x03897985, 0x01b0b1ca, 0x02b87ec2, 0x0233db68, 0x004ed7fe, 0x01bbafdf, 0x02abff8e, 0x01d3b5e5, 0x000407ad}}, Y: Field{[10]uint32{0x02c5ddb3, 0x00698eae, 0x00f4a163, 0x00e4d383, 0x00a49709, 0x02c0c483, 0x03a1c96e, 0x01c96981, 0x01149867, 0x00275a95}}}, + {X: Field{[10]uint32{0x02480519, 0x0073e2dc, 0x03968de2, 0x01c3bfe3, 0x01ecdc7f, 0x018bfab4, 0x001f21f0, 0x03917f85, 0x0152b8dd, 0x00227ac4}}, Y: Field{[10]uint32{0x0297b447, 0x036c1f2d, 0x0195b41f, 0x02a18fef, 0x00cb6703, 0x00af11dc, 0x02c99d7f, 0x038f55a7, 0x03c43181, 0x003e28cd}}}, + {X: Field{[10]uint32{0x02d0dc16, 0x03a59366, 0x030cdbd1, 0x03ada379, 0x0149d95e, 0x0154066a, 0x03d8f1e4, 0x0291349c, 0x03f3f48e, 0x0014f58c}}, Y: Field{[10]uint32{0x011645fe, 0x03f4cef3, 0x023af48f, 0x03b923f9, 0x028e8ff4, 0x039b6df9, 0x03fe6f32, 0x033c6cfd, 0x0176964d, 0x0006c9bb}}}, + {X: Field{[10]uint32{0x00d9be6a, 0x023e57f6, 0x02d1a92f, 0x012e0e62, 0x006ce3db, 0x0273b6d9, 0x0294d26b, 0x00441966, 0x01104989, 0x0037841a}}, Y: Field{[10]uint32{0x02b43d32, 0x03644cd7, 0x03e7b5b9, 0x039b73e0, 0x008768a4, 0x008f5022, 0x00a3d06d, 0x0274595e, 0x0341dbd9, 0x0021d902}}}, + {X: Field{[10]uint32{0x02f5bea2, 0x005dcf1a, 0x023caf76, 0x01ed0685, 0x00cc6daa, 0x02027684, 0x0189a9a7, 0x038916b0, 0x026f0b9e, 0x00103b47}}, Y: Field{[10]uint32{0x00217b2e, 0x0330787f, 0x03adb50b, 0x00ba9c65, 0x0082bae8, 0x010c2b01, 0x02b7bdf1, 0x03ee69e3, 0x01017298, 0x003ffb45}}}, + {X: Field{[10]uint32{0x03ba15c1, 0x0046f599, 0x02dfaa3b, 0x028ca7c9, 0x001b7ab3, 0x03a94a73, 0x004d1719, 0x002e68de, 0x02ee59a2, 0x00157eaa}}, Y: Field{[10]uint32{0x002f4a65, 0x014f77c6, 0x0075c373, 0x00169f95, 0x000d7f28, 0x0391c197, 0x014771d8, 0x014f8d7b, 0x039b52ac, 0x002a7e24}}}, + {X: Field{[10]uint32{0x028af3fb, 0x02f40afe, 0x03ccba53, 0x001fc0d3, 0x00a95ac6, 0x01255b44, 0x000ca172, 0x0222bc86, 0x024e21cf, 0x002d4779}}, Y: Field{[10]uint32{0x03b7f81e, 0x02ce1b00, 0x01ac4878, 0x0066922c, 0x029b8400, 0x0399b129, 0x0399f1f6, 0x00bafd1a, 0x03701c65, 0x0005d766}}}, + {X: Field{[10]uint32{0x0307b143, 0x03e65ede, 0x00171556, 0x03a3361d, 0x007b8927, 0x00d9f3d0, 0x03235be9, 0x007a092e, 0x00dcbcd9, 0x001455ac}}, Y: Field{[10]uint32{0x00cc91dc, 0x03d2fe08, 0x018dec2a, 0x02432ec3, 0x01d40ada, 0x0049c05b, 0x01ded191, 0x0130ff99, 0x000fa29d, 0x0007515f}}}, + {X: Field{[10]uint32{0x016dd63d, 0x00476382, 0x02bcd00e, 0x0019e46d, 0x03f1993c, 0x02391069, 0x01fac558, 0x0125cc58, 0x0172060b, 0x000efd47}}, Y: Field{[10]uint32{0x00722d49, 0x02ba293d, 0x0312663e, 0x038abdd3, 0x0173e1e4, 0x03da6126, 0x023905dd, 0x02bf6ff1, 0x007090a7, 0x001ef1ad}}}, + {X: Field{[10]uint32{0x02d61fe5, 0x036dec26, 0x0205ad76, 0x03193eab, 0x0122fa74, 0x029bcb68, 0x014f4d3b, 0x02040845, 0x00912008, 0x0034a5c4}}, Y: Field{[10]uint32{0x028e3fc8, 0x0123dad8, 0x00156926, 0x01cd954a, 0x02bc33cb, 0x014708f0, 0x000cc141, 0x03cf23e5, 0x03aaf2cc, 0x001cd43a}}}, + {X: Field{[10]uint32{0x0368013d, 0x02d82a71, 0x0126c559, 0x01f88d05, 0x036d7a3b, 0x007ff4c2, 0x015a5202, 0x0044be89, 0x03ca8e17, 0x0030bb91}}, Y: Field{[10]uint32{0x03ece448, 0x0014058a, 0x0031a453, 0x002080a6, 0x0280d9ff, 0x036cec8e, 0x008e83be, 0x01fd6c77, 0x036bd83b, 0x000b9ba2}}}, + {X: Field{[10]uint32{0x0270b6cf, 0x016b6f4f, 0x03aaae47, 0x012d5876, 0x00c5ef44, 0x01b31300, 0x00da39e9, 0x03383678, 0x00d69ddc, 0x00156666}}, Y: Field{[10]uint32{0x00ffb328, 0x014d308d, 0x03ac525c, 0x01cc6bcb, 0x00cf0f31, 0x02d34879, 0x02b5e8cd, 0x03b96e37, 0x020095ae, 0x0031270a}}}, + {X: Field{[10]uint32{0x03baf363, 0x0152405a, 0x032f9e9d, 0x03764372, 0x017c1955, 0x01c86a63, 0x01305c39, 0x02eb7791, 0x02c3e4c8, 0x0012d2c0}}, Y: Field{[10]uint32{0x00d43468, 0x01a178c6, 0x00fb925b, 0x0191856f, 0x01d22a6a, 0x00f70c13, 0x01d546e0, 0x0166cf09, 0x037ebe8f, 0x00282d9e}}}, + {X: Field{[10]uint32{0x02c549c5, 0x01f74b2a, 0x0101fe0d, 0x03a3b87b, 0x007650ad, 0x0350a25f, 0x00f897c5, 0x02d09d47, 0x03fd7836, 0x003eebf9}}, Y: Field{[10]uint32{0x02668436, 0x00044384, 0x03aeb5e7, 0x00a26914, 0x01229a7e, 0x03b69489, 0x03841f58, 0x01f945ed, 0x014352d0, 0x000bd446}}}, + {X: Field{[10]uint32{0x0076c06c, 0x03786d9c, 0x0219f954, 0x0340a92c, 0x0281b21b, 0x01ceb139, 0x004e620b, 0x02e281e2, 0x02f90c65, 0x003334c1}}, Y: Field{[10]uint32{0x0257510b, 0x017d6c55, 0x005668ab, 0x029d6932, 0x00003f68, 0x00f8115d, 0x03056dc7, 0x02d43241, 0x007fa7b0, 0x00208fe9}}}, + {X: Field{[10]uint32{0x00195a3b, 0x02e35586, 0x01980820, 0x0177626a, 0x01912415, 0x0211d14b, 0x01a870a7, 0x01a474ed, 0x0038995a, 0x002ebef6}}, Y: Field{[10]uint32{0x00ad92a3, 0x024f9f42, 0x006874e8, 0x03560e72, 0x004f05f4, 0x00082d6c, 0x00e7f521, 0x00a7bbec, 0x01fac948, 0x00237d32}}}, + {X: Field{[10]uint32{0x024f458f, 0x0330e008, 0x019fb157, 0x00dee1a4, 0x00713d8f, 0x03e50299, 0x0166af8f, 0x0055b828, 0x003a8073, 0x00344973}}, Y: Field{[10]uint32{0x0035abde, 0x013b2f2f, 0x012a3a03, 0x00bbc981, 0x021bb7a2, 0x0288e9e3, 0x001054ae, 0x00de9f7c, 0x00b6ac4e, 0x00280c3a}}}, + {X: Field{[10]uint32{0x038187c2, 0x03c9e3b2, 0x008668cb, 0x03f629fa, 0x01f2d1bb, 0x0388b90b, 0x02c6433b, 0x036aebbc, 0x03281b5d, 0x001f5247}}, Y: Field{[10]uint32{0x00dfe8ed, 0x009ee9bd, 0x02af9bea, 0x031faf20, 0x0228b040, 0x01d82cbf, 0x0381ea3f, 0x00259b28, 0x021d7036, 0x00328605}}}, + {X: Field{[10]uint32{0x01f8c39e, 0x017c1ef3, 0x03961601, 0x025541e6, 0x016d70a5, 0x02a7d25e, 0x002995c6, 0x0048ea1b, 0x02339f29, 0x000c7336}}, Y: Field{[10]uint32{0x00b49f65, 0x030b93fa, 0x03a19561, 0x02c2f201, 0x02376626, 0x0018347c, 0x0128a9ff, 0x007eb265, 0x010bedf6, 0x002bac9f}}}, + {X: Field{[10]uint32{0x017807ba, 0x00e7d28a, 0x01ba7d74, 0x00bc3784, 0x01e5ec91, 0x006ddbec, 0x012073e7, 0x024625b2, 0x00c7f45f, 0x0001e799}}, Y: Field{[10]uint32{0x0023c921, 0x0177b5d6, 0x02e7efe8, 0x02f3258c, 0x00d17685, 0x0097626d, 0x011abe38, 0x0258f162, 0x0036b354, 0x0015f64d}}}, + {X: Field{[10]uint32{0x0042274e, 0x00c7daa3, 0x0206c78a, 0x034b7af3, 0x0369f422, 0x002f690f, 0x02f057b6, 0x00e1a1c7, 0x02dffccb, 0x003588cb}}, Y: Field{[10]uint32{0x000ef826, 0x0331f5fb, 0x004d6d62, 0x018eb0f7, 0x0158a18f, 0x026d7df4, 0x03472f22, 0x038274db, 0x03a0b2e2, 0x0004f6bb}}}, + {X: Field{[10]uint32{0x006e368e, 0x02ed99d1, 0x03ea6a7e, 0x0349228c, 0x00722d78, 0x020a2516, 0x038fc00c, 0x038e94dc, 0x0298b2d6, 0x0008703c}}, Y: Field{[10]uint32{0x03062383, 0x019837f7, 0x034a2b20, 0x016b97cc, 0x02cbb3f2, 0x017695a7, 0x015eede1, 0x03f656e2, 0x03ec17d2, 0x00219d54}}}, + {X: Field{[10]uint32{0x003196c8, 0x00b2bb93, 0x031d0f4f, 0x0070ff66, 0x00eaa231, 0x013dd1c8, 0x011621c5, 0x03de6755, 0x01010dcb, 0x0007468f}}, Y: Field{[10]uint32{0x039734eb, 0x03ebab90, 0x0233d6f8, 0x00701f97, 0x005453bf, 0x00e51763, 0x01b1a301, 0x03e4321e, 0x01159900, 0x003569e8}}}, + {X: Field{[10]uint32{0x00e76735, 0x02ec770a, 0x025614f4, 0x0171dd4e, 0x0162e26d, 0x0160a854, 0x00a97d18, 0x027b7803, 0x02808fa9, 0x0015d221}}, Y: Field{[10]uint32{0x03c17c6f, 0x02876e4b, 0x02b1eeba, 0x00d2576c, 0x00b3bbee, 0x03b06925, 0x000ecc54, 0x03b78373, 0x00597117, 0x0037af6a}}}, + {X: Field{[10]uint32{0x0391715a, 0x03eb7225, 0x0207c9f6, 0x034c7073, 0x03607194, 0x0322f7a7, 0x01e820c4, 0x037fe938, 0x00d34ce1, 0x002db74d}}, Y: Field{[10]uint32{0x0239cc9d, 0x02194862, 0x03200717, 0x0150e810, 0x031487e5, 0x0126f1f3, 0x01c0ec90, 0x0354ccab, 0x0068e405, 0x0022fd22}}}, + {X: Field{[10]uint32{0x0291d0de, 0x01412f52, 0x031600f3, 0x01b27882, 0x035821df, 0x0148b7e6, 0x02bc8871, 0x021dcb28, 0x02d56908, 0x00243e77}}, Y: Field{[10]uint32{0x02f902ac, 0x03ae9dba, 0x017f9a2b, 0x006c498e, 0x01f76b3c, 0x011250ce, 0x010af26b, 0x0129bbf7, 0x024add53, 0x000345f9}}}, + {X: Field{[10]uint32{0x032cfa59, 0x02b3195a, 0x0299d260, 0x00e66c40, 0x03db07b2, 0x00c00a1c, 0x006e4a0c, 0x024d4e44, 0x00e858d1, 0x003157cd}}, Y: Field{[10]uint32{0x00e50f5b, 0x0058b78c, 0x00dda11f, 0x03ef05ae, 0x009a8fe1, 0x00b3becd, 0x0149f7fe, 0x0288b9ca, 0x00d474b5, 0x001f67ce}}}, + {X: Field{[10]uint32{0x02b8ecad, 0x03c5c895, 0x025750c5, 0x034adbd4, 0x03f39c16, 0x0128ad89, 0x03f8452c, 0x0207166c, 0x0192d389, 0x001ab910}}, Y: Field{[10]uint32{0x030b099d, 0x0365c55f, 0x02d61603, 0x0073b69a, 0x03fa61de, 0x00e3925c, 0x01c4b91e, 0x00812a7b, 0x00dd7c49, 0x0026eeea}}}, + {X: Field{[10]uint32{0x03dcffbc, 0x0113bbdb, 0x0379ae03, 0x007db362, 0x00bd0c25, 0x02ad9113, 0x013ad99e, 0x006cd9aa, 0x0239423e, 0x000ce9f5}}, Y: Field{[10]uint32{0x0011c61e, 0x021b8ee5, 0x002c02bb, 0x024756eb, 0x032f0678, 0x027b48b4, 0x012684fc, 0x0328abe9, 0x02cc006d, 0x00309844}}}, + {X: Field{[10]uint32{0x0159af0a, 0x010351fc, 0x024b2ea6, 0x03643d4a, 0x013380c1, 0x01db29b1, 0x03a6642a, 0x0219c0a3, 0x0331eac4, 0x001211c4}}, Y: Field{[10]uint32{0x00142704, 0x021b51e8, 0x0314d5b5, 0x0251c169, 0x01c5047b, 0x022ed87d, 0x0103a311, 0x038073ee, 0x014693fd, 0x002d3aa1}}}, + {X: Field{[10]uint32{0x02587917, 0x0004a970, 0x00e86d46, 0x01e6fae3, 0x0172defd, 0x00f492dc, 0x03faab74, 0x00c70133, 0x00399ae7, 0x0001596b}}, Y: Field{[10]uint32{0x00bbab48, 0x000a6066, 0x000d779c, 0x0227f53d, 0x02146649, 0x0026a591, 0x0011fece, 0x00c7abf1, 0x02a5d450, 0x0037ad5a}}}, + {X: Field{[10]uint32{0x00314c0b, 0x01c21726, 0x03773eaa, 0x0251b72f, 0x00995490, 0x03168cbf, 0x00d017d0, 0x00adf5aa, 0x00b53b6c, 0x0025920e}}, Y: Field{[10]uint32{0x01130b97, 0x03e717bf, 0x02a2f6ca, 0x027be810, 0x03ac6fdc, 0x039daf5d, 0x0271ee0e, 0x000d3f22, 0x033cec44, 0x000b6be7}}}, + {X: Field{[10]uint32{0x00eb88d5, 0x038bc7b1, 0x0087c4aa, 0x00340bbe, 0x006f9bff, 0x039522c5, 0x003522da, 0x001e2e76, 0x02907b8d, 0x002f0036}}, Y: Field{[10]uint32{0x00ddb152, 0x03856908, 0x02befeaf, 0x01fed066, 0x020fef4d, 0x0132ca7d, 0x0321dd13, 0x036dcd97, 0x0111f9e2, 0x001af43f}}}, + {X: Field{[10]uint32{0x03a7bea4, 0x01156af6, 0x0111d075, 0x02cc9fec, 0x00a2082b, 0x03d79543, 0x03dd8ae9, 0x027c33c4, 0x005500f8, 0x0006967e}}, Y: Field{[10]uint32{0x0200c823, 0x0321c29d, 0x035c2150, 0x01db8b90, 0x00e77e6e, 0x02997142, 0x0225c530, 0x02b7ff27, 0x0340d460, 0x001fa8be}}}, + {X: Field{[10]uint32{0x02ccc764, 0x01662953, 0x02fdad88, 0x028c9e69, 0x00452706, 0x015a5409, 0x01081624, 0x03f1ab51, 0x011bd3bf, 0x001e8ed8}}, Y: Field{[10]uint32{0x02233145, 0x0286b48c, 0x030d368a, 0x035a875c, 0x0283d30b, 0x015274ea, 0x033d6efe, 0x01b94b21, 0x01896806, 0x0005b825}}}, + {X: Field{[10]uint32{0x015d6d91, 0x01786dc0, 0x02bef4cd, 0x00a14444, 0x02a0a1cc, 0x0315b89e, 0x02fa95b5, 0x002969e1, 0x01779cbe, 0x000bfb55}}, Y: Field{[10]uint32{0x014bddfa, 0x02751b8b, 0x02637995, 0x0399bf97, 0x02f66fd3, 0x01b71942, 0x01691fa3, 0x01fed58f, 0x0027b229, 0x001fbab3}}}, + {X: Field{[10]uint32{0x034a9558, 0x0152835d, 0x02d02f01, 0x0377c6cd, 0x03018326, 0x02faed12, 0x03efaea6, 0x037d959c, 0x0217952e, 0x00099eb4}}, Y: Field{[10]uint32{0x01a13fef, 0x01456ec4, 0x01e6d907, 0x02de8121, 0x01703cc9, 0x02fd5280, 0x00a7b330, 0x017979a2, 0x00c07e9d, 0x001dd64f}}}, + {X: Field{[10]uint32{0x036687e8, 0x0017b85f, 0x02b106fa, 0x006f29fa, 0x010e0d34, 0x017cc851, 0x038cceca, 0x026721a5, 0x022c239b, 0x003adbb5}}, Y: Field{[10]uint32{0x02c0a241, 0x027eff14, 0x0133b662, 0x02e24187, 0x012a6e6a, 0x00eb61d5, 0x029b2258, 0x02a3a338, 0x022250f6, 0x002b6267}}}, + {X: Field{[10]uint32{0x030a9e5b, 0x00425350, 0x027b1089, 0x026fe232, 0x035087a5, 0x005a1b13, 0x00ef33c4, 0x00853c2d, 0x017ce03d, 0x0032973c}}, Y: Field{[10]uint32{0x00989ce9, 0x018eb4f4, 0x0003ef99, 0x0201c95e, 0x01e19351, 0x023a80a6, 0x03ae683c, 0x01d6eb3f, 0x02eb473f, 0x0005f913}}}, + {X: Field{[10]uint32{0x01e82f7c, 0x01c85794, 0x03a2fe4c, 0x033d1988, 0x00c82f21, 0x024f9adb, 0x03035eca, 0x0190b98f, 0x029cacf0, 0x00131ef0}}, Y: Field{[10]uint32{0x02776875, 0x034af8a0, 0x01322e59, 0x03903c7d, 0x03eb537b, 0x0102900a, 0x03f64e7e, 0x01e5b050, 0x036e8756, 0x001f1579}}}, + {X: Field{[10]uint32{0x031058e3, 0x0186f0d9, 0x03d2080b, 0x02108e27, 0x03797831, 0x02b3d375, 0x03e50130, 0x0227c140, 0x00e9b422, 0x0015f2ae}}, Y: Field{[10]uint32{0x03d9e2bc, 0x0262aaa7, 0x012ca7c3, 0x011650c3, 0x022b048c, 0x01cba6fb, 0x030b884e, 0x009cf69e, 0x03186671, 0x001e0894}}}, + {X: Field{[10]uint32{0x03c4823e, 0x03d8c426, 0x02c2753f, 0x01cbb4b9, 0x01abf3d2, 0x015a10fd, 0x0013a82a, 0x0030d37a, 0x023df112, 0x000f0afc}}, Y: Field{[10]uint32{0x013f1990, 0x03add64b, 0x029d0d08, 0x00a384bf, 0x00767409, 0x032772e2, 0x00c5b47e, 0x0348cf38, 0x036388ae, 0x0005d676}}}, + {X: Field{[10]uint32{0x02ab38d2, 0x0206c683, 0x02856d85, 0x0288a34d, 0x0234170a, 0x0373f774, 0x03348dc3, 0x01d0a834, 0x01ac83e0, 0x0030042a}}, Y: Field{[10]uint32{0x0076aafd, 0x009da10f, 0x038ea9cd, 0x004111ad, 0x002b2dc8, 0x02433e48, 0x031da1f1, 0x029a3f87, 0x03ed0644, 0x0018d325}}}, + {X: Field{[10]uint32{0x02071994, 0x01164ea4, 0x01660550, 0x00fee8ea, 0x014f1b77, 0x00f6722a, 0x00cb632b, 0x0291a039, 0x01ee548b, 0x00292af6}}, Y: Field{[10]uint32{0x00f87182, 0x017a3bf2, 0x00b6111b, 0x0123afff, 0x01c9390b, 0x0100d597, 0x02ab00a8, 0x00ca5ff1, 0x026aba26, 0x000e8509}}}, + {X: Field{[10]uint32{0x00dda172, 0x028ccf7a, 0x007115a7, 0x039666de, 0x01d68b82, 0x03b3bff9, 0x0008540d, 0x0057c717, 0x0052efc1, 0x003700b2}}, Y: Field{[10]uint32{0x036c29c6, 0x01febd57, 0x009ba236, 0x03732e15, 0x028a35f8, 0x023332a8, 0x03f4eaed, 0x03a10b29, 0x013a8e1a, 0x00393996}}}, + {X: Field{[10]uint32{0x01ec57c8, 0x036d68a4, 0x01cac1b6, 0x0205c85d, 0x000a54fc, 0x03ca7f5f, 0x00a5a4b5, 0x008bff0a, 0x01e82238, 0x003b91da}}, Y: Field{[10]uint32{0x0020385f, 0x004ff9b0, 0x00619384, 0x0050a025, 0x00338905, 0x02c05631, 0x0178b9a2, 0x0323ae82, 0x02bc4076, 0x003f28b1}}}, + {X: Field{[10]uint32{0x013ef066, 0x0349c9f6, 0x032abb11, 0x033cc493, 0x002cf990, 0x03c2230e, 0x035a6dec, 0x00303f50, 0x001d3491, 0x003cc01b}}, Y: Field{[10]uint32{0x0149eae2, 0x00da4132, 0x00d9b82d, 0x01b2237f, 0x03f8016a, 0x00d73c99, 0x01ebaf12, 0x01fd468a, 0x01f5aa36, 0x00001d8a}}}, + {X: Field{[10]uint32{0x027313b7, 0x02e4d5c7, 0x030f3794, 0x001124cb, 0x02b1b9c8, 0x00970ff5, 0x01f0a3e3, 0x0159a44a, 0x003d07bf, 0x001f3ec8}}, Y: Field{[10]uint32{0x002bc60f, 0x0116ed3a, 0x02d3982a, 0x03f99c60, 0x01e4ae08, 0x021ec05b, 0x00c42173, 0x0270e322, 0x01fd2433, 0x0013ddae}}}, + {X: Field{[10]uint32{0x02312c0a, 0x01343acc, 0x03206a32, 0x01c60eba, 0x01efeabe, 0x01c1156b, 0x0130be8e, 0x00264c27, 0x00e036e0, 0x0003328f}}, Y: Field{[10]uint32{0x0215b9e5, 0x035fa345, 0x018b20ef, 0x03766369, 0x0091b437, 0x00163223, 0x00637252, 0x01f1b4d3, 0x0258fe94, 0x00259d2b}}}, + {X: Field{[10]uint32{0x02b0d9c8, 0x02b39982, 0x01212c66, 0x03488e27, 0x01d9815f, 0x007e635c, 0x01a071c0, 0x01709e0b, 0x014881cd, 0x0027ed90}}, Y: Field{[10]uint32{0x01813251, 0x00f04fb4, 0x0309bce2, 0x011e71da, 0x03d11d50, 0x0013c71c, 0x035e515c, 0x00dd097d, 0x00541a51, 0x00013095}}}, + {X: Field{[10]uint32{0x01558b25, 0x001c2d94, 0x01542c2c, 0x03601aa8, 0x01eb5d2a, 0x009582d3, 0x0139de23, 0x03516443, 0x02bf03e3, 0x000076ef}}, Y: Field{[10]uint32{0x010b9db1, 0x02e739cb, 0x01876877, 0x0145a60c, 0x01940eae, 0x01d21328, 0x014753fd, 0x03924106, 0x031c2e94, 0x003b1a39}}}, + {X: Field{[10]uint32{0x006bb5f7, 0x00428fe9, 0x01e215a2, 0x03a49061, 0x015a890e, 0x01321350, 0x002856b0, 0x01d085dd, 0x021992f4, 0x001dd474}}, Y: Field{[10]uint32{0x03237fef, 0x00f19206, 0x01a2273a, 0x028532b1, 0x036371f6, 0x03da6305, 0x01327493, 0x0321b3b7, 0x01c5b770, 0x000a456a}}}, + {X: Field{[10]uint32{0x00f36a2d, 0x025ff2bb, 0x01737707, 0x02593847, 0x01e7b89c, 0x033d992c, 0x0382983e, 0x0270f881, 0x01a05b18, 0x000e6a12}}, Y: Field{[10]uint32{0x013690c5, 0x02d7b440, 0x01114f43, 0x014d53d0, 0x0148e692, 0x019a1625, 0x02274d15, 0x036c1af8, 0x00f16191, 0x0034f9be}}}, + {X: Field{[10]uint32{0x039b25bb, 0x0045f2f9, 0x01dea768, 0x00a2e2ff, 0x0080e3d6, 0x0104b59f, 0x0395522d, 0x03b483e7, 0x0125b29c, 0x0019f958}}, Y: Field{[10]uint32{0x0103da21, 0x01edc4a3, 0x0257f916, 0x033c19ba, 0x033c83ed, 0x0340b4a4, 0x020fd883, 0x008fd12a, 0x00157e3c, 0x0018237f}}}, + {X: Field{[10]uint32{0x038f1525, 0x008a6ded, 0x027bb5cb, 0x03bd4a4c, 0x02ecdd01, 0x02560e7d, 0x01eec20e, 0x0356774c, 0x02da02f7, 0x0002946b}}, Y: Field{[10]uint32{0x03847903, 0x0024b035, 0x02cdd1f0, 0x03420364, 0x036621c7, 0x031a062a, 0x038b18f4, 0x0218acf4, 0x03df93fb, 0x001c1259}}}, + {X: Field{[10]uint32{0x02c1745d, 0x019308da, 0x01e7aaae, 0x01bfed22, 0x01f8bcb3, 0x00ec00e2, 0x02b71b77, 0x032d1bd7, 0x013e73a1, 0x0032601a}}, Y: Field{[10]uint32{0x02fae474, 0x0330162d, 0x02bd4274, 0x03bc01c1, 0x00b3b21f, 0x03eee9ba, 0x01853e56, 0x01fbeddc, 0x008efe6b, 0x002fcee0}}}, + {X: Field{[10]uint32{0x021391a9, 0x01e8dd02, 0x007136b1, 0x034a5235, 0x0394167b, 0x025d7a7c, 0x0227aab2, 0x013070a3, 0x0130bcf5, 0x0031e37e}}, Y: Field{[10]uint32{0x004d9ae7, 0x023c378c, 0x01e5e031, 0x00886f19, 0x00163bfe, 0x020ef878, 0x03b5e9a2, 0x01e6f956, 0x03366d3a, 0x00269093}}}, + {X: Field{[10]uint32{0x01284089, 0x010bf11b, 0x016e5fb2, 0x039399cc, 0x00a998b1, 0x03dfc794, 0x0168ebc8, 0x03cea798, 0x03bcc6d2, 0x00269d7d}}, Y: Field{[10]uint32{0x03169e01, 0x03cc566f, 0x037bfd40, 0x030de1e5, 0x0239bf6e, 0x03f1f8d6, 0x0106c6e8, 0x02e6a8eb, 0x00e6dff8, 0x00032d1e}}}, + {X: Field{[10]uint32{0x036e6224, 0x02dc68e2, 0x001c0d20, 0x01f2dbe0, 0x007eba1e, 0x01739cf9, 0x008277d9, 0x02cf9f6d, 0x031adb0b, 0x001dac84}}, Y: Field{[10]uint32{0x0179263a, 0x034924a6, 0x007b2f79, 0x03e04831, 0x03196c5a, 0x034a1dcd, 0x01e36e6c, 0x03956c2a, 0x00daef60, 0x0000cb8f}}}, + {X: Field{[10]uint32{0x001384e1, 0x0290acd7, 0x01e68f32, 0x011b7ae3, 0x03cdcc4c, 0x036a2520, 0x01f96c93, 0x025c77d5, 0x03614ec5, 0x00086260}}, Y: Field{[10]uint32{0x026dac3e, 0x021ad7c4, 0x02c97d64, 0x012b6726, 0x01c5eda5, 0x01dda5d0, 0x02a2d224, 0x0254eac8, 0x005044a4, 0x000b0e5b}}}, + {X: Field{[10]uint32{0x03db8adc, 0x013e1d78, 0x002a9aa1, 0x029b3d76, 0x03a08449, 0x014a3fb2, 0x01dbe1ca, 0x00603440, 0x02494e9d, 0x002b02c2}}, Y: Field{[10]uint32{0x00412554, 0x03bf8f9c, 0x02dd9b2a, 0x027cc518, 0x00371dd1, 0x01a9aa3a, 0x0153b9c5, 0x02d60cb7, 0x001225a1, 0x0009b475}}}, + {X: Field{[10]uint32{0x00e04625, 0x029b09cc, 0x00a1b6dc, 0x0336efc1, 0x029d1a78, 0x017d65a8, 0x02d33297, 0x02997ef5, 0x018c0851, 0x003e1a6d}}, Y: Field{[10]uint32{0x02a5bff0, 0x02eaec31, 0x01b09c3c, 0x006ee2e4, 0x00a0cfb3, 0x00526527, 0x00b1603e, 0x0171cb06, 0x0344fc6f, 0x001037b8}}}, + {X: Field{[10]uint32{0x01544c3a, 0x01e35bae, 0x032aaecf, 0x00ea39f5, 0x01a640a4, 0x01cf18fb, 0x004a5f22, 0x00943e26, 0x02db2406, 0x003dd3c0}}, Y: Field{[10]uint32{0x0386185b, 0x02bd64f3, 0x02aea1c0, 0x01e87bba, 0x015e364f, 0x017caf3c, 0x03c1a618, 0x007a4a28, 0x026dcacc, 0x00220b8e}}}, + {X: Field{[10]uint32{0x027ea65d, 0x0250ea81, 0x0069ff3d, 0x01412dfa, 0x0288c390, 0x002a9a74, 0x03c9284a, 0x0157acba, 0x02b61d67, 0x0030184f}}, Y: Field{[10]uint32{0x03848cba, 0x0084f149, 0x02c09fe4, 0x006fc34d, 0x0129931c, 0x01764a27, 0x03a89665, 0x0320b92b, 0x02e527b5, 0x001cbd86}}}, + {X: Field{[10]uint32{0x031285db, 0x00e7c23c, 0x007a7eb7, 0x018d490c, 0x00ae0dbf, 0x0045ebac, 0x00fd8c47, 0x002298f0, 0x039860ba, 0x003ad9bf}}, Y: Field{[10]uint32{0x03ddc5d5, 0x01d456a1, 0x0261655c, 0x03cc1dd3, 0x027d3662, 0x03903d2e, 0x005dfb94, 0x03caba2c, 0x02ca54bc, 0x00030c50}}}, + {X: Field{[10]uint32{0x004a861d, 0x0145bc3b, 0x015b871a, 0x005455b0, 0x02e41c6b, 0x0294d180, 0x025d58bc, 0x018187f0, 0x00e6a125, 0x000e9c42}}, Y: Field{[10]uint32{0x004393a6, 0x00c1938f, 0x01226a18, 0x035d9b7c, 0x00957bfc, 0x005f9fa2, 0x011b5bec, 0x02aec806, 0x0102041c, 0x0036ab8b}}}, + {X: Field{[10]uint32{0x00f89d5f, 0x03a500ee, 0x00958949, 0x03cd39d1, 0x00ea1a2f, 0x02c817cb, 0x02e73717, 0x01a744cf, 0x0258c831, 0x00345f8e}}, Y: Field{[10]uint32{0x018b1a20, 0x01ffcc98, 0x010225ac, 0x02e60729, 0x012d75fc, 0x034574d2, 0x00ffafa6, 0x03662e48, 0x037d69e5, 0x002630d7}}}, + {X: Field{[10]uint32{0x03f6541c, 0x00daeac2, 0x01385fff, 0x0353dd9e, 0x0298caf6, 0x018638bf, 0x0350cbf2, 0x02e3b450, 0x0092cefb, 0x0035b8ca}}, Y: Field{[10]uint32{0x02636298, 0x0207af6c, 0x0021e080, 0x02f3b6f8, 0x00976196, 0x015bc926, 0x0072b553, 0x017b001e, 0x022ebe0f, 0x001c5d51}}}, + {X: Field{[10]uint32{0x02ffef75, 0x01777e02, 0x0229186d, 0x02ba4ea9, 0x0282ddc8, 0x00e3b001, 0x00e2182f, 0x0002b9ba, 0x01ff60e9, 0x000c6352}}, Y: Field{[10]uint32{0x026333b2, 0x02205981, 0x00831a98, 0x03aef8a2, 0x0008dcc3, 0x037daa9c, 0x02d4fd8f, 0x01853707, 0x0027dd7d, 0x001ba5fb}}}, + {X: Field{[10]uint32{0x00cf6346, 0x03e05126, 0x0367c5a2, 0x00ada35b, 0x01c075e7, 0x01616aef, 0x00ea5aeb, 0x036e2e9a, 0x02301772, 0x003f5be7}}, Y: Field{[10]uint32{0x0128d2c0, 0x03aace07, 0x001254d4, 0x00c2abfd, 0x02d76082, 0x01610d55, 0x01c5f513, 0x016f5729, 0x02e76477, 0x0036b745}}}, + {X: Field{[10]uint32{0x002ddd36, 0x02b90e86, 0x00d31566, 0x00aba558, 0x00f07428, 0x02f39da3, 0x00ed08d4, 0x011d86a4, 0x0338a2c7, 0x0023f896}}, Y: Field{[10]uint32{0x024c23a2, 0x0386a087, 0x015c73f8, 0x010c9c74, 0x0251d668, 0x03ef7f8b, 0x00da1b32, 0x02ade28b, 0x004a77c6, 0x001bb87a}}}, + {X: Field{[10]uint32{0x0393bef8, 0x03fae665, 0x03e5d2e6, 0x02ca91b5, 0x013e12ba, 0x01afee05, 0x0217bcff, 0x023fbd2b, 0x02d288ed, 0x000df3c3}}, Y: Field{[10]uint32{0x03e3e0d3, 0x02851b6e, 0x03339119, 0x01ec85e4, 0x00e17a41, 0x036d709e, 0x01254f4d, 0x001d4726, 0x025718eb, 0x00024b9e}}}, + {X: Field{[10]uint32{0x03bf403c, 0x01611081, 0x011e0091, 0x013d4c7b, 0x00eca0e0, 0x0180003a, 0x01eb812b, 0x034321db, 0x006106b9, 0x001a2308}}, Y: Field{[10]uint32{0x00cc01fe, 0x01fac517, 0x035bda8b, 0x020fcb3a, 0x00011d85, 0x008802f7, 0x0112e763, 0x01354f7d, 0x02ba41ba, 0x002ead2c}}}, + {X: Field{[10]uint32{0x00b3d804, 0x020e569c, 0x004e9d86, 0x0213626a, 0x02d1b535, 0x00e59485, 0x022371d6, 0x0254d760, 0x02aaf539, 0x0012d32a}}, Y: Field{[10]uint32{0x01ee73d2, 0x01ef5014, 0x0070ae4c, 0x02444571, 0x02652fbd, 0x01d8793a, 0x001d0437, 0x001268ec, 0x03afcd18, 0x000f7749}}}, + {X: Field{[10]uint32{0x02fa1d2e, 0x013754b8, 0x00e56144, 0x02609388, 0x0347cca3, 0x022ce6d7, 0x00ed9a51, 0x036981d6, 0x03c44135, 0x001bd6b2}}, Y: Field{[10]uint32{0x02cd58c4, 0x0134df12, 0x02569052, 0x035ccd7e, 0x02f729f1, 0x00bc65e8, 0x02f2efc0, 0x03653522, 0x0146e5f6, 0x00017727}}}, + {X: Field{[10]uint32{0x0267fc42, 0x010c4f70, 0x008c6ce9, 0x008dce0a, 0x02661d6f, 0x022dad88, 0x01a527bf, 0x032e45bf, 0x00493dff, 0x001e74b5}}, Y: Field{[10]uint32{0x020c08db, 0x0017cdc2, 0x01de1d28, 0x0247575b, 0x038d9027, 0x03ef2454, 0x0302823d, 0x03dff2f8, 0x03f13fa8, 0x002c9a0e}}}, + {X: Field{[10]uint32{0x01f95524, 0x0002ccfe, 0x00118c08, 0x02f00860, 0x01f3915d, 0x03319f50, 0x037a6b07, 0x01ee7271, 0x007e246b, 0x000cea3a}}, Y: Field{[10]uint32{0x0116ff8f, 0x00d0cce7, 0x0229470b, 0x03bf736c, 0x01207d30, 0x00b97116, 0x015e36be, 0x03417c99, 0x004c584f, 0x002eaa09}}}, + {X: Field{[10]uint32{0x01868e95, 0x036aae9e, 0x03a193f4, 0x02c83ee9, 0x013235dd, 0x012f5518, 0x0161a7ae, 0x01f7e081, 0x0132f388, 0x002685a4}}, Y: Field{[10]uint32{0x00630bcd, 0x02408a51, 0x03bc0719, 0x000397e2, 0x02a233b1, 0x02a59656, 0x01452161, 0x011b110a, 0x03179954, 0x001a1bf0}}}, + {X: Field{[10]uint32{0x0383ac42, 0x01184121, 0x026fc290, 0x0278b297, 0x01c85998, 0x010e7cbd, 0x03dc7e90, 0x0338fe6a, 0x00f48405, 0x001e42dd}}, Y: Field{[10]uint32{0x0224a701, 0x02cc12e2, 0x028a66eb, 0x00aec6a4, 0x011dc676, 0x01c44697, 0x00593a37, 0x02172a64, 0x01135623, 0x00225872}}}, + {X: Field{[10]uint32{0x02f9e49c, 0x021ea8dc, 0x02438b54, 0x0217d493, 0x02954717, 0x03ccbf35, 0x00aaeb69, 0x030b661f, 0x00cfae1f, 0x0038a8f4}}, Y: Field{[10]uint32{0x00c93046, 0x00b4cdc5, 0x008db498, 0x000e63ed, 0x0211f7dc, 0x00233914, 0x03edb543, 0x01c230d5, 0x0205ecf2, 0x00273090}}}, + {X: Field{[10]uint32{0x020bcbea, 0x03087b25, 0x03a7a2b3, 0x00f98f8e, 0x00cfd265, 0x01bcab9a, 0x01372b19, 0x030655db, 0x00435992, 0x00032cc3}}, Y: Field{[10]uint32{0x01ccd0b4, 0x01f374e2, 0x0083d498, 0x016099a9, 0x02fb6830, 0x02d246e2, 0x009cba14, 0x00e326b3, 0x01b97083, 0x003d95cd}}}, + {X: Field{[10]uint32{0x00e8b46a, 0x0090e044, 0x01d2dfe9, 0x01adf265, 0x03296ca6, 0x03ecf9a8, 0x018ffb16, 0x002fb98a, 0x0095d631, 0x0007ebb7}}, Y: Field{[10]uint32{0x00725089, 0x02f493ee, 0x012cee7b, 0x03391097, 0x0226d9f0, 0x02f62dd9, 0x0378d032, 0x03a41394, 0x023f8201, 0x000d40e7}}}, + {X: Field{[10]uint32{0x02b3e8f9, 0x031d42d4, 0x03f318f6, 0x014c78a2, 0x018e93ea, 0x03546cfd, 0x005410ce, 0x030744fc, 0x035a2be8, 0x002991b3}}, Y: Field{[10]uint32{0x00c102bb, 0x03d19429, 0x029bda01, 0x03911950, 0x01e427d7, 0x00794744, 0x03a7e78e, 0x02a482d1, 0x02cb7727, 0x00163163}}}, + {X: Field{[10]uint32{0x02be2205, 0x02f00837, 0x02d39dce, 0x031857b7, 0x011c77c0, 0x01730c8b, 0x038c397a, 0x01f4e3a6, 0x03271853, 0x000c9cd1}}, Y: Field{[10]uint32{0x01a42d65, 0x00092402, 0x032bb72c, 0x012f0f94, 0x01c1ea78, 0x011d69f5, 0x007b072d, 0x03d82f53, 0x008958c3, 0x0030b7af}}}, + {X: Field{[10]uint32{0x0172827e, 0x00bce4f5, 0x03f4d4ce, 0x008b9f6c, 0x009906dd, 0x024c289c, 0x028c095d, 0x02884b01, 0x03180855, 0x0005a869}}, Y: Field{[10]uint32{0x0115605c, 0x01adc934, 0x00660219, 0x005aa2dd, 0x01b1ef30, 0x02fa3df7, 0x0280335c, 0x02a7adb3, 0x024bb30b, 0x0034e275}}}, + {X: Field{[10]uint32{0x03687596, 0x02bd33c8, 0x002e9a61, 0x03e129d0, 0x00eeb1eb, 0x01859ba4, 0x0294b867, 0x0155c4cd, 0x01145de2, 0x002d2fd3}}, Y: Field{[10]uint32{0x03d11242, 0x00bf046e, 0x023dbfac, 0x0186962b, 0x0237d389, 0x02d817a5, 0x018640a6, 0x025f958c, 0x00a4d823, 0x001276c8}}}, + {X: Field{[10]uint32{0x03892630, 0x019ee6c2, 0x0164bbf3, 0x004fa42a, 0x03fc3114, 0x0364e032, 0x00a0de08, 0x01997906, 0x03a9ccf4, 0x00353b59}}, Y: Field{[10]uint32{0x011df131, 0x0017462d, 0x015fa371, 0x01dd86c1, 0x0007472b, 0x00924dd9, 0x028a9729, 0x00220c7f, 0x017ce79a, 0x0023fdf9}}}, + {X: Field{[10]uint32{0x014fe70d, 0x03c7d1fd, 0x01366b32, 0x0373e45b, 0x0044d5df, 0x03070b29, 0x02e906f0, 0x00fbc83a, 0x02f19f41, 0x0022b495}}, Y: Field{[10]uint32{0x02d34da7, 0x0090fb69, 0x02ff494e, 0x01783497, 0x0134778f, 0x00725c86, 0x0147f659, 0x01371609, 0x03418d2c, 0x002f7bba}}}, + {X: Field{[10]uint32{0x01f17f8e, 0x018a854c, 0x0362f07f, 0x03b887c7, 0x01c67d22, 0x029561ee, 0x03723e01, 0x02d7c7c4, 0x02fafe55, 0x002374f8}}, Y: Field{[10]uint32{0x03c88cb0, 0x02fe4fd7, 0x0160b4b4, 0x0072e99a, 0x028f2db4, 0x036711b1, 0x017c6b65, 0x01c5f957, 0x02a47d6b, 0x002a88f4}}}, + {X: Field{[10]uint32{0x00b3d0f6, 0x01de9741, 0x01a678e5, 0x005d5536, 0x0103c139, 0x01ec3a4e, 0x034db01a, 0x00c2beb0, 0x02282a8e, 0x00113f67}}, Y: Field{[10]uint32{0x011a61d0, 0x003305a4, 0x0290e484, 0x001b32c4, 0x0218927d, 0x0256f6f8, 0x0269d592, 0x0066ce85, 0x00613533, 0x0032c1e4}}}, + {X: Field{[10]uint32{0x00b7aa42, 0x02c69c62, 0x02477746, 0x03d39691, 0x022db7c9, 0x025917d1, 0x01d2aa9c, 0x03b5960c, 0x02024464, 0x00174926}}, Y: Field{[10]uint32{0x037281d0, 0x03e2c501, 0x01a12b54, 0x03efca53, 0x0023bb8d, 0x0022d348, 0x0195f80e, 0x01ad70b1, 0x0386527d, 0x000affdc}}}, + {X: Field{[10]uint32{0x0210fb23, 0x0311f203, 0x008ca85a, 0x01502e50, 0x01ddd18b, 0x02247120, 0x01e123cd, 0x03547519, 0x00581edc, 0x003663ad}}, Y: Field{[10]uint32{0x00b4dcf2, 0x033086de, 0x010816a2, 0x005c6c99, 0x032b1537, 0x03c95326, 0x031f9e60, 0x01ab1bcb, 0x03bed375, 0x00056ff4}}}, + {X: Field{[10]uint32{0x00db6082, 0x02013591, 0x02eb5876, 0x01ba759c, 0x036edb48, 0x03a14543, 0x032134d2, 0x02bad884, 0x036919a2, 0x000bc4b0}}, Y: Field{[10]uint32{0x038cf73b, 0x004cf15f, 0x02dd0827, 0x031ef6a0, 0x0320834d, 0x030af438, 0x01264b8d, 0x00a313b7, 0x02dd3b4d, 0x00300447}}}, + {X: Field{[10]uint32{0x004b4624, 0x0005f0c5, 0x023e6f03, 0x00d23c1f, 0x02713260, 0x02f395ea, 0x01d35dfe, 0x0327e108, 0x02847099, 0x00136525}}, Y: Field{[10]uint32{0x01b673da, 0x02c7fff7, 0x02adb126, 0x0136c60b, 0x00b91f95, 0x022c1f68, 0x01b308fb, 0x01a71ca3, 0x0257d713, 0x0026bed6}}}, + {X: Field{[10]uint32{0x02af2466, 0x01a1c038, 0x008b2a97, 0x00936777, 0x020fca8f, 0x014aac5f, 0x020b39a7, 0x03c7238d, 0x01105e95, 0x0033c76e}}, Y: Field{[10]uint32{0x0247ca5f, 0x02371cfd, 0x020040ad, 0x029ecf4b, 0x015e645c, 0x02e59006, 0x001b94b4, 0x0219d29b, 0x0366c49c, 0x0039f267}}}, + {X: Field{[10]uint32{0x02a62b85, 0x0390a11a, 0x03f22a9e, 0x01fc16c9, 0x01d4b174, 0x00b19d61, 0x01d63a24, 0x03ea2ade, 0x00257d2f, 0x0039c7ad}}, Y: Field{[10]uint32{0x022c8865, 0x03d9099a, 0x033c3d10, 0x01e61c38, 0x023bc0a7, 0x0294f8d0, 0x0321f45d, 0x028dd9f5, 0x02ecf901, 0x002a41ab}}}, + {X: Field{[10]uint32{0x00559887, 0x0220aacc, 0x03b218f9, 0x01b289fa, 0x0321c58b, 0x0128a66f, 0x005c3e1b, 0x01d7d0ef, 0x03d30b25, 0x002f3661}}, Y: Field{[10]uint32{0x01483f65, 0x03a6ce87, 0x01b00761, 0x01324a27, 0x00690c1b, 0x018e93ad, 0x02fd894e, 0x02b89cae, 0x00c94339, 0x00100e01}}}, + {X: Field{[10]uint32{0x01f8cab0, 0x031f8d2c, 0x00042ea9, 0x02e9a559, 0x007a2beb, 0x029a7dd0, 0x01d2d5e8, 0x01c588e5, 0x00f748af, 0x002dd357}}, Y: Field{[10]uint32{0x0049b336, 0x015f7afa, 0x00a3ea3c, 0x02a9f73f, 0x035728df, 0x02be9150, 0x01e9a234, 0x03ed660d, 0x01db332b, 0x002d717f}}}, + {X: Field{[10]uint32{0x0160837d, 0x0146dc8d, 0x03edc572, 0x03b98cec, 0x01e9bc12, 0x02482faa, 0x03b3b13a, 0x0326b869, 0x02f59835, 0x0011bcf7}}, Y: Field{[10]uint32{0x010ce67b, 0x014f9a05, 0x02eca91d, 0x007040d7, 0x00818fb7, 0x01c0853b, 0x02a69778, 0x02e72cde, 0x021f2e8e, 0x00161ecb}}}, + {X: Field{[10]uint32{0x0267d572, 0x0133eddd, 0x018b6577, 0x02906457, 0x01a50ceb, 0x02ed80a6, 0x011f4d7c, 0x0025a379, 0x00fdeb3f, 0x00234d06}}, Y: Field{[10]uint32{0x00661db8, 0x014456ab, 0x022039d0, 0x00e03d2c, 0x03e8b3dd, 0x03d9ed31, 0x01da7c00, 0x02118aaa, 0x011016a2, 0x0033b9e6}}}, + {X: Field{[10]uint32{0x016f7c10, 0x033c84ab, 0x03bcf529, 0x01ede193, 0x0230f432, 0x02d9c94e, 0x020a672e, 0x01a575e2, 0x03094510, 0x002632c3}}, Y: Field{[10]uint32{0x020ab333, 0x0355abca, 0x0132f09f, 0x01d69af5, 0x03300fde, 0x00a14b47, 0x007e9b55, 0x0140d66d, 0x01ac4e1b, 0x0009654b}}}, + {X: Field{[10]uint32{0x0339a3cf, 0x02e6384a, 0x00effb58, 0x0132c0c3, 0x01a34c7c, 0x000f7841, 0x01383f3f, 0x01d7f129, 0x024c0ca0, 0x00258117}}, Y: Field{[10]uint32{0x0201bafe, 0x03548c5c, 0x00c6e8f2, 0x038e9412, 0x016ebd03, 0x02f577fb, 0x011f24f7, 0x010546e8, 0x00fd9223, 0x003d49ee}}}, + {X: Field{[10]uint32{0x01cc6030, 0x02fd5aa6, 0x0293e703, 0x03956642, 0x01c3f4b3, 0x035de5d8, 0x0226a9ca, 0x037be32e, 0x009142ad, 0x003c98ba}}, Y: Field{[10]uint32{0x030b594b, 0x00c8635b, 0x01ca1d1f, 0x02dcce4e, 0x035382c7, 0x0024bb3f, 0x0197dd67, 0x01aa403d, 0x036486c8, 0x0009d731}}}, + {X: Field{[10]uint32{0x016d17fe, 0x01c5f6c5, 0x016347cc, 0x0204f1b1, 0x03ad75ef, 0x03946eca, 0x01f7900b, 0x014cd97e, 0x0002ee17, 0x000335e7}}, Y: Field{[10]uint32{0x007a985d, 0x00000c65, 0x0394ac45, 0x023ad245, 0x014ff919, 0x01aaeeb8, 0x03260441, 0x0396f694, 0x00ffb30d, 0x002d7afa}}}, + {X: Field{[10]uint32{0x00f858f4, 0x00897e52, 0x009d280a, 0x00a73147, 0x02d9ba46, 0x018c20c2, 0x0122e03e, 0x01037780, 0x03225b1d, 0x000a2d2f}}, Y: Field{[10]uint32{0x00f3cac0, 0x00db894b, 0x027954ea, 0x03f2c439, 0x03aadf4f, 0x00c00a5e, 0x0134c6be, 0x01053529, 0x018998bb, 0x00091d58}}}, + {X: Field{[10]uint32{0x02ed2ff7, 0x02119731, 0x03ea016c, 0x00db1ec2, 0x03cc765c, 0x0184a297, 0x013344bc, 0x0177ce71, 0x02067dd5, 0x003c063c}}, Y: Field{[10]uint32{0x00aa7e66, 0x02803e39, 0x0261a960, 0x01da1b15, 0x00cda34a, 0x01454133, 0x02c1cd22, 0x02752b19, 0x02b2cd61, 0x00367f16}}}, + {X: Field{[10]uint32{0x024a7a13, 0x03621b10, 0x0394218e, 0x03c5222c, 0x027f661e, 0x03d1f2f6, 0x01dd5c74, 0x01b40a69, 0x00cf0808, 0x00125a5a}}, Y: Field{[10]uint32{0x021874e7, 0x012de1c7, 0x022dfc8d, 0x00909dd3, 0x00360b51, 0x01e71980, 0x017a3635, 0x0183803c, 0x03984420, 0x0035f637}}}, + {X: Field{[10]uint32{0x02efedab, 0x00405ac8, 0x03949892, 0x01728741, 0x03b98435, 0x00d80369, 0x02485749, 0x00eddda3, 0x0059e911, 0x00090b53}}, Y: Field{[10]uint32{0x020f42b1, 0x022de59e, 0x0257727a, 0x0081ac2b, 0x0342f509, 0x014155ce, 0x0228074a, 0x030bb58e, 0x03d7b0c8, 0x0011c373}}}, + {X: Field{[10]uint32{0x0385e8c7, 0x003d3744, 0x015861d2, 0x02f356ac, 0x03466280, 0x01794143, 0x004afacc, 0x01674e13, 0x00cc1a1a, 0x002dae01}}, Y: Field{[10]uint32{0x0121d439, 0x01e62ed9, 0x02d0c898, 0x019c2ec9, 0x0139b579, 0x00a0a7d0, 0x022a1d23, 0x00daa66e, 0x034602a6, 0x000bde24}}}, + {X: Field{[10]uint32{0x01918a4e, 0x02d26dc7, 0x011ca0d1, 0x00b4a931, 0x0346904b, 0x00a04092, 0x038048af, 0x017f74e2, 0x03d07ecc, 0x00370c28}}, Y: Field{[10]uint32{0x018cc917, 0x014469b0, 0x0110febb, 0x02d9e29f, 0x02b701f7, 0x024da952, 0x03536987, 0x003a5d63, 0x01b07055, 0x000c9902}}}, + {X: Field{[10]uint32{0x03d3fab8, 0x0057cad0, 0x013c20c0, 0x00d25de0, 0x005fb229, 0x03d3d12b, 0x02bb6280, 0x03ccc20e, 0x034d345b, 0x00387f90}}, Y: Field{[10]uint32{0x034c4d83, 0x0256c1dd, 0x03f7a59a, 0x00b0b735, 0x03d3b31b, 0x038f4581, 0x008df48c, 0x025eb130, 0x00a52af8, 0x0006c947}}}, + {X: Field{[10]uint32{0x02fb8d08, 0x03f5745d, 0x02060bd1, 0x004f3f5c, 0x0182c2f5, 0x039dd591, 0x03e4a40e, 0x03178abe, 0x00dae08a, 0x002a3b62}}, Y: Field{[10]uint32{0x00175729, 0x007e7ce1, 0x0081b77b, 0x023c74a5, 0x035cc2d9, 0x005eca9b, 0x02f5b537, 0x0258c3ee, 0x00b07441, 0x003d3ed8}}}, + {X: Field{[10]uint32{0x007c6481, 0x0295e40b, 0x0143f76f, 0x004e8389, 0x008e7707, 0x0314348a, 0x01c083ee, 0x02735f25, 0x0028de1e, 0x002d4b3e}}, Y: Field{[10]uint32{0x0375790f, 0x017abdc6, 0x02d833c9, 0x0314dd23, 0x0343eebd, 0x00f8ed4a, 0x03dc729d, 0x03eefe40, 0x01530046, 0x0018d68e}}}, + {X: Field{[10]uint32{0x021d5e83, 0x01e0a485, 0x0178e4dc, 0x015358d2, 0x00b1297c, 0x02ab64ff, 0x03957a94, 0x026ff732, 0x01aef76d, 0x001c081e}}, Y: Field{[10]uint32{0x02783b52, 0x00419096, 0x01f82c8c, 0x011712e5, 0x0132a43a, 0x0031b76e, 0x033a202e, 0x00714b4e, 0x008bf2d8, 0x001260f0}}}, + {X: Field{[10]uint32{0x0257bbf5, 0x00fb8baf, 0x009a0dd7, 0x02e544f3, 0x023ed3dc, 0x02d0de38, 0x00fe8cbd, 0x03873bbd, 0x00d18e9d, 0x00118e35}}, Y: Field{[10]uint32{0x0327e110, 0x01fbc832, 0x01e87cf7, 0x01029654, 0x020cb507, 0x007e8daf, 0x00853f75, 0x00c19a5a, 0x003245cc, 0x001587b8}}}, + {X: Field{[10]uint32{0x03386bfc, 0x02c8b64e, 0x039cbecf, 0x02024410, 0x01d98e48, 0x00f4280e, 0x021dc5ee, 0x02b77b55, 0x02b75fac, 0x003bacd3}}, Y: Field{[10]uint32{0x02e57c4c, 0x0308d269, 0x00af4c21, 0x00eb473d, 0x00e9d8f6, 0x030c46a5, 0x018db8c1, 0x03723015, 0x00ff05eb, 0x003cac8f}}}, + {X: Field{[10]uint32{0x012c45ca, 0x01a167b1, 0x0175e5c5, 0x0190f7dd, 0x01f70a8c, 0x03efa38e, 0x0107df0c, 0x00c84f07, 0x02e5becf, 0x0001fcb1}}, Y: Field{[10]uint32{0x02b6c89d, 0x03903788, 0x0189a77b, 0x03bac847, 0x02cf9d66, 0x03614794, 0x01a04248, 0x0276b83f, 0x01c01971, 0x00254126}}}, + {X: Field{[10]uint32{0x03e53647, 0x008cc0c8, 0x00f81856, 0x003daa54, 0x023cea09, 0x013e2c05, 0x0211064d, 0x0349f3df, 0x03221ec5, 0x001bb1d9}}, Y: Field{[10]uint32{0x0269a3d6, 0x02c5c0eb, 0x01254984, 0x02816b5d, 0x01d0aa7b, 0x0018f13f, 0x02ec7d0f, 0x03a0e723, 0x03579704, 0x0026c0f1}}}, + {X: Field{[10]uint32{0x024dea7e, 0x027e2914, 0x02f5499e, 0x01eb16ca, 0x01b44a70, 0x01e3d9f3, 0x03184b03, 0x017b2807, 0x029d320d, 0x00263dbd}}, Y: Field{[10]uint32{0x02b69a02, 0x03d509bc, 0x0244d79e, 0x0375e324, 0x02ca54a3, 0x015af0ce, 0x01333fe0, 0x01d98e5e, 0x033d7b03, 0x0009bbda}}}, + {X: Field{[10]uint32{0x0347e390, 0x0073c156, 0x017af296, 0x01a0b67b, 0x012d3086, 0x03005c32, 0x037ac998, 0x00b1d975, 0x004558b8, 0x0033c7bd}}, Y: Field{[10]uint32{0x018511c3, 0x037d1192, 0x03d23bef, 0x0360d8e5, 0x00f4345b, 0x016bfbfa, 0x022d8f3f, 0x003b1e1d, 0x0105fb88, 0x0022f307}}}, + {X: Field{[10]uint32{0x006f07e8, 0x00a02863, 0x035aa37c, 0x02096821, 0x009ab62b, 0x01653cde, 0x00cc5c10, 0x01bcbbe2, 0x0251efa2, 0x00043805}}, Y: Field{[10]uint32{0x01779df2, 0x03540fae, 0x00c0a8fa, 0x028c1f8a, 0x0083105d, 0x0222aaa6, 0x03b2cdb7, 0x018cd4c3, 0x01e11f77, 0x000b9a85}}}, + {X: Field{[10]uint32{0x013eee4a, 0x009e59ba, 0x01a58054, 0x0114482e, 0x000af909, 0x01260c4c, 0x03d77d74, 0x00826dbb, 0x03e041ce, 0x002e538b}}, Y: Field{[10]uint32{0x01bca443, 0x01c50b72, 0x020f01d0, 0x02349dda, 0x01a86bfb, 0x011b7c43, 0x00b1dde7, 0x024bd577, 0x03f1103e, 0x00023dea}}}, + {X: Field{[10]uint32{0x02d41154, 0x0174acc5, 0x02ccc122, 0x00d385fc, 0x026d71cc, 0x011362bd, 0x01d233e2, 0x02a7a851, 0x0102c671, 0x0033e79f}}, Y: Field{[10]uint32{0x012d2ca7, 0x03bfe143, 0x00c4ee13, 0x02ef86d8, 0x01a853e2, 0x021e3e5a, 0x003858a3, 0x0259beef, 0x00a10f0b, 0x0020bbae}}}, + {X: Field{[10]uint32{0x03d48bb2, 0x00e6bfd2, 0x034366d5, 0x00af814b, 0x00df8e4f, 0x033d2e4d, 0x01d18ebd, 0x00ee44c6, 0x002994ad, 0x00368e8f}}, Y: Field{[10]uint32{0x01dc0193, 0x01a6a474, 0x00f54256, 0x03b7db6d, 0x035e0d32, 0x03b21998, 0x01ccfe7b, 0x0091e20c, 0x0253c404, 0x000a3e75}}}, + {X: Field{[10]uint32{0x01eec101, 0x0289ec3c, 0x02450d4b, 0x03274394, 0x00a0a095, 0x00a0c7cc, 0x014c9fcd, 0x00de2f64, 0x00182b80, 0x002ae04a}}, Y: Field{[10]uint32{0x026666b3, 0x01351780, 0x0078f142, 0x00ab7030, 0x022286dc, 0x02ec7602, 0x00e366af, 0x01db58f7, 0x01822748, 0x00016af1}}}, + {X: Field{[10]uint32{0x01c4977a, 0x01023df9, 0x014ab831, 0x019fe37e, 0x03f0edd9, 0x00259714, 0x0164391c, 0x032a9757, 0x02a2bf02, 0x003a96e0}}, Y: Field{[10]uint32{0x033d9339, 0x022f3a3f, 0x02cac5d2, 0x00fa25f6, 0x022518d5, 0x01ee2239, 0x01dd5040, 0x0020deb3, 0x02990f32, 0x00207fa0}}}, + {X: Field{[10]uint32{0x03e70fa2, 0x02e3ef3e, 0x00d2ca95, 0x0305f7d6, 0x01318aea, 0x00f68b4a, 0x01d618be, 0x0075f40f, 0x000bab20, 0x00141817}}, Y: Field{[10]uint32{0x02a60383, 0x03ce5f5c, 0x028afc03, 0x03f1b0a9, 0x02d4c978, 0x024a335b, 0x02cc160d, 0x015a4f13, 0x031e007b, 0x00003942}}}, + {X: Field{[10]uint32{0x021191dd, 0x0162c97a, 0x0316831b, 0x0184422d, 0x02513566, 0x0153de6d, 0x01409d88, 0x032b3bd1, 0x00b66d7d, 0x003ddb14}}, Y: Field{[10]uint32{0x01f3cc72, 0x0346041b, 0x01f86d3b, 0x0121dc83, 0x03a30401, 0x025fc1ec, 0x00e2e93a, 0x014502f0, 0x0374b019, 0x001f4156}}}, + {X: Field{[10]uint32{0x03260e7d, 0x00f65664, 0x01b32f6d, 0x0240af5e, 0x01413126, 0x01cb9384, 0x02367db2, 0x0011f330, 0x03bad716, 0x00379414}}, Y: Field{[10]uint32{0x017cc7e2, 0x00e37872, 0x03bf3d3f, 0x02041444, 0x03b1e4c5, 0x017d180c, 0x02b61b5b, 0x02c36c37, 0x02d39c34, 0x00071528}}}, + {X: Field{[10]uint32{0x0206499d, 0x03df237e, 0x017121af, 0x00902527, 0x00437f1a, 0x03786395, 0x018a332b, 0x0251ac6e, 0x019f180e, 0x002b4f9c}}, Y: Field{[10]uint32{0x02f1b554, 0x032b4f80, 0x032c882b, 0x037df28b, 0x03ef310a, 0x02fb7018, 0x0073863a, 0x02935f49, 0x03f1390f, 0x002d1635}}}, + {X: Field{[10]uint32{0x036bae4b, 0x03210330, 0x026ecb46, 0x039db899, 0x01839a3a, 0x00cbe2de, 0x010c8673, 0x02bdad8c, 0x02345560, 0x0009c280}}, Y: Field{[10]uint32{0x02bedeaf, 0x005a8653, 0x01bc689d, 0x01c86f6d, 0x01ef7ef0, 0x02661de8, 0x020f1600, 0x01f45832, 0x004b9215, 0x00236aae}}}, + {X: Field{[10]uint32{0x00624621, 0x00cd3b9a, 0x02d30f98, 0x016cafdc, 0x0325ba2b, 0x012a13fd, 0x03ffdb29, 0x03271321, 0x017e3027, 0x003ad7b4}}, Y: Field{[10]uint32{0x0060a942, 0x012d3b02, 0x003ae3b5, 0x02ff5667, 0x03df4a91, 0x013186b4, 0x028d1a21, 0x0351c66f, 0x00b38f74, 0x000e7fff}}}, + {X: Field{[10]uint32{0x00e0a5dd, 0x0304d70b, 0x02d6a7ba, 0x00869d5c, 0x01fb1f66, 0x016b351a, 0x03f4e807, 0x02633188, 0x01f28a0b, 0x002e7047}}, Y: Field{[10]uint32{0x00a76278, 0x03b15150, 0x00a1e391, 0x028938bf, 0x015eb506, 0x024aceea, 0x03eb0c36, 0x0257bcc9, 0x0278d42b, 0x0016fea2}}}, + {X: Field{[10]uint32{0x03e74b5c, 0x018c433a, 0x0221ca8a, 0x0264f126, 0x00f60f13, 0x03b68102, 0x02611066, 0x038967f9, 0x004380ab, 0x003bb45c}}, Y: Field{[10]uint32{0x02a0d750, 0x03576dc8, 0x0324a567, 0x018594b0, 0x028cc2c6, 0x01ebf366, 0x02a243f5, 0x01ee4458, 0x0276cbe3, 0x001b72d8}}}, + {X: Field{[10]uint32{0x03aa97a7, 0x01400314, 0x034c2526, 0x00417b8d, 0x028c68e3, 0x02b7d8ad, 0x025524a4, 0x0273d1a3, 0x036f5f5b, 0x002392c3}}, Y: Field{[10]uint32{0x01b7f74a, 0x004dfb30, 0x00d56e25, 0x00b455f0, 0x02c7e59f, 0x0341063d, 0x00578c16, 0x000646dd, 0x00aec18d, 0x00347e20}}}, + {X: Field{[10]uint32{0x02a5ebbe, 0x03d67232, 0x0176e90c, 0x036848e3, 0x01a7f393, 0x00c44ac7, 0x005ce9c9, 0x025ae6ba, 0x01bdfc65, 0x001deb88}}, Y: Field{[10]uint32{0x034a21d1, 0x01b151ff, 0x02f9b910, 0x005cc81b, 0x03516947, 0x01ca4553, 0x0225390e, 0x019b37d1, 0x01811e32, 0x003d1211}}}, + {X: Field{[10]uint32{0x03d2346f, 0x035ac1f6, 0x03999e16, 0x00cfc140, 0x01929225, 0x01419899, 0x028bd35f, 0x00bbd166, 0x00a871c0, 0x00074de7}}, Y: Field{[10]uint32{0x0140cad0, 0x002ddc90, 0x011c10d5, 0x01785e36, 0x00a6333d, 0x006571c1, 0x0197cfed, 0x0269ed08, 0x039a7289, 0x00301542}}}, + {X: Field{[10]uint32{0x03ef1ccc, 0x0359c30f, 0x00296cba, 0x0085f51f, 0x025c7ea7, 0x03c09dca, 0x03671995, 0x005aba64, 0x03f328fc, 0x00189405}}, Y: Field{[10]uint32{0x00450603, 0x0269d359, 0x02bf3618, 0x001985f0, 0x02d7056d, 0x0004437d, 0x03eb4ac5, 0x00853fb6, 0x0253af3b, 0x0006d138}}}, + {X: Field{[10]uint32{0x0238412d, 0x029cae01, 0x01eb78ea, 0x0059d029, 0x00d1019d, 0x010e1dfa, 0x023f508d, 0x00d424eb, 0x02496bdc, 0x0031e93f}}, Y: Field{[10]uint32{0x020febef, 0x02a5d125, 0x016fba30, 0x022d9d66, 0x01673093, 0x012e3dcd, 0x03924067, 0x01c4c3a1, 0x02a895fb, 0x0006d6c4}}}, + {X: Field{[10]uint32{0x02441d3f, 0x00a0d22c, 0x0052fa56, 0x019add3c, 0x01b65c61, 0x03123102, 0x000102cb, 0x0313bcfa, 0x003ce8f9, 0x0033fe7e}}, Y: Field{[10]uint32{0x0352ee6f, 0x038cb378, 0x0252e338, 0x001ea2f4, 0x02814ceb, 0x035a5cfc, 0x0046a41e, 0x0081fbf2, 0x00f82180, 0x00133106}}}, + {X: Field{[10]uint32{0x02700541, 0x0011c859, 0x02ef82c6, 0x0395eb79, 0x002fd23a, 0x027a8477, 0x038ae98a, 0x030a5724, 0x031045b8, 0x0021009d}}, Y: Field{[10]uint32{0x001e4f99, 0x0381c8e1, 0x01da5f56, 0x033502c5, 0x03f3f80d, 0x02ea0753, 0x01b972ce, 0x00501220, 0x0192d3c1, 0x001ca519}}}, + {X: Field{[10]uint32{0x012e0d2c, 0x01c18503, 0x004afb5c, 0x013aa53e, 0x015e304a, 0x023d548b, 0x01a346bd, 0x02e7b018, 0x0330e00c, 0x003deac4}}, Y: Field{[10]uint32{0x035e6144, 0x004406f7, 0x02f866bb, 0x028e7753, 0x012ef0f6, 0x03cfcf5a, 0x018def46, 0x002952bd, 0x00518935, 0x001752b2}}}, + {X: Field{[10]uint32{0x03d4e618, 0x0062131b, 0x0292c785, 0x037304fd, 0x01d0da4d, 0x021b260a, 0x01a4d5b7, 0x02dde230, 0x02192303, 0x0029f213}}, Y: Field{[10]uint32{0x031774fe, 0x02e915ae, 0x01744939, 0x00cea0a7, 0x01659285, 0x0178fc45, 0x0164bad3, 0x036cbc87, 0x025b8fc2, 0x0015b8cb}}}, + {X: Field{[10]uint32{0x0098c43a, 0x0276036b, 0x00dccf19, 0x00e41fd7, 0x02c65f41, 0x0299de9c, 0x03bc55af, 0x036b00d8, 0x0084a680, 0x002e2c32}}, Y: Field{[10]uint32{0x016b8127, 0x0239c794, 0x03932d0f, 0x01e98976, 0x016569f8, 0x013b6c11, 0x02bec5ba, 0x001b0735, 0x008ac926, 0x0010f906}}}, + {X: Field{[10]uint32{0x025e0df6, 0x014120a9, 0x038ddac2, 0x023a50eb, 0x01c5bef9, 0x036d285e, 0x03bc33c1, 0x0184d568, 0x0043d057, 0x00205bb1}}, Y: Field{[10]uint32{0x01f0b360, 0x021f1215, 0x022a9c9b, 0x00c04862, 0x02054f9a, 0x01b8d9ad, 0x00f6fa19, 0x01623664, 0x02c9e9f3, 0x002269ec}}}, + {X: Field{[10]uint32{0x011e28a0, 0x027526aa, 0x03fd2af3, 0x003cedc5, 0x00b10196, 0x03f3311f, 0x03ba24f7, 0x001f54cf, 0x0103823d, 0x00237b48}}, Y: Field{[10]uint32{0x00011728, 0x02549b30, 0x02ad4fb1, 0x0244a9a0, 0x01e3e1a3, 0x01d4faab, 0x03ef9f7d, 0x01987bd0, 0x011fbe1a, 0x000fc0fb}}}, + {X: Field{[10]uint32{0x00d6260b, 0x026baab4, 0x00c87484, 0x0312fb88, 0x010ff4f7, 0x03a30c59, 0x03df9e3c, 0x0351e2fe, 0x039ce874, 0x002c712c}}, Y: Field{[10]uint32{0x004b4fde, 0x02f48db0, 0x00dbda54, 0x02137ef1, 0x0132c25b, 0x00e5ab72, 0x03fe7245, 0x006207ee, 0x03613070, 0x000e2be2}}}, + {X: Field{[10]uint32{0x02b2c971, 0x0176b67e, 0x0390d0e7, 0x03c9f842, 0x01f011bc, 0x02af2082, 0x03f657cf, 0x00face85, 0x023be595, 0x001f56f3}}, Y: Field{[10]uint32{0x00f84787, 0x03b78aac, 0x0167cbbc, 0x029d0198, 0x01864b2b, 0x00b0e792, 0x0308b3b6, 0x035e0ac1, 0x02865f5f, 0x001ce035}}}, + {X: Field{[10]uint32{0x0000f285, 0x034ae1d3, 0x01497a54, 0x01e22c8a, 0x00096af1, 0x031c5c71, 0x027717fb, 0x03cb3453, 0x011a422a, 0x000abd44}}, Y: Field{[10]uint32{0x03771f41, 0x012fabae, 0x0259f753, 0x031722b2, 0x032f3445, 0x01ecec90, 0x0000b68b, 0x03c401fa, 0x031bee43, 0x00111a2f}}}, + {X: Field{[10]uint32{0x037af766, 0x029ed258, 0x0155dc81, 0x02ba8b42, 0x01fe010d, 0x01010ed8, 0x03dfb65f, 0x0377bfe2, 0x01c06dc8, 0x002d1b8a}}, Y: Field{[10]uint32{0x017b59f5, 0x03b27767, 0x016459c1, 0x026c2714, 0x03748c5c, 0x01289ea7, 0x010cef82, 0x00c53f5f, 0x0095ae16, 0x00189ddd}}}, + {X: Field{[10]uint32{0x03a6b1ea, 0x02c8673e, 0x034a5089, 0x03e9648e, 0x00aef6d8, 0x00e73545, 0x02b3bd53, 0x02903dc7, 0x02d3f44e, 0x000415e1}}, Y: Field{[10]uint32{0x0343d0bc, 0x0001736d, 0x00f151ba, 0x00927f0b, 0x0139fad0, 0x03a1b42e, 0x012c4508, 0x008b2df6, 0x03dac875, 0x000a93a9}}}, + {X: Field{[10]uint32{0x02adb23f, 0x0093d205, 0x038575c6, 0x03bfc22d, 0x02d2d2d8, 0x024b3ac8, 0x01345738, 0x01b8c062, 0x0081be85, 0x0007cf03}}, Y: Field{[10]uint32{0x03f6072b, 0x03a959e2, 0x031c9faa, 0x014b4c9c, 0x0011158d, 0x027135ed, 0x02f48408, 0x012673d4, 0x0290de24, 0x0001cc85}}}, + {X: Field{[10]uint32{0x028bd2b3, 0x03d1aa91, 0x01c9f5ab, 0x01afc5be, 0x02e43787, 0x020cee83, 0x012484ff, 0x0257e824, 0x02e3a95a, 0x0005b72e}}, Y: Field{[10]uint32{0x01ffa44d, 0x027c9056, 0x00034344, 0x00ab3785, 0x0030e558, 0x031a45c0, 0x02de4733, 0x004b5b06, 0x0007247b, 0x00159c9f}}}, + {X: Field{[10]uint32{0x02e70726, 0x02510e36, 0x03fff1c7, 0x029927b6, 0x02e42314, 0x017b6af1, 0x00ff3c0f, 0x00f23e49, 0x016cd672, 0x000452f9}}, Y: Field{[10]uint32{0x028ac521, 0x03641949, 0x035e1d5f, 0x01d6511c, 0x0245b61b, 0x00cb3e9e, 0x0180046b, 0x037ab9f1, 0x0172855c, 0x00026137}}}, + {X: Field{[10]uint32{0x0103fdaf, 0x02dfab36, 0x0217d747, 0x00ea35d3, 0x0351766b, 0x03d6eaff, 0x029dbac7, 0x0211cb85, 0x02e601f9, 0x0023432c}}, Y: Field{[10]uint32{0x00bc9b92, 0x03dcdaa0, 0x0160a0f1, 0x02ae2678, 0x01f06b36, 0x033aaec4, 0x00ea3682, 0x024fdc97, 0x03f5b9e7, 0x0034564e}}}, + {X: Field{[10]uint32{0x01714db3, 0x01c9fd4c, 0x005caab4, 0x00f9212d, 0x0134e3b4, 0x020125a4, 0x032f3a2c, 0x020b936d, 0x0354188c, 0x0016d081}}, Y: Field{[10]uint32{0x00723d9f, 0x01b304e9, 0x008838bf, 0x0171dd66, 0x001c7eed, 0x0066f852, 0x00d16437, 0x03cd81eb, 0x007d27d7, 0x0012a24c}}}, + {X: Field{[10]uint32{0x00cbf74b, 0x006d63e2, 0x006ed18c, 0x00b87311, 0x019f01c6, 0x0003f82d, 0x0056a728, 0x00765a36, 0x021d9576, 0x002478dd}}, Y: Field{[10]uint32{0x0396c772, 0x00494c0a, 0x02bc7258, 0x03034cf7, 0x01b73a58, 0x02667bd5, 0x033389e9, 0x020dd8a3, 0x01e396f8, 0x002d6ad8}}}, + {X: Field{[10]uint32{0x001a4655, 0x0174a717, 0x02ad35b0, 0x007c0b62, 0x02016e0f, 0x02af814a, 0x02f55480, 0x0397ca70, 0x0383dc77, 0x000c4e02}}, Y: Field{[10]uint32{0x0193403d, 0x00ff8999, 0x01b20107, 0x02f06a87, 0x02b42173, 0x020e7342, 0x0034342b, 0x03a9c8f1, 0x03aecc84, 0x0008f32b}}}, + {X: Field{[10]uint32{0x021edd27, 0x0336a02c, 0x0239a764, 0x009e8325, 0x038f3f37, 0x02406554, 0x00b44c7c, 0x01099241, 0x018cbcd5, 0x002b9006}}, Y: Field{[10]uint32{0x00eeba8f, 0x02b988cd, 0x012005cf, 0x0269b0e7, 0x02ffceea, 0x009f6628, 0x01a0e7c8, 0x0333f336, 0x0308ffec, 0x0000e95f}}}, + {X: Field{[10]uint32{0x00a981c8, 0x0093222a, 0x0015f73e, 0x0151c9ed, 0x015764a8, 0x0066ec09, 0x01b1d3ac, 0x0303c492, 0x0387abea, 0x003d1ca5}}, Y: Field{[10]uint32{0x0265d172, 0x02d3a7ab, 0x0319d00a, 0x00542ff9, 0x03b51aae, 0x03851b41, 0x039783fd, 0x004ca31f, 0x01a568d8, 0x0038c458}}}, + {X: Field{[10]uint32{0x02d5884a, 0x03205d5f, 0x03b69ce4, 0x023029f5, 0x02f52d3b, 0x03a13429, 0x0059b617, 0x0224d3dc, 0x02b83414, 0x003e4bc0}}, Y: Field{[10]uint32{0x00864080, 0x00f3d06a, 0x026b706f, 0x023c3eed, 0x03cacd20, 0x031b7a92, 0x00eb5305, 0x00c08222, 0x02f88273, 0x003ebb5f}}}, + {X: Field{[10]uint32{0x00c93363, 0x00f385df, 0x01ec49ed, 0x008acac3, 0x029efe40, 0x007e13f0, 0x028cc4dd, 0x035a082f, 0x00aae93b, 0x0028afb6}}, Y: Field{[10]uint32{0x018ada1d, 0x003277c6, 0x00213d63, 0x02cecfc2, 0x027bf235, 0x03b7ae27, 0x0340f299, 0x01bedf80, 0x01c96212, 0x000a1eae}}}, + {X: Field{[10]uint32{0x03af4724, 0x01063e6d, 0x0198e899, 0x038b80a5, 0x00cf6219, 0x024c204d, 0x0309dc80, 0x00474666, 0x03cd3d18, 0x001690b3}}, Y: Field{[10]uint32{0x013f8423, 0x03ba3c16, 0x007172e0, 0x00f583ee, 0x02e30141, 0x002fc970, 0x02a83b18, 0x0275dac3, 0x021c3992, 0x0025739c}}}, + {X: Field{[10]uint32{0x030e530f, 0x028ae516, 0x0278940b, 0x01ae850d, 0x012e768a, 0x0105d421, 0x03f1eca4, 0x02fc64c8, 0x030567e8, 0x000749ea}}, Y: Field{[10]uint32{0x01e1afa8, 0x00cf9a84, 0x01b07c6c, 0x03775468, 0x02a23e3d, 0x01ac124c, 0x02532be7, 0x00a68562, 0x0139496d, 0x000610e6}}}, + {X: Field{[10]uint32{0x02ab4326, 0x01d2451b, 0x03d319bc, 0x0222dc98, 0x01bbbf80, 0x01337cff, 0x002fcf6e, 0x016fd12d, 0x005922c0, 0x00164afe}}, Y: Field{[10]uint32{0x004c7f65, 0x016f1d00, 0x0201e7d9, 0x01da3dfd, 0x013aaab9, 0x028bab09, 0x03946f3b, 0x03c3bf78, 0x00c38dcc, 0x002132f6}}}, + {X: Field{[10]uint32{0x009359d5, 0x02785bc0, 0x00fcf1dd, 0x015b40f1, 0x010d4df1, 0x03bab710, 0x0001f4ad, 0x036ae2ff, 0x02705ae3, 0x00199cc2}}, Y: Field{[10]uint32{0x038273ee, 0x03d5e81d, 0x03718582, 0x00b1218f, 0x036e8f42, 0x026e7bec, 0x03b91701, 0x0362c89c, 0x00c44ea1, 0x0030131f}}}, + {X: Field{[10]uint32{0x03b7fe83, 0x016453b6, 0x011ae07c, 0x01ee5e52, 0x001ce689, 0x01392158, 0x03b246d8, 0x0082b027, 0x02005324, 0x000f4009}}, Y: Field{[10]uint32{0x00c7d98e, 0x010775e5, 0x0152a532, 0x0074c871, 0x03c221fa, 0x00925148, 0x00c48557, 0x03539def, 0x02642f16, 0x0016f5cc}}}, + {X: Field{[10]uint32{0x03a24487, 0x03509d50, 0x021c061e, 0x02b5c42a, 0x02750395, 0x008b8b0a, 0x0089d37d, 0x0348bf48, 0x02362b5d, 0x000350ab}}, Y: Field{[10]uint32{0x0339ada7, 0x01863fb2, 0x02fc9c2a, 0x0126ca84, 0x00ded0a6, 0x0046dbdf, 0x03cc24ba, 0x0387a94e, 0x02001571, 0x002110e7}}}, + {X: Field{[10]uint32{0x02253743, 0x03c494ea, 0x01670ede, 0x00796f74, 0x00409e10, 0x0063a41d, 0x00b306dc, 0x02aff400, 0x01ca486f, 0x000df1d8}}, Y: Field{[10]uint32{0x010cad12, 0x01fd99ee, 0x033d0627, 0x02a5701f, 0x0129669d, 0x01ecb2e2, 0x02c241ae, 0x0036c627, 0x00e30111, 0x00394e10}}}, + {X: Field{[10]uint32{0x03b0e788, 0x027b42bc, 0x0345b288, 0x0206865c, 0x002afa97, 0x016b035b, 0x0019f371, 0x02f23bae, 0x02f8bbaf, 0x001399cb}}, Y: Field{[10]uint32{0x00814061, 0x03f3d30e, 0x0385204a, 0x02e5464d, 0x03130cb0, 0x018b83aa, 0x000133fe, 0x03601d1a, 0x00dbbb16, 0x0027043c}}}, + {X: Field{[10]uint32{0x03d51fec, 0x01e475a3, 0x03a68ed8, 0x004bcd6a, 0x0108e1df, 0x01bd8a52, 0x00635ae6, 0x01e4a7a7, 0x003b23c0, 0x00307ca5}}, Y: Field{[10]uint32{0x0264ae75, 0x0352ffba, 0x005fdfc4, 0x0319a001, 0x012f2262, 0x029ac441, 0x01f7ef96, 0x017b1664, 0x02c893ad, 0x000cddad}}}, + {X: Field{[10]uint32{0x00370be6, 0x0180abb0, 0x00ffce17, 0x01b5ebf7, 0x01351e82, 0x0198f994, 0x00f10cdf, 0x036611cb, 0x021e739c, 0x000f7c91}}, Y: Field{[10]uint32{0x0292cb06, 0x000340b1, 0x0301fc9f, 0x0295fbab, 0x02bd5ec5, 0x0206b6aa, 0x014eeb00, 0x0303b0d6, 0x00b33ed9, 0x0017923f}}}, + {X: Field{[10]uint32{0x022a82b7, 0x02307cf5, 0x033fd551, 0x009d6d8e, 0x0150f123, 0x02d83f61, 0x004ecfba, 0x024b57d3, 0x0128f98b, 0x003534f5}}, Y: Field{[10]uint32{0x027d5b76, 0x0034b3b6, 0x01a2e049, 0x00ed52c1, 0x01255405, 0x02612f02, 0x01a838ed, 0x01779a64, 0x01508543, 0x0019125b}}}, + {X: Field{[10]uint32{0x0209236b, 0x039f4084, 0x01108b3e, 0x011c3889, 0x03ad6448, 0x00ffc0e9, 0x03a41136, 0x00da3c69, 0x019b4aa3, 0x003b360e}}, Y: Field{[10]uint32{0x01355213, 0x00dc48dd, 0x011af30f, 0x023c1329, 0x01c629d8, 0x00f00b2d, 0x0351e617, 0x0070a438, 0x01fba792, 0x000b8482}}}, + {X: Field{[10]uint32{0x01f78722, 0x00cb8273, 0x01ae38c3, 0x01c1e173, 0x01416d1a, 0x02cd1356, 0x033354af, 0x0036a40c, 0x03e57e6a, 0x00356642}}, Y: Field{[10]uint32{0x03a17814, 0x0316445e, 0x01eceeef, 0x03224e5e, 0x00278f73, 0x01110402, 0x039198d3, 0x01bcf441, 0x018b73f7, 0x002ca8b3}}}, + {X: Field{[10]uint32{0x00374b1b, 0x03c10aa4, 0x0174f85e, 0x0224a1ef, 0x02b57e90, 0x01876007, 0x03d59786, 0x03b402bc, 0x03651d8c, 0x001d662a}}, Y: Field{[10]uint32{0x0028f04f, 0x036d835b, 0x00240b60, 0x021e3d33, 0x027edaae, 0x0008ba7b, 0x000cbd4b, 0x02c7fee7, 0x00269466, 0x001627f1}}}, + {X: Field{[10]uint32{0x01f694e7, 0x0248b3d0, 0x00e7d7e0, 0x03f663af, 0x03be088c, 0x00714c06, 0x02048b76, 0x00b4c614, 0x0017b12d, 0x003f41c5}}, Y: Field{[10]uint32{0x0232c363, 0x013688ef, 0x00b45966, 0x01d163be, 0x00d47d8f, 0x01ad5236, 0x01f679d9, 0x00ee4cab, 0x03f10ee6, 0x000b6714}}}, + {X: Field{[10]uint32{0x0372ca0e, 0x01b3804a, 0x038d15e5, 0x02ff2f0a, 0x02b1e513, 0x03a4d1fc, 0x01571ac8, 0x021a2b47, 0x0190e290, 0x001696d2}}, Y: Field{[10]uint32{0x03ebf968, 0x0186663b, 0x005d5e51, 0x039fa0c5, 0x01424285, 0x0313271f, 0x01569f63, 0x02549150, 0x02f50715, 0x0031da14}}}, + {X: Field{[10]uint32{0x01e7f2bd, 0x023015bf, 0x020f5972, 0x02057cf4, 0x0225c900, 0x01ba9bcd, 0x035a415f, 0x03c5190b, 0x00243cd4, 0x0024f7bb}}, Y: Field{[10]uint32{0x032dc7cb, 0x0217c96f, 0x0336dd5e, 0x0164641d, 0x006abfa8, 0x0150527d, 0x0378145f, 0x00e85987, 0x01beb999, 0x00223e46}}}, + {X: Field{[10]uint32{0x02df82b6, 0x02645f91, 0x02602f5c, 0x01f9d84e, 0x019c9bec, 0x001a350e, 0x01104c93, 0x03659e5a, 0x017ba65a, 0x00248934}}, Y: Field{[10]uint32{0x00a32f65, 0x03bef3c6, 0x0071055c, 0x03ef3d69, 0x001b5691, 0x03ac4193, 0x0289e54e, 0x0293a31d, 0x00e32bc2, 0x000d1b26}}}, + {X: Field{[10]uint32{0x0379c38e, 0x015450ce, 0x011890f0, 0x00ddb956, 0x01cfc916, 0x01cd1e9c, 0x00f054b8, 0x03fe7053, 0x009124dd, 0x002146b3}}, Y: Field{[10]uint32{0x02116f35, 0x031a7307, 0x0213a55c, 0x03c4c3c3, 0x022dd20b, 0x03127715, 0x00527e8c, 0x00730d0c, 0x01f058d2, 0x0036566f}}}, + {X: Field{[10]uint32{0x00ea4d96, 0x0041d7cb, 0x012122b7, 0x004a4c7e, 0x00eff0a6, 0x0120a544, 0x03e01ef4, 0x00471421, 0x0303b7c1, 0x003fdb04}}, Y: Field{[10]uint32{0x034841f6, 0x003ba85e, 0x01574537, 0x03fd6a56, 0x027e99d0, 0x02495417, 0x02239beb, 0x0142a832, 0x03bf7bcf, 0x00093c26}}}, + {X: Field{[10]uint32{0x035fdac0, 0x02f18d90, 0x029d06a4, 0x013d3d32, 0x020fd501, 0x022dbb2d, 0x03fb51ec, 0x02f4750c, 0x01f055e7, 0x003c8ef6}}, Y: Field{[10]uint32{0x016d7b60, 0x00653ba9, 0x03da69d2, 0x01f7c482, 0x0325ba91, 0x03b91d11, 0x02e7012a, 0x026b65a3, 0x00589d26, 0x002594ad}}}, + {X: Field{[10]uint32{0x01f46ff7, 0x01549e92, 0x035642a0, 0x03e4e46e, 0x001fe070, 0x02ef52bc, 0x0023e601, 0x017465ee, 0x0056ea6d, 0x0027588b}}, Y: Field{[10]uint32{0x015c609e, 0x00ea473f, 0x01494e6c, 0x0310b809, 0x02c648c7, 0x01b6cf72, 0x03bd5576, 0x0217fb67, 0x03940d64, 0x0020186e}}}, + {X: Field{[10]uint32{0x03020c13, 0x0342b7cb, 0x03b80370, 0x03795a4c, 0x012915af, 0x001ee658, 0x014b67c4, 0x03579d8e, 0x03e4cff5, 0x0025253b}}, Y: Field{[10]uint32{0x00a7e4ea, 0x016bce16, 0x00a8184f, 0x02e3f4fc, 0x03fd86ec, 0x03908dcb, 0x03964b2d, 0x03873009, 0x0238c85e, 0x002ac31f}}}, + {X: Field{[10]uint32{0x012e1a86, 0x005802a5, 0x03268dbe, 0x01665d00, 0x00e028c2, 0x024e2807, 0x028cb6c2, 0x014bf002, 0x03baffbc, 0x002a3935}}, Y: Field{[10]uint32{0x011a0bed, 0x019f0a4d, 0x0096fc9f, 0x02e72591, 0x02cc7eee, 0x01bc59c8, 0x0379723c, 0x0008b013, 0x003d0dc3, 0x0002356e}}}, + {X: Field{[10]uint32{0x00927ac5, 0x030eed79, 0x00df1f17, 0x02bc5467, 0x01203c01, 0x035cb5e9, 0x03191ad4, 0x01183fbf, 0x0364938e, 0x0020e107}}, Y: Field{[10]uint32{0x03536800, 0x00075e7a, 0x03e4180e, 0x0036c813, 0x02ecb1f3, 0x00105712, 0x03733974, 0x01c92484, 0x00f2c2e8, 0x0003d61a}}}, + {X: Field{[10]uint32{0x020612f6, 0x00f220c0, 0x02acbd62, 0x03da542b, 0x02af2a2d, 0x02d65fec, 0x00dcba67, 0x00fe2a18, 0x00d95ef0, 0x003ba25d}}, Y: Field{[10]uint32{0x00f141ac, 0x0381fe29, 0x0321634e, 0x03ebadf3, 0x016596ab, 0x03e7dd8f, 0x02951453, 0x01775f31, 0x01740308, 0x00173c43}}}, + {X: Field{[10]uint32{0x02579606, 0x0006982d, 0x01857b2d, 0x01ac9a47, 0x01a92dde, 0x0109d8a3, 0x036e5fa3, 0x01b28ec4, 0x018c2361, 0x001a3a23}}, Y: Field{[10]uint32{0x00fd5450, 0x01345e68, 0x03c41257, 0x01ce1a85, 0x01e5ec7b, 0x02da959d, 0x00c5d609, 0x035baf16, 0x00903766, 0x000016a4}}}, + {X: Field{[10]uint32{0x0122345b, 0x031626a5, 0x02e7c50a, 0x016b38ec, 0x00cfe6ab, 0x01333290, 0x01bea794, 0x0322d883, 0x018ac62e, 0x003f8d37}}, Y: Field{[10]uint32{0x03d6c8c0, 0x02ee6fda, 0x025bff0a, 0x03562634, 0x0330c9ed, 0x034f8029, 0x01611d7b, 0x0384894d, 0x0055adf1, 0x002233c0}}}, + {X: Field{[10]uint32{0x0251bc1f, 0x017c8d60, 0x03ff7f6a, 0x019bf462, 0x00099893, 0x004c5cda, 0x0262479c, 0x005226aa, 0x029cc0f8, 0x00108e9e}}, Y: Field{[10]uint32{0x01c678ee, 0x00986f4a, 0x0271fde4, 0x02591cb3, 0x01259ce8, 0x01844b90, 0x02776ea1, 0x0090740b, 0x03dd0519, 0x003249ac}}}, + {X: Field{[10]uint32{0x010b98f4, 0x013c55eb, 0x00e730ed, 0x02d1c9f0, 0x010ffb0e, 0x00b82364, 0x01bb840b, 0x0153ff98, 0x03f97cbf, 0x001fe982}}, Y: Field{[10]uint32{0x0294d733, 0x02cec243, 0x0281f6e7, 0x03b5e5e3, 0x027e296f, 0x01fdcda9, 0x01c7b26a, 0x021ee3f7, 0x02df84d3, 0x00356c6a}}}, + {X: Field{[10]uint32{0x00153a66, 0x01dd0cd8, 0x0098cf1e, 0x01743bbe, 0x01829481, 0x0245fe45, 0x02df8a66, 0x037af1df, 0x030ef1ed, 0x002794f2}}, Y: Field{[10]uint32{0x02b41ccf, 0x03e05fd1, 0x037a2ed8, 0x0273f955, 0x01498349, 0x022faf82, 0x024c6f1b, 0x028a86e6, 0x02f260fe, 0x0014d636}}}, + {X: Field{[10]uint32{0x02d6f119, 0x01a5548e, 0x01e9631e, 0x023a3b24, 0x00140471, 0x0150ccb0, 0x0344ad53, 0x0319de66, 0x0241c616, 0x002b7e4d}}, Y: Field{[10]uint32{0x0242ff9e, 0x00a84edf, 0x00619dfe, 0x01056b4e, 0x028dc172, 0x031ab10a, 0x01f67615, 0x02cf7fd5, 0x02afe4cf, 0x00368f19}}}, + {X: Field{[10]uint32{0x034e4ca8, 0x01bb2d91, 0x02f0c972, 0x0310e5bd, 0x035b6242, 0x02f857d2, 0x0287ddb2, 0x02cd9ec1, 0x03ec485d, 0x0001c078}}, Y: Field{[10]uint32{0x013b9e83, 0x0360644b, 0x00f946f2, 0x033cf44f, 0x03691aa3, 0x001d00dd, 0x01f7fea3, 0x0387140a, 0x027613dc, 0x0004263e}}}, + {X: Field{[10]uint32{0x00ccfefc, 0x0036443e, 0x01e84aac, 0x01781852, 0x02d51364, 0x03149402, 0x01a7e042, 0x02a8167a, 0x03a5d3ec, 0x00363f16}}, Y: Field{[10]uint32{0x034b3d8a, 0x025c225e, 0x01920c25, 0x020f95e3, 0x02df96ee, 0x00e8b7c1, 0x014b4d98, 0x025369d2, 0x034d0eec, 0x001c9c92}}}, + {X: Field{[10]uint32{0x0371398e, 0x03aa0fbf, 0x038dcc9e, 0x027528ce, 0x00c900cb, 0x02aa97c3, 0x018a186f, 0x03fedc19, 0x039a8279, 0x001ef223}}, Y: Field{[10]uint32{0x03a14a7c, 0x01581983, 0x001b0aa9, 0x027c7d56, 0x034939d3, 0x0022ddbd, 0x02d8c77e, 0x02054468, 0x01dfe5ed, 0x00337348}}}, + {X: Field{[10]uint32{0x035ef0e5, 0x01ba845b, 0x019190f4, 0x0297befe, 0x03e5fb92, 0x03c85ca8, 0x0219bc77, 0x02787db8, 0x01310bc7, 0x00215e35}}, Y: Field{[10]uint32{0x03b7d550, 0x01d67344, 0x00290768, 0x0137b45f, 0x00cac2d0, 0x008ce3e7, 0x02ef5e05, 0x018b1a53, 0x02ac39c2, 0x003f346c}}}, + {X: Field{[10]uint32{0x00020a62, 0x0379d62a, 0x010935cd, 0x008112ee, 0x02d41240, 0x01f87302, 0x01eb5f43, 0x01986d51, 0x02d73ea2, 0x00262f08}}, Y: Field{[10]uint32{0x02232226, 0x038530a0, 0x032d9f32, 0x03ca86a8, 0x002607bf, 0x03118be5, 0x02c8d83c, 0x02e96f0a, 0x01de0d33, 0x00050f1f}}}, + {X: Field{[10]uint32{0x01e8ee10, 0x0112c2b5, 0x0001aaca, 0x0197a8f1, 0x019980f2, 0x016fc215, 0x008106ca, 0x005db742, 0x021e95d2, 0x001ff3e0}}, Y: Field{[10]uint32{0x02400284, 0x03b274bf, 0x01cfb266, 0x01506ce2, 0x03c127b0, 0x02389f2a, 0x02f4598e, 0x02bfbbe2, 0x01ae87e7, 0x0009f0d0}}}, + {X: Field{[10]uint32{0x0216a5f1, 0x00a4ba80, 0x02ca8316, 0x01e87f1d, 0x0367acd6, 0x028cd3e4, 0x03e195b6, 0x03bc17e1, 0x01b9d440, 0x0022628e}}, Y: Field{[10]uint32{0x00ce52ef, 0x03290ec6, 0x037c3fc2, 0x0398af53, 0x02c0db80, 0x0113eafe, 0x011cae97, 0x01d394bf, 0x03bbfe32, 0x003ad90b}}}, + {X: Field{[10]uint32{0x032192a4, 0x00e2fd0f, 0x03e3cbf1, 0x009e0cc8, 0x0287d6a6, 0x03c62fe6, 0x01624801, 0x0308582a, 0x00a28918, 0x000fba5d}}, Y: Field{[10]uint32{0x01660d9c, 0x002d56f3, 0x01c63dc5, 0x03f04375, 0x020fde39, 0x0183f483, 0x01d5b2a9, 0x03acd526, 0x02dfac71, 0x003d6ce1}}}, + {X: Field{[10]uint32{0x0047c14a, 0x030fcd90, 0x010a57dd, 0x03d0bed8, 0x019766bb, 0x001b0494, 0x03753eed, 0x037cd26a, 0x012fde76, 0x002f7443}}, Y: Field{[10]uint32{0x02923dec, 0x01d0cc05, 0x03bbd6bc, 0x03da7100, 0x022b8b47, 0x02d1000c, 0x0327664a, 0x01fae6e2, 0x02ed34f9, 0x0014114c}}}, + {X: Field{[10]uint32{0x03edd63d, 0x0028738e, 0x02b23c00, 0x0123105d, 0x02477a51, 0x02e7fca4, 0x039a4a0e, 0x0104913f, 0x00373978, 0x000b05e5}}, Y: Field{[10]uint32{0x032fcfb6, 0x039803c3, 0x00173e37, 0x03dcf98c, 0x002c1ca5, 0x02684aa3, 0x02fcccab, 0x01ecaea0, 0x01844f9b, 0x0028d9ed}}}, + {X: Field{[10]uint32{0x03e71580, 0x0225e62c, 0x01841362, 0x028cb4f3, 0x01a83036, 0x03ba5faf, 0x031e6df6, 0x00744dbd, 0x030ef2d6, 0x000a0bbc}}, Y: Field{[10]uint32{0x03d0f43a, 0x02097738, 0x0286fc47, 0x030c7d63, 0x035b4f9d, 0x028ff247, 0x00252647, 0x03a8b953, 0x0133c350, 0x00242c33}}}, + {X: Field{[10]uint32{0x019eff23, 0x00e31ce2, 0x00ef71ea, 0x03ab6c4e, 0x01085bf6, 0x03b82faf, 0x00ab3d50, 0x03e9f2d5, 0x015542ac, 0x00290ad3}}, Y: Field{[10]uint32{0x03566bb7, 0x03cf3287, 0x030bdb1f, 0x00e83f4b, 0x0363d0e0, 0x009ac2e7, 0x00c49973, 0x02649dd9, 0x0080f10b, 0x0005f8e2}}}, + {X: Field{[10]uint32{0x037ef00e, 0x008947bf, 0x0138b1a0, 0x0295d7cf, 0x01a06fce, 0x02562556, 0x0180d474, 0x00323d2d, 0x0064c5b0, 0x002c8eb3}}, Y: Field{[10]uint32{0x00b6464f, 0x01502a87, 0x007293bc, 0x02b3fe42, 0x03073964, 0x0115fd79, 0x03e6a17d, 0x0193612f, 0x000a7eaa, 0x0019aec6}}}, + {X: Field{[10]uint32{0x01885ea7, 0x0298a3dd, 0x03023411, 0x0273b31d, 0x0189df02, 0x001d45ba, 0x001ce7a4, 0x02c18d1a, 0x00e696ae, 0x000250b7}}, Y: Field{[10]uint32{0x007caf14, 0x00fe02dc, 0x02784ba1, 0x02eb545e, 0x01c439f0, 0x00eabed1, 0x02b06cea, 0x01ecfdad, 0x028a88be, 0x0038822f}}}, + {X: Field{[10]uint32{0x00392d16, 0x01196ae2, 0x020e1610, 0x0253843a, 0x0023e64a, 0x01c7ae52, 0x038e4dbe, 0x013b0208, 0x02b95219, 0x002e29a8}}, Y: Field{[10]uint32{0x03a5fec1, 0x018f5472, 0x015c74cb, 0x03d306d5, 0x0034c7be, 0x010ef896, 0x02758ae3, 0x03b8fdde, 0x0331b8e5, 0x003e00a7}}}, + {X: Field{[10]uint32{0x0068fc20, 0x020ff082, 0x016d90cc, 0x03105e90, 0x02f15fea, 0x0298532d, 0x03db083e, 0x0017dec7, 0x0369a1ee, 0x0028db4c}}, Y: Field{[10]uint32{0x02f0af52, 0x00c9f8dd, 0x01f10e94, 0x03817c28, 0x00aacd2a, 0x02a7f5c5, 0x03b76516, 0x03c9f56d, 0x03f9fe40, 0x00392af5}}}, + {X: Field{[10]uint32{0x008dda1d, 0x03d790c2, 0x00cc0ebe, 0x01a3d142, 0x016f03bd, 0x035bf535, 0x00cc89b9, 0x006b9bff, 0x01083d71, 0x0013a8c0}}, Y: Field{[10]uint32{0x00a3e513, 0x01e4f557, 0x02c83eed, 0x017f3957, 0x0340f9ea, 0x015059b4, 0x0154bcf1, 0x01652419, 0x017a8b1c, 0x00207a66}}}, + {X: Field{[10]uint32{0x02ffdc55, 0x03d0938a, 0x0175ece2, 0x023d01a8, 0x020fee11, 0x0109edc4, 0x0342e62e, 0x02271d91, 0x03161c1c, 0x000808a1}}, Y: Field{[10]uint32{0x03fa35b1, 0x005dd999, 0x02c28bc8, 0x00317b34, 0x0291eaff, 0x00787426, 0x00d28644, 0x029fcd0a, 0x025ecf26, 0x001e0de5}}}, + {X: Field{[10]uint32{0x0070d20c, 0x036dfa18, 0x0384cf5a, 0x024bc599, 0x0395be90, 0x00481848, 0x010d4296, 0x03c5815e, 0x02fc8e4b, 0x0034f01c}}, Y: Field{[10]uint32{0x00daf31a, 0x032ae0b6, 0x01c0cf5b, 0x03ac2bf4, 0x00f412e0, 0x03de6472, 0x015c0faa, 0x01d6eeed, 0x0262594c, 0x001c9a20}}}, + {X: Field{[10]uint32{0x0130ec82, 0x037d8381, 0x03dad3e6, 0x02f729d8, 0x0294003d, 0x0228d534, 0x00e8f342, 0x03e9f33c, 0x007ce307, 0x000a536b}}, Y: Field{[10]uint32{0x0384673d, 0x026d17f3, 0x01ecc0fb, 0x020ebf52, 0x02cfbcc7, 0x0298c279, 0x02807c4b, 0x02a98abb, 0x0222a7bc, 0x0011e7f0}}}, + {X: Field{[10]uint32{0x02732fae, 0x01766b13, 0x0175c707, 0x0027a891, 0x02225de6, 0x01ec9dbf, 0x0042a8d6, 0x03a36790, 0x025cc09f, 0x000e55b2}}, Y: Field{[10]uint32{0x02eaa23e, 0x01e89a8b, 0x00302e28, 0x0075ef5e, 0x03719643, 0x007f58bc, 0x025ee0ce, 0x02414a74, 0x03e7a821, 0x00072597}}}, + {X: Field{[10]uint32{0x01fb3def, 0x03a0afe4, 0x029e697e, 0x0359b61e, 0x014f4109, 0x0125005d, 0x036eb068, 0x012d239c, 0x0396da14, 0x000934b8}}, Y: Field{[10]uint32{0x0372236e, 0x01f43668, 0x0081e76d, 0x01d47f9f, 0x02ea875c, 0x036eb484, 0x01e3c9ce, 0x00bf3f74, 0x037224b0, 0x002ede79}}}, + {X: Field{[10]uint32{0x01a2aa5e, 0x038ae6e6, 0x00d3ab49, 0x0224f84b, 0x01188528, 0x03670be4, 0x03f9619d, 0x01701ff2, 0x0042f16e, 0x0018e350}}, Y: Field{[10]uint32{0x032b3d92, 0x0392acac, 0x024db222, 0x010dd2e2, 0x03f618da, 0x03976051, 0x039eb8b8, 0x00429037, 0x00424f00, 0x0034365e}}}, + {X: Field{[10]uint32{0x030d866c, 0x019e0a23, 0x00c5cd7d, 0x02218da0, 0x0194202d, 0x00c0cb87, 0x0323a1fd, 0x01caeaec, 0x015ba999, 0x0003e46b}}, Y: Field{[10]uint32{0x0052bdc0, 0x02853565, 0x03571e24, 0x0386c344, 0x001cb558, 0x03eccb6b, 0x038bb4fe, 0x005d68e8, 0x0145a693, 0x00182d9b}}}, + {X: Field{[10]uint32{0x02a69b7c, 0x005c9cba, 0x03c39c64, 0x0236239f, 0x039e6af4, 0x01b40dc2, 0x031fb88a, 0x0097c53f, 0x037d779c, 0x000c5504}}, Y: Field{[10]uint32{0x02295f7a, 0x034e7ee4, 0x03b13560, 0x0066c664, 0x02c1980c, 0x00991213, 0x00e112a9, 0x005e28e6, 0x011e9c09, 0x003acef6}}}, + {X: Field{[10]uint32{0x01549597, 0x0072e4d8, 0x01355072, 0x00b65286, 0x01f710be, 0x03475e99, 0x03acb3c1, 0x027f2078, 0x021fdfdf, 0x003e2087}}, Y: Field{[10]uint32{0x018993ec, 0x013116df, 0x002a3f4b, 0x00171ebf, 0x02c5770c, 0x033ca396, 0x03635b9d, 0x014a0946, 0x0068c1e0, 0x002ed41e}}}, + {X: Field{[10]uint32{0x0354a655, 0x013d8fa0, 0x033b06dd, 0x02be1c0c, 0x00ec5d6f, 0x01438eb6, 0x018aa900, 0x0012968b, 0x023a5214, 0x00210251}}, Y: Field{[10]uint32{0x01db3bd4, 0x0215efb8, 0x01ecf91b, 0x00949a68, 0x031b8a65, 0x00edeacd, 0x00c1b668, 0x00b294e7, 0x012b8509, 0x00332651}}}, + {X: Field{[10]uint32{0x003bc471, 0x01041980, 0x01e09f72, 0x0395a08a, 0x02314380, 0x015d1767, 0x0222eb53, 0x01c2d5b6, 0x001112d3, 0x0025a009}}, Y: Field{[10]uint32{0x005d8f38, 0x017e518a, 0x0092ff49, 0x000c4eed, 0x0327d6c7, 0x0165b440, 0x020419d6, 0x030807fe, 0x01377f03, 0x00376b0b}}}, + {X: Field{[10]uint32{0x023a69c8, 0x027f0fe8, 0x01393d3f, 0x01fda329, 0x020f85e8, 0x005c2547, 0x03628244, 0x00568571, 0x02ec9f57, 0x002746ae}}, Y: Field{[10]uint32{0x0328cadf, 0x02b4a2cf, 0x03bdd149, 0x039e6219, 0x0071b010, 0x02508d4e, 0x00c89e62, 0x02d8708e, 0x030050db, 0x003c87b9}}}, + {X: Field{[10]uint32{0x001f7ae6, 0x01d0b585, 0x03a32f72, 0x02816166, 0x019886d6, 0x012c10dc, 0x03234b6a, 0x02bd1b0d, 0x02918db3, 0x0007ee59}}, Y: Field{[10]uint32{0x001f7379, 0x035560b5, 0x00ecab09, 0x01e08101, 0x02a17b55, 0x03a69096, 0x034c4426, 0x03f647df, 0x02cc207e, 0x0022f04f}}}, + {X: Field{[10]uint32{0x021ec7b8, 0x00876da7, 0x01281ee2, 0x03c169e0, 0x02416d54, 0x0010a3a2, 0x00bcb23e, 0x0136ac26, 0x0364b927, 0x0008b678}}, Y: Field{[10]uint32{0x02d8407d, 0x01219780, 0x024c1c1e, 0x0244a3e4, 0x014c300a, 0x01d3a546, 0x0399195b, 0x01f6d795, 0x0258f93d, 0x0017708c}}}, + {X: Field{[10]uint32{0x0073e45d, 0x01ca5efe, 0x03ff8398, 0x030091f2, 0x01adb168, 0x0161d04c, 0x0166766d, 0x020fecc0, 0x0050aed0, 0x001897e9}}, Y: Field{[10]uint32{0x0376bb7b, 0x007d9121, 0x011175a2, 0x02196e39, 0x00fbb5a2, 0x0280913c, 0x0185ed21, 0x03241195, 0x0104473d, 0x001c82a0}}}, + {X: Field{[10]uint32{0x02a2147f, 0x020bcde9, 0x028ff01f, 0x003fc86b, 0x002deacc, 0x009a06ba, 0x03b01c2e, 0x03f0977b, 0x01c19b6d, 0x00092b2c}}, Y: Field{[10]uint32{0x03ca5d4b, 0x02647774, 0x03d52783, 0x036b7ebd, 0x0193f50a, 0x01c6aaf8, 0x00abdcdb, 0x0201862a, 0x0335210e, 0x003dca74}}}, + {X: Field{[10]uint32{0x035ab555, 0x004c0b3d, 0x0339f33c, 0x025ae96c, 0x036c6d18, 0x02fdf6ce, 0x02328e3b, 0x00c353ce, 0x0003a99d, 0x0034a15a}}, Y: Field{[10]uint32{0x0292d6ff, 0x02727681, 0x00fdf568, 0x0224f9e0, 0x012b814a, 0x02d06dc9, 0x0098bbf1, 0x016e1d8b, 0x014d6470, 0x00259266}}}, + {X: Field{[10]uint32{0x00b5fe0a, 0x002f2613, 0x0031b50a, 0x023cef1e, 0x008fb529, 0x01c797f6, 0x01e95ef8, 0x01a212c5, 0x02659d19, 0x002014a7}}, Y: Field{[10]uint32{0x00b3b778, 0x0391dbc4, 0x02de6e9a, 0x02a1d3a1, 0x000b74b4, 0x01696c9a, 0x01e50bfc, 0x02faa3bf, 0x024f9ae4, 0x0021a2cf}}}, + {X: Field{[10]uint32{0x0328e183, 0x01d35fa1, 0x01dded06, 0x005a54fc, 0x030e0bb3, 0x02710c9d, 0x0288e494, 0x0007b574, 0x01aa3b82, 0x001fe466}}, Y: Field{[10]uint32{0x025288b9, 0x0387e7c6, 0x01e2ffcb, 0x0107765f, 0x00ee9d7e, 0x029c89a3, 0x02c174a3, 0x0080a551, 0x0273d037, 0x00006ae9}}}, + {X: Field{[10]uint32{0x0029ecbc, 0x0322598b, 0x02fb76d0, 0x01b59134, 0x0129b456, 0x03332c64, 0x004674cd, 0x0167d923, 0x008508e9, 0x001f4cb2}}, Y: Field{[10]uint32{0x02d39698, 0x0000d081, 0x013e866e, 0x0278c7d5, 0x02875ea9, 0x01971ce1, 0x011afb8e, 0x03fba325, 0x00ecb50b, 0x003643a5}}}, + {X: Field{[10]uint32{0x011abfbf, 0x020678cb, 0x0374cbf8, 0x03feb67a, 0x011f1727, 0x02f46fc0, 0x02ce67eb, 0x03b3215d, 0x01c09291, 0x003cae58}}, Y: Field{[10]uint32{0x0126f795, 0x001c408c, 0x00524017, 0x002b5030, 0x00ed0aec, 0x0195bd8e, 0x00382208, 0x01a8d91b, 0x00495a1e, 0x003aff96}}}, + {X: Field{[10]uint32{0x01be876e, 0x02efefe0, 0x02676f75, 0x005d3a62, 0x026b4ae3, 0x025c606c, 0x02d6a728, 0x00ca465c, 0x02899528, 0x00366831}}, Y: Field{[10]uint32{0x02bfa042, 0x03e31eb1, 0x00d922b7, 0x024eecd4, 0x01e9039b, 0x034fc0c2, 0x0164d974, 0x02f26b45, 0x0086a0ac, 0x0034daba}}}, + {X: Field{[10]uint32{0x007c3e0a, 0x0375205f, 0x0269fbe2, 0x0048c2ce, 0x00fff299, 0x002af7d7, 0x01b2aa71, 0x01f23264, 0x03246aeb, 0x0031e8d8}}, Y: Field{[10]uint32{0x01c9e21f, 0x016c3001, 0x025f815f, 0x01235b47, 0x0102b321, 0x02d2cb52, 0x01863026, 0x0234b5e6, 0x01d70e44, 0x0004a63f}}}, + {X: Field{[10]uint32{0x00985a86, 0x010853f9, 0x00ac4830, 0x01931ff8, 0x02640d24, 0x036fd58e, 0x02535a04, 0x034ef019, 0x03a05064, 0x0018d735}}, Y: Field{[10]uint32{0x01e3ae1f, 0x014f89fa, 0x01a4ce04, 0x011fcca0, 0x00e8d5f0, 0x03e78bcc, 0x0335cfca, 0x01dfd919, 0x0265913e, 0x00003900}}}, + {X: Field{[10]uint32{0x009ee5f5, 0x02478426, 0x00adcc5b, 0x02dc85a7, 0x02eca54b, 0x0256d206, 0x035b6326, 0x03a894df, 0x024f38ed, 0x00017698}}, Y: Field{[10]uint32{0x02721779, 0x0035dc72, 0x02505a22, 0x0088dec5, 0x0248c288, 0x00e9495b, 0x03aeeb24, 0x000c03ff, 0x01baa108, 0x0034fa9b}}}, + {X: Field{[10]uint32{0x007d4d5e, 0x024a13fa, 0x0080efe1, 0x0230a5db, 0x01ce0527, 0x03f92db5, 0x001f6871, 0x01d7b24b, 0x00a2b197, 0x002a93d9}}, Y: Field{[10]uint32{0x02d4f240, 0x01e4f70f, 0x0118e293, 0x00a20e59, 0x00224ea0, 0x0160e99b, 0x036e9499, 0x0383eda5, 0x017e95fc, 0x003ce7c4}}}, + {X: Field{[10]uint32{0x027e0641, 0x02d70d90, 0x038c1477, 0x03b3af8d, 0x01d60969, 0x00b81554, 0x0293f266, 0x006d088a, 0x00ea99ff, 0x0026d946}}, Y: Field{[10]uint32{0x0393165a, 0x01d21f63, 0x0165627b, 0x03147508, 0x01bebdf7, 0x0014cbfe, 0x02ea9dd3, 0x03eced0e, 0x02558650, 0x000ba7c5}}}, + {X: Field{[10]uint32{0x0297b562, 0x024f402b, 0x011594b1, 0x01ffec40, 0x006547f4, 0x03772fae, 0x02011381, 0x00b83e87, 0x02a2b597, 0x001b26e6}}, Y: Field{[10]uint32{0x0275e27d, 0x01280e18, 0x02d3b162, 0x02c99d1d, 0x02a6e78e, 0x034816f6, 0x0123d0f9, 0x01c74af9, 0x011c8d4c, 0x002bc276}}}, + {X: Field{[10]uint32{0x03467cbe, 0x019984b6, 0x01f71f53, 0x031a8df9, 0x00cf80ae, 0x031c44a8, 0x02365410, 0x02571579, 0x00803cdc, 0x0028a872}}, Y: Field{[10]uint32{0x0223fc09, 0x02e6cb53, 0x02fc273e, 0x00683108, 0x01802e2e, 0x00352c5d, 0x025410d5, 0x03c103ff, 0x030f3638, 0x003133d5}}}, + {X: Field{[10]uint32{0x03650427, 0x010df96a, 0x008a9ca8, 0x02b883cb, 0x0213102b, 0x02225cd9, 0x025af104, 0x033358d2, 0x0350c961, 0x00018f4d}}, Y: Field{[10]uint32{0x02339248, 0x01c01163, 0x03fa06d6, 0x03c1c4e4, 0x01f21125, 0x0261d0a8, 0x01e90dc6, 0x0269d9cb, 0x033274b3, 0x0021d054}}}, + {X: Field{[10]uint32{0x02bdd04a, 0x00582c94, 0x0130e1f5, 0x02fc66da, 0x00bcc97d, 0x02117453, 0x013e8fb5, 0x02095429, 0x0266e442, 0x002341c3}}, Y: Field{[10]uint32{0x01487ecd, 0x036a3766, 0x00bb2497, 0x02433bbd, 0x0248cdef, 0x005cf348, 0x0084099f, 0x013c1326, 0x00824f2b, 0x0012f263}}}, + {X: Field{[10]uint32{0x0291c8bd, 0x02ff4ad2, 0x01456175, 0x037decd8, 0x03e3f3d4, 0x03305963, 0x00143950, 0x00022ed4, 0x02a72e5f, 0x003c7f95}}, Y: Field{[10]uint32{0x01f275f2, 0x03219bbd, 0x017b2be2, 0x017ffa29, 0x03a19caa, 0x00da2159, 0x01e302ad, 0x01f69740, 0x02bee57a, 0x002f97ff}}}, + {X: Field{[10]uint32{0x03554b21, 0x01a87f9c, 0x01635747, 0x02756bb3, 0x03b41239, 0x019d6f31, 0x0271a950, 0x025a7a6e, 0x02dbd2eb, 0x00200b26}}, Y: Field{[10]uint32{0x0372bc5e, 0x008b84d9, 0x007efb74, 0x0326f841, 0x02cc3344, 0x01c3e703, 0x026527d3, 0x0339a59b, 0x0026f547, 0x001084c8}}}, + {X: Field{[10]uint32{0x0093db56, 0x020812c5, 0x02745c71, 0x0293c5e2, 0x009d24cd, 0x02f1e965, 0x030a5cda, 0x03b48803, 0x02c09d6c, 0x00256c6d}}, Y: Field{[10]uint32{0x02adb01d, 0x0002752d, 0x023ddf69, 0x0074db2c, 0x0127b233, 0x01b3c903, 0x00ce5e9a, 0x00f45ab2, 0x02815303, 0x002f050d}}}, + {X: Field{[10]uint32{0x02ede35d, 0x0120e9a9, 0x0169d2d6, 0x01bb5dac, 0x017b79a0, 0x005c08bc, 0x03b2aa4e, 0x013ab860, 0x012901f9, 0x0003abb5}}, Y: Field{[10]uint32{0x01d559b3, 0x009fee57, 0x03f8f9cb, 0x01f266b1, 0x00bc6e37, 0x02b5aebc, 0x02c1efa3, 0x02267376, 0x027691c5, 0x0014f56c}}}, + {X: Field{[10]uint32{0x0027d770, 0x02dcd667, 0x02abeac7, 0x0038d9ef, 0x03906d69, 0x03bcfdfc, 0x02b485b6, 0x011231cb, 0x03e59f6f, 0x001df113}}, Y: Field{[10]uint32{0x031102fd, 0x008bbafe, 0x009d3833, 0x027feb31, 0x00e6629c, 0x038f5ace, 0x00f03604, 0x003e00b3, 0x00226c44, 0x002f35d4}}}, + {X: Field{[10]uint32{0x000a0306, 0x02b97ef9, 0x0144efad, 0x01e55046, 0x00011b62, 0x0364daa2, 0x0352002c, 0x00291ad9, 0x02e2f00f, 0x003a18ec}}, Y: Field{[10]uint32{0x03243a5f, 0x03f81119, 0x00358b36, 0x01f59802, 0x01c2ed93, 0x00c7a3ab, 0x039caff6, 0x027c5c16, 0x03a36da2, 0x002d71e6}}}, + {X: Field{[10]uint32{0x02f8f191, 0x0079cbbb, 0x02dec272, 0x02d3cf73, 0x003883ad, 0x02b68c26, 0x03eedda4, 0x01c742cb, 0x03ef93df, 0x00089bd6}}, Y: Field{[10]uint32{0x001707c3, 0x008cf39d, 0x00fbcc13, 0x022f5d73, 0x00f96607, 0x02116186, 0x00a08fbe, 0x02f05228, 0x00b52bce, 0x00282481}}}, + {X: Field{[10]uint32{0x03467184, 0x03a40da0, 0x0046e3a4, 0x0292bfdf, 0x02c33bed, 0x031bc237, 0x03a82b39, 0x01f14e7c, 0x03b08c1e, 0x002a888b}}, Y: Field{[10]uint32{0x001c3765, 0x03590c5f, 0x01d4ac5d, 0x00a641ad, 0x01c1653d, 0x01b7fe4c, 0x01a7c3aa, 0x03f4e608, 0x01cf21ca, 0x00010441}}}, + {X: Field{[10]uint32{0x01fec96a, 0x01d53c78, 0x01a82239, 0x033048db, 0x01f94482, 0x025ec540, 0x01220bb3, 0x013b4f71, 0x02cd26ef, 0x00061e70}}, Y: Field{[10]uint32{0x01f0d67d, 0x01c96ddc, 0x01351464, 0x01472dcf, 0x024fc689, 0x00758c10, 0x03b16092, 0x03785247, 0x033575ea, 0x00244b57}}}, + {X: Field{[10]uint32{0x009902e0, 0x01fb2c6b, 0x03b76765, 0x007af70a, 0x026df621, 0x01c352df, 0x024cfc59, 0x03622fd2, 0x00a4e7ee, 0x002f8e79}}, Y: Field{[10]uint32{0x0227cb4e, 0x03311d9f, 0x00899f94, 0x02915857, 0x0132ae54, 0x0133d692, 0x006d9a2b, 0x029edd8c, 0x00f113fc, 0x00362c79}}}, + {X: Field{[10]uint32{0x012d5786, 0x02f70bdd, 0x00631d3f, 0x0391f3d1, 0x001c2912, 0x01b0fe2a, 0x03028368, 0x0230f740, 0x03ce3337, 0x0007a9cb}}, Y: Field{[10]uint32{0x0348906e, 0x002e220d, 0x007c9aed, 0x02c201ff, 0x000cb6e2, 0x03941ade, 0x03f261af, 0x03745333, 0x0158fe1c, 0x003883d1}}}, + {X: Field{[10]uint32{0x02036806, 0x0198beb6, 0x032423ac, 0x0046dd36, 0x022d0ca0, 0x00caf0e5, 0x00638e6f, 0x03d5f7a3, 0x03dd67bf, 0x00015b8c}}, Y: Field{[10]uint32{0x0393f461, 0x00ee4ff0, 0x02e2efbb, 0x033cf853, 0x0350d78e, 0x007795ef, 0x0317d4e4, 0x01c4c024, 0x00cc165e, 0x00100e70}}}, + {X: Field{[10]uint32{0x000f37ad, 0x01c330ba, 0x034470c4, 0x0153c429, 0x02d036ce, 0x00e2e78f, 0x02fb95a7, 0x03637c72, 0x0291a5f1, 0x00146605}}, Y: Field{[10]uint32{0x01972261, 0x02a998b1, 0x03664d31, 0x03711c7b, 0x01d03fab, 0x03a5fc11, 0x026e3c26, 0x00aa641d, 0x004767cf, 0x00027ee4}}}, + {X: Field{[10]uint32{0x00869dbd, 0x03165e66, 0x03f3016e, 0x02e6f355, 0x02b90db9, 0x03e49e65, 0x00be7f95, 0x025e0dac, 0x028577a5, 0x003bce95}}, Y: Field{[10]uint32{0x037c5e07, 0x030f6306, 0x024d372a, 0x00d92ed4, 0x03fabe11, 0x0387d1e0, 0x01782c6a, 0x01d27a52, 0x0057ff22, 0x001473f9}}}, + {X: Field{[10]uint32{0x03196415, 0x0301836b, 0x00a22523, 0x020814c1, 0x0379a668, 0x038f190c, 0x029e0b16, 0x0216e9fb, 0x02a18c3a, 0x003bf194}}, Y: Field{[10]uint32{0x00f7b2a5, 0x0111ecd5, 0x01d49737, 0x00726302, 0x038fcee7, 0x01661c20, 0x01b2498f, 0x006bcc07, 0x0014cef9, 0x0022995b}}}, + {X: Field{[10]uint32{0x004bbf82, 0x00dc2862, 0x015def07, 0x018b012a, 0x018adc79, 0x0226203c, 0x00021983, 0x0338b366, 0x03eff4d5, 0x00337687}}, Y: Field{[10]uint32{0x01e31d6c, 0x01726c12, 0x0235a0e5, 0x02ae14d8, 0x024417f9, 0x0291e058, 0x019174b4, 0x0370175e, 0x03fcb0c9, 0x0022f09b}}}, + {X: Field{[10]uint32{0x016cf0d4, 0x021a11ee, 0x03a3f938, 0x02b370e8, 0x00d46bb6, 0x01f7b750, 0x00b76d77, 0x02a84c4d, 0x01853454, 0x001bcfce}}, Y: Field{[10]uint32{0x00adba81, 0x03b1724b, 0x01637e4e, 0x02479592, 0x00b6e324, 0x029020d1, 0x03e5192e, 0x0286d6b9, 0x019c4f7c, 0x002a2e92}}}, + {X: Field{[10]uint32{0x014b13e4, 0x033577f9, 0x01ee8061, 0x01f61452, 0x03a2a362, 0x03636013, 0x0042065e, 0x03ee0faa, 0x01af91ab, 0x00394b44}}, Y: Field{[10]uint32{0x01cfff97, 0x00e384aa, 0x01069468, 0x00f438fb, 0x012e132a, 0x039cca17, 0x021f6ed4, 0x0159cb2c, 0x006d619e, 0x00167cc4}}}, + {X: Field{[10]uint32{0x027256ff, 0x0033e8e7, 0x02ac066c, 0x01a70c38, 0x038fb918, 0x00cacf2a, 0x0254d13b, 0x0072d915, 0x0336f0de, 0x00227fb1}}, Y: Field{[10]uint32{0x03e44274, 0x01156b81, 0x01ded46b, 0x036ed63d, 0x0173e708, 0x037f798b, 0x02b938d9, 0x0069b6da, 0x02e84d3e, 0x003e505e}}}, + {X: Field{[10]uint32{0x02b70b29, 0x036b0248, 0x03f7531b, 0x0082a240, 0x03522615, 0x000a1d27, 0x006ce733, 0x00154f3a, 0x035691b1, 0x00014503}}, Y: Field{[10]uint32{0x022dc024, 0x019f5caa, 0x00afd0dd, 0x002fe894, 0x00ad0acf, 0x007033a4, 0x021f4ce2, 0x0308f401, 0x022b9e02, 0x00246865}}}, + {X: Field{[10]uint32{0x01267b5c, 0x0243f21f, 0x00d09c0f, 0x03ae1548, 0x030579d0, 0x034cbe52, 0x035e199e, 0x02645c41, 0x01309310, 0x0000f058}}, Y: Field{[10]uint32{0x00ac64c3, 0x01f4dade, 0x00e51a5f, 0x03297a00, 0x01e9f156, 0x01a4eb00, 0x02a00107, 0x0036e40e, 0x00dfe404, 0x00354341}}}, + {X: Field{[10]uint32{0x03e8bac9, 0x00fbae26, 0x01fa8be1, 0x014a4474, 0x02a2d0b9, 0x00090154, 0x00b8a58f, 0x0008dc96, 0x010e63a5, 0x003f61da}}, Y: Field{[10]uint32{0x021b9225, 0x013fa922, 0x0247458e, 0x038eb144, 0x03b40f04, 0x011ff19a, 0x023ee352, 0x01a3d5be, 0x01acccb9, 0x00101b70}}}, + {X: Field{[10]uint32{0x01a12a81, 0x01d0d2f5, 0x01347ebc, 0x0381aa36, 0x0299005c, 0x01cecca3, 0x028ad599, 0x01e3ccb3, 0x01de017e, 0x00023934}}, Y: Field{[10]uint32{0x01a2a8ae, 0x0065006c, 0x036da429, 0x02a230c6, 0x02992baf, 0x02efc362, 0x00c843b4, 0x029975d1, 0x033e744c, 0x00318d23}}}, + {X: Field{[10]uint32{0x007743c2, 0x00e6831b, 0x03ff6ea7, 0x001059de, 0x02f49881, 0x029632aa, 0x03b6eebb, 0x0319e05c, 0x03cfea62, 0x000e0b1e}}, Y: Field{[10]uint32{0x01c5eb7d, 0x0154e69a, 0x035237cf, 0x0372bf34, 0x0267e9ad, 0x000703da, 0x01f7f27e, 0x01090d4f, 0x01da77e6, 0x00006429}}}, + {X: Field{[10]uint32{0x0114ed0f, 0x0364357e, 0x01d29e87, 0x03254efd, 0x0125b0da, 0x03a941e5, 0x01fa471b, 0x01201d4e, 0x034e74b8, 0x003d5aa2}}, Y: Field{[10]uint32{0x0096db8b, 0x00547ef0, 0x01a48c50, 0x00704e45, 0x008f9f20, 0x01a9ba89, 0x03881c65, 0x039848ea, 0x0108da57, 0x001515b6}}}, + {X: Field{[10]uint32{0x03965b80, 0x03f6c185, 0x02a044ec, 0x00b157c4, 0x003af365, 0x005ae031, 0x02f8ea2b, 0x0155e87f, 0x03fb6a5e, 0x002423a7}}, Y: Field{[10]uint32{0x038bc2ce, 0x0379d6a1, 0x02043562, 0x0253b5ad, 0x03b9c010, 0x03af0c4d, 0x0182ca07, 0x0133c3e0, 0x00c9d1b1, 0x002fab8a}}}, + {X: Field{[10]uint32{0x02c86ef4, 0x00b9ba6f, 0x01e787ef, 0x012e6750, 0x033fad25, 0x014a4d3a, 0x03225330, 0x0207f45a, 0x03184333, 0x0029b0c1}}, Y: Field{[10]uint32{0x023fb818, 0x024015d8, 0x026f44bf, 0x020817b8, 0x029e266f, 0x000c271c, 0x01129e4e, 0x01440813, 0x0286a60d, 0x0011ea68}}}, + {X: Field{[10]uint32{0x00b3e903, 0x019bade6, 0x01361047, 0x038d28a6, 0x0230a652, 0x00af882b, 0x01461635, 0x00b0980b, 0x01866c3e, 0x002522eb}}, Y: Field{[10]uint32{0x01c35164, 0x01312136, 0x00d3395b, 0x0129da86, 0x004321da, 0x02457783, 0x0043b0f0, 0x0228ae67, 0x0222ad47, 0x000c34c1}}}, + {X: Field{[10]uint32{0x00f6a3f2, 0x03a13487, 0x02c9f0c9, 0x0373e5b4, 0x029d536e, 0x021e0b4d, 0x03881251, 0x005eb9dd, 0x039dcb8a, 0x0035b24a}}, Y: Field{[10]uint32{0x02de09b9, 0x00412bca, 0x0207b9e0, 0x00923b08, 0x030ed686, 0x02bb1752, 0x030ae881, 0x020dde5e, 0x03a09351, 0x003764d9}}}, + {X: Field{[10]uint32{0x01566abd, 0x03bc3f59, 0x0232854c, 0x00269d6b, 0x037b0822, 0x0137e00b, 0x00641ca6, 0x004f591b, 0x017b7d8b, 0x003e7fcf}}, Y: Field{[10]uint32{0x02deec98, 0x0396580c, 0x011c8c84, 0x00a2861c, 0x01b9269d, 0x00f60474, 0x02230224, 0x008257dc, 0x019e1f19, 0x002b1618}}}, + {X: Field{[10]uint32{0x02c8d5e0, 0x00a3dba4, 0x014e1c35, 0x01fe0d34, 0x017f4e76, 0x00a0dfb5, 0x009a9204, 0x0383dc08, 0x01ba3a70, 0x000f6b87}}, Y: Field{[10]uint32{0x000f797f, 0x0134154a, 0x0332e08b, 0x0367aa64, 0x015c7816, 0x03ffa1f2, 0x03cdfad3, 0x03cb3f87, 0x028d6ea1, 0x001eb891}}}, + {X: Field{[10]uint32{0x01b49937, 0x012c0746, 0x007cad0b, 0x01f836ef, 0x008ffd22, 0x03caabac, 0x03ffe130, 0x024df272, 0x01056fcc, 0x0009c114}}, Y: Field{[10]uint32{0x03fa4397, 0x029a63c7, 0x02ad4d08, 0x03d710a1, 0x01bbd801, 0x01875b1d, 0x00d37246, 0x03f7f888, 0x02546c24, 0x00045d9a}}}, + {X: Field{[10]uint32{0x00defd22, 0x00359788, 0x00865bb9, 0x01599271, 0x012024c5, 0x018beea0, 0x00340752, 0x0183bb35, 0x03f96c32, 0x003e7657}}, Y: Field{[10]uint32{0x03a13c2d, 0x0009af05, 0x01dda24b, 0x0128696c, 0x030a89d5, 0x00c11cc2, 0x02632ba8, 0x00504602, 0x03fd8f74, 0x000df2fd}}}, + {X: Field{[10]uint32{0x01a7021f, 0x02d5f171, 0x0021448a, 0x02ef6e64, 0x02ff0a86, 0x019b3ef9, 0x018c6d5b, 0x019fa7fb, 0x0318f90f, 0x00013a37}}, Y: Field{[10]uint32{0x02a621f5, 0x024ff6bc, 0x0329ea22, 0x03f4ea0d, 0x000e9bad, 0x02cd210f, 0x03a2b1b3, 0x01904d14, 0x00c5ccf5, 0x001f9a7e}}}, + {X: Field{[10]uint32{0x02ffef9f, 0x016dde74, 0x01821c8a, 0x02f4ef8d, 0x00ab3d32, 0x00f19916, 0x02783836, 0x01fec86e, 0x012a710a, 0x00230a93}}, Y: Field{[10]uint32{0x025511d6, 0x016ab18d, 0x01205caa, 0x0247fce7, 0x03f82d8f, 0x006f595d, 0x01715157, 0x00960d18, 0x007d27e4, 0x00354c91}}}, + {X: Field{[10]uint32{0x03654b75, 0x010f3be1, 0x00e19631, 0x007b52c1, 0x02c10e81, 0x023eb9cb, 0x00677afa, 0x027339bf, 0x03a01974, 0x000a2dfc}}, Y: Field{[10]uint32{0x005ec782, 0x035698e1, 0x03e392ce, 0x00c699e3, 0x01e241ba, 0x01c7d287, 0x017c881e, 0x02ace456, 0x01eb3245, 0x0000c11c}}}, + {X: Field{[10]uint32{0x01be416b, 0x01b5f6d6, 0x0300808f, 0x025033d2, 0x02d89f64, 0x02667b23, 0x03b5acb0, 0x039cb095, 0x010ffcb8, 0x0032d1d3}}, Y: Field{[10]uint32{0x016622fd, 0x00c146a8, 0x000c7e3a, 0x02cfbff0, 0x029a0e59, 0x01d67e15, 0x039a9508, 0x00f2ee2a, 0x00cefc29, 0x003fdf34}}}, + {X: Field{[10]uint32{0x0055b36c, 0x01ecd7d0, 0x023f5bd5, 0x00d0ba65, 0x011a1800, 0x0378a929, 0x01567fbe, 0x02f10099, 0x01825dbe, 0x0030cf9a}}, Y: Field{[10]uint32{0x0146be18, 0x023b0b31, 0x01e0db79, 0x02d64694, 0x02082c0c, 0x0266ac19, 0x03b50615, 0x01973894, 0x03f57ce2, 0x0008bfcf}}}, + {X: Field{[10]uint32{0x01bd2237, 0x01060e06, 0x00a0eee3, 0x0116cf43, 0x03257e07, 0x01112a6a, 0x02441a84, 0x01c48dc6, 0x010644d3, 0x00212ff0}}, Y: Field{[10]uint32{0x009ef6f1, 0x00861eca, 0x0235ae1c, 0x00847b38, 0x03afd7f4, 0x00f9065e, 0x03d13ffb, 0x03dc1b0c, 0x02d57b7a, 0x001f2f95}}}, + {X: Field{[10]uint32{0x017b713a, 0x026594fe, 0x008dc735, 0x02296c12, 0x03606302, 0x01f820d7, 0x000f003f, 0x00913bf5, 0x02ecd53b, 0x000270c4}}, Y: Field{[10]uint32{0x02b76d14, 0x01126c53, 0x01fe6165, 0x0297fb90, 0x0059698b, 0x00622d3a, 0x00d0b160, 0x01dfbe15, 0x010f58fc, 0x00046f2f}}}, + {X: Field{[10]uint32{0x0315cefc, 0x02a0b72b, 0x004332d0, 0x006b8074, 0x01d474f6, 0x00eef3c8, 0x0183bf4e, 0x01bcb433, 0x0359a22d, 0x001701ab}}, Y: Field{[10]uint32{0x0322aae8, 0x02059690, 0x02be2904, 0x02c50978, 0x0341fbef, 0x0319a6ab, 0x006d70d6, 0x0197f6a3, 0x03e9f1c2, 0x0011dad2}}}, + {X: Field{[10]uint32{0x01b6bdcf, 0x03516cfc, 0x002bf2d6, 0x01c72118, 0x03f44f0d, 0x02bce7ae, 0x000eb547, 0x03b50ed3, 0x01c681a3, 0x001ddc96}}, Y: Field{[10]uint32{0x033bf754, 0x037861fe, 0x02bba22f, 0x0273d58f, 0x03d6742b, 0x0320d199, 0x00448514, 0x02162bbb, 0x03535481, 0x0022a74d}}}, + {X: Field{[10]uint32{0x01266842, 0x00831410, 0x0283ce38, 0x03101d98, 0x020174b8, 0x03409137, 0x024328b4, 0x03074c53, 0x001eae1f, 0x002cdc18}}, Y: Field{[10]uint32{0x00125ac0, 0x00da0d2f, 0x029323e1, 0x02a9010a, 0x03eda7b5, 0x036603b8, 0x02a9abc8, 0x030ec1d4, 0x00792174, 0x0023bc14}}}, + {X: Field{[10]uint32{0x02fe6584, 0x022b23b6, 0x028bf824, 0x015ac054, 0x02780868, 0x01c25c81, 0x032ad406, 0x01924a91, 0x02c07f8d, 0x0016be52}}, Y: Field{[10]uint32{0x022daf1a, 0x030e59b9, 0x016552a9, 0x035e33f9, 0x00b40dff, 0x03bd7d5b, 0x01f32efc, 0x03794475, 0x03ce57ea, 0x00229531}}}, + {X: Field{[10]uint32{0x030586c6, 0x032e39d6, 0x0194581a, 0x007cfe51, 0x034f84b4, 0x0160cbcd, 0x01d4f23c, 0x01c154e1, 0x019ce2e8, 0x0023f8f0}}, Y: Field{[10]uint32{0x01728c28, 0x013d6b24, 0x03860067, 0x005c055b, 0x012f5e20, 0x02bc64f2, 0x0314d491, 0x01130e90, 0x019fd16f, 0x003e48c2}}}, + {X: Field{[10]uint32{0x03ac9a71, 0x00a23f04, 0x02fc3b5f, 0x01fe8dee, 0x01e531d1, 0x026d97ad, 0x01211b30, 0x02f4797e, 0x021d2642, 0x00356025}}, Y: Field{[10]uint32{0x034185cb, 0x0225fa46, 0x03650e4f, 0x03716ce3, 0x02d9678c, 0x02c4bea1, 0x0250a6e0, 0x022d0cdb, 0x0154337e, 0x00140301}}}, + {X: Field{[10]uint32{0x0295e82b, 0x033efc50, 0x01405256, 0x019d6a71, 0x02234e79, 0x019e430c, 0x02460338, 0x02988d27, 0x00ed529f, 0x00009577}}, Y: Field{[10]uint32{0x01799815, 0x03d2d29f, 0x00b100c8, 0x033653db, 0x035dfba7, 0x02a918c5, 0x03253d3f, 0x0071eff0, 0x01c47f3e, 0x001fbb6a}}}, + {X: Field{[10]uint32{0x00891557, 0x02f908bb, 0x004580bd, 0x00e2a376, 0x031a27c3, 0x03923957, 0x00476a4a, 0x01147eae, 0x03a79240, 0x0012dfaf}}, Y: Field{[10]uint32{0x01b59085, 0x00f60fa1, 0x012848c6, 0x035f90a1, 0x02c12622, 0x035fb604, 0x00a23cfa, 0x00d7d83f, 0x00e9f891, 0x0037ec98}}}, + {X: Field{[10]uint32{0x032fbf28, 0x01fd5547, 0x00c7d8f4, 0x0274ef45, 0x01311956, 0x0319dc67, 0x035819e0, 0x024aa68e, 0x03809e60, 0x00246741}}, Y: Field{[10]uint32{0x003d8094, 0x02bca0e1, 0x024fdcbc, 0x03528c38, 0x00c204d3, 0x02635846, 0x03b2fa50, 0x003cb3b2, 0x02f876d7, 0x003282da}}}, + {X: Field{[10]uint32{0x0070ee78, 0x03754da3, 0x03f42393, 0x01ad67ba, 0x009b8c89, 0x02b8d0a9, 0x02d73bd5, 0x02a5116f, 0x03a9de89, 0x00119a19}}, Y: Field{[10]uint32{0x02e042e1, 0x03559e2a, 0x02029385, 0x024d3ba5, 0x019cbb9f, 0x022dfb42, 0x01bd6cae, 0x01608c1e, 0x0307b3e1, 0x000a9765}}}, + {X: Field{[10]uint32{0x01db3f7b, 0x0172e8b0, 0x01f3cd98, 0x016ef995, 0x01fc740d, 0x03dc4963, 0x021526fc, 0x01145e24, 0x0108c878, 0x001c49d3}}, Y: Field{[10]uint32{0x034b25e0, 0x01237bfe, 0x03f560d8, 0x0299aaf9, 0x033cdd2c, 0x010185de, 0x01652bc4, 0x0050d3e3, 0x0130a5be, 0x00382bc0}}}, + {X: Field{[10]uint32{0x02be2bcd, 0x03838ddf, 0x0111fa0a, 0x01b47ecc, 0x03b6e825, 0x013981a3, 0x00693c1f, 0x0090744f, 0x00482d25, 0x00291ba4}}, Y: Field{[10]uint32{0x00474eda, 0x02486fa5, 0x0111140f, 0x02ff56b9, 0x01fdd708, 0x0185c9ab, 0x026e7ac9, 0x02ada604, 0x000cf22a, 0x001d59dc}}}, + {X: Field{[10]uint32{0x01e84abd, 0x000afea9, 0x03b5baec, 0x022e89b4, 0x0110ea91, 0x01ef9a14, 0x0073b0f7, 0x00449a16, 0x0391f243, 0x003dd642}}, Y: Field{[10]uint32{0x02708999, 0x024d6918, 0x00e2eded, 0x02357a8a, 0x002d2512, 0x016372f2, 0x035d6cc8, 0x02534326, 0x00f8594c, 0x00120612}}}, + {X: Field{[10]uint32{0x028c2edf, 0x00bb7790, 0x023bc9a2, 0x037ebfd7, 0x004f966e, 0x0263c1e4, 0x0139d643, 0x03876b6b, 0x00e51282, 0x000b5eaa}}, Y: Field{[10]uint32{0x035d9d79, 0x016d868c, 0x01fb5763, 0x0285c233, 0x01a30b4d, 0x005d57e7, 0x033ea24f, 0x008267ac, 0x033c4203, 0x0004ac84}}}, + {X: Field{[10]uint32{0x0236d0e3, 0x0143ea5c, 0x00607995, 0x009d7d96, 0x00822809, 0x0207c4d7, 0x03113a55, 0x0311ff67, 0x03403302, 0x00244c4f}}, Y: Field{[10]uint32{0x00838a77, 0x00fd89e4, 0x03f27c32, 0x0308b833, 0x03aa9e96, 0x03c84a16, 0x01daee91, 0x0012fd18, 0x00075e78, 0x003e2dbb}}}, + {X: Field{[10]uint32{0x006743cb, 0x0128755b, 0x010de2f4, 0x0070e867, 0x01e0be03, 0x02c51bef, 0x028e86e1, 0x02169e11, 0x011909d3, 0x00368920}}, Y: Field{[10]uint32{0x00348cbf, 0x027bd9d0, 0x01a666d3, 0x02d874b3, 0x0305d418, 0x026cdf11, 0x00625111, 0x03dbbbcb, 0x017b5f76, 0x00301f22}}}, + {X: Field{[10]uint32{0x01e82220, 0x00809a37, 0x01bd62e8, 0x03e5bc07, 0x02760ec3, 0x03a7b50c, 0x01e6082d, 0x030b8fed, 0x02240b1b, 0x002578da}}, Y: Field{[10]uint32{0x00e1cb63, 0x017a7447, 0x03d01766, 0x021c7878, 0x0352a74a, 0x032d080a, 0x003b209d, 0x0128ea3c, 0x00d73abc, 0x002f9a64}}}, + {X: Field{[10]uint32{0x02bc6e8b, 0x020ccfcf, 0x01cdf488, 0x021c5411, 0x01afe54a, 0x007e0478, 0x03489e45, 0x01d6c315, 0x00603abd, 0x0022c16c}}, Y: Field{[10]uint32{0x0340fb39, 0x003d3f9f, 0x0179dbb3, 0x0056b358, 0x0027f5b6, 0x0206f69f, 0x01e2ddce, 0x0103ee22, 0x008145db, 0x0007443e}}}, + {X: Field{[10]uint32{0x03020f54, 0x0274c33c, 0x0372855a, 0x02df7363, 0x01d43ec0, 0x0072e0ca, 0x00bbb2ba, 0x00c9e9d4, 0x023b764a, 0x003feaf2}}, Y: Field{[10]uint32{0x01d0f05a, 0x021510db, 0x01302cf5, 0x0172d828, 0x00c79196, 0x013a652d, 0x02fb393a, 0x0289816c, 0x0265c90b, 0x0024e5c2}}}, + {X: Field{[10]uint32{0x03866c72, 0x03ec14c2, 0x027c0a18, 0x01a2c4cf, 0x02d35148, 0x01d4a662, 0x00f05fa9, 0x0392a63c, 0x02efef35, 0x002cea16}}, Y: Field{[10]uint32{0x036005e2, 0x011b47d6, 0x0275238f, 0x031fa228, 0x0009ee78, 0x0139c03a, 0x016b36c5, 0x016e780f, 0x02e1c21e, 0x000c0457}}}, + {X: Field{[10]uint32{0x015b7ab5, 0x01494332, 0x012d5d15, 0x00cbaf2d, 0x015b78fc, 0x03d99b54, 0x01c56590, 0x00f3c82e, 0x015f4c23, 0x00293c7f}}, Y: Field{[10]uint32{0x01faa0da, 0x00f58720, 0x02d52c36, 0x00962764, 0x03337543, 0x03148671, 0x00419fe0, 0x00496111, 0x0385726a, 0x00247467}}}, + {X: Field{[10]uint32{0x015bbb0a, 0x00f98900, 0x03c98bec, 0x00df4a6c, 0x019eb146, 0x02d62d7b, 0x03f39232, 0x033c4e52, 0x034b7bae, 0x0025ee12}}, Y: Field{[10]uint32{0x01162435, 0x01bd254b, 0x03bf48b8, 0x00c361b6, 0x025eac7f, 0x02a4ad2d, 0x0093d73c, 0x01ece84d, 0x00afbe8e, 0x00125f6d}}}, + {X: Field{[10]uint32{0x006312b3, 0x01d34665, 0x0169a1c2, 0x0208f321, 0x03a9de5f, 0x006d6d5e, 0x0278e965, 0x00d999d7, 0x00d9203e, 0x000b3ae8}}, Y: Field{[10]uint32{0x02d2b437, 0x029d70e3, 0x0040a488, 0x02db1aad, 0x00b7805d, 0x035df062, 0x030a88a6, 0x033f7907, 0x0286f042, 0x003530bf}}}, + {X: Field{[10]uint32{0x032b7009, 0x02e1a88f, 0x01e10e91, 0x032f1a90, 0x00912391, 0x0120da66, 0x0257b78b, 0x02b28a2f, 0x01306cdd, 0x002ae2c6}}, Y: Field{[10]uint32{0x034172cf, 0x00a1940d, 0x02a03351, 0x0144da24, 0x027abed6, 0x02992081, 0x00472a17, 0x0286ba76, 0x03dc79fb, 0x003f6eea}}}, + {X: Field{[10]uint32{0x0215b394, 0x0034c146, 0x01acd6bb, 0x01742a8b, 0x03c14970, 0x024e3c9a, 0x02ac2b59, 0x0102c55f, 0x00291ff1, 0x00009d8c}}, Y: Field{[10]uint32{0x01374ee6, 0x01412b12, 0x01875a91, 0x01e61bb3, 0x00553594, 0x014bd728, 0x0240838c, 0x02e78bd1, 0x032a38dc, 0x0030adac}}}, + {X: Field{[10]uint32{0x02fc78c5, 0x01e7ad72, 0x02d8e6cc, 0x03423197, 0x009e703f, 0x03a77449, 0x011d7933, 0x014531fe, 0x01bd1cc1, 0x0008b47b}}, Y: Field{[10]uint32{0x00a85efe, 0x01959e30, 0x03f7a05e, 0x03048de3, 0x02a93942, 0x00228e05, 0x0024fca2, 0x039d044c, 0x03eea53a, 0x001d14f9}}}, + {X: Field{[10]uint32{0x00ffe222, 0x01f26f6b, 0x01b7cc8e, 0x009d7b3b, 0x00b61465, 0x02f6cfee, 0x00fa5590, 0x027a509c, 0x01c0c572, 0x001c361a}}, Y: Field{[10]uint32{0x02ec30c5, 0x0372ee3d, 0x01657115, 0x01d2704c, 0x00f8d414, 0x0230b0ea, 0x03baec84, 0x023ed185, 0x01328ce7, 0x0012ff2b}}}, + {X: Field{[10]uint32{0x011b1647, 0x0093ae1e, 0x0097dd4a, 0x0301aedf, 0x00ed9039, 0x02a5ef4a, 0x0360dccd, 0x015e0993, 0x01deda8d, 0x002896d1}}, Y: Field{[10]uint32{0x0243db8f, 0x031a362a, 0x00c7dfe1, 0x0078bc0c, 0x00f306f1, 0x0310e999, 0x03765554, 0x036558c8, 0x0183fd2a, 0x0023f612}}}, + {X: Field{[10]uint32{0x031024b8, 0x02a29d0e, 0x025cf39c, 0x0052e5d6, 0x033e77fa, 0x01cdc19b, 0x02383366, 0x01f0356a, 0x016c9b23, 0x00208ff3}}, Y: Field{[10]uint32{0x0024dde0, 0x03c5ad51, 0x01d72198, 0x012f4719, 0x01d1433e, 0x02db50d1, 0x01c2ba3b, 0x03cb77a6, 0x004d29a4, 0x0039a469}}}, + {X: Field{[10]uint32{0x02158d0c, 0x01b13396, 0x0033a3a9, 0x0349bb49, 0x01ee594b, 0x00e534c1, 0x02b1247d, 0x02bbd90c, 0x02638244, 0x0000e696}}, Y: Field{[10]uint32{0x026a8023, 0x03e2c9d8, 0x016cd32d, 0x010d4315, 0x00ee4b9f, 0x00932c42, 0x03ff37ea, 0x02125355, 0x0139dd8b, 0x00051f3b}}}, + {X: Field{[10]uint32{0x03206487, 0x012a95ac, 0x035f8de9, 0x02ed21e7, 0x022a18f6, 0x006c9de5, 0x00aaf7b8, 0x02cb701d, 0x03b5b85b, 0x0023e7fa}}, Y: Field{[10]uint32{0x0210c2a2, 0x021ab2fd, 0x0093c32a, 0x03caada8, 0x01dc7474, 0x00ad5ecf, 0x037dbdec, 0x01680038, 0x03d6d417, 0x001236ba}}}, + {X: Field{[10]uint32{0x0143f60c, 0x01e80f64, 0x013f804f, 0x014cdba7, 0x016a08db, 0x03dad38d, 0x009158a5, 0x00215914, 0x03142f50, 0x003f05be}}, Y: Field{[10]uint32{0x001f7a36, 0x033e0137, 0x02eaf58b, 0x0139acca, 0x03402758, 0x036e17f9, 0x034ada59, 0x02dce843, 0x02f27e02, 0x0023a4c9}}}, + {X: Field{[10]uint32{0x01c5a281, 0x024921a1, 0x01d788e2, 0x0007d080, 0x03eaecae, 0x021faea0, 0x015d8f09, 0x01bdba44, 0x02a71744, 0x001f6c27}}, Y: Field{[10]uint32{0x0215742b, 0x00f8c9f0, 0x03864273, 0x019f169b, 0x0279fd21, 0x004bf45f, 0x036b2adc, 0x011577dc, 0x00ee426d, 0x002d11a7}}}, + {X: Field{[10]uint32{0x00d9a57e, 0x03ef2529, 0x030b8564, 0x03d71fb2, 0x023df7ca, 0x007e34f1, 0x0256fdab, 0x03bc70fa, 0x03f528ba, 0x00351746}}, Y: Field{[10]uint32{0x02aeccc1, 0x005cb845, 0x02191c1a, 0x0344f016, 0x00ad0c84, 0x006b5c00, 0x0121d3d8, 0x003a2473, 0x01846483, 0x0024789a}}}, + {X: Field{[10]uint32{0x01f03901, 0x0286a45d, 0x0278ad43, 0x0266ba5d, 0x016a4d9c, 0x01e89aec, 0x00a9ffaa, 0x02176154, 0x03751b6f, 0x000febc2}}, Y: Field{[10]uint32{0x0044328f, 0x01710d86, 0x01368b55, 0x0050ee36, 0x00be775d, 0x00e18c47, 0x02aa39f6, 0x00f3d972, 0x022aa4e4, 0x00229741}}}, + {X: Field{[10]uint32{0x02efd121, 0x01ac1b1d, 0x03107492, 0x028cec49, 0x001eefdb, 0x019787b0, 0x00c5e39c, 0x0291c9e7, 0x00be8e08, 0x00151823}}, Y: Field{[10]uint32{0x0140f038, 0x02278831, 0x01afdcb7, 0x01d9c741, 0x039bdc27, 0x03263f0a, 0x02c5f91c, 0x03e07923, 0x01bc40de, 0x00029da5}}}, + {X: Field{[10]uint32{0x009823ec, 0x03560364, 0x02d4664d, 0x03693865, 0x02e8a201, 0x00ed5a5c, 0x00e69552, 0x03f350d9, 0x0189050d, 0x00156683}}, Y: Field{[10]uint32{0x00dc71c3, 0x03a014ba, 0x027b4c46, 0x00ac1a9a, 0x035641e3, 0x021fd654, 0x01b8d5c0, 0x022e433b, 0x01add652, 0x001efe38}}}, + {X: Field{[10]uint32{0x00f467a8, 0x025ae52b, 0x039c31a9, 0x02a42c19, 0x00bb305e, 0x00797f0a, 0x0248c344, 0x02e7cac5, 0x0058b5e2, 0x00059ba2}}, Y: Field{[10]uint32{0x02e5bdb2, 0x008168e4, 0x01d2af64, 0x00df7432, 0x00dc1b7c, 0x0023e665, 0x018a6b91, 0x03ed0ab3, 0x006dff82, 0x002726cc}}}, + {X: Field{[10]uint32{0x00fe1941, 0x0369ce0e, 0x025a8d41, 0x025317bf, 0x02e5284f, 0x02b90e3b, 0x00ec5fc3, 0x020eeaa5, 0x028ce66e, 0x001038a7}}, Y: Field{[10]uint32{0x01acb2dc, 0x0062134e, 0x009c3955, 0x013ec39c, 0x0384ae68, 0x00e88f42, 0x03154e27, 0x01e1a073, 0x031cc01e, 0x001f1c7d}}}, + {X: Field{[10]uint32{0x02d4ee7e, 0x0110e01c, 0x004081a8, 0x00f6fd9d, 0x006aeb8b, 0x01986d00, 0x007fc764, 0x027399fe, 0x00f9eb65, 0x001a0a72}}, Y: Field{[10]uint32{0x0222913b, 0x001a5172, 0x01908ea5, 0x02ccc13f, 0x036647fc, 0x03a7fcc2, 0x02825225, 0x03701553, 0x030a8332, 0x00074d54}}}, + {X: Field{[10]uint32{0x03658196, 0x00d75044, 0x00e7adbb, 0x01010b44, 0x03e25a25, 0x038abc8d, 0x0393b136, 0x027f4e4c, 0x005a322e, 0x00128ff8}}, Y: Field{[10]uint32{0x0101574c, 0x01c0631e, 0x02ea1f14, 0x0115fb7a, 0x0178dbdc, 0x03c2ac5d, 0x03c40d9e, 0x01d906a4, 0x01f8d452, 0x00216690}}}, + {X: Field{[10]uint32{0x02a44f94, 0x01784066, 0x0338225a, 0x030805df, 0x029e9dde, 0x01919f30, 0x0167ad5a, 0x03acbb05, 0x03c9a675, 0x00379605}}, Y: Field{[10]uint32{0x00f723a4, 0x01959eb3, 0x00af5ec3, 0x005d323f, 0x0271b45e, 0x0352fc40, 0x017e6256, 0x00c4737c, 0x03d05413, 0x0010143a}}}, + {X: Field{[10]uint32{0x0262a108, 0x03697ad5, 0x03e7a155, 0x02cc6d47, 0x00daa7b9, 0x03cf63ce, 0x03df1a26, 0x03d0442a, 0x02454f07, 0x003f78a4}}, Y: Field{[10]uint32{0x0327808a, 0x037f722d, 0x0371ed98, 0x015b901c, 0x03f09d17, 0x031b1c67, 0x03347a3a, 0x03a4a733, 0x02d37b39, 0x003ca939}}}, + {X: Field{[10]uint32{0x03f42436, 0x02a43b7b, 0x022e8a43, 0x00574230, 0x01b09174, 0x029dca18, 0x03c536d6, 0x022e85db, 0x00fb6eb9, 0x003ca34f}}, Y: Field{[10]uint32{0x0279d1bf, 0x0009cd44, 0x00b61e9d, 0x02310b9b, 0x001971fe, 0x022252a9, 0x003dc82d, 0x00943781, 0x022bb328, 0x0011422f}}}, + {X: Field{[10]uint32{0x0316e3ee, 0x01ee545f, 0x038c7011, 0x0259083d, 0x037bb654, 0x00669b7d, 0x0192afb1, 0x02d6df42, 0x00304d1c, 0x0031d957}}, Y: Field{[10]uint32{0x031dfdfd, 0x009f8b79, 0x0070d2e4, 0x02f946e4, 0x01a348b0, 0x00379e70, 0x0186b1cb, 0x00c3712e, 0x02c2cdb7, 0x00226058}}}, + {X: Field{[10]uint32{0x03b4b147, 0x00fb2801, 0x00d0d7ae, 0x01d3c856, 0x0053ffba, 0x02d8bd36, 0x0167936e, 0x03b999c7, 0x03c72fa3, 0x00395f65}}, Y: Field{[10]uint32{0x01fecd64, 0x031c83f8, 0x00958c07, 0x01811f0d, 0x031ed426, 0x019a3284, 0x02b80b9a, 0x00a5d646, 0x012ca3d9, 0x002c78c0}}}, + {X: Field{[10]uint32{0x022b0c01, 0x037e3078, 0x02a44bcc, 0x01edd9a1, 0x036cd3d3, 0x03805332, 0x0244f92f, 0x0096ff01, 0x02421550, 0x003ab6a1}}, Y: Field{[10]uint32{0x01dfeeed, 0x03b5f482, 0x03e9106a, 0x02b2bde7, 0x0107152a, 0x0103e0a9, 0x03c37c55, 0x006ec045, 0x017d71d7, 0x002240d7}}}, + {X: Field{[10]uint32{0x020d0e25, 0x01fb2139, 0x03e27556, 0x03e5dd40, 0x0362dbf8, 0x0047e8ff, 0x01d7e8e0, 0x0086627e, 0x027e3f17, 0x000f9d89}}, Y: Field{[10]uint32{0x021160b6, 0x02288d9b, 0x0087182d, 0x031f8bf8, 0x02416f8b, 0x01f8e5ce, 0x013001ec, 0x031b6e91, 0x03909631, 0x002860d5}}}, + {X: Field{[10]uint32{0x01a3df70, 0x00b49424, 0x0350c697, 0x00d46399, 0x0205de72, 0x0359af9f, 0x0279e692, 0x00bcd408, 0x03d89c26, 0x00284765}}, Y: Field{[10]uint32{0x012a69dd, 0x0071b6f5, 0x00b71fd3, 0x01dfa522, 0x0144768d, 0x02e22459, 0x02e48fea, 0x02c05b7c, 0x00a3dd6f, 0x0034637e}}}, + {X: Field{[10]uint32{0x01f20651, 0x03d0887d, 0x01787922, 0x0023f563, 0x01a5ab52, 0x02b9f30a, 0x0154bf8d, 0x0301bbb7, 0x0375cefe, 0x002c5b8f}}, Y: Field{[10]uint32{0x02d0eb2d, 0x021d86a9, 0x0381da75, 0x024314e6, 0x010233ae, 0x01a42624, 0x03c19891, 0x00cbb5d3, 0x02b45a6e, 0x0015feff}}}, + {X: Field{[10]uint32{0x034628b2, 0x0095e131, 0x03d9fbeb, 0x02cd128c, 0x00837339, 0x02bc51e9, 0x03564c2f, 0x03a9ba7a, 0x000a3f73, 0x000df7a0}}, Y: Field{[10]uint32{0x02254050, 0x007b04f9, 0x020a02f4, 0x01b3e8ab, 0x03e33fc9, 0x0165aab5, 0x016b7e53, 0x01600c06, 0x02599da5, 0x00164ce4}}}, + {X: Field{[10]uint32{0x03d68055, 0x03b10e32, 0x021f19be, 0x02c24c96, 0x024ae57f, 0x02db9aea, 0x00b781d8, 0x02aebdbf, 0x012d65b3, 0x001bda10}}, Y: Field{[10]uint32{0x038d3bcc, 0x00c550cb, 0x02f08ec0, 0x00cfbd26, 0x0127dc14, 0x0086aed7, 0x03310420, 0x01c6f002, 0x019d4061, 0x002213f5}}}, + {X: Field{[10]uint32{0x036e4366, 0x0240b5b2, 0x00a79572, 0x026bd82f, 0x03980f1f, 0x014bc1c3, 0x00f0ce2b, 0x03898493, 0x029e6bc5, 0x002451e6}}, Y: Field{[10]uint32{0x002f5288, 0x00d746a7, 0x0364aef9, 0x0090044b, 0x03479325, 0x02c4ef89, 0x036025d4, 0x0110d667, 0x030a22de, 0x0008c13d}}}, + {X: Field{[10]uint32{0x0119bd8a, 0x02306513, 0x03701835, 0x031d29b1, 0x014cceab, 0x005df732, 0x01e7c1e4, 0x021c2230, 0x00df36ac, 0x0022e9ac}}, Y: Field{[10]uint32{0x02ab9ed4, 0x01fe1658, 0x005baad1, 0x006de26a, 0x01989dff, 0x01deb1d5, 0x02abe8a1, 0x00578a48, 0x020ee9d5, 0x003a5adc}}}, + {X: Field{[10]uint32{0x01d567cc, 0x02b2deca, 0x02c9ef4a, 0x01a55393, 0x00f11b8a, 0x00d5453c, 0x0359a8ca, 0x00ff3163, 0x0195871f, 0x002ac548}}, Y: Field{[10]uint32{0x03267fb4, 0x03a80dc3, 0x0019c3c8, 0x0329946d, 0x01965ec1, 0x017e23fc, 0x0099ad17, 0x02f6850a, 0x0148623e, 0x0030776b}}}, + {X: Field{[10]uint32{0x011600c5, 0x00b39f55, 0x00756e55, 0x011b5357, 0x026ca45c, 0x0066b708, 0x00e6448e, 0x00af4070, 0x03485eb9, 0x001fac8f}}, Y: Field{[10]uint32{0x03c57ac5, 0x0309ec69, 0x03328b3d, 0x025ea161, 0x01a300ef, 0x00f8c315, 0x033de076, 0x02e4e41e, 0x03124278, 0x00254fa6}}}, + {X: Field{[10]uint32{0x0221ee17, 0x00924153, 0x01f0a2f6, 0x02dc3bac, 0x01e0212f, 0x01624124, 0x0120a922, 0x01c0371d, 0x002ba4b2, 0x002c8fd3}}, Y: Field{[10]uint32{0x03598530, 0x02b83762, 0x03811457, 0x01f98d27, 0x028a2c28, 0x0040e1b0, 0x007d5a5c, 0x02cebcb3, 0x03729e95, 0x0028e2d9}}}, + {X: Field{[10]uint32{0x0369c2a4, 0x002addc9, 0x024a90a1, 0x00badd50, 0x0067a6c1, 0x01b3eb59, 0x001a02b9, 0x0156da8b, 0x0323387e, 0x002174b9}}, Y: Field{[10]uint32{0x00e4d303, 0x01145432, 0x031d0db8, 0x033c8684, 0x00ded380, 0x0352050d, 0x03077fb7, 0x0262bc06, 0x01ac2238, 0x001c9eaf}}}, + {X: Field{[10]uint32{0x0309273d, 0x02369b26, 0x014be9fd, 0x0006229e, 0x0254ae69, 0x019a7d9a, 0x0383d59e, 0x02933104, 0x015e08db, 0x0009f05c}}, Y: Field{[10]uint32{0x01b1a266, 0x0357352d, 0x03f9d998, 0x03173cae, 0x03e16e22, 0x039fcc3c, 0x017d8841, 0x01b288d4, 0x0254306e, 0x0009d9f2}}}, + {X: Field{[10]uint32{0x015eed89, 0x0173e2c2, 0x0350f446, 0x01090200, 0x0342cf40, 0x03e169aa, 0x00c4fb56, 0x017a3a78, 0x00d37f9a, 0x0039c2e3}}, Y: Field{[10]uint32{0x030cb31a, 0x012c3f9a, 0x014fe5ec, 0x0018c661, 0x01faacdf, 0x01d4232b, 0x034e93c0, 0x02346e5c, 0x00589478, 0x000b8f63}}}, + {X: Field{[10]uint32{0x01e956b9, 0x00804f37, 0x0365ee2c, 0x0187439f, 0x0293932c, 0x00fc1dab, 0x0081a39f, 0x020e5a63, 0x00552405, 0x00388f75}}, Y: Field{[10]uint32{0x00cf77c9, 0x036da2de, 0x0315b1dc, 0x01e72d4c, 0x0052b57e, 0x022a82d9, 0x01cef85a, 0x022ae2fd, 0x03d000cd, 0x001b14f2}}}, + {X: Field{[10]uint32{0x01919c9f, 0x001ce653, 0x003b7d7a, 0x00c8431a, 0x039aaf08, 0x01d9df2e, 0x0209f2c4, 0x02604c46, 0x0381ccc4, 0x0017a48f}}, Y: Field{[10]uint32{0x00306873, 0x02e5fd0e, 0x019f7738, 0x01f3ed45, 0x02705966, 0x03dc153f, 0x00e64a8a, 0x02b41bf8, 0x0112e64c, 0x0018135c}}}, + {X: Field{[10]uint32{0x00142507, 0x00deaddc, 0x006a5600, 0x010d8cca, 0x031380e5, 0x004ff79a, 0x02b71d71, 0x0289e380, 0x02531a9f, 0x0008f67c}}, Y: Field{[10]uint32{0x0244a9ac, 0x00cdcaff, 0x0256442d, 0x00053da5, 0x030a9fd2, 0x02d3a178, 0x02f49f6b, 0x0184669b, 0x0247b6eb, 0x00157720}}}, + {X: Field{[10]uint32{0x033b8f24, 0x03d76275, 0x0318a050, 0x03bc4b1c, 0x02886c79, 0x03bdb494, 0x01bb2815, 0x0147bc57, 0x0095ad25, 0x003bac8c}}, Y: Field{[10]uint32{0x01ba1ddb, 0x026166c4, 0x00eac67d, 0x020a74e1, 0x0056a80f, 0x039f3ee4, 0x00c38963, 0x0033a3ac, 0x0394b981, 0x003469c6}}}, + {X: Field{[10]uint32{0x00b7c21b, 0x009a0ad5, 0x023c0e7a, 0x00db9087, 0x03899a84, 0x03bfbaa6, 0x03eee536, 0x03df8952, 0x027b57bd, 0x001929b7}}, Y: Field{[10]uint32{0x03b4755b, 0x00325bc9, 0x01537cf4, 0x02438fc3, 0x03181ad1, 0x0240bf1b, 0x0002e2d2, 0x013f2831, 0x036e2e34, 0x001909e4}}}, + {X: Field{[10]uint32{0x00270073, 0x03c0b0b3, 0x0046d779, 0x0114f3b2, 0x008207fd, 0x0079c02e, 0x01aad5e5, 0x02bcfc70, 0x02ced76d, 0x0027919d}}, Y: Field{[10]uint32{0x03dc9e42, 0x01d3d2f2, 0x00c38d9d, 0x0333ad16, 0x036ffc4a, 0x0362a112, 0x02550195, 0x0042b411, 0x03811d76, 0x0015a171}}}, + {X: Field{[10]uint32{0x01645473, 0x012cd663, 0x003e5d13, 0x00d5bb21, 0x031d83c6, 0x0110a31e, 0x020ee231, 0x01ae85db, 0x02288061, 0x00257b84}}, Y: Field{[10]uint32{0x03bf4054, 0x00b8a7a8, 0x023a37d1, 0x004c31bb, 0x0149a60d, 0x02c9531c, 0x00812789, 0x01301d60, 0x00644191, 0x001ef8d3}}}, + {X: Field{[10]uint32{0x006516ad, 0x039300ff, 0x00da994f, 0x02683166, 0x03d0b108, 0x0114f2f7, 0x01df5066, 0x02068be4, 0x02efd920, 0x00394fff}}, Y: Field{[10]uint32{0x00c59c2f, 0x00762479, 0x01929ecc, 0x019eb01c, 0x035dcd1b, 0x00591863, 0x0270b285, 0x00340a8b, 0x02c14a60, 0x001583c0}}}, + {X: Field{[10]uint32{0x022a7b68, 0x0330fa81, 0x03a83faf, 0x00418ebe, 0x0090d4eb, 0x028f665d, 0x014f1adf, 0x01223168, 0x03447c75, 0x00270cc9}}, Y: Field{[10]uint32{0x01791c63, 0x026dbb86, 0x02b8ad68, 0x023d5643, 0x00cacfb7, 0x01343315, 0x00ff7d22, 0x03f0ed34, 0x01fb09a7, 0x002731d6}}}, + {X: Field{[10]uint32{0x033d3c45, 0x00e50c25, 0x0058e4ea, 0x01fa078f, 0x02f1d103, 0x022dd050, 0x02b22b0c, 0x0057fddf, 0x01002f43, 0x003a09b5}}, Y: Field{[10]uint32{0x008b65de, 0x0346666f, 0x010455d8, 0x0380ab9d, 0x00e8ab16, 0x031f54e9, 0x039316df, 0x01c7d0ea, 0x025882f9, 0x000e919b}}}, + {X: Field{[10]uint32{0x015e13c7, 0x01ece204, 0x03512d38, 0x01ecff59, 0x00dd38a8, 0x03a6c5af, 0x00f196c6, 0x02d71237, 0x030eaf93, 0x0033b537}}, Y: Field{[10]uint32{0x028b74cc, 0x0118b1b5, 0x0197e910, 0x01c73b75, 0x018c7542, 0x02734478, 0x032c9309, 0x02772ad3, 0x023bdd14, 0x003f8229}}}, + {X: Field{[10]uint32{0x037eb33d, 0x031505b6, 0x00b27ee8, 0x01b78086, 0x038065e3, 0x03ce3d53, 0x0220182d, 0x01437cac, 0x012788ea, 0x002c15bb}}, Y: Field{[10]uint32{0x02cf6409, 0x02a0f6f6, 0x00a6b0a1, 0x027ff0c0, 0x018d514d, 0x023a687a, 0x0243aa82, 0x015fe7af, 0x0375cef4, 0x0025cce0}}}, + {X: Field{[10]uint32{0x037830df, 0x03b8a216, 0x011561c9, 0x03010187, 0x03eba030, 0x00d07da8, 0x0260b667, 0x03e529ff, 0x007402fe, 0x0000d77b}}, Y: Field{[10]uint32{0x009b933e, 0x007c161e, 0x0045caba, 0x01b9363c, 0x013eb8be, 0x02dba488, 0x0302fe6e, 0x0043f79f, 0x012139c8, 0x00009664}}}, + {X: Field{[10]uint32{0x024e020b, 0x02b77ecc, 0x02f1f081, 0x025cdf16, 0x03d7981e, 0x010abd13, 0x0215cb99, 0x0084ff4b, 0x00c87733, 0x0000fc8f}}, Y: Field{[10]uint32{0x016e8f83, 0x03f0145d, 0x0065ac8a, 0x0184ed7e, 0x007ffc0c, 0x0337b040, 0x0392455d, 0x03378d38, 0x00c0d43c, 0x00093a33}}}, + {X: Field{[10]uint32{0x03babbdb, 0x014dfbca, 0x01bc1e06, 0x03322f3a, 0x03c8471d, 0x02e8361b, 0x02cfa43d, 0x0173ab5f, 0x0076c080, 0x0026ea5b}}, Y: Field{[10]uint32{0x0143def3, 0x00ef0dfe, 0x023ae0e9, 0x008181fb, 0x01622d98, 0x03d3c1ec, 0x02f8e3a8, 0x038136f8, 0x00331c2a, 0x003068f1}}}, + {X: Field{[10]uint32{0x016a3815, 0x0221f5f4, 0x02ac5c2e, 0x01058438, 0x021d414f, 0x037b3273, 0x01103965, 0x014e5635, 0x039a3147, 0x0020f051}}, Y: Field{[10]uint32{0x009b5b7a, 0x0215d00a, 0x0292c7f0, 0x01c341f0, 0x02c123d4, 0x027ffeee, 0x0339bbff, 0x03351b97, 0x00181354, 0x00213534}}}, + {X: Field{[10]uint32{0x03e0a32d, 0x017af1fb, 0x01ab1fcb, 0x0035ecd2, 0x00a8d701, 0x00a15f6e, 0x026714a0, 0x007621db, 0x027a2db1, 0x002eb3d8}}, Y: Field{[10]uint32{0x00c83129, 0x02b8c0fa, 0x02f5ed57, 0x021aeadf, 0x0214b3e5, 0x01ab3882, 0x03777b73, 0x011239a2, 0x000da44c, 0x0028a1f7}}}, + {X: Field{[10]uint32{0x0376ebd7, 0x03173fc9, 0x024d4619, 0x03475934, 0x034ca888, 0x00051c59, 0x03fd2d3a, 0x027de442, 0x00553012, 0x001cc18f}}, Y: Field{[10]uint32{0x00159489, 0x0312ec8b, 0x004ea368, 0x01b34a16, 0x019d7190, 0x005261b1, 0x02b0362b, 0x03e320be, 0x01d944cc, 0x00355e50}}}, + {X: Field{[10]uint32{0x035d6637, 0x022802ce, 0x020114d0, 0x004b5116, 0x02a3f51a, 0x0376d00f, 0x03a4ce34, 0x02b4544a, 0x0232df55, 0x00013ba1}}, Y: Field{[10]uint32{0x02b14820, 0x039b1164, 0x03d8188a, 0x0006585b, 0x01916879, 0x025c8f46, 0x03f01a31, 0x009d68e7, 0x0199dc30, 0x0030a7dc}}}, + {X: Field{[10]uint32{0x03e7ef28, 0x00abf9f5, 0x0386ccd4, 0x03bed59d, 0x028f5345, 0x008fbeb2, 0x0318a16a, 0x03507e62, 0x026d68bb, 0x003f11b9}}, Y: Field{[10]uint32{0x0243c18a, 0x0009c569, 0x029d50d7, 0x00c7b23d, 0x01a02382, 0x02930a2e, 0x01af38a4, 0x0212754f, 0x02dfabf8, 0x0022d0a8}}}, + {X: Field{[10]uint32{0x03a7dc13, 0x0379862c, 0x039638a9, 0x0262bbf1, 0x013f9b6b, 0x028e41ec, 0x02ece5e2, 0x01e5e01f, 0x01b0158d, 0x0029c6b4}}, Y: Field{[10]uint32{0x0308bf90, 0x0179a87b, 0x026ea437, 0x0113a029, 0x02ccfc5c, 0x006e6df4, 0x038a8644, 0x03119394, 0x006da956, 0x001bf5fa}}}, + {X: Field{[10]uint32{0x01860a3a, 0x00ddda3c, 0x0028d0ed, 0x014f5476, 0x0161a7c5, 0x0031abd6, 0x03b99576, 0x0299ff5e, 0x01f36075, 0x00180861}}, Y: Field{[10]uint32{0x0110b2e7, 0x030caf53, 0x02802165, 0x0353754b, 0x0102265c, 0x01ea274e, 0x03a027ce, 0x020d7991, 0x02db706b, 0x002434c4}}}, + {X: Field{[10]uint32{0x007a77ca, 0x01edf7d8, 0x006b598e, 0x01fe50dc, 0x0336b443, 0x01f718b0, 0x019976d3, 0x024646e7, 0x02837672, 0x0036c3f2}}, Y: Field{[10]uint32{0x02efc29d, 0x01210760, 0x03dd9c4f, 0x01a26541, 0x0278699a, 0x028600be, 0x009f0b32, 0x01faff83, 0x016e8eba, 0x0008f7b7}}}, + {X: Field{[10]uint32{0x00a54939, 0x023c95e9, 0x01884761, 0x03b00ce7, 0x02237d0a, 0x03fe37a0, 0x0159909f, 0x013c24a8, 0x0061598d, 0x001a466e}}, Y: Field{[10]uint32{0x0334b90c, 0x0072f6db, 0x03ff2f3e, 0x0050e4b0, 0x0127a1a2, 0x02693864, 0x01c07845, 0x00ea8ee1, 0x02fe1fa5, 0x002ae7e0}}}, + {X: Field{[10]uint32{0x0074bd59, 0x03becba0, 0x01e39299, 0x0063df8e, 0x02877ec1, 0x0354e803, 0x00f0a5d5, 0x006e9f0f, 0x02e9f1f5, 0x003d29f4}}, Y: Field{[10]uint32{0x005bd257, 0x01f8640b, 0x01be0ef1, 0x027665d0, 0x030c9bea, 0x02f39e60, 0x00e6380c, 0x02b38b69, 0x01006aa6, 0x0027c142}}}, + {X: Field{[10]uint32{0x01453da3, 0x02cb8d73, 0x03656366, 0x01f95065, 0x02392731, 0x03ffef65, 0x011ae232, 0x03784c42, 0x0210d4f1, 0x0022975c}}, Y: Field{[10]uint32{0x00580a54, 0x0345912c, 0x02a98abc, 0x001394ca, 0x034cae10, 0x024c1ab6, 0x0158a05a, 0x03683a99, 0x021b5b71, 0x0026bfe2}}}, + {X: Field{[10]uint32{0x00e86f16, 0x020063ae, 0x039f3f93, 0x0308abf5, 0x022c9195, 0x02812e1e, 0x020406be, 0x01c566c2, 0x03dce40d, 0x00267ac8}}, Y: Field{[10]uint32{0x00ecff66, 0x011f5059, 0x01b3782b, 0x037a7a03, 0x03b1f17f, 0x01e7f2af, 0x036cddaa, 0x03f7b1ff, 0x0138a66e, 0x000bbc86}}}, + {X: Field{[10]uint32{0x00d37472, 0x02e996ad, 0x02904a99, 0x0391eb2f, 0x01611ad0, 0x02aef9e0, 0x03f0d0b9, 0x011062b1, 0x02841a87, 0x000efc5b}}, Y: Field{[10]uint32{0x03e714ad, 0x00d44868, 0x003551fb, 0x02ca2bbd, 0x007d1138, 0x009dd0df, 0x008c0f19, 0x0232cbf2, 0x01f4e194, 0x00074f2e}}}, + {X: Field{[10]uint32{0x03f01f3e, 0x027f93f9, 0x0095af45, 0x03395126, 0x02561811, 0x018e22a1, 0x007c1333, 0x00e5382e, 0x03ff19eb, 0x0028fbe0}}, Y: Field{[10]uint32{0x0178cbab, 0x0344e920, 0x024a1045, 0x03374cd6, 0x019d687c, 0x00474238, 0x007ddb47, 0x02b32f37, 0x01398bdc, 0x00065577}}}, + {X: Field{[10]uint32{0x00b1af90, 0x03bc5f9c, 0x02552063, 0x0047d6b7, 0x005a344d, 0x008f75ad, 0x01c024c2, 0x013a04fb, 0x0351da9b, 0x0009a05b}}, Y: Field{[10]uint32{0x014aabd6, 0x001e980a, 0x03d30220, 0x01feef33, 0x0365611b, 0x01813a25, 0x02809676, 0x019e8d5c, 0x021d1d6b, 0x001189e3}}}, + {X: Field{[10]uint32{0x03dea823, 0x03a1112b, 0x0125a909, 0x0325239d, 0x031d47dc, 0x01e502c3, 0x03b14f69, 0x03c523b2, 0x03c0d640, 0x00178594}}, Y: Field{[10]uint32{0x00b092c7, 0x017333d3, 0x01c86cd4, 0x0325bfbb, 0x008e499c, 0x00af714a, 0x03aef229, 0x020d43b3, 0x01ede7cb, 0x0026e2e0}}}, + {X: Field{[10]uint32{0x0028de9e, 0x03a76f7a, 0x008f247f, 0x01beb770, 0x02b7725d, 0x0096c4ad, 0x0348c231, 0x00da5158, 0x02450b0d, 0x0006f623}}, Y: Field{[10]uint32{0x00a95db0, 0x036e8bee, 0x00fe2098, 0x01a1a602, 0x009f6faf, 0x00750059, 0x03dae7ca, 0x0377695d, 0x01e32d8b, 0x00060a4e}}}, + {X: Field{[10]uint32{0x01b73c02, 0x004b17f6, 0x01fbd31b, 0x005b5080, 0x02b80ab7, 0x03aede00, 0x01e754fb, 0x013900c5, 0x02063adc, 0x0012c0ff}}, Y: Field{[10]uint32{0x0080fb06, 0x0233d507, 0x0030e73e, 0x00c7a929, 0x03a5623c, 0x000fe638, 0x00ed537e, 0x03946403, 0x00a8e2c5, 0x002a1934}}}, + {X: Field{[10]uint32{0x01d35f61, 0x013c7a11, 0x0268c588, 0x003f4217, 0x01214686, 0x0311bced, 0x01927f13, 0x023ccc7b, 0x01150781, 0x00038829}}, Y: Field{[10]uint32{0x02bcf328, 0x021d79a5, 0x00db0484, 0x02828f48, 0x02a924e9, 0x03f523d9, 0x02466c43, 0x035b1627, 0x00021a79, 0x00287048}}}, + {X: Field{[10]uint32{0x001e37be, 0x024971fe, 0x03a732db, 0x0287200a, 0x034aaece, 0x0221787a, 0x0224d874, 0x0387362f, 0x024e74a1, 0x0038f446}}, Y: Field{[10]uint32{0x021645f5, 0x00a8eda1, 0x03c7f73d, 0x0271ed12, 0x03022b0a, 0x0220c752, 0x0006787b, 0x03c07d8e, 0x001e0a1e, 0x0023c7b0}}}, + {X: Field{[10]uint32{0x0237f6e5, 0x00a8204f, 0x00617d1e, 0x00c83d00, 0x03da71fa, 0x01ca6c58, 0x0292b584, 0x0036fba3, 0x021557fe, 0x002288cc}}, Y: Field{[10]uint32{0x02cce950, 0x022415ab, 0x01f5e938, 0x00a5870d, 0x03267dbd, 0x035de632, 0x021ed74b, 0x01d416ba, 0x031abb8c, 0x002bd791}}}, + {X: Field{[10]uint32{0x0051d20d, 0x0269db5a, 0x01cbe99f, 0x03ea65a1, 0x02997e8d, 0x01c05735, 0x01070e00, 0x011a0c54, 0x022cb43f, 0x000eef02}}, Y: Field{[10]uint32{0x00b4f97d, 0x038d46df, 0x00278bb0, 0x010e5bea, 0x01fd1408, 0x01820c44, 0x0168e88b, 0x013102e6, 0x038ea5f1, 0x0026877e}}}, + {X: Field{[10]uint32{0x011d1deb, 0x0384cf24, 0x01184811, 0x00e0e50c, 0x0165380f, 0x0101ed2e, 0x0059dac9, 0x020eafa3, 0x0381082d, 0x00230135}}, Y: Field{[10]uint32{0x000a3db4, 0x014982d3, 0x00eab4a6, 0x0261c663, 0x00c0a3e0, 0x0200e54d, 0x03213408, 0x008c5bf3, 0x0093fdb2, 0x00135d39}}}, + {X: Field{[10]uint32{0x02a0291f, 0x002935b5, 0x028c8577, 0x0057279f, 0x001ed9f9, 0x00b80d91, 0x00aa7c46, 0x00b37b7c, 0x010e7231, 0x00119f53}}, Y: Field{[10]uint32{0x00a1ce32, 0x0376875c, 0x001fc0d4, 0x010060ea, 0x02f117e2, 0x00475596, 0x00624ddf, 0x025528c3, 0x00a9d7c2, 0x0020f6d0}}}, + {X: Field{[10]uint32{0x01a3dc8c, 0x03d26311, 0x00195d55, 0x00b7866b, 0x02ce73ae, 0x01072f54, 0x00601869, 0x028406ac, 0x00cd8e55, 0x002d8bd8}}, Y: Field{[10]uint32{0x0314ef41, 0x0330c06c, 0x03cef428, 0x02e3efdb, 0x034a5108, 0x01633482, 0x030ed091, 0x00958bba, 0x00b07c6d, 0x00167692}}}, + {X: Field{[10]uint32{0x039e681f, 0x03746d72, 0x02183379, 0x03301924, 0x01166e88, 0x0151bbfa, 0x036d7f19, 0x03b9877c, 0x0210f98a, 0x001ad758}}, Y: Field{[10]uint32{0x018a0d76, 0x011b9bda, 0x028e77f2, 0x01eb11c8, 0x027c6de8, 0x00c01170, 0x008afca8, 0x0229adcb, 0x034859c8, 0x0036fec5}}}, + {X: Field{[10]uint32{0x02300c97, 0x03b34288, 0x00286049, 0x036d234f, 0x00548768, 0x01625df3, 0x012cc9ef, 0x0210ada3, 0x0104e8c7, 0x00221d13}}, Y: Field{[10]uint32{0x03b9c38c, 0x03d628a3, 0x01bc0393, 0x024e4421, 0x02149d29, 0x031f242d, 0x00b0e425, 0x03147968, 0x02a51ea3, 0x002115ce}}}, + {X: Field{[10]uint32{0x032e37c8, 0x02038cb0, 0x03d4bada, 0x0296f934, 0x00d0218b, 0x005ab64e, 0x03065712, 0x02b16066, 0x002440f2, 0x003f7cb2}}, Y: Field{[10]uint32{0x01538f74, 0x01b56a97, 0x028b5587, 0x0069d019, 0x01917203, 0x02180b7f, 0x00c6f205, 0x007fef92, 0x00b59e96, 0x0030aaf1}}}, + {X: Field{[10]uint32{0x03777559, 0x012255fb, 0x028a9366, 0x03826d33, 0x0115178c, 0x011d5501, 0x02273bd2, 0x0220ecc8, 0x03641f5a, 0x00134bf7}}, Y: Field{[10]uint32{0x02a41b11, 0x002ce152, 0x029fabed, 0x00070d12, 0x02b2837f, 0x02cc85eb, 0x021b89b9, 0x03cc7190, 0x0101210b, 0x0008ae87}}}, + {X: Field{[10]uint32{0x00ddc633, 0x0185648d, 0x022699c4, 0x0330abf2, 0x035a54dc, 0x017192a3, 0x02f3faea, 0x02ff7e06, 0x00a1e743, 0x003b1f2f}}, Y: Field{[10]uint32{0x02ab0917, 0x01e05b93, 0x02e295f5, 0x039263f3, 0x03dc5263, 0x01684041, 0x0128c05e, 0x028141ed, 0x01a9ea76, 0x0027c64f}}}, + {X: Field{[10]uint32{0x00b44fdf, 0x02aef011, 0x01943c7f, 0x037e74dc, 0x00da9cd6, 0x00f2e013, 0x001e7790, 0x0262e2e0, 0x01137719, 0x003fcbe8}}, Y: Field{[10]uint32{0x01f6093c, 0x011af2cb, 0x02c54237, 0x009008b2, 0x022aec68, 0x02335bc2, 0x01d966db, 0x01d9c31e, 0x03f21ac5, 0x00258849}}}, + {X: Field{[10]uint32{0x00a57580, 0x0179de82, 0x035ee647, 0x0324a7c5, 0x034fd418, 0x010db5ab, 0x02c21bec, 0x000b48d3, 0x006b2dfb, 0x001b46d0}}, Y: Field{[10]uint32{0x00e895eb, 0x03a88f6f, 0x02f07b2d, 0x0394e2e7, 0x02f157ef, 0x00f9ed80, 0x00693d6d, 0x0238be3c, 0x02689dba, 0x002e2515}}}, + {X: Field{[10]uint32{0x004d7963, 0x03bd4e59, 0x01df587b, 0x03ddd308, 0x020317bf, 0x00371ae5, 0x00767270, 0x00033919, 0x01fb449e, 0x0012aee7}}, Y: Field{[10]uint32{0x006e6407, 0x03162f7e, 0x018e49c2, 0x02a1d517, 0x004d6dbb, 0x026bc726, 0x01807868, 0x031a6cab, 0x02b7c016, 0x001821bc}}}, + {X: Field{[10]uint32{0x010fcee6, 0x036d8e99, 0x022361f8, 0x0293f43b, 0x022fb3be, 0x016128f2, 0x00b0b895, 0x010258dd, 0x01cc634a, 0x0036c314}}, Y: Field{[10]uint32{0x01b6e6a0, 0x03f8cf31, 0x02486367, 0x01fe160d, 0x015d2825, 0x01ec3993, 0x0116fd39, 0x02b8612f, 0x012baea1, 0x001fb02f}}}, + {X: Field{[10]uint32{0x03fdb287, 0x01348b0d, 0x00e74495, 0x020886aa, 0x006996a3, 0x011b79c1, 0x01e02ed6, 0x01246699, 0x01bcd066, 0x002b9bdb}}, Y: Field{[10]uint32{0x03f2f201, 0x03eda870, 0x03d1bb76, 0x03d7d7fb, 0x02c5bbb2, 0x027e440b, 0x01313791, 0x01d01046, 0x02aef8ae, 0x002af9c3}}}, + {X: Field{[10]uint32{0x035f6227, 0x034eb234, 0x01fda63d, 0x018beb14, 0x00f4079a, 0x01ff25dc, 0x00771a91, 0x007cc2f4, 0x0397cb32, 0x002ba8fa}}, Y: Field{[10]uint32{0x02bf39b6, 0x006b919a, 0x0352506f, 0x0285105a, 0x03878145, 0x00a1f7f7, 0x0133704a, 0x005717a4, 0x00163985, 0x002da94d}}}, + {X: Field{[10]uint32{0x012233be, 0x02f28721, 0x01ded051, 0x0018fa24, 0x0039355c, 0x01b04ebe, 0x037234ef, 0x01437a07, 0x00cf711d, 0x0024327e}}, Y: Field{[10]uint32{0x0021bff5, 0x0388720d, 0x0151ed7f, 0x00baa805, 0x0317d2c3, 0x004d61e0, 0x013d4528, 0x025927cb, 0x037818f1, 0x00023655}}}, + {X: Field{[10]uint32{0x02d976e0, 0x017b6321, 0x020e2149, 0x02ae4809, 0x02fd954a, 0x012d23bf, 0x028dcde3, 0x000d1154, 0x00e5ab1d, 0x0016b5fb}}, Y: Field{[10]uint32{0x038569b0, 0x0052c0fd, 0x003d8700, 0x0112c5e1, 0x0062ac94, 0x0311adb8, 0x03274e93, 0x018eaefb, 0x023b2c3c, 0x000b7c85}}}, + {X: Field{[10]uint32{0x03d28d9a, 0x0113a38e, 0x0031cb78, 0x01f5622a, 0x001d80ae, 0x00eac32b, 0x026d3ee1, 0x00bbc05b, 0x022c8e94, 0x002dae8b}}, Y: Field{[10]uint32{0x03ef7fb4, 0x01776dc6, 0x0101d085, 0x014f402d, 0x00a2ebf4, 0x03490458, 0x01b6b067, 0x037f7d40, 0x0235f923, 0x00104602}}}, + {X: Field{[10]uint32{0x03f5f37d, 0x01319d1f, 0x01cc413a, 0x02a71a02, 0x00799555, 0x03211627, 0x03dd450b, 0x01b1f7ea, 0x03c9bba2, 0x001f9026}}, Y: Field{[10]uint32{0x01c9e6b1, 0x00f7b9de, 0x0030ce42, 0x00d067f8, 0x036066b0, 0x020763f7, 0x01c42604, 0x02bf8b90, 0x01619cc5, 0x00031462}}}, + {X: Field{[10]uint32{0x024f602c, 0x02145bb7, 0x024e0300, 0x01aa942d, 0x022c7263, 0x031f1308, 0x01010606, 0x03cbb8a3, 0x011470b2, 0x002521b3}}, Y: Field{[10]uint32{0x02b467af, 0x03edd2f7, 0x012ceaac, 0x028d27d1, 0x02c062e9, 0x01cc8d9f, 0x0131785f, 0x0001bf7e, 0x038cfc5b, 0x00221b32}}}, + {X: Field{[10]uint32{0x01338d2a, 0x027b62c8, 0x0183b1af, 0x0271520b, 0x0294b1ee, 0x0116e817, 0x01af6d87, 0x01c81478, 0x017bc8b0, 0x0039f047}}, Y: Field{[10]uint32{0x035c8e50, 0x0214b7b5, 0x00f79c74, 0x00f5e5ff, 0x016ad468, 0x024bcd6a, 0x01062aa1, 0x02ac7bf2, 0x0293828c, 0x003f7134}}}, + {X: Field{[10]uint32{0x03d50bcd, 0x00003c24, 0x02217c98, 0x01763a00, 0x0119b1a8, 0x01db7b4d, 0x01b67b27, 0x0172c06c, 0x027bff31, 0x00037f98}}, Y: Field{[10]uint32{0x01f9e773, 0x00aa3b95, 0x03c285f3, 0x0346e57b, 0x03ea0f69, 0x0275a39a, 0x01d2480c, 0x0021edbf, 0x01ebbb65, 0x00264f15}}}, + {X: Field{[10]uint32{0x0046f516, 0x03ab1969, 0x01dde189, 0x01b55210, 0x03eb31c2, 0x0183c0bc, 0x007c9818, 0x028b2d7f, 0x0017fd00, 0x00283c33}}, Y: Field{[10]uint32{0x033b8969, 0x030a5792, 0x03a74ff5, 0x03aaf4c3, 0x0214bbe4, 0x00fb74df, 0x01077a7d, 0x0228efc4, 0x004c31d5, 0x002feba2}}}, + {X: Field{[10]uint32{0x03e37338, 0x02dcaea8, 0x01dd9dd7, 0x014e47f8, 0x03d37e7f, 0x0251ad4a, 0x02ef926c, 0x00a1bb5b, 0x02bcbc14, 0x003076ed}}, Y: Field{[10]uint32{0x02df7bf0, 0x00f9a984, 0x01bd0e79, 0x00d44e78, 0x03aa5e27, 0x028ea235, 0x036fdc81, 0x01a20bd2, 0x0187bd33, 0x0019ec0b}}}, + {X: Field{[10]uint32{0x034bebb2, 0x01416f2e, 0x03eebe82, 0x004440d0, 0x03070255, 0x03bb7d7b, 0x02cb1f06, 0x02571324, 0x025bc7d4, 0x00082e41}}, Y: Field{[10]uint32{0x00756835, 0x01449184, 0x00fbd55d, 0x029c12c9, 0x014fec71, 0x018090b6, 0x021a4f90, 0x00764af4, 0x03165c23, 0x0029a61c}}}, + {X: Field{[10]uint32{0x01a69190, 0x0152043b, 0x03f2e03c, 0x01993e36, 0x0255ab9a, 0x023f21e1, 0x029544d3, 0x0230e376, 0x01d00c4d, 0x001efb7f}}, Y: Field{[10]uint32{0x00af77a1, 0x01c569be, 0x00591690, 0x0394f275, 0x01365556, 0x01cbfb81, 0x02d00491, 0x014b79ba, 0x00b00d4f, 0x0026653c}}}, + {X: Field{[10]uint32{0x035918e0, 0x034e179a, 0x01368df4, 0x03481067, 0x035adcad, 0x0083a5f2, 0x023815b7, 0x020fdab1, 0x02af9979, 0x00099d8b}}, Y: Field{[10]uint32{0x0227e6be, 0x00862356, 0x02549279, 0x0359daab, 0x0125f0c0, 0x0395883f, 0x00be2e9b, 0x0136f009, 0x008ce11b, 0x00207d51}}}, + {X: Field{[10]uint32{0x0387bb79, 0x013d337c, 0x013d9a94, 0x01d64b43, 0x03ea14f1, 0x036a1b84, 0x0354ff5d, 0x03854b0c, 0x02e7ee18, 0x001c5232}}, Y: Field{[10]uint32{0x0310b18d, 0x032d3788, 0x0336593d, 0x002fbba0, 0x02ffd42a, 0x02b1af03, 0x0065efed, 0x01ba4105, 0x01faf6f8, 0x0002f6cd}}}, + {X: Field{[10]uint32{0x03bdbc90, 0x023385e1, 0x02723503, 0x001964f0, 0x01bb4d8f, 0x015a116d, 0x01ae00b1, 0x00b0ce9a, 0x01d933ae, 0x0009f917}}, Y: Field{[10]uint32{0x01801ac9, 0x02aff594, 0x02db1f7c, 0x0281643c, 0x017dfe36, 0x009c68ac, 0x019c75c9, 0x01e68fe3, 0x033fa935, 0x0028af38}}}, + {X: Field{[10]uint32{0x03d6b7d7, 0x02fcacb5, 0x02a98fa2, 0x0047fb4a, 0x00d0539c, 0x0207980f, 0x02d79c7d, 0x02ba30a8, 0x02155b28, 0x002bc31c}}, Y: Field{[10]uint32{0x03ac41f9, 0x00b1a6a9, 0x0085640d, 0x038793cb, 0x023b5b26, 0x0073eb0f, 0x0380bfc7, 0x00270002, 0x03cfa251, 0x002b9af7}}}, + {X: Field{[10]uint32{0x03cbabf4, 0x03f80a98, 0x02bec7ec, 0x00646b32, 0x02de0f5a, 0x007a38dc, 0x00e609b2, 0x034d3cc5, 0x0008d4f8, 0x001ed8f1}}, Y: Field{[10]uint32{0x00f16327, 0x02ca6fa5, 0x03a7ce0d, 0x03402f32, 0x02236925, 0x0222166d, 0x02b6f65e, 0x025af633, 0x009a78fa, 0x002a8200}}}, + {X: Field{[10]uint32{0x01c6890c, 0x0163e6e1, 0x03f9394d, 0x000506bb, 0x024f4b48, 0x03d3cc8c, 0x03cffb68, 0x03a22f58, 0x005314f3, 0x002adda2}}, Y: Field{[10]uint32{0x037f192c, 0x0280dbf3, 0x019e05d3, 0x010455f1, 0x01c9ff98, 0x01ffc520, 0x033610ed, 0x01af0430, 0x0033d6d9, 0x00069c72}}}, + {X: Field{[10]uint32{0x023bd32e, 0x038d4727, 0x025a9953, 0x03692c97, 0x01ccd308, 0x0303b616, 0x0375487c, 0x01444be0, 0x03f07ad7, 0x0019050d}}, Y: Field{[10]uint32{0x01a9b131, 0x00e8e220, 0x026b0ccc, 0x0142130c, 0x027d2ec9, 0x03c02198, 0x00f1ba83, 0x00d1abd4, 0x03e6b255, 0x000f163d}}}, + {X: Field{[10]uint32{0x03a082cb, 0x029d9259, 0x0180b9b4, 0x0321dce5, 0x0360f7ec, 0x03406ba1, 0x01cceaff, 0x0351e307, 0x012d600e, 0x003d4cbf}}, Y: Field{[10]uint32{0x0285fa96, 0x02f3e844, 0x0145e440, 0x02b5a5f2, 0x03221847, 0x0200f27c, 0x01bb4d6c, 0x01f5fdf3, 0x014c7111, 0x001ce4d4}}}, + {X: Field{[10]uint32{0x031c7631, 0x02f41d42, 0x01c3ee1f, 0x0351d7c3, 0x00db73db, 0x03e20a4e, 0x01e6f608, 0x02ad1362, 0x01592c4b, 0x000cd9e6}}, Y: Field{[10]uint32{0x01694fbc, 0x01c058d2, 0x035aa1fd, 0x018973d9, 0x0217125d, 0x03fd5f37, 0x00782515, 0x0273cdb4, 0x00046fe8, 0x001307e0}}}, + {X: Field{[10]uint32{0x0256c9cb, 0x008681ef, 0x00a5be22, 0x0380ca5c, 0x016f18b7, 0x0232b0a1, 0x02b53962, 0x03295ec1, 0x016d2a34, 0x00386130}}, Y: Field{[10]uint32{0x02c5bf73, 0x01780f78, 0x009c77f8, 0x00d11ad4, 0x03d646cd, 0x0319b7d5, 0x02ab0688, 0x027137c5, 0x017b51ef, 0x001f7ff0}}}, + {X: Field{[10]uint32{0x0015d419, 0x01b22119, 0x0068f0e2, 0x035bbee3, 0x034f6ce6, 0x02883078, 0x00de9909, 0x027556ee, 0x01162fb4, 0x003e2a5f}}, Y: Field{[10]uint32{0x02061146, 0x0130b910, 0x034a7ded, 0x00ea19a1, 0x005f20a8, 0x007cba1b, 0x012e1616, 0x03280652, 0x00534dbf, 0x000f34f3}}}, + {X: Field{[10]uint32{0x02475781, 0x03783a84, 0x0164eb32, 0x001ab5c6, 0x0328cfc4, 0x0234f714, 0x02dd6123, 0x03608751, 0x022f6c6a, 0x0027adaa}}, Y: Field{[10]uint32{0x0045c299, 0x00f8d1db, 0x004afcb3, 0x03a3ef08, 0x0053dfe3, 0x029066ca, 0x024ce341, 0x00b824d9, 0x028379d3, 0x00051406}}}, + {X: Field{[10]uint32{0x0202668a, 0x021e8f0d, 0x036425f8, 0x017f3ae9, 0x017c4031, 0x008ff500, 0x02427403, 0x02255787, 0x026a68e6, 0x003af095}}, Y: Field{[10]uint32{0x00c7ea39, 0x024c7935, 0x0063aa06, 0x03050bbc, 0x01fab3bd, 0x03a7b269, 0x01f9f85a, 0x015b8995, 0x010996ff, 0x0001d7a0}}}, + {X: Field{[10]uint32{0x012bc392, 0x02dfacbd, 0x029fd674, 0x012d01d2, 0x03ab9c5e, 0x02921032, 0x025b29db, 0x033970be, 0x0038a966, 0x00155919}}, Y: Field{[10]uint32{0x001c8d66, 0x01c083e6, 0x0228f0a3, 0x0033a6a3, 0x022987d8, 0x017354b9, 0x003f68a4, 0x012a273f, 0x02867603, 0x000d18c6}}}, + {X: Field{[10]uint32{0x0316575e, 0x02c0cdde, 0x032e7ece, 0x01759ca7, 0x00082eff, 0x01f76453, 0x03257b8c, 0x0207ccc4, 0x0309befb, 0x002e1fe0}}, Y: Field{[10]uint32{0x016ea298, 0x036dff6a, 0x00630dee, 0x030b3157, 0x03eda5e1, 0x0202fb06, 0x03df03fb, 0x0000b5be, 0x003259e4, 0x002fa99a}}}, + {X: Field{[10]uint32{0x00a0a93e, 0x011c77dc, 0x008d7953, 0x0054a24b, 0x0224b6cf, 0x005b90d7, 0x03598b20, 0x0358fab3, 0x0185b440, 0x0011655d}}, Y: Field{[10]uint32{0x00b71427, 0x03aabab1, 0x013a00b3, 0x03f08cd2, 0x03b29739, 0x019419fe, 0x02c366a5, 0x013d3c8e, 0x0260776a, 0x003d32d8}}}, + {X: Field{[10]uint32{0x0248ca87, 0x01eef925, 0x02e11148, 0x0122e583, 0x033fe8d6, 0x03e73015, 0x024c8218, 0x010aec60, 0x024c8d9c, 0x000b243d}}, Y: Field{[10]uint32{0x03c25a8a, 0x006f9074, 0x00ab4da2, 0x01f5ac76, 0x0369bebf, 0x008bf3d5, 0x03000a9f, 0x00f2d827, 0x0157ac64, 0x0020a6f3}}}, + {X: Field{[10]uint32{0x004b5efe, 0x02c15205, 0x037be36d, 0x0048aea7, 0x012e7539, 0x01dcc5ca, 0x006a3fcc, 0x026af655, 0x02c7779c, 0x003acc9e}}, Y: Field{[10]uint32{0x018c9435, 0x00e46414, 0x025a08c4, 0x01948e15, 0x032cbbf3, 0x01b9d200, 0x032c594d, 0x0334e230, 0x00858d2f, 0x00086b0b}}}, + {X: Field{[10]uint32{0x006d007d, 0x0032c74b, 0x00e6adba, 0x00606b8c, 0x00daa354, 0x00df43c2, 0x02b07fdd, 0x03329ea8, 0x03e2272c, 0x000257b1}}, Y: Field{[10]uint32{0x03a12b5f, 0x01e3f14a, 0x00f3375f, 0x01f93dd0, 0x002d589e, 0x0042e224, 0x02ac913c, 0x01814154, 0x02ef59df, 0x001ccde1}}}, + {X: Field{[10]uint32{0x000cbbd1, 0x019f1a7f, 0x015f5fc3, 0x00a4b186, 0x0191104a, 0x03fc5cdc, 0x03c845d7, 0x028203c9, 0x02988b4f, 0x0012de99}}, Y: Field{[10]uint32{0x03a85b8f, 0x011606d8, 0x0207c928, 0x01360904, 0x008e5249, 0x0266ca79, 0x0338fd4d, 0x01584a1e, 0x03d0a360, 0x0022c10e}}}, + {X: Field{[10]uint32{0x0342e6b2, 0x02af4c68, 0x025e747d, 0x024bf194, 0x00a92337, 0x006409f0, 0x02ab28a6, 0x02077cd4, 0x018b6df5, 0x00226cb1}}, Y: Field{[10]uint32{0x03f53a2b, 0x01168435, 0x001f4100, 0x03ae223a, 0x009b053f, 0x000edd2f, 0x025edea2, 0x03996f89, 0x0334d459, 0x000c02c6}}}, + {X: Field{[10]uint32{0x03c43cf1, 0x02a04526, 0x008007ad, 0x009e27c3, 0x031c9263, 0x01d7b121, 0x027ff0db, 0x00a34392, 0x035d9f6a, 0x00104266}}, Y: Field{[10]uint32{0x0262cae5, 0x03056dde, 0x00b26995, 0x02680d65, 0x013e0791, 0x00196234, 0x009253be, 0x024adba5, 0x02962e2b, 0x000a82ae}}}, + {X: Field{[10]uint32{0x03229be4, 0x03f58581, 0x00817af7, 0x02704e27, 0x018825ea, 0x02998d55, 0x03396b29, 0x00230d41, 0x00649ec5, 0x002f2c3f}}, Y: Field{[10]uint32{0x0207d606, 0x011a4cce, 0x03e5c2c7, 0x02e4b5ef, 0x0313664d, 0x0248b991, 0x03a12ae0, 0x03d6adb0, 0x0192cf3b, 0x0005a31e}}}, + {X: Field{[10]uint32{0x018b762e, 0x01c6737b, 0x009a50ec, 0x035bdc0d, 0x029cd3b3, 0x0156a025, 0x0314ca70, 0x015abe78, 0x01585a62, 0x001e8ff2}}, Y: Field{[10]uint32{0x03df1346, 0x011172f4, 0x00f2217d, 0x01e0e44a, 0x00dadecd, 0x01c5e764, 0x0288526b, 0x001c58d4, 0x000c29cd, 0x003fa2ca}}}, + {X: Field{[10]uint32{0x01a8176a, 0x038fc198, 0x02fe1c89, 0x03980341, 0x027583c1, 0x0195b6a6, 0x03229e1e, 0x028d7b83, 0x03e1b968, 0x000ddc24}}, Y: Field{[10]uint32{0x02c601d9, 0x003e2830, 0x02b82e6e, 0x0220082b, 0x006aba8e, 0x02303600, 0x02a4dd0b, 0x03d185f9, 0x020df6c9, 0x0039f021}}}, + {X: Field{[10]uint32{0x02afecd8, 0x018fc512, 0x02a375ba, 0x03496a63, 0x01919b1d, 0x0184c068, 0x0327a933, 0x033333c7, 0x03daf4a5, 0x00317bfc}}, Y: Field{[10]uint32{0x00b97a1c, 0x01259337, 0x01d67f42, 0x027d38fc, 0x010a9412, 0x0088b0bf, 0x008a02c2, 0x020f7063, 0x023426f9, 0x000d3845}}}, + {X: Field{[10]uint32{0x023ffb27, 0x02a732f9, 0x014e984e, 0x03c54bb1, 0x033c0fa6, 0x00da2bf2, 0x0230f728, 0x0034cd10, 0x0119eb56, 0x00003f1e}}, Y: Field{[10]uint32{0x0059a6b3, 0x00a10aa6, 0x03fa9413, 0x033ab6b4, 0x00a04bc4, 0x03929f74, 0x01cb8388, 0x01bfe6f0, 0x0382af76, 0x00071f4d}}}, + {X: Field{[10]uint32{0x021ca5bd, 0x0362c921, 0x001c6287, 0x00890f4e, 0x03b31183, 0x0371bd1b, 0x0034cd6e, 0x01b5c951, 0x03fb4938, 0x0009e0f5}}, Y: Field{[10]uint32{0x03fa5c70, 0x005b8e31, 0x00111a93, 0x01d205c4, 0x01e4c685, 0x023e271e, 0x00450262, 0x01ab038f, 0x02710b80, 0x0028eabc}}}, + {X: Field{[10]uint32{0x018a02f3, 0x012cc3cb, 0x012298ad, 0x01bff4d7, 0x0188f54a, 0x0396efe5, 0x03f89495, 0x038343dd, 0x007868d4, 0x001d01e9}}, Y: Field{[10]uint32{0x03fdec9c, 0x03046d61, 0x001ce24c, 0x0250166b, 0x02debf3d, 0x024cca5f, 0x01b393ea, 0x0232c2a9, 0x016296e1, 0x00049435}}}, + {X: Field{[10]uint32{0x0061a321, 0x0137486a, 0x01df6cc5, 0x0293e118, 0x01c5899f, 0x0055101e, 0x02c108e7, 0x03b369de, 0x00e32940, 0x0030b4b3}}, Y: Field{[10]uint32{0x005a1909, 0x037a16fc, 0x01b729e6, 0x02aba0c3, 0x030a919e, 0x03321516, 0x00b05e3e, 0x0201c64a, 0x01fa40bb, 0x003c2fac}}}, + {X: Field{[10]uint32{0x01e8a56f, 0x03eb0fab, 0x013eb349, 0x00d4132c, 0x00d459a9, 0x02d7a54c, 0x014e1f5a, 0x006559aa, 0x0189c505, 0x00233dac}}, Y: Field{[10]uint32{0x03cf9c96, 0x018152f3, 0x0338c160, 0x02205884, 0x00327aa7, 0x008b51ea, 0x02d06d3b, 0x00a21b39, 0x017032e5, 0x002fdaa7}}}, + {X: Field{[10]uint32{0x01a94968, 0x019d9b4a, 0x01d51ece, 0x00adff42, 0x022deeaa, 0x00c9df47, 0x016ac5f5, 0x0211c43e, 0x0186ed9f, 0x0035ac1d}}, Y: Field{[10]uint32{0x009c5326, 0x03a0fd7c, 0x03c9c75b, 0x007b4b88, 0x022f7904, 0x038fe8a4, 0x02f0d0d5, 0x01573d2b, 0x00b4ce56, 0x0036ad35}}}, + {X: Field{[10]uint32{0x02f4d647, 0x01c89ec3, 0x0000fb85, 0x00cd136a, 0x009e661d, 0x001e560d, 0x03a09219, 0x00fb7fcc, 0x033360a0, 0x0029c82d}}, Y: Field{[10]uint32{0x0084ea63, 0x01702d52, 0x035b11bb, 0x03fef513, 0x0313d79d, 0x003d219f, 0x037e3a5a, 0x00b60980, 0x006a721c, 0x0007c84f}}}, + {X: Field{[10]uint32{0x033a5ff7, 0x01a73b07, 0x030ac95a, 0x028b2806, 0x01b39f9b, 0x0167741d, 0x03db862e, 0x031b19c5, 0x02983b03, 0x00156295}}, Y: Field{[10]uint32{0x00ffb1a4, 0x0331b1f5, 0x0155792e, 0x01a621ff, 0x00fe3ae8, 0x00117f18, 0x0338458a, 0x02da2c85, 0x0352db21, 0x001f81f1}}}, + {X: Field{[10]uint32{0x00e14ca4, 0x02d55404, 0x002639ca, 0x035fe35b, 0x02a7c2d9, 0x00474382, 0x0329941f, 0x01a2a314, 0x03c32786, 0x002e49f7}}, Y: Field{[10]uint32{0x0323388c, 0x01e570ad, 0x035524b8, 0x0152666b, 0x0172f4d8, 0x01dc1489, 0x020e35f7, 0x0089eed0, 0x03259954, 0x000f3a0d}}}, + {X: Field{[10]uint32{0x030e6da8, 0x0263b313, 0x0016513f, 0x00719470, 0x003c35f7, 0x02d568dd, 0x0223ed5a, 0x02bfd623, 0x00991085, 0x000adc35}}, Y: Field{[10]uint32{0x006a8b06, 0x013c0a94, 0x025cd1a9, 0x004c72b8, 0x030a7014, 0x03609d8b, 0x03984697, 0x01727288, 0x034daa1e, 0x0037d04e}}}, + {X: Field{[10]uint32{0x01aefe56, 0x007cbbcb, 0x01144142, 0x015298b8, 0x01e1368e, 0x012e9dfa, 0x029181d9, 0x01b80266, 0x00dcf72f, 0x002e20db}}, Y: Field{[10]uint32{0x010427ce, 0x01488279, 0x00359afa, 0x02a94e53, 0x0201beec, 0x0233abad, 0x017014b6, 0x03c9b72b, 0x012f0e31, 0x00026b51}}}, + {X: Field{[10]uint32{0x00af93a7, 0x02daa031, 0x01b004dc, 0x01173643, 0x02ec66b4, 0x03cce026, 0x0388b480, 0x0388e825, 0x017b65f0, 0x00094aca}}, Y: Field{[10]uint32{0x00916838, 0x02c37898, 0x010e806c, 0x034314cd, 0x039f77c7, 0x0092962f, 0x02a3bcfc, 0x018845cd, 0x00c43c34, 0x00233138}}}, + {X: Field{[10]uint32{0x02be6330, 0x0245c737, 0x01892aad, 0x001335ca, 0x03d34f27, 0x035adef6, 0x03d5fa03, 0x03319a3b, 0x00ca1c15, 0x0027cf4c}}, Y: Field{[10]uint32{0x023211b0, 0x0188c9ec, 0x0057b386, 0x02613888, 0x01353d9b, 0x0051d85c, 0x0056974f, 0x03b9eaf0, 0x00340f95, 0x001122d9}}}, + {X: Field{[10]uint32{0x03d35e49, 0x034a614b, 0x039e66e2, 0x01793952, 0x01653b54, 0x02f1ef38, 0x00a771b5, 0x02b767fe, 0x016e5bc9, 0x00208978}}, Y: Field{[10]uint32{0x010570fa, 0x012a9d5f, 0x0212c717, 0x02774401, 0x00df836b, 0x01fc2765, 0x024e1de8, 0x028b05b2, 0x01e3aaef, 0x00189531}}}, + {X: Field{[10]uint32{0x02d02ebe, 0x01a729aa, 0x01799046, 0x019d34f1, 0x01074f47, 0x0378956c, 0x02a80b74, 0x0266c6dc, 0x02484d6e, 0x0029f73b}}, Y: Field{[10]uint32{0x01c170a7, 0x0160ee80, 0x002a42db, 0x01e231f1, 0x00785861, 0x03bdea52, 0x021f541b, 0x02407d21, 0x00fa76a2, 0x00075bc3}}}, + {X: Field{[10]uint32{0x009976b4, 0x038c57a0, 0x03d1e210, 0x00ae8e5b, 0x009a6baa, 0x00b1992e, 0x013372fd, 0x03a43a63, 0x01a85d4c, 0x002a4511}}, Y: Field{[10]uint32{0x00b1d100, 0x020e1d9e, 0x01449f1d, 0x03e539f1, 0x0072deac, 0x0365001f, 0x01d1512c, 0x01cac6d4, 0x028b99b0, 0x002b7131}}}, + {X: Field{[10]uint32{0x027ce1f1, 0x0217b88a, 0x01c79ed6, 0x02b621b3, 0x036f6ea6, 0x01443803, 0x00410963, 0x025955d7, 0x01ce907c, 0x001d18b2}}, Y: Field{[10]uint32{0x0371c7df, 0x03fe882e, 0x00f2ae67, 0x03a0ccbe, 0x0047a854, 0x02731050, 0x02df5ac7, 0x008a6710, 0x01c5f02c, 0x0013fe90}}}, + {X: Field{[10]uint32{0x00cd4f40, 0x0232a18a, 0x005065d3, 0x0112596a, 0x00dfd855, 0x029e7c8d, 0x00e36bb6, 0x0256f6be, 0x01f3dea4, 0x00350a25}}, Y: Field{[10]uint32{0x010d9cf5, 0x024ab82d, 0x01bbd59c, 0x003ea036, 0x00982171, 0x02ee121b, 0x0069b207, 0x00710b9e, 0x031813a1, 0x000bfb7a}}}, + {X: Field{[10]uint32{0x01388adc, 0x03666853, 0x01669c29, 0x01b5da99, 0x02e8291e, 0x03bd4f44, 0x03434b27, 0x01622bc4, 0x0362ce85, 0x003be6da}}, Y: Field{[10]uint32{0x03bf912f, 0x022bb826, 0x0138adb1, 0x015516da, 0x02802612, 0x024501f2, 0x0107955e, 0x03258bb6, 0x03cf9af0, 0x000567d7}}}, + {X: Field{[10]uint32{0x01bc9f32, 0x02c1b23f, 0x03f392af, 0x01f8a9a4, 0x0392877c, 0x0325abff, 0x01fb7bdb, 0x0276bf7d, 0x01a0bc65, 0x001000fc}}, Y: Field{[10]uint32{0x0161fef9, 0x0217ad5e, 0x03cc9ea6, 0x029b09c1, 0x017faeaf, 0x012fa197, 0x03f1dcb7, 0x03c2c0a3, 0x02a17458, 0x003afff2}}}, + {X: Field{[10]uint32{0x02c09a8b, 0x01c0da9a, 0x027debed, 0x03640121, 0x01aa9ae1, 0x0121bd73, 0x00786f07, 0x03614592, 0x008b6b03, 0x0010e412}}, Y: Field{[10]uint32{0x0282f07a, 0x01da98e1, 0x03d6e5dd, 0x0304a682, 0x03452001, 0x00777ce4, 0x035b88a2, 0x02d5ac70, 0x01e5a10d, 0x001e0ca7}}}, + {X: Field{[10]uint32{0x03fadea1, 0x01d019ea, 0x006b9605, 0x005be7fe, 0x016074ee, 0x037fe2d0, 0x0006c565, 0x03ed9ad8, 0x00d29ea3, 0x002b9b68}}, Y: Field{[10]uint32{0x011cdac7, 0x00cc8d30, 0x009c05ca, 0x007ae22d, 0x0229e3f0, 0x00dc1853, 0x02f0916f, 0x00a98f9d, 0x0263dd01, 0x001d32aa}}}, + {X: Field{[10]uint32{0x03cfc72a, 0x0362a1ae, 0x014fb2fa, 0x03825414, 0x02035942, 0x013a01bd, 0x00656520, 0x011c86df, 0x01df9861, 0x001e3e1e}}, Y: Field{[10]uint32{0x00281ac6, 0x014a5b4e, 0x01c68a75, 0x034e2358, 0x032318aa, 0x03ee1731, 0x03661b7f, 0x03a02fea, 0x018c478a, 0x00106539}}}, + {X: Field{[10]uint32{0x03c97e01, 0x00be5b97, 0x01d1dedd, 0x00a1ec70, 0x000352e0, 0x00e0d577, 0x00d51cc8, 0x02c31b5b, 0x03654f41, 0x00201a10}}, Y: Field{[10]uint32{0x02b62461, 0x000cfae4, 0x01c45262, 0x01f8ec79, 0x037546bc, 0x00d7ca69, 0x0141a0d0, 0x006d3878, 0x023f13c6, 0x0022c308}}}, + {X: Field{[10]uint32{0x0387466c, 0x02ce4212, 0x0301005c, 0x00d271e5, 0x02f83b59, 0x0365f42a, 0x03d11691, 0x01d7d1bb, 0x019f4fd9, 0x000a5427}}, Y: Field{[10]uint32{0x02d0da81, 0x03ae9a81, 0x038da8a0, 0x0214bab4, 0x02a33de5, 0x00d78f21, 0x00fccbe1, 0x02be5b27, 0x037569a0, 0x00051dfa}}}, + {X: Field{[10]uint32{0x031dfa4a, 0x03ffabb7, 0x0399c2d8, 0x0105bafd, 0x004e3d57, 0x00f18ea7, 0x01532fe3, 0x01c8bc30, 0x00433d9c, 0x00064745}}, Y: Field{[10]uint32{0x003a2cd8, 0x012d375c, 0x01706eae, 0x02d997b2, 0x01a5e3c7, 0x006213bb, 0x01ecf839, 0x01c6b5d1, 0x0009b6b5, 0x0016f401}}}, + {X: Field{[10]uint32{0x030155a8, 0x022c5646, 0x001e1ebf, 0x0078f6c8, 0x02a50f0e, 0x03aa0afc, 0x02d65afe, 0x0205a17b, 0x002ed273, 0x000a10f5}}, Y: Field{[10]uint32{0x03c63ee8, 0x01f4246e, 0x02f98ff8, 0x02e02669, 0x0177edaf, 0x00cb2c89, 0x03e6e2c2, 0x027d4ed1, 0x0266c0fa, 0x00201f3a}}}, + {X: Field{[10]uint32{0x03c8f644, 0x014ef44a, 0x000184d6, 0x00b5145b, 0x00e96ed0, 0x03a084be, 0x007514b8, 0x034dbd4d, 0x03b09656, 0x00155a2d}}, Y: Field{[10]uint32{0x00e60d87, 0x03618e14, 0x009118b2, 0x026e904a, 0x02496045, 0x03a8d901, 0x03da30d7, 0x01b710fe, 0x03a65483, 0x0016d13a}}}, + {X: Field{[10]uint32{0x0145e803, 0x023b17ac, 0x03d6e5f3, 0x008701cf, 0x004a7dd4, 0x0256ccbe, 0x00d81ab5, 0x01129a7a, 0x00e0809e, 0x0016e138}}, Y: Field{[10]uint32{0x0113d398, 0x00f4fbeb, 0x00243cb4, 0x0303fa4d, 0x017e6109, 0x0390c455, 0x03a1522a, 0x0073b5cb, 0x02d0fa79, 0x00069968}}}, + {X: Field{[10]uint32{0x02dfa672, 0x02993aaf, 0x00ede900, 0x010a4b32, 0x00675ba8, 0x0234ca44, 0x021519a1, 0x0041c51f, 0x016bdd24, 0x003bd0b1}}, Y: Field{[10]uint32{0x03ff75ac, 0x01ef34e2, 0x00e3cc9e, 0x0288c51d, 0x0326a618, 0x02b76fda, 0x01e0c254, 0x0265dd84, 0x03473335, 0x001c0545}}}, + {X: Field{[10]uint32{0x0256eb63, 0x01f04a55, 0x0294c92b, 0x03b21fab, 0x00adc653, 0x02c5056d, 0x026ed003, 0x0129592f, 0x02dcb50d, 0x001237fc}}, Y: Field{[10]uint32{0x01643928, 0x01982063, 0x036b5f0f, 0x00f7dc07, 0x02fa29e6, 0x02feb550, 0x03c59e98, 0x03b3dbc2, 0x03fb53af, 0x002a6fa5}}}, + {X: Field{[10]uint32{0x02e938d4, 0x00793ed2, 0x00337f88, 0x035067f7, 0x00d1923b, 0x008ac263, 0x009a2dfc, 0x0345d043, 0x00f5246a, 0x0019cba4}}, Y: Field{[10]uint32{0x01781f19, 0x028a2e68, 0x02c9e97a, 0x0091585f, 0x02f331b6, 0x00797c27, 0x03e678b3, 0x01b6da20, 0x03801fda, 0x001cff4c}}}, + {X: Field{[10]uint32{0x03315cde, 0x032dd852, 0x03723ee7, 0x008529f2, 0x02dbfe55, 0x01770577, 0x01e094a9, 0x02067242, 0x01b171fb, 0x0016736e}}, Y: Field{[10]uint32{0x008351a2, 0x036c06fa, 0x00a187a6, 0x03679243, 0x017f2d38, 0x00208027, 0x033f8e73, 0x01298fb3, 0x0212670b, 0x000156b0}}}, + {X: Field{[10]uint32{0x012ddb18, 0x004237ab, 0x028f0043, 0x020a3873, 0x006b827f, 0x02666531, 0x00db879b, 0x0162ac4d, 0x010a357a, 0x001738e3}}, Y: Field{[10]uint32{0x0397f716, 0x0285364e, 0x009c1745, 0x019c4227, 0x0394748c, 0x036f3146, 0x0384b33d, 0x0361bb0b, 0x0202d9c1, 0x0017a058}}}, + {X: Field{[10]uint32{0x0398afda, 0x012846d4, 0x028c8282, 0x016b41c4, 0x02c1a74d, 0x02dabe49, 0x0227a940, 0x03eeeec3, 0x016a7466, 0x00326086}}, Y: Field{[10]uint32{0x00901f55, 0x0058df54, 0x006b6f00, 0x00953915, 0x032d8fb9, 0x00704cf6, 0x00e6448a, 0x00e2bee7, 0x01eae644, 0x001ea47e}}}, + {X: Field{[10]uint32{0x039ec818, 0x03d4ca60, 0x03d31725, 0x030a0f20, 0x0360bfbc, 0x01e5b403, 0x0281d297, 0x006fb372, 0x008479e6, 0x000e0f2c}}, Y: Field{[10]uint32{0x01dec91e, 0x028643de, 0x004ffdb1, 0x009ab619, 0x010bbc34, 0x0057cd36, 0x01e04980, 0x0224ce2f, 0x03a24900, 0x0009b89b}}}, + {X: Field{[10]uint32{0x002f612b, 0x03293f44, 0x00550248, 0x026dab21, 0x0328b88c, 0x01200477, 0x0117b524, 0x03c529c6, 0x03312ad4, 0x0039a515}}, Y: Field{[10]uint32{0x0176f53d, 0x030ce193, 0x0089c1b1, 0x01be5c1a, 0x00c81cc8, 0x027ac2d1, 0x03edddac, 0x01c0797a, 0x008251fc, 0x000c3b48}}}, + {X: Field{[10]uint32{0x039976f7, 0x00f131ae, 0x018a7f28, 0x03c893e9, 0x01250809, 0x0098a9ca, 0x02168d21, 0x024d4884, 0x01ba8f79, 0x000b401c}}, Y: Field{[10]uint32{0x031dfd8b, 0x00ac05d7, 0x01b03c87, 0x03c695c2, 0x01ccc118, 0x020001e7, 0x01455440, 0x01cfc45a, 0x01014e48, 0x0033729a}}}, + {X: Field{[10]uint32{0x001e927e, 0x0123c880, 0x017898d7, 0x02c210df, 0x01da35c2, 0x01e61dee, 0x00f35f06, 0x013efe47, 0x005765b7, 0x00320ae5}}, Y: Field{[10]uint32{0x005fd6a2, 0x00f67c81, 0x0133d931, 0x00a8e6c5, 0x03b57a0f, 0x02ab23c1, 0x0057dae9, 0x01aff1f8, 0x01d10bb0, 0x000b9413}}}, + {X: Field{[10]uint32{0x01bbf0a6, 0x02d8ca1d, 0x0022763c, 0x028bece9, 0x012654ed, 0x01cdf746, 0x01135ede, 0x0086a7fb, 0x002e7eac, 0x00270693}}, Y: Field{[10]uint32{0x00e9197f, 0x0023bf84, 0x02e60200, 0x011ba768, 0x0280eb66, 0x02ded681, 0x02c91289, 0x00716089, 0x036c12f7, 0x003cc4d2}}}, + {X: Field{[10]uint32{0x016c9b28, 0x02b09fa3, 0x0353b6a2, 0x00d8b55d, 0x019b170a, 0x0202df3e, 0x00bd645e, 0x00c88bb6, 0x019bbc69, 0x0025c74f}}, Y: Field{[10]uint32{0x01d22e2e, 0x00dbdfe4, 0x0098080a, 0x00cfce16, 0x01e20394, 0x03f17a1b, 0x00a73af7, 0x0370b1b1, 0x009ae296, 0x000358f5}}}, + {X: Field{[10]uint32{0x03917d2b, 0x0200bea2, 0x0023fa67, 0x01eafd6b, 0x01660a31, 0x00186781, 0x0329f2ae, 0x0045448f, 0x027386bc, 0x003d524e}}, Y: Field{[10]uint32{0x01e0f1d7, 0x008c1b99, 0x03e23964, 0x000a004c, 0x0138455e, 0x0109ee2d, 0x0305157b, 0x0014c0ac, 0x00cb8b78, 0x0039ab6f}}}, + {X: Field{[10]uint32{0x01b6e014, 0x00154de6, 0x006dadde, 0x03f502ce, 0x01763244, 0x03af78ab, 0x017a3215, 0x00282b92, 0x023e500e, 0x0020c7c4}}, Y: Field{[10]uint32{0x03221d6c, 0x01c67232, 0x03950f44, 0x002a76da, 0x01ac04af, 0x03bbd7be, 0x02fa508c, 0x0222b154, 0x00622ff5, 0x000d585a}}}, + {X: Field{[10]uint32{0x017cfb35, 0x00a321e2, 0x02975f17, 0x008a63a4, 0x027a338c, 0x03bce175, 0x014c3342, 0x011d30ce, 0x006d0018, 0x0026e338}}, Y: Field{[10]uint32{0x02a40d72, 0x033a8150, 0x0331d712, 0x015e928d, 0x0307ce87, 0x007d4dd1, 0x01a50c4c, 0x00f811f3, 0x0220b8dc, 0x001da500}}}, + {X: Field{[10]uint32{0x03c5b855, 0x004de9cf, 0x027cb1e8, 0x02b437fe, 0x0014f06c, 0x00afcf85, 0x01724104, 0x00af2580, 0x016ba98d, 0x003dc2a4}}, Y: Field{[10]uint32{0x000275a2, 0x023ffeca, 0x0023fff9, 0x02110f10, 0x03b5426d, 0x025ea23c, 0x01a3fbe9, 0x0225bfce, 0x01f470d7, 0x003c6e30}}}, + {X: Field{[10]uint32{0x00763d56, 0x014abeb0, 0x0259992d, 0x0027f653, 0x01a64d69, 0x03d88741, 0x02836612, 0x01ff92ac, 0x03bbc44e, 0x000b4aad}}, Y: Field{[10]uint32{0x015328e8, 0x034cb331, 0x0328ae57, 0x02bcd815, 0x03c5fec8, 0x02d870b4, 0x03e044e8, 0x024721a3, 0x02002a69, 0x0014d143}}}, + {X: Field{[10]uint32{0x00d10005, 0x02e751bd, 0x018f3dc9, 0x03157601, 0x03321ff7, 0x02a44c55, 0x025423f3, 0x025e33a8, 0x02b8c516, 0x00205e37}}, Y: Field{[10]uint32{0x016ff4bc, 0x00efeda3, 0x02bfb598, 0x011a89ad, 0x01f9c001, 0x00d4926f, 0x02e6a282, 0x034c0fd2, 0x032b46c9, 0x0005a9c6}}}, + {X: Field{[10]uint32{0x02b56a64, 0x01a9a48d, 0x0301126e, 0x03285800, 0x0001f700, 0x03756650, 0x02f9c32a, 0x02e9f99f, 0x0376d012, 0x002d1c2e}}, Y: Field{[10]uint32{0x014fd95c, 0x03089c98, 0x03a6927c, 0x020a8bef, 0x031775f0, 0x02349a61, 0x01f36f15, 0x0261861c, 0x03e07d17, 0x003df424}}}, + {X: Field{[10]uint32{0x02de29ce, 0x01c4cff8, 0x03f78fe1, 0x0084736c, 0x01d3a899, 0x003c0850, 0x0348eb33, 0x02b04866, 0x02ba837c, 0x000593ca}}, Y: Field{[10]uint32{0x031d28dc, 0x01d8dd21, 0x011972c0, 0x01419a49, 0x02c2837c, 0x02e08701, 0x01ec79e0, 0x0340d12a, 0x020895f7, 0x000ef015}}}, + {X: Field{[10]uint32{0x02e725f4, 0x027fb144, 0x02283ec5, 0x03aa20f8, 0x01e6a210, 0x0172ee27, 0x012268b3, 0x01b4bbd4, 0x020402a8, 0x0031de8e}}, Y: Field{[10]uint32{0x031cfba2, 0x027bb704, 0x029148dc, 0x03896d27, 0x036d1db4, 0x03b580ac, 0x007e5928, 0x0281ff96, 0x016bedf1, 0x000baf35}}}, + {X: Field{[10]uint32{0x03b11349, 0x02b4cd40, 0x00e9f060, 0x0010368e, 0x0011df55, 0x0071aafa, 0x03a3f1d7, 0x033dc555, 0x03a1f714, 0x00038b7b}}, Y: Field{[10]uint32{0x0045f229, 0x02d516b8, 0x0354bd88, 0x0368ee6a, 0x000c5107, 0x0195f651, 0x001912ea, 0x02ef1cbd, 0x03037a53, 0x0017b590}}}, + {X: Field{[10]uint32{0x02313e3c, 0x004910ed, 0x017b2d21, 0x03a73075, 0x0335280c, 0x0290cc2b, 0x03fca1e5, 0x02793058, 0x02cbb4cd, 0x003b8b44}}, Y: Field{[10]uint32{0x02153262, 0x02488ebb, 0x02f0849f, 0x01bf752e, 0x024057fb, 0x03ffeda5, 0x00ecafab, 0x01f1960e, 0x01c1a437, 0x0038a2c7}}}, + {X: Field{[10]uint32{0x019e28bd, 0x0095b59f, 0x0067c78f, 0x011489c5, 0x01a2109b, 0x016f9f0f, 0x0039c34f, 0x037b2bcf, 0x009673e6, 0x00010e4b}}, Y: Field{[10]uint32{0x00110c50, 0x00aa2180, 0x006fd590, 0x035f43d0, 0x00747d63, 0x010e9aed, 0x009edd53, 0x0094cec1, 0x0183ae35, 0x001ff930}}}, + {X: Field{[10]uint32{0x020d6960, 0x03fcc702, 0x017a6712, 0x02cbe046, 0x020f5586, 0x00023d26, 0x02655f16, 0x01d2b64e, 0x02ee1673, 0x00165cb8}}, Y: Field{[10]uint32{0x037c71d6, 0x037b069b, 0x00847bc3, 0x03f1f024, 0x02779343, 0x0240ef5c, 0x02e485ad, 0x01f1d228, 0x0055d0a5, 0x001b5c3f}}}, + {X: Field{[10]uint32{0x002c78aa, 0x0226bc0c, 0x03c19855, 0x00690038, 0x02a180f3, 0x02795d9a, 0x01f1faa2, 0x000c5622, 0x000afc2c, 0x002a1760}}, Y: Field{[10]uint32{0x017ec85e, 0x022c036e, 0x032a508f, 0x01e94b74, 0x02ff5aca, 0x00a196de, 0x0037b419, 0x01da8291, 0x03f4903c, 0x001d0a75}}}, + {X: Field{[10]uint32{0x01f1c245, 0x0215a7e9, 0x01cdc954, 0x00e1c9d6, 0x02ccee3f, 0x035418e1, 0x009e85d7, 0x013f326a, 0x030f0d59, 0x003260da}}, Y: Field{[10]uint32{0x0094fac0, 0x02dc20b4, 0x031ed943, 0x03166ed0, 0x03bed1c2, 0x035c59c9, 0x01a7d06f, 0x03fb58bc, 0x012693b7, 0x0027c2c6}}}, + {X: Field{[10]uint32{0x0202bd3b, 0x032b9ff4, 0x0222b588, 0x0106b991, 0x0375f2c4, 0x03658c64, 0x0348e5f6, 0x01195340, 0x00fdb2b8, 0x00328861}}, Y: Field{[10]uint32{0x026a4de9, 0x013c3f5c, 0x0162683c, 0x03207d9c, 0x01e2563c, 0x03a5ca6e, 0x013dbb2f, 0x01eab012, 0x00203d65, 0x0034488a}}}, + {X: Field{[10]uint32{0x02941fd8, 0x00b9814d, 0x0066b44a, 0x03331e93, 0x02b5dea0, 0x00181755, 0x03627048, 0x02599021, 0x01c63c9b, 0x00278145}}, Y: Field{[10]uint32{0x00be831a, 0x02c87255, 0x01e506d4, 0x018845fb, 0x0295f0b7, 0x036e8187, 0x02f789e2, 0x00b61abf, 0x0224a2eb, 0x000a778c}}}, + {X: Field{[10]uint32{0x035dc1cc, 0x023c002b, 0x02f6053a, 0x03694759, 0x018a3447, 0x0297cf5e, 0x022cf7af, 0x00e9fc30, 0x00253320, 0x0010810b}}, Y: Field{[10]uint32{0x01e6c05a, 0x022369fd, 0x03d9dff6, 0x007587dc, 0x03c54f3c, 0x02f04f44, 0x01420d50, 0x00e1c8c5, 0x027a6d6c, 0x003c1d69}}}, + {X: Field{[10]uint32{0x02295b96, 0x0259f1c4, 0x031bccd3, 0x032a6b90, 0x023f5a68, 0x0222557f, 0x0084ffd2, 0x000af916, 0x01bd4eab, 0x00199168}}, Y: Field{[10]uint32{0x0384cfad, 0x033344ae, 0x00b6730c, 0x01949014, 0x00bf9028, 0x003a4b13, 0x02d4b30f, 0x013b50a3, 0x01f91d26, 0x0008c7de}}}, + {X: Field{[10]uint32{0x00b32f9f, 0x0347ba35, 0x0075f30b, 0x02a21c3d, 0x036898f3, 0x0161f78d, 0x01482ab1, 0x01ba208c, 0x026d2c31, 0x00138a07}}, Y: Field{[10]uint32{0x0065602c, 0x03dd6070, 0x0091011e, 0x0357cdf9, 0x02c3f708, 0x03770d05, 0x0378062c, 0x027b7797, 0x01c81c11, 0x003d232b}}}, + {X: Field{[10]uint32{0x02af5136, 0x0153bc12, 0x00e02fcd, 0x034f90cb, 0x034fbaf7, 0x01e99880, 0x03c7ffbc, 0x007a7fc4, 0x001496e4, 0x001dc8d9}}, Y: Field{[10]uint32{0x002dd218, 0x020c1d09, 0x0328c800, 0x028195fc, 0x0398bec7, 0x00003da5, 0x00b4bf29, 0x03007bed, 0x01740d6c, 0x00088b80}}}, + {X: Field{[10]uint32{0x01d45860, 0x00765dc3, 0x02bddaf3, 0x027fded7, 0x0018ab00, 0x00488610, 0x026070cb, 0x01e166b6, 0x004c8d46, 0x000fcadc}}, Y: Field{[10]uint32{0x034dd88a, 0x03ebaa0e, 0x02a9fb59, 0x022ff417, 0x03e2b6ab, 0x035868b7, 0x038dd215, 0x03ad7a30, 0x03a5146a, 0x00291c59}}}, + {X: Field{[10]uint32{0x00ad4146, 0x02e7a4bb, 0x01b51640, 0x0342b931, 0x0384b3ac, 0x017e60f6, 0x03b70f03, 0x036044ba, 0x0130d243, 0x001e53b0}}, Y: Field{[10]uint32{0x007be84d, 0x01ddeab4, 0x01e71c80, 0x03576303, 0x00658f2d, 0x00debbd7, 0x00a537f9, 0x0171f3bb, 0x00be95c2, 0x00127b7b}}}, + {X: Field{[10]uint32{0x01a96aa3, 0x03258525, 0x023ba808, 0x0335ba7f, 0x0149c554, 0x01ec702c, 0x0304cf4a, 0x0384ade6, 0x01ece363, 0x001d43fe}}, Y: Field{[10]uint32{0x021d59a9, 0x00540bde, 0x02dfb2de, 0x02fc7931, 0x022d4474, 0x028182d0, 0x0270f149, 0x028fb7d3, 0x029dd1c5, 0x00168a09}}}, + {X: Field{[10]uint32{0x026272cf, 0x017ecaad, 0x00169633, 0x00b26dfd, 0x02263b08, 0x0344a518, 0x02c9ec1f, 0x01a3b2e5, 0x01d7df66, 0x00359701}}, Y: Field{[10]uint32{0x02188839, 0x02e93c37, 0x03c37891, 0x0019acbd, 0x017e48be, 0x031dff6b, 0x02cc5b7f, 0x0350b490, 0x00c51c10, 0x00035dca}}}, + {X: Field{[10]uint32{0x015190c3, 0x016fbd56, 0x012f6122, 0x00e5ca8f, 0x02aecffe, 0x036e685c, 0x039d2700, 0x03a7a6d6, 0x00b68cb2, 0x0034e013}}, Y: Field{[10]uint32{0x01e30d5e, 0x03091c6d, 0x01613482, 0x00f9bfc3, 0x00287902, 0x01814d0a, 0x02f41314, 0x01922cc2, 0x010c9568, 0x00047ecd}}}, + {X: Field{[10]uint32{0x00351bf6, 0x03a7a11c, 0x01b3db34, 0x0104441b, 0x036a9382, 0x03b3e34d, 0x0095c619, 0x00d27db3, 0x022635c6, 0x003dd8b7}}, Y: Field{[10]uint32{0x009fd814, 0x03702eaf, 0x0010b1ca, 0x00b4fa21, 0x000ccfe2, 0x026444b9, 0x013352da, 0x003e7b9d, 0x01e0c8a5, 0x003719fe}}}, + {X: Field{[10]uint32{0x03b87a71, 0x0395d9d4, 0x00e7dac5, 0x03baea1f, 0x03d7dcec, 0x005f8e49, 0x02e163ed, 0x03fd2c5f, 0x00bfa827, 0x002ac62d}}, Y: Field{[10]uint32{0x030da919, 0x03aa6e4a, 0x01ed5b57, 0x00734ac7, 0x0229706d, 0x01341fdc, 0x002bc09c, 0x00249b22, 0x03d573e4, 0x001b6e0e}}}, + {X: Field{[10]uint32{0x0198c95e, 0x0199a540, 0x02d8bf5c, 0x02b63d8e, 0x02b12478, 0x0116588a, 0x0343a870, 0x006ba368, 0x0248fec2, 0x003dd530}}, Y: Field{[10]uint32{0x0052b1bd, 0x009e6498, 0x02e5293b, 0x01e8caee, 0x00e056ca, 0x03d511dd, 0x008d8e67, 0x021ddae1, 0x02a25f9c, 0x000b3edd}}}, + {X: Field{[10]uint32{0x0246c51c, 0x018b53e6, 0x008e2c24, 0x030c4d07, 0x02103516, 0x005af285, 0x013ecdb7, 0x001e63e2, 0x033e3c3f, 0x003e3651}}, Y: Field{[10]uint32{0x03924e02, 0x016fa4b5, 0x006869e0, 0x00ef846d, 0x015c53bd, 0x01d51e0d, 0x03314dac, 0x03f8e89a, 0x025fa422, 0x00157c01}}}, + {X: Field{[10]uint32{0x014eb741, 0x0341435d, 0x00395352, 0x02d2fef1, 0x012f7c5a, 0x02ca7f6a, 0x035fa225, 0x032f2269, 0x0142d294, 0x000218e6}}, Y: Field{[10]uint32{0x03d11e4d, 0x02762a79, 0x01c29677, 0x020d32e0, 0x03741da8, 0x02cfb5f3, 0x0179abdd, 0x038d68db, 0x022a445d, 0x000e44fa}}}, + {X: Field{[10]uint32{0x0395d5c2, 0x03469e2e, 0x02c61794, 0x020820eb, 0x02068572, 0x0169c6d2, 0x0319230b, 0x00e22fc5, 0x006c706a, 0x000a9623}}, Y: Field{[10]uint32{0x00c47592, 0x010b12db, 0x01b00968, 0x02bafeec, 0x0361f458, 0x01f847e5, 0x007f07ea, 0x03db6590, 0x01771a56, 0x002bc97b}}}, + {X: Field{[10]uint32{0x020a0cb6, 0x03a35500, 0x01fe337e, 0x005c08b8, 0x00a54597, 0x02697b6c, 0x02dba4ad, 0x02e6a2c9, 0x01ee8931, 0x0004def4}}, Y: Field{[10]uint32{0x03ceea62, 0x01228c05, 0x00b7ff58, 0x01788455, 0x01eaea10, 0x021f5da8, 0x03e9f0ee, 0x031df49c, 0x037b8197, 0x00337a7e}}}, + {X: Field{[10]uint32{0x02de2bbf, 0x02ef8cb4, 0x03b48d21, 0x03aa8782, 0x020f9b5f, 0x00ebcb0a, 0x01523711, 0x00c4f25c, 0x0345c686, 0x00119600}}, Y: Field{[10]uint32{0x0092ef64, 0x02a3ba7b, 0x030510a3, 0x023a85ae, 0x027edade, 0x019bd30a, 0x03bc79db, 0x027fecaf, 0x017bb632, 0x001d6f17}}}, + {X: Field{[10]uint32{0x011bd233, 0x017bd90e, 0x02a8556d, 0x03586ca0, 0x0102ef93, 0x009abd51, 0x02fc491c, 0x016b3660, 0x0252afaf, 0x00128524}}, Y: Field{[10]uint32{0x00cfe285, 0x00f5e3d8, 0x0259a3b5, 0x03f16897, 0x03bb9e83, 0x018fd752, 0x0256ea38, 0x016d8259, 0x00bc10b5, 0x003ef040}}}, + {X: Field{[10]uint32{0x01a01f18, 0x03e4bc85, 0x013faad0, 0x0225f65d, 0x0395bdf0, 0x011d7592, 0x00251313, 0x033e3c38, 0x01a6fc0b, 0x002253af}}, Y: Field{[10]uint32{0x035ec056, 0x0389b3d7, 0x003779fa, 0x000b8a65, 0x001e4ede, 0x01f4deb8, 0x01d02519, 0x01cb3f1a, 0x01501557, 0x002c97cc}}}, + {X: Field{[10]uint32{0x01eb032e, 0x029bab91, 0x0285a3c2, 0x029be796, 0x002deedc, 0x03f5c82b, 0x01ef1b2b, 0x02e244c3, 0x02930a91, 0x0039c362}}, Y: Field{[10]uint32{0x00d9f9cc, 0x03f7c453, 0x01b0a693, 0x02061e28, 0x02fe1026, 0x024472c0, 0x03b96ea4, 0x03fdad17, 0x0253a3b0, 0x002f4ebb}}}, + {X: Field{[10]uint32{0x02b36852, 0x0117eed3, 0x0047eeb2, 0x00fc4d75, 0x02118988, 0x02551ada, 0x016765bf, 0x02c77528, 0x01c3e5cc, 0x001f2c7f}}, Y: Field{[10]uint32{0x03ca582d, 0x0238b2a3, 0x014e0196, 0x0022a3fb, 0x00d18890, 0x0176fc96, 0x00edbe17, 0x017fdee0, 0x00d6becf, 0x000243b8}}}, + {X: Field{[10]uint32{0x03b9bfc1, 0x02fef0a1, 0x00685bf9, 0x0340c484, 0x00b39f57, 0x00cae416, 0x0090a214, 0x03685e3f, 0x02d80331, 0x001449e2}}, Y: Field{[10]uint32{0x03a66b6f, 0x03773a74, 0x00040536, 0x0387dd6f, 0x017bc1f9, 0x00976cf9, 0x03ad759b, 0x0399e230, 0x0147f39c, 0x00016abd}}}, + {X: Field{[10]uint32{0x00f59cdd, 0x03a64115, 0x036cee9f, 0x00215389, 0x030fee50, 0x00bf3c3c, 0x03563082, 0x00c1a122, 0x021fc52b, 0x003c3baa}}, Y: Field{[10]uint32{0x02124f02, 0x02ecb27c, 0x02e63ab3, 0x03ea0460, 0x00d51cf7, 0x02befacc, 0x01e5e016, 0x01c2f7ad, 0x009b944d, 0x000243fe}}}, + {X: Field{[10]uint32{0x03aeea71, 0x0376dac0, 0x01df6648, 0x02bc94ad, 0x00df5b4c, 0x01ed4700, 0x03670c22, 0x003f4984, 0x03f28bf9, 0x000dbf26}}, Y: Field{[10]uint32{0x03836683, 0x0038e8f9, 0x0075e13d, 0x031a7f64, 0x03d975ec, 0x0376eef9, 0x02c81614, 0x01b0a181, 0x0076f1ac, 0x00221f0e}}}, + {X: Field{[10]uint32{0x0391b68b, 0x037caa26, 0x03acdba4, 0x02757996, 0x02135c54, 0x030a7d8b, 0x00d2d041, 0x010db385, 0x026b0cf9, 0x001b8c78}}, Y: Field{[10]uint32{0x00d0e7ae, 0x0258622b, 0x01a85858, 0x021f426a, 0x0194c1af, 0x029de2cc, 0x037d9f77, 0x02f6aad7, 0x02849e63, 0x00008e25}}}, + {X: Field{[10]uint32{0x0198e864, 0x02499c87, 0x02eac357, 0x03613dd0, 0x003da9fa, 0x02b4cea8, 0x02a8a1ce, 0x030afeb1, 0x0249a4b1, 0x00314111}}, Y: Field{[10]uint32{0x03a1027b, 0x02c80769, 0x000af537, 0x0136e350, 0x0345fdc8, 0x0330450e, 0x03d13270, 0x025aedc5, 0x02d283e6, 0x001b4980}}}, + {X: Field{[10]uint32{0x0299ca28, 0x02013b1a, 0x011e6eca, 0x01331148, 0x03b9b2e8, 0x016801ee, 0x028e963b, 0x011356f6, 0x0271f13c, 0x0002a4cf}}, Y: Field{[10]uint32{0x02200faa, 0x003d967d, 0x014f5c1c, 0x01e55084, 0x00c3ce02, 0x00750bf7, 0x01712073, 0x038bdb99, 0x03bcec45, 0x0024c6fc}}}, + {X: Field{[10]uint32{0x00e4a58b, 0x037d977e, 0x021aa83a, 0x0342c4ca, 0x030b8559, 0x0045c0e2, 0x0298884e, 0x00b5886e, 0x021d840c, 0x002400fd}}, Y: Field{[10]uint32{0x00d30895, 0x03d5b73a, 0x01532b67, 0x02b1cd8c, 0x001388a1, 0x02e89a15, 0x02b7ecec, 0x00e54a7f, 0x0124f72b, 0x001431d4}}}, + {X: Field{[10]uint32{0x02a0a886, 0x02df0df2, 0x022c533f, 0x02a7a7cf, 0x02914e21, 0x005ca069, 0x038abdfc, 0x01c33218, 0x00183cb3, 0x003f201f}}, Y: Field{[10]uint32{0x00af00ba, 0x009286fa, 0x02cdee9d, 0x0341ae34, 0x021ccf6f, 0x03559095, 0x02f72639, 0x00756ea6, 0x013e75ac, 0x000eb1e7}}}, + {X: Field{[10]uint32{0x03ee9cbd, 0x024f33b7, 0x033c1862, 0x02b9f901, 0x03cd780d, 0x0142f352, 0x03b608f1, 0x02b08ed0, 0x02e4aca4, 0x000f41ca}}, Y: Field{[10]uint32{0x0265d9b6, 0x0355749f, 0x0385792f, 0x00519f68, 0x03f9c604, 0x00235d89, 0x00fc5630, 0x0327e2a6, 0x0043f721, 0x0001b679}}}, + {X: Field{[10]uint32{0x03f80dc0, 0x02aaf669, 0x01d3d106, 0x02f1eb2c, 0x03ba6e26, 0x008bebe2, 0x03c5eed5, 0x02d29f4a, 0x01947061, 0x003432e1}}, Y: Field{[10]uint32{0x03012e0a, 0x00e791de, 0x0092c9b7, 0x03c507c2, 0x038d7562, 0x006a61da, 0x0107b82d, 0x03730680, 0x0326e9d0, 0x003eff43}}}, + {X: Field{[10]uint32{0x035bc9fd, 0x01b496d8, 0x02e3241a, 0x02b090b3, 0x00267aad, 0x01c88730, 0x019f46cc, 0x03191079, 0x00ab6416, 0x00393b70}}, Y: Field{[10]uint32{0x03cdc71e, 0x0307f0d3, 0x02964b84, 0x01382ec1, 0x01c496fd, 0x020201f4, 0x00344829, 0x02d31012, 0x02e9cea7, 0x003d070e}}}, + {X: Field{[10]uint32{0x017eb4b2, 0x034caaf7, 0x01271557, 0x01046c2d, 0x02ffb806, 0x012f83d7, 0x01a83c88, 0x0244063d, 0x010b2d3d, 0x00188ced}}, Y: Field{[10]uint32{0x015dbcc5, 0x007bc661, 0x00399791, 0x00af7690, 0x01034a3a, 0x00a1622c, 0x030f21e3, 0x00ab095d, 0x0124ffdd, 0x00237eab}}}, + {X: Field{[10]uint32{0x02a19ab5, 0x012df714, 0x015df943, 0x017af78a, 0x03c427e6, 0x03a607da, 0x034e5447, 0x0197889e, 0x0162e272, 0x001b2800}}, Y: Field{[10]uint32{0x0154cce1, 0x015f9944, 0x03a5ce0f, 0x00583854, 0x03223e89, 0x02aece81, 0x03fe297b, 0x009f8290, 0x0363a8f2, 0x0034cfd7}}}, + {X: Field{[10]uint32{0x02fefcfc, 0x02199b8d, 0x005b3cd6, 0x024a2d84, 0x02d6c9d9, 0x0339f2c5, 0x01328ae7, 0x02357703, 0x01aa5d2a, 0x00300481}}, Y: Field{[10]uint32{0x02831d3e, 0x00061643, 0x03b453ad, 0x02affea6, 0x02cf2988, 0x02be2e9f, 0x03d6f6f6, 0x02025786, 0x0399c4f4, 0x002d9797}}}, + {X: Field{[10]uint32{0x02e0e155, 0x02de34b6, 0x00abb4e0, 0x025d29b1, 0x0107b8a5, 0x020143ce, 0x016fb195, 0x01a32d87, 0x03930e62, 0x0038e594}}, Y: Field{[10]uint32{0x00731737, 0x00a26fe0, 0x00828a2f, 0x02973683, 0x003f971f, 0x014e0ecb, 0x00048928, 0x03876460, 0x01462ed6, 0x0007de2b}}}, + {X: Field{[10]uint32{0x00b099ce, 0x0120889b, 0x004f8012, 0x03e142f6, 0x013dc03a, 0x03f6643f, 0x010c1a69, 0x02750c01, 0x00f3702a, 0x0009eff4}}, Y: Field{[10]uint32{0x00643de8, 0x0306c72f, 0x00f390fe, 0x03c36425, 0x00c49fd3, 0x0102f9f0, 0x030c0bce, 0x02baf466, 0x0360e8ca, 0x0008b85a}}}, + {X: Field{[10]uint32{0x0396a2f0, 0x0020281b, 0x023c6cbf, 0x00b1bdd7, 0x012a3717, 0x00a65ea2, 0x02c17771, 0x0255967b, 0x03c02331, 0x0020843e}}, Y: Field{[10]uint32{0x02afee8d, 0x03aa4791, 0x0109716d, 0x0095b469, 0x03bfacbb, 0x01787bac, 0x011d5528, 0x019b2eec, 0x03921011, 0x0007775d}}}, + {X: Field{[10]uint32{0x02347b5e, 0x034869d3, 0x03ab089c, 0x0197e2fb, 0x00ae4d50, 0x0178bfe0, 0x015298a2, 0x02f6037c, 0x02b65fcb, 0x00057319}}, Y: Field{[10]uint32{0x03937c97, 0x02b34c81, 0x0334b6dd, 0x00d1223e, 0x007b225b, 0x01585b4a, 0x03324c9f, 0x020a5b7a, 0x03e93574, 0x002512d1}}}, + {X: Field{[10]uint32{0x00c97976, 0x0006b825, 0x02c4bff8, 0x03f1c9b0, 0x02c7bb08, 0x0279b0d7, 0x021a482a, 0x0005a47a, 0x02a24596, 0x003adede}}, Y: Field{[10]uint32{0x02d1b1f6, 0x008fe08b, 0x003f227c, 0x01380413, 0x02f5596f, 0x00fc195a, 0x03d20e90, 0x01de47f2, 0x0170cc18, 0x00134ba5}}}, + {X: Field{[10]uint32{0x029ba12c, 0x0039f7d7, 0x01ea15fb, 0x001ad029, 0x0118e7c1, 0x025aa11a, 0x02436e09, 0x03a11308, 0x02fced29, 0x0011663e}}, Y: Field{[10]uint32{0x035e6093, 0x0388a3fc, 0x016297dc, 0x015796c2, 0x01978a85, 0x03dc5982, 0x0379dfe7, 0x03a8b0e5, 0x02b6d292, 0x0039cf65}}}, + {X: Field{[10]uint32{0x028600f7, 0x01fbacc6, 0x007058e3, 0x03f06443, 0x00e57d4d, 0x01be4386, 0x02a25917, 0x0396515c, 0x02863612, 0x001260d6}}, Y: Field{[10]uint32{0x03cfa531, 0x003b4df7, 0x017b9825, 0x028b9223, 0x02464c08, 0x003a034d, 0x023b147e, 0x00b30730, 0x013a0fbd, 0x0000edd8}}}, + {X: Field{[10]uint32{0x02335351, 0x0245bdf3, 0x005b9965, 0x02df464c, 0x033cbfe0, 0x0136f70c, 0x023177b0, 0x02019cca, 0x03ed1fcc, 0x000e9b5b}}, Y: Field{[10]uint32{0x026624ea, 0x021a4956, 0x01d0df29, 0x01586f47, 0x0111eb2b, 0x01fc4190, 0x00a6706d, 0x0185fc52, 0x018a314d, 0x00330fcf}}}, + {X: Field{[10]uint32{0x02d7a9f5, 0x035b1ece, 0x02a78fb0, 0x0093b9ee, 0x00f672a0, 0x0080d6dd, 0x012d2efb, 0x03f8c33a, 0x01866860, 0x00084821}}, Y: Field{[10]uint32{0x00bebbb7, 0x01d2825e, 0x01d7ce10, 0x038d07c9, 0x0396ff0c, 0x03dba75c, 0x02e8be11, 0x02c7b0ff, 0x01be0051, 0x002abc51}}}, + {X: Field{[10]uint32{0x026e4e06, 0x03681349, 0x03cc867c, 0x0209b3bf, 0x01833ac0, 0x0072c46e, 0x03d609c5, 0x00bc2598, 0x032ac9bb, 0x003e0644}}, Y: Field{[10]uint32{0x00891de5, 0x009c8e53, 0x02bb37e2, 0x03bdd91a, 0x00c52f48, 0x01012bbb, 0x03fd1a06, 0x00c172ab, 0x0238ec6a, 0x002c7f79}}}, + {X: Field{[10]uint32{0x02ec009d, 0x02a50df0, 0x00428423, 0x028484f1, 0x01168385, 0x02bb58b6, 0x0334d720, 0x0190310d, 0x01d88786, 0x0014db01}}, Y: Field{[10]uint32{0x036df0d5, 0x0224c976, 0x02f134b4, 0x03b87ea7, 0x01fd84dd, 0x020e8231, 0x03c2b43c, 0x037861a2, 0x0100d827, 0x001fd2f8}}}, + {X: Field{[10]uint32{0x01df722b, 0x02dceea8, 0x024bd650, 0x02c68e68, 0x0109de2f, 0x00b22a16, 0x02e3ed34, 0x036dd8df, 0x023ec4c6, 0x0010ca04}}, Y: Field{[10]uint32{0x03a40857, 0x0275fa58, 0x01b1594c, 0x00403d75, 0x014ee11f, 0x02d3e1bd, 0x0222fa71, 0x01dd4f9a, 0x02ea0127, 0x00207000}}}, + {X: Field{[10]uint32{0x012a5f17, 0x00369a04, 0x01a08155, 0x00cb543a, 0x016a85fc, 0x003e6170, 0x029e5360, 0x0265461a, 0x02fef852, 0x003cf855}}, Y: Field{[10]uint32{0x008892d2, 0x037426ad, 0x010915d5, 0x0339d063, 0x03a2f441, 0x00d8ae14, 0x0167e83c, 0x0039bd97, 0x026b56ff, 0x00247ff5}}}, + {X: Field{[10]uint32{0x03456cc9, 0x00aa3622, 0x030e6824, 0x02bfabc0, 0x006645a1, 0x0153102b, 0x028a716a, 0x00fd0b4b, 0x035984e1, 0x000cae9c}}, Y: Field{[10]uint32{0x00b4c6f5, 0x022c60ef, 0x02200f86, 0x017279f9, 0x03f05576, 0x03bc9324, 0x02ab3178, 0x02c542a0, 0x031e1c32, 0x0019fff3}}}, + {X: Field{[10]uint32{0x01829311, 0x02f02b16, 0x03dddcca, 0x024c62ae, 0x029c868b, 0x01362d2a, 0x00674cf6, 0x00417946, 0x033a043d, 0x0032e70a}}, Y: Field{[10]uint32{0x002b691f, 0x0181fba1, 0x015db242, 0x017ef4af, 0x01834bea, 0x02721674, 0x013ac479, 0x001daf7b, 0x02f2233f, 0x0007f19f}}}, + {X: Field{[10]uint32{0x029234f0, 0x028c6f4b, 0x01e856ef, 0x015eaf06, 0x035effa9, 0x0026f34e, 0x0349695e, 0x01c1c0c8, 0x0058b7bf, 0x003853ca}}, Y: Field{[10]uint32{0x00e08bdb, 0x03457937, 0x01761f3c, 0x00352a25, 0x02cf8cbf, 0x00357fc1, 0x03cbc258, 0x03f4e620, 0x009dd3f3, 0x000f8139}}}, + {X: Field{[10]uint32{0x03550d82, 0x02dce221, 0x01e010d7, 0x03b16102, 0x0274810d, 0x025ffc09, 0x0078113c, 0x02e38c33, 0x037b1c27, 0x00055afa}}, Y: Field{[10]uint32{0x00bc5371, 0x009ea464, 0x0017b16e, 0x0318305b, 0x013a8e92, 0x0164e664, 0x02adf2fd, 0x01bb20d4, 0x030a8021, 0x0031c45c}}}, + {X: Field{[10]uint32{0x0055d600, 0x0262d6cb, 0x013557b7, 0x0267e00e, 0x01a24a33, 0x028b76a8, 0x000e4959, 0x01a1912e, 0x03e6b9b4, 0x003797a9}}, Y: Field{[10]uint32{0x00d48ee8, 0x00f18563, 0x037d53a0, 0x019c8adf, 0x02b9b1de, 0x0060b354, 0x00a9d24e, 0x008f4b70, 0x0027e6a8, 0x00224068}}}, + {X: Field{[10]uint32{0x0017c3c7, 0x02e78ffb, 0x01adeb79, 0x005284a0, 0x00aea074, 0x02cafc3b, 0x037312e7, 0x03b51896, 0x03688bfa, 0x0023b774}}, Y: Field{[10]uint32{0x0155da7b, 0x03b6db1e, 0x032316d8, 0x02c5713d, 0x0359b885, 0x0088f95e, 0x00a48a89, 0x0074d357, 0x02f92617, 0x000b6d0e}}}, + {X: Field{[10]uint32{0x00b1d4e3, 0x02b4f5fc, 0x02b85fb2, 0x003fbe57, 0x0187872e, 0x0088dfb6, 0x02489ae2, 0x03477a3e, 0x036a665a, 0x001725c6}}, Y: Field{[10]uint32{0x038b1f66, 0x031a4e97, 0x039a6c4f, 0x01ecc0b4, 0x01aa8d4d, 0x00ae8076, 0x0332ff74, 0x02bdbc2b, 0x019837c2, 0x00135c7d}}}, + {X: Field{[10]uint32{0x02b9e228, 0x03edc291, 0x0076885c, 0x03bcd095, 0x01bd3586, 0x00aa3c73, 0x0366589a, 0x00adab56, 0x013c2821, 0x003b7ec9}}, Y: Field{[10]uint32{0x02616c00, 0x02ca892c, 0x00c1d7f7, 0x0380944d, 0x02594e42, 0x03cc18a4, 0x00b26b84, 0x007da6e3, 0x0208b7e8, 0x000f96d9}}}, + {X: Field{[10]uint32{0x01525c13, 0x0315adf7, 0x03384737, 0x031acb19, 0x03d2373c, 0x00895d2e, 0x0163dd4e, 0x01dcb36c, 0x024ae127, 0x0010e57c}}, Y: Field{[10]uint32{0x00103526, 0x02f99304, 0x0047a819, 0x037006d1, 0x00676581, 0x03dce55d, 0x0096913d, 0x0030b192, 0x03254c80, 0x002eb1b9}}}, + {X: Field{[10]uint32{0x006866f5, 0x03c3fc65, 0x023eb182, 0x014d7d8a, 0x038c7823, 0x017d6a1f, 0x0113b64b, 0x019adfe2, 0x02d573a7, 0x00204402}}, Y: Field{[10]uint32{0x01a00c73, 0x02d05c3a, 0x029c9d28, 0x02ea61c2, 0x01c6afb8, 0x01477675, 0x0068f7d0, 0x00226674, 0x016e325b, 0x0014b2b0}}}, + {X: Field{[10]uint32{0x0395120f, 0x008d1efa, 0x02e407f7, 0x017b9777, 0x01dee3a0, 0x0285085b, 0x02358c3a, 0x020519ab, 0x01514116, 0x003f4e81}}, Y: Field{[10]uint32{0x028ee5b7, 0x01ef34f6, 0x03250e4c, 0x001d6339, 0x0011a3c6, 0x01f812c8, 0x01b7b88b, 0x02c4aae2, 0x030d45ce, 0x000abcbc}}}, + {X: Field{[10]uint32{0x02435ff9, 0x03f0fbf9, 0x018fa4e3, 0x00caaf46, 0x0276d1a0, 0x0285f5b0, 0x0305b6df, 0x03bbe8ff, 0x0358a7ec, 0x0005e956}}, Y: Field{[10]uint32{0x01574d4f, 0x026fdc6e, 0x02240bc9, 0x02915f81, 0x02418f35, 0x01c7c14d, 0x01cee72e, 0x019f043f, 0x0158a3ad, 0x0035c9ce}}}, + {X: Field{[10]uint32{0x03789b6d, 0x02d0224e, 0x0003bc49, 0x00157b5c, 0x02793fd0, 0x0057a2c8, 0x01c73aee, 0x017a8231, 0x03b8e2ca, 0x0021c32d}}, Y: Field{[10]uint32{0x03e67aa3, 0x003b8106, 0x01cc6a7b, 0x03b2b542, 0x0104badb, 0x0089912a, 0x017a9bce, 0x0072bc9b, 0x03407b70, 0x0030cf22}}}, + {X: Field{[10]uint32{0x0271f8a7, 0x00b306d3, 0x00897545, 0x00db6039, 0x03ffbf7c, 0x01432829, 0x0053c89a, 0x03bc02b7, 0x01fcdc46, 0x003e5471}}, Y: Field{[10]uint32{0x0392c95f, 0x0081ce31, 0x02648751, 0x02495e4b, 0x01c1705b, 0x0137e796, 0x0064d7d2, 0x033090c2, 0x00217849, 0x001ab8be}}}, + {X: Field{[10]uint32{0x02a0caf1, 0x01240b25, 0x02d6131e, 0x00a858df, 0x036cbd83, 0x0062b68f, 0x011bb06a, 0x0319dab8, 0x037f3b92, 0x002bae01}}, Y: Field{[10]uint32{0x03cc1e35, 0x00cb87ab, 0x00cfde02, 0x01f42cdf, 0x036c8a6d, 0x02fcc5ff, 0x0275fb98, 0x0290c253, 0x011df5d4, 0x000a7d07}}}, + {X: Field{[10]uint32{0x013b78f9, 0x0080d7cc, 0x0260cb9d, 0x022d6577, 0x038482b7, 0x036161f0, 0x0118a7e5, 0x00b9601b, 0x01975d2f, 0x00351bd3}}, Y: Field{[10]uint32{0x006392f0, 0x00d246ba, 0x0233c105, 0x02650c5b, 0x02f704e1, 0x00c7fb90, 0x02154ef0, 0x0045d8e5, 0x01aa3bdc, 0x002575e0}}}, + {X: Field{[10]uint32{0x0229b201, 0x0297c71e, 0x02eaf4f3, 0x025dcf1d, 0x03af810b, 0x0126e7b0, 0x021b54ac, 0x03627cb8, 0x03444b4b, 0x00001abe}}, Y: Field{[10]uint32{0x02bf932f, 0x0186089b, 0x0334eaf0, 0x00342fb4, 0x0364db46, 0x00e22acd, 0x00ed90d1, 0x02d3384d, 0x001fd7d3, 0x000d40a4}}}, + {X: Field{[10]uint32{0x03d86976, 0x00bdfb7a, 0x00394093, 0x01533ebe, 0x01e66349, 0x0161ebd7, 0x03f60869, 0x005c0e9e, 0x0182a38b, 0x0017c0b9}}, Y: Field{[10]uint32{0x017afec2, 0x01a8014b, 0x00a7def4, 0x00328ada, 0x02ccfa5d, 0x0102e3f8, 0x00b06bf7, 0x029e5ac9, 0x00de92f3, 0x0028121f}}}, + {X: Field{[10]uint32{0x020599fe, 0x014b4e82, 0x02e33c66, 0x01d67155, 0x03ad70eb, 0x00d5199f, 0x007b885f, 0x00b3b568, 0x00826043, 0x0009909d}}, Y: Field{[10]uint32{0x0028ce85, 0x03e163ae, 0x00c62949, 0x033db811, 0x03a63867, 0x00d0114e, 0x02ea7379, 0x00e0bf5d, 0x00fe2560, 0x0004648e}}}, + {X: Field{[10]uint32{0x029f91dc, 0x01999811, 0x037ff2cd, 0x029f8796, 0x014f03a5, 0x017a0dfb, 0x0319a7dd, 0x02b7694a, 0x025ad327, 0x001aca8f}}, Y: Field{[10]uint32{0x0254c6d9, 0x0012f3a2, 0x0257a22f, 0x0197a35f, 0x01354ed2, 0x036a7a51, 0x03365601, 0x020be83c, 0x012606b4, 0x000be7d1}}}, + {X: Field{[10]uint32{0x035daa79, 0x000d1710, 0x03dc4fcc, 0x01df5d25, 0x02e5fbaf, 0x03bc4fa2, 0x010934dd, 0x013eeaac, 0x008b7e21, 0x0009622e}}, Y: Field{[10]uint32{0x01435bbf, 0x02f04531, 0x035e151e, 0x013eb2e8, 0x0261ca64, 0x03c69476, 0x03f142ce, 0x01b53235, 0x010bd3ba, 0x000f973e}}}, + {X: Field{[10]uint32{0x02551a93, 0x0173fe77, 0x03fcbcff, 0x011b0830, 0x02e4e3d8, 0x02805012, 0x00178b40, 0x00bbbfea, 0x01469285, 0x00365210}}, Y: Field{[10]uint32{0x02a6d5a4, 0x020962e5, 0x024ccdbb, 0x02f65a61, 0x0213ea0a, 0x02b66618, 0x00a12196, 0x03109d0d, 0x017fe628, 0x00356c3f}}}, + {X: Field{[10]uint32{0x030de2ff, 0x02713a8e, 0x025eb9fe, 0x01e19f3b, 0x005ccc1e, 0x02dbd1d5, 0x0364b1c9, 0x00821c32, 0x03dc3a2f, 0x00173e07}}, Y: Field{[10]uint32{0x01bc0d7d, 0x023ee305, 0x031131b7, 0x0094036b, 0x01e7ff31, 0x03b1cd1c, 0x01dc7005, 0x023977df, 0x031cf6bb, 0x00382c2a}}}, + {X: Field{[10]uint32{0x03e879a7, 0x01999836, 0x023203b8, 0x01c459de, 0x00f8ed24, 0x004cb1a5, 0x00b3f174, 0x03f6d5c1, 0x037eb719, 0x00106d3b}}, Y: Field{[10]uint32{0x0221c85f, 0x0024ee0d, 0x0081ae12, 0x02a8722a, 0x009f44c2, 0x03ab0669, 0x028b459e, 0x0088d736, 0x01b1cbae, 0x0029bf99}}}, + {X: Field{[10]uint32{0x03117af7, 0x01c26a6e, 0x03bdc5c2, 0x00fd01bc, 0x007a4c0a, 0x019013b2, 0x01d16918, 0x02478aa3, 0x032c41f6, 0x0010fb55}}, Y: Field{[10]uint32{0x02481da3, 0x03481cfe, 0x03ac3fd4, 0x024c36be, 0x0390a2b0, 0x02f9351d, 0x02cbbab7, 0x000cd1ae, 0x01b890b4, 0x002dee78}}}, + {X: Field{[10]uint32{0x03397de3, 0x00e39186, 0x02e421c3, 0x0107a17e, 0x0281722b, 0x00bc6557, 0x00bb5260, 0x021a98c5, 0x02192230, 0x00138042}}, Y: Field{[10]uint32{0x03a65fa2, 0x016689fa, 0x02ec4a61, 0x038dc311, 0x00283b44, 0x02f42ee3, 0x0076e7b3, 0x017b6112, 0x011c0347, 0x003c34fc}}}, + {X: Field{[10]uint32{0x0211f36b, 0x03510bfb, 0x01e2241d, 0x00a9f4d5, 0x0045e15d, 0x007b7361, 0x03c385e8, 0x01af3136, 0x00bb7fc8, 0x002cd827}}, Y: Field{[10]uint32{0x009c5f68, 0x00643237, 0x018e20e6, 0x006aa85a, 0x00c30891, 0x01deeea2, 0x00017dc9, 0x00d3fe01, 0x01aca3df, 0x002181f9}}}, + {X: Field{[10]uint32{0x03965b4e, 0x01b90fb7, 0x009d1df9, 0x02dac9c9, 0x02d1bdd6, 0x036c4497, 0x0168cdf6, 0x03ef4def, 0x00b20543, 0x00111798}}, Y: Field{[10]uint32{0x03715fd1, 0x0373c2f1, 0x025b00b5, 0x0148a1e9, 0x03c65f8b, 0x0248b9c4, 0x03fdc7cf, 0x02d1eafa, 0x018a8c4a, 0x00297e91}}}, + {X: Field{[10]uint32{0x00f50fc9, 0x02ed90c4, 0x0364cf9d, 0x01278032, 0x01be875b, 0x03c53062, 0x0359a7be, 0x03267e1a, 0x02279264, 0x001c27e0}}, Y: Field{[10]uint32{0x00960d10, 0x00540c56, 0x0362883f, 0x03ffeaab, 0x013d4903, 0x01a39379, 0x029064b4, 0x034afa29, 0x03f0cd28, 0x0005a009}}}, + {X: Field{[10]uint32{0x01fb4ba3, 0x019ffe4a, 0x00cdbe15, 0x017befc6, 0x008a2e9d, 0x00ccfc87, 0x012e725a, 0x00902e89, 0x000dcbd1, 0x0018aa88}}, Y: Field{[10]uint32{0x020a1347, 0x038fca27, 0x021b7b18, 0x00ac4b7b, 0x001ec328, 0x010f906b, 0x0106b468, 0x02f6f12e, 0x016c7017, 0x00066abf}}}, + {X: Field{[10]uint32{0x0082c09e, 0x03c42b2e, 0x02e11f38, 0x01ff2206, 0x01e12398, 0x000b8aae, 0x01f23898, 0x01191bea, 0x01588ed5, 0x000ae9ce}}, Y: Field{[10]uint32{0x035a25a6, 0x03cf848d, 0x00423721, 0x024ddd46, 0x03d8f8a1, 0x012004d4, 0x02cc45d3, 0x0262bbe1, 0x021c9c0a, 0x003cdf6a}}}, + {X: Field{[10]uint32{0x01005de8, 0x00539bde, 0x02397073, 0x0380d64a, 0x01e266e9, 0x02d677f8, 0x01c0f549, 0x02da6ab9, 0x01cce8fb, 0x00219cae}}, Y: Field{[10]uint32{0x0305af65, 0x025ea1a6, 0x01aa399a, 0x01d699ad, 0x02c411e8, 0x03efe7ab, 0x00aac680, 0x0071e6b7, 0x036aefb6, 0x00083611}}}, + {X: Field{[10]uint32{0x01ab6ab5, 0x015c7a2f, 0x000eda26, 0x03984ccc, 0x031f32be, 0x017b9705, 0x03dbac10, 0x00a665e7, 0x00028420, 0x000cd32c}}, Y: Field{[10]uint32{0x02a574d4, 0x01686216, 0x0038d96e, 0x02d92759, 0x00e4e972, 0x01e7172e, 0x0345bfd5, 0x021e3d1a, 0x019f3da7, 0x002209f6}}}, + {X: Field{[10]uint32{0x01ac6d4d, 0x03c8a68d, 0x01afe602, 0x01391efc, 0x00e9f25f, 0x03d93e07, 0x00cad6a2, 0x03b01cd5, 0x0207d260, 0x000cacc3}}, Y: Field{[10]uint32{0x003c0427, 0x01821d0f, 0x03941856, 0x0223cc18, 0x025c5e36, 0x0049b113, 0x02904181, 0x0241e1bc, 0x030d64ee, 0x001c7ff3}}}, + {X: Field{[10]uint32{0x039a8451, 0x00798028, 0x03a05076, 0x000970e3, 0x033b5ce4, 0x0267a6fe, 0x02401ff2, 0x01398d0f, 0x02587a4b, 0x00394265}}, Y: Field{[10]uint32{0x03bb2ece, 0x00b1196c, 0x03241f13, 0x0059c3f1, 0x00683a39, 0x031acce0, 0x02acccf5, 0x026a1a53, 0x02a86542, 0x001ec0e0}}}, + {X: Field{[10]uint32{0x01d6477d, 0x01ba4c39, 0x026abd31, 0x0084a76d, 0x01ca6841, 0x02cf5e1b, 0x02ea0353, 0x00e6f382, 0x004c2bf5, 0x002ce1cb}}, Y: Field{[10]uint32{0x0101e285, 0x01342402, 0x034f9242, 0x01c48b43, 0x0159391c, 0x02775058, 0x037ed1fa, 0x0321bcec, 0x00afe4c8, 0x0001f381}}}, + {X: Field{[10]uint32{0x0135d07b, 0x0101b7a6, 0x00908f3b, 0x01d28b7e, 0x0006095e, 0x027d3106, 0x0014d964, 0x038eacb9, 0x03df9156, 0x0034ad5b}}, Y: Field{[10]uint32{0x03e3b23f, 0x00ed403b, 0x012aaadc, 0x02bcdc55, 0x03b06a33, 0x011aa397, 0x00b49259, 0x02315aa1, 0x001b6766, 0x00110f0b}}}, + {X: Field{[10]uint32{0x037fbacb, 0x02c56a7c, 0x0208115d, 0x03f58ac2, 0x034e8288, 0x0327d06c, 0x03f32e1e, 0x031d9648, 0x027e1074, 0x0003da61}}, Y: Field{[10]uint32{0x013fca16, 0x01417190, 0x00e58cd0, 0x039dbf74, 0x0368709b, 0x01c6708a, 0x0204c6ed, 0x02945a73, 0x02252a11, 0x003f5b1b}}}, + {X: Field{[10]uint32{0x01e64988, 0x01c362ae, 0x02579626, 0x0261556d, 0x00cae238, 0x0223f33b, 0x00778c86, 0x004706b6, 0x00b4a9ab, 0x002f060c}}, Y: Field{[10]uint32{0x022e3c81, 0x0256b130, 0x01ea5b6d, 0x032c4b6e, 0x028e95cd, 0x00f4323c, 0x039a0faf, 0x0184cc65, 0x0089f3c4, 0x002d8910}}}, + {X: Field{[10]uint32{0x038dbafc, 0x0392d1fc, 0x003b7445, 0x007a887d, 0x02126cfa, 0x03357ee4, 0x004bbe83, 0x027f6a63, 0x0221dc72, 0x003eaeab}}, Y: Field{[10]uint32{0x002d8cdc, 0x00cd8016, 0x01fbcc4c, 0x02eacb02, 0x03177ce1, 0x035abb67, 0x03513b3e, 0x0160cb1c, 0x03756446, 0x0006d5a5}}}, + {X: Field{[10]uint32{0x011f8bd4, 0x00f65b5e, 0x0157b547, 0x000c85b7, 0x03bcd3fc, 0x00923638, 0x012497ea, 0x0130f7e4, 0x01014d5d, 0x0024ce18}}, Y: Field{[10]uint32{0x00936725, 0x00c3e8db, 0x02d951d6, 0x00ae3a01, 0x019e57f2, 0x0129ab5c, 0x033add54, 0x0058f13f, 0x016ac141, 0x000f63f2}}}, + {X: Field{[10]uint32{0x02fd07f8, 0x02a0ffa9, 0x007f2094, 0x00934c05, 0x02da0a43, 0x031ac61b, 0x0146b8ee, 0x00a08165, 0x015f85c4, 0x00314c4b}}, Y: Field{[10]uint32{0x01d2992f, 0x03e01b11, 0x0251beda, 0x03a2cd6d, 0x00332898, 0x035511cd, 0x03be12c8, 0x001d5948, 0x022a79ba, 0x003e2b9b}}}, + {X: Field{[10]uint32{0x0203b057, 0x01202d7c, 0x03388558, 0x00a046a9, 0x01b73b11, 0x02808bd0, 0x0375c4dd, 0x00bd01b6, 0x009652c5, 0x002823c9}}, Y: Field{[10]uint32{0x033eb2e5, 0x0371d14b, 0x00ccc845, 0x0094df13, 0x02191d7a, 0x03b3f8f2, 0x01aa9251, 0x0387657a, 0x03de9ab5, 0x0028e5b1}}}, + {X: Field{[10]uint32{0x00f634df, 0x01792f50, 0x0205bc52, 0x02d626e2, 0x02a036e0, 0x00289469, 0x034b34f0, 0x01be9829, 0x030fe8df, 0x0024f54c}}, Y: Field{[10]uint32{0x01838756, 0x031582dc, 0x03a08f5a, 0x019df454, 0x000c4df5, 0x0321f68a, 0x02774f77, 0x00939575, 0x02ea10f4, 0x0032857e}}}, + {X: Field{[10]uint32{0x02b51fa2, 0x0157e4aa, 0x024f6170, 0x004c3c16, 0x005c35b8, 0x03d94844, 0x010a9941, 0x02dcafa1, 0x03ccdfca, 0x0001188a}}, Y: Field{[10]uint32{0x03ca2d4f, 0x02d07a75, 0x01a8cd29, 0x02918259, 0x00e883d2, 0x0256d4f2, 0x01cd2456, 0x02c95b49, 0x002d31ee, 0x0036581c}}}, + {X: Field{[10]uint32{0x00ef9fe5, 0x03b821b8, 0x00d8807a, 0x00fb45f2, 0x010fb6c8, 0x004e30c3, 0x03a58728, 0x02176652, 0x036c7dd8, 0x0028c980}}, Y: Field{[10]uint32{0x02cb9bf7, 0x00f359cc, 0x01a53489, 0x03871d79, 0x03456a6c, 0x01da2685, 0x00aafcde, 0x028554c7, 0x02693719, 0x002d1973}}}, + {X: Field{[10]uint32{0x02ef77a5, 0x0082d69f, 0x00946b1d, 0x02a6129b, 0x03f3d5e7, 0x03e97154, 0x030c887b, 0x01f9e5c6, 0x017e1963, 0x0008d510}}, Y: Field{[10]uint32{0x01f4bd4b, 0x027d22ca, 0x02d4d216, 0x014cf3d3, 0x01ea7400, 0x03cd3d02, 0x014fbf99, 0x034f2ec9, 0x0321b6ea, 0x002056a5}}}, + {X: Field{[10]uint32{0x03ce6fca, 0x01f322ed, 0x01f9f2b0, 0x00677757, 0x033a4078, 0x008e0435, 0x01a746b0, 0x005d3d73, 0x016dfc53, 0x00274d1b}}, Y: Field{[10]uint32{0x0376c806, 0x00acd5e5, 0x029b9851, 0x000f7c23, 0x014a199b, 0x007a4154, 0x01a8ff9f, 0x00f97295, 0x006b6429, 0x0026db30}}}, + {X: Field{[10]uint32{0x0148dd01, 0x028ccc3f, 0x00564bb5, 0x02d01542, 0x03bba638, 0x03af8843, 0x01f000ad, 0x029edfe5, 0x038ec643, 0x001cf20a}}, Y: Field{[10]uint32{0x0005b614, 0x03c4da42, 0x02f075ff, 0x01737c35, 0x027d2acf, 0x0132caf6, 0x035f61b8, 0x017187f8, 0x0299a088, 0x003ffc55}}}, + {X: Field{[10]uint32{0x00798ac8, 0x00e72fff, 0x011afc9b, 0x02fdb28a, 0x010f2d29, 0x02141ae5, 0x01316728, 0x0357473e, 0x01d5a0b2, 0x0024091a}}, Y: Field{[10]uint32{0x03c3ade4, 0x00f7a247, 0x030d4fa6, 0x036eafa2, 0x03cd78ad, 0x032bf93f, 0x02378bff, 0x01da74d0, 0x0011d71c, 0x0000d5b4}}}, + {X: Field{[10]uint32{0x03110637, 0x03f88f87, 0x00371b1e, 0x03a7f540, 0x00dc4013, 0x0066e251, 0x0123afb8, 0x021bc14d, 0x00fb3a0c, 0x00399c28}}, Y: Field{[10]uint32{0x020b31b8, 0x019677c9, 0x0250a9bf, 0x0382772c, 0x03272557, 0x001f967b, 0x03db5a3d, 0x0372c855, 0x036bcd13, 0x00021a44}}}, + {X: Field{[10]uint32{0x0205c395, 0x034f56e2, 0x005fcb9a, 0x03961255, 0x01b57f11, 0x033ee732, 0x0368e270, 0x02079ac3, 0x006d5265, 0x003cffbc}}, Y: Field{[10]uint32{0x01b8f553, 0x01d55106, 0x012f4ff3, 0x034412c2, 0x01570752, 0x03e97eef, 0x0045176e, 0x0083b313, 0x01971444, 0x000cacba}}}, + {X: Field{[10]uint32{0x016a05bd, 0x02974e4e, 0x02cac70c, 0x02711c74, 0x00f942c0, 0x03306762, 0x00fc28a8, 0x03611158, 0x02633958, 0x001ca8dd}}, Y: Field{[10]uint32{0x035ee1ad, 0x03d1521c, 0x03ba8503, 0x011834bd, 0x01729ce8, 0x000ba363, 0x004b3b84, 0x0041c3da, 0x030e6e12, 0x0037a6c6}}}, + {X: Field{[10]uint32{0x005300b0, 0x00def620, 0x01ae22b6, 0x013ea133, 0x00417289, 0x0243379a, 0x019c3a81, 0x01f7bd04, 0x02d9c43b, 0x000e2de2}}, Y: Field{[10]uint32{0x03d01e6f, 0x039d2a2c, 0x01c8423d, 0x01a77214, 0x010de7cc, 0x02ffccba, 0x0204f175, 0x017d461c, 0x01676c4f, 0x00028605}}}, + {X: Field{[10]uint32{0x0334752e, 0x00563fca, 0x013af68e, 0x0224232f, 0x03540e2e, 0x00653ec8, 0x026fac9e, 0x01f14db1, 0x02c81d2e, 0x0036e5a2}}, Y: Field{[10]uint32{0x02b48a0a, 0x03969cea, 0x00769a24, 0x023bf453, 0x0104179e, 0x018d1c9c, 0x02b4af0a, 0x025caeb1, 0x03ab79d9, 0x00135715}}}, + {X: Field{[10]uint32{0x00aad318, 0x0174d9ea, 0x02435a14, 0x03e65f1c, 0x02505dd4, 0x007b4d6c, 0x0114f28c, 0x01360dc4, 0x02792d3a, 0x000ab385}}, Y: Field{[10]uint32{0x0226f625, 0x0239cfcd, 0x03539cc8, 0x03be86b8, 0x010405b0, 0x01a17db4, 0x0063b87f, 0x01d3933b, 0x012a2468, 0x0014c50c}}}, + {X: Field{[10]uint32{0x01bae108, 0x03e4ebcf, 0x0277e852, 0x0060958c, 0x00bb1fda, 0x0189c9f1, 0x00a46008, 0x0037b76e, 0x02690c39, 0x000cb603}}, Y: Field{[10]uint32{0x00dc7c07, 0x0155ea58, 0x01d08cbd, 0x0048f67c, 0x03bc1c3e, 0x0207df36, 0x03cb3f81, 0x0341a9b4, 0x016fea89, 0x0000f1f6}}}, + {X: Field{[10]uint32{0x02ee3908, 0x0229021d, 0x01521d8e, 0x00379497, 0x03f1bf05, 0x01176cf2, 0x00e61a29, 0x01ad018a, 0x028ae7fe, 0x000fbd27}}, Y: Field{[10]uint32{0x01a123f2, 0x00778200, 0x0092bd3d, 0x009d630f, 0x033ff72d, 0x018c456b, 0x0031b54d, 0x017ec935, 0x035c62f4, 0x0010e071}}}, + {X: Field{[10]uint32{0x009722da, 0x009d508f, 0x006405aa, 0x03996797, 0x000e280e, 0x032235ec, 0x03517d41, 0x00b340e6, 0x00d5cdb8, 0x00214e02}}, Y: Field{[10]uint32{0x037e8f5e, 0x0308a7d7, 0x0200fb4d, 0x000e4b50, 0x023ed18d, 0x005c8890, 0x00a652f8, 0x025899a6, 0x00449b2a, 0x003059df}}}, + {X: Field{[10]uint32{0x03c8584f, 0x0076de07, 0x02f4958c, 0x03cca6b7, 0x03306ee4, 0x02187f32, 0x03520bd8, 0x0017fa15, 0x0083490c, 0x0015cbf5}}, Y: Field{[10]uint32{0x0013f4a5, 0x00000d8d, 0x03ca0be3, 0x0156cc7a, 0x00d38e91, 0x02ced865, 0x00107c06, 0x008c0b3c, 0x01061039, 0x0020ab32}}}, + {X: Field{[10]uint32{0x036e1386, 0x024d60cd, 0x0248138c, 0x01135164, 0x00fa7713, 0x013655b9, 0x02a9a2dd, 0x0328c5d6, 0x03b29aa8, 0x002c72ea}}, Y: Field{[10]uint32{0x02292ec9, 0x0234b759, 0x015fcbc5, 0x03d80300, 0x01265cb2, 0x01050270, 0x021de030, 0x03f7c1ae, 0x00f17f9a, 0x00222330}}}, + {X: Field{[10]uint32{0x036bab20, 0x02eee60b, 0x001a16dd, 0x00359c1c, 0x012c5c96, 0x01269ba0, 0x000a65a1, 0x00c4d1d6, 0x03924239, 0x003e15b2}}, Y: Field{[10]uint32{0x00536674, 0x02540452, 0x03869c55, 0x030b5758, 0x0377d9d6, 0x01704477, 0x01f580f6, 0x0003a664, 0x01ba192c, 0x0030cd44}}}, + {X: Field{[10]uint32{0x0273920e, 0x03f0e9fb, 0x00e230ff, 0x03edb04a, 0x039eed92, 0x015aeece, 0x0042887b, 0x004a78b0, 0x00d4773e, 0x00385807}}, Y: Field{[10]uint32{0x001054ca, 0x02805bcc, 0x00ec96f4, 0x02328142, 0x000a7864, 0x026e87f3, 0x0247c714, 0x01de5bb8, 0x00c8a38c, 0x000601d2}}}, + {X: Field{[10]uint32{0x027c7e72, 0x024a38cd, 0x01534a98, 0x02ae5d22, 0x00e8b37c, 0x0032fc76, 0x02206a5b, 0x0185dd72, 0x00d45ffb, 0x00263b88}}, Y: Field{[10]uint32{0x0273c610, 0x02391958, 0x03c30697, 0x03811486, 0x01854b70, 0x023f1017, 0x02b5e6e8, 0x036d45a2, 0x00e1ea42, 0x000b7d2b}}}, + {X: Field{[10]uint32{0x01fe179f, 0x02b53bb7, 0x00246ec0, 0x0107d6b3, 0x035417bc, 0x03b74784, 0x01cfe95b, 0x024168c7, 0x0257acde, 0x0011e5b2}}, Y: Field{[10]uint32{0x00a367a8, 0x0258a87c, 0x0015f8ff, 0x028d18fe, 0x015bc565, 0x0159308e, 0x03637e59, 0x00e00acd, 0x0122395a, 0x001d04fd}}}, + {X: Field{[10]uint32{0x02341200, 0x01a2f746, 0x01d4006c, 0x00da6aef, 0x03cfd555, 0x01b1f7e7, 0x03627fd5, 0x02c2e356, 0x006438ad, 0x002cd9f2}}, Y: Field{[10]uint32{0x028fba51, 0x0092678b, 0x0349dfd2, 0x03d72715, 0x02b4986c, 0x0089a1c0, 0x002f3657, 0x03a059e6, 0x03440b99, 0x00300d91}}}, + {X: Field{[10]uint32{0x00914d29, 0x01fd29e2, 0x01386a74, 0x00293c9f, 0x00e74076, 0x00837a11, 0x02244c00, 0x037b3df8, 0x004b723d, 0x0036cda2}}, Y: Field{[10]uint32{0x0179e023, 0x03ccccdf, 0x023b40e5, 0x0093f683, 0x03fef90e, 0x037bc3ca, 0x01e07507, 0x00e8f0a8, 0x03cc2a74, 0x0022b921}}}, + {X: Field{[10]uint32{0x01a316c4, 0x0171a826, 0x03123ccf, 0x00b9b1b0, 0x0176b473, 0x007bbd3e, 0x02458213, 0x0084aea3, 0x0018f71c, 0x001965c6}}, Y: Field{[10]uint32{0x013604db, 0x001dd538, 0x035db4cd, 0x00c71c0d, 0x01526a28, 0x00dd8446, 0x0087f391, 0x01434cec, 0x03913533, 0x001057d9}}}, + {X: Field{[10]uint32{0x00ebd65a, 0x0332b1d8, 0x01338fcb, 0x00fe5868, 0x01905390, 0x01fadb36, 0x0182a639, 0x03d2c908, 0x033a13a8, 0x003cbd3a}}, Y: Field{[10]uint32{0x00ef9ca8, 0x0032bf82, 0x00b6e795, 0x00fce8ef, 0x0018811b, 0x03aae3af, 0x02dc8b74, 0x02535c82, 0x027b667e, 0x00295d75}}}, + {X: Field{[10]uint32{0x01113a49, 0x01ad34c7, 0x00a47e8c, 0x01df301a, 0x03884b3f, 0x034f249f, 0x028fa51f, 0x03c318cc, 0x020da058, 0x0028939e}}, Y: Field{[10]uint32{0x010ef78b, 0x01c84bd1, 0x00c81a9a, 0x00559179, 0x010bcee6, 0x00a5c675, 0x032fe3f8, 0x0295a67a, 0x003079ac, 0x002fa36e}}}, + {X: Field{[10]uint32{0x01efad5a, 0x0076dc90, 0x024b8098, 0x029d23c2, 0x0142212d, 0x03af5660, 0x036cc325, 0x005e5df6, 0x00cb77e1, 0x0039668f}}, Y: Field{[10]uint32{0x00a800d9, 0x030b5381, 0x012999d4, 0x005a9281, 0x00d69034, 0x00e268b6, 0x00a10a22, 0x0099a330, 0x0145fdda, 0x002a381d}}}, + {X: Field{[10]uint32{0x024b8f32, 0x03d8183f, 0x00e9f0da, 0x01d6aaa5, 0x01fc6c1a, 0x036afa72, 0x00721f93, 0x002f96fb, 0x0263a3c7, 0x000c646c}}, Y: Field{[10]uint32{0x01f38a96, 0x02c7e657, 0x00491717, 0x009d4f9d, 0x00c7af7b, 0x028f2eac, 0x01a87c4e, 0x026f1caa, 0x02cc1c7a, 0x000ce464}}}, + {X: Field{[10]uint32{0x0187023a, 0x01e1d3e4, 0x014638b9, 0x0394f04e, 0x0012f408, 0x03a0e6c8, 0x0147e275, 0x0376c23f, 0x03c604f9, 0x0018f757}}, Y: Field{[10]uint32{0x0104bd9a, 0x00d72f21, 0x0239b84f, 0x00410588, 0x03067e09, 0x004bbdfb, 0x016cccfd, 0x02df9b51, 0x00b402e8, 0x0006bc12}}}, + {X: Field{[10]uint32{0x031bcf13, 0x036fd2d9, 0x025c12d3, 0x01030ae3, 0x032e1d86, 0x03dd4712, 0x007229b7, 0x004bb32e, 0x0057cd83, 0x0002a4b9}}, Y: Field{[10]uint32{0x03fba768, 0x03ca4b97, 0x00b3f551, 0x013cf56d, 0x02be46ab, 0x0281f59c, 0x00492413, 0x03ad7461, 0x03565447, 0x0035ebb6}}}, + {X: Field{[10]uint32{0x01b10495, 0x0375be0e, 0x035ba6c0, 0x0179617c, 0x004789f5, 0x013c02ed, 0x0320f021, 0x0274880a, 0x0170b9e0, 0x0007b9ae}}, Y: Field{[10]uint32{0x009e9462, 0x03443837, 0x032be3f8, 0x02ef5282, 0x019dcf73, 0x01894a21, 0x023c8a04, 0x03bbd746, 0x03eceff9, 0x001f2443}}}, + {X: Field{[10]uint32{0x0306a76a, 0x03459663, 0x01cebe4f, 0x025cc0a1, 0x001abe9e, 0x00f4121c, 0x0328d7c4, 0x00655c14, 0x03b9c2ac, 0x002c6708}}, Y: Field{[10]uint32{0x03a38398, 0x016ca0cd, 0x00a49274, 0x01f34232, 0x01c60560, 0x038da791, 0x0380f8cf, 0x022dc1bc, 0x01bec07c, 0x001e6a04}}}, + {X: Field{[10]uint32{0x014f49a5, 0x026bbcc0, 0x02016b1e, 0x0262e2ca, 0x014f3fbf, 0x0099a915, 0x00888f5e, 0x017f09f0, 0x039f9ed3, 0x000f0836}}, Y: Field{[10]uint32{0x03fbc4d5, 0x025438d6, 0x009ea7d8, 0x02d733d2, 0x029327c1, 0x02879684, 0x010815a4, 0x0398ebd8, 0x02943f29, 0x002eceb0}}}, + {X: Field{[10]uint32{0x02ea4389, 0x0248b14b, 0x00014f6b, 0x03f0233a, 0x00efa29f, 0x034ce091, 0x02b59040, 0x01ba7913, 0x01bab474, 0x003f4733}}, Y: Field{[10]uint32{0x028df06e, 0x02080ca6, 0x0004097a, 0x014843db, 0x0373961a, 0x010f393a, 0x012439fc, 0x01be43e9, 0x01465214, 0x00384195}}}, + {X: Field{[10]uint32{0x0364020c, 0x03682666, 0x03ab51e2, 0x00a636cd, 0x0183641a, 0x030ac35d, 0x0252dc73, 0x02e29bbc, 0x018eabde, 0x0038c3f4}}, Y: Field{[10]uint32{0x00dce88b, 0x0309304a, 0x01704cfb, 0x00a5abfa, 0x018e195d, 0x01c5bad0, 0x02bcab86, 0x03d20658, 0x02721824, 0x0012598d}}}, + {X: Field{[10]uint32{0x015bda37, 0x0085f9d4, 0x00548e6e, 0x00001550, 0x015cd723, 0x00ea7702, 0x02ea7848, 0x03e4c386, 0x038926dd, 0x0012f07d}}, Y: Field{[10]uint32{0x0200ca69, 0x0133f374, 0x0047163a, 0x01b0a94b, 0x0336d8a2, 0x00d2f66a, 0x00bfa2e7, 0x006c0237, 0x02b695dc, 0x00259acc}}}, + {X: Field{[10]uint32{0x00f036d4, 0x03ffa855, 0x0139aaff, 0x023b51ad, 0x009004f9, 0x03b3a6f1, 0x030f7d26, 0x012e2d03, 0x027b9c86, 0x0008f4f8}}, Y: Field{[10]uint32{0x02c0b05d, 0x01b1e522, 0x026c71b3, 0x02eca24a, 0x01b3dfef, 0x03054354, 0x00143d6a, 0x0289f331, 0x03ebf680, 0x002f9185}}}, + {X: Field{[10]uint32{0x026009c0, 0x0392250f, 0x01aab56d, 0x02472db0, 0x004a5130, 0x01ded730, 0x02e0a894, 0x00edc3d1, 0x03d014cd, 0x000a2b72}}, Y: Field{[10]uint32{0x00e31601, 0x024b33bf, 0x00fdaf4a, 0x031cf7b5, 0x0025040d, 0x00233f93, 0x03250b46, 0x013328e3, 0x00387520, 0x001f126a}}}, + {X: Field{[10]uint32{0x00a29d08, 0x03c867c7, 0x02a0cc86, 0x01ee9517, 0x00ea52ec, 0x003613d8, 0x0044ab87, 0x00208e94, 0x00b8a86f, 0x001dd821}}, Y: Field{[10]uint32{0x001c60db, 0x00d14c96, 0x00b2cd08, 0x01c9615c, 0x03def172, 0x027959f6, 0x010bc384, 0x034942d0, 0x02cb1048, 0x00182eef}}}, + {X: Field{[10]uint32{0x028f2350, 0x03879f48, 0x035fbd4f, 0x02e7b5ab, 0x01e3db94, 0x01811254, 0x019667bc, 0x03bd2257, 0x020ffd32, 0x001177cb}}, Y: Field{[10]uint32{0x03eaf095, 0x035e4618, 0x0399473f, 0x032da2ec, 0x004de155, 0x010592e6, 0x024076ed, 0x03f819a7, 0x024b1a8c, 0x0029cc91}}}, + {X: Field{[10]uint32{0x027dd7ea, 0x027c386f, 0x03ebe7f6, 0x03a1e0f3, 0x008ae9bb, 0x0124e8bf, 0x00bff80c, 0x03f47e9d, 0x036b46a5, 0x001a4125}}, Y: Field{[10]uint32{0x022c3e64, 0x01886bb2, 0x03cfd5ad, 0x0115799b, 0x0030f1df, 0x02802cd0, 0x0241a221, 0x0050d818, 0x01b8df9d, 0x0006741c}}}, + {X: Field{[10]uint32{0x01aef659, 0x00a3a14a, 0x00f0bef5, 0x00d47ba0, 0x03e01def, 0x03a02603, 0x01e805c8, 0x0341d6a3, 0x0328f977, 0x00212761}}, Y: Field{[10]uint32{0x025bf428, 0x00c5652b, 0x006ffedf, 0x026bb1c9, 0x018042dd, 0x0301a743, 0x017adadb, 0x018a0ee7, 0x01c46c88, 0x00361255}}}, + {X: Field{[10]uint32{0x032d58eb, 0x0319d191, 0x01281e27, 0x031fa9a1, 0x0054588d, 0x035d4d2b, 0x03facec8, 0x001b9839, 0x034c2345, 0x0038f592}}, Y: Field{[10]uint32{0x025a36eb, 0x007cd8eb, 0x030efbc6, 0x00e53265, 0x0011a9c8, 0x022ba966, 0x0047baf6, 0x00aa11d1, 0x013ccf82, 0x00128cab}}}, + {X: Field{[10]uint32{0x0063bbaa, 0x021f54d5, 0x03ece0c7, 0x02aba484, 0x02889877, 0x02d9d8e6, 0x036f1323, 0x0168c466, 0x012857d1, 0x003d071e}}, Y: Field{[10]uint32{0x014d9328, 0x018140de, 0x016d07cc, 0x0239fa91, 0x00630c45, 0x014b6777, 0x00075941, 0x01315534, 0x010e00c8, 0x001cf3f3}}}, + {X: Field{[10]uint32{0x01186079, 0x014bf5de, 0x0321d67f, 0x0071079e, 0x030e0cba, 0x02bb64e7, 0x03a4a02c, 0x02e13391, 0x0347047a, 0x00387485}}, Y: Field{[10]uint32{0x01b2b668, 0x006abf9f, 0x02f63af8, 0x019a6b24, 0x01fb26da, 0x0092a040, 0x01728a3e, 0x03028fb6, 0x0228aa4b, 0x0005ec2d}}}, + {X: Field{[10]uint32{0x006ef1d8, 0x0239f736, 0x00c8095a, 0x012e34a4, 0x005d7ddb, 0x014ad36c, 0x009da2dd, 0x019e54c6, 0x018af8f8, 0x002a2800}}, Y: Field{[10]uint32{0x0026518b, 0x02ae9f5a, 0x00c17fc8, 0x035e72ad, 0x0225b927, 0x00d8208f, 0x0180c7e9, 0x02287b7e, 0x006c84b8, 0x0022ee58}}}, + {X: Field{[10]uint32{0x036fffed, 0x03589fdc, 0x038f4cd8, 0x0384f7cc, 0x00e4e0c0, 0x003af698, 0x03a57c05, 0x0179136a, 0x02716ee0, 0x001ce0f1}}, Y: Field{[10]uint32{0x0289f0e0, 0x03625b23, 0x00ba004a, 0x01225487, 0x0338eafd, 0x031df6ab, 0x00cb973f, 0x0129d18e, 0x01465f16, 0x000ef72e}}}, + {X: Field{[10]uint32{0x01372dfd, 0x023e42eb, 0x00c1e085, 0x03d01483, 0x031ca36a, 0x00216018, 0x03e64312, 0x02b25e5a, 0x021c8bc8, 0x00187e9f}}, Y: Field{[10]uint32{0x03eba33d, 0x00d121b0, 0x002078d6, 0x02c252c3, 0x00a5f646, 0x02210778, 0x0287909c, 0x039a50c8, 0x036836c3, 0x000fc359}}}, + {X: Field{[10]uint32{0x02c4a740, 0x00c428ec, 0x0116d3cb, 0x01250efc, 0x00b4f143, 0x03d220aa, 0x0092defc, 0x03180664, 0x022bca0a, 0x002180a7}}, Y: Field{[10]uint32{0x001c2f7c, 0x018edf49, 0x00480154, 0x014f75c2, 0x00ef5f15, 0x004885b2, 0x0261cffd, 0x015bc3cc, 0x006ecd90, 0x002e2fa4}}}, + {X: Field{[10]uint32{0x03ad95cc, 0x011d3013, 0x0390e2f6, 0x02c17f17, 0x0348c4a6, 0x0035ae6a, 0x01d6c4cd, 0x02921d62, 0x03e5912a, 0x00385cbd}}, Y: Field{[10]uint32{0x00acc401, 0x019cf702, 0x00290ea0, 0x01e54027, 0x010d7bfd, 0x022d935f, 0x019920ce, 0x003b4ee2, 0x03c12b0a, 0x003b6f48}}}, + {X: Field{[10]uint32{0x02873494, 0x00df6f8c, 0x00616d1f, 0x01e335aa, 0x032d931c, 0x020e37a4, 0x03b22abf, 0x03f0922d, 0x028d322e, 0x001e61ae}}, Y: Field{[10]uint32{0x02a13634, 0x02f25a04, 0x0201ee6e, 0x034f4edf, 0x002420a5, 0x034a7f83, 0x01b75440, 0x001648c6, 0x03224c75, 0x001a4faa}}}, + {X: Field{[10]uint32{0x01e00383, 0x02319738, 0x01d4603e, 0x034daa2a, 0x03400bb5, 0x034dac4c, 0x000a6d88, 0x01d9cdd8, 0x01384a72, 0x002e9650}}, Y: Field{[10]uint32{0x002ce557, 0x02676fcf, 0x019bd867, 0x0114bd88, 0x03d9c685, 0x00c4162f, 0x03fc9535, 0x0204ac89, 0x0228bc1b, 0x001d1bd3}}}, + {X: Field{[10]uint32{0x00476c8f, 0x02be1a48, 0x006b9802, 0x035cb3c3, 0x036bf96c, 0x02c5de27, 0x02eeb77b, 0x02c45f21, 0x01c992d6, 0x00117fd0}}, Y: Field{[10]uint32{0x0002b59f, 0x035a5c88, 0x015cbec3, 0x021a1ff2, 0x004f522e, 0x009c59f6, 0x010c9e10, 0x038eb880, 0x01bf6422, 0x0024c93d}}}, + {X: Field{[10]uint32{0x016ed68f, 0x00fb30f0, 0x02a7d9a9, 0x0293655d, 0x00d00bad, 0x02199bb5, 0x031c282e, 0x013681c5, 0x0235487a, 0x002eb5e7}}, Y: Field{[10]uint32{0x007b57d2, 0x0354371e, 0x029207a6, 0x005e40e2, 0x005b1535, 0x0076c335, 0x0202e129, 0x021290c6, 0x022eefb1, 0x00064e5e}}}, + {X: Field{[10]uint32{0x023c8a41, 0x0100ef27, 0x01b79cfa, 0x00374d99, 0x0022cf89, 0x025d56ff, 0x004d5835, 0x01d7b183, 0x01072d88, 0x00377f88}}, Y: Field{[10]uint32{0x033f62e7, 0x00ad8211, 0x00d90ce2, 0x00fe1f04, 0x028dbe0d, 0x0230a21c, 0x015674c2, 0x002a2a48, 0x0117491d, 0x00318af6}}}, + {X: Field{[10]uint32{0x027eb299, 0x0203b6d9, 0x03a64b11, 0x01a68f67, 0x00d75942, 0x03be7657, 0x00ccadfb, 0x0248fe5a, 0x0253c07f, 0x002497da}}, Y: Field{[10]uint32{0x01e7809c, 0x00e6582c, 0x010b7b29, 0x00e2e329, 0x0058f000, 0x03e73b92, 0x008b26b7, 0x006399bc, 0x00ff01f9, 0x0004203a}}}, + {X: Field{[10]uint32{0x0320dd80, 0x01e2ea09, 0x00d0d878, 0x0341ac38, 0x0012768b, 0x007c0ebc, 0x025d2c7d, 0x000a0ce3, 0x01dda75f, 0x0030a392}}, Y: Field{[10]uint32{0x010db12b, 0x02116ad7, 0x00a98331, 0x02d35fda, 0x03ec5ae6, 0x0261f859, 0x0112c5b4, 0x02926f31, 0x0189c941, 0x0019c3e2}}}, + {X: Field{[10]uint32{0x00837cbb, 0x03e1b28b, 0x006f37b9, 0x01235650, 0x02b21dae, 0x017a3816, 0x008c196d, 0x016fa206, 0x013e9503, 0x0001ea41}}, Y: Field{[10]uint32{0x003a7e1c, 0x00af43d1, 0x02352e7f, 0x03dbdfef, 0x026de026, 0x03425f5d, 0x00774e79, 0x0252de65, 0x008e8e76, 0x00103b82}}}, + {X: Field{[10]uint32{0x02036aa2, 0x029e7f43, 0x01b956c6, 0x021686d8, 0x02e0b32c, 0x025986c5, 0x008ef81e, 0x00031536, 0x00eabfbb, 0x000cebde}}, Y: Field{[10]uint32{0x03cfd3c0, 0x01231a74, 0x00629d80, 0x022017bd, 0x03153319, 0x03215742, 0x01796440, 0x029e5b13, 0x02af0537, 0x001c4f9e}}}, + {X: Field{[10]uint32{0x01583bd0, 0x0031c812, 0x0163df9a, 0x02901e5f, 0x031326df, 0x01b59d30, 0x02955739, 0x00f4cca5, 0x00145a3f, 0x00316234}}, Y: Field{[10]uint32{0x0053cdfa, 0x00c719ab, 0x020d7375, 0x009232bd, 0x027f7470, 0x03f4b35d, 0x02baa8fc, 0x0336b6ae, 0x03d16c67, 0x002d7033}}}, + {X: Field{[10]uint32{0x0038d29e, 0x02ad48e0, 0x01d5a2f2, 0x00887c3b, 0x0397223f, 0x01924d06, 0x008ef12c, 0x010b19f1, 0x01edb937, 0x0025acf5}}, Y: Field{[10]uint32{0x00e44c4e, 0x007b032c, 0x016aa996, 0x015d2ca3, 0x01bf25fe, 0x0339ed3b, 0x019a2e64, 0x028174dc, 0x00aa38a3, 0x0036d1d7}}}, + {X: Field{[10]uint32{0x0244f0c7, 0x0369dfd5, 0x02782a62, 0x010968a1, 0x001eea3a, 0x01198aa7, 0x00cb00b1, 0x013b9bec, 0x036e3d89, 0x00104bd2}}, Y: Field{[10]uint32{0x02a676fe, 0x026be1bd, 0x031d6f13, 0x0226300f, 0x01a8503e, 0x00e1d10a, 0x03de8139, 0x032016ff, 0x0236ab9b, 0x002a13bd}}}, + {X: Field{[10]uint32{0x00563252, 0x01387eb9, 0x01049379, 0x0312270e, 0x0132fdfd, 0x00cb1063, 0x031421da, 0x00c0a14b, 0x0385c7b4, 0x00097c29}}, Y: Field{[10]uint32{0x0004e4bc, 0x009a20d8, 0x02334a02, 0x03d4771b, 0x02da716a, 0x03afbd01, 0x00953a3a, 0x0242d627, 0x010d4571, 0x003bfac2}}}, + {X: Field{[10]uint32{0x01741c6f, 0x0356293b, 0x02cfde0b, 0x01610c9e, 0x03f02fed, 0x027a8f9f, 0x034403a4, 0x03ebd2b2, 0x02b7f367, 0x00143f52}}, Y: Field{[10]uint32{0x0146dd5f, 0x00c1f18f, 0x0207ea56, 0x033e81e5, 0x022d08ab, 0x02b6c70e, 0x020cb520, 0x03352194, 0x01a73c9d, 0x001e2af0}}}, + {X: Field{[10]uint32{0x006a477a, 0x03efb441, 0x03313bbc, 0x007d2e53, 0x02c35762, 0x00c3c41f, 0x038fa664, 0x01fde4ce, 0x03d4cfaf, 0x00055d60}}, Y: Field{[10]uint32{0x017e8db5, 0x02737a8a, 0x02aaffc0, 0x02359674, 0x01fe35ed, 0x011b5216, 0x00d4355c, 0x0347f983, 0x0235ce8c, 0x0026a9ac}}}, + {X: Field{[10]uint32{0x033300be, 0x00ef1296, 0x03494f4b, 0x037e2f9a, 0x02f2edce, 0x016cd65d, 0x00affc16, 0x00980f91, 0x03625d26, 0x000f112e}}, Y: Field{[10]uint32{0x00bc2535, 0x03b0afcf, 0x007b9079, 0x031c7fdc, 0x021ef0e8, 0x00166054, 0x00d45949, 0x00eae17b, 0x01616797, 0x00222c71}}}, + {X: Field{[10]uint32{0x02298958, 0x0096e3ee, 0x01d935ee, 0x031b821f, 0x008fc5d9, 0x00fc8f31, 0x0371d193, 0x01ae5fcb, 0x024de160, 0x000c7509}}, Y: Field{[10]uint32{0x018251cb, 0x0004641c, 0x032c44ae, 0x02d8b98a, 0x00c8e41d, 0x021556e6, 0x025180c9, 0x007498a1, 0x01c0a3aa, 0x00118182}}}, + {X: Field{[10]uint32{0x0103ad2f, 0x0091eb97, 0x03b78a87, 0x007602a3, 0x03352d1d, 0x037060d2, 0x02b206d3, 0x011c9182, 0x030a8ff1, 0x0007d547}}, Y: Field{[10]uint32{0x0116a6e3, 0x03a8cfb0, 0x03b32ecc, 0x02d94255, 0x00fcb97a, 0x000afb8d, 0x0144f818, 0x02c5236e, 0x0006a4c8, 0x0009094f}}}, + {X: Field{[10]uint32{0x01cf333e, 0x02daed70, 0x003a87aa, 0x01ccaabb, 0x00206a1f, 0x03fd6a31, 0x03343119, 0x02101cc4, 0x021d27f0, 0x00378b13}}, Y: Field{[10]uint32{0x0195170d, 0x0173f8a0, 0x01a71c5a, 0x00ab2cb5, 0x019226ca, 0x007e9263, 0x03f4a8e4, 0x0334e8c7, 0x03a140fe, 0x0037204e}}}, + {X: Field{[10]uint32{0x00a95612, 0x02f13046, 0x01620a54, 0x03462bb5, 0x00c1f54b, 0x00e0b0bc, 0x02c4a22c, 0x012b204c, 0x01b2adf5, 0x001bf717}}, Y: Field{[10]uint32{0x030e221e, 0x03a24565, 0x00d26944, 0x032a9b71, 0x03cf60b0, 0x00748590, 0x00110536, 0x03a53703, 0x00e5f318, 0x0036cfe9}}}, + {X: Field{[10]uint32{0x03680603, 0x01dedcd4, 0x030fc7fd, 0x00342177, 0x00bb7665, 0x035fae84, 0x02ea6f4d, 0x0071468e, 0x02c6ea0e, 0x0031fadd}}, Y: Field{[10]uint32{0x035bf655, 0x011dc4b7, 0x013e0e6f, 0x00e6a0ad, 0x020a4f4a, 0x02f0cbbc, 0x0041c3d7, 0x0024a80f, 0x01d7b788, 0x0016b870}}}, + {X: Field{[10]uint32{0x00aa89ed, 0x004ea632, 0x01857b48, 0x02de0867, 0x021a52c7, 0x00c4afee, 0x00e048e6, 0x022d6d93, 0x01a2b7e7, 0x00320541}}, Y: Field{[10]uint32{0x03096806, 0x0177f037, 0x007fa87d, 0x01fe5ac9, 0x01c222be, 0x0167c0cf, 0x01e49be4, 0x03884578, 0x00426d6c, 0x0011b6ca}}}, + {X: Field{[10]uint32{0x00503bf8, 0x01fae79e, 0x031c90a1, 0x00482f71, 0x00f7dec3, 0x00eb0d42, 0x005ff0d8, 0x030f561c, 0x025515f9, 0x0032b5d4}}, Y: Field{[10]uint32{0x026bd719, 0x02704b1b, 0x034c52d1, 0x039496da, 0x0106231b, 0x00e39358, 0x012ddc76, 0x036e5fb3, 0x020276cf, 0x000cacda}}}, + {X: Field{[10]uint32{0x024cdd25, 0x03a4036f, 0x03fabc70, 0x0196094c, 0x00f17f3c, 0x035ac576, 0x02ca8a47, 0x01f8c15b, 0x0144e22b, 0x00253488}}, Y: Field{[10]uint32{0x03d93bf9, 0x006a1351, 0x02e5f612, 0x00b5e6d2, 0x03828bf7, 0x03404932, 0x01dfbbdb, 0x00be1762, 0x020d5fef, 0x0004b01d}}}, + {X: Field{[10]uint32{0x016731a3, 0x004ae2e4, 0x022253b1, 0x027f03cb, 0x0213cba1, 0x01c86f78, 0x03520407, 0x01807f77, 0x0023ef00, 0x000c9717}}, Y: Field{[10]uint32{0x022498e0, 0x02397bb5, 0x0370e962, 0x02c91763, 0x015cb38c, 0x01931f4a, 0x03f3dd30, 0x00590e64, 0x0398c09c, 0x001674f2}}}, + {X: Field{[10]uint32{0x01ee2318, 0x01b61864, 0x00a7cda9, 0x00e0f9fd, 0x027d1874, 0x006f7f69, 0x02515168, 0x020c5928, 0x0089544b, 0x0027241c}}, Y: Field{[10]uint32{0x0372d20d, 0x00639be0, 0x00911d97, 0x037a7ef9, 0x01547117, 0x03089416, 0x00539eb5, 0x0018c0d9, 0x02e7e701, 0x003d8e77}}}, + {X: Field{[10]uint32{0x002b7a82, 0x03e60d4c, 0x03fc0f32, 0x0373ab06, 0x01ec5544, 0x01e93ee0, 0x032a1d89, 0x0301b132, 0x0007ede9, 0x000d3c52}}, Y: Field{[10]uint32{0x016d9c57, 0x007ca902, 0x024828d0, 0x019d75af, 0x003c54c3, 0x01a2f79a, 0x0318813a, 0x0288a3d7, 0x028cec6a, 0x001e10de}}}, + {X: Field{[10]uint32{0x0239788b, 0x01ed8005, 0x00d75388, 0x03fc30d1, 0x01490b47, 0x032e07f7, 0x03d459af, 0x0020a380, 0x030b3f08, 0x00252634}}, Y: Field{[10]uint32{0x002522f7, 0x00da14b9, 0x03d2ece1, 0x02cd59f3, 0x00677865, 0x01461ea7, 0x001627dc, 0x02f8fac9, 0x0305b97a, 0x001e9720}}}, + {X: Field{[10]uint32{0x0354f226, 0x0114bd5d, 0x038c876d, 0x03ffaee5, 0x025d4f36, 0x00f3be23, 0x013ec32d, 0x01b8dea9, 0x036fefd3, 0x003ae823}}, Y: Field{[10]uint32{0x012015c1, 0x031f8e2f, 0x01470608, 0x01e1340a, 0x0339e171, 0x00e32f82, 0x03eade9b, 0x015329eb, 0x02b543aa, 0x003f8399}}}, + {X: Field{[10]uint32{0x0240091b, 0x0251211c, 0x01e504c7, 0x02f664b3, 0x02c8ef49, 0x03a326f3, 0x0119b77a, 0x005ca7d8, 0x03c20bd2, 0x00155752}}, Y: Field{[10]uint32{0x03437b54, 0x0046731f, 0x00315d30, 0x03fe953e, 0x036c9052, 0x024fad29, 0x02869415, 0x0078ccb2, 0x01b86952, 0x003333af}}}, + {X: Field{[10]uint32{0x03fe8872, 0x03c21ec3, 0x01823679, 0x03b31a4b, 0x013f3060, 0x005c8f51, 0x0333833d, 0x00d1d10b, 0x039c19da, 0x000cdca6}}, Y: Field{[10]uint32{0x0034fc30, 0x02f59317, 0x00800b4a, 0x001f5faf, 0x00fac2f0, 0x02fee011, 0x00854056, 0x03d813ae, 0x024f283a, 0x002a52da}}}, + {X: Field{[10]uint32{0x01f1dc11, 0x03857803, 0x03c32d8a, 0x03835131, 0x0378124e, 0x00eae4b3, 0x03b060a7, 0x0119e191, 0x009fafe6, 0x000a86a2}}, Y: Field{[10]uint32{0x008b75d8, 0x0017fcff, 0x01218986, 0x0341fbe4, 0x0275aba0, 0x01b6efc3, 0x02ba46be, 0x007e39a1, 0x023d3bf1, 0x00189be5}}}, + {X: Field{[10]uint32{0x00197d6f, 0x02f2c2df, 0x027fff2d, 0x02cd38e4, 0x01639148, 0x0162ecbd, 0x0062f702, 0x039bf3ff, 0x014ca303, 0x0011c0a1}}, Y: Field{[10]uint32{0x031e1156, 0x011111f5, 0x02c5195c, 0x02cc3cec, 0x022da76e, 0x00164dcb, 0x0075c2de, 0x0095f345, 0x01b28513, 0x001f6898}}}, + {X: Field{[10]uint32{0x01319c5b, 0x01f165b3, 0x00e03485, 0x03f5f681, 0x0351d90c, 0x01b9279e, 0x0015cae0, 0x008e8194, 0x01c5a0cc, 0x001c00bb}}, Y: Field{[10]uint32{0x03db73bb, 0x00f88c30, 0x02975db6, 0x015a13f1, 0x0178c47b, 0x027f5845, 0x012d2ae1, 0x02a961eb, 0x01bd06b7, 0x001bca11}}}, + {X: Field{[10]uint32{0x0348d485, 0x02b7c2db, 0x00ae67c1, 0x0321c976, 0x03f4cc5b, 0x00755143, 0x0169f057, 0x018436c8, 0x00d4483d, 0x0009cca5}}, Y: Field{[10]uint32{0x03d942b1, 0x0221d2d9, 0x036d3726, 0x030473ee, 0x02a71e3c, 0x0208e6a8, 0x039a0031, 0x03278280, 0x01a20ffe, 0x00266c90}}}, + {X: Field{[10]uint32{0x018c9a69, 0x00d7a3fa, 0x00e83b03, 0x00ab134a, 0x010710c7, 0x02a14a97, 0x0126a535, 0x02d103eb, 0x03823055, 0x0006fb33}}, Y: Field{[10]uint32{0x038aecfc, 0x03780fde, 0x03489e2f, 0x00597892, 0x002c5db7, 0x0351c7ab, 0x00ce0a40, 0x03b881f2, 0x0166ac0e, 0x0003cead}}}, + {X: Field{[10]uint32{0x03128160, 0x02386494, 0x02197fae, 0x008dde24, 0x00a19023, 0x023f99cb, 0x0149caec, 0x00f54d76, 0x02cf4f03, 0x0036f93b}}, Y: Field{[10]uint32{0x01aa566f, 0x00f51f35, 0x00a1f5fd, 0x0018702a, 0x01896fc8, 0x012583f1, 0x0241c722, 0x00396d58, 0x03c7927f, 0x002cfd42}}}, + {X: Field{[10]uint32{0x01bd1e20, 0x03b3d28e, 0x02631133, 0x0212c2b8, 0x03caf7f4, 0x03715cff, 0x011887a5, 0x0031a516, 0x0075bed8, 0x001990ff}}, Y: Field{[10]uint32{0x038d58e5, 0x02d717e1, 0x03b7a1f8, 0x0270a4f0, 0x038ec1e6, 0x031289b8, 0x001875fd, 0x01f24eeb, 0x0285f7ac, 0x00011c04}}}, + {X: Field{[10]uint32{0x01422a21, 0x00d0bf81, 0x03f14516, 0x00daf298, 0x03ef19d9, 0x00fe0839, 0x01582805, 0x0335781c, 0x03decf1d, 0x00267e42}}, Y: Field{[10]uint32{0x019cd4fd, 0x034b5e6e, 0x01e2a180, 0x0064cfe4, 0x025cfd77, 0x02fafab5, 0x0390a868, 0x01856c14, 0x01306dfc, 0x0028137f}}}, + {X: Field{[10]uint32{0x02e33433, 0x00774ca1, 0x0033eaad, 0x01f81270, 0x00bcf71f, 0x024ad59e, 0x03b4e351, 0x02dff917, 0x02483184, 0x001539f3}}, Y: Field{[10]uint32{0x00c0e8ef, 0x033b2205, 0x02c3c4de, 0x0118f1a8, 0x024d4f85, 0x01fd3938, 0x028b85cb, 0x0272de0e, 0x033b65ba, 0x0032b0a0}}}, + {X: Field{[10]uint32{0x03f02e08, 0x01a1ae12, 0x027d31f7, 0x0058a558, 0x034705aa, 0x03d2a65c, 0x00f4e7b8, 0x0264f911, 0x024ffb60, 0x0033e192}}, Y: Field{[10]uint32{0x036f1bde, 0x01db1f36, 0x02a51af2, 0x0145dd12, 0x016b8a19, 0x03a62f7c, 0x01db874c, 0x03ad3519, 0x020fb736, 0x001ea634}}}, + {X: Field{[10]uint32{0x0159d1ae, 0x001c849b, 0x03f26c9e, 0x01141829, 0x02a25693, 0x02a62bf8, 0x022cd457, 0x03fe456b, 0x00d6516f, 0x001bfc58}}, Y: Field{[10]uint32{0x00eedc4a, 0x017065ed, 0x034deaff, 0x03b4007c, 0x017db5d5, 0x0143e71d, 0x038b4153, 0x0042b393, 0x0355bf14, 0x001747c4}}}, + {X: Field{[10]uint32{0x035dfcc9, 0x007f9327, 0x01a46f23, 0x016cdc0b, 0x01a56fe3, 0x018a1f6a, 0x037f2a2c, 0x009a4075, 0x0262aefd, 0x00026b6e}}, Y: Field{[10]uint32{0x03b04161, 0x017c54ea, 0x02e7e482, 0x010d0765, 0x012e708d, 0x034b12f7, 0x03126aff, 0x00d66c01, 0x0045cb4a, 0x002e963b}}}, + {X: Field{[10]uint32{0x00a2402d, 0x0038aa85, 0x035d652c, 0x0183a773, 0x02b5d900, 0x00b0437f, 0x00ea9457, 0x03712335, 0x001ebbdc, 0x000813a9}}, Y: Field{[10]uint32{0x0036ae38, 0x03de02eb, 0x01809789, 0x00c8fb02, 0x02fb0b9e, 0x024929be, 0x005db8a9, 0x00bcf2cb, 0x01aca195, 0x001eca22}}}, + {X: Field{[10]uint32{0x03c8ba22, 0x02b3a5d7, 0x0296a82a, 0x0243a109, 0x02a4b4f1, 0x008349ae, 0x01a6826c, 0x00c45089, 0x0269364d, 0x003df5b1}}, Y: Field{[10]uint32{0x039d3470, 0x019e9721, 0x03d1636f, 0x03d12c32, 0x031ff47c, 0x02cf1d86, 0x027d160c, 0x00e31401, 0x0177b425, 0x00056aec}}}, + {X: Field{[10]uint32{0x01352587, 0x019bc9df, 0x03f0dcb4, 0x019116d5, 0x01e50a7e, 0x000af488, 0x0066e00c, 0x00a31e2c, 0x030a87dd, 0x001ef134}}, Y: Field{[10]uint32{0x00c294d4, 0x032ae5b4, 0x0152ec68, 0x030481ad, 0x026efbc9, 0x032c1287, 0x026e0c9f, 0x00059369, 0x00542e7e, 0x003d3b52}}}, + {X: Field{[10]uint32{0x02316ef1, 0x01250ec7, 0x009d7856, 0x0086d094, 0x01c200eb, 0x027c818a, 0x005dfb95, 0x02fb9b09, 0x0184b046, 0x00155109}}, Y: Field{[10]uint32{0x00580d82, 0x000c6a52, 0x02280905, 0x018b4676, 0x02a29c41, 0x000fcb93, 0x026353a1, 0x007b6599, 0x0171c811, 0x000b8aaa}}}, + {X: Field{[10]uint32{0x01dce1eb, 0x01a7992c, 0x02dccbcd, 0x01ca107c, 0x020923f8, 0x02a32996, 0x0224c973, 0x0240f9c4, 0x00c0de88, 0x00239f7e}}, Y: Field{[10]uint32{0x01d2a0cc, 0x0390f049, 0x0066252a, 0x0388d325, 0x03c31205, 0x007eea36, 0x0147873f, 0x01b5479c, 0x00839ae8, 0x0039054c}}}, + {X: Field{[10]uint32{0x0251de8f, 0x011bd471, 0x024915d5, 0x0324d6f6, 0x01b84a9b, 0x017eb81e, 0x0169d066, 0x02a86095, 0x01dc69d8, 0x0019c8c8}}, Y: Field{[10]uint32{0x03ef005f, 0x00f5bdb9, 0x00188d33, 0x03c5acd3, 0x02f977b1, 0x000e9bbb, 0x0009ab18, 0x0225f6fa, 0x030b8708, 0x0022b590}}}, + {X: Field{[10]uint32{0x01ac3abc, 0x003d1ca2, 0x01bfc2d2, 0x026bda4f, 0x001b8beb, 0x02175da6, 0x00327182, 0x026c0148, 0x03c143e9, 0x003d38ae}}, Y: Field{[10]uint32{0x01651a2a, 0x02fc2c57, 0x03a897ea, 0x00f8817a, 0x036d80e9, 0x0033509b, 0x0322b7f7, 0x003aacb9, 0x00f5dc33, 0x00395264}}}, + {X: Field{[10]uint32{0x0139ffff, 0x004d3c43, 0x01ad8009, 0x0119ad7f, 0x0272694f, 0x00170582, 0x03c72758, 0x00963241, 0x025fc6d2, 0x0016a8ea}}, Y: Field{[10]uint32{0x00ea9531, 0x03018012, 0x0244a7f4, 0x02632c1d, 0x023146aa, 0x03d9c330, 0x003e82b5, 0x02be96e1, 0x0170617e, 0x0008b5c8}}}, + {X: Field{[10]uint32{0x03e2e7ef, 0x03ac021e, 0x00383be3, 0x03a9170d, 0x009e9a31, 0x02de18cf, 0x033acbd1, 0x01266b1a, 0x03f9d2bf, 0x000d1d4b}}, Y: Field{[10]uint32{0x001104f8, 0x01b6d1cb, 0x03edd91a, 0x02a60c1a, 0x0339d73c, 0x03d9f22e, 0x037d0763, 0x03621947, 0x03742cf3, 0x002d4fa8}}}, + {X: Field{[10]uint32{0x03047327, 0x00d4d989, 0x02d6b517, 0x018b6cae, 0x01889770, 0x001a7871, 0x01b4c9b5, 0x0113dc36, 0x022402ea, 0x00359409}}, Y: Field{[10]uint32{0x02b16f2d, 0x00547f12, 0x02c288c7, 0x00861b6c, 0x02d80143, 0x015cdd5f, 0x034db3fb, 0x02a2fb00, 0x019af2f2, 0x0014bd72}}}, + {X: Field{[10]uint32{0x011f4cc9, 0x024f0c00, 0x032acb45, 0x02a7b576, 0x010915d4, 0x007ce6af, 0x024a0e0b, 0x00097f45, 0x02c6553d, 0x0014aceb}}, Y: Field{[10]uint32{0x00e2f8c9, 0x029dc5fd, 0x03ba2432, 0x02f3839e, 0x0377af18, 0x00c6c975, 0x00016839, 0x02caee75, 0x00021c17, 0x0014551d}}}, + {X: Field{[10]uint32{0x027ef9ca, 0x02551fa0, 0x01b174d9, 0x01bae93e, 0x02eaa0ec, 0x022de704, 0x03284186, 0x02489049, 0x037ef797, 0x00232ed9}}, Y: Field{[10]uint32{0x000183f2, 0x0243e601, 0x00e19ae5, 0x0262ffb7, 0x0292974f, 0x0046d82f, 0x0240ec64, 0x004c4ada, 0x01b8b07e, 0x0028ca02}}}, + {X: Field{[10]uint32{0x0131d47b, 0x01c938f5, 0x022487f1, 0x035b0c5e, 0x013f89f2, 0x01d1cd2e, 0x00b1564d, 0x03c5f7a5, 0x01e0e2ee, 0x00363d57}}, Y: Field{[10]uint32{0x02b7d770, 0x00fa4b26, 0x02930052, 0x01317821, 0x00fa7dc6, 0x009c7993, 0x0016f71f, 0x018dc381, 0x02f5da57, 0x003a7f51}}}, + {X: Field{[10]uint32{0x016b6fdb, 0x0133d88d, 0x02b79d0f, 0x03b7b52e, 0x03a4ddb8, 0x01ddc5a7, 0x01573014, 0x02cc7fe7, 0x01bbfaa2, 0x003e9bf2}}, Y: Field{[10]uint32{0x0357d494, 0x01083803, 0x01b331b4, 0x033e7de0, 0x0043a2ad, 0x012c4476, 0x02fd1e4d, 0x01e431eb, 0x03cddfdd, 0x002dbfd5}}}, + {X: Field{[10]uint32{0x01b58e9a, 0x00fc2758, 0x02ae6bb9, 0x005d94f9, 0x00f93590, 0x02eb4126, 0x03752d9a, 0x03b765a7, 0x028ce748, 0x0008e7c0}}, Y: Field{[10]uint32{0x00f8b516, 0x013a3b05, 0x02f7c064, 0x028a46f6, 0x01d55c8a, 0x02dec50b, 0x02463b7b, 0x03dae9ee, 0x02b78831, 0x0005f7ff}}}, + {X: Field{[10]uint32{0x025e4f3b, 0x03e3dd25, 0x017bd99a, 0x00523c96, 0x00ecad3c, 0x00e26ee9, 0x0071db05, 0x025dbe67, 0x03fb728d, 0x000bbdb2}}, Y: Field{[10]uint32{0x01b0fd00, 0x006d83de, 0x00273b41, 0x010b3c5d, 0x03deeef5, 0x0364e8de, 0x01ebe8c1, 0x001e30fc, 0x03a7a382, 0x0006689e}}}, + {X: Field{[10]uint32{0x03064a0e, 0x025d764c, 0x0343698b, 0x011f614d, 0x021a4292, 0x00dde1c7, 0x03042f13, 0x00c57a23, 0x032b9af8, 0x0025cb5c}}, Y: Field{[10]uint32{0x024fd28b, 0x02bd36ea, 0x021d4f40, 0x00fc97f7, 0x02a5c2ae, 0x012f2ee8, 0x02380fee, 0x00ee1d02, 0x03baba4c, 0x000c2054}}}, + {X: Field{[10]uint32{0x02062a4c, 0x03c9d1db, 0x02ed33c4, 0x03b6bd08, 0x02e788bc, 0x0215052f, 0x03aa2951, 0x0263c60c, 0x0334ba49, 0x000f4de2}}, Y: Field{[10]uint32{0x02c4c8a3, 0x03686a3c, 0x0017093e, 0x00e34dd6, 0x013c3d52, 0x027dd700, 0x0087b502, 0x03e46602, 0x019c9217, 0x0011a915}}}, + {X: Field{[10]uint32{0x015c3087, 0x03e20b4e, 0x011e376b, 0x03c9f591, 0x02b13d70, 0x02f8ecd8, 0x032b289a, 0x02ceabf4, 0x003b1fc1, 0x003eec80}}, Y: Field{[10]uint32{0x00dfdabd, 0x028c5701, 0x00a81653, 0x00753906, 0x03f28e5b, 0x0305f6c0, 0x02b96bb9, 0x00d8a933, 0x02a5c462, 0x0025f219}}}, + {X: Field{[10]uint32{0x037a0471, 0x0137a3e1, 0x0247e6e1, 0x02debed6, 0x00295efd, 0x016389b1, 0x03d27a92, 0x02c7e802, 0x014e8eea, 0x0000a3ea}}, Y: Field{[10]uint32{0x01d23276, 0x016a4242, 0x022a5514, 0x0065345d, 0x03622219, 0x0233a743, 0x007b5e20, 0x03a3cf03, 0x010af2ee, 0x003dd867}}}, + {X: Field{[10]uint32{0x01308ae9, 0x033283be, 0x00f25c12, 0x00cc21e6, 0x014be272, 0x03ea3f8a, 0x0227ede6, 0x030455c5, 0x02857eb9, 0x0011c228}}, Y: Field{[10]uint32{0x024fa449, 0x00dae472, 0x00c3550e, 0x019821ea, 0x02854034, 0x02a4b3d5, 0x020ab601, 0x00e642cb, 0x01642e77, 0x003cd7e6}}}, + {X: Field{[10]uint32{0x0048a62f, 0x013cbe26, 0x02c6a636, 0x032cdad8, 0x02a82427, 0x00f3bb5b, 0x00903dcb, 0x02e1d362, 0x00976ff4, 0x0024d020}}, Y: Field{[10]uint32{0x015f3c6f, 0x033ed8fa, 0x020aeff3, 0x012262f1, 0x03daf64d, 0x0282eafd, 0x032d4fe0, 0x019d926a, 0x0162d4e2, 0x0038969a}}}, + {X: Field{[10]uint32{0x020ddf9a, 0x01676f1c, 0x03cac039, 0x037495b2, 0x039e0d24, 0x02959988, 0x0195da93, 0x00072b8c, 0x03a08182, 0x003d290a}}, Y: Field{[10]uint32{0x02000f86, 0x0349f802, 0x0396a60f, 0x0239c8c3, 0x0110bd4c, 0x01ce44a1, 0x01194afe, 0x03bfc1d7, 0x03cc0be3, 0x0023f49b}}}, + {X: Field{[10]uint32{0x03a6240c, 0x006c59b8, 0x009919c5, 0x03bed06c, 0x03791cac, 0x025f82a5, 0x0339ef61, 0x03350033, 0x0216e65b, 0x00316b69}}, Y: Field{[10]uint32{0x016eb8c3, 0x000229fe, 0x011a04a7, 0x01e9834d, 0x01cc2678, 0x02441aba, 0x01b0b323, 0x0318b721, 0x0168fe41, 0x00393197}}}, + {X: Field{[10]uint32{0x00c640e7, 0x02b84020, 0x002baca2, 0x01215844, 0x01e8b1fa, 0x00186969, 0x017c62e5, 0x03646f2f, 0x02c3d3f1, 0x001f064f}}, Y: Field{[10]uint32{0x03873ccd, 0x01672b65, 0x0333a26b, 0x01a0752c, 0x0103b8e0, 0x02294da1, 0x000ff310, 0x0023cf90, 0x00955114, 0x00331f3e}}}, + {X: Field{[10]uint32{0x011bd3c3, 0x0000ac2b, 0x016f1d96, 0x01547b1c, 0x0122b763, 0x039a8706, 0x01656293, 0x03c4a0c8, 0x01438e7c, 0x001dd509}}, Y: Field{[10]uint32{0x03d2137f, 0x02fe0022, 0x007c4deb, 0x00c80306, 0x01edf7d9, 0x022182be, 0x006eec20, 0x00def864, 0x029d212c, 0x000dd1c5}}}, + {X: Field{[10]uint32{0x03d90992, 0x02643d89, 0x02c5a3b9, 0x010f9536, 0x00bb48ff, 0x002af46a, 0x01c0f7f9, 0x039e1be9, 0x0399fa75, 0x0024b754}}, Y: Field{[10]uint32{0x0311b7ba, 0x0152484f, 0x029a406e, 0x00c664cb, 0x00ee4932, 0x031b14d2, 0x025c824a, 0x020f830b, 0x028ef937, 0x00172c6f}}}, + {X: Field{[10]uint32{0x0293157d, 0x01b77bf5, 0x00b376eb, 0x029ede87, 0x004f66e7, 0x0294cbf8, 0x03550532, 0x03ae4042, 0x0028468e, 0x00305dc2}}, Y: Field{[10]uint32{0x019a2e11, 0x01f492a0, 0x02bc2d2e, 0x0269de9d, 0x02070e5e, 0x0186b928, 0x029e262f, 0x01f51ff4, 0x003da014, 0x00036959}}}, + {X: Field{[10]uint32{0x036378c8, 0x03f7732b, 0x00ad533c, 0x0396fa2a, 0x01a8baab, 0x0044e4bf, 0x009a5341, 0x03948919, 0x0116e90a, 0x0004dcb8}}, Y: Field{[10]uint32{0x00346af9, 0x00adb972, 0x004d6e9b, 0x03ccaf16, 0x011d0a1c, 0x02369bd1, 0x038c2aaf, 0x01d6ef70, 0x00a26957, 0x0017bef5}}}, + {X: Field{[10]uint32{0x01dda936, 0x00b61a99, 0x00c008f3, 0x03eb840e, 0x0105e2b7, 0x03cc24a7, 0x01520097, 0x028acaf3, 0x021e9fa1, 0x000aef7c}}, Y: Field{[10]uint32{0x039d45ec, 0x0280b24c, 0x0364cb0b, 0x0331610e, 0x011806eb, 0x02a20cd8, 0x02c0dcd2, 0x02f77185, 0x01986008, 0x00146de2}}}, + {X: Field{[10]uint32{0x013005e1, 0x010e2f5d, 0x03f7f6a7, 0x01f09bb8, 0x039b63cc, 0x01bc8485, 0x0230d49e, 0x017b5de0, 0x00a4d049, 0x000d9a53}}, Y: Field{[10]uint32{0x00bc0af8, 0x02a8345c, 0x039075f5, 0x02da56d7, 0x03a87f48, 0x00635499, 0x031e17db, 0x02c4ccff, 0x03f3bbdc, 0x000b9278}}}, + {X: Field{[10]uint32{0x032013b8, 0x01225600, 0x027e85e6, 0x01cdaee2, 0x036fbc13, 0x004f12ab, 0x0113bf8d, 0x03850e9a, 0x00b1dc9c, 0x00090f61}}, Y: Field{[10]uint32{0x027f28bf, 0x02af56db, 0x02b91108, 0x020cb7ff, 0x0021a3dd, 0x037b1784, 0x023c2dc6, 0x031c77ff, 0x03adb6be, 0x0000e4c5}}}, + {X: Field{[10]uint32{0x0191ec92, 0x02550acb, 0x0185de03, 0x037bc641, 0x020ba6df, 0x0284aa3f, 0x00eab821, 0x03cfda0e, 0x03875255, 0x00076220}}, Y: Field{[10]uint32{0x0324b489, 0x0080dfcc, 0x012bc46c, 0x02b76f64, 0x039ccabd, 0x00bc2bbc, 0x0233538d, 0x03e05575, 0x03e2e919, 0x002a74e2}}}, + {X: Field{[10]uint32{0x01be3765, 0x01be6b2c, 0x00955645, 0x00a1e920, 0x015512d6, 0x01d0dd47, 0x0160e2aa, 0x00cddbdd, 0x03754c0d, 0x000e6887}}, Y: Field{[10]uint32{0x0035e005, 0x00baa750, 0x031bde0b, 0x02c4e914, 0x01ef4950, 0x0156ed12, 0x00188c4d, 0x035e78ef, 0x00a52a7f, 0x000f3cc9}}}, + {X: Field{[10]uint32{0x002e21c8, 0x0249e3ad, 0x029e948d, 0x007e9595, 0x0118ab0a, 0x00b19fdb, 0x01394a95, 0x0177ca87, 0x020cd8e2, 0x002843fd}}, Y: Field{[10]uint32{0x01f9e991, 0x013d4083, 0x03237bfd, 0x00d7c0b2, 0x0389fd2b, 0x03e2451c, 0x000c0bd4, 0x00bbe077, 0x01633ce8, 0x002d17cb}}}, + {X: Field{[10]uint32{0x03bcbcb1, 0x031167ad, 0x022b25bb, 0x03377092, 0x01bb801a, 0x01ae5c7e, 0x011f7a64, 0x010bdc41, 0x03920d50, 0x002f09a5}}, Y: Field{[10]uint32{0x01235665, 0x00d6f5dc, 0x031f478b, 0x0378760f, 0x02c7fab6, 0x0248175f, 0x0301530c, 0x00818586, 0x01fc1c03, 0x002dc111}}}, + {X: Field{[10]uint32{0x0037cb95, 0x00709024, 0x00da99a6, 0x0123daf3, 0x025f0ef4, 0x0076d110, 0x02a7f95d, 0x00da0aa0, 0x01fefd5a, 0x000f5c9e}}, Y: Field{[10]uint32{0x00159740, 0x01980bdc, 0x021622de, 0x024c3364, 0x019a2ea1, 0x02e89253, 0x0342cca2, 0x016df88a, 0x02cae636, 0x0037d489}}}, + {X: Field{[10]uint32{0x00dbe588, 0x00b0b57a, 0x02e2fd55, 0x03439085, 0x01bc439a, 0x0146cf54, 0x036c2bd9, 0x02bc02e4, 0x0130ef92, 0x0038315b}}, Y: Field{[10]uint32{0x00555fee, 0x0212ceda, 0x03e0f064, 0x031e921c, 0x03f35189, 0x01d9a683, 0x01bd1862, 0x01711103, 0x037d02a7, 0x0030af45}}}, + {X: Field{[10]uint32{0x0073315b, 0x0266b89e, 0x03c15d99, 0x00c909ca, 0x00f0d6e3, 0x00d2ebc7, 0x00398306, 0x02fd4bf6, 0x00e52b7b, 0x0026fe58}}, Y: Field{[10]uint32{0x018d0405, 0x0188e1c7, 0x001c9066, 0x03df6732, 0x01551862, 0x02914dce, 0x0016cb16, 0x007732c0, 0x019d20e0, 0x0002ca1c}}}, + {X: Field{[10]uint32{0x00351198, 0x0120280d, 0x019dc0d5, 0x0117511f, 0x0287fffb, 0x011d5f83, 0x017a6b14, 0x029c6b98, 0x016be60b, 0x000837c6}}, Y: Field{[10]uint32{0x02eb07d8, 0x003387c9, 0x020ae996, 0x01610bfb, 0x02f12ba3, 0x02b42aea, 0x03d49539, 0x001c6e81, 0x01430c0d, 0x00271c8b}}}, + {X: Field{[10]uint32{0x029bac17, 0x01998772, 0x036330a2, 0x01c48ed7, 0x00455a5f, 0x02055260, 0x019693d0, 0x02d02e51, 0x01360208, 0x000210f0}}, Y: Field{[10]uint32{0x02f12078, 0x0137d1bc, 0x00edec9b, 0x008e19dc, 0x02d0c74f, 0x0076e950, 0x011820d3, 0x03f1034b, 0x018d9095, 0x00356d6f}}}, + {X: Field{[10]uint32{0x008d11a0, 0x02f1c890, 0x01c03e05, 0x032dcbe7, 0x03708a3f, 0x02d1b5bb, 0x024ee0ca, 0x007a837a, 0x00df702c, 0x0024426d}}, Y: Field{[10]uint32{0x02dc507a, 0x03b322e5, 0x03242cf4, 0x031e44ee, 0x007348e9, 0x030b0c09, 0x03151954, 0x020072d4, 0x02c18be5, 0x001d6ea8}}}, + {X: Field{[10]uint32{0x0191113c, 0x03bbcf16, 0x02db2329, 0x00b8dc9f, 0x018e5155, 0x0080f167, 0x02dff03c, 0x02a6ec4a, 0x01f5c960, 0x003c4334}}, Y: Field{[10]uint32{0x028c465a, 0x03c2fc57, 0x0151b8f3, 0x03191e58, 0x009d2e03, 0x03fb998b, 0x01746898, 0x036a9859, 0x00e16f65, 0x002a12b2}}}, + {X: Field{[10]uint32{0x00e747a8, 0x03f9ab44, 0x03a071ea, 0x03437d62, 0x010ae0d6, 0x02297d4e, 0x0077b69a, 0x0180beb4, 0x013cffd3, 0x0027c1dc}}, Y: Field{[10]uint32{0x03ee867b, 0x03579723, 0x00afe58c, 0x00e95e5c, 0x01cbb4ea, 0x020be3b0, 0x003d7357, 0x02420f37, 0x007342b5, 0x002b7f32}}}, + {X: Field{[10]uint32{0x0195801a, 0x018cd0b3, 0x019f3640, 0x01b2c483, 0x005ce9ec, 0x03fe25e3, 0x032b870f, 0x015cd04e, 0x010e3290, 0x001b4767}}, Y: Field{[10]uint32{0x0031018f, 0x0153e31a, 0x010efba1, 0x025e48b9, 0x0325a3f5, 0x00eef738, 0x0345f7c2, 0x02d80935, 0x00a895d3, 0x001942f9}}}, + {X: Field{[10]uint32{0x00dcbd82, 0x0083319b, 0x03fa7128, 0x026771d9, 0x015c649f, 0x0387ec52, 0x027791c7, 0x033251e8, 0x01a56b3a, 0x00125c61}}, Y: Field{[10]uint32{0x03e6568c, 0x01aa5443, 0x01c3df5b, 0x02fdd060, 0x00f33ce5, 0x039d5968, 0x00078b2f, 0x0386c5f9, 0x037c11da, 0x001f5446}}}, + {X: Field{[10]uint32{0x000a743f, 0x0153fcc4, 0x030a2c31, 0x02f85291, 0x019a35f7, 0x00b361f0, 0x01b8bc75, 0x03ae7137, 0x00f9848e, 0x003ffdce}}, Y: Field{[10]uint32{0x032c38ec, 0x03fcdccb, 0x01df57bd, 0x02685c21, 0x00211b97, 0x01171628, 0x0037cdcf, 0x00f25dda, 0x0255cd91, 0x00041ae2}}}, + {X: Field{[10]uint32{0x001b4830, 0x024086e6, 0x00e38ccb, 0x03d177f2, 0x0141899e, 0x01f58005, 0x026876a3, 0x011b2d11, 0x01a48d35, 0x000c80e4}}, Y: Field{[10]uint32{0x0251b102, 0x01c48159, 0x0000f09c, 0x01f798ce, 0x0323fa2d, 0x015c1ed2, 0x002f3032, 0x0250479d, 0x0030b455, 0x0011bd8c}}}, + {X: Field{[10]uint32{0x0185fe9e, 0x005b8017, 0x013f9adf, 0x001848a0, 0x00558791, 0x01d8c7c6, 0x0137f7fb, 0x03a2349a, 0x0240a925, 0x002f9133}}, Y: Field{[10]uint32{0x036e1dc4, 0x02c0998a, 0x0089324d, 0x032a6906, 0x02ca6948, 0x03d12db8, 0x02806d4b, 0x01b719f9, 0x01e7d22e, 0x0005d56b}}}, + {X: Field{[10]uint32{0x0333ddae, 0x00810d73, 0x012ddeeb, 0x002d0cea, 0x03da6aa8, 0x019bf0a8, 0x03b05314, 0x035827e0, 0x02b158dd, 0x00234fc1}}, Y: Field{[10]uint32{0x0337af63, 0x011c1752, 0x01f2c4c7, 0x0106630f, 0x02f1d0a6, 0x02f4ba50, 0x036e5f4d, 0x0144eee2, 0x0299efde, 0x000b5552}}}, + {X: Field{[10]uint32{0x01596729, 0x03aa11a4, 0x02627210, 0x01d1d0ad, 0x00d0c71d, 0x00153f30, 0x01c1cb3a, 0x03d54c95, 0x039cf258, 0x003e0529}}, Y: Field{[10]uint32{0x032d867d, 0x004fdd68, 0x002dc318, 0x022bb7ae, 0x010271ce, 0x0347cf51, 0x0080c42f, 0x02d2c88f, 0x0095be48, 0x0000467f}}}, + {X: Field{[10]uint32{0x0142fb60, 0x0399097a, 0x03ec8109, 0x03efbe45, 0x01d77e57, 0x038ab4c1, 0x0262bfbe, 0x03c76d76, 0x01461c37, 0x00257a3f}}, Y: Field{[10]uint32{0x00e2db93, 0x000c0a82, 0x00d09a03, 0x03f8c1ad, 0x01d3d5b1, 0x002d162e, 0x01ace316, 0x033686a9, 0x031edfdb, 0x003770a2}}}, + {X: Field{[10]uint32{0x03981e77, 0x02ac3a29, 0x02149e2d, 0x0303d0db, 0x026f4e5c, 0x03f08209, 0x0320604c, 0x02205af1, 0x03fc47e1, 0x00301950}}, Y: Field{[10]uint32{0x03021441, 0x00d20c65, 0x0234ee66, 0x00c45fb1, 0x01281854, 0x00653327, 0x034819ac, 0x029f0844, 0x0065f3a4, 0x000881c1}}}, + {X: Field{[10]uint32{0x00d5c68e, 0x025c21ad, 0x001caa2b, 0x0142f580, 0x010fd5b0, 0x037b6138, 0x014d116b, 0x02bbe928, 0x015b3716, 0x001260f6}}, Y: Field{[10]uint32{0x03f0a279, 0x036b8b01, 0x01b0280c, 0x0299beb0, 0x00f5e609, 0x02f4efbf, 0x03d47bce, 0x033450cc, 0x026da2ef, 0x0004dcd0}}}, + {X: Field{[10]uint32{0x02afe6ab, 0x0332560f, 0x03ef61fd, 0x03b79adc, 0x03ad8054, 0x01782143, 0x022cd092, 0x012e5cee, 0x00c692e8, 0x0028af57}}, Y: Field{[10]uint32{0x02a5ce2b, 0x02c9d9f9, 0x02a4e4f0, 0x025e5e56, 0x0133d8d7, 0x027e0093, 0x019011b9, 0x006c7985, 0x038af914, 0x003329b9}}}, + {X: Field{[10]uint32{0x036d741a, 0x026353da, 0x02b60bf6, 0x0098c45e, 0x00b8f852, 0x00d9f421, 0x0076281b, 0x0139ce54, 0x0231a18f, 0x00187264}}, Y: Field{[10]uint32{0x026cbfe5, 0x0102051b, 0x019299d3, 0x02c19f52, 0x01af886d, 0x02823006, 0x00616090, 0x0074c192, 0x03979e7f, 0x00208c52}}}, + {X: Field{[10]uint32{0x02b34304, 0x0182ff5a, 0x00db73ed, 0x00bdb1af, 0x02d4072a, 0x0244cc86, 0x03114fc7, 0x014a64e9, 0x03ef32c5, 0x001296b3}}, Y: Field{[10]uint32{0x020c03c9, 0x006c15a6, 0x024da9f6, 0x02252bfe, 0x0301323e, 0x012c9b6f, 0x03f9f296, 0x0166c9a6, 0x0229c068, 0x0001ca56}}}, + {X: Field{[10]uint32{0x037f4023, 0x03d6da2e, 0x02d487d4, 0x004d085a, 0x02604e50, 0x0197b2b1, 0x036dcb6c, 0x012530ac, 0x0355866f, 0x0038119d}}, Y: Field{[10]uint32{0x00b336b3, 0x01690b0c, 0x02029d9e, 0x01d4a3b3, 0x01ae9459, 0x0098626b, 0x032f9558, 0x03e86fd4, 0x03c5974d, 0x0037ab40}}}, + {X: Field{[10]uint32{0x03215ea7, 0x03034aee, 0x0059640d, 0x01808211, 0x01c4e8be, 0x016c788c, 0x014ca74b, 0x017f7d6d, 0x0305c926, 0x001a1bf7}}, Y: Field{[10]uint32{0x017ea7da, 0x018794f5, 0x01710b65, 0x03cb1640, 0x03c93723, 0x03fcd9de, 0x02f950eb, 0x02e5d02b, 0x021cedf9, 0x003d350f}}}, + {X: Field{[10]uint32{0x03d21253, 0x017b2ee2, 0x01cb9fce, 0x009347c5, 0x03e2bcd9, 0x00365b4b, 0x022b7d7b, 0x02c833a9, 0x018500f9, 0x000491da}}, Y: Field{[10]uint32{0x03522004, 0x03785b4a, 0x03842e32, 0x03c90f75, 0x033f1950, 0x010e2702, 0x027b356b, 0x013f190e, 0x00b39e90, 0x0034d0df}}}, + {X: Field{[10]uint32{0x02d17b1b, 0x0220098a, 0x0324e453, 0x007b4be9, 0x03b5eb1e, 0x0027d95e, 0x03322910, 0x0326cb96, 0x00ec9a87, 0x00195af7}}, Y: Field{[10]uint32{0x012fa64d, 0x00f738be, 0x01d116aa, 0x00c345f0, 0x030cdfc8, 0x03f7023f, 0x03f704b3, 0x0393dfd8, 0x010c47b6, 0x0031dd23}}}, + {X: Field{[10]uint32{0x0083e4b5, 0x02fae5ad, 0x0004c3ae, 0x00f983af, 0x027a3d40, 0x020f3b44, 0x0279b244, 0x00584832, 0x010e0f72, 0x0016dfdc}}, Y: Field{[10]uint32{0x03b08080, 0x03dca12f, 0x0386b698, 0x01caf65a, 0x0011db4b, 0x0396a7bb, 0x00196e8d, 0x022bb98d, 0x03a7f068, 0x0006d455}}}, + {X: Field{[10]uint32{0x01e6b4da, 0x034f4128, 0x00deabc8, 0x00f6074b, 0x01254521, 0x003e4361, 0x015bf184, 0x029bd55e, 0x02d0552b, 0x002ff299}}, Y: Field{[10]uint32{0x01754e75, 0x01b746bc, 0x0069084b, 0x0282f776, 0x00223043, 0x0032ce84, 0x00c46383, 0x01095f01, 0x00cc290d, 0x0012442c}}}, + {X: Field{[10]uint32{0x00496f16, 0x01980ca2, 0x009247f5, 0x006f3b1c, 0x001447c1, 0x0015ef45, 0x018f8ef2, 0x032ef91e, 0x028fb79d, 0x00198fe9}}, Y: Field{[10]uint32{0x03c41786, 0x009ea9a0, 0x03951f2b, 0x028aacc3, 0x00a42597, 0x00747d08, 0x005598a9, 0x02f48f62, 0x02fa1f3b, 0x000eb38b}}}, + {X: Field{[10]uint32{0x015c4321, 0x017c7792, 0x03004608, 0x02b82033, 0x017c1675, 0x0379a289, 0x02f2f86e, 0x02e3c87f, 0x03338a3d, 0x0009f338}}, Y: Field{[10]uint32{0x00d373ae, 0x01aa0ac9, 0x01c294b1, 0x027f68aa, 0x037aefa6, 0x018f53f7, 0x0144a002, 0x0391cbac, 0x018c8bab, 0x001c55af}}}, + {X: Field{[10]uint32{0x00bd9560, 0x016f1359, 0x00ce35aa, 0x012c703a, 0x03b727be, 0x00f15d7b, 0x027940e1, 0x017026f8, 0x02c452ec, 0x00352701}}, Y: Field{[10]uint32{0x038d18b0, 0x01d48e39, 0x033c2f51, 0x022551b7, 0x015d7ad7, 0x02680d8d, 0x0266469f, 0x004029ca, 0x0118b298, 0x000b194d}}}, + {X: Field{[10]uint32{0x004ad08a, 0x0005fdd5, 0x01129cfa, 0x03f442bf, 0x023d7bf4, 0x01034ef5, 0x00ecd251, 0x02009b4f, 0x007ebd02, 0x001a5820}}, Y: Field{[10]uint32{0x020e7c7c, 0x02bab024, 0x03f4cf7b, 0x020eaa6a, 0x036f9a63, 0x02f69af7, 0x03cb5465, 0x03eb9cad, 0x004f28be, 0x0029e141}}}, + {X: Field{[10]uint32{0x01f8faa1, 0x02d4c94f, 0x03aa1ede, 0x03156953, 0x02fc9263, 0x0295f6eb, 0x0375abeb, 0x00e9c68e, 0x033654b6, 0x0020e0af}}, Y: Field{[10]uint32{0x0049b011, 0x003f3c42, 0x026dcb6d, 0x00f6515d, 0x02dc9bef, 0x0189d987, 0x021da269, 0x032d4d11, 0x01dcc319, 0x003817ae}}}, + {X: Field{[10]uint32{0x02b0bffb, 0x0168f452, 0x0379acc4, 0x026bd814, 0x02b7e705, 0x02a4cbc8, 0x008cca9f, 0x021db9e3, 0x037930ec, 0x00200ee4}}, Y: Field{[10]uint32{0x01e5790f, 0x02bc1195, 0x01152b52, 0x03745f34, 0x01cb90d1, 0x01e1a51c, 0x03ec7d0b, 0x03470b1b, 0x001c5202, 0x001f6c8d}}}, + {X: Field{[10]uint32{0x02c5292c, 0x022e8474, 0x03e08f99, 0x003a2591, 0x02cb78fb, 0x01cfeac0, 0x0165ff4f, 0x02ba7c44, 0x01290ab6, 0x0032d36c}}, Y: Field{[10]uint32{0x03d1c9c2, 0x01506235, 0x02e9ef61, 0x00235d53, 0x02745c24, 0x02ecd9bf, 0x0280ad65, 0x00e12ed6, 0x039a1776, 0x000332bb}}}, + {X: Field{[10]uint32{0x00d115a2, 0x014ab37b, 0x0179aa81, 0x01ee1325, 0x038fd6af, 0x0301c3f1, 0x038be8af, 0x03d9c8e0, 0x035750e9, 0x003eaca1}}, Y: Field{[10]uint32{0x00b3f065, 0x00452430, 0x024956c3, 0x00c7671b, 0x03764ee9, 0x02ba14c0, 0x017d3b83, 0x0158b54e, 0x002889cd, 0x003567f8}}}, + {X: Field{[10]uint32{0x0249bbc1, 0x00092159, 0x0376c198, 0x01335a96, 0x02fbdf84, 0x0020cf84, 0x02e3f036, 0x03b8f43d, 0x02baf870, 0x003761e7}}, Y: Field{[10]uint32{0x0143c55a, 0x011c5b26, 0x038f7309, 0x00ab1a94, 0x00b041a1, 0x0355a5b2, 0x03a324c1, 0x01704775, 0x00c3a99a, 0x0039eec1}}}, + {X: Field{[10]uint32{0x00f8016e, 0x03330120, 0x00d8ed00, 0x01d06d7e, 0x031df68f, 0x0095cac4, 0x01319d57, 0x01a87b6a, 0x03be29b0, 0x001ea92b}}, Y: Field{[10]uint32{0x03fe7130, 0x0252c5d4, 0x00d2dc9d, 0x00364df0, 0x02423fd0, 0x0080ae5c, 0x002e3c13, 0x02161dfc, 0x029fb77b, 0x00057de6}}}, + {X: Field{[10]uint32{0x0039f890, 0x03933163, 0x0168ba19, 0x03a455c7, 0x00c34354, 0x00b5b998, 0x03fee64f, 0x00c99575, 0x03f5876a, 0x0024517c}}, Y: Field{[10]uint32{0x0285d8ff, 0x03368a2c, 0x036c998e, 0x00755d9a, 0x0337650c, 0x0284235b, 0x009ba7fd, 0x027f416f, 0x015dcf36, 0x0011782a}}}, + {X: Field{[10]uint32{0x0111ac9e, 0x03dd03d1, 0x0131713d, 0x03224688, 0x00a5a7f6, 0x001dfcf7, 0x0337afa2, 0x0004347b, 0x035236fb, 0x0015142d}}, Y: Field{[10]uint32{0x026ba175, 0x03c0603f, 0x01ef08b6, 0x00e99c42, 0x0313ff56, 0x037b4b5e, 0x021084d3, 0x03e1b537, 0x015762be, 0x0029f1fb}}}, + {X: Field{[10]uint32{0x00666a0f, 0x00b3e230, 0x001b84c3, 0x01bf44d4, 0x01bbf276, 0x0105f41d, 0x00256d67, 0x0378b32e, 0x01725e48, 0x002e9b03}}, Y: Field{[10]uint32{0x0125e442, 0x0061bcf9, 0x006405ed, 0x012e46f3, 0x02bdecd6, 0x0296640c, 0x02da6693, 0x00a67d43, 0x01327137, 0x00334aa4}}}, + {X: Field{[10]uint32{0x0205c921, 0x036dece5, 0x00b0553a, 0x0276ab56, 0x01d25a64, 0x0263ef7d, 0x011006b7, 0x03aed1bf, 0x01ff1fee, 0x002e5208}}, Y: Field{[10]uint32{0x01077c05, 0x03162afe, 0x0365a72d, 0x02bbbb10, 0x01f45ccf, 0x015d2bf3, 0x003d950c, 0x024a8b1f, 0x03a079bb, 0x00085626}}}, + {X: Field{[10]uint32{0x01a0681d, 0x0221e7c3, 0x01f8198f, 0x037a4f58, 0x00432f14, 0x02a58f32, 0x00e0d7a5, 0x01f1dadc, 0x0046497f, 0x001190d9}}, Y: Field{[10]uint32{0x01c83a5f, 0x03982352, 0x012398a3, 0x0396cfb2, 0x0348c367, 0x03a89797, 0x01a8aab5, 0x03604043, 0x024e90c4, 0x000a4d12}}}, + {X: Field{[10]uint32{0x00c1ae1d, 0x02c2ce39, 0x00d0802b, 0x005d6ea8, 0x01bd3be9, 0x02f2c33c, 0x019185b7, 0x0042f925, 0x02c6a2e2, 0x002f6396}}, Y: Field{[10]uint32{0x01b1fa19, 0x03c22a8b, 0x000a94ed, 0x0069f0fb, 0x0269c6f7, 0x03b22229, 0x03773a5e, 0x025d5769, 0x03e46dcc, 0x001ace06}}}, + {X: Field{[10]uint32{0x01f22493, 0x03463fe6, 0x0231974c, 0x024ece50, 0x017fb645, 0x022b39db, 0x00c34055, 0x029e943d, 0x021ac428, 0x00309f07}}, Y: Field{[10]uint32{0x019cf57c, 0x013e4671, 0x004a4954, 0x03cf0178, 0x0025108a, 0x02a7d665, 0x031884cf, 0x01ece872, 0x0261c12f, 0x003f2575}}}, + {X: Field{[10]uint32{0x03eb30d5, 0x00ebc89d, 0x03c029e5, 0x00050103, 0x0044c17c, 0x0364119b, 0x028168ee, 0x01329549, 0x0161837e, 0x00285d95}}, Y: Field{[10]uint32{0x02c28eb5, 0x022d9b2d, 0x015aecfc, 0x01d743e8, 0x033032c7, 0x0039b8bd, 0x0255d0b3, 0x0222ff35, 0x01e2b8d4, 0x00228b7b}}}, + {X: Field{[10]uint32{0x01ddbea9, 0x03a63060, 0x02f93b03, 0x00de0c03, 0x00e9eea7, 0x01e2e8da, 0x029279f6, 0x0332461f, 0x030d35ca, 0x000afda4}}, Y: Field{[10]uint32{0x0225209d, 0x03e81a79, 0x00db46e2, 0x00c30d74, 0x02d0f3f9, 0x0232a385, 0x03ee5383, 0x022ec0ff, 0x01433aaa, 0x00228b53}}}, + {X: Field{[10]uint32{0x0077c8d7, 0x019a9c1a, 0x0056a6a0, 0x01680e96, 0x00a36d08, 0x019d5649, 0x03005f4d, 0x02bbf643, 0x03259cc5, 0x001d9a9d}}, Y: Field{[10]uint32{0x00049190, 0x03078cd2, 0x03dc4171, 0x0012fd02, 0x0090b46d, 0x03a4e3bc, 0x01bfad15, 0x038b9fc1, 0x00974fd9, 0x0036cfeb}}}, + {X: Field{[10]uint32{0x00461268, 0x024bfe46, 0x03242887, 0x038e6a44, 0x02134196, 0x025cca76, 0x00c333c0, 0x0087517f, 0x00cd953f, 0x00349698}}, Y: Field{[10]uint32{0x010c7863, 0x03c9339e, 0x0270f397, 0x026240d4, 0x00a07ad5, 0x008d4a60, 0x03874e71, 0x020d7f6e, 0x03e8bd04, 0x00226fca}}}, + {X: Field{[10]uint32{0x02d95d68, 0x03f90a72, 0x000b360d, 0x021a3286, 0x019bf569, 0x01997abf, 0x021f467b, 0x0096c99c, 0x029e8b71, 0x0031eca3}}, Y: Field{[10]uint32{0x0295c398, 0x030ea9e7, 0x02167b37, 0x00d1d91a, 0x009ec7bf, 0x02f291da, 0x03947ed8, 0x02d869c7, 0x0158b3a7, 0x0002b0a3}}}, + {X: Field{[10]uint32{0x0059bc24, 0x02cd375f, 0x03a97ce8, 0x01803c7d, 0x0120c291, 0x033f3a61, 0x022d7a74, 0x0230a6b6, 0x008ac61f, 0x0038a948}}, Y: Field{[10]uint32{0x01c70830, 0x0367d6cf, 0x00e4a880, 0x009dddff, 0x03a152ce, 0x03a438e0, 0x034483b4, 0x02281332, 0x02144970, 0x00037a2e}}}, + {X: Field{[10]uint32{0x02e205b1, 0x0112b7c4, 0x03ca53e8, 0x000620a1, 0x016976e0, 0x0150259f, 0x032b152a, 0x037e574e, 0x00cd02e8, 0x00387a39}}, Y: Field{[10]uint32{0x03bfc9e2, 0x03633bd0, 0x02491a77, 0x025fd51a, 0x020d34aa, 0x008cdc8f, 0x03f00918, 0x0151ef2c, 0x02f9cdc7, 0x002976f1}}}, + {X: Field{[10]uint32{0x012b6512, 0x0152fc27, 0x0375bea4, 0x02cee257, 0x023c3143, 0x03cec70a, 0x02284803, 0x013954ac, 0x02514a68, 0x002c83c2}}, Y: Field{[10]uint32{0x000d02c9, 0x0376a5ba, 0x02c31e0e, 0x02173513, 0x00f7c955, 0x0250681f, 0x000b0c31, 0x00345027, 0x0380676d, 0x002f0f6c}}}, + {X: Field{[10]uint32{0x0029d3ec, 0x029a5a83, 0x009499cf, 0x0326e5d2, 0x039582cb, 0x001eb25b, 0x00d9d8d4, 0x02fdde53, 0x0123b1ad, 0x002dc69a}}, Y: Field{[10]uint32{0x00b4f151, 0x03f38699, 0x03b1c89b, 0x03b9d9e7, 0x027b6d75, 0x00e31cb4, 0x03113c8d, 0x01563ee4, 0x03899d59, 0x001d4608}}}, + {X: Field{[10]uint32{0x03d3bb3f, 0x013571a9, 0x01a65200, 0x017c3677, 0x00a82f41, 0x01d595e2, 0x00ef76c0, 0x00e34633, 0x01ac68ba, 0x003291eb}}, Y: Field{[10]uint32{0x028701df, 0x02b41412, 0x0137842f, 0x0130e5a7, 0x02ccd845, 0x00597f56, 0x0035385e, 0x00ce0910, 0x00ab1b78, 0x0002f566}}}, + {X: Field{[10]uint32{0x0140e441, 0x03e6740b, 0x025eea45, 0x0313667d, 0x014fb989, 0x03757932, 0x034eeece, 0x03a7ba7e, 0x0148acee, 0x0017eb78}}, Y: Field{[10]uint32{0x033831f0, 0x00775335, 0x031cb5e6, 0x032ce50f, 0x0015afd1, 0x02374b00, 0x01104cac, 0x015606b1, 0x023ae82e, 0x002e9bf2}}}, + {X: Field{[10]uint32{0x025f84e9, 0x02b698ff, 0x0049e8ad, 0x014798ce, 0x02e834c8, 0x0073cc3e, 0x000ba01a, 0x033c0024, 0x01d214fc, 0x001d9f72}}, Y: Field{[10]uint32{0x00404639, 0x00c85799, 0x017d69ee, 0x03466b86, 0x0101a5bc, 0x03f5f2ff, 0x02b97a52, 0x003958b5, 0x0111aca3, 0x00231942}}}, + {X: Field{[10]uint32{0x024f06d9, 0x01c5e2df, 0x0286b91d, 0x035d1df9, 0x01523544, 0x030f01b6, 0x02a7648f, 0x00a88176, 0x0161445e, 0x0009fe3e}}, Y: Field{[10]uint32{0x02a73a60, 0x01f37f60, 0x00172042, 0x010886fa, 0x02379332, 0x02de7977, 0x0196bce6, 0x01efa5d5, 0x032782cd, 0x000e4442}}}, + {X: Field{[10]uint32{0x033de668, 0x000c594f, 0x035bc6a4, 0x02260e5c, 0x008a1b28, 0x01e77792, 0x024070bf, 0x01792eb6, 0x005b343b, 0x00237812}}, Y: Field{[10]uint32{0x02d5729d, 0x033eb883, 0x021431c2, 0x01ca0c0b, 0x0212fbba, 0x03164492, 0x011c1a44, 0x0383df5f, 0x03676f43, 0x00240c15}}}, + {X: Field{[10]uint32{0x012df0ff, 0x03973165, 0x01fe1b68, 0x0287bb25, 0x005b6af8, 0x039c030a, 0x038d3188, 0x03a2ba2a, 0x036c8770, 0x001790f6}}, Y: Field{[10]uint32{0x006c7aa6, 0x00a90e54, 0x01f90ae0, 0x00f4dc1d, 0x009aeebb, 0x0179671e, 0x02a10911, 0x02f3f8e8, 0x028dd85f, 0x001a2098}}}, + {X: Field{[10]uint32{0x01a4ed54, 0x0047d096, 0x037a0893, 0x00f3b7fa, 0x03610286, 0x00b7c508, 0x00af4e35, 0x00c0379f, 0x02ab4bf4, 0x001f6cae}}, Y: Field{[10]uint32{0x038e8a84, 0x0009bf85, 0x000cbd33, 0x01328f53, 0x01e553a8, 0x02164273, 0x03fbbcd6, 0x0112f8c0, 0x01a2fbbb, 0x000e1d58}}}, + {X: Field{[10]uint32{0x0196c6f1, 0x0134436e, 0x00bbefc0, 0x0332aee4, 0x00cdbefd, 0x00cb6cf9, 0x03df9e82, 0x01a21f47, 0x01253910, 0x0025b6a1}}, Y: Field{[10]uint32{0x03f9edcc, 0x00f4c026, 0x00509402, 0x024adff3, 0x0345948c, 0x0370cca1, 0x035d6513, 0x01cd067e, 0x02314912, 0x001949c6}}}, + {X: Field{[10]uint32{0x01d50613, 0x029e122b, 0x03b0081b, 0x003eb2e5, 0x0264cd4c, 0x00e2d217, 0x03a51fa8, 0x004a13d6, 0x01cb14eb, 0x00213bfc}}, Y: Field{[10]uint32{0x02febd9e, 0x01e314a9, 0x004fc7f5, 0x0044cbca, 0x03609f45, 0x033a0631, 0x01e602b6, 0x002a35ec, 0x01c8a654, 0x000249b2}}}, + {X: Field{[10]uint32{0x02adfbbe, 0x00665078, 0x017057fe, 0x02489756, 0x00416e6a, 0x02fe5280, 0x02e60007, 0x00a83fd7, 0x03718e2a, 0x0007ae58}}, Y: Field{[10]uint32{0x0005b855, 0x027da84c, 0x01bb009c, 0x008f3fc3, 0x02d3cf05, 0x00018e6a, 0x03d40115, 0x0377eb70, 0x02d89635, 0x00121c2a}}}, + {X: Field{[10]uint32{0x03bdc098, 0x01372e1d, 0x03fd8d45, 0x0287dda0, 0x03c75fd4, 0x02bc64f7, 0x01a8696b, 0x03cc1c6f, 0x036a6ea3, 0x000a6528}}, Y: Field{[10]uint32{0x03856766, 0x00b1312f, 0x02eb3fc8, 0x000c6dda, 0x009969bf, 0x025bf4fa, 0x006bd0be, 0x00f5335e, 0x00eea727, 0x0039197a}}}, + {X: Field{[10]uint32{0x0126c414, 0x01d63567, 0x03c00237, 0x032edfcb, 0x01d2b68f, 0x038b65f6, 0x01b115b5, 0x015e8b0a, 0x0370f3d3, 0x000979fe}}, Y: Field{[10]uint32{0x0356c4f2, 0x0099dcfc, 0x02631fed, 0x00c3beb2, 0x00206b73, 0x00ea1aae, 0x0130fa01, 0x02257afd, 0x0370a3bb, 0x00125668}}}, + {X: Field{[10]uint32{0x007c0623, 0x035624cd, 0x020ea0df, 0x01496221, 0x03c3945c, 0x0359af16, 0x030481a2, 0x01aef867, 0x039880bf, 0x003f0e1f}}, Y: Field{[10]uint32{0x009d67c4, 0x0198faed, 0x001ff16e, 0x01d03042, 0x027ba332, 0x00d1812a, 0x01d07af7, 0x03c0ca72, 0x000e83ca, 0x002275ee}}}, + {X: Field{[10]uint32{0x0201e1d4, 0x000ca53f, 0x03a99e2f, 0x02d00217, 0x00ef5c00, 0x03c5ddc8, 0x0220fa82, 0x0327f840, 0x0368c25f, 0x003142bc}}, Y: Field{[10]uint32{0x017579fb, 0x02532dae, 0x0131ba42, 0x003e5e32, 0x0327d9f1, 0x03a52bde, 0x012b80d9, 0x00c25024, 0x03264198, 0x0030ddde}}}, + {X: Field{[10]uint32{0x00041f94, 0x01d85f84, 0x01bea7c9, 0x0121553d, 0x00d7015c, 0x010697c8, 0x02003629, 0x0366ea8b, 0x0109d524, 0x00283e74}}, Y: Field{[10]uint32{0x010e9ad0, 0x00f18a9c, 0x019f1daf, 0x00e80e9a, 0x012eae92, 0x01915838, 0x0277ff2c, 0x0384200f, 0x0002daa5, 0x000a3147}}}, + {X: Field{[10]uint32{0x00316de1, 0x0218a8d2, 0x03a285da, 0x008f2f37, 0x032138bc, 0x0020012c, 0x03271389, 0x02dc2161, 0x02270058, 0x00107449}}, Y: Field{[10]uint32{0x001b9673, 0x037d3c1f, 0x02999d29, 0x029243ac, 0x00341d90, 0x03545764, 0x015f4513, 0x033b2572, 0x0029153b, 0x000189dc}}}, + {X: Field{[10]uint32{0x0299ca87, 0x003e159b, 0x0221cfb8, 0x02335875, 0x02577444, 0x00ceb6ce, 0x03afb77e, 0x03d50f64, 0x00cefe6c, 0x00251316}}, Y: Field{[10]uint32{0x004d66b5, 0x01cc5c0a, 0x03056e74, 0x022adf5e, 0x02329495, 0x01af2c88, 0x011c5576, 0x031c5f2a, 0x001c9b7f, 0x00301c7b}}}, + {X: Field{[10]uint32{0x02437145, 0x02afafef, 0x00635f2b, 0x01645ca4, 0x009a27be, 0x023baed6, 0x0029bf18, 0x01c73a70, 0x0312e06d, 0x000cc1ea}}, Y: Field{[10]uint32{0x0061d213, 0x01aa5272, 0x014c3c6b, 0x03425f61, 0x014a6966, 0x0227a602, 0x008dd9bf, 0x0242451d, 0x00b928cf, 0x0022270f}}}, + {X: Field{[10]uint32{0x01cb9ae6, 0x006dfcd1, 0x028acdee, 0x01c8b6da, 0x0272b745, 0x0090c1ed, 0x0203abd0, 0x00893932, 0x00111eb2, 0x0010aebc}}, Y: Field{[10]uint32{0x0212ee06, 0x0257ea8b, 0x00b11256, 0x0349cde7, 0x02879515, 0x02348b17, 0x0164bec3, 0x037a892d, 0x0128d608, 0x002fccb8}}}, + {X: Field{[10]uint32{0x0002c621, 0x01321531, 0x006bfe73, 0x03028af2, 0x01166c69, 0x0043445d, 0x03be8981, 0x012f4127, 0x02bbbe7b, 0x00215aea}}, Y: Field{[10]uint32{0x0112ac0c, 0x035d0612, 0x0321b943, 0x025e7b51, 0x011f8251, 0x0388a7a2, 0x0024161b, 0x007f4f35, 0x03c9b6d3, 0x000928c8}}}, + {X: Field{[10]uint32{0x024a9cd4, 0x01b60c34, 0x02c1c321, 0x03720172, 0x0195aeea, 0x03a0e0d3, 0x00c224ed, 0x0050f61d, 0x018ed998, 0x000e36f0}}, Y: Field{[10]uint32{0x027eae4a, 0x02247945, 0x00a03570, 0x03b9fe4d, 0x01271c6e, 0x0242ad71, 0x038e2eaa, 0x015de3a8, 0x0126f7e8, 0x0009cfb0}}}, + {X: Field{[10]uint32{0x0188dc59, 0x007ae052, 0x00d92c98, 0x019697d2, 0x015e24c0, 0x020dd2bc, 0x026bb20c, 0x008ca4c5, 0x005bffcd, 0x000d6772}}, Y: Field{[10]uint32{0x03bf39c6, 0x0058beaf, 0x0184ae58, 0x000fdded, 0x02c4a057, 0x010def7f, 0x0237d06e, 0x01622e40, 0x01f7deef, 0x0037977b}}}, + {X: Field{[10]uint32{0x023666ea, 0x028d6df1, 0x0283bb1c, 0x01d275fc, 0x031d872a, 0x0297cf69, 0x022f73a6, 0x007220f7, 0x0065e2e9, 0x003841a0}}, Y: Field{[10]uint32{0x03752cd9, 0x0347c05c, 0x00523c5e, 0x03eb2375, 0x01a7e155, 0x01da140d, 0x0128afaa, 0x0021461e, 0x0252b5df, 0x0020430e}}}, + {X: Field{[10]uint32{0x03b19d83, 0x02141b76, 0x033c70fd, 0x01b72f57, 0x00b56495, 0x03377f7f, 0x03171830, 0x032699b8, 0x037137e7, 0x00141d9f}}, Y: Field{[10]uint32{0x00d4fff8, 0x00e19928, 0x039fa5e3, 0x019d58f6, 0x02393b61, 0x03cb82b8, 0x03d24dd3, 0x017fb601, 0x015f5e9d, 0x003870b7}}}, + {X: Field{[10]uint32{0x02e65864, 0x02d66039, 0x00a725a0, 0x017fd4f6, 0x035e0127, 0x03f3a84d, 0x0216d0de, 0x020d57c4, 0x03f0cdf8, 0x001133b2}}, Y: Field{[10]uint32{0x011cd40e, 0x030eb5bd, 0x00d2e025, 0x008bc572, 0x02e8e3f0, 0x019ef18d, 0x0290550e, 0x03a6e7b8, 0x028e5094, 0x00011a55}}}, + {X: Field{[10]uint32{0x02aa18b3, 0x038d11e5, 0x005e886c, 0x024980b8, 0x0387ed8a, 0x02bf28ae, 0x02fe5976, 0x02c1fbe8, 0x00ea43cb, 0x00060c32}}, Y: Field{[10]uint32{0x031da49d, 0x0077610b, 0x01d658bf, 0x03ead511, 0x013c8ce2, 0x03e8c704, 0x03562037, 0x02bb9d9f, 0x0328e064, 0x0037d544}}}, + {X: Field{[10]uint32{0x019326c6, 0x0242a92f, 0x02b799bf, 0x03ab13e3, 0x00708245, 0x0107d3b9, 0x0033417a, 0x01eac947, 0x037a473a, 0x00163552}}, Y: Field{[10]uint32{0x009b2a85, 0x01168bb1, 0x027891ce, 0x024febd7, 0x02a16920, 0x02c72cb2, 0x00c331bf, 0x0381f329, 0x033815e2, 0x0028647c}}}, + {X: Field{[10]uint32{0x02c6792c, 0x024ad544, 0x01af7ba1, 0x01b913a0, 0x0170a18b, 0x00bf2618, 0x03af1044, 0x0204b980, 0x02049507, 0x003c3739}}, Y: Field{[10]uint32{0x03b966e4, 0x029ec26e, 0x015ce3ad, 0x02d31536, 0x004cc60e, 0x033c3d58, 0x0248df55, 0x01bb588f, 0x0221b5e8, 0x00308868}}}, + {X: Field{[10]uint32{0x01dd2ab5, 0x02e94156, 0x013d40d7, 0x033eb94a, 0x02e4b958, 0x0112c9ab, 0x02aaa046, 0x00c0aca1, 0x01e572c0, 0x0010bec2}}, Y: Field{[10]uint32{0x01f2299f, 0x0206f546, 0x00099437, 0x02a09d25, 0x03f46e1b, 0x020f9f45, 0x007ec769, 0x01a223ef, 0x0173a00e, 0x001e7041}}}, + {X: Field{[10]uint32{0x03502ecb, 0x034104bc, 0x005deea2, 0x02f222c0, 0x00935465, 0x0036b443, 0x028db25e, 0x00326a18, 0x0151ddae, 0x001eb7c5}}, Y: Field{[10]uint32{0x01acfd20, 0x01621bca, 0x01a9bb3c, 0x019e7651, 0x012e031e, 0x02744428, 0x01ef5c36, 0x03aa4832, 0x03a2143c, 0x00195f02}}}, + {X: Field{[10]uint32{0x002c7a5a, 0x03f6470a, 0x013454df, 0x0324a049, 0x013a7bfd, 0x03f0bd6f, 0x0271310a, 0x03da9b58, 0x00b956fd, 0x00375692}}, Y: Field{[10]uint32{0x00a52657, 0x03df305f, 0x021e385d, 0x03364685, 0x002ac6b0, 0x02564119, 0x03521072, 0x01fcdbea, 0x00372e06, 0x001ce434}}}, + {X: Field{[10]uint32{0x021466fe, 0x01b0b622, 0x0301d293, 0x00ec74d8, 0x0013ac76, 0x00134b38, 0x01c783b1, 0x011652f8, 0x00b51537, 0x0018c614}}, Y: Field{[10]uint32{0x0190882e, 0x03cc8a31, 0x03a8578b, 0x000addfb, 0x022016d2, 0x015ca6b3, 0x0241416c, 0x01f912a4, 0x021ea9b6, 0x00092433}}}, + {X: Field{[10]uint32{0x03a0bca5, 0x02c381bc, 0x028e0741, 0x01a6f71a, 0x00244668, 0x00e8f331, 0x0185cd58, 0x0088a6bb, 0x01e4d673, 0x000ccb8e}}, Y: Field{[10]uint32{0x017578e7, 0x01135217, 0x025aa602, 0x0037d351, 0x00b66ac3, 0x01d2b597, 0x018b1b40, 0x014ab829, 0x030360db, 0x00242103}}}, + {X: Field{[10]uint32{0x022f0c97, 0x0144e90d, 0x00980de7, 0x02ca479c, 0x01d72c0e, 0x00994cbc, 0x027224e8, 0x03870595, 0x0156f0c7, 0x00378065}}, Y: Field{[10]uint32{0x00411ea3, 0x002bb61a, 0x03e479af, 0x02f5925d, 0x01d75fa5, 0x018e094a, 0x022227a6, 0x02210105, 0x039d1cc9, 0x000e68f5}}}, + {X: Field{[10]uint32{0x00ed859f, 0x0128b2c9, 0x002a6809, 0x01b28fe4, 0x024f81b7, 0x006e0b91, 0x02ffbf26, 0x036a0031, 0x00c8e675, 0x00131130}}, Y: Field{[10]uint32{0x0245ac34, 0x00ad64c3, 0x0224663b, 0x025c68e8, 0x00c54978, 0x010eae2b, 0x03f28002, 0x01177b63, 0x02881ecc, 0x0016787b}}}, + {X: Field{[10]uint32{0x009286a2, 0x00d953cc, 0x03d28279, 0x02f844f9, 0x02a4e0dc, 0x017773b1, 0x01f4d1a8, 0x03867970, 0x01b80481, 0x003980ce}}, Y: Field{[10]uint32{0x009d9d59, 0x0229c1a9, 0x0372d1b0, 0x03e51cdf, 0x00bc58e3, 0x034a96a6, 0x01c7998e, 0x02507ed4, 0x02cca607, 0x002687ba}}}, + {X: Field{[10]uint32{0x00a25e66, 0x0340b0f6, 0x01be0d44, 0x015714a1, 0x010c6ad9, 0x0023ffb1, 0x00bc4727, 0x024bce7d, 0x02e30e72, 0x00043d0b}}, Y: Field{[10]uint32{0x00916a25, 0x02a5d73b, 0x01106034, 0x0037c069, 0x00183e13, 0x0259f3c5, 0x01d5f2bc, 0x038a3f6e, 0x01f053eb, 0x0001bcd9}}}, + {X: Field{[10]uint32{0x0329c445, 0x014f6199, 0x01548b6d, 0x02b964ea, 0x03703af3, 0x031635d2, 0x02fb0f31, 0x019a1df4, 0x01cad128, 0x001f824c}}, Y: Field{[10]uint32{0x036b0b0b, 0x00485d07, 0x03ffbf5a, 0x03e489dc, 0x00a9c34a, 0x0015bd32, 0x03caf7e8, 0x02d07598, 0x01fc75ea, 0x0001792e}}}, + {X: Field{[10]uint32{0x03963f22, 0x00450d55, 0x00f1c6a0, 0x03036c9e, 0x01b7f1ac, 0x020d8bdf, 0x014cd1a7, 0x00f1b3fc, 0x037ef961, 0x000d8c4f}}, Y: Field{[10]uint32{0x03d7edc2, 0x006ead10, 0x03a69864, 0x0246e998, 0x0033960a, 0x01250817, 0x006627f5, 0x0108c52b, 0x02ab02a9, 0x00079a51}}}, + {X: Field{[10]uint32{0x0069fe01, 0x03b15d0a, 0x033bb55c, 0x0164bf23, 0x0283f9ba, 0x03aa8ba7, 0x0218a63c, 0x030996cb, 0x02d88eed, 0x00088fbb}}, Y: Field{[10]uint32{0x01bbd71c, 0x00842570, 0x025ffeff, 0x02e35a1f, 0x005593f7, 0x00b5cb44, 0x0232cc89, 0x026ff3cd, 0x01734ae2, 0x001c8488}}}, + {X: Field{[10]uint32{0x00b3ec20, 0x01e9698a, 0x035fc31b, 0x02f3e6a6, 0x0160dbb2, 0x021e5684, 0x03b9b321, 0x00b1780f, 0x02c93330, 0x002daf57}}, Y: Field{[10]uint32{0x019dd495, 0x0074b672, 0x0242cd0f, 0x03ce6d0a, 0x0034f373, 0x00ed22eb, 0x01f051d6, 0x0397fac5, 0x03f298a8, 0x003ee7e1}}}, + {X: Field{[10]uint32{0x00e24668, 0x02a2c053, 0x012c98f0, 0x02fcee3e, 0x025a802d, 0x023f55eb, 0x03f69ce0, 0x0093ec55, 0x03603b1c, 0x0028d969}}, Y: Field{[10]uint32{0x000a89f9, 0x02fb0fd7, 0x037606f2, 0x02d06c34, 0x02578005, 0x02606039, 0x0238cc72, 0x02af680a, 0x022b7746, 0x001cf990}}}, + {X: Field{[10]uint32{0x03cebe6e, 0x017287b5, 0x0213aa23, 0x007b4de7, 0x03e24bac, 0x03511a81, 0x02dba309, 0x00dbdbd2, 0x03ac43e4, 0x003a1be3}}, Y: Field{[10]uint32{0x00a166af, 0x00f5b6fd, 0x01cd4a91, 0x0009df30, 0x00930b74, 0x00a8044d, 0x03a592c4, 0x02a6f5c4, 0x00efaa75, 0x00079eed}}}, + {X: Field{[10]uint32{0x039bd5ac, 0x00fa1a3a, 0x015cc993, 0x038ba162, 0x0205cab3, 0x03f78768, 0x0109304c, 0x0155c76b, 0x01fad2b2, 0x003d695f}}, Y: Field{[10]uint32{0x037c1ff6, 0x02317a61, 0x029b0c76, 0x001afb2e, 0x008eb909, 0x02265e89, 0x018dad26, 0x00390754, 0x025e8fc9, 0x00349977}}}, + {X: Field{[10]uint32{0x01f76c7b, 0x011651dd, 0x010f145c, 0x01f28afc, 0x01665660, 0x009192a7, 0x02fd8cab, 0x024dd1f9, 0x017a0725, 0x00387734}}, Y: Field{[10]uint32{0x02f9a20e, 0x03799012, 0x0278a130, 0x0339ae55, 0x00dff819, 0x008caf51, 0x009feb61, 0x021b4992, 0x0310023f, 0x003be8b0}}}, + {X: Field{[10]uint32{0x03a801ff, 0x00e1b373, 0x00c3bafd, 0x03f73290, 0x03cb3774, 0x00176a6a, 0x0274b80a, 0x025ab46f, 0x03dd0849, 0x0020fe2a}}, Y: Field{[10]uint32{0x03c3f63d, 0x01f18e92, 0x002873d3, 0x00ddaa89, 0x001c85ff, 0x019a1a36, 0x02e792d9, 0x02c4395b, 0x0164329f, 0x00099faf}}}, + {X: Field{[10]uint32{0x03259fae, 0x02e952d3, 0x02454ea9, 0x006bcd3f, 0x03ca324b, 0x01445216, 0x0087c716, 0x016a409d, 0x01796ca8, 0x00153327}}, Y: Field{[10]uint32{0x02b2da2a, 0x007682fe, 0x020f2e20, 0x030545f3, 0x023c6ce8, 0x03adba0e, 0x0016e9ed, 0x021875f4, 0x0071ef0b, 0x000630e4}}}, + {X: Field{[10]uint32{0x01402ba4, 0x0070864c, 0x02a51635, 0x02b25039, 0x001c3f65, 0x0047e1d1, 0x0075ac1b, 0x0059538a, 0x012ae009, 0x002744a9}}, Y: Field{[10]uint32{0x00e81d2e, 0x038bc04e, 0x02e52bbe, 0x00b754fd, 0x03c6d7e4, 0x03d7eb58, 0x00d17f39, 0x0066bd06, 0x03342762, 0x0017feec}}}, + {X: Field{[10]uint32{0x02496998, 0x00ed9979, 0x038244f2, 0x03c2dfbc, 0x00488007, 0x03c86ba9, 0x0030917f, 0x006a4734, 0x01b76682, 0x001966ff}}, Y: Field{[10]uint32{0x014784e0, 0x0139f289, 0x039db844, 0x023af087, 0x03d7321a, 0x022f091f, 0x01ef96b7, 0x03a168d0, 0x00bc4506, 0x000ab5c2}}}, + {X: Field{[10]uint32{0x02b4670b, 0x004a5b97, 0x02413d60, 0x013d5cc4, 0x0276ba1b, 0x0055269a, 0x026a2538, 0x020dd121, 0x0233d4a0, 0x0038b313}}, Y: Field{[10]uint32{0x00672476, 0x00502269, 0x00e18797, 0x002e8eca, 0x0080497f, 0x01930dc6, 0x039780ea, 0x01fcd1ed, 0x0325347e, 0x0014a2ca}}}, + {X: Field{[10]uint32{0x02edec68, 0x023840f9, 0x00131e24, 0x03133f2b, 0x01e8dbba, 0x02941580, 0x02164c0f, 0x030db26c, 0x039c9e21, 0x0014a702}}, Y: Field{[10]uint32{0x027125f4, 0x01c04a55, 0x037e4967, 0x017c272e, 0x026cb74f, 0x034b80e1, 0x0269e6ab, 0x032804cd, 0x002172a0, 0x001fe912}}}, + {X: Field{[10]uint32{0x003b63a1, 0x034d54da, 0x01dda654, 0x01efacbc, 0x033d89e5, 0x0203ed96, 0x00d6532a, 0x01f47055, 0x03afbe6a, 0x000a275a}}, Y: Field{[10]uint32{0x01005400, 0x024c5a1f, 0x03b53388, 0x03c30f36, 0x03db149f, 0x01499e1d, 0x022c62c5, 0x02358583, 0x0063d3ce, 0x002007d2}}}, + {X: Field{[10]uint32{0x010f14a1, 0x00bb3c1e, 0x0099e51f, 0x01616346, 0x022eab9b, 0x0096ad0c, 0x0005bb34, 0x019981f0, 0x00c9e3b3, 0x00345aa1}}, Y: Field{[10]uint32{0x0156dd07, 0x02d46614, 0x0231379b, 0x033c672c, 0x0146ec79, 0x02b5b83c, 0x03fc5ea4, 0x014ca3e7, 0x01ab1071, 0x000b1bd7}}}, + {X: Field{[10]uint32{0x036348f1, 0x01c0ec5a, 0x01affd30, 0x03cfb2f8, 0x02a7062d, 0x010436ac, 0x00a6893e, 0x02fefd10, 0x00394fda, 0x00340f2b}}, Y: Field{[10]uint32{0x009d19f9, 0x006e8d11, 0x0040ae5d, 0x01b4e390, 0x035dc4a8, 0x037a56c6, 0x0185c087, 0x02cc5dc3, 0x03cef530, 0x000548c4}}}, + {X: Field{[10]uint32{0x0063379b, 0x0081ed6a, 0x03101c89, 0x0012f125, 0x00d4c4b6, 0x03e5a616, 0x00a7d851, 0x0312a5df, 0x006ca673, 0x002d9acf}}, Y: Field{[10]uint32{0x01624da4, 0x01c2c18c, 0x005609a4, 0x03fc61fc, 0x004b00fa, 0x0055a587, 0x02c63cb7, 0x01aab120, 0x0163771c, 0x00152e89}}}, + {X: Field{[10]uint32{0x018c8c45, 0x039145aa, 0x01e86236, 0x01a01e71, 0x002a43fb, 0x039f5cc2, 0x013127f4, 0x01f35f7f, 0x024411c4, 0x002f9a11}}, Y: Field{[10]uint32{0x026733da, 0x03eba160, 0x01f19a15, 0x030bf7ba, 0x017d78dd, 0x0273143a, 0x0395aaeb, 0x00da30b8, 0x0383c61d, 0x001e4a43}}}, + {X: Field{[10]uint32{0x03cbde9b, 0x00afedeb, 0x00e0c5c6, 0x007e4748, 0x0004ca42, 0x03b8061e, 0x021de709, 0x03d18d35, 0x03a09f34, 0x0011e2b0}}, Y: Field{[10]uint32{0x030988bf, 0x00dd955e, 0x01c34f6e, 0x012fddfb, 0x02e4bc7d, 0x015d2d7d, 0x027526f5, 0x0042586b, 0x03b2ccbc, 0x003dd4bc}}}, + {X: Field{[10]uint32{0x033dcfc8, 0x01905e63, 0x00796e70, 0x028301df, 0x037271a2, 0x026f5284, 0x00d7de9c, 0x01c6a675, 0x015af2ed, 0x001d17cd}}, Y: Field{[10]uint32{0x02e288b9, 0x010818e1, 0x01f6e672, 0x00998c31, 0x02d4fe88, 0x00c78664, 0x0105816c, 0x021fc27b, 0x01f46b0c, 0x00063a98}}}, + {X: Field{[10]uint32{0x02760ce0, 0x02d483a1, 0x014b218d, 0x0238e2ae, 0x00a3157a, 0x00a1909f, 0x01aede59, 0x02a2c242, 0x016f9878, 0x001539ef}}, Y: Field{[10]uint32{0x01fb8e49, 0x03493cc3, 0x03f2ddc1, 0x0294d034, 0x00e04bdb, 0x01d7702d, 0x033c6386, 0x02d12347, 0x000dc1ea, 0x0035edf6}}}, + {X: Field{[10]uint32{0x007d510e, 0x012807e8, 0x0120827e, 0x02b8f725, 0x0399b018, 0x0331bfaf, 0x006f5c7f, 0x010c7bcf, 0x03b655eb, 0x003fd5ab}}, Y: Field{[10]uint32{0x0191e371, 0x03a6d109, 0x03509655, 0x00403a89, 0x02ec7232, 0x01268a35, 0x00388b40, 0x02c71e7d, 0x01b842d7, 0x0026feaf}}}, + {X: Field{[10]uint32{0x029cda72, 0x00e7487f, 0x02be382d, 0x01057fcf, 0x00ea511b, 0x0363a9e4, 0x01d02506, 0x023f219e, 0x0099ed29, 0x0030af30}}, Y: Field{[10]uint32{0x030f971f, 0x03b2d614, 0x03070aa1, 0x03c163be, 0x00825de4, 0x00bf4e31, 0x02c31a58, 0x03ddcd6d, 0x02c435ec, 0x001b1efc}}}, + {X: Field{[10]uint32{0x00e2ec4e, 0x020061c2, 0x000f599a, 0x00da242e, 0x02c8549e, 0x0271a07f, 0x014b9a11, 0x00cc79b1, 0x01449811, 0x0008e0fc}}, Y: Field{[10]uint32{0x0133a1f9, 0x0182838d, 0x01cb1448, 0x00fa774d, 0x00d8fff0, 0x00111c3c, 0x00a999a7, 0x02dad64e, 0x011fd846, 0x0004ead0}}}, + {X: Field{[10]uint32{0x02096048, 0x01afc31b, 0x016b817d, 0x01ca2778, 0x0209953f, 0x0293d499, 0x0244584b, 0x00762fe2, 0x01c0d4fa, 0x000bc89c}}, Y: Field{[10]uint32{0x03b42fc4, 0x0182d80b, 0x00ab57cd, 0x00f69bc5, 0x03a95717, 0x00fbd54f, 0x0332c226, 0x0143a2db, 0x005db40e, 0x00191bbc}}}, + {X: Field{[10]uint32{0x01e951c7, 0x007c9a89, 0x01d089bf, 0x03682b69, 0x03809e7a, 0x02c047ba, 0x01be55cb, 0x01e89fbb, 0x031b0f06, 0x002ded26}}, Y: Field{[10]uint32{0x037c33ed, 0x037b8b1f, 0x033315b2, 0x00811641, 0x014a9b7f, 0x01f2c0ca, 0x02ec95c0, 0x001496b5, 0x00aca816, 0x003fb1d8}}}, + {X: Field{[10]uint32{0x01409223, 0x0206a979, 0x03557941, 0x032e7c2b, 0x027765d4, 0x00b6be07, 0x01866eb1, 0x00f9725c, 0x01cad993, 0x000db238}}, Y: Field{[10]uint32{0x008b8fdf, 0x0064cab7, 0x00853e29, 0x017d4926, 0x0122f2e3, 0x0045baa5, 0x01cc7309, 0x008a0b5c, 0x02d0a025, 0x002257ad}}}, + {X: Field{[10]uint32{0x001ed523, 0x01ef78ef, 0x00d6a6ee, 0x00455a13, 0x00fa5b8a, 0x0330ac38, 0x0173e018, 0x00d6484c, 0x01276328, 0x000f2fa4}}, Y: Field{[10]uint32{0x0244dc81, 0x03cc33f3, 0x03055e4d, 0x02cf4264, 0x01c5149a, 0x01d7c785, 0x030aa9dc, 0x01b26e65, 0x01c922f9, 0x001ecb4f}}}, + {X: Field{[10]uint32{0x0247213c, 0x01fa5ed8, 0x02d164e6, 0x02640c53, 0x02fe0aec, 0x022c8e79, 0x0048d380, 0x0250648d, 0x0141c463, 0x001dba53}}, Y: Field{[10]uint32{0x01fa1278, 0x03061ac8, 0x03cb5a3b, 0x0392fca0, 0x03f9efe4, 0x01d7e8e3, 0x03460bfd, 0x001d2440, 0x02c32f01, 0x0023b929}}}, + {X: Field{[10]uint32{0x031851ec, 0x03cd0cd2, 0x00c08506, 0x009e3bb0, 0x025b265d, 0x01ffa76e, 0x01749e00, 0x039f9e85, 0x01cb12c0, 0x00124e49}}, Y: Field{[10]uint32{0x0062b193, 0x02c5af13, 0x01a9a1f5, 0x003b6067, 0x02e4a240, 0x03dcc299, 0x02b318f9, 0x029195b2, 0x006b3960, 0x001c2403}}}, + {X: Field{[10]uint32{0x003cdcbf, 0x01cebb71, 0x026b7511, 0x01aaa7d7, 0x00387330, 0x01208f4e, 0x0020eb4a, 0x00e4f5e6, 0x02bad1a1, 0x002cdff6}}, Y: Field{[10]uint32{0x0327030a, 0x03b18203, 0x0252f28f, 0x03ca78d5, 0x03dfd325, 0x00c29d69, 0x00df67be, 0x0344e788, 0x00de57fa, 0x002141bc}}}, + {X: Field{[10]uint32{0x00a5e8c1, 0x027d296c, 0x007033c2, 0x008c271b, 0x008f2b70, 0x027e41c9, 0x030c90e0, 0x017124ca, 0x020c48e9, 0x00111465}}, Y: Field{[10]uint32{0x00d7490c, 0x006da1f5, 0x024de53b, 0x013efbd4, 0x0228bc40, 0x01dd9a93, 0x01c9e1a4, 0x027d9a58, 0x0218d9ce, 0x0020d54e}}}, + {X: Field{[10]uint32{0x03ea3449, 0x018ee037, 0x00704caf, 0x006f21a7, 0x00785772, 0x00fe61c6, 0x00ab20eb, 0x01a6e603, 0x01a8697c, 0x0026c2b0}}, Y: Field{[10]uint32{0x027e60e9, 0x0159877e, 0x0045d65b, 0x008c1cba, 0x0361b617, 0x00a02614, 0x0232a582, 0x02fcfdc7, 0x0053bf1b, 0x00084393}}}, + {X: Field{[10]uint32{0x001e0851, 0x01a12d1e, 0x01cebe92, 0x03e9f6f4, 0x0132eca4, 0x03003731, 0x02d62de1, 0x013df848, 0x0355ccae, 0x00399a5c}}, Y: Field{[10]uint32{0x01bdc3cb, 0x02e88dba, 0x01da1736, 0x024509ef, 0x029d3ded, 0x02201aa0, 0x00353f71, 0x03bcf251, 0x00ffdbe5, 0x0007c48b}}}, + {X: Field{[10]uint32{0x0167201e, 0x027c983c, 0x03f2afe3, 0x01387311, 0x03ad480a, 0x00a22eb1, 0x0326f861, 0x02932807, 0x00f11a1a, 0x003fea24}}, Y: Field{[10]uint32{0x01439cb4, 0x011272a1, 0x02b5d69d, 0x03682c06, 0x00ac569c, 0x01f43ba3, 0x03c41497, 0x03f0f51c, 0x03c41716, 0x0005a237}}}, + {X: Field{[10]uint32{0x00b6bf47, 0x02c6d3d5, 0x02c14cd3, 0x015e51b1, 0x00c41fcc, 0x03012813, 0x02b09b15, 0x00e33d8f, 0x00f26ce2, 0x00242235}}, Y: Field{[10]uint32{0x00d2c2b9, 0x00997579, 0x02909bfe, 0x0204adc3, 0x032ae4ec, 0x00f4d676, 0x01c9943b, 0x000138f5, 0x0017bc61, 0x00278e01}}}, + {X: Field{[10]uint32{0x01576a91, 0x0023ff36, 0x0070767c, 0x0288b00d, 0x0299949c, 0x00ca5af0, 0x03f7e5fe, 0x018383f9, 0x01dac1e7, 0x0028ce57}}, Y: Field{[10]uint32{0x012393d3, 0x025039d1, 0x038706ee, 0x00337800, 0x02314185, 0x00f7f3ee, 0x03070162, 0x01b45c5b, 0x039a5403, 0x0013e2a1}}}, + {X: Field{[10]uint32{0x038ad651, 0x0219e2ca, 0x00ecbd20, 0x0035d4cc, 0x011a7730, 0x007da1aa, 0x00ef2345, 0x03078163, 0x016454aa, 0x00047953}}, Y: Field{[10]uint32{0x01c020f2, 0x022ce5b2, 0x026796e0, 0x01164234, 0x01aaa53f, 0x0154a893, 0x0121dfef, 0x0067e715, 0x01605a84, 0x001d26ca}}}, + {X: Field{[10]uint32{0x00327f30, 0x02023f19, 0x0174675e, 0x036a3932, 0x0198f5f0, 0x031c074a, 0x02d5a707, 0x03a08aad, 0x00df7b41, 0x00323c4f}}, Y: Field{[10]uint32{0x03199404, 0x01a251f0, 0x0194d441, 0x02b75827, 0x00445d7a, 0x007cd3d8, 0x00329d6a, 0x0270737b, 0x01df17c0, 0x0012269a}}}, + {X: Field{[10]uint32{0x02d84442, 0x00f3dba4, 0x0250cd46, 0x02522897, 0x029487f3, 0x0386a770, 0x00c628c3, 0x0120e2a5, 0x02dccf67, 0x00245d79}}, Y: Field{[10]uint32{0x03de1c22, 0x002061a3, 0x007298cb, 0x00ec6e0f, 0x03c13e19, 0x01e329e9, 0x0237e510, 0x01c49547, 0x013fed37, 0x0021c15c}}}, + {X: Field{[10]uint32{0x0220099b, 0x018efd0d, 0x0209d228, 0x03b36c5e, 0x005df8b9, 0x014eb028, 0x038f6b89, 0x03c3a7b9, 0x012fb6d5, 0x0023bb52}}, Y: Field{[10]uint32{0x020ff1bf, 0x03a22747, 0x039d99ec, 0x03f41036, 0x0082e1ac, 0x0090e7b2, 0x00f8b946, 0x00ba6367, 0x03421767, 0x0008e915}}}, + {X: Field{[10]uint32{0x015c2dd9, 0x03e8d9c3, 0x03756beb, 0x02f1946d, 0x035cde90, 0x00417d75, 0x0393f543, 0x001bbde5, 0x0223dbac, 0x0032e573}}, Y: Field{[10]uint32{0x024a9a48, 0x022f9785, 0x02a4fc61, 0x01d3dfb3, 0x0057d22d, 0x01c777ad, 0x035ed992, 0x02c301ce, 0x02bac023, 0x002584a9}}}, + {X: Field{[10]uint32{0x03a3c980, 0x02b24199, 0x007c915d, 0x024e7391, 0x01d8fdd4, 0x02d69de4, 0x02a8ebf8, 0x03fcdf50, 0x00c8bbd3, 0x00199c86}}, Y: Field{[10]uint32{0x00ec26c0, 0x02020f23, 0x00f2ace9, 0x039c19d4, 0x00452a21, 0x00156d55, 0x0344aab1, 0x02bf751a, 0x01799e19, 0x00375004}}}, + {X: Field{[10]uint32{0x02f76e5f, 0x0166be0c, 0x0385219b, 0x02d683b4, 0x000c7627, 0x0310a5a6, 0x013e855d, 0x01214739, 0x01c60ded, 0x002211e6}}, Y: Field{[10]uint32{0x021c4a6b, 0x036998b0, 0x005ac3af, 0x01dff33c, 0x0022e343, 0x014b379e, 0x00d2d371, 0x010231e7, 0x01ed84e6, 0x0008e35d}}}, + {X: Field{[10]uint32{0x0111d143, 0x03bbab5a, 0x0396a256, 0x0240e9af, 0x022cc8bb, 0x0093a9b4, 0x03a05bae, 0x0020b165, 0x036b5fc0, 0x0023663c}}, Y: Field{[10]uint32{0x00ab3cd3, 0x035ece38, 0x01516f2a, 0x00c6c770, 0x03de7df9, 0x0005a05d, 0x01b2fcf8, 0x00a9b541, 0x011afc90, 0x0009ba2b}}}, + {X: Field{[10]uint32{0x03d70ad2, 0x00fd2e0f, 0x001ae740, 0x0223219d, 0x03d1db23, 0x034bbec7, 0x032cbc28, 0x031b4c9f, 0x02cac0dd, 0x002ea418}}, Y: Field{[10]uint32{0x028b38c2, 0x012ec299, 0x019f78f2, 0x03f5edcf, 0x01674539, 0x00e05115, 0x0171ccd5, 0x039d5367, 0x035b3036, 0x0011cecc}}}, + {X: Field{[10]uint32{0x02cdca29, 0x007700c2, 0x008f01ff, 0x014c478a, 0x017453ca, 0x01588414, 0x029be675, 0x039825e9, 0x02d73bf0, 0x00128b4d}}, Y: Field{[10]uint32{0x02ca8f83, 0x0290e1ac, 0x001d8595, 0x0205236c, 0x029d694a, 0x00a63d7e, 0x0283ac6c, 0x00c73513, 0x01e7a903, 0x0003fda4}}}, + {X: Field{[10]uint32{0x0337d0c4, 0x018b8773, 0x01c4fcd3, 0x00db8015, 0x006b3651, 0x00b0c972, 0x00fb0d93, 0x012c5ad9, 0x028fd99c, 0x003a1a3c}}, Y: Field{[10]uint32{0x00d4a9eb, 0x00ab7b13, 0x00bca274, 0x0044df65, 0x0240e5fa, 0x02224426, 0x00e0440e, 0x0040d23a, 0x02c18340, 0x002b4cd1}}}, + {X: Field{[10]uint32{0x03abbf3b, 0x028d464a, 0x03eea99d, 0x025b6903, 0x03ea77e6, 0x0088e60c, 0x0177e566, 0x01b2944b, 0x0289830a, 0x001b17a1}}, Y: Field{[10]uint32{0x01779540, 0x03a5196b, 0x017c12be, 0x00351a96, 0x0356b983, 0x01d4d91f, 0x01c333dd, 0x002d81ef, 0x01f15fd0, 0x0030a781}}}, + {X: Field{[10]uint32{0x00046344, 0x0096fb07, 0x02210e1a, 0x0318942b, 0x01c317ad, 0x02e756a4, 0x0391cc86, 0x00b7feba, 0x02a56ebf, 0x002ce85c}}, Y: Field{[10]uint32{0x034ac3d5, 0x017ebe0e, 0x01d119fc, 0x030379e9, 0x02f06401, 0x026930be, 0x031fff90, 0x0035b6f4, 0x01799ae4, 0x000a3db7}}}, + {X: Field{[10]uint32{0x000d8f47, 0x02a53884, 0x02b80091, 0x03b1c68e, 0x00ac4a22, 0x0251a2a3, 0x00aed673, 0x035de694, 0x01d2e2f9, 0x000663c1}}, Y: Field{[10]uint32{0x03cd0414, 0x0226782d, 0x002b3cbf, 0x01a0d830, 0x03397089, 0x00ff2c88, 0x02e3baaf, 0x00c5cf2b, 0x003fc981, 0x00331a86}}}, + {X: Field{[10]uint32{0x0077f48e, 0x03d42aac, 0x039d89f0, 0x036de7f0, 0x0341ae77, 0x02142c1e, 0x007703ae, 0x029e452f, 0x038fa943, 0x001e2c85}}, Y: Field{[10]uint32{0x025274e7, 0x0272c558, 0x02beb11b, 0x03b30a7a, 0x01d78fce, 0x006006f8, 0x0389004e, 0x02c24a2e, 0x0234f2cb, 0x00217f4f}}}, + {X: Field{[10]uint32{0x01943f3e, 0x010fee36, 0x02dcccec, 0x03e757dc, 0x0023828e, 0x01c38a29, 0x017a7951, 0x0145d7e6, 0x03001d4c, 0x001bdc37}}, Y: Field{[10]uint32{0x028315ce, 0x007bb733, 0x03ee5f0f, 0x030aa37e, 0x02956a66, 0x01cc38a9, 0x039c34be, 0x020f9165, 0x0213b771, 0x00098c54}}}, + {X: Field{[10]uint32{0x01a9dccc, 0x030d676d, 0x03bd09cf, 0x00b47343, 0x02e3964b, 0x0116d649, 0x01509e3b, 0x01b4a741, 0x01443c94, 0x002ae04c}}, Y: Field{[10]uint32{0x00f5c5ac, 0x00db2a41, 0x01062063, 0x002cfd41, 0x0216b771, 0x031b184c, 0x005e5876, 0x01cebe83, 0x03150c12, 0x002baf7c}}}, + {X: Field{[10]uint32{0x01473ad3, 0x03a20f81, 0x021a20a3, 0x027ae8cc, 0x016b9456, 0x01f979bb, 0x0323e627, 0x00449c8d, 0x0391dd75, 0x0039cacd}}, Y: Field{[10]uint32{0x0328a3d8, 0x03d320a6, 0x0319fd4d, 0x02b220c2, 0x039c2091, 0x038e8a11, 0x03109ab5, 0x02aa83f4, 0x00742dbc, 0x0004c6cc}}}, + {X: Field{[10]uint32{0x023ded63, 0x00a10cb3, 0x00c74619, 0x01f15ad4, 0x02bb525d, 0x033141f6, 0x03df77af, 0x017940e3, 0x0296ecdd, 0x0032968c}}, Y: Field{[10]uint32{0x03c4ab9e, 0x0197f1bf, 0x0254b3f8, 0x0274af73, 0x005a1420, 0x00acd96f, 0x027258e4, 0x01deea40, 0x0394b7e1, 0x0022f6d9}}}, + {X: Field{[10]uint32{0x031a9222, 0x0069c038, 0x01819c88, 0x00569c9a, 0x02e7d2e8, 0x0300ec80, 0x01be59dc, 0x0233ff3b, 0x029f26ae, 0x003aa8ef}}, Y: Field{[10]uint32{0x0124ec1c, 0x03917065, 0x02acc735, 0x0059f35f, 0x0336ac28, 0x0077cb4e, 0x02f80265, 0x034d3183, 0x00d7a367, 0x0006d68b}}}, + {X: Field{[10]uint32{0x00e97728, 0x02c0f7ba, 0x02206582, 0x0399d21c, 0x0035a011, 0x019e4555, 0x022076d5, 0x03fdab85, 0x002d3ab4, 0x003aeea2}}, Y: Field{[10]uint32{0x01be16ac, 0x02f91d19, 0x010ed355, 0x0161ef7f, 0x018a004c, 0x027b6319, 0x02f2ac76, 0x034b3736, 0x02053d8d, 0x0025088a}}}, + {X: Field{[10]uint32{0x013aba86, 0x0248f20d, 0x01f446d8, 0x0345a3a3, 0x01ba88e0, 0x03688180, 0x03cb784e, 0x01774451, 0x03ea537a, 0x00328365}}, Y: Field{[10]uint32{0x028fba1f, 0x01f2a67d, 0x01b68016, 0x024a1d2d, 0x0196c978, 0x01124399, 0x02bb979a, 0x021bc623, 0x005889eb, 0x0021d2b2}}}, + {X: Field{[10]uint32{0x03b797e1, 0x0233ecfa, 0x01a24771, 0x002c3877, 0x0184a90a, 0x017f0671, 0x0398f98c, 0x01d151f9, 0x01653480, 0x0014778a}}, Y: Field{[10]uint32{0x03f7c54d, 0x03bfd600, 0x007bf87c, 0x012e6792, 0x03ace0ee, 0x03f37e69, 0x001952b0, 0x039ae557, 0x023aad04, 0x00204dd3}}}, + {X: Field{[10]uint32{0x01387509, 0x031bb230, 0x00df5151, 0x00d4d96e, 0x0287b521, 0x007523ed, 0x00e39bda, 0x01af8833, 0x011f0313, 0x0001a758}}, Y: Field{[10]uint32{0x0195bde0, 0x028b088c, 0x01fa7e9d, 0x02a9ac9c, 0x00fb84c0, 0x0170a5c8, 0x01127e1a, 0x01932b13, 0x0020563b, 0x001d78b6}}}, + {X: Field{[10]uint32{0x028aa135, 0x015f784e, 0x00a9cb2f, 0x03037914, 0x006fa4a4, 0x03737886, 0x02204561, 0x01983c8c, 0x00830558, 0x000c458c}}, Y: Field{[10]uint32{0x0346eae2, 0x0376fdbf, 0x03817539, 0x001f97ee, 0x0229e142, 0x038762dd, 0x008c636a, 0x005a20c0, 0x0096b134, 0x000975b5}}}, + {X: Field{[10]uint32{0x007ac334, 0x0335584b, 0x00274cc3, 0x00f61a13, 0x0111f462, 0x0342b66a, 0x002e5b44, 0x03353536, 0x02aaefa9, 0x002138d0}}, Y: Field{[10]uint32{0x0292a70e, 0x023d980a, 0x016540fb, 0x03ed42bb, 0x02f552af, 0x03f974bd, 0x00f0a324, 0x02665f21, 0x03ff260f, 0x003ee436}}}, + {X: Field{[10]uint32{0x03bf6562, 0x0199a499, 0x025bc64d, 0x02b2219e, 0x00fa812a, 0x03538ea8, 0x00468143, 0x02c45489, 0x0002969d, 0x00257bf1}}, Y: Field{[10]uint32{0x03371883, 0x0304d667, 0x034b3e82, 0x027f5dea, 0x02e4567d, 0x0114957e, 0x033f00d4, 0x0094b15b, 0x00316149, 0x000c56f3}}}, + {X: Field{[10]uint32{0x038d07fe, 0x01727a35, 0x01507e3d, 0x0126ed40, 0x0255b401, 0x0156ee6f, 0x0289993a, 0x027682f4, 0x023cf87e, 0x001488d8}}, Y: Field{[10]uint32{0x00613b56, 0x02023f2b, 0x03deffa5, 0x00876cf2, 0x000832e9, 0x0001dbe2, 0x01b1c16b, 0x03d0dc02, 0x0221dd2d, 0x001aff42}}}, + {X: Field{[10]uint32{0x00cb0a4f, 0x0132e5f0, 0x0255df5f, 0x00659ac2, 0x00ea180f, 0x0027845e, 0x0187ab31, 0x01c1f987, 0x01990a6b, 0x003c84b4}}, Y: Field{[10]uint32{0x00f7c84b, 0x01ac1a68, 0x0382412f, 0x008867b0, 0x037f5114, 0x0303a844, 0x03c31427, 0x02d93b91, 0x006c7edb, 0x000ca011}}}, + {X: Field{[10]uint32{0x01cfe8c9, 0x033d630c, 0x01b50835, 0x03888438, 0x02e1e19c, 0x000163e5, 0x014431b2, 0x01dbe085, 0x023ff25d, 0x001ad541}}, Y: Field{[10]uint32{0x0069f8bf, 0x002236a4, 0x031c6492, 0x028f75f8, 0x01558a82, 0x03d83ffb, 0x02997076, 0x001d891b, 0x01623645, 0x001509f7}}}, + {X: Field{[10]uint32{0x01b23045, 0x006755c2, 0x01e96472, 0x0106a0b8, 0x03c9388d, 0x039be2c9, 0x02e0c129, 0x0243004a, 0x01cfa096, 0x00094e79}}, Y: Field{[10]uint32{0x01021ac3, 0x0115eb76, 0x0224a77c, 0x02d28967, 0x0331d804, 0x01444cd1, 0x0393000e, 0x02937346, 0x03f61e26, 0x002532e0}}}, + {X: Field{[10]uint32{0x0247d51d, 0x03eb9502, 0x03fb6297, 0x007bc394, 0x03910642, 0x03ca30fd, 0x02ed31e8, 0x0070c1c6, 0x02d34aaf, 0x002aa6da}}, Y: Field{[10]uint32{0x03544c47, 0x02779de0, 0x03d3ed1c, 0x01fb2910, 0x0158cbd8, 0x002ad366, 0x034e7db1, 0x02b80262, 0x00e49fe4, 0x00370256}}}, + {X: Field{[10]uint32{0x013487ad, 0x014cbd80, 0x0262f780, 0x0397a728, 0x03e08964, 0x028fdac3, 0x02d6e635, 0x0093efd7, 0x0313aad2, 0x002a1428}}, Y: Field{[10]uint32{0x014ccbe7, 0x020cd8fb, 0x01a4c43b, 0x01c09bc5, 0x01d9a5e5, 0x03bbcd1e, 0x01708ca0, 0x015708ee, 0x02d54cbc, 0x001f91da}}}, + {X: Field{[10]uint32{0x03a09c1a, 0x02352b97, 0x0328c741, 0x00c991de, 0x025da441, 0x00638a74, 0x00889fab, 0x00325b41, 0x0033f4fd, 0x000c53fb}}, Y: Field{[10]uint32{0x03d25f42, 0x01ee53fa, 0x024a976b, 0x034c6a9a, 0x00d9b4b8, 0x0254d3f7, 0x01dd4f54, 0x03fede6d, 0x01130a98, 0x00028b25}}}, + {X: Field{[10]uint32{0x033d0963, 0x02be8d53, 0x01c85329, 0x02e33d4b, 0x03183998, 0x02bef73b, 0x01581ae1, 0x01f9e6b8, 0x03c89ec5, 0x001b9f70}}, Y: Field{[10]uint32{0x019f87d8, 0x01457e27, 0x00964a83, 0x00c3f32b, 0x038f0578, 0x01662ac6, 0x011e3a82, 0x023a7e59, 0x00056d5a, 0x001ad8da}}}, + {X: Field{[10]uint32{0x033337c5, 0x01f50015, 0x034ad955, 0x03016309, 0x0038b6cf, 0x03461071, 0x0097a507, 0x028b5481, 0x0293fc4b, 0x00165b7d}}, Y: Field{[10]uint32{0x037f4ff5, 0x00ff412c, 0x033c6bd0, 0x00cf5732, 0x0274b75c, 0x027b173f, 0x0171723e, 0x02c26ce8, 0x01e91c97, 0x0019827b}}}, + {X: Field{[10]uint32{0x00e8afb7, 0x03c28485, 0x034ee13c, 0x01665ef2, 0x00ee3ba2, 0x01ef50b5, 0x0150e8e7, 0x01e00161, 0x01d410de, 0x0008d7e3}}, Y: Field{[10]uint32{0x00fa6712, 0x038562db, 0x031bd189, 0x00ce092d, 0x0153b72c, 0x00429115, 0x00f8d595, 0x0384da00, 0x00cdb8e8, 0x002fdb83}}}, + {X: Field{[10]uint32{0x03db8b47, 0x027308c4, 0x0227904c, 0x01abbda4, 0x003f0390, 0x0203a07c, 0x01fbb28c, 0x03a47c49, 0x0297b259, 0x002a762e}}, Y: Field{[10]uint32{0x00048656, 0x01d52b3b, 0x0337bf14, 0x03d916e9, 0x015e6ce6, 0x0087d625, 0x0072afe2, 0x0203c99d, 0x015419b5, 0x00399a2e}}}, + {X: Field{[10]uint32{0x02288e5c, 0x02c1fa12, 0x027f4827, 0x00d6df66, 0x00c4e2cc, 0x004d26e2, 0x02bc6295, 0x0305c050, 0x01c64f74, 0x0014ed13}}, Y: Field{[10]uint32{0x017075d4, 0x01b855c2, 0x02c7e589, 0x021f6325, 0x02322161, 0x03fb9ed6, 0x03006ead, 0x018b1363, 0x03e14045, 0x0012bfc4}}}, + {X: Field{[10]uint32{0x000af1a0, 0x02d68096, 0x0362f947, 0x01e4121b, 0x02a91872, 0x0125121a, 0x00b56ca1, 0x03e7dc6b, 0x0038a6ba, 0x001db9b8}}, Y: Field{[10]uint32{0x01f0f0fa, 0x039ad378, 0x03fd4465, 0x035c899b, 0x003b57e0, 0x03811644, 0x0018348b, 0x0101d913, 0x01106688, 0x00146974}}}, + {X: Field{[10]uint32{0x03c1e6b5, 0x03d4efe6, 0x038702bc, 0x031c6fb1, 0x001c45b4, 0x037a192f, 0x02da284d, 0x0004a443, 0x03192fc7, 0x001dd87f}}, Y: Field{[10]uint32{0x016e11b2, 0x01f6b10a, 0x007c1d94, 0x032ec6ad, 0x03e0bb75, 0x030f9f4d, 0x037e1fdf, 0x01c65987, 0x0370a82f, 0x00202603}}}, + {X: Field{[10]uint32{0x009aadf9, 0x034a012a, 0x02d7f8fe, 0x02388434, 0x0095c0bd, 0x021a7618, 0x01cdc333, 0x03d47f9b, 0x01d61224, 0x00206672}}, Y: Field{[10]uint32{0x031ec89b, 0x038c15d2, 0x0292ddaa, 0x01f4aa74, 0x00a158ee, 0x000c371d, 0x01bbd73f, 0x008e12ba, 0x024f5cbd, 0x002fa25c}}}, + {X: Field{[10]uint32{0x01c55c0e, 0x009d0164, 0x033b799d, 0x032f9422, 0x0008bd4d, 0x02f5de76, 0x01626803, 0x00955aef, 0x01fc760a, 0x0005709e}}, Y: Field{[10]uint32{0x03390c39, 0x00f934d4, 0x01dee337, 0x02c19c85, 0x010ea0b9, 0x0328103f, 0x015d352b, 0x03258d24, 0x00bfed80, 0x003f540e}}}, + {X: Field{[10]uint32{0x00a39b46, 0x0045857e, 0x031a83c1, 0x03900520, 0x019724ac, 0x0330b9fb, 0x03b46a3e, 0x01011dbd, 0x0106b280, 0x003ecfe3}}, Y: Field{[10]uint32{0x03d2154e, 0x03ecf3da, 0x011854fb, 0x0142b264, 0x023177ed, 0x00f06f5c, 0x03fd70c6, 0x006d84ec, 0x00b6ff85, 0x003e4943}}}, + {X: Field{[10]uint32{0x02012edb, 0x03269bae, 0x0389b5ea, 0x00576c2c, 0x02f9faf4, 0x025f0ff7, 0x02723e30, 0x01049768, 0x01473c96, 0x000e6cad}}, Y: Field{[10]uint32{0x03fb7547, 0x0220bc86, 0x01564002, 0x02b8377e, 0x016bce7b, 0x03d97c8c, 0x028aedf1, 0x03d04ef5, 0x02a5a586, 0x0022b070}}}, + {X: Field{[10]uint32{0x03f1552b, 0x03fd1291, 0x0284820c, 0x00fab21f, 0x01bf72d7, 0x02c93a33, 0x03f6d0bb, 0x00546874, 0x03fae476, 0x0010b577}}, Y: Field{[10]uint32{0x00847ee4, 0x03eb6d2e, 0x02ee2922, 0x01185f61, 0x02663f6e, 0x0100ef3d, 0x03ebe3af, 0x03000589, 0x0245d941, 0x0018c765}}}, + {X: Field{[10]uint32{0x02e0bd8f, 0x007edeb9, 0x02158e31, 0x0349b671, 0x02630a0b, 0x03a48b66, 0x02dd0711, 0x02afc297, 0x02c624ec, 0x00213725}}, Y: Field{[10]uint32{0x038703c6, 0x023ab8fb, 0x025a82cc, 0x01c4302a, 0x01c795cc, 0x02f4bf09, 0x00ff10a8, 0x00c934ab, 0x018a16b7, 0x00102bcc}}}, + {X: Field{[10]uint32{0x03bf505e, 0x01ce60d2, 0x013bf018, 0x000b0db6, 0x034663ba, 0x01efdf2e, 0x03812af3, 0x033bb846, 0x020a797b, 0x0018db9d}}, Y: Field{[10]uint32{0x01f724d2, 0x03dc0e99, 0x012ffd74, 0x010015f6, 0x0069924f, 0x0012e516, 0x02dab981, 0x033dd90d, 0x024b6cc8, 0x003b5717}}}, + {X: Field{[10]uint32{0x00d06ae4, 0x03dd6026, 0x01090d4f, 0x003fd85d, 0x007d32bc, 0x0389e019, 0x01ca6f4a, 0x03b9e19a, 0x00254bb5, 0x0004dff4}}, Y: Field{[10]uint32{0x028d0fd4, 0x02dfc24c, 0x00bc808f, 0x00f7a739, 0x03e07ec2, 0x00dba4b9, 0x03186a30, 0x02aa83a6, 0x02a225ea, 0x000a0b5a}}}, + {X: Field{[10]uint32{0x02459e92, 0x01cd3484, 0x00b611b6, 0x01805eaf, 0x00df781f, 0x02c943f0, 0x01bc7a5c, 0x02495ad5, 0x004839e4, 0x000862ae}}, Y: Field{[10]uint32{0x010e1599, 0x012cf393, 0x02444c99, 0x03f1c072, 0x001a7212, 0x00cbce7c, 0x00c49c8d, 0x02c3710c, 0x0356b53f, 0x001fac53}}}, + {X: Field{[10]uint32{0x038eda65, 0x00552557, 0x034fb619, 0x0267aed3, 0x011b2f0a, 0x03c4dd81, 0x029e3a78, 0x008be37d, 0x03a0106f, 0x001acfde}}, Y: Field{[10]uint32{0x0330d299, 0x03ededc8, 0x013b7aaa, 0x000174db, 0x036c8310, 0x0207a21c, 0x019a4ab4, 0x01afbe1b, 0x00c44c94, 0x000315e2}}}, + {X: Field{[10]uint32{0x01e8ceca, 0x038c7f76, 0x03d08c5d, 0x032bdffb, 0x02131ad1, 0x00bad6e1, 0x02fdf196, 0x00465465, 0x02cba2de, 0x0026d053}}, Y: Field{[10]uint32{0x0325a637, 0x024897a9, 0x00797063, 0x0216579d, 0x0251e94e, 0x036a7d39, 0x01b06269, 0x037d0203, 0x031f9550, 0x000e39bc}}}, + {X: Field{[10]uint32{0x02940653, 0x03d986c9, 0x01f8ecba, 0x023bcfcb, 0x02156a4a, 0x00751135, 0x0133af0d, 0x0097861a, 0x03a18574, 0x0010dac1}}, Y: Field{[10]uint32{0x003f2d44, 0x0156cc51, 0x0053ace1, 0x0346f393, 0x03c6822d, 0x0093f318, 0x02427137, 0x03af7b29, 0x0335f124, 0x0025294b}}}, + {X: Field{[10]uint32{0x028fbc6b, 0x00cb3544, 0x034d1fff, 0x00a08266, 0x00b8d76f, 0x01ed78a4, 0x0019bd18, 0x017e08cd, 0x033809b2, 0x003302a4}}, Y: Field{[10]uint32{0x023f458e, 0x02ffa1db, 0x029ec220, 0x01e90c3b, 0x00e713ad, 0x01d54038, 0x00cb6278, 0x031ea512, 0x006dec7a, 0x000331fa}}}, + {X: Field{[10]uint32{0x03a19858, 0x007fa0f0, 0x038888f2, 0x03a9cbef, 0x037ea684, 0x02be372a, 0x03b1907e, 0x01debf31, 0x016eaaf8, 0x001686cc}}, Y: Field{[10]uint32{0x0181e7e1, 0x010933b3, 0x00450cf7, 0x02508b6f, 0x02744110, 0x029a504b, 0x02b3466d, 0x0211a9ad, 0x039ada08, 0x0012bc0c}}}, + {X: Field{[10]uint32{0x016c53ee, 0x01f5025b, 0x0327400e, 0x0094be7f, 0x01ac4a57, 0x000e62c9, 0x021e4114, 0x012ec87f, 0x01657444, 0x003ebe24}}, Y: Field{[10]uint32{0x01a43100, 0x0053db26, 0x03cb3997, 0x02b20420, 0x01d87984, 0x02c5b271, 0x00b64263, 0x0151fd77, 0x015faf75, 0x0033e9de}}}, + {X: Field{[10]uint32{0x0174f248, 0x03937ab4, 0x01e33aa9, 0x00b52586, 0x00c94cd2, 0x031b2c0a, 0x000c68c6, 0x00588c61, 0x018aca14, 0x000e797f}}, Y: Field{[10]uint32{0x003c1ff1, 0x00429be3, 0x0210561d, 0x02194a2a, 0x020a8d36, 0x023d989d, 0x0013e788, 0x036995d0, 0x03657083, 0x003e0487}}}, + {X: Field{[10]uint32{0x0325cbc1, 0x010c2600, 0x000e9257, 0x0350866f, 0x02a64b8e, 0x03ef84d5, 0x013cddf6, 0x0033cb33, 0x01ec147d, 0x0008284d}}, Y: Field{[10]uint32{0x0282c013, 0x008ab9bb, 0x006a7156, 0x002a047c, 0x01fa1d17, 0x01d74c2a, 0x0101fd26, 0x00dc9530, 0x00abea1a, 0x002c5d45}}}, + {X: Field{[10]uint32{0x0072320a, 0x0070ad0b, 0x011fab46, 0x00462a21, 0x039903ca, 0x031d6c4e, 0x03d69e2a, 0x03dcfe84, 0x01b8af48, 0x00286068}}, Y: Field{[10]uint32{0x03a6df20, 0x03212ca5, 0x02a5a219, 0x00e8310e, 0x00a66fbd, 0x035621e8, 0x032c432a, 0x01f988f5, 0x00673f48, 0x00325b21}}}, + {X: Field{[10]uint32{0x01b3ee4f, 0x0118b1df, 0x03fc2752, 0x02557ae1, 0x01eb4626, 0x0145b7a3, 0x035d76a9, 0x01768beb, 0x0031720a, 0x000e57f0}}, Y: Field{[10]uint32{0x0359ad6a, 0x022fd071, 0x00523128, 0x01a66cd0, 0x00962ac8, 0x00fb1127, 0x00e14e7c, 0x00e256ad, 0x006b5378, 0x0012baf2}}}, + {X: Field{[10]uint32{0x0364fa6f, 0x01accf46, 0x03d17424, 0x0395c6e7, 0x0103fffc, 0x02ed8cdf, 0x01632a61, 0x00ae5a1f, 0x01ecf6df, 0x0028db7a}}, Y: Field{[10]uint32{0x011999f4, 0x03721899, 0x01ea9cdb, 0x027f43c1, 0x01620fe2, 0x01f7ad03, 0x0212e147, 0x0345006c, 0x004fa133, 0x001e1393}}}, + {X: Field{[10]uint32{0x0040ba8c, 0x01d1b8a6, 0x00359d04, 0x02e0f6f7, 0x03e55a3a, 0x0114d7d5, 0x03818200, 0x0110c3dc, 0x0099ecee, 0x00232d6a}}, Y: Field{[10]uint32{0x017ff59a, 0x03697780, 0x00b2cb92, 0x02c7bc0b, 0x01731ded, 0x00f4a2d3, 0x01df0ecc, 0x028f04b0, 0x002ae9c3, 0x0004a9ca}}}, + {X: Field{[10]uint32{0x00b60985, 0x0142d998, 0x01f299c4, 0x0362c9ac, 0x004cee72, 0x00bf47ef, 0x02372012, 0x026e8643, 0x01e14d9c, 0x00037910}}, Y: Field{[10]uint32{0x0271b63e, 0x03884500, 0x02110508, 0x0319d40c, 0x022927b3, 0x009fefad, 0x03740d44, 0x0374cf53, 0x030ed12d, 0x002b7468}}}, + {X: Field{[10]uint32{0x039fbab7, 0x02081ea6, 0x01067407, 0x030e5ca5, 0x00520646, 0x004a3446, 0x02f3c1b7, 0x0151283c, 0x0356b5e5, 0x002238e2}}, Y: Field{[10]uint32{0x0000e5e3, 0x00763984, 0x034b7810, 0x00828b63, 0x00dc8ea0, 0x02f6bc61, 0x03ac529c, 0x02595b96, 0x008ed44e, 0x00220cc8}}}, + {X: Field{[10]uint32{0x034640a7, 0x03ccdd03, 0x0266c6c5, 0x032583d4, 0x013ee217, 0x0234b5ca, 0x03fa3d15, 0x019082e7, 0x0192f561, 0x00293c3e}}, Y: Field{[10]uint32{0x002e6ddb, 0x0038807e, 0x01e713d8, 0x023a04a2, 0x010b131a, 0x006bd0bf, 0x02c9188a, 0x021af103, 0x01a8437a, 0x003699d0}}}, + {X: Field{[10]uint32{0x005c945b, 0x014901c7, 0x02ad7efe, 0x02fcdfe5, 0x0286899f, 0x01147634, 0x00a40bee, 0x02aab981, 0x00cff2d1, 0x0017c02a}}, Y: Field{[10]uint32{0x019deb12, 0x02d8f4ad, 0x0262a424, 0x034eb9b1, 0x030b48ea, 0x011a4b56, 0x011549fb, 0x01b5b8e7, 0x00b69ea7, 0x0004d7f2}}}, + {X: Field{[10]uint32{0x00f99218, 0x01b38c62, 0x00da0b41, 0x019ea79b, 0x039d1689, 0x00e376e3, 0x004c7998, 0x03f28bb8, 0x020ebfd6, 0x00164d46}}, Y: Field{[10]uint32{0x010fdb34, 0x00f53a75, 0x025b64fe, 0x0275ce91, 0x000fc415, 0x00a479f2, 0x0227b6d4, 0x03d2a0a3, 0x02673184, 0x001b8068}}}, + {X: Field{[10]uint32{0x00b1aecf, 0x025be44b, 0x039f72c7, 0x01cf9dfc, 0x006705ef, 0x03c98f43, 0x007387a5, 0x00cecf7a, 0x0235f5c5, 0x00005d7b}}, Y: Field{[10]uint32{0x01d9513f, 0x0340a02e, 0x03506a80, 0x018cf35e, 0x005fca3b, 0x0317ef58, 0x00d40fc4, 0x03909878, 0x03154540, 0x0028de49}}}, + {X: Field{[10]uint32{0x0347b8fe, 0x01f7eefc, 0x033b0204, 0x0077eb40, 0x00565595, 0x01e416b5, 0x036362fa, 0x0062b26a, 0x0341597b, 0x001d4626}}, Y: Field{[10]uint32{0x01b2527e, 0x01deddc8, 0x03ed5b01, 0x010a116b, 0x01aa2468, 0x015a967b, 0x00023de2, 0x0043a95f, 0x01210ffa, 0x003d4dbf}}}, + {X: Field{[10]uint32{0x019bd4ae, 0x02690528, 0x01c72004, 0x01cdad68, 0x02438855, 0x01fbf48e, 0x03d2a315, 0x035971c2, 0x02c32522, 0x00246be7}}, Y: Field{[10]uint32{0x001a32de, 0x01aec21d, 0x02d6e643, 0x00668b29, 0x0331c9cc, 0x002d1066, 0x004898ed, 0x02e161ad, 0x03c38462, 0x000c4801}}}, + {X: Field{[10]uint32{0x00565c27, 0x02876129, 0x01b04712, 0x02906853, 0x00732273, 0x03ca0f17, 0x01094432, 0x03574174, 0x008d41fa, 0x00376cbf}}, Y: Field{[10]uint32{0x029c1d0a, 0x02e8beb5, 0x01a38d63, 0x02db5fcb, 0x028f6ac9, 0x0224f424, 0x01673a09, 0x031bd080, 0x00c502ce, 0x0013df8c}}}, + {X: Field{[10]uint32{0x023641a6, 0x037077fd, 0x00f96f7d, 0x001fcac1, 0x01ad40a9, 0x0290494e, 0x0144936e, 0x00370d40, 0x0122d724, 0x00273997}}, Y: Field{[10]uint32{0x01d97c8c, 0x009d825e, 0x02340cf9, 0x010e0150, 0x00c3037e, 0x01818bd5, 0x020b4257, 0x02f19091, 0x01877f25, 0x002be4f9}}}, + {X: Field{[10]uint32{0x036e9a2b, 0x01b5dbdd, 0x015f5493, 0x02c079fe, 0x015489f1, 0x002fd24b, 0x003932eb, 0x03b16247, 0x00d41fed, 0x001f7034}}, Y: Field{[10]uint32{0x0107c47a, 0x01a6656c, 0x0134fa52, 0x03d694d6, 0x001e9bbc, 0x00e0c685, 0x021c7a49, 0x00f04efe, 0x039e760c, 0x00355689}}}, + {X: Field{[10]uint32{0x000e5ead, 0x000ea553, 0x008c163d, 0x003cca07, 0x02f190d4, 0x00f92a9f, 0x018d351f, 0x035ca277, 0x015cb6b4, 0x00034048}}, Y: Field{[10]uint32{0x00fdc662, 0x00b2206c, 0x02a2548b, 0x0318267b, 0x01c68be6, 0x01906153, 0x03ce7fe0, 0x01fbb9c8, 0x004bccbd, 0x003be60d}}}, + {X: Field{[10]uint32{0x017cb92f, 0x0019d9e3, 0x02af3e1d, 0x0318a4cf, 0x00bb6498, 0x02f7fcf5, 0x011b0d29, 0x03be3d66, 0x0031a9fa, 0x00035347}}, Y: Field{[10]uint32{0x026a4831, 0x017e18ab, 0x0190a4df, 0x036e93d9, 0x02715fae, 0x00861791, 0x03ccd42f, 0x0247ea16, 0x0048ac6b, 0x00263cea}}}, + {X: Field{[10]uint32{0x02080839, 0x034bc931, 0x035a49fa, 0x00310686, 0x023d718f, 0x0212c78c, 0x022d83c0, 0x03c930f6, 0x02cf42ab, 0x00331967}}, Y: Field{[10]uint32{0x001f963c, 0x009d86b2, 0x00cbbf0f, 0x0250fe13, 0x00c7aef0, 0x039e55d6, 0x02df249a, 0x00ce66db, 0x01554d84, 0x001eef7f}}}, + {X: Field{[10]uint32{0x01ea4b04, 0x0345905c, 0x0104e594, 0x01d59c23, 0x00f0eb47, 0x01e2fbcd, 0x0074e944, 0x03ce1674, 0x0167d5cf, 0x00066e85}}, Y: Field{[10]uint32{0x02820f9a, 0x014d2152, 0x00ed5d4f, 0x024722e4, 0x0030555c, 0x03967044, 0x00583114, 0x02c0bb6a, 0x001bd536, 0x000d3a8a}}}, + {X: Field{[10]uint32{0x03bbc30f, 0x01e63d75, 0x006a5437, 0x039d4a56, 0x02e825d8, 0x0354b4b6, 0x01960e5f, 0x01641d8c, 0x02e31a6e, 0x000fc3c0}}, Y: Field{[10]uint32{0x03e63c3b, 0x00241878, 0x0119a035, 0x00a5ed01, 0x0162a3bf, 0x038b35a9, 0x0079ddcb, 0x03536964, 0x03c33aec, 0x002e4f89}}}, + {X: Field{[10]uint32{0x0149ab12, 0x001e4900, 0x0323e0df, 0x025b97ea, 0x008d0fb0, 0x003ce0ad, 0x01dd895b, 0x00ff656a, 0x008f35f6, 0x00262131}}, Y: Field{[10]uint32{0x0180eb44, 0x00907ed0, 0x02aa013f, 0x017a627f, 0x03e01154, 0x022dbd06, 0x01e321f5, 0x010df0f5, 0x02667070, 0x0015a230}}}, + {X: Field{[10]uint32{0x006c7b4d, 0x026edf31, 0x00b47448, 0x0380ac8f, 0x02bb4a6f, 0x00be0f96, 0x002e85ac, 0x027154c2, 0x029379bc, 0x002503ca}}, Y: Field{[10]uint32{0x0321fd9d, 0x03038b1f, 0x02284700, 0x0274b2b8, 0x002aa742, 0x02f1a9e1, 0x027c735c, 0x02763d47, 0x038077ba, 0x002d2e08}}}, + {X: Field{[10]uint32{0x00b782f0, 0x01d0bad6, 0x0001c0e0, 0x000d0be4, 0x005f4beb, 0x014d0fa9, 0x02feccbb, 0x00f67d06, 0x019ce535, 0x002a69da}}, Y: Field{[10]uint32{0x0187c994, 0x02a565e5, 0x018b4c7c, 0x02f17ed2, 0x01b0536f, 0x029806b2, 0x0341f778, 0x0233c690, 0x02aab3e1, 0x000f1d67}}}, + {X: Field{[10]uint32{0x03218913, 0x008898c2, 0x034afb15, 0x00748fc9, 0x0293f4da, 0x00b4044a, 0x0236cc28, 0x036c015b, 0x008a009c, 0x0028878d}}, Y: Field{[10]uint32{0x02be89ed, 0x0307d31f, 0x038da588, 0x01cec79d, 0x03c70b18, 0x01c07998, 0x00b8e28a, 0x025419bb, 0x03fa652f, 0x00050550}}}, + {X: Field{[10]uint32{0x025fd383, 0x0123ecd6, 0x01ca41f0, 0x0018c1a9, 0x00e81429, 0x006339ce, 0x03298d60, 0x0384614a, 0x01951121, 0x0035b553}}, Y: Field{[10]uint32{0x028a7a83, 0x014d1160, 0x02912412, 0x03cd4d68, 0x028f76c8, 0x02363bb4, 0x00fe9d03, 0x007f88c1, 0x00b8de89, 0x00225f73}}}, + {X: Field{[10]uint32{0x031e6cda, 0x0303c770, 0x03ebe21c, 0x01928e91, 0x026232b4, 0x03bec4be, 0x00c7f7b5, 0x03abed22, 0x035dc937, 0x001f8298}}, Y: Field{[10]uint32{0x01e921e2, 0x00eb18e3, 0x01e822d6, 0x021b3b58, 0x0274489c, 0x02b72fcd, 0x025b34e3, 0x017874b3, 0x014a7552, 0x00034b47}}}, + {X: Field{[10]uint32{0x0051a659, 0x02802e35, 0x000d3afe, 0x0053eb08, 0x0155bafa, 0x01acfeba, 0x00870e83, 0x0071a10a, 0x000f66a2, 0x00133882}}, Y: Field{[10]uint32{0x007da4c4, 0x03c157db, 0x01b1d891, 0x0249cf8c, 0x02f0ca1b, 0x0037e4eb, 0x00d0f3ef, 0x000bf4c6, 0x0226565b, 0x000a787e}}}, + {X: Field{[10]uint32{0x012bad2e, 0x007d509c, 0x00f7fc09, 0x02d363d6, 0x01e6d4b7, 0x02e27a05, 0x00d5caf1, 0x02fd9567, 0x0387b633, 0x0036ae1a}}, Y: Field{[10]uint32{0x03c85b5e, 0x0057acd4, 0x03bdf8fd, 0x00d1f95e, 0x004506a6, 0x0156f64c, 0x00159d7f, 0x0157ce36, 0x0109d79a, 0x0023926c}}}, + {X: Field{[10]uint32{0x0365aca9, 0x00a4006c, 0x017a56ae, 0x012854a2, 0x01ba1622, 0x01d9cb4e, 0x035386ea, 0x00cb93a2, 0x02c290fa, 0x0031a852}}, Y: Field{[10]uint32{0x035dbc67, 0x003ab1dc, 0x00164b2c, 0x00b7e896, 0x0245cd5f, 0x00bfd857, 0x021967a4, 0x0223f890, 0x00d6dcc5, 0x0010aab7}}}, + {X: Field{[10]uint32{0x02450a27, 0x0138853a, 0x0041de69, 0x02b32284, 0x0263510b, 0x03cd163d, 0x03244004, 0x00423ca3, 0x0240880b, 0x0009667e}}, Y: Field{[10]uint32{0x03a57a01, 0x0365321e, 0x013e6951, 0x01b95230, 0x02a424c4, 0x0280aff4, 0x03a973a1, 0x0337d1a9, 0x02ad4ae1, 0x000151e4}}}, + {X: Field{[10]uint32{0x02d9f9ff, 0x035d1da3, 0x0153bbf3, 0x00cdbe91, 0x01312655, 0x01e7b10f, 0x02d8fe9e, 0x02a3deab, 0x00b4a6af, 0x003daac3}}, Y: Field{[10]uint32{0x005026ef, 0x0365d1a1, 0x013f973f, 0x02f15ebc, 0x0282e913, 0x0241ff35, 0x001a4761, 0x00024123, 0x0189c4ba, 0x0013a849}}}, + {X: Field{[10]uint32{0x007f1dfc, 0x03522c9c, 0x01bebdfd, 0x03caf1c7, 0x0372738f, 0x00ffd369, 0x017ecdbd, 0x000838b6, 0x008bab8f, 0x003d46f5}}, Y: Field{[10]uint32{0x02697c40, 0x024fcfd2, 0x01e4308c, 0x0148922f, 0x01b361c7, 0x01fbe43e, 0x03fe7bce, 0x011fea29, 0x03a0947f, 0x001ac5a2}}}, + {X: Field{[10]uint32{0x022a3443, 0x0263c292, 0x013625c8, 0x02194d48, 0x020a50b2, 0x0342fdf4, 0x0398f2b1, 0x02a432bd, 0x01146c9c, 0x002d807c}}, Y: Field{[10]uint32{0x021f87dd, 0x03c8e471, 0x027edf0c, 0x0343f305, 0x006877fe, 0x027c3c44, 0x0317a115, 0x02d9d57c, 0x004136b6, 0x0029b28c}}}, + {X: Field{[10]uint32{0x005f974b, 0x0241947e, 0x01ccb37e, 0x0163ca1c, 0x015be6a1, 0x0316dc64, 0x030511f0, 0x01f011db, 0x027ae595, 0x001e4b75}}, Y: Field{[10]uint32{0x031dd44b, 0x01d60252, 0x03bcb941, 0x017212b0, 0x011a4c1c, 0x00bd18f8, 0x004774dd, 0x027da4e9, 0x00b9bec5, 0x0026dfd7}}}, + {X: Field{[10]uint32{0x03b093f9, 0x0004c0a2, 0x00377931, 0x0080cf0d, 0x004c29c4, 0x0009452b, 0x0300eb4f, 0x03d2b6cd, 0x026933b6, 0x001f6211}}, Y: Field{[10]uint32{0x01e2cb3b, 0x025187ed, 0x00885a2f, 0x03e2944d, 0x022ebeb5, 0x0391b0c1, 0x007ead35, 0x00036d4a, 0x035e6745, 0x000bf230}}}, + {X: Field{[10]uint32{0x012a5351, 0x03b6e01a, 0x00249010, 0x01077e0b, 0x01ead4bc, 0x01c2250d, 0x03820387, 0x02182c86, 0x03916d0f, 0x00271dba}}, Y: Field{[10]uint32{0x01c88b62, 0x0260a43d, 0x006b0d99, 0x03835b78, 0x030e51d1, 0x0231dda7, 0x0235a6da, 0x00055878, 0x03f33880, 0x001caeb6}}}, + {X: Field{[10]uint32{0x03d807f9, 0x02ec3cc7, 0x0024ecf5, 0x0360b6bf, 0x038fef18, 0x00791f0c, 0x0252a2aa, 0x024f8557, 0x02383d8a, 0x002926d5}}, Y: Field{[10]uint32{0x001d3ae0, 0x0163a364, 0x0176dbee, 0x03987f3a, 0x029dc392, 0x0324d191, 0x00b0760b, 0x013133b9, 0x01b39bf3, 0x0006f09c}}}, + {X: Field{[10]uint32{0x00634460, 0x01891f37, 0x029e0a4d, 0x03f9deba, 0x02a704c9, 0x023c71cb, 0x01d5cc96, 0x02c2c32a, 0x035a675b, 0x000134c4}}, Y: Field{[10]uint32{0x000cfc4e, 0x029dbb8a, 0x02d38395, 0x03bda333, 0x02cb74bc, 0x03c0ac4e, 0x031ffeac, 0x03d2f3cb, 0x00be72f5, 0x002b975f}}}, + {X: Field{[10]uint32{0x0253f588, 0x00cc2267, 0x00e3711f, 0x020ea481, 0x00eff955, 0x010bc64b, 0x00421b9b, 0x01b8e3f0, 0x03be17dd, 0x001655cb}}, Y: Field{[10]uint32{0x021c7c24, 0x01150877, 0x0382a39c, 0x00be6dc9, 0x03a01c8f, 0x03582811, 0x01ab8051, 0x00fe79a8, 0x0240a8cb, 0x0015c4d1}}}, + {X: Field{[10]uint32{0x012d9511, 0x03a8799c, 0x005a5cb5, 0x00203d58, 0x020a5fff, 0x00a34ba6, 0x02a1c612, 0x01e03b2a, 0x006d49b4, 0x001cf333}}, Y: Field{[10]uint32{0x03752cf4, 0x00b353f8, 0x0308edbb, 0x01b5aa16, 0x036a52c0, 0x026c5634, 0x012ea8b5, 0x0323c470, 0x0174f986, 0x00118ea3}}}, + {X: Field{[10]uint32{0x004c1e46, 0x00f0a8e3, 0x03d1ee50, 0x03c61da0, 0x02ae3885, 0x023f73db, 0x02f7280e, 0x002aa51d, 0x03fddb62, 0x002db23a}}, Y: Field{[10]uint32{0x03d39802, 0x02441839, 0x01ddeb40, 0x0157cc85, 0x0276a25d, 0x02065297, 0x0175c2ac, 0x000122f9, 0x02d9f021, 0x00269beb}}}, + {X: Field{[10]uint32{0x005e392e, 0x01ff2713, 0x01f7eb50, 0x02353087, 0x03b9cc4a, 0x00c19f78, 0x0196c539, 0x01524f6a, 0x020f92de, 0x002d058b}}, Y: Field{[10]uint32{0x023b385b, 0x0149585a, 0x01120a40, 0x005dee3b, 0x02eecf22, 0x00183660, 0x03978733, 0x0074d918, 0x00d0c921, 0x00333384}}}, + {X: Field{[10]uint32{0x012b33a2, 0x011a75e3, 0x019b7a2a, 0x02359513, 0x00a58100, 0x0282e350, 0x02919552, 0x00d75eaf, 0x0166ca42, 0x0011afc9}}, Y: Field{[10]uint32{0x02785040, 0x01f21ff1, 0x01ef10b7, 0x03c0085c, 0x01285b5c, 0x0342f275, 0x0182e39c, 0x0221064b, 0x016bb827, 0x001bd9bf}}}, + {X: Field{[10]uint32{0x0159ab2f, 0x02a4538f, 0x036b7419, 0x01a0aa7b, 0x01b5422a, 0x022704d7, 0x02dfcd1b, 0x02a73e2e, 0x01a4e869, 0x001e111b}}, Y: Field{[10]uint32{0x028c9ce3, 0x00ad6196, 0x0098327d, 0x02fcb50a, 0x023f5f31, 0x00cefaf7, 0x003c051f, 0x011b0678, 0x0131db7e, 0x0010856c}}}, + {X: Field{[10]uint32{0x0205f3b7, 0x02fc0055, 0x01d1f4be, 0x032972f4, 0x03fa2b01, 0x017ae3b6, 0x03dc7629, 0x0203350a, 0x02055110, 0x0021a21a}}, Y: Field{[10]uint32{0x03914466, 0x001f9dfd, 0x037d7675, 0x03b565e9, 0x00f9b753, 0x00eb7501, 0x038854a8, 0x030371c1, 0x01f35579, 0x0031c6da}}}, + {X: Field{[10]uint32{0x03713388, 0x03652f20, 0x03371e16, 0x03f2ca29, 0x0036d5fa, 0x011101b8, 0x038675a7, 0x03f10ff4, 0x035e37f8, 0x00280b99}}, Y: Field{[10]uint32{0x0041239e, 0x005cf7bf, 0x01c36de3, 0x03568626, 0x004ee66b, 0x01dfa7ab, 0x02162512, 0x020353ab, 0x0141835c, 0x0035be69}}}, + {X: Field{[10]uint32{0x0092bf26, 0x03322261, 0x03f14ea4, 0x01dfb8a1, 0x009b2997, 0x025ef013, 0x01100966, 0x01b3b734, 0x02a8432c, 0x00285ada}}, Y: Field{[10]uint32{0x020db298, 0x035c9053, 0x01aced2f, 0x028627bc, 0x021e734d, 0x03a9f853, 0x00ed6446, 0x010ab034, 0x0270ef9e, 0x00017046}}}, + {X: Field{[10]uint32{0x00f45b5a, 0x0052e638, 0x01c5c971, 0x00afe1a1, 0x0212d7fc, 0x01ee07f2, 0x03a1205f, 0x03979742, 0x02fe775f, 0x0019a8fc}}, Y: Field{[10]uint32{0x025e3eaf, 0x008c1417, 0x001c8c18, 0x038a57b4, 0x0100e626, 0x002d3ac8, 0x00daad03, 0x03527554, 0x0114a49a, 0x0014166f}}}, + {X: Field{[10]uint32{0x0314b3a1, 0x004de114, 0x01785962, 0x0183aa15, 0x02a1f094, 0x0184542e, 0x01c63210, 0x001319d5, 0x03cebf9a, 0x002691e8}}, Y: Field{[10]uint32{0x0040a80a, 0x03bf03bb, 0x02acbc6c, 0x03c8ae57, 0x03efd3a3, 0x024a5a49, 0x03c7045b, 0x01f9abcd, 0x02ce8f38, 0x0008b697}}}, + {X: Field{[10]uint32{0x036628c5, 0x03d89cd6, 0x02c6f97a, 0x014d27e6, 0x0312b25a, 0x03c63ea1, 0x00e3c288, 0x02e6878f, 0x00149027, 0x00070050}}, Y: Field{[10]uint32{0x02448a4f, 0x015b2583, 0x03d353a4, 0x00d15d4e, 0x0087b499, 0x00583e5e, 0x00bc34ff, 0x034f5ade, 0x00fcd048, 0x0019c864}}}, + {X: Field{[10]uint32{0x028d84cc, 0x03bff94b, 0x0231d057, 0x0002793a, 0x018d1374, 0x025f81d9, 0x00965cd4, 0x03a1d96b, 0x030a1de5, 0x0030b659}}, Y: Field{[10]uint32{0x013ccdf1, 0x029c9c7c, 0x02379cc7, 0x02303e14, 0x00b97a2e, 0x00a55b42, 0x0356b585, 0x03eec4ea, 0x0247a6dd, 0x003fe061}}}, + {X: Field{[10]uint32{0x0196ec1d, 0x006c7972, 0x026910e0, 0x03954e5a, 0x03d21339, 0x005075a3, 0x00e094c4, 0x01a9a5c3, 0x004716fd, 0x0006a7fb}}, Y: Field{[10]uint32{0x03f8557e, 0x001b62e4, 0x0140c240, 0x00e047d7, 0x01d29b87, 0x025778a4, 0x037639b5, 0x01cffa53, 0x02eb6c83, 0x0038e3ac}}}, + {X: Field{[10]uint32{0x01d8c464, 0x015abec0, 0x03bae778, 0x019a6358, 0x0053a514, 0x02c6ac9b, 0x029e5006, 0x0069b503, 0x02ed15e9, 0x002df7d4}}, Y: Field{[10]uint32{0x02e21254, 0x03b14c2d, 0x01ac1162, 0x0034297f, 0x01705c36, 0x03c60354, 0x010706ff, 0x03f63e67, 0x01bfd915, 0x003a983c}}}, + {X: Field{[10]uint32{0x03db6b5f, 0x03e65675, 0x039d1295, 0x03e21222, 0x00918ba7, 0x000d4cd4, 0x0086a534, 0x00b8bef7, 0x00cabd09, 0x0000be57}}, Y: Field{[10]uint32{0x01693ad2, 0x01192368, 0x02a7b523, 0x024e36c7, 0x01d5b0f8, 0x0026fce3, 0x02a9c3df, 0x03b61967, 0x0014fe6c, 0x000c515a}}}, + {X: Field{[10]uint32{0x018a7c1c, 0x029984af, 0x03fea883, 0x028df7bc, 0x023b6ae1, 0x00df9008, 0x01a432ca, 0x03936da8, 0x02c864df, 0x001d8e49}}, Y: Field{[10]uint32{0x0361bd1f, 0x00fc2970, 0x03a410bd, 0x0396e793, 0x00a3e741, 0x0203c7e6, 0x00b3e63d, 0x03443aed, 0x03724378, 0x003cd356}}}, + {X: Field{[10]uint32{0x00a31b0d, 0x0201f272, 0x00ebf72a, 0x03746371, 0x03708ce2, 0x032db262, 0x012a513f, 0x01b3dbcc, 0x027a1291, 0x000b90ef}}, Y: Field{[10]uint32{0x0024acfa, 0x03a67437, 0x019c5971, 0x0024232d, 0x00a3a9dc, 0x03545334, 0x0257b6ce, 0x01f95c5b, 0x0224ce1b, 0x0036e464}}}, + {X: Field{[10]uint32{0x014a5561, 0x02583073, 0x02df9a56, 0x03ec4e96, 0x002d1acd, 0x03f1a1cf, 0x0331984a, 0x01f4a1d9, 0x008f1a86, 0x001f5979}}, Y: Field{[10]uint32{0x0183ebfc, 0x01f32fb6, 0x029da7b9, 0x00daf9f9, 0x00bc9924, 0x02bde576, 0x00e2d4bc, 0x01eb4bfc, 0x0155f095, 0x00271cee}}}, + {X: Field{[10]uint32{0x0019d725, 0x02529c5e, 0x02b7c10b, 0x021f171d, 0x006b132c, 0x035c54e4, 0x02166f04, 0x02ddcb2b, 0x00c03131, 0x00071afb}}, Y: Field{[10]uint32{0x023280ad, 0x0313492c, 0x0106e318, 0x008b3ed2, 0x0041b84a, 0x02bf7d82, 0x03dd26cd, 0x0214cc25, 0x00ff9499, 0x000b0f19}}}, + {X: Field{[10]uint32{0x03347675, 0x02ca9904, 0x020f8198, 0x02c1fa74, 0x01aff339, 0x01fb7c1e, 0x02c83c7d, 0x020408ca, 0x025d5d11, 0x003d410a}}, Y: Field{[10]uint32{0x01a3e4c8, 0x01f7ff5e, 0x01d20b59, 0x015d6a2f, 0x02b2723f, 0x02811414, 0x02388020, 0x03f1b4bc, 0x03bce644, 0x00067043}}}, + {X: Field{[10]uint32{0x014be300, 0x00cd622f, 0x02539b48, 0x03c0b784, 0x030e0ee9, 0x01038213, 0x000c8872, 0x00d4f9b8, 0x0066c2c0, 0x001f0e1e}}, Y: Field{[10]uint32{0x032b8f79, 0x00ded0fb, 0x00ab400c, 0x0155b2bd, 0x0356f088, 0x001d2003, 0x03c49c6d, 0x0316350b, 0x0394587f, 0x0033319b}}}, + {X: Field{[10]uint32{0x02b3c140, 0x0081b93a, 0x034e0b7b, 0x03445a47, 0x02104b35, 0x022e8bb7, 0x02381945, 0x0370adb3, 0x0123d33a, 0x003b3a2b}}, Y: Field{[10]uint32{0x000c0a88, 0x029023df, 0x01e7c5c6, 0x00bd4d99, 0x031c7e67, 0x0326dca3, 0x00245a12, 0x034fd7cf, 0x02c07fa1, 0x003bb25d}}}, + {X: Field{[10]uint32{0x01d12b9d, 0x02bd63c6, 0x03c56a1b, 0x0064f8b2, 0x00b951cf, 0x034085dd, 0x02efecc7, 0x0370e327, 0x0126a274, 0x00208ac2}}, Y: Field{[10]uint32{0x00118313, 0x0030b791, 0x0263f1be, 0x0021443f, 0x023638f0, 0x03f3c144, 0x014d2c49, 0x030dd60c, 0x010af9ca, 0x00122f2c}}}, + {X: Field{[10]uint32{0x0385b8c3, 0x00b9dec3, 0x028a85cd, 0x011e0311, 0x03401dfe, 0x03398bf8, 0x0058d257, 0x03d0a3e8, 0x02036ef5, 0x00349a8e}}, Y: Field{[10]uint32{0x026a6fa7, 0x02c45d44, 0x00ba010f, 0x033e6eb9, 0x0362f1bb, 0x00c230b6, 0x01c6759a, 0x010ca5f5, 0x03623a64, 0x002630e5}}}, + {X: Field{[10]uint32{0x03019090, 0x00f0d1a4, 0x024beb5b, 0x037eec59, 0x0124c8fc, 0x02891f47, 0x0002ab6c, 0x032ef40c, 0x001d8aa0, 0x001ffaee}}, Y: Field{[10]uint32{0x02c3ec26, 0x02918129, 0x03b446cf, 0x008f62c8, 0x03966dc9, 0x02a12e6f, 0x00ca6c02, 0x01b69d51, 0x03cb12ca, 0x003b9896}}}, + {X: Field{[10]uint32{0x01d3473c, 0x03cac394, 0x0008733d, 0x00a9b78b, 0x02b7aa00, 0x030d912e, 0x0363a75c, 0x02daef9b, 0x00e72d43, 0x0020e791}}, Y: Field{[10]uint32{0x000fb9a9, 0x02478c4d, 0x03da43e5, 0x026150ac, 0x002d876d, 0x01dd6fda, 0x0163806d, 0x00508829, 0x023526f4, 0x0020da3d}}}, + {X: Field{[10]uint32{0x030d7afe, 0x0163ab36, 0x01135ea9, 0x025e1b48, 0x017e049b, 0x00fcbbb6, 0x02c84f32, 0x0381f278, 0x03da1c96, 0x0014ba51}}, Y: Field{[10]uint32{0x0073a831, 0x019c39b5, 0x0097d9fa, 0x003b7112, 0x02bdbbe5, 0x027e9cae, 0x01e19a90, 0x0034f4e7, 0x02c9e0c7, 0x001af3f7}}}, + {X: Field{[10]uint32{0x027f3603, 0x0231ad31, 0x000cedb1, 0x01d33f2c, 0x00c8b220, 0x0323a793, 0x03f6dd71, 0x029d0c75, 0x002605e4, 0x001cbb15}}, Y: Field{[10]uint32{0x006b5ee5, 0x01b53e9e, 0x01023615, 0x03e056f2, 0x0249455c, 0x007bb52e, 0x02a6d715, 0x03be53d7, 0x020b7f9d, 0x00376e4d}}}, + {X: Field{[10]uint32{0x0006c849, 0x026b74c5, 0x00f36af3, 0x03a75aa4, 0x012ac051, 0x00a18f44, 0x02bf9baf, 0x015a2405, 0x031559a5, 0x000dc28f}}, Y: Field{[10]uint32{0x03005840, 0x0283b187, 0x01ddaba3, 0x024c8d74, 0x03ee80d9, 0x002c419e, 0x01ab5d32, 0x033b9825, 0x01a68517, 0x0021532f}}}, + {X: Field{[10]uint32{0x03ef5dc2, 0x03e68e66, 0x02c6a714, 0x0033dc66, 0x0141d1cf, 0x01dfbda8, 0x03af5275, 0x03ef6f2c, 0x008860d2, 0x0004b95e}}, Y: Field{[10]uint32{0x02bd9ea2, 0x01b17061, 0x00821ab4, 0x027192b7, 0x01a09496, 0x01692d1d, 0x03b79ead, 0x0049bdf6, 0x02ca5dd8, 0x003d6bde}}}, + {X: Field{[10]uint32{0x00a2b722, 0x02b630cc, 0x025bdfe2, 0x0322b282, 0x028b7905, 0x015efe74, 0x031abad7, 0x0297785e, 0x03cd0b2f, 0x002d252a}}, Y: Field{[10]uint32{0x0294cb87, 0x02475ca4, 0x01adfbf9, 0x00431902, 0x00cbacf7, 0x0100693e, 0x038d8aee, 0x0186767f, 0x03d6dad8, 0x0030e5ff}}}, + {X: Field{[10]uint32{0x02b9d89c, 0x011817a2, 0x02a83106, 0x03912677, 0x03118ea6, 0x03dc6f72, 0x008245c0, 0x002e52c8, 0x012d900d, 0x000a55da}}, Y: Field{[10]uint32{0x00444a7b, 0x03595690, 0x02a91857, 0x00adfaee, 0x00f12934, 0x03f09354, 0x0037e940, 0x02bfa800, 0x00479284, 0x0028f155}}}, + {X: Field{[10]uint32{0x01bd20eb, 0x02fdc8e8, 0x00cda39c, 0x034cb927, 0x031969ae, 0x03052979, 0x0213642d, 0x0381caf2, 0x0079f325, 0x00184406}}, Y: Field{[10]uint32{0x00e443b3, 0x016611c0, 0x017a9c1d, 0x00fb599d, 0x03e5c248, 0x02763ac2, 0x0367269e, 0x0392ef56, 0x00824816, 0x00138667}}}, + {X: Field{[10]uint32{0x0255ab18, 0x027106ae, 0x034e429a, 0x0352642a, 0x02c65f6a, 0x009c87ef, 0x028c648c, 0x011d3e2a, 0x00b299f3, 0x0027ba92}}, Y: Field{[10]uint32{0x03234443, 0x01f62707, 0x00654c1d, 0x024befb8, 0x03b68028, 0x03cad687, 0x00570497, 0x0346f1fa, 0x029735ce, 0x0004e551}}}, + {X: Field{[10]uint32{0x018bd97a, 0x03d00ed4, 0x03c5cc9d, 0x02d8c7c6, 0x013fff42, 0x028da023, 0x00759826, 0x02dc1f29, 0x00d78ba7, 0x0036ec15}}, Y: Field{[10]uint32{0x011b923a, 0x021e5d58, 0x01d4a89d, 0x03e06ae5, 0x030a55a1, 0x009f9e07, 0x00048854, 0x00e95775, 0x02c09634, 0x000e5bbd}}}, + {X: Field{[10]uint32{0x021bbcf1, 0x03cf2aad, 0x0275cd70, 0x01056c23, 0x01b2f625, 0x01705372, 0x03cc0ea3, 0x00bbd276, 0x03d57fdd, 0x0036ea56}}, Y: Field{[10]uint32{0x00d20a3d, 0x02438c80, 0x004cc64a, 0x02b2ba4e, 0x020b8f76, 0x0054566e, 0x036dba84, 0x01f91862, 0x025eb7a1, 0x000abc25}}}, + {X: Field{[10]uint32{0x02d0e5be, 0x02fabee2, 0x02ef5297, 0x00c9c8bd, 0x030bf1a1, 0x00f1d576, 0x02d8febc, 0x02ec3f9c, 0x02c97979, 0x0001b0c4}}, Y: Field{[10]uint32{0x0202c6ea, 0x0001c620, 0x006438be, 0x0185c7de, 0x006c4359, 0x0363ead5, 0x038d5ea3, 0x01ce777d, 0x0388db74, 0x000d8d98}}}, + {X: Field{[10]uint32{0x008825cd, 0x038c6db7, 0x021e5b9f, 0x00c2a8c5, 0x03ad9870, 0x006335c5, 0x01b8638e, 0x02f23d52, 0x0057a494, 0x00197adc}}, Y: Field{[10]uint32{0x03a80312, 0x019a530b, 0x03c92765, 0x01088256, 0x02160b7b, 0x021c1a38, 0x016b4acf, 0x02178246, 0x02a167f2, 0x00116080}}}, + {X: Field{[10]uint32{0x02ffa7f6, 0x01f8ae53, 0x000d6b56, 0x009b610b, 0x02c11174, 0x00abaf47, 0x01db7cbd, 0x01a36bb5, 0x0117b0e8, 0x00281a5a}}, Y: Field{[10]uint32{0x01ecba78, 0x0159d710, 0x030f5ba5, 0x00f8dffa, 0x03c797ec, 0x03a2f6a2, 0x01cb828b, 0x013723c0, 0x020da1bb, 0x00321d34}}}, + {X: Field{[10]uint32{0x002cced2, 0x009f195e, 0x0387903b, 0x01e474ed, 0x01108744, 0x0021ad93, 0x01378301, 0x00a84cb7, 0x03821937, 0x0010646e}}, Y: Field{[10]uint32{0x03dc3f2c, 0x024bf299, 0x03b4a348, 0x01e40925, 0x00493352, 0x00b84c2f, 0x02e52bf8, 0x03486347, 0x03c98ce4, 0x0031d241}}}, + {X: Field{[10]uint32{0x01b218c3, 0x039fd71e, 0x0038f3c3, 0x03c82427, 0x030945e3, 0x02572563, 0x023b9b2b, 0x024fb964, 0x01337212, 0x001d7cdf}}, Y: Field{[10]uint32{0x01928be7, 0x037ab3a9, 0x02a339af, 0x02847d00, 0x02a7d2fd, 0x033c46a8, 0x0328e181, 0x008a9e8b, 0x038ec6b2, 0x002b0107}}}, + {X: Field{[10]uint32{0x02fb154e, 0x01c6bee5, 0x02c65785, 0x03dc0775, 0x026004d1, 0x03c62a12, 0x00b3bef6, 0x00bca408, 0x033ab58b, 0x0032f0c5}}, Y: Field{[10]uint32{0x01fd5c37, 0x0393783e, 0x0089226d, 0x0325863a, 0x01b8f36e, 0x0255dfb8, 0x03c166de, 0x011050b4, 0x00b76f26, 0x003104e8}}}, + {X: Field{[10]uint32{0x02e226cc, 0x0390dc36, 0x00dd92a5, 0x03d16fd3, 0x0164f212, 0x0067346f, 0x02888324, 0x03e965a5, 0x0309a139, 0x0019395a}}, Y: Field{[10]uint32{0x010fbbbe, 0x02f06781, 0x02fa7671, 0x02a18a80, 0x01d10915, 0x02d0a505, 0x001eb3d0, 0x0240592d, 0x02eef242, 0x002a4653}}}, + {X: Field{[10]uint32{0x015285a6, 0x033ed24d, 0x0014f73b, 0x0140273f, 0x0334e133, 0x0380be44, 0x022c2fb8, 0x01b3ca68, 0x01c5e288, 0x0038cde5}}, Y: Field{[10]uint32{0x01afb304, 0x035908c0, 0x035e15c2, 0x03431b37, 0x01f7c575, 0x02d2ec19, 0x02580cb7, 0x01231c93, 0x0121f33d, 0x001e243f}}}, + {X: Field{[10]uint32{0x02b0b6dc, 0x01739d69, 0x036998f2, 0x0250d7ad, 0x036e6a09, 0x01b1e48c, 0x0143d2c7, 0x03428345, 0x026b7a73, 0x0001e5d7}}, Y: Field{[10]uint32{0x023eb06f, 0x00738bfd, 0x03115012, 0x004289fd, 0x008f16eb, 0x0158af09, 0x0248d5f7, 0x024fb757, 0x00aec689, 0x00042c58}}}, + {X: Field{[10]uint32{0x01580f6f, 0x01c73774, 0x03ce02ad, 0x02124b38, 0x03c1ca44, 0x0007d106, 0x02093d08, 0x00e59e4b, 0x03cbf9c1, 0x001b4344}}, Y: Field{[10]uint32{0x03b45746, 0x012fcb3a, 0x016f1bae, 0x0351c769, 0x014bdb25, 0x01e910c2, 0x01dcfe33, 0x03c08aef, 0x023884ca, 0x0005eb90}}}, + {X: Field{[10]uint32{0x03df0154, 0x01d28806, 0x008560a9, 0x019cfef4, 0x0360d398, 0x0098200d, 0x03d3f904, 0x00ad6727, 0x014a23af, 0x0008657c}}, Y: Field{[10]uint32{0x00136a8d, 0x00fb853e, 0x02111da5, 0x01621bfd, 0x025ff1aa, 0x014028dc, 0x01b3a10b, 0x03bc07d3, 0x038c9a44, 0x003f016c}}}, + {X: Field{[10]uint32{0x03713628, 0x029ff7e2, 0x03c4dac2, 0x0220e113, 0x021f5582, 0x03477468, 0x0354e167, 0x03e2e746, 0x007360ac, 0x0011d9e7}}, Y: Field{[10]uint32{0x03803ea7, 0x00fdb285, 0x007510a9, 0x002bfce9, 0x037ca018, 0x013df365, 0x014bbde9, 0x03a07793, 0x0225f3b8, 0x0020a808}}}, + {X: Field{[10]uint32{0x0230831a, 0x02a9f277, 0x00655ac9, 0x00b8bdf2, 0x038cb4ff, 0x030859af, 0x03fe514c, 0x029a6c8f, 0x02f51636, 0x002c2f40}}, Y: Field{[10]uint32{0x03d5f518, 0x03743423, 0x0081448a, 0x00fee9b2, 0x00f4843b, 0x02fae8f6, 0x03ffc51f, 0x032f14a9, 0x016248ba, 0x0001cfeb}}}, + {X: Field{[10]uint32{0x03660158, 0x0226c068, 0x034520c6, 0x00548f2d, 0x000aab5f, 0x036fb16e, 0x03f81afa, 0x03e07fb4, 0x03d6bfe9, 0x0037ebbf}}, Y: Field{[10]uint32{0x01240583, 0x017cf6b2, 0x0324df3b, 0x0200435e, 0x0330c4bf, 0x032d6d53, 0x00a4bf9c, 0x0120539b, 0x0105c3ef, 0x000fd534}}}, + {X: Field{[10]uint32{0x000d42ed, 0x02b81afd, 0x00ba7046, 0x038fadf9, 0x0080dffa, 0x01bf5af9, 0x013d2e79, 0x0079263d, 0x02bbda66, 0x003ac05a}}, Y: Field{[10]uint32{0x02f895be, 0x03e0e89e, 0x011f518b, 0x03b5b4a7, 0x0110f005, 0x030b97a1, 0x014d50ad, 0x0166a5b3, 0x01bbaa76, 0x000c435b}}}, + {X: Field{[10]uint32{0x019fb2ed, 0x01ebec32, 0x01173e51, 0x01334bcd, 0x01726378, 0x00dfe398, 0x035b5eb1, 0x0202cdb4, 0x03c43c08, 0x00262786}}, Y: Field{[10]uint32{0x01faa1d8, 0x02dd1da7, 0x012feb53, 0x02d30b36, 0x00999b3b, 0x0077ddf6, 0x035963d1, 0x033314e8, 0x035f110c, 0x0013133a}}}, + {X: Field{[10]uint32{0x02033811, 0x03846630, 0x010bbfbe, 0x01be4249, 0x00dd801d, 0x01db57bf, 0x025bd407, 0x01eefc7d, 0x0170be4a, 0x0002fac0}}, Y: Field{[10]uint32{0x0086461f, 0x037304e1, 0x01644ff4, 0x0277f316, 0x000f5234, 0x01b4f39b, 0x02998202, 0x0268e15e, 0x018a1d32, 0x0004d5ae}}}, + {X: Field{[10]uint32{0x03c0b145, 0x032d0abf, 0x0112e337, 0x01756d83, 0x02ea9bc5, 0x01b10a5a, 0x035e5969, 0x026935bd, 0x03c1986f, 0x0000b642}}, Y: Field{[10]uint32{0x031a0c4c, 0x0327c1bd, 0x03b5b48d, 0x02fb4bbc, 0x02b377cc, 0x019fabed, 0x004b721e, 0x00665efe, 0x0364734d, 0x001f55f3}}}, + {X: Field{[10]uint32{0x009f51bf, 0x02729dde, 0x02481e82, 0x03cffb9c, 0x0159fd53, 0x030d9cef, 0x0196848d, 0x02018b78, 0x0254c960, 0x001ade9a}}, Y: Field{[10]uint32{0x0009af23, 0x0148939b, 0x0321a579, 0x00ad0f2f, 0x03dd4dc4, 0x0162bef8, 0x0079f30c, 0x0229a7c2, 0x0208157b, 0x001aa7b8}}}, + {X: Field{[10]uint32{0x028e8393, 0x02f2da0d, 0x03a8bf4a, 0x03a221c3, 0x0316faf0, 0x02df9fba, 0x01f8fa87, 0x037f9da3, 0x00c732cb, 0x00326491}}, Y: Field{[10]uint32{0x035620ae, 0x0303f0a1, 0x01951bc0, 0x02331a92, 0x0058cc9b, 0x00b6b8ba, 0x0163453b, 0x00ab4901, 0x035553ba, 0x00082b46}}}, + {X: Field{[10]uint32{0x00f01b6b, 0x01c7e51c, 0x013f6d28, 0x009a707e, 0x01350fef, 0x0026807f, 0x01cf4fc6, 0x0237157c, 0x007b402a, 0x00154ff0}}, Y: Field{[10]uint32{0x00e5a824, 0x02644dcd, 0x002909c1, 0x005df91c, 0x039b3102, 0x035f54ea, 0x03cd0dc7, 0x01b7bfe9, 0x00753961, 0x000ed463}}}, + {X: Field{[10]uint32{0x00fe2f69, 0x012fb030, 0x02369a4e, 0x009e524b, 0x03721fa9, 0x00d3216e, 0x00dfc80a, 0x0229f2cf, 0x037806ed, 0x003164c0}}, Y: Field{[10]uint32{0x0317c149, 0x031e94cd, 0x023001e1, 0x019e7d11, 0x02d7580e, 0x004ff5c0, 0x016dea62, 0x0244a4de, 0x00698a3e, 0x000da679}}}, + {X: Field{[10]uint32{0x011e7eb5, 0x02fb3224, 0x01c6a79d, 0x01ffc744, 0x008cda0e, 0x030d275d, 0x034613d8, 0x026592e3, 0x0118f4d5, 0x0032dbc4}}, Y: Field{[10]uint32{0x01de20ee, 0x020d723f, 0x036f4cf4, 0x00f5f799, 0x030ca0fe, 0x02095f11, 0x03cc88f4, 0x03573dc8, 0x028898b0, 0x0018ac2b}}}, + {X: Field{[10]uint32{0x01a26db9, 0x03148a8c, 0x009a946f, 0x023259a2, 0x0078b5d4, 0x037b2e67, 0x0322ae61, 0x019a3765, 0x038f8c26, 0x00368b2a}}, Y: Field{[10]uint32{0x010c7e98, 0x007869db, 0x01ad8fc2, 0x01ac4921, 0x01180849, 0x0324ec4c, 0x0214cb70, 0x03e52529, 0x037e0234, 0x001a80cd}}}, + {X: Field{[10]uint32{0x003b7d86, 0x023579ad, 0x00a82b22, 0x020e69bb, 0x03fa595b, 0x003c0fbb, 0x03374110, 0x038f1ff8, 0x01423f9b, 0x003f1a93}}, Y: Field{[10]uint32{0x0298beff, 0x01da1968, 0x016f5bb4, 0x01b89a46, 0x0027dfbd, 0x03094fea, 0x0078fdda, 0x02f868f7, 0x0144eb8f, 0x001b0225}}}, + {X: Field{[10]uint32{0x03dee882, 0x00dd5b78, 0x03e09db7, 0x0126509b, 0x003d09fb, 0x032a5183, 0x03258e83, 0x038341dc, 0x011ab9c6, 0x001cf26a}}, Y: Field{[10]uint32{0x0171d2b3, 0x0358d7f9, 0x0222478c, 0x00411741, 0x0352040a, 0x027b61da, 0x0290259c, 0x01422b56, 0x0327efc0, 0x0022cc50}}}, + {X: Field{[10]uint32{0x034516d3, 0x01d1328e, 0x02762933, 0x0122ba5d, 0x022bc028, 0x012e0265, 0x03e61271, 0x033470d0, 0x006145b8, 0x00029a7c}}, Y: Field{[10]uint32{0x030ebe3d, 0x03688275, 0x009aea86, 0x006d1fd9, 0x0396b6d9, 0x02185789, 0x016caf01, 0x00dd07b0, 0x0190b450, 0x0021d463}}}, + {X: Field{[10]uint32{0x00ed9691, 0x0148d7ca, 0x02572fc9, 0x003d11a8, 0x01376a43, 0x0056e910, 0x01dfb2ac, 0x0102dc73, 0x022570df, 0x00072f92}}, Y: Field{[10]uint32{0x0213de85, 0x01748095, 0x0380b6ef, 0x03ce6714, 0x02c8ac69, 0x02ce54fb, 0x02a2d10a, 0x0386ab3c, 0x02ccf262, 0x00049553}}}, + {X: Field{[10]uint32{0x0388e27d, 0x0320df6d, 0x0052fd13, 0x006a209e, 0x014ee2f1, 0x02822c64, 0x005ac85b, 0x0333ed0c, 0x01c7406d, 0x00237a92}}, Y: Field{[10]uint32{0x03e9d9b0, 0x00a55ef3, 0x00056d90, 0x0395a5ed, 0x002b6071, 0x01e8141b, 0x038b15ab, 0x01f0faea, 0x01a83b51, 0x0031cf58}}}, + {X: Field{[10]uint32{0x02d0ade5, 0x0310e921, 0x0094f6e4, 0x01f4156f, 0x025e4b71, 0x0074e35a, 0x00ab5af8, 0x0330ec7b, 0x0377b175, 0x0037a498}}, Y: Field{[10]uint32{0x03d0e11f, 0x00e1f545, 0x01cb973c, 0x02b39834, 0x016be387, 0x02352e2c, 0x0289115d, 0x0365d350, 0x03e79169, 0x000a757c}}}, + {X: Field{[10]uint32{0x03b41497, 0x02896c34, 0x00fa38a9, 0x03317ac6, 0x00f6e8a9, 0x03549450, 0x0055a2f3, 0x01ead2ad, 0x02a7aeb3, 0x001b9dba}}, Y: Field{[10]uint32{0x01e066fa, 0x0064f925, 0x0108a89f, 0x00f35a42, 0x0144c40a, 0x011eaaf6, 0x03fb936a, 0x027456ef, 0x005a7890, 0x0001f8f3}}}, + {X: Field{[10]uint32{0x00607574, 0x03b43e2f, 0x03f8f09e, 0x0274dfd7, 0x01467853, 0x026247e6, 0x022b03fc, 0x01fc3699, 0x02cf22d5, 0x000dc4c7}}, Y: Field{[10]uint32{0x0249f3b3, 0x01e87244, 0x026acc17, 0x02a9aaeb, 0x01281323, 0x005cf52e, 0x011d596e, 0x00a5a3d8, 0x012169d4, 0x00300ecb}}}, + {X: Field{[10]uint32{0x025d8152, 0x004fcdd2, 0x024e7667, 0x023d25e6, 0x0365155c, 0x0337c3ae, 0x0276633b, 0x02655ca3, 0x001482c8, 0x001c8222}}, Y: Field{[10]uint32{0x0174eedc, 0x01d8b972, 0x02e92d2a, 0x01d2d22b, 0x00588a79, 0x02642803, 0x00e26f81, 0x03722f6a, 0x019f8c0a, 0x0019e0f1}}}, + {X: Field{[10]uint32{0x03241864, 0x0048d974, 0x01e8adb7, 0x03345136, 0x02d4567f, 0x02fe74f3, 0x03a7a7ad, 0x0112ca9f, 0x03dfbaca, 0x0006e098}}, Y: Field{[10]uint32{0x0388606d, 0x02906fb5, 0x02785783, 0x02020065, 0x02edf366, 0x00b6b00d, 0x004b98db, 0x00450c65, 0x023e24f0, 0x00007f1f}}}, + {X: Field{[10]uint32{0x02f5fd43, 0x02309833, 0x013dff1a, 0x0381684c, 0x03ea41ba, 0x03560fb7, 0x019714db, 0x01fcae06, 0x02de27ca, 0x0001e8dc}}, Y: Field{[10]uint32{0x02281142, 0x01bc6e6d, 0x032e2091, 0x0192e83a, 0x01a5d3ab, 0x03d793b5, 0x0060f220, 0x015e16d7, 0x016bb32c, 0x002838c8}}}, + {X: Field{[10]uint32{0x00d02300, 0x03b03aa3, 0x0232a72b, 0x03f5e750, 0x00c30f22, 0x0156b07c, 0x03b94327, 0x01124722, 0x01aa5525, 0x001c6057}}, Y: Field{[10]uint32{0x036471b4, 0x03c58031, 0x03804876, 0x00613118, 0x003ade09, 0x013af8f0, 0x02fcc688, 0x0170597e, 0x03928de1, 0x0022cd04}}}, + {X: Field{[10]uint32{0x03654d2b, 0x031714ff, 0x01c785d1, 0x01304b22, 0x0205535d, 0x027c815b, 0x02d866a0, 0x033192d8, 0x037ad3cf, 0x00006952}}, Y: Field{[10]uint32{0x03a12f19, 0x020e42d1, 0x012e841d, 0x03e774a2, 0x03e9f5ae, 0x0247b0c1, 0x0077395a, 0x021ef48b, 0x02e39f4b, 0x002df1de}}}, + {X: Field{[10]uint32{0x019c44a6, 0x00adfb66, 0x01987726, 0x0081d00e, 0x0022cd28, 0x035d68bb, 0x030b6953, 0x01cf9772, 0x00571fc9, 0x002172d1}}, Y: Field{[10]uint32{0x010f6aa5, 0x034cc627, 0x02d53280, 0x01eaf41b, 0x0358037a, 0x03850824, 0x014ef028, 0x03f99b03, 0x01f3bd13, 0x003bf747}}}, + {X: Field{[10]uint32{0x00fd4e4e, 0x02f7dd7f, 0x03962c35, 0x02384e37, 0x02cd72df, 0x0101e8da, 0x00b305a2, 0x00432509, 0x009c64a0, 0x00263a19}}, Y: Field{[10]uint32{0x01a6c60b, 0x02a921b5, 0x008efcd3, 0x03dbf338, 0x01624a8c, 0x030febb4, 0x01f77704, 0x0175f152, 0x01693439, 0x002a0131}}}, + {X: Field{[10]uint32{0x00a5a72b, 0x0002e51d, 0x028817e5, 0x0191a71a, 0x035019a1, 0x01d3eb22, 0x00338958, 0x0396a23d, 0x03e6a297, 0x0007ab11}}, Y: Field{[10]uint32{0x01a11105, 0x02792b83, 0x00325f51, 0x028a570c, 0x01043a10, 0x03992e7b, 0x000bb1ff, 0x037abbce, 0x026b784d, 0x0022df6a}}}, + {X: Field{[10]uint32{0x004f42f5, 0x012b9a01, 0x026bc96c, 0x031e80a9, 0x01e29950, 0x029c8f89, 0x029e0ab6, 0x01cd8c5f, 0x006591f2, 0x003c1e6b}}, Y: Field{[10]uint32{0x0032dfc5, 0x02051a71, 0x00562249, 0x0340f649, 0x03490186, 0x005287bd, 0x00c3ca02, 0x010dd12b, 0x01bfc99f, 0x003aa1f4}}}, + {X: Field{[10]uint32{0x02539643, 0x01c72a8c, 0x0186eba4, 0x03a21a0c, 0x00fa0d94, 0x001dec76, 0x011c3ada, 0x00c383c0, 0x0179bf1f, 0x0035b427}}, Y: Field{[10]uint32{0x00aa8adf, 0x03d7325f, 0x00049876, 0x00dd19af, 0x00ef5100, 0x036b4b52, 0x030494dc, 0x03d507dc, 0x0064fac8, 0x0021dc2f}}}, + {X: Field{[10]uint32{0x00351f65, 0x03cee82e, 0x0291e3af, 0x029ac793, 0x01d6416c, 0x020c4fe2, 0x00595656, 0x00cda01c, 0x03d9f896, 0x000ddb92}}, Y: Field{[10]uint32{0x025f13f1, 0x014de379, 0x0295b78a, 0x03a91feb, 0x000497de, 0x0111f2ca, 0x019e8b96, 0x023c757a, 0x01e56724, 0x002e90db}}}, + {X: Field{[10]uint32{0x039f20d7, 0x0231d042, 0x0210c657, 0x014eee85, 0x000b17cb, 0x025be0d3, 0x0193daec, 0x031e6688, 0x02184b42, 0x0009c3ce}}, Y: Field{[10]uint32{0x03e7e5bc, 0x019cca15, 0x0300021b, 0x02a7d28e, 0x023a7054, 0x019ccddf, 0x00fb0d01, 0x022eec28, 0x012b9ab9, 0x003333ac}}}, + {X: Field{[10]uint32{0x02c1a599, 0x00169743, 0x02de20f5, 0x02dfea62, 0x00b055d2, 0x00ed25b4, 0x0247a8a9, 0x014d20a7, 0x03641a1e, 0x002b89c6}}, Y: Field{[10]uint32{0x03c2bdd3, 0x03ec911f, 0x0181e45d, 0x02294f05, 0x01584790, 0x021ebea7, 0x02a9a23f, 0x0207c948, 0x012f39b4, 0x00053a55}}}, + {X: Field{[10]uint32{0x03f28c8c, 0x021a6d69, 0x016a25ec, 0x00ea50ff, 0x02db36a9, 0x03b94e43, 0x0288ad64, 0x0229d2a4, 0x00fb177d, 0x0015a7ab}}, Y: Field{[10]uint32{0x03732f7c, 0x0271c6d7, 0x028440cb, 0x03d517d4, 0x02bfda9a, 0x01bd3c4d, 0x027508aa, 0x0190ae66, 0x00329127, 0x00073d8b}}}, + {X: Field{[10]uint32{0x0315b558, 0x01f3e057, 0x01e46f27, 0x03b5b4d9, 0x0041bfb5, 0x025e43e3, 0x026a2468, 0x039eea8c, 0x027ffdc4, 0x001df1fc}}, Y: Field{[10]uint32{0x021c3007, 0x03e4cee0, 0x01a4325a, 0x03ac1140, 0x00e0f970, 0x014b0bb0, 0x02a68288, 0x03976559, 0x00dc138b, 0x00134d10}}}, + {X: Field{[10]uint32{0x00adbb25, 0x03b5f625, 0x001ed132, 0x0079ee0c, 0x017d4676, 0x00113fbe, 0x03f67e9b, 0x000c1aa1, 0x02dbf173, 0x003598a4}}, Y: Field{[10]uint32{0x008b83c5, 0x03963d8b, 0x00209cb0, 0x0051bf14, 0x033d36db, 0x02ff2cca, 0x0145f238, 0x0293b648, 0x03558cec, 0x0033bbdd}}}, + {X: Field{[10]uint32{0x037ed0d6, 0x021597a9, 0x03a4925e, 0x02efd541, 0x038769e3, 0x01faec7c, 0x03927ef0, 0x01bd12dd, 0x032e12ea, 0x000710a0}}, Y: Field{[10]uint32{0x0029d5ee, 0x0394e2a7, 0x0211e280, 0x028cc9ef, 0x02786a62, 0x03879076, 0x017917d9, 0x013d769c, 0x03a4b31b, 0x0022e4e0}}}, + {X: Field{[10]uint32{0x021f7968, 0x02afddec, 0x014cc5d6, 0x00d4f34e, 0x00608324, 0x02e633cc, 0x0362911f, 0x018aa330, 0x02ff9422, 0x0018f95f}}, Y: Field{[10]uint32{0x01b009be, 0x00ba8d56, 0x036b0450, 0x038a897e, 0x00146062, 0x008ba94c, 0x0344e7d3, 0x020fc930, 0x022dfb90, 0x00278f07}}}, + {X: Field{[10]uint32{0x03b83c90, 0x01452265, 0x03f9b02a, 0x02a6d3a8, 0x00cf3ed3, 0x024253aa, 0x0088e591, 0x022971cb, 0x03a186f3, 0x002f88cf}}, Y: Field{[10]uint32{0x01dba564, 0x0067437b, 0x0156fefd, 0x03a98a5a, 0x0140bd48, 0x03714def, 0x0389ef9e, 0x02b6c9b8, 0x02b3362f, 0x00100bac}}}, + {X: Field{[10]uint32{0x01844b78, 0x0030fc58, 0x03579aaa, 0x01592892, 0x02f2cc69, 0x029cc3f3, 0x01f4d065, 0x01d3ea71, 0x03804e7c, 0x0018db76}}, Y: Field{[10]uint32{0x02a2496c, 0x03d1faf9, 0x022e7dee, 0x03ee4589, 0x026aa31f, 0x025fab22, 0x02feb598, 0x004b1808, 0x01695832, 0x001a928d}}}, + {X: Field{[10]uint32{0x02e1c5e7, 0x035b0b37, 0x01e605bd, 0x030adb9a, 0x02215ae7, 0x038bc959, 0x035af1ee, 0x0361ffde, 0x01d17250, 0x00349470}}, Y: Field{[10]uint32{0x03b4ae78, 0x012d461f, 0x004cbf55, 0x001b2116, 0x005de60d, 0x02e59963, 0x035c9862, 0x00bea32a, 0x00f57df5, 0x000916b3}}}, + {X: Field{[10]uint32{0x018ed407, 0x0371d106, 0x0248cc3b, 0x005ceea0, 0x029055f9, 0x012c1bd0, 0x011cbe05, 0x004cedc1, 0x00b8c62f, 0x00101753}}, Y: Field{[10]uint32{0x005deb54, 0x02aee9cc, 0x027201a9, 0x03f181d1, 0x01523553, 0x034af0fb, 0x00e8031b, 0x00f2d0a6, 0x0310a896, 0x002118f7}}}, + {X: Field{[10]uint32{0x03e983b8, 0x03b638e6, 0x03003546, 0x025073a3, 0x00ab3293, 0x03f696f9, 0x00a03144, 0x00e81f85, 0x02ee9ab3, 0x0025fc16}}, Y: Field{[10]uint32{0x03849261, 0x012b56fa, 0x01a7c3be, 0x008078f4, 0x03d321f1, 0x00cde0b2, 0x0070b155, 0x004e2f13, 0x02267fd9, 0x0016798a}}}, + {X: Field{[10]uint32{0x02b91ac8, 0x0181d243, 0x0153dea1, 0x02350c25, 0x01c99fdf, 0x02e6b5a4, 0x01060f26, 0x009701aa, 0x016118e1, 0x0000ce20}}, Y: Field{[10]uint32{0x0004384b, 0x005d9f65, 0x00c88728, 0x023f6f70, 0x02a57178, 0x0116a640, 0x013af0d2, 0x0069a301, 0x018b5b8e, 0x00160fa4}}}, + {X: Field{[10]uint32{0x0117a9f9, 0x03dff4cf, 0x03c31dc8, 0x0198cda7, 0x038cf653, 0x0370ed81, 0x0306b1ad, 0x01a8967d, 0x00466bbe, 0x00377483}}, Y: Field{[10]uint32{0x01de5a99, 0x01e3a270, 0x03daa7cf, 0x0166b2d0, 0x017833e1, 0x0188733c, 0x02adcf46, 0x0261a2ee, 0x0329b4ea, 0x002cb7de}}}, + {X: Field{[10]uint32{0x03dfc9f7, 0x00005c8e, 0x011cfdfe, 0x004ba37e, 0x00eecd07, 0x004e272f, 0x02c26bc3, 0x003b9565, 0x012f71ae, 0x00248f1b}}, Y: Field{[10]uint32{0x034be948, 0x0290dc00, 0x03082414, 0x021cc81f, 0x005ff2ed, 0x02680f50, 0x001ae969, 0x00490da9, 0x00ad27c4, 0x001bf6ca}}}, + {X: Field{[10]uint32{0x00a09e65, 0x0277c637, 0x031a7fde, 0x01b05241, 0x01a44887, 0x0229f444, 0x0212461b, 0x01fa1d9a, 0x02bd28d5, 0x001b50a9}}, Y: Field{[10]uint32{0x01fd28bf, 0x02fb5ae5, 0x02775640, 0x0099d1fc, 0x00dcdd28, 0x0008988d, 0x005554df, 0x03a5f0d6, 0x02b801db, 0x00137c1e}}}, + {X: Field{[10]uint32{0x01d761ae, 0x018c3b08, 0x023f04b9, 0x0010c726, 0x0170efe1, 0x014e7b38, 0x003610d8, 0x03c9674f, 0x016159f9, 0x001ff50a}}, Y: Field{[10]uint32{0x01d7e280, 0x03c77c49, 0x026dc787, 0x0005b574, 0x00e85b60, 0x03543990, 0x037d00c4, 0x00afd440, 0x0041b8ce, 0x003f5a55}}}, + {X: Field{[10]uint32{0x026770b5, 0x026ec97a, 0x018a75b5, 0x0377d023, 0x00944045, 0x00156664, 0x0100a017, 0x025f7f9e, 0x010b128d, 0x00123041}}, Y: Field{[10]uint32{0x00f66559, 0x0005f05b, 0x0061ef9b, 0x027e218c, 0x01d450e4, 0x00d4e282, 0x0061b315, 0x00c67073, 0x01a04b6e, 0x0023df3b}}}, + {X: Field{[10]uint32{0x02e2a686, 0x01963df7, 0x00a09689, 0x01037969, 0x00b3214c, 0x0220f19f, 0x02baa1b4, 0x018b725a, 0x019da12d, 0x0015118b}}, Y: Field{[10]uint32{0x01ccd957, 0x03fb0b96, 0x02e370bc, 0x00583546, 0x026a3f00, 0x03bba067, 0x0133bb50, 0x00475c3f, 0x016f9160, 0x001d9ceb}}}, + {X: Field{[10]uint32{0x026435e8, 0x01ce6087, 0x02261443, 0x011d535e, 0x0095c5fe, 0x012ddc7c, 0x025a46e4, 0x0076260a, 0x00c4e4e1, 0x001a614d}}, Y: Field{[10]uint32{0x01cbba18, 0x03d07538, 0x011376a8, 0x0267dc70, 0x039faba0, 0x039f5a1c, 0x0219a8a5, 0x0031c635, 0x02acb272, 0x000db580}}}, + {X: Field{[10]uint32{0x03e77ecc, 0x0120ca82, 0x0341ad8c, 0x00849bf4, 0x01d0bc2a, 0x03223b36, 0x0376b0d7, 0x02070eec, 0x035951c6, 0x001124fd}}, Y: Field{[10]uint32{0x0120351e, 0x002624b0, 0x0012a391, 0x03d3a0a7, 0x02df7143, 0x02ff552f, 0x03158574, 0x026ab65f, 0x021dd4d9, 0x003954f8}}}, + {X: Field{[10]uint32{0x00f8313b, 0x02f89233, 0x02ec8cf8, 0x0179a1f9, 0x006c0632, 0x0245f009, 0x0384cf5f, 0x02038625, 0x02a93300, 0x002c1536}}, Y: Field{[10]uint32{0x0367d866, 0x0222c76d, 0x01a83b06, 0x016877ba, 0x014ed52a, 0x01809083, 0x015f2a40, 0x03956b1d, 0x03155c9c, 0x00147c11}}}, + {X: Field{[10]uint32{0x0029583e, 0x000dc4f0, 0x03c571fe, 0x032581be, 0x02c1f8cf, 0x0194676c, 0x03e6796e, 0x01ac7e7f, 0x02a4fa99, 0x0012d09c}}, Y: Field{[10]uint32{0x030edb83, 0x032029bf, 0x0110cf5f, 0x00cd0e13, 0x03cecde8, 0x032f145e, 0x0336f8cf, 0x0314f572, 0x02d0dce7, 0x002549bc}}}, + {X: Field{[10]uint32{0x03e29604, 0x0012a8d8, 0x00bff46a, 0x020fc7c1, 0x006cf63f, 0x03468e52, 0x02d8e647, 0x03a0bb2b, 0x0281c69d, 0x003587ad}}, Y: Field{[10]uint32{0x021f08b8, 0x0218965c, 0x001dfaa3, 0x01756fd1, 0x03f62fdf, 0x002b8a3a, 0x006d9a43, 0x01ee3cdf, 0x02fb156d, 0x0026d6a4}}}, + {X: Field{[10]uint32{0x02bf507f, 0x00f93830, 0x0157d576, 0x0103bf63, 0x008349e3, 0x037057ae, 0x0173c8f3, 0x01e7027e, 0x000257f9, 0x0002fe3c}}, Y: Field{[10]uint32{0x020614fe, 0x01052820, 0x037d9f66, 0x00e7d3c5, 0x03433467, 0x01b4d8e8, 0x00265a83, 0x0399c3f7, 0x022f1041, 0x00158761}}}, + {X: Field{[10]uint32{0x034cb498, 0x00f8a25d, 0x032d5eb0, 0x011547b1, 0x03b471fd, 0x00a4ea1b, 0x01ca03f7, 0x03eb5936, 0x00e2a7a6, 0x0018ec95}}, Y: Field{[10]uint32{0x01948c8b, 0x01eef9d4, 0x01880083, 0x014dafbf, 0x01f5be7d, 0x00b79273, 0x03b3819a, 0x03a48b71, 0x01113a4c, 0x003d0514}}}, + {X: Field{[10]uint32{0x03968725, 0x00628a74, 0x0009ae04, 0x0021ae4f, 0x0350fdd9, 0x01327bf9, 0x0091f33c, 0x01bb618d, 0x02cde1da, 0x002eb9be}}, Y: Field{[10]uint32{0x02a30533, 0x0198241b, 0x0349bb4d, 0x03149498, 0x02e4ca46, 0x019539a8, 0x03df74c6, 0x00c5dbda, 0x01550e48, 0x001f1f72}}}, + {X: Field{[10]uint32{0x00eb34af, 0x021188eb, 0x0029b595, 0x005d4e01, 0x00d30a63, 0x0271982c, 0x02d81395, 0x02a823cf, 0x01f8ea15, 0x003d58a1}}, Y: Field{[10]uint32{0x015a9eb9, 0x02c73a41, 0x038ee31e, 0x0369ee66, 0x02d9a0f6, 0x028b72e6, 0x0303c9de, 0x00652901, 0x03c1a202, 0x0004400c}}}, + {X: Field{[10]uint32{0x0151d87a, 0x01c98ce0, 0x006a540d, 0x0348663b, 0x020eafba, 0x003a38da, 0x039191c6, 0x035147b6, 0x00953de3, 0x0021db1f}}, Y: Field{[10]uint32{0x032279b8, 0x013897a5, 0x03d27df5, 0x00744016, 0x01cf5501, 0x0394aa16, 0x0010d177, 0x0031b010, 0x037472ce, 0x00257bff}}}, + {X: Field{[10]uint32{0x000a6d30, 0x0360eb25, 0x030e3fbf, 0x01b6e8fc, 0x00a024d8, 0x02ac71d6, 0x00969024, 0x01ef55a0, 0x03ed077c, 0x003a55b1}}, Y: Field{[10]uint32{0x03aad9da, 0x01c5dc41, 0x0026b45c, 0x0164339a, 0x0205aa57, 0x01669592, 0x017a9da2, 0x026adde9, 0x00a6f0d1, 0x0006d77f}}}, + {X: Field{[10]uint32{0x01dd3f16, 0x00bfeaa6, 0x028bd8fe, 0x016a0691, 0x03ab743b, 0x01412335, 0x016e9c06, 0x01150c51, 0x0261abdb, 0x003d4ff7}}, Y: Field{[10]uint32{0x0390222f, 0x01ad93b5, 0x026bc1a2, 0x023b838a, 0x01a65ac7, 0x02cd586f, 0x038e86ba, 0x008ad405, 0x013947ea, 0x00074a2d}}}, + {X: Field{[10]uint32{0x00043ad9, 0x00d91272, 0x003b5f5d, 0x02d3def3, 0x025e49b0, 0x00da9f18, 0x01b91039, 0x010d751d, 0x028152eb, 0x002e46a1}}, Y: Field{[10]uint32{0x013aaa75, 0x00c018a8, 0x0288bb34, 0x00347a2f, 0x01722dc9, 0x007746f5, 0x0296f3d1, 0x026f0185, 0x01175693, 0x00031d63}}}, + {X: Field{[10]uint32{0x018f8cc7, 0x03c233e3, 0x02897b16, 0x032ec930, 0x0261f5ad, 0x02f25d4d, 0x00c55d0a, 0x00a49f6d, 0x007023e3, 0x0016a1ef}}, Y: Field{[10]uint32{0x03731e54, 0x02a9b81b, 0x01b2c3d2, 0x00b622a2, 0x009d1ac3, 0x02ffdd2d, 0x02d2120f, 0x00357011, 0x024baa6a, 0x00273aab}}}, + {X: Field{[10]uint32{0x01ceb034, 0x01e7de5c, 0x02e80de9, 0x02a19ad9, 0x01215622, 0x03f1736c, 0x00a80b9e, 0x02cd50ef, 0x0343e54e, 0x002b02c6}}, Y: Field{[10]uint32{0x00638d8d, 0x0344fcfd, 0x007f609b, 0x03ef4afc, 0x01439477, 0x025f6a6d, 0x03c2b871, 0x0385485e, 0x035e5731, 0x002a2455}}}, + {X: Field{[10]uint32{0x005ca915, 0x01cd19fa, 0x03dc1450, 0x01277cea, 0x00e84f19, 0x01ae88dc, 0x034d6f3f, 0x033609db, 0x02bc2017, 0x0034f107}}, Y: Field{[10]uint32{0x00dcf7b7, 0x02979363, 0x02ce609d, 0x01d8ee8f, 0x01bc1e95, 0x0043f3cd, 0x02b1e916, 0x0165147d, 0x01528be5, 0x0014aac7}}}, + {X: Field{[10]uint32{0x03923b02, 0x03afa551, 0x010634d1, 0x013d27ba, 0x02ab842e, 0x0386c3cd, 0x0100d00f, 0x00b31bde, 0x0057f4c8, 0x001a33ff}}, Y: Field{[10]uint32{0x02b1d8e2, 0x01a92166, 0x026b26fe, 0x0012ebb4, 0x03367ba9, 0x00628c1a, 0x03da281c, 0x001d070f, 0x01bfaac1, 0x001ca655}}}, + {X: Field{[10]uint32{0x00177d9c, 0x03c954e3, 0x0074cd30, 0x0194d0fe, 0x02579dc7, 0x014c9299, 0x00566b33, 0x0267bb82, 0x00e12462, 0x001f83d6}}, Y: Field{[10]uint32{0x0021447c, 0x010065a2, 0x0128dcd3, 0x0055a816, 0x00086b90, 0x034d99d0, 0x009af7b5, 0x024fc020, 0x01835872, 0x000e5949}}}, + {X: Field{[10]uint32{0x00c9b542, 0x0057ae39, 0x03bbb97a, 0x0219cc95, 0x025dc450, 0x02cc97f5, 0x013d4bf1, 0x019263ad, 0x03dbd181, 0x0031caae}}, Y: Field{[10]uint32{0x0325a7b9, 0x01debeca, 0x0378288e, 0x0232da06, 0x00841a06, 0x011b34c6, 0x0041ed3e, 0x03cf4a21, 0x03a55df5, 0x000f23eb}}}, + {X: Field{[10]uint32{0x02363d0d, 0x002aed74, 0x015a1b72, 0x0329cff8, 0x00943654, 0x03da40de, 0x024d76ce, 0x0245107d, 0x035d3eb0, 0x001d1d1f}}, Y: Field{[10]uint32{0x00443649, 0x03eb5f07, 0x019b9746, 0x029907e5, 0x03bf54c1, 0x032bc151, 0x01f993a5, 0x03a3dcc8, 0x03240bc7, 0x00004b19}}}, + {X: Field{[10]uint32{0x01b67067, 0x03ff23e4, 0x006e1212, 0x00b347ec, 0x0129db86, 0x02b5a26a, 0x00b5d71d, 0x039f10d3, 0x02d1ab1d, 0x003ca9c0}}, Y: Field{[10]uint32{0x03afd854, 0x01ef458d, 0x0242962c, 0x006af451, 0x031d5ec1, 0x03ed373e, 0x03452bc7, 0x02b26b2d, 0x022cc730, 0x00016e47}}}, + {X: Field{[10]uint32{0x000d9340, 0x02d58d34, 0x01e1b530, 0x00f52fa4, 0x00c2535b, 0x000711ba, 0x01a87b62, 0x01ad197f, 0x030814e7, 0x002a4b53}}, Y: Field{[10]uint32{0x01cd0277, 0x02e81941, 0x030be6f4, 0x02f08d43, 0x0038d96d, 0x01d536b6, 0x01fd9bfe, 0x03ed015a, 0x028f3c02, 0x001360a6}}}, + {X: Field{[10]uint32{0x02f205a1, 0x03e45e89, 0x017462aa, 0x010a1285, 0x02df5ea1, 0x002a03ee, 0x00ea3206, 0x030ecfe4, 0x00b1ac06, 0x001e78c3}}, Y: Field{[10]uint32{0x00d5c82f, 0x007c9db2, 0x028d5352, 0x012a7d85, 0x007f1736, 0x0032ea5d, 0x008a79ed, 0x0252556b, 0x020a8145, 0x002b4882}}}, + {X: Field{[10]uint32{0x009401d1, 0x008c6da3, 0x02ff3020, 0x028eeaf5, 0x0288c8d6, 0x00903e8c, 0x023252be, 0x015dfc11, 0x0053d412, 0x001b5577}}, Y: Field{[10]uint32{0x03006eb3, 0x00cbf4de, 0x021540d7, 0x03228297, 0x02c98e17, 0x019e7c15, 0x01553452, 0x00cb0164, 0x0096aa3b, 0x0020e907}}}, + {X: Field{[10]uint32{0x01b3f20a, 0x00ed5a92, 0x02f487c8, 0x038834f8, 0x0211ef14, 0x032e2830, 0x03ea5eb4, 0x02e426cd, 0x031f604e, 0x0033e727}}, Y: Field{[10]uint32{0x0247dff8, 0x034722e8, 0x03f93dd3, 0x03e77d5b, 0x02da24ea, 0x032d1077, 0x0260b5be, 0x026621dc, 0x01f64e64, 0x000ae42e}}}, + {X: Field{[10]uint32{0x006b35dd, 0x03649786, 0x00346a2f, 0x016eea6a, 0x00e30f43, 0x03bdbf2b, 0x03677809, 0x02652acc, 0x019f29ed, 0x0018350a}}, Y: Field{[10]uint32{0x0360331e, 0x008da551, 0x0143737b, 0x02927462, 0x03040d51, 0x03639092, 0x0386ddd2, 0x02d3163f, 0x0388b8aa, 0x00037da6}}}, + {X: Field{[10]uint32{0x01493540, 0x0314ddb6, 0x02122887, 0x01660b34, 0x037de3be, 0x004528ef, 0x02bbb854, 0x012981ad, 0x02dd1b67, 0x00364e9b}}, Y: Field{[10]uint32{0x01e5f7ff, 0x03146ffe, 0x01230423, 0x023111fb, 0x03acfdb0, 0x03e486b9, 0x01590064, 0x0065ef00, 0x03d7dc79, 0x0021f68d}}}, + {X: Field{[10]uint32{0x01652962, 0x024646af, 0x03c6025d, 0x0368681b, 0x01fd5869, 0x032ded7d, 0x02bb6b31, 0x023662dc, 0x01377e10, 0x0033e30f}}, Y: Field{[10]uint32{0x00128fbb, 0x02722c4d, 0x01c93afc, 0x006a1e7b, 0x02fc5427, 0x0086cf2b, 0x002b0343, 0x02b40b6d, 0x0102bb96, 0x0001bd73}}}, + {X: Field{[10]uint32{0x00df29eb, 0x011f9a23, 0x002a6908, 0x0123c931, 0x00715b90, 0x01ee7283, 0x03ab65ac, 0x03b3e609, 0x02474637, 0x001b2a64}}, Y: Field{[10]uint32{0x02b55439, 0x0260f93f, 0x001f6d93, 0x00374057, 0x028bb616, 0x02ad5f0f, 0x02a446ed, 0x01153b65, 0x01a5fefa, 0x00144de3}}}, + {X: Field{[10]uint32{0x00d17afd, 0x035a1b4a, 0x008c558e, 0x0135ee7c, 0x033cc306, 0x02b3cb8f, 0x0267758c, 0x004f577a, 0x00043cb8, 0x001bdf4b}}, Y: Field{[10]uint32{0x0233bc6f, 0x029b3194, 0x013c8c65, 0x03c82b0a, 0x01b590a5, 0x01f17858, 0x039106c1, 0x03b120cf, 0x027813ec, 0x0011e538}}}, + {X: Field{[10]uint32{0x0124f3e1, 0x02a2893a, 0x03475d2c, 0x0069f667, 0x01e818d0, 0x0213a466, 0x02a82b01, 0x0220fead, 0x00d00bc9, 0x003e2bb8}}, Y: Field{[10]uint32{0x039442b5, 0x01bcd2a0, 0x01b8ab52, 0x01797348, 0x0244f105, 0x01ac6cf7, 0x0026bfac, 0x0177c025, 0x032b6913, 0x002b3e72}}}, + {X: Field{[10]uint32{0x00ce781c, 0x010ad180, 0x03f9d222, 0x03aba461, 0x010a85c8, 0x03d32470, 0x03123fc7, 0x000fd12f, 0x00bfc1a2, 0x0022c03f}}, Y: Field{[10]uint32{0x01d35bc9, 0x02617322, 0x03cac478, 0x02676b7e, 0x020a8de6, 0x03b9510a, 0x00264280, 0x039a43b0, 0x018a3e81, 0x00187a79}}}, + {X: Field{[10]uint32{0x01d6dd4d, 0x02dfe84e, 0x03c1ab0e, 0x008fa612, 0x00a72785, 0x0330c84b, 0x001ebbc1, 0x028acb08, 0x03078e84, 0x003eeb2e}}, Y: Field{[10]uint32{0x003a0f52, 0x02129f93, 0x020833aa, 0x017f45b1, 0x014e557d, 0x032eea89, 0x03df675c, 0x002265e5, 0x01d6f5eb, 0x000b1b27}}}, + {X: Field{[10]uint32{0x005c0611, 0x00cf6b2b, 0x02175bfa, 0x02ecf7e2, 0x005ba601, 0x00ee8a01, 0x028f9935, 0x03c14e34, 0x035c2f32, 0x000555a1}}, Y: Field{[10]uint32{0x00e240b7, 0x02bfa129, 0x01cf8eba, 0x00e84391, 0x03d2eb78, 0x022238e1, 0x01fb5405, 0x0251923a, 0x0050c3da, 0x0014d88c}}}, + {X: Field{[10]uint32{0x02d93d77, 0x01caec00, 0x0379e2e9, 0x03416617, 0x0349a8ce, 0x01a0fe00, 0x03e690ec, 0x017a6338, 0x00957f5b, 0x002d80ac}}, Y: Field{[10]uint32{0x01435227, 0x00e6d3a1, 0x009d960d, 0x00e2bd6e, 0x01ff3588, 0x006edecc, 0x00046acb, 0x02e0878c, 0x0390ddd6, 0x001e21a0}}}, + {X: Field{[10]uint32{0x022dd17a, 0x01454076, 0x0037724f, 0x0059d7f9, 0x037a8462, 0x001bc154, 0x01d66f8a, 0x00913822, 0x016523a5, 0x000a8440}}, Y: Field{[10]uint32{0x00825159, 0x0314e86e, 0x02bff938, 0x01e1f4b0, 0x02b881d0, 0x001cdfce, 0x02de4983, 0x018ba6c0, 0x0125e1ca, 0x000934ed}}}, + {X: Field{[10]uint32{0x017efce0, 0x00d76991, 0x01d3835a, 0x02495bf2, 0x01a13edb, 0x03d0f4b6, 0x0326a8e4, 0x03e6a738, 0x03591148, 0x0001cc51}}, Y: Field{[10]uint32{0x03b2d8b3, 0x02c3fddd, 0x03790c7f, 0x03c0c182, 0x021ad5ad, 0x015d991c, 0x02c7cfa4, 0x02a8134e, 0x009480d0, 0x002c6573}}}, + {X: Field{[10]uint32{0x036206fc, 0x0117b76c, 0x02e3db2f, 0x0190df65, 0x000525d8, 0x016a7638, 0x0362979c, 0x008f5c58, 0x03e40c7e, 0x0028db93}}, Y: Field{[10]uint32{0x02844751, 0x0158d799, 0x02707c74, 0x027da5e9, 0x00034669, 0x0020ce69, 0x0270de87, 0x0236d2a2, 0x03850a42, 0x0015ab39}}}, + {X: Field{[10]uint32{0x003cac9a, 0x0135de3d, 0x00402344, 0x035fa219, 0x0085b877, 0x0289253d, 0x021b61d5, 0x01046175, 0x03e7a2c5, 0x0025e192}}, Y: Field{[10]uint32{0x01f2ff69, 0x023b68ae, 0x000ab013, 0x00a1c6e6, 0x003a6c54, 0x03a4f9c7, 0x01dcd900, 0x020e4554, 0x0278a85b, 0x0010ccca}}}, + {X: Field{[10]uint32{0x0119893e, 0x03ae65a1, 0x02458b74, 0x01057fc0, 0x03daa7ca, 0x0177351f, 0x02c92c84, 0x03ba9b68, 0x01bf2449, 0x000d294b}}, Y: Field{[10]uint32{0x0303ece4, 0x00151ff8, 0x001b9427, 0x00d5a675, 0x03b3545a, 0x007ceec8, 0x03a8d552, 0x009b27de, 0x0029900f, 0x002b7506}}}, + {X: Field{[10]uint32{0x03f3d629, 0x037a298b, 0x02fcf5af, 0x02ede67d, 0x030d8bdb, 0x018c7d6e, 0x037b2b48, 0x02985d7e, 0x03a994ee, 0x0038942a}}, Y: Field{[10]uint32{0x0143b0ea, 0x02f60da0, 0x01757409, 0x03b02ffc, 0x022e92c4, 0x02254c3e, 0x00b6fae6, 0x03ea182f, 0x00f59db0, 0x00200fcd}}}, + {X: Field{[10]uint32{0x0071ae00, 0x026b8a6e, 0x02372086, 0x00bb8eca, 0x02795304, 0x01563845, 0x009347a4, 0x011b8845, 0x026d0b59, 0x00060d5a}}, Y: Field{[10]uint32{0x015385cb, 0x03a6aee6, 0x01f08f19, 0x008eea30, 0x000ba6de, 0x032849f1, 0x0398ec8d, 0x01be0787, 0x01716b17, 0x0015bbc2}}}, + {X: Field{[10]uint32{0x00205533, 0x033caa44, 0x0288eed3, 0x035bdcf5, 0x02ca5932, 0x0030a795, 0x025ef3f3, 0x0182100d, 0x03f5e530, 0x000d6a3a}}, Y: Field{[10]uint32{0x03259958, 0x0061481f, 0x018c453a, 0x03570b41, 0x0220d30f, 0x02b69d67, 0x01410325, 0x0153788f, 0x01950429, 0x0027ab97}}}, + {X: Field{[10]uint32{0x02a4e1b9, 0x014107f9, 0x007bda70, 0x02427292, 0x037b3dbe, 0x014ea597, 0x0062b920, 0x023fa7aa, 0x02f525ea, 0x0000df81}}, Y: Field{[10]uint32{0x03ceb97c, 0x015fed87, 0x020d703f, 0x01a3f73d, 0x003f2f65, 0x00686650, 0x0313b604, 0x026fa88f, 0x03d35e48, 0x0020e467}}}, + {X: Field{[10]uint32{0x02131c27, 0x037b0657, 0x007131a4, 0x0119c636, 0x01483166, 0x03929bff, 0x00629476, 0x0000bc44, 0x0297ac6c, 0x002aeef9}}, Y: Field{[10]uint32{0x012f9dcb, 0x01c55cac, 0x00300929, 0x01126a92, 0x02fd7049, 0x0083abd3, 0x00d8a24a, 0x008bfdfe, 0x02cb9d51, 0x002cb249}}}, + {X: Field{[10]uint32{0x01b05878, 0x0161691a, 0x0204368a, 0x00dabab2, 0x015a1a36, 0x022454c5, 0x0029c8b7, 0x03730fdf, 0x02cb1484, 0x00137cda}}, Y: Field{[10]uint32{0x0241c41d, 0x0308379a, 0x02d09d4f, 0x012edff3, 0x00aa059f, 0x0255914d, 0x00417fb1, 0x03c098ff, 0x026fc08a, 0x003f85bf}}}, + {X: Field{[10]uint32{0x0399d0d7, 0x01f4a6f9, 0x0073123a, 0x018371f1, 0x03c8f49c, 0x02f6bdab, 0x01570e5e, 0x01a82a22, 0x02e31025, 0x0017fc53}}, Y: Field{[10]uint32{0x03e65d7b, 0x0074af3d, 0x010d8989, 0x01b15b3f, 0x0295382d, 0x02b66146, 0x02a923ee, 0x00beb23c, 0x013855eb, 0x0025bfc5}}}, + {X: Field{[10]uint32{0x015d119a, 0x00b7a8a1, 0x028104f6, 0x0320dabd, 0x02a24dba, 0x01eadc61, 0x01281a1b, 0x008bd1e4, 0x0052c1d4, 0x0005a84b}}, Y: Field{[10]uint32{0x00c17478, 0x0205c8c9, 0x03b2ab3a, 0x03d01838, 0x01d36a4b, 0x02eeaaea, 0x0196cb38, 0x015b791a, 0x0272f673, 0x001e9bbc}}}, + {X: Field{[10]uint32{0x01489ef5, 0x0003fea8, 0x00eda606, 0x02b2fa91, 0x0005fcdb, 0x03f559f9, 0x00b3d154, 0x02248292, 0x00338368, 0x0023d327}}, Y: Field{[10]uint32{0x03885717, 0x015932b6, 0x01b4e37d, 0x035232ee, 0x01a4b0ab, 0x018a78b9, 0x03c0082d, 0x01131eca, 0x004de064, 0x000aed6f}}}, + {X: Field{[10]uint32{0x02b83310, 0x035b4aaa, 0x017776ab, 0x00bf417d, 0x0219236d, 0x0140e672, 0x00ca399e, 0x01c04215, 0x039b0754, 0x001262fc}}, Y: Field{[10]uint32{0x02fd691c, 0x0394699a, 0x01d0c4dd, 0x0118b0d5, 0x02b5edcd, 0x0291752e, 0x007beb58, 0x0238daf3, 0x03ff0cb5, 0x00238b7a}}}, + {X: Field{[10]uint32{0x02fb5996, 0x01b84dbb, 0x01c1171e, 0x024047a2, 0x022ba51d, 0x012560cd, 0x02247d17, 0x034e5ac8, 0x020a2978, 0x001e051f}}, Y: Field{[10]uint32{0x03f85989, 0x00c349c3, 0x01fd41d8, 0x03d6e2c1, 0x004c75bf, 0x03ad1043, 0x01bf0fb2, 0x01986f9c, 0x030ca73b, 0x00299ade}}}, + {X: Field{[10]uint32{0x028d4927, 0x035df760, 0x01f663f4, 0x028b85ab, 0x0047e112, 0x00b7c012, 0x037aea1d, 0x01b1f951, 0x00d9fb23, 0x000d44a6}}, Y: Field{[10]uint32{0x00fe00f9, 0x00ab2077, 0x03f2067f, 0x035161e3, 0x01241094, 0x01862b94, 0x01c3884e, 0x008ea745, 0x01af8b6f, 0x001b2724}}}, + {X: Field{[10]uint32{0x02399d10, 0x00af2f85, 0x00a67a34, 0x01a2797e, 0x01c18146, 0x0121526b, 0x00ffc148, 0x01827093, 0x000c88fb, 0x003ed7ff}}, Y: Field{[10]uint32{0x00229ab3, 0x011b97ee, 0x00a0946f, 0x02472217, 0x0088cf57, 0x03a4ba5e, 0x03eff328, 0x02532e43, 0x013f9ced, 0x002a6578}}}, + {X: Field{[10]uint32{0x0032097b, 0x0293e812, 0x036b36c7, 0x0251df35, 0x0089565e, 0x00372aa8, 0x03bd1974, 0x027175c5, 0x03c44cc0, 0x0020d4ad}}, Y: Field{[10]uint32{0x010fe6bc, 0x02bdb1df, 0x01e236f8, 0x02ada531, 0x00f91c8f, 0x01dd2b9a, 0x018ca786, 0x0097641d, 0x019800fa, 0x002541f2}}}, + {X: Field{[10]uint32{0x01919f4a, 0x00104561, 0x0140bd82, 0x036d8ab6, 0x015d5ed1, 0x02ec7165, 0x01014d76, 0x009d1b5b, 0x000f273a, 0x0006f997}}, Y: Field{[10]uint32{0x0009a3f2, 0x0368d657, 0x03552da3, 0x00f202c8, 0x00f044e9, 0x03be0eba, 0x01470a83, 0x03e0e68f, 0x03302a38, 0x0036b263}}}, + {X: Field{[10]uint32{0x0358418e, 0x017e6302, 0x003a7ed6, 0x0227afdd, 0x008de14d, 0x03a003d9, 0x0365037a, 0x03889fba, 0x03a52f4b, 0x001c41fc}}, Y: Field{[10]uint32{0x01fca7a4, 0x01a9d29a, 0x00e6069f, 0x03caa857, 0x01927b2d, 0x023bab91, 0x00e429d1, 0x03cc9f45, 0x0009bd1a, 0x002ff3c7}}}, + {X: Field{[10]uint32{0x03312e3e, 0x00125ce5, 0x00cff9dd, 0x03300293, 0x00983389, 0x02c7e766, 0x0254a133, 0x02b96c73, 0x004be8ed, 0x000045ca}}, Y: Field{[10]uint32{0x0212b03d, 0x02d170e0, 0x01539638, 0x01de1b98, 0x0084e3af, 0x0321342e, 0x03519994, 0x03b5262f, 0x001e724f, 0x00247923}}}, + {X: Field{[10]uint32{0x000de54e, 0x02d129ec, 0x015ded31, 0x02db1f99, 0x0041c243, 0x0226d9c5, 0x01f1cd0d, 0x026ad194, 0x02deb1ff, 0x00282361}}, Y: Field{[10]uint32{0x030f0d2f, 0x0098a720, 0x0012c0ec, 0x03530b6f, 0x01a72ed8, 0x01d33252, 0x0364feef, 0x00e7455d, 0x03f6344d, 0x001343f9}}}, + {X: Field{[10]uint32{0x00e8c25f, 0x023b2d69, 0x015503f7, 0x00cf79c4, 0x0098cfc6, 0x02352282, 0x032cbf36, 0x01062bbb, 0x01cedf67, 0x00271130}}, Y: Field{[10]uint32{0x01e743fa, 0x01936f8c, 0x0335f81f, 0x01b79306, 0x03de3d3c, 0x03e61c30, 0x01a959b9, 0x03c258c7, 0x002086d3, 0x000f3688}}}, + {X: Field{[10]uint32{0x0339f149, 0x00ce2c88, 0x02319250, 0x012694ab, 0x00f85979, 0x03c935c5, 0x03118da6, 0x030196ea, 0x00755215, 0x00364cf9}}, Y: Field{[10]uint32{0x00baec45, 0x01f5bf22, 0x01dcb054, 0x00e74bc6, 0x030e277e, 0x012604a1, 0x03abfa60, 0x03c13778, 0x028e313a, 0x0017ec3c}}}, + {X: Field{[10]uint32{0x008a42cb, 0x003c74c6, 0x015ff63c, 0x014d96ab, 0x024c2f9e, 0x03c90ef1, 0x00105289, 0x014cb288, 0x0197ddd0, 0x001ff87c}}, Y: Field{[10]uint32{0x02472af7, 0x0159e3ff, 0x02c7cd3f, 0x02b1ae8a, 0x01a9ec6b, 0x015879d7, 0x03618286, 0x024863b8, 0x033fa186, 0x00204ec4}}}, + {X: Field{[10]uint32{0x0107f79c, 0x02ae54b1, 0x0151a96a, 0x02bacf5d, 0x037ba412, 0x00b71b55, 0x010789c7, 0x008409eb, 0x01218961, 0x0038d5a1}}, Y: Field{[10]uint32{0x023e3a30, 0x01919690, 0x029a8496, 0x00533579, 0x017d8201, 0x0377d351, 0x01fe225e, 0x02a2b2b9, 0x01058e2c, 0x001d9171}}}, + {X: Field{[10]uint32{0x02ebece4, 0x03b3e0ad, 0x0380d146, 0x020ee089, 0x00c667a1, 0x02daa768, 0x02bcefc3, 0x01128aaf, 0x01468a56, 0x00315abf}}, Y: Field{[10]uint32{0x00f1a8d4, 0x018d7e55, 0x01e750cc, 0x005071a4, 0x022915ba, 0x01a19526, 0x03c587cb, 0x00a11227, 0x0255a80e, 0x00279071}}}, + {X: Field{[10]uint32{0x01589345, 0x0347c9a8, 0x02d5600a, 0x023f46af, 0x01440f9f, 0x00257c38, 0x036042e1, 0x02a3c1ce, 0x033960e6, 0x002c90ba}}, Y: Field{[10]uint32{0x036dfde0, 0x00107961, 0x01ca4bb5, 0x02b7a11a, 0x00378579, 0x025bca8d, 0x002decb6, 0x03c280d8, 0x036df063, 0x00251369}}}, + {X: Field{[10]uint32{0x023bb827, 0x01ec41cc, 0x03d42af5, 0x029ad70e, 0x0378f835, 0x0339a1c0, 0x00a43f2f, 0x00b8ba22, 0x01666d2e, 0x000e94bf}}, Y: Field{[10]uint32{0x03af91c7, 0x0136a669, 0x034cc487, 0x035b4390, 0x020096c7, 0x023d3ca7, 0x015cea01, 0x01e9189d, 0x0177a7b3, 0x0004b944}}}, + {X: Field{[10]uint32{0x00d28f53, 0x01deba89, 0x026cf708, 0x03f8259e, 0x034a71c0, 0x0262a31a, 0x03072d25, 0x006b4451, 0x0215c883, 0x002ddf55}}, Y: Field{[10]uint32{0x02bf3132, 0x02318d27, 0x011760d1, 0x030cdaa3, 0x01f5cff2, 0x03de4d81, 0x02df83d5, 0x0299977a, 0x03cfa068, 0x0009756d}}}, + {X: Field{[10]uint32{0x008530dc, 0x0260da70, 0x0214d798, 0x013d3fde, 0x03f23d22, 0x0109aa89, 0x03847288, 0x00d6a14d, 0x003b61e4, 0x00391083}}, Y: Field{[10]uint32{0x00ca8572, 0x034b213b, 0x019a7f7c, 0x02a626c4, 0x029b3c67, 0x01622b65, 0x02bd74e1, 0x0212e66f, 0x00b48579, 0x00108ac1}}}, + {X: Field{[10]uint32{0x030aaaea, 0x00204158, 0x007cecae, 0x011262b4, 0x01236e3c, 0x01853ec0, 0x020fadda, 0x00a678ee, 0x01bfc6ab, 0x002222ff}}, Y: Field{[10]uint32{0x0370eb3c, 0x03d1dccd, 0x03453f06, 0x032761c4, 0x037ada97, 0x006a3d02, 0x00fb94aa, 0x0396018a, 0x013d58cf, 0x0021b9c9}}}, + {X: Field{[10]uint32{0x00ef419c, 0x01310d84, 0x02cce8ef, 0x00b52185, 0x000d850f, 0x004e6059, 0x03de398a, 0x022cc376, 0x018bf7d7, 0x003dd349}}, Y: Field{[10]uint32{0x03029204, 0x029ffc94, 0x02c9dfca, 0x02db5233, 0x0205d60e, 0x02ec4b4c, 0x0332213c, 0x02b7f250, 0x01af1e6d, 0x00344f52}}}, + {X: Field{[10]uint32{0x00da6df0, 0x00504417, 0x00ae0679, 0x0352deb0, 0x0365cea0, 0x006e4895, 0x00097861, 0x00120e9c, 0x029098d6, 0x002a2ccf}}, Y: Field{[10]uint32{0x0121c553, 0x03ced44d, 0x01ddc650, 0x030194b2, 0x021182b6, 0x01bfd1d8, 0x032598e9, 0x0255ec45, 0x038cc08d, 0x00163308}}}, + {X: Field{[10]uint32{0x023ef1ff, 0x0251c286, 0x03cb8969, 0x02d96b84, 0x027a4a6c, 0x01286857, 0x01dbbe3d, 0x03eb6639, 0x01547477, 0x0016be2c}}, Y: Field{[10]uint32{0x016f25bf, 0x012c68df, 0x03672cc8, 0x0056dbbd, 0x033c0a8c, 0x019ba05c, 0x008fac13, 0x0060c8db, 0x0201d0c6, 0x001497b4}}}, + {X: Field{[10]uint32{0x03bec21c, 0x027ca780, 0x030bc811, 0x0196adff, 0x02fa71e6, 0x037e198a, 0x01143833, 0x01712887, 0x00546d4c, 0x00005571}}, Y: Field{[10]uint32{0x00411aae, 0x0259afd4, 0x036d0378, 0x020bb7bf, 0x03638422, 0x03f5c91f, 0x00eaefe8, 0x00461737, 0x03672f64, 0x00083a67}}}, + {X: Field{[10]uint32{0x0025a56e, 0x0019831d, 0x01473101, 0x00319ce3, 0x00c8fd7f, 0x02998ddc, 0x0022aea5, 0x00b59b9f, 0x0186ee18, 0x0014e461}}, Y: Field{[10]uint32{0x0056152e, 0x01636746, 0x0052fabc, 0x01e9c848, 0x00cdbf72, 0x01c2e249, 0x02564a1e, 0x03b075f8, 0x00923052, 0x0031ffa8}}}, + {X: Field{[10]uint32{0x03ad6414, 0x0262ee8e, 0x00d4f679, 0x03ca356b, 0x01cc52d7, 0x01dd03d3, 0x0004abba, 0x02dc59d2, 0x01d9a0fa, 0x003de593}}, Y: Field{[10]uint32{0x01f62c59, 0x02b20d22, 0x03ccb31c, 0x008bc6ef, 0x02d469a1, 0x03b04779, 0x03dc5c2a, 0x03d8339e, 0x0364aba0, 0x001aa627}}}, + {X: Field{[10]uint32{0x01663183, 0x0167b6f3, 0x0258e720, 0x038ad6c5, 0x02ffd72e, 0x00c9f1bb, 0x000a909b, 0x03cb79e2, 0x008af514, 0x001d0723}}, Y: Field{[10]uint32{0x0087b2ae, 0x00915129, 0x01b49012, 0x00c7edbf, 0x02e40b6b, 0x022bf9cd, 0x013532d4, 0x00518371, 0x036de5de, 0x003cd749}}}, + {X: Field{[10]uint32{0x0347945a, 0x03e20d62, 0x037e9b2e, 0x03c4c485, 0x02606e55, 0x01bbd3c8, 0x02ea9f12, 0x028a2bf1, 0x01bf6cc2, 0x0037a31a}}, Y: Field{[10]uint32{0x00a48a02, 0x017292d0, 0x0052c8b8, 0x0108ec72, 0x0270d847, 0x013fdc19, 0x00e2fecb, 0x035851e0, 0x00536900, 0x0023798a}}}, + {X: Field{[10]uint32{0x0357c537, 0x0163a8db, 0x006afcd0, 0x03f66a11, 0x01d6a8d5, 0x00f7404d, 0x02523b2d, 0x02d07362, 0x0339619b, 0x0020785b}}, Y: Field{[10]uint32{0x03f4b31e, 0x0170996e, 0x0032f239, 0x0135f6eb, 0x00375c43, 0x01477bb1, 0x006de9b9, 0x03b32b45, 0x00737cd2, 0x0019e1bf}}}, + {X: Field{[10]uint32{0x026f988d, 0x008eab9e, 0x01a20f01, 0x00122ac8, 0x02e70f7f, 0x01c96cc2, 0x01625b8a, 0x02c8ba31, 0x0189d079, 0x001167a5}}, Y: Field{[10]uint32{0x03f38e08, 0x01fa310c, 0x0112ee76, 0x0069155d, 0x00915de2, 0x030d41b3, 0x02d26acc, 0x028a4b12, 0x02935b71, 0x00295bb7}}}, + {X: Field{[10]uint32{0x028ebddd, 0x013ce161, 0x03758228, 0x014746ae, 0x01f2e5bb, 0x01c2d3ab, 0x0018806a, 0x029ffc82, 0x03554fab, 0x002c1e75}}, Y: Field{[10]uint32{0x0274dffe, 0x016dc07f, 0x001dcfcf, 0x03115d18, 0x0120b6c0, 0x0390d3ea, 0x00f65773, 0x005d2c84, 0x002d552f, 0x00125777}}}, + {X: Field{[10]uint32{0x034f288b, 0x02af4b19, 0x00100569, 0x005cfc17, 0x00bb30af, 0x0356c42d, 0x0180de1d, 0x03ec8505, 0x03bb5983, 0x001d4e46}}, Y: Field{[10]uint32{0x02958d67, 0x0292bdf7, 0x0080db58, 0x00d347c7, 0x02b319f5, 0x004d694a, 0x026032f2, 0x012ae7ad, 0x02bac915, 0x0015f1e9}}}, + {X: Field{[10]uint32{0x01524db4, 0x02784d90, 0x03e7d5a8, 0x03dccbf2, 0x035bda94, 0x013f1a47, 0x0061069e, 0x023dd7f1, 0x0157f284, 0x001c50da}}, Y: Field{[10]uint32{0x033f0007, 0x014476f7, 0x0224fe92, 0x016973bc, 0x0195658a, 0x006e4f20, 0x022813c5, 0x02b75596, 0x0052ef4f, 0x0004a1fe}}}, + {X: Field{[10]uint32{0x01543f9c, 0x03263c50, 0x037853b7, 0x01adc9e7, 0x0094ad07, 0x00965c3b, 0x00c74c9e, 0x03425c37, 0x0333fa75, 0x002e40e2}}, Y: Field{[10]uint32{0x03cf838e, 0x01c2ac36, 0x02660734, 0x03cf5bd9, 0x02af59ce, 0x038e7235, 0x03c1bf48, 0x017b40fe, 0x01696929, 0x0028a30c}}}, + {X: Field{[10]uint32{0x01f86196, 0x022bc5e9, 0x034b083b, 0x02e759f0, 0x03f259bd, 0x01b6f832, 0x00664e63, 0x036403ef, 0x0028a9fb, 0x002cb18f}}, Y: Field{[10]uint32{0x0149ebdd, 0x0040fbb3, 0x012b0ee7, 0x008dbd70, 0x01b79207, 0x02544329, 0x03084218, 0x018f119c, 0x00fc069c, 0x002a3c14}}}, + {X: Field{[10]uint32{0x0017f39c, 0x00b31e89, 0x0128a5c9, 0x011bce3a, 0x01d06bf3, 0x03edf1e1, 0x027edfad, 0x008657d2, 0x01bea32b, 0x003374a9}}, Y: Field{[10]uint32{0x03fa621b, 0x02b775ad, 0x01f04d2d, 0x01320e0a, 0x02213386, 0x00ace02b, 0x0203ee72, 0x0070d80c, 0x0278ac42, 0x0002ad9b}}}, + {X: Field{[10]uint32{0x033db80f, 0x033e9867, 0x01c39780, 0x0031c93e, 0x01a27d74, 0x0220e3b1, 0x02f03a82, 0x029cdeb3, 0x0064b079, 0x00209742}}, Y: Field{[10]uint32{0x021071d3, 0x01c866d1, 0x02b43a87, 0x02b6f0b8, 0x01c2154f, 0x03817ae9, 0x027e427f, 0x011299fc, 0x00b7749e, 0x002fcfba}}}, + {X: Field{[10]uint32{0x035e24c7, 0x02e243ef, 0x02218608, 0x01dfc2c3, 0x01d0c364, 0x027d338f, 0x02930a87, 0x03d00b25, 0x023cbf6b, 0x000dede7}}, Y: Field{[10]uint32{0x00f66f1d, 0x016b40c4, 0x02e29204, 0x02cbdec3, 0x00c32a5b, 0x0084f0bc, 0x010ff4c9, 0x018c2e82, 0x02c7cec5, 0x00365c50}}}, + {X: Field{[10]uint32{0x012b6135, 0x008b0cd5, 0x039d8aed, 0x003beec1, 0x0389560b, 0x02d14baf, 0x01105bf5, 0x029d7502, 0x02d0678e, 0x003ee992}}, Y: Field{[10]uint32{0x011f938c, 0x00f02c83, 0x03e3bdf6, 0x0065f5b6, 0x035c628f, 0x02a01ab5, 0x01dd8441, 0x00dea2a1, 0x022de4e6, 0x0039994d}}}, + {X: Field{[10]uint32{0x00d9cf72, 0x028fe5fb, 0x027a859e, 0x0034610c, 0x03d3bd49, 0x021311db, 0x004897de, 0x034dbe76, 0x038e077e, 0x001d9e1e}}, Y: Field{[10]uint32{0x0180a9b3, 0x0336508e, 0x00158210, 0x022ccf59, 0x00e3ba22, 0x0075e37f, 0x0126011d, 0x00e30f30, 0x03141a3f, 0x00033de7}}}, + {X: Field{[10]uint32{0x00157b31, 0x00694340, 0x03e8a369, 0x02790be7, 0x01f16a12, 0x01986954, 0x026ba1c5, 0x028cd217, 0x01d0ffb3, 0x0009aeaf}}, Y: Field{[10]uint32{0x002c530d, 0x0101cb63, 0x008eee4c, 0x01c49fb7, 0x02e66a6c, 0x0080dc2c, 0x0266e33a, 0x00691bed, 0x02e2b1cf, 0x0006ce92}}}, + {X: Field{[10]uint32{0x0376307a, 0x000c75a7, 0x02008c1b, 0x03c8d811, 0x007ca4d3, 0x01dca7ca, 0x02aa8640, 0x0287a5e9, 0x03b77a2f, 0x00056bb6}}, Y: Field{[10]uint32{0x03073649, 0x033f65bf, 0x00788a6d, 0x01e14d53, 0x03f94088, 0x03017cda, 0x01746439, 0x008d81a9, 0x0142bf8b, 0x000cd0a8}}}, + {X: Field{[10]uint32{0x026fe467, 0x0003d5d1, 0x01fb3de1, 0x02837f79, 0x01c2b072, 0x01bbd330, 0x00d5767c, 0x03353f7d, 0x00a39bb7, 0x00263b38}}, Y: Field{[10]uint32{0x03227e28, 0x03d18faa, 0x02bba6f4, 0x00a5a829, 0x021e679d, 0x00e555b1, 0x0029d0f8, 0x024f9fae, 0x00a8218c, 0x00313a49}}}, + {X: Field{[10]uint32{0x03f373a9, 0x026daa0f, 0x03304198, 0x028becc8, 0x018a48cd, 0x0019eedc, 0x01ffafab, 0x00fbb533, 0x0105fc21, 0x001f619d}}, Y: Field{[10]uint32{0x0097d47c, 0x027bdd5f, 0x00c1b919, 0x03e233a8, 0x0096e167, 0x01290053, 0x03c417ef, 0x0081e065, 0x03f03c21, 0x00177d47}}}, + {X: Field{[10]uint32{0x01b3001f, 0x02dce8a5, 0x0117f410, 0x012275db, 0x02bf269a, 0x02c03578, 0x03ece8b7, 0x02387ef8, 0x01d74357, 0x003c93c6}}, Y: Field{[10]uint32{0x0223631f, 0x014d89c1, 0x0020d53e, 0x011d4520, 0x0116d2b5, 0x00d3d31e, 0x0048bbbb, 0x022d99ec, 0x03ff5544, 0x00191290}}}, + {X: Field{[10]uint32{0x000efd59, 0x0374ef20, 0x0227b923, 0x007480e6, 0x021fd106, 0x0352fa88, 0x0111281e, 0x00a5b87a, 0x03045c22, 0x0024e14c}}, Y: Field{[10]uint32{0x03eb7040, 0x03f9a662, 0x011628c2, 0x0087a7eb, 0x022607da, 0x01332417, 0x0399bbfe, 0x00b4543d, 0x00f600cd, 0x0008a623}}}, + {X: Field{[10]uint32{0x02319743, 0x014c7251, 0x01f0daf1, 0x03b2625f, 0x01b91ff4, 0x039349a1, 0x03b14ee8, 0x013c5894, 0x03053983, 0x003c2431}}, Y: Field{[10]uint32{0x000bd522, 0x0160d04a, 0x02d2abf1, 0x02326bce, 0x0228c59c, 0x014e80ad, 0x0208391f, 0x009c76a2, 0x00851d30, 0x003045c6}}}, + {X: Field{[10]uint32{0x02a78c6e, 0x01b34fbf, 0x038e67fb, 0x0022a401, 0x000df9bb, 0x00aa3abf, 0x00234aeb, 0x03cedd28, 0x00ecab5b, 0x0003a3f2}}, Y: Field{[10]uint32{0x02ddabe5, 0x001eca09, 0x035c29b0, 0x002d2439, 0x01a8397c, 0x018b829d, 0x02fcd713, 0x026edd1b, 0x016534ce, 0x00002c20}}}, + {X: Field{[10]uint32{0x03126785, 0x02835c67, 0x03aa09b0, 0x02eb200c, 0x03c7426d, 0x012bcdf8, 0x003cef69, 0x010f9cc0, 0x00d187cb, 0x00118963}}, Y: Field{[10]uint32{0x01ad4fc4, 0x02b48dd5, 0x006d4601, 0x02fdc20b, 0x0175576e, 0x030da608, 0x00dd82e2, 0x002089d9, 0x01a75f06, 0x00211850}}}, + {X: Field{[10]uint32{0x00a3e430, 0x02fb9ab3, 0x037a1e65, 0x03cd17e6, 0x0394109b, 0x010cd042, 0x01d27c3f, 0x021fbd4a, 0x033bdb38, 0x0039fce2}}, Y: Field{[10]uint32{0x02cd589f, 0x02b0d24a, 0x00f8109f, 0x02deb6f2, 0x00ab1faf, 0x02c1fa2b, 0x02dec0c0, 0x031c0a42, 0x00f15eae, 0x003d4910}}}, + {X: Field{[10]uint32{0x03537aec, 0x02c0e94b, 0x0062eda5, 0x019fdcff, 0x02fa9a01, 0x007d5a76, 0x03d5b750, 0x01e635d7, 0x00331472, 0x000b4a7a}}, Y: Field{[10]uint32{0x012d2be6, 0x025dba5e, 0x00001d18, 0x017d688c, 0x03d9e2f5, 0x00164d80, 0x03c58cfc, 0x02e7ea85, 0x011ab117, 0x0014b4f7}}}, + {X: Field{[10]uint32{0x0091ffb6, 0x025f470e, 0x03c7c8ac, 0x0291be50, 0x00f47609, 0x01d54b76, 0x03b44c9c, 0x029edddf, 0x009cabf7, 0x0028ecbb}}, Y: Field{[10]uint32{0x00fc19de, 0x0272efcf, 0x03417d55, 0x01856c06, 0x024d5280, 0x00a96b59, 0x00933852, 0x00e07d4c, 0x0070f091, 0x001b38e3}}}, + {X: Field{[10]uint32{0x0100f473, 0x03d974cc, 0x03015a21, 0x01896150, 0x026cefe7, 0x02cf46a3, 0x02504dda, 0x0295b039, 0x001e7582, 0x002bf2cf}}, Y: Field{[10]uint32{0x03171af8, 0x029db1a2, 0x004a38e5, 0x021d5ecb, 0x0367edbd, 0x03864c40, 0x02afc618, 0x02126629, 0x039dfbeb, 0x001aebc7}}}, + {X: Field{[10]uint32{0x010e2ac8, 0x00d58976, 0x006eccdd, 0x0129242e, 0x026650f7, 0x0119aa30, 0x022bbea9, 0x02559efd, 0x0212dc89, 0x00222cbc}}, Y: Field{[10]uint32{0x018c30a5, 0x01629934, 0x0208e7e4, 0x010b6652, 0x026ecd6c, 0x0285c8f8, 0x036d4f5d, 0x0054ff5f, 0x017bdef6, 0x001cff5d}}}, + {X: Field{[10]uint32{0x01adef3c, 0x02646f87, 0x000d493d, 0x01157125, 0x03395c59, 0x0369a8a9, 0x01c971d7, 0x00a45994, 0x029f4ca3, 0x0002ff7a}}, Y: Field{[10]uint32{0x01bc20d8, 0x02d93608, 0x00a17578, 0x01947db5, 0x004166bc, 0x02e01df3, 0x000adea5, 0x03da1108, 0x00447ef3, 0x00209d1c}}}, + {X: Field{[10]uint32{0x00973ae5, 0x00d91fb9, 0x0265b521, 0x0298f593, 0x00e8fdf6, 0x01247b3c, 0x012e3869, 0x0175a729, 0x0381aa76, 0x00175172}}, Y: Field{[10]uint32{0x03d019db, 0x03e0ac4b, 0x022bdb17, 0x03f8f2be, 0x00fdab36, 0x0040e9f7, 0x03517e7c, 0x01b5dddc, 0x032b51a7, 0x00292928}}}, + {X: Field{[10]uint32{0x02e7109d, 0x0019d4de, 0x033ae87d, 0x0249174b, 0x036d6fe0, 0x0310f976, 0x034fa531, 0x026652a8, 0x03cee14e, 0x003ce940}}, Y: Field{[10]uint32{0x03ec49e8, 0x0157957c, 0x01785ac5, 0x02e81cc9, 0x03568aa5, 0x006546d8, 0x0322daad, 0x0142d081, 0x00c0a24d, 0x000ac5c5}}}, + {X: Field{[10]uint32{0x00cbeeb5, 0x01ab78e2, 0x012d9b66, 0x014cdf47, 0x02042619, 0x02e39ae2, 0x00c225ea, 0x00bb4915, 0x036d6f81, 0x002530e9}}, Y: Field{[10]uint32{0x03a953e3, 0x0358e87b, 0x0104cbc8, 0x03eb59b8, 0x023d1351, 0x02fc6062, 0x00893b95, 0x019d1b75, 0x02e6aa40, 0x002ee273}}}, + {X: Field{[10]uint32{0x00f4c050, 0x0242323c, 0x02a3cc0c, 0x03446077, 0x01b9a2d3, 0x007f696f, 0x015a6625, 0x00900ce7, 0x02810523, 0x0008f6ff}}, Y: Field{[10]uint32{0x01eae6b2, 0x016e12d3, 0x036794e4, 0x0267502a, 0x00b5c168, 0x01e7b439, 0x00f8385c, 0x0043bd22, 0x0271229f, 0x0032bbce}}}, + {X: Field{[10]uint32{0x00bbf1d2, 0x00a7b1ab, 0x03b88e46, 0x03286d2e, 0x01d2dcbe, 0x015e4d7d, 0x01dc69dc, 0x02186704, 0x03d120ef, 0x000e41f8}}, Y: Field{[10]uint32{0x0015e853, 0x02611185, 0x00055ba2, 0x02f16288, 0x00e6aad1, 0x0324da11, 0x017b0a60, 0x00ae7730, 0x02b7d74e, 0x0010e3e5}}}, + {X: Field{[10]uint32{0x032b7d9c, 0x03c17859, 0x00b710e6, 0x012ccde2, 0x01651c94, 0x0101fd64, 0x02a6a373, 0x0013f602, 0x03193eeb, 0x00030502}}, Y: Field{[10]uint32{0x01e44072, 0x001dee4a, 0x02e641f7, 0x03bd0c34, 0x03899450, 0x001d8ed8, 0x01fef6b7, 0x01150e75, 0x011559e2, 0x002526ff}}}, + {X: Field{[10]uint32{0x032ea56c, 0x02951f83, 0x028d1740, 0x02dac1b8, 0x002563c3, 0x00c3dd79, 0x012fe269, 0x00e72077, 0x005bc96a, 0x0025df3c}}, Y: Field{[10]uint32{0x02a10d52, 0x03039ae6, 0x02dc0e70, 0x01e0daa7, 0x0307e158, 0x01b291a2, 0x0295e234, 0x005930db, 0x023a8508, 0x0000e00b}}}, + {X: Field{[10]uint32{0x00a034e3, 0x009ec836, 0x003761e8, 0x02ce7b8f, 0x02795a7b, 0x039395fd, 0x0151e5a9, 0x0383532b, 0x00d63995, 0x00041a70}}, Y: Field{[10]uint32{0x027fe33b, 0x03065316, 0x028041d2, 0x02b1e23f, 0x0047963a, 0x02aed792, 0x01d89c47, 0x01319560, 0x00879c0e, 0x00386a85}}}, + {X: Field{[10]uint32{0x013e3682, 0x02096cf2, 0x0245bba3, 0x03d4d49e, 0x0142419a, 0x0138a9d5, 0x03ab10c7, 0x010607fc, 0x0280c341, 0x003fde31}}, Y: Field{[10]uint32{0x00d3615e, 0x0128dd89, 0x0256e1fc, 0x01d37cbc, 0x0186c8c5, 0x002cb6fb, 0x032382e2, 0x0243cdda, 0x02dbf053, 0x003badc2}}}, + {X: Field{[10]uint32{0x02bcddc7, 0x01abf661, 0x03d05905, 0x01af570d, 0x002b0cb2, 0x020e29a8, 0x004c3ff5, 0x00f5aa70, 0x03033acd, 0x0017b27a}}, Y: Field{[10]uint32{0x032aff03, 0x0099d25c, 0x01c8b9ae, 0x02d230ea, 0x03e39d92, 0x03651170, 0x000bed1e, 0x0037c05f, 0x03f60eed, 0x0024a8a1}}}, + {X: Field{[10]uint32{0x031b37d1, 0x0363b211, 0x03ee9339, 0x01369f71, 0x00bef0a5, 0x0236f1fa, 0x0267e14d, 0x034d2dfb, 0x02ba792d, 0x003aa881}}, Y: Field{[10]uint32{0x011ee92e, 0x0041f1a3, 0x025e2695, 0x008475e3, 0x0355e00d, 0x01030585, 0x02f2530c, 0x027281ff, 0x025ebe71, 0x00155df9}}}, + {X: Field{[10]uint32{0x00eb3ed7, 0x014abf43, 0x03f54af9, 0x023b4f61, 0x02689ef0, 0x01573be8, 0x036789d4, 0x0004a8f5, 0x02f56034, 0x0009b418}}, Y: Field{[10]uint32{0x01323424, 0x02d60db4, 0x011094e7, 0x02896b3a, 0x01dbe6fa, 0x00347db7, 0x00340c5f, 0x0161de67, 0x01acef6f, 0x0017bfc7}}}, + {X: Field{[10]uint32{0x02602d48, 0x03c89c47, 0x03bd1492, 0x03e70d06, 0x021a2413, 0x0047b6a3, 0x009e449d, 0x02d8a93d, 0x015ae50d, 0x00200350}}, Y: Field{[10]uint32{0x0002eb50, 0x0255fd5f, 0x036fbdc5, 0x0039d580, 0x03d5c8cb, 0x0344b67c, 0x019ec5cf, 0x026d748a, 0x016d05d1, 0x0015a72b}}}, + {X: Field{[10]uint32{0x009a1c90, 0x00f189e7, 0x006bb985, 0x02f83e16, 0x02e1531f, 0x0068859d, 0x03aaca5f, 0x0370665c, 0x0352bc16, 0x001b0068}}, Y: Field{[10]uint32{0x00cc04e7, 0x01cec63e, 0x027654c0, 0x034b5935, 0x01a39a17, 0x0095204e, 0x027226ab, 0x01a83c9d, 0x0342c959, 0x0020cf75}}}, + {X: Field{[10]uint32{0x03742c26, 0x01390c4d, 0x038e80a5, 0x02e3423b, 0x01f0b914, 0x01ce346b, 0x00e7c4d4, 0x03fc3141, 0x0122f1b3, 0x000eb332}}, Y: Field{[10]uint32{0x03cb0ad7, 0x0026b2c0, 0x00b1786a, 0x00620b84, 0x0152a2d1, 0x014aca5e, 0x00dee26c, 0x002cd0c1, 0x008327d6, 0x002aa735}}}, + {X: Field{[10]uint32{0x00f8ec72, 0x01c3fc74, 0x03edf2ec, 0x0307b9ba, 0x02f8d978, 0x03e398d4, 0x0380f753, 0x01cfc828, 0x0072828b, 0x002837d7}}, Y: Field{[10]uint32{0x00ac6670, 0x01ea27e9, 0x0230680d, 0x02dbac3b, 0x02b1327d, 0x01e79c8c, 0x02226893, 0x02f44c79, 0x01bef1e0, 0x002c8c2b}}}, + {X: Field{[10]uint32{0x03b52c73, 0x015ee5cc, 0x005a449d, 0x01c34ffe, 0x02d4bbc9, 0x01521971, 0x03a8dbbd, 0x03b26181, 0x01949776, 0x002757c3}}, Y: Field{[10]uint32{0x00afc1a8, 0x03a83c80, 0x02cf202c, 0x0055f446, 0x01ad7faf, 0x03d834d1, 0x038a056f, 0x00eb7552, 0x03baf489, 0x003fc23b}}}, + {X: Field{[10]uint32{0x01d3d84e, 0x03c8421b, 0x00917fb7, 0x02d699ce, 0x00228f54, 0x022947b2, 0x025b2935, 0x0208bb7a, 0x012d9ea1, 0x0037bd76}}, Y: Field{[10]uint32{0x008b3129, 0x01667b80, 0x0307a479, 0x002b5f00, 0x039d5bc2, 0x000affcd, 0x00d3ad02, 0x03af0c4e, 0x000db94a, 0x0002db1d}}}, + {X: Field{[10]uint32{0x00df33de, 0x010b9961, 0x03832736, 0x03c6e9ba, 0x03643fb0, 0x03d341d7, 0x007136c0, 0x035d38fe, 0x0105cdc8, 0x003ea42c}}, Y: Field{[10]uint32{0x00bba36d, 0x01e77a94, 0x00c273c0, 0x02494989, 0x003a180d, 0x003c3891, 0x029e852f, 0x023ae927, 0x00c373f5, 0x000f9aca}}}, + {X: Field{[10]uint32{0x03d0eb52, 0x02e33468, 0x02349575, 0x02ca5c1a, 0x01ce077c, 0x0353677e, 0x01c84613, 0x01ee4300, 0x0021ff2f, 0x002084ba}}, Y: Field{[10]uint32{0x003185f0, 0x0390ffdc, 0x02b5b8f8, 0x03b4b22b, 0x01d24bb5, 0x00d5018e, 0x0256e8f3, 0x039d5bf6, 0x01db2fa3, 0x00356701}}}, + {X: Field{[10]uint32{0x0061220d, 0x0362c83b, 0x00e49f9c, 0x02dcabed, 0x0124f155, 0x00074579, 0x01a641e1, 0x01c75d2c, 0x00c81d1f, 0x003b8d03}}, Y: Field{[10]uint32{0x02286f37, 0x020ce0ab, 0x01438f00, 0x007bd604, 0x0086f814, 0x02a3a2c1, 0x02fa7964, 0x017f5fc7, 0x033f2535, 0x00245760}}}, + {X: Field{[10]uint32{0x002afee1, 0x009bd951, 0x026b50aa, 0x0025fe0d, 0x02302b50, 0x02dc88f8, 0x00b257fb, 0x00f60dd0, 0x0125dd2e, 0x000b14d5}}, Y: Field{[10]uint32{0x021cf765, 0x01c9c4ed, 0x03947672, 0x01e5fdcf, 0x0292d43a, 0x03ced500, 0x038f9662, 0x02d9a13c, 0x014ef945, 0x00073514}}}, + {X: Field{[10]uint32{0x0267d94d, 0x026b517e, 0x00f2baae, 0x0075ba05, 0x03404b9e, 0x00a97e5d, 0x00a9083a, 0x028a233d, 0x03cf8b57, 0x0037ddd8}}, Y: Field{[10]uint32{0x01580ce2, 0x030ceb2c, 0x0309cb4f, 0x01706a49, 0x01bf0529, 0x00e23ba7, 0x02276bdd, 0x02d23184, 0x033631fd, 0x0013df70}}}, + {X: Field{[10]uint32{0x00dcee60, 0x0049a83b, 0x00da18fd, 0x023d3579, 0x038ff99b, 0x0335b418, 0x0374b928, 0x03c86044, 0x0240d6d0, 0x000d4530}}, Y: Field{[10]uint32{0x0197fca2, 0x00297190, 0x035cee53, 0x02c9c825, 0x02ac17ab, 0x01ddfb46, 0x018421c7, 0x02be00f2, 0x034a1a1b, 0x000a8347}}}, + {X: Field{[10]uint32{0x02e40a27, 0x012f4f1a, 0x0360a0b5, 0x016364d7, 0x00237a1b, 0x02d50755, 0x01de551a, 0x032e0653, 0x01d9e58b, 0x0000f79d}}, Y: Field{[10]uint32{0x01d97c75, 0x02cae349, 0x03ddc455, 0x036bf756, 0x033ec422, 0x01bc940d, 0x03ad8c48, 0x02c1631a, 0x00dbbe2d, 0x0026b685}}}, + {X: Field{[10]uint32{0x01e0420f, 0x0228229b, 0x005ddae2, 0x014bd40b, 0x0290ad3d, 0x0357ac70, 0x00144f81, 0x00d56f17, 0x020b1804, 0x0029ca33}}, Y: Field{[10]uint32{0x03ddad3d, 0x00f40051, 0x004f7ac9, 0x02e7b0cd, 0x0142cce3, 0x0215247f, 0x034893fa, 0x0146833e, 0x00a8f72b, 0x0010e1f3}}}, + {X: Field{[10]uint32{0x0151c39b, 0x00761d15, 0x0032e16c, 0x02aeaa50, 0x011d8234, 0x0140ea05, 0x03b22e02, 0x01130251, 0x028a05b8, 0x003b0f26}}, Y: Field{[10]uint32{0x02bd7fa6, 0x01790423, 0x03043382, 0x033ba0da, 0x00c8ac51, 0x013b7eba, 0x00845ca4, 0x03ea4d98, 0x00ef45f0, 0x001ec22f}}}, + {X: Field{[10]uint32{0x024761db, 0x023b1568, 0x02e9326a, 0x0333a61c, 0x03e619e7, 0x005d4cb3, 0x02b7e6c6, 0x016b2cee, 0x01562494, 0x002c05cf}}, Y: Field{[10]uint32{0x01f1b381, 0x0246b8c1, 0x0310d445, 0x03cc4c83, 0x0172a81d, 0x026372c4, 0x03eff121, 0x001d8743, 0x035f3e9a, 0x001e349e}}}, + {X: Field{[10]uint32{0x00cd73f6, 0x03658010, 0x023a7970, 0x0047e565, 0x034e04bd, 0x034e92e3, 0x03c3890e, 0x03722e5d, 0x03f3cd43, 0x00367ace}}, Y: Field{[10]uint32{0x03b23044, 0x016cbf58, 0x01c41e7f, 0x039326da, 0x000510b9, 0x02314012, 0x01db7189, 0x020228fc, 0x035cc42e, 0x0026065a}}}, + {X: Field{[10]uint32{0x01a84e74, 0x01530219, 0x03f107ca, 0x02c07009, 0x0029bbf1, 0x007e4ace, 0x02026062, 0x008c2b1d, 0x01af8a40, 0x003ef694}}, Y: Field{[10]uint32{0x00d6ccf5, 0x00944eff, 0x03c71e81, 0x02e8eef9, 0x038fd427, 0x024043f2, 0x00729e4e, 0x00ef5532, 0x0194aa45, 0x001920ce}}}, + {X: Field{[10]uint32{0x02583f9d, 0x03e1cbee, 0x02cf808a, 0x0317c14c, 0x03472b14, 0x00498beb, 0x01646616, 0x0065983d, 0x01a751be, 0x0002b92e}}, Y: Field{[10]uint32{0x0295ee5e, 0x019cb925, 0x02281f4b, 0x01e3693e, 0x03e2bd40, 0x02b4ead7, 0x00c6eed9, 0x01f969bc, 0x008baa9d, 0x0022cb09}}}, + {X: Field{[10]uint32{0x00cf6ff5, 0x02db8313, 0x036dda40, 0x0380c7b7, 0x00f29764, 0x0118a117, 0x028c6a2e, 0x02009859, 0x01520608, 0x00160100}}, Y: Field{[10]uint32{0x03329485, 0x0069c076, 0x030cd5fb, 0x023ffb41, 0x00a2e5f8, 0x00e65db6, 0x032f9a4e, 0x03013681, 0x02e64a83, 0x0034be5a}}}, + {X: Field{[10]uint32{0x007e029e, 0x029cc993, 0x0203b57c, 0x0098711a, 0x03cf477e, 0x02bf3d1f, 0x01abbd9f, 0x003e058e, 0x02865738, 0x00130a35}}, Y: Field{[10]uint32{0x00ed8a70, 0x02c09383, 0x0202259f, 0x01045436, 0x023122a9, 0x02b3eb05, 0x02a67e80, 0x01785015, 0x029c4fa7, 0x001a52e2}}}, + {X: Field{[10]uint32{0x0325c9a4, 0x016a4b3f, 0x026b9046, 0x01ddc5e6, 0x016984fc, 0x03601be0, 0x03b51a73, 0x01561fc8, 0x02b39e00, 0x00378816}}, Y: Field{[10]uint32{0x01273d83, 0x0170c9f1, 0x011355af, 0x010a6bb2, 0x0048f68e, 0x03ab304b, 0x002cf1f0, 0x03070b6d, 0x025e12ef, 0x003b610c}}}, + {X: Field{[10]uint32{0x014273f4, 0x031ada56, 0x025f1b3e, 0x0225b48a, 0x01b968f5, 0x0087995c, 0x0258dd57, 0x02c29d2d, 0x00680c2c, 0x0017aa0a}}, Y: Field{[10]uint32{0x004a9499, 0x008df48e, 0x038ad6e2, 0x00e40794, 0x00e18285, 0x00dbdb16, 0x02decce6, 0x0193e04e, 0x02b08db2, 0x00223443}}}, + {X: Field{[10]uint32{0x024998ba, 0x00b40d8c, 0x03c9c37f, 0x011b5ee6, 0x03c3b0dd, 0x038f6d39, 0x00bd98a3, 0x01d05908, 0x03c86449, 0x0006273d}}, Y: Field{[10]uint32{0x02daa083, 0x00960087, 0x03da204d, 0x0235c8fd, 0x01742211, 0x01f7581b, 0x0201b1cf, 0x03fca0d9, 0x01ced46d, 0x002ecd02}}}, + {X: Field{[10]uint32{0x0082789f, 0x014dbe6f, 0x0214d3cf, 0x035e3b97, 0x013c3c41, 0x02040091, 0x00680265, 0x00350c22, 0x018738f5, 0x001c285c}}, Y: Field{[10]uint32{0x0027c1d6, 0x0118b5ef, 0x022962b9, 0x0116a7cd, 0x02101dc4, 0x023c2747, 0x03338701, 0x014df907, 0x0120e112, 0x00057254}}}, + {X: Field{[10]uint32{0x03b3a368, 0x011ae6c3, 0x03865cff, 0x02a91a0c, 0x018e4271, 0x00c04421, 0x0020eedf, 0x036db823, 0x00ff622a, 0x0015e2b0}}, Y: Field{[10]uint32{0x03d7f851, 0x007296ee, 0x0215f1f0, 0x03d4759f, 0x026b0cea, 0x03542062, 0x01b2f7d9, 0x005cb4ae, 0x01ddf5f3, 0x003dc468}}}, + {X: Field{[10]uint32{0x01840071, 0x02c178a3, 0x01aea3e3, 0x01dfe9b3, 0x035887f1, 0x0373a296, 0x00738bad, 0x029d1f59, 0x0003476a, 0x003727ef}}, Y: Field{[10]uint32{0x01eee1b4, 0x03c293a2, 0x03ab9515, 0x01d33d39, 0x008bd267, 0x00a53954, 0x0194a19d, 0x037497e3, 0x012c8087, 0x00303d9d}}}, + {X: Field{[10]uint32{0x03b0294d, 0x02548551, 0x0178fe02, 0x0371165b, 0x014bb817, 0x00f5cc54, 0x004dec0b, 0x03357cba, 0x00ffa348, 0x0025d26b}}, Y: Field{[10]uint32{0x0381a1c6, 0x03a13815, 0x0116723d, 0x03265140, 0x03d89856, 0x0039f480, 0x02ec20be, 0x0120436b, 0x01ea35e5, 0x0037d99f}}}, + {X: Field{[10]uint32{0x02657d85, 0x034d0f8c, 0x032e8e92, 0x02635ac4, 0x00ae8e7a, 0x02a0551e, 0x0359f21f, 0x01cc370c, 0x01cf2fd2, 0x0038e7ef}}, Y: Field{[10]uint32{0x01b5e01c, 0x001ac2f9, 0x0028320a, 0x01e230c7, 0x02624415, 0x01922168, 0x026ae3e3, 0x021659da, 0x008170a7, 0x002ebfa6}}}, + {X: Field{[10]uint32{0x01402c09, 0x02ae2fe4, 0x02b89e0f, 0x00a83a8c, 0x02e04b69, 0x03244d45, 0x000bda4d, 0x00dc4830, 0x014e27f1, 0x00180240}}, Y: Field{[10]uint32{0x02359f6b, 0x01826750, 0x032e5708, 0x02a1b3b0, 0x01eb4006, 0x0376e998, 0x0396f588, 0x00734b2d, 0x0094f6bd, 0x000d2442}}}, + {X: Field{[10]uint32{0x03f2f773, 0x025223a1, 0x02162d41, 0x00b50d88, 0x03b644c9, 0x01dacfbb, 0x039bec4f, 0x011b60be, 0x0247d02e, 0x002fc13c}}, Y: Field{[10]uint32{0x002172f6, 0x0073af1f, 0x0284d32b, 0x016f07b5, 0x00302e12, 0x019d38d5, 0x019ab004, 0x00b9303c, 0x00e8bb3c, 0x003591bd}}}, + {X: Field{[10]uint32{0x01e5e3c3, 0x0137ea8c, 0x01acff5b, 0x02af0c3a, 0x013e5468, 0x00571b66, 0x0071efd9, 0x02cd4e16, 0x03ecb122, 0x0025827d}}, Y: Field{[10]uint32{0x008f9a27, 0x02d43766, 0x015925d6, 0x03e7bae5, 0x01ebb4d9, 0x0138ab62, 0x0178ac77, 0x03c2e1c5, 0x012eb933, 0x00041af1}}}, + {X: Field{[10]uint32{0x03ab9abe, 0x00ab5882, 0x033668da, 0x007537b1, 0x03f5ae58, 0x032f7d5b, 0x03440fb5, 0x02f89681, 0x003a0e1e, 0x002da433}}, Y: Field{[10]uint32{0x0049dbd1, 0x019aa5f8, 0x0135fb96, 0x03d89269, 0x0335e5f9, 0x02db0595, 0x01a96032, 0x00f76cb3, 0x0023fd3a, 0x0020f340}}}, + {X: Field{[10]uint32{0x01d326d4, 0x00025de4, 0x0338d6cd, 0x0120e56f, 0x002c9479, 0x02a42636, 0x022bc114, 0x01dd106a, 0x008ced50, 0x001cb694}}, Y: Field{[10]uint32{0x03668457, 0x03ed19cf, 0x03e095ea, 0x036ee045, 0x02e5d743, 0x03fb248b, 0x01780364, 0x03a8ac3a, 0x02933433, 0x000596ea}}}, + {X: Field{[10]uint32{0x01851c37, 0x00726dea, 0x0101729b, 0x006e6174, 0x01113320, 0x004969cb, 0x014322f5, 0x00c024a5, 0x016e540a, 0x00383f44}}, Y: Field{[10]uint32{0x01b88a92, 0x024117b9, 0x017ac850, 0x01addde6, 0x01a516a0, 0x00c34c55, 0x01e899d6, 0x01c1f952, 0x027648aa, 0x0031af1c}}}, + {X: Field{[10]uint32{0x00c10af1, 0x00ada0a5, 0x01c13abe, 0x007341a5, 0x030297f0, 0x0220fe76, 0x00d6389e, 0x03904bb8, 0x03ea85d4, 0x002752e2}}, Y: Field{[10]uint32{0x03556181, 0x014962a5, 0x038d38a9, 0x02ef9a28, 0x035bb66e, 0x02a2125c, 0x02e62fd6, 0x0020cb66, 0x00d73f7c, 0x001788a0}}}, + {X: Field{[10]uint32{0x008e08ff, 0x01e8b50e, 0x02d25505, 0x01547085, 0x01069f12, 0x0357acc7, 0x0056123c, 0x01b81377, 0x0395aa4b, 0x003bbe10}}, Y: Field{[10]uint32{0x022d2376, 0x035ad875, 0x039280b1, 0x01b56658, 0x0087797e, 0x00c5e712, 0x018b26c7, 0x010d9103, 0x02a434e1, 0x00114262}}}, + {X: Field{[10]uint32{0x010d7654, 0x02845972, 0x00de739a, 0x02bdb983, 0x03b4652d, 0x01dbbd09, 0x034371e0, 0x02392184, 0x007d56e3, 0x0019bf97}}, Y: Field{[10]uint32{0x011a2fba, 0x022a1370, 0x02582a10, 0x021259b2, 0x0196d4c3, 0x032edb13, 0x000ad433, 0x0324edf9, 0x026bb6ed, 0x000b5ca4}}}, + {X: Field{[10]uint32{0x008ea2ed, 0x031b7cb0, 0x027afdc2, 0x030a4e7c, 0x0082f9e1, 0x02a60f26, 0x015a304a, 0x032bb331, 0x01cc1818, 0x00144d7e}}, Y: Field{[10]uint32{0x003f22d6, 0x028d8878, 0x0295427c, 0x03851e61, 0x002619b5, 0x0056b86d, 0x00baf4e1, 0x005d413e, 0x01d27dfe, 0x0016949b}}}, + {X: Field{[10]uint32{0x026487ca, 0x03e6d88f, 0x0229c3fd, 0x022b386b, 0x0182e331, 0x008a8f8a, 0x03fa2bcc, 0x012a700b, 0x0089af7f, 0x00068df0}}, Y: Field{[10]uint32{0x012464a5, 0x0157fc0f, 0x02c183c9, 0x0048d74b, 0x03509b03, 0x01cd9cb3, 0x02b33d23, 0x008c2ea5, 0x00338522, 0x0034e270}}}, + {X: Field{[10]uint32{0x03a248a0, 0x00461211, 0x01576e4a, 0x00888bec, 0x01ed1edb, 0x02405be5, 0x03c68dfc, 0x02bd0244, 0x01ff15da, 0x00127de9}}, Y: Field{[10]uint32{0x01abd8fd, 0x0231e9ee, 0x03f611a1, 0x02086975, 0x00d5ebec, 0x029aefbd, 0x0394246f, 0x01ef27a5, 0x03013d63, 0x003e6d56}}}, + {X: Field{[10]uint32{0x02641ed7, 0x02abe207, 0x03130253, 0x00d6b0eb, 0x003b87f8, 0x01bac11c, 0x03f0f1e2, 0x03e0e481, 0x005e5d9e, 0x002091e1}}, Y: Field{[10]uint32{0x013c5f1e, 0x01102a79, 0x011de3e2, 0x023c8fce, 0x03b4409c, 0x032d0ab5, 0x01b19474, 0x026139fc, 0x010c1a23, 0x0015df5e}}}, + {X: Field{[10]uint32{0x010e0749, 0x006164f6, 0x024fb8f1, 0x00f897ba, 0x0257b782, 0x00214fa3, 0x0292ef61, 0x000906b3, 0x004ecd16, 0x0020a566}}, Y: Field{[10]uint32{0x00ac8353, 0x0236f230, 0x003c14c3, 0x0259e032, 0x022c5dac, 0x01ec70e2, 0x02450e76, 0x0357dce6, 0x01a66798, 0x0018d4c8}}}, + {X: Field{[10]uint32{0x01d75461, 0x03a7200f, 0x015377b2, 0x004ac4d0, 0x01fb5db4, 0x01c31a2d, 0x00ba34e7, 0x03d7fef8, 0x03f6d8fc, 0x003530ca}}, Y: Field{[10]uint32{0x0085f93d, 0x014fd991, 0x03353741, 0x01459b44, 0x01a1a71e, 0x03b69c2e, 0x004272b4, 0x0116ccb1, 0x0202e238, 0x002cf1cd}}}, + {X: Field{[10]uint32{0x00c897ff, 0x00fdda5b, 0x00d849fd, 0x0329a20b, 0x023babe7, 0x02d49a8c, 0x00703af6, 0x01a39a91, 0x032d04a9, 0x00068238}}, Y: Field{[10]uint32{0x03ad4141, 0x02caa3ab, 0x00b399a6, 0x0025c0d1, 0x013fdc82, 0x00ac52a3, 0x002e19be, 0x03b52897, 0x00bdb77b, 0x0011bb66}}}, + {X: Field{[10]uint32{0x014f4af7, 0x03f70d0d, 0x01e82e7c, 0x03bb3927, 0x036b40e1, 0x02a325dd, 0x0305965d, 0x00fc1012, 0x020e9672, 0x0021566f}}, Y: Field{[10]uint32{0x01333ef6, 0x000f7524, 0x02dc05af, 0x037aae90, 0x02ba4db6, 0x0374241a, 0x03f049b2, 0x008344b0, 0x0388854e, 0x0018f892}}}, + {X: Field{[10]uint32{0x01e211e8, 0x022f7181, 0x008c55e2, 0x0237a333, 0x02edd0f0, 0x03cbbca9, 0x01c0ee30, 0x011e2a12, 0x0223fc7a, 0x0038382c}}, Y: Field{[10]uint32{0x03ca60fc, 0x03580de7, 0x00d1a511, 0x017b44a2, 0x0206609a, 0x016e211e, 0x02d38e12, 0x03eb0481, 0x032c3aaf, 0x00328e20}}}, + {X: Field{[10]uint32{0x00e40a19, 0x014e739a, 0x034e2034, 0x009159e6, 0x00265c34, 0x0245d60b, 0x0001eaa5, 0x034941d6, 0x02982d8e, 0x00288def}}, Y: Field{[10]uint32{0x02231318, 0x0260a956, 0x0087cf48, 0x00ca400f, 0x00dc1bfc, 0x0009b59a, 0x00d5de47, 0x00de0115, 0x0227976a, 0x0003d334}}}, + {X: Field{[10]uint32{0x0205ccf2, 0x03e6d804, 0x03ef2474, 0x035ad0d9, 0x005edbd0, 0x0285bcaf, 0x03fe7705, 0x02341fc0, 0x00821eb0, 0x000a2a12}}, Y: Field{[10]uint32{0x0056a17c, 0x02d7f0fe, 0x02301eec, 0x02f7c03e, 0x01162551, 0x00748f6a, 0x00526b17, 0x01d8a2e8, 0x03e9e7d7, 0x002419f4}}}, + {X: Field{[10]uint32{0x00c1d5e8, 0x01a6b726, 0x01d16f4c, 0x03b84f56, 0x03cc83e2, 0x02083796, 0x01b8fdc3, 0x01ad74c9, 0x00d542bd, 0x00050bfa}}, Y: Field{[10]uint32{0x0075b150, 0x00c42877, 0x004539c8, 0x00186fe7, 0x001b66d1, 0x0235fe98, 0x01d14213, 0x00cee556, 0x02780325, 0x000a5cfc}}}, + {X: Field{[10]uint32{0x00ad87d2, 0x01ec04a6, 0x036b99c9, 0x03edc03e, 0x008f3d5f, 0x006d2e4a, 0x01bb00a1, 0x01927406, 0x011c5d20, 0x0016ced8}}, Y: Field{[10]uint32{0x02519182, 0x032d62bc, 0x0058f8eb, 0x021d688b, 0x00192ead, 0x03b5c2ed, 0x03a76219, 0x00384b37, 0x01c80cde, 0x00212416}}}, + {X: Field{[10]uint32{0x00beb8af, 0x00b1f394, 0x00f6b019, 0x018e5153, 0x012edbdc, 0x03cd7dbd, 0x01f74c35, 0x00168fd8, 0x02495d49, 0x00092288}}, Y: Field{[10]uint32{0x03fd4c83, 0x00dab1ee, 0x035c3b11, 0x00fa6e26, 0x0161eaf7, 0x02219e87, 0x0197b243, 0x03042073, 0x03ffb707, 0x002d69bc}}}, + {X: Field{[10]uint32{0x03ff075c, 0x00e134f6, 0x025d2875, 0x024c0b4e, 0x0231ea20, 0x008a408f, 0x011fa99a, 0x0143a753, 0x022a292b, 0x002291d2}}, Y: Field{[10]uint32{0x03804dd9, 0x035ad97b, 0x01dc8721, 0x01174c35, 0x0245b5f0, 0x01b3e3f4, 0x00392891, 0x0106c797, 0x005c7d53, 0x001dd14a}}}, + {X: Field{[10]uint32{0x0015ffec, 0x023444d4, 0x03b228ca, 0x03492356, 0x03826d10, 0x0198dcc4, 0x00be4ea8, 0x010ba99f, 0x02557fc0, 0x000fe804}}, Y: Field{[10]uint32{0x02a937b3, 0x01d7c9c9, 0x00b25e3f, 0x01b28c8a, 0x00162d43, 0x02312386, 0x03dca5a5, 0x012e3bb2, 0x0325f59b, 0x00042e74}}}, + {X: Field{[10]uint32{0x03d65648, 0x03086567, 0x028c046a, 0x017f22a0, 0x036b778d, 0x02bc126c, 0x008f0071, 0x03c69376, 0x000e7b94, 0x002dded7}}, Y: Field{[10]uint32{0x02aeccc5, 0x032c55fe, 0x0021ad54, 0x00ba77db, 0x01e2b65d, 0x01bb7582, 0x01d57222, 0x02efaa32, 0x03c06722, 0x000c491a}}}, + {X: Field{[10]uint32{0x0135b44a, 0x03107fe1, 0x018e08f2, 0x01bb5747, 0x00567184, 0x026f52ed, 0x02ccad78, 0x00ae5db0, 0x008267e8, 0x00098d7d}}, Y: Field{[10]uint32{0x032b8def, 0x01b569e9, 0x0234dafb, 0x02702d4c, 0x010d2ce3, 0x01edcd4f, 0x03f9e4d4, 0x0247ed99, 0x004e9560, 0x001fb720}}}, + {X: Field{[10]uint32{0x021b474d, 0x0382198d, 0x032384a4, 0x0368635d, 0x03ed0012, 0x0347a8da, 0x036f39b6, 0x014b271a, 0x012dae09, 0x0008c1ad}}, Y: Field{[10]uint32{0x025486c0, 0x02d5b3cc, 0x01221582, 0x01caf348, 0x00bd7674, 0x00b3bf3d, 0x023688bb, 0x023dae69, 0x00b88d7b, 0x0010e094}}}, + {X: Field{[10]uint32{0x01f74b4c, 0x03625eea, 0x0016e248, 0x03baa300, 0x03aa5604, 0x03568747, 0x0186f9ee, 0x020a123d, 0x02b80dde, 0x0032aa19}}, Y: Field{[10]uint32{0x0009c341, 0x012957f7, 0x038f2995, 0x029f563e, 0x00e33746, 0x02016909, 0x02834ceb, 0x01e3115c, 0x0140349f, 0x000a063c}}}, + {X: Field{[10]uint32{0x00bb1641, 0x031c3fa2, 0x037cbb74, 0x01eec949, 0x03fb5e57, 0x027007b4, 0x01e9cc42, 0x00f5417d, 0x035aa079, 0x0020637b}}, Y: Field{[10]uint32{0x024f276d, 0x02cfb8bb, 0x0045fbdd, 0x02d24e85, 0x01f48ea2, 0x0258d9f4, 0x022d54d7, 0x0040c603, 0x0280f762, 0x0036a7bb}}}, + {X: Field{[10]uint32{0x007bf736, 0x00b7e491, 0x01bf08b1, 0x030d68a5, 0x03c36e11, 0x02f2b16e, 0x0364ed01, 0x0104bf35, 0x01fa568d, 0x000b18b3}}, Y: Field{[10]uint32{0x02c31979, 0x0301468f, 0x025a8f82, 0x02fc654c, 0x00ee73ea, 0x02ae9906, 0x01ef9859, 0x01c189c1, 0x00255811, 0x003a2e38}}}, + {X: Field{[10]uint32{0x01f04adb, 0x033a01f8, 0x0341659b, 0x006adbac, 0x014e477f, 0x0145f412, 0x022f7cd0, 0x01ba3352, 0x00d99db0, 0x000a2ad5}}, Y: Field{[10]uint32{0x0094541c, 0x028a799d, 0x03b0872a, 0x00107b2f, 0x004fb003, 0x03cf9f61, 0x0256276b, 0x02580af9, 0x0319a5cb, 0x00264ed4}}}, + {X: Field{[10]uint32{0x012b6061, 0x01205314, 0x03bb63ea, 0x03d7c57a, 0x01d6c2ab, 0x008ea090, 0x034eca42, 0x02903152, 0x00162254, 0x00124f9f}}, Y: Field{[10]uint32{0x00eed628, 0x03e02e8f, 0x02c897de, 0x01efc25f, 0x025fcf81, 0x02ba3c87, 0x0236b597, 0x027533fb, 0x037b588d, 0x00158e1f}}}, + {X: Field{[10]uint32{0x01c51d4f, 0x034818ae, 0x01bce902, 0x023888b2, 0x018922a6, 0x00b174e2, 0x02118dda, 0x0245953f, 0x01bee743, 0x0019cb84}}, Y: Field{[10]uint32{0x03dc36e1, 0x000b70c8, 0x03c5fc51, 0x03eaff39, 0x030db6bb, 0x017a758a, 0x03cfbca4, 0x00aa76d2, 0x034a0238, 0x000d5544}}}, + {X: Field{[10]uint32{0x02da550a, 0x022cb0e3, 0x02701003, 0x00b0a567, 0x0027524b, 0x0167e397, 0x0286c06b, 0x01a22637, 0x036ee3b8, 0x0023e343}}, Y: Field{[10]uint32{0x01212f34, 0x005c40d2, 0x01fd45d4, 0x01b09afc, 0x03f36429, 0x021ef2ce, 0x000fed66, 0x02af1665, 0x02819e27, 0x0039f7bc}}}, + {X: Field{[10]uint32{0x00b293e3, 0x004fed5e, 0x01495e82, 0x00084817, 0x03118f28, 0x005e7cc2, 0x03cf4c79, 0x03c295e5, 0x03834a11, 0x0036a315}}, Y: Field{[10]uint32{0x01c35f91, 0x00077ce2, 0x00d28a2c, 0x0386d8ce, 0x007c7a0c, 0x02d77146, 0x02bb1c3a, 0x00e5d421, 0x035c6f66, 0x001bb3f8}}}, + {X: Field{[10]uint32{0x01681955, 0x01fea852, 0x00ef4265, 0x02ce0f88, 0x00fbce09, 0x02a66e83, 0x03ec2d6f, 0x0197fcfb, 0x00f53b19, 0x001254f8}}, Y: Field{[10]uint32{0x035541c6, 0x026d5065, 0x00a39fc0, 0x025c6343, 0x023c28fa, 0x01e601d9, 0x00683240, 0x00d6c8f9, 0x038d9d16, 0x00308431}}}, + {X: Field{[10]uint32{0x0375f293, 0x0108108d, 0x038db6c7, 0x03205b68, 0x025cd3e0, 0x03a442f5, 0x021f7fdb, 0x038786f8, 0x01af48a0, 0x0015247f}}, Y: Field{[10]uint32{0x007ffae7, 0x013b34bf, 0x0243e3d3, 0x02580c61, 0x039c82de, 0x02d47d3c, 0x03e9b299, 0x014ce28e, 0x02885d1c, 0x001949cd}}}, + {X: Field{[10]uint32{0x03c168d1, 0x03b26d6a, 0x007f0af3, 0x00a50f24, 0x020b0a85, 0x03c5f46d, 0x01838858, 0x018ee7ed, 0x03a80423, 0x002e712b}}, Y: Field{[10]uint32{0x03550d9a, 0x03f85592, 0x0178e514, 0x006c1b50, 0x01e24d51, 0x0329f635, 0x0013aa1e, 0x03afb574, 0x006b1b75, 0x003af4c4}}}, + {X: Field{[10]uint32{0x02d2bd62, 0x00dda0e4, 0x02386242, 0x01cceaf2, 0x01d6802e, 0x02ae0275, 0x039826de, 0x011e86d7, 0x036c4448, 0x00246368}}, Y: Field{[10]uint32{0x0253e218, 0x03c77722, 0x02eca0ab, 0x01b9859b, 0x02889d5e, 0x02ce2627, 0x0214113a, 0x021f9857, 0x03afd7cc, 0x001b988d}}}, + {X: Field{[10]uint32{0x01d3392a, 0x010b8dc0, 0x02c93a2e, 0x00bd15ca, 0x00748eb4, 0x026dd0f3, 0x000240e5, 0x01452820, 0x0194da1f, 0x001ddf4a}}, Y: Field{[10]uint32{0x029680c6, 0x0374e8e2, 0x038645e6, 0x016a7487, 0x039d9250, 0x01387493, 0x02b96f41, 0x00c654b2, 0x03d7e9eb, 0x00001864}}}, + {X: Field{[10]uint32{0x0323bf3d, 0x01fc8c95, 0x0154c4d1, 0x0140d3be, 0x013988c6, 0x03c93bd5, 0x03b8b3ea, 0x03171789, 0x02a09a08, 0x0004239b}}, Y: Field{[10]uint32{0x0013b2eb, 0x03786fff, 0x01be288f, 0x01dba093, 0x02b8a0dd, 0x020464de, 0x0314ebff, 0x01aed1f0, 0x034b86db, 0x0006a2e5}}}, + {X: Field{[10]uint32{0x016bf185, 0x02b15291, 0x02839b5d, 0x03d129a0, 0x013c2dce, 0x037ab87f, 0x018a4868, 0x01352446, 0x02db65a5, 0x000db676}}, Y: Field{[10]uint32{0x0147bbf7, 0x014092c8, 0x00d8d078, 0x03e0d1f7, 0x011edd9b, 0x0196fbc6, 0x02ec3065, 0x01761897, 0x0356d93b, 0x00097a10}}}, + {X: Field{[10]uint32{0x02531fa7, 0x039c74d9, 0x02fe3ab2, 0x01508ca4, 0x02aab896, 0x0009c9b3, 0x01d8a9e3, 0x039dd9ca, 0x02b143ec, 0x000f83ae}}, Y: Field{[10]uint32{0x018d41cd, 0x00e0f665, 0x03d5c691, 0x0384f66a, 0x008e38ea, 0x03ec12cd, 0x008f32b2, 0x0188da25, 0x0208556d, 0x001b9ec9}}}, + {X: Field{[10]uint32{0x00fa3728, 0x02f6d706, 0x034832ba, 0x0108055f, 0x03ab08ab, 0x004fba6a, 0x01e9521a, 0x03cc6a87, 0x036af315, 0x00248f71}}, Y: Field{[10]uint32{0x02d3ae47, 0x03b81f03, 0x0003ef6b, 0x02158cc4, 0x017facf6, 0x03627992, 0x001bfca6, 0x0215ecc5, 0x03b67439, 0x001ea3c5}}}, + {X: Field{[10]uint32{0x016a6618, 0x0313a80f, 0x02c6de85, 0x02a4deea, 0x036bee02, 0x00738b85, 0x029cb815, 0x03ab8d33, 0x033202df, 0x003e1fff}}, Y: Field{[10]uint32{0x005a03e0, 0x01d84856, 0x00e13c71, 0x0330b879, 0x027c14a4, 0x000f36ff, 0x03ace256, 0x01b828d5, 0x0037aa72, 0x001d3924}}}, + {X: Field{[10]uint32{0x018881ed, 0x00fe7040, 0x008200e3, 0x03fc1d5a, 0x01e00b5a, 0x014e7dfa, 0x01ec106b, 0x01a68047, 0x025ddd7f, 0x0004e201}}, Y: Field{[10]uint32{0x0113408e, 0x00c8c5d3, 0x0332c92b, 0x00c88ff9, 0x0065d1a9, 0x02ad090b, 0x02f72a55, 0x01877508, 0x018f1406, 0x002b2ac7}}}, + {X: Field{[10]uint32{0x004b6941, 0x026d88eb, 0x0201e59e, 0x00d2b314, 0x003d685b, 0x028dd46e, 0x03315427, 0x01a8220d, 0x031ea99b, 0x003951da}}, Y: Field{[10]uint32{0x033b4e21, 0x022cba57, 0x0177bb41, 0x019cf321, 0x00bc86dd, 0x02a3e9d5, 0x03c794ca, 0x01e568c8, 0x02f1c4dd, 0x0015f56c}}}, + {X: Field{[10]uint32{0x01cd1f15, 0x011f2c05, 0x0109c3dd, 0x02053b5e, 0x0290c149, 0x03261063, 0x0229d894, 0x03afa930, 0x0360f1e8, 0x003e4e3f}}, Y: Field{[10]uint32{0x02bb13e1, 0x0140c63b, 0x028214da, 0x0316dbb5, 0x02037fe2, 0x01cafef5, 0x0176e293, 0x03191a81, 0x02121a0c, 0x0035c5c8}}}, + {X: Field{[10]uint32{0x00a30aa3, 0x0168ef66, 0x038ad8ad, 0x013e8221, 0x01180b49, 0x02153e6f, 0x015544d5, 0x0144205e, 0x00107c4a, 0x002cc6f5}}, Y: Field{[10]uint32{0x00519e82, 0x01bd7014, 0x031c18fb, 0x03c384ac, 0x03d33828, 0x0001faac, 0x0141affa, 0x0225897a, 0x00976bd5, 0x00250984}}}, + {X: Field{[10]uint32{0x00c1cb2f, 0x011f40fd, 0x03af7b44, 0x02495768, 0x0333abd6, 0x0269b1b4, 0x02df141b, 0x00340468, 0x03ba8321, 0x002cfb61}}, Y: Field{[10]uint32{0x01d632b3, 0x02452a93, 0x0347abe0, 0x006cd1f9, 0x02b90be7, 0x018d0799, 0x030273cb, 0x015f86a5, 0x037929c7, 0x00252774}}}, + {X: Field{[10]uint32{0x01221e17, 0x03b85b4c, 0x03f46668, 0x0038e2e1, 0x0089a57c, 0x00c6f282, 0x0395e787, 0x0243612e, 0x02401ea7, 0x001839b0}}, Y: Field{[10]uint32{0x029465c2, 0x02f451b2, 0x0198cc03, 0x00110143, 0x00367387, 0x015c7abc, 0x01c800a0, 0x00263ca9, 0x0335c722, 0x003c91ef}}}, + {X: Field{[10]uint32{0x03750a80, 0x02bebc70, 0x03b87994, 0x01abdd30, 0x01eaf3e1, 0x01c4f35c, 0x01d8d370, 0x03411f9f, 0x02b04cc8, 0x000aba01}}, Y: Field{[10]uint32{0x02e2e954, 0x03793aec, 0x0135ae38, 0x028906a8, 0x026facf6, 0x0017283b, 0x007fafe6, 0x01c6d46a, 0x00acb297, 0x002a365e}}}, + {X: Field{[10]uint32{0x01bb5c47, 0x0109308a, 0x0343958a, 0x0218dde7, 0x01d23843, 0x007dbcea, 0x020bb155, 0x00b4a79e, 0x00a4bbba, 0x0026bc5e}}, Y: Field{[10]uint32{0x0279abd3, 0x0006886b, 0x03259781, 0x02eab737, 0x014052a4, 0x00beecf4, 0x007ac857, 0x02215e92, 0x03baa023, 0x003040c7}}}, + {X: Field{[10]uint32{0x0008f523, 0x005b6658, 0x00b2c3a1, 0x00c4cc3b, 0x00fd78a5, 0x027a2894, 0x03da097c, 0x009ebcb9, 0x0321e9cb, 0x002775a9}}, Y: Field{[10]uint32{0x03f36080, 0x03274ff9, 0x0217357d, 0x0177d3a0, 0x03fc4e97, 0x02f195e1, 0x012adb14, 0x0027251c, 0x037d6473, 0x0039a0de}}}, + {X: Field{[10]uint32{0x01e91c52, 0x006876a9, 0x03f0f0e3, 0x02da68a2, 0x03fcb717, 0x0113beed, 0x03e3f1de, 0x028794ec, 0x02bed7a1, 0x0033d7c5}}, Y: Field{[10]uint32{0x00487497, 0x00a0d2b1, 0x014b1485, 0x003629a7, 0x00b0c80a, 0x0264833d, 0x03912c99, 0x0081ef18, 0x03d54d87, 0x0025527a}}}, + {X: Field{[10]uint32{0x03a64722, 0x03a417b7, 0x001afd45, 0x03ece880, 0x01de577c, 0x014a8052, 0x02466a3c, 0x015341e0, 0x00908109, 0x00319e52}}, Y: Field{[10]uint32{0x035ca468, 0x0091837d, 0x01187fcc, 0x00946f9a, 0x018621b6, 0x03209e0a, 0x00a5fbd5, 0x0100c6ff, 0x0351deb6, 0x001293f7}}}, + {X: Field{[10]uint32{0x00599713, 0x0354904c, 0x023e4442, 0x0083f869, 0x02b03b49, 0x010501aa, 0x019c1ea0, 0x0383fc59, 0x03cbbee9, 0x002897ff}}, Y: Field{[10]uint32{0x0341486a, 0x01bc912f, 0x007e2123, 0x024537a6, 0x0240fab7, 0x02dca86e, 0x03fc28af, 0x004626b0, 0x02065a82, 0x0005dae7}}}, + {X: Field{[10]uint32{0x00c5bf71, 0x0125dd38, 0x025ecdca, 0x01ab2ba7, 0x01128cab, 0x009238ca, 0x02cfafc7, 0x0248ec5a, 0x0322fd5d, 0x00181e69}}, Y: Field{[10]uint32{0x018c4bcc, 0x03debaf4, 0x00c45df0, 0x024af57b, 0x02023f52, 0x000cdfbf, 0x036f1d91, 0x01691713, 0x02de99ca, 0x0030265c}}}, + {X: Field{[10]uint32{0x0366b403, 0x02772e4a, 0x0182c813, 0x003f2add, 0x02f64b95, 0x02c59c8f, 0x03ffc428, 0x01e39c63, 0x003d9d40, 0x0006232d}}, Y: Field{[10]uint32{0x03af5404, 0x03dfc688, 0x0314c140, 0x03ccd62a, 0x01fcc8c2, 0x0155a45b, 0x01a28799, 0x02890002, 0x0237ec9e, 0x00280e3e}}}, + {X: Field{[10]uint32{0x0019bb30, 0x006c9fbe, 0x0102cd78, 0x00d1a33f, 0x00c445ca, 0x01559fb2, 0x03925066, 0x0171a3d5, 0x0040cb57, 0x0038c43f}}, Y: Field{[10]uint32{0x02be625e, 0x01ae278a, 0x0384ddf6, 0x00da83c5, 0x02e0c183, 0x01b9ee51, 0x0101def6, 0x004bb97a, 0x02655ba3, 0x000c4ca2}}}, + {X: Field{[10]uint32{0x03dea4ac, 0x015d2fdd, 0x03c8e52b, 0x037c91b0, 0x00f15693, 0x03d18b32, 0x000bdeb1, 0x01177765, 0x005d1c82, 0x00376192}}, Y: Field{[10]uint32{0x01966ce2, 0x03027182, 0x03b4833f, 0x02d1f9d0, 0x018963a8, 0x028a6282, 0x0290175b, 0x0289c131, 0x03c256c9, 0x00335aed}}}, + {X: Field{[10]uint32{0x03019aef, 0x01740a81, 0x0097bde8, 0x02666cd8, 0x03dba773, 0x02da7865, 0x03dc67ca, 0x019ee1bd, 0x020cf815, 0x0006dfb4}}, Y: Field{[10]uint32{0x00e3d1bb, 0x03f0d7bc, 0x01531be6, 0x01534c53, 0x00df428d, 0x0292f0de, 0x00d89b59, 0x010e1954, 0x012ad1cb, 0x003e053a}}}, + {X: Field{[10]uint32{0x01ded284, 0x01c669ed, 0x01897a0f, 0x00328191, 0x019b41cd, 0x01c2cfc7, 0x0146a036, 0x020ce3b4, 0x007b2d52, 0x00028556}}, Y: Field{[10]uint32{0x022e925d, 0x03a9c9c4, 0x0052bfe6, 0x008ab5ad, 0x0312fc15, 0x01008fb9, 0x00d225cc, 0x00693b8c, 0x034b5aba, 0x000abbf8}}}, + {X: Field{[10]uint32{0x036a5484, 0x01254fa4, 0x01054048, 0x018e7934, 0x0208d194, 0x02825033, 0x00fcf209, 0x029a4663, 0x01f9c99d, 0x00015eee}}, Y: Field{[10]uint32{0x031660e4, 0x0291f20c, 0x0079e9a6, 0x01ef634c, 0x03700dc5, 0x035defc3, 0x03be5e41, 0x009ba0b1, 0x03a8d902, 0x0018f43e}}}, + {X: Field{[10]uint32{0x03bd262c, 0x02497564, 0x03746bab, 0x03ee3e92, 0x01291f84, 0x00844ec8, 0x017f7a10, 0x02d2835f, 0x01b37fa1, 0x000890a5}}, Y: Field{[10]uint32{0x00195796, 0x0258ae4e, 0x03ddcea2, 0x023b1145, 0x0246ed38, 0x00889982, 0x023eb74c, 0x02c369d5, 0x0040b1e4, 0x0003582b}}}, + {X: Field{[10]uint32{0x0053b0e3, 0x00e69ad5, 0x0055e53b, 0x0283c8a0, 0x02d6101c, 0x039d0d53, 0x00031b29, 0x0314f81f, 0x02e6a34e, 0x00090d3a}}, Y: Field{[10]uint32{0x003ce23d, 0x01e8e09d, 0x010ed6ce, 0x01d591db, 0x008b04f7, 0x00e88398, 0x00f39563, 0x0012ec4e, 0x0161d57a, 0x000bfd7b}}}, + {X: Field{[10]uint32{0x01885ce9, 0x02961c62, 0x0203b700, 0x02d8db42, 0x01ef2e6a, 0x03ec8ac1, 0x0304c649, 0x00444ef6, 0x0192907c, 0x00112379}}, Y: Field{[10]uint32{0x0079eabc, 0x0108732a, 0x028803d0, 0x00435164, 0x0063af8b, 0x016c0a4c, 0x03e6dea2, 0x0141a37a, 0x03fd6ab3, 0x0035eab3}}}, + {X: Field{[10]uint32{0x0393dd76, 0x028dc618, 0x0298f7c2, 0x00730769, 0x00defc0a, 0x006a8ee8, 0x02b92e70, 0x01d9d1ff, 0x03735aef, 0x00210173}}, Y: Field{[10]uint32{0x02c407f2, 0x01549639, 0x0053fc79, 0x00beea1a, 0x0189c9ef, 0x03d2a1c4, 0x0261c783, 0x00428129, 0x000649cd, 0x0015e574}}}, + {X: Field{[10]uint32{0x0208efc9, 0x0084735b, 0x026d5581, 0x03341cb1, 0x029318ac, 0x00dc7ae1, 0x01349aa0, 0x0121f7fa, 0x00c1e5c1, 0x001a625d}}, Y: Field{[10]uint32{0x0384509c, 0x030703fb, 0x00e1590b, 0x00aaee13, 0x01bcec87, 0x02ae6bd8, 0x036536c2, 0x012fd47d, 0x038cdc8f, 0x000df088}}}, + {X: Field{[10]uint32{0x003fee05, 0x0395cc99, 0x02d8dce2, 0x01846e11, 0x03e6548c, 0x00c57de2, 0x017781df, 0x02af19c6, 0x017abe3c, 0x00228de1}}, Y: Field{[10]uint32{0x00f674ed, 0x01da62d3, 0x020b78b8, 0x026c8777, 0x005e28e9, 0x038e19b5, 0x0055e4d9, 0x013341f9, 0x03680915, 0x000a620b}}}, + {X: Field{[10]uint32{0x0397eaef, 0x02f380c8, 0x00846793, 0x037c3e98, 0x0325ec8c, 0x01ea29c5, 0x0104c968, 0x00e7f84c, 0x034f5cdd, 0x002a1c6c}}, Y: Field{[10]uint32{0x0387cb28, 0x03f5e8b0, 0x00c5df3f, 0x037a379b, 0x00642312, 0x01b2484f, 0x03e2dc68, 0x000f027d, 0x00179de1, 0x00213e59}}}, + {X: Field{[10]uint32{0x0286f44a, 0x019339a0, 0x00fb4fd9, 0x031ebaae, 0x009ec66e, 0x02679d2b, 0x0057905e, 0x029fd6a2, 0x03b89f78, 0x00126f2b}}, Y: Field{[10]uint32{0x019eff6f, 0x03901f3b, 0x0194f4ea, 0x01849c5b, 0x0271124a, 0x02f464fa, 0x011d2ca7, 0x02add29e, 0x00cb5641, 0x0039f6e3}}}, + {X: Field{[10]uint32{0x028b6df6, 0x01c4c03d, 0x03686c3f, 0x012de7fa, 0x0140d9b8, 0x03ffa126, 0x0186289d, 0x0327963d, 0x012f2f05, 0x003571f6}}, Y: Field{[10]uint32{0x0151c08e, 0x0200abc7, 0x020434f1, 0x00aff38d, 0x036fcb2b, 0x0073d0ae, 0x00b272ce, 0x028e3a81, 0x025c219e, 0x0029a2ca}}}, + {X: Field{[10]uint32{0x03286696, 0x02a36d4e, 0x0056cfe4, 0x02f8a09b, 0x006a825c, 0x02c323b4, 0x034a249c, 0x0335ee71, 0x023cfea4, 0x000ab0bf}}, Y: Field{[10]uint32{0x0360f43f, 0x039e0102, 0x03834a67, 0x01b3c028, 0x00505bb4, 0x01b2981e, 0x02f6031c, 0x02947b28, 0x0259b008, 0x001f6429}}}, + {X: Field{[10]uint32{0x00a39234, 0x00716a84, 0x011d92f6, 0x03bec0ed, 0x025b0069, 0x0283b69e, 0x023a85f5, 0x01fb3d3d, 0x00bc6282, 0x001f026b}}, Y: Field{[10]uint32{0x01624836, 0x01b1a21a, 0x030015a9, 0x03c8258a, 0x00854b56, 0x017f70c6, 0x01f86414, 0x00a315a1, 0x0139c291, 0x00381f49}}}, + {X: Field{[10]uint32{0x03fbf9f0, 0x025aefdb, 0x03a7f2c4, 0x0008d289, 0x033bb4ff, 0x00ecbeb4, 0x0141ae71, 0x010b9da6, 0x01567e1b, 0x003a21b7}}, Y: Field{[10]uint32{0x0267a877, 0x0045cb71, 0x0301081d, 0x03cf18c2, 0x025a4666, 0x037d3977, 0x01c097f0, 0x03e03cdc, 0x037babee, 0x00352c89}}}, + {X: Field{[10]uint32{0x0059c2dc, 0x02866740, 0x00464073, 0x039614d1, 0x038ca8a6, 0x03d82ec6, 0x02178f0f, 0x00e60f16, 0x00c800e8, 0x003b7d97}}, Y: Field{[10]uint32{0x01ab2d5e, 0x01d89122, 0x0123a92c, 0x036c41c3, 0x030118a4, 0x0378737e, 0x024710a2, 0x00c27e12, 0x0313f0c5, 0x00289099}}}, + {X: Field{[10]uint32{0x026d17f8, 0x01abdbb4, 0x01036a74, 0x02ee8f4b, 0x03435ad7, 0x02c548c8, 0x016dbbe5, 0x01baee4d, 0x0304b78a, 0x000a704b}}, Y: Field{[10]uint32{0x016eae4a, 0x03f3b388, 0x019358b7, 0x009fe816, 0x02b3336d, 0x027b1146, 0x02a211f3, 0x0046a9e3, 0x0275bf62, 0x00020e64}}}, + {X: Field{[10]uint32{0x0263c3e2, 0x03e29e59, 0x00789994, 0x01192986, 0x03169f20, 0x0383e7f3, 0x02034ac3, 0x026453c2, 0x038c280e, 0x003576e2}}, Y: Field{[10]uint32{0x0263412b, 0x00355df0, 0x02cbbeb6, 0x01e2a997, 0x0398f270, 0x0066507d, 0x025635a8, 0x0000e7d7, 0x003a085a, 0x0010458f}}}, + {X: Field{[10]uint32{0x01135f8d, 0x00285f36, 0x01165700, 0x016b151f, 0x0210e105, 0x02ed3dff, 0x00e57ac8, 0x02c03656, 0x03a5630e, 0x00264293}}, Y: Field{[10]uint32{0x03c9653b, 0x02c8f5d2, 0x032912ec, 0x0053e3f3, 0x03eb2524, 0x0231c485, 0x02a03646, 0x028a2511, 0x0025491f, 0x003c97b8}}}, + {X: Field{[10]uint32{0x029c0935, 0x00ded5e7, 0x031b7416, 0x03b31a35, 0x034e3049, 0x00c573d4, 0x0101c3b3, 0x012773b2, 0x00f01c78, 0x0035e13b}}, Y: Field{[10]uint32{0x034205ce, 0x03593eda, 0x03dde6b2, 0x00202159, 0x02306720, 0x03b1bf51, 0x0082a841, 0x00abb763, 0x0122cc38, 0x00177a63}}}, + {X: Field{[10]uint32{0x00e38193, 0x01334d5b, 0x01338320, 0x03946726, 0x019b4d38, 0x037cf067, 0x0353b67b, 0x0032eeab, 0x00d05885, 0x000195db}}, Y: Field{[10]uint32{0x0310eaca, 0x03dd3195, 0x03420658, 0x0038c2fc, 0x03d98496, 0x01d923f8, 0x001fbeb2, 0x0395b8c7, 0x013e92d1, 0x0028ca66}}}, + {X: Field{[10]uint32{0x0035efce, 0x012113af, 0x024d8bb9, 0x01dcf49b, 0x0320ccb1, 0x0311527f, 0x009a8081, 0x03031919, 0x00e5f675, 0x00255de2}}, Y: Field{[10]uint32{0x021d9b5b, 0x016a8394, 0x00a8c051, 0x001a6f04, 0x0301d329, 0x005785f3, 0x01c39486, 0x03b8df65, 0x031cdc4b, 0x001fa910}}}, + {X: Field{[10]uint32{0x039e4a2e, 0x014b0178, 0x0096b014, 0x03cec114, 0x00da5549, 0x02304ffc, 0x0101abd7, 0x02d4dfb1, 0x02805053, 0x0022bdf2}}, Y: Field{[10]uint32{0x017e8402, 0x0160da8b, 0x03fb8e1b, 0x001ba759, 0x036a4362, 0x03690150, 0x03235e60, 0x010b933e, 0x0225aac0, 0x00097a18}}}, + {X: Field{[10]uint32{0x0215236c, 0x024df438, 0x02ba2623, 0x01598dec, 0x01e6eb74, 0x035e705e, 0x02ff642a, 0x018d3880, 0x0393e16e, 0x00126fc0}}, Y: Field{[10]uint32{0x0031a85d, 0x00f9a5e9, 0x00722d60, 0x00305e6b, 0x0141e5f8, 0x02684d10, 0x000ce1ee, 0x03835073, 0x013f401d, 0x00216418}}}, + {X: Field{[10]uint32{0x00192063, 0x03af4675, 0x035afdc5, 0x03b68992, 0x01df3653, 0x02326db7, 0x03b68581, 0x00a18d49, 0x02250257, 0x00320b8a}}, Y: Field{[10]uint32{0x01a6de8c, 0x01d78f8e, 0x011c7b26, 0x03dcddbe, 0x01c2717f, 0x01fe7a4e, 0x030af044, 0x0306f4f5, 0x0000cd87, 0x000ee1be}}}, + {X: Field{[10]uint32{0x00eedbf3, 0x004b7f76, 0x02041a37, 0x0154562c, 0x0142ec13, 0x0393489f, 0x02fc9c3f, 0x023df0eb, 0x01202b9a, 0x0027390e}}, Y: Field{[10]uint32{0x035b52f6, 0x0288327f, 0x026e26d5, 0x02cf70bb, 0x0153a54b, 0x02a4e7fe, 0x02f15d59, 0x03b74feb, 0x0305859a, 0x0036eed6}}}, + {X: Field{[10]uint32{0x02fe6227, 0x02f6dac5, 0x0324a168, 0x02b425bb, 0x00baa707, 0x03b2ad2e, 0x01202213, 0x0017294b, 0x009e49de, 0x000381c0}}, Y: Field{[10]uint32{0x00bc33c9, 0x023e739b, 0x03b2e417, 0x00f28548, 0x03258383, 0x037a353a, 0x03865b0a, 0x02e89a06, 0x00bfe752, 0x001a8d6c}}}, + {X: Field{[10]uint32{0x021da888, 0x00056f60, 0x03fab065, 0x017fd308, 0x01d58861, 0x025849c5, 0x02948147, 0x02bd8791, 0x01b47e09, 0x003ad373}}, Y: Field{[10]uint32{0x01661b8f, 0x017454fa, 0x000834a5, 0x01710410, 0x00008630, 0x01320457, 0x006536ad, 0x000be878, 0x01685846, 0x0018f8e0}}}, + {X: Field{[10]uint32{0x00e49db6, 0x013cce44, 0x00f7bf86, 0x001c981e, 0x03a2c659, 0x034a76b3, 0x0257015d, 0x00044c74, 0x02812bf2, 0x002f97e1}}, Y: Field{[10]uint32{0x016d9da7, 0x01004765, 0x01f308f0, 0x02e3103a, 0x0143c4f1, 0x01cfe944, 0x015a92da, 0x012bfd66, 0x00e45617, 0x00343d08}}}, + {X: Field{[10]uint32{0x015b99a8, 0x007e204d, 0x01ed74a6, 0x0172cc75, 0x03db214a, 0x0375fa3b, 0x03a1318e, 0x017e7663, 0x003910e7, 0x000eccb7}}, Y: Field{[10]uint32{0x03a18bc5, 0x02bc68a8, 0x03c4218b, 0x02b15cbe, 0x036e4e0a, 0x01d4b952, 0x01df756e, 0x03a7967f, 0x028619c2, 0x000684b7}}}, + {X: Field{[10]uint32{0x02e04db1, 0x00f9e921, 0x029d0a3c, 0x00d45a5c, 0x03dde107, 0x00fce1ad, 0x012922ea, 0x03a21597, 0x01ce5c06, 0x00256b17}}, Y: Field{[10]uint32{0x02f39838, 0x02d6c9cf, 0x029fde77, 0x01dc9465, 0x01680edb, 0x005aded2, 0x0049e856, 0x0060878f, 0x0187ab1b, 0x000688b3}}}, + {X: Field{[10]uint32{0x00e708eb, 0x0060db5f, 0x005ccd30, 0x00782a37, 0x027dad59, 0x017b4a57, 0x01d1b74a, 0x03c4f8cd, 0x00fba4b0, 0x001b93b4}}, Y: Field{[10]uint32{0x0234b931, 0x01fc5482, 0x01a54ac3, 0x0267a670, 0x0016a2ef, 0x027366ac, 0x0188e6e5, 0x013827b6, 0x026ac61c, 0x00241585}}}, + {X: Field{[10]uint32{0x03a42e10, 0x03ae8b08, 0x01859898, 0x01e6474b, 0x01ea8d9a, 0x0209f612, 0x00925e17, 0x003b84dd, 0x0394208e, 0x0022df0c}}, Y: Field{[10]uint32{0x0043d193, 0x02afac9c, 0x02d0d003, 0x03d8bc86, 0x032c8beb, 0x01d7bcff, 0x00e64400, 0x002f3244, 0x02379672, 0x002daae4}}}, + {X: Field{[10]uint32{0x00f871c6, 0x001612ec, 0x02dcc8e2, 0x01363e5b, 0x02dd48ab, 0x02dbd772, 0x00965b98, 0x0035ce21, 0x0347f669, 0x0003f69e}}, Y: Field{[10]uint32{0x02926c5d, 0x02e39af2, 0x03560e18, 0x00895791, 0x00309292, 0x0152d1cf, 0x03487e8b, 0x0331b4a2, 0x0035a272, 0x0026d009}}}, + {X: Field{[10]uint32{0x01bcb217, 0x0041a8cf, 0x0255dad6, 0x022f3246, 0x036e6301, 0x0303a6a8, 0x00beb534, 0x01686bbe, 0x00f5395a, 0x003c5768}}, Y: Field{[10]uint32{0x038a8f1c, 0x03afdd95, 0x00f6ddb6, 0x00bef3e6, 0x0380be25, 0x021825c8, 0x03571ac4, 0x00054645, 0x01eabb3b, 0x000a33da}}}, + {X: Field{[10]uint32{0x00af9253, 0x036206ef, 0x032f4abf, 0x02e1fea0, 0x03d9a208, 0x021c26a5, 0x02378e63, 0x005f8324, 0x02dd2c78, 0x0031b899}}, Y: Field{[10]uint32{0x03769626, 0x0247b9f2, 0x02082842, 0x03724c8c, 0x005ffa7a, 0x0342fbd6, 0x00e95e35, 0x02ce8c32, 0x00c1fa9b, 0x000abc40}}}, + {X: Field{[10]uint32{0x02e28753, 0x00cf422d, 0x0313f0d1, 0x01e93f6a, 0x037f5a72, 0x00e495a1, 0x00c21a83, 0x00807922, 0x02020fdd, 0x0012fe2a}}, Y: Field{[10]uint32{0x015fc8b8, 0x02fa74f3, 0x01d88f39, 0x0016572f, 0x02d8fe5f, 0x0279b188, 0x01c6bd70, 0x01356685, 0x0258ad9c, 0x00162049}}}, + {X: Field{[10]uint32{0x00d0a6d3, 0x03f04a5f, 0x0248b972, 0x01cf6d87, 0x0105cda6, 0x029dfee5, 0x009fc39d, 0x01216956, 0x032806dd, 0x002aa617}}, Y: Field{[10]uint32{0x024b75b2, 0x017d8347, 0x00a04e1e, 0x00404389, 0x007c2777, 0x007fc0b8, 0x025a92da, 0x018ecca6, 0x00972f11, 0x002aec3e}}}, + {X: Field{[10]uint32{0x01c41c9d, 0x01ccbb18, 0x0197c8e1, 0x012c33b4, 0x016c2fa0, 0x02305048, 0x039f88d8, 0x02873d3a, 0x0101ec13, 0x00205d34}}, Y: Field{[10]uint32{0x03d79aa7, 0x01a9d623, 0x01bbb46f, 0x012c69e4, 0x00c6e5d9, 0x0298e6c0, 0x037a6625, 0x00b9ffab, 0x01c231b0, 0x00319d97}}}, + {X: Field{[10]uint32{0x01f3d876, 0x00bc13db, 0x02cbb870, 0x02b3f6f9, 0x0292573a, 0x016a68e8, 0x028fe098, 0x024a5edc, 0x02a9d603, 0x003e7d93}}, Y: Field{[10]uint32{0x024ca01a, 0x01f4b266, 0x02f9b1a6, 0x03ef61fb, 0x01188069, 0x005cba1e, 0x00950f21, 0x019f4058, 0x03c14060, 0x001051b1}}}, + {X: Field{[10]uint32{0x00f1b3b4, 0x0197b32a, 0x02951d88, 0x02f072a4, 0x01f8067c, 0x02977a49, 0x034454a2, 0x0217acf4, 0x02705a68, 0x000f990e}}, Y: Field{[10]uint32{0x02fb0355, 0x03822df8, 0x02f11b0f, 0x0209c58b, 0x028b5e58, 0x01ddea65, 0x01d54d1d, 0x014d3b7a, 0x03045525, 0x000b7b29}}}, + {X: Field{[10]uint32{0x036c63c5, 0x0259bccd, 0x0082e4c0, 0x034ae1ea, 0x03caae45, 0x01bddb40, 0x015d200d, 0x02b01dfa, 0x0011fcc3, 0x0011137d}}, Y: Field{[10]uint32{0x0016cc23, 0x0142a955, 0x032bc643, 0x024eb1b8, 0x01ec520c, 0x00b7b3cf, 0x00d1a4df, 0x02592a9f, 0x0198643d, 0x002d1599}}}, + {X: Field{[10]uint32{0x006946a0, 0x01ea1e99, 0x01465bbb, 0x01aa1093, 0x0019cdaa, 0x029a0429, 0x00a7beb1, 0x00d7f8c5, 0x021f58be, 0x0004a8bd}}, Y: Field{[10]uint32{0x010ba47d, 0x0354d74a, 0x010698df, 0x00c6575e, 0x0248410b, 0x029a7ef2, 0x01539461, 0x03323fc6, 0x034494c2, 0x00269ef7}}}, + {X: Field{[10]uint32{0x0264cb9f, 0x00acadf8, 0x007933d5, 0x01ea4fd2, 0x02511b2b, 0x01a1ef48, 0x008af94b, 0x01cf1cf5, 0x02924625, 0x002f75c9}}, Y: Field{[10]uint32{0x02123874, 0x03037de8, 0x034ed955, 0x03df7103, 0x02858e6d, 0x03dd1a6a, 0x01ac9923, 0x03eac2f5, 0x004eb794, 0x00015b9b}}}, + {X: Field{[10]uint32{0x00066bdd, 0x01ff95a9, 0x003d60ec, 0x00a75f41, 0x03c974bd, 0x02936a7b, 0x034f156e, 0x03d5744a, 0x015877c3, 0x00386f55}}, Y: Field{[10]uint32{0x03233170, 0x02541d70, 0x0033ff5a, 0x006c7111, 0x03789cbf, 0x03168cbd, 0x002bea56, 0x010da88e, 0x0399fbe7, 0x00237366}}}, + {X: Field{[10]uint32{0x00132ad9, 0x00d47498, 0x0185d804, 0x02e2c1c6, 0x00fc064e, 0x01287d54, 0x0246609f, 0x020a52fa, 0x01e4781c, 0x0029f1a3}}, Y: Field{[10]uint32{0x01b42c32, 0x02218aeb, 0x00766842, 0x026fafe8, 0x026f6bbf, 0x0116626e, 0x022b240d, 0x03fad441, 0x00b63d9e, 0x0028209e}}}, + {X: Field{[10]uint32{0x029aa855, 0x00f1c34a, 0x0279a56b, 0x0198f632, 0x0205fa0d, 0x004df41e, 0x01eb90f5, 0x038da72f, 0x0369b4c6, 0x0013cea1}}, Y: Field{[10]uint32{0x026ea169, 0x01921bba, 0x0393e35b, 0x00b2d8af, 0x00b9d6db, 0x011c1d61, 0x00ed9f2c, 0x007854d2, 0x011c5f70, 0x0003db01}}}, + {X: Field{[10]uint32{0x0044f232, 0x018f77bd, 0x01a8d744, 0x01ff2d0d, 0x0036fd04, 0x0229aed6, 0x01cac66d, 0x03aff610, 0x001c8089, 0x0037aaaf}}, Y: Field{[10]uint32{0x0228e8a1, 0x0030a4f0, 0x014f90f5, 0x01258a9b, 0x00ccd14a, 0x03229b59, 0x026e6547, 0x01b9eaa0, 0x00ba49c2, 0x003edf31}}}, + {X: Field{[10]uint32{0x019c0695, 0x02e3e4cc, 0x023788b5, 0x02adf3f3, 0x02fd7f33, 0x03bcaccb, 0x0151e1f4, 0x006ce049, 0x0361547b, 0x0031046b}}, Y: Field{[10]uint32{0x018cb66b, 0x02efe215, 0x02ab4797, 0x013bd888, 0x02294ace, 0x03f3eedd, 0x0266d212, 0x03e0aba4, 0x03d73d50, 0x0034afb9}}}, + {X: Field{[10]uint32{0x009ec5e7, 0x002f7aa4, 0x01637821, 0x000742a2, 0x004a35f1, 0x02e77771, 0x00284945, 0x0376a343, 0x0294485b, 0x00343fda}}, Y: Field{[10]uint32{0x024f620f, 0x0087c88d, 0x02a65e21, 0x03fe0ea4, 0x00cb1910, 0x023e54f1, 0x02b7e83d, 0x02a3cb40, 0x00fd2923, 0x002acfd8}}}, + {X: Field{[10]uint32{0x0308c0f1, 0x00d6a9c7, 0x02424982, 0x01102cff, 0x01006f27, 0x016b5b2c, 0x011baea3, 0x03b648a1, 0x01cc9555, 0x00028341}}, Y: Field{[10]uint32{0x02339948, 0x0131f275, 0x037dc471, 0x02b4c601, 0x0150afe2, 0x0082c9c1, 0x017e67ca, 0x01629c2f, 0x01052371, 0x00210ec4}}}, + {X: Field{[10]uint32{0x023f5d32, 0x03964807, 0x039d0568, 0x010a24fe, 0x007d5996, 0x0364265e, 0x0083ef67, 0x017ee817, 0x0045eb29, 0x002fa821}}, Y: Field{[10]uint32{0x00ce10e3, 0x03cc8a9b, 0x01cc7908, 0x035af53d, 0x01e26594, 0x00744bb4, 0x00bb2bb4, 0x03d14f5e, 0x03ffb3f7, 0x000aa069}}}, + {X: Field{[10]uint32{0x02f0d5f0, 0x00b1f7b9, 0x02ce3e82, 0x026316b3, 0x00551c30, 0x01aae5c0, 0x035aea6f, 0x039a267a, 0x004c431b, 0x003a3af3}}, Y: Field{[10]uint32{0x01fa902e, 0x03428ecc, 0x0161e097, 0x0193aa83, 0x016d65db, 0x0268ab9e, 0x03d511f5, 0x0393d63e, 0x0061760a, 0x003be669}}}, + {X: Field{[10]uint32{0x026e8fd2, 0x00c2f3a5, 0x03cd1d96, 0x02d6161d, 0x020806ba, 0x01e5b62d, 0x031db77c, 0x037113b3, 0x006cdd73, 0x00125218}}, Y: Field{[10]uint32{0x02b95f80, 0x012e496f, 0x01123bc6, 0x03b7cf6e, 0x00cb8c13, 0x00e511aa, 0x01630aa6, 0x02319e10, 0x033f786c, 0x000f19cc}}}, + {X: Field{[10]uint32{0x02a778c2, 0x021e4ba7, 0x00a165c1, 0x02996d72, 0x00fb5a19, 0x019b3525, 0x03e40cca, 0x03bee938, 0x033240d9, 0x0013c966}}, Y: Field{[10]uint32{0x0117446d, 0x023aab93, 0x00efb1b6, 0x01fd1d23, 0x00b1590f, 0x027d3a8b, 0x02006054, 0x01a66712, 0x008778c2, 0x003f7620}}}, + {X: Field{[10]uint32{0x02dfcc29, 0x0143e91e, 0x03f337e3, 0x02379ea9, 0x031e7e91, 0x038463ba, 0x036e2b43, 0x01fd4bc9, 0x0093e14d, 0x003cc0e9}}, Y: Field{[10]uint32{0x01141b57, 0x006f52da, 0x00163cfa, 0x01df17f9, 0x01453f79, 0x029ab499, 0x01bc49da, 0x0394fd7d, 0x006d0bef, 0x003127e9}}}, + {X: Field{[10]uint32{0x01df595d, 0x02cbd4f0, 0x01a41ea4, 0x03f0a77d, 0x0158b9fd, 0x01029583, 0x0311859c, 0x02003b06, 0x0317f4c0, 0x00380312}}, Y: Field{[10]uint32{0x0363b99d, 0x007edd65, 0x032fb8c8, 0x000f4d20, 0x00a72a10, 0x02d33346, 0x00d0d957, 0x0134a746, 0x0266c3ec, 0x00189106}}}, + {X: Field{[10]uint32{0x0372ce70, 0x02c8c076, 0x011714cf, 0x03c88560, 0x03ca16be, 0x02dd52f9, 0x03603bd2, 0x02bd4a91, 0x00861af6, 0x001212e1}}, Y: Field{[10]uint32{0x0132fbc7, 0x01f9cb13, 0x02359d47, 0x0314231d, 0x01cf72e5, 0x028299d6, 0x02968652, 0x01e68ff9, 0x03f5a0ac, 0x000dbe13}}}, + {X: Field{[10]uint32{0x00d93f14, 0x0119ee13, 0x02dab210, 0x0338469e, 0x03ca07fe, 0x032f0526, 0x03e6a8a7, 0x007d1286, 0x00ead8b5, 0x00222f96}}, Y: Field{[10]uint32{0x02687fdc, 0x01baf2a4, 0x0067d4d4, 0x03d27c03, 0x018ebbeb, 0x001a5ec6, 0x00d6cd6a, 0x03ef05c7, 0x00af7037, 0x00253043}}}, + {X: Field{[10]uint32{0x03da781b, 0x037a5111, 0x03b77384, 0x0351f058, 0x037372a3, 0x0040466d, 0x0275e11b, 0x035fbd12, 0x02af9fdd, 0x002afdb3}}, Y: Field{[10]uint32{0x0395d290, 0x003b3319, 0x0259a796, 0x024a0712, 0x01417183, 0x026ed3bd, 0x01fe2f3b, 0x0319eba7, 0x030c6320, 0x00172b6c}}}, + {X: Field{[10]uint32{0x009d173a, 0x020e13ae, 0x03deb74f, 0x00365598, 0x014e221e, 0x01f1b0f3, 0x03cf10a1, 0x0196c99f, 0x01229ef6, 0x003a3099}}, Y: Field{[10]uint32{0x022aeeb3, 0x02b847f2, 0x00934035, 0x009a7f34, 0x02bec7ba, 0x00364591, 0x031965b3, 0x0143bf48, 0x03adf9b0, 0x00269a7e}}}, + {X: Field{[10]uint32{0x01c6c23e, 0x03e93ff6, 0x0358df60, 0x03aa47ff, 0x01e031f3, 0x021a0c55, 0x0270a24e, 0x03b2e579, 0x03d8bf72, 0x0019994a}}, Y: Field{[10]uint32{0x00be994e, 0x0168ea4c, 0x03b3b4b6, 0x00054b73, 0x0205fa69, 0x03d98c29, 0x002fbb66, 0x00adcc8b, 0x00083f18, 0x0012113b}}}, + {X: Field{[10]uint32{0x002c0964, 0x0094b753, 0x02f0badf, 0x01054caa, 0x0075cac8, 0x016fdb56, 0x00202c44, 0x00410372, 0x00c2d842, 0x00081e20}}, Y: Field{[10]uint32{0x01860cfd, 0x01b47c30, 0x01c54e91, 0x024c203f, 0x010a562d, 0x0324a9ec, 0x00ef3167, 0x013786b9, 0x01d73eb2, 0x000ac606}}}, + {X: Field{[10]uint32{0x0013f581, 0x03f65648, 0x030cc763, 0x00b1f649, 0x007e8f26, 0x03437fda, 0x0133485e, 0x01a4bbb2, 0x01e453d0, 0x0011ae6f}}, Y: Field{[10]uint32{0x014f9bf7, 0x02af4b28, 0x022256ec, 0x021a7cbf, 0x01394cc7, 0x00216df5, 0x019b0d63, 0x026703d2, 0x03e63ae5, 0x00162be6}}}, + {X: Field{[10]uint32{0x01ea3e11, 0x00759e5d, 0x0278b82b, 0x015758a6, 0x02a2fa25, 0x00a6bcea, 0x0356e2f0, 0x03974025, 0x0174dbeb, 0x001766c9}}, Y: Field{[10]uint32{0x02e59263, 0x01ed9143, 0x030f02b8, 0x02405963, 0x03f3a641, 0x018a5d63, 0x023dd507, 0x031a3f3b, 0x00acaa6a, 0x003b67d0}}}, + {X: Field{[10]uint32{0x02590e4f, 0x01b05c9b, 0x02c52d08, 0x035ddf3f, 0x03dc598f, 0x01dd0ce2, 0x036a6491, 0x01909669, 0x01828b98, 0x003b2d6b}}, Y: Field{[10]uint32{0x01887886, 0x02637cb2, 0x034e301d, 0x029f3312, 0x0365d33e, 0x00be084b, 0x014b5bf5, 0x0361faa5, 0x013673c6, 0x0000ade2}}}, + {X: Field{[10]uint32{0x0124ea67, 0x03294c8e, 0x0296e8f3, 0x0267f243, 0x00ddd62e, 0x00037957, 0x01747250, 0x006e2874, 0x00c15e71, 0x002ccad9}}, Y: Field{[10]uint32{0x02ac2083, 0x02c30929, 0x016a5403, 0x013783f8, 0x024d81b8, 0x01f92f86, 0x027a94de, 0x02b7c8d2, 0x01d36dce, 0x002bd758}}}, + {X: Field{[10]uint32{0x020cd364, 0x0023f160, 0x034ab1c3, 0x010aa002, 0x008b7f68, 0x033daacf, 0x0157aa15, 0x008cd29b, 0x031b7158, 0x00144dfd}}, Y: Field{[10]uint32{0x01f1eab4, 0x0194a913, 0x00381efa, 0x00e25596, 0x010e4a3b, 0x025d5dc4, 0x02a248d4, 0x01f6ac31, 0x03ecc9b1, 0x003dfa97}}}, + {X: Field{[10]uint32{0x029ea866, 0x0158a5f3, 0x01539e7c, 0x01958c58, 0x0025f94e, 0x00070fd7, 0x0113a898, 0x016224f8, 0x021a390b, 0x002e6ec3}}, Y: Field{[10]uint32{0x00324a11, 0x01a547c2, 0x0080e6b6, 0x02a094e6, 0x01247f60, 0x0207938c, 0x00e14ece, 0x00d7eeb9, 0x00903c3d, 0x003636cf}}}, + {X: Field{[10]uint32{0x024fe9af, 0x03ad1a24, 0x027d317b, 0x024bb060, 0x0388cc11, 0x0310bd1e, 0x0291c211, 0x003b0811, 0x01676da4, 0x000fc246}}, Y: Field{[10]uint32{0x02bb8de9, 0x0177d705, 0x01395877, 0x02f74ff3, 0x00ba4c04, 0x00e341c9, 0x02e6a812, 0x00b07c62, 0x00263e88, 0x003c6d12}}}, + {X: Field{[10]uint32{0x0093b4fe, 0x016b2236, 0x00ed80d5, 0x011f5897, 0x003767da, 0x01c286cb, 0x015e7afc, 0x01803a35, 0x01f1dad4, 0x002d7e89}}, Y: Field{[10]uint32{0x02d22347, 0x024e6ca2, 0x0270e1d6, 0x000ee85e, 0x0183e495, 0x02927426, 0x013a1908, 0x00a5b1fb, 0x0261f2ba, 0x001d5d7d}}}, + {X: Field{[10]uint32{0x000d17b0, 0x031bdf5a, 0x000183d4, 0x03a9ac73, 0x01e4ca06, 0x000dcc1a, 0x01b797e9, 0x00096de3, 0x00e2dc6a, 0x00280dc7}}, Y: Field{[10]uint32{0x0059919d, 0x01f10cba, 0x036bc693, 0x01d1712b, 0x0024f0ff, 0x01666ddd, 0x011c5214, 0x00173ba1, 0x00a89a50, 0x0024ad6a}}}, + {X: Field{[10]uint32{0x02e2f210, 0x02650a87, 0x02c8c7b1, 0x00a36896, 0x00cd0a98, 0x01f50808, 0x0063967d, 0x02441de2, 0x029000a4, 0x0016ab9b}}, Y: Field{[10]uint32{0x03ee8fd7, 0x00393ded, 0x03957576, 0x031335e0, 0x017e82fd, 0x01e7b0e6, 0x03218f7b, 0x013cfff5, 0x002082a5, 0x0003b673}}}, + {X: Field{[10]uint32{0x020841a0, 0x034a8a06, 0x03b053fe, 0x02cb9b39, 0x0164efdd, 0x01437ad9, 0x000f9648, 0x02dbd2c4, 0x02ecf4a9, 0x001539f6}}, Y: Field{[10]uint32{0x03c9c63d, 0x00f7b2a5, 0x03daecc8, 0x0215c250, 0x0270d467, 0x022cd365, 0x02857ad0, 0x00ea0756, 0x032a5477, 0x00366b68}}}, + {X: Field{[10]uint32{0x03bf44e8, 0x01153223, 0x00d7abdb, 0x0148e47b, 0x00383ed7, 0x01d926e1, 0x00d8be0c, 0x03bd1ad2, 0x0110d8bc, 0x003a6ca6}}, Y: Field{[10]uint32{0x021d6b69, 0x031c0f09, 0x033deb84, 0x024a6a37, 0x03d7a267, 0x00393102, 0x01739655, 0x03a47e94, 0x0094f669, 0x003ac9a0}}}, + {X: Field{[10]uint32{0x02546a97, 0x0385de76, 0x00ef6384, 0x00727f85, 0x013f537a, 0x01df4767, 0x037c5895, 0x02944c65, 0x0222f254, 0x0010fe54}}, Y: Field{[10]uint32{0x01cb18cc, 0x03b3ad5c, 0x035e14b0, 0x02ce5ecf, 0x030eef80, 0x0198a8b7, 0x005b305b, 0x01711fc9, 0x02534334, 0x0035f4f1}}}, + {X: Field{[10]uint32{0x02c3b103, 0x004a52e9, 0x00b1dcc9, 0x01701c89, 0x01672338, 0x005ab921, 0x00bc0902, 0x03ee4a0c, 0x03d53999, 0x0027ed17}}, Y: Field{[10]uint32{0x02bdf451, 0x03deb27f, 0x0213a277, 0x001ae09c, 0x036731b5, 0x0269252e, 0x017bf7f3, 0x020b4e43, 0x001bdbfd, 0x0016d1c2}}}, + {X: Field{[10]uint32{0x031dcce9, 0x032092ed, 0x007f23cb, 0x003882b6, 0x0109ca84, 0x03ad19bd, 0x015919b2, 0x00a734ca, 0x002b8355, 0x0037648a}}, Y: Field{[10]uint32{0x03726371, 0x02a78717, 0x03b7ad58, 0x01a0ed63, 0x01f37962, 0x00788ef3, 0x02f4a29d, 0x0359a2c7, 0x02e7bc59, 0x003b117d}}}, + {X: Field{[10]uint32{0x0016348d, 0x030176b7, 0x01c38686, 0x01bf06b5, 0x01fe2903, 0x00f788f1, 0x019def4f, 0x02f75efe, 0x0012009f, 0x001d20bc}}, Y: Field{[10]uint32{0x0040abd1, 0x0198e9ae, 0x025f8db1, 0x02eb0939, 0x0173fc0d, 0x0196eb44, 0x02b2a20b, 0x03dbc2fc, 0x020d5497, 0x00290f12}}}, + {X: Field{[10]uint32{0x00ebd9a5, 0x029a1a5c, 0x02377a69, 0x00c3dea6, 0x01537fca, 0x016c0c65, 0x012f587a, 0x0189e077, 0x019597fd, 0x003e933f}}, Y: Field{[10]uint32{0x03ae823a, 0x03af8771, 0x0105c1b8, 0x00c428c1, 0x01e2a350, 0x03862a3f, 0x031d269b, 0x03dde2f4, 0x02c99ddb, 0x00115a2d}}}, + {X: Field{[10]uint32{0x03a60b9e, 0x01f4440f, 0x00c53d9b, 0x034c9e51, 0x022f1078, 0x03c7ffaf, 0x0105e1b4, 0x00fa3a06, 0x03dae776, 0x00147834}}, Y: Field{[10]uint32{0x02da6740, 0x00bfca8d, 0x033f7bfa, 0x02948e57, 0x001da673, 0x008423b4, 0x01f20b90, 0x00beb33e, 0x00c4ab57, 0x00046368}}}, + {X: Field{[10]uint32{0x01bc9530, 0x00a99a03, 0x03f86c48, 0x01d3d03a, 0x00502fc6, 0x0227a5bd, 0x003b8572, 0x008cd4e3, 0x027cc055, 0x001f6395}}, Y: Field{[10]uint32{0x02b37571, 0x030ba9a3, 0x00ad7600, 0x00716172, 0x00748458, 0x02a2c985, 0x01fe552b, 0x0111a92e, 0x004600c6, 0x001db0ff}}}, + {X: Field{[10]uint32{0x011dfb1f, 0x00ae52b3, 0x000ed8d1, 0x019e7bd3, 0x011c316d, 0x03e8631e, 0x01f216fd, 0x0065bf74, 0x02d3b400, 0x00364931}}, Y: Field{[10]uint32{0x03ebcea8, 0x00aaa013, 0x012e59d8, 0x00649b1a, 0x0290b9d1, 0x023766e4, 0x01eb3f28, 0x0012e2c4, 0x00ee881c, 0x0003b0cf}}}, + {X: Field{[10]uint32{0x0293c0db, 0x01d115d7, 0x03b8f330, 0x006afe54, 0x033965cb, 0x02a6760a, 0x00d28b97, 0x00a72346, 0x030b06f6, 0x002372cc}}, Y: Field{[10]uint32{0x006857a3, 0x01d3cde9, 0x0097ab6d, 0x0103dbdf, 0x00b58b73, 0x004fe06a, 0x0129b573, 0x0240b46c, 0x01198323, 0x000f628b}}}, + {X: Field{[10]uint32{0x02a5d2b5, 0x01d27daf, 0x02e80d3f, 0x0074d68c, 0x0157910f, 0x036bad9c, 0x0386797d, 0x018de233, 0x023b94b0, 0x00374712}}, Y: Field{[10]uint32{0x03230777, 0x026fb7ac, 0x0064c086, 0x02f1cf5f, 0x003d2afe, 0x02de32de, 0x03e5be9a, 0x0160f590, 0x00c75a69, 0x003befb0}}}, + {X: Field{[10]uint32{0x03f5e772, 0x022a214d, 0x02dab765, 0x03caf1d8, 0x01ec0275, 0x0134a4b0, 0x01f6ec48, 0x035fdce5, 0x02341dfa, 0x000ac0f7}}, Y: Field{[10]uint32{0x03c0d0e3, 0x019a9db0, 0x03bdf971, 0x0346b926, 0x020803d7, 0x027de397, 0x03d48bb4, 0x0160b156, 0x00fb3818, 0x000c8d7a}}}, + {X: Field{[10]uint32{0x0028dde2, 0x01e320c5, 0x03f39479, 0x02f530f9, 0x02677f06, 0x01addc4c, 0x03a80efa, 0x016f25f9, 0x030fba14, 0x000e9e56}}, Y: Field{[10]uint32{0x00914691, 0x037d5e51, 0x0352b526, 0x013a8fc4, 0x0081af64, 0x03b502bb, 0x00bc9e1e, 0x022898df, 0x039ddf03, 0x003d0496}}}, + {X: Field{[10]uint32{0x004fcbbf, 0x0301621a, 0x01e59ef8, 0x0085e234, 0x03121f5c, 0x002a1476, 0x006c081b, 0x035b2e71, 0x013ba133, 0x0003b3e0}}, Y: Field{[10]uint32{0x03e53560, 0x035dce04, 0x020930ec, 0x0057af84, 0x02597e39, 0x02254a70, 0x02becd07, 0x02d1cdfc, 0x02f2a7b7, 0x001a7836}}}, + {X: Field{[10]uint32{0x02217d5a, 0x01a461b5, 0x00c33576, 0x01154da3, 0x03743832, 0x0138274f, 0x037191dd, 0x018f9040, 0x0182c141, 0x0018df12}}, Y: Field{[10]uint32{0x02ecb410, 0x03695cf7, 0x00b77a74, 0x011d6b19, 0x00f6fb37, 0x028de0c6, 0x03aaa5c0, 0x034b8c96, 0x02b8fd83, 0x0036968a}}}, + {X: Field{[10]uint32{0x01b90e87, 0x022cf8dc, 0x037c6b19, 0x01604947, 0x00542556, 0x0014c368, 0x03f5fac2, 0x016d5f73, 0x03a2d887, 0x00067f9c}}, Y: Field{[10]uint32{0x00151ca0, 0x027de836, 0x01ad35a3, 0x0204a3f0, 0x01a32646, 0x03f97a2e, 0x027a77a1, 0x0094630d, 0x00182ccc, 0x000ec0eb}}}, + {X: Field{[10]uint32{0x03b7ebb2, 0x0156dfce, 0x0023471d, 0x02f7c513, 0x00c68b4c, 0x02d9a02c, 0x01151b30, 0x03700027, 0x022a0d4c, 0x00005ba9}}, Y: Field{[10]uint32{0x013fa629, 0x03f3a779, 0x01f6a8ff, 0x0180b8ee, 0x0135f020, 0x02566030, 0x00612a89, 0x00b964ce, 0x021c5367, 0x00232b12}}}, + {X: Field{[10]uint32{0x02a40970, 0x00d4e508, 0x012e849f, 0x0217efd4, 0x00e1eed4, 0x01e7e68a, 0x00e54132, 0x01b4859e, 0x00b5454c, 0x001ae75a}}, Y: Field{[10]uint32{0x02365482, 0x02c6c9eb, 0x01472fa4, 0x01952c17, 0x03907f85, 0x02a223ad, 0x01e6969d, 0x038df6be, 0x004498eb, 0x002d8fd4}}}, + {X: Field{[10]uint32{0x035ed3e6, 0x037449c2, 0x01d05868, 0x01f48c59, 0x0232c3c2, 0x03edfb24, 0x03dc948a, 0x0204b0b9, 0x008c08f0, 0x0007e883}}, Y: Field{[10]uint32{0x01838076, 0x0137ad8a, 0x020cfed8, 0x015ca029, 0x026cd168, 0x0308a7fa, 0x03686062, 0x00d909f7, 0x034d8213, 0x0031495f}}}, + {X: Field{[10]uint32{0x036acc86, 0x0229a86f, 0x02263e8e, 0x00e2f941, 0x02af15bb, 0x00763d4d, 0x031df6b3, 0x02d37873, 0x00927dae, 0x001cea0f}}, Y: Field{[10]uint32{0x02eb8adc, 0x01eb5aa0, 0x000ab2fb, 0x02af937d, 0x0126a21d, 0x02326e24, 0x034e24de, 0x030c2e0a, 0x03e40cd6, 0x002822b2}}}, + {X: Field{[10]uint32{0x0188bdbe, 0x01d87b9d, 0x015a48e1, 0x033bf4a9, 0x0285ba90, 0x03389978, 0x0278cf93, 0x00b7bb28, 0x0264924e, 0x000ea655}}, Y: Field{[10]uint32{0x00cbbb0e, 0x02351711, 0x00f39dd4, 0x02f40edf, 0x02d011a1, 0x0072bc63, 0x0065d939, 0x00cf4d49, 0x02dc99eb, 0x003cc886}}}, + {X: Field{[10]uint32{0x01429c26, 0x01fc9a4f, 0x005965e0, 0x03ead3e2, 0x025ca516, 0x030583a1, 0x005cd9b9, 0x03d73075, 0x0219b032, 0x001f197b}}, Y: Field{[10]uint32{0x023704c5, 0x015ca900, 0x02287ff9, 0x0178dd0f, 0x018cc54a, 0x02f88893, 0x01076ae4, 0x03c9df4c, 0x02f90e3d, 0x0011f1fe}}}, + {X: Field{[10]uint32{0x00d397dc, 0x0002c8b9, 0x00fb03dc, 0x0365976e, 0x032f05e6, 0x0332e340, 0x0153118d, 0x036ef6f6, 0x014c6750, 0x0030041a}}, Y: Field{[10]uint32{0x008e730c, 0x020ee01b, 0x01be2395, 0x00054b50, 0x025a5e61, 0x0065bc4c, 0x01fde10a, 0x01510567, 0x00c6dd6c, 0x000ed245}}}, + {X: Field{[10]uint32{0x02519d57, 0x005f3d98, 0x03ae75e3, 0x00b29c8f, 0x01a33dcb, 0x0084d84c, 0x015a12b9, 0x022db5be, 0x008ed28d, 0x00389561}}, Y: Field{[10]uint32{0x03cfb7b6, 0x0364990f, 0x02fe4d36, 0x03007841, 0x00377c9a, 0x02060ec9, 0x0207dcd1, 0x036b5e60, 0x01aa1757, 0x0018bdf5}}}, + {X: Field{[10]uint32{0x00236ed9, 0x0295b40b, 0x03c45bd1, 0x029ddbbf, 0x01a9669d, 0x00778c34, 0x0078dfbf, 0x00a648ea, 0x00e57323, 0x003cc506}}, Y: Field{[10]uint32{0x0256b84c, 0x008d2e2b, 0x01552af7, 0x03d87e22, 0x0316a1ef, 0x00c2d6bb, 0x0234c8a6, 0x03651957, 0x0084dce0, 0x00398aae}}}, + {X: Field{[10]uint32{0x01703181, 0x004b0aef, 0x03770615, 0x026ba319, 0x021f3f3c, 0x01f079aa, 0x01c290d4, 0x00c4eeb2, 0x0145b876, 0x00026b6e}}, Y: Field{[10]uint32{0x030908fd, 0x01d347a7, 0x00f8650f, 0x003b7c3c, 0x0251531d, 0x03777cac, 0x020b82be, 0x00985920, 0x0142b463, 0x002c87f0}}}, + {X: Field{[10]uint32{0x008da322, 0x01b0f160, 0x03f36172, 0x01182e0e, 0x03ca04b8, 0x00d6ce42, 0x01132e9b, 0x018e8615, 0x032b9d4a, 0x00311a0a}}, Y: Field{[10]uint32{0x035f6972, 0x02d740f4, 0x025a26ee, 0x016a0d73, 0x0014e907, 0x00f8dbc1, 0x02597622, 0x02e8c86d, 0x006a7100, 0x003c96a4}}}, + {X: Field{[10]uint32{0x0280d63a, 0x028419ba, 0x0003da99, 0x03ceb810, 0x02559159, 0x025f1d97, 0x027c4055, 0x02711e05, 0x016d60f4, 0x003aec3f}}, Y: Field{[10]uint32{0x02a0b0f7, 0x0321a39a, 0x00350afd, 0x019dc1bd, 0x00c4202f, 0x022d0c72, 0x022ffcf2, 0x03218876, 0x0160667a, 0x003acdf4}}}, + {X: Field{[10]uint32{0x01a5597a, 0x006f2f02, 0x0334e355, 0x026257d5, 0x0165ffb0, 0x03fd8dfc, 0x0267cbbb, 0x02f2d000, 0x012070d8, 0x001e3c4b}}, Y: Field{[10]uint32{0x03bb78f8, 0x005c240a, 0x037407de, 0x038ce65c, 0x037419a3, 0x021f6672, 0x03574d2c, 0x005d586e, 0x02b33662, 0x0010a5da}}}, + {X: Field{[10]uint32{0x01919f69, 0x022befa1, 0x01eee579, 0x02ef9d9e, 0x0235ae41, 0x02525886, 0x039fbc2b, 0x012d8e60, 0x004af621, 0x0000f7ff}}, Y: Field{[10]uint32{0x03f2c456, 0x03fab615, 0x020e9036, 0x03fa40a1, 0x02a13480, 0x02765d40, 0x01d15a42, 0x0086b88b, 0x036b1b40, 0x001605d2}}}, + {X: Field{[10]uint32{0x015a15cc, 0x0175d16d, 0x028bf55d, 0x0034c914, 0x00bd16bf, 0x036ddbae, 0x015198f4, 0x010b2884, 0x0393a4ed, 0x00104324}}, Y: Field{[10]uint32{0x02d58306, 0x03ea8297, 0x003d7059, 0x0069cc7f, 0x0283c298, 0x0328945d, 0x00c2cf9b, 0x02e26f05, 0x00b1df71, 0x001013fd}}}, + {X: Field{[10]uint32{0x024e3649, 0x01b1256f, 0x031966c1, 0x01a599e5, 0x00b93e65, 0x03f9a5df, 0x03366326, 0x02c1e4f7, 0x015687d6, 0x001ad354}}, Y: Field{[10]uint32{0x0169f4e3, 0x0304697a, 0x01c815d6, 0x002a5544, 0x001a2556, 0x036c5d83, 0x02a03152, 0x0081fd74, 0x0094bbac, 0x00191e92}}}, + {X: Field{[10]uint32{0x01f34247, 0x01c716e9, 0x01fd94a7, 0x0091af93, 0x016f0d87, 0x00017670, 0x03ccfd85, 0x01661bc2, 0x017ae87d, 0x00163feb}}, Y: Field{[10]uint32{0x00069817, 0x0173c03c, 0x02ce5e50, 0x01afb8da, 0x03b33fba, 0x03218a70, 0x00d6f93e, 0x0057ebd4, 0x02d8f9ab, 0x002b62de}}}, + {X: Field{[10]uint32{0x02a757fd, 0x003ab3e9, 0x02c72b31, 0x01a5ca24, 0x00adb956, 0x00fa20ed, 0x03277382, 0x03eb782b, 0x001d1835, 0x0039b4f9}}, Y: Field{[10]uint32{0x01359c15, 0x0283bc08, 0x02e61045, 0x02aed09e, 0x03d6395c, 0x036f6e3b, 0x0303e425, 0x03b39f3b, 0x008cb580, 0x00284db2}}}, + {X: Field{[10]uint32{0x01953b35, 0x02ba51c3, 0x032a5573, 0x010828b4, 0x023b561b, 0x006f0409, 0x01044792, 0x0280c2b0, 0x022b43aa, 0x003f11f1}}, Y: Field{[10]uint32{0x006224f0, 0x00c18009, 0x03b29502, 0x00982ce4, 0x01627236, 0x00287d44, 0x02b58104, 0x01e019cc, 0x011d65fc, 0x00174c63}}}, + {X: Field{[10]uint32{0x03db251b, 0x02b2df1b, 0x031ca36b, 0x028a4cf2, 0x02d0a1b8, 0x00d54e19, 0x0278da90, 0x00deec23, 0x0067cbcb, 0x0033ab8a}}, Y: Field{[10]uint32{0x02bb3dfd, 0x00b47742, 0x00c16d4c, 0x00a4e862, 0x03956cc6, 0x010dc9ed, 0x0017b373, 0x02aa55e5, 0x007ec163, 0x00122fcb}}}, + {X: Field{[10]uint32{0x03efeab0, 0x02090f86, 0x02d78daa, 0x01d3225c, 0x039195fb, 0x0145b621, 0x03408d82, 0x00d6d708, 0x0378c847, 0x002aec48}}, Y: Field{[10]uint32{0x0366698e, 0x01646ccf, 0x01a02abb, 0x00d99c10, 0x01ce901c, 0x032295b6, 0x010be913, 0x02919767, 0x024b0da5, 0x001682fd}}}, + {X: Field{[10]uint32{0x0159eeaf, 0x03a9c00c, 0x0024f274, 0x03a50e92, 0x021a576c, 0x038458c5, 0x005302b0, 0x031f2486, 0x02398330, 0x0035de07}}, Y: Field{[10]uint32{0x0106651a, 0x01192bc3, 0x03310fbb, 0x02665bdb, 0x01261aed, 0x006f8f5f, 0x027398dd, 0x03171cfb, 0x00324e07, 0x0018d069}}}, + {X: Field{[10]uint32{0x024c760c, 0x02dda11f, 0x01a6dbe5, 0x00cf7f50, 0x016f3ad1, 0x00a8877c, 0x0171646d, 0x008115cb, 0x01cd46ec, 0x0029a463}}, Y: Field{[10]uint32{0x0132fa9c, 0x015b9f42, 0x034e51f0, 0x03ecbd98, 0x001d6c7c, 0x01484e5f, 0x030e4b53, 0x01263669, 0x02ba378d, 0x00303946}}}, + {X: Field{[10]uint32{0x03d1a204, 0x001132a0, 0x027706ef, 0x03809234, 0x027785e2, 0x017f65c1, 0x02b340a6, 0x037980e4, 0x02e4fbb5, 0x00104e93}}, Y: Field{[10]uint32{0x023dd197, 0x03c5cbe2, 0x027c343a, 0x01d1476c, 0x016595a6, 0x006c23f4, 0x02bc668d, 0x023cd0ef, 0x0106c18a, 0x00280d89}}}, + {X: Field{[10]uint32{0x0204001c, 0x00560717, 0x011a8968, 0x01988dcc, 0x0287fd87, 0x03ef4449, 0x004aa082, 0x002483db, 0x0024de8b, 0x003869ef}}, Y: Field{[10]uint32{0x026bed16, 0x02ac4006, 0x0249b29b, 0x02c7bea3, 0x013a3d90, 0x00695719, 0x01aeea26, 0x021cf452, 0x01fdd0a2, 0x000f8eea}}}, + {X: Field{[10]uint32{0x01333a75, 0x0283f0f7, 0x0142d8a9, 0x026c5e56, 0x01ab1dde, 0x028cdf81, 0x02e077f8, 0x033312d6, 0x02a0a147, 0x003fe4a4}}, Y: Field{[10]uint32{0x0223a166, 0x03d6de1e, 0x007a43b6, 0x00ae0c17, 0x02b555ea, 0x016b577f, 0x014b4122, 0x00d18dd9, 0x027c5f7a, 0x003943c0}}}, + {X: Field{[10]uint32{0x00cb9c0c, 0x000e7513, 0x0140d900, 0x03186600, 0x03afe849, 0x001170b4, 0x007a36b0, 0x02774e77, 0x0223437c, 0x003ab959}}, Y: Field{[10]uint32{0x0132e043, 0x01a25d37, 0x037be39f, 0x0100dcb5, 0x0055e62e, 0x00bf9f9e, 0x02b5a9b2, 0x01d0db72, 0x01e99284, 0x003c6e32}}}, + {X: Field{[10]uint32{0x00bd5282, 0x000b2d55, 0x012273d0, 0x0012f322, 0x017f9c60, 0x01230e79, 0x02da0f30, 0x028f7f87, 0x00be3467, 0x001f7483}}, Y: Field{[10]uint32{0x001485d0, 0x01a9a25f, 0x014c64eb, 0x020a377f, 0x02ee9225, 0x005dca91, 0x034c3f83, 0x034b5533, 0x0323f035, 0x003b134b}}}, + {X: Field{[10]uint32{0x02a877eb, 0x00b68fc4, 0x03fc73a0, 0x03af6c36, 0x03e4e245, 0x00ef68f0, 0x03b88703, 0x004a4551, 0x01cc5acf, 0x000d6604}}, Y: Field{[10]uint32{0x0108a792, 0x02b3663a, 0x03a59bb6, 0x02f8ada0, 0x037702d1, 0x00470e89, 0x03f916f5, 0x028f781b, 0x00878b97, 0x003b4bd4}}}, + {X: Field{[10]uint32{0x01a71c24, 0x00440b92, 0x005a2c03, 0x03282f18, 0x035a6c76, 0x00689346, 0x02d57ea0, 0x0329393a, 0x009cf2bc, 0x003eccfa}}, Y: Field{[10]uint32{0x031c9f45, 0x00a1874b, 0x0180e019, 0x010309ba, 0x03d7fca9, 0x00aa49cb, 0x035b9584, 0x009c15ea, 0x02f5ca60, 0x0031d780}}}, + {X: Field{[10]uint32{0x01f687aa, 0x03aed5b9, 0x036069d1, 0x003bca4e, 0x01b7b297, 0x0016944a, 0x034f836b, 0x01d28054, 0x033e5eed, 0x00028734}}, Y: Field{[10]uint32{0x02c4a6b0, 0x01e34207, 0x01abcc99, 0x01ea25a8, 0x01bdefc3, 0x0390e03a, 0x02b60cc1, 0x030d14ec, 0x02b90ccf, 0x003e4346}}}, + {X: Field{[10]uint32{0x00213614, 0x014d4131, 0x00999b85, 0x027876cc, 0x025d9f16, 0x03b62b24, 0x03383cfc, 0x00edeafe, 0x02b90364, 0x001185a5}}, Y: Field{[10]uint32{0x0033bc72, 0x0035668c, 0x018d60de, 0x0339a566, 0x03ee91c4, 0x02bafff4, 0x0340a859, 0x003e8323, 0x00775f30, 0x0019d3d7}}}, + {X: Field{[10]uint32{0x014ab025, 0x00356f78, 0x01727f39, 0x03c89d1c, 0x021fd5cd, 0x00fdfa2a, 0x00885ae9, 0x027daf33, 0x02221b58, 0x001b1aaa}}, Y: Field{[10]uint32{0x02077538, 0x034b2eea, 0x0015c9f8, 0x005e2329, 0x02aeb844, 0x02d43e9d, 0x0164483f, 0x02e4346b, 0x020340e1, 0x0029df17}}}, + {X: Field{[10]uint32{0x0261c38b, 0x013f35d3, 0x00268387, 0x0069cab3, 0x01792eff, 0x039ca79b, 0x032c7ee6, 0x00cc4340, 0x0391927f, 0x00324634}}, Y: Field{[10]uint32{0x000dfb5b, 0x010f201e, 0x03965742, 0x01c9b89f, 0x00fce24a, 0x016db2d6, 0x021bed0e, 0x0123e3b6, 0x006c3460, 0x00163f5d}}}, + {X: Field{[10]uint32{0x01ea5918, 0x03b1625b, 0x022c2142, 0x03c0cfef, 0x019240c3, 0x004f1253, 0x02c26542, 0x028fd792, 0x02161ca0, 0x001219e7}}, Y: Field{[10]uint32{0x021d1a41, 0x0347c78f, 0x004a9a30, 0x039e73c8, 0x03b2a19f, 0x019e1038, 0x03a29667, 0x02bf8fa4, 0x03fe300c, 0x00155be4}}}, + {X: Field{[10]uint32{0x02e7b858, 0x01a28c31, 0x02584699, 0x0166b11a, 0x025e9456, 0x02ab0216, 0x02d6eede, 0x0191029c, 0x01a9e46b, 0x0031a301}}, Y: Field{[10]uint32{0x01de450d, 0x00991805, 0x032b61b1, 0x01a934af, 0x03c76874, 0x000da845, 0x03d64a1d, 0x03fe02f8, 0x01dc35d4, 0x002e2d2d}}}, + {X: Field{[10]uint32{0x01444e6a, 0x00e1d5e7, 0x02dc9f05, 0x038dbcc9, 0x0121e3df, 0x01b151a6, 0x0176dc4b, 0x01227e3e, 0x03106358, 0x00344cfb}}, Y: Field{[10]uint32{0x02f968cb, 0x00f140ae, 0x005becbf, 0x03af8cad, 0x02327ec3, 0x03f59a9b, 0x02b0f57a, 0x0034b09c, 0x03c4db69, 0x000b19aa}}}, + {X: Field{[10]uint32{0x01f976ae, 0x02b416cf, 0x0119392d, 0x01828807, 0x0261ca0a, 0x0229f8b6, 0x00766dc4, 0x0277aac4, 0x03598d75, 0x0014d513}}, Y: Field{[10]uint32{0x0069cd47, 0x010aff8a, 0x017e879a, 0x00454df8, 0x030993d7, 0x028666b5, 0x004e3f03, 0x01ebbc08, 0x005e61cb, 0x00112688}}}, + {X: Field{[10]uint32{0x03b8b331, 0x00d2b2e0, 0x00a622fe, 0x0177b8dd, 0x009254c6, 0x012dadf0, 0x02263851, 0x0144cce7, 0x00740fda, 0x000c4228}}, Y: Field{[10]uint32{0x028b6243, 0x00c04c89, 0x0115b5d9, 0x0347d678, 0x00d6fc05, 0x030bc891, 0x01a473da, 0x00ffaa2c, 0x010d5426, 0x0010bb72}}}, + {X: Field{[10]uint32{0x00b4b23c, 0x0336329f, 0x03962154, 0x0301ac8b, 0x012ee58a, 0x03ad5618, 0x0295099a, 0x00701367, 0x000d052c, 0x000599b1}}, Y: Field{[10]uint32{0x03a82fb9, 0x01112c64, 0x0284fb6c, 0x011f4807, 0x00abafc2, 0x001d4a55, 0x0355923e, 0x0198e2aa, 0x0341ae04, 0x0014196e}}}, + {X: Field{[10]uint32{0x0247722e, 0x01c915fb, 0x02ad53a5, 0x0242ef57, 0x02ed80fa, 0x01dacb60, 0x001290df, 0x039aa3c0, 0x03ebd3ee, 0x00325b41}}, Y: Field{[10]uint32{0x0220baf3, 0x0370b31f, 0x032c8d00, 0x0391e290, 0x0113ba06, 0x0262dd27, 0x0016af17, 0x02dfa68d, 0x0004447f, 0x0034f5a7}}}, + {X: Field{[10]uint32{0x0181b49d, 0x02136447, 0x03479fce, 0x02f5ecb0, 0x00647fa7, 0x0339d50b, 0x0369a9e8, 0x016c15e1, 0x0039b11b, 0x0002a7ff}}, Y: Field{[10]uint32{0x00bcbee7, 0x0348489a, 0x03747375, 0x0124e394, 0x0280a644, 0x016101c4, 0x00894dc2, 0x00a3dfa6, 0x024882e9, 0x002fb084}}}, + {X: Field{[10]uint32{0x03af0632, 0x0317eefd, 0x00f2737f, 0x01fc6980, 0x03e82578, 0x024c83f4, 0x015d3f52, 0x024e0239, 0x028ccd4c, 0x0014b284}}, Y: Field{[10]uint32{0x0135f7c4, 0x010b378c, 0x02ec370f, 0x024e0d9d, 0x0137ffa4, 0x03676fee, 0x02bab014, 0x0232ded3, 0x028095a9, 0x00211ba2}}}, + {X: Field{[10]uint32{0x01407c20, 0x03e8d3aa, 0x039ae8e0, 0x00948ca6, 0x00006985, 0x0127df25, 0x00abc41e, 0x02649dee, 0x02c177fd, 0x003fe4aa}}, Y: Field{[10]uint32{0x03fdcfb5, 0x01e7d163, 0x03331a33, 0x024d0a91, 0x03dafd9a, 0x01c8c0dc, 0x03bf2a9b, 0x0149cfae, 0x00dd5aaf, 0x002bc363}}}, + {X: Field{[10]uint32{0x03991e0c, 0x007406c9, 0x03f09a54, 0x02c75ca7, 0x025fb653, 0x005340be, 0x0163c973, 0x0028f0e0, 0x033ed3c1, 0x0029a4a9}}, Y: Field{[10]uint32{0x0068b905, 0x026f9a79, 0x03809cff, 0x0126694d, 0x02aa05c9, 0x02e09056, 0x0063d006, 0x034fa036, 0x015a3e5b, 0x0001c8bd}}}, + {X: Field{[10]uint32{0x0120aefd, 0x031ffb50, 0x024e2e2f, 0x0298c573, 0x006b813b, 0x03263520, 0x02fc4cd2, 0x026a4f8c, 0x003f7a62, 0x00367967}}, Y: Field{[10]uint32{0x030214bb, 0x023853eb, 0x00d30eb0, 0x00e44eaa, 0x013234be, 0x002691ff, 0x01bf6589, 0x00c4653d, 0x01942307, 0x00093389}}}, + {X: Field{[10]uint32{0x00a0f6ff, 0x02394d01, 0x0358714b, 0x0169816a, 0x034dde8d, 0x02af3c16, 0x0191ef79, 0x02c42592, 0x030f7771, 0x001d3949}}, Y: Field{[10]uint32{0x03b1670f, 0x02c1186c, 0x0088714b, 0x0199a455, 0x0371ced0, 0x00d5ac78, 0x03a285f1, 0x00fc25a1, 0x01a3a4a8, 0x000ab618}}}, + {X: Field{[10]uint32{0x01d4420c, 0x0007d64c, 0x03f587a2, 0x0292161f, 0x02744668, 0x0255f0e8, 0x02856157, 0x03df9d86, 0x02301c43, 0x002e45a4}}, Y: Field{[10]uint32{0x0019536f, 0x007dd396, 0x03e5bebe, 0x008fd6c8, 0x03659ea4, 0x01945696, 0x01818e0c, 0x020a0133, 0x025bc126, 0x002f4d81}}}, + {X: Field{[10]uint32{0x024d51ee, 0x00e7640d, 0x03cd8792, 0x0325654e, 0x02cd01fd, 0x0016dfec, 0x02d72115, 0x01a36a5c, 0x02538645, 0x000dfebc}}, Y: Field{[10]uint32{0x03c15f85, 0x0127ab4e, 0x02823657, 0x008dbdef, 0x01d8c125, 0x028ef258, 0x02ea7360, 0x02cf9f9a, 0x02ce749d, 0x002da6b8}}}, + {X: Field{[10]uint32{0x020cf8d2, 0x0021eee8, 0x0214b43b, 0x02630661, 0x011c379f, 0x00373419, 0x0082477f, 0x004e2cd2, 0x014c4a1c, 0x00386504}}, Y: Field{[10]uint32{0x0098a93b, 0x00dd62ba, 0x00d6789e, 0x034f5c75, 0x00889f2a, 0x01452a66, 0x0182cf06, 0x0388b8ec, 0x034bb90a, 0x001e8ebe}}}, + {X: Field{[10]uint32{0x0217ddaa, 0x0150de7e, 0x0333cca0, 0x03bc245c, 0x011c8b13, 0x02056234, 0x008e4b3c, 0x02d145ce, 0x03010d3f, 0x000b38b6}}, Y: Field{[10]uint32{0x027bbbc0, 0x00c35dcd, 0x00922e2c, 0x02ce0043, 0x0074285c, 0x0346955a, 0x021529ae, 0x01daa617, 0x029daf0e, 0x00248cb6}}}, + {X: Field{[10]uint32{0x016f051f, 0x0063e7cf, 0x01f49986, 0x01b9658d, 0x000bd66c, 0x03fa9da2, 0x00e2e821, 0x01c114f7, 0x00484bdb, 0x0030a4bb}}, Y: Field{[10]uint32{0x03b57d6d, 0x0067b225, 0x008872b1, 0x00d849bd, 0x0312b777, 0x03454c91, 0x00af49bf, 0x039a7134, 0x00f06b81, 0x0008429d}}}, + {X: Field{[10]uint32{0x01acfeee, 0x00c80da9, 0x002ad3e1, 0x020f5ded, 0x020933db, 0x0360eb4f, 0x03b423cc, 0x022bbda5, 0x01c09761, 0x00056f32}}, Y: Field{[10]uint32{0x008a7a33, 0x00ea01ae, 0x0211c1a8, 0x02a403a5, 0x01a1bb98, 0x01244b28, 0x033c4901, 0x025bf6fe, 0x02f11bb9, 0x003a7f1f}}}, + {X: Field{[10]uint32{0x021e7785, 0x0132c91b, 0x03113fd2, 0x031a6756, 0x00848639, 0x017cb4a6, 0x03e45fe5, 0x00ef5e5e, 0x00af50f1, 0x00118467}}, Y: Field{[10]uint32{0x0042ea3b, 0x009ea4c2, 0x01215b13, 0x00056bac, 0x00ba3015, 0x03be4cad, 0x022cf8f9, 0x01bae5dd, 0x0391f4c5, 0x001a880f}}}, + {X: Field{[10]uint32{0x02f9ecf4, 0x037e216d, 0x03a649d9, 0x025179ac, 0x01cf1410, 0x03687e7f, 0x0149a3d2, 0x03c60aa5, 0x03943e4d, 0x003ce85d}}, Y: Field{[10]uint32{0x02cf7e8f, 0x033b041b, 0x02115c80, 0x03ff20bb, 0x00444a1d, 0x0167e0ca, 0x02b66198, 0x02b4e7f0, 0x03cc5e82, 0x002cd3ad}}}, + {X: Field{[10]uint32{0x03913fe4, 0x001d71ad, 0x03d67536, 0x03e940a5, 0x01fa98bd, 0x016e6831, 0x01cbd45f, 0x03d1a36e, 0x027484a7, 0x0033be42}}, Y: Field{[10]uint32{0x02301815, 0x0290289a, 0x0173730f, 0x01579715, 0x01fb79a5, 0x00941e1d, 0x03029465, 0x03ef0a19, 0x02ad2a43, 0x0034243b}}}, + {X: Field{[10]uint32{0x035702ce, 0x031bb4a8, 0x00b06833, 0x02dae418, 0x0126c528, 0x02fe9598, 0x00b88b24, 0x02a4e3b1, 0x0214987a, 0x00087628}}, Y: Field{[10]uint32{0x004579e4, 0x019bc9b6, 0x03c8e94b, 0x03a69407, 0x00f736df, 0x00228a0c, 0x028167c0, 0x0288ef18, 0x000d5b65, 0x0030d50d}}}, + {X: Field{[10]uint32{0x021ca53e, 0x00e5460e, 0x0361d5d1, 0x03e91b81, 0x00e19196, 0x020b6f49, 0x0204f6cf, 0x02f9298a, 0x03279049, 0x001ac63f}}, Y: Field{[10]uint32{0x01ffa3b7, 0x033f6cb1, 0x038d86ca, 0x035c948b, 0x026343f0, 0x01a63e8c, 0x001e9b26, 0x004d9e3e, 0x030c52c0, 0x003be01b}}}, + {X: Field{[10]uint32{0x03466e6f, 0x02b8c772, 0x020ee850, 0x00db0206, 0x00bab07c, 0x028f99cf, 0x0332afbe, 0x03301354, 0x00f20452, 0x001f63bd}}, Y: Field{[10]uint32{0x00fa0c0d, 0x0298910b, 0x017bc137, 0x011fc644, 0x01d224da, 0x03c43db2, 0x03367d0d, 0x033bbc9c, 0x026755a2, 0x000c9185}}}, + {X: Field{[10]uint32{0x00d12cab, 0x012d2208, 0x01afd699, 0x0182c74c, 0x02034135, 0x016b1d28, 0x03b63276, 0x015927d6, 0x002155d1, 0x0031f786}}, Y: Field{[10]uint32{0x02eaa23a, 0x014b39e5, 0x02844482, 0x00d8475f, 0x007fbe01, 0x030c9036, 0x03b86595, 0x00b03f24, 0x0056c5fb, 0x00366596}}}, + {X: Field{[10]uint32{0x0381b294, 0x0224ef50, 0x005c600f, 0x0025ca65, 0x03eddeff, 0x017e93ac, 0x01eb6ee4, 0x00b0ec62, 0x033a915e, 0x00133b2c}}, Y: Field{[10]uint32{0x02a3aeb1, 0x02ef6387, 0x036ffd1b, 0x0384cc42, 0x033534d6, 0x02dc0335, 0x02250357, 0x0072e111, 0x0112b5e6, 0x0033c5fc}}}, + {X: Field{[10]uint32{0x02255749, 0x02a99619, 0x00c10204, 0x00aca172, 0x001c9bc7, 0x033c03f9, 0x003ab5d4, 0x0181aed3, 0x0064bfce, 0x00209b3d}}, Y: Field{[10]uint32{0x036849c4, 0x02388d5e, 0x011cbb87, 0x0192c600, 0x036d7ca5, 0x00542a8b, 0x016fabfb, 0x00a16d45, 0x0031527d, 0x001ae8ed}}}, + {X: Field{[10]uint32{0x008f8f62, 0x0061f9d9, 0x0028e0b2, 0x002360ba, 0x01de51d6, 0x035bf043, 0x012ba922, 0x03491546, 0x02c6f497, 0x003204b6}}, Y: Field{[10]uint32{0x008b317e, 0x01ad2aec, 0x028f61ba, 0x0361ddcf, 0x002be94d, 0x03ebd4ff, 0x026ee1ae, 0x001a0204, 0x00c77363, 0x000340ba}}}, + {X: Field{[10]uint32{0x00ff8851, 0x03574ff8, 0x00d1e3c6, 0x01adb8e3, 0x03aa4592, 0x027c53ae, 0x01eaa8bc, 0x01fd1f91, 0x010ebd96, 0x00149a55}}, Y: Field{[10]uint32{0x01a7455b, 0x021987e6, 0x0295a38b, 0x0340c21a, 0x01b45963, 0x0346cff4, 0x03422ffc, 0x03b3b510, 0x012026e3, 0x0028565f}}}, + {X: Field{[10]uint32{0x004d7676, 0x02bfb9fa, 0x01e9baf1, 0x01b55294, 0x00c7c2ae, 0x037102ea, 0x002721fc, 0x014b3ef1, 0x032980e6, 0x001ff3f2}}, Y: Field{[10]uint32{0x002cfcdd, 0x037afe22, 0x00ce9f95, 0x03d59aa7, 0x02a4d044, 0x0323c675, 0x02bcbaaa, 0x0238d3b1, 0x01904a40, 0x002afdcb}}}, + {X: Field{[10]uint32{0x00a9f451, 0x03712d99, 0x0057c079, 0x03ae2eaa, 0x033d5f25, 0x00ca9a81, 0x00e18a21, 0x03841212, 0x02a04597, 0x00217c06}}, Y: Field{[10]uint32{0x01f081af, 0x013b11f9, 0x0013204b, 0x03072d38, 0x025398ce, 0x016f3d15, 0x03b71ab3, 0x02061dee, 0x00eb8a05, 0x003dd18f}}}, + {X: Field{[10]uint32{0x02885628, 0x03e37fe4, 0x035fda01, 0x02f08900, 0x00dc1a5f, 0x003fafbb, 0x03fee1d1, 0x02183eb0, 0x021a7dcd, 0x000256d2}}, Y: Field{[10]uint32{0x02f7f772, 0x0101bb2f, 0x00d97f70, 0x03b48dce, 0x021f80bc, 0x0131bb8f, 0x029dfa69, 0x01119fbe, 0x039c5bd9, 0x000a8337}}}, + {X: Field{[10]uint32{0x036c51c5, 0x0243b35f, 0x009f049b, 0x02b3b11c, 0x008cd95c, 0x00ddd4f6, 0x014b38ce, 0x03742ec9, 0x00a624dd, 0x00013d89}}, Y: Field{[10]uint32{0x037a4fa5, 0x039612f1, 0x02bd070c, 0x03ac6e5d, 0x00668de4, 0x0333f515, 0x0220dcd8, 0x03b3640a, 0x028302ef, 0x0021d2a6}}}, + {X: Field{[10]uint32{0x0106b48d, 0x03759b5d, 0x00043437, 0x0215a635, 0x02a2914d, 0x0117a71b, 0x0040f585, 0x014def39, 0x0112e18b, 0x000e781a}}, Y: Field{[10]uint32{0x02f352e0, 0x01e859c1, 0x03ef18db, 0x01b51a56, 0x0200f06c, 0x004a2a84, 0x0080153c, 0x00c25aaf, 0x020a16e9, 0x003bfc83}}}, + {X: Field{[10]uint32{0x00f1ace9, 0x005ed19e, 0x013107a7, 0x02d97bee, 0x014c1d41, 0x032b6e5e, 0x03f4f590, 0x01e0c5d3, 0x013266d6, 0x0014bb70}}, Y: Field{[10]uint32{0x00d402d1, 0x01aef071, 0x0127c3af, 0x01563d1a, 0x03cb07cf, 0x01a135f4, 0x02c0bf49, 0x0078ff8c, 0x0202c678, 0x00395a78}}}, + {X: Field{[10]uint32{0x0328465f, 0x0290fcd0, 0x00d3a1df, 0x0235bcaa, 0x01e4e945, 0x02457f23, 0x0287f07c, 0x02041cf8, 0x0348964b, 0x0038dd92}}, Y: Field{[10]uint32{0x00fdb023, 0x01723cd3, 0x01b6c3ad, 0x02a94e9e, 0x005b7261, 0x03435d5d, 0x01b460f6, 0x0382e8d4, 0x024bfb13, 0x002f78a9}}}, + {X: Field{[10]uint32{0x00f513e6, 0x009fbfef, 0x00ebe756, 0x02b6710b, 0x03e1c81a, 0x03e05cca, 0x0038768e, 0x01a638fb, 0x01077c77, 0x00203bf9}}, Y: Field{[10]uint32{0x0388b709, 0x03c41280, 0x00bc3483, 0x005d6bb5, 0x02a9df2e, 0x014f4f67, 0x01e60599, 0x0247a5a5, 0x031bc543, 0x001a4319}}}, + {X: Field{[10]uint32{0x0108b641, 0x00fdc3f2, 0x02728517, 0x01fa4fe3, 0x0319b0bf, 0x01f348fb, 0x032bcac8, 0x03125e8b, 0x03d50ebc, 0x001212b1}}, Y: Field{[10]uint32{0x00ef371e, 0x013a97a4, 0x02eb61b4, 0x0254530a, 0x015bc8c9, 0x014fcc9c, 0x02b85516, 0x01c8da7c, 0x00e6f3b1, 0x0007655c}}}, + {X: Field{[10]uint32{0x03e3d124, 0x023ed7dd, 0x03f6536b, 0x0098e007, 0x02adf26c, 0x0105737e, 0x03ca53e4, 0x02f76137, 0x023fbf1f, 0x00272627}}, Y: Field{[10]uint32{0x00212a38, 0x02aac322, 0x02dd4c79, 0x010b5fc5, 0x002993c4, 0x023fb8eb, 0x00b3b802, 0x0058ee59, 0x021f5755, 0x0028d2b9}}}, + {X: Field{[10]uint32{0x01a5066b, 0x02315f5d, 0x018e0930, 0x034a5ec3, 0x0032846d, 0x0278dfe0, 0x016570f1, 0x03f9fd91, 0x030f601a, 0x00022e3e}}, Y: Field{[10]uint32{0x0048c9e7, 0x02ca783a, 0x03b3c240, 0x01c89bc0, 0x01d6166c, 0x003f59e8, 0x0232f100, 0x039b26cb, 0x02feffc4, 0x0001e162}}}, + {X: Field{[10]uint32{0x02e78177, 0x0367581f, 0x000ef451, 0x00e88470, 0x03bce095, 0x00297601, 0x01baa79e, 0x035e6a60, 0x02740ee1, 0x0038df43}}, Y: Field{[10]uint32{0x009f8f9c, 0x008fafec, 0x02e6f4bd, 0x024eaad3, 0x01a07d05, 0x03f9661d, 0x01b5625b, 0x0097d37c, 0x028502ad, 0x0034a284}}}, + {X: Field{[10]uint32{0x0325c147, 0x02a79c04, 0x00e194b2, 0x03555334, 0x03281052, 0x01d95ec7, 0x0258e754, 0x00da0eb5, 0x037e9a00, 0x00203215}}, Y: Field{[10]uint32{0x024d945c, 0x018d1bd5, 0x03fe432a, 0x0266f3ee, 0x03fe2baf, 0x01ca5cd1, 0x03ba8a0d, 0x028babb1, 0x00cd7ca3, 0x0002cff4}}}, + {X: Field{[10]uint32{0x02a8c6a1, 0x02ce0ccf, 0x0349adde, 0x0234b414, 0x0150f6ba, 0x01eb806a, 0x02f79026, 0x0087954d, 0x016d0341, 0x0039c117}}, Y: Field{[10]uint32{0x02181fba, 0x0222ae22, 0x019e4e7d, 0x00bfa5d5, 0x0060b37c, 0x00a97749, 0x01571d9c, 0x02537f85, 0x00db3269, 0x001cc1aa}}}, + {X: Field{[10]uint32{0x012e0d71, 0x025e3219, 0x029804f2, 0x03df2cd1, 0x02d87554, 0x0300e226, 0x03af0b13, 0x011fedac, 0x024b850a, 0x001574b6}}, Y: Field{[10]uint32{0x03e16e7c, 0x01879e77, 0x02780723, 0x01b57311, 0x010189a5, 0x008bbb97, 0x020b7b4f, 0x0343db34, 0x0182c861, 0x001ab03e}}}, + {X: Field{[10]uint32{0x01a38d2f, 0x00736c2c, 0x019f55bd, 0x00710100, 0x03a1e86d, 0x00540300, 0x03a5ff21, 0x00bdff20, 0x020955a2, 0x0033958b}}, Y: Field{[10]uint32{0x021bb865, 0x01b65ad4, 0x02d314bd, 0x00c9bc73, 0x02474070, 0x03717e0b, 0x030a165e, 0x0311ef1a, 0x004db4aa, 0x00247780}}}, + {X: Field{[10]uint32{0x0054773b, 0x0164b8de, 0x036fecc7, 0x02e1ae4e, 0x0100cd0e, 0x00c41fc7, 0x011bd645, 0x02bc15fe, 0x021f0596, 0x001d3803}}, Y: Field{[10]uint32{0x00e1d217, 0x03edd276, 0x01374e13, 0x005445e4, 0x016fa9f0, 0x0042851b, 0x0311867b, 0x00a94fac, 0x00a338e5, 0x000472a2}}}, + {X: Field{[10]uint32{0x0104eb48, 0x0267e788, 0x00530a2e, 0x00e6561a, 0x0368214d, 0x0324bb65, 0x003e400a, 0x03db2476, 0x036bc194, 0x002ba3c2}}, Y: Field{[10]uint32{0x03ce4cf2, 0x0173bb35, 0x02362c85, 0x01cc5191, 0x00d4aa8f, 0x02d5f2fe, 0x0127de9e, 0x02a4c0d8, 0x00420dc0, 0x003a5cff}}}, + {X: Field{[10]uint32{0x03891ae7, 0x00bf737b, 0x03674158, 0x0089bdda, 0x037854e7, 0x0197ccf4, 0x008e0c05, 0x00d9d784, 0x006c8df8, 0x00102a30}}, Y: Field{[10]uint32{0x007bf7ed, 0x00155762, 0x0224ea10, 0x00260ebd, 0x01b8ff9c, 0x003eaafb, 0x029e0b04, 0x01abf4f4, 0x0050b511, 0x0005ae9e}}}, + {X: Field{[10]uint32{0x01f83b33, 0x037c6f1b, 0x00e487f6, 0x02c13490, 0x03926795, 0x0187c7ff, 0x02b410f8, 0x03dbea8a, 0x02545c57, 0x00187aa7}}, Y: Field{[10]uint32{0x0279ed15, 0x01c56076, 0x0003c490, 0x019ce2a3, 0x02b9063e, 0x03514a7c, 0x021791f7, 0x005f0dcb, 0x012ae0b2, 0x0031a7b0}}}, + {X: Field{[10]uint32{0x01d37632, 0x0032d7b0, 0x031cc30a, 0x03b09920, 0x03d73e25, 0x00517f05, 0x01f55f72, 0x02aa93f3, 0x00d4440c, 0x00072227}}, Y: Field{[10]uint32{0x02d72fdf, 0x016f2508, 0x00166ee5, 0x02184558, 0x00574f5b, 0x036d792c, 0x014a2237, 0x0299f1cc, 0x0246131f, 0x000106d4}}}, + {X: Field{[10]uint32{0x0249525d, 0x0059a863, 0x02abb4ab, 0x001894e4, 0x01c58e0d, 0x02d42fe9, 0x02a99d3a, 0x021f9e60, 0x0090791d, 0x003fca56}}, Y: Field{[10]uint32{0x01454570, 0x02680686, 0x00a58e61, 0x027fbef9, 0x02c37087, 0x02201bef, 0x0249baf8, 0x004d9065, 0x00de1995, 0x00282599}}}, + {X: Field{[10]uint32{0x00e95f99, 0x02a1d9e1, 0x037857bc, 0x02bb66f7, 0x0174e399, 0x023e2433, 0x00939e5b, 0x007f401f, 0x02bfcfca, 0x0017acba}}, Y: Field{[10]uint32{0x032c9871, 0x03ee3efd, 0x00f63031, 0x0097f844, 0x0001f46f, 0x00589976, 0x01aff120, 0x01e0f080, 0x01701c9a, 0x001310ba}}}, + {X: Field{[10]uint32{0x02cbaf91, 0x01edad3d, 0x0361fcfc, 0x0136054f, 0x033b17bf, 0x0281c706, 0x03f8ce17, 0x0324ed6c, 0x008cdbcc, 0x0010f954}}, Y: Field{[10]uint32{0x03dfdcfc, 0x001cd0e6, 0x0063815a, 0x01cf6c90, 0x03c853bb, 0x002694c1, 0x01ec388d, 0x029c7942, 0x0378438b, 0x002d7b63}}}, + {X: Field{[10]uint32{0x01b56f53, 0x0303dd7f, 0x02c995b0, 0x021dfdb8, 0x00eb513f, 0x02bf94cf, 0x0207261c, 0x00837f21, 0x013023cb, 0x003d745a}}, Y: Field{[10]uint32{0x026ece68, 0x03837084, 0x008f492c, 0x0101bacb, 0x002557dd, 0x00f8a597, 0x03c4bf87, 0x020ccbdf, 0x01680152, 0x00394e6c}}}, + {X: Field{[10]uint32{0x00aba2a1, 0x038303de, 0x01eb6c7f, 0x01bee944, 0x0372313c, 0x0198a8ba, 0x0180a62d, 0x02a46118, 0x02d15dc5, 0x0036e759}}, Y: Field{[10]uint32{0x01517227, 0x02883ca8, 0x030b1f89, 0x02d6070f, 0x003cfb46, 0x0095e15f, 0x02762d92, 0x03716a78, 0x00a361f0, 0x00325b7a}}}, + {X: Field{[10]uint32{0x028ecdf2, 0x02992e21, 0x01ab6833, 0x00209ee6, 0x0356ffce, 0x02fd44ce, 0x0165bfe7, 0x018ef13d, 0x03d846fd, 0x0039d834}}, Y: Field{[10]uint32{0x02f102ce, 0x00397504, 0x003810e6, 0x0048a172, 0x012c1c1e, 0x01018b80, 0x021cc825, 0x00bad060, 0x028508be, 0x00183b99}}}, + {X: Field{[10]uint32{0x0033e026, 0x0075e417, 0x00d99135, 0x02c0c769, 0x00e3a956, 0x00b8dc01, 0x02533e71, 0x029eaf48, 0x02990cac, 0x000af6c8}}, Y: Field{[10]uint32{0x02e44731, 0x011c4fed, 0x03f82a78, 0x0218932e, 0x03801932, 0x009f4039, 0x003e877e, 0x0204176b, 0x00dfc273, 0x001919d7}}}, + {X: Field{[10]uint32{0x0166bee4, 0x021ee6a0, 0x03bbfc3c, 0x00838006, 0x007be48d, 0x03f5b211, 0x00137739, 0x0084d2de, 0x03fd0599, 0x00073382}}, Y: Field{[10]uint32{0x02d37057, 0x0222ef72, 0x034cc427, 0x00fb059b, 0x02b5eeb7, 0x03367a0f, 0x021253c4, 0x03f8c30e, 0x02e51ed7, 0x000b52a3}}}, + {X: Field{[10]uint32{0x03641075, 0x03e2695d, 0x035bd6eb, 0x0316ed95, 0x01ec8405, 0x031ae319, 0x01b5bd8e, 0x02b9effd, 0x03c37f5d, 0x001b5af8}}, Y: Field{[10]uint32{0x009c2c7f, 0x011b33eb, 0x01b80392, 0x0234d456, 0x0324d193, 0x0313abd2, 0x011507f7, 0x034ef180, 0x001f5c6f, 0x0013f4f3}}}, + {X: Field{[10]uint32{0x01b22351, 0x001f62ef, 0x0036cc60, 0x00bc50fa, 0x01b3c67f, 0x01d63e87, 0x03fb1ca8, 0x01e075e0, 0x0180d96e, 0x000360b0}}, Y: Field{[10]uint32{0x02d0c7d9, 0x01ee389e, 0x031e151a, 0x03d9e592, 0x0037415a, 0x01290c86, 0x033e9a97, 0x02b6a24e, 0x0269952a, 0x000e00bd}}}, + {X: Field{[10]uint32{0x01b3cd71, 0x0233860f, 0x02343b22, 0x03ba31cf, 0x00fbf9fc, 0x0151bc6e, 0x01dfed1b, 0x03f4d3e4, 0x02dd7e03, 0x0013b187}}, Y: Field{[10]uint32{0x003ba9a9, 0x021215ac, 0x01cffb19, 0x023eaa50, 0x02db7d94, 0x03a7b0f1, 0x0390340d, 0x038bb22b, 0x0309b5b2, 0x00384665}}}, + {X: Field{[10]uint32{0x017a034b, 0x01e07a78, 0x01643add, 0x023e39cd, 0x02a8df7a, 0x03ab44fb, 0x00744d7b, 0x02846e95, 0x006973ae, 0x000c6ab5}}, Y: Field{[10]uint32{0x00b37adb, 0x02d9d3e1, 0x02913f13, 0x03e39838, 0x02a94680, 0x033b5d21, 0x028bdf57, 0x03d818fd, 0x03413e49, 0x001919db}}}, + {X: Field{[10]uint32{0x01173e02, 0x00739353, 0x0131a5eb, 0x02f65f8a, 0x0201f946, 0x01627a98, 0x0115903b, 0x036e3bd9, 0x01892fcc, 0x002a6108}}, Y: Field{[10]uint32{0x01a3908b, 0x01222922, 0x02049abe, 0x01b42959, 0x0307ea26, 0x0335becd, 0x0370e133, 0x035e8e8c, 0x02ac3b2d, 0x00142f9d}}}, + {X: Field{[10]uint32{0x03bef099, 0x0383b3ad, 0x015e3f8f, 0x0022941a, 0x02fee79b, 0x01dd5033, 0x02cfa092, 0x0010cde9, 0x00f33ec0, 0x00208ad5}}, Y: Field{[10]uint32{0x036bf7f6, 0x01121448, 0x007128d0, 0x00dbf6a3, 0x007405d3, 0x022016fc, 0x003ddced, 0x03d811cd, 0x03c620d3, 0x000e4d88}}}, + {X: Field{[10]uint32{0x01065e0b, 0x037c9705, 0x02a3d33a, 0x0043a677, 0x0215793d, 0x02ff175f, 0x038de14e, 0x01c00317, 0x0355fe3d, 0x000403da}}, Y: Field{[10]uint32{0x02ecb4c2, 0x0335d293, 0x00e519b2, 0x034373b2, 0x00a352ff, 0x035b0445, 0x01282676, 0x037789f2, 0x00f758c4, 0x00346ed1}}}, + {X: Field{[10]uint32{0x02142f7f, 0x03a20db5, 0x031bb2d4, 0x01f16b6d, 0x006a5425, 0x00657425, 0x01aa6ecd, 0x03089d20, 0x03186a09, 0x00329760}}, Y: Field{[10]uint32{0x0277b42d, 0x013d3649, 0x0133de01, 0x00c7f1ce, 0x03878d8d, 0x012b815f, 0x03a0c388, 0x01e82bce, 0x007fb974, 0x00362421}}}, + {X: Field{[10]uint32{0x00bfbf14, 0x03684b89, 0x016cafa5, 0x00fc406d, 0x00e8ffe5, 0x0263fd84, 0x031a352f, 0x034838a4, 0x01f42234, 0x003a4709}}, Y: Field{[10]uint32{0x024dbb86, 0x02d288a5, 0x02b41872, 0x03d450f3, 0x037a26bc, 0x0183a669, 0x01740f6d, 0x0314af1c, 0x01e5441e, 0x002c7b05}}}, + {X: Field{[10]uint32{0x02e34445, 0x02750b06, 0x0306509e, 0x011cb33d, 0x03acb545, 0x00ba66b9, 0x029b2902, 0x000b6215, 0x00dc3109, 0x0015ea32}}, Y: Field{[10]uint32{0x00ab1fb7, 0x0185878c, 0x00accb9c, 0x00fee308, 0x0250e7cc, 0x01219abb, 0x0292db56, 0x038277d3, 0x01410442, 0x00214891}}}, + {X: Field{[10]uint32{0x0104500f, 0x00116c1c, 0x007d9581, 0x00769bfa, 0x0355a853, 0x02300adb, 0x01d0d412, 0x0345b6eb, 0x00672502, 0x0008cae3}}, Y: Field{[10]uint32{0x01f93fb9, 0x02903d61, 0x00f399a7, 0x03679863, 0x034f5255, 0x0152524b, 0x03c476f6, 0x02161c89, 0x020e9e7d, 0x000e0442}}}, + {X: Field{[10]uint32{0x03004fec, 0x0189ff9d, 0x00876187, 0x031c38f7, 0x020750d5, 0x0067df9e, 0x01d48763, 0x01a6cd3d, 0x028ad71f, 0x001f42f9}}, Y: Field{[10]uint32{0x01124633, 0x027bf351, 0x01e67ca0, 0x0060b291, 0x02a12b1d, 0x0296e5c7, 0x02f54028, 0x03cf9875, 0x00507d0a, 0x000f9ca8}}}, + {X: Field{[10]uint32{0x02f93292, 0x01e8b49e, 0x00d836ba, 0x0312691b, 0x01b70b02, 0x00310d21, 0x01fa4369, 0x0289c725, 0x030b77c2, 0x00137617}}, Y: Field{[10]uint32{0x0011d597, 0x038efd47, 0x0178e8c9, 0x01348206, 0x00f139e6, 0x036b69e8, 0x02b6ff85, 0x01366122, 0x02e5c955, 0x00210d90}}}, + {X: Field{[10]uint32{0x012e52f8, 0x01938bdc, 0x032149e2, 0x0307add9, 0x023eb2e5, 0x012ea69e, 0x03531a17, 0x008011c2, 0x03f588f0, 0x0014dea4}}, Y: Field{[10]uint32{0x000e161f, 0x00e6d84d, 0x03ebb3f8, 0x03e5e095, 0x0394efa1, 0x006256bc, 0x0225f067, 0x02499823, 0x03a0dc00, 0x002c366c}}}, + {X: Field{[10]uint32{0x02e48684, 0x00accc67, 0x00ae8b97, 0x02420962, 0x01ab3465, 0x03e0aff4, 0x00e60a46, 0x00795e63, 0x0071325b, 0x0004febd}}, Y: Field{[10]uint32{0x0234f743, 0x0086b79d, 0x00bfa49a, 0x0062116e, 0x02dce7ba, 0x026c8806, 0x02f25857, 0x02d4a788, 0x0384e84e, 0x00299c80}}}, + {X: Field{[10]uint32{0x03e8acb8, 0x03910173, 0x0206be1b, 0x02088b67, 0x03ca17c4, 0x00277b79, 0x015dbea8, 0x02cd1380, 0x00ed5861, 0x001a4789}}, Y: Field{[10]uint32{0x01c529ab, 0x026ddae4, 0x03f966f4, 0x0250f43c, 0x035ad002, 0x036718d1, 0x0120d909, 0x01ec3f31, 0x02dc0c19, 0x0038d592}}}, + {X: Field{[10]uint32{0x013d7ea2, 0x0305771f, 0x0373f423, 0x03e2411f, 0x03b754b3, 0x02ccd248, 0x02a394ff, 0x02a14056, 0x0391aaae, 0x000d950e}}, Y: Field{[10]uint32{0x03be5799, 0x0228bc6e, 0x02fd52d6, 0x03f9687e, 0x039dff44, 0x00860252, 0x008c8389, 0x02003a39, 0x0293b79b, 0x0001ced1}}}, + {X: Field{[10]uint32{0x0033f05b, 0x0082c1e1, 0x008a224f, 0x02c3f8ef, 0x000e007b, 0x00c83aa0, 0x00450455, 0x02032c78, 0x03e03941, 0x003fc96a}}, Y: Field{[10]uint32{0x030b7e51, 0x00d8c794, 0x026c2f90, 0x038022bb, 0x02938f69, 0x03676d04, 0x01bd678a, 0x0399439b, 0x010926df, 0x002944ac}}}, + {X: Field{[10]uint32{0x0187e443, 0x00e2685f, 0x0322272d, 0x0305c314, 0x00cc607b, 0x034091eb, 0x0051f57c, 0x03f6bd44, 0x007b5faa, 0x000077b0}}, Y: Field{[10]uint32{0x03a9a325, 0x014252e7, 0x038d3bb3, 0x019f4384, 0x00d870ce, 0x016636b5, 0x02207a92, 0x00af0168, 0x0137382b, 0x001f9dfa}}}, + {X: Field{[10]uint32{0x03413c32, 0x030a6527, 0x02236029, 0x0237f18d, 0x01485ab7, 0x00538246, 0x020147ed, 0x0218cba8, 0x0376f62f, 0x000bc43d}}, Y: Field{[10]uint32{0x00d2184a, 0x009a7b1a, 0x02f5ad25, 0x01a0cf9f, 0x0235c236, 0x02a9ac7d, 0x01d8c8b5, 0x0118b82e, 0x03c6e760, 0x000ecb17}}}, + {X: Field{[10]uint32{0x02bd73ca, 0x018008b6, 0x00188311, 0x010f3060, 0x02ade319, 0x02f2bed2, 0x03096814, 0x00b36eb3, 0x0394e61c, 0x001e5d3c}}, Y: Field{[10]uint32{0x01e98309, 0x020d8022, 0x0005673c, 0x03a0c439, 0x012be4cd, 0x004ee914, 0x01f854e8, 0x02a99a1f, 0x01a03bc1, 0x00386cd3}}}, + {X: Field{[10]uint32{0x0301c332, 0x01d233c5, 0x01b14436, 0x03780e94, 0x0132af1e, 0x012a8da5, 0x01774698, 0x03105959, 0x03393c5c, 0x00015317}}, Y: Field{[10]uint32{0x01043e4e, 0x0306da81, 0x020cd800, 0x02b3bde2, 0x02ddbde8, 0x03baadae, 0x030626a0, 0x0273148a, 0x03494976, 0x000f719e}}}, + {X: Field{[10]uint32{0x025f3783, 0x03068ed0, 0x0115d081, 0x00179556, 0x028092e9, 0x0061616b, 0x00a972a3, 0x031fac76, 0x0296f047, 0x000666a8}}, Y: Field{[10]uint32{0x0346c262, 0x03a3f1fa, 0x002e2b87, 0x038433b8, 0x02585154, 0x03f4e899, 0x00a7946d, 0x01ea5ad3, 0x027964d1, 0x003d608d}}}, + {X: Field{[10]uint32{0x03b7f299, 0x03c222a6, 0x03e879a7, 0x02f9e5da, 0x03cbcdf0, 0x007f1639, 0x0292a3ba, 0x01b7e9b0, 0x01d6fb61, 0x0034574e}}, Y: Field{[10]uint32{0x03d7a900, 0x016e980a, 0x01061f70, 0x00602d5f, 0x01679dd4, 0x010eff1e, 0x03d4912f, 0x03e0def6, 0x017c4e37, 0x001322ba}}}, + {X: Field{[10]uint32{0x024ef58b, 0x019a0fcd, 0x02df5a6f, 0x032a696b, 0x01bff26e, 0x0012e0af, 0x02332c6a, 0x01f7f206, 0x0134880e, 0x001db594}}, Y: Field{[10]uint32{0x001507e7, 0x01101ad0, 0x0246a646, 0x02f16fc4, 0x027b4aa5, 0x025d6e68, 0x02c90486, 0x00b60e87, 0x0308bbd2, 0x002dc6b9}}}, + {X: Field{[10]uint32{0x00ae51b7, 0x002050f7, 0x02a02a03, 0x03865301, 0x03452ef0, 0x024bfea6, 0x02e9ead7, 0x03f8d8c2, 0x02a5d4df, 0x0007ad34}}, Y: Field{[10]uint32{0x03f47b0b, 0x01736f5b, 0x0144c9a5, 0x019d626c, 0x027cc94b, 0x0232cfb6, 0x0286af45, 0x0239e668, 0x00c1e6ab, 0x0022365e}}}, + {X: Field{[10]uint32{0x01df571d, 0x004bc337, 0x0162f955, 0x0349144d, 0x01e474bd, 0x01c4188f, 0x01c34516, 0x021e40d8, 0x02513570, 0x0037b80c}}, Y: Field{[10]uint32{0x0290f565, 0x03121e85, 0x027c307f, 0x008ec819, 0x00496d96, 0x00463ffb, 0x028a28dc, 0x036024b1, 0x00fdcbf6, 0x00348b6f}}}, + {X: Field{[10]uint32{0x02d4760a, 0x008d5b95, 0x005aeef0, 0x0277cd8e, 0x01bf1dbd, 0x03c4fd42, 0x028f0d55, 0x031af7fd, 0x032dc98a, 0x000bac09}}, Y: Field{[10]uint32{0x02a04277, 0x03280ac9, 0x03746111, 0x0111c847, 0x035c69ad, 0x0015cda1, 0x02a18329, 0x013ae89e, 0x03554aaf, 0x003e0350}}}, + {X: Field{[10]uint32{0x030eabf3, 0x02c0c86a, 0x036b5c39, 0x03a809d8, 0x02b75853, 0x01de2208, 0x036ff7fc, 0x019cb63f, 0x02697509, 0x003abd8b}}, Y: Field{[10]uint32{0x020a3b7c, 0x03f7b6cb, 0x000956ef, 0x0180d41c, 0x008614e1, 0x001ccfc7, 0x0388b969, 0x0388b5c6, 0x02aa1c8f, 0x00110b95}}}, + {X: Field{[10]uint32{0x00592858, 0x03dcab81, 0x01d3b15e, 0x0216e1e6, 0x03cbc701, 0x00dbbd18, 0x01c442c2, 0x01bf65af, 0x030a13d9, 0x00081641}}, Y: Field{[10]uint32{0x00961ec8, 0x028d2f45, 0x014a280d, 0x03fa406e, 0x00f426fb, 0x01ab95b6, 0x0221d7f4, 0x026ba3d8, 0x02e83f25, 0x002f2410}}}, + {X: Field{[10]uint32{0x012f52fe, 0x009749eb, 0x0062a0f9, 0x01108231, 0x014b8b4a, 0x0113b0a0, 0x03b4ceea, 0x00f9f9bd, 0x03fd9e7f, 0x003fcbbd}}, Y: Field{[10]uint32{0x030a5e24, 0x03393cf7, 0x03e3b233, 0x011dada7, 0x030956a4, 0x019fd44d, 0x016cb52a, 0x01cad205, 0x00fbfa6f, 0x001ab39d}}}, + {X: Field{[10]uint32{0x01d14d83, 0x01fe7602, 0x03bf620f, 0x039937c5, 0x01d8fd0d, 0x00d5ffc7, 0x037a7b04, 0x014fef4c, 0x02f6fc45, 0x0038f973}}, Y: Field{[10]uint32{0x038f0460, 0x013d1348, 0x033651b8, 0x03fa2811, 0x03e667b6, 0x01a691d7, 0x011863f7, 0x02d83f43, 0x01a1baa7, 0x002b377f}}}, + {X: Field{[10]uint32{0x0357a6c3, 0x0046736f, 0x0054ec11, 0x01def78f, 0x01a0c645, 0x019ae708, 0x0142341a, 0x00a203a6, 0x026a41c0, 0x0025ea1c}}, Y: Field{[10]uint32{0x0367b4e8, 0x0330e362, 0x01164681, 0x03fcd167, 0x01fe160a, 0x01b61178, 0x00cc5c72, 0x00f41c1e, 0x00ae2702, 0x002d7cdf}}}, + {X: Field{[10]uint32{0x01cc81e6, 0x00811427, 0x001c41b0, 0x000875de, 0x0012fd90, 0x0067ab6d, 0x039484a1, 0x03e50e18, 0x02e94862, 0x002ac079}}, Y: Field{[10]uint32{0x0083b14b, 0x007b815d, 0x000436b1, 0x03d0568c, 0x0148853c, 0x00bb5e79, 0x01fab050, 0x0170e814, 0x0032101b, 0x001ab943}}}, + {X: Field{[10]uint32{0x0273668f, 0x03a857dd, 0x02b0d5a2, 0x01302a30, 0x0258ed9a, 0x023611e7, 0x026ba5ac, 0x033dac0b, 0x0010da2d, 0x00031191}}, Y: Field{[10]uint32{0x03499945, 0x02f0e182, 0x01361adb, 0x01114827, 0x03eadee9, 0x034f3916, 0x017f333c, 0x00b1f796, 0x01906239, 0x000da631}}}, + {X: Field{[10]uint32{0x03867534, 0x00263d05, 0x03d8648f, 0x00909bb6, 0x01ee49d5, 0x01b041e5, 0x013b0e67, 0x007cf880, 0x00685f72, 0x0005fab3}}, Y: Field{[10]uint32{0x009ef300, 0x018fb386, 0x0201bd6b, 0x015ba652, 0x03fec0f8, 0x00eaddbe, 0x037214bb, 0x027d26ef, 0x02e90cb1, 0x00330c45}}}, + {X: Field{[10]uint32{0x00c00d73, 0x00537ab5, 0x0208f2b1, 0x02f35f4d, 0x013ed2e8, 0x02fbf54f, 0x01b77bd5, 0x03bc5d4e, 0x01402908, 0x00301037}}, Y: Field{[10]uint32{0x01279c00, 0x020d6d05, 0x013d7427, 0x032db383, 0x02b2053e, 0x01444f73, 0x01403d84, 0x00960134, 0x00ae55ec, 0x001e98e1}}}, + {X: Field{[10]uint32{0x02bddb42, 0x000f8e4b, 0x01b9341b, 0x028aea4b, 0x0041bf2b, 0x019668a4, 0x0025fed6, 0x03dc30bb, 0x00983658, 0x0029658d}}, Y: Field{[10]uint32{0x039f4872, 0x002b7935, 0x01600a95, 0x034a08d6, 0x011ce7c2, 0x01a55e17, 0x00e8bf41, 0x03129c2a, 0x00af260e, 0x00370453}}}, + {X: Field{[10]uint32{0x0329aa0d, 0x01f3a846, 0x02279989, 0x01c8ce77, 0x03663823, 0x00ce0db1, 0x0233d095, 0x03d8ff1f, 0x02d451dc, 0x00113f88}}, Y: Field{[10]uint32{0x004279b3, 0x015df313, 0x01a9e53b, 0x003eba01, 0x014f3bf8, 0x00925bde, 0x01e9ffae, 0x0350d24a, 0x00e73d4b, 0x0005c631}}}, + {X: Field{[10]uint32{0x0071647b, 0x019a844b, 0x0091cff4, 0x03cfb57b, 0x004fc6b5, 0x00912ff6, 0x03b246de, 0x03057be8, 0x00aa1358, 0x0022f5c6}}, Y: Field{[10]uint32{0x03d737fa, 0x01b7fa12, 0x02fa5f40, 0x032110ec, 0x0365a0a3, 0x010009e4, 0x03deb8de, 0x0047c06d, 0x0288ba6c, 0x0005cbc6}}}, + {X: Field{[10]uint32{0x038680d1, 0x03e3385c, 0x03cfcd9f, 0x0355773c, 0x01d7ad4c, 0x03fce9e9, 0x01aa53c3, 0x02a88e02, 0x0025bbe6, 0x0023af73}}, Y: Field{[10]uint32{0x01e5641a, 0x02621d51, 0x01872cd7, 0x0199e2b1, 0x005be647, 0x0221b60f, 0x003728cf, 0x02b7e803, 0x0326af86, 0x0017158e}}}, + {X: Field{[10]uint32{0x011713d2, 0x0319f83a, 0x02f4e9db, 0x034bfadc, 0x02b469e5, 0x03a25b3e, 0x0342fb8b, 0x02aaf265, 0x021f688f, 0x00173d53}}, Y: Field{[10]uint32{0x00fd09c5, 0x011e1af9, 0x00b18569, 0x02a218c9, 0x034920e8, 0x0240556c, 0x006393e1, 0x00c360be, 0x0190d063, 0x00360b59}}}, + {X: Field{[10]uint32{0x01845f1a, 0x03061ea1, 0x02f8cdb4, 0x03053228, 0x01387185, 0x00115c7b, 0x0016ff4e, 0x02869cbb, 0x02e43f01, 0x001b0365}}, Y: Field{[10]uint32{0x00798c08, 0x02a5a9ac, 0x01dd6e55, 0x00e8c45f, 0x00abcf01, 0x026edbdc, 0x0015c1bb, 0x030bb3cd, 0x014b763e, 0x003ce668}}}, + {X: Field{[10]uint32{0x02b74046, 0x00cb70e4, 0x02ad690d, 0x002fa9c5, 0x039a15ef, 0x01c9a84c, 0x01f15155, 0x00bf7341, 0x00fefb6a, 0x003aba4a}}, Y: Field{[10]uint32{0x014c76bc, 0x03315dc0, 0x01b0984e, 0x0099835b, 0x02f6fd46, 0x035bb503, 0x03da7978, 0x00ce772f, 0x02d9f086, 0x002f7e1e}}}, + {X: Field{[10]uint32{0x007b3a21, 0x00802391, 0x008f0d57, 0x02cc6a9a, 0x02b61d5c, 0x00382376, 0x030dbbd0, 0x00bf7b67, 0x030cbbe7, 0x00397978}}, Y: Field{[10]uint32{0x01b248ae, 0x000196a1, 0x0035c561, 0x020a8415, 0x005de656, 0x0145c73a, 0x006ec03d, 0x01b99d1f, 0x01b8f80b, 0x0027ed2b}}}, + {X: Field{[10]uint32{0x038223ee, 0x036f3284, 0x00b79007, 0x00329e68, 0x0078df6b, 0x01acc02f, 0x02ce1762, 0x01aedf16, 0x02acc9e2, 0x001c4484}}, Y: Field{[10]uint32{0x03027757, 0x02a9cabb, 0x01cbbdc3, 0x00e46384, 0x036b8732, 0x0131cff8, 0x02b343bc, 0x01377679, 0x00584ef4, 0x000371a2}}}, + {X: Field{[10]uint32{0x01c5e22c, 0x00d03c08, 0x03d506b6, 0x02ca9319, 0x00c4cf11, 0x02d795e1, 0x03b9ea3f, 0x0293db76, 0x03b3531a, 0x000ed4ba}}, Y: Field{[10]uint32{0x0190938a, 0x02665aec, 0x039de55a, 0x0298f17e, 0x00b698c8, 0x01a06190, 0x02cf02e4, 0x011a84fe, 0x02bddc00, 0x000f68fb}}}, + {X: Field{[10]uint32{0x0356b78b, 0x01daf733, 0x02df91eb, 0x005fa5b2, 0x0245294a, 0x03871e95, 0x02e7292f, 0x011789f7, 0x00811103, 0x000c3ca1}}, Y: Field{[10]uint32{0x03abb049, 0x035c0add, 0x02b088e6, 0x01902877, 0x003c1491, 0x01445beb, 0x007864d2, 0x038d2fc1, 0x00fc26ec, 0x001c3184}}}, + {X: Field{[10]uint32{0x0130ff58, 0x0055937a, 0x01ab5edf, 0x009da675, 0x015cfef5, 0x0329287c, 0x00d37b61, 0x0156d939, 0x00a8012c, 0x00012a11}}, Y: Field{[10]uint32{0x003dfa3c, 0x0227565a, 0x00cd3f31, 0x03018c9d, 0x025826f9, 0x0342a7fd, 0x03e6bd38, 0x039b936e, 0x0148508d, 0x001261d1}}}, + {X: Field{[10]uint32{0x0068b06f, 0x0279b19e, 0x01026451, 0x0177b714, 0x0005ce2b, 0x02667853, 0x02e0fd9a, 0x01212990, 0x021ea7c8, 0x00297295}}, Y: Field{[10]uint32{0x01afa7ed, 0x0310e8e1, 0x025a47a7, 0x01a89077, 0x037abe38, 0x03fe9fda, 0x009b00ea, 0x03bbaab0, 0x0142a5e2, 0x0033245e}}}, + {X: Field{[10]uint32{0x03d6e72c, 0x03e3b937, 0x017ef3c1, 0x031915b9, 0x021fa547, 0x0043d852, 0x0051a68e, 0x03115b0e, 0x02d31e16, 0x003d86df}}, Y: Field{[10]uint32{0x03622f2b, 0x028ca017, 0x01a54734, 0x00453426, 0x02a0c5a8, 0x0345efe9, 0x035fbdb4, 0x00619647, 0x00b7fc40, 0x0032c9b4}}}, + {X: Field{[10]uint32{0x01f678b2, 0x01586145, 0x007fcaee, 0x019a8888, 0x02559768, 0x01d9bef9, 0x02859f9e, 0x000312d4, 0x00628897, 0x003e3935}}, Y: Field{[10]uint32{0x02c77554, 0x006a93ae, 0x011ae6f0, 0x02542775, 0x0106791e, 0x03eeddac, 0x009c271b, 0x01bec2a8, 0x039fc1b1, 0x000c2ec0}}}, + {X: Field{[10]uint32{0x032ab653, 0x00a4274c, 0x0291ca39, 0x001a9c5e, 0x03d5d97a, 0x0060528b, 0x02f6f717, 0x0164542c, 0x001a05d2, 0x002272bf}}, Y: Field{[10]uint32{0x017ab76e, 0x00bc5109, 0x03ce16fe, 0x036983a1, 0x015eac02, 0x0053cd38, 0x01c00557, 0x0121634a, 0x00ab0b4e, 0x00068928}}}, + {X: Field{[10]uint32{0x037c4f20, 0x02365f51, 0x020bb4a4, 0x0155aba9, 0x0033c5b5, 0x028ab544, 0x0201dca7, 0x01773f2a, 0x030bd04f, 0x0034a14d}}, Y: Field{[10]uint32{0x0293b9d4, 0x01348091, 0x01b416c4, 0x02cb1a60, 0x01c61386, 0x031c1451, 0x022adf8e, 0x0217404e, 0x03b732e8, 0x00352d09}}}, + {X: Field{[10]uint32{0x01f217c0, 0x01bd9a93, 0x00974902, 0x019b87f5, 0x01fd3350, 0x01eae89a, 0x01dc90d1, 0x02fecc86, 0x02f2d9bd, 0x0000f14c}}, Y: Field{[10]uint32{0x02ac5d59, 0x00f8c199, 0x0057675b, 0x03e7e320, 0x032791a6, 0x02104e5d, 0x033c7b42, 0x01ff40b0, 0x027ca6c9, 0x0021bf57}}}, + {X: Field{[10]uint32{0x008ac1ee, 0x000c5333, 0x02924b73, 0x00f8df89, 0x02298445, 0x00c0dc89, 0x0317a165, 0x01c1a886, 0x010bfc35, 0x00093465}}, Y: Field{[10]uint32{0x01f918ac, 0x0307aa72, 0x01ed84b9, 0x03822d5f, 0x01b05bb9, 0x026ba69d, 0x0247c685, 0x006a42ec, 0x005d06a3, 0x001348a9}}}, + {X: Field{[10]uint32{0x027615a9, 0x020acd93, 0x03d44595, 0x01042ad9, 0x02d85053, 0x0280dbf0, 0x01f8acee, 0x02c6ac52, 0x00f36227, 0x00331aac}}, Y: Field{[10]uint32{0x03761cb8, 0x01a028e0, 0x037d7107, 0x02bd5283, 0x01bac918, 0x003e9bc8, 0x00806b12, 0x0049619f, 0x03cc040b, 0x003e6b64}}}, + {X: Field{[10]uint32{0x025318cf, 0x03fdc6c0, 0x01cdef08, 0x00366c50, 0x016320f2, 0x01cc2e67, 0x0016bcff, 0x0252db2a, 0x0154f36e, 0x0037892a}}, Y: Field{[10]uint32{0x03899933, 0x00129076, 0x014d9679, 0x017a920e, 0x038475c3, 0x012bf58b, 0x002d2354, 0x012926e6, 0x01d91ac2, 0x000f8d2c}}}, + {X: Field{[10]uint32{0x021ffec7, 0x03fc9496, 0x03618f83, 0x036d23ea, 0x015f8243, 0x0254f3ef, 0x003a12c7, 0x02aea436, 0x00c34900, 0x001deac1}}, Y: Field{[10]uint32{0x00ac2f00, 0x01cfbfaf, 0x032bdae8, 0x00680c28, 0x01231c87, 0x016a36cc, 0x02265af7, 0x01dffd25, 0x00273bcd, 0x0018996b}}}, + {X: Field{[10]uint32{0x02e78209, 0x012b5445, 0x0341ece8, 0x03b876ad, 0x0251ff8d, 0x00656028, 0x0079885d, 0x02679780, 0x03065f46, 0x00291ebd}}, Y: Field{[10]uint32{0x02257440, 0x03cd2e5e, 0x03abfbb8, 0x0220f6bf, 0x035b7860, 0x01196ae5, 0x023f7cb3, 0x03de2e95, 0x03fdf1b1, 0x000e4f2e}}}, + {X: Field{[10]uint32{0x00d7016d, 0x0117a7a7, 0x037ea8a5, 0x038754a8, 0x0293d709, 0x000c8809, 0x01170fbd, 0x031edd37, 0x01fd0c55, 0x002a7d7e}}, Y: Field{[10]uint32{0x01d5e0e1, 0x012c417c, 0x0162b873, 0x009fdad8, 0x0254f0d3, 0x027a02ac, 0x01847b2e, 0x03c8ba3f, 0x01254bad, 0x00261c5e}}}, + {X: Field{[10]uint32{0x0218ec38, 0x01f358d3, 0x03b716cc, 0x01902a51, 0x01ba8668, 0x0161b9f8, 0x02200c4e, 0x00e28a3e, 0x02bc96b9, 0x00355fa7}}, Y: Field{[10]uint32{0x01b6bd36, 0x029aab34, 0x016a3062, 0x03abca16, 0x0325de16, 0x0104b7e1, 0x00c8b7cb, 0x0244416d, 0x02ef6823, 0x0026a834}}}, + {X: Field{[10]uint32{0x03aa58e9, 0x001a0a43, 0x006119f5, 0x0072ae08, 0x02e27ccc, 0x02a175ce, 0x018e66ca, 0x03053558, 0x00d8fb4d, 0x001d18ea}}, Y: Field{[10]uint32{0x00d4829f, 0x026ab41a, 0x0389f056, 0x03102d30, 0x02ae7990, 0x010e36e1, 0x00645a28, 0x03d412a8, 0x02b2275a, 0x0020bf5a}}}, + {X: Field{[10]uint32{0x013bf412, 0x01b9f3f5, 0x032fca3c, 0x01914d36, 0x013927ae, 0x03accc6c, 0x002d03e4, 0x0120c668, 0x008a29c4, 0x000b9e9c}}, Y: Field{[10]uint32{0x031e11d1, 0x038ecf52, 0x00160fd2, 0x0093b006, 0x03ebdf68, 0x00e6ceca, 0x02e0073f, 0x003372ba, 0x01997350, 0x00213cfc}}}, + {X: Field{[10]uint32{0x01dd5e03, 0x034c3136, 0x00dda414, 0x012edfea, 0x02180d09, 0x022e8c13, 0x032f3c2e, 0x030163eb, 0x00bf540b, 0x0021c1ec}}, Y: Field{[10]uint32{0x0100b915, 0x0127083c, 0x0025dfbb, 0x03a6599f, 0x0318db5e, 0x02816535, 0x006bd25a, 0x0040cd43, 0x0175fb79, 0x001c2d84}}}, + {X: Field{[10]uint32{0x03ca842d, 0x02a8b594, 0x008b9613, 0x03386db0, 0x0122f67d, 0x023999d2, 0x02070a72, 0x03340a21, 0x030c3ce6, 0x000ff6cd}}, Y: Field{[10]uint32{0x00e0dafc, 0x0121ac32, 0x0006317a, 0x03e65004, 0x035d3a5e, 0x002c7bfb, 0x004c5ec1, 0x000d1297, 0x00f2474a, 0x00058d46}}}, + {X: Field{[10]uint32{0x00472f62, 0x020f6252, 0x031af2a2, 0x0180252c, 0x03330779, 0x01bd6352, 0x01411e70, 0x03552680, 0x0302412c, 0x0030df68}}, Y: Field{[10]uint32{0x0221f92a, 0x031bf84e, 0x01d26801, 0x0002e2b4, 0x01ca8490, 0x0282a0af, 0x002d1daa, 0x010bd21c, 0x028716c6, 0x002a823c}}}, + {X: Field{[10]uint32{0x01e08a1c, 0x009bf1e9, 0x007cf257, 0x03b0ac2d, 0x0160ade9, 0x0171e8ce, 0x01f923b0, 0x02c3e494, 0x0150381a, 0x000fae81}}, Y: Field{[10]uint32{0x030fa7d9, 0x010697f3, 0x02396557, 0x03668316, 0x00492a1a, 0x02bf1380, 0x02396525, 0x0374ea21, 0x00ebb681, 0x000509ec}}}, + {X: Field{[10]uint32{0x0350cee8, 0x02be39ae, 0x02e0194e, 0x029e14d5, 0x02e43f20, 0x01d53e83, 0x024628f7, 0x035752fd, 0x02a18ce5, 0x00259c8f}}, Y: Field{[10]uint32{0x01f49bdd, 0x0019a960, 0x00e8a713, 0x016eca32, 0x016cf51b, 0x035122bb, 0x02eef512, 0x02fc43a1, 0x03bbb9bb, 0x0016b427}}}, + {X: Field{[10]uint32{0x03663748, 0x02358128, 0x00f1329f, 0x02499e44, 0x00ab8228, 0x01575716, 0x009d3460, 0x02db34e8, 0x02117ecf, 0x0035d914}}, Y: Field{[10]uint32{0x028540f7, 0x02e00c70, 0x01a46eeb, 0x00430897, 0x03bf2c9b, 0x02eaaa73, 0x0089dbe2, 0x037820b2, 0x0104d20f, 0x002adf30}}}, + {X: Field{[10]uint32{0x00ada5e6, 0x02a241b4, 0x03e434dc, 0x0196d2b1, 0x008c8660, 0x0352f251, 0x01907afa, 0x02c4d883, 0x03dc7e0a, 0x0007dac8}}, Y: Field{[10]uint32{0x023e247c, 0x03b0959d, 0x02602398, 0x0103923d, 0x01560414, 0x036aa7ac, 0x00920405, 0x00e76ab4, 0x025d6bc6, 0x00230dec}}}, + {X: Field{[10]uint32{0x01459945, 0x0203541d, 0x01f9d9bd, 0x004a2bf4, 0x036abb5a, 0x0303a3b5, 0x0079e64b, 0x0285a1e5, 0x00bbaa06, 0x0011bfc1}}, Y: Field{[10]uint32{0x011bcd4a, 0x03e7693d, 0x0176491e, 0x00a5075c, 0x03e7e9d2, 0x011e986a, 0x0133bb9e, 0x02e838e4, 0x02c26af2, 0x002c4413}}}, + {X: Field{[10]uint32{0x02597ce2, 0x012a20ca, 0x02f86f3f, 0x02cf6092, 0x013bcdff, 0x022ec114, 0x0076e545, 0x0201a4ec, 0x00253888, 0x003286cf}}, Y: Field{[10]uint32{0x01e0285a, 0x006ff8a8, 0x03622005, 0x03d5e611, 0x01dfc9d6, 0x0367a07b, 0x0109d11b, 0x01b711d8, 0x02fbdd1b, 0x003c0a45}}}, + {X: Field{[10]uint32{0x01ece6b4, 0x011e8426, 0x01763ee7, 0x01dcae00, 0x005fad12, 0x0336f7ec, 0x03ec7fed, 0x027b123b, 0x029aadb6, 0x00032587}}, Y: Field{[10]uint32{0x018fb6e4, 0x00bc9a67, 0x022a984e, 0x00f0d7c2, 0x0056bb9b, 0x005b12dc, 0x00bb70ad, 0x014f949c, 0x0033e0b2, 0x0011a69b}}}, + {X: Field{[10]uint32{0x039d99dc, 0x03ca2fe4, 0x03393ea4, 0x03d6e6d9, 0x037b3132, 0x035139dd, 0x03817089, 0x0332534f, 0x02791418, 0x000e8ba8}}, Y: Field{[10]uint32{0x03f164be, 0x025b195a, 0x01f8831a, 0x02381949, 0x02b981bf, 0x02344f8b, 0x0217dc71, 0x036486f8, 0x0143c035, 0x00056014}}}, + {X: Field{[10]uint32{0x025a7a4a, 0x03b7a9ad, 0x01189e7d, 0x02333cd3, 0x034e24d4, 0x00bec700, 0x03fd6ad5, 0x03c2f868, 0x00dfb3a1, 0x000105b7}}, Y: Field{[10]uint32{0x00c204c3, 0x037444d8, 0x0235beba, 0x0028f1b2, 0x0147e90a, 0x004cb6cc, 0x01777812, 0x00cd66b0, 0x02c2bbc9, 0x001da427}}}, + {X: Field{[10]uint32{0x03c63eb3, 0x021516e4, 0x022b1731, 0x0312174a, 0x032ed9d1, 0x0352cfb4, 0x03a51772, 0x0305d422, 0x02459aef, 0x002ce5f0}}, Y: Field{[10]uint32{0x01e71748, 0x00732dbd, 0x03a7e447, 0x01d38c45, 0x02228135, 0x024810fb, 0x0018ffc6, 0x00d9daad, 0x03603076, 0x002841a8}}}, + {X: Field{[10]uint32{0x000637df, 0x03ce4275, 0x0306532e, 0x03034a68, 0x02c1bdb8, 0x03a026ca, 0x01dbb755, 0x005918ca, 0x009befd6, 0x001d7156}}, Y: Field{[10]uint32{0x03e6f631, 0x009eb7e8, 0x0347dcba, 0x025687f8, 0x0395e602, 0x007f39ae, 0x02a19dd8, 0x00417243, 0x01e51492, 0x0009bcf8}}}, + {X: Field{[10]uint32{0x029135a5, 0x039bc225, 0x018b6620, 0x02004679, 0x02e4b0dc, 0x00e6a411, 0x015158c4, 0x01d0c85f, 0x0112a351, 0x000bbbb3}}, Y: Field{[10]uint32{0x01aaba4c, 0x03d2474b, 0x03707806, 0x019c5051, 0x01136064, 0x031315e4, 0x013d7539, 0x023b4c6d, 0x03d048c5, 0x003877ba}}}, + {X: Field{[10]uint32{0x00be65d1, 0x000164e7, 0x00124aa1, 0x002b1d6b, 0x038cab86, 0x02b77699, 0x031d52e5, 0x0359419a, 0x00915d39, 0x002a607c}}, Y: Field{[10]uint32{0x013ed069, 0x0180101f, 0x00e7b66c, 0x01253ccd, 0x0188d4f1, 0x025b9442, 0x018b23c0, 0x000a4cb6, 0x03cb7ab6, 0x00132c27}}}, + {X: Field{[10]uint32{0x03d4ef62, 0x01302826, 0x0331a9aa, 0x01a4999a, 0x02545cd8, 0x01d679e7, 0x01260c9a, 0x00740828, 0x02e3a7e8, 0x0006867e}}, Y: Field{[10]uint32{0x00937902, 0x016dcaac, 0x0070789c, 0x03c1a2b8, 0x0379714d, 0x021df71e, 0x01bf7bfd, 0x0171a78a, 0x02578af2, 0x000a01f5}}}, + {X: Field{[10]uint32{0x0020c61a, 0x00a04f49, 0x00567195, 0x0052674c, 0x029b0f43, 0x0198b9dd, 0x036f1392, 0x03465835, 0x016c1ee7, 0x0033fe1a}}, Y: Field{[10]uint32{0x02d16df8, 0x0314b179, 0x030c147f, 0x008ad8ad, 0x023581f1, 0x00daee05, 0x0004b1a1, 0x025a4097, 0x00138a39, 0x002125f8}}}, + {X: Field{[10]uint32{0x0227ce8c, 0x02417887, 0x01cd66cc, 0x016a7969, 0x00966911, 0x03523ac1, 0x02a95824, 0x00d1e72a, 0x00204a8b, 0x001a05e9}}, Y: Field{[10]uint32{0x033052ad, 0x01ca4dde, 0x026fd95e, 0x0309d8c8, 0x028182a0, 0x01720e17, 0x03254653, 0x01e97261, 0x028bc337, 0x00256151}}}, + {X: Field{[10]uint32{0x01d9d58e, 0x00cf5b23, 0x03233bcd, 0x00656494, 0x037d114b, 0x01e51e3c, 0x013eb995, 0x03309abc, 0x00846e0e, 0x00273bff}}, Y: Field{[10]uint32{0x025d2582, 0x0342aa3e, 0x00426856, 0x00d0fa99, 0x00510602, 0x03bc71fb, 0x03c4d4af, 0x03e86c19, 0x021a5cf8, 0x003806b2}}}, + {X: Field{[10]uint32{0x03456c49, 0x03c3b734, 0x00543835, 0x00c63104, 0x03995a37, 0x00c0797e, 0x03965892, 0x03dff765, 0x01c6f203, 0x001a9b87}}, Y: Field{[10]uint32{0x0384496b, 0x02eb284d, 0x03482f93, 0x02fdbbf4, 0x0183b579, 0x02a5d51b, 0x01f9ad86, 0x00fa7ac1, 0x039898b9, 0x000a81ca}}}, + {X: Field{[10]uint32{0x02a9129b, 0x00c75f34, 0x036d24dd, 0x008626b0, 0x008ba3a5, 0x02e461ba, 0x018b4f0f, 0x01d86d45, 0x021a588d, 0x001f9eeb}}, Y: Field{[10]uint32{0x033dbdd6, 0x0215beaa, 0x0129dcc4, 0x02f03503, 0x0017e6bb, 0x0343e1ce, 0x01e60e57, 0x01731ca2, 0x023b3799, 0x0014663d}}}, + {X: Field{[10]uint32{0x006bd253, 0x0316cd40, 0x039f805d, 0x018fb84b, 0x03ffa158, 0x02a17954, 0x014966ff, 0x02acafb5, 0x03a863de, 0x00004ff0}}, Y: Field{[10]uint32{0x03821459, 0x016d5ddc, 0x01d58b3b, 0x0209c0b9, 0x03a8b77c, 0x039daa55, 0x00a59e76, 0x01415bff, 0x02459127, 0x0038c70c}}}, + {X: Field{[10]uint32{0x02e9c167, 0x02f1b445, 0x00ccbbec, 0x00983452, 0x03e56503, 0x03a27a92, 0x036dbeda, 0x03645fda, 0x01eb3f39, 0x003ff8a3}}, Y: Field{[10]uint32{0x01bb988a, 0x02abb5a7, 0x01b2c262, 0x03844a31, 0x01383c4b, 0x0380acff, 0x03857604, 0x01113794, 0x02b3b878, 0x00236294}}}, + {X: Field{[10]uint32{0x01cc57be, 0x020ec3c1, 0x003cd444, 0x0150772f, 0x00481c43, 0x003e83b3, 0x0379a883, 0x01b79f40, 0x00239bf2, 0x0000a3b5}}, Y: Field{[10]uint32{0x00ce126e, 0x001016c4, 0x00ac37bc, 0x01c866f4, 0x012d5608, 0x012e3616, 0x020d860b, 0x02399d14, 0x02e2ea01, 0x00064848}}}, + {X: Field{[10]uint32{0x03f8a708, 0x01cb22c2, 0x02d7276c, 0x00e0be01, 0x025aa4ca, 0x03b9da76, 0x02acc00e, 0x03121014, 0x027c7be8, 0x001efce0}}, Y: Field{[10]uint32{0x0159eebe, 0x0090fa29, 0x011726bb, 0x001c6b4a, 0x0224a75d, 0x035c75c1, 0x00601fa1, 0x014a6d17, 0x02eee505, 0x002497cf}}}, + {X: Field{[10]uint32{0x03ce7000, 0x0384e01b, 0x017a4a7b, 0x02accc28, 0x012acb5a, 0x007dedaf, 0x02de8627, 0x00070fe3, 0x0299021a, 0x0033c69f}}, Y: Field{[10]uint32{0x01d3d673, 0x02855756, 0x0078a7c3, 0x028fce2a, 0x035f1e70, 0x00ce8d18, 0x023e7400, 0x0298445a, 0x02837b3b, 0x00084d96}}}, + {X: Field{[10]uint32{0x01bb29c7, 0x02f2ba44, 0x02944afc, 0x019d4989, 0x02af3bdd, 0x02f42a61, 0x036c8121, 0x01f31038, 0x0237d151, 0x0039de7a}}, Y: Field{[10]uint32{0x038a8a2f, 0x03200575, 0x03f81e8a, 0x01b51706, 0x026472bb, 0x00a71bd0, 0x00e2c6c0, 0x01dd6a81, 0x01ac4b19, 0x000cb18d}}}, + {X: Field{[10]uint32{0x026c2a92, 0x02dfda3c, 0x002a1638, 0x00a23806, 0x02f96977, 0x030e0754, 0x019785d6, 0x01084056, 0x012b76b5, 0x00040c27}}, Y: Field{[10]uint32{0x018265a9, 0x02340819, 0x02a1a043, 0x02b3066d, 0x02f3abce, 0x03e4c4c5, 0x03b9b377, 0x0261c03b, 0x03834c85, 0x000087b7}}}, + {X: Field{[10]uint32{0x033a27f9, 0x039c8694, 0x00701813, 0x00469c50, 0x02f2b6b3, 0x0244c80d, 0x032240de, 0x011b50ba, 0x0309701e, 0x001e649e}}, Y: Field{[10]uint32{0x0358920f, 0x03613b4e, 0x039053b3, 0x03bae34a, 0x008a0f47, 0x0184d841, 0x00756403, 0x021b0693, 0x0113a818, 0x003edf19}}}, + {X: Field{[10]uint32{0x0128849e, 0x03631cc5, 0x0137e0fd, 0x038128f7, 0x03085b1d, 0x0338938f, 0x0193e683, 0x00d0a67d, 0x023377da, 0x001d0ed3}}, Y: Field{[10]uint32{0x002f3216, 0x0135ad9d, 0x014f1816, 0x039a1278, 0x01fbba7d, 0x02b9cca0, 0x03f178ca, 0x018fb1ec, 0x0069b5ee, 0x000de400}}}, + {X: Field{[10]uint32{0x004f04da, 0x01a18143, 0x02cbf498, 0x03ec29ce, 0x02e46064, 0x02547f9a, 0x02cd9b49, 0x02edfc6a, 0x02e10ce1, 0x0035cf34}}, Y: Field{[10]uint32{0x0253dde8, 0x01fd2b6c, 0x0209614b, 0x0138bc8a, 0x00cae7f8, 0x028cffc7, 0x0087fcd6, 0x039c7fd6, 0x02e44cc6, 0x0039a9d8}}}, + {X: Field{[10]uint32{0x01f6fa68, 0x00b5a5e5, 0x033e8ed3, 0x02051f01, 0x01ba6324, 0x01ecfafc, 0x03318a17, 0x0091acff, 0x00d3f563, 0x000f8700}}, Y: Field{[10]uint32{0x010776d3, 0x01cbc34b, 0x00ef6b4a, 0x000308ff, 0x0118ce2e, 0x02038e07, 0x036aecb0, 0x0304a440, 0x00cf87d5, 0x0037cad8}}}, + {X: Field{[10]uint32{0x0168053c, 0x03f71b36, 0x03221a32, 0x039318a6, 0x00ed90c2, 0x01d49b6d, 0x00f10e68, 0x00594f97, 0x039092da, 0x0025b81f}}, Y: Field{[10]uint32{0x01c2bd66, 0x0081e1d3, 0x036164ab, 0x03f8b978, 0x021f8517, 0x03eb4ee6, 0x0220ea5b, 0x03a9ae7b, 0x003bb8a2, 0x00359707}}}, + {X: Field{[10]uint32{0x03e1debb, 0x005deaab, 0x02854d8e, 0x0148ce18, 0x02d27a76, 0x00b81e5a, 0x01cc124b, 0x03b8094c, 0x004026b1, 0x001b48c1}}, Y: Field{[10]uint32{0x0179bbd3, 0x00ef027b, 0x012c2598, 0x00a2a33f, 0x00e3dc62, 0x0393b002, 0x03bde471, 0x011a2543, 0x0195faa1, 0x003cea3e}}}, + {X: Field{[10]uint32{0x01707781, 0x03f3bc79, 0x02d9dc76, 0x004692c1, 0x00ad7d45, 0x039c584e, 0x00e43c49, 0x027700c5, 0x035c1f94, 0x002376a7}}, Y: Field{[10]uint32{0x0001310d, 0x0229609a, 0x03a775c7, 0x03bc2b96, 0x01ad9d9b, 0x02dcdd0d, 0x03674f5d, 0x02c2944a, 0x03aa7585, 0x0034158f}}}, + {X: Field{[10]uint32{0x03de97cd, 0x028d5eee, 0x036c4e5a, 0x03ead309, 0x03b4bf17, 0x03ff6905, 0x02da369f, 0x01cd8fd7, 0x013f9866, 0x00141c18}}, Y: Field{[10]uint32{0x0034ebc2, 0x033c26f7, 0x008178a0, 0x01f921a9, 0x02eb40e4, 0x02c5b6e1, 0x005751f9, 0x01fa8d06, 0x02ff4fe7, 0x00002c83}}}, + {X: Field{[10]uint32{0x0316bce7, 0x024bac2b, 0x03a8efc7, 0x01d1aa6c, 0x0004986d, 0x0306a862, 0x038838ea, 0x00515ae6, 0x00f0bfab, 0x000e929c}}, Y: Field{[10]uint32{0x01c4f3e5, 0x03d68f2b, 0x01e248bd, 0x022608e0, 0x03843b3e, 0x0013a108, 0x0032980c, 0x023b6a86, 0x02931916, 0x00391492}}}, + {X: Field{[10]uint32{0x02b33532, 0x02448c2a, 0x01a38b52, 0x0264ef37, 0x02db5fba, 0x018c1dcf, 0x01a82f54, 0x0166a76a, 0x00921831, 0x000b373e}}, Y: Field{[10]uint32{0x017677b9, 0x00d61c1d, 0x02044e0a, 0x0248c8a4, 0x010fd956, 0x00aaf3a3, 0x02299e74, 0x00fcca17, 0x02eac911, 0x003223a9}}}, + {X: Field{[10]uint32{0x00955c99, 0x028b778a, 0x0203d781, 0x00082630, 0x022b7fed, 0x00cc667a, 0x02e0cd6f, 0x017d8404, 0x028df8f1, 0x0006a164}}, Y: Field{[10]uint32{0x00db4299, 0x00b38e5d, 0x02945568, 0x009147af, 0x010534a1, 0x001c970a, 0x013a6b03, 0x01da8ff8, 0x02b2821c, 0x0006ce61}}}, + {X: Field{[10]uint32{0x01a1d388, 0x01ae13c7, 0x02c1a6b6, 0x0198f988, 0x00dde019, 0x006e7c04, 0x01206634, 0x00c19685, 0x01a1d6b0, 0x0021b453}}, Y: Field{[10]uint32{0x0399b2de, 0x00e030a0, 0x01055fd1, 0x00f87db9, 0x01cfe568, 0x00e010b3, 0x004a6f9f, 0x017327a2, 0x00ec764f, 0x0019e545}}}, + {X: Field{[10]uint32{0x02201cc2, 0x0340d5c5, 0x01441565, 0x0265f091, 0x03300459, 0x02941e38, 0x03343415, 0x0321e50c, 0x014f0bdf, 0x003907dd}}, Y: Field{[10]uint32{0x010e8e8e, 0x02c3f75e, 0x02e47dcb, 0x0382ecf3, 0x000743f5, 0x024bba6d, 0x02f119f4, 0x00647b7f, 0x0241c21d, 0x00374165}}}, + {X: Field{[10]uint32{0x0075cae4, 0x0265b4d1, 0x022fc756, 0x01ea0ce3, 0x032946e1, 0x03911190, 0x0268d8f4, 0x02fb11e5, 0x026845b5, 0x002dfb24}}, Y: Field{[10]uint32{0x03dda53b, 0x018b9c53, 0x002cb7cc, 0x01425e3b, 0x00d945e3, 0x01e51dad, 0x02210f57, 0x027a4043, 0x018bb753, 0x0002ad28}}}, + {X: Field{[10]uint32{0x03518912, 0x01da752d, 0x009d456b, 0x02f020c9, 0x03bf3ecf, 0x02896142, 0x022554a0, 0x03786459, 0x01dcf1ea, 0x000903f6}}, Y: Field{[10]uint32{0x0104515b, 0x001ac234, 0x0220776a, 0x025cc4d4, 0x005318a8, 0x02a9aa01, 0x03a3a62e, 0x00e42214, 0x025ee0ba, 0x002bc0fe}}}, + {X: Field{[10]uint32{0x035bb769, 0x015c8de1, 0x00129a5c, 0x037e3c73, 0x022b88aa, 0x02330fea, 0x01e39d28, 0x00c4525e, 0x00ecee7d, 0x0000d4f1}}, Y: Field{[10]uint32{0x012d147e, 0x03693f34, 0x03cf02a0, 0x02e16b8c, 0x0228e607, 0x035c2ae3, 0x000118ba, 0x01384ba5, 0x004090af, 0x0027e9fb}}}, + {X: Field{[10]uint32{0x03d933de, 0x0200dd8a, 0x0082d39e, 0x02232f81, 0x03893409, 0x018a3f46, 0x0206ae11, 0x019a2045, 0x018aa855, 0x003d3bb5}}, Y: Field{[10]uint32{0x033b3d44, 0x01bc3e37, 0x03eb9160, 0x03e94b5f, 0x0118b40b, 0x0233ad03, 0x031969ca, 0x0381c341, 0x0364fe74, 0x00109e33}}}, + {X: Field{[10]uint32{0x026ef1ce, 0x004a4389, 0x000fa01a, 0x0029cdaf, 0x000b284f, 0x02d554b5, 0x00c17d50, 0x0099810d, 0x02e2e2d0, 0x001a63fe}}, Y: Field{[10]uint32{0x01ffc970, 0x00206638, 0x0143fab6, 0x03fec2f4, 0x038bd50c, 0x025bf04b, 0x027e53a4, 0x016dd076, 0x008d0784, 0x000659b3}}}, + {X: Field{[10]uint32{0x01314098, 0x01c48699, 0x0196b595, 0x028013ed, 0x0122d884, 0x005f2251, 0x020587d4, 0x0305035b, 0x016d5c88, 0x002d4ed6}}, Y: Field{[10]uint32{0x032c745a, 0x025eba23, 0x01a56771, 0x01c13306, 0x0025deeb, 0x01b0cbbb, 0x03de4857, 0x03f9db21, 0x00b909be, 0x00377fd8}}}, + {X: Field{[10]uint32{0x0213066a, 0x004bedc6, 0x02d65527, 0x01967d89, 0x00791518, 0x03a7c9da, 0x024cba67, 0x00efe75b, 0x0321d439, 0x0025d812}}, Y: Field{[10]uint32{0x028d17f8, 0x018988d2, 0x03616360, 0x0153e809, 0x027d871c, 0x00d5fc99, 0x005b0d17, 0x01fdf197, 0x0384e1cf, 0x0039ebbc}}}, + {X: Field{[10]uint32{0x01bb8623, 0x01213a54, 0x007edb63, 0x003b6875, 0x013b3876, 0x0018bdef, 0x02b234c1, 0x03b980c4, 0x01ba6eda, 0x001e8d72}}, Y: Field{[10]uint32{0x0184a5b1, 0x035a9093, 0x002457eb, 0x015e1bbe, 0x00769f3a, 0x03bdc128, 0x0292b586, 0x019d85ab, 0x027ba454, 0x000ce25e}}}, + {X: Field{[10]uint32{0x011e2804, 0x00836543, 0x03e01b6a, 0x005e19c1, 0x02c9638b, 0x0098c043, 0x026e0cc9, 0x00457728, 0x0075f989, 0x0021b503}}, Y: Field{[10]uint32{0x00315ca3, 0x00e1d0bb, 0x00410c0f, 0x010b105c, 0x01dddf28, 0x0211ad72, 0x031dcc8a, 0x02307839, 0x03624ffd, 0x001d66f5}}}, + {X: Field{[10]uint32{0x009badb7, 0x037acc58, 0x001ce3e8, 0x03a6ca90, 0x01fc77f6, 0x00ee4397, 0x03ddea49, 0x02de7d98, 0x03479a4b, 0x00180eff}}, Y: Field{[10]uint32{0x01a4f4b4, 0x008e6627, 0x0320ee1e, 0x0377700d, 0x03358c86, 0x034ce80b, 0x02eefffc, 0x006aa9ab, 0x01fc6528, 0x00018a1e}}}, + {X: Field{[10]uint32{0x032203ed, 0x039a2c40, 0x03d7b5de, 0x03705261, 0x00fa13eb, 0x029d68db, 0x01e0bbf8, 0x01e9f5c8, 0x00f3c7dc, 0x0001722e}}, Y: Field{[10]uint32{0x0208e7d3, 0x0124d033, 0x0190ce77, 0x0328506f, 0x013faa43, 0x023f35b9, 0x01d304d8, 0x031af5f6, 0x03382bc4, 0x001ad807}}}, + {X: Field{[10]uint32{0x0144fb05, 0x018f3a1d, 0x00505a79, 0x01fa4024, 0x0025a6f2, 0x020edcde, 0x027a55ff, 0x02530907, 0x02c5a916, 0x000c4f07}}, Y: Field{[10]uint32{0x003c6384, 0x01980dc4, 0x02e59825, 0x023891d4, 0x0101ed85, 0x031118b1, 0x0244699b, 0x0197ebed, 0x03ff9a43, 0x00270c54}}}, + {X: Field{[10]uint32{0x01d923bd, 0x000550ea, 0x006bf98b, 0x03569e5d, 0x00150b4b, 0x01a383e8, 0x0268cb29, 0x02bbecc0, 0x02514616, 0x000146b2}}, Y: Field{[10]uint32{0x02e028b4, 0x0115e9d3, 0x001cc203, 0x0310c77d, 0x01a0a66e, 0x0138acd8, 0x0163ca4f, 0x01dd1eff, 0x01b4073a, 0x001f147e}}}, + {X: Field{[10]uint32{0x0219677d, 0x01edb0c9, 0x00a122ab, 0x0359dd0f, 0x01353071, 0x02efa5ea, 0x036d3f92, 0x00192124, 0x039927ea, 0x0012ba34}}, Y: Field{[10]uint32{0x008a47a3, 0x019df50f, 0x027c919e, 0x01790d4b, 0x000f350f, 0x0244414e, 0x02a332b0, 0x02f3a0e3, 0x019bc251, 0x003e7714}}}, + {X: Field{[10]uint32{0x0256dcca, 0x01e137a8, 0x0257baa0, 0x022712bc, 0x03b100c2, 0x021352ef, 0x01a054a8, 0x02d68230, 0x015d3f9c, 0x001af472}}, Y: Field{[10]uint32{0x03803b5b, 0x0153be1a, 0x03e71396, 0x015ea221, 0x00801923, 0x02c1f79e, 0x031fc401, 0x02c4bdbd, 0x003bde39, 0x001e4d8a}}}, + {X: Field{[10]uint32{0x0249480e, 0x0374a0ea, 0x028ce19b, 0x00027be7, 0x035737f7, 0x001feef2, 0x0370a62e, 0x032ab6b8, 0x02294642, 0x003889e2}}, Y: Field{[10]uint32{0x0037dd01, 0x03c50ed2, 0x00f77b36, 0x02d60f59, 0x01087bc8, 0x0360bd87, 0x03570b7e, 0x00f39cd6, 0x03cdf394, 0x0010c48b}}}, + {X: Field{[10]uint32{0x0296c644, 0x03d2b13f, 0x0071ffee, 0x00b02c89, 0x008d24fb, 0x00ccd60c, 0x004bb019, 0x01a7f744, 0x00d59f94, 0x001a14df}}, Y: Field{[10]uint32{0x0000050e, 0x018f2061, 0x024a7320, 0x01165e77, 0x004003ab, 0x01b8ec67, 0x0399ff32, 0x01e9476f, 0x00ef4110, 0x001d94d8}}}, + {X: Field{[10]uint32{0x025af330, 0x024281dd, 0x03b54b12, 0x03bcfe06, 0x0070be08, 0x03022209, 0x00a0735f, 0x027e7e3e, 0x03c669c9, 0x0017b27f}}, Y: Field{[10]uint32{0x0163b222, 0x0084e5c4, 0x03b381a4, 0x03737472, 0x001f4f1c, 0x015ad1f0, 0x00c32290, 0x021c581e, 0x0008e76f, 0x002aed50}}}, + {X: Field{[10]uint32{0x004dfae9, 0x02661d1c, 0x0231db23, 0x03d8572b, 0x0101a330, 0x01945528, 0x0071aba4, 0x00c3eea5, 0x008e5d49, 0x00138006}}, Y: Field{[10]uint32{0x01317868, 0x02ee0753, 0x02bba57f, 0x00a74821, 0x015ed3fe, 0x016d0082, 0x03656dd3, 0x00daa9cf, 0x03302824, 0x0001f9db}}}, + {X: Field{[10]uint32{0x015ed984, 0x0377f57c, 0x02e3c8aa, 0x0392f4ed, 0x03a2659c, 0x0130bcfe, 0x0139edeb, 0x0054bbff, 0x03a4d480, 0x0012b8d1}}, Y: Field{[10]uint32{0x02d4e523, 0x00b170d8, 0x033070ca, 0x0307cd71, 0x0165bb6a, 0x029cb18d, 0x02b8ba7b, 0x033f7d3e, 0x03460d44, 0x000e0f8b}}}, + {X: Field{[10]uint32{0x006665ef, 0x03386e27, 0x0319c603, 0x031363dd, 0x0235fd09, 0x01942697, 0x02d90fc8, 0x02b03be5, 0x0224a8d3, 0x000cb2b7}}, Y: Field{[10]uint32{0x038bea36, 0x004342be, 0x036af55c, 0x03cb8324, 0x02266939, 0x032a27e6, 0x023c5aa6, 0x02c4dd6d, 0x00735c63, 0x0021c9ce}}}, + {X: Field{[10]uint32{0x01cfcbee, 0x00891114, 0x0204f5f4, 0x030f53dc, 0x0320c703, 0x03e1f08b, 0x00e68910, 0x01d5d9ab, 0x01956014, 0x002393bc}}, Y: Field{[10]uint32{0x02ed47af, 0x025c1b81, 0x00666045, 0x00332527, 0x02cd5b9d, 0x0003ef3f, 0x02da0afc, 0x01f06de7, 0x02e389d9, 0x0000be9c}}}, + {X: Field{[10]uint32{0x00a2c30a, 0x01f9ffe9, 0x02509aae, 0x005a7bf0, 0x01559d73, 0x02181e80, 0x01549911, 0x000fdb13, 0x035c4adc, 0x000d7f55}}, Y: Field{[10]uint32{0x0248e000, 0x012b7472, 0x00aa1347, 0x03367252, 0x03dbf3ee, 0x033442b1, 0x0300926d, 0x02079f2d, 0x039d2748, 0x003e695d}}}, + {X: Field{[10]uint32{0x010a9cf6, 0x00d7fb72, 0x032873c6, 0x017d7d76, 0x03efc12f, 0x031049b1, 0x00929a52, 0x00965452, 0x00507fd0, 0x0024cb93}}, Y: Field{[10]uint32{0x028ba783, 0x0187be6e, 0x01f2875f, 0x03ef36fc, 0x009e84ef, 0x034660b0, 0x036b1b24, 0x028670a7, 0x0221bbac, 0x00339af2}}}, + {X: Field{[10]uint32{0x01fbea11, 0x01175cd2, 0x03fb211a, 0x02b4d77a, 0x0355d3e2, 0x03d165c1, 0x036a37f2, 0x014706f8, 0x024422a0, 0x0032b637}}, Y: Field{[10]uint32{0x001c347a, 0x008e99bc, 0x013e0533, 0x035e2a7f, 0x01308eeb, 0x013e1bc4, 0x0241c903, 0x01a7ca02, 0x031d4f66, 0x00122c37}}}, + {X: Field{[10]uint32{0x009594d6, 0x03efa41b, 0x0357b462, 0x0323f3ad, 0x031919ff, 0x032cd8e0, 0x016aa646, 0x03eb9f40, 0x0304c847, 0x0027f1f4}}, Y: Field{[10]uint32{0x019860ff, 0x038e9143, 0x03c9e516, 0x01b39352, 0x00196367, 0x01ebf729, 0x029dd38a, 0x02861f36, 0x00e13bc6, 0x003745f0}}}, + {X: Field{[10]uint32{0x008b5849, 0x00d5d866, 0x000b4c89, 0x03dd305f, 0x008300e4, 0x02537aee, 0x00654538, 0x0281771a, 0x00df10d4, 0x00106e9b}}, Y: Field{[10]uint32{0x007ad4c5, 0x026107f9, 0x03ac5930, 0x02133c54, 0x01ece57e, 0x00a0ccc8, 0x031e278b, 0x00259795, 0x03158c3f, 0x001fad8a}}}, + {X: Field{[10]uint32{0x01c7377b, 0x01ee9104, 0x02884b22, 0x0037c15f, 0x03d5bbf3, 0x03bee1a4, 0x0174248c, 0x01ab9a8b, 0x025aaef3, 0x0007fe7f}}, Y: Field{[10]uint32{0x01e74278, 0x00815d7c, 0x00692165, 0x01416f99, 0x01506908, 0x032d57c2, 0x009cf41f, 0x0000e127, 0x036c585c, 0x001ae892}}}, + {X: Field{[10]uint32{0x03f5d660, 0x03ce31b2, 0x03ebd893, 0x00507e3d, 0x026d1348, 0x0215b09c, 0x019d0704, 0x01b4a79b, 0x00440d70, 0x000a675f}}, Y: Field{[10]uint32{0x0103ff32, 0x0217ba8b, 0x000400fc, 0x03fe6d25, 0x0062f7d1, 0x01b7a6b3, 0x01b48877, 0x01d3832a, 0x00f34d03, 0x0003929d}}}, + {X: Field{[10]uint32{0x02e3a67d, 0x02caff5c, 0x012d69f7, 0x00b73a94, 0x020b607c, 0x00f5ba4e, 0x0318ceb8, 0x03261db8, 0x02d90ec1, 0x00280ccf}}, Y: Field{[10]uint32{0x03a0539e, 0x0216467e, 0x0141e0d6, 0x00eedae2, 0x0019f83e, 0x007f9ed4, 0x03373932, 0x01da74d6, 0x03655f51, 0x00369f74}}}, + {X: Field{[10]uint32{0x004251e0, 0x02e13e90, 0x020d2e75, 0x0005593a, 0x032821cf, 0x02a5a197, 0x00093d0b, 0x028cc14d, 0x02a22e52, 0x00169104}}, Y: Field{[10]uint32{0x030e4313, 0x0101e363, 0x0300c7cd, 0x009d53ad, 0x033675ab, 0x001b4a4e, 0x010bc0ab, 0x015c3a0e, 0x00e07e6c, 0x001a91e2}}}, + {X: Field{[10]uint32{0x02b7b0b5, 0x008f3d8c, 0x03cdc3e8, 0x00770bf9, 0x01078335, 0x01a7e6d9, 0x0134ea6a, 0x00771839, 0x004c3b14, 0x0035dcbb}}, Y: Field{[10]uint32{0x009ac0df, 0x00a6f99a, 0x03cfdda9, 0x00bf6e26, 0x01c9ccd9, 0x036ace08, 0x010979dd, 0x0121f9c2, 0x000d1036, 0x002f64d0}}}, + {X: Field{[10]uint32{0x01f89336, 0x0288d9db, 0x0321cd04, 0x0293b284, 0x03d4452f, 0x03903e01, 0x033e1cd6, 0x0130effe, 0x02d2c769, 0x002525e0}}, Y: Field{[10]uint32{0x02d436dc, 0x0351672e, 0x00930b68, 0x005325ef, 0x019f4e2c, 0x03358f15, 0x032e5dbb, 0x008ad50d, 0x027fb8ba, 0x0039f179}}}, + {X: Field{[10]uint32{0x0057e6de, 0x013d85a9, 0x0070e233, 0x032185dd, 0x036d9ca0, 0x031271c7, 0x00a9e4d4, 0x03d67cf8, 0x01f575e6, 0x001fb9f5}}, Y: Field{[10]uint32{0x03d9f3ee, 0x01ccbbb5, 0x03d0197e, 0x000b5a81, 0x029cbbbe, 0x01be8c42, 0x0074add7, 0x00f99b24, 0x029c7612, 0x001118b6}}}, + {X: Field{[10]uint32{0x013f843e, 0x02baedec, 0x0320b50f, 0x011c2ee0, 0x018a5548, 0x01505e54, 0x005ba7c1, 0x011ed6de, 0x030ae08d, 0x001e92d8}}, Y: Field{[10]uint32{0x01937c00, 0x035c1da7, 0x025dc6b5, 0x00641fe7, 0x0269a3b2, 0x02d26037, 0x023a524d, 0x0007a5c5, 0x004fb868, 0x00328939}}}, + {X: Field{[10]uint32{0x02a82b96, 0x0071b2c6, 0x037939c3, 0x03cca653, 0x013a18ee, 0x02ed88f0, 0x02a55032, 0x03102902, 0x0242428a, 0x0034b642}}, Y: Field{[10]uint32{0x0234972a, 0x013568fc, 0x03b66746, 0x01b960b7, 0x01394a3b, 0x002c7838, 0x0039e064, 0x03567cc0, 0x02332367, 0x001d614b}}}, + {X: Field{[10]uint32{0x015d13e0, 0x0382c5ba, 0x01b91340, 0x017120d2, 0x03a4809b, 0x00bb53cb, 0x01b56066, 0x037ecf68, 0x01ab6206, 0x00364926}}, Y: Field{[10]uint32{0x0271be38, 0x00a6caac, 0x0294111f, 0x0192f800, 0x00fa4dfc, 0x024eae98, 0x01400749, 0x03f86a3e, 0x00ed26a4, 0x00108d51}}}, + {X: Field{[10]uint32{0x01d09a23, 0x020c3d71, 0x034dc8d5, 0x02f9b1af, 0x02bba6f2, 0x02dffe1e, 0x00e2d315, 0x01799b49, 0x02c25887, 0x003b0307}}, Y: Field{[10]uint32{0x00591421, 0x02e9058a, 0x00d7aee8, 0x0261d601, 0x018b798c, 0x01822fde, 0x009a237e, 0x02f46071, 0x03f1648a, 0x003949a9}}}, + {X: Field{[10]uint32{0x03ba8863, 0x0384025a, 0x00c2ef30, 0x00205de6, 0x003a6ae5, 0x0243a814, 0x01b48052, 0x01662621, 0x0168835b, 0x001a4e02}}, Y: Field{[10]uint32{0x0311e5f4, 0x01c3d78b, 0x03345a61, 0x01d6064b, 0x037522df, 0x005341f1, 0x0297137a, 0x02e98d14, 0x039d80f0, 0x001c6fa8}}}, + {X: Field{[10]uint32{0x00a9ab23, 0x02b7237f, 0x0062bebb, 0x0177d65b, 0x0115a40a, 0x007fcbfb, 0x00fe8d2e, 0x018df913, 0x01a19fd1, 0x00359ac7}}, Y: Field{[10]uint32{0x006b9946, 0x01a51d96, 0x03b6878a, 0x00749960, 0x015cc5d9, 0x001eccc5, 0x0217c4e6, 0x012edc72, 0x00ebbd2b, 0x001a33d9}}}, + {X: Field{[10]uint32{0x0298c95f, 0x0037220c, 0x01695a51, 0x01729ad6, 0x01503647, 0x0264c590, 0x0350d70c, 0x018b2e49, 0x00a2c6fa, 0x00277663}}, Y: Field{[10]uint32{0x00fbe821, 0x00381f6b, 0x03c8187a, 0x0017663f, 0x03407509, 0x018ecc76, 0x01278b7e, 0x02735be3, 0x03b853b9, 0x00156a22}}}, + {X: Field{[10]uint32{0x0141bfa2, 0x02a6b7b4, 0x01b925b9, 0x02336dea, 0x014efd84, 0x03078b5c, 0x00ecccd0, 0x03c6efa9, 0x002c842c, 0x0006d9af}}, Y: Field{[10]uint32{0x03673bea, 0x02e69c20, 0x00a890dd, 0x000620c7, 0x02402b35, 0x02108f2d, 0x003d88b6, 0x020ae2bd, 0x030155fe, 0x003f82d1}}}, + {X: Field{[10]uint32{0x00eb688a, 0x001d72b2, 0x00312c1c, 0x03243c3a, 0x03c7d2d5, 0x0248b800, 0x016a61c2, 0x00c77b4e, 0x01c48a92, 0x0002ca03}}, Y: Field{[10]uint32{0x02738a74, 0x0338c1b4, 0x03ff7da9, 0x01854c73, 0x00498c82, 0x00aeaebc, 0x02cb3ad6, 0x02f99acc, 0x01a6a2f8, 0x00206dd1}}}, + {X: Field{[10]uint32{0x018a6b5d, 0x0073717c, 0x0280f8cf, 0x01b3c055, 0x02413e90, 0x00438ba4, 0x00125ad5, 0x02e8720a, 0x011c9eb3, 0x001ef165}}, Y: Field{[10]uint32{0x00352a07, 0x02bd69a6, 0x01a1cd43, 0x03c3b88a, 0x000fbda2, 0x026b71b5, 0x026fc7f4, 0x02a2f6e2, 0x01d8480b, 0x00106e41}}}, + {X: Field{[10]uint32{0x02eabfc1, 0x00b14efd, 0x02ea34ed, 0x0023713c, 0x01116479, 0x0172a1a5, 0x02530952, 0x015235da, 0x00d12318, 0x001a7fdd}}, Y: Field{[10]uint32{0x03de2419, 0x02f9dd6b, 0x01bde0d4, 0x025f7325, 0x011d6173, 0x00eb7d7f, 0x02aca1eb, 0x027de04b, 0x02288eb9, 0x003ce8f9}}}, + {X: Field{[10]uint32{0x004af209, 0x014b86b2, 0x003b92c5, 0x0262a83c, 0x02ffa460, 0x039fda26, 0x028f8cdd, 0x034e967e, 0x013f01f6, 0x0017f9b7}}, Y: Field{[10]uint32{0x00dbfb55, 0x02f1d3d8, 0x01aacd6d, 0x00589d28, 0x03f356cc, 0x015443ab, 0x01197a91, 0x0340893b, 0x0101acb8, 0x0027baba}}}, + {X: Field{[10]uint32{0x0105f5f0, 0x008b9671, 0x023b121d, 0x031e3338, 0x01d3b52b, 0x0314fe44, 0x029fafe9, 0x01d76dd1, 0x0122cb04, 0x0011a7a4}}, Y: Field{[10]uint32{0x0058d812, 0x0138bf04, 0x0237ecb8, 0x0200276d, 0x0280d8a5, 0x01348b09, 0x025825fa, 0x02e9afd6, 0x03a838b2, 0x003f9d21}}}, + {X: Field{[10]uint32{0x0160e6ab, 0x018ed364, 0x00c1c06d, 0x0061c307, 0x0072a5e7, 0x02cc3e39, 0x01f816e8, 0x00a48ecb, 0x02bf06b6, 0x0007d28f}}, Y: Field{[10]uint32{0x01c89e2f, 0x031a9853, 0x02d39b77, 0x037a21c1, 0x011ebeeb, 0x00a6299f, 0x0138bd40, 0x02b86626, 0x02957602, 0x00263684}}}, + {X: Field{[10]uint32{0x03b86b0f, 0x01e3af54, 0x00773c2f, 0x00b743e9, 0x00411722, 0x01bd4428, 0x00226ac2, 0x03fc333b, 0x01fe1c12, 0x00363aa5}}, Y: Field{[10]uint32{0x006288d9, 0x03bd1ca3, 0x03f5b25f, 0x026e8075, 0x01f154b5, 0x03a4b092, 0x00bebb3c, 0x03ca4ee2, 0x039edde6, 0x000556fb}}}, + {X: Field{[10]uint32{0x0227cac6, 0x01ef53c4, 0x02527179, 0x017771fc, 0x002bb36f, 0x01c114c0, 0x014b2cf8, 0x0201c488, 0x03c797b3, 0x0006b628}}, Y: Field{[10]uint32{0x0057814c, 0x00f017d2, 0x02a1ccfa, 0x01741355, 0x0158398c, 0x03f3d47b, 0x00189576, 0x008dfc55, 0x03aa3755, 0x001a029d}}}, + {X: Field{[10]uint32{0x00fa7d66, 0x03b0c609, 0x0292a3fd, 0x02cb0caa, 0x00355540, 0x03c2c3e2, 0x01426469, 0x0349b836, 0x010405d1, 0x003ffa9c}}, Y: Field{[10]uint32{0x0034eac8, 0x03413089, 0x00ed4cb5, 0x02bcb299, 0x00081f67, 0x01c0bb75, 0x02c8db75, 0x0281b113, 0x00e22d8d, 0x003b2891}}}, + {X: Field{[10]uint32{0x0159d8ab, 0x0192b22e, 0x00f3fc17, 0x02e95764, 0x01d3abe9, 0x03f5bd9d, 0x02141c8c, 0x02226152, 0x03a3f7fc, 0x0012b156}}, Y: Field{[10]uint32{0x00be2bd2, 0x02f24efe, 0x039ce15b, 0x02d06f61, 0x03714821, 0x0062c412, 0x0252d141, 0x03edeff4, 0x0391f135, 0x00271eca}}}, + {X: Field{[10]uint32{0x03718ac4, 0x01ebd42e, 0x01536fe2, 0x02a72949, 0x02bc7061, 0x0196e280, 0x01de0eb8, 0x02933bca, 0x00677aa9, 0x0017e051}}, Y: Field{[10]uint32{0x00d9c042, 0x033c4064, 0x01b3669a, 0x0251cf8e, 0x022b8cb8, 0x00c07ec0, 0x00340716, 0x02c9bf99, 0x01dc4062, 0x002f6a59}}}, + {X: Field{[10]uint32{0x01dd88bb, 0x03ac551d, 0x0390388b, 0x029346b2, 0x02da5f96, 0x016607cc, 0x029f2130, 0x01d2612c, 0x03043791, 0x003cdcb2}}, Y: Field{[10]uint32{0x02367d89, 0x002ad186, 0x00efcb2a, 0x03b38cb1, 0x007ceda2, 0x01a50653, 0x00a0ea07, 0x03540068, 0x035c1e62, 0x0020b5a3}}}, + {X: Field{[10]uint32{0x0359b128, 0x0314c82e, 0x026927a3, 0x03c890f8, 0x02878ec6, 0x03efe92c, 0x03133753, 0x0011e0d8, 0x03c54576, 0x0003ec4a}}, Y: Field{[10]uint32{0x0153aef5, 0x01af9712, 0x03e17a92, 0x01dff5ef, 0x01961930, 0x009329a0, 0x01ac0cba, 0x0386d6ed, 0x011867da, 0x000fe080}}}, + {X: Field{[10]uint32{0x00c0ea07, 0x03fe0658, 0x02447316, 0x0286c2a4, 0x034adafe, 0x01ea5d1f, 0x03075601, 0x0128d3d0, 0x01ac918a, 0x000f65d6}}, Y: Field{[10]uint32{0x02018aaa, 0x02956695, 0x03ecc6fc, 0x0299defa, 0x00caa317, 0x02a5925f, 0x031d5dda, 0x00cc2ad9, 0x03cf6d6a, 0x00033676}}}, + {X: Field{[10]uint32{0x023e00ce, 0x015720bf, 0x02909844, 0x037d6390, 0x019f476f, 0x01a6f1f7, 0x0349be46, 0x014870fe, 0x02b3699c, 0x003ab82a}}, Y: Field{[10]uint32{0x0317259e, 0x01feb853, 0x00bdd977, 0x0078478c, 0x0362c7ef, 0x017a0228, 0x0377b562, 0x039f0a66, 0x00dd450e, 0x002eb73a}}}, + {X: Field{[10]uint32{0x011eb851, 0x002afb51, 0x0338455e, 0x01f49328, 0x0343718a, 0x0097b974, 0x0225d0e9, 0x033aa95d, 0x02eec2c0, 0x003fb494}}, Y: Field{[10]uint32{0x002c648f, 0x0296a2ba, 0x03b4c457, 0x007173c2, 0x00dd0721, 0x001d5bd9, 0x0166b277, 0x03bf3087, 0x02ae56ce, 0x0019aeed}}}, + {X: Field{[10]uint32{0x017f9dbd, 0x021e4e8b, 0x013c9bc0, 0x00be74c0, 0x022362af, 0x02eac2c8, 0x03fb04d3, 0x030f0505, 0x02bd022a, 0x003698e7}}, Y: Field{[10]uint32{0x022466d5, 0x029ed3a0, 0x0031c10a, 0x03a8f9e8, 0x003627aa, 0x00daef95, 0x034ed0d5, 0x03a7cbe9, 0x022055f1, 0x0020fc9d}}}, + {X: Field{[10]uint32{0x02ab90dd, 0x01f3f09f, 0x0282ce09, 0x029ab2b9, 0x0132ced2, 0x031c77e4, 0x00d3ac67, 0x0116bd35, 0x00ded773, 0x00149349}}, Y: Field{[10]uint32{0x02b7f5c2, 0x01e81d3e, 0x03b01b2f, 0x000221ec, 0x032d010a, 0x003f9f3f, 0x036f55c9, 0x01f170c6, 0x00f7c692, 0x003933d7}}}, + {X: Field{[10]uint32{0x00ae4f94, 0x03149a15, 0x021c4b24, 0x02917ef0, 0x0028672d, 0x00a185ed, 0x007cde0c, 0x02d830d7, 0x02d5fb52, 0x001f6b0b}}, Y: Field{[10]uint32{0x03794038, 0x023b83f9, 0x0309ea57, 0x02db4a0a, 0x02f6cc11, 0x034919b0, 0x035c4a2b, 0x022199c2, 0x007ae916, 0x00331ab3}}}, + {X: Field{[10]uint32{0x016083ae, 0x01472fb9, 0x03ea6f7c, 0x02728e24, 0x02887e5d, 0x003a4a46, 0x019d10d0, 0x03d67dae, 0x024dda61, 0x0017d1ad}}, Y: Field{[10]uint32{0x0283a8ae, 0x007cf678, 0x0182e5ee, 0x02e9f86d, 0x0109bfa6, 0x0155ca4a, 0x02dcfb9c, 0x00995541, 0x0055da25, 0x001810f4}}}, + {X: Field{[10]uint32{0x01e14aa3, 0x0258685f, 0x03635175, 0x0308e29f, 0x0348ef0f, 0x023177c3, 0x0241ec2b, 0x017c85b9, 0x0033b6a2, 0x002218fb}}, Y: Field{[10]uint32{0x02b42541, 0x032c4ac3, 0x037a117d, 0x020f683f, 0x0345b2a5, 0x01241956, 0x00292777, 0x016070be, 0x00f31e52, 0x00275986}}}, + {X: Field{[10]uint32{0x03a2f9f4, 0x035a9a0c, 0x02a03a1b, 0x03dcfa4b, 0x03b377f3, 0x03c9be47, 0x00184c7e, 0x016739b6, 0x00463ac4, 0x0021500d}}, Y: Field{[10]uint32{0x01b399cb, 0x03dc9e31, 0x01430438, 0x03c8ec32, 0x018f7719, 0x00c4ff8d, 0x012a5b18, 0x019266c9, 0x02968ac5, 0x000b47c4}}}, + {X: Field{[10]uint32{0x02223c7f, 0x032b7597, 0x03201379, 0x009d7adf, 0x006a325d, 0x018899ad, 0x0251dbc3, 0x0104aff9, 0x03f6217e, 0x0002fdac}}, Y: Field{[10]uint32{0x03ba748b, 0x02c6bbe5, 0x03eaf0a9, 0x0035abc6, 0x01ebfad9, 0x03bb8f7b, 0x0041e7dc, 0x029157ec, 0x0154c14a, 0x00284582}}}, + {X: Field{[10]uint32{0x02d9e59d, 0x009396af, 0x03ffc771, 0x00662e86, 0x03860ca2, 0x0026a933, 0x02079ea4, 0x0184d52a, 0x002d3c18, 0x0012c808}}, Y: Field{[10]uint32{0x035b8873, 0x017a2a43, 0x002bab55, 0x01154418, 0x007703eb, 0x03c47641, 0x01d858f2, 0x0302c2e9, 0x0103c107, 0x0027da11}}}, + {X: Field{[10]uint32{0x02421dd2, 0x01a96a81, 0x03e28268, 0x03c989f2, 0x0199c050, 0x009ed64c, 0x024f5331, 0x02692ce8, 0x00806d67, 0x001021fe}}, Y: Field{[10]uint32{0x0188e8b9, 0x01c1f4af, 0x0121b5a5, 0x0105627e, 0x01698800, 0x0263d696, 0x008c8836, 0x035220cf, 0x0184b3d9, 0x00120e2b}}}, + {X: Field{[10]uint32{0x0297b79c, 0x0244c6bf, 0x02ac766d, 0x00131e43, 0x00538775, 0x01693f0d, 0x01b91e00, 0x01d01a8b, 0x0287cb2e, 0x000569e4}}, Y: Field{[10]uint32{0x014a238a, 0x029069ae, 0x003fadf2, 0x033ee5aa, 0x031bd597, 0x00b18583, 0x03ce497c, 0x01cb8f4f, 0x03220765, 0x0027d3bc}}}, + {X: Field{[10]uint32{0x03bcecbe, 0x026cd0f8, 0x02812273, 0x0029f888, 0x02404fb1, 0x032cf502, 0x0233d61b, 0x012f13fc, 0x0063c052, 0x000713e8}}, Y: Field{[10]uint32{0x02d48bd6, 0x0231cf58, 0x003533aa, 0x02cafd34, 0x03d39c90, 0x035cc2ca, 0x0209e9eb, 0x00bbae5c, 0x01eca2d8, 0x000aa158}}}, + {X: Field{[10]uint32{0x01f2a636, 0x0058ed6b, 0x02c2656d, 0x029b5221, 0x02bb50b8, 0x014c4bca, 0x03936c18, 0x02cb1499, 0x03a743c1, 0x00281c22}}, Y: Field{[10]uint32{0x031a20ea, 0x017a534d, 0x00324584, 0x0188d669, 0x007dc66a, 0x004b874b, 0x01b81550, 0x022331b2, 0x01f19169, 0x002563d1}}}, + {X: Field{[10]uint32{0x00acad7d, 0x00de4f3a, 0x02858c21, 0x0152c4a6, 0x0109b797, 0x00b8cfff, 0x009d71f0, 0x010b9b84, 0x034df01a, 0x0035e582}}, Y: Field{[10]uint32{0x03deb920, 0x03078676, 0x00707d81, 0x024d8c46, 0x02335661, 0x03195cc2, 0x003d0e1d, 0x0074ad87, 0x01aa5a84, 0x00232bc6}}}, + {X: Field{[10]uint32{0x038ba611, 0x030c902f, 0x03789daa, 0x01b9ba28, 0x02a7c450, 0x03f286cc, 0x0225ba38, 0x01c3565b, 0x006bf8ba, 0x001e80f7}}, Y: Field{[10]uint32{0x037d9028, 0x021293df, 0x03881fcb, 0x0207425a, 0x00048a36, 0x01dcf85c, 0x023e378b, 0x01a15969, 0x0222292d, 0x001c3c67}}}, + {X: Field{[10]uint32{0x03443b97, 0x00e3c971, 0x01dbac2f, 0x0281c9bf, 0x01da516c, 0x01b20ea9, 0x0189850c, 0x00d0470e, 0x0262a8fa, 0x0014ea69}}, Y: Field{[10]uint32{0x03945e25, 0x03fd6780, 0x0036e140, 0x0316e00c, 0x022adcfd, 0x01134797, 0x013279e8, 0x030c6fcc, 0x02506179, 0x00177ab0}}}, + {X: Field{[10]uint32{0x02b2cdf7, 0x0143673f, 0x036f20a4, 0x02ca1da0, 0x01b7ee99, 0x0306eeaa, 0x0269af63, 0x00361bff, 0x02b63dbb, 0x0021ae51}}, Y: Field{[10]uint32{0x0374b1fa, 0x012d6603, 0x03a62ed7, 0x03006665, 0x037cbc39, 0x00793c4c, 0x018ea1ba, 0x038a9b2c, 0x0383d3d0, 0x0011101d}}}, + {X: Field{[10]uint32{0x03752d8e, 0x0054b9bb, 0x019babef, 0x03fee9c7, 0x036b28c8, 0x0034908f, 0x01567262, 0x012d1bda, 0x00f5cb88, 0x00033a07}}, Y: Field{[10]uint32{0x02a9248c, 0x02d50117, 0x009262d0, 0x03fca243, 0x02979177, 0x001306aa, 0x01bf924c, 0x019130d2, 0x01738120, 0x001d6bf6}}}, + {X: Field{[10]uint32{0x01172ed9, 0x033a4b78, 0x02b8fbc6, 0x010c4ce8, 0x037b791d, 0x01f55f51, 0x006cb9e4, 0x0134b67e, 0x02413a46, 0x0010441b}}, Y: Field{[10]uint32{0x036741c6, 0x031be87d, 0x03374d2e, 0x00a9cde6, 0x002ce4e4, 0x01ce83e2, 0x01601a27, 0x0082e001, 0x00c230e9, 0x0038b291}}}, + {X: Field{[10]uint32{0x00b49777, 0x0106d288, 0x001524e1, 0x0328814b, 0x03bca3f1, 0x01eb1bda, 0x006541ec, 0x00284b95, 0x02a04e83, 0x003a707c}}, Y: Field{[10]uint32{0x02a58124, 0x0247e6cc, 0x0030886b, 0x0087d754, 0x005ca737, 0x0059c4b2, 0x0173fcd5, 0x004b08a6, 0x004308dd, 0x001477ce}}}, + {X: Field{[10]uint32{0x033bbf2c, 0x0173c579, 0x01511fce, 0x009d0943, 0x039be21f, 0x00554b8e, 0x0225775f, 0x03fcf92e, 0x012dc5e8, 0x0022ee78}}, Y: Field{[10]uint32{0x000d1152, 0x03c46a34, 0x0162f91e, 0x022af08e, 0x02b4d096, 0x03067137, 0x024fcf50, 0x00dcc070, 0x037a273c, 0x0022a08a}}}, + {X: Field{[10]uint32{0x00b6bd0f, 0x0165e9eb, 0x011399ad, 0x00f80a5f, 0x01697f3f, 0x03d9b80c, 0x0294c3ee, 0x01de4791, 0x02f1da22, 0x002c0163}}, Y: Field{[10]uint32{0x02205a2a, 0x016cbc2f, 0x02978c80, 0x0111f4ae, 0x01e5deb6, 0x03ffa009, 0x000bee68, 0x00e05363, 0x034a0579, 0x001fd6ea}}}, + {X: Field{[10]uint32{0x002522a5, 0x014da32b, 0x025c8db9, 0x015d2e1c, 0x006dfc35, 0x0137f2ac, 0x0202b780, 0x03f7594b, 0x002d8df5, 0x00077b75}}, Y: Field{[10]uint32{0x02bca540, 0x019567ad, 0x0254f5b4, 0x037bcd5d, 0x0024b918, 0x020ed86e, 0x03f4a8f9, 0x00349463, 0x00492373, 0x000c1569}}}, + {X: Field{[10]uint32{0x000ea544, 0x03cbbd0e, 0x01f7da46, 0x00f67571, 0x03e47181, 0x00af0e76, 0x005b0b51, 0x012ea4fd, 0x0248c679, 0x001d8694}}, Y: Field{[10]uint32{0x032c1292, 0x03442c20, 0x01fc5c60, 0x00217eb4, 0x029f7034, 0x016ea3b5, 0x018d0a39, 0x033ab178, 0x0130c4f5, 0x0006177b}}}, + {X: Field{[10]uint32{0x03aa5caf, 0x02ae2638, 0x00f2ffef, 0x021d4069, 0x03a17496, 0x004f06d6, 0x0020982a, 0x03433237, 0x0360e515, 0x0003c756}}, Y: Field{[10]uint32{0x00a0d91d, 0x03b673de, 0x00708e42, 0x02dd5265, 0x03ee6f9a, 0x03ad8fc1, 0x033a9e48, 0x03630805, 0x026c395f, 0x00157f5d}}}, + {X: Field{[10]uint32{0x0337425f, 0x0264ff6e, 0x002d7fba, 0x012f0c09, 0x02fb09ff, 0x00711156, 0x02ba0bf6, 0x0002a95d, 0x004c9b79, 0x0015a72d}}, Y: Field{[10]uint32{0x00c350b1, 0x01009c83, 0x026d0d33, 0x03a03895, 0x01c1131d, 0x031f768f, 0x038f646a, 0x038f5079, 0x00d2ff1a, 0x0037f7ae}}}, + {X: Field{[10]uint32{0x021851eb, 0x031e1f2e, 0x00776d22, 0x0045f734, 0x039c2dda, 0x0363e142, 0x0147a787, 0x00e7a146, 0x029ad998, 0x000f966d}}, Y: Field{[10]uint32{0x012e20b3, 0x03620d16, 0x036d434c, 0x017acb27, 0x03705074, 0x01fb13c9, 0x01d93583, 0x02c0c1af, 0x02a48bfe, 0x001ccb34}}}, + {X: Field{[10]uint32{0x01296967, 0x03a93125, 0x0087b0e6, 0x015ccb0c, 0x0181acec, 0x03f0221b, 0x02502403, 0x015a0a60, 0x022107b4, 0x00291b59}}, Y: Field{[10]uint32{0x01763d33, 0x006b3bee, 0x03464005, 0x02139849, 0x01461478, 0x026a0823, 0x0097a73f, 0x02c18890, 0x00f429a5, 0x00050333}}}, + {X: Field{[10]uint32{0x0079ab1c, 0x005b1194, 0x0392774d, 0x03fb6bad, 0x004ad70e, 0x0055d727, 0x000c427d, 0x014ee9f0, 0x019cf25c, 0x002e4839}}, Y: Field{[10]uint32{0x0045b67f, 0x0065f07c, 0x005c9d43, 0x017cdfd6, 0x039201ec, 0x0195ae4d, 0x01435a61, 0x02223475, 0x00f1d4ba, 0x00181858}}}, + {X: Field{[10]uint32{0x00bfa8c5, 0x0381adfe, 0x00713896, 0x03663417, 0x023b88b6, 0x02c9c36d, 0x03da1efd, 0x00dee7ab, 0x02e1e7d8, 0x0004b3c6}}, Y: Field{[10]uint32{0x01c99c0f, 0x03329a4e, 0x035d91e8, 0x01b52141, 0x03c4c1d6, 0x0273f62c, 0x0323d7be, 0x024d2c27, 0x0213181b, 0x00383599}}}, + {X: Field{[10]uint32{0x01c0ec1f, 0x03ce74e3, 0x0230287f, 0x0002f84e, 0x02eb93a9, 0x00ca0553, 0x00620e5a, 0x02b28b98, 0x03ae0a4e, 0x001aab49}}, Y: Field{[10]uint32{0x00a1f46a, 0x0189aee5, 0x008112fe, 0x01d0d0b0, 0x02d46814, 0x0315ff5e, 0x03e8cd2d, 0x0054e789, 0x01c5caa2, 0x0024c855}}}, + {X: Field{[10]uint32{0x00f870a0, 0x00d0fb2b, 0x01c36ce9, 0x03e487dd, 0x008d168b, 0x0301b06e, 0x03489166, 0x019afa0a, 0x014e7cb1, 0x0004d336}}, Y: Field{[10]uint32{0x01453236, 0x02230ec2, 0x014c0fab, 0x039f9cf4, 0x012f7c8f, 0x03c268e6, 0x02a51cff, 0x03f517a0, 0x03c5e956, 0x0010a99c}}}, + {X: Field{[10]uint32{0x023989ee, 0x027d6d56, 0x00e2c56d, 0x0063729a, 0x02429b1d, 0x0072173b, 0x002971fa, 0x031e1a31, 0x018c7b7c, 0x00357735}}, Y: Field{[10]uint32{0x01208100, 0x01989388, 0x035c5e31, 0x002bc2ed, 0x0345bedd, 0x028ce2f1, 0x01a05297, 0x032b93b3, 0x0130ef1b, 0x00383290}}}, + {X: Field{[10]uint32{0x020d8c8e, 0x02b27403, 0x02861f66, 0x02f454e2, 0x033e3567, 0x01a47cce, 0x01fa4cdb, 0x02422e41, 0x0134c344, 0x00254759}}, Y: Field{[10]uint32{0x017046f1, 0x017cc1bb, 0x039f9d57, 0x024669f5, 0x0295a5f6, 0x0114957d, 0x001a9903, 0x01e4a19a, 0x0122eb84, 0x003bbcd6}}}, + {X: Field{[10]uint32{0x01cdd0fc, 0x019973f0, 0x01e27b33, 0x02ea59bb, 0x02690af0, 0x02d48455, 0x0184c9c9, 0x025935db, 0x004b25f7, 0x0033b6e9}}, Y: Field{[10]uint32{0x03c79e7e, 0x006de6a1, 0x037d94c2, 0x009246a3, 0x02187e71, 0x024cc5ad, 0x007b6b64, 0x026bc746, 0x0049cb8e, 0x00201aa4}}}, + {X: Field{[10]uint32{0x00a10b54, 0x01bd2ab6, 0x02a2049c, 0x03445124, 0x01d1c7d2, 0x00afb285, 0x02bd39d3, 0x01afb8a6, 0x0260d130, 0x0013fc0d}}, Y: Field{[10]uint32{0x02d1e574, 0x0389dcc1, 0x01893d99, 0x01774bfc, 0x014990f2, 0x039c7da2, 0x02e8bc8b, 0x0265478d, 0x02698fd8, 0x0030b1d7}}}, + {X: Field{[10]uint32{0x022e0ca7, 0x0010b3b3, 0x01824389, 0x0289a0ee, 0x00c78061, 0x037edc80, 0x03b77020, 0x019197a1, 0x01088dbd, 0x003022f5}}, Y: Field{[10]uint32{0x008d7307, 0x024c957e, 0x03e78417, 0x02d82318, 0x011db329, 0x00ea7c5c, 0x02408842, 0x0125eac5, 0x01d61343, 0x00158806}}}, + {X: Field{[10]uint32{0x03f9857d, 0x03f576d2, 0x01e3a07a, 0x02a09d28, 0x00955bdd, 0x022eb0c6, 0x005cdd22, 0x033ac8ee, 0x00aa6fd2, 0x001237f7}}, Y: Field{[10]uint32{0x020287ce, 0x017fe8ba, 0x011710d5, 0x02d450c7, 0x00af60f4, 0x0390a555, 0x014e76fc, 0x019ee945, 0x022e8961, 0x000a9198}}}, + {X: Field{[10]uint32{0x02a1f236, 0x02b3fcc5, 0x03ceebbf, 0x01e68ce8, 0x02802c14, 0x01c094e0, 0x0376b471, 0x03e20f2f, 0x0100d81a, 0x00101082}}, Y: Field{[10]uint32{0x0385e3f7, 0x01a346de, 0x01b4be41, 0x01bbc678, 0x007831e9, 0x02d50957, 0x00f50fa2, 0x02d4ecc2, 0x00e0dbbc, 0x00219811}}}, + {X: Field{[10]uint32{0x022bdc42, 0x00bcdf8c, 0x0156f8b1, 0x01080ec4, 0x02ec1e31, 0x03a64823, 0x02c20184, 0x019f1dc3, 0x007b23b6, 0x0025a8dd}}, Y: Field{[10]uint32{0x00f22ab2, 0x01f3618f, 0x03af798c, 0x03d29281, 0x03dc7545, 0x034c975b, 0x010b04ba, 0x01191ccc, 0x03c8df8c, 0x0019ec2c}}}, + {X: Field{[10]uint32{0x00460182, 0x0244caf2, 0x02784503, 0x0246a345, 0x03f1db3e, 0x00545212, 0x0361f0cb, 0x01e5a490, 0x017de403, 0x0033c1c0}}, Y: Field{[10]uint32{0x0397939d, 0x006ece4d, 0x0106799b, 0x0327996b, 0x00e2eb60, 0x01a5018e, 0x036e762f, 0x0278c343, 0x010762f2, 0x002de86c}}}, + {X: Field{[10]uint32{0x018beb15, 0x0173d688, 0x036dc080, 0x028f75c9, 0x0393507a, 0x01d7f756, 0x01b90ded, 0x02dbdeb4, 0x00b25b0b, 0x0004ad6e}}, Y: Field{[10]uint32{0x038933da, 0x02d5bb6d, 0x009aee89, 0x01942cd8, 0x015a5bc1, 0x01032866, 0x02d6368d, 0x02866e03, 0x03678cef, 0x00174f51}}}, + {X: Field{[10]uint32{0x03a46765, 0x0270de84, 0x0327dcd9, 0x0266f66d, 0x0177ecd2, 0x0062dbc6, 0x018b9ace, 0x039b64e6, 0x009ce866, 0x0021e6d1}}, Y: Field{[10]uint32{0x03781c63, 0x004ea0d8, 0x02baec6c, 0x0057c0f9, 0x01f0c452, 0x006a3679, 0x0350c4e9, 0x03ec4ab3, 0x00eb758c, 0x002c3120}}}, + {X: Field{[10]uint32{0x00c7dead, 0x01ee4283, 0x0121dd2b, 0x00332cdb, 0x01e50228, 0x00ffbc92, 0x03a401dd, 0x02807747, 0x0383e9d3, 0x000bb121}}, Y: Field{[10]uint32{0x01a67fce, 0x03c31fa1, 0x00703ca2, 0x020419e6, 0x0283fd8f, 0x03ad1a68, 0x01e61505, 0x038b2869, 0x012478f9, 0x003ec0a4}}}, + {X: Field{[10]uint32{0x037c3ce7, 0x008824d0, 0x03a83aee, 0x03eef61c, 0x025b7878, 0x0051655a, 0x03e8fcd2, 0x036c1ce7, 0x025827be, 0x001e7328}}, Y: Field{[10]uint32{0x00ac467e, 0x02073aa7, 0x015a8d33, 0x02c8b064, 0x00bee990, 0x03add2cc, 0x00b7c483, 0x021d4053, 0x0293d82e, 0x003fd222}}}, + {X: Field{[10]uint32{0x02dbd207, 0x00f37556, 0x01cd93e9, 0x0203526a, 0x028e146a, 0x00185aa9, 0x02b9eed4, 0x022dea09, 0x00ca3d2b, 0x00311129}}, Y: Field{[10]uint32{0x012d0f18, 0x03f09cc2, 0x032319d1, 0x003ee3f0, 0x00ac00ad, 0x037b41a1, 0x01ae3381, 0x00130950, 0x00a963d5, 0x001344da}}}, + {X: Field{[10]uint32{0x03f3e7a8, 0x0154a6f3, 0x03c267ee, 0x02298124, 0x02dbed32, 0x020d7a35, 0x024e2050, 0x0112c961, 0x0050cc0e, 0x000fb91f}}, Y: Field{[10]uint32{0x00a5f095, 0x0072a7a4, 0x0391f84e, 0x00c00f46, 0x00b6229a, 0x0117890f, 0x02496401, 0x02a1ef0c, 0x0339056e, 0x003e9554}}}, + {X: Field{[10]uint32{0x0009980c, 0x004b5f72, 0x020a81c0, 0x0364b464, 0x038e69e2, 0x03e6c3d1, 0x02251a29, 0x02edfd08, 0x01873036, 0x003a58f2}}, Y: Field{[10]uint32{0x01c52fd6, 0x009e8f15, 0x025e6180, 0x035b1fe3, 0x02140f92, 0x0202c5cf, 0x002bfa48, 0x02fcbc49, 0x03b0779b, 0x0003fe56}}}, + {X: Field{[10]uint32{0x008fc07d, 0x00473195, 0x008bd3f7, 0x01439a1b, 0x0023738e, 0x011be8e5, 0x024b747a, 0x02e2e6bf, 0x035bb6a1, 0x002abd81}}, Y: Field{[10]uint32{0x02f2b0cb, 0x0354866a, 0x0098b1bb, 0x01baef7e, 0x0253ab32, 0x03ad047a, 0x005bd162, 0x0328707a, 0x02ec6d11, 0x001336c2}}}, + {X: Field{[10]uint32{0x0157ac0f, 0x031d6150, 0x012986e4, 0x0357aa48, 0x02842b44, 0x0175c22a, 0x0174a18d, 0x01d5b638, 0x0017d8e9, 0x001a4792}}, Y: Field{[10]uint32{0x00c0c222, 0x03d01da8, 0x008c2d1f, 0x037ca7d4, 0x034bb9a8, 0x00be4a1c, 0x010eb157, 0x01eb5e03, 0x020b3bfa, 0x0027abae}}}, + {X: Field{[10]uint32{0x0344996a, 0x03821ff9, 0x03fd81d9, 0x02cc72bc, 0x00c77dbf, 0x020f6b63, 0x01c9d4c5, 0x01292250, 0x01bb45af, 0x0030f9bf}}, Y: Field{[10]uint32{0x008366f2, 0x010af258, 0x00a730e6, 0x01d2d526, 0x010b8694, 0x02b13a5e, 0x0207bfd1, 0x00a6e3fb, 0x011e65ab, 0x0032a663}}}, + {X: Field{[10]uint32{0x0140701f, 0x03002cc2, 0x013868ce, 0x03e00ccf, 0x02923ead, 0x01f17265, 0x032630be, 0x00973c87, 0x0320a55d, 0x003b6f58}}, Y: Field{[10]uint32{0x01e4889e, 0x005090d3, 0x003e3f7a, 0x0143dacb, 0x025e3d3d, 0x038a3e52, 0x00cd12bf, 0x03d79322, 0x02e7afce, 0x00359464}}}, + {X: Field{[10]uint32{0x0295d336, 0x02d30d3a, 0x005dad7c, 0x03b67536, 0x02b29684, 0x00f0dd04, 0x02fd2494, 0x0382e2b0, 0x0183a80a, 0x0032567b}}, Y: Field{[10]uint32{0x032b168b, 0x0268b869, 0x03e5f8b5, 0x023804bd, 0x014de5f5, 0x00965c30, 0x00b0e970, 0x03c94ab6, 0x02bb8dcc, 0x00203076}}}, + {X: Field{[10]uint32{0x02ed9237, 0x00f7e0cf, 0x0231274e, 0x03b76992, 0x022c5bc6, 0x034b573e, 0x00c90224, 0x0013a762, 0x01744710, 0x001de331}}, Y: Field{[10]uint32{0x02916c17, 0x00b724e4, 0x0360946b, 0x03f94730, 0x01675720, 0x02e48767, 0x012e502d, 0x007009ee, 0x01316b2a, 0x003ba88f}}}, + {X: Field{[10]uint32{0x03b42055, 0x02bf2598, 0x02d9a5c2, 0x011b4fef, 0x00173e7e, 0x036634b0, 0x03299f81, 0x015abd0f, 0x00388c36, 0x00287e1d}}, Y: Field{[10]uint32{0x016f4afc, 0x0261e9f5, 0x0284eabb, 0x03fb71ca, 0x015d874a, 0x0264d9e1, 0x0150e79b, 0x035b16cc, 0x00430820, 0x00042f21}}}, + {X: Field{[10]uint32{0x00224a5d, 0x008247da, 0x036a3d00, 0x020dd503, 0x028f7fa5, 0x00f410fb, 0x01a1839c, 0x022e2b36, 0x030b2d5f, 0x00322b5f}}, Y: Field{[10]uint32{0x03aebf8b, 0x017c6471, 0x01ec38e6, 0x02d4455f, 0x022a1cd4, 0x0229ff92, 0x01507cf1, 0x016e68b4, 0x0180eebe, 0x000c062d}}}, + {X: Field{[10]uint32{0x0020055f, 0x020436d2, 0x02d20bea, 0x01028a9e, 0x031ecf38, 0x02b9d9fd, 0x024e4261, 0x03f5eedf, 0x02640b93, 0x00309754}}, Y: Field{[10]uint32{0x025ad684, 0x027a3891, 0x03524c34, 0x03b0e851, 0x02bf331a, 0x02d23b4c, 0x01fffbce, 0x00ac3e8a, 0x00c76e3f, 0x003e8572}}}, + {X: Field{[10]uint32{0x0178f92b, 0x018afd7a, 0x032f2ccc, 0x01de22d7, 0x03283168, 0x02cb61ce, 0x03224dcc, 0x02feb6eb, 0x02eb7e4c, 0x00342e5c}}, Y: Field{[10]uint32{0x03ab8e3b, 0x0390837d, 0x03f56e94, 0x00c61082, 0x0275610b, 0x008f9e1e, 0x03bcb4cf, 0x01614aab, 0x00a1606a, 0x003bd74f}}}, + {X: Field{[10]uint32{0x030a2d07, 0x02010ac6, 0x014ab56c, 0x0146ef0a, 0x02d393e8, 0x02604cad, 0x008791ab, 0x0111e591, 0x00835856, 0x003e2d13}}, Y: Field{[10]uint32{0x0070a27c, 0x007b7fba, 0x00ed0b8e, 0x000756ec, 0x022dbe0c, 0x03239d93, 0x0051362f, 0x0102fba6, 0x02bf0420, 0x0030a090}}}, + {X: Field{[10]uint32{0x025666b7, 0x02df20f6, 0x02d368ac, 0x00641469, 0x005d9424, 0x00bf448d, 0x0010adc1, 0x02ab78e5, 0x01016f72, 0x0039f2e2}}, Y: Field{[10]uint32{0x02b21697, 0x01070d75, 0x00f63953, 0x02032c3e, 0x03f0c87e, 0x00e8595b, 0x014ee6c5, 0x03675fbf, 0x012246b6, 0x00378d9d}}}, + {X: Field{[10]uint32{0x0279d87f, 0x031d0930, 0x02167fb2, 0x03925733, 0x01f40f93, 0x01317abd, 0x02894786, 0x03d2aa4b, 0x028f14e3, 0x00022c84}}, Y: Field{[10]uint32{0x00f5d246, 0x02c39243, 0x00c11cbe, 0x0356e0c1, 0x02699926, 0x020c0c0f, 0x0012068a, 0x02d2c406, 0x004af469, 0x0039fb4e}}}, + {X: Field{[10]uint32{0x013b4afb, 0x01023d42, 0x00317658, 0x0075e17a, 0x001f3f63, 0x02d6cc7d, 0x036a5f3a, 0x035618e2, 0x01db3cbc, 0x003cd36d}}, Y: Field{[10]uint32{0x003dd3d9, 0x00c3f543, 0x02f2d56e, 0x018d3263, 0x005bf112, 0x03ff06b1, 0x031a1c74, 0x02119be8, 0x0372bb2c, 0x0037f39c}}}, + {X: Field{[10]uint32{0x00aabdb8, 0x017570bb, 0x01c86a96, 0x03937494, 0x0110b4fe, 0x03294cee, 0x00a48eab, 0x035a176b, 0x0209a445, 0x0030da27}}, Y: Field{[10]uint32{0x0279e3f4, 0x007c8bc5, 0x017a155c, 0x01f8e964, 0x03d62e18, 0x0101d747, 0x03efbe4f, 0x00feef0c, 0x005a6a26, 0x001e0134}}}, + {X: Field{[10]uint32{0x03005cbc, 0x022832cf, 0x00a78d70, 0x0128ad1f, 0x03f1e47d, 0x0025624b, 0x0266d626, 0x0284341e, 0x01ecf776, 0x001ffe65}}, Y: Field{[10]uint32{0x026ea90d, 0x0317ab32, 0x019f5cd5, 0x0343a4a6, 0x000e3911, 0x01b420a2, 0x00a4d115, 0x0390c337, 0x03745f17, 0x003b7371}}}, + {X: Field{[10]uint32{0x027d4d27, 0x0094fb10, 0x028e41c0, 0x035873f2, 0x010db78b, 0x0108faed, 0x03183512, 0x012fe5a6, 0x02626223, 0x000d98a8}}, Y: Field{[10]uint32{0x002e1b09, 0x032aeb07, 0x0199fc41, 0x026de6d2, 0x03d550ef, 0x032b28da, 0x000f671c, 0x039a703d, 0x00420f07, 0x00222988}}}, + {X: Field{[10]uint32{0x0354e8d1, 0x00ed050f, 0x03951176, 0x03a45852, 0x00b6b4eb, 0x01281ce2, 0x00e66ee2, 0x0310ba5c, 0x002e06d9, 0x000b049f}}, Y: Field{[10]uint32{0x03dd6629, 0x01672743, 0x0193aaae, 0x008d808b, 0x00856be0, 0x012b6b8c, 0x0226c8ff, 0x02b7eabe, 0x02b8dacb, 0x00291dcf}}}, + {X: Field{[10]uint32{0x02c17802, 0x03594552, 0x02cb37f6, 0x002e33e6, 0x02b7dfcb, 0x03f8c2df, 0x014863a9, 0x00587ff6, 0x03a6116f, 0x0031083f}}, Y: Field{[10]uint32{0x010a028c, 0x02c50ef9, 0x03bc0079, 0x025cbba3, 0x017fd76d, 0x017b6a30, 0x019e9cf9, 0x023db212, 0x029c25c6, 0x0039b311}}}, + {X: Field{[10]uint32{0x02e3de0d, 0x01de11fa, 0x0169b50c, 0x029f9ff2, 0x0034d386, 0x00c85d1a, 0x002f06fd, 0x010f7563, 0x03432203, 0x001de259}}, Y: Field{[10]uint32{0x01fd9369, 0x01529348, 0x021f8570, 0x016589e4, 0x00cd9067, 0x00a7a4aa, 0x00bcd7d6, 0x037365c4, 0x019e4408, 0x0010d435}}}, + {X: Field{[10]uint32{0x009f5827, 0x009c4e4d, 0x03c83dc1, 0x023c644c, 0x03714768, 0x00dbfc3d, 0x0334f9b6, 0x0372d00c, 0x002c1a14, 0x0033dfa9}}, Y: Field{[10]uint32{0x019e6d9d, 0x02547776, 0x00a29f8e, 0x02259918, 0x020ad1a6, 0x025792a9, 0x01c28468, 0x03e7744e, 0x0080166b, 0x002e700b}}}, + {X: Field{[10]uint32{0x0273a91f, 0x0057e969, 0x036309d8, 0x0211fdd4, 0x02417b1c, 0x00f27e5b, 0x028ab1b3, 0x02af76b6, 0x0039ab1f, 0x00345e4d}}, Y: Field{[10]uint32{0x02d3b3e0, 0x003473f3, 0x0105f9bc, 0x03496903, 0x03b429ad, 0x02699f43, 0x019f6f7f, 0x0106c8ec, 0x02593b59, 0x002b04f5}}}, + {X: Field{[10]uint32{0x0292b420, 0x0193c0a7, 0x0026be98, 0x01dd29d0, 0x02547225, 0x004cf727, 0x02f58630, 0x0379c314, 0x00d6727d, 0x002ec55a}}, Y: Field{[10]uint32{0x02af3992, 0x01c32548, 0x02fe70b1, 0x00af856a, 0x009e137d, 0x03bb8a70, 0x02adf80c, 0x01d31b31, 0x0356268d, 0x002d5951}}}, + {X: Field{[10]uint32{0x03877dcc, 0x037a9eb6, 0x0020535c, 0x00b5de37, 0x03ce07c4, 0x00c6ea4f, 0x00681772, 0x02968e9d, 0x02d783e8, 0x001cca44}}, Y: Field{[10]uint32{0x03df80a2, 0x01e3239d, 0x01bab06f, 0x034ffb4f, 0x011664f5, 0x0271ea51, 0x00ffd7c2, 0x02348f9a, 0x03881b12, 0x0034d2e0}}}, + {X: Field{[10]uint32{0x0297074c, 0x011a231c, 0x00afa908, 0x03748941, 0x034927b6, 0x01a134ed, 0x03e18651, 0x00cba0b0, 0x0371fb85, 0x0031d3c3}}, Y: Field{[10]uint32{0x01006ac1, 0x027c69ef, 0x0006a53a, 0x0350440a, 0x0235984b, 0x0341031b, 0x03e5a92d, 0x005e3a2f, 0x0261c0bd, 0x0027697a}}}, + {X: Field{[10]uint32{0x023283b0, 0x032f1a27, 0x00aac91f, 0x004cf25c, 0x031785a6, 0x00c18366, 0x00e9e494, 0x01683169, 0x01398bda, 0x002f53ea}}, Y: Field{[10]uint32{0x030e433a, 0x02973680, 0x0295c5d2, 0x02efc537, 0x02e79cfd, 0x032eb035, 0x01be1cac, 0x012d2516, 0x03edb661, 0x0018c753}}}, + {X: Field{[10]uint32{0x0341cc8f, 0x01971928, 0x03a72f24, 0x01e5ee26, 0x03e9bc2d, 0x0172daf4, 0x003e0c81, 0x004f4c92, 0x0062733f, 0x0027e995}}, Y: Field{[10]uint32{0x0212db04, 0x0280b89a, 0x0313010f, 0x03f0bc53, 0x01443505, 0x01289c54, 0x00ada32c, 0x02c635d2, 0x005bafc5, 0x001c147f}}}, + {X: Field{[10]uint32{0x035e31aa, 0x0101d130, 0x03d4a6cd, 0x03f8b07a, 0x03715168, 0x036f94ef, 0x02434a9d, 0x02fc7a05, 0x037dab3d, 0x003aba9b}}, Y: Field{[10]uint32{0x0384d61d, 0x0069eae5, 0x01e6a76a, 0x02c07dc2, 0x01a594b9, 0x03d2ea41, 0x0080619f, 0x00ae5b08, 0x02c24f20, 0x002e5a58}}}, + {X: Field{[10]uint32{0x0317a2fc, 0x01eff14e, 0x007516b9, 0x022925fe, 0x039a117c, 0x02e38954, 0x03e6d5b7, 0x01d413cc, 0x02b63b94, 0x002cf7de}}, Y: Field{[10]uint32{0x01758b9b, 0x006ef127, 0x025b5ec5, 0x03aa454a, 0x01f11f00, 0x0069d677, 0x03a62650, 0x039b3b5b, 0x0100a35a, 0x001cb7dd}}}, + {X: Field{[10]uint32{0x03281bbf, 0x0346b1b0, 0x017fa3a8, 0x0025c990, 0x034341df, 0x01438a53, 0x0219be99, 0x0122b915, 0x02cc46da, 0x003be1d7}}, Y: Field{[10]uint32{0x031c72f5, 0x010aecdf, 0x01bc28a6, 0x030ae7a3, 0x0351ced2, 0x00c1b261, 0x010eb6e8, 0x0016db5b, 0x0204af4c, 0x001eae78}}}, + {X: Field{[10]uint32{0x00024fdc, 0x01bcdb1c, 0x014e7fc2, 0x015d32fc, 0x033d7487, 0x03f29422, 0x002f234a, 0x0228e942, 0x0046576a, 0x001d30f1}}, Y: Field{[10]uint32{0x00136506, 0x03fa3877, 0x02ae88c4, 0x02725293, 0x03b6ccac, 0x027628c1, 0x01d2afbf, 0x01bea1cb, 0x01164ddb, 0x001cf55e}}}, + {X: Field{[10]uint32{0x00f39274, 0x00e11b43, 0x00e1acf3, 0x02096999, 0x00c06b71, 0x00ee8bc6, 0x00204933, 0x00b8f9b0, 0x032c409f, 0x00256712}}, Y: Field{[10]uint32{0x009aad47, 0x010bda0b, 0x015d945f, 0x027c68e6, 0x01d31991, 0x03716fb7, 0x03cd3980, 0x018a7edc, 0x035c7401, 0x0005f2ac}}}, + {X: Field{[10]uint32{0x009175fb, 0x01e6a6db, 0x00d69a94, 0x02f24bed, 0x03f67c24, 0x01ff7ead, 0x013b53c6, 0x014c4c65, 0x01d69419, 0x001013c3}}, Y: Field{[10]uint32{0x024d87b3, 0x0245ef7c, 0x01570147, 0x01e61bbf, 0x037e7d3e, 0x0350ac0d, 0x01560851, 0x01234eac, 0x01e7f40a, 0x00215f1d}}}, + {X: Field{[10]uint32{0x00e82075, 0x031248db, 0x03566807, 0x03bc05c2, 0x032db4ec, 0x0021504d, 0x01f4d5ab, 0x003d694f, 0x0111233b, 0x000f8101}}, Y: Field{[10]uint32{0x000df3d3, 0x000e09d8, 0x00e02b96, 0x03806de4, 0x021fda08, 0x019d4ec8, 0x0235ebf5, 0x00e10dde, 0x0271dd44, 0x003e4cdc}}}, + {X: Field{[10]uint32{0x00d77e6e, 0x01337c8b, 0x03bd3e04, 0x00ae5211, 0x00ecc869, 0x01ef6b01, 0x03993e74, 0x0370f87d, 0x005310df, 0x00250baa}}, Y: Field{[10]uint32{0x02a155e5, 0x039892e7, 0x00e51e02, 0x03e950a3, 0x01f33e9a, 0x023106c7, 0x0110bbe5, 0x02dba6d1, 0x03c8e688, 0x002efcbd}}}, + {X: Field{[10]uint32{0x0103b532, 0x01b3a873, 0x02c0a3fe, 0x0247842c, 0x01dce217, 0x03406028, 0x01938097, 0x0297ee15, 0x02749883, 0x000795de}}, Y: Field{[10]uint32{0x0041c003, 0x005fb0eb, 0x01790194, 0x004b5773, 0x007b5756, 0x009e3a1e, 0x02530007, 0x0178576e, 0x022f856f, 0x002851d9}}}, + {X: Field{[10]uint32{0x03feaa5a, 0x01cb13db, 0x014c8ae4, 0x03f9f156, 0x037a05fb, 0x001ff928, 0x02e9dfa6, 0x01ed9084, 0x015a8a23, 0x003af276}}, Y: Field{[10]uint32{0x03f1162a, 0x011e55f9, 0x03c05b17, 0x0361ad2b, 0x038fec2f, 0x03e2d234, 0x015fb458, 0x0291f33c, 0x01c0e311, 0x000e501b}}}, + {X: Field{[10]uint32{0x03cac063, 0x00febc18, 0x00475277, 0x00dc7ecb, 0x01b90816, 0x02125862, 0x023d2280, 0x03f08084, 0x03601afd, 0x0031e3ab}}, Y: Field{[10]uint32{0x02b42de7, 0x020ecfcf, 0x029c76df, 0x033db07f, 0x01bacb42, 0x01b4e5be, 0x02e84c51, 0x00b7177d, 0x01b1e0c2, 0x000254c9}}}, + {X: Field{[10]uint32{0x036d34a0, 0x01a173f7, 0x01db8752, 0x01a80d5c, 0x004f2e53, 0x005f09e6, 0x00a3d0e1, 0x00134ad1, 0x0319a1d5, 0x002d6461}}, Y: Field{[10]uint32{0x00184abe, 0x013a6986, 0x02a356d5, 0x02c9798b, 0x0016beac, 0x03226414, 0x029828aa, 0x02df23e8, 0x00cb585c, 0x0026c07a}}}, + {X: Field{[10]uint32{0x020042cd, 0x0325e3a3, 0x01584bda, 0x0115297a, 0x02454f10, 0x031bdd6d, 0x0107dfdc, 0x0327464a, 0x033eb59f, 0x0021c1a9}}, Y: Field{[10]uint32{0x03dc3a49, 0x024a1b56, 0x001ce710, 0x037478d3, 0x004265e2, 0x02daa1fa, 0x028405a2, 0x01e35bd4, 0x03566f1f, 0x0022c6d7}}}, + {X: Field{[10]uint32{0x0312d6ca, 0x0154a741, 0x0230ae64, 0x0108e888, 0x00793e56, 0x01b8ab41, 0x00a92890, 0x012fedbd, 0x016e4ddb, 0x0024fa49}}, Y: Field{[10]uint32{0x02afdcea, 0x01aa3b5b, 0x01cd6975, 0x011e429d, 0x03d874f2, 0x0038e626, 0x000ea62f, 0x037fb0d9, 0x02dbd9b3, 0x0020ec90}}}, + {X: Field{[10]uint32{0x022ac295, 0x031bfe7a, 0x0127fe9a, 0x02fd62ad, 0x03a24fff, 0x00755806, 0x0353956a, 0x03ce6f2c, 0x01af8702, 0x000b6b52}}, Y: Field{[10]uint32{0x03e4675b, 0x00e98949, 0x002fe277, 0x00450370, 0x00ed4036, 0x032b3a30, 0x000704e2, 0x001d8957, 0x00b8e604, 0x002d6bda}}}, + {X: Field{[10]uint32{0x036950a0, 0x00431513, 0x014f7597, 0x0193d0ec, 0x0086a2c3, 0x03af8ccb, 0x01627195, 0x00be9152, 0x00994da4, 0x0017ff06}}, Y: Field{[10]uint32{0x02c9bb88, 0x00c6b570, 0x0363f043, 0x00be6ea7, 0x014542ad, 0x036c14f3, 0x00e61419, 0x017ea888, 0x00a87981, 0x0008bab0}}}, + {X: Field{[10]uint32{0x001c51ba, 0x02982ff5, 0x02b6e69f, 0x02739b98, 0x00324c63, 0x00aed6b4, 0x0221bb8a, 0x029e6713, 0x01bb1832, 0x001c6f82}}, Y: Field{[10]uint32{0x00dda472, 0x03c8e355, 0x01656e4f, 0x03730578, 0x01950588, 0x0153ac92, 0x0040767b, 0x016e3ca3, 0x03c5719a, 0x0031489f}}}, + {X: Field{[10]uint32{0x02587212, 0x0303b59a, 0x002770ba, 0x0359115a, 0x0056d661, 0x037caeb1, 0x00a3cb37, 0x0267c299, 0x0305f927, 0x00013e50}}, Y: Field{[10]uint32{0x03c054ab, 0x007f04c4, 0x03344051, 0x01b5b403, 0x026baf79, 0x0363475f, 0x00ddc7ca, 0x020f5ae5, 0x011fbd86, 0x0013121a}}}, + {X: Field{[10]uint32{0x00f0ab81, 0x021ace98, 0x033bc54b, 0x02338b1a, 0x02b3aeb3, 0x017d8614, 0x024fc096, 0x0248fb98, 0x028b6fc2, 0x00157be1}}, Y: Field{[10]uint32{0x0222efab, 0x039b9e45, 0x01a0e72c, 0x037c8b70, 0x0376cff6, 0x0198147e, 0x014d0adc, 0x02d3314d, 0x02eaab16, 0x003b0662}}}, + {X: Field{[10]uint32{0x00fdab68, 0x0330d55d, 0x022790cb, 0x02f08d90, 0x00a357f6, 0x01028e56, 0x020953ed, 0x0276fc39, 0x019046e1, 0x0009ab55}}, Y: Field{[10]uint32{0x02795508, 0x03ecfc3e, 0x025e2184, 0x039d36f0, 0x00e5bb77, 0x002f1a25, 0x03c6a746, 0x00870154, 0x01ef9067, 0x002bdbf1}}}, + {X: Field{[10]uint32{0x0037312a, 0x03307c3b, 0x0150384f, 0x01a63ba3, 0x02bc051a, 0x00e406fc, 0x000b0ae4, 0x01c554e7, 0x003ab1b0, 0x001ce7ed}}, Y: Field{[10]uint32{0x006b7e28, 0x00f9d8db, 0x019e7a19, 0x02e1302d, 0x01ff90d6, 0x0379aad3, 0x00abe331, 0x008898b5, 0x03043c88, 0x0030488d}}}, + {X: Field{[10]uint32{0x0216771d, 0x026eb519, 0x02c6cc29, 0x0196a74c, 0x03d5a109, 0x00ba4497, 0x03422f82, 0x03d76a9e, 0x009d508c, 0x00085119}}, Y: Field{[10]uint32{0x001ca76e, 0x03348a74, 0x03a1a74a, 0x032b6776, 0x0376ddea, 0x01419f3a, 0x03ef96b3, 0x031117c0, 0x038c0e33, 0x000454c5}}}, + {X: Field{[10]uint32{0x03b97072, 0x036438ee, 0x03580ec8, 0x038d55b4, 0x014d5577, 0x014209e3, 0x02a85175, 0x023a3c5b, 0x023c16ee, 0x0018b311}}, Y: Field{[10]uint32{0x026a891e, 0x0218ffa2, 0x033fcb81, 0x03e8be6a, 0x0356b48e, 0x0244ce56, 0x02a6c91c, 0x03140211, 0x0043e299, 0x00334a52}}}, + {X: Field{[10]uint32{0x03ef9c21, 0x03ab0cd4, 0x031c9707, 0x0376e77f, 0x004317e1, 0x0103dd33, 0x00fdb006, 0x03c64345, 0x030133ed, 0x00004658}}, Y: Field{[10]uint32{0x0020494c, 0x00db4855, 0x020c8031, 0x0065841a, 0x00caa4f5, 0x03681c0d, 0x03851876, 0x03b9b5d0, 0x00e5e3a3, 0x003c5aad}}}, + {X: Field{[10]uint32{0x0289adcd, 0x0298c648, 0x03c162b4, 0x00d0099c, 0x03777d4e, 0x025554a1, 0x0315baed, 0x03e4fca3, 0x03863fda, 0x002c942f}}, Y: Field{[10]uint32{0x01b3d2c1, 0x0356b04e, 0x016f828a, 0x03bce7eb, 0x01da1e06, 0x02d0357e, 0x013543f6, 0x00f4a21f, 0x01bede34, 0x000a5701}}}, + {X: Field{[10]uint32{0x003e7c6c, 0x03d1bd92, 0x03e696f4, 0x002053a1, 0x01027ef0, 0x00b0666c, 0x010945a7, 0x011ce67c, 0x03bcae58, 0x0024e902}}, Y: Field{[10]uint32{0x02858a09, 0x03a32f2a, 0x0217389f, 0x03802bd9, 0x03f088e2, 0x0249a192, 0x03289a45, 0x0259d3d7, 0x00c02980, 0x00207b5c}}}, + {X: Field{[10]uint32{0x020978cc, 0x0230303d, 0x01f90eff, 0x03753eaa, 0x0019ff7d, 0x03a60978, 0x03e76b34, 0x0275d6c5, 0x021b4e90, 0x002e799d}}, Y: Field{[10]uint32{0x035aa117, 0x01e4241e, 0x0211b762, 0x00ef2634, 0x0165c75e, 0x03cb215d, 0x001b70fb, 0x0049c222, 0x01035fb9, 0x00190305}}}, + {X: Field{[10]uint32{0x00cfec24, 0x010d8344, 0x039beebf, 0x0146c08a, 0x00ae4547, 0x016cb702, 0x03e260cf, 0x026e91a1, 0x0012fe3d, 0x0013708a}}, Y: Field{[10]uint32{0x039a90d1, 0x00b7d7df, 0x01c4305b, 0x00b90c0c, 0x0227f082, 0x0135a015, 0x02e986da, 0x0204d554, 0x034a5685, 0x00270d7b}}}, + {X: Field{[10]uint32{0x009deadf, 0x020a1b13, 0x03540934, 0x00948d98, 0x03e198e2, 0x020f4b4e, 0x02b94ba6, 0x03e70901, 0x02b31127, 0x0010c49d}}, Y: Field{[10]uint32{0x001efb3e, 0x00e312b8, 0x03743139, 0x03237756, 0x02c26d39, 0x037232fb, 0x006280dd, 0x037e192d, 0x0184c7f1, 0x0008997b}}}, + {X: Field{[10]uint32{0x0283632a, 0x0042b2cd, 0x00360aa8, 0x00dae1e2, 0x03328f17, 0x033eaa45, 0x00b81d76, 0x0163d0ad, 0x02c3c990, 0x001d716d}}, Y: Field{[10]uint32{0x028f719d, 0x036d7142, 0x00464aff, 0x006ea03c, 0x014a5aaa, 0x026a243c, 0x02309ef4, 0x01edfdc2, 0x009fdef1, 0x001527c0}}}, + {X: Field{[10]uint32{0x02a827d7, 0x03be6773, 0x0357c815, 0x03a44ba9, 0x0326d4d4, 0x02920077, 0x02b1a377, 0x03dd0a5d, 0x0027205a, 0x000f2400}}, Y: Field{[10]uint32{0x00649cc0, 0x015e2c42, 0x0184c83c, 0x01183f9c, 0x02007a24, 0x00ce76ac, 0x007fa7c0, 0x029f788e, 0x03f337ec, 0x00038a33}}}, + {X: Field{[10]uint32{0x0310d9ff, 0x01ebaacc, 0x0297f3a8, 0x02f4ea3a, 0x00c89637, 0x01708fcc, 0x03a8ab0d, 0x02e57c27, 0x031a3676, 0x0015983c}}, Y: Field{[10]uint32{0x011c568b, 0x035e1b2c, 0x03839efb, 0x01b0ae8f, 0x03955bb7, 0x01366bfc, 0x0092ff3e, 0x032829f6, 0x00d66bc4, 0x003581a7}}}, + {X: Field{[10]uint32{0x033babe9, 0x01e1bfd7, 0x02f618cd, 0x0351e6bd, 0x00e6733c, 0x02dc75de, 0x03979ce5, 0x037219fd, 0x00a41b45, 0x000ae2da}}, Y: Field{[10]uint32{0x01e4097a, 0x0314b163, 0x021ab40a, 0x0311b050, 0x03840f89, 0x02b66824, 0x00923f63, 0x006ccf08, 0x0244d544, 0x001f20c4}}}, + {X: Field{[10]uint32{0x01c18610, 0x00a73aa2, 0x01290442, 0x012cc0fa, 0x001d369d, 0x01acff28, 0x03578869, 0x02f3712c, 0x004db817, 0x00218d40}}, Y: Field{[10]uint32{0x02b909e2, 0x03b0ca5b, 0x0300c4c3, 0x00487f12, 0x007e9f35, 0x00563687, 0x0384cc05, 0x01b9af8b, 0x02402bd4, 0x00091cb6}}}, + {X: Field{[10]uint32{0x00cb28d0, 0x01a88d22, 0x03b693a5, 0x000f7193, 0x01b0d39d, 0x01b87b33, 0x03afbde4, 0x013e5e6d, 0x026b6eeb, 0x001b2646}}, Y: Field{[10]uint32{0x01c95620, 0x00467bd9, 0x013722bc, 0x00f93350, 0x030e0b75, 0x00fad11c, 0x0277188d, 0x018d4140, 0x034fc2cd, 0x0007977d}}}, + {X: Field{[10]uint32{0x0341570c, 0x02865fa7, 0x03a0ca52, 0x029258bf, 0x00554569, 0x0248a22e, 0x0298ed7e, 0x033246e5, 0x019d4283, 0x002b36b0}}, Y: Field{[10]uint32{0x02d7b66e, 0x00e94831, 0x01afeea0, 0x029be5f6, 0x02451d41, 0x01c5d0ae, 0x030c6bfe, 0x021507d4, 0x0187523c, 0x003e94db}}}, + {X: Field{[10]uint32{0x025fc6c0, 0x00a96591, 0x00abba3e, 0x03c2bad4, 0x0385bba7, 0x034a29f2, 0x00b107c3, 0x032ee552, 0x03a3f696, 0x002c525a}}, Y: Field{[10]uint32{0x006318ad, 0x00bbcf72, 0x0057a857, 0x02effd73, 0x03487740, 0x03a01e09, 0x03c8f8ea, 0x0129bb83, 0x00d5727a, 0x001dfedb}}}, + {X: Field{[10]uint32{0x01b09126, 0x01500d36, 0x03ec94d8, 0x01e2b6c1, 0x02c2c9f8, 0x01b44a39, 0x00cab31d, 0x03a7283f, 0x01b56098, 0x000ff65f}}, Y: Field{[10]uint32{0x022b4578, 0x01007cc8, 0x014a22c0, 0x012c09f8, 0x0324e37d, 0x022c91bd, 0x00451273, 0x038dd03f, 0x00361494, 0x0006f5df}}}, + {X: Field{[10]uint32{0x02aefce9, 0x00ab8bb0, 0x03338898, 0x03feb5e4, 0x02eb174c, 0x00271f3e, 0x036d5c44, 0x01a3b551, 0x0055f2a4, 0x0017a37e}}, Y: Field{[10]uint32{0x02a6845f, 0x02e32c4d, 0x0357a17e, 0x03b311bc, 0x01d50da8, 0x021c0610, 0x01771843, 0x032a2282, 0x02823bb8, 0x0014b9ce}}}, + {X: Field{[10]uint32{0x024672bd, 0x005021b1, 0x006613f8, 0x0076e503, 0x0062021a, 0x003ee4cb, 0x01e6fb0a, 0x032da7a5, 0x02eb1417, 0x00267c41}}, Y: Field{[10]uint32{0x03a6501d, 0x02097ffd, 0x015337e9, 0x010f4613, 0x01e484d8, 0x00709ff9, 0x02926e6a, 0x0000441a, 0x0038e1e7, 0x00279fec}}}, + {X: Field{[10]uint32{0x0251ef8c, 0x00c18e9f, 0x031f7ac4, 0x03f52971, 0x0068bb14, 0x03fc3882, 0x011d6864, 0x0361fff4, 0x00985526, 0x001a1bf1}}, Y: Field{[10]uint32{0x00588e5b, 0x01824651, 0x0224422f, 0x017d6cf5, 0x024137dc, 0x0383c8ff, 0x016dd6b2, 0x02be16f2, 0x0132d793, 0x00074a3d}}}, + {X: Field{[10]uint32{0x03f6b83d, 0x03e5af2f, 0x03b2093d, 0x0001582f, 0x00e4c836, 0x00dc3e19, 0x00f3a85b, 0x002f2a45, 0x0356cc45, 0x0033e977}}, Y: Field{[10]uint32{0x0137604b, 0x0017cee3, 0x0203f78b, 0x03c09938, 0x0261cf56, 0x023e05c1, 0x01d96c74, 0x03ff246c, 0x0246bab7, 0x0033bee6}}}, + {X: Field{[10]uint32{0x013e404e, 0x0022791c, 0x003e8b39, 0x01aa58aa, 0x02893760, 0x00d39f2f, 0x0241eed5, 0x025a4fdd, 0x034c3fbb, 0x002646da}}, Y: Field{[10]uint32{0x023f8d3e, 0x02d83baf, 0x03c7113b, 0x01e75611, 0x02098dab, 0x012e4ae2, 0x038a0a2f, 0x019a234e, 0x026bbe55, 0x000fffae}}}, + {X: Field{[10]uint32{0x03c8c0d7, 0x006ee484, 0x00bcd689, 0x038d5a4e, 0x032955c4, 0x0089b144, 0x021fa14f, 0x00487162, 0x01d3b9b0, 0x00344131}}, Y: Field{[10]uint32{0x00caa6e9, 0x003415ac, 0x0196a3d9, 0x00028244, 0x00091ddb, 0x0171ddce, 0x02cea218, 0x01f3f40c, 0x019a814d, 0x0002320e}}}, + {X: Field{[10]uint32{0x0355dfce, 0x00c652f8, 0x031bcad9, 0x03df1d2c, 0x03415a06, 0x0065093a, 0x01c9a407, 0x00d921d2, 0x0053a45c, 0x001d864a}}, Y: Field{[10]uint32{0x024ad2fc, 0x03cdd14c, 0x01ecf84e, 0x00de451d, 0x02b5517b, 0x00984f18, 0x02bc9345, 0x01404b5f, 0x02873cbb, 0x000c44e4}}}, + {X: Field{[10]uint32{0x01070725, 0x027ec6b9, 0x016c8805, 0x02e6069f, 0x0210c7f9, 0x014424ec, 0x01b1de5c, 0x0307d301, 0x00a80509, 0x0005ccc1}}, Y: Field{[10]uint32{0x001d353e, 0x0087e24d, 0x013d5f9e, 0x022ce630, 0x02800cdc, 0x01a48a5e, 0x03db2e9c, 0x020e5150, 0x0198c8e0, 0x0010efef}}}, + {X: Field{[10]uint32{0x03da104a, 0x02b94542, 0x014c46b7, 0x02a02c53, 0x019eacca, 0x0391bf25, 0x03f5b6a9, 0x01545041, 0x03e1d28c, 0x002b2815}}, Y: Field{[10]uint32{0x02bf6ce8, 0x02e90cf9, 0x017024dc, 0x03348fdb, 0x00cb00e6, 0x012dcae3, 0x0095be9a, 0x01dbfc60, 0x031770bd, 0x00385fc5}}}, + {X: Field{[10]uint32{0x0076dbaa, 0x0212274d, 0x02b04b7e, 0x017d839b, 0x0385b294, 0x00029f70, 0x00a73859, 0x023ec70c, 0x0150e009, 0x003ec809}}, Y: Field{[10]uint32{0x039a0f28, 0x013d597b, 0x0099645e, 0x008b7f0f, 0x03cedda9, 0x01fd1cf3, 0x03bc98c7, 0x031a36f4, 0x00203f72, 0x0006abe1}}}, + {X: Field{[10]uint32{0x011ae7ac, 0x021e6f38, 0x0101c08f, 0x026108b1, 0x03af1aa2, 0x00a562f8, 0x0366c66c, 0x01eae396, 0x010ca022, 0x003a56dc}}, Y: Field{[10]uint32{0x0397cf19, 0x00975427, 0x030a2c55, 0x01a36728, 0x00c745a9, 0x03b7407e, 0x0109022c, 0x03d2df6a, 0x00e1ab5c, 0x0039917d}}}, + {X: Field{[10]uint32{0x0044770a, 0x019bcf7a, 0x02a15147, 0x01b339df, 0x03ab136c, 0x033b517f, 0x01cf203c, 0x02ffe581, 0x025c3589, 0x001b6d14}}, Y: Field{[10]uint32{0x02658c81, 0x035a121c, 0x00903eb5, 0x02ecf167, 0x03799cd7, 0x00b01a62, 0x031d2958, 0x01612c8c, 0x0003f5f7, 0x0039adfd}}}, + {X: Field{[10]uint32{0x01085eb3, 0x01cc4ccd, 0x022c8fbe, 0x0229a592, 0x01169043, 0x0136e711, 0x03c2959e, 0x03ab9c57, 0x029e49da, 0x002224ea}}, Y: Field{[10]uint32{0x01987cdd, 0x031c2539, 0x00c10d01, 0x0316ebb2, 0x01bd15ce, 0x0197d8b2, 0x037a4b02, 0x00fced8d, 0x003eae80, 0x001c3ef6}}}, + {X: Field{[10]uint32{0x020207a0, 0x02505363, 0x01fd56e3, 0x03123ceb, 0x012cd9e2, 0x02a9e2f2, 0x01e3ece8, 0x02336a1c, 0x02cfac6e, 0x002f95fd}}, Y: Field{[10]uint32{0x0293d5f2, 0x0083cafb, 0x03aa1581, 0x0374daec, 0x028893ee, 0x0266a9ee, 0x00d141d8, 0x03e273f7, 0x007299ab, 0x001e05c2}}}, + {X: Field{[10]uint32{0x00b34925, 0x0232d508, 0x03562671, 0x03d16a79, 0x00a2f69b, 0x0340ad75, 0x0205ddd8, 0x0044a717, 0x02d285a0, 0x0001dfe9}}, Y: Field{[10]uint32{0x026455cc, 0x0136d14c, 0x03b97ce0, 0x02643805, 0x0337a2da, 0x0303b7fa, 0x0086288e, 0x0348633a, 0x023c13a3, 0x000c56ec}}}, + {X: Field{[10]uint32{0x01f4dc03, 0x02826e34, 0x01d00b2e, 0x02b65e37, 0x02061094, 0x019ffec3, 0x00834ca7, 0x0370cd8b, 0x03fe8414, 0x000bfb5e}}, Y: Field{[10]uint32{0x00117e01, 0x0378b166, 0x00ff20a6, 0x0182db13, 0x0363332a, 0x00047186, 0x01e434f0, 0x00f4c559, 0x00f7aa0b, 0x0005397a}}}, + {X: Field{[10]uint32{0x034d66c6, 0x03ab2242, 0x026a101a, 0x010b3a3b, 0x037f8af2, 0x03c0fb8f, 0x0343df2b, 0x006e87f2, 0x00d05a87, 0x0027d30b}}, Y: Field{[10]uint32{0x02922920, 0x0316502f, 0x01acf83b, 0x03d7f0d0, 0x03d0fd7d, 0x030e1388, 0x038a2abd, 0x01e21e3f, 0x0352f242, 0x003ad087}}}, + {X: Field{[10]uint32{0x01bea647, 0x03e9f297, 0x013ce7c8, 0x022eef07, 0x0015f0a4, 0x00dce0fc, 0x0203ef6e, 0x001332dc, 0x00b6824a, 0x0014f038}}, Y: Field{[10]uint32{0x01618cf9, 0x03f4e853, 0x00e91836, 0x0178416a, 0x0313c59d, 0x03a024e5, 0x01729f9b, 0x0328694e, 0x018d9246, 0x001aa6d6}}}, + {X: Field{[10]uint32{0x0117d714, 0x00eb62ab, 0x02fd5c0a, 0x02fded3b, 0x03bb20fd, 0x00cf5a3a, 0x037bba54, 0x01ae12da, 0x0082d790, 0x0036f033}}, Y: Field{[10]uint32{0x01cd7211, 0x031d9d8b, 0x02e37a4f, 0x038a14c1, 0x008aee42, 0x039798ce, 0x001b0904, 0x00b0e9be, 0x038623ff, 0x0017af07}}}, + {X: Field{[10]uint32{0x008f5f0b, 0x002a9b49, 0x02165af2, 0x01e10314, 0x02ca93a4, 0x004c7557, 0x01a8cbb8, 0x023811ec, 0x0332a3c0, 0x001e18ab}}, Y: Field{[10]uint32{0x03fc15d8, 0x03f70ce2, 0x02684f1e, 0x00ba36a4, 0x017e8c27, 0x021ecefe, 0x0367a645, 0x00d4f228, 0x02076b10, 0x002ed7d9}}}, + {X: Field{[10]uint32{0x031049ee, 0x013032a4, 0x037524e4, 0x0326e1d4, 0x01f8238f, 0x005724ec, 0x012bad80, 0x0162ddbb, 0x01fc8001, 0x00034d5c}}, Y: Field{[10]uint32{0x02a44bc3, 0x01af1d20, 0x0315f4d2, 0x03e549af, 0x0170a9e6, 0x0056bd12, 0x00872fa9, 0x00c2aa74, 0x01e83e66, 0x00058b72}}}, + {X: Field{[10]uint32{0x00589d9b, 0x022c2de2, 0x02a26e90, 0x036a23eb, 0x03b9f531, 0x037cd613, 0x02b98e55, 0x031d6190, 0x0094cebb, 0x002a1472}}, Y: Field{[10]uint32{0x0375b422, 0x009638ec, 0x020e1151, 0x03e6d7eb, 0x011e1af1, 0x02b90ceb, 0x01f38983, 0x0307bdc7, 0x015cadfa, 0x001d1c0b}}}, + {X: Field{[10]uint32{0x0258012d, 0x0005b3b6, 0x0131e972, 0x03e407c2, 0x012d9af1, 0x036cba21, 0x0178a08c, 0x03feab82, 0x03f4012e, 0x002a4b90}}, Y: Field{[10]uint32{0x002fb668, 0x000ee574, 0x013c6bb9, 0x01ec8ef0, 0x02535c68, 0x02094825, 0x01d7bd12, 0x005c3acd, 0x009d5560, 0x00363d68}}}, + {X: Field{[10]uint32{0x03cff6bb, 0x001fed7c, 0x0024c090, 0x00a74a0f, 0x02bb29e1, 0x01d83b36, 0x02658c64, 0x01a7210b, 0x02448b43, 0x001d72bf}}, Y: Field{[10]uint32{0x0355dc39, 0x011dec42, 0x015f53c9, 0x028bee88, 0x02db1ea5, 0x00751ce2, 0x02affab5, 0x00d54c78, 0x02e243c7, 0x00328384}}}, + {X: Field{[10]uint32{0x0041d006, 0x012114e3, 0x02b56a21, 0x01ddedb9, 0x02c48c41, 0x02008ed6, 0x017a2337, 0x0167b0bc, 0x00664db9, 0x00002ac0}}, Y: Field{[10]uint32{0x035d8b31, 0x00dc5d67, 0x029b7b5d, 0x01f7adcb, 0x01e3d338, 0x0101d62b, 0x02762fb9, 0x0145a7d1, 0x02fc3554, 0x00233e78}}}, + {X: Field{[10]uint32{0x01b7ecb7, 0x02fa9427, 0x027814a1, 0x03f55cfc, 0x00f89b9a, 0x011a747c, 0x00855bf0, 0x0084d060, 0x02f82e4b, 0x0009d443}}, Y: Field{[10]uint32{0x00fb87e1, 0x01570d2b, 0x00aeb900, 0x00337b1a, 0x03b0a1b2, 0x02fa67f4, 0x02073555, 0x0130187f, 0x00e886b5, 0x00083f80}}}, + {X: Field{[10]uint32{0x01b16d3a, 0x00b23293, 0x02c1d745, 0x03b8ed66, 0x03f4a6c2, 0x02727081, 0x021405c9, 0x009dede4, 0x01a8d388, 0x001dcffd}}, Y: Field{[10]uint32{0x00a52f8e, 0x010d6fbe, 0x002848d7, 0x02bcf9cd, 0x0200f75c, 0x01cc638e, 0x00806bd8, 0x03196ebf, 0x0231f51c, 0x0033d179}}}, + {X: Field{[10]uint32{0x02f45746, 0x03311547, 0x0386fe14, 0x00dcb890, 0x034293fc, 0x03686a3b, 0x0277e359, 0x02ff0edc, 0x0098e69e, 0x000be3cb}}, Y: Field{[10]uint32{0x0168ec06, 0x032b5026, 0x02c3642c, 0x0323fba8, 0x008150a6, 0x0012aaba, 0x003e4066, 0x02ae808f, 0x03ecc4dc, 0x003e1748}}}, + {X: Field{[10]uint32{0x0277f67f, 0x020f7a58, 0x001c061a, 0x01e19369, 0x01745756, 0x018d5b39, 0x00849522, 0x03438a82, 0x00daab8d, 0x00061e2b}}, Y: Field{[10]uint32{0x01477020, 0x011596b5, 0x009bb968, 0x00a039b4, 0x03ecbcc1, 0x03e922bc, 0x0296f05b, 0x0024b2b7, 0x028d064e, 0x00104b21}}}, + {X: Field{[10]uint32{0x035618c1, 0x02312f13, 0x029c4cad, 0x003d273d, 0x02c5a17b, 0x004dcfd8, 0x004f3cdd, 0x039389fb, 0x001aeac4, 0x000233ca}}, Y: Field{[10]uint32{0x01ed5973, 0x03f61bca, 0x02625cd9, 0x036d93fe, 0x027dbf09, 0x038cc0a6, 0x023911ed, 0x03a89f36, 0x019529c9, 0x000bc5fe}}}, + {X: Field{[10]uint32{0x008939f9, 0x0081a634, 0x01ec39ea, 0x00d9c5fc, 0x02a09579, 0x0370abbf, 0x010d1913, 0x00da7976, 0x009ff165, 0x000e965f}}, Y: Field{[10]uint32{0x000a14d4, 0x018ad3ac, 0x01926da4, 0x021bd624, 0x03a7b48c, 0x00262381, 0x03464b00, 0x028b7816, 0x03b290c9, 0x00230880}}}, + {X: Field{[10]uint32{0x010ca15e, 0x013eb2e5, 0x028ac505, 0x0242eeb1, 0x03b9ceec, 0x014a40e4, 0x029c8615, 0x0043fd77, 0x0205096f, 0x00032f8c}}, Y: Field{[10]uint32{0x03ee27f4, 0x00ae51d3, 0x02bd0547, 0x00b2b785, 0x039bf7c7, 0x00580072, 0x02b48557, 0x02e84b0c, 0x006ab76a, 0x00111b2c}}}, + {X: Field{[10]uint32{0x02fed594, 0x036c1055, 0x00bd53a8, 0x00017b98, 0x011cde71, 0x019511cc, 0x0013b09e, 0x0139c061, 0x01cf0822, 0x0010c4f2}}, Y: Field{[10]uint32{0x03329a96, 0x0275cd46, 0x023317ab, 0x0352af12, 0x000e80bb, 0x02809482, 0x001021f9, 0x016a32c6, 0x019dd304, 0x0037ebcd}}}, + {X: Field{[10]uint32{0x0373c60e, 0x03c3eaaf, 0x036882bd, 0x02ac67ed, 0x011f5cbf, 0x03697fe9, 0x009651b2, 0x02b7b0b6, 0x0351f8d8, 0x0033ab4a}}, Y: Field{[10]uint32{0x02a25897, 0x01472915, 0x0221bf84, 0x029fb4b4, 0x026dd3bd, 0x02fc512b, 0x03e79322, 0x03c3a31c, 0x00806992, 0x002aca89}}}, + {X: Field{[10]uint32{0x027b79a0, 0x03c9eb92, 0x020e52d8, 0x02b67e2f, 0x0298e34d, 0x017b9bbb, 0x01164b84, 0x01d8bd91, 0x008d0848, 0x002739d7}}, Y: Field{[10]uint32{0x02a30a05, 0x00a76f26, 0x03571d0a, 0x0166e458, 0x029f6275, 0x02dd0a89, 0x017c04c8, 0x02a419ae, 0x014fe11b, 0x0038155b}}}, + {X: Field{[10]uint32{0x026741d7, 0x0002224c, 0x013a96ba, 0x020c0759, 0x0310214b, 0x0308e11e, 0x02106bf8, 0x038957e4, 0x009c621d, 0x00180912}}, Y: Field{[10]uint32{0x004ea858, 0x03638b84, 0x03aa9b1f, 0x0021989b, 0x02abf63e, 0x01ae0b97, 0x01326210, 0x000803b2, 0x032480a9, 0x0002543a}}}, + {X: Field{[10]uint32{0x0308e51d, 0x0348bb57, 0x01e11546, 0x028f1a11, 0x011f55e1, 0x001c957f, 0x02c2638c, 0x01af3501, 0x02f0108f, 0x0034f1d1}}, Y: Field{[10]uint32{0x038dfab6, 0x002f3390, 0x0165e25d, 0x0069bff0, 0x0335ed4e, 0x015fbcf6, 0x001a776c, 0x031ce799, 0x03e5d349, 0x00344936}}}, + {X: Field{[10]uint32{0x036514b8, 0x03c9c5c4, 0x00c6352c, 0x03e6f3e9, 0x01a69c69, 0x00216537, 0x03b9e11e, 0x03088be5, 0x035cd85d, 0x00287ad7}}, Y: Field{[10]uint32{0x00a15fff, 0x01429f3e, 0x03b68007, 0x01d8c094, 0x00ff5e3f, 0x03768ee8, 0x0247ddd7, 0x03805dd8, 0x0135a393, 0x0011bb4f}}}, + {X: Field{[10]uint32{0x005a8736, 0x03dd5852, 0x03639721, 0x015ae0b1, 0x00e44065, 0x0305051f, 0x025f1c61, 0x030b2fea, 0x0357fa3a, 0x000ac928}}, Y: Field{[10]uint32{0x03d73ade, 0x00cc3346, 0x0243c018, 0x017d742d, 0x01ad192a, 0x015c8751, 0x00fd7aed, 0x02b5546a, 0x01bd707a, 0x00359c86}}}, + {X: Field{[10]uint32{0x0187b2ec, 0x0293db3f, 0x03306126, 0x00f98ba7, 0x02ab6a62, 0x00bb2d06, 0x00c9cfb4, 0x0005658f, 0x01ab9dc6, 0x00264068}}, Y: Field{[10]uint32{0x00339317, 0x033363fc, 0x01730633, 0x0307b899, 0x03eb5950, 0x032d0539, 0x037a3df6, 0x035fcbff, 0x0194017c, 0x0023dd99}}}, + {X: Field{[10]uint32{0x0077e8da, 0x02e65961, 0x037634ae, 0x0386c870, 0x0328a2a4, 0x01f56320, 0x018e6003, 0x038bc787, 0x00455890, 0x000c47a1}}, Y: Field{[10]uint32{0x00ce030c, 0x016415bb, 0x00829a04, 0x009c7987, 0x01e017e9, 0x019c0ef0, 0x030dd00f, 0x015d8a86, 0x03676cc7, 0x0033d64f}}}, + {X: Field{[10]uint32{0x0283bb77, 0x023b31e7, 0x008b367a, 0x0391bfba, 0x03122d27, 0x023ebd9b, 0x00ad8b8c, 0x003db8a6, 0x02e39714, 0x002417dc}}, Y: Field{[10]uint32{0x01b65257, 0x01c529bc, 0x019b4698, 0x022a84b8, 0x022d9852, 0x02d6c94e, 0x00b94fc1, 0x03099764, 0x015dbde9, 0x00300fc5}}}, + {X: Field{[10]uint32{0x0339350c, 0x00fd56e8, 0x0085e04a, 0x00cc09f7, 0x0039eafd, 0x02672ed3, 0x00c2f021, 0x000004bf, 0x03a5d594, 0x001877dd}}, Y: Field{[10]uint32{0x01049161, 0x0189a8b6, 0x0005f684, 0x008235b7, 0x01f36640, 0x035b903d, 0x030603f2, 0x026cfdce, 0x037d00de, 0x0009f222}}}, + {X: Field{[10]uint32{0x01f18c28, 0x010aeb17, 0x021295bc, 0x0353bc09, 0x030de36d, 0x03bb01b1, 0x016af906, 0x012c7577, 0x0199886d, 0x00387e38}}, Y: Field{[10]uint32{0x01ca45a8, 0x03e2add4, 0x025e29ec, 0x02d53196, 0x0056a98d, 0x039f98d2, 0x025bc4ba, 0x03abc4a1, 0x02e9b956, 0x00140b04}}}, + {X: Field{[10]uint32{0x03b8565a, 0x02181dbe, 0x02ac19b6, 0x0151e692, 0x029180e1, 0x001133e5, 0x01fe6a77, 0x0288701f, 0x01b83804, 0x002b78bd}}, Y: Field{[10]uint32{0x03066aca, 0x006f09bb, 0x01eee375, 0x03d915c5, 0x0198a9e6, 0x017499f9, 0x00985d6f, 0x005a30c2, 0x021d07c8, 0x00343597}}}, + {X: Field{[10]uint32{0x03268187, 0x0208779b, 0x01b88ea5, 0x021685d5, 0x009f7f6b, 0x018a202e, 0x0345dd5c, 0x03e5cab0, 0x00bb0154, 0x00315608}}, Y: Field{[10]uint32{0x00613086, 0x00795af3, 0x027a2124, 0x016b605f, 0x014dc35f, 0x0285d223, 0x03b698c8, 0x02996498, 0x03ea1e6c, 0x002446c3}}}, + {X: Field{[10]uint32{0x007778b5, 0x000e719b, 0x01d089f7, 0x023054b7, 0x02128588, 0x023330b4, 0x0164352b, 0x0083d14e, 0x026e3210, 0x003a8825}}, Y: Field{[10]uint32{0x034fc18c, 0x00a7c9a7, 0x00d3959e, 0x01b37786, 0x0166f547, 0x010d0a70, 0x03dc9bd6, 0x007949aa, 0x0191cdc8, 0x003250bd}}}, + {X: Field{[10]uint32{0x007e2bf5, 0x03d37d18, 0x007079f9, 0x022a3a03, 0x02220c90, 0x0387be12, 0x0301bbd3, 0x03f9699c, 0x012d9c2d, 0x000f15d5}}, Y: Field{[10]uint32{0x031f39e3, 0x000802f9, 0x00522b9f, 0x0153b542, 0x016fd347, 0x00997fd9, 0x031a0a17, 0x018e5cf9, 0x00ffbc4a, 0x003527e8}}}, + {X: Field{[10]uint32{0x03d4e1c3, 0x02825466, 0x0071feb5, 0x002f3dfc, 0x01a3fd5c, 0x012b6859, 0x028e1339, 0x00fb0167, 0x00c6e104, 0x003c6233}}, Y: Field{[10]uint32{0x03bfdbe4, 0x021814c1, 0x021cf944, 0x010428bf, 0x03db045c, 0x0081d926, 0x02fb1908, 0x01e740b5, 0x031fe53e, 0x0017c7cd}}}, + {X: Field{[10]uint32{0x011c8c6a, 0x00d790b0, 0x013cad48, 0x028b4729, 0x01447112, 0x029efed2, 0x015a146a, 0x008cba01, 0x03d27e72, 0x00280517}}, Y: Field{[10]uint32{0x01e679cc, 0x00f9270f, 0x02cc5024, 0x02fc8b1f, 0x00ceb874, 0x001c272c, 0x00bb675f, 0x00333031, 0x00a0e5e7, 0x001ef006}}}, + {X: Field{[10]uint32{0x016ff48e, 0x00f7e03c, 0x016bd9c9, 0x0362c5d0, 0x01c17b7b, 0x02d56061, 0x03857060, 0x00454c7e, 0x01e80c22, 0x0014d003}}, Y: Field{[10]uint32{0x01a6cc6f, 0x034cf690, 0x0244c89c, 0x0082299a, 0x002df873, 0x00dbaa5c, 0x00840b6a, 0x0197c794, 0x02473ba5, 0x003848a3}}}, + {X: Field{[10]uint32{0x0264b1ac, 0x03199d33, 0x019048c6, 0x02d14ae6, 0x01cc8960, 0x03566be1, 0x00e34821, 0x00df8d43, 0x012d009d, 0x00208457}}, Y: Field{[10]uint32{0x021eb048, 0x03ee7bed, 0x02f05e75, 0x00f7a489, 0x01bffc1b, 0x02e74620, 0x02adab03, 0x00309012, 0x0209659a, 0x002637aa}}}, + {X: Field{[10]uint32{0x01fe7c3c, 0x005e2516, 0x039681fc, 0x01f00c20, 0x028669cb, 0x01437389, 0x01e6e9d4, 0x01bc7312, 0x001853d8, 0x0009cf63}}, Y: Field{[10]uint32{0x00c2ea00, 0x01b44040, 0x008af2e1, 0x007dfdfe, 0x0314974e, 0x007beeb6, 0x00c25a25, 0x009b205d, 0x01aa8ad0, 0x001b154c}}}, + {X: Field{[10]uint32{0x025ee319, 0x019d46ee, 0x01bfe403, 0x032d6c16, 0x0041e68c, 0x03d0a3f3, 0x0233f4fb, 0x020645c3, 0x0216a7e3, 0x0000185b}}, Y: Field{[10]uint32{0x0106748a, 0x012c393d, 0x032eaba8, 0x031cfa2b, 0x007c7dc3, 0x032a64dd, 0x01173f5c, 0x00fbf6e6, 0x0121182a, 0x001f6f2b}}}, + {X: Field{[10]uint32{0x00b82812, 0x00df0058, 0x0277452c, 0x00409d7d, 0x00dc5666, 0x000cfc84, 0x0373402d, 0x0260487d, 0x016a76a3, 0x0019d862}}, Y: Field{[10]uint32{0x03302c9b, 0x001e0b99, 0x007ebe76, 0x03c688d8, 0x0111848d, 0x038b2339, 0x011184c8, 0x024e7e02, 0x01cf1b40, 0x001ff740}}}, + {X: Field{[10]uint32{0x01e508b9, 0x029b53e2, 0x01fe6dd4, 0x008248d1, 0x00bd6eb0, 0x005dedac, 0x0135bd9e, 0x00176849, 0x03aae976, 0x001dfdea}}, Y: Field{[10]uint32{0x007f0b9e, 0x0392d973, 0x01231889, 0x03e84358, 0x020dbf20, 0x02df24cc, 0x035fd19b, 0x020c37f3, 0x016ccc7b, 0x003ec126}}}, + {X: Field{[10]uint32{0x00bce311, 0x0232a8e6, 0x005a4a0d, 0x02299ec3, 0x01bc4b4a, 0x0007e73c, 0x02973785, 0x00aee8f6, 0x03173a2e, 0x00304bd9}}, Y: Field{[10]uint32{0x039a47a8, 0x000c67dd, 0x03853a33, 0x00cdb960, 0x01097cd1, 0x02db2d50, 0x00012aa3, 0x00500544, 0x018644d3, 0x0037a4c2}}}, + {X: Field{[10]uint32{0x018e66aa, 0x01fbe570, 0x03304ee7, 0x03ea9dae, 0x004afe8f, 0x037ce80d, 0x039d268d, 0x0154b236, 0x02de19c7, 0x001954e8}}, Y: Field{[10]uint32{0x00edb93c, 0x01dc181c, 0x037f5373, 0x033b26ee, 0x0169f95b, 0x014b4dd3, 0x034dbb77, 0x002edcab, 0x00107c18, 0x002469c8}}}, + {X: Field{[10]uint32{0x03b834e3, 0x031411ad, 0x013eec1f, 0x008f9a8f, 0x01bba980, 0x010032aa, 0x022e9363, 0x0106148b, 0x00be353f, 0x0003d52d}}, Y: Field{[10]uint32{0x0296f17e, 0x0190df23, 0x013a5124, 0x02d015df, 0x03ab6f78, 0x0065d16a, 0x035afde2, 0x03c7c2a0, 0x006cbdd5, 0x0025af9e}}}, + {X: Field{[10]uint32{0x02adbb2a, 0x016d2d03, 0x03c64c0d, 0x01f12d9d, 0x03f86be3, 0x016d3722, 0x03c806e4, 0x0194882e, 0x03c2a0fa, 0x0030b4c5}}, Y: Field{[10]uint32{0x0313ab6a, 0x03acd7b4, 0x02af58e8, 0x023528eb, 0x03100f07, 0x03266529, 0x00cb16df, 0x032aedc6, 0x0169bd68, 0x00315c42}}}, + {X: Field{[10]uint32{0x0389f384, 0x03fcc4c6, 0x03ccefe1, 0x010d04db, 0x02cc43e1, 0x01fd751c, 0x034b9c95, 0x02993f71, 0x03c6a5b8, 0x0014a959}}, Y: Field{[10]uint32{0x009e8f53, 0x01bde8a7, 0x01d485c1, 0x03a5f60d, 0x02d7de27, 0x02064a55, 0x005f7d6b, 0x00a62b75, 0x01bfa314, 0x000cc98c}}}, + {X: Field{[10]uint32{0x01ba4e20, 0x012881c7, 0x005e98d2, 0x03c666d3, 0x013530f0, 0x00c491ef, 0x01435278, 0x01104a21, 0x006c891a, 0x003df702}}, Y: Field{[10]uint32{0x034444aa, 0x0378d16d, 0x027e7b82, 0x000ffc41, 0x00da0550, 0x00121618, 0x02f5f751, 0x0166bac3, 0x0312452e, 0x001cd3b5}}}, + {X: Field{[10]uint32{0x02ec06c6, 0x008362c8, 0x00d3e905, 0x0147944b, 0x01b3f2ae, 0x039be3dd, 0x02d8d8cd, 0x036f032f, 0x03a97bb6, 0x002553e7}}, Y: Field{[10]uint32{0x005dd9bb, 0x030e76c6, 0x0378bf65, 0x00523c10, 0x005426f6, 0x02d3e085, 0x01b3017b, 0x01983d2f, 0x03bb8bd9, 0x002d96d0}}}, + {X: Field{[10]uint32{0x0204e87e, 0x0236c509, 0x0145e818, 0x02f905ad, 0x026def2d, 0x01dd7365, 0x0366947f, 0x01962082, 0x03984141, 0x000839a6}}, Y: Field{[10]uint32{0x00632539, 0x019fe24a, 0x01f51caa, 0x01361f7c, 0x030dcce0, 0x010fd808, 0x02e45a3d, 0x00ae6cd6, 0x02590bd1, 0x00399451}}}, + {X: Field{[10]uint32{0x0072ed1c, 0x039f15c3, 0x01dc3709, 0x0210aace, 0x0371bed4, 0x00c0a55d, 0x0187fb53, 0x00bc1110, 0x03822dc4, 0x00173796}}, Y: Field{[10]uint32{0x01a0ea9f, 0x00a4a66a, 0x03e41b49, 0x02f9d897, 0x03cea3dc, 0x00ff584d, 0x00416e75, 0x0016d425, 0x02d864e4, 0x00283dee}}}, + {X: Field{[10]uint32{0x0326421f, 0x00ec4c7e, 0x01c346e7, 0x0181779c, 0x0045b204, 0x027535ba, 0x02fd03f4, 0x02c370aa, 0x034c6ba6, 0x002d61b2}}, Y: Field{[10]uint32{0x00948744, 0x02b26ad6, 0x0116d2b4, 0x01a662ec, 0x026767b4, 0x001abee1, 0x01de6235, 0x028eca8c, 0x03e7c26e, 0x0033b584}}}, + {X: Field{[10]uint32{0x00ba6ede, 0x029779a4, 0x00a8b2a2, 0x0150ddf9, 0x014e192a, 0x02358071, 0x0213dbfa, 0x00ea0b23, 0x01703580, 0x001f4fd8}}, Y: Field{[10]uint32{0x02c6cb15, 0x027d354b, 0x0100f196, 0x012f9e3a, 0x0177eaf8, 0x00302f2f, 0x03564778, 0x004f083e, 0x010e62f4, 0x0004e3a0}}}, + {X: Field{[10]uint32{0x037eb925, 0x01dfb0a3, 0x01b41d85, 0x037603ea, 0x01c9fa32, 0x00c12ae0, 0x03e67135, 0x03e18f9f, 0x00befc4a, 0x0039e8c5}}, Y: Field{[10]uint32{0x00f3eb1f, 0x02913d20, 0x008fb091, 0x033b1420, 0x0113ec94, 0x036a5c30, 0x019b6d07, 0x012b3fea, 0x0200f0e0, 0x003365e1}}}, + {X: Field{[10]uint32{0x03c6a577, 0x024098f4, 0x00231ec0, 0x02b67915, 0x00ba5fc0, 0x003c37f2, 0x01cd8e81, 0x0240bb88, 0x03e49f41, 0x0005e70e}}, Y: Field{[10]uint32{0x009cf184, 0x03fc32d3, 0x009dc5b9, 0x022693a2, 0x02640216, 0x0142df93, 0x02b03f5a, 0x026a80a7, 0x020efb9b, 0x001d7e7d}}}, + {X: Field{[10]uint32{0x01e6401f, 0x01842c24, 0x00c6fe50, 0x01a4173e, 0x0108d762, 0x015d53e9, 0x017808e2, 0x03060ae5, 0x0071464b, 0x00042956}}, Y: Field{[10]uint32{0x01b56ff4, 0x0145a8d0, 0x038b3029, 0x03caaa32, 0x0299a787, 0x0241aea7, 0x005c679f, 0x0368b38c, 0x03b96d2b, 0x0034d924}}}, + {X: Field{[10]uint32{0x008e555e, 0x03cfa6ba, 0x0099f96a, 0x028bcea7, 0x02585827, 0x00c7b1fd, 0x0108d45b, 0x02321055, 0x03225e85, 0x0012a40d}}, Y: Field{[10]uint32{0x0247d145, 0x01f44c8c, 0x0064c70c, 0x01df40b1, 0x0031c9a4, 0x003f3785, 0x012463f2, 0x01134331, 0x01a7fb9e, 0x00369351}}}, + {X: Field{[10]uint32{0x016acb3e, 0x00a5dcea, 0x02b621cd, 0x02ef80bc, 0x00c68373, 0x005c3b20, 0x00052d6b, 0x02023ded, 0x018c2505, 0x001b4427}}, Y: Field{[10]uint32{0x02dc9a57, 0x00e2ca3a, 0x012adc50, 0x002e72e5, 0x03200c87, 0x02c08eff, 0x001088ec, 0x01b90145, 0x00de511f, 0x003237a8}}}, + {X: Field{[10]uint32{0x02e1af88, 0x03c30e59, 0x01bf28f7, 0x00f8a1d3, 0x0106105b, 0x00d55d41, 0x015c7347, 0x00919f01, 0x00986d20, 0x00270866}}, Y: Field{[10]uint32{0x01d0914a, 0x027ecb63, 0x004550ec, 0x03354b52, 0x03efddf5, 0x01959783, 0x01d41463, 0x03fc4be7, 0x016c8edd, 0x00218dd2}}}, + {X: Field{[10]uint32{0x0292b03a, 0x023b71b0, 0x032e74de, 0x02d772e3, 0x03dcd104, 0x00aee5ce, 0x036dd750, 0x003d8040, 0x00390e66, 0x0008b294}}, Y: Field{[10]uint32{0x006b11e8, 0x03a457d9, 0x0258eda5, 0x02eb100f, 0x01cb6731, 0x0023e832, 0x016449a7, 0x02e07910, 0x00711ef6, 0x0021bf51}}}, + {X: Field{[10]uint32{0x02b6f938, 0x037a10b9, 0x0227c80b, 0x00977dd7, 0x022e39be, 0x03db2880, 0x0116fdd1, 0x011903c8, 0x0302cc00, 0x0033f063}}, Y: Field{[10]uint32{0x0290df7d, 0x0075a118, 0x01398645, 0x02936740, 0x01c09236, 0x01c232f9, 0x03a2923f, 0x0343965e, 0x00df4f79, 0x00358ad6}}}, + {X: Field{[10]uint32{0x0280a087, 0x03053e66, 0x02f259d3, 0x015afb2e, 0x02574905, 0x008d7142, 0x01f46ca6, 0x01163a64, 0x00c23425, 0x000ce22f}}, Y: Field{[10]uint32{0x0245c016, 0x00b84fa9, 0x0013b310, 0x029752b1, 0x0306c3dc, 0x02563efc, 0x00223166, 0x015e0c07, 0x02f806f6, 0x001f52a8}}}, + {X: Field{[10]uint32{0x00b46a19, 0x02a507bc, 0x03aa802b, 0x00f532f2, 0x0144ac96, 0x00db67e5, 0x018fefc1, 0x004b78f7, 0x00131b8c, 0x00349af4}}, Y: Field{[10]uint32{0x028d3a99, 0x002b096d, 0x00653cb1, 0x01f699e0, 0x020d045a, 0x032ad24a, 0x02948724, 0x01e571ad, 0x02a331b6, 0x0019be27}}}, + {X: Field{[10]uint32{0x03d1fdb9, 0x0274a795, 0x035ca1d9, 0x0353511f, 0x03465a03, 0x03bd7d9a, 0x03960edf, 0x03a3c858, 0x030cdb67, 0x003734cd}}, Y: Field{[10]uint32{0x007084ef, 0x0185a9cd, 0x01ed9922, 0x02f66d93, 0x028a9eb4, 0x024efdcc, 0x038d4483, 0x02fe1cb3, 0x007a320a, 0x0022e4dd}}}, + {X: Field{[10]uint32{0x038d8e7a, 0x0227cfd3, 0x0006f805, 0x02ecff82, 0x0121d449, 0x02718e06, 0x03105af5, 0x02b558cd, 0x0105e602, 0x001d01d3}}, Y: Field{[10]uint32{0x003d574d, 0x02e1052c, 0x002cfe19, 0x03db111e, 0x02bf0dd8, 0x0077548d, 0x00fd515a, 0x0202b411, 0x03d4adee, 0x00069352}}}, + {X: Field{[10]uint32{0x0305c174, 0x00dcea0b, 0x034dd732, 0x025035ae, 0x01971203, 0x01e024aa, 0x00df438a, 0x00faedaa, 0x0081f3a2, 0x0002a273}}, Y: Field{[10]uint32{0x03c4fda4, 0x02a59128, 0x03d77873, 0x039d5c1f, 0x00326a9c, 0x02e5e77b, 0x01ddc9fd, 0x03c18d39, 0x03dd676d, 0x0012dbe0}}}, + {X: Field{[10]uint32{0x0216424c, 0x028e03d9, 0x00e037dd, 0x0102d82b, 0x026443c5, 0x001fe592, 0x002ae36b, 0x00fc3864, 0x00bafa91, 0x0023c684}}, Y: Field{[10]uint32{0x01e5525f, 0x02615557, 0x0326e869, 0x018b5680, 0x0114e3a4, 0x01d03cc7, 0x0016ad4e, 0x01df0c91, 0x024445c1, 0x00040a35}}}, + {X: Field{[10]uint32{0x01e27b51, 0x01d01222, 0x026d6f4c, 0x03e11e3e, 0x019154a2, 0x0369266b, 0x0157268a, 0x0288da9e, 0x027914f9, 0x002b63f6}}, Y: Field{[10]uint32{0x020e82ae, 0x01392f8c, 0x03834617, 0x03c09818, 0x03703b74, 0x0170f24c, 0x02deffc0, 0x029b1bdd, 0x02ab1f7d, 0x00272874}}}, + {X: Field{[10]uint32{0x0167fbe7, 0x0178cb3f, 0x03c874d1, 0x003f93ec, 0x03219270, 0x03c8e38b, 0x008cc246, 0x00a5c110, 0x010a797b, 0x001b1ba6}}, Y: Field{[10]uint32{0x0391dac1, 0x00c1868f, 0x019e1be8, 0x021e4f53, 0x0139811b, 0x0010368c, 0x025b32cc, 0x0159667e, 0x03980f35, 0x0007ff05}}}, + {X: Field{[10]uint32{0x01118969, 0x007e68c9, 0x0247cedc, 0x01728d02, 0x039f86f7, 0x0027c8de, 0x035351de, 0x00aaf658, 0x03ea31ad, 0x00080ac4}}, Y: Field{[10]uint32{0x001bcba0, 0x03314d46, 0x004c0fe3, 0x0085c000, 0x03868a45, 0x02f2061c, 0x0111184e, 0x00dfd354, 0x0105a14e, 0x00314bed}}}, + {X: Field{[10]uint32{0x03b748a5, 0x0210a475, 0x02f5fd22, 0x031848c9, 0x03034053, 0x02615654, 0x01c7c7cf, 0x010beac3, 0x00a10251, 0x0014d57c}}, Y: Field{[10]uint32{0x02281949, 0x0333c5df, 0x0118f4b1, 0x01a9e071, 0x039cddd3, 0x0183b8fb, 0x008ff9de, 0x0007db07, 0x036a5535, 0x001d6ef8}}}, + {X: Field{[10]uint32{0x029829d7, 0x00ebab30, 0x02235f91, 0x02c4d1c1, 0x0279a39a, 0x02a0ebb0, 0x00f16644, 0x037b2747, 0x0178eacb, 0x002e214b}}, Y: Field{[10]uint32{0x03183156, 0x00c584f7, 0x020faeb4, 0x0343dca7, 0x038d51ee, 0x03a27b0e, 0x002735d2, 0x03187eb9, 0x035052b3, 0x001d8eea}}}, + {X: Field{[10]uint32{0x03057ae2, 0x033b56c1, 0x0188beec, 0x03a02c3c, 0x01696d18, 0x0027b343, 0x017d4d6a, 0x03de3870, 0x004b294d, 0x0032acb9}}, Y: Field{[10]uint32{0x01ff2f43, 0x02681a06, 0x00ed5405, 0x02b416c8, 0x02de28bf, 0x0156d41b, 0x0149607c, 0x01266b3b, 0x009a501a, 0x003cd46c}}}, + {X: Field{[10]uint32{0x03056b31, 0x01a14f15, 0x026589d4, 0x00dae6e1, 0x03b16f9f, 0x0152dd5a, 0x012355eb, 0x015568af, 0x01c99c6d, 0x0005002e}}, Y: Field{[10]uint32{0x03a077a8, 0x0270cab7, 0x00436e56, 0x007e5bc9, 0x035709b9, 0x03508477, 0x026993b3, 0x00459e82, 0x001662f4, 0x0022ca42}}}, + {X: Field{[10]uint32{0x03d9141e, 0x03b1b9af, 0x018a50fb, 0x00655623, 0x03b3d31b, 0x0044511a, 0x03ae7a9a, 0x027071a1, 0x032e973e, 0x0014ab8d}}, Y: Field{[10]uint32{0x02351ccb, 0x02ff8360, 0x0256b71e, 0x033363b3, 0x001f87cf, 0x0116436d, 0x0238721a, 0x0390b6e5, 0x000de6d0, 0x003e60ad}}}, + {X: Field{[10]uint32{0x01899c24, 0x03d976d8, 0x032e0fe5, 0x0022e4df, 0x001139b7, 0x0143700c, 0x0241e148, 0x011896f8, 0x03bd4082, 0x000f453f}}, Y: Field{[10]uint32{0x00a1dfb7, 0x03f1d862, 0x02872981, 0x03bf4dd9, 0x02799882, 0x034884e8, 0x01cf16b8, 0x03811d36, 0x00fa477e, 0x002c4299}}}, + {X: Field{[10]uint32{0x02a48930, 0x0057b36e, 0x0246e824, 0x0346a57f, 0x03e7ab3f, 0x0353261e, 0x03bc2700, 0x03065ea2, 0x02df54e0, 0x0031bd4a}}, Y: Field{[10]uint32{0x0056811d, 0x016bf64e, 0x03a8f77e, 0x024cab7a, 0x03b9ef91, 0x0267e912, 0x010281c0, 0x01ced241, 0x006fb538, 0x001d4930}}}, + {X: Field{[10]uint32{0x0144c1aa, 0x01828fb2, 0x00f559fe, 0x03601b46, 0x005f2d1d, 0x031e7070, 0x03c838a4, 0x01f2d9e8, 0x0264bdc4, 0x00240224}}, Y: Field{[10]uint32{0x02ee04de, 0x003ece74, 0x03064eea, 0x032e4779, 0x02ca140b, 0x010c392d, 0x01d582cc, 0x00c899aa, 0x0046d70b, 0x0006258e}}}, + {X: Field{[10]uint32{0x03da0662, 0x03dc247b, 0x006ebc1b, 0x019a5bcf, 0x012db741, 0x03a084a9, 0x035b2d4c, 0x00df0589, 0x00ea478b, 0x00389f09}}, Y: Field{[10]uint32{0x02783de3, 0x01f3c244, 0x03b7d853, 0x036bf0ed, 0x03bb99f4, 0x000c5e46, 0x01532bb5, 0x019f2feb, 0x0279c3a2, 0x0009fb14}}}, + {X: Field{[10]uint32{0x000a3eb2, 0x03bfe131, 0x0092b917, 0x03b98190, 0x032549b8, 0x025574ef, 0x0025d857, 0x035badc0, 0x02129cf1, 0x0032976a}}, Y: Field{[10]uint32{0x027a9811, 0x02109677, 0x01e9ef6a, 0x03c9dee2, 0x037c4aa5, 0x035082d2, 0x027c7c27, 0x01bdf4cf, 0x0105500f, 0x001a0b52}}}, + {X: Field{[10]uint32{0x00877f55, 0x005a67bf, 0x00170487, 0x016d0943, 0x006c98ac, 0x02274509, 0x0223fb5c, 0x031a2119, 0x000f2b2a, 0x00241a7b}}, Y: Field{[10]uint32{0x031fb05e, 0x034e95b9, 0x00266975, 0x02a322e0, 0x02a6c3c3, 0x00901f7f, 0x000617ee, 0x00dc485b, 0x02c4eff8, 0x00331403}}}, + {X: Field{[10]uint32{0x03bda16c, 0x02c4e470, 0x0250fb8c, 0x00f01649, 0x00053639, 0x017a2ae8, 0x02742d3c, 0x03b86dae, 0x02eb0bd5, 0x0017f87f}}, Y: Field{[10]uint32{0x0065a34b, 0x0250ade6, 0x01af53bf, 0x01a90dd7, 0x03ea02ae, 0x001cbddb, 0x025ba068, 0x0193b4d0, 0x032701ac, 0x0036c46c}}}, + {X: Field{[10]uint32{0x001b2c34, 0x019b12ab, 0x00cb8318, 0x00aa1783, 0x026bf260, 0x02439382, 0x0035b6cf, 0x03e20d24, 0x01a5f168, 0x000292a4}}, Y: Field{[10]uint32{0x03837596, 0x02080c1f, 0x00857ce0, 0x02a7023d, 0x02ff7265, 0x00ae262a, 0x02f2ff8e, 0x03b47462, 0x02a8fe36, 0x00016ffb}}}, + {X: Field{[10]uint32{0x02884849, 0x01bdd1be, 0x019e35f0, 0x01bb4f1f, 0x0143f536, 0x03aaaf93, 0x00705054, 0x016d492a, 0x0336f0c3, 0x003d04d7}}, Y: Field{[10]uint32{0x010c526b, 0x03f12c99, 0x0052dd55, 0x00c30ea7, 0x01ba1a5d, 0x00c1d75d, 0x019d0ea4, 0x0301e2d3, 0x03f1b8b6, 0x000719c1}}}, + {X: Field{[10]uint32{0x00380203, 0x00ea7ce5, 0x01e0fdcc, 0x01364ad0, 0x00014a50, 0x020fa12e, 0x03449928, 0x03eebb4a, 0x018a9363, 0x00356a26}}, Y: Field{[10]uint32{0x0260e9fb, 0x026cf6ba, 0x03d4b0bf, 0x02be98aa, 0x032f20c5, 0x0351b35f, 0x038ae7c6, 0x0320162e, 0x03036fdd, 0x0025805a}}}, + {X: Field{[10]uint32{0x03f3d176, 0x022e6f92, 0x01fa8cc3, 0x039e6443, 0x00d50297, 0x0043064e, 0x007fb622, 0x0036f428, 0x023404b3, 0x00220132}}, Y: Field{[10]uint32{0x03d37b0d, 0x02bb79d5, 0x02c9124c, 0x0142c472, 0x01eb65db, 0x00e1c58c, 0x008c55ff, 0x01f18dde, 0x02e57992, 0x0016d92f}}}, + {X: Field{[10]uint32{0x03811021, 0x0176fd8a, 0x00e740ac, 0x01d1f426, 0x010c947c, 0x022f6969, 0x008e78e7, 0x0086daf1, 0x01fc440c, 0x0021a470}}, Y: Field{[10]uint32{0x03b1787e, 0x0122f2b5, 0x01c0903d, 0x00e7d9b0, 0x00682f45, 0x000a9c44, 0x02c330af, 0x00460555, 0x01c535f5, 0x003f63b0}}}, + {X: Field{[10]uint32{0x03093229, 0x01018dfb, 0x001eb58a, 0x02aec3b4, 0x03c3ee5f, 0x0253a4a4, 0x02bfe3f8, 0x038b87f7, 0x01f6343b, 0x001117f0}}, Y: Field{[10]uint32{0x0185b605, 0x001ef6df, 0x010af329, 0x03cd236a, 0x03c3c087, 0x03b7b44e, 0x00aa1b73, 0x03e14f41, 0x03fe6737, 0x00215fc5}}}, + {X: Field{[10]uint32{0x036493b4, 0x03140069, 0x039667d1, 0x01568773, 0x02af1a55, 0x02e23135, 0x023aaf95, 0x0346c2cb, 0x03dea657, 0x00170e5f}}, Y: Field{[10]uint32{0x030aff0a, 0x02681bf7, 0x03d32de7, 0x00b3d21f, 0x03ce5cb5, 0x02a7f153, 0x0336aee6, 0x00f1d4b5, 0x00207b6f, 0x002739d2}}}, + {X: Field{[10]uint32{0x03fc1b7e, 0x00dbe931, 0x030c1d7e, 0x0210dcb4, 0x02d9f535, 0x037f8644, 0x01d2bc5b, 0x0380a0d8, 0x01cb28d7, 0x0026d559}}, Y: Field{[10]uint32{0x03879eea, 0x0266c458, 0x0062d827, 0x01d7662c, 0x01a23af0, 0x038fdb1b, 0x0257f054, 0x02a0c962, 0x028d2de2, 0x001f573e}}}, + {X: Field{[10]uint32{0x01194f1d, 0x015368f2, 0x03b4b896, 0x027c404a, 0x02a5229a, 0x006ec656, 0x031b1657, 0x021c34e5, 0x00631bbf, 0x002bef7b}}, Y: Field{[10]uint32{0x0327e296, 0x030914e3, 0x0316a773, 0x00507d50, 0x0383fe57, 0x02ec2899, 0x0074ad1b, 0x009497e6, 0x0349b949, 0x0033f2e9}}}, + {X: Field{[10]uint32{0x00ad916b, 0x0075a22b, 0x03f4d0e0, 0x0318b12c, 0x03a7cc11, 0x03a7a7b1, 0x03c61605, 0x014d1d72, 0x03cbca3a, 0x001dc4aa}}, Y: Field{[10]uint32{0x024b82fb, 0x023c289a, 0x03ead0c6, 0x03f47ffb, 0x02b57cbb, 0x030ef4cc, 0x02b43af8, 0x009556b4, 0x01bc0eb1, 0x001ee472}}}, + {X: Field{[10]uint32{0x00a2b7e2, 0x00b4e2c7, 0x01c9f07a, 0x00459b9d, 0x0311b43a, 0x037d419a, 0x01fe506f, 0x017904b9, 0x0346f293, 0x000f1148}}, Y: Field{[10]uint32{0x019cd800, 0x00231ffd, 0x026962c6, 0x0228d4ad, 0x010e0203, 0x012047f6, 0x03532f8d, 0x01a0a4eb, 0x01e127f9, 0x003f4fdb}}}, + {X: Field{[10]uint32{0x0248b7be, 0x020b6c2a, 0x030547d1, 0x011377c2, 0x00e04eda, 0x0032652e, 0x01a53d67, 0x0368ff1f, 0x002fb4db, 0x0002f616}}, Y: Field{[10]uint32{0x01285c68, 0x03a318d1, 0x0033ad6d, 0x02de5d9c, 0x00ef0dc4, 0x039f420a, 0x016b282e, 0x01a2ee30, 0x0369c182, 0x001e6789}}}, + {X: Field{[10]uint32{0x02c84112, 0x0339b3ec, 0x0371974d, 0x03ab667a, 0x03befe03, 0x01a44ce3, 0x03fb71c1, 0x0375018a, 0x00a78dd9, 0x00310404}}, Y: Field{[10]uint32{0x02a2ff83, 0x0058b690, 0x0208d29b, 0x001cc50f, 0x00f270f8, 0x0209298f, 0x01c5dbcf, 0x02f088ec, 0x039de71e, 0x00140230}}}, + {X: Field{[10]uint32{0x0121d311, 0x0094f309, 0x01f4a1b6, 0x01777b6d, 0x03f786bc, 0x01426f23, 0x02586a6a, 0x02e89c01, 0x007e6cf4, 0x003a27a0}}, Y: Field{[10]uint32{0x02fea2cc, 0x0366527c, 0x0117aad6, 0x03070264, 0x012228f9, 0x0301000a, 0x039fcfc4, 0x01237a4d, 0x03797c49, 0x002ab7b2}}}, + {X: Field{[10]uint32{0x00b08577, 0x006e43f7, 0x03fdbdca, 0x01ce19bc, 0x0084091f, 0x0048630d, 0x01379195, 0x02fe4190, 0x01b3be2d, 0x000d8f7c}}, Y: Field{[10]uint32{0x01848bae, 0x02f7c3dd, 0x026057e3, 0x01918c26, 0x00f9ea5b, 0x01f9dbc8, 0x0221493f, 0x038db125, 0x004e5634, 0x0002bbf4}}}, + {X: Field{[10]uint32{0x038ea16e, 0x028f22f1, 0x003becd4, 0x00e8d357, 0x03ca8fe3, 0x0173112e, 0x01213228, 0x02093920, 0x023883d2, 0x00172345}}, Y: Field{[10]uint32{0x02c0456f, 0x02baeb86, 0x02685872, 0x037e3cc6, 0x02355347, 0x027dd496, 0x01005914, 0x019b0225, 0x01d9c7ce, 0x003d9be4}}}, + {X: Field{[10]uint32{0x02cbe126, 0x0217a1fa, 0x01ff4080, 0x0162f9d7, 0x024181dd, 0x03649536, 0x037789ee, 0x020fb760, 0x02760835, 0x00042b19}}, Y: Field{[10]uint32{0x0317d22d, 0x015fafae, 0x02a1a01f, 0x02806057, 0x0372e0db, 0x031ac96b, 0x0065acb0, 0x039eec1d, 0x02de23f3, 0x001b4faa}}}, + {X: Field{[10]uint32{0x00153048, 0x029a5ea3, 0x037da8db, 0x003e6d87, 0x02974c4c, 0x00823a8f, 0x01677962, 0x01550111, 0x01ea7bb6, 0x00079e68}}, Y: Field{[10]uint32{0x00787fc4, 0x03bca97c, 0x015dd394, 0x02f8ce81, 0x03e07d35, 0x02a0023a, 0x01874064, 0x012221a2, 0x017920a3, 0x002d8f8f}}}, + {X: Field{[10]uint32{0x03fa9a5b, 0x02f34254, 0x0076a7be, 0x00604759, 0x02116991, 0x0003fc4f, 0x00df2abb, 0x0288fd42, 0x007397b0, 0x0036c347}}, Y: Field{[10]uint32{0x0100dfe8, 0x0278ca12, 0x00dc9d0b, 0x010598a7, 0x032f85fd, 0x02d723bb, 0x01724312, 0x013c7b46, 0x00773ca7, 0x00072742}}}, + {X: Field{[10]uint32{0x03385f27, 0x0280fb72, 0x03622003, 0x008f9883, 0x03969042, 0x00b9dd6f, 0x02bdc229, 0x033a3499, 0x03b3481e, 0x00387f75}}, Y: Field{[10]uint32{0x030a4c77, 0x01019aa5, 0x03e6d09e, 0x024f8840, 0x03d9b31f, 0x00ff71a9, 0x02dee658, 0x00ffdc35, 0x039f2895, 0x000f3eac}}}, + {X: Field{[10]uint32{0x0223ffd3, 0x037c46a8, 0x018803b2, 0x0396fc62, 0x039ed85f, 0x0084c323, 0x02701c92, 0x02ee3cf5, 0x01342b69, 0x00259e5c}}, Y: Field{[10]uint32{0x02631d31, 0x025f91c3, 0x0394e059, 0x031b0255, 0x02632c0d, 0x034a68f9, 0x00b6d93c, 0x01be7df1, 0x003f630b, 0x000b50cd}}}, + {X: Field{[10]uint32{0x01c33efc, 0x020505f6, 0x03ba8cba, 0x01b66a67, 0x00ec0a77, 0x02677520, 0x01d2a0f3, 0x0352531a, 0x02186e27, 0x0037ed00}}, Y: Field{[10]uint32{0x0137796e, 0x01ec4ad7, 0x00f4861f, 0x00705e08, 0x009bd850, 0x02580c14, 0x0245bcb7, 0x00c9cc57, 0x01dce9f9, 0x000ccb64}}}, + {X: Field{[10]uint32{0x027681ec, 0x02e11a30, 0x035e5189, 0x0011fef8, 0x01171de0, 0x017068cc, 0x0208da7b, 0x03729145, 0x01ebed13, 0x001ad971}}, Y: Field{[10]uint32{0x01a34f62, 0x01e723a2, 0x01f43e26, 0x0137d6ee, 0x013e71fc, 0x01bf53e1, 0x0246b51f, 0x02f02cbc, 0x02e8e0ae, 0x0002bf43}}}, + {X: Field{[10]uint32{0x00c4b619, 0x00e43d4a, 0x0100480a, 0x008bf7f3, 0x03021e5c, 0x03509b7c, 0x02396aa5, 0x00e59789, 0x01a160b0, 0x002f070f}}, Y: Field{[10]uint32{0x00a31640, 0x03b5192b, 0x03bc8076, 0x0334d6b2, 0x0386ad94, 0x0108b046, 0x017862c0, 0x03faa42b, 0x017465e4, 0x003f595c}}}, + {X: Field{[10]uint32{0x0005913a, 0x004f7ea3, 0x038e2de6, 0x001b0b1b, 0x01090264, 0x02f161f8, 0x038a6a8c, 0x0328d54f, 0x011796d6, 0x001626c7}}, Y: Field{[10]uint32{0x003fb3e0, 0x00b2eb94, 0x02c87974, 0x01a76917, 0x003c7b64, 0x00eee8a9, 0x039365de, 0x013d1b89, 0x01ecac25, 0x00399575}}}, + {X: Field{[10]uint32{0x00ae4ed5, 0x016fe61e, 0x01677612, 0x033f3a9d, 0x016ada63, 0x024b652f, 0x01c2ef5c, 0x01b0aa53, 0x03856d1e, 0x00279c98}}, Y: Field{[10]uint32{0x00e304dd, 0x03d4d058, 0x01896069, 0x01010f24, 0x030a83bc, 0x0371ea8a, 0x028a48e0, 0x00e3e2d8, 0x01f51e5b, 0x002308e3}}}, + {X: Field{[10]uint32{0x02764263, 0x02d76f71, 0x018d57ea, 0x02bc9548, 0x004f9bd3, 0x00820380, 0x000c551b, 0x03dd3ee9, 0x017814e0, 0x000489a7}}, Y: Field{[10]uint32{0x0385b3d6, 0x017e1938, 0x01a704a9, 0x031f08b7, 0x00daee58, 0x02f45a48, 0x02febcdb, 0x025d7041, 0x00bd6584, 0x0003c3dc}}}, + {X: Field{[10]uint32{0x033088a6, 0x0245ced5, 0x03aa315e, 0x02fc59db, 0x005c73fd, 0x009cfbff, 0x0048cdd6, 0x02405383, 0x032fcc50, 0x0034c84b}}, Y: Field{[10]uint32{0x0032df82, 0x01902112, 0x02fc09db, 0x03aa14fe, 0x00ff59b6, 0x0271a4d3, 0x02618c84, 0x03d47cd8, 0x01f10673, 0x000e6bce}}}, + {X: Field{[10]uint32{0x00250052, 0x01168821, 0x02dccdae, 0x03f67d0a, 0x034ef288, 0x03d92588, 0x0014e724, 0x002eb510, 0x032b9bcc, 0x00314d7d}}, Y: Field{[10]uint32{0x02271022, 0x0171fb92, 0x000a7465, 0x0008a4c0, 0x02884473, 0x01f3a0a6, 0x0014a17f, 0x018c6d8a, 0x005b6fb7, 0x000fde66}}}, + {X: Field{[10]uint32{0x03399605, 0x003eb4e4, 0x03c121c8, 0x004bb035, 0x03271e39, 0x003b437d, 0x002bb186, 0x027e9618, 0x01269b16, 0x0013d6dc}}, Y: Field{[10]uint32{0x01cfd0a7, 0x0104d8f3, 0x00fb5dbe, 0x03c81881, 0x02576f63, 0x025f24ca, 0x002c6cdb, 0x0163aa44, 0x01047f2a, 0x002d83f0}}}, + {X: Field{[10]uint32{0x03d5d065, 0x0323c6ed, 0x03851de9, 0x01f5cde9, 0x000ec70e, 0x0000a705, 0x02c2863e, 0x00e2c6bc, 0x033b244c, 0x0032d166}}, Y: Field{[10]uint32{0x0157fbd0, 0x01d293c6, 0x010ea53a, 0x0055a4b2, 0x02a888bd, 0x03a242ce, 0x02462411, 0x01db20bd, 0x015d3c03, 0x001ed9ec}}}, + {X: Field{[10]uint32{0x0219054e, 0x00a87e93, 0x02597ea7, 0x018f4691, 0x02d389f5, 0x03d0d065, 0x03121bb7, 0x03831463, 0x01c70ebd, 0x001e1f58}}, Y: Field{[10]uint32{0x0272a658, 0x00ef2fab, 0x014ba4b9, 0x02ef5cad, 0x03f42e9e, 0x02cf4542, 0x031cf396, 0x0232e309, 0x02f25fcf, 0x0016ebd5}}}, + {X: Field{[10]uint32{0x01f6115c, 0x00edbaf1, 0x012bacc9, 0x0229808d, 0x02337353, 0x0358e420, 0x037d97cb, 0x02c3252d, 0x002a31d0, 0x0030e2bf}}, Y: Field{[10]uint32{0x03ee529f, 0x0109a210, 0x004690d8, 0x022f4b96, 0x01875e09, 0x01917e35, 0x01a26a4c, 0x03f3092e, 0x03cab138, 0x002e4977}}}, + {X: Field{[10]uint32{0x03406d0a, 0x0321e6bf, 0x0282ad6e, 0x002e2ade, 0x0339a5dd, 0x016e6c97, 0x01c6ad5e, 0x01ba56e7, 0x023b8e60, 0x000dd987}}, Y: Field{[10]uint32{0x03e9b977, 0x02c58e29, 0x002a4df1, 0x00e44c8e, 0x0160d8bc, 0x01b3e510, 0x017e07bd, 0x023f384c, 0x025d430d, 0x002adcd7}}}, + {X: Field{[10]uint32{0x01e256ba, 0x01a28594, 0x02062abd, 0x0367d939, 0x0388ea5a, 0x0370319d, 0x018e9348, 0x00ad1f0f, 0x0051b8c2, 0x0039449e}}, Y: Field{[10]uint32{0x030405c6, 0x01fce1c9, 0x004b3f94, 0x0136e1c1, 0x025b1e7d, 0x0154dffe, 0x034b7dc0, 0x027ade42, 0x037e0034, 0x001611fd}}}, + {X: Field{[10]uint32{0x017382e9, 0x0191ee6b, 0x03b41955, 0x02601482, 0x02127a36, 0x00e03f81, 0x013e7cb7, 0x02a284dc, 0x005da6b8, 0x003cf1fd}}, Y: Field{[10]uint32{0x023e7c87, 0x0397ef7d, 0x00a51ddf, 0x0005c675, 0x034b4693, 0x00024d9d, 0x01decd09, 0x0274c7dc, 0x0211eb1b, 0x000ab3e6}}}, + {X: Field{[10]uint32{0x00d745ba, 0x012cbc21, 0x024de0ff, 0x0254eec3, 0x0279125f, 0x0122a642, 0x03733a18, 0x02c94948, 0x0047e8d5, 0x0021b790}}, Y: Field{[10]uint32{0x01bc969a, 0x0269d19c, 0x02007427, 0x00146a7b, 0x03569211, 0x0177a4b4, 0x0284cf7d, 0x000174ac, 0x00720dac, 0x001c79a9}}}, + {X: Field{[10]uint32{0x03f57504, 0x021d70bc, 0x02c635e2, 0x032b0317, 0x023029d9, 0x03cea85a, 0x020cd963, 0x02759b65, 0x00307225, 0x00318457}}, Y: Field{[10]uint32{0x037a712f, 0x004a1427, 0x0077050d, 0x0004d10f, 0x01ced024, 0x00f20868, 0x017f56c2, 0x0375e35e, 0x00d0b33f, 0x000635a4}}}, + {X: Field{[10]uint32{0x02f53c5b, 0x034d9d10, 0x03c6ac61, 0x03c78afe, 0x018bfae0, 0x01a4a6c1, 0x0038cbd7, 0x011cee46, 0x00998b43, 0x0032d514}}, Y: Field{[10]uint32{0x01572bbf, 0x0236de24, 0x00ddfde3, 0x02e9efed, 0x01c00ba8, 0x026e77d5, 0x03684b4f, 0x013c2335, 0x034d79e3, 0x00104675}}}, + {X: Field{[10]uint32{0x02922d2a, 0x014bca14, 0x013725a7, 0x01cf1b42, 0x020a333b, 0x0182a628, 0x01771e26, 0x00aed3ec, 0x0304b936, 0x00343739}}, Y: Field{[10]uint32{0x02e37e47, 0x028e4565, 0x018ffde5, 0x01529314, 0x02124d3f, 0x016730bb, 0x033891a2, 0x033837c7, 0x03707947, 0x003e4b0e}}}, + {X: Field{[10]uint32{0x016b20a4, 0x02866fc8, 0x03a96249, 0x01679f5c, 0x03d42702, 0x01957314, 0x02ab8570, 0x016618e3, 0x0238e5aa, 0x0036e4f8}}, Y: Field{[10]uint32{0x03bcc7c5, 0x035fad7e, 0x0094c815, 0x025718bf, 0x033ab178, 0x009bbd95, 0x034f60cd, 0x023ad942, 0x008b670e, 0x00234677}}}, + {X: Field{[10]uint32{0x00c3f486, 0x01753bda, 0x01835ba8, 0x03f2efc4, 0x014d6c6c, 0x001e584a, 0x0207e54b, 0x02fbe0a7, 0x037fd8ce, 0x0030e1f0}}, Y: Field{[10]uint32{0x01ddeda9, 0x03f9e384, 0x00897994, 0x0036d896, 0x03c8e3ae, 0x004b5ff9, 0x020f7d7f, 0x02cc01b2, 0x00d9ae7e, 0x00214960}}}, + {X: Field{[10]uint32{0x0206c232, 0x00dd271d, 0x01092f94, 0x03748eb6, 0x024d3b22, 0x024aed2d, 0x0001b5b1, 0x039544df, 0x0134f04d, 0x003aed63}}, Y: Field{[10]uint32{0x01d1ae16, 0x01223f37, 0x0112bc59, 0x00b14272, 0x03d92ae7, 0x0016af26, 0x01d3e829, 0x03e7536c, 0x01059c99, 0x0006e5e7}}}, + {X: Field{[10]uint32{0x02e38e6b, 0x017390a5, 0x038d8252, 0x022befc8, 0x032f1317, 0x00c32b44, 0x01810b17, 0x028a6dd9, 0x0066acfd, 0x001e2473}}, Y: Field{[10]uint32{0x027caaf1, 0x02b3d94d, 0x02db972f, 0x039f6c02, 0x03a21ff6, 0x01fb2bb0, 0x02987ad0, 0x0231b118, 0x03292018, 0x0008864d}}}, + {X: Field{[10]uint32{0x0014d081, 0x014378d6, 0x011f472c, 0x0003028c, 0x000acec8, 0x01e4ff63, 0x02578a53, 0x007a34b0, 0x0142e4bc, 0x00302c09}}, Y: Field{[10]uint32{0x017f8371, 0x0262f06d, 0x01673136, 0x0213afff, 0x0376b1a8, 0x00702465, 0x02e6bb57, 0x005f0006, 0x00710f59, 0x000092f7}}}, + {X: Field{[10]uint32{0x0026d2dd, 0x028dad71, 0x014b2f07, 0x03d13acf, 0x03c2000c, 0x0103a980, 0x02fd9a3e, 0x01141fc4, 0x0174b870, 0x003a8575}}, Y: Field{[10]uint32{0x0230944e, 0x00969462, 0x0124b6ca, 0x01b16269, 0x00c5cdc1, 0x02df8e25, 0x00faf58a, 0x028e7d38, 0x014f4d8c, 0x002d965b}}}, + {X: Field{[10]uint32{0x039604de, 0x006dde73, 0x006726e5, 0x02604d63, 0x02708776, 0x009274d3, 0x00d5726a, 0x01abdee2, 0x03dfc35a, 0x001df4e1}}, Y: Field{[10]uint32{0x008b4a87, 0x0336693c, 0x0324993f, 0x001b7805, 0x01459165, 0x013e8ac7, 0x013c2351, 0x02a58b4b, 0x02cd2d70, 0x003976bb}}}, + {X: Field{[10]uint32{0x01ccd7ec, 0x01aa7727, 0x02db8329, 0x03530c54, 0x031064f9, 0x035bfbee, 0x024dc2f9, 0x0093ef06, 0x02cb7d1a, 0x002a49d0}}, Y: Field{[10]uint32{0x01679f76, 0x0063908c, 0x0225ad9d, 0x018ecf9c, 0x0266d4f1, 0x0208fcf1, 0x0346df60, 0x03c293b0, 0x00f98cda, 0x001996a7}}}, + {X: Field{[10]uint32{0x02316a46, 0x02c417e9, 0x02b6f36c, 0x0368a783, 0x00f62de9, 0x01ed54c1, 0x034053d3, 0x00e4f574, 0x00f79f0c, 0x00094f95}}, Y: Field{[10]uint32{0x027155e0, 0x038cfaf3, 0x03fd7b2a, 0x01fe3f82, 0x0067c857, 0x016c9fbc, 0x029417ac, 0x03b030ca, 0x00cded78, 0x0015385a}}}, + {X: Field{[10]uint32{0x0003fbf2, 0x01173000, 0x004434ee, 0x031eccf6, 0x0255fc01, 0x038e00a6, 0x039586f9, 0x021c8185, 0x00e0e9c3, 0x00344c12}}, Y: Field{[10]uint32{0x00743f37, 0x01d42021, 0x021e3640, 0x0102e6f1, 0x01af2578, 0x02c9470e, 0x00906897, 0x0091de15, 0x02db9450, 0x001f1119}}}, + {X: Field{[10]uint32{0x00a284a2, 0x001194dc, 0x032c88e6, 0x00dca958, 0x02a632b2, 0x02f6f26a, 0x007d0797, 0x008488a2, 0x0110387c, 0x003a48d0}}, Y: Field{[10]uint32{0x036523c4, 0x02c33edb, 0x0363ae80, 0x0147dd03, 0x01839a26, 0x01be63b6, 0x03b3afe6, 0x01486d3f, 0x008c4ca3, 0x000ae62c}}}, + {X: Field{[10]uint32{0x03a29be5, 0x02a76b60, 0x0271332b, 0x007253e2, 0x00742834, 0x02ec95d9, 0x0091a5a7, 0x01e3bdce, 0x03a7ab69, 0x000c0b80}}, Y: Field{[10]uint32{0x0310120b, 0x028be0d5, 0x002eea98, 0x036d9102, 0x030e8430, 0x0395aecf, 0x02e850d2, 0x00d6facb, 0x02db210c, 0x0012af82}}}, + {X: Field{[10]uint32{0x01665368, 0x03345584, 0x008598d7, 0x0370c75a, 0x024fea8b, 0x02c3e31e, 0x020571ee, 0x003cc372, 0x03894440, 0x0014dc04}}, Y: Field{[10]uint32{0x02a97cbe, 0x0069d3fa, 0x02d1971b, 0x036fc5a9, 0x01a712e2, 0x02a68db8, 0x0331bbe5, 0x03c88695, 0x026439c1, 0x00328d15}}}, + {X: Field{[10]uint32{0x028383cd, 0x0254a6bc, 0x00ff4957, 0x0375508f, 0x01656aaa, 0x0168b4e6, 0x012b6f7a, 0x01f2e3eb, 0x0186645d, 0x002303a0}}, Y: Field{[10]uint32{0x0048d27f, 0x035dd5d3, 0x018ffcdc, 0x013b2538, 0x0263c6d2, 0x023eed20, 0x007319d1, 0x0126064c, 0x01ea14c4, 0x000bbc9d}}}, + {X: Field{[10]uint32{0x03ad8af5, 0x010f5e97, 0x0101dafc, 0x004b1a5e, 0x01adddc5, 0x03fe32a6, 0x01615c45, 0x028f2684, 0x003126ba, 0x001929c2}}, Y: Field{[10]uint32{0x02fe29d5, 0x014f9c2a, 0x0342c432, 0x0128a23d, 0x00148efe, 0x02ec5e5a, 0x0245c354, 0x017dab0e, 0x008b59a6, 0x002e90f1}}}, + {X: Field{[10]uint32{0x01438e06, 0x02d1ea97, 0x0268051d, 0x033ed3d5, 0x0363559a, 0x00598917, 0x03785e2e, 0x023892cb, 0x026e82ff, 0x003f6f41}}, Y: Field{[10]uint32{0x02973d63, 0x038aa104, 0x03def144, 0x0356c905, 0x02875731, 0x022e5267, 0x02a5d382, 0x036308dd, 0x01cfa19e, 0x0001836b}}}, + {X: Field{[10]uint32{0x02ad174f, 0x009bd07b, 0x03e0af1b, 0x033cb72c, 0x0282cf15, 0x02518544, 0x01dba01d, 0x001cc467, 0x00b81ff9, 0x002ca1f3}}, Y: Field{[10]uint32{0x0374e090, 0x02f7027e, 0x01bd1acf, 0x02af000e, 0x0236d1be, 0x036d9bb4, 0x038a4635, 0x002fb92c, 0x03397a9a, 0x001bfc54}}}, + {X: Field{[10]uint32{0x01068116, 0x035735ff, 0x02c3c962, 0x015c06f7, 0x033b3f84, 0x02cc0cbe, 0x01f21888, 0x00d293e9, 0x0248b652, 0x0006011e}}, Y: Field{[10]uint32{0x0224574b, 0x01385681, 0x0117b1f3, 0x00244068, 0x01801342, 0x033a95a0, 0x02c54446, 0x0220c8c1, 0x02691819, 0x0004d89d}}}, + {X: Field{[10]uint32{0x0235f914, 0x01f9ea00, 0x02aae0ce, 0x03a56f52, 0x026b74ff, 0x0290784d, 0x022dd328, 0x00b39622, 0x014fbe4e, 0x003c74ed}}, Y: Field{[10]uint32{0x00a3981a, 0x03589dea, 0x0233be86, 0x01965fbf, 0x02c0c211, 0x0212188c, 0x02e1471e, 0x0205fad2, 0x0141300e, 0x000df097}}}, + {X: Field{[10]uint32{0x013bec4a, 0x00e8db61, 0x02a839ce, 0x00db1788, 0x019770da, 0x0042b55b, 0x03509a60, 0x037eadff, 0x01e95046, 0x0026c36a}}, Y: Field{[10]uint32{0x00135faa, 0x01dd40ce, 0x024d96da, 0x006468a4, 0x03df757c, 0x010e0a73, 0x00bbc3ff, 0x0168dba0, 0x034530c2, 0x0009f580}}}, + {X: Field{[10]uint32{0x0099c5cc, 0x03635976, 0x025f9f13, 0x0093cbad, 0x022d3e4d, 0x01c5d5a3, 0x0255d403, 0x03462c2f, 0x03d95155, 0x003420ce}}, Y: Field{[10]uint32{0x024741e8, 0x01cef265, 0x01de13c4, 0x020bb13a, 0x02ffeefb, 0x01b6dc51, 0x03b1e4c5, 0x012ad447, 0x02c3b504, 0x0039426b}}}, + {X: Field{[10]uint32{0x03c37117, 0x00ca788b, 0x038a626c, 0x01885f27, 0x03ed62ad, 0x01e6039a, 0x0201b402, 0x005f90a2, 0x027c185f, 0x00231058}}, Y: Field{[10]uint32{0x023662f7, 0x016dee4e, 0x01ca77d9, 0x01071ccb, 0x02a36da4, 0x020fdcfb, 0x028a1e74, 0x029548df, 0x026c3316, 0x001d7288}}}, + {X: Field{[10]uint32{0x03728d27, 0x018a0ec9, 0x0311e7cc, 0x01b96d42, 0x002d75c2, 0x0284ee5f, 0x007099e9, 0x02a8c173, 0x0105e43a, 0x000dc7c0}}, Y: Field{[10]uint32{0x02b3ce99, 0x00ee031a, 0x0149b029, 0x009b3b7c, 0x01b11944, 0x0114e3ab, 0x00643120, 0x01b5a233, 0x03e7d097, 0x00325a76}}}, + {X: Field{[10]uint32{0x00cb1710, 0x03fef70b, 0x03e03541, 0x020dea3c, 0x02d94aeb, 0x01761930, 0x034d3a18, 0x028d63e2, 0x019a4238, 0x001440bd}}, Y: Field{[10]uint32{0x01ef1445, 0x008824e1, 0x016ce915, 0x030e27a6, 0x010bbffd, 0x035072af, 0x0130606c, 0x00f0fd33, 0x00f9adb6, 0x00278531}}}, + {X: Field{[10]uint32{0x03f08beb, 0x00aea9c7, 0x00cc26df, 0x02bef52a, 0x00a7f57e, 0x00d858bc, 0x00353c78, 0x0100f01e, 0x036cfd40, 0x00032886}}, Y: Field{[10]uint32{0x037f12f9, 0x038f9607, 0x03ffee6a, 0x02085092, 0x03d6b684, 0x0147b6c3, 0x019f2ef7, 0x02956cff, 0x004647eb, 0x0004228f}}}, + {X: Field{[10]uint32{0x01d775d9, 0x0139a28c, 0x007697c9, 0x00b2b310, 0x017ec364, 0x00038f72, 0x0368bc82, 0x034673a0, 0x00b3ff40, 0x00367351}}, Y: Field{[10]uint32{0x005f0901, 0x03257ad2, 0x033cb085, 0x006d6eaf, 0x03fd7c4a, 0x01e7792b, 0x00f71010, 0x03dc0753, 0x036c683e, 0x002dadbe}}}, + {X: Field{[10]uint32{0x01a10360, 0x02f7d105, 0x021e104f, 0x0020ff31, 0x00510da5, 0x006f5241, 0x01644267, 0x01a222ed, 0x00b2cbcb, 0x002684d5}}, Y: Field{[10]uint32{0x034f953a, 0x03a2e0a1, 0x01b9b710, 0x03ce0776, 0x03bc4927, 0x00f8900d, 0x023a2a89, 0x0122d136, 0x0291707c, 0x000fd7d4}}}, + {X: Field{[10]uint32{0x010fdf79, 0x002ae76b, 0x02941bd5, 0x0314e1a4, 0x0220fc60, 0x03ac3f6f, 0x03deb0bc, 0x020712b9, 0x020f271a, 0x00317957}}, Y: Field{[10]uint32{0x01c83a63, 0x001ddbff, 0x000aecb1, 0x01f5c228, 0x0285ed9e, 0x018aba4e, 0x0253e7cc, 0x024c041e, 0x0335eab4, 0x0004e283}}}, + {X: Field{[10]uint32{0x0060f919, 0x0012bb64, 0x012c69a0, 0x01c81667, 0x027c67ea, 0x03317d98, 0x010e4dc6, 0x02f4f48a, 0x03647f66, 0x0017af0b}}, Y: Field{[10]uint32{0x0054659c, 0x0265b582, 0x00f1e56e, 0x0182c432, 0x033ec1e8, 0x014da58d, 0x00f79206, 0x0217889f, 0x03cedf20, 0x001a3df6}}}, + {X: Field{[10]uint32{0x03966e03, 0x0041d733, 0x00b2da42, 0x02074e96, 0x00161d70, 0x029e7258, 0x011a5a79, 0x00374141, 0x039c7d06, 0x0013ca3a}}, Y: Field{[10]uint32{0x0267fafc, 0x03cf8174, 0x02a6c2ef, 0x00f4b3c4, 0x0044849f, 0x028abf9e, 0x02aeb8e4, 0x011d06ec, 0x00610543, 0x003b0de2}}}, + {X: Field{[10]uint32{0x0283fe8f, 0x0056d286, 0x005c0efe, 0x03b95fb2, 0x019fa039, 0x002cd1f2, 0x00c7a9a1, 0x00f82614, 0x00d1ce11, 0x003d4388}}, Y: Field{[10]uint32{0x02e975be, 0x026ff0fe, 0x00aa94db, 0x01e09f55, 0x00cee464, 0x00501fc8, 0x018595f6, 0x01068a08, 0x023190df, 0x00136df0}}}, + {X: Field{[10]uint32{0x03eff5ef, 0x021068ea, 0x01e76ab2, 0x01735092, 0x0079de94, 0x015620af, 0x038cdf2b, 0x02ae5775, 0x02d01ade, 0x003339ac}}, Y: Field{[10]uint32{0x00626e52, 0x0109f94d, 0x02bd5604, 0x02be7e89, 0x01bab1db, 0x0182c6f5, 0x03764bb5, 0x00502bf7, 0x02741312, 0x00075a41}}}, + {X: Field{[10]uint32{0x032d8475, 0x003b5ba7, 0x03bbfbc8, 0x0394b4d2, 0x01e4830b, 0x016bf3b0, 0x00c73121, 0x0155f4bb, 0x0174fb10, 0x00156994}}, Y: Field{[10]uint32{0x038012c0, 0x032245c9, 0x03eec611, 0x03539cd4, 0x023f0623, 0x01524e01, 0x00dd4126, 0x014dea5c, 0x01f1de1e, 0x0031a5e5}}}, + {X: Field{[10]uint32{0x0127f290, 0x03b4a298, 0x00ab0267, 0x0065d965, 0x02d0c1d8, 0x01eb2351, 0x022779e9, 0x02cf71f8, 0x00fa7b4d, 0x001e0887}}, Y: Field{[10]uint32{0x03c46a54, 0x014fa432, 0x00b663ad, 0x0030b8d6, 0x02ace066, 0x03aad594, 0x003a1582, 0x02318922, 0x01edfd8e, 0x00237735}}}, + {X: Field{[10]uint32{0x006ed178, 0x00b5bea6, 0x03f9602b, 0x038a3e4b, 0x009006cc, 0x00041e0b, 0x00da39d6, 0x0390d3b5, 0x0039441e, 0x0026e614}}, Y: Field{[10]uint32{0x02c6cfa4, 0x0397e704, 0x003bb85f, 0x0385cfc0, 0x028a50da, 0x0364e230, 0x03f67d22, 0x01ecade2, 0x01c87b53, 0x003873e1}}}, + {X: Field{[10]uint32{0x037edf20, 0x027c8103, 0x004f38ae, 0x02c0a477, 0x026c27e7, 0x026d9d5e, 0x01b9d78d, 0x0123795f, 0x03b14a9e, 0x0026a8bf}}, Y: Field{[10]uint32{0x037d1040, 0x022dfd8d, 0x00a115ff, 0x03549dcb, 0x018f80d7, 0x0164a54b, 0x00066ef8, 0x03de53f8, 0x03e378e0, 0x001dc71e}}}, + {X: Field{[10]uint32{0x02937e1f, 0x0166a271, 0x02c021e3, 0x0145b603, 0x00949de2, 0x00248a83, 0x00510cb4, 0x02d18c5f, 0x008366a0, 0x00344164}}, Y: Field{[10]uint32{0x02c8630e, 0x0105517e, 0x000ac99c, 0x00bebb1e, 0x020e5e6f, 0x03117836, 0x017155c0, 0x011052a2, 0x0225c9ea, 0x0021014e}}}, + {X: Field{[10]uint32{0x01c5d066, 0x028bfc7e, 0x027c23e7, 0x03671c2e, 0x031ac58a, 0x00aa07df, 0x01c2d810, 0x02612bfb, 0x02cf7456, 0x0007cfb2}}, Y: Field{[10]uint32{0x01a23e54, 0x00d7601c, 0x00d94cd4, 0x018b83e6, 0x0015f1f3, 0x0085a07e, 0x034539ef, 0x0093c5cf, 0x00fa2bfd, 0x0031ab76}}}, + {X: Field{[10]uint32{0x022c4371, 0x03372836, 0x024fe569, 0x001bacd4, 0x035e504d, 0x01b23e51, 0x0151ece8, 0x0032b495, 0x0309a16d, 0x0028c4b1}}, Y: Field{[10]uint32{0x03ae7b03, 0x01e00e6c, 0x039690c7, 0x00a6b1ef, 0x0008c1fc, 0x01ad6ee1, 0x009ea2c6, 0x03176882, 0x002aea04, 0x002197b3}}}, + {X: Field{[10]uint32{0x004197af, 0x03ccbd9d, 0x0169d953, 0x036c405f, 0x008c3493, 0x030bbb4e, 0x00f64109, 0x02e9e3ef, 0x0275e829, 0x003c8711}}, Y: Field{[10]uint32{0x018b2f57, 0x03dd2b42, 0x03ef2b37, 0x01cd20b4, 0x01043d93, 0x028dec0f, 0x030ee061, 0x01f2bd76, 0x033e4337, 0x003f4b19}}}, + {X: Field{[10]uint32{0x00865692, 0x03b5f006, 0x014268fe, 0x00ce9cef, 0x01f48369, 0x02146acc, 0x00b2eb61, 0x02680bef, 0x00ea2a02, 0x0004585d}}, Y: Field{[10]uint32{0x030aaefd, 0x01cb5375, 0x00352ee7, 0x015512d9, 0x0125cf38, 0x01bd7475, 0x03ca2a2d, 0x02b676d7, 0x0027e1ce, 0x000848f4}}}, + {X: Field{[10]uint32{0x03f9d663, 0x00cd7e9c, 0x0260a962, 0x0343d79f, 0x022334fc, 0x015f9cb5, 0x00a21173, 0x0131b3d9, 0x03d0919e, 0x000d639d}}, Y: Field{[10]uint32{0x0037bc08, 0x02dbad9e, 0x020cb8b5, 0x02be821a, 0x03dcf5cd, 0x0222b1f3, 0x03819859, 0x03d00c41, 0x02206f99, 0x001fbe35}}}, + {X: Field{[10]uint32{0x02a33fa9, 0x031b6aae, 0x0060db86, 0x02cea04d, 0x008056de, 0x00597eab, 0x0157e203, 0x03c518e4, 0x020d9e81, 0x001427df}}, Y: Field{[10]uint32{0x00db6ea9, 0x016e34a8, 0x03090a09, 0x017f0eff, 0x03fd1216, 0x00fc6b4e, 0x028645f9, 0x02db139a, 0x021a340e, 0x00154523}}}, + {X: Field{[10]uint32{0x02a4ed09, 0x031f9ab4, 0x020b9ad9, 0x02f50e00, 0x00a15c95, 0x00d1bc87, 0x01e30c49, 0x0038987a, 0x025c185f, 0x000d638c}}, Y: Field{[10]uint32{0x0118c4b8, 0x026d97cb, 0x01b3d97f, 0x02f4d1e2, 0x0154aa11, 0x02cf5861, 0x02ef6903, 0x0056ca04, 0x0074c977, 0x00017f30}}}, + {X: Field{[10]uint32{0x01a2fc4c, 0x00daf8f7, 0x00d2608d, 0x00411e24, 0x02e314c3, 0x00962780, 0x0337e4ea, 0x02bcb4df, 0x012dbc00, 0x0007871c}}, Y: Field{[10]uint32{0x010655dc, 0x02c7da92, 0x00c145bf, 0x01d410b5, 0x03974e7e, 0x034c2ce2, 0x0398cf5a, 0x01aef8d9, 0x039ae313, 0x00012263}}}, + {X: Field{[10]uint32{0x03ffcd1d, 0x025ed5c8, 0x03918bd7, 0x0081cd86, 0x0064e317, 0x0202a564, 0x03b794dc, 0x01e6c3fc, 0x039aaa3f, 0x0029945b}}, Y: Field{[10]uint32{0x0254f5d4, 0x0140c00e, 0x00f9bed5, 0x0373af6f, 0x02812373, 0x01f1f0c4, 0x0377b074, 0x02e0c14f, 0x006b59f3, 0x003164d3}}}, + {X: Field{[10]uint32{0x01098155, 0x00046e2c, 0x01b79295, 0x00cf6966, 0x0150cb56, 0x00c1111a, 0x03ab8240, 0x006e12e7, 0x00d88b1e, 0x00391ad2}}, Y: Field{[10]uint32{0x00c94f51, 0x01e4d96c, 0x00a80a5d, 0x02033654, 0x003e7c8a, 0x0165d0d4, 0x002e5512, 0x0265db8d, 0x02244a33, 0x0010fa6e}}}, + {X: Field{[10]uint32{0x0365aa0b, 0x00cdc34f, 0x03400e58, 0x01000489, 0x00e1cc2d, 0x037e79c5, 0x025105b1, 0x030b8018, 0x009997a9, 0x00329e94}}, Y: Field{[10]uint32{0x02e1f071, 0x007abf99, 0x02039b7a, 0x011334b3, 0x0319c618, 0x03df2c3b, 0x01994fce, 0x03346883, 0x00e4d2ee, 0x00376329}}}, + {X: Field{[10]uint32{0x02313f08, 0x003561a5, 0x02d0da39, 0x027bb007, 0x00848659, 0x01de1b10, 0x01352d4b, 0x015dbc44, 0x02c0d29b, 0x000c9ad7}}, Y: Field{[10]uint32{0x0011d384, 0x020a2a04, 0x0126495e, 0x0280f693, 0x01c2d5d3, 0x0356ca83, 0x02a60633, 0x01952f9e, 0x0171a4ac, 0x003d28fc}}}, + {X: Field{[10]uint32{0x030d306d, 0x024c8a39, 0x03e2b392, 0x03bb944b, 0x017c5bf8, 0x03fa6eb6, 0x017038db, 0x031d6a95, 0x018254f5, 0x0002dd8a}}, Y: Field{[10]uint32{0x003606c5, 0x036cf6c5, 0x016fbf92, 0x01d4e612, 0x020cc85c, 0x035f7a2f, 0x035bb2d0, 0x00fa18b1, 0x039fb36e, 0x0022e023}}}, + {X: Field{[10]uint32{0x032286ca, 0x026886e1, 0x014f5ef7, 0x0295e419, 0x03ae66f1, 0x03c6a046, 0x0250a096, 0x00dbff77, 0x00e12b1d, 0x0022f589}}, Y: Field{[10]uint32{0x011f02df, 0x02e015eb, 0x004d0fe9, 0x02885c15, 0x038bf6a2, 0x01108d2b, 0x0331c747, 0x022586d9, 0x022ef453, 0x0019a1fa}}}, + {X: Field{[10]uint32{0x01de48a9, 0x02349741, 0x03da42d7, 0x00cf555c, 0x01509d1c, 0x03e11b19, 0x01414ccc, 0x024a402f, 0x02c72a9f, 0x003b497a}}, Y: Field{[10]uint32{0x00d89eaa, 0x0287ad40, 0x028b98f3, 0x03407dce, 0x018705a9, 0x020b35ef, 0x011583c6, 0x03f40edb, 0x01ed2710, 0x00155bea}}}, + {X: Field{[10]uint32{0x00bc02bf, 0x012e79c2, 0x000600df, 0x030778a0, 0x000e8fac, 0x01d57ecc, 0x027bc94c, 0x01aa1271, 0x036c9ed7, 0x003c650e}}, Y: Field{[10]uint32{0x002a40a7, 0x023295a2, 0x004b0481, 0x00cb7c7e, 0x03a31562, 0x00b2e1db, 0x00bb6464, 0x01383dab, 0x020885dc, 0x002631ee}}}, + {X: Field{[10]uint32{0x01e9e5d3, 0x01460ca9, 0x02f391d3, 0x0085ab23, 0x03834228, 0x033b6b9e, 0x0024276d, 0x02ae3ec3, 0x03142de3, 0x00316d82}}, Y: Field{[10]uint32{0x02b5cd69, 0x00ab37e7, 0x01260e91, 0x01e381f0, 0x02332595, 0x00535297, 0x01e10d90, 0x039827d5, 0x00da1174, 0x0033a1b9}}}, + {X: Field{[10]uint32{0x013755ab, 0x00b10252, 0x014f592e, 0x000305a3, 0x01c77782, 0x014fe678, 0x019647b2, 0x03f98ccd, 0x038e706c, 0x0002c198}}, Y: Field{[10]uint32{0x0344bbd5, 0x0228e0f2, 0x0369d3e8, 0x01ee1f9f, 0x03e16dd3, 0x027e54d5, 0x02e24933, 0x0148a44d, 0x03ab1b4d, 0x00399007}}}, + {X: Field{[10]uint32{0x024b14cf, 0x00e6df49, 0x03cd89f5, 0x0391a052, 0x03f0ec5f, 0x00cbe958, 0x0250ea54, 0x02b3f4a5, 0x01b5486d, 0x0033be30}}, Y: Field{[10]uint32{0x025a2fcf, 0x01aab046, 0x0166c931, 0x00aac94b, 0x015ed4fd, 0x01875ca0, 0x00939ea7, 0x002f8c00, 0x02c18d0b, 0x00020330}}}, + {X: Field{[10]uint32{0x0385d7ce, 0x011b6892, 0x014f38e5, 0x01009a5d, 0x0162defb, 0x00662c70, 0x00dccac4, 0x03ca857f, 0x004df868, 0x003d85a4}}, Y: Field{[10]uint32{0x038255b3, 0x0098ce9e, 0x023e47f6, 0x00deabab, 0x03de8b4d, 0x01cecc73, 0x03b93e0b, 0x009327c2, 0x00123440, 0x003ee5c4}}}, + {X: Field{[10]uint32{0x018632e3, 0x03d8b0fe, 0x02599a59, 0x0397b602, 0x011613d8, 0x000bfbd3, 0x02516979, 0x0129ecce, 0x0144bc7e, 0x0025ce18}}, Y: Field{[10]uint32{0x00fc16b4, 0x001b4d83, 0x03b6a5a8, 0x0196e9e6, 0x0308e560, 0x010c6bc9, 0x01834a95, 0x0264e4b7, 0x01845842, 0x002f44b5}}}, + {X: Field{[10]uint32{0x030200c8, 0x03390dee, 0x0311b551, 0x03701584, 0x011eb08d, 0x0195ac9e, 0x003a56f6, 0x03e803d0, 0x030c7a70, 0x00251bc4}}, Y: Field{[10]uint32{0x01945b8d, 0x019a5278, 0x0310507a, 0x02529efd, 0x00186d97, 0x02bc15e1, 0x01a923f3, 0x01f981fd, 0x00f6a503, 0x002b35a6}}}, + {X: Field{[10]uint32{0x03929230, 0x0102f730, 0x0287d917, 0x030cd08d, 0x01d5f1af, 0x03034962, 0x038c064f, 0x014ec030, 0x018472c4, 0x003b833c}}, Y: Field{[10]uint32{0x03ff8dc8, 0x01e09927, 0x0191f79c, 0x00a2cdba, 0x008c773c, 0x03289264, 0x014db12f, 0x034e5fa5, 0x035a7fec, 0x003605dd}}}, + {X: Field{[10]uint32{0x01535d7b, 0x018e9ddf, 0x03c21234, 0x0225364e, 0x03ef0072, 0x02ac4a1f, 0x0148b4f4, 0x02961c27, 0x03fe9542, 0x003ccd7d}}, Y: Field{[10]uint32{0x03350283, 0x006140b8, 0x01bf7455, 0x03a69ac6, 0x017639da, 0x023abed3, 0x0389c06d, 0x0174a4d4, 0x01a30246, 0x000cdb92}}}, + {X: Field{[10]uint32{0x017e7739, 0x02c383f2, 0x03f06f0e, 0x01b15675, 0x00b1326d, 0x01daa410, 0x00200d7b, 0x01fe3773, 0x01794fb3, 0x00156fe0}}, Y: Field{[10]uint32{0x03e69bfc, 0x024c28ab, 0x0086632e, 0x0293d274, 0x013053f6, 0x01f5c0fb, 0x002ade6f, 0x017307a4, 0x03007915, 0x00328cf3}}}, + {X: Field{[10]uint32{0x01de29b0, 0x01f5bd8a, 0x0062349b, 0x0004bf83, 0x031033b9, 0x02edb650, 0x022195fa, 0x0369197b, 0x03816143, 0x0037ff33}}, Y: Field{[10]uint32{0x00f0aff7, 0x01d6e71d, 0x0190bbfe, 0x02757f7b, 0x00c04bc3, 0x02178562, 0x029fc06f, 0x012b9f70, 0x03f6e1dc, 0x0026ff7c}}}, + {X: Field{[10]uint32{0x0139dec3, 0x039f608d, 0x0177f3c5, 0x0044ba3d, 0x02c435bc, 0x0155aec4, 0x01c1395b, 0x01be8bf9, 0x009425fc, 0x002e5d23}}, Y: Field{[10]uint32{0x014007a2, 0x032a2a32, 0x016e3dfa, 0x02f18eaa, 0x00f76d31, 0x0354507b, 0x016b2336, 0x0348ed7a, 0x03b2b995, 0x003d48e2}}}, + {X: Field{[10]uint32{0x0297f7ca, 0x00561e2b, 0x039a3fb6, 0x0397e9a8, 0x022c5349, 0x03d4ab66, 0x0329e335, 0x02c55ce3, 0x0054e951, 0x0024b10f}}, Y: Field{[10]uint32{0x012b4a17, 0x02c06558, 0x022bf71b, 0x01e75a29, 0x02bdc4ae, 0x00d92d8a, 0x00924fc6, 0x006f28c2, 0x0373dedd, 0x001f1e9a}}}, + {X: Field{[10]uint32{0x021eb272, 0x02d9ac34, 0x02d96040, 0x03a7d1c9, 0x035677af, 0x01e96248, 0x01ef139d, 0x017957b8, 0x03ea2599, 0x0002c64d}}, Y: Field{[10]uint32{0x03043dd6, 0x024c6033, 0x019195a9, 0x000ea3aa, 0x005585c5, 0x03911253, 0x003e0ca5, 0x031f3f9b, 0x0257544a, 0x00343e56}}}, + {X: Field{[10]uint32{0x0133f457, 0x01b601f0, 0x01fc94a4, 0x01ea3443, 0x00e2a504, 0x00026de2, 0x005a6b72, 0x03892caf, 0x024dbd7e, 0x000b0735}}, Y: Field{[10]uint32{0x020aabe3, 0x01a12dd9, 0x0230cfd8, 0x03ea7a73, 0x027a9449, 0x0179a209, 0x0031a1f0, 0x01e92f9f, 0x03dfce7d, 0x003fa298}}}, + {X: Field{[10]uint32{0x01004834, 0x03d4ff11, 0x014ed447, 0x01a1b321, 0x026d5443, 0x002900f5, 0x0030649b, 0x02a28ada, 0x0278be6e, 0x0013fc42}}, Y: Field{[10]uint32{0x018765d8, 0x00b4a1f9, 0x018bdb36, 0x035ca3d7, 0x01e43384, 0x0138b6c3, 0x001cf5bf, 0x001658ba, 0x00c356d5, 0x002cf2cc}}}, + {X: Field{[10]uint32{0x003d28de, 0x000d563d, 0x0344d9da, 0x0320145c, 0x01f877e8, 0x031c5164, 0x00a7c2a0, 0x01996ad8, 0x03666c90, 0x000cfd56}}, Y: Field{[10]uint32{0x015163f6, 0x0293d90b, 0x01ce08c2, 0x0150e17b, 0x02af1467, 0x024e4c68, 0x020ea80c, 0x017b562b, 0x00ab6aa9, 0x000e6612}}}, + {X: Field{[10]uint32{0x000d3e04, 0x0221eacd, 0x02636020, 0x01b56216, 0x02408da6, 0x03fcb5af, 0x037cc150, 0x00dfac62, 0x03595a72, 0x002e5c48}}, Y: Field{[10]uint32{0x0272363a, 0x01e22cef, 0x00ead817, 0x0223ea1f, 0x02dd125f, 0x031a4c51, 0x03f0ab8f, 0x0316906c, 0x03bd643a, 0x0028a0e8}}}, + {X: Field{[10]uint32{0x00a1035b, 0x0297f058, 0x00dccf0b, 0x02953661, 0x035a4204, 0x03fdcce3, 0x002c1e9f, 0x0250d7d8, 0x00676efa, 0x003483e4}}, Y: Field{[10]uint32{0x03404139, 0x02b9dee3, 0x0086f3fa, 0x01bd9915, 0x01ca1af2, 0x028c545d, 0x004406ce, 0x000fe1c9, 0x007a4520, 0x002b0e8f}}}, + {X: Field{[10]uint32{0x02f41f2d, 0x0252d4ff, 0x02ef54e2, 0x03800fb8, 0x0281d8b3, 0x001cb864, 0x00b2d0bd, 0x027c3511, 0x02a3157c, 0x000c8b5b}}, Y: Field{[10]uint32{0x012936b3, 0x0166d37e, 0x03a97ec3, 0x03dba98a, 0x026e096d, 0x0298e310, 0x02a9e676, 0x00b7799d, 0x03f19dc1, 0x0020e051}}}, + {X: Field{[10]uint32{0x020c26d5, 0x027b67be, 0x024cf8f2, 0x032e52ab, 0x011d2bfa, 0x02b802c3, 0x0164ea7b, 0x0106dadd, 0x00080683, 0x00256497}}, Y: Field{[10]uint32{0x02b92130, 0x01bdfe1d, 0x006d02b4, 0x03f2f749, 0x00edf14c, 0x0081f0bb, 0x015557b2, 0x0088cb09, 0x01b91315, 0x000318fb}}}, + {X: Field{[10]uint32{0x011f70af, 0x03b86f4f, 0x01664c06, 0x00b4f692, 0x03517a71, 0x00e64f35, 0x03fba71e, 0x00637684, 0x02b5d436, 0x001d64aa}}, Y: Field{[10]uint32{0x02eaa410, 0x0274e185, 0x01b457d7, 0x02ba5de8, 0x027a9222, 0x033ea2ac, 0x000aef1c, 0x00a1356b, 0x0077af74, 0x001553ba}}}, + {X: Field{[10]uint32{0x0209e0eb, 0x03669644, 0x03503671, 0x0129814f, 0x00806257, 0x02ce45a0, 0x031ad311, 0x02dc7e18, 0x018be13e, 0x003b674a}}, Y: Field{[10]uint32{0x0185c3cb, 0x02e86e27, 0x02b6fe54, 0x03f35403, 0x017b479e, 0x03d0361f, 0x007caa30, 0x0221b668, 0x03c0dab8, 0x0025ea6a}}}, + {X: Field{[10]uint32{0x02355fad, 0x039250be, 0x01fcb9f8, 0x028bff0e, 0x0378ae69, 0x002351a6, 0x028daf33, 0x002f0ef4, 0x0236a590, 0x00337fbd}}, Y: Field{[10]uint32{0x020db6d7, 0x02039194, 0x02d5179f, 0x0314de3c, 0x02f4f6c7, 0x024581ea, 0x02a1c255, 0x03bd3a91, 0x03cc54c0, 0x003e0ce3}}}, + {X: Field{[10]uint32{0x0149db49, 0x014b9a9e, 0x035848ca, 0x00f5a961, 0x03dbc094, 0x01b67d76, 0x03a8fc42, 0x02f5ab29, 0x03220ca3, 0x003d8e33}}, Y: Field{[10]uint32{0x01675295, 0x02478290, 0x03732f36, 0x009a7f47, 0x01653a79, 0x03565450, 0x03490039, 0x03aade42, 0x03dd8309, 0x0015a899}}}, + {X: Field{[10]uint32{0x0314bd1c, 0x01e8ac63, 0x02e1e638, 0x00eaf250, 0x037a6616, 0x018e482c, 0x0076cab1, 0x010fd40f, 0x02f29b1e, 0x0010d03f}}, Y: Field{[10]uint32{0x032210a0, 0x00af0ae0, 0x01eb6ad6, 0x00562eee, 0x0159ff2f, 0x01bdea77, 0x00908f0b, 0x034d4f1b, 0x002d6889, 0x000b569e}}}, + {X: Field{[10]uint32{0x01b80991, 0x0208bc6a, 0x01a30bf2, 0x025b1bb4, 0x001aa832, 0x03bae09b, 0x012c01fb, 0x036c4c33, 0x028005e3, 0x001e2be1}}, Y: Field{[10]uint32{0x008c3725, 0x0106bd89, 0x02a2a49d, 0x03761881, 0x01ec458c, 0x02e53e0d, 0x000d95b6, 0x033a449a, 0x023637a6, 0x000671f2}}}, + {X: Field{[10]uint32{0x01c41ef4, 0x00ab8472, 0x02d4958a, 0x01e4e2e5, 0x01720642, 0x00ecf558, 0x02831c01, 0x02fbdd52, 0x010fe6a4, 0x00361f96}}, Y: Field{[10]uint32{0x021d1dc6, 0x02d02e6f, 0x016b3e30, 0x0286d422, 0x0353b97a, 0x023b53af, 0x03ff97ff, 0x00d227c7, 0x013ac9b4, 0x000e4a2a}}}, + {X: Field{[10]uint32{0x01c54c32, 0x02a111b7, 0x00a7f630, 0x01a4656e, 0x0285ea85, 0x002e41db, 0x015cfd0a, 0x011fa505, 0x01f369c5, 0x002d6746}}, Y: Field{[10]uint32{0x02661865, 0x03fc2176, 0x00357f81, 0x01fb1129, 0x032d5082, 0x02058b17, 0x0383d552, 0x02af838a, 0x008affe7, 0x002e3d56}}}, + {X: Field{[10]uint32{0x00f3ee78, 0x00f4c318, 0x0143a6d8, 0x02f57abd, 0x03662726, 0x007050ea, 0x02a64cd8, 0x026c000e, 0x03da7cd5, 0x000d3d90}}, Y: Field{[10]uint32{0x00501ee8, 0x001111bd, 0x03b22d52, 0x0078fe91, 0x0291906c, 0x00fb968d, 0x00bd29b0, 0x03d5cd68, 0x00f291a7, 0x001055d3}}}, + {X: Field{[10]uint32{0x033dbbf3, 0x00e57588, 0x01b4ecac, 0x03d5ac17, 0x00fd007b, 0x030c725a, 0x0378757d, 0x027790cf, 0x03d0583e, 0x0015bbcd}}, Y: Field{[10]uint32{0x035c9286, 0x0052e6b7, 0x0229a92c, 0x037ee7a5, 0x02ba8cb5, 0x00ee853a, 0x02e28075, 0x0263e442, 0x001ab5c8, 0x00285038}}}, + {X: Field{[10]uint32{0x01c957d7, 0x037402bb, 0x00fc87e3, 0x01d9e115, 0x02fc54dd, 0x00e97750, 0x039ca5cb, 0x015a2c44, 0x0334815b, 0x0000790f}}, Y: Field{[10]uint32{0x02334cc8, 0x01c93ddf, 0x0302c85d, 0x03eb410c, 0x008e947a, 0x01370af7, 0x0282d9e6, 0x03b881e2, 0x0274ac96, 0x001730e0}}}, + {X: Field{[10]uint32{0x0339a952, 0x00c18bf0, 0x00eabad9, 0x020a63de, 0x01f8b06c, 0x03606df7, 0x029046d3, 0x036df366, 0x024935d2, 0x000339e7}}, Y: Field{[10]uint32{0x004f9686, 0x0282286e, 0x01dc7fff, 0x03d7f701, 0x038765c8, 0x02f0f3d6, 0x018c4943, 0x0189a96b, 0x02ee1b90, 0x003f0bdb}}}, + {X: Field{[10]uint32{0x02fe4fd9, 0x01030c61, 0x00e2c76c, 0x030d2cf7, 0x00f6766c, 0x0068033e, 0x00c3365e, 0x00b099c3, 0x0004ca86, 0x002d0512}}, Y: Field{[10]uint32{0x01b2219c, 0x016e6b54, 0x004b8717, 0x02ad78a8, 0x0029cbda, 0x00e803f5, 0x03752f00, 0x01b8028f, 0x021fca9b, 0x00390da2}}}, + {X: Field{[10]uint32{0x034fd39f, 0x00750887, 0x006a70b7, 0x007b06f1, 0x01541634, 0x03b5274e, 0x039cf65c, 0x03e09239, 0x03247406, 0x003aa8a5}}, Y: Field{[10]uint32{0x017c14a6, 0x0374a2ea, 0x01d46248, 0x033c0e28, 0x02d0d4b6, 0x01788610, 0x00d99328, 0x01730f79, 0x001be3b7, 0x001a39fe}}}, + {X: Field{[10]uint32{0x00f5b6a5, 0x00bb140c, 0x02999e7a, 0x0327d0b1, 0x02eb7371, 0x0372ff1c, 0x00c6caa3, 0x0222f0ee, 0x00ff1f72, 0x00138b44}}, Y: Field{[10]uint32{0x025a8774, 0x020803c2, 0x00f82be8, 0x03d7ad9e, 0x006ba793, 0x03905f40, 0x03515ca3, 0x013ec2a4, 0x005cdf2a, 0x001a368f}}}, + {X: Field{[10]uint32{0x030659f1, 0x02776888, 0x01adce00, 0x025115f0, 0x007d073b, 0x019f0a25, 0x00a4b45c, 0x03b258aa, 0x01e1114d, 0x0020d3c8}}, Y: Field{[10]uint32{0x01adc89c, 0x02b1fec9, 0x00a6ef78, 0x036d8c83, 0x0339263a, 0x001299f0, 0x03acb27d, 0x028280bd, 0x01b6edb5, 0x003a7e98}}}, + {X: Field{[10]uint32{0x00c7d0c7, 0x01c4e78c, 0x00381ece, 0x0367e6f7, 0x01c43cae, 0x034f5a3f, 0x03268d7c, 0x011156a5, 0x00aca0a6, 0x002a12d1}}, Y: Field{[10]uint32{0x03bf6b74, 0x02bc9642, 0x00d6da05, 0x01e4e20b, 0x03d12678, 0x02466bde, 0x03bde43f, 0x000aef4b, 0x033b74e7, 0x000be40f}}}, + {X: Field{[10]uint32{0x001d6789, 0x00d207c9, 0x02cbdd41, 0x01f2ed0c, 0x02600cbe, 0x02783e9b, 0x031df66f, 0x02e5dd1e, 0x020698bc, 0x00084867}}, Y: Field{[10]uint32{0x00954055, 0x0346249c, 0x03736aef, 0x02f8c92e, 0x022e6970, 0x02d74c99, 0x017d9688, 0x0061d2a2, 0x00d3c896, 0x001e90e2}}}, + {X: Field{[10]uint32{0x03aeafd4, 0x01ec8be6, 0x03562686, 0x01260a89, 0x017b9465, 0x013d261e, 0x034bbdbe, 0x0333da22, 0x021f93bf, 0x003e9453}}, Y: Field{[10]uint32{0x00f91b74, 0x03c95f69, 0x0330a478, 0x015b09a9, 0x012c2f61, 0x0324c382, 0x0087b518, 0x00ad2a78, 0x02155257, 0x00333520}}}, + {X: Field{[10]uint32{0x01451ffb, 0x03e80b1e, 0x01ffa4ca, 0x03d4fcbf, 0x012204d4, 0x026f630b, 0x0133a4a9, 0x0267c301, 0x03f16430, 0x002d82be}}, Y: Field{[10]uint32{0x0321294b, 0x03bbe2d2, 0x03f43886, 0x0018fbbc, 0x01d321e0, 0x01af69ba, 0x00b3bd27, 0x02649b35, 0x03901a02, 0x0003fb63}}}, + {X: Field{[10]uint32{0x03ed76cd, 0x02143a29, 0x00defc74, 0x0194e71b, 0x0017c2b7, 0x0151a53a, 0x02fcca65, 0x038d2a1b, 0x01a3196c, 0x003ca73e}}, Y: Field{[10]uint32{0x00c9c5f7, 0x0044a7e2, 0x028f6247, 0x01de6547, 0x00994b29, 0x036d6eb3, 0x03f1bf62, 0x00cf3ecd, 0x023af7c3, 0x00144c21}}}, + {X: Field{[10]uint32{0x01084e4d, 0x02e49d71, 0x014ed563, 0x0128c889, 0x01d8fe31, 0x00f88fc7, 0x03af34b0, 0x02ff1468, 0x023acb00, 0x00273678}}, Y: Field{[10]uint32{0x0298e1d5, 0x01bf1384, 0x0277d4d3, 0x0133e34a, 0x014f31bd, 0x01ecc5c1, 0x01d6c1a1, 0x029c4054, 0x035cc66e, 0x003b3c08}}}, + {X: Field{[10]uint32{0x02e5d65c, 0x00edbd7d, 0x025bff3d, 0x0246acac, 0x0218ed66, 0x0395a8a0, 0x02d99a6b, 0x00122be5, 0x01b02cfa, 0x0015be22}}, Y: Field{[10]uint32{0x001fe4bc, 0x03a81ec9, 0x00d921b7, 0x00a7a832, 0x01bb8ecc, 0x03723f28, 0x034f8248, 0x01cabfd9, 0x00ea4a23, 0x000d4ac8}}}, + {X: Field{[10]uint32{0x01ff2a08, 0x024daad7, 0x03dea16c, 0x039491af, 0x028e2366, 0x00f7bd55, 0x0169a7dd, 0x0363f05b, 0x02b7f8fa, 0x00378caf}}, Y: Field{[10]uint32{0x009e145f, 0x00013509, 0x01acba7c, 0x0332c378, 0x03eaa216, 0x038997ea, 0x002bd06f, 0x0070891b, 0x011c93a7, 0x0035cc7c}}}, + {X: Field{[10]uint32{0x026ba256, 0x0222578a, 0x02693096, 0x00ebe612, 0x037d12dc, 0x03beab36, 0x03dfa58f, 0x00a76300, 0x01c1dc17, 0x00217b1f}}, Y: Field{[10]uint32{0x024a747c, 0x02c2d166, 0x0041b194, 0x03cae86a, 0x0189e4b9, 0x03ee8c77, 0x00c73b5a, 0x02af2fe6, 0x00af8e9a, 0x00148c0e}}}, + {X: Field{[10]uint32{0x01e2e141, 0x02972bd0, 0x014abe23, 0x0038ac9b, 0x02e22328, 0x00b6e2fd, 0x03f5efe4, 0x023b07b5, 0x01956052, 0x003de522}}, Y: Field{[10]uint32{0x00c6ff98, 0x03f2dee0, 0x012fcdd6, 0x01585b37, 0x0258871e, 0x02a35b67, 0x0037e9fd, 0x007e621a, 0x00e296ed, 0x0027dd65}}}, + {X: Field{[10]uint32{0x03454f10, 0x0267383c, 0x00137621, 0x00eb88a3, 0x02866bd5, 0x0006a4ef, 0x036e8eef, 0x022094f5, 0x03d3b420, 0x0016235b}}, Y: Field{[10]uint32{0x002af573, 0x008a92ed, 0x02d2c6d9, 0x0206b437, 0x0206320b, 0x00c6df8c, 0x03f29ade, 0x00822ee8, 0x02533e41, 0x00297f25}}}, + {X: Field{[10]uint32{0x00cc7443, 0x0108f787, 0x0259c0bf, 0x0253a0d1, 0x03b01db2, 0x025d9dde, 0x0387d4e8, 0x03229d5b, 0x008dbbe5, 0x00061bf8}}, Y: Field{[10]uint32{0x03dfbdc0, 0x01be67a6, 0x01bdca25, 0x009a9912, 0x0229f12e, 0x00d7f432, 0x037a93a4, 0x01e080d0, 0x0139a46f, 0x0036677b}}}, + {X: Field{[10]uint32{0x01bd3d25, 0x01b57796, 0x036bb5a0, 0x02600bd5, 0x022af22e, 0x03b84ccd, 0x03eac38c, 0x02afcced, 0x03083055, 0x00395272}}, Y: Field{[10]uint32{0x01332381, 0x000c971f, 0x005fd4fe, 0x0390d2a5, 0x015ababd, 0x03f0d6b9, 0x001c7f7a, 0x00520d99, 0x0320e7b5, 0x00337cdf}}}, + {X: Field{[10]uint32{0x0224422b, 0x024ce240, 0x006e18ac, 0x01e7d4ea, 0x00b930df, 0x03fa12d6, 0x006108fc, 0x01456172, 0x02fbfd7f, 0x0029390a}}, Y: Field{[10]uint32{0x00ce1e30, 0x011e5800, 0x03e2f1ea, 0x0072efa8, 0x00541e55, 0x024575eb, 0x00d6177f, 0x00c40ad6, 0x021b0396, 0x0003a7e3}}}, + {X: Field{[10]uint32{0x0003dadb, 0x03bf72b6, 0x03d4ed09, 0x02a5c667, 0x004755fb, 0x01dd43e9, 0x009e9cfb, 0x00bd09ac, 0x00444202, 0x0017dfb6}}, Y: Field{[10]uint32{0x0376ffad, 0x0386f74a, 0x01addccb, 0x030e6ff3, 0x00e852d9, 0x02425bc7, 0x01592fcc, 0x023ac272, 0x01edd06a, 0x00024757}}}, + {X: Field{[10]uint32{0x02938d66, 0x038603b0, 0x038f1868, 0x03e42be8, 0x0191dcf7, 0x03d9ef45, 0x033fa223, 0x0193842c, 0x034332f0, 0x000feb11}}, Y: Field{[10]uint32{0x02aabe5c, 0x00f69878, 0x019206f9, 0x003e7a99, 0x03eebf27, 0x0045cc2e, 0x006d10ab, 0x00de64ce, 0x02676b20, 0x00115d13}}}, + {X: Field{[10]uint32{0x037a7aa9, 0x0192f7fe, 0x006b190e, 0x003da863, 0x00d4b10e, 0x01f639e1, 0x00d13df9, 0x034850b9, 0x03fff058, 0x0017ee60}}, Y: Field{[10]uint32{0x01dabd6f, 0x003c69a3, 0x018e8346, 0x020629b5, 0x00ec5811, 0x025ccf5d, 0x0373f73a, 0x0103343a, 0x02018dc5, 0x000cce51}}}, + {X: Field{[10]uint32{0x0341f88a, 0x003d79b7, 0x020e043e, 0x0078674f, 0x009c6e94, 0x02c20d99, 0x015eec1a, 0x00e68b6c, 0x01c30fa9, 0x0002ebcd}}, Y: Field{[10]uint32{0x028e9201, 0x004234bd, 0x01966214, 0x011553fb, 0x019de414, 0x00ee2c1a, 0x02bdc3fe, 0x0286f13b, 0x00d3e53f, 0x0010960f}}}, + {X: Field{[10]uint32{0x009a8602, 0x00128160, 0x01f9a0c7, 0x0366b36e, 0x004266c4, 0x00fecf58, 0x0186183a, 0x01ffc3c7, 0x035aa51e, 0x0025d907}}, Y: Field{[10]uint32{0x019517dd, 0x034ca1eb, 0x0239b5b0, 0x03f51676, 0x031ab169, 0x0073e9e3, 0x0182fc90, 0x02f6fb63, 0x0232aa9f, 0x0004d3fe}}}, + {X: Field{[10]uint32{0x0327292e, 0x031ad549, 0x02a5ee23, 0x03286a1d, 0x03f59feb, 0x02f8170d, 0x01aa8fb4, 0x03db716b, 0x011eacda, 0x0025a8dc}}, Y: Field{[10]uint32{0x01da4392, 0x03b34fe9, 0x00e96b82, 0x008d5840, 0x0134be91, 0x01eb5760, 0x01fce0e6, 0x02eded78, 0x03b9681e, 0x0023ec33}}}, + {X: Field{[10]uint32{0x03154b0a, 0x02ab7bd3, 0x01e2a14f, 0x02c0fa75, 0x029f9f16, 0x004d8c82, 0x01388926, 0x0031b4a3, 0x028b8e54, 0x002b9910}}, Y: Field{[10]uint32{0x00118aeb, 0x01e524ff, 0x002e4d5b, 0x03b5bf9b, 0x03cc68ad, 0x003fd679, 0x02d5193b, 0x01cf36e7, 0x025eb9bf, 0x0036c80b}}}, + {X: Field{[10]uint32{0x00c984fb, 0x00a41d5b, 0x0038d422, 0x03feea1d, 0x03e16424, 0x016d210c, 0x03532cf1, 0x030b0452, 0x02df65c0, 0x000b164c}}, Y: Field{[10]uint32{0x03d29130, 0x028b0931, 0x01e47f59, 0x00a0b3ac, 0x011c6436, 0x022e7fd3, 0x015deec3, 0x02815b4e, 0x00c4b908, 0x000587be}}}, + {X: Field{[10]uint32{0x02ecca3e, 0x0123d55e, 0x02071f9c, 0x0276f1a4, 0x02241538, 0x03aff2ff, 0x0252d563, 0x02e9a460, 0x00786937, 0x001db887}}, Y: Field{[10]uint32{0x0133c8e6, 0x0293bf51, 0x02a77a3f, 0x00a235c6, 0x01ca634d, 0x024c27fa, 0x0361d0d4, 0x01f5878e, 0x02fe9db4, 0x00379de1}}}, + {X: Field{[10]uint32{0x0267900f, 0x01c2016c, 0x00a36eaa, 0x018ff259, 0x02099df3, 0x02bf1a91, 0x020b3466, 0x004e3474, 0x00efca8a, 0x001c5c37}}, Y: Field{[10]uint32{0x00c0bb8d, 0x00db5776, 0x0320303b, 0x039188fe, 0x00440562, 0x021c3e3e, 0x0389f7bf, 0x00515663, 0x0139476f, 0x00065aff}}}, + {X: Field{[10]uint32{0x011b6ccd, 0x001f16da, 0x036f2e69, 0x018b8d60, 0x0361a956, 0x0347a27d, 0x01fb466e, 0x034916a8, 0x02b075bd, 0x00263b77}}, Y: Field{[10]uint32{0x030c91be, 0x02a107d5, 0x02814731, 0x0266aca5, 0x00bdbcdc, 0x00228e8b, 0x002ddc21, 0x0092e327, 0x01f6b591, 0x002bcfed}}}, + {X: Field{[10]uint32{0x028e8849, 0x03db6a2e, 0x00e6768b, 0x01383ea6, 0x018dd1c3, 0x0160de70, 0x0236fc5c, 0x0181be97, 0x000659ae, 0x002fd0be}}, Y: Field{[10]uint32{0x0155b8af, 0x039a3e1d, 0x0298f26b, 0x0344873b, 0x00ca74a0, 0x01aeba31, 0x03495782, 0x036e511b, 0x03706e4a, 0x0034d0fe}}}, + {X: Field{[10]uint32{0x0262e1cd, 0x037e5551, 0x038a0d82, 0x0170230c, 0x02c42fd6, 0x018927f0, 0x0075c365, 0x023718a4, 0x00a5891e, 0x00103071}}, Y: Field{[10]uint32{0x00689ec3, 0x02843a73, 0x0303ae5a, 0x009ce815, 0x03f20253, 0x02f304ac, 0x015d8192, 0x03db0dc6, 0x03d0e68e, 0x00199c88}}}, + {X: Field{[10]uint32{0x03883dc1, 0x0044cfa3, 0x03c92b92, 0x00f1524b, 0x03bfd3ef, 0x02828b5b, 0x004cf1b1, 0x00ff920e, 0x03100c8e, 0x00058b74}}, Y: Field{[10]uint32{0x01b5cff0, 0x00f23803, 0x00e21a65, 0x013a1ba8, 0x003d0ebf, 0x03d24387, 0x0197685c, 0x000ae7dc, 0x01d5c82f, 0x0007c8c4}}}, + {X: Field{[10]uint32{0x006331cb, 0x031f9033, 0x03b3dbdf, 0x03f5455e, 0x005d63c4, 0x00227b16, 0x03302e51, 0x02b8f3cf, 0x014689ea, 0x003fc3e0}}, Y: Field{[10]uint32{0x0151bf2e, 0x02d591c1, 0x00c2dac2, 0x037d68ec, 0x02f8814c, 0x01e3476a, 0x02549737, 0x00a78eeb, 0x01b94eb5, 0x0013707f}}}, + {X: Field{[10]uint32{0x0207b78e, 0x028e45d1, 0x02033c3e, 0x010553d2, 0x0314b3e6, 0x0131b66a, 0x0072b224, 0x02d55cbd, 0x0274b011, 0x00050eb9}}, Y: Field{[10]uint32{0x0201c35c, 0x032d084d, 0x0099fdb9, 0x022b8667, 0x03ca2029, 0x0280f7f5, 0x018820c0, 0x03ee8980, 0x01820fae, 0x00054a35}}}, + {X: Field{[10]uint32{0x019009a3, 0x01ec05e3, 0x006f35e1, 0x003b35ae, 0x004115a8, 0x00a5d366, 0x03a0efd3, 0x03517e5b, 0x02288fff, 0x003ceb73}}, Y: Field{[10]uint32{0x0116a20e, 0x001996d2, 0x00ba72d2, 0x0293aaf5, 0x03805580, 0x0252961a, 0x020915e4, 0x026ec1a6, 0x03009632, 0x0008080b}}}, + {X: Field{[10]uint32{0x00d8cccf, 0x001d5631, 0x032f85ad, 0x008bd13e, 0x034904ad, 0x02930891, 0x00e6bc6f, 0x003438b2, 0x0029e273, 0x003489c2}}, Y: Field{[10]uint32{0x0079a3bc, 0x000bd7a2, 0x03a93c63, 0x01eab819, 0x0227c66c, 0x0098b904, 0x009741df, 0x03d9a566, 0x00ac9d5b, 0x003569ad}}}, + {X: Field{[10]uint32{0x012964a6, 0x032b7d0d, 0x0356756e, 0x02299727, 0x01834753, 0x00aecbcf, 0x0057a948, 0x03caa117, 0x02b67d9b, 0x0009b45f}}, Y: Field{[10]uint32{0x02068fb2, 0x01c67078, 0x01c6b7f7, 0x006bf348, 0x00b8703d, 0x02926a9c, 0x03c4a520, 0x030d16f3, 0x03d47d67, 0x002552bc}}}, + {X: Field{[10]uint32{0x03fac74b, 0x01a3c879, 0x024760bf, 0x0264c4d1, 0x0036a52d, 0x017b9f44, 0x011618ce, 0x03226573, 0x038be104, 0x003910df}}, Y: Field{[10]uint32{0x0195cb81, 0x01c36e36, 0x0356e27b, 0x02f6e071, 0x00f9b015, 0x02d5bf23, 0x0020dbe3, 0x01b9b06a, 0x02d5b825, 0x0035b055}}}, + {X: Field{[10]uint32{0x02d3c1d4, 0x011d3be8, 0x02c70851, 0x00700347, 0x01ac5bb5, 0x026d68e7, 0x02b63ed2, 0x0181e598, 0x004e96db, 0x00224cb8}}, Y: Field{[10]uint32{0x03e58541, 0x021d511d, 0x0336ec05, 0x00368ef4, 0x01fc912a, 0x030d5472, 0x03f51668, 0x00897414, 0x037fe030, 0x00150df9}}}, + {X: Field{[10]uint32{0x02617b26, 0x020945c5, 0x01fd0c7c, 0x0390171b, 0x00933ed0, 0x01b20507, 0x02003c73, 0x021b016c, 0x0176465b, 0x003f9dda}}, Y: Field{[10]uint32{0x012aac39, 0x039b6731, 0x002aa472, 0x00f89544, 0x0094364d, 0x01677754, 0x002b0af3, 0x03541b4c, 0x005fd576, 0x002c9e77}}}, + {X: Field{[10]uint32{0x035b45f1, 0x03f24714, 0x0372cb86, 0x00f29ae7, 0x01f69eb7, 0x018ce05f, 0x004ecbe1, 0x02489172, 0x00ffb2a2, 0x001b1829}}, Y: Field{[10]uint32{0x022a0a2c, 0x01734a4a, 0x022231b5, 0x00af48f5, 0x036489af, 0x03e71e14, 0x0301a510, 0x033071c0, 0x026f814b, 0x0009e37b}}}, + {X: Field{[10]uint32{0x009af04d, 0x00791ce7, 0x02a81e12, 0x02d1ba70, 0x03a955be, 0x0327a185, 0x01556c5e, 0x0240aa63, 0x018f625f, 0x000c4cb9}}, Y: Field{[10]uint32{0x01a9e461, 0x02361a51, 0x01006943, 0x01f25171, 0x01cf0a95, 0x011a4131, 0x01b92204, 0x00f17853, 0x0164a244, 0x00296202}}}, + {X: Field{[10]uint32{0x00903f6f, 0x01404b8d, 0x022dc57e, 0x002a77a0, 0x03640e18, 0x0234e161, 0x01003fdc, 0x026fdbae, 0x0236361a, 0x002c173b}}, Y: Field{[10]uint32{0x005c9a5a, 0x0363a095, 0x018c5305, 0x0288c35e, 0x0126fe21, 0x01897617, 0x005ce16d, 0x0268a2dd, 0x00862951, 0x003ed1ce}}}, + {X: Field{[10]uint32{0x02005e83, 0x0017c584, 0x0273903a, 0x01b2af61, 0x0023cd2f, 0x00eab5f3, 0x014e68de, 0x039601e8, 0x020f5659, 0x00388084}}, Y: Field{[10]uint32{0x03ada136, 0x02755783, 0x01544084, 0x02b1f020, 0x02a70e8f, 0x0017eebc, 0x037cb4dc, 0x03e64b64, 0x0305b66a, 0x001264a2}}}, + {X: Field{[10]uint32{0x007a796b, 0x02618cc3, 0x034592f1, 0x0336316c, 0x039a9bf0, 0x01418532, 0x03e68f04, 0x002782c1, 0x01892e54, 0x0015ea47}}, Y: Field{[10]uint32{0x0098e7fc, 0x0307a7e1, 0x0116bbd5, 0x001b1763, 0x021dbf77, 0x0092c464, 0x02612c31, 0x023ea2ea, 0x00ce5901, 0x0011e417}}}, + {X: Field{[10]uint32{0x01a7e8da, 0x014ed929, 0x00ee1dd1, 0x02359d0a, 0x0291c046, 0x00997777, 0x019e7c58, 0x01970835, 0x000a3ba4, 0x003824b1}}, Y: Field{[10]uint32{0x03ffd39b, 0x009bdc56, 0x03042feb, 0x00444d3a, 0x03baa514, 0x00ec25fd, 0x00ab1d31, 0x010920b5, 0x02b4bdfc, 0x0020fd38}}}, + {X: Field{[10]uint32{0x01e0ab38, 0x02980247, 0x02554f78, 0x013fd691, 0x037c1ee8, 0x00cd74f7, 0x001a9c2c, 0x013f1282, 0x006e7baa, 0x001ce8cc}}, Y: Field{[10]uint32{0x01a1f938, 0x03a24f7b, 0x022350bc, 0x0210ebc2, 0x023d93f6, 0x01548646, 0x03a70439, 0x030c9b8d, 0x00f92022, 0x0007da32}}}, + {X: Field{[10]uint32{0x033a4434, 0x03aaef97, 0x0093a6a6, 0x03168e79, 0x03e99883, 0x02850076, 0x0152caf4, 0x012585cd, 0x01f86e90, 0x001f1e9e}}, Y: Field{[10]uint32{0x02e869bb, 0x005fe389, 0x0355415e, 0x0204b0a4, 0x00a26709, 0x002d65b3, 0x008ce8ac, 0x00e4c65b, 0x0252e488, 0x002173ac}}}, + {X: Field{[10]uint32{0x00a37788, 0x028711e1, 0x03918623, 0x021bb6a4, 0x0319f030, 0x0144d95f, 0x03054fae, 0x03ddcacd, 0x0161ce4f, 0x001aa77d}}, Y: Field{[10]uint32{0x01b65280, 0x016d88ff, 0x02db42b2, 0x019c41ba, 0x01fe7198, 0x019847fb, 0x01ba398a, 0x02fd60cc, 0x034ad9b3, 0x002f3c09}}}, + {X: Field{[10]uint32{0x0391c950, 0x02314eff, 0x019eef3f, 0x02d6fc8a, 0x0381934c, 0x034b1abf, 0x0145d2da, 0x02b7fc71, 0x024d47b3, 0x003f9eec}}, Y: Field{[10]uint32{0x02574e7f, 0x03971022, 0x00c5befd, 0x022c12bc, 0x03a88173, 0x0028a4b3, 0x00c27d6f, 0x0188f24c, 0x038609d2, 0x001ff997}}}, + {X: Field{[10]uint32{0x00407d3d, 0x010a41cc, 0x014531da, 0x0192ba05, 0x0382ce2b, 0x01f414d1, 0x00ba60e1, 0x02ddf0a4, 0x02f27944, 0x0009b474}}, Y: Field{[10]uint32{0x00f0f495, 0x00156d2d, 0x0206f4d1, 0x034756a8, 0x0051b768, 0x00d604e1, 0x00b23725, 0x00002c34, 0x00243106, 0x003b0f14}}}, + {X: Field{[10]uint32{0x0273e2b8, 0x03025b63, 0x008060e6, 0x01363c0d, 0x03fb85cf, 0x03a91378, 0x00563ff8, 0x0055cd2b, 0x01f938f9, 0x003c0394}}, Y: Field{[10]uint32{0x022c727b, 0x0259dc68, 0x00c703c5, 0x007484e0, 0x02585408, 0x03f62382, 0x02b6a136, 0x0292474e, 0x03ed3a39, 0x001edeff}}}, + {X: Field{[10]uint32{0x03cfc4d8, 0x004789cd, 0x03b309e0, 0x034538f8, 0x008bd179, 0x01352f2a, 0x02be811a, 0x021d424e, 0x0072f42f, 0x001cf855}}, Y: Field{[10]uint32{0x005b9231, 0x0341827e, 0x01a340b5, 0x01ae12f3, 0x01c53c82, 0x02c02d2a, 0x006426c9, 0x005da044, 0x00ae5832, 0x000e4bbd}}}, + {X: Field{[10]uint32{0x01568092, 0x02bd582a, 0x00333a7f, 0x0123b6be, 0x00d29d23, 0x01e77e39, 0x011d86e4, 0x00119321, 0x03a9aff3, 0x003b5199}}, Y: Field{[10]uint32{0x0149bb0c, 0x0371f98f, 0x002e43da, 0x03699e62, 0x006d9f4f, 0x03fd5df8, 0x01a9ab50, 0x0350b51a, 0x00756892, 0x001dcd9e}}}, + {X: Field{[10]uint32{0x001dde26, 0x02c3bc95, 0x00d74af5, 0x00b1e40d, 0x0351066f, 0x0136ff83, 0x00346a26, 0x0072f773, 0x02ab1081, 0x0035bb05}}, Y: Field{[10]uint32{0x02d0527e, 0x015fa792, 0x0315ef48, 0x0079286d, 0x034763b0, 0x0302e26f, 0x011b7336, 0x02f88a6a, 0x00ab7ac7, 0x002607c7}}}, + {X: Field{[10]uint32{0x034c593f, 0x0292d4ea, 0x008e68dc, 0x03caf47d, 0x033f762e, 0x03b96dc5, 0x001d92d2, 0x00c6b209, 0x007e6919, 0x000a13bd}}, Y: Field{[10]uint32{0x03cf5e82, 0x03150546, 0x013e1c7a, 0x00b8efeb, 0x03b53a4d, 0x03ff86da, 0x03e12887, 0x02f91c20, 0x02e1e6a7, 0x002adce7}}}, + {X: Field{[10]uint32{0x00d505c3, 0x030fe1c2, 0x034f6c6c, 0x02f20d5d, 0x0344b490, 0x0124063b, 0x03ba53ac, 0x01f42bf0, 0x01e75a26, 0x00014c3e}}, Y: Field{[10]uint32{0x0285e3f1, 0x02cef0d3, 0x028d36e2, 0x01c12e22, 0x00bee9fa, 0x03dff7b5, 0x02d7fba8, 0x03a72f3d, 0x001e44e5, 0x0018c312}}}, + {X: Field{[10]uint32{0x02a905f8, 0x0135673a, 0x022bc1ba, 0x0080f126, 0x02ef9c4d, 0x000974b6, 0x037a4b38, 0x00596d9c, 0x00fd81d0, 0x0019aa6d}}, Y: Field{[10]uint32{0x02525e8c, 0x01ec7353, 0x015f121b, 0x032895e5, 0x0112c86b, 0x02574c14, 0x017311c1, 0x03ab65f7, 0x004e6a4d, 0x0009dc31}}}, + {X: Field{[10]uint32{0x03a289be, 0x02484d48, 0x0394f601, 0x02625b76, 0x0139bb78, 0x011d3789, 0x018d7397, 0x01ed926c, 0x027edca4, 0x0009604b}}, Y: Field{[10]uint32{0x0317e2da, 0x031884db, 0x00e5c795, 0x02e2d634, 0x00788d3a, 0x0232e191, 0x0276f7f1, 0x029db9ae, 0x0183072a, 0x0012ee8f}}}, + {X: Field{[10]uint32{0x03b29608, 0x032e9df7, 0x00fd724a, 0x0228d5db, 0x02df1a0e, 0x03efd61f, 0x00f88b58, 0x0091205c, 0x0270af16, 0x000f206f}}, Y: Field{[10]uint32{0x02ee13d4, 0x0357fd0a, 0x0070027b, 0x03eb837a, 0x02ed9dc9, 0x0040ba6e, 0x00b52507, 0x03d201e8, 0x008eda59, 0x002ac5b9}}}, + {X: Field{[10]uint32{0x00d6e39d, 0x0093ddb8, 0x035252fb, 0x02421715, 0x0039626e, 0x0096ab6a, 0x0282c8d1, 0x00a4cfb3, 0x01cda514, 0x002ad89b}}, Y: Field{[10]uint32{0x024abff6, 0x03b7005d, 0x033cfe7e, 0x00f436ad, 0x02bb7be7, 0x0363aff0, 0x031f2a34, 0x012c6f55, 0x034b34fa, 0x0022b75d}}}, + {X: Field{[10]uint32{0x036bd85d, 0x033f82fc, 0x0133de1c, 0x015e638e, 0x03aaaaed, 0x028f8a1c, 0x02d65321, 0x0083fe32, 0x01061207, 0x0011fc94}}, Y: Field{[10]uint32{0x00585b60, 0x02c5be48, 0x03c60c38, 0x004fb342, 0x00cb44e0, 0x025960eb, 0x0374ea3f, 0x004b93b2, 0x032e7295, 0x0003db51}}}, + {X: Field{[10]uint32{0x03c26b1b, 0x0122e7c8, 0x00842361, 0x0099d4b4, 0x00e16409, 0x01c6e2ec, 0x0138d590, 0x023c6cf1, 0x0299f739, 0x001bf4c0}}, Y: Field{[10]uint32{0x026799da, 0x03816eee, 0x03d33372, 0x03c09dfc, 0x017810be, 0x017227fd, 0x02e9c4dc, 0x0388d468, 0x0166a79c, 0x000ee358}}}, + {X: Field{[10]uint32{0x0202e040, 0x026f5992, 0x031e3f44, 0x021f75e1, 0x0149db12, 0x01712827, 0x0051ab74, 0x00735963, 0x007c784e, 0x0003756c}}, Y: Field{[10]uint32{0x028d8659, 0x00c41e35, 0x03857a47, 0x01f36283, 0x036a0459, 0x003fbb66, 0x00ed2a7c, 0x0246e373, 0x018a62a4, 0x002c9b6b}}}, + {X: Field{[10]uint32{0x027fcdad, 0x00ab7c85, 0x016b7dff, 0x0229c02d, 0x0215b61a, 0x01ae12f2, 0x0275e5f1, 0x01089ea8, 0x0036104b, 0x0000f3d6}}, Y: Field{[10]uint32{0x0200c9fb, 0x012792b3, 0x03b5ce9e, 0x0098b6d0, 0x01445af7, 0x02006372, 0x00123408, 0x01e7f7da, 0x025a2cb5, 0x000731bd}}}, + {X: Field{[10]uint32{0x0119bb58, 0x0074a352, 0x03f413e0, 0x01348e15, 0x01d4cd80, 0x01d3010f, 0x02ea163d, 0x0108730e, 0x005508b9, 0x001a0ed5}}, Y: Field{[10]uint32{0x01a11f0a, 0x03f76f9e, 0x022da17c, 0x01a41540, 0x01691e23, 0x004473fb, 0x01d69438, 0x03015a2b, 0x01762cd5, 0x0006ef91}}}, + {X: Field{[10]uint32{0x003b724c, 0x000c9e79, 0x027d2195, 0x03835cf3, 0x03e83ff0, 0x0080ab94, 0x002f7ec4, 0x0103717d, 0x01b7897a, 0x0035e198}}, Y: Field{[10]uint32{0x02d20b21, 0x00aca772, 0x00a02665, 0x03fb43b1, 0x00aeead2, 0x00757ca4, 0x03db82a6, 0x01e3b3f0, 0x01b0e3f4, 0x001194a6}}}, + {X: Field{[10]uint32{0x01e15a21, 0x02954186, 0x0114a1af, 0x01f543b0, 0x0332e89e, 0x013bafc6, 0x00dbb87b, 0x039e5399, 0x0264fc15, 0x00049631}}, Y: Field{[10]uint32{0x001be0b1, 0x00148685, 0x0157194b, 0x025eef08, 0x03028c59, 0x00a83971, 0x011a7dec, 0x00e201c3, 0x029281a7, 0x000c9f12}}}, + {X: Field{[10]uint32{0x02e8be00, 0x033589e1, 0x03bb1a6c, 0x03492fdf, 0x01387f4d, 0x039cc531, 0x0243cdfa, 0x038af71b, 0x03b51cff, 0x003cb413}}, Y: Field{[10]uint32{0x03061c9e, 0x0142a309, 0x02b37932, 0x036b09f3, 0x0178d3a7, 0x021a8ab8, 0x032ee47a, 0x00854a34, 0x038d435f, 0x00226bcf}}}, + {X: Field{[10]uint32{0x030dfb08, 0x0152078f, 0x01f6bb33, 0x02864aa7, 0x03d21551, 0x03bc020e, 0x02cc402d, 0x00eb6394, 0x02c14ab2, 0x002d9eef}}, Y: Field{[10]uint32{0x00a64a23, 0x02cc3e04, 0x01fe6698, 0x004ffb80, 0x003757cc, 0x01961d55, 0x02845285, 0x02264c14, 0x03d19383, 0x0035b29a}}}, + {X: Field{[10]uint32{0x0379235e, 0x0120c48a, 0x0089d90d, 0x02120ea1, 0x008a4665, 0x00b5986e, 0x013ce90f, 0x007f5a81, 0x01b9fa40, 0x0006ebbc}}, Y: Field{[10]uint32{0x031699d7, 0x01492528, 0x01ee8033, 0x031b02d9, 0x01bc1a69, 0x02e9562b, 0x02b3872c, 0x0205f648, 0x0214a2f7, 0x000a2866}}}, + {X: Field{[10]uint32{0x0051aa8e, 0x0043fc6e, 0x03c79c3c, 0x01b394a1, 0x01f58de5, 0x0006eaa1, 0x036a7468, 0x00e922ca, 0x026b2362, 0x001b03c1}}, Y: Field{[10]uint32{0x01ff0868, 0x036ee4c5, 0x033574cc, 0x01e48167, 0x032347a4, 0x007218c9, 0x028bd94e, 0x02c3e394, 0x0256084c, 0x003b20dc}}}, + {X: Field{[10]uint32{0x023619d7, 0x004f767d, 0x01c0d949, 0x035862de, 0x00a0c815, 0x02baf3ca, 0x026d6cb7, 0x02748afa, 0x030965bb, 0x003ef56e}}, Y: Field{[10]uint32{0x0300b924, 0x00b7f28f, 0x01c7e661, 0x018cde8a, 0x0060ccc0, 0x0083cfdb, 0x0298f77e, 0x01796ff8, 0x034d5e60, 0x000cc0d5}}}, + {X: Field{[10]uint32{0x035b1739, 0x01a3e82c, 0x008fe7e5, 0x03ca36b6, 0x020f8bd5, 0x0041af46, 0x02c81ac8, 0x008cd2bd, 0x002ac4b2, 0x00089181}}, Y: Field{[10]uint32{0x02ff6e7c, 0x02af1c16, 0x00f797cd, 0x0208d169, 0x029e5382, 0x007e4b8d, 0x0229bd96, 0x0045bc33, 0x00eb9c10, 0x00076836}}}, + {X: Field{[10]uint32{0x0182bc4a, 0x00b67cd0, 0x00c51563, 0x01b7f4a5, 0x039606cf, 0x010b3d42, 0x01b3caf5, 0x00b4de0d, 0x014f2fff, 0x0011c2a4}}, Y: Field{[10]uint32{0x001d426e, 0x01619800, 0x012dbb3a, 0x001a0738, 0x034398c6, 0x0271aa3a, 0x03e3cc9e, 0x01215a96, 0x01a8d2c7, 0x001ace01}}}, + {X: Field{[10]uint32{0x021b4be0, 0x0009ec0c, 0x00c1ecc8, 0x004540c0, 0x0044bb7a, 0x00fe4274, 0x002153ba, 0x0364cd0a, 0x010bffb6, 0x001380fd}}, Y: Field{[10]uint32{0x008c504c, 0x03db96ac, 0x003e0095, 0x00940c7a, 0x009149b1, 0x0137a32f, 0x03e8f9cb, 0x01c7b3c7, 0x00ae963e, 0x00165b16}}}, + {X: Field{[10]uint32{0x0057455e, 0x02649e3f, 0x003b70d9, 0x02d02860, 0x00188a26, 0x00e7778a, 0x01567e91, 0x02edd864, 0x03eab806, 0x00169b13}}, Y: Field{[10]uint32{0x02e6ce49, 0x0269f5e0, 0x014590d5, 0x0310bd54, 0x03353d73, 0x01c6397d, 0x00ea476a, 0x00d9af0a, 0x007c6505, 0x001ba074}}}, + {X: Field{[10]uint32{0x0329bd5f, 0x01b70de6, 0x016c3a24, 0x027406f9, 0x0174f4e0, 0x03d8f753, 0x000bb1be, 0x014b884a, 0x01b29adf, 0x003b5cf2}}, Y: Field{[10]uint32{0x0113828b, 0x0321ecfe, 0x0216159d, 0x027cb7d8, 0x02e272ad, 0x0312df14, 0x011fa5b7, 0x0382b31f, 0x03b619eb, 0x0003a645}}}, + {X: Field{[10]uint32{0x001c04bd, 0x024eda70, 0x03a99bdf, 0x01308e1b, 0x03710dd3, 0x000f284f, 0x03106085, 0x03e7b52b, 0x005b38cb, 0x001a3185}}, Y: Field{[10]uint32{0x03edc73a, 0x0235f28f, 0x01e9de92, 0x0348b830, 0x02e7cb74, 0x03d4d6a7, 0x016f884d, 0x027ab140, 0x005e607d, 0x003258d6}}}, + {X: Field{[10]uint32{0x00454126, 0x00e69dec, 0x039b6a84, 0x00481661, 0x0092269a, 0x03d72473, 0x006094c3, 0x005ef077, 0x00639273, 0x0006d946}}, Y: Field{[10]uint32{0x00f5009f, 0x0077007a, 0x03cf9137, 0x00579c51, 0x03c42b19, 0x030c6fc4, 0x001fe920, 0x03426f63, 0x025f8ac3, 0x000c7184}}}, + {X: Field{[10]uint32{0x0209c52c, 0x019b539a, 0x01f0d381, 0x00824283, 0x027229ff, 0x00edc177, 0x02b74f7a, 0x0378f515, 0x00ccdadb, 0x0011564f}}, Y: Field{[10]uint32{0x000bd737, 0x0293aa6f, 0x01866a43, 0x03748361, 0x01e14634, 0x03ba5933, 0x02b9a311, 0x000814f0, 0x017d89fd, 0x0004f599}}}, + {X: Field{[10]uint32{0x03927da5, 0x034fad0d, 0x03960566, 0x0069339d, 0x01e4dd7c, 0x00a30842, 0x0132983d, 0x03e8bf35, 0x006ed6f2, 0x00050270}}, Y: Field{[10]uint32{0x020984e4, 0x0372b451, 0x0062390e, 0x00114def, 0x02fbeda3, 0x01a52dc7, 0x0369836e, 0x03f6eb8e, 0x018d4206, 0x0037017e}}}, + {X: Field{[10]uint32{0x005f4580, 0x03c0373a, 0x037074e2, 0x03213adc, 0x025d6e5c, 0x0109bfaf, 0x03239215, 0x02c15b50, 0x006bc307, 0x00367823}}, Y: Field{[10]uint32{0x012c632d, 0x01692d8a, 0x034f915d, 0x03908060, 0x01172f4d, 0x028c9817, 0x02b52add, 0x01e90e8e, 0x0247c6b4, 0x00288f05}}}, + {X: Field{[10]uint32{0x0162fb32, 0x00576eaf, 0x028ee1aa, 0x022eef57, 0x025ac0f1, 0x01357e89, 0x033a9166, 0x02dadcd4, 0x01f3d3c2, 0x001f7cc6}}, Y: Field{[10]uint32{0x03c9f8c0, 0x036d634a, 0x030b79c3, 0x026ea46b, 0x00a9bd16, 0x00778205, 0x02d8d963, 0x02ee6075, 0x02afe023, 0x0024483d}}}, + {X: Field{[10]uint32{0x0186d7a5, 0x01cd115a, 0x037110a3, 0x01126eb4, 0x0011d742, 0x008595e6, 0x0146232e, 0x03f47e4c, 0x018738b9, 0x0006a539}}, Y: Field{[10]uint32{0x03e4352e, 0x00810a2a, 0x0365a748, 0x0126b619, 0x020fc325, 0x025fcb6c, 0x034604b1, 0x039eb83e, 0x03b317ee, 0x000cca89}}}, + {X: Field{[10]uint32{0x03619a47, 0x01e07e46, 0x03691fa0, 0x0106257f, 0x014aefff, 0x03033e1c, 0x002ef8df, 0x019b6caa, 0x034d6db2, 0x0037e8b2}}, Y: Field{[10]uint32{0x01ad8b19, 0x033f9312, 0x0056e45a, 0x03ddba9c, 0x01d2a1a0, 0x032e98be, 0x0320fef4, 0x029b0633, 0x03ab3a28, 0x00317976}}}, + {X: Field{[10]uint32{0x02876730, 0x03931e4e, 0x0017bf35, 0x03af0429, 0x03acf4e2, 0x029b814e, 0x002c1352, 0x03ddad7a, 0x0007be6b, 0x00308804}}, Y: Field{[10]uint32{0x03efa581, 0x0345377e, 0x02be70c8, 0x03a24346, 0x039a735d, 0x030e1cd0, 0x0397c159, 0x0135d0eb, 0x02ecb9ae, 0x00249022}}}, + {X: Field{[10]uint32{0x03d7edc3, 0x020a1686, 0x0015e33e, 0x0253be8e, 0x022f25c7, 0x019cc1d0, 0x00d4d852, 0x01fc3e74, 0x02d2ab08, 0x0035158c}}, Y: Field{[10]uint32{0x015ff44f, 0x00f5bbe3, 0x02569554, 0x016369ee, 0x01814e72, 0x032792c7, 0x039e99f9, 0x013ea091, 0x0297c499, 0x002df38d}}}, + {X: Field{[10]uint32{0x035df93f, 0x000edc73, 0x00dedc90, 0x02e3dadf, 0x02df6c25, 0x008e85c6, 0x01f34ca9, 0x024ad221, 0x022bcdc2, 0x00233bcd}}, Y: Field{[10]uint32{0x009aaf5e, 0x02061b74, 0x02bdf260, 0x00ed76ad, 0x02d702e1, 0x03507666, 0x024f1c19, 0x01fe8afe, 0x0334ed8b, 0x002ce443}}}, + {X: Field{[10]uint32{0x00bf9838, 0x01d60ecf, 0x01bfc7f1, 0x03956565, 0x013a415a, 0x006121e3, 0x01604318, 0x00a0c45f, 0x03e1874c, 0x00091fde}}, Y: Field{[10]uint32{0x01f30eb8, 0x029f323c, 0x004642f8, 0x03a37cce, 0x01efd513, 0x017d9424, 0x01521da6, 0x02d3f03e, 0x01e6a779, 0x0024388d}}}, + {X: Field{[10]uint32{0x001cf568, 0x0122b626, 0x02c56b01, 0x01238daa, 0x02f26093, 0x032a8ae0, 0x01dd0b0a, 0x00eb7d04, 0x02f1c870, 0x002e3033}}, Y: Field{[10]uint32{0x01275f14, 0x011cab80, 0x03916a33, 0x02915303, 0x0345e7aa, 0x03526a5e, 0x00e74a81, 0x026a852e, 0x00114701, 0x00281065}}}, + {X: Field{[10]uint32{0x0208cf09, 0x006f61a0, 0x012c0ab5, 0x0036ab5e, 0x030a35ab, 0x03746f45, 0x026b43a4, 0x031e44aa, 0x036e06e1, 0x0023955d}}, Y: Field{[10]uint32{0x00822d56, 0x029eb61c, 0x01c012c8, 0x01fdb6aa, 0x02cec730, 0x03518b9a, 0x02d12bc6, 0x02aefc30, 0x00c3a025, 0x0037f933}}}, + {X: Field{[10]uint32{0x003ad1ad, 0x01611a83, 0x0267c5f0, 0x01c3122d, 0x01db813b, 0x038e4090, 0x0122790d, 0x02609138, 0x02d3fc9d, 0x0003c73d}}, Y: Field{[10]uint32{0x03984799, 0x025a6bf0, 0x026f6c8b, 0x024ec5ce, 0x01750069, 0x02b9ea13, 0x02f1ec77, 0x0346c8d7, 0x02ab3952, 0x00124971}}}, + {X: Field{[10]uint32{0x01b9ea31, 0x0199c2bb, 0x0000a9e5, 0x011f2b2f, 0x03811641, 0x036dd8b0, 0x00495ab9, 0x03b924ad, 0x0388dce5, 0x002d276f}}, Y: Field{[10]uint32{0x03a9ef2a, 0x01eb3ebf, 0x023feb8b, 0x030b7a24, 0x028971f7, 0x034a2291, 0x00d703ef, 0x025f1dd6, 0x0317ab57, 0x00303e4b}}}, + {X: Field{[10]uint32{0x018ca362, 0x0327dd43, 0x02cab9a8, 0x010e7992, 0x00399e26, 0x0097df73, 0x0173c50a, 0x015fb455, 0x02ad257b, 0x0035abf8}}, Y: Field{[10]uint32{0x0135749d, 0x02b1bce3, 0x01b42b47, 0x028d5871, 0x0138d355, 0x018a0ac4, 0x01402491, 0x02d5ac5c, 0x02b86919, 0x00177c8d}}}, + {X: Field{[10]uint32{0x02e8e89f, 0x00480106, 0x0244b53e, 0x0279a112, 0x0345b48a, 0x033b92d2, 0x032a439f, 0x0197e965, 0x00c5f233, 0x002ec0a1}}, Y: Field{[10]uint32{0x02265300, 0x01d8266e, 0x034936ae, 0x0329bc53, 0x0153221d, 0x03b554ca, 0x0018fb2a, 0x0164c9e4, 0x000de09e, 0x001a12f3}}}, + {X: Field{[10]uint32{0x024467ec, 0x00b611f9, 0x037e46e8, 0x009ead69, 0x03c47796, 0x0228105d, 0x00be6219, 0x025a5c6e, 0x03148a40, 0x0015fa55}}, Y: Field{[10]uint32{0x01443f13, 0x01467cb3, 0x00c126bb, 0x03497a15, 0x01fd8e7c, 0x004a94dd, 0x006d3a8f, 0x0096001f, 0x01b114ce, 0x001c52f4}}}, + {X: Field{[10]uint32{0x02713094, 0x0149b647, 0x03757d17, 0x01e3ad8d, 0x01a1e144, 0x03a01148, 0x03ef2a3d, 0x00ed1d48, 0x0360b33c, 0x002c320b}}, Y: Field{[10]uint32{0x02cea63c, 0x02be6528, 0x032eeac1, 0x03596a0a, 0x0123d163, 0x024fdff6, 0x022f70ac, 0x03d4b994, 0x01b9d763, 0x0033f234}}}, + {X: Field{[10]uint32{0x013e1ee3, 0x01292f55, 0x005a35c2, 0x0093fdfe, 0x00667d83, 0x01b663b4, 0x032c185c, 0x0216f564, 0x01704047, 0x000ae9d8}}, Y: Field{[10]uint32{0x02ea35b9, 0x035580fb, 0x03307205, 0x0067cf8b, 0x01e56aef, 0x01545934, 0x03167d6b, 0x00abd581, 0x03907426, 0x00006041}}}, + {X: Field{[10]uint32{0x02d3e88c, 0x0248d71b, 0x00895b5c, 0x02169c8a, 0x0103eb1c, 0x01f83296, 0x01d15c82, 0x02e483ec, 0x0213d508, 0x0016f553}}, Y: Field{[10]uint32{0x020cf0c9, 0x024cebd9, 0x016fc2b1, 0x02b3bcef, 0x02878017, 0x02b1f608, 0x030ab1e4, 0x03864fa9, 0x01fd5607, 0x0035974d}}}, + {X: Field{[10]uint32{0x02a8d09a, 0x037e5dcf, 0x026947cc, 0x017d5993, 0x00a590d6, 0x01b3c84b, 0x03f1664e, 0x03626aca, 0x02d2753b, 0x002c2ef0}}, Y: Field{[10]uint32{0x03993c23, 0x0026f723, 0x0147e47f, 0x01047cd3, 0x02072257, 0x03319c14, 0x00190654, 0x022eae85, 0x02c1a107, 0x002415ed}}}, + {X: Field{[10]uint32{0x013133a8, 0x03a771b3, 0x00459224, 0x00c083a3, 0x01b38b46, 0x0151484a, 0x000fe419, 0x00e2b377, 0x02033cca, 0x00305c04}}, Y: Field{[10]uint32{0x01557e9a, 0x02d8dabd, 0x03b14fb6, 0x02d7afd3, 0x02624f78, 0x01b02185, 0x00071888, 0x01bd9d1b, 0x007b1cfb, 0x00312576}}}, + {X: Field{[10]uint32{0x03a21bda, 0x00c28917, 0x032ea749, 0x037764d4, 0x007c9fa4, 0x03ef0a31, 0x02879617, 0x0127fcc8, 0x020e5f1e, 0x000782f4}}, Y: Field{[10]uint32{0x03dd6177, 0x02385810, 0x01cd5703, 0x02719af8, 0x01b2a586, 0x011cbe84, 0x01a681b2, 0x03c57797, 0x00000e98, 0x000b501d}}}, + {X: Field{[10]uint32{0x017ec15f, 0x006c560c, 0x0388b03a, 0x028ef017, 0x00f39def, 0x0214ce9c, 0x012a9740, 0x019863fc, 0x023fec4c, 0x00173f08}}, Y: Field{[10]uint32{0x03f21411, 0x00cd512b, 0x00cf93da, 0x03ded9c6, 0x01eb4468, 0x031ce2c2, 0x006ec226, 0x01c6798e, 0x03d489e3, 0x001f64a2}}}, + {X: Field{[10]uint32{0x01efa67d, 0x03330b20, 0x00e8801c, 0x033942b0, 0x005da345, 0x02b51ea1, 0x03e514eb, 0x019a3815, 0x020abebd, 0x003d4195}}, Y: Field{[10]uint32{0x020fc7e9, 0x029f4eb2, 0x00d639d9, 0x036056f7, 0x0263111f, 0x01fd9289, 0x03580ad1, 0x02a66af0, 0x03f7c9c2, 0x0038bfc2}}}, + {X: Field{[10]uint32{0x02c54f45, 0x039ef609, 0x02ef8306, 0x02b96fe5, 0x001d00dc, 0x0127405a, 0x0246e4c4, 0x01d21516, 0x0298ec88, 0x0021123f}}, Y: Field{[10]uint32{0x026f0407, 0x03bb6afa, 0x0256a66a, 0x0117da75, 0x0285b200, 0x00d204dd, 0x01a82713, 0x000c88b7, 0x02291750, 0x00343c1c}}}, + {X: Field{[10]uint32{0x03cffc55, 0x01156ea5, 0x004f56bc, 0x00a2a619, 0x002480cf, 0x00a50bcd, 0x015ca713, 0x01f0b8db, 0x017fdb03, 0x003269a1}}, Y: Field{[10]uint32{0x03aa149f, 0x0238d9e3, 0x011c6b79, 0x01d2da33, 0x01f742d9, 0x03b5be5f, 0x00b8326c, 0x023985b0, 0x00b98f67, 0x0029a782}}}, + {X: Field{[10]uint32{0x02c4011d, 0x0319936e, 0x019d503d, 0x01b6391a, 0x03b8fc28, 0x0226ac67, 0x02f7db2d, 0x03acef20, 0x03f5c611, 0x0002d744}}, Y: Field{[10]uint32{0x024b7adc, 0x02022c4c, 0x02bb6259, 0x036271c0, 0x02ef2692, 0x00921f42, 0x012493ff, 0x003f7d6e, 0x02507cdc, 0x0009fac5}}}, + {X: Field{[10]uint32{0x0235ce44, 0x02ecd3b6, 0x02fad75a, 0x01c75fc6, 0x02902184, 0x0230a71b, 0x001b8871, 0x0352b300, 0x01f32e0e, 0x002fe7b1}}, Y: Field{[10]uint32{0x027ef2d1, 0x00dea011, 0x0146bdd8, 0x01a1ce19, 0x00a1734f, 0x01a311e9, 0x01224ed3, 0x010196de, 0x0088892b, 0x0004e119}}}, + {X: Field{[10]uint32{0x02526e19, 0x024ab04e, 0x00f2ed6d, 0x021eb5aa, 0x00893c5a, 0x0329bd6e, 0x011f6bd1, 0x00704ebb, 0x02be4d3b, 0x000b0e04}}, Y: Field{[10]uint32{0x0033aece, 0x02533bcd, 0x03af324a, 0x02b4519a, 0x031b11ed, 0x02cd02f2, 0x03cf877d, 0x014782de, 0x02f145d5, 0x000d9ae0}}}, + {X: Field{[10]uint32{0x0233f572, 0x031721b2, 0x013a6f21, 0x014e362f, 0x019fd172, 0x002289b9, 0x00d0a13c, 0x03db21ff, 0x0328dc8e, 0x001def7b}}, Y: Field{[10]uint32{0x023c3a1b, 0x019fda7a, 0x017ef081, 0x022a0fe5, 0x016977ba, 0x02960294, 0x02c1feca, 0x03526c03, 0x00c7bf3b, 0x003699ac}}}, + {X: Field{[10]uint32{0x0371afe5, 0x03f445a2, 0x02b154ef, 0x0301953b, 0x028693ba, 0x03cd3181, 0x006503e3, 0x021def36, 0x019d3185, 0x002f129e}}, Y: Field{[10]uint32{0x0255569e, 0x03ddd5dc, 0x03e664f7, 0x01af4cc6, 0x03f59abf, 0x00985496, 0x0159c99e, 0x00643a9c, 0x03f899a8, 0x0014ff35}}}, + {X: Field{[10]uint32{0x02fcd040, 0x0170620b, 0x039dce27, 0x01bcb84f, 0x006fccdb, 0x000dd41e, 0x010e4c7d, 0x03381586, 0x0084733d, 0x000c07f6}}, Y: Field{[10]uint32{0x01e25cb6, 0x00b22294, 0x00b735de, 0x00303897, 0x00312c91, 0x012f981f, 0x0035cef6, 0x027d47f6, 0x01d5185b, 0x001e793e}}}, + {X: Field{[10]uint32{0x014adb70, 0x018062a0, 0x032f387b, 0x01df9436, 0x02133f83, 0x00dc6710, 0x00d0bda1, 0x01f95085, 0x029bbe5e, 0x000906d2}}, Y: Field{[10]uint32{0x0010bdb0, 0x019211ed, 0x039593c1, 0x0000922c, 0x03a8ce21, 0x03f30032, 0x036bca27, 0x0348b87d, 0x0008fa4f, 0x00319bb7}}}, + {X: Field{[10]uint32{0x00c79585, 0x028580b6, 0x0098156e, 0x005bcca5, 0x01dcd28c, 0x018cf547, 0x01c1351d, 0x004a24f1, 0x02396819, 0x002f9bc5}}, Y: Field{[10]uint32{0x03afff21, 0x029c797e, 0x0335a5f7, 0x0282950c, 0x021ade5d, 0x03d7f979, 0x038a9668, 0x014e7a9f, 0x027e1a65, 0x001bd9d2}}}, + {X: Field{[10]uint32{0x01d3a283, 0x01f2cc4f, 0x03285e23, 0x02eadff2, 0x01b3f7bf, 0x028b452e, 0x0209ef60, 0x0278a9f8, 0x008f79c6, 0x00322d40}}, Y: Field{[10]uint32{0x03b54bb9, 0x00fb029a, 0x008f52d8, 0x032a98c0, 0x023cea15, 0x01bbf2cd, 0x0036dd74, 0x03df802f, 0x03486c3c, 0x000771e4}}}, + {X: Field{[10]uint32{0x006c0998, 0x029ffd30, 0x027d4eed, 0x02b1df3c, 0x02b038ed, 0x01e5ab47, 0x0197ec3a, 0x03b5893a, 0x039eaad5, 0x0014052b}}, Y: Field{[10]uint32{0x0189dd7d, 0x0221808c, 0x031511a4, 0x014cd25d, 0x01911439, 0x021ed2db, 0x004a77a9, 0x028714b5, 0x006fb8fa, 0x0038075e}}}, + {X: Field{[10]uint32{0x03bb989a, 0x02b76329, 0x02d2b45d, 0x03023620, 0x01b0845e, 0x03ca3f37, 0x02d4f284, 0x0190fb68, 0x01e62c40, 0x001bffbf}}, Y: Field{[10]uint32{0x0011cc0e, 0x01bf9721, 0x004717fb, 0x0201a9bd, 0x01ff0a54, 0x028afb2f, 0x029e4bd9, 0x00ea7888, 0x003c782d, 0x00238ac6}}}, + {X: Field{[10]uint32{0x007d463f, 0x03fc7c52, 0x022904aa, 0x003f07a4, 0x020ad014, 0x02d3030d, 0x02a7e5d0, 0x004dd34c, 0x03bf190e, 0x002b1d8a}}, Y: Field{[10]uint32{0x033adefe, 0x02944f97, 0x02a7e435, 0x0143b606, 0x03bc34d8, 0x036dac4b, 0x001bfec5, 0x01ad028e, 0x03183101, 0x003335e7}}}, + {X: Field{[10]uint32{0x0011cb24, 0x023ab83a, 0x03342796, 0x0337a0a3, 0x03d791a5, 0x01cdec76, 0x03244e7b, 0x0171d424, 0x02d63ec0, 0x0025cd25}}, Y: Field{[10]uint32{0x01647533, 0x01cf99c9, 0x03b7abf5, 0x0194bd5e, 0x03d7420b, 0x030fcd3c, 0x037ff525, 0x00cd47d8, 0x03c0044e, 0x0012cb26}}}, + {X: Field{[10]uint32{0x00a15d32, 0x0266cd21, 0x034291a7, 0x0001be80, 0x02c39ce3, 0x03a8e78d, 0x03577539, 0x02f0c1d0, 0x01665f77, 0x002a7624}}, Y: Field{[10]uint32{0x0380e213, 0x0204ee12, 0x0296b8d0, 0x013f33ea, 0x0056dd88, 0x0018d694, 0x039ce982, 0x02e3f3d3, 0x0217fded, 0x0034270e}}}, + {X: Field{[10]uint32{0x00c5710b, 0x02a68828, 0x02f769ec, 0x01bd835b, 0x02cbab63, 0x009086eb, 0x00a7419f, 0x0151362e, 0x03fdaa2b, 0x000422a3}}, Y: Field{[10]uint32{0x00e0249d, 0x01599735, 0x028d7b12, 0x01ce77cc, 0x01cebbb2, 0x017c38e2, 0x025776a7, 0x02b56289, 0x01fcab04, 0x0002b4fa}}}, + {X: Field{[10]uint32{0x027c5fb5, 0x0316fb5c, 0x00a36de8, 0x02365448, 0x03954387, 0x01791257, 0x000ac6df, 0x00f15eff, 0x017bc884, 0x003be5a7}}, Y: Field{[10]uint32{0x021f16fb, 0x033e170d, 0x0302afc1, 0x014dee02, 0x01d1d4d6, 0x037aab69, 0x005d81a1, 0x0200dac5, 0x03b22673, 0x0016ae06}}}, + {X: Field{[10]uint32{0x03c39b62, 0x028c2590, 0x01162b0b, 0x03c9043d, 0x01d74200, 0x03dc2c91, 0x02dafb28, 0x01514fc4, 0x03c24d50, 0x002ae096}}, Y: Field{[10]uint32{0x01281a1d, 0x032c196c, 0x0194c6f9, 0x02e35155, 0x01708098, 0x01dea072, 0x03e31da2, 0x01105769, 0x01f22377, 0x001e279f}}}, + {X: Field{[10]uint32{0x00bf2622, 0x015aec12, 0x03ac0598, 0x00e664ce, 0x02eeed4e, 0x02125a5c, 0x039198cf, 0x00f00bb1, 0x00e52c17, 0x00126129}}, Y: Field{[10]uint32{0x00c5df3f, 0x033e25eb, 0x034348e7, 0x0090e647, 0x02f199e9, 0x0330f33d, 0x0087a9c2, 0x00b98682, 0x027b79be, 0x001165ad}}}, + {X: Field{[10]uint32{0x025f7272, 0x01284c98, 0x02fbccfa, 0x01a88fcf, 0x004bf0f7, 0x02a9f2c9, 0x0360d0d8, 0x02f84fd3, 0x03f493c1, 0x000a171b}}, Y: Field{[10]uint32{0x03ed49d3, 0x01ecf674, 0x03c1212d, 0x0397a289, 0x03c4caac, 0x0276e6c8, 0x00fd9984, 0x03bca357, 0x01a5cf9c, 0x000e77fa}}}, + {X: Field{[10]uint32{0x003db340, 0x02dc23e1, 0x02c7b348, 0x001b09e2, 0x019bc6e5, 0x00c402aa, 0x02667171, 0x0065c7a4, 0x01d17e72, 0x0007852c}}, Y: Field{[10]uint32{0x00e41cee, 0x0017c113, 0x02a1164d, 0x03f17de7, 0x00394d7d, 0x0135050f, 0x03fe464c, 0x03d89cd1, 0x039dd705, 0x00018e88}}}, + {X: Field{[10]uint32{0x0217c8aa, 0x0102ed6f, 0x018fc101, 0x030133cc, 0x033b1394, 0x03352161, 0x01dcf309, 0x03347bd8, 0x03b9ed71, 0x0002e3dc}}, Y: Field{[10]uint32{0x036f665c, 0x0041f99d, 0x02ec5827, 0x01a96b10, 0x01074567, 0x006f997b, 0x034823aa, 0x03b214bf, 0x02e0bd66, 0x0022bd76}}}, + {X: Field{[10]uint32{0x0314540a, 0x012fdba1, 0x01d15e62, 0x034c7352, 0x0049c995, 0x03456bf4, 0x02367760, 0x03f3db2d, 0x0297e878, 0x001f831c}}, Y: Field{[10]uint32{0x02ddd658, 0x02bc3f6b, 0x000e58aa, 0x00c0280a, 0x00ffd595, 0x02c9c680, 0x00b7568b, 0x00810fd2, 0x01f74c51, 0x0037d5e5}}}, + {X: Field{[10]uint32{0x03798545, 0x03f409da, 0x02cbade5, 0x0046dd52, 0x00109990, 0x03377f92, 0x0351133f, 0x03b67e8a, 0x011d465b, 0x00027c3b}}, Y: Field{[10]uint32{0x00a8459f, 0x02666405, 0x016e9217, 0x00e398c9, 0x01d85b6c, 0x00aaa676, 0x03adde01, 0x00380192, 0x009c73bb, 0x001c017b}}}, + {X: Field{[10]uint32{0x008e12bf, 0x02946aa7, 0x01b125a0, 0x0002c78d, 0x03cc8e40, 0x00388f3b, 0x020608d8, 0x016bc005, 0x035e0b5c, 0x000b555b}}, Y: Field{[10]uint32{0x01f12000, 0x0108b285, 0x038a94e4, 0x0223e02a, 0x01d24d44, 0x03f61bd0, 0x007f6fc1, 0x00eebc77, 0x014425bc, 0x0001d800}}}, + {X: Field{[10]uint32{0x035ed3f2, 0x0206f320, 0x0128ee8d, 0x03950526, 0x012cc14c, 0x0271f730, 0x0079524d, 0x0380b02d, 0x027d7637, 0x000985d9}}, Y: Field{[10]uint32{0x0380884b, 0x02b90651, 0x019babc6, 0x005806ca, 0x017a2c4e, 0x01e3298e, 0x01496be4, 0x0027ae3d, 0x03ba2cd8, 0x0014855c}}}, + {X: Field{[10]uint32{0x019aac10, 0x02c187c3, 0x02492ba1, 0x033fb416, 0x034cae40, 0x020428fc, 0x036e10f8, 0x026991ed, 0x016c5b51, 0x001891e4}}, Y: Field{[10]uint32{0x02e7f098, 0x00cc09bb, 0x034caf2d, 0x01a70fa7, 0x00602b09, 0x00036875, 0x02a193c5, 0x02a5e241, 0x0170535b, 0x003ff409}}}, + {X: Field{[10]uint32{0x023c52af, 0x017533e6, 0x03db4fa5, 0x012a544d, 0x01ea14c6, 0x03b3b3ee, 0x0017e780, 0x002a2180, 0x03e08ed5, 0x003102c9}}, Y: Field{[10]uint32{0x007b6493, 0x03c6b378, 0x0001ba86, 0x02e0c3aa, 0x00c4149f, 0x00416a95, 0x01d1e977, 0x016e13f6, 0x038c7d02, 0x00090572}}}, + {X: Field{[10]uint32{0x03e0de12, 0x0195e340, 0x029748b6, 0x02afc199, 0x03ad7103, 0x03aea713, 0x01bf17bc, 0x0295bf34, 0x008a54a3, 0x002e96bb}}, Y: Field{[10]uint32{0x0157ffbd, 0x03562c1b, 0x0370dc49, 0x0180e7e6, 0x00a705de, 0x03a96e98, 0x03474d28, 0x0312fcf1, 0x0311abec, 0x000d236a}}}, + {X: Field{[10]uint32{0x00076268, 0x00089225, 0x03f675c0, 0x00139571, 0x02c1e9e5, 0x03ecfcc6, 0x031262cf, 0x00a5384c, 0x0258f8dd, 0x002e8539}}, Y: Field{[10]uint32{0x001aa1dd, 0x01b792b2, 0x023659b9, 0x038e8c9b, 0x00c221b0, 0x01b76684, 0x00cb36c6, 0x03957b1c, 0x0105fc43, 0x0033b5d2}}}, + {X: Field{[10]uint32{0x03f4aff4, 0x037e85a9, 0x022d4cfb, 0x00382870, 0x00f9c1d0, 0x004e6acc, 0x02718cb4, 0x031fe8a7, 0x03698880, 0x000cdd6b}}, Y: Field{[10]uint32{0x02295a27, 0x0399fbb3, 0x01726ddd, 0x01e73957, 0x028d27db, 0x0389b1a3, 0x02fa0b85, 0x0396c6d9, 0x0091a83b, 0x0033ea2d}}}, + {X: Field{[10]uint32{0x019f01fe, 0x0252a92f, 0x002d5efc, 0x038bdf54, 0x035b9a8e, 0x0312c9db, 0x03a109a2, 0x03f7eba7, 0x014b306c, 0x001a3498}}, Y: Field{[10]uint32{0x0348550e, 0x00e1b217, 0x008f3661, 0x01221023, 0x01ef9e1d, 0x03503ed6, 0x01f54e84, 0x0197b5f7, 0x02bcf043, 0x0005230d}}}, + {X: Field{[10]uint32{0x00533edd, 0x011edfc7, 0x0277b7fc, 0x01ac1b0d, 0x03900ece, 0x0358ce1e, 0x02990d71, 0x000ec2b4, 0x02a55977, 0x0024feb3}}, Y: Field{[10]uint32{0x002ad5f4, 0x011e5f25, 0x03179745, 0x011363b9, 0x01c20bbe, 0x02687db0, 0x00199853, 0x0053a2d7, 0x03fa8fa1, 0x000f2006}}}, + {X: Field{[10]uint32{0x01054277, 0x01b09d5d, 0x005d6eef, 0x03c5b288, 0x025a0a61, 0x01b242ca, 0x0375ae17, 0x00c46255, 0x00a672f7, 0x003c4775}}, Y: Field{[10]uint32{0x01556ef6, 0x026d5a2e, 0x020e83f5, 0x01154782, 0x006c307d, 0x03063434, 0x022083ca, 0x02b03dfa, 0x016d2ef2, 0x002f01a8}}}, + {X: Field{[10]uint32{0x024204f7, 0x0328e721, 0x00010f10, 0x02165c97, 0x000b71fe, 0x020f2001, 0x029a94ef, 0x029153f4, 0x005d710b, 0x0010baf3}}, Y: Field{[10]uint32{0x025f223b, 0x001934b5, 0x00e40279, 0x01f371a6, 0x00e633c1, 0x01c7419f, 0x03d5cdb2, 0x0007b531, 0x00eb6431, 0x003e2aa1}}}, + {X: Field{[10]uint32{0x01c80e52, 0x0278f861, 0x03b2e67e, 0x03684fc7, 0x00549e96, 0x02274668, 0x03b6fbce, 0x016a5021, 0x03dcd96d, 0x0035021d}}, Y: Field{[10]uint32{0x02789444, 0x0388d317, 0x0087c837, 0x001bd764, 0x02c0be83, 0x03f00510, 0x017b59af, 0x003f2e39, 0x01b385f2, 0x002fa6ee}}}, + {X: Field{[10]uint32{0x0162931f, 0x01d0d609, 0x03e398fa, 0x02eeae35, 0x03aa40c1, 0x00e49029, 0x00ec9342, 0x0042ae22, 0x0098cd21, 0x003062cb}}, Y: Field{[10]uint32{0x015773f8, 0x00b3a5c5, 0x001cb24c, 0x02724df0, 0x03b83f18, 0x0019b102, 0x01f18cd1, 0x035d31d7, 0x00349147, 0x00365884}}}, + {X: Field{[10]uint32{0x005c0bd1, 0x03e238f8, 0x039e4d14, 0x01631923, 0x036fe946, 0x02ed37af, 0x034fa0c4, 0x03e10473, 0x03221a44, 0x0005535a}}, Y: Field{[10]uint32{0x0075559a, 0x014a9656, 0x01976de5, 0x03cfaf15, 0x037c1074, 0x0365398f, 0x00bbb6ad, 0x00ccbcca, 0x0307c705, 0x0037c2f0}}}, + {X: Field{[10]uint32{0x01a26f15, 0x009a8d78, 0x006e0a93, 0x01670eae, 0x0024485d, 0x02610b6f, 0x017d2285, 0x024ec68e, 0x01e5629f, 0x0028e096}}, Y: Field{[10]uint32{0x01f783fb, 0x02ee7aa4, 0x01892367, 0x013fd0d7, 0x00171327, 0x0229e6e3, 0x0074932e, 0x00a98ece, 0x00cc2fe5, 0x001a6d6b}}}, + {X: Field{[10]uint32{0x023fcd19, 0x02ca8f1d, 0x02013d4d, 0x00a5be08, 0x00148270, 0x03bb7b46, 0x025a7d52, 0x00d24e64, 0x02eee91e, 0x00275ca7}}, Y: Field{[10]uint32{0x03e89a1f, 0x02a8bc38, 0x00339657, 0x027938cc, 0x009cadc0, 0x0361d3ec, 0x02f731f2, 0x02188459, 0x015403cc, 0x001b60c8}}}, + {X: Field{[10]uint32{0x03751e3a, 0x01c06cd9, 0x00b39b25, 0x024e283e, 0x0346398c, 0x0112a7e6, 0x02cede79, 0x01f1f95d, 0x00088630, 0x00099d3c}}, Y: Field{[10]uint32{0x013f83cf, 0x0199ae06, 0x02fa212a, 0x031ea748, 0x02e31bde, 0x02c3c7d3, 0x03638d07, 0x0347be0d, 0x03426ac9, 0x0000fa7a}}}, + {X: Field{[10]uint32{0x02237f41, 0x03cd1453, 0x002c2743, 0x00b1bdc3, 0x03b7c164, 0x02d89b03, 0x028e9fdb, 0x02e15b74, 0x015eadb1, 0x002ca81b}}, Y: Field{[10]uint32{0x03f664d3, 0x033ab58e, 0x01f5ff3b, 0x02613401, 0x03de579a, 0x0206b582, 0x03baed44, 0x02c9a089, 0x038b8673, 0x0017532b}}}, + {X: Field{[10]uint32{0x022d713d, 0x03c8f848, 0x03a60f0b, 0x003c5056, 0x012b278c, 0x00103c17, 0x03e4ec92, 0x03af73b0, 0x0164d61d, 0x00082c9f}}, Y: Field{[10]uint32{0x00e516a3, 0x0111ede9, 0x03ffb41e, 0x0026eceb, 0x02c8c5c8, 0x00159d43, 0x01264886, 0x00b7cd73, 0x01e7ff5c, 0x00120761}}}, + {X: Field{[10]uint32{0x00e3f2e5, 0x0335714f, 0x0051bfc7, 0x003d169f, 0x03527093, 0x0031547d, 0x00d7c152, 0x02a897d8, 0x010c450e, 0x0013d298}}, Y: Field{[10]uint32{0x0247f328, 0x00bf640e, 0x0239c2b3, 0x013bf5f7, 0x01e82423, 0x03e75a3b, 0x02d8d8e0, 0x0188a19c, 0x0211db41, 0x0037c7a3}}}, + {X: Field{[10]uint32{0x00aceaa9, 0x03ee8daa, 0x01e9e776, 0x02245196, 0x03bc06c9, 0x00d66f01, 0x0170b4be, 0x010d6095, 0x02d80050, 0x0026cdd7}}, Y: Field{[10]uint32{0x01e90927, 0x01ab888d, 0x01f26d1e, 0x01021b73, 0x03226834, 0x01670d20, 0x01de5b1f, 0x0001a645, 0x0193385c, 0x000f4159}}}, + {X: Field{[10]uint32{0x02c9d1be, 0x0300648b, 0x03ba4060, 0x021cdff3, 0x03c13aff, 0x00e42dff, 0x03865e72, 0x00b21cc7, 0x00045d43, 0x0010d902}}, Y: Field{[10]uint32{0x0070cbeb, 0x01ac8818, 0x016eb234, 0x02496e2c, 0x025aff2a, 0x012ed3ef, 0x01f2aac5, 0x00ff878f, 0x02af6fc7, 0x00388ce3}}}, + {X: Field{[10]uint32{0x001e0b66, 0x01d849fd, 0x02a394c4, 0x00bbcae7, 0x0259287f, 0x02fa2353, 0x021f35cf, 0x0045c905, 0x004f2446, 0x0029b967}}, Y: Field{[10]uint32{0x019f334d, 0x03b17f9f, 0x032775f5, 0x00acb9ea, 0x0257a8ae, 0x0133dc62, 0x00fa470c, 0x01d7e507, 0x0347f5dd, 0x001d71c1}}}, + {X: Field{[10]uint32{0x01322d51, 0x02801ec9, 0x016ed7c9, 0x0165d2ca, 0x025293a9, 0x01a9b4ce, 0x03bf1e84, 0x0147f65d, 0x0217ae73, 0x003fd8e5}}, Y: Field{[10]uint32{0x03dac457, 0x01cc4594, 0x0239f79d, 0x01c7bd01, 0x03e21dca, 0x039e60d4, 0x03f81ffe, 0x0157dd94, 0x01abfa23, 0x0039848f}}}, + {X: Field{[10]uint32{0x02f4faf3, 0x0376fa53, 0x030435f8, 0x03b80722, 0x00c254df, 0x02b578a1, 0x0237cbc5, 0x03639822, 0x00401710, 0x001de452}}, Y: Field{[10]uint32{0x00611414, 0x02e3b638, 0x00ecaa54, 0x0118cb26, 0x02623be4, 0x02534a9a, 0x0075dc38, 0x03531c10, 0x00e99ef3, 0x00365fd1}}}, + {X: Field{[10]uint32{0x01484aad, 0x015e7ede, 0x00ee5d42, 0x03f01b76, 0x00947cf1, 0x03704d71, 0x0151c00a, 0x0152a841, 0x00aa0292, 0x003da244}}, Y: Field{[10]uint32{0x0052c1fc, 0x02d67930, 0x03c941b9, 0x0310fd71, 0x0269f9f5, 0x0325e137, 0x01587eaf, 0x01b58c2b, 0x03db33a5, 0x00102f7e}}}, + {X: Field{[10]uint32{0x036e0fd3, 0x01891906, 0x0169629f, 0x034b7bc7, 0x00f2d4d8, 0x03558361, 0x01c75011, 0x0133bdc6, 0x0381473d, 0x00056fa3}}, Y: Field{[10]uint32{0x00fd9a2a, 0x023bbb9c, 0x007bb1d2, 0x02a21241, 0x0364b85e, 0x01b64c99, 0x011ead00, 0x006d0711, 0x0126fc99, 0x001f99be}}}, + {X: Field{[10]uint32{0x0284e9ca, 0x006af762, 0x019db909, 0x01be682f, 0x03d0c5c2, 0x01f10722, 0x03272970, 0x00c0bbd0, 0x015a2e22, 0x0003844f}}, Y: Field{[10]uint32{0x01574dc0, 0x0095f2bd, 0x0353026a, 0x03472e00, 0x03b54941, 0x03c6cb16, 0x026b70b2, 0x0371145e, 0x02d834c6, 0x000b9218}}}, + {X: Field{[10]uint32{0x03bea688, 0x0237f9d1, 0x01595aa7, 0x02c15f5b, 0x022c94da, 0x030346f8, 0x0220d9de, 0x02e99dfd, 0x0370485b, 0x0025ac41}}, Y: Field{[10]uint32{0x03dbf30b, 0x027a7c6e, 0x016a5225, 0x03092926, 0x02ff854a, 0x031de766, 0x021bd58f, 0x01c9ab06, 0x02ae0222, 0x0038182a}}}, + {X: Field{[10]uint32{0x0005545d, 0x01e24d09, 0x02183de8, 0x031d68e3, 0x0057f6f7, 0x034b3f63, 0x025e8990, 0x0255385f, 0x03005555, 0x00205d0b}}, Y: Field{[10]uint32{0x02d2fc0e, 0x03b80f4b, 0x0236edf1, 0x031a3e48, 0x00a8d742, 0x00d5e3ec, 0x032fbb07, 0x0017cb9b, 0x03c2e5f7, 0x00285d8f}}}, + {X: Field{[10]uint32{0x0378a480, 0x01207fee, 0x01c17fcc, 0x002f85b0, 0x0386bc7a, 0x02434dee, 0x00b72eaf, 0x023d89df, 0x03139698, 0x0005f067}}, Y: Field{[10]uint32{0x03c78833, 0x030eed94, 0x01fd9c5e, 0x0181c63e, 0x013f430e, 0x038f946e, 0x01c2642a, 0x0193ad88, 0x00d52101, 0x0032c4a4}}}, + {X: Field{[10]uint32{0x02497a3c, 0x0066fae8, 0x01c3f403, 0x001d8f00, 0x00bfeee5, 0x02e18552, 0x0248b2bb, 0x01bb2719, 0x0306e874, 0x00001ec3}}, Y: Field{[10]uint32{0x02a70020, 0x02dde3b5, 0x00c6a2fd, 0x016275ba, 0x031634b7, 0x032a831e, 0x00b318f1, 0x01f638c2, 0x03788429, 0x0031a524}}}, + {X: Field{[10]uint32{0x02c5e8b3, 0x015ba444, 0x0013405f, 0x005f2c6e, 0x0055a805, 0x02a26dd5, 0x027d8c28, 0x0060fe69, 0x03062414, 0x001c570a}}, Y: Field{[10]uint32{0x0120370b, 0x015dcfc9, 0x03b33920, 0x000e5de1, 0x0123167f, 0x03e12d35, 0x02d4cca7, 0x01771c78, 0x01c89a79, 0x003e26e2}}}, + {X: Field{[10]uint32{0x0374d3b6, 0x03d03723, 0x024c78f1, 0x00277626, 0x01057aed, 0x03f976fd, 0x0377662e, 0x03f1e1d9, 0x0200f974, 0x00383433}}, Y: Field{[10]uint32{0x03e3eb56, 0x01c138b8, 0x000d3e85, 0x03f9f2cf, 0x03c253be, 0x01315447, 0x03c7f05c, 0x01211e52, 0x0265ed70, 0x002b316f}}}, + {X: Field{[10]uint32{0x026432a2, 0x002ac7f4, 0x02222e77, 0x021d6eb5, 0x01bdba9a, 0x033674a8, 0x01aaf75e, 0x02e2de69, 0x028976fb, 0x000dd54c}}, Y: Field{[10]uint32{0x02ced92d, 0x00584230, 0x01d77eb0, 0x01f0b170, 0x0001087e, 0x00aca822, 0x00bc7d01, 0x00192f60, 0x02331b7e, 0x001b6ef8}}}, + {X: Field{[10]uint32{0x03e3d3ff, 0x02ace81b, 0x00699446, 0x0144aaf7, 0x00f46ca6, 0x02cabec1, 0x003f6b08, 0x0240da1a, 0x03ef51ea, 0x000ba570}}, Y: Field{[10]uint32{0x019b554a, 0x02d030ca, 0x0349839c, 0x019802ca, 0x0201556c, 0x01876f18, 0x0063b94c, 0x037f8121, 0x0287b1d8, 0x0002417a}}}, + {X: Field{[10]uint32{0x00ff8eb5, 0x01f5d6b1, 0x02cf40fe, 0x0036d645, 0x02646758, 0x01cd54fd, 0x035c67fb, 0x00c915fc, 0x021e721f, 0x00094c43}}, Y: Field{[10]uint32{0x006b4ace, 0x02d50c1e, 0x03041016, 0x018b05fa, 0x0146ecd6, 0x01f72ac7, 0x01a359b8, 0x03bad509, 0x02f9be42, 0x00271794}}}, + {X: Field{[10]uint32{0x03830b7b, 0x001fd46d, 0x013b0cf7, 0x01f5febd, 0x0227a23b, 0x035f2d41, 0x00779117, 0x03f0b75e, 0x031b2b24, 0x000964ca}}, Y: Field{[10]uint32{0x03536765, 0x00cb6477, 0x00f3e04e, 0x00180427, 0x022215e2, 0x037ce8ab, 0x03969a6d, 0x009ac075, 0x03b4acdb, 0x001fa388}}}, + {X: Field{[10]uint32{0x03c5ed3e, 0x005a911c, 0x0284e22b, 0x017ac26d, 0x02892e13, 0x025fd6e2, 0x029ba443, 0x01d99ee9, 0x02f6251f, 0x001f48ca}}, Y: Field{[10]uint32{0x02d8356e, 0x00995c69, 0x0392c1cd, 0x01165426, 0x00131b90, 0x026093c7, 0x03dea61d, 0x0226d633, 0x0238c8a5, 0x0028fa3d}}}, + {X: Field{[10]uint32{0x00c720f9, 0x03a5d572, 0x03633cb9, 0x01141211, 0x026afc86, 0x01125581, 0x03e05b0a, 0x03aa1ee8, 0x02a01b65, 0x001355b2}}, Y: Field{[10]uint32{0x03537330, 0x0105dc5d, 0x0208f50f, 0x03865deb, 0x007c1eae, 0x00dbc0d2, 0x03f1ada9, 0x01465f28, 0x027836e6, 0x000530d1}}}, + {X: Field{[10]uint32{0x0100a88b, 0x03bef671, 0x01c2c122, 0x000cdc9f, 0x032615b5, 0x031c8bb5, 0x01c81f42, 0x03e2eddd, 0x0165ca6f, 0x001c6af4}}, Y: Field{[10]uint32{0x012620f1, 0x02ae2112, 0x00eb9c39, 0x01499089, 0x01a59693, 0x0046b12e, 0x031c46ae, 0x013e18be, 0x00670728, 0x001e6e89}}}, + {X: Field{[10]uint32{0x02a48965, 0x00ba4195, 0x039f4200, 0x01d31045, 0x0230215e, 0x03176795, 0x00496345, 0x00146731, 0x00ccc381, 0x002118bf}}, Y: Field{[10]uint32{0x03787d4b, 0x00241229, 0x005cb64d, 0x029d70f0, 0x00f0eb75, 0x027f1190, 0x0148a7e2, 0x02e662f1, 0x0166cd7f, 0x00014d6a}}}, + {X: Field{[10]uint32{0x02c09826, 0x03a4d44d, 0x01ae3286, 0x0011bf91, 0x00b9c2b1, 0x0195a12a, 0x0178b5c6, 0x0147402d, 0x0093fed7, 0x003da3ab}}, Y: Field{[10]uint32{0x0148bff5, 0x013f117f, 0x01831733, 0x0355cca8, 0x0366f7d8, 0x02943952, 0x0119ff2f, 0x02a28a3c, 0x032b98b0, 0x00263830}}}, + {X: Field{[10]uint32{0x01f72041, 0x0110acb6, 0x00b1615f, 0x031f9250, 0x0243467d, 0x01bfd5a6, 0x00e4014f, 0x0364d670, 0x025009a8, 0x0018511c}}, Y: Field{[10]uint32{0x02c8f807, 0x00cc505e, 0x02d2eb2f, 0x0024abac, 0x00fa58f2, 0x03efaa22, 0x02a7108d, 0x01fb9f7b, 0x037fc7f5, 0x0003edc5}}}, + {X: Field{[10]uint32{0x0315614f, 0x023b3152, 0x01497fc2, 0x0324de68, 0x01c9846a, 0x00b6233c, 0x0259a26e, 0x006f4b88, 0x02114ffa, 0x003a9a7b}}, Y: Field{[10]uint32{0x00e4e2de, 0x02dda317, 0x022c9b17, 0x006e026d, 0x0163183d, 0x0375b3cf, 0x00141083, 0x035d4244, 0x01b51dd6, 0x001626e0}}}, + {X: Field{[10]uint32{0x025d5263, 0x01319813, 0x02b78146, 0x0057147e, 0x0338e6aa, 0x01ffc542, 0x01a1ce0d, 0x037a5990, 0x03243404, 0x000d1c9e}}, Y: Field{[10]uint32{0x0027d4f2, 0x00a27536, 0x03804435, 0x03cb56ef, 0x031920bf, 0x03001a74, 0x039baadd, 0x0329dcd6, 0x026bcf56, 0x0024660c}}}, + {X: Field{[10]uint32{0x02217461, 0x02343667, 0x02ad952f, 0x036549b3, 0x00eeebf4, 0x03a62d3c, 0x022d2756, 0x01e370a7, 0x02ae6137, 0x00254914}}, Y: Field{[10]uint32{0x02d486a8, 0x01c5d6ca, 0x035ff079, 0x020b7052, 0x03c17f65, 0x006c5046, 0x0250eb10, 0x03ed6be6, 0x0228c195, 0x003022ce}}}, + {X: Field{[10]uint32{0x038e49ff, 0x02855ab9, 0x01bfd2d4, 0x010af78b, 0x02401b83, 0x019840c1, 0x01afeba6, 0x022f1dfa, 0x0318dc4a, 0x003ef28f}}, Y: Field{[10]uint32{0x014129c9, 0x01f910fe, 0x029b6c7b, 0x01ceee4c, 0x034cf755, 0x01dae493, 0x020db7bc, 0x02cb7bb6, 0x016d6027, 0x000ae0a7}}}, + {X: Field{[10]uint32{0x03d8c141, 0x03130556, 0x0082b57b, 0x03fee502, 0x005302bf, 0x0022929c, 0x03dff64a, 0x0190ea55, 0x011d7ddc, 0x0031f77c}}, Y: Field{[10]uint32{0x02708e20, 0x01559a5b, 0x02a8889d, 0x038628f6, 0x03b3711e, 0x00e6f9e6, 0x03e81468, 0x02c0600f, 0x01f1ac93, 0x003a7284}}}, + {X: Field{[10]uint32{0x00ce31b8, 0x03b9299c, 0x02fa2cd0, 0x014e72db, 0x011b3f23, 0x039a0860, 0x031f7e44, 0x0018fae0, 0x023086e3, 0x001c410e}}, Y: Field{[10]uint32{0x01322c9d, 0x02df2d22, 0x03411ebc, 0x01914c82, 0x019334c1, 0x0178a613, 0x029cc925, 0x0349cd2a, 0x0338ef9f, 0x00136cfc}}}, + {X: Field{[10]uint32{0x00602585, 0x01a9dd92, 0x034c3dbb, 0x0111e644, 0x005d70f0, 0x003e8dd7, 0x0349d368, 0x01f2ef64, 0x02401534, 0x001b793a}}, Y: Field{[10]uint32{0x03960418, 0x01df7c9f, 0x03d70f1d, 0x010ce31c, 0x02458a32, 0x01c0973c, 0x028d8394, 0x014b6fba, 0x018865ab, 0x0000edd9}}}, + {X: Field{[10]uint32{0x024fecbe, 0x0095a5ae, 0x02215bc4, 0x030387e9, 0x01db9a0c, 0x03dee80f, 0x017e23b6, 0x03b2dfa8, 0x039f467c, 0x000a7ea9}}, Y: Field{[10]uint32{0x00f34838, 0x03fe86d2, 0x01154e50, 0x017b4bfc, 0x0264a224, 0x01af7c41, 0x03027d04, 0x02f0a707, 0x011fc42f, 0x00396a9a}}}, + {X: Field{[10]uint32{0x02aafc99, 0x010be4c5, 0x00f79c8c, 0x02e1d244, 0x03d750f8, 0x00afe3d6, 0x025f15a0, 0x016c89e3, 0x03fc25ae, 0x003fe202}}, Y: Field{[10]uint32{0x025747df, 0x03bba08e, 0x00b105ee, 0x019af228, 0x0360e7a1, 0x02ed40b6, 0x0025bd81, 0x023de4de, 0x030a0072, 0x00254d7d}}}, + {X: Field{[10]uint32{0x00a2a378, 0x01af4be9, 0x00eeef6a, 0x02c90949, 0x0160eff0, 0x014ba302, 0x020c5663, 0x03dbd614, 0x02a03837, 0x002de06d}}, Y: Field{[10]uint32{0x00dbbb62, 0x03ffefd3, 0x01e4fc44, 0x027989d5, 0x01cbf838, 0x0304ada7, 0x0322ee73, 0x00f7650d, 0x03d46c68, 0x002b35ed}}}, + {X: Field{[10]uint32{0x027406db, 0x01028ed1, 0x01990ee5, 0x01896411, 0x03b3f190, 0x00b92b0a, 0x0332c648, 0x03174369, 0x0193e8ba, 0x001b65d9}}, Y: Field{[10]uint32{0x032a8b6b, 0x01fa704b, 0x016583bd, 0x00966a2e, 0x016cbc18, 0x00a92abb, 0x00bb9c0f, 0x020585b0, 0x03e4af6d, 0x000c30d4}}}, + {X: Field{[10]uint32{0x00dc3032, 0x0219af5b, 0x014015d0, 0x0208a9b6, 0x03683ec7, 0x03eb4784, 0x02121129, 0x03836d18, 0x036a4dd3, 0x00063b59}}, Y: Field{[10]uint32{0x00a51bd5, 0x009ac580, 0x019bb8ef, 0x039dfb8c, 0x0006f9a6, 0x01780d9c, 0x03b97626, 0x02a0a97d, 0x02e15dbf, 0x00321ac1}}}, + {X: Field{[10]uint32{0x035ce2a1, 0x015032b6, 0x0118ceb3, 0x034ee547, 0x01d1e859, 0x03bf52e3, 0x00bce4da, 0x003ff30b, 0x0238e944, 0x0000c4e3}}, Y: Field{[10]uint32{0x0095c241, 0x038a325a, 0x029a3430, 0x010253be, 0x03fef4bc, 0x02431b9b, 0x0260a134, 0x02199f75, 0x01b2a11a, 0x0037e2ac}}}, + {X: Field{[10]uint32{0x00b00c95, 0x015c73fa, 0x03c3a091, 0x0023d240, 0x02163ce6, 0x0126a5d8, 0x02b1e761, 0x0326aae2, 0x00ac2025, 0x001d5f7d}}, Y: Field{[10]uint32{0x03a03430, 0x0353b337, 0x018c4a37, 0x032d343f, 0x01c56bd7, 0x014001d9, 0x0115ab76, 0x0317611f, 0x01feab36, 0x003fc2bd}}}, + {X: Field{[10]uint32{0x004c27e1, 0x01c10262, 0x015cc9aa, 0x03a1142e, 0x020ce09d, 0x0078ecbc, 0x03319a08, 0x01626f44, 0x02527156, 0x00229a5e}}, Y: Field{[10]uint32{0x0151f39d, 0x0027e1ab, 0x03ca13df, 0x039aefc0, 0x015a5edd, 0x00ccb576, 0x032815ad, 0x027a78df, 0x013cb602, 0x00027bae}}}, + {X: Field{[10]uint32{0x018c721b, 0x035838f9, 0x000b1650, 0x026f53d3, 0x01d35eb8, 0x00dea135, 0x03c2198e, 0x0382c5b3, 0x018736f9, 0x002c2eda}}, Y: Field{[10]uint32{0x016e00dc, 0x018d8efb, 0x001ebb3b, 0x0054bd23, 0x010b8556, 0x02ce3a0b, 0x009808f0, 0x02d405bc, 0x0200ce25, 0x000cf56c}}}, + {X: Field{[10]uint32{0x0037efed, 0x006d5172, 0x022d8d9f, 0x017a41ab, 0x03ef6d6f, 0x034be3fd, 0x037882a0, 0x0118d098, 0x01de5dde, 0x0007283b}}, Y: Field{[10]uint32{0x002863bc, 0x027af6aa, 0x02e41acb, 0x013eb163, 0x024c4d3a, 0x017ae7cf, 0x015d4c0f, 0x01a0f69f, 0x01ae4cff, 0x00067bed}}}, + {X: Field{[10]uint32{0x01474aa7, 0x03f10893, 0x0121ed90, 0x006b793a, 0x01d59ad1, 0x00786dd9, 0x02849310, 0x0395f59a, 0x030eb9a4, 0x001e0396}}, Y: Field{[10]uint32{0x033ab811, 0x024c8304, 0x016a3d33, 0x03fd0614, 0x001d8f34, 0x01e6a8e9, 0x02579f4c, 0x017c84b6, 0x00cc58cc, 0x0017af67}}}, + {X: Field{[10]uint32{0x00eb4c9d, 0x01a1b68d, 0x01468edf, 0x026952fc, 0x0330ec07, 0x037c8429, 0x02af620c, 0x021414b4, 0x00e93980, 0x003dfa4b}}, Y: Field{[10]uint32{0x00f93666, 0x03deae5e, 0x035857b1, 0x0259ea22, 0x0257c234, 0x00bc52b6, 0x03d54c03, 0x02a58563, 0x01cfe113, 0x000b1567}}}, + {X: Field{[10]uint32{0x0289f938, 0x01f69712, 0x036f54bc, 0x02909a4c, 0x013a5688, 0x00360358, 0x01ff8092, 0x00829e3e, 0x022075bb, 0x000f0ebe}}, Y: Field{[10]uint32{0x03888c8d, 0x03cfe71e, 0x0132b978, 0x0364fc74, 0x023bd836, 0x0190d7c8, 0x023a9f54, 0x00d75b95, 0x03081dd2, 0x001fbce0}}}, + {X: Field{[10]uint32{0x022097ee, 0x03ec557c, 0x01115af4, 0x03700c06, 0x0389fb9e, 0x01f95848, 0x01ec59e0, 0x03e6d5d7, 0x001dee60, 0x001c75bc}}, Y: Field{[10]uint32{0x0080bfee, 0x0011c387, 0x016802ef, 0x03483abc, 0x0138da4f, 0x02d050c8, 0x0054091f, 0x028d714a, 0x02454a31, 0x00387330}}}, + {X: Field{[10]uint32{0x00c4fa2d, 0x03dd6e4e, 0x036ea1f5, 0x00c7162a, 0x02b107fc, 0x039895f7, 0x00a77b28, 0x03b20242, 0x020f5705, 0x0025c999}}, Y: Field{[10]uint32{0x008cd4c1, 0x021a526d, 0x000c690c, 0x039c23a9, 0x01d3636f, 0x01b6c319, 0x018c213b, 0x0347a584, 0x03ae3102, 0x00253301}}}, + {X: Field{[10]uint32{0x02802719, 0x000ab0ac, 0x004b87fd, 0x004bb07f, 0x02297fad, 0x01fa2d8c, 0x011a1a29, 0x0286bc1a, 0x00c754b2, 0x002b3974}}, Y: Field{[10]uint32{0x039f85eb, 0x03252162, 0x008581f4, 0x032b4934, 0x027fc843, 0x03c6235a, 0x02491f05, 0x01c973ae, 0x03248d3e, 0x002493e7}}}, + {X: Field{[10]uint32{0x01943f64, 0x0159ace1, 0x018b88fa, 0x03f588ba, 0x028200ea, 0x00e2928a, 0x01778f28, 0x003fc333, 0x006b3480, 0x003e944c}}, Y: Field{[10]uint32{0x0296e293, 0x01721c50, 0x015c85f0, 0x015eb4d3, 0x0104b677, 0x0324ad43, 0x00ee030f, 0x0121ce87, 0x02166b14, 0x002d83b9}}}, + {X: Field{[10]uint32{0x01bea60a, 0x0275610b, 0x030f17c1, 0x0165845c, 0x000b716a, 0x0163abf3, 0x00097ee4, 0x009699e7, 0x0018329d, 0x002177e4}}, Y: Field{[10]uint32{0x017ab0fa, 0x03a24462, 0x0180ae62, 0x031bcbda, 0x00b7bc64, 0x039e1ddd, 0x01ad7c09, 0x008473a6, 0x01b6046d, 0x00315575}}}, + {X: Field{[10]uint32{0x00af5e3a, 0x02627389, 0x037f3efb, 0x03d1e018, 0x01337ff5, 0x0398d2a6, 0x0061b52a, 0x01119ead, 0x000dc202, 0x000bddf0}}, Y: Field{[10]uint32{0x005e3e39, 0x0039fea4, 0x0325303f, 0x039ebbca, 0x020c5d28, 0x039fbee9, 0x00c52b0b, 0x03eaf61c, 0x0278ebcb, 0x0031fd29}}}, + {X: Field{[10]uint32{0x028bb34e, 0x03123088, 0x0200158f, 0x03d6c3bd, 0x011f238d, 0x02e00afd, 0x036a4997, 0x0143583f, 0x023a7200, 0x0014b628}}, Y: Field{[10]uint32{0x003d9136, 0x00c0b6e0, 0x000f2ccd, 0x004b245e, 0x02cebb18, 0x030c31e1, 0x02d29b51, 0x02386858, 0x01a7861b, 0x00262ba0}}}, + {X: Field{[10]uint32{0x0212b211, 0x003b6c5c, 0x022fd37b, 0x008901d1, 0x00701daf, 0x01d556d7, 0x03b83204, 0x0001248b, 0x0079eaca, 0x0029fcf9}}, Y: Field{[10]uint32{0x03bdaada, 0x019402e7, 0x03ae8e92, 0x01f311db, 0x013e3376, 0x006eb00e, 0x0268498d, 0x029f05ee, 0x010c8c4c, 0x00203d86}}}, + {X: Field{[10]uint32{0x02356103, 0x01181f28, 0x00880ea0, 0x0264023d, 0x0373db57, 0x0108e0ab, 0x03bf4d79, 0x034c9986, 0x0150e67b, 0x000c7bcc}}, Y: Field{[10]uint32{0x00a9a8ee, 0x020d2c6a, 0x00954631, 0x01ab8f4b, 0x01bc03c4, 0x012c5bb5, 0x0350bb51, 0x00a3464e, 0x01d6655d, 0x001f6e3d}}}, + {X: Field{[10]uint32{0x038b058d, 0x03b8914e, 0x031fceab, 0x034e1a04, 0x00599b0c, 0x00bb7a8c, 0x02d1ee35, 0x000a64e6, 0x0155469c, 0x003ba0bc}}, Y: Field{[10]uint32{0x0092b10c, 0x00bfcc14, 0x00400eed, 0x0263c0e5, 0x0032de93, 0x02b6e263, 0x01d9ed6c, 0x030b10ab, 0x014e2d77, 0x003f4303}}}, + {X: Field{[10]uint32{0x016b4586, 0x0347df95, 0x0073e206, 0x0242d15a, 0x01273549, 0x0281c55d, 0x01f7d458, 0x0375bc2a, 0x007abfce, 0x00037b1f}}, Y: Field{[10]uint32{0x007200c4, 0x0060041d, 0x0327673c, 0x031ee172, 0x002c7626, 0x01e7f8c8, 0x02f0912b, 0x025fd061, 0x02b4cad5, 0x002be106}}}, + {X: Field{[10]uint32{0x00d2369d, 0x02cd347d, 0x0362e526, 0x004bb921, 0x002bf34f, 0x01466f60, 0x011ba405, 0x01bfa5d6, 0x037048cd, 0x0030a38c}}, Y: Field{[10]uint32{0x00636e8b, 0x003ac5fc, 0x01a647d5, 0x0148e4c9, 0x03b8640f, 0x025dae84, 0x0086dba6, 0x019cc5fd, 0x03ddda45, 0x0003802a}}}, + {X: Field{[10]uint32{0x03222195, 0x011448f7, 0x01a93071, 0x00c473c1, 0x01370277, 0x003c8d4c, 0x0029e9db, 0x017d9403, 0x00a92c27, 0x0011c55f}}, Y: Field{[10]uint32{0x01cbef6e, 0x003833a2, 0x00dc4f43, 0x01cacd3e, 0x009fefeb, 0x0107321d, 0x007e9ed4, 0x03f496be, 0x03fac911, 0x001922c5}}}, + {X: Field{[10]uint32{0x00a73241, 0x01c6991b, 0x03868f54, 0x014e9eac, 0x039a0a92, 0x027fc651, 0x01b55037, 0x014f3b60, 0x0302745c, 0x00213445}}, Y: Field{[10]uint32{0x01f858c5, 0x0382f089, 0x016b62c0, 0x03076359, 0x01fc593e, 0x01139933, 0x03b13536, 0x0021e93b, 0x02a20c3c, 0x0013c5ad}}}, + {X: Field{[10]uint32{0x03d63fc9, 0x02f8b5e5, 0x02dccb7f, 0x00a23a46, 0x03c74e81, 0x02a20471, 0x02b2f28e, 0x0182e1ac, 0x00221960, 0x000eee8c}}, Y: Field{[10]uint32{0x0334e286, 0x00f4a8a9, 0x02f3a9d7, 0x0262db9f, 0x00879d3f, 0x03a93d53, 0x03c5aa12, 0x014dce9d, 0x014af094, 0x001fcd01}}}, + {X: Field{[10]uint32{0x00651c6b, 0x03a281a6, 0x038f4425, 0x001aaa14, 0x00b9f746, 0x00f5039c, 0x037485ab, 0x01850c90, 0x03f47a2c, 0x0002158d}}, Y: Field{[10]uint32{0x03396054, 0x0002b664, 0x00096c35, 0x00c68c34, 0x02f76e85, 0x020e940d, 0x03075760, 0x00ac799e, 0x01d56fb4, 0x002f1aa5}}}, + {X: Field{[10]uint32{0x01bbd123, 0x01bb4c53, 0x0167d8ea, 0x010a902a, 0x02e8021a, 0x034f150f, 0x02d1605d, 0x00066887, 0x02985e75, 0x00094c0b}}, Y: Field{[10]uint32{0x02797a83, 0x02936399, 0x010f3267, 0x00e447f7, 0x01c02206, 0x004dc4fe, 0x02f9b4ba, 0x01d64751, 0x03e02309, 0x00212732}}}, + {X: Field{[10]uint32{0x003bea40, 0x01fd793d, 0x01f8e411, 0x003edae1, 0x03485fde, 0x029c82b8, 0x00d73dab, 0x024f8f02, 0x00bf88e3, 0x0039668c}}, Y: Field{[10]uint32{0x0197dfd5, 0x02112618, 0x02fb4422, 0x01921e1c, 0x0383ebbb, 0x00f92fe0, 0x00fa6bd3, 0x032cdc68, 0x024fe222, 0x001bf5e0}}}, + {X: Field{[10]uint32{0x02247e4e, 0x03e060fd, 0x025bda83, 0x0074b04d, 0x02de0533, 0x024d778b, 0x01e9bc3b, 0x00698162, 0x01f69798, 0x0031640b}}, Y: Field{[10]uint32{0x0175fe3c, 0x016b1f4b, 0x02c91f86, 0x01bae4f6, 0x0121d073, 0x03fadf38, 0x035ecb58, 0x0147bc6a, 0x014f5af5, 0x00319fac}}}, + {X: Field{[10]uint32{0x015e66ad, 0x02ad3983, 0x00c1b277, 0x0270b9b1, 0x01b8b640, 0x0138f202, 0x039a9b47, 0x0049fb19, 0x02c7fe27, 0x0037e2f6}}, Y: Field{[10]uint32{0x017d43e1, 0x02c409dc, 0x02dc7645, 0x01bf0099, 0x00273825, 0x00bad1c2, 0x01802ed7, 0x00e25953, 0x03e49f0b, 0x000ffc9b}}}, + {X: Field{[10]uint32{0x0065a82c, 0x0233dd8b, 0x02cf3f1e, 0x00942459, 0x009eff91, 0x0204357c, 0x01c7c02b, 0x02e32b0e, 0x004e9c7c, 0x00075550}}, Y: Field{[10]uint32{0x02a7632f, 0x02ee6f6c, 0x00707c24, 0x03a82681, 0x03e5a760, 0x00bf1348, 0x0099f64a, 0x03228d71, 0x0023f6a1, 0x00305e1c}}}, + {X: Field{[10]uint32{0x01f43b44, 0x03b82203, 0x034ef804, 0x02599e86, 0x002d040e, 0x01617914, 0x0106073d, 0x03f7eda1, 0x00c9b035, 0x000d7ce4}}, Y: Field{[10]uint32{0x03f512a2, 0x01768e2f, 0x010383c5, 0x00ab690f, 0x004c3cad, 0x003ae5d5, 0x0036fec5, 0x0362ddf7, 0x018886aa, 0x001aa173}}}, + {X: Field{[10]uint32{0x01e059b0, 0x01d13131, 0x006d588f, 0x01bb50f4, 0x011d2278, 0x0091273f, 0x02d7005b, 0x023e9bc9, 0x000dee88, 0x003eec21}}, Y: Field{[10]uint32{0x01b8d3bf, 0x034ac973, 0x005a6508, 0x03d2f4f5, 0x02203b05, 0x03d946eb, 0x00ffa219, 0x01c3c8e9, 0x014fd89a, 0x00191814}}}, + {X: Field{[10]uint32{0x034d78d7, 0x02049c68, 0x00ac9ce4, 0x0384cd4f, 0x0161fa0a, 0x01a4c7a4, 0x0208ac46, 0x01d77111, 0x00f01c22, 0x0009015b}}, Y: Field{[10]uint32{0x03c7751f, 0x0286d8f2, 0x011bf7dd, 0x028361a9, 0x01965a3f, 0x00d2949d, 0x003088f4, 0x020746fc, 0x03c67e73, 0x0010faf4}}}, + {X: Field{[10]uint32{0x00f9cd78, 0x02465c9c, 0x01297e77, 0x01175f9c, 0x0354f9f7, 0x035cbdac, 0x007c938c, 0x01f1e238, 0x03dfe844, 0x000ec410}}, Y: Field{[10]uint32{0x0240d6fc, 0x03c4a697, 0x0050c34a, 0x0184385b, 0x03b67ba3, 0x00ac6171, 0x02c29d4b, 0x03544449, 0x00c4abf0, 0x000a380a}}}, + {X: Field{[10]uint32{0x01a040e6, 0x03b7481a, 0x03a81a5b, 0x023d715d, 0x008088b0, 0x018d6017, 0x0175b236, 0x00d8e203, 0x01d14179, 0x002bbe42}}, Y: Field{[10]uint32{0x0200dc51, 0x006edf21, 0x03382d8a, 0x03007125, 0x0293350c, 0x03d028fe, 0x00c2b43d, 0x01adb174, 0x006f0de2, 0x00032ed3}}}, + {X: Field{[10]uint32{0x02833f28, 0x027e74f2, 0x007ac02c, 0x02e043d0, 0x03913367, 0x03c8a6f1, 0x0359aef5, 0x00c72dbf, 0x00f73863, 0x00323525}}, Y: Field{[10]uint32{0x010de4d2, 0x02a9d2ec, 0x01a67e70, 0x009e358b, 0x00c7b850, 0x034fbc45, 0x01afdacb, 0x0217534e, 0x02f94b62, 0x0032cb1d}}}, + {X: Field{[10]uint32{0x00f75b28, 0x00e44e4d, 0x033f5f4f, 0x005dbf97, 0x03c1b52e, 0x00779ed7, 0x00744437, 0x0328c8f7, 0x03f7af14, 0x00096bf3}}, Y: Field{[10]uint32{0x0142b789, 0x01c5c89a, 0x03781752, 0x03ed2bd2, 0x025010cd, 0x03541699, 0x031f57f8, 0x01fa5db2, 0x00a47f9d, 0x003619e9}}}, + {X: Field{[10]uint32{0x0132e2c7, 0x03658c8f, 0x022f819a, 0x00b5dc23, 0x01d40768, 0x022f5cb9, 0x02c220dc, 0x024c361c, 0x0086f773, 0x000090db}}, Y: Field{[10]uint32{0x00ab67a5, 0x02737aa2, 0x01662bc8, 0x021cdfc0, 0x0320a958, 0x0138501f, 0x00de6902, 0x0198f311, 0x01ea92af, 0x001b8e5b}}}, + {X: Field{[10]uint32{0x007f349d, 0x03d34945, 0x0056b0d0, 0x02e1fcf3, 0x0257638b, 0x0064567b, 0x00bcb86e, 0x00cf1e44, 0x03d59e57, 0x001873ba}}, Y: Field{[10]uint32{0x02fadb9e, 0x012c573c, 0x02aef3e7, 0x023e18a0, 0x027d8521, 0x01068c3a, 0x023082e7, 0x03b423ed, 0x0145e9b0, 0x000aa141}}}, + {X: Field{[10]uint32{0x00b6c187, 0x03a05fad, 0x0116dd77, 0x039b840b, 0x030dcbfe, 0x0278a91b, 0x0391a737, 0x0001c50a, 0x03b5d45d, 0x0016844c}}, Y: Field{[10]uint32{0x00d492e1, 0x03c0c14a, 0x0381f0f6, 0x03a3ce63, 0x0134c1c2, 0x00ce92df, 0x01c05171, 0x036710f2, 0x02aeafd6, 0x000bff65}}}, + {X: Field{[10]uint32{0x0163c8ac, 0x00e343d1, 0x0129309c, 0x0244c537, 0x01fff0f1, 0x0372c4ee, 0x02b5abe8, 0x006d04a7, 0x00498b70, 0x002dd28e}}, Y: Field{[10]uint32{0x00b9014f, 0x02599e67, 0x01186ffa, 0x00a3e10c, 0x01689be5, 0x0299de15, 0x00d6f7c5, 0x0083f619, 0x0257e50a, 0x00276113}}}, + {X: Field{[10]uint32{0x0389d26c, 0x032c8117, 0x024b752f, 0x01b2992a, 0x008e9a80, 0x02a54ab5, 0x011c3375, 0x0082d0ff, 0x00d04afb, 0x0030d727}}, Y: Field{[10]uint32{0x01a9c65a, 0x021de49e, 0x015a4b7e, 0x030fc1a7, 0x0248c765, 0x0278656c, 0x0279d841, 0x03bf2f7b, 0x02aa4a83, 0x002c1071}}}, + {X: Field{[10]uint32{0x00b82b96, 0x022b4df4, 0x025e8fea, 0x037b96db, 0x0311703d, 0x01e45075, 0x00b2af44, 0x01a2cfc1, 0x02587538, 0x0026a16a}}, Y: Field{[10]uint32{0x03d75d27, 0x0366549e, 0x005f2551, 0x0104efd2, 0x024e0620, 0x00cfb189, 0x00b80752, 0x03c0ef49, 0x00abaa16, 0x0011971c}}}, + {X: Field{[10]uint32{0x0086fe14, 0x03ac15d7, 0x0061bd12, 0x028f3e93, 0x01b3e825, 0x02f48fd2, 0x0183c14c, 0x03cf944b, 0x03cce051, 0x000fb1c6}}, Y: Field{[10]uint32{0x01915bdc, 0x017c17ba, 0x00007db3, 0x00ea6a54, 0x0245caba, 0x000cfc6a, 0x0294c5ab, 0x0295a954, 0x021de2da, 0x003c6630}}}, + {X: Field{[10]uint32{0x0359ae63, 0x0123c02c, 0x01b45aea, 0x01e4dcdf, 0x036b09e5, 0x00d6fccf, 0x0010e235, 0x007b7824, 0x0222939e, 0x003b872f}}, Y: Field{[10]uint32{0x021b90a5, 0x01e005e4, 0x0228d471, 0x0367794c, 0x01acecb6, 0x036adaa4, 0x037d2971, 0x0137d89f, 0x0026d444, 0x002fd810}}}, + {X: Field{[10]uint32{0x0346073e, 0x03c32659, 0x01ee78dc, 0x00aef222, 0x035a8cd9, 0x03fd3409, 0x007677d1, 0x00e98bbd, 0x03e171de, 0x003af2fc}}, Y: Field{[10]uint32{0x02f6ebe8, 0x00fd5d27, 0x03f9805c, 0x02428e08, 0x0195c6d8, 0x00b6b7ae, 0x014a3f30, 0x01c89024, 0x03c7bc9c, 0x0021e358}}}, + {X: Field{[10]uint32{0x039db797, 0x006cbf6a, 0x01ae56e8, 0x00c30243, 0x01b60664, 0x01654836, 0x03c57d52, 0x03bc56e1, 0x02e4ce72, 0x00393a4b}}, Y: Field{[10]uint32{0x015f944c, 0x03da5959, 0x00217ebe, 0x0232707e, 0x026d2183, 0x0161dd14, 0x01f47dbf, 0x029d4d56, 0x00654a03, 0x000feab1}}}, + {X: Field{[10]uint32{0x02ac1cc1, 0x010b7437, 0x03d635bc, 0x0319f078, 0x03cf275f, 0x00bac7d9, 0x00ef7431, 0x00ac0ded, 0x03588e29, 0x003f0739}}, Y: Field{[10]uint32{0x025186d7, 0x01e58f79, 0x019b42fe, 0x024b08e2, 0x02495bc3, 0x032bf2de, 0x03c791e8, 0x0366bdfd, 0x01bf44f7, 0x0005dade}}}, + {X: Field{[10]uint32{0x0294fc56, 0x031c15ae, 0x0091f9e9, 0x00eae5e9, 0x0149482b, 0x03257be1, 0x02a86b21, 0x01a9b1a4, 0x03ff179e, 0x003c7d6f}}, Y: Field{[10]uint32{0x0239e143, 0x009613e2, 0x0209313a, 0x00484318, 0x00670415, 0x030aab9c, 0x00f06205, 0x00ef0fed, 0x03a8a2cd, 0x000e2495}}}, + {X: Field{[10]uint32{0x03793eb9, 0x0113f5aa, 0x03323ac7, 0x00b9d230, 0x012c7aaa, 0x005d6850, 0x02bfef8d, 0x038006e9, 0x001461c3, 0x0026039d}}, Y: Field{[10]uint32{0x0331826c, 0x029d8946, 0x00259c7f, 0x00e98db1, 0x0134cbb3, 0x010a1801, 0x00dde28d, 0x017a0ecf, 0x01ae29e0, 0x001b8df7}}}, + {X: Field{[10]uint32{0x01b1c179, 0x0095fb68, 0x0207f66a, 0x029a9bde, 0x01adb7fa, 0x039b0655, 0x01986dc7, 0x01495c1c, 0x03f7686a, 0x003d4673}}, Y: Field{[10]uint32{0x0255a807, 0x03ae3c82, 0x0297f09e, 0x03b470c7, 0x03174ed4, 0x024ee140, 0x001d008a, 0x017261e5, 0x02b08c76, 0x000fa00f}}}, + {X: Field{[10]uint32{0x028f8061, 0x0389d56e, 0x00eee144, 0x00e443b7, 0x009011d9, 0x02f31730, 0x029bafd0, 0x03faa46e, 0x01ea3851, 0x000b7636}}, Y: Field{[10]uint32{0x01a52ae3, 0x03f81347, 0x00dc1365, 0x02a73a5c, 0x007adfde, 0x03bd4986, 0x00d058b4, 0x011a24df, 0x01afd422, 0x001851fc}}}, + {X: Field{[10]uint32{0x0054a4ae, 0x03f5e005, 0x01b35ede, 0x02335f42, 0x032854f8, 0x02a803d8, 0x02c0c415, 0x00d4dd1e, 0x02620948, 0x00218310}}, Y: Field{[10]uint32{0x033392f4, 0x039b8bb5, 0x01cef95c, 0x028a014d, 0x01d15378, 0x03bbc361, 0x03dfc561, 0x01b49639, 0x022a7d82, 0x0028a9e8}}}, + {X: Field{[10]uint32{0x02d732a6, 0x01eb42eb, 0x00b28ae9, 0x0240b259, 0x01e0697f, 0x0014d482, 0x007d4ea2, 0x00b0f426, 0x00ec17d8, 0x0039dac8}}, Y: Field{[10]uint32{0x03f54bf0, 0x02092499, 0x038f4ad1, 0x00df665f, 0x0132bc11, 0x0311fdc0, 0x037cec9c, 0x0184eff6, 0x00b685f6, 0x00325e11}}}, + {X: Field{[10]uint32{0x0110ab88, 0x0157bf42, 0x007a6504, 0x03378f41, 0x03718ec9, 0x00a905ed, 0x02862b16, 0x0296098d, 0x010d12fb, 0x00099cc7}}, Y: Field{[10]uint32{0x03542192, 0x029c7f26, 0x017143b1, 0x00251ee9, 0x028d2986, 0x001cdb5b, 0x022023bb, 0x0129841b, 0x03b30b46, 0x000f043b}}}, + {X: Field{[10]uint32{0x0224dcde, 0x0177e768, 0x00ea8986, 0x003a2cb6, 0x003fc457, 0x0340536c, 0x03e46f5e, 0x02046a1f, 0x007852db, 0x001432d2}}, Y: Field{[10]uint32{0x0339621d, 0x012f60e2, 0x006f95d5, 0x0234c0f4, 0x00c69db4, 0x00403914, 0x03572a0c, 0x02ba2623, 0x00a87937, 0x002ee122}}}, + {X: Field{[10]uint32{0x03b02a60, 0x03bac87f, 0x03a0e7eb, 0x01372ca2, 0x03064b0c, 0x02cfeb97, 0x00f9fb92, 0x03ff6d9c, 0x013b1d67, 0x003eda51}}, Y: Field{[10]uint32{0x00fd2c39, 0x00c0fba9, 0x024ca41e, 0x02bd1dcd, 0x00d1ba17, 0x0210483e, 0x03b13879, 0x0206d8fa, 0x033692d8, 0x002c3f7b}}}, + {X: Field{[10]uint32{0x03b249b4, 0x01dc1b62, 0x03b9938c, 0x00695b6e, 0x0103f406, 0x028fde13, 0x03aec4fe, 0x00089867, 0x000b4b72, 0x002a3c4a}}, Y: Field{[10]uint32{0x0239b8cc, 0x01c0fd1b, 0x019d4484, 0x02e6f07f, 0x03a97e12, 0x02f9ef8c, 0x032e5014, 0x01644d15, 0x0171ac50, 0x003aeced}}}, + {X: Field{[10]uint32{0x02acaa98, 0x012409db, 0x02bb878b, 0x0306f066, 0x02420f83, 0x00265805, 0x03cb3be3, 0x015e43c5, 0x0209df30, 0x0010a4b3}}, Y: Field{[10]uint32{0x00745d36, 0x02a89207, 0x022f9aa2, 0x016d9d1b, 0x00f32c8d, 0x01186ddb, 0x00f18733, 0x0074760b, 0x014cbf2b, 0x0006c536}}}, + {X: Field{[10]uint32{0x00c9464f, 0x029561e9, 0x0305b8c5, 0x00b25e5a, 0x038e1a06, 0x02720fe3, 0x03967504, 0x01d1fc2d, 0x0177f16f, 0x002b0904}}, Y: Field{[10]uint32{0x0176cf58, 0x028ed764, 0x0341d1cb, 0x0173bd72, 0x03266b69, 0x00c195a1, 0x004eb037, 0x034113b2, 0x01038261, 0x0037415d}}}, + {X: Field{[10]uint32{0x011823d3, 0x0349515d, 0x00e7dd7f, 0x026e1ac6, 0x0278e75c, 0x033dfe11, 0x019d640a, 0x00b695ff, 0x027326bf, 0x001a4bb2}}, Y: Field{[10]uint32{0x01c8e97f, 0x01ff74dc, 0x033478f1, 0x01413fc0, 0x02014c38, 0x02275876, 0x01573202, 0x029e2861, 0x0062548e, 0x0005f5b5}}}, + {X: Field{[10]uint32{0x0310e216, 0x00f316db, 0x01889e82, 0x03534bd6, 0x01d0e129, 0x0300b9bd, 0x02cf946e, 0x01404793, 0x024455ef, 0x003406c6}}, Y: Field{[10]uint32{0x03f91a0f, 0x015ab995, 0x03988345, 0x038ce237, 0x01807879, 0x01927d7f, 0x00f38f21, 0x00fb7755, 0x009e55e3, 0x00212936}}}, + {X: Field{[10]uint32{0x03fc1e9b, 0x0242f1e6, 0x030f12f8, 0x0308e4cc, 0x03fb0798, 0x023ca833, 0x0273a671, 0x02236024, 0x01f296a7, 0x0007ae98}}, Y: Field{[10]uint32{0x01dc9661, 0x01f3574b, 0x03266bc4, 0x03027b84, 0x03505da2, 0x01b12dab, 0x030a6a6b, 0x004118b7, 0x00cbe847, 0x00227ca6}}}, + {X: Field{[10]uint32{0x015980ea, 0x02da35d0, 0x015489c9, 0x032ac69b, 0x010a2300, 0x0087b730, 0x009fe1f7, 0x00c48519, 0x00da9460, 0x0009b7fe}}, Y: Field{[10]uint32{0x00004e60, 0x03685724, 0x037139d3, 0x017e5fd6, 0x033c4a0a, 0x03ee5523, 0x0365862e, 0x02ef7f0e, 0x022155e1, 0x00360992}}}, + {X: Field{[10]uint32{0x023fe676, 0x00ef03cc, 0x01047cee, 0x03729b89, 0x01a3116a, 0x020fa7ac, 0x035f64f2, 0x00608849, 0x0351425e, 0x0013990a}}, Y: Field{[10]uint32{0x01eafbb2, 0x01a288e2, 0x0174247a, 0x0283b49f, 0x0165b9c5, 0x030d7537, 0x011db0ab, 0x011a3125, 0x01659125, 0x003ca2df}}}, + {X: Field{[10]uint32{0x00f448a2, 0x034b869e, 0x02b21e94, 0x0033a709, 0x03b4f370, 0x033a91da, 0x027c97b4, 0x009f6cdf, 0x035cee9a, 0x000d52bf}}, Y: Field{[10]uint32{0x0130fcdb, 0x0027218a, 0x00dd5977, 0x0345b29e, 0x0299b4c4, 0x03da9e53, 0x012d0082, 0x01e7958e, 0x03d1624b, 0x00235a41}}}, + {X: Field{[10]uint32{0x03fbdc3d, 0x002e55a3, 0x039dcd57, 0x03b97d26, 0x01e76995, 0x002d97dd, 0x029f020c, 0x01a7fa3d, 0x00749493, 0x0014a1b4}}, Y: Field{[10]uint32{0x039703ab, 0x020779a1, 0x005e2027, 0x00fac5ac, 0x00e0a23d, 0x01f9bb80, 0x0062a452, 0x03103079, 0x02e53dd2, 0x000957bc}}}, + {X: Field{[10]uint32{0x0268add7, 0x0357d80c, 0x0121c266, 0x02e1bf78, 0x026bddee, 0x02a24d64, 0x00c8ff91, 0x008a666b, 0x0346c86e, 0x002e12a0}}, Y: Field{[10]uint32{0x0320789f, 0x02d00efb, 0x020a3f65, 0x034f62fa, 0x0329f5c8, 0x00791965, 0x0380c878, 0x0008e386, 0x028c79f4, 0x000c45e6}}}, + {X: Field{[10]uint32{0x0112bb94, 0x039e1cb7, 0x0067e0fd, 0x009e408b, 0x031b9dfc, 0x013f1470, 0x018b9f11, 0x02694089, 0x01e663fc, 0x00079ef5}}, Y: Field{[10]uint32{0x002c1b84, 0x01847c83, 0x00b6b927, 0x03f9b647, 0x0107acce, 0x01dfba2d, 0x0250f11e, 0x02c519f4, 0x01b40555, 0x0018a1ea}}}, + {X: Field{[10]uint32{0x03d2bc81, 0x01acab4d, 0x038da9c9, 0x0311535a, 0x029d28ac, 0x0399cb29, 0x01cfde6b, 0x027af9e9, 0x02213728, 0x001fb9a2}}, Y: Field{[10]uint32{0x0170c83e, 0x00f6e131, 0x01dcc8a5, 0x02fadeb3, 0x0303d7dc, 0x02c93808, 0x028aeee9, 0x030f2bca, 0x006400a6, 0x000fb0d0}}}, + {X: Field{[10]uint32{0x00ce570e, 0x0364533e, 0x0033f8d4, 0x01d59f0f, 0x02f3adef, 0x029ae9eb, 0x0107fddd, 0x00efeaa7, 0x010cf4be, 0x000a752c}}, Y: Field{[10]uint32{0x0058bf4c, 0x00e4b384, 0x031f2422, 0x00236fbd, 0x022ec79e, 0x031c1c36, 0x0103c252, 0x03d02903, 0x038596a4, 0x002da9d0}}}, + {X: Field{[10]uint32{0x028c359e, 0x0145b5cc, 0x039c9895, 0x00436989, 0x0350218f, 0x00b0fc14, 0x012a43b4, 0x03591f8c, 0x01d95c5c, 0x001e41f1}}, Y: Field{[10]uint32{0x00d6a625, 0x007261d9, 0x005d4c8f, 0x01e163e6, 0x00268883, 0x037bab06, 0x02bca52f, 0x00a86fca, 0x01e1ec06, 0x001b196a}}}, + {X: Field{[10]uint32{0x019d31b1, 0x0252e365, 0x030adfc9, 0x015714d0, 0x02e5bc2c, 0x031a3f3e, 0x0014fe7b, 0x02ef0cd8, 0x02aece11, 0x003310db}}, Y: Field{[10]uint32{0x029706a2, 0x032492fe, 0x02db3a50, 0x00e59b5f, 0x016b2bd5, 0x01814a61, 0x004e6089, 0x02fd9359, 0x01e7d6ff, 0x00058583}}}, + {X: Field{[10]uint32{0x010ec1f0, 0x006d8805, 0x01bea735, 0x002c052b, 0x021b5fb3, 0x008e77e8, 0x0259d556, 0x010806b9, 0x015d278d, 0x0033c08f}}, Y: Field{[10]uint32{0x00990741, 0x00553935, 0x005749e5, 0x02dc15f5, 0x0034c473, 0x015d736d, 0x031c26e7, 0x0301e9b9, 0x0395ffce, 0x0035801c}}}, + {X: Field{[10]uint32{0x03746a21, 0x00104979, 0x0238d71b, 0x015fa01e, 0x0112b6a2, 0x03151ed8, 0x0135b732, 0x03166f53, 0x0093f718, 0x000068a8}}, Y: Field{[10]uint32{0x00fd4c95, 0x024d51e6, 0x03919f8b, 0x02c1760f, 0x0216c0f8, 0x02491e5b, 0x02cadcc3, 0x028e6868, 0x0142652f, 0x00099d2d}}}, + {X: Field{[10]uint32{0x02b799d7, 0x02496dfb, 0x00215fac, 0x031c1aa1, 0x02f712e4, 0x00893feb, 0x018fdff0, 0x02b145d4, 0x002004b8, 0x0014d3b5}}, Y: Field{[10]uint32{0x03d82155, 0x00204636, 0x01439c07, 0x00bf4933, 0x00fa3078, 0x01db7eba, 0x03e497f5, 0x00667ee7, 0x00523ea6, 0x0000d796}}}, + {X: Field{[10]uint32{0x0200d08e, 0x03613052, 0x0138cf11, 0x01ace898, 0x03e9ba64, 0x03d2c115, 0x038ff188, 0x00c2b9b1, 0x00ad9e6f, 0x00234c79}}, Y: Field{[10]uint32{0x01d5feb2, 0x00e6f353, 0x02996478, 0x03352cc3, 0x03e4b0b1, 0x0112caa1, 0x01e36a48, 0x025b04e8, 0x03c19093, 0x003c36fb}}}, + {X: Field{[10]uint32{0x012b3412, 0x0057f48b, 0x0315954c, 0x027e1adc, 0x03c41843, 0x01bfdfdc, 0x02643791, 0x01016afd, 0x00520267, 0x00205d21}}, Y: Field{[10]uint32{0x00f19bbc, 0x03cfd768, 0x02ba7cb3, 0x03f4a02f, 0x029f6f95, 0x02587d6b, 0x00093899, 0x02d42c05, 0x009b0435, 0x0004f448}}}, + {X: Field{[10]uint32{0x0258aaa3, 0x008e11c1, 0x0212a6cc, 0x01c15fbf, 0x02458422, 0x037ce032, 0x024552be, 0x03a21401, 0x0372e604, 0x002f2a1f}}, Y: Field{[10]uint32{0x039e3d0e, 0x03a0aeb7, 0x0184b54e, 0x02355d4b, 0x03af2653, 0x01dae88f, 0x00123c62, 0x01c495cb, 0x02f528b7, 0x003b9422}}}, + {X: Field{[10]uint32{0x03cd3fb2, 0x016460df, 0x03c52e8c, 0x01184903, 0x01d527e5, 0x01b9e32e, 0x000365cd, 0x014bdb03, 0x02a9a196, 0x000378ae}}, Y: Field{[10]uint32{0x02d38905, 0x01deb287, 0x039bd733, 0x01042a73, 0x01865739, 0x01c59cb7, 0x035f2be5, 0x00cbf532, 0x00ef466c, 0x002bad06}}}, + {X: Field{[10]uint32{0x02acca9e, 0x0010e408, 0x01e5ac00, 0x02af1d99, 0x02556f6c, 0x001dc4d7, 0x00a0591c, 0x01e466d5, 0x01e914df, 0x001ee338}}, Y: Field{[10]uint32{0x00b40628, 0x02b96630, 0x007c2fb8, 0x02a7cff7, 0x00d06a96, 0x010ce295, 0x0100b720, 0x02b52430, 0x03f39cd8, 0x0029828f}}}, + {X: Field{[10]uint32{0x00a50e75, 0x0089e6fb, 0x03d1b040, 0x03f69ab0, 0x034d6d44, 0x00175d85, 0x03c80f82, 0x01d10c66, 0x017913fe, 0x00335c70}}, Y: Field{[10]uint32{0x01419064, 0x02fce31c, 0x01211967, 0x00494a2b, 0x01ae3858, 0x03d8ce4a, 0x001d1a93, 0x00e3407c, 0x03bfcf34, 0x0027c79c}}}, + {X: Field{[10]uint32{0x03ca8fe4, 0x0079151c, 0x02444f4f, 0x003845f6, 0x010619b7, 0x00205abc, 0x0236161d, 0x02370d2e, 0x002e32dc, 0x0010b2b4}}, Y: Field{[10]uint32{0x02e75568, 0x00a2a30d, 0x013c6651, 0x01fb7496, 0x0279e59d, 0x038440c6, 0x030823df, 0x0273fe21, 0x01345a25, 0x0025f2c8}}}, + {X: Field{[10]uint32{0x018ff8c7, 0x00f00f2e, 0x021f6d47, 0x015b22e7, 0x03483317, 0x00a877ea, 0x006644a6, 0x014b18a6, 0x01304f06, 0x00262a24}}, Y: Field{[10]uint32{0x01a824e8, 0x0190003a, 0x00733988, 0x02b5ecaa, 0x00b277e0, 0x00d2b521, 0x0249b3e5, 0x01a40e72, 0x02cecc50, 0x00304c3c}}}, + {X: Field{[10]uint32{0x038a4328, 0x00274bb7, 0x0345522c, 0x00a1af5e, 0x00d7a4a1, 0x021100ec, 0x03d39ff2, 0x018aa9ef, 0x00760847, 0x0008f117}}, Y: Field{[10]uint32{0x03303cde, 0x01e5522e, 0x0350af0d, 0x01d3fc30, 0x02d57cb2, 0x02c350f7, 0x0146dc7c, 0x01bd1f0f, 0x031795c4, 0x003d2adc}}}, + {X: Field{[10]uint32{0x0221d856, 0x0313431a, 0x02d343a6, 0x020c4236, 0x019e6a7b, 0x02f4df0d, 0x01416f2d, 0x0313cbd9, 0x0037d584, 0x0022dc00}}, Y: Field{[10]uint32{0x0365ca35, 0x03f1dab0, 0x00c2becd, 0x03d830c9, 0x025a172c, 0x0245a7e6, 0x00e7d866, 0x0019b53a, 0x00039ed0, 0x0020dc7b}}}, + {X: Field{[10]uint32{0x030f8a7b, 0x025f66a8, 0x00596cdb, 0x03a142ba, 0x00004f4a, 0x020fa060, 0x01d78f20, 0x01044728, 0x00a8d0fb, 0x00369859}}, Y: Field{[10]uint32{0x029a342d, 0x02e9208a, 0x0307fc7a, 0x02871e20, 0x011cc0b5, 0x00304440, 0x03caf4e1, 0x013c5e9d, 0x0063717e, 0x0003e6a1}}}, + {X: Field{[10]uint32{0x035fd6b7, 0x00b51f7a, 0x010fa220, 0x038a7980, 0x02c45924, 0x01b6df5f, 0x029b9c20, 0x02953464, 0x0165a9d1, 0x00127cdf}}, Y: Field{[10]uint32{0x006aa51e, 0x01df79da, 0x03a94ca6, 0x0256c6fb, 0x0201e648, 0x00d03050, 0x010dbba9, 0x0098a5ef, 0x038528f6, 0x003e6e6d}}}, + {X: Field{[10]uint32{0x036efa10, 0x03a714f8, 0x037ccb38, 0x00dcc219, 0x0312d808, 0x0286262a, 0x0256b78b, 0x01668006, 0x0088e268, 0x0021d57c}}, Y: Field{[10]uint32{0x02f7e478, 0x037dd7db, 0x029a9de5, 0x02a7cbda, 0x02434906, 0x0157e0fd, 0x01b4768f, 0x01ea2085, 0x013d1eec, 0x001759c0}}}, + {X: Field{[10]uint32{0x0209045c, 0x03fdddf1, 0x00534069, 0x00d2849f, 0x01a4e6d1, 0x028d7820, 0x03550fc5, 0x029b761c, 0x0396b7ab, 0x000d4c85}}, Y: Field{[10]uint32{0x00a1e832, 0x004059fc, 0x028ba6fe, 0x0072d277, 0x03c5c830, 0x03c7844c, 0x017a6804, 0x00fd3bc6, 0x0343efa9, 0x0011ffc3}}}, + {X: Field{[10]uint32{0x012559b3, 0x03a6b398, 0x0342156f, 0x03b37cac, 0x0283479f, 0x00a08ed0, 0x03ab5ea0, 0x034aef9d, 0x012b644b, 0x000eafb7}}, Y: Field{[10]uint32{0x01e32b06, 0x0216c879, 0x0008f179, 0x03e8cc39, 0x0287bbcc, 0x0078cda6, 0x01824ba1, 0x02e0604c, 0x008e6c13, 0x00109a6c}}}, + {X: Field{[10]uint32{0x00956de8, 0x0263ff1f, 0x03f775be, 0x033249e1, 0x03c14b62, 0x038c9df5, 0x003dc530, 0x0118aaa0, 0x02a22c23, 0x0038c044}}, Y: Field{[10]uint32{0x0098da40, 0x02b4da52, 0x0368a8d2, 0x01b761a4, 0x0199d90f, 0x024f9d60, 0x01f4e0ff, 0x003a2dea, 0x03d0dbb1, 0x003431f8}}}, + {X: Field{[10]uint32{0x033cd06b, 0x01cfd6e5, 0x03762f10, 0x01efc274, 0x03bcdf49, 0x02496440, 0x0147f6cb, 0x012d3cc3, 0x0058439c, 0x00018942}}, Y: Field{[10]uint32{0x0075328e, 0x01adc854, 0x0102ecd2, 0x00c0bf32, 0x0387e4c9, 0x02c390e0, 0x004407af, 0x01096156, 0x01e484ce, 0x000d0dfd}}}, + {X: Field{[10]uint32{0x00f826ea, 0x00e6b5a2, 0x0209bdcb, 0x0143ec5b, 0x0366838d, 0x003a4f8f, 0x0104bc39, 0x0133e93a, 0x0085b8c9, 0x001deb51}}, Y: Field{[10]uint32{0x006001d4, 0x02e6efe0, 0x02b736b0, 0x02d5216e, 0x0334c2ec, 0x0143b0f0, 0x03c84447, 0x021e784d, 0x005a9798, 0x00136f14}}}, + {X: Field{[10]uint32{0x02c0b7db, 0x01e4664e, 0x0066cad5, 0x033eb104, 0x003852b8, 0x02a399f9, 0x01ce3377, 0x018076e7, 0x0292e413, 0x0017734f}}, Y: Field{[10]uint32{0x00e997c9, 0x01d532e9, 0x03f85417, 0x034358d9, 0x0336996e, 0x0309e3df, 0x02760ede, 0x02d0e8c1, 0x008135ef, 0x002b3334}}}, + {X: Field{[10]uint32{0x02ff788d, 0x0309fd72, 0x01737fc8, 0x021457d6, 0x01e65ca3, 0x02e4c614, 0x01d2e6b9, 0x00147f10, 0x023badce, 0x000e8999}}, Y: Field{[10]uint32{0x00abc2bb, 0x017e26e4, 0x00113bab, 0x02e0222a, 0x009b9db0, 0x01c9cb2d, 0x030110e0, 0x03611801, 0x02abaf01, 0x000b591f}}}, + {X: Field{[10]uint32{0x00b1aec0, 0x02c025b9, 0x03ac4b8b, 0x00081419, 0x034e3b0f, 0x000900c7, 0x02fe9c2c, 0x0263f1c4, 0x02b951dc, 0x003d5f33}}, Y: Field{[10]uint32{0x03a1ea25, 0x037cc06d, 0x03bca9c4, 0x01b50e29, 0x03ddb2c6, 0x020be67e, 0x03514557, 0x03afb429, 0x03eb7a8a, 0x001a5824}}}, + {X: Field{[10]uint32{0x029b4a0c, 0x022501af, 0x029b0935, 0x00e8b6ee, 0x02df47c8, 0x0123334d, 0x01bd46c9, 0x01b8502f, 0x0378bca0, 0x002a2691}}, Y: Field{[10]uint32{0x02f366cf, 0x03e7a85b, 0x030d1d23, 0x03b7567c, 0x02939d69, 0x039e079b, 0x0398e2e4, 0x0098b48a, 0x01d69d08, 0x003d0893}}}, + {X: Field{[10]uint32{0x00b962a9, 0x00196e04, 0x01d72adf, 0x00bee8a5, 0x036a3be9, 0x03fc129b, 0x0063f4c7, 0x02091cad, 0x038184fe, 0x00191ce0}}, Y: Field{[10]uint32{0x02ce32de, 0x00dc2680, 0x010bbc97, 0x03e8c900, 0x009ba164, 0x01600134, 0x029d58dd, 0x01ba4d3f, 0x00c0d09f, 0x002f3440}}}, + {X: Field{[10]uint32{0x02dc7774, 0x033fea8e, 0x026866c7, 0x0132bf57, 0x02f7bcaa, 0x027e1c9e, 0x00196bad, 0x0078a0b8, 0x02382126, 0x00129a0e}}, Y: Field{[10]uint32{0x014ff3b0, 0x024cde25, 0x00f202cc, 0x01c6c6e5, 0x01913af3, 0x017d03fb, 0x0337f0b1, 0x026a90e6, 0x00d0ec3d, 0x002d6ae9}}}, + {X: Field{[10]uint32{0x035cb3c7, 0x030b96ae, 0x0296f53c, 0x011b9080, 0x0053fee0, 0x023b8585, 0x02cfd9eb, 0x0333510d, 0x016efdae, 0x00040978}}, Y: Field{[10]uint32{0x00c48f3b, 0x0051003c, 0x011c2253, 0x0360ef58, 0x030704e4, 0x023ce3dc, 0x019b8075, 0x024a8f85, 0x016b67ce, 0x003e01ae}}}, + {X: Field{[10]uint32{0x036650d2, 0x038ab1b6, 0x000e4552, 0x02cd6821, 0x0360039c, 0x03d9ddf1, 0x022217b7, 0x014d4dbf, 0x0009675a, 0x00185276}}, Y: Field{[10]uint32{0x01a96ca9, 0x0151416c, 0x03a11681, 0x03ca78e5, 0x02c72f07, 0x0344bde1, 0x009b03fb, 0x0022a93d, 0x036c9a98, 0x00392b98}}}, + {X: Field{[10]uint32{0x03fec47f, 0x00507530, 0x03047d8c, 0x036d3581, 0x032fff3e, 0x02ec0f74, 0x02e83274, 0x020d0953, 0x01124388, 0x0002e890}}, Y: Field{[10]uint32{0x02d5c35e, 0x0190376e, 0x0366d0aa, 0x025e7430, 0x013717e9, 0x034a3228, 0x026a18de, 0x03f374e3, 0x012329c3, 0x00229afc}}}, + {X: Field{[10]uint32{0x0056a961, 0x001a239e, 0x00993219, 0x014252b5, 0x0035c005, 0x00e2bd54, 0x03aa2595, 0x02b1fa76, 0x00963c7c, 0x0030837c}}, Y: Field{[10]uint32{0x0245d40a, 0x0120d7ec, 0x0033bad8, 0x010aba9f, 0x00fb4f2c, 0x0296242e, 0x038dd8d6, 0x01eba616, 0x015d16cf, 0x001247a6}}}, + {X: Field{[10]uint32{0x03af0c50, 0x01912753, 0x032a50c7, 0x022c6d32, 0x01aac9f3, 0x00f74bb0, 0x02f3dcb9, 0x0135cb67, 0x00ca4dbb, 0x001bd4f6}}, Y: Field{[10]uint32{0x027ae24a, 0x0221a1d3, 0x02e12f78, 0x030c9f2b, 0x0077bbec, 0x0219d4f0, 0x0156de24, 0x02fadc90, 0x002df449, 0x0019e128}}}, + {X: Field{[10]uint32{0x037bdda3, 0x005dc49c, 0x006b3513, 0x003e3b2a, 0x036364ae, 0x0211d5fa, 0x008a0461, 0x023d8147, 0x00bd71a0, 0x00395f9e}}, Y: Field{[10]uint32{0x00385342, 0x025db43d, 0x00e8f116, 0x018ca3b0, 0x0231a1d2, 0x029dd553, 0x0116c82d, 0x017d995c, 0x007e8a53, 0x0028188f}}}, + {X: Field{[10]uint32{0x03ab099a, 0x03a5f13d, 0x03fff285, 0x03869b97, 0x037853e8, 0x01f2d4e9, 0x00abd0ea, 0x025aae78, 0x0329aad4, 0x003d4bdb}}, Y: Field{[10]uint32{0x019d55a3, 0x02588115, 0x028e0b71, 0x00706629, 0x01c36151, 0x01bca657, 0x01de4b76, 0x017a062d, 0x01fc6d5c, 0x000f7df0}}}, + {X: Field{[10]uint32{0x02fb0dc3, 0x020da9cf, 0x01fe259f, 0x02362f59, 0x02ec5cf0, 0x00cf6721, 0x0326268b, 0x01b425be, 0x01fb5c0a, 0x00369d3d}}, Y: Field{[10]uint32{0x00a62c47, 0x0281ea52, 0x03f3effe, 0x00c4d508, 0x018d0ea0, 0x00a947b7, 0x031c8164, 0x00a11df8, 0x0189de5e, 0x001f943a}}}, + {X: Field{[10]uint32{0x0051f4ff, 0x00de9938, 0x02ed8a23, 0x00533f4f, 0x0035d144, 0x02a74b7a, 0x0341d359, 0x01485c3c, 0x02a87bd4, 0x000a8b26}}, Y: Field{[10]uint32{0x0248a1ce, 0x01b1bbe5, 0x00bf8a46, 0x00856746, 0x01496882, 0x022bb27e, 0x01fd7e5d, 0x017da280, 0x01eb9933, 0x002fe7bf}}}, + {X: Field{[10]uint32{0x02022266, 0x02b58ca4, 0x0123b492, 0x03bc7aff, 0x037d13bc, 0x001f8b3c, 0x010da7db, 0x014c531b, 0x00b191dc, 0x000a8d10}}, Y: Field{[10]uint32{0x02ae2b40, 0x0398b4f8, 0x02fc6dd1, 0x03c8b0d3, 0x03e4c1e9, 0x021c1e51, 0x02fda24e, 0x028080bc, 0x00f5c993, 0x002f7b09}}}, + {X: Field{[10]uint32{0x010942a2, 0x01004278, 0x0081c287, 0x03ab54f4, 0x000e0acc, 0x01551140, 0x0136e8bd, 0x00dab7eb, 0x01743d1d, 0x0028ea6f}}, Y: Field{[10]uint32{0x00794ca0, 0x02ccd3fb, 0x0016b66d, 0x0013fdd7, 0x022cb711, 0x0286d305, 0x01ab1fce, 0x039f637b, 0x02cff8ca, 0x00330cf7}}}, + {X: Field{[10]uint32{0x00804950, 0x0254f462, 0x0170d308, 0x02b0ac23, 0x0380db7e, 0x01fd361f, 0x03dc7247, 0x03c84824, 0x008f70a2, 0x0016e0f5}}, Y: Field{[10]uint32{0x0248b545, 0x0352c510, 0x039c3030, 0x02d1fb54, 0x01982ecd, 0x0243f313, 0x01368d76, 0x019b0b84, 0x0088a10c, 0x003de301}}}, + {X: Field{[10]uint32{0x03e9736a, 0x0035dec2, 0x02c29414, 0x0258f1bf, 0x02d901ab, 0x021c76e3, 0x039e210a, 0x01288800, 0x02a56e3e, 0x003756d1}}, Y: Field{[10]uint32{0x0021d46b, 0x011f04f5, 0x008ceae6, 0x03be1e61, 0x009e7136, 0x0334d77e, 0x0052268c, 0x0116b0d7, 0x02baebdd, 0x00366ddb}}}, + {X: Field{[10]uint32{0x0361a6d3, 0x031b72cf, 0x00f6462c, 0x007c0de6, 0x03d1ff78, 0x00885025, 0x036bc5b2, 0x01849d88, 0x035a2548, 0x000bdd36}}, Y: Field{[10]uint32{0x03149c1c, 0x020f0254, 0x0248eca9, 0x011eb224, 0x03646471, 0x00c0536c, 0x01b868ea, 0x01b4bea4, 0x01ed256f, 0x002db58d}}}, + {X: Field{[10]uint32{0x03ab2e09, 0x016377c8, 0x030bec50, 0x009b7f92, 0x02119bff, 0x0378722e, 0x0240b8bf, 0x024e6961, 0x00c41f7c, 0x000cab70}}, Y: Field{[10]uint32{0x0146ae3f, 0x02ec374e, 0x0229366b, 0x020ce8d6, 0x0340beed, 0x02807645, 0x017772d2, 0x02ca5f5f, 0x02487f0b, 0x0033cc5c}}}, + {X: Field{[10]uint32{0x03c6cdce, 0x027cc061, 0x02ae936f, 0x02d6172c, 0x014e336c, 0x01d301fb, 0x02a152ed, 0x00b6a09c, 0x00a70017, 0x0013f94f}}, Y: Field{[10]uint32{0x01e3a8ce, 0x011ba620, 0x0084327e, 0x01c162e1, 0x02baf428, 0x00595e31, 0x00c29869, 0x00705887, 0x01c4bd71, 0x00207db4}}}, + {X: Field{[10]uint32{0x03b2569f, 0x02152367, 0x018ae63f, 0x001974f9, 0x023b08dc, 0x0137fb66, 0x02f316eb, 0x028a99c0, 0x00f5577f, 0x0018064d}}, Y: Field{[10]uint32{0x00f714cc, 0x001d340c, 0x03954362, 0x0243dab3, 0x0255e196, 0x00ec7c77, 0x0396f689, 0x03f5fed7, 0x00824360, 0x001b7df6}}}, + {X: Field{[10]uint32{0x0279d321, 0x00f03dea, 0x03129817, 0x0319e7e8, 0x03e1bec3, 0x03a7768b, 0x0092ee52, 0x0201b191, 0x03088ff4, 0x0001e769}}, Y: Field{[10]uint32{0x017f9a47, 0x02afa2c0, 0x0047ff90, 0x012ec382, 0x0344be73, 0x0348156b, 0x0167e8ab, 0x022128d4, 0x022976f2, 0x000ac7b2}}}, + {X: Field{[10]uint32{0x01262974, 0x0227739e, 0x011867e5, 0x032360e6, 0x015b8d4f, 0x02a2fda4, 0x0208b51c, 0x00a672f0, 0x0209c39f, 0x00180ae0}}, Y: Field{[10]uint32{0x027f5555, 0x03367695, 0x035f2267, 0x0016be43, 0x00a5ed1f, 0x01e46976, 0x02c43f94, 0x032a0daa, 0x00da05d7, 0x0003e2db}}}, + {X: Field{[10]uint32{0x020e53d1, 0x0144547f, 0x00232752, 0x001703e8, 0x010ff14c, 0x01399920, 0x02991e48, 0x0229b55c, 0x0368868a, 0x0015e93c}}, Y: Field{[10]uint32{0x023a0c6d, 0x03e95e04, 0x01a9efa1, 0x028ea8f9, 0x0353d52e, 0x03a593cb, 0x00e17869, 0x026e0cda, 0x007c5bc2, 0x00035b32}}}, + {X: Field{[10]uint32{0x0206db2a, 0x0122de1a, 0x02b54435, 0x00f96f4c, 0x02459906, 0x02c04b35, 0x004c5ae2, 0x03c441c3, 0x00f0ae9d, 0x0013e6d2}}, Y: Field{[10]uint32{0x015ea016, 0x03b7b5f7, 0x02a157bd, 0x0086fc62, 0x02980cd6, 0x01bf90ab, 0x03563ebf, 0x031e3d9b, 0x00fe3caf, 0x003569e8}}}, + {X: Field{[10]uint32{0x005e7375, 0x014ed7db, 0x007085a0, 0x02b4d778, 0x01e1910a, 0x022ed98f, 0x02615893, 0x00d27d11, 0x03084b11, 0x00391a94}}, Y: Field{[10]uint32{0x01183ce9, 0x029f4cb8, 0x03c479e1, 0x00afe9af, 0x02cb8c3d, 0x03c1eb38, 0x03923be9, 0x018cb7ef, 0x02889583, 0x003691b6}}}, + {X: Field{[10]uint32{0x01c071ea, 0x022e5880, 0x0267415c, 0x0358ad82, 0x00d62f2a, 0x03249410, 0x03e64de3, 0x005878c8, 0x0366b94b, 0x000d90f5}}, Y: Field{[10]uint32{0x0316fa98, 0x03c6d6e7, 0x01a967af, 0x013e0f4d, 0x0080835d, 0x00083db5, 0x029dcffa, 0x0278176c, 0x02f11f2b, 0x003ebda6}}}, + {X: Field{[10]uint32{0x03497dca, 0x03c6c6ef, 0x01478f6f, 0x01edfe8c, 0x00e6bea5, 0x01138177, 0x03e1b485, 0x0185486e, 0x02940c02, 0x00259da5}}, Y: Field{[10]uint32{0x03e30b03, 0x0209c0ac, 0x0293c407, 0x004b1d64, 0x038210fd, 0x0365f023, 0x033b033b, 0x02b85259, 0x02fd7d0d, 0x0013ad69}}}, + {X: Field{[10]uint32{0x01a24d07, 0x019f9996, 0x00ef65c8, 0x029bd04d, 0x007f80fd, 0x0104438a, 0x03e0ff4b, 0x0264c626, 0x01ef2c47, 0x0000b907}}, Y: Field{[10]uint32{0x0074c313, 0x0214c772, 0x01f52015, 0x03045d10, 0x0269bde3, 0x015bfece, 0x03a1f50e, 0x022c4a8e, 0x017bb838, 0x0009a853}}}, + {X: Field{[10]uint32{0x0003c29b, 0x00a1316b, 0x0037db7f, 0x03c2152a, 0x00db94cb, 0x007ad8f9, 0x004fbf77, 0x03f83a69, 0x001af6ea, 0x003ce765}}, Y: Field{[10]uint32{0x00bd7b73, 0x018b9ce3, 0x00183d8b, 0x00d300ec, 0x0072cd59, 0x001f812c, 0x001f8b55, 0x01344889, 0x03700dac, 0x0007ffb5}}}, + {X: Field{[10]uint32{0x00136419, 0x01d91254, 0x03d1c595, 0x0114a005, 0x011cdac0, 0x00b64189, 0x011f8dcc, 0x02fba824, 0x01344576, 0x00242403}}, Y: Field{[10]uint32{0x00161ad6, 0x00255a92, 0x01666b0c, 0x039bacd3, 0x001457ce, 0x028acb17, 0x00444980, 0x02040b68, 0x03bb2a33, 0x001834e2}}}, + {X: Field{[10]uint32{0x00ac2e06, 0x006944f6, 0x0109ee3e, 0x038e5ed9, 0x0244a523, 0x0074ade0, 0x0344226f, 0x03d298b9, 0x02271007, 0x000e9791}}, Y: Field{[10]uint32{0x00202449, 0x0089aeba, 0x01d90f75, 0x03f95ede, 0x010bcdfc, 0x029057cd, 0x016dee2f, 0x03f0fc09, 0x03c1074c, 0x00143c07}}}, + {X: Field{[10]uint32{0x03e24355, 0x02db0fc4, 0x02b87a06, 0x0162a3c3, 0x02b13ac2, 0x01bdb91a, 0x025492ef, 0x0047907a, 0x0256f6d7, 0x003d9ba8}}, Y: Field{[10]uint32{0x02243841, 0x0000c1c9, 0x010b57fa, 0x0281bcff, 0x028f32a2, 0x0303db4a, 0x02c24014, 0x03a9b21f, 0x00470980, 0x003ee287}}}, + {X: Field{[10]uint32{0x03038fa0, 0x009602f4, 0x022a85c6, 0x0216accd, 0x00c946a4, 0x031d0db4, 0x036d4ed6, 0x01b333ee, 0x012019a1, 0x0032b681}}, Y: Field{[10]uint32{0x03d32ae6, 0x03cb4841, 0x032032b5, 0x01c42bc3, 0x03421de9, 0x006b9ce4, 0x03069639, 0x010c92b1, 0x000a3480, 0x00389265}}}, + {X: Field{[10]uint32{0x03759cf1, 0x039d7eb2, 0x037122c4, 0x004d70b6, 0x02ce2084, 0x03760c2c, 0x03d51929, 0x01ca565a, 0x035e820b, 0x00345bd6}}, Y: Field{[10]uint32{0x02448ed8, 0x038de11a, 0x0349ce61, 0x021788a1, 0x036ecdd5, 0x01781451, 0x01363807, 0x02f35f77, 0x0084cfbe, 0x001c3b6c}}}, + {X: Field{[10]uint32{0x01f71535, 0x01444d35, 0x009a4847, 0x03275365, 0x013dc31a, 0x03199bcc, 0x02e51498, 0x02b8372d, 0x028ddc6b, 0x002ef333}}, Y: Field{[10]uint32{0x03f91eed, 0x03396b48, 0x03a6ea23, 0x01a02627, 0x01c8941f, 0x0239eefd, 0x031b4796, 0x024af949, 0x02fc63ff, 0x001369dc}}}, + {X: Field{[10]uint32{0x014243fe, 0x001854bb, 0x032915f6, 0x03e3a0da, 0x02e7d5d2, 0x01a087ae, 0x01e940d0, 0x01d710c9, 0x00f5cd8b, 0x001457ca}}, Y: Field{[10]uint32{0x03668b47, 0x00bc7118, 0x032a24ba, 0x0209bdf6, 0x00e1855a, 0x0208a496, 0x0209f466, 0x02e3f852, 0x03ccf5d2, 0x00284c50}}}, + {X: Field{[10]uint32{0x01233837, 0x03b61148, 0x03f79df6, 0x02d6e3f5, 0x0068d356, 0x034e049e, 0x011ed6f9, 0x0118b61a, 0x02aea78c, 0x002f4bd1}}, Y: Field{[10]uint32{0x01c4af11, 0x02f5f21e, 0x00324b92, 0x02b98aae, 0x0284ddd9, 0x035f5bf8, 0x0332f70e, 0x0200fdfa, 0x02d3f3cc, 0x0023d917}}}, + {X: Field{[10]uint32{0x01e37dfa, 0x01f5977e, 0x0313347d, 0x034e4b83, 0x0004f8d7, 0x00046914, 0x0210b512, 0x008489a7, 0x013cc3d3, 0x00215dbc}}, Y: Field{[10]uint32{0x028b1a4f, 0x027640fd, 0x021958d1, 0x00a116d9, 0x0386ff90, 0x027bb7a2, 0x009eb8c1, 0x0384c48c, 0x00483fa0, 0x003eefc8}}}, + {X: Field{[10]uint32{0x0309db4a, 0x02327ce0, 0x0341a23b, 0x03cb4c73, 0x01763a83, 0x03c8d87f, 0x03f262ab, 0x01391f5c, 0x02918fdf, 0x001c2f87}}, Y: Field{[10]uint32{0x028bc573, 0x00fdc210, 0x0318829f, 0x032770fb, 0x03a1897a, 0x0224a50e, 0x013fa488, 0x01bbd030, 0x0175e424, 0x0020be01}}}, + {X: Field{[10]uint32{0x0341180f, 0x0193a452, 0x02361c80, 0x026848c4, 0x01017352, 0x028d4ebe, 0x0354a461, 0x01ad4e6f, 0x013d1d58, 0x002ee282}}, Y: Field{[10]uint32{0x03478269, 0x00d3616b, 0x0165e723, 0x01034887, 0x02287075, 0x033d779f, 0x028d66bc, 0x02894735, 0x02d78456, 0x00118383}}}, + {X: Field{[10]uint32{0x005c2e69, 0x0128492f, 0x018606dc, 0x0211d530, 0x027b976a, 0x001c7e87, 0x03306287, 0x006533d2, 0x024f34d9, 0x001e05eb}}, Y: Field{[10]uint32{0x00d55cbc, 0x02f9774b, 0x02d7b481, 0x00303e12, 0x006afe1c, 0x013e2cd0, 0x02ed346e, 0x02c6d6f1, 0x0056c4e3, 0x00097d3b}}}, + {X: Field{[10]uint32{0x0366abcc, 0x03fb446f, 0x009a5bcc, 0x03c49cd3, 0x03e72af5, 0x00396ed7, 0x02ed8e2a, 0x0167e9bf, 0x00dc411f, 0x002171d8}}, Y: Field{[10]uint32{0x03cb8cc4, 0x019ac9b2, 0x028ad106, 0x00399403, 0x0389a891, 0x00e99f96, 0x00f12482, 0x0271c6fc, 0x01b0b57c, 0x0024960f}}}, + {X: Field{[10]uint32{0x015086c3, 0x0206af17, 0x0179ad4c, 0x008d1faa, 0x03d9ee71, 0x0079cdde, 0x00739e3b, 0x01d8bfcb, 0x01354d9d, 0x00083603}}, Y: Field{[10]uint32{0x02f0efe5, 0x01077dd8, 0x01cf7489, 0x01ac6c89, 0x010ef6ed, 0x03c4d46d, 0x0123b7f1, 0x0299d7a0, 0x017b8017, 0x001b8647}}}, + {X: Field{[10]uint32{0x01ba5657, 0x0370f83f, 0x00fde086, 0x03f25c24, 0x00ec26ce, 0x004a2601, 0x036d9c8d, 0x0312c197, 0x022d43f2, 0x000cc1a4}}, Y: Field{[10]uint32{0x03c7efc4, 0x01970c04, 0x00d881b8, 0x01067e1f, 0x0186f0e9, 0x02871019, 0x039f76ef, 0x035eb1c1, 0x009fc93d, 0x00262a33}}}, + {X: Field{[10]uint32{0x032fb001, 0x0379b1ce, 0x01fc18ac, 0x02b02c21, 0x018a1b9a, 0x02488da0, 0x00f77033, 0x01fc4910, 0x019754d3, 0x002cd71d}}, Y: Field{[10]uint32{0x03cd649d, 0x03dadd44, 0x01660a7a, 0x02d1be4f, 0x022ea789, 0x037d65a3, 0x0058ffb0, 0x02121657, 0x039069b0, 0x00001212}}}, + {X: Field{[10]uint32{0x034e1f33, 0x03c25d51, 0x0158786e, 0x03e3a43f, 0x0205c647, 0x01648ac6, 0x009d0104, 0x030c0db3, 0x03537f8b, 0x0026f506}}, Y: Field{[10]uint32{0x030274ac, 0x0340ef2f, 0x013aec25, 0x01da3480, 0x018b8667, 0x03fce269, 0x0086bfe1, 0x03849769, 0x03f655ec, 0x001642be}}}, + {X: Field{[10]uint32{0x001ded42, 0x023c5815, 0x0020e527, 0x00e9cd65, 0x036950d9, 0x00e38372, 0x0289703a, 0x02bbc2f3, 0x032ca9b3, 0x000a8e99}}, Y: Field{[10]uint32{0x02693d8e, 0x03cee270, 0x02a5fc6a, 0x0033e22b, 0x02c95f85, 0x02d8aeac, 0x008ebef6, 0x00e0f6e4, 0x00b613f3, 0x00130ea5}}}, + {X: Field{[10]uint32{0x00f74d3d, 0x0250e096, 0x01bf6937, 0x017c5b71, 0x00c8db94, 0x014e01b7, 0x01f38003, 0x0253e353, 0x02f20a2d, 0x000c6e9a}}, Y: Field{[10]uint32{0x0329df5a, 0x008e3308, 0x03f4a236, 0x020b1509, 0x01fc1e6a, 0x0180d131, 0x01d915ef, 0x03ac72e9, 0x0102b290, 0x002b4677}}}, + {X: Field{[10]uint32{0x00869720, 0x004a54af, 0x01bb05bb, 0x0147a712, 0x00587c02, 0x02fd12a6, 0x030f9b8e, 0x0053c177, 0x01bd74b0, 0x003e8866}}, Y: Field{[10]uint32{0x0163f45e, 0x00b484ec, 0x0231a66d, 0x03bac7d5, 0x03041ab6, 0x018387a6, 0x035c4838, 0x03d7d2c3, 0x017d6efd, 0x0010ca24}}}, + {X: Field{[10]uint32{0x03e22d52, 0x011a6a62, 0x0199f30a, 0x000b8eff, 0x0108aaac, 0x024aad8f, 0x00f28476, 0x00f03d73, 0x0046c7f5, 0x00105ee4}}, Y: Field{[10]uint32{0x023b82c0, 0x0175a921, 0x008e0d49, 0x02a0ef6c, 0x007aede9, 0x005c1b80, 0x036eae69, 0x025e237f, 0x02655f30, 0x001e3057}}}, + {X: Field{[10]uint32{0x0318bc2a, 0x0390f55b, 0x00964f33, 0x026005c5, 0x026158f4, 0x01e9a7fe, 0x00e6eca6, 0x007f6228, 0x01f247d5, 0x0015ab24}}, Y: Field{[10]uint32{0x010680c7, 0x02c699b7, 0x02740c54, 0x02b89b9e, 0x00429bee, 0x01ee0719, 0x03c518b3, 0x00692dc5, 0x015c9e1b, 0x000d46df}}}, + {X: Field{[10]uint32{0x03215f8a, 0x001f594d, 0x00250685, 0x01c04324, 0x01e164ae, 0x002eafb2, 0x02d835aa, 0x01fbcc54, 0x02f88330, 0x002bae8c}}, Y: Field{[10]uint32{0x002c4e21, 0x038aba16, 0x0040fdcd, 0x031a9073, 0x037ce7e3, 0x0333be10, 0x03165577, 0x017cb9bf, 0x013935cf, 0x00235d1f}}}, + {X: Field{[10]uint32{0x01db5813, 0x035a0748, 0x03e63d47, 0x03ac3936, 0x0379ee10, 0x015bb411, 0x03d6bcc2, 0x00325da4, 0x02199af0, 0x0010b1ec}}, Y: Field{[10]uint32{0x0219378f, 0x012196ec, 0x03c75c3c, 0x01747f3d, 0x02a5fd87, 0x0225610c, 0x0244a4df, 0x031f2cb3, 0x03081fb1, 0x002857ed}}}, + {X: Field{[10]uint32{0x024e5d98, 0x02845b68, 0x01e2c36c, 0x0288270e, 0x0225e0db, 0x006f357f, 0x03fe19d0, 0x0196a222, 0x0297ecf3, 0x0010cdec}}, Y: Field{[10]uint32{0x0242b7ad, 0x01056ec8, 0x01722915, 0x022f2736, 0x0328d1ef, 0x0381b6dc, 0x00833485, 0x007b6f2f, 0x03abc654, 0x001271c8}}}, + {X: Field{[10]uint32{0x03f857bf, 0x0066876d, 0x02f84a25, 0x00949f93, 0x00aeefbf, 0x02e12c94, 0x028af0ce, 0x024cb3a5, 0x00761481, 0x00062663}}, Y: Field{[10]uint32{0x02c97fa2, 0x03204a09, 0x01ba39b7, 0x015342fe, 0x00911330, 0x03cca274, 0x02c9ae77, 0x02110d72, 0x00856451, 0x001157af}}}, + {X: Field{[10]uint32{0x02a49b2b, 0x02e256c1, 0x0188e69c, 0x01907995, 0x0387767b, 0x02ff62d3, 0x010516f1, 0x015ca816, 0x0320fa24, 0x001931d8}}, Y: Field{[10]uint32{0x00b9603f, 0x03fa33dd, 0x01395d39, 0x022a1e67, 0x0178366c, 0x01a097b0, 0x03ae76f8, 0x01425680, 0x02a5c479, 0x00028e68}}}, + {X: Field{[10]uint32{0x012b0ad7, 0x034efd20, 0x004e1ebb, 0x028ceced, 0x02dea917, 0x031bc4a9, 0x03a5f2d3, 0x02e1f296, 0x0005e35e, 0x0010595d}}, Y: Field{[10]uint32{0x01ff815d, 0x02375be5, 0x034916b6, 0x0170825a, 0x034d0ed7, 0x02b732d4, 0x037fe787, 0x0114ad15, 0x01ae36f1, 0x0023885a}}}, + {X: Field{[10]uint32{0x00391f6e, 0x01b8c370, 0x00cb68b7, 0x00440b04, 0x017bfd4a, 0x03d298c5, 0x02110c80, 0x012e245b, 0x03a3768a, 0x002a8803}}, Y: Field{[10]uint32{0x0184695b, 0x00d4d3a9, 0x02fde7fb, 0x0351a416, 0x00c49b79, 0x01f4662a, 0x02c898bd, 0x0055577f, 0x015928b2, 0x00159ef6}}}, + {X: Field{[10]uint32{0x03131599, 0x03e6ee9d, 0x00966555, 0x035a7961, 0x03eb529b, 0x02327188, 0x003ba48c, 0x00bd52e1, 0x0328841d, 0x001ea9e0}}, Y: Field{[10]uint32{0x01f698ed, 0x0112bcda, 0x003ba1bb, 0x0118a696, 0x01327112, 0x0138bdbc, 0x01a7e7a6, 0x011e2c93, 0x0315e4b8, 0x001ad289}}}, + {X: Field{[10]uint32{0x016969a1, 0x00d11d4e, 0x01fdfdae, 0x013d92ef, 0x0248446b, 0x01e3eeef, 0x019234fc, 0x019ffc11, 0x03bd6a27, 0x00252c69}}, Y: Field{[10]uint32{0x011cc33d, 0x03a233e6, 0x0054fdf1, 0x01e3a2e2, 0x02e77e21, 0x02e6a907, 0x029320a8, 0x02a1c774, 0x01ef2273, 0x0023cc19}}}, + {X: Field{[10]uint32{0x0126573a, 0x036633b5, 0x0071035f, 0x01c4de8d, 0x005407df, 0x01a07830, 0x00c8cb27, 0x03afd4a5, 0x03a71bfe, 0x001ae55e}}, Y: Field{[10]uint32{0x022724a0, 0x03f6e21e, 0x037f4583, 0x003b0297, 0x0235c6df, 0x03bed424, 0x01cd4ff6, 0x0214f179, 0x008d3fc1, 0x0019f920}}}, + {X: Field{[10]uint32{0x03717f7f, 0x029a4590, 0x01cb2b8a, 0x02da02f6, 0x03f9a6df, 0x02c7f2ca, 0x0293892a, 0x010400ef, 0x03300ea3, 0x0022c9d0}}, Y: Field{[10]uint32{0x0198db90, 0x02bebc5e, 0x00da3c99, 0x02a82727, 0x014ed141, 0x0271c4e2, 0x027f8284, 0x01620f98, 0x02bb7785, 0x00153e8a}}}, + {X: Field{[10]uint32{0x0358db05, 0x0117899e, 0x012e75d1, 0x01c92668, 0x033b6863, 0x01eb1997, 0x01274de7, 0x008ce524, 0x039b6736, 0x0034fd93}}, Y: Field{[10]uint32{0x01a52449, 0x00a81432, 0x0310e5c8, 0x01410060, 0x009bea58, 0x02267eaa, 0x01284f43, 0x0057d051, 0x02c852bd, 0x00301845}}}, + {X: Field{[10]uint32{0x0237ba79, 0x03ad557c, 0x00d4bc4a, 0x007a006d, 0x02870d07, 0x0243de57, 0x03b92803, 0x010ca406, 0x02f8ce0e, 0x00066249}}, Y: Field{[10]uint32{0x02b3d34e, 0x00fc81b4, 0x01d76a83, 0x03411523, 0x035d6c10, 0x00373c43, 0x027658fa, 0x001f9d78, 0x03d95b8d, 0x001d8496}}}, + {X: Field{[10]uint32{0x0301a13f, 0x032962f3, 0x003099ad, 0x03f1be1e, 0x00ee4358, 0x03770961, 0x0346cfb6, 0x014be0e5, 0x014d5951, 0x000006ef}}, Y: Field{[10]uint32{0x038d7733, 0x01fa7f37, 0x016e0b58, 0x03f13c21, 0x03ebdc70, 0x03797af7, 0x003cdfe3, 0x0317a9c2, 0x00deccea, 0x00063d4d}}}, + {X: Field{[10]uint32{0x01a3132a, 0x00b89d7d, 0x0398c131, 0x01fc876c, 0x03005245, 0x008089a4, 0x00b551f5, 0x0249c8df, 0x0345b263, 0x00221cdf}}, Y: Field{[10]uint32{0x00c496ed, 0x0285e778, 0x020290b2, 0x03fb256a, 0x02e3e61c, 0x006e8317, 0x01a7b222, 0x0387a12c, 0x032c2895, 0x001e6959}}}, + {X: Field{[10]uint32{0x00cb1e83, 0x03852ff3, 0x02252004, 0x01f91b9e, 0x012d6849, 0x03f873ea, 0x00ca35e8, 0x01ddccd3, 0x018b1f27, 0x0032fcf8}}, Y: Field{[10]uint32{0x02bc3f99, 0x03d72521, 0x029a401f, 0x01c249ae, 0x007b91f7, 0x03c91d23, 0x01d242a5, 0x0115b0f2, 0x039565bd, 0x0036c030}}}, + {X: Field{[10]uint32{0x03022f70, 0x00699071, 0x0093c40b, 0x00809c82, 0x008ab65b, 0x00aa4ea6, 0x01c88467, 0x03beb97e, 0x030cf186, 0x00201c3b}}, Y: Field{[10]uint32{0x027bd9e5, 0x02762044, 0x018caa24, 0x014e9d17, 0x00cc85c8, 0x021ff60e, 0x0024cf5a, 0x01a8151a, 0x01b04694, 0x0036a601}}}, + {X: Field{[10]uint32{0x03f71eab, 0x021a6030, 0x03e21902, 0x02d88490, 0x035c57dc, 0x022dbf88, 0x00c50640, 0x0176efa1, 0x004b8fa4, 0x002b2be6}}, Y: Field{[10]uint32{0x00eb278e, 0x02cef44b, 0x010b5d1d, 0x0077c5f7, 0x03801b8c, 0x02eb8a41, 0x004dfb0b, 0x03e8bbc5, 0x00168259, 0x0011bd3b}}}, + {X: Field{[10]uint32{0x03fdc965, 0x036a5c7e, 0x000994ee, 0x01494a91, 0x01e89162, 0x015f8f49, 0x01e8a32a, 0x03b3a9cd, 0x020591f9, 0x0000a24e}}, Y: Field{[10]uint32{0x03cfbb6a, 0x02c5681e, 0x012a18c3, 0x03082abc, 0x01372aa6, 0x03edf495, 0x02b5186e, 0x02c48c04, 0x014191e4, 0x001ba8a6}}}, + {X: Field{[10]uint32{0x02be951d, 0x016d9130, 0x01b39dc0, 0x002963c4, 0x00cfccab, 0x03b44b7c, 0x0126e285, 0x032d8272, 0x023168f0, 0x001925d1}}, Y: Field{[10]uint32{0x01eafb7c, 0x0012268c, 0x03406016, 0x02a705e2, 0x03d432b5, 0x03c94271, 0x004bb219, 0x0217890d, 0x001b2fa8, 0x003a9d06}}}, + {X: Field{[10]uint32{0x021faeef, 0x03c3a22e, 0x006e2d1b, 0x007174ea, 0x01091862, 0x0260440e, 0x014f7c20, 0x025322cb, 0x003e5133, 0x002e4e11}}, Y: Field{[10]uint32{0x0353fc85, 0x021f6bf0, 0x01be0963, 0x03226d9a, 0x00c52473, 0x017fe505, 0x0384f384, 0x02190941, 0x02a8c7d9, 0x002bd1fc}}}, + {X: Field{[10]uint32{0x012a5320, 0x01b6b167, 0x03b8d42f, 0x02333da6, 0x0124f475, 0x01d8d1ae, 0x00fd4a78, 0x03d43a7e, 0x0245ad10, 0x002f47b8}}, Y: Field{[10]uint32{0x00039605, 0x021cd238, 0x01518af7, 0x010d92ce, 0x00134ce4, 0x013ffa4b, 0x02477ac7, 0x02235709, 0x023e069d, 0x001ddb8b}}}, + {X: Field{[10]uint32{0x0260650f, 0x0277d0f1, 0x006a97d4, 0x00819e92, 0x036d8e13, 0x009e763e, 0x027dc054, 0x02157c5f, 0x0068805e, 0x00032dfb}}, Y: Field{[10]uint32{0x029e903c, 0x0393f608, 0x01b5a91c, 0x00e5b496, 0x01b12d73, 0x01c5497f, 0x03302eb0, 0x01040c47, 0x00b284c0, 0x003d41e4}}}, + {X: Field{[10]uint32{0x0330cf83, 0x004846ea, 0x02a15e1c, 0x0057ef78, 0x031968c6, 0x03213369, 0x0222a1c7, 0x02ed68a7, 0x037e0aff, 0x003bc1f3}}, Y: Field{[10]uint32{0x00ef574f, 0x0310971c, 0x01979815, 0x01789616, 0x002ca556, 0x013203cb, 0x03fc2fee, 0x00c35040, 0x02c94226, 0x00263d29}}}, + {X: Field{[10]uint32{0x027b8fc6, 0x0309ab4f, 0x027814ee, 0x01902189, 0x0113dc50, 0x0045003c, 0x00e4ca0d, 0x03316733, 0x01484d7f, 0x0013ff06}}, Y: Field{[10]uint32{0x03b75aa9, 0x013961df, 0x0266961b, 0x038e4dfb, 0x02d94b65, 0x03721fc4, 0x01ac1075, 0x00f60f2d, 0x020798ff, 0x002fa7af}}}, + {X: Field{[10]uint32{0x01d18396, 0x035a2f18, 0x01b63b4e, 0x01acb693, 0x00fad1ad, 0x0318dc6c, 0x00df0efa, 0x03524ee3, 0x0373339e, 0x0032f754}}, Y: Field{[10]uint32{0x02bdb13f, 0x02fe86b5, 0x025fac77, 0x035f200f, 0x003784a7, 0x01c2704c, 0x0138b6ff, 0x00b51c7d, 0x0087c321, 0x00149f79}}}, + {X: Field{[10]uint32{0x027cb5d2, 0x01efd6f1, 0x01fed65e, 0x02838c0d, 0x014e650a, 0x03800fe6, 0x03f6b065, 0x035fa76d, 0x032bd8a1, 0x003a80d6}}, Y: Field{[10]uint32{0x003761c4, 0x01918223, 0x00edddbc, 0x0258a8ec, 0x032cd57e, 0x03fa071a, 0x0372e91a, 0x03d22219, 0x03702219, 0x002bb2d0}}}, + {X: Field{[10]uint32{0x01f8db89, 0x02a3bd66, 0x010cd99b, 0x03da407b, 0x02911648, 0x00b50ff6, 0x029dda6b, 0x00902b5b, 0x03d6c1d6, 0x00378693}}, Y: Field{[10]uint32{0x004da03e, 0x0088faa2, 0x012cd3a4, 0x02c4150b, 0x02f85f90, 0x01c78b98, 0x00a60853, 0x03fd0747, 0x00d161c0, 0x003bff25}}}, + {X: Field{[10]uint32{0x02a076ed, 0x033d6df9, 0x037f0e58, 0x022bc03e, 0x00d75e11, 0x02f3ffaf, 0x02157878, 0x01fb5b84, 0x0141e8d8, 0x000b9910}}, Y: Field{[10]uint32{0x0334b8d2, 0x03a03ff2, 0x005b7320, 0x0037d97e, 0x02b45c24, 0x009b48b0, 0x00a70110, 0x018b61ae, 0x00ddf2ba, 0x0012aa16}}}, + {X: Field{[10]uint32{0x01b73a33, 0x0220ecdc, 0x01c3e956, 0x01e4b49d, 0x0247ff88, 0x023cb4a3, 0x03b78ad0, 0x02e1e243, 0x006a90d6, 0x000e110e}}, Y: Field{[10]uint32{0x0365cd18, 0x03f51d2c, 0x0157c714, 0x015fc5f3, 0x01ff2845, 0x032a3ba2, 0x036bde12, 0x012701d7, 0x03121a81, 0x003dfd77}}}, + {X: Field{[10]uint32{0x00358e42, 0x03a5bc1d, 0x03ae8ff7, 0x0382eacb, 0x01bde185, 0x02ba080f, 0x0218cd89, 0x034d88ad, 0x03321b91, 0x00387fa6}}, Y: Field{[10]uint32{0x01f3e1c4, 0x00ded2b7, 0x021d5f85, 0x0192b2ae, 0x02cef4f0, 0x00afca9d, 0x01eff10f, 0x004cba89, 0x02901797, 0x0031643f}}}, + {X: Field{[10]uint32{0x027a3c0b, 0x01c9f12c, 0x00a499cc, 0x03b68782, 0x00aefbbd, 0x016262bc, 0x020144d4, 0x036086da, 0x00da2f57, 0x00158280}}, Y: Field{[10]uint32{0x0395e208, 0x00044ab9, 0x02eaaa8b, 0x018d36ef, 0x025db86d, 0x020ec54b, 0x00b79ff9, 0x004ddcef, 0x024e39db, 0x001921d3}}}, + {X: Field{[10]uint32{0x0379094d, 0x02ecbcbc, 0x011dce5c, 0x0076f433, 0x001afe9b, 0x015b8a05, 0x03164248, 0x0378ab06, 0x03a77ec8, 0x0027ccfe}}, Y: Field{[10]uint32{0x02fe94b0, 0x02c2a709, 0x0384892f, 0x0366fff8, 0x01d972ab, 0x0177b358, 0x0034f19b, 0x038a9c98, 0x00d81838, 0x0025f2e3}}}, + {X: Field{[10]uint32{0x02d7a1b9, 0x01411f9c, 0x01226da7, 0x014f81a8, 0x01e46ee2, 0x02833ec5, 0x039da042, 0x01d44923, 0x03a82405, 0x0026208b}}, Y: Field{[10]uint32{0x02b19285, 0x00f7c53f, 0x00cc2a55, 0x013339f1, 0x03db975d, 0x03e5643c, 0x01475611, 0x0152b369, 0x023507bc, 0x000fa7ba}}}, + {X: Field{[10]uint32{0x001dbd88, 0x021a81ab, 0x0307cc40, 0x0179f885, 0x03bc7287, 0x00bc3e12, 0x01883273, 0x01c9a1ab, 0x01ac4b75, 0x002e0534}}, Y: Field{[10]uint32{0x00f18a98, 0x0114a640, 0x01c36cf1, 0x03fc635a, 0x00c03462, 0x0129ee2a, 0x01b8ab3c, 0x02848900, 0x00883749, 0x002d8d91}}}, + {X: Field{[10]uint32{0x01043e97, 0x00f068af, 0x00cd8623, 0x010a170a, 0x03b39cf8, 0x03b677f3, 0x039f7b7e, 0x0044f334, 0x00c41e42, 0x00091921}}, Y: Field{[10]uint32{0x039552d3, 0x01fd743a, 0x00502387, 0x03ad1294, 0x0280f431, 0x0342dd79, 0x01d36f79, 0x02f76010, 0x01b02e31, 0x003cd409}}}, + {X: Field{[10]uint32{0x0351db91, 0x02bee63f, 0x0358e847, 0x00902474, 0x03bbe8c5, 0x00a13930, 0x03fff0e4, 0x02cbb361, 0x03657b41, 0x0027ccc0}}, Y: Field{[10]uint32{0x02d5e70d, 0x03d0cddc, 0x03dad317, 0x0305d584, 0x01adf519, 0x013df339, 0x0176a43d, 0x0221c378, 0x03cb221c, 0x0012e69e}}}, + {X: Field{[10]uint32{0x01529d25, 0x02e6f2a7, 0x0161c225, 0x01452c58, 0x02b0e719, 0x03d69370, 0x035623a8, 0x010cf017, 0x029b3c75, 0x0030b9e3}}, Y: Field{[10]uint32{0x039079bb, 0x02228f2a, 0x001b9505, 0x00ab5891, 0x03e79436, 0x02c928b8, 0x0387b209, 0x01db2b18, 0x00f19383, 0x00079d72}}}, + {X: Field{[10]uint32{0x03695391, 0x0179aea9, 0x03f867ce, 0x00340a41, 0x022125c4, 0x01522bab, 0x01c9636b, 0x006df215, 0x02c4b6e8, 0x00224d03}}, Y: Field{[10]uint32{0x012c72c6, 0x030fa8de, 0x00671575, 0x02755492, 0x002b2a9c, 0x00f8af04, 0x01cc2c10, 0x01e5b77c, 0x014e263e, 0x003dce6a}}}, + {X: Field{[10]uint32{0x02629d22, 0x00aef8b5, 0x022daa7e, 0x00f63f63, 0x035d66a9, 0x034e29b0, 0x00facd48, 0x00f3081e, 0x0315f144, 0x0024813f}}, Y: Field{[10]uint32{0x0159c019, 0x00098e9d, 0x03253be1, 0x015609c9, 0x00131205, 0x00a4ffcf, 0x005020ec, 0x0143a588, 0x0075456b, 0x000ae77a}}}, + {X: Field{[10]uint32{0x03ff04d6, 0x031257ba, 0x0284d7ab, 0x03929ef5, 0x0261fad9, 0x00c97d77, 0x02b518dc, 0x00bf5f39, 0x02104112, 0x003c55b6}}, Y: Field{[10]uint32{0x01b631d4, 0x011a8380, 0x0170376e, 0x0135ce7d, 0x017f2c40, 0x000c6976, 0x03aa78d2, 0x02b7fb72, 0x00abf4f2, 0x0031cca5}}}, + {X: Field{[10]uint32{0x0280fa75, 0x01f6808c, 0x022659fa, 0x01549941, 0x022c379a, 0x001430d8, 0x00998616, 0x0104e84c, 0x017837d6, 0x001dc68b}}, Y: Field{[10]uint32{0x014c9aca, 0x0002c997, 0x030f66b6, 0x001356f1, 0x03e42703, 0x01b23746, 0x03ef0b0f, 0x007d6e0a, 0x039f5cfe, 0x0022daf0}}}, + {X: Field{[10]uint32{0x01a18f69, 0x0048d9a1, 0x004018e5, 0x003ac730, 0x01aec29f, 0x01039473, 0x03b52b1f, 0x00b167d8, 0x00e036bb, 0x00053356}}, Y: Field{[10]uint32{0x005e2006, 0x00323667, 0x0372ef27, 0x0279d1ac, 0x03ea15b1, 0x027a93a3, 0x00c72623, 0x011905d1, 0x00fded35, 0x001e7095}}}, + {X: Field{[10]uint32{0x028633f1, 0x03fc9ec6, 0x0343c22b, 0x03254ada, 0x02cd539c, 0x024299f7, 0x000bff13, 0x0001c960, 0x00770106, 0x00397d50}}, Y: Field{[10]uint32{0x01666367, 0x02c80a23, 0x00b5f4c3, 0x02a6c3d5, 0x0280274d, 0x026be281, 0x038e691f, 0x021b1d60, 0x02c39baa, 0x0035b871}}}, + {X: Field{[10]uint32{0x03429197, 0x03abe2b9, 0x003d75b8, 0x012cf4df, 0x03679134, 0x025a4f64, 0x03d14ba7, 0x0080dfef, 0x03429c07, 0x002c3aab}}, Y: Field{[10]uint32{0x037af26d, 0x0145c5a6, 0x00341510, 0x0209a8bc, 0x00bc2373, 0x000805c4, 0x0124d9bd, 0x006d953c, 0x021e4a17, 0x00035c99}}}, + {X: Field{[10]uint32{0x004d67c2, 0x03847998, 0x00e883c2, 0x00bb3d8b, 0x005380f9, 0x021393a8, 0x01573832, 0x036bb4d6, 0x030b044e, 0x003808b5}}, Y: Field{[10]uint32{0x01ab4143, 0x00ac4724, 0x01c7152d, 0x026cb0f7, 0x0207aed8, 0x0054fa70, 0x015228a3, 0x03b43451, 0x01d43ba0, 0x00108f15}}}, + {X: Field{[10]uint32{0x03c5ab5f, 0x02999692, 0x00651349, 0x036a7976, 0x03af1a3e, 0x02525446, 0x0270f07b, 0x02abc996, 0x033eb2ea, 0x0024a8b5}}, Y: Field{[10]uint32{0x000fa973, 0x01a04878, 0x0004992d, 0x00f16b0d, 0x0105f170, 0x00e8c98c, 0x0089fff5, 0x03495268, 0x00194794, 0x001124b5}}}, + {X: Field{[10]uint32{0x01b9cb30, 0x008d6a63, 0x0003ec96, 0x00b8fb98, 0x03b12f10, 0x01ea73ba, 0x035ac444, 0x002a733c, 0x02860de5, 0x0010d025}}, Y: Field{[10]uint32{0x0210bba9, 0x00b37713, 0x02cb037d, 0x0261fcc5, 0x03c8e1e8, 0x03671b22, 0x00e38adb, 0x00405e39, 0x0040952e, 0x000bde04}}}, + {X: Field{[10]uint32{0x0394cd12, 0x0282b788, 0x024e1aaa, 0x010ce222, 0x02945426, 0x01cd7713, 0x003aa5ad, 0x03e3506e, 0x011b0643, 0x0034d277}}, Y: Field{[10]uint32{0x033249a5, 0x02b7b390, 0x01bc6072, 0x015fb38d, 0x01cf0822, 0x02803bfa, 0x01c71c9e, 0x02dab0a5, 0x00571da2, 0x0019fcbc}}}, + {X: Field{[10]uint32{0x02dd10e6, 0x004de059, 0x023d9c68, 0x02763e0c, 0x03babad3, 0x01cb6339, 0x036834d2, 0x01faecd7, 0x02957fb8, 0x0026a426}}, Y: Field{[10]uint32{0x02ddbca1, 0x02195ca8, 0x03cec863, 0x0367dc24, 0x01c12f16, 0x028bd800, 0x02248352, 0x0068a1fd, 0x011a3277, 0x00338fab}}}, + {X: Field{[10]uint32{0x0007fa0b, 0x02f33c2b, 0x01452a67, 0x01c44853, 0x031d77f9, 0x01a1ad7e, 0x03be25d3, 0x00a99268, 0x0218df2a, 0x003ce2c7}}, Y: Field{[10]uint32{0x01e65ea6, 0x019c7bdc, 0x039d4591, 0x03631223, 0x03419a20, 0x03029188, 0x011ced59, 0x02c806e8, 0x029a7f71, 0x00001727}}}, + {X: Field{[10]uint32{0x01535a67, 0x0381b20c, 0x039a6a86, 0x021304ad, 0x027b9097, 0x009d8bb4, 0x012738bc, 0x0342577d, 0x03ca26b8, 0x00108d83}}, Y: Field{[10]uint32{0x028345e4, 0x03064491, 0x02f665de, 0x030595fd, 0x03db93ae, 0x02f77114, 0x008bc432, 0x03000efa, 0x00e5e43e, 0x001adbd3}}}, + {X: Field{[10]uint32{0x003f4a1e, 0x00130d8c, 0x02a94534, 0x03016800, 0x01b87325, 0x00c8ddec, 0x03993eaa, 0x038ee665, 0x018da7c5, 0x0038f5c6}}, Y: Field{[10]uint32{0x0053ef4d, 0x004de048, 0x0265f5c8, 0x033cc817, 0x00a05f19, 0x017eaff9, 0x0342be83, 0x0052337d, 0x0218ece6, 0x001c90dc}}}, + {X: Field{[10]uint32{0x007cb59b, 0x02f1b65a, 0x01b480d6, 0x02d6f5a3, 0x0202f93d, 0x006454a7, 0x014f6258, 0x004441ad, 0x0145a830, 0x000e504a}}, Y: Field{[10]uint32{0x0250f08d, 0x009941bc, 0x01d9fd28, 0x02028405, 0x00e08b0a, 0x002a562d, 0x03057844, 0x030c6462, 0x022c60f5, 0x002e36e0}}}, + {X: Field{[10]uint32{0x01241fc2, 0x00b025f3, 0x014f421d, 0x0053552b, 0x02d93dc9, 0x0364da33, 0x03857c7e, 0x03a639da, 0x01f77e0e, 0x0001349d}}, Y: Field{[10]uint32{0x039d7473, 0x03922ae8, 0x02f05277, 0x03a24330, 0x03935448, 0x0254aac4, 0x019d361f, 0x00a447d8, 0x03d49b50, 0x003b2e00}}}, + {X: Field{[10]uint32{0x029556ce, 0x00fe01e1, 0x01e03c01, 0x0114f22a, 0x010160b1, 0x01667b56, 0x02fcd5b6, 0x0272f68f, 0x0076c1db, 0x000a4d92}}, Y: Field{[10]uint32{0x023f6ede, 0x00c6443c, 0x0186c2dc, 0x01a9df7c, 0x0243ffb5, 0x016507df, 0x03562379, 0x02543213, 0x02f4cc44, 0x000af6d2}}}, + {X: Field{[10]uint32{0x00878034, 0x003b9b79, 0x01e55d38, 0x0107d2c8, 0x036febcf, 0x00ee84cc, 0x003ef10d, 0x0337deae, 0x00a963dc, 0x001d4c7d}}, Y: Field{[10]uint32{0x03a36ae8, 0x0100d286, 0x0055e9c4, 0x02ec021f, 0x01e1dcb1, 0x03589a6c, 0x01628ca2, 0x01af087a, 0x029f91d5, 0x0011d4f6}}}, + {X: Field{[10]uint32{0x00286e08, 0x02514317, 0x02777a3d, 0x00a16f05, 0x016050ca, 0x02f7e2b0, 0x00dce7a4, 0x03fb2910, 0x02263d12, 0x002099b5}}, Y: Field{[10]uint32{0x03e2328b, 0x0177cb2b, 0x00877545, 0x03897369, 0x0096d908, 0x0267d8cf, 0x01e7e363, 0x013ad9a9, 0x02bffb8a, 0x0009403c}}}, + {X: Field{[10]uint32{0x03c589e9, 0x02a1b452, 0x023d69ea, 0x02a9672d, 0x036d5e62, 0x010e27e1, 0x039b26e8, 0x027c5630, 0x00014f33, 0x00199200}}, Y: Field{[10]uint32{0x02d92e2a, 0x01c05b12, 0x002f596c, 0x03076a29, 0x01f145ff, 0x01d6b0c6, 0x00785263, 0x0168de7c, 0x033fe3eb, 0x00281a66}}}, + {X: Field{[10]uint32{0x00c70d49, 0x01dead93, 0x0113486b, 0x02e387d1, 0x03f641e2, 0x01b224d0, 0x01921b5e, 0x003ee981, 0x00858b9c, 0x003e3bf3}}, Y: Field{[10]uint32{0x00a9d607, 0x00761d54, 0x00834f8b, 0x0389e49e, 0x005f4de2, 0x00d7668f, 0x01a0ae30, 0x03c366bd, 0x002f7086, 0x002ea5c8}}}, + {X: Field{[10]uint32{0x00992540, 0x010b8267, 0x02e736c5, 0x02c07638, 0x016f2485, 0x00eafecf, 0x02c627c9, 0x00928ec7, 0x027d2543, 0x00297048}}, Y: Field{[10]uint32{0x02ecc7cc, 0x005b6f21, 0x03da5a1d, 0x01173e5d, 0x0264cfef, 0x00e29fde, 0x019bed7f, 0x00eed5b6, 0x01b48a16, 0x00324627}}}, + {X: Field{[10]uint32{0x038bbaf3, 0x01418182, 0x018938e0, 0x00024983, 0x016c85bb, 0x01c0b7b1, 0x03b655d7, 0x014f7c3e, 0x0219a5b2, 0x0009c6c9}}, Y: Field{[10]uint32{0x02cd2ce5, 0x0326924f, 0x03bd8d86, 0x039756bc, 0x0172bca7, 0x02af9564, 0x01bd1746, 0x023c9f73, 0x03fc22cb, 0x0016333c}}}, + {X: Field{[10]uint32{0x0170ae16, 0x03077f41, 0x0036ad90, 0x00c24b2b, 0x021202ba, 0x01c8753c, 0x001800ce, 0x025d0436, 0x002b20c7, 0x0032784e}}, Y: Field{[10]uint32{0x0231e5b2, 0x0084ee04, 0x003f690d, 0x03ec3e69, 0x016f7a0d, 0x035e65d2, 0x012f7070, 0x033a80ea, 0x00ab2a47, 0x001fac7f}}}, + {X: Field{[10]uint32{0x000309f2, 0x00250780, 0x03decb1e, 0x01aa2f51, 0x0145897e, 0x00ad2251, 0x018cb751, 0x00a81075, 0x03256523, 0x000015d2}}, Y: Field{[10]uint32{0x024615a9, 0x02cebe3f, 0x03b72038, 0x03eb0ad7, 0x03474db8, 0x02a72774, 0x03bf2cc6, 0x01d2fe4f, 0x02a9567d, 0x002efee1}}}, + {X: Field{[10]uint32{0x03046c38, 0x02354218, 0x012b4a98, 0x03b1a54f, 0x021135e7, 0x037fdb15, 0x0120e004, 0x017b692d, 0x02aca630, 0x0027bfa1}}, Y: Field{[10]uint32{0x02e9af70, 0x02b60c6a, 0x02e42551, 0x01e646a6, 0x027afa4f, 0x030ed362, 0x03cbe67e, 0x002062bd, 0x029132cb, 0x0013e4a8}}}, + {X: Field{[10]uint32{0x0013f254, 0x028b72f6, 0x0328413a, 0x03e8cf61, 0x02df26ca, 0x0024639a, 0x00bf4c3d, 0x03e85cdd, 0x00a0ff76, 0x0020ba92}}, Y: Field{[10]uint32{0x032ac9f2, 0x021ac76f, 0x038e4a70, 0x03589b77, 0x0049b4c2, 0x005ea254, 0x01e1ca14, 0x0156a8e7, 0x01399bb5, 0x001a80a5}}}, + {X: Field{[10]uint32{0x01d2baaa, 0x0379d56f, 0x01f4f5fb, 0x03af78ca, 0x03e3af2f, 0x02982b7e, 0x0352a24b, 0x02c1b0c4, 0x003e817b, 0x0030a252}}, Y: Field{[10]uint32{0x00780a53, 0x00e87387, 0x005c04b1, 0x017b065a, 0x039c4994, 0x03fad657, 0x036854a1, 0x03b3bd8a, 0x010d8b4a, 0x000edfba}}}, + {X: Field{[10]uint32{0x02e12cc4, 0x01d02d25, 0x0030001c, 0x01835e2a, 0x02016986, 0x02c161ed, 0x028deb31, 0x003563a9, 0x02cbb558, 0x001af791}}, Y: Field{[10]uint32{0x01293292, 0x01baccba, 0x02d91e09, 0x0173450b, 0x020a41cc, 0x031e741d, 0x014ce750, 0x0059a922, 0x02a7c1cd, 0x000c6229}}}, + {X: Field{[10]uint32{0x01827cf4, 0x026b07d9, 0x00bdf451, 0x023e819b, 0x01017673, 0x01bf5d5c, 0x030a11d6, 0x0185795f, 0x03ae2844, 0x003474a8}}, Y: Field{[10]uint32{0x03f603db, 0x018c4899, 0x02ee70f9, 0x00d971f6, 0x038271f9, 0x014558ba, 0x03697d7c, 0x03065a2d, 0x03f70c01, 0x001f033f}}}, + {X: Field{[10]uint32{0x0227370a, 0x0057b5ee, 0x00be8f65, 0x02233ea8, 0x00e276b0, 0x02afe697, 0x0151c852, 0x01555ced, 0x00874d19, 0x002dd303}}, Y: Field{[10]uint32{0x01a662ab, 0x003c7dd1, 0x031b551e, 0x01784535, 0x026f0c32, 0x0313b630, 0x01e307be, 0x015c7bf9, 0x030e380c, 0x00003c32}}}, + {X: Field{[10]uint32{0x01015874, 0x0109827e, 0x0298f47d, 0x01deebb8, 0x00849500, 0x00c5f846, 0x03c30412, 0x01b0fe85, 0x039a9f12, 0x002a69c6}}, Y: Field{[10]uint32{0x002e0586, 0x0130a9a9, 0x020f08f3, 0x01fd5448, 0x03f1b113, 0x018d33b3, 0x024be1df, 0x03c32dfe, 0x03fdb31b, 0x003017cf}}}, + {X: Field{[10]uint32{0x00dbc68c, 0x0089d2a0, 0x01c259b0, 0x03e8fe88, 0x032b1b99, 0x02cfe08e, 0x03514162, 0x007c9f76, 0x01530a16, 0x0035b784}}, Y: Field{[10]uint32{0x0059764a, 0x03202f6f, 0x02215348, 0x018539d9, 0x00714fab, 0x02b2f7bf, 0x0015d259, 0x021697bb, 0x00636597, 0x001b1882}}}, + {X: Field{[10]uint32{0x036b73f1, 0x024a9d1d, 0x016df112, 0x00d80a9e, 0x0273a7dc, 0x016521fe, 0x038c22f3, 0x03297147, 0x01bc3acd, 0x00372a87}}, Y: Field{[10]uint32{0x00c85159, 0x0312a3c3, 0x035147c8, 0x026a5631, 0x01b4b4d4, 0x005c545e, 0x033719b0, 0x0181ed20, 0x01fcc22c, 0x0037104c}}}, + {X: Field{[10]uint32{0x0005ab6c, 0x01a89100, 0x01d21220, 0x00025526, 0x015f3a13, 0x01dc2535, 0x03aa93c6, 0x02f84c70, 0x03a000c4, 0x0004d54d}}, Y: Field{[10]uint32{0x00fb0f69, 0x00bc1159, 0x0333048c, 0x033f8d20, 0x0308f3eb, 0x03548dc2, 0x01f0d1dd, 0x037d9ccd, 0x031fd2d3, 0x001fbda7}}}, + {X: Field{[10]uint32{0x01de93ac, 0x03fa760e, 0x0004afb3, 0x03957a7a, 0x02751dd6, 0x00ff666b, 0x01572bbe, 0x018b9933, 0x0017c232, 0x000a3c76}}, Y: Field{[10]uint32{0x01e2cb7e, 0x00a6d20e, 0x01cb0970, 0x022f5079, 0x008f5dfe, 0x01f20d6b, 0x02e0e896, 0x00f690b6, 0x0061987e, 0x000093d6}}}, + {X: Field{[10]uint32{0x00294289, 0x03384d51, 0x001e25f8, 0x021e6b59, 0x03e0779b, 0x002040b7, 0x0331155c, 0x02dfee3a, 0x03836e8f, 0x003df13b}}, Y: Field{[10]uint32{0x036bce2c, 0x026593c7, 0x020d1362, 0x008da55e, 0x0216470d, 0x01bae5a0, 0x0150f091, 0x02588758, 0x0381db33, 0x0001fe69}}}, + {X: Field{[10]uint32{0x0228b3e6, 0x02a3d986, 0x03aeda8d, 0x0061444b, 0x00ddc8d0, 0x0169cd75, 0x0366f7e2, 0x026cd462, 0x025e1ddc, 0x003c7d6b}}, Y: Field{[10]uint32{0x01ad4288, 0x036777ee, 0x03cb41c6, 0x0218fb6d, 0x035c5c34, 0x013f9ea3, 0x024a8df2, 0x01360142, 0x012c9792, 0x00276ffc}}}, + {X: Field{[10]uint32{0x008b654f, 0x03ef5cc0, 0x0027dc2a, 0x0287ad96, 0x01257c10, 0x015e2d8e, 0x020dbc74, 0x033a7072, 0x0173d170, 0x00257e0c}}, Y: Field{[10]uint32{0x03412487, 0x03472f00, 0x035b8b75, 0x00edefb8, 0x017d5ab8, 0x01a4628c, 0x03c3c91c, 0x012a2104, 0x02bc0829, 0x0018ea0f}}}, + {X: Field{[10]uint32{0x023ff750, 0x020f025a, 0x03a7df8c, 0x00d646f8, 0x03964749, 0x01f58154, 0x008c8e37, 0x017847ae, 0x025c9f09, 0x003d2b69}}, Y: Field{[10]uint32{0x01861ed3, 0x0146972b, 0x0178d3ac, 0x01d86c37, 0x012ede16, 0x036f3129, 0x00bc87c3, 0x0116cb9b, 0x0328a385, 0x0039da0f}}}, + {X: Field{[10]uint32{0x019e5fd2, 0x039eb90a, 0x00fd03af, 0x015b64e5, 0x0040b827, 0x0371ef09, 0x03bcd591, 0x036cec6d, 0x0096f714, 0x00106beb}}, Y: Field{[10]uint32{0x0099fedc, 0x03a691c1, 0x02f20474, 0x0001769e, 0x0061c52d, 0x03195291, 0x02e98aea, 0x03fc4909, 0x006a3292, 0x00270ba7}}}, + {X: Field{[10]uint32{0x00487405, 0x02a85bba, 0x03ffd0cc, 0x03f710bc, 0x01e1b8df, 0x0328d7c3, 0x0141fe9c, 0x00726d86, 0x031b2cb8, 0x000dfcc2}}, Y: Field{[10]uint32{0x00b88a0f, 0x00755363, 0x022bb61b, 0x00f29326, 0x018086bb, 0x0021ad92, 0x03dd08e1, 0x00754767, 0x0285e340, 0x0024afde}}}, + {X: Field{[10]uint32{0x004fb3ce, 0x0181c596, 0x0205b9d7, 0x02651530, 0x03605a21, 0x0338323a, 0x01312022, 0x01faa885, 0x0166646e, 0x000bd5dc}}, Y: Field{[10]uint32{0x03d5f446, 0x019f7fc0, 0x00ee0985, 0x036bb589, 0x01af32e8, 0x03412e5a, 0x020dc684, 0x033ab56b, 0x026fe43d, 0x003c35cc}}}, + {X: Field{[10]uint32{0x00b5150a, 0x01f96e99, 0x03e7dfd5, 0x03fc2fe7, 0x003c2e24, 0x02bff6fe, 0x03a0af94, 0x0144ad7a, 0x038092c5, 0x0022aef1}}, Y: Field{[10]uint32{0x02896b75, 0x0059f5fd, 0x0232791a, 0x03b12454, 0x010bb87d, 0x03fb33db, 0x015b974f, 0x03066a92, 0x018f0c2e, 0x00163d66}}}, + {X: Field{[10]uint32{0x0147571c, 0x03741970, 0x00aed219, 0x03d70a04, 0x00f6da7c, 0x01f95f3f, 0x0073fe40, 0x01dacc9f, 0x028fa013, 0x003906b3}}, Y: Field{[10]uint32{0x036844a2, 0x02a52fdd, 0x027a37d8, 0x01146584, 0x01715d45, 0x01cbe639, 0x02d04592, 0x01c530c8, 0x02da3c2a, 0x002d642a}}}, + {X: Field{[10]uint32{0x010f1d88, 0x00533662, 0x03b5abe7, 0x03f2767a, 0x017c0c84, 0x00491e27, 0x0180f7f4, 0x0157bb77, 0x00778b63, 0x000c0326}}, Y: Field{[10]uint32{0x039c9002, 0x017a4ef8, 0x0138520f, 0x01b20d37, 0x0068c507, 0x03869ee0, 0x00f5c7a4, 0x021cc432, 0x0262c571, 0x0036b0ae}}}, + {X: Field{[10]uint32{0x02e24c61, 0x0205c1c4, 0x01b5c876, 0x008c9b28, 0x03dcdb66, 0x01e1db0f, 0x02072c1f, 0x003e1096, 0x01d219d4, 0x001a78ce}}, Y: Field{[10]uint32{0x00babc50, 0x002e1b4e, 0x005a1bad, 0x02024dd0, 0x014cd472, 0x02d4d648, 0x017e8499, 0x011c0085, 0x015059a4, 0x002350e4}}}, + {X: Field{[10]uint32{0x03bdb909, 0x03752132, 0x0346da2f, 0x027d47f1, 0x00cddd77, 0x007eaded, 0x033ccf64, 0x02a67e2a, 0x03df8e47, 0x00395924}}, Y: Field{[10]uint32{0x03f5ee59, 0x012728f8, 0x01145b6e, 0x0275d630, 0x01974531, 0x0107062d, 0x0006036d, 0x0053fb42, 0x020a559e, 0x001a36e8}}}, + {X: Field{[10]uint32{0x03f50587, 0x0134e379, 0x01c611a3, 0x03795d36, 0x00f76532, 0x01b803ac, 0x01c11e58, 0x0144734e, 0x00578998, 0x000dea47}}, Y: Field{[10]uint32{0x03145f18, 0x007710ec, 0x0381ee5d, 0x0042ae74, 0x01feac27, 0x00276a25, 0x01975dc0, 0x022891cd, 0x00af0d2d, 0x0038e862}}}, + {X: Field{[10]uint32{0x02e88c1f, 0x0149d0b7, 0x0124a86c, 0x01bd9793, 0x02622401, 0x02535e0e, 0x00629c71, 0x018b844b, 0x01fb5cc2, 0x00317c16}}, Y: Field{[10]uint32{0x038c890a, 0x0155e3ec, 0x00623ab1, 0x00147be8, 0x018c0907, 0x0242d1b5, 0x037792d5, 0x02a56945, 0x03521a96, 0x0007216f}}}, + {X: Field{[10]uint32{0x038716a1, 0x01e24926, 0x01827626, 0x018fca11, 0x03c6323c, 0x021006b3, 0x018c59d7, 0x033ac68a, 0x02ccd605, 0x00159bb7}}, Y: Field{[10]uint32{0x0244cc90, 0x0018b516, 0x010a15ad, 0x02bf0080, 0x038c40b3, 0x00b4ccbf, 0x01f85b93, 0x01bc81e2, 0x03735adf, 0x003b8344}}}, + {X: Field{[10]uint32{0x032c7c7b, 0x027337b6, 0x034c8db6, 0x038b0fae, 0x023e6cf4, 0x0332d190, 0x012e33db, 0x013e1c01, 0x0033c6ef, 0x000c9f9c}}, Y: Field{[10]uint32{0x03e8db36, 0x0385ba54, 0x012634aa, 0x00e7def6, 0x00122662, 0x0026bac7, 0x023e2667, 0x03ca6d2a, 0x012b2be0, 0x003f1242}}}, + {X: Field{[10]uint32{0x03778024, 0x039c0265, 0x01e1a1ea, 0x038a317d, 0x0284ef5a, 0x029b2bfd, 0x0329704e, 0x02b21957, 0x03693ac0, 0x0026269f}}, Y: Field{[10]uint32{0x00dadfd0, 0x01ed90a0, 0x0292bd1b, 0x035cec2c, 0x00e8eb1f, 0x02b3fa99, 0x03b5bd44, 0x011639d2, 0x027b3396, 0x0015cf44}}}, + {X: Field{[10]uint32{0x0330fc94, 0x00b31842, 0x019769c2, 0x03e92999, 0x037ce313, 0x013d2695, 0x01cec4b7, 0x01fd53b4, 0x032f14f2, 0x002729d9}}, Y: Field{[10]uint32{0x0104e4a1, 0x01b283ce, 0x011dcd2d, 0x0013bbb0, 0x006ab141, 0x00b7e34c, 0x0003f818, 0x00a928c2, 0x00d731d5, 0x003e4831}}}, + {X: Field{[10]uint32{0x0047f5f5, 0x0155579e, 0x030cde1d, 0x0143b4bb, 0x02060978, 0x01f89c86, 0x00316871, 0x03a38656, 0x0245654f, 0x0036c401}}, Y: Field{[10]uint32{0x01056567, 0x02064a0c, 0x0014c962, 0x033b9d14, 0x02619287, 0x03ddb22d, 0x03cdf895, 0x003b3cd3, 0x02cea9c9, 0x000acb0f}}}, + {X: Field{[10]uint32{0x013295a9, 0x01340335, 0x01c07bb9, 0x03e9949a, 0x02418a34, 0x00effc53, 0x02110a8f, 0x00ed0979, 0x009e8274, 0x00138a83}}, Y: Field{[10]uint32{0x00ccca7a, 0x02cb138f, 0x014b3d98, 0x03b237e8, 0x008a34e5, 0x028eb1a7, 0x00b90590, 0x02c12dad, 0x02e3e00b, 0x00144ab0}}}, + {X: Field{[10]uint32{0x02ac77f6, 0x010d4bd9, 0x0368d733, 0x01dca50e, 0x0060c71a, 0x0217ec73, 0x0136f981, 0x022b2c14, 0x037024ea, 0x00304acf}}, Y: Field{[10]uint32{0x02544803, 0x01ef77c0, 0x033239c0, 0x02560cc9, 0x020d67a1, 0x03ef8949, 0x009f5a7b, 0x01dbc07c, 0x019b6f4b, 0x002de67e}}}, + {X: Field{[10]uint32{0x03fd7e58, 0x01551923, 0x003feaa7, 0x020afe9e, 0x03d6c09b, 0x005904ff, 0x017c0cf6, 0x013877af, 0x022edaf3, 0x00019396}}, Y: Field{[10]uint32{0x002f4a50, 0x0147cd0f, 0x004ff726, 0x0292d461, 0x027509a2, 0x037c249b, 0x005d611a, 0x00cb8ba4, 0x020966f0, 0x00038083}}}, + {X: Field{[10]uint32{0x030a838a, 0x0102254f, 0x03b9fef0, 0x015cb3ec, 0x013d66ec, 0x000fc0b7, 0x02d1857e, 0x010e03da, 0x0355fa73, 0x000ac2e2}}, Y: Field{[10]uint32{0x0273a61a, 0x02404f67, 0x024765bd, 0x0070d023, 0x00147ce0, 0x00722029, 0x00b45bae, 0x01965e38, 0x0251a914, 0x002b225c}}}, + {X: Field{[10]uint32{0x0288525e, 0x01e24c0a, 0x00c5bd67, 0x02d07bf5, 0x016523e8, 0x0196a59e, 0x02545299, 0x0184cf4e, 0x0130a202, 0x002b838f}}, Y: Field{[10]uint32{0x00f80552, 0x0177ed4e, 0x03ee97ec, 0x01f7687b, 0x00c80c08, 0x00e6ac98, 0x00be67b3, 0x00b49094, 0x00ff8563, 0x003eda46}}}, + {X: Field{[10]uint32{0x03e00dd9, 0x037a18a3, 0x03454a83, 0x00c3b7c8, 0x033bfa15, 0x0007d130, 0x02e46cb0, 0x02859bfe, 0x03114dfe, 0x000bfe71}}, Y: Field{[10]uint32{0x03318783, 0x03a0b11b, 0x027599b5, 0x001ef483, 0x01acb0d7, 0x02065717, 0x02383517, 0x00605e8f, 0x027a0444, 0x00014fd9}}}, + {X: Field{[10]uint32{0x027bf695, 0x02c45a93, 0x017263ed, 0x0393067d, 0x019e2614, 0x010ac512, 0x003f60cc, 0x01671b01, 0x001488b9, 0x0033009c}}, Y: Field{[10]uint32{0x03b6007a, 0x00b99296, 0x01fe2e57, 0x017080db, 0x0307b532, 0x012697c1, 0x02ce6551, 0x03d9dd99, 0x01909b22, 0x003aacfd}}}, + {X: Field{[10]uint32{0x00a945d5, 0x01a2fa0a, 0x0145584d, 0x016bc067, 0x03f9dbf4, 0x02125749, 0x03e3b476, 0x00d6997b, 0x03d13c80, 0x0006007b}}, Y: Field{[10]uint32{0x0259c4fe, 0x02f686fe, 0x005681ac, 0x02f382da, 0x03f44a5a, 0x026a0be2, 0x02f49d50, 0x025a3bd3, 0x019efcb5, 0x0037fcb4}}}, + {X: Field{[10]uint32{0x00dd7cbf, 0x02de3f0f, 0x03f8be6a, 0x038db9d1, 0x015b698f, 0x031eaeaf, 0x03c09de4, 0x002588d5, 0x01d507b6, 0x001b68aa}}, Y: Field{[10]uint32{0x0275060c, 0x016f7338, 0x00378d50, 0x020a66b3, 0x0171310b, 0x00df02bc, 0x01ac9f9b, 0x022b88a5, 0x02704aeb, 0x000789d3}}}, + {X: Field{[10]uint32{0x02fc82e4, 0x02846b6e, 0x0344c832, 0x00e86a67, 0x00c7dfe2, 0x02a513fc, 0x039e8a6e, 0x005774ef, 0x016f6a92, 0x001fa3f2}}, Y: Field{[10]uint32{0x01342bff, 0x021cb8ec, 0x02d51ddc, 0x000ea023, 0x0257d095, 0x018fce21, 0x039ed00c, 0x01b29fdc, 0x03e1e0c2, 0x003a693e}}}, + {X: Field{[10]uint32{0x020caf64, 0x02ed121f, 0x00f27559, 0x00cdc633, 0x019f53e1, 0x021c1d90, 0x0266ab37, 0x035bdff8, 0x033a77d6, 0x00298d8b}}, Y: Field{[10]uint32{0x02cc787e, 0x02135874, 0x00d70087, 0x00e7d1cf, 0x03e29d85, 0x019bdd46, 0x025cd860, 0x00e17182, 0x02da3fc2, 0x00300588}}}, + {X: Field{[10]uint32{0x0337d2b3, 0x01c01d66, 0x01557449, 0x0154df09, 0x018582bd, 0x001db06a, 0x01a19b47, 0x01d24e8f, 0x022228b4, 0x00146194}}, Y: Field{[10]uint32{0x00287be1, 0x02bef411, 0x01ad17d0, 0x02e14914, 0x02826558, 0x01032e33, 0x03ca65bf, 0x0236764f, 0x01796863, 0x003c3c2e}}}, + {X: Field{[10]uint32{0x01d472ce, 0x02f0f460, 0x028e67e8, 0x004a7a3b, 0x0304d802, 0x01c6656a, 0x0314ff4f, 0x02e70e31, 0x009ba9f1, 0x0028a824}}, Y: Field{[10]uint32{0x0040068d, 0x03d717bb, 0x01a6a1e8, 0x007b3649, 0x028b364d, 0x03114ce4, 0x03fdf98e, 0x031efdc6, 0x000bd45e, 0x001048e4}}}, + {X: Field{[10]uint32{0x003aef2d, 0x00c7e1ee, 0x009212b0, 0x03abe7c3, 0x02f1357b, 0x006fe5e7, 0x03f5ac2a, 0x01fcda98, 0x0122454e, 0x00369460}}, Y: Field{[10]uint32{0x006da722, 0x0363cdda, 0x00b32b6b, 0x03e2e683, 0x016cb7f3, 0x02e7762e, 0x0028c5e1, 0x017a0032, 0x02fd0d41, 0x002fe1df}}}, + {X: Field{[10]uint32{0x0147a87d, 0x035d418e, 0x0382e6cb, 0x001b520f, 0x008a6983, 0x004316a9, 0x01aa5729, 0x00c49796, 0x00541a98, 0x00107103}}, Y: Field{[10]uint32{0x03bfc57f, 0x01bc4068, 0x00c814e8, 0x00cf0c3d, 0x03ef8400, 0x03ef7d79, 0x029f129f, 0x02442aee, 0x03656b89, 0x001db6ae}}}, + {X: Field{[10]uint32{0x02addbfd, 0x00267326, 0x01318709, 0x01322290, 0x0028745e, 0x03314362, 0x007c980a, 0x039191a1, 0x028387f2, 0x003127f7}}, Y: Field{[10]uint32{0x027227e1, 0x01231fab, 0x03a94bbb, 0x03b99847, 0x00c7ddb4, 0x00a2f9fe, 0x00baf9e6, 0x01ef4de7, 0x0112dfd0, 0x002996f1}}}, + {X: Field{[10]uint32{0x020fceae, 0x03c060c3, 0x010717a1, 0x0223a314, 0x023a6c6b, 0x035edd09, 0x03219406, 0x01d0f537, 0x0161b6ee, 0x00216c5f}}, Y: Field{[10]uint32{0x01868fef, 0x00c24b95, 0x02be892d, 0x00f9c13d, 0x03ebddc5, 0x03d2ffee, 0x006ce022, 0x007fad41, 0x00a274c7, 0x0008ae7a}}}, + {X: Field{[10]uint32{0x0117964f, 0x03d7153c, 0x0243e883, 0x030b2353, 0x023914af, 0x00158e7b, 0x03521895, 0x01dfc4f9, 0x037fe6d6, 0x00323874}}, Y: Field{[10]uint32{0x01bfc21e, 0x02b56ace, 0x008e4f88, 0x02d0daad, 0x03ee4a7a, 0x007e6525, 0x006ba559, 0x016a46bd, 0x0118d08f, 0x002c32b3}}}, + {X: Field{[10]uint32{0x0083836b, 0x001e29f9, 0x02dd9866, 0x02802e5e, 0x011a30ba, 0x00c44a65, 0x03d6f833, 0x02223169, 0x00307d25, 0x0037fb00}}, Y: Field{[10]uint32{0x02faa00d, 0x004ea42e, 0x0380956e, 0x002dbee5, 0x00f407ca, 0x00abe391, 0x00664168, 0x02511fbd, 0x0206bf2e, 0x001396a2}}}, + {X: Field{[10]uint32{0x030be9d6, 0x02535fdf, 0x00b20925, 0x01b97d35, 0x02c842ff, 0x0274c1db, 0x017618dc, 0x03631bbb, 0x00387c18, 0x003ab1b1}}, Y: Field{[10]uint32{0x0265b8d1, 0x008e9ac8, 0x021634e8, 0x019f5cd2, 0x0177a86a, 0x003fbaef, 0x031802ac, 0x006e0ae9, 0x03bffc0c, 0x000675a6}}}, + {X: Field{[10]uint32{0x03424cde, 0x0108046c, 0x019b74d6, 0x005672f2, 0x0069432c, 0x01fdab20, 0x0024db79, 0x0377b292, 0x004e04dc, 0x0027fce3}}, Y: Field{[10]uint32{0x01619ebc, 0x018886d4, 0x014f91d2, 0x0106e53d, 0x01266bd0, 0x033212e0, 0x005b0c93, 0x02effb7d, 0x0260b7c1, 0x003dcbe9}}}, + {X: Field{[10]uint32{0x01313f36, 0x03f19129, 0x02c1c146, 0x0277512c, 0x019153f6, 0x03f8a155, 0x01e4f8c4, 0x00ca4d7e, 0x013f3a5a, 0x00179e16}}, Y: Field{[10]uint32{0x02fd9c47, 0x02a6e6a2, 0x0114b89d, 0x02986cb4, 0x0358cbc5, 0x01758f25, 0x0195b700, 0x02f746cb, 0x0044dc63, 0x00276756}}}, + {X: Field{[10]uint32{0x01009ae4, 0x0321511c, 0x01b32d22, 0x0121debe, 0x020ad31a, 0x00f88870, 0x01ba38b0, 0x012dbec0, 0x03a48928, 0x002841f1}}, Y: Field{[10]uint32{0x03d9f6b5, 0x030da689, 0x014c4a0f, 0x002f1457, 0x03653b58, 0x0303e7ca, 0x0386cd5b, 0x019647b8, 0x02d46be4, 0x0001981c}}}, + {X: Field{[10]uint32{0x01b02af1, 0x03397e90, 0x028f4190, 0x023b308e, 0x02ff98e8, 0x01e4a65d, 0x02445ba6, 0x026117f8, 0x01d0308d, 0x0000907c}}, Y: Field{[10]uint32{0x03e194a9, 0x02dfaa29, 0x01c74366, 0x03bb16b2, 0x0209c881, 0x02be474c, 0x015723ad, 0x02a237e8, 0x03ecd413, 0x002219a5}}}, + {X: Field{[10]uint32{0x008a72fa, 0x02431af9, 0x01283c87, 0x005a2e6a, 0x02341860, 0x03ab0ed0, 0x015c6d26, 0x0241ba0f, 0x00d2627f, 0x000c67ba}}, Y: Field{[10]uint32{0x029eaa57, 0x033109cf, 0x032819d0, 0x014c197e, 0x01760344, 0x032d1631, 0x009f8491, 0x005b80d0, 0x02eda678, 0x00167925}}}, + {X: Field{[10]uint32{0x03ca4822, 0x0051896f, 0x038e1a26, 0x019864a1, 0x01e01008, 0x01a615d6, 0x03f4f7e9, 0x03e6f64d, 0x011a00fd, 0x000619a0}}, Y: Field{[10]uint32{0x01b7ae19, 0x01449a75, 0x0250172e, 0x00646990, 0x00585f03, 0x02d97e9f, 0x003a1316, 0x0272209e, 0x0065e85f, 0x00085781}}}, + {X: Field{[10]uint32{0x03992f26, 0x00bdda54, 0x00ce69ff, 0x016bdce5, 0x01398967, 0x033d9026, 0x03429fb8, 0x02400176, 0x02d70b94, 0x001fbfef}}, Y: Field{[10]uint32{0x00c7c749, 0x0026b210, 0x02aa7a1d, 0x01ab1b34, 0x03616d8b, 0x02fcb702, 0x016affac, 0x01b52d49, 0x01ba28f2, 0x001bbeed}}}, + {X: Field{[10]uint32{0x03168867, 0x0293494a, 0x00bf0957, 0x0199c3c5, 0x02665c8d, 0x00de54ac, 0x02e45c19, 0x0057c87f, 0x03d0e593, 0x003631ca}}, Y: Field{[10]uint32{0x0256fbcd, 0x011b186f, 0x02e6e5a9, 0x006cb266, 0x028a2da3, 0x01cff182, 0x01e2cc3a, 0x0029bf44, 0x0162fdd4, 0x0019300b}}}, + {X: Field{[10]uint32{0x00d0db4b, 0x0060c206, 0x0147abcf, 0x0147ead3, 0x0187bbfd, 0x002c35a4, 0x0396bbcb, 0x03ce050e, 0x0222ce64, 0x001c43b1}}, Y: Field{[10]uint32{0x0134d994, 0x00cc5391, 0x030c5496, 0x00dafaae, 0x013d275c, 0x0243d4c7, 0x029b9618, 0x00ebc30b, 0x0086526c, 0x003b7f44}}}, + {X: Field{[10]uint32{0x00d51ca6, 0x0131654c, 0x0334868e, 0x009e7930, 0x0370574f, 0x02021b76, 0x0168e763, 0x03b75270, 0x024b9aea, 0x002509e5}}, Y: Field{[10]uint32{0x004e2dd8, 0x00298457, 0x017af730, 0x03a9a131, 0x01e0026b, 0x00a160f6, 0x03b312e9, 0x00019fac, 0x01cf2a6b, 0x000442d0}}}, + {X: Field{[10]uint32{0x0355565f, 0x0166ce63, 0x00a5c46a, 0x00597aa9, 0x01c5a2e8, 0x036d8859, 0x03515c06, 0x03b6727a, 0x0035a8b3, 0x002bbde5}}, Y: Field{[10]uint32{0x0184b91d, 0x02c5e915, 0x012a0118, 0x0044f0d5, 0x03036535, 0x0250aaac, 0x00cb93d8, 0x03109714, 0x00f21274, 0x001985ba}}}, + {X: Field{[10]uint32{0x0074b5a3, 0x0319fccc, 0x03994a4a, 0x0339296b, 0x020f49f0, 0x0275cbc9, 0x03401935, 0x0018e9a3, 0x00323546, 0x000faf76}}, Y: Field{[10]uint32{0x00460238, 0x0254019e, 0x019beed8, 0x03cb238b, 0x02db7962, 0x00e575c4, 0x02ba318f, 0x0127bb43, 0x03d4b295, 0x000048d9}}}, + {X: Field{[10]uint32{0x026aeff2, 0x02d01790, 0x020dd729, 0x03894d35, 0x0019af86, 0x019cf212, 0x03c6bc3b, 0x0021c742, 0x025ec52b, 0x0028e367}}, Y: Field{[10]uint32{0x032cad02, 0x031d7a7c, 0x02a1cb01, 0x00a22b0d, 0x01f6d134, 0x03237935, 0x00955383, 0x01b1744e, 0x0371d9ae, 0x003af919}}}, + {X: Field{[10]uint32{0x00a7d624, 0x03b0d092, 0x01b0f9f4, 0x02845a40, 0x02334369, 0x0114b2e3, 0x00407f7b, 0x02ec6643, 0x0382619c, 0x0039f4a7}}, Y: Field{[10]uint32{0x03c4e614, 0x03b16d67, 0x02e0742b, 0x0052aa3b, 0x0315b6ce, 0x0175d85b, 0x00ce2304, 0x014581ae, 0x02d4618b, 0x001d6573}}}, + {X: Field{[10]uint32{0x0043ceae, 0x033bf3d0, 0x004edf81, 0x01738fa3, 0x007523de, 0x00063c03, 0x02333e26, 0x009ee52b, 0x02b02792, 0x003b21a7}}, Y: Field{[10]uint32{0x011ac92b, 0x02e9f71c, 0x01556ec6, 0x01dd9040, 0x03ca3fe5, 0x0399f60a, 0x00bdd264, 0x03210692, 0x02552c89, 0x0029086a}}}, + {X: Field{[10]uint32{0x02ec5e71, 0x003fcd71, 0x03ae7c07, 0x00f3809b, 0x026f0752, 0x01128d4a, 0x005c0571, 0x02322dbf, 0x0108e44a, 0x00115276}}, Y: Field{[10]uint32{0x02b5dd7a, 0x0044e2de, 0x0240f44c, 0x000069b5, 0x0164b486, 0x00b2371e, 0x0208c19e, 0x01f81040, 0x03200770, 0x001c7638}}}, + {X: Field{[10]uint32{0x01b070b2, 0x00512c29, 0x0385ff98, 0x00f4596c, 0x032cc7a5, 0x038501ac, 0x024f3813, 0x02e326c2, 0x029efef7, 0x00146edb}}, Y: Field{[10]uint32{0x0067044e, 0x0255ad69, 0x03befde5, 0x0372ab7c, 0x015268ee, 0x011b7df3, 0x031de11d, 0x013f4228, 0x03e9dd79, 0x00194a0a}}}, + {X: Field{[10]uint32{0x016d001f, 0x00fae81a, 0x013e45a8, 0x03536458, 0x02aa2027, 0x01239897, 0x0203afcd, 0x02aa0910, 0x02974c7c, 0x001f370c}}, Y: Field{[10]uint32{0x03519565, 0x014d2420, 0x00a36192, 0x0045b0b3, 0x026060a4, 0x00a27968, 0x00027a7a, 0x0156cede, 0x01433b1a, 0x002e4ae6}}}, + {X: Field{[10]uint32{0x009c9314, 0x02655d58, 0x02fc9030, 0x02e84051, 0x02aa478f, 0x0205e9af, 0x03722f6d, 0x0226da99, 0x02beb8e9, 0x000f2a71}}, Y: Field{[10]uint32{0x02ca2c0f, 0x01fc25b3, 0x00e4d6bb, 0x036af452, 0x0074c6e0, 0x0049328c, 0x006bba34, 0x006f0e0e, 0x017ff4b8, 0x001540bb}}}, + {X: Field{[10]uint32{0x01354d0c, 0x00447a2b, 0x00436864, 0x00a73248, 0x0390e1a2, 0x023b5798, 0x01bc1c83, 0x032b6bc0, 0x026c45ed, 0x002a8aaf}}, Y: Field{[10]uint32{0x0024f6cd, 0x03727cbe, 0x00d47c44, 0x02a21c55, 0x0295bb3d, 0x006e8ac9, 0x0061251f, 0x00c12893, 0x01c66f91, 0x0006e08a}}}, + {X: Field{[10]uint32{0x023bc7ee, 0x01a4db63, 0x0375a2ab, 0x02b7ef9b, 0x0375466a, 0x03dced83, 0x01f226de, 0x027564c6, 0x023df28c, 0x002d4b2b}}, Y: Field{[10]uint32{0x03cfe220, 0x00b6e222, 0x03a3a446, 0x0164b85f, 0x02421e07, 0x029f2562, 0x00738488, 0x00247732, 0x035e022c, 0x003afb9c}}}, + {X: Field{[10]uint32{0x0021ef54, 0x036414ce, 0x01661838, 0x030d1ed9, 0x01635469, 0x00d2585a, 0x01a62832, 0x0372d84f, 0x030362a6, 0x00304215}}, Y: Field{[10]uint32{0x00eaf517, 0x033e6cd3, 0x01cdec38, 0x03760ade, 0x0044511c, 0x002b531f, 0x002cac14, 0x02a3acb7, 0x02c8c1e6, 0x003f9910}}}, + {X: Field{[10]uint32{0x0308c11d, 0x00e5976b, 0x00768d5a, 0x0334be9b, 0x0383477f, 0x01908a41, 0x01454765, 0x0049fd67, 0x011cfcaf, 0x003c27a7}}, Y: Field{[10]uint32{0x03c15d10, 0x03e593a2, 0x009a27e8, 0x018f3fb3, 0x01a5b2e6, 0x0175fbf6, 0x0028fc9c, 0x03ec56fd, 0x03221f44, 0x0003c069}}}, + {X: Field{[10]uint32{0x015c4527, 0x0309dfd2, 0x0341a036, 0x017f80f4, 0x03fd3e80, 0x035c6d65, 0x00b3b179, 0x00fafb62, 0x02ef1e47, 0x00180918}}, Y: Field{[10]uint32{0x03a079c3, 0x0387db58, 0x02ce2844, 0x02c7ae74, 0x02fed2a9, 0x00fc8567, 0x02d9f235, 0x00773aaa, 0x00617141, 0x003e476d}}}, + {X: Field{[10]uint32{0x01bb582d, 0x0065ff82, 0x03c70720, 0x004c25ae, 0x016b828d, 0x0049a883, 0x00ae3558, 0x0267e841, 0x001e8e0d, 0x0009cea2}}, Y: Field{[10]uint32{0x004b0d5d, 0x00d2869a, 0x003da295, 0x01d5e68b, 0x00d1b407, 0x03ddadb0, 0x03b2f727, 0x02e45334, 0x005814a7, 0x0016ec9b}}}, + {X: Field{[10]uint32{0x000cd54d, 0x03237cba, 0x03d9f566, 0x00107691, 0x01e8cd05, 0x01bf263e, 0x02f41723, 0x032dcad0, 0x03460616, 0x001f077c}}, Y: Field{[10]uint32{0x03c41dd7, 0x02b58c13, 0x033b9390, 0x00bb059d, 0x0073153c, 0x02f04956, 0x03a8d456, 0x02e6f916, 0x020dd602, 0x002b4f9f}}}, + {X: Field{[10]uint32{0x01942f94, 0x0319544f, 0x006d3c62, 0x02c14e5e, 0x039ad644, 0x033a002d, 0x014551f3, 0x03c451ce, 0x0234657f, 0x001e5b89}}, Y: Field{[10]uint32{0x014f1c60, 0x0331f0a8, 0x01b11bb1, 0x01aa1003, 0x001e8ec6, 0x00c02069, 0x0080eb9c, 0x01c44431, 0x0238ed58, 0x002d96ef}}}, + {X: Field{[10]uint32{0x02302bd1, 0x02f7b586, 0x00206193, 0x016d80bf, 0x0062b056, 0x029990b2, 0x029953a2, 0x03da2a91, 0x01fa9985, 0x001789d8}}, Y: Field{[10]uint32{0x0253e274, 0x036eb15c, 0x030b4713, 0x036adf50, 0x003715c9, 0x0144d9f4, 0x0347c070, 0x013d740b, 0x03709db2, 0x0016e826}}}, + {X: Field{[10]uint32{0x03abe794, 0x0049b153, 0x010e6164, 0x008a636e, 0x005c004c, 0x02891ad0, 0x01ab0385, 0x00683fac, 0x0092fd34, 0x00119163}}, Y: Field{[10]uint32{0x03446725, 0x028f7635, 0x033eaf02, 0x02bbbb3c, 0x029d018f, 0x018fc729, 0x02fc3242, 0x0106e162, 0x028b3453, 0x00021675}}}, + {X: Field{[10]uint32{0x01153265, 0x00de6960, 0x0152c5c7, 0x00d32fee, 0x00a410e1, 0x01bd3989, 0x009ddc3d, 0x01f073ff, 0x0030bf81, 0x003f1206}}, Y: Field{[10]uint32{0x01322551, 0x0289e1d6, 0x02169a43, 0x017eb3a3, 0x038dfe38, 0x03676d2a, 0x0248e89f, 0x01f68512, 0x0228bd3d, 0x0028622c}}}, + {X: Field{[10]uint32{0x02ed03e6, 0x00984357, 0x01901779, 0x019a012b, 0x033a7804, 0x038abb6f, 0x0302742c, 0x029540f1, 0x027d9771, 0x0010b65d}}, Y: Field{[10]uint32{0x02d50417, 0x03a87096, 0x003ece89, 0x01a34376, 0x03d2e0f5, 0x000b490c, 0x02c782be, 0x03ccdce8, 0x032e9764, 0x0037da50}}}, + {X: Field{[10]uint32{0x01477148, 0x00bd386e, 0x004dcdc7, 0x03f74a38, 0x02462dee, 0x0057b644, 0x02602226, 0x02ca5dcb, 0x0049993a, 0x000dc48b}}, Y: Field{[10]uint32{0x0196e39d, 0x00e08316, 0x0008ef1d, 0x037a9549, 0x02410b3e, 0x01900ae3, 0x00422cc3, 0x03ef0ea8, 0x00f0924c, 0x00189ffd}}}, + {X: Field{[10]uint32{0x006896c3, 0x003a8697, 0x00bb7314, 0x015e972e, 0x013619a5, 0x01db87ab, 0x03e52cca, 0x03f2f9d0, 0x018294ba, 0x00271520}}, Y: Field{[10]uint32{0x038f7fcc, 0x00efc16c, 0x014c50b5, 0x02cc8252, 0x02ec0478, 0x01c14130, 0x031dafbf, 0x0214a3b1, 0x032eb88e, 0x0017f311}}}, + {X: Field{[10]uint32{0x025a2db9, 0x01a6e03d, 0x02a077ae, 0x01ff58fc, 0x000a5927, 0x01c48d82, 0x004e0251, 0x007da5d7, 0x02d7aa5b, 0x001ee75e}}, Y: Field{[10]uint32{0x017d1bf8, 0x03587f43, 0x0012fabf, 0x01729d5a, 0x02c4a7f1, 0x01453b2b, 0x01c14d6f, 0x0288a740, 0x02e8714a, 0x001b3787}}}, + {X: Field{[10]uint32{0x00a9a102, 0x00737a96, 0x0153e017, 0x0141b1df, 0x026990e9, 0x0107820b, 0x016d948e, 0x01582b59, 0x02f2c985, 0x002bd776}}, Y: Field{[10]uint32{0x00a5b505, 0x01607e7b, 0x003f5fd4, 0x0123bfe5, 0x011f6853, 0x03385ad6, 0x0039ff76, 0x01bfcf12, 0x011b7289, 0x0038d211}}}, + {X: Field{[10]uint32{0x0111293d, 0x03b2da48, 0x029a395b, 0x02d0538a, 0x01d26394, 0x03834559, 0x03ab3662, 0x02f46417, 0x0318e957, 0x0010999f}}, Y: Field{[10]uint32{0x02bbc7a5, 0x00083559, 0x022a2e57, 0x02c6bb2a, 0x033c0076, 0x03f895e5, 0x03fb16c1, 0x02ed8d39, 0x02b269e9, 0x000a2374}}}, + {X: Field{[10]uint32{0x00b276d7, 0x01506dd0, 0x03618587, 0x01857966, 0x029be971, 0x00c99973, 0x002a5a6f, 0x020c99d3, 0x021d50ab, 0x0017a71e}}, Y: Field{[10]uint32{0x03a11f17, 0x02115b57, 0x035b1a29, 0x0063b822, 0x02ec4664, 0x031c1d12, 0x0292c612, 0x02bd08d0, 0x00611f39, 0x00248a0d}}}, + {X: Field{[10]uint32{0x03ed8b2a, 0x0293ca37, 0x03c489a2, 0x001a2d1a, 0x038b52b5, 0x02cc82e5, 0x00d9ac97, 0x02d608ad, 0x03faf486, 0x00263183}}, Y: Field{[10]uint32{0x005280f9, 0x01eca6dd, 0x0132b580, 0x0212bb70, 0x0170416d, 0x001bb6f9, 0x02f42fa3, 0x01255604, 0x0113c253, 0x00287098}}}, + {X: Field{[10]uint32{0x0385babc, 0x01d66770, 0x0116cf0a, 0x007f6199, 0x03f30948, 0x00d43969, 0x0286e71f, 0x00b364f0, 0x01821ed5, 0x0024afea}}, Y: Field{[10]uint32{0x02c1ddb4, 0x02ba7b6c, 0x03cb802f, 0x024a545a, 0x036f5276, 0x037f893d, 0x0254e738, 0x02d2c6de, 0x0396c71a, 0x0028ff25}}}, + {X: Field{[10]uint32{0x025b865f, 0x025ce0be, 0x018c4ec1, 0x02e40eec, 0x037b7798, 0x000ac30d, 0x02413e84, 0x02d67eb3, 0x0008bd8e, 0x0026f89d}}, Y: Field{[10]uint32{0x027a2f61, 0x03a2ff69, 0x00027f54, 0x00a54093, 0x02def3ec, 0x02ee4b77, 0x02ed2c81, 0x01a8e5a3, 0x01801964, 0x00044215}}}, + {X: Field{[10]uint32{0x036350bc, 0x02e711a5, 0x018275b1, 0x01676e79, 0x037751bc, 0x0302462f, 0x0391ce38, 0x02c165ad, 0x026cb7ba, 0x0009f35a}}, Y: Field{[10]uint32{0x03faeda8, 0x03e03ba0, 0x00011a16, 0x01353fad, 0x032f41d0, 0x01a19479, 0x03761df0, 0x00ab17c4, 0x01678fce, 0x00224354}}}, + {X: Field{[10]uint32{0x0068f2eb, 0x022073bd, 0x00e1f5d8, 0x00f25bcc, 0x035f22be, 0x00319918, 0x00f6597a, 0x0184e532, 0x014daaf9, 0x003a25b8}}, Y: Field{[10]uint32{0x0196030b, 0x027cacec, 0x027260bb, 0x02136b74, 0x02efea7e, 0x03622eb2, 0x00d971af, 0x006ac771, 0x00b0512c, 0x002fac01}}}, + {X: Field{[10]uint32{0x013f8ec0, 0x030359f9, 0x033da54e, 0x0226142e, 0x03a9dd23, 0x03eacb03, 0x00b3779e, 0x0150058d, 0x0269ac48, 0x000938b4}}, Y: Field{[10]uint32{0x0219e525, 0x026a9600, 0x02460892, 0x016f907e, 0x03f5beda, 0x018e8168, 0x03ca2ca6, 0x0353080e, 0x02c2642b, 0x00379c0b}}}, + {X: Field{[10]uint32{0x001d1676, 0x0367025a, 0x03db95a9, 0x00077829, 0x009b5c4d, 0x02c48694, 0x010159b4, 0x03279175, 0x03c948c1, 0x0025e989}}, Y: Field{[10]uint32{0x033203d9, 0x01fba49b, 0x00b9ffef, 0x03e69f24, 0x018d5f3c, 0x03d75708, 0x02d43037, 0x0270a7f2, 0x015b5539, 0x00066f42}}}, + {X: Field{[10]uint32{0x0195b08f, 0x0354dc1c, 0x0014b40b, 0x01807e82, 0x0033ed67, 0x0274f214, 0x03234c7f, 0x03b17ddd, 0x0251e604, 0x0029c360}}, Y: Field{[10]uint32{0x00bccc4f, 0x009b542b, 0x01f4e0e1, 0x0225aa16, 0x0385325a, 0x031c4350, 0x012c016a, 0x00f78fc5, 0x010774e2, 0x0037ca36}}}, + {X: Field{[10]uint32{0x0242f42b, 0x023056be, 0x0012ea7c, 0x025cdbcd, 0x0327743a, 0x00f5e2c5, 0x001a0071, 0x0191cb38, 0x00434b27, 0x000b59db}}, Y: Field{[10]uint32{0x01fa7312, 0x03023ff2, 0x018ea024, 0x00f0ce52, 0x0052fa70, 0x0020ada1, 0x03b8f941, 0x0174c900, 0x01e406ef, 0x002f8a33}}}, + {X: Field{[10]uint32{0x00b29cf5, 0x0350ad00, 0x0172928f, 0x00a6d283, 0x0246c89d, 0x03c9f00d, 0x03857cfc, 0x01c9d576, 0x01e17516, 0x003d9b09}}, Y: Field{[10]uint32{0x03193201, 0x009b7a71, 0x01b6e059, 0x00c6eb5a, 0x028d2a02, 0x03670632, 0x0049150c, 0x02a21130, 0x02d422c4, 0x000fb88e}}}, + {X: Field{[10]uint32{0x02427060, 0x024f5f40, 0x01c6c293, 0x02b6393f, 0x01ce6e77, 0x013a3801, 0x004f81d2, 0x0361fbbd, 0x004b9d39, 0x0036e91f}}, Y: Field{[10]uint32{0x018d7622, 0x03b6eecf, 0x03597338, 0x022e7f3e, 0x015240f2, 0x0370ed71, 0x037eedd4, 0x00003c25, 0x0092e53d, 0x000b5719}}}, + {X: Field{[10]uint32{0x03e10f0f, 0x03e20549, 0x0301bbfd, 0x0197c20e, 0x0294788f, 0x024768ed, 0x015aedae, 0x01f71562, 0x01d94f62, 0x00285d80}}, Y: Field{[10]uint32{0x020a1183, 0x036100cd, 0x00890fa3, 0x016d178c, 0x020baded, 0x026416ce, 0x03025bd9, 0x006c56be, 0x03c8cfea, 0x001d0227}}}, + {X: Field{[10]uint32{0x0180e141, 0x03ce84d3, 0x003d5188, 0x030d53ae, 0x011c24c6, 0x03edeb23, 0x0261a125, 0x03fa41f8, 0x009fb84a, 0x00375c0c}}, Y: Field{[10]uint32{0x00bed563, 0x00d94d51, 0x018682a8, 0x019bd955, 0x024bdfd5, 0x03223777, 0x035b7862, 0x029dfe74, 0x02c0ac93, 0x000c8052}}}, + {X: Field{[10]uint32{0x03037afd, 0x015dda21, 0x003f783b, 0x024e4832, 0x03cadefb, 0x0131a8bc, 0x01253f00, 0x02ebe5c0, 0x003de746, 0x001e7f54}}, Y: Field{[10]uint32{0x00a61b93, 0x035a437b, 0x0317f1e0, 0x000023a2, 0x0286a4e6, 0x011e948f, 0x0220c266, 0x0024c4fe, 0x02586318, 0x000f172d}}}, + {X: Field{[10]uint32{0x020ff6a0, 0x00b048ae, 0x009566b9, 0x022a4d58, 0x021e7265, 0x01a8a692, 0x00eb8961, 0x0358ec7d, 0x037d77c7, 0x00346abc}}, Y: Field{[10]uint32{0x00a93bec, 0x004e514f, 0x0232ecfd, 0x0276766b, 0x00c7cac3, 0x03d0d6f7, 0x01f0e0bb, 0x02e81caf, 0x03ae5cfb, 0x00394d6d}}}, + {X: Field{[10]uint32{0x02d93c4f, 0x0149d5ea, 0x016445c7, 0x01635966, 0x01fe525d, 0x033690d1, 0x02b74fc2, 0x03652e6d, 0x0382b351, 0x001a3fc6}}, Y: Field{[10]uint32{0x0065a13c, 0x0063cead, 0x0192b798, 0x01d21460, 0x019186e3, 0x01764ef7, 0x02194aac, 0x02b02341, 0x02f1c422, 0x002aeec3}}}, + {X: Field{[10]uint32{0x0210552d, 0x00701665, 0x0224a5c4, 0x02898bb3, 0x0314393e, 0x01329921, 0x01b73bcf, 0x00f97417, 0x00971806, 0x00089e17}}, Y: Field{[10]uint32{0x021d8774, 0x00606aab, 0x018c4157, 0x0128972e, 0x021933e6, 0x029d735b, 0x005e75c8, 0x02a03093, 0x026ad7a7, 0x00270200}}}, + {X: Field{[10]uint32{0x035ffebf, 0x007c9113, 0x00580889, 0x018e9df6, 0x02e26780, 0x03f085d8, 0x00662583, 0x02dd5d7c, 0x01e7563f, 0x00189b2d}}, Y: Field{[10]uint32{0x028498b4, 0x01c32f19, 0x0211cce1, 0x0289598b, 0x01953a6d, 0x02a61470, 0x01161845, 0x030fc90d, 0x03f672c3, 0x00020da7}}}, + {X: Field{[10]uint32{0x00d12d2a, 0x01a3d6a0, 0x01ac55e6, 0x0392dbeb, 0x0061c8c4, 0x022293ca, 0x03fa430b, 0x01841603, 0x02f4d6f4, 0x002a67c3}}, Y: Field{[10]uint32{0x01053d06, 0x03fccfac, 0x00d3e28f, 0x012be0c1, 0x024e2f06, 0x02b8abbd, 0x0002c406, 0x00020dde, 0x032939db, 0x0025cab7}}}, + {X: Field{[10]uint32{0x03f02645, 0x00c77a71, 0x03e61019, 0x00f32acf, 0x03784afe, 0x03efa52a, 0x000a3fbd, 0x02cb6f2e, 0x02272ff0, 0x002c90f3}}, Y: Field{[10]uint32{0x020b7559, 0x0011238d, 0x03e9f41a, 0x0161188a, 0x023e85b8, 0x03a9460d, 0x0233df8f, 0x0320831c, 0x0119fbb8, 0x0036cbab}}}, + {X: Field{[10]uint32{0x0363deb3, 0x037d5c10, 0x022f3f8b, 0x019150c8, 0x0143efb2, 0x002877fd, 0x031b21a0, 0x02d8b1a9, 0x009d685c, 0x0031d38f}}, Y: Field{[10]uint32{0x01c4b2ec, 0x00d121bb, 0x03ed4387, 0x02d87a0c, 0x025cd550, 0x013bed86, 0x00358efc, 0x00f4168e, 0x0261fbf2, 0x00261f60}}}, + {X: Field{[10]uint32{0x01f71c47, 0x01bbc377, 0x03047888, 0x03090f70, 0x01d34710, 0x03025ba7, 0x00885f34, 0x01352f47, 0x00a7fc98, 0x003fcbd9}}, Y: Field{[10]uint32{0x006e906d, 0x006a16a8, 0x0249765e, 0x0035e17c, 0x0309eac6, 0x01a43035, 0x02c91257, 0x00bf7c7b, 0x0258fd5e, 0x00053018}}}, + {X: Field{[10]uint32{0x03712085, 0x0188506e, 0x01badec1, 0x0053da86, 0x026819b5, 0x0103dd0e, 0x02e8a8b1, 0x02ac934d, 0x00e13f4c, 0x001f64b1}}, Y: Field{[10]uint32{0x01b698c8, 0x01bd05a0, 0x033d1b72, 0x00839af8, 0x003e0dc9, 0x0369a1ae, 0x03193309, 0x035f4aa6, 0x03622ec7, 0x00181ad5}}}, + {X: Field{[10]uint32{0x03e13b6c, 0x03495183, 0x01518a0b, 0x0083fef3, 0x024ce0cc, 0x01e54580, 0x009487c7, 0x014a2627, 0x014d9ef4, 0x0000e90f}}, Y: Field{[10]uint32{0x01deb36e, 0x028ff036, 0x01912dfb, 0x02854d26, 0x00eedad2, 0x01ac49aa, 0x0228d61e, 0x024179ae, 0x03255768, 0x0017c934}}}, + {X: Field{[10]uint32{0x02a25f8f, 0x010a9b3b, 0x02308673, 0x0016cf19, 0x026e59fd, 0x01c74317, 0x00c67e73, 0x01793457, 0x03028010, 0x000239cb}}, Y: Field{[10]uint32{0x016b368e, 0x00767782, 0x015099ea, 0x02b66ef7, 0x031eada5, 0x01ede6c0, 0x01870da4, 0x02e1b7c2, 0x005158fd, 0x00025377}}}, + {X: Field{[10]uint32{0x00ef54dd, 0x03404f33, 0x02d6bfd9, 0x02c3961c, 0x02ab8789, 0x00d0fc4b, 0x037f9d18, 0x009d8b29, 0x00236dc0, 0x002e273f}}, Y: Field{[10]uint32{0x011141cd, 0x01ee4110, 0x0037d2ba, 0x0173c7dd, 0x01c3ad13, 0x03e18344, 0x02ce6f9d, 0x0265ad29, 0x028545a5, 0x0027269c}}}, + {X: Field{[10]uint32{0x01ccb59b, 0x03924410, 0x03ebbc64, 0x00f8b11c, 0x016744a4, 0x01892ced, 0x0190b535, 0x01a2d2ec, 0x00089798, 0x003a17b8}}, Y: Field{[10]uint32{0x02cbd6a2, 0x01d69484, 0x01723a80, 0x022fe10b, 0x010e1c9a, 0x01fb7747, 0x03e3b3d0, 0x03143089, 0x030f9ede, 0x0034ebf9}}}, + {X: Field{[10]uint32{0x02cb97b5, 0x035764ed, 0x01b3bfb0, 0x0144e645, 0x02f7f906, 0x0144d019, 0x00c8e16d, 0x01b4564f, 0x03f2774d, 0x0036375a}}, Y: Field{[10]uint32{0x035e26f4, 0x015bd294, 0x02b2c6d2, 0x03464544, 0x0325f7e6, 0x0217a7e2, 0x0031862b, 0x013cfc45, 0x00945f73, 0x0016880c}}}, + {X: Field{[10]uint32{0x02aa94e8, 0x00e1689d, 0x02aec3e6, 0x03be634d, 0x00033968, 0x0344cf61, 0x03bd5545, 0x02f7ad17, 0x01c5328f, 0x001df820}}, Y: Field{[10]uint32{0x00c2959a, 0x02daf845, 0x01669c0c, 0x02de4688, 0x00ba597f, 0x03820141, 0x026291a3, 0x03cbe116, 0x03f7ca25, 0x000b3a14}}}, + {X: Field{[10]uint32{0x03c904ab, 0x0311e7d9, 0x018c4fb9, 0x00f6c6b4, 0x02b5b920, 0x0127c1e8, 0x020b82f5, 0x025a09a0, 0x02eae8a4, 0x001441e1}}, Y: Field{[10]uint32{0x039cd96b, 0x025a19eb, 0x018a8fbd, 0x0307aac7, 0x00b39382, 0x0077219d, 0x03e21ae7, 0x031a7fd8, 0x03854e4d, 0x003704c0}}}, + {X: Field{[10]uint32{0x0242639d, 0x0109e268, 0x00ddabb6, 0x00cceaf0, 0x021169e4, 0x00203430, 0x0121056e, 0x0356d930, 0x02b3fbda, 0x000beebf}}, Y: Field{[10]uint32{0x00405cd3, 0x03e29f05, 0x031c92f3, 0x03257a97, 0x015ff199, 0x0074face, 0x019ef0a1, 0x02853796, 0x002fd9e6, 0x0002a176}}}, + {X: Field{[10]uint32{0x0312ae0a, 0x00ad791e, 0x02ae673b, 0x002478a3, 0x02aec808, 0x02d7c031, 0x03fbbc26, 0x0118f07c, 0x03eb6e6e, 0x0008036f}}, Y: Field{[10]uint32{0x03a95ecf, 0x0370072e, 0x0344ac59, 0x01dbf346, 0x03832127, 0x01524609, 0x021f0711, 0x00f65e0f, 0x0219bdaa, 0x001214a8}}}, + {X: Field{[10]uint32{0x00b8a3d9, 0x03fcaf89, 0x00ab41ac, 0x01c95086, 0x013ec225, 0x014b36e1, 0x03d46b6e, 0x03df7024, 0x00f60259, 0x0009ec50}}, Y: Field{[10]uint32{0x00583387, 0x02a9fff0, 0x00f7bc85, 0x018dc69d, 0x0228bb5d, 0x004c38c4, 0x00054c4f, 0x02b6eb50, 0x009f70cb, 0x000f3bb4}}}, + {X: Field{[10]uint32{0x015b7e71, 0x03592afa, 0x00a0fcd1, 0x032b5ca3, 0x000e175c, 0x0130ac0b, 0x022ec351, 0x014c4608, 0x01ee535c, 0x003f9250}}, Y: Field{[10]uint32{0x011f56f6, 0x01c013b9, 0x0370ed35, 0x03796172, 0x03748e0a, 0x02992b68, 0x01cb4422, 0x01946f62, 0x01ae286d, 0x003a7372}}}, + {X: Field{[10]uint32{0x01ff1cdf, 0x00e4979d, 0x01d885a0, 0x03b5664d, 0x030ce47c, 0x016f8bc5, 0x03443d76, 0x0252f4db, 0x009b4cae, 0x000c5f48}}, Y: Field{[10]uint32{0x02262d72, 0x01297ae2, 0x02864543, 0x037de298, 0x02c942a5, 0x02daa007, 0x03945af4, 0x015c703f, 0x009568fe, 0x00030645}}}, + {X: Field{[10]uint32{0x0093f9ea, 0x026850f3, 0x02cead9f, 0x002d64f3, 0x03df32e8, 0x00543a6a, 0x005f8ab0, 0x00c391dc, 0x0377764e, 0x003e5469}}, Y: Field{[10]uint32{0x03afd925, 0x01c3c548, 0x03052655, 0x00ec46b8, 0x026ac261, 0x004b3777, 0x00cc6b8b, 0x0088fb9b, 0x01d625f2, 0x003bee54}}}, + {X: Field{[10]uint32{0x0389c8ef, 0x007cd10c, 0x0284d309, 0x03d9b968, 0x024f251a, 0x03f925aa, 0x03229a9f, 0x023a2fc3, 0x00ebf5fd, 0x001c6b7c}}, Y: Field{[10]uint32{0x036969f4, 0x039957da, 0x0242539c, 0x01cb9d9d, 0x0198ed56, 0x0371ceb7, 0x00dfdf72, 0x0154d99d, 0x0063293a, 0x0004fd1d}}}, + {X: Field{[10]uint32{0x0236be75, 0x00471140, 0x02ea5009, 0x007a07db, 0x02c3fbab, 0x03518d04, 0x01cff39a, 0x03a03526, 0x000658c0, 0x0000ba81}}, Y: Field{[10]uint32{0x014f923f, 0x018ef225, 0x02234291, 0x03b7fbb8, 0x03d82c08, 0x02682938, 0x01743d20, 0x00dc87c2, 0x00740607, 0x0002f94b}}}, + {X: Field{[10]uint32{0x02182aea, 0x02df946d, 0x009350d9, 0x00b6589e, 0x03a37344, 0x00fc2c7c, 0x00c42223, 0x020309d4, 0x03904b3e, 0x00108d48}}, Y: Field{[10]uint32{0x01221d91, 0x03fb59f6, 0x02966395, 0x023e053e, 0x000fe09e, 0x02580c89, 0x008e48ba, 0x014598c3, 0x0349b27b, 0x001fd608}}}, + {X: Field{[10]uint32{0x027dda91, 0x03eae7be, 0x00e53771, 0x027b7023, 0x017702a2, 0x026af82d, 0x0064bf8e, 0x00a16e58, 0x0082a92b, 0x0014934f}}, Y: Field{[10]uint32{0x00f29c3a, 0x011c903c, 0x01894ec7, 0x01dc34fb, 0x00366a84, 0x00c6ff57, 0x0368e053, 0x02cb7352, 0x0217fdc6, 0x00291e80}}}, + {X: Field{[10]uint32{0x0056f7e8, 0x02eb85b0, 0x00c48776, 0x02bf45af, 0x000fc83c, 0x008c8ca7, 0x02eb5f5f, 0x013799aa, 0x02085ce0, 0x003dbb87}}, Y: Field{[10]uint32{0x00cea4d9, 0x01ab1b6f, 0x03c75c2f, 0x017462c9, 0x00ccbc95, 0x0251f5ed, 0x01939774, 0x03526aa8, 0x026a7e2b, 0x000cca2c}}}, + {X: Field{[10]uint32{0x03273978, 0x01345ac5, 0x03dae313, 0x01be6f64, 0x002ea84e, 0x0141df48, 0x02b5d119, 0x00505dc8, 0x012bb88f, 0x00270bdf}}, Y: Field{[10]uint32{0x01ab2a3a, 0x006f8f0b, 0x007daa57, 0x032bb94c, 0x01d338a4, 0x031795af, 0x033c5927, 0x02d0d739, 0x000366c8, 0x0004227c}}}, + {X: Field{[10]uint32{0x0299cc3c, 0x0204f1b2, 0x0228f9b9, 0x01ed23bf, 0x0305897b, 0x014eb879, 0x0124f152, 0x02db947f, 0x02b6730f, 0x00164e87}}, Y: Field{[10]uint32{0x0344f079, 0x00cc005d, 0x00ace404, 0x006a8ec7, 0x0109e35c, 0x03dd3946, 0x003a6300, 0x00b646f0, 0x0020fbd2, 0x003f3ede}}}, + {X: Field{[10]uint32{0x01f957e3, 0x00d4ac54, 0x039f40ef, 0x03ff7968, 0x028ec0ea, 0x01fe1e97, 0x004bc603, 0x02eb32f3, 0x00c383a7, 0x0018ae84}}, Y: Field{[10]uint32{0x007bdd45, 0x01fa7f33, 0x020bec2a, 0x003b5e99, 0x019fd01e, 0x02828940, 0x025fa19a, 0x02858695, 0x01b0dc84, 0x003099e8}}}, + {X: Field{[10]uint32{0x03731f64, 0x00f18657, 0x03c6a6d7, 0x0240529d, 0x0239e123, 0x00e92a76, 0x03641fe0, 0x018a858f, 0x0010deae, 0x000778ab}}, Y: Field{[10]uint32{0x03c8d2b2, 0x0106a276, 0x00006d71, 0x017e9bd4, 0x00a512b7, 0x0208853f, 0x027b5ad7, 0x025a7410, 0x0095b6d7, 0x00183d0f}}}, + {X: Field{[10]uint32{0x03d4e1d3, 0x0105b083, 0x02a6da43, 0x01c5ab2e, 0x00c48e92, 0x005dcbc6, 0x01086123, 0x020f220f, 0x01527090, 0x003c4695}}, Y: Field{[10]uint32{0x02d742f4, 0x024d4528, 0x03f4cdf5, 0x015368bc, 0x002be515, 0x02356cec, 0x00e397b3, 0x023106db, 0x01647cf4, 0x0029b42b}}}, + {X: Field{[10]uint32{0x00dc33fc, 0x02ba5b5f, 0x0243d2ae, 0x00fc45b0, 0x013dbad4, 0x032971fd, 0x015cc01f, 0x025f9487, 0x0240d756, 0x003d1151}}, Y: Field{[10]uint32{0x02549102, 0x0213de59, 0x026cfb37, 0x01af133d, 0x036b2599, 0x029d3b21, 0x02d70531, 0x01dc1175, 0x00ef46fe, 0x0010a5cb}}}, + {X: Field{[10]uint32{0x01b8780a, 0x00bb2368, 0x01ad4cad, 0x023423b3, 0x0110905b, 0x02cc67eb, 0x03c20fa3, 0x0019f06d, 0x007397be, 0x000afebc}}, Y: Field{[10]uint32{0x02590285, 0x03314993, 0x03cd5775, 0x02c57e08, 0x039077de, 0x025c3d3e, 0x028bdee9, 0x03259cf4, 0x0099ea97, 0x003b5499}}}, + {X: Field{[10]uint32{0x00f5f73b, 0x03153dd3, 0x01222cfe, 0x01623b5a, 0x026df6e0, 0x0108bdce, 0x023ca163, 0x03b642f7, 0x00812b5f, 0x003f06af}}, Y: Field{[10]uint32{0x032b975f, 0x03444da5, 0x01d8faf0, 0x01bd3fa7, 0x007ac68f, 0x02c73471, 0x00481dc4, 0x03f2f91a, 0x02db471c, 0x0036c71b}}}, + {X: Field{[10]uint32{0x00506a8d, 0x01db9bd3, 0x00c76124, 0x017ef8c7, 0x01b717d6, 0x024f00ab, 0x036f92d2, 0x00be6e8d, 0x02ac82e0, 0x00360e30}}, Y: Field{[10]uint32{0x01189377, 0x01ecc68d, 0x02ae251d, 0x032cf83d, 0x03532dd1, 0x01faac48, 0x0176f6ca, 0x03e380f0, 0x00670388, 0x00361e8c}}}, + {X: Field{[10]uint32{0x013ee38c, 0x025f81ac, 0x004b92f6, 0x03c4ce87, 0x0132c53f, 0x0269794e, 0x019d54ca, 0x015d2689, 0x02ff0729, 0x0012cea0}}, Y: Field{[10]uint32{0x028d6265, 0x02cc1d6e, 0x0229032d, 0x012f95c2, 0x00bf6073, 0x03205484, 0x026a0c46, 0x0115b4fd, 0x0341a788, 0x00110dca}}}, + {X: Field{[10]uint32{0x00e411aa, 0x035ab4ff, 0x002f20b8, 0x02438de7, 0x008e79d2, 0x02f54bdc, 0x01eaf6a9, 0x02b538c9, 0x03f36731, 0x0035df2e}}, Y: Field{[10]uint32{0x038372f0, 0x026fe13f, 0x01b50525, 0x019928e1, 0x02051f42, 0x0122f6a6, 0x02812377, 0x004f1e46, 0x0125f078, 0x003b919b}}}, + {X: Field{[10]uint32{0x02ea1483, 0x03f1b4bb, 0x006ec84e, 0x00b303c7, 0x03bed187, 0x014eb0c1, 0x00a75dc9, 0x002e09bb, 0x02b25892, 0x000e19fd}}, Y: Field{[10]uint32{0x0388aee3, 0x019c4d6b, 0x01cf4b82, 0x03d1a2b0, 0x01254d70, 0x032a7172, 0x013ff18d, 0x02025e80, 0x02dce607, 0x00331a9a}}}, + {X: Field{[10]uint32{0x001b0a9a, 0x02d4bbf3, 0x01279930, 0x026301ed, 0x032123fe, 0x0083dfc5, 0x00ea7dff, 0x03213d86, 0x0075e85f, 0x001ec022}}, Y: Field{[10]uint32{0x03075f90, 0x0159802f, 0x03904a8c, 0x00d2d42e, 0x02331f78, 0x00541dcb, 0x0055a1c4, 0x0245a697, 0x00bb8dbc, 0x000fcecc}}}, + {X: Field{[10]uint32{0x0234ef3a, 0x02875de3, 0x009a5ba7, 0x01e81369, 0x02907e9b, 0x01352de5, 0x01795600, 0x0129261d, 0x00d91630, 0x002e96d1}}, Y: Field{[10]uint32{0x03333661, 0x0131d6f3, 0x01e13f87, 0x01d8fb4e, 0x024d47ea, 0x00373537, 0x02e124f0, 0x0278ee6e, 0x03aa4821, 0x0005ad26}}}, + {X: Field{[10]uint32{0x02b8d9df, 0x0358a738, 0x03594342, 0x0084d568, 0x02910fe5, 0x016fe991, 0x02b3a23b, 0x00483614, 0x03e27fe4, 0x001a47ab}}, Y: Field{[10]uint32{0x02c71d85, 0x01fe7e2d, 0x02878188, 0x007712f2, 0x01bd71ea, 0x01489f6f, 0x0294fd6a, 0x013729f0, 0x00974218, 0x0010e818}}}, + {X: Field{[10]uint32{0x00a54123, 0x001b9215, 0x002d8440, 0x035f0dd5, 0x01551377, 0x01177299, 0x0173e38a, 0x02a1bcd4, 0x00bbc9f5, 0x00004e9b}}, Y: Field{[10]uint32{0x00488620, 0x00625202, 0x004b884d, 0x023cc08f, 0x028a43d3, 0x03a3ebe7, 0x01cc2e62, 0x01367bff, 0x009c9a96, 0x003b3ce0}}}, + {X: Field{[10]uint32{0x02f10e45, 0x00ba3579, 0x036ceb71, 0x0080b730, 0x02da6654, 0x02d3c396, 0x01731e91, 0x01734a4f, 0x02f3fb59, 0x000cff4a}}, Y: Field{[10]uint32{0x018ed2cf, 0x00c79802, 0x00c31f63, 0x00c6cea5, 0x0280ca53, 0x00233e8e, 0x0181bf98, 0x0376912e, 0x007a0a8b, 0x00389a8c}}}, + {X: Field{[10]uint32{0x00b774f6, 0x02f962cd, 0x0244c15c, 0x02608bd3, 0x03b00332, 0x029d6124, 0x033ba575, 0x01fde1da, 0x003359e4, 0x001d6550}}, Y: Field{[10]uint32{0x020458a9, 0x01c0f797, 0x01253f8e, 0x00729eb4, 0x00b6e665, 0x0110b000, 0x02998553, 0x015a36c2, 0x004070b8, 0x001fba68}}}, + {X: Field{[10]uint32{0x035b9480, 0x0176965b, 0x032f3650, 0x01944340, 0x00b3dd36, 0x01052fbd, 0x0015e7e8, 0x01f9a13a, 0x03b0c3b1, 0x001e4667}}, Y: Field{[10]uint32{0x03d9a0ab, 0x02b0fb94, 0x021b5054, 0x020d0646, 0x00abaab3, 0x0128156e, 0x03aacba5, 0x03273fbc, 0x0173f358, 0x00256f2a}}}, + {X: Field{[10]uint32{0x011aa352, 0x01c00029, 0x017b5d6d, 0x0306b226, 0x006edd0b, 0x028cff50, 0x03ed64e0, 0x03382cb9, 0x00e7962e, 0x0025c17d}}, Y: Field{[10]uint32{0x019ff347, 0x0375ca12, 0x0399db2b, 0x0157dc6a, 0x0058f408, 0x024875b6, 0x026193d8, 0x011ea284, 0x0357ad45, 0x00135339}}}, + {X: Field{[10]uint32{0x012fd777, 0x0368f38c, 0x02e12df7, 0x01d6e2c5, 0x01cadeeb, 0x00dd99d3, 0x0160b983, 0x02ad7cc1, 0x0067b841, 0x002206bc}}, Y: Field{[10]uint32{0x0083b84f, 0x0337b24d, 0x037019ac, 0x00f468e8, 0x017588be, 0x02c512c7, 0x010f62d8, 0x03c175f0, 0x03d4512e, 0x0033304f}}}, + {X: Field{[10]uint32{0x00e99621, 0x0357d704, 0x012fb1f6, 0x02dcbf50, 0x0041bfc3, 0x01eb41e5, 0x02e14cd9, 0x032763d0, 0x024433c2, 0x003fa3de}}, Y: Field{[10]uint32{0x02b3b2a9, 0x00ff752d, 0x026572a9, 0x03cf311a, 0x034c8bab, 0x0211b1e6, 0x01c4ee3a, 0x010dd25b, 0x02ee0cf3, 0x00396d5d}}}, + {X: Field{[10]uint32{0x004d798f, 0x024eaf17, 0x006cb918, 0x01927814, 0x0384f400, 0x00f0d3a0, 0x012f8320, 0x022ce0fe, 0x00da18e0, 0x003fd0f2}}, Y: Field{[10]uint32{0x01df2e7f, 0x01f6c05f, 0x02fd5242, 0x00ce92ec, 0x02f5a754, 0x02076f61, 0x009dde19, 0x03680b03, 0x005923a9, 0x00295d68}}}, + {X: Field{[10]uint32{0x00db276b, 0x031bf54a, 0x00a42ed3, 0x0105cd9e, 0x03d8f9d8, 0x012ec6cc, 0x00852427, 0x0138844d, 0x0056b97f, 0x00011c54}}, Y: Field{[10]uint32{0x014302b2, 0x03e88061, 0x0212fcab, 0x03b99beb, 0x0073a18b, 0x02e62a8a, 0x00cd71ef, 0x03c767fa, 0x01463521, 0x002d3034}}}, + {X: Field{[10]uint32{0x031fff51, 0x0121c709, 0x00814974, 0x03acc6a2, 0x02acd85e, 0x02e0f9fb, 0x0251394c, 0x00756b0a, 0x0008c5f5, 0x00217276}}, Y: Field{[10]uint32{0x03666a7d, 0x024aef96, 0x01eb8b49, 0x0034660b, 0x02018505, 0x01bb1fd7, 0x0191454d, 0x026e219a, 0x03bf2382, 0x0000a9f0}}}, + {X: Field{[10]uint32{0x0170dac9, 0x0265fe5f, 0x02f24529, 0x031db5b4, 0x03f46b60, 0x000d1173, 0x00b4b259, 0x00da380f, 0x00ef8b1e, 0x00300ae5}}, Y: Field{[10]uint32{0x0325f3a0, 0x00d0f079, 0x021d680a, 0x028ab3e5, 0x0310fadb, 0x037874a2, 0x0017825a, 0x02079235, 0x0129bcff, 0x002eee5f}}}, + {X: Field{[10]uint32{0x00241df6, 0x011caa0e, 0x02db3e29, 0x018ffb9e, 0x020fcb8b, 0x034d4e87, 0x01ac4393, 0x01bdf90c, 0x03bd28e2, 0x0012c564}}, Y: Field{[10]uint32{0x02fdcc56, 0x0138d3bc, 0x00ef0d6e, 0x022cf332, 0x003f184f, 0x02b27616, 0x0225b113, 0x01a15498, 0x0328f496, 0x002299e9}}}, + {X: Field{[10]uint32{0x02a64dd4, 0x007353c9, 0x00dd231d, 0x01b92e77, 0x037a8e7f, 0x0354a1a6, 0x02505559, 0x037b8eb5, 0x015bba51, 0x003d901d}}, Y: Field{[10]uint32{0x0287e1c8, 0x03414e5b, 0x00882a48, 0x03215745, 0x0391e0e3, 0x03092b01, 0x0029f6ee, 0x00a42f53, 0x0000a53e, 0x001ce1fe}}}, + {X: Field{[10]uint32{0x0389515b, 0x01da5e5d, 0x0206e022, 0x008a4529, 0x0016d0a5, 0x01c233be, 0x036f42cd, 0x00db18f7, 0x02a94368, 0x002524d1}}, Y: Field{[10]uint32{0x00e2b356, 0x00e0ee6a, 0x00073031, 0x034fb797, 0x0031dd41, 0x021d505d, 0x025c847b, 0x000807bd, 0x032d952a, 0x002a40e4}}}, + {X: Field{[10]uint32{0x03f91a60, 0x01802299, 0x0245cde4, 0x020f172f, 0x02cdcc97, 0x026308bc, 0x010b1f66, 0x03b7f08e, 0x019ec769, 0x00060902}}, Y: Field{[10]uint32{0x011bd1e2, 0x0109d9cc, 0x02ae0adf, 0x0200de24, 0x02804a87, 0x03e82238, 0x02051f3b, 0x013755b3, 0x01fa81e0, 0x0003e101}}}, + {X: Field{[10]uint32{0x0201d341, 0x022b3475, 0x022f92ec, 0x02484e71, 0x00683aa7, 0x03a57cf7, 0x005f34cc, 0x00f64a20, 0x03d8e463, 0x0039ad1b}}, Y: Field{[10]uint32{0x001d824a, 0x0074c033, 0x011d1639, 0x02930a0e, 0x00d6c0be, 0x032fd636, 0x00faf4a7, 0x0298e94a, 0x0013f3fe, 0x0014cf6e}}}, + {X: Field{[10]uint32{0x03992b93, 0x010db3ff, 0x0015d60a, 0x014bc5d8, 0x03a04c62, 0x03504e74, 0x00d150d3, 0x02c63752, 0x0330dc19, 0x0018de66}}, Y: Field{[10]uint32{0x02dcc41b, 0x0336c345, 0x015073c3, 0x032cae8d, 0x0007f485, 0x03c1905e, 0x00e72f5f, 0x0137bb40, 0x01125ebf, 0x00098814}}}, + {X: Field{[10]uint32{0x02ad7338, 0x028a7c4b, 0x01676670, 0x00927c7f, 0x037fac53, 0x038dc2c3, 0x01b88d3a, 0x0280b7a1, 0x035ab1d5, 0x0023340b}}, Y: Field{[10]uint32{0x00c0d8e4, 0x03c2586f, 0x006278e2, 0x03bb10e4, 0x03511d56, 0x02f26ee9, 0x02cb70f0, 0x02275984, 0x02acceb6, 0x000d62d0}}}, + {X: Field{[10]uint32{0x01f82fab, 0x0286a7b7, 0x00991d3e, 0x0199282a, 0x01f76127, 0x03ccec19, 0x01aba41b, 0x034777a5, 0x03e6d48b, 0x00357859}}, Y: Field{[10]uint32{0x0271d1f7, 0x0309a1ab, 0x03d70849, 0x0188e095, 0x02aaf45f, 0x03361ab8, 0x00ec9cb3, 0x0337d3f1, 0x0182d653, 0x001b308e}}}, + {X: Field{[10]uint32{0x009bfdba, 0x006773df, 0x030cf4ff, 0x01096192, 0x01d72b19, 0x01fc0306, 0x034f09d9, 0x03cb7c4c, 0x01006987, 0x003101cd}}, Y: Field{[10]uint32{0x037ff262, 0x003274ff, 0x00ca82bf, 0x002b295a, 0x02b760ff, 0x000de3e0, 0x03366bf3, 0x004c9aa6, 0x00466b46, 0x003d959a}}}, + {X: Field{[10]uint32{0x00c4fde2, 0x0031eabc, 0x02b91184, 0x0303ecb7, 0x0229a7c2, 0x020e0c63, 0x0221db2a, 0x006fec22, 0x02719c50, 0x000277c7}}, Y: Field{[10]uint32{0x02d00fc0, 0x014c973e, 0x03ea580a, 0x016d0f7b, 0x03e977c7, 0x024079c0, 0x0315ae54, 0x00300ac0, 0x00ae6d0e, 0x003358a3}}}, + {X: Field{[10]uint32{0x024c696c, 0x022e134a, 0x0165b7d0, 0x01242b5c, 0x031c91c2, 0x0248b165, 0x03108ee6, 0x030c2408, 0x0029df73, 0x002545d9}}, Y: Field{[10]uint32{0x01c0fbe4, 0x0021b2fa, 0x000cbdd8, 0x02dc901d, 0x011994fb, 0x00dd724a, 0x02084700, 0x036f3208, 0x00493b62, 0x000fb3ff}}}, + {X: Field{[10]uint32{0x01628c6e, 0x023d8031, 0x0156da31, 0x021cd3d5, 0x02f57fe1, 0x012fa3ed, 0x03a7e0e9, 0x0034d784, 0x00e8692b, 0x001c2312}}, Y: Field{[10]uint32{0x0105a664, 0x0378c828, 0x029bfe1c, 0x0004fdf6, 0x005af7e6, 0x03da8bc0, 0x020432e9, 0x00747c9f, 0x0302deee, 0x00254d38}}}, + {X: Field{[10]uint32{0x025b4c09, 0x00732853, 0x0222b299, 0x030274c9, 0x0146275e, 0x02c9af85, 0x01620794, 0x031ce6d7, 0x017ab82d, 0x0009dd78}}, Y: Field{[10]uint32{0x031ccddc, 0x02de4206, 0x0152e8a9, 0x00a21d13, 0x03338ab2, 0x03684ca3, 0x02b52c28, 0x00d67f7b, 0x027c80e8, 0x000ea9bb}}}, + {X: Field{[10]uint32{0x030192da, 0x0248a700, 0x03270be1, 0x00d0f0e0, 0x0044da6b, 0x023ed228, 0x0334959b, 0x013cc73c, 0x02c2039c, 0x0011f06a}}, Y: Field{[10]uint32{0x000d7cc0, 0x038562d8, 0x003551fd, 0x0168848a, 0x00e5813f, 0x02681471, 0x01cd4025, 0x03087611, 0x011c5ba6, 0x00176b59}}}, + {X: Field{[10]uint32{0x00bad15e, 0x036a86ee, 0x02c70d77, 0x0353e8a2, 0x01eef459, 0x033e897c, 0x03b2bf59, 0x01325806, 0x005a4b86, 0x003e03d1}}, Y: Field{[10]uint32{0x0374ff16, 0x01ffdc2c, 0x02c8863f, 0x03d297c4, 0x0183cd57, 0x03a7e239, 0x00b9da6c, 0x01a659b4, 0x02046b8c, 0x0028e0f7}}}, + {X: Field{[10]uint32{0x014d2f66, 0x02e40faf, 0x01bf6f9c, 0x00967cb5, 0x02b22081, 0x01e2dc5c, 0x01f436d5, 0x00d866a3, 0x03b91ad3, 0x000a4939}}, Y: Field{[10]uint32{0x00841875, 0x022f6e12, 0x00effa76, 0x0156b58b, 0x02afa412, 0x005747c1, 0x00e4f3fe, 0x027d50d2, 0x0169e231, 0x002e1908}}}, + {X: Field{[10]uint32{0x02dc4d83, 0x01017cdd, 0x02e2af13, 0x0179df8c, 0x00431078, 0x028ae6b1, 0x001854e3, 0x013b4a0d, 0x007b91a6, 0x000df582}}, Y: Field{[10]uint32{0x01f25003, 0x02e65c4f, 0x01b1f9bd, 0x0024b094, 0x01a3ac9f, 0x00b9bf37, 0x023092f3, 0x02f32ea0, 0x0117e068, 0x000d688e}}}, + {X: Field{[10]uint32{0x00f4fab2, 0x0372e484, 0x00fd8391, 0x033a0a53, 0x03e000d2, 0x033e12d3, 0x003691cb, 0x006f81ad, 0x016dc79f, 0x0035d22a}}, Y: Field{[10]uint32{0x005bf51c, 0x031369bc, 0x036c8223, 0x009eabed, 0x00975c09, 0x02e05c8a, 0x017e5c04, 0x0240bb39, 0x01e065da, 0x001d6d2b}}}, + {X: Field{[10]uint32{0x002cc30c, 0x00cf41b9, 0x03a8fa02, 0x013b0957, 0x03949241, 0x00edbee5, 0x02361ea3, 0x0213fc98, 0x0225eb50, 0x0034174a}}, Y: Field{[10]uint32{0x01a6f2d2, 0x03ead81a, 0x00f4e75e, 0x02616ea6, 0x01ba57a1, 0x022a80f6, 0x03514290, 0x0323ce16, 0x02eececd, 0x00052eef}}}, + {X: Field{[10]uint32{0x003ff793, 0x022765d2, 0x0030278c, 0x03d7a2a3, 0x00b4684b, 0x0193b2a7, 0x03f39067, 0x03b6f96b, 0x015bd137, 0x001a6ea6}}, Y: Field{[10]uint32{0x03b63e32, 0x03864d96, 0x000b246d, 0x01b1c056, 0x01a79ad9, 0x007176e5, 0x033e8649, 0x01965a60, 0x0051b622, 0x000ac73d}}}, + {X: Field{[10]uint32{0x00419461, 0x00bfdc55, 0x0197d9a8, 0x03cbc7b2, 0x033a50af, 0x01418412, 0x020342ff, 0x033ca3f7, 0x01a15d0e, 0x001fc07a}}, Y: Field{[10]uint32{0x0112dc68, 0x037310eb, 0x030e5e03, 0x0196a0d1, 0x03d27040, 0x03b72ad8, 0x01e25d1f, 0x034dd4d8, 0x0194a6b8, 0x00070f25}}}, + {X: Field{[10]uint32{0x02e48cc6, 0x02902795, 0x0219d813, 0x000fc3e1, 0x00f2413d, 0x00613933, 0x0201bc47, 0x024107f4, 0x02fd193b, 0x001c648c}}, Y: Field{[10]uint32{0x0229a953, 0x00674f2b, 0x02d1e68b, 0x028197e0, 0x0312fb55, 0x03ab816a, 0x037ff609, 0x02c14d4c, 0x03187dcc, 0x000587f1}}}, + {X: Field{[10]uint32{0x02e78c27, 0x00f7219d, 0x03d082f5, 0x03e91b22, 0x039a63bc, 0x01ef4a2f, 0x006009a5, 0x01cc40ce, 0x0120155f, 0x00056e10}}, Y: Field{[10]uint32{0x01737816, 0x00b140cc, 0x03605140, 0x0283aa7e, 0x03188171, 0x0102b293, 0x0004e0c8, 0x01f8bfa6, 0x037ec901, 0x0011f758}}}, + {X: Field{[10]uint32{0x03fec567, 0x01301d2e, 0x01a2c007, 0x0389d053, 0x0004a95c, 0x02e9a645, 0x0352ed4e, 0x00011df6, 0x0197bd38, 0x003fd0a7}}, Y: Field{[10]uint32{0x017b3048, 0x016a8075, 0x00f2569a, 0x002b2f2e, 0x036708c0, 0x037ddf00, 0x0173f624, 0x016eacd2, 0x03bd6e63, 0x001ece9b}}}, + {X: Field{[10]uint32{0x010a6ee3, 0x02c79575, 0x01ed8858, 0x0012c984, 0x01379174, 0x00b1dfa0, 0x01f476d1, 0x039d333c, 0x005b016b, 0x0003335c}}, Y: Field{[10]uint32{0x00e87c01, 0x02bff0d0, 0x01f1f737, 0x0130c6b6, 0x020946cb, 0x025fde35, 0x0155e178, 0x02c94937, 0x01e75cc7, 0x0021d06b}}}, + {X: Field{[10]uint32{0x03b65b27, 0x030df542, 0x01534d54, 0x001a3526, 0x0294e4b4, 0x00c03b2a, 0x0278e818, 0x0315fe45, 0x025e24b3, 0x00196d86}}, Y: Field{[10]uint32{0x01ed0c40, 0x005a9d9d, 0x024fd79c, 0x031e9719, 0x02f65ac4, 0x02b82147, 0x0386fda2, 0x01ee0bc6, 0x0228aab9, 0x002435d7}}}, + {X: Field{[10]uint32{0x03a06ef0, 0x005067de, 0x00cf173c, 0x021f068e, 0x014ffe04, 0x0163ee39, 0x0382bdd7, 0x01cf650f, 0x01df8f40, 0x0019c54a}}, Y: Field{[10]uint32{0x00fede59, 0x01533f45, 0x029504d8, 0x01071c1d, 0x00454fd1, 0x03547af9, 0x01121e10, 0x00d26b74, 0x032d1f23, 0x00311b67}}}, + {X: Field{[10]uint32{0x001b0440, 0x008f3fe4, 0x035b68e8, 0x0375319c, 0x0073da3f, 0x002ef4b0, 0x02f8e703, 0x005a5c1e, 0x02760e7a, 0x0000abe2}}, Y: Field{[10]uint32{0x02c3c1cb, 0x03f40989, 0x0143f72f, 0x02b7597d, 0x017c34f5, 0x007b8cf3, 0x01659769, 0x01c54f1c, 0x03e79ada, 0x00155596}}}, + {X: Field{[10]uint32{0x03575707, 0x0251ca9b, 0x01fc42fb, 0x03543bd6, 0x024def3f, 0x01f31cc2, 0x00b3b1fb, 0x02ee1d3f, 0x016fc5ff, 0x002b3607}}, Y: Field{[10]uint32{0x01d181a3, 0x00a59180, 0x011cce09, 0x03258fa1, 0x02b87c0e, 0x001c6da5, 0x02f47eb5, 0x03aa7847, 0x028ec8b8, 0x00238c66}}}, + {X: Field{[10]uint32{0x00ffb912, 0x033a36e0, 0x0041bd60, 0x02a66e45, 0x02ae062c, 0x0182a9fc, 0x012d0bb3, 0x03a2f081, 0x03d53ab9, 0x002addf9}}, Y: Field{[10]uint32{0x01f96b5a, 0x0131d48b, 0x02d8fdfa, 0x0262d75b, 0x02aca909, 0x0075c104, 0x03992e5e, 0x02e56e7a, 0x02d9cb0a, 0x0017e4ad}}}, + {X: Field{[10]uint32{0x00124046, 0x0222acde, 0x03265e01, 0x03cded98, 0x031d7efa, 0x001a88c0, 0x03eda09b, 0x0231fbe2, 0x01951a6a, 0x001e62e0}}, Y: Field{[10]uint32{0x002b1bf6, 0x03e75138, 0x01de7a1b, 0x02d7c460, 0x03d91382, 0x0399d1db, 0x004a7e54, 0x0290c0d9, 0x021b0bae, 0x002564b6}}}, + {X: Field{[10]uint32{0x0377b096, 0x0354a2e5, 0x02f29ed6, 0x00e893fd, 0x009dbff9, 0x0222bad3, 0x01dea224, 0x039df637, 0x02ae0c3b, 0x003c921a}}, Y: Field{[10]uint32{0x0029126b, 0x0096aa12, 0x028cc413, 0x018a360e, 0x03d8409b, 0x00dabec2, 0x010327fe, 0x03211df1, 0x0150fe75, 0x00238acb}}}, + {X: Field{[10]uint32{0x006d2d54, 0x025d2205, 0x00333f93, 0x0220993d, 0x02d16ca0, 0x02bbbb9c, 0x0364ee33, 0x03aa2f83, 0x01093b8a, 0x00088b8f}}, Y: Field{[10]uint32{0x02cdcaa9, 0x02d4e772, 0x018a4351, 0x01e332c2, 0x0137ba1f, 0x0283af5e, 0x02dd16e8, 0x02ef1070, 0x000fbfe6, 0x0003bfd4}}}, + {X: Field{[10]uint32{0x0121c1c9, 0x02df4130, 0x01bd0165, 0x007670c8, 0x024f9924, 0x02d4f800, 0x01a18eea, 0x00d1d891, 0x03fe7ca9, 0x0019da34}}, Y: Field{[10]uint32{0x00272877, 0x02bba2e4, 0x00a43823, 0x0094340c, 0x000c4dc8, 0x027871de, 0x019ff1d0, 0x025c888c, 0x0173c9b9, 0x00100b27}}}, + {X: Field{[10]uint32{0x022dda79, 0x01fc263c, 0x00ef2513, 0x02133e32, 0x01b0b628, 0x03f5e057, 0x0325697b, 0x022033bf, 0x000fb2f0, 0x001bad9d}}, Y: Field{[10]uint32{0x0085c86f, 0x027c0fc5, 0x01b68520, 0x02579163, 0x0079c4b6, 0x03d0b9ab, 0x002061c1, 0x015c4f0c, 0x0131c12f, 0x0033dfa1}}}, + {X: Field{[10]uint32{0x025fe51b, 0x0001aaa5, 0x01ac2950, 0x0165c5ca, 0x025ede89, 0x019eda9f, 0x00f385f3, 0x0169faa8, 0x03484eb0, 0x001c407c}}, Y: Field{[10]uint32{0x00d5c3f3, 0x013e24c4, 0x0144be26, 0x01687912, 0x00260559, 0x01c6bf0b, 0x00fff9fc, 0x03edd5de, 0x0113a040, 0x002347ee}}}, + {X: Field{[10]uint32{0x02886579, 0x0239b4c3, 0x0287a11c, 0x03ab3bee, 0x02a0de03, 0x0080c0d8, 0x024b25f1, 0x028978ff, 0x005cacc6, 0x001d6a79}}, Y: Field{[10]uint32{0x03f69c6e, 0x01f00af3, 0x03f7adbe, 0x03e555a0, 0x02854c49, 0x00007f60, 0x0202cf31, 0x021b649a, 0x0195e919, 0x0014aa16}}}, + {X: Field{[10]uint32{0x0337dcbc, 0x0359cc0d, 0x001b2954, 0x03de0c2b, 0x02ceac14, 0x01fe66b7, 0x03ffc542, 0x0195ca62, 0x0192bad7, 0x000c4653}}, Y: Field{[10]uint32{0x03dd2832, 0x007fcfd7, 0x02f19a2d, 0x02f36b0b, 0x028c556e, 0x00f316f1, 0x02449fa3, 0x023bba74, 0x0045f531, 0x00267a07}}}, + {X: Field{[10]uint32{0x03d505af, 0x02562b02, 0x0123c522, 0x030e115f, 0x03c1d743, 0x002d3338, 0x02c61387, 0x01bd0e1a, 0x03fe76fd, 0x002413e8}}, Y: Field{[10]uint32{0x03c1763b, 0x02ab9069, 0x023045c8, 0x03ece55e, 0x018dae9b, 0x0131c165, 0x02929e45, 0x0118cde7, 0x02621adf, 0x002509cc}}}, + {X: Field{[10]uint32{0x00a8e0fd, 0x02a4ffe9, 0x01f26b5f, 0x0109e29f, 0x03040de1, 0x00fe8996, 0x019aedef, 0x022cc8da, 0x01f31a82, 0x00074618}}, Y: Field{[10]uint32{0x0099f7dc, 0x017d1376, 0x01f61199, 0x03098e99, 0x013ffc30, 0x0212ee59, 0x01306e3b, 0x03faca38, 0x0381f13f, 0x002e595d}}}, + {X: Field{[10]uint32{0x0019ad64, 0x0395179a, 0x0009b73c, 0x008a110f, 0x02aac959, 0x02159773, 0x02f0289e, 0x02975797, 0x01ef6de1, 0x000ef4cf}}, Y: Field{[10]uint32{0x00f9c810, 0x00d7b575, 0x001c2975, 0x0077d491, 0x038bc985, 0x029c3a6f, 0x00366279, 0x002f525d, 0x0109eb56, 0x00264fc0}}}, + {X: Field{[10]uint32{0x00958634, 0x031fdb16, 0x0261c7be, 0x03adc543, 0x03e4c257, 0x039681f1, 0x0327b248, 0x02bb4a9f, 0x01452a39, 0x003286df}}, Y: Field{[10]uint32{0x004afcff, 0x03eb368f, 0x032c7298, 0x03dd10ab, 0x010179c0, 0x027ed520, 0x01a98043, 0x01f0dedf, 0x021bc035, 0x002ac47f}}}, + {X: Field{[10]uint32{0x0271aa58, 0x0355f461, 0x00f61da6, 0x01f57e4a, 0x00df145f, 0x0339f66b, 0x03f29a36, 0x00e1ad4f, 0x01cadee8, 0x0009cea5}}, Y: Field{[10]uint32{0x025bbe2b, 0x0053e546, 0x03ac2adb, 0x0071cf14, 0x00315a03, 0x010194a1, 0x02c6d832, 0x014df469, 0x019dbb06, 0x0022298d}}}, + {X: Field{[10]uint32{0x005561e6, 0x02443e6b, 0x02279d0f, 0x03d4a511, 0x01c06923, 0x00e48700, 0x03ad79cd, 0x02eeb154, 0x00fca139, 0x001fa930}}, Y: Field{[10]uint32{0x016dec96, 0x03e82eca, 0x0193a54d, 0x00ddc6bb, 0x002eb71c, 0x018e7c66, 0x01e79822, 0x00c38bcc, 0x01470458, 0x002f4127}}}, + {X: Field{[10]uint32{0x0207d336, 0x012581e5, 0x02ce80bc, 0x01a3f344, 0x00d3823f, 0x017331a1, 0x03932401, 0x02af9751, 0x001c0a2b, 0x001c7c60}}, Y: Field{[10]uint32{0x03f1b4b1, 0x039b76c7, 0x00a6cf5a, 0x00390e77, 0x0214430c, 0x03a3f9e9, 0x01b7de37, 0x01395082, 0x03d00838, 0x00107b41}}}, + {X: Field{[10]uint32{0x01cd8828, 0x00160b48, 0x00f2a1c9, 0x036589e7, 0x017000ff, 0x0155068f, 0x00aec515, 0x0287baba, 0x0073652b, 0x002ca0e2}}, Y: Field{[10]uint32{0x027dce5e, 0x02d20474, 0x0079d2a0, 0x03ca87bf, 0x01ee4d19, 0x01abf30c, 0x01faf658, 0x038e9491, 0x015573f5, 0x00011ffc}}}, + {X: Field{[10]uint32{0x015a3e21, 0x036263ad, 0x02cb5b68, 0x0129afc2, 0x03d9f816, 0x00224892, 0x033fbdcc, 0x012f05a1, 0x01a72263, 0x000d32a3}}, Y: Field{[10]uint32{0x01c5d986, 0x02440339, 0x01f4b73f, 0x0241464b, 0x031f041a, 0x02168ffd, 0x0369055d, 0x0324701d, 0x036036a9, 0x00362bed}}}, + {X: Field{[10]uint32{0x0319cc8f, 0x01c8cdd2, 0x0115aa0e, 0x021e270e, 0x034b76eb, 0x03db5e5a, 0x00cf5b2e, 0x0106bf28, 0x0397d973, 0x00084b2c}}, Y: Field{[10]uint32{0x02f170a1, 0x030d7590, 0x01e64875, 0x01ccbde3, 0x01ff17e2, 0x0049b143, 0x0285f501, 0x03c1be5d, 0x00ec5f29, 0x003c1b8b}}}, + {X: Field{[10]uint32{0x00a6228a, 0x0202471b, 0x002e9ffa, 0x00bf392d, 0x01d5f29d, 0x01e24fda, 0x0182dfde, 0x004f70c9, 0x03f643bd, 0x002f00d9}}, Y: Field{[10]uint32{0x00556e78, 0x03fd0a5d, 0x0373f527, 0x01e5ee5b, 0x02c17641, 0x02d66b0c, 0x03f3e44a, 0x007c192b, 0x0089d125, 0x0026fb1b}}}, + {X: Field{[10]uint32{0x01bd5672, 0x00403c6a, 0x029d8dec, 0x00cf37ad, 0x025e489e, 0x03466392, 0x03169bb4, 0x0222516a, 0x00235d8e, 0x0023f2c5}}, Y: Field{[10]uint32{0x03fc057c, 0x036de439, 0x01f5fe52, 0x00816c74, 0x03c45ae3, 0x01102109, 0x0302a46b, 0x0242c980, 0x0396bab3, 0x003e872c}}}, + {X: Field{[10]uint32{0x011e64ae, 0x0170beb9, 0x010440e1, 0x02133289, 0x00d4917e, 0x0077d83d, 0x0043e801, 0x03b0832f, 0x01056675, 0x001c2b61}}, Y: Field{[10]uint32{0x015a800d, 0x013e9847, 0x004e8c00, 0x03832fbd, 0x02b63d68, 0x03d6dc4e, 0x0262475d, 0x029f2697, 0x0356af9f, 0x003d2944}}}, + {X: Field{[10]uint32{0x01695842, 0x0387db2e, 0x028803ed, 0x036611be, 0x02bcf6e6, 0x025c6301, 0x026df81f, 0x0105a21b, 0x03474807, 0x002b69eb}}, Y: Field{[10]uint32{0x008a582f, 0x02ddb6e6, 0x001dd575, 0x02440031, 0x0298369c, 0x01dc7654, 0x0348bbe0, 0x009f5371, 0x011f50f4, 0x0003d9b5}}}, + {X: Field{[10]uint32{0x0102eeee, 0x011762c4, 0x0052c7f0, 0x01ee949f, 0x01bf1e97, 0x034d3e3a, 0x038108f9, 0x03aec46e, 0x018d7323, 0x003c6e1f}}, Y: Field{[10]uint32{0x00346556, 0x037dda2d, 0x000b79bd, 0x039c1f8e, 0x037e2aa0, 0x01edd56c, 0x01e58424, 0x039e827b, 0x030351eb, 0x0002f655}}}, + {X: Field{[10]uint32{0x012a0553, 0x0244d592, 0x00833cc5, 0x0145d9b3, 0x031fbf7c, 0x03fb5ee0, 0x000c301c, 0x0193ab24, 0x015ad552, 0x0024d967}}, Y: Field{[10]uint32{0x00154beb, 0x01b78170, 0x0089ccf4, 0x0176215b, 0x03519ff6, 0x030740a8, 0x02137df1, 0x000596be, 0x01e9646d, 0x002da4e2}}}, + {X: Field{[10]uint32{0x02d4ffe2, 0x00e3df63, 0x01f48b17, 0x039745e0, 0x00409a62, 0x0056fbbb, 0x002f54a4, 0x013ff712, 0x00492a9b, 0x003a74af}}, Y: Field{[10]uint32{0x00305df5, 0x00c10211, 0x00631608, 0x0020d854, 0x038d6392, 0x013c94e0, 0x01de313f, 0x02fe0037, 0x02522dcc, 0x00224f91}}}, + {X: Field{[10]uint32{0x006cb210, 0x038abde4, 0x00744229, 0x0306a1d8, 0x01825e0b, 0x01cb69a9, 0x0103eea3, 0x02b64460, 0x020a7bf1, 0x00050905}}, Y: Field{[10]uint32{0x0196af23, 0x03be284e, 0x0343f209, 0x03a47d8d, 0x024f1519, 0x002c8fa5, 0x02f1d0e1, 0x0175c479, 0x022696a7, 0x00325368}}}, + {X: Field{[10]uint32{0x009efd87, 0x0233ba27, 0x02300c45, 0x01639bc9, 0x018686d0, 0x02d7e9fa, 0x03e434ae, 0x012f52aa, 0x0312402e, 0x001fe409}}, Y: Field{[10]uint32{0x02f95fb5, 0x00622b18, 0x01602669, 0x02305498, 0x031b8b01, 0x022111a9, 0x02cdcddc, 0x02d062c5, 0x020b2aef, 0x002f0011}}}, + {X: Field{[10]uint32{0x0372745c, 0x03187d5b, 0x03c01255, 0x01a8e051, 0x022a133f, 0x02370a4d, 0x02e5f16c, 0x003d4fa1, 0x027c66cb, 0x0034c9f3}}, Y: Field{[10]uint32{0x02bea436, 0x01d628e1, 0x015f8353, 0x035071be, 0x02618cc6, 0x02314b72, 0x0108b85b, 0x00e7041a, 0x018ac3cb, 0x00137052}}}, + {X: Field{[10]uint32{0x032db3b3, 0x00e5ab78, 0x03d1a0d5, 0x033951ef, 0x01137dff, 0x022eff0c, 0x013803be, 0x00441800, 0x0319c9d8, 0x003c113a}}, Y: Field{[10]uint32{0x02526f2a, 0x00ae77df, 0x03af7c10, 0x037bff33, 0x028128a8, 0x02ca0b3f, 0x00551cea, 0x00f999fe, 0x028d9c4c, 0x0016b510}}}, + {X: Field{[10]uint32{0x0218daf4, 0x03172f03, 0x03d55f67, 0x02dfcf00, 0x03d135bb, 0x03755100, 0x006a81eb, 0x0066fabd, 0x0237b95d, 0x001e9b14}}, Y: Field{[10]uint32{0x0204385b, 0x038a48a8, 0x001d70cc, 0x019a29c3, 0x01bd492c, 0x03fda3fb, 0x00fc6e74, 0x03ad7121, 0x00b847fc, 0x0018a8ba}}}, + {X: Field{[10]uint32{0x019f82f0, 0x0256f06d, 0x01bb5804, 0x026d1d62, 0x02ffae94, 0x01708211, 0x0372afaf, 0x0302deed, 0x00dcb069, 0x001671ff}}, Y: Field{[10]uint32{0x026c38ad, 0x023bae84, 0x006ec335, 0x014bc935, 0x02c09b36, 0x03238b1e, 0x03a4d79a, 0x0159adc6, 0x008c6657, 0x0020bb16}}}, + {X: Field{[10]uint32{0x036543d7, 0x0006f51a, 0x03ae00ea, 0x036f37c9, 0x0081d99f, 0x02ee1795, 0x00d3dc6d, 0x01563310, 0x00211ed4, 0x003e33cf}}, Y: Field{[10]uint32{0x03a9778b, 0x037a7721, 0x03b20054, 0x030f82a2, 0x035506a5, 0x03338c10, 0x011f5dbd, 0x03d8c225, 0x01d01c3d, 0x002f6012}}}, + {X: Field{[10]uint32{0x024504bc, 0x00b39c54, 0x03764278, 0x00ff3f44, 0x024d2dd2, 0x00eb2a0a, 0x03471893, 0x02753c7f, 0x0364b238, 0x000e1575}}, Y: Field{[10]uint32{0x019ef72d, 0x01b02f1d, 0x01f95944, 0x03bb7c4f, 0x03b14a71, 0x02ab8ea8, 0x024ec346, 0x02af409c, 0x02254af2, 0x0020b13a}}}, + {X: Field{[10]uint32{0x02de5431, 0x03774694, 0x02ffa48c, 0x01b6bdf9, 0x036d3e0e, 0x01554f6a, 0x00b1d733, 0x03c3634c, 0x03311de4, 0x001dd912}}, Y: Field{[10]uint32{0x005916b4, 0x03d4853d, 0x029b4cdb, 0x00c1a560, 0x017581c9, 0x00aedd0c, 0x03730f99, 0x001cd5cd, 0x03ce0c0a, 0x00191785}}}, + {X: Field{[10]uint32{0x01ca138d, 0x00c198f6, 0x01d34565, 0x033dd996, 0x0156bfc0, 0x0194deaf, 0x02511daa, 0x02bef2ca, 0x0343afd6, 0x0029352b}}, Y: Field{[10]uint32{0x03bb09dd, 0x028afadc, 0x03747a25, 0x017cf57f, 0x0088b5db, 0x0358f7cd, 0x007f0737, 0x03cc6ee4, 0x03d0dd2d, 0x002f9b27}}}, + {X: Field{[10]uint32{0x00a75be5, 0x03f0181d, 0x011aaaa8, 0x032bed9b, 0x012da352, 0x03992f18, 0x02c3d645, 0x028207dc, 0x023fe673, 0x00105ffe}}, Y: Field{[10]uint32{0x00c50151, 0x0024f81a, 0x00be10de, 0x0129fdce, 0x02cfd9ca, 0x0169d243, 0x01472afd, 0x0251d202, 0x022f9084, 0x0026ae2f}}}, + {X: Field{[10]uint32{0x02ef73cd, 0x03ba0e32, 0x00622f75, 0x001257a2, 0x004f19eb, 0x01d084b1, 0x03d772cc, 0x014105b2, 0x01549311, 0x001e05d4}}, Y: Field{[10]uint32{0x00d0d3e6, 0x02fdff4d, 0x00ac2dd7, 0x02c29765, 0x02fdaf2c, 0x01f2c637, 0x0381b91d, 0x00d94098, 0x01c8ffec, 0x000df535}}}, + {X: Field{[10]uint32{0x031b5121, 0x0094fe82, 0x02f0f736, 0x02923d8b, 0x023c2ee7, 0x039d9896, 0x020c66c7, 0x00a3abd5, 0x020c3acc, 0x000d9715}}, Y: Field{[10]uint32{0x0374868f, 0x01f4df16, 0x018d6451, 0x005773b1, 0x016990aa, 0x00e3e374, 0x0303f883, 0x03c578e2, 0x02fa96c0, 0x000972f1}}}, + {X: Field{[10]uint32{0x035bac7c, 0x03e860a3, 0x03808a94, 0x03f76233, 0x016c6757, 0x02866a49, 0x026b6cb3, 0x0008fa44, 0x01251010, 0x0032516b}}, Y: Field{[10]uint32{0x0254e2bb, 0x037e4ab5, 0x01e5b174, 0x02ec99e7, 0x0399df4a, 0x0319bdb6, 0x008ae3df, 0x010ef3bc, 0x010cb4ac, 0x00326a3a}}}, + {X: Field{[10]uint32{0x002e0213, 0x0303878b, 0x03eec629, 0x02dedf4e, 0x02ac8c3f, 0x00ca18f7, 0x00223876, 0x0355f5ce, 0x01ac45e6, 0x0012ab61}}, Y: Field{[10]uint32{0x016a2708, 0x002d8f3f, 0x02595213, 0x0224ddbd, 0x0129c036, 0x0394e81c, 0x001c192d, 0x02fd9259, 0x00e19e81, 0x000e3bba}}}, + {X: Field{[10]uint32{0x02a291df, 0x027da689, 0x0367f24b, 0x03a9f4d4, 0x01907e37, 0x03d89118, 0x00f9f663, 0x01965ab7, 0x02480b0f, 0x000af040}}, Y: Field{[10]uint32{0x00311c79, 0x01509bc1, 0x02b2f4f3, 0x00c14204, 0x0324ad0c, 0x0242ddd0, 0x02780f6b, 0x02cdea46, 0x02d33016, 0x00382b0f}}}, + {X: Field{[10]uint32{0x03ddfde2, 0x007234e4, 0x03cffeb9, 0x000207f3, 0x02eca894, 0x0281387e, 0x001a2c09, 0x023e4c3a, 0x0191abd2, 0x00337016}}, Y: Field{[10]uint32{0x000193a5, 0x02686dd6, 0x02b32afc, 0x013af1e6, 0x038bf90a, 0x006a208b, 0x02b9852d, 0x038ac0ff, 0x02c44458, 0x0037f692}}}, + {X: Field{[10]uint32{0x0346a047, 0x00efe776, 0x02b7d079, 0x02ba722f, 0x0031d285, 0x03e2aac4, 0x00ea8570, 0x0310a7fd, 0x03f0af2d, 0x0016893b}}, Y: Field{[10]uint32{0x004c8f9a, 0x02d80167, 0x03327b53, 0x0185abbd, 0x00a98b6f, 0x02debc2e, 0x03f40dd0, 0x02458225, 0x01145973, 0x0005e76e}}}, + {X: Field{[10]uint32{0x0038183a, 0x03f8ab1e, 0x01467636, 0x02c2c151, 0x03e7c1d2, 0x01f457f6, 0x00aae6b5, 0x00f2a4dd, 0x013f5160, 0x0005b079}}, Y: Field{[10]uint32{0x03a183e3, 0x01a25d98, 0x0194ba53, 0x006815c1, 0x008d1f6c, 0x0383f724, 0x00af50c7, 0x026efd76, 0x02f056e0, 0x002fe163}}}, + {X: Field{[10]uint32{0x0301ccf4, 0x0299567a, 0x006eb0c3, 0x016c71a1, 0x01a2f240, 0x0305de00, 0x013a116a, 0x00be6b62, 0x02ea71b9, 0x001e4bc7}}, Y: Field{[10]uint32{0x0032a79d, 0x0342de8a, 0x001293cc, 0x002ef878, 0x0052c0df, 0x01e19ae7, 0x01ecf87a, 0x03bce4c4, 0x030cc610, 0x002f018b}}}, + {X: Field{[10]uint32{0x017378e1, 0x02e99769, 0x00dd7335, 0x02b3c201, 0x03917dab, 0x0044dff8, 0x004dc515, 0x01c673d5, 0x0040f057, 0x0006ce67}}, Y: Field{[10]uint32{0x000b425f, 0x029dd718, 0x02f6d380, 0x004aaa11, 0x02bfdd07, 0x0374cce8, 0x01e872c1, 0x02821507, 0x00d3b6e8, 0x001359e5}}}, + {X: Field{[10]uint32{0x02238e4f, 0x002ffeae, 0x02edec21, 0x01e2af85, 0x039f8cd2, 0x02223147, 0x00d8219b, 0x0173b783, 0x013eb9c4, 0x0004e2cc}}, Y: Field{[10]uint32{0x02ac56d6, 0x021c8f39, 0x03f7fd9e, 0x01b735b6, 0x0213f0f7, 0x03c2b349, 0x02d49512, 0x0010bd2d, 0x0357cbc8, 0x00286668}}}, + {X: Field{[10]uint32{0x03542338, 0x03f0937a, 0x0312284f, 0x00445f24, 0x008f4018, 0x03d2b869, 0x0068b24c, 0x01599340, 0x03119c76, 0x000f81b0}}, Y: Field{[10]uint32{0x0273624f, 0x039d55c1, 0x03696498, 0x02cca01e, 0x0293b08a, 0x026a4341, 0x01c45963, 0x01fc6daa, 0x0196e560, 0x0018e995}}}, + {X: Field{[10]uint32{0x03f8bd2e, 0x037a2d2e, 0x0125f8a3, 0x037bb47b, 0x0280f0f6, 0x005e7a77, 0x00e5455c, 0x0224c95d, 0x039b49c8, 0x0000fccb}}, Y: Field{[10]uint32{0x02589f17, 0x007e9ada, 0x02472855, 0x033b8ae1, 0x00091f49, 0x03d0aa77, 0x0090257b, 0x01be27bd, 0x031a5fc9, 0x0028b4ae}}}, + {X: Field{[10]uint32{0x02414ec5, 0x01dca651, 0x02b041fe, 0x03ef8ce0, 0x022c4f5e, 0x016c6e0a, 0x029602bf, 0x03143e84, 0x0017ffcc, 0x00226b71}}, Y: Field{[10]uint32{0x00253215, 0x01fbd523, 0x00bc8e2c, 0x00a0976a, 0x036c3daa, 0x02a9867b, 0x015c2915, 0x01d47405, 0x035c291b, 0x001339f9}}}, + {X: Field{[10]uint32{0x00e4e9b5, 0x03faab97, 0x01619a13, 0x03e81f07, 0x01e9f208, 0x00bd53d9, 0x017d4860, 0x02327d96, 0x01626bec, 0x003ccfef}}, Y: Field{[10]uint32{0x01593774, 0x00ad0914, 0x0025edf0, 0x022ddc9a, 0x02a6f43c, 0x00142c0c, 0x03e2eda3, 0x03c54a1f, 0x002bebb9, 0x00323c18}}}, + {X: Field{[10]uint32{0x00a7d6b8, 0x038f9929, 0x0071d568, 0x013d1448, 0x02117fa0, 0x003a5d01, 0x01f7703a, 0x038bdf91, 0x00ab7b90, 0x0003b332}}, Y: Field{[10]uint32{0x00a1b6f4, 0x005a6696, 0x0056048e, 0x01143c7f, 0x03fcc8a6, 0x0322ecd9, 0x033c2333, 0x028363cb, 0x0305a9c4, 0x002115bd}}}, + {X: Field{[10]uint32{0x017de915, 0x00fa5685, 0x03dfca4e, 0x035537c7, 0x000e6e31, 0x009d0fb4, 0x0181c754, 0x0218b960, 0x0333a7ad, 0x003da58a}}, Y: Field{[10]uint32{0x029e6605, 0x038c80ba, 0x01cf209e, 0x016a0cd6, 0x02055c15, 0x0280566a, 0x037e8ad2, 0x0173afe7, 0x03fb4851, 0x002bcf51}}}, + {X: Field{[10]uint32{0x02ace24d, 0x02748d36, 0x019e842b, 0x03c8e3fd, 0x025c45d2, 0x0025649a, 0x02d5df02, 0x03ec4197, 0x03c67996, 0x0000fc7c}}, Y: Field{[10]uint32{0x010ea28e, 0x012f529b, 0x0011f110, 0x00195a42, 0x03737507, 0x0088a36a, 0x023c30b2, 0x027c28a3, 0x01e4f0a2, 0x00356172}}}, + {X: Field{[10]uint32{0x026e589c, 0x0375145b, 0x030e34ae, 0x00b50206, 0x02dc3359, 0x02b4b357, 0x03f93c16, 0x00390f62, 0x00193629, 0x0003f2b8}}, Y: Field{[10]uint32{0x031165cc, 0x001ee851, 0x02c243a2, 0x0162e5c0, 0x02c8acb9, 0x03342665, 0x00710d88, 0x029110b7, 0x039ecc42, 0x0023a615}}}, + {X: Field{[10]uint32{0x011f522c, 0x015c2ac5, 0x012c6d89, 0x01f6ea8c, 0x01abc424, 0x03f23beb, 0x037922b5, 0x008a748e, 0x03ba0355, 0x001523c9}}, Y: Field{[10]uint32{0x02ab6fa9, 0x01fc6e21, 0x0200acb7, 0x018ce6e5, 0x02b7b63c, 0x03cdf207, 0x00ba774f, 0x01f35f23, 0x03d8bbb4, 0x00039565}}}, + {X: Field{[10]uint32{0x00146fa0, 0x00e6ef57, 0x003ab6e4, 0x02e18460, 0x0249797d, 0x0021adef, 0x025cf1ef, 0x00d1fb51, 0x0114e8bf, 0x0038bd92}}, Y: Field{[10]uint32{0x006ae76e, 0x035d18ff, 0x025d1d2e, 0x0251cb55, 0x0388b27a, 0x01debbe6, 0x02482570, 0x00793c54, 0x036f7c64, 0x00239a79}}}, + {X: Field{[10]uint32{0x0013db1d, 0x02faae8b, 0x011222cd, 0x0323ce33, 0x01c7d362, 0x00a62d03, 0x00f97622, 0x00303c76, 0x02a02d97, 0x0002314c}}, Y: Field{[10]uint32{0x0062bd0e, 0x01bfea1c, 0x0276801b, 0x02d8b7b0, 0x03568251, 0x032dd81b, 0x00ffc9fb, 0x0359b67a, 0x02e90428, 0x00243e28}}}, + {X: Field{[10]uint32{0x02291a23, 0x008c8618, 0x02f6d3c3, 0x025ebd59, 0x006fc0ed, 0x0014abb1, 0x02f7e0c8, 0x0065cbda, 0x02fee3c5, 0x0019191b}}, Y: Field{[10]uint32{0x007a69fe, 0x023d3dca, 0x03c50d6c, 0x022a61bf, 0x03a10eb8, 0x01c7cb76, 0x0276ee71, 0x00dc2cda, 0x0150f6ca, 0x00278a78}}}, + {X: Field{[10]uint32{0x033be659, 0x00787cd1, 0x011b51eb, 0x02fe699f, 0x01329199, 0x01bbd972, 0x03ff69a0, 0x037fdc32, 0x00da1df8, 0x001ba2e9}}, Y: Field{[10]uint32{0x015d852a, 0x01d19e60, 0x00a060f6, 0x0289f851, 0x03eb5a34, 0x0394def5, 0x03f21883, 0x01069cd7, 0x02c89594, 0x002b9d58}}}, + {X: Field{[10]uint32{0x036bcaef, 0x0307ccca, 0x029cae76, 0x007356e3, 0x02c94c87, 0x02b6fc7d, 0x020d7e1c, 0x00b03db7, 0x03c8f781, 0x0023086a}}, Y: Field{[10]uint32{0x007ed53e, 0x02832a5d, 0x006b2663, 0x03f9a3fd, 0x015a36d6, 0x03833bfa, 0x010ed037, 0x000f8950, 0x00c313be, 0x00169f27}}}, + {X: Field{[10]uint32{0x039f6353, 0x01ac9a4b, 0x01fea342, 0x00087ae2, 0x0010ce51, 0x015e8a3c, 0x0236ff76, 0x01f85099, 0x003a7c48, 0x0033838e}}, Y: Field{[10]uint32{0x0232e03a, 0x03030358, 0x02280532, 0x03dbf6b3, 0x0097fcb9, 0x031cf23b, 0x004e9da4, 0x01e010a0, 0x0065d43f, 0x000fe569}}}, + {X: Field{[10]uint32{0x01698eb8, 0x028dfb87, 0x03700080, 0x031f0072, 0x028078b6, 0x0119cff0, 0x00598483, 0x01f13fd1, 0x017f5147, 0x001f8cc2}}, Y: Field{[10]uint32{0x022d75a7, 0x03072972, 0x025ad141, 0x039a5c01, 0x02e282b7, 0x01241968, 0x001d274e, 0x0319e762, 0x03c07317, 0x003049d6}}}, + {X: Field{[10]uint32{0x016837a6, 0x01ec3904, 0x03867931, 0x019b3ecf, 0x01d686eb, 0x03bfc9cc, 0x031cf429, 0x01f987ec, 0x00d6b148, 0x003bd367}}, Y: Field{[10]uint32{0x0163be1f, 0x022dda8f, 0x012ecd11, 0x0161ffd8, 0x023bd2ff, 0x03a87ae8, 0x036461a6, 0x03756893, 0x02b4280d, 0x00313daf}}}, + {X: Field{[10]uint32{0x03716290, 0x015cecbc, 0x014b992c, 0x028b7c32, 0x03ce53f4, 0x0297e2e8, 0x0090bcb9, 0x024c93de, 0x01452ee4, 0x003cfb70}}, Y: Field{[10]uint32{0x03fb2f2d, 0x02a60834, 0x00dbf552, 0x01952470, 0x035c3905, 0x01f0aba4, 0x03301f08, 0x02c9ea36, 0x02abfbc9, 0x00265511}}}, + {X: Field{[10]uint32{0x03caa975, 0x01c32a0a, 0x02c92bd1, 0x009caf18, 0x0287d174, 0x00634831, 0x01341603, 0x03a45358, 0x02517398, 0x00307d88}}, Y: Field{[10]uint32{0x03769e99, 0x0019c821, 0x01cabfcb, 0x0148071d, 0x00f6d6da, 0x00a4bdc6, 0x0328d593, 0x016ddb54, 0x02273673, 0x0007216b}}}, + {X: Field{[10]uint32{0x023dea8e, 0x004c8791, 0x03889714, 0x00066956, 0x01b206c6, 0x038c41c5, 0x00561533, 0x00220752, 0x01f9605f, 0x0029fa07}}, Y: Field{[10]uint32{0x00ae8a4f, 0x01bfbe5f, 0x000adaa1, 0x03ad7151, 0x020eb23d, 0x01f7de5a, 0x0370dbba, 0x006f83c2, 0x00fd1f36, 0x000eb888}}}, + {X: Field{[10]uint32{0x006a536b, 0x01ca0af9, 0x033262fe, 0x02b16a33, 0x02f46af5, 0x01f52b97, 0x03ac0288, 0x03ca59e8, 0x03298f5d, 0x0006da6f}}, Y: Field{[10]uint32{0x0046a91f, 0x0093cbaa, 0x01c6028c, 0x03f62203, 0x02d7e9d7, 0x0066ce28, 0x0375c684, 0x0269c7a8, 0x00aa02d9, 0x00327189}}}, + {X: Field{[10]uint32{0x03bb44bb, 0x0048bb76, 0x0251db56, 0x021ff45c, 0x03b31c99, 0x02cecc49, 0x0315cb96, 0x018ee637, 0x03740317, 0x003377fb}}, Y: Field{[10]uint32{0x024869f5, 0x011679fc, 0x00b65854, 0x019e3de0, 0x00225f08, 0x028ca8e3, 0x0279ce26, 0x016a8d31, 0x02f42e93, 0x00025cbf}}}, + {X: Field{[10]uint32{0x00e957ff, 0x01c3ffd8, 0x0129cfcb, 0x00d79f00, 0x00ee07f2, 0x03bc0788, 0x0347d309, 0x01458d9a, 0x00ef2c8a, 0x000cbf87}}, Y: Field{[10]uint32{0x03b4588e, 0x013b7c93, 0x0036fe75, 0x031f116d, 0x023d13b2, 0x0030d53a, 0x033babe0, 0x0184922c, 0x0331bd37, 0x0027a185}}}, + {X: Field{[10]uint32{0x01c24b0d, 0x00896e1e, 0x02908505, 0x015c9955, 0x024a7596, 0x02bed87f, 0x01d0ccf6, 0x0104674c, 0x03e9f491, 0x0028e0be}}, Y: Field{[10]uint32{0x02111857, 0x01b36a34, 0x00a55513, 0x0063260e, 0x02cdde63, 0x01f088bf, 0x03e0287c, 0x02ff709c, 0x036039a1, 0x002a8c00}}}, + {X: Field{[10]uint32{0x0280ef88, 0x02453b06, 0x028bc6d6, 0x029e5a88, 0x0159e305, 0x01f00d13, 0x03e24670, 0x00c3ab84, 0x00399ae3, 0x002d4ed5}}, Y: Field{[10]uint32{0x01fadc7a, 0x003b8c35, 0x01a368f3, 0x00711d54, 0x02969d8d, 0x02ea2a38, 0x00f43cc8, 0x01b175d2, 0x00538dfc, 0x00266024}}}, + {X: Field{[10]uint32{0x0364169a, 0x007436be, 0x01b8df52, 0x02bc1abb, 0x00710fe2, 0x022c2b67, 0x00bbfed9, 0x03fb0fed, 0x0253f11c, 0x001886d4}}, Y: Field{[10]uint32{0x020378aa, 0x0036fa49, 0x00bb3abe, 0x01704d85, 0x033b9300, 0x00f81717, 0x01d025b6, 0x01abd88b, 0x01c48b71, 0x000a88d3}}}, + {X: Field{[10]uint32{0x01435b04, 0x00c5783e, 0x000bed5b, 0x03eae694, 0x001e5979, 0x003d5d63, 0x023f4428, 0x00f1fcc5, 0x036ccc9c, 0x0020ccca}}, Y: Field{[10]uint32{0x00d30ea0, 0x0285abf7, 0x012d416a, 0x03da1d8b, 0x0060c77d, 0x0100b761, 0x0241025c, 0x007c72f6, 0x0212258c, 0x00214d81}}}, + {X: Field{[10]uint32{0x03f6538a, 0x02a1a3f6, 0x006b668a, 0x0069e91d, 0x02fd54e2, 0x02806c43, 0x032d926d, 0x009888bd, 0x00e39120, 0x0009f236}}, Y: Field{[10]uint32{0x02d6eb91, 0x034ad088, 0x00090e90, 0x020484eb, 0x034d0c0a, 0x03783ffd, 0x009fe83f, 0x0121355b, 0x023fb8f2, 0x00221da3}}}, + {X: Field{[10]uint32{0x020067e5, 0x007aff81, 0x03a9155d, 0x0353c22d, 0x036ee768, 0x010955bb, 0x012e05ac, 0x008014bf, 0x030bbcd8, 0x003cd271}}, Y: Field{[10]uint32{0x010c6604, 0x0086939d, 0x009fb9f6, 0x02c1c75b, 0x0293fdc5, 0x01ebaa42, 0x003c4e9e, 0x0341431f, 0x00194011, 0x001b5657}}}, + {X: Field{[10]uint32{0x03b24f90, 0x0209e9c4, 0x03156edb, 0x00805ce9, 0x01a0183b, 0x030fe278, 0x031368ba, 0x0265998a, 0x027ab202, 0x00125995}}, Y: Field{[10]uint32{0x037e21ab, 0x01670cc0, 0x0094701f, 0x01645996, 0x01a097b8, 0x03020f8d, 0x0110ee76, 0x00eec252, 0x0036c2bb, 0x001bbe25}}}, + {X: Field{[10]uint32{0x013e0886, 0x01052fe4, 0x02eb69a7, 0x01d817fd, 0x0275611b, 0x02f18ffa, 0x0245b849, 0x0284fde1, 0x001b491d, 0x00124254}}, Y: Field{[10]uint32{0x01014df8, 0x02d96aa0, 0x03f17c54, 0x03dd7824, 0x0038b1ac, 0x0208ab17, 0x01d4c956, 0x001c3707, 0x02b6f2ee, 0x000b0831}}}, + {X: Field{[10]uint32{0x00cddb76, 0x0138d584, 0x01a72bf8, 0x023bb8f7, 0x03bd5f89, 0x03d058fd, 0x00d3ee40, 0x03450063, 0x0267f5a2, 0x0007b4b9}}, Y: Field{[10]uint32{0x02db8e7d, 0x024678c9, 0x027940f9, 0x03bda288, 0x02934810, 0x021a78db, 0x004babdd, 0x0133ab88, 0x00c564fa, 0x002ed25c}}}, + {X: Field{[10]uint32{0x0212f17b, 0x00758351, 0x03d5702a, 0x00361495, 0x00c15d1a, 0x037a1b5a, 0x01f9c8c7, 0x030dfeb7, 0x03410a0b, 0x00311eea}}, Y: Field{[10]uint32{0x02db09e3, 0x03baa068, 0x015cbb09, 0x019f3e0e, 0x00e84ce7, 0x028f30f8, 0x028091a1, 0x01f78444, 0x00b136f4, 0x000394ab}}}, + {X: Field{[10]uint32{0x027a7394, 0x03b1a831, 0x038c18f5, 0x03cf7484, 0x03f70825, 0x03b39d95, 0x0090b525, 0x033f10d5, 0x00c14993, 0x0038841a}}, Y: Field{[10]uint32{0x00c732da, 0x009c20c0, 0x00a12430, 0x03f276c1, 0x03065360, 0x017eadbe, 0x03997553, 0x02366caf, 0x0137d48f, 0x00335840}}}, + {X: Field{[10]uint32{0x03faf917, 0x01f93d0f, 0x03b87da0, 0x01bc47bb, 0x0200bd6a, 0x01942291, 0x029e1440, 0x00bd7ac1, 0x007d47a7, 0x0018d7d5}}, Y: Field{[10]uint32{0x03e64128, 0x00da48ca, 0x02642217, 0x015d53aa, 0x0021fecb, 0x0072c2fc, 0x024c8ed8, 0x01ced3cc, 0x01f23da2, 0x0023a82a}}}, + {X: Field{[10]uint32{0x01bdb47b, 0x0197c091, 0x02aa8485, 0x02ba4ca7, 0x013837b6, 0x00fe3993, 0x032f79ab, 0x02d2c7ff, 0x000a8648, 0x000918cb}}, Y: Field{[10]uint32{0x026e0426, 0x01b910bd, 0x03179814, 0x01d68e08, 0x02177ff8, 0x018aac8d, 0x02603608, 0x01574cf0, 0x0388c9e1, 0x00271b41}}}, + {X: Field{[10]uint32{0x037bf503, 0x03efde9a, 0x03b5ed59, 0x038574b0, 0x03146541, 0x032f2c06, 0x009cc56e, 0x00a75215, 0x01c3cfb2, 0x0010dd23}}, Y: Field{[10]uint32{0x01fb9c5c, 0x03cd3051, 0x019a9265, 0x01f86b7b, 0x000b2060, 0x0333623f, 0x007ea7f2, 0x026418ee, 0x01ed23a0, 0x00265d68}}}, + {X: Field{[10]uint32{0x03ae3ac0, 0x03ff72b0, 0x03a5804b, 0x03404549, 0x02bb8750, 0x026f8776, 0x0203b406, 0x0075a0c5, 0x0323b8c4, 0x0023e120}}, Y: Field{[10]uint32{0x02d1b37f, 0x020a22b0, 0x01c6e2c8, 0x00e8a95d, 0x01be81f8, 0x005f9691, 0x035805ab, 0x01830a1b, 0x00871282, 0x001dea2b}}}, + {X: Field{[10]uint32{0x0148422c, 0x0254ae8a, 0x012cc6e2, 0x036f1510, 0x002d8907, 0x00706720, 0x01e8be48, 0x0211b6ed, 0x0368b54d, 0x000a7af0}}, Y: Field{[10]uint32{0x03c7e845, 0x00bf898d, 0x0310aec7, 0x0285a180, 0x02426f79, 0x01e72f46, 0x02eb2d6f, 0x0276414e, 0x03a281d5, 0x0039ade4}}}, + {X: Field{[10]uint32{0x023ed345, 0x01e659c0, 0x008105ba, 0x000a7e39, 0x03d84bc6, 0x02dc5254, 0x00cbe21e, 0x0004b230, 0x03c4ccf4, 0x00250532}}, Y: Field{[10]uint32{0x017fdeee, 0x027ae035, 0x0272b39b, 0x0192edab, 0x01da45bb, 0x0338d72f, 0x0132790e, 0x028424b4, 0x039289e4, 0x002b47ba}}}, + {X: Field{[10]uint32{0x008f756e, 0x030f71ca, 0x035d411e, 0x02976c79, 0x000bea90, 0x003c8532, 0x03ab8149, 0x00009184, 0x025b769d, 0x0006f615}}, Y: Field{[10]uint32{0x01d375d8, 0x0085d770, 0x02b131df, 0x035f7315, 0x00b69c2c, 0x02af6b94, 0x01cfcb02, 0x007a46de, 0x006cfc78, 0x00301429}}}, + {X: Field{[10]uint32{0x0229cb01, 0x03b242c1, 0x013f276c, 0x038ca216, 0x0314ed0a, 0x02e37b59, 0x0009154e, 0x019af8f5, 0x004c35ad, 0x00013dd6}}, Y: Field{[10]uint32{0x03712bb0, 0x007acf05, 0x02048fb0, 0x03863c76, 0x021520fe, 0x0271685f, 0x00cf1b3e, 0x00483847, 0x0248232a, 0x003d2fa4}}}, + {X: Field{[10]uint32{0x01d9f13b, 0x031e0f87, 0x02b352b9, 0x021311dc, 0x01cffd16, 0x034bcf3b, 0x0127401f, 0x02cc5eac, 0x01de7e85, 0x0016c002}}, Y: Field{[10]uint32{0x0173ba64, 0x0048ca2e, 0x0048dbb4, 0x02fbb3f8, 0x01cb8839, 0x019cb1e3, 0x037cb7ce, 0x030d38cd, 0x0304f531, 0x003d1615}}}, + {X: Field{[10]uint32{0x03b32815, 0x00ef2b18, 0x019c3ad1, 0x014cfcfb, 0x0037f853, 0x0088b7ce, 0x025fdbc4, 0x01bc04ba, 0x01c37939, 0x00319bcc}}, Y: Field{[10]uint32{0x02b22668, 0x0334f69b, 0x01ca3ea1, 0x0212eeb1, 0x024113ee, 0x02d41490, 0x023ca861, 0x03a72f04, 0x00084ae5, 0x0001f5ee}}}, + {X: Field{[10]uint32{0x0263abd6, 0x03217997, 0x03af1a57, 0x0157a469, 0x023d7ba4, 0x03a679a5, 0x03a51b3e, 0x0264d09a, 0x035dc8b0, 0x000cc25f}}, Y: Field{[10]uint32{0x0270d7c4, 0x00d648b0, 0x02d80638, 0x03b59b93, 0x02987401, 0x0061a5d9, 0x039e1206, 0x00627722, 0x033b200c, 0x003ef49a}}}, + {X: Field{[10]uint32{0x005ffff4, 0x0374aa72, 0x015f8c37, 0x002e138e, 0x01aa71cf, 0x03eef90f, 0x02922d5f, 0x03b182e6, 0x0245a3b7, 0x0006b394}}, Y: Field{[10]uint32{0x0325084f, 0x0113686e, 0x029871c4, 0x01344358, 0x0006ad3f, 0x01b2eda7, 0x01c51cbb, 0x023e6fca, 0x01679470, 0x001cb03b}}}, + {X: Field{[10]uint32{0x030c4471, 0x0296bcda, 0x03512692, 0x00cb354b, 0x006ed54e, 0x00fe480b, 0x03225249, 0x0130b2fe, 0x039e4cce, 0x002f065e}}, Y: Field{[10]uint32{0x01673f70, 0x00213ef7, 0x017dfadb, 0x02553574, 0x013cad9b, 0x03b14222, 0x016be56c, 0x00197693, 0x02635182, 0x003544dd}}}, + {X: Field{[10]uint32{0x00c7df70, 0x0342f237, 0x03fab76a, 0x0002de69, 0x0213c6f5, 0x03b2b625, 0x00cfa733, 0x036fb45d, 0x0131334b, 0x0019a65e}}, Y: Field{[10]uint32{0x0199435a, 0x026f4b19, 0x003310d4, 0x037c9a50, 0x00ab00af, 0x0012b158, 0x03e7d3a5, 0x00663bb8, 0x0301948e, 0x003f6f4c}}}, + {X: Field{[10]uint32{0x026eb4bf, 0x020f30c6, 0x008b3890, 0x00bcdc2c, 0x02563742, 0x0040fde6, 0x020b9620, 0x020be5f0, 0x00dfb38d, 0x000eea1b}}, Y: Field{[10]uint32{0x0258dfc8, 0x035ab48c, 0x02fee33d, 0x00aaf7b2, 0x035377e3, 0x02d1db86, 0x017f9819, 0x02ec4e6f, 0x001176de, 0x002b3b26}}}, + {X: Field{[10]uint32{0x031603cd, 0x024c36fb, 0x01243fed, 0x027ddba0, 0x02639519, 0x00b64575, 0x03acdbdc, 0x01c76130, 0x032f9db9, 0x0003d890}}, Y: Field{[10]uint32{0x027b5f28, 0x0031e5d2, 0x02444c2e, 0x013bac46, 0x0282269f, 0x037a1d5f, 0x0056acd5, 0x01331b96, 0x033d177b, 0x003ba273}}}, + {X: Field{[10]uint32{0x0067bbaf, 0x02bbaa70, 0x00b1d688, 0x0141e538, 0x01b6d812, 0x016ca028, 0x016e6500, 0x03a9182b, 0x03dc6a6d, 0x00212d06}}, Y: Field{[10]uint32{0x03c00e7c, 0x03090e67, 0x032b2ab8, 0x01b97343, 0x03e452fe, 0x017c3c32, 0x008cdf7b, 0x02d2ecae, 0x003cb535, 0x0027de1c}}}, + {X: Field{[10]uint32{0x009d4c67, 0x010b06b2, 0x01f8828a, 0x02b294e6, 0x01048c52, 0x022e3515, 0x00f48839, 0x0128538a, 0x02a93ea6, 0x00238b7f}}, Y: Field{[10]uint32{0x02781271, 0x0169267c, 0x02ff7593, 0x01d3da77, 0x03e09d74, 0x023b413a, 0x01df10dd, 0x00d814cd, 0x0149cda5, 0x003fb005}}}, + {X: Field{[10]uint32{0x03105e0b, 0x009dd666, 0x012f118b, 0x028903a4, 0x01dbd2f6, 0x032f0be8, 0x0175e364, 0x02b074ff, 0x01ae5401, 0x0030ef1b}}, Y: Field{[10]uint32{0x0363d6b4, 0x01430fce, 0x00c340a6, 0x0122dbc3, 0x019c5dba, 0x000dc02c, 0x02345063, 0x024c9bf4, 0x00f55b73, 0x0005c3f7}}}, + {X: Field{[10]uint32{0x03c14691, 0x03b32268, 0x0395da10, 0x03b7a4d5, 0x00c2defc, 0x009ffe04, 0x01a289e0, 0x014b9eb1, 0x02931b1e, 0x000cc24f}}, Y: Field{[10]uint32{0x00deec38, 0x021e9fdc, 0x0047a7ee, 0x002f5a2f, 0x0102114f, 0x02b843ee, 0x03dc8421, 0x017af699, 0x01845bd5, 0x001feee9}}}, + {X: Field{[10]uint32{0x00141ef9, 0x03f9cd36, 0x00208a36, 0x00cbb2f3, 0x013f1211, 0x031e3762, 0x02c765ed, 0x028f3801, 0x0038b6d1, 0x00086cd5}}, Y: Field{[10]uint32{0x02e300d0, 0x01afc1ba, 0x02a7f256, 0x02f8ec59, 0x01e2d516, 0x01bed423, 0x01a82b36, 0x01f723d8, 0x01a5ed23, 0x0003d845}}}, + {X: Field{[10]uint32{0x03892df3, 0x020bf1b4, 0x008de037, 0x008470b9, 0x03ade708, 0x023a793e, 0x0248edf2, 0x03b45cc0, 0x0183aa1b, 0x0033b599}}, Y: Field{[10]uint32{0x00fdec96, 0x0239ce06, 0x031b6cb3, 0x00d4901f, 0x02c3a818, 0x03110710, 0x03e634e3, 0x0280efc3, 0x0136f29d, 0x0013d0eb}}}, + {X: Field{[10]uint32{0x026f71f8, 0x0215cefb, 0x03ec023a, 0x01f333ca, 0x0337f6eb, 0x027ef32b, 0x02731222, 0x02a2bac1, 0x0020f541, 0x003169d1}}, Y: Field{[10]uint32{0x00adb259, 0x01921958, 0x017096c8, 0x00d524d3, 0x021612a5, 0x0097e964, 0x00a6e25d, 0x00f4db00, 0x00024426, 0x002b98d3}}}, + {X: Field{[10]uint32{0x00b9de9e, 0x012eb052, 0x0212ef0a, 0x007f1334, 0x008311c5, 0x016c57a9, 0x03255211, 0x01ad2ca9, 0x008bf30f, 0x000c1281}}, Y: Field{[10]uint32{0x023bb3cd, 0x02c19781, 0x03fec154, 0x0216c848, 0x0311ceeb, 0x02a54fea, 0x01cb5dc8, 0x02fc344a, 0x01003d6e, 0x0023e4d6}}}, + {X: Field{[10]uint32{0x039c2048, 0x02fef356, 0x0251972e, 0x03c4eec1, 0x016ecb66, 0x01e047a4, 0x009875e9, 0x002bd42b, 0x01ae7eba, 0x003fe5ad}}, Y: Field{[10]uint32{0x0352a887, 0x00678bd8, 0x00e3c319, 0x0321c3f5, 0x033de89c, 0x015abb46, 0x00a0b1db, 0x0073ab96, 0x0186bca7, 0x00092bc8}}}, + {X: Field{[10]uint32{0x01b701a3, 0x037389ec, 0x035d050b, 0x02e5282c, 0x028b6d38, 0x01bf6cf3, 0x01472437, 0x00bbb410, 0x021cdf73, 0x00164273}}, Y: Field{[10]uint32{0x0224dfdf, 0x0301782c, 0x012b037f, 0x02eefdde, 0x037d3731, 0x000e0e8f, 0x01cf2239, 0x039d8609, 0x01440665, 0x0000b912}}}, + {X: Field{[10]uint32{0x03d1d527, 0x01acc3aa, 0x01ad7cfb, 0x01d32bc1, 0x0008ef99, 0x00a11152, 0x02032b79, 0x019841be, 0x031f86d6, 0x003fdadd}}, Y: Field{[10]uint32{0x008ba4b3, 0x03c109e4, 0x03f50b25, 0x02b8d512, 0x029fcd0b, 0x03a7daa1, 0x037e0557, 0x03a473fd, 0x029c9393, 0x001aaf4a}}}, + {X: Field{[10]uint32{0x021aa8d9, 0x035f48ce, 0x005f4bef, 0x0215f9ff, 0x03be9196, 0x00b66b39, 0x03da48a1, 0x007eb47b, 0x030494dd, 0x00250f33}}, Y: Field{[10]uint32{0x020a7bd6, 0x0044d306, 0x01c523d0, 0x007161e4, 0x006014e0, 0x029f93c4, 0x011a23fc, 0x00fe2cdd, 0x00cc2dd9, 0x0013c22d}}}, + {X: Field{[10]uint32{0x005f172c, 0x03127dd0, 0x035b3ee6, 0x022c7672, 0x0147a463, 0x03c9b0d0, 0x00e0968b, 0x00737242, 0x03a7a89e, 0x00029e69}}, Y: Field{[10]uint32{0x03bb8ceb, 0x03ba43fc, 0x00cd1b3c, 0x01dae60e, 0x03ebadcb, 0x0300c96c, 0x0097f34e, 0x02f8eb95, 0x016714b5, 0x0032d4f6}}}, + {X: Field{[10]uint32{0x007b89dd, 0x03014547, 0x01b2fa50, 0x00daa8cf, 0x024f548b, 0x005cfde2, 0x021667cd, 0x01bbeaa1, 0x02fc7117, 0x000a3fcb}}, Y: Field{[10]uint32{0x02fe4941, 0x03889275, 0x01988dc6, 0x02ccdf5e, 0x038e67cd, 0x0235f6f7, 0x005e1656, 0x02857c52, 0x0307db4b, 0x0011d6cd}}}, + {X: Field{[10]uint32{0x01012968, 0x021facec, 0x03557f86, 0x01ebc2b9, 0x00223e89, 0x016d3280, 0x0304fa25, 0x01a21701, 0x033216a8, 0x00216cb0}}, Y: Field{[10]uint32{0x0257ea11, 0x0175cd75, 0x015c5704, 0x039e6341, 0x021f2bcb, 0x003bd1e7, 0x03cbe7af, 0x01015bbe, 0x0145ba66, 0x00287d63}}}, + {X: Field{[10]uint32{0x00bb8778, 0x01c32697, 0x01d47c2a, 0x03834d53, 0x027a02b3, 0x01ef4da4, 0x028e2add, 0x00cb7901, 0x0109eefb, 0x003a7f0b}}, Y: Field{[10]uint32{0x0365c312, 0x003b1696, 0x01cdf80d, 0x03b2f632, 0x00f249d7, 0x03d4f33d, 0x02e219bb, 0x0341a00f, 0x02a51216, 0x003b8026}}}, + {X: Field{[10]uint32{0x00005d9e, 0x0010be68, 0x02d65763, 0x0341883f, 0x02a1cc88, 0x0288a142, 0x0238af95, 0x00434c9b, 0x0350afd5, 0x00368b72}}, Y: Field{[10]uint32{0x033eaeab, 0x0007af84, 0x014436d5, 0x026ac5b2, 0x01ae0eab, 0x004c237a, 0x016af23f, 0x00258d78, 0x03b1c370, 0x0007bbd1}}}, + {X: Field{[10]uint32{0x02b352e0, 0x01f68f07, 0x02f08b9b, 0x034ffded, 0x02327891, 0x0021cd59, 0x03174027, 0x019baf39, 0x029cc6b1, 0x000836a8}}, Y: Field{[10]uint32{0x02e8a3fb, 0x0374fdde, 0x027a4299, 0x00981370, 0x02a30cb5, 0x00b0e8c9, 0x01d66929, 0x03e937b0, 0x002cecd6, 0x000bfda6}}}, + {X: Field{[10]uint32{0x03674d9b, 0x00bafdd4, 0x00bdd71b, 0x0101b30d, 0x023aab84, 0x025be7d3, 0x0147a534, 0x02f84d9d, 0x00dd2ae5, 0x00385ac2}}, Y: Field{[10]uint32{0x03a06846, 0x01e87646, 0x02c1d931, 0x0322dc4d, 0x0248a1af, 0x00d5ed6e, 0x003d60d6, 0x00ac7239, 0x024bd952, 0x002dc3dc}}}, + {X: Field{[10]uint32{0x016b93d3, 0x014d59f9, 0x00475807, 0x03b00f1a, 0x00c59670, 0x002c1b51, 0x039485e0, 0x036cd03f, 0x01af2d69, 0x0022228b}}, Y: Field{[10]uint32{0x01d4e3f5, 0x01e7ed8c, 0x01a9e9ba, 0x0212de52, 0x028e8043, 0x02c9c6ae, 0x00753f05, 0x002e0ab1, 0x03a7792e, 0x00376f93}}}, + {X: Field{[10]uint32{0x016abd12, 0x035831d8, 0x01704d50, 0x0032fd0f, 0x02ee6d8e, 0x00c7e5ec, 0x022e3081, 0x03f754b0, 0x00e29090, 0x001d1dda}}, Y: Field{[10]uint32{0x00b61058, 0x02eb1827, 0x0384099d, 0x01172338, 0x0227b266, 0x03b9ffcd, 0x012879e5, 0x0382d2ed, 0x03408d1c, 0x003aa9d7}}}, + {X: Field{[10]uint32{0x018d6eda, 0x01f5e73f, 0x011435a1, 0x0163e44c, 0x0380897a, 0x01f00307, 0x0337cc88, 0x004c6a34, 0x02ac1c7d, 0x00215a7c}}, Y: Field{[10]uint32{0x03eacf71, 0x01fb5b60, 0x01a8edda, 0x02aa9397, 0x0385e43b, 0x011a8ce4, 0x00e700a7, 0x001ba0be, 0x0344252d, 0x001413c2}}}, + {X: Field{[10]uint32{0x011860c9, 0x035a1078, 0x00591e57, 0x03e2f920, 0x00c4418d, 0x010a6e1d, 0x00a1d680, 0x0087713f, 0x03f9a672, 0x0013c57c}}, Y: Field{[10]uint32{0x0096b7ed, 0x02571529, 0x02a820b7, 0x02f13318, 0x013f1154, 0x01f4a418, 0x02bda108, 0x02a70685, 0x01561783, 0x00260b03}}}, + {X: Field{[10]uint32{0x004a92ce, 0x02fdf005, 0x019439e1, 0x036ea909, 0x0204e4f9, 0x03dc9635, 0x03d56ce6, 0x01b878fa, 0x02201f22, 0x00087946}}, Y: Field{[10]uint32{0x01aac869, 0x011c1e5d, 0x0235918d, 0x019d144d, 0x02428f31, 0x0326f42a, 0x001486fe, 0x0292b497, 0x0001b6a5, 0x001311ea}}}, + {X: Field{[10]uint32{0x000211a0, 0x00a84627, 0x01f2ed5e, 0x00d8e56f, 0x03e0f283, 0x03fdafe2, 0x034c4f9d, 0x03b03342, 0x002e8865, 0x003eb1f9}}, Y: Field{[10]uint32{0x00dd695e, 0x01aee8b1, 0x025c641e, 0x02dceeb5, 0x02ce656f, 0x0265cc1e, 0x01fece11, 0x00667bec, 0x019c8337, 0x000da04b}}}, + {X: Field{[10]uint32{0x0226d225, 0x01915246, 0x03469910, 0x00b5ee72, 0x0257f0f4, 0x010b4a7b, 0x01686714, 0x031dfb31, 0x039ec91b, 0x002851e0}}, Y: Field{[10]uint32{0x005bc5a4, 0x001dc2b2, 0x02edab73, 0x0138bc53, 0x02fc0d06, 0x028a7f06, 0x0120257f, 0x019fc618, 0x010ebf72, 0x003d010d}}}, + {X: Field{[10]uint32{0x00636b8c, 0x02790706, 0x01e2bdf1, 0x003dc5ab, 0x0344a790, 0x00563cf8, 0x0083c1f4, 0x01a01112, 0x00f9e508, 0x0034484b}}, Y: Field{[10]uint32{0x03fc0964, 0x00eb2c09, 0x02ec0555, 0x03203a31, 0x022f9c21, 0x00c8d71a, 0x00183a0f, 0x0059944a, 0x005107b9, 0x0001c82e}}}, + {X: Field{[10]uint32{0x03948975, 0x027fa422, 0x03ce72dd, 0x03282249, 0x022e4852, 0x00681f5e, 0x037c1250, 0x0095e025, 0x0334a7ab, 0x0004f57c}}, Y: Field{[10]uint32{0x018773ca, 0x01edbade, 0x0282a7d8, 0x014d1e7f, 0x02ff9987, 0x03a30e05, 0x0231db1a, 0x02aed473, 0x01e2d1d0, 0x0025ce1a}}}, + {X: Field{[10]uint32{0x0063507d, 0x02f7ec39, 0x007e6b9a, 0x0294d31e, 0x025ec754, 0x01af084d, 0x029bec32, 0x027a39da, 0x01616dae, 0x0007c19a}}, Y: Field{[10]uint32{0x035b262d, 0x03473471, 0x013ceb5b, 0x01d02ccd, 0x03c6f999, 0x0264ea6f, 0x01f9fc12, 0x00447e20, 0x030eb4ea, 0x00369201}}}, + {X: Field{[10]uint32{0x01150269, 0x02ab57da, 0x020298d4, 0x03400453, 0x01907b15, 0x027e5d7d, 0x02d9a495, 0x00770f12, 0x01873868, 0x0001ca78}}, Y: Field{[10]uint32{0x01455442, 0x001967e3, 0x003f2456, 0x020a7a36, 0x02c1901c, 0x02c0d69f, 0x020022c8, 0x02806db7, 0x018ec60e, 0x0036fcbb}}}, + {X: Field{[10]uint32{0x01fda12a, 0x0085a1c7, 0x02fa02ee, 0x03bb0810, 0x028e3692, 0x03864309, 0x002435fd, 0x00d1dd35, 0x03e96135, 0x003a4bf2}}, Y: Field{[10]uint32{0x0164f2ff, 0x014b320b, 0x01a84fb8, 0x01447c07, 0x03585b14, 0x039bb173, 0x02369575, 0x02035907, 0x000e3f52, 0x0029d6d7}}}, + {X: Field{[10]uint32{0x00da36df, 0x0204b532, 0x01c1c789, 0x0335fcad, 0x001ad35b, 0x00fdae41, 0x004dfbf9, 0x0234e7a7, 0x021ac69f, 0x002170b9}}, Y: Field{[10]uint32{0x00b53f45, 0x03eaecf0, 0x03752f38, 0x036efca5, 0x02575264, 0x00caac46, 0x00a50b33, 0x00a78697, 0x01876944, 0x00329b64}}}, + {X: Field{[10]uint32{0x011bc05c, 0x0051f86f, 0x0024f10f, 0x016021e7, 0x003adf99, 0x016b93c0, 0x01c2791b, 0x031ad03d, 0x0232c33c, 0x0004345d}}, Y: Field{[10]uint32{0x039a687d, 0x00b24a64, 0x01718a8b, 0x013cc481, 0x000be846, 0x02393170, 0x01bae008, 0x03b1bd17, 0x0334f1dd, 0x003857b9}}}, + {X: Field{[10]uint32{0x025d609a, 0x03b21af8, 0x036f028f, 0x035a09d1, 0x0092511d, 0x01fa82ef, 0x01820bd2, 0x0225cbce, 0x03452593, 0x0029a508}}, Y: Field{[10]uint32{0x0311d6e9, 0x01cc20d3, 0x016bd0ea, 0x01b02d4a, 0x00af49ee, 0x0095b2d2, 0x036d1b66, 0x01cfd24f, 0x0216870f, 0x00381acd}}}, + {X: Field{[10]uint32{0x0394d8ac, 0x019b6237, 0x0190604f, 0x01d5aec3, 0x03c401a6, 0x016db131, 0x02ba0524, 0x02b8fd0f, 0x00ed2b3d, 0x002d29f6}}, Y: Field{[10]uint32{0x00963456, 0x00291b64, 0x01ecfd2b, 0x00138429, 0x01074dcb, 0x0341ebcd, 0x03def119, 0x036d6bf5, 0x00631a2c, 0x003ff207}}}, + {X: Field{[10]uint32{0x01a6fd17, 0x0078aaf7, 0x01266303, 0x03fd613c, 0x03f84fb2, 0x026a9574, 0x01cb660d, 0x00f15ca1, 0x021daebd, 0x0016baf8}}, Y: Field{[10]uint32{0x02f1abe8, 0x03366676, 0x00ff6d9d, 0x03bdecd7, 0x038f5994, 0x03572114, 0x0178c40c, 0x02d4c834, 0x01136a51, 0x00008ba9}}}, + {X: Field{[10]uint32{0x008c7f87, 0x00c5b9cb, 0x01c51278, 0x00360e18, 0x0269388d, 0x01158ea9, 0x016d64cb, 0x022356de, 0x02641943, 0x002b1a11}}, Y: Field{[10]uint32{0x02f41ac1, 0x004eace7, 0x02e5ff89, 0x02209961, 0x034d7109, 0x03da4fa4, 0x03bf1143, 0x002c0425, 0x02d82dc9, 0x0032e509}}}, + {X: Field{[10]uint32{0x00955250, 0x00855f09, 0x028356b8, 0x0190589f, 0x0176ad27, 0x009f3a2a, 0x00c58c2f, 0x0398861d, 0x01490f89, 0x001be52f}}, Y: Field{[10]uint32{0x007c5614, 0x037cfe6f, 0x012ec0d8, 0x02163b03, 0x01e3633a, 0x03e188bd, 0x03d9cf68, 0x0371f171, 0x00ce4a54, 0x003490cc}}}, + {X: Field{[10]uint32{0x0008f137, 0x01024168, 0x02fa9d09, 0x0229e168, 0x00775e06, 0x02b17fd1, 0x019ec5c9, 0x0251e81b, 0x008ce149, 0x0000fe5b}}, Y: Field{[10]uint32{0x005f3f40, 0x003ab320, 0x00ce2b12, 0x0100c380, 0x009b7d9e, 0x00d8327f, 0x03613d4e, 0x029418f3, 0x03af7111, 0x002a4773}}}, + {X: Field{[10]uint32{0x039c707d, 0x01c2565d, 0x033c8f34, 0x01866ca9, 0x00405a5b, 0x0124265d, 0x022a4c17, 0x01d74ee1, 0x005cdfd6, 0x0036016c}}, Y: Field{[10]uint32{0x003b6865, 0x0233b20f, 0x03a66b6d, 0x03c40f30, 0x0184366e, 0x02edff2c, 0x022abdbf, 0x027cb78e, 0x004cc727, 0x0029a2d5}}}, + {X: Field{[10]uint32{0x039df0e4, 0x02f8d381, 0x031d4808, 0x00cdbcbd, 0x03591422, 0x01d2afa6, 0x020efa78, 0x0272d9af, 0x000bd418, 0x00348a4f}}, Y: Field{[10]uint32{0x012682b1, 0x0301a3c8, 0x0131318c, 0x0268ff83, 0x017f24f7, 0x033a8e1c, 0x03fe70a5, 0x012582e6, 0x024887c5, 0x0017ef0c}}}, + {X: Field{[10]uint32{0x03209d5f, 0x032b6716, 0x016570fa, 0x03ed55be, 0x01e3f107, 0x01dacf17, 0x0149d26e, 0x008ff9eb, 0x010be226, 0x0024c7c2}}, Y: Field{[10]uint32{0x031cc087, 0x034685d2, 0x00144d5a, 0x03006143, 0x01848f57, 0x006ba8e5, 0x01daf748, 0x02626619, 0x0279d2a8, 0x00330957}}}, + {X: Field{[10]uint32{0x01e5ddc9, 0x0165cc8e, 0x00987a03, 0x002b6cd0, 0x006e4e69, 0x021500e9, 0x02a72f62, 0x03fdaf23, 0x02836707, 0x00046298}}, Y: Field{[10]uint32{0x03ff818b, 0x0086603d, 0x027ad722, 0x02361704, 0x00b6f5a1, 0x0365abe1, 0x039d4470, 0x024160db, 0x03e5e65a, 0x00247c03}}}, + {X: Field{[10]uint32{0x036a985a, 0x0071a907, 0x014be189, 0x00b4b998, 0x01b811ca, 0x03475278, 0x014ba420, 0x02d26b40, 0x00eb5b6c, 0x0020425b}}, Y: Field{[10]uint32{0x03607e5d, 0x03fa5c2d, 0x038f5b4d, 0x0181ac12, 0x003f4948, 0x00d52d9d, 0x0050a3c1, 0x03cf95e0, 0x01c5f8f9, 0x00036814}}}, + {X: Field{[10]uint32{0x000cae06, 0x0042624c, 0x0068b9f4, 0x010db771, 0x00351b7e, 0x020fad1f, 0x013559e7, 0x017b58b7, 0x00385ff4, 0x0026a029}}, Y: Field{[10]uint32{0x0004b6d0, 0x015efe2e, 0x01cad30e, 0x01678f90, 0x00bee656, 0x003154e6, 0x028aee8b, 0x02716d18, 0x039921b6, 0x00211747}}}, + {X: Field{[10]uint32{0x02747906, 0x009023d1, 0x0209081c, 0x0137eeed, 0x02214395, 0x007a57fa, 0x02c1d596, 0x0156e5fe, 0x00f3b899, 0x001a8c5a}}, Y: Field{[10]uint32{0x00ccc005, 0x00f15ca3, 0x01403c48, 0x007a0475, 0x02012c74, 0x00b2406d, 0x0244a3f8, 0x03c420eb, 0x03886778, 0x0016d7c7}}}, + {X: Field{[10]uint32{0x01214af8, 0x002a43f8, 0x018a73db, 0x03fbd3e3, 0x03797710, 0x022f23b5, 0x03d42985, 0x0196e88e, 0x031178d1, 0x002680ea}}, Y: Field{[10]uint32{0x01e85665, 0x00ad6f22, 0x0265ca65, 0x00287542, 0x0159a555, 0x02955bd4, 0x0112f2bf, 0x012fd245, 0x00e7e61e, 0x001c2223}}}, + {X: Field{[10]uint32{0x00ea2f5d, 0x01e3bdbd, 0x00e25e78, 0x01066477, 0x01296c8c, 0x0230525c, 0x02615754, 0x03678566, 0x018d78b8, 0x00232430}}, Y: Field{[10]uint32{0x031ca074, 0x005220b2, 0x01a68028, 0x03e6da42, 0x032b97c0, 0x036edc89, 0x0244a5e5, 0x02394685, 0x00cfde62, 0x000a950a}}}, + {X: Field{[10]uint32{0x008a8957, 0x035b74d4, 0x01d43b68, 0x008cce7f, 0x00933279, 0x000b27b4, 0x037a5daa, 0x00093613, 0x037f3062, 0x000ba6ea}}, Y: Field{[10]uint32{0x02a43345, 0x011d4c34, 0x02aca4a1, 0x023268dd, 0x03ea7e4f, 0x0148ecb7, 0x01e21f19, 0x000f27c8, 0x00b73f38, 0x00326be0}}}, + {X: Field{[10]uint32{0x02466322, 0x005d9c66, 0x0384db5c, 0x0260d0eb, 0x03e21298, 0x03ef9a8d, 0x0295e7c1, 0x033fbd92, 0x032e718e, 0x0009cd2f}}, Y: Field{[10]uint32{0x0284216e, 0x018d8c79, 0x03ca8f0a, 0x012f7e28, 0x007d0a1e, 0x01a5cc4b, 0x02a0ce34, 0x017c338d, 0x018a9f11, 0x003d4c02}}}, + {X: Field{[10]uint32{0x016aab58, 0x030a9475, 0x000d5e21, 0x01ee323d, 0x004af325, 0x01e6d485, 0x001b9975, 0x012939ba, 0x02f9500e, 0x002ae7b2}}, Y: Field{[10]uint32{0x01e0f047, 0x0035470f, 0x01bc3ff3, 0x039d5d0f, 0x01d0aaed, 0x00e2a216, 0x015e9d19, 0x0061126f, 0x03468e08, 0x003df4e1}}}, + {X: Field{[10]uint32{0x031af368, 0x0190d6b2, 0x000c0169, 0x01353a11, 0x00292b4d, 0x016eaa20, 0x029cd3e8, 0x027bcb96, 0x0146a4c0, 0x002b897d}}, Y: Field{[10]uint32{0x03f3da84, 0x004157bd, 0x03d59e05, 0x03c84404, 0x0080bd59, 0x0254f1b1, 0x039a9f22, 0x02103edc, 0x03b37373, 0x0011a8ac}}}, + {X: Field{[10]uint32{0x012e6142, 0x020f7070, 0x00ace54a, 0x02cafb01, 0x034e35ab, 0x0213f003, 0x017efaa8, 0x00736bd6, 0x01a64ef2, 0x00150a17}}, Y: Field{[10]uint32{0x00cdbc3d, 0x002db0c8, 0x03f6e522, 0x0124351b, 0x00b962a8, 0x00897757, 0x03c2dc29, 0x01ed6e91, 0x02b2144d, 0x000120ef}}}, + {X: Field{[10]uint32{0x03dca65e, 0x03ad984d, 0x00874c8d, 0x03ba8a45, 0x0035a627, 0x01a9e15f, 0x02d542ed, 0x008c7d82, 0x003404bc, 0x002fb3a1}}, Y: Field{[10]uint32{0x022f6a95, 0x00bd3acf, 0x034f8e9c, 0x02b6934e, 0x00fe1c93, 0x03820495, 0x0077fb8d, 0x039cbe39, 0x038002f9, 0x00288a7e}}}, + {X: Field{[10]uint32{0x035e81d1, 0x03672d3e, 0x0326b26f, 0x00b6b9b0, 0x0389994a, 0x03a082ef, 0x02fe5af1, 0x02e15d1c, 0x0347b148, 0x0000f555}}, Y: Field{[10]uint32{0x01e465df, 0x000073ef, 0x0052db90, 0x03efbf56, 0x03c9ea7d, 0x02cac58b, 0x035bc4f1, 0x00a293d8, 0x025ae867, 0x0037b7b2}}}, + {X: Field{[10]uint32{0x01cde5d4, 0x025f73dd, 0x01715fbc, 0x0080cd1d, 0x021846b5, 0x022fda9c, 0x036361a8, 0x00f1cd67, 0x0219d163, 0x0004f1a0}}, Y: Field{[10]uint32{0x03f83af4, 0x0104fe4d, 0x02e55935, 0x038aacad, 0x03bddf0c, 0x00b5e7a7, 0x02bfe7c5, 0x01fc825a, 0x00c239fc, 0x0033a28f}}}, + {X: Field{[10]uint32{0x01b0a6ac, 0x014049b5, 0x03433436, 0x00a6fa0d, 0x0036690a, 0x02ad4bc6, 0x00c481ad, 0x00691c9d, 0x02e1a804, 0x003a7902}}, Y: Field{[10]uint32{0x00c6bb7f, 0x0191bc8e, 0x029a9577, 0x008a9576, 0x019a22fa, 0x012451f3, 0x031f3147, 0x00e6e04d, 0x00b79c98, 0x00306656}}}, + {X: Field{[10]uint32{0x01493068, 0x006d3228, 0x00eea632, 0x01c6689a, 0x0113af43, 0x0236d872, 0x0353a537, 0x028697dc, 0x01537460, 0x000b8ed1}}, Y: Field{[10]uint32{0x03a54dcf, 0x014b1772, 0x01bb6e04, 0x03cadbed, 0x015ccf5c, 0x02439540, 0x019d3e22, 0x019b2125, 0x02561049, 0x003dee97}}}, + {X: Field{[10]uint32{0x034c62b8, 0x03c3d202, 0x0091edb1, 0x03713329, 0x026a59f3, 0x03d9c373, 0x02aa40eb, 0x012c019f, 0x0082b921, 0x0026156f}}, Y: Field{[10]uint32{0x00fcf435, 0x03072033, 0x000098d4, 0x0084e11e, 0x0387184e, 0x02c1c580, 0x0237d6b5, 0x031cf3a7, 0x036e3be6, 0x0029f64f}}}, + {X: Field{[10]uint32{0x01253979, 0x03e11d85, 0x00866982, 0x03148cee, 0x0367486b, 0x0273c9f7, 0x004bee26, 0x00a44db5, 0x00a9b934, 0x000dfe08}}, Y: Field{[10]uint32{0x0070ca15, 0x01a28a1e, 0x0288b2a5, 0x00ee75ee, 0x0150dd89, 0x01f159a9, 0x0345a5a3, 0x0274ddfc, 0x029daa62, 0x003f72ba}}}, + {X: Field{[10]uint32{0x02d41a98, 0x02a747f7, 0x013b03cb, 0x028a8e13, 0x023e0cd0, 0x001c3167, 0x00f6ba28, 0x00ec31a4, 0x0098a92a, 0x003a0b4b}}, Y: Field{[10]uint32{0x00501460, 0x021af832, 0x0306095c, 0x03341852, 0x01d09d7e, 0x031f540b, 0x0033d344, 0x016cd852, 0x023232d8, 0x000c79ce}}}, + {X: Field{[10]uint32{0x02923419, 0x024de666, 0x03f3a24b, 0x007ad002, 0x03ad4690, 0x03abb38e, 0x00711827, 0x032419a8, 0x03c36dd4, 0x002f524b}}, Y: Field{[10]uint32{0x01dd7798, 0x01a83240, 0x01af5fdc, 0x024ef349, 0x018b93da, 0x01ff5012, 0x036dbd0a, 0x03569199, 0x03c51e1f, 0x0032ab68}}}, + {X: Field{[10]uint32{0x0229577a, 0x03b4cae1, 0x039641cd, 0x0265ef7c, 0x00cd8f0d, 0x0169a720, 0x022c4dc1, 0x03b13cf2, 0x02da42d1, 0x001b22d1}}, Y: Field{[10]uint32{0x0318c956, 0x00900131, 0x030a97f1, 0x023b98ac, 0x01cbeb98, 0x02f2f08e, 0x02ef5965, 0x010b83dc, 0x0362729e, 0x0034eb53}}}, + {X: Field{[10]uint32{0x00f5dd62, 0x03af303e, 0x00f05ea9, 0x006ab432, 0x03effee7, 0x034d5ad3, 0x00a25d34, 0x034f7615, 0x01e6799b, 0x001e2c7a}}, Y: Field{[10]uint32{0x0131145d, 0x017e248e, 0x025c1dd2, 0x00adc0b9, 0x01d726ce, 0x028c0199, 0x03d70057, 0x02237301, 0x02d6a267, 0x000c540f}}}, + {X: Field{[10]uint32{0x02ebdccf, 0x01d3ba96, 0x00375c89, 0x0170057c, 0x03cb53fa, 0x03e92ada, 0x028cda6b, 0x0148f8f1, 0x02a663c5, 0x003cbb40}}, Y: Field{[10]uint32{0x00f36382, 0x039c968f, 0x03b67773, 0x02a3451d, 0x02937720, 0x00882b4c, 0x03922413, 0x000c838e, 0x01c3afdc, 0x0000ef79}}}, + {X: Field{[10]uint32{0x02caffd3, 0x00259f50, 0x02a60cde, 0x0005746a, 0x00f67ab1, 0x03fdae88, 0x0254d835, 0x0002fc1f, 0x0243a458, 0x001f90fd}}, Y: Field{[10]uint32{0x0398d68a, 0x00851655, 0x0079a76e, 0x004ad55a, 0x0158600d, 0x001ed49a, 0x03fbb378, 0x00ce66d5, 0x02da0f47, 0x0007d15b}}}, + {X: Field{[10]uint32{0x01319be8, 0x002d9598, 0x01d07643, 0x03299955, 0x017ccde2, 0x02d34b3a, 0x00c0a624, 0x00da5ea9, 0x01775eb7, 0x0037c578}}, Y: Field{[10]uint32{0x027311ad, 0x001e73ec, 0x00e53b35, 0x032ac5b9, 0x0108397c, 0x02983b8b, 0x0173dfb8, 0x00e06308, 0x00dcf154, 0x0000125b}}}, + {X: Field{[10]uint32{0x0382e2ae, 0x01fd9a71, 0x00fceef3, 0x03ee4685, 0x036707a3, 0x02503a12, 0x01c16487, 0x02ec804b, 0x03060295, 0x003b7c75}}, Y: Field{[10]uint32{0x02019a2e, 0x02a2593f, 0x00d7d239, 0x0263c239, 0x039ed8f5, 0x03a223ab, 0x00b2dd68, 0x01b25ec8, 0x02f6fcd7, 0x0038e83c}}}, + {X: Field{[10]uint32{0x02f8f6c0, 0x023ed705, 0x03c2d9b1, 0x0335aea1, 0x01fd92ce, 0x00f41193, 0x023c3137, 0x02087cef, 0x02b26b15, 0x00305408}}, Y: Field{[10]uint32{0x02136c2e, 0x01606f73, 0x02da9327, 0x0096a03f, 0x0065d57f, 0x00ba7e81, 0x03961e69, 0x00a10b81, 0x0370d94e, 0x001e3348}}}, + {X: Field{[10]uint32{0x036001d9, 0x01f69fb1, 0x01105e27, 0x032ed4b7, 0x00c6cc2b, 0x02a3e324, 0x01886a28, 0x00578042, 0x036bb6ae, 0x0002f537}}, Y: Field{[10]uint32{0x02f1446f, 0x021c9f63, 0x0387572f, 0x03736806, 0x03a6f6fa, 0x01b3b4b8, 0x00e50299, 0x032e596e, 0x01b2b0b4, 0x00126596}}}, + {X: Field{[10]uint32{0x03bc0b76, 0x0025c023, 0x03ed4b21, 0x02d3211a, 0x021e2d6e, 0x018bc603, 0x01f9b4f1, 0x02533949, 0x02328738, 0x0037f3b0}}, Y: Field{[10]uint32{0x01b4f92e, 0x03bc019a, 0x03b953f8, 0x0314cc90, 0x005a477e, 0x02842acf, 0x0318f059, 0x0239c670, 0x021bf4c8, 0x002bef1d}}}, + {X: Field{[10]uint32{0x01c94e54, 0x02c7fbfd, 0x008e1a9e, 0x00d5d939, 0x00b84739, 0x02e2d07f, 0x0259b005, 0x013eb88d, 0x004de3c9, 0x002c01db}}, Y: Field{[10]uint32{0x039c7d4f, 0x0288c203, 0x00551f3e, 0x0286e13a, 0x01fe17fd, 0x0120c282, 0x002ee5e4, 0x029a1dbd, 0x02553c55, 0x00387acc}}}, + {X: Field{[10]uint32{0x022d0c11, 0x0130fc36, 0x008be94b, 0x02c266fa, 0x020fe9eb, 0x03599e1e, 0x01e9fe33, 0x00957304, 0x029c17c4, 0x0002687f}}, Y: Field{[10]uint32{0x008e8379, 0x03d5a37a, 0x002b096a, 0x01b98b7c, 0x0325f6fd, 0x01eb472a, 0x023e1aac, 0x039ce5b8, 0x030999a8, 0x0039abbd}}}, + {X: Field{[10]uint32{0x01212899, 0x01ba7905, 0x030f2257, 0x01b9e658, 0x02e1d8b1, 0x01b19441, 0x0399b88b, 0x02f05766, 0x0134126b, 0x0007626a}}, Y: Field{[10]uint32{0x02f8f4eb, 0x02035669, 0x00fd7567, 0x0113b4db, 0x0137d646, 0x03657142, 0x01a79ef7, 0x001c883a, 0x025692db, 0x002df8c8}}}, + {X: Field{[10]uint32{0x000c7fa4, 0x02f90cdc, 0x000a6ac2, 0x015886f2, 0x02345469, 0x014c3b7e, 0x0062d4f7, 0x00de58f1, 0x0068b67b, 0x003183d7}}, Y: Field{[10]uint32{0x038a7e08, 0x01d6982f, 0x002c653f, 0x014d73b0, 0x03b5507b, 0x003724b4, 0x01b5a676, 0x03c38e86, 0x007197ff, 0x00223e2c}}}, + {X: Field{[10]uint32{0x02d9d949, 0x01f5b094, 0x02ec9e6b, 0x0073dda3, 0x03620576, 0x00c06f90, 0x036499ad, 0x009a646d, 0x036f0d9b, 0x0014b34a}}, Y: Field{[10]uint32{0x030ec835, 0x00084e00, 0x024aa138, 0x020bd51f, 0x02263563, 0x031e0ac9, 0x0111a3ea, 0x00d42283, 0x00661fa3, 0x003449f3}}}, + {X: Field{[10]uint32{0x0105dda9, 0x00d0091b, 0x03be920a, 0x02973d38, 0x01c21fbe, 0x0345aec6, 0x004f107f, 0x020d7fce, 0x019ea639, 0x00079112}}, Y: Field{[10]uint32{0x032d1f53, 0x0104b083, 0x0088d027, 0x008fa585, 0x018f8adf, 0x013f43c8, 0x00d12db7, 0x010be654, 0x00e90a90, 0x001071aa}}}, + {X: Field{[10]uint32{0x006861de, 0x009d50ff, 0x01cb1c67, 0x01595a81, 0x03984ecc, 0x01804dba, 0x0253bae3, 0x0252eb47, 0x00f0a563, 0x0004e451}}, Y: Field{[10]uint32{0x02d0742a, 0x03b4ed0b, 0x02dc1025, 0x0005ba87, 0x00964f3d, 0x03010aee, 0x03174ab6, 0x03a6c86f, 0x0337ff37, 0x001c0e51}}}, + {X: Field{[10]uint32{0x014a2280, 0x029d3e19, 0x02eb75a2, 0x0322db6d, 0x0134fe75, 0x018d39a1, 0x03cb9546, 0x037c6187, 0x002a2454, 0x0024d328}}, Y: Field{[10]uint32{0x03195761, 0x03e85736, 0x00be4375, 0x00e9af9e, 0x016865ce, 0x013f493c, 0x003caee7, 0x03f2802e, 0x0384266c, 0x001de7a5}}}, + {X: Field{[10]uint32{0x006a3be6, 0x034c9b62, 0x0279a7ac, 0x02a8b52d, 0x00af913b, 0x034d7b35, 0x01a8c329, 0x009165df, 0x007d9e1c, 0x002993c1}}, Y: Field{[10]uint32{0x01112b2b, 0x0052061e, 0x03581e60, 0x00263b15, 0x023210f3, 0x0091d677, 0x02145e3b, 0x03b5b440, 0x030ff3b4, 0x003847a0}}}, + {X: Field{[10]uint32{0x018757e1, 0x0150a3a0, 0x0034e2a1, 0x0312e2f5, 0x03cfcf45, 0x03c57fa3, 0x00820ccd, 0x02422236, 0x00bdcd62, 0x003871a2}}, Y: Field{[10]uint32{0x00c77f7d, 0x003dbc86, 0x03600d13, 0x00685499, 0x01a34e7d, 0x01deedd1, 0x03b8e00e, 0x03238004, 0x02e171e7, 0x002f0431}}}, + {X: Field{[10]uint32{0x00137358, 0x03baab1a, 0x01354c6d, 0x03b43655, 0x010ba2bd, 0x009ebf32, 0x0056de68, 0x01c3cb65, 0x00951231, 0x002c68c3}}, Y: Field{[10]uint32{0x004071f5, 0x01f5042c, 0x032985a1, 0x01fb7e86, 0x02a67879, 0x00100dcf, 0x00443469, 0x0072bf4e, 0x00abc16c, 0x00271da8}}}, + {X: Field{[10]uint32{0x02166e85, 0x024afab9, 0x034d0d68, 0x027da66b, 0x034c7cf9, 0x023d7894, 0x028ba235, 0x00a470d1, 0x03b5fbb0, 0x00093309}}, Y: Field{[10]uint32{0x039f71d5, 0x0287b633, 0x038ddd7a, 0x03388c4a, 0x02d51aab, 0x03c1da3f, 0x03c52e3f, 0x02e9099c, 0x01af2516, 0x003abcda}}}, + {X: Field{[10]uint32{0x008f6a57, 0x02aacb65, 0x00a92217, 0x01de136a, 0x02bacab5, 0x02f4c73b, 0x03e8921c, 0x03478bdf, 0x017a6166, 0x0022ed00}}, Y: Field{[10]uint32{0x008dc331, 0x00355ac2, 0x00c8a5c3, 0x01ca4f5e, 0x01a09cad, 0x0060a65b, 0x02e34fc7, 0x01a618d5, 0x000e6c47, 0x0032265d}}}, + {X: Field{[10]uint32{0x00497f6f, 0x02668cd8, 0x0368b0ec, 0x03d6949c, 0x01e6dafe, 0x002cc0ff, 0x02c17dc2, 0x03765b83, 0x03ddd82f, 0x0015762d}}, Y: Field{[10]uint32{0x03b8beca, 0x0211d8ad, 0x03657bbf, 0x00c347ff, 0x03f4f292, 0x0139cba7, 0x021709e4, 0x0359bd0d, 0x0111078b, 0x003f5891}}}, + {X: Field{[10]uint32{0x00c94df3, 0x038a148d, 0x028455db, 0x009bb11e, 0x03109d46, 0x00176f78, 0x01cbfe61, 0x00c6bd46, 0x01ef5a55, 0x0020aa8b}}, Y: Field{[10]uint32{0x01811511, 0x003b8e33, 0x007c4ebc, 0x03e81a85, 0x018d1e60, 0x0097eec9, 0x002df919, 0x028b9423, 0x03ea9f83, 0x00184582}}}, + {X: Field{[10]uint32{0x00f6f7f4, 0x010e33cb, 0x01636ad3, 0x02c30a38, 0x00804b03, 0x033ea466, 0x002cfbf3, 0x01ffe11f, 0x037cc6df, 0x000db049}}, Y: Field{[10]uint32{0x02fe4833, 0x0168a945, 0x03020aee, 0x018038cb, 0x03a7bb3b, 0x02963811, 0x015d821e, 0x0071d151, 0x03a274f8, 0x0008c13e}}}, + {X: Field{[10]uint32{0x00cd9119, 0x02215ab8, 0x0318c0eb, 0x0097e926, 0x02d57b89, 0x03002cd9, 0x02c9e860, 0x032b5f85, 0x01cc5b44, 0x003cddbf}}, Y: Field{[10]uint32{0x00a028cb, 0x039ea814, 0x006ac74f, 0x02b2f7d7, 0x01c3d0e7, 0x006b3f23, 0x009e3ef1, 0x03a07c12, 0x0132e4de, 0x000b5ab3}}}, + {X: Field{[10]uint32{0x01c5030b, 0x02ab3297, 0x03d1cc7a, 0x01b0e7b3, 0x0197150b, 0x001f4ea2, 0x02e8ecb9, 0x03a7d765, 0x00dc5372, 0x003a9384}}, Y: Field{[10]uint32{0x02d96ff5, 0x01999b0d, 0x003f9520, 0x0180513f, 0x0336d6be, 0x03f7ae25, 0x03486d29, 0x009aff0b, 0x02a393b6, 0x002c225b}}}, + {X: Field{[10]uint32{0x02fdeb08, 0x020728e9, 0x0191a0d1, 0x0067c6a7, 0x00a376ea, 0x006c512e, 0x03f0a2c7, 0x01285e74, 0x02b4b266, 0x001d3ce4}}, Y: Field{[10]uint32{0x009e1fc0, 0x03b820f8, 0x02636c6e, 0x00d901b4, 0x01c95230, 0x026d19cd, 0x02cef679, 0x01623d93, 0x0321428d, 0x0026f536}}}, + {X: Field{[10]uint32{0x014855eb, 0x0258bbf3, 0x02774ca6, 0x01ad62e0, 0x0111c13a, 0x00393208, 0x01a17daf, 0x01ddd290, 0x004259ba, 0x000e8db2}}, Y: Field{[10]uint32{0x00fa5e3c, 0x02574af8, 0x03f482f0, 0x02e91763, 0x01f35e46, 0x017bce79, 0x01720c71, 0x024a3359, 0x01ad9ede, 0x001b76b4}}}, + {X: Field{[10]uint32{0x0098c019, 0x01434a97, 0x0364deae, 0x00623cc9, 0x017635ef, 0x01ac5faa, 0x02739814, 0x02913c5b, 0x02ad5636, 0x00275dec}}, Y: Field{[10]uint32{0x02ee3eef, 0x030dc688, 0x03234f30, 0x033674bd, 0x03eb5936, 0x02cb6c25, 0x0392b8ac, 0x02186ae4, 0x0027a775, 0x0014cb74}}}, + {X: Field{[10]uint32{0x02a3c4ab, 0x02b9f9ef, 0x02c1b39a, 0x005fb91a, 0x000deb61, 0x00317c6f, 0x01168a0f, 0x00be0381, 0x02e9450e, 0x000b9d00}}, Y: Field{[10]uint32{0x0182fc3b, 0x020abeb3, 0x02b6034b, 0x0073c90b, 0x03cf8572, 0x02208404, 0x016b3fef, 0x03f8ae3b, 0x036b5606, 0x00107a3c}}}, + {X: Field{[10]uint32{0x033ebe6f, 0x030ddb94, 0x03320de0, 0x03c54c52, 0x006a6806, 0x023c0297, 0x0333d35e, 0x02d6f606, 0x03254ed0, 0x002bacb2}}, Y: Field{[10]uint32{0x01b9d59c, 0x03135a8a, 0x03d0b142, 0x003dda0c, 0x035d761c, 0x0320fcc5, 0x0028249f, 0x03e8b2cc, 0x02f52d7b, 0x001ae045}}}, + {X: Field{[10]uint32{0x00ca7895, 0x0330fd17, 0x03655fbb, 0x00eae8e8, 0x014cca66, 0x029e5e4a, 0x00adabe3, 0x00b25e80, 0x00bd55d6, 0x00321889}}, Y: Field{[10]uint32{0x011cc214, 0x00c8eef3, 0x00c21844, 0x014fea54, 0x001d8573, 0x0180276d, 0x0293adfa, 0x01e4d4d9, 0x03b7104f, 0x0028c668}}}, + {X: Field{[10]uint32{0x02efe561, 0x033eee8f, 0x03a66aac, 0x03814d2c, 0x00d53ddd, 0x03f739bd, 0x035a28bc, 0x01a8375e, 0x00cc2c57, 0x00074459}}, Y: Field{[10]uint32{0x004995a7, 0x0119c2ad, 0x0291c000, 0x022490fa, 0x01ec6009, 0x0311c391, 0x00ba6947, 0x03625ff3, 0x00deaa25, 0x002e1624}}}, + {X: Field{[10]uint32{0x0040e3c8, 0x00984629, 0x0393b92f, 0x01062f35, 0x035e7f0f, 0x03124f33, 0x036620a5, 0x0056d739, 0x02b413b9, 0x000ad53e}}, Y: Field{[10]uint32{0x039bf5d1, 0x03400593, 0x03cdb30a, 0x012c0bbf, 0x037a61ce, 0x037777cd, 0x01bdfefb, 0x02b635fa, 0x012556fe, 0x0022bfe3}}}, + {X: Field{[10]uint32{0x0329b340, 0x00ea9815, 0x0188709a, 0x0097cb7e, 0x03a9718c, 0x014f91b5, 0x01428ac8, 0x00a87d82, 0x0224a4e7, 0x0007c7ca}}, Y: Field{[10]uint32{0x00421cbd, 0x037c858b, 0x03170991, 0x00812c85, 0x020b6311, 0x01a1c40c, 0x0394f392, 0x002eeaf3, 0x00a4f492, 0x00011437}}}, + {X: Field{[10]uint32{0x00ebd4e5, 0x017b94b2, 0x03200f18, 0x0167c8bc, 0x0383fbc5, 0x0001f815, 0x025682c5, 0x01f93493, 0x018ee677, 0x00104bd9}}, Y: Field{[10]uint32{0x0171c8f4, 0x02de26d9, 0x00e32887, 0x038c9da4, 0x010c8399, 0x03e9932c, 0x030b3d7a, 0x0253fae4, 0x024a9d93, 0x0030b82d}}}, + {X: Field{[10]uint32{0x00f4912b, 0x007e1513, 0x011fbf56, 0x03e7e4b0, 0x0195102e, 0x019f8943, 0x02fec9a3, 0x02477a5d, 0x00b55677, 0x00212577}}, Y: Field{[10]uint32{0x02152443, 0x0270ca8a, 0x011c5e2a, 0x007d1938, 0x03542e51, 0x014ef693, 0x0263f191, 0x02093bd7, 0x01c57d3d, 0x00197e02}}}, + {X: Field{[10]uint32{0x0156cfde, 0x013fc216, 0x006ee1bb, 0x02a5e959, 0x030b4a18, 0x02172931, 0x0145b8bc, 0x032578ea, 0x01c0d841, 0x003e39ef}}, Y: Field{[10]uint32{0x00ed6d42, 0x03b7577c, 0x010111b4, 0x0358577d, 0x006d6660, 0x012e7f02, 0x009d28c2, 0x00d9e4df, 0x0083f93a, 0x0003342b}}}, + {X: Field{[10]uint32{0x02854c94, 0x00bdcc18, 0x0213164f, 0x0121db92, 0x008c8c56, 0x037ca2b5, 0x00767517, 0x0041c492, 0x025a4e4c, 0x0020c918}}, Y: Field{[10]uint32{0x039bfaeb, 0x03308c07, 0x003561f5, 0x032c902e, 0x01de65e2, 0x00189809, 0x01c7ec37, 0x00a09582, 0x01604992, 0x001d86c6}}}, + {X: Field{[10]uint32{0x03ca04d4, 0x03b61644, 0x032cf213, 0x0180c08f, 0x0216a8e1, 0x00d4f7c7, 0x00b6befd, 0x01f88abd, 0x01ff99f8, 0x0022c712}}, Y: Field{[10]uint32{0x03ad6c23, 0x006f78c8, 0x034c02ca, 0x01d5f89d, 0x006abbf9, 0x008b7894, 0x01cff728, 0x022194b4, 0x03d10e17, 0x00335144}}}, + {X: Field{[10]uint32{0x02f4f138, 0x02b2e0a5, 0x03790bca, 0x03ca1eba, 0x0259deac, 0x018c2d19, 0x0030e89d, 0x01360232, 0x01a120d2, 0x0038ab58}}, Y: Field{[10]uint32{0x02186291, 0x036f1bec, 0x0321abf5, 0x01a5800c, 0x02918497, 0x02b371f2, 0x02d29405, 0x01219f6a, 0x01dcfc1c, 0x00147346}}}, + {X: Field{[10]uint32{0x00c197a4, 0x038eb40d, 0x013ba9ea, 0x0339fd1e, 0x01e10356, 0x00c41580, 0x026aa915, 0x029bcc5a, 0x017ea9a9, 0x0003a373}}, Y: Field{[10]uint32{0x00ea6b5e, 0x0072a14e, 0x0295c2e6, 0x0249a9a1, 0x0195f698, 0x01c712b7, 0x02e2a99e, 0x02abd74c, 0x02d791f3, 0x00320d6e}}}, + {X: Field{[10]uint32{0x00f81233, 0x02423a6f, 0x03556e46, 0x02566c81, 0x00d8643f, 0x033ec171, 0x01bba690, 0x02e3bcd8, 0x00e35875, 0x003c2dd2}}, Y: Field{[10]uint32{0x01d6e908, 0x025006cb, 0x0023e91e, 0x02aea7fd, 0x01c1c0ae, 0x030a7298, 0x00765f60, 0x00e9ed9e, 0x02515d16, 0x001a8993}}}, + {X: Field{[10]uint32{0x01af3a87, 0x025f54ce, 0x017962ce, 0x02ba4faf, 0x03e6eef8, 0x03ff8908, 0x02dd305b, 0x016859d9, 0x016f0997, 0x0024037a}}, Y: Field{[10]uint32{0x01164478, 0x02a9c013, 0x01439650, 0x026c4848, 0x01f33f8e, 0x02f9a692, 0x031bf65d, 0x01628e8c, 0x02ecd9c0, 0x002252ac}}}, + {X: Field{[10]uint32{0x0188aa53, 0x0085283b, 0x00645a6e, 0x02879b4d, 0x01ce7fbd, 0x03a7b3e5, 0x030e3067, 0x008d081c, 0x0130d2ea, 0x00232f9e}}, Y: Field{[10]uint32{0x00186b83, 0x0377615c, 0x01ac9919, 0x01c3b01c, 0x0085092c, 0x008cb24d, 0x027f2c8e, 0x0299f6b8, 0x016bf875, 0x00219ec5}}}, + {X: Field{[10]uint32{0x0225e68d, 0x024bfb26, 0x003e69a2, 0x037f04d6, 0x00e79237, 0x0315c1b5, 0x01a65c0f, 0x03490e51, 0x01c95b35, 0x002832ec}}, Y: Field{[10]uint32{0x02047e4f, 0x0293ac60, 0x00a4055b, 0x00917a14, 0x013c6d70, 0x003701b8, 0x01c8a554, 0x006917e0, 0x01d13cd6, 0x002db5fa}}}, + {X: Field{[10]uint32{0x022463cf, 0x02912209, 0x03f4c832, 0x00f58ed1, 0x00d8050c, 0x017a61ff, 0x02d3bbe0, 0x0232d6a9, 0x0072a3fa, 0x000522ab}}, Y: Field{[10]uint32{0x037e4a61, 0x00ccc899, 0x000b292a, 0x02460963, 0x0372749f, 0x01bcb8ae, 0x0245f6d3, 0x0112156a, 0x0249a6e2, 0x001fca77}}}, + {X: Field{[10]uint32{0x02f3977f, 0x01f3ccd9, 0x018cefb0, 0x03e89688, 0x02c28616, 0x028838b9, 0x02caf7ef, 0x03f5b79b, 0x01073a1a, 0x000ee7fb}}, Y: Field{[10]uint32{0x02c65fc9, 0x01c00f04, 0x010fe0ac, 0x0284d23b, 0x034fa9e7, 0x025ab4f8, 0x030c936e, 0x03259287, 0x033c5084, 0x003c2a16}}}, + {X: Field{[10]uint32{0x023537aa, 0x0196b1f3, 0x020fecc5, 0x03ab7eff, 0x027c9cbc, 0x003e90c6, 0x03b443c3, 0x02ff6555, 0x00ed5228, 0x001f7917}}, Y: Field{[10]uint32{0x022686f0, 0x027377be, 0x00fc1199, 0x02298326, 0x0178e011, 0x0315418b, 0x03794f3a, 0x01c0cef2, 0x01376910, 0x00145777}}}, + {X: Field{[10]uint32{0x01913dd2, 0x03986c95, 0x015aa251, 0x0273ae87, 0x03c17cf9, 0x013cea15, 0x00102747, 0x03d58a60, 0x035a0534, 0x00273068}}, Y: Field{[10]uint32{0x02433ae5, 0x005a130f, 0x007ccc69, 0x010ebcaf, 0x03c653e2, 0x02fe384b, 0x0115da37, 0x0293e658, 0x01a8f30f, 0x003024b3}}}, + {X: Field{[10]uint32{0x02b52ec6, 0x002da41e, 0x00562092, 0x03ec8896, 0x0310fc71, 0x00a29ca0, 0x02ad7298, 0x00ee731d, 0x0168759b, 0x00360bc6}}, Y: Field{[10]uint32{0x0018c607, 0x002bd422, 0x03306c47, 0x020b72b0, 0x011b3720, 0x03872760, 0x0008f8ca, 0x00ec31ce, 0x02052698, 0x00153342}}}, + {X: Field{[10]uint32{0x007b7586, 0x0257ab6e, 0x02498241, 0x01221796, 0x0101f9c5, 0x00a46d83, 0x031bffcc, 0x016a5430, 0x014703d9, 0x0005b9aa}}, Y: Field{[10]uint32{0x03d8aafd, 0x00b15636, 0x03276f88, 0x02393b5c, 0x0080ff4c, 0x02a55f01, 0x010d3655, 0x01ae30b9, 0x0138581b, 0x000678a6}}}, + {X: Field{[10]uint32{0x035cd237, 0x0263948e, 0x03197ff0, 0x01395e85, 0x03ad57a7, 0x01df0d18, 0x02b46704, 0x013c9391, 0x02f300ee, 0x00341f9e}}, Y: Field{[10]uint32{0x035d0e20, 0x01bc9304, 0x00b1bc69, 0x037adbc8, 0x00d4d175, 0x03d86222, 0x031019be, 0x005959a6, 0x020f43c9, 0x003ffcd3}}}, + {X: Field{[10]uint32{0x01665380, 0x007d3679, 0x0301450a, 0x02e43260, 0x018ffe42, 0x00fea93a, 0x02118a34, 0x009ff18e, 0x00e56dc0, 0x000afd91}}, Y: Field{[10]uint32{0x02262ec5, 0x013e4956, 0x00477c92, 0x017d9ba9, 0x03eb84ca, 0x001ad57d, 0x0366fb7a, 0x007f17e3, 0x017577be, 0x002fbd70}}}, + {X: Field{[10]uint32{0x005cb045, 0x03b5493f, 0x03a3ab97, 0x01f97897, 0x027a8810, 0x010965f1, 0x00801014, 0x036e4d23, 0x01370db1, 0x001463c3}}, Y: Field{[10]uint32{0x014d7294, 0x0280e5da, 0x037418db, 0x03d37e2a, 0x006eb9f3, 0x0125d094, 0x03113a14, 0x03b4059b, 0x010ea4e9, 0x00372a1d}}}, + {X: Field{[10]uint32{0x030554c7, 0x031c975b, 0x0128e9a9, 0x02ea1e66, 0x0057bf54, 0x03087d89, 0x029893f8, 0x01d284af, 0x02b6c507, 0x0002f523}}, Y: Field{[10]uint32{0x0170f6e1, 0x03e9e1fd, 0x002d2e2c, 0x01418c9d, 0x00dd58f3, 0x01da7dce, 0x034bad90, 0x000c019d, 0x01a8cd8f, 0x0008029b}}}, + {X: Field{[10]uint32{0x031517e2, 0x02678d36, 0x031302aa, 0x01178f02, 0x00800c5b, 0x0193e870, 0x0336622b, 0x01a78da4, 0x013a8711, 0x00333236}}, Y: Field{[10]uint32{0x0101d845, 0x03f5b0db, 0x0305611e, 0x00252027, 0x00888373, 0x0115219a, 0x0211f1bc, 0x0191e3be, 0x03e4d45e, 0x000103b9}}}, + {X: Field{[10]uint32{0x03f6bd1a, 0x0149fc76, 0x03dab8f4, 0x00703f09, 0x0327e8d0, 0x01efa7a9, 0x01d2e9a2, 0x01e648c4, 0x012c7587, 0x0021bd8e}}, Y: Field{[10]uint32{0x010f7922, 0x02bcd340, 0x02dd3e7c, 0x0063f51a, 0x00571505, 0x0127b9a4, 0x02b1304c, 0x02a8a8f4, 0x0211b647, 0x001fb8a5}}}, + {X: Field{[10]uint32{0x03d7fdfd, 0x010760ed, 0x01c1bbfc, 0x0205b687, 0x019bb5a3, 0x00e1d47e, 0x03941053, 0x003e9b0d, 0x00e5927b, 0x00380d3d}}, Y: Field{[10]uint32{0x01a5f89d, 0x01239d50, 0x03b6ff22, 0x01eec9e7, 0x01e90256, 0x02fb72ae, 0x0282b05c, 0x010b904c, 0x02cb8382, 0x003727c0}}}, + {X: Field{[10]uint32{0x02b51045, 0x02d2731a, 0x01062837, 0x03bee1b8, 0x0075eadf, 0x02e09544, 0x023a66a0, 0x02fc017b, 0x02160a9d, 0x0023f0da}}, Y: Field{[10]uint32{0x03d200a6, 0x02526648, 0x0374a705, 0x009e7b27, 0x0266a885, 0x0001292f, 0x03d9957a, 0x02607485, 0x00409605, 0x0031fb8b}}}, + {X: Field{[10]uint32{0x033278e0, 0x002b7239, 0x0112d9c1, 0x037ad45f, 0x03997130, 0x019773f8, 0x0089b71e, 0x01f65b59, 0x00bc5407, 0x0035eed0}}, Y: Field{[10]uint32{0x028b0a4b, 0x0241d2a9, 0x01b468ce, 0x02f8ea2a, 0x025897c0, 0x025ad72d, 0x020706bd, 0x02eb916a, 0x03662f64, 0x00388258}}}, + {X: Field{[10]uint32{0x03bd2ac5, 0x0382a218, 0x007e0b8b, 0x020455ec, 0x003c8826, 0x00997390, 0x007d2d6c, 0x031c5045, 0x02858054, 0x0035cd5d}}, Y: Field{[10]uint32{0x01a9932b, 0x00baf961, 0x019c24f4, 0x0294e031, 0x01d2ce03, 0x03356013, 0x014099e9, 0x0108e709, 0x014b2fc9, 0x00253e1d}}}, + {X: Field{[10]uint32{0x018f8392, 0x02b836a1, 0x002b6669, 0x03f595f7, 0x013e720f, 0x034ff859, 0x01a7e99b, 0x00ffe9c7, 0x02aed935, 0x0016dbe2}}, Y: Field{[10]uint32{0x018f9089, 0x013d1cd0, 0x03c106e7, 0x0100c094, 0x03e49668, 0x0138917c, 0x02f85ec3, 0x01bbb7e9, 0x0105369c, 0x0013babf}}}, + {X: Field{[10]uint32{0x02222000, 0x01cb1390, 0x03b39f7b, 0x02806683, 0x02ab4076, 0x0313d221, 0x004b4f49, 0x00a7900e, 0x011267cc, 0x000e5113}}, Y: Field{[10]uint32{0x0283d771, 0x02806872, 0x010ba50e, 0x015c6ddf, 0x01329f30, 0x014e23ae, 0x0248adf3, 0x03b8b637, 0x002aaf90, 0x00197094}}}, + {X: Field{[10]uint32{0x030752c7, 0x021222c6, 0x010030a1, 0x02573b0b, 0x0216ebad, 0x02f26223, 0x019c4a7d, 0x02c28f05, 0x00dbf1ef, 0x0014f780}}, Y: Field{[10]uint32{0x01e2fbda, 0x0158c881, 0x026d33a5, 0x01993452, 0x0287dc61, 0x039ef146, 0x02d62285, 0x0177e9d4, 0x03d99947, 0x000ca3b2}}}, + {X: Field{[10]uint32{0x015ead39, 0x0052932f, 0x019e3d48, 0x033bad23, 0x03194d1b, 0x017ed80c, 0x000eef0d, 0x01c84f8a, 0x03af9b4f, 0x0001228e}}, Y: Field{[10]uint32{0x00334186, 0x026a2eca, 0x029ce709, 0x03b512a6, 0x037e749e, 0x03252c83, 0x006f7fbc, 0x00e14aef, 0x01c9e04a, 0x000ed2b2}}}, + {X: Field{[10]uint32{0x033ac541, 0x011c1f96, 0x02b6eb52, 0x001be85b, 0x03acccf4, 0x009f88b5, 0x00182370, 0x0073b4f1, 0x0230503c, 0x003c035d}}, Y: Field{[10]uint32{0x01ca95b5, 0x015c6dcc, 0x00404f47, 0x03ff6df4, 0x03c9e2bc, 0x03e3b564, 0x0254605d, 0x01d89ac4, 0x013fec17, 0x00268777}}}, + {X: Field{[10]uint32{0x0141eaac, 0x02099622, 0x01ee89a4, 0x03210205, 0x00c4f8ee, 0x03a30868, 0x01708582, 0x03ad6439, 0x01943ce7, 0x00387fc6}}, Y: Field{[10]uint32{0x03353b7e, 0x02d25cb5, 0x003dd003, 0x00faf0db, 0x01dbf27e, 0x022a95fa, 0x021b53d7, 0x01cb9b39, 0x0172746e, 0x0014a395}}}, + {X: Field{[10]uint32{0x0059bd49, 0x00afbc1d, 0x02c55256, 0x00116456, 0x0223b3aa, 0x01d709ef, 0x015a6652, 0x01d43838, 0x0020c48e, 0x00393c4f}}, Y: Field{[10]uint32{0x0287ca30, 0x008731db, 0x01ebca2d, 0x014cd8aa, 0x03639010, 0x01ec6eec, 0x026b9d6a, 0x007e668b, 0x02cec6e5, 0x002faf1f}}}, + {X: Field{[10]uint32{0x006f5f20, 0x035720e2, 0x03ea4d2d, 0x0012b1a4, 0x01598c6c, 0x0033c9c6, 0x003d3716, 0x019ba1c2, 0x00f3824b, 0x0038dba3}}, Y: Field{[10]uint32{0x0086c60b, 0x03432f68, 0x009f6c88, 0x03a193c9, 0x00f5be9f, 0x02069537, 0x03749104, 0x015f7cf6, 0x01938afe, 0x0013a838}}}, + {X: Field{[10]uint32{0x0246365f, 0x03478349, 0x0172a63d, 0x0373f7a5, 0x03797ff5, 0x0135f151, 0x00b4a068, 0x034beca7, 0x03193286, 0x0014787c}}, Y: Field{[10]uint32{0x02370e3a, 0x00b321d4, 0x01cb2ace, 0x03b6e519, 0x03b8640c, 0x03130f50, 0x0290d7e6, 0x03b318c6, 0x023c6f30, 0x002b11c3}}}, + {X: Field{[10]uint32{0x01a5fae0, 0x033de735, 0x0224829b, 0x01055b4a, 0x0022277f, 0x016f09b7, 0x01dadd64, 0x0139c981, 0x02a9c40d, 0x0023a0b6}}, Y: Field{[10]uint32{0x027c53ee, 0x03666e05, 0x024d733a, 0x0078ca84, 0x03b01b96, 0x00cf8a46, 0x0191dd72, 0x015ec8ac, 0x01fdbe90, 0x001fe055}}}, + {X: Field{[10]uint32{0x022c41e3, 0x006cd64f, 0x02595988, 0x01d1938a, 0x0038bea6, 0x0097e9e2, 0x03fd5e95, 0x01ea90d3, 0x0344273c, 0x001e7959}}, Y: Field{[10]uint32{0x0385ecab, 0x01b9f2fc, 0x03c33e80, 0x0083c9e2, 0x03eb786a, 0x011c48b5, 0x00ec764b, 0x03bee7c0, 0x01a3c50d, 0x00189422}}}, + {X: Field{[10]uint32{0x02743f79, 0x03b4fd98, 0x0206879d, 0x015bcbc7, 0x02af7fe1, 0x01389288, 0x01eb8918, 0x00655d47, 0x00e2d19c, 0x002a5f80}}, Y: Field{[10]uint32{0x018284a0, 0x029425f3, 0x03282944, 0x0177a9ce, 0x02f3f583, 0x0113fe47, 0x00726bbc, 0x00b124d5, 0x02bd8bcb, 0x0022075f}}}, + {X: Field{[10]uint32{0x03338542, 0x01c1c9c2, 0x00aa8f4a, 0x02fa3ece, 0x009bc52f, 0x001508de, 0x021c3fb4, 0x03d70c53, 0x014607bb, 0x000efc41}}, Y: Field{[10]uint32{0x024f6367, 0x010b1900, 0x022b6390, 0x01479611, 0x019a87ba, 0x03e10381, 0x0068e5fe, 0x02dffdb7, 0x006cfad5, 0x0039e256}}}, + {X: Field{[10]uint32{0x01d9cc5d, 0x012202d5, 0x03b2e01f, 0x033e10df, 0x0249cce0, 0x033cd01a, 0x034ee87e, 0x0077fce6, 0x00775879, 0x00200a5b}}, Y: Field{[10]uint32{0x00152dcb, 0x031376e4, 0x01284846, 0x00d2f6c2, 0x00902e48, 0x0022f145, 0x028753b7, 0x01e07f38, 0x02113c7f, 0x000ec1af}}}, + {X: Field{[10]uint32{0x00ba52fe, 0x02594188, 0x03023598, 0x013a1f95, 0x01b7b0fe, 0x016713fc, 0x029cc123, 0x036ff7da, 0x037aa3ee, 0x001238b2}}, Y: Field{[10]uint32{0x02e8ed1b, 0x01592c27, 0x00aac7ad, 0x00c4f3fd, 0x00a0a456, 0x01fdcbb8, 0x00411ba8, 0x026ef165, 0x017afa90, 0x00371e10}}}, + {X: Field{[10]uint32{0x03403d46, 0x02016a5c, 0x00b6b7b4, 0x00ba65cc, 0x0031a3db, 0x0061f5e7, 0x02b482aa, 0x015220a1, 0x011fcb77, 0x0037244d}}, Y: Field{[10]uint32{0x03adb1a3, 0x00ffe5bd, 0x01b2ffa9, 0x01713942, 0x03fc52e3, 0x03827e97, 0x0180ecd5, 0x0064ba30, 0x020d2d13, 0x003b5c83}}}, + {X: Field{[10]uint32{0x0190a670, 0x025cc67a, 0x02b9f017, 0x014d6c14, 0x013a2b26, 0x03ecd13a, 0x0105b151, 0x02d3ea73, 0x013948ce, 0x00174df0}}, Y: Field{[10]uint32{0x0174cb01, 0x01b54e86, 0x0348a185, 0x0349f279, 0x00b62e16, 0x02e5018d, 0x02832ad6, 0x02e9201e, 0x033c2590, 0x003de424}}}, + {X: Field{[10]uint32{0x03070aa2, 0x03b285dd, 0x00157708, 0x0096b67a, 0x0015c8e3, 0x02a123fd, 0x017eece0, 0x026c89bf, 0x02b0f8d6, 0x00262f2e}}, Y: Field{[10]uint32{0x02150212, 0x0379637a, 0x002060e2, 0x01266ec4, 0x03a08aa9, 0x008629fb, 0x02ffd615, 0x01521f9a, 0x03b3db71, 0x001d9c78}}}, + {X: Field{[10]uint32{0x0335b1c5, 0x0170448f, 0x03a188fa, 0x02340891, 0x0012ce30, 0x01640cd0, 0x0194384d, 0x0121bbe9, 0x01cb3de9, 0x001838b0}}, Y: Field{[10]uint32{0x0369d1bb, 0x010bcbe4, 0x008fa639, 0x021ada38, 0x024d58d0, 0x014efdc8, 0x03c11a38, 0x0319bd70, 0x031b9767, 0x001b79c0}}}, + {X: Field{[10]uint32{0x004885c7, 0x00fa9c8c, 0x03467d87, 0x02ecca7a, 0x01aaf513, 0x038be6f3, 0x03f2f702, 0x015add42, 0x02c5aa82, 0x002051c5}}, Y: Field{[10]uint32{0x03d297ee, 0x00290b71, 0x00b58630, 0x0324283f, 0x01eb7efa, 0x00d4cf7a, 0x03ba31e2, 0x0186244f, 0x00ee8fa9, 0x003b2991}}}, + {X: Field{[10]uint32{0x02f8de77, 0x024d3edc, 0x00e3be6d, 0x0218803a, 0x019fb715, 0x00d9a1b5, 0x0360f7b6, 0x004bbc2b, 0x033f1db4, 0x00095e27}}, Y: Field{[10]uint32{0x007de0ac, 0x0320c08b, 0x00ce9633, 0x00ee3163, 0x02863bc0, 0x022069a1, 0x034a6f77, 0x03886d5c, 0x039899d1, 0x00394889}}}, + {X: Field{[10]uint32{0x00f1bdcd, 0x02337ca8, 0x01527ef1, 0x0079e028, 0x0227f2a9, 0x00ff2da9, 0x02a87fdf, 0x03e39591, 0x000c98bf, 0x0014e0bd}}, Y: Field{[10]uint32{0x0232b502, 0x03a17192, 0x0079d9a1, 0x0360e31e, 0x0239c027, 0x02765e85, 0x0068ce13, 0x028e8768, 0x01dee41c, 0x0008c740}}}, + {X: Field{[10]uint32{0x011d1f2b, 0x00c8e2e8, 0x01dc6e57, 0x02cfc63a, 0x0167d9ec, 0x03d5f740, 0x02ab14d8, 0x03eb7ff2, 0x01209db2, 0x0011233f}}, Y: Field{[10]uint32{0x0166fea6, 0x0070c564, 0x005875a1, 0x019c2548, 0x032ba1bb, 0x0134a092, 0x01e8d181, 0x015b090d, 0x02e55a4f, 0x002eb638}}}, + {X: Field{[10]uint32{0x02e5653d, 0x02befa00, 0x02ab5667, 0x00f7ad84, 0x01f6c489, 0x01112efe, 0x012b69d5, 0x00cd7d40, 0x024b0fe6, 0x003645f2}}, Y: Field{[10]uint32{0x032bad17, 0x0216ebbc, 0x0033a4bb, 0x0154c40b, 0x00aeabc0, 0x005f397c, 0x0150f1ff, 0x025d589e, 0x024be6a4, 0x000ff7a6}}}, + {X: Field{[10]uint32{0x01ba8f72, 0x017c93a4, 0x00570db3, 0x0398293a, 0x031dd974, 0x038fbd60, 0x03de053b, 0x020eb5cc, 0x01f517a8, 0x00031fba}}, Y: Field{[10]uint32{0x039bba44, 0x03f41881, 0x01f3a2bf, 0x0134b7ce, 0x02e06a7e, 0x01a82338, 0x03d2a31c, 0x019efd95, 0x038d26d3, 0x00236ddc}}}, + {X: Field{[10]uint32{0x00d9a30b, 0x00217825, 0x00aed0b7, 0x02e28cab, 0x00819a77, 0x01f210ef, 0x022b1737, 0x035b781e, 0x019d983e, 0x0020fc28}}, Y: Field{[10]uint32{0x00afe6a7, 0x03d21d4b, 0x00e00c37, 0x011db55d, 0x00880acd, 0x0044ef98, 0x0348b636, 0x0111cf61, 0x029667be, 0x0034aacf}}}, + {X: Field{[10]uint32{0x0313989d, 0x02649dc8, 0x02f2e2b2, 0x01e41f14, 0x01596740, 0x01d360f7, 0x03b56bde, 0x01f10263, 0x026a6168, 0x003cfe2a}}, Y: Field{[10]uint32{0x01a109fb, 0x00e653d0, 0x03a21ad6, 0x0130da15, 0x00caa1b5, 0x02258d97, 0x0201ff9a, 0x000e8cb4, 0x009d0985, 0x000e9a43}}}, + {X: Field{[10]uint32{0x0032249e, 0x03b87fd4, 0x0316a283, 0x01010e11, 0x03914fdd, 0x03af2d39, 0x01d6e8b3, 0x035b1f65, 0x01caa30b, 0x00130684}}, Y: Field{[10]uint32{0x01424da0, 0x0394856e, 0x028809b7, 0x01f0dfe0, 0x006598f1, 0x0194ce74, 0x014c604e, 0x03bd0348, 0x00c94653, 0x0039f9c6}}}, + {X: Field{[10]uint32{0x02e5477d, 0x008b064f, 0x00f6c1d9, 0x03216872, 0x02529ebb, 0x0083cc60, 0x033bdb04, 0x0280614f, 0x01523419, 0x000a506e}}, Y: Field{[10]uint32{0x02628413, 0x00e4b74f, 0x02763864, 0x01442260, 0x0280482b, 0x03db07b7, 0x0205baa7, 0x019a82aa, 0x026c29ca, 0x000ddfc8}}}, + {X: Field{[10]uint32{0x0191a6a1, 0x00858761, 0x032c3384, 0x03bf8615, 0x004b5f25, 0x031c1e2b, 0x03b3eb18, 0x026be196, 0x0107aad4, 0x00027413}}, Y: Field{[10]uint32{0x0083cd34, 0x004ae88b, 0x03724f85, 0x03287523, 0x02779eb0, 0x0065912d, 0x01ae02d1, 0x02a27ed1, 0x028dec2c, 0x003d5ca5}}}, + {X: Field{[10]uint32{0x03d26e20, 0x011ac190, 0x03ef4a26, 0x01405def, 0x000d660c, 0x02988a09, 0x01a983c9, 0x028406e6, 0x0367c3c3, 0x0011007d}}, Y: Field{[10]uint32{0x02d4e342, 0x019a77a1, 0x00c0bb7d, 0x037bba60, 0x02999f8b, 0x03419a79, 0x00293091, 0x00453859, 0x02f78e1b, 0x001e54be}}}, + {X: Field{[10]uint32{0x03bba31f, 0x02dfc306, 0x03fa68d7, 0x0311eca0, 0x000ab8a1, 0x033218ea, 0x028665ba, 0x005f4ecc, 0x0027fc40, 0x00252dbd}}, Y: Field{[10]uint32{0x0340d85a, 0x028085f7, 0x01868e09, 0x0096a660, 0x019cbe77, 0x027741ea, 0x008199e9, 0x034b51bb, 0x027d35f0, 0x0004cd81}}}, + {X: Field{[10]uint32{0x01e7288f, 0x026d2893, 0x01445738, 0x027e4809, 0x03f2fba5, 0x039d55d2, 0x03b87cdd, 0x026ef518, 0x03a292c7, 0x00105886}}, Y: Field{[10]uint32{0x02cd3188, 0x0328b868, 0x0111b717, 0x001eca53, 0x033bc70a, 0x0399ee50, 0x0389951f, 0x002de204, 0x03d5b6f3, 0x000d54cd}}}, + {X: Field{[10]uint32{0x01a3594e, 0x030e67bf, 0x0173fc33, 0x02eaac53, 0x038a9b27, 0x0049a062, 0x0100dde6, 0x03074d56, 0x00156256, 0x002c20e1}}, Y: Field{[10]uint32{0x01a954a5, 0x01a11d71, 0x02c7dc5d, 0x034541a7, 0x03843ef8, 0x01a90a17, 0x00c5371b, 0x018b8a47, 0x019055b1, 0x000aabe4}}}, + {X: Field{[10]uint32{0x000dc9bd, 0x0249d19b, 0x008fb8ba, 0x004c3a11, 0x027d910f, 0x03330509, 0x029f4377, 0x023fa977, 0x014fef41, 0x00332668}}, Y: Field{[10]uint32{0x00536f28, 0x02baedc6, 0x017f5c77, 0x0364b3ff, 0x0222f7b3, 0x030326fc, 0x02f164ba, 0x0304b750, 0x03647c01, 0x0000b8c2}}}, + {X: Field{[10]uint32{0x01764e37, 0x01083741, 0x01d50a2f, 0x02d6e59f, 0x027b21d6, 0x03601763, 0x025d59c1, 0x00616355, 0x024adbec, 0x00234aec}}, Y: Field{[10]uint32{0x019f712f, 0x0052fe26, 0x005efe70, 0x0035a959, 0x02fc371d, 0x022824c8, 0x02537c70, 0x02bae9c4, 0x0330e78d, 0x003371b5}}}, + {X: Field{[10]uint32{0x010f7c9b, 0x008ce8f9, 0x0219203b, 0x01bc9d08, 0x00dbb94c, 0x01d438ca, 0x00a18717, 0x033d2b9b, 0x02de0f18, 0x0018f3b9}}, Y: Field{[10]uint32{0x02fdfeb8, 0x00d05cc7, 0x014367ca, 0x00c784d9, 0x00ce0050, 0x02a2160a, 0x0231b8f7, 0x008ce86d, 0x01adad2d, 0x002048c3}}}, + {X: Field{[10]uint32{0x02755a0c, 0x029679a4, 0x02114926, 0x01fee3d1, 0x02b2e4d0, 0x02e86776, 0x028d5cbf, 0x03740e69, 0x029c1dc6, 0x00188213}}, Y: Field{[10]uint32{0x01061a26, 0x03662dc1, 0x0302cc4b, 0x006bef37, 0x02cc9c7f, 0x02a09f82, 0x01c273aa, 0x006bc003, 0x00f462fb, 0x001b6fad}}}, + {X: Field{[10]uint32{0x018dd827, 0x01cd8957, 0x01238c27, 0x00ddf7de, 0x003f34a9, 0x01c1cab3, 0x02368ec1, 0x018a0053, 0x02baf65b, 0x00044303}}, Y: Field{[10]uint32{0x02e75c6d, 0x03fe16ca, 0x02ba9649, 0x01d0b6be, 0x030c3c3e, 0x00082e0e, 0x01d5865b, 0x01896258, 0x03166f23, 0x000692e9}}}, + {X: Field{[10]uint32{0x01c87e00, 0x01f279bc, 0x012b6892, 0x01748f34, 0x01baa50a, 0x02ae5d01, 0x007306cf, 0x008d2ea0, 0x011e50fb, 0x00361229}}, Y: Field{[10]uint32{0x016a4fd8, 0x01cadbea, 0x02adc16a, 0x027cf2de, 0x0151fdb4, 0x0265127b, 0x02e4b1cc, 0x00032132, 0x026288fb, 0x00276e6f}}}, + {X: Field{[10]uint32{0x014c2b5a, 0x03269f38, 0x0002396b, 0x0181606c, 0x02a8cf26, 0x02406e7b, 0x0147f3b3, 0x01aad149, 0x0093a270, 0x00108c46}}, Y: Field{[10]uint32{0x024165bc, 0x034f4b2b, 0x00d70daa, 0x0073a7bd, 0x03d6129a, 0x01d82691, 0x01c2a9f7, 0x0088b066, 0x02db9ba6, 0x001d43e1}}}, + {X: Field{[10]uint32{0x0034d37f, 0x02bb038e, 0x037419fd, 0x00797c5f, 0x026b252f, 0x01f2878c, 0x03454967, 0x037104cb, 0x00ee471a, 0x00110e71}}, Y: Field{[10]uint32{0x01897e87, 0x0003b95d, 0x0119581a, 0x0196ce16, 0x03617c95, 0x03e1be4e, 0x0316ab66, 0x030f798b, 0x032c22c5, 0x002f5d70}}}, + {X: Field{[10]uint32{0x0113b053, 0x02b2bfb0, 0x03bbf36b, 0x01e6601b, 0x02e02e9e, 0x0314bf6d, 0x00b0bbd8, 0x00c76992, 0x03dab192, 0x00137f38}}, Y: Field{[10]uint32{0x03042c3a, 0x01168a84, 0x0342f69d, 0x01650bfa, 0x029d647c, 0x011f3068, 0x00a1c3e1, 0x01fee910, 0x031f4b72, 0x0037a317}}}, + {X: Field{[10]uint32{0x0117dc9d, 0x03bfe6e0, 0x009efcdd, 0x03cfb1b6, 0x009d0ba6, 0x0207db05, 0x00f91582, 0x009cdbd5, 0x032ee8e7, 0x000eee8a}}, Y: Field{[10]uint32{0x0216ab24, 0x02428c36, 0x00d2baf6, 0x021a9a98, 0x036f9a21, 0x02bdb283, 0x0293f947, 0x01f95b97, 0x02747789, 0x003fc21c}}}, + {X: Field{[10]uint32{0x0317deae, 0x01f59f60, 0x0059527f, 0x003d3eec, 0x00e239a0, 0x03d56ac3, 0x02d92ff0, 0x031ac920, 0x0243037b, 0x0028bfb7}}, Y: Field{[10]uint32{0x01869ed4, 0x00d8e351, 0x012da98c, 0x0058bc61, 0x000f7801, 0x0033808b, 0x008e195d, 0x03ff5fbc, 0x010843be, 0x000a9e45}}}, + {X: Field{[10]uint32{0x004bc0a3, 0x00730f8c, 0x021852cb, 0x002610c2, 0x01b3d64d, 0x01cdc021, 0x01aa8e67, 0x03ad3128, 0x022ff503, 0x00088713}}, Y: Field{[10]uint32{0x01b7ae41, 0x00477465, 0x02de199e, 0x00a52898, 0x01a70a79, 0x034fe1d9, 0x024fd70a, 0x0139e704, 0x031b0f95, 0x0030f0de}}}, + {X: Field{[10]uint32{0x00740ed0, 0x03bcf145, 0x00bfca58, 0x02f55679, 0x02f909c8, 0x026e44c1, 0x02f945b4, 0x02e81432, 0x0380f7e4, 0x002830cb}}, Y: Field{[10]uint32{0x02f9562a, 0x0286244d, 0x02c9041b, 0x0318e290, 0x01966aa1, 0x033b5172, 0x01e4cfbd, 0x011c0107, 0x030146ab, 0x0034fae3}}}, + {X: Field{[10]uint32{0x00da85c6, 0x01e6f906, 0x02aa1dff, 0x02573258, 0x010bf333, 0x01dd0204, 0x01e1ca75, 0x0189fc00, 0x0218b4fe, 0x001d8b9e}}, Y: Field{[10]uint32{0x00f51ec5, 0x024c8d31, 0x02b93dce, 0x02552bd5, 0x025875f7, 0x01156e10, 0x00a743c3, 0x00703d3e, 0x03465046, 0x002837c3}}}, + {X: Field{[10]uint32{0x013a29f0, 0x018cb12e, 0x03561b8d, 0x00d0451b, 0x0378389f, 0x010cdec7, 0x02cfbe40, 0x032bcf55, 0x0135cd95, 0x000bc0b6}}, Y: Field{[10]uint32{0x00f44569, 0x013a49c6, 0x0287b0e7, 0x010704bf, 0x0209c454, 0x008fc68c, 0x0008872b, 0x0242d3e0, 0x00d823f1, 0x0005cd1c}}}, + {X: Field{[10]uint32{0x03eab212, 0x0398e4b9, 0x01612314, 0x01b893bc, 0x01c5877d, 0x03f2628e, 0x01adbd59, 0x005b7c71, 0x03d72eb8, 0x00327e1d}}, Y: Field{[10]uint32{0x02067c4c, 0x0216391a, 0x03ad10b0, 0x0149d52c, 0x0188bb00, 0x03f2aa7d, 0x01a52b58, 0x01fbb169, 0x011788cf, 0x000533a6}}}, + {X: Field{[10]uint32{0x00baa172, 0x03485e68, 0x005df239, 0x008eb9db, 0x02d6dd1c, 0x032fd743, 0x03296df6, 0x0172de9b, 0x036918a0, 0x0033137f}}, Y: Field{[10]uint32{0x014a4dc6, 0x01a51219, 0x00cd5b78, 0x02ead4e4, 0x02e4dda0, 0x018ed295, 0x01b06506, 0x005d4098, 0x00b1b847, 0x0007350e}}}, + {X: Field{[10]uint32{0x03cbfaa1, 0x03b20a3b, 0x02a5bccc, 0x02299591, 0x01ca015a, 0x01e2b354, 0x0010219a, 0x01c4e8a7, 0x034b3ed2, 0x003eaab1}}, Y: Field{[10]uint32{0x0130d934, 0x03d9869f, 0x00ecbf8b, 0x03244fef, 0x01b2e74c, 0x03f9e552, 0x025c46b7, 0x03b036f5, 0x003bdcc2, 0x002b72b5}}}, + {X: Field{[10]uint32{0x00fdbf46, 0x02bbf111, 0x02480dd0, 0x03c8f468, 0x028a0025, 0x016f9b03, 0x01444b73, 0x026f4368, 0x02c930fa, 0x0005c4d5}}, Y: Field{[10]uint32{0x009bce3f, 0x00526ee7, 0x0214eb2e, 0x0134bb8a, 0x0062e246, 0x008e6395, 0x004361ed, 0x03ee76ad, 0x02dc991e, 0x001dc3a7}}}, + {X: Field{[10]uint32{0x01680214, 0x00401ef9, 0x01b43b64, 0x01e81ea0, 0x01c05501, 0x017e7ec6, 0x01491af5, 0x00dd8f4b, 0x016ae047, 0x00024cfd}}, Y: Field{[10]uint32{0x00ea76ad, 0x02a72ae8, 0x02ba9f85, 0x03fe4ec7, 0x01ad1d70, 0x01253950, 0x01ea647f, 0x036d8d20, 0x0047481c, 0x00198167}}}, + {X: Field{[10]uint32{0x03bb6b34, 0x0307f816, 0x02cf664a, 0x01d87b06, 0x018a397f, 0x02f27272, 0x02446910, 0x02b4df5f, 0x0322b182, 0x00028c03}}, Y: Field{[10]uint32{0x0033593d, 0x00aead15, 0x035007b4, 0x011188a2, 0x01684abe, 0x01c8bc85, 0x00de2694, 0x01d2e518, 0x03fca909, 0x002f5bcb}}}, + {X: Field{[10]uint32{0x038fe1ea, 0x01b8fb2b, 0x03fd685d, 0x02d54a38, 0x00878b79, 0x03b9358c, 0x03c1d62d, 0x004d57e5, 0x03ed6e90, 0x003f1795}}, Y: Field{[10]uint32{0x035bab01, 0x02a6cacb, 0x01d498c4, 0x0124d172, 0x02bc7c85, 0x02141efb, 0x018b1b56, 0x032ee796, 0x027a6c21, 0x00044884}}}, + {X: Field{[10]uint32{0x0231ef3d, 0x0114bed4, 0x00bfff3f, 0x015ba8d0, 0x030899e9, 0x02406548, 0x00721c19, 0x02047ef5, 0x00e27a64, 0x00168bd0}}, Y: Field{[10]uint32{0x0093d547, 0x0048b4c8, 0x0086c20a, 0x00e989e6, 0x01d8c4a5, 0x0275c70c, 0x0206d263, 0x0231e5d2, 0x015d1257, 0x001acafe}}}, + {X: Field{[10]uint32{0x00f2084f, 0x005e6d59, 0x033106f9, 0x01f63747, 0x02fb1575, 0x01f5fbd8, 0x036610d6, 0x026716f9, 0x0333df0b, 0x00165e0c}}, Y: Field{[10]uint32{0x025b7f5a, 0x01d9a51f, 0x00c4fa76, 0x025f0d3d, 0x037d309d, 0x029d60fa, 0x03f4623b, 0x005c3204, 0x0280dd3d, 0x003caa7a}}}, + {X: Field{[10]uint32{0x03672d95, 0x01b6c7cd, 0x00a08154, 0x035d329f, 0x01a1c8be, 0x01e8a70b, 0x0372bb38, 0x00ff21cf, 0x01246b51, 0x00033d84}}, Y: Field{[10]uint32{0x038c70ee, 0x03deaf0b, 0x007873ef, 0x03d0b81f, 0x021e182c, 0x0187ec3f, 0x011d1a56, 0x00110e7b, 0x0076697f, 0x00348f0f}}}, + {X: Field{[10]uint32{0x03fe7d52, 0x012c5ccb, 0x017baac1, 0x032581a5, 0x031cb871, 0x0018fe3a, 0x02eb7eb8, 0x00520389, 0x0305133a, 0x003b7453}}, Y: Field{[10]uint32{0x00b1b70a, 0x017e358d, 0x0392a61b, 0x00203291, 0x02ee6033, 0x011709d3, 0x01b3aa84, 0x0354a130, 0x0280d295, 0x0035a0bc}}}, + {X: Field{[10]uint32{0x001a1713, 0x036571ff, 0x000d175f, 0x00c2977a, 0x0033cb8d, 0x0325649b, 0x026e7902, 0x022bce2c, 0x00e90cdc, 0x003e6c3f}}, Y: Field{[10]uint32{0x02a3e6ac, 0x0148903c, 0x022b5d47, 0x022f5bf3, 0x01df958b, 0x0233d2a2, 0x01083cdc, 0x018f5c60, 0x01f6f3d1, 0x003b1fa3}}}, + {X: Field{[10]uint32{0x0346a3b7, 0x02ff4905, 0x014e4e46, 0x0057c1c2, 0x02d9ea43, 0x0105f159, 0x03069817, 0x01fd5e24, 0x01995418, 0x002ba419}}, Y: Field{[10]uint32{0x031a129b, 0x01515fc8, 0x01b10677, 0x01cc16f9, 0x01173355, 0x02811c27, 0x01006ff2, 0x00cc4fa7, 0x01adc09d, 0x0008906f}}}, + {X: Field{[10]uint32{0x03d956e9, 0x02cd4391, 0x03540c54, 0x03cd1041, 0x03f68fe9, 0x01606b8e, 0x02134cde, 0x00bdefd7, 0x00007649, 0x00157c3e}}, Y: Field{[10]uint32{0x033956ff, 0x029232f0, 0x00b982c8, 0x02d71c33, 0x01e258dc, 0x017fa60d, 0x03b4b8a3, 0x0222877e, 0x011de684, 0x0008a822}}}, + {X: Field{[10]uint32{0x01663bbb, 0x00665306, 0x010c1b87, 0x03131147, 0x006cb7e3, 0x03e1991f, 0x0123bb1d, 0x010388c6, 0x030686fb, 0x0024322a}}, Y: Field{[10]uint32{0x00c80ab4, 0x01ef8fff, 0x02463e3b, 0x00625323, 0x01cb30d7, 0x03105e5e, 0x03bb2c50, 0x03acb71b, 0x00d9570e, 0x00371d23}}}, + {X: Field{[10]uint32{0x00a4c694, 0x00b89f21, 0x02b604bb, 0x01aeb027, 0x013e476d, 0x01baa127, 0x0268e735, 0x03aee7ec, 0x002d6b21, 0x0032fd1f}}, Y: Field{[10]uint32{0x02bb2873, 0x021bee9e, 0x001cf16e, 0x037f6ac2, 0x01416ed9, 0x01658908, 0x02bf8bbe, 0x022528e6, 0x03e68042, 0x003c0a23}}}, + {X: Field{[10]uint32{0x0111fe80, 0x027f3a5f, 0x03b1637e, 0x02c91950, 0x00d8f1bf, 0x005235ce, 0x03ff7582, 0x01a2c823, 0x005fc18b, 0x001f0c22}}, Y: Field{[10]uint32{0x00013f2f, 0x01471d8f, 0x0221c7ea, 0x006298f9, 0x0052c067, 0x03221b84, 0x02c6d378, 0x007056c9, 0x00b931a1, 0x000f8b47}}}, + {X: Field{[10]uint32{0x026d7753, 0x0050cefd, 0x033e64f1, 0x01c8dfcc, 0x03e137c7, 0x03a481f6, 0x02a9da9d, 0x032e8374, 0x01190d1b, 0x002b5852}}, Y: Field{[10]uint32{0x0239753d, 0x027807b4, 0x03d0baad, 0x035c3b14, 0x00190b72, 0x02e9d66d, 0x02046192, 0x02862275, 0x018b3512, 0x003f2ba8}}}, + {X: Field{[10]uint32{0x025e29a2, 0x01729f13, 0x01715a29, 0x01c68e4e, 0x00a7bc41, 0x03b4cd6d, 0x02b50a81, 0x027055c2, 0x001baf8c, 0x00237dc1}}, Y: Field{[10]uint32{0x01ce02e7, 0x0192e92f, 0x01a1399b, 0x030e1286, 0x00e12eab, 0x01f771b7, 0x0166b24c, 0x01ef77cd, 0x02438267, 0x0003a24b}}}, + {X: Field{[10]uint32{0x00fdadd6, 0x009e010b, 0x00fbf2a1, 0x01ddf762, 0x02217f4e, 0x0306ed7d, 0x0351891a, 0x01483a69, 0x025761c8, 0x0027d307}}, Y: Field{[10]uint32{0x027d0f50, 0x02e583d3, 0x008609d9, 0x018e7cf5, 0x02ed4b69, 0x00f84b1e, 0x035831eb, 0x03a22430, 0x00adc6ce, 0x003f6884}}}, + {X: Field{[10]uint32{0x0115acbf, 0x02332ae9, 0x0147c2ee, 0x0061d496, 0x03174de6, 0x00778c24, 0x013bacf9, 0x01c28b02, 0x00dd23ac, 0x00290dbd}}, Y: Field{[10]uint32{0x0219afb9, 0x015fbfdf, 0x020ec9fe, 0x02cc1f51, 0x005879e8, 0x009ef04a, 0x039a4509, 0x016e6a50, 0x01d92a61, 0x00303a76}}}, + {X: Field{[10]uint32{0x006f1930, 0x037e882e, 0x007d567b, 0x019f1655, 0x0037497c, 0x000e5a57, 0x018627c5, 0x010f645b, 0x01166997, 0x0028e3bb}}, Y: Field{[10]uint32{0x01d9d7fd, 0x03951512, 0x00c18bb0, 0x02c52105, 0x013be89b, 0x03c9b247, 0x035b5fe3, 0x00ed6b26, 0x02d6effc, 0x001b8f8f}}}, + {X: Field{[10]uint32{0x02fbf3d6, 0x0187aeb8, 0x02586833, 0x039623a4, 0x000b6f1d, 0x01ac3c93, 0x03659e33, 0x010e87eb, 0x00d20d40, 0x0017d164}}, Y: Field{[10]uint32{0x015197db, 0x0242f801, 0x00466158, 0x02dc0090, 0x02ccc833, 0x01939ffd, 0x001af117, 0x03bb00fb, 0x0273042c, 0x00094302}}}, + {X: Field{[10]uint32{0x00cf56c0, 0x0147d10d, 0x03c551be, 0x031dcf3a, 0x03d52bea, 0x03dca0a8, 0x02d16ff8, 0x02e401a3, 0x020dc6eb, 0x001d5961}}, Y: Field{[10]uint32{0x02e24c26, 0x01187c2e, 0x01346c32, 0x01ff8078, 0x039b8468, 0x0275fcfa, 0x028ad7de, 0x03516150, 0x00be526e, 0x0012d5bb}}}, + {X: Field{[10]uint32{0x01a9320c, 0x01ed43e5, 0x035dec53, 0x010afa02, 0x02772927, 0x00800e96, 0x03ad50f0, 0x03bc072a, 0x03ce3a56, 0x000f9f1f}}, Y: Field{[10]uint32{0x03dbfaf1, 0x0349c8a4, 0x03914a32, 0x00b31256, 0x01d5dc34, 0x0267ea76, 0x03789045, 0x01c447cd, 0x00b7926e, 0x00263365}}}, + {X: Field{[10]uint32{0x03cda208, 0x001c9d2d, 0x035522eb, 0x003dabd5, 0x032ac91a, 0x031318aa, 0x031aaf5e, 0x033e12af, 0x005714ce, 0x0004c7ad}}, Y: Field{[10]uint32{0x0320839e, 0x03f625f8, 0x0303127b, 0x004d8344, 0x029b017a, 0x02bb156a, 0x0061393f, 0x0098111b, 0x014ff051, 0x002a4ebb}}}, + {X: Field{[10]uint32{0x02a11ec8, 0x037493a8, 0x026f1637, 0x0380b6cf, 0x02a98e68, 0x0312d7d0, 0x008bff69, 0x018f5c0e, 0x0201e469, 0x000dc6f1}}, Y: Field{[10]uint32{0x01f84622, 0x02765292, 0x03dd37b3, 0x03c4ea9a, 0x0121bbc7, 0x006e249a, 0x0385238c, 0x028906a5, 0x02f1932f, 0x0038befb}}}, + {X: Field{[10]uint32{0x02e47d6d, 0x03d41172, 0x002371bc, 0x00d3910c, 0x01b4d459, 0x00b11461, 0x0136bc20, 0x01cfa280, 0x030492ca, 0x0011dc36}}, Y: Field{[10]uint32{0x0141ec22, 0x03bbcd8b, 0x0390af1a, 0x01ed2c75, 0x0399a92f, 0x00877d2f, 0x037e080d, 0x03641aad, 0x008c25b1, 0x00386bdd}}}, + {X: Field{[10]uint32{0x0194bfff, 0x00a04b25, 0x02fe0da8, 0x00d081e1, 0x01e8e2ae, 0x01f38ebd, 0x01dbae16, 0x036d5dd6, 0x02435af5, 0x002cc6a1}}, Y: Field{[10]uint32{0x009aa4a2, 0x010ef8f0, 0x020cf3c7, 0x0341547f, 0x00f5aaab, 0x0216c1a9, 0x02a85a25, 0x03266aa5, 0x025e860d, 0x000de4d0}}}, + {X: Field{[10]uint32{0x013631f4, 0x00b9996f, 0x019bf09b, 0x02f5f472, 0x00a94121, 0x018670dd, 0x01fe6dd1, 0x009407f7, 0x0052084a, 0x003817bb}}, Y: Field{[10]uint32{0x03b8e622, 0x031589bf, 0x01ed4f6c, 0x01ddb49a, 0x014d883d, 0x035d0909, 0x0224ea4b, 0x03e01a66, 0x03172122, 0x00300457}}}, + {X: Field{[10]uint32{0x0173d5c8, 0x0228c94a, 0x0335ce4d, 0x03beffce, 0x03e57810, 0x025f4fd5, 0x0384305d, 0x001f4d16, 0x00840ee4, 0x00395777}}, Y: Field{[10]uint32{0x027ee677, 0x03a24d90, 0x011a1026, 0x01abe833, 0x00abb87a, 0x023aec4f, 0x003e4257, 0x018505f9, 0x03b5b0fa, 0x001c7dde}}}, + {X: Field{[10]uint32{0x02cd788f, 0x03748fb7, 0x01f0ed46, 0x01dbc9aa, 0x021aabbe, 0x014074cf, 0x00bf3ea5, 0x02a6a8a1, 0x02b1a5c8, 0x003b5eda}}, Y: Field{[10]uint32{0x010db63e, 0x00cf8047, 0x030d3772, 0x0363145d, 0x03824027, 0x037f60be, 0x0054a4bc, 0x02988061, 0x035419d1, 0x0008a02e}}}, + {X: Field{[10]uint32{0x0090e79a, 0x0019c520, 0x02001f96, 0x0078893c, 0x01ce5cb7, 0x03353b9a, 0x03a3329a, 0x0362bb84, 0x01fc3da4, 0x003538cc}}, Y: Field{[10]uint32{0x015e10d6, 0x02385619, 0x00c521ae, 0x01441b42, 0x0277821e, 0x01aa2044, 0x00a6b42d, 0x0334c27d, 0x01aa2f63, 0x00225450}}}, + {X: Field{[10]uint32{0x016d4417, 0x022d21e2, 0x03d54d64, 0x02384834, 0x03265471, 0x036054b1, 0x002545ab, 0x007ff99a, 0x020ea8ec, 0x0013c2b6}}, Y: Field{[10]uint32{0x035aa591, 0x03b1fd64, 0x00cd4dc5, 0x01515b22, 0x0320aaff, 0x02a7eebd, 0x035acf55, 0x02ad191f, 0x01ac6026, 0x002980ee}}}, + {X: Field{[10]uint32{0x00fdca84, 0x03ab8f80, 0x031b7543, 0x0015041a, 0x00a884cc, 0x0037dd4a, 0x0086a9d2, 0x03bb893c, 0x0141b08e, 0x0028b44d}}, Y: Field{[10]uint32{0x00803a45, 0x000edfd7, 0x002d1745, 0x00d61780, 0x024bb67c, 0x03f58172, 0x03a52497, 0x01ae4549, 0x0166294d, 0x0016b02c}}}, + {X: Field{[10]uint32{0x01b6c8a4, 0x03a048ed, 0x0008f64f, 0x00880b38, 0x03cbfc47, 0x03ea517f, 0x00887fda, 0x001164ae, 0x0120014a, 0x00013075}}, Y: Field{[10]uint32{0x00ed738d, 0x00f8cd14, 0x026083bb, 0x03d0e542, 0x00ebcebf, 0x00d23bf5, 0x0106597f, 0x0246395f, 0x028017b7, 0x00090f10}}}, + {X: Field{[10]uint32{0x03c54390, 0x025c2a4a, 0x02c551a5, 0x01f7fcca, 0x00fc2f5b, 0x008c172c, 0x035b8e6b, 0x03a6d330, 0x01a67d13, 0x00017e79}}, Y: Field{[10]uint32{0x0395ff6f, 0x02550edc, 0x0276b30d, 0x02dc9bcc, 0x0085eb0c, 0x022fb7c0, 0x005833ce, 0x017df6f1, 0x02379696, 0x001d2021}}}, + {X: Field{[10]uint32{0x00954575, 0x00d2f282, 0x01286985, 0x025cd293, 0x004447c2, 0x0038a6ad, 0x02d28a88, 0x006c5e02, 0x03809538, 0x0035db1b}}, Y: Field{[10]uint32{0x0161b27b, 0x021cc029, 0x0049859c, 0x03c49def, 0x02aa8273, 0x00390a77, 0x02051789, 0x03806984, 0x03f86b30, 0x00112db0}}}, + {X: Field{[10]uint32{0x01df3344, 0x022816f6, 0x00658e7a, 0x0074036b, 0x006ad19f, 0x01619286, 0x03a9eaeb, 0x01d6bdc0, 0x029ff787, 0x001d5ddc}}, Y: Field{[10]uint32{0x030afec9, 0x030fe64b, 0x0134532e, 0x02c4b9c1, 0x033fa7c5, 0x0239fb3c, 0x012f8229, 0x02a94e4b, 0x0116ccea, 0x001ad466}}}, + {X: Field{[10]uint32{0x02dc17db, 0x0245b163, 0x03a67fca, 0x022c0dae, 0x0278700c, 0x01ab6a64, 0x03194258, 0x0012eb42, 0x032b457f, 0x00140de3}}, Y: Field{[10]uint32{0x02273fc1, 0x028f0bdd, 0x00ad05fe, 0x0193e0bf, 0x03269573, 0x0314ce33, 0x01bf40ba, 0x0335246b, 0x011c26bd, 0x0032f451}}}, + {X: Field{[10]uint32{0x009ba86c, 0x00e2fa33, 0x02b50b91, 0x01138f58, 0x027606eb, 0x0301e3fc, 0x0384ba0e, 0x01458098, 0x00686436, 0x000dd237}}, Y: Field{[10]uint32{0x0211d709, 0x020f2659, 0x01271965, 0x02074d43, 0x016e7bfb, 0x038060a3, 0x01005a04, 0x02ba7377, 0x0014f624, 0x001b0139}}}, + {X: Field{[10]uint32{0x03eea53b, 0x03174715, 0x014047f9, 0x010b417f, 0x013402f3, 0x027ab1ca, 0x01eaea44, 0x035587ef, 0x01be8ea8, 0x002c8e96}}, Y: Field{[10]uint32{0x006dfb9b, 0x03c3a110, 0x019c42fe, 0x03fdc0bb, 0x0295d40e, 0x00fd7e86, 0x03c359c8, 0x016e0b38, 0x0068f2d3, 0x002fa91f}}}, + {X: Field{[10]uint32{0x02a64770, 0x035c7045, 0x00b49ebf, 0x001a4973, 0x039538fc, 0x01c074ae, 0x005f4435, 0x0296f817, 0x01e87b42, 0x00392d14}}, Y: Field{[10]uint32{0x03156da4, 0x019eddcb, 0x001e9e14, 0x029a2a42, 0x014cb261, 0x02de6e61, 0x02fa86b2, 0x001d2523, 0x02699a79, 0x000abe11}}}, + {X: Field{[10]uint32{0x02dff165, 0x03dd5225, 0x01a1242f, 0x005593cf, 0x01de74a2, 0x0194777e, 0x02e671e8, 0x02c218d1, 0x02ec65b8, 0x002192b1}}, Y: Field{[10]uint32{0x031a8730, 0x03ad8009, 0x03188d68, 0x000b7ea4, 0x01b2cbf9, 0x0234afaf, 0x00a5103c, 0x02155647, 0x00a77ab4, 0x003cd5ce}}}, + {X: Field{[10]uint32{0x002ecab0, 0x009c95fc, 0x02ac4ecb, 0x035e6815, 0x00fd36c5, 0x01990e19, 0x00090225, 0x018f66de, 0x023da6a8, 0x002df412}}, Y: Field{[10]uint32{0x0383b0c1, 0x01fbdc1b, 0x031a15ec, 0x02f9d4c3, 0x001519ab, 0x039a81f0, 0x01e4e3bf, 0x03708f96, 0x034c6ba5, 0x00331018}}}, + {X: Field{[10]uint32{0x014c1a0e, 0x023f289c, 0x0044c7ca, 0x00c43af2, 0x03bd6e25, 0x02a0ddf3, 0x020de0c4, 0x03776080, 0x02f9b51e, 0x00377f06}}, Y: Field{[10]uint32{0x03fe3951, 0x0259838f, 0x01ad957b, 0x03d368f8, 0x01c30f23, 0x00976aae, 0x02d9f54a, 0x0313a2c8, 0x008c1742, 0x00033ddf}}}, + {X: Field{[10]uint32{0x011fcbe3, 0x016d1f35, 0x03c30ea7, 0x023e21a3, 0x01e00c82, 0x0053611e, 0x03de26a6, 0x02478e84, 0x0269d5bb, 0x001e3f3f}}, Y: Field{[10]uint32{0x03f2d47d, 0x029b9c91, 0x0306066d, 0x01210d03, 0x0298021b, 0x030a050e, 0x00b231aa, 0x014eeac3, 0x01636b70, 0x0027b19e}}}, + {X: Field{[10]uint32{0x0115863f, 0x00137684, 0x028fcd42, 0x0211e0ce, 0x03138c98, 0x0279dbb2, 0x022b4f81, 0x0075c608, 0x00de1696, 0x00373646}}, Y: Field{[10]uint32{0x0323bb04, 0x014aaeb2, 0x01ed2f5e, 0x003604e9, 0x023ff7fb, 0x004f0a4c, 0x012318dd, 0x00233f28, 0x00bac8d8, 0x002af0f6}}}, + {X: Field{[10]uint32{0x02c3177e, 0x00201b31, 0x012b294a, 0x028a5b33, 0x02e6f64f, 0x00def084, 0x0294eef5, 0x02041a4c, 0x02f05de0, 0x000e738b}}, Y: Field{[10]uint32{0x00730556, 0x034a76de, 0x0349239f, 0x0369e250, 0x020bbb5d, 0x03ce899a, 0x020ca926, 0x025e8e5e, 0x00cb0b76, 0x00097abd}}}, + {X: Field{[10]uint32{0x03157a04, 0x01a94f40, 0x02b5abae, 0x013f4e91, 0x02146451, 0x025eb12e, 0x010e937e, 0x03a27b7d, 0x01b643d4, 0x00125793}}, Y: Field{[10]uint32{0x02ec1701, 0x02c715f9, 0x026d46e6, 0x006e8833, 0x00f84bb8, 0x023105ad, 0x024251cf, 0x0035a7af, 0x0218b296, 0x001f4c9f}}}, + {X: Field{[10]uint32{0x037c33c1, 0x03d6e598, 0x03dbefca, 0x025fd6d9, 0x03a6cb6e, 0x027e79bd, 0x036dde52, 0x01f03070, 0x028cb635, 0x0024705f}}, Y: Field{[10]uint32{0x014c39ba, 0x017b06e9, 0x00e85c96, 0x0383da17, 0x03f07b76, 0x003d61ab, 0x01e26922, 0x022b0bbf, 0x0097fedb, 0x000bf948}}}, + {X: Field{[10]uint32{0x01ecfdbc, 0x01c48875, 0x018d4c03, 0x026f5ab8, 0x001c2874, 0x03172564, 0x011f11ec, 0x03b5118a, 0x00803dff, 0x0038f13d}}, Y: Field{[10]uint32{0x03dc62d8, 0x00afa4b2, 0x0240c65b, 0x009d514f, 0x004e7fb8, 0x033be2ca, 0x00ad71da, 0x009f3a5d, 0x0102571e, 0x00168b9c}}}, + {X: Field{[10]uint32{0x01c25073, 0x01763b5d, 0x0333acc1, 0x03a95a03, 0x0059ae7b, 0x03e772ee, 0x0014377a, 0x0079ed22, 0x03f5a0e8, 0x002cfb85}}, Y: Field{[10]uint32{0x00bfe86d, 0x024b9f5b, 0x01ecb6d0, 0x035415ce, 0x03b46332, 0x00e7b788, 0x0035afe1, 0x00a09698, 0x000c9a6d, 0x0004d68f}}}, + {X: Field{[10]uint32{0x02e76b75, 0x019819ba, 0x01732298, 0x0365796d, 0x017ca6e8, 0x019248cd, 0x02628e1f, 0x006fb4d0, 0x00442bc9, 0x0039332a}}, Y: Field{[10]uint32{0x016f76b9, 0x02364394, 0x01cececc, 0x03880c76, 0x02409f74, 0x00c66b1c, 0x00b42b0f, 0x019c3fdc, 0x015539b5, 0x00375569}}}, + {X: Field{[10]uint32{0x02223b2c, 0x02fefdf6, 0x02359b5e, 0x03aa58ad, 0x02e517e4, 0x013ab9eb, 0x00c02a46, 0x01822666, 0x03c181c9, 0x002ace73}}, Y: Field{[10]uint32{0x037d2fc4, 0x0393aa41, 0x02096a22, 0x01403e65, 0x0172ba3b, 0x00a06862, 0x01cfec18, 0x02ef8b9b, 0x0057b4dc, 0x0037bdb7}}}, + {X: Field{[10]uint32{0x03ab402a, 0x01172137, 0x02e01f8e, 0x034652ce, 0x02677572, 0x0193c206, 0x00cad409, 0x0011a7f9, 0x02639e6e, 0x0008a8c9}}, Y: Field{[10]uint32{0x00d2b437, 0x0157e610, 0x02f261b8, 0x0141750a, 0x00db44cf, 0x013263f3, 0x00f61484, 0x003bc16b, 0x0195bd4e, 0x00072727}}}, + {X: Field{[10]uint32{0x01f9cae9, 0x03f30908, 0x029037c2, 0x0285de42, 0x02db269d, 0x03ef137a, 0x03c5ead4, 0x012fc0c1, 0x00cceff9, 0x000af1e2}}, Y: Field{[10]uint32{0x00bc4b41, 0x000f9389, 0x01384aa7, 0x01227583, 0x00ccecb2, 0x0231e30f, 0x0081c43a, 0x01548110, 0x0061648c, 0x0005cbcd}}}, + {X: Field{[10]uint32{0x02052729, 0x00a8c000, 0x00fe4c62, 0x00d827ef, 0x003872c6, 0x02ef9a7a, 0x0275bb88, 0x001804d6, 0x03d2a672, 0x002e4c36}}, Y: Field{[10]uint32{0x0206f366, 0x0103fd6b, 0x01ebd839, 0x00d8ccd3, 0x01ff3f68, 0x01d0e2ce, 0x030e7f9a, 0x03a2e0a0, 0x0303a872, 0x0002660f}}}, + {X: Field{[10]uint32{0x0114e3d3, 0x02cb8e5d, 0x03466f33, 0x00fa1ca8, 0x0329bcd0, 0x029bc61b, 0x02db448d, 0x03a901c0, 0x038a2aa9, 0x002d0d5c}}, Y: Field{[10]uint32{0x0098636b, 0x01511ce4, 0x0074e92c, 0x02383d87, 0x011678cb, 0x0330d241, 0x0217e55b, 0x019c7e15, 0x02462d3c, 0x00160a34}}}, + {X: Field{[10]uint32{0x0072bd25, 0x037fee4c, 0x0223b532, 0x01fe76d8, 0x02ee1fe6, 0x01060375, 0x012df27d, 0x026ebcb1, 0x02813acc, 0x003247cb}}, Y: Field{[10]uint32{0x01b73c0c, 0x0057c1e1, 0x0345569c, 0x003ef493, 0x02b02735, 0x00ddf878, 0x02fa0c2b, 0x00bc4c4e, 0x03d696c1, 0x00072715}}}, + {X: Field{[10]uint32{0x008d36c8, 0x0257c017, 0x0131d2b9, 0x001be31f, 0x030bad0d, 0x005b6400, 0x028068f4, 0x02ea4e3c, 0x02c28099, 0x002ec251}}, Y: Field{[10]uint32{0x0176da4a, 0x00e41afb, 0x00164867, 0x007dde0b, 0x00156042, 0x03a5e3ca, 0x03e1a621, 0x017fa5e3, 0x00d93b57, 0x00238e1e}}}, + {X: Field{[10]uint32{0x03085c8d, 0x0281a923, 0x03398c31, 0x03df2d13, 0x035298db, 0x01c1fcd9, 0x0106521a, 0x00cdd335, 0x02a12e82, 0x0012178e}}, Y: Field{[10]uint32{0x02ca9a61, 0x018005e1, 0x03878a4b, 0x03837ed3, 0x02af0153, 0x000bf098, 0x0339d4c3, 0x02cac568, 0x02f57079, 0x00284b22}}}, + {X: Field{[10]uint32{0x013e844d, 0x027ee69c, 0x03db3e8a, 0x00a9e219, 0x020f21d0, 0x022a5baa, 0x00da03fe, 0x00895a50, 0x0048d328, 0x002143e5}}, Y: Field{[10]uint32{0x03fccb7b, 0x02c9108e, 0x00d8259a, 0x00d8296a, 0x0103a678, 0x0162a083, 0x034df3af, 0x02e8b029, 0x00fe3201, 0x00115479}}}, + {X: Field{[10]uint32{0x03e39884, 0x03214ec2, 0x01c43682, 0x030152db, 0x01449cd4, 0x03abd476, 0x00e51b18, 0x007f927e, 0x02b3f66c, 0x0029d205}}, Y: Field{[10]uint32{0x0372f7fc, 0x033bdfac, 0x0004f15e, 0x039203b2, 0x01396626, 0x01330416, 0x02f0cfdc, 0x01fa8516, 0x03b247ed, 0x00139f57}}}, + {X: Field{[10]uint32{0x0320136d, 0x02b5adde, 0x02f7785e, 0x00b5ae62, 0x02e1eb70, 0x00d04805, 0x01abcc17, 0x02885c1e, 0x016fc71d, 0x000abd71}}, Y: Field{[10]uint32{0x02b706bd, 0x01455061, 0x029321b6, 0x03642d4c, 0x02783911, 0x00c69ae3, 0x0049e95a, 0x00988ecb, 0x00a2c6a8, 0x001fcc44}}}, + {X: Field{[10]uint32{0x039b5834, 0x013fb90c, 0x00903968, 0x00525c98, 0x031a3137, 0x02b983b6, 0x0163135f, 0x037c7a43, 0x0091a61a, 0x0024a47b}}, Y: Field{[10]uint32{0x01d03884, 0x007745ef, 0x01e09bac, 0x02f2b78b, 0x03feef42, 0x020cb7a4, 0x009649f1, 0x036ecff0, 0x006be8b0, 0x00354c14}}}, + {X: Field{[10]uint32{0x00605b54, 0x0110a4b3, 0x028e1144, 0x034608f3, 0x03a8581f, 0x03863fda, 0x029cb474, 0x01e05813, 0x03c3659a, 0x000582b4}}, Y: Field{[10]uint32{0x00d141fe, 0x007d09a9, 0x03b58b6e, 0x03060636, 0x010a59f2, 0x007ae476, 0x01f939eb, 0x035c6698, 0x024d5f28, 0x00058611}}}, + {X: Field{[10]uint32{0x00ba9d58, 0x01c64d18, 0x02572b40, 0x03e18d62, 0x01ea4280, 0x01cf6b63, 0x005a5d76, 0x024830b6, 0x01bb8640, 0x000d4966}}, Y: Field{[10]uint32{0x03538d0c, 0x01f470a2, 0x0164a50f, 0x03618e35, 0x00aa2ac3, 0x00f2572b, 0x017707ad, 0x013cac8b, 0x011be806, 0x0029e296}}}, + {X: Field{[10]uint32{0x036ba527, 0x00b13ede, 0x03f334d1, 0x038488da, 0x01adb37c, 0x03a78575, 0x037a7281, 0x018d364b, 0x03bd9a8c, 0x003b083b}}, Y: Field{[10]uint32{0x0151b70d, 0x015ecec3, 0x021e2a9a, 0x024bf550, 0x02e8c547, 0x01ebe762, 0x019315e2, 0x00c454e4, 0x01bc2a5a, 0x002b36ca}}}, + {X: Field{[10]uint32{0x02dbebc3, 0x02b51838, 0x0064c5cf, 0x0214618f, 0x01bbd387, 0x0165e07a, 0x02e847dc, 0x031bb157, 0x00da8bda, 0x00103479}}, Y: Field{[10]uint32{0x016e9ab0, 0x0099568c, 0x013acd3a, 0x03fc9fed, 0x004e3755, 0x02e8fb06, 0x03c7d5bd, 0x00b9a299, 0x001cb7c9, 0x00318c16}}}, + {X: Field{[10]uint32{0x027d08c7, 0x02e91103, 0x035127db, 0x00b7c3fe, 0x0081674c, 0x022d9b7d, 0x01ac1c39, 0x037cb8ac, 0x03402faa, 0x003ef849}}, Y: Field{[10]uint32{0x03f412d6, 0x00bdee2d, 0x0187c52f, 0x00d39ba1, 0x00f3dfee, 0x011245a6, 0x00871821, 0x005340eb, 0x00d7f979, 0x003403b7}}}, + {X: Field{[10]uint32{0x0191eb03, 0x0364c370, 0x0008bb0c, 0x0358990c, 0x034070d9, 0x03ec7848, 0x010fbd80, 0x0247ee21, 0x01a747d1, 0x0035e06d}}, Y: Field{[10]uint32{0x006afa11, 0x01ac63cd, 0x03792d90, 0x00c09236, 0x019762ef, 0x0066ca44, 0x01f29245, 0x02ad57e5, 0x01a25c74, 0x00292aa5}}}, + {X: Field{[10]uint32{0x00cf02cd, 0x0111bc27, 0x0052944a, 0x00e7b948, 0x0122790c, 0x00e56d7a, 0x01045d00, 0x02f1f045, 0x0042d926, 0x00191cbf}}, Y: Field{[10]uint32{0x0205a99d, 0x02de2511, 0x0106863d, 0x02d438ab, 0x03045d1a, 0x00cf210a, 0x0264e376, 0x024f7b88, 0x0014a925, 0x00001448}}}, + {X: Field{[10]uint32{0x015e0c21, 0x0057b58e, 0x03fd2c57, 0x00993203, 0x005fa6cf, 0x01181e8b, 0x0117a935, 0x0007a1a9, 0x00c2e096, 0x003bb860}}, Y: Field{[10]uint32{0x0083e7ea, 0x01259a5d, 0x01711e06, 0x03c6b995, 0x0349490a, 0x03de1728, 0x03daff70, 0x01bf16d3, 0x0398221d, 0x003232e9}}}, + {X: Field{[10]uint32{0x01ada2d6, 0x012dd411, 0x00ab4fad, 0x03536d40, 0x039103be, 0x015d8c1d, 0x03ec071c, 0x02b50456, 0x022da172, 0x002402c9}}, Y: Field{[10]uint32{0x01e2cbaf, 0x0108f814, 0x015aa371, 0x0361459d, 0x0082c4c1, 0x00fe8d35, 0x0018e7fb, 0x03fa44fd, 0x03f2bbad, 0x000c5915}}}, + {X: Field{[10]uint32{0x03a34c9e, 0x02006884, 0x00e20420, 0x02c799af, 0x015d5e03, 0x027bca74, 0x02d3371b, 0x0141c1dc, 0x03874e1e, 0x001fa4f6}}, Y: Field{[10]uint32{0x038465a8, 0x0308ce78, 0x0356abc2, 0x011ed6fe, 0x0063f3ec, 0x00033704, 0x03aa0fee, 0x00ca9bd7, 0x02247500, 0x00337aa9}}}, + {X: Field{[10]uint32{0x01a379ca, 0x02320be2, 0x031f5da9, 0x01e80fb6, 0x02d17287, 0x012aff8e, 0x02761b84, 0x02957799, 0x002465f3, 0x001187ed}}, Y: Field{[10]uint32{0x00e815d9, 0x014a16c6, 0x0332b7f1, 0x0299ae39, 0x011f584a, 0x00179070, 0x0101dadc, 0x009c63d5, 0x01fdba03, 0x001da098}}}, + {X: Field{[10]uint32{0x0019e09f, 0x0379de25, 0x0059e997, 0x02997cd4, 0x036de28a, 0x006e93e4, 0x010f0cc9, 0x00683f97, 0x001af0f6, 0x000767d6}}, Y: Field{[10]uint32{0x011bf6cd, 0x00da6d22, 0x011f8adf, 0x00758889, 0x003f02db, 0x0259dbd5, 0x00302e18, 0x03715858, 0x018c7d59, 0x001ffa72}}}, + {X: Field{[10]uint32{0x027542c6, 0x010e085d, 0x0362be23, 0x03fcf337, 0x0166386d, 0x013bf8de, 0x00f7a70e, 0x00aa9c90, 0x0352904b, 0x002335c2}}, Y: Field{[10]uint32{0x01ddc2f2, 0x01afb26d, 0x001f1ff8, 0x00f62195, 0x020e9e29, 0x01caf1ae, 0x0308bb2f, 0x002c7c03, 0x003f4c7e, 0x002cf0f4}}}, + {X: Field{[10]uint32{0x034a5261, 0x02a98a3a, 0x02a2e819, 0x008d3910, 0x0199097b, 0x00036bbf, 0x025b8b38, 0x02196e66, 0x03ea9c08, 0x00282d51}}, Y: Field{[10]uint32{0x02ca2952, 0x0377627c, 0x03a2280c, 0x0063cb48, 0x00fd9d1e, 0x0289fad8, 0x003cb4e1, 0x00403700, 0x0115e585, 0x00181fbc}}}, + {X: Field{[10]uint32{0x0344d289, 0x0358d810, 0x0177578d, 0x03d57f6f, 0x00192406, 0x01fa06ad, 0x03a649c2, 0x00e38da0, 0x00f65470, 0x003aa298}}, Y: Field{[10]uint32{0x01822fb0, 0x003dd19e, 0x00691ac1, 0x033d4183, 0x02881b5f, 0x02f08bc5, 0x00b9f3e3, 0x0357aa3f, 0x02c0b05a, 0x00262bf2}}}, + {X: Field{[10]uint32{0x00b0a711, 0x02335285, 0x0075501a, 0x001a44d4, 0x0148bce5, 0x016ede0a, 0x01488fe5, 0x03e7bddf, 0x029d0882, 0x00398146}}, Y: Field{[10]uint32{0x02920fce, 0x02853d8b, 0x03498ffa, 0x0209364c, 0x00c1ec0c, 0x0182bdd7, 0x01257b8a, 0x02d5572e, 0x02be9d9e, 0x00072736}}}, + {X: Field{[10]uint32{0x00765674, 0x01497a62, 0x02a4b39a, 0x03153e3a, 0x03165338, 0x001f8396, 0x00e5efbc, 0x034cdc1b, 0x02c9c50f, 0x0018021d}}, Y: Field{[10]uint32{0x03ea4189, 0x01e5b936, 0x0346a213, 0x00b981a9, 0x03b04420, 0x0282c856, 0x01f5da0a, 0x0087ce0f, 0x031ef52b, 0x00100699}}}, + {X: Field{[10]uint32{0x02b2ff40, 0x03c7a5fd, 0x00185274, 0x01596df8, 0x003c0eca, 0x01a78105, 0x03efe121, 0x03f7426c, 0x039c5ef6, 0x000ec116}}, Y: Field{[10]uint32{0x02780a28, 0x039a04d8, 0x02dfad20, 0x01ef2c4d, 0x03a135a4, 0x035a4530, 0x00085d05, 0x001f10aa, 0x03acb211, 0x002a95dc}}}, + {X: Field{[10]uint32{0x01f0f1b6, 0x03b9fd2c, 0x022dc643, 0x0077954a, 0x01f9504b, 0x03b673bd, 0x027807fd, 0x01578135, 0x0132ee0b, 0x00373a63}}, Y: Field{[10]uint32{0x033fb086, 0x01687787, 0x031b8d43, 0x038a0077, 0x03aba058, 0x02b3d509, 0x03746d67, 0x00925f2e, 0x027c9e99, 0x00340eb0}}}, + {X: Field{[10]uint32{0x0378fd76, 0x03a61338, 0x0144958b, 0x01fc8be8, 0x03dd5aea, 0x00da19e1, 0x011c07a9, 0x0183fa2a, 0x01486e8a, 0x000d96c4}}, Y: Field{[10]uint32{0x0301c9c0, 0x00add87b, 0x005c3f85, 0x019d53d0, 0x01b36e27, 0x036ee3b0, 0x01ecbbcb, 0x01754131, 0x0217319e, 0x000b1fd4}}}, + {X: Field{[10]uint32{0x036b5806, 0x01cecbaa, 0x006cbb9c, 0x03a15f26, 0x023c3720, 0x013b78d5, 0x00dc3cad, 0x0197b7ba, 0x035a4dc4, 0x000b8de4}}, Y: Field{[10]uint32{0x03ce346b, 0x00e51752, 0x01522c0e, 0x0240431b, 0x02839cb6, 0x01fe0692, 0x02dc7f9d, 0x03d1b600, 0x03f15278, 0x002f421c}}}, + {X: Field{[10]uint32{0x01647568, 0x02eba53c, 0x030bb00f, 0x0215b91e, 0x0081cd85, 0x0035c656, 0x00ddf927, 0x016b5ed8, 0x00e19374, 0x000126da}}, Y: Field{[10]uint32{0x02819dc1, 0x01a4f01c, 0x03795755, 0x00c43d29, 0x021dc82d, 0x03d2e16f, 0x03cb2d05, 0x010fbd4e, 0x03f0013e, 0x00328752}}}, + {X: Field{[10]uint32{0x02744564, 0x00c3f33e, 0x0220cb81, 0x02e8f981, 0x016c8cc6, 0x027b781d, 0x02b6f66e, 0x016a20b0, 0x016cc79c, 0x001b7d4f}}, Y: Field{[10]uint32{0x02431344, 0x02013449, 0x036e1729, 0x01f2bed5, 0x014597f7, 0x00698525, 0x032f2914, 0x01f16491, 0x02ed3b2b, 0x001230f5}}}, + {X: Field{[10]uint32{0x034865a1, 0x0385c36f, 0x02b8bd28, 0x0307238c, 0x022f9467, 0x019c5168, 0x01636727, 0x038ee498, 0x03069104, 0x003667e3}}, Y: Field{[10]uint32{0x02543d7f, 0x02ff9414, 0x01479fd1, 0x00cf9044, 0x00c2b433, 0x0301b2c6, 0x0267c4e2, 0x01764d93, 0x02b055aa, 0x00333f11}}}, + {X: Field{[10]uint32{0x019930d1, 0x03ab64f9, 0x0342a538, 0x03f71a30, 0x01e23af7, 0x01562816, 0x00075728, 0x020ce2ea, 0x0017ebbf, 0x001ddc9f}}, Y: Field{[10]uint32{0x00c629ea, 0x0380ce10, 0x0308366d, 0x02504cf9, 0x00ede751, 0x017d4329, 0x023bc657, 0x0060083f, 0x007e2cde, 0x00280df7}}}, + {X: Field{[10]uint32{0x03e22604, 0x00328bda, 0x0266377e, 0x022667b0, 0x0036ae37, 0x0344ce6b, 0x00c84cfa, 0x013fdf05, 0x02d8563a, 0x0007503a}}, Y: Field{[10]uint32{0x00d1face, 0x007b0488, 0x01713a71, 0x00b6a5a3, 0x033a6b0c, 0x03137ee1, 0x025a5ac1, 0x0245ffb9, 0x0043b093, 0x002125ed}}}, + {X: Field{[10]uint32{0x006bfae0, 0x0241c410, 0x010ef405, 0x02645e8f, 0x03e32269, 0x0061034d, 0x0227c205, 0x02accdc6, 0x0341adf5, 0x0000a8e7}}, Y: Field{[10]uint32{0x005c27c5, 0x03cab1a4, 0x008ed155, 0x027b1c12, 0x008dd1a4, 0x03a11306, 0x0236b048, 0x027ee08e, 0x03a858e9, 0x000336bd}}}, + {X: Field{[10]uint32{0x01c684e0, 0x00dc2206, 0x0215e281, 0x024adb38, 0x0166f5ea, 0x0365d288, 0x031cc92f, 0x02331225, 0x00b1d8b0, 0x0002aab9}}, Y: Field{[10]uint32{0x03cd8f0c, 0x035e3a78, 0x01bdea34, 0x0344e909, 0x03c63739, 0x0145478c, 0x03d5cd50, 0x00d22a13, 0x0195c10a, 0x000248de}}}, + {X: Field{[10]uint32{0x02477d40, 0x03f6bf39, 0x03440965, 0x01520c7b, 0x0211315a, 0x02b0b278, 0x00939d29, 0x014ed8cd, 0x0042591a, 0x00296c30}}, Y: Field{[10]uint32{0x00a62ca6, 0x01e97301, 0x016d7e11, 0x03234a90, 0x00bc9904, 0x00f1f758, 0x022b206b, 0x000922cd, 0x00fd5d1f, 0x002b0f9f}}}, + {X: Field{[10]uint32{0x03c63f0b, 0x00b907c9, 0x035a1278, 0x02d40faf, 0x003c16e3, 0x03c252f9, 0x03643b47, 0x01aa5aa3, 0x0164e616, 0x000306dc}}, Y: Field{[10]uint32{0x01663a98, 0x003c079d, 0x01207fcc, 0x02fdcfb4, 0x01e34810, 0x0378eb1e, 0x010ba811, 0x03c7fd6d, 0x021a4ffa, 0x00211a45}}}, + {X: Field{[10]uint32{0x01ca63bc, 0x0263852b, 0x028b457b, 0x01763f7c, 0x00342e60, 0x03ac9b74, 0x00e0f2c8, 0x018fc136, 0x00254b79, 0x000263f6}}, Y: Field{[10]uint32{0x01a192d6, 0x0184456c, 0x0098f220, 0x0096f848, 0x012dc143, 0x032f2e67, 0x039dba65, 0x019991df, 0x000d213f, 0x0038a5ea}}}, + {X: Field{[10]uint32{0x014c3281, 0x02ceab56, 0x00dc163e, 0x033605ab, 0x0148c464, 0x030b9bc6, 0x034127d8, 0x03b524b4, 0x024971b6, 0x003c7c21}}, Y: Field{[10]uint32{0x00f31f5c, 0x00ce2ac0, 0x0031a346, 0x0394bf7b, 0x03506a0d, 0x01580b9b, 0x038954d8, 0x013ea44e, 0x02a0f9e0, 0x00009ab8}}}, + {X: Field{[10]uint32{0x030dd197, 0x010388e4, 0x03a91172, 0x00e98688, 0x01b63af8, 0x00141bed, 0x03441eac, 0x034ab298, 0x00cdc324, 0x0003fd1c}}, Y: Field{[10]uint32{0x0227788f, 0x00983495, 0x01eba5a5, 0x012e3f4c, 0x0330734b, 0x007be9ce, 0x007a772a, 0x01dfa118, 0x026bb18e, 0x0039807d}}}, + {X: Field{[10]uint32{0x006c63a6, 0x0110b7ef, 0x016dcd04, 0x02e4ccbb, 0x00ad0f82, 0x02aaeeaa, 0x0008127b, 0x02865ad6, 0x006d968a, 0x00243aaf}}, Y: Field{[10]uint32{0x035038f1, 0x03e93bae, 0x030f94c1, 0x038f7370, 0x032faed3, 0x0111daca, 0x03fc4be4, 0x00f35cb7, 0x0367ffb2, 0x0035b7c3}}}, + {X: Field{[10]uint32{0x007e11af, 0x012e2ef3, 0x03866ecd, 0x02dbfabc, 0x02bc0a43, 0x00c00d8f, 0x01e0826b, 0x001e86d0, 0x0126acc5, 0x003885ec}}, Y: Field{[10]uint32{0x01e98f30, 0x007f1b92, 0x01ecda8d, 0x017ec0c8, 0x02921e3a, 0x02c9e8e1, 0x00eb7332, 0x00cf562e, 0x01ef83db, 0x001faca3}}}, + {X: Field{[10]uint32{0x00e1d184, 0x039a2a7f, 0x0228d20d, 0x03bb1e55, 0x02b5d008, 0x01362ab4, 0x032bc218, 0x0175785d, 0x03d582b8, 0x000a865b}}, Y: Field{[10]uint32{0x02201303, 0x00e67d98, 0x022300c3, 0x019e2760, 0x0368526c, 0x02b4bfc7, 0x038dc8cc, 0x038f53f7, 0x0257ee9e, 0x002652d1}}}, + {X: Field{[10]uint32{0x02de4342, 0x0074099e, 0x002e6132, 0x02f5f99b, 0x02ca770c, 0x00463def, 0x01897c81, 0x0329fa2a, 0x03c83a6e, 0x002f278e}}, Y: Field{[10]uint32{0x014f3f4b, 0x01950b5c, 0x030a3f34, 0x0184be12, 0x00e2b076, 0x017cd749, 0x00992917, 0x029586ae, 0x03e2d544, 0x00275fbd}}}, + {X: Field{[10]uint32{0x02f198b3, 0x0144aaac, 0x00cdf6f6, 0x03b79a47, 0x017e76b8, 0x03c4bc82, 0x029e3676, 0x027e13fa, 0x03f3842a, 0x003fca04}}, Y: Field{[10]uint32{0x03fe1949, 0x012128b0, 0x03f7618a, 0x00abd00a, 0x01b8b668, 0x02027d21, 0x02de4380, 0x030586b1, 0x03d666d0, 0x00081b8e}}}, + {X: Field{[10]uint32{0x01af05f7, 0x011e6e34, 0x01baf6c7, 0x02f9382b, 0x0234a50b, 0x01da75f2, 0x01423210, 0x0358faf8, 0x01df2d38, 0x001b9d66}}, Y: Field{[10]uint32{0x03654c8d, 0x01bea978, 0x002cd555, 0x0117b346, 0x03256143, 0x01ad251a, 0x01ed56eb, 0x0136212a, 0x031d4b0e, 0x0008cf73}}}, + {X: Field{[10]uint32{0x03666146, 0x0141c64c, 0x039f9ba2, 0x00bad5db, 0x03839766, 0x02797059, 0x01844d1a, 0x03aca053, 0x00d56c82, 0x0007b767}}, Y: Field{[10]uint32{0x01f43f4c, 0x00946f8f, 0x0165fe24, 0x03725776, 0x0239d48d, 0x0345a083, 0x01b5cb04, 0x03a0fa52, 0x02850b2e, 0x002803d2}}}, + {X: Field{[10]uint32{0x007324af, 0x01e7ed90, 0x02b0718d, 0x01ce4b5e, 0x02818a2f, 0x00e2a07a, 0x024a0907, 0x01335dda, 0x02061f79, 0x0009c8f7}}, Y: Field{[10]uint32{0x02bbf41f, 0x00707fb1, 0x00e783db, 0x01c9df34, 0x0038daad, 0x0112ae22, 0x013429e3, 0x003140f1, 0x01bef981, 0x000d71ea}}}, + {X: Field{[10]uint32{0x039a213d, 0x027289aa, 0x0353af46, 0x00ae9f1a, 0x023874ec, 0x010f04f0, 0x01659eeb, 0x0137bdb6, 0x02444cb5, 0x001313ec}}, Y: Field{[10]uint32{0x038efa3d, 0x01d47956, 0x02472082, 0x036168d5, 0x03d4a1ae, 0x0126cce3, 0x039ad153, 0x01ea7ffa, 0x02fe5644, 0x002ef4ba}}}, + {X: Field{[10]uint32{0x027593e3, 0x0255c819, 0x0212f250, 0x034a3939, 0x0112847e, 0x03ecfef3, 0x03069771, 0x0256a238, 0x01f73479, 0x001cd8d6}}, Y: Field{[10]uint32{0x02bd3741, 0x0256fe44, 0x015f972c, 0x02920359, 0x00e303fd, 0x02e3e61a, 0x02215ca6, 0x001448d6, 0x03ed4bce, 0x0008eecd}}}, + {X: Field{[10]uint32{0x01f595be, 0x01e53661, 0x03293825, 0x03df0332, 0x026f33b0, 0x0021e6fb, 0x01813946, 0x01af452e, 0x0194ee93, 0x000572e5}}, Y: Field{[10]uint32{0x031bb152, 0x00950a7e, 0x0149ac7f, 0x03997962, 0x03e2e133, 0x036c9d3b, 0x03775e9e, 0x006ad804, 0x032a2ec8, 0x002aab5d}}}, + {X: Field{[10]uint32{0x03e78fa4, 0x01b159da, 0x00a9b41e, 0x01de987c, 0x02df5747, 0x002e1dca, 0x0290eb82, 0x033c7a12, 0x01ab97e5, 0x000ed522}}, Y: Field{[10]uint32{0x022219be, 0x00d33d95, 0x00cf9e71, 0x03aeeec4, 0x020d59a1, 0x0044f592, 0x02cad63f, 0x01285f33, 0x03c8e967, 0x00051744}}}, + {X: Field{[10]uint32{0x029dd2f5, 0x005d65e8, 0x01c56684, 0x0130e896, 0x0323323e, 0x0167389a, 0x01bec7bb, 0x034e16c2, 0x019aa6f9, 0x001e346e}}, Y: Field{[10]uint32{0x0216a122, 0x0220dedf, 0x020ef3cd, 0x033856d2, 0x00a6b890, 0x027da8a0, 0x014369ce, 0x02c8433d, 0x01f8e883, 0x00072344}}}, + {X: Field{[10]uint32{0x01661e85, 0x03457ece, 0x0121070c, 0x0060afa0, 0x02d2fd2d, 0x024e244b, 0x0013e3f0, 0x03eef4ea, 0x028c5cef, 0x000e1793}}, Y: Field{[10]uint32{0x0368069c, 0x00b6b2ea, 0x02c7036e, 0x03896337, 0x02c9b168, 0x00730232, 0x03ceb21c, 0x03ef1484, 0x00149f5c, 0x003d2871}}}, + {X: Field{[10]uint32{0x011aec6a, 0x0365c465, 0x02b1fc28, 0x00c0a4b5, 0x02a7c872, 0x014fa4a4, 0x0130df3c, 0x01b1b922, 0x0070d8e4, 0x000c43e3}}, Y: Field{[10]uint32{0x0017146f, 0x021bd70d, 0x01efdb03, 0x017db73b, 0x0359d92d, 0x0175c11b, 0x0315154d, 0x001ec959, 0x01d3c92c, 0x001bf8c6}}}, + {X: Field{[10]uint32{0x03c70bbb, 0x01996175, 0x00912940, 0x02590884, 0x03c1f91a, 0x02356248, 0x030b80d4, 0x03542b85, 0x003023d1, 0x001d93cf}}, Y: Field{[10]uint32{0x03dca724, 0x01f2d038, 0x038e4b54, 0x02e323ca, 0x03c3ee9e, 0x01e32673, 0x01411468, 0x02d283b6, 0x031abecd, 0x002f64be}}}, + {X: Field{[10]uint32{0x03e68126, 0x01fbdca8, 0x031ab36f, 0x01d4f11e, 0x02b37a80, 0x010042e2, 0x013c86f8, 0x028dfc6f, 0x03bab357, 0x000f5748}}, Y: Field{[10]uint32{0x0334255b, 0x0056575a, 0x028e0821, 0x018424c1, 0x017ccbb4, 0x017e7037, 0x00893c5f, 0x0009960e, 0x0041bdcf, 0x000aef46}}}, + {X: Field{[10]uint32{0x027f8a1e, 0x0095ae0a, 0x00dc087e, 0x01f543d4, 0x006d4ddd, 0x019d67a5, 0x03d2affd, 0x01ee2ffa, 0x01adcdfc, 0x0029c10c}}, Y: Field{[10]uint32{0x0147f593, 0x0091fd64, 0x01f20384, 0x00861bfd, 0x00231639, 0x03bfb32e, 0x03d77e8b, 0x02cbab0c, 0x022b9362, 0x000f290d}}}, + {X: Field{[10]uint32{0x000e8a7d, 0x0358f98c, 0x00697bf7, 0x03689177, 0x032263e9, 0x03177500, 0x00004327, 0x00bb3cf2, 0x02122c1b, 0x000a8e20}}, Y: Field{[10]uint32{0x02f6ff78, 0x00b20884, 0x01175fd7, 0x03669c91, 0x01a339c0, 0x02a6dcea, 0x005f2faf, 0x01efc0f7, 0x018853b8, 0x002b25b4}}}, + {X: Field{[10]uint32{0x024b5451, 0x005f0290, 0x01a9ab4d, 0x03fccc1a, 0x0356b49b, 0x015f8c04, 0x00bc545f, 0x0008bad4, 0x01a40ae3, 0x003a6716}}, Y: Field{[10]uint32{0x029bada0, 0x0111758b, 0x03349baf, 0x0260820d, 0x02b4fe1a, 0x00541645, 0x03737b56, 0x03eaddb0, 0x0379fe55, 0x000a6c92}}}, + {X: Field{[10]uint32{0x003306d4, 0x0300d382, 0x0384bf19, 0x035ac368, 0x03c0be26, 0x030ff8b4, 0x03f1a3c3, 0x0317b7d8, 0x02d1bd5a, 0x0028290b}}, Y: Field{[10]uint32{0x00a0bbc3, 0x033d8457, 0x039e4e5b, 0x01e59c99, 0x008aad08, 0x030c83ba, 0x0293e288, 0x008dd1e8, 0x03d2d444, 0x0030e7fc}}}, + {X: Field{[10]uint32{0x009e0053, 0x021baef0, 0x00b01c0b, 0x021c2dbc, 0x035cc17e, 0x01065cc3, 0x011670e1, 0x03c18fc7, 0x01d69ba9, 0x002e54b9}}, Y: Field{[10]uint32{0x01c46ae0, 0x023c31cb, 0x010ca0fe, 0x026bd4f3, 0x02273a4f, 0x02fc942b, 0x031c9b5b, 0x02e369b9, 0x019fa230, 0x00307a02}}}, + {X: Field{[10]uint32{0x01a4e904, 0x03e0ffa5, 0x01a2e620, 0x02319575, 0x01be83c1, 0x00498872, 0x03892b45, 0x017d3918, 0x033a130f, 0x000ebb89}}, Y: Field{[10]uint32{0x030af7e7, 0x03bac3ef, 0x01131eb7, 0x00d67a32, 0x009237b0, 0x024fe51c, 0x003c6a0b, 0x02db73cb, 0x01c6921f, 0x003b7d1d}}}, + {X: Field{[10]uint32{0x0266ceac, 0x0389576e, 0x0044965c, 0x01974a34, 0x00aa2f9e, 0x021e09ff, 0x0310d91b, 0x02bc1ab2, 0x00dcdc65, 0x00025b77}}, Y: Field{[10]uint32{0x0100ab39, 0x03e14bb4, 0x03584215, 0x01f98080, 0x039e2bf3, 0x0042ef08, 0x030d4fe3, 0x01009320, 0x036817fd, 0x000b9b40}}}, + {X: Field{[10]uint32{0x030334a3, 0x017eb934, 0x004d5af4, 0x039e78d6, 0x01e0d07a, 0x00a507e8, 0x00e111c3, 0x03b276c4, 0x0006c757, 0x003f543d}}, Y: Field{[10]uint32{0x013fde6f, 0x03d2f3f5, 0x03348324, 0x003b184d, 0x00ed9ccb, 0x03e36ca2, 0x01b1d364, 0x001a3f1f, 0x0094d49c, 0x001c6ddd}}}, + {X: Field{[10]uint32{0x03a097d1, 0x0193e45a, 0x03a77d3c, 0x004af28e, 0x03bd0611, 0x015a2ae6, 0x014915c9, 0x01148c18, 0x02681195, 0x001bcb60}}, Y: Field{[10]uint32{0x00787a87, 0x003bde0d, 0x035afe88, 0x01a34097, 0x0297261d, 0x029591e8, 0x017fe722, 0x029f134c, 0x0199849c, 0x002af904}}}, + {X: Field{[10]uint32{0x01cc1400, 0x019091c8, 0x03c9d3f0, 0x036f8988, 0x029c5099, 0x020ca8c4, 0x0283d2ce, 0x02d8a89d, 0x01b76dff, 0x00362303}}, Y: Field{[10]uint32{0x01cec51f, 0x0398d4a3, 0x034ea542, 0x02250c6e, 0x02ba5aa2, 0x0021ccad, 0x001726df, 0x01fa4976, 0x015adf6d, 0x00144d3c}}}, + {X: Field{[10]uint32{0x007105fe, 0x03d55f9d, 0x01562d95, 0x012a9c75, 0x00b6c0fd, 0x0080bf93, 0x01013632, 0x00fca3ab, 0x02e4ddde, 0x002a37a6}}, Y: Field{[10]uint32{0x03be8803, 0x00f8f6a8, 0x0107e038, 0x010dbbea, 0x02536820, 0x01f71d4a, 0x03c39a51, 0x02d85242, 0x006b5a71, 0x0005e7a5}}}, + {X: Field{[10]uint32{0x03cd45ac, 0x00942aa3, 0x037ae6eb, 0x03bf9201, 0x01799c94, 0x003996c3, 0x02a48118, 0x00f50276, 0x0027f7dc, 0x00189b1a}}, Y: Field{[10]uint32{0x01bf2f32, 0x031758cc, 0x01c00fce, 0x02841e06, 0x02b30b7e, 0x036e2397, 0x024a2db8, 0x01eca0cb, 0x01db87cf, 0x0000f596}}}, + {X: Field{[10]uint32{0x00a77d02, 0x01213d0b, 0x004955b5, 0x03bed488, 0x021666eb, 0x03d5b3c0, 0x00b2ef69, 0x03e91f6d, 0x022cf00e, 0x0000a28e}}, Y: Field{[10]uint32{0x0393c82b, 0x0266c5a0, 0x01b01f77, 0x00de5e53, 0x030fc168, 0x009c21b1, 0x00e90fb9, 0x01c3b667, 0x00edfc98, 0x00023740}}}, + {X: Field{[10]uint32{0x01545786, 0x00a4dc30, 0x02bd5dbb, 0x01d5fee4, 0x02c3b672, 0x005e2923, 0x01d0dc2f, 0x01901491, 0x029f27c4, 0x0037c2c0}}, Y: Field{[10]uint32{0x02a1099a, 0x03462900, 0x0279c6cc, 0x012ffa85, 0x01757b47, 0x004067c5, 0x00a5ad4e, 0x0166a204, 0x0105c7e1, 0x003c4cfb}}}, + {X: Field{[10]uint32{0x001a49ef, 0x02ef17f7, 0x02c8b421, 0x020d31f0, 0x020c5497, 0x0229ad8e, 0x02162a4e, 0x002f94b4, 0x03af9c1e, 0x00371bd5}}, Y: Field{[10]uint32{0x00f1a0c4, 0x01f84104, 0x0379e9e9, 0x01287064, 0x0366fca4, 0x02ce26ea, 0x02ee20d9, 0x03f97258, 0x02afe610, 0x001bd61a}}}, + {X: Field{[10]uint32{0x0255cd15, 0x00ece62c, 0x02ac4bf1, 0x00ba838f, 0x03816247, 0x02070764, 0x02dcc0fa, 0x031a4066, 0x02a2e0d2, 0x0036de5b}}, Y: Field{[10]uint32{0x0105ac88, 0x010c4f1f, 0x033e2947, 0x00810ef6, 0x02793754, 0x006478a3, 0x01e07662, 0x03ed1190, 0x02a732e1, 0x000b9831}}}, + {X: Field{[10]uint32{0x01633a2d, 0x03f8da4d, 0x023ca059, 0x01a4c2c1, 0x02881fe2, 0x01d3e233, 0x03a3efce, 0x0263f696, 0x029e72ea, 0x0015a6d9}}, Y: Field{[10]uint32{0x00ca0c8c, 0x02ddd57e, 0x00ca2f76, 0x01bffd3e, 0x02220b6a, 0x03ad78dd, 0x033f7406, 0x03e1c976, 0x02af2551, 0x002eb763}}}, + {X: Field{[10]uint32{0x00468ae4, 0x02b0ccde, 0x02451421, 0x004617f4, 0x02ec7951, 0x00b45d71, 0x036b6f0e, 0x00ceef52, 0x00201f9a, 0x000d84c9}}, Y: Field{[10]uint32{0x033c4314, 0x005863fe, 0x01dee282, 0x005c3655, 0x0262a58e, 0x011d5921, 0x02ba1351, 0x01cd99bb, 0x02cef7bc, 0x003d1ed5}}}, + {X: Field{[10]uint32{0x014a469c, 0x013b4cd2, 0x015b1b60, 0x020f24bf, 0x03855a07, 0x020b6c3f, 0x00fa2431, 0x00805246, 0x00371e4d, 0x00337ac8}}, Y: Field{[10]uint32{0x00dfa7d8, 0x031bde76, 0x03393a83, 0x03555462, 0x02970a7e, 0x0213b941, 0x010098bc, 0x00e074bf, 0x03186829, 0x001f4f1d}}}, + {X: Field{[10]uint32{0x031598ef, 0x005f3f05, 0x03755c87, 0x01d3e36d, 0x03ff6c4d, 0x037a23ff, 0x013b721a, 0x0317b003, 0x03a9d750, 0x00180d73}}, Y: Field{[10]uint32{0x03dd675a, 0x027f6d81, 0x01cb749f, 0x035f5632, 0x029bb129, 0x0120b480, 0x02dcde65, 0x0090d904, 0x00da160b, 0x003f85e6}}}, + {X: Field{[10]uint32{0x0379c0f7, 0x0279068e, 0x02ac18dc, 0x01765f64, 0x00bb250b, 0x011c5e3d, 0x0275b0c0, 0x02639383, 0x0297e499, 0x002c7d4b}}, Y: Field{[10]uint32{0x03df795f, 0x01e942b4, 0x0333d808, 0x03e04093, 0x03de484c, 0x00994717, 0x024370ca, 0x03f6317c, 0x01654e4c, 0x00360fcf}}}, + {X: Field{[10]uint32{0x01f1b641, 0x018ac85b, 0x02477d78, 0x0159094d, 0x03f1a5e0, 0x0357dc26, 0x0011395d, 0x00f6827c, 0x035304c7, 0x002a9e66}}, Y: Field{[10]uint32{0x03248646, 0x00f4b4cc, 0x03338a00, 0x001f2ef9, 0x02dd5920, 0x03ce2aa1, 0x03f68879, 0x016d9164, 0x0047b5e9, 0x000e8c9c}}}, + {X: Field{[10]uint32{0x0045aa03, 0x017a6ee9, 0x023c18d3, 0x026f7631, 0x01262d62, 0x034ce691, 0x01e56b66, 0x03d3f11e, 0x016445bd, 0x00369286}}, Y: Field{[10]uint32{0x029cb70d, 0x00fe4b2d, 0x006d563f, 0x039c9b0b, 0x02353376, 0x00d357b2, 0x02cff296, 0x018e9019, 0x02da25cc, 0x001ece97}}}, + {X: Field{[10]uint32{0x01b8d656, 0x039ccfe8, 0x0384c231, 0x011a81ec, 0x017e620d, 0x003bbc1c, 0x03eba80f, 0x01b4350c, 0x00adc234, 0x0030c02d}}, Y: Field{[10]uint32{0x03cdba42, 0x02a1dc78, 0x023566f4, 0x03691537, 0x02f73448, 0x00402e56, 0x02aa439a, 0x01eb1fcd, 0x03b948d2, 0x000c820e}}}, + {X: Field{[10]uint32{0x00359f04, 0x0162cae5, 0x02be76a3, 0x001f8833, 0x02ed64a9, 0x02437cac, 0x039bf7b0, 0x01c91358, 0x01286793, 0x00315669}}, Y: Field{[10]uint32{0x01bf5977, 0x011c3352, 0x004740d2, 0x03685659, 0x02806d78, 0x00fd10d2, 0x01671b56, 0x03260c83, 0x01aa5c08, 0x0027f2b0}}}, + {X: Field{[10]uint32{0x03e83540, 0x018ccef7, 0x015fa9b9, 0x03af4f9e, 0x01b0911c, 0x020f042c, 0x034bca9a, 0x036fd3c1, 0x01470a46, 0x000e6c40}}, Y: Field{[10]uint32{0x01308278, 0x0250658b, 0x0055e642, 0x005f458a, 0x00168da4, 0x0358cd38, 0x02aa313c, 0x009d0d36, 0x00c8c3b2, 0x002b4d77}}}, + {X: Field{[10]uint32{0x037d6d42, 0x01d2810b, 0x01d6b347, 0x00ba89de, 0x014129ab, 0x00666532, 0x00405970, 0x031805fe, 0x02b7d2de, 0x000e7272}}, Y: Field{[10]uint32{0x03781845, 0x0373a790, 0x013623af, 0x02d32012, 0x0272ca72, 0x01f77ecf, 0x00cdd453, 0x02284cd5, 0x016b835a, 0x0031cfaf}}}, + {X: Field{[10]uint32{0x02c679ed, 0x02d7bbbb, 0x01466fc7, 0x0135104c, 0x03f8f81c, 0x038863b0, 0x02c60972, 0x02d18ab7, 0x01988a30, 0x00069896}}, Y: Field{[10]uint32{0x034114ab, 0x03e3374c, 0x02037bf5, 0x0276e810, 0x033651a3, 0x03884ef5, 0x02776e62, 0x01f26efd, 0x02bb01a9, 0x001ce6fa}}}, + {X: Field{[10]uint32{0x024c4308, 0x008b7eba, 0x003bf3f4, 0x0330fbd9, 0x0085f33e, 0x03ca0ea6, 0x012761eb, 0x030c2350, 0x0110cd35, 0x000e5bb6}}, Y: Field{[10]uint32{0x004dfe57, 0x03467845, 0x01b7f556, 0x01620d9c, 0x013945e1, 0x010a91ac, 0x0048cf84, 0x01852937, 0x01a6a08a, 0x001c8737}}}, + {X: Field{[10]uint32{0x03299a47, 0x02debce6, 0x02becaf7, 0x0100978e, 0x0083e153, 0x002f60c7, 0x02ee96ab, 0x0333f652, 0x02e8a2e8, 0x00294381}}, Y: Field{[10]uint32{0x03beba52, 0x03593f8a, 0x0214f3fc, 0x0068ead7, 0x014521fc, 0x02382178, 0x01a4575e, 0x02018ff9, 0x01b259a1, 0x00164c81}}}, + {X: Field{[10]uint32{0x01c3e1de, 0x03c9adc4, 0x034a3dc3, 0x03591ba3, 0x00dbe15c, 0x00e4fe8d, 0x02c8bcf7, 0x03470398, 0x002317b0, 0x0012a7e0}}, Y: Field{[10]uint32{0x03c6bb71, 0x012faa7d, 0x015ac289, 0x030e5899, 0x00239867, 0x00d3a24a, 0x0330c244, 0x017fff36, 0x036d0091, 0x000103bf}}}, + {X: Field{[10]uint32{0x01608b73, 0x0368bf23, 0x01f055d2, 0x018957b6, 0x007f3232, 0x00bfeee2, 0x0318562e, 0x02df9842, 0x020d9dec, 0x00233978}}, Y: Field{[10]uint32{0x02c720de, 0x03da6386, 0x011b54f1, 0x02caa9c0, 0x0263f024, 0x01649c9e, 0x0292371b, 0x03859003, 0x036cf363, 0x0003ada6}}}, + {X: Field{[10]uint32{0x0083f24b, 0x009be6ed, 0x03e0a367, 0x0358dc02, 0x0184143e, 0x0295503b, 0x02525e28, 0x03a7947c, 0x01d79b53, 0x003cc9a5}}, Y: Field{[10]uint32{0x008471c8, 0x038641f0, 0x0123ef1e, 0x00587185, 0x031d81bd, 0x03f88d24, 0x012ca1f6, 0x00157d96, 0x0088eea2, 0x003a34d9}}}, + {X: Field{[10]uint32{0x02c34d07, 0x01b78775, 0x01959485, 0x02049749, 0x01d92748, 0x01b80822, 0x011ad140, 0x0164b96d, 0x01863bf6, 0x000e09bf}}, Y: Field{[10]uint32{0x03e4cc83, 0x020ec73f, 0x01e97265, 0x0006a240, 0x02020da0, 0x01ffe7e0, 0x0282058a, 0x00d71d0f, 0x01e6a290, 0x003aa1bc}}}, + {X: Field{[10]uint32{0x00ccd551, 0x01904290, 0x03ddd0dc, 0x02a263a1, 0x02ae8611, 0x03b1c9d8, 0x02098684, 0x02c3d46e, 0x00d32e32, 0x001ec6bf}}, Y: Field{[10]uint32{0x02e37884, 0x020a34f4, 0x020efc70, 0x02c2f158, 0x00a3ce0e, 0x02edb42a, 0x0036ee39, 0x0024c420, 0x02f779e1, 0x0037ae9b}}}, + {X: Field{[10]uint32{0x01a91bd4, 0x0118304d, 0x03b63348, 0x0331fdfd, 0x018deddd, 0x019a8db4, 0x00d39b1b, 0x01d61d50, 0x01fed2c2, 0x000fac7f}}, Y: Field{[10]uint32{0x026b36cb, 0x0263e5b4, 0x037b9eb8, 0x011633f3, 0x02642c53, 0x0204a99e, 0x01506cca, 0x039e5186, 0x02ca536a, 0x002e2baa}}}, + {X: Field{[10]uint32{0x0356da8f, 0x012fad66, 0x03c45c21, 0x027a406d, 0x02b71b4d, 0x020fba8b, 0x02290cb6, 0x03f17d4c, 0x02c8aae9, 0x00275876}}, Y: Field{[10]uint32{0x02446036, 0x021d8ace, 0x02271793, 0x0079e28a, 0x01280a8f, 0x0099f3a6, 0x024fc3ee, 0x02c8b9c0, 0x00a42ea1, 0x000b9f2b}}}, + {X: Field{[10]uint32{0x0211c7d8, 0x0343ab8f, 0x0239be38, 0x03bff76e, 0x02e91a43, 0x017b5551, 0x021e37a8, 0x03eaa3a3, 0x02dc3167, 0x000b6cdc}}, Y: Field{[10]uint32{0x01707ffe, 0x01b842d6, 0x023809b0, 0x00d2dc65, 0x0084f005, 0x02d67c3a, 0x0279697f, 0x02f5a85b, 0x0361bc1a, 0x0005aadb}}}, + {X: Field{[10]uint32{0x0005dc80, 0x0008f4a2, 0x000302ff, 0x019fdff1, 0x025b03dd, 0x02b4c4ca, 0x00e83cc9, 0x02d4e14e, 0x02f9f7a2, 0x00263df3}}, Y: Field{[10]uint32{0x02b98943, 0x020417eb, 0x00dd8d65, 0x034fe546, 0x01468bed, 0x03a5a85d, 0x016df891, 0x039b1af5, 0x00232813, 0x000ed03e}}}, + {X: Field{[10]uint32{0x01b62548, 0x0334657b, 0x00c7a363, 0x01853522, 0x02c48f08, 0x02a276d0, 0x01f58528, 0x00349357, 0x026cc8ab, 0x003baacb}}, Y: Field{[10]uint32{0x002649da, 0x002649f2, 0x022cc017, 0x01d100a0, 0x00523a7f, 0x03d7b7c5, 0x03e25030, 0x00ca35ca, 0x01ed65d3, 0x00181f10}}}, + {X: Field{[10]uint32{0x03db942a, 0x00d5c16c, 0x035376d9, 0x0346b69a, 0x03b7cb5e, 0x017ecc6d, 0x029a9d6c, 0x0071c0d1, 0x02ffb216, 0x002557fb}}, Y: Field{[10]uint32{0x01c0864b, 0x0123b905, 0x035a3fdf, 0x0029a0b2, 0x01283fcd, 0x029c4016, 0x039c9846, 0x030d081d, 0x0248a561, 0x002a4656}}}, + {X: Field{[10]uint32{0x00cd85a7, 0x03396b37, 0x025c9d44, 0x0376a606, 0x034db23b, 0x0336b0db, 0x008f5411, 0x03ba7b4f, 0x012d70d2, 0x00086693}}, Y: Field{[10]uint32{0x00ef53b4, 0x01593d71, 0x008e470a, 0x02a4171b, 0x013dbfdd, 0x03193df7, 0x0284aef2, 0x023b05c4, 0x01684300, 0x0019d106}}}, + {X: Field{[10]uint32{0x011ddb23, 0x010a5cbe, 0x028a5ed5, 0x01c5c8b8, 0x020d5945, 0x020b040d, 0x02f5cbd2, 0x02c584b8, 0x010d7794, 0x00125d8a}}, Y: Field{[10]uint32{0x0217ebc4, 0x001185b3, 0x03aec790, 0x00915bd5, 0x0023571c, 0x011b7144, 0x008354b4, 0x015954bf, 0x01f160fc, 0x00133f65}}}, + {X: Field{[10]uint32{0x0072b1c1, 0x0135c8ac, 0x00a4b5c4, 0x02cf0535, 0x021866e0, 0x0267d59d, 0x03b99ed5, 0x02b476ee, 0x03e0268e, 0x0011cb54}}, Y: Field{[10]uint32{0x02831232, 0x01a4fb30, 0x02db8e31, 0x00afb190, 0x01e4dfe8, 0x03659ee2, 0x02d42e31, 0x035352a3, 0x00096115, 0x003a6e70}}}, + {X: Field{[10]uint32{0x00ab18ef, 0x00c9ed1c, 0x01d50da3, 0x03ef0375, 0x003f3462, 0x0169b86c, 0x0075d617, 0x02e572be, 0x037e7a4d, 0x000a9bd6}}, Y: Field{[10]uint32{0x0259d506, 0x039f80e1, 0x033479ad, 0x013a8bcd, 0x02c9f372, 0x002c04f3, 0x01f5b78f, 0x037065f6, 0x03a392aa, 0x00246c91}}}, + {X: Field{[10]uint32{0x03146c19, 0x03e71148, 0x025ba17d, 0x00ae7441, 0x007431a6, 0x0383230f, 0x025e654f, 0x03606ed7, 0x01a3bf48, 0x00370605}}, Y: Field{[10]uint32{0x0194be8f, 0x02f7cbf5, 0x00f36d0f, 0x03dec232, 0x02d837c5, 0x01d1fbfe, 0x03e2af74, 0x0143c391, 0x029a3115, 0x003f881c}}}, + {X: Field{[10]uint32{0x00397776, 0x002db9a6, 0x03c4f1df, 0x033cf9a2, 0x00a8b47e, 0x000ffee6, 0x0295db4f, 0x03bae25e, 0x03ecad8f, 0x00239e54}}, Y: Field{[10]uint32{0x0141ac5d, 0x02c58df0, 0x01157893, 0x03f36aed, 0x0212f7c6, 0x007cc518, 0x0040a395, 0x0073109b, 0x02ef81b2, 0x00176b7c}}}, + {X: Field{[10]uint32{0x019b41a5, 0x03913304, 0x02a7472e, 0x0015b999, 0x01faf96a, 0x019a1b22, 0x0099fe1c, 0x01c92e7a, 0x026b49d5, 0x00293647}}, Y: Field{[10]uint32{0x020a4893, 0x03a77865, 0x0247414a, 0x00aae9cb, 0x02fef10b, 0x02f73f09, 0x02bb820c, 0x019263d6, 0x02150e29, 0x002af5a1}}}, + {X: Field{[10]uint32{0x0300eee9, 0x025210da, 0x0141dd02, 0x008ab2b8, 0x02754c49, 0x02383910, 0x0266dd60, 0x009ae74e, 0x01a4f3e4, 0x002e5c20}}, Y: Field{[10]uint32{0x00f153da, 0x007b5b2e, 0x024f1ea6, 0x01de38a2, 0x022c8c2f, 0x005542c4, 0x029cb641, 0x012ed2ea, 0x00839921, 0x001563db}}}, + {X: Field{[10]uint32{0x03825848, 0x00d0843e, 0x0225ea8c, 0x029ad8d2, 0x00b873a5, 0x01904b15, 0x0273c6ef, 0x026f39c2, 0x02ed8227, 0x001a20ad}}, Y: Field{[10]uint32{0x03f21b3b, 0x027852e7, 0x035aed6b, 0x002487ca, 0x031e3a3b, 0x01a27a28, 0x0279c616, 0x00f8e4ba, 0x02e9c823, 0x0031bf7b}}}, + {X: Field{[10]uint32{0x00717fe8, 0x01fb8691, 0x011a462c, 0x0202b543, 0x011a0dba, 0x013f7acf, 0x03bf11fa, 0x015c272a, 0x03311c71, 0x00271509}}, Y: Field{[10]uint32{0x01f2b045, 0x010a5d74, 0x0058d7ea, 0x01c713c8, 0x00ef4b64, 0x029dfdd8, 0x006bd40c, 0x00d16311, 0x03107816, 0x002a8106}}}, + {X: Field{[10]uint32{0x000cd32c, 0x01ccc31e, 0x015d9357, 0x005c0ec6, 0x024a5ed9, 0x00ef9637, 0x038779de, 0x01704ba0, 0x01a6776b, 0x001ce853}}, Y: Field{[10]uint32{0x02d2c49c, 0x03929c1e, 0x03a78b0c, 0x01d3332c, 0x01ceb585, 0x022fcb22, 0x0067bb7e, 0x0313569d, 0x03fde98e, 0x003101a3}}}, + {X: Field{[10]uint32{0x02af91b5, 0x01b15dad, 0x038ebfdc, 0x00d7677b, 0x028748d8, 0x039b76df, 0x01e9d261, 0x01b136eb, 0x028627d2, 0x00192228}}, Y: Field{[10]uint32{0x016d8ff3, 0x01806f4f, 0x02697b5c, 0x025416b6, 0x033c7f06, 0x0116ec1f, 0x030916a9, 0x0046462b, 0x01f0b050, 0x0009fe2c}}}, + {X: Field{[10]uint32{0x0151046c, 0x02753414, 0x0371bd8c, 0x023865e3, 0x02cca1d3, 0x01f73ef3, 0x01ee2ef4, 0x0132636e, 0x027a5b54, 0x0025951b}}, Y: Field{[10]uint32{0x01f4309d, 0x018329c1, 0x0189e841, 0x01cac984, 0x023b10f7, 0x00257260, 0x00f07d22, 0x03b3fc88, 0x032f8fe9, 0x003413f8}}}, + {X: Field{[10]uint32{0x00fecdf8, 0x0118fb63, 0x00066761, 0x01b20b4a, 0x01e76998, 0x01c808bb, 0x02cdb909, 0x02c50e80, 0x03564598, 0x002e811b}}, Y: Field{[10]uint32{0x0227250f, 0x000c8c8f, 0x01d68536, 0x00341de3, 0x023e57bc, 0x034f676a, 0x007d37c0, 0x015f0550, 0x03abd424, 0x003f1b88}}}, + {X: Field{[10]uint32{0x02d0e4ec, 0x02e02bd6, 0x027df310, 0x01fec4f2, 0x005e7655, 0x021aa081, 0x02d82ed0, 0x0329f77d, 0x0351e633, 0x000e5551}}, Y: Field{[10]uint32{0x006d3b1c, 0x021ac0a8, 0x03b4f894, 0x00f0bee6, 0x03cdb2ba, 0x03ea8fd9, 0x03df5e95, 0x03c83a5d, 0x0284f040, 0x002915ae}}}, + {X: Field{[10]uint32{0x009c22aa, 0x029a2926, 0x0317cd46, 0x035c0386, 0x01ba56b8, 0x00411b0f, 0x016c9241, 0x027f5c36, 0x00e75fef, 0x00317d54}}, Y: Field{[10]uint32{0x03ac3fa9, 0x030d8d89, 0x02cc2173, 0x010b723c, 0x038d65ea, 0x03b9f43e, 0x02a987ac, 0x02d85d55, 0x02e03aea, 0x00152160}}}, + {X: Field{[10]uint32{0x025fa050, 0x026ab35b, 0x0327eb99, 0x01d5e6c9, 0x0326d4ba, 0x03818e90, 0x000b2a0e, 0x0236ce6a, 0x0210a48d, 0x000b3305}}, Y: Field{[10]uint32{0x00348c84, 0x00fe5ffe, 0x02b70a07, 0x01a524a3, 0x03fa205d, 0x01e79610, 0x01cb17b1, 0x0000b023, 0x03db2114, 0x00379b75}}}, + {X: Field{[10]uint32{0x03084b3f, 0x0227843d, 0x012c5add, 0x03e3f9ba, 0x003ae59c, 0x03639919, 0x00089ff2, 0x00721079, 0x00e73e94, 0x0024ec1f}}, Y: Field{[10]uint32{0x0018fa63, 0x02a03910, 0x03634cb5, 0x03fb8634, 0x02533efc, 0x018a686b, 0x02c362d3, 0x0099f953, 0x0076c5a7, 0x00029b01}}}, + {X: Field{[10]uint32{0x0291e7e9, 0x03015996, 0x03a3e438, 0x001d872e, 0x02b0ec27, 0x01a166c5, 0x03aeec82, 0x0119e578, 0x01f055c1, 0x00114f00}}, Y: Field{[10]uint32{0x016766b2, 0x016f1269, 0x033d9874, 0x026794b9, 0x030e14ac, 0x00221096, 0x03738436, 0x032288bb, 0x02c9b9d3, 0x003ca3ab}}}, + {X: Field{[10]uint32{0x000f12f1, 0x0359197a, 0x027946f8, 0x013012a5, 0x00c1d09a, 0x0055656e, 0x02148fad, 0x0230a282, 0x01fdac07, 0x000f1b7c}}, Y: Field{[10]uint32{0x02a5b58d, 0x033c99e0, 0x0354f6df, 0x01700542, 0x02d443db, 0x039fb4a4, 0x02a68212, 0x004d2e81, 0x004d4eaa, 0x0011866a}}}, + {X: Field{[10]uint32{0x01b98630, 0x033160c4, 0x02fd600d, 0x03e49c17, 0x03f12054, 0x0240836f, 0x01429895, 0x025e14c1, 0x01683995, 0x0006dfda}}, Y: Field{[10]uint32{0x00645c25, 0x03670803, 0x00a37372, 0x00574305, 0x0067ee9e, 0x0223b1bc, 0x01731c9b, 0x03ea33ef, 0x023ee3e8, 0x0009e771}}}, + {X: Field{[10]uint32{0x03fccc19, 0x03610bef, 0x0300697a, 0x03da7340, 0x006256f2, 0x013489db, 0x010a6427, 0x0342e66e, 0x01539d49, 0x00386dee}}, Y: Field{[10]uint32{0x01f9500f, 0x03763435, 0x03316fd0, 0x036c9fe4, 0x00f2acfe, 0x027a054d, 0x004628b1, 0x0195a614, 0x016f51dc, 0x000ac8ee}}}, + {X: Field{[10]uint32{0x0354f911, 0x0205f22b, 0x012bf4bc, 0x017e9588, 0x039ce552, 0x02a5d193, 0x015f79bb, 0x0108cd2f, 0x00c56fbf, 0x0010133c}}, Y: Field{[10]uint32{0x031ef662, 0x00b29907, 0x03c0f2e2, 0x02d5e625, 0x02023c04, 0x0178d95e, 0x021a6e07, 0x00162171, 0x02098830, 0x002d6481}}}, + {X: Field{[10]uint32{0x00aae0c1, 0x038bb243, 0x0171f43f, 0x03b05faa, 0x00e7819a, 0x00268d10, 0x02e817fa, 0x01af63bf, 0x0186da62, 0x0010fc76}}, Y: Field{[10]uint32{0x0274f9ad, 0x028802ca, 0x03583e51, 0x00e0acea, 0x033e93f4, 0x005d45e7, 0x0011f518, 0x0246ab4a, 0x02ce0ce8, 0x00317e96}}}, + {X: Field{[10]uint32{0x005b9c1f, 0x03b2bd83, 0x028fcd23, 0x03a2d9fb, 0x027bbcaa, 0x02dd8844, 0x02183b81, 0x0265445a, 0x01c6b320, 0x00286211}}, Y: Field{[10]uint32{0x03ef1f44, 0x030a546e, 0x03b02dfc, 0x03c573ae, 0x038f54e7, 0x020619c6, 0x03c5350e, 0x01f9acb3, 0x01d9d7e0, 0x002603b5}}}, + {X: Field{[10]uint32{0x03ac01ed, 0x00124839, 0x015aa2a3, 0x02b7009b, 0x00254c38, 0x000f24a7, 0x01cc17be, 0x02609181, 0x03eb0af9, 0x00013671}}, Y: Field{[10]uint32{0x03e781d3, 0x01070654, 0x031c970d, 0x02e67ea6, 0x0097065b, 0x00cd83dd, 0x033cf00f, 0x03394c89, 0x0335bb0d, 0x00319316}}}, + {X: Field{[10]uint32{0x03e7c25d, 0x03ab7225, 0x00814eda, 0x03dc1319, 0x0155953e, 0x03a2a981, 0x01317833, 0x036c26f3, 0x02f2fbc3, 0x00386348}}, Y: Field{[10]uint32{0x03c7e07e, 0x03ca88bb, 0x00b5953e, 0x02ca15c0, 0x000f15b8, 0x032aa1c0, 0x037989df, 0x0081c893, 0x02817115, 0x00330962}}}, + {X: Field{[10]uint32{0x0247879d, 0x02f6f94a, 0x03d5a3c8, 0x029e6f0d, 0x0035083a, 0x030505fa, 0x02ec9a60, 0x02413e34, 0x01f9f220, 0x0005815d}}, Y: Field{[10]uint32{0x0279a5e5, 0x0157e4d4, 0x034ce0d6, 0x012cc274, 0x012c3870, 0x0350e7fb, 0x0191c60a, 0x025e3504, 0x00a6127e, 0x000795ad}}}, + {X: Field{[10]uint32{0x0192d514, 0x0280dc94, 0x03e53f9a, 0x01aa850d, 0x034c3c9f, 0x00f14d56, 0x02b7ebdd, 0x03589935, 0x03c757b1, 0x000ed946}}, Y: Field{[10]uint32{0x00231c3f, 0x015861a0, 0x022e419e, 0x01682287, 0x025feb28, 0x03722927, 0x031d8ec5, 0x000c483f, 0x03749599, 0x0025dea1}}}, + {X: Field{[10]uint32{0x02ba532a, 0x01e6a3c5, 0x03b0cd95, 0x02587f5a, 0x02a9660e, 0x0262aca1, 0x00250154, 0x033009d8, 0x01ef56fa, 0x0024216f}}, Y: Field{[10]uint32{0x02e9fe89, 0x01443c5e, 0x013b8c55, 0x005a3dae, 0x0368364c, 0x003a039e, 0x03f791d9, 0x01567179, 0x0108a557, 0x003f4174}}}, + {X: Field{[10]uint32{0x000569ec, 0x01151239, 0x00c21fef, 0x0095db87, 0x0067cf1b, 0x007c2b3a, 0x033aab8c, 0x00e18bf4, 0x006df64a, 0x0010890c}}, Y: Field{[10]uint32{0x020661bc, 0x004f563d, 0x032498bd, 0x0257fe59, 0x0063e723, 0x016790b9, 0x0087c2dc, 0x02f0773a, 0x02675279, 0x0021d02d}}}, + {X: Field{[10]uint32{0x0022935c, 0x00f28d77, 0x009182f8, 0x0303fd68, 0x02e0e2b2, 0x02f157b9, 0x03806b35, 0x00b8c69b, 0x02974a51, 0x002dcdd9}}, Y: Field{[10]uint32{0x01420103, 0x00a820a1, 0x0046251c, 0x000e75a2, 0x01890b3e, 0x023f572f, 0x00152a24, 0x03eb7bb9, 0x00202676, 0x0034d432}}}, + {X: Field{[10]uint32{0x010eb97a, 0x01093693, 0x01574557, 0x01a32ea0, 0x02bb82e0, 0x03069d21, 0x00505ab1, 0x0353429f, 0x038ed3b5, 0x001cee93}}, Y: Field{[10]uint32{0x02188271, 0x0292ff89, 0x01215adc, 0x026dc950, 0x013a58ba, 0x0218f4fe, 0x01b4a2d0, 0x030d8152, 0x0114552d, 0x0024ebce}}}, + {X: Field{[10]uint32{0x03d3d8ea, 0x012f80db, 0x01bef052, 0x0101af38, 0x020ae935, 0x01a52c14, 0x00576c45, 0x0093663c, 0x014e1747, 0x000a1680}}, Y: Field{[10]uint32{0x029af7dc, 0x00f9f21a, 0x028cab39, 0x01965a33, 0x039d4067, 0x0247536d, 0x03f5213f, 0x01dd5f9b, 0x01d8d2ce, 0x001bf6b4}}}, + {X: Field{[10]uint32{0x028e768f, 0x021a77b0, 0x01180963, 0x01e3b283, 0x0384c2fd, 0x01be302a, 0x025cea7c, 0x02d52e8a, 0x01d727bf, 0x002c24d3}}, Y: Field{[10]uint32{0x00b982c6, 0x01c2763c, 0x031bf2bc, 0x03df4535, 0x03484c94, 0x036c2644, 0x02bbb26e, 0x027cc52f, 0x01115602, 0x00372bc3}}}, + {X: Field{[10]uint32{0x03681561, 0x032303d6, 0x0365ec45, 0x033cd5ee, 0x02ffcb49, 0x03bc5742, 0x011c8bcc, 0x02a772dd, 0x02dd8b69, 0x000ed89e}}, Y: Field{[10]uint32{0x0046d19d, 0x00a5bf37, 0x015e1536, 0x02ee9dc8, 0x03693cd2, 0x0349f3fd, 0x02133649, 0x0202dcb6, 0x018009e3, 0x0002f686}}}, + {X: Field{[10]uint32{0x02cb5ac2, 0x00a8da54, 0x027c90a6, 0x01d9722a, 0x02e45938, 0x011d9b6a, 0x012e3f9a, 0x02277e81, 0x01ec1f22, 0x001f923f}}, Y: Field{[10]uint32{0x018cb5f2, 0x00e12e6f, 0x039ac61e, 0x023984a4, 0x0168449b, 0x02fb6d27, 0x021e10c5, 0x01a2159b, 0x007aac11, 0x003a1ebe}}}, + {X: Field{[10]uint32{0x023ffd9d, 0x03390f89, 0x0008b181, 0x02432a84, 0x00d094d8, 0x03bb0b90, 0x022c267f, 0x00eeeada, 0x008a5de3, 0x00100c7c}}, Y: Field{[10]uint32{0x01b0be07, 0x026dfc14, 0x006b58a7, 0x038c46e5, 0x01a8f23b, 0x0077fbd1, 0x0389beb9, 0x0297c269, 0x03d99737, 0x0033f713}}}, + {X: Field{[10]uint32{0x031ed764, 0x001fafe4, 0x00b1dd54, 0x00b1ee40, 0x00ec00a2, 0x03510730, 0x02e656f4, 0x036ed6fd, 0x037c61dd, 0x002e994a}}, Y: Field{[10]uint32{0x00029556, 0x011341c0, 0x00088a3b, 0x02566964, 0x001d2070, 0x00f19f80, 0x030b5d8d, 0x02055a8c, 0x0392d122, 0x0021ff2c}}}, + {X: Field{[10]uint32{0x0190e72d, 0x0307b419, 0x03b1bffd, 0x02e6e834, 0x0362c967, 0x03630c3c, 0x03dd95d2, 0x01d94eb1, 0x0172d101, 0x003ee4d9}}, Y: Field{[10]uint32{0x0036d8ed, 0x01e62092, 0x00587b08, 0x0119ad29, 0x02940382, 0x02562f8b, 0x03799659, 0x01a8c429, 0x03afdb6b, 0x002b7e8d}}}, + {X: Field{[10]uint32{0x003bae7b, 0x02621c2c, 0x01148991, 0x00a065a1, 0x01b97ff3, 0x021844a7, 0x006fdb78, 0x00214bdf, 0x03cb5e7c, 0x000a511c}}, Y: Field{[10]uint32{0x0190c86a, 0x03bb0e1f, 0x03617246, 0x0169b1d9, 0x0078463e, 0x02f56d28, 0x0209f951, 0x0219e9e2, 0x0136f991, 0x002f6415}}}, + {X: Field{[10]uint32{0x01bc574e, 0x01b21cf1, 0x00c0944a, 0x0231b4e9, 0x007687dc, 0x01a0edd3, 0x0337ced1, 0x00cff645, 0x004f73a6, 0x000bf03d}}, Y: Field{[10]uint32{0x0122ad1f, 0x001cd507, 0x0118415e, 0x01426914, 0x03ac572f, 0x02b8dcfa, 0x01499912, 0x018fe53a, 0x00eeffa0, 0x000a645f}}}, + {X: Field{[10]uint32{0x016d569e, 0x03009444, 0x00c40b9a, 0x03720eee, 0x018da210, 0x023b628c, 0x01d34f2c, 0x0169fbd6, 0x0251882c, 0x002047ec}}, Y: Field{[10]uint32{0x00a0c55d, 0x02464636, 0x00c00ad2, 0x001c170f, 0x02d480e4, 0x0250379a, 0x0204ad3f, 0x016be93b, 0x01472cb5, 0x001d37d9}}}, + {X: Field{[10]uint32{0x03fc5d07, 0x01f9852d, 0x0057ba9e, 0x03160bf7, 0x03c47996, 0x03539f94, 0x0051894a, 0x033c247d, 0x017cc1d6, 0x00116a78}}, Y: Field{[10]uint32{0x03069be1, 0x0072ab5e, 0x01bbb16d, 0x01b70dff, 0x034e1919, 0x02260cad, 0x02d19200, 0x0187d7ec, 0x004f0026, 0x00145a77}}}, + {X: Field{[10]uint32{0x01588e67, 0x03426bad, 0x00102645, 0x00e2de30, 0x00abd065, 0x02d71ef5, 0x003d96aa, 0x029eb51d, 0x03fc45cd, 0x00355dfd}}, Y: Field{[10]uint32{0x003be07a, 0x001c4a0c, 0x0125e521, 0x00b0c2ff, 0x02765e2c, 0x0231e33a, 0x011db618, 0x015f7f3b, 0x03717ea2, 0x001545ca}}}, + {X: Field{[10]uint32{0x0306e44f, 0x03846c66, 0x019c0650, 0x022ddde9, 0x024fb22d, 0x012c33bf, 0x0371e08d, 0x02a9b8e6, 0x02958098, 0x002990a6}}, Y: Field{[10]uint32{0x007dd2ed, 0x02992c65, 0x027dcf6a, 0x0097cb0e, 0x0336ab18, 0x0218902a, 0x00440f57, 0x0015772b, 0x02625587, 0x002bd253}}}, + {X: Field{[10]uint32{0x039a743d, 0x025a59e8, 0x00679073, 0x01e98f88, 0x0050bca3, 0x03d1e3ba, 0x00b1c80c, 0x0052d096, 0x0304b893, 0x0003ddf0}}, Y: Field{[10]uint32{0x01c1c7ee, 0x0218dfe3, 0x02c727e7, 0x00515638, 0x011c32f4, 0x003d03c6, 0x00452136, 0x0052f982, 0x017629d9, 0x003121e8}}}, + {X: Field{[10]uint32{0x02d1c988, 0x01985965, 0x01f5def7, 0x00bfecbe, 0x02cd76ea, 0x007b7b7a, 0x03f0a82e, 0x00491dc7, 0x02f61598, 0x001071bc}}, Y: Field{[10]uint32{0x01accb68, 0x02d4aa41, 0x031d3407, 0x0039176f, 0x02364277, 0x026da1f1, 0x039ed4ff, 0x00681d7f, 0x0144146c, 0x0016283d}}}, + {X: Field{[10]uint32{0x02b968d0, 0x019bb4cb, 0x01916cdf, 0x035c7f6d, 0x037ac2d2, 0x015d978f, 0x02aaacb3, 0x00debc27, 0x02c8c13d, 0x00321c93}}, Y: Field{[10]uint32{0x00d81221, 0x03495791, 0x029895ec, 0x03b69e18, 0x026ade66, 0x00af669b, 0x014bbf24, 0x00f9b79f, 0x03214210, 0x001c3b3d}}}, + {X: Field{[10]uint32{0x031fbbf2, 0x02ea7cff, 0x00650653, 0x012b81c3, 0x023b139e, 0x01d7ead9, 0x02204a2b, 0x0238daf8, 0x00460dd5, 0x0038a223}}, Y: Field{[10]uint32{0x0342509e, 0x00acd4c8, 0x0108c331, 0x02625488, 0x01bc1584, 0x0082f580, 0x01888797, 0x00ee2adf, 0x00dae139, 0x001c5644}}}, + {X: Field{[10]uint32{0x02d834dd, 0x02b0dbd9, 0x01ec1c14, 0x00d847aa, 0x01f56cf7, 0x02a99be6, 0x01999c9a, 0x0202e1ad, 0x0384d72d, 0x003c7d30}}, Y: Field{[10]uint32{0x00cc7e3f, 0x039cdd49, 0x03c44835, 0x0229a5ac, 0x02219838, 0x0326a9e1, 0x038527a3, 0x010b23ae, 0x03c24801, 0x002d550e}}}, + {X: Field{[10]uint32{0x01940a5b, 0x0204ad0c, 0x01e73f61, 0x0298d067, 0x0217aec3, 0x03b75fd6, 0x028d4126, 0x02df6c1d, 0x03f5832f, 0x00121d1d}}, Y: Field{[10]uint32{0x032608a7, 0x01e35786, 0x03c54c5f, 0x0158db6d, 0x020284f5, 0x00a9b55a, 0x004e3dc3, 0x03ea62f1, 0x01de4203, 0x00240c8b}}}, + {X: Field{[10]uint32{0x00ca75af, 0x02bc0dc5, 0x0229bff8, 0x000a7f84, 0x010c55df, 0x02cfba7d, 0x00f957e0, 0x019f892e, 0x023a5831, 0x0029c9a5}}, Y: Field{[10]uint32{0x008f7449, 0x01945b70, 0x0232d99f, 0x00954e96, 0x034a6369, 0x02d9507f, 0x0154d156, 0x00a70204, 0x0184d689, 0x0023f5ea}}}, + {X: Field{[10]uint32{0x0399e97c, 0x00ab16e2, 0x03033876, 0x030b8804, 0x00baa763, 0x01a669a3, 0x013a231e, 0x03ac7276, 0x01b4cf80, 0x00353083}}, Y: Field{[10]uint32{0x00eca01f, 0x031be7db, 0x0287a426, 0x00381624, 0x01f5abc5, 0x0246428d, 0x02a20713, 0x02943212, 0x03ba2555, 0x002e871d}}}, + {X: Field{[10]uint32{0x02748168, 0x027bf88e, 0x03afafa5, 0x0076b15b, 0x025159ba, 0x036343cd, 0x01b5a55a, 0x01c0aefb, 0x005389ae, 0x0001f3e7}}, Y: Field{[10]uint32{0x032336b8, 0x00e140ad, 0x0296f6ec, 0x0029ba90, 0x03489bee, 0x00c4d23b, 0x00ec347c, 0x01eef28b, 0x0324338c, 0x003b38ec}}}, + {X: Field{[10]uint32{0x00b73e55, 0x009506d1, 0x02f49699, 0x00ced36e, 0x03eec928, 0x00c9a01b, 0x039f9c30, 0x0352bce5, 0x00e3c1eb, 0x00248042}}, Y: Field{[10]uint32{0x01f466fc, 0x00b88025, 0x01395ba9, 0x01e1493d, 0x016cf8f4, 0x02e92399, 0x003f348e, 0x03120d3c, 0x0133d8ad, 0x000f88ac}}}, + {X: Field{[10]uint32{0x02479e90, 0x02da7109, 0x02a8a4fe, 0x00e12559, 0x03fc7605, 0x02b4ca94, 0x03613372, 0x021d8a6c, 0x038a98c4, 0x000559ab}}, Y: Field{[10]uint32{0x02997796, 0x02a145b6, 0x03926dab, 0x02ebacfd, 0x030da5d3, 0x00bf871e, 0x017db986, 0x00af931e, 0x01664bd7, 0x000a1231}}}, + {X: Field{[10]uint32{0x0361723c, 0x01daaf2b, 0x03044c0f, 0x02f89c7b, 0x01d2f6d9, 0x00ac2a2c, 0x017a7041, 0x0233af1f, 0x027102eb, 0x002936d7}}, Y: Field{[10]uint32{0x002e8ca4, 0x023232b1, 0x036a5695, 0x00abcae7, 0x03272f5f, 0x01ea501e, 0x004bc0a2, 0x00f777d8, 0x02e075a7, 0x00198f85}}}, + {X: Field{[10]uint32{0x0153e5fb, 0x00ef29e3, 0x00c13849, 0x01dd81de, 0x0333d90e, 0x031e73c6, 0x025d1106, 0x02e3e418, 0x03538bbd, 0x00343273}}, Y: Field{[10]uint32{0x021d9a60, 0x01e418e2, 0x01bd9683, 0x02201f70, 0x009975ad, 0x02e2f4c3, 0x00a21250, 0x03501f30, 0x020e8b9f, 0x002dbb33}}}, + {X: Field{[10]uint32{0x03d8391f, 0x01f39e3f, 0x0204ce65, 0x0051538e, 0x014a58d5, 0x033ce8e2, 0x0196d67b, 0x015ef5c1, 0x0292480f, 0x001d97ee}}, Y: Field{[10]uint32{0x0218302f, 0x03b24087, 0x023dbaf6, 0x02f57ceb, 0x0050879b, 0x03d06ad3, 0x03b552e3, 0x00d43968, 0x03ba1035, 0x00172c76}}}, + {X: Field{[10]uint32{0x03fb4a5e, 0x007b9be2, 0x025032c5, 0x02396bd2, 0x009bd3f8, 0x022d94be, 0x02a7b9b6, 0x01c0ad2a, 0x01e8e846, 0x0027e76a}}, Y: Field{[10]uint32{0x0296a0f6, 0x028b5fd5, 0x0284dedf, 0x02374b01, 0x021d8da0, 0x001a22b2, 0x017320ca, 0x005ec3ac, 0x019d7ecf, 0x00176f52}}}, + {X: Field{[10]uint32{0x03fdd3f4, 0x02480884, 0x025bfb11, 0x0272d196, 0x00ad949c, 0x006bbd7c, 0x03b1a166, 0x02252dcb, 0x003bdb95, 0x002be1b2}}, Y: Field{[10]uint32{0x0399e117, 0x03cf04b5, 0x00e55123, 0x02e6c6e2, 0x03004a7b, 0x0310709b, 0x03d2b25c, 0x00046580, 0x027d5541, 0x003b01a0}}}, + {X: Field{[10]uint32{0x01587e77, 0x03e8d43f, 0x0309cd94, 0x02c8b32e, 0x0364c8e3, 0x0202f8ce, 0x032b3fcc, 0x02f2341d, 0x01932fcc, 0x003eed22}}, Y: Field{[10]uint32{0x00c0b858, 0x0046db36, 0x03e04811, 0x035095ee, 0x0258598a, 0x00d01d69, 0x0051abd6, 0x00cf6acd, 0x01242793, 0x0003e737}}}, + {X: Field{[10]uint32{0x02d60684, 0x03b7079f, 0x0269bae6, 0x03e242a4, 0x00621f36, 0x00ab7270, 0x0315ecae, 0x030abd8a, 0x01a3ad97, 0x00103b2c}}, Y: Field{[10]uint32{0x0158b32e, 0x02a8014d, 0x005f288d, 0x02cfb661, 0x019a41f4, 0x008c07ee, 0x00e3e2b3, 0x0185f648, 0x0194fa3a, 0x003fe7b0}}}, + {X: Field{[10]uint32{0x00878f52, 0x01802706, 0x03691973, 0x00c31f4e, 0x0339873c, 0x03f808e3, 0x03d9014b, 0x00ad0bf2, 0x02f10c76, 0x000c7e24}}, Y: Field{[10]uint32{0x01718c95, 0x00d9cd25, 0x03ff7be5, 0x02e3df53, 0x015cd610, 0x03dae4b0, 0x0131066e, 0x01cd154c, 0x0005f31f, 0x00366f54}}}, + {X: Field{[10]uint32{0x00886c5c, 0x025bf209, 0x028f31c6, 0x024e32ad, 0x03921f81, 0x0175dce7, 0x014d150c, 0x001478b6, 0x0129e9f6, 0x002e8489}}, Y: Field{[10]uint32{0x016b1ed1, 0x01c926a1, 0x03c20d9c, 0x02730e5a, 0x007c0285, 0x01eb2708, 0x00577d33, 0x0354e46c, 0x031f7e9b, 0x0030cf01}}}, + {X: Field{[10]uint32{0x0124cf03, 0x030857ca, 0x018c5030, 0x024f5605, 0x03ef45d9, 0x02e68098, 0x013ecbc5, 0x034c4726, 0x00129a26, 0x000d4c59}}, Y: Field{[10]uint32{0x023a9742, 0x031b4d5e, 0x00e3f6a9, 0x01be460d, 0x03f92ef0, 0x016d8e16, 0x023e2d9c, 0x008eee73, 0x00d95216, 0x0021a988}}}, + {X: Field{[10]uint32{0x02c8e462, 0x00628854, 0x033ebf97, 0x02b1e146, 0x004a4aa7, 0x013b1fe7, 0x02ce92ca, 0x012a98d7, 0x030be413, 0x000c091d}}, Y: Field{[10]uint32{0x03c8c8ee, 0x03ac143f, 0x01225bbc, 0x02abe063, 0x00ab3f8f, 0x039ce139, 0x01c1579c, 0x01ebf85b, 0x03bd7214, 0x0007f3eb}}}, + {X: Field{[10]uint32{0x03da6564, 0x0340721a, 0x0071a672, 0x02993742, 0x02533c1b, 0x02507638, 0x02dbf169, 0x03a1b16d, 0x013da40e, 0x003d6e8c}}, Y: Field{[10]uint32{0x0000647d, 0x012eeb6e, 0x018c7294, 0x02090dfd, 0x018f9652, 0x01555d92, 0x02e95ec1, 0x01e41f25, 0x010db969, 0x000042a4}}}, + {X: Field{[10]uint32{0x0264e2f1, 0x02d6715c, 0x018ebb33, 0x00f84cb0, 0x00e485a2, 0x00632546, 0x037f426b, 0x033414d3, 0x03e2972c, 0x001a1785}}, Y: Field{[10]uint32{0x01f291c6, 0x000513ae, 0x03a0cb93, 0x00b77a83, 0x03470fd4, 0x00455b6b, 0x03a3f475, 0x02ab069d, 0x0338be84, 0x00259516}}}, + {X: Field{[10]uint32{0x03f119eb, 0x03d97466, 0x028e0504, 0x03718749, 0x01fdd481, 0x03a4701f, 0x01e1bca7, 0x02608a96, 0x01fdfacc, 0x003804a1}}, Y: Field{[10]uint32{0x01c39909, 0x01f5b967, 0x010630f7, 0x01790719, 0x0140bf5b, 0x01c80ae6, 0x003615ba, 0x036aebbe, 0x013a2479, 0x002ba085}}}, + {X: Field{[10]uint32{0x01839601, 0x00872c15, 0x03220b54, 0x024dd8d7, 0x0093798a, 0x024c8079, 0x00d67200, 0x0043b1e1, 0x01863277, 0x00318791}}, Y: Field{[10]uint32{0x006c04ea, 0x02e32c9d, 0x0026dcde, 0x03c5d0cf, 0x025d42fc, 0x02e95572, 0x023e0163, 0x01939e87, 0x03f5aa5b, 0x0039187e}}}, + {X: Field{[10]uint32{0x03d192d4, 0x01f597c7, 0x01af3be8, 0x00d2400a, 0x013106fc, 0x004ed876, 0x00d8ca25, 0x0242db89, 0x02cb4e58, 0x0007109e}}, Y: Field{[10]uint32{0x02cf29d0, 0x03b0310d, 0x023e9c9c, 0x0357ba2b, 0x0184935a, 0x030d0c28, 0x0304fa6e, 0x014a2e6e, 0x00251518, 0x000765b8}}}, + {X: Field{[10]uint32{0x012fd8e7, 0x037dbc7c, 0x02f54431, 0x0066d660, 0x005a9326, 0x01f51c2e, 0x02ddb3ba, 0x0225ed2d, 0x03fd6d51, 0x001795de}}, Y: Field{[10]uint32{0x011c6eb4, 0x03535e48, 0x01ff9203, 0x01131eb4, 0x00123cb0, 0x02969ff4, 0x0036e908, 0x030674ea, 0x02929734, 0x0030685c}}}, + {X: Field{[10]uint32{0x00237b30, 0x00ed028a, 0x028a6817, 0x01d9b4fa, 0x02adc6ae, 0x03ef2b7c, 0x03aefc8d, 0x022902eb, 0x03331f96, 0x00331e2c}}, Y: Field{[10]uint32{0x01857d42, 0x02c29011, 0x038aa14e, 0x01f250db, 0x00dfc2ce, 0x0048e32d, 0x01ef04b4, 0x0301a3fc, 0x01b20a5b, 0x0016dda4}}}, + {X: Field{[10]uint32{0x00919fb6, 0x020c293b, 0x0016a0b1, 0x00aa56b7, 0x02c44537, 0x02bcfb3a, 0x01dc288f, 0x0113ca79, 0x0037487b, 0x000e1571}}, Y: Field{[10]uint32{0x009359d2, 0x00a1f20a, 0x0151911c, 0x03d7868e, 0x01ed1949, 0x0022f6f5, 0x03bcd5b3, 0x03e8a153, 0x029a48cb, 0x0037cb87}}}, + {X: Field{[10]uint32{0x01d16b19, 0x016119ae, 0x03c928f1, 0x0086df79, 0x00dc62cb, 0x01f6cf5b, 0x03fcf6b9, 0x00d5bf17, 0x03b40a83, 0x0030148c}}, Y: Field{[10]uint32{0x0254f500, 0x038efde7, 0x0327525e, 0x03d4588c, 0x00956616, 0x007a3795, 0x020eac65, 0x02211cfe, 0x02390ce7, 0x0002c6f6}}}, + {X: Field{[10]uint32{0x019dfffb, 0x039f7b02, 0x0010b455, 0x00799586, 0x010b736c, 0x02407cd5, 0x02000245, 0x009a9f66, 0x013cf342, 0x001b0193}}, Y: Field{[10]uint32{0x009eb9a7, 0x02093358, 0x002e9925, 0x01dca349, 0x02aa5444, 0x0071710b, 0x00f8fd2a, 0x030687e0, 0x0042d25e, 0x00058365}}}, + {X: Field{[10]uint32{0x03714cf2, 0x01eea762, 0x01009bf3, 0x01c91e27, 0x01b3e207, 0x00379a9f, 0x021a93a0, 0x006a946d, 0x038970bb, 0x0025963a}}, Y: Field{[10]uint32{0x02c51cc2, 0x00c07aa4, 0x01ff7a58, 0x012665f5, 0x0096be89, 0x01036278, 0x021a903f, 0x023e2de0, 0x00aff7da, 0x003352e9}}}, + {X: Field{[10]uint32{0x03b4f0c8, 0x039fa992, 0x031b87a3, 0x01a69c70, 0x035cf1f9, 0x00fe65bd, 0x032b0c4c, 0x01bdc247, 0x0110a554, 0x001b808e}}, Y: Field{[10]uint32{0x00c459c5, 0x026b76cd, 0x0358999b, 0x00d99470, 0x007faa9b, 0x0362486e, 0x02d8cfc7, 0x01cd3767, 0x01d790ec, 0x003dbb59}}}, + {X: Field{[10]uint32{0x00c7ff6e, 0x023e2655, 0x03a141e6, 0x006f5831, 0x03926290, 0x00cc14df, 0x003528e0, 0x001267e4, 0x0098e970, 0x000e8d6b}}, Y: Field{[10]uint32{0x032069ed, 0x00e36865, 0x00eb6c4d, 0x03e29d91, 0x001f247f, 0x03b68e09, 0x014ac0c9, 0x0070c14e, 0x0116da63, 0x00244f65}}}, + {X: Field{[10]uint32{0x036af212, 0x014395c1, 0x023db073, 0x01bc925d, 0x022317c6, 0x02c6522f, 0x036def30, 0x02a916a2, 0x025115df, 0x0034227e}}, Y: Field{[10]uint32{0x00a6da9c, 0x03f720c6, 0x00f6ab12, 0x02b12864, 0x03a18e5d, 0x00ffe844, 0x025120cf, 0x03eb11de, 0x0173f326, 0x00139aba}}}, + {X: Field{[10]uint32{0x018cf2ef, 0x02ecb083, 0x036ab045, 0x0357de42, 0x005b9cd9, 0x00f654c7, 0x00ea0f23, 0x00aad1d2, 0x012f2aa6, 0x0039ccf1}}, Y: Field{[10]uint32{0x0182a291, 0x00377c75, 0x02d89fb8, 0x0215c314, 0x0336ac48, 0x035ffdd4, 0x0323ab28, 0x01ca4eb2, 0x01c93c67, 0x001c0455}}}, + {X: Field{[10]uint32{0x03f14c7a, 0x02bdd8f9, 0x01b9be8c, 0x002ee065, 0x021eb477, 0x00aeafe1, 0x00aa6f24, 0x01a13f99, 0x037dc006, 0x0012dbde}}, Y: Field{[10]uint32{0x0194e00d, 0x01917ac8, 0x01d5a2b0, 0x001763c8, 0x017bfaea, 0x014e8132, 0x01805d8a, 0x01eccc30, 0x0380ac75, 0x001b162d}}}, + {X: Field{[10]uint32{0x0267f79d, 0x009b97f8, 0x038b4811, 0x0308ed1d, 0x0344ff51, 0x03154b9c, 0x00d7aeb8, 0x02b02831, 0x0002cd1f, 0x0006d481}}, Y: Field{[10]uint32{0x03db1a39, 0x03b0dd4d, 0x013c19e8, 0x03c424f6, 0x0030b252, 0x026b7536, 0x004ee943, 0x024c1283, 0x01005664, 0x00023b83}}}, + {X: Field{[10]uint32{0x017139b1, 0x02bcafae, 0x024f5bf9, 0x00fd0f61, 0x023400cc, 0x022a2179, 0x02da4c63, 0x03b617f0, 0x02d5d7f1, 0x00224db9}}, Y: Field{[10]uint32{0x029b402b, 0x00ac1060, 0x03c4778d, 0x005e96f5, 0x018879f2, 0x03f4c989, 0x00cdc8a6, 0x00ca8ddc, 0x0220b4b9, 0x000a604a}}}, + {X: Field{[10]uint32{0x016b518f, 0x00441172, 0x021eec4f, 0x01bd6e86, 0x01aebd39, 0x0157645c, 0x036c043a, 0x015536a8, 0x027f4813, 0x001a022b}}, Y: Field{[10]uint32{0x00425810, 0x0264e967, 0x01c2231b, 0x020df1d2, 0x00f581b9, 0x03d055d7, 0x00e85fd5, 0x0237715e, 0x026e8872, 0x001abf2b}}}, + {X: Field{[10]uint32{0x01a2cd1c, 0x01e4928d, 0x0310f236, 0x024d56a6, 0x0193e232, 0x00076002, 0x011bba76, 0x00fd9848, 0x029444c7, 0x00161b19}}, Y: Field{[10]uint32{0x025416c7, 0x0004ab3f, 0x031c8862, 0x0377bc19, 0x03873537, 0x00df2df1, 0x00f5507d, 0x028f2d02, 0x001ff6eb, 0x001d2c24}}}, + {X: Field{[10]uint32{0x03f89e11, 0x025efa07, 0x0066b078, 0x02966733, 0x020b183a, 0x02461507, 0x0388453e, 0x03c78131, 0x025ddead, 0x001e2720}}, Y: Field{[10]uint32{0x006cb5ab, 0x01e24e39, 0x0103cb8f, 0x015fffa6, 0x03e40cc3, 0x027e62a6, 0x027480b8, 0x02c4f1af, 0x026f641b, 0x002041aa}}}, + {X: Field{[10]uint32{0x01419797, 0x01f3efaa, 0x02076acd, 0x01bb8763, 0x02e52042, 0x01fd92f2, 0x00d0ddf9, 0x03ea9988, 0x00bbfd26, 0x0035eae0}}, Y: Field{[10]uint32{0x00c5a823, 0x02114de4, 0x02efbc71, 0x022e7ccb, 0x026e50a5, 0x004e7453, 0x034a85f5, 0x02c40ebb, 0x0372a6d1, 0x0009abe7}}}, + {X: Field{[10]uint32{0x02f67f7f, 0x015b4bcd, 0x033154c2, 0x00cf280a, 0x00bddf0f, 0x007af106, 0x012b311b, 0x006ae118, 0x02d44daf, 0x00063dc4}}, Y: Field{[10]uint32{0x037d25bc, 0x026f6981, 0x03ee9f2d, 0x034c8574, 0x006b06d8, 0x013fdefe, 0x033c3f43, 0x03533bb6, 0x0150f92f, 0x003102c6}}}, + {X: Field{[10]uint32{0x03e5a06e, 0x039ba9b1, 0x005b3eb9, 0x00c8877a, 0x02fc399d, 0x02662f31, 0x022a7cbf, 0x00623de3, 0x036d9f6d, 0x00221cc9}}, Y: Field{[10]uint32{0x03c9e1a6, 0x029c2079, 0x02b4e054, 0x010f012d, 0x00dac977, 0x0395985e, 0x0020a3a7, 0x02e7a3ba, 0x01378ee9, 0x000a5fa0}}}, + {X: Field{[10]uint32{0x0288e0ad, 0x00b299b1, 0x01157145, 0x019937de, 0x0030fadd, 0x037d0c73, 0x00f57cdf, 0x005faf02, 0x01015bd2, 0x000406e0}}, Y: Field{[10]uint32{0x01179e6a, 0x01cdc617, 0x01ab339b, 0x02d1b253, 0x014c7542, 0x02a3e372, 0x01816d40, 0x00e0c461, 0x032fad20, 0x003e9b06}}}, + {X: Field{[10]uint32{0x0342dd57, 0x035314df, 0x03b6cd81, 0x0328a612, 0x03abe3b3, 0x02c81c7e, 0x02520a8c, 0x00518047, 0x015776c3, 0x001decf0}}, Y: Field{[10]uint32{0x004a645a, 0x0226417f, 0x00244925, 0x017453c3, 0x00040cce, 0x010fbd6b, 0x0084c9b4, 0x0006dc70, 0x02b1dab6, 0x002342f3}}}, + {X: Field{[10]uint32{0x01daec7a, 0x01a9a83f, 0x005d3ecf, 0x0224cf20, 0x02fbe2c1, 0x02e99bc4, 0x03aca338, 0x0182dbfd, 0x015256ac, 0x000547cb}}, Y: Field{[10]uint32{0x024f62d6, 0x033a7c1d, 0x03ea674e, 0x02227355, 0x01c4833c, 0x027a508d, 0x03038d64, 0x012fe645, 0x017710cd, 0x0034aab3}}}, + {X: Field{[10]uint32{0x031d32c7, 0x028e0245, 0x011a2029, 0x0070446f, 0x00950881, 0x012d1b7e, 0x0338dbe2, 0x0105ed18, 0x0327f41e, 0x00375d73}}, Y: Field{[10]uint32{0x01b67be5, 0x00c88906, 0x013dd46c, 0x003363ed, 0x00ee2217, 0x0324761b, 0x0303c33c, 0x026e012a, 0x0055a338, 0x0038ca2e}}}, + {X: Field{[10]uint32{0x011d7a83, 0x035fbb9e, 0x0028a494, 0x01d8cd6d, 0x026a3f6b, 0x03d986c7, 0x02366ab3, 0x03671277, 0x03ebbdd1, 0x0003ea87}}, Y: Field{[10]uint32{0x0025d572, 0x015c4f6e, 0x029c413b, 0x02760695, 0x01948bb2, 0x00791955, 0x0248ee56, 0x000aae30, 0x014f8fce, 0x0037cd87}}}, + {X: Field{[10]uint32{0x018f8be5, 0x036bfb53, 0x03545671, 0x037e31a9, 0x00a4cada, 0x019e2565, 0x01ee65b6, 0x02ecc7f7, 0x01be5bc2, 0x000f3043}}, Y: Field{[10]uint32{0x0039c2df, 0x023995dc, 0x0110dbc0, 0x002ba909, 0x00710112, 0x0350b25d, 0x0292a3a9, 0x02b5bc39, 0x01ef8c66, 0x00200b51}}}, + {X: Field{[10]uint32{0x03b93ba2, 0x01dafb29, 0x03a1eaf5, 0x02140d78, 0x01856cc4, 0x014a00b8, 0x00dee7f7, 0x03b07245, 0x0325325d, 0x00255139}}, Y: Field{[10]uint32{0x02eeeb49, 0x020c4577, 0x03686aad, 0x03779421, 0x00aaf137, 0x005cce33, 0x0339b037, 0x00f013af, 0x03a68151, 0x0033b1f6}}}, + {X: Field{[10]uint32{0x0383a964, 0x02f8df27, 0x01eac038, 0x01b89de7, 0x0154eec6, 0x03737db0, 0x017ff8b4, 0x0188d9ec, 0x03dcd5d0, 0x0025283e}}, Y: Field{[10]uint32{0x03efe82a, 0x00a7bd33, 0x030e576f, 0x004d68a8, 0x03fea742, 0x0290b8b8, 0x0223e169, 0x01b206dc, 0x00fd5ef0, 0x003c97cd}}}, + {X: Field{[10]uint32{0x02b579c7, 0x03a12cf1, 0x03633100, 0x00ec27dd, 0x0314f67c, 0x0085ee90, 0x01fbd4bf, 0x01f8bda5, 0x01b2c3fc, 0x0026278a}}, Y: Field{[10]uint32{0x0221c888, 0x0143bf6d, 0x02771172, 0x010c0708, 0x01ed003a, 0x005f6abe, 0x034f3e99, 0x000a5c0a, 0x01280cd0, 0x0018229b}}}, + {X: Field{[10]uint32{0x033494a5, 0x00192fc1, 0x017f1c81, 0x0173a502, 0x0249b4bd, 0x0164d2b0, 0x00e979b0, 0x029674ec, 0x03c44295, 0x0030e317}}, Y: Field{[10]uint32{0x01d1e2fb, 0x00118b58, 0x02ecb760, 0x01c5f2fb, 0x031d1dbc, 0x003af059, 0x00e471ae, 0x02cda992, 0x03f6d354, 0x00058902}}}, + {X: Field{[10]uint32{0x03a7a63b, 0x0304e3c3, 0x037e1546, 0x01adeb61, 0x0207dc65, 0x031963be, 0x0341d8c5, 0x0011b162, 0x026735c4, 0x0037a73d}}, Y: Field{[10]uint32{0x006639ac, 0x021b78d4, 0x00cb7575, 0x039f66e5, 0x03ecc19d, 0x01120042, 0x03729275, 0x018b8f88, 0x024fba91, 0x000bf0a0}}}, + {X: Field{[10]uint32{0x02c06522, 0x0110303d, 0x023c4c8c, 0x002119d6, 0x03f1dd9e, 0x0230cf27, 0x01d84b38, 0x0022d41e, 0x0137e567, 0x0000933f}}, Y: Field{[10]uint32{0x002af897, 0x00eb1e71, 0x01f00738, 0x01ab36df, 0x021aee67, 0x016b219c, 0x034d2895, 0x00055ed2, 0x00ea0982, 0x00072f32}}}, + {X: Field{[10]uint32{0x007cc121, 0x00858e7a, 0x01ed7264, 0x023d8990, 0x012b275d, 0x038247a7, 0x00414a95, 0x02e6d8bd, 0x01086ad8, 0x00275b8c}}, Y: Field{[10]uint32{0x02d3abe0, 0x025e6dba, 0x01bca757, 0x02d379d4, 0x0043c46a, 0x029d0f3c, 0x02b59ad5, 0x0299f536, 0x000a6792, 0x002e491c}}}, + {X: Field{[10]uint32{0x0209354d, 0x02f82021, 0x01d38673, 0x00b749d9, 0x0374aea2, 0x023b4e37, 0x01c21e53, 0x020e55ce, 0x01ae28b2, 0x00014aa2}}, Y: Field{[10]uint32{0x00334e51, 0x0316c7b6, 0x01708089, 0x035661ed, 0x01469b06, 0x01dacbd8, 0x03cccd20, 0x020c2f4d, 0x01579b65, 0x003060fb}}}, + {X: Field{[10]uint32{0x0227571d, 0x034d0836, 0x0255046b, 0x0230b05c, 0x01cda3bf, 0x01c9f2bd, 0x03f5d31d, 0x00601c90, 0x0272491d, 0x000bff4c}}, Y: Field{[10]uint32{0x035b6ad5, 0x03326994, 0x01d52131, 0x02d74d06, 0x00599934, 0x037abbd6, 0x01e48be6, 0x02ccd28c, 0x03bd6f38, 0x00204ba3}}}, + {X: Field{[10]uint32{0x00973fca, 0x02567167, 0x022f2eba, 0x02709c19, 0x0265df68, 0x02c64ec5, 0x0251b66d, 0x0290e8d7, 0x02094269, 0x00175831}}, Y: Field{[10]uint32{0x010efadc, 0x03c7d221, 0x0048a3af, 0x02165a71, 0x006d3b92, 0x03d03350, 0x031bb7e3, 0x035864ac, 0x024fd1af, 0x003d644c}}}, + {X: Field{[10]uint32{0x0112ff75, 0x029ad2cf, 0x00d0ae6d, 0x03e615e1, 0x004c86da, 0x00706d58, 0x0026340e, 0x00cd4fd1, 0x000abfe5, 0x0008f831}}, Y: Field{[10]uint32{0x00191d9d, 0x0085444a, 0x03827f99, 0x01e66eb3, 0x00f19d5a, 0x02032851, 0x01baf682, 0x0024a824, 0x00b5fc86, 0x003a4211}}}, + {X: Field{[10]uint32{0x006094f6, 0x0221739f, 0x02bb1155, 0x01e4c2f4, 0x0050e67d, 0x03cdf6a0, 0x02f20d77, 0x00704b29, 0x00ab5d4a, 0x00251606}}, Y: Field{[10]uint32{0x02695e03, 0x00735592, 0x03b6f9a1, 0x018febf2, 0x0032ca81, 0x03b7b6d8, 0x0269c969, 0x02b9b6a9, 0x01d0e2f9, 0x002d7cb0}}}, + {X: Field{[10]uint32{0x00724c8c, 0x03b363f6, 0x0124bc41, 0x0175881b, 0x015043be, 0x00335ef3, 0x03a469ca, 0x02fda861, 0x037d2586, 0x00347d36}}, Y: Field{[10]uint32{0x02206839, 0x0296b384, 0x03365a1c, 0x02ac071b, 0x02b1525e, 0x00a4a719, 0x0080ce9b, 0x01dd2ef5, 0x038277c4, 0x00190153}}}, + {X: Field{[10]uint32{0x0014a18d, 0x01fd3b3b, 0x01e1860f, 0x00a973dd, 0x01158b4f, 0x010a8f44, 0x005f2d5b, 0x01ba706a, 0x014f2458, 0x0013d713}}, Y: Field{[10]uint32{0x00efdbe5, 0x02d28c6c, 0x03350986, 0x027a5c3e, 0x021e48bb, 0x01ffefb0, 0x013be2be, 0x01e581a5, 0x02716d54, 0x0015d5db}}}, + {X: Field{[10]uint32{0x0198150a, 0x01032e52, 0x02118c38, 0x031407a6, 0x013f8edf, 0x0393e40f, 0x023cf5c5, 0x00510f62, 0x005bdcb3, 0x00304ed8}}, Y: Field{[10]uint32{0x02cb8435, 0x000f2c85, 0x022b52f6, 0x0127d064, 0x006c368e, 0x0122c070, 0x022a8ea9, 0x03efd4b9, 0x02af99f1, 0x0023738b}}}, + {X: Field{[10]uint32{0x0029cbb6, 0x01d33409, 0x01753391, 0x019b899a, 0x03a3df24, 0x0073bad6, 0x024a5b5a, 0x00953925, 0x032ab66f, 0x00064dec}}, Y: Field{[10]uint32{0x02f2e385, 0x0005ce03, 0x0022bb57, 0x01e604f8, 0x030181e0, 0x00fffec6, 0x00eabb05, 0x001d72ef, 0x00a06f1b, 0x0025c4ac}}}, + {X: Field{[10]uint32{0x019ba2e4, 0x0186c1d0, 0x004d747e, 0x036deb4b, 0x00d757bb, 0x00ef87d6, 0x00ef386c, 0x01cbcc21, 0x033f2f17, 0x0039294c}}, Y: Field{[10]uint32{0x036b6f56, 0x00529eb2, 0x00c7c5af, 0x03326f05, 0x02132571, 0x02f05590, 0x009b7178, 0x0392e40e, 0x01a72ec2, 0x003a13df}}}, + {X: Field{[10]uint32{0x0206cca6, 0x03f6d2d5, 0x00dcffc7, 0x0106b855, 0x01d57a83, 0x03304217, 0x000a0cf5, 0x00aa3142, 0x00b0a3f4, 0x000be28e}}, Y: Field{[10]uint32{0x024681c1, 0x03ce31a3, 0x024f1134, 0x00b86c49, 0x002fa2a7, 0x03bb58a5, 0x0008d9c4, 0x0076d959, 0x02a52c30, 0x0021d931}}}, + {X: Field{[10]uint32{0x01a55ff7, 0x015c4aa0, 0x0070b873, 0x0266e106, 0x02acd145, 0x033aad7f, 0x00585b63, 0x00b5dedb, 0x01c2c51c, 0x0000f4af}}, Y: Field{[10]uint32{0x02d3e9e0, 0x02e3736d, 0x035e9496, 0x00da8fa2, 0x00922460, 0x0011db91, 0x01a808ff, 0x018f7ea6, 0x01adbbe2, 0x000cfdd2}}}, + {X: Field{[10]uint32{0x03ab7d3a, 0x03cf307b, 0x01b3e6e5, 0x00548b6f, 0x021ecec2, 0x00afe8f8, 0x02b9acf6, 0x01338cdd, 0x0008d676, 0x003f21fe}}, Y: Field{[10]uint32{0x0035176a, 0x032e5c4a, 0x00581717, 0x0093386f, 0x01c03430, 0x014292b0, 0x0015dd87, 0x03e4ddc2, 0x0303c1f4, 0x00339d7a}}}, + {X: Field{[10]uint32{0x031e68d5, 0x009c2fd6, 0x02cb4374, 0x014871f9, 0x01323549, 0x03326121, 0x00885dc0, 0x03847afa, 0x005c62de, 0x001fe06e}}, Y: Field{[10]uint32{0x029c4558, 0x0034a9da, 0x017f3ad7, 0x012bb572, 0x011750aa, 0x025b3dce, 0x01ba062d, 0x036d8705, 0x037d6a84, 0x002deb7b}}}, + {X: Field{[10]uint32{0x01fd5557, 0x022e40f8, 0x0288c826, 0x0224f085, 0x0233cc8f, 0x018bbe47, 0x01d8f47f, 0x00eb97a3, 0x003f7afd, 0x00358635}}, Y: Field{[10]uint32{0x00cd34b8, 0x02f2a9b8, 0x03fb4fc5, 0x0237f230, 0x0042ce9e, 0x024031f9, 0x03212679, 0x02e6c20a, 0x017b0c8a, 0x00186020}}}, + {X: Field{[10]uint32{0x016e4940, 0x03e532e2, 0x009310cc, 0x02f37ddb, 0x03694430, 0x020e0ee6, 0x03f540fc, 0x026c1b6b, 0x004ff237, 0x002e9693}}, Y: Field{[10]uint32{0x0107b1f2, 0x001d6a3f, 0x0128db91, 0x03954d29, 0x0325299d, 0x03cba4cc, 0x01309b24, 0x0239bd3b, 0x011a0b13, 0x000e8887}}}, + {X: Field{[10]uint32{0x00cfdf56, 0x00a7e8c6, 0x018abcec, 0x025720c2, 0x03801363, 0x02cd6eb0, 0x03591415, 0x00dd1a20, 0x01b60bee, 0x0031a462}}, Y: Field{[10]uint32{0x0339268c, 0x022f5275, 0x0279c582, 0x0078a6de, 0x019795e6, 0x038d01ec, 0x00232fa7, 0x0368eb37, 0x03c2b862, 0x00286176}}}, + {X: Field{[10]uint32{0x00efae12, 0x00dccb07, 0x02d71bcd, 0x021a1f96, 0x0270dffd, 0x0267500e, 0x0063423b, 0x02d006ae, 0x0144032f, 0x00147d9f}}, Y: Field{[10]uint32{0x01e10e59, 0x02cb6518, 0x01f5ca8e, 0x00fe2993, 0x020403e2, 0x032fc859, 0x00ae68a3, 0x00128caf, 0x0085a2c4, 0x00222c5d}}}, + {X: Field{[10]uint32{0x037c4bd5, 0x02fb9b7a, 0x00a36fa8, 0x005fb4f3, 0x016001e1, 0x0252e2d9, 0x006fb69a, 0x017e350d, 0x0209e558, 0x00336b3f}}, Y: Field{[10]uint32{0x02028542, 0x0211249b, 0x01ecefdb, 0x000d6515, 0x03af5fc4, 0x0019a675, 0x00121762, 0x00c74056, 0x005a9931, 0x00377c6f}}}, + {X: Field{[10]uint32{0x03f0e769, 0x00cf24e2, 0x01be319f, 0x02874598, 0x00481eaa, 0x033a4222, 0x0301d70c, 0x0391da71, 0x0371e1fc, 0x00204a79}}, Y: Field{[10]uint32{0x0045c6e2, 0x002a05bc, 0x02d700d4, 0x0226d511, 0x038a4db1, 0x01d259ab, 0x02d8b6f9, 0x02f158e7, 0x013da864, 0x000fad5c}}}, + {X: Field{[10]uint32{0x02bce3ab, 0x004cafd6, 0x009ada68, 0x02abe0a2, 0x00f39c14, 0x02a9cc35, 0x002fc0f8, 0x016f03cc, 0x02ef6d41, 0x002e5c18}}, Y: Field{[10]uint32{0x013db3a6, 0x003cc4f5, 0x02829049, 0x03954445, 0x006644c9, 0x0148891f, 0x00dfdd38, 0x0324f3f6, 0x0288cd76, 0x0022b5c1}}}, + {X: Field{[10]uint32{0x030bd913, 0x01a853d3, 0x03ca422a, 0x03b14552, 0x0250de67, 0x013a1af9, 0x01d6af8c, 0x006d7fa9, 0x018b4e81, 0x000670f2}}, Y: Field{[10]uint32{0x0190a109, 0x01d1bea8, 0x027bdd5d, 0x017a491d, 0x03c18b9d, 0x021425f2, 0x021b5c73, 0x03264cc3, 0x039648bd, 0x002f148f}}}, + {X: Field{[10]uint32{0x01b42b9c, 0x026cf0ad, 0x0355967a, 0x01efbf98, 0x020ad769, 0x02244638, 0x02be43f8, 0x03b9d2c7, 0x00c73616, 0x002e7bcd}}, Y: Field{[10]uint32{0x03661bea, 0x003a9a16, 0x022543b7, 0x02a8d5c3, 0x02e8dc05, 0x03988e54, 0x01be2715, 0x006b06e2, 0x01ddd55b, 0x0004bc73}}}, + {X: Field{[10]uint32{0x0103c34a, 0x03b6e5fd, 0x02ca86e8, 0x00faf7ae, 0x0359dd2a, 0x01b61371, 0x039c39a9, 0x0336d603, 0x034f58e2, 0x001dc638}}, Y: Field{[10]uint32{0x03e96df7, 0x019ec400, 0x03093135, 0x00a23838, 0x01cf5e37, 0x0312f45f, 0x01cd8f96, 0x0106e04b, 0x01fbdc08, 0x0029b441}}}, + {X: Field{[10]uint32{0x037e8dba, 0x03321c71, 0x02ed621f, 0x02c62bed, 0x01e259c1, 0x034d68da, 0x03ba89b8, 0x039cdd8e, 0x004b8e6d, 0x0036ace2}}, Y: Field{[10]uint32{0x00a11577, 0x00e89e05, 0x0153ee50, 0x0024abbe, 0x01c9316e, 0x036d2802, 0x02bd4b5e, 0x00b508ae, 0x0329c59a, 0x003d12db}}}, + {X: Field{[10]uint32{0x027f4366, 0x03b6ac79, 0x00a1876a, 0x0147a11f, 0x03a67367, 0x02d6f9b7, 0x026a8978, 0x01e0b797, 0x02101139, 0x0032cf43}}, Y: Field{[10]uint32{0x0157d3ea, 0x03e5c26f, 0x010cf189, 0x019da705, 0x01572aff, 0x03923c76, 0x0169b33b, 0x0250f99e, 0x008dd227, 0x0009ffa2}}}, + {X: Field{[10]uint32{0x00c3c6a0, 0x01fecefa, 0x0279fcca, 0x0191ba8b, 0x03656ea5, 0x03d8ad2d, 0x01193dbb, 0x02750423, 0x03f85561, 0x003ac6c7}}, Y: Field{[10]uint32{0x02282ea4, 0x0340f258, 0x027a5ced, 0x00e926cc, 0x01d36ae9, 0x000e1159, 0x01137414, 0x0357075c, 0x00c75b73, 0x00309fe8}}}, + {X: Field{[10]uint32{0x0039c5dd, 0x0025e187, 0x03aeb587, 0x03cf4b95, 0x00bee8f9, 0x00eadaf7, 0x01a11170, 0x003c47dd, 0x01e60bc4, 0x0017541e}}, Y: Field{[10]uint32{0x006e46d0, 0x02048851, 0x02bab805, 0x0378061c, 0x014d8435, 0x02f9ef7e, 0x025829b4, 0x02e75775, 0x012ba40d, 0x00052b84}}}, + {X: Field{[10]uint32{0x01a7b38e, 0x03f302a8, 0x00502384, 0x023780c0, 0x01b70809, 0x02c852ec, 0x028acd26, 0x01abc1b4, 0x02f76beb, 0x00004183}}, Y: Field{[10]uint32{0x03bdf9a3, 0x003b1230, 0x022e275d, 0x0015481f, 0x0334252c, 0x028860f5, 0x005464da, 0x03190a56, 0x039ff6c6, 0x0033903c}}}, + {X: Field{[10]uint32{0x02170695, 0x008e1cea, 0x03e1afd7, 0x0251c358, 0x01e7bcc8, 0x0309d14a, 0x007c271a, 0x03dcc625, 0x0063c001, 0x00259471}}, Y: Field{[10]uint32{0x0254eaf7, 0x00dfec39, 0x0154d218, 0x01e96a6c, 0x013b16ba, 0x022d8f26, 0x016d17fe, 0x001b69cf, 0x027fe8ff, 0x00138d8b}}}, + {X: Field{[10]uint32{0x03363dcc, 0x00a3c9c7, 0x0000ee09, 0x01334891, 0x01895cda, 0x02d0a2c6, 0x02822cdc, 0x0086d0bd, 0x03765928, 0x0017108a}}, Y: Field{[10]uint32{0x012b9400, 0x017f3d92, 0x0148444e, 0x036054a0, 0x014cb6b4, 0x03db01fd, 0x008258f0, 0x01df28d1, 0x034f9e4c, 0x000bf6d3}}}, + {X: Field{[10]uint32{0x01faba2c, 0x009364ea, 0x003d2b72, 0x029b353d, 0x02ab3868, 0x0114b312, 0x023ce519, 0x009435ce, 0x012b5d98, 0x0036c51f}}, Y: Field{[10]uint32{0x010ed0de, 0x02469e81, 0x009258a3, 0x03f81931, 0x009fdebf, 0x01ca65a1, 0x0343227a, 0x01ab37e8, 0x0380ad3c, 0x001cc950}}}, + {X: Field{[10]uint32{0x01454b4c, 0x0345b2f9, 0x01384a41, 0x009bb613, 0x01e1beca, 0x02207a26, 0x02237678, 0x02ff4594, 0x03a0f97a, 0x002699d8}}, Y: Field{[10]uint32{0x0090306a, 0x028074ce, 0x03cb2737, 0x01d64b22, 0x00e7952f, 0x00420a42, 0x031a3d55, 0x01605ccb, 0x007db6aa, 0x002ed450}}}, + {X: Field{[10]uint32{0x025daea8, 0x02da8003, 0x0400007d, 0x027a3147, 0x0007b45a, 0x03e53d61, 0x025c889e, 0x022bd3d3, 0x0133e910, 0x000dbf9e}}, Y: Field{[10]uint32{0x01227ee5, 0x0216ed09, 0x019e27fc, 0x02ed9ad1, 0x031943c7, 0x01c78570, 0x003a0f4a, 0x01688723, 0x01baecdd, 0x00340929}}}, + {X: Field{[10]uint32{0x03c784e7, 0x0155a28e, 0x006afc44, 0x03a96dce, 0x0144c749, 0x01d4a5a0, 0x02782fb8, 0x01f9a033, 0x0263f04f, 0x001036b9}}, Y: Field{[10]uint32{0x0355050b, 0x00445d95, 0x02bb9478, 0x011d12c5, 0x02cea2ab, 0x008f3c94, 0x0058c854, 0x03374009, 0x03fdac6b, 0x00126918}}}, + {X: Field{[10]uint32{0x01c5b8d1, 0x017272eb, 0x00a7542c, 0x02e9e7ea, 0x01da55fa, 0x0056bf67, 0x00c6d10b, 0x03cec23a, 0x016dc8ff, 0x0002e858}}, Y: Field{[10]uint32{0x00a786ff, 0x006ac96c, 0x01019764, 0x01797c38, 0x02771045, 0x0328256c, 0x025a3ace, 0x00f19865, 0x0042a623, 0x003bc25b}}}, + {X: Field{[10]uint32{0x019c4a66, 0x00b409d8, 0x01e7da70, 0x001417ee, 0x03d69b4a, 0x02f1c49c, 0x028c948d, 0x01254935, 0x036723a5, 0x000c121b}}, Y: Field{[10]uint32{0x02444c76, 0x00fb2eb0, 0x01ab6574, 0x01b66812, 0x01fd6acc, 0x011c292e, 0x02a63695, 0x03270217, 0x014d279e, 0x000e3293}}}, + {X: Field{[10]uint32{0x01e6932a, 0x0096f236, 0x0197090f, 0x024e6a27, 0x02d6accd, 0x03b0a809, 0x0367174d, 0x03475603, 0x029495ea, 0x0006e0fb}}, Y: Field{[10]uint32{0x02e20196, 0x0212f075, 0x03e0e345, 0x00d270ac, 0x033d2630, 0x00b9f43a, 0x0373d6da, 0x01214786, 0x0048fb5e, 0x000065b5}}}, + {X: Field{[10]uint32{0x03517396, 0x003c432d, 0x0264f2e3, 0x00c8053b, 0x01328b61, 0x03055e76, 0x02766715, 0x016844be, 0x002eedfa, 0x0013aa77}}, Y: Field{[10]uint32{0x006e50c2, 0x023c3d6c, 0x02c9c21e, 0x036741b2, 0x00d4a192, 0x00066d07, 0x003f0b14, 0x00f8a562, 0x03c96ef8, 0x001d053b}}}, + {X: Field{[10]uint32{0x02b033da, 0x025ff34b, 0x01b311a0, 0x024b572e, 0x02876777, 0x02d95d0d, 0x03217aa3, 0x02b4220e, 0x019dbee9, 0x001059b0}}, Y: Field{[10]uint32{0x02ed541c, 0x008dbadf, 0x001f8abc, 0x00ff4e36, 0x02b80e11, 0x02cdd6b1, 0x02b4d29a, 0x01aa9a4c, 0x025c5fae, 0x0018b141}}}, + {X: Field{[10]uint32{0x01a74899, 0x02ef82a1, 0x03f310a2, 0x021abe38, 0x02bbbc66, 0x034f4be5, 0x00511a87, 0x03d529a7, 0x03ebb112, 0x002c5d59}}, Y: Field{[10]uint32{0x009f52c2, 0x03f5cb53, 0x00bb1bdb, 0x008719c7, 0x03a69367, 0x02e24db7, 0x03fc6934, 0x02f952b8, 0x03413788, 0x003d99d8}}}, + {X: Field{[10]uint32{0x028095a5, 0x00ae2a6f, 0x0210212c, 0x02141408, 0x01a6df06, 0x00d44c4c, 0x01d81fdf, 0x01fcd022, 0x01152ab9, 0x00334ad9}}, Y: Field{[10]uint32{0x038f6a53, 0x024b8c79, 0x00bb45f4, 0x0212e1c0, 0x0322afff, 0x03513408, 0x02e40c72, 0x0064d457, 0x012f9ca4, 0x0033f9e5}}}, + {X: Field{[10]uint32{0x0218229f, 0x00c825cd, 0x0374a447, 0x01e4ebab, 0x032086c9, 0x001eb031, 0x0241a729, 0x0050280c, 0x03c49f33, 0x000dd580}}, Y: Field{[10]uint32{0x0385e837, 0x0058defa, 0x00699668, 0x004e1120, 0x03de08ba, 0x00025d76, 0x01ddb463, 0x029dcf84, 0x00f66322, 0x001eedd0}}}, + {X: Field{[10]uint32{0x03bb7432, 0x03c80bbb, 0x01632978, 0x0174b800, 0x017e1095, 0x00d0777a, 0x003c176f, 0x00f765b6, 0x03d4390a, 0x00040819}}, Y: Field{[10]uint32{0x039ba83e, 0x02068be0, 0x0322dafa, 0x03bdf9c1, 0x021d8b7e, 0x01aea77d, 0x0019f11b, 0x03330e9c, 0x03d54d28, 0x001f3db3}}}, + {X: Field{[10]uint32{0x0263081d, 0x01d89737, 0x01d544fb, 0x00bfa30b, 0x01374ef4, 0x022d23eb, 0x003042cf, 0x0314ee9c, 0x0273e3fb, 0x0011d85f}}, Y: Field{[10]uint32{0x01d439e8, 0x020bce70, 0x022a0e47, 0x019e1f0f, 0x0350cbae, 0x010f2abf, 0x0040f07f, 0x02a56ecb, 0x00230c92, 0x0007e93d}}}, + {X: Field{[10]uint32{0x03880f84, 0x0045d383, 0x034ca82e, 0x02f4c635, 0x0046b814, 0x038a2818, 0x017aac08, 0x01418a7d, 0x03af57f7, 0x000b10c6}}, Y: Field{[10]uint32{0x0209de50, 0x039631bc, 0x03adbb8e, 0x014ab162, 0x0262755a, 0x0214fd07, 0x00041089, 0x012ccb04, 0x03bc6857, 0x00376e79}}}, + {X: Field{[10]uint32{0x0343d599, 0x015c3760, 0x00b41338, 0x012c35dd, 0x033f4df4, 0x026dc22a, 0x0386b1f7, 0x02db9066, 0x02438143, 0x0024658d}}, Y: Field{[10]uint32{0x02312f0d, 0x008aa2dd, 0x00049696, 0x00d243d1, 0x00021be3, 0x01ae1eef, 0x0391d682, 0x02834a7e, 0x02177171, 0x00240d3b}}}, + {X: Field{[10]uint32{0x00b7754e, 0x013dfdf1, 0x02ddda4a, 0x0164ac05, 0x02028718, 0x015a0ec1, 0x00d42db9, 0x01b1ee0e, 0x0201af65, 0x002fca30}}, Y: Field{[10]uint32{0x0345d109, 0x02db7ce8, 0x00e20c50, 0x016ab0c8, 0x01ce6ffb, 0x01aac1a0, 0x0266c2f4, 0x00434aa2, 0x0304dda5, 0x0002ef53}}}, + {X: Field{[10]uint32{0x0118b137, 0x02d3cd65, 0x035a1bab, 0x00b296ba, 0x031aa426, 0x01663902, 0x01d531bf, 0x0097d138, 0x03860218, 0x003f2b1c}}, Y: Field{[10]uint32{0x02e67b64, 0x03fda154, 0x005936ff, 0x03fa1f9f, 0x037dcca7, 0x02e8dfbb, 0x032d1e41, 0x02fa87cf, 0x037a957b, 0x000ec65a}}}, + {X: Field{[10]uint32{0x026e9331, 0x0270775c, 0x01982302, 0x0326d1fb, 0x018ad89c, 0x0119fe02, 0x01f0278e, 0x03864850, 0x01dfcaae, 0x00273fa8}}, Y: Field{[10]uint32{0x00db211d, 0x00051ac6, 0x01f470b1, 0x03056dd7, 0x0096a071, 0x01421b8c, 0x010b6469, 0x03b8163f, 0x024e7f30, 0x001cb607}}}, + {X: Field{[10]uint32{0x021334da, 0x019bcd1a, 0x00e201e9, 0x014666e6, 0x00455c51, 0x00a00b0c, 0x01c7f21f, 0x014f1e59, 0x03421235, 0x0015234f}}, Y: Field{[10]uint32{0x016418ae, 0x025283a5, 0x0278a426, 0x02c40c44, 0x0208c0af, 0x016e51a1, 0x0138eeb1, 0x000f4a25, 0x0225cebb, 0x000184ba}}}, + {X: Field{[10]uint32{0x00295bc0, 0x022f759d, 0x01e22a6c, 0x015b18a3, 0x02ebd467, 0x02312643, 0x035c545e, 0x01309826, 0x019accf8, 0x00396f98}}, Y: Field{[10]uint32{0x01b08bf3, 0x00b8a81c, 0x01837a74, 0x033e6cd8, 0x0189e246, 0x02a162e4, 0x003aa74f, 0x006bdeb6, 0x00a57d84, 0x00190219}}}, + {X: Field{[10]uint32{0x01ac668f, 0x013a6ba8, 0x02209e19, 0x0037dcd3, 0x03a26046, 0x008da323, 0x028f733d, 0x03b52bba, 0x033e3400, 0x002d5824}}, Y: Field{[10]uint32{0x005f9da3, 0x0303008b, 0x028861b1, 0x03d378a6, 0x00ac0975, 0x033c5eef, 0x02ab1826, 0x01e14e7f, 0x013d3133, 0x00150e3e}}}, + {X: Field{[10]uint32{0x00cf60b1, 0x014aa887, 0x013c02c6, 0x025a30c5, 0x01dedf2d, 0x01d10cff, 0x03ecf7dd, 0x00f9e41d, 0x0297baca, 0x00087766}}, Y: Field{[10]uint32{0x0284797e, 0x001f3409, 0x038d917c, 0x0334d3d2, 0x01b851c4, 0x03683032, 0x019bbd7c, 0x02c2deda, 0x00e0e048, 0x00379b98}}}, + {X: Field{[10]uint32{0x01934bbd, 0x03ca403f, 0x03f37bca, 0x01d12327, 0x012f1478, 0x026f68c0, 0x01b0a52f, 0x010e6d32, 0x020c6d39, 0x00173e95}}, Y: Field{[10]uint32{0x01b11b06, 0x03feae69, 0x01a3235a, 0x034cfc37, 0x0129d5a5, 0x03a4dbca, 0x0156998c, 0x02566fcd, 0x02630cc1, 0x0031e49e}}}, + {X: Field{[10]uint32{0x026d4fc6, 0x00712da1, 0x02f49046, 0x039ed240, 0x016377af, 0x0253f325, 0x036204b3, 0x03350540, 0x01bb05ad, 0x00128ee5}}, Y: Field{[10]uint32{0x00e84f2f, 0x03402bea, 0x000232a0, 0x01ef7dc2, 0x018d6be4, 0x036e4e1f, 0x009179a4, 0x00793302, 0x02e2f1bd, 0x0035678f}}}, + {X: Field{[10]uint32{0x01f4671f, 0x012dd94d, 0x03d4a81c, 0x002b736c, 0x03404edb, 0x03741bc5, 0x0006b7ba, 0x01a7244f, 0x03130b4c, 0x00331268}}, Y: Field{[10]uint32{0x007bc278, 0x015ea25a, 0x011b24dd, 0x0054b1ea, 0x02ba4837, 0x034dd564, 0x036c1943, 0x01497abc, 0x02ecc35e, 0x0012f5c8}}}, + {X: Field{[10]uint32{0x00146d98, 0x00993335, 0x03d3740b, 0x0300637c, 0x00e07fda, 0x0362d3b8, 0x00f4f900, 0x029a7673, 0x005a7426, 0x00275d42}}, Y: Field{[10]uint32{0x00c4b0a9, 0x01b8f08b, 0x01ae6a4f, 0x03a4fe50, 0x01ce174a, 0x0392519f, 0x0372f44d, 0x02ccb411, 0x0253de04, 0x00016644}}}, + {X: Field{[10]uint32{0x03210fb8, 0x02c341a0, 0x00d18b95, 0x003beb48, 0x02caa87c, 0x027c7864, 0x0312cf5d, 0x036b74ba, 0x00df737b, 0x0037f419}}, Y: Field{[10]uint32{0x0103805a, 0x0206e4a4, 0x0122613d, 0x0264fab8, 0x019f3172, 0x02404bf5, 0x00b1d2b8, 0x0234cc14, 0x003da5bf, 0x001467e2}}}, + {X: Field{[10]uint32{0x007eaf9a, 0x006040a0, 0x012e3bf6, 0x0209a170, 0x001cf205, 0x0198c62f, 0x009013ea, 0x01b0d758, 0x035cd235, 0x000ad428}}, Y: Field{[10]uint32{0x01c76335, 0x012aeac7, 0x000f6ce7, 0x00790d4e, 0x02fdf424, 0x026d60a7, 0x01f5a77d, 0x03bbfae0, 0x011d303a, 0x0001f42d}}}, + {X: Field{[10]uint32{0x005abbc7, 0x0207ea1a, 0x030c3704, 0x03ccc09f, 0x020f3202, 0x01673517, 0x02e2a594, 0x01d79f1d, 0x034b2cf1, 0x00389ba3}}, Y: Field{[10]uint32{0x02c2013a, 0x03dcbf0e, 0x02c0f194, 0x0389183a, 0x01716e5f, 0x025f0d37, 0x00767029, 0x0145854c, 0x03baaa0d, 0x001320b9}}}, + {X: Field{[10]uint32{0x010f87fb, 0x034d20d7, 0x00959b46, 0x0147e097, 0x031fd90e, 0x039e3701, 0x0184057c, 0x03615da9, 0x037d54f4, 0x001640f6}}, Y: Field{[10]uint32{0x029e99c8, 0x00200447, 0x020f3816, 0x01028637, 0x03febf94, 0x034635bd, 0x00003329, 0x0046791f, 0x03d3e9ce, 0x0031578b}}}, + {X: Field{[10]uint32{0x0125e9c1, 0x0254f513, 0x00204fde, 0x03b8a2e6, 0x021040e6, 0x00d4906d, 0x03881e96, 0x02a0b722, 0x02cd0342, 0x0012eec3}}, Y: Field{[10]uint32{0x00b0ef04, 0x006a320b, 0x02335821, 0x03a6d134, 0x00082e97, 0x0013a1e1, 0x02bee8d6, 0x0116dd4a, 0x00900f34, 0x00004bac}}}, + {X: Field{[10]uint32{0x03c4e8d2, 0x01543e52, 0x0175b647, 0x01f506e5, 0x02702996, 0x034c9e78, 0x026eb38f, 0x02fe5f1b, 0x015aae87, 0x00012891}}, Y: Field{[10]uint32{0x03936074, 0x0255541c, 0x01c474a5, 0x008be718, 0x0309af34, 0x009d85e3, 0x012bea1e, 0x02fb98b5, 0x02c4ffe3, 0x00168d02}}}, + {X: Field{[10]uint32{0x03477623, 0x032be1d4, 0x004ad1de, 0x02f77389, 0x0394470a, 0x001ed4c3, 0x00329c4c, 0x0066a953, 0x028dc8ca, 0x003c21b5}}, Y: Field{[10]uint32{0x00bdbd08, 0x00c25c6d, 0x03d8020d, 0x028a022b, 0x034d9e8b, 0x03121a6a, 0x03e4161c, 0x01abc596, 0x01d384a1, 0x00244712}}}, + {X: Field{[10]uint32{0x03ba856c, 0x027e486d, 0x00cb4c98, 0x03dca5e2, 0x01d4b7cd, 0x00257c6d, 0x0253f912, 0x01b13892, 0x037e83b7, 0x0013c6c5}}, Y: Field{[10]uint32{0x0180eaf2, 0x0111c15f, 0x03811e10, 0x01a43702, 0x0399debb, 0x02ee54d2, 0x03dc2ff5, 0x02426bf0, 0x004eb060, 0x002955a3}}}, + {X: Field{[10]uint32{0x03db5823, 0x00d0c0e5, 0x0154c765, 0x039fe99e, 0x01c4fb5a, 0x02211de3, 0x012fcbc0, 0x0391688f, 0x009929a7, 0x003aea1e}}, Y: Field{[10]uint32{0x01cbf68f, 0x00085e8b, 0x02afee73, 0x02985c92, 0x02801b26, 0x03c0ebe7, 0x03c46b47, 0x00245c27, 0x0329b357, 0x0039be31}}}, + {X: Field{[10]uint32{0x002282c2, 0x008ed8ea, 0x02e7d877, 0x00e62731, 0x03130ee5, 0x01111567, 0x01580844, 0x02969e4b, 0x031334c9, 0x0037c45e}}, Y: Field{[10]uint32{0x016f7120, 0x03959054, 0x035a8c9b, 0x0175388c, 0x001a2fc5, 0x02954447, 0x02c5492e, 0x00f144ab, 0x02578eea, 0x003761f2}}}, + {X: Field{[10]uint32{0x02ee82c5, 0x00c871b9, 0x01a68621, 0x0392ea80, 0x021f5768, 0x03d7da81, 0x02eaa1bd, 0x02ae200d, 0x003b3e68, 0x0035dd55}}, Y: Field{[10]uint32{0x0081436e, 0x00ea7b86, 0x02e18049, 0x01184141, 0x0027a2bf, 0x01065fe7, 0x02e7a26c, 0x01ce60f3, 0x030547c9, 0x001c0886}}}, + {X: Field{[10]uint32{0x0178515d, 0x00bfafd1, 0x024c7148, 0x01fff7c1, 0x025e006f, 0x02335632, 0x005c6116, 0x006b96af, 0x01d55a23, 0x0029fc43}}, Y: Field{[10]uint32{0x003c13b0, 0x025ea79c, 0x0031eb47, 0x03c835a7, 0x01b2c24a, 0x007664e6, 0x025eb38d, 0x025a5388, 0x03a7b66b, 0x00124a8c}}}, + {X: Field{[10]uint32{0x020120ec, 0x00dba718, 0x0205b05d, 0x02ce04b6, 0x020801c6, 0x01add211, 0x0336c86c, 0x02af6444, 0x01ef3119, 0x0031e551}}, Y: Field{[10]uint32{0x03c28718, 0x00813774, 0x00382bd7, 0x0313c485, 0x00738a33, 0x01f7a81b, 0x0073f8ef, 0x03ab9145, 0x00db95b6, 0x0009323f}}}, + {X: Field{[10]uint32{0x02c2cb11, 0x020f8314, 0x006ec8e7, 0x0359a888, 0x03afa14d, 0x03884128, 0x0043ba29, 0x02223d7e, 0x035e744f, 0x000262ea}}, Y: Field{[10]uint32{0x00b94df6, 0x030c34af, 0x03cbe0b2, 0x03518dab, 0x02a7abae, 0x0051af35, 0x01d929b8, 0x01fb6314, 0x019fe5e8, 0x0020ed5a}}}, + {X: Field{[10]uint32{0x00ac586e, 0x01d4bbf7, 0x00110547, 0x0212b099, 0x0160d84a, 0x00e77ffd, 0x0213053d, 0x02912b20, 0x00287b6f, 0x001b738a}}, Y: Field{[10]uint32{0x0237ed66, 0x03f18a78, 0x00a5cadc, 0x02654d5e, 0x00c79be3, 0x00197469, 0x032fa8dd, 0x0033116a, 0x022ab9d6, 0x000787ad}}}, + {X: Field{[10]uint32{0x023dfa83, 0x02c2b398, 0x030c1b7f, 0x037423db, 0x03db06a9, 0x02c92b63, 0x02b091b5, 0x01cf24c1, 0x0259287a, 0x00038e1a}}, Y: Field{[10]uint32{0x005b34e6, 0x02582a74, 0x00ed6852, 0x008508a1, 0x01c0d3b2, 0x0385bf35, 0x024ce899, 0x01929798, 0x03da663b, 0x00129f9c}}}, + {X: Field{[10]uint32{0x024fe4d5, 0x03aa89fa, 0x0118004b, 0x0060989b, 0x00cea0a3, 0x02e550eb, 0x00283fc9, 0x02f8c663, 0x0382e62f, 0x0023f7fd}}, Y: Field{[10]uint32{0x00086675, 0x008b4aab, 0x00708c52, 0x007d0c5f, 0x03a4f530, 0x0041fa21, 0x03ed6508, 0x03656d9c, 0x00719fe0, 0x003fbe3d}}}, + {X: Field{[10]uint32{0x012eaa37, 0x0381108a, 0x01089a10, 0x0310d722, 0x0136ed1c, 0x03a9593a, 0x03bb8b84, 0x02c52006, 0x03ae7842, 0x00132424}}, Y: Field{[10]uint32{0x025298dd, 0x02542829, 0x03426ea2, 0x00afe169, 0x03864236, 0x03a4d5bd, 0x02c0903f, 0x0117eb96, 0x033493d2, 0x000b5a0c}}}, + {X: Field{[10]uint32{0x03103a1b, 0x01b56e8c, 0x00f2fe86, 0x031bf5db, 0x01056318, 0x0381ca8d, 0x02b80f9b, 0x014aa764, 0x00c55c5c, 0x0033018d}}, Y: Field{[10]uint32{0x007f0b32, 0x03c2c234, 0x01e887e8, 0x01dc6da6, 0x004004aa, 0x01ff2180, 0x0236eb08, 0x02da79b4, 0x0141b13c, 0x001d42df}}}, + {X: Field{[10]uint32{0x03918255, 0x01bdc78e, 0x026569a5, 0x03b33fdd, 0x011d53c7, 0x033292b6, 0x0133f5f9, 0x01eb162f, 0x027341fa, 0x0025d269}}, Y: Field{[10]uint32{0x00916068, 0x01b3b61a, 0x00d870ec, 0x01a73e96, 0x025e68fd, 0x038df676, 0x012a2aaf, 0x031f59da, 0x01c1009d, 0x002da17c}}}, + {X: Field{[10]uint32{0x017d8e75, 0x00dded1a, 0x011bc9e0, 0x014dcaf6, 0x03a25bd2, 0x01f682c6, 0x0257fdcb, 0x018bc816, 0x00efb578, 0x002c12af}}, Y: Field{[10]uint32{0x01e168f6, 0x01405286, 0x03d4278b, 0x02bf6a39, 0x0262dcb8, 0x0362e6ef, 0x01b58690, 0x012f8d22, 0x026466ad, 0x001411e6}}}, + {X: Field{[10]uint32{0x01c78902, 0x0093a151, 0x01768226, 0x02df2012, 0x02295059, 0x0217c035, 0x023b3957, 0x03efb7c6, 0x01e85481, 0x003447df}}, Y: Field{[10]uint32{0x035c3416, 0x00cd961b, 0x039c3173, 0x032d1200, 0x02b48928, 0x00499a60, 0x03369d81, 0x004a4069, 0x0368be0c, 0x0007458c}}}, + {X: Field{[10]uint32{0x0356fd4b, 0x02e202d5, 0x02b90970, 0x0182ca6c, 0x02fd6151, 0x00ed8f2c, 0x03225af7, 0x031e9024, 0x01f465c4, 0x00288719}}, Y: Field{[10]uint32{0x0345ecfe, 0x01aa8c24, 0x0186c766, 0x03897de9, 0x0157f1e3, 0x001228a5, 0x01e34767, 0x039839f7, 0x0389394d, 0x001a689a}}}, + {X: Field{[10]uint32{0x02497a1f, 0x03bfb85a, 0x036a4fde, 0x022c61b1, 0x0036ccda, 0x029633b4, 0x003d3999, 0x00d83a49, 0x02fbb080, 0x0014f189}}, Y: Field{[10]uint32{0x002ac9b7, 0x01f86ddd, 0x036bbeda, 0x01eb1011, 0x0008264d, 0x00cd85aa, 0x01106fb9, 0x03fc7946, 0x000862a7, 0x002b6498}}}, + {X: Field{[10]uint32{0x00e6ff0e, 0x005b139d, 0x02870601, 0x00cc46dc, 0x0211d969, 0x01d07c42, 0x0364fcc8, 0x00eb6340, 0x01871b2a, 0x0033d9ed}}, Y: Field{[10]uint32{0x02b68422, 0x01b4a748, 0x03cae6d3, 0x01fc966a, 0x027be653, 0x033878c2, 0x00ac068c, 0x035d3bda, 0x037c10cc, 0x000b258e}}}, + {X: Field{[10]uint32{0x010b4bc7, 0x0335a9b2, 0x018d731e, 0x00a77a7d, 0x01364288, 0x00d33783, 0x01a89a4b, 0x021c00a7, 0x02d808cc, 0x00014085}}, Y: Field{[10]uint32{0x01e38b21, 0x0367e9d2, 0x01e0c123, 0x01f99549, 0x0236f65d, 0x02944b56, 0x02fce322, 0x01224637, 0x01f096bc, 0x00248307}}}, + {X: Field{[10]uint32{0x03d1aef3, 0x019b0f64, 0x001a2677, 0x02f789bb, 0x033d6000, 0x03de42bf, 0x00cc62da, 0x01beedec, 0x0194f468, 0x00076115}}, Y: Field{[10]uint32{0x0134d260, 0x0027e7cc, 0x0173425c, 0x00db35aa, 0x0092450b, 0x0211f71b, 0x01340351, 0x03680bbc, 0x03a6bd9d, 0x003ab846}}}, + {X: Field{[10]uint32{0x024785e1, 0x014aede7, 0x030c3d5c, 0x0295bdf9, 0x012e7750, 0x01678aad, 0x027d5908, 0x02e5f41d, 0x0350b6c5, 0x00046b53}}, Y: Field{[10]uint32{0x00023b94, 0x018f6d6a, 0x027ac4e2, 0x011befdf, 0x011826e8, 0x00533e9c, 0x0152496f, 0x03671408, 0x02368725, 0x000b0aee}}}, + {X: Field{[10]uint32{0x0149388c, 0x0090ac2f, 0x02e3d12b, 0x00965a75, 0x03f76ee4, 0x01820a87, 0x024a5198, 0x01cf84a6, 0x027cd723, 0x000d5a34}}, Y: Field{[10]uint32{0x0354fdb3, 0x031db561, 0x033daf04, 0x02360e73, 0x038eff10, 0x0042a395, 0x02356680, 0x01011c5b, 0x03a96d09, 0x00038db7}}}, + {X: Field{[10]uint32{0x017801d7, 0x028b05fc, 0x038abafa, 0x01caf702, 0x0246310f, 0x01c01dd0, 0x02abb919, 0x02743174, 0x033545e0, 0x000ddcaa}}, Y: Field{[10]uint32{0x0278884e, 0x01001082, 0x03260053, 0x02be3b6d, 0x00775693, 0x022c04b8, 0x03a50cda, 0x031d18b5, 0x028ceae0, 0x000948a6}}}, + {X: Field{[10]uint32{0x029274f2, 0x00153970, 0x0131fa13, 0x026747b8, 0x0244f3b2, 0x022e4eb4, 0x0224779c, 0x01c06b91, 0x024f72c4, 0x0020546c}}, Y: Field{[10]uint32{0x00bb6429, 0x035544ae, 0x00c9986e, 0x009134b9, 0x03734207, 0x0030a35d, 0x033fca05, 0x03586779, 0x030725ff, 0x001624e0}}}, + {X: Field{[10]uint32{0x01539c9a, 0x00d25197, 0x034c8692, 0x0076489f, 0x001b57a8, 0x0394dc20, 0x00597050, 0x007e3183, 0x015ad410, 0x0011a921}}, Y: Field{[10]uint32{0x01e36b59, 0x034f9a22, 0x00864bee, 0x00917faa, 0x039517ad, 0x038bc82e, 0x00117ae0, 0x01c6578b, 0x01cf2111, 0x0023e99b}}}, + {X: Field{[10]uint32{0x01803d16, 0x0224f185, 0x02d4f0fd, 0x017d3b38, 0x00efa7c4, 0x00e2f4a9, 0x0015001c, 0x013cf7bb, 0x01543e65, 0x0002e06f}}, Y: Field{[10]uint32{0x029d3e75, 0x00ae8053, 0x00c4a75d, 0x03f96a25, 0x032b3947, 0x03e4eda8, 0x00316228, 0x0269d8d1, 0x03aa3129, 0x000570fd}}}, + {X: Field{[10]uint32{0x012e7706, 0x03572b40, 0x01faba5c, 0x03c933f2, 0x01423f10, 0x01356200, 0x038c0549, 0x00c93491, 0x021cf2a0, 0x000f85a6}}, Y: Field{[10]uint32{0x01389135, 0x008d5886, 0x020f9869, 0x012ff2a4, 0x03004d45, 0x01c02d2f, 0x0069075a, 0x02b1f14d, 0x03ddd814, 0x00081016}}}, + {X: Field{[10]uint32{0x01a65956, 0x02f74b53, 0x02fdf534, 0x02e1510f, 0x03557f39, 0x0379866f, 0x027a1b8c, 0x02ccfc3d, 0x024ab161, 0x001d0a0f}}, Y: Field{[10]uint32{0x00b3df3a, 0x038da274, 0x03159bfe, 0x005c71de, 0x01380c17, 0x02205d13, 0x033ad2bc, 0x0170119d, 0x03e28978, 0x00088a5a}}}, + {X: Field{[10]uint32{0x026b756e, 0x00f68e7a, 0x00092bde, 0x02d37a0a, 0x021a617f, 0x02de5539, 0x01da0a23, 0x02f27ed9, 0x0386cb76, 0x00189c55}}, Y: Field{[10]uint32{0x02c2db32, 0x017f6414, 0x0317d34a, 0x01608787, 0x00eec54d, 0x03e65444, 0x0163337b, 0x028540ed, 0x03e38829, 0x000f09ee}}}, + {X: Field{[10]uint32{0x037c8aae, 0x0168001b, 0x01f739c5, 0x038b28d7, 0x002c93ae, 0x015659d0, 0x0336bc9d, 0x02e24e10, 0x0105db23, 0x00258800}}, Y: Field{[10]uint32{0x00a6ba26, 0x037e85e1, 0x03b19a2b, 0x03638ff4, 0x01ea41cd, 0x026197d2, 0x00307c5d, 0x00981320, 0x028d400a, 0x000c64a5}}}, + {X: Field{[10]uint32{0x031d13fb, 0x0365a5ad, 0x01c313aa, 0x00d5506d, 0x01317875, 0x02fe2cb1, 0x0052fb5c, 0x0246c233, 0x0398bd26, 0x002f51dd}}, Y: Field{[10]uint32{0x03ddfc3b, 0x01f8502a, 0x0150b6be, 0x00e5299b, 0x0351978b, 0x03139eca, 0x01dae500, 0x0000cf08, 0x01c9a4ab, 0x002f8ad4}}}, + {X: Field{[10]uint32{0x035289e7, 0x0270c151, 0x02b05903, 0x006bd4b6, 0x0070da10, 0x02ab19e2, 0x01490e83, 0x03e126ed, 0x0388e46f, 0x003e8524}}, Y: Field{[10]uint32{0x0067b2a7, 0x0080c2e2, 0x015e37f2, 0x03470613, 0x02c75af3, 0x03349a87, 0x032080ad, 0x0159d0ec, 0x037fa8d8, 0x00211555}}}, + {X: Field{[10]uint32{0x0391ba90, 0x00dab80c, 0x00e86ff4, 0x00f11c80, 0x028ab50d, 0x01e069c2, 0x03bfae73, 0x03fec752, 0x03830af1, 0x00108a36}}, Y: Field{[10]uint32{0x03a270a7, 0x01c7632d, 0x01637d40, 0x03252d2b, 0x032413dd, 0x0066f4b8, 0x01560b64, 0x03c28600, 0x010ab0e6, 0x001176c7}}}, + {X: Field{[10]uint32{0x0017c85c, 0x0187fcc2, 0x03d49f41, 0x026bf28a, 0x021dc3a3, 0x02da71a1, 0x0094c02e, 0x03d680f5, 0x0279fe0d, 0x002a5eac}}, Y: Field{[10]uint32{0x019bec7d, 0x00d72371, 0x022900e5, 0x0105ac72, 0x005d4b74, 0x0335b7bb, 0x032f99f7, 0x03785cf5, 0x00bff128, 0x001401b2}}}, + {X: Field{[10]uint32{0x004c668f, 0x011199a4, 0x02b63f8d, 0x011544d7, 0x039f27dc, 0x0067ee8d, 0x01a3a1cc, 0x03198538, 0x00576bdc, 0x0030351b}}, Y: Field{[10]uint32{0x03215f58, 0x0024db72, 0x03a71f19, 0x00bd1fff, 0x013d1917, 0x024f1d82, 0x017d7ccf, 0x02c940b2, 0x00a30b28, 0x000e5ad8}}}, + {X: Field{[10]uint32{0x01a8dbbd, 0x00cd8fec, 0x00e636de, 0x031b86e2, 0x020b7ae4, 0x01716f28, 0x01b8c2c2, 0x03e9f782, 0x03e04599, 0x001cf175}}, Y: Field{[10]uint32{0x007bc617, 0x005f689d, 0x01ea3faf, 0x037dbea3, 0x0309229a, 0x0310c759, 0x02986b00, 0x03590827, 0x008d558b, 0x000767b4}}}, + {X: Field{[10]uint32{0x024827a7, 0x00f227b8, 0x03ab7bbf, 0x01958ab4, 0x00b4788c, 0x006805d4, 0x0097c6ef, 0x01210e36, 0x001da2ef, 0x0000dc12}}, Y: Field{[10]uint32{0x020fa7b1, 0x0390d71d, 0x02aaa190, 0x02d14e16, 0x01ccf794, 0x00003c3c, 0x004acc33, 0x00640476, 0x0076c205, 0x002a22ce}}}, + {X: Field{[10]uint32{0x037807ec, 0x02206758, 0x01d54eda, 0x02fd926e, 0x02f2b68c, 0x00d1e42f, 0x01bb7d8d, 0x03c29267, 0x03033006, 0x000b72f8}}, Y: Field{[10]uint32{0x0290c1e1, 0x03d63dc6, 0x01bda5d6, 0x00f5613e, 0x02092cf4, 0x00fe8a35, 0x015de2df, 0x00ca7ae4, 0x02e3c7ab, 0x002e0ad1}}}, + {X: Field{[10]uint32{0x017bb4b7, 0x0110bd80, 0x023c908a, 0x0193e3d0, 0x0144052b, 0x0093de96, 0x035d957c, 0x01171778, 0x00a916db, 0x003d17cf}}, Y: Field{[10]uint32{0x029b5a96, 0x01a39808, 0x03fc1dad, 0x03de042e, 0x015b4a0f, 0x03193798, 0x01d6a795, 0x0135b368, 0x002fb315, 0x001e777c}}}, + {X: Field{[10]uint32{0x0387605e, 0x01fa5779, 0x02e934fe, 0x01af8ea6, 0x03ee1734, 0x01200954, 0x01c99bcc, 0x0159e919, 0x028bcad0, 0x0014032a}}, Y: Field{[10]uint32{0x0238370a, 0x01c318bc, 0x02a58f05, 0x0291fe08, 0x024e1bee, 0x00f77495, 0x019dccf7, 0x03235ab8, 0x02d075df, 0x0010211f}}}, + {X: Field{[10]uint32{0x024c3aff, 0x017bb135, 0x01557c52, 0x021dbea1, 0x037bcd8b, 0x008ee24e, 0x0346191e, 0x018b156d, 0x0186a239, 0x000c158a}}, Y: Field{[10]uint32{0x00577a53, 0x00dd41e0, 0x01fe9373, 0x02622975, 0x00e19d8d, 0x02ed5519, 0x020c0347, 0x014e0c6d, 0x02be41c4, 0x00000b56}}}, + {X: Field{[10]uint32{0x008e422e, 0x006383ad, 0x0078f63a, 0x00ada8c1, 0x01ec7238, 0x03879881, 0x013f690b, 0x01adca7b, 0x011a3252, 0x003da1f5}}, Y: Field{[10]uint32{0x01515704, 0x0384aadf, 0x01680211, 0x033a830b, 0x00f197e2, 0x00dac56f, 0x014da2ed, 0x013debf1, 0x033519c9, 0x003bf386}}}, + {X: Field{[10]uint32{0x01ca505d, 0x022133e8, 0x01018472, 0x029f7a99, 0x0322199e, 0x0002b9fa, 0x00e207e5, 0x00d47327, 0x03f0d385, 0x00041298}}, Y: Field{[10]uint32{0x00239cc5, 0x02b12a0c, 0x0267ce05, 0x03a4cf4b, 0x00a6de0b, 0x028a8bb7, 0x031600a0, 0x002cf16b, 0x008750b2, 0x001a7086}}}, + {X: Field{[10]uint32{0x0280fc6e, 0x02b268fa, 0x01c035e6, 0x02f50c0a, 0x02eb3d59, 0x03d34a56, 0x03963e2f, 0x023286af, 0x00994b7b, 0x00142598}}, Y: Field{[10]uint32{0x027287b1, 0x018eb7cc, 0x02519729, 0x029ef22b, 0x0256be56, 0x0152ba8f, 0x02116748, 0x0066c604, 0x01cd40d0, 0x00352162}}}, + {X: Field{[10]uint32{0x00513c95, 0x033e23d5, 0x02a0dd22, 0x027f4721, 0x007ac22e, 0x02c3cb1f, 0x0388e85e, 0x0384d475, 0x02e794e5, 0x000c41b5}}, Y: Field{[10]uint32{0x03a2bca0, 0x02612f4b, 0x00dfadbf, 0x02320b3a, 0x004ad288, 0x0001ab86, 0x02849d84, 0x02330a64, 0x013c0456, 0x00301796}}}, + {X: Field{[10]uint32{0x0059fdce, 0x0053db88, 0x01235e79, 0x010f79a0, 0x03d1081b, 0x00ee7973, 0x0376ac71, 0x02f73a13, 0x011c9977, 0x0013259f}}, Y: Field{[10]uint32{0x008968cd, 0x02f9457a, 0x010ee206, 0x000a8a3a, 0x00fcc10d, 0x00e971f7, 0x002cb098, 0x026dd057, 0x00b2a3e9, 0x0021991c}}}, + {X: Field{[10]uint32{0x02781a52, 0x03fe440e, 0x032b2e4a, 0x000bfd78, 0x01b4027b, 0x03d63d8b, 0x00bbb7fb, 0x01dd0476, 0x0099ae8d, 0x00258c64}}, Y: Field{[10]uint32{0x03947389, 0x03717d59, 0x00ed422e, 0x0136de1f, 0x03d776eb, 0x02ee8bc2, 0x03148f8d, 0x00a1268e, 0x00740daf, 0x001b0440}}}, + {X: Field{[10]uint32{0x00247ee7, 0x00c3e8d6, 0x028b3bdf, 0x00add65c, 0x02b97224, 0x016bd5bc, 0x017406d9, 0x01b3aa77, 0x032387a3, 0x001f24ee}}, Y: Field{[10]uint32{0x02989942, 0x03136667, 0x00e018f7, 0x03db8f59, 0x0017cb34, 0x02568389, 0x0201e168, 0x01f219b6, 0x02983348, 0x00087937}}}, + {X: Field{[10]uint32{0x03f1e074, 0x02a46541, 0x01cddc3b, 0x02edf1b7, 0x01c764da, 0x021e8c8a, 0x01db1433, 0x005861b6, 0x020388de, 0x00319792}}, Y: Field{[10]uint32{0x03ca658b, 0x01266ef3, 0x0017bdaa, 0x030bf5e1, 0x0202137b, 0x0311707e, 0x0225a457, 0x016ca33a, 0x01430800, 0x003561b4}}}, + {X: Field{[10]uint32{0x00d674d5, 0x0285f619, 0x00f354d9, 0x02c6a042, 0x00381b1f, 0x0076346e, 0x01a380c7, 0x021a4af3, 0x012490c2, 0x0036256a}}, Y: Field{[10]uint32{0x03de17f5, 0x013dd61f, 0x0373d980, 0x028ac02b, 0x01c7cf2b, 0x02ef3496, 0x02f5728d, 0x0004fde7, 0x02250a63, 0x0034c2f6}}}, + {X: Field{[10]uint32{0x03def988, 0x03fc7857, 0x0113227b, 0x00e8f1fc, 0x00c892e2, 0x018f47dc, 0x03fa1640, 0x02e6efeb, 0x003a5b36, 0x0024119f}}, Y: Field{[10]uint32{0x029b15a7, 0x0320207a, 0x01568946, 0x01dc78cf, 0x02205225, 0x0288ab5d, 0x03ccb41b, 0x01f66cf3, 0x01914024, 0x0013b1c0}}}, + {X: Field{[10]uint32{0x02294c7e, 0x032b5d0f, 0x019810ab, 0x01756369, 0x03b4d38e, 0x03d4fbf1, 0x03268f78, 0x000969eb, 0x01630d0e, 0x0017340f}}, Y: Field{[10]uint32{0x002dfb3e, 0x002dc3ed, 0x007811a1, 0x010cd376, 0x00f168e0, 0x03938392, 0x01510cfe, 0x035072ac, 0x036e5517, 0x0030dca7}}}, + {X: Field{[10]uint32{0x007e964b, 0x00028943, 0x02988fc7, 0x000be601, 0x008bf69c, 0x03cd88a5, 0x01d7629b, 0x03173a8f, 0x009c652b, 0x00144c31}}, Y: Field{[10]uint32{0x032cf563, 0x0070855b, 0x0336b738, 0x008c6af8, 0x03a027ef, 0x01e910c4, 0x01f98c7b, 0x036f4c26, 0x02194bc9, 0x001f91b8}}}, + {X: Field{[10]uint32{0x02dd34da, 0x011de5a3, 0x01dbcc54, 0x0157969f, 0x02261a31, 0x02e49204, 0x01473066, 0x0353a44e, 0x002a33b8, 0x00256267}}, Y: Field{[10]uint32{0x026b7cb3, 0x03166476, 0x00a41d4d, 0x02d24e82, 0x01bac79f, 0x02f83411, 0x027277b5, 0x000a4a7a, 0x02998424, 0x002259ef}}}, + {X: Field{[10]uint32{0x0089745f, 0x01b903bd, 0x026049dd, 0x00e0b9d7, 0x036e55d2, 0x006137f3, 0x00650c88, 0x03a4fdf1, 0x00138cb3, 0x0000e4a0}}, Y: Field{[10]uint32{0x00006a52, 0x00251c7e, 0x03799587, 0x0011bed0, 0x02056bdf, 0x00bc9556, 0x01bd6d47, 0x03ce8722, 0x0298b897, 0x001c2c97}}}, + {X: Field{[10]uint32{0x0380b451, 0x0223f0cb, 0x03997fa3, 0x0034f3f1, 0x01ba7207, 0x03fc4223, 0x010497cb, 0x02fb7392, 0x0331b5fd, 0x00291f84}}, Y: Field{[10]uint32{0x01576b19, 0x00999baa, 0x024ecec2, 0x01194884, 0x00062447, 0x028f32e7, 0x006c75bd, 0x00119502, 0x00befff0, 0x0032952e}}}, + {X: Field{[10]uint32{0x00cfb96a, 0x002fb478, 0x036c82d5, 0x032ed237, 0x03f1b325, 0x0020f3f4, 0x03bb1344, 0x01d4a0f2, 0x008e16c5, 0x00330698}}, Y: Field{[10]uint32{0x00cc6734, 0x0082a0ce, 0x03ab5551, 0x021ec092, 0x03591b8f, 0x02382484, 0x03b0c987, 0x02c89104, 0x024467d9, 0x0016e2b2}}}, + {X: Field{[10]uint32{0x03fc3cea, 0x003db0b0, 0x0191a5d7, 0x0075a6d6, 0x03b7438d, 0x036cef78, 0x024d1df2, 0x02ebadeb, 0x03c7591e, 0x00360d52}}, Y: Field{[10]uint32{0x02ab5ad3, 0x019bc227, 0x03a31fe2, 0x031ca601, 0x017d95af, 0x01d646fb, 0x00227039, 0x03c0fca5, 0x02936765, 0x003bf225}}}, + {X: Field{[10]uint32{0x01def8aa, 0x038f68a3, 0x01d6ff2a, 0x007138ff, 0x03481ee2, 0x03681d91, 0x02ef42e6, 0x01d02c84, 0x0163ceb2, 0x001ab072}}, Y: Field{[10]uint32{0x01164281, 0x02fcfa39, 0x00d9fb1b, 0x035c2844, 0x00c52140, 0x017c80c7, 0x0053c94f, 0x016b8915, 0x00171b6d, 0x00013f22}}}, + {X: Field{[10]uint32{0x0318b42d, 0x034b91db, 0x035c4ddd, 0x00f42803, 0x0274d4da, 0x01e3ecdb, 0x00474697, 0x010523e7, 0x0359b52e, 0x002f84c3}}, Y: Field{[10]uint32{0x03c47069, 0x0263707e, 0x01516093, 0x02e51912, 0x01c5b9f8, 0x030737d8, 0x02a7d761, 0x02962808, 0x01e2f739, 0x0005b736}}}, + {X: Field{[10]uint32{0x0063bd2f, 0x031e79b0, 0x00f3ffc3, 0x03e47e7d, 0x0124ee71, 0x018996ec, 0x0356e599, 0x012955a2, 0x00cc3986, 0x001a176e}}, Y: Field{[10]uint32{0x02b50f29, 0x02eb9721, 0x03493037, 0x02fe69d7, 0x0122b396, 0x016f8c08, 0x0333b8e0, 0x00bdf0b4, 0x01418e5b, 0x001cc29c}}}, + {X: Field{[10]uint32{0x01d743ae, 0x019bb995, 0x024eaaad, 0x02bf3c3b, 0x030f31f9, 0x026f0626, 0x025e564b, 0x01306838, 0x03f389f7, 0x000e7d07}}, Y: Field{[10]uint32{0x026c8622, 0x03948375, 0x018d88e1, 0x02cbb7e7, 0x0126fdae, 0x00ce3dce, 0x030aad09, 0x013fb94f, 0x036de25d, 0x003efa83}}}, + {X: Field{[10]uint32{0x0020ed1f, 0x02c82313, 0x01f28b12, 0x018b2fd6, 0x03c29b1b, 0x0120ef03, 0x00737b3d, 0x0258e665, 0x017441bc, 0x0035e9a5}}, Y: Field{[10]uint32{0x025ba8cb, 0x0358c6c1, 0x024ceef2, 0x027d07e0, 0x0291eea2, 0x02e68f41, 0x007ca251, 0x00563a70, 0x02dacdf8, 0x00339138}}}, + {X: Field{[10]uint32{0x01eaec9a, 0x010e57b0, 0x030ba491, 0x00717f7c, 0x0022f598, 0x00acde21, 0x02867934, 0x032edcaf, 0x01609139, 0x00216eb4}}, Y: Field{[10]uint32{0x0314dfec, 0x01a92173, 0x038db419, 0x031e10e0, 0x02362055, 0x038ff8fa, 0x01c57e88, 0x01dacac9, 0x006129e5, 0x00267f35}}}, + {X: Field{[10]uint32{0x03ea49e5, 0x007ae008, 0x0372d51a, 0x03f90842, 0x0174d986, 0x03c5f682, 0x002ffbe8, 0x0285648f, 0x02c4d428, 0x0008e02e}}, Y: Field{[10]uint32{0x02d6f54b, 0x02ac1d17, 0x0065e5a6, 0x016f4824, 0x033ca101, 0x013512ee, 0x01e38bfc, 0x031fd791, 0x0313fde4, 0x003d2bdc}}}, + {X: Field{[10]uint32{0x024f9cf2, 0x030a7f4d, 0x00e9e46f, 0x03ee253d, 0x0397c1ac, 0x0088480a, 0x019108df, 0x0077438d, 0x0359b7d6, 0x00301584}}, Y: Field{[10]uint32{0x027d83dd, 0x0004c9f4, 0x0092e029, 0x000f3b3d, 0x0275b161, 0x01433acc, 0x03ea5ff3, 0x02a7d8b3, 0x01801c72, 0x000f0ddf}}}, + {X: Field{[10]uint32{0x020c2a06, 0x010e3124, 0x00fc64ed, 0x00102962, 0x0276481c, 0x026ee96c, 0x01181d30, 0x013cabae, 0x01c10b8f, 0x001cb126}}, Y: Field{[10]uint32{0x02b1ce53, 0x000490ec, 0x01e7a72d, 0x03fecc11, 0x02f05ff8, 0x03e0af06, 0x034867b1, 0x014c50a8, 0x008e6082, 0x001b2653}}}, + {X: Field{[10]uint32{0x03cf477d, 0x0081153f, 0x026f884e, 0x0272d77c, 0x0166e02c, 0x001bfad1, 0x038e2f3f, 0x018827e3, 0x00be02b6, 0x00237a13}}, Y: Field{[10]uint32{0x002a34a6, 0x002e64dd, 0x03379641, 0x010a8067, 0x02ac9e85, 0x028edeb0, 0x0348e986, 0x01f621a4, 0x0280c4d0, 0x0031fcbd}}}, + {X: Field{[10]uint32{0x001710f2, 0x00b44b90, 0x034427d0, 0x03b98f17, 0x029a2d02, 0x021ae74b, 0x02c80488, 0x035d8b96, 0x01d86581, 0x0036ffb2}}, Y: Field{[10]uint32{0x00daafea, 0x0221a370, 0x03c90004, 0x02a26284, 0x01b46496, 0x00199236, 0x005acb59, 0x02c6b2a2, 0x03f9827b, 0x001b9847}}}, + {X: Field{[10]uint32{0x01d0453d, 0x015bc8f4, 0x037f9f24, 0x00a8a455, 0x039588dc, 0x00aab9ac, 0x010ade78, 0x03b746cf, 0x01f86099, 0x00277594}}, Y: Field{[10]uint32{0x02715ebd, 0x0282c17b, 0x018455f5, 0x017e6184, 0x03cd3f90, 0x03edb5dc, 0x00be81ad, 0x02183806, 0x0217f0d7, 0x0013db6d}}}, + {X: Field{[10]uint32{0x03d66a15, 0x00982fe6, 0x033d1926, 0x03cbe8bc, 0x02356445, 0x039823e5, 0x037a885e, 0x0378d79d, 0x021ac869, 0x000bf605}}, Y: Field{[10]uint32{0x01307f25, 0x02d3203f, 0x03daa7c6, 0x028825e1, 0x0398c6e7, 0x00b798d1, 0x00163eb1, 0x00b64ad9, 0x01e9674c, 0x00074b08}}}, + {X: Field{[10]uint32{0x029dc391, 0x03a2a128, 0x038a8495, 0x0197e21d, 0x008b6d87, 0x02503b7d, 0x01538ce4, 0x0016c8fc, 0x038924f5, 0x000fc96f}}, Y: Field{[10]uint32{0x008164f2, 0x011ca5cb, 0x03c30afd, 0x01527715, 0x00344382, 0x00b184ee, 0x02b02525, 0x001e0862, 0x01830e7e, 0x001c094d}}}, + {X: Field{[10]uint32{0x00773f0b, 0x0387b89b, 0x02b47ff2, 0x01c2d57a, 0x00467dc7, 0x021163cc, 0x033d2fe2, 0x008d13e3, 0x0359d5f7, 0x000f03c0}}, Y: Field{[10]uint32{0x02db33c7, 0x00a72a07, 0x02c7b127, 0x00c3917c, 0x00b9c250, 0x01189949, 0x0050d787, 0x0067116b, 0x0239459f, 0x0012560e}}}, + {X: Field{[10]uint32{0x02b73a15, 0x0170c20d, 0x00dd73be, 0x01c3ec5c, 0x0087e38d, 0x0283764f, 0x0045855f, 0x0177c8d8, 0x0266ec1b, 0x00158e01}}, Y: Field{[10]uint32{0x019921a7, 0x0387c29d, 0x03b117bc, 0x024e0a47, 0x00b5cbbf, 0x022be3d8, 0x0291252c, 0x02b1aa6a, 0x00f0b210, 0x001c01a4}}}, + {X: Field{[10]uint32{0x009298bd, 0x01b4bea7, 0x006738bc, 0x0007ef8f, 0x0225f902, 0x03cff11f, 0x02b228aa, 0x017dffb1, 0x010b0b9a, 0x001c729c}}, Y: Field{[10]uint32{0x039abc89, 0x027bf8cb, 0x003f8fcc, 0x028d4789, 0x02c759bc, 0x01c0566b, 0x00912871, 0x002266c6, 0x028dc075, 0x001f7494}}}, + {X: Field{[10]uint32{0x01264575, 0x00b42cd7, 0x01102511, 0x02ba09f2, 0x006ed87f, 0x02386f8f, 0x02ec20f9, 0x021439f0, 0x003cc938, 0x001e377b}}, Y: Field{[10]uint32{0x01680321, 0x01b7b6cf, 0x01ddfd48, 0x018fc5e6, 0x0022b9c1, 0x01bc6798, 0x0185048d, 0x01014321, 0x0151766a, 0x000641ca}}}, + {X: Field{[10]uint32{0x034ed70b, 0x01aacf1e, 0x0267f322, 0x0127b40f, 0x02058132, 0x00f6b0a6, 0x02709509, 0x0215fa31, 0x02fd8852, 0x0026abae}}, Y: Field{[10]uint32{0x0305fffb, 0x033b34d1, 0x0271c7b9, 0x033101ae, 0x032457bd, 0x00f134bc, 0x01e13bca, 0x02f54419, 0x02ccb541, 0x00231a8a}}}, + {X: Field{[10]uint32{0x032f79e2, 0x00af96f6, 0x01bcc6d1, 0x01a882ae, 0x01a3096a, 0x02e6fc4e, 0x016c7b28, 0x0203f768, 0x02749411, 0x00161bb2}}, Y: Field{[10]uint32{0x03488d71, 0x039be4e8, 0x02ad5bfd, 0x03795805, 0x020ac4bf, 0x009a887a, 0x005a7f80, 0x002796bf, 0x01123616, 0x0002cec7}}}, + {X: Field{[10]uint32{0x0150ddf8, 0x00e060e3, 0x0397ee36, 0x02c4dab3, 0x03c0e0b6, 0x0330fb98, 0x03ed7d40, 0x0378b21b, 0x003edbe4, 0x000615ef}}, Y: Field{[10]uint32{0x00275363, 0x0293d923, 0x01835119, 0x02df3168, 0x028a7fbd, 0x016119d6, 0x0359c673, 0x022337b1, 0x007be7a5, 0x003a97a0}}}, + {X: Field{[10]uint32{0x00e5b01a, 0x0361599e, 0x037ba863, 0x02589fd7, 0x03642067, 0x032e204e, 0x022a6cdb, 0x00b18800, 0x03440757, 0x002a9331}}, Y: Field{[10]uint32{0x03a2f836, 0x03c267e3, 0x008bff39, 0x0236bdf8, 0x01a4a97b, 0x00e08698, 0x03b7f9bb, 0x00912a68, 0x02c9d259, 0x002ea5a6}}}, + {X: Field{[10]uint32{0x004f36aa, 0x01368d48, 0x02179e79, 0x01af2c9d, 0x030d6f73, 0x010f6173, 0x005fad0a, 0x010d9da2, 0x00095917, 0x0011623b}}, Y: Field{[10]uint32{0x00c7c62e, 0x021bd2c3, 0x01c3702f, 0x024a9532, 0x03a95116, 0x0372eb8e, 0x01c89d10, 0x02071bb8, 0x027ecdc6, 0x003ee0d7}}}, + {X: Field{[10]uint32{0x0080653c, 0x02cc447a, 0x00a4eca3, 0x00881408, 0x0025ce66, 0x00bdec7f, 0x0233f227, 0x017e1a67, 0x01037a3e, 0x00219eb3}}, Y: Field{[10]uint32{0x01764646, 0x01fceb49, 0x03946d8d, 0x013975b3, 0x02639cd9, 0x03d91903, 0x009ba3cf, 0x03e414c9, 0x02c757d3, 0x003a444a}}}, + {X: Field{[10]uint32{0x02df370b, 0x03f576c9, 0x03c13318, 0x013d185b, 0x00b52781, 0x026b8ef5, 0x02e46630, 0x007708a2, 0x0169e4f8, 0x00178290}}, Y: Field{[10]uint32{0x0140d001, 0x03e2b74c, 0x00ca9e58, 0x009232cd, 0x00c38cd6, 0x02eb2b53, 0x022e32c3, 0x024d3afb, 0x01a8fc23, 0x0016f4cd}}}, + {X: Field{[10]uint32{0x0101c0f6, 0x02d3ffec, 0x00263663, 0x028eb7fa, 0x01542a55, 0x00aa0bc5, 0x01b2e578, 0x0090606d, 0x006939df, 0x0024014d}}, Y: Field{[10]uint32{0x03e3d991, 0x007a944d, 0x01476e3f, 0x01e0e86c, 0x01744607, 0x0270e978, 0x00f38378, 0x0217da16, 0x01899739, 0x0013fc35}}}, + {X: Field{[10]uint32{0x03cec63f, 0x030ec358, 0x035618f4, 0x01dc8a9c, 0x004e2db0, 0x0242c540, 0x0232f33d, 0x00cee81a, 0x01a553df, 0x002a650e}}, Y: Field{[10]uint32{0x01656cd4, 0x0108f6ce, 0x00e7e7e6, 0x0317dc0f, 0x026f9c1f, 0x0139a61f, 0x01cd8a2e, 0x031ddfaa, 0x0129f11f, 0x00066382}}}, + {X: Field{[10]uint32{0x03085282, 0x00bf7c57, 0x00355a0e, 0x02c42de3, 0x031c7789, 0x020aa8b9, 0x03ab71df, 0x02e85323, 0x01361381, 0x00147ca8}}, Y: Field{[10]uint32{0x032d16a2, 0x0065f3fa, 0x00ea5a97, 0x009a124d, 0x026e2b7b, 0x00c65e8f, 0x0323bbe4, 0x03fa935b, 0x029fca15, 0x003f57c4}}}, + {X: Field{[10]uint32{0x02a91d3a, 0x014c560b, 0x0368e820, 0x02e3d507, 0x03bed208, 0x019316d3, 0x01097778, 0x012cb265, 0x001c8b06, 0x000ea47e}}, Y: Field{[10]uint32{0x03a513c9, 0x01ce8048, 0x00404085, 0x0252d804, 0x00a542b5, 0x01616a3a, 0x0077329e, 0x00e78654, 0x003ad4ae, 0x00275640}}}, + {X: Field{[10]uint32{0x0336c5c8, 0x01abc665, 0x03462105, 0x02138502, 0x005e491e, 0x01ca3045, 0x0026deee, 0x03e85cfc, 0x0150aa22, 0x001c7a67}}, Y: Field{[10]uint32{0x036a4995, 0x019fb105, 0x03b2653f, 0x038e6ec2, 0x03699806, 0x03651f9d, 0x02627291, 0x022119f1, 0x03776858, 0x003fcf93}}}, + {X: Field{[10]uint32{0x008aaa39, 0x0248005f, 0x0180e6d3, 0x003ba166, 0x0046f745, 0x0338bcf3, 0x0353286a, 0x0113dcfe, 0x02933a03, 0x002b4527}}, Y: Field{[10]uint32{0x009e81bd, 0x03dbeba4, 0x03e3f2a4, 0x00ffc455, 0x0165a5ab, 0x026a0de2, 0x03140603, 0x03cd52d3, 0x039885a4, 0x001f6fd1}}}, + {X: Field{[10]uint32{0x011ccb01, 0x011fe45d, 0x00c321a2, 0x035dfaef, 0x0286e79e, 0x025a4417, 0x000ca207, 0x023db129, 0x037f5ad7, 0x00113c28}}, Y: Field{[10]uint32{0x0353044a, 0x01255570, 0x01905af6, 0x02684a24, 0x0070836d, 0x019ad44a, 0x031e5590, 0x02cfefbe, 0x0067911e, 0x003d0136}}}, + {X: Field{[10]uint32{0x0330ad5d, 0x00e29842, 0x02c1dc0d, 0x038ec9c7, 0x0050f5c0, 0x025c5e1a, 0x00a4a8b2, 0x03823130, 0x00c3de8d, 0x0013ddf7}}, Y: Field{[10]uint32{0x01f57c69, 0x00da8e53, 0x032fa558, 0x000201bb, 0x0358dc73, 0x002a996c, 0x018aa5ab, 0x003ba484, 0x024f8ae8, 0x001cf1d0}}}, + {X: Field{[10]uint32{0x02005555, 0x01c4dc79, 0x01c0d38d, 0x0093978b, 0x016d6d5c, 0x03bd9630, 0x026efd38, 0x00248d8d, 0x008b102a, 0x001e5284}}, Y: Field{[10]uint32{0x0246ba2c, 0x03d9cdf3, 0x03f751a6, 0x012d7f72, 0x007c9e30, 0x007e11e6, 0x02cf0fdc, 0x024141a6, 0x01efefd7, 0x0021c659}}}, + {X: Field{[10]uint32{0x00e8e594, 0x029235c5, 0x003a822d, 0x01f3a8c2, 0x02a72e29, 0x0282c494, 0x01bd49f5, 0x0218eb7d, 0x0161234b, 0x003c6621}}, Y: Field{[10]uint32{0x003fc418, 0x03acd86a, 0x0203fca6, 0x01cf4c6a, 0x03abd2f5, 0x03f68fe3, 0x0036612d, 0x01468630, 0x0107d0ab, 0x001eb6e9}}}, + {X: Field{[10]uint32{0x003f4a80, 0x02862f73, 0x01c75491, 0x036fe0b4, 0x02f3fd27, 0x01e42abb, 0x0249b8f7, 0x026781c4, 0x0156c07c, 0x00122fb5}}, Y: Field{[10]uint32{0x02316e94, 0x00795559, 0x03543856, 0x008b5250, 0x0046cf01, 0x03976f2a, 0x00dd08cb, 0x0106346d, 0x028021be, 0x00276b94}}}, + {X: Field{[10]uint32{0x003ab9c1, 0x032ccfe5, 0x00a1f3bf, 0x02ff0b72, 0x00ec8449, 0x01d2eb1d, 0x0376fef9, 0x01e74e3c, 0x03fbe537, 0x002effbc}}, Y: Field{[10]uint32{0x0312551b, 0x01b1b378, 0x030b0800, 0x018e1200, 0x00ed4625, 0x02f83aa3, 0x010e8495, 0x022bff18, 0x0372ee79, 0x002fa96d}}}, + {X: Field{[10]uint32{0x015b7f06, 0x01d2f582, 0x0212e00b, 0x02bfbaf0, 0x00156839, 0x03305d71, 0x006b04be, 0x033548e0, 0x001527b3, 0x0010abcd}}, Y: Field{[10]uint32{0x01dcef4f, 0x02d1b7d6, 0x021370e7, 0x006096fe, 0x00f91a55, 0x02237a60, 0x036d0961, 0x01bfd88d, 0x03e5ebf1, 0x001a1b97}}}, + {X: Field{[10]uint32{0x01ce10e6, 0x037849dc, 0x00d6938a, 0x00990309, 0x02307497, 0x0162df57, 0x03ea376d, 0x021f11bb, 0x038b74ae, 0x000f15b5}}, Y: Field{[10]uint32{0x00d54a41, 0x00c9d492, 0x03883507, 0x002d446f, 0x0039fed0, 0x0328af1b, 0x023b36b6, 0x0388574d, 0x02ccf9d1, 0x0033a5f7}}}, + {X: Field{[10]uint32{0x0389b61a, 0x03f6c26d, 0x0291d33a, 0x0073693c, 0x0267b52a, 0x0123da73, 0x02404a9e, 0x03bc2ab9, 0x01991944, 0x0012c489}}, Y: Field{[10]uint32{0x02089571, 0x02ef99ad, 0x0211bf3e, 0x0201e391, 0x0062b1bc, 0x01b64af0, 0x037932cb, 0x03e6494d, 0x035027a3, 0x001722f8}}}, + {X: Field{[10]uint32{0x00d49db5, 0x01cd4346, 0x03e9acd3, 0x0154ac02, 0x01716749, 0x01363167, 0x0258f181, 0x024c528d, 0x0067c02c, 0x0002790a}}, Y: Field{[10]uint32{0x03a8c761, 0x025df1c5, 0x01d0d831, 0x0079b635, 0x0039f65b, 0x03f8833c, 0x003155da, 0x0035cf5e, 0x00351ff9, 0x001749b4}}}, + {X: Field{[10]uint32{0x035359ae, 0x036e5cc9, 0x00b94402, 0x007976f6, 0x00306ab3, 0x01efdbea, 0x0027d0d4, 0x014d14a8, 0x010c05a9, 0x002590ce}}, Y: Field{[10]uint32{0x027a3933, 0x025c86ac, 0x000cea69, 0x00b7d657, 0x03abbf49, 0x003ef52e, 0x03560d05, 0x03a70748, 0x03f71019, 0x002cd535}}}, + {X: Field{[10]uint32{0x02126b69, 0x03d5881f, 0x01f77bac, 0x0213faba, 0x021b6f78, 0x007c55e0, 0x01374f90, 0x01f7ad41, 0x02fb86f7, 0x0022d245}}, Y: Field{[10]uint32{0x00be1fd4, 0x032cc98a, 0x00213816, 0x03cd93e7, 0x02ce6d2a, 0x02f21feb, 0x01c3d59c, 0x036c4c15, 0x03c06d86, 0x000026a0}}}, + {X: Field{[10]uint32{0x00054b9f, 0x00f3c334, 0x02ff37ba, 0x03fa554b, 0x0011de8e, 0x021223df, 0x01ee9abb, 0x020b107d, 0x034b1097, 0x00034a77}}, Y: Field{[10]uint32{0x00ca07a8, 0x01826050, 0x03d1c98a, 0x01106627, 0x00d1a5a4, 0x01e6da02, 0x03e08f6a, 0x00b13c2e, 0x0237ea24, 0x0006fc18}}}, + {X: Field{[10]uint32{0x01dbd41d, 0x02e3a9c8, 0x01ede203, 0x019481b7, 0x03d4a202, 0x01444eb2, 0x01167d05, 0x0141114e, 0x017ba540, 0x000aabce}}, Y: Field{[10]uint32{0x02f73081, 0x022087a7, 0x03c6663d, 0x03093dec, 0x00013a81, 0x028cbcc2, 0x024b4a8a, 0x02eeb247, 0x02c71132, 0x000dd38c}}}, + {X: Field{[10]uint32{0x0357ef48, 0x004cfe73, 0x03b817b1, 0x0251762d, 0x001ca58a, 0x02da8e63, 0x03d287c8, 0x0339ae3a, 0x03d223ea, 0x00088e6c}}, Y: Field{[10]uint32{0x02b4cd46, 0x032f50f8, 0x03bda94c, 0x03ecf93a, 0x00f01d70, 0x02380fca, 0x02f4b267, 0x02a2c822, 0x00b74b54, 0x003f6a20}}}, + {X: Field{[10]uint32{0x03c7e365, 0x03b18929, 0x00f62e86, 0x00ce7c95, 0x01b88ee2, 0x007b6c51, 0x01c91785, 0x01cb7dfb, 0x03bcf47e, 0x0022cca1}}, Y: Field{[10]uint32{0x01fecabb, 0x03c3c802, 0x005be321, 0x01a47ad8, 0x00db6d99, 0x0030f4df, 0x0100868c, 0x0355397e, 0x03c09f60, 0x0015281a}}}, + {X: Field{[10]uint32{0x004f7993, 0x026072a6, 0x0136dd8d, 0x031c935b, 0x01ace742, 0x03a1d4e7, 0x017e1ff3, 0x03fba443, 0x02a33e3c, 0x00366b33}}, Y: Field{[10]uint32{0x027dc88b, 0x018e2a10, 0x02690565, 0x02055097, 0x0162947f, 0x0082f40b, 0x00f5a05a, 0x03974b63, 0x034aa901, 0x001ab725}}}, + {X: Field{[10]uint32{0x00b3206d, 0x03cab96a, 0x036b308d, 0x036902e3, 0x004af245, 0x01d3b80e, 0x0292b504, 0x0122f799, 0x03f834c3, 0x0035ff15}}, Y: Field{[10]uint32{0x004e2d19, 0x034acc09, 0x03406e38, 0x02c47e6b, 0x000231ed, 0x01b6c0c9, 0x028e04ba, 0x027faa6c, 0x024b41fd, 0x0002c94f}}}, + {X: Field{[10]uint32{0x00d9588a, 0x016d70c5, 0x015059ad, 0x0181e88f, 0x02b815f6, 0x02540878, 0x0334e165, 0x005024da, 0x03e0ec4a, 0x00096023}}, Y: Field{[10]uint32{0x018e7b96, 0x01e63df1, 0x00ec66f4, 0x01b3a2ef, 0x03a75bc1, 0x02e77c7f, 0x00a1eefb, 0x01bbe232, 0x02d5b1d4, 0x00341992}}}, + {X: Field{[10]uint32{0x01927914, 0x01ba84e6, 0x01ecc322, 0x01d8a68e, 0x0359e67a, 0x00368d69, 0x0152fa57, 0x015759c8, 0x03801139, 0x003911d1}}, Y: Field{[10]uint32{0x03793bee, 0x037cfe50, 0x035eac1a, 0x034a0dfb, 0x02ad4eb3, 0x0159b1e3, 0x02834d33, 0x00121b69, 0x0170aa2f, 0x00124f30}}}, + {X: Field{[10]uint32{0x026311ad, 0x000ae444, 0x02f11476, 0x02160b51, 0x0244e2b9, 0x0003c411, 0x01dd900d, 0x035c19db, 0x01be2af9, 0x00314103}}, Y: Field{[10]uint32{0x024ddb15, 0x0234a00c, 0x0186b91a, 0x006c41dd, 0x01a7cabc, 0x01e2a739, 0x01b64667, 0x0185c732, 0x0311a231, 0x002102aa}}}, + {X: Field{[10]uint32{0x037d9f14, 0x008a3ad0, 0x023a812a, 0x013e4ef6, 0x008116cd, 0x0311f539, 0x03ca1236, 0x00cface9, 0x03aa316d, 0x0008ce46}}, Y: Field{[10]uint32{0x037efd4d, 0x02d53d72, 0x00b7f1eb, 0x01e71f2e, 0x010bc97c, 0x01b63446, 0x00a69aff, 0x01dbf007, 0x001d9e6d, 0x0007604d}}}, + {X: Field{[10]uint32{0x0039ac38, 0x02acd3ef, 0x01eb945e, 0x036302e5, 0x008aeb8f, 0x03ace525, 0x006682cb, 0x02e9c8bf, 0x03563de3, 0x0004c845}}, Y: Field{[10]uint32{0x0174f006, 0x02e6b623, 0x013df89e, 0x001506dd, 0x01aa5279, 0x009b2fee, 0x0161431e, 0x00208df2, 0x03218a4b, 0x0026ddc9}}}, + {X: Field{[10]uint32{0x02789708, 0x01dea56e, 0x0096d2ff, 0x00eebfba, 0x01708b94, 0x02d735f8, 0x00f896bb, 0x00bf1e87, 0x0098b27a, 0x000ee2ee}}, Y: Field{[10]uint32{0x0136c1cb, 0x00403227, 0x028c9248, 0x01e70d01, 0x027fdcbf, 0x02858d77, 0x01e13e96, 0x000f9568, 0x001c6680, 0x00360795}}}, + {X: Field{[10]uint32{0x00217b4d, 0x03a267f8, 0x02e21c7c, 0x00b20568, 0x03d94f16, 0x0300103f, 0x005e4f55, 0x0312eb14, 0x022c9af5, 0x003875c2}}, Y: Field{[10]uint32{0x03a4532e, 0x00f3fb25, 0x0212c2fd, 0x02679e70, 0x01eb063b, 0x00ac794f, 0x006d66de, 0x00392cda, 0x00d6d20e, 0x002c958c}}}, + {X: Field{[10]uint32{0x0112de1c, 0x02aa9ef6, 0x001b5ff1, 0x0320c3ed, 0x03a7e681, 0x00acdb7f, 0x00f0c56e, 0x01e3eb4e, 0x0023a517, 0x0006c78e}}, Y: Field{[10]uint32{0x0184d4c1, 0x00ffcc89, 0x0116cd59, 0x009a0ca0, 0x03bebe16, 0x02fdff49, 0x03258556, 0x00807739, 0x0290a951, 0x003cba66}}}, + {X: Field{[10]uint32{0x01bda7a1, 0x03dca088, 0x03102e48, 0x00703640, 0x018745a9, 0x017919f8, 0x01348175, 0x018644b0, 0x003894f5, 0x00078c76}}, Y: Field{[10]uint32{0x00d610ce, 0x0232531f, 0x03aee504, 0x009d0480, 0x02477a7b, 0x03e0225b, 0x002c6d97, 0x03863cf0, 0x038835da, 0x0004773b}}}, + {X: Field{[10]uint32{0x02b7100e, 0x02c0c062, 0x0028c422, 0x01e946d4, 0x03311f68, 0x02f0ed25, 0x027a7ff2, 0x02f266fd, 0x0034795c, 0x00032e6b}}, Y: Field{[10]uint32{0x00d0db1d, 0x01120d8f, 0x0332074e, 0x03762913, 0x03e5ff32, 0x023704fd, 0x01e95e9a, 0x02cd7380, 0x0221c804, 0x001797c1}}}, + {X: Field{[10]uint32{0x00e11c1b, 0x01ce0d6d, 0x020ce56c, 0x0213c028, 0x0024dcb8, 0x02995b12, 0x02326fa1, 0x02b4e283, 0x02c4067d, 0x002bf0d2}}, Y: Field{[10]uint32{0x00bdcb96, 0x00204d8a, 0x01de1d75, 0x02baff1b, 0x0377a033, 0x000b0432, 0x02ef031a, 0x0191e8e0, 0x00043f6d, 0x00322c71}}}, + {X: Field{[10]uint32{0x0270aa81, 0x03e17ef8, 0x0273e603, 0x00d9e9e0, 0x023330f6, 0x02e85384, 0x01430bc0, 0x02ae8586, 0x0160ca85, 0x000e9bf0}}, Y: Field{[10]uint32{0x0222bc0a, 0x01d36e80, 0x001bb617, 0x03246709, 0x02cb72cf, 0x01c1ef0c, 0x01a7a483, 0x02ce4251, 0x037286db, 0x0016528a}}}, + {X: Field{[10]uint32{0x033ce7d4, 0x00658050, 0x02e4346b, 0x02a38fab, 0x01bdc1e4, 0x03c637af, 0x024f56ea, 0x0270e8fd, 0x0295657c, 0x002a103d}}, Y: Field{[10]uint32{0x02126fbc, 0x007d27fa, 0x0269d7a4, 0x0091c9cc, 0x031a77b8, 0x030004c6, 0x01eae96b, 0x038b7d18, 0x02c0ca41, 0x0022a29e}}}, + {X: Field{[10]uint32{0x000a39d6, 0x027602ba, 0x033e55f6, 0x018b5b83, 0x0065cd77, 0x028a4c9a, 0x01d08c34, 0x01a4530e, 0x020170ec, 0x00030113}}, Y: Field{[10]uint32{0x020b4657, 0x02fe488e, 0x0052a92d, 0x01ee4816, 0x036dd5fd, 0x00be5ecd, 0x02e0b5ec, 0x00545897, 0x00827ae5, 0x001ef58c}}}, + {X: Field{[10]uint32{0x02a00b3a, 0x0377a53a, 0x00b2aa89, 0x00690769, 0x002bf927, 0x033f74a2, 0x01eb5c67, 0x025a6c11, 0x035b352b, 0x0032e404}}, Y: Field{[10]uint32{0x0179be93, 0x012d858b, 0x00b492a8, 0x00b1498d, 0x03b4dac8, 0x009dea3d, 0x00b6d267, 0x026c47f9, 0x00a0762d, 0x000532fb}}}, + {X: Field{[10]uint32{0x03182a0e, 0x03213402, 0x02963c58, 0x01d9d7a9, 0x03c82166, 0x02a92a3f, 0x007c0633, 0x02ac3c87, 0x0037a24d, 0x003e9ef1}}, Y: Field{[10]uint32{0x01a5aa35, 0x03bb9534, 0x0244b383, 0x0051007c, 0x00fdf721, 0x0124d678, 0x0109326c, 0x0031adb7, 0x03c6d730, 0x00389099}}}, + {X: Field{[10]uint32{0x03b3299a, 0x00701795, 0x02fcdd0c, 0x015cef22, 0x0035e956, 0x0054ceb6, 0x032bef99, 0x00f494de, 0x00dd3f50, 0x00398d53}}, Y: Field{[10]uint32{0x019ead7f, 0x0342e1a1, 0x01a0a3c4, 0x03cfd72b, 0x03cdc2b6, 0x03a7be71, 0x01955b9a, 0x03228662, 0x03706291, 0x0035b05e}}}, + {X: Field{[10]uint32{0x0345cce8, 0x00ebc7ee, 0x0053b048, 0x00f4afc1, 0x02132ec2, 0x0035f604, 0x00dce9d5, 0x00578f7c, 0x013007e8, 0x002768d9}}, Y: Field{[10]uint32{0x0067a8dc, 0x02639474, 0x0109ebd2, 0x008c8bd3, 0x013bbc4b, 0x02426ba4, 0x02a1b102, 0x022b3aa1, 0x016698a2, 0x002ecdd1}}}, + {X: Field{[10]uint32{0x00c9d4db, 0x0066e28e, 0x011ba763, 0x02208b5a, 0x0213b257, 0x0105aa21, 0x02d1c3ba, 0x03371c1b, 0x021e1a19, 0x0037115e}}, Y: Field{[10]uint32{0x03dc3b58, 0x03a04fee, 0x01776dfc, 0x0363e0a1, 0x0385e25b, 0x02518e29, 0x01919fa2, 0x01943752, 0x0366de5a, 0x000e7e4f}}}, + {X: Field{[10]uint32{0x00f0374d, 0x02760ab3, 0x009a962b, 0x01badece, 0x03ec216c, 0x0132915b, 0x0357bc66, 0x003a617f, 0x031f1b1a, 0x002c8dde}}, Y: Field{[10]uint32{0x03578c1a, 0x00666b1d, 0x02db5dac, 0x030188ca, 0x027a040f, 0x00fae5d1, 0x0114e74b, 0x014272fc, 0x0180d723, 0x000e0e95}}}, + {X: Field{[10]uint32{0x00fc7e50, 0x0144492b, 0x01f65780, 0x03381797, 0x002a5a86, 0x02570936, 0x011fabeb, 0x00ea14e1, 0x0046755d, 0x0022c699}}, Y: Field{[10]uint32{0x0255cf75, 0x03ccd1a5, 0x036231ca, 0x01850e32, 0x01ed1cd4, 0x024a96ff, 0x0288aef1, 0x00a99d46, 0x01d4cb63, 0x0010ae21}}}, + {X: Field{[10]uint32{0x0103f5b1, 0x029bfc94, 0x01b3e7d5, 0x0288c285, 0x03c3a7ef, 0x00ea41e9, 0x01f14162, 0x00683279, 0x019cbacf, 0x00250220}}, Y: Field{[10]uint32{0x00506f98, 0x031a32c3, 0x0056b0d6, 0x00c32ec9, 0x021df08c, 0x002ade68, 0x0107451f, 0x013dcff4, 0x02c9d6f8, 0x002a5d63}}}, + {X: Field{[10]uint32{0x006ce25c, 0x00661c2c, 0x013ee9c3, 0x01cf090f, 0x029ce6d4, 0x02213693, 0x017c933a, 0x03e32e67, 0x004707b3, 0x0022ffbc}}, Y: Field{[10]uint32{0x03e5c498, 0x00f04b3d, 0x03e37ca7, 0x0213a281, 0x00627f1d, 0x00c05f16, 0x00d17ee8, 0x02bc5d54, 0x01870d06, 0x0022ef2f}}}, + {X: Field{[10]uint32{0x014bdb61, 0x034a52d0, 0x03cc0dc1, 0x01ff0e00, 0x018eff64, 0x037d60be, 0x00b84b8a, 0x000b8477, 0x03f0c122, 0x0000aa15}}, Y: Field{[10]uint32{0x02db6548, 0x003bfb11, 0x029afe43, 0x0076bdfe, 0x0262c8ae, 0x023a88ea, 0x00af8c64, 0x024c6091, 0x016da7fd, 0x0026eb11}}}, + {X: Field{[10]uint32{0x015cb5ec, 0x00eb2d97, 0x0083525e, 0x039a924f, 0x03b94b1e, 0x03fd4f9a, 0x006b2242, 0x017b4c34, 0x005a9048, 0x0024dee3}}, Y: Field{[10]uint32{0x03ccd808, 0x02c9d9a9, 0x02788da3, 0x019fa6df, 0x02c9c3d8, 0x038d9b29, 0x035a311a, 0x00dd2943, 0x036ff9fb, 0x0034dec4}}}, + {X: Field{[10]uint32{0x0243c77a, 0x0038280e, 0x001a065a, 0x00cd2248, 0x0122b249, 0x01a87971, 0x0150ff30, 0x035afb64, 0x0153e2bf, 0x0017d513}}, Y: Field{[10]uint32{0x02990f51, 0x00df82c4, 0x01562c31, 0x01f88059, 0x028f4c84, 0x01c33b4c, 0x012c4130, 0x0336605d, 0x00e28c47, 0x002ea708}}}, + {X: Field{[10]uint32{0x03c807b9, 0x025f9ea9, 0x01cbd9c2, 0x03ea0695, 0x01e3249c, 0x02e7e932, 0x0364fa7e, 0x022ebe96, 0x038890bf, 0x0019ed8c}}, Y: Field{[10]uint32{0x027625e6, 0x01876fab, 0x02567620, 0x0305b22e, 0x010d871e, 0x037e0229, 0x0354577e, 0x02e0450a, 0x02752d94, 0x00370615}}}, + {X: Field{[10]uint32{0x00439442, 0x00918a26, 0x02e2fbd3, 0x0360e1a8, 0x02b76604, 0x018ca00c, 0x012ffa3d, 0x01123e7e, 0x01d599cb, 0x00161ea7}}, Y: Field{[10]uint32{0x03ae9870, 0x035b7376, 0x03dee6b6, 0x021d47fe, 0x03488aa6, 0x036efd4c, 0x01e73ca2, 0x03ea9e92, 0x00e9a893, 0x00125a66}}}, + {X: Field{[10]uint32{0x03c29b38, 0x000a5298, 0x02a568f8, 0x00696190, 0x0218dfe5, 0x01746184, 0x00773123, 0x03fe7e04, 0x031ec576, 0x000dbede}}, Y: Field{[10]uint32{0x0166c4aa, 0x00055c85, 0x038e8a2f, 0x022586eb, 0x035c1a15, 0x01f7a298, 0x016fc1a6, 0x02c6fcb2, 0x02c9b82c, 0x000d2916}}}, + {X: Field{[10]uint32{0x01f4ba95, 0x0158931c, 0x03caef77, 0x00f5393b, 0x00ab8a27, 0x0027fd0d, 0x00f49c51, 0x03b34b76, 0x008ca0af, 0x0021edc7}}, Y: Field{[10]uint32{0x025676f9, 0x00e0b314, 0x010b81bc, 0x0286f5ab, 0x005b3626, 0x0079b672, 0x0127c56e, 0x009621d9, 0x011f5112, 0x00214645}}}, + {X: Field{[10]uint32{0x0063e040, 0x00e839e9, 0x0296cf43, 0x0262e069, 0x0000056c, 0x00ee8ec3, 0x03ed962c, 0x00dc2e8e, 0x00f2805c, 0x002b3d97}}, Y: Field{[10]uint32{0x01692d5b, 0x00ed0085, 0x023d663b, 0x008f35a3, 0x02dc7b0e, 0x00bd5fbc, 0x022762b5, 0x0385abe5, 0x029bf45b, 0x003c24e4}}}, + {X: Field{[10]uint32{0x0147acf1, 0x0011d7c8, 0x03f44899, 0x02ea04a5, 0x01e3e045, 0x00737ec7, 0x01f16740, 0x003216e4, 0x03ed8b01, 0x003824af}}, Y: Field{[10]uint32{0x03902c37, 0x01c2a61d, 0x0291b657, 0x02be2f76, 0x018c4d18, 0x0181c36a, 0x00160728, 0x01a0f790, 0x0042ecc8, 0x00382ee6}}}, + {X: Field{[10]uint32{0x010a52ae, 0x021c7298, 0x0269197c, 0x01fca3b3, 0x03ba386b, 0x01c14076, 0x0012735c, 0x02f2fc5e, 0x03b98260, 0x0026f7f5}}, Y: Field{[10]uint32{0x02371eeb, 0x033f7ad7, 0x00d9affb, 0x01e10188, 0x00887d9a, 0x017d427d, 0x01e01baa, 0x013339cc, 0x03983f8c, 0x0026f194}}}, + {X: Field{[10]uint32{0x0243545f, 0x028be0a1, 0x0240e9a4, 0x00361a90, 0x00afc8a8, 0x00255087, 0x005587a9, 0x00562572, 0x0321d931, 0x000f6c88}}, Y: Field{[10]uint32{0x03b78eae, 0x03dcd263, 0x028bfddb, 0x01153bf1, 0x02fdd6bb, 0x02c6651f, 0x0323c9af, 0x021a3783, 0x00b82c57, 0x0010abcc}}}, + {X: Field{[10]uint32{0x022b3e5f, 0x009e5858, 0x03da6256, 0x01908b4d, 0x03c3757a, 0x01790fe8, 0x02decbdc, 0x01fff3e1, 0x0314a6a7, 0x0003a74f}}, Y: Field{[10]uint32{0x00e67de7, 0x003e060c, 0x027f02f9, 0x0210db59, 0x03fd18ee, 0x02a4b305, 0x02d0764d, 0x01c5331b, 0x03ed1e2a, 0x0020eb02}}}, + {X: Field{[10]uint32{0x0042f2a4, 0x007547a6, 0x0180f089, 0x02161a09, 0x01b31b90, 0x02b56566, 0x01448af0, 0x01221c38, 0x02e4f29b, 0x00104921}}, Y: Field{[10]uint32{0x01e7ee3d, 0x034e5fc3, 0x01a8f080, 0x01ed4c58, 0x000bc557, 0x030b9d87, 0x03bbb039, 0x019e430b, 0x01318c0d, 0x0030c716}}}, + {X: Field{[10]uint32{0x02b4ddaa, 0x00a7648d, 0x01a267c5, 0x008a92cb, 0x01609f84, 0x026add7e, 0x01afbe0c, 0x0141bf8b, 0x007141ed, 0x003a77bb}}, Y: Field{[10]uint32{0x0194a21d, 0x0251e3db, 0x039eb220, 0x01fe6b6d, 0x008dfb76, 0x034a8290, 0x006029e5, 0x00ef0b61, 0x0144d846, 0x00021ca1}}}, + {X: Field{[10]uint32{0x0264218a, 0x03f5bfec, 0x031735f0, 0x00b16f2d, 0x01bbf01c, 0x02e24978, 0x03a17612, 0x011a8208, 0x0292553c, 0x00168288}}, Y: Field{[10]uint32{0x015dbae2, 0x03455d79, 0x0009ce90, 0x025a3c14, 0x00012de6, 0x0111ffe7, 0x021f8976, 0x003c4289, 0x01f0adda, 0x000c25f3}}}, + {X: Field{[10]uint32{0x00928d1f, 0x03784681, 0x03d005ba, 0x03e7383f, 0x02563a40, 0x0344bc61, 0x01dc23d8, 0x006b46e8, 0x02378b68, 0x001272ca}}, Y: Field{[10]uint32{0x016732d6, 0x001a564f, 0x03bd632a, 0x02db89da, 0x00fbecc5, 0x0360128f, 0x015a938a, 0x017e83fc, 0x02afc0f6, 0x003c8d78}}}, + {X: Field{[10]uint32{0x0215feb3, 0x02af6e45, 0x037ccf99, 0x03521345, 0x003dd1af, 0x01887351, 0x01ad510a, 0x0045dec1, 0x00b63688, 0x003535c7}}, Y: Field{[10]uint32{0x0162645b, 0x03c4bc1d, 0x02c02ac7, 0x018fec1d, 0x035316c3, 0x0254354c, 0x02f385fa, 0x02e6c581, 0x0378de3e, 0x000eb594}}}, + {X: Field{[10]uint32{0x01bfab2f, 0x00f9908d, 0x01148b7e, 0x02e0fd1f, 0x01529c99, 0x013a1b31, 0x03798c31, 0x01b80193, 0x02e14bdd, 0x0001646c}}, Y: Field{[10]uint32{0x00fa59b0, 0x01a95a2a, 0x03aeca98, 0x022575e0, 0x0112a517, 0x028da356, 0x02bbaf12, 0x01319935, 0x0266fd2a, 0x0013da18}}}, + {X: Field{[10]uint32{0x03356876, 0x02f88d91, 0x00086970, 0x0003d262, 0x02be2534, 0x00bab277, 0x03b63c29, 0x02f124f5, 0x0085c984, 0x003b940f}}, Y: Field{[10]uint32{0x03daa47e, 0x0315cf12, 0x01ccb976, 0x02ce9faf, 0x0139449b, 0x005359c4, 0x01704e96, 0x022731d0, 0x02bb6f9e, 0x002f60a2}}}, + {X: Field{[10]uint32{0x00b3f89e, 0x03256cc5, 0x01697758, 0x0325dff5, 0x03756e78, 0x0261f0eb, 0x036a3f98, 0x0287f328, 0x03a702e5, 0x000be6d3}}, Y: Field{[10]uint32{0x00a4a15d, 0x03a85407, 0x03cf33f0, 0x03c86997, 0x03956657, 0x02427670, 0x022e1cee, 0x00f1d13a, 0x015b3d5b, 0x00259a18}}}, + {X: Field{[10]uint32{0x02fd46c3, 0x02c7249e, 0x03a6234e, 0x02f01b84, 0x02a1f4ae, 0x00a8042a, 0x012b204e, 0x0093e17e, 0x006aa341, 0x00062db4}}, Y: Field{[10]uint32{0x034bef4e, 0x00120747, 0x0264fb46, 0x029550dc, 0x03258b0b, 0x00f81e7c, 0x02624bfa, 0x0002c01f, 0x01b9bdf6, 0x0019b30c}}}, + {X: Field{[10]uint32{0x01b44ba0, 0x00c0d037, 0x016881cc, 0x013594e5, 0x0367662a, 0x00c36dba, 0x0337d0f0, 0x023763ff, 0x0163bf75, 0x000ef01e}}, Y: Field{[10]uint32{0x01057e5d, 0x01dc306b, 0x008a357d, 0x03b2dd15, 0x008e6dc1, 0x01db6dbe, 0x039a3c22, 0x026870b7, 0x02f26820, 0x00183847}}}, + {X: Field{[10]uint32{0x013a46a8, 0x026ca201, 0x01e3dd08, 0x016bc3ba, 0x0291498b, 0x0327e9a2, 0x0149af30, 0x01508ebf, 0x01d65b32, 0x0002fd61}}, Y: Field{[10]uint32{0x038e66a6, 0x033dab78, 0x00c0594b, 0x0304d147, 0x0204c000, 0x02a794e5, 0x0256e2cf, 0x012e6944, 0x00e9ea48, 0x000be251}}}, + {X: Field{[10]uint32{0x03b69294, 0x02704cf3, 0x01a7f64e, 0x00e35fc1, 0x00f0cf14, 0x007d03be, 0x01b59a91, 0x00095d75, 0x022ebe7a, 0x00221f02}}, Y: Field{[10]uint32{0x00aec5c9, 0x01c79c58, 0x02a58402, 0x0037483d, 0x019c37c3, 0x0105d524, 0x03de5949, 0x0319bd43, 0x00c84f9b, 0x00117ccd}}}, + {X: Field{[10]uint32{0x022f7d4f, 0x03e68d98, 0x0211601b, 0x027e0128, 0x003718e7, 0x030f71af, 0x0217700f, 0x00c97166, 0x02f90a73, 0x00276b5e}}, Y: Field{[10]uint32{0x02159525, 0x00a616b9, 0x03136644, 0x02b40624, 0x0140644b, 0x0227ae37, 0x02326ecb, 0x01aa531f, 0x025e099c, 0x000adf08}}}, + {X: Field{[10]uint32{0x03dd551b, 0x02116529, 0x006947cb, 0x007272be, 0x0363bcb6, 0x01cf37f3, 0x03e9a2ed, 0x00a7dd3c, 0x039572bd, 0x00211f93}}, Y: Field{[10]uint32{0x0393ee16, 0x0226856c, 0x004b81ea, 0x020a8407, 0x000f6f11, 0x01c32cd1, 0x006286d3, 0x00b18bea, 0x0282e0a9, 0x002e9bb4}}}, + {X: Field{[10]uint32{0x0047a593, 0x012bd1fc, 0x01580268, 0x00b3374f, 0x00b5d8c6, 0x02495b1c, 0x033c4b44, 0x00d80119, 0x0205df1c, 0x0009484c}}, Y: Field{[10]uint32{0x03096837, 0x018f59fb, 0x01f3c547, 0x03b10a9e, 0x0395aabf, 0x02881591, 0x022a47a8, 0x011c27eb, 0x01de05af, 0x000db720}}}, + {X: Field{[10]uint32{0x0058e87a, 0x0032f384, 0x0229ab17, 0x01c175cc, 0x0095ebfd, 0x00beca7f, 0x013a25ef, 0x037de91c, 0x00d84866, 0x001d48a3}}, Y: Field{[10]uint32{0x0012fe6d, 0x02ecc2f0, 0x03812a7d, 0x01564a6e, 0x0168a473, 0x00215105, 0x025f056c, 0x034fd3f4, 0x039bcc02, 0x003ee921}}}, + {X: Field{[10]uint32{0x01b68568, 0x036b6ed6, 0x03fe4b6a, 0x00dd0b18, 0x00981a13, 0x00109224, 0x002fb07c, 0x01f021b4, 0x01392286, 0x001d2515}}, Y: Field{[10]uint32{0x011af3e2, 0x03aed507, 0x01180341, 0x00111919, 0x013e3b8d, 0x0091f9d4, 0x030bf0b5, 0x02c6722b, 0x01178df8, 0x001f5dd2}}}, + {X: Field{[10]uint32{0x03c9b04f, 0x0383f2ff, 0x03f7a609, 0x038d5fd1, 0x0271d28c, 0x00a651bc, 0x00cbadfc, 0x038e73e8, 0x03532899, 0x001a76df}}, Y: Field{[10]uint32{0x019feabc, 0x0252d8c6, 0x011f0a66, 0x0375d928, 0x0326da7c, 0x007543e7, 0x0023ffee, 0x01576ab5, 0x03bb1032, 0x0032c090}}}, + {X: Field{[10]uint32{0x0129f8c7, 0x01cf0a4a, 0x022251d1, 0x03d54f6b, 0x02ec4aed, 0x0240be48, 0x012fc378, 0x0036f83f, 0x01c1fb4a, 0x001c9fb3}}, Y: Field{[10]uint32{0x011f453b, 0x03525799, 0x0035c224, 0x030592f0, 0x02bfc4f7, 0x015d536c, 0x0046ee5e, 0x02358199, 0x02ed1377, 0x002b96ec}}}, + {X: Field{[10]uint32{0x02f25b72, 0x0278cd1f, 0x00382b12, 0x01cd7baf, 0x01912138, 0x00b1fcaf, 0x007f5c9e, 0x01512f88, 0x018f0ec2, 0x00240f3b}}, Y: Field{[10]uint32{0x003190a6, 0x01073565, 0x00c8bb2e, 0x0255af90, 0x03ff75c7, 0x03ea2df6, 0x009bf33a, 0x00f4c57a, 0x02290ee1, 0x000845f2}}}, + {X: Field{[10]uint32{0x0203f33b, 0x02eee646, 0x02ca33a6, 0x03c200cd, 0x031c8906, 0x03f4d8dc, 0x038a5ad6, 0x03845cd8, 0x03ef5149, 0x00313519}}, Y: Field{[10]uint32{0x0229b5c7, 0x026058c1, 0x01b63bf3, 0x0033fe5d, 0x00431ad8, 0x02fcbf3b, 0x03d437ea, 0x01af3f38, 0x03244c53, 0x003a96d6}}}, + {X: Field{[10]uint32{0x0237326f, 0x0178df3a, 0x03cf9d32, 0x029b0daf, 0x01cff7a8, 0x036028bc, 0x03b2b7ad, 0x0027dec8, 0x03a65f6d, 0x0005ad5d}}, Y: Field{[10]uint32{0x009f15c1, 0x01ce4d34, 0x02dcbe90, 0x03876c68, 0x0184d98b, 0x0294a9e4, 0x00a65760, 0x0139788a, 0x00e21467, 0x00019aea}}}, + {X: Field{[10]uint32{0x0363412f, 0x0214c766, 0x01f5a676, 0x036f4afc, 0x0367fcee, 0x02f5f77d, 0x02453846, 0x02b7f387, 0x02f2e480, 0x002b52f2}}, Y: Field{[10]uint32{0x01e741ac, 0x0068e03a, 0x03f4a0a6, 0x02dd59cd, 0x00c4c891, 0x0097b9cb, 0x031b3a45, 0x003d6446, 0x03604781, 0x00147e80}}}, + {X: Field{[10]uint32{0x033b571a, 0x01ccd8b0, 0x01dd587d, 0x037b767a, 0x0151ca65, 0x006f2ce6, 0x012d776d, 0x039e1d29, 0x033852d2, 0x002c927a}}, Y: Field{[10]uint32{0x03a66258, 0x000c8c94, 0x031d9b11, 0x001a9e70, 0x0062dd77, 0x005dc25b, 0x03cd84eb, 0x03b3a020, 0x002414e4, 0x000f8982}}}, + {X: Field{[10]uint32{0x01e14a65, 0x0347b12f, 0x029dbccf, 0x0181f8ef, 0x0374dd05, 0x0274b14e, 0x0310d3a5, 0x0006ba04, 0x02c7696a, 0x0018d064}}, Y: Field{[10]uint32{0x03b0e00f, 0x03948895, 0x0154adcb, 0x03912e4a, 0x004fd4cc, 0x031e1ec6, 0x02dcd709, 0x0381df61, 0x0050e366, 0x001156d2}}}, + {X: Field{[10]uint32{0x022f5099, 0x02577312, 0x02ce6fd2, 0x03b7eec6, 0x02acc3c5, 0x0052c662, 0x02159ccc, 0x00fe0127, 0x03f50d43, 0x003fefb2}}, Y: Field{[10]uint32{0x000be3c0, 0x00779491, 0x0285caaa, 0x01a22921, 0x03dd68d3, 0x0300ee8c, 0x0089acf9, 0x01b3d0d9, 0x02ba1ec6, 0x00108b9e}}}, + {X: Field{[10]uint32{0x001868af, 0x00cf7457, 0x035ad8c1, 0x00ed4269, 0x02b6a8c8, 0x03418cb6, 0x034f1a90, 0x03a08e73, 0x00dc1067, 0x00196d31}}, Y: Field{[10]uint32{0x014d260e, 0x02b0797e, 0x026d840d, 0x005e7548, 0x0320c678, 0x01fd0a80, 0x003f8ae0, 0x01186146, 0x019dd765, 0x003df3d7}}}, + {X: Field{[10]uint32{0x03f9c67e, 0x00695826, 0x0355924c, 0x02ecd756, 0x008de48d, 0x0016e343, 0x018dbed4, 0x00d40b54, 0x00ce9d60, 0x0034e03b}}, Y: Field{[10]uint32{0x0364c128, 0x00d7e3f6, 0x013ae50c, 0x0136a02c, 0x038b241b, 0x01971827, 0x030ac152, 0x02ac427a, 0x0080fd18, 0x0006ba11}}}, + {X: Field{[10]uint32{0x0244511c, 0x0213fd33, 0x002df634, 0x03dc6741, 0x003fce43, 0x01774694, 0x00a1d961, 0x006efb5e, 0x0128b5ce, 0x0005c627}}, Y: Field{[10]uint32{0x0382350d, 0x01a91ce9, 0x03bb5759, 0x026236cb, 0x0185c532, 0x029584a2, 0x021b948b, 0x00f8e504, 0x00f47c7b, 0x003ef28a}}}, + {X: Field{[10]uint32{0x00c2e84d, 0x0160e0a0, 0x01ee73f5, 0x0393ebf3, 0x010be685, 0x02496fcf, 0x01ae4e61, 0x02c1f6a1, 0x02c2e2a8, 0x003ef8cc}}, Y: Field{[10]uint32{0x024e29ca, 0x0295e5fa, 0x00eb30e1, 0x0381ad65, 0x02b11c43, 0x026d0b2f, 0x038c6d77, 0x01f6838f, 0x03425e18, 0x002aa45c}}}, + {X: Field{[10]uint32{0x00bc834f, 0x01e58ee8, 0x0321002d, 0x03d736ab, 0x012100d1, 0x00ba7348, 0x00bd5182, 0x01c97e2d, 0x02878b5e, 0x0022e7a2}}, Y: Field{[10]uint32{0x003ed659, 0x01de8233, 0x00563bed, 0x0371154b, 0x02b2e873, 0x002d95c0, 0x031d6ad8, 0x015af57f, 0x031cc28f, 0x000cc7ec}}}, + {X: Field{[10]uint32{0x01e111ca, 0x003323a3, 0x02a3bd73, 0x022ad9a2, 0x0234e1a6, 0x032986b0, 0x02798ace, 0x02f2b45e, 0x0011a3c0, 0x0025fa49}}, Y: Field{[10]uint32{0x0147f48f, 0x0312fc5a, 0x007eb7cd, 0x01d82ebf, 0x01047949, 0x00f08690, 0x035fb759, 0x01785cb9, 0x00a4bac1, 0x002c3c5c}}}, + {X: Field{[10]uint32{0x0044eea8, 0x008ec974, 0x016919cd, 0x007f5354, 0x0349aa3c, 0x0309e55d, 0x00c76f82, 0x00f1bb32, 0x001333a1, 0x00080d62}}, Y: Field{[10]uint32{0x000c7f29, 0x00f2245e, 0x025c0ee7, 0x03c41366, 0x00259fc4, 0x037c3cd1, 0x022f9517, 0x02bc2bb3, 0x02a48c86, 0x001202be}}}, + {X: Field{[10]uint32{0x027dbcff, 0x016fade9, 0x00343a66, 0x03988adf, 0x02617579, 0x02126fbf, 0x01551039, 0x01d02a40, 0x00cb1575, 0x0032a87b}}, Y: Field{[10]uint32{0x00e0a20b, 0x0354b829, 0x02577e0b, 0x004e707a, 0x011aee51, 0x02fc10b6, 0x03d34511, 0x01cbfedb, 0x03f9f1c9, 0x002a9a56}}}, + {X: Field{[10]uint32{0x02620719, 0x028eb6f0, 0x02bbd138, 0x0279ba3c, 0x03f33104, 0x03f5ae20, 0x02a212a7, 0x01ea3bf6, 0x03a2036f, 0x00239f0a}}, Y: Field{[10]uint32{0x02ec105c, 0x01863e0b, 0x02d0220a, 0x00c47fb3, 0x00d9b6e0, 0x01de7e30, 0x006c4e2e, 0x03ecfd61, 0x002f1434, 0x002f40dc}}}, + {X: Field{[10]uint32{0x02ace975, 0x018df1ee, 0x033b24dd, 0x0046393a, 0x0388fbad, 0x00301de0, 0x03ebf094, 0x001307f3, 0x00336dcd, 0x00381f70}}, Y: Field{[10]uint32{0x032a2c2c, 0x01985aac, 0x0019510d, 0x01a14011, 0x02ef6f92, 0x02f54c55, 0x02ccf311, 0x03b2c1d8, 0x00a00e5e, 0x002c4ef4}}}, + {X: Field{[10]uint32{0x038ce0cb, 0x03e8b7ee, 0x0307297a, 0x0247470c, 0x0095aba7, 0x036c2ca3, 0x018a9044, 0x02bc0427, 0x00252679, 0x001981b2}}, Y: Field{[10]uint32{0x00e1d3cc, 0x01f2b202, 0x02054647, 0x015cdae8, 0x0310fe6c, 0x011e1a3e, 0x010de777, 0x01e64d5c, 0x019ca980, 0x001d4179}}}, + {X: Field{[10]uint32{0x01e6f061, 0x02e64d47, 0x020b522a, 0x00d4ae67, 0x022b31f9, 0x0037976b, 0x005450fb, 0x0089b02d, 0x00dcec48, 0x0027efd3}}, Y: Field{[10]uint32{0x02f850dd, 0x03e98047, 0x02c91a7d, 0x0119c0d3, 0x00e9c5b6, 0x00d8adf7, 0x020d58a2, 0x0083a182, 0x00a23da0, 0x003cb934}}}, + {X: Field{[10]uint32{0x006916bc, 0x03d8618a, 0x01b1b976, 0x019fa003, 0x00b7cc81, 0x025df4cb, 0x00b0403e, 0x03ff0a62, 0x02975195, 0x000381b5}}, Y: Field{[10]uint32{0x030bb8bb, 0x011302f0, 0x01c83632, 0x02ec3069, 0x02068302, 0x012400fa, 0x0380e04a, 0x034885eb, 0x030a27d3, 0x0020054d}}}, + {X: Field{[10]uint32{0x0293a6e2, 0x028fc2a4, 0x01a6bcf4, 0x01dfa5e1, 0x03ff7925, 0x01b85b35, 0x0112fd4e, 0x00aab194, 0x03ab021d, 0x002b7359}}, Y: Field{[10]uint32{0x03fd7fb8, 0x02970ad5, 0x0293d0fa, 0x03526d6f, 0x018e4f40, 0x01730eeb, 0x0058608f, 0x00aaa814, 0x02202906, 0x001949ed}}}, + {X: Field{[10]uint32{0x01f2bd38, 0x02fde8b8, 0x00e133e0, 0x005da244, 0x035a4473, 0x025a026c, 0x007e963d, 0x01932c46, 0x01eab43a, 0x0007641a}}, Y: Field{[10]uint32{0x01e29108, 0x037cc6a4, 0x033bbf15, 0x023e93b0, 0x00fc78c2, 0x03bd5057, 0x012f9a68, 0x023fa52b, 0x02de854b, 0x002ac0f7}}}, + {X: Field{[10]uint32{0x0220a768, 0x008b99c2, 0x0140e3a4, 0x03dca8e0, 0x03603206, 0x033a0fd2, 0x00168ae8, 0x0224bc52, 0x0376b8ec, 0x003c7dad}}, Y: Field{[10]uint32{0x01bff25a, 0x02ff2cae, 0x0345d14a, 0x01f60a9f, 0x01e7136a, 0x02ec9736, 0x019b11a7, 0x0368845f, 0x00363413, 0x00224ae8}}}, + {X: Field{[10]uint32{0x02fab379, 0x007177c7, 0x03fb0040, 0x008d0ce9, 0x03c21d1c, 0x0228b70e, 0x03a8d1bf, 0x03d3343c, 0x014ace79, 0x002a213e}}, Y: Field{[10]uint32{0x02a05c96, 0x00c3e037, 0x03082dd6, 0x03e97434, 0x03c611af, 0x03c0f77d, 0x0282fbee, 0x009233b0, 0x016c6e45, 0x0017d4cd}}}, + {X: Field{[10]uint32{0x021da9ff, 0x0203c439, 0x02fe981a, 0x0020d7a7, 0x031fb2be, 0x02d2353d, 0x00165640, 0x02200384, 0x0030197a, 0x002c6621}}, Y: Field{[10]uint32{0x01d849b9, 0x01a36393, 0x00bdf44a, 0x01057b1c, 0x000e515a, 0x01b85068, 0x027ace58, 0x004b496f, 0x024dea7d, 0x003571e1}}}, + {X: Field{[10]uint32{0x0127fedb, 0x0110d383, 0x02d4d109, 0x02ba50bd, 0x0246985a, 0x02db24ea, 0x01c1db82, 0x016e12f5, 0x02a7529d, 0x00056dce}}, Y: Field{[10]uint32{0x02721f89, 0x036af23b, 0x02262075, 0x037bcbf2, 0x00632ac6, 0x00728f50, 0x0011259b, 0x0344f108, 0x02a2bc8a, 0x000a5f8c}}}, + {X: Field{[10]uint32{0x0197d40f, 0x01de0b1f, 0x00f3f57f, 0x01e85b34, 0x038e35cc, 0x005b948f, 0x01926301, 0x007ec596, 0x02e0443c, 0x000ce69d}}, Y: Field{[10]uint32{0x01fe9659, 0x02f5dcf3, 0x02a229e5, 0x01af104e, 0x03914f0f, 0x00ed4b9b, 0x02756201, 0x01e130cf, 0x012efecd, 0x00226419}}}, + {X: Field{[10]uint32{0x027adfef, 0x02d460ed, 0x0251bf64, 0x038613d3, 0x03b1c535, 0x02c24112, 0x018312e9, 0x0376ae51, 0x00fffb80, 0x002fbc9b}}, Y: Field{[10]uint32{0x0137490b, 0x02f79167, 0x03bb5ba1, 0x03c859d6, 0x012c6943, 0x016cc43d, 0x0320518c, 0x01aa0d63, 0x029aef07, 0x000e0624}}}, + {X: Field{[10]uint32{0x00b2427e, 0x036490c2, 0x01894c71, 0x02188c49, 0x003dd40d, 0x013e46c2, 0x00dae108, 0x0309cd3d, 0x00818daf, 0x0033715b}}, Y: Field{[10]uint32{0x03503cca, 0x0041fc07, 0x02c71f07, 0x00d4fd61, 0x01b43769, 0x0155e7e4, 0x01425694, 0x00a2d511, 0x009de9c8, 0x0003d2cc}}}, + {X: Field{[10]uint32{0x0175bc6d, 0x0148039f, 0x01911cd6, 0x0298a9dd, 0x03a09312, 0x0258717e, 0x01be80a1, 0x0211e7b2, 0x0281b1f3, 0x000f77bf}}, Y: Field{[10]uint32{0x02df055d, 0x0160d615, 0x015d3a1e, 0x01442a7a, 0x027c7e2d, 0x02a001f4, 0x03fae4eb, 0x02d1e53b, 0x02dd1eb9, 0x001d760f}}}, + {X: Field{[10]uint32{0x00576826, 0x00e41044, 0x0399e763, 0x03498eab, 0x02a18879, 0x02484b3c, 0x02bae125, 0x00b2f130, 0x03769903, 0x00369f19}}, Y: Field{[10]uint32{0x00553f08, 0x02ba7cce, 0x031d0c07, 0x00f0fc72, 0x024314cc, 0x03a01a63, 0x031f7799, 0x03116e61, 0x0188360a, 0x000b9e9b}}}, + {X: Field{[10]uint32{0x0280d927, 0x02aa446a, 0x003859df, 0x0312b870, 0x02b8aba4, 0x01fd1556, 0x00faa801, 0x00831623, 0x0035e0bc, 0x0009846d}}, Y: Field{[10]uint32{0x014508d4, 0x0032b4df, 0x01b417ce, 0x03490a79, 0x00e47549, 0x0014a7eb, 0x01ff8c1c, 0x03141119, 0x001ae51d, 0x003ad63e}}}, + {X: Field{[10]uint32{0x03962961, 0x03fb1ed9, 0x027bc3de, 0x0025a516, 0x020b8f4c, 0x001adc75, 0x015aa088, 0x01f12a9c, 0x014836f0, 0x002c3ef9}}, Y: Field{[10]uint32{0x03e5abe0, 0x020694e0, 0x010de2a8, 0x02c117b9, 0x021c1749, 0x0378c328, 0x018668fe, 0x01d13431, 0x022466e7, 0x00331828}}}, + {X: Field{[10]uint32{0x01020581, 0x02ed27b2, 0x01a9eb50, 0x03ad7b7b, 0x0277d371, 0x01180f21, 0x00b7688b, 0x03b9d7eb, 0x036fdc51, 0x000680cc}}, Y: Field{[10]uint32{0x00daa7d7, 0x01c57926, 0x0218ce9f, 0x01166f9f, 0x03bd5071, 0x02b3f6f1, 0x0055fc36, 0x03b7e266, 0x030309c0, 0x000ff3c6}}}, + {X: Field{[10]uint32{0x00c159ed, 0x03b9cbde, 0x013c3810, 0x02492793, 0x020cf728, 0x00bda28d, 0x0049b20f, 0x024556aa, 0x0215c834, 0x001d8e84}}, Y: Field{[10]uint32{0x00482684, 0x03797996, 0x0390bd7d, 0x031a7ff4, 0x037b68d5, 0x007cbc89, 0x0395fbad, 0x0387b685, 0x021ccf30, 0x000de09a}}}, + {X: Field{[10]uint32{0x02da4edd, 0x00b09f72, 0x01eff63f, 0x03617e81, 0x00f7e664, 0x01bc0623, 0x020a586a, 0x00f8df73, 0x00c23018, 0x001ff1ed}}, Y: Field{[10]uint32{0x03ed6a8f, 0x0057244a, 0x03f50ac4, 0x03ebf915, 0x036338d2, 0x02af9ef3, 0x02493430, 0x02681bc1, 0x000e6ea8, 0x003f5e9e}}}, + {X: Field{[10]uint32{0x0065ddd8, 0x00984d77, 0x008d7747, 0x03f3c05b, 0x03dc543b, 0x01049623, 0x01eb7d70, 0x01bd5436, 0x03c9b068, 0x00088a01}}, Y: Field{[10]uint32{0x016cc2ab, 0x0255ec29, 0x0098b43d, 0x02d0c072, 0x029a34b2, 0x0064e4f6, 0x036d1553, 0x008bbf2c, 0x0102456c, 0x002e59c2}}}, + {X: Field{[10]uint32{0x005fda77, 0x00627c3f, 0x01603ed0, 0x01182aff, 0x02db6363, 0x028134f1, 0x0233f69c, 0x0341b9b2, 0x033698d8, 0x001e763a}}, Y: Field{[10]uint32{0x03d955f1, 0x009945c8, 0x02b28f13, 0x02789b5e, 0x02931fd4, 0x00676d48, 0x011d460e, 0x00d2a637, 0x03e11b02, 0x002fff25}}}, + {X: Field{[10]uint32{0x03add34b, 0x013449fa, 0x01dc5d46, 0x01aab223, 0x031f801a, 0x037b3db8, 0x02b77130, 0x0386db56, 0x02188e72, 0x00288d99}}, Y: Field{[10]uint32{0x03d60ed1, 0x00daaf9d, 0x03aebb17, 0x0321464f, 0x0070e99a, 0x00543fec, 0x034cd1cd, 0x00644c9d, 0x0236f3e7, 0x003bc8f6}}}, + {X: Field{[10]uint32{0x01dd9612, 0x03f06ed2, 0x013be480, 0x02cfe87c, 0x01b1fcbd, 0x00fe91a9, 0x023e8e74, 0x0205b644, 0x004ddde6, 0x002daeb4}}, Y: Field{[10]uint32{0x02a4e511, 0x02c0402d, 0x035467f1, 0x001f6566, 0x01850c65, 0x0116e02c, 0x00b7f346, 0x02c9ce9a, 0x0209a290, 0x001617eb}}}, + {X: Field{[10]uint32{0x00c3dfbd, 0x007874bd, 0x03aceb49, 0x0163cf5b, 0x0133fcbd, 0x02ed4063, 0x03113db8, 0x039c54a0, 0x00253353, 0x000afc87}}, Y: Field{[10]uint32{0x038d896e, 0x03113273, 0x033ef569, 0x03628356, 0x03b9fec4, 0x00e91ec1, 0x00491214, 0x01356f23, 0x03a74e8a, 0x0038e80c}}}, + {X: Field{[10]uint32{0x01842744, 0x03777497, 0x02dda358, 0x0099a817, 0x0041e9ad, 0x01c4247d, 0x03f3a90e, 0x038d7418, 0x0241e978, 0x0019309e}}, Y: Field{[10]uint32{0x01ae32d1, 0x0304ce4f, 0x03d27521, 0x0008ed49, 0x02bed768, 0x03f99f05, 0x00aac9ec, 0x029a5662, 0x025e08fd, 0x003f2ed8}}}, + {X: Field{[10]uint32{0x0081a58d, 0x010b4ad9, 0x03399b75, 0x02b680be, 0x00af62ac, 0x018f35f2, 0x00ef4350, 0x016d7a69, 0x02f6fdfe, 0x00188287}}, Y: Field{[10]uint32{0x01b8054f, 0x030c16b7, 0x01ae57be, 0x0317b209, 0x03a45fa7, 0x0151f880, 0x007f105c, 0x024e9be8, 0x023c5503, 0x002c2de7}}}, + {X: Field{[10]uint32{0x007b95cd, 0x01d19d4c, 0x038a1ecd, 0x014681af, 0x0215e712, 0x0093b831, 0x03ef68b4, 0x01c550d1, 0x01317cef, 0x000548fc}}, Y: Field{[10]uint32{0x00743b1d, 0x0145bffc, 0x02612bf5, 0x03154f70, 0x00a55806, 0x03c4796d, 0x01fe67a3, 0x03599370, 0x00cc1d8a, 0x0031c955}}}, + {X: Field{[10]uint32{0x02ea0cfd, 0x035ca513, 0x03700f66, 0x00f02dd4, 0x01b43f76, 0x0335cff3, 0x00d4d8c2, 0x021e5300, 0x003c0a9c, 0x0035d94c}}, Y: Field{[10]uint32{0x03bc267b, 0x0180f495, 0x02623781, 0x008ab806, 0x0035b4cd, 0x028c1937, 0x0217b73d, 0x035dea8e, 0x00a5204d, 0x002ebf2b}}}, + {X: Field{[10]uint32{0x00c468b6, 0x03c12b59, 0x01a8ea17, 0x01ed860e, 0x01ffbbf8, 0x00972f10, 0x0198759c, 0x03a59594, 0x021afafc, 0x0029d7ad}}, Y: Field{[10]uint32{0x01869873, 0x0125f659, 0x007b8041, 0x00859356, 0x03a8eba3, 0x029b5439, 0x0049b181, 0x0122a94f, 0x0093240f, 0x0026600a}}}, + {X: Field{[10]uint32{0x00e59f2a, 0x01381aef, 0x03cfa408, 0x01f6fac2, 0x01e7053f, 0x009079a4, 0x01813c71, 0x0246db09, 0x034cd0bb, 0x001fe906}}, Y: Field{[10]uint32{0x0184aec7, 0x020ec738, 0x0209f7e5, 0x00b0012a, 0x039431e2, 0x03da8b15, 0x017e7e20, 0x01a57e0c, 0x0379755a, 0x00282505}}}, + {X: Field{[10]uint32{0x02e4dbf5, 0x0333fd85, 0x03d6fcc5, 0x03ef6082, 0x033bfa1b, 0x02b889db, 0x01eb4408, 0x03c4ab63, 0x01b72240, 0x00205b03}}, Y: Field{[10]uint32{0x037e52d0, 0x0059810f, 0x02c9f67c, 0x0342a606, 0x02e57acb, 0x03dc0957, 0x009dd4bb, 0x03996251, 0x013dd91e, 0x000a94b2}}}, + {X: Field{[10]uint32{0x023414f8, 0x03725430, 0x0380fbb7, 0x021ec305, 0x00ddbb3d, 0x011a4178, 0x0390ac73, 0x00509544, 0x01f1317f, 0x000cfd8d}}, Y: Field{[10]uint32{0x014bfbcb, 0x01a950f9, 0x013bdb62, 0x02000afe, 0x01151235, 0x02f0acb0, 0x034d570b, 0x006622e5, 0x015584eb, 0x001d0d68}}}, + {X: Field{[10]uint32{0x0251999c, 0x02fb11a8, 0x00eb3e94, 0x0079ed78, 0x030bdfe1, 0x02f10e29, 0x0307185f, 0x02ec0cd4, 0x02d704b0, 0x0034a50e}}, Y: Field{[10]uint32{0x036d577e, 0x02925059, 0x0006f19a, 0x01aceffb, 0x00b6097d, 0x03fdba7f, 0x01e41def, 0x028c53af, 0x03cf19aa, 0x000b72a3}}}, + {X: Field{[10]uint32{0x01fb1da6, 0x00494967, 0x01516b01, 0x01970434, 0x00fb524b, 0x01791283, 0x0054390b, 0x01d69bfb, 0x03bfc543, 0x0009aa87}}, Y: Field{[10]uint32{0x01a91b02, 0x009380e6, 0x03a2fd4b, 0x01bc02af, 0x0083973c, 0x039fa066, 0x037d0b6e, 0x01d7380c, 0x02a604c5, 0x00127b3a}}}, + {X: Field{[10]uint32{0x03d28d20, 0x02d633e9, 0x000cd65e, 0x01f7a08c, 0x02ab1871, 0x02523cbd, 0x026d7da1, 0x0280c172, 0x001af866, 0x001e02bb}}, Y: Field{[10]uint32{0x0008b91a, 0x03ca5e2f, 0x0392992c, 0x000862ab, 0x02414b3a, 0x001edbde, 0x0075b6d1, 0x00387aa4, 0x0041e45a, 0x00369940}}}, + {X: Field{[10]uint32{0x00b88b67, 0x035b540b, 0x03b3d5ee, 0x00fca7fd, 0x01ef9811, 0x00f31079, 0x0115853b, 0x037528f9, 0x02598e59, 0x000773fc}}, Y: Field{[10]uint32{0x02b77271, 0x02005c86, 0x012f28c6, 0x02faa6ae, 0x03aed86c, 0x00e0db81, 0x014307ae, 0x01c79159, 0x02307c68, 0x0035e5e1}}}, + {X: Field{[10]uint32{0x033ff70d, 0x0223b90d, 0x00b01e24, 0x00ea736d, 0x038f336f, 0x03b38718, 0x02367eb5, 0x0064de4f, 0x00a27732, 0x002c66bd}}, Y: Field{[10]uint32{0x00821dec, 0x01357de7, 0x0241dc21, 0x0337553d, 0x03b9e73f, 0x01aa3b9c, 0x037f27a2, 0x0168b509, 0x0039a510, 0x0028faa2}}}, + {X: Field{[10]uint32{0x00f6755e, 0x01e0bdad, 0x02066acf, 0x00b69223, 0x0235f24e, 0x024c925c, 0x00b6126b, 0x0277dbca, 0x0329548a, 0x00072307}}, Y: Field{[10]uint32{0x01ff432d, 0x017be584, 0x030c9179, 0x008ea198, 0x0278108b, 0x0065a81f, 0x00c7e2a3, 0x006bb173, 0x03526a1e, 0x00069e6a}}}, + {X: Field{[10]uint32{0x015716ce, 0x00454faf, 0x021d4f0b, 0x01d44b10, 0x00e4d700, 0x010c4e5a, 0x00a10b7b, 0x030f08f2, 0x01da1ad6, 0x002dbfe3}}, Y: Field{[10]uint32{0x01ce61b8, 0x00c1be69, 0x0232d7c9, 0x030aaa1e, 0x00af8dbe, 0x036cf807, 0x00d21e4e, 0x01059f28, 0x01c6b7b7, 0x00134e1a}}}, + {X: Field{[10]uint32{0x00f47b5c, 0x012233b4, 0x02ccb375, 0x02760c39, 0x00ec08cf, 0x03e82b58, 0x00219329, 0x02a12a06, 0x00acf61b, 0x00373bfd}}, Y: Field{[10]uint32{0x0137d6f9, 0x029bad70, 0x013b1736, 0x02c0e158, 0x00fb1b8d, 0x029292aa, 0x03d5508a, 0x0186d220, 0x00e192bc, 0x002526bb}}}, + {X: Field{[10]uint32{0x00a5ebef, 0x03bacdf7, 0x01c8b131, 0x0262fa14, 0x01843ccf, 0x028f3a10, 0x004aa189, 0x01a2725f, 0x03a7b709, 0x00155879}}, Y: Field{[10]uint32{0x019a14da, 0x007c56ea, 0x015a709a, 0x029b9977, 0x0233b924, 0x01ad0528, 0x00e6b7f2, 0x02f8d90c, 0x0017f298, 0x0012c423}}}, + {X: Field{[10]uint32{0x0395a257, 0x003265e8, 0x008027ca, 0x01516cf2, 0x019c56a2, 0x038193a7, 0x025d5bb2, 0x00565423, 0x017789b0, 0x00136625}}, Y: Field{[10]uint32{0x00b6e0d0, 0x007c8850, 0x02675795, 0x03396dc1, 0x00506964, 0x016c0271, 0x03200c9f, 0x001d5b16, 0x0333ac95, 0x002abaeb}}}, + {X: Field{[10]uint32{0x033bfc8e, 0x01a84bf8, 0x03668124, 0x00befd2b, 0x00e9da51, 0x019b3201, 0x02d55a9d, 0x00f12cc2, 0x026e0637, 0x0020ad63}}, Y: Field{[10]uint32{0x025ffb38, 0x03011e06, 0x013d387c, 0x01f4bfcd, 0x01d6d757, 0x03fd310a, 0x033b5c21, 0x0078dcb0, 0x022d98dc, 0x0020de04}}}, + {X: Field{[10]uint32{0x02c6cdf3, 0x0266fa00, 0x0063ad11, 0x01d4d9a5, 0x03714c3d, 0x03beb113, 0x017d8809, 0x01e12ff9, 0x008aa773, 0x003d27ea}}, Y: Field{[10]uint32{0x0218b3f4, 0x02a8e7e6, 0x00772b96, 0x02c12608, 0x02aa9855, 0x024d20ef, 0x03e72814, 0x02904722, 0x02c02164, 0x00106bfd}}}, + {X: Field{[10]uint32{0x00efd78c, 0x031633b0, 0x03073969, 0x03c035e2, 0x010ce910, 0x030614a9, 0x01b97a78, 0x01168630, 0x01dbac84, 0x0019f521}}, Y: Field{[10]uint32{0x00981e97, 0x01bcc821, 0x034be44e, 0x02e73c67, 0x01596f49, 0x022fc1f6, 0x00aa5a82, 0x00acc57f, 0x012a24ff, 0x001c776a}}}, + {X: Field{[10]uint32{0x0304d4cd, 0x02a58411, 0x0350adb2, 0x01fa2d74, 0x0030a46f, 0x0169c5d8, 0x0399883b, 0x00e30f3f, 0x02f2c190, 0x0024517d}}, Y: Field{[10]uint32{0x0222b0bc, 0x00036f9a, 0x00add567, 0x00aedb9e, 0x036c8e42, 0x035de2ce, 0x00664d54, 0x0317f875, 0x01e7852a, 0x0027645e}}}, + {X: Field{[10]uint32{0x02b2631b, 0x00f88fd1, 0x024b3550, 0x02260237, 0x01536740, 0x001c66af, 0x033848ce, 0x03d7c473, 0x0247efc2, 0x00124b54}}, Y: Field{[10]uint32{0x008fd750, 0x02e31020, 0x00863d50, 0x002ca49c, 0x009f021d, 0x02656935, 0x0168877c, 0x032261fb, 0x03627812, 0x000dd2c1}}}, + {X: Field{[10]uint32{0x03dd1dec, 0x02072985, 0x035490a3, 0x002d1861, 0x0125c661, 0x00af6e71, 0x018d2317, 0x0059e24a, 0x03b8bb81, 0x0016e377}}, Y: Field{[10]uint32{0x031f7568, 0x028d4c5e, 0x031cea92, 0x0030fa20, 0x03c7ae17, 0x00cf53ce, 0x010dee01, 0x0086345f, 0x0364fce3, 0x002d1f4d}}}, + {X: Field{[10]uint32{0x02406c65, 0x0174c3c3, 0x02c5c6a3, 0x03af6847, 0x00063c6f, 0x035531b5, 0x01e603cc, 0x005906bd, 0x03ba25a6, 0x002236dc}}, Y: Field{[10]uint32{0x0000a753, 0x01efc6d2, 0x0056b402, 0x03843051, 0x009b8b5b, 0x00a57e30, 0x004c67ae, 0x035edc22, 0x037b1c1d, 0x000e6c1b}}}, + {X: Field{[10]uint32{0x00382451, 0x020246a7, 0x03721fb3, 0x02f78cc3, 0x032a7037, 0x02c25558, 0x0185070b, 0x007ad0b3, 0x009aa23c, 0x000d2573}}, Y: Field{[10]uint32{0x029799ef, 0x00f843ed, 0x0064dd9b, 0x013d18bf, 0x030b82ff, 0x031d55ef, 0x00299573, 0x020b7dd1, 0x03216f39, 0x001ffaae}}}, + {X: Field{[10]uint32{0x0045d7a2, 0x026994b1, 0x034f1cd6, 0x014b0676, 0x010a4f7b, 0x0348c26c, 0x03756669, 0x00431e4f, 0x02a6970e, 0x003a2973}}, Y: Field{[10]uint32{0x02402b96, 0x007c3a8c, 0x01982b96, 0x0090a536, 0x02fab476, 0x01a3a305, 0x012dbf36, 0x0166ee5b, 0x02bfbd52, 0x0036ab36}}}, + {X: Field{[10]uint32{0x03931f9a, 0x0002d0d9, 0x02e32b57, 0x03cacacb, 0x0051af33, 0x0367bf94, 0x009c4837, 0x01eb78e6, 0x038ae81a, 0x0001ba31}}, Y: Field{[10]uint32{0x00291d35, 0x038a5d4b, 0x029ca47b, 0x024cc375, 0x027d1d51, 0x038429e0, 0x035412cb, 0x01068516, 0x0104751b, 0x00395991}}}, + {X: Field{[10]uint32{0x010a539e, 0x0345c24c, 0x01208ab4, 0x02ddd137, 0x00b9551d, 0x038ea4bb, 0x011722b1, 0x016cbe0a, 0x00a3010c, 0x002e3d48}}, Y: Field{[10]uint32{0x030f3d75, 0x02474025, 0x007909e2, 0x007b641d, 0x03a96d3d, 0x0245444f, 0x026451e1, 0x00b7b63d, 0x003ab671, 0x00196407}}}, + {X: Field{[10]uint32{0x02d8005a, 0x037b02ec, 0x00adfe49, 0x029f2e01, 0x00ae0dea, 0x028b05bf, 0x00bd9173, 0x02605622, 0x00586445, 0x002814e1}}, Y: Field{[10]uint32{0x020d7a67, 0x02329b77, 0x029c8ca5, 0x022cf581, 0x03e71260, 0x02624974, 0x00dab73f, 0x0327ee24, 0x030023dc, 0x0009e20b}}}, + {X: Field{[10]uint32{0x01222144, 0x03e28145, 0x036001fa, 0x000e704b, 0x022117cf, 0x030a566f, 0x018b631f, 0x0024907b, 0x0016aa7f, 0x00104a01}}, Y: Field{[10]uint32{0x037f58e4, 0x0205ec6b, 0x038e1808, 0x0138cabb, 0x02613f35, 0x010fdf81, 0x015c363c, 0x0210cfb9, 0x000dfd8e, 0x0030bfbe}}}, + {X: Field{[10]uint32{0x00c7a1ee, 0x023e2a86, 0x0241a7dd, 0x003ac142, 0x028b536f, 0x00f584ec, 0x01130b7e, 0x00f44147, 0x0336cbf8, 0x00312e3f}}, Y: Field{[10]uint32{0x027b4d47, 0x0359fb17, 0x037fc276, 0x0052b525, 0x01f6cf6c, 0x01d448e6, 0x02ba76b4, 0x00cded19, 0x004c8867, 0x0021f4f1}}}, + {X: Field{[10]uint32{0x00a51ac1, 0x029fd6a8, 0x002a93b7, 0x02e61b68, 0x031de630, 0x02df3495, 0x03850106, 0x00e38e9a, 0x013a7cb9, 0x00103ada}}, Y: Field{[10]uint32{0x036d8d18, 0x038db0eb, 0x0389fa51, 0x0293bea7, 0x01c7ede7, 0x0132e201, 0x003b770c, 0x0105f72f, 0x01e014d3, 0x0009ee1d}}}, + {X: Field{[10]uint32{0x0381dad4, 0x012a6f5f, 0x01fb86e9, 0x02137cdc, 0x00ac0c9d, 0x03cb77c9, 0x0365d675, 0x000601d4, 0x010254e3, 0x003dd246}}, Y: Field{[10]uint32{0x005a6e46, 0x03093357, 0x00c7c17a, 0x031cbb1a, 0x0268af0c, 0x0349d758, 0x01bf1b5a, 0x00203f72, 0x0336c549, 0x001a89c6}}}, + {X: Field{[10]uint32{0x009f287e, 0x014c9521, 0x032e36a0, 0x02b30d93, 0x02f16388, 0x01e88fe3, 0x026996c9, 0x00676853, 0x021de4ce, 0x0033c4c9}}, Y: Field{[10]uint32{0x03adac10, 0x002a5a1c, 0x02b7c04a, 0x020f1dc6, 0x008218c4, 0x02e1ca9e, 0x024ab51b, 0x01d11fdf, 0x018dbe1a, 0x00155a21}}}, + {X: Field{[10]uint32{0x013e8cb3, 0x00f1d86b, 0x02a81726, 0x005dcb1c, 0x0394cfd5, 0x00889a11, 0x01166066, 0x021f7f55, 0x02629dd0, 0x00271af6}}, Y: Field{[10]uint32{0x010c0eb3, 0x006d9e80, 0x030be05b, 0x0317896e, 0x019e5fbc, 0x018bff1e, 0x035628ed, 0x0329faec, 0x007b9c7f, 0x000b1df7}}}, + {X: Field{[10]uint32{0x01d26bf3, 0x02adf96e, 0x01922bb7, 0x01ef456c, 0x01c1526d, 0x02cc5256, 0x02cc9a55, 0x0277b083, 0x035f6443, 0x00363440}}, Y: Field{[10]uint32{0x00dbbe30, 0x006e5233, 0x003143eb, 0x00dae72d, 0x03b922a4, 0x02506efd, 0x007f697b, 0x03fa8fd8, 0x00d6ccfd, 0x002adf8d}}}, + {X: Field{[10]uint32{0x01c1d424, 0x02f08a34, 0x022a939c, 0x0296c028, 0x037d53ae, 0x00203c21, 0x032e1047, 0x01e98378, 0x0223b822, 0x0031bd02}}, Y: Field{[10]uint32{0x01d80345, 0x01af42f0, 0x0064d7fe, 0x01af96a3, 0x0263a313, 0x022c8dd2, 0x006f1f4b, 0x02317244, 0x018fcf4b, 0x00385af1}}}, + {X: Field{[10]uint32{0x03a43536, 0x0002e3d8, 0x02509494, 0x03358748, 0x01d1e007, 0x03388b78, 0x007c2dec, 0x034e95c5, 0x02229477, 0x000e9a76}}, Y: Field{[10]uint32{0x01a0e284, 0x030bef92, 0x03c3925c, 0x035ce272, 0x0246b98c, 0x026de73e, 0x00c95e1c, 0x01818b1f, 0x03d5c4ba, 0x0031e713}}}, + {X: Field{[10]uint32{0x0325fc9d, 0x01ede500, 0x0339b7bc, 0x020a42a8, 0x00814c3d, 0x01963c86, 0x037f6fca, 0x0312291a, 0x00e5492f, 0x0006d7ee}}, Y: Field{[10]uint32{0x007fff39, 0x01bef9f7, 0x02982164, 0x00d63bfa, 0x01d2ca42, 0x0124d6c0, 0x02f49f4c, 0x002064ad, 0x03124c9e, 0x00298a42}}}, + {X: Field{[10]uint32{0x009a3845, 0x02fa3b0d, 0x014c747b, 0x0088c7c1, 0x028a7559, 0x0069fe9f, 0x01e1c37d, 0x02d3ab72, 0x0302b004, 0x003f6e83}}, Y: Field{[10]uint32{0x011646fe, 0x0208088e, 0x0262ae2b, 0x02775cb5, 0x0106c3c0, 0x00c310f2, 0x02defd7e, 0x01c709bf, 0x01c9e964, 0x0010b698}}}, + {X: Field{[10]uint32{0x035140df, 0x03c32ce8, 0x01760f38, 0x010cbebc, 0x007c1663, 0x018ce262, 0x03279f70, 0x02598af9, 0x01bfcb7b, 0x0030e4e4}}, Y: Field{[10]uint32{0x02f556e1, 0x02d58f26, 0x02d664c5, 0x02075e94, 0x03449f9f, 0x03de7606, 0x00b8b3ff, 0x020b3121, 0x003453dc, 0x003a8538}}}, + {X: Field{[10]uint32{0x0059cbcb, 0x0385d102, 0x01321675, 0x00280886, 0x0019aedd, 0x01b2c831, 0x000e36cc, 0x032ca86b, 0x013dc716, 0x000953fc}}, Y: Field{[10]uint32{0x02e35921, 0x002b4ae4, 0x03701c40, 0x033e0fac, 0x00896e02, 0x011fd6fa, 0x036bfe32, 0x009abe78, 0x00f3916d, 0x00009913}}}, + {X: Field{[10]uint32{0x00930474, 0x0327d5ca, 0x00c5b071, 0x0176a9f2, 0x021769d3, 0x0215a009, 0x008974e9, 0x0192b68b, 0x0260e9b4, 0x0009392a}}, Y: Field{[10]uint32{0x00479f8e, 0x01cd4e3a, 0x02af78d9, 0x00e3672e, 0x036ed37c, 0x0332501b, 0x022244bc, 0x013f8202, 0x02d182a9, 0x00277df0}}}, + {X: Field{[10]uint32{0x017543a6, 0x00b13db4, 0x01ef8070, 0x03062ffc, 0x02fb19a4, 0x01667f00, 0x03d81b38, 0x01a170fb, 0x03adf906, 0x001eb66e}}, Y: Field{[10]uint32{0x01246f95, 0x02ab5931, 0x02df0133, 0x010d1249, 0x00da45e2, 0x02294cf7, 0x013ac8fd, 0x006293dc, 0x01709c40, 0x00261e2e}}}, + {X: Field{[10]uint32{0x02d8ae53, 0x00495958, 0x022b501d, 0x00e6f97e, 0x00c6e083, 0x01f7eeaa, 0x009eb2df, 0x021c5f83, 0x00d9383a, 0x0025f63f}}, Y: Field{[10]uint32{0x03c6a777, 0x0300a3c1, 0x0074c4a2, 0x0329fe3d, 0x03b1f114, 0x03616be9, 0x00363e15, 0x013e19fe, 0x024cf578, 0x00061e72}}}, + {X: Field{[10]uint32{0x02fe7572, 0x01c77762, 0x0172cb87, 0x03bd417b, 0x002af1ac, 0x0315bfeb, 0x014d1a92, 0x030cb878, 0x03855a08, 0x000f83f1}}, Y: Field{[10]uint32{0x02149390, 0x0396c25b, 0x020b5884, 0x03cf7c56, 0x01bb1768, 0x028c2d55, 0x0044fc9d, 0x022253c2, 0x03fcfd1e, 0x001b5e6d}}}, + {X: Field{[10]uint32{0x01602562, 0x01fb3ed9, 0x037ec55b, 0x039ff1d5, 0x02fda483, 0x02275bd7, 0x023a9b53, 0x03619076, 0x03dbb132, 0x00367685}}, Y: Field{[10]uint32{0x0223b70b, 0x03e318f1, 0x001a7b67, 0x017a2821, 0x0033a4f3, 0x03e3c8ec, 0x027f9e63, 0x0035c0bb, 0x01e45feb, 0x0020391c}}}, + {X: Field{[10]uint32{0x03ca18f3, 0x026026db, 0x039eca3d, 0x014e75be, 0x03f38e28, 0x02dc484a, 0x0135daa7, 0x0078d20a, 0x0366afcd, 0x0006123d}}, Y: Field{[10]uint32{0x036f5884, 0x003d1342, 0x00b7dee7, 0x03d2a4f5, 0x005f9196, 0x01d23b65, 0x0135df63, 0x0153c927, 0x0082645d, 0x0032a69e}}}, + {X: Field{[10]uint32{0x017a9f2f, 0x02728112, 0x02be0a84, 0x011fdcb1, 0x031a9d00, 0x03f0b457, 0x0165b2d4, 0x02b1d96b, 0x00ae9a7d, 0x003b4dd1}}, Y: Field{[10]uint32{0x02b5fb5b, 0x00d113da, 0x02f36b76, 0x0121c19b, 0x032fdc52, 0x00f11dfb, 0x0323d032, 0x031bdf92, 0x012ed4e5, 0x000f3ddb}}}, + {X: Field{[10]uint32{0x033676d7, 0x033fbf97, 0x026b7b1c, 0x0332a188, 0x0391212a, 0x000c49c1, 0x00a3a65e, 0x01516ac4, 0x0373edf3, 0x0031181e}}, Y: Field{[10]uint32{0x017eb3ec, 0x010824cf, 0x02d7728c, 0x02711771, 0x012628ac, 0x008c38f7, 0x000cd036, 0x03de0f57, 0x025b8595, 0x000c6b51}}}, + {X: Field{[10]uint32{0x000e96f0, 0x0392c2af, 0x00699641, 0x006d93ac, 0x00bfb9ad, 0x00e8fe94, 0x020af049, 0x01a75e2c, 0x02ed2aaf, 0x00070258}}, Y: Field{[10]uint32{0x01aede44, 0x015a92ab, 0x0012302d, 0x01828e5f, 0x02591b5a, 0x021e9fda, 0x029c5b0a, 0x038e8a90, 0x02f6e088, 0x00127c46}}}, + {X: Field{[10]uint32{0x01c19454, 0x02682637, 0x0045b1f0, 0x006ab989, 0x0182250e, 0x02ded0e0, 0x00dc6caf, 0x02567826, 0x036c9a41, 0x0001a811}}, Y: Field{[10]uint32{0x0111c7e1, 0x014bb1bd, 0x0233fbe5, 0x02e7331f, 0x00ab4288, 0x03238d45, 0x0266cd37, 0x031324b0, 0x00978ae3, 0x0015a10b}}}, + {X: Field{[10]uint32{0x00191f1c, 0x019e0c28, 0x028f6b93, 0x0203a729, 0x02cdb59a, 0x00a7c0f1, 0x03149993, 0x002a829a, 0x00f653a3, 0x00009368}}, Y: Field{[10]uint32{0x00138235, 0x00b1d5cb, 0x00b53d1a, 0x01a67880, 0x00cdbd3b, 0x00187185, 0x010683af, 0x02f3d6e0, 0x0080aa78, 0x0020f9e4}}}, + {X: Field{[10]uint32{0x021a7764, 0x00dd0fe6, 0x0075f6f3, 0x023c089f, 0x02a07872, 0x00c99100, 0x00719010, 0x02741fd6, 0x00832247, 0x00001b0d}}, Y: Field{[10]uint32{0x00dcc4c6, 0x024b02e8, 0x01bffeb1, 0x0043c361, 0x00be7792, 0x016f6916, 0x03128d84, 0x015021af, 0x03744a12, 0x0028ddeb}}}, + {X: Field{[10]uint32{0x01c43baf, 0x01e3e675, 0x00905154, 0x03d28525, 0x011cdc26, 0x020acdb8, 0x02cf2498, 0x032c9ac9, 0x03bb4d14, 0x00084aaa}}, Y: Field{[10]uint32{0x0047e281, 0x0358140e, 0x01148ca1, 0x028ff099, 0x0011c22e, 0x02ea3961, 0x02ed57d7, 0x0160ae63, 0x020a81d1, 0x003a4502}}}, + {X: Field{[10]uint32{0x0343b10e, 0x005096ac, 0x011edf37, 0x031092a5, 0x02f26ee0, 0x02c2e89c, 0x006824e5, 0x02882a35, 0x00f12afc, 0x00289d1e}}, Y: Field{[10]uint32{0x004036a3, 0x020292ef, 0x017598ec, 0x028df1f3, 0x0270ad0b, 0x01e0635e, 0x03bdecb6, 0x025ea968, 0x0386a7fc, 0x001479d2}}}, + {X: Field{[10]uint32{0x0172e293, 0x03dc4681, 0x03fe5716, 0x001fa336, 0x02b9b8a5, 0x03d57838, 0x022fa7e8, 0x03e7ae8b, 0x029a7171, 0x00387049}}, Y: Field{[10]uint32{0x02afba46, 0x024cd70c, 0x00848e63, 0x029db40d, 0x005562c4, 0x03a09da1, 0x00d8e242, 0x00c90be6, 0x01700895, 0x001073e8}}}, + {X: Field{[10]uint32{0x01e09efb, 0x0209f03d, 0x007804d5, 0x022c9082, 0x0062f0f7, 0x03303ef6, 0x03328e1e, 0x0238642e, 0x004c1941, 0x00081355}}, Y: Field{[10]uint32{0x03d52fb7, 0x015c1664, 0x009f06d0, 0x03514d39, 0x0018cf4e, 0x013e6030, 0x023799cb, 0x00561c42, 0x00e31f5d, 0x00319826}}}, + {X: Field{[10]uint32{0x025172ad, 0x0121b15e, 0x016ee361, 0x02c8eac6, 0x00980138, 0x01e2d33c, 0x0230de2f, 0x03cbcb7c, 0x030a11a6, 0x0005bb77}}, Y: Field{[10]uint32{0x01992684, 0x028338ad, 0x0318bb39, 0x02d3ee05, 0x001327bd, 0x0040b108, 0x004a7926, 0x02cf0648, 0x018fed8a, 0x0038f6cd}}}, + {X: Field{[10]uint32{0x038995f1, 0x020a74ca, 0x0080eaf6, 0x0069e72c, 0x013df700, 0x008c54de, 0x026b7c10, 0x0365ad97, 0x00312298, 0x001f27de}}, Y: Field{[10]uint32{0x01f51e5c, 0x006551bb, 0x000e4a60, 0x0346eedc, 0x02b2481d, 0x014f2ccb, 0x002018fc, 0x0283c6c9, 0x003c90e3, 0x00080df3}}}, + {X: Field{[10]uint32{0x0198fb1c, 0x01a2c598, 0x02dee211, 0x03a54c31, 0x0263aee7, 0x00b5a580, 0x03913a5b, 0x02e3db06, 0x01461dbe, 0x0004a70b}}, Y: Field{[10]uint32{0x01137964, 0x02b097d5, 0x00dc1747, 0x02fdf3a8, 0x027bbd80, 0x00a1f559, 0x0214b72a, 0x009fe68a, 0x02b961c0, 0x000a7ffb}}}, + {X: Field{[10]uint32{0x036175aa, 0x02812707, 0x03b12570, 0x009f818c, 0x02de2049, 0x00c896d4, 0x011f9daa, 0x024cbbdb, 0x016530d4, 0x0022f8b9}}, Y: Field{[10]uint32{0x005510c8, 0x03060014, 0x0340423c, 0x02f5a9a1, 0x03fabfe4, 0x00f02547, 0x0007056e, 0x00334500, 0x02871a13, 0x000d92d3}}}, + {X: Field{[10]uint32{0x0252fa6c, 0x024265d8, 0x00c5e27c, 0x00b97e20, 0x0142a6e1, 0x014ed310, 0x00ceb624, 0x02719eac, 0x030842ae, 0x00102d0f}}, Y: Field{[10]uint32{0x02a2068f, 0x00a812f3, 0x02cca443, 0x03fb448f, 0x00248f11, 0x03168b4b, 0x025e46f2, 0x00b96ec8, 0x02c5de1b, 0x001b46b1}}}, + {X: Field{[10]uint32{0x02c669df, 0x011ce816, 0x00f17087, 0x026f8dc9, 0x014c2cba, 0x00f1276d, 0x01caa559, 0x0137cf3c, 0x038a02f3, 0x0011f888}}, Y: Field{[10]uint32{0x00f31f3a, 0x026fa0a7, 0x01908939, 0x009d8237, 0x00acfc61, 0x00294bdf, 0x02104a36, 0x00957fb2, 0x03a203ee, 0x00134133}}}, + {X: Field{[10]uint32{0x01cfc35a, 0x029727b8, 0x02d607c7, 0x012d77e3, 0x03b3de47, 0x01315975, 0x00433238, 0x031b6ad2, 0x00553a45, 0x0005ca1b}}, Y: Field{[10]uint32{0x0320007f, 0x01c8f258, 0x000cf6d8, 0x0091e4cd, 0x035b194d, 0x02550c41, 0x03104b27, 0x01454582, 0x034775a4, 0x00185cb4}}}, + {X: Field{[10]uint32{0x01d7bb31, 0x02c810a3, 0x01258b7f, 0x0325367b, 0x010a3e96, 0x0158cab1, 0x010bd344, 0x024b2b42, 0x039d3c14, 0x000d146b}}, Y: Field{[10]uint32{0x014974d6, 0x03e2d06c, 0x0079acc5, 0x004e49f3, 0x007687c5, 0x013068ec, 0x0284fd78, 0x01b81b9c, 0x03832123, 0x0037524c}}}, + {X: Field{[10]uint32{0x014e5ce2, 0x03409480, 0x01619d23, 0x00e96caa, 0x00ed9afa, 0x01b82b11, 0x01bee2da, 0x0179ff2d, 0x0081eccc, 0x002c02a9}}, Y: Field{[10]uint32{0x008866a1, 0x032a3efa, 0x022424a2, 0x02a79f9d, 0x0210d732, 0x0107e07e, 0x002ceb74, 0x00cb383d, 0x00861f00, 0x0001a1ed}}}, + {X: Field{[10]uint32{0x00b23311, 0x01571fa8, 0x01e2fa8a, 0x035301d8, 0x020ef706, 0x0135cd6c, 0x008a2393, 0x03247fc9, 0x029cc75b, 0x0014fb23}}, Y: Field{[10]uint32{0x01d45919, 0x00413d91, 0x027688b5, 0x012e7f60, 0x00c352f5, 0x0175716a, 0x01104e01, 0x02c7b46d, 0x03c063c4, 0x0006c477}}}, + {X: Field{[10]uint32{0x01efab66, 0x02461b29, 0x030a4cdc, 0x01e1eaed, 0x032fc80d, 0x01c78ce0, 0x03eddd8d, 0x00b268ec, 0x01b39c07, 0x0007b378}}, Y: Field{[10]uint32{0x026dd626, 0x02b82f2b, 0x025f30da, 0x00c25228, 0x00239f0c, 0x00812734, 0x00cecb18, 0x025d8adc, 0x02c75a79, 0x00013d6b}}}, + {X: Field{[10]uint32{0x03b1394e, 0x0321d526, 0x012e65af, 0x02759dc1, 0x011e9023, 0x02823be9, 0x039b479f, 0x015631ea, 0x03c3702b, 0x00007f8b}}, Y: Field{[10]uint32{0x02845c2c, 0x02f5c831, 0x0326d30f, 0x003229f6, 0x0211a64c, 0x01b523f9, 0x016df2b6, 0x0174eb08, 0x02ae3a39, 0x003dad61}}}, + {X: Field{[10]uint32{0x006d5dec, 0x01c62c78, 0x039ba872, 0x0314a296, 0x0376e64c, 0x03c0c71e, 0x02ba0c20, 0x00ab5560, 0x032fb8ac, 0x002d4f42}}, Y: Field{[10]uint32{0x02e3a289, 0x03c0d3a4, 0x0087b351, 0x01de51da, 0x02041015, 0x01f48c94, 0x03b034c1, 0x021ea992, 0x018951ab, 0x00226139}}}, + {X: Field{[10]uint32{0x0337cf95, 0x02b784a3, 0x02ea7bc0, 0x00428845, 0x01a06ca3, 0x03ccd760, 0x03fe5d81, 0x008d999c, 0x011603bc, 0x00001539}}, Y: Field{[10]uint32{0x0312bd4a, 0x00e9e05c, 0x030b4c5b, 0x01e92e64, 0x01923660, 0x03a05cd5, 0x037206d6, 0x00b0afc6, 0x00269deb, 0x003d1c72}}}, + {X: Field{[10]uint32{0x03b29a7b, 0x036ca0d9, 0x01f598c4, 0x02b19754, 0x013b8087, 0x0322eae4, 0x01e22244, 0x008e8b4e, 0x0372a1d4, 0x0039fbed}}, Y: Field{[10]uint32{0x03a9b6e7, 0x039171e4, 0x023bd587, 0x0282854b, 0x03704a39, 0x01fda863, 0x02b47f41, 0x0022c2fc, 0x0186031d, 0x003cb7ed}}}, + {X: Field{[10]uint32{0x00b519fe, 0x011ae634, 0x03e67034, 0x00ab7020, 0x010b163f, 0x027bc0c8, 0x03b43097, 0x018ea0ab, 0x01aae8a2, 0x0017b167}}, Y: Field{[10]uint32{0x01ef82b9, 0x0057aa1e, 0x0304e842, 0x01bd7016, 0x03a8a531, 0x01395613, 0x01c6aab9, 0x03ab94c3, 0x00c36a3d, 0x000baad3}}}, + {X: Field{[10]uint32{0x00bb62f5, 0x032e40f5, 0x0121658c, 0x01a71034, 0x0001119f, 0x03f07c26, 0x02975c8e, 0x0277ef6b, 0x00d92058, 0x00109ed7}}, Y: Field{[10]uint32{0x02d1213d, 0x011a1995, 0x01b18d98, 0x028c1a1c, 0x006500b5, 0x017f2a1e, 0x022803c3, 0x01210905, 0x02e3b879, 0x00341579}}}, + {X: Field{[10]uint32{0x0105bcad, 0x02113be7, 0x00736554, 0x03630344, 0x002cc30d, 0x03750b2e, 0x03422c79, 0x013cf423, 0x0315fc59, 0x00152552}}, Y: Field{[10]uint32{0x0335373a, 0x011cd33d, 0x0397564b, 0x03d7af30, 0x029c6b88, 0x00680392, 0x03f8e042, 0x027080ab, 0x00657356, 0x0021a9f3}}}, + {X: Field{[10]uint32{0x01f32559, 0x016879ac, 0x021f01b5, 0x02019e8a, 0x03573eb4, 0x0255a194, 0x01aa7b33, 0x003efca8, 0x038d2367, 0x003fdbe3}}, Y: Field{[10]uint32{0x02c7e218, 0x02b07706, 0x017cd2d4, 0x03d0fe3d, 0x0336cd33, 0x027f6511, 0x031552f0, 0x02f15f5c, 0x01a6c7ca, 0x001e94fc}}}, + {X: Field{[10]uint32{0x018a2381, 0x00309965, 0x0152b842, 0x03ee2805, 0x023bba8e, 0x007832e2, 0x02d852f4, 0x030843a0, 0x01e99021, 0x001d35c9}}, Y: Field{[10]uint32{0x01bb2bb0, 0x02d6153d, 0x0227c0ae, 0x039809b2, 0x0192f18d, 0x00405b76, 0x03d6ca4e, 0x01c2ee20, 0x0246aa9f, 0x0013b9a5}}}, + {X: Field{[10]uint32{0x009c845b, 0x030c9479, 0x008d76d3, 0x01c35dd1, 0x01feca05, 0x01636176, 0x0168fbbc, 0x010b270b, 0x037efc03, 0x003a50e7}}, Y: Field{[10]uint32{0x02233916, 0x006f808f, 0x03592203, 0x039ea4a1, 0x01566667, 0x03435c19, 0x0290b459, 0x0095ebbb, 0x01981b7e, 0x0009f683}}}, + {X: Field{[10]uint32{0x01c0b911, 0x01572c29, 0x00f1e2c0, 0x00ca7cb1, 0x0305facb, 0x00fff44c, 0x0126622b, 0x002159b7, 0x008d81a6, 0x0025a129}}, Y: Field{[10]uint32{0x024e68b2, 0x00d4cafc, 0x018161be, 0x00979ebc, 0x03294bbd, 0x0179ed39, 0x0187c31f, 0x03eea975, 0x02d250ad, 0x002480e2}}}, + {X: Field{[10]uint32{0x020e7609, 0x01df25c6, 0x019b4162, 0x00dd7e74, 0x009e4cf8, 0x037161ca, 0x030f1214, 0x0389bb1f, 0x02f90469, 0x0007400e}}, Y: Field{[10]uint32{0x031e5123, 0x02bfa7bd, 0x02139c84, 0x0069f0df, 0x00ed795f, 0x011b4981, 0x031dad81, 0x00b1c82c, 0x03a53082, 0x002671f0}}}, + {X: Field{[10]uint32{0x0197a149, 0x019272b8, 0x0242d01c, 0x02ff1805, 0x010d680a, 0x027dcb02, 0x0032fa58, 0x02aadddb, 0x00f873cf, 0x003e591a}}, Y: Field{[10]uint32{0x02083b1d, 0x00f9353e, 0x036e9979, 0x021b0624, 0x03b67081, 0x014e15f8, 0x00a7ff33, 0x0174c6c9, 0x03c40849, 0x0007fed2}}}, + {X: Field{[10]uint32{0x03f89d32, 0x001104ac, 0x025f5329, 0x03d947b1, 0x03d93c14, 0x00c4542f, 0x02c86a21, 0x02534af2, 0x0106e302, 0x002dab50}}, Y: Field{[10]uint32{0x00d228ce, 0x00a9398e, 0x003ee5db, 0x024a4307, 0x034fa407, 0x01310ad0, 0x015201cc, 0x02590741, 0x02a67427, 0x000668d9}}}, + {X: Field{[10]uint32{0x005b9b9a, 0x01f9f3f9, 0x00108a97, 0x00a1b2c7, 0x0202d478, 0x02eda7ec, 0x020fec3e, 0x03cc1644, 0x02f7190b, 0x0021d51c}}, Y: Field{[10]uint32{0x01a97c21, 0x029e2615, 0x00562050, 0x0238c151, 0x030a172d, 0x017e0127, 0x01d163a9, 0x0166b785, 0x03c5f5dc, 0x0006b7bf}}}, + {X: Field{[10]uint32{0x0227a670, 0x03bac166, 0x034074d9, 0x0356bd29, 0x0354bb6f, 0x0072c6c7, 0x00f7ae2a, 0x01505399, 0x01faf424, 0x0015116a}}, Y: Field{[10]uint32{0x01418018, 0x01d0713a, 0x0294ce87, 0x03a987f7, 0x013bdf07, 0x00fede87, 0x008978ca, 0x038208f9, 0x02077da2, 0x00125b14}}}, + {X: Field{[10]uint32{0x0014d138, 0x01330f5e, 0x0262bf4c, 0x03e5f07d, 0x0374d3a8, 0x0215a0c3, 0x03350267, 0x02b22147, 0x0225704b, 0x0036b861}}, Y: Field{[10]uint32{0x03be6f87, 0x02f6a440, 0x02bff373, 0x03ef1a38, 0x03c20f62, 0x017b20d7, 0x0188ee63, 0x0018660e, 0x01fd7ba9, 0x002af016}}}, + {X: Field{[10]uint32{0x019845c9, 0x032a24e7, 0x00d02dee, 0x02047fa5, 0x013d009b, 0x001f864a, 0x00e659c1, 0x00f7971f, 0x0312e852, 0x00228223}}, Y: Field{[10]uint32{0x0229114a, 0x02c3dd9f, 0x004baef7, 0x011ff179, 0x0041f8df, 0x03062c82, 0x02d703cb, 0x02edd974, 0x012afb8e, 0x00109448}}}, + {X: Field{[10]uint32{0x03af6d01, 0x02d4b935, 0x02f6ec25, 0x033caf3a, 0x00716755, 0x023d5e44, 0x00ed25c7, 0x002344cd, 0x02a88f3b, 0x0035e3d1}}, Y: Field{[10]uint32{0x0306f44d, 0x0149bbd6, 0x006ee5c9, 0x034c9091, 0x01929046, 0x032fc6cb, 0x00b3f019, 0x008043c8, 0x01f229cb, 0x003ac615}}}, + {X: Field{[10]uint32{0x019b034b, 0x0035717e, 0x02fa83ec, 0x0271beab, 0x02f58980, 0x03fbf375, 0x015c4cac, 0x00389d79, 0x031278ae, 0x000782d0}}, Y: Field{[10]uint32{0x004918a7, 0x028a2064, 0x036578bb, 0x02b8275c, 0x03fb523f, 0x020d2140, 0x03d74edb, 0x00ead0ba, 0x03c5544d, 0x003ce314}}}, + {X: Field{[10]uint32{0x017cbbd1, 0x00d1197b, 0x01638cd5, 0x03dc3105, 0x00ab02d7, 0x029623cd, 0x0011f144, 0x0046703d, 0x01b29edb, 0x003c0c55}}, Y: Field{[10]uint32{0x00e85813, 0x034fc1ae, 0x02495599, 0x0125fe71, 0x01317367, 0x00658159, 0x01d07cd3, 0x03fc52d0, 0x03e3ff4f, 0x001cb454}}}, + {X: Field{[10]uint32{0x01de4c8e, 0x025b8e79, 0x02b4153a, 0x01e1b42e, 0x038df665, 0x01059952, 0x00c84fe3, 0x01fed345, 0x01683edc, 0x0003d87f}}, Y: Field{[10]uint32{0x002e5f92, 0x011cb8f5, 0x0212fd38, 0x00e7d636, 0x02e11fc1, 0x00983f93, 0x01d6884d, 0x004ec621, 0x0167cf09, 0x00254b6d}}}, + {X: Field{[10]uint32{0x0017dd77, 0x0271fdf8, 0x0344d7ee, 0x03612c7c, 0x0201ede6, 0x00e9361b, 0x0300e3b1, 0x00dec972, 0x027a29e4, 0x001e0c43}}, Y: Field{[10]uint32{0x0182f2d2, 0x00406db8, 0x00a51a7d, 0x00fd0c4d, 0x007030bd, 0x01f080b5, 0x020f7009, 0x00a78130, 0x018a4d56, 0x0009bfcd}}}, + {X: Field{[10]uint32{0x03781a3a, 0x0009f847, 0x016b97a4, 0x012f2282, 0x034e6ac9, 0x002d87af, 0x01509c2d, 0x00a72e98, 0x004d6b73, 0x0018eba3}}, Y: Field{[10]uint32{0x00d14f88, 0x020fa577, 0x016ce2e4, 0x00a7be2e, 0x01af16c9, 0x00e2a4e8, 0x01629cb3, 0x01e15f46, 0x00cfbf40, 0x002a3a55}}}, + {X: Field{[10]uint32{0x03cca739, 0x01e5c941, 0x02fa9165, 0x009bfde6, 0x00ae662f, 0x00ce15d3, 0x01039616, 0x00d53b8b, 0x012a594b, 0x00252356}}, Y: Field{[10]uint32{0x02f1876c, 0x03219ec0, 0x015570ed, 0x02293b89, 0x01ce0275, 0x01cef5b5, 0x013992f7, 0x00e5ba27, 0x00e25ea0, 0x000dffe6}}}, + {X: Field{[10]uint32{0x02100f45, 0x038b4d11, 0x03a55398, 0x01853719, 0x00660a41, 0x02ffba20, 0x0304de18, 0x000da142, 0x016fa314, 0x00194f3c}}, Y: Field{[10]uint32{0x025a9202, 0x0076cd44, 0x01c3649c, 0x0064f985, 0x03ea4d34, 0x0390c416, 0x026741ae, 0x0395499d, 0x02de5ff1, 0x002b2aab}}}, + {X: Field{[10]uint32{0x028cc782, 0x01447fe3, 0x00d2af3c, 0x02219142, 0x01141e18, 0x039a9de2, 0x00fd1ee0, 0x03722fc9, 0x00828a5e, 0x0011beda}}, Y: Field{[10]uint32{0x03fd8887, 0x020f804d, 0x010cfef3, 0x02611fb2, 0x02f4d266, 0x020b0b8d, 0x009ff4ae, 0x03a6f5ab, 0x013fd52c, 0x002752b9}}}, + {X: Field{[10]uint32{0x0138c0ed, 0x0308015c, 0x020eae24, 0x0021e8ab, 0x024ca442, 0x012c3ca2, 0x01face2b, 0x00a9c5f0, 0x00c723ea, 0x0017c468}}, Y: Field{[10]uint32{0x000c8452, 0x01ccc5ae, 0x011d5bb2, 0x033c1be6, 0x023906ea, 0x0049b939, 0x03925ddf, 0x0184bee9, 0x0084ad97, 0x0017b2bb}}}, + {X: Field{[10]uint32{0x02a9039f, 0x02f72130, 0x022c0320, 0x00ecfae9, 0x00dbf2ba, 0x03ac4224, 0x02b6b3bd, 0x03bde9b5, 0x021c929b, 0x002e7d27}}, Y: Field{[10]uint32{0x0101e558, 0x01a0832d, 0x0115c2bf, 0x0131bd0b, 0x006e1b68, 0x00d2a80c, 0x00ecc1c5, 0x022deef4, 0x02767e4f, 0x00261ca7}}}, + {X: Field{[10]uint32{0x01ade2c3, 0x00e39c85, 0x012dc63c, 0x02c0d8c7, 0x00965dc2, 0x03269182, 0x033eea76, 0x02417fc9, 0x0102e7d2, 0x0003b228}}, Y: Field{[10]uint32{0x034371c0, 0x028fb73d, 0x00b6dbe5, 0x0170da33, 0x02706ffe, 0x03d9c584, 0x03836868, 0x025b2d24, 0x01e7242d, 0x00363226}}}, + {X: Field{[10]uint32{0x03e236c6, 0x0339810a, 0x02dafcda, 0x02c0e73d, 0x010582c5, 0x010a9496, 0x012a3c77, 0x020169b2, 0x02b3c351, 0x00041fc0}}, Y: Field{[10]uint32{0x019bfb9f, 0x03ce272a, 0x00a3e685, 0x017820b1, 0x03c5c2d5, 0x0371c929, 0x01746858, 0x01d8055f, 0x02bf1ab4, 0x00145c8d}}}, + {X: Field{[10]uint32{0x02298971, 0x018194d5, 0x036cfb98, 0x01eb6bdb, 0x02b10d63, 0x020c5e1c, 0x038c1fea, 0x03005b5e, 0x00a1a5c1, 0x003c3ec5}}, Y: Field{[10]uint32{0x024540d1, 0x02f151e5, 0x0033792f, 0x03fecc59, 0x00c40b89, 0x00a00007, 0x018e87c7, 0x03997509, 0x01140d33, 0x0038767b}}}, + {X: Field{[10]uint32{0x00489459, 0x03e6cd51, 0x0347a333, 0x002bfe0e, 0x0078a1c8, 0x03af781a, 0x00ce83c0, 0x013b7bdb, 0x02dbea78, 0x00294dc6}}, Y: Field{[10]uint32{0x00129224, 0x0338fcb2, 0x03edd48e, 0x02f33344, 0x007e3d09, 0x00a88b2f, 0x03acbe7b, 0x0175d1dc, 0x0172127f, 0x003d5e01}}}, + {X: Field{[10]uint32{0x0217300d, 0x013eb7ef, 0x013b999e, 0x005e580f, 0x022bbbb8, 0x03e9f64b, 0x00109715, 0x0295d84f, 0x025e1b0b, 0x000f00c7}}, Y: Field{[10]uint32{0x029c83f3, 0x0309cbab, 0x03e6bbf9, 0x035c70d8, 0x0079cb40, 0x035edb31, 0x00e65a2c, 0x00db751d, 0x03fb3920, 0x00349d68}}}, + {X: Field{[10]uint32{0x01a5318f, 0x0071a701, 0x0218b217, 0x02b948f3, 0x01f8a1b9, 0x00e48203, 0x0169a689, 0x02d4c282, 0x019e685d, 0x0021ed62}}, Y: Field{[10]uint32{0x01a775d4, 0x02bd23ff, 0x02c081f5, 0x03ebe673, 0x011b1166, 0x010ba134, 0x0140b01a, 0x02be968b, 0x0204e3f0, 0x0001ab8c}}}, + {X: Field{[10]uint32{0x01b8bf74, 0x01014042, 0x038dd2ae, 0x0138ffa0, 0x01ea00d0, 0x01adf9ec, 0x018eedb5, 0x0305b7e7, 0x03ddc002, 0x00367c1d}}, Y: Field{[10]uint32{0x033ffeaf, 0x0084996b, 0x012f278f, 0x000bb954, 0x0211c273, 0x01c32e7b, 0x00fc486f, 0x0063894f, 0x011e5031, 0x00194635}}}, + {X: Field{[10]uint32{0x00921af7, 0x031c873e, 0x0398ec9b, 0x02482bbe, 0x037558a4, 0x0089dfd8, 0x01ce3053, 0x02b32582, 0x03638d15, 0x0027026a}}, Y: Field{[10]uint32{0x00e0f6fc, 0x0292de40, 0x033d91ca, 0x012a7ef7, 0x010bf2f8, 0x0194897c, 0x02d6ab31, 0x02f0422f, 0x018d535a, 0x002cb2b1}}}, + {X: Field{[10]uint32{0x028a7fc0, 0x01b71ce6, 0x008ae167, 0x0037b439, 0x0052ab25, 0x030da689, 0x038948a5, 0x0248c973, 0x038b4c2d, 0x001bb47b}}, Y: Field{[10]uint32{0x02742008, 0x02b21fbd, 0x00585f54, 0x02f07241, 0x025c6423, 0x018f69d6, 0x02741368, 0x014553f2, 0x008c2cfe, 0x00306de8}}}, + {X: Field{[10]uint32{0x006928d1, 0x034ef894, 0x018f13fb, 0x02a4c1e7, 0x03cfc458, 0x00ae9821, 0x01f71c1e, 0x01fdb09e, 0x0170154b, 0x00220ba3}}, Y: Field{[10]uint32{0x03e64131, 0x00e9ce9b, 0x03d1d9b2, 0x0197b6ec, 0x0208b315, 0x019eb07c, 0x014ac62e, 0x0061ca42, 0x022e97c4, 0x0022526c}}}, + {X: Field{[10]uint32{0x037aba52, 0x0284e7ec, 0x0246aa6d, 0x03a7f08c, 0x00516840, 0x00942605, 0x019d0afb, 0x01ba81c4, 0x02a024c8, 0x001c211c}}, Y: Field{[10]uint32{0x028fe5ac, 0x014feec4, 0x0130db7a, 0x01ee0335, 0x013a8b05, 0x02528d99, 0x03378d65, 0x0054ca96, 0x03a51d55, 0x0026026d}}}, + {X: Field{[10]uint32{0x039fac3e, 0x02a330eb, 0x025ebd87, 0x00f5c688, 0x03769d57, 0x023420d4, 0x01a1250d, 0x02dc212b, 0x02d509a8, 0x000e913e}}, Y: Field{[10]uint32{0x037f20cd, 0x031a7ed2, 0x01c85cb0, 0x0114b4f1, 0x03f9186e, 0x01849204, 0x0174bf84, 0x03434286, 0x01511250, 0x003ca7d1}}}, + {X: Field{[10]uint32{0x01fb9f30, 0x00dc2cf3, 0x0390afcc, 0x02116267, 0x0236ba4c, 0x00708cd8, 0x00564c04, 0x006f5058, 0x01d8e09e, 0x0028d467}}, Y: Field{[10]uint32{0x03881d7e, 0x034fb186, 0x0267472d, 0x0238d3f3, 0x02715008, 0x031d3423, 0x0199faa6, 0x001c4740, 0x01597c91, 0x001933fc}}}, + {X: Field{[10]uint32{0x00fcf1dc, 0x03c1d9d7, 0x038291c4, 0x03e835a3, 0x02bea1af, 0x027667fc, 0x033513f1, 0x0172593a, 0x00e3765f, 0x0016bc5b}}, Y: Field{[10]uint32{0x03815daa, 0x0100bae8, 0x023dc1f2, 0x02e2a1ea, 0x00511ff7, 0x0005929e, 0x0042db6b, 0x0047b52a, 0x02b53bd7, 0x00002193}}}, + {X: Field{[10]uint32{0x023d54a8, 0x0070b415, 0x0149b402, 0x0344de96, 0x0018848b, 0x00990410, 0x021ec080, 0x03970977, 0x012219ca, 0x0007fe69}}, Y: Field{[10]uint32{0x0318e031, 0x0320ec05, 0x014d4791, 0x0370526c, 0x018f85d7, 0x014dd0c2, 0x00fb919a, 0x01db86d7, 0x034c1222, 0x00151b58}}}, + {X: Field{[10]uint32{0x03d3e938, 0x01b75bd0, 0x0082ac6b, 0x0372a999, 0x007f02fc, 0x03eacda3, 0x00926ebc, 0x007b63e1, 0x00ad72a5, 0x0035e9b7}}, Y: Field{[10]uint32{0x00e41c96, 0x018ec885, 0x03278bde, 0x01601b25, 0x018598a0, 0x01119aba, 0x028f378e, 0x02b21969, 0x00d63ea6, 0x002689cf}}}, + {X: Field{[10]uint32{0x0332d797, 0x02a34647, 0x012823f4, 0x024c7c88, 0x023c874b, 0x02db3531, 0x016dfb52, 0x0331f69a, 0x03e55bdc, 0x000553d8}}, Y: Field{[10]uint32{0x03f76fae, 0x01644d5d, 0x0067a2df, 0x01f6cd03, 0x02f0f29d, 0x00aa9af1, 0x03269b0d, 0x028723a9, 0x032217bc, 0x003a63e5}}}, + {X: Field{[10]uint32{0x00399bf1, 0x03b1d613, 0x01991c27, 0x036a1f3a, 0x02dbdbb7, 0x0086ef7a, 0x0129095c, 0x01857333, 0x008b8513, 0x003dab78}}, Y: Field{[10]uint32{0x03234ad1, 0x01eb4ce3, 0x0296af03, 0x03284c63, 0x013fc1c5, 0x00a298c4, 0x01af074b, 0x032ae84c, 0x03e019fc, 0x00263206}}}, + {X: Field{[10]uint32{0x0347637e, 0x0072cb31, 0x0083a3e5, 0x03da50ea, 0x00b786b3, 0x017fb0af, 0x01290486, 0x0057db1b, 0x02c03b27, 0x00259873}}, Y: Field{[10]uint32{0x035358bf, 0x01d58813, 0x032547fe, 0x00d657c2, 0x03cb9c37, 0x027b1ce7, 0x028056a0, 0x00412dd2, 0x03d99b34, 0x003aa87d}}}, + {X: Field{[10]uint32{0x015d19a1, 0x01262d19, 0x0377f53d, 0x0333d6b1, 0x03480520, 0x000dc170, 0x0003465f, 0x00231cd3, 0x023a27d6, 0x0038294c}}, Y: Field{[10]uint32{0x020cc606, 0x02f58a49, 0x03aee836, 0x02d639f2, 0x0363d88e, 0x0118a5d7, 0x00606798, 0x03158baf, 0x0178a8b8, 0x0007dc9f}}}, + {X: Field{[10]uint32{0x002f6409, 0x0338c74a, 0x00118c24, 0x02577b39, 0x0308206e, 0x009431ab, 0x001980d5, 0x011bcbca, 0x02fd0046, 0x002eae0b}}, Y: Field{[10]uint32{0x011fb82a, 0x03356123, 0x0177d137, 0x02ed1ade, 0x03cafbdb, 0x0195b157, 0x038375a5, 0x00049a37, 0x01dc26a2, 0x000a982c}}}, + {X: Field{[10]uint32{0x01eb2631, 0x02052b78, 0x022c221e, 0x0081e79a, 0x032d7edd, 0x03946ebb, 0x006e9b3e, 0x02562c60, 0x0399ebbe, 0x000e2784}}, Y: Field{[10]uint32{0x029ae2be, 0x01167db3, 0x02fd52c9, 0x02f50d79, 0x00e48ada, 0x004a9893, 0x031fb4d1, 0x03f91679, 0x02331f3c, 0x001b0561}}}, + {X: Field{[10]uint32{0x029d4515, 0x001dc9dc, 0x000458c3, 0x01846e91, 0x01087d89, 0x03e91447, 0x03081747, 0x0154f467, 0x01cac0dc, 0x002de05e}}, Y: Field{[10]uint32{0x003e0de2, 0x0248d47a, 0x00c97a68, 0x0326ee5d, 0x01ce0a80, 0x0115df5c, 0x00caa5a9, 0x01a941b9, 0x02980c49, 0x001c082f}}}, + {X: Field{[10]uint32{0x03104306, 0x0053557f, 0x02dc9f1e, 0x03d04bb2, 0x02baa6a6, 0x03640163, 0x03d13fcf, 0x03e69c48, 0x013dd170, 0x00219fb3}}, Y: Field{[10]uint32{0x006759bb, 0x00d792a5, 0x00dc9e25, 0x038bf792, 0x03d698c5, 0x027cad50, 0x03276897, 0x03b88e3e, 0x03e1bb91, 0x000f036c}}}, + {X: Field{[10]uint32{0x00eecd38, 0x02f8bdb5, 0x004e5697, 0x00af055c, 0x03db25bb, 0x0212cb32, 0x03d4d083, 0x00097507, 0x014c26a1, 0x002f9c59}}, Y: Field{[10]uint32{0x01406afa, 0x02bdabd2, 0x001dfcdf, 0x039112cb, 0x012dcdae, 0x013683bf, 0x02f8d18e, 0x00b71e82, 0x020fc37a, 0x000c5bb4}}}, + {X: Field{[10]uint32{0x02e9079c, 0x037aea5d, 0x01fda6b6, 0x0111e58f, 0x01416905, 0x03478059, 0x015b9a2a, 0x009a179d, 0x00b024d6, 0x0016a387}}, Y: Field{[10]uint32{0x011ebba7, 0x022888bc, 0x00a27d08, 0x00aa4778, 0x023889db, 0x02377a57, 0x00f43516, 0x00c379ea, 0x01737433, 0x00131e4c}}}, + {X: Field{[10]uint32{0x002e6131, 0x005904ae, 0x031f8572, 0x003eb8f4, 0x03bb884d, 0x0018c114, 0x03a761ad, 0x02f433c4, 0x000b2347, 0x000efeb4}}, Y: Field{[10]uint32{0x02545f61, 0x02f6d0aa, 0x0051896e, 0x02adbd6c, 0x0371e3cb, 0x01b52060, 0x03fe8e63, 0x01ffb0fd, 0x01609415, 0x003bccf1}}}, + {X: Field{[10]uint32{0x012c1961, 0x00647bd7, 0x02dc7428, 0x00d4ed3c, 0x0360e026, 0x0171a32d, 0x016c2d2b, 0x03382722, 0x02de684d, 0x0000911f}}, Y: Field{[10]uint32{0x02f7bfcb, 0x009fcc07, 0x03377624, 0x01535b9f, 0x025ad6cb, 0x0110e090, 0x0339e554, 0x02182d8a, 0x002fe80f, 0x002b4e2a}}}, + {X: Field{[10]uint32{0x03cf985d, 0x0215f522, 0x0123909d, 0x001d05f1, 0x00e7685f, 0x02a379d9, 0x0007e49b, 0x02e7e3a2, 0x0321eeb4, 0x00297ab8}}, Y: Field{[10]uint32{0x034def1d, 0x02c408ea, 0x0296eed3, 0x0075229d, 0x01001788, 0x02799565, 0x015f5233, 0x02df4cab, 0x02a9f5c1, 0x000ab3e2}}}, + {X: Field{[10]uint32{0x0090b13c, 0x0395d6ba, 0x01251007, 0x0045710d, 0x03dc035e, 0x02ac17a3, 0x00a5b973, 0x0364e0f3, 0x015c5337, 0x0025f7a6}}, Y: Field{[10]uint32{0x0069e6dd, 0x02448438, 0x01f79e8f, 0x016f3624, 0x00920250, 0x01373bd4, 0x003fb4dc, 0x0228a4d3, 0x01692e30, 0x0013ecb6}}}, + {X: Field{[10]uint32{0x0038f479, 0x005c9b11, 0x01f3cc6b, 0x011151ac, 0x0125b70f, 0x002af7e5, 0x003dad8d, 0x02462be0, 0x025fa864, 0x002e32bc}}, Y: Field{[10]uint32{0x009c05c9, 0x0198f683, 0x02d79023, 0x00dac1a7, 0x02c30e2f, 0x01db01d2, 0x03a8c5a0, 0x01bacdbf, 0x01fac0f5, 0x001f146d}}}, + {X: Field{[10]uint32{0x0107b2e6, 0x0085d92b, 0x03443445, 0x02296c7c, 0x03b2cade, 0x03c50041, 0x00f3001a, 0x038a86c9, 0x028c1b96, 0x002d6f21}}, Y: Field{[10]uint32{0x0138d639, 0x02e8d9d2, 0x026f238b, 0x001ec852, 0x03672a8c, 0x015170ce, 0x02aa456f, 0x027ccf56, 0x02294e92, 0x00235b3f}}}, + {X: Field{[10]uint32{0x033ff602, 0x012a284d, 0x036e9078, 0x01887c4f, 0x0032ea26, 0x0090530a, 0x01b666bf, 0x00ec8843, 0x007c242a, 0x0017d456}}, Y: Field{[10]uint32{0x0346c858, 0x021a5122, 0x03427f58, 0x02299ab6, 0x031b3941, 0x02732ee7, 0x013950f9, 0x00293ae1, 0x020febf2, 0x000b0ec9}}}, + {X: Field{[10]uint32{0x022bcfde, 0x02d19d1e, 0x01feb822, 0x02558343, 0x034f08e6, 0x00113cfd, 0x0252e17e, 0x028ad44a, 0x00f95009, 0x000742f8}}, Y: Field{[10]uint32{0x033a159b, 0x01739363, 0x02538933, 0x02c93e19, 0x03a742c3, 0x01ee0776, 0x003181cf, 0x0061dcde, 0x03c3dbd8, 0x0030ea0a}}}, + {X: Field{[10]uint32{0x0122fb8a, 0x02bd2f23, 0x0192ccec, 0x0356d249, 0x029e0e62, 0x0338c3b4, 0x0221bcd6, 0x00ccc699, 0x0028b800, 0x000fbc3b}}, Y: Field{[10]uint32{0x0144b16d, 0x00a6e9e8, 0x001337d9, 0x018e636c, 0x03512fd3, 0x010f31fd, 0x02a03dae, 0x003a1b24, 0x00ad77d4, 0x003f8b21}}}, + {X: Field{[10]uint32{0x03555fc5, 0x03e5926d, 0x02ad302e, 0x02c39fc3, 0x00f62f12, 0x00ca8d92, 0x02bef427, 0x00136b1d, 0x0224a4ec, 0x002130a6}}, Y: Field{[10]uint32{0x014f970e, 0x029fc29e, 0x017ecb18, 0x014ce391, 0x03929ec4, 0x008b927e, 0x02b454cf, 0x01529c43, 0x02bb283a, 0x0039d883}}}, + {X: Field{[10]uint32{0x02cf43a8, 0x00c55cfa, 0x031e9283, 0x01cc041f, 0x03a309cd, 0x03c705de, 0x0340f4e5, 0x017fa487, 0x0234e75d, 0x001aee99}}, Y: Field{[10]uint32{0x03421582, 0x01af8dbe, 0x01a979d8, 0x03a9519c, 0x025b47fd, 0x00882715, 0x0086b441, 0x02090c7c, 0x008c4216, 0x000cfff8}}}, + {X: Field{[10]uint32{0x01ef0150, 0x03c59d1b, 0x01bfa47c, 0x02625567, 0x02488f62, 0x02796dba, 0x01a6046d, 0x03006f12, 0x02f051b0, 0x0004ed9e}}, Y: Field{[10]uint32{0x00237608, 0x03c764e8, 0x0109ee29, 0x01648c85, 0x03a54add, 0x0212b2b2, 0x037cc35d, 0x02fc2d4c, 0x014b01c1, 0x00343a24}}}, + {X: Field{[10]uint32{0x03af9300, 0x033c4fa4, 0x007202c5, 0x032d8d90, 0x02fdf779, 0x03331289, 0x02abc946, 0x02d8abaf, 0x01bfb5dc, 0x00058488}}, Y: Field{[10]uint32{0x00f83b2c, 0x026dfa4b, 0x007b72a4, 0x036d86bb, 0x00d1a212, 0x00ad484f, 0x0266bd30, 0x01b7e1c2, 0x02c5dd9d, 0x0034ff78}}}, + {X: Field{[10]uint32{0x02eb508b, 0x0242fe38, 0x003d39a5, 0x02fe19b7, 0x017eda1f, 0x00ad4880, 0x03602770, 0x016118eb, 0x020cc62f, 0x000c314d}}, Y: Field{[10]uint32{0x02c44efe, 0x02d2a072, 0x039f01aa, 0x03006dd9, 0x016c30e8, 0x037ab185, 0x037dbe8e, 0x0268ae20, 0x02f5009b, 0x00323a46}}}, + {X: Field{[10]uint32{0x00ec3576, 0x02e002c0, 0x01007a38, 0x03c21cdc, 0x02640364, 0x00925c9f, 0x027f38b7, 0x0147d7a9, 0x027fdd91, 0x00301966}}, Y: Field{[10]uint32{0x01cf47e3, 0x03c58069, 0x03ded648, 0x02b8728c, 0x018c57fa, 0x01d100d8, 0x018b5a77, 0x00c70d51, 0x00cb6fa1, 0x0029bd92}}}, + {X: Field{[10]uint32{0x02679386, 0x009e1fc0, 0x004be43e, 0x025429a1, 0x037d50fe, 0x0386ac72, 0x006472a8, 0x02a24811, 0x024db795, 0x000c8548}}, Y: Field{[10]uint32{0x018a9bf0, 0x01407e4d, 0x0238cc5e, 0x006fbf0f, 0x03faba83, 0x00b3ff17, 0x00c7eb59, 0x023619a4, 0x026297f2, 0x00095d41}}}, + {X: Field{[10]uint32{0x01871145, 0x029a2868, 0x035b3b19, 0x01926625, 0x03fe7762, 0x02971553, 0x0115445d, 0x01c120ef, 0x00e2a87a, 0x00095d95}}, Y: Field{[10]uint32{0x02636ec5, 0x0232234c, 0x010439c2, 0x00c259a4, 0x009efe24, 0x032816c6, 0x03fc4eef, 0x03c53e75, 0x019d0c67, 0x003f2e4c}}}, + {X: Field{[10]uint32{0x002f1b49, 0x0262c5c2, 0x03e800ce, 0x01b5b6cc, 0x0017c8a6, 0x039a422a, 0x017926e6, 0x03c553cf, 0x0201e504, 0x00291e1a}}, Y: Field{[10]uint32{0x0323a2fc, 0x00a184b4, 0x03bfd0b0, 0x038998ab, 0x027f86e8, 0x02df3e9e, 0x01a29678, 0x013e7fa0, 0x0142fc2e, 0x0015db93}}}, + {X: Field{[10]uint32{0x02db1e71, 0x02966998, 0x01e383c5, 0x03dfa0b8, 0x0090b484, 0x022bcda7, 0x013ae62a, 0x02615912, 0x03a9260c, 0x0014503d}}, Y: Field{[10]uint32{0x010bae86, 0x011c534d, 0x021fe2f6, 0x03026149, 0x0394ddcd, 0x03afe454, 0x026aa92c, 0x0277ed8e, 0x02c2b087, 0x0013945c}}}, + {X: Field{[10]uint32{0x00a66dfc, 0x01b3cc93, 0x0134231e, 0x004d4843, 0x03b781fe, 0x02295e75, 0x03d6d901, 0x0142de71, 0x020c0f0f, 0x003d5675}}, Y: Field{[10]uint32{0x014eed15, 0x00aeac23, 0x0208e205, 0x037328a7, 0x025f1f05, 0x02f6a390, 0x015fb56a, 0x014a972a, 0x02ae8e58, 0x0004b673}}}, + {X: Field{[10]uint32{0x00547e7c, 0x021a686c, 0x038570cc, 0x037e68cd, 0x00a4fb73, 0x00e814d5, 0x030e0be5, 0x03406f25, 0x03f50fa2, 0x0022241f}}, Y: Field{[10]uint32{0x03a3d2f5, 0x0055ee5f, 0x0373dab9, 0x006f0036, 0x025b2640, 0x03f29aaa, 0x03145f26, 0x0046d909, 0x0356cc12, 0x003d614e}}}, + {X: Field{[10]uint32{0x018c45ca, 0x02cfa9b9, 0x027ecfe4, 0x03c937bc, 0x03c8ac82, 0x038763fe, 0x011fba31, 0x0141b63a, 0x03f64541, 0x00330792}}, Y: Field{[10]uint32{0x00d27592, 0x00a98fce, 0x03b77590, 0x036c9d4f, 0x011efcf1, 0x00c1a55b, 0x00585a60, 0x0060f1a1, 0x017da875, 0x001d85d2}}}, + {X: Field{[10]uint32{0x03ca99d5, 0x00436ab2, 0x00dd4eca, 0x01f24d15, 0x016c3955, 0x007b7780, 0x02a6f9ef, 0x0108416d, 0x0037ef74, 0x001fb8b1}}, Y: Field{[10]uint32{0x033772d6, 0x0125a3db, 0x025b1827, 0x01c36f7b, 0x033e6d7b, 0x01457695, 0x00503f69, 0x03d767cc, 0x03345eef, 0x00085d51}}}, + {X: Field{[10]uint32{0x03e2465c, 0x0278178c, 0x0290f653, 0x012ed0b6, 0x003605ba, 0x01afd083, 0x033af3ef, 0x02d2a68f, 0x02a239f9, 0x0001cbfb}}, Y: Field{[10]uint32{0x01f553cc, 0x00abb67a, 0x0120a36d, 0x0345ac33, 0x0085482c, 0x000a50a3, 0x002ad9ad, 0x037b7723, 0x02ffdf7a, 0x0000280d}}}, + {X: Field{[10]uint32{0x0099914a, 0x0323d780, 0x0307c938, 0x02b89905, 0x03c8a0cb, 0x035e8e9b, 0x01b627c4, 0x0374019a, 0x033e94a0, 0x000d8f68}}, Y: Field{[10]uint32{0x02f58bd9, 0x03a6301e, 0x0359c3d0, 0x037351e2, 0x03a2f936, 0x00541bd1, 0x0236099c, 0x001e9038, 0x0277ef13, 0x0026f6a6}}}, + {X: Field{[10]uint32{0x02c133fe, 0x0246183c, 0x036e1a7e, 0x02347b26, 0x0393af0f, 0x02f817f7, 0x034a48bb, 0x010a426b, 0x0064c839, 0x001d9502}}, Y: Field{[10]uint32{0x00a3ecc2, 0x03970f95, 0x0084583c, 0x03d697b5, 0x01b3cc98, 0x02bcf5bc, 0x013a236d, 0x03ac0888, 0x03d7738c, 0x003c1a48}}}, + {X: Field{[10]uint32{0x02b239c4, 0x032d007c, 0x01606c94, 0x0224d1c2, 0x0251e381, 0x00ba6928, 0x01945c16, 0x022a7e2f, 0x00217a31, 0x0015cfc2}}, Y: Field{[10]uint32{0x0346bef5, 0x00754ead, 0x03fbe7ca, 0x00a35f1c, 0x00496cc1, 0x030faf45, 0x00b105fe, 0x02792e52, 0x00f27de6, 0x001f9e39}}}, + {X: Field{[10]uint32{0x02b01f5f, 0x02a4d388, 0x01467213, 0x02120669, 0x02f90d21, 0x015f97b5, 0x0009656f, 0x012e4ed4, 0x01818923, 0x000214de}}, Y: Field{[10]uint32{0x02e475f8, 0x01bc07d8, 0x02820ed2, 0x003b267e, 0x029281fc, 0x02733be8, 0x0069bbe8, 0x00266387, 0x01e8cc99, 0x0032529e}}}, + {X: Field{[10]uint32{0x01eb6041, 0x0184cb3b, 0x0051257f, 0x0031e001, 0x016f00a3, 0x033c3b61, 0x01ccd4c1, 0x000cd8ec, 0x01122989, 0x0014ce21}}, Y: Field{[10]uint32{0x0183334e, 0x022d12da, 0x03722fd7, 0x01551a6f, 0x000dd22f, 0x02f26a11, 0x038feacd, 0x0346e693, 0x0252f856, 0x00355b8a}}}, + {X: Field{[10]uint32{0x00e4796d, 0x00eaabac, 0x00c852f3, 0x02300e71, 0x01c5cb47, 0x03ee6258, 0x009f913a, 0x03ded971, 0x008a750e, 0x00107b79}}, Y: Field{[10]uint32{0x02559de4, 0x0090270c, 0x0065b8de, 0x02734693, 0x0104bdfe, 0x0012d4f2, 0x0092ea7f, 0x011a0062, 0x03f94b6c, 0x0035d31e}}}, + {X: Field{[10]uint32{0x01f08148, 0x034ed4f9, 0x03eefb6d, 0x00e4eb3f, 0x03fe7621, 0x03b5aa77, 0x02eece4e, 0x03dcda64, 0x01f36596, 0x0025fa4c}}, Y: Field{[10]uint32{0x00dd5f1b, 0x01838a85, 0x002c09b6, 0x0052d8b5, 0x0039a246, 0x01013ee9, 0x0276ce77, 0x0314a827, 0x013353b9, 0x000f6a26}}}, + {X: Field{[10]uint32{0x0222579d, 0x00024dec, 0x039a54db, 0x01933125, 0x035c55b6, 0x0094acde, 0x00476335, 0x02c410e6, 0x02ea3ca8, 0x00132bd3}}, Y: Field{[10]uint32{0x011607bb, 0x01c7358a, 0x01464621, 0x00013034, 0x0345a191, 0x01c75628, 0x03885807, 0x02f701f3, 0x03320a93, 0x00030999}}}, + {X: Field{[10]uint32{0x027b1ca4, 0x029f2127, 0x0306bb7e, 0x03e086a1, 0x01b52960, 0x01478e0e, 0x0324ee4e, 0x020f0cea, 0x02905b34, 0x00215f07}}, Y: Field{[10]uint32{0x0269dd80, 0x02456ebf, 0x00c01be5, 0x03f7a6d0, 0x011c6b09, 0x028b9af1, 0x018380c4, 0x021dc6cd, 0x010c7a57, 0x00235ba7}}}, + {X: Field{[10]uint32{0x00b5a182, 0x03b4b06f, 0x0322c1e7, 0x02925a1a, 0x0310ec39, 0x0372e8f2, 0x00fc1248, 0x03deb69a, 0x030be0db, 0x001043bd}}, Y: Field{[10]uint32{0x007f9e94, 0x02e508c9, 0x03db3b7c, 0x01e6023f, 0x00e6925d, 0x002d2970, 0x03074aee, 0x015bd73b, 0x02a3331a, 0x00349ba7}}}, + {X: Field{[10]uint32{0x0351029f, 0x00410655, 0x03f7a307, 0x03e69f98, 0x0289dff6, 0x01ea90c6, 0x03e5ec30, 0x03ac4205, 0x03a8c831, 0x00232be1}}, Y: Field{[10]uint32{0x03c8890a, 0x02421c99, 0x02058bfe, 0x001cf176, 0x0113aad2, 0x030e9192, 0x0265ba07, 0x029b0f23, 0x02e1c8dd, 0x000fc2f5}}}, + {X: Field{[10]uint32{0x02f10e8e, 0x01b57ebf, 0x037798c1, 0x022ffee6, 0x01b35ca1, 0x034c53ec, 0x026a8a39, 0x00920d52, 0x02cfe92d, 0x003bb7b8}}, Y: Field{[10]uint32{0x0114c4c3, 0x02cd6ab9, 0x01624c1e, 0x03259e4f, 0x009fcd12, 0x03e73877, 0x031181f3, 0x02fbf92c, 0x02b021f0, 0x0032d456}}}, + {X: Field{[10]uint32{0x02ebcee1, 0x03bb2bca, 0x00312f02, 0x01d5d135, 0x0248bb2a, 0x0045b6d4, 0x02d6a4e9, 0x02dfddee, 0x02c71e77, 0x00232fde}}, Y: Field{[10]uint32{0x039b7320, 0x028b015d, 0x03799169, 0x01fc36da, 0x02b6f669, 0x0034258d, 0x017f97c3, 0x009ad4f4, 0x0331f67b, 0x001d9712}}}, + {X: Field{[10]uint32{0x00995db2, 0x03f19c95, 0x02dfcc19, 0x032e6190, 0x02715dc6, 0x00380448, 0x03f0627f, 0x026abcd3, 0x01b4cd44, 0x001c3351}}, Y: Field{[10]uint32{0x03535c8e, 0x00314e0b, 0x00c4120f, 0x036442d8, 0x02ee184a, 0x02b685b1, 0x0320eac3, 0x025ec610, 0x00567614, 0x0020b965}}}, + {X: Field{[10]uint32{0x007c45d5, 0x00bf7edb, 0x002ea070, 0x011b83d1, 0x03050e51, 0x00defb0f, 0x039d558e, 0x033f6479, 0x03f9783f, 0x0033f885}}, Y: Field{[10]uint32{0x01c419d5, 0x03dc1e65, 0x00dfc7b6, 0x02185eed, 0x00da2251, 0x0231f0eb, 0x03d70d87, 0x00feff15, 0x010e8645, 0x0014df2f}}}, + {X: Field{[10]uint32{0x00579d52, 0x005e43d2, 0x0317e065, 0x032c4afc, 0x01ccabd2, 0x033ebe9c, 0x033d4f74, 0x02ee38af, 0x00df6486, 0x002609b0}}, Y: Field{[10]uint32{0x01c57342, 0x005cb76e, 0x02da734f, 0x015e353b, 0x02ae3bb4, 0x03f0db45, 0x0349c052, 0x01894f4d, 0x0186f86d, 0x000f6fcd}}}, + {X: Field{[10]uint32{0x028a02c4, 0x013d65b8, 0x00e74d0f, 0x037d5db2, 0x00a13e13, 0x01d13a71, 0x033fa3e3, 0x012f0b1a, 0x00ef381b, 0x003a863f}}, Y: Field{[10]uint32{0x0209f397, 0x03f9a7fb, 0x01874d7f, 0x02931074, 0x02041c9a, 0x016568c2, 0x0103c7fe, 0x01175e1c, 0x039d2bc4, 0x0030f9af}}}, + {X: Field{[10]uint32{0x026d8f4a, 0x033e433f, 0x033a0e88, 0x01759cc0, 0x0221b82e, 0x02705bfe, 0x00618bec, 0x01695187, 0x0065c09d, 0x001b78b1}}, Y: Field{[10]uint32{0x004ee2ba, 0x01973caf, 0x03f5d28b, 0x02c0ca02, 0x03e1c4cc, 0x00ec87d6, 0x00a8199d, 0x0220ad0a, 0x03d28950, 0x000d9eb2}}}, + {X: Field{[10]uint32{0x02183f4e, 0x03e9cfc6, 0x0284706f, 0x01a27bf4, 0x03cecc9c, 0x03469505, 0x0250f803, 0x031f516b, 0x0213ee10, 0x00358a1b}}, Y: Field{[10]uint32{0x02a56f56, 0x004fa4da, 0x008ad37f, 0x024d5f6e, 0x01e965ab, 0x0320a790, 0x023ca411, 0x013a271f, 0x03b75520, 0x001eae4a}}}, + {X: Field{[10]uint32{0x03c3bf58, 0x020f7dc8, 0x0364dfce, 0x0187bcf0, 0x0173f0c8, 0x036dbc82, 0x0125962f, 0x01182895, 0x02faea67, 0x001d49b9}}, Y: Field{[10]uint32{0x00e3a674, 0x023d2306, 0x01ae8f00, 0x02b04b8d, 0x0125a21f, 0x02cc8dd4, 0x0274411c, 0x01846f4c, 0x00e0d5a8, 0x000b1daa}}}, + {X: Field{[10]uint32{0x0079308d, 0x0141c3e2, 0x00b2ab78, 0x000e24fa, 0x02e737c8, 0x0067d47d, 0x01d5d897, 0x0128f5b4, 0x02da56d6, 0x003f32aa}}, Y: Field{[10]uint32{0x039362d1, 0x0171aa11, 0x03d7d868, 0x034ff9b9, 0x01a2ee95, 0x025a7eae, 0x01750efa, 0x03de4bbf, 0x01663fac, 0x002098b1}}}, + {X: Field{[10]uint32{0x01b57fe3, 0x012c4556, 0x0088afef, 0x02a2ce9a, 0x03bd6d91, 0x028e5e11, 0x00483797, 0x017d0f31, 0x03b8eb8a, 0x002d8344}}, Y: Field{[10]uint32{0x00ebaa54, 0x033e0e18, 0x038ae94e, 0x014cdd56, 0x038405b0, 0x032217c7, 0x0104acbe, 0x021615d8, 0x02be5d2b, 0x002afdcf}}}, + {X: Field{[10]uint32{0x0377f8be, 0x039b3a30, 0x02d90127, 0x019b7ea8, 0x014250fd, 0x00de7e49, 0x016d2c14, 0x0361cbff, 0x030f4a0d, 0x000ccb52}}, Y: Field{[10]uint32{0x03c6232b, 0x021f3cc6, 0x02354b78, 0x033761f3, 0x03110dfa, 0x0382c5fa, 0x0333d7d9, 0x00d42fd0, 0x014347c2, 0x0000dfcc}}}, + {X: Field{[10]uint32{0x00c5788f, 0x03be1ed3, 0x0394e52d, 0x0082d556, 0x025d0216, 0x01ef44e3, 0x020e8803, 0x0358cc07, 0x02e62ce6, 0x003a66cb}}, Y: Field{[10]uint32{0x025546bc, 0x01210593, 0x03c6d2c0, 0x030ae469, 0x00e2858d, 0x02ecf954, 0x031df268, 0x032a7db7, 0x02fedabc, 0x00327a81}}}, + {X: Field{[10]uint32{0x01c54353, 0x0015b712, 0x033b1dfb, 0x0247a015, 0x005af241, 0x01c666f7, 0x02692a1d, 0x01ebb9ff, 0x00382a97, 0x00227ab5}}, Y: Field{[10]uint32{0x01994ece, 0x003e6bf6, 0x0319c2de, 0x00efaf97, 0x0107fec4, 0x02dc042b, 0x0167f706, 0x01ddb0aa, 0x01cedb2d, 0x002d5cb7}}}, + {X: Field{[10]uint32{0x0198268f, 0x021ed3b5, 0x01488595, 0x03fec243, 0x004777ba, 0x0231d016, 0x006f6fa9, 0x0104fc2d, 0x018e529b, 0x000336b6}}, Y: Field{[10]uint32{0x03ed034e, 0x03ba0c2f, 0x00cac3ef, 0x0205e22c, 0x02ceabc2, 0x0087e1e1, 0x00f10db8, 0x0398e51c, 0x015e0543, 0x0035016a}}}, + {X: Field{[10]uint32{0x02ee2cc3, 0x00a43921, 0x00f5be41, 0x0275783d, 0x02c26984, 0x0330c502, 0x03f69ad3, 0x00ccaf99, 0x03411cc1, 0x001425bb}}, Y: Field{[10]uint32{0x03f8268a, 0x0114d0dc, 0x02bb418c, 0x029bcb51, 0x0149ef34, 0x0029ecfc, 0x021f3123, 0x02c1afb5, 0x029fccd4, 0x001fcce1}}}, + {X: Field{[10]uint32{0x00a5be61, 0x03d838a9, 0x00dbb8b9, 0x03b58e3b, 0x038c4d59, 0x0322fa61, 0x007253a2, 0x019cd218, 0x0270a096, 0x002f02fa}}, Y: Field{[10]uint32{0x02873b78, 0x03883345, 0x03320873, 0x03c0a777, 0x01054d1f, 0x01b1309d, 0x0286129e, 0x01382c12, 0x01ac3c2b, 0x00386444}}}, + {X: Field{[10]uint32{0x03223ec1, 0x014500e1, 0x007a7dc4, 0x02297210, 0x03b024bb, 0x02a9f5d1, 0x00674d38, 0x01682038, 0x0169ac8f, 0x000b4599}}, Y: Field{[10]uint32{0x019a597a, 0x006f5df8, 0x038f73dd, 0x021f8888, 0x01445c15, 0x03bb1396, 0x027d92d4, 0x01a97c4a, 0x03386221, 0x00122bc6}}}, + {X: Field{[10]uint32{0x0145ba30, 0x03a2dfe0, 0x01d40f27, 0x037f8f3c, 0x012947cd, 0x01bb1ded, 0x00e37b32, 0x00454377, 0x03aebb8b, 0x002e32f3}}, Y: Field{[10]uint32{0x00823ca4, 0x01bf76cd, 0x01a0562b, 0x03ef357d, 0x00ffc2c3, 0x021a287a, 0x030ec022, 0x034b7218, 0x00ab8b2a, 0x003548d3}}}, + {X: Field{[10]uint32{0x00960ee7, 0x02abb1b7, 0x02a227a9, 0x02f9823b, 0x01fb2e3e, 0x006b0676, 0x01db9c0f, 0x004bd377, 0x0092563f, 0x003ece58}}, Y: Field{[10]uint32{0x01823c45, 0x02798bb2, 0x0395358c, 0x02ec1a50, 0x01646e88, 0x00bac07a, 0x027f661c, 0x028e50f4, 0x01dffda1, 0x00197959}}}, + {X: Field{[10]uint32{0x0014b297, 0x03fe9529, 0x0022580a, 0x03b88400, 0x02f8da06, 0x02c89d2c, 0x0225150d, 0x0337ea41, 0x01760b8d, 0x00071ba7}}, Y: Field{[10]uint32{0x01666255, 0x02f0bbe9, 0x00057607, 0x02e5e35d, 0x0085679f, 0x02fb62c4, 0x026edcbb, 0x02c2c151, 0x010d009a, 0x001c1ad1}}}, + {X: Field{[10]uint32{0x01fca1c3, 0x0180d46e, 0x00277dc6, 0x00355578, 0x0377f55a, 0x026173b2, 0x0166b13d, 0x03fc39b9, 0x01c146ec, 0x000b810f}}, Y: Field{[10]uint32{0x026d8398, 0x01c7915c, 0x00e1428a, 0x0000aab1, 0x03665da5, 0x02429eaf, 0x011103b0, 0x03abc281, 0x01caf75c, 0x0000713c}}}, + {X: Field{[10]uint32{0x005f482f, 0x002f2696, 0x0192cb4b, 0x03b8b625, 0x019549f9, 0x025f5e15, 0x023ee12d, 0x023a4399, 0x030ca1bf, 0x0016b85e}}, Y: Field{[10]uint32{0x00fc8111, 0x008daf2d, 0x031c716f, 0x02b6235c, 0x03a71806, 0x03a3969d, 0x006966c1, 0x0002f1cf, 0x03349317, 0x002ec37d}}}, + {X: Field{[10]uint32{0x03caafc4, 0x023d1a29, 0x0271c1b0, 0x037f241a, 0x00fca910, 0x01d7b6a5, 0x0011c46e, 0x030f974f, 0x03426a24, 0x003ea2fc}}, Y: Field{[10]uint32{0x035954e2, 0x02b6930b, 0x000435dc, 0x03e795f0, 0x014e2884, 0x016cf3c1, 0x01e6c846, 0x03ef678d, 0x017cdb07, 0x00329a60}}}, + {X: Field{[10]uint32{0x011a88a4, 0x0016bee6, 0x003cb0f9, 0x02d779c2, 0x011e1031, 0x00fd0e53, 0x01f67aea, 0x035fdee7, 0x01c1846d, 0x000b37fc}}, Y: Field{[10]uint32{0x0376f39e, 0x03fcf8bb, 0x00d3b507, 0x023e3959, 0x016ea0d8, 0x038c11c4, 0x00530fed, 0x0390adf4, 0x024f3827, 0x0012ef5c}}}, + {X: Field{[10]uint32{0x013b6905, 0x02ccc8a7, 0x02df95f5, 0x02472a50, 0x01c5bb82, 0x019413e2, 0x01f82b29, 0x0127b2bf, 0x000055ca, 0x001beb6f}}, Y: Field{[10]uint32{0x00b7df62, 0x03d5fbd5, 0x02868c06, 0x014fd64f, 0x03911a30, 0x03104645, 0x02f94728, 0x020c9a95, 0x0184033a, 0x003dd9c4}}}, + {X: Field{[10]uint32{0x00dd0841, 0x0280392e, 0x01fca2f5, 0x00184964, 0x026f4a1e, 0x0357aa34, 0x02b15f55, 0x02a90373, 0x015a2f26, 0x0031451a}}, Y: Field{[10]uint32{0x0113266c, 0x014a0eac, 0x03a6e800, 0x02c45b63, 0x01652905, 0x00ff13bc, 0x01375677, 0x02c1aa42, 0x02082e78, 0x001415ae}}}, + {X: Field{[10]uint32{0x037ff933, 0x004785b2, 0x0306466c, 0x03bbf747, 0x01aad758, 0x03862304, 0x00368dd3, 0x013e1553, 0x00d49347, 0x0020f72e}}, Y: Field{[10]uint32{0x030a53c7, 0x022f6118, 0x02288e9f, 0x03ec3987, 0x030d6ed6, 0x004679e7, 0x027a029e, 0x01c649f1, 0x033d04e5, 0x00041396}}}, + {X: Field{[10]uint32{0x00c8a93f, 0x032aec7f, 0x01127a8b, 0x0208b8ac, 0x015f9ae8, 0x01597e6a, 0x03690890, 0x002c990e, 0x038acf9a, 0x002f1973}}, Y: Field{[10]uint32{0x00fb2143, 0x030a4a85, 0x039c3ae9, 0x03045569, 0x0023ff28, 0x019a66de, 0x000ac90f, 0x03741a82, 0x016ba31d, 0x003f7e5c}}}, + {X: Field{[10]uint32{0x009f140b, 0x0272f493, 0x0153c1e0, 0x035901c3, 0x02695e37, 0x016b4de8, 0x0174b476, 0x004a904b, 0x03a9520b, 0x00121de3}}, Y: Field{[10]uint32{0x029c373e, 0x0328875d, 0x01b39fbe, 0x0316cb8d, 0x01446dd3, 0x03146d1a, 0x03b4c02b, 0x016500e1, 0x0005bec1, 0x00337192}}}, + {X: Field{[10]uint32{0x0301dc25, 0x019f77e8, 0x006e841f, 0x02d4cb46, 0x0328077b, 0x03b5a1cf, 0x01c88312, 0x01621a3b, 0x002c6a73, 0x00276cb1}}, Y: Field{[10]uint32{0x03b3a0dc, 0x024098af, 0x00ac8569, 0x0351e1b4, 0x00aa0ac5, 0x01a8c96c, 0x0193e064, 0x02d17b84, 0x0235ec9d, 0x0038072c}}}, + {X: Field{[10]uint32{0x00f8da6b, 0x0201cd27, 0x012aefb2, 0x023c925b, 0x03037c6c, 0x015ac9ff, 0x021ef442, 0x0009690e, 0x018f62bf, 0x0032f3fd}}, Y: Field{[10]uint32{0x03b1896d, 0x0379b94e, 0x01da2818, 0x006f0440, 0x0128f533, 0x00784daf, 0x029251fe, 0x009d4c0e, 0x02d52da3, 0x0013f667}}}, + {X: Field{[10]uint32{0x034f3639, 0x019c94db, 0x00270933, 0x03ce45e2, 0x02070cbc, 0x00ec77e5, 0x03a12a29, 0x02311605, 0x039787e6, 0x00275482}}, Y: Field{[10]uint32{0x02bc0f14, 0x027b3bed, 0x036bb22d, 0x001e763e, 0x01041fec, 0x028c9589, 0x01885ca0, 0x02625764, 0x015d2b53, 0x00185784}}}, + {X: Field{[10]uint32{0x0225dbbd, 0x01a8d064, 0x02e7b3ef, 0x00f7e0ec, 0x024b0bfd, 0x02331b5b, 0x023d1820, 0x030af2f0, 0x01c40057, 0x00319237}}, Y: Field{[10]uint32{0x018ab3d8, 0x029fef14, 0x02caf209, 0x0187705f, 0x01ec16fe, 0x019e8f67, 0x0347e99e, 0x00659a6e, 0x006338dd, 0x0002b26a}}}, + {X: Field{[10]uint32{0x002137dc, 0x0259187a, 0x0229a7e5, 0x00a5ed17, 0x02b80ead, 0x0248877b, 0x01e3f1e7, 0x03dd9ebf, 0x0035ea96, 0x002b847e}}, Y: Field{[10]uint32{0x00452596, 0x0085e393, 0x01a15c2a, 0x0395397e, 0x034c5dfe, 0x00654eb2, 0x016e1b5f, 0x018bca26, 0x03ecb65a, 0x0008114e}}}, + {X: Field{[10]uint32{0x0364d46f, 0x00a03428, 0x00fec029, 0x03f8d970, 0x000699f6, 0x023bd44a, 0x03b9293d, 0x02993748, 0x01ad56f8, 0x0028d552}}, Y: Field{[10]uint32{0x03fbbe75, 0x0335b842, 0x00868f11, 0x02480f19, 0x008f55a2, 0x01fffb38, 0x015ffce1, 0x026604c0, 0x01cba38c, 0x00321010}}}, + {X: Field{[10]uint32{0x035f8077, 0x011c25f8, 0x03a649c3, 0x0020351c, 0x022aad83, 0x01f6b226, 0x01bfaef3, 0x01d78423, 0x0029af55, 0x001d61dc}}, Y: Field{[10]uint32{0x03c2b8b6, 0x02a173d7, 0x0165b2e5, 0x01d085b3, 0x01603cd6, 0x005df31a, 0x02437620, 0x0146efb4, 0x0097d198, 0x00210ec1}}}, + {X: Field{[10]uint32{0x02d4ea99, 0x0181fecc, 0x031ca917, 0x03a43cba, 0x01ae00b9, 0x00f94cb0, 0x027b1f68, 0x03f54311, 0x0168ca7f, 0x00113b8c}}, Y: Field{[10]uint32{0x012c3270, 0x00fadff2, 0x001411e7, 0x038e6e5b, 0x03022564, 0x024443bb, 0x01a9f9a0, 0x01684efb, 0x02a8120b, 0x00042883}}}, + {X: Field{[10]uint32{0x025337d4, 0x02dbd99e, 0x007d6477, 0x02550b2c, 0x01461e45, 0x00eee632, 0x0278f92f, 0x02bc2e41, 0x00898daf, 0x0026804f}}, Y: Field{[10]uint32{0x023c2a73, 0x012e87f6, 0x0205e877, 0x03c7fd4c, 0x03fec396, 0x017367f2, 0x009b773f, 0x008e939b, 0x005ac966, 0x00047e12}}}, + {X: Field{[10]uint32{0x02b47d5c, 0x01cf5a6d, 0x01bea83e, 0x005cae2d, 0x013fa12d, 0x03d42cd2, 0x0019a615, 0x01060882, 0x00a144d5, 0x002d178a}}, Y: Field{[10]uint32{0x02c29f4b, 0x01b0c1a4, 0x00ae45b7, 0x0248256f, 0x03fb1c20, 0x00e65c94, 0x03f1dec4, 0x0334877f, 0x0383ccda, 0x003661f6}}}, + {X: Field{[10]uint32{0x0241a0c9, 0x000f4d69, 0x02603cdc, 0x0014074a, 0x009a6592, 0x004064be, 0x0065d073, 0x016222a2, 0x02534984, 0x00279f5a}}, Y: Field{[10]uint32{0x00f462d9, 0x00052615, 0x033233c0, 0x02f2c87e, 0x02ce5f1f, 0x0134702c, 0x03e5690b, 0x027e9fd5, 0x00edace2, 0x003285dd}}}, + {X: Field{[10]uint32{0x00991f47, 0x03fa90d5, 0x00b01b9a, 0x01023bc5, 0x03e433a9, 0x02017058, 0x03b306d5, 0x0184f159, 0x0029be1b, 0x00044e85}}, Y: Field{[10]uint32{0x03928697, 0x005159de, 0x023c7500, 0x0006454a, 0x000321e8, 0x01478e17, 0x0191ec1a, 0x032ee124, 0x01fa6d26, 0x000897b9}}}, + {X: Field{[10]uint32{0x018d9181, 0x01575c50, 0x03964776, 0x029b4375, 0x016d6eb0, 0x01ac017a, 0x01e2597f, 0x02177e4c, 0x01d102cf, 0x000cbb23}}, Y: Field{[10]uint32{0x03f9d8b9, 0x035eeeeb, 0x022ab00d, 0x001786a8, 0x003423bc, 0x0310c1d9, 0x02f7f4d9, 0x0392966f, 0x01d078b3, 0x003f5c63}}}, + {X: Field{[10]uint32{0x02e9246e, 0x0063a45c, 0x03865b12, 0x01c3bd1d, 0x01b145db, 0x018547e2, 0x021a5f14, 0x036b9017, 0x0267f2ce, 0x002b690c}}, Y: Field{[10]uint32{0x007cf82c, 0x038352c9, 0x00a541f3, 0x021b0acb, 0x0116e396, 0x02c11d1a, 0x0315c578, 0x0134a7e7, 0x02e04d1f, 0x0034522f}}}, + {X: Field{[10]uint32{0x01bf0cbe, 0x02e611e5, 0x006bbbf7, 0x001c805f, 0x0265f5ca, 0x036e8694, 0x03e662be, 0x01d29a47, 0x02bedebd, 0x00206282}}, Y: Field{[10]uint32{0x009c0a53, 0x006738c2, 0x03bc8da7, 0x00ee4240, 0x030ac0f0, 0x0389cede, 0x008da9bc, 0x00b1cda6, 0x006a0187, 0x0039ecb4}}}, + {X: Field{[10]uint32{0x010b3c94, 0x02fa041f, 0x02f14d80, 0x01b7cb44, 0x02ae7602, 0x0165bc27, 0x00c1a1bf, 0x03684201, 0x0355ef77, 0x000bd27a}}, Y: Field{[10]uint32{0x02038b83, 0x0138e0cf, 0x02ffa569, 0x01ae00b2, 0x011a7903, 0x01b533b4, 0x0289aa1e, 0x004463ad, 0x0010002f, 0x001a8896}}}, + {X: Field{[10]uint32{0x02faf74a, 0x0314d4de, 0x0278ba5c, 0x031e61b1, 0x02bf66d5, 0x03b6f457, 0x02f8029b, 0x00097daf, 0x017054cb, 0x001ff953}}, Y: Field{[10]uint32{0x00ad89b0, 0x025b042d, 0x03695022, 0x03f76dd5, 0x00a47a82, 0x02462155, 0x016afb66, 0x0198c9b4, 0x03ec72ac, 0x003f7185}}}, + {X: Field{[10]uint32{0x02ed2689, 0x028fdd63, 0x0131956a, 0x02eb7bb0, 0x03411ec9, 0x02e71575, 0x01b8675d, 0x02128327, 0x03662b82, 0x00213d64}}, Y: Field{[10]uint32{0x02cd0d88, 0x0263a0c2, 0x01dfe4de, 0x024bd07b, 0x01480425, 0x01144722, 0x01119c4c, 0x01bb5e09, 0x01d96bef, 0x0020db99}}}, + {X: Field{[10]uint32{0x0185ee1b, 0x029bed50, 0x01f52da0, 0x004978ad, 0x00a46b16, 0x033326ff, 0x02eb6b71, 0x02083781, 0x00301a84, 0x003242aa}}, Y: Field{[10]uint32{0x010dc8df, 0x00d48dfe, 0x02efb161, 0x01276489, 0x01cc2134, 0x02671628, 0x031e05cd, 0x01760a4c, 0x03c00b28, 0x003aa1b5}}}, + {X: Field{[10]uint32{0x012ef100, 0x01f65b86, 0x00addc05, 0x02b673f7, 0x018669b2, 0x00d850aa, 0x03047ef6, 0x0126f9a7, 0x0176abae, 0x003fed35}}, Y: Field{[10]uint32{0x03ec6c7a, 0x024406ed, 0x0012080a, 0x01b6948e, 0x013d9596, 0x0203daa3, 0x02700e4c, 0x038060ce, 0x0114b2d5, 0x000dd033}}}, + {X: Field{[10]uint32{0x01403de0, 0x01e3f2b3, 0x00a3c08b, 0x0174b0cf, 0x0312c24b, 0x026bfbff, 0x03ebb618, 0x01af33ad, 0x018967ad, 0x001022a3}}, Y: Field{[10]uint32{0x01caecf3, 0x02f391f8, 0x013a2cdc, 0x015ff58c, 0x014acd35, 0x007605c7, 0x00fb66ff, 0x0310ba8a, 0x03a6378c, 0x000edd87}}}, + {X: Field{[10]uint32{0x0053b787, 0x0120ba1f, 0x027123e3, 0x013c60c9, 0x006c80c0, 0x006c2ac1, 0x01e27e3f, 0x00276ff7, 0x03f61531, 0x0016028c}}, Y: Field{[10]uint32{0x0028431a, 0x00d4f039, 0x02dd801d, 0x028d58e6, 0x02f70a33, 0x025c0bfd, 0x01ac5ae6, 0x020783a6, 0x03c3fddc, 0x002ee01c}}}, + {X: Field{[10]uint32{0x0344130f, 0x039e27e0, 0x018c2505, 0x036ce31a, 0x014c7860, 0x020d26b4, 0x02b11008, 0x03332b11, 0x02947054, 0x000b4c42}}, Y: Field{[10]uint32{0x023db697, 0x0237204f, 0x02a9a5d2, 0x0168b89a, 0x022df187, 0x0244f643, 0x011be0a0, 0x03243a70, 0x029c3c6e, 0x0007a881}}}, + {X: Field{[10]uint32{0x027aa450, 0x008c7e1a, 0x03b32985, 0x009091a5, 0x015d82b4, 0x02e0d6bb, 0x022f2e3a, 0x0072b4fc, 0x002be7b1, 0x000a1d0a}}, Y: Field{[10]uint32{0x00415c42, 0x008c5c7c, 0x02b74cfa, 0x000c87c9, 0x02cf39ce, 0x0107642e, 0x02e3860e, 0x02e48888, 0x032db2e1, 0x0000a18c}}}, + {X: Field{[10]uint32{0x036231cf, 0x01b9007a, 0x02ea48b3, 0x016e54c3, 0x016940f8, 0x00adde60, 0x02f5e418, 0x03ce8042, 0x039ff77b, 0x002be79d}}, Y: Field{[10]uint32{0x00e84c67, 0x03dd5066, 0x03389c13, 0x020eac7f, 0x034deb70, 0x01b5ae23, 0x01d958b8, 0x0057249a, 0x0350dbaf, 0x00274f50}}}, + {X: Field{[10]uint32{0x008c1ef3, 0x00740d5a, 0x01b35447, 0x02302998, 0x00bc93ad, 0x00ec9de3, 0x03d27577, 0x029cd49b, 0x038d515c, 0x001117b6}}, Y: Field{[10]uint32{0x0090dc49, 0x0193c95c, 0x002f555d, 0x0269154e, 0x02e94b75, 0x03cda84f, 0x03743611, 0x018be0ed, 0x023cfde7, 0x0025245e}}}, + {X: Field{[10]uint32{0x001811b4, 0x01d4049c, 0x012aa0dc, 0x02e8ad98, 0x013e76fe, 0x01fb0d34, 0x009993cf, 0x014c183e, 0x020a370d, 0x00380430}}, Y: Field{[10]uint32{0x006fd8af, 0x03d93fc4, 0x023cee3a, 0x009bc857, 0x03798a64, 0x032cf311, 0x0157a214, 0x026f814b, 0x032d280d, 0x0032d145}}}, + {X: Field{[10]uint32{0x025af8f9, 0x0108d4ab, 0x033f9eed, 0x00ed9eed, 0x02ef548b, 0x03ed1334, 0x0134080c, 0x031f96c4, 0x03ca4625, 0x0034d09d}}, Y: Field{[10]uint32{0x03e4a4df, 0x03963235, 0x02b441ec, 0x026b389e, 0x02c39190, 0x038fd13b, 0x037bd609, 0x023dfaec, 0x03797a62, 0x0028d7d5}}}, + {X: Field{[10]uint32{0x031d628d, 0x017bb2b2, 0x01c5dd66, 0x030f27ec, 0x03d96182, 0x0291ccf8, 0x004977fe, 0x010906da, 0x03993bd5, 0x002f82e4}}, Y: Field{[10]uint32{0x03b7fdb8, 0x016fa103, 0x009dadbf, 0x003c17ec, 0x0013218b, 0x03b10626, 0x03762728, 0x0349a837, 0x0353744e, 0x000de410}}}, + {X: Field{[10]uint32{0x018f3980, 0x00b0c67f, 0x0309dc3b, 0x00d3a04b, 0x01edd9bd, 0x01ad0a0a, 0x019f48fd, 0x0087a47b, 0x01f1ed4a, 0x000c20a5}}, Y: Field{[10]uint32{0x02ac0230, 0x02975fab, 0x00181a8b, 0x00d225f1, 0x030797d4, 0x03b93328, 0x0214c314, 0x00386926, 0x034d5c36, 0x001a0d70}}}, + {X: Field{[10]uint32{0x00495b1a, 0x0236ccb7, 0x03b412b8, 0x01799a8d, 0x01c2e07a, 0x0043d7e9, 0x0391604e, 0x021e77f5, 0x035161aa, 0x0019b3fa}}, Y: Field{[10]uint32{0x0252a1e1, 0x03e726cc, 0x03fe3f9f, 0x0317edba, 0x025ffba9, 0x0120ef09, 0x0229602b, 0x03f004f8, 0x029bf8a2, 0x0028381e}}}, + {X: Field{[10]uint32{0x03e39ba4, 0x02168b5b, 0x03648ec8, 0x03be6d57, 0x01bf7b3a, 0x00d29284, 0x03b3d9d3, 0x03a9c133, 0x00fb849c, 0x0003d0ae}}, Y: Field{[10]uint32{0x01e8b22f, 0x03458298, 0x019a7036, 0x012af27c, 0x01f5b0fb, 0x034e06b8, 0x035db65d, 0x012bfe7d, 0x01e2a36d, 0x002d8188}}}, + {X: Field{[10]uint32{0x03ab034f, 0x00c4952f, 0x008e385a, 0x03698233, 0x00c57b7f, 0x0199be3d, 0x00fdc462, 0x018c8cbb, 0x03852290, 0x0010a705}}, Y: Field{[10]uint32{0x0162af35, 0x02605aca, 0x001f18e6, 0x027aaf25, 0x0250b396, 0x0206a813, 0x03bfcb04, 0x023d5d02, 0x02591a86, 0x0038642e}}}, + {X: Field{[10]uint32{0x01ebf611, 0x037dee03, 0x03d7dfaf, 0x0215bf19, 0x009895b9, 0x02cde3b9, 0x01e4237f, 0x026832e5, 0x017c9478, 0x003224e7}}, Y: Field{[10]uint32{0x00ad3682, 0x003e07c7, 0x022b0437, 0x01fa6c57, 0x0047feb7, 0x0018b4b5, 0x02d05e23, 0x01185f0d, 0x036206e9, 0x00050ebf}}}, + {X: Field{[10]uint32{0x0398ef94, 0x01bcf310, 0x00cfb1d3, 0x02de370f, 0x022b82ae, 0x010ab607, 0x0215ae41, 0x00c90c93, 0x01bf5630, 0x00179055}}, Y: Field{[10]uint32{0x035da55a, 0x03d3fd7a, 0x03b75ed6, 0x019080fc, 0x01b90833, 0x005b5d09, 0x033807f2, 0x028ee6a7, 0x01272325, 0x001a007d}}}, + {X: Field{[10]uint32{0x00d1b573, 0x036f4fc2, 0x0165b5e9, 0x00c181e2, 0x03eb01c5, 0x01c45388, 0x03fa851a, 0x024ef9ee, 0x019853f0, 0x000465ac}}, Y: Field{[10]uint32{0x00628795, 0x015ff4af, 0x0297e5c5, 0x03b7fbc2, 0x00fe79dc, 0x0060f6d1, 0x00dea44d, 0x03b88360, 0x00f054bf, 0x00001e53}}}, + {X: Field{[10]uint32{0x033a6094, 0x00dbb4b1, 0x03a1dea8, 0x017dadda, 0x0339803e, 0x01a00c38, 0x038fcd01, 0x01cdedf6, 0x012074bb, 0x00360636}}, Y: Field{[10]uint32{0x0176e504, 0x01bc5e40, 0x00afe9d9, 0x006fed33, 0x02ff15d5, 0x02d7c21b, 0x00d2aacf, 0x00462a03, 0x03b51f63, 0x001ab1f6}}}, + {X: Field{[10]uint32{0x006c6204, 0x02d193ec, 0x02d8851d, 0x00b6c9cf, 0x01703904, 0x02b97262, 0x01a433ee, 0x02afa7b6, 0x034bf5cc, 0x003009da}}, Y: Field{[10]uint32{0x00f4756b, 0x00bbf289, 0x02cc5fd5, 0x03526cfe, 0x00972593, 0x02160548, 0x001a582a, 0x02b20752, 0x00ae6349, 0x0012249c}}}, + {X: Field{[10]uint32{0x01d83307, 0x00d0f5f3, 0x00a7a0d3, 0x00187136, 0x020b8989, 0x00f42c92, 0x01b300b4, 0x0334c3ae, 0x021cca23, 0x000252ca}}, Y: Field{[10]uint32{0x02481df1, 0x014c0be7, 0x00640607, 0x020e6694, 0x02e6e746, 0x020ce2e7, 0x01608015, 0x02f7296e, 0x0156b709, 0x0011f17b}}}, + {X: Field{[10]uint32{0x027d5108, 0x01a21dab, 0x0195a668, 0x00af4d16, 0x009f157d, 0x030a3ed9, 0x021c3850, 0x03d53b92, 0x0379df2b, 0x003cabb8}}, Y: Field{[10]uint32{0x01c8ef08, 0x00b7558d, 0x0231113f, 0x023ef55a, 0x0319a7bf, 0x019dbbbe, 0x0079d351, 0x0287e724, 0x03ae9c90, 0x002b9d9a}}}, + {X: Field{[10]uint32{0x029833ad, 0x01aee16e, 0x02222830, 0x028115b3, 0x01e81e4d, 0x018071aa, 0x029cd043, 0x0312cabe, 0x004f3dbd, 0x003f23f9}}, Y: Field{[10]uint32{0x0156fe15, 0x001d4e1b, 0x01094ce3, 0x017b3a31, 0x012b0765, 0x029420ae, 0x0330a52e, 0x014b5d90, 0x0378a98f, 0x001a8c86}}}, + {X: Field{[10]uint32{0x00255c14, 0x02d19393, 0x02b7c5b8, 0x012d60c3, 0x017444d0, 0x00b77043, 0x01aa3ebe, 0x03cf2fef, 0x017919a4, 0x0034e337}}, Y: Field{[10]uint32{0x008c15fa, 0x0195544b, 0x02e6f1a5, 0x0254776a, 0x03e19040, 0x0336baf9, 0x02311fe0, 0x00bf6e52, 0x02f1823a, 0x001a83c7}}}, + {X: Field{[10]uint32{0x01a4b41f, 0x011d4e02, 0x03f4c142, 0x00675ddc, 0x03916ea1, 0x009ad7a7, 0x0071943a, 0x021a4343, 0x02f6013d, 0x002b00b9}}, Y: Field{[10]uint32{0x005ea2b1, 0x00c6e9b0, 0x008f3995, 0x00650ddc, 0x03726598, 0x023f4bd9, 0x019c5e76, 0x013aaefb, 0x019e436b, 0x003ab712}}}, + {X: Field{[10]uint32{0x006419c8, 0x026dc074, 0x01177d7d, 0x01d47fd9, 0x02dc6d1a, 0x001dbe73, 0x03b5cd07, 0x03518ab1, 0x031ac36b, 0x0000e522}}, Y: Field{[10]uint32{0x011765ba, 0x02ee5746, 0x00bd2732, 0x0239de59, 0x0372d5d1, 0x0333ad87, 0x0141ea71, 0x000f1eac, 0x00eba01c, 0x0032a47f}}}, + {X: Field{[10]uint32{0x02706e9a, 0x00c65c5f, 0x0355435e, 0x034176f2, 0x02ea9e73, 0x03ff6210, 0x014c0c2c, 0x000369b7, 0x008d21d6, 0x00131f6f}}, Y: Field{[10]uint32{0x038230fe, 0x0305fd49, 0x0042d35d, 0x02f6336d, 0x016db46e, 0x01fdfa16, 0x002f4129, 0x01eaf4a7, 0x0344b87b, 0x0021a9df}}}, + {X: Field{[10]uint32{0x0244f623, 0x03847920, 0x01e0698e, 0x00c7677d, 0x01b7dec7, 0x001d0ec3, 0x038c2f7a, 0x0178b427, 0x01aab382, 0x001d48a3}}, Y: Field{[10]uint32{0x000a1676, 0x0086a21e, 0x01aa4510, 0x01949829, 0x0075e336, 0x034a0ba9, 0x0237bdfe, 0x03c41f6e, 0x0187e122, 0x00258f0a}}}, + {X: Field{[10]uint32{0x0280a579, 0x034b0ac3, 0x00147632, 0x00fc40b0, 0x02b584a7, 0x006de91e, 0x02ea92c7, 0x00587e3d, 0x02b32ed2, 0x002a8ea1}}, Y: Field{[10]uint32{0x024e6cb7, 0x01806b6b, 0x002abbc4, 0x03fddc8b, 0x03f7e517, 0x00409135, 0x01345d32, 0x03193c37, 0x009d2b4e, 0x002e3f89}}}, + {X: Field{[10]uint32{0x013f22f7, 0x034c5906, 0x0368abcf, 0x01f4f4f0, 0x014c0322, 0x035bcebe, 0x00b992f7, 0x000e7696, 0x012d9828, 0x001c0ae4}}, Y: Field{[10]uint32{0x02bac387, 0x039710b1, 0x0136f71d, 0x02e8e5ab, 0x02b576cc, 0x01c5331f, 0x00a4e14c, 0x0335e04c, 0x00493a32, 0x0009624b}}}, + {X: Field{[10]uint32{0x0090ba75, 0x034ed727, 0x03567829, 0x00ee3dbc, 0x01269f70, 0x00315c04, 0x0221dfc1, 0x02fe98a8, 0x00886d44, 0x00132843}}, Y: Field{[10]uint32{0x03fde3e7, 0x00fb3ed3, 0x034b9dac, 0x0089fc0d, 0x0395b04a, 0x00b5df6c, 0x01e6f277, 0x038d6353, 0x02b29282, 0x000cc8fa}}}, + {X: Field{[10]uint32{0x02b9c325, 0x0159ce24, 0x02d342da, 0x00d4ba51, 0x00f3601c, 0x0305d3bf, 0x00aa4362, 0x01a5c80b, 0x023630da, 0x0005867a}}, Y: Field{[10]uint32{0x030e881e, 0x029cbe43, 0x02de4b98, 0x025e471f, 0x03a1c126, 0x01237b5e, 0x0188dd61, 0x019e7a9b, 0x000e13b8, 0x0008ab45}}}, + {X: Field{[10]uint32{0x034d3032, 0x02f4e634, 0x034c6365, 0x02ead941, 0x0064d589, 0x00c0be2b, 0x01409a8a, 0x02fed273, 0x003818de, 0x000877f7}}, Y: Field{[10]uint32{0x004099a9, 0x02c5f39e, 0x01c4579e, 0x00f885c9, 0x02106d19, 0x02d809b9, 0x006ddcdb, 0x0148129e, 0x02c20e83, 0x002eef9f}}}, + {X: Field{[10]uint32{0x01069fe1, 0x036f5021, 0x01bd1c0d, 0x00b82eec, 0x03036a47, 0x00b3383b, 0x02e99aa1, 0x006acb2e, 0x01dd802f, 0x00183ef9}}, Y: Field{[10]uint32{0x03349dc3, 0x02f94929, 0x013167f9, 0x02cade2c, 0x0399feb1, 0x015023c2, 0x03d07a68, 0x00135a0b, 0x03592dd3, 0x0003aa0e}}}, + {X: Field{[10]uint32{0x02147f96, 0x019db307, 0x0066ae29, 0x01e53712, 0x03dd7c24, 0x01650174, 0x008ee975, 0x0316eea1, 0x0065fdcd, 0x0032012d}}, Y: Field{[10]uint32{0x03adc5a2, 0x03bbbc96, 0x035223a7, 0x028b3e6e, 0x03fb10cc, 0x02e0a393, 0x02bf43a9, 0x00adc3af, 0x02b71fd8, 0x002a928b}}}, + {X: Field{[10]uint32{0x010336d9, 0x03674f75, 0x03b7bd96, 0x02ecc64b, 0x005c74cf, 0x030cbdb0, 0x011b3383, 0x00ed5771, 0x03e55137, 0x001de9b8}}, Y: Field{[10]uint32{0x006f047f, 0x0162dac3, 0x032b67d3, 0x01b8e15b, 0x035de35d, 0x03ff355c, 0x02075c10, 0x02b1c523, 0x026e86ef, 0x0008748c}}}, + {X: Field{[10]uint32{0x015f7a5a, 0x00758b43, 0x018c9473, 0x033d938f, 0x01a89d82, 0x01a93b19, 0x02706ff2, 0x03bb4999, 0x01874a72, 0x0021b770}}, Y: Field{[10]uint32{0x030cc29c, 0x03396ad3, 0x0295c443, 0x01781337, 0x0340507b, 0x028f9b72, 0x0217816b, 0x02848ea4, 0x0040ce45, 0x00147df3}}}, + {X: Field{[10]uint32{0x03d3beca, 0x025bcff1, 0x028ce4a5, 0x03be13a8, 0x038c80d5, 0x005578c9, 0x0108675a, 0x03ab11b0, 0x00f8db8e, 0x0033d274}}, Y: Field{[10]uint32{0x020086fc, 0x02e5b7d0, 0x02d41235, 0x02970c51, 0x007cdd64, 0x0186475a, 0x002dcd6a, 0x01d70fb6, 0x0341ebae, 0x001bff71}}}, + {X: Field{[10]uint32{0x035875f4, 0x0232d52d, 0x00381051, 0x01457f86, 0x00c9f5c8, 0x03849b3b, 0x020e8721, 0x019c88b5, 0x038957eb, 0x00075d7b}}, Y: Field{[10]uint32{0x038dbdb4, 0x027719ad, 0x033e37b9, 0x0095dd96, 0x01c20766, 0x03e8750a, 0x024ae2f5, 0x0158776f, 0x03dd9288, 0x0020b177}}}, + {X: Field{[10]uint32{0x03ad0689, 0x00b2a279, 0x036dca29, 0x038f1b76, 0x005bb5b7, 0x02540cd2, 0x00d94666, 0x01848a76, 0x0335f62e, 0x002fa92d}}, Y: Field{[10]uint32{0x03a08901, 0x0082b4c1, 0x0011cd8e, 0x00dbd4a8, 0x027cda58, 0x02df007c, 0x019a4517, 0x0278439f, 0x038a08ea, 0x002438c9}}}, + {X: Field{[10]uint32{0x0169f2bb, 0x00e5aa58, 0x037281af, 0x03c2ceb2, 0x02577f5c, 0x01756627, 0x010aaa27, 0x0145c063, 0x02dea90e, 0x003a16c2}}, Y: Field{[10]uint32{0x0250aaa8, 0x01fd6679, 0x03358066, 0x01a75020, 0x0230ef12, 0x015edfd6, 0x016fec57, 0x01d718e4, 0x00cd3ca1, 0x00350a5c}}}, + {X: Field{[10]uint32{0x03928934, 0x0390b628, 0x00f5e3ff, 0x0213008a, 0x0082ca55, 0x033df30b, 0x01ed550f, 0x00149b90, 0x02dd2405, 0x00365d64}}, Y: Field{[10]uint32{0x022d102e, 0x013713bf, 0x0126a217, 0x01149bcb, 0x024de0db, 0x0008dbd3, 0x01a3852a, 0x0070edd6, 0x01696bf0, 0x003ab1b0}}}, + {X: Field{[10]uint32{0x026e00e7, 0x00d7b859, 0x013ebedd, 0x01d56bad, 0x00fd7725, 0x023195de, 0x00e60a9a, 0x008388de, 0x02a450b6, 0x0003808f}}, Y: Field{[10]uint32{0x0094797e, 0x0198d4da, 0x01e306a9, 0x01338df8, 0x026bdd54, 0x02457d41, 0x020f0e78, 0x033e26c1, 0x00506dbd, 0x001393b6}}}, + {X: Field{[10]uint32{0x01935e5a, 0x0013b083, 0x01c9cc83, 0x00b70c0b, 0x02a7c0ec, 0x01aa15ef, 0x001b9f7e, 0x03f5ba96, 0x00955cd4, 0x001856d7}}, Y: Field{[10]uint32{0x015f4d46, 0x0086c53f, 0x038d36e4, 0x01d3cda9, 0x0146fc80, 0x0175d536, 0x01845bff, 0x00c96ef3, 0x03662602, 0x00308871}}}, + {X: Field{[10]uint32{0x02ec13a7, 0x031cd625, 0x0185bc2c, 0x02168012, 0x03fa2a0d, 0x004e46f6, 0x00e34d60, 0x008086e7, 0x003402e1, 0x002c77e9}}, Y: Field{[10]uint32{0x0348438e, 0x00fbd665, 0x03eadd10, 0x03316264, 0x0013c2a5, 0x01be062d, 0x03b7e9b0, 0x03e0a076, 0x015a8162, 0x003e8f44}}}, + {X: Field{[10]uint32{0x03eada7c, 0x028f272e, 0x0097436b, 0x02acc966, 0x0068c7e1, 0x0393b372, 0x0275b835, 0x011ff6b1, 0x001fafbe, 0x002d92d8}}, Y: Field{[10]uint32{0x01dbe68d, 0x0148dd3a, 0x007d85ea, 0x00355cd2, 0x02652ae9, 0x018b6f26, 0x03606624, 0x015d1bfa, 0x0039d231, 0x002bde30}}}, + {X: Field{[10]uint32{0x03b579cf, 0x03cc991a, 0x013364a0, 0x008d49c5, 0x01b0981f, 0x02535d59, 0x01027d4e, 0x036721b1, 0x0346fda1, 0x00150a74}}, Y: Field{[10]uint32{0x015b1880, 0x025a8ca6, 0x00f37ac6, 0x01654519, 0x02162d66, 0x035d18db, 0x00754dd2, 0x0364b8e4, 0x0197dfec, 0x0016e338}}}, + {X: Field{[10]uint32{0x026f005b, 0x0152c58a, 0x03f94ff9, 0x01a7cde1, 0x0020e216, 0x00105d27, 0x000bb781, 0x019c62c1, 0x00f2056d, 0x002241a5}}, Y: Field{[10]uint32{0x01753341, 0x0070504b, 0x00df35df, 0x02dcc6e5, 0x007bf505, 0x01abf43e, 0x010d7b22, 0x02eff2ee, 0x034a890d, 0x003659a4}}}, + {X: Field{[10]uint32{0x003cc117, 0x00b0ad9d, 0x0067ccb9, 0x0079128a, 0x00269b5d, 0x03f81832, 0x02987a05, 0x009adfe9, 0x0292cd05, 0x000eb9d4}}, Y: Field{[10]uint32{0x02416a94, 0x028b757c, 0x02871d22, 0x03a61ee0, 0x00f004ee, 0x00cc95af, 0x03d5416a, 0x02a0b63d, 0x00c15a74, 0x00042567}}}, + {X: Field{[10]uint32{0x019b0707, 0x01771fca, 0x03ce93bb, 0x037a292a, 0x01347bba, 0x006e7e87, 0x0353fd5f, 0x01f55568, 0x029bff71, 0x00275d16}}, Y: Field{[10]uint32{0x02de8134, 0x030a399f, 0x0369b0ba, 0x03feb783, 0x0210461c, 0x039cd379, 0x004f615a, 0x031831cc, 0x00aed513, 0x0033bcce}}}, + {X: Field{[10]uint32{0x0144f166, 0x02e54674, 0x009f0aaa, 0x02599214, 0x00abf1b8, 0x0248b018, 0x01ce7f4f, 0x0324e441, 0x002c8130, 0x001a67a7}}, Y: Field{[10]uint32{0x003a19cd, 0x028e7b5f, 0x004a438d, 0x00a65f49, 0x01bfb7da, 0x00e0275a, 0x01145838, 0x03e51257, 0x010e1fb9, 0x00220ad2}}}, + {X: Field{[10]uint32{0x01591f87, 0x012869e1, 0x03550388, 0x02953d0c, 0x00ae79b4, 0x032ff8a6, 0x01ea704b, 0x001426a4, 0x00c1dc52, 0x0038e807}}, Y: Field{[10]uint32{0x02dcc64e, 0x005ff507, 0x00b96066, 0x0244dd24, 0x012480a8, 0x0376bd25, 0x0287e546, 0x02755ff2, 0x01f368d1, 0x003cf190}}}, + {X: Field{[10]uint32{0x02c433d1, 0x03b8e35a, 0x035f1ee5, 0x039bf63f, 0x00cc7cce, 0x01126145, 0x01d23623, 0x00dd751b, 0x01c3d9df, 0x00174543}}, Y: Field{[10]uint32{0x02ab0316, 0x00c5bad4, 0x00061a32, 0x03fafeb7, 0x02399a83, 0x02100424, 0x000263f1, 0x03a839f6, 0x0250d2e2, 0x000b0244}}}, + {X: Field{[10]uint32{0x00996a66, 0x003170b8, 0x02b16c10, 0x0201629b, 0x00ec4778, 0x038047e0, 0x00aea5b5, 0x02e8fd91, 0x0361bb12, 0x00127ee5}}, Y: Field{[10]uint32{0x0255e23c, 0x033f41b5, 0x00370089, 0x006e4a5e, 0x00d9086b, 0x00595317, 0x0099caf2, 0x02245161, 0x020fb720, 0x001c4d08}}}, + {X: Field{[10]uint32{0x0244738e, 0x0032514a, 0x03b13d53, 0x01687d3d, 0x00bdea05, 0x02b73770, 0x03990211, 0x00b7ef79, 0x02b3a451, 0x000d3157}}, Y: Field{[10]uint32{0x0398fd16, 0x02693153, 0x021f2ba3, 0x0254c8cc, 0x010fdbb6, 0x00325e79, 0x0110e26d, 0x01007e6a, 0x0288beff, 0x00096331}}}, + {X: Field{[10]uint32{0x00a3a98c, 0x0023508c, 0x0202ab25, 0x03c8c371, 0x039b1c39, 0x02bc3272, 0x037b82c2, 0x03f8013f, 0x00f07c3e, 0x001c1a3f}}, Y: Field{[10]uint32{0x037ef1fc, 0x02c65eb8, 0x01d77aaa, 0x01e5f8b8, 0x012fe506, 0x000ad77d, 0x03657bf2, 0x01e314b9, 0x00d88445, 0x003921cc}}}, + {X: Field{[10]uint32{0x03355a1e, 0x02e1d3da, 0x01909f73, 0x01528ac0, 0x02f49e52, 0x03a38d1b, 0x03a1f95a, 0x02aa844a, 0x0110a987, 0x00038762}}, Y: Field{[10]uint32{0x03e3cdb8, 0x02ae41c3, 0x00235d7b, 0x008282e4, 0x01d4a56a, 0x03f57167, 0x01c2c149, 0x011f6266, 0x011bcc49, 0x0022b40c}}}, + {X: Field{[10]uint32{0x02d2caf2, 0x02b0f2dc, 0x03d57c10, 0x0363b536, 0x006bdf06, 0x01837d17, 0x02c6b2dc, 0x018c6c05, 0x03880ba8, 0x00249426}}, Y: Field{[10]uint32{0x006a3ccf, 0x022bd61d, 0x038c3397, 0x00ccd776, 0x01ee6f0f, 0x0257c504, 0x0395651b, 0x018a66a7, 0x0231633b, 0x000fa91e}}}, + {X: Field{[10]uint32{0x0266a519, 0x00d5ab06, 0x0351206a, 0x0078d371, 0x01644647, 0x02df4a69, 0x02ec994d, 0x0017a65a, 0x002ae8d5, 0x00243f50}}, Y: Field{[10]uint32{0x02da3b6b, 0x0162e96e, 0x02a62e19, 0x01611aaa, 0x039a6dc6, 0x0313c399, 0x0231816e, 0x00db82b6, 0x03f7bcdc, 0x0001a303}}}, + {X: Field{[10]uint32{0x01400704, 0x024367ea, 0x005f5eb3, 0x01fc319b, 0x0004cbc7, 0x0104ac4a, 0x035b0ddd, 0x032a3878, 0x02cb7d9b, 0x0002ce03}}, Y: Field{[10]uint32{0x006a01a4, 0x03d14321, 0x038a7d78, 0x036f87d7, 0x0118fa71, 0x00a75573, 0x01f69a72, 0x02de0c27, 0x009277d9, 0x003f4a88}}}, + {X: Field{[10]uint32{0x02b83f0c, 0x03bdec0c, 0x027520d3, 0x03bf33ca, 0x03f3d029, 0x01852495, 0x0066140b, 0x02db3dbe, 0x0041aecb, 0x001038b8}}, Y: Field{[10]uint32{0x002291f0, 0x01d131af, 0x01326704, 0x01063949, 0x01e1eda6, 0x005fc8ca, 0x02266794, 0x02223d53, 0x00a53c83, 0x000489c4}}}, + {X: Field{[10]uint32{0x02a03583, 0x03082a2a, 0x009c8c99, 0x02e7dded, 0x037d254e, 0x02bab33a, 0x013a38e9, 0x00c324e2, 0x03c43f4e, 0x00239827}}, Y: Field{[10]uint32{0x02c1a3e8, 0x028f70de, 0x0296d066, 0x01ec3835, 0x00837fb5, 0x0075c0de, 0x0259a86b, 0x005411fc, 0x006e9a82, 0x00251f13}}}, + {X: Field{[10]uint32{0x0035f5ce, 0x03020d7d, 0x020bb2ec, 0x00914bf3, 0x038d9c93, 0x02be26a3, 0x0098d001, 0x027f441a, 0x01b22bfe, 0x002e1c71}}, Y: Field{[10]uint32{0x031d3078, 0x015bc9a3, 0x00b64cd6, 0x03b80018, 0x03507fe8, 0x03c0e000, 0x007226b6, 0x003ba67e, 0x01a3ecbd, 0x0038c0b9}}}, + {X: Field{[10]uint32{0x00841682, 0x001f3554, 0x03f832ac, 0x015f33a1, 0x01c6f80f, 0x01bffd35, 0x01241709, 0x02246aed, 0x027e039e, 0x00149b6a}}, Y: Field{[10]uint32{0x03d210df, 0x0169552c, 0x01f43c5f, 0x02733171, 0x00c477bc, 0x02b503da, 0x00fd3975, 0x004c39d6, 0x00994fb7, 0x001a7c11}}}, + {X: Field{[10]uint32{0x021ad25a, 0x004be521, 0x01ba2edc, 0x01462b76, 0x015c031f, 0x03ed9be8, 0x027cc073, 0x00c15f39, 0x004a514e, 0x00305709}}, Y: Field{[10]uint32{0x02846c50, 0x00e5661c, 0x01b901ba, 0x037d72c1, 0x0016449d, 0x02f26a3f, 0x0234780b, 0x03225e37, 0x01acecc3, 0x0036c408}}}, + {X: Field{[10]uint32{0x02c1d388, 0x00d05cfa, 0x033443e2, 0x01db36df, 0x01d34948, 0x00374f71, 0x03638735, 0x000e36ce, 0x0319466a, 0x000df882}}, Y: Field{[10]uint32{0x003b89f0, 0x023bd8ff, 0x00f252d6, 0x01e7da7b, 0x025ea5bb, 0x036d5eae, 0x02bcfa27, 0x01078bb2, 0x02245465, 0x00002e02}}}, + {X: Field{[10]uint32{0x024ea528, 0x02393ed5, 0x01eabc59, 0x03241ffd, 0x016a0da5, 0x015e5629, 0x011cd81f, 0x00050acc, 0x0328feae, 0x001b4247}}, Y: Field{[10]uint32{0x01d07906, 0x00a418ff, 0x0274c27c, 0x01f16a2e, 0x026e9d9f, 0x03217748, 0x01897196, 0x029b04e0, 0x03f04d7e, 0x00122f25}}}, + {X: Field{[10]uint32{0x0354fd71, 0x018d782e, 0x008d35ca, 0x0334fb75, 0x02d3e545, 0x020676ff, 0x001664fb, 0x03ed5bb4, 0x0016a76e, 0x000ef6f5}}, Y: Field{[10]uint32{0x00eb0639, 0x03cdbd4b, 0x00d26a6b, 0x024e0ae6, 0x039a63a8, 0x007eeb63, 0x03016219, 0x0094ffbc, 0x01723ed7, 0x0029a553}}}, + {X: Field{[10]uint32{0x029d61ce, 0x022cb91f, 0x01237401, 0x0103661c, 0x00c41095, 0x02f0cfbc, 0x005d41a4, 0x02d57e30, 0x02a9f111, 0x0033538d}}, Y: Field{[10]uint32{0x014e3e57, 0x03188551, 0x02ddadf0, 0x02f09939, 0x03abded9, 0x014b7e01, 0x02f95ec4, 0x00b9a41b, 0x02165263, 0x0011e37e}}}, + {X: Field{[10]uint32{0x01f24efd, 0x02a7c44b, 0x031c6272, 0x01c4b9df, 0x02248457, 0x01c2b19f, 0x03214131, 0x027038ef, 0x004a09c5, 0x0003c8f3}}, Y: Field{[10]uint32{0x037fa4b2, 0x0179f715, 0x013da9ed, 0x0339d28f, 0x02dc71cd, 0x00bde919, 0x0358fc07, 0x03bff573, 0x007299b6, 0x003a4cef}}}, + {X: Field{[10]uint32{0x013c33e0, 0x01a56b7b, 0x0098931a, 0x01250d75, 0x0300d7a3, 0x02db6d88, 0x0046840c, 0x03acd6da, 0x01858c97, 0x00366319}}, Y: Field{[10]uint32{0x03114990, 0x02e18b78, 0x02eb2a85, 0x0068593c, 0x01ba1378, 0x00189ce5, 0x02c953c7, 0x020977ad, 0x0224ffe8, 0x00110ffa}}}, + {X: Field{[10]uint32{0x00744225, 0x01b99adb, 0x0085fa94, 0x03728924, 0x0165325d, 0x031d2a6f, 0x012b9d16, 0x036b86db, 0x02a6c055, 0x00089a76}}, Y: Field{[10]uint32{0x01bfb3dd, 0x00b726fd, 0x03dee235, 0x03ceed1f, 0x0130e14f, 0x010bbf73, 0x00f0fe6a, 0x00115ac2, 0x01f9a61f, 0x00056740}}}, + {X: Field{[10]uint32{0x027c48d5, 0x010300c5, 0x03ba4877, 0x02d08eb9, 0x01eb4d75, 0x011ac06b, 0x023880a5, 0x021e4a37, 0x00fd8eea, 0x000cd411}}, Y: Field{[10]uint32{0x02da1cc1, 0x01e8c273, 0x00226818, 0x027398f6, 0x000cfe1d, 0x015ecefa, 0x030f2bb7, 0x01aef18e, 0x03f52626, 0x001a7940}}}, + {X: Field{[10]uint32{0x03f6c512, 0x0317e68f, 0x03a5046b, 0x026d8dea, 0x01a601da, 0x01ef2b9d, 0x00ee87b0, 0x02a0f953, 0x023d86f9, 0x003b9e89}}, Y: Field{[10]uint32{0x01373d56, 0x020a4250, 0x00f6042d, 0x020c587e, 0x01222714, 0x01039d8d, 0x008ac1c8, 0x01a3a48e, 0x01922032, 0x0027f74c}}}, + {X: Field{[10]uint32{0x03f44245, 0x03975694, 0x02d976c5, 0x0111d9a8, 0x00bf95f3, 0x03d12a22, 0x03b6111e, 0x018c6db1, 0x03b336f1, 0x0014a6cc}}, Y: Field{[10]uint32{0x02061099, 0x002a15fa, 0x030004cf, 0x03ba7335, 0x036f29f9, 0x00a00927, 0x02bc1a03, 0x01bd28be, 0x010693da, 0x0004a158}}}, + {X: Field{[10]uint32{0x03df1849, 0x00f3596a, 0x0243dd3e, 0x014e3af4, 0x006a2513, 0x035956a2, 0x01337182, 0x03a7d46a, 0x006da6ce, 0x003caccd}}, Y: Field{[10]uint32{0x03b77da3, 0x00ec3ddd, 0x032e1f48, 0x032cc937, 0x0355aaef, 0x03d89e34, 0x00665262, 0x000ffa7a, 0x0228be77, 0x0035077d}}}, + {X: Field{[10]uint32{0x0182befa, 0x0166dc11, 0x0037b3f5, 0x00a88bce, 0x011db7a1, 0x0358e31f, 0x0103d045, 0x026319c3, 0x01bcf03d, 0x0014d7a7}}, Y: Field{[10]uint32{0x02358392, 0x0307d967, 0x024e740b, 0x01853d93, 0x0262ea47, 0x01fe0e12, 0x00fa98d6, 0x025f16f5, 0x0228bad8, 0x000b08cc}}}, + {X: Field{[10]uint32{0x0299a7f1, 0x00ed282c, 0x03970825, 0x01e2140c, 0x00b019bf, 0x03fcd189, 0x023172dd, 0x01ab197b, 0x008b70da, 0x00304c5a}}, Y: Field{[10]uint32{0x00e5f3cc, 0x01e14677, 0x00d207dd, 0x03fc22e1, 0x000d6e1a, 0x027e65be, 0x0211d82e, 0x012365a6, 0x03b6e0e7, 0x003fbc61}}}, + {X: Field{[10]uint32{0x014d3ba9, 0x01c6c85d, 0x02a645dc, 0x003261c9, 0x02a984d0, 0x029afe0c, 0x00eddf3d, 0x01e61443, 0x00d3f7ab, 0x001d7721}}, Y: Field{[10]uint32{0x03841c50, 0x02c8cab8, 0x02183af5, 0x03ac770a, 0x0384f62d, 0x00bbaa94, 0x005e4d28, 0x001244b3, 0x01f35e11, 0x003d767b}}}, + {X: Field{[10]uint32{0x032a36c5, 0x011fb53c, 0x00648788, 0x035dbe63, 0x0282c6da, 0x01717f54, 0x03273102, 0x030e3ab9, 0x03bc9136, 0x00164771}}, Y: Field{[10]uint32{0x03a421a0, 0x025c9a35, 0x00233953, 0x02dc8751, 0x008d4875, 0x032db17a, 0x003aabb4, 0x034e0b80, 0x00c4f81c, 0x003f33e9}}}, + {X: Field{[10]uint32{0x02712596, 0x01d4f384, 0x00f0fb14, 0x02d93162, 0x02d2c78d, 0x021eb3de, 0x0148fadb, 0x024aeb9d, 0x00892a83, 0x0020e967}}, Y: Field{[10]uint32{0x03c5873b, 0x0140c339, 0x0119be3e, 0x038c573e, 0x0046f090, 0x0208bfcf, 0x027c5988, 0x00819435, 0x001a33b1, 0x001f402b}}}, + {X: Field{[10]uint32{0x026f6f83, 0x024f8b2e, 0x03fc76ca, 0x01a3b116, 0x036608f9, 0x018e47bf, 0x001b8c37, 0x02cbd2a7, 0x03a58c52, 0x003a6c37}}, Y: Field{[10]uint32{0x020a7c8d, 0x02d77bcb, 0x01be2e5c, 0x00e69e02, 0x035c1f08, 0x03acfcfe, 0x0089124f, 0x0378349d, 0x028d5846, 0x0019126c}}}, + {X: Field{[10]uint32{0x032bc03b, 0x0269942d, 0x02f81b1b, 0x01435569, 0x00c76adf, 0x00e8f497, 0x011c002d, 0x02430f45, 0x02f967b0, 0x00005b34}}, Y: Field{[10]uint32{0x02d63a7b, 0x03f931a2, 0x0206f50f, 0x013e123b, 0x03a23db7, 0x035e1162, 0x00cc091b, 0x01c240e7, 0x001e2fe7, 0x00316498}}}, + {X: Field{[10]uint32{0x02ff1cbe, 0x0128e28e, 0x026b6f58, 0x02e9ec61, 0x01d80b8d, 0x0135b97d, 0x023d9e24, 0x038d8da7, 0x03fd1bcd, 0x003cd1f4}}, Y: Field{[10]uint32{0x0287977a, 0x0313491f, 0x03a9766d, 0x02045613, 0x00c7349f, 0x0190497a, 0x01cfc6d0, 0x02284e63, 0x02b90ae3, 0x000710d6}}}, + {X: Field{[10]uint32{0x02428b1b, 0x00dd33f6, 0x0126d534, 0x034ad3a6, 0x01f349ed, 0x01248551, 0x0049f113, 0x02153243, 0x0187d644, 0x0016c643}}, Y: Field{[10]uint32{0x025401f3, 0x0325efbe, 0x03ea856b, 0x01dac9c4, 0x039c1d31, 0x0174b055, 0x013ab256, 0x035aed72, 0x00c363ef, 0x002293ab}}}, + {X: Field{[10]uint32{0x0030834f, 0x03d9f587, 0x003ab105, 0x03cdddcb, 0x01c49e78, 0x02f32b2b, 0x01e96650, 0x0133a3c8, 0x00b2d731, 0x0029de1b}}, Y: Field{[10]uint32{0x01441953, 0x025af52a, 0x0237146e, 0x006e817d, 0x006c4ea7, 0x02dc2ff0, 0x031f911c, 0x00b8fcbe, 0x00d41898, 0x0013f1eb}}}, + {X: Field{[10]uint32{0x03bf33cb, 0x02807ecb, 0x01dcf545, 0x009bc1cf, 0x02abf74d, 0x003bcd85, 0x01faeddc, 0x00686231, 0x0353e907, 0x0034d953}}, Y: Field{[10]uint32{0x032f4383, 0x03c40ed0, 0x00de1880, 0x03649b0f, 0x0377c7a3, 0x0129c5bc, 0x038502fc, 0x000e5165, 0x00c7213c, 0x00295bc8}}}, + {X: Field{[10]uint32{0x0022399c, 0x00e6a4de, 0x00994020, 0x01d83ba2, 0x0127d031, 0x02db6d33, 0x01d8ac3b, 0x032f681a, 0x0287400a, 0x003844e2}}, Y: Field{[10]uint32{0x03a162c1, 0x0259f544, 0x0012c9ce, 0x02543d78, 0x001803cd, 0x01a14f90, 0x0240de6b, 0x01b51971, 0x03bfdd3f, 0x003ca6a3}}}, + {X: Field{[10]uint32{0x02317708, 0x02b26561, 0x007e7374, 0x0039daee, 0x02571473, 0x03272a54, 0x03c49c69, 0x03d3942c, 0x023c91c0, 0x0034a7ad}}, Y: Field{[10]uint32{0x02a5f1a1, 0x02bfd87f, 0x03dd9d73, 0x027c72cf, 0x02d9d38c, 0x0215b79a, 0x022ab4ac, 0x02029674, 0x03024e91, 0x0012b64d}}}, + {X: Field{[10]uint32{0x02ee49f8, 0x022d2089, 0x03147ca4, 0x00c34637, 0x03d2124b, 0x022e3b2c, 0x0177da1d, 0x01ff5c19, 0x03baa671, 0x002a7500}}, Y: Field{[10]uint32{0x02d5323b, 0x005dadc9, 0x0133ff45, 0x027b6dd0, 0x0056f1e4, 0x02564451, 0x0137bcad, 0x0387b942, 0x027a8c5e, 0x0007bb7f}}}, + {X: Field{[10]uint32{0x02f57528, 0x01daf427, 0x01e39ca0, 0x018e6390, 0x018d8f37, 0x004b6272, 0x02c6bfd1, 0x00156bba, 0x00e8dbb6, 0x003fded6}}, Y: Field{[10]uint32{0x00381121, 0x034942bf, 0x02ee6cf5, 0x03d6f506, 0x018e39f1, 0x00db01a1, 0x02cb57c8, 0x01479c35, 0x01d1ad7a, 0x0013938e}}}, + {X: Field{[10]uint32{0x01362979, 0x02ebf46f, 0x016131e7, 0x007559bd, 0x021672ea, 0x038bc51b, 0x036db234, 0x027d8786, 0x029df783, 0x0010f142}}, Y: Field{[10]uint32{0x03f449ae, 0x029d3aa0, 0x03bd61ad, 0x0217d833, 0x001e2158, 0x02781486, 0x03e908f6, 0x006a2ea0, 0x02988154, 0x003c83f6}}}, + {X: Field{[10]uint32{0x034ac30c, 0x00fc89c5, 0x03e53984, 0x0354a74e, 0x035803a9, 0x02f9b410, 0x0262ae16, 0x004a61d5, 0x01b701c9, 0x003d822a}}, Y: Field{[10]uint32{0x027ad5bf, 0x03121a8c, 0x008f2083, 0x019b5ed4, 0x01d788d2, 0x004eed59, 0x02d32434, 0x0375086e, 0x00fae919, 0x0017bcd9}}}, + {X: Field{[10]uint32{0x005a117e, 0x004cc9d1, 0x02d568d0, 0x00881736, 0x033cc117, 0x03099d95, 0x03c48d00, 0x03c10fe6, 0x0029dd1e, 0x003244f8}}, Y: Field{[10]uint32{0x01a83049, 0x02169406, 0x02d8bace, 0x00610f89, 0x0032a38f, 0x00d49a81, 0x01cf07c1, 0x032ecdef, 0x030b9c31, 0x0025d5cf}}}, + {X: Field{[10]uint32{0x02a7d728, 0x03715720, 0x0363cce7, 0x02c4d20b, 0x0361318b, 0x0332a11f, 0x000c58a0, 0x01ef059b, 0x009db17e, 0x002ab831}}, Y: Field{[10]uint32{0x006be0b8, 0x0398ddd7, 0x012516a7, 0x03fe7576, 0x02810396, 0x01633703, 0x0051aae6, 0x00f6b088, 0x03f3f68c, 0x001045c2}}}, + {X: Field{[10]uint32{0x03c846c8, 0x02a8e23a, 0x02c96d35, 0x02d7af16, 0x01e306c8, 0x03792817, 0x039b15e3, 0x02d88966, 0x031f45a0, 0x003ca017}}, Y: Field{[10]uint32{0x038d1267, 0x027421da, 0x01dc9978, 0x00709902, 0x00b36e20, 0x0244be8e, 0x0325cdd0, 0x01c9115d, 0x03396ba3, 0x003d75c9}}}, + {X: Field{[10]uint32{0x00fa4f39, 0x029ea400, 0x030d87b0, 0x00e9e049, 0x00f7d232, 0x01f61968, 0x0230e593, 0x0344b928, 0x00e6e150, 0x001a5a79}}, Y: Field{[10]uint32{0x0214de3a, 0x02dc61d7, 0x02f888da, 0x036eab85, 0x03e030a0, 0x01657727, 0x037ebe08, 0x03b430f9, 0x03d6d323, 0x0031c70c}}}, + {X: Field{[10]uint32{0x01988f3e, 0x03bc0e63, 0x003e3e4c, 0x00e90465, 0x022aa064, 0x021cb7ef, 0x00fbdb8e, 0x0095eaf9, 0x03f07a0e, 0x0002bb0a}}, Y: Field{[10]uint32{0x00c931d0, 0x00755172, 0x01df6ef2, 0x0289c936, 0x00bcc3b6, 0x03fc2a0c, 0x00bc528f, 0x030e0321, 0x0157e686, 0x00363a7d}}}, + {X: Field{[10]uint32{0x0126f710, 0x0090ef52, 0x033226bb, 0x0071e42f, 0x01198f56, 0x02764775, 0x002890b6, 0x030d7294, 0x019a13df, 0x00271bfe}}, Y: Field{[10]uint32{0x03ef849d, 0x020d00fd, 0x0311e9b6, 0x018cd08a, 0x012f7f4e, 0x03fd1a0e, 0x008f5411, 0x03d6b676, 0x020c84a4, 0x000abbe4}}}, + {X: Field{[10]uint32{0x02d7f1c2, 0x0239b825, 0x00aefafb, 0x03b2d776, 0x02ade75a, 0x03bb7994, 0x00246d67, 0x0388e37c, 0x005b37a5, 0x003e90dd}}, Y: Field{[10]uint32{0x018689b1, 0x013a0b6a, 0x01eaddc4, 0x03e167fa, 0x0248aba7, 0x03be4e7b, 0x013c8f3f, 0x019500de, 0x02a42a3c, 0x0037e756}}}, + {X: Field{[10]uint32{0x038d46b9, 0x010f76a9, 0x00741276, 0x01396196, 0x020ce3b7, 0x039ddfe5, 0x03b84d09, 0x009b1fac, 0x02886c4e, 0x001a528c}}, Y: Field{[10]uint32{0x03dfe67a, 0x01aa7862, 0x018b0144, 0x00cb2c4c, 0x02a700d9, 0x0248b316, 0x00909be0, 0x011795ba, 0x006d0076, 0x0029535b}}}, + {X: Field{[10]uint32{0x008f38a0, 0x02b45eb0, 0x02be43d4, 0x0081f31c, 0x01930fe9, 0x00498843, 0x00339a2b, 0x01aca2d3, 0x01975be0, 0x00195265}}, Y: Field{[10]uint32{0x02f7900c, 0x01110fdc, 0x02be1c68, 0x02c22cd6, 0x03d29fe8, 0x02078fd6, 0x02cd92ce, 0x03738cb4, 0x03bb467f, 0x002f7b88}}}, + {X: Field{[10]uint32{0x0399f0bd, 0x00266c01, 0x00137400, 0x02ca6c42, 0x000ea38e, 0x020ebb11, 0x014f0844, 0x005392df, 0x00f675bb, 0x000de472}}, Y: Field{[10]uint32{0x02f7bc76, 0x013a463b, 0x0316d15a, 0x01170c72, 0x018b2a3f, 0x02fb97b9, 0x0396ddbc, 0x017adbce, 0x034ada5e, 0x000b723d}}}, + {X: Field{[10]uint32{0x02f31364, 0x0106a31b, 0x018ed429, 0x01e864e7, 0x0359795c, 0x02b3da90, 0x00469360, 0x0243a7a4, 0x0065eaf8, 0x00357904}}, Y: Field{[10]uint32{0x025bbcad, 0x0055b2fd, 0x03f6d21f, 0x032c341b, 0x00bd2f30, 0x00b930cb, 0x03bb6b8f, 0x03f539ea, 0x00c8a559, 0x000647b1}}}, + {X: Field{[10]uint32{0x00970dec, 0x02b5940b, 0x03ae8b77, 0x03cbaaa8, 0x01e504e6, 0x008162e6, 0x0229acb6, 0x010134a2, 0x0280fa0b, 0x0005b388}}, Y: Field{[10]uint32{0x02efb09b, 0x012e0755, 0x029b8817, 0x0179fe5b, 0x00b6eaec, 0x01d39643, 0x00bc2520, 0x0376e795, 0x03f4486a, 0x000f51a0}}}, + {X: Field{[10]uint32{0x02107d07, 0x00ed4071, 0x030160bf, 0x01fb5f51, 0x03e08f99, 0x005a106d, 0x025b4478, 0x02c7ce43, 0x03306cdf, 0x0029ac2a}}, Y: Field{[10]uint32{0x000abf7a, 0x02692daa, 0x0258d9cb, 0x0392843d, 0x03094e96, 0x01caaf26, 0x02d337fd, 0x009e524b, 0x002fb67e, 0x000a98a1}}}, + {X: Field{[10]uint32{0x02033583, 0x00018a15, 0x02d9021e, 0x022a3fda, 0x0252b9d0, 0x01c27cdd, 0x00b779cd, 0x00c82c87, 0x0138760b, 0x0035f29b}}, Y: Field{[10]uint32{0x009e7bb5, 0x01cbffe1, 0x01b046d6, 0x03ea660b, 0x015e2d1c, 0x00500586, 0x011b6cbb, 0x0166e5ae, 0x0372866d, 0x0035b017}}}, + {X: Field{[10]uint32{0x01609d33, 0x01b2d17d, 0x03ef375f, 0x01758682, 0x03e16240, 0x004871cf, 0x00cb1347, 0x01c1f9ce, 0x01632d3f, 0x001e2ac1}}, Y: Field{[10]uint32{0x0275a6b0, 0x013b17fb, 0x034f2109, 0x012557ed, 0x00350eba, 0x02ea9714, 0x03a4b424, 0x032d3ca5, 0x010c10c7, 0x003f868e}}}, + {X: Field{[10]uint32{0x000d6f04, 0x001cb146, 0x01879bd1, 0x00a0a24d, 0x01218e21, 0x003923f6, 0x01fc5a96, 0x03a00c19, 0x013a5b9f, 0x003014d5}}, Y: Field{[10]uint32{0x02719192, 0x0221a68f, 0x008a4752, 0x03714730, 0x027d0d28, 0x01ef8a00, 0x01c45cf5, 0x02ac1384, 0x0374214d, 0x00380b69}}}, + {X: Field{[10]uint32{0x03f02d03, 0x0357af48, 0x01b4eb65, 0x025604e1, 0x035faf8e, 0x003f07ec, 0x018d4033, 0x02570fbe, 0x0313e2a9, 0x002fe175}}, Y: Field{[10]uint32{0x03e59b18, 0x0101d22c, 0x00bbd6b9, 0x025a20a1, 0x03dcb68e, 0x00777481, 0x0142a6f2, 0x02c386a1, 0x014758d7, 0x00297516}}}, + {X: Field{[10]uint32{0x01bd280a, 0x01343c40, 0x0031d69a, 0x00167954, 0x00138169, 0x02c2bbb0, 0x022ee0de, 0x01e2e03f, 0x02c92be5, 0x003edced}}, Y: Field{[10]uint32{0x0214cd16, 0x0348b165, 0x01cf3e31, 0x0260df8f, 0x00e15bbc, 0x016f7a06, 0x0030bd25, 0x02957f51, 0x00939bf5, 0x001cb39e}}}, + {X: Field{[10]uint32{0x0228aa79, 0x03cdc305, 0x00dfc1e2, 0x00d60cd8, 0x00d99281, 0x03d2db0b, 0x01b04f78, 0x02372480, 0x025aed33, 0x0015925b}}, Y: Field{[10]uint32{0x028c2db1, 0x02291daf, 0x0072586c, 0x015344c0, 0x00092ffa, 0x015b5454, 0x0315d3fa, 0x0329c048, 0x008a824f, 0x002076fd}}}, + {X: Field{[10]uint32{0x03a2130c, 0x01724c6d, 0x036df790, 0x01e56327, 0x02aecc0a, 0x03ca9086, 0x01edcc62, 0x03c26121, 0x03959e81, 0x0035a638}}, Y: Field{[10]uint32{0x01563d27, 0x01e3271e, 0x03ba45ce, 0x02f8743f, 0x0179408b, 0x03a5c28e, 0x0001a8e3, 0x02a8e76b, 0x02bce61e, 0x001640f7}}}, + {X: Field{[10]uint32{0x0166ff80, 0x01d93931, 0x01931780, 0x01ee4e1f, 0x007fad8d, 0x00d012cd, 0x02ade00d, 0x025142cc, 0x02408670, 0x00212ccb}}, Y: Field{[10]uint32{0x031cfdc8, 0x00e9606e, 0x01c244aa, 0x039000c9, 0x009bb5b0, 0x025714d4, 0x03941e31, 0x010a58ad, 0x007856cc, 0x00132034}}}, + {X: Field{[10]uint32{0x00db2ed6, 0x00e29842, 0x00cf05ac, 0x010ca3cc, 0x036528e2, 0x007b4cc9, 0x0073a45f, 0x0226d306, 0x03992a36, 0x001c4a71}}, Y: Field{[10]uint32{0x020810e4, 0x02265699, 0x00a68ce3, 0x00673cff, 0x0044f866, 0x024026aa, 0x01154567, 0x00969753, 0x03e84821, 0x000d8ad3}}}, + {X: Field{[10]uint32{0x0180d824, 0x00e74a34, 0x01b98781, 0x01fbda31, 0x005f8cad, 0x0326470d, 0x02cac088, 0x02dba9ad, 0x0087fa48, 0x0024c593}}, Y: Field{[10]uint32{0x01d9e26b, 0x017a11ed, 0x02a87278, 0x0087234d, 0x03bd1832, 0x0058e5aa, 0x0397771d, 0x03c3e432, 0x015cc91c, 0x0028eb03}}}, + {X: Field{[10]uint32{0x03305a68, 0x03b66c27, 0x02d94808, 0x017a2e26, 0x0194744d, 0x024a7cca, 0x004c7b1f, 0x024df28e, 0x00e237c4, 0x0013e43a}}, Y: Field{[10]uint32{0x012430b8, 0x0123c226, 0x00e70147, 0x0000d0f1, 0x02ce725e, 0x033bb41e, 0x03f417cf, 0x01212c20, 0x02e02b6b, 0x003379dd}}}, + {X: Field{[10]uint32{0x01f716a1, 0x03e46d9d, 0x00ed6a10, 0x0284f016, 0x034442f6, 0x014fb334, 0x0113fae2, 0x01c5ab9a, 0x03bc9f40, 0x00136580}}, Y: Field{[10]uint32{0x0124add6, 0x0153b90e, 0x02493c66, 0x0048a12a, 0x009c52a4, 0x029bed14, 0x0165827a, 0x038d565c, 0x01fc278c, 0x0024ad9e}}}, + {X: Field{[10]uint32{0x02b17203, 0x004f1312, 0x006a5aed, 0x00619fe4, 0x03f90cd7, 0x0058cb84, 0x0094f3bc, 0x01050c4b, 0x011f91c5, 0x0022dbd9}}, Y: Field{[10]uint32{0x010c7066, 0x020d9548, 0x02c130bf, 0x0256eb1a, 0x0109ded9, 0x0049b103, 0x00e2b78c, 0x00955aed, 0x01a4b80f, 0x00223056}}}, + {X: Field{[10]uint32{0x025ec256, 0x03082f6c, 0x02ee98cd, 0x03ad8155, 0x021909e1, 0x02352645, 0x02448f07, 0x020d1fa1, 0x0052cab9, 0x001bd62e}}, Y: Field{[10]uint32{0x00239885, 0x01c08f26, 0x01cd32fa, 0x02cab601, 0x021681da, 0x02833afa, 0x02bd30dd, 0x024c179a, 0x005f233d, 0x0000e930}}}, + {X: Field{[10]uint32{0x000c44bd, 0x02601c44, 0x010086cb, 0x024566a4, 0x028bb6ca, 0x03febe8c, 0x03710da3, 0x010472b2, 0x02a84021, 0x001af9fd}}, Y: Field{[10]uint32{0x0036bee9, 0x00405152, 0x0168bb58, 0x03fcc83a, 0x0186f339, 0x017f0464, 0x01c8d59b, 0x037ed160, 0x02f9d461, 0x002fd929}}}, + {X: Field{[10]uint32{0x02102d39, 0x020f4b2b, 0x0044ab39, 0x003cab06, 0x0299661f, 0x03b3fe6a, 0x00fdbe13, 0x02799bcb, 0x010bb8ea, 0x0002cbf3}}, Y: Field{[10]uint32{0x0182bb86, 0x013a339c, 0x02c74144, 0x02c3a8cf, 0x0027c38c, 0x00e9fa04, 0x032cbbad, 0x023e8c3a, 0x0189bb3b, 0x0002811a}}}, + {X: Field{[10]uint32{0x01a6fd96, 0x03dd129e, 0x02f1291b, 0x01adb667, 0x03391682, 0x00331644, 0x037770b5, 0x026ca7b7, 0x010eab55, 0x002875bb}}, Y: Field{[10]uint32{0x004ab69b, 0x008ded30, 0x03391df2, 0x00c02b1a, 0x002f17df, 0x00612025, 0x03bf93b5, 0x0156b85c, 0x017e0c92, 0x002ee459}}}, + {X: Field{[10]uint32{0x012a9575, 0x02a047a4, 0x0301bd08, 0x039f8725, 0x01440da5, 0x026ad8e7, 0x0366201e, 0x00c35cd4, 0x030ded71, 0x000a3d95}}, Y: Field{[10]uint32{0x02d2884a, 0x039ab73c, 0x0362edec, 0x017a5576, 0x00e2216e, 0x03efd30b, 0x011a7c70, 0x0166c8fa, 0x0360119c, 0x000e4647}}}, + {X: Field{[10]uint32{0x00271fa3, 0x032013e4, 0x038530b9, 0x0089258d, 0x0031cfce, 0x00075edb, 0x00b089d1, 0x00f79086, 0x00eddbb8, 0x00005323}}, Y: Field{[10]uint32{0x029a41fc, 0x03fb393a, 0x0384d7a8, 0x00f5128b, 0x030de129, 0x0131e252, 0x01cba3d2, 0x00b9c44d, 0x02d2a5d0, 0x00012014}}}, + {X: Field{[10]uint32{0x012d489b, 0x00be3eb8, 0x03ca9eda, 0x00ee4886, 0x03a75f56, 0x03211429, 0x0228fa1b, 0x00df4f4a, 0x0305fec7, 0x003abfe7}}, Y: Field{[10]uint32{0x03b8c139, 0x02dc2a48, 0x01c3dd3f, 0x01206844, 0x022ad9f3, 0x0083d18e, 0x03349fa5, 0x021cf5f4, 0x019b05c9, 0x0035b510}}}, + {X: Field{[10]uint32{0x00b35e95, 0x02fb4545, 0x02a43d92, 0x03825a4c, 0x00ce0757, 0x00b9ff0f, 0x03524575, 0x00dc4a16, 0x006eb42a, 0x003a3b93}}, Y: Field{[10]uint32{0x023b748a, 0x00c28ada, 0x01e2d5f2, 0x03f32f17, 0x00ee55ab, 0x0091b2df, 0x007ff4e6, 0x0060c7c4, 0x014c27ef, 0x000361af}}}, + {X: Field{[10]uint32{0x0241e7e4, 0x01db9abb, 0x00386a07, 0x008819de, 0x02d5e909, 0x03222946, 0x03707591, 0x00ec181a, 0x01090821, 0x00263186}}, Y: Field{[10]uint32{0x025d4c8c, 0x0106bbfd, 0x03efbfc2, 0x02a068df, 0x030fd72d, 0x02339314, 0x0290e2d3, 0x02e4110b, 0x022cf98b, 0x003acf4b}}}, + {X: Field{[10]uint32{0x0146dd29, 0x033dfcfe, 0x0217d946, 0x001938a3, 0x01893198, 0x00e2f2d7, 0x03a0dbbc, 0x00a61b15, 0x0381f5d6, 0x00353d9a}}, Y: Field{[10]uint32{0x037a5fc2, 0x02087ede, 0x03b32867, 0x023814c2, 0x002a1229, 0x02052d6e, 0x03c5579d, 0x0068032d, 0x038deedf, 0x003064c3}}}, + {X: Field{[10]uint32{0x0011087f, 0x01e41805, 0x03c4eb98, 0x030ab511, 0x01a13dd4, 0x02619bc3, 0x01543696, 0x02466d57, 0x00e705f8, 0x000535cf}}, Y: Field{[10]uint32{0x03ededf8, 0x0381b1a4, 0x0067d16e, 0x03c98a75, 0x03b71c48, 0x02bd0822, 0x0106df2c, 0x0034f174, 0x0222b9cb, 0x001a6e51}}}, + {X: Field{[10]uint32{0x03da3aec, 0x00d30808, 0x017115bc, 0x010229c4, 0x015646ab, 0x02942a35, 0x00511058, 0x01e831ab, 0x0135059c, 0x0015fbf2}}, Y: Field{[10]uint32{0x01c5dfd1, 0x01cb00ad, 0x00c4b262, 0x03c14ccb, 0x0127f959, 0x00ab954a, 0x03fba0d9, 0x015705d2, 0x029a60b8, 0x003f2a4c}}}, + {X: Field{[10]uint32{0x01b3677f, 0x00dcbf65, 0x0073dcb6, 0x03d4da0e, 0x00171213, 0x016a7cf9, 0x00b94585, 0x02a036a4, 0x0286063d, 0x00247c4e}}, Y: Field{[10]uint32{0x019a90ea, 0x02d3bed0, 0x016d03ca, 0x03384d05, 0x01e0332e, 0x0081558e, 0x029a7ae9, 0x03c4430c, 0x00d86734, 0x001d0178}}}, + {X: Field{[10]uint32{0x01607592, 0x035abfe8, 0x037675f9, 0x005b44cd, 0x02c33227, 0x01037170, 0x03dfd64b, 0x017896a0, 0x010b4614, 0x00373213}}, Y: Field{[10]uint32{0x012d6c66, 0x02a2ea07, 0x00adc8bb, 0x01869c0c, 0x0251b951, 0x03d4c91a, 0x01f15260, 0x03fab023, 0x00f48e4d, 0x00391a93}}}, + {X: Field{[10]uint32{0x0348676c, 0x01405d0c, 0x02db0542, 0x007f7c5a, 0x00df0bfa, 0x02fcf1a8, 0x016011e6, 0x03d0c804, 0x02acd5a6, 0x000a2ac1}}, Y: Field{[10]uint32{0x03b0cb9a, 0x015ad8e5, 0x012d427e, 0x00af8369, 0x03cc31f4, 0x013ff3fb, 0x011d6b7a, 0x01276ba7, 0x021c967f, 0x001449ca}}}, + {X: Field{[10]uint32{0x01d8b240, 0x03c3d148, 0x02d00bef, 0x0248c830, 0x020d9c2a, 0x0245718d, 0x032adb45, 0x037f7f4f, 0x0321f8d1, 0x0001f006}}, Y: Field{[10]uint32{0x002c8b48, 0x03e89715, 0x01aedf76, 0x018b4db4, 0x016e7ffd, 0x02aa5acf, 0x02f78fda, 0x01b607f1, 0x03cc9990, 0x002d2923}}}, + {X: Field{[10]uint32{0x014d98f1, 0x02a66b34, 0x01f5b428, 0x026f832d, 0x03a0d327, 0x02703a3e, 0x03624230, 0x03a57ca8, 0x037830f8, 0x003e53ba}}, Y: Field{[10]uint32{0x03649527, 0x03f8f290, 0x00d2305c, 0x0076544f, 0x03715722, 0x02ed2a4f, 0x01c91be8, 0x01ae7297, 0x03646967, 0x00325b56}}}, + {X: Field{[10]uint32{0x01ec35ca, 0x01bd7e04, 0x0045bd40, 0x01dcc3a4, 0x039a6d64, 0x03d78cb4, 0x01e0dd85, 0x0336902f, 0x00e47788, 0x003a919d}}, Y: Field{[10]uint32{0x035a235a, 0x01188c29, 0x01a0fe1a, 0x0185093a, 0x01fb622a, 0x0062f5da, 0x030032ba, 0x024488c1, 0x03790a9b, 0x0001da6f}}}, + {X: Field{[10]uint32{0x03b40112, 0x00f09407, 0x005d1728, 0x0234dd9d, 0x0019b7b3, 0x020aff8a, 0x03172606, 0x021a1404, 0x00197f8f, 0x0036969d}}, Y: Field{[10]uint32{0x01c37a39, 0x018f8ee5, 0x0290ceb6, 0x0104841c, 0x00b5a19f, 0x0358dcef, 0x025ef5f5, 0x0078604c, 0x02ec0587, 0x002982d7}}}, + {X: Field{[10]uint32{0x02e9d41d, 0x03dcbc89, 0x03b6c22f, 0x03b08ee3, 0x01a75ebc, 0x03b5eddb, 0x00c6820d, 0x003f6806, 0x03a55256, 0x0030405f}}, Y: Field{[10]uint32{0x009fed39, 0x01e0450d, 0x0129b1b0, 0x03699e0a, 0x039b5dc1, 0x03fc1625, 0x03da3b8d, 0x011fe459, 0x019daf26, 0x003a51ec}}}, + {X: Field{[10]uint32{0x01216a7f, 0x03a452ca, 0x00b164b3, 0x016066fc, 0x011b9646, 0x0160269d, 0x0215238b, 0x0111d9e2, 0x00e14e81, 0x0002f9f0}}, Y: Field{[10]uint32{0x03eb392e, 0x0189e803, 0x0204e4f1, 0x002e28d8, 0x01088084, 0x035923a0, 0x03072b15, 0x00669bc2, 0x0297f642, 0x0028c3af}}}, + {X: Field{[10]uint32{0x03007cea, 0x00ec4e65, 0x0014fcb5, 0x03cb3e01, 0x0059e0ff, 0x00bffe0b, 0x01184056, 0x0303f730, 0x02c1a4d6, 0x0019d63b}}, Y: Field{[10]uint32{0x00b316b3, 0x038fabdf, 0x00edcb4f, 0x02eb42e7, 0x00a0149b, 0x01898c7a, 0x02c88988, 0x03614908, 0x006620fc, 0x001194ef}}}, + {X: Field{[10]uint32{0x005b6116, 0x02143710, 0x01dae70d, 0x0379a6b3, 0x03011014, 0x03a1cd6c, 0x000cf059, 0x01366676, 0x01d3f88f, 0x00272ed4}}, Y: Field{[10]uint32{0x01902360, 0x01442ec9, 0x023d60e2, 0x02064642, 0x02047c63, 0x01fbf134, 0x00e0ed51, 0x016d4a00, 0x0348cad7, 0x0037e8b9}}}, + {X: Field{[10]uint32{0x00bf0bc3, 0x03854436, 0x00dea3d6, 0x0354d087, 0x0065328b, 0x02a96b46, 0x0350229e, 0x01e4bc5c, 0x02e7b170, 0x0018e96a}}, Y: Field{[10]uint32{0x02da1010, 0x03ee20d4, 0x00ea195a, 0x035e3396, 0x0212a261, 0x034d8d30, 0x026250ae, 0x017d27df, 0x03d0f25d, 0x0004496b}}}, + {X: Field{[10]uint32{0x02f10657, 0x038b226c, 0x02430b0f, 0x00907698, 0x014e036d, 0x0090f688, 0x02e11fb0, 0x000ca3ae, 0x02493e5f, 0x002b7e58}}, Y: Field{[10]uint32{0x01b1ea1e, 0x00d2d5c2, 0x037f784f, 0x037a280f, 0x03219a29, 0x005f52d7, 0x0018b16d, 0x0376ccb4, 0x00bafcd8, 0x0014260d}}}, + {X: Field{[10]uint32{0x034d472f, 0x01d97678, 0x01f32f00, 0x01270ac9, 0x01bfdfa5, 0x00135c89, 0x0183364e, 0x0128564d, 0x035b7fb4, 0x00028363}}, Y: Field{[10]uint32{0x03998ab2, 0x026c48bb, 0x0048dd53, 0x008be7df, 0x01630b6c, 0x0365ff8f, 0x01da99f3, 0x009a1e52, 0x0366f84c, 0x000187aa}}}, + {X: Field{[10]uint32{0x02e61fc1, 0x019a42c2, 0x0033ef68, 0x03496c9f, 0x027a3ee0, 0x01b60097, 0x00dbf815, 0x028b6eb7, 0x00ea9596, 0x002e60c2}}, Y: Field{[10]uint32{0x03ddbd37, 0x00334149, 0x006f5125, 0x01b9619e, 0x01445bae, 0x00f3f496, 0x00c582a0, 0x02933ad3, 0x03177566, 0x00336d38}}}, + {X: Field{[10]uint32{0x00b98134, 0x008cabdc, 0x03f637f0, 0x03236d2a, 0x03cf3969, 0x024ee8c0, 0x01eefe37, 0x035b3046, 0x031d37e3, 0x00386993}}, Y: Field{[10]uint32{0x003231da, 0x0173b507, 0x00fc2f95, 0x019e3d3b, 0x01ddbd35, 0x00fd606d, 0x00d2084b, 0x034bd7b1, 0x02d8885d, 0x0016235e}}}, + {X: Field{[10]uint32{0x01fdaaed, 0x0089da99, 0x00eca49c, 0x03b9ebc5, 0x01318929, 0x035c4644, 0x02253a1b, 0x00ea9b9c, 0x03ede854, 0x003ef577}}, Y: Field{[10]uint32{0x013b78bc, 0x033efc06, 0x016f2f76, 0x006b6f43, 0x00f23489, 0x016e30c4, 0x0005d516, 0x00d458f1, 0x030a432c, 0x000c5f3b}}}, + {X: Field{[10]uint32{0x00da6bc2, 0x01df39a1, 0x00a2ae30, 0x0137005e, 0x0030b87c, 0x03dedbc8, 0x031a8822, 0x02544213, 0x03f3b0a3, 0x003eb12d}}, Y: Field{[10]uint32{0x00867d75, 0x02ca656f, 0x01fae390, 0x034557c6, 0x00386ce0, 0x018a3f75, 0x00a5c54a, 0x008bf058, 0x01209e95, 0x001c0a6e}}}, + {X: Field{[10]uint32{0x03ef7c2b, 0x02a06150, 0x0053ee64, 0x014571d7, 0x013c29fc, 0x006d7f1f, 0x02c02964, 0x033d4200, 0x03de834f, 0x0032a190}}, Y: Field{[10]uint32{0x03cf17f9, 0x03ea592b, 0x014c3b26, 0x00c73b9c, 0x02f8ecea, 0x02b6767e, 0x036fd4d0, 0x00a5b890, 0x0027111e, 0x00241e9b}}}, + {X: Field{[10]uint32{0x03315f1f, 0x00b25b3c, 0x0066b120, 0x008af150, 0x03a4a73b, 0x03f92d22, 0x0226b19e, 0x003a85fa, 0x02490d70, 0x001c61cd}}, Y: Field{[10]uint32{0x03ded2fd, 0x00b04761, 0x0215abd8, 0x01208108, 0x01515127, 0x03973d0a, 0x03fc614d, 0x01d2ddd4, 0x00474bb3, 0x003db361}}}, + {X: Field{[10]uint32{0x00c5e3d7, 0x030f14d2, 0x03e6f15a, 0x023dddb2, 0x00175b76, 0x01df18fc, 0x02574826, 0x031cc89b, 0x00ff21c3, 0x0019f9ce}}, Y: Field{[10]uint32{0x02f2bdb2, 0x024d43ba, 0x026bfac7, 0x0151744c, 0x030ebd28, 0x01f3d824, 0x03a50644, 0x0375c95d, 0x000f2343, 0x00053945}}}, + {X: Field{[10]uint32{0x02198893, 0x03d57c66, 0x02934280, 0x010998b3, 0x036c5a5c, 0x00d3b85f, 0x01339f64, 0x0094fc81, 0x0331f875, 0x001452cf}}, Y: Field{[10]uint32{0x02e9a090, 0x02601f92, 0x0269fe46, 0x030b72a5, 0x01a61c0f, 0x039f3793, 0x011c538c, 0x03b1c133, 0x0193a2fb, 0x0013acce}}}, + {X: Field{[10]uint32{0x03c2dab3, 0x01614062, 0x03586f98, 0x005be12c, 0x02ca53c2, 0x006280e4, 0x0330a414, 0x00f9d5aa, 0x03a6eab0, 0x00109ab3}}, Y: Field{[10]uint32{0x01083926, 0x0166ab7c, 0x01a74acb, 0x03441d27, 0x02d34944, 0x0015ceed, 0x0206682d, 0x00431702, 0x02ab21cc, 0x0030f58f}}}, + {X: Field{[10]uint32{0x02d7a09c, 0x003a3de8, 0x005cad42, 0x01cb1608, 0x01b8ad4a, 0x01165f21, 0x03dcbee9, 0x015cdc3f, 0x034668c0, 0x002e51ae}}, Y: Field{[10]uint32{0x023401b9, 0x008eeb47, 0x02b2cdc7, 0x00e927fb, 0x03969ea1, 0x0196f180, 0x03e63a5e, 0x00e09959, 0x02d41263, 0x00331c03}}}, + {X: Field{[10]uint32{0x018e33ac, 0x00d6e576, 0x02dcd803, 0x03e3eca2, 0x001d1e38, 0x0335d77d, 0x01d7d3cc, 0x02d17d44, 0x00b3f6c8, 0x0039aa11}}, Y: Field{[10]uint32{0x0058cce2, 0x005db0bb, 0x017e2c0b, 0x00273249, 0x036c4aa1, 0x007dc5ea, 0x023268ee, 0x022431d2, 0x03893939, 0x0001fc91}}}, + {X: Field{[10]uint32{0x02458001, 0x034503e5, 0x03dcd117, 0x00fc08c4, 0x00493e90, 0x01492e63, 0x0236b415, 0x014ba305, 0x03bfd9e0, 0x0010f98a}}, Y: Field{[10]uint32{0x023b352d, 0x011de669, 0x03cec8e1, 0x02ed27b2, 0x01ebee23, 0x0373fcc7, 0x01993000, 0x0354a0c2, 0x013d0a90, 0x003d2061}}}, + {X: Field{[10]uint32{0x0047f817, 0x03d12e20, 0x02ad9e94, 0x01124496, 0x01e555a8, 0x00776e6f, 0x0223e1c4, 0x011db50b, 0x000e3427, 0x003113bd}}, Y: Field{[10]uint32{0x02236fac, 0x02e7a8e3, 0x009d2498, 0x02cb6e13, 0x0238f664, 0x01dbd2b8, 0x0018e147, 0x03964fca, 0x0313e43e, 0x002fb750}}}, + {X: Field{[10]uint32{0x03212385, 0x022f7814, 0x037e8d40, 0x03eabf66, 0x037f58f2, 0x03e39265, 0x016f93f5, 0x00625702, 0x0313dcc1, 0x00286cd4}}, Y: Field{[10]uint32{0x023079f5, 0x023a29c2, 0x02c55bdc, 0x03008098, 0x03135a9e, 0x0024f605, 0x009f9cf5, 0x01430dcc, 0x025abf0d, 0x002f5fac}}}, + {X: Field{[10]uint32{0x035e964e, 0x0122a486, 0x01c91b67, 0x026b4562, 0x02138222, 0x00d6f663, 0x03f2f0c7, 0x0007268d, 0x03f9fd62, 0x001229bc}}, Y: Field{[10]uint32{0x034481b4, 0x00b14316, 0x01c91971, 0x00e54e97, 0x022c73e0, 0x02a75659, 0x0062c81f, 0x02a28192, 0x01553d41, 0x0006d514}}}, + {X: Field{[10]uint32{0x00061e9f, 0x00a17669, 0x0354db06, 0x033716c8, 0x0375f050, 0x023bb3c6, 0x019181dc, 0x02c1ba28, 0x0174651d, 0x0023807d}}, Y: Field{[10]uint32{0x035e108b, 0x03efec89, 0x00cae256, 0x0192e87c, 0x027d7ba9, 0x00bbb2b6, 0x006e90a0, 0x039f56db, 0x02a09800, 0x0027455b}}}, + {X: Field{[10]uint32{0x0205345d, 0x029372be, 0x0258f43d, 0x03cc5a52, 0x0228e375, 0x029e7e39, 0x0368b195, 0x02d5d8fa, 0x00db9e6d, 0x0012f03e}}, Y: Field{[10]uint32{0x03a5b555, 0x03c85710, 0x019d98d0, 0x00eda8cb, 0x01633805, 0x009a929a, 0x02380e81, 0x02c592ee, 0x0389a1e6, 0x0031a9c1}}}, + {X: Field{[10]uint32{0x0297a768, 0x015288ee, 0x0255f32d, 0x0236c033, 0x00f4c7ee, 0x002df6ae, 0x0230a665, 0x037ab758, 0x00cb5f5e, 0x00259bf4}}, Y: Field{[10]uint32{0x011a994b, 0x01b3de60, 0x004e1654, 0x0272a795, 0x0001e892, 0x038285ae, 0x0019a1de, 0x026d97d6, 0x0243bb4f, 0x00275913}}}, + {X: Field{[10]uint32{0x017b0d8a, 0x00b14421, 0x027f8296, 0x02e21891, 0x0320d50e, 0x010e38cd, 0x02dc7c74, 0x00ba9964, 0x01ad4952, 0x001aad46}}, Y: Field{[10]uint32{0x023ae44d, 0x00245442, 0x020da8a8, 0x0280de3b, 0x02e82653, 0x0153087b, 0x0367ec35, 0x0142898a, 0x02342b72, 0x00316e8e}}}, + {X: Field{[10]uint32{0x0276c62f, 0x01b5bbea, 0x03856d52, 0x029094c9, 0x03e55f18, 0x001db858, 0x03d0a0cd, 0x0183d4e6, 0x00e43e50, 0x003e2c2e}}, Y: Field{[10]uint32{0x00d48ba4, 0x03b3dbf5, 0x03ad1fe1, 0x02e90d9c, 0x017d5c95, 0x00a0e6a8, 0x00f29c86, 0x014fe963, 0x0052a658, 0x001d0f78}}}, + {X: Field{[10]uint32{0x02d18bad, 0x01e8494f, 0x030e1658, 0x018e7456, 0x02967e97, 0x0088f57e, 0x0185c0e5, 0x023fc2ad, 0x02f8579d, 0x00311427}}, Y: Field{[10]uint32{0x01b08362, 0x016393c7, 0x01cf97fe, 0x03021bc4, 0x0381199d, 0x01d2e2b9, 0x036d8d35, 0x02696168, 0x03e8ee97, 0x001ee47d}}}, + {X: Field{[10]uint32{0x0342379f, 0x02c03f6a, 0x003c3aac, 0x00cb3ead, 0x0004cef7, 0x02530393, 0x0207c538, 0x0143e388, 0x035a6ff4, 0x00268004}}, Y: Field{[10]uint32{0x03a9975d, 0x02e3fe07, 0x03d594df, 0x01ba2e11, 0x00b48159, 0x0232aee4, 0x020902a2, 0x0316c51d, 0x03483684, 0x000e4fb1}}}, + {X: Field{[10]uint32{0x03488601, 0x029016db, 0x01e3eaa4, 0x00c53949, 0x02a484d3, 0x0174f7b8, 0x010c17c2, 0x0235f37a, 0x03df173f, 0x000f5dd6}}, Y: Field{[10]uint32{0x030e51d4, 0x03a631ec, 0x02046b3d, 0x016e265c, 0x0138a402, 0x0275d389, 0x03287f55, 0x003da96f, 0x00bc0a56, 0x001f9ac2}}}, + {X: Field{[10]uint32{0x0303b529, 0x003a60de, 0x017b8f5d, 0x000b5c0f, 0x02a95e50, 0x034428a6, 0x03380a80, 0x0062d144, 0x013ea601, 0x0033aebf}}, Y: Field{[10]uint32{0x03b74b4e, 0x0054d2a1, 0x010c0fd6, 0x006fd54a, 0x025f6d8b, 0x00cee811, 0x0203594e, 0x027d87fd, 0x02b646f5, 0x000651de}}}, + {X: Field{[10]uint32{0x03a731b2, 0x02c661f3, 0x01de158c, 0x018fd62b, 0x037ecbc9, 0x03926c8d, 0x001ac162, 0x038f87bc, 0x00ac1ff3, 0x002ba28f}}, Y: Field{[10]uint32{0x01531efe, 0x0287a794, 0x03ac2bac, 0x00ac4529, 0x02ee26fd, 0x02371dce, 0x03f6af9e, 0x02dd25cc, 0x02752052, 0x001692c1}}}, + {X: Field{[10]uint32{0x01e3b38e, 0x010dd4eb, 0x02b28308, 0x00d743ef, 0x01fd39b6, 0x011deb13, 0x0118edee, 0x01c48d70, 0x00bb8bd4, 0x0035d34e}}, Y: Field{[10]uint32{0x00b54451, 0x01aecddf, 0x01c325d6, 0x03f4e4db, 0x021ec0a0, 0x006e9b78, 0x01850843, 0x00a0e5ea, 0x01b6f17a, 0x003cf941}}}, + {X: Field{[10]uint32{0x02beb2a8, 0x0256c53d, 0x01db2495, 0x00cec33a, 0x014d4f0b, 0x0381d747, 0x00dc1bef, 0x01e17345, 0x02757780, 0x003d0a1d}}, Y: Field{[10]uint32{0x00514b38, 0x00787618, 0x015364eb, 0x0354ffc9, 0x03950f34, 0x00d86b5b, 0x018bf6da, 0x018b7719, 0x0231eefc, 0x0028f7c8}}}, + {X: Field{[10]uint32{0x02378e94, 0x03250051, 0x0145450d, 0x0220f287, 0x01e62776, 0x0272c826, 0x03caaa86, 0x02b589da, 0x036bda19, 0x003a4755}}, Y: Field{[10]uint32{0x0040779c, 0x032a5c4e, 0x01db87ac, 0x0060df9d, 0x00020e79, 0x00c99763, 0x00313db8, 0x00b2e66b, 0x0038c8da, 0x002d5f88}}}, + {X: Field{[10]uint32{0x00c66ea2, 0x00c33f8e, 0x01aec7e8, 0x0377cf1f, 0x03e035e1, 0x03caaa90, 0x011b53da, 0x0385d8de, 0x00e87d77, 0x0009a651}}, Y: Field{[10]uint32{0x013707f6, 0x0339db06, 0x02ea739a, 0x0115edfb, 0x01567641, 0x026cc8f2, 0x028ca430, 0x031fec14, 0x036434bd, 0x0032c045}}}, + {X: Field{[10]uint32{0x0244a3d1, 0x03807ec1, 0x02a5ee94, 0x005cbfdb, 0x01fb0993, 0x01eec5d9, 0x0261c685, 0x00da046a, 0x028a8f0b, 0x003b5079}}, Y: Field{[10]uint32{0x0108231c, 0x0037ae31, 0x005dc1dd, 0x03823302, 0x0071c918, 0x00f65600, 0x03a1e448, 0x02f8109a, 0x007b880c, 0x003cb324}}}, + {X: Field{[10]uint32{0x01fec0de, 0x01e59083, 0x0113ab0b, 0x03c4cc88, 0x01538192, 0x00e8cf5a, 0x0236e4f5, 0x032e978b, 0x024a96cf, 0x001a51d9}}, Y: Field{[10]uint32{0x038fb6cd, 0x01770be8, 0x01dc77f9, 0x02577b3d, 0x03256101, 0x01ab78cc, 0x01b76c4d, 0x02dbeea4, 0x01bc5b65, 0x00192074}}}, + {X: Field{[10]uint32{0x0227fb03, 0x021715c7, 0x02f668ea, 0x00b1c3a3, 0x00437901, 0x02a4996c, 0x000a42bb, 0x018f7daa, 0x007ce22b, 0x002a8f86}}, Y: Field{[10]uint32{0x00d011be, 0x02a47fc2, 0x0329c38f, 0x01239736, 0x03e8732f, 0x00c04150, 0x03fcab70, 0x027f465b, 0x016b9810, 0x00298e37}}}, + {X: Field{[10]uint32{0x004a944b, 0x026f863e, 0x021c5eff, 0x00de4493, 0x02bfd5ea, 0x0150ff5b, 0x029fbab6, 0x03e536d2, 0x00e1a4be, 0x00001779}}, Y: Field{[10]uint32{0x0157e2d6, 0x026ea79e, 0x03442967, 0x03469fb1, 0x0158f8ae, 0x01dd11d8, 0x0299513f, 0x038a502d, 0x0282693b, 0x00087128}}}, + {X: Field{[10]uint32{0x007a7ce5, 0x01b0ad0a, 0x030a0964, 0x03ba8ce8, 0x02fdd18f, 0x02bc2bc8, 0x0096c793, 0x02d1de07, 0x00c72c87, 0x00194cf7}}, Y: Field{[10]uint32{0x037ccc51, 0x00dc1620, 0x00cd3f8c, 0x033e8ebb, 0x00482748, 0x00d1085d, 0x01589fc2, 0x03e6ef3a, 0x01f23d82, 0x001fc0f9}}}, + {X: Field{[10]uint32{0x00fdf354, 0x02ec0299, 0x01871a5e, 0x008e9c2e, 0x01c5109f, 0x014d0d4c, 0x02008ab8, 0x01612af6, 0x033c129e, 0x0004e797}}, Y: Field{[10]uint32{0x033f0a98, 0x0028bddd, 0x009de619, 0x039209ab, 0x026bf011, 0x020d4ad8, 0x03182ee9, 0x023abe94, 0x025741fb, 0x00125edf}}}, + {X: Field{[10]uint32{0x0161f7c3, 0x01e6bba0, 0x01f0c7c7, 0x02060645, 0x013ce57b, 0x0363c958, 0x00ea9918, 0x03a5420f, 0x01ccf7e1, 0x00124ffa}}, Y: Field{[10]uint32{0x03020cd5, 0x02f93059, 0x02f4088c, 0x00562f30, 0x00639ab6, 0x028eed12, 0x00aff6a6, 0x03874115, 0x03fd62fc, 0x0039a5d8}}}, + {X: Field{[10]uint32{0x02a064a9, 0x039acd94, 0x008a7446, 0x0055d9bb, 0x03900e3c, 0x0240f29d, 0x01ac2fb4, 0x01c2e190, 0x03dbd8dd, 0x003b59d7}}, Y: Field{[10]uint32{0x00416de9, 0x01bcc4da, 0x037fd1f2, 0x02c9739d, 0x0223ccff, 0x02c0622b, 0x00669b40, 0x03d6d1b8, 0x037985ce, 0x002986ec}}}, + {X: Field{[10]uint32{0x02260a4d, 0x02c32a66, 0x00b83136, 0x0110e187, 0x02b6d484, 0x014e4f54, 0x03c14e31, 0x0278e9e5, 0x00a89a76, 0x0005cd9c}}, Y: Field{[10]uint32{0x03bd4904, 0x00f689f1, 0x02bc6d68, 0x03ddf760, 0x00d140b3, 0x01242104, 0x02a1b28e, 0x0134ba57, 0x0121c1ba, 0x0013750e}}}, + {X: Field{[10]uint32{0x035d1610, 0x0387c258, 0x0128cdf9, 0x00f4b329, 0x00a1da93, 0x03041ba0, 0x011e05a0, 0x038551bc, 0x03a08f87, 0x00356978}}, Y: Field{[10]uint32{0x01175352, 0x00a45397, 0x01167255, 0x01d0828d, 0x01aa20df, 0x0307fec3, 0x00a9c6f2, 0x03024a34, 0x01e0daf3, 0x001f1b15}}}, + {X: Field{[10]uint32{0x02f6fa2a, 0x0168ce36, 0x00ebe417, 0x00c9d3b9, 0x01a0a999, 0x01359a5f, 0x02f2e2b9, 0x00c871a4, 0x01a004ab, 0x00153d7a}}, Y: Field{[10]uint32{0x01f2de21, 0x0359b622, 0x0342b5cb, 0x032a157f, 0x0258a7d9, 0x03e0a376, 0x02eb7614, 0x01b91cd2, 0x03d175fa, 0x001633c4}}}, + {X: Field{[10]uint32{0x03ebe6da, 0x01c96f1f, 0x01d4c9e8, 0x00b65111, 0x02fd9a63, 0x010988ac, 0x025544a4, 0x03a6558b, 0x0098154d, 0x00359a0a}}, Y: Field{[10]uint32{0x0190f206, 0x01c7718c, 0x001ebd13, 0x0117dd83, 0x030b2d50, 0x01e5c6a8, 0x0202c50a, 0x02e15d43, 0x023b9ba3, 0x00260247}}}, + {X: Field{[10]uint32{0x01c2da08, 0x0126fdb3, 0x008cafef, 0x03fc6324, 0x02610bec, 0x00b7b34d, 0x01f6e1a8, 0x03131236, 0x01b92af2, 0x00094c06}}, Y: Field{[10]uint32{0x017c680a, 0x02e1ae8e, 0x02a5a495, 0x00ef694e, 0x023ffbdd, 0x00421cb8, 0x02ebdce8, 0x0275d397, 0x035ad950, 0x00185f4c}}}, + {X: Field{[10]uint32{0x004da6cb, 0x019f3544, 0x00f16bab, 0x01d14391, 0x02ced725, 0x03023ca4, 0x00d2bcfa, 0x03af7958, 0x00ca461b, 0x00015bd9}}, Y: Field{[10]uint32{0x013aee44, 0x00efcf56, 0x023eebd8, 0x014ee40e, 0x02757cb5, 0x00bba050, 0x012bca8f, 0x020ca2a6, 0x01cfdc27, 0x0016c821}}}, + {X: Field{[10]uint32{0x03553420, 0x03b49163, 0x012f64dd, 0x03a6fbcc, 0x005a31a1, 0x01f8fb8e, 0x025c1928, 0x00ea6bc3, 0x01711e15, 0x003ce725}}, Y: Field{[10]uint32{0x03b0b1cc, 0x020a4c38, 0x03a974b8, 0x018922f7, 0x02e742ef, 0x0126304c, 0x039df908, 0x01ae7de1, 0x02c11c20, 0x00133252}}}, + {X: Field{[10]uint32{0x013128b5, 0x037758b0, 0x005368c8, 0x01297783, 0x01b2f303, 0x01716ab9, 0x02d3dad9, 0x021cf00c, 0x02a8cbdf, 0x00010dfa}}, Y: Field{[10]uint32{0x013c59c6, 0x038c2026, 0x01fcc721, 0x00b77c30, 0x012f8d1b, 0x03583696, 0x00245993, 0x0042ed65, 0x020eb003, 0x0009f63a}}}, + {X: Field{[10]uint32{0x0080e9b2, 0x027ad2ea, 0x0371f0a7, 0x0298053b, 0x003f13e7, 0x00715d4d, 0x010ae621, 0x019e6112, 0x01893f5d, 0x002b7869}}, Y: Field{[10]uint32{0x0391c715, 0x00b8988d, 0x01304902, 0x00adfc90, 0x01e80188, 0x00f06d0a, 0x03404d8c, 0x01a8eeb1, 0x017c537e, 0x002f5270}}}, + {X: Field{[10]uint32{0x02c1224e, 0x038b64ce, 0x0198fd16, 0x01e31eb4, 0x00a87ef9, 0x029386db, 0x0357d977, 0x00696ae7, 0x01d5c309, 0x0024d89d}}, Y: Field{[10]uint32{0x036b9f32, 0x000481f7, 0x0057e5aa, 0x0146c5ee, 0x00ed5988, 0x01b88934, 0x0375d96c, 0x021317aa, 0x010ad8bd, 0x001a149a}}}, + {X: Field{[10]uint32{0x039b786e, 0x03ed69da, 0x01e8cc33, 0x00741dad, 0x03e29497, 0x03202e74, 0x006db205, 0x03573781, 0x01fd3e8f, 0x0000a795}}, Y: Field{[10]uint32{0x00010a0d, 0x03379263, 0x02f57af6, 0x00ab5869, 0x002bbf3e, 0x01c83391, 0x038312f0, 0x00d2e515, 0x017a7eb9, 0x0001da79}}}, + {X: Field{[10]uint32{0x009051ef, 0x02c566e0, 0x00584168, 0x0011d91f, 0x003ae378, 0x01785bde, 0x00b52754, 0x0217fc66, 0x02a73501, 0x0037e0d8}}, Y: Field{[10]uint32{0x02af6bab, 0x032b82d8, 0x01a263a6, 0x0203b923, 0x03735ece, 0x012c5b0e, 0x026b6048, 0x028ef7a0, 0x0046fbd4, 0x002bf2cd}}}, + {X: Field{[10]uint32{0x018a427e, 0x0057b381, 0x0033c254, 0x020e5b3d, 0x01b9a01e, 0x01b31867, 0x01660379, 0x017f83e5, 0x012309a3, 0x0017d10c}}, Y: Field{[10]uint32{0x00901ac0, 0x01f530ac, 0x03c906fd, 0x01c923eb, 0x0337d81c, 0x01aaa705, 0x0272b605, 0x02af14a4, 0x0012fc0a, 0x000e170a}}}, + {X: Field{[10]uint32{0x01dd2de5, 0x038d1205, 0x0163f4b7, 0x03fd74f7, 0x008c5323, 0x01a4ff13, 0x01b77a31, 0x000df149, 0x021553c6, 0x00306710}}, Y: Field{[10]uint32{0x013900a4, 0x0323b06a, 0x01822159, 0x01564b26, 0x00a19d22, 0x03679ac8, 0x01161896, 0x01df849c, 0x028a8791, 0x0027ddba}}}, + {X: Field{[10]uint32{0x032d45ac, 0x028508eb, 0x013f1d62, 0x024aa084, 0x0214d19d, 0x018e5091, 0x0162fdb3, 0x008ccbab, 0x021dd1e0, 0x0022afce}}, Y: Field{[10]uint32{0x03e36dde, 0x006d6629, 0x007ec7de, 0x0105b754, 0x02defc29, 0x0330b67c, 0x027a984e, 0x03b0fdd7, 0x027fdcf5, 0x000c96a5}}}, + {X: Field{[10]uint32{0x0359ae7a, 0x028f377d, 0x03b9433f, 0x01db0181, 0x0257c1dd, 0x01c7aa12, 0x014a58fa, 0x01879b13, 0x0390b931, 0x00322ff7}}, Y: Field{[10]uint32{0x030b20f9, 0x02513cc9, 0x01ce5b51, 0x033c054d, 0x00fd7990, 0x00f96a8f, 0x007efd3c, 0x03ed8fb5, 0x00a3d172, 0x0008f70e}}}, + {X: Field{[10]uint32{0x02d2c78d, 0x01fa1b80, 0x038b443c, 0x01016dde, 0x02a26ccc, 0x017e435e, 0x019e7ab8, 0x01665e9d, 0x026c35c5, 0x00025d99}}, Y: Field{[10]uint32{0x001ed0ff, 0x0145850e, 0x00f89605, 0x03fad0dc, 0x0392c52c, 0x008333bb, 0x02db2e4e, 0x033c96fc, 0x003e44fa, 0x001b4d0b}}}, + {X: Field{[10]uint32{0x0163252b, 0x00aa337e, 0x0273a1c1, 0x01b3fac8, 0x021fd65b, 0x02f6270e, 0x03b8e8a5, 0x0393871e, 0x03a77737, 0x0039de42}}, Y: Field{[10]uint32{0x03bdba42, 0x0096773f, 0x02e1a810, 0x03caa7a4, 0x01f7138f, 0x02ca2663, 0x02754ead, 0x02d63dc3, 0x02201534, 0x000098d7}}}, + {X: Field{[10]uint32{0x0176fb0d, 0x01df6051, 0x03efe375, 0x03265d7c, 0x03b471ce, 0x02e61ab0, 0x00e3ecd5, 0x03b20fd8, 0x017f6bfc, 0x0010b2e0}}, Y: Field{[10]uint32{0x005cf49a, 0x022937b1, 0x03cce270, 0x025941d7, 0x01144a85, 0x015cde42, 0x0162050a, 0x02f643c8, 0x0128b2f9, 0x003b4d78}}}, + {X: Field{[10]uint32{0x012f3cbb, 0x014383d0, 0x018f0024, 0x00a293f5, 0x01319024, 0x03847c51, 0x0060397a, 0x024ccfff, 0x00701a23, 0x0028221a}}, Y: Field{[10]uint32{0x0083af52, 0x0207e646, 0x00ad6d8a, 0x03267300, 0x03fc6002, 0x01221fae, 0x0251995b, 0x0380d023, 0x03371ad6, 0x0032121b}}}, + {X: Field{[10]uint32{0x032c4bb3, 0x021bc95c, 0x01aab034, 0x00b08998, 0x02e6a964, 0x00d9294b, 0x00fd8e8b, 0x006e2c10, 0x02419f10, 0x00290332}}, Y: Field{[10]uint32{0x0045a910, 0x02c542a5, 0x01285bab, 0x026e5402, 0x03b0655b, 0x001c0730, 0x01e611df, 0x025bc0b4, 0x03693ec0, 0x0003d086}}}, + {X: Field{[10]uint32{0x01beb721, 0x0181290d, 0x0350fefe, 0x003c5068, 0x02c53294, 0x027d5d57, 0x035b70bc, 0x011cb169, 0x0178bbb0, 0x00242bbe}}, Y: Field{[10]uint32{0x014bbf0d, 0x021f8478, 0x01187a5f, 0x004251e7, 0x0193f585, 0x0391e3a9, 0x008cde92, 0x03db932a, 0x0070737c, 0x003e7c17}}}, + {X: Field{[10]uint32{0x003407c3, 0x031a65eb, 0x03f1a07b, 0x00ceee09, 0x02d73ae4, 0x036e6b2d, 0x00292f68, 0x007ce580, 0x0281a0f6, 0x003ff08e}}, Y: Field{[10]uint32{0x034d4b66, 0x017ca115, 0x02803686, 0x00de81d1, 0x004f313b, 0x0351f338, 0x03c74630, 0x0384e49d, 0x0212bce5, 0x002dda81}}}, + {X: Field{[10]uint32{0x00a112a5, 0x003fd408, 0x01ded2ab, 0x00b837e6, 0x02742c85, 0x02610969, 0x022bc162, 0x03e64109, 0x039440bd, 0x0034f29e}}, Y: Field{[10]uint32{0x024d637a, 0x01e03ff7, 0x022cb1f9, 0x02dcd07e, 0x005ef191, 0x0204f38b, 0x004281f9, 0x0209713d, 0x03acca7e, 0x00276bb2}}}, + {X: Field{[10]uint32{0x01bb9f06, 0x02cf3294, 0x02b41b23, 0x02b3557b, 0x03469b21, 0x038386b1, 0x02b7589c, 0x02cc70a9, 0x02bb720a, 0x000a94e8}}, Y: Field{[10]uint32{0x0051f84e, 0x0295f8f5, 0x03256c21, 0x0036e912, 0x0027f781, 0x008341bb, 0x00d0f522, 0x025919e9, 0x0133ffde, 0x00046bfe}}}, + {X: Field{[10]uint32{0x01a1ac96, 0x00211d2b, 0x0087d05a, 0x01c5fedd, 0x0322b2fc, 0x02e3d72f, 0x03d2f77b, 0x000a1e9b, 0x035680c4, 0x00121f94}}, Y: Field{[10]uint32{0x02a849c8, 0x02434356, 0x03a731e9, 0x00954830, 0x01029c96, 0x0144c111, 0x0365326d, 0x00358dde, 0x03d54607, 0x0014ef5f}}}, + {X: Field{[10]uint32{0x027b3e16, 0x0396e659, 0x03a2963d, 0x02d20827, 0x01cf23c0, 0x00bd2d8a, 0x0332cfd6, 0x028307f0, 0x03cf291d, 0x000f9697}}, Y: Field{[10]uint32{0x02b86825, 0x0037b43e, 0x01c97b06, 0x03bdfd57, 0x008b33d7, 0x01ceec4c, 0x03028df7, 0x02687c12, 0x032c4338, 0x0021a61f}}}, + {X: Field{[10]uint32{0x023e256f, 0x01f5de43, 0x02b8ed5f, 0x03ed5c21, 0x00601840, 0x00b755c1, 0x002493d2, 0x011f08b1, 0x03c515a8, 0x0013e42b}}, Y: Field{[10]uint32{0x02b831be, 0x037b43ea, 0x01e33226, 0x0250ad61, 0x024ef939, 0x02b034f0, 0x01f6b089, 0x01a248cd, 0x0158ac2e, 0x0011b8c6}}}, + {X: Field{[10]uint32{0x023601fc, 0x01617078, 0x01a1782c, 0x00e29161, 0x02c2ff4b, 0x0086fa60, 0x02738071, 0x00fa9e9a, 0x012b40be, 0x002f81ce}}, Y: Field{[10]uint32{0x01f258db, 0x02a085bc, 0x0038da57, 0x01c799bb, 0x01431727, 0x036f8842, 0x01775b81, 0x027a39ef, 0x0057657c, 0x000e8561}}}, + {X: Field{[10]uint32{0x021108ed, 0x018d04be, 0x02603e05, 0x010546d6, 0x02ecc2f7, 0x01f09381, 0x02f9e6d4, 0x00dd7c88, 0x00e52140, 0x0021b09d}}, Y: Field{[10]uint32{0x00a96ef8, 0x0025a490, 0x003a2aa0, 0x01dbe4b0, 0x012703f2, 0x0326261f, 0x02b90b64, 0x035640cb, 0x02b94065, 0x001280be}}}, + {X: Field{[10]uint32{0x0173cf97, 0x023813cd, 0x03626267, 0x02a88449, 0x02287277, 0x036b04ff, 0x03b30561, 0x00e26049, 0x026be792, 0x00013f4e}}, Y: Field{[10]uint32{0x011173e4, 0x000d0b7c, 0x000d238c, 0x0288ed0e, 0x02f07ebe, 0x00ef1fa5, 0x00f4b4b4, 0x03b2db1b, 0x01a163cf, 0x00192628}}}, + {X: Field{[10]uint32{0x01117c94, 0x031da577, 0x0118cb68, 0x021aea06, 0x03cd2a5f, 0x03f33f41, 0x02fe78d1, 0x02f75e2a, 0x01ca5423, 0x0033e90d}}, Y: Field{[10]uint32{0x00ce1fe8, 0x01a0d5c4, 0x00cefd7d, 0x00ed2a7d, 0x01c399b5, 0x01a114e2, 0x03778546, 0x03de78d6, 0x011c02df, 0x002fd322}}}, + {X: Field{[10]uint32{0x021d446c, 0x024f8b0f, 0x010c1cdf, 0x03987cf2, 0x01414119, 0x01d1a6bf, 0x029e9277, 0x00f3166c, 0x031b7953, 0x002a96b2}}, Y: Field{[10]uint32{0x02a498ab, 0x01023d08, 0x01bc26bb, 0x004271d7, 0x028b11bf, 0x0060dd9f, 0x02d3854e, 0x030007ed, 0x01b78713, 0x002c37ca}}}, + {X: Field{[10]uint32{0x005c3d15, 0x00f82855, 0x01175635, 0x03d5341b, 0x03435c09, 0x006f294b, 0x03fa1c44, 0x03d56376, 0x02ecc21b, 0x0006e4f0}}, Y: Field{[10]uint32{0x03195ed2, 0x00fed28c, 0x00c4aeb5, 0x02c68837, 0x03f72e67, 0x0171b498, 0x00e8a5fd, 0x0243996b, 0x01ff7181, 0x0015b115}}}, + {X: Field{[10]uint32{0x03b91760, 0x0145260b, 0x010acd85, 0x02489190, 0x01c84800, 0x017dcac3, 0x039438b5, 0x03482fd8, 0x03f02566, 0x0005d132}}, Y: Field{[10]uint32{0x034c66f5, 0x03d48a77, 0x01f6c683, 0x03e12f68, 0x00068dc0, 0x029f495c, 0x01d5da57, 0x02d71674, 0x03a232b0, 0x001f9de9}}}, + {X: Field{[10]uint32{0x0302582b, 0x02a101ff, 0x01bedd24, 0x029e88a4, 0x021b9cb9, 0x0181ecc5, 0x02f8ffc0, 0x02300a30, 0x00a5ed44, 0x00282fa6}}, Y: Field{[10]uint32{0x011da6ea, 0x03065c40, 0x029a2274, 0x0207774d, 0x0376b869, 0x033dab23, 0x01444620, 0x00d496d3, 0x006a0239, 0x0039f30b}}}, + {X: Field{[10]uint32{0x03845882, 0x0244019e, 0x03e71148, 0x00673723, 0x038b2f2b, 0x0235d7a8, 0x02b2591d, 0x03dea558, 0x03f5dab5, 0x00383964}}, Y: Field{[10]uint32{0x02d67334, 0x017d70b2, 0x029c7e78, 0x031927d1, 0x00b5464d, 0x0290b38b, 0x03c26141, 0x0176d6ce, 0x036215e3, 0x00242231}}}, + {X: Field{[10]uint32{0x029290f5, 0x03f21e70, 0x02b408b9, 0x01b17924, 0x01ffe579, 0x039ec359, 0x031b928d, 0x00baaf5b, 0x0095a498, 0x001e0936}}, Y: Field{[10]uint32{0x00c7ee88, 0x02bc06af, 0x02d448a4, 0x005d5f36, 0x00d6bcf1, 0x0308cb18, 0x022d8bbf, 0x0214a0e2, 0x00688e42, 0x002b85d7}}}, + {X: Field{[10]uint32{0x01d96e66, 0x0073c43e, 0x00b5c421, 0x024fa5db, 0x012aa513, 0x00066b8b, 0x00e4a2cd, 0x00477085, 0x017ee0b6, 0x001274b9}}, Y: Field{[10]uint32{0x015b770a, 0x028f2caf, 0x014d25cf, 0x013e9e05, 0x0311c81e, 0x00a6ee7e, 0x01b79198, 0x007dc9de, 0x00ca8801, 0x003fe831}}}, + {X: Field{[10]uint32{0x035ead00, 0x004e73f1, 0x03ee8be2, 0x00cba71e, 0x02eeb3de, 0x00e262ba, 0x0012e8f8, 0x006a1618, 0x036b8f70, 0x00369817}}, Y: Field{[10]uint32{0x0011d246, 0x027973a5, 0x03633d69, 0x01f19d47, 0x025a2430, 0x024fd43e, 0x030ca5ea, 0x00706a27, 0x012ce98a, 0x0016e830}}}, + {X: Field{[10]uint32{0x02c16ff2, 0x03ff672e, 0x02785652, 0x00f070cb, 0x029307be, 0x03670e02, 0x01de2bd1, 0x0139b568, 0x03ebcde9, 0x002bbaaa}}, Y: Field{[10]uint32{0x010bf840, 0x006aebf5, 0x02460664, 0x006b0965, 0x03b62e49, 0x0041c24f, 0x000a52bf, 0x03b37814, 0x03558510, 0x000c0251}}}, + {X: Field{[10]uint32{0x010c40b7, 0x007fac68, 0x0378cb0e, 0x002f972d, 0x0066ca0a, 0x00c17e7a, 0x02d1e1f4, 0x03f992c6, 0x012b35f3, 0x0018bc62}}, Y: Field{[10]uint32{0x03f5780d, 0x0204e9c0, 0x028838e1, 0x0148b452, 0x03f1f890, 0x0316fb6f, 0x0287f090, 0x02fd28b8, 0x005ee600, 0x00069108}}}, + {X: Field{[10]uint32{0x02979382, 0x01356265, 0x01e944ac, 0x00cf6b89, 0x033a567b, 0x0029a020, 0x02be9f55, 0x00b5a4a3, 0x02c54677, 0x00308247}}, Y: Field{[10]uint32{0x02d4b31e, 0x02140b72, 0x002b2382, 0x01a4b56a, 0x02eb610c, 0x007f8651, 0x01fa722a, 0x0274c5cd, 0x025bd2e8, 0x0016669d}}}, + {X: Field{[10]uint32{0x03242367, 0x0003f7c6, 0x01ba597d, 0x01557e0f, 0x02e50a24, 0x027f9f08, 0x00e1b237, 0x0248d5c0, 0x015b1951, 0x002ff5f0}}, Y: Field{[10]uint32{0x0066b17b, 0x00af51af, 0x02694037, 0x031235bf, 0x03f4cdda, 0x03ebf4a1, 0x01272130, 0x031cd7a8, 0x03de545e, 0x002b1b79}}}, + {X: Field{[10]uint32{0x032ddc7f, 0x017d8d44, 0x00fd116b, 0x027dd3cf, 0x01958162, 0x020c76a0, 0x03d85073, 0x03f7de40, 0x03843cab, 0x00353539}}, Y: Field{[10]uint32{0x021758a6, 0x01d0b501, 0x0082d219, 0x0138ae3c, 0x01d1cd6d, 0x011d572c, 0x0265a284, 0x02eb2ff3, 0x011d582c, 0x00079258}}}, + {X: Field{[10]uint32{0x03908fdc, 0x03047223, 0x03d02cdd, 0x03e37d85, 0x014945b4, 0x0177630c, 0x03434a49, 0x02cd37ce, 0x0009c378, 0x000795d4}}, Y: Field{[10]uint32{0x00f6cdb7, 0x02161fc3, 0x005655bd, 0x008cffea, 0x0010bf21, 0x023c8273, 0x017458cb, 0x0256849a, 0x03a2810c, 0x001738df}}}, + {X: Field{[10]uint32{0x01408fd0, 0x03e570ee, 0x00ee1108, 0x01b4dc41, 0x01c9268c, 0x03f7d979, 0x035e690f, 0x01fae287, 0x022eac23, 0x002d699a}}, Y: Field{[10]uint32{0x03f72798, 0x00fbca32, 0x030de3c4, 0x0200c1d8, 0x03f8cc32, 0x0219a31b, 0x0042ba86, 0x03dba982, 0x02c0aaa4, 0x00264016}}}, + {X: Field{[10]uint32{0x0326fe0d, 0x030fb99f, 0x036e60cf, 0x00c0878f, 0x0166bc3a, 0x02ebabe3, 0x0090b063, 0x0164f19b, 0x01352599, 0x000768e7}}, Y: Field{[10]uint32{0x0141311f, 0x0216e172, 0x03e489f2, 0x029e3f1f, 0x00f7e58a, 0x00070c00, 0x030d076c, 0x00546d51, 0x005eb6b0, 0x00249ca8}}}, + {X: Field{[10]uint32{0x01a971b2, 0x01d10d2d, 0x005002b3, 0x016bce11, 0x024e900c, 0x007d0a3f, 0x02862d72, 0x00029d94, 0x00b6b100, 0x001fcec4}}, Y: Field{[10]uint32{0x02ecd385, 0x03481728, 0x03a9e1f5, 0x01d37cf0, 0x008c4a4f, 0x0095be82, 0x03bd4c90, 0x03b8cc44, 0x03e07907, 0x002e528b}}}, + {X: Field{[10]uint32{0x024eb2e0, 0x02132f5e, 0x018cbbaf, 0x0228fd74, 0x02e5dc36, 0x008030b6, 0x03eb61ae, 0x003e6fda, 0x03c66185, 0x00109841}}, Y: Field{[10]uint32{0x03e511af, 0x0231c319, 0x014f540f, 0x033a3a39, 0x000857ce, 0x034ebfa9, 0x0313488b, 0x03b43e35, 0x0078a9e6, 0x00387e9f}}}, + {X: Field{[10]uint32{0x01be9697, 0x01d290d1, 0x013e2fa3, 0x0265a03d, 0x01d6c940, 0x012273ea, 0x02093c21, 0x031310c4, 0x0256708f, 0x00155789}}, Y: Field{[10]uint32{0x004db6e7, 0x00b8af8a, 0x00cb002f, 0x008b1bd1, 0x01a78224, 0x019d2e84, 0x0166e06c, 0x02dda889, 0x03b71e3b, 0x00003d7b}}}, + {X: Field{[10]uint32{0x017dd290, 0x03f6c4a4, 0x028b3af8, 0x0095190a, 0x01033606, 0x0096dc27, 0x02a927e7, 0x0381f098, 0x017b5736, 0x001c5c2c}}, Y: Field{[10]uint32{0x030973b1, 0x02b9cd40, 0x01608627, 0x029adb7d, 0x0398b2c6, 0x029df382, 0x02d86e69, 0x02204ed6, 0x02a3f899, 0x003bd0df}}}, + {X: Field{[10]uint32{0x025c2180, 0x03b0c456, 0x00172aaa, 0x011b224c, 0x01eb4de6, 0x01ca913c, 0x02329d00, 0x03f44d27, 0x033e66fe, 0x00072a2a}}, Y: Field{[10]uint32{0x030a3c49, 0x003be98e, 0x03274fd2, 0x028554c6, 0x02c70103, 0x012613b4, 0x01da2a0f, 0x035dda07, 0x01c92a87, 0x001bf190}}}, + {X: Field{[10]uint32{0x005366b8, 0x0393e370, 0x007977d5, 0x034d21ed, 0x0385f057, 0x007069ca, 0x0150c1e4, 0x00ba0afc, 0x006af6d4, 0x0020d495}}, Y: Field{[10]uint32{0x02c5fdb1, 0x00ea0d61, 0x0084b138, 0x039ba831, 0x01ac92b0, 0x0070ac72, 0x008d7e72, 0x016c4aa2, 0x02b27ca2, 0x001daf96}}}, + {X: Field{[10]uint32{0x00904cd7, 0x02211667, 0x0244c3e9, 0x0285364b, 0x03353123, 0x0197123b, 0x03988ea7, 0x02e7558f, 0x037b1730, 0x000bc44b}}, Y: Field{[10]uint32{0x0234a44f, 0x029a094b, 0x031bb743, 0x02f50680, 0x0027d7a8, 0x00ab45d0, 0x0370b16d, 0x01f568cb, 0x0297f648, 0x003acd23}}}, + {X: Field{[10]uint32{0x02a5648a, 0x009423cf, 0x00f1d519, 0x00245a9c, 0x002eb6fd, 0x01042979, 0x032494ad, 0x031b1c75, 0x023c164d, 0x0003a100}}, Y: Field{[10]uint32{0x02f4462d, 0x01bf2007, 0x01b8a48a, 0x00c6ac51, 0x01225aa0, 0x008a05af, 0x032f5106, 0x000ca226, 0x018529be, 0x0018d3cd}}}, + {X: Field{[10]uint32{0x0228fc6b, 0x010049e3, 0x029afd6e, 0x0108c719, 0x004da403, 0x005355fd, 0x00039291, 0x03d49c2e, 0x011745da, 0x00254713}}, Y: Field{[10]uint32{0x0227f0a7, 0x02b92b56, 0x00921bb2, 0x03c71cbf, 0x03b9592e, 0x02ba0989, 0x0296f608, 0x003eecb1, 0x0311a8b3, 0x003e420e}}}, + {X: Field{[10]uint32{0x00cb19f4, 0x02e24be3, 0x007fd689, 0x010546ba, 0x01788458, 0x007e516e, 0x025548c5, 0x027cfb82, 0x0057f60b, 0x002b6aa5}}, Y: Field{[10]uint32{0x0361caa6, 0x01a16205, 0x018302e4, 0x01450339, 0x03f899b9, 0x0159d265, 0x039b0475, 0x03fbee37, 0x03f92145, 0x0020d195}}}, + {X: Field{[10]uint32{0x019e6ef7, 0x017f7b98, 0x03397749, 0x00d474c0, 0x00597f3e, 0x00b5fee9, 0x02ef3d85, 0x0028ed45, 0x02b30980, 0x001924a5}}, Y: Field{[10]uint32{0x021df105, 0x0214cfb5, 0x038535c7, 0x00776233, 0x005c8b44, 0x00bb7faf, 0x005f078e, 0x01459ff7, 0x00901021, 0x001133a7}}}, + {X: Field{[10]uint32{0x0006266f, 0x02534fd8, 0x012ce4bc, 0x02dac47e, 0x029f1e9d, 0x021d7c75, 0x02fe2ba7, 0x01d6fce2, 0x02979085, 0x000b075f}}, Y: Field{[10]uint32{0x01a2cf7f, 0x008dc983, 0x02ff50ba, 0x0307f469, 0x038c6c8e, 0x030272c0, 0x03b4e4bb, 0x02f422ee, 0x00bc030a, 0x0027ac94}}}, + {X: Field{[10]uint32{0x004647ec, 0x0355be5d, 0x0174f0f6, 0x029f46ef, 0x03b44ada, 0x014be865, 0x0293b100, 0x02f0c9e0, 0x038bed4e, 0x002c4c3f}}, Y: Field{[10]uint32{0x02a5eb33, 0x01643ffb, 0x01806212, 0x002c3730, 0x000136f6, 0x019b908a, 0x03d0a950, 0x031fd9db, 0x01e9b785, 0x00128291}}}, + {X: Field{[10]uint32{0x030e6231, 0x00335432, 0x0011732a, 0x012b5a3c, 0x0029bf68, 0x03335c73, 0x02e9c740, 0x02cb64c6, 0x019762ec, 0x0013ca96}}, Y: Field{[10]uint32{0x00cf17de, 0x0302fd5f, 0x00237377, 0x005b3def, 0x000fc442, 0x00c27b70, 0x0300dde7, 0x01c20fe9, 0x01b45cfc, 0x0037afe3}}}, + {X: Field{[10]uint32{0x03a23c0b, 0x0034b781, 0x030d1cab, 0x002ea678, 0x020a178c, 0x02968936, 0x01419a18, 0x01b89790, 0x01a17fbe, 0x0025fe7a}}, Y: Field{[10]uint32{0x03559128, 0x03688c95, 0x03c0a4dd, 0x02ef9c74, 0x026cb622, 0x003ed4e1, 0x034fdc87, 0x02d2003e, 0x026b0cce, 0x0006ac48}}}, + {X: Field{[10]uint32{0x01d9d8cb, 0x00ed1f42, 0x02f4cbb9, 0x03c42b4f, 0x00bfd486, 0x02dc4250, 0x01820673, 0x0345f900, 0x03e5e9f5, 0x00385fcf}}, Y: Field{[10]uint32{0x01272f58, 0x00a40eed, 0x0196b59c, 0x018b80fb, 0x0344ad7d, 0x0014492b, 0x0360b263, 0x00ea29ac, 0x0252615d, 0x003c449a}}}, + {X: Field{[10]uint32{0x032fa2de, 0x02a2ed9e, 0x026887a5, 0x014eab0d, 0x033ae668, 0x00e283f8, 0x00c3e945, 0x02060a40, 0x00467d63, 0x00068e7e}}, Y: Field{[10]uint32{0x02903aa5, 0x037bd6e0, 0x027bf28d, 0x00feed15, 0x0118492f, 0x035f1d40, 0x034dc019, 0x0169390a, 0x03995a62, 0x002b9f04}}}, + {X: Field{[10]uint32{0x002f5320, 0x021a4bad, 0x03e68cd1, 0x0205450a, 0x00baa605, 0x013ebfee, 0x0293e52f, 0x03e91242, 0x006127f6, 0x00229777}}, Y: Field{[10]uint32{0x016b0d8e, 0x020346a2, 0x0338974c, 0x0297f1e1, 0x00328e69, 0x03577f30, 0x02559ebb, 0x0377c690, 0x0325853d, 0x0017ad88}}}, + {X: Field{[10]uint32{0x0238c299, 0x0387e73f, 0x0190f7af, 0x01bfc234, 0x02b86490, 0x01bd6d76, 0x03dc17d5, 0x035bf351, 0x03b574b7, 0x00045f6f}}, Y: Field{[10]uint32{0x0190196b, 0x036e3757, 0x03b26bd5, 0x00bdae40, 0x00c50471, 0x0009902a, 0x03bc9233, 0x0051390d, 0x015130b7, 0x0012b348}}}, + {X: Field{[10]uint32{0x0270a537, 0x02168e62, 0x019f3f29, 0x031d0606, 0x00eec84e, 0x01428a98, 0x010706d9, 0x01fad5cc, 0x0228431c, 0x002c30c4}}, Y: Field{[10]uint32{0x0064ff78, 0x0122c02c, 0x02419a10, 0x01f10e3f, 0x030085e4, 0x0183608d, 0x00c32372, 0x01dbffa6, 0x03347928, 0x0029f7a6}}}, + {X: Field{[10]uint32{0x0243946f, 0x0347c0fc, 0x017e08d1, 0x02196962, 0x02736cbc, 0x005d81af, 0x03e6d5b5, 0x009d6b85, 0x00b9f493, 0x001f0843}}, Y: Field{[10]uint32{0x0359c63a, 0x038d4a45, 0x02db1c38, 0x02b0c3eb, 0x00920a7f, 0x02bc7c77, 0x00a92d87, 0x006173a9, 0x0123a8bd, 0x0005ec1d}}}, + {X: Field{[10]uint32{0x02d6e650, 0x01c5841b, 0x00aa1387, 0x02cbd15c, 0x03177b14, 0x02c3b285, 0x017b5192, 0x03b5118e, 0x0167578b, 0x0005cb94}}, Y: Field{[10]uint32{0x03830ba7, 0x01f3614c, 0x00cee173, 0x005f07e2, 0x039d3ba8, 0x00f1ceb4, 0x03de8038, 0x02e01758, 0x012e4776, 0x0027055d}}}, + {X: Field{[10]uint32{0x00030686, 0x02738a88, 0x019ca47e, 0x03ceaa70, 0x02c95a6e, 0x036b6011, 0x02373173, 0x03f6840d, 0x0040df25, 0x000586bf}}, Y: Field{[10]uint32{0x026089ce, 0x0035bc04, 0x03759ab9, 0x0182d895, 0x009926f1, 0x0291783a, 0x039c8193, 0x017ddad2, 0x0083c126, 0x00179bf4}}}, + {X: Field{[10]uint32{0x0216a85f, 0x034fb0e2, 0x018d9459, 0x0243b854, 0x002d194e, 0x01b8e451, 0x0369cf8b, 0x03b4cd35, 0x02a8e18a, 0x002e647c}}, Y: Field{[10]uint32{0x03cab7b0, 0x03433586, 0x00e8b1a0, 0x003886ca, 0x017e6e59, 0x0248f4b0, 0x0169d3e0, 0x01c723a8, 0x01a6b89f, 0x00074aea}}}, + {X: Field{[10]uint32{0x00ca8afc, 0x0328c351, 0x035026f1, 0x0121f56a, 0x007d6233, 0x03ecd91f, 0x016f4881, 0x03b9dfde, 0x009f5a6c, 0x0036b81a}}, Y: Field{[10]uint32{0x039c329c, 0x03221cf0, 0x01fa8c6c, 0x02c0c533, 0x0143ccc1, 0x00ef96e5, 0x01e69643, 0x02eb8a85, 0x0270f730, 0x003b99ed}}}, + {X: Field{[10]uint32{0x027e4e41, 0x03f63b22, 0x02e61aea, 0x02905a84, 0x03d72805, 0x018a7ed6, 0x0217ba14, 0x0270551a, 0x00cd75f8, 0x0011e963}}, Y: Field{[10]uint32{0x01fdd889, 0x0153cf0a, 0x007679b9, 0x02e5cf65, 0x02a4bc43, 0x007f07c2, 0x03e60bb6, 0x02043ad2, 0x03ed1bbb, 0x0030579f}}}, + {X: Field{[10]uint32{0x03040e3c, 0x0026d11a, 0x01698cef, 0x01a57142, 0x02d7582f, 0x013bd96d, 0x000697c9, 0x01bb8cc3, 0x03d02e3b, 0x003deb8b}}, Y: Field{[10]uint32{0x0019ca03, 0x03762b75, 0x00ea36a9, 0x0195e64d, 0x015eb495, 0x037506b2, 0x00d8e6dd, 0x004e6f15, 0x00aac527, 0x002b7a7e}}}, + {X: Field{[10]uint32{0x0012989d, 0x0112365f, 0x00dc8b6c, 0x0091757e, 0x00ae61cf, 0x03091296, 0x03e9c214, 0x02b88235, 0x02a89be2, 0x000557e7}}, Y: Field{[10]uint32{0x01b009ff, 0x033a74d9, 0x036808c1, 0x003d3345, 0x00cf5ea6, 0x032fd124, 0x0204abe6, 0x03466bf6, 0x01f3840c, 0x0004813d}}}, + {X: Field{[10]uint32{0x029d74f6, 0x018598c7, 0x01a5189a, 0x02e404f1, 0x01e35057, 0x0034fb8e, 0x01348a0e, 0x017c53e9, 0x01c3933b, 0x002a0f32}}, Y: Field{[10]uint32{0x0072a74a, 0x0352ebfc, 0x021dbe30, 0x00468a0f, 0x0052b91d, 0x007ef91e, 0x02a9c78e, 0x0211d878, 0x02d7fad6, 0x00102a99}}}, + {X: Field{[10]uint32{0x03b5f5df, 0x030fa959, 0x02cce11f, 0x02f6fca9, 0x00d7acef, 0x02912d55, 0x00a20e0f, 0x01708ca6, 0x01cfc07b, 0x00329254}}, Y: Field{[10]uint32{0x01f4afc2, 0x004b13c2, 0x02050b80, 0x0115e161, 0x0235aac5, 0x00a31e66, 0x01791a6b, 0x032beb1e, 0x03d76700, 0x00061aa2}}}, + {X: Field{[10]uint32{0x02b6787c, 0x0339c4a7, 0x011a9ae0, 0x0296e11e, 0x01d6760b, 0x02f090e3, 0x031f2a0d, 0x00407d79, 0x01e61bad, 0x0033e4b7}}, Y: Field{[10]uint32{0x003bcbd8, 0x014f88d7, 0x0159528f, 0x027444df, 0x026c9d8a, 0x00a51638, 0x00c1f053, 0x0079af2f, 0x01b7f3e3, 0x0029f4d4}}}, + {X: Field{[10]uint32{0x029c1179, 0x01466144, 0x0287d08f, 0x02a5b8a9, 0x03b06154, 0x020fa2cd, 0x039df9be, 0x00a0e8ed, 0x033ecfd8, 0x002c6ac2}}, Y: Field{[10]uint32{0x01506bbf, 0x017435ba, 0x0305812d, 0x0254e0df, 0x0099e973, 0x0204a403, 0x034cd97b, 0x014d2907, 0x02f34bab, 0x00336dfc}}}, + {X: Field{[10]uint32{0x021789ce, 0x02549283, 0x0035424e, 0x028a62cc, 0x01197296, 0x00ffaeb6, 0x0399295f, 0x0327a13e, 0x03299cd4, 0x00285d0c}}, Y: Field{[10]uint32{0x037e1afe, 0x00bd75fd, 0x03fc4428, 0x02913cbc, 0x035bee11, 0x0373e9b5, 0x0078088a, 0x00d5ddbc, 0x02f44cf5, 0x00102653}}}, + {X: Field{[10]uint32{0x01c0573b, 0x02868af6, 0x01e0b0d0, 0x011981fc, 0x0338b318, 0x006954c5, 0x03b946a6, 0x02b1f0f1, 0x00864efc, 0x0000906d}}, Y: Field{[10]uint32{0x03a0d574, 0x03d72607, 0x0197c832, 0x0166eb4e, 0x002f9801, 0x02f2900f, 0x01f3ba8f, 0x00734cc9, 0x0048eec6, 0x001733a2}}}, + {X: Field{[10]uint32{0x0291b387, 0x00f8f937, 0x0137ed75, 0x01534960, 0x03e3efd3, 0x01e66ac2, 0x01559adf, 0x01e611a6, 0x02096499, 0x00207e20}}, Y: Field{[10]uint32{0x0226d15c, 0x031c79aa, 0x01967a32, 0x0266be8a, 0x0243bda5, 0x03cf3236, 0x01e5caa5, 0x01c1846e, 0x01b85bfd, 0x0023e7fb}}}, + {X: Field{[10]uint32{0x024e5a5b, 0x03d75251, 0x006fe8fb, 0x01ad955c, 0x00c22da9, 0x028bb095, 0x00793d64, 0x00851480, 0x0231bd2c, 0x00127590}}, Y: Field{[10]uint32{0x0351e825, 0x0350ccf1, 0x0302b548, 0x0100fc69, 0x01bf9864, 0x01c71b76, 0x01f81216, 0x00b2b607, 0x02dab0d7, 0x003ebb23}}}, + {X: Field{[10]uint32{0x026e0ae4, 0x01f6db41, 0x029387e7, 0x013651db, 0x006daea2, 0x02dd0260, 0x03e1f159, 0x00e90471, 0x00324fad, 0x001d3053}}, Y: Field{[10]uint32{0x00641a41, 0x01ce2038, 0x009fd5aa, 0x0176af6e, 0x013ee016, 0x011b9ad9, 0x031a2cb9, 0x03972fc0, 0x02031fbe, 0x002bde54}}}, + {X: Field{[10]uint32{0x02a1e7c3, 0x012db5c4, 0x011b2a98, 0x00674276, 0x00930f9c, 0x004e0f1b, 0x03f42158, 0x036532f8, 0x009c7342, 0x00222f08}}, Y: Field{[10]uint32{0x005b3e08, 0x03265313, 0x02a2346a, 0x03985606, 0x01b817eb, 0x00a1d843, 0x0288866e, 0x021c8e26, 0x034576dd, 0x002b2df5}}}, + {X: Field{[10]uint32{0x026eb3f8, 0x0361738a, 0x02e77c1b, 0x01099daa, 0x0009bee2, 0x0285497d, 0x03b93c85, 0x02a2337d, 0x0068c81c, 0x00121b23}}, Y: Field{[10]uint32{0x03e52d54, 0x03749bd3, 0x0234ec1a, 0x0013eccf, 0x01d62490, 0x03d79a12, 0x02648706, 0x02a5f357, 0x014b035f, 0x00383fb2}}}, + {X: Field{[10]uint32{0x00a681a3, 0x033ae401, 0x02f14e28, 0x00f5b97e, 0x03ba3904, 0x034377cd, 0x01e30fb5, 0x02388ded, 0x02116c58, 0x001287be}}, Y: Field{[10]uint32{0x017b64f4, 0x03efc6a6, 0x00d538fc, 0x030506f6, 0x0365f2ac, 0x02f391db, 0x0137dd31, 0x01c596a2, 0x03373c90, 0x002ec659}}}, + {X: Field{[10]uint32{0x00eb28d2, 0x0110a51e, 0x0392f8da, 0x016dfdfd, 0x002632e8, 0x03bf9eed, 0x0317f308, 0x0027b436, 0x0006c696, 0x0035dd17}}, Y: Field{[10]uint32{0x01b96a73, 0x00fc208e, 0x0297cad1, 0x001fdc0a, 0x025371f0, 0x006b76c6, 0x0046e11b, 0x00af557f, 0x02754d1b, 0x0001d5d6}}}, + {X: Field{[10]uint32{0x03e68def, 0x01ebe90a, 0x015f49ca, 0x0143f666, 0x00dc333d, 0x03dd2a1f, 0x0208cedd, 0x009f1a9a, 0x032ea3db, 0x002f5d4b}}, Y: Field{[10]uint32{0x01e9491a, 0x03b0e2e9, 0x024d791d, 0x01b76a70, 0x02ef5c57, 0x01b54318, 0x00725ed2, 0x023482e9, 0x02af6747, 0x000de3e2}}}, + {X: Field{[10]uint32{0x03224d21, 0x0115ec07, 0x001f94be, 0x0131fccc, 0x0055eb30, 0x03380357, 0x0202bffa, 0x031faf19, 0x033315a3, 0x003bd620}}, Y: Field{[10]uint32{0x03517abd, 0x02830482, 0x0123ff46, 0x01532d69, 0x01eb52e0, 0x0210dd47, 0x01a95f7e, 0x037ef8f6, 0x02ab6253, 0x0015bace}}}, + {X: Field{[10]uint32{0x0253727a, 0x031810d4, 0x01f1fc1d, 0x0339fb7c, 0x0106b495, 0x010b7c90, 0x01beea4f, 0x02097682, 0x03747355, 0x000b0778}}, Y: Field{[10]uint32{0x03a150c2, 0x00ec74e1, 0x0058873a, 0x0340a34b, 0x005ff92c, 0x01dd9caa, 0x01986bdf, 0x03d7623e, 0x02609082, 0x0026164d}}}, + {X: Field{[10]uint32{0x000daf99, 0x03fd43ca, 0x02535324, 0x008aa23c, 0x00b78e2a, 0x03ce6cba, 0x00c90016, 0x000503d4, 0x031b23e6, 0x00127e35}}, Y: Field{[10]uint32{0x018b04ec, 0x024ea1ad, 0x0254622b, 0x03207f90, 0x00308111, 0x03dbf788, 0x00ec3393, 0x039f70cc, 0x02654807, 0x003d9aed}}}, + {X: Field{[10]uint32{0x009f37be, 0x0185eac6, 0x03ceb6df, 0x01e36d64, 0x02d18fdf, 0x0153ce94, 0x02a30f99, 0x018728ac, 0x0385754b, 0x000d9727}}, Y: Field{[10]uint32{0x0132825e, 0x00169054, 0x01a3af14, 0x000488da, 0x007681b6, 0x0028c9e5, 0x026aced6, 0x01af2ffe, 0x03e6aca5, 0x00310ffb}}}, + {X: Field{[10]uint32{0x01f1b5af, 0x013a2fc8, 0x023108e2, 0x00f86612, 0x027e2cb5, 0x028c473c, 0x02446c4d, 0x01a3b706, 0x03e9e896, 0x00073cb3}}, Y: Field{[10]uint32{0x00c966b7, 0x007bd688, 0x03803673, 0x004b8b2b, 0x03aebc7b, 0x029a17c8, 0x038f1041, 0x00c251ed, 0x01ac43c5, 0x001c795b}}}, + {X: Field{[10]uint32{0x008ca3ec, 0x03398dad, 0x03d5225d, 0x03e38072, 0x02219694, 0x01fa1de5, 0x011c26fa, 0x00089bce, 0x00796266, 0x003ccc0d}}, Y: Field{[10]uint32{0x02762827, 0x023e3e98, 0x030026f4, 0x03215aa4, 0x02afa585, 0x013e0e90, 0x0359ab87, 0x03a5176e, 0x03f4c110, 0x001f7a82}}}, + {X: Field{[10]uint32{0x00b27154, 0x030c94f9, 0x02df0587, 0x01a46b9e, 0x008756a9, 0x008a5fa8, 0x00664f90, 0x01b220e6, 0x004c4bc1, 0x002da249}}, Y: Field{[10]uint32{0x0050c856, 0x03466a39, 0x00364c27, 0x02b971c0, 0x00bd7483, 0x02d29d68, 0x03f89a90, 0x00da3325, 0x03481357, 0x0026d221}}}, + {X: Field{[10]uint32{0x038cbe41, 0x02c45018, 0x00517f3e, 0x00089035, 0x01a78b43, 0x0392f808, 0x032f8745, 0x00dc73fb, 0x00d2d6b4, 0x002fcd3f}}, Y: Field{[10]uint32{0x0397ac02, 0x01386557, 0x03546546, 0x00e09fd9, 0x001ef6a2, 0x006d0ef0, 0x0372914e, 0x01baba39, 0x00d27e32, 0x00339a22}}}, + {X: Field{[10]uint32{0x018d74fe, 0x03520844, 0x01cd110e, 0x018f116e, 0x00d51ffe, 0x01300094, 0x005a5944, 0x031e5b3a, 0x026d231b, 0x0030825e}}, Y: Field{[10]uint32{0x03e4ac87, 0x002da82f, 0x0372b135, 0x00f96e67, 0x01d1f92b, 0x0299d221, 0x023a85ac, 0x0305cf87, 0x0013fc4a, 0x00162c19}}}, + {X: Field{[10]uint32{0x017afa81, 0x01a8cc10, 0x026184d4, 0x0261036c, 0x02e3e817, 0x03191eba, 0x011b1de3, 0x0013cc28, 0x02223d88, 0x0021d298}}, Y: Field{[10]uint32{0x0380b429, 0x00e83b6b, 0x00f8f6b1, 0x03803bdc, 0x02b31668, 0x03263cd5, 0x02b181d5, 0x03988a5d, 0x01f67986, 0x00104ca9}}}, + {X: Field{[10]uint32{0x01bc605c, 0x021382bd, 0x03b85b97, 0x00f332a8, 0x021f2846, 0x0030fb51, 0x002227ab, 0x03564a05, 0x028a1a05, 0x002b1f1b}}, Y: Field{[10]uint32{0x018a2186, 0x02c52cc4, 0x00da4a08, 0x036da1e5, 0x01c107a9, 0x018fd71c, 0x0260a0a9, 0x00ce5fae, 0x0195581e, 0x00069668}}}, + {X: Field{[10]uint32{0x0333342c, 0x02c58e8c, 0x00a65575, 0x02e0bc95, 0x0344bc12, 0x005c5697, 0x0075c01a, 0x028fd822, 0x02d8d825, 0x000fc4f8}}, Y: Field{[10]uint32{0x0025e3b7, 0x00fe8716, 0x02724339, 0x033f5ee9, 0x036a2e6e, 0x02d788a4, 0x02f76a68, 0x009847ff, 0x0082fb2c, 0x002ebfda}}}, + {X: Field{[10]uint32{0x03a8fe2d, 0x03e57b2f, 0x03cec4d5, 0x003d327d, 0x01aa7e40, 0x007418c3, 0x03e26315, 0x01fce770, 0x0354515e, 0x0007afac}}, Y: Field{[10]uint32{0x025c85cf, 0x02847deb, 0x02daca6c, 0x02e6131c, 0x00c70724, 0x00617ce9, 0x00a2473c, 0x03373ce1, 0x00ef00c2, 0x0028b8d7}}}, + {X: Field{[10]uint32{0x0202b2ab, 0x00668777, 0x019a0d2d, 0x027388ae, 0x00b47d8f, 0x004ad176, 0x0059218d, 0x039d979b, 0x0365b211, 0x0030b736}}, Y: Field{[10]uint32{0x00f3be50, 0x01bd4389, 0x01237b14, 0x00cb25ad, 0x028722e0, 0x00967e21, 0x009326e9, 0x0045e9ca, 0x039ca960, 0x00382a96}}}, + {X: Field{[10]uint32{0x00bc0d45, 0x03a1e459, 0x01b85841, 0x02e09c32, 0x0207f360, 0x000e3db1, 0x02ed8a9c, 0x03451238, 0x01f7e2a9, 0x0012575a}}, Y: Field{[10]uint32{0x017088d2, 0x03d67825, 0x003e70bd, 0x02f84d0a, 0x03c48584, 0x013eb1bd, 0x034465d7, 0x0339ee0e, 0x022a1dab, 0x0017ecff}}}, + {X: Field{[10]uint32{0x0053bab2, 0x01eb21cd, 0x0169d203, 0x01deeb56, 0x01270a94, 0x0368fd45, 0x01be43d8, 0x0393e5c0, 0x01692139, 0x0033ab11}}, Y: Field{[10]uint32{0x00908070, 0x00b05811, 0x00b3bca3, 0x01035548, 0x02f385ea, 0x01812dac, 0x002f2bd9, 0x03a1cad8, 0x01d815f4, 0x002f47f6}}}, + {X: Field{[10]uint32{0x01407e0d, 0x015625c2, 0x0140682f, 0x006835b3, 0x034e6dba, 0x002881ab, 0x01284cbc, 0x02e30073, 0x00b93196, 0x001fb474}}, Y: Field{[10]uint32{0x012801c5, 0x03286287, 0x00e0af1b, 0x03036103, 0x0111018e, 0x035d6a71, 0x034ee732, 0x002f988b, 0x02c96ba6, 0x003a568e}}}, + {X: Field{[10]uint32{0x01040b04, 0x02dc5e28, 0x010fba24, 0x02c84c49, 0x03ac5fe4, 0x02e9f325, 0x00fd4365, 0x033b2250, 0x03664f42, 0x0001cbec}}, Y: Field{[10]uint32{0x007dce41, 0x028994f1, 0x029bcdbb, 0x0372887b, 0x0063d551, 0x02d4b3a4, 0x01e5c9b4, 0x0047d7d7, 0x031a93a2, 0x0003060a}}}, + {X: Field{[10]uint32{0x0008beea, 0x0183c118, 0x00309021, 0x00b56455, 0x03469019, 0x00f9b615, 0x0320043d, 0x00791759, 0x018c9ca9, 0x003741b3}}, Y: Field{[10]uint32{0x001e7ecd, 0x021771b1, 0x03ce272b, 0x016e402c, 0x01418970, 0x020faf60, 0x03a8a7ee, 0x03a8efe7, 0x03276eeb, 0x0033705c}}}, + {X: Field{[10]uint32{0x0178cd13, 0x02a6a64e, 0x00743da8, 0x010c0b8b, 0x003c708c, 0x02ffb6c4, 0x02504398, 0x01fc3c79, 0x0129e90a, 0x000203d8}}, Y: Field{[10]uint32{0x01deb82a, 0x009b53ce, 0x0000fe72, 0x0208e0a3, 0x02d95a30, 0x016d9129, 0x02f594f8, 0x03bfd28f, 0x0012145f, 0x001d365e}}}, + {X: Field{[10]uint32{0x005995b6, 0x0309f9c4, 0x01b24f5b, 0x00f13014, 0x020b48f8, 0x02bee774, 0x02970afb, 0x01422bbb, 0x00daf56b, 0x0015abcd}}, Y: Field{[10]uint32{0x01ae68bf, 0x02ac37b4, 0x0334d8a3, 0x016b7317, 0x03decca6, 0x00867734, 0x0105a4cc, 0x02386624, 0x02529e78, 0x0035077f}}}, + {X: Field{[10]uint32{0x023f91ee, 0x00f11393, 0x001f6ca3, 0x024e8687, 0x00148cf6, 0x01a27647, 0x005e29c4, 0x0196d031, 0x01ba7955, 0x00208089}}, Y: Field{[10]uint32{0x024b7db4, 0x000a2fae, 0x03334b24, 0x03c52ce1, 0x0011a0f4, 0x01e09a4a, 0x02bf5a31, 0x0270b819, 0x025bc89b, 0x000d88ab}}}, + {X: Field{[10]uint32{0x02ea57d2, 0x008cafa8, 0x037033bf, 0x02c5594a, 0x03ad388d, 0x0231fc27, 0x01a1b7ca, 0x0080aa25, 0x01bfcfcc, 0x001e497f}}, Y: Field{[10]uint32{0x0290525c, 0x00dcc253, 0x00d0a9dc, 0x0072a105, 0x021ebcc2, 0x01b4fd7c, 0x019cf5ec, 0x01f72455, 0x0301c9cb, 0x0011bdfb}}}, + {X: Field{[10]uint32{0x01d81808, 0x01fd8341, 0x039f6102, 0x012a6ffd, 0x02663879, 0x036f4ac7, 0x03316eb8, 0x039cc416, 0x036af38a, 0x0012c892}}, Y: Field{[10]uint32{0x015c3dac, 0x03e72c56, 0x029d423f, 0x02207f19, 0x00b6dc68, 0x007ff96d, 0x032ad2e1, 0x00c00aee, 0x0208b163, 0x000c50fa}}}, + {X: Field{[10]uint32{0x007380ee, 0x02bc831a, 0x013cd28d, 0x0192a904, 0x022c1bdd, 0x01b39223, 0x02a1a36e, 0x03d3ad80, 0x03fa4135, 0x000b01d9}}, Y: Field{[10]uint32{0x03bc16a7, 0x006f8ec3, 0x0389a5f7, 0x00ac4142, 0x0006a65d, 0x004dcf78, 0x002da710, 0x00c185f3, 0x03fce78d, 0x003770fb}}}, + {X: Field{[10]uint32{0x00a7ae7c, 0x0366ee94, 0x01ef1982, 0x03097544, 0x0137b5a2, 0x006a7e0d, 0x02ed2d94, 0x026a13bd, 0x013ee717, 0x0020e0df}}, Y: Field{[10]uint32{0x03b66dbe, 0x00092db8, 0x008d8556, 0x03c9e51b, 0x01fe2294, 0x029809ed, 0x02f1a495, 0x01ed32a1, 0x02166095, 0x00188807}}}, + {X: Field{[10]uint32{0x0095387a, 0x009c4256, 0x01d9bda4, 0x027875c3, 0x0225e50d, 0x00d6fc76, 0x028e0118, 0x03c15d4e, 0x0334e560, 0x0033c1d6}}, Y: Field{[10]uint32{0x02127018, 0x001c6128, 0x02a1404b, 0x03746035, 0x032b11d8, 0x00f7ce35, 0x0219f6f3, 0x03d348e3, 0x01d0330f, 0x0031cc82}}}, + {X: Field{[10]uint32{0x008931a4, 0x006e20df, 0x0329dcb0, 0x00b04020, 0x039d06ba, 0x0038faed, 0x00680300, 0x01d747bd, 0x00ff9b18, 0x003560fe}}, Y: Field{[10]uint32{0x03ae3292, 0x02f94f1b, 0x0258cd55, 0x0270ccee, 0x00aaac7c, 0x0165ad42, 0x03cfcc69, 0x024ae9af, 0x031c03f0, 0x003e33f3}}}, + {X: Field{[10]uint32{0x03eaefaa, 0x006de490, 0x02220343, 0x02cb687f, 0x0327568b, 0x010bb6c6, 0x01853723, 0x00e26ff0, 0x01b621d2, 0x001547fa}}, Y: Field{[10]uint32{0x023c24e0, 0x02b74095, 0x023d8c3b, 0x03fa5c48, 0x03ff48e5, 0x03cc4467, 0x02ff5057, 0x018f331a, 0x004ae485, 0x001b1da4}}}, + {X: Field{[10]uint32{0x016a80b2, 0x018fdbb4, 0x02da9a9d, 0x0252f239, 0x0051f063, 0x0339f264, 0x0162be7b, 0x00bc92c2, 0x00fc7406, 0x0006edde}}, Y: Field{[10]uint32{0x01d88318, 0x0385d018, 0x03bdb14b, 0x00bc775e, 0x0260e935, 0x03fc0dbe, 0x02700b68, 0x03459cf4, 0x013d2f4e, 0x0009d53d}}}, + {X: Field{[10]uint32{0x03e364aa, 0x00ff8439, 0x03be6e4a, 0x0313a5f3, 0x01aa0744, 0x03fe354e, 0x009f1a93, 0x0160be25, 0x02f71261, 0x00028542}}, Y: Field{[10]uint32{0x02ea4773, 0x037dc87a, 0x03ab99e0, 0x03b57e5b, 0x03100737, 0x01b86fd1, 0x02124715, 0x01c70be7, 0x02fea686, 0x00388a86}}}, + {X: Field{[10]uint32{0x032e2a9e, 0x00b856b9, 0x0380b724, 0x02f095e1, 0x00835ed2, 0x023a4f5a, 0x0163a030, 0x037e475e, 0x03df727f, 0x003253b0}}, Y: Field{[10]uint32{0x0152009c, 0x00d3485c, 0x030d50a9, 0x0042cfd5, 0x02011b28, 0x003eb427, 0x0312b35f, 0x014f1518, 0x00e97bda, 0x00291da8}}}, + {X: Field{[10]uint32{0x0146875a, 0x02d97dfc, 0x03f255f8, 0x0285e131, 0x02f186bd, 0x008d69ca, 0x01427394, 0x00c8c5f1, 0x01dbebe1, 0x000cd9ae}}, Y: Field{[10]uint32{0x0345d3cf, 0x00c9c984, 0x01862eea, 0x0064805c, 0x026b6206, 0x010e4657, 0x03213835, 0x00a22508, 0x007895f5, 0x00017a89}}}, + {X: Field{[10]uint32{0x00e8ba25, 0x030e3978, 0x02373974, 0x02f91130, 0x0358bec6, 0x0024acae, 0x005ef365, 0x0197b32e, 0x026ce522, 0x00185b23}}, Y: Field{[10]uint32{0x01aa0970, 0x0126fc73, 0x033caba0, 0x0240bc7b, 0x02724a98, 0x03d04926, 0x03286f45, 0x00963362, 0x01433d6e, 0x00134f55}}}, + {X: Field{[10]uint32{0x02651827, 0x008a47da, 0x00b1d043, 0x0298c825, 0x032617b3, 0x01177129, 0x001d86ef, 0x03a13a2e, 0x01772e38, 0x001d37c8}}, Y: Field{[10]uint32{0x02e01334, 0x011b6308, 0x0360c487, 0x0071a86c, 0x032a9ccf, 0x0326e695, 0x00abc6f9, 0x02549ff1, 0x03af30f0, 0x000130ca}}}, + {X: Field{[10]uint32{0x01accbd1, 0x03f14008, 0x00ce5d68, 0x0366fb83, 0x02532f8d, 0x03bd0bea, 0x01966d15, 0x0114ca5e, 0x01bf76b7, 0x00060528}}, Y: Field{[10]uint32{0x00d46bdc, 0x02feeb6b, 0x02ef3154, 0x01b826cb, 0x037af174, 0x03ea4ee6, 0x0205ad25, 0x0350e6c8, 0x01ff0da9, 0x0017d77d}}}, + {X: Field{[10]uint32{0x018625cc, 0x01db00ae, 0x02975c74, 0x019b108a, 0x035f444d, 0x03a17ef6, 0x01f22878, 0x01d49aeb, 0x029498ff, 0x000a2447}}, Y: Field{[10]uint32{0x02638537, 0x03240f07, 0x01ada5e4, 0x02ef8e02, 0x02eac150, 0x02c886e9, 0x0069542f, 0x01801a76, 0x00f35cf2, 0x00168d07}}}, + {X: Field{[10]uint32{0x01270865, 0x0343bf8a, 0x0279abd6, 0x006f9913, 0x02f441ce, 0x0227a1a1, 0x01ce2926, 0x011570e8, 0x0371e82a, 0x00356b3f}}, Y: Field{[10]uint32{0x0126d5e8, 0x031f6007, 0x0070e00d, 0x025a5636, 0x03ca8cde, 0x0344fc0c, 0x004971aa, 0x03a5c281, 0x008f1b46, 0x002ab1b5}}}, + {X: Field{[10]uint32{0x02711596, 0x002638b8, 0x00b6a91f, 0x015d4401, 0x008f03fc, 0x00842545, 0x0365e173, 0x00361675, 0x001b0221, 0x00173d47}}, Y: Field{[10]uint32{0x02d5c3b3, 0x016f73c9, 0x01838f39, 0x03ba8e65, 0x00017fe9, 0x028a8852, 0x031e58ea, 0x03d164b0, 0x01e0610d, 0x0007bac6}}}, +} + +var preG128 = []XY{ + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + {X: Field{[10]uint32{0x023809fa, 0x00ae3b74, 0x014be18e, 0x02cd4765, 0x00fd845c, 0x009147c2, 0x0293363f, 0x027c8a2e, 0x01be2e50, 0x000e0e07}}, Y: Field{[10]uint32{0x031fed52, 0x001d460c, 0x0324dbd7, 0x032ccb63, 0x003681fc, 0x0083ac73, 0x01405a55, 0x005f72c2, 0x010a0fb9, 0x003928cb}}}, + {X: Field{[10]uint32{0x03c2a310, 0x01099225, 0x026303ea, 0x02950048, 0x01f186ae, 0x0291a668, 0x0121b82a, 0x00ab9bda, 0x0324e437, 0x00124989}}, Y: Field{[10]uint32{0x0227ded0, 0x006da057, 0x038ce0c4, 0x004a9d7f, 0x036d1636, 0x01c50c0e, 0x02cfa569, 0x02afe568, 0x0373bca7, 0x0004cdf9}}}, + {X: Field{[10]uint32{0x02bd2d31, 0x012c1e73, 0x01b8d138, 0x015bfc1b, 0x004dcc1a, 0x011df8be, 0x02253b3e, 0x00324357, 0x028c1a24, 0x0038c195}}, Y: Field{[10]uint32{0x02546e44, 0x02d020e4, 0x03826692, 0x010af8dc, 0x02ffbc80, 0x03df436d, 0x00f2b107, 0x01098222, 0x03e37893, 0x0003ab1b}}}, + {X: Field{[10]uint32{0x023136b0, 0x0030e78d, 0x01dd9c53, 0x0366aad0, 0x0374ebf8, 0x00fef58c, 0x01b0e762, 0x033bf09c, 0x000e2428, 0x000ee784}}, Y: Field{[10]uint32{0x00dbbc8a, 0x03b05bdb, 0x01f81953, 0x028ceb4c, 0x02a2ae28, 0x03d1d6c9, 0x01533eb8, 0x02edc77c, 0x00152d16, 0x003ebee6}}}, + {X: Field{[10]uint32{0x03485d3f, 0x023c11cb, 0x03eee960, 0x01a2041e, 0x0317ca07, 0x0177b7bd, 0x036ca80f, 0x0326a4ad, 0x0149712a, 0x002ec2ab}}, Y: Field{[10]uint32{0x00a2f975, 0x00e4940f, 0x00bffe79, 0x03e8c59c, 0x00895a5a, 0x00a5f68d, 0x00d201f7, 0x0151e63b, 0x0053c583, 0x003a9a67}}}, + {X: Field{[10]uint32{0x02718dc9, 0x03b4ce8d, 0x023de4ae, 0x0136c044, 0x03e1e58b, 0x02bf8044, 0x028eb197, 0x03f30353, 0x02c8e4ee, 0x001e4242}}, Y: Field{[10]uint32{0x00fae7c5, 0x00c8ac47, 0x0008b963, 0x02dc2ea4, 0x02dd36af, 0x0366aa95, 0x01816cbc, 0x016e3c4f, 0x022b9190, 0x003aaadc}}}, + {X: Field{[10]uint32{0x0360c7d1, 0x025a531f, 0x01ad2a26, 0x039f35dd, 0x028dd71d, 0x01526e99, 0x003dbbce, 0x01ed5470, 0x01ade9f9, 0x0039df20}}, Y: Field{[10]uint32{0x02d72449, 0x01607ca0, 0x006d34ec, 0x03dc70a6, 0x03631470, 0x03aa0550, 0x03c3b323, 0x004c8717, 0x0078eef8, 0x000eb3c5}}}, + {X: Field{[10]uint32{0x01ccf6b0, 0x03ece915, 0x01341501, 0x02ba8b51, 0x003d633d, 0x037b61f3, 0x018878e3, 0x014473cb, 0x00e9dbce, 0x00378ad7}}, Y: Field{[10]uint32{0x01100666, 0x00a7adc4, 0x018bb348, 0x016b198c, 0x0065b8c4, 0x02c68dd1, 0x03717e98, 0x038386ef, 0x02f3d3c3, 0x003c415d}}}, + {X: Field{[10]uint32{0x03c03c56, 0x005182c4, 0x0258b26b, 0x02977919, 0x0329659c, 0x03048485, 0x0259fbd7, 0x028bf87a, 0x01ffd491, 0x00341ef7}}, Y: Field{[10]uint32{0x03405ce7, 0x00fd830a, 0x02ea76be, 0x03fe330b, 0x0161d963, 0x00778135, 0x01c40e2a, 0x025f743e, 0x0308cd3c, 0x002cab51}}}, + {X: Field{[10]uint32{0x036a4d51, 0x036ad06e, 0x0025710e, 0x01710d2e, 0x010f8da4, 0x025b3a38, 0x025ec4c3, 0x005abcdd, 0x027c5d30, 0x0020900f}}, Y: Field{[10]uint32{0x03463b19, 0x024bab5e, 0x03c1b11e, 0x03313b19, 0x0199ab6c, 0x00fa1014, 0x016baddb, 0x02dd9d11, 0x021be27c, 0x00034259}}}, + {X: Field{[10]uint32{0x010680cf, 0x032d219d, 0x0023f438, 0x00f65507, 0x01930f93, 0x0132bd36, 0x03faa58c, 0x009bd498, 0x0131fbd6, 0x003ab70c}}, Y: Field{[10]uint32{0x0087a914, 0x0253fc4b, 0x01a74360, 0x02770de4, 0x01a388fb, 0x01cb5740, 0x024b36c9, 0x02a25d71, 0x03b1c9b4, 0x0034f25d}}}, + {X: Field{[10]uint32{0x007987d9, 0x03ca427f, 0x038ac609, 0x0172ddf9, 0x0336bdd6, 0x019d23d3, 0x018a4b38, 0x03fc9314, 0x025f6758, 0x000e40fb}}, Y: Field{[10]uint32{0x002be83b, 0x03f8ab86, 0x028dab0c, 0x0061249e, 0x018d222a, 0x0348d1d2, 0x0115934b, 0x01075902, 0x014ea152, 0x0003a486}}}, + {X: Field{[10]uint32{0x03e6a5d9, 0x007e2096, 0x00e9323e, 0x010f6efe, 0x015759c3, 0x026a7c86, 0x035bdccf, 0x01228e11, 0x037839ab, 0x0034200e}}, Y: Field{[10]uint32{0x00582f0b, 0x012a4999, 0x01d24289, 0x01b39474, 0x0004ecf0, 0x00e2ebe9, 0x02ec15fb, 0x0325fa84, 0x0180ff29, 0x000b30ec}}}, + {X: Field{[10]uint32{0x00567ed0, 0x018a3ef0, 0x02c19215, 0x008f6a39, 0x018496dd, 0x033e2f81, 0x013a5aea, 0x01d26685, 0x0096b18a, 0x0007d5bc}}, Y: Field{[10]uint32{0x039dff58, 0x004f2d0d, 0x000d51fc, 0x03d06a4f, 0x01c94189, 0x02d9735a, 0x00044360, 0x03d2420c, 0x038a3b52, 0x003fbc8a}}}, + {X: Field{[10]uint32{0x038e213b, 0x03f016d8, 0x032974e0, 0x033f3c80, 0x0079e947, 0x008d2a8c, 0x006f5250, 0x01d0cb8e, 0x01b1a4a4, 0x000767da}}, Y: Field{[10]uint32{0x00d4ccbb, 0x00575bb9, 0x0372041f, 0x02cf4fdb, 0x005438d5, 0x00ac7689, 0x00500c3a, 0x001d86ce, 0x0017949c, 0x0036263b}}}, + {X: Field{[10]uint32{0x03629efd, 0x016a773e, 0x008b1aeb, 0x01537200, 0x00552133, 0x01719eb4, 0x03c43610, 0x032de04b, 0x01134d9d, 0x00004a32}}, Y: Field{[10]uint32{0x03e67c96, 0x01060602, 0x036e45ff, 0x0393b1bd, 0x02c160c8, 0x00267598, 0x03259360, 0x00984365, 0x014add15, 0x003fb8f9}}}, + {X: Field{[10]uint32{0x011a9685, 0x0038f643, 0x011fc49c, 0x015238b1, 0x00301f28, 0x01d581d7, 0x00b8d519, 0x02e53491, 0x012f5a95, 0x00087b00}}, Y: Field{[10]uint32{0x00de08ae, 0x0237864f, 0x00162d12, 0x029bf57f, 0x027418ed, 0x02527ca3, 0x03fef716, 0x0125fd31, 0x010577af, 0x000b7bc8}}}, + {X: Field{[10]uint32{0x02331cc5, 0x008a0d8f, 0x0311c584, 0x039df6be, 0x00761c3b, 0x031f3f1d, 0x0080e894, 0x022f0279, 0x0202fb9d, 0x001a23d4}}, Y: Field{[10]uint32{0x03302cd3, 0x02708631, 0x03d9462d, 0x02be27ba, 0x001a393e, 0x00900d0d, 0x007cabd9, 0x01069cbb, 0x015963b5, 0x0025ae9f}}}, + {X: Field{[10]uint32{0x03f02baf, 0x034ead3d, 0x03f682e4, 0x03bc3a2e, 0x010744d0, 0x0029434d, 0x0314c300, 0x02a3d6cc, 0x02ea1cb9, 0x003ed727}}, Y: Field{[10]uint32{0x03630418, 0x015fa77e, 0x02af0911, 0x0331f949, 0x006868e0, 0x01717a57, 0x028bd269, 0x031547ec, 0x0044e18f, 0x000a7ee2}}}, + {X: Field{[10]uint32{0x02c03421, 0x00d89732, 0x0380de0b, 0x03b1ed48, 0x01593168, 0x012a7787, 0x01f6a5d8, 0x02b8fcbd, 0x03e22eed, 0x003c51e7}}, Y: Field{[10]uint32{0x02764606, 0x015acb88, 0x02131cb8, 0x003120d4, 0x01c0b463, 0x03ef4d06, 0x0350d1a3, 0x022e084e, 0x015d2fd8, 0x0006990b}}}, + {X: Field{[10]uint32{0x031a7950, 0x0171ecaf, 0x0165a69f, 0x01eca261, 0x0200f60f, 0x03f83bfe, 0x005b0e09, 0x025dd24f, 0x01c5e819, 0x00089cfb}}, Y: Field{[10]uint32{0x027bda12, 0x02b8e7bf, 0x03530906, 0x03f13d42, 0x00b64691, 0x021254d6, 0x031a1df9, 0x01e364a7, 0x02388fd9, 0x002ceba8}}}, + {X: Field{[10]uint32{0x03ef5214, 0x0016b5e6, 0x0285656f, 0x03d2c518, 0x03496d59, 0x02ce768b, 0x03d10b32, 0x010de2d1, 0x000c3050, 0x00267e12}}, Y: Field{[10]uint32{0x0264b2cd, 0x029eb998, 0x0215171d, 0x00df9398, 0x02d930e4, 0x02d6aa67, 0x00bd397c, 0x010a1a36, 0x015d8e22, 0x00380075}}}, + {X: Field{[10]uint32{0x016a6f1f, 0x0195aea6, 0x03635bc9, 0x03561fd5, 0x0209c000, 0x024f2190, 0x00fdfc69, 0x004a035d, 0x017fe475, 0x0000e089}}, Y: Field{[10]uint32{0x0351d474, 0x01caab62, 0x019731c6, 0x00e78d96, 0x0130dbfa, 0x01ad7c7e, 0x01a4f1da, 0x032c1899, 0x033dfe52, 0x0030b71c}}}, + {X: Field{[10]uint32{0x00efb24b, 0x01179ffb, 0x034526e1, 0x03e7db57, 0x0262e5ea, 0x02b3211e, 0x01f4e1b2, 0x00e1af91, 0x02329125, 0x0008e84d}}, Y: Field{[10]uint32{0x016854c0, 0x0057d566, 0x03a6f49f, 0x01c0dcd2, 0x01413cc3, 0x03dc557c, 0x03817a1a, 0x02e888af, 0x037e0643, 0x00244a5d}}}, + {X: Field{[10]uint32{0x01149f0b, 0x002b0d5e, 0x039d48a3, 0x00f71102, 0x008cf559, 0x031737b5, 0x01791a18, 0x01937a8d, 0x026058a6, 0x0019967a}}, Y: Field{[10]uint32{0x02f2199d, 0x0031b5ac, 0x031ffc82, 0x036394d3, 0x035300d1, 0x010bf1b0, 0x007b69e7, 0x020dbecd, 0x0305a85d, 0x000ab731}}}, + {X: Field{[10]uint32{0x03a939fc, 0x0299f746, 0x01033037, 0x021d0508, 0x022899b4, 0x027f4a8f, 0x00e6f6c8, 0x034ed1fb, 0x03c6e1ac, 0x0014b70e}}, Y: Field{[10]uint32{0x03d05746, 0x03a270d0, 0x013e2709, 0x028fb946, 0x031e8f6b, 0x0168f13f, 0x003d9da1, 0x0041fef6, 0x034632ad, 0x00176bac}}}, + {X: Field{[10]uint32{0x01573551, 0x01dac435, 0x034f6173, 0x03add7c1, 0x01693fbc, 0x03251ef0, 0x01189ba9, 0x015d16f6, 0x029793cd, 0x001492ca}}, Y: Field{[10]uint32{0x00c80b71, 0x011b86ef, 0x02ca02d1, 0x0318f7b3, 0x01a6865a, 0x03a28bed, 0x02b92cc3, 0x03ec6a77, 0x01d6cb23, 0x0027a026}}}, + {X: Field{[10]uint32{0x0382756e, 0x01e45585, 0x029976fe, 0x02579641, 0x03525b7b, 0x02583a6d, 0x03e6c3dd, 0x01654e48, 0x01a8e2bc, 0x001cc860}}, Y: Field{[10]uint32{0x022e4823, 0x0318869c, 0x01d84eda, 0x0258523c, 0x03e3c42d, 0x02eba62a, 0x03a193c0, 0x03ac290a, 0x02b35592, 0x000945b1}}}, + {X: Field{[10]uint32{0x0102664b, 0x01c04479, 0x0315d8d5, 0x00f7ddba, 0x0249a7ae, 0x00bbdbf2, 0x038496ac, 0x00e3f7cc, 0x002d926e, 0x002e3a25}}, Y: Field{[10]uint32{0x02faf8eb, 0x00bd7b6f, 0x01d77f79, 0x0105a794, 0x03972486, 0x000c79b1, 0x0270ba22, 0x01623935, 0x016e7dea, 0x001e6435}}}, + {X: Field{[10]uint32{0x0098e4e5, 0x006de5f8, 0x001ae18d, 0x03989e25, 0x0119e744, 0x037733de, 0x00ac11e7, 0x02affdcb, 0x00f63e73, 0x000513a2}}, Y: Field{[10]uint32{0x0021837c, 0x027e0f0c, 0x02b3b4e0, 0x033df70b, 0x01158705, 0x029518cf, 0x018197fe, 0x03195431, 0x03f35df3, 0x00018f36}}}, + {X: Field{[10]uint32{0x003a9081, 0x023bef57, 0x0303975b, 0x024da055, 0x0160e5bc, 0x0271cf8f, 0x016a739c, 0x033638b4, 0x03dc489e, 0x00250db8}}, Y: Field{[10]uint32{0x01a7e59c, 0x002fd80e, 0x02d5e03a, 0x02cace99, 0x038e8d76, 0x02a139fd, 0x02a7806e, 0x01baff46, 0x031f50cb, 0x00051814}}}, + {X: Field{[10]uint32{0x00890db9, 0x01b09d48, 0x01e76193, 0x00177d9a, 0x03e840e0, 0x01c43464, 0x019b01a1, 0x03442d1b, 0x01617a56, 0x00274f09}}, Y: Field{[10]uint32{0x00521ea3, 0x019f38de, 0x02aca044, 0x0337a2bc, 0x001f89ff, 0x00b6a6e5, 0x01fee9b8, 0x03a6f30b, 0x00bc4c4a, 0x001aef70}}}, + {X: Field{[10]uint32{0x03db76c8, 0x02a1418f, 0x01d2d0dd, 0x02a2c398, 0x02d0aca5, 0x0114f13c, 0x00c6ae0b, 0x01fe2f86, 0x0250f51b, 0x000a7e63}}, Y: Field{[10]uint32{0x00e5d28f, 0x0038f1fc, 0x01186df8, 0x00c2b4de, 0x0358a6ec, 0x01016018, 0x02b8b211, 0x000c71cf, 0x00dcae8e, 0x0036bcef}}}, + {X: Field{[10]uint32{0x01c22c94, 0x02bc1d13, 0x02e1a538, 0x014a535d, 0x0217a897, 0x0375811b, 0x0005e311, 0x02a8d806, 0x00c2c71d, 0x00359f4c}}, Y: Field{[10]uint32{0x014f670c, 0x00452ee9, 0x03d969c1, 0x02faabd2, 0x00e87ebb, 0x00b81a33, 0x02e690aa, 0x001ec2e4, 0x00e712c8, 0x00122e6c}}}, + {X: Field{[10]uint32{0x03c81649, 0x019809cb, 0x00334835, 0x02e65e9e, 0x03059aa7, 0x0340e805, 0x032c9b76, 0x030b92dd, 0x03a88ce9, 0x003c8b0a}}, Y: Field{[10]uint32{0x01b7028f, 0x001bf77e, 0x019a3cbc, 0x02a4233e, 0x022d92dc, 0x015c09c2, 0x03a4e0f1, 0x02f85890, 0x0310f190, 0x001aaa79}}}, + {X: Field{[10]uint32{0x02c5f894, 0x00c25a66, 0x034a5eff, 0x03b73f01, 0x0336b722, 0x03bcc8d3, 0x02533c90, 0x01320f94, 0x018d06b9, 0x0003179c}}, Y: Field{[10]uint32{0x02eef436, 0x02cc5983, 0x01d7e642, 0x027b3111, 0x03f7f8ce, 0x02a71412, 0x024e810f, 0x01986775, 0x0051ccfc, 0x00092584}}}, + {X: Field{[10]uint32{0x0144d611, 0x019bdcde, 0x014a2c1f, 0x022cccd5, 0x02c291dc, 0x03e1fb93, 0x0218999e, 0x03adf55d, 0x00aac836, 0x0009aa2f}}, Y: Field{[10]uint32{0x03bcecc9, 0x0331976e, 0x027a6c69, 0x03438667, 0x00e57192, 0x00781d8f, 0x022da29c, 0x01998eb3, 0x01ba0723, 0x00308014}}}, + {X: Field{[10]uint32{0x01fa098c, 0x020cd18b, 0x027aa2c0, 0x03841d93, 0x016bcf65, 0x029925b5, 0x0301ba17, 0x0055166f, 0x0170fb7b, 0x000e238d}}, Y: Field{[10]uint32{0x007be798, 0x0003d7e8, 0x02bdea95, 0x0049176d, 0x0299120d, 0x038d12f9, 0x01561e5a, 0x003fc151, 0x0122a2eb, 0x000b5383}}}, + {X: Field{[10]uint32{0x01250709, 0x03e3dc85, 0x03fca7a7, 0x0070ba95, 0x0200da2d, 0x03aacb1b, 0x0227efa4, 0x01e0f88c, 0x03abb5a0, 0x001a0626}}, Y: Field{[10]uint32{0x007ae856, 0x02e0d34f, 0x00855a0e, 0x005cc34c, 0x003e42d5, 0x0145117e, 0x00954f62, 0x034fea85, 0x01833694, 0x002f4c2f}}}, + {X: Field{[10]uint32{0x012190ab, 0x0364344a, 0x03d42b88, 0x020ff5ec, 0x01ea6ff6, 0x00106289, 0x03b7aa90, 0x01de5659, 0x0023bb34, 0x00190b82}}, Y: Field{[10]uint32{0x03b4000f, 0x018e71fc, 0x00903210, 0x02418eda, 0x01286b46, 0x00e76bce, 0x02748926, 0x0014bf8d, 0x02a786ec, 0x0036dcf7}}}, + {X: Field{[10]uint32{0x00924afa, 0x01a0d719, 0x02027f91, 0x00bf4e61, 0x037f4eff, 0x0225abea, 0x01addea5, 0x015415d4, 0x0281e5bf, 0x0026adba}}, Y: Field{[10]uint32{0x0229bb6c, 0x0001eb1d, 0x02f2b47d, 0x026ca659, 0x03dd951c, 0x03392cf9, 0x0329efcb, 0x02979cbf, 0x02a74870, 0x000e301a}}}, + {X: Field{[10]uint32{0x014a8ee7, 0x020563ba, 0x01a62dd1, 0x0056f780, 0x01e059e0, 0x0227993e, 0x0298248e, 0x03da71c6, 0x01aee567, 0x002c2601}}, Y: Field{[10]uint32{0x0183d221, 0x01eca386, 0x0212c814, 0x02a038f6, 0x03dea885, 0x034882b0, 0x01382eb6, 0x004bbf31, 0x016a7ec9, 0x0018aba8}}}, + {X: Field{[10]uint32{0x0107e6e5, 0x01306f00, 0x03b5a82b, 0x03c25d6f, 0x0291d6b5, 0x020c5a46, 0x018bfbc9, 0x03568d29, 0x025b636e, 0x000f58ca}}, Y: Field{[10]uint32{0x03395a1c, 0x033e8c73, 0x01aef682, 0x0273c581, 0x027a7ee0, 0x032d3525, 0x036ba0f9, 0x005b64ba, 0x009e75bf, 0x0015de91}}}, + {X: Field{[10]uint32{0x00cef707, 0x0069a5d0, 0x0150ab1c, 0x00d4e8db, 0x03b51e36, 0x025ab22e, 0x02db69dd, 0x017fcb3b, 0x03f0f70d, 0x001ae086}}, Y: Field{[10]uint32{0x02d12e5d, 0x00ede271, 0x0347a6d8, 0x02d37e8b, 0x00006371, 0x03377aa5, 0x00286745, 0x03048220, 0x0211993f, 0x001484b3}}}, + {X: Field{[10]uint32{0x01728b23, 0x036e1511, 0x0196c789, 0x00c32476, 0x02dc33b3, 0x03364e53, 0x027740b5, 0x03f82e14, 0x01514496, 0x002fca52}}, Y: Field{[10]uint32{0x0112782c, 0x009cac7a, 0x03baec13, 0x00aaed06, 0x034c53bc, 0x004378e3, 0x03f745c4, 0x0339e8d0, 0x01e5da35, 0x001e42bb}}}, + {X: Field{[10]uint32{0x0175ec80, 0x02d80d47, 0x02f06742, 0x026c453d, 0x024906f6, 0x01126251, 0x0268267c, 0x025a2859, 0x00c382bf, 0x002954d5}}, Y: Field{[10]uint32{0x025962e8, 0x0298c332, 0x00c88179, 0x025b460a, 0x019dd6d2, 0x0337ed6c, 0x03319676, 0x00697ca2, 0x01dc4566, 0x000a026f}}}, + {X: Field{[10]uint32{0x0249a693, 0x03e8d109, 0x019f45a6, 0x02be13d4, 0x03b893f8, 0x03ed2603, 0x03a1574f, 0x020c46ef, 0x0036abcd, 0x003f0054}}, Y: Field{[10]uint32{0x019db819, 0x03d9dafc, 0x00789657, 0x03280f9f, 0x02f5542a, 0x026b34fd, 0x01cd0042, 0x03812ce1, 0x02781946, 0x00343da8}}}, + {X: Field{[10]uint32{0x019a7aae, 0x01e26003, 0x024eab75, 0x01b1447e, 0x0059caea, 0x012bef89, 0x02a799fb, 0x03cd489c, 0x010d9f81, 0x00185910}}, Y: Field{[10]uint32{0x025a7966, 0x031c54fb, 0x01ac0abe, 0x03d7539f, 0x034982ff, 0x016e4e5b, 0x03ee69c9, 0x027f34f2, 0x00800ba1, 0x0024af05}}}, + {X: Field{[10]uint32{0x030b5f2d, 0x003f2145, 0x01fc6faa, 0x01f47b01, 0x016e2591, 0x0060ad3d, 0x00f9a9b3, 0x035cddca, 0x01358de9, 0x003be059}}, Y: Field{[10]uint32{0x007ec595, 0x0320fa9d, 0x03d7e155, 0x03732c71, 0x010f1721, 0x02dbf4cb, 0x0249df88, 0x02a71141, 0x0026403c, 0x00370dc9}}}, + {X: Field{[10]uint32{0x0187a8ed, 0x03029222, 0x032e2642, 0x011a107a, 0x00178c56, 0x01c34b10, 0x0304e681, 0x00db7771, 0x00b989a4, 0x0010a30d}}, Y: Field{[10]uint32{0x02eebe06, 0x00deaf4e, 0x01f4f512, 0x01f9c651, 0x003836f9, 0x010da58d, 0x004dc3e6, 0x01191b28, 0x0158251c, 0x002c7c90}}}, + {X: Field{[10]uint32{0x01417a9e, 0x03f88199, 0x024a55ac, 0x01cdfb69, 0x025f19da, 0x02faef5a, 0x01e62437, 0x0055ed05, 0x0382f909, 0x001bad85}}, Y: Field{[10]uint32{0x00577b72, 0x013bfffa, 0x00c3904c, 0x03b8a43b, 0x02af03ed, 0x026710bd, 0x012f168f, 0x03cac5b2, 0x0146baed, 0x0013f9f1}}}, + {X: Field{[10]uint32{0x0376fa4b, 0x01c718a8, 0x01646e43, 0x01cf4530, 0x03cb6f95, 0x02338c77, 0x03830099, 0x013fb17b, 0x02f1466d, 0x00264b82}}, Y: Field{[10]uint32{0x01f9e825, 0x01a4354a, 0x01ae3871, 0x0398c75e, 0x0150d000, 0x002590d9, 0x001e3a90, 0x025acbac, 0x02691e43, 0x003438f6}}}, + {X: Field{[10]uint32{0x01721d11, 0x0210e0c1, 0x039c3010, 0x000e33d6, 0x00513e99, 0x00925a4d, 0x00f31d11, 0x0001e3c8, 0x024badc7, 0x003fb6d5}}, Y: Field{[10]uint32{0x00157a39, 0x01237bce, 0x00b2fa94, 0x021f5502, 0x02ba26ae, 0x015fc580, 0x015d97d6, 0x010833cb, 0x024957e8, 0x0006a38a}}}, + {X: Field{[10]uint32{0x033b24bd, 0x010c3401, 0x03575e54, 0x009989d2, 0x023e6832, 0x03109245, 0x007088d3, 0x02746049, 0x028a4dd8, 0x003cfc81}}, Y: Field{[10]uint32{0x03a2bfa8, 0x0069fdde, 0x00f0e75c, 0x017f87c7, 0x0312381c, 0x002a9f8c, 0x026ab1ee, 0x03d18850, 0x011900a7, 0x003caaaf}}}, + {X: Field{[10]uint32{0x00a13680, 0x00c1dc8f, 0x02e02b3d, 0x016364f6, 0x015b6aa4, 0x01daa160, 0x024e7c14, 0x028d6637, 0x025e4217, 0x000cae48}}, Y: Field{[10]uint32{0x02133802, 0x00d74396, 0x008a396f, 0x0051cce0, 0x03532462, 0x0341c7a5, 0x0185683d, 0x018d004a, 0x00042685, 0x001d19ba}}}, + {X: Field{[10]uint32{0x02e64a8a, 0x0266e7f6, 0x01c7fc62, 0x024fe893, 0x01ee6c6b, 0x03ad64be, 0x03899792, 0x035ac13f, 0x0287385e, 0x00214022}}, Y: Field{[10]uint32{0x0104a2df, 0x01b8a129, 0x023622ae, 0x023e8943, 0x0284b5b3, 0x0020961d, 0x01569f6c, 0x0015dbee, 0x022b8a5b, 0x0007c9e7}}}, + {X: Field{[10]uint32{0x002effd4, 0x0114bdaa, 0x030e9e44, 0x01883c04, 0x010b8353, 0x03f126ff, 0x00edac7c, 0x02ac2fb2, 0x0033ebbe, 0x00136b1e}}, Y: Field{[10]uint32{0x023c740a, 0x03426a80, 0x001f00cc, 0x02d76e3b, 0x01133dc3, 0x02d08df7, 0x014ada57, 0x02a9a184, 0x0170f230, 0x003f2746}}}, + {X: Field{[10]uint32{0x016dbeeb, 0x03cc40b5, 0x03d71031, 0x010406e4, 0x034b44de, 0x014d77d6, 0x0340226e, 0x01755066, 0x008145a6, 0x0026dd56}}, Y: Field{[10]uint32{0x0089a02d, 0x03674478, 0x00e1fa1e, 0x0185679f, 0x01c15160, 0x036ee8ed, 0x03382907, 0x00dedf26, 0x01710d69, 0x00340c90}}}, + {X: Field{[10]uint32{0x03bc8bdd, 0x00fb66b2, 0x004bdb58, 0x03291877, 0x0198b525, 0x02d9176d, 0x02e6e8b1, 0x029f5e99, 0x02b92592, 0x0006f5b3}}, Y: Field{[10]uint32{0x0229944c, 0x0242b126, 0x01e4e7b7, 0x03955473, 0x015a1c4c, 0x0296dc15, 0x037abb10, 0x022fa922, 0x028784a9, 0x00269677}}}, + {X: Field{[10]uint32{0x015b56ee, 0x03d4d56f, 0x00637268, 0x01f62d11, 0x016b3a3c, 0x03f9e1ba, 0x025b08a7, 0x00250594, 0x02b93b36, 0x00096a2c}}, Y: Field{[10]uint32{0x025f22ec, 0x0393a2e5, 0x0240ac45, 0x02bb7dc6, 0x0045f131, 0x03b1b154, 0x01027e63, 0x01a1ff6f, 0x00f75734, 0x000f1633}}}, + {X: Field{[10]uint32{0x03ed9f5f, 0x02c87945, 0x003c0d88, 0x02aa3695, 0x02bf5a1c, 0x0148975a, 0x01a57671, 0x00fbec88, 0x003327c3, 0x000912ca}}, Y: Field{[10]uint32{0x01f53d7d, 0x027c2ff0, 0x000dbc22, 0x0398110e, 0x0237f83c, 0x00a7d404, 0x02cec92a, 0x02254d6b, 0x02ace48d, 0x0008800d}}}, + {X: Field{[10]uint32{0x025dd1b7, 0x01928d4c, 0x01e64e97, 0x00775ab0, 0x0291f0cc, 0x0159a5e3, 0x0042d13e, 0x01e415ad, 0x000f27b8, 0x001be5eb}}, Y: Field{[10]uint32{0x03433d32, 0x0034ffe7, 0x01c814dd, 0x01697cb6, 0x007e937f, 0x0246ce28, 0x02ce1cc6, 0x031c1c89, 0x030cfac6, 0x0020f1b9}}}, + {X: Field{[10]uint32{0x021dce1f, 0x03120055, 0x02badc94, 0x0352c88d, 0x012d6abc, 0x01153c98, 0x00265cad, 0x0138b6ea, 0x020feb01, 0x001cb175}}, Y: Field{[10]uint32{0x03978fe2, 0x02d03698, 0x00bf0690, 0x02db491b, 0x0397b281, 0x03174eb2, 0x03282163, 0x00658ece, 0x02197ef9, 0x0038c466}}}, + {X: Field{[10]uint32{0x01f33825, 0x0367b435, 0x006ea707, 0x0252aba3, 0x002af32b, 0x0110686c, 0x018659df, 0x000619a6, 0x01a001b1, 0x002a5b4b}}, Y: Field{[10]uint32{0x02513f9f, 0x03a04202, 0x016906c0, 0x01c45aa4, 0x025659ea, 0x0230dc2a, 0x03cfd412, 0x0148d67d, 0x018305da, 0x0019835f}}}, + {X: Field{[10]uint32{0x03e3c4fa, 0x00537156, 0x00875173, 0x009e6431, 0x03d906aa, 0x01d8599d, 0x001d2008, 0x017b3066, 0x03634d81, 0x000b339b}}, Y: Field{[10]uint32{0x02ba4b50, 0x008cc8ef, 0x036e5d3c, 0x01d327b2, 0x01b33cb2, 0x03f4151d, 0x02f997a0, 0x027a446d, 0x00ddbd59, 0x00185484}}}, + {X: Field{[10]uint32{0x0245f0c4, 0x0226f5a9, 0x02f4660e, 0x03f1d628, 0x024558fa, 0x02e354ec, 0x00602d98, 0x034e6766, 0x0084525d, 0x00264ac0}}, Y: Field{[10]uint32{0x00e2f98d, 0x01935869, 0x02a572da, 0x0039657b, 0x02f5a5c7, 0x00508180, 0x005f40b1, 0x0168a631, 0x00d22654, 0x0020f2a6}}}, + {X: Field{[10]uint32{0x03eb7357, 0x03dd9ba6, 0x0388e44e, 0x027ad17a, 0x01c6b0c6, 0x03f52ddf, 0x0361ee43, 0x01867f31, 0x03453089, 0x0010d3be}}, Y: Field{[10]uint32{0x029291ea, 0x027bf08a, 0x01bd001e, 0x03220c2e, 0x0126967a, 0x00db02fa, 0x025586d2, 0x02e4b965, 0x016d01c0, 0x000f6ec3}}}, + {X: Field{[10]uint32{0x03fbc156, 0x037171f8, 0x02b884bd, 0x02271370, 0x00f0dbf5, 0x00fbf8c1, 0x02e47359, 0x00cc1828, 0x01ad2c68, 0x0002885e}}, Y: Field{[10]uint32{0x02033c1f, 0x001ebebd, 0x00b20192, 0x008c21b7, 0x0288a2d2, 0x036d8274, 0x00e6dfab, 0x0005da86, 0x01f8ab98, 0x003b914e}}}, + {X: Field{[10]uint32{0x0305a2e1, 0x00e41ebb, 0x00f146d6, 0x00a999c6, 0x02a445f2, 0x024887bd, 0x012bb400, 0x03851ea9, 0x001ed3e1, 0x000e4d02}}, Y: Field{[10]uint32{0x03b5b3c7, 0x02aca429, 0x0206214f, 0x03f9d4b1, 0x03d3a9fe, 0x03c7a566, 0x01e79d49, 0x006de882, 0x02563139, 0x002f0dc1}}}, + {X: Field{[10]uint32{0x0395d8ef, 0x022381f7, 0x013db396, 0x0388414a, 0x03f1f3f7, 0x03310957, 0x00383546, 0x02e4e401, 0x00e159a2, 0x000d6f09}}, Y: Field{[10]uint32{0x0223ae15, 0x03b42a24, 0x02dfa246, 0x034e2127, 0x00e87e0c, 0x0159c93e, 0x02beb5c0, 0x02636bde, 0x00700a96, 0x0037b87f}}}, + {X: Field{[10]uint32{0x0148127d, 0x0394962e, 0x01b48bc7, 0x0386f2b9, 0x0163aa14, 0x00176399, 0x012a0eef, 0x02d1ce15, 0x035c251f, 0x003d7479}}, Y: Field{[10]uint32{0x037170fe, 0x0084aa1b, 0x036fe92d, 0x03d02fde, 0x03e7d586, 0x00a614a2, 0x0009134d, 0x03c1623d, 0x01bc7044, 0x00389830}}}, + {X: Field{[10]uint32{0x03eb121c, 0x03687301, 0x00f54d12, 0x02cd80d4, 0x03f9617b, 0x02b2ddd0, 0x01170dd6, 0x00a0bc28, 0x02d36fed, 0x003b829d}}, Y: Field{[10]uint32{0x020ba5b1, 0x03debc50, 0x035166db, 0x01612d0a, 0x024e56c4, 0x03e78432, 0x02135eff, 0x02583c39, 0x02dbeba6, 0x003e33f0}}}, + {X: Field{[10]uint32{0x00a689d8, 0x01e43467, 0x01676f94, 0x03d85b69, 0x004d1879, 0x005dd345, 0x00ab377f, 0x01d99057, 0x03cf7892, 0x00278ee1}}, Y: Field{[10]uint32{0x02b3b577, 0x02a39b6e, 0x03482266, 0x025ad151, 0x027a9c2d, 0x006c7c9a, 0x033b0c2b, 0x028ab2c9, 0x0122da3c, 0x003e3cd1}}}, + {X: Field{[10]uint32{0x034868f0, 0x016cc43a, 0x0115286e, 0x031d3d89, 0x0012f409, 0x019ae2d4, 0x005b89ee, 0x010b00f2, 0x016fd089, 0x00389bc9}}, Y: Field{[10]uint32{0x02f210f9, 0x03a2fed5, 0x012f21bb, 0x00fcf13c, 0x033552c2, 0x00f26c49, 0x008c6562, 0x0127e9b4, 0x00d96fea, 0x002eacf1}}}, + {X: Field{[10]uint32{0x011da6c2, 0x01626000, 0x0021cf08, 0x014baa31, 0x01a3f5c8, 0x03c1eaf1, 0x00b67634, 0x020e6345, 0x0046a5d3, 0x0022b1d0}}, Y: Field{[10]uint32{0x0229b3dc, 0x0174c91c, 0x0288e149, 0x02543210, 0x024a71af, 0x00d500b0, 0x00f59160, 0x00c66215, 0x0393f56e, 0x00348329}}}, + {X: Field{[10]uint32{0x01932bd0, 0x01dea495, 0x03a83ac6, 0x02fecb20, 0x02753928, 0x03a074a7, 0x01531a86, 0x0253324f, 0x00956346, 0x0016c038}}, Y: Field{[10]uint32{0x00a99656, 0x00fbf598, 0x032d64bc, 0x00cdd200, 0x0242882b, 0x0003561f, 0x02daf180, 0x03123185, 0x027a8071, 0x00234bc9}}}, + {X: Field{[10]uint32{0x0211f0b1, 0x00d5fe27, 0x02a872c0, 0x026ad3a7, 0x01546ffb, 0x02ca9984, 0x01ae4ba7, 0x0175eeac, 0x00c4080c, 0x00058864}}, Y: Field{[10]uint32{0x02423525, 0x024c0c24, 0x019d8796, 0x00ba6317, 0x01bb8419, 0x00ef731b, 0x006d7a31, 0x022a7396, 0x01041244, 0x0036d788}}}, + {X: Field{[10]uint32{0x01b145b1, 0x0299db21, 0x0236cf26, 0x03726bfd, 0x03476774, 0x001805f6, 0x03f8520e, 0x020fa021, 0x0021b4b3, 0x003daa11}}, Y: Field{[10]uint32{0x0037a3b3, 0x01d2a010, 0x020a80ed, 0x0056fe23, 0x02937172, 0x03a3f87b, 0x03a2da82, 0x01c3b401, 0x01a95967, 0x0014131c}}}, + {X: Field{[10]uint32{0x032dd6e5, 0x01d66a64, 0x0013455a, 0x02795727, 0x0183e591, 0x0127e423, 0x038937da, 0x034f62cf, 0x0142f0b5, 0x0007c0b4}}, Y: Field{[10]uint32{0x01863e65, 0x0220b68e, 0x00348fb3, 0x017d22b8, 0x03fbc903, 0x036df27f, 0x02c2eae5, 0x01b7dd43, 0x03338ed3, 0x0039a972}}}, + {X: Field{[10]uint32{0x0178899f, 0x01889e07, 0x03a0434a, 0x03d44b5d, 0x0268e29b, 0x00d21295, 0x02e38c37, 0x0287fa8a, 0x016bc326, 0x00187d36}}, Y: Field{[10]uint32{0x03b4aab8, 0x00deb4b5, 0x02b38b3a, 0x012cdd79, 0x02217272, 0x00603097, 0x03970216, 0x016b1d93, 0x03386200, 0x001947bd}}}, + {X: Field{[10]uint32{0x01c11616, 0x005f2b8c, 0x019c19c9, 0x00ac6be8, 0x007c7ebe, 0x034a45b8, 0x008a71f8, 0x0179e602, 0x000d623c, 0x002e9f57}}, Y: Field{[10]uint32{0x015f5a51, 0x016c1f6f, 0x00958ce4, 0x039f99b2, 0x01a1ec37, 0x03ecd565, 0x02551530, 0x00fdb1e1, 0x03400d7e, 0x00369027}}}, + {X: Field{[10]uint32{0x025bdb09, 0x01be7464, 0x003c3bb1, 0x029a6af1, 0x01fe5a92, 0x036f0f86, 0x02a68ee6, 0x025df1b9, 0x0190eacb, 0x0022e429}}, Y: Field{[10]uint32{0x035df718, 0x00d4603e, 0x039a92a0, 0x01d760a6, 0x024d01ef, 0x01d1a9d4, 0x02734e1f, 0x0175642b, 0x0342ef65, 0x002973d7}}}, + {X: Field{[10]uint32{0x03f4fe4c, 0x03a6ab37, 0x025b71c9, 0x03ffd56c, 0x01f0d994, 0x02d6b85c, 0x00294a3c, 0x0133f73a, 0x02272191, 0x0021fcd4}}, Y: Field{[10]uint32{0x00babb2f, 0x00930a19, 0x03552dda, 0x00fc88a8, 0x01f26b28, 0x026a44cd, 0x027c1efb, 0x031787ab, 0x01af530b, 0x00331c74}}}, + {X: Field{[10]uint32{0x0377a15d, 0x03bb92b2, 0x0358b6c1, 0x027c61fb, 0x0383d550, 0x014c3c7c, 0x00ffe8a5, 0x014566fc, 0x0136ba40, 0x002bba93}}, Y: Field{[10]uint32{0x00d3ac1a, 0x01581e98, 0x033f78d5, 0x01f738da, 0x0196958f, 0x022aa8a3, 0x03031c24, 0x00f7e1f4, 0x01eae740, 0x0036d58f}}}, + {X: Field{[10]uint32{0x03cc7111, 0x00e2966b, 0x02db62a3, 0x00d95dd3, 0x00d8dda4, 0x02016353, 0x006f1ef0, 0x03ae755f, 0x018d3996, 0x000c03fa}}, Y: Field{[10]uint32{0x00c40e77, 0x01962c8e, 0x025e3a49, 0x009b49c8, 0x01d2e6e2, 0x010eddbf, 0x037913c1, 0x029033e4, 0x00178fdd, 0x00345228}}}, + {X: Field{[10]uint32{0x01c19fdb, 0x0017d0a6, 0x0073aa50, 0x006ddb53, 0x03d01e9c, 0x019d0f93, 0x01095a1f, 0x0051ba0e, 0x035e22cd, 0x0031c02b}}, Y: Field{[10]uint32{0x014b32c0, 0x0151aa86, 0x011d28b5, 0x024b0b54, 0x010d4a30, 0x02dba95a, 0x02b1fc6b, 0x00709c9e, 0x0181b1f0, 0x000ff800}}}, + {X: Field{[10]uint32{0x0350bc60, 0x030dd233, 0x034a5941, 0x01d7e5ae, 0x0194228f, 0x0211214e, 0x02147af3, 0x0104e06a, 0x00e117b9, 0x00340f42}}, Y: Field{[10]uint32{0x0096e31d, 0x001c6cea, 0x000fa10e, 0x01dba451, 0x01f47dd0, 0x015076a3, 0x00bfbfdc, 0x02f314b8, 0x03fd2785, 0x0016c467}}}, + {X: Field{[10]uint32{0x022bd361, 0x017697f0, 0x03832b39, 0x00fb2533, 0x03ea9c98, 0x02be0697, 0x017fadb6, 0x0082e15b, 0x00fa17a5, 0x001b19c4}}, Y: Field{[10]uint32{0x02804941, 0x028e4f3c, 0x00ad64fb, 0x002097b5, 0x01b036a4, 0x00225ec1, 0x01964f3c, 0x0207a906, 0x012636e2, 0x0036d3bf}}}, + {X: Field{[10]uint32{0x03d91bbb, 0x03cfef68, 0x021d9b46, 0x03a653e1, 0x025ea3bf, 0x00229766, 0x02cb900d, 0x01e859ad, 0x02399df4, 0x0035ed70}}, Y: Field{[10]uint32{0x00efe8ba, 0x03565f59, 0x03710cff, 0x0194a702, 0x03a3c8a0, 0x0253ff87, 0x003494d7, 0x03097a72, 0x034e4ab1, 0x003b5e47}}}, + {X: Field{[10]uint32{0x00f66c06, 0x02a7a394, 0x029524ab, 0x008c8d06, 0x0253ff2f, 0x03aaa8fb, 0x01eb8dcc, 0x02054b8b, 0x01ab8f72, 0x00243da6}}, Y: Field{[10]uint32{0x02fce91d, 0x0320b27f, 0x0008e641, 0x0339b98f, 0x00561558, 0x00da487e, 0x006d80ec, 0x004aee75, 0x03a77f53, 0x0022f430}}}, + {X: Field{[10]uint32{0x01fb65cc, 0x02b9c6a3, 0x0344abb9, 0x0338ada1, 0x0137557d, 0x0285bd5a, 0x01eaead6, 0x0370d324, 0x023e3d7a, 0x001343ab}}, Y: Field{[10]uint32{0x03a3de5a, 0x01b8bc87, 0x02a5352c, 0x02641425, 0x026e874c, 0x010aa94b, 0x019a6851, 0x021cc6ea, 0x0006a950, 0x00205ac2}}}, + {X: Field{[10]uint32{0x02f7de62, 0x023df26c, 0x031d0243, 0x0266381a, 0x01689a23, 0x00c54617, 0x034f8153, 0x0212637e, 0x02ddec31, 0x0011b367}}, Y: Field{[10]uint32{0x021f29bc, 0x0211be95, 0x0100810a, 0x01a0491f, 0x03e0d5d1, 0x0204ce22, 0x0164a8bb, 0x01e1d232, 0x01a3d5fd, 0x000ed6f0}}}, + {X: Field{[10]uint32{0x02ff730b, 0x013ae0c0, 0x000aebce, 0x03f88696, 0x00653748, 0x01154b90, 0x0176297b, 0x02aadc71, 0x000e3f6e, 0x00012ab2}}, Y: Field{[10]uint32{0x008c7954, 0x00d4e61b, 0x020509e4, 0x02a53c77, 0x0240d331, 0x02b1a811, 0x03e2dd5b, 0x03d1aa03, 0x000d8014, 0x000f50a8}}}, + {X: Field{[10]uint32{0x002a4114, 0x01a06956, 0x006374bb, 0x03d8bb2f, 0x02e03e96, 0x006664de, 0x01e45730, 0x0270244c, 0x0261b73d, 0x00166fa9}}, Y: Field{[10]uint32{0x01afa47d, 0x038f4b2c, 0x035c130b, 0x026af576, 0x00d9f263, 0x03a24541, 0x01062e78, 0x00b0ba07, 0x03e8ee8a, 0x000c6882}}}, + {X: Field{[10]uint32{0x00ca6037, 0x024d59e4, 0x003385e2, 0x02929387, 0x029ee089, 0x03b1e937, 0x019acd3f, 0x03ba48ac, 0x006588b2, 0x0001ffa4}}, Y: Field{[10]uint32{0x01e5c128, 0x03a4da4d, 0x032a7c69, 0x018f9fb1, 0x002659b7, 0x001d8ffd, 0x01eb3262, 0x00fbac7d, 0x0190c5f4, 0x0037ed17}}}, + {X: Field{[10]uint32{0x01322157, 0x03254625, 0x0262f19d, 0x011fcb20, 0x01f3a5fc, 0x03e3cbf4, 0x00b5e4ac, 0x01e225e1, 0x03913227, 0x0036ce43}}, Y: Field{[10]uint32{0x0290bbad, 0x01872b35, 0x02dc8d5d, 0x0302b7a0, 0x012aaeb5, 0x0298f6c6, 0x00fd7d4d, 0x020c7c25, 0x015b241c, 0x0010d925}}}, + {X: Field{[10]uint32{0x0391ebc8, 0x017501dc, 0x03c29e6e, 0x02980714, 0x00985732, 0x02ba3de3, 0x02a9e615, 0x0066b1f6, 0x0266e5fc, 0x000d3740}}, Y: Field{[10]uint32{0x01dd797b, 0x007a87f1, 0x02ddb661, 0x01ad148c, 0x0077a5db, 0x030ad22f, 0x0013b1d2, 0x03f80398, 0x02d80e73, 0x0030b5ad}}}, + {X: Field{[10]uint32{0x011772ab, 0x038f7c67, 0x004db336, 0x0314ca3e, 0x015e6c7e, 0x01b8bbe5, 0x01fcfbe1, 0x0182374f, 0x032b7e31, 0x003ba9fd}}, Y: Field{[10]uint32{0x014004bb, 0x0034c354, 0x029b88af, 0x015831af, 0x03172195, 0x00e6a9d1, 0x02a6d947, 0x02930d23, 0x00f1ccde, 0x002598b2}}}, + {X: Field{[10]uint32{0x00c391f2, 0x00f9e8e2, 0x007fc10d, 0x0190db64, 0x019376d2, 0x03a1584a, 0x01e412dd, 0x003ace4f, 0x007af1b1, 0x0031abc2}}, Y: Field{[10]uint32{0x00825144, 0x02d2b9d4, 0x00959eee, 0x0090b185, 0x01e5ff98, 0x033faae9, 0x018847a9, 0x01915e2b, 0x022e3185, 0x002ea675}}}, + {X: Field{[10]uint32{0x02ccefc7, 0x0132667f, 0x01518136, 0x02fd434d, 0x02aff37f, 0x032d0fd6, 0x033d034b, 0x015d02ad, 0x03356c71, 0x003ab8d1}}, Y: Field{[10]uint32{0x02fe4703, 0x03998e64, 0x01a9879f, 0x01b6d87f, 0x03968525, 0x02513dd2, 0x02f15d84, 0x03d91735, 0x0075da8b, 0x002e4e1b}}}, + {X: Field{[10]uint32{0x0340438f, 0x0093fdfe, 0x0046165c, 0x038c0764, 0x0241b68a, 0x01392589, 0x039a27e6, 0x023d5013, 0x00250f4d, 0x00129523}}, Y: Field{[10]uint32{0x016f6d10, 0x014bca06, 0x01578382, 0x00570a83, 0x014c2742, 0x038a698f, 0x01e40c67, 0x0233dbbd, 0x0085bd60, 0x002ba7cb}}}, + {X: Field{[10]uint32{0x00f744af, 0x02bcac3b, 0x01a53f43, 0x03678603, 0x03453318, 0x032cf02f, 0x019743d7, 0x0116a3a8, 0x0279dd65, 0x00186495}}, Y: Field{[10]uint32{0x03cb184d, 0x002913ca, 0x011a1726, 0x0075138f, 0x0347fc55, 0x00f92a87, 0x02c062ca, 0x014dcba7, 0x0184d721, 0x00281a0b}}}, + {X: Field{[10]uint32{0x0137ea2a, 0x03c05424, 0x004fe025, 0x02e14bfc, 0x0250267a, 0x01097bd8, 0x03a260d2, 0x02addb53, 0x02869574, 0x003876d7}}, Y: Field{[10]uint32{0x011905a8, 0x010f2054, 0x0277483f, 0x012fed25, 0x00836e20, 0x00318494, 0x01a99a1d, 0x03de8db0, 0x00219fd5, 0x00323abd}}}, + {X: Field{[10]uint32{0x0248c7f1, 0x027498f4, 0x004a7d2f, 0x02473f08, 0x0038e636, 0x007f613c, 0x00ab862a, 0x00e108a8, 0x03ca7392, 0x000c18b2}}, Y: Field{[10]uint32{0x019670cb, 0x03011ff7, 0x02b2cf55, 0x03c7327f, 0x00721a85, 0x038610c4, 0x0289eee1, 0x00a5c373, 0x02570e3f, 0x0023c44b}}}, + {X: Field{[10]uint32{0x01a4f739, 0x00500113, 0x00f4e4e8, 0x03ca5dd9, 0x039da74f, 0x02d4fe54, 0x007a861e, 0x00dbf3bb, 0x03ccaa97, 0x0019f0e4}}, Y: Field{[10]uint32{0x01853203, 0x011f1352, 0x013942d1, 0x03551b1f, 0x0033ac24, 0x03566d49, 0x00009d5a, 0x017f88be, 0x01d09a16, 0x0024f4ca}}}, + {X: Field{[10]uint32{0x0099bf5e, 0x00c213fa, 0x03728f94, 0x02c43a2e, 0x01ac5bc5, 0x0160731f, 0x01a5619d, 0x00861fb9, 0x01f236cf, 0x00319d1c}}, Y: Field{[10]uint32{0x01e2c513, 0x039a1223, 0x00aea62f, 0x00dfeda1, 0x003a533f, 0x0132ef32, 0x03c32477, 0x00c63650, 0x009c787b, 0x001d7243}}}, + {X: Field{[10]uint32{0x00ed1b52, 0x01fa62b9, 0x03070182, 0x03301951, 0x0112143a, 0x0096aab1, 0x033d7a40, 0x02376484, 0x03efd593, 0x00354057}}, Y: Field{[10]uint32{0x00f03d6b, 0x01b0975f, 0x0379f400, 0x0182de63, 0x00e99668, 0x00761177, 0x037c0d65, 0x00dbc570, 0x0216a022, 0x00110c15}}}, + {X: Field{[10]uint32{0x0164f2d2, 0x024a73a0, 0x003b73c1, 0x002473d4, 0x02243ca3, 0x0000bb66, 0x008ed564, 0x0258572d, 0x0365aaa8, 0x002baf2f}}, Y: Field{[10]uint32{0x00b3f019, 0x01f4dff9, 0x01ee535e, 0x015554e6, 0x02a6ee7f, 0x027223a1, 0x020305ba, 0x03b8ad08, 0x025d1a30, 0x0013f07c}}}, + {X: Field{[10]uint32{0x03b30e43, 0x03c03ffa, 0x00d8105e, 0x002ed4dc, 0x01bb8f98, 0x00ca8e74, 0x02d68219, 0x037bbd26, 0x02171727, 0x000572c5}}, Y: Field{[10]uint32{0x000ebd7a, 0x039f4afe, 0x02d93b1f, 0x01ad243a, 0x012dfff8, 0x01cd2cd3, 0x035c1b99, 0x0014ffb8, 0x008287fc, 0x00192b63}}}, + {X: Field{[10]uint32{0x0049c123, 0x000c2013, 0x026986bd, 0x008c18f8, 0x0119fb25, 0x00948468, 0x03b88a55, 0x0359d026, 0x009e8530, 0x00350108}}, Y: Field{[10]uint32{0x00a7a128, 0x03318890, 0x032c562b, 0x02fa28d0, 0x0046ef87, 0x02d68c9f, 0x01062753, 0x017467a1, 0x0168fdb8, 0x000dd8ff}}}, + {X: Field{[10]uint32{0x03ffdd96, 0x03a4e066, 0x02a4ed42, 0x025fd08a, 0x00d40b44, 0x030c9eb1, 0x02330c2f, 0x00a12563, 0x00cf0c23, 0x003ceafe}}, Y: Field{[10]uint32{0x015b0d5d, 0x0083a69f, 0x02061cc7, 0x03b1f33c, 0x01d1dfe9, 0x035e9d88, 0x01076432, 0x00c9f0fa, 0x0305d831, 0x00142187}}}, + {X: Field{[10]uint32{0x00874dea, 0x01ffdbdf, 0x03b4e57b, 0x011b0f92, 0x035cf92b, 0x0146e748, 0x004755a6, 0x036fecfe, 0x00932ee9, 0x001e28ca}}, Y: Field{[10]uint32{0x02c85895, 0x005fdae6, 0x02473b46, 0x02ca4b06, 0x01b3c36e, 0x0257aadf, 0x02ccd874, 0x0087d1ba, 0x003a9667, 0x002496de}}}, + {X: Field{[10]uint32{0x0350cd4a, 0x000c8269, 0x01e8df65, 0x0390fb55, 0x011b7d15, 0x01eed9e3, 0x001ed91a, 0x01be286b, 0x010f5d14, 0x00205948}}, Y: Field{[10]uint32{0x015d260d, 0x02e161e4, 0x0363a384, 0x019a87b6, 0x03859541, 0x00e5b1c4, 0x0145875e, 0x00af732f, 0x013a19e2, 0x003f8e43}}}, + {X: Field{[10]uint32{0x01fe3f09, 0x03295fdf, 0x032f3633, 0x007f3c01, 0x00ba7343, 0x00fbe866, 0x0317dd6f, 0x00f4d337, 0x01e86c2f, 0x001d49a7}}, Y: Field{[10]uint32{0x004805bd, 0x03454f9c, 0x020b1f5e, 0x027c77c6, 0x00f463f3, 0x017ba214, 0x006e3dbd, 0x009fb111, 0x025fd199, 0x002c58a9}}}, + {X: Field{[10]uint32{0x027145b0, 0x01394490, 0x02b38954, 0x02dea405, 0x03c520a7, 0x013ecbfd, 0x01c4e104, 0x0252796e, 0x028fb393, 0x00178db3}}, Y: Field{[10]uint32{0x0011614c, 0x0269381e, 0x03a4e7d3, 0x0170320a, 0x0022074c, 0x0152baa4, 0x01822ced, 0x025a9076, 0x0318292f, 0x001f1039}}}, + {X: Field{[10]uint32{0x02632746, 0x0302dac5, 0x03d25b05, 0x0181db69, 0x01c249d3, 0x02b260f9, 0x0176edc6, 0x02ff1b01, 0x0129fdeb, 0x0032331c}}, Y: Field{[10]uint32{0x00716fb1, 0x01d35e13, 0x01e68e46, 0x02bf53dd, 0x022653fb, 0x014e7fae, 0x011a332c, 0x011261db, 0x00e3a77e, 0x00122a33}}}, + {X: Field{[10]uint32{0x0246973f, 0x0303053a, 0x021dd2d6, 0x022dce0e, 0x03fa8579, 0x038f772b, 0x024d2a9a, 0x00f9b4e4, 0x0336f1ee, 0x0027f876}}, Y: Field{[10]uint32{0x0074f6d2, 0x039db38b, 0x0223e7c2, 0x03b2facc, 0x0343dc55, 0x00084ad8, 0x02d96588, 0x01170257, 0x02a86070, 0x00074d6d}}}, + {X: Field{[10]uint32{0x008ecda2, 0x01c4fd6f, 0x024657c9, 0x036f49b4, 0x01e23648, 0x030d449e, 0x019e02dd, 0x01d239b8, 0x038a3d45, 0x00132a2a}}, Y: Field{[10]uint32{0x023e73da, 0x02a68e53, 0x005cf164, 0x0236ec83, 0x0113b8a6, 0x0021db25, 0x03c9f23c, 0x036e489c, 0x02ad9bb7, 0x00229619}}}, + {X: Field{[10]uint32{0x032060c0, 0x01dbd62d, 0x017b13d3, 0x00607604, 0x03f1f308, 0x006c78a7, 0x01bc7242, 0x0227b173, 0x0150e4a9, 0x00032340}}, Y: Field{[10]uint32{0x0082ebd1, 0x018cd954, 0x0271749e, 0x00cb2c9b, 0x027ac4a7, 0x002c800c, 0x0242a9df, 0x00e9286b, 0x00a4c5a7, 0x00171620}}}, + {X: Field{[10]uint32{0x02f2aa31, 0x03868304, 0x03feafc1, 0x0113c4c2, 0x039e3684, 0x02072620, 0x03e1b7c9, 0x03f79927, 0x017bb4b9, 0x000f5855}}, Y: Field{[10]uint32{0x025b56f9, 0x021e64b7, 0x0228671c, 0x0254c63a, 0x021e2336, 0x01ac70df, 0x0160c90e, 0x02102cea, 0x03ff62cd, 0x0024cc59}}}, + {X: Field{[10]uint32{0x00e69e2a, 0x02bc5a49, 0x00552ccf, 0x03b72d89, 0x03feaada, 0x0170fb47, 0x0078dbb8, 0x0328256d, 0x039ffd44, 0x0019d5a7}}, Y: Field{[10]uint32{0x03eb7fcc, 0x006c9b59, 0x00102feb, 0x037abc3f, 0x03d16619, 0x02b7ec92, 0x01412887, 0x02f4b2aa, 0x0148230f, 0x0018aeca}}}, + {X: Field{[10]uint32{0x0372fbc2, 0x02dd4f9c, 0x01af70f3, 0x0340f3c3, 0x006e3075, 0x0319b6aa, 0x037d2792, 0x0050043a, 0x013edebf, 0x0018c4f4}}, Y: Field{[10]uint32{0x03573ef3, 0x0389ab74, 0x039c2f65, 0x01d2fabf, 0x032839f8, 0x00f81b8b, 0x01754556, 0x0049161a, 0x023050eb, 0x00111884}}}, + {X: Field{[10]uint32{0x01d23968, 0x03f78913, 0x031955e2, 0x03c857c4, 0x03088529, 0x01f1b2ca, 0x023085b4, 0x01ba3343, 0x01e7fbbe, 0x001be3b2}}, Y: Field{[10]uint32{0x0136cd79, 0x0031dbfb, 0x0078dc51, 0x002a0c07, 0x0323e195, 0x0311bbba, 0x003b215d, 0x00febad5, 0x0214523b, 0x0007ed87}}}, + {X: Field{[10]uint32{0x010b7f6c, 0x0301519c, 0x022447be, 0x01638380, 0x0336f0ae, 0x020e6d30, 0x01a0ec2f, 0x0286b2f6, 0x01ac3c5a, 0x0015984f}}, Y: Field{[10]uint32{0x02ca79e8, 0x01ceaa63, 0x0316cf7b, 0x02f775fd, 0x03530908, 0x010d2be2, 0x03233194, 0x0263e40e, 0x03ab86c3, 0x00091c98}}}, + {X: Field{[10]uint32{0x03aee08c, 0x02cf0861, 0x01da041e, 0x02c1a167, 0x0217e91a, 0x0169f775, 0x03e6e57c, 0x01c8644d, 0x01e7b414, 0x00327785}}, Y: Field{[10]uint32{0x038b0009, 0x03eff10f, 0x0370fd8f, 0x02c7d792, 0x0040cc5d, 0x00556473, 0x0111c877, 0x015b437f, 0x02a5cfa0, 0x0031c5e3}}}, + {X: Field{[10]uint32{0x016c0504, 0x01aeff7d, 0x01c48a8b, 0x00b74b77, 0x02f90618, 0x02f9925e, 0x02a4b0f6, 0x017a4390, 0x024a627d, 0x0001d642}}, Y: Field{[10]uint32{0x02c38587, 0x00f38aa9, 0x029f81f9, 0x01d4d4ed, 0x00cc5bd8, 0x02a9192f, 0x017e878b, 0x021d8172, 0x021ab549, 0x00358478}}}, + {X: Field{[10]uint32{0x03e19d6a, 0x025e421f, 0x0173b760, 0x0176fcf2, 0x021fcc55, 0x0076ccd8, 0x00dff728, 0x03815b6c, 0x020fb310, 0x00252c76}}, Y: Field{[10]uint32{0x014fc217, 0x021b78ff, 0x01159852, 0x02723cbf, 0x0045c42e, 0x0392e54f, 0x03a2ab4a, 0x0069580c, 0x013dd5b4, 0x0020c622}}}, + {X: Field{[10]uint32{0x00c9a6cb, 0x039b54a1, 0x011a5f20, 0x0084e385, 0x02d6f8f8, 0x02bb0b3e, 0x007d081d, 0x033bc438, 0x0299bcda, 0x002d6bd0}}, Y: Field{[10]uint32{0x0395448d, 0x0091e6ea, 0x00b2043b, 0x03f42bb7, 0x01c8cf65, 0x004df702, 0x032987eb, 0x02e0b7d5, 0x00078a7d, 0x00302611}}}, + {X: Field{[10]uint32{0x0139c3e3, 0x01da11da, 0x03b0c3c4, 0x01066226, 0x03f8ef61, 0x021460a6, 0x000a153c, 0x01161ce6, 0x01437074, 0x0017d26b}}, Y: Field{[10]uint32{0x007e04eb, 0x0346001d, 0x020f7d01, 0x0251172b, 0x022ae25c, 0x0103f092, 0x0208ae1b, 0x01b0f42e, 0x038520f5, 0x00171034}}}, + {X: Field{[10]uint32{0x007da385, 0x0386e792, 0x01c645cd, 0x02fc9bb2, 0x0216bea3, 0x01a24e50, 0x0230d1ae, 0x03047193, 0x027f88cc, 0x003daec1}}, Y: Field{[10]uint32{0x00288f55, 0x03b5c85e, 0x004fead4, 0x0367cafd, 0x0328dbfd, 0x037792a0, 0x01d4ec8a, 0x025e3362, 0x036d7268, 0x000c5691}}}, + {X: Field{[10]uint32{0x01df6950, 0x03b4affe, 0x03f10bee, 0x0124112c, 0x0152690b, 0x03000115, 0x01aea0ee, 0x00678253, 0x02dec02b, 0x001ed1f3}}, Y: Field{[10]uint32{0x00efe9a6, 0x03b64ef8, 0x01330280, 0x03603084, 0x0353b7cc, 0x015e462b, 0x03ac5a79, 0x037b25ba, 0x01f49bee, 0x0006f369}}}, + {X: Field{[10]uint32{0x0140876d, 0x03f59826, 0x01035a78, 0x0087000a, 0x01182236, 0x035c3d4b, 0x025e1ab2, 0x015b67ad, 0x03f3082d, 0x002e9a75}}, Y: Field{[10]uint32{0x035d393d, 0x01b447e5, 0x02c7684b, 0x00d6b86b, 0x001d1cf9, 0x003b894e, 0x036bdb95, 0x00a2703c, 0x02fd56d5, 0x0017d128}}}, + {X: Field{[10]uint32{0x03d929ff, 0x037f6e5e, 0x0347d1d3, 0x017e5d0c, 0x01fe7ec3, 0x00cc2e8e, 0x03713bf0, 0x03065488, 0x0094d226, 0x0028edc2}}, Y: Field{[10]uint32{0x02ae6135, 0x03013355, 0x00aa593c, 0x00b082ec, 0x01495edf, 0x02ace51e, 0x01ad2e10, 0x016a80d5, 0x03df4275, 0x00017432}}}, + {X: Field{[10]uint32{0x01c804e5, 0x0368df74, 0x0384f0e8, 0x02cd1233, 0x025ae602, 0x003aceff, 0x03e73b52, 0x0207f647, 0x023ebb2d, 0x0031d5b8}}, Y: Field{[10]uint32{0x00df49ff, 0x0044840d, 0x035f8985, 0x02a753ec, 0x025a4fab, 0x02192a60, 0x01f52b29, 0x01ae6f2a, 0x02faedf8, 0x00227d2d}}}, + {X: Field{[10]uint32{0x0271822c, 0x00bba10d, 0x02a00d17, 0x0271b37e, 0x0065410e, 0x030e4127, 0x011c2341, 0x0252afde, 0x00356fab, 0x000d8c9f}}, Y: Field{[10]uint32{0x03ed4c6d, 0x034187f4, 0x0127abe7, 0x00c63096, 0x01eb7456, 0x0253dc0e, 0x0201f04e, 0x0234d7c3, 0x00a4698c, 0x003f8d62}}}, + {X: Field{[10]uint32{0x03dd21bb, 0x0278418d, 0x00c32118, 0x02c61d2c, 0x00b66051, 0x017acabd, 0x02ecf6fc, 0x008c47d1, 0x03be8e37, 0x000edd6f}}, Y: Field{[10]uint32{0x02879908, 0x002a8a56, 0x03c2aea5, 0x02575f46, 0x022e42a0, 0x01e502d3, 0x015e2488, 0x00ce6916, 0x0233e3c3, 0x002e4512}}}, + {X: Field{[10]uint32{0x00d3c5e2, 0x029fdd7c, 0x017b4d92, 0x02f4de6a, 0x035f0272, 0x03e3d11d, 0x015ed721, 0x03a22831, 0x031057b4, 0x00112987}}, Y: Field{[10]uint32{0x02d80141, 0x03785120, 0x00086111, 0x0019b705, 0x02181623, 0x016de4e4, 0x016ec1f0, 0x0011925c, 0x02658034, 0x003a1c3a}}}, + {X: Field{[10]uint32{0x0097fefd, 0x026889c0, 0x00acb74c, 0x039b28a5, 0x011ebed2, 0x03a481bb, 0x00c6fe5c, 0x00f02809, 0x02f70066, 0x00046b80}}, Y: Field{[10]uint32{0x03d6a36f, 0x01f4a337, 0x0024bd69, 0x019a5039, 0x01a4e357, 0x01c108b3, 0x008737ae, 0x03ecc140, 0x0387a262, 0x0018d686}}}, + {X: Field{[10]uint32{0x02142f5c, 0x0021728f, 0x01981069, 0x03c84175, 0x008e987a, 0x02cc6cdf, 0x02ab1b0a, 0x017450b9, 0x010adfb2, 0x0031d44c}}, Y: Field{[10]uint32{0x02821014, 0x0250eebb, 0x018864df, 0x00752f30, 0x02ccca85, 0x039a1716, 0x00485a4b, 0x005ea7c4, 0x01d8ed27, 0x002918c3}}}, + {X: Field{[10]uint32{0x03efe46a, 0x02f76dfb, 0x02f7f790, 0x00ac3856, 0x00a639b7, 0x03ac94db, 0x0357b173, 0x03ce7105, 0x03c64009, 0x003ffd35}}, Y: Field{[10]uint32{0x025080e5, 0x01d91433, 0x02dc6e89, 0x01af6b5f, 0x014c110d, 0x024a92ec, 0x030697a2, 0x008b4440, 0x018e0ffe, 0x001a529e}}}, + {X: Field{[10]uint32{0x03f90534, 0x03233a70, 0x00d18c06, 0x0068c495, 0x0300932b, 0x03350dc1, 0x031e8bc1, 0x027d1ba4, 0x0239c13c, 0x001f5dba}}, Y: Field{[10]uint32{0x03e415bb, 0x00727fa2, 0x026d4d2a, 0x022ce696, 0x024cee43, 0x01163245, 0x007cf7c3, 0x00f63cd3, 0x02ba8f0a, 0x002f052c}}}, + {X: Field{[10]uint32{0x0207ad39, 0x00c3a557, 0x037e8a67, 0x017a097d, 0x01625fda, 0x00c2aaab, 0x00807075, 0x0393cdbc, 0x02d2ca6a, 0x002dbbf2}}, Y: Field{[10]uint32{0x01b1c765, 0x00864e6f, 0x005f00a4, 0x00687d90, 0x02469430, 0x00fa9ab5, 0x036f4a32, 0x034c9c0f, 0x00ef8a56, 0x00121a36}}}, + {X: Field{[10]uint32{0x0233a32e, 0x032a9b8d, 0x02b4ae30, 0x02ab034a, 0x0348e38f, 0x01d501b4, 0x03f9050e, 0x03129b4d, 0x012aa889, 0x0006812c}}, Y: Field{[10]uint32{0x0075911d, 0x01baf237, 0x02966c24, 0x0005ebe1, 0x0221e1c8, 0x039fa827, 0x0017dca3, 0x023641b2, 0x008ffad3, 0x003d0e83}}}, + {X: Field{[10]uint32{0x03209b7e, 0x02ab5460, 0x02a6c531, 0x00016935, 0x03b70e25, 0x0323b777, 0x0078b126, 0x0146413a, 0x00fe9b34, 0x002b6bac}}, Y: Field{[10]uint32{0x037522ad, 0x032c0e74, 0x03173f33, 0x03bf19e4, 0x02b1c59d, 0x02639bb7, 0x00c6b4e1, 0x00a69c23, 0x016ddd4d, 0x000ac9ac}}}, + {X: Field{[10]uint32{0x006e0679, 0x013ae20b, 0x010d19a9, 0x00961183, 0x00d97fa1, 0x0358c9d9, 0x012121d2, 0x03cff2d4, 0x02023931, 0x00013932}}, Y: Field{[10]uint32{0x00537467, 0x0208b461, 0x00348515, 0x005fc965, 0x02cc917b, 0x00a3accc, 0x00c68609, 0x029b2515, 0x02cd3704, 0x003be43b}}}, + {X: Field{[10]uint32{0x011e2971, 0x030821f0, 0x02a220a7, 0x02b2b700, 0x035654ec, 0x00e7d80e, 0x01b5ee41, 0x0304e9c4, 0x0279df69, 0x00287cf0}}, Y: Field{[10]uint32{0x02a16b2d, 0x0148eb6d, 0x023b2252, 0x035ea2a4, 0x02e8aafa, 0x03bf88c9, 0x03699165, 0x01e375fb, 0x039454cb, 0x0015c925}}}, + {X: Field{[10]uint32{0x0398c7a5, 0x004f8339, 0x003c4f4b, 0x0321a9a4, 0x03c19424, 0x03259d7f, 0x030c911b, 0x01a39bd2, 0x03814886, 0x002ab1db}}, Y: Field{[10]uint32{0x00dd2978, 0x029cb461, 0x03189588, 0x00dbac9d, 0x02c37595, 0x00d826f0, 0x011df3f7, 0x01f5b04e, 0x02dfdd6c, 0x00092b85}}}, + {X: Field{[10]uint32{0x00034769, 0x036dc074, 0x030a2a5b, 0x025a8578, 0x010ddce4, 0x012639b2, 0x03601666, 0x008bc378, 0x0171e596, 0x001c3a50}}, Y: Field{[10]uint32{0x0103b757, 0x0113c684, 0x0257d5e2, 0x02ef3d1a, 0x02446111, 0x00803e4a, 0x004d4e80, 0x032fbcae, 0x00a775a9, 0x0035b5f0}}}, + {X: Field{[10]uint32{0x02c78890, 0x023825a3, 0x002b6f28, 0x01ad6e0a, 0x03342670, 0x01aac711, 0x02fa849c, 0x01124925, 0x01e711d4, 0x003285f9}}, Y: Field{[10]uint32{0x03ce2c2e, 0x00bcfa22, 0x034105e3, 0x03b938a0, 0x00e6c58f, 0x005f4cb3, 0x039f501e, 0x01dee376, 0x02322ce5, 0x002cf775}}}, + {X: Field{[10]uint32{0x03aa62e8, 0x018c928b, 0x025717ec, 0x0006357f, 0x00255ec0, 0x0290eae7, 0x000700f3, 0x03f7a1ab, 0x018d8d70, 0x000685a9}}, Y: Field{[10]uint32{0x02710c27, 0x003ac746, 0x017e116c, 0x03cde8e2, 0x00dc2eb6, 0x015f074c, 0x03bc1372, 0x03c28f75, 0x02ba65af, 0x003cb2cb}}}, + {X: Field{[10]uint32{0x00b9d4f2, 0x02438ca5, 0x0301e981, 0x01eb8f97, 0x012dd335, 0x02acab04, 0x01c6bbf5, 0x037c430a, 0x02650b4d, 0x0023cb77}}, Y: Field{[10]uint32{0x034c6afb, 0x024ff937, 0x01f5d804, 0x016f4c9e, 0x0179df33, 0x01647df3, 0x02954bd8, 0x00db5413, 0x00f7e5a7, 0x00381ae3}}}, + {X: Field{[10]uint32{0x00950162, 0x0376a401, 0x018c5a3a, 0x0215b223, 0x00ba1d72, 0x0336cd59, 0x014562e0, 0x00f9f203, 0x0153f821, 0x000cc52d}}, Y: Field{[10]uint32{0x0043532d, 0x02a87e7f, 0x00c24fc4, 0x018804eb, 0x02b4dab4, 0x00f2b547, 0x00a7434e, 0x031543e5, 0x005ee3f7, 0x000cfa0f}}}, + {X: Field{[10]uint32{0x01304000, 0x00f16e89, 0x026062af, 0x0153b8ad, 0x03fa5895, 0x01229f30, 0x01b11a33, 0x0030bff1, 0x02f465ac, 0x001f041f}}, Y: Field{[10]uint32{0x035702c5, 0x0398fba5, 0x0124b508, 0x01e708fc, 0x0289b5a9, 0x015b4d97, 0x027fe78e, 0x001c1741, 0x03122e8a, 0x001ad6f3}}}, + {X: Field{[10]uint32{0x03e4f8b3, 0x01a95296, 0x00cb97b7, 0x0014dac8, 0x0019be46, 0x01565b42, 0x01e257ee, 0x037d9d44, 0x0029325a, 0x003a462a}}, Y: Field{[10]uint32{0x032fa8ae, 0x032481f3, 0x00ebfa9d, 0x03bc0ffc, 0x01b70af0, 0x00846705, 0x03a8f0d1, 0x014b0f86, 0x00a0b461, 0x0006a4bc}}}, + {X: Field{[10]uint32{0x01b9b079, 0x032533d0, 0x015d1e3f, 0x01f4b3a8, 0x01c346c9, 0x038c2720, 0x02dd2e3b, 0x0292e7a4, 0x0203d4f3, 0x0021dc36}}, Y: Field{[10]uint32{0x03123c03, 0x03a10b6a, 0x0005a10c, 0x01847ed4, 0x0053f964, 0x013d5feb, 0x01372fe6, 0x00f55c63, 0x030fdc63, 0x00340950}}}, + {X: Field{[10]uint32{0x00d8b22b, 0x012ab56b, 0x03ea1731, 0x01c318a0, 0x01a6589f, 0x02ef00e7, 0x026a57f6, 0x00955ec4, 0x013fae2b, 0x0031ad2b}}, Y: Field{[10]uint32{0x00d29bfe, 0x006bfeb6, 0x036fb46e, 0x023b3cf1, 0x0385f288, 0x01270e37, 0x01f278de, 0x00d048d7, 0x01cd2c1c, 0x003a148f}}}, + {X: Field{[10]uint32{0x03a86e14, 0x0232dc0d, 0x039689c8, 0x006c786a, 0x01462274, 0x03e1c586, 0x03b1e91f, 0x03e610dc, 0x01486ffb, 0x0026b3b6}}, Y: Field{[10]uint32{0x00b352d9, 0x01fd6482, 0x012cde8e, 0x03b29aa1, 0x0316e1e7, 0x02527074, 0x003cc321, 0x00c77ffd, 0x031f1b4c, 0x0035e9fa}}}, + {X: Field{[10]uint32{0x039007f3, 0x0153d7c6, 0x0322b87c, 0x015780e2, 0x01b08bf0, 0x03a2b29a, 0x034015b1, 0x036ad313, 0x036ffccb, 0x002bd454}}, Y: Field{[10]uint32{0x03130f7b, 0x03e12791, 0x027ef00c, 0x02ddc0e8, 0x00cbe813, 0x02ec74c2, 0x03fa85ba, 0x01fb3d27, 0x034c95c0, 0x002daec2}}}, + {X: Field{[10]uint32{0x01823ce2, 0x00bb94c4, 0x00c3e5bb, 0x03e8608e, 0x0156e02f, 0x01707249, 0x0045a092, 0x02aed5bf, 0x02df3ea0, 0x003b14c1}}, Y: Field{[10]uint32{0x01ee8b99, 0x004a100b, 0x009f6898, 0x02ff6507, 0x009457f4, 0x00f242f6, 0x00653524, 0x0197d060, 0x01b6720f, 0x00325433}}}, + {X: Field{[10]uint32{0x032d90a0, 0x0366ebb9, 0x00d876c5, 0x02320779, 0x03587f46, 0x024590d8, 0x0397ecd5, 0x01ef1868, 0x00a5be12, 0x000a4ec7}}, Y: Field{[10]uint32{0x0235d821, 0x01bdd36e, 0x0261bae2, 0x0090f463, 0x010443a5, 0x01d9218f, 0x03d81d91, 0x027c17a4, 0x030f238e, 0x00120840}}}, + {X: Field{[10]uint32{0x00865488, 0x007d21ad, 0x003c1256, 0x01088bbe, 0x00168771, 0x01a2ff04, 0x0151f0ee, 0x01aadaca, 0x037d9987, 0x003af952}}, Y: Field{[10]uint32{0x01381c07, 0x01bbae1b, 0x03c47924, 0x02835206, 0x0158d84f, 0x02090bd4, 0x0299d91b, 0x0200bfe9, 0x011ccaf8, 0x000a8759}}}, + {X: Field{[10]uint32{0x0064acdc, 0x03671a4d, 0x019dfd38, 0x00951174, 0x0133ac83, 0x00a74366, 0x0220109b, 0x035a6fb4, 0x01233ab0, 0x00223ddd}}, Y: Field{[10]uint32{0x03276702, 0x00a0b2f2, 0x00d5b79a, 0x01651670, 0x038e0590, 0x03b1afaf, 0x02a2cb1a, 0x017bd4c7, 0x0122fbd9, 0x0023e454}}}, + {X: Field{[10]uint32{0x02b3bb01, 0x005cd668, 0x0039fb81, 0x02e5ba51, 0x03c7fa40, 0x03afa5e5, 0x036cfa08, 0x00376276, 0x013de721, 0x0007611d}}, Y: Field{[10]uint32{0x01f41ad6, 0x029e187c, 0x0260dabf, 0x00ce7cd0, 0x012e889c, 0x01503121, 0x000b6d6f, 0x029361d1, 0x035aba53, 0x003dcd82}}}, + {X: Field{[10]uint32{0x011d4b2f, 0x033bed4c, 0x01e1c27f, 0x00f979d0, 0x0336f82a, 0x02ce2338, 0x01ae032c, 0x020b073c, 0x01f5176f, 0x000679a7}}, Y: Field{[10]uint32{0x03d5c143, 0x016ee9b2, 0x016e00b9, 0x02bd6ed2, 0x0309d9f7, 0x030745ec, 0x0175dc8c, 0x014efaf8, 0x00fec9ba, 0x0031007d}}}, + {X: Field{[10]uint32{0x02e3f2c9, 0x00d5332b, 0x0372953d, 0x01790ab7, 0x0119b04f, 0x01fca6a9, 0x01a93995, 0x0097ff7c, 0x0202c1f1, 0x001cc627}}, Y: Field{[10]uint32{0x0137f704, 0x00270069, 0x01424010, 0x00710407, 0x00d901de, 0x0390180e, 0x01d21b01, 0x01f3e188, 0x008f1c6e, 0x0014ae3a}}}, + {X: Field{[10]uint32{0x0087a74f, 0x0095ba4a, 0x0366901c, 0x02c296b9, 0x03278fd2, 0x01d1fc74, 0x038956cb, 0x02a2fd4b, 0x00828ff1, 0x00317af8}}, Y: Field{[10]uint32{0x01259860, 0x03c736f3, 0x033823ef, 0x0075b026, 0x02c506e5, 0x035cdad7, 0x0397dc92, 0x012e606a, 0x00b962e7, 0x00033963}}}, + {X: Field{[10]uint32{0x0182da76, 0x02815892, 0x01166435, 0x019f20ee, 0x011a7808, 0x02f220f5, 0x016feed3, 0x0038050a, 0x0221f799, 0x001e0f05}}, Y: Field{[10]uint32{0x0236da30, 0x0158f862, 0x03bc622f, 0x01d2f57f, 0x01f52245, 0x03ae0067, 0x0165c3e8, 0x02271a71, 0x03e2c9a1, 0x0000dc2c}}}, + {X: Field{[10]uint32{0x022b3305, 0x0267dbfe, 0x015794d7, 0x032cb1c7, 0x01fad66f, 0x0294dc87, 0x024cbd64, 0x01a9185c, 0x02800ccc, 0x0015579f}}, Y: Field{[10]uint32{0x004e9e41, 0x036980fd, 0x030eb63b, 0x00242cc9, 0x02db9b48, 0x023f9b75, 0x035ed312, 0x01c10863, 0x0165d39d, 0x0019eefc}}}, + {X: Field{[10]uint32{0x00243471, 0x0084e950, 0x0150a4b0, 0x02932b37, 0x030faa40, 0x010b1ac6, 0x028467e2, 0x0351b3c7, 0x0226ab1c, 0x00103126}}, Y: Field{[10]uint32{0x03dadf86, 0x0204fd8b, 0x0296bdc2, 0x00c19fd3, 0x03ad55bf, 0x00d08930, 0x039fdb4c, 0x0188bf82, 0x03005002, 0x0005a542}}}, + {X: Field{[10]uint32{0x03935298, 0x02d8bdb5, 0x021627c8, 0x009835df, 0x02473062, 0x0164f1d1, 0x0010b9f5, 0x02346272, 0x03e5db09, 0x003adace}}, Y: Field{[10]uint32{0x015c5bc8, 0x01d3c380, 0x022fb9bd, 0x01c512f8, 0x00c84e96, 0x00073b72, 0x01902317, 0x01bd707e, 0x01843f35, 0x000f4a55}}}, + {X: Field{[10]uint32{0x02b26091, 0x019c3397, 0x03ca903f, 0x00da6813, 0x03a06835, 0x034186d4, 0x020a0734, 0x0305a472, 0x00a42b55, 0x0005dc86}}, Y: Field{[10]uint32{0x03a5fa42, 0x02da432c, 0x00f4eced, 0x01c9d67c, 0x02057e0e, 0x017a2e5e, 0x017f243e, 0x02f1cddc, 0x021aa8a3, 0x00258459}}}, + {X: Field{[10]uint32{0x03d2a680, 0x020e99e3, 0x02be37f8, 0x018a2c1f, 0x02ea0c37, 0x009f099e, 0x0028c001, 0x017e29f4, 0x03a2f3bc, 0x002106a3}}, Y: Field{[10]uint32{0x012cf1b0, 0x00b53cd1, 0x0289d9a4, 0x02313e6e, 0x00052693, 0x0236ef73, 0x00577128, 0x007dde80, 0x037db2fd, 0x0015e6fc}}}, + {X: Field{[10]uint32{0x02dea82d, 0x0142985b, 0x01691322, 0x02735f94, 0x00358578, 0x00e6714f, 0x001421da, 0x01fc7b20, 0x01543a37, 0x002c07bd}}, Y: Field{[10]uint32{0x01a90265, 0x000802c9, 0x009eb962, 0x0347998e, 0x0082e119, 0x01e8dfc5, 0x03626a00, 0x02cbc4eb, 0x00e97e29, 0x000a3cc3}}}, + {X: Field{[10]uint32{0x00f38904, 0x006c2b01, 0x029a6259, 0x01f02ce2, 0x00ba344e, 0x03e32646, 0x02e70d6e, 0x03190c5f, 0x014e8e3c, 0x002e4f80}}, Y: Field{[10]uint32{0x000ac3d3, 0x027f2549, 0x001f72b2, 0x03b702b8, 0x00d0b368, 0x00bfe26d, 0x03152e10, 0x034431af, 0x01855bdf, 0x00004a70}}}, + {X: Field{[10]uint32{0x03acd522, 0x02fd5201, 0x0137305f, 0x031a2b20, 0x01a00601, 0x01b58c62, 0x000a1dd2, 0x00366bfe, 0x02f243c5, 0x00383d09}}, Y: Field{[10]uint32{0x02b749fc, 0x0035c177, 0x02d1e143, 0x00abac92, 0x021c1938, 0x033ce70a, 0x00bd848c, 0x037178c1, 0x03e0951a, 0x0025b620}}}, + {X: Field{[10]uint32{0x0073233c, 0x03aa6de7, 0x03df2147, 0x0052ceee, 0x00d5379f, 0x00ee7b01, 0x030adda6, 0x025eb4a1, 0x007440e8, 0x003847a7}}, Y: Field{[10]uint32{0x01c1f019, 0x03c2881b, 0x016c5cb9, 0x013767cf, 0x01e125e3, 0x0388b8d6, 0x01a9df03, 0x01d4c8fd, 0x014b2919, 0x001275b9}}}, + {X: Field{[10]uint32{0x016b2c2b, 0x03d9e9ea, 0x0191c79c, 0x01c26b11, 0x02ae38ee, 0x00009f30, 0x0396eca2, 0x03c514ed, 0x004b0c5e, 0x00246b56}}, Y: Field{[10]uint32{0x030bac2a, 0x030729d4, 0x001e23e9, 0x025fb3a1, 0x01565dfd, 0x017670f1, 0x0379e5db, 0x0314c447, 0x0213a620, 0x00360568}}}, + {X: Field{[10]uint32{0x0299f8d2, 0x01011850, 0x033dabfe, 0x00708c0f, 0x01103297, 0x02cc8bcd, 0x0013785c, 0x00d3c81d, 0x0392f4fa, 0x000f9c94}}, Y: Field{[10]uint32{0x0308ae85, 0x0088f95d, 0x0039e042, 0x015de256, 0x014e0c1d, 0x0241fbe9, 0x01482176, 0x03bb57cd, 0x02515add, 0x00238c8e}}}, + {X: Field{[10]uint32{0x01a98160, 0x03d5e411, 0x039bced4, 0x026e6808, 0x0191d911, 0x02a18fcd, 0x03c00acf, 0x0226ad20, 0x02c201a5, 0x0017a1ef}}, Y: Field{[10]uint32{0x02e7d47b, 0x009408fc, 0x032633a8, 0x00734335, 0x0233625f, 0x03f0e69b, 0x02f3c159, 0x01707e7a, 0x038433c7, 0x002a228e}}}, + {X: Field{[10]uint32{0x0268a0ed, 0x03e87234, 0x00f32489, 0x003b494b, 0x01da1826, 0x013a6642, 0x01cb6524, 0x00ecd5d2, 0x02132cb9, 0x0030b821}}, Y: Field{[10]uint32{0x008a5761, 0x00360aa3, 0x007644ed, 0x01934169, 0x0328e02e, 0x015381dc, 0x03038d68, 0x00d97751, 0x03ad1f16, 0x0034fcb8}}}, + {X: Field{[10]uint32{0x031978af, 0x005ee9c3, 0x0025c745, 0x034392e4, 0x023b9053, 0x0077650c, 0x02193c23, 0x0261a5ec, 0x005eccf0, 0x00264c13}}, Y: Field{[10]uint32{0x009dc789, 0x00066a88, 0x02111338, 0x03cc7836, 0x00ba1324, 0x00f74128, 0x03e77e34, 0x004e59bd, 0x027b638b, 0x003b9dfe}}}, + {X: Field{[10]uint32{0x00c5c6bc, 0x004c8aad, 0x02b1d1c2, 0x000d9435, 0x0325a79f, 0x027be256, 0x01f04f70, 0x03ecdd94, 0x00c559ad, 0x00103842}}, Y: Field{[10]uint32{0x039db653, 0x039192d9, 0x02b2cfc5, 0x02ae8253, 0x00210eb2, 0x011ffbd1, 0x02ff3f8c, 0x03992212, 0x03385733, 0x0022602a}}}, + {X: Field{[10]uint32{0x00c6a78a, 0x03ab3722, 0x01aca5bb, 0x037725c4, 0x006d6276, 0x03d4237d, 0x00315287, 0x001c8483, 0x02572d19, 0x00263220}}, Y: Field{[10]uint32{0x01a61c92, 0x0399dad0, 0x03256f3e, 0x003b8230, 0x00b57f27, 0x0341443a, 0x02ea7f48, 0x017fef44, 0x01761f5c, 0x001746aa}}}, + {X: Field{[10]uint32{0x00af6fed, 0x036ac818, 0x03740c05, 0x002601bf, 0x02d7b4cf, 0x005b0deb, 0x00eeab7a, 0x008c1ae1, 0x027a25e9, 0x000e26ae}}, Y: Field{[10]uint32{0x0065707e, 0x003b3db4, 0x01c13d6f, 0x00dcd7d8, 0x0049c326, 0x004aca64, 0x032ed608, 0x038ba34d, 0x00c9ec48, 0x0019ceac}}}, + {X: Field{[10]uint32{0x0253df17, 0x014fbab2, 0x03732614, 0x02ab94e6, 0x026619ea, 0x017c46ce, 0x02fda62e, 0x0255ba4f, 0x03ba832c, 0x00277193}}, Y: Field{[10]uint32{0x005990ac, 0x02ebf6bd, 0x0089f956, 0x0326520e, 0x038f60a9, 0x0228d63b, 0x0267ad8d, 0x02ac4290, 0x00a93c56, 0x000602ce}}}, + {X: Field{[10]uint32{0x024921f7, 0x0270557f, 0x008a9675, 0x00334f54, 0x03b3439b, 0x02d9c1ea, 0x003528b8, 0x030b0d88, 0x0218e758, 0x001c4463}}, Y: Field{[10]uint32{0x02104ee0, 0x01e78a2a, 0x0000b5ec, 0x03df8732, 0x0176bf22, 0x0046d4b4, 0x0108719f, 0x013a7192, 0x02f12c1b, 0x0030bd86}}}, + {X: Field{[10]uint32{0x02c3d096, 0x02ecaa0f, 0x0224245c, 0x008d94c6, 0x0146218b, 0x02b717f4, 0x00e09909, 0x03cf1249, 0x01ee11b9, 0x000cef3b}}, Y: Field{[10]uint32{0x00fbad0a, 0x0015f56b, 0x03e9d655, 0x023578c5, 0x03f83b3e, 0x011a53f6, 0x01a71f6f, 0x0319ce50, 0x011a6c22, 0x00057d2f}}}, + {X: Field{[10]uint32{0x0213ccb4, 0x02c83713, 0x031d0e66, 0x0101d661, 0x01fbd977, 0x00bf6e95, 0x021e5cb6, 0x03a7c7c5, 0x033a4ab5, 0x0012d666}}, Y: Field{[10]uint32{0x023fb523, 0x020a6752, 0x034232b1, 0x0268b1b7, 0x006c9601, 0x02cd0851, 0x03064119, 0x009cae2d, 0x01da9035, 0x0018d40e}}}, + {X: Field{[10]uint32{0x01269d10, 0x010d96c8, 0x03627569, 0x0368d7a5, 0x02decb8d, 0x0144d809, 0x038f6429, 0x0132a506, 0x034cdae5, 0x00067daf}}, Y: Field{[10]uint32{0x033c95d7, 0x024b1933, 0x03f3da1c, 0x01ad8274, 0x036cb31a, 0x02c9d40b, 0x00bca48d, 0x001b7099, 0x03dc090b, 0x0028930f}}}, + {X: Field{[10]uint32{0x0301314c, 0x03751bc6, 0x0267a058, 0x01d6c5de, 0x028a2708, 0x02b41ceb, 0x0229adf7, 0x034537d9, 0x01a98027, 0x002f0f7c}}, Y: Field{[10]uint32{0x008d1f76, 0x02cc2ae0, 0x005e7b6b, 0x0195dc1d, 0x01934450, 0x03645462, 0x0233e898, 0x00741cbb, 0x029154f5, 0x0026774e}}}, + {X: Field{[10]uint32{0x01d72c3c, 0x012a795f, 0x0285e1ea, 0x00793768, 0x02c34ef3, 0x0306b97d, 0x025f5b5a, 0x01c3a134, 0x0264521a, 0x0025de90}}, Y: Field{[10]uint32{0x039f5a0c, 0x03a6ca8a, 0x0041b4fc, 0x01a0cb87, 0x01dbf44f, 0x03500ff2, 0x0025b61c, 0x00bf9341, 0x00197aab, 0x003c6ff2}}}, + {X: Field{[10]uint32{0x01c9b339, 0x004b1a43, 0x01b47a1c, 0x0044f89c, 0x00098b26, 0x02b71ec7, 0x014a7f58, 0x01694cfb, 0x024a85fc, 0x0017f7f7}}, Y: Field{[10]uint32{0x02c6555a, 0x0113d245, 0x02b1ce97, 0x0222cbdb, 0x01731c25, 0x01bec92e, 0x011bad52, 0x02539825, 0x03afbd6a, 0x000fb7ca}}}, + {X: Field{[10]uint32{0x01e9c50d, 0x000508fa, 0x007476ce, 0x02fe089a, 0x00afc17a, 0x03edf6e3, 0x02c1ac50, 0x022bf3ba, 0x032cdcd2, 0x002e2f35}}, Y: Field{[10]uint32{0x03c55e9d, 0x01144940, 0x026dbf2c, 0x038da9d5, 0x039cb6d0, 0x01dc694f, 0x03d9f2f3, 0x03015e6e, 0x03c52e6d, 0x0002098c}}}, + {X: Field{[10]uint32{0x01f75c77, 0x02290700, 0x01c728be, 0x03a769cd, 0x01721bc2, 0x03a51959, 0x01d01eb6, 0x030def19, 0x0199133b, 0x001b082e}}, Y: Field{[10]uint32{0x00b71e53, 0x037c4550, 0x03f20cf6, 0x0129e717, 0x015e36f4, 0x0296b91d, 0x0342aa47, 0x000db897, 0x0274d8ad, 0x000832bd}}}, + {X: Field{[10]uint32{0x015adb07, 0x03246b4c, 0x03a7022b, 0x03e858ed, 0x03f877b5, 0x00ba4677, 0x00e4bf2f, 0x017c54e7, 0x01416965, 0x002ef924}}, Y: Field{[10]uint32{0x03f93a1e, 0x01dba732, 0x036ac40f, 0x01fc3b21, 0x01a77b84, 0x02e3f029, 0x02b5ff6d, 0x0348f231, 0x00256618, 0x002334f8}}}, + {X: Field{[10]uint32{0x01e73786, 0x00531a19, 0x00c752fe, 0x02bb4e60, 0x03bf6dfe, 0x015905cd, 0x0339bbbc, 0x01d2fc1f, 0x0078e383, 0x001d22cc}}, Y: Field{[10]uint32{0x02811ac8, 0x032533ca, 0x02eb28f3, 0x02c18a5e, 0x03ea86b6, 0x005ff211, 0x01f2c802, 0x037e891c, 0x020a61a7, 0x001fdf2b}}}, + {X: Field{[10]uint32{0x0364e4b4, 0x03522fb1, 0x000bcd23, 0x024b414b, 0x005d39d5, 0x009cb3da, 0x015728b2, 0x00956518, 0x03c5b89a, 0x003e98f1}}, Y: Field{[10]uint32{0x00a47c8a, 0x01f5a4a3, 0x01d31fbe, 0x035972d3, 0x01804724, 0x0359f410, 0x0238a506, 0x02758387, 0x03a27751, 0x003130ca}}}, + {X: Field{[10]uint32{0x0056c91c, 0x014e1c73, 0x024446c9, 0x02c1c38f, 0x0386978e, 0x02520c52, 0x025ea13d, 0x038e028d, 0x0197d014, 0x0030bb5c}}, Y: Field{[10]uint32{0x026a595e, 0x03700791, 0x0007009b, 0x02ddcdf7, 0x033404bd, 0x022e6c3e, 0x0054a09d, 0x033463de, 0x0293e7c1, 0x00171cf0}}}, + {X: Field{[10]uint32{0x03c266be, 0x03fa1c9b, 0x03ab5f22, 0x00130367, 0x026c2b3a, 0x03cfa001, 0x0334e846, 0x002f5b0b, 0x01efcb1e, 0x00094530}}, Y: Field{[10]uint32{0x024e3eb3, 0x007b2531, 0x01ad069a, 0x0376333e, 0x02507c35, 0x017d9bb1, 0x00443466, 0x02cb67fe, 0x006c07bb, 0x0031682b}}}, + {X: Field{[10]uint32{0x02286350, 0x01bbe513, 0x0081df6b, 0x03ff25a8, 0x00e2318b, 0x028e10f2, 0x01d2e289, 0x011fc963, 0x03050116, 0x0016f01f}}, Y: Field{[10]uint32{0x03bcbea4, 0x03e16afa, 0x02c66a41, 0x01947844, 0x017a91c4, 0x0096136d, 0x007d059f, 0x03bc1236, 0x00931217, 0x00084f38}}}, + {X: Field{[10]uint32{0x023cad8a, 0x0285cc66, 0x03dd8862, 0x00d7da80, 0x03db9c13, 0x01eb9193, 0x0173f706, 0x016c0e29, 0x02429737, 0x003b6d5b}}, Y: Field{[10]uint32{0x01ef5fa7, 0x01111fc5, 0x01f2e531, 0x014c7660, 0x00358620, 0x009bcef9, 0x038414a4, 0x03551986, 0x027016f8, 0x0034f986}}}, + {X: Field{[10]uint32{0x03d5d732, 0x0323675c, 0x03d55817, 0x023b435d, 0x02684908, 0x0380a191, 0x03609982, 0x019204ef, 0x036e7826, 0x000a4949}}, Y: Field{[10]uint32{0x0287296f, 0x004ff926, 0x02d22622, 0x004c8375, 0x0184b332, 0x02ec33b8, 0x032d755d, 0x0262773a, 0x03a6a97c, 0x003d4c55}}}, + {X: Field{[10]uint32{0x03c0a034, 0x039027a6, 0x0337fa69, 0x01e70ebe, 0x01912863, 0x00dc067a, 0x02098829, 0x03d294dc, 0x01d5bda0, 0x000b115e}}, Y: Field{[10]uint32{0x02f7d99c, 0x032a4d17, 0x0315c336, 0x019ec6e6, 0x02a319d4, 0x00c41ef2, 0x01acd23f, 0x030f1195, 0x034dd889, 0x0038542f}}}, + {X: Field{[10]uint32{0x00808904, 0x0221516a, 0x00b3d056, 0x02e109a6, 0x02025f21, 0x02bcc60c, 0x02295870, 0x03e1daef, 0x020011f9, 0x0017c982}}, Y: Field{[10]uint32{0x02e02350, 0x01cea263, 0x03a9b534, 0x013b60e8, 0x01736fe6, 0x001bab0f, 0x00d2ce00, 0x02a87de9, 0x0232164c, 0x001ab4ce}}}, + {X: Field{[10]uint32{0x02ac4b8b, 0x016935ed, 0x011000d6, 0x01a7a221, 0x029d1f2c, 0x00fecf5a, 0x02fd430f, 0x017b2414, 0x00c61209, 0x000eeeef}}, Y: Field{[10]uint32{0x010b0c97, 0x03e7ea95, 0x019487e4, 0x032ea8ed, 0x0240d244, 0x03256076, 0x01b090f8, 0x029b9f6d, 0x00283846, 0x0000ca3a}}}, + {X: Field{[10]uint32{0x016acff0, 0x02e76065, 0x0117daff, 0x032998b6, 0x02343e80, 0x03088bd2, 0x009af44b, 0x0363bffb, 0x027bdd0f, 0x00126140}}, Y: Field{[10]uint32{0x038affda, 0x005b088e, 0x0065468c, 0x0053fa05, 0x03460b10, 0x009c5a88, 0x01561b5f, 0x01b904c1, 0x012e37a3, 0x00162fbf}}}, + {X: Field{[10]uint32{0x03959de7, 0x0098f559, 0x0359b92e, 0x03300386, 0x006e826e, 0x000ecf73, 0x01eb2d88, 0x0022466d, 0x00e8d2e3, 0x0008518e}}, Y: Field{[10]uint32{0x0232342a, 0x0350793d, 0x03dd8ad9, 0x03c72379, 0x02dc22c0, 0x03d7f270, 0x02e0454f, 0x0078a4d6, 0x01216f13, 0x00027762}}}, + {X: Field{[10]uint32{0x02f3cfdd, 0x00013db9, 0x01f35444, 0x0041a455, 0x016876c1, 0x0197828c, 0x023532b9, 0x00b5abcf, 0x03055ced, 0x001b3b61}}, Y: Field{[10]uint32{0x02546ec6, 0x03ad5bdf, 0x00ac0a83, 0x000665ff, 0x0355b17c, 0x0079abb9, 0x03ba4e2a, 0x0155be2d, 0x02abc86f, 0x003d46c6}}}, + {X: Field{[10]uint32{0x01dcfacb, 0x007221b2, 0x0172730a, 0x03901086, 0x017fc3ad, 0x0216746b, 0x02634987, 0x024db38c, 0x0267876c, 0x0025405b}}, Y: Field{[10]uint32{0x02f4f660, 0x02ece49a, 0x03160742, 0x00bcb90f, 0x034df723, 0x004016ea, 0x03d284b8, 0x019bbbfe, 0x00c4e6e2, 0x000a679e}}}, + {X: Field{[10]uint32{0x026f23f2, 0x0054c67b, 0x00763513, 0x003e76cc, 0x00c513d2, 0x030e633c, 0x02a8019f, 0x0070e710, 0x02c83040, 0x0012fb19}}, Y: Field{[10]uint32{0x038514fc, 0x02c9cd64, 0x003d58e8, 0x028550ff, 0x034fcded, 0x0224a718, 0x01aa9162, 0x0118261c, 0x02923b7d, 0x003c77ff}}}, + {X: Field{[10]uint32{0x008a59c7, 0x03b69e21, 0x03bb27f3, 0x03bd6ac9, 0x019088c4, 0x00394eb9, 0x000015a6, 0x00ee5dab, 0x03d14051, 0x002d4144}}, Y: Field{[10]uint32{0x01c36399, 0x016252e6, 0x0084129a, 0x0326999d, 0x01dc9282, 0x02de1b33, 0x03254c51, 0x039b08fe, 0x02e51182, 0x00271072}}}, + {X: Field{[10]uint32{0x0290708d, 0x005564ed, 0x00c003e4, 0x01149bcc, 0x01d1df38, 0x02a482b2, 0x029bda38, 0x0280e5a9, 0x02533989, 0x00165e49}}, Y: Field{[10]uint32{0x02ba648f, 0x03b40bc6, 0x00bab3a3, 0x02ce5eb9, 0x034c750c, 0x027b99cd, 0x02561921, 0x021f6d79, 0x00b72748, 0x001fcb05}}}, + {X: Field{[10]uint32{0x01eacf6f, 0x00dc1581, 0x02dd34db, 0x03e4fb05, 0x01251cc7, 0x0245b599, 0x00fe2b3e, 0x00aa4d1e, 0x0366cf01, 0x001ee8ad}}, Y: Field{[10]uint32{0x016404bb, 0x02cc47e1, 0x02a6903f, 0x0230b212, 0x003dcc7e, 0x03a2f745, 0x01212865, 0x01e630dc, 0x0138f950, 0x00053f62}}}, + {X: Field{[10]uint32{0x02b5d6bb, 0x00f7e6fa, 0x013a71c4, 0x008959af, 0x017f9e9d, 0x027a0e73, 0x0147af8a, 0x024367f2, 0x02fef69c, 0x000c18bc}}, Y: Field{[10]uint32{0x02f5ee58, 0x025caf01, 0x02bbaad9, 0x0350868d, 0x02064047, 0x0364a9c5, 0x01e7b719, 0x01b505ff, 0x00334991, 0x0036e12a}}}, + {X: Field{[10]uint32{0x00b06e74, 0x0230bf55, 0x00ce3db3, 0x021f8c9f, 0x00f6fae6, 0x02d119c0, 0x034d695c, 0x03b229df, 0x009d69db, 0x003b57e5}}, Y: Field{[10]uint32{0x018930e3, 0x00bfafcb, 0x019fdee6, 0x008fc566, 0x032a6907, 0x026542f2, 0x0104ff92, 0x00f54194, 0x0060057b, 0x0011c938}}}, + {X: Field{[10]uint32{0x021b7cdc, 0x01c39181, 0x028d3d71, 0x01427af5, 0x0030e129, 0x01ab3004, 0x01312fea, 0x0209d83a, 0x02033002, 0x00135957}}, Y: Field{[10]uint32{0x00ea99bb, 0x03b948c4, 0x00d0b7bc, 0x02789e33, 0x00439957, 0x027a5fc1, 0x01e046b6, 0x01526cbd, 0x01226c27, 0x00243bf0}}}, + {X: Field{[10]uint32{0x02f1b35d, 0x019beaba, 0x0260dbf1, 0x02030d46, 0x0368e05e, 0x0120fe56, 0x029edf4a, 0x03bfb342, 0x0356b888, 0x003dad81}}, Y: Field{[10]uint32{0x00a5fb8c, 0x008a8f4e, 0x01df6bfd, 0x023c2f39, 0x00cb57e9, 0x02bebe6c, 0x0096b241, 0x005611aa, 0x02bdaa78, 0x0009efb7}}}, + {X: Field{[10]uint32{0x03c55748, 0x00c06228, 0x00b516ca, 0x00e23f1f, 0x008c81c5, 0x0235ba8b, 0x004db945, 0x0288ddcb, 0x00aa942b, 0x0033164b}}, Y: Field{[10]uint32{0x03288158, 0x0144b476, 0x0307c63d, 0x02c75900, 0x01bb6bd2, 0x00d870fc, 0x0277d100, 0x015820db, 0x03cd358e, 0x000db8bd}}}, + {X: Field{[10]uint32{0x02c1a456, 0x0280cbfd, 0x00edf6a7, 0x01865db4, 0x00f93721, 0x03b7d0c1, 0x023acb8c, 0x011a6086, 0x01dca5bb, 0x0012b2ea}}, Y: Field{[10]uint32{0x02262437, 0x0393a154, 0x021669ca, 0x00aa5cbc, 0x01d6fb30, 0x02ef40b3, 0x032287e9, 0x011fccf9, 0x003ab2ab, 0x002cdba6}}}, + {X: Field{[10]uint32{0x03061f91, 0x011b76fa, 0x0072d974, 0x00f612a5, 0x017be363, 0x02e73a58, 0x010e0c61, 0x01e74cad, 0x005e0422, 0x00322946}}, Y: Field{[10]uint32{0x03d4b5cb, 0x02348b66, 0x000ff3c3, 0x0347fd97, 0x01cdb7cb, 0x019a3bac, 0x00c1df74, 0x00626f59, 0x00b7445e, 0x0033ea94}}}, + {X: Field{[10]uint32{0x035f18f9, 0x02c41074, 0x0120e052, 0x002197e3, 0x01535faf, 0x0277842b, 0x01168a88, 0x03d844d9, 0x016707f4, 0x00307255}}, Y: Field{[10]uint32{0x00033749, 0x02ae5052, 0x027eb537, 0x0384dc23, 0x02543919, 0x015bd11c, 0x02fc1eb9, 0x01ad8c26, 0x003b3d95, 0x000d3def}}}, + {X: Field{[10]uint32{0x0236a8f3, 0x006b9474, 0x038fa8df, 0x01a3cf87, 0x028bb68d, 0x00fdf495, 0x02093703, 0x01cdbad2, 0x03b736f6, 0x00237d3e}}, Y: Field{[10]uint32{0x0102122c, 0x01ddd917, 0x00c81229, 0x03ddc1dc, 0x00cef6b0, 0x006ece14, 0x007af267, 0x00b400e6, 0x01fe8e9a, 0x000f5c61}}}, + {X: Field{[10]uint32{0x025af3dd, 0x02a979aa, 0x00297c2b, 0x02db47af, 0x01c2c8bb, 0x011d4047, 0x02a1ec0c, 0x01f2e3ca, 0x01f0e35c, 0x0000358d}}, Y: Field{[10]uint32{0x03a51a2f, 0x01a00f1e, 0x006435e3, 0x0264614f, 0x03441e5a, 0x0241eb97, 0x0190a5b5, 0x03a2cc6a, 0x02bdc588, 0x0000249b}}}, + {X: Field{[10]uint32{0x0346a4bc, 0x0181c802, 0x01923d64, 0x0097a2d4, 0x013678b5, 0x0038e381, 0x014ea383, 0x014dd5d4, 0x012d5f86, 0x0002d634}}, Y: Field{[10]uint32{0x03438d3e, 0x01121041, 0x037f648e, 0x0103a920, 0x00d77c9e, 0x0265702d, 0x01d587ce, 0x02eace4d, 0x01835b0e, 0x003ded64}}}, + {X: Field{[10]uint32{0x029a7f36, 0x029db6f6, 0x0178011b, 0x014d9187, 0x0212cb42, 0x01e3a26b, 0x03ad0755, 0x00d903b3, 0x028cb401, 0x002edf1a}}, Y: Field{[10]uint32{0x0036581c, 0x00836852, 0x00ba7d1c, 0x0100c1b7, 0x023c2f5c, 0x01c20a56, 0x0195b835, 0x035861a2, 0x02583774, 0x001f7680}}}, + {X: Field{[10]uint32{0x0114a9e6, 0x00eca60d, 0x03b91968, 0x0065c8b3, 0x02f116b8, 0x03e96dea, 0x00a990a7, 0x0233be77, 0x00f792cc, 0x00053dbc}}, Y: Field{[10]uint32{0x024d7055, 0x01bc840e, 0x000b97b9, 0x017fc8e0, 0x01226104, 0x02cffb2d, 0x00e5aac4, 0x01663243, 0x03927a07, 0x002230d7}}}, + {X: Field{[10]uint32{0x03448541, 0x02ef39dd, 0x014fa76b, 0x034125ab, 0x02fb60f4, 0x015fd2a8, 0x01ad8964, 0x02846177, 0x01f4eb9f, 0x0012e579}}, Y: Field{[10]uint32{0x01e71d21, 0x01c1b451, 0x038f4d27, 0x0023df8a, 0x01502d1f, 0x0004807b, 0x0087f512, 0x032cc6e8, 0x0387513a, 0x00078401}}}, + {X: Field{[10]uint32{0x024b63ae, 0x032f4a8d, 0x01c16dce, 0x01993617, 0x03a7af53, 0x008cd568, 0x004aa312, 0x016cb18e, 0x03c067f7, 0x003a685f}}, Y: Field{[10]uint32{0x027fb8c7, 0x00302177, 0x01ac1956, 0x01a806d3, 0x030a40e0, 0x00ad806a, 0x038fcf01, 0x01148d8b, 0x0388ad67, 0x00108288}}}, + {X: Field{[10]uint32{0x03ff9169, 0x02b55110, 0x0281cf10, 0x010e0cc6, 0x0096d4ff, 0x0020d04c, 0x023d066c, 0x03b2053b, 0x0136f320, 0x0000e761}}, Y: Field{[10]uint32{0x028ca248, 0x01b8d9f0, 0x023be7a7, 0x00d44e9e, 0x00c74345, 0x00152af4, 0x0166a556, 0x03a26183, 0x01e91478, 0x001c3ba2}}}, + {X: Field{[10]uint32{0x03b636e8, 0x036a8f0b, 0x0320e001, 0x024f127f, 0x029f95b9, 0x00dc7389, 0x031dc72f, 0x0135b2fa, 0x00c80862, 0x0025de68}}, Y: Field{[10]uint32{0x00c2712e, 0x00292ae8, 0x03907d23, 0x03629932, 0x03369684, 0x000de482, 0x01a4b0e6, 0x01b14027, 0x03cc6729, 0x00276789}}}, + {X: Field{[10]uint32{0x02f0b401, 0x022d3ed9, 0x01586bd7, 0x007f4559, 0x034a9747, 0x032bcdbf, 0x01c09de9, 0x02d23da9, 0x004a1dab, 0x00335316}}, Y: Field{[10]uint32{0x033446f1, 0x00cd0449, 0x017f0bc4, 0x03b711d9, 0x026fd60e, 0x02b4b0a3, 0x02104b0c, 0x001b8acf, 0x02b10eff, 0x0025640a}}}, + {X: Field{[10]uint32{0x0161aba4, 0x02afba89, 0x0319688e, 0x01957549, 0x02dbeb3f, 0x01cadddb, 0x03164f7c, 0x018b2d44, 0x01f41423, 0x0011b284}}, Y: Field{[10]uint32{0x0034c9ff, 0x00b13569, 0x022f5e83, 0x01198813, 0x01bcfd09, 0x01898f18, 0x036d3cbd, 0x03510b7e, 0x031a2a2a, 0x00201810}}}, + {X: Field{[10]uint32{0x0294a513, 0x030e7622, 0x003b475a, 0x0395fa3e, 0x01eb712d, 0x0000c688, 0x035c7535, 0x018fd5db, 0x01791ffb, 0x0037faf4}}, Y: Field{[10]uint32{0x03be75de, 0x032c6b71, 0x00f0aa71, 0x00b7b2ca, 0x006576af, 0x03df1843, 0x02aa0e22, 0x02d53081, 0x007e39b2, 0x0033fb5b}}}, + {X: Field{[10]uint32{0x012c2469, 0x00e021d7, 0x03fcfe12, 0x0285e59f, 0x0143daf1, 0x028ee53e, 0x0233d9d7, 0x0018ed11, 0x013282fd, 0x0031c719}}, Y: Field{[10]uint32{0x01d376d0, 0x0346d52a, 0x02ba8620, 0x00d94ab7, 0x00f18a47, 0x00eafa50, 0x01f8aed3, 0x01a840e3, 0x03cd0e00, 0x0018bf35}}}, + {X: Field{[10]uint32{0x00c0ff37, 0x022bbdcd, 0x007b1e9f, 0x0107f059, 0x026864ec, 0x0123edd6, 0x02640fbf, 0x02826938, 0x034ddc8b, 0x0018faee}}, Y: Field{[10]uint32{0x024ae28e, 0x01848176, 0x022df772, 0x013dc671, 0x01dbf1ae, 0x01cd82a1, 0x01090e19, 0x01bd2d07, 0x034b0fe1, 0x00396740}}}, + {X: Field{[10]uint32{0x0112814a, 0x00536e77, 0x000bceea, 0x00709c75, 0x01ce6e5c, 0x006d624b, 0x02eac616, 0x02fc5963, 0x00c8cb51, 0x00194126}}, Y: Field{[10]uint32{0x00a65279, 0x0162be59, 0x01e6ee30, 0x0215c2b5, 0x027a6145, 0x02f57452, 0x0057769b, 0x00064c91, 0x03855d8e, 0x0039f999}}}, + {X: Field{[10]uint32{0x03c43fd5, 0x00896a11, 0x0032ac41, 0x02a10304, 0x00090815, 0x0205b7d1, 0x0199c07b, 0x00218e05, 0x003f14c0, 0x00052878}}, Y: Field{[10]uint32{0x01fe98de, 0x03581bcd, 0x02ddb6d6, 0x00e1414c, 0x024926da, 0x02ee3bd7, 0x0366bac9, 0x02a23d1b, 0x0259bc6b, 0x000d4912}}}, + {X: Field{[10]uint32{0x02903c5c, 0x03d4c56d, 0x00f084d6, 0x0056ef54, 0x03a4f14c, 0x004553ff, 0x00f9a167, 0x0287a03b, 0x02b2f6a8, 0x000727db}}, Y: Field{[10]uint32{0x0203a033, 0x0181974a, 0x0187dd26, 0x00f900be, 0x01538638, 0x0143bba6, 0x026fc511, 0x03fd8e6d, 0x01f52ca4, 0x0039af78}}}, + {X: Field{[10]uint32{0x0170f8bf, 0x03c0863e, 0x029d97cf, 0x006b0381, 0x00b43ea6, 0x02c0355b, 0x00809664, 0x039ec41f, 0x02ed0bad, 0x000779c7}}, Y: Field{[10]uint32{0x00ee1434, 0x01f69986, 0x029bb5c6, 0x0176615d, 0x01ea99d6, 0x02def253, 0x00d42e16, 0x03babb5e, 0x02de77ed, 0x0002352c}}}, + {X: Field{[10]uint32{0x035cb4b1, 0x01baaad7, 0x018c35a9, 0x00e420e3, 0x02479f7a, 0x02eeadc1, 0x022f0628, 0x0134baea, 0x0280ce95, 0x003d10ca}}, Y: Field{[10]uint32{0x02d579bf, 0x0286272f, 0x0302cc67, 0x01dca718, 0x0291f3d0, 0x03f024e0, 0x00abf476, 0x0290300f, 0x02adac34, 0x0025bf9b}}}, + {X: Field{[10]uint32{0x0119fb21, 0x022d7a49, 0x00737482, 0x032b0549, 0x01cb37e1, 0x02109046, 0x023d3f96, 0x012bd158, 0x034d1796, 0x0023dc79}}, Y: Field{[10]uint32{0x004865ab, 0x01e15358, 0x0091cec0, 0x008021a7, 0x025b6b17, 0x02fda51b, 0x03678e4e, 0x03292e9d, 0x00dfd7f0, 0x001a643c}}}, + {X: Field{[10]uint32{0x02a6745e, 0x00671271, 0x001a1200, 0x014b3bdc, 0x005a09d0, 0x025aa0e8, 0x01546e20, 0x03097999, 0x01575e3d, 0x00088a4c}}, Y: Field{[10]uint32{0x01c423b0, 0x01bab639, 0x0285986a, 0x020b7bfa, 0x0283d050, 0x02a5072a, 0x012bfae8, 0x01581f1e, 0x00874258, 0x002ab63e}}}, + {X: Field{[10]uint32{0x0248a096, 0x00ea8abc, 0x017c63b7, 0x01a4eb08, 0x00cc57d0, 0x03989d94, 0x02bf5f29, 0x029a6a05, 0x02632ef3, 0x0019617f}}, Y: Field{[10]uint32{0x00fd9f8b, 0x00dea0db, 0x037cc12f, 0x00ff7847, 0x03dc8a89, 0x01bb3157, 0x019ca577, 0x006bfbb7, 0x03bb2028, 0x002082a8}}}, + {X: Field{[10]uint32{0x03f67bf8, 0x007907e4, 0x01339195, 0x00bf9843, 0x01aaec47, 0x02fc18a0, 0x0163ce5a, 0x01472aca, 0x0079e55c, 0x000888c9}}, Y: Field{[10]uint32{0x03f927d2, 0x016a6efa, 0x0104bb7c, 0x0062a359, 0x02888a8f, 0x0304ca68, 0x03f0514b, 0x00b5ff99, 0x03ab2cf2, 0x0003864b}}}, + {X: Field{[10]uint32{0x01df16fc, 0x01f6c097, 0x00f60826, 0x022dc3a6, 0x00446014, 0x02ce5b25, 0x00aba082, 0x001a7af3, 0x02fde4ba, 0x0036a340}}, Y: Field{[10]uint32{0x023fa2bb, 0x01d80879, 0x034d059a, 0x03422d9b, 0x01579756, 0x01e8b993, 0x0167e7c1, 0x0021291f, 0x013de337, 0x00068c08}}}, + {X: Field{[10]uint32{0x02202ebf, 0x02a7c624, 0x02501708, 0x0249e3b9, 0x01ad49e0, 0x01313a2e, 0x038a0066, 0x020b7bc6, 0x0062854e, 0x0029bdcb}}, Y: Field{[10]uint32{0x01d03ba4, 0x00d54dc0, 0x0037edaa, 0x02246a0e, 0x002e2709, 0x008c63bd, 0x03c56abc, 0x0204102d, 0x032db08c, 0x0020d565}}}, + {X: Field{[10]uint32{0x03c7db68, 0x016b8a8e, 0x028ee8d5, 0x033a67d6, 0x02a15077, 0x00df7315, 0x02f8c359, 0x02168171, 0x013a309e, 0x00081d3f}}, Y: Field{[10]uint32{0x022cff97, 0x0387c20c, 0x0182e53a, 0x03a6baa5, 0x023061a4, 0x001aa605, 0x018fc0e8, 0x00f250b9, 0x02eacb78, 0x00384700}}}, + {X: Field{[10]uint32{0x01a1a5e3, 0x0071431e, 0x0106c861, 0x03cc6098, 0x0229aa59, 0x00a92d8b, 0x00d316f6, 0x02a8adc3, 0x0266fae9, 0x00127b55}}, Y: Field{[10]uint32{0x007643f7, 0x02eb1b20, 0x028b6324, 0x0024aa0d, 0x021477c2, 0x0261a59e, 0x000b19ef, 0x0138af73, 0x009aae14, 0x001729f9}}}, + {X: Field{[10]uint32{0x016c1b1f, 0x004d8897, 0x014683ed, 0x03a63864, 0x01b582c4, 0x00dc88cd, 0x03472a71, 0x0393a617, 0x007ea1f7, 0x0008a27b}}, Y: Field{[10]uint32{0x01cbbeb1, 0x0144b2b6, 0x0090261a, 0x022f5c3a, 0x03b03f89, 0x01ff903d, 0x017bff67, 0x00219c14, 0x0318689a, 0x0000478a}}}, + {X: Field{[10]uint32{0x01859164, 0x0273afe1, 0x00635bc4, 0x014bff1c, 0x03fbed0e, 0x022e8ae8, 0x02c64a55, 0x03befb62, 0x02be23f1, 0x003aa14b}}, Y: Field{[10]uint32{0x01cbb824, 0x02a98d50, 0x00fafc97, 0x01456c97, 0x0125ef13, 0x01e93905, 0x0266583c, 0x0298e5cc, 0x0341fe97, 0x002f78bb}}}, + {X: Field{[10]uint32{0x0302f0ea, 0x026f86f4, 0x018553fe, 0x01f6905e, 0x00290b25, 0x03fbc229, 0x001a9548, 0x01f4fc6b, 0x00e67cc0, 0x0015c63c}}, Y: Field{[10]uint32{0x01acbe90, 0x0103b3da, 0x0094fd4e, 0x02828bae, 0x03a6ffca, 0x019169ab, 0x02d8bd53, 0x0175fb9c, 0x015bfca6, 0x00263b13}}}, + {X: Field{[10]uint32{0x03810a4c, 0x03af6492, 0x01ad550b, 0x00fde033, 0x0310269c, 0x01d51638, 0x00f0650b, 0x03f5f7ba, 0x02abd77a, 0x0037d8a8}}, Y: Field{[10]uint32{0x00e4c034, 0x0120a6c2, 0x028cd54c, 0x023a7f22, 0x008d39fe, 0x022198f8, 0x03ea2e95, 0x0349ee02, 0x02cce384, 0x001a9981}}}, + {X: Field{[10]uint32{0x005e6668, 0x01336ba0, 0x039aa497, 0x003bbf5d, 0x039ea7dc, 0x00254239, 0x039bd198, 0x009a2f0c, 0x00454b0c, 0x0004043f}}, Y: Field{[10]uint32{0x016410e1, 0x0197eafa, 0x0001c3fa, 0x03c674f6, 0x02d51194, 0x01adaf4a, 0x030a323c, 0x02d65cac, 0x02db0681, 0x001a1a8e}}}, + {X: Field{[10]uint32{0x035c5c18, 0x0097b5a7, 0x0087bd54, 0x01101e41, 0x02072ca3, 0x0050524f, 0x03e93c96, 0x00e061a7, 0x00527567, 0x0022b1e6}}, Y: Field{[10]uint32{0x01d1c08e, 0x031cb26f, 0x03cec684, 0x03e67496, 0x00775375, 0x027bc7e4, 0x0172e04b, 0x03219f46, 0x0248fcbf, 0x002ecc50}}}, + {X: Field{[10]uint32{0x03848b9d, 0x0321a48f, 0x021605f9, 0x01340866, 0x036f3f17, 0x017c2b78, 0x01f3bf44, 0x031f3b18, 0x031188cb, 0x001583a5}}, Y: Field{[10]uint32{0x01b9cd2f, 0x003bdb74, 0x02277bc8, 0x022b063b, 0x014d133f, 0x01939ba7, 0x03bf21fc, 0x03319efe, 0x02ce6775, 0x0027a4b6}}}, + {X: Field{[10]uint32{0x01fb943a, 0x0241c03d, 0x009fee6d, 0x00bc1fdc, 0x0028eea5, 0x011a6870, 0x015ca088, 0x03ad9b32, 0x02044b95, 0x00231190}}, Y: Field{[10]uint32{0x009d0223, 0x0049c79a, 0x03aa51a1, 0x009654f0, 0x03a34920, 0x03afa965, 0x01b3a615, 0x014604c0, 0x005d7bc2, 0x002fc43f}}}, + {X: Field{[10]uint32{0x031eb5aa, 0x034730a1, 0x013cb4d8, 0x036be1d1, 0x037f2245, 0x0362c0d9, 0x0377247c, 0x022dc4d4, 0x034cf357, 0x0034a4fd}}, Y: Field{[10]uint32{0x024a6f26, 0x02befb69, 0x03423ba7, 0x0352b8d5, 0x03f080e3, 0x02c24143, 0x0245931e, 0x03a8518f, 0x013a61df, 0x0021b080}}}, + {X: Field{[10]uint32{0x03687d35, 0x02f5d135, 0x02aff4c6, 0x029ccd99, 0x01fefbf7, 0x01dbae4d, 0x027611ec, 0x01ec7f1d, 0x0241ae75, 0x000d665c}}, Y: Field{[10]uint32{0x004b2aa0, 0x013e5bf1, 0x01f9c599, 0x03bf3283, 0x022f36e0, 0x02f4e4f6, 0x007fd357, 0x0335330f, 0x021f246b, 0x002f2fa9}}}, + {X: Field{[10]uint32{0x036464eb, 0x00d8095f, 0x006de15f, 0x0316f678, 0x00285a17, 0x013b8d77, 0x01a0ef84, 0x0065f4f0, 0x00977467, 0x00034258}}, Y: Field{[10]uint32{0x013e8783, 0x012dc2ef, 0x0303cd14, 0x01a67a22, 0x023dd448, 0x01e737a7, 0x02954bfc, 0x036e59a4, 0x02a51e06, 0x000d0abd}}}, + {X: Field{[10]uint32{0x0241a777, 0x03e2632b, 0x01470bfd, 0x025c8e89, 0x01621257, 0x0086c3e1, 0x033a3755, 0x03ab59c0, 0x00992aea, 0x0023a1d7}}, Y: Field{[10]uint32{0x03c0bbd8, 0x01ea625c, 0x010c653f, 0x02187b1b, 0x02a5ee66, 0x00c49eb4, 0x020ba101, 0x0066ec13, 0x033d2d2f, 0x00092a89}}}, + {X: Field{[10]uint32{0x02541855, 0x03786e6b, 0x01aee0d2, 0x0110215a, 0x00d622f4, 0x01cb16ee, 0x02f47d81, 0x00e93347, 0x01f30270, 0x002fd474}}, Y: Field{[10]uint32{0x039aa484, 0x0029c433, 0x0030f3c6, 0x00c510cf, 0x005918d9, 0x024d4f61, 0x01e6e409, 0x002b3eef, 0x0352b6c6, 0x0023e078}}}, + {X: Field{[10]uint32{0x0341c26f, 0x02a35320, 0x03aee696, 0x016db372, 0x022ebb11, 0x0020fbd5, 0x032d1415, 0x01a1588a, 0x00620972, 0x001bedad}}, Y: Field{[10]uint32{0x003c9c73, 0x027c182e, 0x02032a89, 0x00c2eb28, 0x01468f25, 0x015e2e91, 0x02923b3e, 0x03367b32, 0x03bff9cf, 0x0027023d}}}, + {X: Field{[10]uint32{0x03617438, 0x0237d8a4, 0x0389d067, 0x01a1acb3, 0x031db56f, 0x03fc117e, 0x026a21fa, 0x03de35f7, 0x02c18b5c, 0x001d560e}}, Y: Field{[10]uint32{0x0369f900, 0x0240d026, 0x0082df67, 0x00526100, 0x02071fe0, 0x0319a725, 0x0237c7d9, 0x011bfc38, 0x022cb085, 0x00209668}}}, + {X: Field{[10]uint32{0x00c0ef92, 0x023fe72d, 0x00f36cdd, 0x038d8404, 0x014aabc2, 0x006ddba5, 0x0051c893, 0x0166b1fb, 0x0133a5d7, 0x00109846}}, Y: Field{[10]uint32{0x01ed4261, 0x00054748, 0x00bf8783, 0x000c3e67, 0x0158cde4, 0x013ae131, 0x038e2bd5, 0x032f3a8d, 0x00ce6b8a, 0x00222991}}}, + {X: Field{[10]uint32{0x02f520d2, 0x00eb78c2, 0x038458a4, 0x025492eb, 0x016dff9c, 0x01c5af71, 0x02e776ca, 0x03e592f6, 0x01bf6128, 0x00090e9b}}, Y: Field{[10]uint32{0x001b7e50, 0x007c6948, 0x0025d609, 0x01368f64, 0x003dda74, 0x024af7ea, 0x0001850e, 0x036d2341, 0x028a5ce4, 0x00098a8b}}}, + {X: Field{[10]uint32{0x00c2ac76, 0x02c4a476, 0x03d58082, 0x00b169da, 0x0046e57e, 0x01f7c56f, 0x01e9307a, 0x031b4810, 0x01751548, 0x00084af4}}, Y: Field{[10]uint32{0x039391bc, 0x032f5dc1, 0x01aaae33, 0x03d1c66a, 0x0257f04e, 0x022c9020, 0x03cc788a, 0x01c9cc99, 0x03c76cc9, 0x00209186}}}, + {X: Field{[10]uint32{0x0161177b, 0x01f05ad3, 0x021fbc1a, 0x011842f5, 0x008ca8a5, 0x022b83b2, 0x00b3e562, 0x01b4aaa8, 0x030b21f9, 0x00369b40}}, Y: Field{[10]uint32{0x023f9fde, 0x02f6f9cb, 0x03d0a1ce, 0x00787aae, 0x012c2aad, 0x02d27b0a, 0x02b85961, 0x000a1d28, 0x02358fab, 0x0016d6f1}}}, + {X: Field{[10]uint32{0x02c1f01f, 0x027d38fd, 0x0010886a, 0x01fb3fa0, 0x004a4313, 0x03ba923f, 0x001e1012, 0x010ec296, 0x02f055a2, 0x003708c2}}, Y: Field{[10]uint32{0x028180ca, 0x03e80f95, 0x018bb950, 0x02ad805c, 0x012eb5a9, 0x00f5ffbb, 0x030120da, 0x011635c0, 0x021be70a, 0x00343e63}}}, + {X: Field{[10]uint32{0x01089df1, 0x01b412ea, 0x00797dc1, 0x01cbc291, 0x00ee9c59, 0x03c8c9a1, 0x00e73b56, 0x031a1a63, 0x023ac815, 0x0020b0b7}}, Y: Field{[10]uint32{0x03b8573d, 0x018b65e4, 0x02432544, 0x0110b07e, 0x010c8598, 0x007f85e3, 0x0253b8ec, 0x033063e8, 0x0065c6c2, 0x0007211c}}}, + {X: Field{[10]uint32{0x020494a3, 0x01d85278, 0x037f6670, 0x0081a901, 0x02cc439f, 0x0002be26, 0x0165dfa2, 0x0245bb86, 0x028874e4, 0x001b28b7}}, Y: Field{[10]uint32{0x02662043, 0x014466a6, 0x02e0699b, 0x0276ba5a, 0x02cd5111, 0x01f71f39, 0x03cc1aa5, 0x02177690, 0x034497aa, 0x001bbc2c}}}, + {X: Field{[10]uint32{0x0051d97f, 0x00ebd4de, 0x031f88d3, 0x029242f4, 0x03cf1149, 0x021003be, 0x02448f82, 0x03ed9481, 0x03c41728, 0x002e89a1}}, Y: Field{[10]uint32{0x02b4c0c4, 0x03c82c61, 0x01de5d61, 0x000090ec, 0x02033455, 0x0318b34c, 0x03803bb3, 0x039eaba2, 0x01f11f2c, 0x0025ab49}}}, + {X: Field{[10]uint32{0x01553e0d, 0x028bc203, 0x01aa5f1e, 0x00cf91a8, 0x03d311f5, 0x02cc0cc8, 0x0032d5a4, 0x03cc0458, 0x00401947, 0x002b0d88}}, Y: Field{[10]uint32{0x00b30a22, 0x01c70fcb, 0x0137fdf1, 0x006dec82, 0x001d5b98, 0x005f6e47, 0x035881fa, 0x00a21169, 0x0395fef3, 0x0014e0e7}}}, + {X: Field{[10]uint32{0x01049e13, 0x01a51d9e, 0x0246bac7, 0x0308b6ee, 0x024158c7, 0x00ecd727, 0x014241ec, 0x01c815a3, 0x00ee5b1b, 0x0019e03b}}, Y: Field{[10]uint32{0x0057d9a8, 0x02fd004c, 0x02e4ee0f, 0x015fb31e, 0x0246520d, 0x0158b9cc, 0x0090b9f3, 0x022234b7, 0x01f031e0, 0x0026b045}}}, + {X: Field{[10]uint32{0x02a63732, 0x0040e434, 0x00254cbb, 0x00eaaca5, 0x01c0f765, 0x02ef4d0e, 0x0110d622, 0x035754c1, 0x0247e7a2, 0x00254dde}}, Y: Field{[10]uint32{0x00195fc0, 0x02f948fe, 0x01d7b091, 0x01a8d992, 0x03bb01f7, 0x0319155e, 0x01abe4df, 0x02d8b3f8, 0x01109daf, 0x0015eb24}}}, + {X: Field{[10]uint32{0x02dd8921, 0x005e85ca, 0x0015e85f, 0x001ccc9d, 0x01486a85, 0x02f50abd, 0x02e97c59, 0x020efc1f, 0x01bf98fd, 0x00013c65}}, Y: Field{[10]uint32{0x011cf3dc, 0x0171ee1a, 0x03b59a86, 0x02f3c7bc, 0x011a057b, 0x01ac72b7, 0x027cae30, 0x008c8d8c, 0x032501c8, 0x00295ab3}}}, + {X: Field{[10]uint32{0x00bcb53f, 0x00a46c53, 0x036bad9e, 0x034b5edb, 0x02cc0510, 0x036eaaf3, 0x0208240a, 0x00a67f48, 0x03d1efe8, 0x003b3347}}, Y: Field{[10]uint32{0x002c667c, 0x020111e9, 0x02b29135, 0x022fff09, 0x012d9b6f, 0x00663806, 0x03d6f2d3, 0x003e9715, 0x03216da5, 0x003b0bfc}}}, + {X: Field{[10]uint32{0x0058f438, 0x0321386c, 0x01f2b1ee, 0x0004307b, 0x01502e76, 0x01f2dd1d, 0x00ff41cf, 0x010971ca, 0x004af2c3, 0x0031d5d1}}, Y: Field{[10]uint32{0x0362e53a, 0x01c0a0d8, 0x014b8fd0, 0x03f1a140, 0x039cd267, 0x0322d995, 0x0301105b, 0x0050f8a5, 0x01b6169f, 0x00387520}}}, + {X: Field{[10]uint32{0x005250b8, 0x006d5f19, 0x00ac636f, 0x0170711c, 0x03aef325, 0x028468d9, 0x01996627, 0x001dd963, 0x037ebff5, 0x000d58a0}}, Y: Field{[10]uint32{0x019234d8, 0x01cb598a, 0x02b9cf4d, 0x00d729fe, 0x00fa1d0d, 0x02f2bf00, 0x01374bb0, 0x0163f333, 0x020d97aa, 0x003373d2}}}, + {X: Field{[10]uint32{0x02d4a3a1, 0x00cc5f21, 0x00a82b11, 0x01f7ed95, 0x03b1f2f0, 0x03eb062d, 0x01339e97, 0x025eaf4b, 0x0245f62e, 0x0033a770}}, Y: Field{[10]uint32{0x00d184d5, 0x0295857c, 0x00b7927b, 0x00c2f9bb, 0x02fcaf1b, 0x030deaf7, 0x03e8520e, 0x03ee3993, 0x0325342a, 0x003db878}}}, + {X: Field{[10]uint32{0x00858a12, 0x0275b8cb, 0x03dd542d, 0x023394e0, 0x02aab481, 0x02807ea2, 0x0271a8c1, 0x0112ea74, 0x033b48ee, 0x002b008b}}, Y: Field{[10]uint32{0x02ca76fa, 0x02e6ea5c, 0x01aaf45d, 0x01f99815, 0x02191e49, 0x00e58477, 0x009e0917, 0x03447c66, 0x03a891f8, 0x00078158}}}, + {X: Field{[10]uint32{0x0251d9f9, 0x026702e9, 0x024ff3a9, 0x020a2332, 0x0355a837, 0x02dbc89d, 0x02e57e6d, 0x033eab91, 0x0282cb12, 0x0034753d}}, Y: Field{[10]uint32{0x01e71a36, 0x016639e1, 0x02960488, 0x0192b2e3, 0x03016072, 0x0059c88c, 0x023b4b07, 0x0064c530, 0x03e5870e, 0x0006c66f}}}, + {X: Field{[10]uint32{0x031c8a37, 0x014c0ebf, 0x012ee243, 0x012cb401, 0x00892e75, 0x026f746a, 0x03bacd4f, 0x02be5117, 0x0171bbdd, 0x001e6588}}, Y: Field{[10]uint32{0x03b98a7d, 0x0056f8de, 0x0320ab85, 0x02a76bc1, 0x00fe47b6, 0x00d304d5, 0x0072f77b, 0x00afad15, 0x03de2a95, 0x002e2b09}}}, + {X: Field{[10]uint32{0x009d3b90, 0x00cb8f14, 0x038d8cf0, 0x02c60e83, 0x0120ecb3, 0x001868bc, 0x03c3573b, 0x02d812ec, 0x03c42390, 0x00111685}}, Y: Field{[10]uint32{0x013f97b1, 0x02b52c5a, 0x026aae34, 0x01079026, 0x024ea769, 0x03bfd259, 0x00057c87, 0x03f97283, 0x00887c07, 0x002dd7d0}}}, + {X: Field{[10]uint32{0x03402051, 0x020ef0c3, 0x02ccfb0e, 0x01244745, 0x038c39cd, 0x0345d5d8, 0x02c49a78, 0x03d1fd7e, 0x01f963a9, 0x001859ad}}, Y: Field{[10]uint32{0x012430b3, 0x005f77fa, 0x01d7e053, 0x03d56811, 0x02933d6d, 0x03b15d24, 0x03e46204, 0x02bac884, 0x02618302, 0x002e8cdd}}}, + {X: Field{[10]uint32{0x03251531, 0x00574fe2, 0x034a9293, 0x036e8d36, 0x0330b6db, 0x012379f8, 0x027d0e40, 0x006bfa39, 0x02742890, 0x0033599b}}, Y: Field{[10]uint32{0x0002304b, 0x0146040e, 0x024f9e54, 0x0147c46c, 0x01440959, 0x027f227b, 0x02398e74, 0x02950390, 0x00b943cb, 0x002bdcb6}}}, + {X: Field{[10]uint32{0x0123ac72, 0x0272eb41, 0x0014ee83, 0x02f35ee2, 0x015a6285, 0x036640d5, 0x01837a11, 0x01bf811b, 0x028cfd2f, 0x00320cef}}, Y: Field{[10]uint32{0x01a6af03, 0x00926132, 0x00ed603a, 0x02fbfa32, 0x02b6c07d, 0x01430ed3, 0x01751531, 0x008d8ea3, 0x010b4411, 0x001faa3e}}}, + {X: Field{[10]uint32{0x025ea477, 0x0000da7c, 0x03613982, 0x013fa109, 0x02e40e4a, 0x03a56c58, 0x010ac1f5, 0x034e1762, 0x03363036, 0x00330617}}, Y: Field{[10]uint32{0x02338236, 0x03bae7c9, 0x02b42832, 0x01d50157, 0x03f66d07, 0x027384bb, 0x02aabe5a, 0x02726262, 0x0036146d, 0x00381da2}}}, + {X: Field{[10]uint32{0x009c4a5a, 0x010f0a63, 0x01770479, 0x0043a4b2, 0x0177ccd9, 0x0101ee02, 0x03c9be70, 0x030aead9, 0x006324bb, 0x00052382}}, Y: Field{[10]uint32{0x02408797, 0x03f8eeb0, 0x036ee55d, 0x00c7edc5, 0x01b706a3, 0x004e3a5f, 0x02733ae6, 0x03f20277, 0x00859cdd, 0x00227a0f}}}, + {X: Field{[10]uint32{0x02c95c76, 0x038048af, 0x03a7e460, 0x012553d4, 0x010cf8b6, 0x00a8dd87, 0x008d9b19, 0x02d60d72, 0x01c1aba5, 0x0026c54e}}, Y: Field{[10]uint32{0x00efdc18, 0x03c8756b, 0x0395b967, 0x010a88c9, 0x00d8472e, 0x02a87389, 0x00895f13, 0x01676b53, 0x021945be, 0x000e4737}}}, + {X: Field{[10]uint32{0x024495cd, 0x02e29cc3, 0x03dd3e93, 0x01d2a5d2, 0x03a60327, 0x03d09f31, 0x029e575f, 0x00074dda, 0x02c175fb, 0x001a28b9}}, Y: Field{[10]uint32{0x00e00752, 0x00f7139e, 0x014f2557, 0x02df89cf, 0x030666ca, 0x03166591, 0x0269b741, 0x0037797c, 0x0084c8c3, 0x00054f99}}}, + {X: Field{[10]uint32{0x01dfb04e, 0x01b08a18, 0x030b66c3, 0x028b9f0b, 0x007669e9, 0x00cf332b, 0x02334405, 0x029030ed, 0x004935a5, 0x00163fa4}}, Y: Field{[10]uint32{0x0136e1bb, 0x03eed815, 0x01555b39, 0x009c569e, 0x0371ac1e, 0x0356669d, 0x0106e2a2, 0x0038b5c7, 0x01c59245, 0x002cda41}}}, + {X: Field{[10]uint32{0x02ac7080, 0x0169e0d7, 0x00378337, 0x029838a6, 0x0103e9bc, 0x026d809f, 0x01aff2a1, 0x0366c2ff, 0x0396dcbd, 0x00208f03}}, Y: Field{[10]uint32{0x02ad0a7f, 0x0334823c, 0x03db8895, 0x02c36410, 0x028831a2, 0x00efcf0d, 0x03eb6d54, 0x026962ea, 0x02ccf34d, 0x00364551}}}, + {X: Field{[10]uint32{0x02d14537, 0x03378800, 0x02caf533, 0x01493df7, 0x03d68121, 0x00c04fb9, 0x03e7b710, 0x03e42157, 0x02aee908, 0x001295ab}}, Y: Field{[10]uint32{0x0222b7a2, 0x02be42b1, 0x00d8d021, 0x03ecb80c, 0x023129a7, 0x01e43ae6, 0x01995b33, 0x00634846, 0x000133b7, 0x001f9832}}}, + {X: Field{[10]uint32{0x01240334, 0x01b28efe, 0x0168a71f, 0x03d27f82, 0x0382a64b, 0x02204c66, 0x0194e2b8, 0x03d7cb11, 0x0055e6c4, 0x001b03ce}}, Y: Field{[10]uint32{0x03b5203c, 0x03f8d348, 0x02fc83ac, 0x0346d355, 0x03e1478a, 0x0016bab4, 0x01ade853, 0x02eea12d, 0x036da9ef, 0x0017239e}}}, + {X: Field{[10]uint32{0x01ac9632, 0x02e8a8cd, 0x033313ae, 0x002d4923, 0x000496e4, 0x005cb992, 0x01de21cf, 0x01241c57, 0x032cd170, 0x003673e3}}, Y: Field{[10]uint32{0x00934344, 0x00e0570f, 0x028e6b07, 0x0242db0f, 0x0315867e, 0x00d755fd, 0x0198299c, 0x03e4c02f, 0x0251b440, 0x0024a9f0}}}, + {X: Field{[10]uint32{0x0193d898, 0x01d9fdee, 0x039e27c6, 0x00a3f3c6, 0x01775927, 0x026bcc0e, 0x027ed43d, 0x0371eebe, 0x00928b91, 0x0012ff2d}}, Y: Field{[10]uint32{0x005d14f7, 0x032a5269, 0x03dda7bf, 0x03a791c0, 0x001854a4, 0x00ea8cee, 0x00c9a4ae, 0x035042cd, 0x02f1ecd9, 0x0009da81}}}, + {X: Field{[10]uint32{0x03c434e8, 0x00066b08, 0x00792944, 0x01d7964a, 0x027cdcc5, 0x0055965b, 0x0193dee8, 0x00cbd13b, 0x0093ac40, 0x002af796}}, Y: Field{[10]uint32{0x0195c40a, 0x012c0360, 0x0116ed77, 0x02c93066, 0x0346162c, 0x033bc0be, 0x002af7a7, 0x018113a5, 0x00092b9e, 0x001780ea}}}, + {X: Field{[10]uint32{0x026e1cc5, 0x00ec3f54, 0x020a803b, 0x02b8c6f8, 0x004482f1, 0x00a07688, 0x00814b49, 0x02a3845e, 0x03077a98, 0x00081758}}, Y: Field{[10]uint32{0x03e4d780, 0x027fd41b, 0x036147a7, 0x03495595, 0x00b9cab7, 0x01b992ff, 0x015cb19d, 0x00d581ae, 0x015c943e, 0x0012ef8a}}}, + {X: Field{[10]uint32{0x001c43bd, 0x02337491, 0x00b7c3b9, 0x02f116fd, 0x01b59653, 0x01b980c7, 0x0228a423, 0x00e871b0, 0x0083e667, 0x0032d313}}, Y: Field{[10]uint32{0x031a2769, 0x013a3ab8, 0x01149cfe, 0x00307fa9, 0x0062f334, 0x016bf9c5, 0x002ff397, 0x01fa83df, 0x02763926, 0x00050b80}}}, + {X: Field{[10]uint32{0x00ca77a7, 0x02ec894b, 0x004f2b5a, 0x02cb7b1f, 0x0392ccf0, 0x024cd5bb, 0x0354a4b4, 0x02f7eceb, 0x00b27ff5, 0x0009687d}}, Y: Field{[10]uint32{0x035c3c38, 0x03fe5ecc, 0x03fe93e9, 0x022ca229, 0x0136c32e, 0x02647cb6, 0x033b3afc, 0x020d05f7, 0x0193153f, 0x0006c977}}}, + {X: Field{[10]uint32{0x0254237b, 0x029dea8a, 0x026dc89c, 0x015255ed, 0x015a1b71, 0x0195f2e2, 0x011c863a, 0x02835a94, 0x02a77eec, 0x00088bdd}}, Y: Field{[10]uint32{0x00b0b289, 0x01680bcb, 0x03492794, 0x0210bda8, 0x01a205c8, 0x019974a5, 0x03a598a8, 0x03e23421, 0x02e064ef, 0x002a3caf}}}, + {X: Field{[10]uint32{0x034dfa8d, 0x032f63ce, 0x002daec3, 0x009a67c7, 0x02379f5c, 0x024dad01, 0x03f10156, 0x01946d06, 0x028d1ad2, 0x000cb50c}}, Y: Field{[10]uint32{0x0188261d, 0x033a4c1e, 0x0290d204, 0x028741a4, 0x02df5de0, 0x0391e025, 0x00d40623, 0x028ced7d, 0x02e23294, 0x0027db79}}}, + {X: Field{[10]uint32{0x01f1d3f0, 0x0195a460, 0x01b14e82, 0x00c33e64, 0x01187d08, 0x01998adf, 0x01937900, 0x0335c0ec, 0x00be6948, 0x00337a7b}}, Y: Field{[10]uint32{0x03029720, 0x03a06c56, 0x015e24bc, 0x03ffe554, 0x01f5abe8, 0x022b55b1, 0x037794ce, 0x00634a6d, 0x03320e12, 0x0021221e}}}, + {X: Field{[10]uint32{0x0348947d, 0x0354f4e9, 0x00b80011, 0x01f89979, 0x02509f4e, 0x0141a801, 0x03435826, 0x03bd32a0, 0x005c3baa, 0x002f227d}}, Y: Field{[10]uint32{0x03e68475, 0x00a7d79b, 0x03a49511, 0x02bdc89a, 0x0209fa15, 0x00d3de6f, 0x0272fce5, 0x02c519e8, 0x00a2714d, 0x003bfd6f}}}, + {X: Field{[10]uint32{0x01b51d4f, 0x003dd237, 0x03df0994, 0x02e6d5fb, 0x0139b409, 0x010d2a6b, 0x014ba655, 0x02eff8af, 0x00c0eea2, 0x001899e3}}, Y: Field{[10]uint32{0x03a74acf, 0x0141470d, 0x00883673, 0x02e79ef3, 0x02a5cc8a, 0x03db7553, 0x0161245e, 0x034c7470, 0x034fd234, 0x00234e13}}}, + {X: Field{[10]uint32{0x02bc93d0, 0x027e4ce1, 0x02f8af21, 0x030d3fa1, 0x02df7c0a, 0x037e89cd, 0x01c89cf3, 0x0388958f, 0x0139c63a, 0x00057807}}, Y: Field{[10]uint32{0x00cfb13b, 0x01d56204, 0x03ef42bc, 0x0267e8c5, 0x01e7efb9, 0x025da618, 0x03251334, 0x032e0705, 0x0132314f, 0x0007d58d}}}, + {X: Field{[10]uint32{0x03ac10e3, 0x03cd92ca, 0x03eb97b8, 0x000c06f6, 0x0052c601, 0x010a2ba7, 0x018e813e, 0x009637fe, 0x03493493, 0x0013e34a}}, Y: Field{[10]uint32{0x0169b73f, 0x02c99380, 0x021bcd66, 0x039085b2, 0x031e8c58, 0x03e467d5, 0x00580283, 0x0176db00, 0x017b6795, 0x00231f44}}}, + {X: Field{[10]uint32{0x016f1d61, 0x02249dad, 0x0136f1a7, 0x02d3d124, 0x003b0d77, 0x0374d623, 0x03e397cd, 0x01ad8260, 0x031a2bf1, 0x00345338}}, Y: Field{[10]uint32{0x013f0910, 0x03cdcd2b, 0x0335611e, 0x031c9613, 0x01833f24, 0x0375eefd, 0x022ca6e4, 0x0360e8dc, 0x0220b227, 0x0026857d}}}, + {X: Field{[10]uint32{0x02f780f1, 0x03a38ed9, 0x008419c3, 0x028b104c, 0x00024c1a, 0x02ffa800, 0x00d656c9, 0x01d7d704, 0x034eb8c2, 0x000d4886}}, Y: Field{[10]uint32{0x03f8e808, 0x0317764e, 0x03fa0f8e, 0x01186d77, 0x0306888d, 0x009de195, 0x038382bb, 0x02bf2ef5, 0x02025274, 0x000f4716}}}, + {X: Field{[10]uint32{0x00a8ddc8, 0x02b02a8d, 0x0043c49e, 0x005dc9c2, 0x0083f686, 0x03d10ec8, 0x00ff6f29, 0x0306e3d1, 0x003b1c76, 0x0020bb67}}, Y: Field{[10]uint32{0x015f1340, 0x0077177a, 0x02fc48a9, 0x0162bbf5, 0x00e81f5a, 0x000009a4, 0x002081d9, 0x00ae19cd, 0x026bc2ab, 0x00098ba7}}}, + {X: Field{[10]uint32{0x00717b85, 0x0078d244, 0x02118d18, 0x012bfd71, 0x009c49b6, 0x010ba5f1, 0x02342f77, 0x02a8dba1, 0x020eacf2, 0x002467a5}}, Y: Field{[10]uint32{0x0145b861, 0x020bf936, 0x016505a0, 0x010b1e08, 0x03ef530d, 0x030ca7c4, 0x01ce9d5a, 0x0059e736, 0x014ea3ea, 0x0012d46a}}}, + {X: Field{[10]uint32{0x03c3ec7d, 0x03f4d996, 0x02c3065f, 0x0386b3c1, 0x02edca3d, 0x0190f398, 0x02abcafa, 0x01546afb, 0x023e20ce, 0x00336b2b}}, Y: Field{[10]uint32{0x02b95bb6, 0x00881c5b, 0x009b13d3, 0x0292cd07, 0x02235df4, 0x02953d3b, 0x00c326df, 0x001dab8a, 0x0313872b, 0x002aab2e}}}, + {X: Field{[10]uint32{0x02a5f2ab, 0x027389a4, 0x015a8f94, 0x03fed98f, 0x00de3a62, 0x001c9bc2, 0x0180f829, 0x017027cf, 0x00e21bd0, 0x00069142}}, Y: Field{[10]uint32{0x00ca97ba, 0x00c83d4b, 0x013e602b, 0x0315b497, 0x00c6e672, 0x02fc0a65, 0x00459bf4, 0x02c0cdd8, 0x03f0976e, 0x00149e03}}}, + {X: Field{[10]uint32{0x003a0b45, 0x005098a0, 0x018ddd52, 0x01dfcea8, 0x02e9129f, 0x03c9b262, 0x00f73d13, 0x03c972a5, 0x02ed5686, 0x002391bb}}, Y: Field{[10]uint32{0x01edcf4d, 0x0326bd87, 0x00200782, 0x0159843a, 0x027253d5, 0x01fc2bad, 0x03f2ed1e, 0x03ba9f21, 0x038d7041, 0x003b95b4}}}, + {X: Field{[10]uint32{0x017e4031, 0x0396ecda, 0x00532a92, 0x0079e828, 0x0168d617, 0x02d8611a, 0x01797c15, 0x02cc276b, 0x00fa3bd6, 0x001e0a44}}, Y: Field{[10]uint32{0x00e4b3f4, 0x0025d4d1, 0x022ddee4, 0x03fdb4fc, 0x00717914, 0x011ac2a0, 0x00c31b89, 0x00a8a3a1, 0x0365c44c, 0x003fc5e0}}}, + {X: Field{[10]uint32{0x01f64e8a, 0x00f246b9, 0x01041ae9, 0x02a3e41a, 0x0265c50a, 0x013c75f4, 0x002d0a29, 0x004329b3, 0x028cc5a7, 0x0000aae7}}, Y: Field{[10]uint32{0x03f89b9b, 0x00ebf269, 0x001c9db2, 0x000a84f6, 0x03185366, 0x0164d251, 0x03cf23da, 0x012eb419, 0x010fa225, 0x0002aaf3}}}, + {X: Field{[10]uint32{0x0382c9e5, 0x006f4758, 0x037a5fcb, 0x03091843, 0x03a094dd, 0x01494a4d, 0x020cc533, 0x016c8a0c, 0x03c44fb2, 0x00341199}}, Y: Field{[10]uint32{0x02b0f74e, 0x0351e52c, 0x00f5ce31, 0x03600c19, 0x026e5a91, 0x02b13ea1, 0x02f436ec, 0x01239e1a, 0x013f8bf0, 0x001f24d8}}}, + {X: Field{[10]uint32{0x0286b0f7, 0x012be0db, 0x01252def, 0x00a724d8, 0x00f157bd, 0x0160e265, 0x01b0476c, 0x03769294, 0x02f9799c, 0x002e711d}}, Y: Field{[10]uint32{0x0297932e, 0x02aad2b2, 0x029eff13, 0x036aa414, 0x03d1a9b0, 0x01a11549, 0x01cefbc4, 0x0122cfc9, 0x019bc779, 0x000bb1d8}}}, + {X: Field{[10]uint32{0x006eee85, 0x036a104a, 0x02e0d64f, 0x03ff7b8a, 0x004ef765, 0x03591ce7, 0x01d8c565, 0x0265012e, 0x01abf13f, 0x00242f7b}}, Y: Field{[10]uint32{0x00cf21f5, 0x00a04138, 0x037255c6, 0x0376e53d, 0x007f8bb8, 0x0061f49b, 0x02812a48, 0x0122ad2f, 0x0082d9a8, 0x002a7d1e}}}, + {X: Field{[10]uint32{0x00485c84, 0x001cdebf, 0x01e7ba68, 0x03377356, 0x03ff4208, 0x013afc3f, 0x02b83107, 0x01dcd300, 0x00a80217, 0x002830e5}}, Y: Field{[10]uint32{0x0109364b, 0x003975c3, 0x02e3fd64, 0x02d8bcd3, 0x00e835ca, 0x026dec59, 0x002434fe, 0x00bcd3f2, 0x0132b4c6, 0x00313c22}}}, + {X: Field{[10]uint32{0x00294c3e, 0x02ad434c, 0x00273b9a, 0x008fafab, 0x02bd3c29, 0x00b9da53, 0x00f949c7, 0x03a318a1, 0x01bd3896, 0x0006c0c6}}, Y: Field{[10]uint32{0x02ee339d, 0x03b54be8, 0x02080053, 0x01c8768c, 0x021401b6, 0x000edec6, 0x038233d7, 0x02ab9f97, 0x029b17c3, 0x000576ff}}}, + {X: Field{[10]uint32{0x03dc719d, 0x00b8f66f, 0x032ab699, 0x00ecea43, 0x001210eb, 0x01463730, 0x03a93540, 0x005afa89, 0x030fe92f, 0x0026453b}}, Y: Field{[10]uint32{0x03c4086b, 0x0370ac6c, 0x02b8398d, 0x00b218cc, 0x005e671d, 0x02bd968c, 0x01f3629f, 0x002c47a3, 0x00650cea, 0x001e82f4}}}, + {X: Field{[10]uint32{0x01f60d3e, 0x03b744f7, 0x03810daa, 0x01b5eb39, 0x015798ad, 0x02572585, 0x02fa1763, 0x03d8e1f6, 0x02195599, 0x000e9a3e}}, Y: Field{[10]uint32{0x00e71a89, 0x025afdf5, 0x0054f5cd, 0x03ba6a2b, 0x00de158e, 0x00190729, 0x00faef1e, 0x01a76ce5, 0x02e6a3f5, 0x001d15d6}}}, + {X: Field{[10]uint32{0x0288b2e5, 0x01a71817, 0x023859da, 0x03b1fc04, 0x0241193d, 0x006fff23, 0x01872b1b, 0x01f8c43c, 0x0141e2b6, 0x002dcd87}}, Y: Field{[10]uint32{0x00668344, 0x0241f860, 0x029c29b0, 0x02f7c42f, 0x00315347, 0x01b9eb34, 0x00f5890f, 0x026f29cf, 0x039566d4, 0x003ea75a}}}, + {X: Field{[10]uint32{0x01174e81, 0x0216e0c9, 0x01bc637b, 0x034c4ba6, 0x02aa93a4, 0x03edffe7, 0x03d13543, 0x011903db, 0x018742d8, 0x000d07a6}}, Y: Field{[10]uint32{0x03fcfc95, 0x00adae62, 0x007ac861, 0x0269bb5d, 0x01e95b4e, 0x018b97f0, 0x01cbcff7, 0x01861d84, 0x00dc91b4, 0x00312582}}}, + {X: Field{[10]uint32{0x0083e6f6, 0x03dd76b1, 0x0026e2a0, 0x02febe1d, 0x001f6420, 0x000b25c6, 0x00849094, 0x03d55d00, 0x0045de34, 0x0020f5a9}}, Y: Field{[10]uint32{0x01dddfc1, 0x030486e8, 0x030fd787, 0x00249df6, 0x00e9fbed, 0x012a5376, 0x01cf48a1, 0x03ed4d7b, 0x034458c8, 0x001ea1b6}}}, + {X: Field{[10]uint32{0x02ac351b, 0x02e12e49, 0x03bdda40, 0x0218bf3f, 0x0032d176, 0x01a92676, 0x0082bf1c, 0x032ba624, 0x035a014b, 0x0013c448}}, Y: Field{[10]uint32{0x014a2acf, 0x018cce7a, 0x022886e9, 0x03b6f967, 0x0308678d, 0x01dce72d, 0x00021c83, 0x009a745a, 0x00f15f31, 0x002d4189}}}, + {X: Field{[10]uint32{0x03ee2b89, 0x03a6a734, 0x0115b998, 0x024b0208, 0x02eafb38, 0x02db8f5f, 0x0285907a, 0x0384b3a9, 0x032721cf, 0x0023eed5}}, Y: Field{[10]uint32{0x02906680, 0x0248e8d9, 0x03ab791c, 0x0296be2f, 0x00ef1bb1, 0x0296d6a9, 0x018de8e2, 0x02386973, 0x0285c814, 0x00369ff9}}}, + {X: Field{[10]uint32{0x0096c3de, 0x00b167d5, 0x02bd63f5, 0x03cbf19c, 0x01286023, 0x00fd6627, 0x0205b1f5, 0x00fd7dd9, 0x023cb924, 0x00201329}}, Y: Field{[10]uint32{0x035233c6, 0x01c2c175, 0x01fd8431, 0x01b52722, 0x00865fab, 0x02bad13e, 0x038300ee, 0x00455a86, 0x0112eedb, 0x00000dca}}}, + {X: Field{[10]uint32{0x012a5365, 0x005da70b, 0x03bf58cc, 0x035c77a6, 0x0060b48e, 0x01598341, 0x018de870, 0x02a091ac, 0x006ab83c, 0x002c9e57}}, Y: Field{[10]uint32{0x0249d820, 0x0024d6ca, 0x0041f90d, 0x015e6f70, 0x01db6841, 0x021aa280, 0x03510441, 0x002dad34, 0x02b58853, 0x0019ba30}}}, + {X: Field{[10]uint32{0x02d9dad3, 0x0317814d, 0x02588208, 0x00ec640e, 0x00caf390, 0x001193ad, 0x0139d07c, 0x03645302, 0x004db61b, 0x0037ad4c}}, Y: Field{[10]uint32{0x015777ca, 0x0281aa53, 0x03b27762, 0x0360fdec, 0x0040507d, 0x039201cf, 0x00b62491, 0x0179d9a9, 0x0343e7e4, 0x00063553}}}, + {X: Field{[10]uint32{0x037714c4, 0x00f3aee6, 0x035cf774, 0x03a15d27, 0x01eb79d5, 0x00cd9a40, 0x0061d696, 0x03b0d2db, 0x0102d177, 0x000446fd}}, Y: Field{[10]uint32{0x016a4e54, 0x030e35da, 0x000f0bf8, 0x0083f99e, 0x0107d8ba, 0x0391e83c, 0x036bad45, 0x02ef33c0, 0x012abc38, 0x002fa035}}}, + {X: Field{[10]uint32{0x00be92a5, 0x006f4e37, 0x00f8b016, 0x01419d34, 0x01daceeb, 0x02e18e19, 0x014e71fd, 0x014e4fa3, 0x0343c15c, 0x00252c43}}, Y: Field{[10]uint32{0x01be6dc7, 0x02e6ddfd, 0x02e9bd25, 0x035fc682, 0x038d087d, 0x004161b3, 0x03f77291, 0x0230d96c, 0x032ea34e, 0x003b156b}}}, + {X: Field{[10]uint32{0x02895593, 0x007c6203, 0x02248d3b, 0x00b44051, 0x03fb4a42, 0x00b4c0da, 0x03e529d6, 0x01de1314, 0x03f22d44, 0x001189ea}}, Y: Field{[10]uint32{0x037b3e4a, 0x018140fa, 0x01c483a5, 0x03d31fa3, 0x00cbea9e, 0x01947a52, 0x00172d56, 0x02d66dce, 0x018d6110, 0x0022cd07}}}, + {X: Field{[10]uint32{0x017c355f, 0x02e91a0a, 0x02a80757, 0x02fb05ca, 0x03585dca, 0x037714c9, 0x035727b5, 0x03730dcd, 0x01cfdfea, 0x00067385}}, Y: Field{[10]uint32{0x01e60f81, 0x0333f613, 0x03a6625c, 0x01f816ce, 0x0283853e, 0x021b3bc9, 0x02ca9ec8, 0x024505cd, 0x015ece82, 0x00014195}}}, + {X: Field{[10]uint32{0x039a3e55, 0x0373f42a, 0x01ef0fe6, 0x00b85b4f, 0x01295068, 0x0387e45b, 0x03e97d80, 0x03f2ba30, 0x02818293, 0x001d6901}}, Y: Field{[10]uint32{0x008c7930, 0x01f45577, 0x01f22a04, 0x002fce7d, 0x03452678, 0x0254a62d, 0x039f2af4, 0x03893604, 0x01c0e02e, 0x0014a4b5}}}, + {X: Field{[10]uint32{0x033bf578, 0x03de6f07, 0x026f1cbb, 0x033a3cc8, 0x0388cb82, 0x03d29ccc, 0x03a341d4, 0x01da1ad1, 0x038def4b, 0x0029fae2}}, Y: Field{[10]uint32{0x018199a1, 0x03f24fef, 0x01cc880c, 0x028a1a19, 0x0124407c, 0x0129c962, 0x0352bf39, 0x015df2ce, 0x036fe238, 0x00217662}}}, + {X: Field{[10]uint32{0x03da647a, 0x024e37ac, 0x02c00e8a, 0x01114385, 0x016c9f83, 0x03067dae, 0x0352d143, 0x00759c2c, 0x02b5dcc9, 0x00296e68}}, Y: Field{[10]uint32{0x039571c1, 0x01cbca1e, 0x00c29634, 0x004ff45b, 0x0126fc4e, 0x009833fc, 0x0335aba1, 0x0011c590, 0x03a83985, 0x003c4b53}}}, + {X: Field{[10]uint32{0x00015cca, 0x00273211, 0x0217157c, 0x00c5e2b5, 0x01df58d8, 0x026c3f7d, 0x037c20ee, 0x02269977, 0x02ed48d5, 0x001e6671}}, Y: Field{[10]uint32{0x018f5756, 0x02dcc750, 0x010145bc, 0x003489d5, 0x00aaacaf, 0x034fc4b2, 0x00b3fecb, 0x030e8715, 0x01053706, 0x00055bd1}}}, + {X: Field{[10]uint32{0x009829b1, 0x02b4de71, 0x028e20fe, 0x0161b70b, 0x01422020, 0x030171eb, 0x01baade6, 0x03b746e1, 0x01f3b708, 0x00223fa0}}, Y: Field{[10]uint32{0x03727c01, 0x035035f7, 0x01b10d99, 0x03376a87, 0x008972a8, 0x0182814b, 0x00341502, 0x01f4aec5, 0x024fb04b, 0x003358b8}}}, + {X: Field{[10]uint32{0x03e86763, 0x015f57d3, 0x0264e895, 0x00dd421e, 0x01912165, 0x01a529df, 0x03192beb, 0x0187f908, 0x02b0cfcc, 0x00063ec3}}, Y: Field{[10]uint32{0x00169785, 0x00a3174e, 0x01922b1f, 0x038d548a, 0x0380f4a6, 0x03b61c75, 0x0288e230, 0x02d594e3, 0x031fdfe8, 0x000f3dca}}}, + {X: Field{[10]uint32{0x03d38aac, 0x006721bb, 0x00b660d9, 0x03ebad7f, 0x02004719, 0x02bc639d, 0x03171d5b, 0x03cb333f, 0x02312be4, 0x0036b6cc}}, Y: Field{[10]uint32{0x018bc0d7, 0x03d2cc3e, 0x039813d9, 0x00c31a9c, 0x0150e0b3, 0x02855112, 0x0340e423, 0x03a2f2c1, 0x005d752d, 0x002359e5}}}, + {X: Field{[10]uint32{0x039e5c8e, 0x015fc1a8, 0x039c2d80, 0x0271b070, 0x027b17e0, 0x038c416e, 0x03aa0cb0, 0x027d91ac, 0x00867cdd, 0x003c2e68}}, Y: Field{[10]uint32{0x02f4e9de, 0x032782d7, 0x01c81370, 0x000f052f, 0x003ff913, 0x020872ef, 0x01cf4319, 0x03460103, 0x025625e6, 0x000ad4d3}}}, + {X: Field{[10]uint32{0x02fcb7e0, 0x03efa2b0, 0x0132d406, 0x0199922e, 0x031cd601, 0x01cba350, 0x010e2536, 0x030e9f97, 0x03052e49, 0x00370382}}, Y: Field{[10]uint32{0x03b791d9, 0x0151f871, 0x01bea086, 0x03ce087f, 0x02223e7a, 0x02487892, 0x0139cb56, 0x01946933, 0x03868e1c, 0x003fe465}}}, + {X: Field{[10]uint32{0x02eb91ee, 0x02a9688c, 0x01038b74, 0x023c4604, 0x016bea74, 0x00571b29, 0x02c365b5, 0x03751cd7, 0x0298fb6d, 0x0039c72b}}, Y: Field{[10]uint32{0x01600266, 0x020af3c7, 0x0106ce66, 0x029ca007, 0x019ed731, 0x036f47d0, 0x03c5bc75, 0x0083db8b, 0x0018396c, 0x002012ba}}}, + {X: Field{[10]uint32{0x00ddfd8c, 0x01e4ad35, 0x03b9f88d, 0x01a081e6, 0x006b5d53, 0x02f4b29b, 0x0194d486, 0x0393fced, 0x01b2f7b2, 0x0014346d}}, Y: Field{[10]uint32{0x015cc744, 0x012f2213, 0x01f5b6e3, 0x039d0083, 0x015c554f, 0x02ae863f, 0x039b03f0, 0x0019821a, 0x00c518fa, 0x00155b3d}}}, + {X: Field{[10]uint32{0x002701aa, 0x00c8746f, 0x01747325, 0x021ad1c2, 0x00966348, 0x008fdb2d, 0x00c5e86f, 0x0365537e, 0x003e2bd5, 0x003021d0}}, Y: Field{[10]uint32{0x03507712, 0x028894a8, 0x00679003, 0x012f8ac0, 0x02258bc1, 0x03b61f81, 0x023a549e, 0x01cc001b, 0x0187d851, 0x00276d12}}}, + {X: Field{[10]uint32{0x016d6894, 0x003d45ef, 0x002b3798, 0x03d47a49, 0x014d45f8, 0x03da28a6, 0x00988fd3, 0x00d08b7a, 0x03f7f384, 0x0037440d}}, Y: Field{[10]uint32{0x01cccce1, 0x030646c9, 0x025f254f, 0x03395ac1, 0x021a9c08, 0x01cc24e9, 0x01ab8b76, 0x02f3762c, 0x01615cfb, 0x0032a39b}}}, + {X: Field{[10]uint32{0x00b5ceb4, 0x02731f4d, 0x01d1473a, 0x0295b026, 0x00424dfd, 0x0063dd93, 0x02840c3d, 0x01626fd2, 0x021967ca, 0x003788a6}}, Y: Field{[10]uint32{0x00122b22, 0x014456d5, 0x00be702d, 0x03046e3a, 0x00a1d352, 0x0391bfd1, 0x023f4b2a, 0x018ea50c, 0x01ca84ca, 0x002563f2}}}, + {X: Field{[10]uint32{0x00cdfd9c, 0x031fb881, 0x01cb1143, 0x03759ea3, 0x02f8a3a3, 0x0028d690, 0x0225f487, 0x0213e858, 0x03c9cc9d, 0x0000578c}}, Y: Field{[10]uint32{0x0260e920, 0x026e6cc1, 0x022562f8, 0x00571fcd, 0x02a59a1e, 0x01792b5a, 0x02058364, 0x033574d8, 0x0206ed48, 0x00104f00}}}, + {X: Field{[10]uint32{0x03d6bee0, 0x03902328, 0x00fc4394, 0x0266deac, 0x00dc010b, 0x02c86b8e, 0x023e3173, 0x01361cb4, 0x0161ca3c, 0x0014d089}}, Y: Field{[10]uint32{0x0103048e, 0x02ecfed8, 0x038b78de, 0x002e9c6e, 0x0020f2c5, 0x01e73872, 0x007c7ab7, 0x02427d94, 0x02e5e505, 0x001bba41}}}, + {X: Field{[10]uint32{0x0282b2fc, 0x00765ca6, 0x02a74a03, 0x0028245d, 0x020308bf, 0x0172dc72, 0x0000bbff, 0x013cdcca, 0x034f9b2c, 0x0020a773}}, Y: Field{[10]uint32{0x038483c4, 0x017dab97, 0x005d3352, 0x03101857, 0x01abe3f8, 0x03d621cf, 0x0249d3c9, 0x014e2938, 0x0200429e, 0x0011cde0}}}, + {X: Field{[10]uint32{0x02e911e5, 0x039970e2, 0x00ebe450, 0x02e8757d, 0x01c05594, 0x033fe5fc, 0x023b989a, 0x02c6c524, 0x02b73769, 0x003b5bdb}}, Y: Field{[10]uint32{0x02c38eb4, 0x01403868, 0x03fbe18e, 0x02768dcb, 0x01d52e2d, 0x027fd886, 0x018cd0b6, 0x02136e2e, 0x032f3fe5, 0x0037fb9b}}}, + {X: Field{[10]uint32{0x00455503, 0x009c8170, 0x013da303, 0x02fb2d24, 0x0370616e, 0x03cac612, 0x00d1982d, 0x01c83a3f, 0x03981fbe, 0x0011f948}}, Y: Field{[10]uint32{0x02f3e900, 0x038bd2ae, 0x012515ea, 0x02e1b118, 0x00179f4c, 0x0378379c, 0x020cfbd1, 0x030c3da0, 0x00ebf360, 0x002bf4b7}}}, + {X: Field{[10]uint32{0x01037312, 0x037812ea, 0x010df49f, 0x02a304f7, 0x00ba10e2, 0x017a2039, 0x03f1170f, 0x0387e1bc, 0x03d58f48, 0x002c0a4d}}, Y: Field{[10]uint32{0x00c18c4f, 0x034f1e8a, 0x03cf5347, 0x0093da32, 0x038a6c79, 0x00d5785f, 0x02de5805, 0x021158c5, 0x024f3e4c, 0x000372c2}}}, + {X: Field{[10]uint32{0x001989f8, 0x015ff43b, 0x025d44ee, 0x03af7f71, 0x03878486, 0x00f019ba, 0x0010c2dc, 0x03070c97, 0x00f53578, 0x0027e64f}}, Y: Field{[10]uint32{0x01c8bb52, 0x00ece18c, 0x0275d914, 0x01bc34e0, 0x01e83eda, 0x03986ebe, 0x026ea432, 0x02047359, 0x000b16b8, 0x0031ae35}}}, + {X: Field{[10]uint32{0x013240e6, 0x03e6e277, 0x0284e599, 0x0213cdbf, 0x01ce4317, 0x037f4743, 0x02730edb, 0x03b077c4, 0x00c25913, 0x00250edb}}, Y: Field{[10]uint32{0x03ed3fd0, 0x01dd2093, 0x0316d09f, 0x03ffead6, 0x029604d3, 0x0153bd56, 0x02d7ca32, 0x03fcff50, 0x02bacac2, 0x00396040}}}, + {X: Field{[10]uint32{0x01acfe0a, 0x02fcbc06, 0x00a6481f, 0x033d1fd6, 0x0059511d, 0x01ed69f2, 0x0043da4f, 0x03e7b146, 0x027e69b3, 0x00026c39}}, Y: Field{[10]uint32{0x01c54dd8, 0x00274c3b, 0x01c674a0, 0x00dbdf92, 0x022e074c, 0x01cccf29, 0x02defc7d, 0x03b2d338, 0x002817a4, 0x001a9377}}}, + {X: Field{[10]uint32{0x00571651, 0x03a19ce9, 0x03acc72a, 0x02d004da, 0x020c8246, 0x012329b9, 0x03b0fd40, 0x03463e30, 0x02339cd8, 0x0025f73b}}, Y: Field{[10]uint32{0x00e693e4, 0x00b4b49d, 0x03d510d8, 0x01192208, 0x0229b952, 0x0224cf71, 0x02e36cfc, 0x02fce62a, 0x0205cc20, 0x001858e8}}}, + {X: Field{[10]uint32{0x02292ced, 0x027fdeb4, 0x00267299, 0x003cadf7, 0x02798c94, 0x01286e80, 0x02a9c26f, 0x007b69f3, 0x02f92696, 0x00287979}}, Y: Field{[10]uint32{0x00d5f19d, 0x0234c6c2, 0x00fbeca1, 0x03e4ee7a, 0x03cfc07a, 0x01b65d95, 0x01384013, 0x003dd3b4, 0x037a6a71, 0x001409d2}}}, + {X: Field{[10]uint32{0x034884a9, 0x0210a596, 0x021a61a9, 0x02c61020, 0x001c21bd, 0x03f1dc60, 0x03c9bdc6, 0x0377f14b, 0x03cf7cdf, 0x0011cf57}}, Y: Field{[10]uint32{0x03d856af, 0x01f16c63, 0x02250eba, 0x03afa2f9, 0x0389ff95, 0x0320b656, 0x032d7036, 0x03d543fa, 0x02a70ad7, 0x000d220d}}}, + {X: Field{[10]uint32{0x0396f613, 0x0147a851, 0x009d454c, 0x004caec5, 0x00db8c1e, 0x00151326, 0x00c33b27, 0x02cb413f, 0x00427384, 0x0027061d}}, Y: Field{[10]uint32{0x00ae0a19, 0x00fdfd7f, 0x0342b791, 0x00d831c4, 0x02c1825d, 0x02573bee, 0x0212e475, 0x0001e4f6, 0x0043970f, 0x000b5b7b}}}, + {X: Field{[10]uint32{0x0162b154, 0x029aa981, 0x0351e0c7, 0x00a57d6f, 0x02ed63c7, 0x039d0392, 0x002d826b, 0x038afedd, 0x00469150, 0x00047387}}, Y: Field{[10]uint32{0x034fa33d, 0x02da9887, 0x00271aa3, 0x0232bca9, 0x0267f3b2, 0x03a2df64, 0x01f8b93b, 0x00a03eaf, 0x014fea38, 0x001ba194}}}, + {X: Field{[10]uint32{0x01656042, 0x0297159e, 0x031cd4d9, 0x01c52eb3, 0x03dde2fd, 0x0234731b, 0x013c3541, 0x0379bca2, 0x0104e4e2, 0x000780de}}, Y: Field{[10]uint32{0x00960755, 0x03a06963, 0x0221b462, 0x0214f007, 0x023c81ac, 0x002bc0d7, 0x028aa38a, 0x01a084a8, 0x01c934c2, 0x0006edd6}}}, + {X: Field{[10]uint32{0x00071d82, 0x007669f0, 0x02800995, 0x0178c731, 0x003f8d50, 0x03e78d88, 0x0294f240, 0x0266abc6, 0x006723f8, 0x0014bf25}}, Y: Field{[10]uint32{0x00bd6dbb, 0x0065a5f4, 0x039db924, 0x02cd2ce8, 0x0239c909, 0x01c2d1ee, 0x00dfb992, 0x00208083, 0x02e07543, 0x000118ca}}}, + {X: Field{[10]uint32{0x0242b20d, 0x027600c1, 0x02a4ff9e, 0x02d35e37, 0x0235069e, 0x025bd4e1, 0x00f9e394, 0x00672c85, 0x01059975, 0x0032d616}}, Y: Field{[10]uint32{0x0093ac7d, 0x038e44fb, 0x02d45064, 0x03cd6643, 0x007131b2, 0x038b5794, 0x02a0f51c, 0x01d68790, 0x02e7a5b4, 0x0006e7d0}}}, + {X: Field{[10]uint32{0x00a69c46, 0x02b803ed, 0x03a12cec, 0x00368471, 0x03e7ab18, 0x034def34, 0x03275845, 0x011561d5, 0x005729f1, 0x000e0b0a}}, Y: Field{[10]uint32{0x00039440, 0x03079f95, 0x008e4a25, 0x028f82c9, 0x03495907, 0x03c4a1a4, 0x02586843, 0x003ecdb8, 0x011220a7, 0x0032c9fa}}}, + {X: Field{[10]uint32{0x034e5024, 0x03b2e213, 0x0164b6dc, 0x00fecbe5, 0x02a4dd61, 0x02cce9a4, 0x00456dce, 0x0039263e, 0x02c6c285, 0x0005bc21}}, Y: Field{[10]uint32{0x039339a9, 0x03bbfb49, 0x01df312d, 0x033b26b5, 0x0073cb5e, 0x0169940d, 0x008ca682, 0x004620d1, 0x020888eb, 0x000b854a}}}, + {X: Field{[10]uint32{0x01a02492, 0x03585dd9, 0x009506ee, 0x007d99cc, 0x014439a5, 0x011ba89d, 0x030f0ae4, 0x00d5dd54, 0x011b1f0a, 0x001d626f}}, Y: Field{[10]uint32{0x00462d49, 0x0365d966, 0x0389c00a, 0x030d8c30, 0x0004076f, 0x00534d8d, 0x01771bb0, 0x02054c79, 0x0212d375, 0x000b6103}}}, + {X: Field{[10]uint32{0x00930890, 0x00c9bd35, 0x004469a0, 0x03d689ad, 0x01a80cc5, 0x030efbba, 0x02dbd2b0, 0x00e944f7, 0x0240cce6, 0x00062e6b}}, Y: Field{[10]uint32{0x022690e4, 0x0293ae4a, 0x0118acf6, 0x035e382b, 0x039e0032, 0x02c9c342, 0x03571382, 0x00f111c6, 0x024dd5ed, 0x00092e1a}}}, + {X: Field{[10]uint32{0x03ebb48a, 0x03a2a2b4, 0x009a4ccf, 0x01b840b2, 0x0394e9ba, 0x012fa189, 0x030db5d1, 0x007bd900, 0x00a4acc7, 0x002307dd}}, Y: Field{[10]uint32{0x0245677a, 0x02c59ce4, 0x01c9416e, 0x00664b57, 0x021af1c1, 0x022c9b21, 0x03ba735c, 0x0294a478, 0x011998ae, 0x0029e7c0}}}, + {X: Field{[10]uint32{0x02bfb080, 0x00b080f0, 0x010465cd, 0x00223b1f, 0x002c0fca, 0x000e096d, 0x0157ba0d, 0x02aadd6d, 0x012d36bf, 0x00236016}}, Y: Field{[10]uint32{0x0151d3f6, 0x02d19bc0, 0x03a51859, 0x01504335, 0x027671a6, 0x014cff4a, 0x00a1bd4a, 0x01d14d34, 0x008791f2, 0x000f91e5}}}, + {X: Field{[10]uint32{0x030ca248, 0x0095d959, 0x02770f71, 0x03a78114, 0x03f36782, 0x00b159dd, 0x005046cf, 0x038563b2, 0x0319f477, 0x003aac2e}}, Y: Field{[10]uint32{0x00c04640, 0x01d3329f, 0x01ebd700, 0x0190fc62, 0x0337f0bd, 0x00ae81c7, 0x0355e563, 0x00ebd36b, 0x00812309, 0x00289f5c}}}, + {X: Field{[10]uint32{0x020a039c, 0x00cb1a8a, 0x0399bdb5, 0x00776d21, 0x0109647e, 0x0149833a, 0x03b249fd, 0x00be89b4, 0x01c9ebbb, 0x003fc343}}, Y: Field{[10]uint32{0x02b31fa9, 0x00e50bbe, 0x010233c4, 0x03d59884, 0x02fad5b0, 0x0366dd82, 0x01c35055, 0x007e2f38, 0x02ae7f16, 0x0004ac3d}}}, + {X: Field{[10]uint32{0x0037d526, 0x00aaa58e, 0x030ad42a, 0x0080fb9a, 0x02be22b3, 0x02c22def, 0x03403468, 0x02f46e48, 0x023571db, 0x0036268c}}, Y: Field{[10]uint32{0x02e3cf27, 0x02dd084d, 0x03b62146, 0x0241551b, 0x03db4a04, 0x039bdbc7, 0x008124d9, 0x03c59cc4, 0x01b99988, 0x0009768d}}}, + {X: Field{[10]uint32{0x025b43fd, 0x013004a4, 0x00a229ec, 0x0055574d, 0x0313ffb3, 0x019d47df, 0x03cdafa8, 0x02acb10c, 0x023bf01c, 0x003c5400}}, Y: Field{[10]uint32{0x02c7a9cc, 0x030f4cce, 0x03f341a9, 0x01a881ca, 0x038ac37a, 0x01ea7920, 0x00966b71, 0x032259b7, 0x0221026a, 0x000c7dc3}}}, + {X: Field{[10]uint32{0x003af2a8, 0x03b80672, 0x0070d9b3, 0x032382d1, 0x0276f442, 0x030b3436, 0x02e9d5e2, 0x0025e1ca, 0x013b2d58, 0x003663af}}, Y: Field{[10]uint32{0x01dba3f5, 0x005f249d, 0x00823e00, 0x01629453, 0x00930fb3, 0x029b1c89, 0x03f9873d, 0x0065c0d2, 0x02a95a06, 0x0027b56d}}}, + {X: Field{[10]uint32{0x03c3c746, 0x03ec06f2, 0x01827583, 0x00efe9df, 0x02817353, 0x03cf2a05, 0x002e313d, 0x0253bb7f, 0x0185833a, 0x00156d8b}}, Y: Field{[10]uint32{0x024a835c, 0x02b4444d, 0x0189715b, 0x02fd1320, 0x011f4dbb, 0x0269e84e, 0x01eb9211, 0x016bdede, 0x03730cb9, 0x0027e121}}}, + {X: Field{[10]uint32{0x01718de6, 0x003fb3ef, 0x021ca286, 0x01268a9e, 0x00ec759c, 0x01b070ff, 0x0069de8f, 0x00fe4d13, 0x0176fef7, 0x0037ebd3}}, Y: Field{[10]uint32{0x025a0671, 0x034c509c, 0x01971357, 0x0054656f, 0x017fba1f, 0x00db64fb, 0x0009f94c, 0x030a1fd9, 0x029344e2, 0x002b12bd}}}, + {X: Field{[10]uint32{0x01fe29da, 0x01fcf9b1, 0x00bf838b, 0x00f16043, 0x03a7839f, 0x005bb88a, 0x0020f29a, 0x0248b0dd, 0x00a34510, 0x00212911}}, Y: Field{[10]uint32{0x0114f06a, 0x02615404, 0x0175fa18, 0x01c032fe, 0x026e89af, 0x01cc1a7f, 0x03f420a6, 0x0304b850, 0x01802215, 0x003bdccf}}}, + {X: Field{[10]uint32{0x032212af, 0x006a94e9, 0x02548629, 0x01260e24, 0x032c3377, 0x025a0468, 0x01d24d12, 0x01c020f7, 0x021146c8, 0x0035f213}}, Y: Field{[10]uint32{0x00844ac4, 0x03350184, 0x01745f84, 0x0344135e, 0x019579b2, 0x0202bb18, 0x01357e54, 0x0102f70f, 0x0158a3be, 0x002c61f7}}}, + {X: Field{[10]uint32{0x0198051d, 0x03a9e215, 0x02a069ff, 0x02d5c68b, 0x00c7fca4, 0x01d41cb3, 0x029f6165, 0x0022fbce, 0x027fa70b, 0x003f7b70}}, Y: Field{[10]uint32{0x03b9bf9a, 0x0118a901, 0x01fbb3ec, 0x01379c91, 0x0253f6f5, 0x029fd378, 0x014d279b, 0x016a780d, 0x031a1c57, 0x003fa6de}}}, + {X: Field{[10]uint32{0x03122e77, 0x0171e57b, 0x039a5c2d, 0x0141365a, 0x03f950c2, 0x01610dec, 0x0022b350, 0x0331aa48, 0x038ad3f2, 0x0033e9d1}}, Y: Field{[10]uint32{0x021409c4, 0x02516c89, 0x023bb158, 0x0028f6a1, 0x022ad780, 0x03f7530b, 0x00f8eedf, 0x00a0d4d5, 0x01cae959, 0x003cf923}}}, + {X: Field{[10]uint32{0x020eefe2, 0x01f73a3b, 0x023f8033, 0x02f36377, 0x02aa1584, 0x01d9e3f3, 0x03b7493d, 0x00825dc3, 0x03f83fd6, 0x0023a455}}, Y: Field{[10]uint32{0x0205351b, 0x027ce94e, 0x0188ac8d, 0x016913ea, 0x003322fb, 0x02d2c8a7, 0x00f91df4, 0x037edae9, 0x02898c05, 0x00181e6e}}}, + {X: Field{[10]uint32{0x03116f75, 0x022e4a00, 0x01dfdbea, 0x03f1a9fe, 0x029d422f, 0x02f77fc8, 0x00eb80a9, 0x02b0c3b1, 0x03b6103e, 0x001efd7b}}, Y: Field{[10]uint32{0x03a71a3b, 0x00e24c4e, 0x03e67ba1, 0x0130d54f, 0x012cba4b, 0x015e5850, 0x01355542, 0x007b7f96, 0x02596479, 0x003beb6d}}}, + {X: Field{[10]uint32{0x00e8df0b, 0x009e0834, 0x0153e85f, 0x03f22747, 0x01690a13, 0x01da5c1e, 0x007b1b53, 0x030b49a3, 0x02b7b7b2, 0x003d6e80}}, Y: Field{[10]uint32{0x02465485, 0x03c54567, 0x013a3af7, 0x01930f1e, 0x00a9266b, 0x034b510c, 0x00329d19, 0x003906ff, 0x0126b264, 0x00198c5b}}}, + {X: Field{[10]uint32{0x03004475, 0x01262fff, 0x008284a1, 0x0297c494, 0x0387c10d, 0x008a547e, 0x02bc3dbf, 0x029325b4, 0x01f3dcec, 0x0017aab3}}, Y: Field{[10]uint32{0x011f122d, 0x0094652b, 0x02106c8c, 0x00425dfa, 0x00b38f58, 0x020c7341, 0x0185d404, 0x0338245a, 0x03ed9721, 0x0032cf6c}}}, + {X: Field{[10]uint32{0x024a5554, 0x0169da29, 0x01e4177c, 0x02fd3e8b, 0x01d1320a, 0x03544cdc, 0x0152ba6a, 0x0044d14d, 0x0017b8d6, 0x00073f97}}, Y: Field{[10]uint32{0x011dcd5d, 0x03a91aff, 0x008945ed, 0x039801e8, 0x0099bcab, 0x00c67dd0, 0x024a2f7e, 0x02e21c79, 0x00f64846, 0x0014e0df}}}, + {X: Field{[10]uint32{0x025dbc10, 0x007c28de, 0x028805e2, 0x02ed1391, 0x02286f47, 0x004843ef, 0x0091dd2a, 0x03321873, 0x03478a2c, 0x0024aa0f}}, Y: Field{[10]uint32{0x0199de94, 0x03d53d72, 0x01043684, 0x03e43b0d, 0x000cb69f, 0x006604cb, 0x0270b8bc, 0x016c0be0, 0x0065fcd4, 0x003fb8d7}}}, + {X: Field{[10]uint32{0x02d277d3, 0x012ada72, 0x01dd14f7, 0x034c92fd, 0x0173c07a, 0x00d6f6de, 0x0186ea10, 0x00e6c3d3, 0x01bad5d5, 0x0005c8a1}}, Y: Field{[10]uint32{0x02ada654, 0x0308be6a, 0x00897314, 0x0100a22d, 0x02cfc290, 0x03b8f883, 0x03afa15c, 0x018d9382, 0x0140cf35, 0x00116afe}}}, + {X: Field{[10]uint32{0x03164762, 0x01badcf2, 0x0032c764, 0x0204e817, 0x013126ce, 0x03e45637, 0x014ae08b, 0x026eae15, 0x015392e1, 0x002b45ef}}, Y: Field{[10]uint32{0x01065586, 0x0115d323, 0x01b94e16, 0x014625be, 0x038139c6, 0x0275c353, 0x01d4f47d, 0x00e61ddd, 0x00191c83, 0x000284a6}}}, + {X: Field{[10]uint32{0x02bdeb1c, 0x01f2cc4b, 0x00a12526, 0x001f1019, 0x03c23fd3, 0x00f94470, 0x02ce9e91, 0x02a2707d, 0x033e91a4, 0x00041086}}, Y: Field{[10]uint32{0x02a53319, 0x0164a18e, 0x03cc1923, 0x00036b1d, 0x03985697, 0x01cc4632, 0x02b8a510, 0x03c3f461, 0x01d09e49, 0x0014e6ed}}}, + {X: Field{[10]uint32{0x01de5bfd, 0x00d6c188, 0x030ff397, 0x03787838, 0x012e8476, 0x0198caa9, 0x039eba60, 0x00a8f772, 0x00fa7815, 0x00310eb7}}, Y: Field{[10]uint32{0x00abdebf, 0x00469567, 0x018801a9, 0x0389815f, 0x031e81c6, 0x036b2ede, 0x03d04f05, 0x01602e11, 0x01ca2122, 0x001b7742}}}, + {X: Field{[10]uint32{0x00bf9a73, 0x036401a6, 0x0227b5c8, 0x00764aab, 0x0014434f, 0x0279f662, 0x02b9e50d, 0x01634131, 0x00cb603a, 0x003dea67}}, Y: Field{[10]uint32{0x031a7ccb, 0x00e9df69, 0x01b0878a, 0x01332bf2, 0x005e6293, 0x032dd04c, 0x02d68091, 0x00e4eba5, 0x024476f4, 0x003337f0}}}, + {X: Field{[10]uint32{0x0209c826, 0x01d6f9c3, 0x01aacb31, 0x005a7492, 0x02f602d5, 0x028b2a6f, 0x038f44f4, 0x013a8d40, 0x01bf7017, 0x0026af25}}, Y: Field{[10]uint32{0x03adfe0c, 0x00663835, 0x03763617, 0x036d32ad, 0x0222a9fe, 0x0233b6b2, 0x027d2c9f, 0x03e28f50, 0x02ed3e71, 0x001b3ef3}}}, + {X: Field{[10]uint32{0x005d8d82, 0x02ee7b57, 0x035c5546, 0x03f03414, 0x03d7bd08, 0x0124f273, 0x034af06b, 0x0121cfb2, 0x009335c8, 0x00229f2a}}, Y: Field{[10]uint32{0x01e31bc1, 0x000064c8, 0x005ba07b, 0x03fb4bca, 0x01209ae3, 0x010511e6, 0x031ee4e5, 0x00f021cb, 0x0372090d, 0x0009462c}}}, + {X: Field{[10]uint32{0x024d1c3e, 0x032489e9, 0x03b79ff1, 0x0373091b, 0x02b39fdb, 0x018be352, 0x01182fd8, 0x018a365a, 0x03798649, 0x001c3238}}, Y: Field{[10]uint32{0x02ea3cbb, 0x0038c849, 0x0386f7f5, 0x005d3bf6, 0x03936c95, 0x03558823, 0x0297d9ef, 0x00292bb0, 0x02d527ec, 0x0031e4c6}}}, + {X: Field{[10]uint32{0x01002121, 0x00b58a0c, 0x0076b957, 0x039f0616, 0x00934a82, 0x012023f7, 0x01dcf61b, 0x007b81c7, 0x02b40612, 0x0035e0fd}}, Y: Field{[10]uint32{0x029c7fbb, 0x007662d7, 0x0262ca03, 0x0055a52e, 0x0028b3ed, 0x02699226, 0x0107c82b, 0x01a52678, 0x01841422, 0x002aa4af}}}, + {X: Field{[10]uint32{0x03654c18, 0x01f939de, 0x007581a1, 0x025671de, 0x02b75927, 0x03aa3931, 0x01ffbb87, 0x02d0eb2b, 0x021c29ab, 0x00307c1a}}, Y: Field{[10]uint32{0x03ecdbf0, 0x006497be, 0x005476cd, 0x01c2a906, 0x03bc1024, 0x03968263, 0x01b0e7d9, 0x010b3eae, 0x01e2f1db, 0x00076b83}}}, + {X: Field{[10]uint32{0x02cc5105, 0x01f98b94, 0x0072487b, 0x009d21a6, 0x02d1498a, 0x0085c998, 0x02633ea3, 0x02d61e19, 0x02113205, 0x000ab5d3}}, Y: Field{[10]uint32{0x00ff779e, 0x01176834, 0x02e105de, 0x01652e2f, 0x02b5c851, 0x01d5720e, 0x01aa7d30, 0x0287f589, 0x0107de1f, 0x0031c31d}}}, + {X: Field{[10]uint32{0x037408b6, 0x00025e35, 0x01ac03d8, 0x015dd2b2, 0x03a9e32b, 0x01c713d5, 0x0374e233, 0x01a919ba, 0x01ad7224, 0x003d243a}}, Y: Field{[10]uint32{0x01dc3d6a, 0x003c06aa, 0x01fb963a, 0x006a2d12, 0x0377e49a, 0x03096141, 0x02ef15e4, 0x005a1ee9, 0x027f8fdd, 0x00151bcd}}}, + {X: Field{[10]uint32{0x001d6149, 0x008cdce6, 0x030553f1, 0x03143781, 0x0280c431, 0x017e2ecc, 0x01788b05, 0x02da5f81, 0x00918357, 0x0008140a}}, Y: Field{[10]uint32{0x028e3b0d, 0x01aaf411, 0x02777796, 0x016d71de, 0x019489ee, 0x0214bf42, 0x01a67712, 0x00388963, 0x00e54411, 0x000e7410}}}, + {X: Field{[10]uint32{0x006eae95, 0x0007acbe, 0x005d1bb0, 0x026780e3, 0x02e4b782, 0x0137a4a5, 0x0359915d, 0x028e8fbb, 0x038ec169, 0x001ba46e}}, Y: Field{[10]uint32{0x00877dfd, 0x0252e8a0, 0x008872ae, 0x03574823, 0x0045305d, 0x0227eb12, 0x0034063a, 0x0327c459, 0x029788f8, 0x0034b084}}}, + {X: Field{[10]uint32{0x03a34905, 0x01e2ec5a, 0x02a01906, 0x02ea79f7, 0x0339e7d0, 0x00796b54, 0x00d0d2fe, 0x0102c184, 0x03c839fc, 0x0033ca51}}, Y: Field{[10]uint32{0x0337c63d, 0x00502c8f, 0x007baaec, 0x01a84c7b, 0x018db00f, 0x01cba1d7, 0x0358d7b1, 0x0354fc35, 0x030f7f0c, 0x00185169}}}, + {X: Field{[10]uint32{0x022366f1, 0x01861d3e, 0x02864ad1, 0x0306b0f1, 0x001c8db1, 0x02b4ca8a, 0x01c9b010, 0x029b2158, 0x0387ea93, 0x002d23e0}}, Y: Field{[10]uint32{0x022d253c, 0x00c5749e, 0x0276b375, 0x02077e10, 0x009f46bd, 0x018273f2, 0x03d971b3, 0x01f4f89b, 0x0333cbe0, 0x0000b2ac}}}, + {X: Field{[10]uint32{0x02a1f827, 0x007b6850, 0x0315ef39, 0x013a0515, 0x0030f605, 0x025bf50f, 0x00ae58c6, 0x00b4d393, 0x03660c57, 0x001f12d7}}, Y: Field{[10]uint32{0x01843d97, 0x034cab66, 0x033b008e, 0x02b57e53, 0x02d0adc2, 0x01848cb0, 0x007c5fcc, 0x016bc0e4, 0x024fbe12, 0x000f2f89}}}, + {X: Field{[10]uint32{0x010d86e8, 0x02a17821, 0x02567378, 0x0147d756, 0x018fe24e, 0x01e1d636, 0x027f9890, 0x02786588, 0x0368d464, 0x00395e58}}, Y: Field{[10]uint32{0x02c9d4a7, 0x030d53bd, 0x0089646e, 0x02e35982, 0x021fa111, 0x01e9f92f, 0x02880bf6, 0x0244a26b, 0x0343c9a6, 0x0001d2ec}}}, + {X: Field{[10]uint32{0x004d637f, 0x00ae963f, 0x016509f0, 0x00994f1f, 0x0167c1ab, 0x038f2976, 0x01b88416, 0x03a7bf06, 0x025efe83, 0x0037e841}}, Y: Field{[10]uint32{0x00a5042d, 0x020fbb43, 0x00a231ec, 0x00668aa8, 0x02e23fdf, 0x021794d4, 0x0270e046, 0x00dee8bc, 0x0167eb02, 0x00008b49}}}, + {X: Field{[10]uint32{0x028af132, 0x01ecdea4, 0x01f2f234, 0x01133c4c, 0x008f4638, 0x039c42e0, 0x01a3ce98, 0x030cca3f, 0x00aad436, 0x000ba876}}, Y: Field{[10]uint32{0x0298dc4c, 0x0187cc43, 0x004328fc, 0x0081e80d, 0x0213ff96, 0x033ca92c, 0x00a243cc, 0x02b44160, 0x020fb8c2, 0x000cfe9f}}}, + {X: Field{[10]uint32{0x0167253f, 0x01477975, 0x031b4c0a, 0x01b3e2a4, 0x03ab6a97, 0x039677cd, 0x008298b5, 0x02bcfe9e, 0x00518122, 0x0004ab85}}, Y: Field{[10]uint32{0x0124877d, 0x034c6807, 0x015a7926, 0x02bad555, 0x021c3ff9, 0x038fc296, 0x02fa7329, 0x0074bb78, 0x01d2b327, 0x00217fc7}}}, + {X: Field{[10]uint32{0x01bf6619, 0x01164c25, 0x00270856, 0x03bd57be, 0x03125579, 0x03b1d68e, 0x02b84fed, 0x02bc6a9c, 0x01efb588, 0x003f51b8}}, Y: Field{[10]uint32{0x03a51b17, 0x01f2dec9, 0x01ea40f5, 0x01eba071, 0x03342e6b, 0x01ce8abf, 0x007d477c, 0x00a4bd83, 0x006eceb6, 0x00341ab7}}}, + {X: Field{[10]uint32{0x0332b52b, 0x024342df, 0x01e614a2, 0x011ac5cb, 0x01c7a179, 0x02f88ab3, 0x009e1bf0, 0x0347bc71, 0x013eb8c0, 0x0003b5f6}}, Y: Field{[10]uint32{0x02303ada, 0x0233a7ec, 0x02246f36, 0x02129a33, 0x02b55522, 0x010aafac, 0x036668a7, 0x0070ebe3, 0x030a39a8, 0x001343b0}}}, + {X: Field{[10]uint32{0x029619ef, 0x0022db43, 0x034dc9d8, 0x004cd893, 0x01585179, 0x01d701b7, 0x02bda814, 0x01e69a7f, 0x03a5cd0e, 0x003f33f7}}, Y: Field{[10]uint32{0x010adf49, 0x009106b7, 0x015139bd, 0x012b5838, 0x02ec6232, 0x024aa58d, 0x01959c69, 0x026fb7e2, 0x000d11d0, 0x001e6e41}}}, + {X: Field{[10]uint32{0x034ac477, 0x02955912, 0x00010a57, 0x029c8ad1, 0x0316823e, 0x02f1c532, 0x02044b27, 0x026bfb4a, 0x02b86a9b, 0x0020c5d8}}, Y: Field{[10]uint32{0x0156c708, 0x005a7926, 0x02ff69c3, 0x0372989a, 0x032754c1, 0x02137f5d, 0x00b3f77f, 0x02ff72d2, 0x00628ef3, 0x00051eb8}}}, + {X: Field{[10]uint32{0x02f26b01, 0x00ee6753, 0x02fb3490, 0x0187c995, 0x01f92cc4, 0x03f8333e, 0x0370adbb, 0x014c0f23, 0x0001a84d, 0x000cd123}}, Y: Field{[10]uint32{0x03b8f2ff, 0x03a9507f, 0x0095f736, 0x00f1bf5f, 0x02208ad0, 0x03b9fe41, 0x00a82840, 0x02e98723, 0x03490ae8, 0x00395c9c}}}, + {X: Field{[10]uint32{0x03d215a6, 0x01533081, 0x024a2482, 0x036ac66c, 0x0160df85, 0x003aebdb, 0x03ccb8c5, 0x004c1055, 0x02616ddf, 0x00248284}}, Y: Field{[10]uint32{0x028d0f4e, 0x028f283c, 0x02e369f1, 0x00738313, 0x03e2cb67, 0x02a302e5, 0x02f7a11c, 0x03a240f4, 0x00f9cc91, 0x00067935}}}, + {X: Field{[10]uint32{0x036b1ba4, 0x03f98b94, 0x026b7fca, 0x029712e4, 0x01458385, 0x02eb0971, 0x020ac00c, 0x002e70fd, 0x021d3e37, 0x00077e33}}, Y: Field{[10]uint32{0x0099a92b, 0x039f9814, 0x01083533, 0x03d6f1c0, 0x023fcbab, 0x01ca4253, 0x02f61602, 0x0141e54a, 0x006ee363, 0x000d137d}}}, + {X: Field{[10]uint32{0x038b7b72, 0x02ca2074, 0x013b6286, 0x03236036, 0x022e2243, 0x00de8149, 0x0018175c, 0x009ae04f, 0x007dabfe, 0x001c89e1}}, Y: Field{[10]uint32{0x03973d24, 0x02622e29, 0x03364622, 0x0104311a, 0x0128b5aa, 0x0185973e, 0x0289c934, 0x00f37654, 0x01eb33da, 0x002fb79e}}}, + {X: Field{[10]uint32{0x03f7fb8d, 0x027ca4bb, 0x01995972, 0x013c9b63, 0x003caff7, 0x03321041, 0x02571f8c, 0x022feac0, 0x0259e121, 0x001b7bee}}, Y: Field{[10]uint32{0x00340a04, 0x025aa353, 0x001a6956, 0x00156487, 0x002c188c, 0x034d39df, 0x03770d1b, 0x03ef165b, 0x028e21f2, 0x00135eea}}}, + {X: Field{[10]uint32{0x002d6bd3, 0x00581478, 0x020f990b, 0x006ad8c6, 0x0208302e, 0x02b7d4ef, 0x031ae022, 0x01f491ac, 0x00eff512, 0x003199fd}}, Y: Field{[10]uint32{0x02d34cf5, 0x00312936, 0x032373e8, 0x00f549eb, 0x02f8de28, 0x01f5d1a8, 0x00d822c3, 0x02f7dbf5, 0x0276ce11, 0x000f5ef3}}}, + {X: Field{[10]uint32{0x0229d866, 0x00b1cbf3, 0x03d2355c, 0x02e39aec, 0x006fbca1, 0x00e8aac0, 0x00dcc242, 0x0083d664, 0x02744416, 0x003b67a1}}, Y: Field{[10]uint32{0x0006ad30, 0x01f08a96, 0x021a5829, 0x01c47b0d, 0x027c03dd, 0x0024c37b, 0x01a12f33, 0x0268aee0, 0x019bb428, 0x0019357b}}}, + {X: Field{[10]uint32{0x0176fb24, 0x03ae630c, 0x02ea0b0e, 0x03bab114, 0x03219e57, 0x018d13bc, 0x0000b256, 0x033b80cf, 0x0057e6b0, 0x0021a8db}}, Y: Field{[10]uint32{0x02fff739, 0x03a36cfa, 0x02f25135, 0x00f9e686, 0x01b147b4, 0x02564ad7, 0x01038748, 0x01637d38, 0x01da9e9b, 0x002d3d2f}}}, + {X: Field{[10]uint32{0x00cca913, 0x0248a02f, 0x00e04337, 0x0208779c, 0x01fd02bf, 0x0285478f, 0x02105acb, 0x01bfce83, 0x03844539, 0x000b88dd}}, Y: Field{[10]uint32{0x03148551, 0x01c5b0d9, 0x0304fc0b, 0x03728cd8, 0x00f43726, 0x02ef3241, 0x00464c43, 0x020fc184, 0x039ce779, 0x003dcd94}}}, + {X: Field{[10]uint32{0x00a1390f, 0x027e6008, 0x028c1689, 0x021eb0b5, 0x009db88a, 0x00682f00, 0x026dbcf1, 0x0364d948, 0x014c7790, 0x003334f0}}, Y: Field{[10]uint32{0x003af907, 0x037f75c7, 0x00a6781c, 0x02a01f7c, 0x00f8a9cb, 0x006264c8, 0x03bac2af, 0x017767cc, 0x035fbd6d, 0x002c902c}}}, + {X: Field{[10]uint32{0x0237b018, 0x033361cd, 0x021b217b, 0x02b6e09d, 0x01eba4ef, 0x015625e3, 0x006566d0, 0x035ec71b, 0x027f0988, 0x001dc4ef}}, Y: Field{[10]uint32{0x00475781, 0x02cd309d, 0x03d9470d, 0x039993b9, 0x01c75f31, 0x017eacd0, 0x02ef7c51, 0x00aea8bb, 0x026fa9d6, 0x0023ee46}}}, + {X: Field{[10]uint32{0x00982b02, 0x0199eea9, 0x0398b1ab, 0x03fc7165, 0x0134c739, 0x02c21573, 0x020acf56, 0x032cee54, 0x0160035d, 0x0015216b}}, Y: Field{[10]uint32{0x02a90f0f, 0x00e658a5, 0x03f9fcd4, 0x01579f72, 0x0357cbd4, 0x0224c46f, 0x03df62e5, 0x005329d0, 0x007b1e7c, 0x00077b1b}}}, + {X: Field{[10]uint32{0x00ee0f19, 0x0268f72c, 0x01ed189c, 0x0007cac1, 0x00411bd2, 0x013a1503, 0x012d1cfc, 0x01213407, 0x003ad3be, 0x002965d4}}, Y: Field{[10]uint32{0x001113cd, 0x0157b8ec, 0x014dce28, 0x03c1d972, 0x00becbd6, 0x036f3d24, 0x02cee664, 0x00466478, 0x027d3800, 0x000d444f}}}, + {X: Field{[10]uint32{0x0191ce4a, 0x03795f37, 0x0046cb94, 0x00de0320, 0x011ae249, 0x02f4bf64, 0x01d07a3d, 0x00c2c55f, 0x0251abb1, 0x002ea46c}}, Y: Field{[10]uint32{0x013e1f6c, 0x030d64c3, 0x01dcfe1d, 0x003f85e6, 0x03837742, 0x03d90bee, 0x01f33f54, 0x03b7ee9a, 0x0080500a, 0x0033f308}}}, + {X: Field{[10]uint32{0x02d324a4, 0x0116ffe1, 0x032e2fb0, 0x012980fe, 0x005c6d2f, 0x01721905, 0x03d33869, 0x01ef4f1b, 0x025883cc, 0x002b7ed6}}, Y: Field{[10]uint32{0x030cdc5c, 0x01554fde, 0x0172222a, 0x014f325d, 0x013a5257, 0x030c36a4, 0x00415a18, 0x00b7f714, 0x02d745d8, 0x000595d3}}}, + {X: Field{[10]uint32{0x03561ae8, 0x013b73e8, 0x023e29d9, 0x029383ee, 0x01ba1f13, 0x00292f8d, 0x0054b141, 0x002972b2, 0x014ddd71, 0x00042124}}, Y: Field{[10]uint32{0x01c25e99, 0x0373e152, 0x003babe6, 0x028d6423, 0x002f2b74, 0x037e3999, 0x02ac6cda, 0x03bd8104, 0x01353240, 0x00194f28}}}, + {X: Field{[10]uint32{0x026c6f7b, 0x0337345b, 0x0033f133, 0x01abe01e, 0x0281876a, 0x02e207bf, 0x028abe50, 0x022c505e, 0x02719af3, 0x001c12a8}}, Y: Field{[10]uint32{0x03769e54, 0x013d9ba8, 0x03b9263f, 0x03d10ae9, 0x0111395a, 0x038a8690, 0x00726c9b, 0x00602f12, 0x02b348c1, 0x0029bfb8}}}, + {X: Field{[10]uint32{0x00aec289, 0x01ee0daa, 0x0108051d, 0x03a250b2, 0x03fe68b0, 0x024f19a0, 0x01f57348, 0x00aa1970, 0x00c17f5d, 0x00118123}}, Y: Field{[10]uint32{0x03288efd, 0x00681e62, 0x03277a46, 0x00d0e106, 0x032e7668, 0x02d3e28c, 0x01bf9c6b, 0x03ddf41d, 0x003089a8, 0x0036173b}}}, + {X: Field{[10]uint32{0x03fce9e9, 0x011d95dd, 0x03c763d5, 0x033d6e87, 0x0107d04c, 0x016634be, 0x02781ba8, 0x00ec858d, 0x02be315d, 0x00143c79}}, Y: Field{[10]uint32{0x026b0b00, 0x017ec3bb, 0x00db7d09, 0x03851f80, 0x0325dd0c, 0x03725887, 0x00249759, 0x02e7ca33, 0x03d62057, 0x003df72d}}}, + {X: Field{[10]uint32{0x0263501c, 0x03ff3402, 0x006d03b7, 0x03cc16f5, 0x02944df1, 0x01d23527, 0x00efa037, 0x0156b404, 0x02446766, 0x001fb428}}, Y: Field{[10]uint32{0x01c18c21, 0x00343c01, 0x028d8269, 0x0196981d, 0x01e9b3ae, 0x00dab91d, 0x02eb2669, 0x0089ed11, 0x0265593f, 0x002a0dde}}}, + {X: Field{[10]uint32{0x03ebccc7, 0x03d18c93, 0x03342c29, 0x00eec7cd, 0x0219b29d, 0x03fc6f4b, 0x01c431dc, 0x030b3d84, 0x00a1ee66, 0x000340e7}}, Y: Field{[10]uint32{0x016d736f, 0x00c4139a, 0x0076e781, 0x03845699, 0x006e652e, 0x033f7321, 0x01ff5e24, 0x0319858a, 0x018214f4, 0x0036c343}}}, + {X: Field{[10]uint32{0x03b092b7, 0x03b60429, 0x015797be, 0x0272ab58, 0x028e3672, 0x01335283, 0x031768d9, 0x03f8bd14, 0x033acc55, 0x000309e5}}, Y: Field{[10]uint32{0x01f41c99, 0x005e8500, 0x020db439, 0x03c7fdd4, 0x000878e1, 0x02e78cc5, 0x02d54029, 0x02c91b15, 0x00eab36a, 0x003370c4}}}, + {X: Field{[10]uint32{0x0046e945, 0x0030cf19, 0x01d846de, 0x02000e8b, 0x01ac14a1, 0x03880b45, 0x0072e48d, 0x031a0c95, 0x0142cce3, 0x000da10a}}, Y: Field{[10]uint32{0x03b8f2f7, 0x000ee581, 0x02bcb574, 0x03e8376b, 0x03208d95, 0x03b55826, 0x009db9ae, 0x020be8d6, 0x03f819ab, 0x0014002c}}}, + {X: Field{[10]uint32{0x0162d0e9, 0x01552b9b, 0x03d7b0c4, 0x03de1783, 0x0074865e, 0x016aed15, 0x03f3a8c5, 0x0086d467, 0x015c3386, 0x00346a86}}, Y: Field{[10]uint32{0x03b737a8, 0x019c9469, 0x03c88c2e, 0x01cea6a2, 0x00832ce7, 0x0221018c, 0x0234576d, 0x00e166d1, 0x0133dc29, 0x0039f877}}}, + {X: Field{[10]uint32{0x000f00f0, 0x03c99fd7, 0x008b0489, 0x00aa3340, 0x03a59b2c, 0x01d9bb04, 0x02bd6ff5, 0x00e7b0d9, 0x01326074, 0x0013d08f}}, Y: Field{[10]uint32{0x00e7a9f4, 0x0075e1e9, 0x034eef5e, 0x016012d3, 0x00b6c3e0, 0x01cb2223, 0x008e6aa2, 0x01305701, 0x029d7ee9, 0x00178f1f}}}, + {X: Field{[10]uint32{0x03f06c4a, 0x006ee641, 0x018c5910, 0x03eabdce, 0x00ebcb9a, 0x02d7ea6e, 0x000859a9, 0x0247bc5f, 0x0280ff89, 0x001aec71}}, Y: Field{[10]uint32{0x0269a253, 0x03fcf261, 0x0039f189, 0x03f54d6e, 0x03217005, 0x01d85717, 0x03c242c9, 0x00ab9745, 0x03750d91, 0x000c6369}}}, + {X: Field{[10]uint32{0x00096f68, 0x00b426b0, 0x03b8bd0f, 0x008cc0c0, 0x02bc3934, 0x03efb8b9, 0x00b251c9, 0x0291a97f, 0x01d44713, 0x00005025}}, Y: Field{[10]uint32{0x0204a2b1, 0x032caeb9, 0x0159322d, 0x03ec2dfd, 0x001c7aa4, 0x0219f1ff, 0x01e632f6, 0x02cdd256, 0x000b3660, 0x00191f80}}}, + {X: Field{[10]uint32{0x035e5323, 0x0184ec12, 0x03b838b2, 0x0068e3a7, 0x02894319, 0x03021e1d, 0x00f831f6, 0x0271b92a, 0x03f0346e, 0x0004844a}}, Y: Field{[10]uint32{0x0257a3d0, 0x010a61a5, 0x0210e30a, 0x0196273f, 0x01faf640, 0x03b936ae, 0x03abf62a, 0x00cf6530, 0x02c2cb45, 0x00390526}}}, + {X: Field{[10]uint32{0x03ca5738, 0x0170dc22, 0x0329b4f7, 0x029e1165, 0x014f2197, 0x02bad67f, 0x00974ebe, 0x01204360, 0x00ccc2ed, 0x003e64d8}}, Y: Field{[10]uint32{0x026f1cb3, 0x020ea4bb, 0x020dbc0c, 0x00524d40, 0x03a06e44, 0x03865c76, 0x001b9f86, 0x01ea2b0b, 0x035e86d7, 0x002e4a8b}}}, + {X: Field{[10]uint32{0x02809ca4, 0x013a01ba, 0x00567a65, 0x02712522, 0x0264ae77, 0x0394fd47, 0x032112bb, 0x00fb3121, 0x024ec81a, 0x000b7b96}}, Y: Field{[10]uint32{0x033d4954, 0x00786931, 0x033b1bcb, 0x018e4d3f, 0x02bdea4d, 0x03f3c983, 0x02a1bcff, 0x011f0702, 0x00a1df6d, 0x00078baa}}}, + {X: Field{[10]uint32{0x01461229, 0x020b1ec3, 0x006a5f23, 0x0346ef5d, 0x00b73688, 0x00371404, 0x01638f7b, 0x03ade3d2, 0x02a2139e, 0x00016ea9}}, Y: Field{[10]uint32{0x01dca81d, 0x00756549, 0x00693cc0, 0x02a58055, 0x03b08a0c, 0x03909427, 0x02a75cd9, 0x014bc67c, 0x038310a3, 0x001c99dc}}}, + {X: Field{[10]uint32{0x02913d70, 0x015a2ea0, 0x0183c8f8, 0x00b365ba, 0x02f60d10, 0x004c6791, 0x034a6f3b, 0x01135add, 0x02b9321d, 0x0028fddf}}, Y: Field{[10]uint32{0x00613a05, 0x033ae397, 0x00077d3f, 0x0195dd1c, 0x00f6db17, 0x01afb074, 0x02386302, 0x039c3c6a, 0x01df8271, 0x003e4f5d}}}, + {X: Field{[10]uint32{0x03f2cf08, 0x02421371, 0x017db72f, 0x019baefa, 0x008588d7, 0x022ba7ce, 0x00fd62d6, 0x0249d0de, 0x02b5fa1f, 0x0011ae99}}, Y: Field{[10]uint32{0x038897f9, 0x02d77648, 0x0385b72d, 0x038bb3c1, 0x01f44bf7, 0x00ab5415, 0x01f9b555, 0x02e37e4b, 0x02243078, 0x000151cf}}}, + {X: Field{[10]uint32{0x0280dbf2, 0x034873b3, 0x02af4291, 0x01732865, 0x000bccb1, 0x01547eb4, 0x03415b6f, 0x000982ca, 0x0246ddcf, 0x0036da80}}, Y: Field{[10]uint32{0x00591d3c, 0x01645fca, 0x01c7ea98, 0x01bf9d78, 0x025f8885, 0x00f34259, 0x02c6f6f6, 0x00725e95, 0x0046f93e, 0x000e5b35}}}, + {X: Field{[10]uint32{0x026c8fa1, 0x00720d1b, 0x02e8c5cc, 0x02e19a64, 0x0338187e, 0x036e86c2, 0x012c4e58, 0x026368e6, 0x011ca7a2, 0x002e0be3}}, Y: Field{[10]uint32{0x01483461, 0x02d80d80, 0x03ee028e, 0x02254cf8, 0x02b1b805, 0x02dd9f1a, 0x00fdbddd, 0x0104f235, 0x036af9b0, 0x0012c2b9}}}, + {X: Field{[10]uint32{0x0085f000, 0x003c0631, 0x014a182e, 0x035edffe, 0x01d106fd, 0x02984a18, 0x00c6348a, 0x0192bfa7, 0x02a4dc92, 0x00111ba5}}, Y: Field{[10]uint32{0x01568440, 0x00cf7c26, 0x02507c8e, 0x0032984a, 0x012771c4, 0x033d9def, 0x0223b7ec, 0x00e9607f, 0x03d92159, 0x000cb7f8}}}, + {X: Field{[10]uint32{0x003a2eb9, 0x02874e4c, 0x01fb81ad, 0x01b3616f, 0x025c8a3e, 0x01941277, 0x0300ca34, 0x01b732e7, 0x03107bfa, 0x0000321b}}, Y: Field{[10]uint32{0x0034219d, 0x02b92b9f, 0x03ed888b, 0x01f92aa9, 0x019dcb27, 0x00c8d1d3, 0x0218c6a7, 0x0020502b, 0x00667e91, 0x003993dc}}}, + {X: Field{[10]uint32{0x036cd710, 0x017d6eb6, 0x01cdb83e, 0x02acc0a9, 0x009201c2, 0x000af9ee, 0x00d94cc2, 0x010a6793, 0x036ecda1, 0x002fb63a}}, Y: Field{[10]uint32{0x01411aac, 0x01226957, 0x01256708, 0x00f08250, 0x0116a1f0, 0x01a49d1b, 0x0367b9f6, 0x02903174, 0x00fab375, 0x00055cdb}}}, + {X: Field{[10]uint32{0x0364d38f, 0x0249b823, 0x02881da1, 0x014b7a0a, 0x00665e0a, 0x035d6520, 0x03171b5a, 0x02b44107, 0x03f2c5f6, 0x002cfbe9}}, Y: Field{[10]uint32{0x031677e6, 0x017eb23f, 0x013ffc53, 0x01840fed, 0x00b6dbd3, 0x03a6380d, 0x02b0dfaa, 0x00689003, 0x00843276, 0x000f7d8f}}}, + {X: Field{[10]uint32{0x0315cbd2, 0x03149749, 0x02921ebd, 0x0305947b, 0x018fa9af, 0x027850f8, 0x01213a84, 0x026d7c8d, 0x01a0cd86, 0x002c1183}}, Y: Field{[10]uint32{0x006fd7ee, 0x02ec486e, 0x00eee865, 0x017b3d8c, 0x0146b472, 0x02d5eca6, 0x033b4c02, 0x0061df39, 0x02adf354, 0x0030468f}}}, + {X: Field{[10]uint32{0x033bc071, 0x03b0f3b5, 0x0152a49c, 0x014e9f43, 0x00b49692, 0x00b58035, 0x00191871, 0x014afacb, 0x0117a174, 0x000a2c25}}, Y: Field{[10]uint32{0x0120a326, 0x01e90f7a, 0x01ae7fce, 0x0341a437, 0x0040ffd6, 0x0102bd65, 0x01635180, 0x01d64444, 0x0308073c, 0x000d9a59}}}, + {X: Field{[10]uint32{0x03b5f136, 0x02946c3e, 0x037536b1, 0x03f11c55, 0x020ad86a, 0x002fc5fe, 0x02e76b7c, 0x032d601e, 0x00d8192a, 0x001486fb}}, Y: Field{[10]uint32{0x01ac858d, 0x01ffa0dd, 0x026691dc, 0x003bb7cc, 0x02ee0671, 0x015145a0, 0x00f399e1, 0x03c4fb33, 0x00c6d7af, 0x00192295}}}, + {X: Field{[10]uint32{0x01f6cf67, 0x02dd87de, 0x01082368, 0x029ddb4e, 0x02a2a200, 0x0161f613, 0x009bca1b, 0x0275949b, 0x01d0b7fd, 0x002def06}}, Y: Field{[10]uint32{0x0370acae, 0x025ba347, 0x023ad2f7, 0x03fbfeff, 0x024a1e9f, 0x01cc58ed, 0x012c29a7, 0x03233d09, 0x02bee0d0, 0x0016b7be}}}, + {X: Field{[10]uint32{0x017aea8b, 0x00c7c34e, 0x03114dc9, 0x01b704f9, 0x0066db7b, 0x0055633b, 0x030c2412, 0x02a35507, 0x03e51b6c, 0x0039238e}}, Y: Field{[10]uint32{0x020f28ac, 0x01079f83, 0x004314bf, 0x00fbe7dd, 0x01f6cb3a, 0x03c4ad19, 0x03064bff, 0x038bc4c3, 0x03575b16, 0x0036f3d8}}}, + {X: Field{[10]uint32{0x03455751, 0x03d0a427, 0x028909b2, 0x02d65d67, 0x014ec795, 0x038a3ca9, 0x02475968, 0x024a9a8c, 0x02de71c6, 0x0000e571}}, Y: Field{[10]uint32{0x0269a13d, 0x030b2169, 0x003c3fcf, 0x0391266f, 0x03b5b097, 0x02b28557, 0x02ed4e15, 0x03768b07, 0x011803c7, 0x003b9780}}}, + {X: Field{[10]uint32{0x02808d99, 0x01814af2, 0x009a81a6, 0x02aa293a, 0x02663da3, 0x0303fb0d, 0x03412919, 0x010e6489, 0x02c3b118, 0x000a24e2}}, Y: Field{[10]uint32{0x03174603, 0x002e6193, 0x025f8031, 0x0256e87a, 0x00da1682, 0x0032e684, 0x03eadb18, 0x0306fa8a, 0x027ab1eb, 0x0012ba37}}}, + {X: Field{[10]uint32{0x0248f5a4, 0x00fb9ad4, 0x036f5852, 0x013f428d, 0x03be3af6, 0x0389fa14, 0x01472f23, 0x0233d881, 0x021895e8, 0x0001703d}}, Y: Field{[10]uint32{0x004be51b, 0x02c70f79, 0x02624b41, 0x0360d107, 0x038473e3, 0x03f6d43e, 0x03634569, 0x03aecedc, 0x0055cd09, 0x002f970f}}}, + {X: Field{[10]uint32{0x023ca1d7, 0x01536b17, 0x02ec0015, 0x004c7ae8, 0x02ae2e8f, 0x01fb416e, 0x028e125f, 0x03dccfb4, 0x03bf22d0, 0x002af87d}}, Y: Field{[10]uint32{0x02b0ab4e, 0x02a8b106, 0x02ffc918, 0x02d656ba, 0x03e553e6, 0x0265b2cc, 0x008ffe4b, 0x007daa5c, 0x00db3de3, 0x000a9692}}}, + {X: Field{[10]uint32{0x008d8be7, 0x03f4a738, 0x02349bcc, 0x03b110a9, 0x015f1dbe, 0x0298244a, 0x0124907e, 0x01c2cde4, 0x002757d3, 0x0030c109}}, Y: Field{[10]uint32{0x01868934, 0x01d73a6c, 0x031448bb, 0x0304a7a3, 0x01528959, 0x02326047, 0x01b35e2f, 0x0369d54d, 0x02b33e0f, 0x0019e993}}}, + {X: Field{[10]uint32{0x0140f5b8, 0x014cbf8c, 0x01c21c81, 0x0119abd0, 0x03031527, 0x038690fd, 0x02f0b6a9, 0x008675de, 0x0146356f, 0x00196966}}, Y: Field{[10]uint32{0x00f35918, 0x00e9871d, 0x0241f246, 0x0164f611, 0x001692b0, 0x001c3688, 0x00cf27fc, 0x013e8146, 0x028d5d3e, 0x001939c4}}}, + {X: Field{[10]uint32{0x001413e2, 0x03ad4fc5, 0x0219ede2, 0x02df536b, 0x0060311c, 0x02e67684, 0x03066f2b, 0x02321d1a, 0x023b4842, 0x001b1f4b}}, Y: Field{[10]uint32{0x00b7e3a1, 0x0192f2db, 0x007ab2a6, 0x03f8a3df, 0x03286292, 0x03b5ece0, 0x022864d1, 0x0319c137, 0x03bfc2e7, 0x00012e91}}}, + {X: Field{[10]uint32{0x03fdcdd9, 0x033d63a4, 0x019cf44a, 0x01fe914e, 0x03565579, 0x0324ffd5, 0x03798a9b, 0x02270ad1, 0x03bdb99c, 0x00037495}}, Y: Field{[10]uint32{0x01b3e4af, 0x00ab8db0, 0x020cc1af, 0x02058e43, 0x03e8194f, 0x010a2440, 0x027e0d71, 0x01fc954b, 0x00f2a920, 0x003e359c}}}, + {X: Field{[10]uint32{0x00c23d7b, 0x02ad79bb, 0x0263eb2a, 0x01f2c23c, 0x026827b8, 0x03351f18, 0x0152b8fa, 0x0310910a, 0x034eb8dd, 0x00094580}}, Y: Field{[10]uint32{0x0216ac9e, 0x031d6858, 0x02826433, 0x00d12d21, 0x00bd2ab5, 0x01cc774c, 0x03545bca, 0x03a81eb4, 0x0079f5fe, 0x002b63a2}}}, + {X: Field{[10]uint32{0x0134246d, 0x037382b6, 0x0180b907, 0x00559646, 0x017f0752, 0x00847b70, 0x01834b38, 0x02478ec6, 0x005427b5, 0x001f9c8c}}, Y: Field{[10]uint32{0x0263a71f, 0x020051d3, 0x034e33b0, 0x03a38c91, 0x032506be, 0x00261d82, 0x01671df1, 0x02129bc8, 0x00bbd8c1, 0x0017247f}}}, + {X: Field{[10]uint32{0x01d1898b, 0x0174e65b, 0x0333e72b, 0x01ffbe77, 0x038d4fb5, 0x0169bdae, 0x03876914, 0x0034a812, 0x0116ac3c, 0x0006c7e7}}, Y: Field{[10]uint32{0x035b4b1b, 0x034299fc, 0x01bd1024, 0x014e5146, 0x0215e944, 0x01890696, 0x00a399e1, 0x039142c5, 0x031e05ff, 0x001910af}}}, + {X: Field{[10]uint32{0x00872f2b, 0x001b18ff, 0x01a23e90, 0x01364f14, 0x0265b514, 0x02598c71, 0x039f6715, 0x03a90e8e, 0x024e57cd, 0x00383c7e}}, Y: Field{[10]uint32{0x0332e564, 0x02705dab, 0x018640a4, 0x037b349f, 0x0374f9a3, 0x00547751, 0x02056170, 0x003450bd, 0x01fb5489, 0x00320e14}}}, + {X: Field{[10]uint32{0x02728c3a, 0x0284bacc, 0x03d0b3e9, 0x009e675e, 0x0040efa0, 0x00a8281e, 0x01a3667b, 0x02082894, 0x03bb697c, 0x0002ba56}}, Y: Field{[10]uint32{0x03aebb41, 0x016c521a, 0x03f10e68, 0x0371ee00, 0x011140e0, 0x016b9427, 0x02a4da94, 0x0025b61b, 0x02970280, 0x003836ee}}}, + {X: Field{[10]uint32{0x002aed31, 0x00d01d9a, 0x01b3069e, 0x02b9b9fc, 0x030afad1, 0x014ffe30, 0x02529ea8, 0x03d0b07f, 0x0085d52e, 0x003f23fe}}, Y: Field{[10]uint32{0x01e3dd14, 0x0382992c, 0x00850433, 0x01c50cab, 0x0209cced, 0x00d5b406, 0x0104f1b3, 0x023d89ee, 0x02d4b26e, 0x001497b3}}}, + {X: Field{[10]uint32{0x02c8e810, 0x0272accc, 0x02546c62, 0x00f04d94, 0x00ed68d6, 0x02a59683, 0x01b57533, 0x01896835, 0x036a459d, 0x001984c4}}, Y: Field{[10]uint32{0x015b65cb, 0x02614ed9, 0x0069b93a, 0x00050049, 0x0228b4cb, 0x02c5a2f4, 0x01732b43, 0x002a52cf, 0x03f824d3, 0x00043ca7}}}, + {X: Field{[10]uint32{0x01ea56f0, 0x03d68df7, 0x01b91f24, 0x0107daf8, 0x0319dda8, 0x01bbced8, 0x02309b39, 0x00cc9f1d, 0x01157b68, 0x00114216}}, Y: Field{[10]uint32{0x01956821, 0x01d953e4, 0x02a12bbc, 0x02fed2c6, 0x032b6ebb, 0x0023569a, 0x0155e34f, 0x022391a8, 0x0046584a, 0x002e69c5}}}, + {X: Field{[10]uint32{0x008a4325, 0x00bcfddf, 0x0064f0e3, 0x013089d1, 0x01be58af, 0x035785c4, 0x0382576c, 0x02e8377a, 0x03bd8f10, 0x0005a3b8}}, Y: Field{[10]uint32{0x0278b34c, 0x01d08099, 0x0388668b, 0x02116082, 0x00465fb1, 0x020be1c0, 0x016891c9, 0x01027ea4, 0x026343ff, 0x001bbbc7}}}, + {X: Field{[10]uint32{0x03048c04, 0x0009c53b, 0x0131b718, 0x013181de, 0x00fdd86b, 0x02c800f9, 0x034db8de, 0x008d053a, 0x0197763c, 0x002cc647}}, Y: Field{[10]uint32{0x02152edd, 0x016a0f30, 0x00a04f88, 0x0358ddc4, 0x03ce6860, 0x03af7570, 0x03d53d83, 0x01d72af9, 0x008559f9, 0x002d2b0c}}}, + {X: Field{[10]uint32{0x022f8738, 0x0280898e, 0x0096a51e, 0x03f3c804, 0x033ec477, 0x03a4fd2e, 0x032acca1, 0x03724cf1, 0x005b4e73, 0x0036a757}}, Y: Field{[10]uint32{0x0012f8aa, 0x02cc826a, 0x015b50b4, 0x03422c28, 0x01400c05, 0x018d9944, 0x01b93b0d, 0x019b0da2, 0x02da65f9, 0x001feda8}}}, + {X: Field{[10]uint32{0x00b0dd66, 0x0196f339, 0x0215c01e, 0x02825538, 0x008d1cfa, 0x0314991c, 0x011730f0, 0x0159e05e, 0x01d2a7e7, 0x00050395}}, Y: Field{[10]uint32{0x0153d5b3, 0x00165042, 0x0118bce8, 0x0397225e, 0x0087e2d5, 0x03bcd8c6, 0x02470d81, 0x00965e47, 0x00d863ea, 0x0012fee8}}}, + {X: Field{[10]uint32{0x02b173d8, 0x00e67ac5, 0x00a1cf3f, 0x03e198d1, 0x03b438f7, 0x03f8f62f, 0x029bd01b, 0x03321f3b, 0x00f64b95, 0x00056a73}}, Y: Field{[10]uint32{0x03b33f3b, 0x018f2366, 0x03f90e03, 0x0269b946, 0x035d0ba5, 0x002cc6a4, 0x01e51fbf, 0x03b49581, 0x02cdbdeb, 0x0013d51c}}}, + {X: Field{[10]uint32{0x00af6e06, 0x032a8f62, 0x0088f814, 0x0244b42a, 0x00c7ed5e, 0x02b4606f, 0x033d3d8f, 0x01c076de, 0x024b6776, 0x003a1b8d}}, Y: Field{[10]uint32{0x01ea7b92, 0x0130d5d3, 0x00915f83, 0x03452989, 0x0124a466, 0x018a1a62, 0x0195518c, 0x001034fa, 0x00600afc, 0x00008bf5}}}, + {X: Field{[10]uint32{0x02500eb6, 0x020beb96, 0x03ddbfc2, 0x00ea9b56, 0x03b1f81d, 0x008faf39, 0x021134c7, 0x03c36c8c, 0x0298cd25, 0x000f0986}}, Y: Field{[10]uint32{0x03abd9c1, 0x00d7f15d, 0x02cbc455, 0x001b7abb, 0x004027a5, 0x0325a99b, 0x00b6ed7e, 0x02084629, 0x01455e49, 0x000ae348}}}, + {X: Field{[10]uint32{0x00c955c8, 0x0151bb7d, 0x0300bd66, 0x017408e0, 0x00368c3b, 0x01deab3f, 0x03b1f6c1, 0x02d45db2, 0x00114d55, 0x00126daa}}, Y: Field{[10]uint32{0x03815b94, 0x00d60e28, 0x01bca5b5, 0x0044e475, 0x020ab944, 0x03c6c2ca, 0x038e0017, 0x039f041a, 0x00a409f0, 0x00346c49}}}, + {X: Field{[10]uint32{0x0125f6b9, 0x02a36b31, 0x03f71f34, 0x007fde90, 0x016cee80, 0x003312e0, 0x01deab62, 0x039694fe, 0x0061f0d3, 0x001bb23a}}, Y: Field{[10]uint32{0x02dcfd6a, 0x00006ae9, 0x02e27782, 0x01c718fe, 0x011e01a8, 0x02dad7ac, 0x009c4f7e, 0x02bef4cc, 0x005b68cc, 0x0010b815}}}, + {X: Field{[10]uint32{0x0195b9ac, 0x02262a91, 0x03e1ac08, 0x015d1903, 0x004b527e, 0x023c5369, 0x005a2e2a, 0x02973f4c, 0x034159ac, 0x001cd0ac}}, Y: Field{[10]uint32{0x03160124, 0x01748d14, 0x01ac121b, 0x0102b21b, 0x0127f64f, 0x03a984a0, 0x03969a84, 0x00bb88d8, 0x0302d244, 0x002d4984}}}, + {X: Field{[10]uint32{0x02686fa9, 0x034c2e56, 0x0054b687, 0x015e9827, 0x00b27477, 0x03c9a59f, 0x01cfc43d, 0x00d42d97, 0x00bd54ef, 0x00210acc}}, Y: Field{[10]uint32{0x0336ead6, 0x016b20fc, 0x0277b9cc, 0x01f1c79f, 0x037d594f, 0x01723795, 0x0331f63f, 0x00dae7b3, 0x02922caa, 0x0013fea7}}}, + {X: Field{[10]uint32{0x01f94862, 0x02381306, 0x02153999, 0x0028fa46, 0x037c13bb, 0x0255d5fb, 0x03fb60d4, 0x029f1ef0, 0x035dd589, 0x000b6e90}}, Y: Field{[10]uint32{0x028cc0a1, 0x03522257, 0x013ed55c, 0x0171f7e1, 0x00931d3e, 0x01dd7940, 0x038eca16, 0x00f2e748, 0x020ea4b2, 0x0031101c}}}, + {X: Field{[10]uint32{0x033bec02, 0x034f1171, 0x01c07998, 0x02f4f40d, 0x02bb284f, 0x0064e42f, 0x035a4578, 0x03396ca9, 0x01248f84, 0x002747a1}}, Y: Field{[10]uint32{0x00eb9ead, 0x0201d325, 0x03f40129, 0x033e126f, 0x036d62e8, 0x02a018fc, 0x038bbc84, 0x0332b08c, 0x024cc935, 0x0023903b}}}, + {X: Field{[10]uint32{0x00b441af, 0x0158b4b6, 0x01cf4e76, 0x008d8b89, 0x019a7f86, 0x005525d5, 0x03639121, 0x029d6f53, 0x02c5d1fb, 0x00349cd6}}, Y: Field{[10]uint32{0x01afc081, 0x023ecd9f, 0x0331da1d, 0x01b4727e, 0x01b4ade8, 0x02d4bcf9, 0x037cb0e5, 0x03cce5de, 0x003619f9, 0x0002f4ab}}}, + {X: Field{[10]uint32{0x00a3e11a, 0x00eb7fac, 0x017cdca6, 0x025b82a5, 0x01b27c2b, 0x015ca4e5, 0x01a68d31, 0x03fc4eb4, 0x0238f46c, 0x002c04c3}}, Y: Field{[10]uint32{0x006aa3c4, 0x01666803, 0x001b5535, 0x00590d9b, 0x02610f15, 0x02c45dda, 0x02ff8443, 0x0100721f, 0x017f4a61, 0x000f67da}}}, + {X: Field{[10]uint32{0x01ec76a7, 0x00b99a0d, 0x02caaed8, 0x01e0a650, 0x03f59faa, 0x02e277a2, 0x022d8f33, 0x01abe2d9, 0x022f1530, 0x00382a81}}, Y: Field{[10]uint32{0x015e6f2e, 0x01115fb0, 0x0218179a, 0x015097f1, 0x0334305b, 0x02b260e1, 0x01ffb8ac, 0x01cc1297, 0x00b56ea7, 0x00317d7c}}}, + {X: Field{[10]uint32{0x019432d5, 0x012f42c0, 0x004139f4, 0x021665eb, 0x002156d6, 0x03a61d7b, 0x03e15c4a, 0x03472461, 0x02c1a8e6, 0x003b4589}}, Y: Field{[10]uint32{0x01f0c35d, 0x01410a5c, 0x00d7e69d, 0x011b164e, 0x037f0fad, 0x039cdcfd, 0x035e531e, 0x0128fd08, 0x015b9dcb, 0x000f0362}}}, + {X: Field{[10]uint32{0x01c92833, 0x034bb413, 0x00be8431, 0x036e1b81, 0x00664744, 0x01325d3e, 0x0025aa67, 0x03f6be33, 0x00314e18, 0x0028b333}}, Y: Field{[10]uint32{0x0359d71c, 0x00e9d3f1, 0x038a846c, 0x02230190, 0x002e1b9c, 0x019cbd79, 0x00e55368, 0x01c7bb48, 0x0249d6d4, 0x002d9043}}}, + {X: Field{[10]uint32{0x0268bf27, 0x03d9d6fd, 0x0331fa35, 0x0018f552, 0x00b3b24e, 0x00b65aa2, 0x0319119b, 0x03d8b12b, 0x012fdb15, 0x0016ff06}}, Y: Field{[10]uint32{0x03d99051, 0x02786611, 0x0223b609, 0x01890087, 0x02dbe0dc, 0x03d8a8e2, 0x0031bb39, 0x03850241, 0x0374acb4, 0x00119dd0}}}, + {X: Field{[10]uint32{0x01227028, 0x02ad7c02, 0x0090e97d, 0x015621ab, 0x0161eb21, 0x01fbec02, 0x022e5539, 0x031010ca, 0x0289da73, 0x0019a10a}}, Y: Field{[10]uint32{0x01941de9, 0x00602448, 0x02f4e90b, 0x031a2726, 0x01da171b, 0x00405b36, 0x012dc9df, 0x02812223, 0x03c3511e, 0x000ea3a0}}}, + {X: Field{[10]uint32{0x01c516e8, 0x001d9af3, 0x002f7181, 0x0137564d, 0x03e3a4a8, 0x03ba2e4a, 0x01f89913, 0x017e6351, 0x01973ba9, 0x003b208c}}, Y: Field{[10]uint32{0x037206fe, 0x0097866a, 0x032aef1d, 0x01b6b265, 0x0177d547, 0x02a54ed7, 0x033bc882, 0x00fd3865, 0x0079f511, 0x0014cb4f}}}, + {X: Field{[10]uint32{0x02fc140b, 0x009467dc, 0x007ad1ac, 0x01b0caac, 0x03e8e8e2, 0x03cfb4e7, 0x015e5b65, 0x0185dabb, 0x0278bc51, 0x000ed97f}}, Y: Field{[10]uint32{0x00208d98, 0x03deb7e6, 0x02c1b9c9, 0x035cc533, 0x02566a1f, 0x019be577, 0x037f9764, 0x03ae704f, 0x02de5190, 0x00215b4d}}}, + {X: Field{[10]uint32{0x018cc346, 0x01880db4, 0x03945182, 0x02cc9c8a, 0x01f9f31e, 0x00ff7402, 0x02545ce8, 0x00d497a7, 0x02ca51c4, 0x0000eb03}}, Y: Field{[10]uint32{0x0213a7e6, 0x00c092a8, 0x01e509ab, 0x0322c4d3, 0x00325beb, 0x01038251, 0x004ef313, 0x02933cc9, 0x018bc3b2, 0x00371c80}}}, + {X: Field{[10]uint32{0x02e23508, 0x014e810b, 0x0172ffbe, 0x02e6ed42, 0x00bcdac8, 0x005f66f8, 0x012db7c2, 0x03b39bb7, 0x018d6c50, 0x00124a59}}, Y: Field{[10]uint32{0x02cec38a, 0x012f642a, 0x00c3a728, 0x03e35e84, 0x016dfc8d, 0x008ca1d0, 0x0155980a, 0x02ef52e1, 0x002c61aa, 0x00396b29}}}, + {X: Field{[10]uint32{0x013a6291, 0x002ad6c5, 0x022781d6, 0x02ad2469, 0x037830e2, 0x031b48a5, 0x029e7488, 0x01924bc3, 0x036f4bc9, 0x002745b9}}, Y: Field{[10]uint32{0x015ac7ab, 0x0099bb22, 0x01711da7, 0x0228113a, 0x015eaa98, 0x01dc2bbd, 0x00363189, 0x01a48815, 0x0300e4ac, 0x00399643}}}, + {X: Field{[10]uint32{0x035df94d, 0x026cae07, 0x0276d5e0, 0x01a89f01, 0x014e13b3, 0x03fe5eb7, 0x02a9bbe7, 0x039febd4, 0x004a1327, 0x002c1927}}, Y: Field{[10]uint32{0x0091acdd, 0x01570f0e, 0x02d120b3, 0x00206981, 0x02d79fdd, 0x01fdd6a2, 0x032a0807, 0x01a12381, 0x0316a6f3, 0x00264720}}}, + {X: Field{[10]uint32{0x0052235d, 0x0304af6c, 0x013c96b7, 0x03d817f8, 0x03eb39a8, 0x0129285a, 0x01ce51c4, 0x00f7b4b2, 0x0221f630, 0x0023c652}}, Y: Field{[10]uint32{0x0330739e, 0x015749a5, 0x030f1bd7, 0x00b3b7f9, 0x01c63517, 0x0268b721, 0x01afb23e, 0x020b8951, 0x03d0c9af, 0x002f477c}}}, + {X: Field{[10]uint32{0x03e21ff0, 0x021fc77b, 0x0262a60e, 0x00871b08, 0x033872b7, 0x03579996, 0x037f6c3d, 0x0133651d, 0x0297cc7a, 0x000769c6}}, Y: Field{[10]uint32{0x00be6a06, 0x03411a01, 0x026e87f0, 0x03a19a8f, 0x030a4d30, 0x009cebfa, 0x032b9af1, 0x01b869eb, 0x02413903, 0x001e345e}}}, + {X: Field{[10]uint32{0x0386aa45, 0x01ebcf37, 0x0290f7a3, 0x006ec604, 0x03e04e40, 0x0148a471, 0x02fabb1c, 0x03c98b4f, 0x0363e493, 0x00027fb4}}, Y: Field{[10]uint32{0x003de729, 0x03fe0d9c, 0x00d6cb3f, 0x00da437f, 0x0353a54f, 0x02972597, 0x01b18276, 0x02b7fefb, 0x033ee164, 0x0004c330}}}, + {X: Field{[10]uint32{0x03a1e49f, 0x01d6a1e9, 0x0298febb, 0x00eb079e, 0x007a601a, 0x032ed850, 0x01ebc38f, 0x00d5a066, 0x00cd221c, 0x003459bb}}, Y: Field{[10]uint32{0x0072f06e, 0x0257dda8, 0x003c9937, 0x01f33952, 0x00b0628c, 0x0152150d, 0x00ec5628, 0x0002f577, 0x02b7e7c2, 0x00098888}}}, + {X: Field{[10]uint32{0x01dbe0fd, 0x002482a3, 0x035cc293, 0x01b8e4d0, 0x02b998a5, 0x02528ba3, 0x03078392, 0x01c30730, 0x00bd3e37, 0x0039e14f}}, Y: Field{[10]uint32{0x000e5a8e, 0x00503da6, 0x0050b80a, 0x02c63e92, 0x00cff1e7, 0x0008f0ef, 0x01d29181, 0x01f31259, 0x02ca6714, 0x001e5df9}}}, + {X: Field{[10]uint32{0x0227a17f, 0x03d27158, 0x03511480, 0x039c108f, 0x0251036c, 0x02c687c0, 0x02a3cd56, 0x000804af, 0x02b1cb14, 0x002a2c3f}}, Y: Field{[10]uint32{0x01ba8a9f, 0x02773e9d, 0x037b527c, 0x02483225, 0x0367afe7, 0x00e00723, 0x00eedd6d, 0x02db6db3, 0x03db9d3a, 0x003335f0}}}, + {X: Field{[10]uint32{0x02d617d7, 0x0167db15, 0x02b26c90, 0x001aa11a, 0x006d02e4, 0x013d62e6, 0x02905797, 0x015d54c7, 0x01d9e181, 0x0015f397}}, Y: Field{[10]uint32{0x02142d14, 0x006b18ff, 0x01bc4e85, 0x03c97bf2, 0x01829f61, 0x02a3e6bb, 0x01598f8a, 0x03cc589a, 0x00904399, 0x00330d30}}}, + {X: Field{[10]uint32{0x00f9c858, 0x02e61bf4, 0x02f2d6c8, 0x031b2fc0, 0x008077b6, 0x0196acf9, 0x03bbc1d3, 0x03f1b6fb, 0x00b64f60, 0x0011e5e4}}, Y: Field{[10]uint32{0x007f2f9b, 0x022cd582, 0x03f435df, 0x006a57a6, 0x025cff91, 0x00f923e9, 0x025382ae, 0x00649774, 0x0182e358, 0x00055fd2}}}, + {X: Field{[10]uint32{0x03f17c68, 0x019421ff, 0x03b1ccb2, 0x0328f2cd, 0x008ee0a0, 0x004ef9db, 0x001b6228, 0x00290486, 0x007b1ffe, 0x000156af}}, Y: Field{[10]uint32{0x0171d99f, 0x03b7532a, 0x032d669b, 0x02fe0a0f, 0x01606272, 0x02877496, 0x039e6030, 0x01314d33, 0x024923e9, 0x002f44d0}}}, + {X: Field{[10]uint32{0x00d2e659, 0x019ce509, 0x011da1dc, 0x03807514, 0x02bd3156, 0x0397dc27, 0x004d4310, 0x0359eae0, 0x00328bf5, 0x001b29f8}}, Y: Field{[10]uint32{0x02ca2647, 0x008815d7, 0x01a69077, 0x03d1b4ac, 0x00d80aaa, 0x03e1c360, 0x011c2ff2, 0x00e42595, 0x0133f368, 0x00310a2c}}}, + {X: Field{[10]uint32{0x01f530d3, 0x0167a44b, 0x014dd999, 0x03ba706b, 0x02346ae4, 0x02ebea2c, 0x03d20baf, 0x0021b132, 0x01a983e9, 0x001837c6}}, Y: Field{[10]uint32{0x0379cc48, 0x022dec0e, 0x01e31d7a, 0x03e211c0, 0x01a09d60, 0x0393a393, 0x01c2f1e0, 0x005e8108, 0x005429f8, 0x0036b9ee}}}, + {X: Field{[10]uint32{0x03686bce, 0x009b5b74, 0x012c7e1d, 0x00141ae9, 0x035c22ff, 0x01668e11, 0x0180ea1c, 0x03cab6eb, 0x010e5ef5, 0x001bc635}}, Y: Field{[10]uint32{0x00d7d7a9, 0x00cdab7c, 0x038f513a, 0x01756d15, 0x00d3f340, 0x030de1b8, 0x00f5c83b, 0x03bf43eb, 0x020fa166, 0x003475fa}}}, + {X: Field{[10]uint32{0x03d949e0, 0x03a281cb, 0x01233b3b, 0x00399796, 0x01fcdfe0, 0x0377ba76, 0x009569a8, 0x004cd92b, 0x009d5ed5, 0x002d8d37}}, Y: Field{[10]uint32{0x0331db69, 0x01b40dba, 0x021a70e8, 0x01d9958a, 0x02fdf189, 0x0370d15b, 0x01a505cb, 0x0095d7c9, 0x02e2c61b, 0x0035cb91}}}, + {X: Field{[10]uint32{0x03445910, 0x0159bf65, 0x00f0e4fc, 0x020da7d7, 0x0340d919, 0x00f6f16a, 0x02461714, 0x0093cf99, 0x00f02dba, 0x00168dff}}, Y: Field{[10]uint32{0x01c69d1e, 0x010918dd, 0x00b59c33, 0x00f4a5d7, 0x0333e615, 0x00531e11, 0x02a95826, 0x01d1b198, 0x01d813f8, 0x002a5834}}}, + {X: Field{[10]uint32{0x0112661c, 0x00eb86fc, 0x029e11b8, 0x023c6aac, 0x01eeeb8f, 0x0065b63f, 0x00201b6b, 0x0200cb18, 0x02a73731, 0x0022abc5}}, Y: Field{[10]uint32{0x039a8e44, 0x02ead22a, 0x0215d611, 0x025661f1, 0x036d03a7, 0x0117cab9, 0x03cc0c28, 0x02929d58, 0x035666a3, 0x0031187b}}}, + {X: Field{[10]uint32{0x035e3434, 0x012e2bab, 0x0004d9cd, 0x024d0b0a, 0x011d85a6, 0x001ca711, 0x03e7f49e, 0x0057bf64, 0x03a5a05f, 0x00115bc2}}, Y: Field{[10]uint32{0x0311cad5, 0x01fb2c9c, 0x0135bb0f, 0x02f612e4, 0x0213f616, 0x00c10785, 0x006da131, 0x006a2dfd, 0x00a99922, 0x0029a03d}}}, + {X: Field{[10]uint32{0x00f5c741, 0x02cd32ce, 0x0170a9d0, 0x003e85e2, 0x014bfdc9, 0x00784b2e, 0x03146d93, 0x015025d7, 0x02a1f190, 0x003e270d}}, Y: Field{[10]uint32{0x0044099b, 0x0348dd67, 0x01646579, 0x0233ad28, 0x034b1df3, 0x0307fe8e, 0x01866159, 0x006e4a84, 0x008058e3, 0x000ed58b}}}, + {X: Field{[10]uint32{0x01f3f76a, 0x030940d0, 0x004289d2, 0x0398cbcc, 0x00e23876, 0x035a73ed, 0x00c49031, 0x02180036, 0x03112e1d, 0x001fdafa}}, Y: Field{[10]uint32{0x00ff4a9b, 0x03743b29, 0x02fb90cd, 0x035ba33d, 0x0008d98e, 0x00589ee6, 0x0194b9b5, 0x016bf2fa, 0x0007c092, 0x002864dd}}}, + {X: Field{[10]uint32{0x02d73511, 0x03718184, 0x000d3827, 0x010c653d, 0x011010f5, 0x03475400, 0x037130ba, 0x031f0de2, 0x00aab585, 0x002416b4}}, Y: Field{[10]uint32{0x037177a9, 0x02e00942, 0x018aab83, 0x007e8b82, 0x00a44782, 0x024745b5, 0x00130aee, 0x0334e054, 0x0301c3dd, 0x002ff381}}}, + {X: Field{[10]uint32{0x03408b6c, 0x0145487d, 0x032aef1d, 0x03d1d542, 0x01e54187, 0x02d80cf4, 0x001e7a30, 0x00bf29c8, 0x02d16212, 0x003d5670}}, Y: Field{[10]uint32{0x00154481, 0x0059eb4d, 0x017f25dc, 0x0108e33b, 0x037695ea, 0x00c4209c, 0x02f04dc4, 0x03ac51fd, 0x0222dfd0, 0x000fc435}}}, + {X: Field{[10]uint32{0x018ce8b4, 0x0364741c, 0x023456f4, 0x00330d85, 0x037c0d8a, 0x022fb7d4, 0x02e5830a, 0x00527332, 0x00a4fa17, 0x00066cca}}, Y: Field{[10]uint32{0x02582f64, 0x01134127, 0x00855126, 0x0024975a, 0x01fdff7f, 0x039e19de, 0x01258838, 0x01a48da6, 0x000a2a4e, 0x0026873a}}}, + {X: Field{[10]uint32{0x01ad5d4a, 0x024d922b, 0x03e533a3, 0x03d02487, 0x032743d4, 0x0069a82f, 0x00abc24c, 0x0066f3af, 0x00a0e756, 0x002beae6}}, Y: Field{[10]uint32{0x023a32db, 0x034e6fa4, 0x017157df, 0x038c4f5d, 0x007c8e5b, 0x007ca684, 0x0341c092, 0x00e695e5, 0x02877591, 0x002fc6ce}}}, + {X: Field{[10]uint32{0x024181c7, 0x0247f63b, 0x01085cca, 0x03ba05db, 0x01b2dfe0, 0x020ea3b2, 0x01b36d9c, 0x028d36b7, 0x037c1d86, 0x0030b2af}}, Y: Field{[10]uint32{0x0191070f, 0x0349ea93, 0x032acf51, 0x0143a725, 0x01159ab1, 0x03b3ae3d, 0x00465bd6, 0x00cd71c9, 0x032453f1, 0x0016ccad}}}, + {X: Field{[10]uint32{0x0289f593, 0x035b3f0a, 0x02be4f5a, 0x03e8b068, 0x024f6e9c, 0x03050d57, 0x028c5347, 0x01d148a6, 0x00248e84, 0x0024a0e5}}, Y: Field{[10]uint32{0x008c3a07, 0x02285c5f, 0x02996c88, 0x0057594b, 0x0051983b, 0x011bebda, 0x00a7b4a1, 0x03b81a67, 0x005dfd41, 0x002ee716}}}, + {X: Field{[10]uint32{0x033c7dfa, 0x030c3431, 0x03b4aa8d, 0x004b4327, 0x0155e55f, 0x005ef5eb, 0x00cba646, 0x03c61082, 0x013c389e, 0x002f28a1}}, Y: Field{[10]uint32{0x01df63a2, 0x02235e78, 0x01340175, 0x00b80799, 0x02fe9a14, 0x01a98bee, 0x005952b1, 0x03b7b4f5, 0x009ef32a, 0x0027d04a}}}, + {X: Field{[10]uint32{0x01bf56fd, 0x013ca05c, 0x037e4a0e, 0x02f4df29, 0x015745b7, 0x03399cb1, 0x0353aea5, 0x0196a3af, 0x03da94b5, 0x00293a9e}}, Y: Field{[10]uint32{0x013e96bc, 0x03339aa2, 0x00fb0970, 0x00c4deec, 0x02629eef, 0x00b1654f, 0x01e1a284, 0x03aa426e, 0x00851405, 0x0032541d}}}, + {X: Field{[10]uint32{0x00d5e169, 0x0139e318, 0x03b1ff75, 0x022a149e, 0x03da57c1, 0x02268900, 0x0327ced0, 0x004e7b5c, 0x0145af71, 0x001c5c1f}}, Y: Field{[10]uint32{0x00223ef9, 0x037a75c4, 0x0185f1b9, 0x00e7f4f1, 0x013eef0f, 0x01691df7, 0x034e4a85, 0x029bce8f, 0x0084fe4d, 0x00092cd9}}}, + {X: Field{[10]uint32{0x03df9a05, 0x029c1b93, 0x028c07dd, 0x03db5cc8, 0x015b1f5f, 0x01ae3fd4, 0x01cf4d23, 0x03d64675, 0x02030296, 0x0014b077}}, Y: Field{[10]uint32{0x02344d0e, 0x0074d356, 0x03c5135d, 0x00524181, 0x01c95097, 0x0368ede1, 0x00066e4f, 0x0355d0e1, 0x01590d73, 0x0036e563}}}, + {X: Field{[10]uint32{0x0368912f, 0x007a9888, 0x03120d8b, 0x001f7e09, 0x0374dc20, 0x02f32ee1, 0x0291989c, 0x03a114c1, 0x00b07852, 0x001ec270}}, Y: Field{[10]uint32{0x002bd263, 0x0027a13e, 0x01f3be9c, 0x01736a5e, 0x0109545a, 0x01e0ae93, 0x02ebeeb0, 0x00a05f43, 0x0317ffc5, 0x0013b7d5}}}, + {X: Field{[10]uint32{0x03b8300a, 0x031a277f, 0x02540681, 0x01899acc, 0x03f26e70, 0x038ecf00, 0x00088343, 0x0346a0af, 0x00ceb29a, 0x003a661c}}, Y: Field{[10]uint32{0x01597f9f, 0x01e16a33, 0x00fadc6f, 0x00f6448c, 0x008ff75e, 0x005345ea, 0x0012dbc6, 0x01f596f3, 0x01927894, 0x0020202b}}}, + {X: Field{[10]uint32{0x005c38e7, 0x00e90d08, 0x02444adc, 0x02f4ae44, 0x022dd2c2, 0x00f5317b, 0x01b4cb9c, 0x0204e617, 0x026de28b, 0x0031f88c}}, Y: Field{[10]uint32{0x02ad940e, 0x02fd7871, 0x0099d195, 0x023150f6, 0x01d31adf, 0x005df3c1, 0x0387000e, 0x0332547e, 0x03f9cdc0, 0x0017ca18}}}, + {X: Field{[10]uint32{0x023f7965, 0x026d574f, 0x02244119, 0x01ad7a94, 0x014c6bb6, 0x023ee922, 0x0186bfd2, 0x02f5e0f1, 0x02c84ca7, 0x00220d65}}, Y: Field{[10]uint32{0x00e9282e, 0x01af3896, 0x03ac6940, 0x016da3b3, 0x0147a22f, 0x00a516b2, 0x02d6d4a7, 0x017c4325, 0x03e85925, 0x003ec452}}}, + {X: Field{[10]uint32{0x020b42cc, 0x03adf8fc, 0x02dcf7ff, 0x0165794c, 0x035cf616, 0x01f95b9f, 0x03029dd3, 0x0103d6c3, 0x0248a196, 0x001fdce9}}, Y: Field{[10]uint32{0x00ff4feb, 0x013fea20, 0x0107f4a9, 0x006e7565, 0x0108ef19, 0x028ed09b, 0x022df3eb, 0x02bb7ed3, 0x008af931, 0x0013dd89}}}, + {X: Field{[10]uint32{0x0341aa3d, 0x030e0aa5, 0x015bddb9, 0x026a291e, 0x0218c873, 0x00465a99, 0x03b56040, 0x0340eb38, 0x034a3660, 0x003227b8}}, Y: Field{[10]uint32{0x02923884, 0x0346e544, 0x02084684, 0x0192e677, 0x03068387, 0x003bca4b, 0x0379ac9d, 0x02b15fcb, 0x008835fb, 0x002928ee}}}, + {X: Field{[10]uint32{0x0141d5bc, 0x0313b4f6, 0x023fd566, 0x02250c15, 0x01b5c468, 0x007607c6, 0x0050cf43, 0x00313940, 0x0056d7dc, 0x00092f93}}, Y: Field{[10]uint32{0x029e6213, 0x0268217c, 0x001cbac0, 0x031e95bf, 0x010f6a5f, 0x03c6b5da, 0x00714a2a, 0x00c5757c, 0x02e24936, 0x00381c8d}}}, + {X: Field{[10]uint32{0x000b94f5, 0x02e614f9, 0x02852c4e, 0x00749a4d, 0x022866a9, 0x008dea7c, 0x00ee5c53, 0x007001e6, 0x031ecaa9, 0x001b0c79}}, Y: Field{[10]uint32{0x00cf8cd7, 0x00f0e167, 0x03922572, 0x0365203d, 0x0134543c, 0x00c2e53a, 0x0117e0ac, 0x00b34704, 0x03232b5f, 0x00196bfc}}}, + {X: Field{[10]uint32{0x0258b7e7, 0x0007b5e3, 0x02286926, 0x01d34c7e, 0x03e470a5, 0x02d860e7, 0x003c0229, 0x01a4f4f8, 0x033c8479, 0x00141b0d}}, Y: Field{[10]uint32{0x01b7ab65, 0x00feb280, 0x023ca167, 0x01db83ff, 0x03e24f86, 0x001ffba0, 0x00bd4ae7, 0x0140d49a, 0x03d3a57c, 0x0013f42f}}}, + {X: Field{[10]uint32{0x018349a4, 0x0314ccb2, 0x01b45b48, 0x00247700, 0x0057571a, 0x01c7dcc7, 0x027b0978, 0x01b3185b, 0x01f3ea1a, 0x00167669}}, Y: Field{[10]uint32{0x01fc8447, 0x005b8355, 0x0363821c, 0x004c6a9a, 0x0153aadf, 0x029fb94e, 0x03c348f0, 0x025b0c98, 0x033eee64, 0x00252b4d}}}, + {X: Field{[10]uint32{0x02d75c69, 0x00e06cc8, 0x008d64de, 0x0274d991, 0x01c6f892, 0x01b399f5, 0x001912fa, 0x005923d9, 0x03ab6537, 0x00294933}}, Y: Field{[10]uint32{0x01782823, 0x028daa51, 0x0214471a, 0x01630fd1, 0x02ac1b61, 0x02f9f1e6, 0x026ae90b, 0x0356645e, 0x03f987fb, 0x0005309b}}}, + {X: Field{[10]uint32{0x0348c550, 0x03cb195f, 0x0276a92a, 0x03537c9b, 0x038aa3fd, 0x029ac8e4, 0x000d3ac6, 0x018c1e1f, 0x006df83c, 0x00049b26}}, Y: Field{[10]uint32{0x014c5c5c, 0x00595acf, 0x03d39774, 0x00757a6b, 0x003f74ab, 0x006b1cb8, 0x00f04dd3, 0x01be3cef, 0x01d3a56a, 0x0020214e}}}, + {X: Field{[10]uint32{0x00e39722, 0x0211d283, 0x01db7318, 0x035ee6a0, 0x00d8ff25, 0x03341554, 0x01a9d5b4, 0x033ec9f8, 0x03c01aeb, 0x000cb2ae}}, Y: Field{[10]uint32{0x03bccee9, 0x01bfac63, 0x035bb957, 0x0087eaa7, 0x02be1910, 0x03b9ad4a, 0x02c070f6, 0x00c71004, 0x020ae080, 0x001f4c04}}}, + {X: Field{[10]uint32{0x02f42c64, 0x03873e08, 0x025da359, 0x01905b70, 0x028a9f08, 0x0356992a, 0x00975aba, 0x035be2a6, 0x00baf7de, 0x000ff787}}, Y: Field{[10]uint32{0x035ac075, 0x00f2580b, 0x03f919ee, 0x02858373, 0x0044ffed, 0x024484b3, 0x0293cae6, 0x03c5d2c3, 0x00ac61f0, 0x0003943f}}}, + {X: Field{[10]uint32{0x01462e24, 0x024cb1c4, 0x0326b3ce, 0x00dc7b87, 0x0336e9db, 0x02c409c9, 0x013a08d6, 0x037ef007, 0x02cad6c3, 0x00272b48}}, Y: Field{[10]uint32{0x00461c6b, 0x0136e554, 0x015a6882, 0x00653967, 0x03422bb1, 0x02aaeed4, 0x00781cb0, 0x033411fc, 0x031d873d, 0x0016ba13}}}, + {X: Field{[10]uint32{0x015872ef, 0x014b465f, 0x0024e1c6, 0x027e4927, 0x010c20cf, 0x00706beb, 0x00ca18e9, 0x01d898ea, 0x0020aa80, 0x00026164}}, Y: Field{[10]uint32{0x03c73e69, 0x00152e34, 0x02dd6a3d, 0x03aecccb, 0x01a084e7, 0x03617e8e, 0x00976f72, 0x01f5b91c, 0x03fd21ab, 0x001150c8}}}, + {X: Field{[10]uint32{0x024eb2b6, 0x00c6e791, 0x033a9d8c, 0x014f112c, 0x00ac00bc, 0x02094a07, 0x03093b6c, 0x032f568a, 0x01a3e7cb, 0x002085a6}}, Y: Field{[10]uint32{0x02a9726a, 0x001cead9, 0x0384023b, 0x0146f39b, 0x03e62cf4, 0x02ef4fa7, 0x0344cbcb, 0x032e6dca, 0x00172400, 0x003df567}}}, + {X: Field{[10]uint32{0x00d370d9, 0x029fdb63, 0x02dad74e, 0x030ff0a1, 0x00440b3c, 0x031233ae, 0x01fc7a55, 0x00e189e5, 0x00be3642, 0x002f41b5}}, Y: Field{[10]uint32{0x0183b90e, 0x03354218, 0x017140ac, 0x014fef34, 0x0361bb12, 0x032ee023, 0x00a56632, 0x03b22329, 0x013a0fdc, 0x000ec246}}}, + {X: Field{[10]uint32{0x03bdf4d2, 0x010448d2, 0x038225bc, 0x013645df, 0x02bb4b73, 0x0010f1b2, 0x00a4ed0e, 0x031e37c1, 0x02e79c8c, 0x000b1c44}}, Y: Field{[10]uint32{0x00391243, 0x00fb108e, 0x01afd6e0, 0x03bd97fc, 0x02bae242, 0x02403d87, 0x012884ad, 0x008921d8, 0x03add42e, 0x00320733}}}, + {X: Field{[10]uint32{0x0122131e, 0x02deabf8, 0x03905762, 0x01bbc660, 0x03b7f523, 0x0377e73a, 0x03cbb8c9, 0x01dcb20c, 0x010fa65d, 0x00146b8e}}, Y: Field{[10]uint32{0x017ba06e, 0x01b86a3b, 0x02ec8125, 0x0387a13a, 0x000f1e96, 0x01f6edc5, 0x02f2a888, 0x01ac18a0, 0x03808040, 0x000f5f27}}}, + {X: Field{[10]uint32{0x02cc59ea, 0x0209b936, 0x027a177d, 0x01c9ae45, 0x02c74326, 0x00ecc4d5, 0x00b8348e, 0x01e90caf, 0x0112de23, 0x00316778}}, Y: Field{[10]uint32{0x01903b25, 0x0131a275, 0x012b0285, 0x000ea381, 0x00aa33e4, 0x017859db, 0x009c1d9c, 0x02d9b67c, 0x03167c5e, 0x000d8427}}}, + {X: Field{[10]uint32{0x0156d978, 0x000608fd, 0x030f757d, 0x039a4867, 0x02077ca1, 0x015d4c09, 0x01cb89a4, 0x02766c54, 0x023ab750, 0x0022e67c}}, Y: Field{[10]uint32{0x016a4164, 0x0380203d, 0x00e9adc8, 0x00be4132, 0x00d338e1, 0x02f355cf, 0x033cf0e4, 0x03f913d4, 0x02adf53a, 0x0021a8c6}}}, + {X: Field{[10]uint32{0x00369dd5, 0x0382ae5e, 0x0271739f, 0x01f277ba, 0x0261f5fb, 0x03bc620b, 0x024135a1, 0x02a6f67b, 0x03657d6f, 0x001319c3}}, Y: Field{[10]uint32{0x03e65417, 0x002de5fb, 0x01dd3c10, 0x00d46d4e, 0x01b54e04, 0x01fe2474, 0x0075dc10, 0x014d8c4a, 0x02265d4b, 0x0014c6a0}}}, + {X: Field{[10]uint32{0x00f38548, 0x0233b778, 0x0333d938, 0x037277c3, 0x0036aed9, 0x015fc190, 0x03024e6e, 0x003e57f5, 0x02359daa, 0x0023a59f}}, Y: Field{[10]uint32{0x010d218f, 0x0285d946, 0x00d2f1f1, 0x02c7c058, 0x0145fa0a, 0x028440e0, 0x008b833b, 0x03ea9632, 0x015ba59a, 0x000dbe01}}}, + {X: Field{[10]uint32{0x032ac9e1, 0x03a78cce, 0x03c3ec82, 0x01f0231e, 0x015e2e09, 0x03c33256, 0x007bfaac, 0x028df417, 0x01159c45, 0x000fd846}}, Y: Field{[10]uint32{0x0197d7d6, 0x00cb80b5, 0x014faf6c, 0x03b896dd, 0x03b9d2f3, 0x03bab694, 0x02087578, 0x01f7148f, 0x034ab743, 0x00032004}}}, + {X: Field{[10]uint32{0x007641d9, 0x0140033d, 0x007459f8, 0x020e1c1c, 0x0366bba6, 0x01faf7b7, 0x03b203ac, 0x0104ad4f, 0x009d7c61, 0x000fd679}}, Y: Field{[10]uint32{0x003ad5b0, 0x038958e9, 0x010f2ae3, 0x01e261b5, 0x0264cd09, 0x03d77353, 0x038f1010, 0x037f8f48, 0x00884243, 0x002fb75c}}}, + {X: Field{[10]uint32{0x03f6d490, 0x032be1d6, 0x02781bbb, 0x036865e8, 0x01ad46d4, 0x033c5c3a, 0x0044b5bf, 0x00da90ef, 0x00c9b648, 0x0016df61}}, Y: Field{[10]uint32{0x034d984f, 0x00ffb0ac, 0x0156a7c7, 0x016e64a0, 0x03f2164e, 0x001f7c12, 0x00b89755, 0x02c3ffeb, 0x029cc7d6, 0x0027d56c}}}, + {X: Field{[10]uint32{0x01744b1c, 0x030a7a94, 0x02a88962, 0x003681c6, 0x0390decf, 0x02bf0faa, 0x03bf1f9a, 0x03a0f3dc, 0x00ae0ac3, 0x00387b9d}}, Y: Field{[10]uint32{0x01277030, 0x0331423c, 0x0221650a, 0x016e0319, 0x01eefbe1, 0x020e60e7, 0x028d6748, 0x02149415, 0x02f8b34e, 0x0027a1b4}}}, + {X: Field{[10]uint32{0x03eea871, 0x03125ada, 0x0200e5dd, 0x02b2fbb8, 0x01eba721, 0x025b29fb, 0x0196c22e, 0x0251238c, 0x015b8d48, 0x003e8733}}, Y: Field{[10]uint32{0x039bc469, 0x0396154b, 0x01829d25, 0x012ff4aa, 0x02851350, 0x01e95b5f, 0x02479a8a, 0x01995275, 0x019a326a, 0x0038adfd}}}, + {X: Field{[10]uint32{0x03fdc8bf, 0x03c30e9e, 0x027a04c9, 0x01afde97, 0x00b29231, 0x02d298eb, 0x02199d1a, 0x0182587d, 0x00d70f38, 0x003bc787}}, Y: Field{[10]uint32{0x0298ef05, 0x014430ae, 0x00687eeb, 0x01dd5677, 0x025783d3, 0x0104794c, 0x015dadce, 0x0044760e, 0x0001a9de, 0x00133be7}}}, + {X: Field{[10]uint32{0x01326120, 0x0391a2b8, 0x02e8e9b3, 0x02565687, 0x020fe9c3, 0x01204f6c, 0x025cc4ed, 0x034eeb7e, 0x02b93e75, 0x0036dc53}}, Y: Field{[10]uint32{0x0271a206, 0x00a56a9a, 0x0067f618, 0x00059970, 0x00fa3cb7, 0x02205a10, 0x0130311c, 0x01e3d213, 0x0286b812, 0x000f7126}}}, + {X: Field{[10]uint32{0x02ea5d5a, 0x03ccbfb9, 0x0045229a, 0x031e6b47, 0x03d70c79, 0x03a74ffa, 0x00cf936e, 0x00a1610f, 0x038dbd57, 0x001665fc}}, Y: Field{[10]uint32{0x03e4a224, 0x01a695a5, 0x00eec45a, 0x01e37d52, 0x031f44b6, 0x01970777, 0x0349e089, 0x00046ee5, 0x0062b716, 0x002b7df6}}}, + {X: Field{[10]uint32{0x03baeb92, 0x03bb0f4e, 0x00039ea4, 0x02f4ef1b, 0x02956654, 0x03f07f1e, 0x008ae666, 0x0015ddec, 0x02d90a92, 0x0025f5bd}}, Y: Field{[10]uint32{0x020068b9, 0x03c6d730, 0x03c684bd, 0x037d39ff, 0x03ce03fe, 0x00f7eefd, 0x015ab971, 0x0261536b, 0x0047ff21, 0x002d1437}}}, + {X: Field{[10]uint32{0x02d307c4, 0x00034016, 0x010abc4b, 0x032875ac, 0x0040232b, 0x013bbe67, 0x0149ae3c, 0x02dcada5, 0x03cd5ec8, 0x0013d14f}}, Y: Field{[10]uint32{0x01683f7f, 0x01303482, 0x038160b9, 0x017b59a3, 0x00bd61f1, 0x0258367a, 0x02442baf, 0x02f21f1e, 0x0168c4a8, 0x002ab7b5}}}, + {X: Field{[10]uint32{0x009424d6, 0x01c9c165, 0x031e6499, 0x0243036d, 0x00ae4c44, 0x02a9e51b, 0x01c0a6ac, 0x00c0d71c, 0x00a35059, 0x00016981}}, Y: Field{[10]uint32{0x033be9c8, 0x01e9bd04, 0x0186a893, 0x0278bde1, 0x01ae8277, 0x03ea2742, 0x02b92b93, 0x00069e80, 0x00126d87, 0x00395e3f}}}, + {X: Field{[10]uint32{0x03c635b3, 0x0061a581, 0x004985d1, 0x0324d382, 0x022de601, 0x02d7fa3b, 0x024cf0d5, 0x00cbe86d, 0x01a29168, 0x000fcc1c}}, Y: Field{[10]uint32{0x011ad3a3, 0x02147911, 0x0070d053, 0x01706f91, 0x038712f2, 0x0277c390, 0x02adb6f6, 0x02c8cec8, 0x01990bae, 0x003a456c}}}, + {X: Field{[10]uint32{0x001c06e5, 0x01252464, 0x02c45318, 0x01b0bb79, 0x02f7476a, 0x03e67088, 0x0302c5fb, 0x0226b3f3, 0x01cd6431, 0x001d16f0}}, Y: Field{[10]uint32{0x029933f0, 0x024741b4, 0x01d21872, 0x0107409d, 0x00be16cb, 0x0039676d, 0x02519bd1, 0x01dd77a6, 0x034a8703, 0x001668ae}}}, + {X: Field{[10]uint32{0x0237238e, 0x02024449, 0x01942175, 0x00da29b0, 0x01ab3967, 0x018e1e62, 0x03591a60, 0x02567614, 0x028cadb3, 0x002ef41b}}, Y: Field{[10]uint32{0x00b8b690, 0x013b7b4e, 0x00c2a02b, 0x000e9968, 0x00d562b0, 0x0242e1a9, 0x006cb880, 0x0397cf71, 0x0296b484, 0x002b8360}}}, + {X: Field{[10]uint32{0x022cf07c, 0x014ff524, 0x017a385e, 0x01a6debe, 0x029f3eb5, 0x00e8ecd7, 0x00b7e436, 0x02f99a14, 0x01b6128d, 0x003f36a3}}, Y: Field{[10]uint32{0x01551974, 0x03d4d7fe, 0x03f283a0, 0x03a0a817, 0x02cd11f1, 0x03135721, 0x0358ee14, 0x03e6a17d, 0x01fc37a0, 0x0012fcf7}}}, + {X: Field{[10]uint32{0x0073cce2, 0x006b7666, 0x015705ca, 0x025d3b7b, 0x034ed2da, 0x01c84332, 0x025e1132, 0x01f7b4a9, 0x03dffc9c, 0x0018c977}}, Y: Field{[10]uint32{0x00f222e1, 0x0355b4d3, 0x033584d7, 0x003ebc69, 0x027ce193, 0x0185e7fa, 0x00ada7e2, 0x01bf1c5c, 0x0099683e, 0x00227f93}}}, + {X: Field{[10]uint32{0x02ee0d7f, 0x038fca48, 0x02d59245, 0x026d068e, 0x03513df5, 0x009e7429, 0x035797a5, 0x014258ea, 0x00a69349, 0x001dd653}}, Y: Field{[10]uint32{0x01faabb2, 0x023760f9, 0x024a9581, 0x00ef299a, 0x03631df0, 0x03cbbd63, 0x02ddf45e, 0x02ff23f7, 0x01122ccf, 0x000657ac}}}, + {X: Field{[10]uint32{0x02a67867, 0x005514ae, 0x0027bede, 0x01f80c21, 0x02e2defd, 0x019649dc, 0x01348fdc, 0x0090bd3c, 0x0067ea9b, 0x003cd5bb}}, Y: Field{[10]uint32{0x0233ba7a, 0x00bed335, 0x00121e4a, 0x00423c41, 0x03d75a21, 0x03262c0f, 0x02b71459, 0x023a9268, 0x01b9e23f, 0x000f4899}}}, + {X: Field{[10]uint32{0x00a205c9, 0x03f74bbe, 0x012ffcad, 0x002d6428, 0x0186149f, 0x03e2b9be, 0x00e30914, 0x02923b1e, 0x02129b0f, 0x000cd82b}}, Y: Field{[10]uint32{0x01d18a34, 0x014b7dc9, 0x00b83dcb, 0x01478cdf, 0x023d7a20, 0x00ac2989, 0x00098722, 0x016844fb, 0x03f2720d, 0x001e6cde}}}, + {X: Field{[10]uint32{0x01e8727b, 0x0056b4fe, 0x032823fc, 0x02ae7fc3, 0x03b29040, 0x0311d84f, 0x031a4c5f, 0x031436cc, 0x0352c703, 0x00113a43}}, Y: Field{[10]uint32{0x02f55f17, 0x027b0178, 0x02feb400, 0x00789b45, 0x0295c249, 0x00624cbd, 0x02d013a7, 0x00f9bd8d, 0x03419265, 0x0018b7ec}}}, + {X: Field{[10]uint32{0x02c84047, 0x000ad793, 0x0209ee79, 0x0225462a, 0x01c9e042, 0x02ca3f8d, 0x01958764, 0x02b888c4, 0x03a9b5c3, 0x003974d9}}, Y: Field{[10]uint32{0x02f8bcf0, 0x02a62f39, 0x02ace9c9, 0x02d308e0, 0x03fbbc06, 0x001c14b9, 0x0337c069, 0x03c3e9be, 0x017f01ab, 0x003a86c9}}}, + {X: Field{[10]uint32{0x01a63957, 0x01504ed6, 0x038de100, 0x02af820e, 0x010559ba, 0x008a01a9, 0x0061e6d4, 0x0396b4f0, 0x00fd7910, 0x00211e3a}}, Y: Field{[10]uint32{0x022df1d6, 0x0306f0c6, 0x03d5cfd8, 0x02f6d24b, 0x032f3f1e, 0x0052f52f, 0x03e38c45, 0x00d2644f, 0x00180519, 0x0013de4d}}}, + {X: Field{[10]uint32{0x0284b42d, 0x033dd84a, 0x01b6dc2c, 0x03ffda15, 0x0010c97d, 0x01e7249d, 0x035e2240, 0x01cc6fd6, 0x03c80587, 0x0030e0c9}}, Y: Field{[10]uint32{0x01abfcd6, 0x015f5493, 0x01b22bc6, 0x03eae157, 0x00a213fe, 0x0004b39d, 0x007d61f5, 0x0040b9fa, 0x03accb1b, 0x003ac0eb}}}, + {X: Field{[10]uint32{0x0051f10a, 0x00ad486f, 0x0214cd62, 0x02d9813b, 0x024662b4, 0x005fca28, 0x00f48c9d, 0x0299c956, 0x00125348, 0x002e7a2a}}, Y: Field{[10]uint32{0x031ccfee, 0x02b5ccbb, 0x0344ce3d, 0x02ee5e85, 0x033813e7, 0x01dc6d48, 0x02a02241, 0x0341ed47, 0x000d65fc, 0x000d709e}}}, + {X: Field{[10]uint32{0x01cc713e, 0x0229ca69, 0x030fdcc6, 0x00f48506, 0x03d3c3b5, 0x002ea1ab, 0x012e4837, 0x028c94e3, 0x02d595cf, 0x002952a8}}, Y: Field{[10]uint32{0x03b8a159, 0x03ea81a2, 0x02baf4e1, 0x02e68cba, 0x007e9552, 0x02a14692, 0x036b9c86, 0x00acbb99, 0x006e63c0, 0x002fdd37}}}, + {X: Field{[10]uint32{0x029fd956, 0x006787f6, 0x015ea4cc, 0x02b61735, 0x00420ce2, 0x02e2212b, 0x00ad145f, 0x0153ae11, 0x003ce2df, 0x003517fb}}, Y: Field{[10]uint32{0x00b81bd6, 0x03122fe3, 0x0208d205, 0x039fb9d2, 0x00bf6be1, 0x02308235, 0x001dbf9b, 0x032da9a4, 0x030065ae, 0x003b633e}}}, + {X: Field{[10]uint32{0x03192172, 0x03892b54, 0x0310187b, 0x02ae390c, 0x005c0136, 0x013360db, 0x0159829d, 0x02cc632a, 0x0298f728, 0x003d2d13}}, Y: Field{[10]uint32{0x01ea9fa1, 0x030a8262, 0x024e84d3, 0x022fc2a9, 0x012febdd, 0x033dee37, 0x0041fd88, 0x033924b2, 0x01b3960b, 0x003bd548}}}, + {X: Field{[10]uint32{0x013d67e3, 0x00b5090d, 0x039e2841, 0x031b8982, 0x00dcec40, 0x0214cc1e, 0x020cd40e, 0x024443ea, 0x01bf0d34, 0x0037b1b4}}, Y: Field{[10]uint32{0x01095895, 0x028bee99, 0x03b7254c, 0x02cc9041, 0x039451b0, 0x00bff243, 0x02fe44f3, 0x032405c7, 0x03813609, 0x001ce85b}}}, + {X: Field{[10]uint32{0x03ff013e, 0x02d6deac, 0x02039238, 0x0092f069, 0x01265f1c, 0x009cd4d3, 0x010b9c02, 0x01f1064c, 0x015372e1, 0x0007ef37}}, Y: Field{[10]uint32{0x006c27ca, 0x031dfc93, 0x0374f22b, 0x01d628a9, 0x03b2358f, 0x01c9d551, 0x004d14b9, 0x00704483, 0x034a06a6, 0x00273d3f}}}, + {X: Field{[10]uint32{0x02ab593b, 0x0004bef8, 0x03890357, 0x03e6a90e, 0x0250ea1f, 0x00e8c76a, 0x02d53f49, 0x01bb5deb, 0x00cb038c, 0x003673bc}}, Y: Field{[10]uint32{0x0253303f, 0x0030b74d, 0x0148604d, 0x004fb410, 0x01e161cd, 0x03c67769, 0x00e66547, 0x01cb56da, 0x02fe2468, 0x000ca905}}}, + {X: Field{[10]uint32{0x03f03da3, 0x01d29807, 0x03ccede1, 0x01f338cf, 0x024e2f60, 0x022348e1, 0x022135f0, 0x00a86117, 0x014988e2, 0x0005906d}}, Y: Field{[10]uint32{0x0194922f, 0x0237ef5f, 0x006fb5b6, 0x03473eb6, 0x0148e3ff, 0x0103e05b, 0x024e1b95, 0x021d9cd9, 0x00d9ed71, 0x003b74fc}}}, + {X: Field{[10]uint32{0x02243cdd, 0x014d9b0e, 0x0376f96c, 0x020eb13b, 0x0237938f, 0x03bd8059, 0x0238b211, 0x027fec6d, 0x00163c5d, 0x00267bdb}}, Y: Field{[10]uint32{0x02f66b48, 0x005da7b5, 0x02499a31, 0x02f9ae87, 0x027f912b, 0x03c10f80, 0x01d7796d, 0x01607787, 0x0362d819, 0x001adbbb}}}, + {X: Field{[10]uint32{0x035bc97c, 0x0119e7d6, 0x03fe4e2f, 0x02ca3a93, 0x02b9c47f, 0x0314d917, 0x03f79b09, 0x00ba2e03, 0x012dc24c, 0x00124d63}}, Y: Field{[10]uint32{0x001cf5b4, 0x00df2bb7, 0x03865378, 0x0121efb8, 0x03b8c807, 0x023872bd, 0x03c1cbff, 0x0103afbd, 0x00a7f9df, 0x00144a85}}}, + {X: Field{[10]uint32{0x00eb206b, 0x03b2119f, 0x02ee8a4e, 0x029690c2, 0x03c8c122, 0x00533ce0, 0x009c5e1a, 0x037fa495, 0x03cfb1de, 0x0038c74f}}, Y: Field{[10]uint32{0x01b0449b, 0x00eb95a9, 0x03687e6c, 0x02b6d379, 0x01effc4d, 0x020d193e, 0x03ad1dde, 0x01d1ec28, 0x026669db, 0x001ef0f0}}}, + {X: Field{[10]uint32{0x02c64adf, 0x00933861, 0x015d44e3, 0x01fe5e68, 0x03ad1fbb, 0x00a35d20, 0x0332e66a, 0x02f2b7ee, 0x01d6ac86, 0x002a0bb2}}, Y: Field{[10]uint32{0x00f74c89, 0x03b1b4c3, 0x01f816c4, 0x03402c78, 0x023a9efa, 0x031de64d, 0x02b46f1a, 0x006b97d2, 0x012bc28b, 0x002eb21f}}}, + {X: Field{[10]uint32{0x00ea113d, 0x02d4f532, 0x01c081bf, 0x030c631c, 0x020dc370, 0x02334eae, 0x01ab82b1, 0x028b891e, 0x01942bff, 0x00085942}}, Y: Field{[10]uint32{0x001fcae3, 0x029df272, 0x03103fec, 0x02fa697c, 0x00f84511, 0x009067e4, 0x0113b6f6, 0x00d142f9, 0x006a2f65, 0x0025ea09}}}, + {X: Field{[10]uint32{0x02dd4b84, 0x03acd8b1, 0x0057f63c, 0x0318f6d6, 0x01e4e666, 0x01123a41, 0x01f8070e, 0x025a21ff, 0x00d8208d, 0x001cd414}}, Y: Field{[10]uint32{0x02b9e2e9, 0x0007e78a, 0x03918900, 0x032eb4c1, 0x00216887, 0x0320866b, 0x03e23f07, 0x0187279b, 0x00385636, 0x000b8fed}}}, + {X: Field{[10]uint32{0x03afe506, 0x02ced991, 0x008ba197, 0x0001e770, 0x0365f878, 0x02e70fa6, 0x00c3813b, 0x0370228d, 0x0061e679, 0x00074086}}, Y: Field{[10]uint32{0x02fd2f1f, 0x029ae9e9, 0x03c50cea, 0x0133b82d, 0x004a10e8, 0x00a56fc2, 0x0292cd0e, 0x0120f427, 0x00b92303, 0x00052db4}}}, + {X: Field{[10]uint32{0x02d7810b, 0x0313d391, 0x0033c1bd, 0x01dd2615, 0x03f91c55, 0x013bfe5b, 0x018c15d5, 0x0225cea1, 0x027486ca, 0x001e9fbb}}, Y: Field{[10]uint32{0x03b498cf, 0x004b2edd, 0x02297c70, 0x006ef078, 0x03448fed, 0x01f46733, 0x035057d8, 0x01439e9f, 0x007f5d91, 0x0017a0e8}}}, + {X: Field{[10]uint32{0x0302beec, 0x039c9b69, 0x00b51f50, 0x0008cbc9, 0x02485938, 0x00a8cab6, 0x0005cce3, 0x00c1851f, 0x03d4fe0a, 0x00020470}}, Y: Field{[10]uint32{0x033d9f0a, 0x03acaf20, 0x034efc95, 0x0274c7b5, 0x03b28e59, 0x016b615d, 0x004214e3, 0x03d3e4ba, 0x016c6c9c, 0x0029bf30}}}, + {X: Field{[10]uint32{0x01ad606c, 0x01f69248, 0x0150b435, 0x0020c2ba, 0x03ca25ed, 0x0112c9b4, 0x00d5b1ee, 0x027a3c09, 0x003889ea, 0x000b2851}}, Y: Field{[10]uint32{0x0026c551, 0x004398c4, 0x0186f42e, 0x038dd04f, 0x03c5e90b, 0x03e39884, 0x002c6560, 0x028a7c2a, 0x02c692d8, 0x001ed229}}}, + {X: Field{[10]uint32{0x010277bf, 0x02c7c7ce, 0x01c80d57, 0x02977bba, 0x005dd3e0, 0x015f9989, 0x01566d29, 0x006bf0ce, 0x03e16104, 0x002a603f}}, Y: Field{[10]uint32{0x03a1c64c, 0x01051581, 0x007fd10e, 0x0015c739, 0x01457d50, 0x0285d366, 0x03440797, 0x00d0ee1d, 0x03a2a139, 0x000c9dbd}}}, + {X: Field{[10]uint32{0x01cd80bd, 0x0275bab6, 0x026bc957, 0x02639977, 0x01fde41d, 0x026364dc, 0x002954a9, 0x02dd3f16, 0x03d9cbcc, 0x00395c28}}, Y: Field{[10]uint32{0x02973a52, 0x026af905, 0x022df273, 0x01af1f7a, 0x019400bc, 0x00b05a2f, 0x01d30351, 0x00e63826, 0x01776658, 0x00169d24}}}, + {X: Field{[10]uint32{0x03ce1110, 0x025530de, 0x018c972b, 0x03ed988d, 0x0171bd25, 0x024a02eb, 0x013d985d, 0x03d4399b, 0x02b8952c, 0x003d7eea}}, Y: Field{[10]uint32{0x03d77175, 0x03d5fcc7, 0x006cfb02, 0x023400eb, 0x03801081, 0x01229d13, 0x03097c9b, 0x03e08693, 0x01236179, 0x0006b288}}}, + {X: Field{[10]uint32{0x018d89be, 0x0277a85c, 0x03375555, 0x017b136f, 0x016f9e52, 0x012adf1d, 0x0008d258, 0x02a2b055, 0x02fbecbd, 0x000b9650}}, Y: Field{[10]uint32{0x00bc790b, 0x0155bec5, 0x0201640c, 0x006a3032, 0x0230e12a, 0x01ad6498, 0x0123d6cf, 0x02669e3c, 0x0107d141, 0x00254419}}}, + {X: Field{[10]uint32{0x015dd296, 0x00cc006d, 0x0013ea2f, 0x00fe9ce5, 0x010a9fc8, 0x026eadc1, 0x01e7f64a, 0x0267a5b2, 0x00a9891c, 0x0024af41}}, Y: Field{[10]uint32{0x022ba587, 0x0067eb60, 0x01fbf130, 0x00d08859, 0x035cc71c, 0x005eda83, 0x0017ba68, 0x03f67395, 0x0333659b, 0x0033d78d}}}, + {X: Field{[10]uint32{0x03b11083, 0x034c1069, 0x008ffed7, 0x02c219c9, 0x024d0e52, 0x00f77358, 0x00c54269, 0x03ab878f, 0x019fa50f, 0x000c377f}}, Y: Field{[10]uint32{0x02eb42ed, 0x036bd989, 0x0241b14b, 0x003e1eb1, 0x0221bdfa, 0x03d09a72, 0x00389e3d, 0x020fbe86, 0x00fe2bb1, 0x003fc574}}}, + {X: Field{[10]uint32{0x012a9f4f, 0x00e779c9, 0x03f1cbaf, 0x036dcbe9, 0x00067ddd, 0x0115c679, 0x03196882, 0x031a2abc, 0x010bdf8a, 0x00233d45}}, Y: Field{[10]uint32{0x0186cfd5, 0x003f0150, 0x0007a213, 0x02ad0516, 0x002a9963, 0x00232636, 0x0318bc25, 0x02ec660e, 0x017ba299, 0x00130a12}}}, + {X: Field{[10]uint32{0x025e46c7, 0x00ca2149, 0x001b8690, 0x002637b3, 0x014a8e3c, 0x03db765e, 0x02ed9f74, 0x013becf2, 0x02fd5097, 0x0007d2d3}}, Y: Field{[10]uint32{0x039fd399, 0x031bfac5, 0x00a76ee1, 0x00a49940, 0x02685352, 0x011f1f02, 0x00adeb8a, 0x02c0370e, 0x00c7f7c6, 0x001b12c1}}}, + {X: Field{[10]uint32{0x0091af81, 0x00a2c634, 0x029a22a0, 0x02e43cb8, 0x003f915c, 0x004f40e3, 0x01883bad, 0x03e8ce35, 0x0100979a, 0x00275492}}, Y: Field{[10]uint32{0x0002be38, 0x0059e79a, 0x033e1e0f, 0x031c2e69, 0x03db3257, 0x02c5874c, 0x004453d6, 0x01ccb444, 0x013c037c, 0x00102684}}}, + {X: Field{[10]uint32{0x01a2e3a1, 0x01fcd2f7, 0x00734c62, 0x0133cfec, 0x005b0398, 0x0308d00f, 0x01c124c1, 0x036743f5, 0x00e446ee, 0x0014b879}}, Y: Field{[10]uint32{0x008320a7, 0x010c85c2, 0x03e5b262, 0x00c1d69d, 0x02e2dbc6, 0x00b05c4e, 0x004104f1, 0x03fea30f, 0x03317375, 0x0019d295}}}, + {X: Field{[10]uint32{0x02401c8b, 0x00bdea05, 0x03148fd2, 0x024e9df5, 0x020e0a6c, 0x031b8dbe, 0x00a8b6e7, 0x0138c79b, 0x031a8eef, 0x00209ec5}}, Y: Field{[10]uint32{0x03ca7540, 0x017cd93d, 0x01f08827, 0x03e84a7e, 0x001d58c7, 0x01e2e845, 0x026d14cb, 0x00073df7, 0x01fdd9b8, 0x00197361}}}, + {X: Field{[10]uint32{0x00df2f9b, 0x03e45edb, 0x00383c83, 0x01506fa8, 0x023db299, 0x0160b891, 0x01abc32e, 0x025909a8, 0x01e961d8, 0x000493d1}}, Y: Field{[10]uint32{0x038d6c62, 0x02d359e5, 0x00f8358b, 0x01f484e9, 0x03e48e7a, 0x018a23e1, 0x020626fc, 0x0196c4b5, 0x03e4110b, 0x001cd38b}}}, + {X: Field{[10]uint32{0x024d67e2, 0x03d5a666, 0x011695f5, 0x035b0234, 0x00fb4ac9, 0x02648131, 0x024f0028, 0x02cc9043, 0x029818b2, 0x0000edc4}}, Y: Field{[10]uint32{0x02c27c3b, 0x01f07ed0, 0x02218560, 0x01a2862b, 0x0154ba63, 0x03119582, 0x0010c51e, 0x005ad570, 0x038b0cee, 0x000a2dbd}}}, + {X: Field{[10]uint32{0x012d8a00, 0x000ced54, 0x020a4290, 0x02871fdf, 0x02e2b887, 0x029ab9c3, 0x0264485e, 0x014d8c39, 0x007e063b, 0x00349c76}}, Y: Field{[10]uint32{0x016da847, 0x008e3ae7, 0x01c9b510, 0x009cd25c, 0x0060ef59, 0x03619134, 0x03122ba8, 0x038a009c, 0x00047865, 0x0019750e}}}, + {X: Field{[10]uint32{0x00dc03a7, 0x0252c943, 0x01661e84, 0x0326b9ef, 0x000c5ca0, 0x00ae954b, 0x00d2d82e, 0x0145819f, 0x01852db3, 0x0007471b}}, Y: Field{[10]uint32{0x02691f62, 0x02c40153, 0x02ebbae8, 0x0132f75e, 0x01e19f87, 0x02bba80d, 0x01b68407, 0x00095bba, 0x00c5673a, 0x002f0c7d}}}, + {X: Field{[10]uint32{0x02efdd9d, 0x01d5bf51, 0x007fb1d3, 0x0331a559, 0x00bf8d2e, 0x02e81f79, 0x02d274c0, 0x02530376, 0x01b471e3, 0x0023fba2}}, Y: Field{[10]uint32{0x012b8c6c, 0x0298bc6f, 0x034c434c, 0x01c51aa6, 0x034ba5cf, 0x00663e73, 0x03ae1487, 0x015e3f45, 0x00c38479, 0x001757b4}}}, + {X: Field{[10]uint32{0x0010a6ec, 0x03ef4c22, 0x02ce55d7, 0x017e4236, 0x018ef938, 0x038fb91d, 0x026302cc, 0x03cd4580, 0x030955a0, 0x001a07f3}}, Y: Field{[10]uint32{0x02a38faa, 0x00d63280, 0x00885e6d, 0x03d0643c, 0x00aa54e8, 0x013195d7, 0x0187edbc, 0x01d89200, 0x035b9992, 0x0010c1fd}}}, + {X: Field{[10]uint32{0x03a6971b, 0x024a4dec, 0x02918907, 0x0225ff0c, 0x026f6c1a, 0x001334f8, 0x0184a289, 0x029c6da9, 0x02ddfcb5, 0x001c5ff5}}, Y: Field{[10]uint32{0x00b17992, 0x036167d6, 0x02511d7c, 0x0174d075, 0x021b05e2, 0x01fdb6a3, 0x00405532, 0x02b4137f, 0x002971d4, 0x002d00fe}}}, + {X: Field{[10]uint32{0x014f2ff6, 0x0004f8dd, 0x03a34227, 0x01e71cc8, 0x00d29832, 0x02b630d0, 0x01f49986, 0x025e1b70, 0x032394eb, 0x003cae55}}, Y: Field{[10]uint32{0x0366763b, 0x02925f9d, 0x0120ddba, 0x00179e99, 0x03bb69e7, 0x02645edc, 0x009645dd, 0x033505c6, 0x03813efd, 0x002d54f4}}}, + {X: Field{[10]uint32{0x02730b1b, 0x01d21765, 0x017b1423, 0x0340755b, 0x019ab6fe, 0x00504d70, 0x0309b524, 0x01b22594, 0x03e6d7d8, 0x00161c52}}, Y: Field{[10]uint32{0x03e3e533, 0x0293579b, 0x03cf81c9, 0x01717e93, 0x03403984, 0x0038c54d, 0x02b84abf, 0x03396f7a, 0x03343e38, 0x00030047}}}, + {X: Field{[10]uint32{0x026ff3c3, 0x0056f01e, 0x0223b7f9, 0x03eecafa, 0x02b30819, 0x0271ad3e, 0x0300d49e, 0x03e306e5, 0x01abc828, 0x0034cf39}}, Y: Field{[10]uint32{0x01a23395, 0x0293045d, 0x0156fcac, 0x013cdf6e, 0x01ef5939, 0x03ef88bc, 0x0372ba63, 0x01262088, 0x02223913, 0x001ce6d8}}}, + {X: Field{[10]uint32{0x03b55479, 0x01ec9b58, 0x020d5983, 0x00235be4, 0x02249048, 0x00bdf652, 0x03a58ff4, 0x0004a13a, 0x0232fc7d, 0x0020880b}}, Y: Field{[10]uint32{0x0163b4c8, 0x000ced89, 0x0004dedd, 0x000a6800, 0x0063aa32, 0x02b0b220, 0x004fb0a8, 0x015793f3, 0x015450aa, 0x003f798e}}}, + {X: Field{[10]uint32{0x01ea7781, 0x027e9f0b, 0x022b7041, 0x021e8d09, 0x02941e64, 0x00322d92, 0x0300e370, 0x013223e8, 0x02185bfb, 0x0009798c}}, Y: Field{[10]uint32{0x0316e640, 0x03736fbd, 0x02a1142d, 0x00915230, 0x0209caa1, 0x019cc75f, 0x032d84cc, 0x02ae6537, 0x03074802, 0x002b9a5a}}}, + {X: Field{[10]uint32{0x005c114e, 0x006a56d8, 0x0048753c, 0x00e87bf7, 0x039da877, 0x010e837f, 0x0068a363, 0x01386bc9, 0x0205b925, 0x00380cda}}, Y: Field{[10]uint32{0x03b12a18, 0x036762eb, 0x01050d96, 0x0056776b, 0x015ba059, 0x011899b1, 0x03974553, 0x0368e1e6, 0x0160377a, 0x001075d6}}}, + {X: Field{[10]uint32{0x02996662, 0x01cc6aa6, 0x0375262d, 0x016b6d5e, 0x0134ee87, 0x01092270, 0x01a9253e, 0x02c6f472, 0x03af7fd2, 0x00210cd8}}, Y: Field{[10]uint32{0x03cde6ca, 0x034d58bf, 0x004734d2, 0x02c59b92, 0x0012c4b3, 0x0054e8ca, 0x00bda36f, 0x03c04fb5, 0x02d1dbfc, 0x00397028}}}, + {X: Field{[10]uint32{0x011178de, 0x03d8cca5, 0x03c0526d, 0x000a74a0, 0x03abb9f2, 0x029f95d8, 0x03955cff, 0x01fc63e5, 0x00b81cdb, 0x002b6c84}}, Y: Field{[10]uint32{0x00ea0e35, 0x02e4695d, 0x02cf068e, 0x03b0b86f, 0x01364db5, 0x0122be84, 0x03847219, 0x00aa9835, 0x0305d818, 0x000b0847}}}, + {X: Field{[10]uint32{0x024d7491, 0x019450bc, 0x036e088b, 0x0139615e, 0x02203460, 0x02684de4, 0x013854f5, 0x0088d7ba, 0x03a1a2fe, 0x002ac317}}, Y: Field{[10]uint32{0x000124d2, 0x00bde16e, 0x0132b8d9, 0x0337b29a, 0x03b9dc48, 0x01ce0d54, 0x00a73840, 0x01b855c7, 0x01cbe36d, 0x003951c9}}}, + {X: Field{[10]uint32{0x0085deda, 0x02f2235e, 0x01835f9c, 0x002d9eb3, 0x03868a08, 0x03d3d51c, 0x03124b0a, 0x018f90fc, 0x037a1d21, 0x000f9779}}, Y: Field{[10]uint32{0x01746630, 0x03994745, 0x036d2254, 0x03130dfb, 0x02e1927d, 0x01dfd452, 0x03e66b83, 0x000ee2e0, 0x00a42f95, 0x0029bb4d}}}, + {X: Field{[10]uint32{0x0191ec05, 0x03abbd92, 0x01ceb050, 0x0057e0ea, 0x01321848, 0x03ccbd9c, 0x031f0688, 0x034c996d, 0x033d31d1, 0x001831a2}}, Y: Field{[10]uint32{0x0000d498, 0x0183f29f, 0x0132a9d7, 0x00a5403b, 0x01898867, 0x021dcde9, 0x01aecbe9, 0x009322a5, 0x00619f7d, 0x0025deb3}}}, + {X: Field{[10]uint32{0x01c135e2, 0x0316cc5a, 0x0065464f, 0x00a5afa8, 0x014a1267, 0x019ae6c9, 0x0004a76a, 0x039656db, 0x02e9b646, 0x00086c14}}, Y: Field{[10]uint32{0x000779e7, 0x00262715, 0x0128538f, 0x035166aa, 0x0318db6e, 0x02c37f5f, 0x007292c4, 0x035c5dba, 0x00cd2fb3, 0x00040a79}}}, + {X: Field{[10]uint32{0x03523d68, 0x01f6e8de, 0x0379dc02, 0x03bd6c47, 0x02f58bb2, 0x002f9332, 0x0101e666, 0x011457b9, 0x02f37c66, 0x0001c032}}, Y: Field{[10]uint32{0x03a08be1, 0x024d31db, 0x00948e1a, 0x01f95bb7, 0x008eac9b, 0x02655e0c, 0x032487c1, 0x011bccb8, 0x0388f1c3, 0x001f7dda}}}, + {X: Field{[10]uint32{0x01541e8d, 0x01a59912, 0x01696299, 0x02bd5969, 0x015d34ae, 0x019160c5, 0x01f1c9f5, 0x02112b39, 0x03d21293, 0x00316ae6}}, Y: Field{[10]uint32{0x01c422d8, 0x0184c100, 0x02f29c03, 0x00315f6c, 0x029b34d9, 0x03b14e9f, 0x01f44678, 0x01b22a83, 0x01c6c61d, 0x000b4820}}}, + {X: Field{[10]uint32{0x016d75a3, 0x034dda80, 0x023dfa4a, 0x0375751a, 0x005713fb, 0x03085476, 0x00d15af8, 0x01770512, 0x032ed53f, 0x0022bf0f}}, Y: Field{[10]uint32{0x039b6c8f, 0x02c69392, 0x0389764d, 0x004fcd15, 0x036767c5, 0x00864f9a, 0x015a99d4, 0x02fb6780, 0x03932627, 0x000047d8}}}, + {X: Field{[10]uint32{0x025007a7, 0x01cf140e, 0x034d86e1, 0x019fb7a7, 0x02c0d698, 0x01eb8da0, 0x00cf7292, 0x03ab7f3d, 0x01c6bb55, 0x001052b6}}, Y: Field{[10]uint32{0x03603585, 0x0374e823, 0x03fd6181, 0x020bb6f7, 0x01dafb6f, 0x019e951b, 0x002306b6, 0x026c7444, 0x00f8f4de, 0x00312f34}}}, + {X: Field{[10]uint32{0x0304a1e3, 0x005c91f2, 0x008fdb23, 0x034eabc2, 0x01a163a2, 0x037109b4, 0x005ec88f, 0x01cc5ea7, 0x0240b84b, 0x00208478}}, Y: Field{[10]uint32{0x02722bbb, 0x0250ab49, 0x029be4e7, 0x02c5c2a7, 0x03a74f10, 0x016586cc, 0x006c4f6d, 0x02fd453c, 0x019bb268, 0x00329da9}}}, + {X: Field{[10]uint32{0x02ba700e, 0x01676bc8, 0x012f429e, 0x02450fb9, 0x023f7cd2, 0x00252c9e, 0x02c44523, 0x0374f1d7, 0x0132363a, 0x0029537f}}, Y: Field{[10]uint32{0x02d4490b, 0x02364bae, 0x02bbb279, 0x01d1aa4f, 0x013639ac, 0x026d1219, 0x038d1304, 0x000260f8, 0x022c5951, 0x003c5820}}}, + {X: Field{[10]uint32{0x018860f7, 0x029f2e52, 0x015e9a3b, 0x010f3ef6, 0x03e2921a, 0x0387a74f, 0x02ee1a81, 0x026c629e, 0x005552b2, 0x001df593}}, Y: Field{[10]uint32{0x0208ff10, 0x01bcb9e0, 0x025978d0, 0x02a43325, 0x020fed03, 0x01b6681a, 0x00ad9d73, 0x0323d110, 0x00f95ea9, 0x003a5eee}}}, + {X: Field{[10]uint32{0x02309ca9, 0x0251f85b, 0x03d61ba7, 0x000d83c4, 0x011b57c1, 0x00396862, 0x007f0f5f, 0x01afc47d, 0x0014b33e, 0x001216ce}}, Y: Field{[10]uint32{0x00e38bdb, 0x02098c81, 0x01b5f152, 0x01bcb1e0, 0x03f99857, 0x011b2194, 0x0050dd09, 0x01f18a98, 0x0070ce60, 0x0039aede}}}, + {X: Field{[10]uint32{0x0072739c, 0x01c1a3c0, 0x029aab0a, 0x032052bb, 0x017ced2a, 0x02dbb714, 0x03618be1, 0x01e30b7b, 0x01eca90a, 0x003b48e0}}, Y: Field{[10]uint32{0x034954c7, 0x0117fec4, 0x00fbc3de, 0x0058b284, 0x02d68599, 0x018d4e07, 0x00c291ec, 0x019148e0, 0x03e0ba32, 0x0032c21c}}}, + {X: Field{[10]uint32{0x00ed971d, 0x01795f11, 0x03a684a6, 0x019a3cb9, 0x02955b6a, 0x0132e83f, 0x03c7369a, 0x03049f20, 0x0379d36b, 0x0039112b}}, Y: Field{[10]uint32{0x03785fff, 0x031553f4, 0x034e9dd7, 0x03780434, 0x02ec50e5, 0x02922662, 0x0355ca16, 0x0208eaab, 0x030327b6, 0x0029e1db}}}, + {X: Field{[10]uint32{0x01fc1fca, 0x035f941a, 0x0278c07e, 0x022a5b2c, 0x03b8677b, 0x014bfa93, 0x024296c1, 0x0168b57d, 0x00d77de7, 0x002be30d}}, Y: Field{[10]uint32{0x0184d673, 0x0330ec8a, 0x00a8cf9e, 0x032e2e07, 0x02f3c451, 0x0118caf8, 0x015899f2, 0x0306a339, 0x0062ab6e, 0x00123396}}}, + {X: Field{[10]uint32{0x027efe13, 0x0150db3d, 0x000cbe31, 0x0221d812, 0x0108940c, 0x0368128c, 0x02745a81, 0x0113b463, 0x0066243a, 0x003a6675}}, Y: Field{[10]uint32{0x0237fe36, 0x0347ec00, 0x013cb2f7, 0x03adfea0, 0x00ef55d3, 0x0337b6f4, 0x02ac0e75, 0x01198708, 0x027063a8, 0x003d07a3}}}, + {X: Field{[10]uint32{0x004bcc72, 0x026d9118, 0x02d66e20, 0x02a962dc, 0x00072caf, 0x00bf7afb, 0x00c923a0, 0x0193fe8f, 0x00aa7d89, 0x003103be}}, Y: Field{[10]uint32{0x03238ce5, 0x03c189ed, 0x02c2f696, 0x031ecfbe, 0x00ff50eb, 0x01dbccde, 0x012c3b61, 0x02879bc4, 0x01b56549, 0x0012038d}}}, + {X: Field{[10]uint32{0x0252982f, 0x006c3ce6, 0x026151bd, 0x02288a89, 0x01679e4b, 0x00826a97, 0x012b546e, 0x01267226, 0x001de3f9, 0x00120bb9}}, Y: Field{[10]uint32{0x00d3de3d, 0x03fba077, 0x009f832e, 0x03b28395, 0x03563f92, 0x03843b1b, 0x012eff0e, 0x006054b5, 0x0070d213, 0x00144398}}}, + {X: Field{[10]uint32{0x0058fae5, 0x033dc997, 0x01fd465d, 0x00cb180a, 0x036df7ca, 0x034dbe2d, 0x0003c694, 0x0307599c, 0x006825a3, 0x00119829}}, Y: Field{[10]uint32{0x0223f618, 0x02fe842e, 0x017c0700, 0x0380540e, 0x03791de8, 0x00b6b7a5, 0x00acc720, 0x030a5a62, 0x03f546b5, 0x000f660a}}}, + {X: Field{[10]uint32{0x035d8f8d, 0x022fbc3a, 0x00d8703c, 0x0385d8c5, 0x00d8a3ae, 0x01d62665, 0x031dc033, 0x01bc2cfe, 0x024c92ba, 0x002e1798}}, Y: Field{[10]uint32{0x0175679b, 0x01861a2b, 0x0148688c, 0x009a19b3, 0x03e2cdff, 0x02cdbbdd, 0x03ff93ef, 0x016e9092, 0x033320a5, 0x002224da}}}, + {X: Field{[10]uint32{0x002683e3, 0x0261d524, 0x014c6b16, 0x00be53be, 0x03b3be28, 0x018bf56c, 0x0187ebab, 0x009afef4, 0x00b5361a, 0x00290648}}, Y: Field{[10]uint32{0x015ea98a, 0x031e92b8, 0x007d1491, 0x027c9819, 0x02c95a8f, 0x00814f80, 0x027201b3, 0x00ed34f4, 0x019629d9, 0x001de428}}}, + {X: Field{[10]uint32{0x03b7f86e, 0x025e7d3e, 0x03937055, 0x022c5541, 0x01ed1abf, 0x03c40762, 0x012f01bb, 0x00a980c9, 0x01a97926, 0x0024e20b}}, Y: Field{[10]uint32{0x009d7e44, 0x01024406, 0x03e0215a, 0x03c4fb4d, 0x0223e570, 0x0357c08b, 0x037450ba, 0x005bbc04, 0x004df0a7, 0x00024e22}}}, + {X: Field{[10]uint32{0x00952e00, 0x008c8972, 0x03b0679c, 0x016799bb, 0x03ebfa6a, 0x01c26c65, 0x0356b643, 0x036982b3, 0x01f83efe, 0x00284142}}, Y: Field{[10]uint32{0x024d1ddb, 0x03c19df0, 0x015fe830, 0x0291f038, 0x005a06e7, 0x0132b93e, 0x0237df52, 0x03793426, 0x03d5559b, 0x001d6420}}}, + {X: Field{[10]uint32{0x03eb3651, 0x02c7be4a, 0x02d294b3, 0x00122a89, 0x03c55de7, 0x03f9d7ab, 0x017e587d, 0x0109e1cf, 0x02976ea7, 0x000ae516}}, Y: Field{[10]uint32{0x02893c65, 0x003bd941, 0x03752698, 0x0043976b, 0x03cb488d, 0x0002d146, 0x01cbabce, 0x02fdae74, 0x03ed27cc, 0x00108f01}}}, + {X: Field{[10]uint32{0x03cc37f0, 0x01115ec3, 0x01073b59, 0x0244a354, 0x03f69516, 0x00fc5c05, 0x0203da01, 0x02ff9003, 0x01bbc1a0, 0x0021be76}}, Y: Field{[10]uint32{0x024c32bb, 0x031b19d1, 0x007eddf3, 0x00099249, 0x0362388f, 0x02f067a3, 0x039cd4bf, 0x00de5a4c, 0x02242e30, 0x003cdc31}}}, + {X: Field{[10]uint32{0x0161ed91, 0x0343e0f7, 0x0206c016, 0x003e42a4, 0x033aa9cc, 0x02f6d384, 0x038d8958, 0x00113988, 0x02f9555e, 0x003e2656}}, Y: Field{[10]uint32{0x02a8a060, 0x00964853, 0x014bcd08, 0x024d2bc6, 0x031febdb, 0x013e8b98, 0x00bdab83, 0x004b20ee, 0x02e31bee, 0x002cb534}}}, + {X: Field{[10]uint32{0x019394ce, 0x015105e0, 0x01dbe2f5, 0x00858f42, 0x00fdea26, 0x02ef071d, 0x01eee7f0, 0x00d4b515, 0x027f69eb, 0x002ad568}}, Y: Field{[10]uint32{0x031b801a, 0x01988038, 0x013534a1, 0x012a25e2, 0x024d5467, 0x012a4c38, 0x0373bc17, 0x0216d5c8, 0x009360f5, 0x0022b159}}}, + {X: Field{[10]uint32{0x023b9fa6, 0x022645a8, 0x02522e8a, 0x00ffeb6b, 0x03ce8472, 0x017a60d4, 0x02a89069, 0x037e6245, 0x02c9c428, 0x0013f041}}, Y: Field{[10]uint32{0x02b92031, 0x00c5a227, 0x02fd1925, 0x0129f066, 0x01fdebbc, 0x00e49a1f, 0x00c88be3, 0x00d0793d, 0x02e83d54, 0x002435cc}}}, + {X: Field{[10]uint32{0x03149a91, 0x01af2080, 0x036b2462, 0x036c2e81, 0x03874080, 0x00ea2538, 0x0187b257, 0x03332ddf, 0x01808831, 0x00327216}}, Y: Field{[10]uint32{0x02abf0b8, 0x00c0b8ec, 0x026e6a6f, 0x01a1e015, 0x02c5f992, 0x002f7e8d, 0x01a6355f, 0x0127e6fa, 0x00cd8c09, 0x0027eb53}}}, + {X: Field{[10]uint32{0x005209e7, 0x01dc5247, 0x00cb7aee, 0x01737756, 0x01a278eb, 0x028508bf, 0x0378c46a, 0x02aee97f, 0x037e2293, 0x003032d6}}, Y: Field{[10]uint32{0x0210c47b, 0x0035ccd3, 0x027d5133, 0x027bb634, 0x03cc7278, 0x0037d328, 0x036b572d, 0x02161976, 0x002e3664, 0x0020407d}}}, + {X: Field{[10]uint32{0x00ce0b63, 0x03c56436, 0x0215d140, 0x03383ef3, 0x01af2f70, 0x0246f75a, 0x02ab60c3, 0x00fe0d1c, 0x03c516d9, 0x0036ff00}}, Y: Field{[10]uint32{0x02d26564, 0x023054ff, 0x03b46465, 0x00937af1, 0x024811fa, 0x00ddaa93, 0x033ecfec, 0x0328ba68, 0x014d7228, 0x003e0e38}}}, + {X: Field{[10]uint32{0x004f59c8, 0x00fcf4d2, 0x03af37cc, 0x02e58b8e, 0x00435140, 0x00d581ec, 0x031d8910, 0x00ffc455, 0x0285eea1, 0x00378981}}, Y: Field{[10]uint32{0x01cfbbcc, 0x023eb966, 0x00accd7f, 0x0132a97e, 0x02c1f5f5, 0x02d9bc79, 0x0363335b, 0x01619798, 0x02c9a602, 0x001af08f}}}, + {X: Field{[10]uint32{0x02a2e71e, 0x00f162fe, 0x01e5f6f7, 0x027f1e06, 0x031ed812, 0x01b05fae, 0x0362f79f, 0x023f6c06, 0x0160b8cb, 0x001635e3}}, Y: Field{[10]uint32{0x004bccc1, 0x029014ed, 0x0353140a, 0x00f6ec98, 0x03b04d6d, 0x018e444c, 0x0222f5e1, 0x0319c630, 0x00f2fd6b, 0x001f2ef9}}}, + {X: Field{[10]uint32{0x0000a490, 0x03afbf8b, 0x01738211, 0x004bd91b, 0x03fde1af, 0x0000538e, 0x00869aa9, 0x013f96ac, 0x031aeed5, 0x0039cae6}}, Y: Field{[10]uint32{0x00af4fc2, 0x03cc9ce4, 0x01d348cf, 0x01a5df49, 0x00d94659, 0x00b320a8, 0x02af020a, 0x0160ce10, 0x014d8f59, 0x003364b4}}}, + {X: Field{[10]uint32{0x030fd658, 0x03cd2355, 0x0085b3b9, 0x00508885, 0x00b725f6, 0x0277fe2a, 0x03cef97c, 0x016f862d, 0x03aed55a, 0x0001aa1a}}, Y: Field{[10]uint32{0x032c5724, 0x001b59fb, 0x01d4081c, 0x00515c6a, 0x0360a14f, 0x01c27ea1, 0x03121407, 0x00c05440, 0x02914c3b, 0x0004e289}}}, + {X: Field{[10]uint32{0x030a1fc5, 0x0002bbae, 0x0316e0e1, 0x0386d891, 0x03b17c39, 0x0193f0a0, 0x00b00595, 0x03c9135b, 0x00f67240, 0x00072823}}, Y: Field{[10]uint32{0x01ef0a55, 0x011ecff6, 0x0016ab34, 0x010d3a70, 0x03deec27, 0x019ab7c1, 0x0236317c, 0x0027b0d2, 0x03ce655d, 0x0008b893}}}, + {X: Field{[10]uint32{0x024a0b0f, 0x01608060, 0x016070f5, 0x022bf525, 0x02b7cf62, 0x03377ddb, 0x021ee30b, 0x012711cf, 0x0128feba, 0x00365770}}, Y: Field{[10]uint32{0x03c7e8a1, 0x00b135b1, 0x02116161, 0x02eab8bf, 0x03633e98, 0x01a6da38, 0x0061274c, 0x0384df44, 0x02b8fea3, 0x00354d02}}}, + {X: Field{[10]uint32{0x00d83857, 0x001cfe33, 0x03afcf3c, 0x022f6661, 0x03ae7e28, 0x01a6a22e, 0x03a14e47, 0x035405b0, 0x022a7f4f, 0x000b3334}}, Y: Field{[10]uint32{0x033b389e, 0x01593741, 0x01f3b0f2, 0x00513b6d, 0x00c2a7b6, 0x03e393ee, 0x010f849f, 0x027f6d1c, 0x023caea8, 0x002ba099}}}, + {X: Field{[10]uint32{0x01628a43, 0x03afac25, 0x001d1c5e, 0x03207ca0, 0x01ae4a9a, 0x0375ed04, 0x03bc0037, 0x03788e4d, 0x01f6c8e4, 0x003b05ed}}, Y: Field{[10]uint32{0x0258df83, 0x01b9ba59, 0x007348e6, 0x0083c1e6, 0x03743196, 0x01a3f9c3, 0x01fa2989, 0x0056c18c, 0x011dfd58, 0x002cf835}}}, + {X: Field{[10]uint32{0x0096b6f4, 0x0216225b, 0x023ca956, 0x00b22eb3, 0x00cee8e1, 0x033c7326, 0x0213cddc, 0x01fd3869, 0x037e6290, 0x00298eab}}, Y: Field{[10]uint32{0x02e8216e, 0x01500c6b, 0x00deeef7, 0x01f7a003, 0x01f8bc1a, 0x00c95688, 0x0144ab12, 0x0265cfa7, 0x02bcdc5f, 0x000be54f}}}, + {X: Field{[10]uint32{0x03ad32f3, 0x03805a61, 0x00b2c550, 0x02bc6685, 0x0390e345, 0x00a5b44d, 0x005636cb, 0x023435ad, 0x0330318d, 0x0023ad3f}}, Y: Field{[10]uint32{0x00a4a3e3, 0x022bddc3, 0x031718f2, 0x0144209f, 0x020cc01d, 0x017aeddd, 0x0200151c, 0x03f1f9f5, 0x038bae7f, 0x0012e388}}}, + {X: Field{[10]uint32{0x0276b8d2, 0x012b7660, 0x02341437, 0x0232d1c4, 0x002432fa, 0x01298ebb, 0x038a6e57, 0x010e5fd5, 0x00afbb5b, 0x002ac508}}, Y: Field{[10]uint32{0x00b94396, 0x03995fd9, 0x0357490c, 0x0335fdd6, 0x038f264a, 0x029e5562, 0x039df900, 0x03a49d96, 0x028ea197, 0x003ebd8c}}}, + {X: Field{[10]uint32{0x006f680a, 0x002f46a2, 0x03b5e963, 0x01acd23f, 0x015102aa, 0x00756667, 0x0016f1cc, 0x0286ab73, 0x010e6b2b, 0x0036a862}}, Y: Field{[10]uint32{0x012fa209, 0x03db7e8d, 0x0051094b, 0x0170b088, 0x038744f0, 0x03caef48, 0x02f6005c, 0x03ae532d, 0x03695a63, 0x00067eb2}}}, + {X: Field{[10]uint32{0x032a28e3, 0x033d91df, 0x03f2e0b1, 0x010af48b, 0x03cb08a6, 0x03e3aedc, 0x01a1b0ed, 0x0346d226, 0x012e5398, 0x003c667d}}, Y: Field{[10]uint32{0x02c2f454, 0x02d66167, 0x03d9e5c1, 0x02b15526, 0x012d5278, 0x01fbe6dd, 0x00f87476, 0x004c7533, 0x03aba5e2, 0x000d866a}}}, + {X: Field{[10]uint32{0x0046ad6a, 0x014888fc, 0x00046e27, 0x03d6727f, 0x01e75c86, 0x025e928d, 0x0320bc14, 0x03b3cdaf, 0x0293a5f9, 0x00060aa7}}, Y: Field{[10]uint32{0x03b8bcfd, 0x0079223f, 0x007a5c73, 0x0328d2bc, 0x03e0924d, 0x021585f1, 0x0067693d, 0x03b8632a, 0x0288c39d, 0x00318257}}}, + {X: Field{[10]uint32{0x0214abbb, 0x0026552c, 0x0327c3b5, 0x02b82418, 0x025ac21e, 0x0109dfec, 0x020a7016, 0x03f99ad9, 0x03530636, 0x00022932}}, Y: Field{[10]uint32{0x01d0ed1c, 0x035a49a8, 0x00bbf63f, 0x01709540, 0x008efcb8, 0x0349758e, 0x02e707fa, 0x02a5048f, 0x00514cc6, 0x001a4f96}}}, + {X: Field{[10]uint32{0x008c1282, 0x00224597, 0x018d42b2, 0x023204ef, 0x02f49517, 0x00b1565c, 0x01e31058, 0x030cf845, 0x035a3b40, 0x0012404c}}, Y: Field{[10]uint32{0x004214e3, 0x02760072, 0x0016624d, 0x00393778, 0x00f26a9a, 0x0387c3a5, 0x02c70eb9, 0x01d03772, 0x0176429d, 0x0011c01c}}}, + {X: Field{[10]uint32{0x004e01dd, 0x01048ca6, 0x02b8fcdf, 0x01772b60, 0x01df64f5, 0x02e7cb81, 0x01b49e14, 0x00d8ad18, 0x01a77c34, 0x00206039}}, Y: Field{[10]uint32{0x0305040b, 0x01d0ab2b, 0x03e650de, 0x02704c3c, 0x01cb3fb4, 0x0016b247, 0x034b0fd0, 0x03c402a8, 0x0221d4b9, 0x000d33d5}}}, + {X: Field{[10]uint32{0x0251ee9f, 0x0217f84d, 0x032a4b10, 0x01f2df48, 0x01a90e1d, 0x023aa975, 0x00aeee35, 0x03d2a277, 0x027efea9, 0x0023dc48}}, Y: Field{[10]uint32{0x0255ad73, 0x036bd3a5, 0x01aaee90, 0x01aaf011, 0x03e27267, 0x02e4531f, 0x03c344f3, 0x01e68289, 0x01bcbb2b, 0x00293685}}}, + {X: Field{[10]uint32{0x03b58264, 0x023508f3, 0x02a3ccc6, 0x02a96821, 0x02d1ea8e, 0x00f30669, 0x03592a2a, 0x02eb2c20, 0x0374cdc9, 0x0036fae6}}, Y: Field{[10]uint32{0x00576161, 0x000268d0, 0x022d45b1, 0x03e6d967, 0x0018e86d, 0x02785aef, 0x00732eb7, 0x01fed60c, 0x039283f0, 0x002f99a1}}}, + {X: Field{[10]uint32{0x01591933, 0x02985f5c, 0x02958ab0, 0x037e0c5e, 0x017d9ea4, 0x02014a37, 0x03b09b62, 0x00b2b0f1, 0x013fa7f5, 0x003cca3a}}, Y: Field{[10]uint32{0x02405547, 0x0108c47c, 0x00a60fc0, 0x005f5faf, 0x002f780c, 0x036174e5, 0x01c3f3a7, 0x027a4187, 0x0059811f, 0x001073a3}}}, + {X: Field{[10]uint32{0x00fea051, 0x0033c20c, 0x00b7d8fb, 0x020544c7, 0x01d4ca41, 0x00087091, 0x005f44c2, 0x006fb127, 0x0003416b, 0x0015b53d}}, Y: Field{[10]uint32{0x00bd39ce, 0x028eb614, 0x002a8d35, 0x024b8f60, 0x0051ae1a, 0x035773a3, 0x00cb6373, 0x01defa4d, 0x0133948f, 0x003317d8}}}, + {X: Field{[10]uint32{0x039022b8, 0x03d3af00, 0x03c49e9c, 0x03e819f3, 0x01dd90c9, 0x00c9ff50, 0x02becf2a, 0x01dadf33, 0x004b8bb4, 0x002388b8}}, Y: Field{[10]uint32{0x00286b8b, 0x0064ecc2, 0x01d6d3e4, 0x024b0b20, 0x00934e79, 0x0074fbd6, 0x0103c023, 0x01a5b4d3, 0x02603204, 0x00007e3e}}}, + {X: Field{[10]uint32{0x02f064f6, 0x019f5e83, 0x00e1a518, 0x01cafe7f, 0x02b396eb, 0x033fbeb7, 0x03624dc1, 0x01f1a3e4, 0x02e4b9a7, 0x000d06c8}}, Y: Field{[10]uint32{0x02d9441a, 0x023fe2e4, 0x01e27cfc, 0x01c9f4ca, 0x03af11ed, 0x036f2cb6, 0x0162bcf0, 0x01a55d65, 0x03877bc3, 0x002560e7}}}, + {X: Field{[10]uint32{0x03324763, 0x02c8098e, 0x0305045e, 0x02670002, 0x00e6af97, 0x013ee2a3, 0x01e86809, 0x01044a1e, 0x02939f23, 0x000fa90b}}, Y: Field{[10]uint32{0x0201a623, 0x01af544b, 0x02f59186, 0x028ce2c5, 0x0160a5c0, 0x03b3ea3f, 0x024d51ff, 0x029bc13f, 0x01676f5a, 0x00110c90}}}, + {X: Field{[10]uint32{0x035d625b, 0x0249efd4, 0x0317342f, 0x01829c70, 0x0023d8a6, 0x02337a47, 0x00faa1bb, 0x01453be5, 0x004cef10, 0x002bf9ed}}, Y: Field{[10]uint32{0x008b4b65, 0x02b3f21f, 0x0042751c, 0x01dde8e2, 0x026cfcdd, 0x012c18fb, 0x0151f185, 0x021dcaf3, 0x03885121, 0x001d85e9}}}, + {X: Field{[10]uint32{0x02034d2b, 0x00fef9a8, 0x01dda37a, 0x038ffc38, 0x0112f69e, 0x00b00d74, 0x00ac725f, 0x003531b8, 0x0202abb4, 0x0028d832}}, Y: Field{[10]uint32{0x016b646d, 0x020c9a64, 0x03814fab, 0x01e49568, 0x039d8bbe, 0x0298211b, 0x01d0f723, 0x00fa80c1, 0x01783fec, 0x0005879c}}}, + {X: Field{[10]uint32{0x00011b88, 0x012a16de, 0x0361ec91, 0x02304667, 0x035984d1, 0x02cbb37d, 0x025d9899, 0x03f9f66d, 0x025ff7d9, 0x00041213}}, Y: Field{[10]uint32{0x0176cdc9, 0x01135be5, 0x031844f7, 0x00f5e3de, 0x03e7f4e0, 0x00b05127, 0x01e1086c, 0x01cd5e7b, 0x00e21e13, 0x0004b470}}}, + {X: Field{[10]uint32{0x0256b138, 0x030e71b4, 0x01ba67ee, 0x03996c14, 0x02b11245, 0x0369f79a, 0x0276c40e, 0x02777090, 0x00e15dad, 0x001db0b7}}, Y: Field{[10]uint32{0x0064ce82, 0x033bc57f, 0x03605ed4, 0x01f4fac3, 0x0361a896, 0x010dce68, 0x023fca2a, 0x0020e64b, 0x01ce585b, 0x00366980}}}, + {X: Field{[10]uint32{0x01d4d2e1, 0x0266dd44, 0x0335627b, 0x0220e951, 0x03d1d839, 0x00f71831, 0x004fcb18, 0x03b662c1, 0x01d4c3e6, 0x0019c68c}}, Y: Field{[10]uint32{0x02053088, 0x034dc6c3, 0x01b3b08a, 0x017a94b0, 0x01281f18, 0x03d0ea12, 0x033762fb, 0x03bcfdfb, 0x01152005, 0x001bf763}}}, + {X: Field{[10]uint32{0x02898a37, 0x0384ad9b, 0x032431be, 0x016e9bc5, 0x00c2343a, 0x01fdc706, 0x03729985, 0x01a40c4a, 0x0165a2da, 0x0024743d}}, Y: Field{[10]uint32{0x0332f681, 0x02c8275f, 0x0147a41e, 0x0359c924, 0x01e6393a, 0x007df377, 0x02906a10, 0x028a2355, 0x01b91956, 0x00275a95}}}, + {X: Field{[10]uint32{0x028512ba, 0x03ba6ad8, 0x032d4de9, 0x0379c902, 0x006b90d8, 0x03d37dee, 0x014d0cd8, 0x028b0f2f, 0x00581953, 0x001f967c}}, Y: Field{[10]uint32{0x0242a173, 0x02da6ee6, 0x03dbd9d9, 0x03f8ca3e, 0x0035a012, 0x027c0dc5, 0x0019b0af, 0x01f583bd, 0x01eb74cc, 0x000cec34}}}, + {X: Field{[10]uint32{0x03788a26, 0x024abf87, 0x0380dd34, 0x016f8100, 0x03f43a28, 0x02c7ccbf, 0x02652ada, 0x006fb484, 0x025e0b79, 0x003bde2d}}, Y: Field{[10]uint32{0x0108d306, 0x007346d9, 0x03910abb, 0x03be4e55, 0x00f156cd, 0x013feb00, 0x027ab1b2, 0x02bf08fa, 0x013896d5, 0x0027cf89}}}, + {X: Field{[10]uint32{0x016b7cd3, 0x02337e6d, 0x02e1f50a, 0x0133b9d4, 0x01cb0c0e, 0x0304b2c0, 0x03ce2f5f, 0x00cfb905, 0x00d01998, 0x001e2e5e}}, Y: Field{[10]uint32{0x01560dd9, 0x00251e30, 0x00cd0197, 0x0245c518, 0x01dd631f, 0x005647d7, 0x01701413, 0x001aef8c, 0x01d73726, 0x0027e71f}}}, + {X: Field{[10]uint32{0x00bfe64a, 0x00f49b5c, 0x00ceff1b, 0x03e9ee9f, 0x02906ffd, 0x002aeadc, 0x012f5e88, 0x016883a6, 0x0331f994, 0x0017de16}}, Y: Field{[10]uint32{0x03881c1c, 0x034285ca, 0x0046e0a6, 0x004f9742, 0x01575224, 0x0089e447, 0x021988d3, 0x00e1abfe, 0x000eb3cb, 0x0028f312}}}, + {X: Field{[10]uint32{0x0006b3d1, 0x03a7f95e, 0x00887fce, 0x01f58dd7, 0x0102c388, 0x0112135c, 0x03aadfa4, 0x0124bf3c, 0x01997cbb, 0x0027fb9e}}, Y: Field{[10]uint32{0x0224c22e, 0x02752b3f, 0x00437a12, 0x03c31b19, 0x00c0f0b8, 0x0039f512, 0x03ef25a6, 0x031d807e, 0x03277e94, 0x0010c450}}}, + {X: Field{[10]uint32{0x02e3f30b, 0x0362c313, 0x031020ac, 0x004fe694, 0x02c0f462, 0x036f5f1d, 0x03befd7c, 0x022215ed, 0x015db75d, 0x0004bcb7}}, Y: Field{[10]uint32{0x034097d8, 0x02d2a94c, 0x010216dc, 0x01c1d0b7, 0x00f85105, 0x00e1901c, 0x013ecfad, 0x00127a6b, 0x018b0e85, 0x003389d6}}}, + {X: Field{[10]uint32{0x03997bd7, 0x020c9773, 0x004d5317, 0x027c74aa, 0x02fbb86f, 0x0306dc63, 0x00e2befb, 0x02d470fc, 0x02b43ee2, 0x0031a52b}}, Y: Field{[10]uint32{0x01050977, 0x0221ea3b, 0x03226bdc, 0x003ab9c7, 0x036fc519, 0x02169be0, 0x02c3e5cc, 0x024c44b2, 0x033eb6a6, 0x00105207}}}, + {X: Field{[10]uint32{0x01047ae9, 0x035e32a0, 0x03ab149a, 0x00002182, 0x029bd161, 0x02bcefbe, 0x033493f5, 0x030172eb, 0x024614c5, 0x003f899a}}, Y: Field{[10]uint32{0x00471e6b, 0x006e5506, 0x0320b074, 0x021d255f, 0x00f58ca0, 0x01dca971, 0x00614ada, 0x025352df, 0x02bec446, 0x0038b863}}}, + {X: Field{[10]uint32{0x016118dd, 0x0149a64d, 0x03250d21, 0x039fd9e9, 0x01daff04, 0x03060fc8, 0x03abfa58, 0x02c1f121, 0x01dc0926, 0x001e5d78}}, Y: Field{[10]uint32{0x011409e5, 0x03f1c24d, 0x029d821c, 0x02366e5c, 0x01f94346, 0x02a536b9, 0x014b779d, 0x02cc0329, 0x039744e2, 0x00032612}}}, + {X: Field{[10]uint32{0x018a2b06, 0x01f3c5a8, 0x02951a13, 0x023adff5, 0x00702284, 0x0061b5c0, 0x0109e8e6, 0x00d62682, 0x00db5018, 0x0024d5cf}}, Y: Field{[10]uint32{0x00bf47d5, 0x02439886, 0x010f0265, 0x022bf27d, 0x02caae2d, 0x004db2b3, 0x0090039d, 0x03dabb65, 0x00663047, 0x001ea55f}}}, + {X: Field{[10]uint32{0x01d77660, 0x01febe20, 0x00829fa3, 0x003b8a6d, 0x026771d8, 0x0217f13f, 0x00ac7dd4, 0x01bfae38, 0x021ea60f, 0x00302f4b}}, Y: Field{[10]uint32{0x0335bacd, 0x03fc96c0, 0x0306556a, 0x00ff896b, 0x002effc8, 0x027c91fa, 0x0076267d, 0x03871da4, 0x00fd9edd, 0x001a16dd}}}, + {X: Field{[10]uint32{0x0024bf3e, 0x031a6127, 0x032538c4, 0x00af6a90, 0x01b67685, 0x01575646, 0x02e5f45d, 0x00881e41, 0x00e19319, 0x0015aeb0}}, Y: Field{[10]uint32{0x03c18ebf, 0x0081fb0b, 0x01096a5d, 0x03a7e342, 0x010f5c0a, 0x022c4639, 0x02480bbc, 0x02e04b4b, 0x01d39856, 0x0038efd4}}}, + {X: Field{[10]uint32{0x0142c06c, 0x01347964, 0x03c65231, 0x002ae4f7, 0x015225fa, 0x02617f7b, 0x03ec7c4a, 0x03774baf, 0x0313fe7c, 0x0014ed06}}, Y: Field{[10]uint32{0x03b69c4b, 0x00bfa6f0, 0x03a988f6, 0x008123ca, 0x03cb4ecf, 0x0334af7f, 0x02e038dc, 0x03d59574, 0x025744e4, 0x00243f2e}}}, + {X: Field{[10]uint32{0x02e765bb, 0x03f3cab0, 0x025f5d55, 0x00019d33, 0x00b11364, 0x0060b28b, 0x02baa269, 0x03b6e51f, 0x0231ccc0, 0x002f6817}}, Y: Field{[10]uint32{0x02cf75e8, 0x0371ae9e, 0x0307b447, 0x036aba3d, 0x032fff08, 0x00c23aa5, 0x00593567, 0x01a60a9d, 0x01793123, 0x0025c9d6}}}, + {X: Field{[10]uint32{0x030413d8, 0x03b78552, 0x0189b21a, 0x0254715c, 0x0291196e, 0x023d97e0, 0x0209f19a, 0x0020807f, 0x006a8a90, 0x00123747}}, Y: Field{[10]uint32{0x009b98f5, 0x022d8eb0, 0x017af78c, 0x00367143, 0x01c5a615, 0x0039cbe1, 0x017e2878, 0x00f72994, 0x02fb1a94, 0x001e687d}}}, + {X: Field{[10]uint32{0x012f1f2c, 0x0010e00a, 0x0051c13c, 0x01bcd119, 0x002be834, 0x03a68b52, 0x02ff4e2c, 0x010a323b, 0x0269e28c, 0x001d5018}}, Y: Field{[10]uint32{0x033e996a, 0x03371684, 0x0289f9e7, 0x03377796, 0x00202c44, 0x024bbf11, 0x00d13d76, 0x0201f88f, 0x0097211c, 0x0011d0ec}}}, + {X: Field{[10]uint32{0x0192ee5f, 0x02181288, 0x03165401, 0x0009376a, 0x00744200, 0x010c53ff, 0x000ae4d2, 0x0204ce21, 0x0193bf31, 0x0006a957}}, Y: Field{[10]uint32{0x00bc3bfc, 0x038e3c4b, 0x0118f041, 0x02204d84, 0x017a6a8e, 0x02db2cb3, 0x02ac7e99, 0x027a2995, 0x035492d5, 0x002eaeb0}}}, + {X: Field{[10]uint32{0x037dcf03, 0x01c48311, 0x02fbab93, 0x03d26c5d, 0x0234d214, 0x03627dc8, 0x00fa8503, 0x0318a799, 0x0050db7b, 0x001d6f93}}, Y: Field{[10]uint32{0x00b6f819, 0x015320a5, 0x003fb511, 0x00a9069b, 0x03ed2e5e, 0x0321831a, 0x033d9343, 0x01b6c820, 0x03ba8c60, 0x002d5482}}}, + {X: Field{[10]uint32{0x00ef6c8c, 0x00e0950f, 0x01c7d8d6, 0x002871c9, 0x036508e1, 0x01846e56, 0x00b2486b, 0x022cb435, 0x0022e4ed, 0x003cd812}}, Y: Field{[10]uint32{0x022dc0f5, 0x00e51188, 0x00105f98, 0x00b2c8eb, 0x0075d99d, 0x00b2f5a6, 0x021a412f, 0x02f1a896, 0x00797404, 0x003d016b}}}, + {X: Field{[10]uint32{0x037cefe8, 0x01f7fc39, 0x012bf2d8, 0x0247c107, 0x01da54ee, 0x0380c9ac, 0x015f727a, 0x009afbeb, 0x02e66f93, 0x001b2485}}, Y: Field{[10]uint32{0x01d16517, 0x00ddfece, 0x01704557, 0x01c94194, 0x031ec2f3, 0x03d48c37, 0x0146f922, 0x011f237d, 0x01b9bc19, 0x00192808}}}, + {X: Field{[10]uint32{0x0105668a, 0x0351d35a, 0x03b09e74, 0x03896c4a, 0x00988346, 0x01a01d9e, 0x03138617, 0x01ccb77c, 0x03bdce97, 0x002b91e6}}, Y: Field{[10]uint32{0x02612929, 0x01f02b24, 0x028b3f4b, 0x025fa8fc, 0x02b33a6f, 0x01366f74, 0x01363366, 0x01821e26, 0x0355c599, 0x0028f380}}}, + {X: Field{[10]uint32{0x014898be, 0x01c14b5d, 0x034ff480, 0x029eaabd, 0x039ccc05, 0x01b3f4bd, 0x02abcf83, 0x0136c871, 0x017966f7, 0x0033a4b0}}, Y: Field{[10]uint32{0x001bb978, 0x039e7298, 0x0127ce44, 0x0200fc42, 0x038adebf, 0x0238d15a, 0x019cec9c, 0x00e31329, 0x03f3530f, 0x003cf8f4}}}, + {X: Field{[10]uint32{0x026ea68d, 0x033c589b, 0x03b9f477, 0x0388de28, 0x01a96f5a, 0x02623137, 0x0153d875, 0x01d705dd, 0x02b68152, 0x002282ef}}, Y: Field{[10]uint32{0x03e77f4e, 0x005e60d7, 0x036d64e9, 0x02b08a11, 0x00a7c74e, 0x0216938d, 0x02a9f770, 0x01504ab2, 0x015e46f4, 0x002562de}}}, + {X: Field{[10]uint32{0x01d9ccfe, 0x03944da3, 0x028d00c2, 0x029c721b, 0x027f0e97, 0x017b479e, 0x02a033c0, 0x00038a44, 0x02e99754, 0x0030a913}}, Y: Field{[10]uint32{0x0275668f, 0x02a5514d, 0x03c60596, 0x02e3afda, 0x0170cd17, 0x00ed44da, 0x03b69b29, 0x02941f6f, 0x01ef7d24, 0x0025590d}}}, + {X: Field{[10]uint32{0x019ea1e1, 0x022471c6, 0x01c293cc, 0x02472057, 0x013d3bbe, 0x01510ef3, 0x03785208, 0x037d851e, 0x0225534d, 0x002d857d}}, Y: Field{[10]uint32{0x02c3ea25, 0x037079db, 0x01e12267, 0x0071ace6, 0x00fe3afd, 0x03d97189, 0x02908764, 0x0051a18a, 0x00f199e2, 0x00132afd}}}, + {X: Field{[10]uint32{0x00a75a0e, 0x002e4efa, 0x030b55fd, 0x0153e020, 0x03b64a0c, 0x02602fb9, 0x016dde93, 0x009cab3d, 0x038dfdcf, 0x002bf32b}}, Y: Field{[10]uint32{0x0042a63e, 0x00b05044, 0x00e9554f, 0x01801f62, 0x03e7d6a6, 0x00d6186b, 0x036d9ba7, 0x03113e27, 0x005d6f6f, 0x0002363b}}}, + {X: Field{[10]uint32{0x03135f53, 0x00cf22a6, 0x033ac328, 0x00ab2ce1, 0x03559d07, 0x03de0c02, 0x039395d0, 0x006c987c, 0x02a8c531, 0x0014d05d}}, Y: Field{[10]uint32{0x02b2f436, 0x031f9b22, 0x03643b03, 0x0175a0fb, 0x020b1615, 0x03e9d5be, 0x02f66398, 0x029ed21f, 0x004b5eee, 0x002ae13e}}}, + {X: Field{[10]uint32{0x0391f34c, 0x03f34506, 0x0393ea65, 0x02f194c6, 0x028705ab, 0x00883cfc, 0x03651ac6, 0x025737d1, 0x017397ef, 0x0017dea8}}, Y: Field{[10]uint32{0x0081da22, 0x01215866, 0x02ab8b75, 0x02ef8118, 0x0270cffc, 0x01e9df63, 0x011b28f1, 0x02cd3cbb, 0x00983cdd, 0x001cbdf6}}}, + {X: Field{[10]uint32{0x008f3d3b, 0x00a1ff2b, 0x034490aa, 0x0161a40f, 0x02b6a952, 0x00d6bf5e, 0x001db193, 0x03edcacc, 0x024cc1e2, 0x00353ed2}}, Y: Field{[10]uint32{0x014154f9, 0x02062538, 0x00306088, 0x03de6ba4, 0x02f213ad, 0x037b9e1f, 0x01098cd5, 0x02ca1c67, 0x02e84a9d, 0x001dad5c}}}, + {X: Field{[10]uint32{0x037a9ff4, 0x03515327, 0x035694c6, 0x01716aef, 0x00dad097, 0x00f6c374, 0x013116c2, 0x00bcebde, 0x0163843b, 0x000f719d}}, Y: Field{[10]uint32{0x016753ae, 0x01da980d, 0x01fbf780, 0x01dd3ece, 0x004894b2, 0x0126a022, 0x010ccf80, 0x00edfd0f, 0x039e4db8, 0x00377d96}}}, + {X: Field{[10]uint32{0x02f897d6, 0x01720b28, 0x036b13bb, 0x0176cdb8, 0x039c3e41, 0x00334599, 0x006c4495, 0x0005344e, 0x02bd1edd, 0x00195e44}}, Y: Field{[10]uint32{0x02d505cf, 0x00249fbf, 0x02143430, 0x012327d6, 0x0178205e, 0x03341b1a, 0x007fb3aa, 0x0389023f, 0x03db11bb, 0x00138bf7}}}, + {X: Field{[10]uint32{0x03d69f99, 0x0205c5cf, 0x027b8f90, 0x017f12b7, 0x036f412b, 0x03cffa4d, 0x00473e50, 0x016173d9, 0x03b35f82, 0x00016914}}, Y: Field{[10]uint32{0x00097ebe, 0x02d985d6, 0x00c4fa29, 0x02d5fcad, 0x03ec2fb4, 0x012ae868, 0x01dbf06f, 0x02d64138, 0x02113448, 0x003f05a7}}}, + {X: Field{[10]uint32{0x00052679, 0x02cdece9, 0x03689093, 0x02c83d3f, 0x03d01c68, 0x025a8c10, 0x02cfaf1f, 0x012f21a6, 0x005ac24b, 0x0030eb7d}}, Y: Field{[10]uint32{0x00ae19cc, 0x00ab1a04, 0x017d7edc, 0x020f3b72, 0x014f0d4b, 0x01cae342, 0x0285bea9, 0x012d274e, 0x0207cd37, 0x000f648c}}}, + {X: Field{[10]uint32{0x021e1d56, 0x0103fa57, 0x006b6e90, 0x003eb2c1, 0x035bd84f, 0x007c976b, 0x016420be, 0x0372109d, 0x01c8905d, 0x00068cbb}}, Y: Field{[10]uint32{0x00eb4c51, 0x0108591a, 0x0059c0ca, 0x0203e33e, 0x03f1612c, 0x01a98bd3, 0x00b73ad1, 0x01dfe307, 0x019d113a, 0x001fd19f}}}, + {X: Field{[10]uint32{0x034d6c98, 0x00efc829, 0x006b7b4a, 0x010bac69, 0x02f925c1, 0x03944092, 0x028b7da2, 0x025deb0c, 0x019862e5, 0x001c255f}}, Y: Field{[10]uint32{0x02f09381, 0x03f49cef, 0x03ec1441, 0x00c7c8c9, 0x037d7ee2, 0x02074b14, 0x01513488, 0x0330d282, 0x02c62e42, 0x0009a6d5}}}, + {X: Field{[10]uint32{0x037537a7, 0x03b72120, 0x02b44bd7, 0x015b65da, 0x01bf6dd2, 0x02db37c9, 0x03ae4540, 0x02c5b041, 0x00165a02, 0x0001f9a5}}, Y: Field{[10]uint32{0x005185f5, 0x01a09ad1, 0x03b243e6, 0x0075e28d, 0x03a6aac2, 0x00f91cd8, 0x010d2ce0, 0x0030478b, 0x00db3836, 0x003fee1d}}}, + {X: Field{[10]uint32{0x01df9678, 0x0355495b, 0x018b60ee, 0x01d78ded, 0x003b9d8a, 0x03d10176, 0x03e7ac6f, 0x03a6d492, 0x01597b42, 0x0013e068}}, Y: Field{[10]uint32{0x02e0a78c, 0x02e125e1, 0x038b377c, 0x035e6494, 0x003558ee, 0x0349f7d3, 0x00ffbe16, 0x018196b6, 0x02071867, 0x002c94c4}}}, + {X: Field{[10]uint32{0x014fd547, 0x0068d74a, 0x002d9359, 0x03586f74, 0x009be6fd, 0x024e04cd, 0x020be8de, 0x0196bc2d, 0x03685770, 0x003e8940}}, Y: Field{[10]uint32{0x00e81625, 0x01873512, 0x02f06d4d, 0x029deda5, 0x033b0a1f, 0x03d7b842, 0x0242f0dc, 0x01f2fd75, 0x01e396c7, 0x003c2e64}}}, + {X: Field{[10]uint32{0x032ba3d4, 0x03c09689, 0x02c4d440, 0x0312961d, 0x006b61d6, 0x00ffb1b6, 0x03da5172, 0x00aff0f8, 0x02bd6716, 0x003d37d7}}, Y: Field{[10]uint32{0x0052212b, 0x038ca860, 0x00d44674, 0x016e425c, 0x026380dc, 0x0278dd73, 0x010e384c, 0x017ecb56, 0x02798bc7, 0x002c8ee8}}}, + {X: Field{[10]uint32{0x01ac5015, 0x021c1da8, 0x0141c4a5, 0x00681955, 0x0051b897, 0x0111835b, 0x0228e5c4, 0x016d97eb, 0x031db372, 0x002ad6da}}, Y: Field{[10]uint32{0x02ee2ece, 0x03a972c9, 0x02a9e286, 0x02e3422d, 0x00424f72, 0x01e16b7c, 0x01d7876d, 0x005c60ea, 0x0057ecdc, 0x0005b4b1}}}, + {X: Field{[10]uint32{0x00869e55, 0x01df380a, 0x03981ac8, 0x0264f0c3, 0x0002e08d, 0x01c34e29, 0x0280dcc4, 0x014dc101, 0x007e13db, 0x002a293b}}, Y: Field{[10]uint32{0x037f60a4, 0x01205472, 0x007bb2d2, 0x0356eaec, 0x00754025, 0x01961e29, 0x03d08749, 0x03b94e25, 0x019c2cdf, 0x0012a77b}}}, + {X: Field{[10]uint32{0x00245f48, 0x02c5042e, 0x00faa5f1, 0x03678aaf, 0x016f914d, 0x01970404, 0x0183d081, 0x01836c01, 0x00f633bd, 0x000cdfd5}}, Y: Field{[10]uint32{0x0176dbfc, 0x0159dc60, 0x00a94ea4, 0x0395022c, 0x00679b58, 0x00eaeb93, 0x035452bd, 0x03f12902, 0x0328696a, 0x002514fa}}}, + {X: Field{[10]uint32{0x01901b53, 0x0190ad7f, 0x020e433b, 0x00354a74, 0x00f6db48, 0x00694153, 0x004c7674, 0x02abc415, 0x03abdc2b, 0x003bb8cd}}, Y: Field{[10]uint32{0x029c27be, 0x019091e1, 0x01830872, 0x03357db2, 0x00825616, 0x01a55be2, 0x03a1d8ba, 0x00035292, 0x038802cc, 0x00196b56}}}, + {X: Field{[10]uint32{0x012f1548, 0x00ff3bdd, 0x010b8451, 0x01f143c0, 0x00f56e47, 0x010fc49d, 0x01aaf0cb, 0x00002bb0, 0x021857cb, 0x00167d4b}}, Y: Field{[10]uint32{0x021698be, 0x0383d4e7, 0x00e70a1a, 0x018665e3, 0x014f2254, 0x01bb078a, 0x007006ba, 0x00ec6601, 0x036e8db0, 0x003632a3}}}, + {X: Field{[10]uint32{0x006f3e12, 0x0297c150, 0x0115e8f5, 0x0043cad2, 0x038583ab, 0x01f618a1, 0x01618d9d, 0x036caa2a, 0x020c25fa, 0x001b0802}}, Y: Field{[10]uint32{0x038081f8, 0x03b6527b, 0x03a617d6, 0x0276c5e4, 0x00050464, 0x0170343e, 0x01af24da, 0x03cd7051, 0x004e374c, 0x00053526}}}, + {X: Field{[10]uint32{0x02ac07fa, 0x03fef0e2, 0x002a032c, 0x03e2628f, 0x02f8144f, 0x00e6d95e, 0x02ad8782, 0x02dbe1c6, 0x02fd51df, 0x00059528}}, Y: Field{[10]uint32{0x021a839c, 0x02410f45, 0x037148d5, 0x0317e977, 0x00e36d46, 0x031c5c17, 0x00dcc1d4, 0x0215a6db, 0x01c382d9, 0x0022da59}}}, + {X: Field{[10]uint32{0x03556d77, 0x008cbdd9, 0x02fae8de, 0x0301fa63, 0x027b3ed1, 0x014fe5b5, 0x0182f339, 0x00d55b26, 0x03c9ab47, 0x0031200c}}, Y: Field{[10]uint32{0x01968bac, 0x01ead2fb, 0x002b6f89, 0x01520a2c, 0x010abe4a, 0x0373feab, 0x03873828, 0x00c5a041, 0x00a87bc4, 0x002bcfd2}}}, + {X: Field{[10]uint32{0x003c6032, 0x01390a0f, 0x003baf1a, 0x007c084b, 0x001a9577, 0x015fdea6, 0x005aaea5, 0x00a35462, 0x03faa9d2, 0x0017765d}}, Y: Field{[10]uint32{0x032eb656, 0x01ca8de3, 0x02b4549e, 0x03349d2f, 0x02abb06a, 0x036a81bc, 0x00e52043, 0x023db34b, 0x014aba17, 0x000effe7}}}, + {X: Field{[10]uint32{0x0242a564, 0x03f7ca73, 0x032abefe, 0x01a69760, 0x03261e4c, 0x00f26aba, 0x03f1d8af, 0x025b12f3, 0x0025dd9a, 0x000a9db7}}, Y: Field{[10]uint32{0x01244806, 0x02ad31b5, 0x02c5b2fc, 0x02ab7d85, 0x0307ff82, 0x03d70e20, 0x00c972aa, 0x032b9f7a, 0x02f23ad5, 0x00124d14}}}, + {X: Field{[10]uint32{0x029a4b8d, 0x02e3d2f4, 0x02d6ff2d, 0x02a69279, 0x02fd3935, 0x01198aca, 0x02bab4db, 0x01e48e08, 0x01064c0e, 0x00336f4d}}, Y: Field{[10]uint32{0x017a90ce, 0x03828f15, 0x03143a8c, 0x0054550f, 0x0358b845, 0x021bf6d7, 0x008a84c3, 0x009d3e9a, 0x032eb61e, 0x002c849b}}}, + {X: Field{[10]uint32{0x0354d978, 0x03dc974a, 0x02a75bf6, 0x00969051, 0x012bcfd5, 0x01c4ebfe, 0x0182d6ce, 0x0353d8d3, 0x009b2cb9, 0x00260fc9}}, Y: Field{[10]uint32{0x028abca2, 0x03c12122, 0x033ef0cf, 0x01dc8e20, 0x02af302e, 0x0280b6af, 0x004d25f5, 0x0380b69b, 0x0006850b, 0x001e7349}}}, + {X: Field{[10]uint32{0x00afd4f4, 0x0370630e, 0x0138396f, 0x0227eb78, 0x019e1284, 0x03ec8f94, 0x017e21ef, 0x02a7ce89, 0x01b4a5a0, 0x002231d9}}, Y: Field{[10]uint32{0x015f46c2, 0x0226df56, 0x006971cf, 0x038d170a, 0x02e3336a, 0x034511a0, 0x005cc031, 0x02568f94, 0x02647299, 0x003d357f}}}, + {X: Field{[10]uint32{0x03d52c31, 0x01e960ad, 0x036926b6, 0x001d1580, 0x031d147d, 0x02234398, 0x01c7d08b, 0x032c2866, 0x01ecd603, 0x00065d41}}, Y: Field{[10]uint32{0x01057f15, 0x0158793e, 0x0208f49a, 0x037e88d3, 0x002f212a, 0x0169d6bb, 0x035a7461, 0x017f142b, 0x013bf2d7, 0x00251fb0}}}, + {X: Field{[10]uint32{0x032eaaf8, 0x00c82d8e, 0x00fec668, 0x003fad8e, 0x019a1979, 0x035af013, 0x02700c30, 0x01817d62, 0x0232e10f, 0x00260610}}, Y: Field{[10]uint32{0x03f9c85b, 0x01e3873b, 0x03d7f395, 0x024aac62, 0x01dbbdf1, 0x01b0c7d6, 0x02a837e3, 0x03e8e4c3, 0x02edc0e2, 0x003bcc1d}}}, + {X: Field{[10]uint32{0x000bc002, 0x03e388db, 0x02764892, 0x0205a1a6, 0x02f0c7d0, 0x00c899c3, 0x00f47a9e, 0x004d2de4, 0x0335cba0, 0x00143c36}}, Y: Field{[10]uint32{0x00396072, 0x00cff2da, 0x00edd832, 0x0112e181, 0x009e466b, 0x02389976, 0x03260f65, 0x0213ab9d, 0x0013d98a, 0x000706c7}}}, + {X: Field{[10]uint32{0x01665502, 0x00770c75, 0x03a8680c, 0x005b35af, 0x0099ac85, 0x03d08a3d, 0x00bb19f3, 0x02ed42b9, 0x00ea1a44, 0x003678d0}}, Y: Field{[10]uint32{0x034aaad8, 0x03d2cd56, 0x00f75355, 0x02b49412, 0x01341445, 0x020eebba, 0x0005251b, 0x00864ffe, 0x0288335a, 0x0004a285}}}, + {X: Field{[10]uint32{0x007c539c, 0x00f03e3a, 0x034c91e3, 0x02a42a51, 0x01d42cb4, 0x01557706, 0x03067020, 0x01377631, 0x013301b8, 0x00056aa0}}, Y: Field{[10]uint32{0x0142dbc1, 0x031a9b62, 0x03b1de22, 0x011d17d8, 0x032a14bf, 0x01d8b32e, 0x01d2ba17, 0x019003af, 0x03209658, 0x001e54c1}}}, + {X: Field{[10]uint32{0x025d34d2, 0x0060be1e, 0x0024255e, 0x00608d81, 0x03d489dd, 0x01f1ef88, 0x010d169c, 0x026936e4, 0x030453d1, 0x001bdc21}}, Y: Field{[10]uint32{0x01c7dde2, 0x01e2aa66, 0x02101355, 0x03f569b7, 0x01c15246, 0x01f136ee, 0x029beabd, 0x00afd282, 0x01567c1c, 0x003814c6}}}, + {X: Field{[10]uint32{0x03167674, 0x03e370f1, 0x03f1bf33, 0x0163f8b4, 0x03867f9a, 0x01a2153d, 0x02d97e91, 0x028e9226, 0x00dfcddc, 0x000c7a48}}, Y: Field{[10]uint32{0x03706f39, 0x020a4030, 0x038afdbe, 0x017ec4b2, 0x01244a9c, 0x03af89f7, 0x01576600, 0x01b96054, 0x003d0b0c, 0x00149c4b}}}, + {X: Field{[10]uint32{0x008d51d8, 0x007cb693, 0x015ab8d0, 0x030a1a8c, 0x028258de, 0x00622325, 0x0381fbcf, 0x03c0765b, 0x0211708f, 0x0024cc03}}, Y: Field{[10]uint32{0x026c33ff, 0x00f52838, 0x01f464c9, 0x00d8495b, 0x009e0b76, 0x01961393, 0x0049b536, 0x00823021, 0x02473b6a, 0x00054da1}}}, + {X: Field{[10]uint32{0x03acb3db, 0x0153d973, 0x017dcecd, 0x00c9c81e, 0x0230c946, 0x01c4b072, 0x016cfdf3, 0x019c0818, 0x010bf62d, 0x0023deb5}}, Y: Field{[10]uint32{0x0043c637, 0x03e2d121, 0x01d347e4, 0x01c4197e, 0x001eff0d, 0x00686532, 0x0290080a, 0x014af0cc, 0x023207dc, 0x0016b042}}}, + {X: Field{[10]uint32{0x0189f4a9, 0x022921ca, 0x03dd7445, 0x007723be, 0x027f5cf5, 0x01431822, 0x028f5d73, 0x0035c711, 0x03827627, 0x001bb602}}, Y: Field{[10]uint32{0x01826dc0, 0x0248f422, 0x035a2e00, 0x03c8058e, 0x0177fd3c, 0x01a1f1f8, 0x01e47b7c, 0x039ded19, 0x03f738f6, 0x002f2e8a}}}, + {X: Field{[10]uint32{0x00e3714c, 0x00aed2df, 0x01e38eea, 0x02ca1a52, 0x027c2b11, 0x01dfab68, 0x02cb85f7, 0x02278a58, 0x017db949, 0x003b1b07}}, Y: Field{[10]uint32{0x02d08fdd, 0x02c0c3a7, 0x02516df3, 0x01354bf3, 0x018ef266, 0x02f295d5, 0x00089d0e, 0x037f6c75, 0x01af6042, 0x002b767e}}}, + {X: Field{[10]uint32{0x0237f093, 0x00982112, 0x0335c1fe, 0x023a5519, 0x01c59bca, 0x0042166e, 0x03a82d35, 0x03064964, 0x032c24dc, 0x0023ddf2}}, Y: Field{[10]uint32{0x03e07202, 0x0266cf13, 0x02213831, 0x02f561f9, 0x00423fde, 0x0029c32e, 0x0355bd4f, 0x0267e9c2, 0x0186fbf4, 0x001459d2}}}, + {X: Field{[10]uint32{0x024b6aca, 0x01e30741, 0x0049f1fd, 0x035890f4, 0x011122f2, 0x03d28cb7, 0x00c4ed62, 0x00c6bea9, 0x0374dae8, 0x0038ab77}}, Y: Field{[10]uint32{0x028b2297, 0x020463f8, 0x0323ccf5, 0x02808296, 0x00a73a1a, 0x0369984a, 0x02560224, 0x03ec2c22, 0x03941ead, 0x001f6f2c}}}, + {X: Field{[10]uint32{0x02b1e3eb, 0x011768c0, 0x0072d3e8, 0x0144d2ea, 0x033a22b1, 0x0233516c, 0x03b7c6db, 0x00c7266b, 0x01bc614d, 0x002fdebc}}, Y: Field{[10]uint32{0x00125a21, 0x00bb0b14, 0x03239754, 0x0193c49d, 0x012b8504, 0x00c99ef5, 0x029e2552, 0x02288bee, 0x01e78cf8, 0x0004234e}}}, + {X: Field{[10]uint32{0x02fe50e4, 0x03af1663, 0x01987093, 0x01a29d60, 0x0035b4f0, 0x014b60b3, 0x012c5f69, 0x0196016e, 0x007f0cec, 0x000223ff}}, Y: Field{[10]uint32{0x01378a4c, 0x03713693, 0x00cf4a63, 0x03262e7a, 0x00d39193, 0x008e5159, 0x01558c78, 0x00b0fae8, 0x00ca94b4, 0x000e0b6b}}}, + {X: Field{[10]uint32{0x013a152b, 0x00d4f51f, 0x003b7a28, 0x001cd33e, 0x039070e2, 0x00dbaac9, 0x00569ae6, 0x02b982e7, 0x03840ef4, 0x002c4528}}, Y: Field{[10]uint32{0x00a3fa70, 0x02311df3, 0x03001b18, 0x01d9b629, 0x03bb8260, 0x02ef972f, 0x036438c9, 0x03882981, 0x033ce58e, 0x000df1d9}}}, + {X: Field{[10]uint32{0x03e801b0, 0x036cea31, 0x009da627, 0x00ac6453, 0x00cfb0cd, 0x00c4064b, 0x0368fa1e, 0x008edbe9, 0x002fe20d, 0x00390469}}, Y: Field{[10]uint32{0x019b1039, 0x02140225, 0x0080b91c, 0x02ba2bb1, 0x028f6828, 0x00a2bca6, 0x012bbc17, 0x01e601c9, 0x039b43ee, 0x003fac6d}}}, + {X: Field{[10]uint32{0x00ee1999, 0x0053f35d, 0x00fd7cb8, 0x035fc7d2, 0x0031057a, 0x037979f1, 0x005182ae, 0x008c4f02, 0x007e4643, 0x000647da}}, Y: Field{[10]uint32{0x026dbc72, 0x03d2c7a4, 0x001e60e4, 0x0100f542, 0x0043e5c5, 0x00e02336, 0x0239efb8, 0x0338b566, 0x002b3f77, 0x0015192d}}}, + {X: Field{[10]uint32{0x006bcd81, 0x0023ae54, 0x01bf0b22, 0x01321686, 0x03983774, 0x006bbd4d, 0x018c4ff0, 0x02927bd8, 0x017733b0, 0x0018ffd2}}, Y: Field{[10]uint32{0x00593d3b, 0x0126ca4c, 0x020903ae, 0x02321f89, 0x0039535d, 0x02a4fca9, 0x0287b500, 0x0164c7ce, 0x0397ca83, 0x001b32bb}}}, + {X: Field{[10]uint32{0x03fc2c1c, 0x01f96b6d, 0x015564c5, 0x0291a361, 0x00f4ce72, 0x00ba318a, 0x027056c0, 0x0016e9a7, 0x0025c377, 0x003bf8d9}}, Y: Field{[10]uint32{0x01970ad5, 0x02443014, 0x032d08dd, 0x0049485c, 0x028faa7f, 0x00b956ec, 0x01a5f52c, 0x0127160c, 0x035f27ac, 0x000e4ae6}}}, + {X: Field{[10]uint32{0x037e94a5, 0x0001477d, 0x00a99988, 0x00dd3968, 0x02841d47, 0x005c1287, 0x01419102, 0x0302346f, 0x026bdd7c, 0x0001b484}}, Y: Field{[10]uint32{0x00e6e806, 0x01be55a1, 0x015f55da, 0x02c236bd, 0x03efb4d4, 0x02b50849, 0x0372ce6e, 0x02fa5d4b, 0x023acda1, 0x000ba6e0}}}, + {X: Field{[10]uint32{0x00933743, 0x037da941, 0x02f54b20, 0x03261ad3, 0x006d453a, 0x00732a4f, 0x006340dc, 0x02716e47, 0x03f4297d, 0x0033dee7}}, Y: Field{[10]uint32{0x03670c15, 0x02ea8ffa, 0x012ca083, 0x031078d8, 0x00c20613, 0x03dd46d5, 0x01efec2b, 0x0000ac44, 0x008a2c07, 0x002295e0}}}, + {X: Field{[10]uint32{0x01f7e83e, 0x0093f981, 0x023f2c15, 0x02ffdf00, 0x0027f5a5, 0x038b5568, 0x01ba4e80, 0x017b8747, 0x002b4cbe, 0x002c5809}}, Y: Field{[10]uint32{0x000fb5a0, 0x016e318f, 0x01567607, 0x03d19f42, 0x024f1faa, 0x03ece74f, 0x02e9f540, 0x0049801f, 0x03956cf3, 0x0002b0d5}}}, + {X: Field{[10]uint32{0x02bb050e, 0x0336a95a, 0x02733c02, 0x031b7f43, 0x021744d9, 0x0098669c, 0x013dce02, 0x0063661b, 0x012c4f89, 0x001ea191}}, Y: Field{[10]uint32{0x010de179, 0x02daf172, 0x0285a91e, 0x03e90f62, 0x00542370, 0x025b3d15, 0x02a1fb35, 0x02c383ee, 0x031cb558, 0x000c34c2}}}, + {X: Field{[10]uint32{0x002323b9, 0x0014bfd6, 0x01372408, 0x01024e07, 0x00af41ba, 0x025f19dc, 0x0296d3ab, 0x001bbc3a, 0x001a64d2, 0x00289e6f}}, Y: Field{[10]uint32{0x00e42046, 0x0129af1b, 0x0261da1b, 0x034d2d60, 0x02e96199, 0x0380cc60, 0x01a7ab1f, 0x02f1119e, 0x013d701e, 0x002bbf21}}}, + {X: Field{[10]uint32{0x01e5cc76, 0x039bb1aa, 0x0301a0d4, 0x0218987a, 0x00f76918, 0x03167e1a, 0x00c301aa, 0x0005ad82, 0x01705c16, 0x003a38a1}}, Y: Field{[10]uint32{0x030a983d, 0x02cfab27, 0x01eb8f2f, 0x01989da6, 0x02c988ea, 0x02509c9c, 0x0303b7a4, 0x0201442d, 0x0315f8e7, 0x00248d40}}}, + {X: Field{[10]uint32{0x029f2bbd, 0x03833862, 0x03e73459, 0x0216e4e6, 0x0046da15, 0x01cd3e73, 0x015f300a, 0x03f20601, 0x02f814f3, 0x0007f673}}, Y: Field{[10]uint32{0x00abb55e, 0x02230367, 0x025cd264, 0x02a5e528, 0x00c26d79, 0x00117c08, 0x003c71bc, 0x033239bb, 0x033fa50f, 0x0037313d}}}, + {X: Field{[10]uint32{0x027e5f11, 0x006b41a4, 0x0174d39f, 0x02db3d39, 0x03c609d4, 0x03cd93db, 0x0148942d, 0x017f583f, 0x02fc7027, 0x000c86c6}}, Y: Field{[10]uint32{0x00add33d, 0x015118e0, 0x01680c5b, 0x03e3b40a, 0x03725a80, 0x0293207e, 0x01ad36f8, 0x02cc46ba, 0x00ef808b, 0x0004da3b}}}, + {X: Field{[10]uint32{0x02d7bf72, 0x02310bbd, 0x01741810, 0x02731433, 0x03f9ef1e, 0x0037b095, 0x010cad9b, 0x038e4f6b, 0x01fb6518, 0x00137fca}}, Y: Field{[10]uint32{0x00dfb70c, 0x003d308c, 0x00efde4d, 0x022d20c1, 0x02d92f8f, 0x004fb23d, 0x03bfd067, 0x013a0935, 0x006e05aa, 0x0010565e}}}, + {X: Field{[10]uint32{0x00ed1e0b, 0x00dcfdd7, 0x001b9274, 0x01ca56a3, 0x00c839b9, 0x028fcb95, 0x03162e11, 0x00157196, 0x00a5eb63, 0x0024dea1}}, Y: Field{[10]uint32{0x0166afc6, 0x0253cdde, 0x01954532, 0x02c6a73e, 0x0162c122, 0x038f9e8b, 0x03fb3b52, 0x028d4769, 0x00bbbf11, 0x00280c1e}}}, + {X: Field{[10]uint32{0x016cc3d2, 0x03c111fa, 0x03c7a56d, 0x024ecc5d, 0x0156f073, 0x0176dff1, 0x032a87d2, 0x01cee13e, 0x029b7cab, 0x002f8fea}}, Y: Field{[10]uint32{0x02faf77f, 0x02625a02, 0x00ee1029, 0x01a9f8d2, 0x02927644, 0x03a47dfd, 0x01dacc44, 0x0252bd5c, 0x02e01ad7, 0x0039c147}}}, + {X: Field{[10]uint32{0x016c9b41, 0x0037c55d, 0x021f8c68, 0x004ec3ef, 0x0136928d, 0x001635f7, 0x01d24da6, 0x035419d9, 0x006bcc36, 0x00162ce7}}, Y: Field{[10]uint32{0x023d74ff, 0x00b4fc10, 0x0063dad7, 0x0278315e, 0x03b4ecd9, 0x00fdeb9b, 0x0012b777, 0x011b669d, 0x0291aaa8, 0x001127a5}}}, + {X: Field{[10]uint32{0x03765798, 0x00af7270, 0x007b2819, 0x00ac71cb, 0x008c9128, 0x02195d0b, 0x00e21000, 0x002d19c8, 0x0171b166, 0x0026c62a}}, Y: Field{[10]uint32{0x02e0f49f, 0x024b8c4c, 0x03d506c7, 0x00dc1673, 0x022be28d, 0x02819405, 0x0007a934, 0x03e0f4b3, 0x012298ad, 0x000a04b9}}}, + {X: Field{[10]uint32{0x02c0f59e, 0x0286cfb7, 0x002d7f73, 0x031724a5, 0x02c86740, 0x005de209, 0x035e2076, 0x0352f5e8, 0x0003dbac, 0x0029b113}}, Y: Field{[10]uint32{0x0056077f, 0x0124f31c, 0x000e0797, 0x027b1032, 0x022258d2, 0x02abce71, 0x03737278, 0x00d041da, 0x037cd1fa, 0x001ccc5a}}}, + {X: Field{[10]uint32{0x01682ee3, 0x00168e88, 0x03aaa21a, 0x010eefe8, 0x005dde20, 0x012b5e28, 0x037495b9, 0x03e35760, 0x0355628f, 0x0007fec9}}, Y: Field{[10]uint32{0x03b5943b, 0x016bfe36, 0x02fec5f9, 0x02b71a43, 0x03a71243, 0x01c38aa0, 0x019962df, 0x022db3ff, 0x00f7006b, 0x0012811e}}}, + {X: Field{[10]uint32{0x019b8283, 0x03c79e10, 0x0025c3d6, 0x039c23ed, 0x02b67a21, 0x023b97dc, 0x02538a80, 0x00451120, 0x008e3605, 0x002ba931}}, Y: Field{[10]uint32{0x01a80b27, 0x01aeea50, 0x0099b221, 0x00c1ad91, 0x0282c7b5, 0x039c44cc, 0x009d216c, 0x02ce5ef6, 0x02b8c28e, 0x001145f2}}}, + {X: Field{[10]uint32{0x034ed3eb, 0x025e6402, 0x03127f52, 0x0050e0af, 0x030b972f, 0x0000f29b, 0x036fabb5, 0x0009c210, 0x03fa5f8c, 0x00377166}}, Y: Field{[10]uint32{0x03d995c1, 0x0014d17a, 0x02696996, 0x0200ea65, 0x01ad7dbc, 0x0108117a, 0x00370b67, 0x01d6d94f, 0x019fb80e, 0x003db0fc}}}, + {X: Field{[10]uint32{0x014c80a8, 0x00f162c1, 0x0237d0d0, 0x032619a9, 0x0394d204, 0x011d0bdb, 0x03f83ed6, 0x006cb58a, 0x03e7ed30, 0x00088613}}, Y: Field{[10]uint32{0x0179b442, 0x00d85020, 0x00ab4ace, 0x01a8ee03, 0x013bc55d, 0x015a6095, 0x03a389dc, 0x028f5585, 0x01281073, 0x00276c9d}}}, + {X: Field{[10]uint32{0x0201cef3, 0x02a8debc, 0x02eeaf98, 0x00421c4d, 0x036488c5, 0x02ebf0f2, 0x030ed2d6, 0x01bd29d2, 0x03f474e4, 0x00396185}}, Y: Field{[10]uint32{0x02aa2220, 0x013e393c, 0x019d436d, 0x038b93d4, 0x00c6b141, 0x0126906c, 0x03f2047d, 0x038179c6, 0x037552dd, 0x00331a9c}}}, + {X: Field{[10]uint32{0x024f8e41, 0x0280de60, 0x0046c5b2, 0x003c740a, 0x02b7394a, 0x029cecfc, 0x02c2c5ab, 0x0317fb79, 0x00925add, 0x00306a90}}, Y: Field{[10]uint32{0x028c687b, 0x0161b074, 0x0357028b, 0x009815c4, 0x032475bf, 0x0020ead4, 0x016ce735, 0x03d58254, 0x0307e30a, 0x0025c4eb}}}, + {X: Field{[10]uint32{0x01df6168, 0x034a46b0, 0x01b5ac08, 0x0082c2dc, 0x0069e4d3, 0x001931c6, 0x00cd1c23, 0x01916407, 0x008d8957, 0x0012a976}}, Y: Field{[10]uint32{0x0113e6e6, 0x0034cab2, 0x006adf24, 0x020b7396, 0x010c0484, 0x01e01920, 0x0336cc3f, 0x00a23b1a, 0x001b915c, 0x000743a9}}}, + {X: Field{[10]uint32{0x02a8a977, 0x025be4e8, 0x031e7432, 0x01c4e477, 0x02738d41, 0x02a1a680, 0x025e192f, 0x01e0d372, 0x01917313, 0x0024e1db}}, Y: Field{[10]uint32{0x026457a4, 0x01beeb5e, 0x03c3de2d, 0x023e74a9, 0x0173fc6c, 0x015e1a9a, 0x0263d9dd, 0x03514093, 0x023d32ba, 0x001e5211}}}, + {X: Field{[10]uint32{0x011b7b28, 0x012243ea, 0x006ee50e, 0x00295310, 0x035d1808, 0x00bcabcd, 0x033dd13f, 0x020096c8, 0x017d3026, 0x00032033}}, Y: Field{[10]uint32{0x0318bc4b, 0x03f9486d, 0x00292278, 0x03249e1c, 0x019e6260, 0x031eb49d, 0x008f904a, 0x0047e459, 0x018b1f1d, 0x0027dced}}}, + {X: Field{[10]uint32{0x00c8c5cb, 0x010943a8, 0x01bb8fba, 0x0310f39e, 0x00e8e7e7, 0x01ea70c3, 0x004e8579, 0x028d16a3, 0x00d97dd4, 0x0034af49}}, Y: Field{[10]uint32{0x02494b9e, 0x0059ae41, 0x030f7665, 0x0257b868, 0x00055ae8, 0x0027ac0a, 0x03310558, 0x0064c640, 0x00b815cb, 0x000cc3c3}}}, + {X: Field{[10]uint32{0x01d7e9f4, 0x000cc1d7, 0x038b8dc3, 0x02254568, 0x015d7225, 0x00eae605, 0x015457df, 0x03a863ec, 0x03a290de, 0x00353928}}, Y: Field{[10]uint32{0x027d1c21, 0x0308774f, 0x038a56ee, 0x01b2e452, 0x0271c57a, 0x014867a6, 0x02bdc9ba, 0x03b2c5d0, 0x013e77d0, 0x00121512}}}, + {X: Field{[10]uint32{0x03236d19, 0x026f9b51, 0x02bea277, 0x00b85807, 0x03d318f8, 0x0039db8a, 0x011b246f, 0x038e67f3, 0x00f4810d, 0x003c3edb}}, Y: Field{[10]uint32{0x00595daf, 0x03b779eb, 0x00d07ad0, 0x034df3d6, 0x022cc9b4, 0x03aca907, 0x030b1973, 0x0008e622, 0x01606648, 0x0038eb54}}}, + {X: Field{[10]uint32{0x00858939, 0x01cec40d, 0x03ab0ebf, 0x03c66191, 0x039a4f9d, 0x000ac3f1, 0x0191740d, 0x011c30da, 0x018e3f4c, 0x003753b1}}, Y: Field{[10]uint32{0x00a3bfe3, 0x00df6810, 0x0246417e, 0x024253fe, 0x00737a63, 0x0107a4b7, 0x038c8395, 0x01633bc9, 0x0086a3b0, 0x000e9bb3}}}, + {X: Field{[10]uint32{0x03904e51, 0x02baedea, 0x01a8b8fd, 0x00eb771d, 0x012af12f, 0x013dab78, 0x02fe1b6c, 0x03655353, 0x01101d7e, 0x0003b15a}}, Y: Field{[10]uint32{0x0050c54a, 0x02df9435, 0x01d6dbe0, 0x02b6cb30, 0x01be7cba, 0x008bc988, 0x027111ae, 0x013dc50c, 0x027f5d59, 0x000d25f1}}}, + {X: Field{[10]uint32{0x03aa35c5, 0x03668676, 0x03da5a85, 0x02c38a2a, 0x03e25ef6, 0x013b70f2, 0x025e1aa6, 0x015a95f2, 0x02f80518, 0x00329177}}, Y: Field{[10]uint32{0x003521b2, 0x034cf6dc, 0x03df04d1, 0x01a569e8, 0x026eb4ed, 0x0044dcb0, 0x013fcde1, 0x02e7af80, 0x0357268d, 0x0036e2c8}}}, + {X: Field{[10]uint32{0x01b49a47, 0x03702485, 0x022e65f6, 0x00550d73, 0x0040f8ba, 0x03722925, 0x003c8b63, 0x00878920, 0x03889645, 0x002d1314}}, Y: Field{[10]uint32{0x02198d00, 0x018aa0f7, 0x031f5724, 0x02a7076b, 0x01509890, 0x021459ae, 0x0125e04b, 0x012e033c, 0x035df30c, 0x000b8590}}}, + {X: Field{[10]uint32{0x005dea26, 0x033fb2b8, 0x00603666, 0x0386d66d, 0x0333a20c, 0x02d1b65d, 0x01291a54, 0x00bc503a, 0x01e23586, 0x00256dcd}}, Y: Field{[10]uint32{0x024aabb9, 0x01159d49, 0x02553211, 0x02c4a1ba, 0x00f22ab5, 0x01ba0302, 0x03c9977b, 0x02f86426, 0x03055f38, 0x00384a05}}}, + {X: Field{[10]uint32{0x03e5bdfc, 0x024a3b5c, 0x027cee56, 0x02c99b06, 0x00a15c71, 0x03b91c5b, 0x028d2313, 0x00098db3, 0x00678fbb, 0x0020f676}}, Y: Field{[10]uint32{0x03949246, 0x021a1eda, 0x00545991, 0x0308df7e, 0x00c35027, 0x0267d280, 0x03e7d784, 0x03c4cbbf, 0x002fbe92, 0x00381253}}}, + {X: Field{[10]uint32{0x01bbae03, 0x010ddc12, 0x016f02e8, 0x0233cc37, 0x031d3b47, 0x02453891, 0x036bad16, 0x0151b6ef, 0x0085a04c, 0x000262df}}, Y: Field{[10]uint32{0x032ace57, 0x02718f4e, 0x00972e56, 0x03e510d9, 0x01ce4106, 0x0042c299, 0x0027da4a, 0x037f6764, 0x03953733, 0x001da70e}}}, + {X: Field{[10]uint32{0x03b12e45, 0x01018aa8, 0x01dfe086, 0x02c46691, 0x0375019c, 0x03699b54, 0x0358a8f4, 0x00d3b0d0, 0x0277852d, 0x000f39ed}}, Y: Field{[10]uint32{0x027e409a, 0x0158b751, 0x03218e42, 0x03677913, 0x0102cf03, 0x0179062a, 0x0272c4bd, 0x022e1a58, 0x010f0183, 0x001a349e}}}, + {X: Field{[10]uint32{0x02d7836f, 0x011c9fb2, 0x03291e07, 0x0320265e, 0x036b50bd, 0x00550ae0, 0x010dca75, 0x01c40507, 0x00f4d4da, 0x00282f0a}}, Y: Field{[10]uint32{0x03e47c88, 0x02d21665, 0x012242a8, 0x02f329e1, 0x02177eec, 0x027c58f4, 0x005a5819, 0x01e0735a, 0x014940f2, 0x001bb5f8}}}, + {X: Field{[10]uint32{0x02185c0b, 0x03846ac7, 0x00b6818f, 0x03126863, 0x0397750f, 0x00350660, 0x01d290ac, 0x0358ad39, 0x03a352b1, 0x002695c6}}, Y: Field{[10]uint32{0x011b4ad1, 0x0078a56b, 0x00128ff6, 0x01c26f76, 0x030f6c28, 0x00d19245, 0x03c0dfed, 0x03d63e73, 0x00cdb2b1, 0x0006a473}}}, + {X: Field{[10]uint32{0x0221b9bf, 0x03d91f8a, 0x00b93d53, 0x00760d23, 0x004e135c, 0x016a312c, 0x024eca55, 0x0379cc34, 0x004fcdd2, 0x003ee815}}, Y: Field{[10]uint32{0x0374568a, 0x015f8109, 0x023f7aed, 0x0327df6f, 0x02f71a6c, 0x03e0ef9a, 0x02fe631f, 0x01ab3cba, 0x0025a4ec, 0x001e8469}}}, + {X: Field{[10]uint32{0x00920a9b, 0x02af2875, 0x00b485f7, 0x00551585, 0x01ecad11, 0x0070eeb6, 0x002bdd70, 0x03d988e4, 0x013a1edb, 0x00365ac9}}, Y: Field{[10]uint32{0x0318c2e8, 0x0341980e, 0x031f2408, 0x0322c5cb, 0x021499f1, 0x03ccc54d, 0x027d09f2, 0x02e0c4bc, 0x0198f951, 0x000af222}}}, + {X: Field{[10]uint32{0x02267c2b, 0x012e2990, 0x0135613a, 0x00ba51f0, 0x01982338, 0x03e5c8fe, 0x02e14da0, 0x02e09652, 0x03ce1081, 0x000acf05}}, Y: Field{[10]uint32{0x036048ff, 0x037e9a4c, 0x0074fdbb, 0x030b6ef3, 0x02e77205, 0x009e8aad, 0x007f1fa4, 0x00916e23, 0x009f2ebd, 0x00293356}}}, + {X: Field{[10]uint32{0x016439f9, 0x0158da72, 0x021252eb, 0x03253f61, 0x013f6bc5, 0x03891367, 0x0313ea72, 0x0148b1a4, 0x0380fdac, 0x001a5a61}}, Y: Field{[10]uint32{0x01a03154, 0x0007ddc9, 0x0020ec10, 0x0053f880, 0x018d6e43, 0x02ee6653, 0x02b59439, 0x011d7f01, 0x03c6460f, 0x003a3bac}}}, + {X: Field{[10]uint32{0x00848c68, 0x0257be68, 0x03c6d763, 0x03f2b8bf, 0x02d1577e, 0x02ff0bd2, 0x03e172c9, 0x03713258, 0x02114cb4, 0x00078d11}}, Y: Field{[10]uint32{0x004f5b19, 0x00d0db10, 0x01e1da47, 0x00858167, 0x01a2bb46, 0x02ef1b54, 0x016d4643, 0x0268382e, 0x00dfe6f5, 0x0037aeee}}}, + {X: Field{[10]uint32{0x006aa61a, 0x022ba34a, 0x03a1fc55, 0x0213109c, 0x03d5c302, 0x034d78a1, 0x012c191b, 0x00aa6ae8, 0x02024c7f, 0x001b33eb}}, Y: Field{[10]uint32{0x02e7cb11, 0x0120e22d, 0x02de854e, 0x03c7ba0e, 0x0194c4cd, 0x00791623, 0x002ade25, 0x028bf74d, 0x01740c78, 0x00308050}}}, + {X: Field{[10]uint32{0x024c728e, 0x02c5b8b2, 0x0077ec32, 0x00fe525f, 0x02db4315, 0x006884a2, 0x03f0a2e6, 0x0284ccd6, 0x008769b6, 0x0016d7f5}}, Y: Field{[10]uint32{0x00f00c77, 0x039df363, 0x0108850f, 0x03694f10, 0x015a54c9, 0x01a1c46d, 0x01f26321, 0x027513ab, 0x013fb23c, 0x0026550d}}}, + {X: Field{[10]uint32{0x035d069e, 0x01aa6f00, 0x0221565a, 0x0277d504, 0x03e6a41d, 0x00c8ed8f, 0x03bbbd27, 0x01137587, 0x025727af, 0x001add28}}, Y: Field{[10]uint32{0x0032a34c, 0x02674cfd, 0x01756480, 0x01185491, 0x0039b87a, 0x03c01326, 0x03d689c5, 0x0237fed6, 0x0214f17b, 0x00029384}}}, + {X: Field{[10]uint32{0x00e372a2, 0x02fc50ee, 0x004b263c, 0x01b02ab8, 0x03868860, 0x03823cc5, 0x03408b9f, 0x03b4060d, 0x01878ae9, 0x00145c68}}, Y: Field{[10]uint32{0x03172d06, 0x01009d82, 0x037e8681, 0x0057164e, 0x0044da8e, 0x02a3c829, 0x024a4728, 0x014f33f9, 0x026b9641, 0x002d79f7}}}, + {X: Field{[10]uint32{0x03c8e80d, 0x03a5b350, 0x0356c279, 0x024a102d, 0x03dbce8a, 0x014a562a, 0x018568ce, 0x03bcc8d4, 0x006a4337, 0x00037e7a}}, Y: Field{[10]uint32{0x03027da7, 0x0246ed1c, 0x001df5f5, 0x037c1865, 0x0250b2cc, 0x03a4e04c, 0x00e8ff61, 0x01182844, 0x02eec72f, 0x001510ae}}}, + {X: Field{[10]uint32{0x0087c850, 0x0200608e, 0x033072ec, 0x024dedb4, 0x00ac9e46, 0x0240fef4, 0x0076ab73, 0x007dc6be, 0x0279eb6f, 0x003381c0}}, Y: Field{[10]uint32{0x02a155eb, 0x0037b52d, 0x01e84aea, 0x025d4e37, 0x016ea230, 0x0247e2b6, 0x03f2a79e, 0x034d1787, 0x01f988f9, 0x0037a0f7}}}, + {X: Field{[10]uint32{0x002f35fd, 0x01fcd213, 0x00c40766, 0x026c3b4a, 0x0296e578, 0x0274234d, 0x0238936c, 0x03213160, 0x006244af, 0x00280957}}, Y: Field{[10]uint32{0x033c6f7a, 0x0383459d, 0x0269f17e, 0x005f3589, 0x0206cd50, 0x02c83c88, 0x0098293f, 0x02635c32, 0x0007aef8, 0x0024f8b5}}}, + {X: Field{[10]uint32{0x02f0d86b, 0x009b72a1, 0x03ef0d51, 0x010370bd, 0x02138e18, 0x00e0ffd8, 0x00e1197a, 0x01775c50, 0x02adb76d, 0x002ba0b7}}, Y: Field{[10]uint32{0x0320964a, 0x02057295, 0x027c65f5, 0x01606668, 0x0072d36b, 0x038c2d64, 0x036d8ec2, 0x001de6a7, 0x03accaaa, 0x0008e76e}}}, + {X: Field{[10]uint32{0x02332393, 0x00dd7645, 0x0088444c, 0x02b27024, 0x0197c597, 0x02250918, 0x016441ea, 0x0178bb56, 0x01cebee6, 0x0033c266}}, Y: Field{[10]uint32{0x02748ca4, 0x017fecce, 0x01880865, 0x03481a4d, 0x011c664a, 0x016b736f, 0x03f8cd54, 0x03b75407, 0x03d2f074, 0x00198832}}}, + {X: Field{[10]uint32{0x00d3965c, 0x01600ce7, 0x0222a762, 0x00065151, 0x029ec068, 0x02eb2ecd, 0x03ff1b41, 0x02c06d8e, 0x03746404, 0x0017ed2b}}, Y: Field{[10]uint32{0x032abff5, 0x0338e489, 0x03e93d99, 0x02d16553, 0x00916a51, 0x01239d12, 0x009529fa, 0x01a5f350, 0x02e12cce, 0x0011932c}}}, + {X: Field{[10]uint32{0x033216b4, 0x00e83cc6, 0x023a0199, 0x003e0453, 0x002c7a35, 0x00af12b3, 0x01e5687a, 0x008cb815, 0x000a46b5, 0x00056bcf}}, Y: Field{[10]uint32{0x01d45a83, 0x00e95d33, 0x03b37ad8, 0x02795a96, 0x0286c818, 0x028ffdee, 0x035acd93, 0x00e2c11c, 0x039bbdce, 0x002b80dc}}}, + {X: Field{[10]uint32{0x000b4b10, 0x00cf8d95, 0x0046576d, 0x021d9034, 0x0232c887, 0x00b65cf6, 0x00b8b5d3, 0x0333150b, 0x01d1d008, 0x0017400d}}, Y: Field{[10]uint32{0x0254c465, 0x00f9ef9b, 0x02f39617, 0x023356d2, 0x0376db8a, 0x00e9d3c5, 0x009061f7, 0x027ca19a, 0x00e5bffa, 0x001123b6}}}, + {X: Field{[10]uint32{0x03c95527, 0x01eeb520, 0x03915e02, 0x0013f12b, 0x02a40b07, 0x03f1a78e, 0x039d322f, 0x01277fb6, 0x00f39cf7, 0x0025131c}}, Y: Field{[10]uint32{0x006c6f0c, 0x023b2f6e, 0x02fc21a1, 0x03f52388, 0x02df10ac, 0x012699a6, 0x026e95ce, 0x024cc992, 0x003bbf48, 0x002c2b03}}}, + {X: Field{[10]uint32{0x011e4402, 0x02f17585, 0x00acc846, 0x0095b34a, 0x0052e262, 0x02b58bc1, 0x0246754d, 0x00f128fc, 0x01f082ec, 0x003e9486}}, Y: Field{[10]uint32{0x027afae9, 0x0138fcc2, 0x0065a01b, 0x00af7340, 0x01eb730d, 0x000a240c, 0x0364f26a, 0x00c4cb5e, 0x01e9d640, 0x000cb3a0}}}, + {X: Field{[10]uint32{0x00a30ede, 0x010e4a0e, 0x03032704, 0x01ad766f, 0x0085c6a1, 0x0162e146, 0x009455a8, 0x03898c14, 0x0230ddbe, 0x00327d2a}}, Y: Field{[10]uint32{0x00ad7b7c, 0x02dd8c8d, 0x01baea15, 0x00d30be9, 0x03add203, 0x01adcee9, 0x00927994, 0x02bcc66a, 0x03c6b438, 0x0017bdc5}}}, + {X: Field{[10]uint32{0x03770319, 0x0305e39e, 0x02120162, 0x018b7bba, 0x020529b3, 0x01cb53ff, 0x00dd2fdc, 0x0355a56c, 0x03ca7454, 0x000bd33c}}, Y: Field{[10]uint32{0x02f7d487, 0x0033ade8, 0x02042d5a, 0x0317fc51, 0x02fe7c87, 0x02dd9c24, 0x03c1ce0f, 0x03af2fd1, 0x020e3566, 0x003736a4}}}, + {X: Field{[10]uint32{0x01969945, 0x02a5ae1e, 0x02af40a0, 0x01080891, 0x02a1cb0a, 0x007e46cf, 0x03a41a75, 0x035d2bc1, 0x01762e0c, 0x000905fd}}, Y: Field{[10]uint32{0x027807d9, 0x02e9ffc7, 0x02ceefcf, 0x01b65aea, 0x01741ef9, 0x0072d13b, 0x02d0a3f6, 0x01c6f2b6, 0x0355f8dc, 0x001aa5b5}}}, + {X: Field{[10]uint32{0x0088852c, 0x02d86e16, 0x008c66cf, 0x002bba45, 0x00d43d06, 0x02ecf6e9, 0x01ca5bac, 0x00707d9d, 0x0384305a, 0x0026ac8b}}, Y: Field{[10]uint32{0x0028a03e, 0x02d45ea9, 0x01c18e23, 0x01acb32a, 0x03b51d99, 0x02b3768e, 0x02ac12a7, 0x0238e9eb, 0x02faa258, 0x002bc141}}}, + {X: Field{[10]uint32{0x00a72b6c, 0x00074749, 0x02f52875, 0x00996858, 0x0077a917, 0x038551c9, 0x00ed8787, 0x01e4980a, 0x02a22462, 0x003dd087}}, Y: Field{[10]uint32{0x0343fcf6, 0x00224015, 0x004dd8f5, 0x03322160, 0x01fe1c72, 0x03351845, 0x032ca6d8, 0x0104cbcd, 0x0265e448, 0x0036c2b9}}}, + {X: Field{[10]uint32{0x035c6f75, 0x00ef5ff7, 0x01e35496, 0x02edf65c, 0x0110a912, 0x02e61d6c, 0x00bb7918, 0x015fa370, 0x02f3548d, 0x000d5d5a}}, Y: Field{[10]uint32{0x0077a1d2, 0x01c26378, 0x0260fc51, 0x023882c5, 0x0186d94b, 0x03538658, 0x02d69aeb, 0x02d3f753, 0x01ba78a2, 0x0007291b}}}, + {X: Field{[10]uint32{0x03f01837, 0x031136c6, 0x01bc0241, 0x030bf80c, 0x03de4041, 0x0036b9ff, 0x0049d9ab, 0x03ebc859, 0x000c494c, 0x0029fa7c}}, Y: Field{[10]uint32{0x021a0280, 0x02013005, 0x008b7d10, 0x03793bd4, 0x005a7760, 0x02d7eedd, 0x013d0093, 0x0101aa5d, 0x01ae480b, 0x003cabae}}}, + {X: Field{[10]uint32{0x0262adb7, 0x03d79bf2, 0x03c1ac88, 0x028a4213, 0x0064838a, 0x0195739c, 0x037755b7, 0x00a1e5dc, 0x01ba9287, 0x001a5147}}, Y: Field{[10]uint32{0x002b1cd9, 0x00fc69ec, 0x0143c0c7, 0x01ed468c, 0x00107153, 0x01b1ee54, 0x01845d49, 0x03c244c7, 0x03a8d40d, 0x00098863}}}, + {X: Field{[10]uint32{0x02abf06d, 0x01b338f6, 0x00ad35eb, 0x003c3148, 0x0089a92d, 0x0220817f, 0x0186a375, 0x0299bf3a, 0x033015cc, 0x0031270e}}, Y: Field{[10]uint32{0x000e354c, 0x01b59f16, 0x01b5e621, 0x02714f8c, 0x03624291, 0x034ab425, 0x00f9ca99, 0x000ac383, 0x004a665b, 0x001ebf7a}}}, + {X: Field{[10]uint32{0x039dae8f, 0x01ad891a, 0x003871ab, 0x0110215c, 0x0090c0c7, 0x0047053e, 0x036ee1df, 0x01b8e316, 0x01bfb68e, 0x003a7860}}, Y: Field{[10]uint32{0x01ef5e1b, 0x0309a8b5, 0x00018fc6, 0x0297868d, 0x00d1af5c, 0x00d946a9, 0x007e260c, 0x010c5c24, 0x02db3f39, 0x002c2f3f}}}, + {X: Field{[10]uint32{0x02392324, 0x00b8c0b7, 0x028bc406, 0x00e2ae67, 0x012e7d87, 0x0035b87e, 0x01c9e52e, 0x01073d6d, 0x006f0adf, 0x00290a16}}, Y: Field{[10]uint32{0x01b8d142, 0x019fc225, 0x031c83f9, 0x00fd37a0, 0x01a2a741, 0x012737ba, 0x03911e8b, 0x0324dd96, 0x018bfe71, 0x001df0f8}}}, + {X: Field{[10]uint32{0x032712cf, 0x03743641, 0x0194d785, 0x039d7bfb, 0x0038077b, 0x0195a99d, 0x00a4830b, 0x0068952d, 0x02d2de1d, 0x003d724b}}, Y: Field{[10]uint32{0x033958fb, 0x019c2e7a, 0x03f1ed7c, 0x01f80699, 0x01228fdf, 0x01471446, 0x01f6dcbc, 0x0127356d, 0x013a4978, 0x001fba63}}}, + {X: Field{[10]uint32{0x009c3f66, 0x023c062d, 0x034bdf26, 0x031ffc95, 0x01e18c19, 0x019ed55c, 0x01b69307, 0x03d418c4, 0x03ca6c85, 0x002a15c1}}, Y: Field{[10]uint32{0x028aa050, 0x006367d7, 0x0273d775, 0x00d5356e, 0x00536543, 0x00dee3ee, 0x0367d103, 0x038626ab, 0x0271cde2, 0x0005e17f}}}, + {X: Field{[10]uint32{0x00a7468d, 0x0250bfb0, 0x0197c0f9, 0x01819e9f, 0x00d084ab, 0x027b2971, 0x01e0cf81, 0x03470bcb, 0x035fa4c8, 0x0002219b}}, Y: Field{[10]uint32{0x0188336e, 0x024c120d, 0x0009afe6, 0x022e9fb0, 0x02291528, 0x01d8af9b, 0x02c49adc, 0x0241e8bd, 0x026c3f33, 0x000c0508}}}, + {X: Field{[10]uint32{0x020688cc, 0x02f8532b, 0x03d66f40, 0x02d59186, 0x0392af22, 0x036901b3, 0x03d07c8b, 0x00b5a385, 0x017337eb, 0x001097db}}, Y: Field{[10]uint32{0x004d4980, 0x035a63f4, 0x03dbdef8, 0x016561c6, 0x00096436, 0x0202f67f, 0x0373290e, 0x038e446a, 0x026f7c42, 0x003a1954}}}, + {X: Field{[10]uint32{0x00323139, 0x03208f5a, 0x019a2f8a, 0x02bcef27, 0x0236bfe6, 0x00f7ad2f, 0x00184414, 0x02cff555, 0x003e1de3, 0x0003dc3f}}, Y: Field{[10]uint32{0x0224ce03, 0x01012d76, 0x0144adae, 0x002d02aa, 0x008ae575, 0x01ac635e, 0x0374a82d, 0x02cc278d, 0x014b1feb, 0x0022d1e6}}}, + {X: Field{[10]uint32{0x0283116c, 0x002cd8ca, 0x0106758a, 0x03650e7a, 0x00d59c66, 0x02be8487, 0x003b10ce, 0x00a8581c, 0x00f3038d, 0x0006fa58}}, Y: Field{[10]uint32{0x01e29aef, 0x0070378f, 0x0201062f, 0x036c67ba, 0x030647e0, 0x02c0403e, 0x01549cc3, 0x03b810d4, 0x022f8218, 0x001fe932}}}, + {X: Field{[10]uint32{0x020cf385, 0x01cb54cc, 0x02a7e484, 0x022520c7, 0x02e915eb, 0x01a52a03, 0x0351e9f5, 0x02028e2b, 0x02d3bc5c, 0x00007ca8}}, Y: Field{[10]uint32{0x013940e5, 0x0194ef9b, 0x00e9ff55, 0x001d9e0b, 0x0147053f, 0x0399c07e, 0x03cb9455, 0x013127e6, 0x0239174b, 0x0028633a}}}, + {X: Field{[10]uint32{0x00d04766, 0x01dfcf91, 0x0140e884, 0x00dff9dc, 0x019aa67c, 0x01f2beaa, 0x03908611, 0x01ac2edd, 0x03607084, 0x0001875a}}, Y: Field{[10]uint32{0x00f2688f, 0x0230472a, 0x024d2533, 0x03ab2bdc, 0x02b7c4b1, 0x0325b799, 0x02eb59a6, 0x026b858c, 0x02908684, 0x0031fd2f}}}, + {X: Field{[10]uint32{0x02e6cc9c, 0x033c3507, 0x03c4fe6c, 0x00e249db, 0x026d5405, 0x012f9fc9, 0x0108daf0, 0x019145e5, 0x00932d9a, 0x0000acdc}}, Y: Field{[10]uint32{0x015beca7, 0x0002438a, 0x01d9f5ca, 0x0111860e, 0x0391cdfc, 0x005b382d, 0x016a1d86, 0x0262c7b8, 0x03f42c89, 0x003000a8}}}, + {X: Field{[10]uint32{0x02708858, 0x03598a7c, 0x0263a87c, 0x0255a89d, 0x0364af0e, 0x03fa6c07, 0x03fd1360, 0x02de8d35, 0x03efaba8, 0x00123d70}}, Y: Field{[10]uint32{0x0232b5ab, 0x03c0fa3f, 0x015e2b88, 0x02fed4a2, 0x0290aefd, 0x00be5cef, 0x02f09cc5, 0x019c91f0, 0x00b7fce4, 0x002330e3}}}, + {X: Field{[10]uint32{0x0262cfa0, 0x007766cf, 0x00b86e98, 0x03a42798, 0x00adfbe9, 0x01edb54d, 0x01cfc876, 0x03089dbd, 0x01972e5e, 0x0039826d}}, Y: Field{[10]uint32{0x02b43081, 0x00cf997c, 0x0189f0a4, 0x005826b8, 0x02335ca6, 0x02fc6c9e, 0x0385e3db, 0x017f4f8e, 0x01eeff20, 0x001afa70}}}, + {X: Field{[10]uint32{0x016d205a, 0x019a806c, 0x02b0b2ab, 0x01ecb69a, 0x02f19a76, 0x03bc3073, 0x02b8ea81, 0x0273211b, 0x031a5b2c, 0x003af902}}, Y: Field{[10]uint32{0x03c67058, 0x01be4525, 0x032f445d, 0x008035c2, 0x02967d69, 0x02593d76, 0x01899bd1, 0x032f440e, 0x00e8e4fe, 0x000bddc4}}}, + {X: Field{[10]uint32{0x018e3abd, 0x037d964d, 0x01b3ff70, 0x01160f60, 0x03dbc72d, 0x02c18af3, 0x03d32f39, 0x02c7bd94, 0x00399391, 0x0025f353}}, Y: Field{[10]uint32{0x03f37968, 0x036629fe, 0x03fe813d, 0x00ae88ce, 0x02263acf, 0x03a7d72b, 0x03c35c56, 0x02db7be6, 0x0184a175, 0x00281698}}}, + {X: Field{[10]uint32{0x02a7e6d9, 0x0128f06f, 0x0100ebf6, 0x02a80de0, 0x03257343, 0x019566b9, 0x00d99fce, 0x0343a14f, 0x00aa1d3f, 0x00209a4a}}, Y: Field{[10]uint32{0x021efc79, 0x02c1ec8b, 0x0399b020, 0x022a26ec, 0x02faad7f, 0x03dbe112, 0x010fddfc, 0x03a42bfd, 0x01b1a3bd, 0x002f128b}}}, + {X: Field{[10]uint32{0x03a19121, 0x03b4e697, 0x02398967, 0x00c59dcb, 0x0283bd14, 0x0042eb9e, 0x02e91814, 0x0257745d, 0x0097f3ac, 0x000f9d50}}, Y: Field{[10]uint32{0x0118df32, 0x03f99d69, 0x01801135, 0x0251fcfc, 0x0000ca7f, 0x033e50db, 0x0107ea15, 0x033fe282, 0x0299c6a2, 0x001d1b33}}}, + {X: Field{[10]uint32{0x029365db, 0x014c998c, 0x028fa446, 0x0118eee0, 0x0282991f, 0x02809c19, 0x00a236c8, 0x02651e02, 0x0064b49b, 0x003394e5}}, Y: Field{[10]uint32{0x022e5dd9, 0x0353009d, 0x00d41a74, 0x027046cb, 0x03a7bda7, 0x0270b0e2, 0x01f2fda2, 0x011d8c18, 0x02c2b8bc, 0x000d5e3f}}}, + {X: Field{[10]uint32{0x03e349dd, 0x0030ebd4, 0x036692c9, 0x01a4854c, 0x0344a2b6, 0x01929df2, 0x0041d6ae, 0x0056b5eb, 0x01d9cda6, 0x00324cf6}}, Y: Field{[10]uint32{0x0172c610, 0x002c36c1, 0x00c11f9f, 0x012a8713, 0x02a25b05, 0x0262eaf3, 0x02a8ede2, 0x03aeee3c, 0x024f83ba, 0x00129b68}}}, + {X: Field{[10]uint32{0x000b2ac4, 0x0068ef20, 0x03d51d08, 0x03bca009, 0x03a78e2d, 0x0237777b, 0x0116f2e7, 0x02057fa4, 0x003b1aa9, 0x001166a9}}, Y: Field{[10]uint32{0x03e993d5, 0x017f1f18, 0x016454bd, 0x01583f0a, 0x025c6151, 0x0377347c, 0x02900d4c, 0x0178c2c5, 0x03c3de99, 0x0006b3b6}}}, + {X: Field{[10]uint32{0x023b0a5e, 0x01fe44c7, 0x004d43b2, 0x00d268c3, 0x00ff4453, 0x018e6aff, 0x00675640, 0x02b4a7ad, 0x01d99862, 0x0017caa9}}, Y: Field{[10]uint32{0x01ace144, 0x01507258, 0x02cfbce7, 0x02df7538, 0x025acfbb, 0x0116ce6c, 0x01ef9ba4, 0x002fcb67, 0x022be61d, 0x0015c7b2}}}, + {X: Field{[10]uint32{0x00f4fd1d, 0x02079822, 0x000f5756, 0x01fe51ed, 0x01fc2c3d, 0x028ce152, 0x0393e681, 0x01756630, 0x021de6cc, 0x003b19ba}}, Y: Field{[10]uint32{0x01280f52, 0x01f6faaa, 0x025978ab, 0x027e8dc1, 0x02554073, 0x0029525e, 0x014dfa9d, 0x0210d562, 0x03db3b37, 0x0035c47f}}}, + {X: Field{[10]uint32{0x016105fe, 0x0205a0ab, 0x007ab1a4, 0x00e31e15, 0x0169ad06, 0x03472ace, 0x003f018b, 0x01fcb666, 0x01f5aa09, 0x001ab14f}}, Y: Field{[10]uint32{0x0218a598, 0x03238159, 0x00578abf, 0x025aee82, 0x013cd517, 0x010c1e5a, 0x008f2242, 0x02e46652, 0x02815127, 0x00257da6}}}, + {X: Field{[10]uint32{0x0396c0b0, 0x00bc4a67, 0x014fd384, 0x02142cd1, 0x0016fb5c, 0x03700b3d, 0x026dcb8f, 0x0343f711, 0x01e29e4a, 0x002a28fa}}, Y: Field{[10]uint32{0x0316dc2b, 0x00e29559, 0x03685ce1, 0x00242f78, 0x03169b8d, 0x00e535f0, 0x016d152f, 0x037a943b, 0x033e3006, 0x0037e1ba}}}, + {X: Field{[10]uint32{0x02db251c, 0x01030f79, 0x0116632c, 0x01f0c618, 0x001dbe98, 0x03b69b7e, 0x02c84a2f, 0x01d06e57, 0x00d2a0d8, 0x001429d9}}, Y: Field{[10]uint32{0x03e41055, 0x03ed089f, 0x00a4085c, 0x03890c29, 0x0176a8c7, 0x03a6d44b, 0x027632ac, 0x005f052d, 0x03f02339, 0x002ca080}}}, + {X: Field{[10]uint32{0x02b51ef9, 0x01d1b286, 0x013a9423, 0x021160a2, 0x011bd9c5, 0x01b8e73e, 0x0056c9fa, 0x037c749a, 0x00b15ef9, 0x0030b0c5}}, Y: Field{[10]uint32{0x012ab759, 0x0086693a, 0x01d4493e, 0x00c79c5d, 0x03a22f1e, 0x0167c22d, 0x009a9f5d, 0x037eaae5, 0x0286ff7f, 0x00289fe4}}}, + {X: Field{[10]uint32{0x02a9d3df, 0x01aee49d, 0x01b75dbf, 0x01d4dc3f, 0x0364868b, 0x00882930, 0x03ce375e, 0x032344ac, 0x0185da44, 0x002e9955}}, Y: Field{[10]uint32{0x024fda50, 0x0198eef2, 0x0073be51, 0x0139bf22, 0x00bdd9d0, 0x00cb3127, 0x0318f614, 0x00e16f7b, 0x016ba03a, 0x000f5938}}}, + {X: Field{[10]uint32{0x006e600e, 0x0173fbe9, 0x001c2aca, 0x004ee785, 0x0256bd0d, 0x00694403, 0x0276a650, 0x000292d6, 0x0249d4d1, 0x000f517e}}, Y: Field{[10]uint32{0x00059176, 0x02f70ad6, 0x001eced5, 0x0039cc60, 0x00da3039, 0x031d6e92, 0x01a93b13, 0x03b90b87, 0x013c38ee, 0x000024a5}}}, + {X: Field{[10]uint32{0x008c3a8c, 0x011ac12f, 0x005964ca, 0x01fd144e, 0x0083e5ab, 0x03ecb043, 0x025d96e1, 0x030f8903, 0x0346e40d, 0x00391930}}, Y: Field{[10]uint32{0x0204cf4e, 0x03243594, 0x0390fc7a, 0x0293d5f3, 0x030ca364, 0x01d3359e, 0x02205aa3, 0x0142f4a0, 0x03461829, 0x0018fc52}}}, + {X: Field{[10]uint32{0x02a42688, 0x010b756b, 0x001e3fdf, 0x03931ce1, 0x00d56f3f, 0x034f71c8, 0x030d218b, 0x02cc1c16, 0x012fe235, 0x000529f8}}, Y: Field{[10]uint32{0x01e9ff2a, 0x02fce8c5, 0x038099ee, 0x01266b84, 0x00eac312, 0x004de93c, 0x02a22d48, 0x03d20bb5, 0x03cc40ce, 0x0035e5a0}}}, + {X: Field{[10]uint32{0x023828be, 0x03ec1e25, 0x01936a99, 0x00ae1757, 0x0061d2ee, 0x02cbfdbd, 0x0334ffab, 0x01cec896, 0x03b821af, 0x00239ebe}}, Y: Field{[10]uint32{0x026b1853, 0x02739f6b, 0x01ec16cc, 0x01c37b98, 0x02bb5284, 0x00838418, 0x015bea0e, 0x01da33c1, 0x03765aa0, 0x00010391}}}, + {X: Field{[10]uint32{0x03297573, 0x0181a414, 0x002465b1, 0x015629fb, 0x017d8440, 0x03973a0a, 0x00f9f1f9, 0x02f43d2f, 0x01623227, 0x00275904}}, Y: Field{[10]uint32{0x0307fc8d, 0x030d70e6, 0x01b2c126, 0x03576974, 0x021f8630, 0x003fb027, 0x0067ea47, 0x006f95c0, 0x03a06800, 0x003b4360}}}, + {X: Field{[10]uint32{0x03c83eaf, 0x0201625f, 0x00f0b7bd, 0x03c512bc, 0x0352bb40, 0x00f69d39, 0x025b52be, 0x02767d04, 0x02d6d9e4, 0x0019d631}}, Y: Field{[10]uint32{0x004fd292, 0x032d0d06, 0x026e36a1, 0x033351a0, 0x005f7d22, 0x0255df6f, 0x0229b3de, 0x00b0d8e8, 0x008ec2aa, 0x001d26b8}}}, + {X: Field{[10]uint32{0x0061d73a, 0x0045452f, 0x03fb80da, 0x0066d28c, 0x01326327, 0x0293047d, 0x0193df63, 0x00b62c53, 0x01a04570, 0x0002cf84}}, Y: Field{[10]uint32{0x01d562eb, 0x01bef66a, 0x02d189a8, 0x02d8d2c8, 0x009660c6, 0x032e5c11, 0x02238928, 0x01fb0806, 0x02b12b26, 0x0031b854}}}, + {X: Field{[10]uint32{0x026fa5f1, 0x03b56835, 0x00b98994, 0x00f08842, 0x02137bf4, 0x002e789d, 0x0371b0fe, 0x02644404, 0x01ea3b30, 0x001428c9}}, Y: Field{[10]uint32{0x0345b70e, 0x02b8500d, 0x00739dfe, 0x027009d4, 0x028a9939, 0x02ce7bfa, 0x03585279, 0x002a9629, 0x011fd39e, 0x00251b6b}}}, + {X: Field{[10]uint32{0x015e9661, 0x0138c8ba, 0x03e39121, 0x029a91bb, 0x02a97341, 0x02b1423b, 0x02802ce8, 0x03568b3d, 0x02493bef, 0x003df23c}}, Y: Field{[10]uint32{0x0234cb67, 0x00f62347, 0x03f5d4e3, 0x039fe8fc, 0x02573883, 0x02639365, 0x00b7ec05, 0x03cdc051, 0x00c4eec1, 0x000f01cb}}}, + {X: Field{[10]uint32{0x038f85b6, 0x01977200, 0x00cc3c89, 0x02ee1b0a, 0x0038c7e7, 0x03127a9a, 0x030b94e9, 0x00ce1bc2, 0x0350c154, 0x000c0b4e}}, Y: Field{[10]uint32{0x00310744, 0x00b496a2, 0x03720567, 0x00a3539f, 0x013588d1, 0x01b1e324, 0x0366e5a9, 0x02a8bd82, 0x03d0d891, 0x00262011}}}, + {X: Field{[10]uint32{0x019f0eb7, 0x014edf48, 0x0386afbf, 0x03f2c363, 0x021d3810, 0x017b7a26, 0x00e8ecb5, 0x016e9834, 0x03282e7e, 0x0032e3b9}}, Y: Field{[10]uint32{0x038094cd, 0x038058ea, 0x0118e75f, 0x018381a8, 0x02bc10bd, 0x03c12470, 0x009a4e3c, 0x00426423, 0x022befad, 0x0012c13a}}}, + {X: Field{[10]uint32{0x03d5fd42, 0x015cb533, 0x0131b211, 0x00d7e42f, 0x0174f920, 0x031ce927, 0x00f6f04a, 0x0362a883, 0x022b4a0c, 0x0019172a}}, Y: Field{[10]uint32{0x037ef5b9, 0x0320d1be, 0x010a6b6f, 0x008dfd47, 0x03b0aa13, 0x03f945b6, 0x022b64ea, 0x035f0779, 0x019635f9, 0x001e4fca}}}, + {X: Field{[10]uint32{0x015f5a21, 0x031289ce, 0x034f3e69, 0x01ccf617, 0x00f00b1c, 0x0185f593, 0x034b8df6, 0x02d79d50, 0x002f6148, 0x00134dcd}}, Y: Field{[10]uint32{0x03a708bd, 0x01df6294, 0x01cded15, 0x0374e341, 0x034eebd7, 0x006dad99, 0x00a7db2b, 0x031c1519, 0x012bd4c5, 0x00190002}}}, + {X: Field{[10]uint32{0x00c0e0d8, 0x024c5c06, 0x02d3dbd6, 0x00d0db9d, 0x01747a21, 0x034a2f4e, 0x02c6285e, 0x001ecad2, 0x0317024e, 0x00398d2f}}, Y: Field{[10]uint32{0x03e9f021, 0x036e1cc4, 0x00a53020, 0x03efa25f, 0x025e9660, 0x02c44e1d, 0x01d9d8b6, 0x02947b0c, 0x02de4b82, 0x003332f2}}}, + {X: Field{[10]uint32{0x020cef38, 0x0044014d, 0x0192ba51, 0x0018eefe, 0x0264c490, 0x00c74966, 0x03ff5354, 0x03144f56, 0x01e62767, 0x00202803}}, Y: Field{[10]uint32{0x028ef572, 0x033737d8, 0x036b203f, 0x03de54c2, 0x03b2620d, 0x03f71f80, 0x027e23e8, 0x00cd9b11, 0x0189e8d7, 0x001f73ad}}}, + {X: Field{[10]uint32{0x028f8a0f, 0x00b8b767, 0x0225d05b, 0x0197dc65, 0x02baf5b7, 0x0047571d, 0x01b8409f, 0x0143b669, 0x00e6d23d, 0x00181b54}}, Y: Field{[10]uint32{0x03b32788, 0x010d9acf, 0x00cc748c, 0x03a2edf2, 0x004cbb41, 0x0305c480, 0x001d2206, 0x02d30bf3, 0x009245b1, 0x00067d55}}}, + {X: Field{[10]uint32{0x024f0420, 0x03583b83, 0x02a247fd, 0x020ce359, 0x02266c30, 0x0392864c, 0x03ea835a, 0x013edd29, 0x0214f7d4, 0x00272282}}, Y: Field{[10]uint32{0x01d9169a, 0x021d1679, 0x028b4d01, 0x01e8ecaf, 0x018737fc, 0x006bb74a, 0x02da6218, 0x023748c7, 0x02373157, 0x0010b1b0}}}, + {X: Field{[10]uint32{0x0235da1c, 0x030cf6c7, 0x00e59ceb, 0x032810ea, 0x001a32d3, 0x02905e49, 0x01a01548, 0x01bd63fe, 0x00f781a4, 0x0035b33f}}, Y: Field{[10]uint32{0x021d084f, 0x037c88e1, 0x016d568b, 0x02f24409, 0x0287cbcf, 0x015c3e0c, 0x00824e61, 0x01ae362d, 0x021ace84, 0x002872ae}}}, + {X: Field{[10]uint32{0x01f2e3c4, 0x01aeb67d, 0x000da459, 0x03b6903b, 0x006eed5d, 0x0251f234, 0x016f4464, 0x00ffc915, 0x036a3e4c, 0x00233ebc}}, Y: Field{[10]uint32{0x00f3c4d7, 0x0381a4b6, 0x031fcc80, 0x00ee5b28, 0x026b7237, 0x00419fc8, 0x03f81d1c, 0x0337f78c, 0x02ccede6, 0x002646db}}}, + {X: Field{[10]uint32{0x03e664a0, 0x03023aed, 0x03da0541, 0x02c1245f, 0x03189849, 0x031a9b31, 0x02f39738, 0x00e82ef3, 0x01815b0f, 0x00351b0f}}, Y: Field{[10]uint32{0x0167c159, 0x033962b6, 0x026421fe, 0x02650107, 0x0158cffe, 0x02a13b60, 0x02dc9b63, 0x03975f22, 0x03b6d053, 0x000d5492}}}, + {X: Field{[10]uint32{0x037adfff, 0x008ffb0a, 0x02f0490c, 0x01d7280b, 0x03e2ce9b, 0x0118df73, 0x02dce33e, 0x0237dfe0, 0x00a52f1f, 0x0023b5fc}}, Y: Field{[10]uint32{0x028d99ff, 0x003088d8, 0x019a55d9, 0x017509dd, 0x024be1aa, 0x037b8ed9, 0x00272253, 0x0344325b, 0x00c7b418, 0x003c0918}}}, + {X: Field{[10]uint32{0x01aaa2ca, 0x02a17d9b, 0x02c2b0ce, 0x02ca2af4, 0x00825c46, 0x03ba8ffc, 0x03a4d6ca, 0x0146f54a, 0x02dca8a3, 0x0010cfb2}}, Y: Field{[10]uint32{0x022977e5, 0x02850bc5, 0x0038f983, 0x03f20f41, 0x03f6d396, 0x01bce438, 0x00d03c48, 0x0345dd17, 0x01bcc2d7, 0x00134edc}}}, + {X: Field{[10]uint32{0x03a006e6, 0x02cfe72e, 0x014eb249, 0x00ec5701, 0x03ba0449, 0x007d990a, 0x01bbddd8, 0x01fe0dea, 0x02f31037, 0x00301dc7}}, Y: Field{[10]uint32{0x034ccb1e, 0x037c963b, 0x015b0784, 0x00ce98e5, 0x00e1ea2b, 0x01e35312, 0x018c6b47, 0x01a809e2, 0x01ab1d81, 0x000f94f7}}}, + {X: Field{[10]uint32{0x03597ad7, 0x00ea7143, 0x03d238ff, 0x02a29d07, 0x0092072b, 0x00d71b36, 0x0197383e, 0x021ee54e, 0x02264a6a, 0x00370b80}}, Y: Field{[10]uint32{0x0012c74d, 0x00f07c5f, 0x00e01d8a, 0x03272f20, 0x018ddbac, 0x03d65fa1, 0x00ac0ff6, 0x03dc8d10, 0x0346ecd5, 0x002263b9}}}, + {X: Field{[10]uint32{0x02dab771, 0x002dd81a, 0x01f0311f, 0x02cbb60e, 0x01d043d7, 0x0273678c, 0x005f7811, 0x0232fc7f, 0x023459ad, 0x0005aeb3}}, Y: Field{[10]uint32{0x002fb1c4, 0x01b077f0, 0x01243e89, 0x02c4af52, 0x0066e835, 0x00acae0d, 0x02239797, 0x025f8cb2, 0x01326ec6, 0x00003d91}}}, + {X: Field{[10]uint32{0x0169c736, 0x017ce95f, 0x001a4072, 0x036a0e72, 0x029af55e, 0x023c00d1, 0x02539a86, 0x0050e451, 0x018f3a27, 0x002bee53}}, Y: Field{[10]uint32{0x035201d8, 0x03a2f468, 0x009cb386, 0x029d5653, 0x00bdf37f, 0x0158f5d9, 0x00a4eff7, 0x000c769c, 0x014ea455, 0x002bf6ca}}}, + {X: Field{[10]uint32{0x00e89b74, 0x0056aa74, 0x01dc706b, 0x02017de0, 0x02ecc337, 0x0006397a, 0x01b0ae76, 0x03dfd07b, 0x02364a98, 0x002ecc74}}, Y: Field{[10]uint32{0x02031a9a, 0x029307f6, 0x01c27a92, 0x0229ee76, 0x0287cbc2, 0x01373657, 0x009f032f, 0x0331fb35, 0x00031f47, 0x00068193}}}, + {X: Field{[10]uint32{0x004318b8, 0x00f0454f, 0x0270001c, 0x01bb5c9f, 0x03241e48, 0x03bdba0e, 0x0204ee30, 0x0176a059, 0x036c4bbf, 0x003dcec6}}, Y: Field{[10]uint32{0x008c9b17, 0x03e6e29b, 0x01ffb476, 0x03bcedf5, 0x0125ba08, 0x03006c98, 0x00ac2255, 0x0132ead6, 0x016e09d6, 0x00268a2b}}}, + {X: Field{[10]uint32{0x01afa8a4, 0x01ba4864, 0x03313b23, 0x01983c34, 0x03708c87, 0x025816ca, 0x038ea7b6, 0x03168213, 0x0212d0dd, 0x00018ef4}}, Y: Field{[10]uint32{0x016c3e67, 0x001da631, 0x01b0fa33, 0x023b33b3, 0x0102fbca, 0x027f4d0b, 0x03bb0b3a, 0x0100c82b, 0x00f60482, 0x0003b9bd}}}, + {X: Field{[10]uint32{0x02bc6465, 0x001fe186, 0x016299e0, 0x01761d7f, 0x00967b95, 0x031a241e, 0x02416b78, 0x020088c2, 0x022b3606, 0x0018d9f4}}, Y: Field{[10]uint32{0x029417eb, 0x00a225fd, 0x020bbec6, 0x011e4967, 0x03118d16, 0x01657e6c, 0x02444ad5, 0x01e4fc5f, 0x032d14e6, 0x0030fb87}}}, + {X: Field{[10]uint32{0x0085976e, 0x00186a25, 0x02c4f2df, 0x003c2d8c, 0x020c922d, 0x0120e531, 0x0101e3a4, 0x03d4b95e, 0x0143fbb7, 0x001938b9}}, Y: Field{[10]uint32{0x00ab2a4c, 0x024df7ff, 0x0011b48f, 0x01093f38, 0x02895119, 0x0218e939, 0x0047e5a5, 0x01a2d3f1, 0x002e336a, 0x00190698}}}, + {X: Field{[10]uint32{0x03fee1c6, 0x03cc0c78, 0x03f38d6b, 0x01298399, 0x02e16e82, 0x036704c8, 0x0179e869, 0x00d72347, 0x02fd18c8, 0x000b8a42}}, Y: Field{[10]uint32{0x01390f21, 0x0199161e, 0x03874962, 0x02b178dc, 0x02da18cc, 0x00a68d89, 0x0286b0ec, 0x01ad9c1d, 0x028ed2fa, 0x001fe158}}}, + {X: Field{[10]uint32{0x00ee401e, 0x03c421cb, 0x0242b17e, 0x0333602e, 0x00c0ba2d, 0x02231ddd, 0x03229079, 0x0174f7d7, 0x008a0c47, 0x00216688}}, Y: Field{[10]uint32{0x0319f5d8, 0x009ffea2, 0x01e31336, 0x0297c4d2, 0x0384b982, 0x03e84bf3, 0x02ed1e3c, 0x01d0eb58, 0x0245778e, 0x002999f1}}}, + {X: Field{[10]uint32{0x02bcaf21, 0x02b00a80, 0x00939b92, 0x036f64ac, 0x03b608d3, 0x00a7f718, 0x01c0b868, 0x002abbc6, 0x0108ccc5, 0x00324a46}}, Y: Field{[10]uint32{0x02cd2599, 0x023406c1, 0x0231a17d, 0x0115df18, 0x0320cb7d, 0x00bf227e, 0x01352c8b, 0x007d631c, 0x03b74711, 0x0039714a}}}, + {X: Field{[10]uint32{0x01cefb26, 0x03507118, 0x00459b04, 0x031d6369, 0x0364bc42, 0x03c68752, 0x02b01411, 0x02d881e2, 0x009042b5, 0x00140d65}}, Y: Field{[10]uint32{0x034f04e0, 0x01147aaf, 0x02af1e5b, 0x00abdef4, 0x03347c13, 0x009cbe05, 0x00d9bd8f, 0x00193fe0, 0x023db68c, 0x003d87a0}}}, + {X: Field{[10]uint32{0x00a4cbf3, 0x007cb7b1, 0x0343e7b6, 0x00067d17, 0x0039f29a, 0x00ed4d7b, 0x02787c35, 0x03c7ed84, 0x02e7d6a3, 0x003e6f3e}}, Y: Field{[10]uint32{0x032ff883, 0x0301e848, 0x0067b28f, 0x018abb77, 0x02a65658, 0x003f211a, 0x02d5a995, 0x035f9e40, 0x026f273a, 0x003d361b}}}, + {X: Field{[10]uint32{0x014a9152, 0x011c0e7c, 0x01dbad77, 0x03a5fe35, 0x01602ac4, 0x001d91c5, 0x03c0004b, 0x03c143a4, 0x028b901c, 0x0000723f}}, Y: Field{[10]uint32{0x0136769c, 0x01ee031f, 0x00c4c99d, 0x009fdbdd, 0x03b42a0f, 0x02c67e1f, 0x0143b6ec, 0x00a50a48, 0x03347c45, 0x002c9776}}}, + {X: Field{[10]uint32{0x0386f552, 0x010c4c79, 0x004dd2c5, 0x033d04af, 0x008ff676, 0x03ad4d38, 0x023947c6, 0x00ea1f4d, 0x03e14cbe, 0x0000f142}}, Y: Field{[10]uint32{0x0305a74d, 0x03b928e6, 0x032388a0, 0x00f6ed94, 0x00194f55, 0x0119b2b4, 0x02277754, 0x03d80362, 0x031c6e03, 0x00110d11}}}, + {X: Field{[10]uint32{0x030522f5, 0x009c0bb9, 0x01409fe7, 0x02b5b677, 0x005b3e91, 0x03e322c9, 0x0168b4b4, 0x01cbe3ea, 0x01b25554, 0x0019335c}}, Y: Field{[10]uint32{0x01ede304, 0x03c5b622, 0x002af5bf, 0x00f05a1e, 0x0140350a, 0x0066f58a, 0x017fc2a8, 0x0121540b, 0x033ae9fa, 0x003c6c72}}}, + {X: Field{[10]uint32{0x019af7a8, 0x038d0518, 0x00bccc41, 0x039f4bb2, 0x02fd8f69, 0x033102c3, 0x03dded87, 0x030d1b46, 0x0044c584, 0x00307001}}, Y: Field{[10]uint32{0x01879436, 0x0240174f, 0x0238eee0, 0x0332f1b7, 0x01f78dbc, 0x016042d8, 0x03b391ad, 0x03aec21e, 0x00943e3f, 0x00358c6d}}}, + {X: Field{[10]uint32{0x03a2a7ed, 0x03d6558f, 0x01b96cbe, 0x00a2be5c, 0x002fbd0c, 0x02df92e8, 0x0050fd03, 0x02ed871d, 0x0182dad5, 0x003e9425}}, Y: Field{[10]uint32{0x033df4e5, 0x038acd8b, 0x03816165, 0x016cd242, 0x012acdff, 0x01af8865, 0x03890d75, 0x00bde26a, 0x0364617c, 0x00099f09}}}, + {X: Field{[10]uint32{0x01a2386c, 0x008351b0, 0x024d0509, 0x0033df49, 0x0235175e, 0x018130b6, 0x0205f04b, 0x0249aa9b, 0x02e6864e, 0x00195773}}, Y: Field{[10]uint32{0x03ee19c8, 0x03853cb3, 0x02df72bb, 0x00e2d788, 0x025f1dc2, 0x01e596ea, 0x02d36c46, 0x00b2d2e8, 0x02dabf06, 0x00368bab}}}, + {X: Field{[10]uint32{0x033c213e, 0x01bf02b7, 0x01beb760, 0x001b4568, 0x002cc1de, 0x03b17135, 0x03c8fbef, 0x03989025, 0x01ac1b7b, 0x001aad78}}, Y: Field{[10]uint32{0x00a9e466, 0x008c7934, 0x01d3cf36, 0x02353a02, 0x00f83392, 0x03fb37d6, 0x003e0247, 0x00c671d1, 0x03b204eb, 0x0009be60}}}, + {X: Field{[10]uint32{0x00c25f3b, 0x02a75458, 0x01af35f5, 0x02951fbd, 0x036224e2, 0x03dceadc, 0x0373a0d3, 0x02a8b7a7, 0x029e039c, 0x0031f6a1}}, Y: Field{[10]uint32{0x00da579f, 0x010adad0, 0x0175dc79, 0x02267b08, 0x02cfdc0f, 0x01ab9312, 0x02f4cf67, 0x001f604a, 0x010249a6, 0x003a66c4}}}, + {X: Field{[10]uint32{0x0144ef99, 0x03034852, 0x01084a9c, 0x0152fc05, 0x03e20b68, 0x03d34526, 0x028091fa, 0x00f3b7b5, 0x00a15f1c, 0x000a9b53}}, Y: Field{[10]uint32{0x02661ae0, 0x01ad8e03, 0x039b4ced, 0x03cc4fc5, 0x015cb44b, 0x029c0eb1, 0x00d92846, 0x0257a6ae, 0x0288ae92, 0x0037f09d}}}, + {X: Field{[10]uint32{0x01c846c0, 0x018b3684, 0x015752de, 0x009c604a, 0x0292600a, 0x0079dc5a, 0x0259f70b, 0x008932a9, 0x00b3bba7, 0x00111c98}}, Y: Field{[10]uint32{0x008999bf, 0x03687837, 0x00996db8, 0x02990098, 0x038331e2, 0x00184e51, 0x000c9220, 0x00bb7a26, 0x020f33ef, 0x003c5f8f}}}, + {X: Field{[10]uint32{0x03781969, 0x0253dbe9, 0x016fd5b9, 0x0299b94d, 0x015a8788, 0x02cc4abb, 0x00b0f441, 0x01c00e35, 0x00adbaba, 0x002336c7}}, Y: Field{[10]uint32{0x00536977, 0x01dfb75d, 0x00fa17c1, 0x0392e81b, 0x03b88750, 0x0355b080, 0x03be06d8, 0x019ceab9, 0x010e262e, 0x002ce96f}}}, + {X: Field{[10]uint32{0x01caaefe, 0x009aa175, 0x00576851, 0x003c5d76, 0x00bc3e2c, 0x033d1b03, 0x0323e6cd, 0x03e41460, 0x0350fb60, 0x000a2f83}}, Y: Field{[10]uint32{0x022b7320, 0x03e6e8e1, 0x009de21b, 0x030fa590, 0x028d986f, 0x01a30c5d, 0x01404295, 0x02313384, 0x00f7fb18, 0x00173016}}}, + {X: Field{[10]uint32{0x014673a0, 0x012128a6, 0x00eb6f23, 0x0189fe3c, 0x02837e22, 0x0273e0e7, 0x029218ad, 0x03eb522d, 0x00badd2d, 0x0002db73}}, Y: Field{[10]uint32{0x022de992, 0x033f533e, 0x02eafb52, 0x01daba07, 0x02496231, 0x03731cc2, 0x00aa2ab5, 0x005899dd, 0x02d7297f, 0x00387052}}}, + {X: Field{[10]uint32{0x03766a87, 0x01c25578, 0x02e1dbe7, 0x03e4066e, 0x02b9cbb0, 0x0317f369, 0x03ecec9d, 0x03df95e9, 0x02c88813, 0x003917af}}, Y: Field{[10]uint32{0x01fbb07a, 0x004d7ac3, 0x028563ff, 0x01fc4e91, 0x03f915cc, 0x02b2eaa7, 0x03848857, 0x00de0df0, 0x00bb4ccf, 0x000e98a8}}}, + {X: Field{[10]uint32{0x00dccdbb, 0x0087faba, 0x030eb07b, 0x001f7d97, 0x0059bc9d, 0x00adf21d, 0x00b9e552, 0x02752078, 0x037726f3, 0x0037a49b}}, Y: Field{[10]uint32{0x004d8e05, 0x00d9fd8c, 0x02ba0f5f, 0x02c75c86, 0x01115be2, 0x008e7db8, 0x03618ce1, 0x01090092, 0x02a9263d, 0x00274643}}}, + {X: Field{[10]uint32{0x00f2caf0, 0x0280fcbb, 0x03091b54, 0x00b84c17, 0x0091e427, 0x01a5c8ad, 0x03948075, 0x027011b5, 0x03842066, 0x003dd884}}, Y: Field{[10]uint32{0x039e4914, 0x00a4f412, 0x00f6d12d, 0x00aed31f, 0x033088c9, 0x016432a8, 0x01945284, 0x03caa571, 0x00e5a227, 0x003431fa}}}, + {X: Field{[10]uint32{0x025ce751, 0x02effa15, 0x0037d4a8, 0x03458669, 0x01a5cdb1, 0x02e83ae7, 0x00d472e8, 0x03b823d1, 0x028644ff, 0x00139e57}}, Y: Field{[10]uint32{0x0190a4e0, 0x03a0f885, 0x03549749, 0x0156672c, 0x0365038c, 0x01d47961, 0x01b4be3c, 0x01a3e6ee, 0x00e54782, 0x0014a4b6}}}, + {X: Field{[10]uint32{0x01b50b3d, 0x0174b4b7, 0x03559bf4, 0x0237a15d, 0x01cdf75e, 0x02248d4c, 0x0333a97c, 0x02c0fcca, 0x0289a944, 0x001c3991}}, Y: Field{[10]uint32{0x00225586, 0x01349483, 0x0151a536, 0x02eea45a, 0x03925a93, 0x01c79bb7, 0x01ae263c, 0x0226928b, 0x02e5460b, 0x00299d71}}}, + {X: Field{[10]uint32{0x0367056b, 0x02d73c96, 0x020fab08, 0x0240ee76, 0x03477ef3, 0x02d2ffc7, 0x00b8c1c8, 0x0091f803, 0x002e682b, 0x000858df}}, Y: Field{[10]uint32{0x0292d882, 0x0125e793, 0x00e04831, 0x01638934, 0x03c5716b, 0x009f60e1, 0x00c2b6c7, 0x006955f9, 0x025e3e76, 0x0038d5c5}}}, + {X: Field{[10]uint32{0x001d1964, 0x015828e7, 0x02949a40, 0x02c5d19a, 0x03d8ae5b, 0x00062f6e, 0x01a41350, 0x034b85d0, 0x039908da, 0x001da468}}, Y: Field{[10]uint32{0x02422b74, 0x020711c2, 0x00be4d8c, 0x0038a31a, 0x03025728, 0x01db9fc9, 0x03f2296f, 0x016edb36, 0x0004b05b, 0x000897c5}}}, + {X: Field{[10]uint32{0x01af9302, 0x0266be1e, 0x012cb698, 0x0244361d, 0x01b0d11e, 0x009faafe, 0x035a14b0, 0x0021266b, 0x02a4f395, 0x001d20c5}}, Y: Field{[10]uint32{0x03fd7ee2, 0x00c11ed6, 0x0061f179, 0x006e7a11, 0x00f600fc, 0x037628b1, 0x0187c126, 0x0027630f, 0x00d26bd7, 0x00337375}}}, + {X: Field{[10]uint32{0x02ed9b8a, 0x03f83bfd, 0x03390c2f, 0x0146001a, 0x00a97089, 0x007814a5, 0x0084aa6c, 0x03a171b7, 0x01ab3839, 0x002bd623}}, Y: Field{[10]uint32{0x03d9cff0, 0x0055058d, 0x0081d870, 0x00d633c3, 0x01616ca1, 0x03800aab, 0x014131f5, 0x01523c9e, 0x02401b06, 0x0028f4dd}}}, + {X: Field{[10]uint32{0x01b42dc6, 0x011b8436, 0x0253735c, 0x001dbc2d, 0x005f869d, 0x0255ca2c, 0x03617969, 0x01bfec66, 0x00603170, 0x002f6477}}, Y: Field{[10]uint32{0x00f153b2, 0x01c41d91, 0x01a6d161, 0x03df5949, 0x00cdce2c, 0x0381c21c, 0x028db8ed, 0x03d71868, 0x02d15a74, 0x000f258f}}}, + {X: Field{[10]uint32{0x01e98f47, 0x01ccbb7b, 0x0382d985, 0x0209f7ae, 0x030c202c, 0x0132c787, 0x03aa583c, 0x002efd70, 0x00a59146, 0x00398971}}, Y: Field{[10]uint32{0x0170b72e, 0x03733056, 0x0299d7fd, 0x0187244c, 0x000812a4, 0x0392b180, 0x02505348, 0x014e5877, 0x01f9a903, 0x003409b1}}}, + {X: Field{[10]uint32{0x03daac1c, 0x023f971f, 0x000e8ebc, 0x015f6566, 0x00122cd0, 0x0060d5f9, 0x014553c7, 0x024ebe2e, 0x03fed4b1, 0x001af489}}, Y: Field{[10]uint32{0x0221a9f9, 0x03549271, 0x039f022f, 0x012792de, 0x03c66a05, 0x0028ad39, 0x01835d3b, 0x02c1127b, 0x01400a98, 0x0017cff9}}}, + {X: Field{[10]uint32{0x02db2609, 0x03d99907, 0x02f495cf, 0x03e5531b, 0x0068a0f0, 0x016cd39f, 0x03d3872c, 0x01bce148, 0x0225895e, 0x0009dc1e}}, Y: Field{[10]uint32{0x02a777ee, 0x0060088f, 0x0335e03a, 0x02452337, 0x01e5de5c, 0x01fd9dfa, 0x0334b38f, 0x035a5da7, 0x038ec893, 0x003bdbd3}}}, + {X: Field{[10]uint32{0x03f0ebde, 0x005383f3, 0x026db1f3, 0x03039d51, 0x00c01770, 0x010a135f, 0x03770ea0, 0x01053aed, 0x008e3359, 0x00181489}}, Y: Field{[10]uint32{0x03f7b7a2, 0x00638ab8, 0x0312c8b1, 0x034c72e5, 0x031a1ac7, 0x02a955be, 0x0262e020, 0x03551a7e, 0x00585cf0, 0x000f6608}}}, + {X: Field{[10]uint32{0x0370f6bc, 0x0168453c, 0x0150e6c7, 0x019a6d15, 0x034d4fc6, 0x02c8a615, 0x01825068, 0x0049305b, 0x03534fa6, 0x003cb2d6}}, Y: Field{[10]uint32{0x0241112e, 0x029d02dc, 0x008a0ad7, 0x02ef17eb, 0x038ec9dc, 0x00f31de7, 0x0152def4, 0x032b484e, 0x030763a5, 0x00173795}}}, + {X: Field{[10]uint32{0x007a502e, 0x0342c8fa, 0x01b20aa9, 0x01453bdb, 0x0304989b, 0x01d71807, 0x00030c7a, 0x02e7e782, 0x02159fe6, 0x001deb60}}, Y: Field{[10]uint32{0x029b703d, 0x031a037a, 0x0132a87f, 0x01e266be, 0x0300c136, 0x02e87aec, 0x0056add2, 0x0124c9d2, 0x01eeffc2, 0x00249a28}}}, + {X: Field{[10]uint32{0x028fd29d, 0x0132f252, 0x001c8a11, 0x003ee93b, 0x035cc9aa, 0x00b5e246, 0x0380fd7c, 0x03e03e9f, 0x008d171c, 0x0011061d}}, Y: Field{[10]uint32{0x031835c1, 0x02ed063e, 0x02aeebab, 0x01aa99f1, 0x029916c1, 0x009e7f9e, 0x0318322b, 0x006dfdcb, 0x028579f0, 0x000144c0}}}, + {X: Field{[10]uint32{0x027355e0, 0x01f5f98d, 0x008831d3, 0x03ff7df4, 0x01126e59, 0x0046a09b, 0x01901b4d, 0x0321edf9, 0x01606f89, 0x0005abd2}}, Y: Field{[10]uint32{0x00b04c2e, 0x0130b353, 0x009f68ca, 0x03a943b8, 0x0012c8e8, 0x03a8ece3, 0x02131ca8, 0x008f27a3, 0x00405372, 0x000684e1}}}, + {X: Field{[10]uint32{0x02120f9d, 0x00e4be77, 0x03e4aae6, 0x00c0d49d, 0x000730a7, 0x03606123, 0x037ba0ca, 0x00c6e33d, 0x003cab44, 0x0008b481}}, Y: Field{[10]uint32{0x011b8acd, 0x03d3dae6, 0x0145a432, 0x03263b4f, 0x034d71f9, 0x01ff33e7, 0x036520ac, 0x011b4270, 0x01ad5e5b, 0x0035de57}}}, + {X: Field{[10]uint32{0x03676302, 0x02cc9c55, 0x017349fb, 0x022ec906, 0x0241d92c, 0x03d8912d, 0x02033602, 0x0194cdf8, 0x028b3482, 0x00015f9e}}, Y: Field{[10]uint32{0x0199b83a, 0x00a00ed1, 0x022a0975, 0x0374f473, 0x015146af, 0x02ecb951, 0x02bd2eb6, 0x0322cb0e, 0x00e8ba4b, 0x0013648e}}}, + {X: Field{[10]uint32{0x02acc359, 0x01156c09, 0x009da9ab, 0x02093018, 0x007ea19a, 0x01776ac7, 0x02b39ed0, 0x0009f8a0, 0x03602755, 0x0011559f}}, Y: Field{[10]uint32{0x0134f5a7, 0x02e92350, 0x03d4c2fb, 0x03dfdc9b, 0x0182c1cc, 0x0104e4b7, 0x02291611, 0x0153b790, 0x015a77a3, 0x0036d57b}}}, + {X: Field{[10]uint32{0x027fa80f, 0x03e9683d, 0x00c383e8, 0x039c68a1, 0x01798a0b, 0x02114c80, 0x001933ca, 0x024d1e77, 0x01549105, 0x0025a3ed}}, Y: Field{[10]uint32{0x00e8920e, 0x01332849, 0x00bd0b16, 0x0007740f, 0x0201c141, 0x019c60dd, 0x02d83945, 0x03d5430d, 0x02b16853, 0x00018d61}}}, + {X: Field{[10]uint32{0x01873107, 0x0050946b, 0x02d1714c, 0x033446bc, 0x013d640a, 0x01e3dee1, 0x03ef522b, 0x00f35fc7, 0x02490f63, 0x003cd9b1}}, Y: Field{[10]uint32{0x0082c6b9, 0x03ed971d, 0x01546e56, 0x0355c46b, 0x0325b260, 0x0275057b, 0x004cfab5, 0x0262360b, 0x02af38f4, 0x0017f0e5}}}, + {X: Field{[10]uint32{0x00201d06, 0x01a1d0ff, 0x026e9ad0, 0x0224540f, 0x0059b192, 0x00acf0a7, 0x0016effd, 0x01a2cbb7, 0x03d44a2e, 0x002a8313}}, Y: Field{[10]uint32{0x033fee33, 0x037e2dff, 0x01b82b5d, 0x028952a9, 0x002763ac, 0x01d89c34, 0x00b5c4db, 0x01e5dd19, 0x02242fba, 0x0018538c}}}, + {X: Field{[10]uint32{0x032cc876, 0x01125223, 0x00ad2b44, 0x033cdd21, 0x01da4cbd, 0x02a0c391, 0x0057abbd, 0x033b1a47, 0x00ee19b2, 0x001b221b}}, Y: Field{[10]uint32{0x02fc16a1, 0x012e5382, 0x01cf5def, 0x025ef3cb, 0x02a197e8, 0x03b19396, 0x03eb384f, 0x037e1c21, 0x03bd9ab4, 0x000933f2}}}, + {X: Field{[10]uint32{0x02095554, 0x005e16f1, 0x02e439a8, 0x032b7cef, 0x00fbe5e4, 0x0045b538, 0x01d1686f, 0x01dbbb20, 0x0199c33f, 0x00135800}}, Y: Field{[10]uint32{0x03ae614a, 0x0057cc97, 0x028e9dad, 0x03127c58, 0x032bf73d, 0x037fb5d0, 0x01d4321f, 0x03dc3845, 0x00ceb769, 0x0032d053}}}, + {X: Field{[10]uint32{0x010a4fc2, 0x01689697, 0x0230aa67, 0x032b4bc8, 0x0212c3ca, 0x02d96ec5, 0x01e84724, 0x0167839c, 0x00a0196d, 0x000ddf74}}, Y: Field{[10]uint32{0x00feb560, 0x010f1d2b, 0x0338fe03, 0x00d8ad47, 0x021159c7, 0x02cd25d4, 0x03f7c270, 0x009f7297, 0x027d8c8e, 0x000b1c9f}}}, + {X: Field{[10]uint32{0x00820f46, 0x024a2967, 0x025529ca, 0x006633cd, 0x02e8aa50, 0x036402e2, 0x031826f9, 0x037cd46e, 0x038a23af, 0x00273033}}, Y: Field{[10]uint32{0x03e67256, 0x0234d1fd, 0x031f8b06, 0x01197554, 0x00693e54, 0x0290e828, 0x0142c53e, 0x0302a320, 0x015be2aa, 0x002d5cbc}}}, + {X: Field{[10]uint32{0x01fa3050, 0x01363b46, 0x000ead4a, 0x03aa9471, 0x024cfb01, 0x02f81107, 0x01d154a2, 0x00ac7a60, 0x02a64149, 0x0035577e}}, Y: Field{[10]uint32{0x03238ac1, 0x02cb9463, 0x012eb45f, 0x01dc30b7, 0x02da0c4c, 0x008e879c, 0x0098f315, 0x01d30aa6, 0x01cb408c, 0x000b9e57}}}, + {X: Field{[10]uint32{0x01210fd5, 0x001b7b9f, 0x024e8463, 0x021c9e5c, 0x02e3d27e, 0x02b1b01f, 0x035efb3f, 0x00c548c1, 0x03d72d11, 0x0011afd8}}, Y: Field{[10]uint32{0x03b0b199, 0x02cb220c, 0x002fc94c, 0x00dccb8a, 0x02dc4a2e, 0x02417128, 0x03b433a2, 0x00c94df8, 0x01f230fa, 0x001dc6ec}}}, + {X: Field{[10]uint32{0x00ca3aad, 0x000165d4, 0x03a3a13f, 0x02e306a6, 0x03594ef8, 0x01d79f0e, 0x02f1826f, 0x01f05e31, 0x038803e7, 0x0012f3f8}}, Y: Field{[10]uint32{0x021b0129, 0x02abd522, 0x009b62dd, 0x008ed1f4, 0x00ec5ea9, 0x03014e27, 0x0283cf56, 0x0119cbe8, 0x02939dcf, 0x002d558b}}}, + {X: Field{[10]uint32{0x00c241db, 0x01d1ee36, 0x02c57df9, 0x00e477dd, 0x016255ba, 0x012eca92, 0x00ce8023, 0x01a7bb5f, 0x02f4715e, 0x00325a06}}, Y: Field{[10]uint32{0x01e038e6, 0x0087dfb3, 0x02e0828c, 0x0204c420, 0x00da530e, 0x006f72c1, 0x02bb8468, 0x0148197c, 0x01cbb03d, 0x00322c5d}}}, + {X: Field{[10]uint32{0x02fbc33c, 0x02c5af30, 0x00101790, 0x02f531ad, 0x01bd5538, 0x02d3daba, 0x022671a3, 0x01ab1fd2, 0x021b56bd, 0x00027e82}}, Y: Field{[10]uint32{0x03129e63, 0x03f62d8c, 0x01fb5c08, 0x01a1b511, 0x0016056f, 0x0122d219, 0x00599593, 0x01f33b92, 0x02be785c, 0x0009fe7a}}}, + {X: Field{[10]uint32{0x03d0381e, 0x03b1a91c, 0x01feaa56, 0x03caf038, 0x03a87203, 0x019de593, 0x023e7b98, 0x022ab01c, 0x01f0ca17, 0x0005410b}}, Y: Field{[10]uint32{0x010183f2, 0x03b8ef63, 0x033a1677, 0x03f49082, 0x03e271cb, 0x0050f9d7, 0x039eb59a, 0x01ac37e3, 0x0257dac8, 0x0011176d}}}, + {X: Field{[10]uint32{0x0337e9b2, 0x022c0c87, 0x00b65eb0, 0x03403abe, 0x036b7f9d, 0x00876dd9, 0x027da3e9, 0x0061df83, 0x02630d4c, 0x000d53da}}, Y: Field{[10]uint32{0x004ea8fc, 0x026a8ac4, 0x03fea555, 0x0361942f, 0x012eb784, 0x010fbf59, 0x032f480a, 0x0202fbad, 0x003bd65b, 0x00040014}}}, + {X: Field{[10]uint32{0x01de065c, 0x010c3166, 0x03d8ac11, 0x0139e6b8, 0x029e4ba7, 0x009c1f5b, 0x00d8864d, 0x023f0127, 0x01617a44, 0x000670d8}}, Y: Field{[10]uint32{0x009acff5, 0x001bcc26, 0x022fa4dd, 0x00605842, 0x0275742d, 0x02dca67b, 0x02f570c1, 0x03ba0653, 0x03d8fd38, 0x000be7e7}}}, + {X: Field{[10]uint32{0x0083f88e, 0x0130519c, 0x01d395bd, 0x01ed5b39, 0x035a5080, 0x03767ea3, 0x027a2d4a, 0x02299ada, 0x008ad2ab, 0x000dce61}}, Y: Field{[10]uint32{0x01f0cbc9, 0x02058b19, 0x0151e6f5, 0x002440da, 0x01068a54, 0x00b86233, 0x01d20569, 0x000af7d3, 0x00206111, 0x001bf5c6}}}, + {X: Field{[10]uint32{0x0010aa35, 0x018bab07, 0x01ba9500, 0x023e2b1b, 0x012dd7e5, 0x0212e13d, 0x00e66f1f, 0x008cd9f7, 0x0345261c, 0x002708b2}}, Y: Field{[10]uint32{0x012a1116, 0x02fb9901, 0x0146ec8d, 0x005c665b, 0x03605b00, 0x021b72e7, 0x00bead62, 0x02f9ca44, 0x03f58c25, 0x003fe138}}}, + {X: Field{[10]uint32{0x01b4538e, 0x02f7525b, 0x03abbd0f, 0x0215d44f, 0x015a4127, 0x038df155, 0x00c71e45, 0x005cc9fb, 0x01c87f31, 0x0015c851}}, Y: Field{[10]uint32{0x0238871f, 0x031e4422, 0x03550242, 0x02b013a9, 0x015338c6, 0x00485523, 0x02d5166c, 0x002368ab, 0x03ac5e39, 0x00058f98}}}, + {X: Field{[10]uint32{0x01e940ef, 0x0078c84b, 0x0285bd93, 0x036636e1, 0x034c641e, 0x006a59b1, 0x03213b75, 0x00fad63b, 0x0154d841, 0x00327c1e}}, Y: Field{[10]uint32{0x01e17fd0, 0x03061333, 0x0041d792, 0x03cfb7a4, 0x0092cf5a, 0x0026f3b3, 0x025fe7cb, 0x00f4f281, 0x00bc804f, 0x00279a11}}}, + {X: Field{[10]uint32{0x007f25e3, 0x024684de, 0x000c3f92, 0x02a83a20, 0x01f7b0e4, 0x0016a294, 0x024a24df, 0x0228a759, 0x0346b07c, 0x002b0a5f}}, Y: Field{[10]uint32{0x01b66cbb, 0x02637a0a, 0x0185875e, 0x01ddd4f0, 0x02b1556c, 0x01297460, 0x01bbca05, 0x016b5ff4, 0x037f78e4, 0x001a1b8e}}}, + {X: Field{[10]uint32{0x00b3e1b5, 0x025e4d26, 0x0198c218, 0x02f202f0, 0x035ad55d, 0x0087b688, 0x00274df1, 0x029a20e4, 0x013bb383, 0x0001b164}}, Y: Field{[10]uint32{0x00b9ccf1, 0x016ab78b, 0x00dc91c3, 0x02d743de, 0x0153e5b4, 0x00789295, 0x011ebf46, 0x027d28bc, 0x003ae364, 0x00152e6e}}}, + {X: Field{[10]uint32{0x032495df, 0x03aa396b, 0x01b45cf7, 0x03f71e4f, 0x01846e3e, 0x0058f2fe, 0x0259ee92, 0x00d5afb2, 0x03a3f503, 0x002e649b}}, Y: Field{[10]uint32{0x02e2a512, 0x03e41510, 0x03047bb8, 0x0030402f, 0x01054fd0, 0x03f05781, 0x0015c511, 0x039e87b5, 0x03c533d4, 0x00035b75}}}, + {X: Field{[10]uint32{0x00e69556, 0x01ceb61d, 0x03d5a314, 0x03314d5f, 0x03cb36ad, 0x0181cc15, 0x00ac758f, 0x02f9dff8, 0x01d2f2ca, 0x0010c974}}, Y: Field{[10]uint32{0x034904a9, 0x029f53d4, 0x01932ed5, 0x02d7116b, 0x03818c8f, 0x01833123, 0x030562d5, 0x00c57e21, 0x01682ff6, 0x003790de}}}, + {X: Field{[10]uint32{0x00164917, 0x022a3045, 0x03f110d3, 0x037346ff, 0x00eed924, 0x0387103d, 0x03c9059c, 0x02ff292b, 0x015ffd84, 0x002860fa}}, Y: Field{[10]uint32{0x01d64b95, 0x0006ed10, 0x017f0a0d, 0x0176fbc1, 0x00c38d69, 0x0337e57b, 0x005046d4, 0x03290405, 0x0210c7ff, 0x0004715d}}}, + {X: Field{[10]uint32{0x00d07114, 0x017a205b, 0x0009184d, 0x03f4eeaa, 0x02ab7af5, 0x0123f6f0, 0x0251414f, 0x00a3c365, 0x00d9ad65, 0x002cd034}}, Y: Field{[10]uint32{0x020dd4e1, 0x03410384, 0x01384919, 0x02a6db0f, 0x02ae2671, 0x00392da3, 0x024dfbd4, 0x01c3dfe5, 0x026a9ecd, 0x00217b5c}}}, + {X: Field{[10]uint32{0x02719377, 0x03cd3085, 0x0240e8e6, 0x038db035, 0x00b146fa, 0x02781d74, 0x015f0a4c, 0x00be9056, 0x02883599, 0x002d4b6a}}, Y: Field{[10]uint32{0x024ad7ad, 0x0324391e, 0x029df85e, 0x020892c5, 0x004f42f0, 0x011e31e8, 0x00b5cbad, 0x00e2269b, 0x01399fa8, 0x0018222c}}}, + {X: Field{[10]uint32{0x02b9d8ad, 0x015c268a, 0x0218d5dc, 0x00d9148e, 0x01f269ba, 0x030ad7f9, 0x03f82bf7, 0x03e23a7d, 0x011542b0, 0x000242ef}}, Y: Field{[10]uint32{0x028fc4e5, 0x039cd214, 0x00743e06, 0x02432a9a, 0x03c69584, 0x034dd0f7, 0x01461d2b, 0x00d1329c, 0x024a51af, 0x003277e4}}}, + {X: Field{[10]uint32{0x03aa8365, 0x023a9aa8, 0x01fd2278, 0x03ed0e2c, 0x02b31c54, 0x00b24c4b, 0x03d4603f, 0x00653fb4, 0x01a81696, 0x003dcbb9}}, Y: Field{[10]uint32{0x010fde8a, 0x0305c879, 0x0307404f, 0x0331e159, 0x010e66f4, 0x035169cb, 0x03c1078c, 0x003d2e3f, 0x0182b6ca, 0x0038a58f}}}, + {X: Field{[10]uint32{0x02b9fb53, 0x02a0e5f9, 0x01298c35, 0x0137667e, 0x0366a10f, 0x03f4d23c, 0x035d6ddd, 0x0014950b, 0x03715bc7, 0x000422ba}}, Y: Field{[10]uint32{0x0209f1ce, 0x0273c70c, 0x0145b49b, 0x01c2b1af, 0x0297b8d9, 0x00dca261, 0x036df472, 0x02381283, 0x033975a5, 0x0020e22c}}}, + {X: Field{[10]uint32{0x0361d5b0, 0x019fedbf, 0x02e86e26, 0x000524f8, 0x00fe54c9, 0x01fd189a, 0x00a5ff5c, 0x017afe09, 0x02ed8734, 0x00370f6b}}, Y: Field{[10]uint32{0x013411e5, 0x003e2776, 0x01d56da2, 0x01e64ca9, 0x02cf0010, 0x02ad1fd9, 0x02c1683b, 0x00119c65, 0x0241238e, 0x002d69f9}}}, + {X: Field{[10]uint32{0x0265c589, 0x01e70190, 0x03ef9381, 0x00cbe35a, 0x03a82c5f, 0x00e14fbc, 0x01e1d26e, 0x018483a0, 0x003c2be1, 0x000fe5aa}}, Y: Field{[10]uint32{0x035c64b3, 0x00dc4c5a, 0x03a0f2ea, 0x03eaebff, 0x01630ba1, 0x03ef409f, 0x020d7349, 0x03c83f56, 0x030e797c, 0x003ae34d}}}, + {X: Field{[10]uint32{0x03f5c4f3, 0x004ee5bb, 0x038661de, 0x01febc6d, 0x03b35835, 0x00913ef8, 0x00a22780, 0x008f8c73, 0x006ce1f4, 0x0009f2be}}, Y: Field{[10]uint32{0x02b30f61, 0x03e86e28, 0x005a139b, 0x0128bcb5, 0x032187e2, 0x036f7283, 0x03ddbc23, 0x033ed18c, 0x0318647a, 0x003a3ddd}}}, + {X: Field{[10]uint32{0x0374d04f, 0x00931883, 0x0236167a, 0x0071f020, 0x012d301a, 0x01206591, 0x007f9648, 0x021e1862, 0x03b9e241, 0x0019a073}}, Y: Field{[10]uint32{0x0015151d, 0x02d28dee, 0x017608dc, 0x01a66353, 0x03f1ce48, 0x0023447b, 0x01f521cc, 0x03a510bd, 0x033a7849, 0x0027227a}}}, + {X: Field{[10]uint32{0x02ba8da5, 0x02c3996f, 0x0280e67f, 0x03705e57, 0x02fcac45, 0x03eeebe8, 0x02747092, 0x0118e59c, 0x00494866, 0x0019c46e}}, Y: Field{[10]uint32{0x014cfcc6, 0x00ac964a, 0x00118b81, 0x017d834b, 0x016b986a, 0x02f2a947, 0x02d8cecb, 0x017b6488, 0x003f1c8f, 0x003284b2}}}, + {X: Field{[10]uint32{0x031dd94d, 0x0210f8ad, 0x010118b7, 0x019c89da, 0x01fdd734, 0x01a61d71, 0x03d22b05, 0x00b36e83, 0x03d0b110, 0x0017ba73}}, Y: Field{[10]uint32{0x007d7d86, 0x00087782, 0x0063aed9, 0x02522d7d, 0x02060d22, 0x026d80cc, 0x03c518f1, 0x027b9385, 0x00e5bd7f, 0x000775e9}}}, + {X: Field{[10]uint32{0x01f4924c, 0x028fcabb, 0x01785e38, 0x0074b4b6, 0x02d7538f, 0x03408937, 0x0195a466, 0x002f9bcf, 0x017b1339, 0x00161b6b}}, Y: Field{[10]uint32{0x002b64d0, 0x0365e1b3, 0x039867be, 0x00072657, 0x00bc2fb1, 0x00467963, 0x035bd337, 0x00d6085c, 0x01a5a68a, 0x0031ddfb}}}, + {X: Field{[10]uint32{0x025091ec, 0x01c94359, 0x02d9184f, 0x0382b63b, 0x00867f6e, 0x003771fa, 0x024b6e69, 0x004b1c64, 0x02d20fa0, 0x000169d4}}, Y: Field{[10]uint32{0x03b95db6, 0x02ba0651, 0x02d27d53, 0x025d7cb2, 0x03ec1ace, 0x01e2410b, 0x01029fc5, 0x0190a7c5, 0x032b32b3, 0x0015fc88}}}, + {X: Field{[10]uint32{0x013e638e, 0x02a01929, 0x02e60002, 0x0381ef9c, 0x02426372, 0x01e3ac50, 0x00fef223, 0x015dfaa7, 0x02ff22bc, 0x003e4f2f}}, Y: Field{[10]uint32{0x03afe50f, 0x00d08de0, 0x00a5996f, 0x01755c64, 0x03eeadb7, 0x009e793c, 0x03166702, 0x036d0a52, 0x02bb401b, 0x002af1dc}}}, + {X: Field{[10]uint32{0x012608a9, 0x00053a43, 0x038cc3dd, 0x03ee15ba, 0x0076052c, 0x029b98eb, 0x03c34c36, 0x0025c8bb, 0x009e9613, 0x002309cb}}, Y: Field{[10]uint32{0x024607b3, 0x03a49f9b, 0x02dfde85, 0x0058d257, 0x03731e37, 0x022d5000, 0x027d2261, 0x01c588ee, 0x016813c5, 0x002661f4}}}, + {X: Field{[10]uint32{0x01769bc5, 0x021f0453, 0x015e23e1, 0x01327e55, 0x0038dfd8, 0x00e1b770, 0x00226c4d, 0x0150ae95, 0x00d61519, 0x002fde28}}, Y: Field{[10]uint32{0x01910280, 0x01bb262c, 0x00fe55d2, 0x01f4c56f, 0x03e16058, 0x010a567b, 0x0014b59d, 0x03020798, 0x01e4d84e, 0x00182538}}}, + {X: Field{[10]uint32{0x02e65caa, 0x03f6e64c, 0x02b28ee1, 0x016b8c47, 0x01497aaa, 0x0109217f, 0x03ab651f, 0x00a86ffe, 0x0376cd09, 0x0016c992}}, Y: Field{[10]uint32{0x01d70d78, 0x0062381a, 0x00c84c8c, 0x008b5762, 0x021dd847, 0x015a56c1, 0x010fdc88, 0x035f0d98, 0x03594b68, 0x002513e4}}}, + {X: Field{[10]uint32{0x0082b559, 0x03810ab0, 0x027974b7, 0x014409d3, 0x01322f71, 0x03451dc1, 0x03c14598, 0x028344ce, 0x00ea8075, 0x002891cf}}, Y: Field{[10]uint32{0x02575a18, 0x01a2a268, 0x004b5d2c, 0x00a9c212, 0x035168d3, 0x03db2416, 0x0309d794, 0x01ec1b66, 0x030db655, 0x001937a0}}}, + {X: Field{[10]uint32{0x009efa45, 0x022a00d8, 0x02350652, 0x002028a4, 0x01f14b07, 0x01c21ef5, 0x001535da, 0x0314510d, 0x01e63dd0, 0x000f8635}}, Y: Field{[10]uint32{0x00288c5b, 0x027fd9d5, 0x030a6e1d, 0x00589aa7, 0x0026dc2f, 0x0394d1c3, 0x02fd041b, 0x01ce0be0, 0x01b97d00, 0x001ba71c}}}, + {X: Field{[10]uint32{0x0294dfa5, 0x03d855a0, 0x0184b71a, 0x01050a16, 0x026a7674, 0x0308a421, 0x0296eb09, 0x018c56f3, 0x03cdb91e, 0x00346b36}}, Y: Field{[10]uint32{0x013da5a4, 0x03a7e218, 0x014522c9, 0x03a59ae6, 0x00accb67, 0x00f8a74f, 0x00072017, 0x00dd70fe, 0x00d89872, 0x00178ec3}}}, + {X: Field{[10]uint32{0x0050c90d, 0x002badf6, 0x024e1a21, 0x00a3103d, 0x0125ddb0, 0x00d7b3dd, 0x02cc880a, 0x0383cad7, 0x01e29344, 0x000eaa66}}, Y: Field{[10]uint32{0x0143d42b, 0x00eaafe9, 0x01951567, 0x013b1f28, 0x01028c45, 0x027a6a20, 0x02e6fcbe, 0x0286fb74, 0x025cfbe3, 0x00334b38}}}, + {X: Field{[10]uint32{0x01a5017d, 0x0359c258, 0x02398146, 0x0389692d, 0x033e1b31, 0x028e9b28, 0x010aa4c8, 0x00572fb3, 0x021d7c38, 0x0026288d}}, Y: Field{[10]uint32{0x0009f2bc, 0x01c4a28b, 0x00de6d39, 0x01753674, 0x01516df2, 0x035e380e, 0x00213958, 0x00304efa, 0x03780304, 0x0007ccf7}}}, + {X: Field{[10]uint32{0x013d98d0, 0x01459d01, 0x03cc4613, 0x011ef86d, 0x03ff3482, 0x0132da72, 0x03a55628, 0x02e1c1b5, 0x018c907a, 0x0014a2e7}}, Y: Field{[10]uint32{0x01eafabd, 0x01fab4f7, 0x01051aba, 0x014c6531, 0x0129700d, 0x00028450, 0x02d67bb8, 0x015de1f1, 0x0036d666, 0x003e47ae}}}, + {X: Field{[10]uint32{0x025029b6, 0x01b07398, 0x0193a355, 0x0398b236, 0x00f4be50, 0x02e33dcc, 0x01a6a866, 0x0034822f, 0x008d3d1b, 0x003c6b7b}}, Y: Field{[10]uint32{0x03cc7224, 0x01d07506, 0x0178f964, 0x0153822a, 0x0257e4a7, 0x00b51e55, 0x03fb61b3, 0x01860896, 0x00aac3bf, 0x0011e0c9}}}, + {X: Field{[10]uint32{0x0124a099, 0x035429ce, 0x00f10f74, 0x0329d0aa, 0x000e0181, 0x01d752a8, 0x0070cf8d, 0x0056b106, 0x0133b1b1, 0x002acbbc}}, Y: Field{[10]uint32{0x026a91ea, 0x00a6ac15, 0x030a5756, 0x0339c29c, 0x012f2baa, 0x02302bda, 0x0149ef53, 0x03baad5e, 0x0374c584, 0x0028b11e}}}, + {X: Field{[10]uint32{0x00576f85, 0x0326c9f8, 0x00c72348, 0x01f4446e, 0x00539a61, 0x024dc21a, 0x0120e2bf, 0x01be0ec7, 0x001af6da, 0x002753ad}}, Y: Field{[10]uint32{0x01f30eea, 0x035accf1, 0x000d7cc5, 0x031c7096, 0x0373acc3, 0x00d4cc17, 0x02dfe904, 0x03213ea2, 0x000db786, 0x003071ec}}}, + {X: Field{[10]uint32{0x03b916d9, 0x01088a4f, 0x011d018a, 0x023e790c, 0x02a55363, 0x0367a418, 0x006dff05, 0x00b20722, 0x017f7b1b, 0x000c3b75}}, Y: Field{[10]uint32{0x00842ee7, 0x039f1291, 0x00502d44, 0x0192a8a2, 0x00f7449e, 0x02b3f38c, 0x0220b485, 0x015e8607, 0x034b16d2, 0x001af11d}}}, + {X: Field{[10]uint32{0x01306583, 0x00715d0c, 0x0066a41d, 0x029c7a04, 0x00f10969, 0x01248053, 0x0058fc6a, 0x02e15597, 0x039d09a2, 0x000a38fa}}, Y: Field{[10]uint32{0x03bb6c2c, 0x00f23f37, 0x00e7ddc9, 0x00577d2a, 0x0359ad3c, 0x030542b8, 0x025245c8, 0x01019c03, 0x03878073, 0x003f194e}}}, + {X: Field{[10]uint32{0x02ac75a3, 0x015c69a6, 0x00e08c91, 0x02d9d276, 0x035a3a8b, 0x03cfa098, 0x03be578f, 0x010b428b, 0x0335e3c8, 0x0032e611}}, Y: Field{[10]uint32{0x03ea8367, 0x0050a6de, 0x02268b48, 0x01efa64d, 0x004c3e25, 0x035c52bd, 0x013f977a, 0x030fd4c0, 0x00cc7181, 0x003a4d68}}}, + {X: Field{[10]uint32{0x000fe170, 0x00146ae9, 0x037a3ed0, 0x016c82a8, 0x015e4d66, 0x021437f3, 0x0283b106, 0x001fabba, 0x02727e83, 0x000d8619}}, Y: Field{[10]uint32{0x00707a6d, 0x03be3440, 0x0124be32, 0x03cb6976, 0x01ab27cb, 0x038b2cd2, 0x014c710c, 0x037007d7, 0x02d32ae6, 0x003b189b}}}, + {X: Field{[10]uint32{0x006b7d2e, 0x020ec5d3, 0x03136021, 0x02c8ed40, 0x034260ab, 0x032099ef, 0x02ccd54d, 0x03cd970a, 0x015e69e9, 0x002c6903}}, Y: Field{[10]uint32{0x01c186ec, 0x011cc28f, 0x027c3af0, 0x02a02eb8, 0x0331edde, 0x03bd8cba, 0x001ff894, 0x0107d490, 0x01ab2a7b, 0x001d9867}}}, + {X: Field{[10]uint32{0x01660825, 0x02c509c5, 0x02be242e, 0x00d75308, 0x00b32a8f, 0x00988019, 0x03f0ccb2, 0x00288fa0, 0x00b3dff6, 0x002af522}}, Y: Field{[10]uint32{0x000b3a89, 0x03dfc8e1, 0x0105be1b, 0x00124684, 0x03fa9949, 0x006122ea, 0x007a463d, 0x038ebe5b, 0x00f217da, 0x001bbfe0}}}, + {X: Field{[10]uint32{0x01d6aa22, 0x01443293, 0x00598c92, 0x0055cff9, 0x002a5721, 0x0086f6c4, 0x00979743, 0x03ad20bd, 0x0304d91c, 0x002b033e}}, Y: Field{[10]uint32{0x034582d5, 0x03958149, 0x02de81c5, 0x0129198a, 0x02395031, 0x0111d366, 0x018ae4a6, 0x0342a419, 0x01874a90, 0x001ad7db}}}, + {X: Field{[10]uint32{0x03c34432, 0x02ebc46b, 0x008e6087, 0x03cd54a5, 0x02a3a0bf, 0x0374762f, 0x03c75410, 0x012d9da5, 0x020f476c, 0x0007ea2f}}, Y: Field{[10]uint32{0x00788d33, 0x036d6ae0, 0x01e5496d, 0x01ae3d71, 0x03fe79df, 0x02071c61, 0x0161d201, 0x011878ca, 0x00848038, 0x0031ac94}}}, + {X: Field{[10]uint32{0x01f90e56, 0x03ed0970, 0x00ec9b29, 0x0355fa34, 0x03f336a4, 0x015717c3, 0x017d3137, 0x022626a0, 0x03c0d373, 0x000a06d0}}, Y: Field{[10]uint32{0x009f4a9c, 0x02a6ef2f, 0x03689921, 0x0111fe08, 0x03686830, 0x0089e9a9, 0x03e3db31, 0x016726dc, 0x030eba10, 0x0009ad41}}}, + {X: Field{[10]uint32{0x008f4052, 0x02c9a532, 0x02f120f0, 0x0118aa4a, 0x013b83eb, 0x01796a0b, 0x006327f5, 0x007b11d1, 0x01e954e8, 0x0035939a}}, Y: Field{[10]uint32{0x01c8622a, 0x0251e5cf, 0x030d58f3, 0x0036bebf, 0x0227a8f0, 0x019ba952, 0x0275565f, 0x00f28a6f, 0x015f284c, 0x002a9fb5}}}, + {X: Field{[10]uint32{0x00e7b028, 0x02f353f9, 0x03a5417b, 0x02315086, 0x01483fb5, 0x0185e08d, 0x035b0c9d, 0x0076c7c2, 0x02eed4b0, 0x003d336e}}, Y: Field{[10]uint32{0x02c63b47, 0x02eac641, 0x013021dd, 0x011e3aa4, 0x01b2b924, 0x02894022, 0x039f48c5, 0x0264137a, 0x00eb29d6, 0x0019b564}}}, + {X: Field{[10]uint32{0x03c9dca5, 0x00ffc2a4, 0x02f4c724, 0x0334779d, 0x00761fc1, 0x01e74868, 0x02ca8090, 0x038cd03f, 0x004a6c46, 0x0023fe53}}, Y: Field{[10]uint32{0x0149abf7, 0x00236bbc, 0x0377c2ab, 0x00d2a2ed, 0x01772071, 0x021ff731, 0x0342d4f1, 0x01a38ca7, 0x00335f3c, 0x00048f77}}}, + {X: Field{[10]uint32{0x03cf267a, 0x00fb3449, 0x01e705c3, 0x0313cabd, 0x00efed70, 0x00ed93ec, 0x007c0e62, 0x0061adfa, 0x01b46e34, 0x00031e1a}}, Y: Field{[10]uint32{0x0011f48a, 0x01c829d7, 0x01a59629, 0x0291a401, 0x03029aef, 0x0368aef5, 0x017d95d7, 0x002260bc, 0x00393662, 0x00198a55}}}, + {X: Field{[10]uint32{0x02cce1a4, 0x02c90c41, 0x00142351, 0x01c9bbb0, 0x0309836f, 0x016d4106, 0x026ba9e2, 0x03721ef4, 0x02c60ad5, 0x00383a9d}}, Y: Field{[10]uint32{0x00eff928, 0x00f52e35, 0x03dbc5a0, 0x005f22bd, 0x016a3a44, 0x02248ad9, 0x02a620a7, 0x0126ae22, 0x00e66320, 0x0022f5c9}}}, + {X: Field{[10]uint32{0x01e30159, 0x029fac4a, 0x027bfc6a, 0x03492d2a, 0x00e8e357, 0x0220fd4b, 0x0019f1f4, 0x022608d9, 0x02c73e5f, 0x000be98e}}, Y: Field{[10]uint32{0x00d8c3fd, 0x02c0e3ae, 0x01d517d0, 0x00a01bde, 0x007251db, 0x02d79711, 0x025b3146, 0x00fea3d6, 0x001cd632, 0x0015f858}}}, + {X: Field{[10]uint32{0x033026a1, 0x01b4cb71, 0x0012f6aa, 0x01dec808, 0x0149d008, 0x02ede99c, 0x02783fc1, 0x0024c08b, 0x0038d4c5, 0x001d3b50}}, Y: Field{[10]uint32{0x0328476f, 0x01bf509a, 0x0035e80e, 0x0200e3a6, 0x0258234f, 0x03deff69, 0x00618e49, 0x0027a233, 0x030e65d0, 0x0016dd3d}}}, + {X: Field{[10]uint32{0x00025f97, 0x03f4b63c, 0x01148eae, 0x03737101, 0x0216ce75, 0x03f7c83e, 0x02d1f934, 0x004f71b7, 0x00a6e387, 0x001c75ab}}, Y: Field{[10]uint32{0x0067e302, 0x00f9829c, 0x02bae0dd, 0x013688b6, 0x02072ffd, 0x0067da74, 0x00c6c4fb, 0x037f209e, 0x01337d48, 0x002d0c51}}}, + {X: Field{[10]uint32{0x03ed5292, 0x01d2b316, 0x004ac8a1, 0x031a25c1, 0x02ee617e, 0x0100a5eb, 0x02d5720f, 0x02f27e68, 0x03f16e91, 0x000a3ed1}}, Y: Field{[10]uint32{0x00b498f7, 0x02e1293e, 0x0059e0bd, 0x03b4ae9e, 0x00ef8e7a, 0x0250f06d, 0x00db6059, 0x01caf93f, 0x0161d724, 0x003412da}}}, + {X: Field{[10]uint32{0x0347a37a, 0x01c3b887, 0x036f8942, 0x0177898b, 0x03828c5a, 0x0269eccb, 0x02fca795, 0x016d7d74, 0x01f5c865, 0x001a3f35}}, Y: Field{[10]uint32{0x038d74ab, 0x009fcc9d, 0x01fb6d3d, 0x01395183, 0x017aa1ad, 0x029c409d, 0x032bc4e7, 0x01c59b0d, 0x02503362, 0x0015d201}}}, + {X: Field{[10]uint32{0x01aa36da, 0x0041a165, 0x03e97491, 0x01346b1a, 0x0117c974, 0x01e9800b, 0x017f8a8a, 0x02af11fb, 0x02d2f423, 0x0031d85e}}, Y: Field{[10]uint32{0x03121d9d, 0x01fd95ed, 0x022e8d59, 0x03f281b2, 0x0269e330, 0x00cf1852, 0x027a9db8, 0x01b2b72f, 0x0367fba9, 0x00366412}}}, + {X: Field{[10]uint32{0x02487cdd, 0x019864a9, 0x028c8df5, 0x00862c93, 0x01474fdc, 0x00966a74, 0x0278b955, 0x03f85b03, 0x029d2396, 0x0029fbd3}}, Y: Field{[10]uint32{0x02f67f28, 0x01427bd6, 0x015c1f40, 0x03753dd9, 0x0323c1e4, 0x01bc8bcd, 0x003f7e68, 0x02f81263, 0x020491c6, 0x00359e09}}}, + {X: Field{[10]uint32{0x031e2578, 0x01ad0d9d, 0x00890eab, 0x00602789, 0x0271856d, 0x00246ecb, 0x00e420f4, 0x00d9d92b, 0x00467ff0, 0x003cef9e}}, Y: Field{[10]uint32{0x0236dbc5, 0x0198aec1, 0x03309434, 0x00e9a047, 0x010dc58f, 0x02c9fff0, 0x026966f6, 0x03cf959e, 0x025745cb, 0x003cc09d}}}, + {X: Field{[10]uint32{0x02f0259c, 0x00fdd54d, 0x0347094d, 0x00a9385c, 0x016c8d9e, 0x03afd3cd, 0x0214c303, 0x0338a414, 0x03955bd9, 0x0017251f}}, Y: Field{[10]uint32{0x035e76cc, 0x02d729ed, 0x039c468f, 0x0235a3bc, 0x0190a81d, 0x015e2893, 0x01fdf498, 0x014a8f4b, 0x03753e75, 0x002daded}}}, + {X: Field{[10]uint32{0x018b2c68, 0x033d02ef, 0x00c134e4, 0x02274410, 0x002c54c1, 0x0309681d, 0x01b87028, 0x01cd789e, 0x0160c3b1, 0x0008dbf6}}, Y: Field{[10]uint32{0x01bbc279, 0x02b0e416, 0x01181873, 0x02fad097, 0x01b44bac, 0x01e69db3, 0x019360eb, 0x03063743, 0x03f7c0ba, 0x0026ad66}}}, + {X: Field{[10]uint32{0x01947b31, 0x0184ecec, 0x00d99cd7, 0x03ff2a2c, 0x02c1a9e9, 0x02e7624c, 0x01d02438, 0x038bdd96, 0x032617cc, 0x00324b27}}, Y: Field{[10]uint32{0x02357a51, 0x03f826d4, 0x0150b725, 0x037c54e7, 0x02e4804d, 0x006b38ac, 0x02707695, 0x0193ad97, 0x014c1a5e, 0x002af7aa}}}, + {X: Field{[10]uint32{0x01a94fc0, 0x0068509b, 0x03bd28bd, 0x03a02f07, 0x02733c2a, 0x0348b0c5, 0x0383a124, 0x018230cd, 0x03c9142c, 0x00261821}}, Y: Field{[10]uint32{0x0342a1cd, 0x01844fea, 0x0068d3fa, 0x0373ac9b, 0x038f5bad, 0x01158b37, 0x0282c650, 0x02d475af, 0x03f5fd76, 0x00052496}}}, + {X: Field{[10]uint32{0x008a1d43, 0x01e18869, 0x021bf914, 0x024e0ed0, 0x0222424e, 0x00d5942d, 0x0244e21f, 0x02eab5f1, 0x0374f4f6, 0x00119687}}, Y: Field{[10]uint32{0x0388cb48, 0x03fa48f1, 0x031579f2, 0x01ee0c91, 0x03d41c14, 0x036c0554, 0x02698d57, 0x00c2f7b9, 0x01e41794, 0x0009b69c}}}, + {X: Field{[10]uint32{0x009796b4, 0x033b9bd7, 0x00a00785, 0x03645643, 0x03c7aa2e, 0x002d1ab6, 0x033c88bd, 0x005f113f, 0x00cdf281, 0x00375d96}}, Y: Field{[10]uint32{0x03cc43be, 0x01ecd033, 0x00f37c1c, 0x0303ddf7, 0x039a9b8a, 0x0391749f, 0x034935a8, 0x03a65c29, 0x000d1e10, 0x000c8c5f}}}, + {X: Field{[10]uint32{0x03c72033, 0x033ae1d5, 0x02d09715, 0x022f766b, 0x006222af, 0x0097d4bf, 0x0148b177, 0x03127ad1, 0x02bfa803, 0x00156f4a}}, Y: Field{[10]uint32{0x013ebf43, 0x037f214f, 0x00e3553a, 0x02e10559, 0x0096b991, 0x0373ca95, 0x03c603b8, 0x0112ceaf, 0x03b39d73, 0x000d2b4c}}}, + {X: Field{[10]uint32{0x0012fcde, 0x0322297b, 0x03c36db0, 0x01d90627, 0x00440068, 0x0056c787, 0x01616d30, 0x0089b232, 0x0006d10c, 0x001def97}}, Y: Field{[10]uint32{0x029ba01b, 0x03f67810, 0x037f6ec8, 0x017b6597, 0x0020e8b5, 0x000d86e7, 0x0327ae1b, 0x01252623, 0x03ca5c47, 0x00333cb2}}}, + {X: Field{[10]uint32{0x012ab21c, 0x02dabcbd, 0x0161830d, 0x03bb52ed, 0x0180b890, 0x03a9f6f7, 0x0060b19b, 0x03c987c1, 0x00863eb6, 0x003eadc9}}, Y: Field{[10]uint32{0x0076d0b0, 0x00bdd322, 0x025c15d2, 0x03ebea76, 0x00b67f6a, 0x0276039a, 0x01174ed9, 0x00b8baaa, 0x003a408a, 0x0002453c}}}, + {X: Field{[10]uint32{0x020b2f66, 0x02e0208a, 0x005a109d, 0x017573c4, 0x02510db6, 0x039e0c52, 0x02671f8d, 0x022e1942, 0x0039fafe, 0x0008ca88}}, Y: Field{[10]uint32{0x0178576a, 0x03cfb0ab, 0x02218d95, 0x0389934b, 0x033be3a6, 0x0085bb04, 0x03b9f6ee, 0x03078d4c, 0x0082510b, 0x0005329c}}}, + {X: Field{[10]uint32{0x037f58e7, 0x00e41506, 0x00cfc64e, 0x028a252a, 0x01deee9f, 0x023c4f9a, 0x01847526, 0x013fde81, 0x0039612a, 0x002cd20a}}, Y: Field{[10]uint32{0x0126ae44, 0x03edc757, 0x0193a3f2, 0x00919ac4, 0x01653b82, 0x01f16378, 0x034e9faf, 0x00096c3a, 0x02eddf30, 0x001c8b40}}}, + {X: Field{[10]uint32{0x02353210, 0x008e6596, 0x017b2858, 0x012889b7, 0x02cf6fd8, 0x024c89c4, 0x0310871a, 0x01d61f2a, 0x02570b0a, 0x0034e1ce}}, Y: Field{[10]uint32{0x0160f186, 0x01789fd4, 0x011d660e, 0x003327f0, 0x01f1f45d, 0x01578cd4, 0x03f95b1c, 0x039c1b37, 0x018459c7, 0x000edf92}}}, + {X: Field{[10]uint32{0x022c20ad, 0x02cb6e85, 0x03281cc9, 0x030c9b72, 0x0226a049, 0x011f029e, 0x01289a71, 0x02caddc7, 0x008ceeeb, 0x00220a1e}}, Y: Field{[10]uint32{0x007b71a7, 0x0197d230, 0x0364cc8c, 0x00b77928, 0x025da2fa, 0x0125c709, 0x0398922b, 0x017c88f5, 0x01958742, 0x00390a28}}}, + {X: Field{[10]uint32{0x027e537d, 0x002cfd3a, 0x0280a37f, 0x02d3a9d5, 0x0052f8db, 0x024fe85d, 0x0186c189, 0x030035d2, 0x013126d0, 0x001e7fb9}}, Y: Field{[10]uint32{0x002cb5b6, 0x0005ea20, 0x035a4560, 0x02fa4f56, 0x01525ceb, 0x00eaceaf, 0x017b4a14, 0x03e652d3, 0x00713143, 0x003f7940}}}, + {X: Field{[10]uint32{0x02814e91, 0x03962a19, 0x01cbaac1, 0x0272fda6, 0x03367242, 0x000ead42, 0x00f3a8ce, 0x017de57c, 0x01f05a9f, 0x003d13ce}}, Y: Field{[10]uint32{0x019a1dd4, 0x02768c35, 0x030e3fc0, 0x01191ab1, 0x02ff75a2, 0x02aca2ee, 0x00a27afb, 0x004c0254, 0x01d1e4de, 0x002e5791}}}, + {X: Field{[10]uint32{0x00aa9abb, 0x009bb0a0, 0x02148504, 0x02fcf0be, 0x02da45af, 0x00cb3def, 0x01d7d788, 0x0326dee2, 0x0209baf9, 0x00044e38}}, Y: Field{[10]uint32{0x006a0d6e, 0x01f9267c, 0x02f88372, 0x005c259c, 0x03ac7d59, 0x0399fcba, 0x02285207, 0x02cabc3a, 0x016a3965, 0x000570a3}}}, + {X: Field{[10]uint32{0x00912c1e, 0x02e0fe4d, 0x02620472, 0x03c56bf0, 0x00dcd3d3, 0x02940c4c, 0x024685aa, 0x035e3183, 0x01421b98, 0x000a74fa}}, Y: Field{[10]uint32{0x02bf5825, 0x011729f4, 0x02ce1a6d, 0x019f222e, 0x01411c8c, 0x02df14ee, 0x01d46b6d, 0x0025a485, 0x00f84968, 0x00242945}}}, + {X: Field{[10]uint32{0x00ff3eb8, 0x025a7021, 0x020c7e90, 0x022294fe, 0x01d6efeb, 0x034b51c2, 0x00c18d7c, 0x00cf813c, 0x02945fdd, 0x002a28da}}, Y: Field{[10]uint32{0x016ab564, 0x025abd7d, 0x002a9bb5, 0x03351e7c, 0x0223db1f, 0x033b872b, 0x02aedbe1, 0x0335c009, 0x0105edbf, 0x000775fe}}}, + {X: Field{[10]uint32{0x02981eff, 0x0030849a, 0x03fd5367, 0x032a0498, 0x003c35f2, 0x00f9e81b, 0x02ab4f0c, 0x02513e43, 0x02ceb3fa, 0x00168123}}, Y: Field{[10]uint32{0x03c886ff, 0x035b52ed, 0x019b24b3, 0x0015a486, 0x008e330d, 0x03a201df, 0x03caf7b5, 0x03b59754, 0x03aeb70f, 0x000493c6}}}, + {X: Field{[10]uint32{0x0132b8ba, 0x0204a23a, 0x031583dc, 0x03b35ca5, 0x00fd1eb4, 0x01917eb1, 0x01ee579c, 0x02f0bd99, 0x02820c5e, 0x000c81c0}}, Y: Field{[10]uint32{0x01bdaa17, 0x036b7ca1, 0x03d55b86, 0x026a00f2, 0x03c17eda, 0x022109c1, 0x03b11ee0, 0x0101fb6b, 0x022d0d68, 0x0023da59}}}, + {X: Field{[10]uint32{0x03afe787, 0x01e91f95, 0x01786db7, 0x024c9e86, 0x02c78105, 0x0202927f, 0x0188a7b0, 0x034fc6ee, 0x025bfb04, 0x001f08a1}}, Y: Field{[10]uint32{0x0036bd3b, 0x03c1b874, 0x00d53097, 0x01c9839c, 0x03d0830b, 0x00e7c672, 0x01997344, 0x02675f55, 0x026e30f5, 0x00280bac}}}, + {X: Field{[10]uint32{0x039385cc, 0x0384f2c2, 0x033a422d, 0x01682abc, 0x01fd842e, 0x00f730d9, 0x02c8269a, 0x02094b01, 0x001330ad, 0x00282e93}}, Y: Field{[10]uint32{0x02239bc8, 0x00a4397f, 0x00960c13, 0x00511d5a, 0x00940fdb, 0x01dee7a1, 0x036d2ce2, 0x02efdfce, 0x03135cfd, 0x00163b2a}}}, + {X: Field{[10]uint32{0x00f76309, 0x007b08d1, 0x038194e3, 0x0121c399, 0x03007be4, 0x00b8b033, 0x03e47a41, 0x02e97723, 0x0042c8a2, 0x0010ab98}}, Y: Field{[10]uint32{0x02a1542e, 0x03c826f7, 0x02c3ce19, 0x008f2f25, 0x0336ea3a, 0x00f19119, 0x010a6e75, 0x022fc888, 0x01ac7ba3, 0x001cab5a}}}, + {X: Field{[10]uint32{0x007b2a19, 0x000b56c2, 0x01e7c6e8, 0x00323f04, 0x01d8f35f, 0x01c081ce, 0x025d82f4, 0x01e8b8fa, 0x00b64550, 0x0023ceba}}, Y: Field{[10]uint32{0x025b4cfe, 0x034ae03b, 0x036a50d1, 0x009f4fe6, 0x03604259, 0x02e6c51c, 0x003420ef, 0x03b5506e, 0x02353028, 0x00186ee3}}}, + {X: Field{[10]uint32{0x005df32f, 0x006d0dec, 0x004c00d9, 0x00498ab9, 0x00a7ba1e, 0x00254f9b, 0x024fb4f3, 0x00648283, 0x024b1e15, 0x000ea12e}}, Y: Field{[10]uint32{0x013e20c0, 0x02eb679f, 0x02ce7d3c, 0x03af3771, 0x0332c44e, 0x02438743, 0x023abe9c, 0x017c51ec, 0x01794352, 0x002c83d9}}}, + {X: Field{[10]uint32{0x03316210, 0x017f6239, 0x005b62d2, 0x0204af05, 0x017b87d1, 0x03918b9f, 0x00c102bd, 0x02940cfb, 0x026c0b04, 0x0019207f}}, Y: Field{[10]uint32{0x0364560d, 0x039709e3, 0x01075b26, 0x003abbcc, 0x03d4e88b, 0x00232461, 0x036538b8, 0x00ab4245, 0x00abf5f3, 0x002f306d}}}, + {X: Field{[10]uint32{0x0151a094, 0x004c1935, 0x02f4d1ff, 0x032b2b02, 0x038e4bd1, 0x03dceccf, 0x01cd3651, 0x0160febe, 0x0174722c, 0x00014d00}}, Y: Field{[10]uint32{0x01a66a8e, 0x02f88840, 0x00a41a3b, 0x016ebafe, 0x01d9e465, 0x021742a5, 0x0035180f, 0x0185b439, 0x0135448a, 0x00392408}}}, + {X: Field{[10]uint32{0x022867cc, 0x003e1493, 0x0349bb35, 0x029e4372, 0x016c9ee2, 0x015ef0cb, 0x024e08bd, 0x017135b0, 0x02aea582, 0x00301a4f}}, Y: Field{[10]uint32{0x03b9a05e, 0x0217618c, 0x00a0462c, 0x022bbf83, 0x01f4f617, 0x032e3ed5, 0x006c601b, 0x01047817, 0x034b7627, 0x0036883e}}}, + {X: Field{[10]uint32{0x00fa0d9d, 0x02dba4cf, 0x0335ca91, 0x006a0d59, 0x01e63e58, 0x02862608, 0x03f9200c, 0x00140b45, 0x037372fd, 0x00314743}}, Y: Field{[10]uint32{0x02352655, 0x02b5308b, 0x03413b3b, 0x01f4f1be, 0x03a2797a, 0x013ae5e6, 0x03ff1345, 0x01fb74b3, 0x02b207ed, 0x00234439}}}, + {X: Field{[10]uint32{0x02c3290c, 0x005837ef, 0x0059dbe3, 0x023b674b, 0x03366600, 0x022d4ab4, 0x02f79f85, 0x0266b8b6, 0x00564d2d, 0x0005a046}}, Y: Field{[10]uint32{0x012e7460, 0x03ddee8a, 0x0202d1ad, 0x0128f021, 0x033e9cc8, 0x0148b342, 0x01dbac34, 0x01e123a0, 0x01a14561, 0x000afafc}}}, + {X: Field{[10]uint32{0x000afeb5, 0x0125d21f, 0x01a0920a, 0x02695e0d, 0x030b1599, 0x01952a9b, 0x00e16225, 0x021496cb, 0x0133e143, 0x001eba52}}, Y: Field{[10]uint32{0x019b95f5, 0x00bd3d6f, 0x0390195a, 0x02dbd10f, 0x01a13b87, 0x038ccc6f, 0x00282a51, 0x0191684e, 0x0237830a, 0x0024644b}}}, + {X: Field{[10]uint32{0x0019d4ac, 0x0166684c, 0x0036b179, 0x02c156cb, 0x02c27709, 0x00b46fc2, 0x014c5f6c, 0x01daac90, 0x0197d02b, 0x0039de4b}}, Y: Field{[10]uint32{0x013f2b52, 0x02e6383b, 0x02e8d16f, 0x00528a05, 0x01dd2746, 0x01755b30, 0x00c75a0d, 0x02c5e6e6, 0x02895fce, 0x0027d365}}}, + {X: Field{[10]uint32{0x0247bde1, 0x0278d34c, 0x004f769d, 0x001bba9b, 0x003d97d7, 0x02b1e514, 0x00ff64f4, 0x0358fc93, 0x01d4946f, 0x0000bfee}}, Y: Field{[10]uint32{0x0381014f, 0x0095edfa, 0x03a9ff32, 0x00c955db, 0x02cff188, 0x038d823a, 0x016907a6, 0x0054c4af, 0x00743488, 0x00019ac7}}}, + {X: Field{[10]uint32{0x00bb2fbe, 0x01722c7b, 0x00ea3c16, 0x02e84b80, 0x01aeb6f4, 0x012b9cd4, 0x012aafab, 0x03bac450, 0x0232f90c, 0x0011512e}}, Y: Field{[10]uint32{0x038f6736, 0x0221f2e7, 0x017b3948, 0x022e0d1e, 0x002bba53, 0x000b6eff, 0x039ede9b, 0x033ba2fe, 0x03b4c2a5, 0x0018bef5}}}, + {X: Field{[10]uint32{0x0118980f, 0x0278f99e, 0x0137a1b0, 0x039e2093, 0x025d981c, 0x02319ed7, 0x02b156dd, 0x03fe89d7, 0x01b925d9, 0x000942c0}}, Y: Field{[10]uint32{0x0209c481, 0x03ae074f, 0x000ff261, 0x0185010b, 0x03eb1851, 0x01d98967, 0x032bcbe6, 0x036a1b94, 0x024a32f0, 0x002e8764}}}, + {X: Field{[10]uint32{0x02beb4d2, 0x0387fb82, 0x030f5ecb, 0x004e4078, 0x0262e0b8, 0x00ba58bb, 0x00468073, 0x017f71cc, 0x02541f2a, 0x00273cc3}}, Y: Field{[10]uint32{0x01510723, 0x035528ed, 0x00741c6b, 0x03ad959f, 0x02848259, 0x02aa3fd8, 0x0201d14b, 0x02ddec65, 0x02cd1281, 0x001f2c91}}}, + {X: Field{[10]uint32{0x02285a2c, 0x005ec695, 0x01c03cd2, 0x03293c47, 0x01b5a90e, 0x0254213b, 0x013be124, 0x0287823e, 0x00b13c61, 0x003b727a}}, Y: Field{[10]uint32{0x021e1f3d, 0x03e67f98, 0x01fda5e9, 0x02168bf7, 0x01b0e8df, 0x02320198, 0x0143b1b5, 0x03eb1d3f, 0x012107e8, 0x0019b0bf}}}, + {X: Field{[10]uint32{0x01e2c66e, 0x020b1c3c, 0x036b6970, 0x000acf76, 0x02cae9d0, 0x009ee06e, 0x02a41649, 0x029260aa, 0x015f8388, 0x0037650a}}, Y: Field{[10]uint32{0x00d6706b, 0x03af0602, 0x00f4bfd3, 0x02c920b6, 0x033b08c2, 0x007eb20f, 0x00d9e8cb, 0x0307aa6f, 0x020cd409, 0x0020e301}}}, + {X: Field{[10]uint32{0x0285ab7e, 0x01d14d41, 0x0087692f, 0x037742b1, 0x0296e96d, 0x02ff1cd3, 0x000d3b35, 0x02f92397, 0x0204dfc0, 0x001f81a3}}, Y: Field{[10]uint32{0x02c70d0a, 0x02100793, 0x036462c8, 0x0021e620, 0x0369351e, 0x024fc52f, 0x00052e60, 0x00972341, 0x014690d2, 0x0037cb34}}}, + {X: Field{[10]uint32{0x009a5052, 0x010fce65, 0x0217a21f, 0x01cdf7b0, 0x00b7c2a0, 0x01b10e68, 0x02e659f7, 0x02b26c11, 0x03cfd10a, 0x001cea6f}}, Y: Field{[10]uint32{0x03be10dd, 0x01092a6c, 0x00ec24a1, 0x03da46a7, 0x03bf379d, 0x023e1b2f, 0x002062c0, 0x02c1481a, 0x01293ea7, 0x001cee45}}}, + {X: Field{[10]uint32{0x0008c55b, 0x0211fb35, 0x0205adaa, 0x012fda6f, 0x0055cc22, 0x0216026f, 0x0234678d, 0x031d539b, 0x03840c8c, 0x003bf77f}}, Y: Field{[10]uint32{0x02f188d5, 0x01b75b70, 0x013fc173, 0x0228ed9c, 0x008aac21, 0x03116d2b, 0x026ed7e0, 0x02aacbbf, 0x03418264, 0x00197763}}}, + {X: Field{[10]uint32{0x03d73f4b, 0x015a23af, 0x03585756, 0x016c5c69, 0x01dc264f, 0x010e1b76, 0x023d6dfa, 0x00e13634, 0x01857118, 0x0011aa51}}, Y: Field{[10]uint32{0x01aaf35c, 0x03004699, 0x02a6d256, 0x03a3a37c, 0x031e684e, 0x0239fd85, 0x03f16cb3, 0x03063d36, 0x037ea298, 0x000f796b}}}, + {X: Field{[10]uint32{0x0021cd3f, 0x03a91fce, 0x0193b910, 0x02326b5b, 0x0045dd0c, 0x038582a5, 0x02fa17bb, 0x03099752, 0x01b27ce3, 0x001a243b}}, Y: Field{[10]uint32{0x03cbd1ab, 0x008103dd, 0x03852dd2, 0x03abad9e, 0x037c24be, 0x02a200aa, 0x00810a7c, 0x01525336, 0x005b10ef, 0x00183d1f}}}, + {X: Field{[10]uint32{0x0205f5ae, 0x02d12d0a, 0x0288d952, 0x03087d55, 0x01e33e68, 0x01e89470, 0x02c4b328, 0x0221aa07, 0x02b6340b, 0x00023327}}, Y: Field{[10]uint32{0x007fb6eb, 0x022fc08c, 0x01c95507, 0x01c05432, 0x01f03238, 0x02f11d6e, 0x011981a3, 0x020a4224, 0x030d90e3, 0x0026c5da}}}, + {X: Field{[10]uint32{0x015b0475, 0x007f8a92, 0x00e0b0fd, 0x03809b25, 0x01227875, 0x025b3785, 0x0001ccae, 0x03782d60, 0x035ada48, 0x000ac18b}}, Y: Field{[10]uint32{0x031eab0d, 0x00d4e40b, 0x0280548b, 0x02523bfd, 0x02da9de9, 0x02fc5c9d, 0x0097bad4, 0x01c31420, 0x00683d51, 0x0014dfc7}}}, + {X: Field{[10]uint32{0x037240f9, 0x01ea2fae, 0x0008252d, 0x037c9fcc, 0x01cd358b, 0x0093a48c, 0x032ff7f2, 0x0354fd0c, 0x011a84b3, 0x0037556e}}, Y: Field{[10]uint32{0x012a5c94, 0x02064206, 0x0158bff6, 0x01ce8eb0, 0x01774d21, 0x037bbe5a, 0x03376094, 0x0194c3b5, 0x0208a40b, 0x00039bc6}}}, + {X: Field{[10]uint32{0x02c59c70, 0x032592bc, 0x01e7516f, 0x02035c54, 0x008986fd, 0x01e0bb8b, 0x000cdb1c, 0x02a5e51b, 0x03e040b1, 0x002b1449}}, Y: Field{[10]uint32{0x03ae5db9, 0x017a806d, 0x038e2476, 0x025e202b, 0x038afbb0, 0x01d9164f, 0x020a82e1, 0x0014e776, 0x0249323d, 0x00212788}}}, + {X: Field{[10]uint32{0x01311123, 0x0084b06d, 0x034bff72, 0x008c54c5, 0x039d1364, 0x038776b9, 0x004e9ce1, 0x033a68de, 0x02daf0b6, 0x0037cbcb}}, Y: Field{[10]uint32{0x006d46a5, 0x031d7dba, 0x027bedba, 0x01105880, 0x02fde6ab, 0x01991009, 0x02da64f4, 0x02f080c5, 0x038ebd78, 0x002e7663}}}, + {X: Field{[10]uint32{0x0373e5f9, 0x03e4f5e8, 0x0002773f, 0x03d0fec2, 0x0097bdc5, 0x00844d84, 0x0385e216, 0x0305d88e, 0x0387d630, 0x003f60ec}}, Y: Field{[10]uint32{0x036cd2ee, 0x019c2daa, 0x00837d3c, 0x02f0e10e, 0x01115805, 0x0303f772, 0x03503d40, 0x00d69675, 0x027d375f, 0x0026a58a}}}, + {X: Field{[10]uint32{0x02cac4df, 0x03ae384c, 0x00c9505f, 0x0079081b, 0x00d565ca, 0x028ffaaa, 0x02ad443b, 0x0322b22f, 0x03c1155e, 0x00363ef7}}, Y: Field{[10]uint32{0x011f73ac, 0x02697a9d, 0x03abc9cb, 0x03587e58, 0x027fb1fc, 0x03afdd90, 0x01258edf, 0x0272d1ce, 0x000fccb9, 0x003e514f}}}, + {X: Field{[10]uint32{0x03bf86d6, 0x00443037, 0x010ddc89, 0x01cae08d, 0x0285f008, 0x01aabcf5, 0x03093891, 0x03a3006c, 0x009a20a3, 0x0027f25d}}, Y: Field{[10]uint32{0x023e19df, 0x0129e661, 0x02379109, 0x02eb9d69, 0x0075c85c, 0x0023c3c6, 0x033bca70, 0x02b1655d, 0x01a76c92, 0x0028bd9e}}}, + {X: Field{[10]uint32{0x03476a3f, 0x032057cb, 0x00f62b58, 0x024b4dca, 0x0365b810, 0x038865ae, 0x02bcf252, 0x0073a6f6, 0x034671a9, 0x000a7838}}, Y: Field{[10]uint32{0x00d0c0e6, 0x02f5a635, 0x039d4174, 0x002aad0b, 0x011ce5ad, 0x0319ac98, 0x00a35fb9, 0x002b91e6, 0x0061b82e, 0x000bd103}}}, + {X: Field{[10]uint32{0x02e102d7, 0x01ad4642, 0x0278f873, 0x002ea1bb, 0x007fbee7, 0x0330f7ee, 0x03e6f929, 0x015683c9, 0x02153989, 0x003901a2}}, Y: Field{[10]uint32{0x03165086, 0x0279a623, 0x014e77d6, 0x010c1d1f, 0x0016b911, 0x012a68d4, 0x01999438, 0x0272dabb, 0x02ad550f, 0x0028fcbc}}}, + {X: Field{[10]uint32{0x026c9f2c, 0x01080a1c, 0x0109248a, 0x01934f55, 0x0010f163, 0x0132065e, 0x03156c8a, 0x0366262e, 0x0210bb1b, 0x00146d17}}, Y: Field{[10]uint32{0x03e141a2, 0x023256f8, 0x03f6bb47, 0x01452315, 0x008a1f1d, 0x00004330, 0x01ac4797, 0x03798ca0, 0x01d04225, 0x0038c1c6}}}, + {X: Field{[10]uint32{0x02a0b83e, 0x032fe96a, 0x005acf6f, 0x00bf5683, 0x0164dc49, 0x01b18ecf, 0x02ec2e60, 0x02dad7a4, 0x01297b8a, 0x00053357}}, Y: Field{[10]uint32{0x03666805, 0x00af5df8, 0x033279b7, 0x01c0a91a, 0x015be192, 0x02c71f63, 0x01ad1faf, 0x032198d2, 0x03d77cdc, 0x0016fcc1}}}, + {X: Field{[10]uint32{0x022c4da6, 0x03376d74, 0x0168f8c3, 0x037d067b, 0x0045e9f2, 0x027060a2, 0x02254cae, 0x03451b0c, 0x031149d6, 0x00296a29}}, Y: Field{[10]uint32{0x00bf6c2e, 0x002eeb4f, 0x012d549c, 0x0205e0cf, 0x00b003f4, 0x0158e6fc, 0x00ae6933, 0x034d16bd, 0x00877bc3, 0x0027d1f6}}}, + {X: Field{[10]uint32{0x039372cb, 0x01303107, 0x038f999a, 0x0394b31d, 0x01bda494, 0x00519893, 0x01b13ddd, 0x0108cb5d, 0x00d24baa, 0x000d64ca}}, Y: Field{[10]uint32{0x001af6d8, 0x0206b3c9, 0x03050a78, 0x01f5923d, 0x03b6695d, 0x0323da02, 0x0084afe0, 0x00e67a64, 0x02b571df, 0x0034c555}}}, + {X: Field{[10]uint32{0x0273e7fd, 0x03e56f79, 0x005e891a, 0x0304349b, 0x00c8fdac, 0x02407b6c, 0x0268a12d, 0x0168b05c, 0x01ca4f2a, 0x00327ae0}}, Y: Field{[10]uint32{0x008adb66, 0x034a5092, 0x008df76e, 0x0394d558, 0x035acb73, 0x026fef5a, 0x01ae19cd, 0x03fa69c4, 0x012fc974, 0x001b5294}}}, + {X: Field{[10]uint32{0x02ca8e2c, 0x037979b0, 0x01f386cc, 0x00c093d0, 0x0248e557, 0x02d840b8, 0x00c9f90e, 0x02cc22b1, 0x01f816f3, 0x0038998c}}, Y: Field{[10]uint32{0x039306bd, 0x011857fa, 0x0224858a, 0x00502f56, 0x0396cfb8, 0x00146094, 0x01e2f102, 0x03b34059, 0x02a8823a, 0x0005b82c}}}, + {X: Field{[10]uint32{0x019110ba, 0x020d57fe, 0x029658db, 0x03e68ec2, 0x02677e5a, 0x01a711cc, 0x0007b242, 0x039f941e, 0x02f365c0, 0x003ddba6}}, Y: Field{[10]uint32{0x012a9407, 0x032c04ef, 0x021028a0, 0x018a5ab6, 0x019d174c, 0x0217e759, 0x02f25423, 0x00593af6, 0x0039d26f, 0x002032fd}}}, + {X: Field{[10]uint32{0x012c5dd9, 0x03d89c21, 0x03421e65, 0x01521079, 0x00bc333d, 0x02a23f38, 0x01d6ab69, 0x00520ca5, 0x005baf89, 0x00373205}}, Y: Field{[10]uint32{0x031e2a19, 0x031866bc, 0x01480cca, 0x03360362, 0x00296155, 0x000d8eec, 0x00d6cd16, 0x039ea6d0, 0x0370a620, 0x0033b6cd}}}, + {X: Field{[10]uint32{0x0203e4fd, 0x00feb4f1, 0x03847ed3, 0x010107b6, 0x007660bc, 0x02ba4c06, 0x02a199ec, 0x01343e95, 0x013a6a1c, 0x001d9178}}, Y: Field{[10]uint32{0x0291e713, 0x01308b2f, 0x002ee186, 0x014ec8b1, 0x02bcfc53, 0x036a2434, 0x01eccbb5, 0x03975449, 0x011b7990, 0x001f23a9}}}, + {X: Field{[10]uint32{0x022f3f25, 0x00acc627, 0x00fb4422, 0x01751788, 0x01465822, 0x00706daf, 0x027210d5, 0x02f3bebf, 0x006ed74c, 0x002e89a2}}, Y: Field{[10]uint32{0x02b3409d, 0x01436e28, 0x02893bdf, 0x009dcd67, 0x01e0b896, 0x02ee8c9b, 0x025fa64a, 0x02b7ba79, 0x01b223dd, 0x003f6217}}}, + {X: Field{[10]uint32{0x01050fe1, 0x03486946, 0x02c92299, 0x023579e4, 0x000fc657, 0x029497a0, 0x01bda654, 0x016c7640, 0x00e13100, 0x001a2d40}}, Y: Field{[10]uint32{0x0312f96b, 0x001757da, 0x0202207e, 0x009e0f80, 0x008df9b1, 0x01f6951a, 0x01ac8e87, 0x012a53cf, 0x017ab354, 0x001c7bdf}}}, + {X: Field{[10]uint32{0x027996ff, 0x03a9d6b6, 0x01064b84, 0x03265029, 0x035b19f7, 0x00b1be81, 0x03f851f1, 0x02a0f09f, 0x03e2613f, 0x000b3329}}, Y: Field{[10]uint32{0x03d7707f, 0x02b83cc9, 0x005703c6, 0x023c2fb5, 0x03cf37af, 0x03164e42, 0x01b2d2f0, 0x006b4343, 0x022222dd, 0x0016adc2}}}, + {X: Field{[10]uint32{0x03179f14, 0x03d369bd, 0x033c1827, 0x03013573, 0x00383ad9, 0x032db729, 0x01af7183, 0x0291686d, 0x012d6a56, 0x001b5e5f}}, Y: Field{[10]uint32{0x000edf3f, 0x0189547a, 0x02ea67b1, 0x0078568e, 0x03b80e54, 0x035bd6a2, 0x0284bee7, 0x03463667, 0x00e5d203, 0x0002ab8d}}}, + {X: Field{[10]uint32{0x018ee327, 0x001665ba, 0x027b5116, 0x0160157d, 0x009a565a, 0x025a94f9, 0x013751ad, 0x01dac655, 0x03c437be, 0x002a9a65}}, Y: Field{[10]uint32{0x00684835, 0x0030cf03, 0x034cb3cc, 0x01de87d3, 0x036532e2, 0x038bd7c6, 0x018a15b2, 0x0103825a, 0x00219cdb, 0x00180d29}}}, + {X: Field{[10]uint32{0x022a0f48, 0x00316fae, 0x02dead01, 0x02137006, 0x0201e624, 0x02c3e25f, 0x005d53a7, 0x0075c28d, 0x03bffb8e, 0x0015b103}}, Y: Field{[10]uint32{0x02f0bd01, 0x032daa91, 0x01f4c458, 0x01e1f8a6, 0x01676a4a, 0x01cf632a, 0x03a0e091, 0x024a409e, 0x0389078b, 0x003a7419}}}, + {X: Field{[10]uint32{0x03918d89, 0x0240f545, 0x010731d2, 0x00dca94d, 0x01b6e1e2, 0x02d4b0f7, 0x0262be08, 0x03b5ef70, 0x02a83963, 0x0036dbfd}}, Y: Field{[10]uint32{0x01951769, 0x02dc461f, 0x03bdc162, 0x019435d5, 0x030e248d, 0x00513283, 0x02f6b18c, 0x03f512d0, 0x02fa0f30, 0x00290044}}}, + {X: Field{[10]uint32{0x03402c6d, 0x03286018, 0x01de4151, 0x01cdd539, 0x03dcdd11, 0x02950c04, 0x00e730d4, 0x018f88ce, 0x0301a46f, 0x00237d55}}, Y: Field{[10]uint32{0x03a1c3df, 0x0344b755, 0x02a93b9d, 0x0196f227, 0x02b3e696, 0x0122efd8, 0x016ddafb, 0x00ffc04e, 0x009a64b6, 0x001933e7}}}, + {X: Field{[10]uint32{0x030588a1, 0x03d22806, 0x00af37be, 0x033b7896, 0x0166485c, 0x01775791, 0x03ae460e, 0x023d5d01, 0x002c5101, 0x0027442f}}, Y: Field{[10]uint32{0x00922c04, 0x0324e261, 0x02ac2fcb, 0x00baba83, 0x01726b30, 0x000f7fae, 0x01ebe44e, 0x0385c5fb, 0x0008b2a4, 0x000e3a8f}}}, + {X: Field{[10]uint32{0x03640367, 0x02e601cd, 0x03e662e4, 0x01ec3f39, 0x02056025, 0x0080581b, 0x027a7068, 0x029e1cb2, 0x0075cc07, 0x0004eef2}}, Y: Field{[10]uint32{0x00c2c708, 0x011d2c70, 0x007697fe, 0x02bf5bd5, 0x02d2ea3d, 0x02abc6c7, 0x00a19acb, 0x00a99b63, 0x031a47c8, 0x002d3365}}}, + {X: Field{[10]uint32{0x02a9c3e1, 0x03273257, 0x02b1e24e, 0x028c4f24, 0x011857d9, 0x00369b72, 0x0147630d, 0x02c5d372, 0x0037f617, 0x0023c9b7}}, Y: Field{[10]uint32{0x033f15ef, 0x03ddb839, 0x0375bd5c, 0x03f0554c, 0x00f887f2, 0x01646b11, 0x00238776, 0x02fc9d39, 0x03031d96, 0x000e1228}}}, + {X: Field{[10]uint32{0x007b5f21, 0x0295e693, 0x01041ad3, 0x026c4419, 0x03a23e0d, 0x01836f84, 0x015236f6, 0x0245bd79, 0x003df290, 0x000b8795}}, Y: Field{[10]uint32{0x01473846, 0x002b4bed, 0x02d28ff1, 0x020ca3f8, 0x03947bc0, 0x00610d2d, 0x00cd9f32, 0x00176b04, 0x0127626e, 0x00221691}}}, + {X: Field{[10]uint32{0x023f3109, 0x02020b3b, 0x0385a123, 0x0143a31e, 0x018bed8f, 0x00fada6d, 0x0076936e, 0x027aa2ee, 0x00a3e050, 0x00320f0b}}, Y: Field{[10]uint32{0x029cd5ed, 0x01f0cc4c, 0x00c0e3b0, 0x01d54c07, 0x0074b75e, 0x00276955, 0x030da10d, 0x02378ac2, 0x02a9bc80, 0x000ae580}}}, + {X: Field{[10]uint32{0x03d29607, 0x0347eaf4, 0x02700578, 0x00724181, 0x01afee8b, 0x038e14c4, 0x024111ae, 0x005394c9, 0x03b4e2c1, 0x00231e40}}, Y: Field{[10]uint32{0x01025731, 0x011cddbc, 0x01b2528d, 0x000620a6, 0x00b488c4, 0x00a8d0fa, 0x02ebea9a, 0x03e53407, 0x02d1964d, 0x003740b6}}}, + {X: Field{[10]uint32{0x02569cc0, 0x029a0769, 0x009bda38, 0x02199532, 0x01b51857, 0x00707ae1, 0x00adfc6c, 0x01d732cc, 0x0054dd75, 0x0012098f}}, Y: Field{[10]uint32{0x0213167f, 0x037ee204, 0x03955dda, 0x017d572d, 0x02e223ac, 0x00964dba, 0x0198e49a, 0x02d4a03b, 0x03bddacd, 0x0039bc41}}}, + {X: Field{[10]uint32{0x02f0d2d3, 0x02c95185, 0x0227495f, 0x009f153b, 0x00accb71, 0x00f35766, 0x018644c6, 0x007d61e4, 0x010aea7d, 0x001a9f01}}, Y: Field{[10]uint32{0x0021e232, 0x01c95bb6, 0x0154628d, 0x020ed2ec, 0x02f80f73, 0x00226c32, 0x03f733dc, 0x0191b8d2, 0x026127a2, 0x003eb464}}}, + {X: Field{[10]uint32{0x035c3ea8, 0x0168661f, 0x01a3bf10, 0x02683331, 0x030ece87, 0x00c72c27, 0x01147dcc, 0x03080b7e, 0x013f62fb, 0x00387c29}}, Y: Field{[10]uint32{0x01706277, 0x02483c79, 0x01d8dcfe, 0x024bf8b9, 0x003968f6, 0x0100dde0, 0x03148489, 0x03a8c030, 0x010f0b0e, 0x000e4c28}}}, + {X: Field{[10]uint32{0x03182b7b, 0x00999d74, 0x0213b485, 0x0029b539, 0x02da9b6a, 0x02293219, 0x026efcae, 0x03296ff5, 0x0113cb0f, 0x002f03ec}}, Y: Field{[10]uint32{0x03090f31, 0x02871b2f, 0x0060131c, 0x01581d17, 0x0037892c, 0x00fb2c52, 0x0315f691, 0x03baef49, 0x025e6993, 0x0038479c}}}, + {X: Field{[10]uint32{0x0342f908, 0x02c0ca72, 0x034fe266, 0x0285d284, 0x030ee7e6, 0x027ab9ed, 0x03f9ebf8, 0x023d2192, 0x00f49c43, 0x0007f968}}, Y: Field{[10]uint32{0x0275f66c, 0x03584271, 0x0379b35a, 0x012b3a6d, 0x02069451, 0x03e9ed65, 0x033878bc, 0x0190724a, 0x01cef912, 0x0036e025}}}, + {X: Field{[10]uint32{0x02524cd4, 0x010c82aa, 0x00f6de43, 0x020cfcf2, 0x00ade6ea, 0x02afe94f, 0x02e61aae, 0x01c00be9, 0x01b49016, 0x001778ff}}, Y: Field{[10]uint32{0x007e08f0, 0x01615e45, 0x00535dc1, 0x028f57a6, 0x016d7e9c, 0x02346b0a, 0x004a1dd8, 0x035b3acd, 0x0288862a, 0x002d72f7}}}, + {X: Field{[10]uint32{0x023da54f, 0x02ff2f00, 0x020738ad, 0x00b78865, 0x02b2964f, 0x02529916, 0x02b0be62, 0x037f3d7b, 0x0193a913, 0x0024ec1a}}, Y: Field{[10]uint32{0x012ae0b8, 0x01285352, 0x0107c4d1, 0x03607a2d, 0x029c151a, 0x0328f1f8, 0x007330ef, 0x02dd1106, 0x002f856c, 0x001e0d9e}}}, + {X: Field{[10]uint32{0x02762f0c, 0x02de1823, 0x01851886, 0x026f8e05, 0x009c3336, 0x01ac1578, 0x005a044f, 0x001d079a, 0x000d27d9, 0x0001c15d}}, Y: Field{[10]uint32{0x033d956e, 0x01772645, 0x03c55d3f, 0x00c87eec, 0x00b2142b, 0x00a7c4ab, 0x013193b5, 0x011b1a7a, 0x03bb738d, 0x00312963}}}, + {X: Field{[10]uint32{0x0193e296, 0x00687847, 0x0086434a, 0x019d8410, 0x02e5b787, 0x0254c3c2, 0x00a20e19, 0x015499cd, 0x0000fc48, 0x001d8668}}, Y: Field{[10]uint32{0x006ebed6, 0x02fa1b41, 0x032014f8, 0x01d5dc80, 0x01ab26f6, 0x028b3ad6, 0x03a0afe0, 0x011e73db, 0x01e1182f, 0x001fcc03}}}, + {X: Field{[10]uint32{0x019ff2fe, 0x0150a296, 0x0060dbec, 0x02d8e139, 0x01cc0d54, 0x00a0504f, 0x01346fcd, 0x014805b3, 0x01a8ddbb, 0x003f883d}}, Y: Field{[10]uint32{0x002d879c, 0x02a4ae49, 0x02e0bae7, 0x01ead3b2, 0x01338cf4, 0x02655ec3, 0x02be551f, 0x0121c6bf, 0x02e6e260, 0x0016d222}}}, + {X: Field{[10]uint32{0x02ad11e2, 0x03878fd0, 0x00b84422, 0x00862ae2, 0x01707681, 0x00f1d47e, 0x0129e077, 0x014b3cb7, 0x0327ba7e, 0x002656e5}}, Y: Field{[10]uint32{0x037fd26e, 0x03d71b4b, 0x0391f42a, 0x0217e416, 0x0049c8d5, 0x00a6f62e, 0x02c5e5f5, 0x0051a313, 0x01c97ee4, 0x0030f277}}}, + {X: Field{[10]uint32{0x002b3136, 0x01f0909c, 0x02a16e26, 0x02836130, 0x01636d26, 0x01458648, 0x02913445, 0x0135f1e7, 0x024d2ca9, 0x0032d3cb}}, Y: Field{[10]uint32{0x003ddb9b, 0x021e77a0, 0x02e49bbb, 0x01c5e9a3, 0x031b9b2f, 0x03df8ae2, 0x000df480, 0x01039b3c, 0x02ee3949, 0x000857ad}}}, + {X: Field{[10]uint32{0x01fce397, 0x00b095ae, 0x00e6fc72, 0x02757869, 0x034572b6, 0x019a3ad9, 0x00b10707, 0x024512eb, 0x025634b4, 0x0032828a}}, Y: Field{[10]uint32{0x03f4841b, 0x023ae0b4, 0x01ebfe95, 0x029c2f6d, 0x036e2562, 0x01ab69e9, 0x0098c855, 0x00beee94, 0x00c974ab, 0x002481e7}}}, + {X: Field{[10]uint32{0x03af7c7b, 0x01ae48b8, 0x00246acd, 0x02259ed3, 0x02bfadde, 0x013bc58e, 0x02f27a02, 0x0302bf5c, 0x032dc6c0, 0x003ee08c}}, Y: Field{[10]uint32{0x0134c7ee, 0x0315032a, 0x030c660d, 0x02646733, 0x032b90d3, 0x038b12c6, 0x00beaa52, 0x02da40ce, 0x0119f21c, 0x00069a5c}}}, + {X: Field{[10]uint32{0x00513dd2, 0x03b10a97, 0x006736af, 0x02818f6d, 0x02d07550, 0x008062f5, 0x02184a4e, 0x0237bc83, 0x0205d925, 0x003415bb}}, Y: Field{[10]uint32{0x0015bffb, 0x0366632f, 0x0031c276, 0x03135a37, 0x0389ab0f, 0x0006b5c9, 0x027cfb62, 0x038d599f, 0x01d0d222, 0x0002bcb0}}}, + {X: Field{[10]uint32{0x02526f12, 0x028494d0, 0x007267ae, 0x004b360a, 0x01c63257, 0x02dde18d, 0x0046c594, 0x01098b10, 0x0222c658, 0x000feb6c}}, Y: Field{[10]uint32{0x0199ae96, 0x019adfb0, 0x02717586, 0x0387aae1, 0x03d181e0, 0x02875d2d, 0x00a7e8bf, 0x00474e13, 0x0007fa68, 0x00369723}}}, + {X: Field{[10]uint32{0x019c4b61, 0x01098ec7, 0x029248ab, 0x023bed9f, 0x03214b81, 0x0274f914, 0x01915dd3, 0x03943977, 0x0169e222, 0x00349eb2}}, Y: Field{[10]uint32{0x033a1c7f, 0x02529db2, 0x03f6f9b4, 0x016b6079, 0x0209a7c5, 0x02100c8d, 0x02709a32, 0x034c15b9, 0x0294baea, 0x0031215d}}}, + {X: Field{[10]uint32{0x02c565d4, 0x0103c05c, 0x02cbcd93, 0x00064686, 0x0399cd3a, 0x03ff5a7b, 0x03a4324b, 0x006b9a97, 0x01b48b98, 0x001048de}}, Y: Field{[10]uint32{0x00fa280e, 0x034fa1ff, 0x023abac9, 0x00ec9154, 0x03c75505, 0x02f9aad5, 0x02523e7e, 0x0393c0b2, 0x02c9c7db, 0x003c900d}}}, + {X: Field{[10]uint32{0x039336f1, 0x037ea8fd, 0x003eace9, 0x027ec849, 0x01bef790, 0x018f4029, 0x028cc3b6, 0x01304ee6, 0x02aa9937, 0x003608d3}}, Y: Field{[10]uint32{0x02755c27, 0x03e412db, 0x00e5cb1f, 0x03e47720, 0x001845d8, 0x00a4aeaf, 0x03c15930, 0x0197d9a8, 0x028ec4b4, 0x0002e32f}}}, + {X: Field{[10]uint32{0x01189009, 0x02ebca97, 0x03bbe47f, 0x00e8f61d, 0x00427d32, 0x03634f00, 0x000ea349, 0x03fe72eb, 0x033568c5, 0x00109be2}}, Y: Field{[10]uint32{0x0100586d, 0x010e672f, 0x03bfd7dc, 0x01fde214, 0x019931f5, 0x01f2e0ae, 0x03a1ba72, 0x00f1ee71, 0x013dce02, 0x0013808a}}}, + {X: Field{[10]uint32{0x0097dfa5, 0x009d8291, 0x036ccfe7, 0x01bb1e03, 0x01871757, 0x0272971e, 0x012a7fdc, 0x017cb090, 0x02f902ee, 0x003c71c1}}, Y: Field{[10]uint32{0x03b7e740, 0x0173eb0a, 0x004d59f8, 0x02575ae7, 0x009ef758, 0x006826e1, 0x01787005, 0x01570ece, 0x01a1727f, 0x00317868}}}, + {X: Field{[10]uint32{0x02c2c679, 0x03c61a4d, 0x00b67608, 0x00799d66, 0x03598200, 0x0094d5ad, 0x00d66825, 0x01661e5a, 0x007ecc1d, 0x002138b8}}, Y: Field{[10]uint32{0x0028555a, 0x01ce19b3, 0x03bb6281, 0x03dbd6d0, 0x012903f4, 0x01ff3ae9, 0x0275a8ab, 0x03b3732f, 0x03438ab5, 0x00106ac4}}}, + {X: Field{[10]uint32{0x02ad2b54, 0x0226d01d, 0x020689c6, 0x002fbc3d, 0x023d599b, 0x028633da, 0x02bb6993, 0x01608d12, 0x02c2fe53, 0x001e4d7b}}, Y: Field{[10]uint32{0x03371910, 0x033ef554, 0x01b406c4, 0x02b78f5d, 0x01b77480, 0x0393d721, 0x00ed574f, 0x022186db, 0x016aab97, 0x00338bf2}}}, + {X: Field{[10]uint32{0x00dbd9a0, 0x029a8c2c, 0x0383927a, 0x02250878, 0x013e8c26, 0x0368e802, 0x01abbef9, 0x01b55ade, 0x00a8319f, 0x003550a9}}, Y: Field{[10]uint32{0x038173e1, 0x01e6bb1e, 0x037a4f19, 0x00326161, 0x026badb7, 0x00654681, 0x019f3e9c, 0x0217aa3e, 0x016265d2, 0x00144128}}}, + {X: Field{[10]uint32{0x00ece2be, 0x009f6691, 0x0232fd3c, 0x02e49bec, 0x00041011, 0x000e049b, 0x02f0157a, 0x02624012, 0x02194228, 0x002f1a49}}, Y: Field{[10]uint32{0x0252f3bc, 0x00da71ff, 0x034f9847, 0x00bb6c97, 0x0311e202, 0x032e3bdd, 0x032e8543, 0x0298c24d, 0x00c147e2, 0x00238bc4}}}, + {X: Field{[10]uint32{0x018d8d03, 0x0086fd74, 0x03e51f45, 0x024257d0, 0x00ae079a, 0x0122ad94, 0x02cdd80b, 0x0230237a, 0x0336bb17, 0x003af86d}}, Y: Field{[10]uint32{0x01db7514, 0x0028bab3, 0x02bbb0cd, 0x0187f23b, 0x03782f20, 0x00aa049a, 0x0378ef4b, 0x01437917, 0x02590b14, 0x002b6071}}}, + {X: Field{[10]uint32{0x01e2774c, 0x014b7b2e, 0x03e7bde1, 0x012a4e0a, 0x02666d09, 0x03e3c158, 0x01f887ad, 0x0214f93f, 0x010849e1, 0x003989ae}}, Y: Field{[10]uint32{0x034834ea, 0x004ffe43, 0x027c30f5, 0x010b1658, 0x002dca73, 0x033ee1d6, 0x02ab4062, 0x00a89c32, 0x01daa419, 0x002433d5}}}, + {X: Field{[10]uint32{0x00381e67, 0x021ea739, 0x000b61a9, 0x0072f1eb, 0x000d8f57, 0x0291453c, 0x013b8b5b, 0x021e488c, 0x0057ba04, 0x003ee9e8}}, Y: Field{[10]uint32{0x029ec44a, 0x03b9ebb5, 0x000f718c, 0x0243b94c, 0x037cea5b, 0x016295fa, 0x005133f9, 0x014eeafc, 0x03fc1426, 0x001f4abd}}}, + {X: Field{[10]uint32{0x00c35a54, 0x02f9a265, 0x039ea1e3, 0x01691595, 0x03023973, 0x01c0cf99, 0x02e5bdb5, 0x01460568, 0x03955b5d, 0x00051336}}, Y: Field{[10]uint32{0x0253f1e6, 0x021e9dd8, 0x02a83919, 0x023e28ba, 0x03ed0a10, 0x0204d6d2, 0x0150d2b0, 0x03f16600, 0x0389e896, 0x0039805b}}}, + {X: Field{[10]uint32{0x003c0a24, 0x009787c6, 0x01eb681c, 0x023c099e, 0x03ad28cd, 0x02566767, 0x034a2d1a, 0x006d7b35, 0x026ee7ab, 0x00014e37}}, Y: Field{[10]uint32{0x00121004, 0x021012c5, 0x009601de, 0x01cc84f4, 0x012482b9, 0x016ce281, 0x01bac87d, 0x00464d6f, 0x03477961, 0x000db029}}}, + {X: Field{[10]uint32{0x03c03794, 0x001856ba, 0x02f2e9d1, 0x029c152f, 0x007876eb, 0x018edd5f, 0x00a38062, 0x01cfb883, 0x030fd28f, 0x001da453}}, Y: Field{[10]uint32{0x03a12642, 0x00c1a00c, 0x0008ec39, 0x014be7e2, 0x00593307, 0x0189b18b, 0x03557861, 0x0156fc88, 0x01cae168, 0x001b7893}}}, + {X: Field{[10]uint32{0x0234e4a7, 0x00caeaa7, 0x000af27e, 0x02eea960, 0x0186bee7, 0x03244bca, 0x015f7f96, 0x03df6bd6, 0x026cf675, 0x001a6457}}, Y: Field{[10]uint32{0x039513c9, 0x00b3c88a, 0x00d56df7, 0x006ddd9d, 0x03139bc3, 0x0374b68e, 0x0353c918, 0x026155de, 0x03c02f10, 0x0018253e}}}, + {X: Field{[10]uint32{0x00ce3015, 0x02ea11c6, 0x03e5d859, 0x00d790a1, 0x022c37eb, 0x02e4460b, 0x0142dcfd, 0x0353f6fa, 0x020c900b, 0x0013b9b0}}, Y: Field{[10]uint32{0x0062cd64, 0x03543cc8, 0x00f7590e, 0x0319311f, 0x0142e2a9, 0x030a4f4f, 0x0338e668, 0x0186312d, 0x0369863d, 0x00212b25}}}, + {X: Field{[10]uint32{0x00a0fa61, 0x01c5e5a2, 0x02c6ad22, 0x00442be7, 0x01aa5982, 0x01323160, 0x00e11dca, 0x03e28e3b, 0x001af57b, 0x0029a04f}}, Y: Field{[10]uint32{0x038edca4, 0x00ba0256, 0x000e1d18, 0x026f7168, 0x01d415c9, 0x0263ecbc, 0x03e2335e, 0x0258c56d, 0x034df4e2, 0x00190809}}}, + {X: Field{[10]uint32{0x010fce84, 0x03f9aadc, 0x03d6c0fd, 0x01ddbb94, 0x0269d910, 0x01d76d27, 0x01fc7432, 0x00a25c93, 0x03b7107b, 0x00108400}}, Y: Field{[10]uint32{0x02f9427f, 0x023ccf1d, 0x0002ac21, 0x021ceaa0, 0x020a9320, 0x022f3fa9, 0x01cb1498, 0x010e570c, 0x01697b92, 0x0032e555}}}, + {X: Field{[10]uint32{0x00c8c522, 0x002f7192, 0x02df8fc6, 0x02616d51, 0x015e1252, 0x02b3d7c9, 0x009d362e, 0x0313f100, 0x01e10cb8, 0x000272c6}}, Y: Field{[10]uint32{0x03d70d12, 0x03a253b1, 0x036231b7, 0x0382416f, 0x028fd286, 0x035f3fe1, 0x0220e70e, 0x039a2d8f, 0x01d32c6e, 0x00089c05}}}, + {X: Field{[10]uint32{0x03b953c2, 0x00d8d8a2, 0x03704362, 0x012dd78c, 0x03c4a7ac, 0x038b3832, 0x03412d64, 0x01623ce3, 0x01968193, 0x0031d04d}}, Y: Field{[10]uint32{0x0108aa6b, 0x01d7bd2a, 0x008019ae, 0x03c949de, 0x015e1d70, 0x03b05ace, 0x02dd4c90, 0x03135b48, 0x03a01b7c, 0x001efb9f}}}, + {X: Field{[10]uint32{0x01df22cc, 0x00b99d98, 0x02cec9dc, 0x02603a1b, 0x00c2f8e3, 0x02a5f319, 0x03ac1ea8, 0x01249ba3, 0x0205321f, 0x000aa3a2}}, Y: Field{[10]uint32{0x001fae42, 0x007ef6e6, 0x037809c8, 0x001febfd, 0x0364f0c0, 0x0034fe04, 0x0360c21c, 0x0372aab2, 0x01074e4f, 0x0018ee19}}}, + {X: Field{[10]uint32{0x0097a14d, 0x008a4fb5, 0x02127355, 0x031f1bd9, 0x025af1d8, 0x02a38b72, 0x02ab014e, 0x00d65122, 0x02607d40, 0x003cfbcb}}, Y: Field{[10]uint32{0x022cccc9, 0x01f0c758, 0x03ca9c63, 0x012fd0f6, 0x019e9ce4, 0x0275e305, 0x01d1d964, 0x027d12f1, 0x0334214b, 0x0037f354}}}, + {X: Field{[10]uint32{0x0057ead9, 0x0100a012, 0x0365a80e, 0x0092effa, 0x03a93964, 0x02c759c4, 0x0111b361, 0x00ce9744, 0x01c8169c, 0x001b5710}}, Y: Field{[10]uint32{0x005e84c8, 0x031522a9, 0x02a4a6a0, 0x00829486, 0x023d6742, 0x003d66f7, 0x0291d370, 0x02f0a89e, 0x00c49f01, 0x001307dd}}}, + {X: Field{[10]uint32{0x02fff85c, 0x031c7d12, 0x03c73488, 0x00891f81, 0x01608223, 0x013f51e3, 0x01982ce3, 0x021ac0b1, 0x0261c6a9, 0x0017604a}}, Y: Field{[10]uint32{0x03a960b8, 0x036894ff, 0x001fdcc8, 0x005e2fb5, 0x00680b15, 0x03248d21, 0x0349e164, 0x023f1095, 0x037b1601, 0x000dc20f}}}, + {X: Field{[10]uint32{0x0373093e, 0x02aa11df, 0x027d5dc6, 0x029827be, 0x01720177, 0x00a44615, 0x03a97108, 0x03cd1f0e, 0x02ecb82f, 0x00380565}}, Y: Field{[10]uint32{0x005b3bdd, 0x01faceed, 0x0177e554, 0x03061dd9, 0x03a17aca, 0x02963929, 0x00da5d06, 0x0212e74e, 0x00328498, 0x00299d32}}}, + {X: Field{[10]uint32{0x01980f55, 0x01100b02, 0x00d0b834, 0x0183bdac, 0x00ad52b9, 0x0373fdfc, 0x032fcaea, 0x03fcb9ec, 0x01000313, 0x0019e96a}}, Y: Field{[10]uint32{0x000a4a02, 0x01c0f24f, 0x02a03f41, 0x022bae2d, 0x009fdf92, 0x01f10783, 0x00075753, 0x022197ae, 0x01db5e8e, 0x0039dfbf}}}, + {X: Field{[10]uint32{0x0066b277, 0x0035f0d9, 0x01c217df, 0x02cd5ca0, 0x0353d77d, 0x03798960, 0x01c16477, 0x002b60a0, 0x039c2e2d, 0x000ae5a1}}, Y: Field{[10]uint32{0x00b62b25, 0x02f211a0, 0x030743cb, 0x0019e1a9, 0x027e0dae, 0x012a7f9f, 0x032408f6, 0x030caf31, 0x007343ba, 0x0037574d}}}, + {X: Field{[10]uint32{0x010367e9, 0x038b670c, 0x02bad825, 0x012fedc9, 0x03639b05, 0x00f8f848, 0x03137aea, 0x01235cb7, 0x038df087, 0x002ae50d}}, Y: Field{[10]uint32{0x03a10f03, 0x03740610, 0x011c99e3, 0x027fcb7c, 0x017f9d76, 0x01e376bd, 0x0331865c, 0x01f446a0, 0x02244003, 0x0015e173}}}, + {X: Field{[10]uint32{0x03e7439f, 0x02aaec10, 0x00985fa3, 0x036e1ef9, 0x012f3fd4, 0x028edb23, 0x013def6c, 0x03f78e32, 0x01560fd6, 0x001c1e09}}, Y: Field{[10]uint32{0x038ebec7, 0x02cfee05, 0x036af8f9, 0x03603e88, 0x0151894b, 0x03abd4d4, 0x01274b48, 0x01408331, 0x0365ecf1, 0x001e44ef}}}, + {X: Field{[10]uint32{0x03ca3942, 0x028062dd, 0x01eb3e71, 0x0203bf3b, 0x036b4d5e, 0x000928fd, 0x038c72c1, 0x03541ecc, 0x0070138b, 0x000c0974}}, Y: Field{[10]uint32{0x02b470ae, 0x03759a43, 0x03096f83, 0x02558e96, 0x038d5032, 0x00a93b94, 0x00172b5f, 0x03fe56a5, 0x020e175e, 0x000ea29a}}}, + {X: Field{[10]uint32{0x039ab0b6, 0x028f4602, 0x03ac9901, 0x02864e25, 0x02576081, 0x02a34079, 0x0069e7b2, 0x01eaee50, 0x02d065e9, 0x000ff8dc}}, Y: Field{[10]uint32{0x00842e5a, 0x00082895, 0x00c2d4c1, 0x014b3898, 0x00824035, 0x0359ed69, 0x03315e41, 0x037300dd, 0x02923154, 0x000bbf3b}}}, + {X: Field{[10]uint32{0x02f55636, 0x03968c0a, 0x001640bc, 0x03836a04, 0x03c3c373, 0x0301af5f, 0x02be8f9c, 0x00cfba5f, 0x00113a91, 0x000da31c}}, Y: Field{[10]uint32{0x006162a8, 0x03e1ad34, 0x024a135b, 0x03969bea, 0x02eb7d70, 0x0305a5c4, 0x028b942b, 0x02a385bc, 0x00fa4870, 0x00086f50}}}, + {X: Field{[10]uint32{0x00d96810, 0x03ab253b, 0x0100387e, 0x01a3953f, 0x0357682f, 0x02b5b5c4, 0x0040f230, 0x01793879, 0x03d8beb4, 0x001f7e3f}}, Y: Field{[10]uint32{0x002ed0df, 0x01d99f66, 0x013c9ec0, 0x0034281f, 0x03dc5555, 0x0131fff9, 0x0057d789, 0x016a6512, 0x00f9908e, 0x000f6793}}}, + {X: Field{[10]uint32{0x036f23d4, 0x036fdf42, 0x038bbdd2, 0x01c9413e, 0x02882691, 0x026c449d, 0x02162624, 0x031fb9f0, 0x0139eb49, 0x0032dab6}}, Y: Field{[10]uint32{0x0298346d, 0x000063ba, 0x01cb345e, 0x019785e2, 0x005480ca, 0x027e399a, 0x01319c45, 0x01cd9f78, 0x00db18f2, 0x003b2181}}}, + {X: Field{[10]uint32{0x00f4265a, 0x0263ca1c, 0x0053d390, 0x010b9a13, 0x01d8a1e0, 0x02766c81, 0x014e6a75, 0x00679b81, 0x02c80fc3, 0x0016b949}}, Y: Field{[10]uint32{0x010a9a63, 0x022185f5, 0x03850f24, 0x02af678c, 0x00a03f4b, 0x0155df02, 0x033ef80d, 0x016a433f, 0x028114c2, 0x00368784}}}, + {X: Field{[10]uint32{0x01ff7661, 0x021ab9c9, 0x03323a87, 0x019d6e34, 0x02174777, 0x000115b5, 0x03f2b10e, 0x02eb306e, 0x008906dd, 0x0021a35e}}, Y: Field{[10]uint32{0x0322ca1d, 0x030c24eb, 0x00ef296f, 0x0120d0a8, 0x0246e6ce, 0x027051bd, 0x03e57baa, 0x0037e38a, 0x001d189b, 0x00364b5a}}}, + {X: Field{[10]uint32{0x03686b74, 0x00762675, 0x025a4834, 0x02611f0c, 0x0223bd32, 0x01041a8c, 0x01d1f8a7, 0x0206db13, 0x034de7b8, 0x0027cbc2}}, Y: Field{[10]uint32{0x02440088, 0x013f0523, 0x016e3c44, 0x0172d1fc, 0x02deca28, 0x016158bc, 0x0329ca66, 0x012be2d5, 0x0111c297, 0x001beef5}}}, + {X: Field{[10]uint32{0x03fca8a3, 0x0140ddb4, 0x00b4fe69, 0x03afa302, 0x02c522f5, 0x03b8babd, 0x032da983, 0x0037c56f, 0x022b813b, 0x003eabc8}}, Y: Field{[10]uint32{0x000b472e, 0x036d0751, 0x01469b2c, 0x01b175b4, 0x0147f00e, 0x013c4aaf, 0x032ae874, 0x036b1a3e, 0x02692e98, 0x002fb14f}}}, + {X: Field{[10]uint32{0x03161475, 0x01f48a69, 0x00008fd6, 0x020293b1, 0x0313c81c, 0x01b1718b, 0x02a7ab70, 0x02e7e8b0, 0x01b9db4a, 0x001fd482}}, Y: Field{[10]uint32{0x0248d193, 0x033a82d2, 0x00ce4e69, 0x002e6b31, 0x00a58be4, 0x03c64736, 0x017d1c76, 0x01a67fce, 0x00daf9e8, 0x00284f5b}}}, + {X: Field{[10]uint32{0x02c84c2a, 0x012fd3c4, 0x00c04683, 0x02490168, 0x0050c7b4, 0x009c0285, 0x025f395e, 0x00dbc201, 0x016e80b1, 0x003d0d85}}, Y: Field{[10]uint32{0x017e60c4, 0x022546ef, 0x020e5911, 0x002e220a, 0x00e7aa89, 0x026c01fa, 0x020807d3, 0x03806e9d, 0x03b05684, 0x00337655}}}, + {X: Field{[10]uint32{0x00f1d06e, 0x03c70c4f, 0x0169f201, 0x0150ac93, 0x02882167, 0x00d153e9, 0x020c2bb0, 0x00df6081, 0x03495c5b, 0x003be6a9}}, Y: Field{[10]uint32{0x027a4aa9, 0x033d32bc, 0x0366654c, 0x03bf47dd, 0x0050003a, 0x0139b35f, 0x0125750e, 0x012a3eb0, 0x024df1d8, 0x003e1036}}}, + {X: Field{[10]uint32{0x035de05a, 0x00a25bfe, 0x01d40b12, 0x0322965c, 0x016d9e1c, 0x0179e4db, 0x010809c2, 0x02e4eb0a, 0x0043e96e, 0x001f7bb7}}, Y: Field{[10]uint32{0x02a8e0ce, 0x009ad949, 0x03381220, 0x03edaf24, 0x01de6683, 0x033c4bf3, 0x027b349c, 0x03439003, 0x026627b9, 0x00399703}}}, + {X: Field{[10]uint32{0x006d6459, 0x012cf3a6, 0x0215c0e7, 0x03d3ca0f, 0x01878384, 0x020bcd87, 0x03e74955, 0x01e5711e, 0x03156669, 0x001686fb}}, Y: Field{[10]uint32{0x00cf39ff, 0x01e711cb, 0x00d61b11, 0x020777e3, 0x0069b28b, 0x020cf8e0, 0x035b97e1, 0x000aca78, 0x02811fdb, 0x0033a616}}}, + {X: Field{[10]uint32{0x0125fa8e, 0x014d5639, 0x0383bfa4, 0x033e12c8, 0x0173b8fd, 0x020f1beb, 0x00eeb789, 0x004f0ac5, 0x01392334, 0x0036048f}}, Y: Field{[10]uint32{0x0233ef73, 0x009a51e9, 0x00095ea2, 0x028c3256, 0x02835e35, 0x02ecf2d5, 0x03f78a5a, 0x01c8011b, 0x019d905b, 0x003aa74e}}}, + {X: Field{[10]uint32{0x024d4bc8, 0x00c4cd03, 0x035d8939, 0x03469e9a, 0x0310d3df, 0x0026bed7, 0x02a36c39, 0x030c4099, 0x01d4f1f4, 0x0018bd0f}}, Y: Field{[10]uint32{0x0190f3ed, 0x028772ed, 0x028ef89f, 0x00a76a8b, 0x02755258, 0x00e8407c, 0x034fe225, 0x03591cb8, 0x01f1f83b, 0x002edd62}}}, + {X: Field{[10]uint32{0x039d72f7, 0x033cc4bd, 0x01f4fcc1, 0x0111bd8b, 0x00865f6e, 0x033d6535, 0x015aa750, 0x03011450, 0x0371d549, 0x00001b3c}}, Y: Field{[10]uint32{0x01e93af4, 0x006b7172, 0x0216a758, 0x02741a33, 0x002b3dee, 0x020ad168, 0x024ce206, 0x026f4a0a, 0x022b5c97, 0x003e33ad}}}, + {X: Field{[10]uint32{0x03cdd7e7, 0x03bf16d1, 0x01f3c509, 0x01c545af, 0x0249aeb3, 0x03e55021, 0x01638dd8, 0x03a70df0, 0x0380770b, 0x0016f5ed}}, Y: Field{[10]uint32{0x006ba9ff, 0x0242664a, 0x031e3021, 0x000ca8a2, 0x01efc12c, 0x02b74309, 0x006b91c5, 0x02abd3d8, 0x00488a87, 0x00351b1e}}}, + {X: Field{[10]uint32{0x036b6a62, 0x02fcf6f0, 0x001af0e6, 0x01ffc55a, 0x0081eecd, 0x02e566e8, 0x02086653, 0x02f52b96, 0x0154a319, 0x0031dc12}}, Y: Field{[10]uint32{0x016d0fe7, 0x00ecf294, 0x0337836e, 0x0002c571, 0x03e508f6, 0x02273312, 0x013b9c61, 0x012ea0fd, 0x03e82478, 0x000dcd50}}}, + {X: Field{[10]uint32{0x01b19cda, 0x0371b40e, 0x039588fe, 0x02342790, 0x02d6e92c, 0x0040b07b, 0x007da707, 0x00ea7760, 0x03fe4153, 0x000ad3c9}}, Y: Field{[10]uint32{0x001fb424, 0x038ab67e, 0x01d6b089, 0x02009005, 0x0049ba21, 0x024bd30c, 0x01fadd4a, 0x01f2c704, 0x03100ecd, 0x00262ea0}}}, + {X: Field{[10]uint32{0x014c0e5a, 0x001b2297, 0x03db54d3, 0x0204f5f0, 0x032c920c, 0x01a4c7e5, 0x000c581d, 0x030d3498, 0x01710b3d, 0x00039f50}}, Y: Field{[10]uint32{0x029a409a, 0x00513c92, 0x011f75b6, 0x01c74735, 0x0303e75b, 0x0169b128, 0x03a97efb, 0x014e1e67, 0x01ba9a82, 0x002ca560}}}, + {X: Field{[10]uint32{0x01c5d52e, 0x0198357c, 0x0284b2b5, 0x0187a01b, 0x032face7, 0x01a89c5f, 0x02700435, 0x00d5dc14, 0x022c18f4, 0x001880c0}}, Y: Field{[10]uint32{0x036a720d, 0x02021944, 0x024eb06c, 0x035aaa21, 0x020212ef, 0x0150ae5f, 0x035fe973, 0x0135d409, 0x03255d0a, 0x0006294b}}}, + {X: Field{[10]uint32{0x02e43b2b, 0x00700124, 0x026300e8, 0x01e5e479, 0x02489876, 0x02c3f332, 0x02327fe3, 0x02036e83, 0x03a28c1c, 0x002f6071}}, Y: Field{[10]uint32{0x003871c0, 0x0388d1e0, 0x00678db1, 0x02b3a4ea, 0x02416064, 0x03c6154d, 0x00831f07, 0x02f19278, 0x004ea14b, 0x0032942a}}}, + {X: Field{[10]uint32{0x004bc29a, 0x01aa6d3f, 0x0154a062, 0x0139bce9, 0x01b875eb, 0x000e9b83, 0x01385cd6, 0x00e43f34, 0x021ad3c1, 0x0026f10f}}, Y: Field{[10]uint32{0x00cb2cd4, 0x00b9a9b8, 0x0222e6b1, 0x02f763d2, 0x0264ea39, 0x01e5c5ec, 0x00d8b34b, 0x012ed5eb, 0x00bf9aa5, 0x00215e96}}}, + {X: Field{[10]uint32{0x03e40f33, 0x01da7329, 0x039082c8, 0x01c7195b, 0x015e5bfb, 0x0262fea8, 0x030117cb, 0x038f1e7b, 0x028d194d, 0x000c1569}}, Y: Field{[10]uint32{0x000d1d10, 0x008cf90d, 0x0086c1c9, 0x01ca9ff8, 0x00acbd8c, 0x01aae9af, 0x00218cfb, 0x038712fc, 0x01eadfeb, 0x000060fe}}}, + {X: Field{[10]uint32{0x034b08ac, 0x01e7eedc, 0x03e1b710, 0x00c5f62e, 0x002cec12, 0x00d60ee0, 0x02710724, 0x03462324, 0x0184ad1f, 0x0012b6fe}}, Y: Field{[10]uint32{0x03ec04e6, 0x013578f5, 0x01954709, 0x02dbde7d, 0x032192ce, 0x038fcb42, 0x01507668, 0x033bfcf6, 0x01889560, 0x0005149c}}}, + {X: Field{[10]uint32{0x016487cc, 0x01947469, 0x00b0cd00, 0x00daa81d, 0x0283fc6a, 0x033c5b48, 0x03ae3979, 0x0107671e, 0x01cc27e0, 0x000e3dcb}}, Y: Field{[10]uint32{0x033dc0bf, 0x01830ea4, 0x0188df71, 0x0110b946, 0x02496104, 0x002dbff1, 0x030d6f2c, 0x001b904d, 0x017c33a1, 0x00148e32}}}, + {X: Field{[10]uint32{0x015be2d3, 0x00623199, 0x03813322, 0x011d1f09, 0x02045606, 0x03167fca, 0x0013828a, 0x03f78285, 0x018a7bdf, 0x0037956f}}, Y: Field{[10]uint32{0x0042d9da, 0x034eed40, 0x0151ce65, 0x0146e65b, 0x0367bf9d, 0x01ec2bed, 0x039d0979, 0x0097cdd7, 0x01b0df5b, 0x0011de18}}}, + {X: Field{[10]uint32{0x023bcc66, 0x026e2797, 0x03893873, 0x03a9b159, 0x02e19340, 0x019bfa44, 0x00edf986, 0x000ae246, 0x00fdc47e, 0x003185ef}}, Y: Field{[10]uint32{0x01117072, 0x0098d259, 0x00d473b8, 0x01cad6c2, 0x01a6e046, 0x01133f12, 0x020f4e86, 0x01da0cab, 0x0117357e, 0x002e42e8}}}, + {X: Field{[10]uint32{0x01c84758, 0x02aceefc, 0x036724ad, 0x036fb2b6, 0x03c455f4, 0x024acc0c, 0x02402f1e, 0x0223252d, 0x01961b51, 0x00119570}}, Y: Field{[10]uint32{0x02fbc4a0, 0x0071b779, 0x01b5cf2c, 0x0300a0e2, 0x02714600, 0x012f017a, 0x0202df4f, 0x017d37ec, 0x0093a257, 0x000f3bb3}}}, + {X: Field{[10]uint32{0x03726a45, 0x021ba375, 0x004c9e5f, 0x00c67077, 0x00110df4, 0x02ad0f68, 0x013c503f, 0x0396b4da, 0x0340dc05, 0x003f2a43}}, Y: Field{[10]uint32{0x035771ca, 0x0321bf17, 0x021c3e6c, 0x03b1a323, 0x027478ed, 0x0269c29b, 0x0337aeb1, 0x0198106b, 0x039bbe3e, 0x003d608b}}}, + {X: Field{[10]uint32{0x027f61e9, 0x03c546f4, 0x00afb93f, 0x0015e31f, 0x02a31cbe, 0x02434ecf, 0x01e88d7f, 0x020961de, 0x004adcb2, 0x000c5db3}}, Y: Field{[10]uint32{0x02cc0135, 0x00308c50, 0x006aac34, 0x01115b34, 0x036a18ce, 0x03ed6ad6, 0x00fe7bba, 0x00290f25, 0x02cc148a, 0x000e18fc}}}, + {X: Field{[10]uint32{0x03b2ddc4, 0x0079943a, 0x014e0b81, 0x02734c69, 0x0151d9c1, 0x013e0b31, 0x030db151, 0x00842b41, 0x0373d124, 0x0018c9a7}}, Y: Field{[10]uint32{0x005cd0ac, 0x003c36f6, 0x02188e30, 0x02f0fdaa, 0x03038246, 0x002230e1, 0x034114e5, 0x01e90929, 0x03dd8a78, 0x002fe3b1}}}, + {X: Field{[10]uint32{0x032003d0, 0x00f39518, 0x02708dee, 0x0124d374, 0x000f07e7, 0x0104c9aa, 0x027f5445, 0x014ed86b, 0x01328d0f, 0x0019e687}}, Y: Field{[10]uint32{0x025c350f, 0x0240629c, 0x0085c034, 0x0157268d, 0x02c9b3eb, 0x03dbba69, 0x03e341d5, 0x03b28c46, 0x03488f21, 0x0020f284}}}, + {X: Field{[10]uint32{0x00b38b28, 0x033ce678, 0x036fb846, 0x0277a009, 0x03f7172f, 0x0153624c, 0x0148568a, 0x00b2134e, 0x01792998, 0x001a689f}}, Y: Field{[10]uint32{0x03b26168, 0x0058f90e, 0x034f3a02, 0x03d6b0b6, 0x0369c8b7, 0x00bce6f5, 0x00b16a12, 0x002ee15d, 0x0207cb0f, 0x003d0474}}}, + {X: Field{[10]uint32{0x0373ee4d, 0x015b23d9, 0x03c7f9dd, 0x02e72bfa, 0x02abfdab, 0x000a73bc, 0x03f21716, 0x01410b2f, 0x005701af, 0x000a6354}}, Y: Field{[10]uint32{0x0297e9e1, 0x00f0156a, 0x0222075e, 0x029e733e, 0x034271bd, 0x03db70db, 0x02e62c4b, 0x02113904, 0x0271d271, 0x003d0d0f}}}, + {X: Field{[10]uint32{0x000c4653, 0x022e5e48, 0x023b1f8f, 0x0391513d, 0x00e26f66, 0x02f3ce4c, 0x00eb9845, 0x03c4063e, 0x03da46d1, 0x000fca60}}, Y: Field{[10]uint32{0x01d71db0, 0x03166542, 0x01b53b26, 0x02f1e760, 0x009b2c38, 0x00c9b4e0, 0x02d57e6b, 0x00cec40d, 0x0114c4ad, 0x00125cea}}}, + {X: Field{[10]uint32{0x023538dd, 0x02aa2fdf, 0x03b1359f, 0x0287bda8, 0x0154412e, 0x0074a9be, 0x02d64b2a, 0x02e23650, 0x013e30ce, 0x003e0dbf}}, Y: Field{[10]uint32{0x037f9367, 0x0380a0b3, 0x02ba3b28, 0x038c1b9a, 0x00c8161e, 0x0162ddc8, 0x01fd29c1, 0x01ad69c2, 0x00815347, 0x001c828c}}}, + {X: Field{[10]uint32{0x00ef583a, 0x038b7c80, 0x03930b3a, 0x008807bb, 0x01295ed5, 0x03a647fa, 0x03c8ee4f, 0x00e2898e, 0x039b911e, 0x00375cba}}, Y: Field{[10]uint32{0x00c1b2ef, 0x02d03250, 0x00b8683c, 0x02c50fc4, 0x02398e86, 0x0182d4ec, 0x0285d9b3, 0x03dfe5e4, 0x01a5688b, 0x000a8369}}}, + {X: Field{[10]uint32{0x0168a619, 0x00fc0cd2, 0x019be028, 0x02912584, 0x037cef92, 0x00962dfc, 0x027bd818, 0x00957310, 0x025046ab, 0x00154789}}, Y: Field{[10]uint32{0x03bc4f30, 0x01e8dc39, 0x0223b200, 0x02a8f1ba, 0x02e5ca16, 0x00560a9b, 0x006a5ecd, 0x03cd6e6e, 0x03d24cd8, 0x000c5f0c}}}, + {X: Field{[10]uint32{0x0336c650, 0x00eb5e14, 0x02a90fbd, 0x01857214, 0x01ab28cb, 0x01e09564, 0x0319a304, 0x038f43b2, 0x0292131d, 0x0019a0f7}}, Y: Field{[10]uint32{0x002225f8, 0x01b4224a, 0x019e4d63, 0x03082397, 0x00b3c3b2, 0x011be839, 0x029556ec, 0x01548fe2, 0x018e7fd9, 0x00127ba9}}}, + {X: Field{[10]uint32{0x00f97805, 0x0127224f, 0x03ac7bea, 0x00f4c692, 0x01ca99ef, 0x023e257a, 0x029b146e, 0x03a99782, 0x01e284a6, 0x002d6cec}}, Y: Field{[10]uint32{0x01b6fe0d, 0x013ba239, 0x01667ffa, 0x030d51fa, 0x023cf16c, 0x0065402f, 0x0391437e, 0x038a5bca, 0x0294f333, 0x00285c82}}}, + {X: Field{[10]uint32{0x03cbf466, 0x009007e6, 0x00d1011a, 0x00e954d4, 0x03ccdde4, 0x01c63518, 0x009a2329, 0x01da125c, 0x03737c33, 0x00294065}}, Y: Field{[10]uint32{0x01d429e2, 0x03eb61ea, 0x0027e12e, 0x0233efcf, 0x03c51fff, 0x01add47a, 0x03a5e09b, 0x031777a3, 0x029effef, 0x00027301}}}, + {X: Field{[10]uint32{0x001588fb, 0x00dad8fb, 0x03849e12, 0x0092238b, 0x02e5cb72, 0x02c7162c, 0x0041b663, 0x0361850a, 0x018feb2b, 0x0027b0d2}}, Y: Field{[10]uint32{0x001f5f12, 0x00194bc3, 0x0333ba00, 0x0216a01c, 0x01e517e5, 0x005437fb, 0x02719bf2, 0x025fc0d8, 0x01a5e14b, 0x00380324}}}, + {X: Field{[10]uint32{0x03c5b6b2, 0x00c6afbc, 0x004b1f47, 0x02f16abc, 0x03581f97, 0x02e49999, 0x00b446ba, 0x00c615d4, 0x00b4adc1, 0x003842db}}, Y: Field{[10]uint32{0x01e2b9c3, 0x017f720d, 0x00ed3c1f, 0x010bc998, 0x01d5520b, 0x02d97007, 0x0287bba5, 0x0011dfce, 0x02137db2, 0x0014e944}}}, + {X: Field{[10]uint32{0x013ae314, 0x01873877, 0x00d0d3ff, 0x009c4ec6, 0x0360ace9, 0x000ad810, 0x0093691e, 0x029f1e63, 0x0167e36e, 0x002dd52a}}, Y: Field{[10]uint32{0x0073d849, 0x02e0a855, 0x0359be12, 0x00a64cf3, 0x00d83ee0, 0x02ac0794, 0x02f8d5fb, 0x03b96690, 0x01639aa7, 0x0022a68e}}}, + {X: Field{[10]uint32{0x02efa869, 0x0060ffcc, 0x02c8d489, 0x01d58d02, 0x017999a2, 0x02fa95a7, 0x038a51e6, 0x02fcf81b, 0x0361c10c, 0x0017fbf2}}, Y: Field{[10]uint32{0x02881e83, 0x02f86fd3, 0x0120715b, 0x01426cd2, 0x01dfe499, 0x02308150, 0x008c0932, 0x020d7076, 0x0093cbc4, 0x003606cc}}}, + {X: Field{[10]uint32{0x03d2d848, 0x02910bc9, 0x0118470a, 0x002aca6e, 0x01f0ed6f, 0x009f2265, 0x0009400b, 0x025f8658, 0x03bb04ac, 0x003f9468}}, Y: Field{[10]uint32{0x01116a58, 0x03f55a32, 0x00bd6ec5, 0x013c020f, 0x03d30625, 0x027c2c60, 0x02b8aaf5, 0x0279103c, 0x00e0a4c3, 0x00215a3f}}}, + {X: Field{[10]uint32{0x02b7dee3, 0x024519be, 0x0158d7b5, 0x0263911d, 0x00391df7, 0x03aca908, 0x00d5d38a, 0x03fb6f16, 0x02299fcc, 0x001a8f91}}, Y: Field{[10]uint32{0x02a5e548, 0x00fba6c8, 0x01a91aec, 0x02e78c58, 0x0289873e, 0x02ac7679, 0x02e7b5a3, 0x01767750, 0x03ba7bb1, 0x0006fb63}}}, + {X: Field{[10]uint32{0x03450c37, 0x01fff225, 0x012ee745, 0x0134e492, 0x0233db30, 0x0385af4c, 0x0162d970, 0x03537bdf, 0x00b83c40, 0x002b7f6f}}, Y: Field{[10]uint32{0x00138e0e, 0x0216e1fd, 0x001956be, 0x0064b873, 0x038fde78, 0x0055ab08, 0x00b588c4, 0x0127b0aa, 0x03dc1635, 0x001ec20a}}}, + {X: Field{[10]uint32{0x0113bf61, 0x030f7540, 0x02cb9f06, 0x0371bb31, 0x01509ed7, 0x00b45c04, 0x0254c270, 0x00b1520d, 0x03cc9c20, 0x0025a143}}, Y: Field{[10]uint32{0x0281aaf7, 0x022e2c34, 0x03b6c008, 0x01568070, 0x01b9fcc4, 0x01fb062d, 0x00c05dac, 0x01b126bc, 0x00327f96, 0x00041011}}}, + {X: Field{[10]uint32{0x00458bbe, 0x01026d57, 0x03ac4f09, 0x005059bc, 0x031703f5, 0x0010de69, 0x00151ca8, 0x03285362, 0x01978f78, 0x000ab884}}, Y: Field{[10]uint32{0x01ecf7b1, 0x03277106, 0x012c86cb, 0x009fe80c, 0x022328e3, 0x021e5873, 0x01c7dde3, 0x00d7f514, 0x00d95760, 0x001379d3}}}, + {X: Field{[10]uint32{0x02987e57, 0x03ab1846, 0x006cfb79, 0x038f149d, 0x027e5816, 0x0358b109, 0x021a332c, 0x03265899, 0x0342e1b5, 0x003b7061}}, Y: Field{[10]uint32{0x01b4fe5e, 0x00868d01, 0x01bc02c0, 0x00c8c0c4, 0x0129ba90, 0x02eaf95e, 0x01d484fe, 0x0026fcfe, 0x033fc633, 0x0020000e}}}, + {X: Field{[10]uint32{0x0243a244, 0x0299033f, 0x025aa1d6, 0x012610dd, 0x0038b35d, 0x022e50da, 0x0290885c, 0x03c2b8a6, 0x022a5fa0, 0x001e00aa}}, Y: Field{[10]uint32{0x0192a803, 0x03dc59e4, 0x025dd7f5, 0x004616ea, 0x037e3dda, 0x005b126e, 0x03297e04, 0x00e6a101, 0x029fe632, 0x00031fcc}}}, + {X: Field{[10]uint32{0x012335cf, 0x01efdfe6, 0x02386bf6, 0x03a0d79c, 0x02c2173d, 0x038ff16a, 0x02ede712, 0x011d6b0d, 0x0179b124, 0x003eddd1}}, Y: Field{[10]uint32{0x03a82c94, 0x032f3011, 0x02c01cdf, 0x029add8e, 0x01b6f413, 0x006a3590, 0x03ebf0e3, 0x01edeb90, 0x035163c1, 0x0030399a}}}, + {X: Field{[10]uint32{0x00bc2852, 0x03886cff, 0x02982051, 0x00928c6d, 0x00695a9c, 0x03a70480, 0x0394881f, 0x02ba78cb, 0x018a43ab, 0x0036068f}}, Y: Field{[10]uint32{0x0112673f, 0x03dafcb7, 0x00dbf2cc, 0x028f2419, 0x01a693e3, 0x002a636d, 0x0351de7e, 0x032db5ef, 0x0011e8a8, 0x0018c376}}}, + {X: Field{[10]uint32{0x03324cf0, 0x01ddadf1, 0x0249f9bf, 0x02812f94, 0x027cb2ed, 0x0089a336, 0x00da0c7e, 0x001a2e01, 0x03d497cf, 0x001467f3}}, Y: Field{[10]uint32{0x0162fdb9, 0x039bff25, 0x0391dc20, 0x03b0ef28, 0x03a357c8, 0x03912ae7, 0x02916466, 0x02cfaef9, 0x00cd198a, 0x002fb1bd}}}, + {X: Field{[10]uint32{0x028ef592, 0x024a5be1, 0x0044124f, 0x021389dc, 0x023e31b2, 0x003e6c70, 0x0193853e, 0x0181cd78, 0x03e48fd6, 0x003312b4}}, Y: Field{[10]uint32{0x0383c27b, 0x0098eb75, 0x02f68996, 0x007b6c96, 0x019b1215, 0x01ec0f1d, 0x01520ac6, 0x0311d1f5, 0x018d8583, 0x00222bc5}}}, + {X: Field{[10]uint32{0x00d24117, 0x00240d1e, 0x01e338f7, 0x02852e17, 0x02c06a57, 0x0137b5ba, 0x0340cf96, 0x021a9662, 0x00ae6f51, 0x002b7654}}, Y: Field{[10]uint32{0x03affa7d, 0x01effd28, 0x0165bc04, 0x03f1c013, 0x00111f6d, 0x002fb1d1, 0x03d6853a, 0x00a1737a, 0x00bd2d69, 0x00316729}}}, + {X: Field{[10]uint32{0x02b383e4, 0x030fdb6e, 0x027ddd0b, 0x0319f124, 0x03ef0437, 0x032cd62b, 0x03c81730, 0x01f79c4a, 0x03454309, 0x003701c6}}, Y: Field{[10]uint32{0x015ca8ed, 0x0042d03a, 0x0385f9e4, 0x0283ec46, 0x03f28fca, 0x0061f7ef, 0x03b2adfc, 0x00c1305c, 0x02a9899b, 0x001e4e44}}}, + {X: Field{[10]uint32{0x02c167c7, 0x01e6c6ab, 0x03abe94d, 0x01c91fda, 0x02fd97a6, 0x025ade9c, 0x0037da4a, 0x002676a7, 0x037e6db6, 0x0017738c}}, Y: Field{[10]uint32{0x024377f6, 0x0276f593, 0x021d5754, 0x015993ac, 0x00eb35bf, 0x005ae8a8, 0x0082991f, 0x02290ed9, 0x03ba1f09, 0x0006e21f}}}, + {X: Field{[10]uint32{0x01f5cfcb, 0x02133e78, 0x009e5ba2, 0x03d0f984, 0x02900a83, 0x03a02260, 0x022ead80, 0x029989b4, 0x02ad8493, 0x00145bad}}, Y: Field{[10]uint32{0x00e05042, 0x00c3fbfb, 0x03e3c68d, 0x0046ecdb, 0x03ef6a85, 0x0074fe51, 0x018308c6, 0x02d1bd23, 0x02b38085, 0x00328d42}}}, + {X: Field{[10]uint32{0x000e5e75, 0x03c71f3c, 0x020a335a, 0x02e02321, 0x03732b3f, 0x03a45f21, 0x03912114, 0x00b68796, 0x01503b1f, 0x003dd9f0}}, Y: Field{[10]uint32{0x01aaab54, 0x02d1cf68, 0x0165795b, 0x003854f3, 0x0109ec61, 0x015776ad, 0x00f64a26, 0x0119ee22, 0x00c8cdbe, 0x000fb3be}}}, + {X: Field{[10]uint32{0x03c977f0, 0x00eb099c, 0x01e7531f, 0x00b0b319, 0x02418558, 0x005df79e, 0x03bc5d8f, 0x00b2329e, 0x03cf0f79, 0x003e6efa}}, Y: Field{[10]uint32{0x01614a85, 0x026595d2, 0x02f52b8c, 0x02aab3b2, 0x03ac751e, 0x02867957, 0x02f767b8, 0x00e89895, 0x00fefecb, 0x000a42ad}}}, + {X: Field{[10]uint32{0x0147c45f, 0x01dff3d3, 0x00e8eaf4, 0x02f326c2, 0x016ec3ad, 0x0048f7d8, 0x01bff42c, 0x0236c7d5, 0x01febe5c, 0x0031aff8}}, Y: Field{[10]uint32{0x0241792f, 0x02b55b35, 0x02995c79, 0x0004d1fa, 0x0041c271, 0x0159e624, 0x032eddc9, 0x028bff60, 0x0082d6d6, 0x0031657e}}}, + {X: Field{[10]uint32{0x00d3ce1e, 0x020a7978, 0x02425761, 0x00862e1c, 0x03c55595, 0x005c2ed1, 0x01cfe6e5, 0x02d321c7, 0x0371808f, 0x0015b0b5}}, Y: Field{[10]uint32{0x000468ba, 0x003f27d5, 0x0229f5ee, 0x02bdc58d, 0x0112ec15, 0x039c8718, 0x00a91889, 0x03989bf7, 0x02e69e03, 0x001b79ca}}}, + {X: Field{[10]uint32{0x0109d663, 0x028d99d4, 0x00fb5066, 0x03fbf181, 0x02da9ecf, 0x03033df4, 0x0296d8c3, 0x016f961e, 0x0305ec9f, 0x00080862}}, Y: Field{[10]uint32{0x038f6993, 0x00a0eefb, 0x02e12e79, 0x00ea22d0, 0x02b41bfa, 0x029cc86b, 0x02ea0aa7, 0x01f8907c, 0x03c2c535, 0x000bb069}}}, + {X: Field{[10]uint32{0x036be4ee, 0x03f2bfe5, 0x00f09e2a, 0x03d2ece9, 0x03519035, 0x01252bfc, 0x03db4f33, 0x0333656f, 0x02690a04, 0x000e8224}}, Y: Field{[10]uint32{0x0042d1a2, 0x006b615a, 0x02757ed9, 0x00899036, 0x020bbeba, 0x00d012cc, 0x0293757b, 0x0287fa45, 0x0225fb0b, 0x00395a03}}}, + {X: Field{[10]uint32{0x005b3f07, 0x01948ebd, 0x01a2e285, 0x0006ca5d, 0x02dfd3e1, 0x02618125, 0x00fd0f25, 0x022d4f6c, 0x0296a0cd, 0x0023e7c8}}, Y: Field{[10]uint32{0x01c625b5, 0x02d5c8ad, 0x01920a3f, 0x00295de1, 0x038ab3be, 0x018a435d, 0x029015cd, 0x037cc6c8, 0x01072cac, 0x00187056}}}, + {X: Field{[10]uint32{0x0288070e, 0x03d1d33f, 0x0106c836, 0x024347a8, 0x00097e2b, 0x0352d8ca, 0x01599b26, 0x036a5f34, 0x03e8695b, 0x00219602}}, Y: Field{[10]uint32{0x017d7d21, 0x03146aec, 0x00ac6166, 0x02a276e9, 0x022bb220, 0x001f71fb, 0x022fe5fd, 0x02b160e2, 0x00a17e19, 0x002aeb9a}}}, + {X: Field{[10]uint32{0x02b4d762, 0x00b74a5c, 0x03d048c7, 0x0163ec61, 0x01eb1f94, 0x015ea879, 0x005b4f0e, 0x035627b3, 0x038a1e69, 0x003edab0}}, Y: Field{[10]uint32{0x02ac32c1, 0x0004c061, 0x000147fb, 0x01bc2e58, 0x03e5d180, 0x02e0ad72, 0x031d3af2, 0x01c7cc5b, 0x0116bec2, 0x00358077}}}, + {X: Field{[10]uint32{0x02a5f0b0, 0x02e36f9f, 0x027b4242, 0x00c6d9b8, 0x02c5bb7d, 0x00aec273, 0x03aec947, 0x03aa06fc, 0x006bc54f, 0x001f0418}}, Y: Field{[10]uint32{0x01f68f54, 0x035df6ef, 0x010abd14, 0x00a8f809, 0x0202ea52, 0x0102d116, 0x01839872, 0x01590dd9, 0x0180d3d6, 0x00048854}}}, + {X: Field{[10]uint32{0x0152a1a6, 0x00ac05cb, 0x02495204, 0x0398ee11, 0x02740a5b, 0x0367ce12, 0x007822b1, 0x024ef1d3, 0x03948335, 0x002179aa}}, Y: Field{[10]uint32{0x01fae93a, 0x0397af80, 0x030f981f, 0x033371d7, 0x02d6e69f, 0x0334a38f, 0x02512138, 0x03e1aa3d, 0x00d068d6, 0x003d7058}}}, + {X: Field{[10]uint32{0x0351cfe5, 0x0044eb7f, 0x00a27f02, 0x03b2e203, 0x005e626a, 0x0151c7d4, 0x0374ea0e, 0x006e8146, 0x013a99cd, 0x001f878b}}, Y: Field{[10]uint32{0x01ad89bc, 0x012c0267, 0x0299781f, 0x033b0018, 0x02c1eb96, 0x00dbc6b7, 0x02322291, 0x03f8de30, 0x002ee9d4, 0x00104fb2}}}, + {X: Field{[10]uint32{0x007aaacd, 0x03af407a, 0x02bd2928, 0x02b1ca70, 0x016a9490, 0x024c7187, 0x03a08dd6, 0x00d7cbb5, 0x00ad8137, 0x00162590}}, Y: Field{[10]uint32{0x00485429, 0x0009c648, 0x02e15c1a, 0x026f8d0f, 0x017a1e90, 0x025b1335, 0x039fc330, 0x03ed2cd9, 0x010b8a89, 0x002275ac}}}, + {X: Field{[10]uint32{0x026e6608, 0x02b41017, 0x00c5d7b7, 0x03511046, 0x0191fdd7, 0x01d07067, 0x00db0ef3, 0x0173a3f7, 0x034ff346, 0x001c2033}}, Y: Field{[10]uint32{0x022441fe, 0x02b627e3, 0x03d347df, 0x0274d050, 0x00303348, 0x02036c76, 0x006d334f, 0x002e82d7, 0x01a95cbc, 0x001e8fc3}}}, + {X: Field{[10]uint32{0x02917c55, 0x026a1d89, 0x0261c7d5, 0x000d954f, 0x01091deb, 0x01dcdf0c, 0x0196bd4d, 0x0009a4b7, 0x034c2d40, 0x002ed982}}, Y: Field{[10]uint32{0x00983c24, 0x028fd030, 0x002faf5e, 0x00446370, 0x03f150af, 0x017a2e1b, 0x00684031, 0x00125c18, 0x0113a756, 0x002d252b}}}, + {X: Field{[10]uint32{0x03221b27, 0x03141b67, 0x02e0c1e2, 0x02c23376, 0x013f4f4f, 0x03629719, 0x008161c5, 0x0056c910, 0x01ec7ebf, 0x001ce890}}, Y: Field{[10]uint32{0x0063640a, 0x02f05d75, 0x0332b5e1, 0x024a8bdb, 0x0364bbe1, 0x03520363, 0x00865041, 0x0295bde1, 0x03b433a0, 0x002014d2}}}, + {X: Field{[10]uint32{0x00b1fe07, 0x0056aa9e, 0x03a6f89a, 0x000b0f5e, 0x039e45f2, 0x028ad62f, 0x005741e6, 0x03f6f1dc, 0x0351f08b, 0x003f707b}}, Y: Field{[10]uint32{0x016c0586, 0x039683a6, 0x00e36880, 0x0051d57d, 0x001684f7, 0x0160c950, 0x03ac05b5, 0x0121e191, 0x00dcdc1e, 0x001fa740}}}, + {X: Field{[10]uint32{0x033618af, 0x01ccf4e8, 0x007bc6d6, 0x00ea449a, 0x03a15ab1, 0x02838cf7, 0x0344736e, 0x017304ea, 0x02cba0ce, 0x00081210}}, Y: Field{[10]uint32{0x016bd521, 0x03e4ab32, 0x03a35896, 0x03708516, 0x029e1804, 0x0062a53c, 0x01187418, 0x02472feb, 0x0205a6e9, 0x002bf248}}}, + {X: Field{[10]uint32{0x017ed768, 0x02f2d805, 0x0193e0b2, 0x02660eeb, 0x01a47c4a, 0x00121a1a, 0x00095675, 0x00c54604, 0x001ef82c, 0x00280ea7}}, Y: Field{[10]uint32{0x02090a65, 0x033c67fd, 0x0263ca26, 0x028b7361, 0x0302158b, 0x02690ee2, 0x033e5eed, 0x01a603bb, 0x0164fb9c, 0x001e1be4}}}, + {X: Field{[10]uint32{0x03c00ed2, 0x026c56f6, 0x025baee1, 0x010b1515, 0x01fa18bd, 0x036a04f3, 0x015e3ff7, 0x005e118d, 0x025f6cb4, 0x00178edb}}, Y: Field{[10]uint32{0x02ee603f, 0x0000db10, 0x02cfde34, 0x022b1722, 0x019d6f35, 0x0234f936, 0x03b8f9f8, 0x008a13f0, 0x015342bf, 0x002e70e9}}}, + {X: Field{[10]uint32{0x005dbc70, 0x010e1728, 0x0254b015, 0x01d840a6, 0x00abf764, 0x03ec9d1b, 0x03dfbd6e, 0x004a0198, 0x020e082d, 0x00066c25}}, Y: Field{[10]uint32{0x01504773, 0x01993d39, 0x02f312d2, 0x03b64845, 0x0133df5d, 0x00d74107, 0x03356451, 0x004aa517, 0x03bc4401, 0x003e2ca2}}}, + {X: Field{[10]uint32{0x03f3677e, 0x01d98e37, 0x00d05098, 0x0076dafa, 0x006f1c2d, 0x028688b3, 0x039b274b, 0x02ebf9d2, 0x01007597, 0x0004187a}}, Y: Field{[10]uint32{0x01444b21, 0x0171e048, 0x00fa9815, 0x03c533d3, 0x01fe2fff, 0x03894629, 0x017b59eb, 0x024bb113, 0x0122dec5, 0x001c1eb2}}}, + {X: Field{[10]uint32{0x03030b85, 0x01c73c7c, 0x01f5709a, 0x0078ec55, 0x01cc0e22, 0x02683940, 0x039b5676, 0x01f61d50, 0x001160fc, 0x00324613}}, Y: Field{[10]uint32{0x00327805, 0x00fa608a, 0x02e308c4, 0x02527ec7, 0x018e83e5, 0x017c8e26, 0x01d30f87, 0x01a27f5b, 0x01e37c04, 0x002202da}}}, + {X: Field{[10]uint32{0x0374cf04, 0x01567fd0, 0x02f12d37, 0x0190988a, 0x01c8fa23, 0x01b09ae9, 0x005af94e, 0x014b363f, 0x03044dec, 0x0028d7ec}}, Y: Field{[10]uint32{0x012242fd, 0x035d5704, 0x0284042d, 0x01c614c9, 0x038b3604, 0x00d08b73, 0x03adcb9a, 0x00d612b1, 0x0375692a, 0x0005513c}}}, + {X: Field{[10]uint32{0x010929ca, 0x0012f46e, 0x00a8c1b2, 0x0069e000, 0x021b2c50, 0x02c4c3da, 0x00efbe8e, 0x03afa046, 0x03ad60ff, 0x002ea300}}, Y: Field{[10]uint32{0x03aaafbe, 0x00da71b8, 0x03722f11, 0x011eb84d, 0x0365b88d, 0x03de002a, 0x03732112, 0x010783eb, 0x0329a3f3, 0x003a57bd}}}, + {X: Field{[10]uint32{0x0330ddb9, 0x0346d4a3, 0x03ba3361, 0x017d7992, 0x02fe0849, 0x01268042, 0x03ba189f, 0x0229de5f, 0x0355842d, 0x0034ae95}}, Y: Field{[10]uint32{0x03df7957, 0x00c2fe94, 0x03d477c0, 0x00b0e42d, 0x000549e7, 0x00e95758, 0x00bc5f0c, 0x005e7de1, 0x01b10cad, 0x00368d9a}}}, + {X: Field{[10]uint32{0x008703f2, 0x036e6b9b, 0x0194a086, 0x01e552b2, 0x00d3de15, 0x020332c9, 0x031d2b28, 0x0222c9de, 0x03587ec9, 0x000f813a}}, Y: Field{[10]uint32{0x0328dd9c, 0x0336d3f9, 0x0207bb98, 0x02273170, 0x00ff3c60, 0x037e5bef, 0x031d6503, 0x021767ba, 0x0113e6dc, 0x003e9048}}}, + {X: Field{[10]uint32{0x019fe7f6, 0x0368f09a, 0x01ca17a0, 0x008177e4, 0x0260c9f1, 0x007d19b5, 0x019aefa9, 0x029274f8, 0x03424339, 0x003bf96e}}, Y: Field{[10]uint32{0x005156e9, 0x00fa74c9, 0x0008ff9e, 0x0029f2d1, 0x01e3576b, 0x01f3e7f1, 0x0221db29, 0x01903f3a, 0x012ffb39, 0x00263188}}}, + {X: Field{[10]uint32{0x02a0908b, 0x0359a92e, 0x008a302b, 0x00b6605b, 0x03bca2dc, 0x031383a9, 0x03e65915, 0x00cdb7bb, 0x02e5a330, 0x0028a510}}, Y: Field{[10]uint32{0x02a135e6, 0x0109ea77, 0x023112db, 0x02251199, 0x02dc5e77, 0x029bee79, 0x0374c130, 0x0391f0ed, 0x00297320, 0x00286fe2}}}, + {X: Field{[10]uint32{0x008bb792, 0x022aa23c, 0x013714da, 0x03fe0063, 0x0148e877, 0x0324862c, 0x01f632d1, 0x0097daa4, 0x00ba6f72, 0x001152f3}}, Y: Field{[10]uint32{0x01ec713c, 0x02562dd1, 0x00e3e918, 0x00f681f8, 0x01815775, 0x000ba837, 0x021106b2, 0x00ac0582, 0x01312d53, 0x0036837b}}}, + {X: Field{[10]uint32{0x00c2dca9, 0x0160d337, 0x01fced42, 0x020ba503, 0x00565737, 0x00941501, 0x00631afa, 0x02559b2c, 0x014032c3, 0x0000c58e}}, Y: Field{[10]uint32{0x03cc5fc7, 0x016a36f3, 0x004dd844, 0x017e9555, 0x0267f089, 0x03d359a2, 0x037464c6, 0x02c34691, 0x01c41b15, 0x00063158}}}, + {X: Field{[10]uint32{0x01b07703, 0x03f22112, 0x00a92bc4, 0x00e8ef38, 0x01524089, 0x03f1c4cb, 0x015fcedf, 0x01efc83c, 0x035f53f0, 0x00152d4d}}, Y: Field{[10]uint32{0x01abdee7, 0x0058fb98, 0x026a7b3f, 0x031b59c8, 0x00f5df11, 0x028ba886, 0x02922bdf, 0x01094794, 0x033f0a94, 0x000c6f8a}}}, + {X: Field{[10]uint32{0x0058b3bd, 0x02dfb980, 0x003280d2, 0x03118e7a, 0x00de9033, 0x025368f3, 0x03b9b6a6, 0x03419caf, 0x031b0745, 0x000a0f38}}, Y: Field{[10]uint32{0x00c0245a, 0x00801136, 0x0338ff9d, 0x02a99eaa, 0x010dc1c7, 0x03a074b2, 0x01c24e76, 0x02ed5b8f, 0x00a4d452, 0x003daa52}}}, + {X: Field{[10]uint32{0x00e99967, 0x0059fc84, 0x033e3a60, 0x00c5892e, 0x0148d5f8, 0x0012515e, 0x012419cb, 0x029d51ec, 0x0353117b, 0x002d79d3}}, Y: Field{[10]uint32{0x018dd3e6, 0x0120a01c, 0x01b5e10d, 0x007d33f6, 0x003da833, 0x03ce0c02, 0x03c22e89, 0x03e6aaa0, 0x0354d635, 0x0017d8d5}}}, + {X: Field{[10]uint32{0x03f83080, 0x0159c4f2, 0x031340a8, 0x012c7349, 0x03d587c3, 0x0335476b, 0x00dc776f, 0x00c60c5c, 0x0332cfa3, 0x001a0797}}, Y: Field{[10]uint32{0x0279266a, 0x0106951c, 0x010e38f2, 0x03bfef8e, 0x0276f646, 0x01ff3cc2, 0x00361d9b, 0x039375ed, 0x00b8d144, 0x003161f6}}}, + {X: Field{[10]uint32{0x029f1d0c, 0x01697f40, 0x00621b92, 0x00857fe3, 0x012f28b2, 0x00177d5b, 0x021ec17d, 0x00a27c94, 0x02b7722f, 0x0007ee97}}, Y: Field{[10]uint32{0x0311f5ba, 0x0372fa7a, 0x037d1524, 0x018d6cae, 0x0234283b, 0x032b2d9a, 0x03f287ef, 0x03f537e9, 0x00d997ec, 0x0037c450}}}, + {X: Field{[10]uint32{0x020d0a77, 0x004c029a, 0x00f2031e, 0x01933095, 0x0217855b, 0x00cfc6f3, 0x038fc5a7, 0x022cf3b4, 0x00b0df37, 0x000e2ffd}}, Y: Field{[10]uint32{0x0206b1be, 0x03728719, 0x03dc2520, 0x01979cef, 0x01f35a50, 0x0094dd1d, 0x00485ee3, 0x00a5b993, 0x025df634, 0x001b53c1}}}, + {X: Field{[10]uint32{0x017de831, 0x023dd3b9, 0x015ed6e0, 0x0281df32, 0x03779df8, 0x01ed5e63, 0x00050d52, 0x00992ef9, 0x03c359a9, 0x001c1c04}}, Y: Field{[10]uint32{0x014ea422, 0x032455c0, 0x00c3fda9, 0x029d8cb9, 0x02582313, 0x00f3662b, 0x03b8dcc5, 0x021b0195, 0x01a03153, 0x002e7cde}}}, + {X: Field{[10]uint32{0x01642ef5, 0x028fd8d1, 0x0135a73d, 0x02467799, 0x03fc5b8c, 0x0082416a, 0x010abbb3, 0x00921392, 0x012f7028, 0x002b653b}}, Y: Field{[10]uint32{0x02c88457, 0x01c0b0aa, 0x02bd6cb8, 0x01cdb409, 0x020fdf49, 0x01951485, 0x00011fec, 0x0387cfa6, 0x0013a554, 0x00276fa2}}}, + {X: Field{[10]uint32{0x0362612e, 0x0115613f, 0x001f54f5, 0x021d62e2, 0x00fd174f, 0x0110de17, 0x01ad1552, 0x021da926, 0x01e4e991, 0x0011ed5b}}, Y: Field{[10]uint32{0x00efdced, 0x0356695f, 0x012d986b, 0x03483524, 0x03383d92, 0x03dd4ddd, 0x016117a5, 0x02faddf1, 0x01375855, 0x00028501}}}, + {X: Field{[10]uint32{0x01f431e8, 0x03ded205, 0x036af03c, 0x013433cc, 0x03f31f62, 0x0047ca04, 0x024643af, 0x029a4c7c, 0x024e9291, 0x00146f39}}, Y: Field{[10]uint32{0x0107e552, 0x00eaaebb, 0x02e13a06, 0x01a435d6, 0x03f40c4c, 0x00480e53, 0x0235d284, 0x00891c3b, 0x03d9a301, 0x00023dd0}}}, + {X: Field{[10]uint32{0x03f7a43f, 0x02e550b9, 0x03447a0c, 0x03b80ef1, 0x0083b80b, 0x026d3af8, 0x018e56b4, 0x01683f3a, 0x00feb52c, 0x001d8a1f}}, Y: Field{[10]uint32{0x02a7a7bc, 0x00cfadb8, 0x007ff13e, 0x026f7161, 0x03e9e339, 0x003662c1, 0x01d064a5, 0x0112ef4e, 0x0256fa57, 0x001cdadf}}}, + {X: Field{[10]uint32{0x036b8f5e, 0x02b37037, 0x0155b181, 0x0333c713, 0x028dc29b, 0x006dddc6, 0x011aaa2c, 0x000430c6, 0x039ead01, 0x0018535c}}, Y: Field{[10]uint32{0x002f8085, 0x036d9b43, 0x031664f4, 0x036eabc1, 0x025591ef, 0x00001193, 0x0296c2c5, 0x01eddb22, 0x028fe860, 0x00173353}}}, + {X: Field{[10]uint32{0x024e1bc9, 0x00b4ce97, 0x0380803e, 0x02262598, 0x0035cd58, 0x00354fb4, 0x039404d9, 0x00d7cacc, 0x00c8ee8c, 0x0030e111}}, Y: Field{[10]uint32{0x00cd29f2, 0x02febd9b, 0x03f441f4, 0x02685ae4, 0x031d2ffc, 0x021fea6a, 0x02221092, 0x014baf70, 0x00cdde54, 0x0022d102}}}, + {X: Field{[10]uint32{0x01c8f349, 0x0077dea6, 0x02539239, 0x025cb6ed, 0x0256a1c1, 0x014aff79, 0x019bf028, 0x01bcd760, 0x0249c601, 0x0022a725}}, Y: Field{[10]uint32{0x0369a8ed, 0x03a5d2b5, 0x001afdc6, 0x0168ce46, 0x031797aa, 0x0132d402, 0x00a6030a, 0x0067e9b1, 0x0157be2c, 0x002cb736}}}, + {X: Field{[10]uint32{0x02a04b03, 0x02ccc46f, 0x026bced6, 0x02d0745d, 0x0196292a, 0x0334a35d, 0x010ea0a6, 0x025c2497, 0x011be444, 0x00283d73}}, Y: Field{[10]uint32{0x027ff95b, 0x03e56524, 0x034b868a, 0x00681c73, 0x00c8d793, 0x03912738, 0x0045d923, 0x00a6c338, 0x01e9291b, 0x00349c2c}}}, + {X: Field{[10]uint32{0x033a9614, 0x03530447, 0x03a64709, 0x0372a550, 0x0025c64d, 0x00a38964, 0x03bdbaf0, 0x01661deb, 0x03368767, 0x0029e3c8}}, Y: Field{[10]uint32{0x02a6de83, 0x007c108c, 0x01e7ee24, 0x02690e7d, 0x01de34aa, 0x007d4346, 0x0245b3ab, 0x0116fb94, 0x02c9a5d2, 0x0004d97e}}}, + {X: Field{[10]uint32{0x03391769, 0x03f0f902, 0x03b514a9, 0x00c27b8f, 0x03af6cae, 0x0104e91a, 0x03aa6f5a, 0x00b16e4a, 0x03e3ae48, 0x000eff4d}}, Y: Field{[10]uint32{0x016d1c59, 0x01553c0e, 0x03d66bdc, 0x0019371f, 0x03d0219c, 0x01de3273, 0x02424a07, 0x02c3719b, 0x001834bb, 0x000b64c2}}}, + {X: Field{[10]uint32{0x013881a2, 0x00735c74, 0x00e5d1b4, 0x00f580bb, 0x02d426f2, 0x039e5b4a, 0x036ea757, 0x00748f9d, 0x009a0026, 0x0024b2b1}}, Y: Field{[10]uint32{0x031521c1, 0x02124b95, 0x035dac0d, 0x032061e8, 0x00c7a43a, 0x02303176, 0x023e587a, 0x00df2266, 0x00138e0f, 0x00231dbb}}}, + {X: Field{[10]uint32{0x0356842a, 0x01008502, 0x01d6b829, 0x0379ea5b, 0x03718944, 0x0124d59e, 0x03708941, 0x03719f30, 0x01e00ea7, 0x00033dbb}}, Y: Field{[10]uint32{0x00627cb7, 0x03a343d5, 0x0042ca76, 0x0343d646, 0x020fa070, 0x00f72314, 0x016128a5, 0x01822deb, 0x03d4e939, 0x0038adc5}}}, + {X: Field{[10]uint32{0x0291e17a, 0x006fe0be, 0x0035e3dd, 0x00b44781, 0x00968c8c, 0x02c1b886, 0x02cb92bb, 0x00a5149b, 0x0198ba51, 0x00188132}}, Y: Field{[10]uint32{0x00cd0ea4, 0x0362b765, 0x03939d12, 0x031e6981, 0x03d1ed18, 0x002bca8f, 0x03ae21ef, 0x01972723, 0x015fe783, 0x0005a428}}}, + {X: Field{[10]uint32{0x00c0aa5d, 0x006bff79, 0x03f12ef7, 0x001fc88d, 0x02d8ce07, 0x01ab0b85, 0x0268d13a, 0x000384d4, 0x0348cc55, 0x0028b13e}}, Y: Field{[10]uint32{0x000cd839, 0x03cb5c0f, 0x039509e5, 0x01ea3566, 0x03c403f5, 0x016048ea, 0x03e3906c, 0x03225f2d, 0x000ee608, 0x000e0251}}}, + {X: Field{[10]uint32{0x03656f60, 0x01e1cf7a, 0x024f2b66, 0x03135cc8, 0x016acc8e, 0x00ecb8c2, 0x01a36a6d, 0x00f92f17, 0x03a1cc30, 0x00362bdf}}, Y: Field{[10]uint32{0x00c6de0d, 0x0333fffc, 0x02e5ddd4, 0x006e7b7a, 0x015e14d8, 0x00116c4d, 0x03b39f97, 0x00cf1437, 0x02bd5a55, 0x0027f1fc}}}, + {X: Field{[10]uint32{0x02dea0e7, 0x035dd75d, 0x0390a864, 0x00fb476b, 0x01377073, 0x0014c12f, 0x00e6bbdb, 0x00a46981, 0x00adb873, 0x000fa680}}, Y: Field{[10]uint32{0x0101ded0, 0x023bad02, 0x0063051f, 0x026cc86d, 0x0320a5cb, 0x0066a35d, 0x0124e37f, 0x0313bd4d, 0x0057f6d1, 0x0037ad25}}}, + {X: Field{[10]uint32{0x03dc3d7f, 0x03943974, 0x0136809d, 0x0357a862, 0x01760ca8, 0x0306cab2, 0x014346aa, 0x01883261, 0x02e930aa, 0x0002fbd6}}, Y: Field{[10]uint32{0x00dfc48f, 0x037eb592, 0x03034c0f, 0x028ff8dc, 0x0105da98, 0x03501079, 0x0212b9c7, 0x017d66c0, 0x0042f792, 0x00083603}}}, + {X: Field{[10]uint32{0x0155f67f, 0x00ad2424, 0x0035d592, 0x011e2229, 0x0238215e, 0x03ce5916, 0x01743088, 0x03541db0, 0x01fbcd28, 0x0033505a}}, Y: Field{[10]uint32{0x01e74674, 0x030bc98d, 0x025b929d, 0x03192d6a, 0x00a170da, 0x015b06da, 0x025f2743, 0x01937569, 0x00a21a55, 0x003e798b}}}, + {X: Field{[10]uint32{0x015a4c28, 0x02d810bb, 0x0121d538, 0x004533ce, 0x014bd37b, 0x025f5db3, 0x01a25047, 0x009893f7, 0x01ed34cd, 0x00292da4}}, Y: Field{[10]uint32{0x026af55d, 0x01b08174, 0x02d12c33, 0x01ddcb1c, 0x025c045a, 0x00f8ce5f, 0x030ca545, 0x02d30456, 0x00b16781, 0x003194dd}}}, + {X: Field{[10]uint32{0x00aa4818, 0x01576f62, 0x0047dc9e, 0x0056fe7a, 0x03c2b3a6, 0x02a14303, 0x03cf68fa, 0x02de2065, 0x016a4226, 0x001793a4}}, Y: Field{[10]uint32{0x0398951e, 0x02128c6d, 0x032808d9, 0x0014fac9, 0x03f3395d, 0x0193d2cb, 0x01991f44, 0x014b9972, 0x02a25c7c, 0x000fcf0f}}}, + {X: Field{[10]uint32{0x03a74a7c, 0x011d357a, 0x0105ca5f, 0x02e88653, 0x01f743e6, 0x00293180, 0x011b3ad5, 0x027dcb25, 0x02cff4d6, 0x003751e0}}, Y: Field{[10]uint32{0x00977b99, 0x0304b208, 0x0281d6c7, 0x0247536c, 0x0205d3a7, 0x018a3630, 0x03dd6ae8, 0x03bdf178, 0x035e9854, 0x0025e9ee}}}, + {X: Field{[10]uint32{0x01adce36, 0x02026470, 0x02f0bcc0, 0x01044f92, 0x00281aff, 0x019a701f, 0x03945432, 0x0017b376, 0x02d54ab4, 0x002854c2}}, Y: Field{[10]uint32{0x0263e756, 0x01125612, 0x0168a774, 0x02dbf6ee, 0x01b18550, 0x038aa96c, 0x01dda781, 0x0210b977, 0x02212732, 0x003cf494}}}, + {X: Field{[10]uint32{0x0264719e, 0x035db2a7, 0x013234a2, 0x00cab639, 0x03e5ee0d, 0x00cabd92, 0x014523f2, 0x0393c018, 0x02f7b438, 0x00146493}}, Y: Field{[10]uint32{0x028a8095, 0x01631dc4, 0x00176268, 0x01563ab6, 0x03fdfe6e, 0x02d912fe, 0x036e82b8, 0x0136d59c, 0x01a811f9, 0x0021f045}}}, + {X: Field{[10]uint32{0x03fada6e, 0x03555a14, 0x03563a3b, 0x01701ae5, 0x016ac905, 0x03882a75, 0x03625d4b, 0x0361d041, 0x0268e137, 0x0020b3fb}}, Y: Field{[10]uint32{0x00733b7a, 0x019e61cc, 0x01cc06ff, 0x01e140a9, 0x02a363e9, 0x037b9e9c, 0x02804d76, 0x031471ca, 0x0246c4f5, 0x0037526a}}}, + {X: Field{[10]uint32{0x032e623a, 0x03f5f957, 0x03f30a4e, 0x03f4b30e, 0x02e02b70, 0x00db1f69, 0x021346b0, 0x03bd1016, 0x0076f7f1, 0x0028dce2}}, Y: Field{[10]uint32{0x0204a21a, 0x0365847a, 0x02edf368, 0x00d9606c, 0x02b1204d, 0x01200cc6, 0x00de46e5, 0x014acaf8, 0x012be1ea, 0x001965bd}}}, + {X: Field{[10]uint32{0x0180bcbc, 0x000d960a, 0x01d7dd82, 0x02cc62c3, 0x028d8382, 0x00b33c92, 0x0224fd6b, 0x00635cad, 0x02f7aec8, 0x002b9329}}, Y: Field{[10]uint32{0x018f1ae2, 0x02325eb7, 0x015e9237, 0x02586aa6, 0x03348155, 0x015322ee, 0x02a29f25, 0x01f15c78, 0x020335ad, 0x001a9eb6}}}, + {X: Field{[10]uint32{0x01d12732, 0x03df7ea2, 0x006b1400, 0x0250b614, 0x004d6ac8, 0x03732e72, 0x018d1984, 0x01d8be6c, 0x022bfa9d, 0x002f8cd5}}, Y: Field{[10]uint32{0x0075d442, 0x034b9ba5, 0x008fe473, 0x015a40c1, 0x01c4f5c9, 0x013a1d29, 0x0336cc21, 0x019a9cd4, 0x03b877c6, 0x002d99bb}}}, + {X: Field{[10]uint32{0x03c74446, 0x02e4b68d, 0x01ecf37c, 0x007c1711, 0x03f38289, 0x02983fda, 0x003b2888, 0x00f6e14c, 0x02d9815b, 0x00275f69}}, Y: Field{[10]uint32{0x015b12a8, 0x00ada35d, 0x001ac540, 0x003627f3, 0x00df3d2c, 0x02d04f51, 0x01f6d734, 0x016f8398, 0x007372ba, 0x0011b0a4}}}, + {X: Field{[10]uint32{0x030d4d3f, 0x02a77d0e, 0x02366b62, 0x03edf266, 0x020b5981, 0x02edecef, 0x02028498, 0x030af301, 0x0131e513, 0x000e48cf}}, Y: Field{[10]uint32{0x0116dfd8, 0x038e136e, 0x03c81f97, 0x012ea6bf, 0x001ec57d, 0x0187e9dd, 0x00ac3e1c, 0x03a93d36, 0x017c92e0, 0x003f09e1}}}, + {X: Field{[10]uint32{0x037768be, 0x039450f6, 0x004b43f7, 0x00cea0b6, 0x02547e6f, 0x02d63d06, 0x00d02dd7, 0x03a0ec16, 0x0388db90, 0x0016f8b5}}, Y: Field{[10]uint32{0x03de1026, 0x0127cbdb, 0x00875b90, 0x01ae6899, 0x03d585ef, 0x0213edb3, 0x01396f2e, 0x03e8cf9c, 0x03a86b2d, 0x0002e33c}}}, + {X: Field{[10]uint32{0x00f162ac, 0x01e187a2, 0x035d682f, 0x02f8e09f, 0x027c53a0, 0x01c011e7, 0x03600c25, 0x02853044, 0x01e8191f, 0x000ffd67}}, Y: Field{[10]uint32{0x01c77ba2, 0x01730c8b, 0x024dfd81, 0x03ed79e6, 0x0308ae4e, 0x009e6847, 0x03f5f60c, 0x02db9efb, 0x01856ab0, 0x00009756}}}, + {X: Field{[10]uint32{0x019a256f, 0x01d6f05c, 0x01b5875f, 0x029398c1, 0x00b61a18, 0x02803e36, 0x02d9475d, 0x00648262, 0x0030ed22, 0x00207727}}, Y: Field{[10]uint32{0x014682a5, 0x01e34a3d, 0x03fc2ca6, 0x00913503, 0x009cccf0, 0x01a6897e, 0x038f9c98, 0x032c9e9b, 0x005e5c44, 0x000a5c1d}}}, + {X: Field{[10]uint32{0x0370e9da, 0x0168f926, 0x00d24f76, 0x010eedea, 0x02ea3869, 0x00c353d2, 0x036121b2, 0x01026455, 0x0216579c, 0x002e8f87}}, Y: Field{[10]uint32{0x02c72f4e, 0x02088d8c, 0x02abd90f, 0x039956ae, 0x0154eb0d, 0x034c39ec, 0x01d8d9c7, 0x03e99e2a, 0x0008653c, 0x00287bae}}}, + {X: Field{[10]uint32{0x03f854f8, 0x02271220, 0x0304ca05, 0x0250ee5b, 0x01fa66d1, 0x02df479a, 0x01f52a51, 0x02bb8450, 0x028150fa, 0x0000d7ff}}, Y: Field{[10]uint32{0x01366fad, 0x03422a32, 0x00dc9b7d, 0x018c181c, 0x00b4ad31, 0x03c44170, 0x00a09b8d, 0x01b74ff3, 0x0022e83f, 0x00359a86}}}, + {X: Field{[10]uint32{0x00763a06, 0x0142ab58, 0x00f685b9, 0x038f95c9, 0x038b50d7, 0x00e2e605, 0x0214c0ae, 0x03e5c870, 0x00221435, 0x000e63af}}, Y: Field{[10]uint32{0x00811f46, 0x016e0120, 0x03011682, 0x021c5240, 0x0115551b, 0x030b233a, 0x00d4da7f, 0x03baaff3, 0x009d0eb2, 0x0030b7d5}}}, + {X: Field{[10]uint32{0x00a89e96, 0x0284e243, 0x01a0d6cf, 0x00aa913f, 0x029ca89d, 0x01397387, 0x018511a8, 0x029d7474, 0x0333e7d0, 0x000ae89f}}, Y: Field{[10]uint32{0x017cf4a7, 0x02d98ae6, 0x02f19c6b, 0x0153f304, 0x0045c2ac, 0x02472845, 0x039946cc, 0x01d70e3c, 0x004b8323, 0x001408da}}}, + {X: Field{[10]uint32{0x01e829c2, 0x034547be, 0x0014465c, 0x00fbc7fc, 0x032b5497, 0x014c60ba, 0x02cd4856, 0x007e4813, 0x023e7ec5, 0x001095c1}}, Y: Field{[10]uint32{0x01232c1c, 0x01518ad5, 0x015d747c, 0x016a04ab, 0x00919f8b, 0x01a6af59, 0x009ab35b, 0x00145447, 0x034116dd, 0x0011cd47}}}, + {X: Field{[10]uint32{0x034063a8, 0x03c5cb66, 0x006ebe3e, 0x025623b9, 0x0180da81, 0x00b95946, 0x0218582d, 0x03295a50, 0x03c1b5b3, 0x001df9cd}}, Y: Field{[10]uint32{0x01d1587a, 0x038830a2, 0x007b50e0, 0x017135ec, 0x03651ae4, 0x032e44b8, 0x008d4f11, 0x0262b4df, 0x01c5e667, 0x0003df2d}}}, + {X: Field{[10]uint32{0x00cdaa4f, 0x03bb1e8d, 0x028c44a7, 0x010d1ed7, 0x01ef027d, 0x02932dcb, 0x02f98b82, 0x02307ef7, 0x024d7101, 0x0037f2ed}}, Y: Field{[10]uint32{0x03972a23, 0x02c31765, 0x01a92e06, 0x0160b72a, 0x01bc2f4e, 0x014713c2, 0x03379e87, 0x01d6222b, 0x01bcc720, 0x0037f033}}}, + {X: Field{[10]uint32{0x0355ae8a, 0x0258ab74, 0x00e78ce6, 0x0388a94b, 0x01b39855, 0x011b5c62, 0x02c52567, 0x007a38ca, 0x02d0a787, 0x0023ada1}}, Y: Field{[10]uint32{0x00cc30da, 0x038cc71b, 0x02a5ed71, 0x01d5ba29, 0x0389b796, 0x0308b17e, 0x00afe424, 0x00a0dff4, 0x0211fec5, 0x003aa2cd}}}, + {X: Field{[10]uint32{0x02cc3e54, 0x025ac74d, 0x0298785a, 0x00b6fa9e, 0x02ee5652, 0x0313083f, 0x02703ff8, 0x00b754c5, 0x0313ebaf, 0x00345f61}}, Y: Field{[10]uint32{0x01c10b54, 0x007616f7, 0x038b5682, 0x01c9391b, 0x00e9fdb8, 0x03e25074, 0x00a7a19b, 0x018b2a76, 0x03e86d78, 0x003a9c2d}}}, + {X: Field{[10]uint32{0x00b3ba89, 0x000df88c, 0x02cfa3ec, 0x007e0b35, 0x02249c47, 0x0053bbb6, 0x02d28e9c, 0x00287215, 0x03e6ae05, 0x001f531d}}, Y: Field{[10]uint32{0x0265fe60, 0x01cffa58, 0x027bcea7, 0x0230f686, 0x01900ad6, 0x009f440b, 0x0180f393, 0x037e4d2c, 0x0253f5fb, 0x0031681d}}}, + {X: Field{[10]uint32{0x017ebcab, 0x014306d3, 0x01e88f4f, 0x03b4378e, 0x003721dc, 0x02c942f3, 0x021d51b3, 0x0179a1b5, 0x0109451e, 0x00258e04}}, Y: Field{[10]uint32{0x00801b64, 0x01745959, 0x003947f1, 0x00529c8a, 0x0209f065, 0x035bc3f9, 0x017642bd, 0x032951fc, 0x0019b088, 0x0025263d}}}, + {X: Field{[10]uint32{0x038c2ba7, 0x02be42a5, 0x00d208af, 0x020ff68f, 0x0385f44e, 0x023d3a54, 0x02da8f2f, 0x00f5cdec, 0x01505435, 0x001d002d}}, Y: Field{[10]uint32{0x01909771, 0x022ab9ff, 0x008be6b1, 0x00749d41, 0x02e36bed, 0x036c7572, 0x0129a04c, 0x00d9df88, 0x00a3ce50, 0x00264ceb}}}, + {X: Field{[10]uint32{0x026ff59f, 0x00792e81, 0x01be2a01, 0x030e4ed4, 0x00d1de3b, 0x03c4baf6, 0x02f59639, 0x02ff49c7, 0x0011fff7, 0x000f5ec3}}, Y: Field{[10]uint32{0x02404b9d, 0x007133cc, 0x01789b79, 0x00bdd51a, 0x008bddb1, 0x02a21851, 0x01eb57d8, 0x02839738, 0x00317f7c, 0x002d8e5d}}}, + {X: Field{[10]uint32{0x01c46328, 0x01bd33d9, 0x0343c5cd, 0x0377f78d, 0x0245d128, 0x03237665, 0x03125455, 0x01fc5398, 0x01ec7ebf, 0x00125136}}, Y: Field{[10]uint32{0x00589996, 0x009c6fcb, 0x01d1f5bf, 0x036449b2, 0x035c2f49, 0x02747cf4, 0x01cd408c, 0x02bb04ca, 0x019313ba, 0x003c1954}}}, + {X: Field{[10]uint32{0x01bdecf1, 0x0391b49e, 0x00b5189c, 0x00cda6eb, 0x01f37b99, 0x03822cd5, 0x0207d6d8, 0x02c743e1, 0x032b4764, 0x00265810}}, Y: Field{[10]uint32{0x03160ebd, 0x02b15ac1, 0x0386578f, 0x03e37aea, 0x03f7e1a9, 0x030852b7, 0x0200ea9e, 0x034be8a4, 0x034c0921, 0x000c13ae}}}, + {X: Field{[10]uint32{0x033de4d6, 0x0212a8ee, 0x0281d9ca, 0x01658cc5, 0x019196cc, 0x009ad77b, 0x03409cc7, 0x015963f0, 0x035b6358, 0x000c4fd4}}, Y: Field{[10]uint32{0x016c9716, 0x01024bf1, 0x01fb3dd6, 0x03fe3266, 0x0159b049, 0x0007fd3c, 0x0323bcfd, 0x0383af97, 0x008aa55f, 0x00394469}}}, + {X: Field{[10]uint32{0x008ed7b2, 0x03c0d315, 0x01bcb3cc, 0x03597004, 0x00c99478, 0x03d3dd3b, 0x01b9006e, 0x01b7036e, 0x006f8cd3, 0x00217116}}, Y: Field{[10]uint32{0x03434229, 0x02d34416, 0x01f63a75, 0x01699d8e, 0x00144c8c, 0x03e6c01c, 0x02325923, 0x0175b371, 0x03c0045c, 0x00335a54}}}, + {X: Field{[10]uint32{0x00671af8, 0x01c1be65, 0x0251d21d, 0x0036d935, 0x03d489b2, 0x01ce07ba, 0x01b668db, 0x00d6747b, 0x02d2a7fc, 0x0025a2f1}}, Y: Field{[10]uint32{0x00725186, 0x02f6df3c, 0x033ce0d0, 0x03f02d4b, 0x02de88bc, 0x0396545f, 0x032f3304, 0x01c1f306, 0x02a3723d, 0x003ec2b5}}}, + {X: Field{[10]uint32{0x0328985d, 0x023158ef, 0x024200e5, 0x03373fda, 0x0326d343, 0x01bb03a1, 0x00c72215, 0x039dfb9b, 0x00eb3722, 0x0008c96b}}, Y: Field{[10]uint32{0x038d39e1, 0x03323fe1, 0x03a5a21a, 0x03f7a06e, 0x0019b9c8, 0x03cfa7bb, 0x02596836, 0x0165e3ca, 0x0353dd29, 0x0018069f}}}, + {X: Field{[10]uint32{0x03acd2e4, 0x001ff759, 0x01dff054, 0x00d61f0c, 0x024b1c93, 0x02abcca9, 0x00667f99, 0x00efab70, 0x02abb231, 0x00231b9d}}, Y: Field{[10]uint32{0x0250c29f, 0x01444b47, 0x02a46b3f, 0x00b8d036, 0x023d7bb9, 0x00a6ce43, 0x03b19c42, 0x037ceb24, 0x0050d422, 0x0009f8ee}}}, + {X: Field{[10]uint32{0x0236748f, 0x03508c17, 0x037af9d8, 0x02a22e60, 0x000352e7, 0x0354e285, 0x02b2c728, 0x0234f935, 0x02313446, 0x0038c7fb}}, Y: Field{[10]uint32{0x010309be, 0x02686c9b, 0x00139e41, 0x00f8a035, 0x0237f9df, 0x02684078, 0x03974f6b, 0x0123e24d, 0x02e12d19, 0x00226c25}}}, + {X: Field{[10]uint32{0x00d306c6, 0x0305f52c, 0x02981215, 0x02c19eb8, 0x00da748a, 0x03968ce6, 0x0342fdd7, 0x0012d1f1, 0x006e8494, 0x00165ad6}}, Y: Field{[10]uint32{0x02a0a16b, 0x03863e18, 0x02791ff6, 0x0180acb3, 0x012ac277, 0x036b7c86, 0x00e8f05e, 0x031c4579, 0x00c5912c, 0x003a5b17}}}, + {X: Field{[10]uint32{0x01aa1c02, 0x01492185, 0x03317714, 0x028e0c4f, 0x03d453d5, 0x006549c3, 0x019c3b71, 0x00032e86, 0x01675cf5, 0x00080330}}, Y: Field{[10]uint32{0x0320ce61, 0x01e73d54, 0x024b3e7b, 0x013b05f7, 0x011905e2, 0x024900dc, 0x005c1334, 0x010a7191, 0x00c87e34, 0x001e02ab}}}, + {X: Field{[10]uint32{0x02d2025f, 0x017a774a, 0x01767dfb, 0x01be04cc, 0x0370f0e9, 0x01e93c91, 0x01148f87, 0x007f3c1e, 0x0032e10e, 0x001f9355}}, Y: Field{[10]uint32{0x03aa432a, 0x02d49458, 0x0136eec0, 0x03284f8c, 0x01fa58f0, 0x0105e60b, 0x03f5fd7d, 0x00a0dfcd, 0x03b26ee8, 0x000d7d76}}}, + {X: Field{[10]uint32{0x000237b7, 0x02edef67, 0x030e5776, 0x01e4d4a1, 0x00ff21f8, 0x01bac430, 0x038f800b, 0x01f9b9e9, 0x010895c9, 0x00307b5d}}, Y: Field{[10]uint32{0x03418fb9, 0x005063fa, 0x01bb1d8b, 0x02565c82, 0x01a38e80, 0x013ffb0f, 0x031e89f6, 0x02aa2670, 0x02068dc0, 0x00241c8e}}}, + {X: Field{[10]uint32{0x02104770, 0x0339cc2c, 0x018defc7, 0x02b9a55b, 0x029948dd, 0x00576374, 0x01239b2a, 0x02027e0f, 0x02e8a53e, 0x00397f52}}, Y: Field{[10]uint32{0x031c4fa2, 0x00bc37bd, 0x0112ade0, 0x03d77d30, 0x03050c7b, 0x017cb76e, 0x00e8ebd3, 0x00865c82, 0x029c1cbb, 0x001a9376}}}, + {X: Field{[10]uint32{0x0251f30d, 0x01bab076, 0x03f2ca76, 0x0057d9cc, 0x03e3534d, 0x00be7b3b, 0x0372cdb4, 0x02f621ea, 0x01f24b33, 0x0000f39d}}, Y: Field{[10]uint32{0x02838ed7, 0x03c132c6, 0x0136213b, 0x02334f72, 0x01a43eb4, 0x00a2bd56, 0x00e9b5d8, 0x03db898b, 0x015b51dd, 0x0027b68c}}}, + {X: Field{[10]uint32{0x0013391c, 0x033bcee2, 0x01d34ad8, 0x02a23867, 0x00527fb9, 0x01fb7d66, 0x018d8ce7, 0x00735392, 0x004f33a8, 0x00263013}}, Y: Field{[10]uint32{0x038bd3a7, 0x03c185ff, 0x01949483, 0x00ea3fc8, 0x03acb484, 0x00158255, 0x0371c463, 0x03e04bd0, 0x0167f853, 0x003f4af3}}}, + {X: Field{[10]uint32{0x0287bbf3, 0x02281e42, 0x001b10fc, 0x00a1b905, 0x01f3d2dd, 0x004f390f, 0x00e62f84, 0x032c1b2f, 0x00882906, 0x000143a7}}, Y: Field{[10]uint32{0x002fa3fb, 0x01890f36, 0x00a9ce1c, 0x0168bcf2, 0x02479a61, 0x028111d2, 0x01eefb2b, 0x006731a1, 0x013bb05f, 0x00010f1c}}}, + {X: Field{[10]uint32{0x03adf2d1, 0x022a0c50, 0x023a2eeb, 0x0190a9cf, 0x0071bf65, 0x03c86ddb, 0x00faa663, 0x0378ec19, 0x0217458b, 0x0017506e}}, Y: Field{[10]uint32{0x03b6cec5, 0x031117d5, 0x0351087c, 0x029da1d8, 0x0307f64f, 0x01eac163, 0x039e22b0, 0x008564ac, 0x0054b308, 0x0005fbff}}}, + {X: Field{[10]uint32{0x00d5b077, 0x00e3e749, 0x023e789d, 0x018191bf, 0x026b34cc, 0x0364b81d, 0x003cb8e1, 0x0164edba, 0x00bf2a02, 0x00138ccb}}, Y: Field{[10]uint32{0x039e1f95, 0x00aa1679, 0x01955c8b, 0x00f77b34, 0x01744ad0, 0x0278e478, 0x03699859, 0x000c0256, 0x005c3ab9, 0x00143e9d}}}, + {X: Field{[10]uint32{0x01a2dae9, 0x005baecd, 0x013f8347, 0x01f3776d, 0x03c83cd4, 0x00d04141, 0x017455e4, 0x02096f0d, 0x029d27ee, 0x0006efd8}}, Y: Field{[10]uint32{0x01e9bb75, 0x03ea250f, 0x0370971f, 0x01a58074, 0x018fb72f, 0x002f6179, 0x000070ec, 0x014fcd3d, 0x00c1e997, 0x00214242}}}, + {X: Field{[10]uint32{0x01cde650, 0x03d6c06d, 0x01b8aa25, 0x026f71e7, 0x0023aece, 0x03af72cc, 0x00cb3f5d, 0x0358aab4, 0x02eff9db, 0x002a4526}}, Y: Field{[10]uint32{0x00c327bd, 0x03c2fdad, 0x01a79918, 0x02318766, 0x02ae3c14, 0x037da1b5, 0x00a16d09, 0x00447d1a, 0x0346e6db, 0x0029eed2}}}, + {X: Field{[10]uint32{0x01b72a71, 0x0385c87f, 0x0037ffc5, 0x0375d7e0, 0x03b98ffc, 0x02c876b2, 0x01e5b406, 0x03590867, 0x01ee0185, 0x00200402}}, Y: Field{[10]uint32{0x03e26441, 0x00b96bcd, 0x010f2daf, 0x00162619, 0x01382839, 0x01171d7c, 0x0136f706, 0x02b5b077, 0x020957c7, 0x003a0859}}}, + {X: Field{[10]uint32{0x00ba6770, 0x01a2a1b0, 0x0068ab73, 0x00e4e401, 0x0096c6b6, 0x01bc4cbb, 0x02345846, 0x03d9e82c, 0x019ae466, 0x00301c3a}}, Y: Field{[10]uint32{0x00769362, 0x01124154, 0x00171a15, 0x033e703c, 0x03be6f8f, 0x02ca47ff, 0x016f77e3, 0x013d5a29, 0x03df358d, 0x00220fea}}}, + {X: Field{[10]uint32{0x00109f4a, 0x017fc7d5, 0x039da71c, 0x014c77fd, 0x018e028c, 0x0342be68, 0x03549a9e, 0x009d85e3, 0x0239cf61, 0x001afa25}}, Y: Field{[10]uint32{0x0204cf14, 0x017f6ce5, 0x02e0d821, 0x03c5b5d9, 0x00ff2dd6, 0x03e65c31, 0x0292f38f, 0x0244c49a, 0x017ddd37, 0x001ddebb}}}, + {X: Field{[10]uint32{0x0224ce8c, 0x016bf165, 0x01009219, 0x0014ae76, 0x03100945, 0x036ec6a1, 0x0052e796, 0x00792808, 0x01d41ce7, 0x00347f4c}}, Y: Field{[10]uint32{0x013fded1, 0x00425249, 0x01a2e5b5, 0x02aba8af, 0x0136d5f2, 0x02183979, 0x02796d91, 0x000a77aa, 0x03d378a8, 0x003cd5ea}}}, + {X: Field{[10]uint32{0x03169d9e, 0x0351a6e3, 0x010337ae, 0x022bab66, 0x02614c32, 0x02909a65, 0x01e617c0, 0x03c52cf3, 0x002d66fe, 0x0007214e}}, Y: Field{[10]uint32{0x038a71f9, 0x02257bc1, 0x01113a8f, 0x0137f6fe, 0x01e2406a, 0x01c9f669, 0x018702ab, 0x039aa13d, 0x031cb236, 0x0016316b}}}, + {X: Field{[10]uint32{0x0336b5ea, 0x03b7f653, 0x0212e272, 0x02dd0f2e, 0x03eec32c, 0x0304a2b5, 0x025c2d52, 0x019edd0b, 0x01edd5fd, 0x000b63ea}}, Y: Field{[10]uint32{0x032cd37d, 0x026b4763, 0x0331f0aa, 0x0103de01, 0x02231453, 0x0325930c, 0x0133af4b, 0x00a827e5, 0x033937eb, 0x001c6c57}}}, + {X: Field{[10]uint32{0x03dbafb4, 0x00e048b7, 0x00c954c5, 0x031a1c0c, 0x0240ceb1, 0x014376f7, 0x00d0a159, 0x031659c0, 0x0379d9f6, 0x0013d448}}, Y: Field{[10]uint32{0x0248c05b, 0x01f020d0, 0x01674c7f, 0x03ef80e0, 0x034b320a, 0x01f76159, 0x0061980c, 0x037d7aea, 0x0305f864, 0x001537a6}}}, + {X: Field{[10]uint32{0x01e7cd1c, 0x02348b36, 0x02834016, 0x0173b64f, 0x032c6999, 0x0350fb28, 0x02609496, 0x00b08563, 0x01ba4856, 0x002697e4}}, Y: Field{[10]uint32{0x0322b86b, 0x0034aa6d, 0x036382d4, 0x00fb84bd, 0x0129bfa3, 0x02b3e714, 0x01b11266, 0x03b28b80, 0x03ecc668, 0x0027e228}}}, + {X: Field{[10]uint32{0x02f9f610, 0x01df7614, 0x03cf0065, 0x03f83563, 0x01d84d54, 0x020cedd7, 0x00cc6b6e, 0x03eb9313, 0x0102d417, 0x003768c1}}, Y: Field{[10]uint32{0x015469a1, 0x036ff045, 0x02b0c5d4, 0x01e9b1fe, 0x0207f4c5, 0x000b8a90, 0x005468d1, 0x019079b5, 0x01da2e74, 0x003eee23}}}, + {X: Field{[10]uint32{0x0326e117, 0x036978d6, 0x025e8e88, 0x02c58635, 0x000600df, 0x00c7397d, 0x00e50cc6, 0x00507612, 0x027c5586, 0x00234ba7}}, Y: Field{[10]uint32{0x0251aa86, 0x0287b400, 0x009a9e33, 0x02f3dd8f, 0x02bb72fa, 0x0170a955, 0x01ab4fd8, 0x01f15355, 0x01ecffd6, 0x0026270e}}}, + {X: Field{[10]uint32{0x001ee995, 0x029f2a59, 0x01bbfa27, 0x03378f56, 0x0310c911, 0x00f47689, 0x031cee1c, 0x00f5b2c1, 0x0076e6b6, 0x001c9b38}}, Y: Field{[10]uint32{0x010af9c1, 0x02588b98, 0x015951c4, 0x02043522, 0x0206ea5e, 0x022ad74d, 0x02d01acd, 0x03e34d34, 0x02a0c91f, 0x0013906e}}}, + {X: Field{[10]uint32{0x02a43a1a, 0x02eb366f, 0x017aa27d, 0x01c7b4ba, 0x02c0d429, 0x027a5418, 0x02c0dc2c, 0x000f4fee, 0x01fe1835, 0x0037af24}}, Y: Field{[10]uint32{0x022d2f11, 0x01e8ccef, 0x00100d49, 0x0323fda2, 0x026dfdf3, 0x0357c9b9, 0x03b2ab80, 0x033a6bcc, 0x0315a6fe, 0x0004d64d}}}, + {X: Field{[10]uint32{0x00fd4b28, 0x017a443c, 0x00f41c58, 0x013b5ac9, 0x03237c79, 0x01cbfcb5, 0x0039e8c4, 0x012ae39c, 0x03357791, 0x00314e50}}, Y: Field{[10]uint32{0x0126087b, 0x01bf1533, 0x0310d1fc, 0x03da691c, 0x0123c26c, 0x002a8a83, 0x03041128, 0x027139ec, 0x019b628a, 0x000a014d}}}, + {X: Field{[10]uint32{0x005f29b0, 0x022f1e68, 0x00e1cc99, 0x00412fb9, 0x0072b818, 0x022a3ebb, 0x02bf1fbe, 0x0002c600, 0x02fd33c3, 0x00268a24}}, Y: Field{[10]uint32{0x01186e33, 0x03dcbfd1, 0x00bebb37, 0x0177d7ea, 0x00553870, 0x01738df3, 0x02ebc53a, 0x0004d948, 0x023bc2fa, 0x00265fc4}}}, + {X: Field{[10]uint32{0x039a351a, 0x0160412c, 0x0279f4c5, 0x02ff5cf7, 0x001503bb, 0x0382fc60, 0x017fe427, 0x013ef9fb, 0x00ac0f22, 0x0035288b}}, Y: Field{[10]uint32{0x02ce752b, 0x02bdae0e, 0x02860341, 0x00442a0b, 0x02232603, 0x01238d1a, 0x01133495, 0x00b824a9, 0x02973062, 0x00209a3f}}}, + {X: Field{[10]uint32{0x00c11659, 0x01653ee7, 0x0003c077, 0x02ee1df7, 0x0111d4d2, 0x001c27ee, 0x0014963b, 0x02f87635, 0x03ff15ad, 0x0012933c}}, Y: Field{[10]uint32{0x01ced874, 0x03b75834, 0x0336fc2d, 0x002f0e7f, 0x035109a3, 0x03a992b4, 0x00418100, 0x0254a989, 0x018336f1, 0x0015f211}}}, + {X: Field{[10]uint32{0x018e1539, 0x026fc305, 0x02f441f6, 0x009e1c72, 0x00e85e0b, 0x00b28992, 0x00836cf4, 0x0354c263, 0x00edb580, 0x0016303b}}, Y: Field{[10]uint32{0x0042467e, 0x005e0fba, 0x03fd7412, 0x0027e847, 0x0292e54a, 0x000b346a, 0x023d36f7, 0x02f25139, 0x00491e1d, 0x003abde7}}}, + {X: Field{[10]uint32{0x024892bb, 0x03326fdc, 0x0016f634, 0x0009fd39, 0x03261323, 0x03961a8c, 0x02154f3f, 0x01fa24e2, 0x00e8a60c, 0x002c3ef4}}, Y: Field{[10]uint32{0x02a5d3c3, 0x00cc31e0, 0x03d079a0, 0x024c4df0, 0x026dd83f, 0x0012662e, 0x00fcb501, 0x03d036d5, 0x027d6757, 0x0009ee9d}}}, + {X: Field{[10]uint32{0x0192f0d3, 0x01b630b6, 0x000818c1, 0x03de132d, 0x00ee90c2, 0x013bc611, 0x01fecf3e, 0x004d6849, 0x012a26b0, 0x002a52b8}}, Y: Field{[10]uint32{0x018e2050, 0x0229d808, 0x03c95bbc, 0x00d8221d, 0x02e046fe, 0x02ee8f59, 0x0016a6f6, 0x01d6571e, 0x03ba665e, 0x0028dd11}}}, + {X: Field{[10]uint32{0x00dcbeb5, 0x02f8c223, 0x02eeb9ad, 0x0101cc16, 0x00c540e2, 0x03e40137, 0x036c4844, 0x013eb8ca, 0x009b3eb7, 0x00232f6c}}, Y: Field{[10]uint32{0x00c932fe, 0x01cb3d0d, 0x023b810e, 0x01146d27, 0x01912df7, 0x0139685a, 0x007b14c0, 0x03bf4bfc, 0x03a291f6, 0x0000ae18}}}, + {X: Field{[10]uint32{0x00cdbac8, 0x00e721cd, 0x03afcf8f, 0x0071034d, 0x020ab313, 0x01422af5, 0x02fb89ed, 0x03af8731, 0x02c3b70e, 0x000fe33e}}, Y: Field{[10]uint32{0x0158b65e, 0x0124e84b, 0x01321f0c, 0x021ed10f, 0x01a68b52, 0x0122592d, 0x00b303db, 0x03c975e5, 0x0111846e, 0x0036ec08}}}, + {X: Field{[10]uint32{0x0315b25b, 0x01f69837, 0x004b9054, 0x0136ceb2, 0x0331fcaf, 0x020598c2, 0x03e9a4e1, 0x039e704b, 0x00e0cea3, 0x002d8581}}, Y: Field{[10]uint32{0x01b86801, 0x03a7660a, 0x0192cea2, 0x02224063, 0x00317d53, 0x02849929, 0x0265b41b, 0x03e96d59, 0x03ad9ea0, 0x0006abca}}}, + {X: Field{[10]uint32{0x011327d7, 0x021bbc11, 0x00a3f07c, 0x028d9347, 0x02fa51bd, 0x03ef5a2d, 0x026630a7, 0x02ce3870, 0x00103c6a, 0x003ac39d}}, Y: Field{[10]uint32{0x00e82e6d, 0x01a05eb8, 0x037d44c3, 0x0330bb8d, 0x0045cdaa, 0x027edd0e, 0x001c9c7d, 0x034f0655, 0x001757c4, 0x0037e814}}}, + {X: Field{[10]uint32{0x0156b7ae, 0x0342fda5, 0x0144f4bc, 0x01f92c95, 0x031fcfdd, 0x01d8b012, 0x02d28126, 0x03993236, 0x0103be51, 0x0018dbf1}}, Y: Field{[10]uint32{0x013f4cd9, 0x021c0e8c, 0x011e6984, 0x0375414b, 0x02b633c8, 0x022df621, 0x03b6735a, 0x010525fc, 0x030f0510, 0x0015ee0e}}}, + {X: Field{[10]uint32{0x012ab330, 0x031cd639, 0x02288c15, 0x01953a8f, 0x005ba9dc, 0x034b7867, 0x02fc2bd1, 0x008d6f1a, 0x00ec4d42, 0x000bf31c}}, Y: Field{[10]uint32{0x016a30ce, 0x01df9949, 0x01069395, 0x03a09467, 0x0135bde8, 0x03f36da5, 0x024cbbfc, 0x00788b6d, 0x00182bfa, 0x001a8d58}}}, + {X: Field{[10]uint32{0x02a94b54, 0x0043889f, 0x007d01cd, 0x0396f56f, 0x0183be81, 0x01af7ea5, 0x00969ebd, 0x02e2ff6e, 0x02c38d38, 0x00045401}}, Y: Field{[10]uint32{0x0080e08a, 0x01687508, 0x02780250, 0x00e9cc94, 0x023fac02, 0x01ba1e00, 0x0339e83f, 0x00feea6b, 0x010216eb, 0x001810eb}}}, + {X: Field{[10]uint32{0x01b3aaf1, 0x0194fca3, 0x019a515b, 0x021afb70, 0x013756a9, 0x03f95340, 0x00a2da82, 0x0070a583, 0x025a15ba, 0x00005f55}}, Y: Field{[10]uint32{0x03c7399c, 0x012b5ea6, 0x00c35f27, 0x0064cd4d, 0x027a6338, 0x0274c494, 0x00b05aab, 0x002cf92e, 0x01dd4204, 0x00245eee}}}, + {X: Field{[10]uint32{0x03221ef2, 0x01d31b5a, 0x0330e023, 0x022ad20b, 0x01d2af8f, 0x00f96f2a, 0x00598f7a, 0x00710c2e, 0x00898850, 0x00037309}}, Y: Field{[10]uint32{0x03652e72, 0x01919193, 0x02b0a578, 0x02d667c7, 0x01cd14ca, 0x03c037b3, 0x03102a6e, 0x03b14ac7, 0x017dd5c6, 0x002a165d}}}, + {X: Field{[10]uint32{0x011f0b0f, 0x00fea3cd, 0x03a03d83, 0x030f50f2, 0x03ae2cf9, 0x03a0229f, 0x01919db6, 0x00c2df37, 0x039f4e94, 0x0029a2ca}}, Y: Field{[10]uint32{0x00786526, 0x0096f165, 0x00f66d65, 0x0137cbe7, 0x017f45b1, 0x009de008, 0x015614d9, 0x00248e3a, 0x0232d3ad, 0x0038d2e2}}}, + {X: Field{[10]uint32{0x010e9462, 0x0020a7e3, 0x013c2319, 0x005d1c0b, 0x01fe7e2f, 0x02b5654e, 0x02d11e9e, 0x00466174, 0x025a938e, 0x000be553}}, Y: Field{[10]uint32{0x03b16dd5, 0x02ac79c2, 0x02c61e55, 0x02fe7e26, 0x01f6aaa6, 0x01a8e4ec, 0x02fecc84, 0x01f502e8, 0x0379fa8b, 0x002cbc34}}}, + {X: Field{[10]uint32{0x027ffe4f, 0x00e4e330, 0x03556fa9, 0x0234f33f, 0x033cc33c, 0x02ecb77a, 0x03fcae86, 0x0253f66c, 0x01136bca, 0x00088f4f}}, Y: Field{[10]uint32{0x01512915, 0x01329614, 0x00ec09c7, 0x02294eed, 0x0327f6cd, 0x00f58866, 0x016f7dd8, 0x0061f309, 0x0106e317, 0x0021f864}}}, + {X: Field{[10]uint32{0x028f7b2e, 0x020d2b67, 0x02abf517, 0x00ae83ce, 0x00b61443, 0x02d3d257, 0x01f3a3e9, 0x0186d90f, 0x00e82911, 0x00156476}}, Y: Field{[10]uint32{0x026d07c2, 0x03bd6503, 0x01416673, 0x01fb1028, 0x0130b3fe, 0x02e91c67, 0x03d454eb, 0x01f94b66, 0x0235f626, 0x000b235a}}}, + {X: Field{[10]uint32{0x01f29a29, 0x024dd451, 0x02252c8e, 0x0078b939, 0x03414184, 0x027a6bbe, 0x00cbaecb, 0x0068521c, 0x004ad15d, 0x003acb3f}}, Y: Field{[10]uint32{0x0052e5ac, 0x019c855c, 0x00b955bc, 0x0035b4d7, 0x00e62f21, 0x01d94054, 0x0304c79c, 0x03664ade, 0x020810bf, 0x001e2043}}}, + {X: Field{[10]uint32{0x00a3f74b, 0x0178fa7b, 0x0392700d, 0x01f4b867, 0x02bdcdb4, 0x00e7310d, 0x00b1d4c5, 0x02a06179, 0x03f99680, 0x001844b0}}, Y: Field{[10]uint32{0x00da4403, 0x03694ae6, 0x00f353b8, 0x01f1a9a4, 0x02f2579d, 0x007db2a5, 0x008f9d40, 0x022feb6b, 0x03dd723c, 0x001ba182}}}, + {X: Field{[10]uint32{0x03d58b16, 0x02477b69, 0x015797b3, 0x00535f8c, 0x03b9b329, 0x0283c5f0, 0x002c23b9, 0x0362c031, 0x00d8d552, 0x00224848}}, Y: Field{[10]uint32{0x01cf7941, 0x0008c5ad, 0x00edf325, 0x025b33c3, 0x03cc4a94, 0x02f7300d, 0x013d1f64, 0x01e3cbe4, 0x03acb3c7, 0x00398948}}}, + {X: Field{[10]uint32{0x03c4dc0a, 0x0347a447, 0x021c5ecb, 0x01245a11, 0x0160ca4a, 0x018c1129, 0x03155839, 0x034ef808, 0x0056217a, 0x0011d62d}}, Y: Field{[10]uint32{0x01d83679, 0x0121e336, 0x027ca960, 0x01ec0f13, 0x03bb7498, 0x030c2b06, 0x03eec6a1, 0x025cfc15, 0x015a4f30, 0x00267909}}}, + {X: Field{[10]uint32{0x025629da, 0x039d5d5b, 0x02143b99, 0x031f658b, 0x03a3b95d, 0x01e11e6b, 0x03a0c6f9, 0x01ea1e5f, 0x02a69a20, 0x002ac108}}, Y: Field{[10]uint32{0x01823faa, 0x01b8b8e9, 0x02dfa7a0, 0x01c12653, 0x0184af0f, 0x02e37f3b, 0x00280c32, 0x026157af, 0x010f00fc, 0x001cce63}}}, + {X: Field{[10]uint32{0x0145d227, 0x02b50fb5, 0x01b20ee7, 0x02983c28, 0x01852cc7, 0x020a4dd3, 0x010b4c35, 0x002c50c3, 0x032accb9, 0x00066010}}, Y: Field{[10]uint32{0x028b05c5, 0x023696e7, 0x01546766, 0x03e3cb94, 0x0069c919, 0x02e626f4, 0x03d1a0e9, 0x0233acab, 0x0073bfbc, 0x0025ab8e}}}, + {X: Field{[10]uint32{0x00e93f17, 0x01894bb8, 0x010cbb71, 0x0055d0f5, 0x0293b8a0, 0x02aefbcf, 0x0361cd72, 0x03eceb29, 0x037fe2df, 0x0010a204}}, Y: Field{[10]uint32{0x02238825, 0x0021b76a, 0x008de456, 0x0011679e, 0x0271fddb, 0x03681d9c, 0x01855f14, 0x019a9bef, 0x033e36c3, 0x00300b0c}}}, + {X: Field{[10]uint32{0x02b6cde2, 0x024a06b5, 0x03d3d52d, 0x01db836d, 0x0077e432, 0x02a9cfe9, 0x03c4d160, 0x0227682b, 0x003505bc, 0x003597eb}}, Y: Field{[10]uint32{0x0007383f, 0x01e11e30, 0x02b13056, 0x03906221, 0x038e9f07, 0x000e18b4, 0x01005456, 0x03ccded1, 0x0175a6c5, 0x0039bd32}}}, + {X: Field{[10]uint32{0x018f6ca7, 0x00665e2e, 0x014c843e, 0x021346ca, 0x02beb967, 0x0181e4db, 0x028b54e1, 0x0349e93f, 0x0144e62d, 0x001c0a6c}}, Y: Field{[10]uint32{0x0140a25c, 0x023ca99c, 0x0114aa47, 0x011f1cf7, 0x009a1af3, 0x0155113c, 0x02c90c38, 0x01b1b8e8, 0x01665805, 0x0022c43b}}}, + {X: Field{[10]uint32{0x039183b2, 0x0256d0f3, 0x01711502, 0x013911c5, 0x01fa343e, 0x01768306, 0x00ea87da, 0x026f77a0, 0x00ebdf96, 0x0013c9d8}}, Y: Field{[10]uint32{0x03e28167, 0x00a59de0, 0x03425d46, 0x017536bf, 0x0115d862, 0x023da6da, 0x001fd39b, 0x03bc27e8, 0x017bf3f9, 0x0010f8b0}}}, + {X: Field{[10]uint32{0x0374a5fc, 0x01c98570, 0x03e52143, 0x015fcbb9, 0x01b573ce, 0x02e7e94e, 0x015f0d23, 0x025aa3cd, 0x02addb41, 0x0033265a}}, Y: Field{[10]uint32{0x028ef28d, 0x027cb702, 0x019232c0, 0x02b6fffe, 0x0144284b, 0x02fa1744, 0x00a9cb66, 0x00a4d70c, 0x03871878, 0x002c7103}}}, + {X: Field{[10]uint32{0x014ade42, 0x010c0f35, 0x006313cf, 0x0214ef6b, 0x01cd9b32, 0x017adc24, 0x0038e398, 0x036416cb, 0x02d3f3e3, 0x0031e062}}, Y: Field{[10]uint32{0x00339eee, 0x01feebe5, 0x03937800, 0x03f747d7, 0x033403a5, 0x030510f3, 0x0363fb0f, 0x02142c51, 0x004e7bbb, 0x001555d3}}}, + {X: Field{[10]uint32{0x0189c4fd, 0x01d5cdc9, 0x0045e52a, 0x03279de5, 0x009a45db, 0x02b97496, 0x0344d1f3, 0x023affd0, 0x01846fc4, 0x001b340d}}, Y: Field{[10]uint32{0x03416e34, 0x03a33224, 0x00723a44, 0x024a34b5, 0x014d811c, 0x039347ea, 0x0367dda8, 0x038dc6b7, 0x037db165, 0x002bea16}}}, + {X: Field{[10]uint32{0x003b2e0a, 0x03aeeb51, 0x00fd3bfa, 0x02491d37, 0x00f5231b, 0x004548c5, 0x02b72359, 0x02c6b98c, 0x0205f716, 0x003594a8}}, Y: Field{[10]uint32{0x013bedcf, 0x02281bae, 0x02dcba45, 0x008fb059, 0x03c4646a, 0x03780f62, 0x002f0d85, 0x0103df2e, 0x0021b782, 0x00348661}}}, + {X: Field{[10]uint32{0x0052fb54, 0x0014be37, 0x02d73a6a, 0x02bf4d38, 0x0181ff0b, 0x00d00116, 0x01b3e4fe, 0x012877e6, 0x004dcd84, 0x002a01f4}}, Y: Field{[10]uint32{0x02e2cd9a, 0x0067a7e8, 0x03151af0, 0x011e5f3e, 0x00c385c0, 0x03eef1c6, 0x03e5079f, 0x0260d4ee, 0x00bb7393, 0x0006229e}}}, + {X: Field{[10]uint32{0x009eb2d7, 0x03f705f3, 0x02de224e, 0x017a7d33, 0x01b8c3a9, 0x01b2c0ae, 0x03acd07d, 0x02b523a4, 0x03bca5d6, 0x0007bf4a}}, Y: Field{[10]uint32{0x02745b39, 0x00fbbcd9, 0x01a05006, 0x02baa2bc, 0x0202a9d2, 0x02ecd5fd, 0x03e191a1, 0x031f98d5, 0x03881b98, 0x003e547b}}}, + {X: Field{[10]uint32{0x0395888f, 0x002e6b08, 0x01f666ed, 0x004df0ef, 0x030ea0ff, 0x025ff838, 0x02bcd044, 0x00f6d660, 0x0254d27d, 0x00016f17}}, Y: Field{[10]uint32{0x02ec3300, 0x03d97ca0, 0x003754c1, 0x01d409c4, 0x025a22d9, 0x00c86cda, 0x01f8b857, 0x03ac0598, 0x0002d4f4, 0x000d556f}}}, + {X: Field{[10]uint32{0x006a3247, 0x02e023dd, 0x02f221f5, 0x01c456f9, 0x02158cca, 0x022b4bc7, 0x022ea80e, 0x0234379b, 0x028d26b0, 0x0003d802}}, Y: Field{[10]uint32{0x03ca3523, 0x02ceac62, 0x00aa3cd5, 0x0371945b, 0x0276c753, 0x03a3846e, 0x02f75b28, 0x03e96c1f, 0x02134bc3, 0x0008ef96}}}, + {X: Field{[10]uint32{0x00ccaf7b, 0x00af49a4, 0x0381ae49, 0x030db1cf, 0x01f5119b, 0x0396404d, 0x01712a8b, 0x029ea331, 0x020b2ab2, 0x003f1f93}}, Y: Field{[10]uint32{0x001151a6, 0x03242ace, 0x01cddb31, 0x02d6aa0d, 0x01e4a682, 0x01b7624a, 0x02862b8a, 0x011a41ba, 0x02f41f27, 0x0012f584}}}, + {X: Field{[10]uint32{0x01442655, 0x00eced62, 0x01700bcd, 0x0161daaa, 0x0141641d, 0x01e6d8f9, 0x0067eecd, 0x03402feb, 0x033cfe12, 0x00144c97}}, Y: Field{[10]uint32{0x033ef941, 0x00de92c4, 0x03b33a44, 0x03964730, 0x03982a35, 0x01e595ff, 0x01623605, 0x039b8b6e, 0x00ad7b7a, 0x0035aa25}}}, + {X: Field{[10]uint32{0x0198aec8, 0x009b92b1, 0x03a09056, 0x01b6e3fb, 0x02afee9a, 0x005fc00e, 0x01bd2d57, 0x03d823c8, 0x00271a55, 0x000b6ceb}}, Y: Field{[10]uint32{0x03f9533e, 0x03832226, 0x03dd6e0d, 0x01a2d1f3, 0x013c6621, 0x0199827d, 0x00c9fc9d, 0x00718307, 0x0333a0c0, 0x003149af}}}, + {X: Field{[10]uint32{0x01fa7dcc, 0x03481775, 0x01be51e1, 0x00d8fce4, 0x0135fbd4, 0x01f790c8, 0x0305b554, 0x02c06d7a, 0x037293de, 0x00024201}}, Y: Field{[10]uint32{0x02d7442d, 0x01304097, 0x03f23e03, 0x02134f30, 0x0164dfef, 0x01718856, 0x013d318b, 0x00ccdc19, 0x02ac1724, 0x003fa587}}}, + {X: Field{[10]uint32{0x039ed9d6, 0x030def0c, 0x017cce2e, 0x02b4f4d6, 0x03045557, 0x01e43353, 0x02cc03f6, 0x013f20b6, 0x0181e5a6, 0x000ca86b}}, Y: Field{[10]uint32{0x027cb07a, 0x01c41898, 0x02cf3d13, 0x0362a41d, 0x0279cb55, 0x01e573b1, 0x017b63ca, 0x000089c2, 0x03681801, 0x0021eaf3}}}, + {X: Field{[10]uint32{0x019246f9, 0x01c745d3, 0x016e9a37, 0x027556ce, 0x0108c584, 0x01c745ea, 0x031af769, 0x02714683, 0x00fa5868, 0x003df2ea}}, Y: Field{[10]uint32{0x0358ee45, 0x01ee7b2b, 0x0072cac3, 0x030bf20c, 0x025309a0, 0x01757ee8, 0x024d7333, 0x02a72bb6, 0x03a910d5, 0x003d2c2a}}}, + {X: Field{[10]uint32{0x0329ea81, 0x022be098, 0x006d58ee, 0x0156b9c1, 0x03fab75f, 0x0015e690, 0x01b6b7bc, 0x00036759, 0x01042da9, 0x003369ac}}, Y: Field{[10]uint32{0x011771e3, 0x035bc773, 0x000fc068, 0x038a6b1f, 0x01a8ee20, 0x038d8078, 0x01171a01, 0x01d00568, 0x000eacfd, 0x001c321b}}}, + {X: Field{[10]uint32{0x027ee58b, 0x021e3c3d, 0x03f2ac23, 0x032b446d, 0x01a46f3b, 0x0113282f, 0x00f27b05, 0x02c73a6a, 0x024009c5, 0x00289869}}, Y: Field{[10]uint32{0x03fff888, 0x01b9043c, 0x014d420c, 0x030c1496, 0x0185da67, 0x034cf5c9, 0x029cda8f, 0x036ba6d3, 0x031d4c42, 0x000789a9}}}, + {X: Field{[10]uint32{0x01f4db57, 0x0252e9ba, 0x028846b3, 0x00f1a0bd, 0x009435aa, 0x007edb4d, 0x018e885d, 0x0210b300, 0x0167fd7f, 0x002f1c32}}, Y: Field{[10]uint32{0x00bd9468, 0x0213847e, 0x03e5718d, 0x03121f11, 0x013032ef, 0x01e195c0, 0x00a07840, 0x00b78310, 0x013a837e, 0x0028ae67}}}, + {X: Field{[10]uint32{0x0077a9c2, 0x000e269c, 0x020269c6, 0x019c4147, 0x02c7a265, 0x03ebc8d2, 0x03fdba3f, 0x00c52532, 0x02f75dc4, 0x000d9054}}, Y: Field{[10]uint32{0x0146d265, 0x0130ca81, 0x018eae08, 0x000496f3, 0x013c8fa6, 0x03b79c75, 0x038ae4e7, 0x02150cc0, 0x03d9f4ec, 0x002b0eb1}}}, + {X: Field{[10]uint32{0x00f3043d, 0x01b765a5, 0x01326cc3, 0x00be8f62, 0x01d82ca4, 0x01008b7e, 0x02f59d8e, 0x01756364, 0x00bed57d, 0x0014bfa9}}, Y: Field{[10]uint32{0x004feb35, 0x0150a363, 0x0399b249, 0x00216daa, 0x005708c6, 0x0299ece7, 0x038f9a37, 0x0229d7dc, 0x032852f9, 0x002dfa60}}}, + {X: Field{[10]uint32{0x023e1a4d, 0x035a08a1, 0x03ce67b8, 0x030f4af8, 0x039c32ec, 0x026b0ffe, 0x033a096a, 0x032203e5, 0x0110c8ba, 0x000d3fba}}, Y: Field{[10]uint32{0x009c7a17, 0x0155881a, 0x008b2243, 0x02825c74, 0x002231f6, 0x008b8983, 0x00db14b1, 0x03111b1e, 0x00969c9d, 0x00383c04}}}, + {X: Field{[10]uint32{0x0349c65b, 0x026cef76, 0x024bb401, 0x02c3d1da, 0x030f815a, 0x007c1dbd, 0x02424ec3, 0x034ba064, 0x030bf4c9, 0x001abca3}}, Y: Field{[10]uint32{0x02a45248, 0x0143fadb, 0x005d3f13, 0x03742f29, 0x0017d1e1, 0x005fd819, 0x01aa3469, 0x00ecc46a, 0x012fbb66, 0x000b157f}}}, + {X: Field{[10]uint32{0x01320e46, 0x01d3dc93, 0x0003b8bc, 0x0204eebb, 0x03a4f0ad, 0x02b174db, 0x00f1b6b6, 0x02d07991, 0x036639e4, 0x001c2daa}}, Y: Field{[10]uint32{0x02913a14, 0x02030622, 0x02c95237, 0x01777f37, 0x0196f713, 0x025b4f37, 0x01ad5f10, 0x013f3346, 0x01e64f4e, 0x003b1902}}}, + {X: Field{[10]uint32{0x0065724d, 0x00212068, 0x000bc155, 0x01a84e18, 0x03061419, 0x03df6ef8, 0x03eff50f, 0x01d6bab6, 0x03114ab9, 0x003b795b}}, Y: Field{[10]uint32{0x0336ecfc, 0x02b7f254, 0x0173c02d, 0x018dbbf7, 0x0371906b, 0x006c1a12, 0x01839dc6, 0x0087b49b, 0x024c11f4, 0x00279feb}}}, + {X: Field{[10]uint32{0x016df8a4, 0x01f0f915, 0x03efe685, 0x03e7c5a0, 0x025de54a, 0x01992399, 0x0019d746, 0x01cc40f6, 0x003c840a, 0x0020f0d3}}, Y: Field{[10]uint32{0x0086cd10, 0x035c2903, 0x0040fd31, 0x00dfc426, 0x0290aa81, 0x0338bbb4, 0x00d97719, 0x035b03bb, 0x0041562d, 0x002708e0}}}, + {X: Field{[10]uint32{0x00c7e200, 0x00164f68, 0x037c6102, 0x0114934d, 0x0052cbdb, 0x0017a1e9, 0x028cf032, 0x026e6148, 0x00900008, 0x002a8abf}}, Y: Field{[10]uint32{0x02be01f4, 0x017309e5, 0x006af2db, 0x0093fa2a, 0x006d8129, 0x00c58780, 0x013bc4fa, 0x02b0674f, 0x016ab382, 0x000d10c6}}}, + {X: Field{[10]uint32{0x0155c520, 0x01d5cc10, 0x02800e3a, 0x0116207b, 0x03e90eb0, 0x03efdc7e, 0x02956a02, 0x03322e7c, 0x03dc4310, 0x00390bb1}}, Y: Field{[10]uint32{0x0225336c, 0x0099e735, 0x027b693c, 0x011562af, 0x012d0009, 0x02369536, 0x00324bbe, 0x02473f88, 0x02cfa52d, 0x0024e7bc}}}, + {X: Field{[10]uint32{0x02ec2b21, 0x0315818c, 0x01dd34a3, 0x02ac99ff, 0x00181617, 0x005bbe7d, 0x038de47a, 0x014803f5, 0x0124937c, 0x002f02f7}}, Y: Field{[10]uint32{0x02b63035, 0x034a64d4, 0x03ac9df6, 0x00448175, 0x004a0285, 0x024ac21c, 0x02e0e1d1, 0x0087de61, 0x024c10b5, 0x00036c12}}}, + {X: Field{[10]uint32{0x01adc8e7, 0x013aebab, 0x03990626, 0x03559037, 0x0155c005, 0x03dd838a, 0x0310fbb3, 0x029ccd78, 0x01d89b43, 0x00372232}}, Y: Field{[10]uint32{0x002fc512, 0x00f2353f, 0x0163625a, 0x00cb308f, 0x033fe37b, 0x027faded, 0x03fc6777, 0x011e5196, 0x01e46f98, 0x000b59de}}}, + {X: Field{[10]uint32{0x00111c20, 0x0278d260, 0x03210f6f, 0x01422315, 0x035ee3dc, 0x00175dbb, 0x030cb02e, 0x00cb18bf, 0x018ab0c9, 0x0029eb83}}, Y: Field{[10]uint32{0x02e553a2, 0x001f6864, 0x03cdd01d, 0x0115a48c, 0x03ac8dcc, 0x00c87794, 0x039dc94b, 0x018b2262, 0x03c9d631, 0x00358caa}}}, + {X: Field{[10]uint32{0x00be0e97, 0x0296b317, 0x03215592, 0x026e97c0, 0x00d631ac, 0x01f69b99, 0x0203af75, 0x01baaf6c, 0x036ee7bd, 0x00118808}}, Y: Field{[10]uint32{0x00627c6e, 0x025da40a, 0x018c88fa, 0x02f1c0a3, 0x02707851, 0x03eb99a8, 0x0330cdf4, 0x0078a9b3, 0x004f69ea, 0x00177d09}}}, + {X: Field{[10]uint32{0x03d8f671, 0x036647c9, 0x00a38e2b, 0x03fcd276, 0x015cd35f, 0x03e4c8c0, 0x0350acac, 0x0364c147, 0x004a3d8b, 0x0020132e}}, Y: Field{[10]uint32{0x00ae8d3f, 0x026a391c, 0x01267bbc, 0x014aef9b, 0x00cdc395, 0x000d884a, 0x02b2f192, 0x03e0d65a, 0x00129ee0, 0x0012ddee}}}, + {X: Field{[10]uint32{0x011c2ed2, 0x0076ef6e, 0x032378e7, 0x01343881, 0x02b4f6fb, 0x02918e44, 0x001fcbee, 0x02cbcae0, 0x030f5382, 0x001ba94d}}, Y: Field{[10]uint32{0x00b2d88d, 0x02f85064, 0x025b1a8b, 0x038b4de0, 0x008b513e, 0x006567b2, 0x012a002f, 0x03fc203a, 0x0109d8f3, 0x003d6d3e}}}, + {X: Field{[10]uint32{0x02e22ba6, 0x031c1ca8, 0x01f4769f, 0x000ee068, 0x031ee564, 0x03d871ac, 0x03b0852a, 0x01d6984a, 0x021c4ff5, 0x00362e37}}, Y: Field{[10]uint32{0x02468c0e, 0x00e37d38, 0x018928d5, 0x032d1ec1, 0x01f23cbd, 0x017095b9, 0x02ad8275, 0x02fe2625, 0x0190d37a, 0x00078f10}}}, + {X: Field{[10]uint32{0x01f1b147, 0x0320a47b, 0x00a9e475, 0x019c1420, 0x0080d384, 0x00e8035b, 0x033f3ea4, 0x02f5ba71, 0x006404a0, 0x0019ab06}}, Y: Field{[10]uint32{0x03a1260e, 0x02207313, 0x030bca61, 0x0319cf6a, 0x029be98e, 0x0147868d, 0x0103efd5, 0x02ddd805, 0x000f7db6, 0x000b3183}}}, + {X: Field{[10]uint32{0x0360e942, 0x0314d9cf, 0x0185bef3, 0x00d70dd7, 0x02f27844, 0x022d6972, 0x0263cf93, 0x008f9c1d, 0x022c4ed2, 0x0011c652}}, Y: Field{[10]uint32{0x03d9f920, 0x01213034, 0x036045f4, 0x033aaf7d, 0x035808a3, 0x01409f55, 0x032738c7, 0x03704def, 0x011b5a64, 0x002c3f78}}}, + {X: Field{[10]uint32{0x024c6186, 0x034f3d0a, 0x0229010b, 0x00ab17c1, 0x009fdc1b, 0x02375da3, 0x02747428, 0x03660e20, 0x00599af2, 0x00045072}}, Y: Field{[10]uint32{0x02f0226e, 0x014234fb, 0x02c64d6b, 0x034aea63, 0x005392a0, 0x015e343e, 0x017555a0, 0x01184ccc, 0x034761ed, 0x001e90c7}}}, + {X: Field{[10]uint32{0x03496f79, 0x00c030f9, 0x0251d4ba, 0x03585ab1, 0x01487002, 0x03ee3952, 0x01da689b, 0x03fa7b59, 0x01d8e80a, 0x003e416f}}, Y: Field{[10]uint32{0x03bfcf72, 0x0096c65d, 0x000fca7e, 0x0317e7d3, 0x03cd999f, 0x01fc1419, 0x021b03ba, 0x01411751, 0x037f3bfb, 0x0007b1ef}}}, + {X: Field{[10]uint32{0x0315e9e0, 0x03c7eb03, 0x023e5573, 0x00beb51e, 0x00232ea6, 0x0053c2be, 0x004faadb, 0x014bb88f, 0x00e4fba4, 0x002e952e}}, Y: Field{[10]uint32{0x00f5cda8, 0x02f52818, 0x030b8da1, 0x002c044d, 0x039c96ed, 0x00ab203c, 0x018e48a8, 0x02ef36ef, 0x02e9efca, 0x002bd55a}}}, + {X: Field{[10]uint32{0x0226a80a, 0x028a2d02, 0x035e9c08, 0x01080e9d, 0x001494a0, 0x00d868ad, 0x0287f3cf, 0x01b890c3, 0x02d0561f, 0x001674fa}}, Y: Field{[10]uint32{0x000a9bc8, 0x007863c0, 0x015d9ac5, 0x00730b42, 0x02f5f1ba, 0x009f1cc1, 0x00a278d4, 0x0088a70a, 0x007d50a9, 0x0026c9bd}}}, + {X: Field{[10]uint32{0x00865d47, 0x03641c2b, 0x00f5b129, 0x0023bfc0, 0x0315520a, 0x01f83cf3, 0x032924be, 0x0324a363, 0x023fab4c, 0x000a9b96}}, Y: Field{[10]uint32{0x00a625a5, 0x01dc60d7, 0x000cb38b, 0x037ba4e0, 0x00919913, 0x01824d47, 0x01191964, 0x01c08e1b, 0x03505872, 0x00015700}}}, + {X: Field{[10]uint32{0x00907502, 0x022c00aa, 0x03d84682, 0x00716aba, 0x01fff1fb, 0x010b3d96, 0x00afe918, 0x03b90422, 0x00d1c35b, 0x002263d4}}, Y: Field{[10]uint32{0x02f3267b, 0x02e3e3d8, 0x01a79daf, 0x03c528f1, 0x02fc9bd0, 0x01ae1300, 0x0202e490, 0x00ab406b, 0x0280c97c, 0x002c915b}}}, + {X: Field{[10]uint32{0x016af85a, 0x03119c43, 0x03bf9422, 0x028eb013, 0x03bda5d9, 0x027b8f34, 0x01d2304e, 0x03c32c7e, 0x02b8b49b, 0x00346152}}, Y: Field{[10]uint32{0x03155c20, 0x03fafa51, 0x03fabd0a, 0x00085f7d, 0x00d7bdeb, 0x00fb77cd, 0x016a0775, 0x0206016c, 0x000fd881, 0x00013894}}}, + {X: Field{[10]uint32{0x02af4680, 0x037f19bf, 0x01303a3e, 0x03d0a15b, 0x024a417d, 0x025a3bdf, 0x03cc787d, 0x02db87c0, 0x008a394d, 0x002187ee}}, Y: Field{[10]uint32{0x02135da6, 0x0348d882, 0x018dddc6, 0x022f6f00, 0x0268f3c3, 0x018e3380, 0x03ff11b0, 0x002c4c8f, 0x015aab8b, 0x002975fa}}}, + {X: Field{[10]uint32{0x013403d6, 0x033d8b60, 0x0111cb0c, 0x000ce7f0, 0x03ea5269, 0x019db3de, 0x0155d90b, 0x0277f0f0, 0x0368b9fa, 0x0025513d}}, Y: Field{[10]uint32{0x006e047f, 0x02659c20, 0x0290253e, 0x000d78c0, 0x0328d876, 0x02fd4552, 0x011ed21b, 0x01893c21, 0x012fcbde, 0x0033b136}}}, + {X: Field{[10]uint32{0x01db68e9, 0x01732a34, 0x009ba2cb, 0x0034edc5, 0x00311cd4, 0x027ce825, 0x00d7b078, 0x019af88f, 0x0192f80a, 0x003ddc88}}, Y: Field{[10]uint32{0x001b516e, 0x03bf83f2, 0x03462d40, 0x00809dfd, 0x011c11e3, 0x03321479, 0x02266610, 0x035939cf, 0x029f3243, 0x00010743}}}, + {X: Field{[10]uint32{0x018e14ed, 0x0381eb5a, 0x02fc1be9, 0x01f10e7d, 0x01b6bd8e, 0x027aa479, 0x039927a8, 0x01ca6f6f, 0x00651f88, 0x0021dad3}}, Y: Field{[10]uint32{0x016b49da, 0x00c7773e, 0x004e16ad, 0x02121aae, 0x037b5730, 0x018bc94d, 0x0387b88f, 0x03a7773d, 0x03811cfa, 0x003b38b3}}}, + {X: Field{[10]uint32{0x03b70b10, 0x032c0f01, 0x03127b7e, 0x03d8cd4e, 0x00721be8, 0x0245e267, 0x00614278, 0x02649221, 0x00e46224, 0x001c1abd}}, Y: Field{[10]uint32{0x0258a5f3, 0x0141ba5f, 0x03545aa6, 0x0383984b, 0x00cdcf0e, 0x004f7add, 0x015bd298, 0x0348039a, 0x01720c65, 0x00325cb6}}}, + {X: Field{[10]uint32{0x03863c9d, 0x0256df7c, 0x03ddef14, 0x016fe745, 0x024301b7, 0x009f97d2, 0x00dde0ba, 0x01898ad7, 0x0218c9c9, 0x0033a5e8}}, Y: Field{[10]uint32{0x02a1ef10, 0x01c2b280, 0x03f55c57, 0x02c9cac0, 0x01c12900, 0x01ebda3c, 0x0116410d, 0x00509a22, 0x021a20fd, 0x003a4e63}}}, + {X: Field{[10]uint32{0x013be895, 0x03991275, 0x019bca8f, 0x03afa6cf, 0x037dae0f, 0x00b6cf54, 0x02a1f01c, 0x020c7a21, 0x039a92cf, 0x003ed896}}, Y: Field{[10]uint32{0x02599a37, 0x0165f7a0, 0x0344c30d, 0x030a9947, 0x031fe2a8, 0x00b2fc88, 0x029d68f1, 0x02781028, 0x0274ba56, 0x001fde0f}}}, + {X: Field{[10]uint32{0x01f4747d, 0x00b16955, 0x01bc4c6b, 0x03ced0b7, 0x02f126c6, 0x020cc912, 0x039098a8, 0x00ae2d46, 0x03697a7d, 0x00207fef}}, Y: Field{[10]uint32{0x0006f33b, 0x000858bc, 0x00d0a8b0, 0x037b43f5, 0x0190b4d1, 0x0336aa9f, 0x013d5303, 0x03bedcc8, 0x0357982e, 0x0038b19c}}}, + {X: Field{[10]uint32{0x020ed0e4, 0x00c6d55a, 0x01ba8c0f, 0x01def9a5, 0x00679d6b, 0x002728bb, 0x016d4d63, 0x02adf2bc, 0x03668c30, 0x001b7f03}}, Y: Field{[10]uint32{0x015a563c, 0x03fe1f6c, 0x03d905ae, 0x00e2ff77, 0x01367724, 0x003d107a, 0x002d7a62, 0x02a9d0c6, 0x02b2d9a0, 0x002907b4}}}, + {X: Field{[10]uint32{0x03501b44, 0x03e530ce, 0x0023fe77, 0x037e22f3, 0x001d5715, 0x03d8f0ca, 0x01a9b5b0, 0x0395aae8, 0x01d1b953, 0x00071afc}}, Y: Field{[10]uint32{0x00e4b0ef, 0x00d82279, 0x02d3a8e3, 0x037e4688, 0x028f1e74, 0x01f0ae92, 0x01c368bf, 0x005e0806, 0x014db4ca, 0x003199c8}}}, + {X: Field{[10]uint32{0x02def93d, 0x03f491fe, 0x00ba6b2a, 0x03c3479e, 0x035417b9, 0x005134bc, 0x00632319, 0x027d8176, 0x02df5d99, 0x002da444}}, Y: Field{[10]uint32{0x018df4ae, 0x00d318d5, 0x020209a0, 0x01722508, 0x00464f11, 0x02b2b77b, 0x00fafeb8, 0x021b9c1c, 0x037a3028, 0x000858f3}}}, + {X: Field{[10]uint32{0x0176b6e0, 0x0192f792, 0x0287cda4, 0x03363805, 0x019737a2, 0x027be48a, 0x018b8fcf, 0x003e45f1, 0x0332ac23, 0x002f00e1}}, Y: Field{[10]uint32{0x025682d2, 0x007011a8, 0x00ab3719, 0x03677d8e, 0x017a7ae0, 0x01f88ce1, 0x03e1d6fa, 0x018dcd80, 0x02010079, 0x0000ce49}}}, + {X: Field{[10]uint32{0x03e32d81, 0x00faf689, 0x001ae183, 0x0032b7b4, 0x007489c2, 0x0166ec03, 0x024d9aee, 0x02b531aa, 0x02951047, 0x0025b7cc}}, Y: Field{[10]uint32{0x02e2034b, 0x02313bf8, 0x00466181, 0x03c7999d, 0x02cbfaa8, 0x01743c19, 0x01189bbf, 0x018cf060, 0x002d74ce, 0x001063db}}}, + {X: Field{[10]uint32{0x02304979, 0x034be9da, 0x001d263c, 0x03e8bcd4, 0x01cb6a65, 0x02d864f0, 0x02fcefde, 0x0102afb1, 0x0227939e, 0x0028f14c}}, Y: Field{[10]uint32{0x03c967e4, 0x0283b5b6, 0x00de8caf, 0x02637180, 0x0300f467, 0x01e8bd99, 0x0329ade3, 0x029bc64b, 0x02a5498e, 0x00111a32}}}, + {X: Field{[10]uint32{0x0145eb2b, 0x02bc2b49, 0x01a92601, 0x011ae475, 0x017a0c7d, 0x0385ca98, 0x005f1b31, 0x01b5b5ae, 0x02073dfd, 0x0024ff60}}, Y: Field{[10]uint32{0x0163a847, 0x025f51f5, 0x02866883, 0x026c82e2, 0x03961155, 0x02b3faec, 0x03ca8636, 0x01a9046f, 0x02c19a8a, 0x001806fa}}}, + {X: Field{[10]uint32{0x02ca0a9b, 0x01e82ea1, 0x00a2bee8, 0x027ad179, 0x01a5bc0d, 0x011a2b63, 0x039acef2, 0x018fc403, 0x03ef2e2c, 0x002e9f4e}}, Y: Field{[10]uint32{0x015114dc, 0x03bf2ba9, 0x02e097c6, 0x02c5eefc, 0x01376f29, 0x0316daf6, 0x0133ed0b, 0x0278c443, 0x02673312, 0x003fffe6}}}, + {X: Field{[10]uint32{0x036157a8, 0x010a4380, 0x03011190, 0x03ea5fbc, 0x00218898, 0x025935e9, 0x01972582, 0x0270d65d, 0x01c02a4f, 0x00383655}}, Y: Field{[10]uint32{0x01c617f0, 0x02ee6140, 0x0397baa2, 0x01a75699, 0x01b28cbc, 0x021c1de2, 0x0382f0f0, 0x002ee681, 0x039e7d42, 0x0005dbf7}}}, + {X: Field{[10]uint32{0x03f81ac9, 0x0111d42f, 0x02dcd0a4, 0x03f785d4, 0x036cd226, 0x01a435aa, 0x02da689c, 0x032e4c44, 0x01408320, 0x0005acb0}}, Y: Field{[10]uint32{0x018bb281, 0x031de436, 0x01edd2ab, 0x02494f19, 0x025025f7, 0x02a85edb, 0x0217488f, 0x00e4cbc9, 0x00e3dafd, 0x000a8beb}}}, + {X: Field{[10]uint32{0x01f502da, 0x00af043a, 0x020c7fc2, 0x02e3ad36, 0x02220db4, 0x02569053, 0x01d61d97, 0x00f8bd91, 0x00329c82, 0x000beec1}}, Y: Field{[10]uint32{0x00ebc31d, 0x02d89664, 0x00246a0a, 0x0239a7d6, 0x030cbfe5, 0x021c1a2a, 0x03cda69c, 0x0377eeae, 0x02ef15ea, 0x0006b7d9}}}, + {X: Field{[10]uint32{0x03208ebf, 0x00b79399, 0x01ccce13, 0x020e3277, 0x02c178f8, 0x00135915, 0x0122f2f4, 0x0095e6d9, 0x00daf42d, 0x0019244d}}, Y: Field{[10]uint32{0x009355cb, 0x015b0efc, 0x00e8a4a7, 0x0147f991, 0x02e7709b, 0x02a6ba96, 0x00446480, 0x012f09e2, 0x03fc3c55, 0x0010e16a}}}, + {X: Field{[10]uint32{0x013991cd, 0x03b7e2c3, 0x03023dbc, 0x02c2e264, 0x03128d62, 0x0271ff7b, 0x0201c172, 0x007e7381, 0x00b1dcb8, 0x002e5551}}, Y: Field{[10]uint32{0x029dcd2a, 0x0314e0dd, 0x02b0f33c, 0x01824f02, 0x03206fe7, 0x013c1c9b, 0x01f2d450, 0x0378cb54, 0x02dcffba, 0x003e1c7e}}}, + {X: Field{[10]uint32{0x01d668de, 0x00f03297, 0x0389fd06, 0x005c0a23, 0x02ace1ea, 0x012c6c25, 0x03df5b4a, 0x03430288, 0x03fc5034, 0x0033500e}}, Y: Field{[10]uint32{0x02717742, 0x0387f509, 0x0316054e, 0x01529763, 0x023fa92e, 0x00e92fc3, 0x0359760f, 0x03d1bd27, 0x0131aa56, 0x00304a58}}}, + {X: Field{[10]uint32{0x0004c581, 0x03a91e0f, 0x019394b6, 0x01e656d3, 0x021ad784, 0x026a3d5a, 0x0202074c, 0x02f72640, 0x0337d7f8, 0x000292ab}}, Y: Field{[10]uint32{0x0316da34, 0x00d234eb, 0x03431009, 0x032ce22b, 0x031a8cb9, 0x001dcf5c, 0x02594f94, 0x02d873f4, 0x02f2dc02, 0x00132ced}}}, + {X: Field{[10]uint32{0x03f438c4, 0x01f67e2a, 0x039376c3, 0x031f9b9e, 0x0297478f, 0x021915e3, 0x02dd3c52, 0x00123a17, 0x03f8ebdf, 0x0015c40b}}, Y: Field{[10]uint32{0x00161d4f, 0x00763bbe, 0x01128833, 0x005a42ad, 0x01915aef, 0x0146cbcc, 0x01e308c2, 0x00658b9e, 0x019beaec, 0x003213c7}}}, + {X: Field{[10]uint32{0x03c9b6ac, 0x02c188e8, 0x01774832, 0x02171a02, 0x01124246, 0x03ebf1c0, 0x00c08c58, 0x017f8442, 0x00e93c5c, 0x001a3fa6}}, Y: Field{[10]uint32{0x004df273, 0x02033e43, 0x01cd4d64, 0x023fba1c, 0x03cb5ea5, 0x011bc878, 0x00078e2c, 0x01ae1fba, 0x0017fd95, 0x00124ab1}}}, + {X: Field{[10]uint32{0x024a5e77, 0x022f900a, 0x03d43ec0, 0x028ac224, 0x03d97bae, 0x00bba92a, 0x0132cef0, 0x0388ebc2, 0x03b69ef5, 0x0000352e}}, Y: Field{[10]uint32{0x03c7c98c, 0x03e92c11, 0x00166607, 0x0130a8b7, 0x019e7488, 0x00334231, 0x01e223df, 0x02b8c7d9, 0x02609c1d, 0x00016063}}}, + {X: Field{[10]uint32{0x0283192a, 0x01f9a416, 0x03b5d68c, 0x00fdd8fc, 0x0123a5c5, 0x022b314f, 0x00d872f2, 0x022dc9fc, 0x0157a8eb, 0x003a589e}}, Y: Field{[10]uint32{0x010d984f, 0x026ea1f3, 0x008d66e5, 0x015d3d68, 0x020cab10, 0x01329b32, 0x0066d17d, 0x005a5b65, 0x027ddc29, 0x00176a4b}}}, + {X: Field{[10]uint32{0x0311caf5, 0x008e0bc5, 0x032076dd, 0x03cb7e0f, 0x001cd547, 0x003e7fa1, 0x0108ffb7, 0x03cbadf1, 0x00ada83b, 0x00127c87}}, Y: Field{[10]uint32{0x01f31931, 0x022497ce, 0x00114ca1, 0x00693fb6, 0x03244761, 0x00cb9bbf, 0x033afc21, 0x013b62b1, 0x01295f83, 0x00071f60}}}, + {X: Field{[10]uint32{0x02fa792e, 0x034060ab, 0x0364dfd6, 0x03316c3f, 0x006c34a8, 0x0061c4f5, 0x011d110c, 0x00754c53, 0x02a940f6, 0x000160a0}}, Y: Field{[10]uint32{0x005f6ddd, 0x03c28d04, 0x0091e677, 0x0124fab0, 0x012a96ee, 0x0360f5f7, 0x03701457, 0x03cb5948, 0x0155d3e0, 0x001e1578}}}, + {X: Field{[10]uint32{0x03ca118d, 0x01a46648, 0x012e5f55, 0x039d0f52, 0x01dc3a14, 0x01c2fb1f, 0x01db6f1d, 0x0009e9ed, 0x02324b07, 0x0032725e}}, Y: Field{[10]uint32{0x0264b56d, 0x035d31a5, 0x001e8747, 0x03678bb1, 0x0115d600, 0x03080cae, 0x031e99f7, 0x037f870a, 0x000f894d, 0x003d807d}}}, + {X: Field{[10]uint32{0x019e054e, 0x00568845, 0x0062b8d5, 0x0332a9ca, 0x039bbbe0, 0x0047e49c, 0x027bcdda, 0x01d4061a, 0x01758ed6, 0x00279370}}, Y: Field{[10]uint32{0x03c6c0ab, 0x020e04f3, 0x03d3bc94, 0x0321c57a, 0x03fcf4f4, 0x026df8db, 0x00736aa1, 0x019a9af8, 0x031f2bb8, 0x00328470}}}, + {X: Field{[10]uint32{0x02afe2b5, 0x03c31ae2, 0x0152f7a7, 0x03d89a3d, 0x028e5af1, 0x0337ef76, 0x00c1e5e8, 0x000c2f36, 0x03893ae0, 0x003f418d}}, Y: Field{[10]uint32{0x01c8e676, 0x008754c3, 0x00435b2e, 0x02037c68, 0x01f4a354, 0x00c9b700, 0x0068a8e4, 0x01d12881, 0x030b068d, 0x0023027a}}}, + {X: Field{[10]uint32{0x014af04e, 0x00ac9cbf, 0x02c77b3f, 0x02d6d19b, 0x00d85360, 0x004ddd60, 0x0281c3ec, 0x01d9466e, 0x033b6e7a, 0x000df7f7}}, Y: Field{[10]uint32{0x00fb7844, 0x02d3e3b4, 0x01727ea3, 0x0217b250, 0x03043dcd, 0x0004a79d, 0x00f3b078, 0x009d635e, 0x03b27b73, 0x00330c4d}}}, + {X: Field{[10]uint32{0x001dbae0, 0x0291751b, 0x018ffe72, 0x0127785b, 0x010a69cb, 0x034af832, 0x01a2f18b, 0x038971dc, 0x006ac8a5, 0x00117bc4}}, Y: Field{[10]uint32{0x020ab158, 0x022da608, 0x00bf42ad, 0x006cc646, 0x0060e568, 0x00058d24, 0x03bd452e, 0x01f6dcfd, 0x000d742e, 0x0032b5a9}}}, + {X: Field{[10]uint32{0x01fdfca4, 0x0091a704, 0x02d14be0, 0x036f0414, 0x0099648c, 0x011cafd6, 0x03cde710, 0x0328941c, 0x02f988b9, 0x00096314}}, Y: Field{[10]uint32{0x01939dfd, 0x02be7b0a, 0x00ffc359, 0x02e20e53, 0x010d60d0, 0x0296d87f, 0x026c9e21, 0x0171f1a9, 0x008b26ea, 0x00112476}}}, + {X: Field{[10]uint32{0x01e65217, 0x014464ea, 0x01c83afd, 0x019f7a20, 0x01d4f8ff, 0x034dbc76, 0x00cddb90, 0x0138d8f4, 0x00a7727c, 0x002f24a9}}, Y: Field{[10]uint32{0x03aa5120, 0x004c4898, 0x039d79dd, 0x02d2e8dd, 0x00331c22, 0x01193a70, 0x031c024d, 0x011e5587, 0x0208b18b, 0x001dbfda}}}, + {X: Field{[10]uint32{0x01f27ebd, 0x0304b451, 0x03353249, 0x00dfed7f, 0x0223e4e8, 0x03055aef, 0x01ceccb0, 0x0120d3c4, 0x00c258c0, 0x0022867a}}, Y: Field{[10]uint32{0x00e92c1a, 0x017941f9, 0x01f065d6, 0x032e1706, 0x018f50a9, 0x02e5e3f8, 0x016caca2, 0x023a8831, 0x0070bff4, 0x00057f1b}}}, + {X: Field{[10]uint32{0x01d70eea, 0x02447a95, 0x00572d9c, 0x02a30a91, 0x03e6f3b1, 0x00e65a2f, 0x013c1a7a, 0x00d136c4, 0x02d1ab90, 0x003966e0}}, Y: Field{[10]uint32{0x013b91be, 0x00abf20c, 0x00b80cc2, 0x02640205, 0x036634d6, 0x00baa9db, 0x01f0bc01, 0x01a86f93, 0x018cd58c, 0x002478cf}}}, + {X: Field{[10]uint32{0x0371a7d0, 0x000c6c1c, 0x03eb3330, 0x034976b2, 0x020f3456, 0x03e506fa, 0x0017db72, 0x01335af1, 0x025f8824, 0x003e653b}}, Y: Field{[10]uint32{0x019c62e2, 0x0102816b, 0x03d40514, 0x027d09c1, 0x03d9c268, 0x036b923d, 0x02bf9c04, 0x0266ccc0, 0x006aecc2, 0x002409be}}}, + {X: Field{[10]uint32{0x0000410f, 0x00e9a4de, 0x015ffc1e, 0x03355976, 0x018000cc, 0x0200f448, 0x0317bc79, 0x03e9409e, 0x008c32d1, 0x001ddb13}}, Y: Field{[10]uint32{0x00785149, 0x03c2eb72, 0x03803165, 0x0298e104, 0x01988b64, 0x00f4f8c6, 0x00201d50, 0x01dce1be, 0x0234438e, 0x00103b38}}}, + {X: Field{[10]uint32{0x01c9b12e, 0x00feb96d, 0x02620fb8, 0x022b1780, 0x0032c196, 0x02fc95cc, 0x00aea3d8, 0x02c004a7, 0x01a5dd13, 0x000e4d9d}}, Y: Field{[10]uint32{0x035a8b00, 0x0129a7e9, 0x02dc0378, 0x01cd39d0, 0x032e5dc7, 0x02c3af30, 0x016ff4c4, 0x00033bb4, 0x03c47934, 0x000e79b3}}}, + {X: Field{[10]uint32{0x03401b1e, 0x027ea330, 0x00eaa2f0, 0x03c9efce, 0x0094dcfd, 0x0242f87f, 0x01de130e, 0x031ed8b3, 0x029422ed, 0x0035f374}}, Y: Field{[10]uint32{0x014fb184, 0x031c194d, 0x00302db5, 0x03662fc5, 0x020728bd, 0x031e7ad1, 0x00ca141d, 0x03462edd, 0x0328073c, 0x00372e72}}}, + {X: Field{[10]uint32{0x0256bc2c, 0x019f73db, 0x021b99cb, 0x01ea6216, 0x01902613, 0x00925274, 0x02206718, 0x011278fd, 0x01272726, 0x002f38fc}}, Y: Field{[10]uint32{0x02e76217, 0x0355e1b9, 0x0097d296, 0x01f714a9, 0x011c33c3, 0x02b4496b, 0x0168f040, 0x037692fa, 0x0017ee92, 0x00290900}}}, + {X: Field{[10]uint32{0x035d6e52, 0x037ba5ff, 0x01eb9738, 0x00ddd0e6, 0x03700801, 0x0078d7eb, 0x02daf442, 0x010529e6, 0x00cdefe9, 0x00277c26}}, Y: Field{[10]uint32{0x01abf15d, 0x0223ae94, 0x01baf3b7, 0x02d36fbc, 0x03f04bf4, 0x01a45f65, 0x0317bb80, 0x0250f343, 0x035fef36, 0x001afe48}}}, + {X: Field{[10]uint32{0x03d43f1d, 0x0332536c, 0x02522e8d, 0x02d1c888, 0x0005d88a, 0x0249c4e8, 0x00839a82, 0x03712a69, 0x002ee561, 0x00265616}}, Y: Field{[10]uint32{0x028c226a, 0x013a2341, 0x00dc78cb, 0x02cd0ed7, 0x02850008, 0x00966cde, 0x0376cba2, 0x03c8fa1b, 0x0214b63a, 0x00382562}}}, + {X: Field{[10]uint32{0x01fb1f24, 0x024cf11b, 0x02871bad, 0x01e548ce, 0x03dda933, 0x02230122, 0x0292447c, 0x009e79f4, 0x00ce7d7b, 0x000f9fee}}, Y: Field{[10]uint32{0x008806e5, 0x01bb2b59, 0x0309d229, 0x02aa4e17, 0x02e36352, 0x001ae92f, 0x037a5dd9, 0x0208e4b5, 0x01083410, 0x000109e7}}}, + {X: Field{[10]uint32{0x01e8ed62, 0x0029a8dd, 0x001c71ac, 0x01a7f2da, 0x0097611d, 0x0209b3d6, 0x02c93ee7, 0x01684433, 0x0050f740, 0x00073415}}, Y: Field{[10]uint32{0x0334d0f0, 0x02880eeb, 0x0136b039, 0x017264c6, 0x025759d3, 0x002e54db, 0x020a3a02, 0x02c10358, 0x0070bb52, 0x000216ef}}}, + {X: Field{[10]uint32{0x03c9b367, 0x02b6fdf5, 0x005e3c76, 0x03283ed3, 0x0393cf99, 0x02e040cb, 0x0387bd01, 0x0168f7db, 0x03763214, 0x0001411d}}, Y: Field{[10]uint32{0x03d1d2c3, 0x01820115, 0x03f7a1ed, 0x008e2132, 0x00a0e67b, 0x031c7d06, 0x02b97ce6, 0x01ddc627, 0x0359919c, 0x0001eeb7}}}, + {X: Field{[10]uint32{0x0070e6ea, 0x03de8391, 0x030be636, 0x00afdfcb, 0x0079fd30, 0x03452629, 0x01b8d87a, 0x012ea0c2, 0x02c949b6, 0x0007aa44}}, Y: Field{[10]uint32{0x002b7650, 0x0021b401, 0x02b4d029, 0x039b3e0e, 0x014acd50, 0x0140aba3, 0x014896d3, 0x00477a10, 0x03dd0b12, 0x0026c9e7}}}, + {X: Field{[10]uint32{0x01a01628, 0x00c0a3c8, 0x007ac8c0, 0x026f4bd3, 0x03e1ed32, 0x017c0f12, 0x00e0b009, 0x001daf2d, 0x00d34b00, 0x0026cfe8}}, Y: Field{[10]uint32{0x03d420de, 0x02549f09, 0x01f4126e, 0x035543bf, 0x038cef81, 0x033b1987, 0x00d5dcb0, 0x023bd4b8, 0x0248b2a5, 0x0004045e}}}, + {X: Field{[10]uint32{0x024c94eb, 0x01e3f020, 0x03e22ff6, 0x00a34095, 0x036200d1, 0x02eb4530, 0x02c7f7f5, 0x027712ce, 0x03b801d3, 0x00197fbd}}, Y: Field{[10]uint32{0x0308b475, 0x026bc249, 0x032fe325, 0x03b1e80a, 0x02f2dcd6, 0x01bbc9db, 0x0373b9b3, 0x013f09dc, 0x01ee680c, 0x000c0878}}}, + {X: Field{[10]uint32{0x0385f9ac, 0x00a45fdf, 0x01d46c5a, 0x02ee3f7b, 0x036ef5e1, 0x030afbd6, 0x004c0f2b, 0x00e95419, 0x023daf76, 0x000f9dec}}, Y: Field{[10]uint32{0x024f3221, 0x02cf930a, 0x0021b415, 0x021443f4, 0x018d4fc7, 0x00b6cb1e, 0x03f0766a, 0x01e1e671, 0x00e95bb0, 0x00156c9e}}}, + {X: Field{[10]uint32{0x01de2965, 0x023022c8, 0x0378396f, 0x0228c8cb, 0x02f69fbf, 0x0335f4d4, 0x0215fba1, 0x0248af11, 0x02bf2fec, 0x000ab136}}, Y: Field{[10]uint32{0x019f957f, 0x03cfab08, 0x0089fa92, 0x00947bfc, 0x006d6494, 0x03e16946, 0x03e60187, 0x022f3c0a, 0x00177623, 0x000b0cf0}}}, + {X: Field{[10]uint32{0x0162c66e, 0x0150a153, 0x0155868d, 0x03c65f8c, 0x03748be0, 0x00acb3ae, 0x01feac74, 0x00134215, 0x022067da, 0x003faf22}}, Y: Field{[10]uint32{0x01d96083, 0x012a3499, 0x03bd1a55, 0x01b6898a, 0x01e3db34, 0x004169dc, 0x029d583e, 0x0398ffe6, 0x02873d45, 0x002bb8e4}}}, + {X: Field{[10]uint32{0x0206a569, 0x023da261, 0x038d3e1c, 0x000b7138, 0x02026542, 0x01715006, 0x002d10bd, 0x009d4623, 0x00b4a598, 0x0029045d}}, Y: Field{[10]uint32{0x03732a00, 0x0021fa47, 0x0367e3bd, 0x00be3643, 0x016b589f, 0x020ad947, 0x0165337e, 0x03e17b1a, 0x03b99fb5, 0x002f1ad8}}}, + {X: Field{[10]uint32{0x025de220, 0x02919396, 0x02ae93a3, 0x0134f2bc, 0x02907c19, 0x004bdd26, 0x0397fc6d, 0x028ebcee, 0x02cf5d10, 0x00048865}}, Y: Field{[10]uint32{0x0304e533, 0x031ba4a4, 0x032b946f, 0x03175016, 0x01674697, 0x02508ff7, 0x00e2c7c5, 0x03884d51, 0x0342b3c1, 0x00333d19}}}, + {X: Field{[10]uint32{0x021eadb3, 0x02d98f0b, 0x0373e799, 0x0187a38e, 0x019f93ec, 0x03219dd8, 0x03bfaa08, 0x03731f86, 0x01cb0104, 0x001deeb5}}, Y: Field{[10]uint32{0x02faa3cc, 0x03a18271, 0x00fea411, 0x02317bc2, 0x014023fd, 0x03c948bb, 0x021214dd, 0x037afd23, 0x007bad8b, 0x0002225d}}}, + {X: Field{[10]uint32{0x02d4a98b, 0x005faec4, 0x015d2f55, 0x0225a578, 0x024e3f6c, 0x00cc9f9b, 0x01451637, 0x02b505ab, 0x00758c49, 0x0007a350}}, Y: Field{[10]uint32{0x023b09f4, 0x01a05803, 0x01cd1259, 0x02835220, 0x0398d94a, 0x032f13e0, 0x03379a2e, 0x02986726, 0x00b00730, 0x000745b3}}}, + {X: Field{[10]uint32{0x03b6ee42, 0x01a7e97e, 0x028cfb18, 0x02b3d280, 0x01880ff2, 0x03ed6d4d, 0x03f4974a, 0x01077521, 0x016b2402, 0x00321e99}}, Y: Field{[10]uint32{0x02757beb, 0x02bfdc2f, 0x01cb76dd, 0x02a2d326, 0x0134f694, 0x029a9e43, 0x0174412f, 0x0254e17b, 0x033a6fac, 0x0005bc97}}}, + {X: Field{[10]uint32{0x0355a4eb, 0x02f67092, 0x03b8071f, 0x005b9ce4, 0x01669adf, 0x03385a81, 0x0369944c, 0x01ba23a5, 0x0007482c, 0x0025ac05}}, Y: Field{[10]uint32{0x00b50223, 0x02fffee5, 0x00ca4578, 0x03886c5e, 0x0082b786, 0x021a2006, 0x00d68de3, 0x0213c382, 0x02805903, 0x002ccaf8}}}, + {X: Field{[10]uint32{0x01ae4af5, 0x02fe211b, 0x01eff7eb, 0x01888b87, 0x00b2afd1, 0x01b423d5, 0x0272fb74, 0x018b9a07, 0x00b37395, 0x000483da}}, Y: Field{[10]uint32{0x000bcc78, 0x0305a40c, 0x00743ded, 0x02758572, 0x0102f4da, 0x03643853, 0x03c6729b, 0x01dbe51d, 0x034f2b23, 0x001f07ad}}}, + {X: Field{[10]uint32{0x02acd157, 0x03177139, 0x00989b65, 0x0074a170, 0x0049a441, 0x00923fba, 0x008be2cf, 0x02d15618, 0x01ec2789, 0x0039921c}}, Y: Field{[10]uint32{0x00e10a6b, 0x01d8a516, 0x02145843, 0x039740bc, 0x02f3dbfa, 0x017be47f, 0x039ecfd4, 0x02c2d56d, 0x02d14999, 0x000a602c}}}, + {X: Field{[10]uint32{0x026798ad, 0x010e18ea, 0x012660eb, 0x03894ea3, 0x0243daa1, 0x01cf9721, 0x0324adfc, 0x00f8b094, 0x0009b20d, 0x001822c4}}, Y: Field{[10]uint32{0x010e13df, 0x03f8b223, 0x0038b3b4, 0x00f10fbf, 0x03a021e1, 0x033c3998, 0x0181c68c, 0x0258e144, 0x0203ad5c, 0x00209b96}}}, + {X: Field{[10]uint32{0x01bb152a, 0x017e1068, 0x033e57c6, 0x00ada142, 0x00cdc4dc, 0x01bd306a, 0x02614353, 0x03917d82, 0x01558132, 0x002325e0}}, Y: Field{[10]uint32{0x037460fc, 0x03504df6, 0x0344ba6e, 0x00f670c6, 0x001875d6, 0x02193c65, 0x01083c53, 0x0207bc2a, 0x0098394d, 0x00328ecc}}}, + {X: Field{[10]uint32{0x0021bf3e, 0x0323e366, 0x00627f80, 0x015da084, 0x03100727, 0x0380441b, 0x018e731c, 0x00920be3, 0x011ac73b, 0x0000d4d6}}, Y: Field{[10]uint32{0x01eb6412, 0x02131ed0, 0x03df9d4f, 0x02067d12, 0x0370ae89, 0x009823aa, 0x02306db0, 0x02d1a6b1, 0x011a501a, 0x000adf8f}}}, + {X: Field{[10]uint32{0x00d78857, 0x03710c27, 0x02978b05, 0x01f6a7f6, 0x023c387b, 0x01e3f38c, 0x0270a671, 0x01cdcbb3, 0x0188ec35, 0x003acb7f}}, Y: Field{[10]uint32{0x024b88e4, 0x011fbc68, 0x01f6318c, 0x01ff2828, 0x023dd7aa, 0x02148dcb, 0x001a8cf9, 0x01548711, 0x02ed1f5a, 0x001bcaed}}}, + {X: Field{[10]uint32{0x012eb279, 0x03fdcca6, 0x00487b29, 0x03a619cb, 0x00abd72a, 0x03bbd9b7, 0x018f3b07, 0x001439a6, 0x03f65db1, 0x00290703}}, Y: Field{[10]uint32{0x01a99cd4, 0x0147bba6, 0x00244ba9, 0x03acaab3, 0x03bc0786, 0x014841c9, 0x019d7f86, 0x03fe77d8, 0x03205616, 0x0015be9e}}}, + {X: Field{[10]uint32{0x02217e92, 0x009395e8, 0x00ea9415, 0x02b6186f, 0x01615d85, 0x021677c4, 0x005917e0, 0x00540329, 0x0335f5bb, 0x00239d22}}, Y: Field{[10]uint32{0x00a46df8, 0x01d78fbf, 0x0266c9ef, 0x028e5b3f, 0x00825515, 0x025cef14, 0x03f86043, 0x031a9e12, 0x0362e226, 0x0015504c}}}, + {X: Field{[10]uint32{0x02dd17e5, 0x0354d709, 0x03708f35, 0x009f3339, 0x02bc506c, 0x01fb1eff, 0x00de2c7b, 0x001891cf, 0x0007cce7, 0x002a0fd8}}, Y: Field{[10]uint32{0x026af268, 0x00edd318, 0x02cbb26c, 0x005221e8, 0x015a1ac6, 0x03543585, 0x0397a379, 0x01f9718c, 0x012daf21, 0x002b523b}}}, + {X: Field{[10]uint32{0x0282d2fa, 0x022bfb44, 0x033abf11, 0x0376d1d5, 0x025cf208, 0x03f4e5f7, 0x000246eb, 0x0058924e, 0x02927e45, 0x003e7b5e}}, Y: Field{[10]uint32{0x00237b70, 0x02eed772, 0x01324087, 0x001ed2f9, 0x0303c844, 0x01c34e03, 0x015d53c6, 0x00c3de03, 0x02163a6f, 0x003055d1}}}, + {X: Field{[10]uint32{0x002ea08e, 0x00499c9b, 0x0255af01, 0x00491b14, 0x02c7dff0, 0x03c27e04, 0x01177078, 0x031e99fe, 0x038a175e, 0x0028af79}}, Y: Field{[10]uint32{0x01ca12ec, 0x004c8f72, 0x01e20b09, 0x00aa976e, 0x013b5dd6, 0x037140fe, 0x03d27419, 0x01302db5, 0x018fe82d, 0x001c495a}}}, + {X: Field{[10]uint32{0x039899b2, 0x03a88c6f, 0x01a56e62, 0x010b861d, 0x036b37da, 0x02385a42, 0x01cc0e9b, 0x019cda41, 0x01c79dcb, 0x0032a301}}, Y: Field{[10]uint32{0x0087534c, 0x003c67c5, 0x0199641d, 0x0275c4e2, 0x02275125, 0x03eea72a, 0x0160c1e3, 0x02b6e999, 0x01ca1e19, 0x00141314}}}, + {X: Field{[10]uint32{0x00eca02b, 0x01ec0655, 0x0397c061, 0x008725e7, 0x0061fd4b, 0x0140609e, 0x037ecdd1, 0x004eb104, 0x02ee61db, 0x0003f041}}, Y: Field{[10]uint32{0x03bef3ee, 0x0265945e, 0x0308e6bc, 0x035d724b, 0x02971f2c, 0x037168b0, 0x03ce9c2c, 0x0198e0ab, 0x02284fc2, 0x001b6956}}}, + {X: Field{[10]uint32{0x0092a8ab, 0x02da9c59, 0x0390b8b9, 0x012f0be3, 0x03504f67, 0x02b1e11b, 0x019a3217, 0x0041a150, 0x0039f47b, 0x000b2c86}}, Y: Field{[10]uint32{0x000a5757, 0x0204927c, 0x017aff10, 0x00cc116a, 0x00637264, 0x01978bf2, 0x0007feb9, 0x00112bda, 0x0332ae75, 0x00007fac}}}, + {X: Field{[10]uint32{0x0161f3ae, 0x03c84c95, 0x002245d4, 0x01c9e65c, 0x0356ba35, 0x02e957b6, 0x022963ef, 0x001ffff2, 0x00ee759c, 0x0019e314}}, Y: Field{[10]uint32{0x02cba96c, 0x022ffd2b, 0x03107c49, 0x015f6a9d, 0x01780b16, 0x00e2787e, 0x03afce2d, 0x00130724, 0x0387abbf, 0x0006626d}}}, + {X: Field{[10]uint32{0x024aa6fc, 0x00724420, 0x01da41b2, 0x032907cf, 0x0275d407, 0x002cbc99, 0x015097c3, 0x00d36608, 0x01ceaa2e, 0x002ad8f8}}, Y: Field{[10]uint32{0x00e2363c, 0x00955a9b, 0x00d82479, 0x0395f43d, 0x02812eb7, 0x011506b5, 0x01d3da2c, 0x03fdc9c5, 0x02611150, 0x003b196f}}}, + {X: Field{[10]uint32{0x003dd336, 0x02466ba4, 0x03cc9f5c, 0x01e6c14a, 0x03ec5672, 0x00499260, 0x0239a2a3, 0x02565d69, 0x01cafad5, 0x0029a4e6}}, Y: Field{[10]uint32{0x010d97dd, 0x00f84bb1, 0x017551c4, 0x012d8d24, 0x001c8730, 0x024eb8d2, 0x02799dcc, 0x013d369e, 0x0259c30c, 0x002d4971}}}, + {X: Field{[10]uint32{0x00fc5f3e, 0x01d4ef70, 0x001fbe13, 0x02bf4ef9, 0x00bd7a48, 0x00e720b4, 0x01cb5ed4, 0x033d7b49, 0x0282507b, 0x000cafd0}}, Y: Field{[10]uint32{0x0279bff2, 0x02eda543, 0x0033ac20, 0x02607a00, 0x026773c5, 0x038d1fa0, 0x0282f90b, 0x0367f495, 0x017a4336, 0x00336480}}}, + {X: Field{[10]uint32{0x02dfd862, 0x00ba6e3b, 0x032ec5e4, 0x0213da06, 0x02f2fe64, 0x005141c5, 0x003e2cc1, 0x000259c8, 0x01837e72, 0x00287f32}}, Y: Field{[10]uint32{0x01ed4fd7, 0x01b0c58c, 0x03a964ba, 0x03f6f05f, 0x02a419af, 0x008b7927, 0x03fa79a7, 0x03ee277f, 0x02c317e8, 0x000785ad}}}, + {X: Field{[10]uint32{0x030ceae0, 0x02ccae5f, 0x00838472, 0x03cceafa, 0x0360485c, 0x0073dce2, 0x01f1e822, 0x01f94063, 0x014e6961, 0x0036168c}}, Y: Field{[10]uint32{0x000a52f1, 0x02a8d9f8, 0x024e86e1, 0x033ccc22, 0x00fbbcba, 0x02229e6d, 0x034b5daa, 0x0379999a, 0x03eee92d, 0x001c683f}}}, + {X: Field{[10]uint32{0x020c2e7f, 0x000feabc, 0x0224e4ee, 0x017a010f, 0x02f5a53b, 0x00d5bab0, 0x01b20e31, 0x031c3905, 0x02fa0688, 0x00062489}}, Y: Field{[10]uint32{0x01515aa6, 0x0161f7bc, 0x00eaa1a0, 0x01fe54b9, 0x02fc2bba, 0x0261f3d8, 0x00be5759, 0x0354f9ef, 0x00ac40c7, 0x00366ff6}}}, + {X: Field{[10]uint32{0x019e1330, 0x001c2695, 0x01241ff7, 0x009534b6, 0x0132465d, 0x00b3c84d, 0x02674e63, 0x00458b5e, 0x020a6a93, 0x0034d50b}}, Y: Field{[10]uint32{0x0357c369, 0x01e645d2, 0x032bf9a0, 0x021012c7, 0x03dbd427, 0x008aef60, 0x00be5ed6, 0x0108d0d3, 0x0351e266, 0x000097a3}}}, + {X: Field{[10]uint32{0x013a2bc5, 0x01af861d, 0x0245f287, 0x016ab6ff, 0x029a8c0a, 0x0161d615, 0x006e6b82, 0x02d8487b, 0x0286fb2c, 0x00145367}}, Y: Field{[10]uint32{0x03cbf261, 0x02a10615, 0x0179145c, 0x02f1218a, 0x011b8370, 0x0197de76, 0x01918d9f, 0x008f10d0, 0x01c0be54, 0x001c01e1}}}, + {X: Field{[10]uint32{0x023fe495, 0x01a128fa, 0x03f6ad6d, 0x0188b5c8, 0x0343f9aa, 0x02b981aa, 0x031db335, 0x0333f787, 0x036512e9, 0x00327e18}}, Y: Field{[10]uint32{0x0230270b, 0x00efac87, 0x01db3a3b, 0x0163cc7d, 0x01b7b80b, 0x0372f8ee, 0x02f9445d, 0x02807271, 0x02313868, 0x000c34e9}}}, + {X: Field{[10]uint32{0x002deb93, 0x03481bcb, 0x00768357, 0x029cae42, 0x03641200, 0x0039e436, 0x00cd96fa, 0x0227f826, 0x020c8fc0, 0x000089bc}}, Y: Field{[10]uint32{0x025f66bc, 0x00ee56aa, 0x00cff1c0, 0x01bfb860, 0x015e0262, 0x012d0f6a, 0x03c20452, 0x024d880f, 0x03b8b43e, 0x000b88fe}}}, + {X: Field{[10]uint32{0x035350bd, 0x0125adb2, 0x03da0a38, 0x03f62366, 0x019fcc79, 0x02e29f98, 0x019bd9e6, 0x03e531c8, 0x0268d4b6, 0x00286c9d}}, Y: Field{[10]uint32{0x02d68a32, 0x013ccb75, 0x01b94264, 0x01d2dcae, 0x01c96b5f, 0x0003f57b, 0x02a62bc2, 0x0305ab9e, 0x005eb6e1, 0x000e4cff}}}, + {X: Field{[10]uint32{0x03e28887, 0x0037dfab, 0x01ae38c4, 0x01f05643, 0x0357dd4e, 0x02023ac2, 0x03b71810, 0x02f0c47d, 0x02570087, 0x00043c4d}}, Y: Field{[10]uint32{0x03366d84, 0x031ba178, 0x03995db5, 0x02d29e68, 0x02291338, 0x00753b73, 0x02c570d9, 0x030fb139, 0x008709bd, 0x000694b9}}}, + {X: Field{[10]uint32{0x01be3e46, 0x03861073, 0x01884273, 0x03623e62, 0x00f613b3, 0x0003717b, 0x03558615, 0x03d60fe7, 0x00eea984, 0x00022aa8}}, Y: Field{[10]uint32{0x0133260d, 0x025f48a8, 0x017b8f21, 0x016055b6, 0x0124e564, 0x00bc91bb, 0x02c46abc, 0x009df700, 0x01540f85, 0x0014a588}}}, + {X: Field{[10]uint32{0x01c89d2e, 0x019990fc, 0x034aa3bd, 0x03be96e2, 0x00dc9472, 0x01ea4ea6, 0x0397ce5f, 0x02c6de6c, 0x02710024, 0x000ca016}}, Y: Field{[10]uint32{0x003091fd, 0x01439621, 0x002a2f4d, 0x019702e2, 0x029e23c7, 0x00a9d3b5, 0x02d0a858, 0x00e7d734, 0x007cb7c1, 0x002bd497}}}, + {X: Field{[10]uint32{0x01412451, 0x0141d26a, 0x02b12cde, 0x030a1fda, 0x01058db0, 0x03ce9483, 0x030835a4, 0x035125fe, 0x00cc909a, 0x0031cbc4}}, Y: Field{[10]uint32{0x02c7c65a, 0x0044b5bc, 0x03030a7a, 0x00c99d19, 0x03b8e2ca, 0x0192d83c, 0x015ff15b, 0x02ea78df, 0x027d5197, 0x0029599b}}}, + {X: Field{[10]uint32{0x03fc9a22, 0x0082195d, 0x01f97c03, 0x016b5301, 0x0172c0fa, 0x0080ef50, 0x01a74adc, 0x0046c905, 0x00c78702, 0x001bb1da}}, Y: Field{[10]uint32{0x031b09fb, 0x009833ab, 0x014d05da, 0x010b6d9f, 0x03b51cbf, 0x01527230, 0x01e67100, 0x036ec249, 0x02220aa2, 0x00060e52}}}, + {X: Field{[10]uint32{0x00a64737, 0x00e9c70f, 0x01e61dc9, 0x0343bbe4, 0x01a846e7, 0x01c117f2, 0x01061438, 0x03455981, 0x03bbff99, 0x00378dba}}, Y: Field{[10]uint32{0x000f4270, 0x0292d3a4, 0x00c81b39, 0x02e86d34, 0x00488208, 0x011db138, 0x0247dcda, 0x02cded01, 0x02520f3c, 0x0031605d}}}, + {X: Field{[10]uint32{0x00c00218, 0x0082adcf, 0x0297bc0c, 0x008ad1a8, 0x0019bea3, 0x037a9bd3, 0x0001ef86, 0x03f1a16b, 0x015d5538, 0x003d4d05}}, Y: Field{[10]uint32{0x03b9523c, 0x0355c1ac, 0x026030d3, 0x013c5376, 0x03f9d092, 0x028b4494, 0x02b38a49, 0x02632bbb, 0x01f2979d, 0x0013eadf}}}, + {X: Field{[10]uint32{0x0286129d, 0x01ff304c, 0x035210bc, 0x0223436a, 0x0008db20, 0x0156da1f, 0x00ecb981, 0x02409420, 0x0050a1db, 0x0036bf6e}}, Y: Field{[10]uint32{0x011ada22, 0x03cbfbd9, 0x0291aa2e, 0x014183ff, 0x027d0ccc, 0x00dbeef4, 0x02be601f, 0x013050ff, 0x03fcae6c, 0x0010e597}}}, + {X: Field{[10]uint32{0x01d705ce, 0x027e7d26, 0x03721299, 0x01a5a02c, 0x022efe40, 0x00cf31a7, 0x016893ee, 0x02f21460, 0x02211dca, 0x002b2682}}, Y: Field{[10]uint32{0x00c728ef, 0x00e5c6e6, 0x03a8879c, 0x02c4e7d6, 0x02acf64e, 0x034035c4, 0x021e02c2, 0x034af7fe, 0x02408281, 0x0005baff}}}, + {X: Field{[10]uint32{0x00503030, 0x0207afa6, 0x02ceb1db, 0x00bc0ede, 0x0131ae2b, 0x02e2da7f, 0x01eb8b97, 0x03dba578, 0x03d4b48c, 0x002becde}}, Y: Field{[10]uint32{0x024b7929, 0x0336c582, 0x01d84d3f, 0x037b3913, 0x01c47c06, 0x017e8c4f, 0x0231af3e, 0x033765bc, 0x0164f8d9, 0x000733d0}}}, + {X: Field{[10]uint32{0x0088e709, 0x000a494e, 0x007d51a6, 0x00b4ac4a, 0x00f55368, 0x007591c3, 0x0318e7f2, 0x013e0cea, 0x02ef6c29, 0x00006e40}}, Y: Field{[10]uint32{0x00d69ebe, 0x007b3bb7, 0x024aa24b, 0x00091b1c, 0x0066ca01, 0x00359a93, 0x005e9fe4, 0x027f9c8e, 0x01ff34e4, 0x001dcd71}}}, + {X: Field{[10]uint32{0x003133e2, 0x0138a2df, 0x030b255e, 0x031630ef, 0x00c61b41, 0x00cc883f, 0x01b4ec3d, 0x00a561f1, 0x03108a20, 0x001b9396}}, Y: Field{[10]uint32{0x028fcfbe, 0x012a6766, 0x02f660f1, 0x0011b3a8, 0x00b55ae5, 0x01224569, 0x01ea4106, 0x01abd11a, 0x03065c33, 0x002d27e0}}}, + {X: Field{[10]uint32{0x037e9714, 0x00346ac6, 0x0280b5b1, 0x0261f607, 0x0112342d, 0x034e4c6e, 0x00532760, 0x0008416e, 0x037fbb80, 0x0021f38f}}, Y: Field{[10]uint32{0x00f0f635, 0x0065ce93, 0x02e16d1e, 0x0263751b, 0x016b71f8, 0x03078ce1, 0x013c3869, 0x03ce700a, 0x004779db, 0x0015b1aa}}}, + {X: Field{[10]uint32{0x01426b2d, 0x0199eab2, 0x01d0c9f6, 0x00189d1f, 0x02d368a7, 0x01687a51, 0x00193724, 0x01927270, 0x029bb7ba, 0x0021c90c}}, Y: Field{[10]uint32{0x010b944c, 0x0243fe59, 0x030d89d0, 0x03548745, 0x0155b109, 0x003e811e, 0x03a5a5bb, 0x03512d76, 0x00e848d7, 0x00011116}}}, + {X: Field{[10]uint32{0x02a1a4bc, 0x025fd8ad, 0x005cd7d2, 0x03333b21, 0x03c6338d, 0x01935f5f, 0x01b18b6b, 0x030244cb, 0x03a64735, 0x002e46fb}}, Y: Field{[10]uint32{0x00138467, 0x03dc0778, 0x0340b14c, 0x00323e7c, 0x0015e7ca, 0x0391d9a8, 0x03f16cfb, 0x01e71a19, 0x01ef8c9b, 0x002ece58}}}, + {X: Field{[10]uint32{0x00d08fb3, 0x038c8028, 0x0296cd8d, 0x02e19735, 0x009ae3d6, 0x0228d227, 0x00fbb896, 0x025fa8ef, 0x0259332e, 0x0010c87a}}, Y: Field{[10]uint32{0x00cd538e, 0x032d8021, 0x00f7ee31, 0x008d7394, 0x0203f6b0, 0x01ce8d7a, 0x0182e3fc, 0x02754f5d, 0x00d4c514, 0x0025f920}}}, + {X: Field{[10]uint32{0x02f1bc6d, 0x014b29bd, 0x02069057, 0x0357a230, 0x017950a8, 0x02a63508, 0x01051d25, 0x025a990c, 0x03b2836d, 0x00371165}}, Y: Field{[10]uint32{0x03df36ff, 0x01cfc814, 0x02ad7f9b, 0x03f79310, 0x03362bb4, 0x00d5c96a, 0x00e3a83c, 0x00c32ba1, 0x000d16ba, 0x0031c496}}}, + {X: Field{[10]uint32{0x0159a009, 0x00b4e700, 0x00992997, 0x0194b67e, 0x03c5f19b, 0x037801ee, 0x02617508, 0x00c0242c, 0x02f085ff, 0x00339913}}, Y: Field{[10]uint32{0x033cc8f7, 0x02641b35, 0x02c17c08, 0x01a48299, 0x00c9402a, 0x019026ac, 0x0200c92f, 0x02e596ea, 0x01d0058d, 0x00002690}}}, + {X: Field{[10]uint32{0x0136b41a, 0x01138066, 0x002b4a74, 0x0309611a, 0x022ec439, 0x00f2e3bc, 0x01aecf42, 0x02d2eae0, 0x035cb6c7, 0x0002e878}}, Y: Field{[10]uint32{0x01bd6272, 0x0339a50d, 0x0128ad2f, 0x00cc73ab, 0x0001098b, 0x02c5ea39, 0x0178d6f7, 0x037918f8, 0x0252f91d, 0x003cecf1}}}, + {X: Field{[10]uint32{0x02e3920f, 0x0344d821, 0x0114d72e, 0x011c640b, 0x036988c7, 0x011763d0, 0x03c839f8, 0x006efd83, 0x02a02a33, 0x002e7e63}}, Y: Field{[10]uint32{0x020d03d3, 0x03eca4b1, 0x0327d318, 0x013ea52e, 0x0235d9b0, 0x02a85f04, 0x0326f5e8, 0x00e85b31, 0x0101a7f2, 0x00027ec9}}}, + {X: Field{[10]uint32{0x007e886f, 0x028da7a0, 0x02ed09c1, 0x03c45b5e, 0x00dc10db, 0x03f3fe4c, 0x038e702f, 0x003e0711, 0x034655f9, 0x001c1645}}, Y: Field{[10]uint32{0x0205a59f, 0x0255426c, 0x02f8c64b, 0x010747cd, 0x03d09d3f, 0x0182a8fd, 0x031ec925, 0x03c32836, 0x00a4b9d6, 0x002099e8}}}, + {X: Field{[10]uint32{0x025434bf, 0x00886b30, 0x0031eb76, 0x01b938c7, 0x0114cc5a, 0x01004858, 0x036469f8, 0x02818e9e, 0x00bcc43c, 0x003bf69e}}, Y: Field{[10]uint32{0x02fa2864, 0x038de055, 0x032aa92b, 0x0191126b, 0x034cdf80, 0x00c64f44, 0x0121b135, 0x03e1643d, 0x03f6ef45, 0x001ed0db}}}, + {X: Field{[10]uint32{0x010ccc34, 0x01b4251d, 0x02f0e430, 0x01d00068, 0x0335fbd8, 0x02015aba, 0x0230988c, 0x002578e9, 0x030f5d62, 0x0008a692}}, Y: Field{[10]uint32{0x0234de6e, 0x028d6578, 0x034288be, 0x00d771a8, 0x00741acf, 0x01a9466f, 0x01694cef, 0x01d38f4b, 0x03af491c, 0x0005c34c}}}, + {X: Field{[10]uint32{0x02f07100, 0x0238bb1a, 0x03f178ce, 0x02d2069a, 0x03f91860, 0x02b343e4, 0x01d44b83, 0x0084c862, 0x008e20a0, 0x0031dc3d}}, Y: Field{[10]uint32{0x00266eec, 0x03e18870, 0x038c9610, 0x02fdf82f, 0x02a6d8db, 0x00c96fab, 0x0143aca3, 0x00647e7b, 0x00d38b2a, 0x001f8448}}}, + {X: Field{[10]uint32{0x0286aa44, 0x0121a6bc, 0x00af8eb7, 0x0260f509, 0x01e89b89, 0x002c626a, 0x020a48a2, 0x00754a2d, 0x00630390, 0x002976cb}}, Y: Field{[10]uint32{0x00af1e50, 0x03868dc9, 0x03a1446f, 0x021a0146, 0x010384e1, 0x0270dfbb, 0x034e6abd, 0x0356c069, 0x01926a93, 0x002e6587}}}, + {X: Field{[10]uint32{0x0241db1c, 0x01eca636, 0x005ff007, 0x01233a8b, 0x024b447e, 0x005a36e6, 0x03897b7c, 0x000a2298, 0x029e9f33, 0x000fb1c5}}, Y: Field{[10]uint32{0x03053fb2, 0x01de0d7c, 0x00b49e44, 0x01a04b96, 0x024b3be2, 0x034d2935, 0x004aa34e, 0x003b688b, 0x034de8e6, 0x0030ffa5}}}, + {X: Field{[10]uint32{0x035bf3b3, 0x00b0453e, 0x02b777cf, 0x024f3a4b, 0x03810cff, 0x0267923a, 0x0060d4cf, 0x00461356, 0x0217c331, 0x002dccf7}}, Y: Field{[10]uint32{0x000c11b0, 0x038690d2, 0x0290ad28, 0x033a7c9a, 0x0157fc4a, 0x02ed855c, 0x000d537e, 0x002b4c80, 0x00dd72d2, 0x00031d70}}}, + {X: Field{[10]uint32{0x002ed278, 0x0140585b, 0x01df28b4, 0x0279aa08, 0x00027db5, 0x005601d7, 0x0149616a, 0x02f09057, 0x0208d555, 0x0015f5b8}}, Y: Field{[10]uint32{0x0346eba8, 0x00d31b0d, 0x02891fca, 0x00b9b3ca, 0x0274b5d0, 0x014ecd3d, 0x028e3533, 0x036968d4, 0x0279d130, 0x0020e1c2}}}, + {X: Field{[10]uint32{0x02d3673d, 0x0249621a, 0x03aab8d7, 0x0027f6cb, 0x026f0694, 0x00823dbc, 0x032fd3c3, 0x0291e0ef, 0x00f1aa69, 0x0027908d}}, Y: Field{[10]uint32{0x008d0653, 0x00dccf8a, 0x0029bd75, 0x005abffb, 0x019fb42b, 0x01e81610, 0x03ed0414, 0x03af0fa2, 0x03737725, 0x0017e691}}}, + {X: Field{[10]uint32{0x02b68173, 0x00fc7ce6, 0x00a758d4, 0x03c9d81a, 0x0322e4fc, 0x0362ba44, 0x0096202f, 0x00bff6f6, 0x039d9fc1, 0x001bf8ff}}, Y: Field{[10]uint32{0x0109fa1b, 0x00f688ad, 0x02a3c2ab, 0x0058f9fe, 0x010bf94e, 0x02482316, 0x03ef7b50, 0x0118209c, 0x02821d41, 0x003bc355}}}, + {X: Field{[10]uint32{0x005c4631, 0x02ab96ed, 0x0161fff2, 0x015f446c, 0x0154c492, 0x01532d26, 0x02af415e, 0x01b867be, 0x014fd258, 0x000b0c79}}, Y: Field{[10]uint32{0x03311346, 0x003908c4, 0x0308bd8e, 0x015069c1, 0x00039af3, 0x03ee0979, 0x0353c0e9, 0x02c6b39f, 0x00ad364a, 0x002fb7ec}}}, + {X: Field{[10]uint32{0x00203ebc, 0x019839de, 0x037823b8, 0x0225270b, 0x004d745b, 0x02e4ce16, 0x00ea2ee2, 0x01230d1e, 0x02590231, 0x0014565c}}, Y: Field{[10]uint32{0x02aa1817, 0x027cefd9, 0x033628a5, 0x03396984, 0x03b81ff7, 0x015e4140, 0x03dc4702, 0x02dd0f13, 0x0153f688, 0x000ca7d8}}}, + {X: Field{[10]uint32{0x01caf1f4, 0x010791b3, 0x03d6070d, 0x0213378d, 0x020d3946, 0x03d4733e, 0x03fcb3bd, 0x035ee370, 0x032458f7, 0x000622cc}}, Y: Field{[10]uint32{0x03901910, 0x0195a934, 0x03104487, 0x030a22ab, 0x003d1dde, 0x026671aa, 0x026b04c8, 0x02845cc6, 0x01dad112, 0x000137a9}}}, + {X: Field{[10]uint32{0x03a6e471, 0x00dcb573, 0x0090e307, 0x033dfc4f, 0x0085f804, 0x0384f8aa, 0x02b0a494, 0x03856233, 0x0241a503, 0x00248163}}, Y: Field{[10]uint32{0x00ec108a, 0x01c95761, 0x0151068e, 0x01e96334, 0x01bcbe17, 0x0085dfa5, 0x025a230e, 0x01a1785f, 0x02d4449e, 0x000da01c}}}, + {X: Field{[10]uint32{0x00099fcf, 0x011e20cd, 0x0105d5b6, 0x03a27a0c, 0x03726f79, 0x01bab14d, 0x03a7a689, 0x01941bc9, 0x022644e0, 0x001a9bd4}}, Y: Field{[10]uint32{0x01132586, 0x0268cb69, 0x013214c1, 0x0269692d, 0x007104e7, 0x01d261fd, 0x027b6645, 0x0360fac5, 0x014bd8ce, 0x0033cfb7}}}, + {X: Field{[10]uint32{0x0376bb26, 0x03e49bc8, 0x0148d89c, 0x0008d3c0, 0x03c77c34, 0x035523cd, 0x021e0efa, 0x03730f28, 0x02a2340c, 0x001f8df3}}, Y: Field{[10]uint32{0x009a0016, 0x027fa6b3, 0x0369e83b, 0x00af4c72, 0x026b02d4, 0x0172f08a, 0x022938e0, 0x01f1aac1, 0x029b42a2, 0x0031cb60}}}, + {X: Field{[10]uint32{0x00d0b667, 0x023ee0b6, 0x00c5ad84, 0x00314b0f, 0x00800d01, 0x0325ea37, 0x03b4b39b, 0x01b3deeb, 0x0069cf0f, 0x00079b08}}, Y: Field{[10]uint32{0x0260196f, 0x031c8e23, 0x03e81f86, 0x02198c2d, 0x00491469, 0x032c2450, 0x02cfbdc2, 0x03611a1b, 0x0276bca1, 0x00030607}}}, + {X: Field{[10]uint32{0x02f07e16, 0x00fbd6c1, 0x00be3520, 0x00f32901, 0x02f36ba4, 0x0112d1fa, 0x02336c8d, 0x0293dec1, 0x000fe6ee, 0x00155998}}, Y: Field{[10]uint32{0x01057e55, 0x03f87380, 0x0278b5a7, 0x0059da56, 0x0269e5ac, 0x03cdcbb6, 0x00acb4c0, 0x0065e7b5, 0x008f7adc, 0x001aeef4}}}, + {X: Field{[10]uint32{0x01c791b5, 0x0341f64c, 0x03a7619a, 0x005b54a6, 0x00690450, 0x017653e3, 0x01c5adc4, 0x00717008, 0x034ded45, 0x0010d718}}, Y: Field{[10]uint32{0x034d4cc1, 0x02d391f1, 0x02c14024, 0x01d8adbd, 0x02850098, 0x0254f032, 0x006f9591, 0x02943c88, 0x02688252, 0x000c7b78}}}, + {X: Field{[10]uint32{0x0057b9b6, 0x0108d0a7, 0x027e9dd1, 0x00abe157, 0x01f19a0d, 0x014a9053, 0x01c06122, 0x01c71ce5, 0x00e6a660, 0x001bee33}}, Y: Field{[10]uint32{0x0368e052, 0x017627c9, 0x034c5b84, 0x03baaff8, 0x02183dad, 0x0208c989, 0x0399fad6, 0x014c5351, 0x0249e2f0, 0x0005fe50}}}, + {X: Field{[10]uint32{0x0180dc36, 0x037a30ca, 0x01890148, 0x028a6781, 0x0011c711, 0x0153b98d, 0x016a695f, 0x01325252, 0x029920fc, 0x00219bcf}}, Y: Field{[10]uint32{0x018d62f7, 0x0221e1b4, 0x0109bae1, 0x000ba0de, 0x01f5211f, 0x030036cb, 0x00a11e13, 0x030f074e, 0x01af4f8d, 0x003a6715}}}, + {X: Field{[10]uint32{0x00468b2d, 0x01bd8620, 0x03c79461, 0x002df009, 0x0162404f, 0x0372f941, 0x024f7234, 0x0122669c, 0x0010b716, 0x0020304d}}, Y: Field{[10]uint32{0x000b91aa, 0x037e254a, 0x016216d8, 0x03870b10, 0x01bd6e8f, 0x0371a74e, 0x03592819, 0x00793f5e, 0x002e71a0, 0x00218c65}}}, + {X: Field{[10]uint32{0x02a7da99, 0x00577060, 0x004d2c38, 0x030292e9, 0x00bf37ab, 0x005eedbb, 0x03e68bec, 0x02762014, 0x01eeef4e, 0x0023e16f}}, Y: Field{[10]uint32{0x0217897e, 0x027edfbb, 0x02962b4a, 0x017927b9, 0x034e8c29, 0x02a96468, 0x00f8ce78, 0x00d0b2bc, 0x03df8ae9, 0x000db516}}}, + {X: Field{[10]uint32{0x01600749, 0x01280692, 0x022aa440, 0x039209b6, 0x0317a920, 0x03ba286c, 0x00edaf40, 0x03369833, 0x032b3393, 0x00027342}}, Y: Field{[10]uint32{0x02fc5a5a, 0x03977baa, 0x00463414, 0x024a9258, 0x023a00c4, 0x03c313a8, 0x0101e348, 0x01942ec6, 0x035a51d9, 0x000e0c74}}}, + {X: Field{[10]uint32{0x009f33b0, 0x0380ddf5, 0x032d3bdb, 0x032b7fe8, 0x02003ab7, 0x01d31de6, 0x03832f79, 0x01fff5b3, 0x01af15c6, 0x0028317c}}, Y: Field{[10]uint32{0x01cb91ec, 0x00a5a080, 0x03c57800, 0x00aee210, 0x03307939, 0x0188317f, 0x03344123, 0x01898905, 0x00d442de, 0x001abfd0}}}, + {X: Field{[10]uint32{0x00edfacc, 0x0208c4d6, 0x02d7890a, 0x01c0df2c, 0x02c01113, 0x03b100e7, 0x021fbf02, 0x03885f5f, 0x03400013, 0x002bce5b}}, Y: Field{[10]uint32{0x02cfb936, 0x03a53d66, 0x024bc936, 0x0267a161, 0x016754c5, 0x0017c397, 0x0035d167, 0x014d28b7, 0x01e25a57, 0x002aabae}}}, + {X: Field{[10]uint32{0x01ed0eaf, 0x039c7124, 0x01307cf1, 0x01c7cbe2, 0x0187d4c0, 0x02f8d65e, 0x02871b0d, 0x03b3179f, 0x0057e3e0, 0x003f6b0f}}, Y: Field{[10]uint32{0x00a09fc7, 0x03981a0f, 0x00b18cde, 0x03fd7684, 0x02b14d14, 0x033f8db5, 0x00877afc, 0x03c259cf, 0x00cca22e, 0x000c0a28}}}, + {X: Field{[10]uint32{0x02fa88b7, 0x011c767b, 0x0103e14a, 0x035aab14, 0x00ae745f, 0x023bebb7, 0x012b6a96, 0x02eaa6b8, 0x01239587, 0x0038ebac}}, Y: Field{[10]uint32{0x02f769c7, 0x00ce5ef2, 0x036cd2d3, 0x00168b23, 0x017b4603, 0x02c9f469, 0x006833fb, 0x01512f8c, 0x038652c1, 0x001fb471}}}, + {X: Field{[10]uint32{0x038352f5, 0x01694335, 0x00a0e605, 0x01e8f8f8, 0x000eb83d, 0x0246b2e5, 0x00cc663c, 0x00058bed, 0x01e3382a, 0x0025aebb}}, Y: Field{[10]uint32{0x00c50cbc, 0x02b8167c, 0x039972ad, 0x0187a963, 0x0105100d, 0x02e4c022, 0x00c3a80f, 0x00a090e2, 0x0297b3ad, 0x001e1c8b}}}, + {X: Field{[10]uint32{0x03f5f5b5, 0x0013b88e, 0x03e408de, 0x008911a8, 0x02ba93d1, 0x036d51bf, 0x01e1eda4, 0x0158dfcd, 0x01561697, 0x001a1c12}}, Y: Field{[10]uint32{0x014ca494, 0x00d86f18, 0x005ff46e, 0x0099dc90, 0x02934bd2, 0x01310986, 0x006c7a20, 0x011c7ce8, 0x02feb5f7, 0x001891f4}}}, + {X: Field{[10]uint32{0x00bcf749, 0x0257827d, 0x01ad7940, 0x014be0fb, 0x0362eaf6, 0x02c374ac, 0x0202d72e, 0x03e1622b, 0x02342ca1, 0x001c7331}}, Y: Field{[10]uint32{0x012a45fb, 0x027e60f7, 0x02c686cb, 0x02510aa5, 0x01aee177, 0x01c0f968, 0x00e3f222, 0x0039a52a, 0x03d923b1, 0x00121eba}}}, + {X: Field{[10]uint32{0x0235d3f0, 0x002cfb3d, 0x00dff25d, 0x02ebc927, 0x01713844, 0x03a2d842, 0x00cd1831, 0x0268b816, 0x01d06573, 0x001bf687}}, Y: Field{[10]uint32{0x0078108e, 0x02597d48, 0x013df60a, 0x00f554dc, 0x00a232a9, 0x02a22a2c, 0x00a96c32, 0x032dc93e, 0x00f48afc, 0x0028bb91}}}, + {X: Field{[10]uint32{0x01147f45, 0x005b31b5, 0x03b64b10, 0x03d60e39, 0x0165cbfc, 0x02651c45, 0x02395c13, 0x0365ed17, 0x0309ff5a, 0x0034fc9d}}, Y: Field{[10]uint32{0x03265077, 0x024559e4, 0x0161a043, 0x03854767, 0x0329006e, 0x026ef5b1, 0x02026ed2, 0x03870d53, 0x0016cdc8, 0x003e5b2b}}}, + {X: Field{[10]uint32{0x00a011d6, 0x038d9ba9, 0x0278641e, 0x024e38af, 0x0268f827, 0x02e0a4b1, 0x027d064b, 0x01bbfde2, 0x0144a28a, 0x0009ee86}}, Y: Field{[10]uint32{0x027bdcab, 0x03dea613, 0x014d0a77, 0x01755d1a, 0x01fcbe30, 0x0163c15c, 0x0312fc94, 0x0190c39c, 0x00759d21, 0x00092fbe}}}, + {X: Field{[10]uint32{0x004fe190, 0x039f4025, 0x0348ee35, 0x011061c1, 0x01772f4c, 0x021cb83a, 0x03ca9ff7, 0x01f3820b, 0x00125fd8, 0x003f4dee}}, Y: Field{[10]uint32{0x03dcb453, 0x01ee6809, 0x02951184, 0x01118041, 0x028ec68a, 0x02ccdf7c, 0x01b8c43f, 0x0066376e, 0x0125d9ae, 0x00251429}}}, + {X: Field{[10]uint32{0x02071c69, 0x013322a3, 0x00b802c2, 0x02296576, 0x03446751, 0x00caa005, 0x0329b63f, 0x00f83634, 0x00ca9258, 0x0036659f}}, Y: Field{[10]uint32{0x03376c25, 0x0192ba5c, 0x02ab97ed, 0x034c85e7, 0x0328361c, 0x00b96bc9, 0x0086dbb9, 0x0275a4ef, 0x0273c2c3, 0x001ab28d}}}, + {X: Field{[10]uint32{0x014a0a3c, 0x027b502e, 0x0044f3d8, 0x017c38f4, 0x02f53cd4, 0x03f65705, 0x02798efb, 0x0007af48, 0x013c4a8d, 0x0023ba0b}}, Y: Field{[10]uint32{0x011e1b2d, 0x0189b1de, 0x022f036c, 0x02836ceb, 0x0379c8b6, 0x0356e702, 0x0271c3af, 0x03ee742a, 0x037e9167, 0x00382c2a}}}, + {X: Field{[10]uint32{0x00562caa, 0x022876c3, 0x01a4764c, 0x0336fc8b, 0x038d709c, 0x0140a5c1, 0x03ea0291, 0x02d526a7, 0x03d2817c, 0x001187b0}}, Y: Field{[10]uint32{0x036684af, 0x01abd1eb, 0x0259adb1, 0x0036c218, 0x0126cdf8, 0x00594100, 0x00f6e126, 0x025e4144, 0x017dcb5c, 0x001986cb}}}, + {X: Field{[10]uint32{0x01f5793e, 0x00406f50, 0x01890673, 0x0203cf79, 0x0059f517, 0x014ffdae, 0x01bb7ffb, 0x032bb51a, 0x005c0935, 0x000c5562}}, Y: Field{[10]uint32{0x0043dfff, 0x010d3388, 0x0181e28d, 0x0309a71d, 0x0208ca6a, 0x023cd5db, 0x00bbdfe0, 0x00423e34, 0x00e992ac, 0x00180d65}}}, + {X: Field{[10]uint32{0x024ea9eb, 0x0109d60a, 0x02f0dcad, 0x028ae7ed, 0x00c68a60, 0x03621d39, 0x02267a0a, 0x02670641, 0x03b0ad91, 0x00172b24}}, Y: Field{[10]uint32{0x000032ab, 0x008ee662, 0x0234a0e4, 0x0254df99, 0x03c48e72, 0x035d20fa, 0x0161fe7a, 0x036ae5a6, 0x0298a116, 0x0020dbea}}}, + {X: Field{[10]uint32{0x0156cc42, 0x03b15b1a, 0x039047e3, 0x01d09121, 0x0154d052, 0x02a3c05e, 0x02eea1c4, 0x03bd5a2d, 0x03acafd5, 0x0007edb4}}, Y: Field{[10]uint32{0x022a5411, 0x00f6bf4b, 0x00839313, 0x0120460f, 0x027431be, 0x014318d8, 0x036a1ec0, 0x013cc9b7, 0x01f2f89e, 0x002e3be4}}}, + {X: Field{[10]uint32{0x002b28f2, 0x03f1dcf6, 0x02bdcd31, 0x015fdeec, 0x0369fe01, 0x03f7b9ec, 0x00618f03, 0x0001768c, 0x01e152f0, 0x0022702c}}, Y: Field{[10]uint32{0x00b4a507, 0x01deac60, 0x007a9254, 0x0362b27d, 0x01ad8223, 0x009b19ed, 0x0105de5b, 0x01a05ab3, 0x0357bbf4, 0x001875b8}}}, + {X: Field{[10]uint32{0x039a211e, 0x01eac6ed, 0x01751080, 0x02f83cc7, 0x007cb968, 0x01064c90, 0x023875a3, 0x006bf359, 0x018b1f9d, 0x0001f174}}, Y: Field{[10]uint32{0x00779ff3, 0x02e70def, 0x01b3b6dc, 0x02c4a5b2, 0x03d136b5, 0x0353a517, 0x023b4495, 0x03683ef4, 0x03ea985b, 0x00117ef9}}}, + {X: Field{[10]uint32{0x0159f85c, 0x027744fc, 0x03792ddf, 0x034e978b, 0x00b6afda, 0x017adfc0, 0x031ad4db, 0x0042326c, 0x03c19393, 0x003209f3}}, Y: Field{[10]uint32{0x013a1cb1, 0x006aa99d, 0x01a129c3, 0x00f758cd, 0x000330ea, 0x0265478b, 0x03e12fc8, 0x03500553, 0x007a3025, 0x001717f8}}}, + {X: Field{[10]uint32{0x03cc5d9b, 0x005e1d55, 0x001e6571, 0x0201541d, 0x002e0dfa, 0x01ac806d, 0x01e2fa40, 0x03df7081, 0x032bb1f3, 0x0018d1ec}}, Y: Field{[10]uint32{0x028c3ba4, 0x02f868eb, 0x02e52e22, 0x03cec5c3, 0x01a455d3, 0x03e2b09b, 0x00d72553, 0x034d3292, 0x02109508, 0x003e3cc3}}}, + {X: Field{[10]uint32{0x03ae1014, 0x00748999, 0x00130e0a, 0x00ea5266, 0x02bfa21f, 0x036c0cab, 0x02e42837, 0x0040757d, 0x0195e822, 0x0035227d}}, Y: Field{[10]uint32{0x027c66a9, 0x0299b648, 0x000c22b4, 0x037fae54, 0x012bfa98, 0x00987e32, 0x024c33d1, 0x02851a3d, 0x02898dc4, 0x0022c44b}}}, + {X: Field{[10]uint32{0x00a6205b, 0x0016372e, 0x000b276f, 0x01cf50ef, 0x0102200d, 0x039da991, 0x02b8f981, 0x03ef3ab7, 0x0063fb4a, 0x002432e7}}, Y: Field{[10]uint32{0x02e74645, 0x00c93394, 0x0087ba02, 0x01ed6fdb, 0x002611a7, 0x00811c76, 0x02f19c67, 0x01fc6aee, 0x01c0f6ba, 0x002252bf}}}, + {X: Field{[10]uint32{0x02196af4, 0x0269e55a, 0x0018bbc4, 0x01b1a67a, 0x00869bb0, 0x002a6255, 0x026a1bef, 0x0087d395, 0x00bb19f1, 0x001037da}}, Y: Field{[10]uint32{0x020cec90, 0x02f758c8, 0x0269da31, 0x034a90c7, 0x02e1d6b3, 0x01843dad, 0x009f8303, 0x037df0c7, 0x0009d0ce, 0x001c3507}}}, + {X: Field{[10]uint32{0x03da41bf, 0x00450ea0, 0x009d78b4, 0x007acd55, 0x00a888dd, 0x00c7c5ff, 0x00962b64, 0x01411647, 0x0174a0ac, 0x00124dbf}}, Y: Field{[10]uint32{0x03ff4f92, 0x02d7fc86, 0x03392c5a, 0x00ad7743, 0x013fc5b7, 0x02cfc73d, 0x0068af85, 0x0214fb5f, 0x01dd6517, 0x000cea38}}}, + {X: Field{[10]uint32{0x02023557, 0x03a0ac36, 0x03594288, 0x039eca8f, 0x03c1a0c6, 0x025601d2, 0x03aad592, 0x01d6e3d6, 0x01388110, 0x0005c5dd}}, Y: Field{[10]uint32{0x01b10837, 0x02ec1cb0, 0x0077504b, 0x00a08e6a, 0x01b163fe, 0x00d36848, 0x03a0c5f7, 0x01d0b179, 0x0014efd8, 0x00160f52}}}, + {X: Field{[10]uint32{0x038926a2, 0x01dc33d3, 0x02bab586, 0x023c0da4, 0x006abb11, 0x03c87c82, 0x014c82d8, 0x0117aad0, 0x03fbad51, 0x002849ad}}, Y: Field{[10]uint32{0x022ec669, 0x032cb46b, 0x00394452, 0x0251a679, 0x0288d465, 0x007dffb0, 0x02bfdb74, 0x02d34868, 0x0017b601, 0x001e6d2b}}}, + {X: Field{[10]uint32{0x02871163, 0x0039c0eb, 0x004fdba3, 0x02361a61, 0x023485db, 0x03619694, 0x015de512, 0x00012035, 0x0361f884, 0x00147b33}}, Y: Field{[10]uint32{0x02a8d50f, 0x032bb4cb, 0x03dcee87, 0x02a55e94, 0x0012b2c6, 0x0003a824, 0x000c46a2, 0x0327c20b, 0x025397bd, 0x001652b4}}}, + {X: Field{[10]uint32{0x02b3c7a9, 0x016e8ed4, 0x02882510, 0x00e22d45, 0x03d89844, 0x01e7496b, 0x01966cca, 0x01c4c7d5, 0x02336f1b, 0x0025de05}}, Y: Field{[10]uint32{0x03214c60, 0x03a2764e, 0x01516e47, 0x03bbd0d5, 0x02105011, 0x0149d7ad, 0x01a20e0a, 0x023f8337, 0x0141b4b0, 0x003c77cd}}}, + {X: Field{[10]uint32{0x0093f7fe, 0x01e6f80b, 0x03f01cdb, 0x00ea1c2e, 0x0064231d, 0x0068d73a, 0x038cf6db, 0x0236ad71, 0x003a7224, 0x0022f0b1}}, Y: Field{[10]uint32{0x00cbb425, 0x02ef8385, 0x01b2ef49, 0x001e009a, 0x030b428f, 0x03eee75e, 0x028106af, 0x0276fc27, 0x0276173e, 0x00354b8b}}}, + {X: Field{[10]uint32{0x01aef9f2, 0x014f9401, 0x020d9799, 0x01d7a267, 0x036c3271, 0x012e42cd, 0x00abd033, 0x02846729, 0x00816c7c, 0x00167b5e}}, Y: Field{[10]uint32{0x02449910, 0x02981a85, 0x02133152, 0x0094d2f1, 0x02207794, 0x019a7836, 0x01b46a28, 0x003faf93, 0x0027690c, 0x0008e7f0}}}, + {X: Field{[10]uint32{0x03c70fda, 0x0033dacb, 0x025200ca, 0x0268b2ad, 0x01c8ff8e, 0x00a8e716, 0x01923907, 0x01265750, 0x01d17671, 0x002fb0e6}}, Y: Field{[10]uint32{0x010ba8e7, 0x0266ff6b, 0x03fbf709, 0x01f3bf17, 0x02a21a2f, 0x0394bcd1, 0x021ab9ad, 0x0082348e, 0x01ef7831, 0x003ff12f}}}, + {X: Field{[10]uint32{0x020c4d34, 0x00d62167, 0x0307668a, 0x036d6318, 0x019e3b87, 0x0348a9df, 0x01f99517, 0x03c76fe9, 0x01eef4ce, 0x0024ef49}}, Y: Field{[10]uint32{0x0335b4dc, 0x039aa1d9, 0x00860794, 0x018c0d01, 0x01fa008c, 0x03e265c3, 0x003b1f94, 0x006e1269, 0x00129736, 0x00375f45}}}, + {X: Field{[10]uint32{0x02ddcf58, 0x039b2483, 0x00f8e3e8, 0x0316f7a9, 0x0344e553, 0x01d15695, 0x00b2e708, 0x01354456, 0x0257fb4e, 0x002c80e9}}, Y: Field{[10]uint32{0x02d8c99c, 0x0200d657, 0x03a6a0ac, 0x029e866b, 0x03c74ae5, 0x010fee9e, 0x030d4c75, 0x03860987, 0x01480c63, 0x0026091a}}}, + {X: Field{[10]uint32{0x00f6aa69, 0x01a0f760, 0x024e70be, 0x008533fd, 0x023e20ac, 0x0076a2aa, 0x018a28d1, 0x009ed604, 0x013c1dcd, 0x002bce2d}}, Y: Field{[10]uint32{0x009fd919, 0x030cbe70, 0x02c16acd, 0x01e463e2, 0x035ec101, 0x028feb19, 0x02867237, 0x00ad08d1, 0x0136ba8b, 0x002478e2}}}, + {X: Field{[10]uint32{0x03fd8518, 0x0315d3da, 0x02d862f8, 0x01c83d79, 0x02988ed4, 0x002ad33b, 0x00587562, 0x03601788, 0x025b0b99, 0x00157936}}, Y: Field{[10]uint32{0x00eb2d35, 0x005845eb, 0x0130940b, 0x00963c5e, 0x02e7713b, 0x00d30d9b, 0x01b5976c, 0x0274cb85, 0x02347517, 0x001cda2f}}}, + {X: Field{[10]uint32{0x002133f5, 0x00e83279, 0x035d9018, 0x01b74968, 0x01a3608c, 0x03605f64, 0x021a15e1, 0x0389020f, 0x002aa7eb, 0x0034f5fa}}, Y: Field{[10]uint32{0x005d504b, 0x029f53ff, 0x03bfcae6, 0x01a5b06f, 0x024b1c6d, 0x031789dc, 0x01080b06, 0x00df1a25, 0x01cce895, 0x00029491}}}, + {X: Field{[10]uint32{0x02e48799, 0x01b9699b, 0x003f2231, 0x012da31b, 0x03beab75, 0x03732641, 0x021e8031, 0x0110de5d, 0x039fe6b5, 0x0022f453}}, Y: Field{[10]uint32{0x0178fe19, 0x0042bfda, 0x00603891, 0x009f66ba, 0x00ecb2eb, 0x0158ce1a, 0x0263a263, 0x01895d45, 0x0150a387, 0x003e2770}}}, + {X: Field{[10]uint32{0x02212932, 0x0223f488, 0x0370485c, 0x016c1208, 0x023a7dbc, 0x01ca9688, 0x02b08589, 0x003d0b3f, 0x036503f5, 0x002c75c8}}, Y: Field{[10]uint32{0x002143ac, 0x03cdc5b0, 0x0025570b, 0x013801f4, 0x01627986, 0x0216c877, 0x00aa52d3, 0x0387e6dd, 0x01d8594e, 0x0010165f}}}, + {X: Field{[10]uint32{0x039d3023, 0x03d3dc99, 0x013a8593, 0x000c1787, 0x01c22d44, 0x001173bd, 0x03e4763e, 0x0248324e, 0x03e1cb7d, 0x001134c0}}, Y: Field{[10]uint32{0x0189a70c, 0x004b1857, 0x02004769, 0x02a6806c, 0x03e77e41, 0x00f8f3b8, 0x03d6fcc8, 0x0368bcc6, 0x02fc5ed6, 0x001e7ef7}}}, + {X: Field{[10]uint32{0x030cb3ca, 0x03ae848e, 0x00aed3df, 0x026420f5, 0x02925589, 0x0183ae65, 0x03bd4b90, 0x02aba5c9, 0x0054447a, 0x0005957b}}, Y: Field{[10]uint32{0x0226fcdf, 0x03b39419, 0x017443b9, 0x029ac76b, 0x006ea28f, 0x027c1b65, 0x00f7bf8a, 0x038c7a62, 0x0178cf96, 0x0023a439}}}, + {X: Field{[10]uint32{0x005a3f29, 0x01eedf61, 0x02cb1971, 0x00120032, 0x027902b1, 0x0226439b, 0x01a93261, 0x019afd9b, 0x03fb5305, 0x002c0ab8}}, Y: Field{[10]uint32{0x03006876, 0x000c1f5e, 0x0105162a, 0x00ca4a98, 0x03d8c052, 0x02ce5d09, 0x03b76311, 0x00c0c466, 0x0313f448, 0x0031b4c9}}}, + {X: Field{[10]uint32{0x00c5bcd3, 0x03927344, 0x02c6e065, 0x0266854f, 0x018e1236, 0x02c4ae6b, 0x015e1402, 0x0010ae1d, 0x016653a0, 0x0004f119}}, Y: Field{[10]uint32{0x02d41c88, 0x024b1441, 0x002b0044, 0x02a29e2c, 0x007bab13, 0x00eb0f84, 0x0121ea40, 0x0180f8f1, 0x032c498f, 0x001c3cd9}}}, + {X: Field{[10]uint32{0x00f1483f, 0x03b68f01, 0x034c6361, 0x00fc5077, 0x010dee48, 0x017a5ece, 0x01c7bffc, 0x00dee0ba, 0x022b03fc, 0x0039f1d5}}, Y: Field{[10]uint32{0x03454066, 0x00be39b0, 0x028331b1, 0x026076ec, 0x021a9372, 0x01e85b43, 0x03dce515, 0x01256306, 0x00603d2b, 0x001cd2f9}}}, + {X: Field{[10]uint32{0x0159aefc, 0x035fee8a, 0x038d2263, 0x00870c12, 0x03332f39, 0x02f1ec9f, 0x02b2ed1e, 0x03f1d4d0, 0x012dfb6c, 0x00378097}}, Y: Field{[10]uint32{0x02de12f1, 0x01dbc705, 0x005985e6, 0x007601a5, 0x001a88c3, 0x020dce8c, 0x02fc30c3, 0x03cf40b6, 0x01b16ab6, 0x0011b182}}}, + {X: Field{[10]uint32{0x02ca2e01, 0x00b0c8cf, 0x03e4b6a4, 0x03d20e05, 0x0225730a, 0x02ebc14e, 0x01db714a, 0x0070f497, 0x00b4fed2, 0x000879e2}}, Y: Field{[10]uint32{0x01c1c4c6, 0x00a7f6b9, 0x03c58ddd, 0x03e73504, 0x01b249b1, 0x008cd6e7, 0x02af9b83, 0x01d64ad9, 0x02bda7d0, 0x0007f9c5}}}, + {X: Field{[10]uint32{0x0379edce, 0x033fc41e, 0x02012e39, 0x02776a5f, 0x02d1bc1a, 0x01d6ca39, 0x0058242c, 0x03542c69, 0x03ca7481, 0x0029f6c9}}, Y: Field{[10]uint32{0x01ae73f8, 0x00d860dc, 0x02238851, 0x0348ec47, 0x00084239, 0x02569f31, 0x0055fc17, 0x039b074d, 0x006dcabd, 0x00313e1a}}}, + {X: Field{[10]uint32{0x022d477a, 0x03d92d97, 0x01ccf41a, 0x00faf56f, 0x01e80a7d, 0x02b22533, 0x01616275, 0x03c90388, 0x01732790, 0x00314814}}, Y: Field{[10]uint32{0x022ba20b, 0x02fab27d, 0x03cda463, 0x00290150, 0x00af8770, 0x03ab70fe, 0x028e216d, 0x004283c3, 0x015b2094, 0x003a6a8a}}}, + {X: Field{[10]uint32{0x0172846d, 0x00dc7125, 0x01d05ea9, 0x03aa2e15, 0x0138e91e, 0x00dbaf36, 0x0025f86d, 0x036bafc7, 0x00ad99d1, 0x00121efd}}, Y: Field{[10]uint32{0x00febf70, 0x02a55dbf, 0x00ffe791, 0x01c21b78, 0x0032f729, 0x013062b8, 0x004b2a50, 0x03b42fb8, 0x0037ac6d, 0x00204a4e}}}, + {X: Field{[10]uint32{0x0208cb53, 0x005120c3, 0x03cb13cd, 0x01d083b7, 0x01355675, 0x03958097, 0x03e2d550, 0x01a22e13, 0x02a6bfcf, 0x002f5b74}}, Y: Field{[10]uint32{0x01ab0fca, 0x00dcc936, 0x01a1a1b0, 0x00b34714, 0x000c467d, 0x00a14566, 0x02a1501c, 0x00e018e3, 0x01e184c8, 0x00321a91}}}, + {X: Field{[10]uint32{0x035ec737, 0x02931f08, 0x02ce7936, 0x00619caf, 0x0070dbca, 0x0019cc7a, 0x034fbb69, 0x0223904c, 0x03fdfbf1, 0x00252905}}, Y: Field{[10]uint32{0x01be8e34, 0x026910f6, 0x01765029, 0x024d51be, 0x03564e9f, 0x033edf65, 0x02af124b, 0x03052e07, 0x0207343e, 0x00380f19}}}, + {X: Field{[10]uint32{0x02aba51e, 0x02236519, 0x00fa8ebd, 0x034c0e5a, 0x002ac597, 0x005e88f0, 0x02d9b733, 0x00ec9aa5, 0x02c33fa1, 0x000a95f6}}, Y: Field{[10]uint32{0x00c13b61, 0x02ca4dfa, 0x010c442d, 0x0366016d, 0x013b05bf, 0x0117cd3f, 0x027996e5, 0x02cee2c2, 0x02bf1db7, 0x0005d529}}}, + {X: Field{[10]uint32{0x007e7df7, 0x0242dffb, 0x01742eae, 0x0284b0fe, 0x02d1c66d, 0x00c20f0c, 0x00613e99, 0x00a8e59f, 0x02710614, 0x002e8b92}}, Y: Field{[10]uint32{0x034cb07e, 0x01eb3fa0, 0x00c971da, 0x00d6091f, 0x02ccc6de, 0x02b7b197, 0x03fc60c5, 0x03a0efb5, 0x00c1a704, 0x003098be}}}, + {X: Field{[10]uint32{0x00c01ca9, 0x018baa3b, 0x015a80a8, 0x02681cc3, 0x0008bb0b, 0x03eef609, 0x00a12b11, 0x00944b4a, 0x0343b313, 0x0012b865}}, Y: Field{[10]uint32{0x0017eece, 0x01323de8, 0x0019320b, 0x00f0fe75, 0x00cb2788, 0x029aa2e8, 0x001ec7c0, 0x00fa8747, 0x027d48fa, 0x0019edc9}}}, + {X: Field{[10]uint32{0x0306ddcb, 0x0143a9dd, 0x023ad618, 0x02fd046d, 0x000778b9, 0x01dd24fc, 0x00e6ff9d, 0x00d99fc6, 0x026c8182, 0x000133ec}}, Y: Field{[10]uint32{0x00e4028e, 0x00789dc9, 0x020c778e, 0x01e70e5e, 0x01aa6c60, 0x001f0c84, 0x017af164, 0x024f7c13, 0x023e3a8c, 0x000437e2}}}, + {X: Field{[10]uint32{0x01130349, 0x034f6e57, 0x02561934, 0x0009bdf5, 0x0215f061, 0x00f01418, 0x03bc3efb, 0x02d9bc03, 0x0166a014, 0x0027e791}}, Y: Field{[10]uint32{0x0396c592, 0x005f4964, 0x015fb0a4, 0x027333f2, 0x02ab6e5c, 0x01682a9e, 0x03d0c17c, 0x009aee63, 0x03a276d5, 0x00124ae2}}}, + {X: Field{[10]uint32{0x00239301, 0x033c7dab, 0x03bd222e, 0x0252d57c, 0x03ecf2a1, 0x0045678b, 0x039f4c10, 0x02d582c3, 0x01133641, 0x0038db01}}, Y: Field{[10]uint32{0x0343736c, 0x01696f6e, 0x00c7faa0, 0x004eb0ac, 0x0220e9a1, 0x027e0ea0, 0x022aea8e, 0x03f1018c, 0x00ba48e7, 0x0031ff5d}}}, + {X: Field{[10]uint32{0x00480bbf, 0x027e0936, 0x025e033e, 0x02938fb1, 0x02a0bbe0, 0x03c76846, 0x0337580b, 0x0115a1e1, 0x03b3b94d, 0x00246c04}}, Y: Field{[10]uint32{0x00cfc5b4, 0x00bc8afa, 0x03f00647, 0x02b0f4d9, 0x02948790, 0x038cf45c, 0x026f8247, 0x0094a48a, 0x007ec13a, 0x000578dc}}}, + {X: Field{[10]uint32{0x02324f56, 0x00fdc8fa, 0x001077d4, 0x01eb5d74, 0x00041f66, 0x0354e7cb, 0x02782de2, 0x01b5488d, 0x03888c67, 0x00095345}}, Y: Field{[10]uint32{0x0014094a, 0x00944cf2, 0x002755fd, 0x037e5e5d, 0x0309bec3, 0x02cb6fc9, 0x034aa03b, 0x0079744f, 0x012e9351, 0x003dc10b}}}, + {X: Field{[10]uint32{0x02f4079a, 0x00d59e15, 0x03f0b061, 0x018a65a5, 0x0234fce6, 0x0288bc5b, 0x03abe442, 0x003dc4ab, 0x037ece7d, 0x00114b5a}}, Y: Field{[10]uint32{0x03776998, 0x00c5691f, 0x02d23db3, 0x0164504c, 0x029a39ee, 0x0384c812, 0x000d69fc, 0x03f9d8d0, 0x03a128cf, 0x00087aa2}}}, + {X: Field{[10]uint32{0x004c508b, 0x01451e73, 0x001631f1, 0x02157ca3, 0x02817831, 0x02c660b4, 0x0386b855, 0x023d0606, 0x01d00788, 0x0005602e}}, Y: Field{[10]uint32{0x01d689ff, 0x03403d70, 0x02dc3ecd, 0x02abd95d, 0x0365b69f, 0x01e306df, 0x03cbbe87, 0x036775ce, 0x029c78b3, 0x00136747}}}, + {X: Field{[10]uint32{0x02fc2700, 0x00e582a8, 0x02f450c4, 0x01fb4212, 0x0245a5aa, 0x033c9680, 0x011470c2, 0x0253245b, 0x023fc316, 0x001e7768}}, Y: Field{[10]uint32{0x015bc978, 0x03c968ea, 0x03c03c34, 0x0086855b, 0x02d7158c, 0x01dc0c73, 0x0374e0f3, 0x02363312, 0x0169a58b, 0x001f1ef0}}}, + {X: Field{[10]uint32{0x0149dbe6, 0x036bb850, 0x013b5fe2, 0x00141119, 0x02419b49, 0x017d2a83, 0x02500afb, 0x0337084f, 0x03a9bf80, 0x00219b69}}, Y: Field{[10]uint32{0x026bd3d7, 0x02066add, 0x0124b239, 0x00b1af19, 0x02081a28, 0x022af126, 0x027e8adc, 0x015ea9a1, 0x00b3b45d, 0x00189b4e}}}, + {X: Field{[10]uint32{0x0011d374, 0x012e02e5, 0x0122e102, 0x032be641, 0x02cdb502, 0x01818ae5, 0x01624cfc, 0x01c7a4c8, 0x0112bed2, 0x0010caf2}}, Y: Field{[10]uint32{0x0011cf01, 0x0339a8f9, 0x03605bcd, 0x030aebae, 0x034cb341, 0x03175177, 0x020cc5ac, 0x01350507, 0x009edd7c, 0x00399151}}}, + {X: Field{[10]uint32{0x0010518e, 0x00fb27d9, 0x01be477b, 0x02b420e9, 0x030717f5, 0x009764de, 0x02970865, 0x00e16854, 0x032883ec, 0x002b0f4e}}, Y: Field{[10]uint32{0x00b9b8db, 0x031c9a21, 0x01a125fc, 0x03e55061, 0x033dde58, 0x0039e439, 0x00d01b2c, 0x01f9d704, 0x02fcc9ed, 0x003449bb}}}, + {X: Field{[10]uint32{0x03d6aa37, 0x00f690ea, 0x0064a5c1, 0x018a5834, 0x03fa18b2, 0x01ab8999, 0x03696d95, 0x00e175b6, 0x034b2a82, 0x00115c20}}, Y: Field{[10]uint32{0x01236f28, 0x0121ac18, 0x004e121a, 0x0192b590, 0x03d9d15c, 0x02a565f9, 0x022eb590, 0x02fe21ee, 0x0083b249, 0x0007a758}}}, + {X: Field{[10]uint32{0x0183ef15, 0x00d5752e, 0x03fd3341, 0x0144dabb, 0x02b224b0, 0x0058f02a, 0x029bf792, 0x03816df0, 0x02a0ffaa, 0x00223a69}}, Y: Field{[10]uint32{0x018d1e5a, 0x01a4c91c, 0x00413999, 0x01d746ba, 0x00fe4574, 0x01e6aebf, 0x00ef5e25, 0x018fab71, 0x022dfa2f, 0x003b4e0a}}}, + {X: Field{[10]uint32{0x02dff706, 0x0361d20a, 0x0348c04f, 0x00ef5b25, 0x00b39703, 0x02b5fd86, 0x005663dc, 0x009f1a94, 0x02b4de33, 0x0005a043}}, Y: Field{[10]uint32{0x0260c81b, 0x02f0b3fb, 0x0111901f, 0x01f96a7b, 0x0230693b, 0x00370a6b, 0x019e84c4, 0x01b27485, 0x03d89132, 0x0000d4ba}}}, + {X: Field{[10]uint32{0x014adf7b, 0x00cc0726, 0x01cabe2e, 0x03650fea, 0x0088c861, 0x0223455f, 0x01c65035, 0x01260473, 0x02929506, 0x0035f40e}}, Y: Field{[10]uint32{0x002f9627, 0x00578d8e, 0x003ef2a9, 0x023f66aa, 0x02ef419c, 0x0339e079, 0x023042d5, 0x00b01472, 0x03fe933c, 0x00232082}}}, + {X: Field{[10]uint32{0x01cf11b0, 0x03c994b7, 0x018d91c6, 0x01df9154, 0x03f33aed, 0x0220339e, 0x0225c4ae, 0x02b24093, 0x0104f645, 0x0016cb25}}, Y: Field{[10]uint32{0x01296449, 0x02271d8a, 0x00354fc2, 0x02893abb, 0x03440e1d, 0x023ca901, 0x01681e5e, 0x013cc847, 0x03bcc776, 0x001402cd}}}, + {X: Field{[10]uint32{0x00fbd761, 0x012b7523, 0x01c2d628, 0x0137d5e7, 0x03bab1a6, 0x03567bb0, 0x01826759, 0x022ef05a, 0x02edd2c7, 0x00346389}}, Y: Field{[10]uint32{0x010770c3, 0x031fbd5f, 0x021a44a6, 0x03684e4b, 0x00685915, 0x016eda51, 0x018989aa, 0x00f9e23f, 0x0172037a, 0x00068780}}}, + {X: Field{[10]uint32{0x0258222d, 0x00d338a3, 0x0077224f, 0x02fe1759, 0x02dc9e46, 0x03c94951, 0x0221e88d, 0x011e5632, 0x00169bbc, 0x0017dac5}}, Y: Field{[10]uint32{0x037fd6a6, 0x02ab6bd2, 0x00600e02, 0x02378e0f, 0x033a5791, 0x018f992e, 0x03ca0bf1, 0x00140651, 0x02164d5a, 0x000ea39d}}}, + {X: Field{[10]uint32{0x03762bc7, 0x036f2283, 0x0137339b, 0x00289508, 0x01ec2e05, 0x03fa15a4, 0x00020238, 0x02d159a6, 0x01e8dcc8, 0x0035e989}}, Y: Field{[10]uint32{0x02ea3643, 0x0142d34d, 0x0080620d, 0x029c4000, 0x00208683, 0x03b07f63, 0x017bcbcf, 0x00981eaf, 0x0135a8ce, 0x0023c7e6}}}, + {X: Field{[10]uint32{0x015913f9, 0x03198fa3, 0x027716ba, 0x0325780a, 0x027ffb42, 0x0286cd3a, 0x01c891b3, 0x0293dc57, 0x001972ae, 0x00295a95}}, Y: Field{[10]uint32{0x03c3f994, 0x0266a41a, 0x038971e9, 0x008d9038, 0x0059b440, 0x01fd7451, 0x00f7bbfa, 0x0159c460, 0x03cdad78, 0x0011ecf7}}}, + {X: Field{[10]uint32{0x02ade31e, 0x0045beae, 0x03c3ad93, 0x02ccd86d, 0x0030325d, 0x028c1ad1, 0x031a3cd4, 0x032f44de, 0x01d7e574, 0x0007aee2}}, Y: Field{[10]uint32{0x00da4dc7, 0x01401d4e, 0x03e6cb95, 0x00cd24d5, 0x02ee020c, 0x0108a8d0, 0x003d1185, 0x03212d26, 0x012fbd30, 0x00080e71}}}, + {X: Field{[10]uint32{0x009706fe, 0x024ea22d, 0x030c5ad4, 0x03e8fb93, 0x03e189ef, 0x01e63b09, 0x01cd1a4a, 0x0195d52d, 0x0208931a, 0x002d5ca0}}, Y: Field{[10]uint32{0x03ede9ee, 0x037df442, 0x036c214d, 0x0028c5e0, 0x03358f68, 0x01881e2f, 0x029a6125, 0x034c072c, 0x01e72da3, 0x002ae9e1}}}, + {X: Field{[10]uint32{0x01a775c9, 0x015f2161, 0x00a8aa24, 0x025d1ebf, 0x02f5162a, 0x03ff07bd, 0x02a00dee, 0x01f1dc80, 0x0270d67b, 0x00159985}}, Y: Field{[10]uint32{0x018803f6, 0x01128953, 0x019b2ea0, 0x024ce7c6, 0x014de8a8, 0x015274f0, 0x0055122e, 0x01441c13, 0x00e183bc, 0x002b6bc2}}}, + {X: Field{[10]uint32{0x01f2704d, 0x001a3c37, 0x023e93fd, 0x0346c5c2, 0x01c18521, 0x015cded4, 0x01042433, 0x01ada5dc, 0x02e1ecc8, 0x00062ad5}}, Y: Field{[10]uint32{0x0119e94a, 0x020967a0, 0x039ff46b, 0x01fb387f, 0x03df74f0, 0x032cc158, 0x009572ca, 0x02ea6c83, 0x003f43bf, 0x00331a53}}}, + {X: Field{[10]uint32{0x020ac357, 0x0283c6f3, 0x027c3c1a, 0x0214b83c, 0x036e9451, 0x02fd7d43, 0x035b7540, 0x000d8055, 0x00744827, 0x002f04aa}}, Y: Field{[10]uint32{0x01ada1e9, 0x0005f1bc, 0x036f95de, 0x01598bfc, 0x00abe12d, 0x00812b39, 0x027783c7, 0x01738759, 0x036bac17, 0x00271b39}}}, + {X: Field{[10]uint32{0x01054584, 0x01eb119e, 0x024572c2, 0x0259776f, 0x01756667, 0x014fb29d, 0x01bdd6c3, 0x036835bb, 0x002699b2, 0x00291253}}, Y: Field{[10]uint32{0x0082d621, 0x014e1b54, 0x01d03554, 0x01a4ee2b, 0x02e8f0cf, 0x00756c6e, 0x022a9146, 0x02a79f4f, 0x00d58360, 0x00162601}}}, + {X: Field{[10]uint32{0x023aea6e, 0x012b2733, 0x009c7828, 0x038ba8f7, 0x03f1baf9, 0x000da809, 0x034de77d, 0x0139faf8, 0x02f96d0e, 0x0007fe11}}, Y: Field{[10]uint32{0x013f2e6a, 0x00f84b59, 0x009748d0, 0x03be94b7, 0x0327ba3e, 0x01302da3, 0x035d1a8d, 0x00d580c7, 0x036b9f0e, 0x0022828c}}}, + {X: Field{[10]uint32{0x0110b374, 0x023c7ca5, 0x00099ffa, 0x0090d5d1, 0x026862d7, 0x005cfdc5, 0x00839e04, 0x00f771ca, 0x02ae9157, 0x000cc606}}, Y: Field{[10]uint32{0x01c5223e, 0x039f27ef, 0x01fedad0, 0x01acf86a, 0x01f01ee2, 0x030d3129, 0x01aaa0a4, 0x03393077, 0x029a8cc8, 0x00049484}}}, + {X: Field{[10]uint32{0x00012594, 0x0232795e, 0x02ae5702, 0x001bf931, 0x00644264, 0x01c9d2a5, 0x0249b157, 0x0112bbdd, 0x032dfb0e, 0x0039a1e0}}, Y: Field{[10]uint32{0x0113b7c0, 0x030312a9, 0x030028ca, 0x0263bb2a, 0x03c5de4f, 0x01dffedf, 0x01caec8c, 0x00d2ded9, 0x009706b7, 0x001796ce}}}, + {X: Field{[10]uint32{0x00b37def, 0x031cbce5, 0x02aa5755, 0x01477d31, 0x0000c229, 0x028631db, 0x0174b5e2, 0x01c6b160, 0x02c3ed93, 0x000d52ef}}, Y: Field{[10]uint32{0x0214c29a, 0x02a0ff31, 0x0244b5c2, 0x03beeeae, 0x033c2f4d, 0x01d0078f, 0x0213ac73, 0x0105b6cd, 0x00769283, 0x00103432}}}, + {X: Field{[10]uint32{0x0039a485, 0x01bdc99d, 0x00511ae3, 0x02ffe8bd, 0x02a8bc68, 0x02d7afbc, 0x01e8aa68, 0x02e07cf2, 0x006c5205, 0x003e91ab}}, Y: Field{[10]uint32{0x0367d180, 0x01354b8f, 0x03b35c1b, 0x01e9d97e, 0x010f2565, 0x00fe4461, 0x00de37b1, 0x034aa007, 0x01fab016, 0x000e14fe}}}, + {X: Field{[10]uint32{0x0024328c, 0x01fb50cc, 0x02688562, 0x01de517d, 0x0256a53d, 0x008fee1b, 0x005263c9, 0x017e387a, 0x02b73325, 0x00109be1}}, Y: Field{[10]uint32{0x028c4fdf, 0x03bef353, 0x011486a2, 0x0105abfe, 0x01658c63, 0x01ec8885, 0x013c4c45, 0x0322756c, 0x01685301, 0x0024bb00}}}, + {X: Field{[10]uint32{0x00bc64e3, 0x02db9620, 0x01edeb47, 0x03b2d6b8, 0x017685df, 0x01f5233c, 0x01d3f4d1, 0x00b56f85, 0x009bf9a7, 0x00172347}}, Y: Field{[10]uint32{0x01bda7e5, 0x0343df4a, 0x02dc4e18, 0x014d9074, 0x00b6a26b, 0x0083c37b, 0x038a3c7c, 0x02054198, 0x010e286c, 0x00188155}}}, + {X: Field{[10]uint32{0x0283422f, 0x02f95c39, 0x03c80271, 0x01cfe998, 0x01be6733, 0x01aa72c0, 0x00313562, 0x01407f77, 0x01bc7bf7, 0x000e8087}}, Y: Field{[10]uint32{0x001bfa53, 0x01ec3793, 0x00fff54c, 0x0209217f, 0x02a7a71b, 0x0015924a, 0x00e508ad, 0x037e25e1, 0x00540dda, 0x00192a27}}}, + {X: Field{[10]uint32{0x03ba47bb, 0x012bc9c8, 0x0326fa50, 0x030c8a59, 0x027c0062, 0x007590b6, 0x01d2dd91, 0x027c001d, 0x02491d71, 0x002360aa}}, Y: Field{[10]uint32{0x03e4e77a, 0x01718b14, 0x026991ff, 0x03f51d83, 0x007c2ae8, 0x031b4f14, 0x00ed10d6, 0x01e3da62, 0x03506d14, 0x001b985b}}}, + {X: Field{[10]uint32{0x005e536f, 0x03c2394f, 0x02d76f27, 0x0145b9ea, 0x010bbe54, 0x032b06cf, 0x015d60ef, 0x023869bb, 0x0188fe48, 0x001bfbba}}, Y: Field{[10]uint32{0x0044c502, 0x00a6632c, 0x00eeff48, 0x0184d781, 0x0073dcee, 0x0096da28, 0x026d8484, 0x02ea5ae8, 0x0395839f, 0x00003ba7}}}, + {X: Field{[10]uint32{0x0216fa1b, 0x00f9672b, 0x00e5d2df, 0x002ba257, 0x02306388, 0x005024f1, 0x03cadc73, 0x00355dcb, 0x0179bafd, 0x000d8902}}, Y: Field{[10]uint32{0x004afa48, 0x005f1872, 0x036ca65f, 0x003055e0, 0x03eb2082, 0x01f60cb2, 0x02fe3267, 0x00f6169e, 0x037658ef, 0x00186740}}}, + {X: Field{[10]uint32{0x036a18f4, 0x026128f3, 0x03407009, 0x0132461d, 0x000b7849, 0x01ba05c1, 0x0046fc32, 0x01814f08, 0x00474da5, 0x00130ae2}}, Y: Field{[10]uint32{0x0328142c, 0x007f884e, 0x03398dda, 0x038f432a, 0x03734286, 0x01716a08, 0x00a0b438, 0x035c4587, 0x026917a4, 0x001166a7}}}, + {X: Field{[10]uint32{0x01478ac2, 0x004beeac, 0x005ad84e, 0x0142bdee, 0x00d6e54f, 0x0141130d, 0x034eb5b1, 0x0046ea9f, 0x01fdb332, 0x003e4872}}, Y: Field{[10]uint32{0x02016973, 0x005243eb, 0x014f9317, 0x030d7356, 0x01e31fae, 0x03dfd893, 0x006b16a5, 0x0120f923, 0x01b8c850, 0x000e336a}}}, + {X: Field{[10]uint32{0x0319b257, 0x00b1ac86, 0x038b8ca4, 0x01f7d079, 0x02850ae0, 0x028ff6d3, 0x006c8a7d, 0x035a3e3e, 0x01e66181, 0x00295dda}}, Y: Field{[10]uint32{0x027cfc6c, 0x0276bf14, 0x00eb3882, 0x0260a03e, 0x011dcd66, 0x013542e9, 0x017e00d5, 0x0310afdd, 0x007e644b, 0x00084aa6}}}, + {X: Field{[10]uint32{0x03c11d9f, 0x02a526b1, 0x0063901e, 0x0053fb5d, 0x03375a27, 0x00f26c5a, 0x00c91952, 0x03b2b622, 0x010437ab, 0x002569e0}}, Y: Field{[10]uint32{0x02cfdf78, 0x007b2ca8, 0x0274809e, 0x01da4688, 0x00ec6428, 0x03c46925, 0x02723df1, 0x0015ac90, 0x00aa227b, 0x003ab8c8}}}, + {X: Field{[10]uint32{0x01cfa42a, 0x03503d0a, 0x020e5d10, 0x01761612, 0x009f034a, 0x03a61002, 0x01a9a64c, 0x00f850ab, 0x0034f7ef, 0x001da9f8}}, Y: Field{[10]uint32{0x028effa2, 0x0251a2d9, 0x0240479c, 0x025948a8, 0x009f2e49, 0x02f0bbb7, 0x00ec9319, 0x03acf0a9, 0x00e49633, 0x00266770}}}, + {X: Field{[10]uint32{0x035881d6, 0x023347ba, 0x0247df4e, 0x03357a50, 0x01427010, 0x036df60b, 0x00ddf929, 0x01e01407, 0x03964756, 0x003aea24}}, Y: Field{[10]uint32{0x03bca552, 0x029a6d76, 0x026a50d4, 0x022a3692, 0x02aebe0f, 0x005b3175, 0x037d8be6, 0x014850fc, 0x01f1c088, 0x002e4ab8}}}, + {X: Field{[10]uint32{0x0223704f, 0x03cf875b, 0x028addd3, 0x0225c4f3, 0x01dc0b75, 0x02bb51cd, 0x014f872a, 0x038559ac, 0x00d8059f, 0x00294e92}}, Y: Field{[10]uint32{0x01387fb6, 0x022d454e, 0x02a0d252, 0x00619db3, 0x004f4634, 0x03b9f559, 0x009403f3, 0x028ea0f6, 0x01a07e85, 0x00279ce3}}}, + {X: Field{[10]uint32{0x0307d3bc, 0x013f57a9, 0x00fb595b, 0x03e660a2, 0x03c831cd, 0x001418e9, 0x039b1481, 0x03e28e38, 0x010bdba5, 0x0020c996}}, Y: Field{[10]uint32{0x03768982, 0x01986caf, 0x02b06cb4, 0x013ca5f9, 0x03061b7d, 0x03e904c3, 0x000d62ec, 0x037494b4, 0x0388a2a1, 0x000280b3}}}, + {X: Field{[10]uint32{0x03916030, 0x02b1b7c5, 0x014af7f5, 0x00b02571, 0x03b0c35a, 0x01e9d2cb, 0x01714a21, 0x0042ff8c, 0x0194ba8c, 0x001a9248}}, Y: Field{[10]uint32{0x00c77b87, 0x01b148be, 0x0145db6b, 0x0001bfaf, 0x01c531cd, 0x013f0ca2, 0x02e8b4fb, 0x024dea4b, 0x01658e0c, 0x000f3c2f}}}, + {X: Field{[10]uint32{0x03c52a57, 0x030c1a0c, 0x007474b6, 0x004df8f5, 0x013b34bf, 0x01ae8887, 0x0180c494, 0x01fbb587, 0x01c6ff79, 0x002d2b1c}}, Y: Field{[10]uint32{0x012820f7, 0x000d41b5, 0x03683905, 0x01837e04, 0x0214ae3b, 0x01893835, 0x03d23434, 0x03fbf3bc, 0x02e48fb6, 0x0011ab2c}}}, + {X: Field{[10]uint32{0x0286e0bc, 0x0064c5b0, 0x02f9b49a, 0x024e8707, 0x0113b19b, 0x0155ec84, 0x03f05b4e, 0x00a7845a, 0x011e65bc, 0x0022c45c}}, Y: Field{[10]uint32{0x02af0dde, 0x0241e322, 0x004910aa, 0x03d71c8b, 0x00faa6bc, 0x02d3ab96, 0x02d695e5, 0x00d4e086, 0x00cfcf38, 0x001e7128}}}, + {X: Field{[10]uint32{0x0008e098, 0x013d90d1, 0x0192d897, 0x030db5e8, 0x00727362, 0x0203f789, 0x0203f82e, 0x0095e65d, 0x0276e86b, 0x002e2c02}}, Y: Field{[10]uint32{0x013e56c6, 0x006dbe14, 0x03d0a585, 0x03ede121, 0x029e0b9f, 0x03ab5ecb, 0x006fa1cf, 0x002375f3, 0x03188b01, 0x000176d9}}}, + {X: Field{[10]uint32{0x01d89814, 0x038b4b58, 0x03a52c50, 0x01a41917, 0x02bebe8f, 0x026dc4f1, 0x0027a8f6, 0x02e5a14d, 0x021b0fb6, 0x0022130e}}, Y: Field{[10]uint32{0x03a3749b, 0x01963381, 0x00fbf14d, 0x012f56c6, 0x00ff28aa, 0x03d537b0, 0x003f821d, 0x00bbbcdd, 0x00e5094b, 0x000f6b30}}}, + {X: Field{[10]uint32{0x00637596, 0x0291fe5d, 0x037d8496, 0x006abad8, 0x02c004dd, 0x02fdbed3, 0x004100dc, 0x02fd8ff8, 0x01cf51aa, 0x000f4307}}, Y: Field{[10]uint32{0x025df51c, 0x010c8d82, 0x0305d228, 0x004cf8bb, 0x02883fe0, 0x0267eedd, 0x0242a6f5, 0x038b3418, 0x015bbf5d, 0x0015dbaf}}}, + {X: Field{[10]uint32{0x02bca8c7, 0x020478b6, 0x028fa13f, 0x02d8f54c, 0x031ae972, 0x009deddf, 0x0057f79a, 0x026b7097, 0x01af6153, 0x0015acfb}}, Y: Field{[10]uint32{0x012e98eb, 0x02b19b4b, 0x01347dbd, 0x02ade6cf, 0x0096bdfb, 0x0376a574, 0x02b3d2b5, 0x021809c6, 0x0100a2b2, 0x00100e0e}}}, + {X: Field{[10]uint32{0x03cfd3e2, 0x02417eca, 0x01457a74, 0x0360c67e, 0x025fbb11, 0x0115217f, 0x00eacfa8, 0x01327d0d, 0x01bf50f3, 0x00109b8a}}, Y: Field{[10]uint32{0x03cb117a, 0x004c660c, 0x017a35d6, 0x02237c7d, 0x00eeb60b, 0x00ee77d0, 0x0110cd5c, 0x01031883, 0x02e8eeff, 0x003ab11f}}}, + {X: Field{[10]uint32{0x02929308, 0x014329d8, 0x03ea67ed, 0x03ed6ff0, 0x03cf0a91, 0x00bb6b71, 0x01419baa, 0x0135fb1b, 0x03c9f4e2, 0x002555cd}}, Y: Field{[10]uint32{0x001675dd, 0x02b3bb52, 0x0260867b, 0x02d6ee0b, 0x01b69831, 0x0166fd91, 0x02783143, 0x024100be, 0x009d18fd, 0x0025eeee}}}, + {X: Field{[10]uint32{0x00b3e514, 0x021405fa, 0x004a1cbb, 0x02820e9e, 0x00704e74, 0x035f9eb4, 0x03ae639f, 0x009e83cb, 0x0013d464, 0x00175caa}}, Y: Field{[10]uint32{0x00876c2f, 0x00584f2e, 0x005ac9bc, 0x00dbd471, 0x022e8c26, 0x0267ae56, 0x01d6839a, 0x03187956, 0x010e851f, 0x00324bd0}}}, + {X: Field{[10]uint32{0x0369b6ef, 0x0146edf9, 0x02406225, 0x02701e14, 0x02dda784, 0x01c12570, 0x00876d91, 0x02224188, 0x0359e9bc, 0x0031f6a4}}, Y: Field{[10]uint32{0x01c10653, 0x02530fc1, 0x001c6d37, 0x031720bc, 0x01cb41f6, 0x012831f6, 0x01907872, 0x02340257, 0x01687150, 0x000489e0}}}, + {X: Field{[10]uint32{0x029ac683, 0x024193d5, 0x01ace972, 0x035ff86b, 0x02d92697, 0x0082b945, 0x03ee080f, 0x03c3f70b, 0x0226da7a, 0x0019c202}}, Y: Field{[10]uint32{0x0316d94d, 0x008b3f08, 0x03714aa5, 0x0339e7dd, 0x008e08c5, 0x01443ab0, 0x0144107e, 0x01c22cc2, 0x03acfbba, 0x002b6681}}}, + {X: Field{[10]uint32{0x03fc0dbf, 0x00015c16, 0x01a4163a, 0x00117055, 0x023947f4, 0x00b8ebeb, 0x0078ddc8, 0x00a3ddbe, 0x0239d614, 0x00084356}}, Y: Field{[10]uint32{0x028c511c, 0x02c600cb, 0x017ac96e, 0x01324fa6, 0x002efa80, 0x01ea464f, 0x014cc296, 0x00a70bb4, 0x03e6b0a6, 0x00185fbf}}}, + {X: Field{[10]uint32{0x0334ed98, 0x00874138, 0x015fc590, 0x0071bfd9, 0x039b8e46, 0x01e0df44, 0x03242a93, 0x0046e714, 0x0231ca15, 0x001742e4}}, Y: Field{[10]uint32{0x03e924ae, 0x00e99baf, 0x01986bd1, 0x0387dbe3, 0x011a2f58, 0x0279f5b3, 0x03ae1b4a, 0x013b69c4, 0x0121f479, 0x003201c0}}}, + {X: Field{[10]uint32{0x02907392, 0x01e299f8, 0x00ab63ce, 0x00abf344, 0x019013fe, 0x0131c65d, 0x00c8bd54, 0x004587b4, 0x002c4210, 0x001a1eee}}, Y: Field{[10]uint32{0x000d9eeb, 0x017a5984, 0x03e356a2, 0x020440e5, 0x03fafc8e, 0x022c8273, 0x03c721cf, 0x028e9be7, 0x0187758a, 0x003abd8f}}}, + {X: Field{[10]uint32{0x025f5d33, 0x01a9b473, 0x00da40e6, 0x0347d2f3, 0x03c63527, 0x03cb0ffc, 0x02a3931f, 0x023da068, 0x0157b804, 0x00146910}}, Y: Field{[10]uint32{0x0047dd31, 0x009ffa7a, 0x02a1ec51, 0x019cb6e5, 0x001a0c56, 0x00298e24, 0x03dc8f42, 0x00a50053, 0x0116519c, 0x001bff23}}}, + {X: Field{[10]uint32{0x01e86775, 0x01c2f2e3, 0x004f989f, 0x02c8af5f, 0x000a5dd7, 0x01e30eff, 0x024786a4, 0x00568d58, 0x017256f5, 0x002ca189}}, Y: Field{[10]uint32{0x0264f3a3, 0x0364cb51, 0x03692abc, 0x037917c5, 0x02f53b64, 0x024a4bfe, 0x0267e5b2, 0x014e5ade, 0x02a80a5a, 0x0008aba5}}}, + {X: Field{[10]uint32{0x0035bc30, 0x01f1ff82, 0x02e584bb, 0x02f3ee4a, 0x036ee129, 0x028e5884, 0x03d89a5c, 0x01e32bba, 0x021e2010, 0x003ddadc}}, Y: Field{[10]uint32{0x02c0d561, 0x00bd28f9, 0x024b7a06, 0x00e07a5a, 0x03223a0a, 0x0186ebff, 0x02b3d171, 0x026100f5, 0x02b10841, 0x0016671a}}}, + {X: Field{[10]uint32{0x00178e9c, 0x001f0d31, 0x01b9793b, 0x022cdb7b, 0x01d9a3b8, 0x03da5a44, 0x02f20b7f, 0x03b81ba0, 0x028763ad, 0x0004bc92}}, Y: Field{[10]uint32{0x0055b7f1, 0x01e35638, 0x021b7351, 0x037c230b, 0x02b2427f, 0x00a09efb, 0x025d939c, 0x007edec9, 0x039f96f0, 0x00167f5e}}}, + {X: Field{[10]uint32{0x0122260a, 0x008878c6, 0x010cefa0, 0x0117123e, 0x00bcfaf1, 0x01609033, 0x0082d477, 0x01aef8a8, 0x0290de6c, 0x002786e2}}, Y: Field{[10]uint32{0x03390f9f, 0x02966042, 0x000a66cd, 0x001ba923, 0x008a71eb, 0x0025f401, 0x02a54f42, 0x036781f0, 0x02a5b54b, 0x003e97a1}}}, + {X: Field{[10]uint32{0x03baae9c, 0x00240c4b, 0x020a38c1, 0x03e1b134, 0x01ed4117, 0x00a38c7c, 0x01b6a66e, 0x00fadec0, 0x010320b7, 0x0018fc16}}, Y: Field{[10]uint32{0x0101d8eb, 0x02fa2c65, 0x019c501a, 0x032aebd7, 0x0340bd68, 0x0098e1df, 0x0288967a, 0x0207f81b, 0x01d2d34a, 0x00092e32}}}, + {X: Field{[10]uint32{0x03905999, 0x0264ad18, 0x003a8e27, 0x01ba671d, 0x01e5c89b, 0x0367ca15, 0x03569a4a, 0x00a8f687, 0x0009f540, 0x00111f1d}}, Y: Field{[10]uint32{0x0149e154, 0x0240dc2b, 0x0328db77, 0x01ce2e4f, 0x00716baa, 0x03805b02, 0x0337723b, 0x01e8251e, 0x019ab34a, 0x003513a3}}}, + {X: Field{[10]uint32{0x00793254, 0x03c437fe, 0x006df1bb, 0x03d28fe6, 0x0025eed4, 0x003c65f9, 0x037db0c2, 0x0102bead, 0x006a4c53, 0x001d2910}}, Y: Field{[10]uint32{0x03742023, 0x0261fad9, 0x0246dfc7, 0x02f014aa, 0x02dc4c07, 0x00711ac5, 0x0136907d, 0x029c4a33, 0x038a0a4b, 0x00058b59}}}, + {X: Field{[10]uint32{0x03047c07, 0x00c91ba3, 0x005ff3a2, 0x01d814e9, 0x022bf5e0, 0x010731ed, 0x00e63cc8, 0x0098deac, 0x01713187, 0x003dc0d4}}, Y: Field{[10]uint32{0x021097ef, 0x03ba7076, 0x00936cca, 0x032599c6, 0x02b3c7ee, 0x025cad67, 0x01762a95, 0x001e15c8, 0x03914f47, 0x003212c0}}}, + {X: Field{[10]uint32{0x02eaae11, 0x0267dbdc, 0x024f6ac9, 0x01a37285, 0x022194d1, 0x02c29054, 0x013bd706, 0x00d604b1, 0x007b57b2, 0x003b13f8}}, Y: Field{[10]uint32{0x02fff789, 0x00a3d728, 0x004d7b55, 0x01e6f74c, 0x01b2f9df, 0x026dd814, 0x02b1dc4e, 0x02ca7fb0, 0x029145de, 0x002bd254}}}, + {X: Field{[10]uint32{0x01d2ac9d, 0x02ead2b3, 0x0238878d, 0x011c47cd, 0x00c65520, 0x005a3435, 0x00b274ee, 0x005d3de8, 0x01e8fa96, 0x0005c55b}}, Y: Field{[10]uint32{0x0061ac3d, 0x01a00fc5, 0x00ca6abb, 0x0211e78a, 0x03c2de9f, 0x037b2e23, 0x00e37ed6, 0x01183261, 0x02c436c1, 0x0000ab8f}}}, + {X: Field{[10]uint32{0x021b2ede, 0x032990e6, 0x02a6aabf, 0x00302541, 0x01549cb9, 0x00374c33, 0x029be560, 0x011feb3e, 0x022b9c5a, 0x003906d1}}, Y: Field{[10]uint32{0x017507f4, 0x002fc440, 0x01311d38, 0x01308885, 0x03e1b360, 0x0231a563, 0x00fb3533, 0x02982b1a, 0x02b208bd, 0x000423f8}}}, + {X: Field{[10]uint32{0x0344aa38, 0x01bd0ddd, 0x015ad38a, 0x01e314ee, 0x03f357ea, 0x006a00e3, 0x00800515, 0x01e20f5e, 0x015920a6, 0x002e9b00}}, Y: Field{[10]uint32{0x02002cf3, 0x026d6e45, 0x03680457, 0x006d9a1b, 0x00cda144, 0x003a39c4, 0x0366aa5c, 0x02dd1a0c, 0x00e7deb6, 0x00369270}}}, + {X: Field{[10]uint32{0x00cbf1ae, 0x020d5a3e, 0x0329cee2, 0x014e1255, 0x037e8a95, 0x01f94998, 0x0102ab7f, 0x012dae1c, 0x006e883a, 0x0009bc06}}, Y: Field{[10]uint32{0x03d5f47a, 0x009176d2, 0x002d398b, 0x008c1d5c, 0x00aad788, 0x02568628, 0x01519809, 0x025f2b33, 0x01e4bb21, 0x0003bbe3}}}, + {X: Field{[10]uint32{0x000c9d22, 0x0007296d, 0x03cddc45, 0x038f6998, 0x03e00874, 0x00050398, 0x01b5588c, 0x033af0d4, 0x03de80c0, 0x000042e4}}, Y: Field{[10]uint32{0x00903258, 0x016d3407, 0x002842d0, 0x03c850d6, 0x001dfef7, 0x03b1257b, 0x0186b027, 0x03cdaf9e, 0x01ddf79a, 0x003b4c62}}}, + {X: Field{[10]uint32{0x03769dde, 0x0268f9dd, 0x002558bc, 0x0101db25, 0x017a1595, 0x03d6a315, 0x03b32da8, 0x020b0725, 0x0274337a, 0x0039e7b0}}, Y: Field{[10]uint32{0x028a06f6, 0x0145d898, 0x0102c3b6, 0x03660f5d, 0x02e527da, 0x02223cfb, 0x024c175d, 0x03f38d52, 0x039f22da, 0x0027c8c1}}}, + {X: Field{[10]uint32{0x03c101e1, 0x034c685b, 0x01b0c1b7, 0x038e4810, 0x002be265, 0x023832a9, 0x039915e0, 0x02b4ff22, 0x017544f0, 0x0003f680}}, Y: Field{[10]uint32{0x018902e7, 0x00bd7061, 0x0030d0db, 0x01dae128, 0x03e4d49a, 0x029415cc, 0x03e42981, 0x0271baf1, 0x022785d5, 0x001093a6}}}, + {X: Field{[10]uint32{0x0099c6bd, 0x033c46e8, 0x01b31577, 0x028f2f3f, 0x008327d8, 0x022f20c3, 0x03147258, 0x0337f940, 0x01cb5380, 0x001a07c0}}, Y: Field{[10]uint32{0x039002bc, 0x0252463c, 0x018cd007, 0x02b63836, 0x0359c02f, 0x03f279d5, 0x006cef06, 0x02c17e70, 0x0117cdc3, 0x002fe748}}}, + {X: Field{[10]uint32{0x03d12f64, 0x00825736, 0x039611de, 0x0236e7bf, 0x03d6fe9f, 0x02b28942, 0x0251f4d9, 0x00b30b74, 0x026b2a2d, 0x001c3096}}, Y: Field{[10]uint32{0x02966126, 0x02669346, 0x021f46b2, 0x00136647, 0x03134dae, 0x024fa96d, 0x03f4dc47, 0x02cb3f34, 0x0368a386, 0x00327bab}}}, + {X: Field{[10]uint32{0x03ccbb9d, 0x00486e27, 0x0330403b, 0x02143fa2, 0x023b466e, 0x03d02199, 0x03d5ea45, 0x010b53fb, 0x012c404b, 0x0011937b}}, Y: Field{[10]uint32{0x005d910b, 0x009c4884, 0x01260796, 0x01ef9069, 0x03610bb4, 0x0295a0d9, 0x02d2d3e0, 0x03d84c8e, 0x01046ad3, 0x002b044e}}}, + {X: Field{[10]uint32{0x03a103db, 0x00bc4d04, 0x023f02ad, 0x02406d73, 0x01b7ff89, 0x023177f0, 0x0055109a, 0x02466175, 0x037248e7, 0x00028cb7}}, Y: Field{[10]uint32{0x03160e72, 0x0084d292, 0x02173821, 0x034cf997, 0x00cf9ad8, 0x01d8a5b2, 0x02a2d1d8, 0x0241ae6b, 0x00fb9d60, 0x001b6d2d}}}, + {X: Field{[10]uint32{0x0165179a, 0x0254c540, 0x03fe9a76, 0x0370a971, 0x023ccb74, 0x013b13fa, 0x00297746, 0x034e725c, 0x029e7ee5, 0x003f9273}}, Y: Field{[10]uint32{0x03e7dc8c, 0x023c3e8f, 0x026e63f5, 0x020ad310, 0x0390bfc5, 0x018555c8, 0x03b98662, 0x01773bbb, 0x013a3592, 0x00194fd5}}}, + {X: Field{[10]uint32{0x0354ad14, 0x01cc5b8c, 0x01a878aa, 0x0028ab75, 0x01ec0f1a, 0x0049ac43, 0x0224750c, 0x029f0936, 0x0255c895, 0x0021a2cb}}, Y: Field{[10]uint32{0x02c299ef, 0x0187c91e, 0x00324efb, 0x02080201, 0x00776bca, 0x0298a46f, 0x03035941, 0x0067f5c7, 0x0074cdea, 0x00178a22}}}, + {X: Field{[10]uint32{0x00098461, 0x03422d63, 0x011aec63, 0x01fbf4cb, 0x03d267ff, 0x003f121a, 0x013f1c08, 0x00d31a2b, 0x00da90ae, 0x003f81e4}}, Y: Field{[10]uint32{0x00f7177e, 0x00efabdb, 0x03ef416f, 0x036d5a02, 0x02cdbfcc, 0x008b184c, 0x01a02444, 0x02ca0d1c, 0x0393de35, 0x002b4cc4}}}, + {X: Field{[10]uint32{0x03e9a9d9, 0x03609e5b, 0x039557f6, 0x03d59a0d, 0x0242a23b, 0x019f7fbe, 0x016b1961, 0x020373fc, 0x028d0f4f, 0x003f9ff2}}, Y: Field{[10]uint32{0x00d4eb3b, 0x023c72f6, 0x01b1e71c, 0x02738605, 0x02ccc572, 0x02051dab, 0x000cb3d6, 0x03a49776, 0x018a0d7e, 0x002ef137}}}, + {X: Field{[10]uint32{0x0034cfc2, 0x00da1625, 0x03fd23aa, 0x0263a7c0, 0x02ae7975, 0x00473d30, 0x011b11b5, 0x03882fad, 0x0270aa4c, 0x00288db0}}, Y: Field{[10]uint32{0x0088f29b, 0x00e8c7c8, 0x01f4c486, 0x0103eeda, 0x028bc370, 0x00230842, 0x00c3ade6, 0x02f7ad07, 0x01c575a7, 0x00164d66}}}, + {X: Field{[10]uint32{0x02519248, 0x0151bf1d, 0x03644565, 0x03ab6787, 0x02800472, 0x00e0d938, 0x028a3485, 0x0309fcfa, 0x00a56bb8, 0x00035a81}}, Y: Field{[10]uint32{0x0142deb9, 0x01c1a6ad, 0x00e079b7, 0x019889ba, 0x03dbf6e4, 0x015d8490, 0x03099aba, 0x01d8a48a, 0x030d50b9, 0x0012e551}}}, + {X: Field{[10]uint32{0x00a30e7f, 0x000baa7e, 0x02ebd74e, 0x00a0c986, 0x00677732, 0x035c0689, 0x0276f974, 0x00117f86, 0x0377d64a, 0x00342734}}, Y: Field{[10]uint32{0x0188ffea, 0x02a49359, 0x02e57b90, 0x03abb81a, 0x0141a342, 0x032be203, 0x02ed2d01, 0x000acf5d, 0x02b902b7, 0x0027c250}}}, + {X: Field{[10]uint32{0x01d98b8b, 0x0343a979, 0x03440b2e, 0x02fffc29, 0x01b9a469, 0x0071f8ff, 0x02e52456, 0x006a75b0, 0x032c16d0, 0x00340c31}}, Y: Field{[10]uint32{0x031f2c8e, 0x02c3c454, 0x006f473d, 0x019f2850, 0x03fddeee, 0x02baa10e, 0x02b60ffe, 0x03e60405, 0x0308dba4, 0x00031ac4}}}, + {X: Field{[10]uint32{0x0345a691, 0x031aec78, 0x03ba1100, 0x03dd5c1a, 0x0157d0c6, 0x002ce695, 0x01980ab8, 0x0129f510, 0x02c6d2c0, 0x0015b115}}, Y: Field{[10]uint32{0x02084819, 0x00d39909, 0x03189fae, 0x00968184, 0x02825ce5, 0x01d4f0ac, 0x0310ffc2, 0x01743e3b, 0x00dc2c73, 0x00316cbc}}}, + {X: Field{[10]uint32{0x008400c9, 0x0146eb0c, 0x0037d75e, 0x03178396, 0x0129d911, 0x0353f779, 0x01d1b98d, 0x0347d0a3, 0x01f3b505, 0x002ab56b}}, Y: Field{[10]uint32{0x0377acc6, 0x02ae1f89, 0x036e46af, 0x03c877d2, 0x00f55569, 0x01e431a3, 0x03aa411b, 0x02530448, 0x03674f79, 0x003a52b7}}}, + {X: Field{[10]uint32{0x026a0ef0, 0x0219e8d7, 0x0034e6b1, 0x030c67b4, 0x02ca1d43, 0x0062d32c, 0x006b089f, 0x02e3dd22, 0x00b4dd76, 0x002b2336}}, Y: Field{[10]uint32{0x037ba96d, 0x02753dc4, 0x001f3c75, 0x02d26f32, 0x02ffb71d, 0x032b73f1, 0x013f8271, 0x02ac55d0, 0x0094f9da, 0x001c75c2}}}, + {X: Field{[10]uint32{0x0047ca1d, 0x0314d5f7, 0x0394841d, 0x0143d085, 0x0093eb41, 0x01665ad1, 0x01d7a4d0, 0x03e91502, 0x006df110, 0x000e5900}}, Y: Field{[10]uint32{0x03ad7cdb, 0x0291b7c0, 0x017d6395, 0x01d0daff, 0x01c2f244, 0x00fc15f9, 0x022a2bd2, 0x0364ebe4, 0x006d21db, 0x00392847}}}, + {X: Field{[10]uint32{0x03ca56ec, 0x0387efde, 0x01d551a0, 0x03e3ed0f, 0x03723a1f, 0x02fe442d, 0x02a37b19, 0x004aedd3, 0x039227a3, 0x000af842}}, Y: Field{[10]uint32{0x02df59ab, 0x014bb731, 0x000b4590, 0x03a3076f, 0x03755b2d, 0x00a42c92, 0x03ecca94, 0x037034a4, 0x02fbc886, 0x00066aa2}}}, + {X: Field{[10]uint32{0x01ad6ae5, 0x018c96ad, 0x01342a4c, 0x005c70e3, 0x03ccc1e4, 0x03ff22ea, 0x0219a34d, 0x03d46874, 0x01562bd7, 0x000de705}}, Y: Field{[10]uint32{0x03185907, 0x00feb10b, 0x0348db98, 0x00d1fc81, 0x01e7bc67, 0x0036554d, 0x01ce2231, 0x0077d59b, 0x028fa637, 0x0011e87c}}}, + {X: Field{[10]uint32{0x03ce9809, 0x033dea07, 0x014f9914, 0x02426277, 0x0130a362, 0x01e0443a, 0x03584a7d, 0x011674ab, 0x01c2e675, 0x00090153}}, Y: Field{[10]uint32{0x017ae592, 0x016128b9, 0x02a7612b, 0x02069bc0, 0x013553dc, 0x008345a9, 0x00e06d48, 0x03429c71, 0x021d3e05, 0x00195cab}}}, + {X: Field{[10]uint32{0x002420a4, 0x02d323a8, 0x0298fa3b, 0x0322e140, 0x02913199, 0x00408ecc, 0x03cd8790, 0x02a5e6ad, 0x02a6f46c, 0x002604b9}}, Y: Field{[10]uint32{0x00f937f0, 0x004ae722, 0x0315152a, 0x00ed595d, 0x033afd96, 0x021be4dd, 0x03baf369, 0x0364cc06, 0x02eddfec, 0x0011a3db}}}, + {X: Field{[10]uint32{0x0313c700, 0x000e969f, 0x03c6b962, 0x03ee5720, 0x029f6c14, 0x00b2778a, 0x00c928d6, 0x02392b61, 0x02446a34, 0x00118161}}, Y: Field{[10]uint32{0x022d57ab, 0x00079dd8, 0x021ad904, 0x004415ec, 0x034c873f, 0x02c62103, 0x0359c203, 0x01c07f99, 0x02e3ca3d, 0x00277157}}}, + {X: Field{[10]uint32{0x00be006a, 0x002541ef, 0x003228e9, 0x03298e6b, 0x021cb877, 0x012bb43e, 0x00d862fe, 0x0017ca91, 0x03972d5b, 0x002a36eb}}, Y: Field{[10]uint32{0x036fa4bc, 0x0312a5c5, 0x0190251a, 0x00a6e0f2, 0x03253e67, 0x0050742f, 0x018d38c6, 0x024df13e, 0x0003f082, 0x000f6d53}}}, + {X: Field{[10]uint32{0x011149fe, 0x01e0024e, 0x01128741, 0x0064899c, 0x02008b30, 0x013e611a, 0x0324bcd4, 0x004ca44c, 0x01f4f4d9, 0x0026e2ce}}, Y: Field{[10]uint32{0x0052c1d3, 0x025aa647, 0x030976b3, 0x01fcb82a, 0x034e4cae, 0x002c346c, 0x03fc6939, 0x00b96a23, 0x03721c45, 0x00124293}}}, + {X: Field{[10]uint32{0x014615eb, 0x00d62b4c, 0x0059773e, 0x00909e99, 0x017406ce, 0x039407e0, 0x02404ea9, 0x011b6c65, 0x01d5a7ef, 0x000cd1a0}}, Y: Field{[10]uint32{0x03ad6c0d, 0x01951094, 0x02b6d6c1, 0x0304dff9, 0x02e328fd, 0x0081a778, 0x004775a5, 0x0335aa7c, 0x003a1d80, 0x000ac8d8}}}, + {X: Field{[10]uint32{0x01c32529, 0x00fc380a, 0x02a88202, 0x01cadeba, 0x02bd5f83, 0x02933390, 0x00639b40, 0x01baf4a5, 0x0310c63c, 0x003fae38}}, Y: Field{[10]uint32{0x0343b213, 0x02fe1b76, 0x02617fbc, 0x018ef7df, 0x0068a45c, 0x019a0898, 0x017934b8, 0x035e02a9, 0x02ad6a0c, 0x0032db90}}}, + {X: Field{[10]uint32{0x0305cb67, 0x003cb121, 0x013b3fcf, 0x02d8acf6, 0x01a8ca5c, 0x02e44295, 0x01232523, 0x013a4b72, 0x03c2c733, 0x003d285e}}, Y: Field{[10]uint32{0x026e9dfe, 0x011c6c36, 0x02304bb0, 0x038f573e, 0x02e7f4a9, 0x03d14982, 0x03d55a32, 0x011ca52c, 0x039501b2, 0x00204add}}}, + {X: Field{[10]uint32{0x00cf181b, 0x011e6e93, 0x0324c7e0, 0x0257c208, 0x02c330a9, 0x03f2abd3, 0x016d596b, 0x010d2552, 0x007b8551, 0x0023b0ab}}, Y: Field{[10]uint32{0x01250130, 0x03aeea4d, 0x00258ce4, 0x025c9ec7, 0x0070e927, 0x0173c2f1, 0x00b3bcf0, 0x03498def, 0x00b67811, 0x003a8562}}}, + {X: Field{[10]uint32{0x00d4f19a, 0x010f1b01, 0x04001534, 0x02ddf68e, 0x03e4aa9e, 0x039231bd, 0x01c4b6d9, 0x0336f032, 0x021bd9ae, 0x002c79b5}}, Y: Field{[10]uint32{0x028cbf4a, 0x03e62bec, 0x031a35ae, 0x02e83b32, 0x011bc20a, 0x0235bcce, 0x01fdb344, 0x0325da2c, 0x0355b2e2, 0x0010ebde}}}, + {X: Field{[10]uint32{0x0313b2be, 0x03c8124b, 0x022e4b69, 0x018c0b53, 0x031a9519, 0x036cd50c, 0x004a3974, 0x011f70e4, 0x02e8210d, 0x001360f4}}, Y: Field{[10]uint32{0x0137a6b3, 0x015cbd8f, 0x000367c8, 0x02b25500, 0x017a0e3b, 0x039610ae, 0x005f1d88, 0x03f25ef9, 0x00833874, 0x001fb65b}}}, + {X: Field{[10]uint32{0x03b20b84, 0x02dba3ca, 0x01c36b9e, 0x03bac2ca, 0x0325f5c5, 0x01549fd9, 0x035d5143, 0x03f0875b, 0x012efd51, 0x0005123a}}, Y: Field{[10]uint32{0x02e344ad, 0x02efae65, 0x03f4cea8, 0x0298e790, 0x0013336a, 0x021a25cf, 0x011c9a22, 0x020f94be, 0x038fc8be, 0x0009228c}}}, + {X: Field{[10]uint32{0x024e4ead, 0x01c24f24, 0x03e63dcf, 0x02c09617, 0x0239d928, 0x03828863, 0x01cc7d44, 0x0142b0b3, 0x03d69c22, 0x00388ec0}}, Y: Field{[10]uint32{0x01b9aea9, 0x03ee2b9c, 0x024542ef, 0x02e84f7b, 0x0380b91c, 0x02b6c135, 0x017ef44f, 0x012df066, 0x03d04a8a, 0x00231a71}}}, + {X: Field{[10]uint32{0x02b5d7cb, 0x01c8ad0c, 0x02f94e5a, 0x0093699a, 0x00786632, 0x02baff2e, 0x02a929b9, 0x00ff9a51, 0x035e21fb, 0x00133478}}, Y: Field{[10]uint32{0x0167e3bc, 0x012ac1dc, 0x02984cba, 0x035dcc32, 0x03eca892, 0x00a5e185, 0x02887803, 0x016c42e9, 0x02dc5e86, 0x001ac444}}}, + {X: Field{[10]uint32{0x020db647, 0x03ec8102, 0x01bf5f2e, 0x02c363c7, 0x00bf25c6, 0x0165bb38, 0x00b92123, 0x02dec09f, 0x02f8092c, 0x003cf3ae}}, Y: Field{[10]uint32{0x0168d8e0, 0x0160af2a, 0x02ab7e12, 0x01cbbef6, 0x02cf3c71, 0x02ee974f, 0x0123b887, 0x03004e46, 0x01eb8418, 0x00298577}}}, + {X: Field{[10]uint32{0x01655e7d, 0x02168b1b, 0x01736a3a, 0x0379ec75, 0x02dfe341, 0x00c605c1, 0x0337c813, 0x03e235a0, 0x0128500b, 0x0012e2b3}}, Y: Field{[10]uint32{0x01219bb8, 0x0325b83f, 0x018ac624, 0x021e113c, 0x027b7c5d, 0x014bcec1, 0x016f76e0, 0x0159d613, 0x03c3825a, 0x002fa4f5}}}, + {X: Field{[10]uint32{0x00eb9fe1, 0x01c6541f, 0x03c53d47, 0x020616ba, 0x003e567d, 0x0331a37a, 0x03d2de62, 0x0002218f, 0x0081d04e, 0x002371eb}}, Y: Field{[10]uint32{0x01fa9198, 0x02e53104, 0x000e8214, 0x0224bb84, 0x031eb14c, 0x0097200f, 0x03a7755e, 0x0064c711, 0x024abe7b, 0x0018b52d}}}, + {X: Field{[10]uint32{0x01b89a23, 0x01394c30, 0x02033710, 0x015e400f, 0x01a817c2, 0x03d3cb06, 0x002bbbed, 0x03523425, 0x003f3078, 0x002a98cd}}, Y: Field{[10]uint32{0x02a7b524, 0x0256399b, 0x009bbfe7, 0x01b4338e, 0x0013befc, 0x037a51d6, 0x0020f4d9, 0x01cc3da7, 0x003423a6, 0x0009dfbe}}}, + {X: Field{[10]uint32{0x01121d30, 0x0135e841, 0x034955d0, 0x0186f085, 0x02dadeba, 0x028df7ce, 0x01096c01, 0x0079023a, 0x00619f30, 0x000df794}}, Y: Field{[10]uint32{0x0138898a, 0x00cbef39, 0x00c31f57, 0x01c35b6d, 0x00e3f6aa, 0x0001565f, 0x0136516c, 0x002e59a8, 0x009c33e4, 0x0001f9c1}}}, + {X: Field{[10]uint32{0x01eb83b4, 0x03cb0311, 0x0045e011, 0x0208be45, 0x003ebc66, 0x00d1d207, 0x028cd44f, 0x01673a8f, 0x0355506d, 0x001b4633}}, Y: Field{[10]uint32{0x00a30cdb, 0x03cabdee, 0x03854c8f, 0x029f3a01, 0x00220f7b, 0x03536e28, 0x039818e5, 0x01cfd1fe, 0x01c1ca8b, 0x003a4c3a}}}, + {X: Field{[10]uint32{0x02caa7d3, 0x025ece45, 0x01c0a5b7, 0x03f7ac74, 0x00f70243, 0x00054b27, 0x00203c49, 0x036b1775, 0x02606de7, 0x001df615}}, Y: Field{[10]uint32{0x019c659c, 0x01f6123d, 0x0122e8c3, 0x03b3e481, 0x031a2722, 0x02cf038e, 0x01b0fc94, 0x03554327, 0x03e39b37, 0x000fd5f3}}}, + {X: Field{[10]uint32{0x0381bf16, 0x0398d77c, 0x01229670, 0x002f5a76, 0x00ea5645, 0x03e753ee, 0x01dc8b56, 0x016ec715, 0x01a6c44b, 0x00170b9a}}, Y: Field{[10]uint32{0x01a3588d, 0x03c0499d, 0x03049f1a, 0x03c930d2, 0x009ec21a, 0x03f42d1b, 0x0021a8c2, 0x032a6e8a, 0x009d0a69, 0x003c2081}}}, + {X: Field{[10]uint32{0x01a393ee, 0x0339002d, 0x02af1918, 0x023626ca, 0x02aaacb9, 0x00afac1a, 0x01944ed9, 0x02496c94, 0x01f5066d, 0x000ca700}}, Y: Field{[10]uint32{0x02a57abf, 0x02bfb7fe, 0x032a9c3c, 0x0114f531, 0x02e21c2c, 0x0292494b, 0x0150c80a, 0x003ffdab, 0x0038427a, 0x001f8a6c}}}, + {X: Field{[10]uint32{0x029525da, 0x02d26f58, 0x0099df62, 0x03f21519, 0x02b670f4, 0x01c75ec3, 0x02bb4017, 0x037e90df, 0x031f18b2, 0x00130b98}}, Y: Field{[10]uint32{0x029a6f9c, 0x022728ff, 0x013701f7, 0x00b68fe1, 0x00050c6c, 0x02df0813, 0x01314326, 0x00fe9d30, 0x03fb8742, 0x0022a57a}}}, + {X: Field{[10]uint32{0x03d03fdc, 0x03efc6d8, 0x03fd9392, 0x0393184c, 0x01d3808c, 0x0384295d, 0x037cf02c, 0x0111971f, 0x03930d25, 0x003f8486}}, Y: Field{[10]uint32{0x009e0ba6, 0x0032f3a9, 0x036352a8, 0x022bcd82, 0x030e5943, 0x0110e83f, 0x03b997f9, 0x010c4653, 0x03077bda, 0x000cc4a6}}}, + {X: Field{[10]uint32{0x03784c23, 0x00ab984b, 0x0316da53, 0x03510600, 0x032cf8c5, 0x0079d2e2, 0x0220521f, 0x03cfddd3, 0x027b1cdb, 0x000c8eb0}}, Y: Field{[10]uint32{0x03c3dc18, 0x025acb4f, 0x01197bb2, 0x005bcf4c, 0x01c8489e, 0x00d2ea69, 0x00b15fe8, 0x012b1622, 0x0108f6a6, 0x00084558}}}, + {X: Field{[10]uint32{0x03afd533, 0x006a3481, 0x00d3741b, 0x0287964d, 0x01eeccbc, 0x03830840, 0x01f0ed5c, 0x02c780e9, 0x0362fdfc, 0x000451e3}}, Y: Field{[10]uint32{0x005f9153, 0x025a667b, 0x0366c70d, 0x02c82614, 0x02aba8d0, 0x0344549e, 0x00cdb176, 0x03b32191, 0x02732fd3, 0x002a7de5}}}, + {X: Field{[10]uint32{0x00b9d078, 0x010fbf08, 0x016e5e73, 0x02d5d9e2, 0x02bc8d82, 0x03b569a9, 0x008acf3a, 0x0306b7ae, 0x01b6c9d3, 0x0027c242}}, Y: Field{[10]uint32{0x007db181, 0x03ce1139, 0x017a33b0, 0x035ee669, 0x0061a579, 0x023d948d, 0x0263e30b, 0x01759371, 0x00a6c5c9, 0x00294587}}}, + {X: Field{[10]uint32{0x024a6b9f, 0x0255f4e9, 0x01711c55, 0x02c6d4bc, 0x032807ac, 0x006be02e, 0x01d8cd1a, 0x02b508a6, 0x007532a9, 0x0012582a}}, Y: Field{[10]uint32{0x02976625, 0x02e42d37, 0x03dd8cd6, 0x000bbbdd, 0x004bfc62, 0x00fe0bc9, 0x008f54a9, 0x0198a3ad, 0x01f3f1b4, 0x0015e394}}}, + {X: Field{[10]uint32{0x01310354, 0x0160bc17, 0x0066854b, 0x00d92d7b, 0x01d142d5, 0x03f27dcf, 0x010951cb, 0x00997952, 0x01c20bdb, 0x0019d70a}}, Y: Field{[10]uint32{0x008bd6d1, 0x00a411f8, 0x03a49832, 0x017e768c, 0x028cb8ad, 0x021af7e9, 0x02d4f9a1, 0x037a1080, 0x02693d82, 0x0008b47d}}}, + {X: Field{[10]uint32{0x007ce605, 0x02df26c4, 0x01d36f65, 0x037eb612, 0x01a9053a, 0x005aaccb, 0x01221779, 0x034389aa, 0x00bd6c75, 0x0031025b}}, Y: Field{[10]uint32{0x01c2bb46, 0x016f94e5, 0x023c294f, 0x01440092, 0x01b2b97e, 0x018ceb81, 0x0361efb9, 0x0325e4bf, 0x03472ae3, 0x0017c8da}}}, + {X: Field{[10]uint32{0x03905c0b, 0x003b66ce, 0x03789dd8, 0x018007e8, 0x01b1ddd4, 0x031d5055, 0x01205ec2, 0x015007c0, 0x0341ddd0, 0x0027a834}}, Y: Field{[10]uint32{0x01a28e69, 0x00570803, 0x03b717e6, 0x016654fd, 0x00ba7ce0, 0x00e625d9, 0x03692cd5, 0x0342ddbc, 0x010197e7, 0x000efd20}}}, + {X: Field{[10]uint32{0x02fb92e4, 0x035d690c, 0x028c7b4d, 0x03cb78dd, 0x01637367, 0x026056c3, 0x026edd2d, 0x03e8cdca, 0x02d784bf, 0x002f7aef}}, Y: Field{[10]uint32{0x03d0b9c0, 0x01312bb3, 0x00067673, 0x007f28ac, 0x01297a43, 0x02882507, 0x016af105, 0x026d8b70, 0x037eb62a, 0x0017fcd0}}}, + {X: Field{[10]uint32{0x02910932, 0x031f5b27, 0x020c7bcc, 0x01d1ded5, 0x000cbfe6, 0x03d55084, 0x02ea82c8, 0x00d3cb5a, 0x0244b46e, 0x002921be}}, Y: Field{[10]uint32{0x0097317a, 0x007208be, 0x03ca8323, 0x02a9fd1f, 0x01b8ad5b, 0x01532955, 0x023caa0f, 0x038a1022, 0x036d8a15, 0x0006adf8}}}, + {X: Field{[10]uint32{0x01cbba08, 0x0069f44a, 0x03769fbd, 0x02c4631f, 0x0366e7ab, 0x0082bbea, 0x0204376a, 0x02a49aa8, 0x00a557a1, 0x001118e8}}, Y: Field{[10]uint32{0x0034af0d, 0x036ada74, 0x02ce09a9, 0x0148973a, 0x037dc081, 0x002e2b44, 0x00f01de2, 0x0180a9c1, 0x02a5ab7b, 0x0012a08e}}}, + {X: Field{[10]uint32{0x01825ac4, 0x029cf7d3, 0x00b4c593, 0x0318bbad, 0x008cbdc5, 0x03647476, 0x03135840, 0x0237eead, 0x024fc45e, 0x0035b822}}, Y: Field{[10]uint32{0x02b4c55f, 0x020032d7, 0x02506c59, 0x036588bf, 0x0108be98, 0x003f8b6f, 0x031ae8fc, 0x0342e941, 0x03b477c0, 0x000b3616}}}, + {X: Field{[10]uint32{0x016a10f1, 0x00fea1fe, 0x03656a43, 0x034293e2, 0x00546d31, 0x026eff4d, 0x0076dca2, 0x032b5398, 0x02992a69, 0x002d89b8}}, Y: Field{[10]uint32{0x03cb5bc6, 0x015bd0d0, 0x03d343c6, 0x00ee32ef, 0x0162ac5e, 0x01789d95, 0x01686325, 0x0249a3c5, 0x02ceba91, 0x001b7d2c}}}, + {X: Field{[10]uint32{0x007139a5, 0x006959a5, 0x03b057e3, 0x03ad8678, 0x0225a4df, 0x03f93497, 0x01d61965, 0x0141c2cb, 0x02eb7464, 0x000d8679}}, Y: Field{[10]uint32{0x0282093f, 0x0035c944, 0x014311aa, 0x00ed1430, 0x0379940c, 0x02519f1e, 0x036c3bf2, 0x01848674, 0x0189ba15, 0x002592e2}}}, + {X: Field{[10]uint32{0x00bda2e9, 0x03dfd232, 0x02a847cc, 0x01838c9a, 0x0141e5c0, 0x014cc258, 0x00a3a65d, 0x0210ff10, 0x035e6718, 0x002cd4a6}}, Y: Field{[10]uint32{0x01c1b935, 0x03f15496, 0x030579d4, 0x01eca99e, 0x0131111e, 0x0216fb3d, 0x00595ac2, 0x02fd17a7, 0x00d37ce1, 0x001279b8}}}, + {X: Field{[10]uint32{0x03a9e05b, 0x02bf7c4b, 0x01598d42, 0x01e2500d, 0x014a1997, 0x03491fbc, 0x0385527d, 0x00517ff3, 0x00675bd7, 0x003947c0}}, Y: Field{[10]uint32{0x01b32666, 0x00a72ff0, 0x02c8cec7, 0x017cc3ad, 0x017d2e17, 0x026c11f9, 0x023d5fc6, 0x01cbad14, 0x033e8b4d, 0x003566ab}}}, + {X: Field{[10]uint32{0x01e79b28, 0x017e0c73, 0x00720170, 0x03935148, 0x0391c930, 0x0029ed52, 0x025eb6aa, 0x0311a348, 0x0066f64b, 0x0022a1fc}}, Y: Field{[10]uint32{0x02800227, 0x03afa959, 0x0113bb5e, 0x02b18954, 0x03249c34, 0x0343909d, 0x019062f5, 0x01f256c8, 0x0195e005, 0x002a4a97}}}, + {X: Field{[10]uint32{0x01310b06, 0x03661eff, 0x03632cd7, 0x03eee2bb, 0x013a926a, 0x03e236ab, 0x01c771eb, 0x023b969a, 0x0015aa87, 0x00362a04}}, Y: Field{[10]uint32{0x020acbdd, 0x017d4ff8, 0x02ad3d5e, 0x03680667, 0x03ec9f31, 0x03ce50b1, 0x03e3a262, 0x03b53a58, 0x03e8f276, 0x002bddfd}}}, + {X: Field{[10]uint32{0x020cc5c1, 0x01d0f533, 0x034d2c3b, 0x02f5466b, 0x02051c9a, 0x01974a35, 0x025b8a38, 0x01364f6f, 0x02194f3f, 0x002230fe}}, Y: Field{[10]uint32{0x020d8f8d, 0x0192381d, 0x039d9a9d, 0x036a660a, 0x0226b5de, 0x01dd16fb, 0x03671a7e, 0x03e089ec, 0x037a0f9f, 0x0004132b}}}, + {X: Field{[10]uint32{0x01ce648e, 0x00b0f650, 0x02484553, 0x0045b169, 0x02220701, 0x031ca6a2, 0x01e9c763, 0x02c3abc1, 0x03253434, 0x003e1ce1}}, Y: Field{[10]uint32{0x006f7bd7, 0x0327885e, 0x0320146f, 0x0055e059, 0x024c286e, 0x0034f86f, 0x01f66270, 0x01e44eda, 0x02d1d4ee, 0x002a2d7b}}}, + {X: Field{[10]uint32{0x009acc33, 0x021083e4, 0x02f606b1, 0x03e3723f, 0x007b35c8, 0x01a25817, 0x00ca8265, 0x00087e53, 0x01385afb, 0x00017f29}}, Y: Field{[10]uint32{0x01b2b3a8, 0x0246bd75, 0x036392b7, 0x01e35752, 0x03c5b4d0, 0x008facaf, 0x01f9a527, 0x022ff7ac, 0x0251f5c2, 0x000075fe}}}, + {X: Field{[10]uint32{0x035007db, 0x01193eb3, 0x01a51891, 0x013f8558, 0x03f1fddf, 0x03b52f43, 0x02cef9db, 0x02b366ec, 0x0148d4b2, 0x0011d211}}, Y: Field{[10]uint32{0x028f44a8, 0x02a8f20c, 0x02bce3dd, 0x00efb620, 0x01b93e22, 0x03ed113f, 0x03a25397, 0x033f811b, 0x0154f011, 0x003a9878}}}, + {X: Field{[10]uint32{0x02c5b8f1, 0x01ab2179, 0x0234ab46, 0x01b49500, 0x01dd8ef5, 0x0106a008, 0x029a6feb, 0x0350ffb1, 0x03ff0b14, 0x000cc7c5}}, Y: Field{[10]uint32{0x02ec144b, 0x015a6c27, 0x0299b68d, 0x01840b11, 0x0337d8c0, 0x02864c47, 0x0364a0f8, 0x011cc6da, 0x00a18d77, 0x002e882f}}}, + {X: Field{[10]uint32{0x03dc68ce, 0x02c51b76, 0x027f15e9, 0x0073e710, 0x0205b897, 0x0014c395, 0x0388ce98, 0x034b192a, 0x022d200b, 0x0001aae9}}, Y: Field{[10]uint32{0x01f832c8, 0x02ac09ba, 0x00c5b000, 0x035de376, 0x01fcf65f, 0x03c1c7cb, 0x0126ef0c, 0x022466b3, 0x02d7d7d9, 0x0039324d}}}, + {X: Field{[10]uint32{0x03ca19c5, 0x032f1a48, 0x014fcf52, 0x02371cc9, 0x02c0cfee, 0x027b1bb3, 0x01022b4d, 0x02867188, 0x0035e72f, 0x0031dadb}}, Y: Field{[10]uint32{0x0213efc9, 0x02ea0c7e, 0x03fb1ee7, 0x0215ec86, 0x01b49dba, 0x01fe80a2, 0x034d0a1d, 0x0216666d, 0x027a48ee, 0x0016c3fe}}}, + {X: Field{[10]uint32{0x021bb77a, 0x024e1533, 0x014a404a, 0x03b50549, 0x02aaa438, 0x00a70529, 0x01590fa4, 0x00f7e6c0, 0x023d43f3, 0x003015ba}}, Y: Field{[10]uint32{0x033dca7b, 0x01ee31fa, 0x0231cc33, 0x000a2e80, 0x0258355a, 0x01da95c7, 0x0079e7f5, 0x02a7c4b1, 0x00e32337, 0x00356c65}}}, + {X: Field{[10]uint32{0x01ac938a, 0x0222cf6f, 0x003a147e, 0x03124f2b, 0x037df652, 0x01ae3ced, 0x03bb897e, 0x003bc44d, 0x00cc8ddf, 0x000f5a23}}, Y: Field{[10]uint32{0x015879fc, 0x02bc8b53, 0x03b4a691, 0x0269ebce, 0x0338b6bc, 0x0045563d, 0x00daead1, 0x0387ca58, 0x03884d7a, 0x002f2a51}}}, + {X: Field{[10]uint32{0x00d2a179, 0x012ccf42, 0x009cf392, 0x027d7cb9, 0x00c59d7a, 0x03dbf60d, 0x0145f0cd, 0x004602a4, 0x02f669ce, 0x0013ebfe}}, Y: Field{[10]uint32{0x020159d2, 0x03d55841, 0x00485b71, 0x01c9e6f3, 0x03dcbad8, 0x032442ae, 0x000c16d8, 0x00bb0956, 0x00ac2dca, 0x00278057}}}, + {X: Field{[10]uint32{0x024aecad, 0x00c15e68, 0x02f614ac, 0x031d9a67, 0x000e8ba0, 0x037b31f1, 0x01a44eb3, 0x03ade1ad, 0x00e37cd7, 0x00011d5e}}, Y: Field{[10]uint32{0x03171651, 0x03be3259, 0x0056945e, 0x019a7af2, 0x0007fd00, 0x02d8a3b6, 0x00eab83f, 0x03802f1a, 0x0017a6be, 0x002522b2}}}, + {X: Field{[10]uint32{0x00618836, 0x0386a577, 0x01dfe103, 0x029dded6, 0x038c72fd, 0x01d221f6, 0x02d1a35f, 0x0191a892, 0x02753eaa, 0x0026ab78}}, Y: Field{[10]uint32{0x002bca96, 0x000dcf74, 0x0025687e, 0x03b771fd, 0x03ceef2f, 0x0325120f, 0x02e7a050, 0x0097cc79, 0x03848f46, 0x002d9470}}}, + {X: Field{[10]uint32{0x03aed711, 0x004cebd8, 0x02f9a276, 0x027d8a72, 0x03321c9b, 0x011ecaf3, 0x02818524, 0x03b9d556, 0x03e0b1c6, 0x002c6c30}}, Y: Field{[10]uint32{0x000ac827, 0x02eac90c, 0x01571759, 0x019d632f, 0x03c2c741, 0x03fc5c44, 0x001d0dca, 0x01bfcf7f, 0x00fd624e, 0x00124eb3}}}, + {X: Field{[10]uint32{0x032a8ff6, 0x0373cfaf, 0x0201c156, 0x01881eeb, 0x032a0ce4, 0x03ce46a6, 0x02c5762f, 0x028163ab, 0x018fb192, 0x003155dd}}, Y: Field{[10]uint32{0x011bd3b3, 0x011e5a5b, 0x01766399, 0x02129dc6, 0x03989212, 0x006ff6fc, 0x010f671b, 0x0386567c, 0x0353d209, 0x000753a6}}}, + {X: Field{[10]uint32{0x037b5e0e, 0x02b648ca, 0x00d07cc9, 0x0209237d, 0x020edcc0, 0x037d686d, 0x01b5ca60, 0x03b53ed2, 0x01ed5120, 0x001cd48b}}, Y: Field{[10]uint32{0x02e08d74, 0x02233e37, 0x01a96e43, 0x013b25c9, 0x037f87db, 0x016f3f71, 0x01299ced, 0x009c3b47, 0x0194cdf0, 0x0011d5a7}}}, + {X: Field{[10]uint32{0x00323506, 0x02e70bfa, 0x033ad72b, 0x0033c3b1, 0x00fd6fbc, 0x030afb94, 0x03ae46df, 0x02258ca8, 0x000d6632, 0x000595c7}}, Y: Field{[10]uint32{0x03ec68d2, 0x00911212, 0x03143d22, 0x02135d67, 0x00a936d6, 0x01f39854, 0x0157911e, 0x0071833b, 0x01869e00, 0x001977a7}}}, + {X: Field{[10]uint32{0x00e5f090, 0x00be5626, 0x03343dbe, 0x00ba0b72, 0x01b1810d, 0x0327be1b, 0x020cc8d7, 0x00c29721, 0x01642eb6, 0x003d7f95}}, Y: Field{[10]uint32{0x03adfa87, 0x03244fa7, 0x03504e20, 0x02f75fb5, 0x02eec2da, 0x030b025e, 0x0340dcdf, 0x036b2328, 0x021fbea9, 0x00173b9e}}}, + {X: Field{[10]uint32{0x016e3592, 0x0138f28e, 0x00591881, 0x005d635e, 0x037aece0, 0x021f3b6b, 0x01a67a0b, 0x02410d0f, 0x033270d0, 0x003bc276}}, Y: Field{[10]uint32{0x03b675e2, 0x0288e6b1, 0x036ea80c, 0x01c4ab81, 0x037df142, 0x03bf7d38, 0x01c6161c, 0x01ba7e59, 0x0005ba24, 0x00164d3e}}}, + {X: Field{[10]uint32{0x033a54e8, 0x03f948cd, 0x030c13ed, 0x008be5d2, 0x025e1746, 0x03c807b4, 0x012b102b, 0x03c26661, 0x03d727d2, 0x00221b36}}, Y: Field{[10]uint32{0x00a73b2b, 0x029ec277, 0x021426ee, 0x021ce351, 0x015166f6, 0x019393e2, 0x03518255, 0x01b96b94, 0x028a7fca, 0x0036b2cc}}}, + {X: Field{[10]uint32{0x02237cff, 0x03be0ab3, 0x011f96e4, 0x00226ef6, 0x01620713, 0x02367cfa, 0x029ff848, 0x02fcba14, 0x03cd04f7, 0x002df61a}}, Y: Field{[10]uint32{0x03702f0e, 0x03f623ce, 0x0002ee32, 0x0293b434, 0x0303acf2, 0x01d5d210, 0x0146dc41, 0x0151faa1, 0x03f1375a, 0x0031ac2b}}}, + {X: Field{[10]uint32{0x03388c67, 0x03f1eeba, 0x02c4d22b, 0x02659ef1, 0x00c24f5e, 0x0257653b, 0x03910593, 0x02ae14c1, 0x01b28132, 0x0035f45c}}, Y: Field{[10]uint32{0x001a8f8f, 0x01950f77, 0x00744bfe, 0x020a5c22, 0x037be396, 0x02ece6fd, 0x013c1351, 0x038ad957, 0x00e02421, 0x00260ddc}}}, + {X: Field{[10]uint32{0x0394b1be, 0x024202a5, 0x03502a42, 0x025b0524, 0x00f01a18, 0x00cf6b64, 0x01f1cfa8, 0x00c39c8a, 0x02fd881e, 0x003ff9c4}}, Y: Field{[10]uint32{0x00505da8, 0x03063395, 0x01586cda, 0x01e94c59, 0x02f18b03, 0x03cbe8af, 0x0311ae58, 0x00212842, 0x0203075d, 0x003d0a67}}}, + {X: Field{[10]uint32{0x03d13f7c, 0x01919555, 0x03d669f6, 0x03781bc0, 0x03dff3f0, 0x03decd71, 0x03cd10b3, 0x01a54735, 0x02b30322, 0x00158f24}}, Y: Field{[10]uint32{0x03ec10c1, 0x0272cdcc, 0x01f43076, 0x0252153d, 0x009bb210, 0x0105be52, 0x030ccfb2, 0x03bd0602, 0x02f4085b, 0x0037287b}}}, + {X: Field{[10]uint32{0x00f32437, 0x0353591a, 0x013dd9a0, 0x00a19a9f, 0x01dd52c2, 0x03e91f05, 0x00056d7e, 0x03af3985, 0x02f33a2c, 0x002e39db}}, Y: Field{[10]uint32{0x018651c2, 0x01068a24, 0x004a22aa, 0x03084277, 0x003076cc, 0x00986687, 0x02539ba4, 0x039e668e, 0x039d652a, 0x00111539}}}, + {X: Field{[10]uint32{0x02f1c971, 0x01d5182a, 0x002d2c56, 0x03cf8219, 0x0107b4a4, 0x022a6610, 0x02e429fb, 0x000e8b7c, 0x0304f607, 0x000db6c8}}, Y: Field{[10]uint32{0x0284b5cc, 0x010bf269, 0x03ef00f8, 0x02d02323, 0x03ecf7f9, 0x009ac6ae, 0x03859eee, 0x002a8f66, 0x028f5cc3, 0x002814db}}}, + {X: Field{[10]uint32{0x00d9a5ab, 0x01562862, 0x02314f9d, 0x0286df1a, 0x00d537c1, 0x03a6b8a9, 0x0055e529, 0x018df758, 0x011d1521, 0x00317539}}, Y: Field{[10]uint32{0x03eb3f6d, 0x036cce9b, 0x02d0de04, 0x00f12d22, 0x00aaf709, 0x0195c265, 0x0365b08c, 0x01e0b3ef, 0x02ed6a13, 0x0032107b}}}, + {X: Field{[10]uint32{0x01c4bffd, 0x0263e7dc, 0x032207cd, 0x00cd802b, 0x02b05615, 0x018d785e, 0x0379ed3f, 0x0167dbfe, 0x01c29858, 0x0014300f}}, Y: Field{[10]uint32{0x03137720, 0x01929df5, 0x02b0a68b, 0x00a22dfd, 0x025c4255, 0x01471d22, 0x01a2bd74, 0x008a6bd6, 0x0397a7ed, 0x0031a321}}}, + {X: Field{[10]uint32{0x008333ef, 0x014d1b7c, 0x01ff3364, 0x0245c74c, 0x03985606, 0x03d6ec3b, 0x010ae5dc, 0x01be68b8, 0x004b3e7e, 0x000a01b6}}, Y: Field{[10]uint32{0x007b429d, 0x026d40f2, 0x0385e54a, 0x0099090d, 0x02bf8cac, 0x00e9ad63, 0x00b5ddbf, 0x01332d33, 0x004338e3, 0x001cbc8d}}}, + {X: Field{[10]uint32{0x008790a4, 0x02254bce, 0x0353f4c5, 0x006f888a, 0x0282bb9c, 0x026103fb, 0x03e33c62, 0x02374710, 0x01dd1ef5, 0x001035c3}}, Y: Field{[10]uint32{0x030770d5, 0x00a875fd, 0x0130d96b, 0x016ce51a, 0x02e65468, 0x03d35545, 0x00d170ea, 0x0264c8ce, 0x0157b6dd, 0x0026c6a7}}}, + {X: Field{[10]uint32{0x0387c835, 0x01598222, 0x03905d01, 0x00105e60, 0x02ac7338, 0x038876a0, 0x037b193e, 0x00484ef5, 0x003204e7, 0x0022143b}}, Y: Field{[10]uint32{0x01c160e2, 0x00dfddf7, 0x00d3a7d6, 0x02cac32d, 0x02961480, 0x019701c5, 0x01f58eaa, 0x002e464b, 0x03a0a916, 0x002abffd}}}, + {X: Field{[10]uint32{0x00ad6e8b, 0x0033dc54, 0x00bd2c24, 0x02c1a8c2, 0x030de291, 0x02f92175, 0x039d4a62, 0x00a7d1df, 0x0109bd7c, 0x00152545}}, Y: Field{[10]uint32{0x03ef2722, 0x01b1ccb1, 0x02f27f13, 0x027ddf00, 0x01b1d8f7, 0x013307ea, 0x0245c764, 0x00ee7e8e, 0x007cf2a2, 0x000bf6cd}}}, + {X: Field{[10]uint32{0x037e5d44, 0x023da7eb, 0x0221facf, 0x022f990d, 0x031c3d3e, 0x0028f9f3, 0x01af1ab7, 0x03ad3ef9, 0x0355cdf8, 0x0027d7b0}}, Y: Field{[10]uint32{0x01d3c06e, 0x01bcb286, 0x00a58488, 0x017a4afe, 0x0312b8be, 0x0368712e, 0x03da94ba, 0x00d5401b, 0x015fb38b, 0x002c80f7}}}, + {X: Field{[10]uint32{0x02c0b3da, 0x00dc688b, 0x0037bbdf, 0x0388c18a, 0x028b72f0, 0x022cc9bf, 0x035e606c, 0x02794a32, 0x029c1bba, 0x00204b92}}, Y: Field{[10]uint32{0x00e222a1, 0x0347163e, 0x00f24d10, 0x01227be4, 0x015d98d2, 0x03b4004d, 0x02bd36a1, 0x02b8e718, 0x01b714a9, 0x000ae9ed}}}, + {X: Field{[10]uint32{0x023d924a, 0x0072a18a, 0x02c36c5c, 0x03d8a89b, 0x01af52c6, 0x03575ff4, 0x00ff16ec, 0x0185ad50, 0x01dbcf85, 0x003980d7}}, Y: Field{[10]uint32{0x001eec86, 0x03ed77fc, 0x0154ad6c, 0x0011a716, 0x01173d31, 0x007ca7c6, 0x0118718a, 0x03f2b1be, 0x009ef687, 0x002a514e}}}, + {X: Field{[10]uint32{0x02033446, 0x0079d49a, 0x00bc6032, 0x00a69ad4, 0x032643f1, 0x01ac8ce6, 0x01696938, 0x0351c6dc, 0x01e8d771, 0x0035e229}}, Y: Field{[10]uint32{0x017d3990, 0x026259fa, 0x030e0b25, 0x00bde7f8, 0x01c0c9a4, 0x01f646d9, 0x017fe32a, 0x01e0fbe9, 0x02225095, 0x000d2e15}}}, + {X: Field{[10]uint32{0x03c6f41c, 0x0175291d, 0x01802561, 0x00bdc1af, 0x020c8ef4, 0x03e8cad5, 0x01b5f116, 0x013e7c07, 0x03dd2937, 0x00198dcc}}, Y: Field{[10]uint32{0x0078676d, 0x03b09b74, 0x013c1394, 0x0199b895, 0x0185b59f, 0x005002de, 0x014e916a, 0x03f16458, 0x01453ae0, 0x0000d617}}}, + {X: Field{[10]uint32{0x0323ad9c, 0x02c08f6c, 0x006f0a5a, 0x00ccd585, 0x016affda, 0x0278b8f5, 0x03ad4d11, 0x00504cf6, 0x032805ae, 0x0017b1b9}}, Y: Field{[10]uint32{0x00884579, 0x008f5a70, 0x029f645c, 0x03919a37, 0x03d35a56, 0x00683f28, 0x00d609db, 0x00c078a7, 0x01bfcfc6, 0x000f7490}}}, + {X: Field{[10]uint32{0x00f8f3c5, 0x019d28cb, 0x02ceee4a, 0x03975105, 0x0087532b, 0x01165c5f, 0x03366471, 0x019a89f0, 0x00421fbb, 0x003c63f1}}, Y: Field{[10]uint32{0x0359d560, 0x008a7344, 0x00de9b4f, 0x0397dd60, 0x02026847, 0x01a1b03e, 0x03b4e836, 0x00f7c403, 0x00813bb3, 0x0034e282}}}, + {X: Field{[10]uint32{0x01f5345a, 0x0089108e, 0x01719206, 0x03fbba87, 0x017dec0d, 0x004d0919, 0x038d3362, 0x03f87c52, 0x009ed9bc, 0x002063d5}}, Y: Field{[10]uint32{0x006602ee, 0x00b237e1, 0x013688cc, 0x0170ae7d, 0x0048b24c, 0x01fd2cfe, 0x001a8e9d, 0x03d12117, 0x011fcca2, 0x000df398}}}, + {X: Field{[10]uint32{0x02dce942, 0x016c02c7, 0x02a6417a, 0x03ad9086, 0x024f4fa8, 0x00cba1e5, 0x034ee3a5, 0x00ff20a9, 0x0391f98e, 0x001d78b1}}, Y: Field{[10]uint32{0x03e5f6b4, 0x0153354d, 0x00b26f2d, 0x02f888aa, 0x007c4d37, 0x00582157, 0x02a17c71, 0x004d89a2, 0x033ba495, 0x00147c8d}}}, + {X: Field{[10]uint32{0x023954d3, 0x01a0db87, 0x011199ca, 0x01667d2e, 0x009b44de, 0x0264ddcc, 0x03f4ec1f, 0x01b4c76b, 0x01b64c0c, 0x001c47e3}}, Y: Field{[10]uint32{0x00caa4b0, 0x038f9f5c, 0x03eb5b75, 0x02e85c2e, 0x016e4dfb, 0x02cd4673, 0x0170fcf7, 0x0320b7cc, 0x01e3432a, 0x00121655}}}, + {X: Field{[10]uint32{0x033ba6a5, 0x01c6f237, 0x0003a160, 0x003f8878, 0x005216f5, 0x0232a70b, 0x022104ee, 0x0168792f, 0x00266f75, 0x0018d40b}}, Y: Field{[10]uint32{0x01bea942, 0x00a2a852, 0x028dd90f, 0x022bc7ce, 0x033954b8, 0x03f9de5d, 0x01075bda, 0x00fd2bd5, 0x01eac8fc, 0x0029720a}}}, + {X: Field{[10]uint32{0x02850872, 0x00425530, 0x0138c92d, 0x0358e49e, 0x0213f5c3, 0x00bb95f9, 0x01bb82fd, 0x0381c06d, 0x0059ccfe, 0x000a99dd}}, Y: Field{[10]uint32{0x037cbe71, 0x035717bb, 0x02053714, 0x00a3ace7, 0x00401bbf, 0x02c0f831, 0x031cbf5d, 0x02c2ca6e, 0x03985c5d, 0x003fdba5}}}, + {X: Field{[10]uint32{0x02b52cbe, 0x006c020c, 0x00d99f05, 0x03417c8c, 0x015b359b, 0x035febe5, 0x01b4a223, 0x01a69c27, 0x038778fb, 0x001a3e17}}, Y: Field{[10]uint32{0x03c92210, 0x0357cf3f, 0x0389e405, 0x0302cef7, 0x01ef9c65, 0x022d5ae1, 0x037b771f, 0x00c62713, 0x0149f4fc, 0x000370ba}}}, + {X: Field{[10]uint32{0x02b74ade, 0x02413cf4, 0x0390e1c2, 0x0321bd2e, 0x009e9883, 0x039642c9, 0x01fd8b9d, 0x0080d942, 0x01b73b54, 0x001fba75}}, Y: Field{[10]uint32{0x03343e62, 0x030c3b81, 0x03828002, 0x01aa7759, 0x03492063, 0x02497775, 0x01c6977b, 0x03c817e4, 0x0013241c, 0x00260489}}}, + {X: Field{[10]uint32{0x00aa33c8, 0x01d54f89, 0x03391381, 0x0011e7ab, 0x00102b5d, 0x03503948, 0x03680230, 0x0249c76c, 0x0090cdb1, 0x002111ec}}, Y: Field{[10]uint32{0x03c0bdb0, 0x02a3087d, 0x02a78c14, 0x0295e225, 0x03121d02, 0x00096948, 0x02eacd39, 0x01d20700, 0x03e655a2, 0x00096d0f}}}, + {X: Field{[10]uint32{0x0016a645, 0x02a2dbca, 0x03268c89, 0x00b9de8b, 0x03e45e62, 0x00317bce, 0x0151f569, 0x01439ade, 0x03b93f15, 0x000c581c}}, Y: Field{[10]uint32{0x007624be, 0x00b6cc65, 0x02caf6a5, 0x02286191, 0x03a1a6f3, 0x00c7571d, 0x0254a4db, 0x0033a30f, 0x01ac2fc7, 0x00155f29}}}, + {X: Field{[10]uint32{0x0036d6ac, 0x007addd2, 0x004ae5fc, 0x03c7264a, 0x00cdaa8e, 0x030046c6, 0x00fe9495, 0x0086b0d6, 0x012da2ef, 0x003eb88c}}, Y: Field{[10]uint32{0x030b76c7, 0x03ba358f, 0x00b8b54e, 0x0366ca6d, 0x00aa948a, 0x03f32fc2, 0x00ee7cb3, 0x03a196c3, 0x02612d99, 0x001bcefd}}}, + {X: Field{[10]uint32{0x00f839f0, 0x0339e0d5, 0x023e12f8, 0x031addbc, 0x007d4c72, 0x00c58abb, 0x01e1691d, 0x037f7c2c, 0x03ef5588, 0x000a028a}}, Y: Field{[10]uint32{0x03683f72, 0x02d21ce4, 0x01c73ca7, 0x018f3036, 0x01b2b4ba, 0x03910161, 0x03be1bc7, 0x025dd2a1, 0x011bc31a, 0x003c037b}}}, + {X: Field{[10]uint32{0x037ccdcd, 0x03dab02f, 0x01ddb86b, 0x02ca2a99, 0x034d0609, 0x031d5113, 0x037e5d28, 0x024b264a, 0x037a9b7b, 0x000fd0f9}}, Y: Field{[10]uint32{0x0072a2d6, 0x01c2a113, 0x015366cf, 0x0155401d, 0x00ac2678, 0x00ae3617, 0x02bd6b99, 0x002952f1, 0x0103bb3c, 0x002cc45e}}}, + {X: Field{[10]uint32{0x0069f2de, 0x03c58b75, 0x0229646d, 0x0037d941, 0x02953550, 0x00147843, 0x02539290, 0x03e8d21f, 0x01c8387b, 0x000e82bf}}, Y: Field{[10]uint32{0x01bb29c7, 0x0061eb32, 0x0324e8b4, 0x03df23fc, 0x01907d4c, 0x03cb294f, 0x0386dff3, 0x0242db87, 0x00c8f0f6, 0x001d5a5f}}}, + {X: Field{[10]uint32{0x0170809d, 0x03a905de, 0x01660949, 0x02aa288f, 0x002789d0, 0x01c81ca8, 0x026e7c4a, 0x01c8fa66, 0x0364209f, 0x000fe5ca}}, Y: Field{[10]uint32{0x02e47d15, 0x0293e110, 0x02342b32, 0x00fb98fc, 0x039a7c05, 0x0280b17f, 0x0026e769, 0x03f672bf, 0x00287a6b, 0x001e9209}}}, + {X: Field{[10]uint32{0x0089b0b4, 0x036bd2ba, 0x004df0e8, 0x0175c7d0, 0x01c21ff8, 0x02e138f4, 0x01f1ecc4, 0x00d93447, 0x000ffa73, 0x00024e2b}}, Y: Field{[10]uint32{0x01be0312, 0x02e9d291, 0x0204a63f, 0x0255932d, 0x004e9689, 0x03681a84, 0x02e8820e, 0x02ce0437, 0x02d3d526, 0x00287027}}}, + {X: Field{[10]uint32{0x00e28bcc, 0x007b22bd, 0x01071831, 0x016993a6, 0x01631c9b, 0x02f4d15d, 0x01eb9ed3, 0x039d309d, 0x01752993, 0x0014d57b}}, Y: Field{[10]uint32{0x006ad088, 0x01c94f3f, 0x01a40ddf, 0x011c0c24, 0x01c81885, 0x0003c614, 0x010279f6, 0x02aabeb0, 0x007d680a, 0x002eec40}}}, + {X: Field{[10]uint32{0x03f277b7, 0x0224c47e, 0x024574e9, 0x01bead8b, 0x02b03369, 0x010d0191, 0x03bda46a, 0x01db1b60, 0x02ed70ba, 0x0022038c}}, Y: Field{[10]uint32{0x020410bc, 0x0331ea1b, 0x00e7c623, 0x02bccc39, 0x0308dcda, 0x01a59a1a, 0x02763d5f, 0x03578901, 0x02cb8d10, 0x001dbfac}}}, + {X: Field{[10]uint32{0x00f11aa8, 0x03447c42, 0x02beebd6, 0x000f6ab5, 0x00857ac5, 0x012dd3a7, 0x00beec11, 0x016da0ae, 0x00aaa275, 0x0036bdde}}, Y: Field{[10]uint32{0x00a5f428, 0x0260bba6, 0x01c88fd4, 0x03c24a60, 0x02e38325, 0x01bb5a5d, 0x00f3024d, 0x00c05e7c, 0x0062710d, 0x0007b617}}}, + {X: Field{[10]uint32{0x03b474dd, 0x01eaf6a3, 0x004641cf, 0x01690b23, 0x009a60b9, 0x00d4cfe0, 0x01c0a4ff, 0x00f49f46, 0x01dd7563, 0x003970fa}}, Y: Field{[10]uint32{0x01fb0dfc, 0x01ec9063, 0x02afb251, 0x03f858cc, 0x0371b7b7, 0x03c82f27, 0x03036990, 0x0021faac, 0x02f65c5c, 0x003c795a}}}, + {X: Field{[10]uint32{0x00096973, 0x01a0df70, 0x03afdd11, 0x00302335, 0x016859c2, 0x03ec9d32, 0x03f3bf2f, 0x0361c25d, 0x0334ecdf, 0x0017500f}}, Y: Field{[10]uint32{0x00f6aeb1, 0x004a4e76, 0x01e4a5ba, 0x00d110f9, 0x022335c3, 0x005d935c, 0x001ba707, 0x01b3165e, 0x007c7024, 0x001ad6f9}}}, + {X: Field{[10]uint32{0x02246b12, 0x019162d7, 0x01f81389, 0x00d3cf95, 0x03993bf0, 0x02642ac9, 0x01b4caac, 0x007dc6cd, 0x013c2551, 0x00142e81}}, Y: Field{[10]uint32{0x02291f63, 0x03e8aefc, 0x025b88a7, 0x028af32f, 0x009f8a22, 0x0018f6ac, 0x02903993, 0x00c5c19d, 0x02455c7a, 0x0034bc4a}}}, + {X: Field{[10]uint32{0x026629cf, 0x02fc0bc1, 0x03a00b38, 0x0088e670, 0x039f2906, 0x00d961e4, 0x03898f0b, 0x02a7b681, 0x00eaee4a, 0x000e16a0}}, Y: Field{[10]uint32{0x03efcd50, 0x029a5d02, 0x01eb16e6, 0x00091a64, 0x038cfe49, 0x02a42e3e, 0x010806d6, 0x031b975d, 0x020bd72a, 0x002950cc}}}, + {X: Field{[10]uint32{0x03dedbef, 0x03866582, 0x00a9b276, 0x02948d88, 0x02eaa669, 0x03501463, 0x029de6c3, 0x0378e1b9, 0x00b9904e, 0x00026184}}, Y: Field{[10]uint32{0x0206b581, 0x03436522, 0x03315c4a, 0x034d8760, 0x03b88f72, 0x016d7fe3, 0x00d0c892, 0x02840343, 0x01a2eb6a, 0x00241dd5}}}, + {X: Field{[10]uint32{0x011b7fe8, 0x01e66646, 0x0329ed45, 0x016d1d53, 0x0219ae21, 0x032efda8, 0x007b0d3d, 0x0034ef7f, 0x0007d964, 0x0020fc42}}, Y: Field{[10]uint32{0x03293364, 0x029be681, 0x035e2489, 0x012bef0a, 0x02fe719e, 0x002778b1, 0x00e69c65, 0x035b4a18, 0x031b5095, 0x003d8b48}}}, + {X: Field{[10]uint32{0x03b1c246, 0x03285f53, 0x0059e74d, 0x03f19ed8, 0x01e3f287, 0x009d67f4, 0x002b0285, 0x00d718be, 0x02939273, 0x00147488}}, Y: Field{[10]uint32{0x0063745d, 0x008677db, 0x0187be05, 0x0374c4a1, 0x02f7184b, 0x00f22c49, 0x00b909e2, 0x016d3462, 0x03a3b514, 0x002e6e00}}}, + {X: Field{[10]uint32{0x03465006, 0x0277bc53, 0x03c70368, 0x01316827, 0x013e8cc2, 0x009b0df1, 0x02919458, 0x00f50f49, 0x0342e578, 0x002f9a98}}, Y: Field{[10]uint32{0x007ef000, 0x0236e89f, 0x0004c200, 0x012c70d8, 0x0081bc7e, 0x00f773f6, 0x01efc141, 0x0149e76a, 0x00fc3fc1, 0x002071c6}}}, + {X: Field{[10]uint32{0x00790036, 0x023c89af, 0x02e81a4e, 0x03642a0a, 0x00448681, 0x022c9c1c, 0x03b043b5, 0x004a1292, 0x00d9c36f, 0x003c84cd}}, Y: Field{[10]uint32{0x0016eff2, 0x03d1d4e2, 0x0308e428, 0x02e0b3c9, 0x03f5f143, 0x00878a4e, 0x03dcc1eb, 0x03f4c114, 0x00513a87, 0x00000112}}}, + {X: Field{[10]uint32{0x01730508, 0x03abebb2, 0x022cb419, 0x00ca494f, 0x020932a8, 0x01cef49f, 0x00cb1f1b, 0x0118fe04, 0x00e5af34, 0x00055631}}, Y: Field{[10]uint32{0x00c917f8, 0x007f937d, 0x0149e2dd, 0x00dd0a28, 0x006921bb, 0x029d4217, 0x023f3f41, 0x0104c8d9, 0x025025e1, 0x0032e331}}}, + {X: Field{[10]uint32{0x025d71e2, 0x02428699, 0x02e642e0, 0x03b6641c, 0x01b575a4, 0x02238e09, 0x00d3596a, 0x0083606d, 0x032c8f60, 0x000614e8}}, Y: Field{[10]uint32{0x003a8367, 0x03b660a8, 0x005e89e3, 0x0222ca50, 0x03eaf268, 0x006187ff, 0x024aedbb, 0x02ba838d, 0x031cb170, 0x002368a8}}}, + {X: Field{[10]uint32{0x00cd323d, 0x00d4e233, 0x0190b8cc, 0x02d0ef75, 0x002da679, 0x03ebea77, 0x01f60dbc, 0x00efb087, 0x00bcf0f0, 0x003bd617}}, Y: Field{[10]uint32{0x00c2f296, 0x03db601e, 0x03acdd93, 0x02e876a9, 0x01f02ccd, 0x00a04e41, 0x0192e078, 0x007db4e1, 0x0203aff9, 0x000af178}}}, + {X: Field{[10]uint32{0x02fd5c14, 0x01da022c, 0x03471a14, 0x01938344, 0x031fa458, 0x0092cf1e, 0x03d99714, 0x01a3aefb, 0x0237e1ea, 0x000fd30b}}, Y: Field{[10]uint32{0x020eeaa5, 0x038da91f, 0x005e330d, 0x005ed50e, 0x01051b9c, 0x03cca6d4, 0x02665b04, 0x00ecfeaa, 0x00ab3d28, 0x0019e264}}}, + {X: Field{[10]uint32{0x0021693a, 0x02d04679, 0x0133b621, 0x004082d5, 0x0059fc9b, 0x00eafcab, 0x01cb20ab, 0x02b12860, 0x038ad557, 0x000ac006}}, Y: Field{[10]uint32{0x02c6b94a, 0x00a5c8e0, 0x006758fa, 0x0234b283, 0x01310a32, 0x0122c949, 0x026f8c30, 0x0276c5cf, 0x0007f8d1, 0x003f93cc}}}, + {X: Field{[10]uint32{0x012cd229, 0x016f24d1, 0x00bb98d0, 0x009d62e8, 0x0379c90d, 0x007ec328, 0x02b5b108, 0x0023fe37, 0x01dd7d5a, 0x00196274}}, Y: Field{[10]uint32{0x028149a9, 0x01e45966, 0x007faa11, 0x016c64af, 0x01fdc547, 0x038003f5, 0x008dca23, 0x00a64d2f, 0x0080ed84, 0x00209025}}}, + {X: Field{[10]uint32{0x03950a6f, 0x027c3d49, 0x028a83b8, 0x03968e8e, 0x00ab4377, 0x01da9aa4, 0x00553162, 0x020d6e3a, 0x010df5d3, 0x00308cff}}, Y: Field{[10]uint32{0x00f6f3e5, 0x0088e4ad, 0x0384f494, 0x00c61ae2, 0x02314680, 0x016bbf81, 0x00fbac08, 0x02690c4b, 0x00a8775a, 0x0023fa38}}}, + {X: Field{[10]uint32{0x024cc14a, 0x02c4f41d, 0x036e7b65, 0x003e27db, 0x02a38867, 0x01d68afe, 0x02e3f57f, 0x023bbb5b, 0x02852a84, 0x00209cc6}}, Y: Field{[10]uint32{0x01117583, 0x0039334e, 0x004c1208, 0x026e29d4, 0x011ffacc, 0x0238d288, 0x03096883, 0x017a1fc6, 0x009a307c, 0x00300314}}}, + {X: Field{[10]uint32{0x02d2a50d, 0x03a9b401, 0x0097707e, 0x02d54fab, 0x00c9dde3, 0x008a50bb, 0x02b51501, 0x02c6c16a, 0x03a0e5d8, 0x003884e1}}, Y: Field{[10]uint32{0x01b0ff83, 0x02043723, 0x00349bb2, 0x02564cd5, 0x000fc81c, 0x012b177f, 0x003c9207, 0x024f7c0d, 0x0109f90d, 0x0031d379}}}, + {X: Field{[10]uint32{0x039fdc25, 0x03269256, 0x0236a00b, 0x0305b410, 0x0292780f, 0x0358d6e3, 0x035c3414, 0x010f6716, 0x01fd2fa4, 0x0006021c}}, Y: Field{[10]uint32{0x0314d120, 0x021400ea, 0x00146599, 0x00db89de, 0x021f25e6, 0x02f80971, 0x02014a8b, 0x03cde908, 0x01506008, 0x00359b1c}}}, + {X: Field{[10]uint32{0x00cb2c42, 0x034c382f, 0x03ab4b44, 0x024d360f, 0x00d64dff, 0x00455ae4, 0x0329a9a3, 0x00aa307b, 0x027eed11, 0x002d6a77}}, Y: Field{[10]uint32{0x0139db38, 0x029c7d0d, 0x03d91130, 0x033ec3fc, 0x0130315c, 0x03be15c8, 0x00afe660, 0x00febcec, 0x0279a81c, 0x00159d69}}}, + {X: Field{[10]uint32{0x00aee7d6, 0x00047f40, 0x03b4d40d, 0x01ec01b4, 0x018ce569, 0x0016973e, 0x02baf78c, 0x039437d0, 0x007261f1, 0x0026b339}}, Y: Field{[10]uint32{0x0107a05c, 0x0223fae5, 0x01e0a95f, 0x00c6b74a, 0x026cb8c8, 0x00c969e7, 0x03568304, 0x0131a795, 0x013c4046, 0x003edf10}}}, + {X: Field{[10]uint32{0x03574e5c, 0x03303ae2, 0x01100a02, 0x038d9f61, 0x01916796, 0x0064f7bb, 0x007bc4b2, 0x01dc48bf, 0x039b7bef, 0x003e02ad}}, Y: Field{[10]uint32{0x015c8f6d, 0x00067747, 0x022aac77, 0x02142d74, 0x003a1ac5, 0x01b372b3, 0x035834ed, 0x022c9766, 0x003f842d, 0x0031b534}}}, + {X: Field{[10]uint32{0x009366a1, 0x0287e62f, 0x01aeefae, 0x0123b058, 0x0125d814, 0x0182c936, 0x005845ef, 0x008c30c0, 0x0355cdb4, 0x002d0c78}}, Y: Field{[10]uint32{0x0241c1cd, 0x0345db76, 0x0390ef69, 0x0395731c, 0x017aebac, 0x014adb9a, 0x02ddb985, 0x002850e0, 0x01d4ae23, 0x003af36b}}}, + {X: Field{[10]uint32{0x0275f1fb, 0x01aa001b, 0x009c593f, 0x037db082, 0x02efe56e, 0x01b72939, 0x02b686f4, 0x00e98d47, 0x039e08c9, 0x001ea982}}, Y: Field{[10]uint32{0x03a0347e, 0x03c03bd7, 0x00c98328, 0x0002d01a, 0x00cb4248, 0x038cf9a5, 0x013e3892, 0x002fc781, 0x01e21770, 0x00001320}}}, + {X: Field{[10]uint32{0x0286b30b, 0x039d8404, 0x0296ba72, 0x03bc9cbd, 0x01d304fb, 0x028ded37, 0x001d1a4d, 0x0090edd1, 0x010b3aa4, 0x0006a209}}, Y: Field{[10]uint32{0x01b7a473, 0x017d2ada, 0x033fe3fd, 0x0163d166, 0x02b33b76, 0x0015aa6f, 0x02d8cb0f, 0x02056f81, 0x010557d3, 0x001896e7}}}, + {X: Field{[10]uint32{0x022b57c7, 0x03b6f0ea, 0x0196682d, 0x011c7aea, 0x0106c4ca, 0x02d773b8, 0x034db23c, 0x015628b4, 0x02eb49fd, 0x0016d493}}, Y: Field{[10]uint32{0x038ae50c, 0x014a41ae, 0x02d5dbf2, 0x009caf28, 0x0025c8b2, 0x01b80af7, 0x01b163d5, 0x033875cd, 0x009756b7, 0x000b570b}}}, + {X: Field{[10]uint32{0x0276d2c5, 0x0016139d, 0x007d1892, 0x03610cef, 0x00191550, 0x03dd5826, 0x00cb8b10, 0x02f9e749, 0x03776d9f, 0x002b9839}}, Y: Field{[10]uint32{0x018d7784, 0x0249bec5, 0x0311ffff, 0x0350d1a8, 0x00b76c36, 0x03bf219e, 0x011be83e, 0x0091cb28, 0x01867377, 0x0010c3fa}}}, + {X: Field{[10]uint32{0x02efb9d4, 0x03e04a98, 0x03105ab4, 0x00c2710b, 0x0353e8d7, 0x017739be, 0x020b081a, 0x03d9a351, 0x023d9e29, 0x000c8e97}}, Y: Field{[10]uint32{0x004776ba, 0x0295afa0, 0x01830c2f, 0x02911d98, 0x03da6216, 0x02d7aa6b, 0x0256d1d3, 0x00fd0859, 0x03b36948, 0x0000ad15}}}, + {X: Field{[10]uint32{0x027c1c9d, 0x00d9445e, 0x022a2a8b, 0x0125e965, 0x02b3db86, 0x01a50a6c, 0x00e612ed, 0x0154b219, 0x01b6591e, 0x002b346d}}, Y: Field{[10]uint32{0x026e88b8, 0x01886423, 0x00fa3265, 0x00947af1, 0x0067544d, 0x009498d2, 0x02ba7729, 0x01a40249, 0x03ff056f, 0x003984c7}}}, + {X: Field{[10]uint32{0x005b36f4, 0x02fdd3de, 0x02cf114e, 0x018211d0, 0x02f2e61e, 0x01549233, 0x026286b1, 0x014b80a8, 0x00708178, 0x001ad38b}}, Y: Field{[10]uint32{0x01b893df, 0x03a19139, 0x01a1a1e4, 0x03f359b9, 0x037398f7, 0x007354a5, 0x007130d0, 0x026f7080, 0x011c7a52, 0x00210025}}}, + {X: Field{[10]uint32{0x0084ab31, 0x01e5a7e0, 0x017c7151, 0x017e02a0, 0x004e6a37, 0x0230d1d1, 0x004cb914, 0x0029187d, 0x0327d67b, 0x0030acb1}}, Y: Field{[10]uint32{0x036d5f59, 0x0207ebb0, 0x01718824, 0x03522414, 0x03a52c47, 0x030a07f4, 0x00aa2519, 0x01ec3e66, 0x0359ebf3, 0x003fb590}}}, + {X: Field{[10]uint32{0x004f202e, 0x01f286e4, 0x02f71220, 0x008af683, 0x022ec564, 0x01e283e1, 0x014609d9, 0x02f653de, 0x02dab5b2, 0x000ce17b}}, Y: Field{[10]uint32{0x003d7443, 0x01eedc58, 0x0074b490, 0x0219d1a9, 0x01b12a21, 0x006a7d10, 0x01975aa3, 0x02a3b871, 0x02af1db8, 0x000a0234}}}, + {X: Field{[10]uint32{0x00c803f2, 0x006701c5, 0x02a82335, 0x03c35314, 0x02edce15, 0x03ead1e1, 0x030c2923, 0x010dee11, 0x00d7f2cb, 0x002003db}}, Y: Field{[10]uint32{0x00a37056, 0x0054bd35, 0x03734ad0, 0x0233b0e5, 0x0023e0a8, 0x02c980a3, 0x0206ca59, 0x006a8337, 0x023e0ad1, 0x002607cb}}}, + {X: Field{[10]uint32{0x02aa2f3b, 0x0071803b, 0x01f32474, 0x02dd853c, 0x02ebfaf4, 0x01eedb2a, 0x00103c6d, 0x00a1bf4f, 0x03ff3a9f, 0x001cea82}}, Y: Field{[10]uint32{0x00c6f7b1, 0x03c76946, 0x02846701, 0x00f13f79, 0x00a54a2e, 0x0362f39f, 0x009fe73d, 0x02e60f2e, 0x012981a9, 0x0000c2f1}}}, + {X: Field{[10]uint32{0x0178f2c5, 0x005a7ee8, 0x029ca789, 0x02626f3c, 0x03863804, 0x00f9d84b, 0x03fdfa9c, 0x004fda02, 0x00e6ab5c, 0x0024a03f}}, Y: Field{[10]uint32{0x00ae36bb, 0x013df373, 0x03b233e7, 0x02f76c28, 0x03aeb6a7, 0x03dfd6ed, 0x01397b18, 0x00b8ecbf, 0x00dbc5bc, 0x0012e5bb}}}, + {X: Field{[10]uint32{0x026e03ca, 0x02fda769, 0x00b8107d, 0x020397b3, 0x029f4387, 0x01c344ba, 0x009be162, 0x02e7bed6, 0x004bbb50, 0x001c8157}}, Y: Field{[10]uint32{0x036bc7cb, 0x0169b183, 0x023f9891, 0x0016a87f, 0x01985ad7, 0x006a188f, 0x01746935, 0x01df7561, 0x017fc30a, 0x002baa89}}}, + {X: Field{[10]uint32{0x03c1879f, 0x017411f9, 0x008e0308, 0x021c4aaf, 0x000eb8e8, 0x03ea09f3, 0x02687c73, 0x038f6c2e, 0x03d0c771, 0x003c3cf3}}, Y: Field{[10]uint32{0x00936b33, 0x026054e9, 0x02e20eff, 0x01733db8, 0x031bf8aa, 0x013f8428, 0x030c4b32, 0x013153e3, 0x027d8b74, 0x000b184b}}}, + {X: Field{[10]uint32{0x02f5dcfa, 0x01ebe6f9, 0x033ec67a, 0x01df979e, 0x00d8b611, 0x0290ddab, 0x02c8fe8e, 0x03c9c1be, 0x036570b0, 0x0025f1e2}}, Y: Field{[10]uint32{0x03e14c3d, 0x027563ce, 0x00daa127, 0x026cd1f1, 0x01133460, 0x00f2d650, 0x03da765c, 0x016162a5, 0x010cfea9, 0x0006bae5}}}, + {X: Field{[10]uint32{0x02509e69, 0x0327bfa7, 0x03eeb9b5, 0x03d4ce9c, 0x024b7908, 0x022c1dfe, 0x013a9de4, 0x01bf0f52, 0x021e967e, 0x002ce7fe}}, Y: Field{[10]uint32{0x0265dc05, 0x01039d7a, 0x01e16f3b, 0x00bc4486, 0x03f76c30, 0x007205f8, 0x0218c007, 0x01cb3035, 0x015181ac, 0x003d57ce}}}, + {X: Field{[10]uint32{0x00e7baaa, 0x007198fe, 0x03fd1735, 0x01ca2c79, 0x0201b2a9, 0x0246c582, 0x003fcc4d, 0x01f1346f, 0x037a5ff2, 0x000566e7}}, Y: Field{[10]uint32{0x00c4360a, 0x0202df29, 0x02697a83, 0x01f55e30, 0x015e6012, 0x01e27f50, 0x021c7f0d, 0x013febae, 0x036d86c5, 0x002c2abb}}}, + {X: Field{[10]uint32{0x0385e44c, 0x027dfcf2, 0x021aaf72, 0x02acf04d, 0x016dff76, 0x0189bf11, 0x0107a62b, 0x012c5b1f, 0x03d18d4a, 0x00096043}}, Y: Field{[10]uint32{0x036a2d9b, 0x0348864b, 0x00f442fc, 0x017ccd5e, 0x009252dd, 0x02d2e2c0, 0x0295526a, 0x02f5c2b4, 0x03257794, 0x003d0148}}}, + {X: Field{[10]uint32{0x033352b2, 0x024d37d1, 0x0241d6e1, 0x02440b69, 0x01eab362, 0x0241d620, 0x019864c0, 0x028ca312, 0x024d5860, 0x0009f882}}, Y: Field{[10]uint32{0x03b45203, 0x02e52640, 0x02a7b65c, 0x00ac03a1, 0x03d3822a, 0x000f0469, 0x030b4905, 0x02d43f89, 0x00f2888c, 0x00305663}}}, + {X: Field{[10]uint32{0x001448a2, 0x03cef44d, 0x032dd685, 0x01a13651, 0x006d684a, 0x02885ed8, 0x008f465b, 0x0253999c, 0x014e517a, 0x00120fd1}}, Y: Field{[10]uint32{0x039ad11f, 0x01a2985f, 0x02aa82ba, 0x01bfc308, 0x01d338d0, 0x01772dc3, 0x0123346c, 0x0268d917, 0x0144d93b, 0x00304ecc}}}, + {X: Field{[10]uint32{0x0204e6e5, 0x002967af, 0x03266e2e, 0x023e0e93, 0x0267ef06, 0x03054cbc, 0x024c9a30, 0x012a996b, 0x02f63173, 0x0013d1ec}}, Y: Field{[10]uint32{0x00d99d2b, 0x00d35996, 0x03a27c01, 0x00bb7551, 0x01682439, 0x03b6adcb, 0x033ebcf3, 0x0272d174, 0x034cf11b, 0x00163c7c}}}, + {X: Field{[10]uint32{0x0397db07, 0x02d8d05d, 0x0057424f, 0x00ac4711, 0x00d6f42a, 0x03a04330, 0x031774b8, 0x033a12d3, 0x037e0835, 0x002a9e3a}}, Y: Field{[10]uint32{0x005e743b, 0x0124fa86, 0x0311b0cf, 0x018c85c4, 0x03ee9ffc, 0x00fdcb8c, 0x00c7541d, 0x0351f167, 0x0139d957, 0x000e5900}}}, + {X: Field{[10]uint32{0x00033d49, 0x02c33a33, 0x0194417e, 0x03daa97d, 0x0031a3f1, 0x00dd602c, 0x01c0655c, 0x00158047, 0x018583c0, 0x00349662}}, Y: Field{[10]uint32{0x02f24b08, 0x00744696, 0x02d8bc84, 0x00193413, 0x02b6a830, 0x036af85c, 0x014622a2, 0x02062e8a, 0x01739de8, 0x000d9072}}}, + {X: Field{[10]uint32{0x01e26634, 0x004a9215, 0x03faf487, 0x017567df, 0x03f2d2b8, 0x010d641e, 0x0338f877, 0x02dd3d5b, 0x03a0eccc, 0x0013c08e}}, Y: Field{[10]uint32{0x01a6a456, 0x020a57ec, 0x02e95bc4, 0x012e1a9b, 0x03a2ae09, 0x024edb0f, 0x03c35ea3, 0x014496e3, 0x0033b15d, 0x003e03bf}}}, + {X: Field{[10]uint32{0x023a1589, 0x03df8b5d, 0x003c670b, 0x00a3df05, 0x028eda41, 0x0056b22f, 0x03e13cfa, 0x03425def, 0x008b48ab, 0x002721bc}}, Y: Field{[10]uint32{0x01c2df45, 0x014bc570, 0x00a171a1, 0x036b211a, 0x0217d4ee, 0x00a7536c, 0x02ff453d, 0x032e20e7, 0x03870e9e, 0x00045447}}}, + {X: Field{[10]uint32{0x02137576, 0x00362e3b, 0x0120e913, 0x01dda760, 0x01c5e6ac, 0x0355f89a, 0x03affcec, 0x017323ff, 0x018b72e9, 0x000e021c}}, Y: Field{[10]uint32{0x01ea728f, 0x0227f4cc, 0x00ceedb7, 0x0068278f, 0x00c614a6, 0x03b62d63, 0x02e59cf8, 0x02dc8936, 0x01ebcf5e, 0x003d03af}}}, + {X: Field{[10]uint32{0x00dda3df, 0x03e9d4bf, 0x03b4255d, 0x011d71f7, 0x00eb349f, 0x03b68091, 0x01c80a13, 0x024bf01c, 0x015e3994, 0x00237bf4}}, Y: Field{[10]uint32{0x03f7a771, 0x01317d9e, 0x00c7ff9e, 0x033b8ec3, 0x01a01786, 0x03f0e58c, 0x03b0d19f, 0x03430ed3, 0x03784353, 0x0034f7e9}}}, + {X: Field{[10]uint32{0x0024bf8a, 0x02a2a9f7, 0x03d466ea, 0x03430c92, 0x03ed99f9, 0x0263eb79, 0x00052487, 0x0341f8ea, 0x01425ac1, 0x00236b23}}, Y: Field{[10]uint32{0x02ef8009, 0x0042dcaa, 0x00087d64, 0x0098834a, 0x0262e9d9, 0x00d5375b, 0x032f097d, 0x00d3f362, 0x01b79232, 0x003c8cbf}}}, + {X: Field{[10]uint32{0x03a90e1b, 0x032b011f, 0x01d35329, 0x03f1be04, 0x01e45d26, 0x0090f0f4, 0x03178b4f, 0x039b78a1, 0x0043f3bc, 0x0021f399}}, Y: Field{[10]uint32{0x01724138, 0x00cfa54e, 0x02875fac, 0x03523dc3, 0x000f0af0, 0x01fb7cec, 0x002799d7, 0x012ad316, 0x00196241, 0x0002a25c}}}, + {X: Field{[10]uint32{0x00fdf08d, 0x0259b1aa, 0x02f3bd22, 0x03201d06, 0x02124a21, 0x02dddd6e, 0x0360a3f8, 0x02ddfa7a, 0x03fabf2f, 0x002ffb9a}}, Y: Field{[10]uint32{0x03ba76f7, 0x0339757e, 0x03fa69c9, 0x03a102e0, 0x02cd2e8b, 0x00bf20fb, 0x026f2155, 0x012fc5fc, 0x0399541e, 0x000a6870}}}, + {X: Field{[10]uint32{0x00c2bec1, 0x026bcad7, 0x0341daef, 0x02be0e06, 0x00044873, 0x02bfdcae, 0x001a5537, 0x02a0008d, 0x01a5b553, 0x00030c3f}}, Y: Field{[10]uint32{0x039fea6d, 0x01054ed0, 0x0162e7d1, 0x01b99775, 0x028a96f7, 0x0338d011, 0x004aafc0, 0x023593e9, 0x02b587d8, 0x001738fa}}}, + {X: Field{[10]uint32{0x0000ed97, 0x0375360d, 0x030a00f1, 0x001dca35, 0x014d9226, 0x006d067d, 0x01cadbfe, 0x00675c31, 0x01fd5941, 0x00179c54}}, Y: Field{[10]uint32{0x02108917, 0x03654c7a, 0x0020d73b, 0x0259895e, 0x024c64ec, 0x032f75d7, 0x0136816e, 0x0129f58b, 0x02a5a51d, 0x001aa33b}}}, + {X: Field{[10]uint32{0x0086100b, 0x01a436fb, 0x007c04bf, 0x01ead435, 0x03e974af, 0x01494896, 0x03d06208, 0x0357c3cc, 0x030a66cd, 0x002a723a}}, Y: Field{[10]uint32{0x038e0a2f, 0x02786ca2, 0x02bf329c, 0x0223cebb, 0x00a4371e, 0x03ca4335, 0x02a24bcf, 0x00c7cec0, 0x039d8987, 0x003c8272}}}, + {X: Field{[10]uint32{0x03a2e439, 0x021446b8, 0x0253b946, 0x01cd7ebd, 0x01cb8043, 0x00bb9848, 0x01b16595, 0x0245411c, 0x01d79366, 0x0025579e}}, Y: Field{[10]uint32{0x03930d06, 0x001c02f3, 0x028261de, 0x037c4839, 0x002e82cd, 0x0295b1e8, 0x02a3bcc1, 0x019e8043, 0x03e32a9b, 0x001a36ab}}}, + {X: Field{[10]uint32{0x03a34a71, 0x00ad0277, 0x005fac19, 0x0014f21a, 0x02bef248, 0x02edf875, 0x03bc70b3, 0x0331a96c, 0x0293d3c1, 0x0008b49c}}, Y: Field{[10]uint32{0x039b3357, 0x020dfa58, 0x02389e6c, 0x037ece77, 0x014d5d76, 0x01036ed6, 0x004e42e7, 0x0156dd4f, 0x00e34fc8, 0x0031d2d1}}}, + {X: Field{[10]uint32{0x0137abc0, 0x013a3108, 0x03835b2f, 0x022ce80d, 0x0370d46e, 0x0121ebaf, 0x01d91f71, 0x005d9d3a, 0x02cef74b, 0x003467f3}}, Y: Field{[10]uint32{0x02db7580, 0x02b6db12, 0x00a83fe9, 0x0397cd97, 0x0334ca9f, 0x025332e8, 0x02224f74, 0x002604f3, 0x03f63dca, 0x0016e412}}}, + {X: Field{[10]uint32{0x02336899, 0x00df2470, 0x0073f2a4, 0x01b1492a, 0x001723c3, 0x02f1a9aa, 0x02091136, 0x01200359, 0x022aadc7, 0x001aa85c}}, Y: Field{[10]uint32{0x02319d07, 0x03c7b8b5, 0x03c369a4, 0x0367b599, 0x023d9709, 0x00855273, 0x01640583, 0x016d318c, 0x004cdf49, 0x0023a5c0}}}, + {X: Field{[10]uint32{0x00ea6efc, 0x01be146c, 0x01052f73, 0x01ac1c83, 0x02b16e3b, 0x025ab461, 0x0107262e, 0x0348804b, 0x02239ee4, 0x001e6f4d}}, Y: Field{[10]uint32{0x0018729e, 0x03d36fbd, 0x000fe42d, 0x01beb5ae, 0x036a3116, 0x031f24b0, 0x00972c71, 0x03369077, 0x03dbf568, 0x000292d0}}}, + {X: Field{[10]uint32{0x00f16ce9, 0x00460be9, 0x028c9e40, 0x00800500, 0x03a1c7d8, 0x01a43033, 0x0183c5d3, 0x00ded59d, 0x032c1463, 0x002d780a}}, Y: Field{[10]uint32{0x0069e0b2, 0x0389e564, 0x026fb938, 0x0299c634, 0x021a819b, 0x003a2850, 0x013516fa, 0x02a9c39e, 0x02be3fac, 0x0012e591}}}, + {X: Field{[10]uint32{0x03a7403a, 0x02bdd0c1, 0x0057dd05, 0x02152ce2, 0x0114a2b6, 0x021fde43, 0x0044d643, 0x03ad3419, 0x0271de2d, 0x00238cf8}}, Y: Field{[10]uint32{0x01ecc429, 0x00f5b8a2, 0x0171fc91, 0x03fc3fa7, 0x00e08d73, 0x00f833ac, 0x02011bd0, 0x028773aa, 0x03a2c7a4, 0x00360b54}}}, + {X: Field{[10]uint32{0x0019c2f5, 0x0164f293, 0x0036b074, 0x03d8bd7b, 0x020abd6e, 0x03b68df6, 0x0369b73f, 0x029e0395, 0x004277db, 0x0013ffbd}}, Y: Field{[10]uint32{0x0392f854, 0x021a04f4, 0x01d694a1, 0x02f59efe, 0x03796755, 0x02ec27e6, 0x036162cf, 0x0282ae7b, 0x0057378a, 0x002a28c2}}}, + {X: Field{[10]uint32{0x01f57368, 0x00dc49ba, 0x02bdefb7, 0x035bb2e9, 0x03f7e42e, 0x006e491b, 0x00b03341, 0x001722d6, 0x012a6338, 0x0021e2d9}}, Y: Field{[10]uint32{0x02e85836, 0x007bf055, 0x0020ad54, 0x004749d2, 0x02148c97, 0x01290750, 0x02e71f0b, 0x0056334e, 0x033ed691, 0x000b3efa}}}, + {X: Field{[10]uint32{0x01eb415e, 0x002c41a7, 0x02783dd4, 0x00bc6c20, 0x01a0aa0b, 0x01e6b2f0, 0x0399ee6a, 0x02bb451a, 0x0215aee2, 0x003be69a}}, Y: Field{[10]uint32{0x01e97240, 0x02f42392, 0x00d826d9, 0x03686715, 0x02cffd9c, 0x02d271ea, 0x03c44802, 0x00d45286, 0x02ba7fd5, 0x00264278}}}, + {X: Field{[10]uint32{0x0245bf37, 0x02b081c1, 0x008fcdcf, 0x00630b55, 0x02c7814e, 0x036c33a3, 0x00358855, 0x0348c182, 0x00d41551, 0x00357092}}, Y: Field{[10]uint32{0x01a36f05, 0x02013045, 0x029cb3c3, 0x017e0b6a, 0x003cbeb4, 0x0053542a, 0x0378c88c, 0x007e0a32, 0x009e7bf0, 0x003e717a}}}, + {X: Field{[10]uint32{0x03227d1a, 0x016467d5, 0x00289f2c, 0x003c25bb, 0x026dad0c, 0x005155a0, 0x036e6148, 0x0055f659, 0x01cca526, 0x003b6fc9}}, Y: Field{[10]uint32{0x0299554d, 0x036b80bb, 0x034c7409, 0x007bdb95, 0x03d0ca70, 0x0034dc95, 0x0033c137, 0x0191592a, 0x0088be05, 0x0001a115}}}, + {X: Field{[10]uint32{0x00cf09bb, 0x039ba953, 0x0378b26f, 0x02c37f3c, 0x0314be80, 0x033e4a1a, 0x021f5cf0, 0x038dd894, 0x026fb8e2, 0x00170480}}, Y: Field{[10]uint32{0x02daa596, 0x0299d619, 0x010471bf, 0x014102ea, 0x0094b81a, 0x02072691, 0x010154d5, 0x0194a1e5, 0x01ef4e2c, 0x000f6635}}}, + {X: Field{[10]uint32{0x008e2d6d, 0x0134acb9, 0x030a0b43, 0x0352bce5, 0x03ae728b, 0x019cce31, 0x00dcef7f, 0x00157585, 0x02435056, 0x00309f98}}, Y: Field{[10]uint32{0x018525c9, 0x004dea9f, 0x033ced82, 0x025e158c, 0x029e372d, 0x0334a315, 0x00839eeb, 0x03e51bde, 0x02fc703c, 0x001dad61}}}, + {X: Field{[10]uint32{0x01abaf8a, 0x036bb794, 0x027e7b96, 0x00feac52, 0x007f6760, 0x0263b981, 0x0024e8af, 0x0061ad35, 0x03045140, 0x0028a631}}, Y: Field{[10]uint32{0x00108fda, 0x0358e35a, 0x031085d7, 0x027ae9cb, 0x00463b77, 0x01283087, 0x01b430db, 0x0064d529, 0x01582a1b, 0x001371c0}}}, + {X: Field{[10]uint32{0x012013c4, 0x00bccf86, 0x02f073a6, 0x005223ae, 0x02fdf400, 0x0125a8cc, 0x0204fb19, 0x03a2c2b0, 0x015782da, 0x00387f3a}}, Y: Field{[10]uint32{0x01d02f4c, 0x0138d9c7, 0x008a4a26, 0x00e513cc, 0x01e8ca64, 0x01de8435, 0x022b50aa, 0x01bfe5aa, 0x02e5d578, 0x0010145f}}}, + {X: Field{[10]uint32{0x03097d6d, 0x00e6ff02, 0x033a21e1, 0x010bd9cf, 0x001a2b0c, 0x008d8551, 0x00e49bb6, 0x02e00239, 0x03fc5f06, 0x00039c66}}, Y: Field{[10]uint32{0x02fd7822, 0x0118b0ab, 0x025e1a0a, 0x00cd3e45, 0x01d14e2c, 0x00631251, 0x023929ee, 0x037da287, 0x001d83f5, 0x003c320f}}}, + {X: Field{[10]uint32{0x00ad0a4e, 0x0130e2d4, 0x0235a17f, 0x01436723, 0x020dc27c, 0x039a5f6e, 0x00b11277, 0x03358a10, 0x024ba9d8, 0x001ddd9a}}, Y: Field{[10]uint32{0x031b6431, 0x02da7388, 0x00554b26, 0x01b9bdb9, 0x0060b758, 0x01b0642f, 0x02265ac8, 0x009ee808, 0x02d94483, 0x0016ce8a}}}, + {X: Field{[10]uint32{0x008514b4, 0x03ca390d, 0x00292597, 0x035d8983, 0x004f2c9d, 0x00418da4, 0x0260cda4, 0x02a157e1, 0x021f6215, 0x003c8ddc}}, Y: Field{[10]uint32{0x02cfef79, 0x02e4ce06, 0x03651bcc, 0x03a755ec, 0x0046f5ad, 0x00f2e61d, 0x02e8c6d3, 0x027e73b2, 0x021c187b, 0x0004276a}}}, + {X: Field{[10]uint32{0x027b3e08, 0x014fc269, 0x033b9f19, 0x00edb16b, 0x0397517b, 0x01436f20, 0x004e7a8a, 0x006868f3, 0x01d5e889, 0x0025023d}}, Y: Field{[10]uint32{0x01691555, 0x01e7b256, 0x02b90ed8, 0x0150cb67, 0x03ca33e9, 0x0173b4af, 0x01f87b90, 0x006ba725, 0x0212c32f, 0x0006e0bc}}}, + {X: Field{[10]uint32{0x012a7064, 0x027db055, 0x020f4c4f, 0x03223c59, 0x03883649, 0x03a419d7, 0x03214f13, 0x01e49b27, 0x02551170, 0x002ca0dd}}, Y: Field{[10]uint32{0x011abfcf, 0x02c2f5db, 0x00131829, 0x01054671, 0x03be6ee0, 0x02f5545b, 0x0303ca45, 0x02258b9b, 0x033915be, 0x0022554d}}}, + {X: Field{[10]uint32{0x0378f4a9, 0x019eff92, 0x039c1437, 0x00c4fe4b, 0x03986413, 0x01b034a7, 0x012a9dcb, 0x03d5293b, 0x020036b5, 0x003390ae}}, Y: Field{[10]uint32{0x03a048d4, 0x02f4dff8, 0x028024a7, 0x0360914a, 0x0339b757, 0x03dc1afe, 0x00c91792, 0x02ebd1da, 0x0292cf35, 0x001b951c}}}, + {X: Field{[10]uint32{0x00cbcc59, 0x03b738bb, 0x0007d8e9, 0x02f10bc2, 0x00d3942b, 0x0352bd08, 0x009325e8, 0x00ea5efb, 0x02a01a06, 0x002ecf68}}, Y: Field{[10]uint32{0x02d70b32, 0x016749fe, 0x00d9d5c5, 0x00023685, 0x0225d6eb, 0x035b9ecb, 0x018a19ec, 0x0241ffbd, 0x03aabc39, 0x001f0a39}}}, + {X: Field{[10]uint32{0x02c490ee, 0x00b0378d, 0x02acf539, 0x0249b7a3, 0x01dd3e95, 0x01bec9a4, 0x036f620d, 0x0281d3a9, 0x003c97f3, 0x00097613}}, Y: Field{[10]uint32{0x02d5651a, 0x01ce90c5, 0x0154016f, 0x01b279d6, 0x03415309, 0x02b5bf49, 0x0391ffb1, 0x022a6c1e, 0x0345088c, 0x0017839d}}}, + {X: Field{[10]uint32{0x00d5765b, 0x00e511a1, 0x034a7faf, 0x00af9d0e, 0x03764994, 0x01f01d85, 0x015a01de, 0x01bc60b9, 0x03fdca25, 0x0022ea8e}}, Y: Field{[10]uint32{0x030506f1, 0x0022e034, 0x018117f3, 0x01f41f9c, 0x01587bfe, 0x01cc2c84, 0x01c28164, 0x0057345c, 0x00978bbe, 0x001851fa}}}, + {X: Field{[10]uint32{0x021f5170, 0x01a5e5c0, 0x0319274c, 0x026ca1f1, 0x024d3b6b, 0x000931c1, 0x0065dea8, 0x000e1447, 0x020a5b7d, 0x00141f5a}}, Y: Field{[10]uint32{0x037bf5d3, 0x00eb6b5f, 0x03b372dc, 0x034338c3, 0x03c12793, 0x00eb8cae, 0x02a8141c, 0x020eb91f, 0x024770ea, 0x0004e7c5}}}, + {X: Field{[10]uint32{0x02bbd846, 0x003f4e89, 0x030d6d64, 0x03ced3fc, 0x00e45620, 0x003f085f, 0x037354b1, 0x0316fa66, 0x02f7a059, 0x001f1a64}}, Y: Field{[10]uint32{0x01e0bee6, 0x006838ed, 0x02d03274, 0x02814386, 0x001f64e6, 0x004e7efb, 0x027062d7, 0x019070aa, 0x034efa63, 0x00025911}}}, + {X: Field{[10]uint32{0x02698bf2, 0x0319a496, 0x0238fcfc, 0x005efec2, 0x033d5e33, 0x03a9bc55, 0x00507509, 0x016c8c52, 0x02b01bf6, 0x003d8a0c}}, Y: Field{[10]uint32{0x00c1ec95, 0x0230a995, 0x0040d366, 0x00ee31d6, 0x011546cc, 0x013cdd6f, 0x02ce6f88, 0x037f5cfd, 0x00107b8f, 0x0035cc52}}}, + {X: Field{[10]uint32{0x03d1ebad, 0x03e2e71a, 0x02657def, 0x022b3332, 0x00594f62, 0x02f8f1f1, 0x00e20913, 0x03b0d8ad, 0x00abd8e4, 0x002bb487}}, Y: Field{[10]uint32{0x037100f8, 0x03759cae, 0x01dfdf9c, 0x00158094, 0x02b880a2, 0x03d07515, 0x02de1ac2, 0x01ffeaa2, 0x02f3833c, 0x0003e003}}}, + {X: Field{[10]uint32{0x014bf405, 0x0337f6dc, 0x01f66e06, 0x032adb00, 0x029e0ba8, 0x032a5094, 0x011b877a, 0x026905ae, 0x00a9343a, 0x0011b79e}}, Y: Field{[10]uint32{0x014d2bcf, 0x027662fb, 0x00bf66c8, 0x021c237e, 0x0181f30b, 0x00646136, 0x02809c6f, 0x029cfb84, 0x02524f3e, 0x00305104}}}, + {X: Field{[10]uint32{0x00bd41bc, 0x000ed095, 0x02174a63, 0x02469d42, 0x03ba4b65, 0x0010ee66, 0x016ae193, 0x03a4c94d, 0x01b8ab82, 0x000a0cad}}, Y: Field{[10]uint32{0x00aba440, 0x0398fdcd, 0x0049e249, 0x0093d242, 0x01a82752, 0x032e19a5, 0x02ce5340, 0x03c5248f, 0x02033f59, 0x00300d8f}}}, + {X: Field{[10]uint32{0x03e43f9a, 0x017c3132, 0x007ff939, 0x00109cdb, 0x020d85bd, 0x003cdaf6, 0x00abe39b, 0x005885df, 0x01024b5c, 0x0016d5f1}}, Y: Field{[10]uint32{0x0120766c, 0x0032306f, 0x00c06853, 0x0131eb73, 0x01b282ed, 0x00d7613b, 0x03f57b9b, 0x0011cfc6, 0x0007dc0c, 0x00002109}}}, + {X: Field{[10]uint32{0x01c2f103, 0x0132ec70, 0x03af3dac, 0x0362a7b6, 0x00814c45, 0x025ad2a7, 0x01bf8211, 0x01d63a09, 0x02708063, 0x002ce136}}, Y: Field{[10]uint32{0x030fa325, 0x002fbf48, 0x02d13df3, 0x0056bcc3, 0x03aa2375, 0x0241d5fe, 0x03925965, 0x033101d3, 0x01df6400, 0x0039b998}}}, + {X: Field{[10]uint32{0x009a5e1c, 0x00031697, 0x008f8e73, 0x01c8057b, 0x0282a5b6, 0x0069519a, 0x00a5da96, 0x01122a6c, 0x0191563e, 0x000dbff6}}, Y: Field{[10]uint32{0x00bb961c, 0x03b625c0, 0x013b632a, 0x035812d4, 0x01d1a742, 0x0135c8a9, 0x01873208, 0x0351fa50, 0x0035fc17, 0x0025c19e}}}, + {X: Field{[10]uint32{0x0189d81c, 0x02acd2bb, 0x022e7f5a, 0x00b31b0d, 0x035b9d14, 0x00eb7361, 0x0260ecc3, 0x000d9f93, 0x005257c2, 0x0020d9f9}}, Y: Field{[10]uint32{0x008be121, 0x00efc665, 0x0327af1f, 0x0356ef73, 0x02b77ce2, 0x03d0e067, 0x00a9e74d, 0x02c9bb4e, 0x00903ffa, 0x003f1ffc}}}, + {X: Field{[10]uint32{0x00b0564b, 0x0225a6f7, 0x02d179c9, 0x02e752c6, 0x0004719f, 0x0048e196, 0x00539e24, 0x00a5bed0, 0x03e48cc9, 0x003db391}}, Y: Field{[10]uint32{0x03950e1c, 0x003582a1, 0x02a60093, 0x0019e002, 0x02b524a6, 0x033464ab, 0x01590175, 0x03702dbc, 0x036afe5e, 0x000da34a}}}, + {X: Field{[10]uint32{0x01fae013, 0x00769efe, 0x02ac6509, 0x01623fe7, 0x03194ccb, 0x01c95917, 0x03d20c2a, 0x029bc149, 0x03e4beda, 0x0010e308}}, Y: Field{[10]uint32{0x02ff15f8, 0x004c69a4, 0x00b456d6, 0x02ffe392, 0x03e28dc6, 0x01c8a884, 0x01c93b53, 0x02095f6f, 0x0230c721, 0x00151882}}}, + {X: Field{[10]uint32{0x02bee7bd, 0x02124b61, 0x03fbc84e, 0x02acbbb1, 0x03a1fa1d, 0x0176d405, 0x00e87228, 0x00d2fdeb, 0x02f8cc94, 0x00073d9c}}, Y: Field{[10]uint32{0x01cafdcc, 0x00d2f16d, 0x01018167, 0x0047891e, 0x018932b5, 0x01d9f3bf, 0x03cccedb, 0x03769655, 0x01258bb4, 0x0035b48f}}}, + {X: Field{[10]uint32{0x021a2861, 0x01688fcf, 0x00bf4432, 0x018e2bca, 0x01943052, 0x03dc557f, 0x01cd1574, 0x00a6d9ba, 0x0212b0fa, 0x0011d193}}, Y: Field{[10]uint32{0x02b05141, 0x02a19368, 0x01e5681d, 0x02c286c6, 0x03a2468d, 0x0121a6a0, 0x0166e808, 0x03d5997a, 0x01d53bcd, 0x00082690}}}, + {X: Field{[10]uint32{0x02a964a2, 0x0301d69a, 0x02ff8717, 0x008f82c0, 0x020c4ee2, 0x02efdceb, 0x0077a0a9, 0x0324139a, 0x03a1c884, 0x002a6b7e}}, Y: Field{[10]uint32{0x03f79dc8, 0x02b90120, 0x0236c6cf, 0x0282121e, 0x02b2d809, 0x03fad49f, 0x03371d4a, 0x030d71cf, 0x001da7bb, 0x002ac584}}}, + {X: Field{[10]uint32{0x018edcbe, 0x00071bf1, 0x03f97d31, 0x02b97d05, 0x01824421, 0x0167b3e5, 0x00983dd6, 0x000c496b, 0x02de1060, 0x000a4cbf}}, Y: Field{[10]uint32{0x0176d727, 0x01d508f7, 0x02176e10, 0x0385f210, 0x012df54f, 0x03d32c47, 0x0234fe06, 0x0055afcb, 0x0343e666, 0x00218069}}}, + {X: Field{[10]uint32{0x03a50216, 0x0359969c, 0x01df3e31, 0x00e79a62, 0x0064f9ba, 0x03fdd103, 0x02b62c58, 0x02b41080, 0x01282f87, 0x0016afd5}}, Y: Field{[10]uint32{0x01a1fabf, 0x01a4a541, 0x029c5d32, 0x015ca0b5, 0x00610b6f, 0x03b71738, 0x00a1b370, 0x0170080b, 0x0216f270, 0x001c7713}}}, + {X: Field{[10]uint32{0x0001843a, 0x02670f6a, 0x013ec573, 0x02f34902, 0x020f359c, 0x00b0b1f9, 0x0087fc28, 0x0072b506, 0x015d9a12, 0x00010652}}, Y: Field{[10]uint32{0x033e0c31, 0x014daabd, 0x009d2956, 0x01f3638e, 0x02d5e661, 0x00e641cc, 0x02fefc78, 0x01425046, 0x01974029, 0x002454b8}}}, + {X: Field{[10]uint32{0x01fbc3af, 0x016ade8a, 0x03eae416, 0x013889bd, 0x00a902bc, 0x02b2ec56, 0x027979a5, 0x039270f0, 0x0082ea2b, 0x003f28e1}}, Y: Field{[10]uint32{0x0346f5f4, 0x015a9b73, 0x0234f288, 0x01d5ec03, 0x01bad50a, 0x00a5b110, 0x0235f0f7, 0x00999242, 0x035e5fe6, 0x0004981c}}}, + {X: Field{[10]uint32{0x01065d06, 0x02bd1595, 0x02de14b7, 0x01023244, 0x02d499ec, 0x016f0eac, 0x02135305, 0x00da22b2, 0x01233d70, 0x002f3c14}}, Y: Field{[10]uint32{0x01fb8bf9, 0x032d97e9, 0x0271d5f5, 0x0245d9c3, 0x01c16d49, 0x00d15a21, 0x0084e63a, 0x01a42cd5, 0x03f10645, 0x003cc995}}}, + {X: Field{[10]uint32{0x029a92e1, 0x036292e3, 0x018e479d, 0x03128999, 0x0268bf6c, 0x017f25ac, 0x019cf74f, 0x02d092c5, 0x002f6391, 0x00139c2d}}, Y: Field{[10]uint32{0x013b3688, 0x02ccfdf9, 0x03d36591, 0x02c8ff93, 0x0266c595, 0x02db38d5, 0x0324fa44, 0x007019de, 0x00111af3, 0x0022e9e2}}}, + {X: Field{[10]uint32{0x0121742f, 0x0213c37a, 0x00e6e1be, 0x03ce2897, 0x013cdb83, 0x01d8a370, 0x013703ca, 0x0183ab08, 0x03d7331c, 0x000ffa14}}, Y: Field{[10]uint32{0x01dca5d6, 0x00c39517, 0x0076d0b2, 0x00966d81, 0x03f27b51, 0x003c9374, 0x01961540, 0x03704dbd, 0x0377c2c6, 0x003edf6e}}}, + {X: Field{[10]uint32{0x0248b9be, 0x0098d27d, 0x025f5ee7, 0x0208f33d, 0x01ca42f5, 0x013a5d90, 0x02aa8100, 0x03750028, 0x037fc3ca, 0x003600cd}}, Y: Field{[10]uint32{0x03d6fe99, 0x011c67a3, 0x02900d82, 0x00616b44, 0x00aeed21, 0x033044eb, 0x02b7fbfe, 0x02020152, 0x004f281a, 0x0018d5ee}}}, + {X: Field{[10]uint32{0x030bebe1, 0x001b2781, 0x03845941, 0x00535b62, 0x0290a051, 0x01fe97b4, 0x037128e7, 0x01c5880a, 0x007b6f9e, 0x001777f7}}, Y: Field{[10]uint32{0x01cd76ad, 0x0047b915, 0x021e9d59, 0x03644663, 0x02714b6d, 0x00740c19, 0x0274c81a, 0x03edefeb, 0x00edfa1e, 0x00008fab}}}, + {X: Field{[10]uint32{0x036f7dd5, 0x0133528e, 0x004115bc, 0x01bb5c85, 0x037913b4, 0x004b459e, 0x01353e6b, 0x02523fa4, 0x0243c964, 0x0017c540}}, Y: Field{[10]uint32{0x00af903f, 0x0375366e, 0x014e571c, 0x0336555d, 0x03b18147, 0x028d8313, 0x00991e2b, 0x03440805, 0x01497a2f, 0x000daaf2}}}, + {X: Field{[10]uint32{0x00942647, 0x01a6eb14, 0x00e14979, 0x00898551, 0x030539f0, 0x02c49fbf, 0x00cc89c2, 0x0110a5e9, 0x00975b0c, 0x00092d3f}}, Y: Field{[10]uint32{0x02b5c207, 0x00e895e7, 0x038f9a82, 0x00b290f2, 0x0311d96f, 0x000529de, 0x02f88819, 0x001f617e, 0x03df54ad, 0x002f4f8f}}}, + {X: Field{[10]uint32{0x002202e0, 0x03395739, 0x0276e1dc, 0x03aab987, 0x03f11b18, 0x02191061, 0x025ba2b2, 0x02d7f277, 0x03355556, 0x0028083a}}, Y: Field{[10]uint32{0x02639f66, 0x02416755, 0x0188027e, 0x01bafadc, 0x039765ac, 0x02a60b8a, 0x03667c00, 0x03d15c5a, 0x021f1ad2, 0x00269c7a}}}, + {X: Field{[10]uint32{0x01f37a68, 0x01abf6b8, 0x00a0f86f, 0x01e33356, 0x038a224c, 0x018711f8, 0x0131de59, 0x00fab181, 0x0064f717, 0x00182de4}}, Y: Field{[10]uint32{0x010786b7, 0x017ce312, 0x016decfc, 0x038d89c9, 0x013437e4, 0x022d529f, 0x01fcbaed, 0x01f5b5ae, 0x024cf6a4, 0x000eb412}}}, + {X: Field{[10]uint32{0x01f7d60b, 0x01edf8e8, 0x01685177, 0x02d74442, 0x03d2e233, 0x03238ff7, 0x002d9159, 0x0079512b, 0x01f2b57d, 0x0020d73c}}, Y: Field{[10]uint32{0x02a84b31, 0x017281fd, 0x01b16166, 0x0255f24a, 0x01a7112f, 0x03871b80, 0x03f77339, 0x036c4eee, 0x0135136e, 0x001f48f7}}}, + {X: Field{[10]uint32{0x037f77ed, 0x00e549e0, 0x00dcab1d, 0x0378c623, 0x03606cd7, 0x012cc66e, 0x021d8ade, 0x036b540b, 0x03501f1e, 0x003ebdd0}}, Y: Field{[10]uint32{0x0221bcc9, 0x0122f7ff, 0x0147616d, 0x006e15d4, 0x030fbcd1, 0x026deb3f, 0x01a0fa03, 0x0160392e, 0x00bdbffb, 0x0036efac}}}, + {X: Field{[10]uint32{0x012de938, 0x02775dc3, 0x027620a3, 0x02974eca, 0x01044091, 0x004849c7, 0x03f74edf, 0x02eb88f9, 0x03c3e072, 0x000e5b1b}}, Y: Field{[10]uint32{0x026fa667, 0x027458b7, 0x024799e9, 0x01dbd1aa, 0x029fb0e0, 0x01ae3d53, 0x00499409, 0x01513533, 0x02f8a143, 0x00177948}}}, + {X: Field{[10]uint32{0x0144ab88, 0x0051fb83, 0x03684881, 0x0170790e, 0x00ae8e60, 0x0023bc83, 0x02622f80, 0x03cb2870, 0x0140ad8d, 0x0003e2ae}}, Y: Field{[10]uint32{0x01bff796, 0x00f9c377, 0x011e0406, 0x03d4cf91, 0x01630d28, 0x0201310a, 0x0057163f, 0x009f3b26, 0x0281fa74, 0x00267f94}}}, + {X: Field{[10]uint32{0x01772367, 0x0106d1af, 0x01e78758, 0x01325640, 0x008197af, 0x020a70dd, 0x0122219a, 0x03fff078, 0x0068af6d, 0x0029880a}}, Y: Field{[10]uint32{0x01e9af45, 0x03deeac1, 0x00e4d145, 0x031360ec, 0x03fe9c4f, 0x0235a363, 0x0254eb6f, 0x0127053e, 0x020bc82a, 0x000981e8}}}, + {X: Field{[10]uint32{0x0067e41e, 0x0312611c, 0x02bda4d7, 0x017edda8, 0x00cfbced, 0x00e93f6f, 0x03644842, 0x02185a41, 0x019349a9, 0x002c4b46}}, Y: Field{[10]uint32{0x02d75e31, 0x0270cf70, 0x037ec009, 0x0155c006, 0x0173fdd5, 0x01c05112, 0x0045eb3f, 0x022ac4a4, 0x00e0ac6c, 0x00299b75}}}, + {X: Field{[10]uint32{0x01eb3b3c, 0x01ef7085, 0x01c64fd6, 0x00d17372, 0x009ae0a7, 0x0064e0c1, 0x00d3b97b, 0x003d7f1b, 0x0355b499, 0x00023723}}, Y: Field{[10]uint32{0x01435d83, 0x01044679, 0x002f5fa6, 0x00e3211f, 0x02c00ce4, 0x021c8bd2, 0x0354cc38, 0x023f632e, 0x017d62cc, 0x0006f9d1}}}, + {X: Field{[10]uint32{0x018feeec, 0x03586719, 0x0053b1b6, 0x00f6b743, 0x01f12864, 0x018d47d9, 0x0121c4b3, 0x02792df5, 0x0337d1db, 0x000b02dc}}, Y: Field{[10]uint32{0x039bad53, 0x0264016c, 0x02d9ad8b, 0x0254ec20, 0x01ef765b, 0x001f3b85, 0x03dae62c, 0x004867de, 0x039ceb7c, 0x003a289e}}}, + {X: Field{[10]uint32{0x023bab35, 0x001b24f6, 0x00d0e66d, 0x024aed7c, 0x02b17ad6, 0x009052ac, 0x00a0d1d2, 0x001a2692, 0x00a25010, 0x002247ed}}, Y: Field{[10]uint32{0x027260f6, 0x014f8903, 0x00c7c0cb, 0x00399869, 0x0052d06c, 0x00d1fcf2, 0x013c03bc, 0x00f04efa, 0x0166cdf4, 0x00105a14}}}, + {X: Field{[10]uint32{0x01ca1738, 0x027b4eda, 0x03b02ed9, 0x02d87d6e, 0x0039fbcc, 0x0399a3bc, 0x0213729d, 0x01103f9c, 0x01b1511c, 0x00128cde}}, Y: Field{[10]uint32{0x03ac0f6f, 0x00519328, 0x02b0039d, 0x000f505c, 0x0017b3bf, 0x02d133a2, 0x01d75eed, 0x006476a2, 0x01c239e9, 0x002c4a8f}}}, + {X: Field{[10]uint32{0x03815521, 0x01c18697, 0x000d22c5, 0x00f0721e, 0x017dc58e, 0x00efe359, 0x01a360f8, 0x01afe98b, 0x03c85493, 0x002e2ca9}}, Y: Field{[10]uint32{0x02a2d15b, 0x0168f57d, 0x03021c06, 0x00b05f0a, 0x021cd441, 0x014aa26e, 0x02c70012, 0x00d8b096, 0x000b7719, 0x0023e48b}}}, + {X: Field{[10]uint32{0x039624fb, 0x024491f6, 0x03a7ff01, 0x02d88b25, 0x002fb56a, 0x01f3dcea, 0x029341d7, 0x014b941e, 0x0219d1dc, 0x002419bf}}, Y: Field{[10]uint32{0x011baf50, 0x00f9f51c, 0x00896215, 0x02f02aef, 0x00c281f5, 0x02d9e269, 0x01d4929e, 0x0315d760, 0x03436ec3, 0x0008f466}}}, + {X: Field{[10]uint32{0x00ced8ec, 0x00d35d5f, 0x017c2b05, 0x0379b99d, 0x029f32c8, 0x02d6dcfb, 0x01a18df2, 0x03a6c728, 0x014c19c9, 0x002fe6ac}}, Y: Field{[10]uint32{0x029759c0, 0x007c5d03, 0x011dd048, 0x01d756f2, 0x0385e793, 0x00de8ebd, 0x02724188, 0x018f782a, 0x01233c38, 0x003b25a6}}}, + {X: Field{[10]uint32{0x016f9d03, 0x01978d4c, 0x031af102, 0x021ba216, 0x0378c656, 0x023adeab, 0x01b7e69e, 0x01280889, 0x006f9c65, 0x001a2c9a}}, Y: Field{[10]uint32{0x014da9c3, 0x012e06fc, 0x0019af28, 0x035bd3dd, 0x03b6b407, 0x00e49caa, 0x014d4077, 0x009af615, 0x01048468, 0x00074f5d}}}, + {X: Field{[10]uint32{0x010bf2fa, 0x009c00dc, 0x01a7de04, 0x01a6fdef, 0x024d3bf6, 0x00b27cda, 0x00989d39, 0x02886a53, 0x03855251, 0x00083720}}, Y: Field{[10]uint32{0x01aa749f, 0x01d83c25, 0x0224a974, 0x0251588f, 0x03975d67, 0x0182321d, 0x0080c4b3, 0x00ca7fe4, 0x02ff713d, 0x000085f9}}}, + {X: Field{[10]uint32{0x01fd0368, 0x026872ad, 0x01568168, 0x011a6a1d, 0x025c822e, 0x03164612, 0x01859bf8, 0x0266328e, 0x009b555d, 0x003c2fad}}, Y: Field{[10]uint32{0x02664aac, 0x0022d01c, 0x032f53bd, 0x03c05830, 0x002e8ff7, 0x029d74fd, 0x033b3b30, 0x037e52e8, 0x02e7a23d, 0x00383816}}}, + {X: Field{[10]uint32{0x00a0ee57, 0x0168ed71, 0x022cfaab, 0x032b7229, 0x0016ddc1, 0x00b3d311, 0x01ad8abf, 0x03e7ae90, 0x0173270f, 0x0023c6aa}}, Y: Field{[10]uint32{0x015920ec, 0x038c2996, 0x00a87071, 0x02c0ae68, 0x002bd6bb, 0x00bdbae8, 0x02a441f1, 0x026c5ea1, 0x0260e340, 0x00242a8d}}}, + {X: Field{[10]uint32{0x028a9957, 0x0208a0e4, 0x01dfb413, 0x02a02ab2, 0x00fecd43, 0x024d2e20, 0x00ca847a, 0x03051d83, 0x0135278d, 0x0031c7ac}}, Y: Field{[10]uint32{0x02003804, 0x021c57ad, 0x03299a9d, 0x0311f9c6, 0x0351d23a, 0x03b31fdb, 0x0307ad5d, 0x0206e224, 0x03774852, 0x0010599f}}}, + {X: Field{[10]uint32{0x02c41c81, 0x03b5946f, 0x01180b0f, 0x00f6ee87, 0x00fa904d, 0x01259717, 0x0109df5d, 0x01aa7cdf, 0x026e50d6, 0x003a401c}}, Y: Field{[10]uint32{0x01028e39, 0x0317c25c, 0x01d5a921, 0x0095e1ba, 0x03117f77, 0x0371f5ec, 0x00e64f2c, 0x01bd02cd, 0x0230db03, 0x0035482a}}}, + {X: Field{[10]uint32{0x0123fa38, 0x0398ed80, 0x00c3beda, 0x035d3e1f, 0x0258d72d, 0x0083bf79, 0x03a6d6b7, 0x014aa6e8, 0x00afa159, 0x002502ac}}, Y: Field{[10]uint32{0x03bfcbcd, 0x01974a3c, 0x00702f87, 0x03c14f10, 0x016e5061, 0x012445b8, 0x01e443aa, 0x022866e1, 0x03476f78, 0x003fb1b5}}}, + {X: Field{[10]uint32{0x00c76949, 0x00b9c32a, 0x006be8b6, 0x01a81903, 0x02a03ba4, 0x004b1739, 0x033ce9d4, 0x02619937, 0x026d643e, 0x002684f7}}, Y: Field{[10]uint32{0x0126dd5e, 0x000e54da, 0x02499061, 0x00c0bada, 0x01a46016, 0x02f1b2f2, 0x00c914d4, 0x02361e2d, 0x02966c2d, 0x00108e20}}}, + {X: Field{[10]uint32{0x02c577c3, 0x03e0ee9d, 0x01d6f256, 0x0176f782, 0x01b76d6a, 0x035fd8ba, 0x006b1497, 0x00a7652a, 0x01b2b311, 0x0010e10a}}, Y: Field{[10]uint32{0x00bc1c7d, 0x013e4c97, 0x006cd2e4, 0x0261f11b, 0x03b2398e, 0x03a0cef6, 0x03cb600b, 0x026f86cc, 0x0186a722, 0x00390d80}}}, + {X: Field{[10]uint32{0x02d02605, 0x019df1a5, 0x00f018c1, 0x02f9a8ea, 0x03c8bb59, 0x010c03a5, 0x007b524e, 0x01cb97eb, 0x025d66d4, 0x000fd8ec}}, Y: Field{[10]uint32{0x00ca39dd, 0x0257ced4, 0x0249d44c, 0x028bef7d, 0x01d9971a, 0x033fcb1a, 0x0119bbe5, 0x006734af, 0x0042158e, 0x0001161c}}}, + {X: Field{[10]uint32{0x038cc0c5, 0x00d716ae, 0x013d1e17, 0x03b5b3ef, 0x0047afe5, 0x0237b7bc, 0x004f90b9, 0x0294828e, 0x01f717c7, 0x0001987f}}, Y: Field{[10]uint32{0x01a80abd, 0x01c0a4df, 0x02549d99, 0x00cec765, 0x03b83b74, 0x014be083, 0x012f00ea, 0x00386496, 0x003ab43c, 0x002f6689}}}, + {X: Field{[10]uint32{0x02b951ce, 0x0317e256, 0x018cc279, 0x01f1d6f1, 0x000c999d, 0x03a8b532, 0x0027c367, 0x01abdf43, 0x0326daac, 0x002e706e}}, Y: Field{[10]uint32{0x03140f4e, 0x02e1fac6, 0x0138a767, 0x01eed632, 0x01b872d1, 0x03b575fc, 0x026c5b2e, 0x021aedf1, 0x0334a42b, 0x002934ef}}}, + {X: Field{[10]uint32{0x0127e8fa, 0x006fe82c, 0x010999b1, 0x03b2ead7, 0x017d9b23, 0x03bf4aee, 0x02af4733, 0x03676142, 0x00a0fc6c, 0x0033d6b1}}, Y: Field{[10]uint32{0x011070ec, 0x03c5817e, 0x002872ca, 0x01dff521, 0x01ad465d, 0x0298b2bd, 0x03a94fe3, 0x005c601f, 0x0316c37f, 0x00112498}}}, + {X: Field{[10]uint32{0x02b3b422, 0x02191c6f, 0x01b7413c, 0x0286cf0a, 0x03749caa, 0x03c28d3e, 0x0082c57f, 0x028cb8ee, 0x02afab8d, 0x002a94ac}}, Y: Field{[10]uint32{0x000859ce, 0x038fb303, 0x00244ac4, 0x02105b18, 0x03733260, 0x00c8094b, 0x028df35e, 0x0396546d, 0x03284a7b, 0x0012d589}}}, + {X: Field{[10]uint32{0x0068211c, 0x01fc60d2, 0x0217ad34, 0x0159e61c, 0x007926b0, 0x011a25af, 0x032909c5, 0x002342a7, 0x022eb3aa, 0x0001843c}}, Y: Field{[10]uint32{0x0019e6bb, 0x030d5492, 0x006eac1b, 0x01ef09dd, 0x012dbf63, 0x019bb68f, 0x01571e61, 0x0312cc06, 0x010df35f, 0x00294b86}}}, + {X: Field{[10]uint32{0x011a6d80, 0x00f30d31, 0x03b44acc, 0x01690997, 0x02db65f1, 0x025449e5, 0x00543307, 0x02963381, 0x00c3a485, 0x00004fc9}}, Y: Field{[10]uint32{0x03f3bc3b, 0x01261301, 0x02e611a4, 0x01b6c93e, 0x020f0797, 0x03e01cd9, 0x01c4327c, 0x01a7fcf3, 0x03b618e0, 0x003eb32f}}}, + {X: Field{[10]uint32{0x00eb0f24, 0x02176768, 0x02bdf922, 0x03ed0573, 0x01caeb18, 0x008b16a1, 0x00112e69, 0x026ca72c, 0x02a84927, 0x000573af}}, Y: Field{[10]uint32{0x0075d833, 0x03a27e38, 0x00d05821, 0x014a3430, 0x01c36de4, 0x029dec70, 0x01af7ed4, 0x03e6f54e, 0x00fe158f, 0x0008f973}}}, + {X: Field{[10]uint32{0x004d97f6, 0x03721c80, 0x029a55f2, 0x032025bc, 0x02cf92e0, 0x00093586, 0x001b1d60, 0x014d9f71, 0x018efb7d, 0x00098168}}, Y: Field{[10]uint32{0x0266d375, 0x012f5417, 0x022f4f94, 0x0132500b, 0x02fd6d67, 0x002b5bf4, 0x018ae518, 0x02dfb371, 0x0374f111, 0x00235a99}}}, + {X: Field{[10]uint32{0x027f9995, 0x002c172f, 0x0356c33d, 0x004cda52, 0x0225cd05, 0x00d6cd8a, 0x0236d6cd, 0x015bcdfe, 0x0272a787, 0x00396238}}, Y: Field{[10]uint32{0x0072fbb7, 0x015bff55, 0x0191766e, 0x0300341c, 0x02115425, 0x0348f94f, 0x00715c6a, 0x010a5a6e, 0x018320b8, 0x00056fae}}}, + {X: Field{[10]uint32{0x016b46a5, 0x021d436f, 0x00b6ccb9, 0x00e64d16, 0x023a02cc, 0x03de729f, 0x03205cb0, 0x03b716da, 0x0122f264, 0x002000c9}}, Y: Field{[10]uint32{0x011a44a8, 0x01c60ee1, 0x01043bca, 0x03a3530f, 0x02fd2c1d, 0x02aa5c97, 0x038b93b5, 0x007aea63, 0x02f4fb4e, 0x0011e724}}}, + {X: Field{[10]uint32{0x0241bfaa, 0x01a8be85, 0x013f3c16, 0x02dfe45b, 0x0394b525, 0x0084a1f9, 0x0101308a, 0x0206d5c1, 0x000ee1a5, 0x00254301}}, Y: Field{[10]uint32{0x0338ea71, 0x03bc76ed, 0x01a751e4, 0x022370e1, 0x0252441a, 0x01d808de, 0x0171725f, 0x01c29a7c, 0x020e911d, 0x00390f6c}}}, + {X: Field{[10]uint32{0x02c391fa, 0x015402a1, 0x018759db, 0x02f8a0b7, 0x01a634b9, 0x02e2f03d, 0x030aecad, 0x03b95cb9, 0x0336423f, 0x003a267f}}, Y: Field{[10]uint32{0x003a9bd1, 0x01231f2d, 0x02790a02, 0x02432c62, 0x01886117, 0x03e1ea44, 0x03100340, 0x02da3899, 0x03b0dfe6, 0x0001fb65}}}, + {X: Field{[10]uint32{0x00a1a51b, 0x00a972f6, 0x0045e833, 0x034a715e, 0x006a7415, 0x01b867ee, 0x00ce5c76, 0x01adea3e, 0x008f0c20, 0x00348d9a}}, Y: Field{[10]uint32{0x016ec9e9, 0x00170b19, 0x01113adb, 0x021d5486, 0x01d50988, 0x0060ed49, 0x02d65085, 0x012983f9, 0x019fe3d5, 0x001cbc8d}}}, + {X: Field{[10]uint32{0x019dcccf, 0x038be884, 0x0286ae94, 0x017f7709, 0x01430eab, 0x01718a3d, 0x02458c58, 0x00bc920f, 0x0071da4b, 0x00234f5f}}, Y: Field{[10]uint32{0x0361178f, 0x01e3d607, 0x00aad827, 0x000c7d65, 0x021f435c, 0x0191ffc7, 0x039c22ad, 0x03c832f5, 0x00e47948, 0x000cf102}}}, + {X: Field{[10]uint32{0x032651a9, 0x01ff66ed, 0x028a587d, 0x01431585, 0x03fee4b7, 0x034418fe, 0x02542ba5, 0x02066546, 0x037ae891, 0x000c83c4}}, Y: Field{[10]uint32{0x03c402c5, 0x016f3cf4, 0x02232679, 0x0262a317, 0x03086036, 0x014efc00, 0x0275a021, 0x0387bcc8, 0x006ae2a4, 0x002e1015}}}, + {X: Field{[10]uint32{0x0081352c, 0x015df186, 0x020de8ce, 0x01fe691b, 0x027546c8, 0x03519006, 0x01686072, 0x02c967d1, 0x03ce3fe6, 0x0027a2bf}}, Y: Field{[10]uint32{0x029d02f1, 0x01def530, 0x00f9273e, 0x03db14fb, 0x01af8639, 0x01c8d949, 0x00ebaf09, 0x01fdf098, 0x0301d83b, 0x00343a8d}}}, + {X: Field{[10]uint32{0x021eef64, 0x031cacf1, 0x03f539be, 0x03d26b4a, 0x03daf70f, 0x0090487b, 0x03c915ea, 0x00e61ca4, 0x01b81d35, 0x00177d19}}, Y: Field{[10]uint32{0x01e690af, 0x01069eb5, 0x03e54385, 0x01f3ccf0, 0x038b3804, 0x003d1820, 0x00c193d4, 0x03210416, 0x01ff5ae4, 0x000c81b1}}}, + {X: Field{[10]uint32{0x02f28f58, 0x01197523, 0x0064d6e1, 0x00e621a8, 0x011312bb, 0x009ae8f1, 0x0061d488, 0x00d42fd2, 0x0326a18c, 0x00266734}}, Y: Field{[10]uint32{0x00b1ef12, 0x02244772, 0x00b0dd41, 0x02c2fa21, 0x00a9fcea, 0x02554582, 0x018e6629, 0x0337d9e6, 0x032ad6dc, 0x000b362a}}}, + {X: Field{[10]uint32{0x03ce163b, 0x02c09ada, 0x034cdc0a, 0x019d1d86, 0x03479a66, 0x01551832, 0x02ba6f42, 0x02705be8, 0x00ee574d, 0x0020763f}}, Y: Field{[10]uint32{0x00673143, 0x02d2b166, 0x00ca638c, 0x03f3f5f2, 0x003cf771, 0x0169a605, 0x039a996f, 0x01e9a8ed, 0x0334f589, 0x0016539f}}}, + {X: Field{[10]uint32{0x0096d278, 0x01b610f4, 0x020dd4da, 0x027b254e, 0x0385839c, 0x01be1460, 0x032b42d5, 0x01cefbe4, 0x0324b9ac, 0x0027a0f5}}, Y: Field{[10]uint32{0x00c88869, 0x03e9788c, 0x01689a1a, 0x00029287, 0x0100d3a0, 0x03125bb1, 0x02fda95a, 0x016b2e27, 0x00abfed0, 0x003e2c63}}}, + {X: Field{[10]uint32{0x02320c3e, 0x0244510f, 0x0231764f, 0x00ecd6ea, 0x01908ec3, 0x00ecb640, 0x00b1f647, 0x00f022bb, 0x00b13b44, 0x00262e8e}}, Y: Field{[10]uint32{0x0399b84f, 0x0075808f, 0x020a44df, 0x01e8d0d2, 0x010d8ece, 0x01bd0bd2, 0x012f972e, 0x00cbefd7, 0x01d7fc22, 0x000d0fd8}}}, + {X: Field{[10]uint32{0x02a875ec, 0x00120194, 0x01285de7, 0x01ef9b0d, 0x01582244, 0x03a5c19c, 0x03a94886, 0x017bb169, 0x025a9adf, 0x000824ba}}, Y: Field{[10]uint32{0x024e7f35, 0x02b71efa, 0x0228f304, 0x03099650, 0x0195a7e9, 0x00985998, 0x00facc8e, 0x009c8aa5, 0x02eb5238, 0x00377edc}}}, + {X: Field{[10]uint32{0x02eeb75a, 0x00c13080, 0x01e765b9, 0x00e65687, 0x00c044c6, 0x02f25d04, 0x037bce4e, 0x02817ab1, 0x009a8f45, 0x003e7ba4}}, Y: Field{[10]uint32{0x0301705e, 0x03b93b84, 0x01d51a41, 0x034df8ba, 0x023a39c0, 0x02babc4f, 0x03e50fd2, 0x02c3a11c, 0x01ba93f5, 0x0021840c}}}, + {X: Field{[10]uint32{0x01df101c, 0x03394d4d, 0x00603c75, 0x009f18fa, 0x015c676e, 0x03baa6fe, 0x002dfc02, 0x0169f2cd, 0x00e23bc5, 0x00284e1e}}, Y: Field{[10]uint32{0x03108427, 0x03ffe09e, 0x02ed001b, 0x0214d71c, 0x02233f05, 0x034fa069, 0x02a2f833, 0x02c24424, 0x02d03d4b, 0x000d7033}}}, + {X: Field{[10]uint32{0x004ae3e4, 0x01ec6d84, 0x0065d34f, 0x03e0e9c6, 0x03b863a7, 0x02760300, 0x004cfce0, 0x037f61ca, 0x01d2cd32, 0x003a3b20}}, Y: Field{[10]uint32{0x0017648b, 0x009c89c1, 0x01e4ec6e, 0x03a2c219, 0x011d24c4, 0x0145eff2, 0x032b01af, 0x0375ffd4, 0x0377ee12, 0x00182fa6}}}, + {X: Field{[10]uint32{0x00f35b60, 0x00ae2607, 0x0297a664, 0x0261a6e6, 0x00d48e98, 0x013818e4, 0x030b18fe, 0x03710cd1, 0x02551529, 0x003c1f2c}}, Y: Field{[10]uint32{0x0223b550, 0x00a5e9b0, 0x03d2b0a3, 0x00856544, 0x01c6e854, 0x0388d56a, 0x034b9412, 0x018cf566, 0x03776d74, 0x002f51ba}}}, + {X: Field{[10]uint32{0x02af7f51, 0x022136ae, 0x03dd82fe, 0x00fcbcb2, 0x0242becd, 0x02982e0d, 0x03189ae0, 0x02a7c2a5, 0x0023dcfd, 0x000e6f39}}, Y: Field{[10]uint32{0x022c8e4d, 0x01e2ec7a, 0x01a2b2db, 0x03a0525e, 0x01f3430b, 0x00c0fb24, 0x00903127, 0x008679d1, 0x00aa4b71, 0x00305667}}}, + {X: Field{[10]uint32{0x029ad3cf, 0x03f44147, 0x00ec80e0, 0x019f3cb6, 0x0358142f, 0x00f2793f, 0x033de211, 0x02e05062, 0x01cbd51d, 0x001b6984}}, Y: Field{[10]uint32{0x001e4b7f, 0x01e3fcc1, 0x00d704d1, 0x01a0b867, 0x02f7fe55, 0x02c0d203, 0x03d494eb, 0x03d953f6, 0x00483250, 0x001af0bc}}}, + {X: Field{[10]uint32{0x031aed8a, 0x0327eee2, 0x00c709a3, 0x011de51c, 0x01f4e13a, 0x029fa571, 0x00a5e8ef, 0x003ae629, 0x00038d2e, 0x0033b6e7}}, Y: Field{[10]uint32{0x019a0d40, 0x01ab5361, 0x028feeca, 0x0297dfd7, 0x0046804f, 0x034213d0, 0x00d5d56e, 0x0362f208, 0x0131de42, 0x001e68bf}}}, + {X: Field{[10]uint32{0x01ae3d82, 0x01e841c1, 0x02d8a3a0, 0x02134037, 0x0225393f, 0x01b107f9, 0x0340458f, 0x001b40cb, 0x00986d11, 0x001f6255}}, Y: Field{[10]uint32{0x026d0d61, 0x03561a86, 0x01866ee7, 0x030ac842, 0x02edd110, 0x0382b783, 0x02a117c7, 0x01652d86, 0x02cfff1c, 0x001753ed}}}, + {X: Field{[10]uint32{0x03dc3df7, 0x000310f5, 0x01aa175a, 0x01431ba7, 0x00851aaf, 0x00fb3b18, 0x01e26069, 0x010ebfac, 0x01627370, 0x00293ca4}}, Y: Field{[10]uint32{0x039c4439, 0x009a0871, 0x00846b27, 0x01ef118a, 0x0392265d, 0x0116abb4, 0x03abb201, 0x012c54e3, 0x00e8fb76, 0x002fbaff}}}, + {X: Field{[10]uint32{0x011cab70, 0x0058bc3e, 0x000a29cb, 0x01959a03, 0x00e0ba81, 0x01a26ef3, 0x00ce964e, 0x032c23b0, 0x01acde4c, 0x002d8e27}}, Y: Field{[10]uint32{0x00303529, 0x00103294, 0x02cdd679, 0x029fbbf6, 0x039ee836, 0x0238c7f9, 0x032826d2, 0x0091d05e, 0x03dbd2d0, 0x00391031}}}, + {X: Field{[10]uint32{0x02fcc9e1, 0x022bbefd, 0x00b4927b, 0x005a6673, 0x01ae4ee0, 0x03bbcdfd, 0x00ac2d6a, 0x030dbe5e, 0x01acf752, 0x001cb39b}}, Y: Field{[10]uint32{0x039bbca6, 0x017c43b5, 0x03bc67c4, 0x03379e5a, 0x028ad38a, 0x0380409f, 0x00c6d4d5, 0x01100f58, 0x0297bbd8, 0x00339ab0}}}, + {X: Field{[10]uint32{0x00255f06, 0x004e119b, 0x0117531b, 0x02b43e2b, 0x014fb3e5, 0x01af1430, 0x00931faa, 0x01096958, 0x036fcfd7, 0x003beb4c}}, Y: Field{[10]uint32{0x015a82c0, 0x008ba3f8, 0x0203b2b4, 0x00251064, 0x039eab6b, 0x00605c58, 0x03ab5597, 0x026847b1, 0x00f4eeee, 0x000fede1}}}, + {X: Field{[10]uint32{0x034eaae3, 0x0177ac80, 0x0349c289, 0x01b3ce0a, 0x0322002c, 0x00e4f295, 0x034bd1f0, 0x008599f1, 0x022d04bb, 0x003e6352}}, Y: Field{[10]uint32{0x016fd148, 0x01b3116d, 0x0269e9a3, 0x022b59a7, 0x0297a26f, 0x01851f2e, 0x0350763c, 0x01e2a0d1, 0x031f7e37, 0x00261d78}}}, + {X: Field{[10]uint32{0x0134183f, 0x02251832, 0x02eafb0b, 0x0079961d, 0x012b0d16, 0x02b04fb4, 0x01eea342, 0x0108ccb1, 0x034d2bc2, 0x001da33d}}, Y: Field{[10]uint32{0x02fdc34e, 0x0003e9e8, 0x022654ba, 0x00cb9cb9, 0x00af083b, 0x0341a954, 0x02e9f72d, 0x0135ebe1, 0x0207e55b, 0x00108cdd}}}, + {X: Field{[10]uint32{0x01beff7b, 0x0049d369, 0x01c59979, 0x01b88949, 0x03d34cfb, 0x02a45b42, 0x01ec27aa, 0x03189645, 0x03b01d05, 0x002b09bc}}, Y: Field{[10]uint32{0x014f4045, 0x033b37fa, 0x0254a42f, 0x01dae2f7, 0x01a30055, 0x03afac66, 0x0113bcb1, 0x005a0746, 0x00ac89b6, 0x0038d9d8}}}, + {X: Field{[10]uint32{0x0374fbac, 0x0263cd07, 0x01285212, 0x00368234, 0x02fcd905, 0x02c10a8e, 0x025045e1, 0x002f8b99, 0x0181741a, 0x0036b750}}, Y: Field{[10]uint32{0x00a84f60, 0x01b80339, 0x0002b805, 0x02f2a40a, 0x03f6a4df, 0x018d5d39, 0x01e4e2c8, 0x03741098, 0x03e0da78, 0x001b3d1b}}}, + {X: Field{[10]uint32{0x0286a3e8, 0x0342ae46, 0x00f82a6f, 0x03aa46a2, 0x032c4e1e, 0x010fc6dc, 0x03139ed1, 0x01aa18be, 0x0198ce9e, 0x00395945}}, Y: Field{[10]uint32{0x01f1ac98, 0x03bf6cbc, 0x0221a9e9, 0x022b55a6, 0x000770fd, 0x03d357db, 0x01723d8f, 0x01b04042, 0x033669ab, 0x002ed084}}}, + {X: Field{[10]uint32{0x030f5b02, 0x03922b89, 0x03d65de9, 0x02dc3730, 0x032d47a2, 0x0007b8ea, 0x0369b454, 0x03d658e6, 0x011eb4f0, 0x003c9bde}}, Y: Field{[10]uint32{0x030ff699, 0x026f02d1, 0x004fbe1a, 0x02458cea, 0x002693c5, 0x02915d5f, 0x003c799e, 0x02efc946, 0x03251fe5, 0x0008b8d2}}}, + {X: Field{[10]uint32{0x023da9da, 0x0379a398, 0x018ac19f, 0x008a76de, 0x032d2bec, 0x02137628, 0x01da048a, 0x00bd21ea, 0x010b9561, 0x0029433c}}, Y: Field{[10]uint32{0x03dcc576, 0x020554c2, 0x02888e4c, 0x033730f7, 0x00ce345e, 0x03358166, 0x039f9f47, 0x02899076, 0x013c0a76, 0x0014041f}}}, + {X: Field{[10]uint32{0x0245c13c, 0x025fc6c2, 0x00c10a11, 0x02ad7b17, 0x03e917e5, 0x0205f2e6, 0x0386a5c1, 0x01b06f57, 0x03b90273, 0x0031d220}}, Y: Field{[10]uint32{0x008beedc, 0x03d2f44b, 0x0232e847, 0x01570ade, 0x01d1c2bd, 0x003a89d6, 0x013e73b6, 0x00f3fc35, 0x03bce739, 0x00380f10}}}, + {X: Field{[10]uint32{0x01e1c0a9, 0x03fa0002, 0x02e9c98d, 0x02937400, 0x01be7cad, 0x00a78b23, 0x005c00f6, 0x03b622ec, 0x03d01741, 0x00028d0d}}, Y: Field{[10]uint32{0x007bca1c, 0x0181c4e1, 0x01c9ed21, 0x019c2ed0, 0x00fc268e, 0x0134fbbe, 0x01a00afa, 0x032af47f, 0x005a257f, 0x002989f8}}}, + {X: Field{[10]uint32{0x01c8312d, 0x027fe8e6, 0x03093832, 0x01dc128f, 0x0090c00c, 0x00c1a1bf, 0x018ba895, 0x02ead37a, 0x0188f179, 0x0029b312}}, Y: Field{[10]uint32{0x0170b6df, 0x03fd1d67, 0x01643712, 0x03bd3d84, 0x01bbba86, 0x004d191c, 0x03cad7c1, 0x0169e4a6, 0x00737db2, 0x003d3ae9}}}, + {X: Field{[10]uint32{0x00b84dbe, 0x0286b29c, 0x02f2400d, 0x020c4e4d, 0x039e6801, 0x03286af8, 0x03330776, 0x02355ecc, 0x00a8f577, 0x0003becd}}, Y: Field{[10]uint32{0x03428d3f, 0x00a61e1f, 0x025952f0, 0x0328526c, 0x027e5845, 0x019d4dae, 0x00878e71, 0x03ea60c8, 0x016efc53, 0x002a5288}}}, + {X: Field{[10]uint32{0x00dfa07a, 0x017ef5bf, 0x01a94a2c, 0x02e0fe91, 0x03019ec3, 0x021fee6a, 0x03914ef4, 0x039aeec8, 0x02d81385, 0x0004e611}}, Y: Field{[10]uint32{0x00fce099, 0x0132f1ab, 0x02aa09c3, 0x02cba325, 0x0362d837, 0x0237f682, 0x01f6aff2, 0x004336a6, 0x004e599b, 0x0013edf3}}}, + {X: Field{[10]uint32{0x01f2a101, 0x02336aeb, 0x01bb7a53, 0x00284ca6, 0x0249c209, 0x02d4fa98, 0x01f6eeaa, 0x0159ea0f, 0x03af98ba, 0x00198248}}, Y: Field{[10]uint32{0x0094bd29, 0x003c3623, 0x0078d446, 0x021a5c55, 0x00ee2a56, 0x0118bd10, 0x01890ee8, 0x025c89a6, 0x00cab1a2, 0x002ca2d6}}}, + {X: Field{[10]uint32{0x012be3c6, 0x000e243d, 0x01a98d3e, 0x03430772, 0x02d2f86b, 0x00698d16, 0x0389d31f, 0x005f78fc, 0x02b58c75, 0x003c6024}}, Y: Field{[10]uint32{0x00f9c906, 0x02a6bf5a, 0x006d07e8, 0x018ca8db, 0x00440ca7, 0x00ec0c87, 0x00276973, 0x013b5df7, 0x02049148, 0x002a0f9e}}}, + {X: Field{[10]uint32{0x01d0ab75, 0x03844e20, 0x03f74bfe, 0x019d9233, 0x017b7004, 0x02d7eca5, 0x026a6e25, 0x01503ce2, 0x020d1b2c, 0x003a342a}}, Y: Field{[10]uint32{0x0314409a, 0x02ee2af4, 0x016e9f19, 0x032ffaa9, 0x021abfc0, 0x022a0260, 0x00c3f298, 0x01706f43, 0x03be5205, 0x0028c932}}}, + {X: Field{[10]uint32{0x03526c1a, 0x00b7f11b, 0x025f3c7d, 0x00b540c0, 0x021d8ee7, 0x007dd18f, 0x01613df5, 0x001d0c3e, 0x00c0230a, 0x000961a8}}, Y: Field{[10]uint32{0x0016c735, 0x000eb026, 0x02653ede, 0x02891d01, 0x03ce9b1d, 0x02143d70, 0x007b4694, 0x011c350f, 0x01a1eb2b, 0x0028a5cd}}}, + {X: Field{[10]uint32{0x037dffd8, 0x032ad099, 0x00e48a12, 0x015390b0, 0x018be682, 0x0375f23d, 0x01bb2d27, 0x01b51b0c, 0x02888d82, 0x00085f3e}}, Y: Field{[10]uint32{0x001ac4ce, 0x025adab0, 0x031a006d, 0x015fd204, 0x0134179c, 0x02be477b, 0x01f99017, 0x03ec540d, 0x00309ff0, 0x00135767}}}, + {X: Field{[10]uint32{0x02edf4c0, 0x00e8d4c6, 0x03ccb820, 0x02fc4035, 0x03943af3, 0x00df3f59, 0x02791eb0, 0x00ee3e79, 0x013471aa, 0x0013a996}}, Y: Field{[10]uint32{0x00b7b4c5, 0x004a6121, 0x02ca506c, 0x00d3222f, 0x03ded8a5, 0x03257a65, 0x00474035, 0x000b1160, 0x02c419a3, 0x003fbb66}}}, + {X: Field{[10]uint32{0x00c7a1ae, 0x02b09346, 0x01f7d4fa, 0x03cb2591, 0x007d7759, 0x0125fbaf, 0x0122150c, 0x01aa93a9, 0x028b5102, 0x0025d2e0}}, Y: Field{[10]uint32{0x03aa9d26, 0x0063fb53, 0x0109396d, 0x000ff2c1, 0x0165cd3a, 0x02a07c98, 0x026f344c, 0x01ccd895, 0x01a0c308, 0x00300da7}}}, + {X: Field{[10]uint32{0x00978186, 0x031c25a7, 0x01755529, 0x0113b475, 0x0299bb45, 0x033d16cd, 0x01c8ae93, 0x035e9653, 0x0379d572, 0x00366056}}, Y: Field{[10]uint32{0x035241fa, 0x038d62b9, 0x013ecd67, 0x036193b5, 0x035b6c20, 0x0023e99f, 0x00ea24f5, 0x006552b1, 0x02cbf518, 0x0027f3ae}}}, + {X: Field{[10]uint32{0x00368837, 0x00acc3ae, 0x02d38efd, 0x02f7e7da, 0x01478208, 0x03596ab0, 0x01506f1b, 0x03539f2f, 0x01970d9b, 0x00149c49}}, Y: Field{[10]uint32{0x033df18e, 0x008c98a2, 0x01d79aef, 0x03044b5b, 0x0068bbf0, 0x014da004, 0x00911d16, 0x03b2b668, 0x0196ba2c, 0x0014bb2a}}}, + {X: Field{[10]uint32{0x009abf6d, 0x01577a11, 0x018186af, 0x0278ae2b, 0x00ed2fc8, 0x022a3d3a, 0x030e1fee, 0x03d7e7bd, 0x01afd890, 0x0036508c}}, Y: Field{[10]uint32{0x019e2867, 0x01195248, 0x01e27e06, 0x03d23343, 0x0384278f, 0x00b61972, 0x03475fc3, 0x0248609c, 0x036ef078, 0x0009964a}}}, + {X: Field{[10]uint32{0x019a7d90, 0x00a2936a, 0x034bfe53, 0x02c1c534, 0x02b661f7, 0x01d8fae6, 0x03a99d4b, 0x036558ec, 0x02317a69, 0x00192144}}, Y: Field{[10]uint32{0x01d46bc6, 0x024828d4, 0x02fb4af4, 0x02cde048, 0x021e06d3, 0x028fa485, 0x02020885, 0x01038dbe, 0x02335150, 0x003ac82e}}}, + {X: Field{[10]uint32{0x0368a8c2, 0x00e0473b, 0x0021779c, 0x037c3b80, 0x0370df9e, 0x03018959, 0x03413a5f, 0x00bc5e63, 0x011bef66, 0x0034292c}}, Y: Field{[10]uint32{0x0170b9cd, 0x00a7dd37, 0x00dbe8b3, 0x018ffd35, 0x03748b7a, 0x02ace7ba, 0x00ef5c99, 0x01a5170e, 0x012018e1, 0x00352ee6}}}, + {X: Field{[10]uint32{0x005802b6, 0x001fc1a6, 0x0249b3dc, 0x00dcef54, 0x01dcf546, 0x032f5dac, 0x03e103dd, 0x0121a07e, 0x0086c4b2, 0x0007626e}}, Y: Field{[10]uint32{0x0369535d, 0x0024e7d8, 0x01f3030d, 0x01150af3, 0x02a7885a, 0x00e9c31a, 0x036056ba, 0x00415df8, 0x00caaacd, 0x0028ce73}}}, + {X: Field{[10]uint32{0x00dbb256, 0x01d72cb9, 0x036c010a, 0x008efac2, 0x039dbab2, 0x00e2e82d, 0x036682fa, 0x010f93c4, 0x01d59363, 0x002db3b3}}, Y: Field{[10]uint32{0x019f7be8, 0x0236c0cc, 0x01d583ba, 0x00ba090b, 0x025f77d1, 0x03604d99, 0x01a5d1fe, 0x021e896f, 0x005387dd, 0x000a4d70}}}, + {X: Field{[10]uint32{0x032f8e24, 0x02ba942f, 0x002c4028, 0x0244261a, 0x0040f1b4, 0x03d6065a, 0x00a6c5fb, 0x03611cd7, 0x00e0a0ca, 0x00212c91}}, Y: Field{[10]uint32{0x021f7a71, 0x0226b221, 0x021bad82, 0x018b6837, 0x03148c8e, 0x038e9762, 0x0313087e, 0x002c47d5, 0x028c7df8, 0x0018b8a3}}}, + {X: Field{[10]uint32{0x00114d1a, 0x037db073, 0x036d1638, 0x01650ffa, 0x01664331, 0x038ddf10, 0x00366102, 0x0200a0e5, 0x00ff2a90, 0x003e57b3}}, Y: Field{[10]uint32{0x0158eba2, 0x00e34af9, 0x039ca7de, 0x020586d3, 0x0256d16e, 0x022615bb, 0x011b9ea1, 0x001b36e3, 0x003f1a03, 0x002f436a}}}, + {X: Field{[10]uint32{0x010f55e3, 0x03bcc874, 0x0132727f, 0x00d79043, 0x032a1e63, 0x0268b748, 0x02ccd255, 0x00f792bc, 0x01fd3e61, 0x001f133b}}, Y: Field{[10]uint32{0x03d7b1d8, 0x030893b9, 0x026960cd, 0x01f504c1, 0x0111d482, 0x01ca9983, 0x017f73c6, 0x0014db1a, 0x0109d9d0, 0x000cc7c8}}}, + {X: Field{[10]uint32{0x00269713, 0x03dc80e8, 0x021c34b9, 0x019bb4c6, 0x02f88af8, 0x010d789d, 0x03918de0, 0x0360a792, 0x02381bf2, 0x0008d70b}}, Y: Field{[10]uint32{0x00dbf929, 0x00413be8, 0x03d0ff26, 0x00111803, 0x02815a13, 0x013aaa1e, 0x00486144, 0x0024bb9f, 0x030d2671, 0x00143737}}}, + {X: Field{[10]uint32{0x0207cd73, 0x00a1a0fa, 0x02923761, 0x021b1777, 0x000cdf26, 0x007128e2, 0x03ca488d, 0x0025d545, 0x00d09ab5, 0x000aa587}}, Y: Field{[10]uint32{0x0398abe5, 0x024efa48, 0x0152dd7f, 0x00bbb75d, 0x0384f84c, 0x01d951c8, 0x000f7fde, 0x011b48f3, 0x0076b2ee, 0x00217244}}}, + {X: Field{[10]uint32{0x00fd65e3, 0x023d0393, 0x01b51a62, 0x01d424f4, 0x03e00c47, 0x02fc60fd, 0x013f591c, 0x02e32e1c, 0x0091f0af, 0x002562f1}}, Y: Field{[10]uint32{0x009a65b3, 0x01431a82, 0x02eef92d, 0x01eaba3d, 0x01b2a09a, 0x03c1d868, 0x013e026a, 0x037f9244, 0x0339fa21, 0x002fd6f8}}}, + {X: Field{[10]uint32{0x015f78fd, 0x0196f60f, 0x0273ddc8, 0x03319093, 0x030adb5c, 0x01adfa54, 0x035a2e24, 0x01eafe67, 0x00a37b5b, 0x001ba583}}, Y: Field{[10]uint32{0x025e0e15, 0x0166cd5a, 0x01a81bd6, 0x02ca7335, 0x00dcc4b0, 0x0285bf32, 0x02df612e, 0x0190fd7c, 0x03d1d5e9, 0x0014eb52}}}, + {X: Field{[10]uint32{0x00d05871, 0x03b3a3fc, 0x01b5a8b2, 0x029e9237, 0x00e747e4, 0x036475aa, 0x01615257, 0x02eeb776, 0x020e9272, 0x0035eb24}}, Y: Field{[10]uint32{0x00c87ed8, 0x019b893c, 0x02dc4adf, 0x008186d9, 0x039d4c76, 0x00302630, 0x000b96d0, 0x02b178e3, 0x01fcc37b, 0x0018e06e}}}, + {X: Field{[10]uint32{0x01730609, 0x00754c57, 0x00078b6c, 0x00bfcb67, 0x024481c1, 0x02fa506b, 0x0123844e, 0x015c1bb0, 0x003b1de9, 0x00026c20}}, Y: Field{[10]uint32{0x033fb1b0, 0x00258a9a, 0x03ef2f5f, 0x02ec4f30, 0x005a5ff0, 0x0392e007, 0x002ed01f, 0x03f7f3ab, 0x03d6b12a, 0x0005833c}}}, + {X: Field{[10]uint32{0x00c5fd88, 0x0154ef29, 0x033ea689, 0x0027c08b, 0x02991bd5, 0x02e81085, 0x00e0153a, 0x03801a77, 0x006e5b74, 0x0017541d}}, Y: Field{[10]uint32{0x03259ff8, 0x018462da, 0x00e58927, 0x01bedbb4, 0x0299cb33, 0x00a724ad, 0x03a2e484, 0x012c6ef6, 0x005fd2a1, 0x002c3ec8}}}, + {X: Field{[10]uint32{0x00be04ff, 0x0006a17f, 0x02cf0bbd, 0x02af1a1b, 0x01ef4483, 0x0180230b, 0x03087483, 0x018a7249, 0x0269fa27, 0x00386f09}}, Y: Field{[10]uint32{0x00d95ecf, 0x0027e103, 0x00e783d4, 0x0124efb6, 0x0315e8b1, 0x02ce86ca, 0x033fd435, 0x00248585, 0x0371083c, 0x001bedeb}}}, + {X: Field{[10]uint32{0x00bfbf78, 0x003732f6, 0x017a2fe9, 0x00833dc0, 0x02f36ac6, 0x037e873c, 0x00519797, 0x024f6d03, 0x001cb5a8, 0x0033f242}}, Y: Field{[10]uint32{0x02a69ac2, 0x00a6b9a5, 0x01659b5f, 0x00695713, 0x00db321d, 0x026fe05f, 0x0377c15a, 0x00bf0cbc, 0x01235077, 0x0009aa23}}}, + {X: Field{[10]uint32{0x0229bb9b, 0x03677d08, 0x014b05fa, 0x01621163, 0x00cd8ad1, 0x0263b5e3, 0x021246db, 0x01a314e5, 0x009d12bd, 0x00015367}}, Y: Field{[10]uint32{0x021cbff6, 0x01275db7, 0x025eba45, 0x00161248, 0x00f8de70, 0x034cf5f5, 0x00c961fe, 0x0089658c, 0x00311dec, 0x002d7a5f}}}, + {X: Field{[10]uint32{0x03057dff, 0x02d694d0, 0x002e8d64, 0x02a987f9, 0x02bfb11e, 0x01cd71ec, 0x00f19248, 0x01986740, 0x02e67e9d, 0x0022a453}}, Y: Field{[10]uint32{0x03c040c8, 0x0046b0c6, 0x01b05a63, 0x011a8bd6, 0x0199c518, 0x00a9be94, 0x002f018c, 0x0369262f, 0x01da3374, 0x0006e478}}}, + {X: Field{[10]uint32{0x00240522, 0x02c16574, 0x03b030a0, 0x010bef48, 0x00aa2f4c, 0x026ac2ae, 0x0304fbae, 0x0077eaf1, 0x01773e64, 0x00352e04}}, Y: Field{[10]uint32{0x025cc726, 0x03ef8159, 0x007b8ce6, 0x00d405c4, 0x01cf2e68, 0x003d037c, 0x01bd3642, 0x02853d29, 0x023b1ea4, 0x002b0c33}}}, + {X: Field{[10]uint32{0x00780ba9, 0x00999c05, 0x02004362, 0x00b9cb83, 0x006f3c8e, 0x024927d9, 0x002c3517, 0x00d5f2ee, 0x0387c232, 0x002e0429}}, Y: Field{[10]uint32{0x018319e2, 0x036eec05, 0x02ef76a2, 0x00c3c6de, 0x034a422c, 0x02af2119, 0x02bac769, 0x0375fc85, 0x00341078, 0x00150d90}}}, + {X: Field{[10]uint32{0x0134a833, 0x01cb4ffd, 0x00e0d14e, 0x00b63b1f, 0x00d29c76, 0x00e9fbb4, 0x01691eac, 0x023bdc6b, 0x00cedc73, 0x0035c7e2}}, Y: Field{[10]uint32{0x00fbcd99, 0x0139c583, 0x02ad9d2a, 0x0052570e, 0x0197c1b5, 0x02d31449, 0x019d0d97, 0x02b6ba8b, 0x02831aaa, 0x00291f33}}}, + {X: Field{[10]uint32{0x01147ffc, 0x02675c5b, 0x0217496c, 0x00b331b1, 0x011ad709, 0x018b3978, 0x01d9d896, 0x018a384e, 0x031d4cac, 0x0005c33c}}, Y: Field{[10]uint32{0x006d77a5, 0x02977b33, 0x013a46f9, 0x03b9a549, 0x01adf6c4, 0x0377cc46, 0x01e8baaa, 0x03d61405, 0x0094e741, 0x0013ecee}}}, + {X: Field{[10]uint32{0x00c316af, 0x0269913b, 0x034d3172, 0x01250216, 0x03bfd48d, 0x032e6956, 0x00cbf66e, 0x017a00e3, 0x02a3b127, 0x00239da4}}, Y: Field{[10]uint32{0x00c504b1, 0x02ad501a, 0x0241134c, 0x029ae291, 0x024fc0bf, 0x0399aa46, 0x0100665c, 0x01497899, 0x01d3af07, 0x003cce70}}}, + {X: Field{[10]uint32{0x02ca891a, 0x032fbe92, 0x00d40a27, 0x01a79da1, 0x02a07ca8, 0x038addf3, 0x0047002e, 0x017a04cb, 0x03383dda, 0x001747fc}}, Y: Field{[10]uint32{0x035fbb8b, 0x0246006f, 0x039cf5b0, 0x00ce34a5, 0x02fe8438, 0x01d31145, 0x032e62e0, 0x032f6d9d, 0x03acb0de, 0x00286b6c}}}, + {X: Field{[10]uint32{0x002b8af7, 0x03fdbb0f, 0x003ebd75, 0x01717d50, 0x00375e1c, 0x00deb556, 0x032605da, 0x0319af77, 0x03dda9de, 0x003559b3}}, Y: Field{[10]uint32{0x019c78bd, 0x02b78398, 0x01ed8427, 0x035efedd, 0x00b6007b, 0x016a4293, 0x01598bb2, 0x01b6a5d0, 0x032c7858, 0x0004f888}}}, + {X: Field{[10]uint32{0x03d96493, 0x0265f40b, 0x01e33764, 0x03389271, 0x033cb85b, 0x02e7b8f6, 0x01ae74b2, 0x00ebc666, 0x00f9cc71, 0x0032f5c2}}, Y: Field{[10]uint32{0x004cb2cb, 0x03e499da, 0x026d655c, 0x02fdae01, 0x01c264f4, 0x02276376, 0x037a5af8, 0x02c2e24c, 0x016c4ca9, 0x003c0687}}}, + {X: Field{[10]uint32{0x00ed0fe2, 0x02d6e8fc, 0x013f4ad4, 0x02e3e241, 0x03e8d049, 0x014e003c, 0x020bea21, 0x01cf2208, 0x00e4e8ac, 0x003fb87b}}, Y: Field{[10]uint32{0x0226aad6, 0x015a8bba, 0x0154f53d, 0x02c2f6c2, 0x02f9763d, 0x033d0bda, 0x013354a7, 0x0019028d, 0x00ea17c8, 0x0026d482}}}, + {X: Field{[10]uint32{0x02ee843f, 0x0122f251, 0x01dbb79c, 0x00cc5305, 0x01db916f, 0x032cd6a3, 0x03a6c3af, 0x01214e35, 0x0266de44, 0x0031aabe}}, Y: Field{[10]uint32{0x01505b1b, 0x02bceff4, 0x01bfa7cd, 0x016cc2c4, 0x0234c49d, 0x029b893e, 0x001a7617, 0x0243def2, 0x02b67fc5, 0x00229871}}}, + {X: Field{[10]uint32{0x01aac415, 0x0199e076, 0x02f1e0a8, 0x03ffc017, 0x02dcbe21, 0x0199aef3, 0x018551e7, 0x007df922, 0x016083d9, 0x002b0d45}}, Y: Field{[10]uint32{0x0334483d, 0x01f59804, 0x014945ac, 0x002e369b, 0x03557741, 0x03bb2289, 0x00318fbe, 0x026beca3, 0x01977710, 0x0035c276}}}, + {X: Field{[10]uint32{0x01914e18, 0x01a3dc8f, 0x02ef9219, 0x00d25419, 0x017a212e, 0x00eb013d, 0x0055d199, 0x0092d205, 0x021607c0, 0x002a2709}}, Y: Field{[10]uint32{0x03a3c1ab, 0x00867b84, 0x02199ac8, 0x01a10cf7, 0x013569ce, 0x03b636ac, 0x01f092f5, 0x0219b1df, 0x02626127, 0x0015474d}}}, + {X: Field{[10]uint32{0x00a3f06b, 0x02202347, 0x02a3a72e, 0x016bf491, 0x02b045b9, 0x03ee458b, 0x00018d8c, 0x0267aba5, 0x031db584, 0x00265460}}, Y: Field{[10]uint32{0x01e4d773, 0x021ec5b6, 0x01188fd4, 0x02856c34, 0x0081696e, 0x02ce1202, 0x0027146f, 0x03e19f56, 0x02ecb9d5, 0x003f8e6b}}}, + {X: Field{[10]uint32{0x001fba96, 0x009a489a, 0x02e8c78d, 0x03a4df34, 0x028615e2, 0x007b3af1, 0x01be26c6, 0x01111e55, 0x03e01456, 0x002dc785}}, Y: Field{[10]uint32{0x03b9e3bf, 0x007142d8, 0x03dc4301, 0x02a7324a, 0x031a6c5b, 0x03bfa554, 0x023cb224, 0x02e32e57, 0x01f1d21f, 0x003af3f7}}}, + {X: Field{[10]uint32{0x01914074, 0x020fff05, 0x002c22d6, 0x03b5399d, 0x032fe89f, 0x030f52f2, 0x020ef6a1, 0x027fdb51, 0x001edbdd, 0x00385c3e}}, Y: Field{[10]uint32{0x0396e67f, 0x019f9caa, 0x014d2d6f, 0x03af1f7c, 0x03801fa7, 0x03dbe72b, 0x02206e3d, 0x0072b233, 0x00ee0f97, 0x0024fc44}}}, + {X: Field{[10]uint32{0x02c104f2, 0x01757207, 0x00c73acf, 0x02291f73, 0x014ac8dd, 0x007eaeec, 0x00f04eda, 0x0017157b, 0x0147318d, 0x0010c695}}, Y: Field{[10]uint32{0x03a779e7, 0x0022fcaf, 0x00dea6fd, 0x01c1d72a, 0x027a6f1f, 0x01f2a09e, 0x03a1f045, 0x0068d92b, 0x00ad7b14, 0x000f8c62}}}, + {X: Field{[10]uint32{0x02203394, 0x03ffb098, 0x01eec383, 0x0245fc2d, 0x013c1932, 0x007e032c, 0x0226ce4a, 0x01d48caf, 0x026ee158, 0x000a679a}}, Y: Field{[10]uint32{0x01301575, 0x00a9df81, 0x010c93bb, 0x0393b4de, 0x0123c9b3, 0x03002815, 0x008e8bf4, 0x028846ff, 0x00ed3ad4, 0x00176edc}}}, + {X: Field{[10]uint32{0x038934ee, 0x01e32730, 0x0359fb09, 0x026fa80a, 0x01bc99ac, 0x0079fe09, 0x03b5f786, 0x0221a6cb, 0x008ff2b5, 0x0019b6d2}}, Y: Field{[10]uint32{0x00ae6a5f, 0x01adcc3a, 0x0017fc31, 0x03bfac52, 0x006040e7, 0x03da19b1, 0x010e9972, 0x020fe02c, 0x0112b51c, 0x002addb8}}}, + {X: Field{[10]uint32{0x02274932, 0x02091f49, 0x002a1c3c, 0x02d7fb50, 0x0054c812, 0x022b56dc, 0x03912fa7, 0x00354aec, 0x016b6698, 0x00049661}}, Y: Field{[10]uint32{0x02150383, 0x011631fc, 0x03c2245d, 0x02ee1c31, 0x02d70dfc, 0x015a06f0, 0x03e0557d, 0x02571fb7, 0x013fc678, 0x003ab5f3}}}, + {X: Field{[10]uint32{0x01f1cf00, 0x01d177ff, 0x02cf9102, 0x0233bfaf, 0x00426996, 0x03494b1f, 0x025272fd, 0x03cf732a, 0x0214cbb0, 0x00140b21}}, Y: Field{[10]uint32{0x03c53c3c, 0x0242654e, 0x0154c10b, 0x0001921c, 0x001b2f45, 0x01abc28e, 0x01d06951, 0x038d5bf6, 0x028807e4, 0x001c46f1}}}, + {X: Field{[10]uint32{0x02a8d6fd, 0x026f31c2, 0x00c42224, 0x03b05f00, 0x01f43acd, 0x01edadff, 0x01c10734, 0x01900fda, 0x013c323c, 0x00381446}}, Y: Field{[10]uint32{0x02560455, 0x0045f8e2, 0x039f1c85, 0x02c61fe2, 0x00c574d9, 0x0097098c, 0x011d2bcf, 0x023b985b, 0x0271ce42, 0x000840b0}}}, + {X: Field{[10]uint32{0x01f1dc46, 0x0381d06b, 0x02cb800a, 0x0162d4e2, 0x030abe7c, 0x030ecdf9, 0x03d90c15, 0x0234c8a7, 0x03ae0d76, 0x0032461e}}, Y: Field{[10]uint32{0x01c92c0f, 0x011ccd62, 0x000f8d75, 0x0373c9ff, 0x015714f6, 0x0056b0a7, 0x03d02526, 0x02e92865, 0x0043f9eb, 0x00304c35}}}, + {X: Field{[10]uint32{0x010fe897, 0x03b2367a, 0x017a16ea, 0x03513a0a, 0x0123dba4, 0x031ac190, 0x003ae701, 0x02cfb8ac, 0x027eb9f3, 0x0016c215}}, Y: Field{[10]uint32{0x010c27c9, 0x006a61ea, 0x02d92aa8, 0x012dd43f, 0x03914d4b, 0x03a3d32e, 0x02e9c726, 0x03246b37, 0x00159079, 0x002b41c7}}}, + {X: Field{[10]uint32{0x003ba7cc, 0x03d2946d, 0x0286f839, 0x015343aa, 0x038a9cc5, 0x0189a46a, 0x0306a26d, 0x01ea1b3e, 0x008ac581, 0x002b96d9}}, Y: Field{[10]uint32{0x032db311, 0x03a49750, 0x019830d5, 0x004a9bfa, 0x0166e752, 0x0285f18a, 0x00a48c3d, 0x0308aaac, 0x030db665, 0x0007aa2a}}}, + {X: Field{[10]uint32{0x010178d2, 0x00085222, 0x038f0421, 0x034c9f95, 0x0004f2e0, 0x03326aed, 0x02ea5c5c, 0x0215b663, 0x00d0a092, 0x000ee6eb}}, Y: Field{[10]uint32{0x01bd5052, 0x031977c8, 0x024911fd, 0x011fc606, 0x00b79be4, 0x02a4a6b8, 0x03628d7e, 0x02e8715e, 0x008e9603, 0x002da07a}}}, + {X: Field{[10]uint32{0x0259fef4, 0x0016a191, 0x02d7ee8d, 0x01e8707d, 0x03f6dfbf, 0x0179056a, 0x022f8279, 0x019b6b54, 0x0180a740, 0x0014937d}}, Y: Field{[10]uint32{0x0252f35f, 0x02ae9c89, 0x039c1ed2, 0x03e78d62, 0x019c72c5, 0x034c0bbc, 0x03c210ca, 0x0307869b, 0x03285f3b, 0x000feb31}}}, + {X: Field{[10]uint32{0x010e4363, 0x034c2751, 0x00cdff6e, 0x03a9ff1c, 0x01599a34, 0x01202e1d, 0x0109a383, 0x01d7121f, 0x03f2ade7, 0x000b818d}}, Y: Field{[10]uint32{0x0364738e, 0x0228283d, 0x023696da, 0x03bab69c, 0x031aafb7, 0x012b557c, 0x038e903e, 0x01392731, 0x03087e2f, 0x0038f1ba}}}, + {X: Field{[10]uint32{0x020cc483, 0x0184c2ea, 0x0364bbda, 0x00a089bd, 0x033f7857, 0x021ee509, 0x013fb335, 0x02f4ef90, 0x02adbeaf, 0x003dffb1}}, Y: Field{[10]uint32{0x0208c68d, 0x014c7467, 0x00544c66, 0x00eb967f, 0x03dd4209, 0x018ee5da, 0x00fefd8e, 0x015f1ff2, 0x01748eb4, 0x003d91aa}}}, + {X: Field{[10]uint32{0x023608be, 0x0362f122, 0x0229929a, 0x025d3609, 0x00cd6eb4, 0x03624b72, 0x02c95b12, 0x01310cad, 0x00e06af6, 0x001d7e53}}, Y: Field{[10]uint32{0x01958a29, 0x0221deec, 0x026c622e, 0x0248b1ef, 0x026e32c8, 0x007b001d, 0x0316b322, 0x0241a9a4, 0x02d0a2b7, 0x002fe1c5}}}, + {X: Field{[10]uint32{0x03fb4d85, 0x0370733c, 0x0104331b, 0x03a74c04, 0x00f62e07, 0x0321a424, 0x00f039fc, 0x03cf2c31, 0x02de5e0d, 0x001040a5}}, Y: Field{[10]uint32{0x03fecfa0, 0x03dcbb4f, 0x0396c383, 0x01ff2187, 0x02da7426, 0x018996e0, 0x00a82ff8, 0x03765aae, 0x039ca314, 0x003a58d5}}}, + {X: Field{[10]uint32{0x033ffa05, 0x03ff8035, 0x03b23cbd, 0x02605b3e, 0x0369b4e6, 0x025f699e, 0x03c1703d, 0x0385acbd, 0x02ac05f5, 0x00332093}}, Y: Field{[10]uint32{0x013e8abb, 0x03c428cd, 0x02aa8b8c, 0x006a4abe, 0x03d18c6f, 0x01f1e203, 0x00582182, 0x013be577, 0x01a69f41, 0x0005f0c3}}}, + {X: Field{[10]uint32{0x026e5820, 0x03fc44df, 0x00d03a83, 0x0193e976, 0x03d2074b, 0x00c5dc1d, 0x00f0b3fd, 0x03b6335e, 0x00ef4d26, 0x002b306c}}, Y: Field{[10]uint32{0x003ce6c3, 0x01432367, 0x04000111, 0x03405a79, 0x014fcd24, 0x03e3efbb, 0x01d2a804, 0x02ba4406, 0x00c68519, 0x001b3391}}}, + {X: Field{[10]uint32{0x010da922, 0x03f1c6f2, 0x038257c2, 0x0238c61d, 0x01583c2b, 0x00c62e48, 0x034bccf4, 0x00766c1d, 0x036eccce, 0x00072cc1}}, Y: Field{[10]uint32{0x00e373cc, 0x021d2393, 0x03b04c62, 0x03cb3c96, 0x02a6372d, 0x03b37168, 0x0217dfd3, 0x0181760a, 0x036c0058, 0x000a8bc9}}}, + {X: Field{[10]uint32{0x00fe13f2, 0x02096aa1, 0x039783d5, 0x0085e8e2, 0x008cb3a5, 0x02796900, 0x03ea9750, 0x03d26d61, 0x00512a22, 0x001bbf69}}, Y: Field{[10]uint32{0x038e2424, 0x0251d621, 0x0103954a, 0x03f6f2f5, 0x0360673c, 0x03968a96, 0x032a54ad, 0x00becc7f, 0x02d56dfe, 0x00047513}}}, + {X: Field{[10]uint32{0x01bf0858, 0x00c30ee7, 0x01cdd51b, 0x03345f7a, 0x02e2fcf1, 0x02a3f665, 0x00931ecd, 0x00de2d73, 0x0219aef4, 0x0011fda5}}, Y: Field{[10]uint32{0x00b5e274, 0x0242251f, 0x03ee9bf8, 0x022b0cea, 0x020d2fa2, 0x0135c359, 0x0057af2a, 0x038f5b69, 0x02a19776, 0x00052555}}}, + {X: Field{[10]uint32{0x014d28e4, 0x0120cd5e, 0x00d4f8ff, 0x02f0691f, 0x028b2eae, 0x00e86789, 0x01032c51, 0x0375754e, 0x021e97f5, 0x00374f63}}, Y: Field{[10]uint32{0x00467e83, 0x03e7aa93, 0x029c2e0f, 0x02ec0d2f, 0x030c2233, 0x020bafcc, 0x033d7c63, 0x02a0eaa5, 0x000020f6, 0x001e5a2f}}}, + {X: Field{[10]uint32{0x01e16d78, 0x02b4ad99, 0x01f9197a, 0x02dd414d, 0x027de2a2, 0x00f2d2cc, 0x015737cd, 0x00e9b2f9, 0x00eea19d, 0x000af515}}, Y: Field{[10]uint32{0x029f7f99, 0x03c7f5c4, 0x037549c1, 0x01221f8f, 0x039f7c62, 0x02b503fa, 0x0271c667, 0x009e3cd0, 0x00f0d6a1, 0x00029c2c}}}, + {X: Field{[10]uint32{0x035a5ee0, 0x00cc6103, 0x02d91047, 0x037c4eb0, 0x02915462, 0x02899e13, 0x02035b29, 0x01d2d136, 0x01bb2a7e, 0x00233f9d}}, Y: Field{[10]uint32{0x0207cd1e, 0x03cb8919, 0x01ca1eef, 0x0289ff6b, 0x00b65c2d, 0x02491550, 0x02226d1c, 0x01f2193d, 0x0056bdc8, 0x001923ff}}}, + {X: Field{[10]uint32{0x01724d36, 0x02cc9559, 0x02f6e665, 0x01a13c44, 0x005e046a, 0x012d5ef2, 0x03dab832, 0x018b2f0b, 0x00ae19c4, 0x0017bfcd}}, Y: Field{[10]uint32{0x004d68a4, 0x03378568, 0x026b0ccf, 0x020d1f1a, 0x01d551e7, 0x00b80414, 0x0289629d, 0x011fff08, 0x01bb9db3, 0x000663ed}}}, + {X: Field{[10]uint32{0x00f92b91, 0x0198e7de, 0x02a61042, 0x02e07c62, 0x00a2c51b, 0x01d8c5dd, 0x02db6244, 0x00ec238d, 0x0154f367, 0x0026a951}}, Y: Field{[10]uint32{0x01384806, 0x0235e118, 0x006fa75c, 0x01197c97, 0x011d167b, 0x01cad42f, 0x0222faf2, 0x01d0134b, 0x03ad4a6e, 0x0021d128}}}, + {X: Field{[10]uint32{0x03f259e0, 0x032d4e97, 0x0165a955, 0x02a2e75d, 0x03ac88a2, 0x037c1bae, 0x007463c5, 0x0165c37f, 0x01758cfb, 0x0012e0dd}}, Y: Field{[10]uint32{0x028df208, 0x0069793e, 0x02aa9917, 0x01aaadea, 0x02ed7076, 0x0048cf7d, 0x0074396a, 0x0294fdb9, 0x0142bda1, 0x0021d647}}}, + {X: Field{[10]uint32{0x02428bb1, 0x03317bdd, 0x00428226, 0x009615cd, 0x03c49dc7, 0x01671f3b, 0x03f5a579, 0x03e4399c, 0x00b49134, 0x001752dd}}, Y: Field{[10]uint32{0x02d89425, 0x001e83ef, 0x03cfcb1f, 0x02efc670, 0x00cdc2f6, 0x00036368, 0x026bf3f1, 0x03b856af, 0x0110f466, 0x0006caa2}}}, + {X: Field{[10]uint32{0x03cad2d8, 0x00a8c255, 0x002b2570, 0x0105eae7, 0x002d4754, 0x018bb9a0, 0x013bafaf, 0x01133976, 0x02c0c552, 0x003542f8}}, Y: Field{[10]uint32{0x0162f583, 0x00735700, 0x0144ef24, 0x03c82f11, 0x005a4dc0, 0x03aa9779, 0x01854617, 0x026ad300, 0x024c6ee8, 0x003f881f}}}, + {X: Field{[10]uint32{0x0075bff1, 0x0280d384, 0x032e9a1d, 0x03c505b6, 0x02f93bbf, 0x02fe616a, 0x02489155, 0x02ce1193, 0x01ce8e0e, 0x002ec3d8}}, Y: Field{[10]uint32{0x037b7d0e, 0x03dbefed, 0x00412631, 0x0184c51d, 0x034e6b05, 0x02f2c23b, 0x02a1032c, 0x02c37cc3, 0x03152dde, 0x000004e9}}}, + {X: Field{[10]uint32{0x01dcb2f5, 0x00cafe13, 0x03d22886, 0x02785366, 0x0263e22b, 0x00bf17be, 0x00e41fb2, 0x0006c85c, 0x01db473f, 0x000f39af}}, Y: Field{[10]uint32{0x00e0922e, 0x01e896ab, 0x01edf8d4, 0x023c6eb0, 0x029a8426, 0x0043714b, 0x02b73081, 0x034a6109, 0x0057f4b3, 0x0010c218}}}, + {X: Field{[10]uint32{0x038f81aa, 0x01d182ec, 0x03c85bd3, 0x03c695b0, 0x02bbcbbf, 0x01f36dd7, 0x00b5490c, 0x0202ff24, 0x014aef16, 0x003ff7ec}}, Y: Field{[10]uint32{0x02f4af0d, 0x005bb87a, 0x00a547c2, 0x031ceef3, 0x0124f228, 0x02522d69, 0x02880d0e, 0x03c6788c, 0x01ef02f1, 0x003cc117}}}, + {X: Field{[10]uint32{0x0223172c, 0x03e93020, 0x000fed59, 0x000941eb, 0x02c828d1, 0x008cc2bb, 0x026eb60a, 0x00993604, 0x02e19ab4, 0x0006b07c}}, Y: Field{[10]uint32{0x00e18bf8, 0x03c64db6, 0x027f5133, 0x018e06d3, 0x02d8fae0, 0x020363c0, 0x015e3a8f, 0x021abec8, 0x00bc3394, 0x001d8da9}}}, + {X: Field{[10]uint32{0x01ec228e, 0x01987b2b, 0x009a22d6, 0x02d81f9b, 0x01b1a1a6, 0x0083c8ce, 0x002957aa, 0x03a26985, 0x000a0740, 0x001494d3}}, Y: Field{[10]uint32{0x0261b669, 0x02a5f3cc, 0x022f1365, 0x00d6ba00, 0x02e1a318, 0x02213ebe, 0x02c2fa5d, 0x03226707, 0x02bafe41, 0x0033dbf9}}}, + {X: Field{[10]uint32{0x011b09eb, 0x03d91899, 0x0278d5b9, 0x00b25928, 0x0104f36f, 0x00df4cac, 0x00dccd61, 0x00b0b1e3, 0x02857cd2, 0x00102480}}, Y: Field{[10]uint32{0x01031d0d, 0x0384b10b, 0x025fb3bd, 0x023ae2a1, 0x01f6b773, 0x013c5824, 0x01fef1bf, 0x00f8fd9b, 0x0373a5fa, 0x00103253}}}, + {X: Field{[10]uint32{0x03029289, 0x006f1466, 0x019e70c8, 0x030901a7, 0x0225a5b3, 0x021036c5, 0x02ac6e4e, 0x0336c852, 0x00334b9c, 0x0022c74f}}, Y: Field{[10]uint32{0x0223e853, 0x035b6d57, 0x006e5630, 0x027c517e, 0x03802076, 0x01e0889d, 0x01658985, 0x0256647f, 0x00642acf, 0x000453f5}}}, + {X: Field{[10]uint32{0x00a242bd, 0x01ce5e7d, 0x020fd7e4, 0x0398f4d1, 0x008a6055, 0x019058b7, 0x006bbd20, 0x03c4e967, 0x0260b7c7, 0x002b8537}}, Y: Field{[10]uint32{0x0065a412, 0x031a8f93, 0x00ef16ca, 0x039ebe80, 0x03afccfe, 0x01dbc844, 0x00463e23, 0x028cce85, 0x0089cdb5, 0x0022e581}}}, + {X: Field{[10]uint32{0x02d3e3d7, 0x020e1b8b, 0x02420078, 0x01204df7, 0x03b81539, 0x037f76eb, 0x00d4e395, 0x0179b0fa, 0x004099c9, 0x003cdfc7}}, Y: Field{[10]uint32{0x03fb3606, 0x003028ec, 0x01af5031, 0x004413d4, 0x030a5644, 0x033dd95d, 0x0283d769, 0x02b4d2c8, 0x008082f6, 0x0007ca40}}}, + {X: Field{[10]uint32{0x03017a84, 0x00fb2c86, 0x005dfaa5, 0x00cd99b4, 0x00a13f89, 0x030925af, 0x0041c1d3, 0x022270d1, 0x03ae9636, 0x0007ec1f}}, Y: Field{[10]uint32{0x037753c0, 0x03e32718, 0x03cb7b8d, 0x011bea5f, 0x0358e6da, 0x01ffd546, 0x0368934b, 0x015dab12, 0x01c93931, 0x0004a062}}}, + {X: Field{[10]uint32{0x0015f3cc, 0x0365ca12, 0x0371552b, 0x0087435a, 0x032afb07, 0x02e88ae9, 0x00ea2b51, 0x03b3b520, 0x0354e112, 0x0011347a}}, Y: Field{[10]uint32{0x02ed7043, 0x02a6cabc, 0x0288e3c3, 0x02df56db, 0x02ea1855, 0x035e4e3e, 0x0273e02e, 0x0149bc49, 0x0328574c, 0x0029b84e}}}, + {X: Field{[10]uint32{0x0103238e, 0x02559168, 0x03cbfd87, 0x0229d669, 0x00ec9491, 0x01dbdef4, 0x02311cff, 0x02e1d5ff, 0x032e5732, 0x001a6025}}, Y: Field{[10]uint32{0x03d26a5e, 0x03ac18d8, 0x03c262d2, 0x03385f16, 0x02ac4a0f, 0x024be826, 0x0376b24a, 0x02450c85, 0x00324ffb, 0x001ee7fa}}}, + {X: Field{[10]uint32{0x00efcfa3, 0x00c09554, 0x0379bf70, 0x018a7616, 0x01a8566a, 0x03d901a8, 0x019639c4, 0x02c79379, 0x009d405b, 0x001a8ea3}}, Y: Field{[10]uint32{0x02c038ba, 0x023799b2, 0x0124d0ce, 0x03ae7546, 0x002e0f59, 0x025ad1e9, 0x01b408e1, 0x03412a3f, 0x02e87b22, 0x000fa2ae}}}, + {X: Field{[10]uint32{0x0012ed0b, 0x00e42d91, 0x036831da, 0x013251b0, 0x03bfb680, 0x02f3e809, 0x01844c4d, 0x01192afd, 0x00d41598, 0x003fcc42}}, Y: Field{[10]uint32{0x03d0a317, 0x01cb51f2, 0x03515dc0, 0x03408672, 0x0011f5d4, 0x01c15192, 0x02abe857, 0x03422571, 0x01e33ee1, 0x00201559}}}, + {X: Field{[10]uint32{0x01517d73, 0x024c93a5, 0x011bb213, 0x01406012, 0x03499727, 0x00d772d6, 0x0134e533, 0x0126acf8, 0x036a2f85, 0x0003b93d}}, Y: Field{[10]uint32{0x0071a838, 0x0204125c, 0x0075c8fe, 0x01f628a4, 0x03830736, 0x032509d9, 0x0189e899, 0x00ac45a2, 0x01672240, 0x001af640}}}, + {X: Field{[10]uint32{0x0053e0a4, 0x023d4693, 0x01966ac7, 0x00163342, 0x00230c63, 0x032eae83, 0x023b7205, 0x02563cda, 0x01cb01ca, 0x0030845d}}, Y: Field{[10]uint32{0x0072bf51, 0x008da233, 0x02a44ea9, 0x03acbff9, 0x01585a02, 0x03021760, 0x02a0ecd2, 0x0282bc95, 0x03a67a7c, 0x001a8860}}}, + {X: Field{[10]uint32{0x0237d6fc, 0x0272fce6, 0x01292c40, 0x030317cb, 0x03953141, 0x01f2ae46, 0x0246e39e, 0x02ce60d3, 0x0008a9a0, 0x000b5793}}, Y: Field{[10]uint32{0x01c6e15e, 0x0190119d, 0x03054d61, 0x0087713b, 0x004b5127, 0x024017b4, 0x0234f37e, 0x00c7e824, 0x01c531a3, 0x001d5a6e}}}, + {X: Field{[10]uint32{0x0315dbc3, 0x030a932e, 0x01c26ef7, 0x019dade6, 0x015d573b, 0x00c5d97c, 0x00124086, 0x03ac2730, 0x0041bfbb, 0x0018c0b0}}, Y: Field{[10]uint32{0x02491025, 0x02bc209f, 0x0063f915, 0x02201279, 0x01a1e514, 0x0024cba4, 0x00ddfedd, 0x010a82b1, 0x020f67ce, 0x000caa3c}}}, + {X: Field{[10]uint32{0x01934e2d, 0x00d98481, 0x0308ca3b, 0x0330b7aa, 0x005b6c67, 0x027be6e5, 0x01c9cfb8, 0x03823bdf, 0x016c198d, 0x000f9854}}, Y: Field{[10]uint32{0x037520d9, 0x01b818c0, 0x00dbee95, 0x03b41239, 0x005692f3, 0x003d89e1, 0x03849447, 0x01c413dd, 0x03f74d5f, 0x0007bfee}}}, + {X: Field{[10]uint32{0x0142fe30, 0x02ac2bb9, 0x005a7d8a, 0x0064422c, 0x01b89892, 0x03ccc148, 0x0335a378, 0x00d3492a, 0x02b2d7d1, 0x0028022e}}, Y: Field{[10]uint32{0x01b475a1, 0x027f8c54, 0x01de6be0, 0x03aa0ae6, 0x03f5454a, 0x02701790, 0x03ec2fde, 0x001b9518, 0x03ec903c, 0x001de8dd}}}, + {X: Field{[10]uint32{0x0224005f, 0x02645fa9, 0x022f8c38, 0x019c05bc, 0x03287114, 0x00b90c05, 0x00f42b80, 0x0258aa54, 0x0348b928, 0x001de0bf}}, Y: Field{[10]uint32{0x03608c15, 0x0322263e, 0x03c18c78, 0x033d6c8a, 0x008ad2c9, 0x026ebf8c, 0x01b766db, 0x00f832b4, 0x024938a0, 0x001e3c8f}}}, + {X: Field{[10]uint32{0x03ddcfc2, 0x019dbe09, 0x03c20d20, 0x01c633fb, 0x02f6ffbe, 0x03225bba, 0x0019d648, 0x02d13f44, 0x0278c26a, 0x0008ced2}}, Y: Field{[10]uint32{0x033b655c, 0x00fb679d, 0x037b518f, 0x0108b825, 0x01f553d3, 0x020a1337, 0x03ddc1a4, 0x037e4121, 0x0036d976, 0x00379421}}}, + {X: Field{[10]uint32{0x01b8bb0e, 0x0177831c, 0x02a0792c, 0x008ca57c, 0x023f7a46, 0x03630cd0, 0x03d7aed2, 0x03524f60, 0x022906ee, 0x0020052a}}, Y: Field{[10]uint32{0x03583d92, 0x01b75543, 0x02444f3e, 0x02be0687, 0x01695f39, 0x0215aa78, 0x030caba4, 0x02f26c45, 0x029df2a5, 0x0037161c}}}, + {X: Field{[10]uint32{0x03bbdfce, 0x012ad676, 0x012c1b28, 0x03abafab, 0x0060882a, 0x02f18723, 0x03050ce7, 0x02b9c46e, 0x010b233d, 0x0022807a}}, Y: Field{[10]uint32{0x0291fdb0, 0x0376eb5d, 0x01cf4ca4, 0x03bc8294, 0x03b34b72, 0x00b2569d, 0x0006cc41, 0x01a4fa4b, 0x035dc9e3, 0x001603b5}}}, + {X: Field{[10]uint32{0x02e733b4, 0x02e48c86, 0x011a44cb, 0x006825af, 0x03a56988, 0x020ae81f, 0x026372d5, 0x024561c3, 0x034924a2, 0x00014288}}, Y: Field{[10]uint32{0x038cc751, 0x02af3699, 0x03cde3ed, 0x0038bdf3, 0x03aa21d0, 0x0111bf38, 0x01d8e2fa, 0x0007529e, 0x0220a977, 0x001a50f0}}}, + {X: Field{[10]uint32{0x02aa6d83, 0x00821ebb, 0x015cecbd, 0x01b6a299, 0x02b51b8f, 0x0209903b, 0x0307bd61, 0x01d13dea, 0x03578c96, 0x0032fd24}}, Y: Field{[10]uint32{0x028d4bf0, 0x03c1f13b, 0x011d5e75, 0x02961f41, 0x0129e79f, 0x01212813, 0x00bdb1c9, 0x036e6501, 0x02f45711, 0x001346cd}}}, + {X: Field{[10]uint32{0x028efe38, 0x026e9c62, 0x03d89ad5, 0x007fe93a, 0x007c63d1, 0x00a2cc76, 0x0164c2e8, 0x034a5a34, 0x0175e4ed, 0x001cdecf}}, Y: Field{[10]uint32{0x01f31586, 0x0208ad4d, 0x03439e7c, 0x01b74e1d, 0x02ff1ebf, 0x03720c9e, 0x027002ee, 0x03945514, 0x03a18aa8, 0x003b1fde}}}, + {X: Field{[10]uint32{0x0038813a, 0x008bff2b, 0x00b8bb7e, 0x03166aaa, 0x028812e0, 0x035ed105, 0x03f46d69, 0x00e6b9b1, 0x00642519, 0x000a72ca}}, Y: Field{[10]uint32{0x00a2e6e9, 0x02edcebb, 0x038f0528, 0x01477af4, 0x03b5f1eb, 0x01043fc6, 0x02d77c8b, 0x02cb1725, 0x000a7c98, 0x0030fb0a}}}, + {X: Field{[10]uint32{0x0228fe9d, 0x01653f17, 0x01d352c9, 0x015091d0, 0x03f36689, 0x0065e553, 0x00dffa25, 0x00bef791, 0x02592428, 0x0006162a}}, Y: Field{[10]uint32{0x02d4bd46, 0x03b0a074, 0x0248596f, 0x03512f9d, 0x00be50b1, 0x01f92ad3, 0x03d7879a, 0x027eae7e, 0x01d6b0a6, 0x00283a24}}}, + {X: Field{[10]uint32{0x022eb75c, 0x03a45d21, 0x004fc2a9, 0x02374d1b, 0x0126c137, 0x013c24ba, 0x03ae314d, 0x003abd9e, 0x00581a42, 0x001cb39f}}, Y: Field{[10]uint32{0x0025ae1c, 0x012f781d, 0x02ff3628, 0x007fdd18, 0x038bec12, 0x002162ee, 0x02236ae3, 0x00f833db, 0x037a5a9c, 0x0008ca45}}}, + {X: Field{[10]uint32{0x03112903, 0x035bd1ab, 0x0031517b, 0x02f403b3, 0x00a3f9dc, 0x02777e6f, 0x03dcb830, 0x02db492a, 0x025e5dfa, 0x000d3072}}, Y: Field{[10]uint32{0x02a1f803, 0x02a01ec8, 0x021a27ac, 0x0093ad26, 0x0080088a, 0x02962682, 0x03c4aeb6, 0x03325c0d, 0x02adc931, 0x0024fdbf}}}, + {X: Field{[10]uint32{0x00392c36, 0x02e83749, 0x02243284, 0x011e7389, 0x028d348b, 0x03b8f59d, 0x003100cc, 0x01619fe0, 0x004a80af, 0x0001f16b}}, Y: Field{[10]uint32{0x02fc5828, 0x003a9019, 0x01b86337, 0x03faad61, 0x00a3201c, 0x03a9eae1, 0x03db23d1, 0x03991cc7, 0x0164903b, 0x002911a2}}}, + {X: Field{[10]uint32{0x00363caa, 0x012dfb13, 0x00b35e59, 0x00f69d1b, 0x010b57bf, 0x01a0ffdf, 0x018851c8, 0x01dca06a, 0x0113244c, 0x002f8b77}}, Y: Field{[10]uint32{0x02580fa2, 0x0391648f, 0x01f257df, 0x02151e56, 0x018c45ea, 0x02f1ee99, 0x033e5b92, 0x028b3c73, 0x01390af8, 0x002b6dd6}}}, + {X: Field{[10]uint32{0x02c13806, 0x0285d923, 0x039b7901, 0x00ae0665, 0x037f7b22, 0x018b7f67, 0x0244471d, 0x03bf7292, 0x036a3b3b, 0x001b7b87}}, Y: Field{[10]uint32{0x002e5651, 0x02e66657, 0x01ab6af3, 0x00c43d90, 0x021a9a24, 0x02c04c48, 0x000356ce, 0x03dbffe3, 0x01014fa5, 0x001767a1}}}, + {X: Field{[10]uint32{0x01e68c19, 0x039bf9e7, 0x03c3180e, 0x01afdaeb, 0x02c76438, 0x01ec4544, 0x00355b3a, 0x023b5d24, 0x00e68e2c, 0x00057c99}}, Y: Field{[10]uint32{0x00326aba, 0x00fe315c, 0x0374eddf, 0x02ae9daa, 0x03c41291, 0x01c73ca6, 0x01053fd3, 0x03d023be, 0x0126302b, 0x002415d3}}}, + {X: Field{[10]uint32{0x029c91a3, 0x026017af, 0x036660df, 0x01ec60fc, 0x016d4c5e, 0x02a61323, 0x0192b785, 0x022433a9, 0x03e904cc, 0x000f5f3e}}, Y: Field{[10]uint32{0x03f62808, 0x01f7f979, 0x00d12682, 0x01239d8c, 0x0042b30b, 0x01aa12d5, 0x0351694f, 0x00196be3, 0x01d44ea7, 0x00355737}}}, + {X: Field{[10]uint32{0x003a1e10, 0x00773667, 0x02e1445b, 0x02c1ffaf, 0x011ec637, 0x0125c480, 0x035dd3e7, 0x014771ea, 0x03f90d79, 0x00150e22}}, Y: Field{[10]uint32{0x02e5a547, 0x03bfd52a, 0x03dcf6fb, 0x030aa75b, 0x03725f99, 0x03d58348, 0x008738b3, 0x00a97e6f, 0x038825dc, 0x0005ecd9}}}, + {X: Field{[10]uint32{0x02088313, 0x03c065da, 0x03c94be5, 0x03154818, 0x00425327, 0x024a05e5, 0x00a0d2cc, 0x02029652, 0x03dd9a00, 0x000f08a7}}, Y: Field{[10]uint32{0x02926a1c, 0x036ee34a, 0x01d8d3a8, 0x01c7fb48, 0x01192f0a, 0x00dcf141, 0x0083d12c, 0x020ed2be, 0x0395a84f, 0x000d25d5}}}, + {X: Field{[10]uint32{0x03c63210, 0x00149c49, 0x02b26157, 0x0138dbc6, 0x011974e7, 0x03ea35eb, 0x0291f368, 0x01669b85, 0x036ee146, 0x002d84ae}}, Y: Field{[10]uint32{0x00df5bb4, 0x0181cb29, 0x00dc223b, 0x005fa382, 0x02052408, 0x0357a3aa, 0x0077733d, 0x0337c7e5, 0x005dd623, 0x00016523}}}, + {X: Field{[10]uint32{0x0305f613, 0x037bf81e, 0x03d64d2e, 0x0108bbec, 0x03ae381e, 0x024038ce, 0x0341ed3e, 0x003750a0, 0x01855447, 0x003b15b9}}, Y: Field{[10]uint32{0x015e9c45, 0x03d9b3ca, 0x016d9df8, 0x00334ec5, 0x0286effe, 0x01e2f39d, 0x03f2bd65, 0x038c237f, 0x0151acf6, 0x003b35fc}}}, + {X: Field{[10]uint32{0x0011f80d, 0x039d23ff, 0x0308f25e, 0x02bf9353, 0x02a565ee, 0x026c56c9, 0x000c8baf, 0x027e3ef6, 0x03ca85ff, 0x00006fbc}}, Y: Field{[10]uint32{0x012914f9, 0x0315a0fe, 0x03135272, 0x002b7a22, 0x01125f0a, 0x006f2262, 0x014b8927, 0x0125ee86, 0x00bb96be, 0x003f8098}}}, + {X: Field{[10]uint32{0x0107c20a, 0x0020fa64, 0x0325168a, 0x03968bae, 0x010c4b27, 0x034afd2b, 0x00e42653, 0x01a38aa4, 0x004a522b, 0x0006f6eb}}, Y: Field{[10]uint32{0x00d63ea1, 0x00a10e54, 0x03a9e3d2, 0x009c38fe, 0x025b09e1, 0x00ba2c81, 0x00467b9d, 0x01fe8004, 0x03263ede, 0x00135838}}}, + {X: Field{[10]uint32{0x0262fc84, 0x027aab4d, 0x038373bd, 0x01ffa252, 0x026e601b, 0x02cb0b08, 0x01e0f8b1, 0x02e36954, 0x039a567a, 0x003a40cb}}, Y: Field{[10]uint32{0x00eb70e9, 0x00c65b5d, 0x0400064e, 0x0252372c, 0x0121d609, 0x02bf783c, 0x00b0a49d, 0x006bce83, 0x03e647d2, 0x0002b158}}}, + {X: Field{[10]uint32{0x00f79c75, 0x0241f0c2, 0x011a9fda, 0x03af2281, 0x03a9608d, 0x015b8d19, 0x0108044f, 0x03dd2295, 0x02ec044a, 0x001f39d1}}, Y: Field{[10]uint32{0x02aa426a, 0x0103f57c, 0x017d5406, 0x02814beb, 0x012c6b8f, 0x01bcf006, 0x03bbb804, 0x02f48ef9, 0x01c13166, 0x0023c21e}}}, + {X: Field{[10]uint32{0x0359eecd, 0x01b7932e, 0x01fc906c, 0x032fbcda, 0x0068862d, 0x01b34c80, 0x01298564, 0x01b47282, 0x038919de, 0x00383549}}, Y: Field{[10]uint32{0x02886b20, 0x028a51b2, 0x03ce88cd, 0x03c74faf, 0x01f46680, 0x025d02f5, 0x03547912, 0x03764293, 0x039db4eb, 0x00263d19}}}, + {X: Field{[10]uint32{0x025ca397, 0x004eba9f, 0x01f1800a, 0x02159070, 0x02e28c8b, 0x00bc8222, 0x000a4d48, 0x012d6110, 0x01cdcf1f, 0x0031a891}}, Y: Field{[10]uint32{0x021ac628, 0x0399da25, 0x01bf3605, 0x02a0cc08, 0x01cb11ec, 0x02d79b34, 0x00ff944a, 0x032c2656, 0x03b9f8f2, 0x0034c1b6}}}, + {X: Field{[10]uint32{0x0295c910, 0x00a1b9cd, 0x02b06a1b, 0x00652837, 0x024ade09, 0x026661ff, 0x0334acec, 0x03c20a87, 0x008d9710, 0x003fe55b}}, Y: Field{[10]uint32{0x03bcc306, 0x008f4304, 0x0239fb78, 0x03b2c38b, 0x01a8086a, 0x0362a4dd, 0x028c832f, 0x03f5187f, 0x012b866a, 0x003eafb1}}}, + {X: Field{[10]uint32{0x02c23af0, 0x00485489, 0x00cc73ff, 0x0059bd2b, 0x025cef12, 0x0313709d, 0x0344fe45, 0x01813343, 0x024a0d1a, 0x00152776}}, Y: Field{[10]uint32{0x000631ef, 0x03dd9784, 0x00381a33, 0x025d58b1, 0x01166fec, 0x02aec578, 0x02eede71, 0x02a0980d, 0x03c0e05b, 0x001c78eb}}}, + {X: Field{[10]uint32{0x02776416, 0x01f99127, 0x01723207, 0x004bb708, 0x016070dd, 0x037647e7, 0x01896e82, 0x01cf339a, 0x03090215, 0x0019b4f7}}, Y: Field{[10]uint32{0x03b46d5d, 0x03c9e756, 0x01ebc25f, 0x0327aa4c, 0x0009ccf1, 0x02bc162f, 0x0029dd3e, 0x03b8fb65, 0x021359a2, 0x0024e605}}}, + {X: Field{[10]uint32{0x01e4f8d9, 0x01c0bd5e, 0x01be737b, 0x02083eb8, 0x028a4d7a, 0x01713c61, 0x013ede5a, 0x018e1a71, 0x01bc0942, 0x00186f4f}}, Y: Field{[10]uint32{0x0082e780, 0x015cad38, 0x02caac1b, 0x020788cd, 0x00502aee, 0x003be923, 0x01ddf540, 0x013d24b2, 0x0247e27d, 0x0023015a}}}, + {X: Field{[10]uint32{0x00178f4e, 0x01bcee60, 0x0000647d, 0x01dbe99f, 0x004ef20c, 0x005236c7, 0x002f7849, 0x036aa49c, 0x03464a31, 0x00229b62}}, Y: Field{[10]uint32{0x028f7407, 0x019f2eab, 0x00d8ccfe, 0x02864efd, 0x03c31309, 0x02081451, 0x0082f9e3, 0x01d8065b, 0x02eee408, 0x00347d01}}}, + {X: Field{[10]uint32{0x022e573e, 0x03f47924, 0x02b1b809, 0x01096b3d, 0x0137893b, 0x03b76607, 0x00aa90e1, 0x021105c0, 0x029399eb, 0x0038ad83}}, Y: Field{[10]uint32{0x0219f7af, 0x004fba93, 0x029ed635, 0x02b42003, 0x01bd8a38, 0x02cd75e2, 0x0209dc0a, 0x020a6a2b, 0x025fe394, 0x001a2831}}}, + {X: Field{[10]uint32{0x00f55e85, 0x03c9b375, 0x00574ac6, 0x031cad56, 0x01fc23b8, 0x0277e950, 0x0316cad9, 0x03f24993, 0x030fe85c, 0x00131d80}}, Y: Field{[10]uint32{0x012b7bb6, 0x0166fa28, 0x000902d9, 0x02aa62bb, 0x01e98c63, 0x006157df, 0x039a5745, 0x02d3b323, 0x02d89a31, 0x00112cd4}}}, + {X: Field{[10]uint32{0x03baed2e, 0x0151d897, 0x01580fe4, 0x025cd98f, 0x002f0e89, 0x00e304e8, 0x022c9ef5, 0x00f0d42a, 0x02a35910, 0x00372ea5}}, Y: Field{[10]uint32{0x036544b4, 0x00530885, 0x003deb4d, 0x034b6cb6, 0x00b13053, 0x016fedcf, 0x01f91bd7, 0x01a62b7a, 0x005f0727, 0x002be788}}}, + {X: Field{[10]uint32{0x02dc7883, 0x02cacc7c, 0x02a433b5, 0x01ffa6d9, 0x03e68242, 0x0327b71c, 0x03d3e036, 0x03fe6b2f, 0x03d8f75f, 0x003f4125}}, Y: Field{[10]uint32{0x00d62d79, 0x002eb7ff, 0x0213509c, 0x022625b7, 0x01445762, 0x002f792a, 0x03fb2fcc, 0x0041deac, 0x00b69c8d, 0x00348c05}}}, + {X: Field{[10]uint32{0x01f48040, 0x0331bb7b, 0x01077542, 0x026bae28, 0x02e70500, 0x013a0fe7, 0x011b7795, 0x03904d0f, 0x01bb0b38, 0x0016ed00}}, Y: Field{[10]uint32{0x02599c14, 0x020afe20, 0x03a5ee7a, 0x01cc03b3, 0x00ca9445, 0x01e38f2a, 0x00ea6283, 0x004e47da, 0x00b5acec, 0x0010c7f3}}}, + {X: Field{[10]uint32{0x00bb283b, 0x00b6d6d2, 0x01d20a26, 0x00119ef1, 0x023acac7, 0x00d70ddf, 0x0341c38b, 0x01ab62c9, 0x024ff9cc, 0x0007ea5a}}, Y: Field{[10]uint32{0x02b963eb, 0x02a3fafb, 0x02ac8bfc, 0x031c6c88, 0x036404dc, 0x0278527a, 0x02af7f1f, 0x016bf3c7, 0x0092ffc6, 0x0030d123}}}, + {X: Field{[10]uint32{0x002f86ea, 0x00c8a459, 0x00f11614, 0x0080bfb2, 0x03697ea4, 0x01c74298, 0x02384531, 0x014749e9, 0x02ef1ae5, 0x000254d2}}, Y: Field{[10]uint32{0x03729591, 0x00aab03b, 0x03849643, 0x0084b2ff, 0x0346fd7f, 0x0284fa5b, 0x0148a4ec, 0x01f740cf, 0x003c3883, 0x00334325}}}, + {X: Field{[10]uint32{0x001b8ceb, 0x000ca834, 0x038b7b57, 0x02fc06a3, 0x02138440, 0x02a93fd2, 0x018d08f3, 0x000e42f2, 0x03ed4330, 0x003a9cab}}, Y: Field{[10]uint32{0x0058663e, 0x0299b4b6, 0x0280925e, 0x0112145c, 0x00af4fb0, 0x03ab9fa5, 0x02856a44, 0x00b30a72, 0x018c0369, 0x00385d37}}}, + {X: Field{[10]uint32{0x00122327, 0x03e1b517, 0x01fa9a01, 0x0188d75e, 0x03165698, 0x02fce874, 0x03801f2a, 0x0148e980, 0x01343ca2, 0x000e564d}}, Y: Field{[10]uint32{0x0153dd96, 0x00b80026, 0x0175b45d, 0x021eb1b2, 0x0142a5b8, 0x0111d449, 0x01cbf0e9, 0x01b72154, 0x03e92cd7, 0x002b34f8}}}, + {X: Field{[10]uint32{0x002d4721, 0x038f827b, 0x02a3f246, 0x03e1c9d0, 0x034f74ef, 0x037eed46, 0x027d4b53, 0x01683da5, 0x022a375e, 0x00355eca}}, Y: Field{[10]uint32{0x013ed306, 0x03495443, 0x03b036a0, 0x0251c6b9, 0x01c0aeeb, 0x01209e07, 0x02c20913, 0x01fb0c43, 0x00484d10, 0x0004b5be}}}, + {X: Field{[10]uint32{0x002f1082, 0x02eabd91, 0x0119c59b, 0x023f5480, 0x01fc5def, 0x03804d75, 0x02c781af, 0x03bbd839, 0x03c51b99, 0x00027cb7}}, Y: Field{[10]uint32{0x0320dd0d, 0x022d5b96, 0x01a77e0f, 0x01626789, 0x017ad1d7, 0x02a5bf83, 0x03ca6e4e, 0x00c123e8, 0x0162fd27, 0x00023c82}}}, + {X: Field{[10]uint32{0x0229884b, 0x00b06f40, 0x0216a935, 0x01d96316, 0x01afa587, 0x03037b68, 0x0336c1f9, 0x03244d26, 0x03c6f030, 0x002c70c2}}, Y: Field{[10]uint32{0x02ecdfc3, 0x00e43187, 0x019f1939, 0x009fd4ed, 0x035563e7, 0x028b8a32, 0x01c63d18, 0x02223735, 0x01d16e77, 0x003e2916}}}, + {X: Field{[10]uint32{0x01c6e53b, 0x03866369, 0x002eb665, 0x00ce14f8, 0x02305429, 0x02ed7499, 0x01ad6f91, 0x0348dc4b, 0x03e740ca, 0x00022998}}, Y: Field{[10]uint32{0x035c1e99, 0x007bb9ae, 0x03812c0c, 0x03f8081d, 0x000786a8, 0x00ec2463, 0x00cf7116, 0x0174576b, 0x03995117, 0x003881ac}}}, + {X: Field{[10]uint32{0x012941a1, 0x02aa2d2a, 0x03696fe1, 0x03a09f98, 0x005f4a5a, 0x01b302c0, 0x00fac0a7, 0x0247bbd1, 0x02cbe0ca, 0x000ac255}}, Y: Field{[10]uint32{0x006cffd2, 0x00aa588e, 0x03423ddf, 0x03fb68a7, 0x033f84b8, 0x018989f8, 0x02e1e110, 0x013abe43, 0x03a8dd45, 0x0028c79b}}}, + {X: Field{[10]uint32{0x0262c3bd, 0x00a449b9, 0x01330d54, 0x02001a83, 0x006b0099, 0x03847ed3, 0x02381df7, 0x0325c3ad, 0x01517a2a, 0x00380510}}, Y: Field{[10]uint32{0x008dfcee, 0x02e8d810, 0x03a1e7f4, 0x00d12218, 0x03aeb3fd, 0x0234636f, 0x01639341, 0x03203085, 0x029ba691, 0x00208e33}}}, + {X: Field{[10]uint32{0x02c86c37, 0x008568df, 0x02eba08b, 0x035c78a2, 0x02f344e0, 0x01682d99, 0x0316c530, 0x00bccf2b, 0x013e8b06, 0x0002f8c8}}, Y: Field{[10]uint32{0x0151cd1f, 0x02ca725f, 0x00adc3f1, 0x00f7476c, 0x03550fb8, 0x014a8990, 0x03956838, 0x00e29335, 0x03baeaca, 0x00154948}}}, + {X: Field{[10]uint32{0x01e8ff2b, 0x03859faa, 0x030abc4f, 0x01b6d7ac, 0x001c18eb, 0x0396389d, 0x03aa1db9, 0x02f593f1, 0x03b6bfbf, 0x00188ce4}}, Y: Field{[10]uint32{0x00e42cd3, 0x03537f8d, 0x00b500ba, 0x025ed4ac, 0x031339a1, 0x028edee5, 0x025e316f, 0x016fca80, 0x0174f0fd, 0x001f0390}}}, + {X: Field{[10]uint32{0x01cfe97a, 0x00856c43, 0x0326fbc6, 0x02aa2bea, 0x01bffe79, 0x0233d02f, 0x01eb624b, 0x007a1d9a, 0x0302dd0a, 0x0036b7ad}}, Y: Field{[10]uint32{0x03253490, 0x030e37c5, 0x00bb48fb, 0x026686ac, 0x025a5225, 0x0334e6f2, 0x0260acb8, 0x026d04b5, 0x00cae4c2, 0x0024c224}}}, + {X: Field{[10]uint32{0x01362f33, 0x03edde32, 0x03c13627, 0x03563894, 0x010ac98a, 0x00986133, 0x01c9cfec, 0x026e0aec, 0x03b78317, 0x002d4a34}}, Y: Field{[10]uint32{0x038babab, 0x00af54b6, 0x004f047c, 0x00222ed1, 0x01aa902e, 0x028b4628, 0x0140676b, 0x0048a98e, 0x03af1545, 0x00018c80}}}, + {X: Field{[10]uint32{0x01734a6a, 0x0096adc4, 0x036e02d0, 0x018835d0, 0x017a4de5, 0x0013a7a0, 0x0018a5c8, 0x01b88ab9, 0x03e09398, 0x000bfc88}}, Y: Field{[10]uint32{0x0100f678, 0x029e7000, 0x000965ef, 0x01d75280, 0x03819904, 0x01e0e2ad, 0x0276d8a9, 0x036866f6, 0x0188ec9c, 0x00317234}}}, + {X: Field{[10]uint32{0x01eb1742, 0x01b9d2e6, 0x0312ff94, 0x03da67f1, 0x019ec839, 0x0322ac73, 0x03d2c393, 0x014f2733, 0x01d50e1e, 0x0032e1cc}}, Y: Field{[10]uint32{0x02d19fb5, 0x02394f3d, 0x0076d8c1, 0x0123921c, 0x00a9db38, 0x024b3a29, 0x01252480, 0x03141374, 0x01f838fe, 0x00334be7}}}, + {X: Field{[10]uint32{0x00cf4a2e, 0x02c49c78, 0x0379936b, 0x0376fa61, 0x006dac52, 0x03c9c9a4, 0x02c265aa, 0x02972ddb, 0x0045d776, 0x0004ddeb}}, Y: Field{[10]uint32{0x02a04670, 0x02b287b0, 0x010d4f34, 0x0154353b, 0x0025ab21, 0x036524f8, 0x027a8187, 0x0124cb56, 0x030dd595, 0x00292ccc}}}, + {X: Field{[10]uint32{0x001a5ccd, 0x006894d9, 0x00724c51, 0x01cdeb04, 0x0222fbac, 0x020107ea, 0x03489bd8, 0x031d7f80, 0x03f2f140, 0x002612e6}}, Y: Field{[10]uint32{0x00d14ff3, 0x0050c7f2, 0x02bb590b, 0x026a50a8, 0x03d82f4c, 0x03135431, 0x010ea82a, 0x03bb2e9d, 0x02399733, 0x00311d3d}}}, + {X: Field{[10]uint32{0x03bdcb06, 0x025835eb, 0x00c4d857, 0x01e5ca63, 0x01d50504, 0x0000afe6, 0x035d56ac, 0x01f3e6c4, 0x000074f5, 0x0012e3f4}}, Y: Field{[10]uint32{0x00c703bf, 0x038deccd, 0x0097e3a8, 0x03a531b4, 0x0095560e, 0x01833ddb, 0x01937a4c, 0x03dbddc8, 0x01031df0, 0x001f0110}}}, + {X: Field{[10]uint32{0x018b6079, 0x0215a0c8, 0x000b6605, 0x006e2fb3, 0x0334fc75, 0x022f4376, 0x01250b25, 0x0088d986, 0x02536841, 0x0015cc59}}, Y: Field{[10]uint32{0x01652904, 0x010142a4, 0x01c37da6, 0x016f8e8e, 0x0216f833, 0x022bf850, 0x0172898b, 0x00715d22, 0x024f30f0, 0x0034755b}}}, + {X: Field{[10]uint32{0x0369f286, 0x01c883f6, 0x03bd253c, 0x019d3cae, 0x00607373, 0x019f50fd, 0x032cb597, 0x005bcbef, 0x0197a0ff, 0x00326800}}, Y: Field{[10]uint32{0x00142f0b, 0x03314610, 0x034e4009, 0x03b694c7, 0x006b4dfe, 0x018172af, 0x02074b0c, 0x0045f077, 0x0383d739, 0x0005df19}}}, + {X: Field{[10]uint32{0x021881cb, 0x03b1b3a9, 0x03ff645e, 0x03d5fba2, 0x00c87b9e, 0x01e6cc02, 0x01616185, 0x008ea76c, 0x02da91df, 0x00388d05}}, Y: Field{[10]uint32{0x00b8da15, 0x01cb755c, 0x00137937, 0x03d28f78, 0x02e42fbc, 0x005c60a5, 0x02c82e0e, 0x00da479f, 0x017f8404, 0x00395590}}}, + {X: Field{[10]uint32{0x038e9ad8, 0x038a5558, 0x01c1e3b0, 0x03ba29d2, 0x0114293e, 0x01def62a, 0x0214c450, 0x01d4f399, 0x03f2369d, 0x0027e5b8}}, Y: Field{[10]uint32{0x021ddff1, 0x012cae68, 0x00ff6b49, 0x025b94a7, 0x039b01a3, 0x0104f83a, 0x0250d10e, 0x029369c5, 0x02681567, 0x003d7344}}}, + {X: Field{[10]uint32{0x01301fd2, 0x013efdae, 0x03d5f1d9, 0x01e16e90, 0x01ae4880, 0x039a8c91, 0x014317dd, 0x00048f35, 0x03a4b24b, 0x0012195e}}, Y: Field{[10]uint32{0x02f0d890, 0x02319beb, 0x03e36a4a, 0x02824a69, 0x00dd4931, 0x02a4086c, 0x013ca772, 0x00de04a0, 0x02c06eb5, 0x000647b7}}}, + {X: Field{[10]uint32{0x0236f24a, 0x021f9a5a, 0x032d4e01, 0x03201de0, 0x02c6c858, 0x00500b5e, 0x03155111, 0x02193632, 0x02e9d72e, 0x0019ecc8}}, Y: Field{[10]uint32{0x03f6946a, 0x03f7ceb1, 0x02208c3d, 0x019fdfe6, 0x030e15c8, 0x017eaa0c, 0x0387058c, 0x02fc54ef, 0x02c26b58, 0x0033fac4}}}, + {X: Field{[10]uint32{0x004ded15, 0x0381bc29, 0x02d40fbd, 0x004c5820, 0x03c545ba, 0x014800b6, 0x00e89250, 0x037663f3, 0x0068542b, 0x00010ba0}}, Y: Field{[10]uint32{0x03c4aae5, 0x0111146f, 0x02402bf6, 0x0139eab1, 0x01a1ee81, 0x0313c987, 0x03649158, 0x00f3d49c, 0x01b0c1f3, 0x0005916a}}}, + {X: Field{[10]uint32{0x0290d4c7, 0x0230417f, 0x00e30758, 0x03292a32, 0x013e058c, 0x02eeb001, 0x02191079, 0x01437555, 0x00e1339c, 0x0023b9f7}}, Y: Field{[10]uint32{0x02c9d5f9, 0x01a6a05b, 0x011d2b46, 0x03fc79bc, 0x0098e102, 0x036fa7f8, 0x01a61705, 0x0209e4b3, 0x02f48aae, 0x003fef42}}}, + {X: Field{[10]uint32{0x03a368e6, 0x01e2a087, 0x02ece559, 0x03c3319b, 0x0237a935, 0x02c82485, 0x01aaaf27, 0x01a9c5ab, 0x01041292, 0x0002af25}}, Y: Field{[10]uint32{0x01f79203, 0x0317db5c, 0x027c9624, 0x01234e91, 0x02155a4a, 0x036b93f4, 0x0375c484, 0x01879e7e, 0x0135e9b4, 0x001cb952}}}, + {X: Field{[10]uint32{0x02976ba8, 0x037746e9, 0x02f3b433, 0x0235e0fc, 0x00fd72fd, 0x000de3f3, 0x000568d4, 0x03a6d4ec, 0x032081e0, 0x002f4940}}, Y: Field{[10]uint32{0x003ceb39, 0x0318e55b, 0x021ca4c3, 0x01f4a75a, 0x02e8c4c8, 0x005ee39e, 0x00ca8797, 0x01526265, 0x03db8585, 0x0016b6e2}}}, + {X: Field{[10]uint32{0x02e25f71, 0x02297862, 0x00740c01, 0x03812222, 0x01b31609, 0x039ea836, 0x02e91677, 0x03a13926, 0x0262fbee, 0x0002d3ec}}, Y: Field{[10]uint32{0x0176e5fc, 0x0371fe38, 0x0003b24c, 0x00da3a8d, 0x01265d6d, 0x033d85ba, 0x00ecbe41, 0x00754496, 0x0386dc09, 0x000d37cf}}}, + {X: Field{[10]uint32{0x02605c01, 0x03a20cef, 0x021c495d, 0x005c86cd, 0x03e46048, 0x00418ed7, 0x005ad148, 0x013abe85, 0x036766f2, 0x00346ea6}}, Y: Field{[10]uint32{0x01e8400a, 0x011da8f6, 0x03a75068, 0x00f292e2, 0x01f87194, 0x0245f8ea, 0x03ce7f28, 0x00bc7998, 0x00bd17de, 0x003a029b}}}, + {X: Field{[10]uint32{0x022639b3, 0x009d4ba4, 0x01ba8373, 0x0009a771, 0x03a80c67, 0x03ae78aa, 0x006652d5, 0x016a34b5, 0x02b03a3e, 0x0017262d}}, Y: Field{[10]uint32{0x010f4a54, 0x03d944f1, 0x012e06b8, 0x02d98d4a, 0x006a35ef, 0x03e41e81, 0x011bd130, 0x003374b1, 0x039a145d, 0x0002078b}}}, + {X: Field{[10]uint32{0x002618f8, 0x036d7753, 0x02a840c8, 0x00382a1e, 0x02908abf, 0x03ec97cb, 0x00b70714, 0x02e1bd87, 0x0288f75f, 0x00307e91}}, Y: Field{[10]uint32{0x028397ea, 0x00f32e72, 0x01d9b204, 0x0396ae18, 0x039db869, 0x02aa44f2, 0x0355d0b1, 0x03c9b45f, 0x02776d4b, 0x003cbdd2}}}, + {X: Field{[10]uint32{0x03227ec1, 0x00ae9b3d, 0x01f76dc2, 0x022d1017, 0x0396aec7, 0x00269d56, 0x0062ba2f, 0x03acc947, 0x02e9a644, 0x00017a01}}, Y: Field{[10]uint32{0x033e614b, 0x013e1fe9, 0x01bba9d8, 0x03adcbcc, 0x02b871d2, 0x01d08c4e, 0x02caa050, 0x020a75ab, 0x0118d6a1, 0x002e2320}}}, + {X: Field{[10]uint32{0x01c8de9a, 0x018c9bb4, 0x00c1434c, 0x01b7bfd5, 0x01096863, 0x031e406f, 0x023d965b, 0x0069efd8, 0x03fefd2c, 0x003e7451}}, Y: Field{[10]uint32{0x029caffd, 0x01235cb4, 0x00c33cd5, 0x032e1260, 0x0040de44, 0x0045cc18, 0x027d77b4, 0x021b1e4e, 0x0249ab66, 0x0031e21c}}}, + {X: Field{[10]uint32{0x030ccdb1, 0x0283fb29, 0x0023babe, 0x02b8c5c4, 0x009f7020, 0x001e658d, 0x0138a1f5, 0x03447ea3, 0x015685f6, 0x002e6332}}, Y: Field{[10]uint32{0x010ecf7f, 0x00ab6f26, 0x01f49571, 0x0085c25d, 0x013dcbdf, 0x002208d5, 0x024cc0d4, 0x03a28dbb, 0x00953689, 0x003c1d35}}}, + {X: Field{[10]uint32{0x0017b474, 0x0229925a, 0x02b03464, 0x024fceed, 0x02184584, 0x0052f2e9, 0x01091dc7, 0x005f9fbe, 0x02d41008, 0x003c5872}}, Y: Field{[10]uint32{0x03740904, 0x0227db66, 0x01ffd612, 0x03e7e946, 0x01c4410a, 0x01798945, 0x0081eb24, 0x03cc908a, 0x012e396a, 0x002dfbae}}}, + {X: Field{[10]uint32{0x0326914c, 0x02c70214, 0x038fb1b7, 0x03da2899, 0x03fb54af, 0x01bb7022, 0x02abac24, 0x00187915, 0x00892ea4, 0x001f22db}}, Y: Field{[10]uint32{0x027692f8, 0x02722bd7, 0x015b10d6, 0x00f736ae, 0x02296072, 0x00acd1a0, 0x035eacd0, 0x034b0a7f, 0x03026ea1, 0x003c2387}}}, + {X: Field{[10]uint32{0x00f28729, 0x00d7bb49, 0x01e5dd36, 0x023dc937, 0x023ab207, 0x03dc681d, 0x01b93cce, 0x01196065, 0x029f1633, 0x00119a30}}, Y: Field{[10]uint32{0x0074ea4f, 0x039d0013, 0x00fa129e, 0x01f0bd87, 0x008fd22f, 0x02766545, 0x024c7233, 0x03b1480c, 0x00c98391, 0x00176c8a}}}, + {X: Field{[10]uint32{0x0167b65e, 0x0071f94c, 0x00b2f4e2, 0x00a724a4, 0x0296fa67, 0x00d9c994, 0x0239f8cf, 0x03697066, 0x00f39dd6, 0x000d10f4}}, Y: Field{[10]uint32{0x03429234, 0x01f03a25, 0x014b92a8, 0x002edfb6, 0x0114a432, 0x0301e514, 0x0131f637, 0x0237723b, 0x02399a08, 0x0012db6d}}}, + {X: Field{[10]uint32{0x03c227b4, 0x031e0422, 0x020e8ffe, 0x02a6beb0, 0x02458dbc, 0x015d3025, 0x0281e693, 0x013a5560, 0x010117a0, 0x0034f38d}}, Y: Field{[10]uint32{0x02eb9908, 0x01ff2ac1, 0x0384a9b7, 0x01ba4338, 0x007696ee, 0x03555ab4, 0x001e47f8, 0x01bba4d5, 0x03b9628f, 0x002f3f1d}}}, + {X: Field{[10]uint32{0x015127af, 0x0005583e, 0x03080233, 0x030f34b5, 0x00f2bc1a, 0x03782b0a, 0x01f86409, 0x00914888, 0x0363ad77, 0x00313718}}, Y: Field{[10]uint32{0x012d3038, 0x025ae2dd, 0x0271b3e0, 0x03165fda, 0x00038a79, 0x020d1494, 0x01bc9493, 0x0299990e, 0x028fd789, 0x001e326e}}}, + {X: Field{[10]uint32{0x015ac666, 0x034a769b, 0x01075b23, 0x0332ef37, 0x021bf4ed, 0x008f4b83, 0x0178d7a1, 0x011fb3f3, 0x0394221a, 0x00031dc7}}, Y: Field{[10]uint32{0x028d6091, 0x0157dc73, 0x01980d91, 0x01bd6e3d, 0x03f2ec52, 0x01778a4f, 0x00719246, 0x016abbd1, 0x0330829f, 0x00137b8e}}}, + {X: Field{[10]uint32{0x01e6e199, 0x00945f5e, 0x03d50e77, 0x02fc9d6b, 0x0136a1e9, 0x012287c9, 0x02516e64, 0x023dfd6d, 0x00e89633, 0x002ffe23}}, Y: Field{[10]uint32{0x0388c206, 0x01d05629, 0x03f68532, 0x00a6ed56, 0x01c15526, 0x03a5d876, 0x00b62117, 0x004293ac, 0x007ab620, 0x0023cfc3}}}, + {X: Field{[10]uint32{0x01a3b97a, 0x0287ca82, 0x002da576, 0x01dbcb38, 0x006a467e, 0x00f2b089, 0x010e7e3d, 0x02fc93a1, 0x00645d57, 0x0012bf34}}, Y: Field{[10]uint32{0x0110f0a2, 0x02b95393, 0x01f93984, 0x00ec301b, 0x00ef927d, 0x021db5b0, 0x00692f61, 0x02be4db3, 0x035487b2, 0x0014bc8e}}}, + {X: Field{[10]uint32{0x02b1f373, 0x022e884c, 0x03abdf8a, 0x00d26001, 0x0379e23c, 0x0136c04b, 0x03933fd9, 0x0038815f, 0x022cb9bf, 0x00312f04}}, Y: Field{[10]uint32{0x02fbfc6d, 0x01e21859, 0x00ce1a87, 0x02f5ef7e, 0x031daf76, 0x02ad5b5d, 0x005d4273, 0x0206eb71, 0x03b6a31d, 0x00390311}}}, + {X: Field{[10]uint32{0x01f821a8, 0x01a3c614, 0x019ddb4c, 0x0229f4d3, 0x02837a0f, 0x02ac46b2, 0x0223d27b, 0x01de4738, 0x01b1d1be, 0x00121e86}}, Y: Field{[10]uint32{0x01d0ef98, 0x027912a9, 0x00e67f51, 0x000dec97, 0x01055524, 0x0150578d, 0x02335544, 0x013a6821, 0x034316ff, 0x00294f35}}}, + {X: Field{[10]uint32{0x0301a326, 0x00cb2e10, 0x007f8106, 0x0202a162, 0x01f4ac3d, 0x022333ff, 0x02035165, 0x031d201d, 0x00ecbe06, 0x0009d28f}}, Y: Field{[10]uint32{0x01a9f40d, 0x02627121, 0x019b3ff4, 0x01e98efc, 0x035d06b4, 0x00e172db, 0x0272cab5, 0x022d1426, 0x03e3afbe, 0x0005e892}}}, + {X: Field{[10]uint32{0x03afa9e8, 0x01e4418c, 0x022c48a0, 0x01a8002f, 0x03e82fcc, 0x01563e74, 0x03fc34e7, 0x0266b00e, 0x0377b0cb, 0x000cacc7}}, Y: Field{[10]uint32{0x018f5bc2, 0x036a0297, 0x032a8993, 0x03542c5c, 0x0217f422, 0x02e0111c, 0x02b3f71d, 0x036a4383, 0x004cc191, 0x000111ed}}}, + {X: Field{[10]uint32{0x024a2752, 0x022e1680, 0x03c2925d, 0x038419b7, 0x03945285, 0x03f424cd, 0x0339d46f, 0x0051a370, 0x01cf5556, 0x001e30e7}}, Y: Field{[10]uint32{0x03a3ac55, 0x022119de, 0x009ce890, 0x00c57844, 0x02a66809, 0x03008f98, 0x03df63d5, 0x032a17ba, 0x01bb4e41, 0x0035a477}}}, + {X: Field{[10]uint32{0x0134e5ff, 0x035bece7, 0x0325fa04, 0x0258ac79, 0x00d2f21f, 0x03bbf06a, 0x0102116d, 0x001ddf11, 0x0111a492, 0x0017f1d6}}, Y: Field{[10]uint32{0x017512f2, 0x0182ecd2, 0x00d507a4, 0x01892dca, 0x01f3fe16, 0x0284e5d2, 0x03524d96, 0x0221737f, 0x037f18f5, 0x00167cdb}}}, + {X: Field{[10]uint32{0x0108fa8a, 0x00a274eb, 0x0364ae38, 0x039bda4e, 0x01fa62dd, 0x038d1b86, 0x010fc164, 0x00ad269b, 0x00e9152b, 0x00328564}}, Y: Field{[10]uint32{0x0046dc8c, 0x023fcc20, 0x007f524a, 0x01124da5, 0x01535ea7, 0x00499157, 0x029eae17, 0x03b5d527, 0x033c1174, 0x0011a9ee}}}, + {X: Field{[10]uint32{0x0111fa1f, 0x01433767, 0x037f1f3d, 0x02f16ea6, 0x01743d94, 0x03d9b56b, 0x036e660b, 0x02f7ae9f, 0x02665ff0, 0x00171c54}}, Y: Field{[10]uint32{0x0073a03e, 0x03ffa711, 0x00c39b31, 0x02903c82, 0x02e41684, 0x03333293, 0x01ee9ddc, 0x02570e88, 0x031556e9, 0x001f688e}}}, + {X: Field{[10]uint32{0x00177e82, 0x0361a139, 0x017c8c29, 0x03387255, 0x03fa0c09, 0x03cb840c, 0x01c38774, 0x031ce957, 0x01a36361, 0x0031fdc7}}, Y: Field{[10]uint32{0x01b0dedf, 0x03b6e156, 0x01f92078, 0x0030d0a7, 0x0177c6f5, 0x0013c3e5, 0x022dbf9a, 0x033b2dac, 0x007fb5c2, 0x000235b9}}}, + {X: Field{[10]uint32{0x0058afab, 0x00070af7, 0x0316da01, 0x03339be9, 0x024130b4, 0x00cedd4d, 0x01259004, 0x0284f8de, 0x019f5264, 0x001ba46f}}, Y: Field{[10]uint32{0x00fd604f, 0x008e946d, 0x034499ed, 0x00d077d6, 0x01ee0f94, 0x00826a80, 0x0020c20f, 0x01612576, 0x0055506b, 0x0016ea9d}}}, + {X: Field{[10]uint32{0x02ef0d33, 0x015065ae, 0x01072689, 0x0280d416, 0x03244907, 0x00cc8a04, 0x01c789df, 0x01f2ff1d, 0x028e69ac, 0x0007c037}}, Y: Field{[10]uint32{0x02e040f4, 0x020dc0f6, 0x02feab2e, 0x032106e9, 0x020e65fe, 0x0120ad9e, 0x000c30b4, 0x00c3b4a0, 0x0290f323, 0x000a24b3}}}, + {X: Field{[10]uint32{0x01300638, 0x01e4515f, 0x01e1091d, 0x002c8c93, 0x001a2f5b, 0x01c76356, 0x01efa3ad, 0x0311a508, 0x03f507d8, 0x0030004c}}, Y: Field{[10]uint32{0x00f18895, 0x010d3b4d, 0x027a2f86, 0x004bf72d, 0x031aa3dc, 0x027a38c6, 0x005ea455, 0x03a60b74, 0x01820d3e, 0x000f1dac}}}, + {X: Field{[10]uint32{0x020cad49, 0x03a420f1, 0x0248d2f8, 0x03819b37, 0x00cdb172, 0x012efe5c, 0x00ef7560, 0x009a784b, 0x01e795e8, 0x0002bd8e}}, Y: Field{[10]uint32{0x0026abb4, 0x00b11d09, 0x03219808, 0x02bd59ce, 0x030c479d, 0x03477921, 0x0014a74c, 0x0334a439, 0x0179ce92, 0x0006f404}}}, + {X: Field{[10]uint32{0x01f4c9a1, 0x01e5e5cc, 0x00cd54e9, 0x00e22dcf, 0x00ede585, 0x03af2e68, 0x03a0a5d8, 0x03011063, 0x027d5447, 0x0039b6f4}}, Y: Field{[10]uint32{0x01242153, 0x037aaf8f, 0x038ee6b5, 0x00dcd236, 0x01a20710, 0x03433e2f, 0x00c780a0, 0x020c80f5, 0x0124f284, 0x001dfce1}}}, + {X: Field{[10]uint32{0x036360a9, 0x037f54cc, 0x0246e4c2, 0x007b9015, 0x028d1e3e, 0x0304467a, 0x02dd904e, 0x01c2ab40, 0x0123c95b, 0x003d46a3}}, Y: Field{[10]uint32{0x00f46c57, 0x012c6a70, 0x0113873e, 0x02ad4651, 0x02ae5c6a, 0x02566b36, 0x03488714, 0x00f3d831, 0x009a1d70, 0x00109acb}}}, + {X: Field{[10]uint32{0x00f6bcf4, 0x01135428, 0x01863429, 0x02b07b91, 0x00a3e4d1, 0x00eb8e98, 0x038d8fc3, 0x00dedfd5, 0x01e70fe4, 0x00384bc4}}, Y: Field{[10]uint32{0x0019f5d2, 0x01b64011, 0x01253e3c, 0x0359b71f, 0x038bfec8, 0x00453255, 0x03985b14, 0x0226ad58, 0x015835fa, 0x0008b457}}}, + {X: Field{[10]uint32{0x0188e14c, 0x02f1fb7a, 0x00bb9bf6, 0x01467624, 0x03ac6193, 0x02562853, 0x0351e56d, 0x018b418b, 0x020a8ec7, 0x0039d621}}, Y: Field{[10]uint32{0x027ecd78, 0x0070a5d5, 0x03b23ec4, 0x0208ec00, 0x03104386, 0x032d1d43, 0x008d780d, 0x013c87ee, 0x00ef10b8, 0x0010b678}}}, + {X: Field{[10]uint32{0x00a64163, 0x00e8e608, 0x032c6e42, 0x020bbe47, 0x02d47998, 0x022952de, 0x022b90c7, 0x00797360, 0x03e90ba2, 0x000f24cf}}, Y: Field{[10]uint32{0x029080df, 0x00b77cd9, 0x03f96b67, 0x00d447d9, 0x017fc161, 0x01c02d2b, 0x01b23a56, 0x008b8b29, 0x00be5319, 0x00307aa8}}}, + {X: Field{[10]uint32{0x02857872, 0x004d3f7a, 0x00e07939, 0x0138f027, 0x00df828e, 0x02469e70, 0x02b6b08e, 0x0019b2db, 0x036a83c9, 0x0011d5d5}}, Y: Field{[10]uint32{0x0038277a, 0x03b9b183, 0x00d7b058, 0x03a27654, 0x01818248, 0x0249c311, 0x03e8388d, 0x01fc5778, 0x03b262d7, 0x0004fc8b}}}, + {X: Field{[10]uint32{0x031045c7, 0x0275ad00, 0x00aa8012, 0x03361987, 0x0246570f, 0x029fffd0, 0x01df9039, 0x014502c6, 0x01037008, 0x000d798e}}, Y: Field{[10]uint32{0x01b9e8c9, 0x0272b979, 0x011f1b0e, 0x02b6961a, 0x0053cfb3, 0x00f0a3a1, 0x004f022b, 0x018361a9, 0x00bcaa9d, 0x000a157d}}}, + {X: Field{[10]uint32{0x02126fa3, 0x0398cb8c, 0x024fe82b, 0x0371aa2f, 0x02ad5330, 0x0342a17d, 0x025f0316, 0x02081cd5, 0x02011f11, 0x002b511b}}, Y: Field{[10]uint32{0x00e83e39, 0x00653d8a, 0x00d4315c, 0x0150bdcc, 0x021d8acb, 0x02b03aac, 0x012b2f81, 0x038fd47e, 0x02f1dece, 0x000900e0}}}, + {X: Field{[10]uint32{0x02718815, 0x0359001a, 0x021aff82, 0x03d75dd1, 0x0289164e, 0x03108869, 0x00af7529, 0x02b0de08, 0x01f3eb01, 0x003efa79}}, Y: Field{[10]uint32{0x02d088e6, 0x0007fd84, 0x00468478, 0x0210aafe, 0x01ba2073, 0x0137a485, 0x013e0884, 0x00b8338e, 0x00add85a, 0x003cbcc3}}}, + {X: Field{[10]uint32{0x03038135, 0x014bc4ce, 0x029166e9, 0x03d8cb4c, 0x00b9b585, 0x020b326e, 0x0149aa24, 0x03d0c281, 0x0320d81f, 0x000799d4}}, Y: Field{[10]uint32{0x00686aa7, 0x02d326bc, 0x01db1b44, 0x006cd9b4, 0x002e2c7f, 0x02621c03, 0x03aa5de2, 0x03665716, 0x0276c9c7, 0x003283c4}}}, + {X: Field{[10]uint32{0x02267718, 0x00e45f35, 0x0285f359, 0x010cc383, 0x0394c3f6, 0x0349e492, 0x02b8068a, 0x0394ae8b, 0x037023b0, 0x0005db71}}, Y: Field{[10]uint32{0x017ca8d9, 0x003cff8a, 0x02701d51, 0x03da1746, 0x000548d4, 0x03d98254, 0x010686fd, 0x016c1bd1, 0x02885df7, 0x0034b718}}}, + {X: Field{[10]uint32{0x01a9c938, 0x002aded0, 0x008dd99a, 0x01080f3f, 0x017ac839, 0x0331f150, 0x02feadbc, 0x00aceacd, 0x02c232a0, 0x000f214d}}, Y: Field{[10]uint32{0x025186b5, 0x013d6b68, 0x03d9dbdc, 0x014b5a8e, 0x018ebc7f, 0x00c08ab4, 0x00dd8f17, 0x0344ab49, 0x02a5249c, 0x0029a13b}}}, + {X: Field{[10]uint32{0x02f006fd, 0x028c8b5e, 0x014a5605, 0x000f58f1, 0x00ec6ea0, 0x02a20466, 0x00c446fb, 0x01dadb95, 0x03abc61a, 0x00122a9c}}, Y: Field{[10]uint32{0x02403a64, 0x03e64d63, 0x00d4ecdb, 0x02dc1039, 0x035977fa, 0x033cf77c, 0x00185065, 0x002208b4, 0x02eeffb2, 0x0030a317}}}, + {X: Field{[10]uint32{0x03cc1ff1, 0x028e86d4, 0x024cbd83, 0x0034329f, 0x01263d17, 0x022eb292, 0x02d2b363, 0x000a3676, 0x03620abd, 0x001d1cc9}}, Y: Field{[10]uint32{0x0136c2c6, 0x02f5a779, 0x01f3fddf, 0x03f982ea, 0x00927a88, 0x03008edb, 0x02ef7ce5, 0x02827cfc, 0x030ce8df, 0x00328477}}}, + {X: Field{[10]uint32{0x01698522, 0x01cb16e5, 0x0002eb86, 0x0095491f, 0x01a40427, 0x0053fa40, 0x03dc9188, 0x016455d9, 0x0309520e, 0x003adc6a}}, Y: Field{[10]uint32{0x0148e995, 0x027d5b93, 0x031eb874, 0x0007001f, 0x01c81b69, 0x0008ecaa, 0x02563cb2, 0x016ce3b5, 0x02e0a7e9, 0x0017eb5e}}}, + {X: Field{[10]uint32{0x02f5be6b, 0x0110dc5f, 0x021cef84, 0x0256595d, 0x02af5e86, 0x02c5e731, 0x02da74be, 0x00f7d5cb, 0x03f6c776, 0x000ac406}}, Y: Field{[10]uint32{0x03140ce9, 0x03fa188f, 0x02597067, 0x0065fe26, 0x01f66647, 0x03c96108, 0x014629fe, 0x0068f663, 0x02c84e1d, 0x00003745}}}, + {X: Field{[10]uint32{0x020ab337, 0x02910d9b, 0x033ebca2, 0x03fa3cec, 0x0213976a, 0x017a06e8, 0x032b0507, 0x0195494c, 0x03a82c66, 0x0028267b}}, Y: Field{[10]uint32{0x01136c07, 0x02a66f57, 0x013abdc0, 0x02d796dd, 0x02fb1e33, 0x0049ab32, 0x016c7faa, 0x03cacf77, 0x017b5cf1, 0x003e20e5}}}, + {X: Field{[10]uint32{0x0362f95d, 0x02f267e2, 0x00f153d5, 0x03340bd6, 0x018cc107, 0x01c2f7ac, 0x032ab6d4, 0x00f3a56d, 0x0056a61c, 0x003d0e5a}}, Y: Field{[10]uint32{0x029f6133, 0x01db005b, 0x02567cfd, 0x03cf87bc, 0x03df81c2, 0x00c9d398, 0x03240caf, 0x02c2c019, 0x011aa8ed, 0x001b8fab}}}, + {X: Field{[10]uint32{0x014050c0, 0x038e1fda, 0x00008bd5, 0x01f12516, 0x0353215b, 0x0124f600, 0x00aabe5a, 0x02ec6128, 0x019726aa, 0x00369cc8}}, Y: Field{[10]uint32{0x01a0eeb6, 0x0211813a, 0x01b4666d, 0x01339f38, 0x019489af, 0x017a5538, 0x00b987d8, 0x012da1af, 0x03291772, 0x003881d7}}}, + {X: Field{[10]uint32{0x000a6792, 0x01359be6, 0x02f4575f, 0x0345343c, 0x018fea44, 0x025d0080, 0x0259c09b, 0x01860fd0, 0x021e1959, 0x002645c6}}, Y: Field{[10]uint32{0x01219a4f, 0x01d9ec5d, 0x03f5f27a, 0x034b9d81, 0x0066af1b, 0x0381efb0, 0x032cbd80, 0x03bbcf9f, 0x000c83e1, 0x00148ae1}}}, + {X: Field{[10]uint32{0x018cf08f, 0x034d329d, 0x0323f8f0, 0x03da44cc, 0x001db7bc, 0x01122270, 0x008997a9, 0x013cd890, 0x02848a2c, 0x000d4f31}}, Y: Field{[10]uint32{0x0267ebe7, 0x01449373, 0x01fa243d, 0x0051b839, 0x0097effd, 0x000a0d32, 0x02b283f7, 0x000559f8, 0x0062f4ba, 0x0006196f}}}, + {X: Field{[10]uint32{0x02312852, 0x0090b75e, 0x026d5deb, 0x00f755e8, 0x01b9ed7e, 0x02dbf330, 0x027c77f1, 0x034f4e39, 0x003b5053, 0x0022c5a6}}, Y: Field{[10]uint32{0x005d47c6, 0x03217976, 0x00e9fbe6, 0x034b1ca8, 0x000caeb3, 0x03fd26b2, 0x02adeedc, 0x014f4e55, 0x0392fa59, 0x0012764f}}}, + {X: Field{[10]uint32{0x010cabc9, 0x0381191d, 0x002ef505, 0x00c0eeb0, 0x02efb367, 0x020fed88, 0x03b25130, 0x00c9f089, 0x02a4b1da, 0x001a3d77}}, Y: Field{[10]uint32{0x03d31782, 0x01a263f8, 0x0350c435, 0x0115c72d, 0x02146de0, 0x01b271d0, 0x01257744, 0x012e76bb, 0x039c5d62, 0x00099d03}}}, + {X: Field{[10]uint32{0x020c699b, 0x02ec8080, 0x01244e74, 0x001a6156, 0x03cc9367, 0x008229b5, 0x019d8bd7, 0x03c03238, 0x007fc3ac, 0x003ebd48}}, Y: Field{[10]uint32{0x02f1936c, 0x019282f3, 0x03eebb85, 0x009c2181, 0x03d42c15, 0x01c77a39, 0x00186ac9, 0x031b952b, 0x004617a6, 0x003eaded}}}, + {X: Field{[10]uint32{0x00d17630, 0x03d4207a, 0x004a2bca, 0x00828998, 0x02917c04, 0x00bc0685, 0x0204707a, 0x0316f4f6, 0x0291b541, 0x0030f46a}}, Y: Field{[10]uint32{0x00d9ce27, 0x03450d7f, 0x02c64d8c, 0x028d1324, 0x01c9b631, 0x0397ded1, 0x02d7ce54, 0x031017c1, 0x006e5a58, 0x0016d5e0}}}, + {X: Field{[10]uint32{0x02c8db1a, 0x03267ea2, 0x01455623, 0x016bf8b0, 0x0254b5bd, 0x0246cc3c, 0x00db5263, 0x02e48114, 0x02354970, 0x0008c9e2}}, Y: Field{[10]uint32{0x00e1888b, 0x03b91064, 0x0144d55d, 0x01afef48, 0x03357048, 0x018150b7, 0x0093b746, 0x02791c6b, 0x01dae8df, 0x00219360}}}, + {X: Field{[10]uint32{0x038c0146, 0x01d97151, 0x02d25485, 0x00ac3b2b, 0x017c12c3, 0x02773440, 0x00de4ab2, 0x0329341d, 0x018133cb, 0x00180bd8}}, Y: Field{[10]uint32{0x027aa968, 0x02791800, 0x0011f91c, 0x010b39a8, 0x019ffab3, 0x0266e721, 0x03d2da15, 0x030d43dd, 0x03b7279e, 0x001310b3}}}, + {X: Field{[10]uint32{0x01843ee9, 0x03b2ab49, 0x02690fd4, 0x02af1e58, 0x03c545a9, 0x0373233f, 0x002aa463, 0x030ec976, 0x03c70126, 0x00077133}}, Y: Field{[10]uint32{0x03fedeb1, 0x0097986c, 0x003ac182, 0x02e4aa6d, 0x036002b1, 0x0178cabe, 0x0020f172, 0x0155d4d6, 0x01825c53, 0x002a4d5e}}}, + {X: Field{[10]uint32{0x0235af82, 0x0308f3f3, 0x028b33c6, 0x037e2c13, 0x01887a95, 0x032997f1, 0x00d99108, 0x02f1e453, 0x01216e02, 0x000da53c}}, Y: Field{[10]uint32{0x00555d88, 0x00d9090e, 0x006d1d1c, 0x03266e0e, 0x02c61e57, 0x021162e7, 0x016e7428, 0x0065db51, 0x0291b1c4, 0x001fffb8}}}, + {X: Field{[10]uint32{0x01f1bdbf, 0x0248ac87, 0x003b4b65, 0x00eea483, 0x00457be0, 0x03c1b0b1, 0x00725e0a, 0x019081ee, 0x0275a959, 0x001d0eb6}}, Y: Field{[10]uint32{0x000f908f, 0x035c5d6d, 0x026c0b16, 0x03e4e6c4, 0x035629b9, 0x00b706d0, 0x00c23ed9, 0x03176027, 0x01b55ac4, 0x0023cae0}}}, + {X: Field{[10]uint32{0x02420085, 0x02bdf5ac, 0x0394f210, 0x00b89b5b, 0x00f047cf, 0x0011181f, 0x00c42d7f, 0x03129ee7, 0x03977c7c, 0x0002ffa4}}, Y: Field{[10]uint32{0x02373d64, 0x00241beb, 0x01d92126, 0x03fa80b8, 0x01666c3d, 0x037b94f5, 0x02f2b510, 0x03720c07, 0x00598f80, 0x00189758}}}, + {X: Field{[10]uint32{0x03240eb9, 0x01b62e46, 0x01f8373e, 0x03ff21e5, 0x01cb56eb, 0x0219e86b, 0x01447517, 0x011b230a, 0x000e6ee6, 0x0021b00b}}, Y: Field{[10]uint32{0x005be4ed, 0x0299abf2, 0x037b40bf, 0x01224591, 0x0159d39f, 0x03d5be02, 0x02af5290, 0x004262dd, 0x029fda4b, 0x001966d7}}}, + {X: Field{[10]uint32{0x007bfda4, 0x02a48a4e, 0x02ce5dc3, 0x011d2e0a, 0x026c4f8f, 0x02a13719, 0x01d357d3, 0x0007a665, 0x0045857f, 0x000eca04}}, Y: Field{[10]uint32{0x02e9fd4c, 0x02039ff4, 0x00f8a16d, 0x008cfd40, 0x01e318a1, 0x03cc4f6b, 0x007c42f1, 0x0055091f, 0x032ccdeb, 0x00265209}}}, + {X: Field{[10]uint32{0x02fc47c0, 0x0294a13f, 0x007a3da9, 0x02380cc2, 0x02985903, 0x01b5bfca, 0x004d33d4, 0x025e7c14, 0x01d3b54d, 0x00337733}}, Y: Field{[10]uint32{0x016683b8, 0x00ebad01, 0x00321213, 0x02469fac, 0x010196c9, 0x001f7759, 0x0191e5e8, 0x004f0513, 0x03f83693, 0x0027ca84}}}, + {X: Field{[10]uint32{0x030e16d7, 0x014b0d21, 0x00088403, 0x027ccdc2, 0x018f8c2e, 0x0008c9c4, 0x034462bd, 0x00f76fb8, 0x0102a602, 0x00260401}}, Y: Field{[10]uint32{0x0169b9cb, 0x0253a406, 0x01a5747a, 0x019af5c8, 0x004cf8fb, 0x0152a13b, 0x0381c084, 0x00ecec78, 0x02f469af, 0x0006a2ff}}}, + {X: Field{[10]uint32{0x01978179, 0x0088f966, 0x02316c90, 0x03e6cd77, 0x03c26092, 0x02e08492, 0x00168479, 0x005e6c24, 0x017db2fc, 0x0022dd9d}}, Y: Field{[10]uint32{0x02b16f05, 0x03e69cd0, 0x009606ea, 0x01a07a2d, 0x01ee4492, 0x00459cc8, 0x01a71a6a, 0x01972950, 0x0326588e, 0x0011fabc}}}, + {X: Field{[10]uint32{0x02cc3b43, 0x015c759f, 0x02771bf2, 0x02cb557a, 0x0045c83b, 0x01ac3187, 0x004d8a94, 0x02d981bd, 0x03dc897f, 0x00399bb5}}, Y: Field{[10]uint32{0x0214dcbe, 0x03316a7c, 0x01810518, 0x03e64dd3, 0x017f1745, 0x0229016f, 0x00ffd470, 0x03fd3b1b, 0x039b8a9f, 0x00394dbd}}}, + {X: Field{[10]uint32{0x02bc88c8, 0x01aa84fc, 0x020d2262, 0x00241a82, 0x01ead632, 0x03bd7045, 0x02ad0656, 0x002e7e33, 0x0192cc9c, 0x00381801}}, Y: Field{[10]uint32{0x035a584f, 0x035472df, 0x03f7ca42, 0x01775527, 0x02e7f75f, 0x0304e105, 0x02552544, 0x01c1745b, 0x00b78b84, 0x0018a365}}}, + {X: Field{[10]uint32{0x01152767, 0x016b01c6, 0x02cfbffc, 0x0109ace4, 0x0362db2e, 0x018f8bc1, 0x0358fc70, 0x00975331, 0x0242a9cf, 0x0006c2bc}}, Y: Field{[10]uint32{0x0056a2be, 0x010ff0f2, 0x035a0ed0, 0x012c0be5, 0x00592dec, 0x024d5012, 0x0128da0d, 0x0015668f, 0x02a5eec3, 0x000ceba2}}}, + {X: Field{[10]uint32{0x035acb7d, 0x02a935ab, 0x00ed5439, 0x0137396f, 0x009b8092, 0x02c2f2fc, 0x005beeed, 0x01fb68d4, 0x03aa142f, 0x0038813f}}, Y: Field{[10]uint32{0x018911ba, 0x0136d257, 0x0159e692, 0x00c11e69, 0x03a02f70, 0x03bcb08a, 0x02acdd1a, 0x005466b7, 0x019b98e1, 0x0028a013}}}, + {X: Field{[10]uint32{0x01515ed5, 0x03c26683, 0x0196469c, 0x03d24a11, 0x00a35431, 0x00c5cf53, 0x00ea1fc1, 0x00c7d885, 0x02676515, 0x002bf103}}, Y: Field{[10]uint32{0x00b648e0, 0x01b4ccc0, 0x01b45589, 0x001f34ef, 0x035e6297, 0x02c13499, 0x02e85963, 0x0037a4ca, 0x02f41e48, 0x0015fbdb}}}, + {X: Field{[10]uint32{0x03e8d226, 0x037b88aa, 0x001d4690, 0x00197298, 0x01729634, 0x017038f2, 0x00588b04, 0x01907e00, 0x03db747b, 0x001654e2}}, Y: Field{[10]uint32{0x002d4438, 0x000c773b, 0x00e28652, 0x00a174de, 0x0352ca7a, 0x037a5821, 0x026547a3, 0x0270d530, 0x006a3c91, 0x00280c12}}}, + {X: Field{[10]uint32{0x0197ed8f, 0x0391a6aa, 0x026f1efb, 0x01106012, 0x02b964cf, 0x03b6ca9d, 0x03a4baeb, 0x0100a318, 0x034fc38d, 0x001aa474}}, Y: Field{[10]uint32{0x01073260, 0x00075d76, 0x02a00f2b, 0x034729b3, 0x0345f221, 0x034f9cfa, 0x02ead10d, 0x0149d0b4, 0x00836a0b, 0x000c9403}}}, + {X: Field{[10]uint32{0x02c28d61, 0x018330a2, 0x02ee8f77, 0x02772170, 0x00332ae3, 0x038870d1, 0x01c44ab5, 0x025fba5f, 0x0287b11d, 0x00249839}}, Y: Field{[10]uint32{0x0223e778, 0x03a61458, 0x01d1892c, 0x020e8cf9, 0x01c1d13e, 0x03736765, 0x0124f5e2, 0x01953bdc, 0x033de8d8, 0x0003d1f7}}}, + {X: Field{[10]uint32{0x00fe3cba, 0x02410413, 0x03e06a03, 0x030f73e6, 0x00b48820, 0x02d3ca4f, 0x038561f4, 0x03cc07d9, 0x03337a66, 0x000d2439}}, Y: Field{[10]uint32{0x029bbd6c, 0x0281c857, 0x006f1f5e, 0x00d94ca2, 0x02a81695, 0x016eec8a, 0x03876368, 0x01c2b1d3, 0x02797edb, 0x00125646}}}, + {X: Field{[10]uint32{0x0107b4a0, 0x0029a023, 0x03c8a6ec, 0x02049e00, 0x01d71d7a, 0x02a55228, 0x00b1311e, 0x02a68df7, 0x00fe1f47, 0x0025ca7d}}, Y: Field{[10]uint32{0x0317f896, 0x02e2bcba, 0x0386c2dc, 0x01cffa2a, 0x01c8f03d, 0x008bbfa9, 0x03ee569e, 0x03f5ca39, 0x01d4ccc4, 0x0015b869}}}, + {X: Field{[10]uint32{0x029c2caf, 0x036360eb, 0x034b1c37, 0x02d60332, 0x005e694e, 0x0200113c, 0x03d77a66, 0x0108f473, 0x004f06da, 0x002bd8e4}}, Y: Field{[10]uint32{0x03e110b2, 0x006cc1b6, 0x02400f3d, 0x003df1e6, 0x01b8cfaf, 0x029f8bb7, 0x01fa10b4, 0x02e52345, 0x002f5fe2, 0x001b7b37}}}, + {X: Field{[10]uint32{0x00435a3f, 0x00bede8b, 0x031f2f24, 0x03831ede, 0x01403cf0, 0x01f0a53f, 0x0274edf8, 0x007c8688, 0x03721f4a, 0x002589c7}}, Y: Field{[10]uint32{0x025adddf, 0x03d6c872, 0x01e7951c, 0x01deb904, 0x01719400, 0x027dba52, 0x03bbca44, 0x033f54af, 0x00731fc8, 0x0019bfef}}}, + {X: Field{[10]uint32{0x03717c7d, 0x03653292, 0x0296a95b, 0x00f1fb89, 0x00dfa5a1, 0x02ea3658, 0x0027287e, 0x03168056, 0x02151f0c, 0x00290bbc}}, Y: Field{[10]uint32{0x00046fec, 0x0257dad4, 0x03a1ba49, 0x01c82d48, 0x02e32431, 0x0051823b, 0x02969298, 0x029644c8, 0x02d45f08, 0x00179247}}}, + {X: Field{[10]uint32{0x0062e5e4, 0x00b01eee, 0x02c2f7fb, 0x00ac4d6f, 0x00fc4ce9, 0x022f89e0, 0x019c2896, 0x029d5f61, 0x01ede770, 0x00064ecf}}, Y: Field{[10]uint32{0x00716700, 0x0066d7bc, 0x0177522d, 0x01026031, 0x02d1d1d7, 0x02378155, 0x01d5cd13, 0x01cd7828, 0x03baffbb, 0x00064b12}}}, + {X: Field{[10]uint32{0x001e8dc7, 0x0029f3a3, 0x02029e29, 0x02c389d5, 0x02054084, 0x01bfbbcf, 0x03b4fc82, 0x0113933c, 0x0075da6f, 0x00333e68}}, Y: Field{[10]uint32{0x0235a183, 0x02c83266, 0x03a67bf6, 0x0247ffa6, 0x020a5d64, 0x00208671, 0x020f0a23, 0x030c2e40, 0x004dccf2, 0x003413e1}}}, + {X: Field{[10]uint32{0x025b0140, 0x039eb3b4, 0x03831873, 0x02e5b738, 0x00d3ddff, 0x02614c82, 0x00ec69ef, 0x02ed0fd8, 0x025b1d69, 0x001fafa8}}, Y: Field{[10]uint32{0x03ec3d65, 0x00f9f293, 0x01d16fc8, 0x01d62557, 0x002a9483, 0x004e8fce, 0x031a47d0, 0x0358dd53, 0x02f2bf87, 0x00091502}}}, + {X: Field{[10]uint32{0x00a038c7, 0x004718e1, 0x02e45d71, 0x03af5ca6, 0x02674662, 0x00e11e2d, 0x03ff0380, 0x006c066d, 0x034ac2a3, 0x0000327a}}, Y: Field{[10]uint32{0x01f32240, 0x02f77b60, 0x016a6e26, 0x02cca744, 0x0312f6e8, 0x022b90a8, 0x032b90d7, 0x00fd3afb, 0x003dcaed, 0x001f8bb8}}}, + {X: Field{[10]uint32{0x01acd867, 0x03651bf9, 0x007b87fe, 0x00361b15, 0x02cd0b29, 0x03f61ed2, 0x0323bc5c, 0x013a7a9e, 0x020c08c8, 0x00115d5b}}, Y: Field{[10]uint32{0x00acdd1f, 0x0076829c, 0x00413461, 0x00b216c2, 0x0031326e, 0x01f705b4, 0x03984c3d, 0x03005cf6, 0x022ce577, 0x00270fd4}}}, + {X: Field{[10]uint32{0x03e3c0da, 0x0036dfc4, 0x0225ce4a, 0x039c42ae, 0x0359438d, 0x0197891d, 0x009e3416, 0x0358db1e, 0x008121be, 0x0006f561}}, Y: Field{[10]uint32{0x0386a90b, 0x03d0d451, 0x008e7350, 0x035e5627, 0x00ffd4d6, 0x001e1d0c, 0x028a7b75, 0x014e658e, 0x0097bf90, 0x0032c3ae}}}, + {X: Field{[10]uint32{0x01324dc1, 0x01f3b676, 0x00063054, 0x038333e9, 0x0032eda7, 0x01677663, 0x02a80a97, 0x026e9612, 0x022c8e80, 0x003c6655}}, Y: Field{[10]uint32{0x0008d1d0, 0x026b1ead, 0x00f32400, 0x0047374e, 0x022f7ea8, 0x00f28537, 0x01dbcea3, 0x00126252, 0x02ad7643, 0x000cd467}}}, + {X: Field{[10]uint32{0x005ea6f3, 0x00f4f53d, 0x03559674, 0x03a61372, 0x02975319, 0x00162548, 0x02ac3b93, 0x01f707d5, 0x0110e9e3, 0x001fed3a}}, Y: Field{[10]uint32{0x03c960ee, 0x00341399, 0x0062855f, 0x029ef553, 0x005f4d94, 0x038c80f7, 0x02b59bcf, 0x03b273cd, 0x003c0cdb, 0x0002dd28}}}, + {X: Field{[10]uint32{0x006c03e6, 0x03ea7fa2, 0x031364c6, 0x0229ae73, 0x03c1a1d6, 0x0137108c, 0x02270205, 0x0275e2b2, 0x00fd1983, 0x00140f42}}, Y: Field{[10]uint32{0x02448e0a, 0x00def463, 0x02f77589, 0x0355f10d, 0x02698459, 0x01cf48f7, 0x01059144, 0x03ae1ef6, 0x01db9a09, 0x00212b65}}}, + {X: Field{[10]uint32{0x01e1e713, 0x025820d4, 0x02c25091, 0x032390be, 0x0162db42, 0x021c5629, 0x02d0deac, 0x034f8961, 0x0204e6ae, 0x000cd724}}, Y: Field{[10]uint32{0x00c1c2f9, 0x027c2b3d, 0x01ce67ef, 0x01774d06, 0x0049b60c, 0x004bf761, 0x00849d42, 0x02fb8a50, 0x01bb10f8, 0x00056cd6}}}, + {X: Field{[10]uint32{0x0034bc9f, 0x01104d0a, 0x035ef30c, 0x0262738f, 0x00f218c2, 0x01c82ed4, 0x01117df5, 0x00567e08, 0x01cbe0f7, 0x002e9a39}}, Y: Field{[10]uint32{0x00fa5d72, 0x01ef2510, 0x017f3ca5, 0x011dc719, 0x03101ff4, 0x0104a8a1, 0x005a2ede, 0x01393bfd, 0x03dd0ff3, 0x000ab096}}}, + {X: Field{[10]uint32{0x037e6baa, 0x017b0821, 0x03a0a02a, 0x010e8791, 0x03446d79, 0x00e71252, 0x00202677, 0x0210c163, 0x0313311d, 0x0024f5b9}}, Y: Field{[10]uint32{0x001a0856, 0x01a99748, 0x0324fdb5, 0x0055f353, 0x01e10bf6, 0x02d427e7, 0x00710410, 0x03f49b81, 0x019c99a2, 0x001665f0}}}, + {X: Field{[10]uint32{0x03397172, 0x01402917, 0x00c22ac7, 0x009a3b30, 0x00cb8f46, 0x031746da, 0x0284fbe0, 0x01e829ce, 0x001b5cc7, 0x001ea52f}}, Y: Field{[10]uint32{0x0178bee5, 0x03dad341, 0x02cef34a, 0x025405b7, 0x03032d36, 0x02fb7d34, 0x01c9f8c1, 0x0354a9c6, 0x006e82a4, 0x0004a307}}}, + {X: Field{[10]uint32{0x0021b809, 0x00f165b2, 0x01c54c21, 0x00b6eb2b, 0x0375fbe5, 0x01bcf919, 0x02ec848f, 0x020f6517, 0x01a7c193, 0x003c0c7b}}, Y: Field{[10]uint32{0x03cabab8, 0x0031dd88, 0x03ea0517, 0x00dabe5a, 0x01eb505d, 0x0394bc65, 0x001e2e7e, 0x0393d76e, 0x010d1c17, 0x002d29e3}}}, + {X: Field{[10]uint32{0x0039907c, 0x02df5c08, 0x0360857a, 0x01d58329, 0x010ce9f3, 0x01d34065, 0x00cb924c, 0x03820b75, 0x02cd5c17, 0x0021bbc6}}, Y: Field{[10]uint32{0x00f3bb3c, 0x0383b093, 0x03de1ef7, 0x0172731d, 0x0136c310, 0x01b559cf, 0x02d34b10, 0x022b2509, 0x013db907, 0x001a4da8}}}, + {X: Field{[10]uint32{0x03c6d720, 0x005ad832, 0x00bc9409, 0x0324aac4, 0x006d24ee, 0x00a853ee, 0x039beeb6, 0x00e8d526, 0x00c9c78e, 0x003f3adb}}, Y: Field{[10]uint32{0x03f7583d, 0x005e1cdd, 0x0162f08b, 0x024ba9d5, 0x009f8d92, 0x004b2946, 0x03697015, 0x007c7382, 0x00245f56, 0x001f0b98}}}, + {X: Field{[10]uint32{0x03a5c8d9, 0x0084fbb7, 0x00f3ecd2, 0x01b8ec50, 0x00d475e3, 0x02bf90e0, 0x0026d837, 0x03cd207d, 0x011b9a36, 0x0028767b}}, Y: Field{[10]uint32{0x03a558a0, 0x016fc1f7, 0x00c6007d, 0x00ef9aaa, 0x0078bd5e, 0x03a7fb95, 0x002cb779, 0x00fca7b0, 0x017ca127, 0x000da0f2}}}, + {X: Field{[10]uint32{0x01bd48c7, 0x03e43814, 0x03dac844, 0x0269dfac, 0x013e8f62, 0x022bff28, 0x01bbdc75, 0x03b55785, 0x01996311, 0x0036637a}}, Y: Field{[10]uint32{0x00ef2a22, 0x01127ca1, 0x037cc07d, 0x014e5a75, 0x02693943, 0x01de3970, 0x011b8100, 0x023b9da3, 0x014d272a, 0x0022bd86}}}, + {X: Field{[10]uint32{0x019aac60, 0x022e8fea, 0x023edbee, 0x008e625e, 0x0060f4d2, 0x0197e014, 0x031ba80d, 0x03e8a6db, 0x01b7cd6a, 0x001e0ca3}}, Y: Field{[10]uint32{0x02fc5efb, 0x031ea79d, 0x02f01f35, 0x02171265, 0x02629f81, 0x0384d910, 0x023377f4, 0x00eb1204, 0x016f1d14, 0x0038df92}}}, + {X: Field{[10]uint32{0x0336db5e, 0x0347d9b8, 0x02117223, 0x033f36c9, 0x005d9747, 0x02ca7b9b, 0x001e1c09, 0x02bc2cdf, 0x0093031f, 0x000f5c05}}, Y: Field{[10]uint32{0x037600ad, 0x033474f9, 0x008b6648, 0x0316e1fe, 0x03414ea3, 0x02d3a774, 0x01f7ce0a, 0x02c82ad0, 0x01408311, 0x00347a64}}}, + {X: Field{[10]uint32{0x02288628, 0x03dd8ab3, 0x03a96e90, 0x021bf6fd, 0x000e2239, 0x02953b31, 0x015ba2a7, 0x0352ac2f, 0x00c047e0, 0x003d866b}}, Y: Field{[10]uint32{0x001564f2, 0x013b299e, 0x01de68fa, 0x037f3bed, 0x02f9cdcc, 0x039ff07b, 0x016a2d70, 0x017443f2, 0x023de154, 0x003c93ad}}}, + {X: Field{[10]uint32{0x02d0a2d2, 0x02f0032a, 0x03489a1d, 0x00d678be, 0x0291718f, 0x03de5ff3, 0x004a8514, 0x016800cd, 0x01b871f8, 0x00332a02}}, Y: Field{[10]uint32{0x0090b037, 0x0047045a, 0x012f712b, 0x03b4e0a6, 0x03aba642, 0x007d8be5, 0x018f260a, 0x020d6489, 0x02b83565, 0x002df5ca}}}, + {X: Field{[10]uint32{0x01c81958, 0x00fb471f, 0x03eeaa7d, 0x016d4706, 0x01aa26c4, 0x003ee851, 0x034eec03, 0x014076be, 0x0366ee2c, 0x002ef465}}, Y: Field{[10]uint32{0x035250fa, 0x03c6b3f7, 0x03cfeb98, 0x033b0cbb, 0x036c1ca4, 0x01c9110b, 0x030a6e89, 0x0184b9f3, 0x01ff70b3, 0x002f1c27}}}, + {X: Field{[10]uint32{0x001cfadd, 0x01352bfb, 0x025f79c3, 0x03a0e9a2, 0x01ca8f0e, 0x01912a97, 0x03a19381, 0x02065c99, 0x00a0e4a5, 0x001a9bf7}}, Y: Field{[10]uint32{0x02732081, 0x0145fa74, 0x00c36db6, 0x01bf2b6c, 0x006bd7ff, 0x01faf31c, 0x0104298d, 0x01495730, 0x02367658, 0x0030a2c4}}}, + {X: Field{[10]uint32{0x035c8006, 0x014c85b7, 0x00be02c5, 0x00ac05e9, 0x029564af, 0x014bc2b7, 0x03d693de, 0x00688bb9, 0x03e1fd40, 0x000248b8}}, Y: Field{[10]uint32{0x0088f757, 0x03ac7105, 0x004aa3b9, 0x031c82e5, 0x03696841, 0x032a2889, 0x0379e0c5, 0x012902e6, 0x0065aae8, 0x0029ec40}}}, + {X: Field{[10]uint32{0x0276eac8, 0x020be629, 0x01490383, 0x036b5225, 0x03aff8a6, 0x00f2f4ec, 0x02bd9dae, 0x02d54fe4, 0x024e3526, 0x0014ffeb}}, Y: Field{[10]uint32{0x01f8c6f4, 0x0390fb66, 0x03d23cfd, 0x024b115b, 0x009e6652, 0x033a183b, 0x023b2228, 0x0202e0f4, 0x00aeb51f, 0x00207f7f}}}, + {X: Field{[10]uint32{0x0203d119, 0x009e1882, 0x015b9772, 0x031ad574, 0x027c2e70, 0x00a73f92, 0x03e70289, 0x025be274, 0x01d1c945, 0x00052837}}, Y: Field{[10]uint32{0x036dd086, 0x03c7efa5, 0x02e83806, 0x03bed663, 0x007e8c94, 0x00f71956, 0x03e14835, 0x0074777d, 0x0071febe, 0x000ad770}}}, + {X: Field{[10]uint32{0x0168c8f9, 0x0143c78f, 0x03f4dc01, 0x00a9ce7b, 0x00bebe27, 0x032bcee4, 0x01a25428, 0x03cd6ed4, 0x000dfb74, 0x001cda09}}, Y: Field{[10]uint32{0x00a7a27f, 0x02ea17b9, 0x03cd8fd2, 0x01cac572, 0x0321801a, 0x031191a7, 0x00c71687, 0x03a0b9dd, 0x0317b4c5, 0x00254e4a}}}, + {X: Field{[10]uint32{0x00580560, 0x00340408, 0x0079e640, 0x0041ef16, 0x035fbdb6, 0x0105a217, 0x016825e2, 0x02ce748e, 0x0053b9ea, 0x001302a0}}, Y: Field{[10]uint32{0x03db5427, 0x02a5eef5, 0x002f093c, 0x0099820f, 0x02f5a6f8, 0x01022de7, 0x03f67f65, 0x0394c985, 0x02a75b7d, 0x00216888}}}, + {X: Field{[10]uint32{0x01dabbf8, 0x00c814cf, 0x00a1e91e, 0x01abd5e4, 0x026751a2, 0x00cf7f2c, 0x01447a49, 0x03e2b2f6, 0x02a824a6, 0x00328359}}, Y: Field{[10]uint32{0x01395d18, 0x003cca5e, 0x016b2155, 0x0020297c, 0x036f7d7d, 0x03bc0790, 0x01fd49b1, 0x00211447, 0x018d4f8b, 0x00187322}}}, + {X: Field{[10]uint32{0x01e9d6d4, 0x01629b95, 0x03a76453, 0x03dcd572, 0x01a3d7df, 0x031fec20, 0x020763b5, 0x01a8db54, 0x0375e62f, 0x00191a81}}, Y: Field{[10]uint32{0x037dbbb4, 0x006807de, 0x026f7a6b, 0x011b85f1, 0x01b11000, 0x00b24dbe, 0x01b23662, 0x00299083, 0x0044e738, 0x000f94a2}}}, + {X: Field{[10]uint32{0x0055d070, 0x000c00d9, 0x007f2303, 0x00faa044, 0x01bac77f, 0x0014b69c, 0x02d7c477, 0x02f04c50, 0x01ecf3d6, 0x0010d559}}, Y: Field{[10]uint32{0x00c9f6bd, 0x027ad369, 0x02d159fa, 0x01706ba5, 0x03ab6edc, 0x027c31c3, 0x03ca8f6c, 0x023658d0, 0x009689fd, 0x0013b54a}}}, + {X: Field{[10]uint32{0x03aa8f9d, 0x029d82e4, 0x0316fff6, 0x02b000dc, 0x037a014a, 0x018171a4, 0x01f22fee, 0x01512a94, 0x00969328, 0x00362c06}}, Y: Field{[10]uint32{0x0206edf3, 0x03dc964e, 0x020ac989, 0x020b9318, 0x01dd4127, 0x00525ed7, 0x0160719c, 0x01e6b4db, 0x0242a2b8, 0x0018fd47}}}, + {X: Field{[10]uint32{0x023d48d7, 0x039511b5, 0x0399a21e, 0x02ed1fc1, 0x0283a30a, 0x03c60b97, 0x02f6f2b6, 0x00c14a52, 0x01504a9b, 0x002e51d6}}, Y: Field{[10]uint32{0x002fb876, 0x0241a243, 0x01018042, 0x01f0d2b8, 0x02968027, 0x038d62b5, 0x03896769, 0x0266fde6, 0x002837a8, 0x0032f1d0}}}, + {X: Field{[10]uint32{0x038e0ef0, 0x01a89c7f, 0x02f0fc3e, 0x019c6c98, 0x01d521b4, 0x0121084d, 0x0201b5e3, 0x0356fb16, 0x00492972, 0x00050c5f}}, Y: Field{[10]uint32{0x02069381, 0x02419470, 0x006cfc20, 0x027930d2, 0x01d318e7, 0x036d20f6, 0x02a476a7, 0x033f48b9, 0x0235d1ce, 0x00331348}}}, + {X: Field{[10]uint32{0x0144f8c6, 0x03753927, 0x005f8fcd, 0x01cd3a57, 0x0278c4b8, 0x0224a354, 0x0062ab33, 0x019fd13c, 0x03575b68, 0x0022ef6c}}, Y: Field{[10]uint32{0x0173a778, 0x025fccd4, 0x019fa90b, 0x028bb86d, 0x021279ec, 0x01f40398, 0x01a67e6c, 0x01015301, 0x03873242, 0x0034e34c}}}, + {X: Field{[10]uint32{0x006aa685, 0x002c643c, 0x014761ab, 0x03e53b4c, 0x03380b00, 0x0265b035, 0x0279786b, 0x02f9e024, 0x02f636ec, 0x001ddd7f}}, Y: Field{[10]uint32{0x0355407b, 0x025bafcb, 0x018e12a9, 0x014cae0c, 0x00342431, 0x02e21711, 0x0257d7fc, 0x03596773, 0x0273162d, 0x0014c54a}}}, + {X: Field{[10]uint32{0x01693b48, 0x0247030e, 0x0242ba74, 0x02955143, 0x00bc9b0e, 0x0279cbed, 0x02649502, 0x038ddef2, 0x03d139eb, 0x0036d792}}, Y: Field{[10]uint32{0x005a0abb, 0x025399b3, 0x00e62141, 0x003af6f9, 0x00416ca2, 0x00e209f7, 0x037ceb32, 0x025ab68c, 0x0113a5a7, 0x002991a0}}}, + {X: Field{[10]uint32{0x01c619eb, 0x013fc47c, 0x020fc241, 0x00c5c255, 0x016ebf06, 0x03c1a73c, 0x0011be39, 0x014b8bab, 0x03b0578c, 0x003aac15}}, Y: Field{[10]uint32{0x01023f67, 0x036d157f, 0x01f750cd, 0x03386031, 0x006fb041, 0x030b787a, 0x00e5c6c3, 0x02e2a116, 0x023fcf69, 0x00150880}}}, + {X: Field{[10]uint32{0x03f5e44c, 0x00460ff9, 0x02fe6d02, 0x00c90639, 0x02c231ba, 0x01944ccf, 0x02d43cc0, 0x035845f8, 0x00d3c657, 0x003a557f}}, Y: Field{[10]uint32{0x028e6b57, 0x008a3d20, 0x02369cfe, 0x03f2cb8d, 0x02973095, 0x0311b176, 0x014953a4, 0x00bc9c91, 0x02986521, 0x003743aa}}}, + {X: Field{[10]uint32{0x002d8e49, 0x01fe46c1, 0x027a72a0, 0x01cfabec, 0x03ec0f5e, 0x00759817, 0x011f596f, 0x03f0c30c, 0x005758ea, 0x0017d68f}}, Y: Field{[10]uint32{0x01cdf1a2, 0x00fbca97, 0x0090ccf2, 0x017a132a, 0x01c6d9f5, 0x02914dbd, 0x005a04aa, 0x02cbaa76, 0x00b01d1f, 0x0000f378}}}, + {X: Field{[10]uint32{0x00b99bab, 0x00b64902, 0x019c0757, 0x03c9ab48, 0x0049c82c, 0x0012bc46, 0x03fbd7ae, 0x03787bbf, 0x01e4ff0a, 0x003ede8c}}, Y: Field{[10]uint32{0x01df2a01, 0x00ac1fcc, 0x0345a550, 0x00b01cd8, 0x039e6910, 0x03918f75, 0x006bc4eb, 0x0395fbba, 0x020c431d, 0x003aa1ea}}}, + {X: Field{[10]uint32{0x03ae1ffb, 0x005de352, 0x02b44e41, 0x00f79ac8, 0x036ec18d, 0x020fb8e8, 0x01f8dd96, 0x01dde52e, 0x016aa3e8, 0x00355ec7}}, Y: Field{[10]uint32{0x000f62ee, 0x0235eaf7, 0x008ca73f, 0x015c08b6, 0x009fcb9e, 0x00f32ebb, 0x01adb0e4, 0x034bc027, 0x02d6b85b, 0x00095bff}}}, + {X: Field{[10]uint32{0x03b8f1a6, 0x02b15232, 0x00b5bbd6, 0x00cb1c2f, 0x030f7268, 0x020da5ec, 0x00fc90e1, 0x0128e3bc, 0x0052d3a2, 0x0024c9bf}}, Y: Field{[10]uint32{0x02889a2b, 0x01629bc4, 0x0330801a, 0x03095355, 0x00d7d766, 0x0267ebea, 0x01176f5c, 0x00afab48, 0x00a0cc0a, 0x00218ef4}}}, + {X: Field{[10]uint32{0x013caff4, 0x01e6d2ea, 0x036da360, 0x0354c4fb, 0x03d5d310, 0x0082b421, 0x0217e946, 0x02d7995d, 0x00d5abc9, 0x00160d8b}}, Y: Field{[10]uint32{0x022fc52f, 0x012350bd, 0x021c03da, 0x03cf098b, 0x03d6923c, 0x0390c88c, 0x03b673b2, 0x02ef635c, 0x00044e86, 0x00017ca9}}}, + {X: Field{[10]uint32{0x001738ee, 0x03f3a061, 0x03681034, 0x01a5fa68, 0x01b8c4cd, 0x02cc6358, 0x001b3a96, 0x039a3c38, 0x00b9cd06, 0x001f7522}}, Y: Field{[10]uint32{0x019782cf, 0x0267af82, 0x0010f34a, 0x03414998, 0x00d963de, 0x00f4a4a8, 0x0370846a, 0x03225f2d, 0x01ed0130, 0x003f5ea9}}}, + {X: Field{[10]uint32{0x00fe798d, 0x01419003, 0x0061df95, 0x0091aea0, 0x011fa2a3, 0x00ed05c1, 0x030d7d5a, 0x005550cc, 0x0302524c, 0x0026fde2}}, Y: Field{[10]uint32{0x00cf5a83, 0x009d5224, 0x00f48104, 0x0215da59, 0x00c7d063, 0x02d08672, 0x01d5a703, 0x01a0075e, 0x03d66d2e, 0x00167d4d}}}, + {X: Field{[10]uint32{0x02b3fc47, 0x00f70d83, 0x03c39366, 0x02dbbbaf, 0x00e71513, 0x02ef5b47, 0x01b4f879, 0x03572c63, 0x0173743a, 0x0013205a}}, Y: Field{[10]uint32{0x0141105f, 0x010b6243, 0x00254ab1, 0x03af545b, 0x0044c6f8, 0x0003e594, 0x033ef09f, 0x025002a4, 0x02ac37a4, 0x00069b71}}}, + {X: Field{[10]uint32{0x01051be8, 0x00715bec, 0x031a835c, 0x0169fc00, 0x00173f4e, 0x003ce89b, 0x02964084, 0x018d0d64, 0x03c2c748, 0x001818da}}, Y: Field{[10]uint32{0x03e88e8b, 0x03763d76, 0x01b08541, 0x01adf3e0, 0x020efc2e, 0x0346f95b, 0x024190b0, 0x00af25c2, 0x037a3aed, 0x001c69e2}}}, + {X: Field{[10]uint32{0x03f8d00a, 0x01e83cc1, 0x00a2f004, 0x00dd0329, 0x03122115, 0x03579b34, 0x0263fc94, 0x0029c1b1, 0x02dec3e9, 0x0029b9dc}}, Y: Field{[10]uint32{0x00eed520, 0x029f1cf4, 0x032ca76b, 0x00875e30, 0x00f10902, 0x002a87ae, 0x02175a81, 0x01c60529, 0x021f5c72, 0x00096e3f}}}, + {X: Field{[10]uint32{0x00b89262, 0x00c9395f, 0x026c9019, 0x004c598c, 0x031692f6, 0x02a2feeb, 0x03b4b2aa, 0x01c857ea, 0x013c6030, 0x001e7199}}, Y: Field{[10]uint32{0x02197bcb, 0x039fb4b4, 0x028f8db1, 0x00f08138, 0x03c24eaa, 0x0025572f, 0x0379da4c, 0x02525b8a, 0x0112b6b4, 0x000db57b}}}, + {X: Field{[10]uint32{0x0246cb15, 0x02a151b5, 0x0242ed4b, 0x013aaaf6, 0x034a2bdb, 0x03911530, 0x0374af4c, 0x03eb7b51, 0x032e4530, 0x000fd55a}}, Y: Field{[10]uint32{0x00fd25c3, 0x00a4e27b, 0x039e0588, 0x0360e5f3, 0x02c9fd04, 0x01717138, 0x028996bf, 0x010cc4ef, 0x03211ce8, 0x002eac74}}}, + {X: Field{[10]uint32{0x03b3913a, 0x009cedcf, 0x01dd93b7, 0x00abce18, 0x02d645c5, 0x03dcc7f8, 0x011e0fbc, 0x03fa7d78, 0x02238d21, 0x003b6966}}, Y: Field{[10]uint32{0x012bbfee, 0x006e6a1c, 0x02562416, 0x015d032c, 0x03d3cea8, 0x01d6dfad, 0x0029c06d, 0x0082e0b3, 0x03014ba3, 0x0008bc8b}}}, + {X: Field{[10]uint32{0x01e68548, 0x02909e5f, 0x02cb0c42, 0x00aea7d8, 0x033a2bea, 0x01c753c0, 0x0158adf0, 0x03ed3cda, 0x0277323d, 0x0001e87a}}, Y: Field{[10]uint32{0x024825a0, 0x030fc809, 0x01940f6c, 0x0147dbd0, 0x006d2d7f, 0x00984c63, 0x036f9766, 0x00ad7689, 0x0225ee7a, 0x001219b3}}}, + {X: Field{[10]uint32{0x0323de2a, 0x0330f668, 0x00178a0e, 0x023d8b57, 0x0233d102, 0x02421db8, 0x027c51d5, 0x035b42eb, 0x013aad62, 0x0002b43f}}, Y: Field{[10]uint32{0x003b0601, 0x0100e082, 0x02787a6d, 0x01f7b660, 0x01d16315, 0x01e4b5d8, 0x034a64eb, 0x011a7d53, 0x00c59672, 0x00223809}}}, + {X: Field{[10]uint32{0x002729d3, 0x001b3718, 0x00dfd207, 0x01c6358d, 0x03ee7437, 0x02e12972, 0x016e9d67, 0x0129a55b, 0x0032f404, 0x0006fc65}}, Y: Field{[10]uint32{0x00516aa9, 0x00710c1f, 0x0292263d, 0x0270fe93, 0x034f2acd, 0x01b0dfa6, 0x02f8e3e1, 0x028681d7, 0x0200afb6, 0x0010452c}}}, + {X: Field{[10]uint32{0x0121d93b, 0x008130b8, 0x019afc35, 0x017c4b48, 0x012fb1af, 0x0002da53, 0x023b9d5f, 0x036bea2f, 0x02f20bc2, 0x00145185}}, Y: Field{[10]uint32{0x022eaf9c, 0x01cb33e4, 0x0058a740, 0x02dc1140, 0x0257ba8e, 0x0196b6fc, 0x03f4e0a0, 0x00a673d9, 0x0253608a, 0x000f973b}}}, + {X: Field{[10]uint32{0x0121a661, 0x000b685a, 0x01a1c3b0, 0x00c1aa38, 0x00fdc423, 0x033fcd39, 0x0321d181, 0x03b4c64d, 0x00e85338, 0x00238ffb}}, Y: Field{[10]uint32{0x00f686d2, 0x01993e08, 0x03b2e077, 0x010e2ccc, 0x03128945, 0x032b267b, 0x02dfc249, 0x0121ad9d, 0x034b6736, 0x002c255c}}}, + {X: Field{[10]uint32{0x03ad4447, 0x0350e329, 0x03355916, 0x02682b98, 0x016db1eb, 0x0362882e, 0x00421867, 0x007b4a4a, 0x0020df10, 0x0011b01a}}, Y: Field{[10]uint32{0x01f1afa9, 0x031eaf37, 0x0226f9ac, 0x01606f3f, 0x01d7d439, 0x0051ed4d, 0x00d1b601, 0x02dcff12, 0x00f4059b, 0x003f2a84}}}, + {X: Field{[10]uint32{0x03722b31, 0x031f6ff3, 0x02dba0fe, 0x01a470bb, 0x013fff8c, 0x02cdebdc, 0x001e406a, 0x00e42ac0, 0x01f71f9b, 0x00158cd3}}, Y: Field{[10]uint32{0x026707dc, 0x01082f1c, 0x006904af, 0x031011d1, 0x038a3724, 0x01269b24, 0x03c4b0bf, 0x03055a9c, 0x0394340d, 0x0008b410}}}, + {X: Field{[10]uint32{0x00a67c4f, 0x020998c3, 0x03d37cb8, 0x03e86d72, 0x03b2fd55, 0x03294b48, 0x03e3dc97, 0x017e3276, 0x006d8904, 0x00080b89}}, Y: Field{[10]uint32{0x017a62b1, 0x039ec828, 0x033659a2, 0x038d44f2, 0x027a6241, 0x0116201c, 0x01f661ec, 0x03c08c72, 0x03899cbc, 0x003d39b3}}}, + {X: Field{[10]uint32{0x039bd4d5, 0x008e7a66, 0x0009dece, 0x01735979, 0x03c56b63, 0x00d54bbf, 0x03c1ff94, 0x0070b3d6, 0x02e01021, 0x00320153}}, Y: Field{[10]uint32{0x03f31057, 0x008a09c5, 0x0046b46e, 0x034419e3, 0x010bf1eb, 0x02e152c1, 0x02842b43, 0x0072f379, 0x01af5160, 0x003d4145}}}, + {X: Field{[10]uint32{0x00438383, 0x00954e05, 0x004f51c6, 0x02b95be6, 0x01ea3282, 0x02e5c068, 0x01407084, 0x02d86b4a, 0x008c235e, 0x00270a5e}}, Y: Field{[10]uint32{0x0359ead7, 0x01c3b125, 0x0286c2ab, 0x010a6774, 0x00c116cc, 0x02b4c38c, 0x02469db4, 0x03bcb88d, 0x02ecefdb, 0x000c8447}}}, + {X: Field{[10]uint32{0x01a57ef8, 0x005d1706, 0x009e74bc, 0x008cd9d4, 0x02729990, 0x02530f35, 0x028dc86f, 0x030e51c1, 0x00d0b7b5, 0x0016153a}}, Y: Field{[10]uint32{0x023eb98d, 0x02dd72e9, 0x005f2345, 0x001505f5, 0x00edafec, 0x03834b4f, 0x00c41134, 0x02faf7d4, 0x01c50c06, 0x001f9e40}}}, + {X: Field{[10]uint32{0x033fef34, 0x03ea247d, 0x010b74d0, 0x03767239, 0x011104a5, 0x0151e913, 0x0046e1b3, 0x039e2681, 0x03f0f45b, 0x0022ecbf}}, Y: Field{[10]uint32{0x03b182c1, 0x02a45cdc, 0x03a7935d, 0x037dc888, 0x03efb979, 0x00e0fdd9, 0x0171e2bc, 0x00fa99b1, 0x0365a534, 0x0030ccb8}}}, + {X: Field{[10]uint32{0x00cd209e, 0x022d5863, 0x033c45ad, 0x015b71cc, 0x02992f56, 0x02d90f36, 0x0165faac, 0x00ce1e18, 0x02656ee4, 0x0003aa23}}, Y: Field{[10]uint32{0x01f0f909, 0x02a0e897, 0x006f1fd0, 0x012a10e6, 0x02af9f4f, 0x0115c971, 0x03357ab8, 0x00d0f62a, 0x00d64a7a, 0x0030e310}}}, + {X: Field{[10]uint32{0x0046295a, 0x0075aa51, 0x01ff6698, 0x02e33236, 0x02a3b18a, 0x00352e8a, 0x0322c2ee, 0x01fa984c, 0x00df857c, 0x00303075}}, Y: Field{[10]uint32{0x0172b981, 0x00bf8167, 0x02918729, 0x0123aede, 0x029a2846, 0x0326f91a, 0x02ae1dbe, 0x03bdf739, 0x01d10e8e, 0x00091c45}}}, + {X: Field{[10]uint32{0x007fc72a, 0x0380a33b, 0x0265db74, 0x0049e4ae, 0x0267b8e2, 0x02dc8faf, 0x0008d8dd, 0x00d800aa, 0x00f9407d, 0x002479a9}}, Y: Field{[10]uint32{0x005721ba, 0x0394104f, 0x0299547e, 0x02ed1e92, 0x0212e57d, 0x00841b82, 0x00e98f7b, 0x022fa173, 0x016035f5, 0x003bdab9}}}, + {X: Field{[10]uint32{0x03208454, 0x0253823e, 0x03078187, 0x000b8873, 0x0224a7a4, 0x020340d9, 0x015cf613, 0x0074d8a6, 0x02189a8c, 0x00335d25}}, Y: Field{[10]uint32{0x03af0bd9, 0x00b17b72, 0x024f6ba0, 0x00bc748e, 0x022dd6ba, 0x022bf2ae, 0x03debcf8, 0x03e44a80, 0x02be15d1, 0x003cf724}}}, + {X: Field{[10]uint32{0x02943018, 0x01d4bfe0, 0x015e9f71, 0x0196bc28, 0x0285f630, 0x013ac929, 0x004f3fa4, 0x0239c30c, 0x012d02e6, 0x00267d74}}, Y: Field{[10]uint32{0x020b8a9e, 0x01a37076, 0x01dfb611, 0x020091b5, 0x01dff9f9, 0x0028a5ec, 0x03962c9c, 0x02fccda3, 0x021ad97e, 0x00167c64}}}, + {X: Field{[10]uint32{0x01f7608f, 0x03580aee, 0x02dff7b3, 0x036e77ae, 0x01a6ac02, 0x01745c64, 0x0256b1e7, 0x01c25845, 0x0130f9c0, 0x0018f1b3}}, Y: Field{[10]uint32{0x021083f0, 0x00fffbd1, 0x017234b7, 0x03d03b9c, 0x006d8b1e, 0x02add6f9, 0x025f0a13, 0x006e3f83, 0x037370a4, 0x000b90e4}}}, + {X: Field{[10]uint32{0x01184d92, 0x0357a5d7, 0x01e9394c, 0x011c602c, 0x019e04fe, 0x01f9b06c, 0x037fc551, 0x03a84766, 0x032690a5, 0x002dd01f}}, Y: Field{[10]uint32{0x013de6d2, 0x0233df54, 0x0301aaed, 0x0200f835, 0x03828ee8, 0x0299e5b9, 0x020f7277, 0x012611d0, 0x012947dd, 0x0006e54e}}}, + {X: Field{[10]uint32{0x0383fd40, 0x03e69b78, 0x02297150, 0x023761ad, 0x02c29ce4, 0x01e94015, 0x0121e962, 0x02210375, 0x0116161c, 0x000925e4}}, Y: Field{[10]uint32{0x00b9a70b, 0x03826c0a, 0x03649143, 0x010fdee8, 0x0076f999, 0x03ec5992, 0x00d3e325, 0x0273dce1, 0x01ab3dd6, 0x0004f75c}}}, + {X: Field{[10]uint32{0x01d73b7d, 0x037a3dfe, 0x0196b6f2, 0x00651943, 0x030b4199, 0x03210542, 0x016c80d4, 0x02c9e219, 0x02c36122, 0x003c426d}}, Y: Field{[10]uint32{0x011c96ac, 0x03ab575e, 0x01c77142, 0x01ad284f, 0x01bd971f, 0x02525be1, 0x0291d4a3, 0x03553702, 0x0369bef8, 0x0029d15c}}}, + {X: Field{[10]uint32{0x01118df9, 0x038edb5a, 0x015169f0, 0x000289ad, 0x0136be99, 0x03ef42b0, 0x017c9297, 0x030dc13c, 0x03f82031, 0x00166cc0}}, Y: Field{[10]uint32{0x03d678c3, 0x0197af4b, 0x01e02d6c, 0x01b431a5, 0x01983030, 0x00d41a30, 0x008c936b, 0x009c696b, 0x00dd1666, 0x000c31f1}}}, + {X: Field{[10]uint32{0x0062fc52, 0x00e5d3b5, 0x02cd6602, 0x006b4afd, 0x01a67862, 0x01ee2132, 0x0254cd6c, 0x00436d2e, 0x019aeb39, 0x001989cd}}, Y: Field{[10]uint32{0x0110d487, 0x03115f6a, 0x010b2555, 0x0377a93d, 0x00feab83, 0x024de5de, 0x00867347, 0x01e29ff1, 0x01bad2de, 0x002f2f3e}}}, + {X: Field{[10]uint32{0x0151f1d9, 0x009e16b7, 0x0281e921, 0x00104610, 0x00ec7efc, 0x003a062b, 0x01d23059, 0x0141f672, 0x0180c4fb, 0x001dbf6b}}, Y: Field{[10]uint32{0x03a8c346, 0x03b376f8, 0x0119a18c, 0x0035ff27, 0x039b88b7, 0x01566156, 0x00adf7ef, 0x03cc1fcd, 0x03cc349c, 0x00332331}}}, + {X: Field{[10]uint32{0x01313330, 0x00ede478, 0x00700b98, 0x032d30a2, 0x037f2380, 0x02a6ebf6, 0x03ed9cc4, 0x03c2294b, 0x0006e99c, 0x0001e24d}}, Y: Field{[10]uint32{0x0111d149, 0x03e02bc9, 0x0007450e, 0x00ede96e, 0x00d0c2e8, 0x02f56e3b, 0x001acd3f, 0x03f96b42, 0x01af39ea, 0x003b0578}}}, + {X: Field{[10]uint32{0x038c81d5, 0x02c6e820, 0x039ff3bb, 0x033760e8, 0x01018f16, 0x003a0d3d, 0x013c229d, 0x0084cfb6, 0x02a4e8d0, 0x00031152}}, Y: Field{[10]uint32{0x03ac51f0, 0x00ecea1c, 0x01f5c67e, 0x039b7afd, 0x018af57b, 0x00a69b96, 0x00959245, 0x00e023d2, 0x01cf89c4, 0x002a6398}}}, + {X: Field{[10]uint32{0x02402880, 0x002d845c, 0x0327bf99, 0x03b8e55e, 0x0097dac1, 0x0108e404, 0x02ba8f96, 0x03048b74, 0x021ccbe5, 0x003fc2f0}}, Y: Field{[10]uint32{0x03bca50a, 0x0334e59d, 0x020da467, 0x03dc14a5, 0x01ecd634, 0x039117b0, 0x00cd5f89, 0x00860635, 0x009c1f7b, 0x00030d02}}}, + {X: Field{[10]uint32{0x0331c301, 0x00789e4d, 0x0373586f, 0x03a74fad, 0x003a0e61, 0x004ade3c, 0x0132e398, 0x0108ef60, 0x02e349a0, 0x00239121}}, Y: Field{[10]uint32{0x022053a1, 0x01ee6ca6, 0x0083ca8a, 0x02130422, 0x0116bbf0, 0x037088bb, 0x021866f4, 0x0098354b, 0x00d437cc, 0x00225ec9}}}, + {X: Field{[10]uint32{0x01c579e7, 0x03e96d13, 0x03584590, 0x01b04e11, 0x010bf7fb, 0x00d44227, 0x00a30d20, 0x0313a5ab, 0x017f84f5, 0x0013d329}}, Y: Field{[10]uint32{0x01e63a9e, 0x0094396b, 0x010b717d, 0x01d63ca3, 0x01336349, 0x0286e46a, 0x031cb1f8, 0x0155b0db, 0x03dc1691, 0x00354f6d}}}, + {X: Field{[10]uint32{0x03c203bb, 0x002ab633, 0x02423c76, 0x01bce22d, 0x0279b3a9, 0x02bb63ee, 0x00618300, 0x013ea417, 0x00b2d7a2, 0x003fa249}}, Y: Field{[10]uint32{0x00b056be, 0x033a8cb4, 0x0026a7e3, 0x02103ea3, 0x00e92c37, 0x02c5f82b, 0x0279df9c, 0x0038afd3, 0x0229c6be, 0x002f4c0f}}}, + {X: Field{[10]uint32{0x006abb5d, 0x03345371, 0x03fc5dcd, 0x028cc83c, 0x03008ed9, 0x014be66c, 0x005895d1, 0x031cbe1a, 0x035cf6a8, 0x000c267d}}, Y: Field{[10]uint32{0x02fc9f1c, 0x0082cba9, 0x000bc6fc, 0x0313038b, 0x0304a939, 0x02a570a9, 0x038a32c2, 0x014a7289, 0x002aec76, 0x003eed6f}}}, + {X: Field{[10]uint32{0x0072f4eb, 0x0170b727, 0x004b9741, 0x0088ab0e, 0x03432443, 0x00901727, 0x0232de01, 0x009bced9, 0x0383f841, 0x000ee4e7}}, Y: Field{[10]uint32{0x005607fb, 0x030932bc, 0x0255f1d3, 0x031fd22f, 0x01c1e602, 0x00e84e2d, 0x014cc202, 0x010e03a7, 0x0353ec45, 0x00210edc}}}, + {X: Field{[10]uint32{0x01c732d8, 0x03191b65, 0x009327b0, 0x025f5b4c, 0x00b032f1, 0x00e12a4e, 0x023cbc06, 0x038d1772, 0x02a04a50, 0x00371d41}}, Y: Field{[10]uint32{0x03d5772a, 0x0378e766, 0x039eae8d, 0x013ad88f, 0x01c6a39d, 0x0345bd0f, 0x039559a3, 0x02758a67, 0x0311f6d4, 0x003fa508}}}, + {X: Field{[10]uint32{0x03b30dea, 0x03483aa0, 0x01433f84, 0x03ed2af2, 0x003dde68, 0x01c875d7, 0x02fb61a2, 0x01a8d45c, 0x0196c699, 0x003d6931}}, Y: Field{[10]uint32{0x01f26572, 0x01a02ee7, 0x018e35ae, 0x00c3bdf7, 0x02fd783b, 0x034c2e58, 0x02ef9220, 0x03d8eeec, 0x013e77d2, 0x0005d783}}}, + {X: Field{[10]uint32{0x02a4029e, 0x02f87e6b, 0x03133cb9, 0x01a4098b, 0x01373c2f, 0x03de7d2c, 0x01222ae2, 0x00127f97, 0x00e2c499, 0x001fa40e}}, Y: Field{[10]uint32{0x0025c737, 0x01bccae0, 0x03dfe714, 0x012c888e, 0x031d7dc6, 0x015428d8, 0x00162766, 0x00d6f038, 0x026a3433, 0x000d64b9}}}, + {X: Field{[10]uint32{0x022b1f41, 0x01227ffd, 0x0050f0af, 0x00eb6482, 0x02e2cb80, 0x03e643ad, 0x0028e921, 0x03f1bf5b, 0x0373d16b, 0x00203c8b}}, Y: Field{[10]uint32{0x03503b28, 0x02f5df9e, 0x02d682a1, 0x00471c9b, 0x00370e67, 0x0133d360, 0x03e11fd2, 0x01d2f01c, 0x01d3c5ee, 0x0021c529}}}, + {X: Field{[10]uint32{0x020c897d, 0x021efebf, 0x03535fc8, 0x001f6748, 0x03007c31, 0x02e5bf82, 0x0070a58a, 0x014fe10d, 0x02e9e86e, 0x0012628a}}, Y: Field{[10]uint32{0x0001bb53, 0x033b4e99, 0x0209ec3c, 0x02754ee1, 0x037ec380, 0x02acc207, 0x020f6516, 0x01078509, 0x02b373e8, 0x0011eaa7}}}, + {X: Field{[10]uint32{0x033a010e, 0x0377cc0e, 0x03b6d960, 0x026a009d, 0x028e9c06, 0x029e31d1, 0x012c5427, 0x03861329, 0x024cd14c, 0x001806bd}}, Y: Field{[10]uint32{0x02b7fa18, 0x00734833, 0x00d59916, 0x026c00ef, 0x0156dd57, 0x00b21fbd, 0x0346c273, 0x01db4046, 0x023fca15, 0x000a4029}}}, + {X: Field{[10]uint32{0x0174a25b, 0x00d07fcb, 0x019849a1, 0x03c41775, 0x03957f2b, 0x008aa9a0, 0x018b06a8, 0x032f12b5, 0x00f07b2f, 0x0023ecb8}}, Y: Field{[10]uint32{0x01070aa4, 0x01a32d1d, 0x016e6b7c, 0x032427db, 0x0306137d, 0x0357e0ab, 0x03386f75, 0x01f3aac6, 0x03508d79, 0x001f3608}}}, + {X: Field{[10]uint32{0x0269e6d9, 0x03962bda, 0x0282c9bd, 0x02bebbcc, 0x0083468e, 0x01cb18ef, 0x01a14980, 0x0053a2d5, 0x000f0e9d, 0x000cdb5e}}, Y: Field{[10]uint32{0x023d2261, 0x008c8529, 0x00fb00b7, 0x01e7d3f8, 0x02ac3e66, 0x03f4061e, 0x02eba682, 0x02fb9ae3, 0x0004be45, 0x00024b44}}}, + {X: Field{[10]uint32{0x00d5872d, 0x011fbea4, 0x021a5e4e, 0x000f338f, 0x02b06343, 0x02c0eaba, 0x00d2cbdf, 0x021c113e, 0x0321f4d5, 0x00141eb1}}, Y: Field{[10]uint32{0x007174d9, 0x0348b20c, 0x02f0e917, 0x0254e72a, 0x009ba53c, 0x01ee0f58, 0x00550939, 0x00175e84, 0x018de7db, 0x002e268e}}}, + {X: Field{[10]uint32{0x033ba343, 0x01a22a51, 0x009a046e, 0x0132fa86, 0x00992c60, 0x019b004b, 0x0171026f, 0x03ee58a4, 0x02c13bb7, 0x00310b73}}, Y: Field{[10]uint32{0x014f7bb5, 0x007380b9, 0x0064be3c, 0x03b00d4d, 0x018fe010, 0x0104e4a7, 0x021bfe7c, 0x008f2e80, 0x0331a532, 0x0022a8dd}}}, + {X: Field{[10]uint32{0x02866a2c, 0x010651ca, 0x00417d9f, 0x02d9400e, 0x00857eed, 0x03144212, 0x026b5c45, 0x024e8b57, 0x02c3cd60, 0x002c0ba8}}, Y: Field{[10]uint32{0x03a5527c, 0x027049cb, 0x01bf86ac, 0x03a31d69, 0x03ed1d8e, 0x033f3a4e, 0x037c5058, 0x0243186e, 0x0050cea1, 0x003aed17}}}, + {X: Field{[10]uint32{0x0370d84b, 0x005f117b, 0x02db151e, 0x010566df, 0x0185626d, 0x03aad0ed, 0x03dc2c9a, 0x03b4b89c, 0x03d29f20, 0x003d3464}}, Y: Field{[10]uint32{0x02dd0974, 0x03946586, 0x027e7280, 0x01b1847a, 0x0101f84b, 0x0133695e, 0x013f8cf1, 0x00d28b12, 0x023f19b8, 0x002f6866}}}, + {X: Field{[10]uint32{0x025f1bb0, 0x01fed93f, 0x02857eef, 0x02ec7fdb, 0x03cc84f6, 0x0340c0b4, 0x0059b9e4, 0x0318add6, 0x00eb19ea, 0x0021d037}}, Y: Field{[10]uint32{0x03c6ca49, 0x023eda39, 0x01d1b1d9, 0x03780522, 0x00f2f151, 0x03ad4887, 0x01d5b6e7, 0x008168b8, 0x02b04783, 0x00029ca7}}}, + {X: Field{[10]uint32{0x00fcc9cb, 0x017a88e1, 0x03f6c92a, 0x0098da4e, 0x0050aec6, 0x011273a2, 0x010bc940, 0x027c2364, 0x024a85a2, 0x001e7b11}}, Y: Field{[10]uint32{0x02f53b39, 0x039a3a83, 0x03a2cd44, 0x01131896, 0x03a1d7c5, 0x0216aeb8, 0x02d476d0, 0x0342ca6a, 0x00f5b52e, 0x001df45c}}}, + {X: Field{[10]uint32{0x0207fceb, 0x03bf338c, 0x01238847, 0x03011622, 0x006fb3aa, 0x0157abf5, 0x000e29b2, 0x02edc72f, 0x00d5dd54, 0x0013c406}}, Y: Field{[10]uint32{0x03e7dd8c, 0x00bd938e, 0x0222224a, 0x0364b505, 0x03a64531, 0x01c7ef8e, 0x029b2a02, 0x030b9dce, 0x01e5d23c, 0x0030ca06}}}, + {X: Field{[10]uint32{0x03e969a1, 0x00181efe, 0x00eb033a, 0x02ae05e0, 0x00e53768, 0x032a1735, 0x0325de68, 0x03a17f76, 0x01362094, 0x0037efc6}}, Y: Field{[10]uint32{0x0380e563, 0x025f876b, 0x0067193d, 0x02eb82df, 0x00a2ca3a, 0x00cb7af3, 0x005f1e49, 0x00870cab, 0x035933ba, 0x00097a82}}}, + {X: Field{[10]uint32{0x01226649, 0x02ed06a1, 0x034f9b67, 0x01c41505, 0x010940a3, 0x02184912, 0x01805f10, 0x01a20cb0, 0x02c002c3, 0x00061319}}, Y: Field{[10]uint32{0x00662eaf, 0x03fb1f7e, 0x03487ec4, 0x016ea442, 0x00736f81, 0x03814c39, 0x034a24c1, 0x031e453e, 0x0244f1cf, 0x0033d8ff}}}, + {X: Field{[10]uint32{0x03043686, 0x01043d43, 0x022e0a0f, 0x0027d40c, 0x03ede9de, 0x02090b90, 0x01a8a51a, 0x03813b8e, 0x0206d386, 0x0036aacd}}, Y: Field{[10]uint32{0x0011718a, 0x01dc63b5, 0x015e5dbb, 0x0208ea75, 0x00fbb2b6, 0x03a3dba3, 0x010d0ac4, 0x01f441bf, 0x01c40ebe, 0x000302e8}}}, + {X: Field{[10]uint32{0x0204530f, 0x0330ce5f, 0x00dfa89d, 0x0059a408, 0x0026b0e2, 0x021234cd, 0x00219d1f, 0x03c94ae8, 0x034a5311, 0x0002a21f}}, Y: Field{[10]uint32{0x01edeace, 0x023de7e7, 0x03195287, 0x0113bb34, 0x02a5b4fa, 0x03680773, 0x029bff3e, 0x032b1fd0, 0x00bd8c37, 0x00169f01}}}, + {X: Field{[10]uint32{0x002d207a, 0x008fd85f, 0x0158d281, 0x001eca12, 0x024784a9, 0x0216bef3, 0x01dbfd5a, 0x03ae6135, 0x0264409f, 0x0006cc55}}, Y: Field{[10]uint32{0x03a205bb, 0x02715a2a, 0x01c37311, 0x02eaa66f, 0x0384eea5, 0x0165ff55, 0x001d4634, 0x02396961, 0x007cba34, 0x000a5cb3}}}, + {X: Field{[10]uint32{0x01fe4984, 0x037e85ac, 0x00d1f019, 0x027e0bb2, 0x016727e6, 0x035fa119, 0x035de1e0, 0x00355b57, 0x03d427c3, 0x000552b7}}, Y: Field{[10]uint32{0x020372b5, 0x0265dd4f, 0x02079981, 0x0312487c, 0x03882477, 0x01fe94b7, 0x01f61baa, 0x009e7912, 0x028a324b, 0x0016ea1b}}}, + {X: Field{[10]uint32{0x00480994, 0x03b03562, 0x02f9494f, 0x027ed130, 0x02585fe8, 0x02c6bcf0, 0x00df417c, 0x03057eca, 0x01f9fe55, 0x0037af5a}}, Y: Field{[10]uint32{0x03f9708d, 0x038f35d5, 0x03c9ef8d, 0x03fe4d17, 0x03002564, 0x03f3d85a, 0x031b8314, 0x01b493a2, 0x002155c1, 0x00263633}}}, + {X: Field{[10]uint32{0x03baf9e2, 0x01124abb, 0x0066b71d, 0x00f7edcb, 0x01e0316c, 0x01563119, 0x0055fc09, 0x0153e68a, 0x00902a7c, 0x0027f34d}}, Y: Field{[10]uint32{0x03f5d14c, 0x029a47fd, 0x00be51cf, 0x03a09926, 0x03143e1d, 0x0356ae99, 0x029e49c8, 0x02905a27, 0x0160c2b5, 0x0029eb10}}}, + {X: Field{[10]uint32{0x0143a727, 0x02fe9ce2, 0x019bbfda, 0x024bbb83, 0x00586fd7, 0x03cf79f8, 0x00fb1d2d, 0x02ba6566, 0x01f6fe4b, 0x001672b3}}, Y: Field{[10]uint32{0x020df035, 0x0348d045, 0x01acfed8, 0x031034de, 0x03624599, 0x02471213, 0x00d349e1, 0x02b45b1d, 0x01347b3e, 0x001f1cc3}}}, + {X: Field{[10]uint32{0x03fb226c, 0x008bfb01, 0x00821677, 0x01cd01ea, 0x0134e6b3, 0x012b398d, 0x03a4c9ec, 0x00765f6c, 0x03d1fb29, 0x0017386a}}, Y: Field{[10]uint32{0x023b7526, 0x0037a3c0, 0x01d3f763, 0x01bc149d, 0x030a39de, 0x03fdea06, 0x02110255, 0x0025cf62, 0x0234b407, 0x002af091}}}, + {X: Field{[10]uint32{0x0207d73c, 0x02c6a8c0, 0x01baf3af, 0x03433856, 0x01e70897, 0x02cc053d, 0x02680015, 0x002d3dbb, 0x028ebd0a, 0x003de0d8}}, Y: Field{[10]uint32{0x0039af61, 0x027e0273, 0x031df284, 0x03ee0ecb, 0x026c7a6e, 0x03d7efcc, 0x0268b6b1, 0x02e23252, 0x00fd5b96, 0x0034190e}}}, + {X: Field{[10]uint32{0x037ba0b3, 0x01659614, 0x0200c6c1, 0x011dcbaf, 0x029a988d, 0x011074ba, 0x007130db, 0x00a7b8d7, 0x02bccc72, 0x001e0c3e}}, Y: Field{[10]uint32{0x0338fa7f, 0x02aab746, 0x0157e835, 0x02249fcb, 0x0378acc8, 0x0200e8cf, 0x01c901fa, 0x0345e0f5, 0x018e6aea, 0x00127a2d}}}, + {X: Field{[10]uint32{0x03cba9e1, 0x014bead7, 0x03482062, 0x01270a3d, 0x006416d5, 0x03e692a4, 0x024399ee, 0x004a1886, 0x010ea890, 0x00324c0e}}, Y: Field{[10]uint32{0x0161cfce, 0x00443bec, 0x0019704d, 0x01f36aac, 0x023bab13, 0x0052d2f2, 0x014e8fdd, 0x0062883d, 0x03da3d06, 0x003e83a1}}}, + {X: Field{[10]uint32{0x029cd28a, 0x0308f736, 0x018b52d0, 0x02c2979d, 0x03ba0924, 0x017c03b0, 0x0149876e, 0x00645dbe, 0x00672057, 0x000a836a}}, Y: Field{[10]uint32{0x00907647, 0x0342fc3f, 0x01dd1975, 0x007b3413, 0x0390c1fa, 0x01b7c473, 0x01b4870f, 0x00256565, 0x00fc6935, 0x0025b341}}}, + {X: Field{[10]uint32{0x0046fc83, 0x00dd2cc5, 0x01c53256, 0x033b7072, 0x00f2bef6, 0x00e5a389, 0x036e92e0, 0x01606bd5, 0x01e260da, 0x003d9220}}, Y: Field{[10]uint32{0x027c8b94, 0x02dcbd43, 0x01ac3863, 0x0027e28b, 0x022aacec, 0x01247e95, 0x02f833db, 0x019fd10f, 0x005b660b, 0x002022a5}}}, + {X: Field{[10]uint32{0x0381f052, 0x005fe66a, 0x00341330, 0x02205597, 0x00c181e4, 0x00243c78, 0x03cea175, 0x017c34e8, 0x013305ec, 0x0025c2f6}}, Y: Field{[10]uint32{0x02e9fc48, 0x0050c7c6, 0x00a796ca, 0x036ce519, 0x038eb30b, 0x01730066, 0x03b6658d, 0x01dd2bf2, 0x030fe284, 0x00134749}}}, + {X: Field{[10]uint32{0x00c4779a, 0x0056f3b9, 0x03073354, 0x021824a0, 0x032c0588, 0x0172b465, 0x023ecfdf, 0x01507d1c, 0x033124c4, 0x0037fa52}}, Y: Field{[10]uint32{0x0140e23b, 0x0169eae5, 0x00b1c185, 0x03da2c65, 0x01d047af, 0x034d00f1, 0x03afe8c5, 0x0181aa83, 0x0253d547, 0x00330a0f}}}, + {X: Field{[10]uint32{0x018df800, 0x00e8e7a1, 0x007e3bf3, 0x03463dc1, 0x0216c8bd, 0x021cdf43, 0x0230bbad, 0x0396523e, 0x0379673a, 0x003c604c}}, Y: Field{[10]uint32{0x007d294a, 0x011102ea, 0x015d2ed5, 0x03630921, 0x0220bfb9, 0x002d347c, 0x0008d50d, 0x00b6fe6c, 0x01a6139a, 0x002b34b0}}}, + {X: Field{[10]uint32{0x01423740, 0x001810db, 0x00f3ec21, 0x025e70da, 0x008890ec, 0x03036c32, 0x0192bd01, 0x006f7d44, 0x0156fb63, 0x003d3ef0}}, Y: Field{[10]uint32{0x03b7149f, 0x02409b07, 0x03f4b4f6, 0x00eb7d21, 0x039cfccd, 0x0061d2eb, 0x01faf91e, 0x037bfd0c, 0x00f05b07, 0x000f2c23}}}, + {X: Field{[10]uint32{0x0393de6d, 0x00893881, 0x01bbed36, 0x0179d150, 0x00cb9267, 0x033116a0, 0x03a9a725, 0x0275c929, 0x00e83b07, 0x00049369}}, Y: Field{[10]uint32{0x008d00e7, 0x02d26195, 0x01e6ac6f, 0x00c7a819, 0x001cd155, 0x029d6555, 0x02200fb2, 0x0032e935, 0x0066f12e, 0x000f9c00}}}, + {X: Field{[10]uint32{0x038d1138, 0x033a586d, 0x00c16428, 0x00b40ab2, 0x006c2b11, 0x019ae5f4, 0x02045bb2, 0x01e09877, 0x01c4455e, 0x001d25c8}}, Y: Field{[10]uint32{0x015a3032, 0x01567f01, 0x03b87086, 0x0250e7c1, 0x01025bc5, 0x00cc9b1f, 0x015b237d, 0x00c70bfa, 0x02eda3f3, 0x0009d55a}}}, + {X: Field{[10]uint32{0x0227a028, 0x026a46dd, 0x00e979ff, 0x02eff531, 0x00257676, 0x0143efd6, 0x0060dfed, 0x023d5487, 0x02490aa5, 0x0018b372}}, Y: Field{[10]uint32{0x015c37b5, 0x03b58156, 0x00fbbd10, 0x02229c52, 0x0317c4a6, 0x03d0cfa3, 0x021528b4, 0x0043a9fb, 0x039ae16d, 0x0022f526}}}, + {X: Field{[10]uint32{0x006478c6, 0x01692c5a, 0x01344789, 0x03a205d6, 0x011cd3a1, 0x03b4592c, 0x013b2275, 0x00ea985b, 0x00f139b1, 0x00193594}}, Y: Field{[10]uint32{0x01fa5c2f, 0x00f61fcf, 0x03a426b8, 0x0195ee56, 0x02f9e2a0, 0x02590d00, 0x039595b7, 0x00b61fcc, 0x012af757, 0x0037bbb9}}}, + {X: Field{[10]uint32{0x009ab59d, 0x0327d280, 0x0365a1ec, 0x017b6c00, 0x0237cb93, 0x02149b7d, 0x017c17cd, 0x00dbbcd0, 0x025566c6, 0x0034228f}}, Y: Field{[10]uint32{0x000dc103, 0x02b91889, 0x02a549c9, 0x03f49090, 0x00e9ed32, 0x00e15b69, 0x00d35023, 0x0145d8ff, 0x01c75eec, 0x000b6c12}}}, + {X: Field{[10]uint32{0x00f20d89, 0x0237c38c, 0x007c6f4b, 0x020926e9, 0x02971547, 0x006166bf, 0x0220d626, 0x031426be, 0x005a35bc, 0x0021d85c}}, Y: Field{[10]uint32{0x01b726ae, 0x03c37e2b, 0x03f64436, 0x027af8b6, 0x010fd43b, 0x02011a82, 0x029c3db7, 0x02588924, 0x01eebb02, 0x002cd309}}}, + {X: Field{[10]uint32{0x006f5f85, 0x0278468f, 0x03307c4e, 0x03d038de, 0x020e35f6, 0x0139f39f, 0x02cc3175, 0x00990c51, 0x01334ce2, 0x0038d14e}}, Y: Field{[10]uint32{0x0065d97d, 0x03417075, 0x03bf700a, 0x01eccda8, 0x031afdde, 0x00aed144, 0x022a0caf, 0x0206fbfc, 0x038a941e, 0x001cfb85}}}, + {X: Field{[10]uint32{0x00ca917b, 0x00d8208d, 0x01e27fac, 0x02fe5783, 0x02246b36, 0x036ff3a3, 0x00e6f11f, 0x029f9eb2, 0x012f6609, 0x0020e246}}, Y: Field{[10]uint32{0x032b636f, 0x030de303, 0x019bec68, 0x01db94f2, 0x0267c889, 0x033ec6a8, 0x027b681c, 0x023b0a75, 0x03a55044, 0x00255c1c}}}, + {X: Field{[10]uint32{0x03c5d387, 0x0186bd30, 0x02b8de5a, 0x03ede893, 0x03bbf287, 0x025ff618, 0x0278029a, 0x03897f8b, 0x00c067bb, 0x0022ff5c}}, Y: Field{[10]uint32{0x03f952fb, 0x0251d03c, 0x031fd5d8, 0x0069bb6e, 0x008b5900, 0x03c93f3b, 0x01b1d644, 0x01973568, 0x026bee72, 0x0038b9b1}}}, + {X: Field{[10]uint32{0x02ff257d, 0x0164f839, 0x01269fdb, 0x0055a21d, 0x03eaf820, 0x02601482, 0x021582d0, 0x002ec566, 0x019aa05f, 0x00297426}}, Y: Field{[10]uint32{0x0023635a, 0x01970d31, 0x0050bf9c, 0x03469910, 0x00fe6d27, 0x00b392cd, 0x02b62b36, 0x015d999d, 0x03205ef0, 0x0038d365}}}, + {X: Field{[10]uint32{0x015043ce, 0x01eeaa97, 0x02544282, 0x02164b53, 0x01176451, 0x0227ff67, 0x03942e30, 0x03222d41, 0x01a7b949, 0x0011391e}}, Y: Field{[10]uint32{0x013a7087, 0x013b7788, 0x02e23250, 0x01deb84b, 0x01e2b10d, 0x01295c2a, 0x02714162, 0x03118ec2, 0x00298c12, 0x001ee1bb}}}, + {X: Field{[10]uint32{0x012aa558, 0x01b38f4d, 0x013c4317, 0x02355648, 0x023f37bb, 0x002af432, 0x02e0251e, 0x01e045c1, 0x0143d979, 0x001837b2}}, Y: Field{[10]uint32{0x01fcaab8, 0x0042759a, 0x03d508bc, 0x013e331b, 0x0116b076, 0x01a614cd, 0x0181448d, 0x0167db14, 0x01f4a31c, 0x000b71a2}}}, + {X: Field{[10]uint32{0x01f7709b, 0x039eacc0, 0x03b24af7, 0x027f9906, 0x00d4ab82, 0x016506e6, 0x013c5c53, 0x0127983e, 0x01385b54, 0x00172963}}, Y: Field{[10]uint32{0x017cd575, 0x019607b0, 0x03eb74d9, 0x0213574f, 0x00945d9d, 0x03ce7770, 0x00ce0907, 0x01bd2044, 0x02e980eb, 0x0020abee}}}, + {X: Field{[10]uint32{0x018b031c, 0x02641234, 0x01138100, 0x028f34ca, 0x03b9a23e, 0x01afe1b0, 0x009cf3d2, 0x0358326c, 0x027ea1b1, 0x002ddd65}}, Y: Field{[10]uint32{0x0040fef1, 0x001025c2, 0x030b7120, 0x023211bd, 0x0366f12d, 0x0373eb73, 0x01885c4a, 0x004155c3, 0x029becfa, 0x0034adc5}}}, + {X: Field{[10]uint32{0x00220f96, 0x01ade690, 0x0044e92e, 0x03047e8e, 0x03a23bc4, 0x026a8175, 0x003595fb, 0x00bd840f, 0x00f67d60, 0x001cf635}}, Y: Field{[10]uint32{0x0000ce3d, 0x015d6ac9, 0x0285d331, 0x00f55a3f, 0x00bb17fb, 0x03b3453b, 0x02185309, 0x03fb96fa, 0x022cffc9, 0x002fdc8a}}}, + {X: Field{[10]uint32{0x01182b75, 0x02c46026, 0x024d61e7, 0x01151230, 0x008b1e97, 0x0271b7c3, 0x012bcce7, 0x01e08805, 0x01f9f49f, 0x003a0413}}, Y: Field{[10]uint32{0x02137361, 0x00494fe0, 0x0102396b, 0x02087175, 0x03e14fc6, 0x03e57fee, 0x03b0da00, 0x00afac6f, 0x0139ec8f, 0x00370bf5}}}, + {X: Field{[10]uint32{0x006113e6, 0x03a65715, 0x03209e89, 0x00912403, 0x01777e55, 0x00586039, 0x01449b6d, 0x010cb238, 0x02f6fb6c, 0x003b35cb}}, Y: Field{[10]uint32{0x0226e135, 0x03593ade, 0x029e0e00, 0x00f89a04, 0x00425291, 0x00516180, 0x009f518e, 0x02ea6794, 0x015d358f, 0x00059c5c}}}, + {X: Field{[10]uint32{0x00fc36cc, 0x001c1429, 0x02455a99, 0x0041fa75, 0x01464bfe, 0x029b5f0d, 0x01fc6b5f, 0x026f45bc, 0x00cfbe82, 0x00038ed7}}, Y: Field{[10]uint32{0x028044f5, 0x01ea1f68, 0x03fa331e, 0x03c042d7, 0x02296cb5, 0x016d9c7e, 0x017a2c9b, 0x03069b78, 0x039b5471, 0x00339eae}}}, + {X: Field{[10]uint32{0x03107734, 0x0286ae49, 0x01c5ed7c, 0x013c97e2, 0x0041c1ce, 0x013af48b, 0x03e75f7f, 0x024753ad, 0x0202ffab, 0x003cd646}}, Y: Field{[10]uint32{0x00fa4b3d, 0x015f0ae5, 0x01c1018a, 0x01aef8bb, 0x03cf0474, 0x00c52eda, 0x03c7d535, 0x02e49921, 0x0211f2ba, 0x000d168b}}}, + {X: Field{[10]uint32{0x0345c635, 0x006b65f2, 0x021a6550, 0x034c89eb, 0x00c61349, 0x03f16a54, 0x01184f9f, 0x02b654df, 0x005dae54, 0x003292c1}}, Y: Field{[10]uint32{0x03c1d806, 0x01312d35, 0x00d72eaf, 0x015833a7, 0x014660f4, 0x0110747a, 0x02f3c24b, 0x02fb28d4, 0x017e255e, 0x0038c3e0}}}, + {X: Field{[10]uint32{0x0341ea38, 0x00a6ed9b, 0x02a72dfd, 0x00819d6a, 0x02300947, 0x01daa57d, 0x00ebdb7b, 0x03a987ee, 0x034054a9, 0x003df315}}, Y: Field{[10]uint32{0x02556eac, 0x00b207ac, 0x009900f5, 0x02ffd4b5, 0x03b3dd7f, 0x03811af8, 0x0275aeb5, 0x00936460, 0x018cfc54, 0x0027518f}}}, + {X: Field{[10]uint32{0x016ab6c2, 0x007dc37b, 0x029f876b, 0x03ec9eda, 0x01b4fd9b, 0x034d3a2a, 0x024bbef7, 0x038fe3b9, 0x0379fba3, 0x003dd6d7}}, Y: Field{[10]uint32{0x00a43faa, 0x00c3b024, 0x014f9d40, 0x019be168, 0x037e0e82, 0x01d159df, 0x0048e362, 0x02ddedcb, 0x00bc5c3f, 0x000882d0}}}, + {X: Field{[10]uint32{0x019cd450, 0x023e9303, 0x00fde0e8, 0x0191cd69, 0x0189d86a, 0x03428e63, 0x03d89b6a, 0x008da989, 0x03a25060, 0x000aa8d9}}, Y: Field{[10]uint32{0x0041fc32, 0x02512336, 0x038f6e82, 0x03ffa6bb, 0x021e70ec, 0x0135df61, 0x00a802bc, 0x006c69d9, 0x00250249, 0x000affb7}}}, + {X: Field{[10]uint32{0x0141620f, 0x00df0e28, 0x0325765a, 0x039ec7ac, 0x03a1078c, 0x01609ec1, 0x01a1e221, 0x00f3db9f, 0x01c11178, 0x003fdfd2}}, Y: Field{[10]uint32{0x00702733, 0x026b3d95, 0x00bead51, 0x02177d91, 0x03a488c5, 0x0049477e, 0x00a8b542, 0x00163a2f, 0x009e2e48, 0x001a5543}}}, + {X: Field{[10]uint32{0x003aa39f, 0x000a82d7, 0x016016fd, 0x02d1799e, 0x0076d017, 0x034faee4, 0x01f7338f, 0x03d3b291, 0x03581164, 0x000c7414}}, Y: Field{[10]uint32{0x0163f575, 0x03364aa6, 0x011fe6bc, 0x003b46ff, 0x03d4d3ea, 0x0387e348, 0x022fa902, 0x01ffc411, 0x019b7217, 0x003c490c}}}, + {X: Field{[10]uint32{0x026a3bd0, 0x023ed7df, 0x006eabb8, 0x034ead7c, 0x030c8a02, 0x0236a6b5, 0x00bf2f30, 0x000fb28b, 0x02ddfd12, 0x001babc3}}, Y: Field{[10]uint32{0x03e05f08, 0x0242719c, 0x016d4125, 0x01d28c56, 0x02815a0c, 0x0028ee0e, 0x00521a01, 0x0251d127, 0x01012d8e, 0x00364cdb}}}, + {X: Field{[10]uint32{0x02da1347, 0x006ea5df, 0x011b9e9a, 0x0320472e, 0x0168e759, 0x03d7ea23, 0x03943acf, 0x006adff0, 0x01197799, 0x0002e569}}, Y: Field{[10]uint32{0x01e5ef23, 0x0208afdb, 0x0287f533, 0x0054dbba, 0x029758bd, 0x0168bfe9, 0x018fbfe7, 0x0112296a, 0x035f446d, 0x00233cb2}}}, + {X: Field{[10]uint32{0x011427e8, 0x03071608, 0x02eeada6, 0x03d5ae43, 0x021fd386, 0x03a0139f, 0x031dc212, 0x03b6ebce, 0x01d48ce5, 0x001394c0}}, Y: Field{[10]uint32{0x01b9f0d9, 0x00297600, 0x016b76fb, 0x0364ddb6, 0x00dcabaa, 0x02f675a1, 0x012f684c, 0x03f6cb87, 0x003de169, 0x003d40fb}}}, + {X: Field{[10]uint32{0x00f49cd2, 0x0080cf0f, 0x017a3914, 0x0152b587, 0x02fc7c2b, 0x01270b42, 0x01f92cdc, 0x006d0dc5, 0x01e50903, 0x0013f46a}}, Y: Field{[10]uint32{0x024adcb1, 0x02169b23, 0x031602c8, 0x02fa2e1d, 0x022d99c9, 0x033bda52, 0x034b43be, 0x0196f0ea, 0x011cab01, 0x001cfb30}}}, + {X: Field{[10]uint32{0x00257c84, 0x00402648, 0x00b86745, 0x03e8ba29, 0x00384070, 0x02363eb8, 0x03b7fa4a, 0x010fe97a, 0x0065b325, 0x0019d01a}}, Y: Field{[10]uint32{0x03c62008, 0x021625ae, 0x0271f3fd, 0x0173bcf4, 0x03e829a4, 0x00c89f7d, 0x00451f5e, 0x0382e53d, 0x02d593a4, 0x000ff766}}}, + {X: Field{[10]uint32{0x006569e4, 0x024a9969, 0x01cb4e49, 0x02b46723, 0x00de7e8d, 0x036b1028, 0x03dcfa0e, 0x016f9bbc, 0x01aed6ee, 0x00052e55}}, Y: Field{[10]uint32{0x022daf70, 0x0029757e, 0x011ebed6, 0x03097aa7, 0x017d9f31, 0x0184d4f7, 0x001eff67, 0x00fe0612, 0x00b62182, 0x00352e48}}}, + {X: Field{[10]uint32{0x0339ae42, 0x0297c88c, 0x00fb722c, 0x00d318da, 0x004003e4, 0x0390bf48, 0x02a0b3ff, 0x0357eb7e, 0x03bc5608, 0x00053ca0}}, Y: Field{[10]uint32{0x02db7397, 0x015df3e7, 0x008c37c1, 0x00c0aebb, 0x03bf0ba6, 0x002a1ff6, 0x004d4bfb, 0x03f4ff19, 0x023dc3ae, 0x002c9057}}}, + {X: Field{[10]uint32{0x03bd1c1f, 0x00ce8c87, 0x03d098e7, 0x01701637, 0x005416a5, 0x03e032ea, 0x02275be7, 0x038829b9, 0x00677d3c, 0x000ff783}}, Y: Field{[10]uint32{0x02daaac6, 0x01740cc6, 0x0389a115, 0x00962498, 0x009a018b, 0x02fa87c2, 0x01782f90, 0x0064b252, 0x03dc610f, 0x0026e3bd}}}, + {X: Field{[10]uint32{0x02d17267, 0x00cca883, 0x01247df5, 0x01310776, 0x00b993bf, 0x020a4150, 0x01c74dd4, 0x00f417c5, 0x0269df5f, 0x00271579}}, Y: Field{[10]uint32{0x024979f6, 0x02d3829b, 0x00810981, 0x00c8b498, 0x018c6b3c, 0x00dd5ff0, 0x01abd783, 0x01d9945d, 0x00e930c9, 0x0008f6c3}}}, + {X: Field{[10]uint32{0x02968d16, 0x01a2a4a0, 0x02ee7d85, 0x030d2cfe, 0x02506d2d, 0x003d05d1, 0x00da60b3, 0x006835ba, 0x00dfae14, 0x0002f7a1}}, Y: Field{[10]uint32{0x02b3ab04, 0x03ce3112, 0x00dcb468, 0x03cdb0a6, 0x02900374, 0x0269b1a1, 0x024697b9, 0x01877f9c, 0x0214ff13, 0x001168cc}}}, + {X: Field{[10]uint32{0x019546a3, 0x00e76bf2, 0x030c0549, 0x021651ac, 0x01e5d970, 0x03183168, 0x0368f454, 0x030b2917, 0x014ab8f3, 0x0006500a}}, Y: Field{[10]uint32{0x00e3b81e, 0x025aed3b, 0x0386abfd, 0x009b9db8, 0x00848bc9, 0x01f186ec, 0x020ea767, 0x0318a879, 0x03993816, 0x00158fe7}}}, + {X: Field{[10]uint32{0x032ccb0e, 0x027f33ac, 0x00ad6682, 0x0358dcf3, 0x00757a34, 0x0348b60e, 0x00df92ea, 0x00f991f4, 0x01e0d0d1, 0x00375ba8}}, Y: Field{[10]uint32{0x0233c313, 0x00023c3b, 0x003fdd8e, 0x01f2a803, 0x00384b55, 0x012797fe, 0x03ad27fa, 0x03a2ca14, 0x01e36bf4, 0x0030063a}}}, + {X: Field{[10]uint32{0x037fbf19, 0x01a58596, 0x01ffec06, 0x00dd0b13, 0x00dc1047, 0x02f09ee1, 0x02656bfb, 0x01158b89, 0x03e8c784, 0x00195e11}}, Y: Field{[10]uint32{0x015f2df5, 0x03daad82, 0x001725b5, 0x02d39e69, 0x0242c6a4, 0x0292a6a2, 0x01beda90, 0x02b69240, 0x03b658b6, 0x00376437}}}, + {X: Field{[10]uint32{0x023dea6b, 0x0141acff, 0x00d3e352, 0x007ce5ae, 0x0349b8e7, 0x036de072, 0x02d26c2e, 0x0275ba41, 0x00b140be, 0x003edc09}}, Y: Field{[10]uint32{0x0308efdf, 0x03f28cba, 0x0061c5a0, 0x0014501c, 0x02fea360, 0x03746b11, 0x02d961e9, 0x008ca2da, 0x03f4e50b, 0x00379023}}}, + {X: Field{[10]uint32{0x01d8e8e0, 0x004cd434, 0x018dfa31, 0x0031268e, 0x00b3f2be, 0x034fa251, 0x0280179c, 0x02c9e74e, 0x000865a7, 0x000b4a70}}, Y: Field{[10]uint32{0x02efcf8f, 0x027648f6, 0x03ee992e, 0x0017c999, 0x0125c550, 0x02592791, 0x00027485, 0x01292996, 0x027aee70, 0x0032abc4}}}, + {X: Field{[10]uint32{0x03d5662d, 0x01f07314, 0x036326d8, 0x02269f0c, 0x02392685, 0x00f06f8e, 0x028d42ba, 0x00827d37, 0x007479b7, 0x0036da41}}, Y: Field{[10]uint32{0x03aa4e00, 0x01dddc3e, 0x0063c0b7, 0x02fca48b, 0x01c58c1f, 0x020f893a, 0x013ce32c, 0x021eaa64, 0x03e95c35, 0x002437a2}}}, + {X: Field{[10]uint32{0x0141697b, 0x011cd5b2, 0x03f0adf2, 0x021f33c4, 0x01723c70, 0x01635bf0, 0x0154ada2, 0x013c2abf, 0x006f922e, 0x00260194}}, Y: Field{[10]uint32{0x016bc237, 0x011684bc, 0x037c9252, 0x0125dec9, 0x01b97fef, 0x034c72b4, 0x0298eef3, 0x02e104dd, 0x0018a8ca, 0x00301f88}}}, + {X: Field{[10]uint32{0x00e40187, 0x02b9ebd8, 0x025eaae1, 0x03478cf4, 0x01661e0a, 0x023c5188, 0x011c1122, 0x0096b16c, 0x013fe6da, 0x002ae1a3}}, Y: Field{[10]uint32{0x00bf54ad, 0x0357c4cf, 0x001d4d47, 0x0222ef4c, 0x014b12c4, 0x015e9ff6, 0x01195ced, 0x02614068, 0x0298334a, 0x003b892d}}}, + {X: Field{[10]uint32{0x018dcda2, 0x03627bbf, 0x02f4931f, 0x019aafd9, 0x003122f3, 0x01095f8a, 0x0056be17, 0x023b9848, 0x03d19d2a, 0x0039d587}}, Y: Field{[10]uint32{0x02166d5a, 0x02a0004f, 0x0118d5a8, 0x0242281e, 0x0385bcb1, 0x0089edd6, 0x0366ea73, 0x01b63171, 0x034be365, 0x000814b9}}}, + {X: Field{[10]uint32{0x00f21e6c, 0x00b7e6fa, 0x0082083c, 0x0004e654, 0x017b562f, 0x02a1132d, 0x008f2e0f, 0x038c1ef8, 0x023d84bb, 0x0017c654}}, Y: Field{[10]uint32{0x0265d7fa, 0x039f105c, 0x02cb9d9b, 0x0109ba46, 0x00333775, 0x01c93ae2, 0x029ad2d5, 0x007778ab, 0x021628ee, 0x000ea5bf}}}, + {X: Field{[10]uint32{0x01c10cc1, 0x00df4a36, 0x03545698, 0x005c9571, 0x022fdcad, 0x015407bf, 0x022ec1dc, 0x026c4490, 0x02683c94, 0x00327e91}}, Y: Field{[10]uint32{0x03fd1dba, 0x008fb7b1, 0x03ffab5e, 0x00d1db51, 0x00b5b6e7, 0x03a380d2, 0x01dcd8d9, 0x0246b33c, 0x035d18f6, 0x0006aab9}}}, + {X: Field{[10]uint32{0x03eb8d8c, 0x02de4ec2, 0x02401b1a, 0x03505690, 0x011799b2, 0x024ee081, 0x03a084c3, 0x0061e733, 0x022a1e91, 0x00076a43}}, Y: Field{[10]uint32{0x009c0b63, 0x0134a3b2, 0x013322da, 0x03947d3f, 0x0274994e, 0x00ecff0c, 0x02cbae15, 0x0134e011, 0x006911ea, 0x000f4fdf}}}, + {X: Field{[10]uint32{0x031b3186, 0x03e26b7c, 0x029153e6, 0x026363d9, 0x03707e40, 0x02de11fd, 0x01504ac0, 0x0390c9af, 0x010f3851, 0x0031bf3c}}, Y: Field{[10]uint32{0x03a50ced, 0x029494e4, 0x00bff03e, 0x02bea726, 0x004e2705, 0x03e3b972, 0x036ea108, 0x018f61b8, 0x01f4a16a, 0x00342b22}}}, + {X: Field{[10]uint32{0x02378233, 0x035fd185, 0x02588fef, 0x01ac7e6d, 0x0003cf23, 0x00495eb8, 0x02b7d4ef, 0x0319f32d, 0x022eeb56, 0x0005415e}}, Y: Field{[10]uint32{0x004930c2, 0x012ec3f7, 0x010cf505, 0x0188be6a, 0x036f205a, 0x038f42a1, 0x01543ef5, 0x029ea312, 0x0130ccc0, 0x00136ead}}}, + {X: Field{[10]uint32{0x0308b20f, 0x039067c0, 0x01ea36d1, 0x02de300b, 0x0145bf1c, 0x001f77af, 0x027337dd, 0x02b039ba, 0x02e072d5, 0x000dfbab}}, Y: Field{[10]uint32{0x0361d506, 0x02458c3c, 0x0394aebb, 0x036efd68, 0x01a5761a, 0x00ca8e8f, 0x0077249a, 0x02a85067, 0x00965d9d, 0x002c3191}}}, + {X: Field{[10]uint32{0x0157745c, 0x009cd889, 0x03ebe61a, 0x022deb66, 0x01f1d6ce, 0x024a2f71, 0x031cd96d, 0x03438cf1, 0x03f83a8b, 0x0016881e}}, Y: Field{[10]uint32{0x00f54dad, 0x031d9998, 0x0213819e, 0x0004c8f1, 0x03ee8789, 0x015d1044, 0x01494ac1, 0x026da8a9, 0x0357fadc, 0x000eb32d}}}, + {X: Field{[10]uint32{0x03abd139, 0x034e6efe, 0x006d1642, 0x002241c1, 0x02f6b2ee, 0x0206fbed, 0x0391271e, 0x038c9568, 0x016a1a0f, 0x003f8237}}, Y: Field{[10]uint32{0x0181ef40, 0x00319380, 0x030d6c52, 0x00984de6, 0x03665d23, 0x027c8130, 0x02f1b436, 0x0208bb93, 0x02d13535, 0x0010b0d0}}}, + {X: Field{[10]uint32{0x00706111, 0x032e665e, 0x01daca39, 0x03800f47, 0x01d6d859, 0x0201132b, 0x003edcf3, 0x036ee992, 0x02c908df, 0x002df498}}, Y: Field{[10]uint32{0x00d798e8, 0x01ff91ca, 0x01689ee9, 0x0044194f, 0x0230bb4c, 0x00606d6e, 0x0007c8f5, 0x02ce5da8, 0x0350b308, 0x00258218}}}, + {X: Field{[10]uint32{0x00130c86, 0x01be008d, 0x00407683, 0x015f731e, 0x027d354b, 0x006eb7d6, 0x0297d7c0, 0x00ddd4eb, 0x032e23b3, 0x0012c4aa}}, Y: Field{[10]uint32{0x023c450e, 0x03ee3c3c, 0x005c0f52, 0x027926b9, 0x012bc964, 0x007f9605, 0x0211e73a, 0x022fd00b, 0x020d9f70, 0x00106753}}}, + {X: Field{[10]uint32{0x00e88dac, 0x00331276, 0x034f74f3, 0x02addd42, 0x008f362b, 0x02f311f1, 0x009570c8, 0x0333692d, 0x0282a96e, 0x003f1b49}}, Y: Field{[10]uint32{0x00beedbb, 0x0090eb3d, 0x0184808a, 0x03c25800, 0x000694af, 0x024165fe, 0x0322612e, 0x01160347, 0x01273026, 0x0006bd59}}}, + {X: Field{[10]uint32{0x02607e8b, 0x026d9547, 0x00f0632e, 0x0303910b, 0x025e07e6, 0x012bf6e7, 0x0342c40c, 0x03ae8151, 0x03a9a189, 0x0031ee70}}, Y: Field{[10]uint32{0x001822ab, 0x02010bfc, 0x03e30fc5, 0x02e35370, 0x02ef6b38, 0x03069517, 0x0084cd19, 0x01d36d88, 0x02772f22, 0x0016eda0}}}, + {X: Field{[10]uint32{0x00dfd956, 0x001be9d4, 0x01627034, 0x030aedbe, 0x0246c761, 0x03b50c1a, 0x02339ba3, 0x029cbca6, 0x034230de, 0x003ae934}}, Y: Field{[10]uint32{0x01237cee, 0x0172fd77, 0x0106d215, 0x02961e4d, 0x01d31b01, 0x001a1033, 0x01a17477, 0x01e2cb8f, 0x020f23d2, 0x003f385e}}}, + {X: Field{[10]uint32{0x02c04155, 0x0295a7e0, 0x02cc8944, 0x03d1b366, 0x013595dc, 0x02b7b0a1, 0x034358c6, 0x0351c4d6, 0x01c02177, 0x002934db}}, Y: Field{[10]uint32{0x01f00281, 0x00ddfd20, 0x03ad1013, 0x01770beb, 0x0365f3e4, 0x016983f7, 0x038fd0fb, 0x006f838d, 0x037963b2, 0x002168a5}}}, + {X: Field{[10]uint32{0x02109ba2, 0x002b255d, 0x00a16906, 0x02a939b5, 0x020eb165, 0x0379ceaf, 0x035bf56f, 0x03eb878f, 0x0063ae8b, 0x001245b4}}, Y: Field{[10]uint32{0x003f22ee, 0x026d3513, 0x006564ae, 0x013d9d8e, 0x003b2b0b, 0x014dadf2, 0x027a08ca, 0x010357e5, 0x03034a0b, 0x0029e459}}}, + {X: Field{[10]uint32{0x02edd046, 0x02b90483, 0x03f97ecb, 0x01e61605, 0x009de019, 0x0012ad27, 0x038f1a44, 0x0180c217, 0x0310b296, 0x001d8736}}, Y: Field{[10]uint32{0x02193db7, 0x00bce88b, 0x010cf2ee, 0x03aa376a, 0x039789f0, 0x022079fe, 0x038f50ab, 0x015175cb, 0x0320763b, 0x00074455}}}, + {X: Field{[10]uint32{0x01c64ea3, 0x03f28ae3, 0x019d2e05, 0x0053a377, 0x02860ff0, 0x0242f04f, 0x005541b4, 0x023a4b7e, 0x01704d71, 0x00035e89}}, Y: Field{[10]uint32{0x034cb90c, 0x023d0f94, 0x00acec15, 0x0216a8eb, 0x026102db, 0x02f1b7b1, 0x000e035f, 0x019d9dc7, 0x039d2134, 0x00179152}}}, + {X: Field{[10]uint32{0x014d3bbe, 0x00290fcf, 0x025dfeb2, 0x02653716, 0x020a6b9a, 0x00a5d6ef, 0x02bcb063, 0x0314aec3, 0x004f7962, 0x000abd80}}, Y: Field{[10]uint32{0x001a14f3, 0x03825776, 0x01933d91, 0x006d4c8e, 0x02be1deb, 0x01a31965, 0x0108e3eb, 0x0330540c, 0x01e226f8, 0x001a622a}}}, + {X: Field{[10]uint32{0x01504255, 0x0023d72a, 0x00959741, 0x0061d6e9, 0x03ca805d, 0x034cc613, 0x027571e5, 0x00218044, 0x00e53bab, 0x002a49d0}}, Y: Field{[10]uint32{0x02d2379f, 0x01d7adb1, 0x0244e68d, 0x0214436a, 0x0096d49c, 0x00eaa138, 0x02dfd3d0, 0x01adc419, 0x011e2eb7, 0x00177ca1}}}, + {X: Field{[10]uint32{0x00014939, 0x01fb661c, 0x02057bcc, 0x01c0341d, 0x02768567, 0x00e8323a, 0x0287c449, 0x0229ad82, 0x021a510d, 0x00243425}}, Y: Field{[10]uint32{0x00aa545d, 0x01d80eb3, 0x034d3f8d, 0x00be16d2, 0x037c13dc, 0x008e1ab4, 0x036f7a8a, 0x00c2219a, 0x013c1c91, 0x001d351d}}}, + {X: Field{[10]uint32{0x00ecd12b, 0x02f98441, 0x00ded249, 0x029b28ce, 0x038dd5c6, 0x00b8b820, 0x02bfa279, 0x029813d8, 0x03eaf2e3, 0x0003394a}}, Y: Field{[10]uint32{0x015c009e, 0x0220020b, 0x031a1a49, 0x002a3e3f, 0x03dd0867, 0x0097cf66, 0x00244449, 0x0028adf2, 0x0273738a, 0x002a1a77}}}, + {X: Field{[10]uint32{0x03cd05c4, 0x038d43fc, 0x02be7cc3, 0x0105b3c5, 0x01122154, 0x0301ab12, 0x0139a471, 0x03f34bff, 0x01c210e3, 0x002672a3}}, Y: Field{[10]uint32{0x03bc4982, 0x03925ab7, 0x02142c6c, 0x03a00244, 0x024550fb, 0x03c1c82f, 0x0326309e, 0x0370b1af, 0x0280131a, 0x001e021e}}}, + {X: Field{[10]uint32{0x0202d1c6, 0x03b18428, 0x0211ab51, 0x0285f639, 0x00cbfcc6, 0x008b7ae4, 0x03ff1f43, 0x01ef1741, 0x00c29f5a, 0x002f910b}}, Y: Field{[10]uint32{0x03c084a2, 0x01584a1d, 0x03734111, 0x00978c92, 0x02fb3d1f, 0x02b3d6ec, 0x028f2c01, 0x0364d200, 0x02c4680e, 0x0018943c}}}, + {X: Field{[10]uint32{0x00ec8e54, 0x01c2ec39, 0x00e65677, 0x03e6e3e0, 0x03e75d95, 0x006e6c53, 0x030346b5, 0x02c04084, 0x01f4037f, 0x0014fd7d}}, Y: Field{[10]uint32{0x00c62f93, 0x0331774a, 0x020f9cb1, 0x01c4ca14, 0x0224c0d5, 0x00f8b870, 0x00dd2ef2, 0x00cfd6a8, 0x0353c6e7, 0x0023694a}}}, + {X: Field{[10]uint32{0x008c4d6c, 0x039b6a97, 0x0155411d, 0x006461bb, 0x02a897ab, 0x00d295bd, 0x0399e3a1, 0x03affdf5, 0x01650e90, 0x00081b39}}, Y: Field{[10]uint32{0x02a75804, 0x02a6a5a9, 0x006754dc, 0x00f0e2b8, 0x00aaa5d5, 0x01e754c8, 0x03ec5c2e, 0x01b729f7, 0x0122bd2d, 0x0030bfd7}}}, + {X: Field{[10]uint32{0x0073f443, 0x037cab1c, 0x03744faa, 0x0083308f, 0x0002176a, 0x009b4ad5, 0x01f2a727, 0x00beae04, 0x03bb87ee, 0x0034772f}}, Y: Field{[10]uint32{0x01d17db9, 0x003e5a3b, 0x0350c187, 0x024f87d0, 0x00f71da6, 0x03e0cdf6, 0x02fc27e3, 0x002edef2, 0x023b4180, 0x000041b1}}}, + {X: Field{[10]uint32{0x03749328, 0x005ce4b6, 0x002f6db1, 0x0343bc5f, 0x020a516f, 0x01bff26a, 0x039d4322, 0x01dae87a, 0x0173c543, 0x003486a8}}, Y: Field{[10]uint32{0x0074e424, 0x0131a098, 0x00b24772, 0x0293b5d3, 0x002326f9, 0x00e9d52c, 0x00f79de6, 0x02035981, 0x01f4e014, 0x000df3d7}}}, + {X: Field{[10]uint32{0x011fa3d2, 0x03553adf, 0x0203178d, 0x020fe387, 0x0215e563, 0x032edf39, 0x01acfbe2, 0x01a69d5a, 0x0024a22c, 0x00148d2c}}, Y: Field{[10]uint32{0x03c000cb, 0x02258c22, 0x02ddfd91, 0x02569d2b, 0x02b41038, 0x0296cd0e, 0x03c3b042, 0x02d4b58a, 0x0042651d, 0x000afab9}}}, + {X: Field{[10]uint32{0x01412f64, 0x010704cd, 0x00b6a509, 0x033d7b9b, 0x01f5048d, 0x01662253, 0x009dbd4f, 0x0086ae9c, 0x00759f3e, 0x00279ba6}}, Y: Field{[10]uint32{0x01757ea8, 0x009a418c, 0x034a92dc, 0x00ce9f93, 0x01431110, 0x03811c62, 0x00dd1690, 0x00b96909, 0x0199e38f, 0x000ad9c0}}}, + {X: Field{[10]uint32{0x0343ae45, 0x03ca4a21, 0x017fcd28, 0x01ce0c96, 0x0289232c, 0x00b7a6ec, 0x01f8a927, 0x0239dc43, 0x02959a71, 0x002105b8}}, Y: Field{[10]uint32{0x0133d139, 0x01c487c4, 0x004db4c7, 0x01d1d931, 0x0220732a, 0x03347c00, 0x01b79044, 0x01023b60, 0x0202801b, 0x001bbd24}}}, + {X: Field{[10]uint32{0x013561a5, 0x02389eb5, 0x0029bb10, 0x01ca7a8d, 0x0027462f, 0x014ae8b7, 0x02405ebe, 0x00ecbcc9, 0x03a7048a, 0x00214a93}}, Y: Field{[10]uint32{0x0162e520, 0x0332bce9, 0x02ac6a81, 0x03de3418, 0x02770b99, 0x032fad9c, 0x00e441c2, 0x02708dac, 0x0046ee0d, 0x000f81b0}}}, + {X: Field{[10]uint32{0x0277c1bd, 0x00a50b8d, 0x00c5d328, 0x02872c8d, 0x01fa6097, 0x03020f3b, 0x03b876d3, 0x015afae4, 0x01a02dbe, 0x000a2037}}, Y: Field{[10]uint32{0x031bb43a, 0x01991043, 0x019d3bf9, 0x01e103a4, 0x023d371f, 0x00dc37e8, 0x015366c5, 0x01aed3fa, 0x021092d4, 0x0037ec3a}}}, + {X: Field{[10]uint32{0x01819c65, 0x027fe27c, 0x006f0770, 0x01549d72, 0x0037b535, 0x02699da8, 0x03dbf869, 0x0235ff00, 0x00029e82, 0x0032dbef}}, Y: Field{[10]uint32{0x02062266, 0x00589de1, 0x02bdace5, 0x03ef816e, 0x00ce9161, 0x032ddb2e, 0x00d50c21, 0x01ce6457, 0x019a3657, 0x003f138b}}}, + {X: Field{[10]uint32{0x001afebe, 0x00c17bfe, 0x021615f6, 0x02962a1c, 0x030abc76, 0x001b43b0, 0x03241066, 0x00d0e086, 0x035bff1c, 0x002021ee}}, Y: Field{[10]uint32{0x0024ce72, 0x0305f782, 0x00353d9b, 0x01fa513d, 0x0223a443, 0x03a6918c, 0x01c5030a, 0x0300ae3d, 0x007aa602, 0x0015e2ca}}}, + {X: Field{[10]uint32{0x02d3a33a, 0x028a3ed0, 0x01482653, 0x0274493b, 0x00f8ae82, 0x0145f396, 0x030def22, 0x032431eb, 0x00bc30f2, 0x000da7d5}}, Y: Field{[10]uint32{0x01b59d16, 0x009855ee, 0x01b40b45, 0x02f71330, 0x0361f466, 0x01658850, 0x03c97aef, 0x01f8cb18, 0x02af35af, 0x0002e3cb}}}, + {X: Field{[10]uint32{0x03ed8f7d, 0x00f54cc7, 0x01eb6edd, 0x00a1af92, 0x03df2946, 0x03f6dab1, 0x03b2448f, 0x03e1c54e, 0x004c01b2, 0x0021ef93}}, Y: Field{[10]uint32{0x020effb1, 0x01bd3af2, 0x00a2adfe, 0x02a19a4e, 0x0071fdc8, 0x00735474, 0x031ec542, 0x0302855d, 0x00bc6386, 0x001fbd1d}}}, + {X: Field{[10]uint32{0x0214715e, 0x00fe8a47, 0x01cfbc01, 0x006d7bb4, 0x0280393f, 0x00e7b6f8, 0x0310eeb2, 0x016faa30, 0x00f018f7, 0x001ed99e}}, Y: Field{[10]uint32{0x038b1fd7, 0x006a2c7c, 0x02890c18, 0x01f4f754, 0x03d98570, 0x02a86efc, 0x008275d2, 0x039a69ce, 0x00e2666e, 0x001e3a2e}}}, + {X: Field{[10]uint32{0x0160f135, 0x009ce52c, 0x00aed90d, 0x01b5acdf, 0x0377d282, 0x03ee8e22, 0x01608f58, 0x027808aa, 0x02419672, 0x000227b1}}, Y: Field{[10]uint32{0x00786cff, 0x025055e9, 0x021f80ac, 0x02c36466, 0x035e3030, 0x0077ac62, 0x01ee5a74, 0x01ce1c06, 0x0142108d, 0x00177bcc}}}, + {X: Field{[10]uint32{0x02177f8e, 0x01b4698d, 0x0131199e, 0x0275907e, 0x008b8374, 0x01e30feb, 0x022acbab, 0x00242cea, 0x03393769, 0x000b2fb1}}, Y: Field{[10]uint32{0x03de8886, 0x024820fc, 0x03bad2ca, 0x0332240b, 0x0367fea7, 0x013c9aba, 0x034a007f, 0x00b56b2c, 0x03e757ad, 0x000c5039}}}, + {X: Field{[10]uint32{0x01946908, 0x033c3baf, 0x03cf02eb, 0x0061198f, 0x0229d576, 0x000c082b, 0x027b116d, 0x02962d4f, 0x03cda2d6, 0x0019e33b}}, Y: Field{[10]uint32{0x026a3491, 0x02f40a03, 0x01713314, 0x0310cc70, 0x0118834f, 0x00caca90, 0x00d56ee9, 0x023bbcdf, 0x01e01329, 0x003d16fa}}}, + {X: Field{[10]uint32{0x033ec0df, 0x03c608b1, 0x01524b43, 0x01cf2230, 0x015073b0, 0x01337c04, 0x012305a9, 0x013b391a, 0x0278adcc, 0x002376f4}}, Y: Field{[10]uint32{0x00fc5b0c, 0x024ec5e0, 0x0102268b, 0x016e8cec, 0x005d2d67, 0x00a31de1, 0x029ea1ae, 0x031b232a, 0x02dd3c52, 0x00241443}}}, + {X: Field{[10]uint32{0x03e36626, 0x00743035, 0x00739304, 0x01e2abdc, 0x00607d78, 0x008e0983, 0x03149c3d, 0x03fd7c8a, 0x0082b162, 0x0025cafc}}, Y: Field{[10]uint32{0x004087dc, 0x01416f93, 0x01324797, 0x0093408d, 0x026eca9f, 0x03a42910, 0x01b64f43, 0x02f29366, 0x03baf61c, 0x0011a16c}}}, + {X: Field{[10]uint32{0x03c97230, 0x03315f2e, 0x0280f540, 0x0182f218, 0x01d8c1f7, 0x0145348f, 0x02801c54, 0x012ae5f7, 0x01526660, 0x0010abc3}}, Y: Field{[10]uint32{0x0299ce38, 0x024afb05, 0x03b89771, 0x01a26378, 0x01cced06, 0x025edd35, 0x017160bd, 0x00a7b50d, 0x03898c90, 0x00015926}}}, + {X: Field{[10]uint32{0x03bb30ac, 0x0188fcf5, 0x010a9fa5, 0x00853010, 0x021748ee, 0x02686831, 0x02138bca, 0x01b47639, 0x03708729, 0x00014d99}}, Y: Field{[10]uint32{0x015cac1d, 0x02e3f63b, 0x01f31fd8, 0x00b96564, 0x027c297b, 0x01cb642e, 0x0219c2f6, 0x02834d49, 0x0260786b, 0x00381a0e}}}, + {X: Field{[10]uint32{0x0039fc24, 0x0157047f, 0x002559de, 0x02d2b648, 0x017d5d0a, 0x033903a4, 0x00308d6b, 0x02c63fc1, 0x0284e85b, 0x00280ed8}}, Y: Field{[10]uint32{0x00785493, 0x0356a3fa, 0x035644ca, 0x016f8052, 0x02c07300, 0x024e76e2, 0x03e7235a, 0x030d208f, 0x0282c22c, 0x0009ce7b}}}, + {X: Field{[10]uint32{0x02b66e97, 0x00b893c9, 0x03a63733, 0x0326648c, 0x01f5801d, 0x02893df7, 0x01980550, 0x014e9af6, 0x02d7268a, 0x000bce53}}, Y: Field{[10]uint32{0x03918d88, 0x03d3375c, 0x014138d3, 0x027d7415, 0x000e49d0, 0x009af130, 0x03d3714a, 0x02ea1b46, 0x033ee934, 0x002d4ad3}}}, + {X: Field{[10]uint32{0x0133f8ab, 0x01684b1c, 0x016ebbb3, 0x03b7bc2d, 0x027740bc, 0x0047bd7f, 0x020c19a6, 0x014df8ea, 0x0010527e, 0x00245dcc}}, Y: Field{[10]uint32{0x029fb5b6, 0x012053fa, 0x0396500f, 0x017333ee, 0x01b097ae, 0x02ef0dad, 0x021063ab, 0x0120249f, 0x03b328b6, 0x001a3e4d}}}, + {X: Field{[10]uint32{0x004af615, 0x018035a4, 0x00b24763, 0x03154280, 0x0028486b, 0x0354a77e, 0x020c1aeb, 0x022bc5e8, 0x01bfcddc, 0x000a146f}}, Y: Field{[10]uint32{0x00cb1356, 0x016cb5b7, 0x017585d1, 0x0320edcc, 0x02ee2acf, 0x00cc0d75, 0x006c3760, 0x009eb9b5, 0x0085702e, 0x0034c0b0}}}, + {X: Field{[10]uint32{0x014bdfef, 0x0136920c, 0x029c25d3, 0x018d69bc, 0x038be3d3, 0x02d1f965, 0x0210b791, 0x0267c515, 0x03ab0254, 0x003a61b5}}, Y: Field{[10]uint32{0x03de35a6, 0x00f0cc51, 0x01c165f5, 0x00b4c710, 0x01cfdb18, 0x00441156, 0x02c63b96, 0x03054043, 0x00dcb3b3, 0x0003418e}}}, + {X: Field{[10]uint32{0x038bfc03, 0x019238a3, 0x02099b2e, 0x0329fefe, 0x00ab44da, 0x020c7609, 0x001c5e0d, 0x02cb38b7, 0x032c5639, 0x002f1176}}, Y: Field{[10]uint32{0x03213e32, 0x03e6d481, 0x028842c1, 0x02020981, 0x0079a805, 0x02a7d4f8, 0x02327400, 0x0226b527, 0x03b127b2, 0x001764f8}}}, + {X: Field{[10]uint32{0x00a8dfc6, 0x012632d4, 0x022fd667, 0x004b29ec, 0x01849ef5, 0x0278a440, 0x027b4c84, 0x020274b1, 0x027e47d9, 0x00105175}}, Y: Field{[10]uint32{0x0113f096, 0x0085ce91, 0x00ea9492, 0x001f58a4, 0x03daeae0, 0x0036a993, 0x008604d9, 0x01fe0a5c, 0x00fc2a4f, 0x00151c7d}}}, + {X: Field{[10]uint32{0x00686825, 0x035d03d7, 0x02fa3c1a, 0x021f9e96, 0x02427e30, 0x01ce373a, 0x015314aa, 0x02755aec, 0x037f4cd7, 0x000b455f}}, Y: Field{[10]uint32{0x016fc1c0, 0x03c7a88a, 0x034eeeab, 0x0084e9c8, 0x02962a4e, 0x01d9aed1, 0x027a29a2, 0x027d2e53, 0x03187615, 0x0030713c}}}, + {X: Field{[10]uint32{0x033933ba, 0x035e5869, 0x0187b361, 0x025a089a, 0x03d6e896, 0x0304aa06, 0x03e26cb0, 0x002cb977, 0x02847704, 0x000bd098}}, Y: Field{[10]uint32{0x0144075e, 0x0120f460, 0x024bd45e, 0x010a1e7c, 0x00a384f9, 0x01d54cbe, 0x03cf601c, 0x00a1e7bf, 0x020d141b, 0x002f7384}}}, + {X: Field{[10]uint32{0x03bf527f, 0x007fff0e, 0x0220ab8a, 0x0110dfa8, 0x03bf9f8f, 0x03bc8f29, 0x003c9c0e, 0x004c0b9a, 0x03a76cc9, 0x002d0673}}, Y: Field{[10]uint32{0x02929517, 0x009478ea, 0x00dba3c0, 0x015b8f34, 0x00a911e9, 0x012201ad, 0x0091a70b, 0x00906792, 0x014e290f, 0x002ee1a5}}}, + {X: Field{[10]uint32{0x0125236f, 0x035cb552, 0x018dcae2, 0x0026c0da, 0x012b17bd, 0x0037b64e, 0x02f2913f, 0x00593f1e, 0x02f95734, 0x00336d29}}, Y: Field{[10]uint32{0x02c8e7aa, 0x03e39baa, 0x025ffc9e, 0x00f013c4, 0x01d57c96, 0x01265914, 0x0100c47d, 0x03d75c39, 0x0236bd1b, 0x00227b68}}}, + {X: Field{[10]uint32{0x0008c256, 0x02003e3d, 0x00a3e321, 0x013088cf, 0x00a12a8c, 0x000e4bfa, 0x026f2f15, 0x031128cf, 0x0351a45a, 0x003b53a9}}, Y: Field{[10]uint32{0x030ffef2, 0x01018d25, 0x0264acaf, 0x018e62b3, 0x00a296d9, 0x0013644b, 0x01266d4d, 0x00d26aba, 0x01a74a2b, 0x00271fa7}}}, + {X: Field{[10]uint32{0x00fbf5d3, 0x03b3428f, 0x0287c96d, 0x000be9e6, 0x0384a74b, 0x037c229c, 0x00ccfcd1, 0x018f0a0c, 0x0138fdf9, 0x0026c1bf}}, Y: Field{[10]uint32{0x03226416, 0x0277801a, 0x020d4eb2, 0x028ca86c, 0x023ede27, 0x0136b435, 0x004ba3cd, 0x018056bb, 0x021ce7ee, 0x003a1991}}}, + {X: Field{[10]uint32{0x02f6ae75, 0x01b94846, 0x004ef516, 0x012f7869, 0x02c2b789, 0x001c0815, 0x0213f1ee, 0x03346a5f, 0x001eefc1, 0x0037c452}}, Y: Field{[10]uint32{0x022b7e02, 0x0152ae88, 0x03ad4a83, 0x0185c5ea, 0x0180c766, 0x039cf8b3, 0x02e1f24d, 0x027e87af, 0x00563542, 0x00285046}}}, + {X: Field{[10]uint32{0x02a3c9f5, 0x0280cb44, 0x0284523d, 0x00569462, 0x0146e4df, 0x0201f186, 0x03bc65de, 0x00fecf41, 0x01010b1f, 0x003e0ca3}}, Y: Field{[10]uint32{0x01ca6216, 0x003c4033, 0x01df0d5e, 0x0051e9c2, 0x02de1749, 0x0172a7af, 0x029a6d0b, 0x0351e272, 0x00747746, 0x0038a76f}}}, + {X: Field{[10]uint32{0x013fff86, 0x03c024d3, 0x01e461fc, 0x01ea4b82, 0x01ff0d1b, 0x02b313ed, 0x02135900, 0x008c07e6, 0x03bdb7fc, 0x000f8ebe}}, Y: Field{[10]uint32{0x02b6ebd6, 0x0098849b, 0x00742f0f, 0x0070fb0a, 0x01a5c2af, 0x01866bac, 0x004c8d09, 0x007146f5, 0x03e1b982, 0x0007f1fd}}}, + {X: Field{[10]uint32{0x03f86125, 0x007aa6c7, 0x0166074d, 0x02013154, 0x0078ede8, 0x0274cd6d, 0x0019f8b6, 0x02005673, 0x02ea6834, 0x002ab45f}}, Y: Field{[10]uint32{0x01365257, 0x033e77e7, 0x008e8ed6, 0x02749ad2, 0x00dfa174, 0x0187ba44, 0x00f45bf3, 0x02276d9f, 0x038cebab, 0x0003a64e}}}, + {X: Field{[10]uint32{0x010ea35c, 0x03a65ca4, 0x0072d37c, 0x02e3eca4, 0x00286442, 0x0389a85e, 0x00f44b6f, 0x031a1bfa, 0x03195515, 0x00084fee}}, Y: Field{[10]uint32{0x0152a852, 0x0225a77b, 0x0136218e, 0x016189e0, 0x03d68c39, 0x0261d880, 0x00ee5771, 0x03d2ecb4, 0x011b7df7, 0x00125ee5}}}, + {X: Field{[10]uint32{0x030120fa, 0x024de40d, 0x021a2924, 0x011c24a0, 0x03eba91b, 0x022e31e9, 0x013321ec, 0x020678fa, 0x02a578ed, 0x00335fdc}}, Y: Field{[10]uint32{0x01bb1148, 0x03d7f3d1, 0x03ce2d8f, 0x02464fa5, 0x02ca4eac, 0x02441df9, 0x02c537d9, 0x003cb3e8, 0x00709928, 0x0028f547}}}, + {X: Field{[10]uint32{0x027f3b51, 0x0248f82d, 0x01b19068, 0x03061e3e, 0x038240ae, 0x0346a78b, 0x023a28a1, 0x00a4e7e6, 0x00c700a7, 0x001c28d8}}, Y: Field{[10]uint32{0x01710259, 0x001554ab, 0x021b73eb, 0x0261b4bd, 0x00dd175c, 0x01a82ee3, 0x024ae36b, 0x036f08ba, 0x007c53a4, 0x00287670}}}, + {X: Field{[10]uint32{0x01b5e46a, 0x01d98048, 0x02d337a0, 0x03f67369, 0x00eedc35, 0x027a72fa, 0x021dd199, 0x00ad983e, 0x015b4f8e, 0x00151298}}, Y: Field{[10]uint32{0x028451e5, 0x0142cd6e, 0x026bd751, 0x0269cc23, 0x03d7ba7a, 0x0376725f, 0x0286aecb, 0x03235d94, 0x01b9c76f, 0x001d749b}}}, + {X: Field{[10]uint32{0x02c8acef, 0x030d19e3, 0x03c92a01, 0x03dcdb08, 0x00f8b779, 0x01356d72, 0x019b2657, 0x01cf5ebc, 0x039f76a0, 0x00108635}}, Y: Field{[10]uint32{0x02cfb28e, 0x0007ae6f, 0x00bdaf2c, 0x0157881f, 0x0187e603, 0x02ca1308, 0x01c05f4e, 0x00ed7f99, 0x02314907, 0x001a057d}}}, + {X: Field{[10]uint32{0x0269b0a9, 0x00bf06a8, 0x03b3864a, 0x01767936, 0x0203deca, 0x018d7e0e, 0x03337598, 0x02b30628, 0x02381a82, 0x001ab689}}, Y: Field{[10]uint32{0x02da6c08, 0x03388a57, 0x033bae8a, 0x03e2d854, 0x012e77b6, 0x022d7e10, 0x0105f32b, 0x0149bd83, 0x02da65f7, 0x0014f4d5}}}, + {X: Field{[10]uint32{0x0118b09e, 0x019863b8, 0x03579336, 0x0291e04f, 0x018bd46e, 0x030e0b10, 0x0118e987, 0x026965d5, 0x0101d9f2, 0x0017ea67}}, Y: Field{[10]uint32{0x03fc3b39, 0x003a0b4c, 0x034cd6fc, 0x000b6fb0, 0x02f15f66, 0x0260994a, 0x00e381e4, 0x02e06f73, 0x023838de, 0x00351e74}}}, + {X: Field{[10]uint32{0x00d76f6e, 0x000656d1, 0x03e4412d, 0x0002cadf, 0x030bbb4a, 0x03fbe5b4, 0x02676d72, 0x019eadba, 0x017634cc, 0x00331bb5}}, Y: Field{[10]uint32{0x03bf820c, 0x002bd8bd, 0x03e94f52, 0x00343692, 0x03dd801b, 0x020d0a13, 0x009e5f15, 0x0266e2ab, 0x015ad509, 0x0002c570}}}, + {X: Field{[10]uint32{0x00ffceb4, 0x00bb8e90, 0x03ddfec3, 0x01e761d1, 0x01ff4476, 0x00289adb, 0x0310bf89, 0x03a8ff7a, 0x03db5323, 0x00393343}}, Y: Field{[10]uint32{0x0220e1f5, 0x021a8c34, 0x00c48d5d, 0x01ef107e, 0x00e2caa8, 0x02dd8a71, 0x02af718d, 0x010d5d95, 0x00c8ba9c, 0x003ef6d0}}}, + {X: Field{[10]uint32{0x0388a8af, 0x02df3626, 0x025686af, 0x03b1e9d5, 0x030b3c1f, 0x008d1a0c, 0x01e3ca1a, 0x02e4a6b0, 0x022aba51, 0x001dff5c}}, Y: Field{[10]uint32{0x01e98505, 0x0243d6cf, 0x006919cf, 0x016cb1ec, 0x006b5b55, 0x037d2edd, 0x0378ee31, 0x0272d13c, 0x01e10d6e, 0x00340946}}}, + {X: Field{[10]uint32{0x017a41dd, 0x010630a6, 0x033e2665, 0x008e57fd, 0x006291e5, 0x00a67d3e, 0x03ca57bf, 0x00f51e74, 0x03bca9dd, 0x00134e47}}, Y: Field{[10]uint32{0x00ce899e, 0x03afc96d, 0x02fce1a9, 0x0310e7b1, 0x03e5d4a3, 0x024f10fc, 0x03e9fcd5, 0x0181aee4, 0x0033b55e, 0x0017327b}}}, + {X: Field{[10]uint32{0x03084e97, 0x00e9115c, 0x022ba83f, 0x03e20586, 0x012eb232, 0x0324bfa0, 0x019d63c3, 0x01ee1172, 0x004617b1, 0x001d02f1}}, Y: Field{[10]uint32{0x00355464, 0x00952bfe, 0x00c67883, 0x00aa640a, 0x02fb1074, 0x004c061d, 0x0317481c, 0x02559dc5, 0x006e0f4f, 0x0003f63b}}}, + {X: Field{[10]uint32{0x01b46e5c, 0x004396c0, 0x00392b2d, 0x03106f73, 0x00c6aa12, 0x0333b40c, 0x02fd8d60, 0x02114d6e, 0x021cadeb, 0x00309630}}, Y: Field{[10]uint32{0x01171d31, 0x01884e57, 0x022af4cb, 0x029d7b0f, 0x02b73646, 0x0083797c, 0x01d08afa, 0x02f5fdce, 0x037f3e60, 0x001f37c0}}}, + {X: Field{[10]uint32{0x00130d44, 0x03fee0c9, 0x01768dbe, 0x01786fff, 0x01fac22a, 0x00327299, 0x0180261c, 0x0135742f, 0x0069733a, 0x0023f220}}, Y: Field{[10]uint32{0x02fc946e, 0x03d2a804, 0x00a95954, 0x0298e3c3, 0x01ca5bf0, 0x0073b9a4, 0x0137ba74, 0x0010b553, 0x014bf88c, 0x0010846a}}}, + {X: Field{[10]uint32{0x0096ad4c, 0x0186ee43, 0x027c967a, 0x038ccae0, 0x00f5152d, 0x03a674c5, 0x03b0e0bc, 0x007091fe, 0x021a4032, 0x0033d8bb}}, Y: Field{[10]uint32{0x02c4a3fe, 0x00259007, 0x015a19bb, 0x00d99043, 0x02e61373, 0x01f70348, 0x01978c07, 0x01ee352f, 0x03c3e64f, 0x0018a129}}}, + {X: Field{[10]uint32{0x009f8ba7, 0x00103915, 0x019d06c0, 0x032bf5bf, 0x00bb00b3, 0x026da458, 0x00884431, 0x01dd83b3, 0x038a4d44, 0x0014cd47}}, Y: Field{[10]uint32{0x037f6b83, 0x014af34d, 0x02a0a163, 0x02e23027, 0x00c7c1cb, 0x015220e1, 0x01c148fd, 0x039bfdd5, 0x02193816, 0x0020e113}}}, + {X: Field{[10]uint32{0x0106bb0c, 0x00cd2287, 0x000a9e17, 0x01eb4b98, 0x03baa015, 0x02b3a501, 0x010e1f62, 0x02464653, 0x03ceee2c, 0x00280818}}, Y: Field{[10]uint32{0x03146339, 0x03061ba7, 0x01de05f4, 0x02c0401f, 0x03fcdaee, 0x011122a2, 0x01b40eac, 0x00fd4b6a, 0x01b55565, 0x0018c118}}}, + {X: Field{[10]uint32{0x01d35660, 0x02a35bf8, 0x018575a6, 0x027a546e, 0x02c360c0, 0x0259822a, 0x034f3741, 0x005d91c9, 0x01cc25de, 0x001c2f2f}}, Y: Field{[10]uint32{0x03461d74, 0x02c3d3b6, 0x02b64a90, 0x00c252a0, 0x003a1c74, 0x02787503, 0x035e719a, 0x01673a02, 0x019b7163, 0x000ef56f}}}, + {X: Field{[10]uint32{0x02dc8fc7, 0x004b466a, 0x01fff138, 0x0305d055, 0x0054b161, 0x02945778, 0x03b1fe52, 0x030f01be, 0x017783cf, 0x00037e2b}}, Y: Field{[10]uint32{0x00069569, 0x031cd560, 0x0060444e, 0x006c4993, 0x01af3840, 0x002df2e6, 0x034ff20a, 0x036c3274, 0x00f60416, 0x002f1024}}}, + {X: Field{[10]uint32{0x000a30f9, 0x02a76795, 0x009ed777, 0x011f8154, 0x028788df, 0x014b55be, 0x02fff3a4, 0x0260017c, 0x01ccef39, 0x0009413a}}, Y: Field{[10]uint32{0x0390612a, 0x0167de5c, 0x00a51116, 0x013b6da4, 0x036fd651, 0x02d7f60c, 0x03f4d2fa, 0x023bf2bd, 0x02a2c6f4, 0x001cf141}}}, + {X: Field{[10]uint32{0x03c97025, 0x005068d6, 0x03a61571, 0x00320678, 0x0218a9ce, 0x0225e7f3, 0x02a6fa56, 0x000cd0e9, 0x03241c92, 0x00093b81}}, Y: Field{[10]uint32{0x00bd7b8a, 0x00909f2c, 0x00bf6ba2, 0x00580bec, 0x03fa0c68, 0x035fd364, 0x0140a6cc, 0x0213a1a2, 0x02cd605b, 0x003b990b}}}, + {X: Field{[10]uint32{0x023929b3, 0x01b6465e, 0x03093e1c, 0x00ac9700, 0x014961e1, 0x00825fcd, 0x00d8eb11, 0x0301698f, 0x00e09665, 0x0007ab57}}, Y: Field{[10]uint32{0x0156fcc3, 0x012a9b5c, 0x0009dc2f, 0x03d77b9c, 0x007284b5, 0x00775c48, 0x0032fbea, 0x03312ac7, 0x035da1ab, 0x00060037}}}, + {X: Field{[10]uint32{0x0205d507, 0x01e247ba, 0x009c098e, 0x03bcb97a, 0x03160c69, 0x020e21d2, 0x020b0dcd, 0x013e3e40, 0x03f22608, 0x0011f3cb}}, Y: Field{[10]uint32{0x01fb7d48, 0x03e948b5, 0x03516cf8, 0x03723720, 0x00bca2ef, 0x00e19919, 0x004d0d2c, 0x016bfc41, 0x03df129b, 0x0028d034}}}, + {X: Field{[10]uint32{0x02d6cbdd, 0x038e7110, 0x03e75b04, 0x02a0fe69, 0x0151f050, 0x0391d293, 0x018bb8ea, 0x01254a88, 0x039b8e2e, 0x0010193e}}, Y: Field{[10]uint32{0x0035de10, 0x0221b76e, 0x03d2b9c7, 0x030346b7, 0x0118ea66, 0x02b77383, 0x013e02aa, 0x0064c24b, 0x0076a2ef, 0x003fe73b}}}, + {X: Field{[10]uint32{0x0381904e, 0x038cd4fe, 0x000d222d, 0x0101a766, 0x03cdd70a, 0x029b5007, 0x01e0150b, 0x008340c8, 0x00d6e58e, 0x0020e2b2}}, Y: Field{[10]uint32{0x015614bc, 0x015222b6, 0x027105f9, 0x03f03a24, 0x01b1ef24, 0x01054ccc, 0x01a6b251, 0x036efdee, 0x03962909, 0x00264e9b}}}, + {X: Field{[10]uint32{0x0202f266, 0x03a6d7b8, 0x033855fc, 0x01caf133, 0x035aedee, 0x03b3d650, 0x016ea260, 0x010f48d3, 0x0183189d, 0x002978db}}, Y: Field{[10]uint32{0x01822c55, 0x02c7251e, 0x03fe954a, 0x02d79fae, 0x03dfc2d1, 0x01050d68, 0x012933fb, 0x00ee2677, 0x003ce25c, 0x001e300b}}}, + {X: Field{[10]uint32{0x03ba72c9, 0x0323f8c7, 0x035725dd, 0x01ea6d47, 0x015ad79e, 0x0235bdeb, 0x03312095, 0x03134cd3, 0x00bcd357, 0x00278903}}, Y: Field{[10]uint32{0x0111f06b, 0x0245cb2d, 0x030eb672, 0x00433be7, 0x0068cc5e, 0x00c2cf27, 0x01476b7b, 0x02818bb0, 0x025ced60, 0x002ba8d2}}}, + {X: Field{[10]uint32{0x02dc2eba, 0x036bb0ed, 0x020c7ea8, 0x016a182f, 0x02dfc9ed, 0x03b91e89, 0x022b91d1, 0x014e0170, 0x0246bb31, 0x002b46c1}}, Y: Field{[10]uint32{0x02dd2083, 0x02e65564, 0x018bb353, 0x02a5b4c3, 0x03a298da, 0x0285661c, 0x0110c9ee, 0x0314246a, 0x01a22499, 0x003b8b98}}}, + {X: Field{[10]uint32{0x030ec72b, 0x02df34d6, 0x020cc35c, 0x01d288da, 0x02fa12df, 0x0047b2a9, 0x00d8c7f0, 0x03d92954, 0x008911d8, 0x0013dec2}}, Y: Field{[10]uint32{0x01bb21e3, 0x00549713, 0x01d993e3, 0x0143c778, 0x0129b942, 0x035fe1a4, 0x019ffac8, 0x01f862d3, 0x001b0d29, 0x0024c6bd}}}, + {X: Field{[10]uint32{0x03d3a7ee, 0x00d48f24, 0x01870d2d, 0x01d0d5a5, 0x02834d02, 0x002ec4be, 0x03ba8747, 0x023cf24f, 0x0170e410, 0x0036aca8}}, Y: Field{[10]uint32{0x0173ae4d, 0x002cbef1, 0x0251e7bb, 0x01bc5d19, 0x03293a5c, 0x002338d6, 0x02ecb24d, 0x0004377a, 0x02cfc37f, 0x00098bc4}}}, + {X: Field{[10]uint32{0x03cf39be, 0x031d2128, 0x03a317ab, 0x021f12f3, 0x02d499f6, 0x0046d699, 0x01e50823, 0x035cb906, 0x017b0784, 0x000d0dc9}}, Y: Field{[10]uint32{0x01c398d3, 0x02cef6a9, 0x00ec2a49, 0x0281dbc7, 0x00f38bd0, 0x02c1b5f0, 0x013fa143, 0x035a3a11, 0x03076da8, 0x0033a6f3}}}, + {X: Field{[10]uint32{0x0099545b, 0x0179cd82, 0x0155c9ed, 0x0024d2b4, 0x03939fa4, 0x028d2feb, 0x0386024e, 0x006ad6fd, 0x029f8261, 0x0011652b}}, Y: Field{[10]uint32{0x02d450f5, 0x00fe4a3a, 0x00da4c4b, 0x0178fb83, 0x0177d3f1, 0x01ded1e3, 0x0034e72e, 0x02e9cb0e, 0x03f562b0, 0x00089571}}}, + {X: Field{[10]uint32{0x01898819, 0x0084b760, 0x003c2f13, 0x00dac89d, 0x033aebb0, 0x01ad6169, 0x02b21fc2, 0x001bec0d, 0x030512db, 0x0001ccdd}}, Y: Field{[10]uint32{0x00307887, 0x00315fd4, 0x03c51515, 0x03b4a4a0, 0x00848b53, 0x0161fcfe, 0x01cf461c, 0x02c28958, 0x0159725f, 0x001d4f77}}}, + {X: Field{[10]uint32{0x029790ff, 0x02af59b5, 0x0372e3f2, 0x00b41953, 0x00a53f4c, 0x0231d2af, 0x02d81c10, 0x03fbcd54, 0x00144d2a, 0x002f6456}}, Y: Field{[10]uint32{0x0027763e, 0x01fb4b46, 0x005b950e, 0x016e5783, 0x0231ae89, 0x017d1c52, 0x02b3277a, 0x038dced0, 0x01e17f27, 0x0006bd82}}}, + {X: Field{[10]uint32{0x015bb557, 0x0395b6e4, 0x03c73d4c, 0x01007d27, 0x01677827, 0x00f621c3, 0x001ced90, 0x03fb88a3, 0x014ca51d, 0x00228473}}, Y: Field{[10]uint32{0x02f5cf23, 0x003d8655, 0x017196be, 0x03c09cce, 0x02ca46b3, 0x03d1c403, 0x00278229, 0x02725fbb, 0x03eeae9f, 0x0034c2b5}}}, + {X: Field{[10]uint32{0x039bfcfd, 0x011b61db, 0x01ea697d, 0x035f0291, 0x03cfd058, 0x016c09ca, 0x023e6886, 0x02ffadb0, 0x01f02802, 0x001e4a6d}}, Y: Field{[10]uint32{0x00fde5d0, 0x02d538bd, 0x00b36963, 0x033507c2, 0x018c80d1, 0x00aa2430, 0x01e366c3, 0x01e0f534, 0x02218039, 0x003e6eeb}}}, + {X: Field{[10]uint32{0x03d89d01, 0x0131498e, 0x018bcf6e, 0x01566c69, 0x03d55f88, 0x0327c07c, 0x000e79bc, 0x0259be02, 0x02ac1d5b, 0x002037c1}}, Y: Field{[10]uint32{0x01136538, 0x006ab250, 0x03a7ebe4, 0x00dc9983, 0x025ee5c3, 0x030043cd, 0x025614ba, 0x0162a498, 0x02d0a595, 0x000d1a49}}}, + {X: Field{[10]uint32{0x025ccaf7, 0x020cc56f, 0x00ac6efc, 0x036b483d, 0x03ed4b01, 0x020eb44e, 0x0292b4f3, 0x020fca52, 0x00789ff3, 0x001d1515}}, Y: Field{[10]uint32{0x0160fa9a, 0x01ddf2f0, 0x00ceafae, 0x018679d8, 0x03e82173, 0x0133cad7, 0x01ea165c, 0x01dffb78, 0x037781ee, 0x000d9227}}}, + {X: Field{[10]uint32{0x02f8fe85, 0x00af3616, 0x01e67de6, 0x0357e1df, 0x03e562d7, 0x00a0a2df, 0x0011fdb4, 0x02a28257, 0x01bcb213, 0x000b1b4d}}, Y: Field{[10]uint32{0x035d159b, 0x02f9ad31, 0x0163144d, 0x0270af4d, 0x002e6013, 0x00bc8ca6, 0x002206c7, 0x013e7d14, 0x03703409, 0x002a8c38}}}, + {X: Field{[10]uint32{0x02e338db, 0x0369c3ec, 0x027be830, 0x0274c12a, 0x024b4342, 0x00a33458, 0x011846a7, 0x013ac0a0, 0x017a9d93, 0x0020d4d9}}, Y: Field{[10]uint32{0x00e02b71, 0x0275011d, 0x003b166a, 0x02bcebfe, 0x02ed4a4c, 0x039a4f22, 0x0189c5ac, 0x03e974a0, 0x0038020f, 0x003e1001}}}, + {X: Field{[10]uint32{0x02ae494f, 0x02a377ea, 0x027f6fd1, 0x01cd3b61, 0x012177ca, 0x018698a6, 0x02f63365, 0x015b5f1f, 0x013a54ce, 0x003c85ba}}, Y: Field{[10]uint32{0x00d30611, 0x00fa912b, 0x036723f4, 0x02dc0bc6, 0x038da296, 0x004730d1, 0x03e8fadb, 0x020c9818, 0x0313a0fe, 0x0036c28f}}}, + {X: Field{[10]uint32{0x008324fb, 0x0342046a, 0x03112273, 0x032379b9, 0x002e9a3d, 0x018bb1fd, 0x022baa4b, 0x01cfe595, 0x02219b5d, 0x00370dc4}}, Y: Field{[10]uint32{0x0357c004, 0x02c553f7, 0x000fb581, 0x0055f0cc, 0x004f1c90, 0x00a7e6ed, 0x020acaa9, 0x00fa58dc, 0x0092ec56, 0x003bb324}}}, + {X: Field{[10]uint32{0x02649475, 0x02641c8d, 0x0116dd44, 0x01ed0959, 0x02b10f04, 0x03bd4d2b, 0x02f60296, 0x02d3c787, 0x036d48f0, 0x0036cd1c}}, Y: Field{[10]uint32{0x00586bec, 0x02f93fab, 0x00fdfdd1, 0x01985934, 0x001a1169, 0x024f9462, 0x02c34c9b, 0x031e1a54, 0x016cf7a8, 0x00070a73}}}, + {X: Field{[10]uint32{0x03696add, 0x031ca5c0, 0x03d3378f, 0x03b4d63e, 0x01971b09, 0x00bd6f3c, 0x015af536, 0x021093cd, 0x00572046, 0x00028921}}, Y: Field{[10]uint32{0x02547803, 0x028ddd89, 0x006948c9, 0x00c6f214, 0x03baffc9, 0x00b8915c, 0x0367a56c, 0x037ae28d, 0x016137d0, 0x00269c0f}}}, + {X: Field{[10]uint32{0x024436c4, 0x027ea8c4, 0x01ed240c, 0x02e63ec9, 0x023eba38, 0x007da343, 0x02aa4293, 0x01d4eeef, 0x006fa9ac, 0x002edee0}}, Y: Field{[10]uint32{0x02426752, 0x020daa04, 0x02e646e5, 0x0273e6d0, 0x0007c6ff, 0x026c0543, 0x03682e3d, 0x02efa366, 0x0174a1a8, 0x0023e049}}}, + {X: Field{[10]uint32{0x03ecf446, 0x0025bff0, 0x01ad517b, 0x02a9d125, 0x00489344, 0x02783c1a, 0x02194276, 0x02808fd9, 0x0076fc28, 0x0019c0f1}}, Y: Field{[10]uint32{0x00e2a38c, 0x02b10f4a, 0x0215eed3, 0x02ac148b, 0x00f42699, 0x019cc785, 0x00211a30, 0x029c8d61, 0x023f7c9b, 0x0022d200}}}, + {X: Field{[10]uint32{0x02dbf6a2, 0x012e9878, 0x023b71b4, 0x02a8d251, 0x0214cf0d, 0x00584ae0, 0x023f3b7a, 0x02d123f8, 0x00e4bfa4, 0x002f2abe}}, Y: Field{[10]uint32{0x01c7f404, 0x0385c435, 0x01736d6f, 0x03b1a333, 0x03b07498, 0x02fa1e4e, 0x0108835d, 0x0254ffa7, 0x0300e2cc, 0x002f7fc9}}}, + {X: Field{[10]uint32{0x0310cd49, 0x0361e464, 0x00f7bbfe, 0x005cfb1d, 0x02217945, 0x01c9a8b9, 0x015b446d, 0x01c88077, 0x03da1a55, 0x00241ad3}}, Y: Field{[10]uint32{0x012653cf, 0x029d34e2, 0x00f93441, 0x0240b5fd, 0x01cf8384, 0x021a421c, 0x0304bc47, 0x0134a340, 0x02dbcd2c, 0x0035d4fc}}}, + {X: Field{[10]uint32{0x02f93d5f, 0x009ab0e7, 0x029058d7, 0x0337ade1, 0x00fa5369, 0x006ff741, 0x000e326e, 0x01f65546, 0x0383018f, 0x0027b025}}, Y: Field{[10]uint32{0x03acf205, 0x0252b765, 0x02049d17, 0x03e3e252, 0x00ad22ba, 0x034a3edc, 0x02c68424, 0x0059054e, 0x0057994b, 0x002732a0}}}, + {X: Field{[10]uint32{0x02b8209d, 0x038cc504, 0x030f3a2d, 0x02faec00, 0x036f823c, 0x004534bc, 0x0362a96f, 0x0103b0a0, 0x0106b754, 0x0014cd1e}}, Y: Field{[10]uint32{0x020c1fa0, 0x02824332, 0x0034ab06, 0x0200f864, 0x01595816, 0x025543b1, 0x02f1bf02, 0x022af91f, 0x00e0471f, 0x000332ce}}}, + {X: Field{[10]uint32{0x023a4870, 0x023e0374, 0x013373b9, 0x00445485, 0x03a33e54, 0x02cd5e01, 0x0224b18e, 0x0012024f, 0x032961b7, 0x0009f14f}}, Y: Field{[10]uint32{0x02575601, 0x02e222f6, 0x014fe2f3, 0x03ea2016, 0x00703fa5, 0x02b23139, 0x03c70e59, 0x00db11c7, 0x038de186, 0x00168fd2}}}, + {X: Field{[10]uint32{0x0259b68f, 0x03339d77, 0x02a5beac, 0x028f9d72, 0x0322ed51, 0x03d57084, 0x02616bac, 0x017e684a, 0x03e37a11, 0x00248649}}, Y: Field{[10]uint32{0x0327b141, 0x00db1341, 0x00ae2e06, 0x01c45e19, 0x0155884e, 0x0098f5de, 0x02fb5906, 0x0316d662, 0x007bc1e4, 0x002f6edf}}}, + {X: Field{[10]uint32{0x033ea8c2, 0x01b35b8f, 0x01ff8dde, 0x002468f6, 0x01efb3e6, 0x0390c9d4, 0x03c692ca, 0x007ff59d, 0x00876eb8, 0x0025cecf}}, Y: Field{[10]uint32{0x03bbb0ed, 0x03af7655, 0x003b849a, 0x02b8ea5a, 0x018684b0, 0x036f3b36, 0x0112c5da, 0x01442e90, 0x03710129, 0x000d037d}}}, + {X: Field{[10]uint32{0x0301ae71, 0x017a6b06, 0x02ce4020, 0x00c84995, 0x00d5972c, 0x024811c0, 0x038ef036, 0x00dd9e64, 0x03def053, 0x00082e05}}, Y: Field{[10]uint32{0x0395707b, 0x0052aa20, 0x01c1234a, 0x0193faa6, 0x01c6b1ce, 0x01282af1, 0x025c3529, 0x02805871, 0x025be2da, 0x000ab8bf}}}, + {X: Field{[10]uint32{0x03c95876, 0x02226d28, 0x01402aa6, 0x0358f64c, 0x01ca9fc5, 0x01cbad0f, 0x02347b7f, 0x0246041e, 0x004f7a7e, 0x0018f895}}, Y: Field{[10]uint32{0x000d16b1, 0x032b5c4a, 0x02067f91, 0x02c7e1b9, 0x02adf49c, 0x022f57eb, 0x01cdf521, 0x00533801, 0x026d20d7, 0x00398abb}}}, + {X: Field{[10]uint32{0x022aeb80, 0x00e5d4f8, 0x034216ac, 0x01cb9060, 0x01a69dd4, 0x011f5d8b, 0x0183abfc, 0x0233c2cd, 0x02107150, 0x000be437}}, Y: Field{[10]uint32{0x0388d389, 0x024eaf4d, 0x0264b761, 0x0226708f, 0x00880f3a, 0x02846122, 0x01e5e025, 0x0375d189, 0x02bd04a0, 0x0014dc6f}}}, + {X: Field{[10]uint32{0x02ed7209, 0x0373ca74, 0x0048ac9a, 0x03082b47, 0x037c9359, 0x03968d47, 0x0237cf75, 0x01b41517, 0x00e8faa9, 0x0023508f}}, Y: Field{[10]uint32{0x03ab40f2, 0x002c4a42, 0x03d6eea8, 0x03056b02, 0x03bb9d23, 0x0299570f, 0x00df7948, 0x03100686, 0x003dee76, 0x0020f52e}}}, + {X: Field{[10]uint32{0x00181efd, 0x03b04420, 0x03ea3bec, 0x0220156c, 0x02a9c91d, 0x02451090, 0x03111a20, 0x022bfcc0, 0x01425e02, 0x0004be90}}, Y: Field{[10]uint32{0x00c3ff57, 0x00ab103a, 0x03d4dc4d, 0x022ecb8d, 0x03ee5c3b, 0x018bac43, 0x010eddb3, 0x00ad5eb0, 0x03708e79, 0x001ae56c}}}, + {X: Field{[10]uint32{0x02706f73, 0x011e20a2, 0x00bbff83, 0x01bfff43, 0x00ce7019, 0x037cb5cc, 0x0105632c, 0x0375f35d, 0x015f2a3b, 0x00248f2a}}, Y: Field{[10]uint32{0x0346abbc, 0x0106ad49, 0x032ee3e5, 0x036f2b42, 0x031903af, 0x00433ffc, 0x003983b2, 0x0185cece, 0x0066c39b, 0x003e2c32}}}, + {X: Field{[10]uint32{0x00893646, 0x027835a2, 0x01776a86, 0x02859882, 0x0064ce3a, 0x00a3d1c1, 0x023875a7, 0x0103a58f, 0x013e8782, 0x00021135}}, Y: Field{[10]uint32{0x03eeaca1, 0x01579cdb, 0x032b25b8, 0x031c67ec, 0x011c84f9, 0x01c4ef1d, 0x00c47b4a, 0x02307fe6, 0x029192bf, 0x00318334}}}, + {X: Field{[10]uint32{0x01dc98f3, 0x01eb087c, 0x02b2a65e, 0x027d998d, 0x03883829, 0x00016977, 0x0277ff81, 0x007636e8, 0x03d6c547, 0x0010de1b}}, Y: Field{[10]uint32{0x02091b51, 0x00bd4a95, 0x0127e914, 0x0213e630, 0x03745ff8, 0x021c1bf9, 0x039109cb, 0x016ef63d, 0x02c29c8c, 0x0034a4a8}}}, + {X: Field{[10]uint32{0x0236d7ab, 0x01cdb72b, 0x0257ce94, 0x01162c1c, 0x02bb0dec, 0x02e628b3, 0x0383f71f, 0x03b3d8e1, 0x028df5e9, 0x001b46f0}}, Y: Field{[10]uint32{0x00d549e6, 0x020008e2, 0x0238da0e, 0x001c8c85, 0x00e2c00e, 0x00a04237, 0x0214cf7a, 0x00111e18, 0x0192bfd8, 0x0030b150}}}, + {X: Field{[10]uint32{0x02ff86c6, 0x0255aac5, 0x037f67d8, 0x0333fe12, 0x016c742c, 0x00f89975, 0x033f89cc, 0x0338f0bb, 0x03347f74, 0x001af13b}}, Y: Field{[10]uint32{0x01b46408, 0x03f33c5e, 0x0066b8b0, 0x03918317, 0x01be26a6, 0x01af798b, 0x036be35c, 0x02c13c49, 0x02fd2d2a, 0x003ad124}}}, + {X: Field{[10]uint32{0x03678b38, 0x03ea66ef, 0x00ddcb35, 0x00af2ccf, 0x000d67a6, 0x00342357, 0x02a756e0, 0x00256350, 0x0075fa81, 0x001abd14}}, Y: Field{[10]uint32{0x025bff28, 0x01ffe7ee, 0x00bfd528, 0x024e1258, 0x02886c7b, 0x02dce199, 0x00ffc3fa, 0x020b1d9e, 0x024f0e76, 0x002b6edc}}}, + {X: Field{[10]uint32{0x01260600, 0x03a29995, 0x011caa24, 0x003e416b, 0x00939f34, 0x0156dd18, 0x02f49cd3, 0x018d96a5, 0x03763646, 0x003adb62}}, Y: Field{[10]uint32{0x03bea3cd, 0x02eb835f, 0x015c33c2, 0x021c0cfe, 0x0241f7a1, 0x000ee074, 0x03a11ff6, 0x002dfee6, 0x02fdaea3, 0x001eba73}}}, + {X: Field{[10]uint32{0x01795068, 0x0115d7a4, 0x000af11e, 0x026eb594, 0x01b34d5e, 0x02eb533d, 0x038dd694, 0x01f4fd9c, 0x02332fef, 0x002f4308}}, Y: Field{[10]uint32{0x011cf209, 0x02082fa7, 0x0113676f, 0x015ceaa7, 0x01a91c4d, 0x01a08e93, 0x01100b66, 0x02c8702a, 0x004e2ea0, 0x003aae97}}}, + {X: Field{[10]uint32{0x02b7e392, 0x03261e54, 0x034b5054, 0x027e010d, 0x030aa56d, 0x01092455, 0x003e0831, 0x025064d2, 0x03bdc504, 0x0031788e}}, Y: Field{[10]uint32{0x02597751, 0x022b1e9b, 0x00fe2f7f, 0x019a156d, 0x038d59e7, 0x02a92b8f, 0x01cd02e3, 0x0085feff, 0x00cbf684, 0x00132bae}}}, + {X: Field{[10]uint32{0x0092d2a3, 0x019f3e23, 0x00bd8108, 0x02637a8e, 0x0017178e, 0x03487181, 0x003edb03, 0x02ae4955, 0x0231f3aa, 0x002d5c5d}}, Y: Field{[10]uint32{0x0011942a, 0x01027ca3, 0x020e9a02, 0x02b23c74, 0x00d2bdf0, 0x00936ead, 0x03318745, 0x02a7bc22, 0x01cc0324, 0x0039d082}}}, + {X: Field{[10]uint32{0x01305cfc, 0x012d7a57, 0x00cca2fe, 0x01f1ee0e, 0x01b2d17b, 0x00c281f8, 0x00a85d5d, 0x007cbf2b, 0x00994960, 0x00271158}}, Y: Field{[10]uint32{0x0304eeb6, 0x03b81bbf, 0x00674674, 0x030d6172, 0x00329273, 0x0079401e, 0x001b61b3, 0x0371f0a1, 0x0140a109, 0x000b5e85}}}, + {X: Field{[10]uint32{0x02a82f63, 0x01de9462, 0x00d5498c, 0x0175cc8a, 0x03e33dae, 0x00ed9812, 0x02ff1757, 0x00db12a2, 0x0146c0ab, 0x0014ab8a}}, Y: Field{[10]uint32{0x037f87b4, 0x035dc71d, 0x0104d24d, 0x0320190c, 0x027179f5, 0x019524fc, 0x003f899b, 0x006fe934, 0x019b6606, 0x001c388f}}}, + {X: Field{[10]uint32{0x0394adf9, 0x0167c280, 0x03dcef4f, 0x030b0a7b, 0x0189db9a, 0x0210207a, 0x01ba4903, 0x0118b770, 0x03bf55ff, 0x000527b0}}, Y: Field{[10]uint32{0x009dd7af, 0x02a2f05e, 0x01801341, 0x01737e52, 0x0049642b, 0x039a5472, 0x028fbc7c, 0x02e508ab, 0x0188b91d, 0x00016707}}}, + {X: Field{[10]uint32{0x02ea7ea7, 0x018e0410, 0x005768a1, 0x00270534, 0x03dbe14a, 0x0054e368, 0x03835346, 0x0063777f, 0x0294d667, 0x002bfe24}}, Y: Field{[10]uint32{0x0159266b, 0x0139d913, 0x00bb9a92, 0x0244aa23, 0x017b6154, 0x02f095b7, 0x022352ac, 0x021e97b3, 0x03ebcf58, 0x001c619a}}}, + {X: Field{[10]uint32{0x004e76fc, 0x02ed0196, 0x02b78da7, 0x02dce38a, 0x0133887e, 0x000f8ad0, 0x012d49b3, 0x0011cab5, 0x00782cb3, 0x0037913d}}, Y: Field{[10]uint32{0x02482bf5, 0x0348f273, 0x01da7eef, 0x03ea0c3b, 0x01b13d08, 0x02b23bc8, 0x03c630d7, 0x0360b015, 0x018425ba, 0x0019e62b}}}, + {X: Field{[10]uint32{0x01682e61, 0x03b1f1ce, 0x021345a2, 0x03aca253, 0x02b3a380, 0x006e80b1, 0x032c88be, 0x024d9b05, 0x02737616, 0x00382f1e}}, Y: Field{[10]uint32{0x022cb2e0, 0x01827349, 0x024d3c23, 0x030aad50, 0x035ad1f7, 0x01edfa64, 0x027c0ec8, 0x023fa37f, 0x02b933b1, 0x002f451f}}}, + {X: Field{[10]uint32{0x032f0e6d, 0x01e91d80, 0x03b1127c, 0x0269c73e, 0x02ed2613, 0x0294da88, 0x033cfa70, 0x027cce51, 0x03272af6, 0x0017b8d3}}, Y: Field{[10]uint32{0x00e13b8c, 0x018abab1, 0x036cb807, 0x004370d8, 0x011316bf, 0x01737bf1, 0x0257de98, 0x01360bda, 0x0396dc0d, 0x003077e3}}}, + {X: Field{[10]uint32{0x0199a0f2, 0x03397a39, 0x0113a68b, 0x011afb57, 0x03672968, 0x03855f5e, 0x00c274df, 0x01e98e6e, 0x03c177fa, 0x0013728e}}, Y: Field{[10]uint32{0x012fb234, 0x030cb14f, 0x032a1d01, 0x01a14bbf, 0x012fb489, 0x03d6723a, 0x033fd758, 0x026baff6, 0x015836fb, 0x0023f4ad}}}, + {X: Field{[10]uint32{0x00b48136, 0x0211d47e, 0x004f5bc1, 0x00d280d2, 0x00980810, 0x03a64fd5, 0x01ed9373, 0x000a43be, 0x03c18756, 0x001553da}}, Y: Field{[10]uint32{0x0172b26a, 0x0129af28, 0x0183d206, 0x00e8783f, 0x03de8086, 0x0230fd43, 0x03834e0e, 0x004a8d45, 0x03b7dfd5, 0x002d1530}}}, + {X: Field{[10]uint32{0x01592ad4, 0x00a096e1, 0x02ba420b, 0x01f2d4e7, 0x02955af8, 0x018b708b, 0x0160b2e1, 0x021e69aa, 0x0350a6c0, 0x00256a06}}, Y: Field{[10]uint32{0x0045c712, 0x006ac303, 0x011af265, 0x021bd9c0, 0x037c7d50, 0x00e2a930, 0x0072b75f, 0x008b47d6, 0x00c4dfed, 0x002f957a}}}, + {X: Field{[10]uint32{0x037e5c4d, 0x02e2f9d1, 0x01d853ef, 0x029ba8a4, 0x0244a4f8, 0x00c7d560, 0x00d14d34, 0x01a9b8d6, 0x01539e49, 0x00241edb}}, Y: Field{[10]uint32{0x03150eac, 0x021cb91d, 0x0265c21f, 0x0000a489, 0x01ff33e2, 0x0375f475, 0x0017fad1, 0x02ee799e, 0x02943853, 0x002cf4f5}}}, + {X: Field{[10]uint32{0x03f17aa6, 0x03330271, 0x003575bc, 0x0191adea, 0x01c8884c, 0x00fc5d81, 0x0337cb23, 0x015dbd9d, 0x001bb342, 0x002149f2}}, Y: Field{[10]uint32{0x037604fc, 0x013a3d61, 0x02a64504, 0x0274cce1, 0x019cd47b, 0x0115ddfc, 0x031930c1, 0x0149255e, 0x01bcdb8d, 0x002db59d}}}, + {X: Field{[10]uint32{0x03ab00ec, 0x025d38bb, 0x01e9f913, 0x00ea066e, 0x03bc6bf8, 0x03e41ba6, 0x02134360, 0x0036493a, 0x027d5a32, 0x0023878e}}, Y: Field{[10]uint32{0x0018b0b9, 0x002783fd, 0x01c4aff3, 0x01f1e4a0, 0x000792e0, 0x029e4b14, 0x023dad4e, 0x017c970c, 0x03abd81d, 0x003653c0}}}, + {X: Field{[10]uint32{0x019a8d76, 0x03eadd54, 0x0034d72c, 0x0125731d, 0x02dd0d89, 0x031a32da, 0x02cbd86b, 0x012a3426, 0x0393be1f, 0x003f00b2}}, Y: Field{[10]uint32{0x024d4f94, 0x00f1dc9f, 0x004e98b7, 0x027659fa, 0x02ffe4cd, 0x0216895b, 0x026ceb08, 0x01171662, 0x0132729e, 0x001c7de9}}}, + {X: Field{[10]uint32{0x03e6e7b8, 0x00a26c42, 0x016af80a, 0x01fe6cbb, 0x03ff7635, 0x03c21d46, 0x02c44db4, 0x022ceec6, 0x0302a285, 0x0033e604}}, Y: Field{[10]uint32{0x0173b528, 0x006fa223, 0x007bad3a, 0x00a2e221, 0x02f1a8a8, 0x0213c7e8, 0x0205ded9, 0x0199b9c0, 0x0012bf23, 0x0008dfa7}}}, + {X: Field{[10]uint32{0x00231d82, 0x03712faa, 0x01228e97, 0x00782e81, 0x0371718d, 0x03235433, 0x0274cbba, 0x03a480f2, 0x01dc1408, 0x000f9b91}}, Y: Field{[10]uint32{0x031ef848, 0x01d19dce, 0x028a3147, 0x0387c3f7, 0x03961009, 0x01fbe1b7, 0x01f287ca, 0x02a017d8, 0x037a2ad3, 0x000b8ff6}}}, + {X: Field{[10]uint32{0x007d4657, 0x02e7b69c, 0x028b3749, 0x02cb7c99, 0x023ce1b2, 0x00466c3b, 0x00090888, 0x0051c442, 0x03950758, 0x002ec11d}}, Y: Field{[10]uint32{0x01c67587, 0x00e45a1d, 0x01bc1bc4, 0x016ff38a, 0x028d6ee5, 0x036fbbb4, 0x01ad6977, 0x03ce9abd, 0x02fc5f95, 0x002569cb}}}, + {X: Field{[10]uint32{0x00dd6748, 0x01746e5a, 0x0193903f, 0x01b604a4, 0x0100fe35, 0x0338132d, 0x03a31034, 0x00b0412a, 0x0142b8b0, 0x00138057}}, Y: Field{[10]uint32{0x00a870fb, 0x010b001c, 0x00d2dd39, 0x03ea046f, 0x02746419, 0x02499d08, 0x00e96ffc, 0x01b5c765, 0x00e7dfbf, 0x0034d6c8}}}, + {X: Field{[10]uint32{0x00a49daf, 0x00dd1649, 0x0386792a, 0x03c90437, 0x0270850a, 0x01a341e3, 0x037391bd, 0x02c8427a, 0x005790c8, 0x00182693}}, Y: Field{[10]uint32{0x03ad0e98, 0x01540bc2, 0x00e8a0e3, 0x000347cd, 0x0314431d, 0x02290e42, 0x01cb14e7, 0x016ce960, 0x027ebc96, 0x003ce98c}}}, + {X: Field{[10]uint32{0x027fc730, 0x02eac0e8, 0x00aa1780, 0x0184c16d, 0x01b9ea07, 0x005fb3d8, 0x01b7558a, 0x016b0138, 0x03362a95, 0x00332f81}}, Y: Field{[10]uint32{0x0092cd3b, 0x0311fe47, 0x03abb71f, 0x00492c0f, 0x00d981a0, 0x00190ca6, 0x02a4e3ae, 0x02875d97, 0x00166c98, 0x003e5adf}}}, + {X: Field{[10]uint32{0x03ccab14, 0x01471a70, 0x008c3e21, 0x01a6a10e, 0x009143c5, 0x01384738, 0x0310ef90, 0x008c0b9a, 0x028285df, 0x001bb580}}, Y: Field{[10]uint32{0x02d196e7, 0x0247a946, 0x026081d5, 0x00709614, 0x03e91b0d, 0x0199798b, 0x03c75649, 0x00ede3a3, 0x03b0687a, 0x0019d7a8}}}, + {X: Field{[10]uint32{0x0349d8e0, 0x01ffda72, 0x02c7f4c0, 0x01dd10f6, 0x02708061, 0x0214554c, 0x033c5923, 0x02853156, 0x01cba0cc, 0x002f7fc1}}, Y: Field{[10]uint32{0x020c9a50, 0x0041b69b, 0x017981dd, 0x024eaab2, 0x03f09d79, 0x020ce443, 0x00a72390, 0x023b309d, 0x010486cd, 0x0014526b}}}, + {X: Field{[10]uint32{0x022bff2b, 0x01e64453, 0x0386eed5, 0x01570b1c, 0x00af9f6e, 0x01e6bb47, 0x03e53665, 0x00c96c8a, 0x028ccc70, 0x00019339}}, Y: Field{[10]uint32{0x01cb1cae, 0x01abb791, 0x0106bd59, 0x0387aad9, 0x0211bf1b, 0x0084f2ee, 0x021dddf2, 0x02683bbd, 0x01763c8a, 0x003e3226}}}, + {X: Field{[10]uint32{0x00ab2bb4, 0x0051c686, 0x007edaf0, 0x03d58984, 0x02b40de7, 0x007968bd, 0x02f3c06e, 0x0143cf72, 0x006f4891, 0x003350b9}}, Y: Field{[10]uint32{0x01bcfada, 0x03f68280, 0x025c281d, 0x0227d9e7, 0x0017f11f, 0x0094e9e2, 0x00921f4e, 0x01a59ed3, 0x00ddd202, 0x00367094}}}, + {X: Field{[10]uint32{0x01619735, 0x0157c062, 0x02c4359d, 0x0070d713, 0x025e9b12, 0x03b136ba, 0x01a7e8e3, 0x0150838b, 0x0007e714, 0x003df0a4}}, Y: Field{[10]uint32{0x03a493b7, 0x02928cfa, 0x023ddc2b, 0x00e8db3e, 0x005ea293, 0x0281b76c, 0x03735a56, 0x02a4f98d, 0x00064dbd, 0x00199145}}}, + {X: Field{[10]uint32{0x0293b7a8, 0x007d9e57, 0x010f2c5c, 0x034b6445, 0x00377609, 0x01c560d7, 0x033d2214, 0x0121589a, 0x01e1d494, 0x0018ce70}}, Y: Field{[10]uint32{0x02d59b28, 0x00cbf1cf, 0x02d95be5, 0x018261d8, 0x01d10a69, 0x03eb2e30, 0x015a20d8, 0x03a3dffd, 0x01ea47b4, 0x003bef9b}}}, + {X: Field{[10]uint32{0x0089b37b, 0x0160050d, 0x00b4daaf, 0x01e367d0, 0x0207b1ec, 0x027d3ae1, 0x00bbcf1e, 0x03b4197d, 0x03137d22, 0x003f33c7}}, Y: Field{[10]uint32{0x01bf3e10, 0x012d541f, 0x0111c64a, 0x02bc86cd, 0x016646be, 0x025d5ad3, 0x01559d9d, 0x02b30e20, 0x002fef9f, 0x002969df}}}, + {X: Field{[10]uint32{0x004f62d2, 0x03058010, 0x03d4e935, 0x035d63b0, 0x00a13434, 0x01ef23d7, 0x023b5541, 0x0213b3c4, 0x031006f2, 0x0036a5ff}}, Y: Field{[10]uint32{0x0312e168, 0x00c0732b, 0x0093cf8b, 0x008a2069, 0x024f3082, 0x0362ae4a, 0x031e3d1c, 0x00cc37cb, 0x028b4900, 0x00197085}}}, + {X: Field{[10]uint32{0x033e4fd8, 0x00b6260c, 0x039bddce, 0x03c887c2, 0x03343ab6, 0x006d1164, 0x0157556c, 0x009338da, 0x00d5428a, 0x00199da9}}, Y: Field{[10]uint32{0x01af7b41, 0x02c717cf, 0x01593854, 0x01611686, 0x03b7afcf, 0x0119f5e4, 0x034d3d83, 0x0094d7d7, 0x00a4b933, 0x00116f77}}}, + {X: Field{[10]uint32{0x017859ca, 0x004ab7b9, 0x01ccd302, 0x01e8a986, 0x0153396e, 0x00f7ba90, 0x0222c7cd, 0x00508152, 0x02becf46, 0x001e479a}}, Y: Field{[10]uint32{0x02dd37a1, 0x01ec333e, 0x02c9268a, 0x03745f93, 0x03e2ec07, 0x03fd0fb2, 0x0332990a, 0x01724fb1, 0x03fd08c5, 0x003900ce}}}, + {X: Field{[10]uint32{0x030018a1, 0x005fcc6b, 0x005ae207, 0x011d2f5f, 0x02c66dd9, 0x012dcc91, 0x00985aa8, 0x0055429e, 0x03b2d518, 0x000e9f1e}}, Y: Field{[10]uint32{0x029d7459, 0x014b517f, 0x03d1437b, 0x0094612b, 0x02b6c38d, 0x039417e2, 0x01f732a9, 0x03b71488, 0x0317e03c, 0x0008e23a}}}, + {X: Field{[10]uint32{0x013ab999, 0x0082f150, 0x00c3bef7, 0x005cad15, 0x0362b740, 0x0004e075, 0x03ca9361, 0x00725a72, 0x01b18680, 0x0009268b}}, Y: Field{[10]uint32{0x01d5e7a3, 0x0225ed74, 0x030cff71, 0x002cfb24, 0x002f708e, 0x01701d7a, 0x003cf9c8, 0x0247075e, 0x004176aa, 0x00368617}}}, + {X: Field{[10]uint32{0x034f8590, 0x029a215a, 0x0313614d, 0x01fede4a, 0x0032c085, 0x01595794, 0x01f21e0c, 0x03302661, 0x0153b4e0, 0x002c9783}}, Y: Field{[10]uint32{0x0183eda2, 0x021399d7, 0x01055d6b, 0x02010ac8, 0x0300ac5b, 0x034a360d, 0x00fac42f, 0x038eb387, 0x02ff6b02, 0x0006f45e}}}, + {X: Field{[10]uint32{0x03862fcd, 0x0167aaed, 0x02cd6013, 0x03dd45ff, 0x02bd1073, 0x0044090f, 0x029db66f, 0x00ce22a1, 0x036805e8, 0x001cd814}}, Y: Field{[10]uint32{0x015f9d56, 0x00494d9b, 0x02913d69, 0x039569d7, 0x03e767fa, 0x0384b507, 0x02434076, 0x0316983e, 0x002d0842, 0x003a71e8}}}, + {X: Field{[10]uint32{0x03f1b1d9, 0x0172585d, 0x03ff9711, 0x036979c3, 0x022e5b52, 0x03c96750, 0x038a0c9a, 0x00ba5c0b, 0x03567139, 0x003b0bc2}}, Y: Field{[10]uint32{0x008183a8, 0x025263a4, 0x00818204, 0x00ad3f7b, 0x02d49e07, 0x02395b4c, 0x00571fa9, 0x01396432, 0x02bbadb2, 0x0011fdf7}}}, + {X: Field{[10]uint32{0x03e2d378, 0x02981612, 0x038e5cbf, 0x025484dd, 0x01afc255, 0x00838630, 0x022ad2f3, 0x0350ea46, 0x03a8250d, 0x001f5ea3}}, Y: Field{[10]uint32{0x00fea3be, 0x00384458, 0x0352e02a, 0x01e904fd, 0x03fab2b0, 0x026f0835, 0x0300f110, 0x01f5dc09, 0x02168962, 0x001ad22e}}}, + {X: Field{[10]uint32{0x026713d7, 0x01a57fea, 0x0036605c, 0x02433fd3, 0x0206e594, 0x009820b1, 0x03aaa01e, 0x01c8ee99, 0x01ce52b6, 0x000c5a9c}}, Y: Field{[10]uint32{0x02a1cb9e, 0x016bdcf5, 0x020200e9, 0x03f73e0b, 0x0184152f, 0x0172d2e8, 0x0344cf6e, 0x0318484a, 0x01a07820, 0x0035bc70}}}, + {X: Field{[10]uint32{0x03bcca51, 0x01b9caa7, 0x01930ade, 0x015c476e, 0x029ace88, 0x02b65e88, 0x02e5fc6e, 0x0227ff0c, 0x00c30ade, 0x000868aa}}, Y: Field{[10]uint32{0x0082e4d0, 0x01b073e2, 0x001e47c5, 0x00e28ae5, 0x01726fd4, 0x00cbc38d, 0x012aafb4, 0x0145ed5c, 0x010438df, 0x00257f4f}}}, + {X: Field{[10]uint32{0x028f94d5, 0x027b0c9c, 0x01535536, 0x0378107e, 0x021ad2cf, 0x0144ebeb, 0x0146c68f, 0x0205c36b, 0x0067b3ad, 0x000fc606}}, Y: Field{[10]uint32{0x02317527, 0x0277c428, 0x00a915f0, 0x03c0e2c0, 0x0191abb8, 0x0088aac3, 0x01991894, 0x003aab55, 0x00e4e9f2, 0x002946a5}}}, + {X: Field{[10]uint32{0x01f63c1e, 0x0024bc22, 0x02a697d0, 0x01b4c563, 0x0079b7aa, 0x0243b3ed, 0x01ecb9b6, 0x00e6f3c4, 0x013911be, 0x003a59cc}}, Y: Field{[10]uint32{0x0103abc2, 0x02050b52, 0x035461f9, 0x03a184c1, 0x00da9be6, 0x00c808a8, 0x022017c0, 0x020f8e37, 0x00f76f87, 0x00030403}}}, + {X: Field{[10]uint32{0x0008b122, 0x0153eba4, 0x00cd8615, 0x010caf42, 0x02d3096d, 0x03ce61b1, 0x03e94b06, 0x02b1f951, 0x02b01407, 0x00187aa2}}, Y: Field{[10]uint32{0x00a4d182, 0x0172a3fd, 0x02792a10, 0x03d0a0fe, 0x02150167, 0x01a7c73b, 0x0090488e, 0x004ea5d9, 0x03cca6f7, 0x00397156}}}, + {X: Field{[10]uint32{0x02dab9fe, 0x01cfe4ef, 0x02402cab, 0x03dc928e, 0x0149673d, 0x008e68fc, 0x00815540, 0x01ff767d, 0x027a1745, 0x002b63eb}}, Y: Field{[10]uint32{0x00f03e6b, 0x01fbfbd4, 0x035d4d77, 0x0080bb4d, 0x01485172, 0x00958fde, 0x001d0371, 0x0312eeec, 0x03ef7966, 0x0014edf7}}}, + {X: Field{[10]uint32{0x02a829d3, 0x02062f6d, 0x0020c586, 0x01324640, 0x02cdf997, 0x0136750d, 0x0362f274, 0x00b9534f, 0x02dfbf7f, 0x00218173}}, Y: Field{[10]uint32{0x01946b88, 0x01bd52df, 0x01873d78, 0x03c143a1, 0x02e7a33d, 0x01dc23fd, 0x009fe4da, 0x02a86988, 0x015f0ca2, 0x0016be29}}}, + {X: Field{[10]uint32{0x03921d87, 0x034b5b3f, 0x014c8cbc, 0x00f0bc8b, 0x016e8325, 0x029e533e, 0x00ffa5a7, 0x027bd1f7, 0x004b465b, 0x002f7795}}, Y: Field{[10]uint32{0x00aadcd8, 0x02f5b3a3, 0x01a7414e, 0x0237e228, 0x030ec97c, 0x0206f9aa, 0x01e7d230, 0x019fd57b, 0x03677ba8, 0x001b14d8}}}, + {X: Field{[10]uint32{0x02fe1cdb, 0x039cd18c, 0x016bbfe3, 0x034aeb64, 0x0162a47b, 0x0170a3d2, 0x02eafca8, 0x0223724f, 0x0245e8b0, 0x000c620a}}, Y: Field{[10]uint32{0x01f176bc, 0x0075a4d5, 0x021a6fd1, 0x02a780aa, 0x01d03557, 0x00b80a32, 0x02b833c1, 0x01b8784a, 0x00f0c5f8, 0x0002cd62}}}, + {X: Field{[10]uint32{0x01dc1202, 0x0013dda9, 0x00883b0d, 0x02f589e6, 0x03e49fad, 0x000ee398, 0x0110b726, 0x003e7b6d, 0x00524580, 0x0005ef90}}, Y: Field{[10]uint32{0x0132fc54, 0x00ce92e3, 0x01cb9c9e, 0x01568bd6, 0x0181667e, 0x010349df, 0x00f7738e, 0x0156b80a, 0x03dcdf88, 0x0005413a}}}, + {X: Field{[10]uint32{0x03629537, 0x01abeb72, 0x0308c9c5, 0x03d69806, 0x00a303ea, 0x001fcaca, 0x03c4e697, 0x01f4a9af, 0x0133bb69, 0x00318cef}}, Y: Field{[10]uint32{0x0218cef8, 0x03566dee, 0x01eac2b4, 0x01e0cc4e, 0x039f3b7f, 0x0187193c, 0x0006b924, 0x01936fcb, 0x00132d47, 0x0021b8fd}}}, + {X: Field{[10]uint32{0x0260bb52, 0x01863d60, 0x00062570, 0x02d8ed18, 0x03633434, 0x00cf3444, 0x00881f3a, 0x0043dc64, 0x008af4c7, 0x003ce788}}, Y: Field{[10]uint32{0x01e2e62c, 0x014be4ae, 0x014e2bfe, 0x038ee973, 0x03d0171e, 0x03650f0c, 0x02e2b664, 0x00dbd89c, 0x0005807b, 0x0024315a}}}, + {X: Field{[10]uint32{0x00a16c54, 0x01808cbd, 0x033db893, 0x0053d67d, 0x01ee4e54, 0x00b6e2b1, 0x00ddfb37, 0x02581e95, 0x039414f2, 0x0033a610}}, Y: Field{[10]uint32{0x0224e0d7, 0x033eebae, 0x03d7f627, 0x00b6e97a, 0x02bb8054, 0x03502ba5, 0x02f78354, 0x01ec4f1c, 0x01a1d105, 0x00069201}}}, + {X: Field{[10]uint32{0x030a76bb, 0x01fd8cee, 0x0273f625, 0x008a8569, 0x01945041, 0x022175d5, 0x0171af10, 0x01e93ee9, 0x039f8110, 0x001499b9}}, Y: Field{[10]uint32{0x0159b457, 0x003f25a9, 0x01918d3b, 0x0003edce, 0x0018d382, 0x01ed5708, 0x033ca397, 0x017c4a1d, 0x01d09cc8, 0x00179eb4}}}, + {X: Field{[10]uint32{0x027056e4, 0x030563ef, 0x035c11ff, 0x0025449b, 0x03675070, 0x01de2f22, 0x0370113c, 0x01ea8efc, 0x025763f4, 0x0013ee77}}, Y: Field{[10]uint32{0x0086f7ef, 0x021d54c5, 0x0175e52e, 0x01d61e27, 0x0229fe02, 0x00bf8f6c, 0x022fa347, 0x01c65c2a, 0x02368eec, 0x000b365d}}}, + {X: Field{[10]uint32{0x03cc0226, 0x015d01c8, 0x0345bded, 0x02a348cd, 0x024ae7bb, 0x005632e4, 0x03ec8406, 0x0376f6aa, 0x0024a99e, 0x002b45a0}}, Y: Field{[10]uint32{0x014095de, 0x03dc103c, 0x003cba21, 0x01ae47b8, 0x029ee638, 0x014f12f9, 0x01e230bb, 0x0119ce3b, 0x0015968e, 0x002ac414}}}, + {X: Field{[10]uint32{0x03719cb8, 0x0320005c, 0x028d55a7, 0x02e8522e, 0x01277923, 0x03c6cc1f, 0x03aea9b0, 0x01556dcc, 0x01aef7cc, 0x0001560a}}, Y: Field{[10]uint32{0x03267689, 0x03c269d8, 0x03d3d3c4, 0x03db12eb, 0x00382969, 0x031829ef, 0x003b47d6, 0x02561550, 0x02eb9c9b, 0x001a9ecb}}}, + {X: Field{[10]uint32{0x0378b935, 0x03af0e1a, 0x01910960, 0x010d1435, 0x014e1e4c, 0x013a7780, 0x004bbe78, 0x01383888, 0x02338efa, 0x0008467c}}, Y: Field{[10]uint32{0x00e7bb93, 0x00da44ee, 0x0195711c, 0x01a4d29c, 0x0052acb4, 0x027144ea, 0x0337db96, 0x011319e8, 0x01c37785, 0x0027c867}}}, + {X: Field{[10]uint32{0x01295bbf, 0x003f96ec, 0x01b3257f, 0x0260fd70, 0x02c52274, 0x0095634d, 0x01e53caa, 0x006fa75f, 0x021b0949, 0x00047f0f}}, Y: Field{[10]uint32{0x004cf6f5, 0x02314a21, 0x00ed6219, 0x02234427, 0x0191b8d1, 0x00c4416b, 0x026b6c02, 0x0164cdaa, 0x034decb0, 0x00071a71}}}, + {X: Field{[10]uint32{0x03d2a908, 0x02fa8ef7, 0x0182180a, 0x00626421, 0x015e64ac, 0x01f981ab, 0x0091bc86, 0x01450e54, 0x026fea6e, 0x000d2db3}}, Y: Field{[10]uint32{0x03ccad6d, 0x00e5908a, 0x00694403, 0x00953860, 0x0328e9f3, 0x00b1e8c4, 0x01e41a13, 0x02fbcfee, 0x0104f4bd, 0x0016dbb6}}}, + {X: Field{[10]uint32{0x0210a84c, 0x0103254d, 0x02e2e22a, 0x00f4b6da, 0x00b326fb, 0x01fbdd17, 0x01c567d9, 0x01a2acec, 0x01cab457, 0x001b0897}}, Y: Field{[10]uint32{0x002a1084, 0x03f5da10, 0x0229cd72, 0x010b403a, 0x03912fe0, 0x03610ef6, 0x0363cfa2, 0x03f633af, 0x03522180, 0x001fa175}}}, + {X: Field{[10]uint32{0x028ed7d7, 0x001c5116, 0x003e32a7, 0x008039c1, 0x03cbfd20, 0x0052da22, 0x03cc7570, 0x025708cb, 0x02e541dd, 0x00017ddd}}, Y: Field{[10]uint32{0x03273c0e, 0x002cda62, 0x022ff2a2, 0x00fdb435, 0x01c11680, 0x0299354a, 0x009de0b9, 0x020d50e8, 0x0078fc6d, 0x000ee317}}}, + {X: Field{[10]uint32{0x011b0e23, 0x02f64ca2, 0x014e9b8b, 0x01205bf6, 0x01d5371e, 0x00913ea9, 0x037eaa63, 0x010fbd78, 0x00c55315, 0x000f89b6}}, Y: Field{[10]uint32{0x0379bb65, 0x03eaaf82, 0x034b0c70, 0x003db62b, 0x02a5b4c7, 0x01b0fafe, 0x01a53bc0, 0x0280dbb8, 0x011b43a4, 0x000c2827}}}, + {X: Field{[10]uint32{0x018b36af, 0x0036affc, 0x0085e8aa, 0x03efb84b, 0x0106be8a, 0x01954f91, 0x02970ac2, 0x00d5a2aa, 0x0291c17a, 0x00318d36}}, Y: Field{[10]uint32{0x01a925f0, 0x0088067c, 0x0346d6d5, 0x0267181b, 0x0016eb9f, 0x02361fb5, 0x01d34bd9, 0x0029ef41, 0x01bae139, 0x001925a0}}}, + {X: Field{[10]uint32{0x027e9a7e, 0x0258b7cb, 0x0347e806, 0x02ceb235, 0x024e8361, 0x03090b5f, 0x02ab4eef, 0x00d6631b, 0x01d64d64, 0x0003b4cd}}, Y: Field{[10]uint32{0x00aa93e7, 0x01ad803f, 0x015e1eb5, 0x039fd5e3, 0x025a1552, 0x023ca2fb, 0x034b6909, 0x01ea9c8c, 0x03f819c9, 0x003c39f0}}}, + {X: Field{[10]uint32{0x02521581, 0x03656147, 0x0328ed72, 0x0191d54f, 0x02d10be1, 0x021c3fec, 0x023dbf22, 0x0167b0fd, 0x00094113, 0x0034dfe3}}, Y: Field{[10]uint32{0x011f1922, 0x0391ed27, 0x0351a191, 0x03532f8e, 0x02831467, 0x01b4f26f, 0x01f1be75, 0x0380d9cb, 0x03b9ba3a, 0x00369f2f}}}, + {X: Field{[10]uint32{0x0115c360, 0x00cd4b9d, 0x0391943c, 0x0017ba1b, 0x0005b32d, 0x031ad083, 0x02ae0611, 0x017a970e, 0x01d7c747, 0x003b8c48}}, Y: Field{[10]uint32{0x004c1686, 0x03c916ef, 0x00281b76, 0x012ae9a4, 0x01b80916, 0x02b5ec4b, 0x0047411d, 0x028eca6d, 0x023797be, 0x001c0ecb}}}, + {X: Field{[10]uint32{0x0187a12b, 0x02005f46, 0x032b5fe9, 0x024109d5, 0x023f5c72, 0x024a984c, 0x02f1a594, 0x00453a83, 0x01bc5c2b, 0x001ed0b2}}, Y: Field{[10]uint32{0x020d27da, 0x03736549, 0x019c9dc7, 0x0378c377, 0x01dd57ed, 0x024909c9, 0x03cd92a9, 0x01cf5d5b, 0x0382e85b, 0x00173dd8}}}, + {X: Field{[10]uint32{0x00a555cd, 0x01d248be, 0x033c3ad0, 0x02117da4, 0x007c8f9b, 0x003e4975, 0x039b6b9a, 0x014e8a4f, 0x039ab13a, 0x0026bd7f}}, Y: Field{[10]uint32{0x025d4153, 0x01bc7eaf, 0x0042ca33, 0x0065905c, 0x0113a9ec, 0x02423215, 0x02a13fa5, 0x011cd322, 0x009e8995, 0x0032a4fb}}}, + {X: Field{[10]uint32{0x0048dacc, 0x02061dce, 0x017b659c, 0x014215af, 0x00a5b2b8, 0x01c260f7, 0x021d591f, 0x037c6c1b, 0x027401a2, 0x0017afe8}}, Y: Field{[10]uint32{0x00f7ad18, 0x01a7f1e8, 0x020fb5fb, 0x0047d1cb, 0x0046e124, 0x008a647a, 0x004c15e8, 0x00f190a4, 0x00b96ac2, 0x0002c2b7}}}, + {X: Field{[10]uint32{0x00c81e6f, 0x00979b3f, 0x01dd3ac1, 0x0219f699, 0x000daeb4, 0x007dbafb, 0x018382bc, 0x017ab214, 0x0108465e, 0x0024ed63}}, Y: Field{[10]uint32{0x0224a4e7, 0x02cfbd46, 0x01b8cf4f, 0x03618ec7, 0x038a50b8, 0x02f2a722, 0x00646c36, 0x005e135d, 0x0118c315, 0x00152fa2}}}, + {X: Field{[10]uint32{0x036fc858, 0x00c7c772, 0x0211132c, 0x02643b6a, 0x005bc868, 0x00ad0199, 0x00943ee3, 0x0191d3ff, 0x039b4fb4, 0x0028a295}}, Y: Field{[10]uint32{0x02f14670, 0x026c54e6, 0x0239646c, 0x0053ebbd, 0x036e059b, 0x03d942ad, 0x016605f0, 0x01592006, 0x01a3d562, 0x00103ba4}}}, + {X: Field{[10]uint32{0x0206ac9a, 0x0397cab5, 0x01078e8d, 0x011fe432, 0x01add7cb, 0x0143482b, 0x01f60297, 0x015582dc, 0x0109781d, 0x0003a61e}}, Y: Field{[10]uint32{0x029819d2, 0x01d3c63b, 0x00907102, 0x037ab233, 0x01c55318, 0x031786a0, 0x02a346f5, 0x036b3fff, 0x02c34c80, 0x0001c486}}}, + {X: Field{[10]uint32{0x01e1dcef, 0x02cefd18, 0x00a7d1d2, 0x02a5d7a1, 0x025c84bc, 0x00e5515b, 0x00ee62ae, 0x02035ff0, 0x011d1587, 0x000a47fc}}, Y: Field{[10]uint32{0x03ec2616, 0x000d9a94, 0x02ceec23, 0x00de4cd6, 0x0171e79e, 0x00892a51, 0x00298ce8, 0x02152d9c, 0x03e8abb6, 0x00317232}}}, + {X: Field{[10]uint32{0x01e315b4, 0x02600fbf, 0x03d824bd, 0x005ae37f, 0x01efda7d, 0x01cea84c, 0x03d9e573, 0x02d4f90a, 0x03909e28, 0x0012b6c4}}, Y: Field{[10]uint32{0x00b1456a, 0x03b37d75, 0x023eefa2, 0x00093f79, 0x0124eb70, 0x0303266c, 0x00a796e5, 0x02b9f25c, 0x0312b827, 0x0019b5fa}}}, + {X: Field{[10]uint32{0x027591ff, 0x029c0936, 0x033846b3, 0x0237902f, 0x0201707a, 0x00951807, 0x007e47b2, 0x003bf78f, 0x034b9524, 0x00157897}}, Y: Field{[10]uint32{0x00c830c2, 0x038ad6de, 0x022664b1, 0x038c8ba0, 0x03e4491a, 0x00b72e82, 0x03000b37, 0x0181b5d0, 0x017b7e98, 0x003a7c89}}}, + {X: Field{[10]uint32{0x02747eca, 0x00016c7e, 0x03ad8aa3, 0x00063084, 0x01388ddd, 0x0118e0d3, 0x03a6d8d5, 0x03f0caf9, 0x0093e41d, 0x0034939d}}, Y: Field{[10]uint32{0x00c26cac, 0x02de18d2, 0x01e93fc4, 0x028260ae, 0x026d7feb, 0x0053527c, 0x01f5bee4, 0x012c597a, 0x0216a51b, 0x0039cea0}}}, + {X: Field{[10]uint32{0x01fd8b2a, 0x03ba84d8, 0x027d9ed8, 0x01880648, 0x03caa035, 0x03b586bd, 0x03e46003, 0x0176872d, 0x02526d01, 0x0029442c}}, Y: Field{[10]uint32{0x02bea726, 0x0174bce2, 0x01adc356, 0x03ca8004, 0x01eaa2b2, 0x0031b11e, 0x02b15a28, 0x02aee98f, 0x02a09015, 0x000f6630}}}, + {X: Field{[10]uint32{0x03b314d1, 0x030ad221, 0x01f4f6b8, 0x039bf9a0, 0x008404cd, 0x029575db, 0x03ac63cc, 0x00035456, 0x00d81275, 0x00301341}}, Y: Field{[10]uint32{0x034d9d59, 0x01019eb6, 0x02e1b98c, 0x01637dff, 0x00e3cd44, 0x006f0205, 0x00db9373, 0x003aea67, 0x01779fb8, 0x0032cff3}}}, + {X: Field{[10]uint32{0x02bd0649, 0x01c3e43b, 0x0245a0df, 0x03fe9e24, 0x006b5dd2, 0x023fe9dc, 0x0051e691, 0x00cd5eea, 0x0061146c, 0x003b271f}}, Y: Field{[10]uint32{0x01186170, 0x03438f4f, 0x027a4daf, 0x0026c498, 0x03b36b07, 0x02458648, 0x028803ce, 0x01a48f01, 0x03fa10ca, 0x00268274}}}, + {X: Field{[10]uint32{0x020488cc, 0x033b5602, 0x030640ba, 0x0044b294, 0x03b25985, 0x02017952, 0x037e8403, 0x013117d2, 0x013f5d50, 0x002577d7}}, Y: Field{[10]uint32{0x00e8ecc6, 0x01ab5213, 0x00c21c7a, 0x036dd0f7, 0x0235079c, 0x00facc16, 0x03d1ef32, 0x014c16c1, 0x018589b8, 0x00290f73}}}, + {X: Field{[10]uint32{0x033a6d16, 0x00b511d8, 0x016510c7, 0x0135aec6, 0x012fc8ec, 0x0177fe52, 0x02bf50eb, 0x00314b11, 0x020c3a95, 0x002e3bb3}}, Y: Field{[10]uint32{0x01583744, 0x02c23875, 0x0384b8d0, 0x00b338fe, 0x024a4957, 0x025a68b0, 0x02c1460d, 0x02fe0ee9, 0x02a31b75, 0x001d3a50}}}, + {X: Field{[10]uint32{0x02dd09a2, 0x002fc71c, 0x000ba052, 0x01df178b, 0x00c82b2d, 0x014487a8, 0x01eac517, 0x0270894f, 0x0216d1f6, 0x001667b3}}, Y: Field{[10]uint32{0x0111bb14, 0x00f48c6a, 0x038599f7, 0x01c99908, 0x00b2fdb6, 0x035eebd2, 0x00e2e725, 0x00f43b76, 0x00c325af, 0x00012284}}}, + {X: Field{[10]uint32{0x0282ab32, 0x017f37c3, 0x023bc35a, 0x006eee93, 0x007fff71, 0x0186b360, 0x02fdfaa9, 0x0162a5b8, 0x02068d94, 0x002e2e96}}, Y: Field{[10]uint32{0x00f8ca4d, 0x0133b314, 0x007e32d4, 0x005db8ab, 0x03c2d824, 0x0134ca94, 0x00388454, 0x0160b824, 0x03227554, 0x00200d6a}}}, + {X: Field{[10]uint32{0x027e65f4, 0x017b45c8, 0x00c508c3, 0x020285c4, 0x03ae8063, 0x006c7ffc, 0x02d3d7af, 0x01e19795, 0x03e1cccd, 0x002da11a}}, Y: Field{[10]uint32{0x00bc7201, 0x039bed83, 0x0224177f, 0x03527039, 0x03361ee9, 0x0208c1d8, 0x0189f526, 0x017c2b7a, 0x00253294, 0x002ef6dc}}}, + {X: Field{[10]uint32{0x01a9d0fe, 0x0203fe03, 0x032ffc35, 0x02ce8464, 0x0120dd31, 0x0211b668, 0x0009e53f, 0x00aefbb4, 0x025e6987, 0x00287fe9}}, Y: Field{[10]uint32{0x02da215b, 0x00116c73, 0x02adadc0, 0x032c9a11, 0x0331c210, 0x022dae9b, 0x00549996, 0x00efe774, 0x0180d576, 0x002a8cb9}}}, + {X: Field{[10]uint32{0x030d0fa2, 0x03e6885c, 0x02ebeb62, 0x035b7997, 0x022ad73c, 0x0033bc22, 0x008c7078, 0x0071f7d1, 0x036d6709, 0x0026ce05}}, Y: Field{[10]uint32{0x02609207, 0x01813b53, 0x019d26fb, 0x02206412, 0x0264a459, 0x023fd665, 0x02c86bab, 0x026dfbc7, 0x0319c0fb, 0x0008b49a}}}, + {X: Field{[10]uint32{0x01fd0cd2, 0x014a104d, 0x008981fa, 0x0135f7ab, 0x020accfa, 0x036ad0fe, 0x0132553b, 0x03193eec, 0x009e209d, 0x002f0b33}}, Y: Field{[10]uint32{0x015ccfa6, 0x0160c169, 0x0134374d, 0x004dc624, 0x01350d1d, 0x021e47ef, 0x034931ba, 0x03e22c19, 0x02dc176f, 0x0011cd9a}}}, + {X: Field{[10]uint32{0x00730f6a, 0x01f735c9, 0x03aa607a, 0x00d39fe4, 0x00d45187, 0x03ef4a8c, 0x0036f514, 0x00a98974, 0x00a16545, 0x00073800}}, Y: Field{[10]uint32{0x01c6811d, 0x0018abcd, 0x02c19ee3, 0x0336dac3, 0x03fa288a, 0x038f56fc, 0x0334baf3, 0x03c3b552, 0x03fb5b90, 0x00382440}}}, + {X: Field{[10]uint32{0x01e0031f, 0x033742b7, 0x0109d63d, 0x01a13682, 0x034cc63d, 0x02718911, 0x03b26a44, 0x019303a3, 0x029a887d, 0x00211b15}}, Y: Field{[10]uint32{0x0212c07e, 0x010231be, 0x03be47df, 0x0111de61, 0x0207dcbe, 0x013fc105, 0x03acf93d, 0x027e635f, 0x0353132c, 0x0000151d}}}, + {X: Field{[10]uint32{0x00fe59e9, 0x0207a95d, 0x00b82f5c, 0x007d5321, 0x03701f7b, 0x01a1ac62, 0x00585185, 0x01b88f27, 0x00f72865, 0x0018d96a}}, Y: Field{[10]uint32{0x0316c2eb, 0x0273e9fa, 0x0023fc8d, 0x02d5fff3, 0x01be27f2, 0x027302cf, 0x0151d46c, 0x0394f2b4, 0x01fda992, 0x00231f37}}}, + {X: Field{[10]uint32{0x012939fc, 0x019fe01f, 0x0237fbd2, 0x03d66314, 0x0371dc5b, 0x017a3f45, 0x01726195, 0x00f6365e, 0x033c89ae, 0x003b5097}}, Y: Field{[10]uint32{0x01a3590b, 0x03f580a6, 0x01d74daf, 0x0341b8f0, 0x02010c98, 0x0273c53d, 0x03285fd1, 0x0280ef35, 0x03dc14f7, 0x001089aa}}}, + {X: Field{[10]uint32{0x031f00c7, 0x01b728e5, 0x03d5662a, 0x01e8ba40, 0x0285a0bd, 0x02b8c42f, 0x0267f235, 0x01fafa35, 0x006c2e1b, 0x00336949}}, Y: Field{[10]uint32{0x01247f56, 0x020922ca, 0x013f6eae, 0x03cc879b, 0x0296b2c2, 0x006293fa, 0x00534ba3, 0x026cd246, 0x0296f8ea, 0x001e47bc}}}, + {X: Field{[10]uint32{0x00eaf99e, 0x01a968fd, 0x03bc6f90, 0x0260e1be, 0x02f5017d, 0x025a8470, 0x01d3f7e5, 0x030786fb, 0x00e6ce79, 0x002d0aa1}}, Y: Field{[10]uint32{0x0007e6ac, 0x03e903b5, 0x02610823, 0x0005c2c0, 0x03cc3d06, 0x01d427f2, 0x03fad5e4, 0x00dc60db, 0x00c960bb, 0x000b9c8b}}}, + {X: Field{[10]uint32{0x030bcf90, 0x01a807ea, 0x024c16d4, 0x0342ea14, 0x01be23ca, 0x021c021d, 0x03149df5, 0x03a6f2d0, 0x008ce1e2, 0x000d62f8}}, Y: Field{[10]uint32{0x039d1308, 0x00171107, 0x01b0034f, 0x0298d922, 0x03462318, 0x01bd4446, 0x00fe0bfb, 0x02b333d9, 0x02f070ba, 0x003cf13f}}}, + {X: Field{[10]uint32{0x0016a789, 0x02784d58, 0x03ac985c, 0x03de6d0c, 0x01427d16, 0x0115c410, 0x0374bfe1, 0x0188c293, 0x035de5b3, 0x000fb590}}, Y: Field{[10]uint32{0x0041f26f, 0x0249d898, 0x02d9104b, 0x01b56a95, 0x03ee0dc5, 0x014b4f7f, 0x03e677e3, 0x010f4ad6, 0x005e1427, 0x00071cba}}}, + {X: Field{[10]uint32{0x0016c910, 0x00f67989, 0x00610c25, 0x0142e494, 0x000afb7e, 0x01c85dbd, 0x000d7e26, 0x03685965, 0x022c580d, 0x000927df}}, Y: Field{[10]uint32{0x02a9f50c, 0x01c51ece, 0x02e486dc, 0x0021e7a5, 0x021630f5, 0x037378db, 0x030f8423, 0x0245ba3d, 0x031149e9, 0x001bf058}}}, + {X: Field{[10]uint32{0x009cc85f, 0x00379bb2, 0x00d4c69f, 0x01bdbd06, 0x0114d2d7, 0x014b2fe4, 0x00f6f0b7, 0x006e8c6c, 0x0144e838, 0x0025ecec}}, Y: Field{[10]uint32{0x0188724f, 0x00111372, 0x01dc2182, 0x01827904, 0x02f72822, 0x03c77a16, 0x00492570, 0x0082d685, 0x013033b7, 0x0019f26f}}}, + {X: Field{[10]uint32{0x03395a85, 0x03bbc697, 0x01b68cfa, 0x0038e57a, 0x0380610d, 0x00491421, 0x010fcaf4, 0x00a44947, 0x019e868b, 0x000ece11}}, Y: Field{[10]uint32{0x0225ce6f, 0x02392754, 0x023a3c3e, 0x00966c5f, 0x0391ec4c, 0x01dc917a, 0x00cc9a2b, 0x01d1531e, 0x00ddbfde, 0x002f9460}}}, + {X: Field{[10]uint32{0x02163ebf, 0x03f88725, 0x017efc54, 0x03452680, 0x0074fb35, 0x0209c3f4, 0x00974f44, 0x03822a45, 0x03909f33, 0x00139bc5}}, Y: Field{[10]uint32{0x02b9fd15, 0x03341e39, 0x026a3e56, 0x02035dd3, 0x000dcd28, 0x02a69793, 0x02d34913, 0x01c5596d, 0x038f06f4, 0x0003ed95}}}, + {X: Field{[10]uint32{0x015c75de, 0x02ccb68c, 0x01a9218d, 0x02ddd586, 0x0272e301, 0x00289597, 0x025a0a67, 0x024df5d0, 0x0063e408, 0x0024506b}}, Y: Field{[10]uint32{0x006d6045, 0x024713d5, 0x007a05de, 0x037ef5e1, 0x03f10b34, 0x00aa95f6, 0x0055e721, 0x030f84f3, 0x010a56be, 0x0034d78a}}}, + {X: Field{[10]uint32{0x015ba578, 0x00b1844e, 0x01aa2e21, 0x018a23b7, 0x00337c91, 0x013f2480, 0x01c006a0, 0x009d4559, 0x03ca7205, 0x003b26dc}}, Y: Field{[10]uint32{0x00224887, 0x014043cf, 0x039051b1, 0x01d53139, 0x01ba1922, 0x031d38bc, 0x015f3ab4, 0x00b9dce3, 0x02f5c1a2, 0x000df847}}}, + {X: Field{[10]uint32{0x021caca3, 0x016e06b3, 0x00d7ef0f, 0x0022f94c, 0x01aef502, 0x03aab1b9, 0x00430b1f, 0x024a3f38, 0x00e1bb1a, 0x0015bf05}}, Y: Field{[10]uint32{0x00209001, 0x01fcc1e4, 0x01865f6d, 0x01f30e36, 0x03b05e59, 0x0203d14a, 0x03101d7a, 0x00341e7c, 0x0084f868, 0x00139698}}}, + {X: Field{[10]uint32{0x017df731, 0x00ea2699, 0x021e4d80, 0x030fc603, 0x00cf3997, 0x003c6c8b, 0x037c3627, 0x0353320a, 0x001b2ceb, 0x002bb35d}}, Y: Field{[10]uint32{0x010b8e21, 0x0315f9fe, 0x03d4d8cc, 0x005c2bff, 0x02256bd3, 0x037426ce, 0x036356e8, 0x03d27c64, 0x03336c0d, 0x0017c412}}}, + {X: Field{[10]uint32{0x01836cb8, 0x03e2f505, 0x03f0d418, 0x01c8c70f, 0x039b5c10, 0x00c27a7a, 0x0222b9a4, 0x00f54892, 0x03af54f8, 0x00145899}}, Y: Field{[10]uint32{0x03efe4fc, 0x0248261e, 0x0313d865, 0x017628f6, 0x01cc37e8, 0x02dae10e, 0x02f6fd54, 0x00b05fd3, 0x009b9e06, 0x001061ce}}}, + {X: Field{[10]uint32{0x0066fed5, 0x023d50c9, 0x007e7f25, 0x0371b84a, 0x036e7658, 0x00e0ed3f, 0x01a03687, 0x0111cfe4, 0x02bd8d3f, 0x001a2efa}}, Y: Field{[10]uint32{0x017049c4, 0x018d6b42, 0x03c27048, 0x01e9a8e0, 0x008656fc, 0x025e356c, 0x027f7ccd, 0x026d09e9, 0x000f0ac9, 0x0033d8f2}}}, + {X: Field{[10]uint32{0x007b67be, 0x036fad6c, 0x018a2b90, 0x023e4259, 0x0049ba90, 0x02d4b079, 0x01592138, 0x01fa6d47, 0x02ab6946, 0x00083388}}, Y: Field{[10]uint32{0x0297ce2d, 0x008374b7, 0x00c3e68f, 0x03c52a77, 0x0331649f, 0x026e8b05, 0x032d17e4, 0x01cfda48, 0x007d9f41, 0x00158b68}}}, + {X: Field{[10]uint32{0x02798f78, 0x00582b1b, 0x00b07d04, 0x0241ffe0, 0x029c86cd, 0x014855e1, 0x03c1ec6a, 0x027e48eb, 0x02d3a4a5, 0x002d6df5}}, Y: Field{[10]uint32{0x029d4de5, 0x03cf9e7f, 0x02dbcb8e, 0x02e96efd, 0x0045b5ea, 0x034565ed, 0x03c55af4, 0x0097b836, 0x02c97751, 0x0034178c}}}, + {X: Field{[10]uint32{0x03f45df4, 0x0130c28c, 0x03d4acdc, 0x024dac1d, 0x023967e5, 0x01d7db6e, 0x023d848f, 0x0202c577, 0x00897a42, 0x002556f5}}, Y: Field{[10]uint32{0x01453a02, 0x03e5cd0f, 0x016b2749, 0x006d12c5, 0x01644826, 0x03c97700, 0x03b9fe5b, 0x026473bc, 0x03cb5d79, 0x0012efad}}}, + {X: Field{[10]uint32{0x020a5a98, 0x0391fe19, 0x02211201, 0x0126721d, 0x0150fee8, 0x02fd4dcd, 0x0002fe18, 0x00dc3acf, 0x015198e7, 0x0027d83a}}, Y: Field{[10]uint32{0x00d613cc, 0x00b13e93, 0x00a6a3a6, 0x03a98b8a, 0x03c865a7, 0x00c87626, 0x02570f59, 0x01619a80, 0x02a933ed, 0x0018e56a}}}, + {X: Field{[10]uint32{0x00d776ee, 0x03cb5394, 0x01468999, 0x01642895, 0x009c2b64, 0x02269c40, 0x00041c75, 0x00f436f9, 0x00b6f592, 0x001c207c}}, Y: Field{[10]uint32{0x028f9fc9, 0x02a7fdd9, 0x00758403, 0x028ca231, 0x0227f3f0, 0x02fca2d2, 0x02ec9c91, 0x00067a4e, 0x0005e067, 0x00272d80}}}, + {X: Field{[10]uint32{0x0369561f, 0x02adcecc, 0x023fffb0, 0x00161f99, 0x02b607d6, 0x0358fbe6, 0x00e982ab, 0x0169f06c, 0x01800d8d, 0x00038a40}}, Y: Field{[10]uint32{0x00d924f7, 0x022345f5, 0x01f7861b, 0x006850a6, 0x01993f74, 0x002d5394, 0x00ccc7b8, 0x02692894, 0x02fe7728, 0x001189dd}}}, + {X: Field{[10]uint32{0x00598bfb, 0x031590d6, 0x035212f4, 0x037f10b2, 0x00ac254c, 0x017231ad, 0x03d5939c, 0x02f57ad8, 0x0328b285, 0x0022ba9c}}, Y: Field{[10]uint32{0x01568ec2, 0x0064be02, 0x01e228e0, 0x03ba6436, 0x0213819a, 0x03281602, 0x00a559a8, 0x0157ffad, 0x027704fc, 0x002da0b6}}}, + {X: Field{[10]uint32{0x03256e68, 0x005e418b, 0x010feb3a, 0x01e877fa, 0x0127302d, 0x01619702, 0x00fc2874, 0x012d5fa9, 0x00b254b2, 0x003a7442}}, Y: Field{[10]uint32{0x03a128d0, 0x01ee4e6a, 0x032c48f6, 0x026a9169, 0x018d0ba6, 0x02bc50d9, 0x030fc0b1, 0x0367ef9e, 0x02746d29, 0x0003ffdc}}}, + {X: Field{[10]uint32{0x01ba0fee, 0x021ae1ab, 0x009136d8, 0x00505f4a, 0x00b81f29, 0x00a79332, 0x02d49094, 0x01f985e1, 0x013d1f31, 0x0027a87e}}, Y: Field{[10]uint32{0x0180ec0a, 0x031af91a, 0x036e45d9, 0x0002e564, 0x01975a5c, 0x03f7b845, 0x023ba6aa, 0x02cd45b9, 0x0325d3b0, 0x0008c77f}}}, + {X: Field{[10]uint32{0x001e7a0d, 0x006da352, 0x000c5718, 0x00042166, 0x0080701d, 0x00fa354c, 0x00d687c4, 0x02efb81f, 0x0015e5fa, 0x003a2849}}, Y: Field{[10]uint32{0x022f62c6, 0x02886e64, 0x005dd5d6, 0x03c8b80e, 0x030ac53b, 0x021d15c9, 0x0062f185, 0x039d1a65, 0x039ce263, 0x00375a60}}}, + {X: Field{[10]uint32{0x02c3def2, 0x011bfcc1, 0x02cefb44, 0x01009d8d, 0x02ed7968, 0x03db5706, 0x002e04c7, 0x01851687, 0x03baae48, 0x0038a1fc}}, Y: Field{[10]uint32{0x01968c63, 0x02e7efe7, 0x016e0be5, 0x0239f9af, 0x005bcfbe, 0x03c85560, 0x0053baef, 0x02c3a93b, 0x013d401d, 0x0024e550}}}, + {X: Field{[10]uint32{0x02ad1194, 0x02583755, 0x03927641, 0x00c9aadd, 0x01fb23e2, 0x0053239f, 0x01756eba, 0x016ac39e, 0x039cec20, 0x0023e67d}}, Y: Field{[10]uint32{0x0019a2ea, 0x03ffe67a, 0x02de8c5d, 0x013f27c2, 0x0089cbff, 0x0226c92f, 0x021b0da3, 0x01b5b8bd, 0x03e615cc, 0x00201654}}}, + {X: Field{[10]uint32{0x0366f586, 0x00f0d0f1, 0x03e14c6b, 0x0351ebcc, 0x013adb63, 0x01687fdb, 0x00dfb59e, 0x008eb783, 0x036a8cb7, 0x002721ea}}, Y: Field{[10]uint32{0x0165bb19, 0x031ba2aa, 0x002004ed, 0x038dd61d, 0x036a3699, 0x032073fd, 0x01012cbb, 0x035e79f5, 0x01227a3b, 0x001d1e60}}}, + {X: Field{[10]uint32{0x019dc00a, 0x03b1d776, 0x03c3ec75, 0x0141f622, 0x006042bd, 0x02d44bfd, 0x02a10b7f, 0x0177902e, 0x02086f24, 0x00314b21}}, Y: Field{[10]uint32{0x02b3f844, 0x016b80d2, 0x01cc2ca0, 0x01b017ed, 0x0385e540, 0x01f50bf9, 0x00762d83, 0x02e2f672, 0x013abae8, 0x003a30a0}}}, + {X: Field{[10]uint32{0x028dafb2, 0x0138582e, 0x030ded8d, 0x03f419aa, 0x000dd7c3, 0x02f58d2b, 0x039c6b6e, 0x02f89669, 0x02e194d5, 0x0002d8a1}}, Y: Field{[10]uint32{0x019b5910, 0x00e156a2, 0x034aa18b, 0x0090a80c, 0x0027eaaf, 0x01e64549, 0x03cdf7b4, 0x03c9c1dd, 0x02a8ee0b, 0x001cbb0b}}}, + {X: Field{[10]uint32{0x03086b6d, 0x035b4d0b, 0x024ce8c5, 0x02817cee, 0x0245c648, 0x01c32a26, 0x013792e3, 0x00be2dc8, 0x02f2045f, 0x0037ded5}}, Y: Field{[10]uint32{0x0196ab4a, 0x008eb985, 0x02cb43df, 0x0335765f, 0x0139ac18, 0x000e6e5b, 0x009fc90d, 0x02f73d08, 0x01483850, 0x000e1b3b}}}, + {X: Field{[10]uint32{0x0146a3b0, 0x03341a1b, 0x0020f48e, 0x00dd9d79, 0x01459b2b, 0x0192aad6, 0x01110eda, 0x008d5cfa, 0x009f4cd4, 0x000ab3d3}}, Y: Field{[10]uint32{0x022cc579, 0x00a15f56, 0x000cff62, 0x02be5513, 0x0258b37b, 0x009487fe, 0x01ff9bbd, 0x03a60737, 0x0029aea5, 0x0017c696}}}, + {X: Field{[10]uint32{0x00d33f36, 0x02da1367, 0x03877586, 0x02b29082, 0x026a64f2, 0x00d48dcb, 0x010033db, 0x034de1c8, 0x01aaeb55, 0x002febe5}}, Y: Field{[10]uint32{0x00a3d8ee, 0x000f36ac, 0x03b0f608, 0x00b97c50, 0x0378c6ed, 0x02fe7b20, 0x02fce3eb, 0x039db8a8, 0x0313bb61, 0x001f48ae}}}, + {X: Field{[10]uint32{0x00f31421, 0x035f635d, 0x01f6a6ad, 0x02a4528a, 0x01faacb6, 0x01627329, 0x0393c9ef, 0x02a24369, 0x03604eab, 0x001e3374}}, Y: Field{[10]uint32{0x0219a634, 0x028e373a, 0x00bfd327, 0x023bebfd, 0x0376430c, 0x02d788a1, 0x030d60ef, 0x0007445a, 0x001505b8, 0x003b5fa7}}}, + {X: Field{[10]uint32{0x01213d2e, 0x010f08a3, 0x00276d98, 0x0131f2da, 0x01edb894, 0x019aa292, 0x03977135, 0x00e47f1e, 0x03a9050a, 0x003cbaf3}}, Y: Field{[10]uint32{0x00fa4eaa, 0x03d79e2c, 0x01900bb3, 0x00593cf7, 0x0309513d, 0x01a754d3, 0x03a180c5, 0x027c4f14, 0x030d956f, 0x002c71d8}}}, + {X: Field{[10]uint32{0x02af4c2b, 0x0142e746, 0x00adfca8, 0x02aba056, 0x02857593, 0x01154bab, 0x00199433, 0x032ecc33, 0x020d83bf, 0x00010f35}}, Y: Field{[10]uint32{0x007e8f62, 0x02784418, 0x0130247e, 0x00313f33, 0x01099623, 0x00926633, 0x023d6592, 0x0079ae78, 0x02b10f72, 0x003fd92e}}}, + {X: Field{[10]uint32{0x038ea93c, 0x0025c27c, 0x01315f92, 0x03ee97b0, 0x0302168d, 0x009fc4ed, 0x020c3a3b, 0x012775ef, 0x00e0c01a, 0x00106497}}, Y: Field{[10]uint32{0x00f77110, 0x03c362e5, 0x02c26c48, 0x01dbc512, 0x01a725a6, 0x02c0b66a, 0x02f49c19, 0x002b0068, 0x015ecb6a, 0x0014d1ae}}}, + {X: Field{[10]uint32{0x023877e5, 0x03b396cc, 0x03eee3e6, 0x00c9f89b, 0x000fa1c2, 0x0343b836, 0x011bb478, 0x00b60aa1, 0x02106c76, 0x003f48c4}}, Y: Field{[10]uint32{0x016fa162, 0x00bead3e, 0x0266e7eb, 0x018876cf, 0x014bf334, 0x00d3bb70, 0x03748d62, 0x03b3a2eb, 0x0316f5a6, 0x000e5d8c}}}, + {X: Field{[10]uint32{0x00556ef7, 0x01a0f63d, 0x01cb26ea, 0x012c0341, 0x03d5ad68, 0x028f4727, 0x0254a0a0, 0x02f87cda, 0x0298cb7a, 0x003f8fa2}}, Y: Field{[10]uint32{0x031223bf, 0x02503813, 0x0346c3fa, 0x01d6af81, 0x00837b44, 0x02b56992, 0x03f05f9b, 0x00198e87, 0x027734d8, 0x001f4881}}}, + {X: Field{[10]uint32{0x035ec5dd, 0x023adcd3, 0x01ab69ba, 0x02521060, 0x0338232e, 0x01c5c5f6, 0x03f9b1d2, 0x006f7130, 0x0364ae0d, 0x003980a9}}, Y: Field{[10]uint32{0x00916fdb, 0x00f9bd33, 0x03450d51, 0x03d5ed20, 0x028bc9be, 0x02dded20, 0x001f9516, 0x022c400b, 0x00aa2626, 0x002b440e}}}, + {X: Field{[10]uint32{0x0181e086, 0x02f1bfe3, 0x0364eeb0, 0x00b40d91, 0x03321814, 0x01774e46, 0x01cd9620, 0x01cb65c6, 0x01cfadb7, 0x0021c625}}, Y: Field{[10]uint32{0x0337722e, 0x0322658f, 0x029cb555, 0x03293989, 0x00dda2c9, 0x00e184d4, 0x011ef565, 0x01908675, 0x0064f791, 0x00126824}}}, + {X: Field{[10]uint32{0x03a7e4b4, 0x00e83803, 0x0107f4ab, 0x013d3052, 0x028ed4ec, 0x03ef315b, 0x014ec278, 0x01601720, 0x016e7775, 0x00388a75}}, Y: Field{[10]uint32{0x00e48af2, 0x02ae4205, 0x03ce5795, 0x026ab9ba, 0x006d4265, 0x00f3abaa, 0x017a46b6, 0x020156fb, 0x02bd66d6, 0x00336c1f}}}, + {X: Field{[10]uint32{0x00bbf8ed, 0x02a54dda, 0x01dd6ca4, 0x02be9c2b, 0x03471066, 0x034835a3, 0x00a31189, 0x0321a223, 0x03856b0c, 0x000154d7}}, Y: Field{[10]uint32{0x030ac5e8, 0x012096dd, 0x02c296ab, 0x014d3de9, 0x01f6f529, 0x030c81a8, 0x027822fa, 0x00a99e10, 0x0044245e, 0x00219572}}}, + {X: Field{[10]uint32{0x00767ad6, 0x00d7b949, 0x0130c0dd, 0x00843edc, 0x00b8c48d, 0x00f4419b, 0x000d78e0, 0x033a6b89, 0x01054b37, 0x0004195e}}, Y: Field{[10]uint32{0x03e125f5, 0x02077520, 0x02be2e8b, 0x02bf84ce, 0x004393a5, 0x000d57dc, 0x00eb013c, 0x0186400a, 0x037a508a, 0x0014a0da}}}, + {X: Field{[10]uint32{0x00868c1c, 0x02c3fce8, 0x00e4be6c, 0x00321d0a, 0x00e796db, 0x00d11dde, 0x029e311e, 0x03408e67, 0x02072521, 0x000cd9ac}}, Y: Field{[10]uint32{0x0311638c, 0x0168a350, 0x00ae3025, 0x0191d28d, 0x00ac908c, 0x026660e5, 0x032f15d3, 0x0374b29f, 0x02a422a8, 0x003b1808}}}, + {X: Field{[10]uint32{0x035953ca, 0x00c0c582, 0x03332f26, 0x01919905, 0x0291bd01, 0x027f6d07, 0x0208a1f5, 0x0391b1cd, 0x0396339b, 0x00129e24}}, Y: Field{[10]uint32{0x01b4c442, 0x008fbe79, 0x021013a1, 0x011ab86e, 0x016e6e03, 0x03ae1863, 0x01c0af84, 0x02b51602, 0x017f615a, 0x003516d9}}}, + {X: Field{[10]uint32{0x01f1302e, 0x0251f8e2, 0x030fcae9, 0x02d5eae7, 0x00d75d70, 0x037d818a, 0x00c64ad4, 0x0271ff70, 0x0084fa0a, 0x003b93c9}}, Y: Field{[10]uint32{0x01f80170, 0x03afd082, 0x003cbf81, 0x00fd1e95, 0x03409207, 0x036add28, 0x03dbd0d8, 0x037ebb7d, 0x0094d8ec, 0x0014adde}}}, + {X: Field{[10]uint32{0x01f30a1f, 0x02567f89, 0x02c0eaf9, 0x01831421, 0x039aa9b7, 0x000d7da8, 0x037fbb83, 0x0089bde4, 0x035c163f, 0x00010256}}, Y: Field{[10]uint32{0x01dff7ab, 0x011f1601, 0x025aad55, 0x00ca4c11, 0x006a15d0, 0x030167d9, 0x03145955, 0x01353ba6, 0x00ac6555, 0x00073860}}}, + {X: Field{[10]uint32{0x00436a24, 0x03318bec, 0x034943d6, 0x02734bd4, 0x037a36a5, 0x00062fee, 0x02ecd9fd, 0x02750904, 0x013b067d, 0x001a8897}}, Y: Field{[10]uint32{0x027c2701, 0x0213e67a, 0x008da6a3, 0x02f31cf1, 0x03cc698a, 0x00c0164b, 0x023c91ee, 0x038332a8, 0x023d9352, 0x000a6cf5}}}, + {X: Field{[10]uint32{0x01d36e93, 0x0343235c, 0x0057cf46, 0x015253c8, 0x02172492, 0x00fd2e78, 0x0153a89e, 0x02eeff1a, 0x0241e5f9, 0x0008fbea}}, Y: Field{[10]uint32{0x00db789d, 0x023924df, 0x0386ef21, 0x02844c56, 0x0188cea3, 0x0309a486, 0x03d70755, 0x01c68816, 0x03b17f26, 0x00332269}}}, + {X: Field{[10]uint32{0x033ae55f, 0x02b42053, 0x0066a258, 0x01afd8df, 0x02f97217, 0x028e62b8, 0x01591bd6, 0x02655d63, 0x0297f7f9, 0x0038c307}}, Y: Field{[10]uint32{0x026509e1, 0x0192c061, 0x02df311e, 0x0155a096, 0x013e8e47, 0x034a6f62, 0x01edb4d4, 0x03a497f0, 0x036c3e66, 0x00069c32}}}, + {X: Field{[10]uint32{0x0308e278, 0x0328caf7, 0x01265b57, 0x02444f23, 0x03f05aac, 0x018061da, 0x0212f534, 0x005b54ad, 0x0382acd4, 0x002f9935}}, Y: Field{[10]uint32{0x03ad7e4a, 0x01ab3561, 0x0261f946, 0x017d6887, 0x03bff8f1, 0x00f2d413, 0x03b81c87, 0x00df24a4, 0x004a43e8, 0x001e9061}}}, + {X: Field{[10]uint32{0x023822ac, 0x00930e3c, 0x0145076d, 0x02e35291, 0x0073ada0, 0x00bf7cbc, 0x032b4c28, 0x02987019, 0x02bee009, 0x0032ab00}}, Y: Field{[10]uint32{0x0216d06f, 0x03298be4, 0x008ea500, 0x013f1984, 0x0172a9a6, 0x01711579, 0x02cc3047, 0x03d3888e, 0x00bba040, 0x001f64f9}}}, + {X: Field{[10]uint32{0x0284ccb3, 0x03b079c1, 0x02860fc0, 0x030e1b43, 0x03c1ef94, 0x0385c66c, 0x009321e0, 0x03aa5248, 0x01b03a9c, 0x0036894e}}, Y: Field{[10]uint32{0x023cf9f5, 0x0172fc33, 0x01f15779, 0x01bda8cf, 0x00b1b130, 0x0019fa69, 0x03f601f8, 0x033a8bd9, 0x0387bef1, 0x003a1784}}}, + {X: Field{[10]uint32{0x019cc0ed, 0x003a4d9e, 0x00198070, 0x01eefa6d, 0x024ce4fe, 0x03673ee9, 0x03c1bd8a, 0x01492192, 0x01525c96, 0x002fcbb9}}, Y: Field{[10]uint32{0x0058f18e, 0x00c0c3d8, 0x0304f634, 0x02639d80, 0x035df423, 0x000ce408, 0x01529bc3, 0x02289284, 0x021db129, 0x0022277a}}}, + {X: Field{[10]uint32{0x03abde36, 0x0259f051, 0x0226430b, 0x00a9c829, 0x01113060, 0x0290b18d, 0x024c9ff7, 0x00d98a7f, 0x0141cb0c, 0x002cf92c}}, Y: Field{[10]uint32{0x02865657, 0x01f22a94, 0x01f56a7d, 0x02ecb906, 0x03eff979, 0x035abffa, 0x00ff83e5, 0x020a3631, 0x0118c38a, 0x003d9bdc}}}, + {X: Field{[10]uint32{0x009475a0, 0x01ee9622, 0x03e01496, 0x024d8f0c, 0x0124a255, 0x02888d92, 0x01818265, 0x00846844, 0x024ffad7, 0x001147ac}}, Y: Field{[10]uint32{0x00565bb6, 0x01506791, 0x001a21fe, 0x0316fec5, 0x034cb2f8, 0x0307ccf8, 0x01bd3211, 0x030ede69, 0x014049f6, 0x002227fe}}}, + {X: Field{[10]uint32{0x00f5984c, 0x019741ce, 0x03c53b5d, 0x02fd2f03, 0x03ea4c77, 0x012e2bcc, 0x027a0b0c, 0x011de084, 0x018a6a75, 0x000a6ad9}}, Y: Field{[10]uint32{0x03f0f2c1, 0x0380688a, 0x016d215e, 0x02aae02c, 0x02947b8b, 0x01cb69af, 0x0219f9ad, 0x01b0ec29, 0x01a9c77d, 0x002aac6f}}}, + {X: Field{[10]uint32{0x017b24db, 0x026cd04a, 0x038ac287, 0x026b1953, 0x0209d9e7, 0x0076967e, 0x03bb9c0d, 0x03089016, 0x0007d815, 0x0026d671}}, Y: Field{[10]uint32{0x0276d190, 0x006ae369, 0x0376cc76, 0x02d826c6, 0x0117bb35, 0x02eb302a, 0x0027811a, 0x0004530a, 0x018ee630, 0x00293bc1}}}, + {X: Field{[10]uint32{0x026c9fd0, 0x01939d29, 0x0220fc05, 0x01e94ab1, 0x0378e69a, 0x01b0eb1d, 0x01b970e7, 0x02e5d62e, 0x036582ae, 0x0021f49e}}, Y: Field{[10]uint32{0x03511e03, 0x0026384d, 0x00b1acd9, 0x01724c9a, 0x0004d03d, 0x03c1fd07, 0x0083e087, 0x024cdd07, 0x03ccdec2, 0x000ffcec}}}, + {X: Field{[10]uint32{0x009701dc, 0x02e9bda6, 0x00bf4d9b, 0x020edc36, 0x037fe7d3, 0x01af2e4e, 0x005a0ab3, 0x02058ef6, 0x004d3895, 0x003eecda}}, Y: Field{[10]uint32{0x03b94504, 0x02f89921, 0x014c0301, 0x0109a297, 0x01759e73, 0x00981b42, 0x01c2af7b, 0x02cef443, 0x01c6c9c5, 0x001ec1f3}}}, + {X: Field{[10]uint32{0x0314a453, 0x033de7d0, 0x034eacc7, 0x0253e549, 0x01a3ef14, 0x019b9629, 0x03cc1adc, 0x00ae7488, 0x02e4ccc4, 0x0020808a}}, Y: Field{[10]uint32{0x01d2b695, 0x03439245, 0x02a3bb5c, 0x017a6a3a, 0x003a8180, 0x02d36d14, 0x030481a9, 0x00b6841b, 0x02509ddf, 0x00309090}}}, + {X: Field{[10]uint32{0x0220f901, 0x03b2562f, 0x0001a1db, 0x01f15f42, 0x01ab4e65, 0x0247e25d, 0x02475fae, 0x032cdeef, 0x005b3b51, 0x002e9735}}, Y: Field{[10]uint32{0x0341b0a5, 0x00e807b3, 0x0016478e, 0x0062d639, 0x007f9eb7, 0x026394c9, 0x007eddd2, 0x03d638d0, 0x03c0f8b4, 0x000b8353}}}, + {X: Field{[10]uint32{0x026703fc, 0x00197622, 0x02d277cd, 0x00eb7d6d, 0x02cfadaf, 0x00f9cb88, 0x02b44445, 0x0346f9da, 0x0041b316, 0x0004a4f2}}, Y: Field{[10]uint32{0x0133c2fa, 0x01c2ab54, 0x01749286, 0x01122012, 0x002488f1, 0x01081c27, 0x004ab523, 0x012622e1, 0x033740fb, 0x00263d63}}}, + {X: Field{[10]uint32{0x035015c6, 0x02aa6237, 0x037c2c69, 0x03923610, 0x03987d77, 0x022b8db1, 0x03972dea, 0x006f6b6e, 0x03c854bf, 0x003b27ec}}, Y: Field{[10]uint32{0x01486d3f, 0x01047329, 0x00cb2a00, 0x0152ff3b, 0x00fe425d, 0x020c9583, 0x01d6b364, 0x03a5d258, 0x03fdea59, 0x00357cd6}}}, + {X: Field{[10]uint32{0x0144d244, 0x01372dc9, 0x02d62769, 0x03b1ab6b, 0x029950ea, 0x039f563d, 0x03d44662, 0x016da5b2, 0x003f4cd5, 0x000bb338}}, Y: Field{[10]uint32{0x03f68879, 0x01857990, 0x0082f0f6, 0x00ff79e4, 0x00d1bc79, 0x001f3133, 0x01403cae, 0x03dd1fab, 0x00a97f1c, 0x003853cc}}}, + {X: Field{[10]uint32{0x026fb3b2, 0x000973d5, 0x03c3d77c, 0x02beb141, 0x024c6ad5, 0x01bdbbe2, 0x025e7fa5, 0x039481e0, 0x037fa63e, 0x003b63eb}}, Y: Field{[10]uint32{0x03684a9d, 0x0011b620, 0x008f2c9b, 0x03123afe, 0x01cb0636, 0x03e8f953, 0x02f10407, 0x009cf296, 0x00b8ab21, 0x00037c48}}}, + {X: Field{[10]uint32{0x00c32e4f, 0x01e317c5, 0x023a5bc0, 0x027cf0a3, 0x030bf3fd, 0x00c3f645, 0x02b456af, 0x036afb07, 0x037b8780, 0x0011f2e3}}, Y: Field{[10]uint32{0x00aa3203, 0x00c6f4ad, 0x029af669, 0x006625e3, 0x02c5889d, 0x0087b8b7, 0x02fc948f, 0x02a9b1a2, 0x02021f16, 0x003e181e}}}, + {X: Field{[10]uint32{0x01762009, 0x0056890f, 0x025cacf2, 0x011c78e3, 0x02d49620, 0x02bf9c3a, 0x01a3ee38, 0x02acbcee, 0x02c1fdeb, 0x001d8d96}}, Y: Field{[10]uint32{0x0253aa28, 0x03146d53, 0x01c3211f, 0x00d03737, 0x025d7783, 0x01f517e9, 0x037d3a69, 0x02d803fc, 0x03728b4b, 0x000b2b2b}}}, + {X: Field{[10]uint32{0x0027b424, 0x00cc27b3, 0x00ea8a23, 0x0078461a, 0x039f0931, 0x018fb720, 0x03750550, 0x03954b84, 0x01e099b8, 0x00327757}}, Y: Field{[10]uint32{0x00f8c1a5, 0x0088daee, 0x039e4b38, 0x022ec45f, 0x0338163a, 0x02bf9f4a, 0x00f134ae, 0x017adf1a, 0x02384e61, 0x0012f534}}}, + {X: Field{[10]uint32{0x010a8961, 0x0164cb6b, 0x02a3183e, 0x02de08b8, 0x009a1e08, 0x036f2dbe, 0x01c2f96b, 0x01baf1f0, 0x03adcc40, 0x0008ada9}}, Y: Field{[10]uint32{0x020ac794, 0x007b77eb, 0x02d5e22c, 0x0389dd4d, 0x0287b553, 0x00d2bcb5, 0x02be9a95, 0x013d3f4b, 0x0095bab2, 0x0014ae18}}}, + {X: Field{[10]uint32{0x0381a158, 0x006a6da7, 0x00d24a33, 0x0012cb79, 0x0296f06c, 0x02adfdaf, 0x03017fec, 0x01f7c30d, 0x00a749fa, 0x000fba02}}, Y: Field{[10]uint32{0x0039cb4a, 0x008f0709, 0x02d0c01e, 0x015b6107, 0x016c4b13, 0x01933ff9, 0x03dc1740, 0x027b3621, 0x00ef5f1f, 0x000fa553}}}, + {X: Field{[10]uint32{0x00fa4803, 0x027088ae, 0x0048f3e4, 0x0009c10c, 0x00aa97d3, 0x0356d890, 0x0269ae44, 0x01225837, 0x00588a7a, 0x000a4e2f}}, Y: Field{[10]uint32{0x01ada03e, 0x0015340e, 0x0081865b, 0x0071672d, 0x029ea59a, 0x029ba80a, 0x034826cb, 0x00764379, 0x02619fad, 0x003c9aef}}}, + {X: Field{[10]uint32{0x01a15451, 0x025df5f8, 0x030b12c3, 0x01737dca, 0x0094962e, 0x037d0c9d, 0x03ea34f5, 0x03277932, 0x00ecda97, 0x001a0956}}, Y: Field{[10]uint32{0x01fedc6c, 0x02092bee, 0x0220f112, 0x00cd6bad, 0x028b543f, 0x023b1b31, 0x0253c4cc, 0x0004fc64, 0x036522c7, 0x003130b9}}}, + {X: Field{[10]uint32{0x02493620, 0x029a2d01, 0x03d8c08b, 0x00243dfd, 0x010cbfad, 0x007cf411, 0x036811de, 0x003695e7, 0x0068fc52, 0x001c8363}}, Y: Field{[10]uint32{0x004c9cb5, 0x01517899, 0x03a2950d, 0x030ed217, 0x0107ac26, 0x02eecc6a, 0x016fd4b8, 0x01b41813, 0x00a84f7a, 0x002e19fa}}}, + {X: Field{[10]uint32{0x00b84831, 0x01fd7afd, 0x029e02a1, 0x00beceb2, 0x01994d5d, 0x030118ea, 0x02153ec6, 0x019634d5, 0x03e71bdf, 0x00259fec}}, Y: Field{[10]uint32{0x007cc83f, 0x0180bad5, 0x03a094cf, 0x03271e21, 0x03e3cddf, 0x0326a135, 0x01d0926e, 0x0092ccbd, 0x01f88617, 0x002e1299}}}, + {X: Field{[10]uint32{0x03cedc85, 0x029063a2, 0x03d88db2, 0x0353e19c, 0x0273f6eb, 0x03bc4ee6, 0x01fc1131, 0x030f7a39, 0x025c77ec, 0x000767f4}}, Y: Field{[10]uint32{0x028035d7, 0x02b713ab, 0x030e4aa6, 0x032758af, 0x03033012, 0x00fe908c, 0x03ff58e2, 0x003ed2fe, 0x0301d972, 0x00152818}}}, + {X: Field{[10]uint32{0x01311c0a, 0x033aa27c, 0x0144a0b4, 0x027e4143, 0x017d0402, 0x00d1b8ce, 0x00dff5ff, 0x01ebcc45, 0x0158a113, 0x002004e0}}, Y: Field{[10]uint32{0x025a6b31, 0x008d2a9a, 0x01c36bdd, 0x0225f157, 0x00bc5e94, 0x028ebf9c, 0x01cc712d, 0x02b06309, 0x0076e6d6, 0x0005bd26}}}, + {X: Field{[10]uint32{0x03ef632f, 0x00de4cf0, 0x00c55c6c, 0x006088aa, 0x0233aa34, 0x0041f7c8, 0x020906b3, 0x0161138e, 0x002177fa, 0x0002aad0}}, Y: Field{[10]uint32{0x0201b092, 0x0139780c, 0x03d2f703, 0x00e669fe, 0x019a0620, 0x028225c4, 0x02d58767, 0x0373b4e0, 0x008f3ad0, 0x0026e0c8}}}, + {X: Field{[10]uint32{0x03a72f10, 0x004bc4c3, 0x00fe1d36, 0x00dc52ef, 0x003c5232, 0x00052f98, 0x02f1e3b3, 0x03d19367, 0x014c7670, 0x0023cff4}}, Y: Field{[10]uint32{0x0205c68e, 0x01b022d0, 0x030a4b54, 0x03d75c70, 0x02862ef6, 0x032181b9, 0x03a593a5, 0x02e07eef, 0x00947901, 0x002132dc}}}, + {X: Field{[10]uint32{0x021f4933, 0x0254fb52, 0x00d88e49, 0x000cc32e, 0x00df69a9, 0x00e5e7b2, 0x034578a3, 0x0301bfab, 0x011caba3, 0x000eea72}}, Y: Field{[10]uint32{0x026f99cc, 0x03b91ede, 0x0072f582, 0x016ed248, 0x03fdcff6, 0x01646efb, 0x00107990, 0x0188c7a1, 0x034c3eb6, 0x001c1229}}}, + {X: Field{[10]uint32{0x00f36a7c, 0x026a72b7, 0x006455f2, 0x0070a618, 0x017344c2, 0x027db2d8, 0x01524682, 0x02c38354, 0x03d289da, 0x000be30d}}, Y: Field{[10]uint32{0x03508396, 0x01d3503a, 0x00201d2f, 0x024dea0d, 0x014223d0, 0x0271e659, 0x02f145e6, 0x01c43afe, 0x024e9d02, 0x000dfc2d}}}, + {X: Field{[10]uint32{0x02dce846, 0x0310329d, 0x012d300e, 0x00a33b6f, 0x0273fc61, 0x02995bf2, 0x03f60500, 0x02749ee1, 0x03a2c920, 0x001179ba}}, Y: Field{[10]uint32{0x035f16ec, 0x018b24ef, 0x02d908a0, 0x015d399a, 0x02813867, 0x03b88960, 0x0091a635, 0x020aef47, 0x0144ba18, 0x0028f8a3}}}, + {X: Field{[10]uint32{0x01767ee9, 0x03ee2c7f, 0x023cc605, 0x026e62b4, 0x0182ea7d, 0x03a10b67, 0x027143ff, 0x03348d11, 0x03d380a0, 0x00297b34}}, Y: Field{[10]uint32{0x0311353f, 0x029b8a53, 0x03b959be, 0x00cc3459, 0x02c9ab6c, 0x0140573c, 0x0331fe5b, 0x0109a4fe, 0x00238ea8, 0x0008bc4a}}}, + {X: Field{[10]uint32{0x0174be83, 0x00ffe400, 0x034a2c94, 0x02a7fd80, 0x0051eb66, 0x0060dd3a, 0x03698213, 0x00ec3510, 0x0271c466, 0x003dfd16}}, Y: Field{[10]uint32{0x0346fce5, 0x030290d6, 0x021498ac, 0x01b3d4be, 0x017fbdf4, 0x01a8ca07, 0x013d6e3e, 0x025fd503, 0x03cd4ec1, 0x000e858c}}}, + {X: Field{[10]uint32{0x007cb59c, 0x02c9d2d2, 0x00832a94, 0x020a957b, 0x0252bf6c, 0x015c5f50, 0x0303b7de, 0x01385d6b, 0x02866b31, 0x00249608}}, Y: Field{[10]uint32{0x02811f68, 0x03c149d2, 0x004a0369, 0x00b377eb, 0x03d6c2f5, 0x01256ef1, 0x02346700, 0x00277194, 0x01847368, 0x003f23a5}}}, + {X: Field{[10]uint32{0x02556da4, 0x01db3043, 0x027b5a7f, 0x03c53754, 0x011d7849, 0x02b9be9d, 0x017fa966, 0x034028bd, 0x00d32303, 0x003057fa}}, Y: Field{[10]uint32{0x01c10951, 0x03ec4260, 0x00d067b5, 0x01ab8ba7, 0x03e017c0, 0x00334d22, 0x03c445c5, 0x037fc699, 0x03d04685, 0x000d890a}}}, + {X: Field{[10]uint32{0x022b5355, 0x013d8331, 0x03e5ca46, 0x00d9f5ca, 0x0004dd71, 0x01c2fc35, 0x00372df2, 0x029838c4, 0x0026152a, 0x000127be}}, Y: Field{[10]uint32{0x00c4c645, 0x01f4b2c8, 0x02165d9c, 0x00bad597, 0x024e369d, 0x01ea4f85, 0x01c572c7, 0x01202e68, 0x03a20dc4, 0x001f2b52}}}, + {X: Field{[10]uint32{0x0091a18f, 0x02b848a7, 0x006a3be4, 0x0077b59a, 0x03629b2f, 0x018c4cf8, 0x02c876e1, 0x03e53f84, 0x01e7538f, 0x00323782}}, Y: Field{[10]uint32{0x017c2635, 0x02d891da, 0x03e885ea, 0x003c69db, 0x029cecb1, 0x01825958, 0x031e872d, 0x02228417, 0x031fe580, 0x002d69fc}}}, + {X: Field{[10]uint32{0x02abb344, 0x007ffae5, 0x00576946, 0x0067bdd9, 0x016b3d51, 0x026bc92a, 0x03a6cd3d, 0x010ebc75, 0x03a4616f, 0x00361ae7}}, Y: Field{[10]uint32{0x0003bcab, 0x01c3867c, 0x02539fb5, 0x01cb8e4b, 0x0056df6f, 0x01a72e3a, 0x001b6606, 0x006d2652, 0x028e8f93, 0x0008e233}}}, + {X: Field{[10]uint32{0x00cbbf88, 0x00eb9bc0, 0x0055a743, 0x02793cfb, 0x0187c496, 0x003f8c10, 0x027b7193, 0x038ac4fe, 0x0218f351, 0x0028b35d}}, Y: Field{[10]uint32{0x0119d685, 0x034dae17, 0x0324aa8d, 0x034e8258, 0x0229870c, 0x00c430d8, 0x015711ab, 0x00d8ec51, 0x0062436a, 0x000f82d7}}}, + {X: Field{[10]uint32{0x0100b2ca, 0x010b33c8, 0x02b87ab4, 0x00efb4be, 0x02ad6c21, 0x00e6d55d, 0x036e4f6b, 0x0128f5e0, 0x00d4e33e, 0x002dca0f}}, Y: Field{[10]uint32{0x02abc9ea, 0x00c5cfa3, 0x008fc273, 0x019c0109, 0x03090833, 0x0097aacf, 0x021e7e30, 0x008c1c60, 0x02fb111c, 0x00246001}}}, + {X: Field{[10]uint32{0x00b9a769, 0x02903d92, 0x00d9a0cd, 0x0151bbf3, 0x01d12e18, 0x0328c4d9, 0x01b123b9, 0x02ea34d5, 0x012e9707, 0x002c7f4b}}, Y: Field{[10]uint32{0x035e674e, 0x027bd2d1, 0x0294b58c, 0x00f58b6b, 0x021a40cf, 0x00a062ff, 0x004d2226, 0x01577bd8, 0x00168e8f, 0x00230df3}}}, + {X: Field{[10]uint32{0x0339f90f, 0x034ae0b2, 0x0262e7c0, 0x031ce574, 0x02cf6077, 0x0216d69b, 0x034be328, 0x03a17832, 0x03e74242, 0x0006c265}}, Y: Field{[10]uint32{0x037760b3, 0x01a48eda, 0x03183fa3, 0x00493052, 0x02f30fae, 0x00ef3e33, 0x00c2d2ef, 0x00762bb6, 0x00d427cd, 0x00156d36}}}, + {X: Field{[10]uint32{0x018d78d6, 0x01541976, 0x03e698e0, 0x02e06ff5, 0x034f1dc9, 0x03b86eec, 0x02362588, 0x0324977a, 0x03bc094a, 0x0015bfee}}, Y: Field{[10]uint32{0x00edc65f, 0x029c6636, 0x022089f8, 0x02dee00d, 0x02a517fc, 0x02fc716e, 0x02f3d235, 0x00af6c82, 0x008f46d7, 0x002a9cc8}}}, + {X: Field{[10]uint32{0x02d7045e, 0x00f8364e, 0x00685353, 0x02459c8a, 0x00e39081, 0x0049847a, 0x026cd368, 0x01fe70d0, 0x02b07ddb, 0x0030497e}}, Y: Field{[10]uint32{0x0377e5ae, 0x034c3c66, 0x024b68cc, 0x03d137d1, 0x031f235e, 0x00b07763, 0x003f1189, 0x01952bdb, 0x003f622f, 0x000a019c}}}, + {X: Field{[10]uint32{0x027f4a17, 0x014508ff, 0x0130148a, 0x03efc967, 0x02dbab85, 0x0207a02b, 0x01fa6fee, 0x031d0a2c, 0x01dbe4e0, 0x0039fb7a}}, Y: Field{[10]uint32{0x033fc066, 0x01695b34, 0x021d9e63, 0x016f0b6e, 0x02e23692, 0x039fd434, 0x00d32e65, 0x0173eb20, 0x037a9fbc, 0x0024eac9}}}, + {X: Field{[10]uint32{0x03df93f3, 0x02545668, 0x01cc8aa3, 0x00a3122c, 0x03a47c16, 0x0214fe59, 0x00c3da9d, 0x01af311c, 0x0363f1bd, 0x001d1c05}}, Y: Field{[10]uint32{0x018ac8ee, 0x01bb5557, 0x029d8a4b, 0x01eca3b5, 0x02bd2223, 0x001551ee, 0x0393dd5f, 0x0043ccdc, 0x011c7c55, 0x002acb00}}}, + {X: Field{[10]uint32{0x039081b8, 0x02403579, 0x0257689c, 0x00717195, 0x020a6554, 0x00de138c, 0x01ffb8d8, 0x03dc7f9b, 0x039755ba, 0x0002349f}}, Y: Field{[10]uint32{0x02c250ad, 0x02184946, 0x01386e55, 0x0032dfcc, 0x03f308f9, 0x0354889f, 0x021f837b, 0x0258052b, 0x0268f3c8, 0x0029c5db}}}, + {X: Field{[10]uint32{0x00cc7ea9, 0x01e633ab, 0x028c10f5, 0x00063a60, 0x0071b0db, 0x02b0976e, 0x000a0ff1, 0x02d4c7ab, 0x02fe9040, 0x0018f81a}}, Y: Field{[10]uint32{0x00910aa5, 0x003001fd, 0x0213e930, 0x0112ca9a, 0x010c9112, 0x00126bb5, 0x028fcf99, 0x03822dac, 0x0084a9db, 0x002aa846}}}, + {X: Field{[10]uint32{0x004ed50f, 0x0256251d, 0x004b5dde, 0x030a2082, 0x036bf8ba, 0x00f92c6a, 0x01617d02, 0x002acd0b, 0x01ae27d6, 0x00371fa8}}, Y: Field{[10]uint32{0x002f3dfa, 0x000a4705, 0x0140e48a, 0x029b8445, 0x03b63efb, 0x01d52968, 0x03e97fc0, 0x0317feef, 0x036e2b95, 0x0024f1f5}}}, + {X: Field{[10]uint32{0x02e842d7, 0x00ef46fd, 0x02253221, 0x00e6ee5d, 0x0136e402, 0x02d6baa6, 0x03dfb691, 0x03bd28f5, 0x036df69c, 0x003cebbb}}, Y: Field{[10]uint32{0x0208de5d, 0x0343d188, 0x001151fb, 0x023bd24f, 0x0272e562, 0x032c7a2b, 0x03bde031, 0x01c00be1, 0x01da339c, 0x0015f4df}}}, + {X: Field{[10]uint32{0x02bec3ce, 0x0286b29d, 0x01b67816, 0x03eca3da, 0x02ae87da, 0x00f5c9cb, 0x005d0812, 0x0193a837, 0x004c316e, 0x002096f6}}, Y: Field{[10]uint32{0x00a52251, 0x032846d0, 0x00f1dc28, 0x01925d96, 0x00849a25, 0x018be1fc, 0x03e3f69d, 0x01c2a1a8, 0x03fdba83, 0x001878e9}}}, + {X: Field{[10]uint32{0x0056a75d, 0x03bae4ce, 0x03ba7f5a, 0x02e543b0, 0x010edb63, 0x03a509a8, 0x02988cd8, 0x014dc274, 0x00d74dec, 0x000c428b}}, Y: Field{[10]uint32{0x03122c97, 0x00ee07c5, 0x00228ffa, 0x03b8f863, 0x03e3ff1e, 0x02bb0943, 0x02b4ab3a, 0x0395fdfc, 0x02aedfa5, 0x00175b61}}}, + {X: Field{[10]uint32{0x03425217, 0x0160b006, 0x024d85af, 0x02e25dfb, 0x0369f04d, 0x026edb0f, 0x02355aef, 0x004b43e0, 0x007562a5, 0x000d1c75}}, Y: Field{[10]uint32{0x039cba31, 0x00e67af6, 0x00358aed, 0x02a51410, 0x01ccd444, 0x000ded09, 0x006d68c5, 0x02da7afe, 0x02702fe0, 0x0009cb77}}}, + {X: Field{[10]uint32{0x00257a2f, 0x01a01f93, 0x0138d808, 0x03ac3a8d, 0x00aaeee4, 0x020a6bb2, 0x022b3df6, 0x02bc9082, 0x0163bfaf, 0x002fdb49}}, Y: Field{[10]uint32{0x000b496d, 0x003b8ac1, 0x03ff1a92, 0x03113079, 0x003a2738, 0x0155d1ae, 0x03847ef7, 0x0125ad93, 0x02007e7b, 0x003a01de}}}, + {X: Field{[10]uint32{0x039cddc4, 0x03b5094a, 0x023fbbdb, 0x0194c9c8, 0x02d6f4d4, 0x03361db9, 0x03ce42a3, 0x03dc614b, 0x03c4a883, 0x003accf3}}, Y: Field{[10]uint32{0x02e5453f, 0x02b69287, 0x028d2a7d, 0x00df8977, 0x03eaab91, 0x01f7a1be, 0x00f03ad2, 0x022f6641, 0x00f2ef60, 0x0026f500}}}, + {X: Field{[10]uint32{0x00c2279f, 0x002475bb, 0x0108f082, 0x00f68363, 0x016b123d, 0x037a5591, 0x0383edf7, 0x03cc67ec, 0x00d03e5d, 0x0004c5f8}}, Y: Field{[10]uint32{0x03675afd, 0x0348a48c, 0x03b252a9, 0x025fab2e, 0x01dcae42, 0x001a951c, 0x0122b607, 0x02755ac3, 0x024d5c6f, 0x000efd90}}}, + {X: Field{[10]uint32{0x009aeb56, 0x02f38d0c, 0x03456c99, 0x039099ee, 0x007e00f8, 0x01501bcc, 0x022cf5dc, 0x010fafac, 0x032e99dc, 0x00206c27}}, Y: Field{[10]uint32{0x03361932, 0x02006028, 0x03d7c495, 0x01bfafc5, 0x011dbc5f, 0x00b8cc72, 0x035b1df9, 0x03bab10b, 0x02a4b300, 0x00275215}}}, + {X: Field{[10]uint32{0x015a62f2, 0x02199121, 0x01f7e98b, 0x00c8348f, 0x03ed436d, 0x03d3a8cd, 0x02626bae, 0x03fc65c8, 0x01670a32, 0x00037ba9}}, Y: Field{[10]uint32{0x01032414, 0x019b50e7, 0x005a6dfe, 0x03bda79e, 0x014a8310, 0x00305e4b, 0x0157ab34, 0x005ff821, 0x0297c61a, 0x00172449}}}, + {X: Field{[10]uint32{0x003444e5, 0x03713a39, 0x02755ef3, 0x02c73ba1, 0x0296ae44, 0x01ea46e7, 0x00e02ffa, 0x0345cf9a, 0x00835746, 0x003392b4}}, Y: Field{[10]uint32{0x0303aa7d, 0x001bd89f, 0x02a20d34, 0x006bfc70, 0x00df7cc8, 0x01517fa1, 0x013e2891, 0x023532d5, 0x03890523, 0x002fa1b2}}}, + {X: Field{[10]uint32{0x030b077e, 0x0339ffd4, 0x004f6fbb, 0x0131f606, 0x032e3638, 0x02281c57, 0x0119a324, 0x006bdb93, 0x023d407f, 0x0026a64f}}, Y: Field{[10]uint32{0x001a7a7e, 0x03baf04c, 0x034e2481, 0x0077150f, 0x023f8700, 0x01b65bfe, 0x027bd6fe, 0x019fba66, 0x012d80a2, 0x00392869}}}, + {X: Field{[10]uint32{0x039bd0d8, 0x00d844be, 0x03ccc06b, 0x03bd16ab, 0x039247c7, 0x0099ea98, 0x017ae6a1, 0x0017205c, 0x032d7c7f, 0x0007c437}}, Y: Field{[10]uint32{0x00760410, 0x01e0ec16, 0x029affdc, 0x010c9f30, 0x03e45ad6, 0x0259fa6b, 0x0283b0ec, 0x036de4c9, 0x025b71e2, 0x0019c2c9}}}, + {X: Field{[10]uint32{0x02621b53, 0x0355c461, 0x00a5a0ba, 0x03fe7645, 0x02d57d1d, 0x0329dd77, 0x0317633d, 0x008239f6, 0x025729c9, 0x001c33ac}}, Y: Field{[10]uint32{0x01df0c62, 0x0307b0d2, 0x0164ace7, 0x00941fa7, 0x0200ee98, 0x01b475d6, 0x0211c0ec, 0x01157f37, 0x0291b3f3, 0x001b805b}}}, + {X: Field{[10]uint32{0x00694e3e, 0x024fdf9d, 0x032fd466, 0x0312b3a7, 0x00043fb6, 0x02841818, 0x03b79210, 0x020bec37, 0x01e64dc8, 0x002e91b9}}, Y: Field{[10]uint32{0x01789acc, 0x010b221f, 0x009cb0f3, 0x02cf7a81, 0x025868d0, 0x0276310d, 0x0208e060, 0x0207fe28, 0x02b90793, 0x003abad3}}}, + {X: Field{[10]uint32{0x03c30d81, 0x0034e200, 0x037a9e32, 0x01538123, 0x02a631d1, 0x00f5d5e7, 0x0179beaf, 0x02b48390, 0x02dfd233, 0x002ee8ee}}, Y: Field{[10]uint32{0x021b961d, 0x03e400d7, 0x011e8ed3, 0x039a3229, 0x0202bdfc, 0x01d95a4f, 0x03a0af4e, 0x01131cc5, 0x030d69dd, 0x003ca9f1}}}, + {X: Field{[10]uint32{0x02d3f8a5, 0x01d4298d, 0x01283d93, 0x007ce396, 0x02057d49, 0x010782bc, 0x0258f1bf, 0x02e9a05f, 0x0369d300, 0x001b7da9}}, Y: Field{[10]uint32{0x033a4a6f, 0x0268db69, 0x02819dad, 0x024a67c4, 0x01ebf0f4, 0x0337ed36, 0x02d1f31c, 0x031dcbb3, 0x03b3aa51, 0x0018e820}}}, + {X: Field{[10]uint32{0x03174f2c, 0x02970529, 0x022361ad, 0x014c74bf, 0x034fab19, 0x024e945c, 0x00c7ea87, 0x026a60a5, 0x031a4b8c, 0x002bff44}}, Y: Field{[10]uint32{0x0011be6d, 0x00a59c4d, 0x01708734, 0x0072cc81, 0x03342689, 0x022a5e23, 0x02ed3225, 0x00da60ff, 0x00d9ec4a, 0x00130f79}}}, + {X: Field{[10]uint32{0x030abc7e, 0x028914ce, 0x016ee2f0, 0x031af086, 0x01d42cca, 0x031f1c23, 0x01ba5464, 0x02c62867, 0x00499e54, 0x000b68c4}}, Y: Field{[10]uint32{0x032db974, 0x001527c8, 0x03e7c0bb, 0x028fded1, 0x02426981, 0x00713414, 0x0109d445, 0x027e2d5b, 0x009120ad, 0x003cd52b}}}, + {X: Field{[10]uint32{0x02e57b61, 0x01f433e4, 0x03f2b2dc, 0x0007bb24, 0x0323cdd2, 0x036d30c7, 0x01381ace, 0x03e0aba3, 0x0053cbe3, 0x000e20bb}}, Y: Field{[10]uint32{0x037e6e3a, 0x020328bb, 0x03c786cd, 0x014cbec2, 0x0271a43d, 0x009d0191, 0x02b0046b, 0x02ff3124, 0x015de5a7, 0x00074d0c}}}, + {X: Field{[10]uint32{0x0387f9f1, 0x026ed21c, 0x00b28d55, 0x01d4a997, 0x03468259, 0x03a7ad78, 0x03c8e4e8, 0x02ac98e6, 0x02356a08, 0x003f2ae1}}, Y: Field{[10]uint32{0x00fceb94, 0x02c81532, 0x03f540d7, 0x023413bd, 0x02bef2b3, 0x034d5c2b, 0x0166753a, 0x001f395d, 0x00c0d08f, 0x002bd020}}}, + {X: Field{[10]uint32{0x0136bb58, 0x02275d67, 0x00ebe5dd, 0x00468552, 0x02847bf0, 0x01d5032a, 0x01dcd5a5, 0x01f84a8a, 0x00bb8a89, 0x003f4d2e}}, Y: Field{[10]uint32{0x0110b2f3, 0x00d465de, 0x0255b762, 0x00ef4356, 0x00d19b60, 0x008c41b9, 0x0127eaa7, 0x03e5cd5e, 0x02ac6a56, 0x0014699a}}}, + {X: Field{[10]uint32{0x03d4b469, 0x03663961, 0x002fa808, 0x01826776, 0x031d3b46, 0x01f1f605, 0x007a1678, 0x016fc1db, 0x0120c0d8, 0x0007a26f}}, Y: Field{[10]uint32{0x00fe882a, 0x03218a4f, 0x01353eaf, 0x0243ef13, 0x03dcf115, 0x01d3cc48, 0x02dae475, 0x021d80f7, 0x01d0e576, 0x0013d4ea}}}, + {X: Field{[10]uint32{0x03aa05ed, 0x00ea55de, 0x0048f5fb, 0x02795231, 0x01ddca45, 0x03beeaea, 0x017d93ea, 0x026b3b23, 0x03ba6690, 0x002287a9}}, Y: Field{[10]uint32{0x037be091, 0x030133e2, 0x00f99e09, 0x033e2ba5, 0x01ea1f1f, 0x0140600c, 0x037655b2, 0x00de90e7, 0x01e9064f, 0x00356016}}}, + {X: Field{[10]uint32{0x011331a1, 0x03ddb587, 0x032cbd7f, 0x00302d55, 0x00e4451f, 0x03ca586c, 0x0086549a, 0x02649a5a, 0x000d80d5, 0x003830de}}, Y: Field{[10]uint32{0x0145491d, 0x013da392, 0x02551114, 0x02baefb6, 0x03d827dd, 0x008c39ec, 0x03e6f1e5, 0x00ec7f0b, 0x02e6a13c, 0x00267674}}}, + {X: Field{[10]uint32{0x03996035, 0x032303a0, 0x0260ef7c, 0x0373fc83, 0x008e7e1b, 0x036ab786, 0x03ed36c5, 0x02b0485b, 0x00e6ed23, 0x002590d5}}, Y: Field{[10]uint32{0x0028998a, 0x02f4c98d, 0x03529aa8, 0x0234f18c, 0x027e6a40, 0x039bc188, 0x02531984, 0x031ba1c8, 0x009a8563, 0x003dd228}}}, + {X: Field{[10]uint32{0x02fe3f9b, 0x036f0f06, 0x014a1ab1, 0x00556150, 0x038bd094, 0x01a61871, 0x02eab869, 0x03218bf1, 0x03295125, 0x00260279}}, Y: Field{[10]uint32{0x007b9fd7, 0x01afd8e6, 0x0005efd4, 0x02250cbf, 0x00ab0fc0, 0x03f21296, 0x03909f86, 0x0155a20c, 0x0228bbf5, 0x003614d8}}}, + {X: Field{[10]uint32{0x0301ed17, 0x03b31303, 0x03b34abb, 0x01cf6852, 0x011d8d71, 0x00097f1f, 0x0183bf94, 0x013108a3, 0x0102305e, 0x000657d3}}, Y: Field{[10]uint32{0x009d637f, 0x02e1d99f, 0x0221a726, 0x0174ea23, 0x03ce1384, 0x00f2d119, 0x00152e02, 0x02e7341a, 0x00b497ae, 0x00255f6e}}}, + {X: Field{[10]uint32{0x014e0b37, 0x011286a1, 0x036c0f2c, 0x039a06e0, 0x02b0203f, 0x0009243a, 0x023f726d, 0x01f8d3be, 0x02ba3eb1, 0x00158baa}}, Y: Field{[10]uint32{0x0152b1e8, 0x015a9be1, 0x02da59db, 0x02935ecc, 0x0397093b, 0x003bd094, 0x03a35a77, 0x012010b4, 0x00ed9e66, 0x002d3996}}}, + {X: Field{[10]uint32{0x01ec8282, 0x027ca383, 0x01a288d7, 0x00b0292c, 0x03de3a60, 0x00c0bcd3, 0x00579693, 0x02405203, 0x01eb1efa, 0x002128b1}}, Y: Field{[10]uint32{0x02207cf1, 0x018acd91, 0x02023bdf, 0x00fd7c36, 0x00c70331, 0x0372b110, 0x03261dba, 0x03bb6161, 0x01c788cf, 0x001c0354}}}, + {X: Field{[10]uint32{0x0272f913, 0x00025ccd, 0x007fb8ba, 0x02b5df53, 0x00b93e2b, 0x031b52e1, 0x00e73406, 0x0245a2c5, 0x03cf0dbd, 0x0020f44b}}, Y: Field{[10]uint32{0x03279a7b, 0x02d44c79, 0x018ee523, 0x03f61848, 0x013c0dd6, 0x020b3a73, 0x03c78b36, 0x00cb3eeb, 0x0226bf25, 0x0039215b}}}, + {X: Field{[10]uint32{0x015451cf, 0x0001a3b7, 0x03701dfb, 0x008a7b52, 0x00ce64d5, 0x03d190fe, 0x03e73bf9, 0x00c8383e, 0x02f2bbd9, 0x00266229}}, Y: Field{[10]uint32{0x02882d5b, 0x02877462, 0x01910ed5, 0x0070aafa, 0x000d2f43, 0x024be269, 0x0244e4d8, 0x00994342, 0x02fcbd3b, 0x002eecd4}}}, + {X: Field{[10]uint32{0x03ff0724, 0x0202842b, 0x00b5160f, 0x0130aa9c, 0x0183017d, 0x028845ac, 0x0321d1e2, 0x00571ccd, 0x003dcfa6, 0x000fa486}}, Y: Field{[10]uint32{0x002dc945, 0x0202ce45, 0x03d7f226, 0x0029d395, 0x0276a2f3, 0x029cfcf4, 0x01fe5453, 0x02f98bc3, 0x0251f4bc, 0x0031e220}}}, + {X: Field{[10]uint32{0x0239492f, 0x018f5b20, 0x0044de77, 0x02617a96, 0x01e5f85b, 0x02cd89d7, 0x03130faf, 0x03f8e932, 0x0300fa1e, 0x003645d4}}, Y: Field{[10]uint32{0x03678b4b, 0x0199c0a6, 0x03521c55, 0x036217ba, 0x00fbad38, 0x00596aff, 0x0236220d, 0x00a83366, 0x0065e959, 0x001644e3}}}, + {X: Field{[10]uint32{0x02d933dc, 0x01044a4d, 0x01068b47, 0x02e1ea57, 0x03ed74c5, 0x01d9b99d, 0x017f7b47, 0x02fb9974, 0x025f7c12, 0x001bfd60}}, Y: Field{[10]uint32{0x038c0edf, 0x0200920d, 0x0038131f, 0x02a10334, 0x002ea9ac, 0x034ae360, 0x004be0a4, 0x025d2c8c, 0x01de0cb7, 0x001986ba}}}, + {X: Field{[10]uint32{0x00b1c31d, 0x03ac4594, 0x035ab15c, 0x01aeeba1, 0x03956036, 0x030093de, 0x027d580a, 0x004190c1, 0x02b1a876, 0x003b5b2f}}, Y: Field{[10]uint32{0x0217dede, 0x01f59aa1, 0x03f4519a, 0x01dbc675, 0x011269c4, 0x000ba040, 0x024d60f7, 0x02270595, 0x007ed1e8, 0x0024501a}}}, + {X: Field{[10]uint32{0x03d69164, 0x02f812a2, 0x03ca443a, 0x01b8e190, 0x000853bf, 0x02c4c88c, 0x016b56ee, 0x016a8c42, 0x00eb32d7, 0x0017e333}}, Y: Field{[10]uint32{0x0195da3a, 0x0396df9e, 0x02d456bd, 0x03c08734, 0x024f6576, 0x013d60d2, 0x02ac0fac, 0x0077352d, 0x023dd0c8, 0x000d7dca}}}, + {X: Field{[10]uint32{0x002d0b7b, 0x029b88e6, 0x02f7c479, 0x018bc056, 0x0186580d, 0x03b599d4, 0x02896c67, 0x00e5dd48, 0x00859bb2, 0x00207808}}, Y: Field{[10]uint32{0x03fbb669, 0x036f1933, 0x019601eb, 0x00e38abe, 0x02fce84a, 0x017558ac, 0x02ddc088, 0x03c9bed0, 0x029e4159, 0x0021e47e}}}, + {X: Field{[10]uint32{0x01d8f721, 0x0109c4a5, 0x005f141d, 0x03a1eb2a, 0x003eb435, 0x018eeb72, 0x03aba7ad, 0x01709a6d, 0x0316dd1e, 0x0037889a}}, Y: Field{[10]uint32{0x02c8423a, 0x01591c06, 0x0120d841, 0x01a90d37, 0x03342841, 0x038cf644, 0x007dc03d, 0x039cb0fe, 0x0399fa2c, 0x0018b878}}}, + {X: Field{[10]uint32{0x03d140f3, 0x0282f765, 0x012b1d13, 0x02549f2f, 0x00fa7629, 0x03dffc59, 0x0058be59, 0x00ca57f4, 0x03423fcd, 0x0018291b}}, Y: Field{[10]uint32{0x037f1219, 0x034dc3b7, 0x02c8e0f4, 0x015332ff, 0x01912cb8, 0x0280f2ad, 0x02bc31e1, 0x02785f91, 0x02de7b78, 0x00255c74}}}, + {X: Field{[10]uint32{0x032249c0, 0x0227f2f0, 0x027f5ce0, 0x0164fd0a, 0x0080d7e7, 0x028318d9, 0x013a77ab, 0x02f647ef, 0x005ce1b4, 0x001bfbd1}}, Y: Field{[10]uint32{0x00fa347d, 0x00b17a7d, 0x01a919a9, 0x0361f532, 0x03f82e73, 0x01605e5b, 0x020cae2e, 0x036e0e6b, 0x00fbaf46, 0x000457ef}}}, + {X: Field{[10]uint32{0x0293522f, 0x01713f90, 0x02a30914, 0x01705120, 0x03a9892b, 0x03b7af95, 0x025f7c26, 0x03e54e8f, 0x011ca8d2, 0x001b4dfd}}, Y: Field{[10]uint32{0x015309af, 0x019fbba7, 0x03dda0a9, 0x016ea212, 0x00cbefae, 0x00ee4382, 0x026897cd, 0x02b52c37, 0x01f36718, 0x001e3944}}}, + {X: Field{[10]uint32{0x03d46098, 0x02c0d440, 0x02ceaa76, 0x0157f9d2, 0x02738aa1, 0x0376fa65, 0x01cb035e, 0x01c07d72, 0x00275bd0, 0x000302b2}}, Y: Field{[10]uint32{0x00e3cd97, 0x020c807e, 0x026b7c3e, 0x00c5a996, 0x0031d762, 0x003389a9, 0x01684906, 0x029c21aa, 0x022a188f, 0x0039fcca}}}, + {X: Field{[10]uint32{0x00cde108, 0x00481814, 0x02b935d0, 0x02352c95, 0x01822a64, 0x017ebd29, 0x00507df8, 0x01408c7f, 0x03a86f89, 0x00240036}}, Y: Field{[10]uint32{0x014ef3fd, 0x0360f2d9, 0x00ff1779, 0x0008bd63, 0x00323319, 0x03d32c0f, 0x018383c2, 0x03a7a2ef, 0x003694b2, 0x0026deba}}}, + {X: Field{[10]uint32{0x029098a1, 0x02ba35a5, 0x01d9a28a, 0x029d18f8, 0x01ad58de, 0x01b0a8b8, 0x02092532, 0x02f23cd9, 0x03f4b490, 0x003c4426}}, Y: Field{[10]uint32{0x012f24c5, 0x00014257, 0x030224a8, 0x030b0c96, 0x006e3382, 0x032305fb, 0x02305141, 0x00b04200, 0x02279fd7, 0x0021d0c6}}}, + {X: Field{[10]uint32{0x028c0003, 0x0372155b, 0x018b00d1, 0x02353db8, 0x03929adc, 0x01b587e0, 0x00aac8b3, 0x031bc231, 0x01e54e9c, 0x00137a1c}}, Y: Field{[10]uint32{0x00d3bba6, 0x021fc1dc, 0x029c7f01, 0x01c3a68f, 0x00805f4b, 0x027785af, 0x01d7fce1, 0x03a29b1d, 0x03cfca98, 0x00009747}}}, + {X: Field{[10]uint32{0x02766ece, 0x0004f618, 0x01c80b66, 0x019ff633, 0x008f47b4, 0x01384004, 0x02e89ff9, 0x00aefce9, 0x02759297, 0x00288f2d}}, Y: Field{[10]uint32{0x03cf548c, 0x016bae51, 0x01dc7cae, 0x0337f5fa, 0x03cbca18, 0x01f48eab, 0x02811267, 0x0308f685, 0x0384ed05, 0x002371c2}}}, + {X: Field{[10]uint32{0x004244e5, 0x00385256, 0x0032bbb4, 0x00e296df, 0x0179d3c9, 0x039c0f31, 0x03a9dd3b, 0x023e2e46, 0x00cce96d, 0x0000a574}}, Y: Field{[10]uint32{0x0303c926, 0x00fdfb8a, 0x02c95265, 0x02304ace, 0x02745e07, 0x014e2b97, 0x030fe376, 0x0352fdab, 0x0206a16b, 0x0029b516}}}, + {X: Field{[10]uint32{0x02babbce, 0x0009517b, 0x008af9e1, 0x0337bf49, 0x016cb40b, 0x03ef45da, 0x00b13d51, 0x01da9b50, 0x03919d53, 0x001f1a0e}}, Y: Field{[10]uint32{0x01fd3f73, 0x02c6b6ab, 0x02e39332, 0x0169f08e, 0x02197d4e, 0x0367c558, 0x03ed30b8, 0x0215bd6d, 0x01d03608, 0x000f6832}}}, + {X: Field{[10]uint32{0x000c3189, 0x039fbe07, 0x001ecdf5, 0x027b2a7d, 0x038505f3, 0x0388bb08, 0x020e21ff, 0x00926a57, 0x012ed27e, 0x000c3dd4}}, Y: Field{[10]uint32{0x00875169, 0x010790b9, 0x00164fad, 0x01fd5ba2, 0x039e4e7f, 0x02d1cc65, 0x01286514, 0x00e8e856, 0x005e25ea, 0x000bd7f6}}}, + {X: Field{[10]uint32{0x03514961, 0x03d69d8b, 0x00835431, 0x00bed244, 0x031c7f84, 0x02358c52, 0x00a41c77, 0x013c9cc9, 0x038c9658, 0x0024ddef}}, Y: Field{[10]uint32{0x01f3df42, 0x03f5b4da, 0x00ad4335, 0x00b4ea27, 0x003cfa89, 0x03b60c34, 0x017fe92a, 0x036cab9f, 0x0055e2ed, 0x00356673}}}, + {X: Field{[10]uint32{0x0131e9be, 0x0307555b, 0x00ca240a, 0x01e1affd, 0x0328a66e, 0x03e0f153, 0x03530b85, 0x001256e8, 0x03e867f2, 0x000d627f}}, Y: Field{[10]uint32{0x01224c89, 0x02a49d1b, 0x0385b581, 0x019e3f74, 0x00d75b3a, 0x03c4cf71, 0x01c22a89, 0x02278482, 0x02aa9830, 0x0026208b}}}, + {X: Field{[10]uint32{0x023f8935, 0x036e2e3a, 0x03f85999, 0x01e84754, 0x012c79e7, 0x03f31905, 0x00e0f841, 0x03713396, 0x01f4b2da, 0x000e706c}}, Y: Field{[10]uint32{0x00256721, 0x026aa135, 0x0131e628, 0x010985b3, 0x0350bb8a, 0x03fe76a0, 0x036991de, 0x00ce2590, 0x031ad9df, 0x0039e149}}}, + {X: Field{[10]uint32{0x0325be33, 0x03bb7b62, 0x0372cad5, 0x0368914e, 0x00b103f9, 0x02d84639, 0x00799188, 0x00b0b666, 0x0059d3d6, 0x00373c45}}, Y: Field{[10]uint32{0x03a1c074, 0x00f31cbc, 0x017b330a, 0x0323eb9f, 0x02a190f6, 0x031f7771, 0x01a92fe7, 0x01c398d1, 0x001aaf32, 0x003700e3}}}, + {X: Field{[10]uint32{0x02623d1d, 0x018d6cc1, 0x038f0eed, 0x0179bac8, 0x00a32ff0, 0x02f60143, 0x00d82e55, 0x02c304fd, 0x01dd1de9, 0x0018524a}}, Y: Field{[10]uint32{0x00d8a24b, 0x02a9d7b1, 0x02a6ae0e, 0x010c6b2f, 0x02afafdc, 0x020603fd, 0x0118e3be, 0x03c5ee86, 0x0117c9e7, 0x0002bfa1}}}, + {X: Field{[10]uint32{0x00ce743c, 0x006c2ea7, 0x00296a7c, 0x027ed66a, 0x03ef8160, 0x03b22b6f, 0x005da355, 0x036a5029, 0x0228cff6, 0x003d29c8}}, Y: Field{[10]uint32{0x019cdacb, 0x02a069b8, 0x01e50a25, 0x0094f328, 0x032fbcd0, 0x015a71af, 0x01e90f10, 0x016ab827, 0x00fbde09, 0x00151480}}}, + {X: Field{[10]uint32{0x022c93f7, 0x03f94903, 0x01a650b5, 0x0133f23f, 0x0357aa16, 0x00dc6e50, 0x0262fbf5, 0x01565d1b, 0x02736caa, 0x0018f310}}, Y: Field{[10]uint32{0x02ce5665, 0x011f1142, 0x004fe09b, 0x0139143c, 0x01e7d822, 0x012c20a2, 0x02d2bd30, 0x0104eb5a, 0x035bc5a6, 0x0007e93b}}}, + {X: Field{[10]uint32{0x02ab8889, 0x012f8ae3, 0x002016b8, 0x022659e3, 0x00aa7f9d, 0x00d172c1, 0x02cf761f, 0x00e29834, 0x02281184, 0x002b05d4}}, Y: Field{[10]uint32{0x024af2b1, 0x016a60aa, 0x03396343, 0x02266684, 0x00832f29, 0x03ddd97c, 0x02b01b68, 0x00f6b09e, 0x00ae2964, 0x00375f7e}}}, + {X: Field{[10]uint32{0x024a0e48, 0x01e205a7, 0x02c03dd6, 0x008bcde1, 0x03823e86, 0x00bbead6, 0x00a5a2f7, 0x0106d831, 0x02b9637c, 0x00276ed7}}, Y: Field{[10]uint32{0x03d924d7, 0x00e353ad, 0x025cd1ba, 0x001e2718, 0x0205aa01, 0x021466a8, 0x01cde34b, 0x03587d0b, 0x02ba13f4, 0x0001dcb5}}}, + {X: Field{[10]uint32{0x02f7dddc, 0x015cc70f, 0x02fb173d, 0x0266e30c, 0x004e88f5, 0x01683622, 0x015b5866, 0x0304d440, 0x01ddd2fc, 0x001c5c25}}, Y: Field{[10]uint32{0x024fa5af, 0x03f7ed1f, 0x0020e581, 0x01b74638, 0x03472732, 0x031ed902, 0x023da3f3, 0x01c2f3ec, 0x010952b4, 0x0007783c}}}, + {X: Field{[10]uint32{0x025872ca, 0x026a5909, 0x03b2a331, 0x01a0b336, 0x01a32c4a, 0x00535ba7, 0x01e3964c, 0x02c7a900, 0x00d3f829, 0x0016b08c}}, Y: Field{[10]uint32{0x01c026ea, 0x0373ebb2, 0x02e8151b, 0x0360c85e, 0x03423484, 0x00c67290, 0x0206a16e, 0x03d9af17, 0x03a627db, 0x003eb0f0}}}, + {X: Field{[10]uint32{0x038752ef, 0x01f3dd87, 0x00100857, 0x02854446, 0x01382496, 0x00b9d387, 0x0057537b, 0x03d05785, 0x02af0a39, 0x00349fb2}}, Y: Field{[10]uint32{0x01c6c037, 0x037e92dc, 0x03ae35dc, 0x0213eb38, 0x00d5938e, 0x010486da, 0x03d8eb60, 0x02bcc438, 0x036746cb, 0x003f1202}}}, + {X: Field{[10]uint32{0x02ac6cda, 0x007882fc, 0x00d6477f, 0x0064e822, 0x01703af6, 0x03eb6a31, 0x0387d539, 0x0266df13, 0x03ddf92d, 0x003821dd}}, Y: Field{[10]uint32{0x01ccfee9, 0x0169404a, 0x00070db0, 0x039fb6f7, 0x001202c4, 0x03384357, 0x016ecc53, 0x0062c93a, 0x008ac6cb, 0x0009693e}}}, + {X: Field{[10]uint32{0x019ba6ed, 0x0284601a, 0x00776753, 0x039a2015, 0x0363bbe3, 0x0225aae5, 0x02a6a138, 0x01603ef6, 0x02b7afe9, 0x00116b9e}}, Y: Field{[10]uint32{0x0156f322, 0x01b9aa28, 0x00ff16c4, 0x01f83fbf, 0x02502f79, 0x0365bd0f, 0x00d440e3, 0x0381b934, 0x03ed127f, 0x003706bd}}}, + {X: Field{[10]uint32{0x00d00590, 0x0387793d, 0x00045327, 0x00516007, 0x026ae265, 0x01a2d30b, 0x00f509a7, 0x00114ecf, 0x033b71c5, 0x003f4a32}}, Y: Field{[10]uint32{0x00e5a7b6, 0x01994617, 0x02159c26, 0x00ac95fd, 0x013298a2, 0x005d3388, 0x01081f08, 0x033d12a9, 0x03954867, 0x002c1a13}}}, + {X: Field{[10]uint32{0x001d850d, 0x02cc9807, 0x01d7a158, 0x0181d9c7, 0x03956816, 0x00ee7ee9, 0x015e4e22, 0x0127c286, 0x000dac6f, 0x003c89bc}}, Y: Field{[10]uint32{0x0109ef86, 0x01c6d968, 0x0150f10f, 0x0228da45, 0x01d823a0, 0x00661bfa, 0x0230e53a, 0x028e2ad1, 0x004f6925, 0x00341757}}}, + {X: Field{[10]uint32{0x020337a3, 0x0113a41d, 0x0340ff0e, 0x03b23271, 0x00a994e1, 0x02cc0e3e, 0x00e23a72, 0x0212021f, 0x0213a80d, 0x000f3185}}, Y: Field{[10]uint32{0x013c3956, 0x036ef6b3, 0x033f5a11, 0x00794a85, 0x0090377f, 0x0256ac04, 0x0221f09f, 0x00ebda50, 0x016a2409, 0x00211d3e}}}, + {X: Field{[10]uint32{0x0260e736, 0x036b3833, 0x02223e5c, 0x03572579, 0x02633e7e, 0x03d5f5a1, 0x03be2331, 0x025c4af4, 0x01898cd9, 0x001c87b3}}, Y: Field{[10]uint32{0x00ffd69f, 0x02b064a8, 0x028ad532, 0x0284bdd9, 0x0221dc34, 0x03b18cf1, 0x009450bf, 0x01f2b928, 0x00d86fc0, 0x000c74a5}}}, + {X: Field{[10]uint32{0x032eff38, 0x03f3fe8a, 0x03aa2db0, 0x00b03fea, 0x00d5b106, 0x03963ea3, 0x01862715, 0x0366c6c9, 0x02581144, 0x00372eb2}}, Y: Field{[10]uint32{0x01ec7d34, 0x00ec95c8, 0x00689e6d, 0x03986bce, 0x00708b53, 0x038b185d, 0x02fbdca5, 0x01b3fe43, 0x021d339f, 0x00273dd8}}}, + {X: Field{[10]uint32{0x01db8b92, 0x007ccdc5, 0x03878342, 0x02654a39, 0x02b9300b, 0x031e895b, 0x00919382, 0x03b0af39, 0x0293e649, 0x003b4c53}}, Y: Field{[10]uint32{0x00744a11, 0x01f772d8, 0x0318bc83, 0x01238f7e, 0x0153ea03, 0x007c5519, 0x0122355e, 0x03fbcb8a, 0x02af0229, 0x001c2a06}}}, + {X: Field{[10]uint32{0x01c036ee, 0x00dae30a, 0x01c09854, 0x02d8010a, 0x005f5c7e, 0x017d96ba, 0x02977689, 0x02f23466, 0x03cc7a59, 0x001af466}}, Y: Field{[10]uint32{0x00999090, 0x0109cd41, 0x0332c0bc, 0x039de2d5, 0x0131803c, 0x010d5171, 0x03ea28f8, 0x015a06f6, 0x01e3f4f6, 0x00144d1b}}}, + {X: Field{[10]uint32{0x003d9acf, 0x01f1ac75, 0x03e15577, 0x0101eb62, 0x03ebe9d6, 0x02f8222f, 0x00228bb5, 0x037ecd81, 0x02156ac8, 0x00267b47}}, Y: Field{[10]uint32{0x01d2c922, 0x024430c2, 0x03c61e19, 0x02683d11, 0x0169f57e, 0x01c90dab, 0x02a0ac04, 0x01332a03, 0x01a4478b, 0x001d6c56}}}, + {X: Field{[10]uint32{0x02452045, 0x03821dec, 0x0171cc7f, 0x030e30d8, 0x000f00c3, 0x000c0e5c, 0x02dd90fb, 0x0377c212, 0x038c793a, 0x000f859b}}, Y: Field{[10]uint32{0x015bbd59, 0x0086aa07, 0x038da019, 0x0209ee52, 0x019f07e3, 0x0269b31b, 0x0330f6fb, 0x00a997b0, 0x0263b0cd, 0x00245966}}}, + {X: Field{[10]uint32{0x036df936, 0x01567345, 0x03656cf8, 0x00c82107, 0x01a1b1a4, 0x01027427, 0x00d1b168, 0x017ce2fe, 0x02d9a3a9, 0x003f06ea}}, Y: Field{[10]uint32{0x008af43d, 0x0158fc68, 0x0263884a, 0x024486db, 0x02e0b4d7, 0x020ad6d3, 0x005f2489, 0x02e27541, 0x03bdb013, 0x000c7de9}}}, + {X: Field{[10]uint32{0x037ff340, 0x02a0673f, 0x0125a5a5, 0x010d3a72, 0x003bd318, 0x00ce1a21, 0x003c8795, 0x007b2b24, 0x013d4b37, 0x00202ceb}}, Y: Field{[10]uint32{0x012af178, 0x039336dc, 0x02bfdf20, 0x00a1cd1e, 0x010108ae, 0x0197eb1a, 0x03ed7d3b, 0x01b61319, 0x00bdaac9, 0x003ec72a}}}, + {X: Field{[10]uint32{0x00616af2, 0x0330b91a, 0x03422073, 0x012535c9, 0x0002a87d, 0x023bdeab, 0x02c6c364, 0x03dc9f5d, 0x01ab2901, 0x002eb419}}, Y: Field{[10]uint32{0x030a37ed, 0x00ca71d1, 0x01d92236, 0x00d04fc5, 0x02fa925a, 0x02ae8a5c, 0x01d69a2e, 0x03bab536, 0x010216b5, 0x002ba75e}}}, + {X: Field{[10]uint32{0x029b8fe7, 0x010d7e44, 0x03ca9bce, 0x023dfa06, 0x01a2fb75, 0x0321e079, 0x01beb99c, 0x00329a65, 0x02d90d70, 0x00347c11}}, Y: Field{[10]uint32{0x0111a4df, 0x00d16818, 0x01017fca, 0x0029195d, 0x033090fc, 0x0110cc50, 0x03167188, 0x0056bcd1, 0x025d7eb8, 0x0009d3b7}}}, + {X: Field{[10]uint32{0x03f0a22f, 0x02811e8c, 0x03ea1751, 0x01851ce9, 0x0299df17, 0x00a6a83d, 0x01ea798d, 0x02a02963, 0x0355e3dc, 0x0036d4d7}}, Y: Field{[10]uint32{0x0353ff6b, 0x014a2b56, 0x037cced3, 0x03591de8, 0x00e61b86, 0x039ea3c4, 0x013df837, 0x00ef2846, 0x015d931a, 0x0039f600}}}, + {X: Field{[10]uint32{0x00a42a80, 0x039a4703, 0x01d5082a, 0x03945933, 0x008635b7, 0x02693c61, 0x00b1a5db, 0x03c3ebe6, 0x0206a56e, 0x0036876e}}, Y: Field{[10]uint32{0x0210c9ff, 0x0238c4a8, 0x01508d92, 0x0196c85e, 0x008807e2, 0x0172d058, 0x00066210, 0x00c6f2ba, 0x003ca695, 0x0021aa0e}}}, + {X: Field{[10]uint32{0x01aa42e7, 0x03b0a282, 0x008aeff5, 0x01de6cd6, 0x033b176b, 0x01ed509d, 0x014f29ff, 0x0019b1f7, 0x02b4d980, 0x00099f09}}, Y: Field{[10]uint32{0x0027161d, 0x03c82d42, 0x0034142f, 0x0231fe8c, 0x01d58465, 0x0364f6aa, 0x02300531, 0x03ac9574, 0x003ff4e5, 0x000ce430}}}, + {X: Field{[10]uint32{0x01cbea0a, 0x0120fff0, 0x0027d4f3, 0x00a7fb97, 0x025561fd, 0x0021246a, 0x00c79152, 0x03e5541c, 0x03524e6f, 0x0020092b}}, Y: Field{[10]uint32{0x02dd86b0, 0x0075f2ec, 0x00a16dff, 0x01c5cd17, 0x03df7a8a, 0x00279dbf, 0x0078fc06, 0x01c9ac20, 0x00d0498f, 0x0032779e}}}, + {X: Field{[10]uint32{0x0208f661, 0x014d1158, 0x002d2779, 0x025501a2, 0x00dc3dc1, 0x01c73c00, 0x030d7dd3, 0x02d0801f, 0x0268c7be, 0x00047fda}}, Y: Field{[10]uint32{0x03b4092c, 0x0306f029, 0x03dbd658, 0x02ea5e9f, 0x03916b75, 0x007df8ee, 0x03cac25c, 0x0206d479, 0x00252547, 0x002d4f77}}}, + {X: Field{[10]uint32{0x02e3c929, 0x02309fcd, 0x011f6aa8, 0x025ac01d, 0x02b70d65, 0x016a660a, 0x0232d7a6, 0x02080ce6, 0x0083f9a6, 0x00158a84}}, Y: Field{[10]uint32{0x01e05b51, 0x0112b2ec, 0x03364557, 0x01854248, 0x0166ec20, 0x0042b5d0, 0x00e7d255, 0x02022e54, 0x007f0908, 0x0028e03b}}}, + {X: Field{[10]uint32{0x0341c413, 0x0020b8b4, 0x037af68d, 0x029533c1, 0x030e097f, 0x03bd915c, 0x02a75987, 0x0035a4ed, 0x00fd327c, 0x0013bf9c}}, Y: Field{[10]uint32{0x00ce3dc7, 0x02afbcb2, 0x0098a4a1, 0x0118233b, 0x00b110a3, 0x03b476c4, 0x028befc3, 0x02d8b766, 0x039b92e0, 0x0004351e}}}, + {X: Field{[10]uint32{0x03a51f20, 0x03027008, 0x0034ff9a, 0x0260b34c, 0x03354abd, 0x00780709, 0x028576c9, 0x00a2c2f7, 0x030cd7f1, 0x0013592f}}, Y: Field{[10]uint32{0x00a5e28f, 0x030cb97a, 0x00d6eb9d, 0x013cf532, 0x03da3c52, 0x0136f0b9, 0x03bf38e1, 0x037feb79, 0x001af57f, 0x0005679d}}}, + {X: Field{[10]uint32{0x00a187bf, 0x03cc2cc0, 0x0243bc48, 0x02b0dcab, 0x03466de2, 0x03bb3be8, 0x02f0064c, 0x01e35acf, 0x034aff32, 0x00269058}}, Y: Field{[10]uint32{0x02aeae2a, 0x01faa801, 0x03c3cad2, 0x00c3d014, 0x02f409e5, 0x01591262, 0x007a1936, 0x01df3e11, 0x020faebb, 0x0003bbfb}}}, + {X: Field{[10]uint32{0x0102418b, 0x0137b4a4, 0x014cf4fc, 0x03f39e09, 0x002c85cf, 0x039719dd, 0x02fec2d2, 0x03782023, 0x00fb9a6b, 0x00038601}}, Y: Field{[10]uint32{0x02fcdda7, 0x01aacd1f, 0x01e7bfa5, 0x030c60f3, 0x02447e93, 0x00e9996b, 0x03e81c9b, 0x0192e70b, 0x01eb9c16, 0x003a72ac}}}, + {X: Field{[10]uint32{0x00593212, 0x018bc6d9, 0x03b411eb, 0x03c097e7, 0x00717611, 0x03fd134b, 0x021705ad, 0x01ec2be0, 0x0344c024, 0x0002980d}}, Y: Field{[10]uint32{0x02603b61, 0x0066ee32, 0x01d9ce5c, 0x0056a5ae, 0x026dcdb0, 0x021c4ee6, 0x035c0a2f, 0x01d8e10c, 0x032b706a, 0x002083f4}}}, + {X: Field{[10]uint32{0x015f20b0, 0x01882812, 0x036cb66a, 0x02ceab89, 0x01a1108a, 0x03258193, 0x0172a2fe, 0x004a60d2, 0x01b6895b, 0x0029bc76}}, Y: Field{[10]uint32{0x01c8273c, 0x027550db, 0x0288029c, 0x03be0e81, 0x037f55d7, 0x0219e70f, 0x03f5ea81, 0x020e518f, 0x00d0df03, 0x0026a577}}}, + {X: Field{[10]uint32{0x01ac5c48, 0x02bc49b3, 0x0041893b, 0x03cef5d3, 0x02f09f30, 0x01b88850, 0x00f920ab, 0x00ad8f80, 0x00320782, 0x0012b145}}, Y: Field{[10]uint32{0x00f43885, 0x012f0c68, 0x02a6ad7e, 0x031dc83d, 0x027ff037, 0x025156ef, 0x03da161f, 0x01291917, 0x014877e9, 0x002afd74}}}, + {X: Field{[10]uint32{0x03fb7a9b, 0x02efdebd, 0x004752da, 0x00dccd81, 0x0248af6e, 0x02cce508, 0x02c588e1, 0x03ab9633, 0x015ba16e, 0x00168b3d}}, Y: Field{[10]uint32{0x029322e2, 0x00001039, 0x01c4fe0c, 0x007dc58f, 0x01a45f8c, 0x03795688, 0x005aeca5, 0x01cb353f, 0x022d32ff, 0x0023c9ef}}}, + {X: Field{[10]uint32{0x03011c99, 0x00acf636, 0x0388f023, 0x00f8c32c, 0x02a87605, 0x01bff13a, 0x0012b27f, 0x0307d810, 0x03e8ef48, 0x00385bc8}}, Y: Field{[10]uint32{0x00c56000, 0x030e43ee, 0x017990e8, 0x03a84d0a, 0x0247ffe3, 0x02f69853, 0x015bb977, 0x0297036a, 0x0152b0af, 0x000657ff}}}, + {X: Field{[10]uint32{0x0124fb84, 0x02f458e1, 0x0145ac1b, 0x00ebfe5a, 0x0228923a, 0x03761ba4, 0x01e4263c, 0x027dc543, 0x00d7ac10, 0x00194d9f}}, Y: Field{[10]uint32{0x0347d731, 0x020d2945, 0x006b68a7, 0x02541a02, 0x00a7687c, 0x03ad3fa3, 0x009b170b, 0x01f75934, 0x01bafbe6, 0x00033c2e}}}, + {X: Field{[10]uint32{0x03d6eac2, 0x03bcd99a, 0x00d54a5c, 0x02723a55, 0x0389da48, 0x01b75991, 0x004228bd, 0x00ee35e9, 0x000b3944, 0x00042a21}}, Y: Field{[10]uint32{0x0261eff2, 0x01f80d31, 0x00a60798, 0x01571384, 0x03d8cc40, 0x03dfeb44, 0x01163ace, 0x01637861, 0x036ee4aa, 0x001ffdbd}}}, + {X: Field{[10]uint32{0x0245d6a0, 0x02c4c9d4, 0x000e1528, 0x03aa46ba, 0x027b1db5, 0x0315dfc5, 0x039d0380, 0x020809ae, 0x00a6c01b, 0x000ffbfa}}, Y: Field{[10]uint32{0x03637b5e, 0x01630e8e, 0x02350ecd, 0x01e9f27f, 0x03a95975, 0x0275a3bf, 0x00a0b543, 0x00512915, 0x01a937e6, 0x002a5b7d}}}, + {X: Field{[10]uint32{0x00052b61, 0x02b68871, 0x00c626c3, 0x03575861, 0x0058595f, 0x01759534, 0x03fb908f, 0x018ba5af, 0x037c0e41, 0x003be4f5}}, Y: Field{[10]uint32{0x03cd0bf5, 0x03efd03c, 0x0066b953, 0x007db35d, 0x01e53526, 0x011745a7, 0x01a23a86, 0x025f1fd6, 0x0385c18d, 0x00100222}}}, + {X: Field{[10]uint32{0x00ca4872, 0x01ef60ac, 0x01d40d62, 0x0335466f, 0x009224a2, 0x025c6df1, 0x01edbd84, 0x0240f521, 0x035eb0fa, 0x003c5e27}}, Y: Field{[10]uint32{0x031a9da8, 0x000587e9, 0x028d0583, 0x0016b6aa, 0x019e36a9, 0x01ec7d28, 0x03570f47, 0x0115fa8b, 0x00b65456, 0x00132117}}}, + {X: Field{[10]uint32{0x009b3274, 0x03313533, 0x004bfff3, 0x02422a1c, 0x00641938, 0x0353907c, 0x000d15ba, 0x017b4083, 0x0388ebc7, 0x00342ec5}}, Y: Field{[10]uint32{0x022a7641, 0x02aeffc8, 0x022fd8f7, 0x0091137d, 0x0143ac55, 0x00199992, 0x02877963, 0x009fd239, 0x00a895a3, 0x000e8483}}}, + {X: Field{[10]uint32{0x00e8963a, 0x0337df37, 0x0005a3fa, 0x0186bae6, 0x022f05e4, 0x00844350, 0x02aab317, 0x01eb9935, 0x010cf780, 0x000592b0}}, Y: Field{[10]uint32{0x02549b69, 0x037166fa, 0x032093f9, 0x0098c07c, 0x009b6dca, 0x0127e63f, 0x01d6f858, 0x037642ec, 0x03d440f1, 0x002373d0}}}, + {X: Field{[10]uint32{0x001fbe5f, 0x01b1e0a5, 0x02e40987, 0x00a5ce68, 0x00cd3aca, 0x00a527c3, 0x017dcf89, 0x0038eae1, 0x0165a8e4, 0x003c48b6}}, Y: Field{[10]uint32{0x02447371, 0x03409a36, 0x02257f50, 0x01cb4863, 0x00715043, 0x02d9c2fb, 0x02192d0b, 0x02260de2, 0x039dd9e6, 0x00136652}}}, + {X: Field{[10]uint32{0x008870a8, 0x0050e939, 0x03829662, 0x008605b9, 0x01b975fc, 0x015e07c2, 0x02e2cdbf, 0x02a4a86b, 0x014775e5, 0x002b25c5}}, Y: Field{[10]uint32{0x03c9aa71, 0x010f1c50, 0x03edef89, 0x0373e2ef, 0x0253fff7, 0x01e3725e, 0x03679452, 0x005d0a59, 0x0203795b, 0x000927ed}}}, + {X: Field{[10]uint32{0x01330906, 0x0312174b, 0x03fbdd48, 0x01b8512c, 0x02fb0add, 0x03a721c3, 0x013da811, 0x03f73243, 0x011edfd5, 0x002567b2}}, Y: Field{[10]uint32{0x0257ebdc, 0x02428898, 0x024b9aed, 0x01d4a91c, 0x0229f489, 0x014d617f, 0x01b5ebc6, 0x031d86d8, 0x0128b707, 0x000797b0}}}, + {X: Field{[10]uint32{0x02982859, 0x02ea4f87, 0x028b7c59, 0x02348ed7, 0x003c6abd, 0x01b7827c, 0x03b2d157, 0x0208c915, 0x01d8ed7d, 0x001641e5}}, Y: Field{[10]uint32{0x00576708, 0x014a4b4d, 0x003c0683, 0x008ea760, 0x01a09cb1, 0x011ead0b, 0x0216490a, 0x02210583, 0x02861a3c, 0x0017b74a}}}, + {X: Field{[10]uint32{0x03e0ba9e, 0x005373a8, 0x02555897, 0x02d6fc6e, 0x0348fdb4, 0x032b4541, 0x02178535, 0x00916fb6, 0x03987439, 0x00314dca}}, Y: Field{[10]uint32{0x00bca987, 0x02266c58, 0x035a022e, 0x010e2d92, 0x00767afc, 0x01ada713, 0x01536a54, 0x036e300d, 0x03617159, 0x003e0b42}}}, + {X: Field{[10]uint32{0x035bd38a, 0x013e5b38, 0x01ee1653, 0x00a1f72f, 0x00101611, 0x00c3c9b1, 0x00d20166, 0x032f4fb2, 0x01fcae39, 0x003cf656}}, Y: Field{[10]uint32{0x009b3562, 0x00f3c5eb, 0x016ce160, 0x000fb42b, 0x03da586a, 0x03918051, 0x03e2f97f, 0x009e0cbf, 0x001f8760, 0x00387957}}}, + {X: Field{[10]uint32{0x037fad9e, 0x033b0b94, 0x02cf8dd5, 0x010fe2a4, 0x0103a280, 0x0226c193, 0x023d9604, 0x038de0af, 0x036ebe3c, 0x00248af1}}, Y: Field{[10]uint32{0x01122109, 0x0302657d, 0x02b54352, 0x016f440c, 0x00116fbf, 0x006a5486, 0x00b9ea75, 0x03bf688c, 0x03572508, 0x002cc667}}}, + {X: Field{[10]uint32{0x01f0360d, 0x00e1cd36, 0x00a1299a, 0x02236ebf, 0x022c461d, 0x001c2b32, 0x02b1df08, 0x00b255e6, 0x01407a6d, 0x001171f7}}, Y: Field{[10]uint32{0x03e85ac4, 0x01349799, 0x00e73264, 0x029a983a, 0x02d076eb, 0x03765bd2, 0x03c4e044, 0x01a7b5b0, 0x015b5f24, 0x000e85e1}}}, + {X: Field{[10]uint32{0x0159bacb, 0x038b49ae, 0x00d5b33e, 0x02787c24, 0x00f1af5c, 0x01104705, 0x0189a5b7, 0x02c028f7, 0x0198dfd4, 0x001908b6}}, Y: Field{[10]uint32{0x037a3bb7, 0x03df6240, 0x03a09cdb, 0x01f1c0ee, 0x03376f59, 0x01dbd6cf, 0x018cea22, 0x0062864f, 0x03344912, 0x00388d63}}}, + {X: Field{[10]uint32{0x00b0535c, 0x03320b31, 0x01a6f535, 0x033c14d9, 0x0295b1a3, 0x00afdb07, 0x00640f19, 0x01b45469, 0x02143319, 0x00238120}}, Y: Field{[10]uint32{0x017c34ce, 0x023bd43a, 0x00e65b63, 0x02562ea5, 0x00200121, 0x017d56a8, 0x0282ee53, 0x00b1567c, 0x033a1f65, 0x0035b4b5}}}, + {X: Field{[10]uint32{0x024a79bb, 0x001c27f9, 0x002c4a1c, 0x003c0575, 0x02b8a708, 0x0049184f, 0x025a9e17, 0x00bc3e28, 0x01a8b5eb, 0x00168acf}}, Y: Field{[10]uint32{0x0386e6b7, 0x01fc622f, 0x00cd4422, 0x0209ae09, 0x01a6435a, 0x03be7629, 0x0095f8e6, 0x02abf9b7, 0x011deb54, 0x00181f1e}}}, + {X: Field{[10]uint32{0x02cd7ccf, 0x034b573d, 0x0213e1a0, 0x0000f377, 0x01c5296e, 0x0082afd2, 0x00f3d912, 0x005299d4, 0x03a35cf6, 0x00050d61}}, Y: Field{[10]uint32{0x02a653d7, 0x00bcb7e1, 0x0201b662, 0x01f0ba0c, 0x0315f14c, 0x011b0d02, 0x021af490, 0x03162d26, 0x01fade6c, 0x00126f21}}}, + {X: Field{[10]uint32{0x00a93193, 0x006f8677, 0x031a3ac8, 0x01f3fc97, 0x01ba357b, 0x03276141, 0x032c4bc8, 0x031d330e, 0x00428737, 0x003c0203}}, Y: Field{[10]uint32{0x023951f1, 0x00970e52, 0x00f0b5cf, 0x0364b289, 0x001c6a5a, 0x01c09f47, 0x03cfe320, 0x019d29f5, 0x019f57bf, 0x002f7404}}}, + {X: Field{[10]uint32{0x01130034, 0x01235417, 0x009cef77, 0x02bab01d, 0x023e162d, 0x0175f109, 0x00b26b68, 0x03fbd0db, 0x0373e547, 0x0021deb8}}, Y: Field{[10]uint32{0x00dfcf5f, 0x03db7c35, 0x00a8e6f9, 0x0054cb97, 0x03e1275e, 0x03c9a328, 0x0156b798, 0x00d06bb6, 0x0095b750, 0x0007c2bd}}}, + {X: Field{[10]uint32{0x00e619d4, 0x03caae7a, 0x02ca0d1d, 0x00182dce, 0x03e55f07, 0x01a689cb, 0x016a0714, 0x03286232, 0x036f0635, 0x00290637}}, Y: Field{[10]uint32{0x02f754e3, 0x03ff3580, 0x00856525, 0x0061a52e, 0x002e7558, 0x0296d646, 0x0099a6da, 0x009383f9, 0x01bb5bbb, 0x000ac1b3}}}, + {X: Field{[10]uint32{0x02aedeab, 0x001d8de8, 0x029671d9, 0x00253ad4, 0x00114dc2, 0x0131ec2d, 0x02dce4f4, 0x02eb4897, 0x0174bb6f, 0x0013084f}}, Y: Field{[10]uint32{0x03970b51, 0x0037dce7, 0x01be0e48, 0x03ec81b1, 0x01402fb5, 0x022bea73, 0x012c7d54, 0x0170561d, 0x039fccc6, 0x001d06fb}}}, + {X: Field{[10]uint32{0x00deb13a, 0x02dc1588, 0x01bff0ec, 0x030eed33, 0x032cf93b, 0x02240046, 0x014073a4, 0x03946c6a, 0x02fd3f94, 0x0028de41}}, Y: Field{[10]uint32{0x00e6030a, 0x028b59cc, 0x02332f01, 0x0376252a, 0x008a8a16, 0x00cc52dc, 0x00d5e552, 0x026c7461, 0x00b1c14a, 0x001828ec}}}, + {X: Field{[10]uint32{0x01e72301, 0x013b1353, 0x0225c5e8, 0x02396e14, 0x02d6d652, 0x01aed194, 0x038ae3d2, 0x02bd4592, 0x02ed639e, 0x000b19df}}, Y: Field{[10]uint32{0x03ee832a, 0x006e7fc1, 0x0278eaca, 0x00c4ecb4, 0x005fe639, 0x02b01f09, 0x0389240c, 0x01f2e85f, 0x0006d3bb, 0x0037c393}}}, + {X: Field{[10]uint32{0x017e77b4, 0x0077d2df, 0x009395d6, 0x02c33eb2, 0x01684473, 0x02c07000, 0x035fc3c5, 0x01af940c, 0x0014eaf8, 0x002d547e}}, Y: Field{[10]uint32{0x0246664b, 0x026738c1, 0x00bb1bd3, 0x03984693, 0x038818b6, 0x012b879f, 0x033f923b, 0x0057e0c0, 0x03354697, 0x002a5e72}}}, + {X: Field{[10]uint32{0x01f45c39, 0x020851b7, 0x01984fba, 0x02a1d050, 0x012cd47b, 0x0037c31c, 0x0361ad74, 0x0013abc7, 0x03185c8c, 0x00263571}}, Y: Field{[10]uint32{0x00050804, 0x034ae928, 0x01bc5b36, 0x00b10a3d, 0x019d4a8e, 0x007b3aa2, 0x02f88f5f, 0x01fb083a, 0x01915c73, 0x002b2949}}}, + {X: Field{[10]uint32{0x00cefc7c, 0x008f8ae5, 0x03bc9a0b, 0x021bbe3e, 0x02ed1e13, 0x03ef3318, 0x00104854, 0x02d949a3, 0x02f7260f, 0x00145238}}, Y: Field{[10]uint32{0x03ca2500, 0x01c914a9, 0x016e1296, 0x00581f2a, 0x039e9b27, 0x0068236e, 0x024a8ccb, 0x0292616e, 0x012d35de, 0x00196d37}}}, + {X: Field{[10]uint32{0x020e753c, 0x03a44c63, 0x031daf91, 0x01f260b7, 0x00a08a22, 0x02fad145, 0x0240cccb, 0x019042e2, 0x01c18c9d, 0x0004b1a6}}, Y: Field{[10]uint32{0x032fcc99, 0x0008b624, 0x028e120b, 0x01a013b4, 0x004889e9, 0x00145ba2, 0x029a1975, 0x015c90d1, 0x004289b5, 0x001f654f}}}, + {X: Field{[10]uint32{0x020a8d20, 0x01a75204, 0x02c639dc, 0x01e540e6, 0x02134e44, 0x03aec8c4, 0x02ecac37, 0x010046cd, 0x03f8a773, 0x0013434f}}, Y: Field{[10]uint32{0x0144ec64, 0x025816c0, 0x02a57397, 0x00a7c2c3, 0x03960b3d, 0x025fc85c, 0x00f10261, 0x013180f1, 0x03a0e098, 0x003b7fc5}}}, + {X: Field{[10]uint32{0x0136e42d, 0x00941855, 0x03be4481, 0x036606a7, 0x03ccb069, 0x019a0cdb, 0x01b0985a, 0x01e9c6a4, 0x030b3e7b, 0x0033a42d}}, Y: Field{[10]uint32{0x01569000, 0x00e91e01, 0x01e672e6, 0x039915fc, 0x00d3af73, 0x021d581b, 0x00640ca2, 0x03ab5d49, 0x015612e0, 0x002337a7}}}, + {X: Field{[10]uint32{0x0163b2d8, 0x03124c41, 0x0297e360, 0x02c720ef, 0x00d197f5, 0x034bea42, 0x03bf9851, 0x021e7667, 0x03276bb1, 0x000a31e4}}, Y: Field{[10]uint32{0x00643868, 0x02125b3b, 0x010857c1, 0x00f8cf64, 0x03bc0f3e, 0x03873ef8, 0x02b10f6a, 0x02d5196d, 0x0240e2f3, 0x00322513}}}, + {X: Field{[10]uint32{0x03442443, 0x03fa94f9, 0x006659a1, 0x02021f4c, 0x03864d4c, 0x016dc1fc, 0x00c2b6b5, 0x033c0601, 0x01062413, 0x001b8b6b}}, Y: Field{[10]uint32{0x029430e0, 0x000d77c4, 0x01f7dc4c, 0x00a10d10, 0x02497bc0, 0x02703f8d, 0x021fba73, 0x01a450c2, 0x0064e05d, 0x0027699f}}}, + {X: Field{[10]uint32{0x004d20fe, 0x016dc923, 0x0254f871, 0x022248fb, 0x0119f261, 0x037d0dfe, 0x034d03df, 0x00e51b10, 0x02c80376, 0x002fbe52}}, Y: Field{[10]uint32{0x031e25db, 0x033b5500, 0x038aaee7, 0x01cf39f8, 0x02386484, 0x02578501, 0x0383032e, 0x007719be, 0x0134e5fc, 0x00348c91}}}, + {X: Field{[10]uint32{0x018e433d, 0x033b6be0, 0x01125918, 0x0190f517, 0x009b7d86, 0x003c994f, 0x0166a24c, 0x01707728, 0x0057f1b4, 0x0014d523}}, Y: Field{[10]uint32{0x010c3b44, 0x024e013c, 0x0240db6a, 0x0170f2b5, 0x01c36aec, 0x00c2c4ea, 0x01307e21, 0x001fe700, 0x0146f0c2, 0x003304e2}}}, + {X: Field{[10]uint32{0x00b5867e, 0x01bfd001, 0x0188f90f, 0x02aff51e, 0x012aee71, 0x022dc8fb, 0x00b0e09b, 0x0324053a, 0x03847f25, 0x001ff53d}}, Y: Field{[10]uint32{0x00a1bd9d, 0x0174899d, 0x0297641b, 0x0234dd7e, 0x0358eec1, 0x01b900b6, 0x0205805a, 0x004ab659, 0x02bc901f, 0x003ff0f7}}}, + {X: Field{[10]uint32{0x0397dd9d, 0x031e7e94, 0x003ccd3d, 0x03da72e2, 0x03d4251b, 0x036411bb, 0x0062424c, 0x0226d127, 0x027e4997, 0x001112a2}}, Y: Field{[10]uint32{0x03b30282, 0x03117936, 0x03f828f7, 0x0106fce4, 0x02abbe8e, 0x002355b0, 0x028c7757, 0x02c0802b, 0x003b3356, 0x0013317c}}}, + {X: Field{[10]uint32{0x0326bd8b, 0x0033aa15, 0x02bc1acb, 0x019e398a, 0x0204af8c, 0x0108071e, 0x0294bd0a, 0x01897481, 0x007784d8, 0x003fc172}}, Y: Field{[10]uint32{0x0196eeb3, 0x030b79ea, 0x012d906e, 0x028242f4, 0x02a55f6a, 0x02fa613b, 0x025a0b5c, 0x01894f3e, 0x00ce6ac2, 0x001f3c3a}}}, + {X: Field{[10]uint32{0x027e4ab2, 0x020ce6b7, 0x027c679b, 0x001223c2, 0x00e29f47, 0x00ff649d, 0x0094ea08, 0x006daf3a, 0x03ae6aa3, 0x00203f7d}}, Y: Field{[10]uint32{0x0152fb75, 0x01b9828e, 0x018fe3f4, 0x02fc2f79, 0x0249e066, 0x03515d71, 0x004a8b4b, 0x009d158d, 0x017b1696, 0x001df5cc}}}, + {X: Field{[10]uint32{0x01879214, 0x012bab50, 0x01589685, 0x01edfad2, 0x03ef2022, 0x0035dcb5, 0x0020a74f, 0x001f2b54, 0x00c810a3, 0x002b0e29}}, Y: Field{[10]uint32{0x035016ac, 0x034b3a87, 0x01213c7c, 0x02acd057, 0x00d75ecf, 0x00b88a7b, 0x02f77ca9, 0x01616105, 0x00bb3c67, 0x003d2713}}}, + {X: Field{[10]uint32{0x01f75514, 0x02445569, 0x036fea26, 0x00d77a6a, 0x013a90a4, 0x03d40bc6, 0x0162f408, 0x00098bf5, 0x02ddf1e1, 0x002cdcdb}}, Y: Field{[10]uint32{0x015a78c8, 0x020c15eb, 0x027514e4, 0x037995fb, 0x000eafa2, 0x02856b83, 0x01cb0682, 0x00d4f3c0, 0x03aff190, 0x0020633b}}}, + {X: Field{[10]uint32{0x010dc295, 0x00e2cccc, 0x0322f127, 0x03d73ed9, 0x03e698d4, 0x031aa16a, 0x03f6d5ea, 0x03045ad5, 0x0212d100, 0x0019b59f}}, Y: Field{[10]uint32{0x00a05dd3, 0x0097fa85, 0x0318fd4e, 0x0318cb5c, 0x02685fae, 0x026ef5fa, 0x0208ea70, 0x0269534d, 0x021f3a0c, 0x0027353e}}}, + {X: Field{[10]uint32{0x02b59043, 0x011c4d4f, 0x0333eb87, 0x01ae9ee6, 0x029fa10c, 0x01bb37c2, 0x02eb6514, 0x0392136a, 0x035f756a, 0x002e15b5}}, Y: Field{[10]uint32{0x01cb0a38, 0x0069f6e2, 0x004c4b04, 0x0071c9ca, 0x026566da, 0x037c91bc, 0x03a177d8, 0x0259252c, 0x02b12f24, 0x00172150}}}, + {X: Field{[10]uint32{0x01c47d27, 0x014a547e, 0x01548afc, 0x017ee165, 0x03c736b1, 0x01869950, 0x00142cd6, 0x008e4d16, 0x03d70320, 0x0001a0ef}}, Y: Field{[10]uint32{0x022de166, 0x018d045d, 0x01746b41, 0x028a3653, 0x02420387, 0x031a3365, 0x0029f84a, 0x037c9945, 0x0240f5db, 0x00243d4a}}}, + {X: Field{[10]uint32{0x032923c2, 0x003e2a46, 0x018963d0, 0x029fe25d, 0x0141ee1c, 0x00ce8250, 0x00959345, 0x0079944e, 0x01f0811e, 0x000bfaa8}}, Y: Field{[10]uint32{0x00499c1a, 0x00e843fa, 0x0202b07e, 0x0081f41b, 0x03690d18, 0x039bb87b, 0x03701c35, 0x03500575, 0x0176b884, 0x00277602}}}, + {X: Field{[10]uint32{0x0287cda4, 0x001ed608, 0x0009780e, 0x02a86a5a, 0x01847070, 0x01134833, 0x0365e9b1, 0x02ebcea5, 0x0137da9e, 0x0033994a}}, Y: Field{[10]uint32{0x001ba572, 0x00c87cc1, 0x01b6801b, 0x00dbade8, 0x00454e17, 0x0279eba1, 0x01db3782, 0x00b6f96a, 0x03fb5f15, 0x0030711b}}}, + {X: Field{[10]uint32{0x00976211, 0x017f9a1e, 0x008a84fd, 0x02dac137, 0x03556087, 0x01d42f71, 0x03f9738a, 0x018feeac, 0x03d91701, 0x00269a56}}, Y: Field{[10]uint32{0x02aeda70, 0x0273c48f, 0x03c27d0c, 0x00b5935a, 0x010dce26, 0x02521a36, 0x002b1332, 0x03361669, 0x01f375ac, 0x003d02e8}}}, + {X: Field{[10]uint32{0x0134ba44, 0x034c88ef, 0x00ec718c, 0x0285d55e, 0x035908b0, 0x03936930, 0x02bd6d09, 0x020fb2fe, 0x0368bd30, 0x00396eab}}, Y: Field{[10]uint32{0x03a27fb0, 0x03bee642, 0x03dbce4d, 0x011aa6be, 0x005feb7f, 0x028fa1a9, 0x0076d0ed, 0x030f0541, 0x01f0365c, 0x002ae194}}}, + {X: Field{[10]uint32{0x03e59cc7, 0x00ddb63f, 0x0104ce06, 0x0322fd8f, 0x03dd0c4d, 0x01fb87f6, 0x033530bb, 0x03f9df63, 0x02a2b507, 0x000b09b3}}, Y: Field{[10]uint32{0x0230d62e, 0x002da739, 0x0004a500, 0x030abbf0, 0x03c30a1c, 0x016114a5, 0x0367151b, 0x00fae6c2, 0x03af54d0, 0x002cd138}}}, + {X: Field{[10]uint32{0x00bbd0e4, 0x00527d72, 0x027a3c2a, 0x02701ff2, 0x024d5333, 0x0281f8bd, 0x01eadaf0, 0x00b98623, 0x039f52af, 0x001f19d4}}, Y: Field{[10]uint32{0x009067c9, 0x039cfa4c, 0x0303896e, 0x02f986d8, 0x03df7a2c, 0x01990bb1, 0x02cc97ec, 0x0244d813, 0x02fdc21c, 0x000fe61c}}}, + {X: Field{[10]uint32{0x02249574, 0x02b7072a, 0x01aab8f9, 0x013dd080, 0x00334561, 0x00769c72, 0x02e1d17e, 0x002f24ed, 0x012dec8b, 0x0012d777}}, Y: Field{[10]uint32{0x02c5460b, 0x02cdaa2a, 0x03d695df, 0x0155b957, 0x036e16e7, 0x00aa169a, 0x00d18b3d, 0x03bf6d0d, 0x02dcaa3e, 0x0033eb68}}}, + {X: Field{[10]uint32{0x00d80e4b, 0x02f0d6e2, 0x03e59216, 0x0200bac2, 0x00f9bb66, 0x01cea13e, 0x0266edb8, 0x0020d61a, 0x02f2ccfc, 0x0035dd70}}, Y: Field{[10]uint32{0x0053ddbb, 0x02ce933f, 0x01ea765b, 0x015e444d, 0x02ff56ca, 0x025902a1, 0x02aa0b51, 0x0088c73d, 0x01b7988a, 0x00322976}}}, + {X: Field{[10]uint32{0x00d9bb4a, 0x0200ea6f, 0x014dcd3c, 0x01ec0dab, 0x00b005b0, 0x00f70f69, 0x001d9844, 0x003e77ec, 0x03097881, 0x001c68f3}}, Y: Field{[10]uint32{0x03caaa55, 0x00c41002, 0x01f5a1ad, 0x01362627, 0x01bd4a3c, 0x0185eb55, 0x000c5b39, 0x00c06e59, 0x02217db0, 0x0022aae3}}}, + {X: Field{[10]uint32{0x011f53b7, 0x03a2ec66, 0x00d3fdde, 0x00160970, 0x02a82f7d, 0x035de3bd, 0x00596ae3, 0x025b9880, 0x005492b6, 0x002f1c68}}, Y: Field{[10]uint32{0x029a2a15, 0x02abd85c, 0x03b52b07, 0x00db9003, 0x00d11255, 0x018c2a42, 0x03744600, 0x02e362c4, 0x01259785, 0x00055e24}}}, + {X: Field{[10]uint32{0x00847abc, 0x0247193f, 0x01f7e6f8, 0x002f1ade, 0x00e8d94a, 0x003d8396, 0x001ec81a, 0x02ff73ee, 0x0119ee62, 0x00274882}}, Y: Field{[10]uint32{0x02d0c675, 0x002f1f9b, 0x02a16e53, 0x03229efe, 0x0075f3a7, 0x027d3a53, 0x03fe8865, 0x00f0ae37, 0x039b1a07, 0x0020524d}}}, + {X: Field{[10]uint32{0x03f33425, 0x0230cfbb, 0x016e5c6c, 0x006d38da, 0x00d25bff, 0x038eb565, 0x030c6c91, 0x02f4668c, 0x026ad30b, 0x0020da5d}}, Y: Field{[10]uint32{0x02e79e4a, 0x02562e5c, 0x008a4e4b, 0x0236185f, 0x038ed5d2, 0x0087df6b, 0x00970d9c, 0x015d7216, 0x0282b3f4, 0x00289fdd}}}, + {X: Field{[10]uint32{0x00542451, 0x02cba2c8, 0x00ab457d, 0x02b4735a, 0x03e91f51, 0x021fed09, 0x00d36b54, 0x03aaac6a, 0x00750e4a, 0x001389de}}, Y: Field{[10]uint32{0x026566e0, 0x014083a8, 0x0123e763, 0x0036a3e1, 0x02d138fd, 0x0054a951, 0x02bf1d2a, 0x012e07e5, 0x03655bbc, 0x0027ebbf}}}, + {X: Field{[10]uint32{0x01a0d2fa, 0x024408ce, 0x036b108b, 0x0306c84c, 0x01825046, 0x009816a4, 0x028d2027, 0x03ffcc39, 0x03b51b9d, 0x0009fe41}}, Y: Field{[10]uint32{0x012d4a15, 0x035ec301, 0x0068acbf, 0x0167ff10, 0x000105f4, 0x03571276, 0x004bf3dd, 0x00d803ee, 0x01c36cb1, 0x00045489}}}, + {X: Field{[10]uint32{0x02b1fab3, 0x010bbb55, 0x0281864b, 0x02a3cf35, 0x02ef0900, 0x007dc3c5, 0x03ff42d4, 0x01d3110d, 0x03206506, 0x001b67fa}}, Y: Field{[10]uint32{0x03a02065, 0x015d3483, 0x02444f60, 0x0000e6a8, 0x035f7f7b, 0x014ebe8e, 0x015f8576, 0x00f070b9, 0x03ecd82b, 0x0020b365}}}, + {X: Field{[10]uint32{0x0187bfac, 0x03cb3de0, 0x03558857, 0x02f4ef45, 0x01ecb9cd, 0x00a139ca, 0x01c3b363, 0x019a74d8, 0x02b43360, 0x00226074}}, Y: Field{[10]uint32{0x00d48498, 0x01b5e05c, 0x0245a3e8, 0x018db09d, 0x000216b2, 0x0053b357, 0x011bf736, 0x0174761e, 0x0327d5a4, 0x0006e6ba}}}, + {X: Field{[10]uint32{0x02e1d72e, 0x026169dc, 0x010ce9c5, 0x0215b4f0, 0x02816916, 0x01fa4b38, 0x0140d557, 0x0347f895, 0x0118e47a, 0x0021299d}}, Y: Field{[10]uint32{0x01631658, 0x0294d071, 0x03356dc8, 0x0389a67b, 0x0016ca04, 0x0312dcff, 0x0011777d, 0x00ba8b9b, 0x03af8507, 0x0034f2e4}}}, + {X: Field{[10]uint32{0x00a8c683, 0x030a346b, 0x03418d50, 0x0376e77e, 0x007e666c, 0x0196999d, 0x00111e2e, 0x033ddd43, 0x035672a6, 0x0034f999}}, Y: Field{[10]uint32{0x02556dd9, 0x027eb8e9, 0x023f0735, 0x016f7441, 0x034e2e81, 0x008cfe0f, 0x01aca5d8, 0x031b0ead, 0x00aa20e5, 0x001dddbb}}}, + {X: Field{[10]uint32{0x01b87bba, 0x00b6ce19, 0x03c4af7b, 0x02129a3b, 0x02522a76, 0x0394958f, 0x00e76b5e, 0x015a2201, 0x01ef71d4, 0x003b7a5f}}, Y: Field{[10]uint32{0x01ae702f, 0x01eda4bf, 0x03513758, 0x023eddfa, 0x0285bafb, 0x01d62a03, 0x02279f95, 0x0049d982, 0x020f0c9c, 0x0024b9b4}}}, + {X: Field{[10]uint32{0x02e8c871, 0x0282e73a, 0x006ed025, 0x021091eb, 0x036ff84f, 0x00c4b9c0, 0x03db3ae2, 0x01213b3d, 0x0142e000, 0x000cd678}}, Y: Field{[10]uint32{0x021cdf66, 0x019be774, 0x0377f871, 0x0024db90, 0x00d00ada, 0x00e76fca, 0x00c98bf7, 0x017e87ce, 0x01f23c84, 0x0019ec0e}}}, + {X: Field{[10]uint32{0x022b44a1, 0x018b1f84, 0x0158f8fd, 0x02bb3c36, 0x0196f675, 0x00245295, 0x014a3dc4, 0x000bf499, 0x01720c05, 0x0038342a}}, Y: Field{[10]uint32{0x036b0312, 0x01ef51d5, 0x021718db, 0x00b46c47, 0x033ee29e, 0x03684640, 0x03d916ed, 0x0169faef, 0x01bc3457, 0x00032fac}}}, + {X: Field{[10]uint32{0x01a4c987, 0x01f7e108, 0x02605939, 0x00676368, 0x014f3320, 0x007d757b, 0x0031ac7a, 0x01dc1190, 0x03675df7, 0x00142e24}}, Y: Field{[10]uint32{0x0292f293, 0x013ccd74, 0x01204cb0, 0x014cf67b, 0x0045c382, 0x01b5bfc3, 0x009c3f25, 0x0327ae82, 0x0181063e, 0x00311d97}}}, + {X: Field{[10]uint32{0x016d446a, 0x0390cb73, 0x0111391c, 0x02f9073a, 0x037f80cb, 0x03e3a048, 0x01e84e99, 0x017fdbc8, 0x018e6677, 0x0017718b}}, Y: Field{[10]uint32{0x0373a9c2, 0x01bac505, 0x01de99ad, 0x02fc497d, 0x00b020ca, 0x0058ff57, 0x021cdabd, 0x011695db, 0x037de270, 0x0012d15a}}}, + {X: Field{[10]uint32{0x02c10971, 0x0353e588, 0x01b03fdc, 0x01f88bbf, 0x004e56ba, 0x0241c430, 0x0232e187, 0x00611749, 0x038fc792, 0x0022e85d}}, Y: Field{[10]uint32{0x023e3854, 0x031ebd8f, 0x00c53f48, 0x03a23d06, 0x0048ffeb, 0x025c1c9a, 0x01d7d435, 0x025962ce, 0x00ffa835, 0x0007cc7f}}}, + {X: Field{[10]uint32{0x00db9fc7, 0x03681b02, 0x0294be7a, 0x00aeea2d, 0x02999a10, 0x02fe6042, 0x03ad055f, 0x029eef9a, 0x02147d1e, 0x0028e851}}, Y: Field{[10]uint32{0x006ac294, 0x01fab0e2, 0x03d57a69, 0x01ec69c9, 0x00b3bdb8, 0x014c7ff3, 0x00cd6eb3, 0x004a108f, 0x0331d432, 0x0032609d}}}, + {X: Field{[10]uint32{0x00af78f5, 0x03470bf8, 0x0328621a, 0x03d93637, 0x01f6ce1a, 0x00d9a0b1, 0x01671c44, 0x00d2ab20, 0x0047bd20, 0x0025882a}}, Y: Field{[10]uint32{0x01826e1c, 0x03855553, 0x01f0d099, 0x0017a256, 0x016168a2, 0x0055af37, 0x007e32f4, 0x037ffb2d, 0x0108a7e3, 0x0038731b}}}, + {X: Field{[10]uint32{0x0396016b, 0x03663881, 0x016eebc9, 0x01f16126, 0x0395b2c5, 0x012363ff, 0x00b6a52c, 0x01a9e4fc, 0x02a0aa7d, 0x00290361}}, Y: Field{[10]uint32{0x02351ea2, 0x03365402, 0x0087396e, 0x02d117d1, 0x00062911, 0x009585f6, 0x014c15cb, 0x0119b6b6, 0x00e2d453, 0x003b1535}}}, + {X: Field{[10]uint32{0x03484c80, 0x0241de6c, 0x02fbd5ed, 0x03a6e993, 0x037e5f40, 0x01d1661b, 0x0173b979, 0x009a295d, 0x01a6f60f, 0x001c7bcd}}, Y: Field{[10]uint32{0x038a1ba3, 0x0058ded3, 0x01669875, 0x00f2f91d, 0x0302f369, 0x03d69ab5, 0x037df7f6, 0x01642b15, 0x021e9ff3, 0x003aaffe}}}, + {X: Field{[10]uint32{0x00f68de2, 0x031db5e9, 0x0267486f, 0x02fbc40f, 0x005308ab, 0x017dc256, 0x01ffa52c, 0x028ecb92, 0x0008c742, 0x002ef469}}, Y: Field{[10]uint32{0x01246124, 0x002d86d7, 0x0079a2ac, 0x00201428, 0x01ee6e1e, 0x01cca116, 0x00fbe96c, 0x0384f86c, 0x03ec9d07, 0x00125072}}}, + {X: Field{[10]uint32{0x00ba9009, 0x03c7e7a1, 0x012ab433, 0x03fe5613, 0x03805d60, 0x00b226d7, 0x009c92ff, 0x01b7d4f8, 0x03389211, 0x0005a7af}}, Y: Field{[10]uint32{0x03c6228d, 0x000d6641, 0x02a08345, 0x01247a4c, 0x02c997d1, 0x03c77923, 0x01b5adeb, 0x01fb8560, 0x0116e766, 0x002453d5}}}, + {X: Field{[10]uint32{0x00666acc, 0x01d40b3e, 0x020c3977, 0x02781313, 0x01d71c8d, 0x02436391, 0x00115458, 0x031fefab, 0x02bc4c5e, 0x0023c55e}}, Y: Field{[10]uint32{0x03f25908, 0x00604e0f, 0x021bc635, 0x0026260b, 0x02014dc7, 0x000af28f, 0x019883e6, 0x02a7ee62, 0x02ba1e78, 0x0035055d}}}, + {X: Field{[10]uint32{0x00ec9a8d, 0x03632d6d, 0x0010091e, 0x024e53ee, 0x0284f71f, 0x026801b6, 0x00ebcd83, 0x009b7001, 0x00d5694b, 0x002334ce}}, Y: Field{[10]uint32{0x00002578, 0x03b34874, 0x03d952a6, 0x00d30809, 0x0303fd9d, 0x015192ac, 0x000eccf4, 0x0366e702, 0x0010dd88, 0x00100c63}}}, + {X: Field{[10]uint32{0x013272f2, 0x003b8f8a, 0x02e28cbf, 0x030a5224, 0x03a64748, 0x012b5d83, 0x036171af, 0x02e8a834, 0x022f7ba5, 0x0008391f}}, Y: Field{[10]uint32{0x03be00bd, 0x00549519, 0x020a771b, 0x03e1db1c, 0x03162dda, 0x02279099, 0x00520897, 0x02608570, 0x022056b8, 0x002e5ab4}}}, + {X: Field{[10]uint32{0x032bb880, 0x032d7997, 0x015793f3, 0x031bfefc, 0x02f9c31e, 0x03d0477b, 0x02942d11, 0x023e736d, 0x00a5a0d3, 0x00160bb6}}, Y: Field{[10]uint32{0x03ce8486, 0x03d1e580, 0x02352a4c, 0x0248d29b, 0x02948ea8, 0x012ebd2f, 0x00a8db56, 0x0274f7b1, 0x000e4f9d, 0x000524a3}}}, + {X: Field{[10]uint32{0x001896d6, 0x03ac6d18, 0x01e7b877, 0x022db47d, 0x03b0bcab, 0x023011ba, 0x03daf30b, 0x030474fd, 0x019a6e76, 0x003d29bd}}, Y: Field{[10]uint32{0x0070f0c5, 0x0229922c, 0x01abeedc, 0x010792f6, 0x01ccde46, 0x026c5239, 0x01a05d4a, 0x01055956, 0x02e9e5d8, 0x000b4e71}}}, + {X: Field{[10]uint32{0x00957b24, 0x00a6bdcc, 0x0252d2c3, 0x02e31d8e, 0x02fc8564, 0x01588fc1, 0x0266bf01, 0x033d71db, 0x00600f71, 0x000aa083}}, Y: Field{[10]uint32{0x03ff3ca2, 0x0249919d, 0x02d370fd, 0x01f6e655, 0x0236f77f, 0x01401e34, 0x009a1d72, 0x0256679b, 0x0303d742, 0x002ce301}}}, + {X: Field{[10]uint32{0x02e2799e, 0x00612281, 0x03872623, 0x00ef075f, 0x0133634d, 0x001de8ea, 0x01d48026, 0x02fd921c, 0x004e9fcc, 0x00230b67}}, Y: Field{[10]uint32{0x01351a7d, 0x0152162a, 0x02db8d59, 0x01dd8130, 0x03cf032d, 0x02026169, 0x009c534e, 0x02edb631, 0x036cae43, 0x002b5404}}}, + {X: Field{[10]uint32{0x00061ba9, 0x003466dd, 0x004906eb, 0x017eb7f1, 0x03db00d2, 0x00e49d64, 0x00b991e2, 0x02cfb434, 0x00530744, 0x002c63a4}}, Y: Field{[10]uint32{0x033877b6, 0x03faa4ac, 0x002a702f, 0x02e1108c, 0x0343a8aa, 0x02600d34, 0x01edd739, 0x02cb19dc, 0x0244c829, 0x00243d72}}}, + {X: Field{[10]uint32{0x00e835be, 0x01e37347, 0x00109330, 0x01f3d2b1, 0x01d12482, 0x0314efe8, 0x01d2f58c, 0x010d6e41, 0x0157b03d, 0x00033c74}}, Y: Field{[10]uint32{0x0271b459, 0x01b65672, 0x031ab119, 0x037d87ba, 0x003ea656, 0x01147359, 0x0303cf21, 0x031f5a83, 0x01a15547, 0x003b8dea}}}, + {X: Field{[10]uint32{0x014a6007, 0x0358fdf9, 0x004c1562, 0x0347c8be, 0x0192fc13, 0x01bd2f39, 0x021ac36a, 0x02103ecb, 0x018ad91a, 0x002362e7}}, Y: Field{[10]uint32{0x03842dba, 0x006d1ac2, 0x02ee1ce6, 0x03851f39, 0x01ee9227, 0x00e6af7b, 0x020ec3b4, 0x023cb76b, 0x024393ca, 0x00254a2f}}}, + {X: Field{[10]uint32{0x0087fc9d, 0x006d18ff, 0x0106f256, 0x02387569, 0x037ae04a, 0x00366932, 0x02c936fb, 0x02c355c5, 0x0144bbc5, 0x001812d5}}, Y: Field{[10]uint32{0x016ac8eb, 0x00649528, 0x01d8a3e3, 0x01bc41a8, 0x03ee3cde, 0x034f67b6, 0x001e5fe7, 0x029b9d07, 0x039c4fb9, 0x000cff8b}}}, + {X: Field{[10]uint32{0x03aed8f6, 0x030245be, 0x03e5309e, 0x0191e567, 0x02cbd16d, 0x02785328, 0x017aab74, 0x03b91181, 0x00141058, 0x000f9fb5}}, Y: Field{[10]uint32{0x012e79fc, 0x00915a25, 0x006481ba, 0x01860bc6, 0x01f66bd3, 0x00280574, 0x01aa6971, 0x031b8324, 0x024186de, 0x003f056c}}}, + {X: Field{[10]uint32{0x0143f326, 0x034149de, 0x00f26736, 0x01a531a7, 0x0126e46f, 0x01b3d0b0, 0x01242431, 0x01ee2b25, 0x003586c1, 0x00342b9d}}, Y: Field{[10]uint32{0x034e0757, 0x007386fd, 0x0304b197, 0x00fa2ed7, 0x00fbaca0, 0x02fdada7, 0x0398865a, 0x01622b50, 0x01e8b983, 0x002fe80b}}}, + {X: Field{[10]uint32{0x00be1441, 0x0147ae62, 0x0197f5f8, 0x01967781, 0x023627bc, 0x014e02b7, 0x02ce2f94, 0x010f8df9, 0x01ced4f3, 0x003bd701}}, Y: Field{[10]uint32{0x00103281, 0x0031865d, 0x036350d6, 0x030ab527, 0x01b681e7, 0x012ba388, 0x010e40b7, 0x03c678ef, 0x001b0379, 0x0036499f}}}, + {X: Field{[10]uint32{0x008f49ae, 0x01921917, 0x038ca8dc, 0x01971efc, 0x03d7cf42, 0x02c2766b, 0x033015c3, 0x022b65f1, 0x03ebd799, 0x0005dae3}}, Y: Field{[10]uint32{0x0122f1b4, 0x0086fce1, 0x034c5fc8, 0x017a8053, 0x017f989f, 0x019db1e0, 0x00da1905, 0x03268da7, 0x024c8267, 0x002d2f2f}}}, + {X: Field{[10]uint32{0x0116c3dd, 0x00e9d9af, 0x03a0097b, 0x0374d50b, 0x03b20771, 0x02db698b, 0x0358d69f, 0x03053bae, 0x03db0cff, 0x00223da0}}, Y: Field{[10]uint32{0x011cb601, 0x03fdc607, 0x02219f52, 0x025aca5c, 0x020cf800, 0x0094add3, 0x02797ca0, 0x000f1499, 0x03de8121, 0x0002efbc}}}, + {X: Field{[10]uint32{0x0237abaa, 0x03f88e3d, 0x00854dd1, 0x0208c7ee, 0x018488b0, 0x00f59e24, 0x00c4121c, 0x03b113f6, 0x038f1247, 0x00299750}}, Y: Field{[10]uint32{0x023f36a3, 0x012a0be6, 0x00986d4d, 0x0257743f, 0x034bb500, 0x0131dc6b, 0x01cf3c0b, 0x010cff7f, 0x004e551e, 0x0017d972}}}, + {X: Field{[10]uint32{0x0398cc27, 0x0169a818, 0x03d2ff6a, 0x02e40a20, 0x02d5cdda, 0x03c565f1, 0x0208148a, 0x022edfdf, 0x0251c502, 0x002f5a9f}}, Y: Field{[10]uint32{0x0059d885, 0x02dc3d9e, 0x02f662dd, 0x01369dbb, 0x030c1ed1, 0x026a63a4, 0x0397979b, 0x03748ba2, 0x00c4247c, 0x000fc8a0}}}, + {X: Field{[10]uint32{0x009d274b, 0x00468264, 0x02202344, 0x02b1d34d, 0x0158f7a3, 0x01440514, 0x031814ec, 0x02837152, 0x036c2896, 0x00299c90}}, Y: Field{[10]uint32{0x03c2ec3f, 0x03f3b3af, 0x02654a7a, 0x02765590, 0x02c81f3d, 0x02b6b795, 0x02acea6b, 0x01e3656e, 0x02934681, 0x0037ba00}}}, + {X: Field{[10]uint32{0x003a24b0, 0x0380de7c, 0x004bc8d9, 0x02a4c844, 0x0257891b, 0x01f4b6a9, 0x01b0993d, 0x03433c6b, 0x01fed3a1, 0x003283d5}}, Y: Field{[10]uint32{0x023cfa6f, 0x010f9bd6, 0x0399db58, 0x020e59c4, 0x03520166, 0x02f2a363, 0x0188baae, 0x00b73645, 0x00e46346, 0x0037006e}}}, + {X: Field{[10]uint32{0x036429a1, 0x03c2d712, 0x034ccb91, 0x029fa831, 0x02211843, 0x02cbf881, 0x004961cc, 0x00087815, 0x008d9bff, 0x001843fc}}, Y: Field{[10]uint32{0x01d46b28, 0x01d82fb4, 0x020dd9b0, 0x00d8d7c5, 0x02d889bc, 0x03f34f84, 0x03daee68, 0x017e9f6a, 0x018aee96, 0x0012f8ec}}}, + {X: Field{[10]uint32{0x01ff42ae, 0x03318e2a, 0x0162238f, 0x032588b7, 0x026b695d, 0x037e3c28, 0x00f006cd, 0x03b32de3, 0x0215a70a, 0x000b5be0}}, Y: Field{[10]uint32{0x01a3927b, 0x011521e5, 0x010fd3ff, 0x005491b1, 0x037a9887, 0x03543ccd, 0x01e4e5be, 0x0325a798, 0x0164e2a3, 0x0000ff02}}}, + {X: Field{[10]uint32{0x00a1bbbb, 0x00318c22, 0x004ea70b, 0x009a90bf, 0x02998468, 0x0386826b, 0x010b132d, 0x00e716d8, 0x01b4868e, 0x002303a6}}, Y: Field{[10]uint32{0x001cfe52, 0x01314d85, 0x01a95c38, 0x00b821e1, 0x036ead99, 0x0186e305, 0x036a41de, 0x01032ca1, 0x0242f0a2, 0x000cae32}}}, + {X: Field{[10]uint32{0x03c96ed7, 0x0327ac23, 0x007e4dba, 0x007596be, 0x03658c6d, 0x013bdb5d, 0x0062af77, 0x02b9d78c, 0x028f9000, 0x00054a2e}}, Y: Field{[10]uint32{0x013b5651, 0x03b29914, 0x0253a5fa, 0x03571cc6, 0x012d39f0, 0x01d4ea2f, 0x00e64665, 0x01af3475, 0x038d54df, 0x002a3749}}}, + {X: Field{[10]uint32{0x03f1d7a4, 0x027bde9b, 0x037d2fa0, 0x02feb16b, 0x00104394, 0x02545616, 0x03a040e2, 0x01a9ebc4, 0x02a5d925, 0x0030519b}}, Y: Field{[10]uint32{0x01be5128, 0x0115ec9d, 0x00a7bc05, 0x02db8414, 0x00d8bab3, 0x01800f7c, 0x0284b540, 0x0361e7c1, 0x02c6fb36, 0x0032adbf}}}, + {X: Field{[10]uint32{0x03e98cb4, 0x004604b4, 0x02b56c6f, 0x02ea1e9d, 0x022ea946, 0x03e430fc, 0x0297a87c, 0x002274a8, 0x0093e051, 0x0033a2ec}}, Y: Field{[10]uint32{0x003a0470, 0x014ba578, 0x028884c2, 0x02b642c3, 0x00679cbc, 0x0344eeab, 0x03f556fb, 0x0213f9b7, 0x0251b906, 0x002a36ee}}}, + {X: Field{[10]uint32{0x02d6c86d, 0x01960b81, 0x016ea918, 0x018e85ea, 0x027c4267, 0x0024aa53, 0x030ddd9b, 0x02785634, 0x02737c9d, 0x0001dbce}}, Y: Field{[10]uint32{0x01d16c8a, 0x00a808b9, 0x00443b20, 0x00081f90, 0x01b29c53, 0x01b38fc1, 0x00ad27ec, 0x0179b1de, 0x007c4f34, 0x0016c728}}}, + {X: Field{[10]uint32{0x0274017f, 0x015cb542, 0x001adee1, 0x03fabdda, 0x032ed997, 0x0375f50e, 0x03988725, 0x002c84ee, 0x03c32339, 0x003dd5f7}}, Y: Field{[10]uint32{0x01b83cf8, 0x034912e9, 0x016be461, 0x019f2869, 0x0374ec4f, 0x023ace55, 0x00b63d98, 0x025c99c0, 0x00ea6787, 0x00342d39}}}, + {X: Field{[10]uint32{0x02d5f5d0, 0x00aa1ee7, 0x0065c149, 0x01a43647, 0x03f27a57, 0x036f8f19, 0x000ec6d3, 0x02bbf7c2, 0x0198a2de, 0x00166fd8}}, Y: Field{[10]uint32{0x0010f8b2, 0x00f5c3e1, 0x029b3a2f, 0x03b58054, 0x016e02f2, 0x03519e15, 0x010834c4, 0x028a08c4, 0x03399011, 0x002fd7ad}}}, + {X: Field{[10]uint32{0x0149ba16, 0x02020b81, 0x0052d53f, 0x0173c4b3, 0x02a7b0e8, 0x02463056, 0x02857900, 0x021d5d21, 0x030ac86d, 0x002c740b}}, Y: Field{[10]uint32{0x031a19d0, 0x00dff095, 0x0106b854, 0x00965b4f, 0x03972977, 0x00fce14a, 0x000878d6, 0x01adda2a, 0x02039992, 0x0001e497}}}, + {X: Field{[10]uint32{0x001d1905, 0x0393900e, 0x02908882, 0x03bc53ce, 0x027e5267, 0x01f10610, 0x03d2ec12, 0x0381f406, 0x032f41d8, 0x003349cd}}, Y: Field{[10]uint32{0x01c77297, 0x02bc3257, 0x003522ac, 0x005d4826, 0x02c33296, 0x01045a4e, 0x03810f3b, 0x027ccf33, 0x0203661b, 0x003338db}}}, + {X: Field{[10]uint32{0x019d3ace, 0x036d26f7, 0x01695b01, 0x033eef20, 0x03ad2258, 0x032eaad3, 0x028940f5, 0x00d664ed, 0x00fc26ca, 0x00044991}}, Y: Field{[10]uint32{0x01c0bf60, 0x01341245, 0x01b904e7, 0x00acefa7, 0x037ff136, 0x03b7c274, 0x03a49b3b, 0x02e57cbd, 0x03907b5a, 0x0021a17d}}}, + {X: Field{[10]uint32{0x0197d3ce, 0x001b8b03, 0x018bb3a6, 0x03abae12, 0x0192fb51, 0x00d68936, 0x02845759, 0x01285883, 0x032a99ce, 0x0024637d}}, Y: Field{[10]uint32{0x038a8461, 0x0333faee, 0x03065602, 0x00609d26, 0x01bb6b79, 0x0241e533, 0x038b0d3c, 0x03fe63c6, 0x01ec9ebb, 0x00222cce}}}, + {X: Field{[10]uint32{0x00dcb83b, 0x02b3eaff, 0x01af2a7d, 0x0093cd28, 0x00436e64, 0x035229dc, 0x0025b510, 0x03ff2025, 0x00f265c4, 0x0026e3c6}}, Y: Field{[10]uint32{0x0185ba55, 0x0152a6b5, 0x012475e4, 0x03e4fd8f, 0x01476c4a, 0x0318a04e, 0x02e8c78f, 0x0306e4b0, 0x01e86a34, 0x0002fee5}}}, + {X: Field{[10]uint32{0x0024ce30, 0x031e3fef, 0x0340c9b9, 0x002b62cc, 0x00382174, 0x03a87639, 0x02be52a1, 0x0189a90a, 0x032ac396, 0x0002b40b}}, Y: Field{[10]uint32{0x022885fb, 0x030b41c6, 0x01b13255, 0x03978953, 0x03ad8c97, 0x02deede9, 0x0027cfe1, 0x01e1cbfe, 0x00e6cf8a, 0x003f31ce}}}, + {X: Field{[10]uint32{0x026d85a3, 0x03ee6b76, 0x0076c84b, 0x00a23d51, 0x029b5c19, 0x016b3c49, 0x02e34f3f, 0x036b2423, 0x03bd5e60, 0x0000d66b}}, Y: Field{[10]uint32{0x03088955, 0x0055e7ec, 0x030f6b50, 0x00da8608, 0x03443586, 0x024cb385, 0x02721553, 0x03fb59c4, 0x01e79cd3, 0x000b8aa8}}}, + {X: Field{[10]uint32{0x00b279de, 0x0024459a, 0x033ca55e, 0x03008187, 0x030c3c15, 0x0335b1e3, 0x00c34a31, 0x00bc7384, 0x023e230f, 0x00158e6a}}, Y: Field{[10]uint32{0x0111bef1, 0x01b0bb2d, 0x0309c8ed, 0x006c1189, 0x02e3a7d5, 0x02a7a0f8, 0x023bc263, 0x01fc2cfe, 0x015c15de, 0x00382dba}}}, + {X: Field{[10]uint32{0x0269ec44, 0x015d94b5, 0x00e4ad86, 0x01b2b50b, 0x03693d3b, 0x0097bf0a, 0x00ef3d0c, 0x02567617, 0x03cc7b2f, 0x000c273f}}, Y: Field{[10]uint32{0x0150077d, 0x02596dea, 0x0274bcf7, 0x0299e664, 0x0232f949, 0x01487548, 0x00095205, 0x02c6f9e6, 0x022fd917, 0x0000eaed}}}, + {X: Field{[10]uint32{0x033b86b2, 0x006bdb94, 0x033cace9, 0x01a922af, 0x00534a02, 0x01d7244c, 0x018eab63, 0x035f0017, 0x01d2dac1, 0x00147cf5}}, Y: Field{[10]uint32{0x03e99f74, 0x0262a3e8, 0x0235aba9, 0x00aab410, 0x0234f9cf, 0x02816f76, 0x03fbfe0c, 0x0123b67c, 0x027f4bdc, 0x000142c7}}}, + {X: Field{[10]uint32{0x01c2a244, 0x03897b8a, 0x00e1fa3f, 0x03d22cf9, 0x034158b0, 0x014074c9, 0x000e0c6f, 0x01040115, 0x011833aa, 0x0023d58f}}, Y: Field{[10]uint32{0x03432193, 0x01d64a19, 0x03589028, 0x024f0600, 0x033d031d, 0x0004a263, 0x035248da, 0x00cdc55f, 0x01d85ea9, 0x0013531c}}}, + {X: Field{[10]uint32{0x037177a9, 0x031cb229, 0x01108ee7, 0x0303b867, 0x003c4853, 0x02c25ab0, 0x0045b39f, 0x036ae72f, 0x0109d68f, 0x000db28a}}, Y: Field{[10]uint32{0x024301b0, 0x00588234, 0x02ed6905, 0x018cc384, 0x0269cbf3, 0x00519e97, 0x033d0953, 0x00a58217, 0x01dfc825, 0x00193d44}}}, + {X: Field{[10]uint32{0x02a306e0, 0x00d1c0a3, 0x00cf3807, 0x023ad35c, 0x0358dd91, 0x036c9bc3, 0x001ca9c2, 0x03f5f308, 0x00d51f3f, 0x003d8a2e}}, Y: Field{[10]uint32{0x00adc2e8, 0x00d82ef6, 0x01c1ea2d, 0x01f798ca, 0x03b7c2d7, 0x03d55f7b, 0x00d6eb27, 0x00ba6cba, 0x00e30ea8, 0x0002f5af}}}, + {X: Field{[10]uint32{0x00e67c1b, 0x010454b0, 0x02f2586e, 0x035d8400, 0x00b44fa7, 0x0340d435, 0x026922c9, 0x00b02eca, 0x03f500a8, 0x003ede9a}}, Y: Field{[10]uint32{0x02702da1, 0x017af252, 0x02cfb034, 0x00cc8e86, 0x018419fc, 0x03fa3cfa, 0x01f1406e, 0x031c0c00, 0x0037f1c9, 0x00304a87}}}, + {X: Field{[10]uint32{0x0278d092, 0x0247ef3f, 0x03033753, 0x00769696, 0x01bf8ec0, 0x0003231d, 0x014080f4, 0x00abcb7c, 0x01195c3e, 0x00308246}}, Y: Field{[10]uint32{0x031adeb9, 0x01ad8c83, 0x01e6c382, 0x0063a203, 0x037aec38, 0x02d9b0c9, 0x007b1fa3, 0x036acfbe, 0x016fcbeb, 0x002cc1ed}}}, + {X: Field{[10]uint32{0x013192d1, 0x02ff8a2f, 0x0003e8d1, 0x03e3466f, 0x0073c3be, 0x00ddd292, 0x02d7c4c9, 0x009fea81, 0x03893d17, 0x001d89f7}}, Y: Field{[10]uint32{0x028451e1, 0x01c9ac6d, 0x026f4bcf, 0x033fdb4d, 0x021326da, 0x001ddb14, 0x029a865f, 0x0157dea8, 0x036c36f4, 0x000d7499}}}, + {X: Field{[10]uint32{0x002c62b9, 0x012ca580, 0x01639ed5, 0x01cf2c16, 0x01a3df6f, 0x036ff80d, 0x025df658, 0x00cea5b4, 0x01187c9f, 0x00099999}}, Y: Field{[10]uint32{0x0286630d, 0x00096931, 0x037ba468, 0x02bbd2a5, 0x02c4e7fc, 0x00d5aa1d, 0x01fe7578, 0x01789a94, 0x03c7d34a, 0x002ecc2e}}}, + {X: Field{[10]uint32{0x022ac683, 0x02fce931, 0x037bbc7a, 0x017dcd60, 0x01ef8b12, 0x03ca9bdc, 0x006a02e8, 0x000b9df7, 0x0185fa98, 0x000ef6a4}}, Y: Field{[10]uint32{0x00a05b85, 0x00b95300, 0x02118936, 0x0172ec32, 0x0222b347, 0x002b8e1d, 0x0075a76a, 0x005e135e, 0x032bc11d, 0x00080bb7}}}, + {X: Field{[10]uint32{0x003a5c4d, 0x00cf5ae6, 0x00097bc0, 0x022dfd49, 0x023be197, 0x0215c348, 0x0313c714, 0x02d93604, 0x00de4486, 0x000be42f}}, Y: Field{[10]uint32{0x00384f89, 0x03f69c6f, 0x01705270, 0x027b3d5e, 0x01f4aa75, 0x0332a677, 0x01b2e300, 0x0351d4d9, 0x02502028, 0x0018e193}}}, + {X: Field{[10]uint32{0x00becda7, 0x02f3ef32, 0x01cb6562, 0x0309b1c7, 0x017083ed, 0x0327f35c, 0x0192e654, 0x0039bf72, 0x01d4e9b0, 0x002224fd}}, Y: Field{[10]uint32{0x0238ab50, 0x00c4ed2c, 0x003130fe, 0x0275b36e, 0x02a80fa2, 0x03831a65, 0x03566a1f, 0x0041d3ef, 0x00558e63, 0x0007ebcc}}}, + {X: Field{[10]uint32{0x0155abba, 0x030d2561, 0x0237d855, 0x0094c273, 0x00f482fc, 0x0369cd44, 0x024fac54, 0x01778fb6, 0x02e686be, 0x002b3f12}}, Y: Field{[10]uint32{0x02c52d87, 0x01c5a14a, 0x0037cb90, 0x01f3e6f4, 0x0176423f, 0x03b0a47f, 0x03a5b998, 0x0229ab4d, 0x0197d187, 0x000e1fd1}}}, + {X: Field{[10]uint32{0x0017a469, 0x00a95788, 0x020d9542, 0x039f5d19, 0x01d5fe35, 0x00a2948a, 0x03a892dd, 0x03a620bc, 0x0090a4c5, 0x000ab134}}, Y: Field{[10]uint32{0x03086c09, 0x03095c77, 0x01914a3b, 0x00afdd68, 0x01927d17, 0x03639a1a, 0x0279f2d7, 0x03b1151e, 0x01162aa3, 0x0018163d}}}, + {X: Field{[10]uint32{0x02badef6, 0x03d6139f, 0x0024e9c9, 0x03b09430, 0x02c9b1a3, 0x004f1f98, 0x03c235cd, 0x0315cb96, 0x013ffc13, 0x00004dfb}}, Y: Field{[10]uint32{0x02c6fdba, 0x0214daa3, 0x00bf54fb, 0x030bcdeb, 0x010319e7, 0x0321d63c, 0x003ff023, 0x013d442d, 0x01cc3a46, 0x000307a5}}}, + {X: Field{[10]uint32{0x033ecfe4, 0x013615fb, 0x02002cfe, 0x03dd63c2, 0x006cfb16, 0x00454ae5, 0x009f6068, 0x0228f4b2, 0x037a7214, 0x0000a280}}, Y: Field{[10]uint32{0x03973d10, 0x02ce613e, 0x03aa8a1b, 0x0093ea40, 0x02ec5951, 0x031b9e8e, 0x03788cf5, 0x037a6e34, 0x0250135c, 0x002cbd2d}}}, + {X: Field{[10]uint32{0x027a9eeb, 0x02b773c6, 0x000ae3bb, 0x016d7cd3, 0x0378ad6d, 0x01d869db, 0x01d426e8, 0x00cfef3a, 0x01518fd4, 0x000c0fb3}}, Y: Field{[10]uint32{0x01abb602, 0x0158ce66, 0x01385ea9, 0x00fa2761, 0x02cbd8dc, 0x009d72c6, 0x03a5945a, 0x02c67a59, 0x02443b73, 0x001a9ff2}}}, + {X: Field{[10]uint32{0x01533202, 0x008ce054, 0x0140a509, 0x01e7e2cc, 0x02c69cf0, 0x03595a6e, 0x001defd9, 0x03dc7099, 0x002e5680, 0x0033d8c1}}, Y: Field{[10]uint32{0x00eb4ee8, 0x03cd007b, 0x009b6b8f, 0x00ebd437, 0x00017664, 0x0386a90a, 0x01a20525, 0x03f715c6, 0x036dfb17, 0x000e7ccd}}}, + {X: Field{[10]uint32{0x031fe4b7, 0x01216a86, 0x0168c44f, 0x02a38b76, 0x0334a229, 0x0395b124, 0x0123b6f2, 0x027eda5a, 0x03efb4a4, 0x0033ebee}}, Y: Field{[10]uint32{0x029f9007, 0x034971b1, 0x02a160b5, 0x0260063e, 0x01f39506, 0x0075dbdc, 0x03afbc70, 0x005f8777, 0x034d4a9c, 0x003703b4}}}, + {X: Field{[10]uint32{0x010d363e, 0x034bcc4e, 0x0153d785, 0x01da6822, 0x004a7ffd, 0x00f1aa90, 0x0093ff7b, 0x009fa9a9, 0x01e10fd5, 0x003b038f}}, Y: Field{[10]uint32{0x027a35dd, 0x030a17e3, 0x03528fc5, 0x0303fcd4, 0x01723129, 0x005fd4f3, 0x02f3c6a7, 0x00d30420, 0x03ce3002, 0x00252f76}}}, + {X: Field{[10]uint32{0x032bcde0, 0x038a9012, 0x02f7f84b, 0x0213bac0, 0x0113e9cd, 0x000645af, 0x039c0c35, 0x008b3f52, 0x00d19144, 0x003c1f4f}}, Y: Field{[10]uint32{0x01637320, 0x007ddece, 0x018103aa, 0x001a2b8b, 0x01dfe912, 0x01b47dc1, 0x0048de51, 0x00c860df, 0x02facb39, 0x0033c325}}}, + {X: Field{[10]uint32{0x0248db10, 0x01c267cd, 0x003e2821, 0x01f799d9, 0x038a6fab, 0x00031e98, 0x0264ac0a, 0x00813a8c, 0x00b66f2e, 0x00129095}}, Y: Field{[10]uint32{0x02e5023a, 0x02acaf0b, 0x0157ac26, 0x0022eb2c, 0x01b187ab, 0x017df7e5, 0x03ef9891, 0x03f0d7be, 0x0229be93, 0x002d5443}}}, + {X: Field{[10]uint32{0x007774a8, 0x0204fa3a, 0x001d9b5d, 0x02c0e017, 0x01910285, 0x03d9c651, 0x02625829, 0x02bc74d7, 0x03cfb38e, 0x00015bce}}, Y: Field{[10]uint32{0x01ed9dc6, 0x029e9d74, 0x026bac57, 0x01c219df, 0x038a1e82, 0x0051fddc, 0x03f3e5ca, 0x01fe6a6a, 0x00e79e6b, 0x002a6e59}}}, + {X: Field{[10]uint32{0x03081295, 0x01586f9a, 0x03561ace, 0x021947f9, 0x01af6b98, 0x03aa9327, 0x02d95bff, 0x00bbf030, 0x034e07d3, 0x003e2763}}, Y: Field{[10]uint32{0x01bacc69, 0x03b1c663, 0x030d1449, 0x0145235d, 0x0075e48f, 0x01c61a65, 0x02656911, 0x00e19d8e, 0x031156a3, 0x003298cb}}}, + {X: Field{[10]uint32{0x03c5530b, 0x03948149, 0x02af9758, 0x00cf1b66, 0x032890b9, 0x007c3a4a, 0x02e4a075, 0x005bad42, 0x01a0d3e7, 0x00170de4}}, Y: Field{[10]uint32{0x03b34616, 0x03e2eae9, 0x021c3ca1, 0x0070cdab, 0x02c4ed86, 0x0244d24e, 0x01e30dae, 0x00b4445e, 0x03c62de5, 0x00113bc4}}}, + {X: Field{[10]uint32{0x03a38d27, 0x02804caa, 0x0233115f, 0x03c34e8f, 0x038ab94e, 0x01b3bab6, 0x00d71561, 0x0292b98b, 0x025ae6ba, 0x0009d21d}}, Y: Field{[10]uint32{0x03f69e48, 0x013c7c9d, 0x033590cd, 0x00cea4ec, 0x020f36b3, 0x031eba4a, 0x0105bbe6, 0x01dc3582, 0x019dde63, 0x001c7534}}}, + {X: Field{[10]uint32{0x0327e254, 0x00d8efae, 0x0145322e, 0x028116a5, 0x000d2c41, 0x01fb8f9e, 0x00e4ee18, 0x035de00b, 0x03a2f8ec, 0x002593c7}}, Y: Field{[10]uint32{0x00138a2e, 0x01598435, 0x022e6775, 0x0000ee60, 0x015137ae, 0x00b33988, 0x0081a5fa, 0x02a20fa5, 0x03cade64, 0x0031d12e}}}, + {X: Field{[10]uint32{0x01b8ca3b, 0x0217895e, 0x02754589, 0x001d3df4, 0x03ee758a, 0x01b0de7f, 0x003594fe, 0x0327ea14, 0x03758709, 0x0022fd81}}, Y: Field{[10]uint32{0x03dd51a4, 0x03986221, 0x03715a5a, 0x03b9c629, 0x02ccc193, 0x02c46343, 0x011cfb8f, 0x0375cbfd, 0x0192b3fb, 0x000f98e2}}}, + {X: Field{[10]uint32{0x02e06612, 0x008e3740, 0x015f5a10, 0x03603b83, 0x00fbff70, 0x036fb9e6, 0x03c5a95d, 0x008e70af, 0x01239189, 0x003e841c}}, Y: Field{[10]uint32{0x0168e7f1, 0x01311a3e, 0x03936c62, 0x0384b5dc, 0x02315a6b, 0x00757b07, 0x0133ea97, 0x02c29664, 0x015e1a4e, 0x00029833}}}, + {X: Field{[10]uint32{0x00975588, 0x00d39451, 0x0059383c, 0x00f2a251, 0x033fe250, 0x01e5f2e2, 0x03d145ef, 0x025ffb00, 0x02d09f6f, 0x0016d231}}, Y: Field{[10]uint32{0x006e30a0, 0x00428ea4, 0x03d83c64, 0x0114a01d, 0x02173d6c, 0x02597c4d, 0x0291762d, 0x0046f304, 0x02893526, 0x00113619}}}, + {X: Field{[10]uint32{0x02b94fd0, 0x03c6f2bb, 0x025b1ae8, 0x013552f2, 0x005d4e85, 0x0397a232, 0x025d1ea1, 0x01f8fca1, 0x03e823aa, 0x00203854}}, Y: Field{[10]uint32{0x006b9728, 0x01eb2ea8, 0x023f73ed, 0x00b01c60, 0x03c888a1, 0x03d3d904, 0x03a92d8e, 0x03046c04, 0x0229e435, 0x003b74ff}}}, + {X: Field{[10]uint32{0x01ccf2c4, 0x03b5b41e, 0x03e3dae7, 0x027c1ec7, 0x03cd25de, 0x0131b8a6, 0x0190dd15, 0x01d49b09, 0x01d977bf, 0x0005b889}}, Y: Field{[10]uint32{0x01710768, 0x00622b02, 0x0274dd85, 0x014b83e8, 0x0340088c, 0x033708ad, 0x02db82af, 0x01d551b4, 0x0123b9b5, 0x00381c0b}}}, + {X: Field{[10]uint32{0x01456938, 0x0247bf36, 0x013ce7a6, 0x028b78d6, 0x03bb064a, 0x02097af2, 0x021b65e7, 0x01b1d208, 0x020915a1, 0x0028d102}}, Y: Field{[10]uint32{0x00dbf40c, 0x01c24135, 0x0226bbe9, 0x00f79f0f, 0x0326fa5d, 0x03d0de99, 0x001323a7, 0x00aa3d59, 0x02a03a58, 0x003fdf1e}}}, + {X: Field{[10]uint32{0x01aa2b5f, 0x00c3a7b3, 0x037c80a0, 0x000e4fac, 0x018d6072, 0x00b564e1, 0x0320401f, 0x0111a008, 0x034cd116, 0x0020550c}}, Y: Field{[10]uint32{0x033d5142, 0x004e7196, 0x03d54150, 0x0361f55c, 0x0017126a, 0x02824522, 0x030676f4, 0x03939ec3, 0x014e5f97, 0x002ee902}}}, + {X: Field{[10]uint32{0x014d93c7, 0x039a96df, 0x01efa329, 0x0184f86d, 0x02fe7f23, 0x0138265d, 0x0092b257, 0x02eb28e8, 0x00ca27b5, 0x003244d2}}, Y: Field{[10]uint32{0x0176b44a, 0x0079cf16, 0x036399d6, 0x02550257, 0x01e7c372, 0x0006fed6, 0x020e62dc, 0x0268b141, 0x010de9d4, 0x00338907}}}, + {X: Field{[10]uint32{0x026e8a88, 0x0096435f, 0x024363ba, 0x0101cdf9, 0x01cf3629, 0x0272a592, 0x0235e995, 0x02b5319d, 0x01a879fe, 0x0025022d}}, Y: Field{[10]uint32{0x03994fc0, 0x005d915f, 0x00fdfcbf, 0x034a12e0, 0x00e02155, 0x007d1825, 0x02858d52, 0x004306fc, 0x010a26c7, 0x003842d0}}}, + {X: Field{[10]uint32{0x02bdd2ce, 0x00f9f975, 0x01b92e7d, 0x02436408, 0x02f80ddf, 0x02160aab, 0x020a159f, 0x0122e1e7, 0x0158eefe, 0x002e1474}}, Y: Field{[10]uint32{0x02d85469, 0x02f6a8b1, 0x0293f06a, 0x036394dd, 0x0060facf, 0x0271f560, 0x00c53f06, 0x00908707, 0x02e10079, 0x000a42b8}}}, + {X: Field{[10]uint32{0x013d10fc, 0x01c79ab9, 0x005eb1b9, 0x02e15368, 0x0387e7a5, 0x0394d824, 0x00053875, 0x00801d96, 0x034d4a7c, 0x00274c82}}, Y: Field{[10]uint32{0x01d7c456, 0x000fd1c9, 0x0306e796, 0x018729a0, 0x009b44be, 0x039e0ec3, 0x022acd0a, 0x006435a0, 0x037b6a1f, 0x0013dab2}}}, + {X: Field{[10]uint32{0x018ac7b5, 0x002a7a0d, 0x004c22f3, 0x0053401d, 0x01eaa491, 0x004e9362, 0x0386799d, 0x03b1953f, 0x00107b29, 0x001b5de6}}, Y: Field{[10]uint32{0x03823950, 0x028f9e76, 0x038804b0, 0x00d00ee8, 0x0177b2a3, 0x03899731, 0x0060a2ac, 0x013c26e8, 0x03cc105c, 0x0023de64}}}, + {X: Field{[10]uint32{0x017f6489, 0x02476a79, 0x0372d73c, 0x001cb209, 0x00680c96, 0x02015b4a, 0x017d62db, 0x013eda68, 0x02ce77e1, 0x002f6cb4}}, Y: Field{[10]uint32{0x03aa590d, 0x02790b96, 0x030c184c, 0x00000f0a, 0x0008a3bc, 0x029bd592, 0x038ecede, 0x00ec6773, 0x0371d43c, 0x0002707b}}}, + {X: Field{[10]uint32{0x0055b3fa, 0x03ff68fc, 0x02dea741, 0x02a34286, 0x001f7897, 0x01ceec16, 0x01b4787f, 0x002a5293, 0x00ff1ab7, 0x00126a33}}, Y: Field{[10]uint32{0x006ba426, 0x024a0a9b, 0x0243d8bd, 0x0053f5b7, 0x0115b419, 0x03814eb5, 0x02414ed6, 0x03af47b8, 0x02772049, 0x003ca634}}}, + {X: Field{[10]uint32{0x029d2236, 0x0285ce9d, 0x000d77f1, 0x014ad441, 0x013b3d56, 0x00c5e80b, 0x0267992d, 0x02dec158, 0x016eb466, 0x00328fdf}}, Y: Field{[10]uint32{0x02145c37, 0x036ec4a3, 0x021b7126, 0x02b7dbc6, 0x0090e538, 0x025a90b0, 0x00e6f2bf, 0x00e13bde, 0x02259dcf, 0x00289b58}}}, + {X: Field{[10]uint32{0x037176e4, 0x03a98c1c, 0x0065bc00, 0x02b699af, 0x01902e9c, 0x003422e6, 0x038469cb, 0x009f46d1, 0x0214f1c4, 0x002d9cb3}}, Y: Field{[10]uint32{0x00865efa, 0x022fdd9a, 0x03eddb81, 0x0142e312, 0x0083f4f5, 0x00f1695b, 0x020f1aff, 0x0145d89e, 0x01790001, 0x0005db02}}}, + {X: Field{[10]uint32{0x029c199b, 0x03244ebb, 0x0168bda3, 0x01e23cba, 0x022c26dd, 0x010dde2a, 0x01b6866f, 0x01886f5b, 0x0357d4ad, 0x002f72ea}}, Y: Field{[10]uint32{0x00df5603, 0x01548ca2, 0x03c11240, 0x003ba4f1, 0x021cee9f, 0x03585a36, 0x0075a338, 0x004ff5f7, 0x00729bb2, 0x001e61a2}}}, + {X: Field{[10]uint32{0x01fbf9f5, 0x00e12c95, 0x001961cb, 0x03420b60, 0x020d5bee, 0x0317d08f, 0x0064aa96, 0x01f7d5d3, 0x031e382f, 0x003d7c97}}, Y: Field{[10]uint32{0x02210221, 0x0277febc, 0x0324c98a, 0x01a03849, 0x00f54bc0, 0x02942934, 0x0393a829, 0x012ab960, 0x030b5ad8, 0x003a8e23}}}, + {X: Field{[10]uint32{0x02ae09c3, 0x002e2505, 0x0250aa73, 0x01261689, 0x03603720, 0x009d1f10, 0x026e280b, 0x02ae7872, 0x0064f9f8, 0x0034a841}}, Y: Field{[10]uint32{0x029c5962, 0x033da2c8, 0x01b454fd, 0x03aeacf0, 0x032c9ffa, 0x00b240ba, 0x00d8dcaf, 0x0194cc0a, 0x01ed8dc4, 0x003465c6}}}, + {X: Field{[10]uint32{0x00410038, 0x02068008, 0x0291cc5f, 0x00ffcffd, 0x0119058c, 0x03979aa9, 0x01221058, 0x01312f15, 0x02fee672, 0x00224956}}, Y: Field{[10]uint32{0x023fd7bd, 0x01f62bf6, 0x013e6914, 0x02d19c5c, 0x00c833c3, 0x03eead40, 0x0352ffb4, 0x0324d046, 0x02dd9560, 0x00023589}}}, + {X: Field{[10]uint32{0x016e3952, 0x004bef55, 0x03f94beb, 0x03c81b24, 0x015165e3, 0x01e06406, 0x027d73f5, 0x03bbb8a9, 0x0042c5ec, 0x001791a3}}, Y: Field{[10]uint32{0x00f240de, 0x01994163, 0x021edc38, 0x02d0e92b, 0x03ce1fde, 0x00c39003, 0x00b6a8c3, 0x025f8aae, 0x024a467f, 0x002be0f8}}}, + {X: Field{[10]uint32{0x019c4e2c, 0x021401fa, 0x0036d7fc, 0x023a4e14, 0x03552caf, 0x03d52ac0, 0x006850e8, 0x00662fd8, 0x03ac9eca, 0x001c30af}}, Y: Field{[10]uint32{0x02ea37b3, 0x03fadb35, 0x00591544, 0x010034b1, 0x023b45d9, 0x0033dd65, 0x00f99392, 0x02b95e2a, 0x0365f5ff, 0x00180c88}}}, + {X: Field{[10]uint32{0x01c2f318, 0x0107032e, 0x001eeab6, 0x006993a4, 0x03bbb0db, 0x031e58c3, 0x000f86d7, 0x01ad0814, 0x013afe5f, 0x0005850f}}, Y: Field{[10]uint32{0x036a8a94, 0x022c91f5, 0x01e68ecb, 0x009132b4, 0x039fd749, 0x0134734d, 0x0109561d, 0x02075e04, 0x00140bdf, 0x001c1e3a}}}, + {X: Field{[10]uint32{0x02b62bce, 0x01ba5985, 0x03ed029f, 0x02ddce82, 0x03e1326e, 0x003fd82a, 0x025b0346, 0x0059136c, 0x02ada934, 0x0022b0cf}}, Y: Field{[10]uint32{0x00945cc6, 0x0276ff46, 0x0005dc6d, 0x013f6918, 0x00ea9e61, 0x0266f694, 0x0055d0ed, 0x0062d2f4, 0x03566f0d, 0x0001b41d}}}, + {X: Field{[10]uint32{0x0166e22a, 0x02a78189, 0x03ce771e, 0x0096843e, 0x0270cb33, 0x038323ad, 0x01f01166, 0x03abf7bd, 0x00b89e7f, 0x0011dae6}}, Y: Field{[10]uint32{0x02a91050, 0x01743875, 0x03f4730c, 0x0176e03e, 0x00fd98bd, 0x0004bc88, 0x0138483c, 0x00ae19f8, 0x00418325, 0x000e36fc}}}, + {X: Field{[10]uint32{0x01497f11, 0x03114fbb, 0x03058a19, 0x01fc64a5, 0x012e383a, 0x0086b7e8, 0x0302bcb3, 0x0270ef4c, 0x02eff0de, 0x00393498}}, Y: Field{[10]uint32{0x022781d3, 0x01f3def3, 0x0050bfec, 0x0039f008, 0x01953d0c, 0x03a92400, 0x02070c49, 0x0048323c, 0x00fc2fd6, 0x00287e0c}}}, + {X: Field{[10]uint32{0x00b5cbf8, 0x0303f3fc, 0x019871be, 0x01e5065b, 0x03e2e092, 0x027ccf99, 0x00c4f7cb, 0x02f86fc6, 0x010f48f0, 0x0019ef21}}, Y: Field{[10]uint32{0x0352d32f, 0x0373ae17, 0x03355526, 0x02f24b83, 0x01b7e6fa, 0x034bc833, 0x013e9271, 0x0292c91a, 0x0070334a, 0x00389581}}}, + {X: Field{[10]uint32{0x02ef2797, 0x0147849c, 0x02b8d58f, 0x029689c4, 0x02b543a6, 0x00aac9d3, 0x024be020, 0x01250895, 0x02c5c0dd, 0x0014372c}}, Y: Field{[10]uint32{0x02b04ea0, 0x0227e352, 0x03ca890d, 0x01a8bddf, 0x038d2ea1, 0x01c17732, 0x03854b49, 0x01132671, 0x036fb69c, 0x000b2f00}}}, + {X: Field{[10]uint32{0x0358bd6e, 0x029edda1, 0x0287644b, 0x013a2644, 0x01f86080, 0x0377d599, 0x00a57f1b, 0x0123d07a, 0x01777849, 0x001b26f1}}, Y: Field{[10]uint32{0x03b3ff20, 0x003fd13a, 0x00260cd4, 0x005724a0, 0x03a04019, 0x00892406, 0x029ca3d1, 0x02b211cc, 0x01f35998, 0x0021299c}}}, + {X: Field{[10]uint32{0x0382a868, 0x01f12520, 0x010e7a33, 0x011919ce, 0x0128b441, 0x0231bab4, 0x03ceb361, 0x036ee67c, 0x03c6d27c, 0x00176b24}}, Y: Field{[10]uint32{0x002df508, 0x0292fe0d, 0x02d8bac2, 0x02e38c57, 0x008a91c2, 0x025dc13e, 0x034578aa, 0x0020b9d0, 0x00651805, 0x002195c8}}}, + {X: Field{[10]uint32{0x01780c86, 0x00af9f21, 0x0196f2ed, 0x002ad1ae, 0x03f6b2a4, 0x00c1cf03, 0x02e9484d, 0x015f85e9, 0x03c65e1c, 0x00081e40}}, Y: Field{[10]uint32{0x03f6a442, 0x018cf051, 0x02c14854, 0x020c4569, 0x020bbdcb, 0x00f85e8e, 0x00fd3107, 0x01353db1, 0x00202956, 0x0012d5a1}}}, + {X: Field{[10]uint32{0x02dc2f90, 0x0118884b, 0x011dd295, 0x01320a44, 0x036ffbc9, 0x00a0a0c3, 0x03351132, 0x024fa4ea, 0x03639be5, 0x00368097}}, Y: Field{[10]uint32{0x016d2723, 0x0250e0e4, 0x02e68eb6, 0x02997bd2, 0x00714def, 0x006b3d72, 0x02dea9a2, 0x0395dbc3, 0x01eba315, 0x0026d2b3}}}, + {X: Field{[10]uint32{0x02823cb1, 0x002943ec, 0x02ea5603, 0x03d7b91f, 0x012a0f61, 0x021f3c64, 0x026ffa6b, 0x02272084, 0x02cd01b4, 0x000c9fea}}, Y: Field{[10]uint32{0x00c33b9b, 0x03e7b3ee, 0x037e96b7, 0x019d7f85, 0x0314c00c, 0x000f97e2, 0x00c5ac29, 0x00026c51, 0x03426010, 0x00018d2a}}}, + {X: Field{[10]uint32{0x037e8084, 0x0091561e, 0x010cc79a, 0x005fd6fd, 0x006c9cab, 0x02746ff6, 0x013478ba, 0x03d18aa1, 0x03ee1619, 0x001133fe}}, Y: Field{[10]uint32{0x008e7da4, 0x031c535d, 0x01f64563, 0x00703f8d, 0x0176442a, 0x0041e691, 0x02f8c288, 0x0278a1fa, 0x03db6207, 0x002c2260}}}, + {X: Field{[10]uint32{0x02a6fe3a, 0x0085c381, 0x0393a43a, 0x02141203, 0x03beb197, 0x00d3477a, 0x01ad6797, 0x00338b08, 0x01ca1373, 0x00317651}}, Y: Field{[10]uint32{0x023cc3fb, 0x01efc6eb, 0x02f0446e, 0x03ec328f, 0x0374102f, 0x0392a707, 0x03f72878, 0x01c503d9, 0x011b4d8b, 0x0028eab4}}}, + {X: Field{[10]uint32{0x02c0de31, 0x0290b873, 0x019e677f, 0x03d90d4d, 0x01d4bf22, 0x03c76c3b, 0x032694b8, 0x03a4d446, 0x031984df, 0x003d3633}}, Y: Field{[10]uint32{0x01a30845, 0x02e970ba, 0x03f020c0, 0x01753ec3, 0x025b48a5, 0x01f8eff7, 0x02d76bfc, 0x0062035e, 0x01223aae, 0x0020f40b}}}, + {X: Field{[10]uint32{0x0037c4cd, 0x002b9f06, 0x02e707e5, 0x0387854e, 0x03a2dce0, 0x0343c3b9, 0x006380af, 0x002f2243, 0x01dc8e7b, 0x0004f5c8}}, Y: Field{[10]uint32{0x00841116, 0x01844ba2, 0x00d28e97, 0x004b57c5, 0x009309c4, 0x002bdf93, 0x039e8237, 0x015045fa, 0x01e3e157, 0x00318830}}}, + {X: Field{[10]uint32{0x0265ce1a, 0x018b8458, 0x01783928, 0x013389ec, 0x02516482, 0x013076bc, 0x03eb55d9, 0x019ca081, 0x03a666fc, 0x00397e7b}}, Y: Field{[10]uint32{0x000d9975, 0x00bc8f57, 0x0156c771, 0x033d4f82, 0x0201f0f3, 0x018f5e6d, 0x03f9fbe1, 0x00aed48b, 0x03e61830, 0x001402a7}}}, + {X: Field{[10]uint32{0x0319c9ec, 0x0180f0f0, 0x016988da, 0x038290fa, 0x02a48ea0, 0x009ec6cc, 0x027abb98, 0x0284dd96, 0x00bd0a1b, 0x001cfb8f}}, Y: Field{[10]uint32{0x02b38f58, 0x017b1686, 0x00744b0a, 0x03408386, 0x03bbc909, 0x00ba097c, 0x0330bd5a, 0x01a272fa, 0x02b44093, 0x00365a0c}}}, + {X: Field{[10]uint32{0x01990d91, 0x0074b3f1, 0x0255df10, 0x0007c09e, 0x003e0285, 0x0089d429, 0x03285e71, 0x01aeea04, 0x03c59404, 0x00046e4b}}, Y: Field{[10]uint32{0x00315417, 0x0245c5a9, 0x03b639fe, 0x03347655, 0x0023b324, 0x002526cb, 0x01cfcd08, 0x033f8103, 0x00aae20f, 0x003822c9}}}, + {X: Field{[10]uint32{0x0160935b, 0x032873e4, 0x006a0623, 0x0148d8bc, 0x01b1bf49, 0x008a9897, 0x014442a0, 0x003717ec, 0x029c22be, 0x000c10d9}}, Y: Field{[10]uint32{0x00d0eb34, 0x034b2189, 0x00a2206d, 0x02c9724b, 0x0341eead, 0x0349b886, 0x0152c044, 0x01f5afeb, 0x00b04bf4, 0x0037120d}}}, + {X: Field{[10]uint32{0x015f9a0c, 0x02d71f4f, 0x00495132, 0x0185aa72, 0x023f92aa, 0x001f7b12, 0x007622b4, 0x034510ae, 0x01aac290, 0x0012430e}}, Y: Field{[10]uint32{0x0126b986, 0x01a36b8a, 0x021eab3d, 0x03799dcf, 0x03110f87, 0x00f2cc53, 0x001361f7, 0x012a9bfa, 0x00fd5784, 0x00171db0}}}, + {X: Field{[10]uint32{0x0002d03a, 0x02c90ce4, 0x03f2d2bb, 0x02528f82, 0x023a4caf, 0x01cac310, 0x01fb2127, 0x00cd1f28, 0x015867d7, 0x003f7573}}, Y: Field{[10]uint32{0x03411995, 0x033a425d, 0x0117210b, 0x01321762, 0x01bd69f8, 0x02f25369, 0x035bcc06, 0x01af1dbe, 0x0007d1d2, 0x003bf97d}}}, + {X: Field{[10]uint32{0x00435ea9, 0x031405c5, 0x012d80e9, 0x02272b46, 0x00e2d359, 0x01956b10, 0x03db2722, 0x003f3910, 0x008eb083, 0x002f2284}}, Y: Field{[10]uint32{0x03c979f9, 0x01a6e4f8, 0x00d60220, 0x03d8a41f, 0x0076bd3a, 0x024c65b0, 0x008a384b, 0x0369d29c, 0x0258cbc3, 0x00249300}}}, + {X: Field{[10]uint32{0x02924b44, 0x0177e3ab, 0x02e3b339, 0x02904054, 0x012c706e, 0x00626273, 0x02e431a7, 0x02db2e1a, 0x036e41f4, 0x003b6026}}, Y: Field{[10]uint32{0x00315da8, 0x0326ff19, 0x01f8a324, 0x02642c46, 0x00bede66, 0x0251eaa2, 0x0142ffe0, 0x01562723, 0x005c0329, 0x0004d760}}}, + {X: Field{[10]uint32{0x00da52d8, 0x02145edb, 0x03276797, 0x0049e7a7, 0x00043982, 0x0390b5aa, 0x007d2f1e, 0x00781d05, 0x02c75d87, 0x0009ad42}}, Y: Field{[10]uint32{0x005dd7a0, 0x011aeb55, 0x005180e3, 0x02814879, 0x021fe37e, 0x00d253c3, 0x014b4c80, 0x01ba7c2c, 0x00638642, 0x00099667}}}, + {X: Field{[10]uint32{0x03e8efd5, 0x02e53527, 0x01dd725a, 0x00419de1, 0x01679f6b, 0x02241f3c, 0x02746ff9, 0x033351fd, 0x00de27d0, 0x00333b62}}, Y: Field{[10]uint32{0x03f5729a, 0x037d0f5c, 0x00825fe4, 0x019f38af, 0x00e2beba, 0x014ad09a, 0x036adc2c, 0x0212b2d2, 0x022b4dc5, 0x0016c3b7}}}, + {X: Field{[10]uint32{0x003c6249, 0x02a20f76, 0x032bb52d, 0x005863d1, 0x02bf3fe5, 0x01e221b3, 0x00429c11, 0x018cc8c2, 0x03cb3152, 0x00363b7d}}, Y: Field{[10]uint32{0x03984be3, 0x036bc1c5, 0x033437f3, 0x0201ad21, 0x0108c71b, 0x002e9a47, 0x03427e13, 0x03bbdb50, 0x003ec155, 0x00295aaf}}}, + {X: Field{[10]uint32{0x0164b4ef, 0x02dc711d, 0x02515c2f, 0x00414fd9, 0x02526489, 0x035b23f3, 0x0149aa5c, 0x00e9d542, 0x03c9f8db, 0x003b60b0}}, Y: Field{[10]uint32{0x00b2f0b4, 0x03a3f948, 0x00f39b06, 0x032057f3, 0x0141ddcc, 0x0112a291, 0x029a26d4, 0x034f1dbe, 0x014906d9, 0x0017b966}}}, + {X: Field{[10]uint32{0x018ca937, 0x006b910f, 0x0365e777, 0x02b61620, 0x005853b3, 0x01b54212, 0x026249d5, 0x03ad5017, 0x03aee89a, 0x001b89de}}, Y: Field{[10]uint32{0x01f40b8e, 0x01f408ce, 0x025b403f, 0x03713892, 0x008f9623, 0x00e845c3, 0x01a3fe66, 0x02529f0c, 0x03d81e6f, 0x002121c6}}}, + {X: Field{[10]uint32{0x00a03c5c, 0x00abee52, 0x00967f70, 0x0109d9da, 0x00f2f8b6, 0x0386bfe5, 0x01b12293, 0x00484159, 0x02c86727, 0x002bad9e}}, Y: Field{[10]uint32{0x00bde197, 0x0034875e, 0x0289b698, 0x02fcdc1f, 0x02747100, 0x01bfd6b1, 0x027898d6, 0x02700f37, 0x01889425, 0x003f34f1}}}, + {X: Field{[10]uint32{0x0283da79, 0x01f381d4, 0x03af23ba, 0x024e8f44, 0x00457531, 0x00e18cfa, 0x00967d1e, 0x031d5a53, 0x034baa20, 0x0027c1ff}}, Y: Field{[10]uint32{0x03f2136b, 0x017edff7, 0x02e36397, 0x03df656e, 0x0014308c, 0x02b28fc7, 0x03c5f363, 0x0185a3fc, 0x030d49d0, 0x002ba2df}}}, + {X: Field{[10]uint32{0x013e1520, 0x00e5755c, 0x03df7243, 0x0325dab3, 0x03baafc3, 0x02f15406, 0x004b3ef7, 0x036ae859, 0x0114a026, 0x0009011b}}, Y: Field{[10]uint32{0x02029ae6, 0x0219f32a, 0x016cd321, 0x0202eb43, 0x0037fd53, 0x00554d2d, 0x013cd0e9, 0x0028c6ea, 0x01e96dc4, 0x00099521}}}, + {X: Field{[10]uint32{0x033de519, 0x02f08cca, 0x010c913b, 0x02adf67e, 0x011806af, 0x015d39ae, 0x0344f48c, 0x03471a00, 0x0126bf8f, 0x00004dda}}, Y: Field{[10]uint32{0x01a61fa5, 0x02f9e575, 0x01ced56e, 0x014685d5, 0x018aed90, 0x01f4da5b, 0x02b2198e, 0x01309be1, 0x00e7c4b4, 0x0028d040}}}, + {X: Field{[10]uint32{0x035a7d6e, 0x03268fbb, 0x015f11ef, 0x02996073, 0x025e4c38, 0x0045aba0, 0x037c85fb, 0x0319a21f, 0x014e816c, 0x00250f1b}}, Y: Field{[10]uint32{0x029de8dd, 0x00c69825, 0x02b24eca, 0x01c0c5a7, 0x0274112f, 0x0220fb8d, 0x02351657, 0x0369b4a7, 0x0324f618, 0x00364f51}}}, + {X: Field{[10]uint32{0x005432d9, 0x002023a2, 0x03f53d4d, 0x0252bd82, 0x03a0f46e, 0x017d3e19, 0x03c9e61d, 0x0183f72b, 0x001f1592, 0x002b7e01}}, Y: Field{[10]uint32{0x03e57958, 0x01680dc6, 0x02d952b9, 0x01779b0f, 0x02c055ff, 0x03a42cdb, 0x0331bcbb, 0x0145bcf5, 0x021f99d2, 0x00313aae}}}, + {X: Field{[10]uint32{0x022dcc44, 0x014df01b, 0x01bb8d96, 0x01860c97, 0x01dc0d94, 0x001ea7ea, 0x01defb67, 0x02b82047, 0x0313a404, 0x0005705f}}, Y: Field{[10]uint32{0x01b6898e, 0x03ce0eba, 0x01dc679d, 0x01898359, 0x01a799fb, 0x0144b5e7, 0x0042b482, 0x0257a0da, 0x0352021f, 0x0021d034}}}, + {X: Field{[10]uint32{0x02cb8ca0, 0x012df372, 0x0143580e, 0x03b46b0c, 0x00966ec9, 0x01ae04f7, 0x01bd5758, 0x01665271, 0x03356236, 0x0021eeee}}, Y: Field{[10]uint32{0x022a48c4, 0x01892a34, 0x00a36f83, 0x03a472b5, 0x036a28f4, 0x00928fa6, 0x0214ccbe, 0x00f09257, 0x012c1bfc, 0x00005666}}}, + {X: Field{[10]uint32{0x031fa105, 0x01705da7, 0x00daf95b, 0x00f35751, 0x03564da7, 0x02ba710c, 0x0082b5fe, 0x01530678, 0x004a0964, 0x000e6f45}}, Y: Field{[10]uint32{0x016fb207, 0x01dec4c9, 0x019bcfa2, 0x009ccc0c, 0x01dadf15, 0x030f2a3e, 0x02be12eb, 0x03535be2, 0x011c30b5, 0x003ffa28}}}, + {X: Field{[10]uint32{0x003bca7a, 0x02ef592a, 0x00a9ab78, 0x01dbba5c, 0x00a1c696, 0x0196cbd3, 0x0399bfe2, 0x030319ae, 0x034f9bce, 0x0031393a}}, Y: Field{[10]uint32{0x02bfc286, 0x012283a5, 0x03cb7c22, 0x00ed13f0, 0x012ecb49, 0x001798e0, 0x024be2bd, 0x02e712f3, 0x003d316c, 0x0006ee6a}}}, + {X: Field{[10]uint32{0x03244e69, 0x0392bb33, 0x01801488, 0x00d3d4f0, 0x028b53f0, 0x023280d7, 0x01dd2f44, 0x034cd3c3, 0x03831c80, 0x003060f9}}, Y: Field{[10]uint32{0x01a8b820, 0x00c362f6, 0x020b1593, 0x02552539, 0x0008ff2f, 0x03770203, 0x03389268, 0x007520f6, 0x02aac771, 0x003e663f}}}, + {X: Field{[10]uint32{0x02d47d92, 0x0309007f, 0x03b6be39, 0x03655d4e, 0x027ac812, 0x00dd3674, 0x013b630f, 0x038423c2, 0x03ac22a2, 0x00267475}}, Y: Field{[10]uint32{0x02d0e1f0, 0x031378d4, 0x008b039c, 0x00f70d9b, 0x0352080a, 0x00daa25e, 0x01ca3d9b, 0x038d07a3, 0x033488df, 0x000299f4}}}, + {X: Field{[10]uint32{0x0161cea5, 0x033324ab, 0x012bc5c3, 0x00e79fd7, 0x02985a33, 0x01a42420, 0x03d6f187, 0x0226ef7c, 0x025d16cd, 0x00381c02}}, Y: Field{[10]uint32{0x00a0b0f0, 0x025381dc, 0x007e3bd9, 0x00a529eb, 0x001fd08b, 0x02756708, 0x03ec97bc, 0x00fea102, 0x03e03895, 0x0009bdaa}}}, + {X: Field{[10]uint32{0x01a7e721, 0x021e8f98, 0x0268b554, 0x01734fe9, 0x025415e9, 0x01ea98bb, 0x03813b56, 0x0360e546, 0x02e8cf36, 0x002c66fd}}, Y: Field{[10]uint32{0x0170153d, 0x00fe2e46, 0x01041fc0, 0x016e9dc2, 0x0246c105, 0x030439c4, 0x019f59e4, 0x036cbb35, 0x00a5ca2c, 0x0018c39e}}}, + {X: Field{[10]uint32{0x0371fd44, 0x039b867f, 0x03943c6f, 0x01c870cc, 0x0039abaf, 0x025c051d, 0x0027adfa, 0x0343b220, 0x0156e90d, 0x00094024}}, Y: Field{[10]uint32{0x033afc11, 0x019b87d5, 0x01dec9c4, 0x0000b467, 0x01b78255, 0x02e4ce16, 0x014ed74c, 0x01d8c808, 0x03dc8647, 0x000c9011}}}, + {X: Field{[10]uint32{0x01a3e4ae, 0x02e14e18, 0x00681771, 0x007e588e, 0x02aca501, 0x03531402, 0x030c98d9, 0x0174726e, 0x03e8bbe4, 0x0011739f}}, Y: Field{[10]uint32{0x0392f8b1, 0x0018b908, 0x008327ca, 0x01d804d6, 0x019e41b1, 0x02db1fd9, 0x00725702, 0x02e3c297, 0x02afd1ad, 0x00232f08}}}, + {X: Field{[10]uint32{0x019ec059, 0x020522d8, 0x026834e3, 0x014d0ec4, 0x02b939e9, 0x028a1bbd, 0x03392120, 0x01ff19f7, 0x0107d3a2, 0x001cc955}}, Y: Field{[10]uint32{0x01c35b63, 0x013a4fc9, 0x00e28a35, 0x03b44d13, 0x00eeba10, 0x03b5b233, 0x00f3deda, 0x0008376c, 0x02e6e941, 0x000c5d35}}}, + {X: Field{[10]uint32{0x0011df58, 0x0002b072, 0x03885978, 0x00b68481, 0x03602596, 0x0322eb4f, 0x009a9458, 0x030e787b, 0x02f401c6, 0x0025acb3}}, Y: Field{[10]uint32{0x027fa8cd, 0x009271a2, 0x01a997d1, 0x00b660f7, 0x002fbf9e, 0x003000d7, 0x01ab5b7c, 0x02b498eb, 0x012141b4, 0x003b617b}}}, + {X: Field{[10]uint32{0x02b9c772, 0x00fbbd90, 0x01cdbb98, 0x0324dc09, 0x0357f23c, 0x0244aba1, 0x007bebb0, 0x02ca2a8c, 0x001cd941, 0x0015d906}}, Y: Field{[10]uint32{0x00ac7089, 0x0234afb8, 0x01b8ef2c, 0x0133cf38, 0x01249576, 0x0115e90f, 0x01f64375, 0x0023f76d, 0x034fc239, 0x003a05ce}}}, + {X: Field{[10]uint32{0x03ec1b61, 0x00a7b724, 0x02c60efd, 0x028e0aed, 0x02ea16d2, 0x0356c9e0, 0x031e3145, 0x0141580a, 0x00397e96, 0x000e3b1e}}, Y: Field{[10]uint32{0x018ec96e, 0x0353258c, 0x01089744, 0x00c47354, 0x02f522e6, 0x012fc995, 0x02caa3ba, 0x0378b362, 0x02a4c7b6, 0x002b3c13}}}, + {X: Field{[10]uint32{0x02c0b572, 0x03b55e5d, 0x01eb8b7a, 0x03752ca1, 0x0179c9f7, 0x0023dce2, 0x00439fa1, 0x0071e5d6, 0x038013d0, 0x001bb13b}}, Y: Field{[10]uint32{0x0098be7e, 0x006e8bf2, 0x004df13c, 0x01abd7cf, 0x017a6d26, 0x03adabc5, 0x026560e3, 0x03b37c0e, 0x0242e618, 0x0008ca39}}}, + {X: Field{[10]uint32{0x0377141b, 0x0249127b, 0x027ba884, 0x020713b5, 0x034c40a5, 0x029da1a0, 0x000fc149, 0x01ec6940, 0x036b30c2, 0x00363687}}, Y: Field{[10]uint32{0x01519758, 0x00ecd20b, 0x007dc49a, 0x0385c9ca, 0x03d92464, 0x00e4e1f5, 0x038c3108, 0x024b3c0a, 0x02d6876d, 0x00332d4c}}}, + {X: Field{[10]uint32{0x037ccb90, 0x03b458a3, 0x022b4e5f, 0x01b0ce1c, 0x026894d3, 0x032a1287, 0x02aa9f0e, 0x01c3b259, 0x00027349, 0x00213c95}}, Y: Field{[10]uint32{0x035cd8b1, 0x0308648c, 0x02944983, 0x00df4e51, 0x0109bee1, 0x027c18c6, 0x017d283d, 0x018c0b32, 0x0109f07e, 0x003cb5ff}}}, + {X: Field{[10]uint32{0x029503e3, 0x02cb7733, 0x00038136, 0x03533c02, 0x033adabf, 0x00761bfd, 0x01190e39, 0x010dca16, 0x02b55887, 0x003bd9d4}}, Y: Field{[10]uint32{0x03131c56, 0x00567e0f, 0x010f91e6, 0x0391850e, 0x0273f949, 0x02373e63, 0x03aa6759, 0x02d1e5f2, 0x0250013c, 0x0008f672}}}, + {X: Field{[10]uint32{0x0085ba6d, 0x02f0b004, 0x02a46602, 0x01d3f845, 0x00fe198f, 0x01df1ddb, 0x001cb52c, 0x0399f3d9, 0x01903b3f, 0x003e2361}}, Y: Field{[10]uint32{0x0208742d, 0x001fedee, 0x03a32405, 0x028a39b3, 0x0021da61, 0x0377c539, 0x0295714c, 0x02b5a28d, 0x02bd2178, 0x00162bca}}}, + {X: Field{[10]uint32{0x01b9c01c, 0x037805cb, 0x01354645, 0x03543457, 0x0218cde6, 0x0177b5f4, 0x01daaa8c, 0x02e5719d, 0x01bdd366, 0x0024edce}}, Y: Field{[10]uint32{0x01cf3627, 0x02e21b89, 0x03fb4748, 0x03c71f22, 0x017afea5, 0x02b83f2b, 0x03af5b96, 0x023aa98c, 0x01356c2f, 0x000093b1}}}, + {X: Field{[10]uint32{0x00443394, 0x00fc88c0, 0x00f95d41, 0x02496260, 0x006d313b, 0x02030455, 0x0382f801, 0x03968b6f, 0x0004da7a, 0x001ccb3d}}, Y: Field{[10]uint32{0x01596953, 0x035e2693, 0x01e431b7, 0x021054f2, 0x02e88200, 0x029dded5, 0x02eae580, 0x02e42a40, 0x03261758, 0x002163a0}}}, + {X: Field{[10]uint32{0x01d36e32, 0x0296652a, 0x02f7528e, 0x00ad6f92, 0x0365fc25, 0x006e0e2d, 0x002e024a, 0x0000b4fe, 0x03192c40, 0x003bf781}}, Y: Field{[10]uint32{0x01d9107b, 0x00be034f, 0x01483f0c, 0x02d5a751, 0x03b8dd69, 0x020ea71b, 0x02635851, 0x00d5da46, 0x035c3a15, 0x00227074}}}, + {X: Field{[10]uint32{0x02c90a15, 0x03764307, 0x034a6b42, 0x016e6c69, 0x02f114e6, 0x02a542f6, 0x0020c1cd, 0x00ce49d9, 0x02f28069, 0x0027bb6a}}, Y: Field{[10]uint32{0x03164de2, 0x022e81f4, 0x035337de, 0x03842b0e, 0x0226f427, 0x0134a314, 0x009728da, 0x010334c9, 0x00247fa5, 0x0004e677}}}, + {X: Field{[10]uint32{0x01433195, 0x034f5086, 0x017dd877, 0x031f52e8, 0x03775805, 0x03f6d21f, 0x01eaafeb, 0x028851a7, 0x028d342a, 0x0008fc3a}}, Y: Field{[10]uint32{0x03699b03, 0x02ff5182, 0x0306e4fc, 0x030e79f0, 0x0163444d, 0x0353a4f0, 0x032ca8d1, 0x02071574, 0x0231d2a4, 0x0037071b}}}, + {X: Field{[10]uint32{0x03e060b8, 0x032ddbaa, 0x0052c074, 0x003538cc, 0x02edd47c, 0x01a8c174, 0x0116e827, 0x02798162, 0x027058c2, 0x00003614}}, Y: Field{[10]uint32{0x010cfac8, 0x03f69baf, 0x012583a2, 0x02da2a68, 0x0384d497, 0x027a9264, 0x009e5105, 0x016ee57b, 0x0104e4db, 0x00268392}}}, + {X: Field{[10]uint32{0x009f28b8, 0x02411acc, 0x0363ad4d, 0x00ddeacd, 0x00f7d36b, 0x0033ce18, 0x022d2d19, 0x00481164, 0x015cccf9, 0x0006cd32}}, Y: Field{[10]uint32{0x0151e948, 0x0128478a, 0x0008f6f1, 0x03a246ed, 0x01f7080d, 0x0181f2d3, 0x0078c3d2, 0x0198ead9, 0x020c3f5f, 0x001c308c}}}, + {X: Field{[10]uint32{0x0384b228, 0x02851cd2, 0x028c28fc, 0x00d85263, 0x0289569d, 0x03c41c1e, 0x016d4e20, 0x0165aedd, 0x03dcae5e, 0x000c9563}}, Y: Field{[10]uint32{0x02038d86, 0x0241be45, 0x03cfb501, 0x0381d2db, 0x01fe63f6, 0x0356ab36, 0x03978c43, 0x01d56ec8, 0x00b75ed5, 0x001dd66a}}}, + {X: Field{[10]uint32{0x01984acd, 0x032c7a37, 0x02bf8577, 0x03b3e8f5, 0x016028d7, 0x00102bef, 0x01a38202, 0x02f15ce4, 0x037737d2, 0x00192062}}, Y: Field{[10]uint32{0x01ca2300, 0x001d225c, 0x03e1f057, 0x03b29c99, 0x012cf895, 0x0298c12f, 0x027b8914, 0x01553648, 0x01346ae9, 0x001080ae}}}, + {X: Field{[10]uint32{0x0177b333, 0x00b61f63, 0x031aae57, 0x0015cb86, 0x01bcd337, 0x010a2154, 0x02a23732, 0x01f2d50a, 0x02c6ec2d, 0x0031abda}}, Y: Field{[10]uint32{0x02c78cbf, 0x031f36b7, 0x023529fc, 0x022e17c8, 0x015d5af1, 0x034101fb, 0x02393bcd, 0x028b7c63, 0x01594ae5, 0x003fff95}}}, + {X: Field{[10]uint32{0x00f1cef0, 0x00378fa9, 0x02f13a8b, 0x00d0a3ba, 0x002e7a9e, 0x03ccbf51, 0x022a0317, 0x004be03e, 0x004494ea, 0x00247e3f}}, Y: Field{[10]uint32{0x0154dbcf, 0x03fdb669, 0x02a42481, 0x0097aba8, 0x03e76c22, 0x003309ab, 0x02765f42, 0x007742b1, 0x007ad81b, 0x0001a829}}}, + {X: Field{[10]uint32{0x01c1c017, 0x00ff1084, 0x016c8e35, 0x01848cd7, 0x02dc610a, 0x030056d1, 0x01b081fd, 0x03d5f21e, 0x01fa6a26, 0x0038566a}}, Y: Field{[10]uint32{0x013e8851, 0x0126beaa, 0x010b6bd7, 0x031f2a07, 0x00f1c181, 0x013077cb, 0x01656f9b, 0x0380269d, 0x0243445a, 0x00308271}}}, + {X: Field{[10]uint32{0x00f9330b, 0x02fae969, 0x01813556, 0x01a6e279, 0x031a7051, 0x001b4a0f, 0x011eda9c, 0x00ea5c48, 0x005e135f, 0x003a3a7f}}, Y: Field{[10]uint32{0x01af0abb, 0x02c4353a, 0x01553fe0, 0x02e7cff1, 0x01c88423, 0x03c7912d, 0x03b55fa6, 0x03a3db69, 0x00993b73, 0x003a2e5a}}}, + {X: Field{[10]uint32{0x000edead, 0x010d4daf, 0x035b1642, 0x0062bbbe, 0x0011aa98, 0x004ce12d, 0x0027ec6e, 0x013030db, 0x0129d5ae, 0x003cfd75}}, Y: Field{[10]uint32{0x033d34b9, 0x016f9876, 0x02ae533f, 0x00190f94, 0x021dd1e3, 0x03f1782a, 0x01abbc4f, 0x0304ccd1, 0x02431e40, 0x000fdd01}}}, + {X: Field{[10]uint32{0x00c81159, 0x013db5db, 0x0206a02e, 0x01727285, 0x0209eae6, 0x00505d80, 0x039acffe, 0x02ee6b86, 0x0030f5d8, 0x00316dd9}}, Y: Field{[10]uint32{0x032429c1, 0x03a1b633, 0x00fad0d2, 0x00ce6800, 0x0229b139, 0x02454e02, 0x00875916, 0x02426090, 0x03097008, 0x00201a27}}}, + {X: Field{[10]uint32{0x00fc09b0, 0x01442703, 0x00261e93, 0x0191ca25, 0x00ff2755, 0x03edb6d4, 0x02d30c9f, 0x0241d117, 0x00b434f5, 0x002552a9}}, Y: Field{[10]uint32{0x0072e4ad, 0x01974f43, 0x00ec5832, 0x01ba029c, 0x03a808b7, 0x00ec3f3c, 0x0176be8b, 0x00b095b3, 0x02861bad, 0x002008f2}}}, + {X: Field{[10]uint32{0x023d528b, 0x03c4cd5b, 0x00249d6d, 0x01512eed, 0x021b96ee, 0x002960cd, 0x020c9b93, 0x03cce4c0, 0x00bb4803, 0x0001576a}}, Y: Field{[10]uint32{0x02e5b64c, 0x03bdf38c, 0x02575799, 0x0134d568, 0x002387b1, 0x02805e17, 0x00bb209d, 0x03a7d61b, 0x0388ca06, 0x00373112}}}, + {X: Field{[10]uint32{0x03a1de03, 0x01fe2ee8, 0x0236877a, 0x02f285db, 0x01db59ea, 0x0098ad38, 0x02d48d3d, 0x02ca1ac2, 0x0000d810, 0x0020213a}}, Y: Field{[10]uint32{0x03dc1480, 0x0223f118, 0x00f85e08, 0x02b3acd2, 0x00070d60, 0x02f17e60, 0x0309c129, 0x0197f027, 0x029c59f8, 0x00362fba}}}, + {X: Field{[10]uint32{0x0318b39b, 0x03be9055, 0x00bd7f85, 0x005ec030, 0x03d15e02, 0x00252526, 0x00f49a15, 0x01fe21d2, 0x02c236c8, 0x0006caed}}, Y: Field{[10]uint32{0x01029c74, 0x006b4514, 0x001dc810, 0x00b02c3a, 0x00c3c3f4, 0x01afaa69, 0x03dd0180, 0x03cdbbc6, 0x01956aad, 0x0008592c}}}, + {X: Field{[10]uint32{0x00377872, 0x0368e295, 0x02d84830, 0x03667e46, 0x01de9139, 0x034bfafb, 0x01c65ce3, 0x030dcb97, 0x03e80125, 0x003ee9a1}}, Y: Field{[10]uint32{0x03e001c9, 0x00fb049c, 0x03f83092, 0x03c95fd2, 0x0355aabb, 0x0016a584, 0x00a7a821, 0x02540729, 0x02df03b8, 0x0022513a}}}, + {X: Field{[10]uint32{0x01560cbd, 0x038b7fbf, 0x03a948aa, 0x017bc246, 0x03d21e15, 0x0168b5e5, 0x00699c97, 0x0305bfe7, 0x0380a5f1, 0x002d6392}}, Y: Field{[10]uint32{0x02cec3ec, 0x02944a14, 0x02fec937, 0x01f64097, 0x0304606f, 0x00b5aaa5, 0x031b7f41, 0x02fe9b95, 0x02ba1429, 0x003ffe72}}}, + {X: Field{[10]uint32{0x0026edec, 0x03c5f38d, 0x02900fce, 0x01f2750e, 0x00114fdb, 0x00171af9, 0x0222551e, 0x01b08554, 0x0126da5d, 0x0023af35}}, Y: Field{[10]uint32{0x013aa97e, 0x01f7e194, 0x0021eae9, 0x00d2bbb7, 0x03de11f0, 0x014bd519, 0x02aafb1a, 0x0006d8fa, 0x03986b33, 0x001ce83e}}}, + {X: Field{[10]uint32{0x03ee325e, 0x0159a446, 0x00d2dbb9, 0x00c99010, 0x037354e0, 0x025c5526, 0x01c68f0e, 0x00a7a257, 0x000b924b, 0x003ee915}}, Y: Field{[10]uint32{0x0105ebd4, 0x039bd464, 0x0321b6c9, 0x009c5bd4, 0x02290f3c, 0x0394a10e, 0x02ba0d07, 0x015eb8d0, 0x00c33b98, 0x0014a422}}}, + {X: Field{[10]uint32{0x039c44de, 0x01bd3a2f, 0x025b0ab4, 0x025d946c, 0x02ce014c, 0x01bcfcdb, 0x006301a6, 0x034c91b6, 0x0097a1a7, 0x0022de8b}}, Y: Field{[10]uint32{0x00b247c7, 0x00ca3f69, 0x017b94cb, 0x02110ff0, 0x027c88a6, 0x007a9d4d, 0x006c1f47, 0x00d6cd9e, 0x00ab699c, 0x002e0a15}}}, + {X: Field{[10]uint32{0x02d2279c, 0x00e6963a, 0x0096f40c, 0x01dd2f52, 0x03931796, 0x006ea426, 0x0003bbba, 0x01c5539c, 0x03435adb, 0x00277c45}}, Y: Field{[10]uint32{0x01b884eb, 0x03c866d0, 0x02f8377e, 0x019775e8, 0x01d45668, 0x01eae190, 0x02913d6e, 0x0330db0d, 0x034ea216, 0x0029e48b}}}, + {X: Field{[10]uint32{0x02931cd8, 0x02b6b915, 0x03e9e414, 0x005707e6, 0x02c54b62, 0x01cc5224, 0x02fd9e73, 0x0111320b, 0x0384749b, 0x0016fade}}, Y: Field{[10]uint32{0x03abb95c, 0x0183a6cb, 0x01f7b64f, 0x03f3ad47, 0x03d32b7c, 0x03cc23bf, 0x02753fbf, 0x0029f0a3, 0x025f32cd, 0x00026790}}}, + {X: Field{[10]uint32{0x00788879, 0x004abd93, 0x02f43cd5, 0x01745c19, 0x01c9f8ed, 0x028edec2, 0x005114f4, 0x0012e9e3, 0x00430ff2, 0x000aa0c3}}, Y: Field{[10]uint32{0x02666c84, 0x02588c18, 0x0286561e, 0x00267b90, 0x009ba148, 0x0081fac0, 0x02827fed, 0x00994bae, 0x03a4e888, 0x00004948}}}, + {X: Field{[10]uint32{0x0057486a, 0x02488787, 0x014191b6, 0x00500670, 0x00985a77, 0x0334cb65, 0x00ab408b, 0x00a8639a, 0x02a14c1f, 0x003dc691}}, Y: Field{[10]uint32{0x00534875, 0x01d6db48, 0x00f0aef6, 0x00feca07, 0x034fac44, 0x03303683, 0x00ce36a4, 0x02694d3f, 0x033e0ea7, 0x002b7c66}}}, + {X: Field{[10]uint32{0x029d193b, 0x010da9f1, 0x012fdcb6, 0x02acdb10, 0x00bbad2b, 0x01f58f03, 0x00ae2d9f, 0x00acc59e, 0x01dcaa9c, 0x000ae039}}, Y: Field{[10]uint32{0x022119c3, 0x00875880, 0x00ffa276, 0x00670821, 0x038f3c90, 0x0141891e, 0x001ce04c, 0x00018ada, 0x004d71d6, 0x002f20f8}}}, + {X: Field{[10]uint32{0x023beece, 0x0148d739, 0x01d5bb97, 0x00300f11, 0x0175424a, 0x011124d0, 0x0375b58d, 0x031a71a0, 0x033be521, 0x001272f7}}, Y: Field{[10]uint32{0x0062de7f, 0x01b12697, 0x017a8ae4, 0x03c558e6, 0x0291d260, 0x00e84dab, 0x0356abad, 0x039f3b0d, 0x02eaf0f0, 0x00315857}}}, + {X: Field{[10]uint32{0x029ee1b2, 0x016e8c73, 0x0373979c, 0x00ee72a1, 0x03f7aa66, 0x03741c3d, 0x015e2f31, 0x02c45648, 0x0314b643, 0x00339351}}, Y: Field{[10]uint32{0x02feac38, 0x023f76c7, 0x010aad6f, 0x02d08030, 0x00479745, 0x0188406c, 0x0359ef5e, 0x00ea8d36, 0x0212a2fc, 0x002c7cd7}}}, + {X: Field{[10]uint32{0x01e10054, 0x00b53758, 0x01656299, 0x01e7b5f1, 0x01a8bef4, 0x03562071, 0x013bb1b5, 0x016b0e36, 0x02bbaa90, 0x001a09ed}}, Y: Field{[10]uint32{0x016bb869, 0x03e3b3ca, 0x0064d1af, 0x009dfbc8, 0x0030fc37, 0x016007d5, 0x00484279, 0x00083646, 0x007baf65, 0x0021492a}}}, + {X: Field{[10]uint32{0x0056535f, 0x03d2b460, 0x0112519a, 0x0062c5b7, 0x00ab9472, 0x000e9268, 0x037879aa, 0x035fc71e, 0x00d548f4, 0x00039c79}}, Y: Field{[10]uint32{0x0232f574, 0x006ece03, 0x01c09f0d, 0x01a0f7b4, 0x0383aeed, 0x02d72604, 0x03e3beda, 0x02cf55bd, 0x00617098, 0x00125741}}}, + {X: Field{[10]uint32{0x0200e032, 0x00199f1b, 0x02542632, 0x005a1cf3, 0x00656528, 0x00ffb69a, 0x036aa32a, 0x03ecc350, 0x01797429, 0x003bda0e}}, Y: Field{[10]uint32{0x0134613f, 0x028d8d41, 0x01404fbb, 0x001bc053, 0x0002f175, 0x006229ab, 0x01ed846f, 0x025fa03f, 0x024ade11, 0x002d2c63}}}, + {X: Field{[10]uint32{0x012deaf4, 0x0162c0f9, 0x0245b0a2, 0x00db07b1, 0x01dd557e, 0x038bbb61, 0x008007d0, 0x01fbffa4, 0x01c1ac8f, 0x000031ca}}, Y: Field{[10]uint32{0x021305fe, 0x01fafd15, 0x00f27bde, 0x02242b0e, 0x0312365b, 0x00cd6821, 0x02bade6a, 0x013dab17, 0x01c21858, 0x000ba0fb}}}, + {X: Field{[10]uint32{0x015735ab, 0x031fec44, 0x0288cc1c, 0x03088492, 0x01290d54, 0x02b8b7b4, 0x03c4f2c3, 0x01b54eca, 0x01199a71, 0x0033c74e}}, Y: Field{[10]uint32{0x0100e6e6, 0x02dc35b7, 0x029089b7, 0x03bab550, 0x03c276c8, 0x02ae14e2, 0x0180970d, 0x0100b3a2, 0x01a57ec3, 0x001ad13d}}}, + {X: Field{[10]uint32{0x03ecdeae, 0x03582696, 0x00f55cf9, 0x01ffe0b6, 0x01a9c28a, 0x03a4369d, 0x031f772e, 0x03b8a3cf, 0x03a0266d, 0x001b3cf5}}, Y: Field{[10]uint32{0x01bc58d4, 0x037ebad2, 0x01e14034, 0x02d3113b, 0x00ede5c9, 0x0366a66f, 0x01b9cf94, 0x03338a25, 0x03b31e11, 0x000ef463}}}, + {X: Field{[10]uint32{0x01395542, 0x01d2701f, 0x00be7f28, 0x02bb3e0c, 0x0256393c, 0x0002ba4c, 0x02e4274f, 0x03bb2b37, 0x0032ae63, 0x003692d6}}, Y: Field{[10]uint32{0x01b2210b, 0x03220633, 0x00ec4dfe, 0x038c6da5, 0x02106374, 0x005a12e4, 0x01610c9d, 0x0103c605, 0x023bd2d9, 0x0026aaec}}}, + {X: Field{[10]uint32{0x0330bbfa, 0x0357de90, 0x002d4b8a, 0x0043a561, 0x03407d1a, 0x03a8b1af, 0x0063270c, 0x00385be7, 0x03502321, 0x003e46b8}}, Y: Field{[10]uint32{0x013aa1c2, 0x00421ae4, 0x01e161b5, 0x010ccd94, 0x0153c915, 0x034f46bc, 0x029290ef, 0x0095cd65, 0x01acd196, 0x00007c58}}}, + {X: Field{[10]uint32{0x02f1ac02, 0x021d2cbc, 0x0025556c, 0x01cfe872, 0x02c72e3f, 0x01cca149, 0x0047c862, 0x00a8b916, 0x0352cc3e, 0x001f86fb}}, Y: Field{[10]uint32{0x02f6e6fe, 0x0305e1f9, 0x017f44c4, 0x008fba36, 0x0008ff05, 0x003f13d4, 0x03048fee, 0x03934f6d, 0x037ea706, 0x002f92c3}}}, + {X: Field{[10]uint32{0x03d5998f, 0x03f20534, 0x020ecb27, 0x03c52f9c, 0x03706567, 0x03724bad, 0x00e256cc, 0x00bb8dd2, 0x015d30dc, 0x0003749a}}, Y: Field{[10]uint32{0x032dc74f, 0x000a8668, 0x0396ed1a, 0x0103c3c2, 0x01bba677, 0x01151cad, 0x027cf998, 0x02004e7b, 0x0044f102, 0x0026bccb}}}, + {X: Field{[10]uint32{0x009dbb9d, 0x002ccdd9, 0x037c94d2, 0x02550fec, 0x02125fe3, 0x00ceddb6, 0x02602ba0, 0x018f2344, 0x02507147, 0x001e3eb9}}, Y: Field{[10]uint32{0x03ce3aa6, 0x0388d46f, 0x00ce121d, 0x00c81989, 0x00c3b925, 0x02bc7fa9, 0x01826e5e, 0x03339bd9, 0x000f0726, 0x001e3713}}}, + {X: Field{[10]uint32{0x01c98bd5, 0x02498da3, 0x018dfee6, 0x02e16476, 0x021b6fb6, 0x0005ad16, 0x01d3e00d, 0x01774aa8, 0x021e510e, 0x0007b7d4}}, Y: Field{[10]uint32{0x01311f86, 0x02369055, 0x00a59751, 0x034d8efb, 0x00aeafd8, 0x006ac3c8, 0x034d8177, 0x026e3743, 0x016d9b2e, 0x00268340}}}, + {X: Field{[10]uint32{0x00101d39, 0x01aa8634, 0x02b4d416, 0x0250dd58, 0x007ce286, 0x00f31a79, 0x013272cd, 0x02d82e45, 0x030c5e53, 0x002181ee}}, Y: Field{[10]uint32{0x02eb519a, 0x0159b565, 0x00e988ef, 0x015c9e49, 0x02388707, 0x01922be3, 0x01a294aa, 0x0195070d, 0x031ec83c, 0x00005728}}}, + {X: Field{[10]uint32{0x02d02eab, 0x02d97de5, 0x02df7166, 0x001e44bc, 0x03037f96, 0x010ae6ed, 0x020dbb7c, 0x000fde02, 0x000d9a05, 0x00197f4c}}, Y: Field{[10]uint32{0x02a3b5d9, 0x02e4a2d3, 0x00aa5335, 0x00f3513b, 0x02904caf, 0x03dad0fc, 0x03945401, 0x02a14847, 0x035084fb, 0x003f3454}}}, + {X: Field{[10]uint32{0x0002d148, 0x03c51633, 0x03f99f47, 0x02a4cc24, 0x0336d031, 0x01332fac, 0x01845f03, 0x01f38700, 0x03a76c84, 0x0032462c}}, Y: Field{[10]uint32{0x03728568, 0x00eb7f5f, 0x00eb53ed, 0x02772a17, 0x02059632, 0x03ea9b98, 0x00632700, 0x00b880c8, 0x0003dbbb, 0x003c95bd}}}, + {X: Field{[10]uint32{0x01661817, 0x014ab381, 0x03bb5c13, 0x03536f82, 0x01532e54, 0x0102b783, 0x02cb4291, 0x02e1e42f, 0x00fd02f0, 0x001ab0b7}}, Y: Field{[10]uint32{0x029e2af3, 0x02ab8592, 0x026dccca, 0x038c1811, 0x03784c3d, 0x01c89470, 0x0323074e, 0x00e5b16b, 0x0310abf9, 0x003cb098}}}, + {X: Field{[10]uint32{0x033f3d19, 0x02ffcbf2, 0x0295f5b0, 0x02a517da, 0x02cf8e95, 0x017facac, 0x0239b94b, 0x03ce273b, 0x00ee54ac, 0x00235c71}}, Y: Field{[10]uint32{0x031ce52d, 0x01d611c3, 0x00cb6548, 0x015e26d1, 0x03f0bc88, 0x00cc1840, 0x03a3881e, 0x030711f6, 0x03d95a02, 0x0026110a}}}, + {X: Field{[10]uint32{0x00f583c3, 0x03b84911, 0x03072b3d, 0x01a2a426, 0x002e5d73, 0x01447a1d, 0x000abbb0, 0x01c463cb, 0x00d3fd55, 0x003a2f49}}, Y: Field{[10]uint32{0x03ce6538, 0x02c6fc22, 0x0343a4d4, 0x016b3583, 0x02238028, 0x01c59167, 0x037992a6, 0x008b6d96, 0x03a6e286, 0x003874b0}}}, + {X: Field{[10]uint32{0x00075217, 0x01c9568f, 0x011d032d, 0x0092acab, 0x00483fd0, 0x00c478ed, 0x02c8c516, 0x033e2794, 0x01755cf8, 0x0018b70a}}, Y: Field{[10]uint32{0x000e2a97, 0x0247e3d7, 0x00d1e093, 0x02a523cf, 0x018b3fc8, 0x00255094, 0x0301e9cd, 0x008b6383, 0x0132d80d, 0x0001e678}}}, + {X: Field{[10]uint32{0x004c0e13, 0x014125b5, 0x01451a60, 0x013d9aa5, 0x034d4323, 0x031f4f01, 0x01027099, 0x01f9832c, 0x03aacf72, 0x000df6c4}}, Y: Field{[10]uint32{0x01b1066b, 0x0090cd22, 0x02fb0629, 0x01b7427a, 0x02d3402a, 0x0004e87d, 0x02e9d07e, 0x03bfd065, 0x03be8f8c, 0x00030e0e}}}, + {X: Field{[10]uint32{0x032aa1ab, 0x01d6cc3e, 0x02c39378, 0x00e49a67, 0x01be9dc4, 0x01cbc77c, 0x018e17c4, 0x01c67b21, 0x0365eab7, 0x000defed}}, Y: Field{[10]uint32{0x01721364, 0x014d58f4, 0x00eea23b, 0x017419bc, 0x025cf44b, 0x022be329, 0x0135f4a9, 0x031308be, 0x03fd865d, 0x001c9c62}}}, + {X: Field{[10]uint32{0x005d1b94, 0x02e914aa, 0x0145606d, 0x03f84803, 0x03b5d5c3, 0x01885229, 0x01ba6e1f, 0x02fcd57f, 0x021287fc, 0x0010cfb7}}, Y: Field{[10]uint32{0x0357c20e, 0x01765251, 0x02e60571, 0x01f1ebb9, 0x01137a4c, 0x00f8c1e0, 0x030c9591, 0x0144eca3, 0x0213ad6e, 0x002c9f15}}}, + {X: Field{[10]uint32{0x02671861, 0x02695f4f, 0x03b323af, 0x0342e2c9, 0x02d23295, 0x02adf7d1, 0x021917f6, 0x00379a4a, 0x019fc5ed, 0x0003960b}}, Y: Field{[10]uint32{0x00073154, 0x0077bff5, 0x01fd6557, 0x01cc6de3, 0x01d1c9e0, 0x021b2c74, 0x039faa53, 0x0036f5f9, 0x0385e277, 0x000cfba1}}}, + {X: Field{[10]uint32{0x009442c2, 0x00a18013, 0x0189e4e4, 0x000529a8, 0x02ad8fae, 0x003c1ab7, 0x02d4e5da, 0x03c56bb8, 0x0340634b, 0x00182c1e}}, Y: Field{[10]uint32{0x004b283d, 0x00466c6f, 0x00f37ff2, 0x027295ec, 0x011557f2, 0x02362ab1, 0x034a2cd6, 0x010ee98a, 0x03cd00d2, 0x003fb821}}}, + {X: Field{[10]uint32{0x01e03100, 0x0196b4cb, 0x009b2102, 0x029f38df, 0x02643e6d, 0x01ba23ee, 0x0245e35b, 0x03df2828, 0x027601e5, 0x0012c59c}}, Y: Field{[10]uint32{0x02d8dde7, 0x024324e3, 0x00a6473b, 0x00aed8c5, 0x00cacda0, 0x03547c57, 0x0126c1dc, 0x021f8243, 0x03024768, 0x000a2ab3}}}, + {X: Field{[10]uint32{0x022a3170, 0x034be6ff, 0x027b2a17, 0x03853b53, 0x02fab97d, 0x026a22b8, 0x0003e638, 0x01f9d312, 0x013d6d79, 0x00175584}}, Y: Field{[10]uint32{0x01cd524f, 0x00ac79f6, 0x033abee4, 0x024b8b65, 0x02c65459, 0x03acacd3, 0x02462a27, 0x02cbfe98, 0x02a8534e, 0x000253bc}}}, + {X: Field{[10]uint32{0x0234f828, 0x02cf418e, 0x03a7ee38, 0x0363ca37, 0x03f4a06c, 0x03a3111c, 0x01572878, 0x006b6344, 0x03ae7511, 0x002a740f}}, Y: Field{[10]uint32{0x03517881, 0x0347e54c, 0x0262e4d9, 0x02d31f78, 0x03480c94, 0x01a3daea, 0x02665bf9, 0x0261e4b2, 0x000cc731, 0x00281ccf}}}, + {X: Field{[10]uint32{0x020e1ad5, 0x0157c959, 0x00522508, 0x0058599b, 0x0058fd37, 0x02cfdf9c, 0x00db3b77, 0x02f3a7b5, 0x01712b1a, 0x001d0665}}, Y: Field{[10]uint32{0x00da44db, 0x019ef640, 0x0385f22b, 0x03062ab0, 0x00ea3ef2, 0x009c9800, 0x013b8a32, 0x01d6273f, 0x02a8097f, 0x001c432b}}}, + {X: Field{[10]uint32{0x01918dc8, 0x02ae5bc9, 0x00be7cab, 0x03cab31a, 0x02ba0106, 0x0119cf85, 0x03a1e5f8, 0x0296c7ba, 0x010dbf81, 0x0027c5a6}}, Y: Field{[10]uint32{0x00ebc4f5, 0x01962314, 0x007b0f0b, 0x03c7a996, 0x03135d46, 0x000e01aa, 0x0049d39c, 0x004108d3, 0x007b6232, 0x00035835}}}, + {X: Field{[10]uint32{0x0301d57d, 0x01c302c8, 0x00619b6a, 0x03d322c9, 0x03c99143, 0x02af4569, 0x011c888f, 0x02e69eb6, 0x01bc4f12, 0x000ed41a}}, Y: Field{[10]uint32{0x01dd1a79, 0x020a31ff, 0x035a8979, 0x013aa1ad, 0x02da1854, 0x02cc4759, 0x034ddfd4, 0x02a5127e, 0x00d1ae59, 0x0036ee1f}}}, + {X: Field{[10]uint32{0x02baee90, 0x026e51b6, 0x01c68115, 0x035c26dd, 0x01f90cdc, 0x02feaecc, 0x03bf9afb, 0x028db82e, 0x03a967b5, 0x00277a98}}, Y: Field{[10]uint32{0x02bc4464, 0x019989f1, 0x01e57b8a, 0x03ae5353, 0x0305c7d2, 0x02460348, 0x01a605ce, 0x02e5638c, 0x019b11ba, 0x002c52ee}}}, + {X: Field{[10]uint32{0x01e31e79, 0x0377d215, 0x03a188e0, 0x00b30cf0, 0x0309fe6b, 0x0104798e, 0x025cb534, 0x01aa1095, 0x03921da3, 0x00342c8c}}, Y: Field{[10]uint32{0x0374f8e9, 0x010d7943, 0x02a7515c, 0x01d90fed, 0x02991172, 0x00d42cec, 0x02f1cfcc, 0x01524b72, 0x03ea1a6e, 0x00203b64}}}, + {X: Field{[10]uint32{0x00b03d20, 0x0205ece4, 0x01da552c, 0x0323dc44, 0x03acfe85, 0x03d1078f, 0x00ca7a49, 0x03912fe6, 0x0255966a, 0x0022b725}}, Y: Field{[10]uint32{0x03c0021e, 0x0069b95c, 0x013b4eed, 0x019b6c6e, 0x005dd1d5, 0x024cdd0c, 0x00c80eac, 0x01cc4860, 0x014c6a71, 0x00339c81}}}, + {X: Field{[10]uint32{0x020c1670, 0x0059c987, 0x03fe3ec9, 0x00438b84, 0x02141ac6, 0x00062929, 0x00800b6d, 0x00f7a9c0, 0x03f8cf6d, 0x003dbdda}}, Y: Field{[10]uint32{0x039a302c, 0x0070e54f, 0x01a54e24, 0x03dd9913, 0x0263e4fe, 0x01ace93b, 0x025e2a10, 0x0261da63, 0x00afe1ea, 0x002cb11e}}}, + {X: Field{[10]uint32{0x00b898e5, 0x00f61bc5, 0x039fef87, 0x0235b697, 0x03217638, 0x01cece44, 0x00fcaa18, 0x0368c05d, 0x007d38b7, 0x0003560a}}, Y: Field{[10]uint32{0x02fc8402, 0x00ba7b1a, 0x005ee350, 0x03d58795, 0x03da2b8f, 0x0052b433, 0x018f91d1, 0x00217a0c, 0x013469ed, 0x001e17f2}}}, + {X: Field{[10]uint32{0x01a3661c, 0x02fd9d0e, 0x0354a02f, 0x0047d2e0, 0x01538e3d, 0x0361c0b0, 0x03e810c6, 0x03b9567f, 0x022350c5, 0x001ddcb2}}, Y: Field{[10]uint32{0x006edddb, 0x036690da, 0x00d6c931, 0x02a2b87f, 0x03fe3dd3, 0x00fa6393, 0x008aefb2, 0x0368516d, 0x02de853f, 0x001688c4}}}, + {X: Field{[10]uint32{0x02433ad5, 0x01c177dc, 0x02308069, 0x00f9dab7, 0x0046ce90, 0x03f0fecb, 0x010ac95e, 0x00da1deb, 0x0176c50f, 0x0028be7e}}, Y: Field{[10]uint32{0x00c285f3, 0x03c15bf2, 0x0238a22a, 0x012da2be, 0x01f201dd, 0x03e35d11, 0x0211b22b, 0x0227ccd7, 0x031124c2, 0x003b1594}}}, + {X: Field{[10]uint32{0x038b15f7, 0x0086a013, 0x0211bcb2, 0x019ad4b3, 0x0026fce1, 0x02b49c44, 0x010ec165, 0x03159c93, 0x036585f8, 0x00388365}}, Y: Field{[10]uint32{0x018f33fb, 0x01753766, 0x0031bfc8, 0x008059ab, 0x0321d082, 0x01aaed52, 0x0348b6bc, 0x00e18a62, 0x0133c7f6, 0x0018ed86}}}, + {X: Field{[10]uint32{0x00ecc18f, 0x033b00eb, 0x0093e42d, 0x0222cafc, 0x03659ba6, 0x001b6c77, 0x0298d945, 0x00778b2f, 0x019d00ca, 0x00221a2d}}, Y: Field{[10]uint32{0x00f2fd0e, 0x005760ff, 0x03076e22, 0x0146bed4, 0x02dea562, 0x01493afd, 0x01dbfe84, 0x023ec014, 0x030796b9, 0x003c0ba6}}}, + {X: Field{[10]uint32{0x01fb677c, 0x01606e22, 0x016a43f8, 0x0099e09b, 0x0099c832, 0x029afc3a, 0x005f86b9, 0x004d869e, 0x002fe32a, 0x0004267e}}, Y: Field{[10]uint32{0x0044445b, 0x03cdf627, 0x01aac7fc, 0x01866bfa, 0x02cd2d3e, 0x024bab11, 0x0320cd35, 0x03c9c4b3, 0x03f29aa7, 0x0004fee0}}}, + {X: Field{[10]uint32{0x01cbeea3, 0x00147d0d, 0x01d31ef2, 0x032bb8b5, 0x03deae65, 0x032986c9, 0x03329698, 0x039ecd7d, 0x029677ec, 0x0012be71}}, Y: Field{[10]uint32{0x024e5ef0, 0x00420999, 0x006985b2, 0x025a04c3, 0x00ebfe51, 0x00910229, 0x02e3f80a, 0x02a5dbe5, 0x0196429d, 0x001cc011}}}, + {X: Field{[10]uint32{0x03dab473, 0x00ed50d5, 0x02045edb, 0x022f45bb, 0x01300d1f, 0x01c4f2ae, 0x02d4bbe8, 0x02e2c0c8, 0x03ca5ace, 0x0025a032}}, Y: Field{[10]uint32{0x010df58a, 0x004c766f, 0x02aec0e9, 0x00f09e62, 0x006904ee, 0x0026ccf8, 0x014697c2, 0x02874bb3, 0x0140e36b, 0x000bca4e}}}, + {X: Field{[10]uint32{0x03fae7c2, 0x036e6b89, 0x000ee4e2, 0x03eb5ba7, 0x023eb7fd, 0x00520324, 0x01c37203, 0x011fc17e, 0x003afd63, 0x001fbbf3}}, Y: Field{[10]uint32{0x035cac06, 0x023c42fe, 0x0357e973, 0x0276b3ac, 0x007bb93d, 0x01eec78a, 0x0353e421, 0x017051f1, 0x02754f74, 0x002e3a7e}}}, + {X: Field{[10]uint32{0x039fddb4, 0x0351becb, 0x002fe98f, 0x0016c097, 0x01065e78, 0x02252557, 0x021fbf36, 0x004ae4d1, 0x0156d636, 0x0002e08c}}, Y: Field{[10]uint32{0x00bd465a, 0x02771604, 0x0360cdab, 0x031a8aa3, 0x00d0b537, 0x03a7ab75, 0x03453ebf, 0x03a47917, 0x017a826f, 0x003c8f14}}}, + {X: Field{[10]uint32{0x01bdadd9, 0x005134e1, 0x002b44d5, 0x008ba246, 0x01bfb9de, 0x00b9d96a, 0x0178706e, 0x03f55248, 0x035e2035, 0x003a0074}}, Y: Field{[10]uint32{0x02956a26, 0x0186025d, 0x03478481, 0x0000fea9, 0x011c2162, 0x00678dea, 0x00868e04, 0x039bc206, 0x023427de, 0x00079920}}}, + {X: Field{[10]uint32{0x01c67f3a, 0x0123d4b3, 0x01a1c2f3, 0x01402122, 0x0029fd77, 0x01fa243f, 0x00369e50, 0x0025a4a1, 0x010e56b7, 0x003a7518}}, Y: Field{[10]uint32{0x008e4a0e, 0x02a13fad, 0x02c1f7d9, 0x008895f0, 0x031df0e6, 0x03b9145a, 0x01bfca22, 0x020b868a, 0x02ac357d, 0x002397da}}}, + {X: Field{[10]uint32{0x03b7609b, 0x0206bdb4, 0x028ff4a4, 0x022838d4, 0x00b94bae, 0x011a0021, 0x00d7aa09, 0x0377b8d0, 0x030f51d6, 0x001c70fb}}, Y: Field{[10]uint32{0x015f6b96, 0x03d5f8cc, 0x03ca4544, 0x0351264b, 0x03db6886, 0x02985690, 0x00adc4da, 0x021e8c4e, 0x00dc2f80, 0x0013459d}}}, + {X: Field{[10]uint32{0x027d6f20, 0x02670392, 0x03947ce9, 0x020f055e, 0x0121aadb, 0x00e2aeb1, 0x038b44d9, 0x03107ef7, 0x0243b6f5, 0x002559f3}}, Y: Field{[10]uint32{0x03a35538, 0x0280084c, 0x00fe35e2, 0x0366cb79, 0x011fd0fd, 0x011730d7, 0x0247ca89, 0x028c6029, 0x0317031e, 0x00327618}}}, + {X: Field{[10]uint32{0x02dcc141, 0x02c8ade3, 0x0163eb9d, 0x014c3f62, 0x014f8fc7, 0x00468648, 0x033de850, 0x019ce442, 0x014f8116, 0x000d148f}}, Y: Field{[10]uint32{0x0022ac90, 0x03a43121, 0x01ce77d6, 0x0213c9df, 0x02877bca, 0x009df62e, 0x000a0660, 0x0223ae6e, 0x01fe268b, 0x002403ee}}}, + {X: Field{[10]uint32{0x03c1bd98, 0x002b5e78, 0x01278159, 0x03f2d873, 0x01f2993d, 0x0083973c, 0x034350bf, 0x010f7e8b, 0x037e5f1c, 0x001a7f47}}, Y: Field{[10]uint32{0x0051d7f3, 0x0327ce9b, 0x01615043, 0x008caf37, 0x0302d1c9, 0x0249de5c, 0x0315665a, 0x02502bb6, 0x02cf8b74, 0x0018cdc9}}}, + {X: Field{[10]uint32{0x014a3de7, 0x021e2bfa, 0x03aa2a9f, 0x01d78c5f, 0x02411b2a, 0x02d3f1ae, 0x006dd39b, 0x02e3dcc5, 0x0024c28c, 0x003930b1}}, Y: Field{[10]uint32{0x0321ae89, 0x022a527a, 0x01158fcc, 0x023a6cef, 0x01c86137, 0x00814573, 0x02607398, 0x017bd236, 0x03e8468e, 0x003ee345}}}, + {X: Field{[10]uint32{0x00e32773, 0x035ec78d, 0x019ea5de, 0x004c8984, 0x0398e445, 0x03125218, 0x01feb590, 0x005b4270, 0x019aada9, 0x0015c411}}, Y: Field{[10]uint32{0x023871bc, 0x00fb2939, 0x009f0738, 0x00abccfd, 0x02905bf1, 0x002a0d57, 0x016b4093, 0x00e96139, 0x01bdd2d8, 0x002277bb}}}, + {X: Field{[10]uint32{0x03d48e64, 0x0085e81b, 0x01bc189b, 0x02a642e1, 0x0359a3a8, 0x01c406c9, 0x0017f913, 0x001b856b, 0x02d41718, 0x00355beb}}, Y: Field{[10]uint32{0x00a6652c, 0x00c511cd, 0x038c76d7, 0x01de9221, 0x01ebe439, 0x00da3d52, 0x02f513f5, 0x02cb5ad8, 0x02c33408, 0x003ea1c7}}}, + {X: Field{[10]uint32{0x02599bcb, 0x014976ea, 0x003f7604, 0x004a0134, 0x00cb5cf0, 0x03b7e1f7, 0x0347be8e, 0x02016da2, 0x02ebda0b, 0x0039d05b}}, Y: Field{[10]uint32{0x01a56c19, 0x03d510ae, 0x01185bbc, 0x00dc4ec4, 0x03533d4f, 0x01f90c52, 0x03eb4c77, 0x0159f8c4, 0x0316f11c, 0x00218431}}}, + {X: Field{[10]uint32{0x01fa997d, 0x03c581f5, 0x0175f2d5, 0x0291b980, 0x02a4fbfc, 0x00f38cb1, 0x00606081, 0x00d50647, 0x0062ebdd, 0x00232966}}, Y: Field{[10]uint32{0x037698f4, 0x0355a478, 0x031c6980, 0x03bbeab5, 0x01113dd6, 0x00ac5343, 0x01fa1950, 0x03fab1ab, 0x000fb132, 0x002abcd2}}}, + {X: Field{[10]uint32{0x03243413, 0x02e9bc54, 0x0218172f, 0x0314a30a, 0x036eb8e4, 0x011b1480, 0x015867a8, 0x00ed1464, 0x00451fd4, 0x001925b7}}, Y: Field{[10]uint32{0x004da1f2, 0x01358939, 0x03e87cb1, 0x02f1722c, 0x03153fe2, 0x00a4b3c6, 0x00a281b9, 0x03267b80, 0x00410f85, 0x000113f7}}}, + {X: Field{[10]uint32{0x01925a5d, 0x02cbf064, 0x035d6c9c, 0x008753a3, 0x0067d207, 0x032b3348, 0x00bc248d, 0x0105aa8e, 0x0063aa82, 0x000e9091}}, Y: Field{[10]uint32{0x02fa9fb2, 0x01e11922, 0x03ca9c31, 0x02fea949, 0x00d4857a, 0x01f206fc, 0x00775cb3, 0x0096450d, 0x0063fd24, 0x001c6959}}}, + {X: Field{[10]uint32{0x0178c2e6, 0x01344274, 0x03418157, 0x0079ade1, 0x03881178, 0x02a17f98, 0x03f7985a, 0x014652b6, 0x030551d5, 0x001aa516}}, Y: Field{[10]uint32{0x0357ac44, 0x03a67fe6, 0x01d31924, 0x03c4c989, 0x0380df9a, 0x0099f289, 0x0021fc0d, 0x02a0d8c9, 0x003a1ca3, 0x00061b4d}}}, + {X: Field{[10]uint32{0x02add47f, 0x03f5df4e, 0x008aac9f, 0x003adfe3, 0x0132baac, 0x031704ec, 0x027381b8, 0x0012dedf, 0x0292682d, 0x0004fc7d}}, Y: Field{[10]uint32{0x02e99f0e, 0x02a92b89, 0x03ce2282, 0x00cce311, 0x03433725, 0x01745003, 0x03368528, 0x03fe227a, 0x01e49622, 0x0015ca81}}}, + {X: Field{[10]uint32{0x02804330, 0x0198d2f4, 0x02522a51, 0x001f9533, 0x01a27007, 0x03b6ddfd, 0x018e7b33, 0x03a3c7b6, 0x03c14f0d, 0x001e7e84}}, Y: Field{[10]uint32{0x01987c65, 0x02247bb5, 0x03aa096e, 0x02ad68bb, 0x00cf2484, 0x0183dc66, 0x001e40e0, 0x027b9cfd, 0x0188e196, 0x0028252f}}}, + {X: Field{[10]uint32{0x0133130a, 0x0280f6f9, 0x011019dd, 0x01f6ecf7, 0x01fb0837, 0x029b6acf, 0x033f7350, 0x006fdf09, 0x02dbd2c6, 0x0037c7fd}}, Y: Field{[10]uint32{0x023f886e, 0x02584764, 0x02824fd1, 0x02dd6ac3, 0x00cd0061, 0x023452a5, 0x025c969d, 0x021a264b, 0x03ad68c5, 0x0000bf71}}}, + {X: Field{[10]uint32{0x02cbdb34, 0x021b4a86, 0x032ec51d, 0x006f7de5, 0x032bff65, 0x00204331, 0x00f87760, 0x00e6b460, 0x02805f59, 0x002a088c}}, Y: Field{[10]uint32{0x03c2dfba, 0x013fed45, 0x025b5278, 0x00ab52c4, 0x01e7f2ef, 0x00010dd4, 0x02ea9b44, 0x00d8caca, 0x010f982e, 0x0025a056}}}, + {X: Field{[10]uint32{0x004c7c44, 0x01a9a212, 0x018c479e, 0x02b6e8ff, 0x02b3780f, 0x00f1ce4c, 0x010ada16, 0x02fd61a6, 0x00c049f3, 0x00101ac3}}, Y: Field{[10]uint32{0x036503dd, 0x008205f7, 0x012d31bb, 0x00ca1646, 0x028b2179, 0x0062bb9f, 0x0074fe02, 0x023951e4, 0x00eff250, 0x002aac39}}}, + {X: Field{[10]uint32{0x0116bcc8, 0x00cc033d, 0x014604b7, 0x03ab6eb2, 0x00523c81, 0x031366f2, 0x00f103db, 0x011e70f7, 0x03fd5783, 0x00139c10}}, Y: Field{[10]uint32{0x002d1133, 0x014f5a7a, 0x007fa98f, 0x02d9ce93, 0x0177c859, 0x01b24989, 0x0033ead6, 0x006f47a0, 0x03b73ed0, 0x000658a1}}}, + {X: Field{[10]uint32{0x033e9997, 0x03d003c3, 0x0344e43c, 0x0003a74b, 0x00a7d55b, 0x03c9301c, 0x0175c0ef, 0x0297d641, 0x0271b945, 0x002a68a9}}, Y: Field{[10]uint32{0x020c6285, 0x029636db, 0x014ca5b2, 0x0390ed1b, 0x039ae22c, 0x03dfcbcf, 0x03f957ca, 0x009c5459, 0x0220cb97, 0x001b3517}}}, + {X: Field{[10]uint32{0x003d3c01, 0x028ffca2, 0x0208b22b, 0x031da01d, 0x0312b2de, 0x00c569bb, 0x0247ae49, 0x02ba23ee, 0x039475ff, 0x001a4a84}}, Y: Field{[10]uint32{0x02e46131, 0x0197059b, 0x0340685a, 0x00fc2018, 0x00c83477, 0x029df458, 0x02867321, 0x01295302, 0x034a03c1, 0x001d3756}}}, + {X: Field{[10]uint32{0x022cfad8, 0x02aa3235, 0x016e77dd, 0x02b3d740, 0x01063b44, 0x0003f352, 0x0128e75d, 0x00e2ee22, 0x01fd1566, 0x000dbe45}}, Y: Field{[10]uint32{0x0042e8b9, 0x01fd76fa, 0x00e3c0cf, 0x02c38dff, 0x02991dc8, 0x008b3db7, 0x0217d027, 0x03460d7b, 0x02b616ed, 0x0000fc47}}}, + {X: Field{[10]uint32{0x02a53b31, 0x028e3592, 0x02c8f99a, 0x01f82ece, 0x00a5202a, 0x00d90c51, 0x002fd6ca, 0x00302d51, 0x035a7e01, 0x000fc3db}}, Y: Field{[10]uint32{0x0035c649, 0x027f41c3, 0x01f9ab86, 0x035fc4f3, 0x03ab1f9e, 0x02c3fecf, 0x00099acd, 0x038a6a54, 0x03cf5b33, 0x00095d35}}}, + {X: Field{[10]uint32{0x00b7b067, 0x02559ccd, 0x00cfd26b, 0x03eaff00, 0x03508a9d, 0x024aab3c, 0x01d4258a, 0x019876c8, 0x02ff071f, 0x0023163e}}, Y: Field{[10]uint32{0x03944893, 0x0285359c, 0x0273f694, 0x01c56778, 0x01e9a8a1, 0x002c44c9, 0x03d08a88, 0x013b8a10, 0x0094ea1d, 0x000e347a}}}, + {X: Field{[10]uint32{0x01da78de, 0x021fedf1, 0x03a9c0f2, 0x020219ad, 0x02dbc6f5, 0x036502c4, 0x03918642, 0x0068f192, 0x031a205c, 0x0036019c}}, Y: Field{[10]uint32{0x01d0e05e, 0x030bafb3, 0x02ba8d43, 0x001b4907, 0x03704020, 0x018d497e, 0x01da8318, 0x01eaedcd, 0x00302ff5, 0x0021c2a1}}}, + {X: Field{[10]uint32{0x03848648, 0x0108138a, 0x02741335, 0x00244ae6, 0x03416bde, 0x029f3765, 0x01de1515, 0x02c10693, 0x037e195d, 0x001f6f68}}, Y: Field{[10]uint32{0x00715e71, 0x03ec00c4, 0x00cf3885, 0x006a1ea3, 0x03e1c026, 0x00bd82a7, 0x0284ff13, 0x0001c3f7, 0x007a649d, 0x0020f227}}}, + {X: Field{[10]uint32{0x03ec54a1, 0x0233ba00, 0x0245e58d, 0x0149f52f, 0x03410a1b, 0x02dddb3e, 0x038ee093, 0x02c38b7d, 0x03c0c803, 0x0022bf08}}, Y: Field{[10]uint32{0x012ed76b, 0x03ba270d, 0x035b401b, 0x028ae5fa, 0x02bf7b11, 0x0218e52f, 0x02529573, 0x039282ce, 0x02ce4f4a, 0x002c107b}}}, + {X: Field{[10]uint32{0x0252207b, 0x02e4084d, 0x0211236f, 0x033795e1, 0x031b2531, 0x01588452, 0x0003b4b2, 0x03eac12e, 0x00c22c50, 0x00139109}}, Y: Field{[10]uint32{0x01796e6f, 0x02e74376, 0x02ab57e7, 0x0297052d, 0x03889d5c, 0x02c33c90, 0x03421e4f, 0x01c4603e, 0x01815118, 0x0008afd8}}}, + {X: Field{[10]uint32{0x02e97453, 0x024a5079, 0x023828fd, 0x03bb24ee, 0x02f394b1, 0x038e6cd2, 0x0016e396, 0x002be282, 0x03885a23, 0x00181c5d}}, Y: Field{[10]uint32{0x00dc4b26, 0x03d005c0, 0x016f49f8, 0x03ea278d, 0x03fc0a18, 0x037db6e1, 0x03247620, 0x02906c53, 0x029f2b9d, 0x002a137c}}}, + {X: Field{[10]uint32{0x00af3213, 0x00b28923, 0x022ac602, 0x01a40b70, 0x00a271f1, 0x02b3dc39, 0x03bbf8df, 0x015bb0de, 0x0120384e, 0x00327dcf}}, Y: Field{[10]uint32{0x01fb5437, 0x02897e23, 0x02cb069e, 0x022e5d85, 0x0089070e, 0x02fd6d5e, 0x03c9bfa8, 0x025606dc, 0x03f4c77f, 0x001d88b9}}}, + {X: Field{[10]uint32{0x0245282a, 0x0297b6bb, 0x03c4a81e, 0x02718c2f, 0x01a8b995, 0x023643db, 0x002bfea4, 0x0287630f, 0x01fbdab5, 0x00067a97}}, Y: Field{[10]uint32{0x01f1d56c, 0x03876e3f, 0x00c653b8, 0x0275f5b9, 0x00870a95, 0x03cc1ec7, 0x03a4d62a, 0x02f605f0, 0x015d0014, 0x0003084a}}}, + {X: Field{[10]uint32{0x01617b58, 0x032f9b70, 0x025cb290, 0x01a5c5f7, 0x02047806, 0x02febe14, 0x030e1491, 0x030a4b37, 0x031e30b2, 0x001592f6}}, Y: Field{[10]uint32{0x022b1c0d, 0x013dd39f, 0x01984700, 0x00703aee, 0x0332508c, 0x01dfd777, 0x02841988, 0x02e57e67, 0x00e86fc0, 0x0026a368}}}, + {X: Field{[10]uint32{0x010bf06b, 0x011a54df, 0x023b54bf, 0x00778376, 0x0150b39d, 0x02fb81ce, 0x02e21237, 0x039b3249, 0x00424f3e, 0x0016f24e}}, Y: Field{[10]uint32{0x00fd5d16, 0x0277a908, 0x01e00c11, 0x00eda52d, 0x0032bb00, 0x035d4e94, 0x03f4bd4c, 0x01e2f82d, 0x03a96627, 0x00353a70}}}, + {X: Field{[10]uint32{0x00b7f99e, 0x036e6f17, 0x003a5980, 0x00b68ba3, 0x035b2a5f, 0x02071f5f, 0x02f4fc31, 0x022d5cfb, 0x0294829e, 0x000650cb}}, Y: Field{[10]uint32{0x02bcbcf6, 0x039caee6, 0x003f7a4b, 0x0205715c, 0x032e8607, 0x01b806b3, 0x029316e3, 0x02159eed, 0x019e5c5b, 0x003dd726}}}, + {X: Field{[10]uint32{0x00080b8d, 0x00c33688, 0x01672ea2, 0x0346fbbc, 0x018d0235, 0x002c6d56, 0x02c28bfa, 0x0338668b, 0x001e6196, 0x0034e64a}}, Y: Field{[10]uint32{0x0168aa19, 0x013468d4, 0x03ea9638, 0x03c357b6, 0x03d5483c, 0x017ae90c, 0x02949319, 0x0338e8cf, 0x029520ff, 0x0000729f}}}, + {X: Field{[10]uint32{0x00e73c88, 0x032a3a84, 0x026bae21, 0x025dd2b8, 0x0239372e, 0x000bd995, 0x01f55563, 0x03ea7f95, 0x035ab220, 0x001b2138}}, Y: Field{[10]uint32{0x0101b2b3, 0x02d30084, 0x029b89a7, 0x0195c7bf, 0x0001d154, 0x003a2c8d, 0x01711e7b, 0x00b02b52, 0x032abd44, 0x00262846}}}, + {X: Field{[10]uint32{0x00f8f64b, 0x002a0328, 0x00858118, 0x02dba77d, 0x03ec4205, 0x020ef601, 0x0397f14c, 0x0117b685, 0x018ab1b0, 0x001e0533}}, Y: Field{[10]uint32{0x0115f33b, 0x038e34ed, 0x022841b0, 0x00c106bc, 0x036bf177, 0x03798eb7, 0x03e8b704, 0x02e3ffd4, 0x0240edc8, 0x003be45f}}}, + {X: Field{[10]uint32{0x0196235f, 0x0381b1c2, 0x03993fb6, 0x0035c4e2, 0x02444e71, 0x034a014c, 0x01accfcc, 0x008aa2ff, 0x02831c8e, 0x001e807b}}, Y: Field{[10]uint32{0x001a5519, 0x009f9f0a, 0x00b41045, 0x02606058, 0x00dcb061, 0x024370ef, 0x02f2e080, 0x0170aad8, 0x01091989, 0x003f944b}}}, + {X: Field{[10]uint32{0x039bd908, 0x02085f07, 0x000ce72e, 0x01bcfcf9, 0x01512e85, 0x0352979e, 0x00b56605, 0x0327be46, 0x02bcdf86, 0x001957b9}}, Y: Field{[10]uint32{0x02f87721, 0x0253d8c4, 0x035c3cae, 0x02e848f7, 0x037dfdef, 0x002079a6, 0x0196ea9d, 0x02c217ce, 0x01a691fc, 0x0032fae9}}}, + {X: Field{[10]uint32{0x025219bb, 0x021fb877, 0x01d9e1cf, 0x0051103c, 0x003d4d48, 0x01e045ef, 0x00be25fe, 0x01cba3ac, 0x0009fb03, 0x003af5a0}}, Y: Field{[10]uint32{0x0258814b, 0x039e6d2e, 0x0068bd8c, 0x02dbfd96, 0x036da8cd, 0x02f6dd7c, 0x00aed2d6, 0x037d56fc, 0x02386f96, 0x0023bedf}}}, + {X: Field{[10]uint32{0x01a3865b, 0x0358ed86, 0x039149f1, 0x033c45a3, 0x028b7834, 0x01f56af5, 0x015cf051, 0x016eed3a, 0x00189ac0, 0x0021cd02}}, Y: Field{[10]uint32{0x00480838, 0x00fe4f05, 0x0330cdf6, 0x03eb78af, 0x027d24c0, 0x03eb828f, 0x01d4deed, 0x003c5724, 0x012772ce, 0x0027c7ef}}}, + {X: Field{[10]uint32{0x00513df3, 0x03cb18cc, 0x0368ba12, 0x0136aa5b, 0x035dda3a, 0x0055a432, 0x0262e925, 0x01eed937, 0x0213b02a, 0x00186dac}}, Y: Field{[10]uint32{0x02b6144e, 0x01894230, 0x03d56e01, 0x03994e65, 0x03c42c6c, 0x03000e86, 0x02d29628, 0x020650da, 0x00f24eff, 0x00331c6e}}}, + {X: Field{[10]uint32{0x0125fe37, 0x0028190e, 0x0187298f, 0x0388060b, 0x02ed5e02, 0x02126106, 0x01c9e663, 0x006b8b8e, 0x024d7717, 0x0012e9fb}}, Y: Field{[10]uint32{0x0296dbd6, 0x0371cd23, 0x004f1f1f, 0x03ddd46f, 0x035a9da4, 0x02029c9b, 0x032158eb, 0x013c5b2d, 0x01b4fe34, 0x001736f5}}}, + {X: Field{[10]uint32{0x008badb7, 0x011f9bc8, 0x01de2ee2, 0x01c7fa78, 0x026f9a39, 0x01a24ba6, 0x025bd7a4, 0x037350cb, 0x027fc4d5, 0x0035609e}}, Y: Field{[10]uint32{0x0098e1fa, 0x03c28698, 0x00f18ca0, 0x0298ed4b, 0x002fb667, 0x02c8f183, 0x02fb5349, 0x00303d87, 0x02dc9d0e, 0x003de43e}}}, + {X: Field{[10]uint32{0x03237633, 0x032e6ca4, 0x0098d411, 0x03f72894, 0x01e9086d, 0x027bf9a4, 0x0144d4a8, 0x0033df03, 0x01597f95, 0x00207b14}}, Y: Field{[10]uint32{0x039a1e7f, 0x0182dcfa, 0x000655fa, 0x028aaa0a, 0x000741d3, 0x03e4bed8, 0x0253f28e, 0x03e03251, 0x03ddc9ef, 0x002216c9}}}, + {X: Field{[10]uint32{0x02b6dec7, 0x02e8bf5a, 0x01e684cd, 0x01e762b2, 0x026e7237, 0x03c2bfc7, 0x023e06da, 0x03da01da, 0x01f4a0d4, 0x000a3f10}}, Y: Field{[10]uint32{0x01657225, 0x0328aa92, 0x01f54d80, 0x0236c421, 0x01482c6a, 0x0056c8d7, 0x02b9415c, 0x02af1cfa, 0x031e7aff, 0x002c792b}}}, + {X: Field{[10]uint32{0x03ae4f47, 0x02c62a3d, 0x035d1328, 0x02333d66, 0x036341a8, 0x01fe8be7, 0x00f5b857, 0x01d71f2c, 0x03d6c5bf, 0x003579d4}}, Y: Field{[10]uint32{0x00a1bff9, 0x00315031, 0x013cffaf, 0x003765e5, 0x02fc2f38, 0x03b359ba, 0x018a10c8, 0x0068c894, 0x00b98eb0, 0x00346a95}}}, + {X: Field{[10]uint32{0x0076e836, 0x03521cc5, 0x0286d8ba, 0x00f5d624, 0x01257d41, 0x0130696a, 0x0008fac4, 0x010a5f98, 0x015d8909, 0x0005a08d}}, Y: Field{[10]uint32{0x0309cf4a, 0x001151ba, 0x02a0278d, 0x03677b53, 0x002ec9c2, 0x014fb613, 0x0059b11d, 0x024327a1, 0x0362e29f, 0x0013da71}}}, + {X: Field{[10]uint32{0x03e781db, 0x000902c8, 0x032e7903, 0x006b4089, 0x0273425d, 0x03311b88, 0x03511a78, 0x02b9ccba, 0x005fb64c, 0x0027bdea}}, Y: Field{[10]uint32{0x009ce73c, 0x02ce61f4, 0x0204b03e, 0x027ce9dd, 0x0278a50c, 0x03d7a4b8, 0x035e2f20, 0x01691cfc, 0x016f6f6a, 0x0031c80d}}}, + {X: Field{[10]uint32{0x02e915ec, 0x03b1c280, 0x03612dd7, 0x01a304f3, 0x02021744, 0x03383aaa, 0x031be48a, 0x02694932, 0x03b36f42, 0x0013daba}}, Y: Field{[10]uint32{0x038e761f, 0x0082c473, 0x036c6396, 0x01ba1e03, 0x010b28f9, 0x014adb5f, 0x02d36092, 0x035e400a, 0x014da8b6, 0x00101ab6}}}, + {X: Field{[10]uint32{0x023f8232, 0x01586ec8, 0x01f8e088, 0x03c690ac, 0x037a3cc7, 0x03035fa2, 0x0310dae5, 0x00b99999, 0x020e5ac0, 0x00132b0f}}, Y: Field{[10]uint32{0x03263142, 0x00168232, 0x019318ba, 0x015b0bf9, 0x03dca655, 0x0230a749, 0x03fcb9cd, 0x03cf2013, 0x008eaa96, 0x0024e5bb}}}, + {X: Field{[10]uint32{0x039367b8, 0x0282983d, 0x0193738e, 0x01e18186, 0x02f61fbd, 0x01931d81, 0x00a9dd10, 0x02b15cb1, 0x00633aa2, 0x00021bcd}}, Y: Field{[10]uint32{0x01824f05, 0x008f9609, 0x0312a03f, 0x0186d6b9, 0x03cfb2aa, 0x02d30e2b, 0x0376c9fd, 0x01e76d7d, 0x012b5561, 0x003200bf}}}, + {X: Field{[10]uint32{0x007103a9, 0x0371ffcd, 0x034da318, 0x008ee8f5, 0x000bcd6f, 0x0074e7ea, 0x025ab4cd, 0x03848f9e, 0x01457685, 0x0014c8fc}}, Y: Field{[10]uint32{0x00691cb1, 0x0000de22, 0x028e3461, 0x03c7fb87, 0x0394cab4, 0x02efce3e, 0x01ec977c, 0x02ca784b, 0x0379eccc, 0x000c24be}}}, + {X: Field{[10]uint32{0x03ea74fd, 0x03c45e0c, 0x030e71a7, 0x001a60ff, 0x03f85cf1, 0x02838717, 0x000c45f3, 0x00471f9a, 0x01464027, 0x0034f5c3}}, Y: Field{[10]uint32{0x00d07bad, 0x01bd896a, 0x03c90fdf, 0x03cf855d, 0x01e4f722, 0x03ba9fee, 0x0093b9e0, 0x003cc45a, 0x0373d9b9, 0x00246609}}}, + {X: Field{[10]uint32{0x036d4359, 0x02192ef6, 0x02fdd6fd, 0x03e86ac7, 0x01f8cb89, 0x00d953c7, 0x01b5d714, 0x01d84c0b, 0x013728a8, 0x0037d8ee}}, Y: Field{[10]uint32{0x02ce5510, 0x02b2ded8, 0x012a791b, 0x035212de, 0x02a2c7be, 0x00cbe96c, 0x03930348, 0x00fb2db1, 0x01ca191a, 0x001f0ede}}}, + {X: Field{[10]uint32{0x01b70c74, 0x01afa15c, 0x00ec3974, 0x02531f7b, 0x0328a994, 0x0138898a, 0x0303169a, 0x00d3657c, 0x02228cc3, 0x003c7fa4}}, Y: Field{[10]uint32{0x0351a10e, 0x03944db9, 0x02b6469d, 0x00d630a3, 0x03b67a24, 0x0266bc78, 0x0335f60f, 0x03e9ca8a, 0x03b84e65, 0x0015623c}}}, + {X: Field{[10]uint32{0x0274fd95, 0x0324216e, 0x03c7dcb3, 0x02d7e8a7, 0x00fb0adb, 0x01f2ca34, 0x03ec14cb, 0x028cc3b7, 0x035d918c, 0x00240c39}}, Y: Field{[10]uint32{0x00b427f7, 0x0366768e, 0x004cd71a, 0x0304eef7, 0x035a452d, 0x00e2b7b5, 0x0128821c, 0x02261302, 0x01286169, 0x001f7c80}}}, + {X: Field{[10]uint32{0x03ad641a, 0x01f3d71d, 0x007d5ddd, 0x0218b0f3, 0x03dfa0b5, 0x01d9047a, 0x00f628c5, 0x036e1c4d, 0x013935be, 0x000734f0}}, Y: Field{[10]uint32{0x039a324d, 0x012f7852, 0x02bcf592, 0x03c40c3e, 0x0288264c, 0x03211ec9, 0x013a25e0, 0x02ec22fa, 0x01f25488, 0x0008553b}}}, + {X: Field{[10]uint32{0x0046ad96, 0x03c49f49, 0x01f42202, 0x03feb265, 0x03bd6e91, 0x03b0356e, 0x039f4621, 0x03b1f1e2, 0x0337a19f, 0x00395b81}}, Y: Field{[10]uint32{0x02ad70d7, 0x02226a8f, 0x0177698f, 0x00bd2cbb, 0x011e69b4, 0x01a4fa5d, 0x028d9bbb, 0x01d83902, 0x0027368c, 0x00220c36}}}, + {X: Field{[10]uint32{0x03b6b101, 0x0398fc57, 0x02657587, 0x0219e021, 0x0156fd08, 0x012b6299, 0x026dfeb2, 0x03978d8f, 0x02c458ab, 0x0006c29a}}, Y: Field{[10]uint32{0x035178dc, 0x00b3124c, 0x01926521, 0x01acb87d, 0x029a35e8, 0x03777b97, 0x033e5aab, 0x018e8ac4, 0x03dae642, 0x0034b7db}}}, + {X: Field{[10]uint32{0x03ea22b2, 0x03302048, 0x00679d80, 0x01d9173f, 0x0250bb16, 0x011b58a8, 0x01390a62, 0x0186393b, 0x01468fd4, 0x00042850}}, Y: Field{[10]uint32{0x0140185f, 0x00ce003f, 0x015620b0, 0x0096f0c3, 0x01f9a09b, 0x013aec54, 0x0113dbaf, 0x03746bb3, 0x0068dd7f, 0x000ce0ee}}}, + {X: Field{[10]uint32{0x003f5e35, 0x00f90669, 0x006ac8a7, 0x035e5755, 0x02e357f7, 0x01a2be9c, 0x038837e5, 0x028d45b6, 0x03515378, 0x0027712a}}, Y: Field{[10]uint32{0x0305903f, 0x02359a98, 0x01a06cc6, 0x0386410e, 0x02bfe05c, 0x03a9647b, 0x02422be1, 0x033eff8a, 0x022d9bce, 0x0002376a}}}, + {X: Field{[10]uint32{0x00ed7196, 0x02b1db8f, 0x035de1aa, 0x0264d880, 0x0213539e, 0x0226c82b, 0x038eb19e, 0x0387ef14, 0x035de7a4, 0x002aa4c5}}, Y: Field{[10]uint32{0x02afb9ad, 0x02e192b0, 0x01a05eff, 0x01afb38f, 0x00c18d14, 0x022d2001, 0x03e133ad, 0x0115a27c, 0x0304c134, 0x003b73b6}}}, + {X: Field{[10]uint32{0x022edf7b, 0x03bdbec8, 0x00e27536, 0x03e8d753, 0x0294f3ce, 0x0341b31a, 0x036fcbc6, 0x0366822e, 0x03e4da02, 0x00205c7c}}, Y: Field{[10]uint32{0x01e6dd6b, 0x0272967a, 0x03189749, 0x02de9963, 0x03c32038, 0x00f06993, 0x002b55f7, 0x00aae870, 0x01fcaae6, 0x003a46f9}}}, + {X: Field{[10]uint32{0x02a19ab6, 0x00201606, 0x024b111b, 0x009d0dd1, 0x01893fe6, 0x031e73de, 0x01888c93, 0x00a3998d, 0x0183c891, 0x00147db2}}, Y: Field{[10]uint32{0x0081a067, 0x003c164e, 0x03252a3d, 0x0003578d, 0x00b8cee4, 0x02a37194, 0x001dbf41, 0x0193d483, 0x01494bb1, 0x00174bbc}}}, + {X: Field{[10]uint32{0x03d7d38a, 0x002ae3db, 0x02580950, 0x02b1d36b, 0x03ec34df, 0x036c3769, 0x01016b19, 0x00c371a9, 0x0184766b, 0x0030287c}}, Y: Field{[10]uint32{0x02c6f01e, 0x024d65fa, 0x01490528, 0x007b1a57, 0x01b27f36, 0x009349aa, 0x01410516, 0x036bc4a7, 0x03e2c7b6, 0x002f72b4}}}, + {X: Field{[10]uint32{0x03a0eb02, 0x00e51c8c, 0x00a222bd, 0x026c7ade, 0x02fde927, 0x00d07bee, 0x02b6fe07, 0x0145a412, 0x02cc9543, 0x002c6ec7}}, Y: Field{[10]uint32{0x001689a8, 0x02fead32, 0x021d55a7, 0x02137931, 0x014b1490, 0x01c78325, 0x00dbf0a6, 0x010b8b03, 0x035b5253, 0x0037d48f}}}, + {X: Field{[10]uint32{0x000b5dce, 0x00f79f59, 0x00470180, 0x039da063, 0x023b0891, 0x010dce47, 0x0139ea7e, 0x013b5621, 0x00dc86d0, 0x002d730c}}, Y: Field{[10]uint32{0x02d4ec14, 0x00798bd0, 0x00b65ca4, 0x0077fff9, 0x009f5556, 0x00b80fca, 0x031acc86, 0x00c4b43e, 0x019e45c7, 0x003c7303}}}, + {X: Field{[10]uint32{0x0263ccb6, 0x03a503e4, 0x016b0da8, 0x008d47f8, 0x008cacee, 0x01f56507, 0x0155b3ea, 0x03fd4ca0, 0x01e705f0, 0x00378ad2}}, Y: Field{[10]uint32{0x018de99f, 0x01364fdb, 0x032ab74b, 0x02d5c0d5, 0x024690d5, 0x01e0552b, 0x017c6801, 0x02fd9ec3, 0x002bb12d, 0x000d35e9}}}, + {X: Field{[10]uint32{0x03cc8f51, 0x017cf395, 0x0311ad51, 0x02c3bcbb, 0x00ea5c0d, 0x0161c33f, 0x00984046, 0x03845c3a, 0x00e7c129, 0x0022c63d}}, Y: Field{[10]uint32{0x01111f37, 0x00b80226, 0x00aff884, 0x009f9acb, 0x0372281c, 0x0323b72c, 0x01e9d6cd, 0x012964f1, 0x0086c867, 0x001ac784}}}, + {X: Field{[10]uint32{0x03c86889, 0x0160aa45, 0x03442f9e, 0x0092da97, 0x01822ce4, 0x018aa0c3, 0x00e46f17, 0x03222246, 0x02c027ce, 0x001c9c58}}, Y: Field{[10]uint32{0x03223cca, 0x01bce28b, 0x02e7e841, 0x008f3145, 0x03248656, 0x024f9491, 0x03de5af6, 0x028da79b, 0x02961452, 0x00378d20}}}, + {X: Field{[10]uint32{0x0105058c, 0x0215adcd, 0x016056d0, 0x03f28fd8, 0x02946a75, 0x0309252f, 0x00eb9b81, 0x01d20fc6, 0x001f4dd1, 0x0012b93f}}, Y: Field{[10]uint32{0x032563e7, 0x011a4843, 0x017a39ae, 0x00db8b18, 0x0059999b, 0x0361e11c, 0x0034a05b, 0x03f05f68, 0x0012e901, 0x00361f9e}}}, + {X: Field{[10]uint32{0x03f43cd1, 0x00548197, 0x010bf58b, 0x02e93bda, 0x0272007b, 0x01abff40, 0x0026f016, 0x01cffa46, 0x01ace9e8, 0x003a42f2}}, Y: Field{[10]uint32{0x0164fa87, 0x0398d811, 0x02d58905, 0x00b34b95, 0x0147f076, 0x0196e6ff, 0x009b0c00, 0x03f5a147, 0x00e89acd, 0x0012f208}}}, + {X: Field{[10]uint32{0x011450ba, 0x0101db7d, 0x010209af, 0x0295fc14, 0x0208340b, 0x03a7bdd1, 0x021af7db, 0x00bedbde, 0x02a1db43, 0x002e82b9}}, Y: Field{[10]uint32{0x012be720, 0x021dabe4, 0x02908c58, 0x00630cba, 0x0351019a, 0x0068b0c2, 0x029894c5, 0x0250805c, 0x01b70409, 0x001f4e0e}}}, + {X: Field{[10]uint32{0x03accfeb, 0x020808b4, 0x03a5def8, 0x02fca607, 0x034f9682, 0x035ee5f5, 0x018b403e, 0x0194c476, 0x0381f77c, 0x001c1986}}, Y: Field{[10]uint32{0x02d06387, 0x02f13929, 0x0277e4e5, 0x02497d19, 0x027b4eeb, 0x02c1bf99, 0x024bd7cf, 0x027d366b, 0x01731895, 0x002408ae}}}, + {X: Field{[10]uint32{0x00471a47, 0x038248bf, 0x011d80e5, 0x0056347c, 0x0029451c, 0x0367be8e, 0x0381b817, 0x00e81c47, 0x03472815, 0x003f86de}}, Y: Field{[10]uint32{0x02b0f847, 0x02280d34, 0x01fae19c, 0x037c8d13, 0x0285725b, 0x03930c6a, 0x0115dc05, 0x02df1bec, 0x01cc68cf, 0x0025681d}}}, + {X: Field{[10]uint32{0x02cc3fc0, 0x01c3dfa6, 0x01e867ab, 0x00dfb171, 0x004325bc, 0x009f8e97, 0x0013d04f, 0x02a41ca0, 0x03d2bbae, 0x0022b3ce}}, Y: Field{[10]uint32{0x0216174e, 0x012195cf, 0x00785ee1, 0x03bf6f8b, 0x01b3e2e0, 0x02547e03, 0x01c06a25, 0x009f53ca, 0x03fb36da, 0x003d9e78}}}, + {X: Field{[10]uint32{0x02f395e3, 0x03aa3612, 0x0314f1d6, 0x03443283, 0x00d2db01, 0x03d8ae9f, 0x03fc6a47, 0x01f56ae1, 0x013725fc, 0x00076157}}, Y: Field{[10]uint32{0x020b1b90, 0x037234c0, 0x012a5815, 0x03436a24, 0x019b0a9a, 0x0189a317, 0x0255183f, 0x01953b51, 0x03ac2d41, 0x0033ac98}}}, + {X: Field{[10]uint32{0x012a8cba, 0x009b5c16, 0x0302e039, 0x02601147, 0x03099344, 0x01c3466d, 0x00ec6f6d, 0x01338f21, 0x016630c2, 0x0006aed1}}, Y: Field{[10]uint32{0x00525885, 0x0065521d, 0x01863f4b, 0x024d048a, 0x021778d2, 0x00c91514, 0x01886ef7, 0x01ff5cab, 0x006f6be8, 0x001189dc}}}, + {X: Field{[10]uint32{0x03eac036, 0x03cafaa4, 0x00a5fb86, 0x01992c26, 0x03620e5c, 0x0128fcc2, 0x01d07e24, 0x004bfe59, 0x00fa672c, 0x0006d1e4}}, Y: Field{[10]uint32{0x03edd60e, 0x00634939, 0x012831b0, 0x01c27278, 0x017c19fd, 0x02e0e47f, 0x022a9a06, 0x038b47ca, 0x00fca758, 0x003bb414}}}, + {X: Field{[10]uint32{0x00de3dd3, 0x00dcca9a, 0x01c98a43, 0x0280878f, 0x0344c106, 0x01584d9e, 0x01dcfc12, 0x032238c3, 0x032cfc9c, 0x001861e2}}, Y: Field{[10]uint32{0x02aed78e, 0x000037c7, 0x0229d436, 0x002dac4f, 0x03afc6f5, 0x0262a7be, 0x014cb774, 0x009e746d, 0x00a0037c, 0x003e8915}}}, + {X: Field{[10]uint32{0x0144308a, 0x010042a1, 0x030b5335, 0x006a4c5c, 0x00abc727, 0x0114088e, 0x00c21ecf, 0x03fac5ef, 0x01f02767, 0x00210123}}, Y: Field{[10]uint32{0x0193c32f, 0x03223b3a, 0x00b7c838, 0x02a90e33, 0x02605acc, 0x01dd8f1b, 0x03f9814f, 0x00239751, 0x024a39d6, 0x00351c4b}}}, + {X: Field{[10]uint32{0x02683a94, 0x02eb0cf2, 0x015cf889, 0x0032a201, 0x018ba37d, 0x01fa27e5, 0x031e1e03, 0x005d7b0f, 0x00e56c96, 0x003adeb1}}, Y: Field{[10]uint32{0x0285da8a, 0x00e053d7, 0x030112bc, 0x00ccbd45, 0x03cc07de, 0x004f7f1b, 0x00bfe075, 0x009d2db6, 0x02672ccc, 0x00125078}}}, + {X: Field{[10]uint32{0x02142e91, 0x00656bc8, 0x03eaf1a4, 0x0154e027, 0x014cbce4, 0x000a2370, 0x02b452ba, 0x012f6ad8, 0x02c9877d, 0x001228da}}, Y: Field{[10]uint32{0x0369659c, 0x0143aeaa, 0x02e2530b, 0x027087fd, 0x0027eec3, 0x013a5436, 0x02d88480, 0x018a21b1, 0x018a0125, 0x0038935b}}}, + {X: Field{[10]uint32{0x00cca1b5, 0x00b385af, 0x02a91252, 0x019320b4, 0x02e817b6, 0x02c8e803, 0x029af3b1, 0x028975e1, 0x01d05a62, 0x00270c49}}, Y: Field{[10]uint32{0x01e5afe3, 0x026daf4e, 0x03450a18, 0x0185541a, 0x01385663, 0x03863d7d, 0x00172774, 0x01c5a061, 0x0210f670, 0x0031bb36}}}, + {X: Field{[10]uint32{0x00f80d68, 0x02a479a4, 0x0116bc2c, 0x03b526bc, 0x0310160b, 0x013722f8, 0x033843e0, 0x019c371f, 0x0221dcc7, 0x000cfa07}}, Y: Field{[10]uint32{0x01757b6f, 0x024a4195, 0x01bb8fa5, 0x03a27b01, 0x029ce417, 0x03bf8e2b, 0x01f11678, 0x021b4b9b, 0x01d3a0a3, 0x0039a530}}}, + {X: Field{[10]uint32{0x036a1ad2, 0x00700cc6, 0x03056d8e, 0x012e29a3, 0x035c1d0d, 0x00256609, 0x02b10715, 0x0383f2ff, 0x029e6899, 0x002550dd}}, Y: Field{[10]uint32{0x009b0d7e, 0x01e54d3b, 0x00b163f5, 0x0219fd9a, 0x0301c4be, 0x00bb473a, 0x035f1487, 0x021041d8, 0x03fdafc5, 0x0001c033}}}, + {X: Field{[10]uint32{0x0039efdd, 0x0142099d, 0x00203a0d, 0x018f8877, 0x026ca9b1, 0x02d4201f, 0x0081e6e5, 0x00b0e5f5, 0x00d173e6, 0x0013d073}}, Y: Field{[10]uint32{0x0069f79d, 0x0339df43, 0x011eed95, 0x02ff8563, 0x008fea56, 0x02dd2c95, 0x00b309ba, 0x0065cb62, 0x02d6aa8c, 0x003efe63}}}, + {X: Field{[10]uint32{0x005f12e5, 0x03b3c819, 0x03bd9064, 0x01a91946, 0x00a667fe, 0x023baf0a, 0x03fd9c33, 0x00037ef8, 0x0245584b, 0x00133eda}}, Y: Field{[10]uint32{0x0214652b, 0x006486bd, 0x0312f550, 0x028979ca, 0x00219638, 0x00495640, 0x00fac21d, 0x003a1d1c, 0x02dafe08, 0x000b77f5}}}, + {X: Field{[10]uint32{0x01eca626, 0x005dd5dd, 0x039821f2, 0x0324605f, 0x038e536b, 0x03eb94ce, 0x02217fd8, 0x028cf297, 0x03ecd9bb, 0x0027bee2}}, Y: Field{[10]uint32{0x00658fb4, 0x003e32ac, 0x02f8e944, 0x02e21d78, 0x018e3573, 0x029f70f8, 0x00bcf9c1, 0x03057a46, 0x00ed0529, 0x001984c0}}}, + {X: Field{[10]uint32{0x0030e441, 0x039876b9, 0x02470da9, 0x03e7a143, 0x00f5d3c0, 0x02f9b717, 0x01ab953e, 0x039302e1, 0x01525be7, 0x0030aa02}}, Y: Field{[10]uint32{0x009d9d2d, 0x02713be0, 0x0277b483, 0x018f5434, 0x036be063, 0x03027ef0, 0x026fa221, 0x01a5f1f6, 0x0136bf72, 0x00074b7b}}}, + {X: Field{[10]uint32{0x03baa707, 0x010b808e, 0x0030c0a2, 0x02d006fe, 0x032501a1, 0x031882c4, 0x02162764, 0x0208afd6, 0x036b49ae, 0x0010adff}}, Y: Field{[10]uint32{0x02b71d6d, 0x00288da0, 0x028b0eb9, 0x0254317a, 0x00fb2c75, 0x032ed68e, 0x02de994d, 0x039001c4, 0x005883f0, 0x003907f8}}}, + {X: Field{[10]uint32{0x03b0c28c, 0x007c38aa, 0x0386df78, 0x02d1fb8e, 0x01e00cc3, 0x017de3ce, 0x03e15185, 0x02d904ab, 0x0129d420, 0x003b82ec}}, Y: Field{[10]uint32{0x000aec61, 0x00d0fad7, 0x01099258, 0x015552ba, 0x0154b174, 0x003b6eb7, 0x006204b6, 0x02891d9f, 0x027a5a4f, 0x003dc743}}}, + {X: Field{[10]uint32{0x00ef5b9a, 0x0121f01e, 0x02e789ca, 0x0390a894, 0x0077546c, 0x009b140f, 0x031a7160, 0x00efd499, 0x02079cdb, 0x0007c762}}, Y: Field{[10]uint32{0x03571c20, 0x027a6365, 0x01cfc5c3, 0x02a98f47, 0x00180ee4, 0x03ef0c19, 0x00e8e6f9, 0x0144b7aa, 0x030dae55, 0x00318444}}}, + {X: Field{[10]uint32{0x02a31310, 0x004bfb34, 0x017b8b29, 0x01b97e4c, 0x027cf313, 0x01063c05, 0x026ebe55, 0x027ec564, 0x0006ecdc, 0x0016f6a7}}, Y: Field{[10]uint32{0x005ecad7, 0x02370a01, 0x023feb72, 0x01a285ed, 0x03890761, 0x01cbab6c, 0x03e59d5b, 0x00983203, 0x0370dce1, 0x000d63fe}}}, + {X: Field{[10]uint32{0x03866ea6, 0x011d5137, 0x01be91f8, 0x01cd2018, 0x01edc789, 0x0383bf5c, 0x0252dec8, 0x031c9d99, 0x0103fa50, 0x0030cbd9}}, Y: Field{[10]uint32{0x01fca304, 0x02e71c40, 0x008566de, 0x00a882e0, 0x006a34af, 0x02c4fc2c, 0x0309443c, 0x03b3101e, 0x02267a13, 0x0019c8d2}}}, + {X: Field{[10]uint32{0x0089caed, 0x0337aa25, 0x03069941, 0x01ce25ae, 0x00849bb6, 0x02584990, 0x026c83f2, 0x03ac19c3, 0x0111b71f, 0x001520f5}}, Y: Field{[10]uint32{0x008c1148, 0x034e49f6, 0x03ecfbfe, 0x0141e512, 0x03494d53, 0x03639377, 0x02df0f38, 0x00d0dd02, 0x0262d323, 0x0028269a}}}, + {X: Field{[10]uint32{0x02a322ef, 0x00625603, 0x010472d5, 0x03f6710f, 0x02d5e3c6, 0x029b3091, 0x00b93425, 0x01aae47b, 0x035ff0b8, 0x000f4b63}}, Y: Field{[10]uint32{0x0155b830, 0x027cd936, 0x00509c73, 0x03b28613, 0x00fb45d7, 0x01c75d82, 0x039cf4ab, 0x03381461, 0x008b4c23, 0x0010620d}}}, + {X: Field{[10]uint32{0x01af1dc0, 0x011d5d08, 0x01e9e40b, 0x000eaae2, 0x00735ddf, 0x024daf04, 0x01ffa9df, 0x019e017f, 0x013929ed, 0x000e970e}}, Y: Field{[10]uint32{0x00a7011d, 0x020893a4, 0x0081e0dd, 0x00aea517, 0x0344dcd5, 0x00a5d720, 0x002a7de2, 0x00a458ab, 0x01197675, 0x001d82c6}}}, + {X: Field{[10]uint32{0x00590a83, 0x03752135, 0x01f900e5, 0x0120cdcf, 0x00648869, 0x03892831, 0x039272ef, 0x0301b8fb, 0x02ac7c1c, 0x0028f548}}, Y: Field{[10]uint32{0x021b6be2, 0x007cb13b, 0x00795566, 0x031a4c15, 0x0328c377, 0x000005a5, 0x01684a95, 0x03758486, 0x022cb739, 0x001bd4ee}}}, + {X: Field{[10]uint32{0x00e8180f, 0x01451176, 0x01d42367, 0x021f76e5, 0x02c1437d, 0x00b80aa8, 0x00785836, 0x00806110, 0x01311399, 0x003bc2c2}}, Y: Field{[10]uint32{0x0086c634, 0x03210ae5, 0x019801b9, 0x0029065c, 0x00217352, 0x024be31d, 0x00408cdf, 0x011dc9f4, 0x00078d18, 0x001cefd1}}}, + {X: Field{[10]uint32{0x0115da20, 0x01bd031b, 0x03e070f2, 0x01734728, 0x02a770c1, 0x01846169, 0x02118991, 0x033ae708, 0x03fd1498, 0x0020503b}}, Y: Field{[10]uint32{0x0022a474, 0x03127f40, 0x01c3e45f, 0x0008280b, 0x03051c11, 0x0058bc0e, 0x028b7eb2, 0x02dfc6f9, 0x03df6d2d, 0x00131d3c}}}, + {X: Field{[10]uint32{0x03e122f0, 0x02966f3a, 0x00b74215, 0x03c000de, 0x017603c7, 0x03f5bf59, 0x0132f4d3, 0x027c7e4f, 0x03208e08, 0x000d1175}}, Y: Field{[10]uint32{0x010b6d5b, 0x0388e922, 0x013d4b63, 0x00dfa0a5, 0x0238da06, 0x000db868, 0x03c8626f, 0x013bcce8, 0x035dfdb5, 0x001b5040}}}, + {X: Field{[10]uint32{0x03a58cd7, 0x008f50fd, 0x02b9c72c, 0x01b57f9a, 0x01789a36, 0x00493378, 0x01933f97, 0x00da6874, 0x025a6235, 0x003852ca}}, Y: Field{[10]uint32{0x01fc8f8f, 0x011342fe, 0x013be447, 0x00658954, 0x01d67a9f, 0x022a7962, 0x02fe6ce5, 0x030409b2, 0x02c52f63, 0x00085bc1}}}, + {X: Field{[10]uint32{0x01891e0b, 0x00fa4b8b, 0x00deaf8f, 0x00199cd2, 0x00eec931, 0x0302205c, 0x010b2b33, 0x02f113f3, 0x00bc8389, 0x001b6590}}, Y: Field{[10]uint32{0x0104227d, 0x00af105f, 0x0331a185, 0x02c20586, 0x0068b5d4, 0x010a21ff, 0x0204759a, 0x036d927f, 0x00856e42, 0x0012d305}}}, + {X: Field{[10]uint32{0x019b2916, 0x002bf3bf, 0x0232462a, 0x0016e781, 0x02fd028a, 0x01f00ec6, 0x027cc60d, 0x007c84fd, 0x00045c46, 0x0009cbc5}}, Y: Field{[10]uint32{0x03348416, 0x03350cea, 0x00b1e825, 0x020cc551, 0x03fd6b75, 0x0003ac37, 0x023f78d8, 0x00d4e029, 0x02c0c0b2, 0x002618d7}}}, + {X: Field{[10]uint32{0x033a07e3, 0x00ca7b87, 0x02257681, 0x013b7a45, 0x02415233, 0x0378738e, 0x01250bec, 0x01d1698c, 0x0128eaae, 0x002a3266}}, Y: Field{[10]uint32{0x03351621, 0x03358479, 0x006209f5, 0x02df9879, 0x0124ae51, 0x0058bfb4, 0x01149aa5, 0x00fdfa38, 0x0286abdf, 0x00133309}}}, + {X: Field{[10]uint32{0x00975409, 0x00e18036, 0x01ceffac, 0x01403f4c, 0x011c660d, 0x02c79320, 0x01be6869, 0x03559626, 0x03337f93, 0x003ec092}}, Y: Field{[10]uint32{0x00c7fdb0, 0x01cbd1f1, 0x01e127b0, 0x028a2765, 0x03ee562c, 0x0115e59b, 0x00730c39, 0x00f255fa, 0x02b78bff, 0x000ce5a1}}}, + {X: Field{[10]uint32{0x00562f9c, 0x021c15ca, 0x014f2351, 0x03e73912, 0x00a6cb14, 0x0246e136, 0x03ecfe36, 0x00d525dc, 0x0147aa61, 0x00383921}}, Y: Field{[10]uint32{0x00a7b307, 0x01dbbbf7, 0x03676a6d, 0x03e1a7d1, 0x03778609, 0x00e58012, 0x03488389, 0x01d60149, 0x018b5640, 0x00182db7}}}, + {X: Field{[10]uint32{0x025d16e4, 0x01bbd644, 0x02169807, 0x00f77fb0, 0x03ed9e38, 0x001786c2, 0x0374d296, 0x022d4c27, 0x002d378b, 0x002f5b10}}, Y: Field{[10]uint32{0x01ef2c24, 0x0086c8a7, 0x00f10755, 0x012de544, 0x02a27692, 0x0231b4b0, 0x036a8f8c, 0x0071ecdd, 0x009cbb76, 0x00330eab}}}, + {X: Field{[10]uint32{0x01e451c0, 0x0085eb01, 0x02ef552c, 0x02f78542, 0x01d5886c, 0x03da548d, 0x00e2c554, 0x013d1051, 0x0231eefa, 0x0039a464}}, Y: Field{[10]uint32{0x03b1cfa7, 0x02ea6b18, 0x0346bc2a, 0x03f1a49f, 0x0173a888, 0x00a8473f, 0x0156133c, 0x00984ad3, 0x01d4d34d, 0x0039d3b8}}}, + {X: Field{[10]uint32{0x003d03a9, 0x02e92868, 0x01463f9c, 0x007a3051, 0x02037c48, 0x00a2f6ce, 0x012ac5a3, 0x01e1d136, 0x006a2a48, 0x0006a6b3}}, Y: Field{[10]uint32{0x01f0fb10, 0x01f1623f, 0x01ca126a, 0x0206d26d, 0x02df71fc, 0x01ff87d7, 0x02224224, 0x00d8a3eb, 0x029a960e, 0x0002e981}}}, + {X: Field{[10]uint32{0x02070910, 0x033bd33d, 0x028d536c, 0x0108f5b6, 0x00abfde6, 0x00b6e66e, 0x004e9395, 0x038c07cb, 0x03a92e5f, 0x0016d4ae}}, Y: Field{[10]uint32{0x0347ae29, 0x01bb796d, 0x00341f54, 0x02c0bf9d, 0x02cc1ab1, 0x01c6bb42, 0x00c68f0a, 0x0089f446, 0x03dd901e, 0x00042376}}}, + {X: Field{[10]uint32{0x01e05242, 0x00ce29ac, 0x022860f1, 0x02935fe6, 0x000652b0, 0x00ef8a0a, 0x01a096a7, 0x020aa6c4, 0x03601ebe, 0x0024b04d}}, Y: Field{[10]uint32{0x02449d7c, 0x02b01b02, 0x0027559f, 0x02f74538, 0x0251a588, 0x017db1e6, 0x003dd578, 0x0343e975, 0x03fc2dc6, 0x000b8fa4}}}, + {X: Field{[10]uint32{0x014318b8, 0x03ff97c7, 0x01d69a12, 0x01e7d818, 0x0194b4f2, 0x022550af, 0x021c749e, 0x01305dce, 0x00da7996, 0x000f2dbe}}, Y: Field{[10]uint32{0x03b11956, 0x02e904da, 0x01d54d05, 0x01c5b9ac, 0x0272a777, 0x02bb8a55, 0x023bd02f, 0x016b6370, 0x01a8b4f4, 0x0010b930}}}, + {X: Field{[10]uint32{0x03dbf5db, 0x00545142, 0x0183f664, 0x01366a00, 0x013c60a1, 0x01437839, 0x01a51100, 0x00637444, 0x0351d345, 0x0017fb58}}, Y: Field{[10]uint32{0x0346c3f6, 0x0299621d, 0x036cd056, 0x0078a579, 0x01da77e0, 0x026f60dd, 0x00140b64, 0x029342dd, 0x0190de07, 0x001ade69}}}, + {X: Field{[10]uint32{0x015d3840, 0x0064f8f6, 0x0356e7d3, 0x02c7f43e, 0x00a14132, 0x0301844a, 0x00245d37, 0x0213cadf, 0x00a781c3, 0x000ae23c}}, Y: Field{[10]uint32{0x01a0e10e, 0x021cfe22, 0x02981bd4, 0x02e520e2, 0x00c1632b, 0x0089125d, 0x01b6453c, 0x01b95d95, 0x03a21144, 0x003de1f9}}}, + {X: Field{[10]uint32{0x03293443, 0x02ec0b60, 0x02fd2047, 0x0253a623, 0x0118507f, 0x0368d9c6, 0x030ac3e1, 0x0157ecd6, 0x03b15a3f, 0x0031ec91}}, Y: Field{[10]uint32{0x01b85f4f, 0x01ee341b, 0x00b6799e, 0x03d993cf, 0x00c3c8e5, 0x0309f152, 0x02b6ac8b, 0x017c448d, 0x003734c6, 0x0012ad01}}}, + {X: Field{[10]uint32{0x003647dd, 0x02a8dd78, 0x005344c6, 0x03484875, 0x0045df69, 0x00b04df8, 0x0008a201, 0x02520417, 0x01338dcb, 0x00377f6a}}, Y: Field{[10]uint32{0x03795c1b, 0x02ff96d5, 0x02091bbc, 0x015691be, 0x0095f912, 0x0161c4b4, 0x032e93ac, 0x005af565, 0x01fd02a1, 0x003a57de}}}, + {X: Field{[10]uint32{0x031da7db, 0x013fbe8d, 0x00c29da0, 0x02d99dfe, 0x029d15a6, 0x0091fa1f, 0x03e3233b, 0x02c415b1, 0x02455084, 0x00372369}}, Y: Field{[10]uint32{0x001449c3, 0x00c81211, 0x00c80931, 0x00a198df, 0x018fc66d, 0x022f5da1, 0x0207fea0, 0x03b00fda, 0x01a3fde3, 0x0030a8d1}}}, + {X: Field{[10]uint32{0x01ff5333, 0x015520b4, 0x0395b8e3, 0x0334ea31, 0x02a31547, 0x0190e415, 0x0263bc7a, 0x02fea3c4, 0x0326c5fc, 0x003d4fce}}, Y: Field{[10]uint32{0x02716ac1, 0x022f8eb9, 0x031d1bb6, 0x03b1e662, 0x035249e8, 0x005f13ec, 0x0188f1da, 0x02e72a63, 0x0145e664, 0x000044fb}}}, + {X: Field{[10]uint32{0x0246cae9, 0x0277242d, 0x03a391d8, 0x021a4c4e, 0x027d7546, 0x0365a77d, 0x021d6477, 0x012d793b, 0x03fd0c6d, 0x00192348}}, Y: Field{[10]uint32{0x03e18962, 0x036f8a00, 0x0120615e, 0x01500c98, 0x009b3364, 0x02b81a5f, 0x02ffbd4b, 0x01d74d39, 0x00452393, 0x00340d78}}}, + {X: Field{[10]uint32{0x002839b1, 0x020ff84f, 0x011cb1c4, 0x038ac72a, 0x03bd51bd, 0x035c2cd0, 0x0073f3ed, 0x01603e09, 0x010e5dbe, 0x0024b9b7}}, Y: Field{[10]uint32{0x039577a5, 0x03d1852c, 0x012015dd, 0x007a8432, 0x01a61ab0, 0x02826ce4, 0x02d1a465, 0x01ef4964, 0x03fea544, 0x00336437}}}, + {X: Field{[10]uint32{0x009f687b, 0x013b983d, 0x03b782ef, 0x020daf9b, 0x00eaec05, 0x02505695, 0x0223ec54, 0x03be33e8, 0x018a7616, 0x0004c579}}, Y: Field{[10]uint32{0x03e1431c, 0x016109b5, 0x0280f1ac, 0x0285cdf6, 0x022fe189, 0x036b1caa, 0x00e1fa45, 0x01832f15, 0x0100802d, 0x001ca780}}}, + {X: Field{[10]uint32{0x033e2a3b, 0x0008522a, 0x035e6c94, 0x03579b41, 0x0186b001, 0x00d55394, 0x026b284a, 0x03f61438, 0x03999857, 0x000f22a5}}, Y: Field{[10]uint32{0x00b25977, 0x01a76f4a, 0x012f6d6c, 0x00568410, 0x03a722e9, 0x00140819, 0x0087b3d6, 0x00829565, 0x0092acc7, 0x001193c1}}}, + {X: Field{[10]uint32{0x027591c8, 0x00ba9d84, 0x00879f86, 0x03e3fc0f, 0x010bf3c7, 0x01be6b38, 0x02b37cae, 0x0317d10d, 0x0230cc94, 0x003a905c}}, Y: Field{[10]uint32{0x01a4faa6, 0x01819f61, 0x033ace91, 0x01d5c09a, 0x006f4ec4, 0x02735010, 0x00cff1eb, 0x03542eeb, 0x00cb8d95, 0x0025848e}}}, + {X: Field{[10]uint32{0x021a6ceb, 0x0066854d, 0x0040bceb, 0x0282c316, 0x0348496c, 0x00b262bd, 0x01a8c816, 0x001e78ca, 0x01c2f271, 0x0023b33e}}, Y: Field{[10]uint32{0x017e56af, 0x00f5a1ec, 0x03a5b0b5, 0x00e684cb, 0x01c8ac52, 0x00bcdeca, 0x00c6a7c5, 0x03c6a98c, 0x0219165b, 0x000f8966}}}, + {X: Field{[10]uint32{0x030f296d, 0x00e62d53, 0x0155677f, 0x004e10b3, 0x027bf3d9, 0x0153adaa, 0x033c34ab, 0x00e965a1, 0x0083b350, 0x000cbc3f}}, Y: Field{[10]uint32{0x0381a811, 0x036328be, 0x01e26655, 0x02b73268, 0x00311e50, 0x032d7dec, 0x02da3459, 0x01e2dd8b, 0x016d906f, 0x00351cdb}}}, + {X: Field{[10]uint32{0x00d7accb, 0x00c60db8, 0x00a9f638, 0x0302c985, 0x03e4fa4c, 0x017fdf2f, 0x03c171da, 0x00ea3e90, 0x011077c8, 0x002df58c}}, Y: Field{[10]uint32{0x016be9de, 0x0217af5e, 0x037e35e2, 0x02d30648, 0x008b84a5, 0x0307ae99, 0x02c27ef9, 0x00554aa2, 0x02405644, 0x0018257d}}}, + {X: Field{[10]uint32{0x02536954, 0x009a52ef, 0x02cf06c3, 0x03e35a49, 0x010588b4, 0x0158f95b, 0x00cd74e6, 0x013ec295, 0x004a22df, 0x003bdb24}}, Y: Field{[10]uint32{0x025dbaa4, 0x02568881, 0x00c9fb10, 0x024b83a7, 0x02aa7a04, 0x00dc5788, 0x03c3d3c4, 0x00de9396, 0x00b144cd, 0x000c2244}}}, + {X: Field{[10]uint32{0x02941a6a, 0x00b5eac8, 0x02e27067, 0x0079baaa, 0x02b37524, 0x012385fe, 0x00eebf0b, 0x0096f2b3, 0x03d1e628, 0x0006784e}}, Y: Field{[10]uint32{0x00b613f7, 0x00f2430a, 0x03bbad3e, 0x019b92bc, 0x02855ea6, 0x02fe3330, 0x01308bbd, 0x016f0455, 0x03290700, 0x001bc8b0}}}, + {X: Field{[10]uint32{0x008e9420, 0x02dec447, 0x025df967, 0x02af5e4a, 0x009a98a7, 0x03ca602c, 0x0349ae45, 0x03de41e4, 0x00df10f2, 0x0015f66f}}, Y: Field{[10]uint32{0x0265db68, 0x01a29ca6, 0x0265eb50, 0x03d6ff93, 0x0142ebfd, 0x033009ec, 0x00f8fcb1, 0x0215378d, 0x01e1d9b7, 0x002fd997}}}, + {X: Field{[10]uint32{0x03df06b2, 0x03e1eb80, 0x0057e4e3, 0x0087c4f4, 0x00bb530a, 0x0347b4c9, 0x038874e3, 0x017a2c21, 0x02857c3d, 0x000def19}}, Y: Field{[10]uint32{0x00998539, 0x00711493, 0x02ec83a8, 0x02f5cbd7, 0x0377764a, 0x00729eef, 0x02abbeac, 0x02c4bbc4, 0x03dc764d, 0x00055066}}}, + {X: Field{[10]uint32{0x01c2cec2, 0x01962a7e, 0x021387f3, 0x00729d04, 0x00b572e1, 0x01944b0b, 0x00012a59, 0x024544cf, 0x01d99ca5, 0x0006cc31}}, Y: Field{[10]uint32{0x02f39697, 0x02c16417, 0x0169101d, 0x01445a97, 0x002344f7, 0x01ebe327, 0x004d8421, 0x03343150, 0x020b2a0d, 0x0037108c}}}, + {X: Field{[10]uint32{0x01efd0bf, 0x02d387f0, 0x03e65b8d, 0x008616e4, 0x01e6e89f, 0x016b5297, 0x0329f4f8, 0x0156b374, 0x01b3050c, 0x0025a0c7}}, Y: Field{[10]uint32{0x03d47837, 0x0127b673, 0x00ef455e, 0x035687e3, 0x0082bd8b, 0x01c1cbcb, 0x0275ef61, 0x01ce6b43, 0x0020fd03, 0x0021bd0e}}}, + {X: Field{[10]uint32{0x00e3d8ad, 0x024f3551, 0x0379266b, 0x027a85f2, 0x02bce799, 0x01eb3550, 0x0309f28f, 0x00129560, 0x000faa1f, 0x00334bd4}}, Y: Field{[10]uint32{0x00dd8c29, 0x025011b2, 0x0009e929, 0x00158fbc, 0x0127dd1b, 0x02057de5, 0x00743c24, 0x03abba5f, 0x0080ddfc, 0x0007e5dc}}}, + {X: Field{[10]uint32{0x02d01c08, 0x00af85d2, 0x003e8ff3, 0x0279829e, 0x00802f51, 0x00d54a4a, 0x0318ff9d, 0x02789e8c, 0x027d237c, 0x00180e4a}}, Y: Field{[10]uint32{0x02893fdc, 0x03615bc8, 0x02065663, 0x00714e7f, 0x0088ae9e, 0x03ca5f11, 0x0194afbd, 0x0347e362, 0x0147df91, 0x003adfcc}}}, + {X: Field{[10]uint32{0x0237ee9a, 0x015d3e7e, 0x03c90d22, 0x01e45e6c, 0x03d8abb6, 0x03cf075f, 0x00d68fb9, 0x02adcc08, 0x03ad0df6, 0x003db3dd}}, Y: Field{[10]uint32{0x0042ebd1, 0x031de389, 0x03523280, 0x02e873e6, 0x0177e81e, 0x037dd8c4, 0x01d513b7, 0x03dc59ad, 0x01c33587, 0x0023fe8a}}}, + {X: Field{[10]uint32{0x027cdf7a, 0x001c50b6, 0x00abd018, 0x028b49a9, 0x00944a0e, 0x0046f8bf, 0x01b6f4ff, 0x03145165, 0x015af542, 0x0015f200}}, Y: Field{[10]uint32{0x00b05da9, 0x0319cfaa, 0x03e3d2c9, 0x02ff45b8, 0x00ffb692, 0x028dd537, 0x02b32d33, 0x00f319ed, 0x039e8015, 0x002d9f1d}}}, + {X: Field{[10]uint32{0x034fe462, 0x0390679a, 0x03b4bfa1, 0x01feed90, 0x012f58a1, 0x02ba664c, 0x03d5c51c, 0x01248bfe, 0x0158ac18, 0x001ff821}}, Y: Field{[10]uint32{0x01ec7a11, 0x023ef9de, 0x0079e5a8, 0x01745664, 0x007268cb, 0x03565616, 0x027e9e4c, 0x0162d4db, 0x037d8bbf, 0x001d8011}}}, + {X: Field{[10]uint32{0x01517b75, 0x0367cfb7, 0x0177d87b, 0x017d62f8, 0x023d8109, 0x03639f13, 0x029b87a0, 0x026fbf5c, 0x016e73b3, 0x000b85bd}}, Y: Field{[10]uint32{0x035fcb7a, 0x013905cd, 0x011aa69b, 0x03c1e808, 0x0177aa59, 0x01a3c260, 0x02c950e6, 0x00e836ea, 0x01ef5732, 0x0013389c}}}, + {X: Field{[10]uint32{0x00ffdedb, 0x03ae9886, 0x017ad9c2, 0x039b4b76, 0x0049200d, 0x0328929a, 0x0381f666, 0x01e00af9, 0x000d456d, 0x0029351c}}, Y: Field{[10]uint32{0x026e4532, 0x0350d3f1, 0x036d5efe, 0x0396bc4b, 0x009124aa, 0x02192936, 0x030e7628, 0x0283c3a3, 0x006d0e7b, 0x0030267e}}}, + {X: Field{[10]uint32{0x033fc059, 0x02306676, 0x0145dc04, 0x01d061fc, 0x01a2327e, 0x00795eb9, 0x016c9219, 0x0278fa8c, 0x01505011, 0x002d1d93}}, Y: Field{[10]uint32{0x0398653c, 0x00f55a91, 0x03092c2f, 0x01c13e93, 0x004f1270, 0x0005a862, 0x00831ea9, 0x0084a4fb, 0x00facc27, 0x0038e6fa}}}, + {X: Field{[10]uint32{0x027e2d0e, 0x0064c6c3, 0x02235503, 0x008ebae0, 0x02c29fe1, 0x0213f1a5, 0x015b352e, 0x02afc33b, 0x03a7d291, 0x000f9a1a}}, Y: Field{[10]uint32{0x0185d266, 0x0371306a, 0x02ed88c7, 0x001e6327, 0x005a889b, 0x00c86e6e, 0x00caf9a9, 0x00f207e1, 0x00ab07cc, 0x001ecd70}}}, + {X: Field{[10]uint32{0x024a46c5, 0x02501f34, 0x03346db4, 0x0014a234, 0x03584001, 0x00c488c5, 0x0161e563, 0x01c3bf16, 0x032d1d4c, 0x0035e21b}}, Y: Field{[10]uint32{0x00b9efc8, 0x02501015, 0x023e868d, 0x00fe053c, 0x03c5ef50, 0x0135f6ea, 0x0225903d, 0x018092cb, 0x02e617c4, 0x00369917}}}, + {X: Field{[10]uint32{0x03a17a40, 0x01e643c2, 0x03475d3a, 0x03c8c976, 0x02cea867, 0x038dd519, 0x0257ba71, 0x0135016a, 0x03cc1465, 0x001f2f48}}, Y: Field{[10]uint32{0x02dcbc51, 0x03968774, 0x0303954c, 0x01ffb74d, 0x02088d32, 0x018e3b3a, 0x005541ee, 0x01b6d2e6, 0x01af96e6, 0x003b7739}}}, + {X: Field{[10]uint32{0x03eb9795, 0x02e62505, 0x00a5c5d2, 0x02ed6185, 0x0018f877, 0x00cf0864, 0x00ea0a92, 0x03876bbb, 0x0185c279, 0x00151898}}, Y: Field{[10]uint32{0x00e9b6f8, 0x0342e1b8, 0x0309d928, 0x03c37192, 0x018cfb07, 0x033f1e46, 0x03967305, 0x0211502f, 0x0185dc8f, 0x001941fb}}}, + {X: Field{[10]uint32{0x0163c32e, 0x02170201, 0x00681892, 0x03e78880, 0x0259e68c, 0x0376afbe, 0x02db20aa, 0x030b38af, 0x01551cbe, 0x003b73bc}}, Y: Field{[10]uint32{0x02753179, 0x035e8f6f, 0x00b33b03, 0x03f677da, 0x00bed59e, 0x032e936d, 0x016ab45b, 0x00a14f0a, 0x01437559, 0x002b799c}}}, + {X: Field{[10]uint32{0x023380cd, 0x02342180, 0x02dd99cf, 0x017320d2, 0x036a30bc, 0x032476df, 0x03db47fb, 0x03e74fc9, 0x0153ff6e, 0x003809ea}}, Y: Field{[10]uint32{0x03a2bbf5, 0x00d8b6b2, 0x032e4c7e, 0x02025d61, 0x0162eafc, 0x03114aa0, 0x012d174a, 0x03408239, 0x004de18a, 0x00079ac9}}}, + {X: Field{[10]uint32{0x02e2b2d6, 0x02b1bd9c, 0x00960e17, 0x00b2aa88, 0x0366dbf9, 0x01e1f549, 0x02a251f3, 0x00090953, 0x0168db98, 0x0029401b}}, Y: Field{[10]uint32{0x020b2b9c, 0x00fea95a, 0x01babfa6, 0x037d735b, 0x0372d1e6, 0x003dd1c8, 0x0198766c, 0x03756e53, 0x017ee854, 0x002864e3}}}, + {X: Field{[10]uint32{0x0027be11, 0x039419a1, 0x004e03d5, 0x00943b94, 0x01dbb020, 0x00a65646, 0x029adf73, 0x03f67b69, 0x01f201a1, 0x000c9c1d}}, Y: Field{[10]uint32{0x03c4debb, 0x02ace05a, 0x02df32de, 0x03091466, 0x02611a4e, 0x036157e8, 0x00ee3356, 0x0252fa52, 0x02b1c32e, 0x0010695f}}}, + {X: Field{[10]uint32{0x023363bd, 0x01e567c6, 0x0399ac1c, 0x0013188d, 0x039c87ac, 0x03a57dd2, 0x010cdcd7, 0x012f29ac, 0x01c66669, 0x0025f869}}, Y: Field{[10]uint32{0x00ab5e88, 0x026e49f2, 0x006a948c, 0x02601095, 0x01566894, 0x0359c709, 0x032bb6c4, 0x01587ded, 0x008d1ec7, 0x000f3269}}}, + {X: Field{[10]uint32{0x00c07a21, 0x0243b4ec, 0x01a047f7, 0x01a27dbf, 0x03d0a2d8, 0x013bad2a, 0x01bce28f, 0x01373f44, 0x0240a737, 0x001143e9}}, Y: Field{[10]uint32{0x03a77f4c, 0x00f285bb, 0x0231fc4c, 0x01b1fae8, 0x02aa35a5, 0x0034774d, 0x002a1f17, 0x033e8752, 0x0298dc17, 0x003aba20}}}, + {X: Field{[10]uint32{0x020a6559, 0x007bd2e7, 0x004a8a7a, 0x02461fa5, 0x00d81fad, 0x01025090, 0x0209ce1f, 0x019a84b6, 0x0340fc0a, 0x003d6a9c}}, Y: Field{[10]uint32{0x02eb5017, 0x0367f1ca, 0x022e349a, 0x004276d4, 0x00899d98, 0x02136e9d, 0x02e7738f, 0x024bc718, 0x03da9ef9, 0x0004956c}}}, + {X: Field{[10]uint32{0x0242f1b4, 0x032529e2, 0x02c8c90c, 0x022a2c53, 0x028857ac, 0x01fef5d6, 0x03238419, 0x01e0da9e, 0x01655519, 0x0001a402}}, Y: Field{[10]uint32{0x031b027b, 0x02eb6305, 0x007100f1, 0x02d3a7bd, 0x02952b5b, 0x02f817cc, 0x02271072, 0x025db6d1, 0x01d2038c, 0x00077060}}}, + {X: Field{[10]uint32{0x03f290aa, 0x00b484b0, 0x01e878ff, 0x03e4cd55, 0x03bc3bc0, 0x030dd830, 0x019f377b, 0x0104d9fa, 0x005a8ed8, 0x000ac6a8}}, Y: Field{[10]uint32{0x0013e280, 0x019f9633, 0x00a417b2, 0x002b2f74, 0x0035e900, 0x01fcda2f, 0x01f58965, 0x02f0c645, 0x02f41eb8, 0x0011ec96}}}, + {X: Field{[10]uint32{0x0052d81d, 0x00574974, 0x01a7ab53, 0x00e75320, 0x03454b1e, 0x00017976, 0x013540d3, 0x02bfc366, 0x029ca18c, 0x002939ad}}, Y: Field{[10]uint32{0x015d70c5, 0x02b70068, 0x0182236f, 0x00845f22, 0x00df4fcb, 0x00b9e9bb, 0x02d78edc, 0x01e41290, 0x01039c58, 0x001f3fc8}}}, + {X: Field{[10]uint32{0x039d2582, 0x01a45bec, 0x00fa17a3, 0x02ca029f, 0x01f728e1, 0x02775de5, 0x039cb0fd, 0x03292cf8, 0x0396c74f, 0x002ad12e}}, Y: Field{[10]uint32{0x0026f5c1, 0x01a8b264, 0x00ab7cb7, 0x036079e5, 0x037edc0d, 0x00645659, 0x0373febb, 0x03633279, 0x03a4519f, 0x00167646}}}, + {X: Field{[10]uint32{0x01e332a2, 0x036f08e7, 0x03cc7715, 0x01d5750b, 0x00934729, 0x015108a2, 0x016a31ae, 0x030f9232, 0x005b3fb9, 0x0020ec32}}, Y: Field{[10]uint32{0x01a6da6e, 0x034c07cd, 0x014b1e36, 0x00e4b592, 0x009652d7, 0x03c21a00, 0x0033b342, 0x00160bf6, 0x0240fb62, 0x003a67d5}}}, + {X: Field{[10]uint32{0x03954537, 0x02c856bb, 0x0078841e, 0x03d10381, 0x03e5bd10, 0x01402f03, 0x02911ee0, 0x033e059d, 0x013e624e, 0x003a914c}}, Y: Field{[10]uint32{0x000c7445, 0x0344c4db, 0x0244e81a, 0x0005342d, 0x00d5afb1, 0x027a2915, 0x03bde53b, 0x02733880, 0x000ce235, 0x0012ae2c}}}, + {X: Field{[10]uint32{0x01a3cd4e, 0x033a87d4, 0x03412ac4, 0x0278df3d, 0x03ae6d60, 0x023249f2, 0x03f7a269, 0x00f65a7d, 0x00e4af82, 0x0024db04}}, Y: Field{[10]uint32{0x017b7213, 0x023a37ec, 0x02b60bf6, 0x01ec04f4, 0x00bdb906, 0x000d67db, 0x03e5bdcf, 0x02142e38, 0x03bb10dd, 0x0011bdca}}}, + {X: Field{[10]uint32{0x02e9bfd6, 0x0243583c, 0x0296b36c, 0x00597478, 0x01847bb1, 0x01aa26cc, 0x02cf8e13, 0x030f6ce4, 0x015b61aa, 0x0010da97}}, Y: Field{[10]uint32{0x0336d68d, 0x0155a18b, 0x0247e336, 0x036839cd, 0x025e342b, 0x012a43e7, 0x038559c8, 0x032b3065, 0x008dae67, 0x003e079a}}}, + {X: Field{[10]uint32{0x00b315d7, 0x02136001, 0x0067aabd, 0x0108b986, 0x02d931a4, 0x0153d898, 0x024b929e, 0x022684e8, 0x00273fe7, 0x0027ae55}}, Y: Field{[10]uint32{0x012ef59c, 0x03e568d3, 0x01c60768, 0x012bfb04, 0x02d29f20, 0x03bfea0a, 0x0020fba8, 0x03990002, 0x01927dc0, 0x000e2ff0}}}, + {X: Field{[10]uint32{0x02280d8a, 0x0392e97e, 0x0277a0e6, 0x00342f68, 0x02ecb77a, 0x0003d8f9, 0x02b4328a, 0x02f02b2d, 0x02f587ec, 0x000e09ad}}, Y: Field{[10]uint32{0x024ef271, 0x00cbc10e, 0x016e6572, 0x024e2e8f, 0x01db35e2, 0x03698fe2, 0x03e6eb9e, 0x039a6c84, 0x01fedcef, 0x0003650d}}}, + {X: Field{[10]uint32{0x00a1dde2, 0x03e32881, 0x00a21cd0, 0x02e36cf3, 0x034dbdce, 0x010d92e7, 0x0193bcf8, 0x0286f8fe, 0x0111ae0e, 0x0028d233}}, Y: Field{[10]uint32{0x0083ac75, 0x03522107, 0x001e91d1, 0x02f5b591, 0x0007078e, 0x004ada28, 0x01c202f2, 0x03ebc9a8, 0x01d3db7c, 0x0007f214}}}, + {X: Field{[10]uint32{0x03df7329, 0x03a6818a, 0x002053c4, 0x039cf2dc, 0x025d70d1, 0x01c90993, 0x027646d0, 0x037cf139, 0x0239237f, 0x002ff855}}, Y: Field{[10]uint32{0x035f88e4, 0x03413e4a, 0x023adf12, 0x0373924b, 0x03345488, 0x01dd9d20, 0x03c09d1d, 0x03967670, 0x03e61ec5, 0x00240acd}}}, + {X: Field{[10]uint32{0x003dfa5e, 0x004f3270, 0x02944144, 0x00409c1f, 0x012642ae, 0x02081608, 0x00dc346c, 0x02dbd350, 0x014d81a1, 0x0038bf6c}}, Y: Field{[10]uint32{0x0088fceb, 0x0028f88d, 0x004086c6, 0x02ca6c03, 0x02131e37, 0x01d9d818, 0x026925ae, 0x021545b1, 0x00ed846e, 0x000c046d}}}, + {X: Field{[10]uint32{0x013c7416, 0x0377b1a4, 0x0038a535, 0x03aab09f, 0x02cf1119, 0x02d2b088, 0x0263659d, 0x019d205d, 0x01c68f47, 0x002ef196}}, Y: Field{[10]uint32{0x0154b954, 0x026099de, 0x00c7a477, 0x00825d6e, 0x03482501, 0x034ff84e, 0x01d13a40, 0x0144abeb, 0x02e19fdb, 0x0007e2db}}}, + {X: Field{[10]uint32{0x02505521, 0x0137a368, 0x02056cef, 0x02dbf67b, 0x01ce9141, 0x03e169e2, 0x016f743a, 0x01e26f6f, 0x02029866, 0x00196f4a}}, Y: Field{[10]uint32{0x0378f5a5, 0x017ce74c, 0x0370c6b6, 0x0135c429, 0x02990b18, 0x030f9b15, 0x01644a46, 0x02def175, 0x00301ced, 0x000cb6f8}}}, + {X: Field{[10]uint32{0x0278e981, 0x01645ac8, 0x01406a3a, 0x02427817, 0x00e9318d, 0x0303cdc9, 0x0175a49f, 0x033df093, 0x02eb8382, 0x0007b039}}, Y: Field{[10]uint32{0x0015715a, 0x033f0acd, 0x019fc240, 0x0018cdf3, 0x02fa56ac, 0x01a5f7af, 0x008ade3c, 0x02f2bfab, 0x029cf486, 0x00394384}}}, + {X: Field{[10]uint32{0x03a9eb8c, 0x032c43d8, 0x00d9e10d, 0x0248cd96, 0x00c0399c, 0x0284058a, 0x01aceb1e, 0x02896678, 0x031c203d, 0x001ce42b}}, Y: Field{[10]uint32{0x037c3126, 0x03837c25, 0x02418320, 0x028ce6f3, 0x002c3ada, 0x037af9f6, 0x03cad451, 0x01ec275e, 0x00966064, 0x001f4855}}}, + {X: Field{[10]uint32{0x021a533b, 0x01c7a05a, 0x01eb2b4b, 0x007b624c, 0x01127baf, 0x00267311, 0x03ff7f37, 0x00dd91e0, 0x00697b91, 0x00266945}}, Y: Field{[10]uint32{0x03e2e8e4, 0x022018e9, 0x00d4c8a2, 0x03c23a8e, 0x00809d21, 0x02b9d23f, 0x00bd57db, 0x01dc2c3f, 0x000f7503, 0x00127034}}}, + {X: Field{[10]uint32{0x020394d9, 0x03eb5962, 0x018cbf12, 0x038313f2, 0x02320ba2, 0x03c6dc09, 0x03b7dbfe, 0x00133033, 0x00b13b48, 0x003935b8}}, Y: Field{[10]uint32{0x03761a41, 0x01d74d8e, 0x01b6c750, 0x03760619, 0x03af5fc3, 0x038338be, 0x035ad203, 0x001bf9a9, 0x02ac73a0, 0x002bac3a}}}, + {X: Field{[10]uint32{0x01fe1a04, 0x01445b86, 0x03459d88, 0x0160ad54, 0x031a9aa0, 0x02b48fec, 0x03e1c460, 0x0397ab2c, 0x0141507c, 0x00122290}}, Y: Field{[10]uint32{0x0312bd12, 0x008d7d33, 0x0104f0d7, 0x01ce97f6, 0x00e82f80, 0x02b58ec1, 0x01eaf25e, 0x03e31d33, 0x0066043e, 0x001af5a8}}}, + {X: Field{[10]uint32{0x03babaa1, 0x03057659, 0x028c55d2, 0x011f290b, 0x032cb65b, 0x00b7eeb0, 0x011c2ffd, 0x0295346b, 0x024ded0c, 0x00303ff8}}, Y: Field{[10]uint32{0x027e9289, 0x01f1af5f, 0x0167dbbd, 0x03859d59, 0x03a0a330, 0x037dc047, 0x01bbba88, 0x0137c867, 0x023e29c5, 0x00345731}}}, + {X: Field{[10]uint32{0x027780b1, 0x016e48dd, 0x03fb2830, 0x003fc82f, 0x0131b05d, 0x023f17bc, 0x02dd36dd, 0x01389677, 0x030206c7, 0x000cdb66}}, Y: Field{[10]uint32{0x014e647b, 0x0179fd50, 0x01fd1b05, 0x0184051c, 0x032b1b64, 0x006f6e27, 0x03e6510e, 0x029c1eba, 0x00fc9886, 0x0012bb6b}}}, + {X: Field{[10]uint32{0x02dcf04f, 0x03b38b40, 0x024a706a, 0x016b3a11, 0x019a2a17, 0x031ee1b9, 0x03d3711d, 0x029ef8ee, 0x02b98973, 0x00260d4f}}, Y: Field{[10]uint32{0x02ee767e, 0x01d187ea, 0x0196d980, 0x0290f5b1, 0x028e45b4, 0x00178704, 0x02108873, 0x01290e3d, 0x02c22789, 0x002a1dfe}}}, + {X: Field{[10]uint32{0x02da1e61, 0x01f0d84d, 0x039053f3, 0x01df0e3a, 0x0271c9fb, 0x0153f2c2, 0x0239cecb, 0x03e77d8d, 0x021c17ff, 0x003370d7}}, Y: Field{[10]uint32{0x0094eace, 0x026d9a25, 0x017782bb, 0x0275f58a, 0x0087ae55, 0x030528c7, 0x024f0ccd, 0x01c9837d, 0x02bafe91, 0x002a332d}}}, + {X: Field{[10]uint32{0x00111941, 0x026a4d20, 0x00b5b515, 0x03b149b3, 0x015d7407, 0x02701bc5, 0x00584093, 0x0282c9c5, 0x01c15e62, 0x00244b2c}}, Y: Field{[10]uint32{0x03049bf6, 0x02f561cd, 0x035adbf4, 0x02e60d23, 0x026fa710, 0x031c3769, 0x00cecc86, 0x03111f34, 0x00d51723, 0x00161305}}}, + {X: Field{[10]uint32{0x03bff3bc, 0x0339a4f0, 0x0102b5dd, 0x01a26003, 0x01ffd195, 0x03fd00d0, 0x02ec6e2c, 0x022b3667, 0x017c7c1e, 0x00085178}}, Y: Field{[10]uint32{0x0236356f, 0x02ffd3dd, 0x02b68957, 0x0222bebf, 0x00a5c430, 0x02769eeb, 0x030e9b89, 0x02cdce56, 0x01a240c0, 0x000ee29c}}}, + {X: Field{[10]uint32{0x010b1692, 0x00baa523, 0x004ab3aa, 0x002882ff, 0x0143e091, 0x000f3721, 0x024f7e1d, 0x01c9c888, 0x03367e87, 0x00392824}}, Y: Field{[10]uint32{0x02cf846e, 0x00557df0, 0x00f80328, 0x0372bdf4, 0x02898f48, 0x03e9b8d3, 0x02b8315a, 0x01bc0e3b, 0x00313314, 0x00092c7b}}}, + {X: Field{[10]uint32{0x0328db40, 0x026cdb34, 0x02bb0f57, 0x0361001b, 0x012b1390, 0x01900a1d, 0x03387ed4, 0x01166edf, 0x02dd464d, 0x003f7d49}}, Y: Field{[10]uint32{0x013a3987, 0x011f0379, 0x00963141, 0x026a9d17, 0x01937326, 0x004993b1, 0x02cf7766, 0x005b4774, 0x02c56792, 0x0010e5b9}}}, + {X: Field{[10]uint32{0x00729f86, 0x016fed3b, 0x01da4fab, 0x012539d4, 0x0252ca4c, 0x02b77cfd, 0x01933ebc, 0x01c9cd42, 0x0016b3e3, 0x0001b217}}, Y: Field{[10]uint32{0x03648d6f, 0x019bc5ba, 0x01cf1217, 0x02646e7e, 0x01e592ce, 0x0177a64a, 0x0249040c, 0x0201f979, 0x03c8520b, 0x0026d4c3}}}, + {X: Field{[10]uint32{0x00e28e58, 0x0031e44b, 0x03203feb, 0x02889560, 0x03004e7d, 0x0378033e, 0x0098ce4b, 0x038b0043, 0x023c596e, 0x0013efeb}}, Y: Field{[10]uint32{0x026ff099, 0x00d55fb6, 0x017993e7, 0x01960ef0, 0x02396b8a, 0x03d43f58, 0x02dcfdcf, 0x00d92e57, 0x0104ed0e, 0x003fb3c1}}}, + {X: Field{[10]uint32{0x0378bab8, 0x00d44f81, 0x001fa150, 0x02ef4f0a, 0x0197c1d7, 0x003a7204, 0x0283c2b9, 0x0045e4ed, 0x037b8017, 0x0026f30e}}, Y: Field{[10]uint32{0x01bc0b43, 0x002e45d0, 0x03e9f3b7, 0x00275f62, 0x03a887f0, 0x02166ea8, 0x03825ab9, 0x0227469d, 0x00928782, 0x00368bab}}}, + {X: Field{[10]uint32{0x03635150, 0x0380be5a, 0x03c8a024, 0x0098ed78, 0x00855b0a, 0x01cb44c5, 0x02956956, 0x028ecfd6, 0x00400e70, 0x00110568}}, Y: Field{[10]uint32{0x023986be, 0x02961a76, 0x0223ec58, 0x0158e7cc, 0x016843ac, 0x026bf571, 0x02921603, 0x02a7e207, 0x038fcf55, 0x0036294e}}}, + {X: Field{[10]uint32{0x005b2341, 0x00212dc1, 0x030924d2, 0x00d8b54d, 0x01b617b5, 0x03880e0e, 0x00988fcb, 0x02f3da8e, 0x01c9cdaf, 0x001579d6}}, Y: Field{[10]uint32{0x0131bb95, 0x03e0abfe, 0x015d6cf7, 0x02dd0bae, 0x013c1191, 0x0288c561, 0x01524834, 0x00d01626, 0x03eaca8a, 0x00129a4c}}}, + {X: Field{[10]uint32{0x0140e9c8, 0x018d2215, 0x024b95ed, 0x0162b6f7, 0x018d1153, 0x03720f82, 0x017e072b, 0x00f0bc29, 0x0325bee2, 0x00084087}}, Y: Field{[10]uint32{0x01a8c9f0, 0x02ff8f3e, 0x008d4ba5, 0x0071fe19, 0x034ed8dc, 0x037208a8, 0x002c98f8, 0x003bfdf1, 0x0291a770, 0x0026bbd5}}}, + {X: Field{[10]uint32{0x01b376d1, 0x031e60b3, 0x024a7a28, 0x03bda413, 0x02c70771, 0x003502e2, 0x03f3c641, 0x006bffb7, 0x011ddded, 0x000ad38c}}, Y: Field{[10]uint32{0x0309b05c, 0x02b1cc35, 0x02575d20, 0x034db1e4, 0x0248b25d, 0x015fd6e5, 0x0243d02b, 0x016c1c3f, 0x00f56b25, 0x0005170c}}}, + {X: Field{[10]uint32{0x015378b3, 0x022d7d17, 0x0091e8b9, 0x02be412c, 0x025ed91c, 0x0017496d, 0x00dbf5be, 0x01840324, 0x021c7e16, 0x0014642c}}, Y: Field{[10]uint32{0x02650073, 0x0102d299, 0x01166040, 0x01b085b0, 0x001826d2, 0x02f83550, 0x00e3f268, 0x0317e2d4, 0x02471fbd, 0x002e0f33}}}, + {X: Field{[10]uint32{0x005b56f7, 0x03d00c15, 0x016ae1f2, 0x0025df40, 0x0188b1b0, 0x01d82062, 0x007c7b28, 0x01702cd9, 0x02e454c6, 0x000ac847}}, Y: Field{[10]uint32{0x02854f5c, 0x01c3775d, 0x03506f9b, 0x01a6e18f, 0x00fff746, 0x01e984a2, 0x01a25634, 0x03f0755c, 0x015917d8, 0x001d5d0e}}}, + {X: Field{[10]uint32{0x024134d4, 0x03e52bb9, 0x021b6d4a, 0x013e5063, 0x03a3caad, 0x03dae99b, 0x038ec37f, 0x002bb8d1, 0x0392b41e, 0x0032cc2d}}, Y: Field{[10]uint32{0x028358c5, 0x006aad88, 0x008e771b, 0x00376bac, 0x00914230, 0x003471ca, 0x02b8b4ec, 0x027d2e48, 0x02decb3a, 0x001155c6}}}, + {X: Field{[10]uint32{0x00e4bc6c, 0x00f34c81, 0x012e065c, 0x0149fba8, 0x03e46879, 0x0226f99e, 0x0349d070, 0x02a85ba5, 0x03a8d2fc, 0x003d390d}}, Y: Field{[10]uint32{0x03ba97c4, 0x02798a9d, 0x009c4344, 0x03f0e489, 0x008e7647, 0x03743b8a, 0x01e51f8b, 0x02ba28c3, 0x028b7e81, 0x003ed4b4}}}, + {X: Field{[10]uint32{0x0350d518, 0x0314f377, 0x00080545, 0x012f2d9e, 0x00ce85a9, 0x024f677e, 0x02a726c1, 0x0066cef1, 0x02a76a2a, 0x0028299d}}, Y: Field{[10]uint32{0x03190a71, 0x01ff2223, 0x03fe8e43, 0x01a28f26, 0x0041198d, 0x02b901c0, 0x01816e5a, 0x02f4842e, 0x00c6b1b7, 0x00191ffa}}}, + {X: Field{[10]uint32{0x03ff7b7e, 0x00296eed, 0x0171c786, 0x01745762, 0x0275a2ba, 0x03abbbb9, 0x00544ab1, 0x0250a2c4, 0x03ead7f3, 0x00057753}}, Y: Field{[10]uint32{0x0038445c, 0x00b11c67, 0x02961844, 0x007c6c7e, 0x0253924d, 0x02dcc8b4, 0x02313427, 0x008551f4, 0x01dd5fab, 0x00226557}}}, + {X: Field{[10]uint32{0x030ca522, 0x03d8c864, 0x012b8850, 0x00ffdcb3, 0x0301bdea, 0x035d3767, 0x037a188e, 0x012d1d8d, 0x00004029, 0x002a01ae}}, Y: Field{[10]uint32{0x02b97213, 0x02fb7237, 0x010db9c6, 0x02b18624, 0x0253e49a, 0x02aceee1, 0x03f1fa88, 0x02c6bda5, 0x036547d8, 0x0012db5c}}}, + {X: Field{[10]uint32{0x039f148b, 0x02e8fd56, 0x0006df31, 0x02b3cf01, 0x0058a983, 0x0390c7ba, 0x036ff9f6, 0x01921de8, 0x023dca08, 0x001078dc}}, Y: Field{[10]uint32{0x038392e4, 0x0252074e, 0x02007913, 0x00b37ff2, 0x022753c5, 0x0336a7f4, 0x000b136d, 0x0163406a, 0x02caf27c, 0x0022ac59}}}, + {X: Field{[10]uint32{0x01bba3c4, 0x002f2a19, 0x00953ea0, 0x011fe353, 0x01690e04, 0x00251985, 0x03a3e587, 0x02322766, 0x00f27855, 0x0018ee28}}, Y: Field{[10]uint32{0x03cf787f, 0x0002cc90, 0x03a0c2d3, 0x025dca2c, 0x008c09b2, 0x03c01320, 0x0295da00, 0x022d254e, 0x014185eb, 0x000c87eb}}}, + {X: Field{[10]uint32{0x014c5963, 0x00aa6a6c, 0x0056c894, 0x036b4bfe, 0x01c1ca21, 0x0088a698, 0x01cae5f8, 0x0034e941, 0x037faa8b, 0x00018afa}}, Y: Field{[10]uint32{0x02bffd4b, 0x0275efd5, 0x030451ac, 0x0008bd6d, 0x03a36f4c, 0x00fbf710, 0x01886550, 0x0309fd73, 0x00bd7120, 0x0038f673}}}, + {X: Field{[10]uint32{0x03d20427, 0x03cb1206, 0x0199ac65, 0x033cf2cb, 0x03bc133f, 0x024bc0c4, 0x01d79a90, 0x02e27af9, 0x000af524, 0x002dd686}}, Y: Field{[10]uint32{0x021d2747, 0x02e08952, 0x02d48c39, 0x01918cfb, 0x036a6369, 0x0398b7ec, 0x03094b41, 0x0301534d, 0x0056b11c, 0x0039e154}}}, + {X: Field{[10]uint32{0x024949e9, 0x03bb413f, 0x032f2f03, 0x00f3bbc0, 0x026b51f9, 0x013418e8, 0x01df9cbe, 0x03f1da5f, 0x036d5298, 0x001396ef}}, Y: Field{[10]uint32{0x02a12188, 0x039138c5, 0x00119476, 0x02fa6495, 0x001871fb, 0x0336024c, 0x0114a19e, 0x02771951, 0x028640cd, 0x00199c09}}}, + {X: Field{[10]uint32{0x00173237, 0x02fdb7c3, 0x01200074, 0x039b72d8, 0x02b78e86, 0x0357f06a, 0x02edb836, 0x03c1a4ee, 0x003df509, 0x002a5de3}}, Y: Field{[10]uint32{0x01d0cab7, 0x03804fca, 0x025d690e, 0x0072302f, 0x019230a4, 0x002a1759, 0x03a0e50d, 0x03e44e57, 0x019186a0, 0x000cea72}}}, + {X: Field{[10]uint32{0x03570449, 0x01eed8f3, 0x03c95cdb, 0x039c9b32, 0x00757fb3, 0x02924dab, 0x01790bc1, 0x012f9f12, 0x02ad1666, 0x003c6cea}}, Y: Field{[10]uint32{0x0060cc06, 0x003ed29d, 0x02a3a52b, 0x0098934e, 0x02006434, 0x011899e0, 0x02183981, 0x037040fc, 0x01cbea3f, 0x003477f8}}}, + {X: Field{[10]uint32{0x0349f598, 0x02293164, 0x022d0698, 0x0172bd33, 0x019563a0, 0x0133c067, 0x0036ad6a, 0x035615a9, 0x013ab015, 0x00359b3f}}, Y: Field{[10]uint32{0x011efc4d, 0x033dbe84, 0x01756d07, 0x02fbee54, 0x00d8e91b, 0x036e503e, 0x03b73056, 0x03679598, 0x01b6d097, 0x0017a85e}}}, + {X: Field{[10]uint32{0x020ac7aa, 0x03f8ef36, 0x00470ea8, 0x01bcb036, 0x015d87a1, 0x0260bb7f, 0x030f30aa, 0x01744efb, 0x00f0924b, 0x00294ca9}}, Y: Field{[10]uint32{0x038d5c1c, 0x00aa49c7, 0x017ad553, 0x03eab188, 0x0374fd1e, 0x03d40e1b, 0x003de70d, 0x00d204f3, 0x0019ca4e, 0x0030b98b}}}, + {X: Field{[10]uint32{0x00439b70, 0x0397fd8a, 0x03b3e1a3, 0x03bcff8b, 0x0281ebb3, 0x0381ed8c, 0x03d08c09, 0x0220d7fe, 0x01125df7, 0x002a6ac9}}, Y: Field{[10]uint32{0x01877514, 0x00696d61, 0x00c7e350, 0x02d53a54, 0x01f2eaad, 0x0330d77c, 0x0243698a, 0x0056aa6a, 0x01db56e0, 0x00163fd5}}}, + {X: Field{[10]uint32{0x020466eb, 0x03fd1b11, 0x02521f2c, 0x012907b5, 0x0153df17, 0x024571b5, 0x004dc830, 0x00f7b306, 0x03849081, 0x00338163}}, Y: Field{[10]uint32{0x02f3e745, 0x011acbe2, 0x03d47c76, 0x01065ecd, 0x02282377, 0x013d3dc6, 0x02815a78, 0x01d05016, 0x00c45881, 0x0010534e}}}, + {X: Field{[10]uint32{0x02406299, 0x02faaa5b, 0x003d4737, 0x014e76d8, 0x010afe92, 0x0059137a, 0x0385c7f3, 0x02cdaaac, 0x036530a2, 0x002647ea}}, Y: Field{[10]uint32{0x008eed57, 0x00abe7f9, 0x014df4f8, 0x03edeb6a, 0x005d373c, 0x0136807d, 0x016dc9d4, 0x0112f7c5, 0x017677c5, 0x000a8a6d}}}, + {X: Field{[10]uint32{0x03715d8e, 0x0070fcab, 0x01e140e9, 0x03fa84fc, 0x03ddfdd2, 0x016ad205, 0x00419210, 0x013bbf32, 0x001fbd03, 0x003b9b32}}, Y: Field{[10]uint32{0x0386d8be, 0x00ebcef8, 0x00a3f689, 0x011ea5ef, 0x00df8fd8, 0x02972f01, 0x007358de, 0x03a59487, 0x03fe48c3, 0x002e3de7}}}, + {X: Field{[10]uint32{0x019c5ef2, 0x02b33685, 0x017a3c5d, 0x03fa04cd, 0x0316ff2d, 0x00507800, 0x004d5cc5, 0x01995d55, 0x0372d642, 0x0019a8b4}}, Y: Field{[10]uint32{0x01bc8929, 0x0368fdd3, 0x029a05ba, 0x03416608, 0x00780000, 0x03c99781, 0x01423b9a, 0x03d234e2, 0x016b91c6, 0x002d5f4b}}}, + {X: Field{[10]uint32{0x02421da9, 0x0171a48e, 0x00ac6adf, 0x0396b2d3, 0x037a5798, 0x031fcda8, 0x0043e73f, 0x0378e854, 0x01d9f697, 0x0008280b}}, Y: Field{[10]uint32{0x01cf34f7, 0x00db0c33, 0x02b97338, 0x00e0bf31, 0x02ab4ab5, 0x00478f72, 0x02ab61e7, 0x00d87aa9, 0x0100d162, 0x00079b3c}}}, + {X: Field{[10]uint32{0x037bf552, 0x00e8c0f2, 0x0211092e, 0x026873b6, 0x019f92b7, 0x036894cc, 0x0298b154, 0x03a07daf, 0x02437818, 0x00282e32}}, Y: Field{[10]uint32{0x01543be6, 0x02ff968f, 0x030baa1a, 0x039922d8, 0x02218508, 0x003f38b6, 0x0263ca11, 0x03664141, 0x00ebf447, 0x0011506f}}}, + {X: Field{[10]uint32{0x00c52c63, 0x005d3ac7, 0x00ffb9e4, 0x02376d6e, 0x01e0d501, 0x0172ea73, 0x015c25fb, 0x039221f8, 0x02ad73dc, 0x00145c53}}, Y: Field{[10]uint32{0x03dafebf, 0x024507e6, 0x0309773b, 0x00c6665d, 0x01a5c248, 0x019b7480, 0x02272c7d, 0x01587afb, 0x00a082ef, 0x0011ede5}}}, + {X: Field{[10]uint32{0x02451c59, 0x012b0b35, 0x03a2fba7, 0x02904d05, 0x017da195, 0x026487a4, 0x03c41f6a, 0x03781cf9, 0x03631fe4, 0x00063a89}}, Y: Field{[10]uint32{0x024df316, 0x02bb5435, 0x01e6b106, 0x020cba55, 0x00d31b3b, 0x0235f24f, 0x03e0428e, 0x02eea6cc, 0x0337fff6, 0x000e6282}}}, + {X: Field{[10]uint32{0x03c5a87e, 0x02e415c5, 0x030cd0e8, 0x029675d6, 0x03c3d1f0, 0x033ea617, 0x01ec341a, 0x0060d298, 0x034fc39e, 0x00387562}}, Y: Field{[10]uint32{0x006b3c47, 0x02648967, 0x007f2cf2, 0x00e83767, 0x01af8215, 0x02dfe679, 0x03e2ab3b, 0x03f7b023, 0x020215fd, 0x0006d8bb}}}, + {X: Field{[10]uint32{0x016c5a84, 0x03b0f9dc, 0x039a3bbd, 0x0104472b, 0x032c19c5, 0x02c94f70, 0x03f5ba8e, 0x030495f7, 0x011730d3, 0x000e5e4e}}, Y: Field{[10]uint32{0x01f18015, 0x02a929fd, 0x021e3f78, 0x02f5070a, 0x00be7b4e, 0x021476a3, 0x02cded5c, 0x00db6644, 0x0350189f, 0x0035a87e}}}, + {X: Field{[10]uint32{0x039ede88, 0x003c5e96, 0x02ef1552, 0x002c93ca, 0x021d5736, 0x02c09467, 0x01dbf888, 0x0101b4e0, 0x024b601b, 0x00126d27}}, Y: Field{[10]uint32{0x0169a38d, 0x01f9dcbe, 0x02fadbff, 0x02734390, 0x03a0a76e, 0x00279168, 0x03e7be10, 0x035ecd66, 0x00ca02f2, 0x003f3cf3}}}, + {X: Field{[10]uint32{0x00bdc871, 0x036a914a, 0x024c32bf, 0x02848907, 0x01d64e38, 0x003fc5e8, 0x0188548f, 0x03cdb483, 0x010d0b42, 0x000b3606}}, Y: Field{[10]uint32{0x00259187, 0x03bd66da, 0x02a67077, 0x0034ac5a, 0x022fff78, 0x016affab, 0x0284f45e, 0x0052416a, 0x03692214, 0x003dca70}}}, + {X: Field{[10]uint32{0x0241025a, 0x00218997, 0x006f2308, 0x03a91747, 0x02b5b642, 0x007e7466, 0x020cb2cf, 0x015198b6, 0x03111738, 0x0007f43e}}, Y: Field{[10]uint32{0x029ce0e9, 0x02460791, 0x0008f557, 0x035b6edb, 0x0294e928, 0x031c04b6, 0x007825d1, 0x002082af, 0x0288fec6, 0x000c4da9}}}, + {X: Field{[10]uint32{0x02f3a141, 0x0391101e, 0x0387107d, 0x02ec4834, 0x013f93d5, 0x02f61139, 0x0248a0f5, 0x02d6f861, 0x033bd7f8, 0x003c2397}}, Y: Field{[10]uint32{0x01902fac, 0x01b857f6, 0x0289fa52, 0x02f37c74, 0x01bf7ea1, 0x03253a83, 0x0361bdfc, 0x03ab872a, 0x03259067, 0x0000f761}}}, + {X: Field{[10]uint32{0x005ee207, 0x0172ac47, 0x005a5d3f, 0x03c07fbb, 0x03a0584c, 0x0171af75, 0x03a046bb, 0x03ea58dc, 0x0006b997, 0x002800cf}}, Y: Field{[10]uint32{0x03e268b4, 0x002a36f0, 0x03a17d14, 0x02d8f53f, 0x0039a577, 0x00823503, 0x00c2cda2, 0x039235c2, 0x0131aacb, 0x003bb586}}}, + {X: Field{[10]uint32{0x02c16f70, 0x0246db98, 0x03b1e1ea, 0x01c1109a, 0x0383ff8f, 0x005de469, 0x001e29b1, 0x0299c77c, 0x000868be, 0x001df7bb}}, Y: Field{[10]uint32{0x0264861d, 0x009ac015, 0x024b5dc4, 0x009f0288, 0x00fcc1fe, 0x0067d7a7, 0x031ae7ef, 0x01cfd8c9, 0x0228ba8f, 0x002e4228}}}, + {X: Field{[10]uint32{0x01aa72b1, 0x016a86ea, 0x019605fd, 0x03070623, 0x01994a03, 0x00d41acf, 0x01bd1fc6, 0x0043b468, 0x015ffe2f, 0x000bf37b}}, Y: Field{[10]uint32{0x02bbefc6, 0x02df5d81, 0x0145d3fa, 0x00a13fe7, 0x02b4df66, 0x004a8319, 0x00d7c12e, 0x021bc748, 0x03f6f09a, 0x000556fa}}}, + {X: Field{[10]uint32{0x015db3ad, 0x00438826, 0x02904c83, 0x03fddf0a, 0x018667f8, 0x02e91f02, 0x00add0c9, 0x039cceaf, 0x032dfdf5, 0x0007c302}}, Y: Field{[10]uint32{0x037bc566, 0x035d5995, 0x03e448ef, 0x020a1732, 0x0170f631, 0x00c9a122, 0x039b7613, 0x03d57d44, 0x03cb84ce, 0x002f5c46}}}, + {X: Field{[10]uint32{0x0237dcf8, 0x03aa3e42, 0x005ef465, 0x03b52aa2, 0x03d603fd, 0x03b7d953, 0x01bdf3c5, 0x00b11183, 0x0144e716, 0x0002d2a1}}, Y: Field{[10]uint32{0x003c62b2, 0x00e28f48, 0x0134c139, 0x01bb6f86, 0x0099f8ee, 0x00a4b2ce, 0x032e27b2, 0x03a2c800, 0x0391b3f2, 0x0014f010}}}, + {X: Field{[10]uint32{0x005bd68c, 0x016c2dcb, 0x0221a9d8, 0x0031b650, 0x03d00a90, 0x034c1ce5, 0x0331cdfa, 0x02dcd4e3, 0x0282dcde, 0x0037c3af}}, Y: Field{[10]uint32{0x00decfb2, 0x03d1cce2, 0x001c68a2, 0x038b5c1c, 0x034a1d07, 0x0292b3e2, 0x03b869e3, 0x00b95511, 0x0239e7fe, 0x0030ca65}}}, + {X: Field{[10]uint32{0x03c101c0, 0x032499c0, 0x01576ec7, 0x00396cde, 0x02f9fd46, 0x034a3e27, 0x02ed101f, 0x0230cf87, 0x01b6d1c3, 0x003ac12e}}, Y: Field{[10]uint32{0x01e0ee9e, 0x0363ca3d, 0x024eb008, 0x0120e5d2, 0x00f5ee75, 0x020b5ba7, 0x013cab57, 0x03e02cac, 0x00497f47, 0x0013c9b6}}}, + {X: Field{[10]uint32{0x03294334, 0x03dc7434, 0x01cface9, 0x003ba9ee, 0x017db4ee, 0x032ae619, 0x014b37a0, 0x031b3ab2, 0x03e2197c, 0x001ef27b}}, Y: Field{[10]uint32{0x01a72013, 0x01e0b697, 0x009a37ff, 0x024c7057, 0x01ad8fb4, 0x02d6ce94, 0x001d9404, 0x01e41aa5, 0x00ad5234, 0x00364c6f}}}, + {X: Field{[10]uint32{0x033e0b9b, 0x0106b4ed, 0x00844e0a, 0x01433259, 0x011321dc, 0x01a8fa2d, 0x010c10c6, 0x014b192f, 0x01e8f4bd, 0x002248b4}}, Y: Field{[10]uint32{0x0241c431, 0x00a9e8d2, 0x003182a0, 0x031b57b7, 0x0261c9ee, 0x00cdf714, 0x00e6abd3, 0x03887a24, 0x00f17d23, 0x000ad90f}}}, + {X: Field{[10]uint32{0x02ddcc72, 0x006746bc, 0x00e9acdc, 0x0369df28, 0x030139a7, 0x0311a007, 0x036a842a, 0x004bb48b, 0x01e33a93, 0x0010bcbb}}, Y: Field{[10]uint32{0x0326f99b, 0x038d25e3, 0x0376ac70, 0x0029afd1, 0x02ab9536, 0x037238d0, 0x0260edff, 0x026172e4, 0x03cc715c, 0x00143516}}}, + {X: Field{[10]uint32{0x016761c6, 0x009c1453, 0x02ea2f3b, 0x03ca4a4d, 0x00627549, 0x01c9ad79, 0x00792550, 0x03fac962, 0x03201862, 0x001ef725}}, Y: Field{[10]uint32{0x01a4fa8c, 0x02a1504b, 0x02269f1c, 0x039032b5, 0x0065372e, 0x02101998, 0x026f0bff, 0x02b7d5db, 0x032b7f77, 0x001c03ad}}}, + {X: Field{[10]uint32{0x006314cf, 0x0366385d, 0x023066b6, 0x011f4840, 0x01f79d16, 0x008a3868, 0x002e0d85, 0x0126fd79, 0x03a64bf5, 0x002e6d49}}, Y: Field{[10]uint32{0x020cd93f, 0x00a66aaa, 0x00eb7499, 0x00e71b61, 0x02e35b15, 0x000bcc3a, 0x022a2b68, 0x007d6e4e, 0x00642a72, 0x002386cd}}}, + {X: Field{[10]uint32{0x01e3dda9, 0x02b0961d, 0x02d74978, 0x00c56434, 0x03d187c4, 0x00f3845d, 0x00291929, 0x01dd9407, 0x012934d4, 0x002d9779}}, Y: Field{[10]uint32{0x039fa529, 0x038db58e, 0x014ef324, 0x0027b2f6, 0x03f07555, 0x00c0d915, 0x01c55351, 0x02d73acf, 0x03e74ab9, 0x000f5bf2}}}, + {X: Field{[10]uint32{0x027c6b9b, 0x0198d9b3, 0x02ca5c2e, 0x03a8d016, 0x01a036ed, 0x00fc1584, 0x03604f6a, 0x01d47abc, 0x02320608, 0x00063aad}}, Y: Field{[10]uint32{0x015074c5, 0x00acd942, 0x03dd99d1, 0x001492f5, 0x02ccd426, 0x027e479b, 0x0211f057, 0x004464db, 0x03bc9467, 0x00227ac1}}}, + {X: Field{[10]uint32{0x02d360d5, 0x007183ba, 0x000a14eb, 0x03928c6d, 0x03c7502e, 0x025b4e76, 0x01a16065, 0x02590e42, 0x00664a47, 0x00289844}}, Y: Field{[10]uint32{0x01814901, 0x01fcdc9d, 0x00ac03e8, 0x0207cc8f, 0x0085721a, 0x02066086, 0x022d9fe3, 0x0155d8c9, 0x034d8802, 0x0012d175}}}, + {X: Field{[10]uint32{0x0008a8a7, 0x0250d74f, 0x019595da, 0x03ebd800, 0x01c77ac0, 0x0173c972, 0x019dc583, 0x0214de80, 0x00b12c10, 0x001e2515}}, Y: Field{[10]uint32{0x01829041, 0x02b82fe9, 0x007a2591, 0x000c949a, 0x008841da, 0x0282f5d8, 0x02f43378, 0x0167eb2f, 0x030fed28, 0x001afba1}}}, + {X: Field{[10]uint32{0x02791569, 0x03897518, 0x025ed7cf, 0x03e67d98, 0x01f81570, 0x00b837e5, 0x03683b9c, 0x0197c046, 0x0206fb4f, 0x00065df0}}, Y: Field{[10]uint32{0x03698479, 0x0390d7af, 0x01de467d, 0x02c9d764, 0x019dcc79, 0x02a7af81, 0x03f435e5, 0x0112aa57, 0x01a3c222, 0x00379db7}}}, + {X: Field{[10]uint32{0x01f4222f, 0x02b26199, 0x02585189, 0x03530fd5, 0x01ec3b5a, 0x02b0d35f, 0x03e60861, 0x0354d903, 0x01f7d259, 0x002247c3}}, Y: Field{[10]uint32{0x032de219, 0x002b3a46, 0x0257dba9, 0x02ac1010, 0x025c3293, 0x02a35ac3, 0x027a6011, 0x0228a87b, 0x03f70f53, 0x00331782}}}, + {X: Field{[10]uint32{0x0299530b, 0x02a4dfff, 0x01e55c80, 0x0380f171, 0x0350169d, 0x0104ad34, 0x026c282f, 0x03e07964, 0x03f69262, 0x00214d2e}}, Y: Field{[10]uint32{0x017423b5, 0x0239fad5, 0x01cf9fb0, 0x008d3505, 0x00f70cfc, 0x0395147a, 0x00764c0b, 0x001cdd33, 0x0181e0bb, 0x003efbb9}}}, + {X: Field{[10]uint32{0x006f63fb, 0x012c1faa, 0x001989e4, 0x01f03c04, 0x0158fc89, 0x01516635, 0x034eafa3, 0x037f4dd1, 0x016404e7, 0x00396dbd}}, Y: Field{[10]uint32{0x0118da79, 0x01b38998, 0x00ad0b2c, 0x03242ce0, 0x008e153c, 0x022201e0, 0x01e7d983, 0x00ea2ddb, 0x03fa68a8, 0x0010da2e}}}, + {X: Field{[10]uint32{0x02c2b850, 0x02435381, 0x00e29f7c, 0x03ced38e, 0x0046e184, 0x001c91ea, 0x03dc5e55, 0x03945260, 0x028b11c3, 0x003e5646}}, Y: Field{[10]uint32{0x010ff6b5, 0x025e82b6, 0x032a51fe, 0x024fca7f, 0x02957de3, 0x00d9a87e, 0x024e288a, 0x03d61f32, 0x00362361, 0x00108ed9}}}, + {X: Field{[10]uint32{0x0372384c, 0x02482c7f, 0x038212f2, 0x01655ef1, 0x017c9950, 0x025918de, 0x01eb617c, 0x017a7bbe, 0x01d3252f, 0x000f4c8e}}, Y: Field{[10]uint32{0x02a2e57a, 0x00f2a7c8, 0x03df78f7, 0x0386a6d9, 0x03ef860e, 0x0257ad37, 0x02798bf6, 0x02beb394, 0x03b6fc9b, 0x00070f8d}}}, + {X: Field{[10]uint32{0x00c5dfb8, 0x035719ef, 0x00055201, 0x018707c5, 0x02a0a6ce, 0x002184a8, 0x028e8554, 0x0135da1a, 0x03234b57, 0x003d0225}}, Y: Field{[10]uint32{0x000a56a4, 0x014c8243, 0x03af3c74, 0x029d80bf, 0x03c3a62f, 0x015969e7, 0x02aac242, 0x03f24552, 0x03b73e72, 0x001ae0a0}}}, + {X: Field{[10]uint32{0x02267ccf, 0x02d18a8b, 0x03c64bc4, 0x034ac104, 0x0395058e, 0x0262e2d1, 0x03e65f84, 0x031d17da, 0x02e7aea9, 0x002b381d}}, Y: Field{[10]uint32{0x028b97aa, 0x0076b045, 0x0120a31f, 0x018aa651, 0x02dc58f3, 0x02bcd4f8, 0x032ed6dc, 0x02a797ad, 0x0217377f, 0x0002d8b1}}}, + {X: Field{[10]uint32{0x006ec161, 0x01bf0b42, 0x036af29d, 0x00ced3f7, 0x01b4e63f, 0x02b6c747, 0x030b848e, 0x0181a4c8, 0x03a7408c, 0x001c332e}}, Y: Field{[10]uint32{0x014d6959, 0x020b1ee8, 0x02ec4d77, 0x00e1c7ef, 0x025a4ff3, 0x0152a032, 0x01286776, 0x00398390, 0x01a046d3, 0x003f0736}}}, + {X: Field{[10]uint32{0x0358d372, 0x03798a79, 0x02ede7a8, 0x02ce65c2, 0x019e33fc, 0x02bd6af1, 0x0258d3a4, 0x016c317a, 0x00b27c0c, 0x0039b9ea}}, Y: Field{[10]uint32{0x018d4a66, 0x036cf972, 0x017049a8, 0x0297262f, 0x00b40df3, 0x024f8b20, 0x011fee27, 0x02d69754, 0x01c4c8c8, 0x00350344}}}, + {X: Field{[10]uint32{0x03216346, 0x02c74c88, 0x02739117, 0x029433fd, 0x007910e9, 0x0278b109, 0x01495b71, 0x00b9a0ca, 0x01c7e0a0, 0x00337125}}, Y: Field{[10]uint32{0x001583d4, 0x00816c5a, 0x022f0559, 0x0231b390, 0x00d51fc6, 0x03c77dbb, 0x01ddcd87, 0x0302b3ca, 0x036e9306, 0x0018d993}}}, + {X: Field{[10]uint32{0x022fc5cc, 0x025d741e, 0x02e4f825, 0x0065bcd6, 0x01d0142f, 0x02e09370, 0x022ba333, 0x00878000, 0x009c2fd7, 0x0009e13a}}, Y: Field{[10]uint32{0x003b8cf4, 0x00d7bd77, 0x001db4a3, 0x0113c021, 0x005a391e, 0x00958a3d, 0x00232b9b, 0x019874d5, 0x0266bdfa, 0x0002e962}}}, + {X: Field{[10]uint32{0x001a2390, 0x023b37ac, 0x00d0b9b9, 0x02ffdabd, 0x030c9118, 0x0212e8f3, 0x001dd831, 0x01ce0085, 0x0362ebcb, 0x002ada66}}, Y: Field{[10]uint32{0x00766905, 0x0241128d, 0x03e71a60, 0x01ede611, 0x012be011, 0x02829f33, 0x0142547d, 0x0083db17, 0x0210b714, 0x00179520}}}, + {X: Field{[10]uint32{0x035756ec, 0x00f53c2d, 0x02e08dda, 0x00aa60d6, 0x02220955, 0x01b747aa, 0x03ad6d39, 0x038dfee7, 0x03a567ff, 0x001e07a9}}, Y: Field{[10]uint32{0x02637256, 0x0141683c, 0x034b2af9, 0x001f6b37, 0x000403a5, 0x02e99933, 0x01481744, 0x00ee5f93, 0x007b46f6, 0x000f1db6}}}, + {X: Field{[10]uint32{0x0374029c, 0x002f4fb8, 0x033fd39d, 0x00ef882c, 0x03a0e1ce, 0x023fb968, 0x0004fe7b, 0x002a0a97, 0x0130dd5c, 0x001d6acb}}, Y: Field{[10]uint32{0x01914b9f, 0x0057f358, 0x0121a722, 0x03ead7be, 0x0330536e, 0x0253073d, 0x01f6f8e6, 0x00e4eb2e, 0x0147fdb1, 0x002abd18}}}, + {X: Field{[10]uint32{0x00ddaff0, 0x00433e02, 0x03ced85a, 0x00cf4471, 0x01087124, 0x0212b55b, 0x023caea6, 0x00f6a5b4, 0x02983730, 0x000a52d9}}, Y: Field{[10]uint32{0x0346f7c1, 0x02993de6, 0x00b4222f, 0x03f20be7, 0x01e5861b, 0x00e2fc7c, 0x0007fa8b, 0x00fa7aa5, 0x02f7feb7, 0x002bd35f}}}, + {X: Field{[10]uint32{0x0024c8d6, 0x031b8d2e, 0x02e55ea3, 0x03a4495f, 0x00f290f6, 0x0365c047, 0x0283b06b, 0x018e7f25, 0x02ea7433, 0x003619da}}, Y: Field{[10]uint32{0x03a7456d, 0x0296dc65, 0x0230fd71, 0x00ab79c7, 0x0309017b, 0x01aab04c, 0x00f3e5cd, 0x01551424, 0x007635d4, 0x001c4322}}}, + {X: Field{[10]uint32{0x021270d0, 0x02fb9d05, 0x03544fd8, 0x009ea4ed, 0x00cee714, 0x0361a916, 0x004771c6, 0x03d6b0ab, 0x02030d90, 0x001793b2}}, Y: Field{[10]uint32{0x00c97351, 0x02bc2dd0, 0x03b9ff0c, 0x0293d232, 0x00a93bb4, 0x00d8a225, 0x03a6d603, 0x03e2febf, 0x0143b970, 0x00113f80}}}, + {X: Field{[10]uint32{0x0180097e, 0x03c496e1, 0x021dc157, 0x00f76f1d, 0x01265c3a, 0x026d5521, 0x0308f212, 0x02ea17f9, 0x01aa244f, 0x0024054b}}, Y: Field{[10]uint32{0x03ef2cf7, 0x00d5ce60, 0x03939b94, 0x00b120d5, 0x038a6d39, 0x03f0bd84, 0x01fa3b28, 0x021a42d6, 0x02c9200b, 0x0005a534}}}, + {X: Field{[10]uint32{0x005637b5, 0x02cf2423, 0x020f191f, 0x0265ccbb, 0x00daf3a1, 0x032fcae7, 0x03a953fa, 0x01c7114f, 0x00f096f1, 0x0019f755}}, Y: Field{[10]uint32{0x02de74b1, 0x009e6f13, 0x005dfb36, 0x02914d99, 0x025fd6c4, 0x028ce318, 0x01022365, 0x019db6d9, 0x03432d33, 0x0014c9f6}}}, + {X: Field{[10]uint32{0x036c51ef, 0x037e57ee, 0x00790142, 0x015d57bf, 0x032e7704, 0x01d33d50, 0x020f1447, 0x03fd5d96, 0x02838f95, 0x0031925a}}, Y: Field{[10]uint32{0x00d752a2, 0x0099ff2f, 0x038caca8, 0x0078e8e2, 0x031177b5, 0x022c16d4, 0x0186f01d, 0x0075ce4b, 0x01d6604d, 0x00330010}}}, + {X: Field{[10]uint32{0x00c11c74, 0x03f6dbda, 0x029ad933, 0x02da5187, 0x02425bf4, 0x02043674, 0x01e5e728, 0x00eff51d, 0x030a0b16, 0x0039e675}}, Y: Field{[10]uint32{0x00ba8600, 0x027f0605, 0x02b215ef, 0x0274689c, 0x03e50444, 0x00631b44, 0x00adcf76, 0x03b8fe6c, 0x005fe29b, 0x003f0d1d}}}, + {X: Field{[10]uint32{0x01489d3b, 0x03d16b17, 0x0175acb6, 0x01d30f73, 0x02820c87, 0x0060f60b, 0x032aa221, 0x02404540, 0x03b0151a, 0x001b4f25}}, Y: Field{[10]uint32{0x02d4749f, 0x03356c52, 0x023231c2, 0x03e7b99c, 0x0264b57d, 0x033b767b, 0x0295d438, 0x035dee3d, 0x01013d15, 0x0016aa2f}}}, + {X: Field{[10]uint32{0x02517539, 0x0163bfc2, 0x00165456, 0x030ea0be, 0x03b96d8e, 0x0131a8e6, 0x01cf2d9a, 0x01f79d06, 0x02001c1e, 0x0021b94f}}, Y: Field{[10]uint32{0x0344ad86, 0x01d7c06a, 0x03520ce4, 0x02b099b7, 0x00c24491, 0x00198c45, 0x01da5254, 0x03b3033b, 0x0370f2ef, 0x0003e2c6}}}, + {X: Field{[10]uint32{0x02a9880a, 0x014210d4, 0x0074347c, 0x02407cf2, 0x03075feb, 0x023b6ccf, 0x023267a7, 0x01f33aa6, 0x0339ac87, 0x00299070}}, Y: Field{[10]uint32{0x03982163, 0x029c9583, 0x01009c34, 0x031abf72, 0x01407559, 0x01f5a729, 0x03dc101b, 0x016b14f1, 0x014f2b27, 0x0036229b}}}, + {X: Field{[10]uint32{0x0182511a, 0x004d5a27, 0x00ceb9e0, 0x03550243, 0x00b925aa, 0x0378c5d5, 0x001de436, 0x02099916, 0x03a94d77, 0x000e8054}}, Y: Field{[10]uint32{0x00802035, 0x00cf5e96, 0x0055e35a, 0x00367c2b, 0x0111154b, 0x03fc1b3e, 0x0252df38, 0x017169e8, 0x02489493, 0x00003db2}}}, + {X: Field{[10]uint32{0x032b170f, 0x030a9851, 0x0058c5be, 0x035f18fd, 0x002c2e51, 0x009ba5bd, 0x0126b31d, 0x0326b501, 0x00e8a131, 0x0039e009}}, Y: Field{[10]uint32{0x034e0c53, 0x01fd9627, 0x008eaf19, 0x00125d90, 0x013a3092, 0x036ad977, 0x0093d9ce, 0x02c63c8d, 0x014b1ad7, 0x00315028}}}, + {X: Field{[10]uint32{0x006a5162, 0x004cce2a, 0x007cc7df, 0x01878b76, 0x007f05a1, 0x0064919a, 0x00380fab, 0x03c3b1d0, 0x005e8351, 0x001e1632}}, Y: Field{[10]uint32{0x02a6de1c, 0x035f96cd, 0x03a60928, 0x001969db, 0x037e658e, 0x03111354, 0x002897e7, 0x0281bf0e, 0x03445313, 0x0032b650}}}, + {X: Field{[10]uint32{0x030263e6, 0x01c51eb2, 0x024b82f3, 0x022b5666, 0x00ddb9da, 0x02597ccd, 0x0268c170, 0x037750d6, 0x02281c5b, 0x0001990f}}, Y: Field{[10]uint32{0x032cf79b, 0x022d6229, 0x03f36d72, 0x03e9a513, 0x016f2dc8, 0x02125a35, 0x008f9282, 0x02a82e6f, 0x02368ee1, 0x0027e7e7}}}, + {X: Field{[10]uint32{0x01b2254b, 0x0164b5ae, 0x035e7106, 0x008fa684, 0x02b31325, 0x03a81755, 0x03e8f9e3, 0x03c5325b, 0x0137a286, 0x0017cdb6}}, Y: Field{[10]uint32{0x0056310a, 0x011922e4, 0x02cfc2e5, 0x0070f21a, 0x029adb0e, 0x03cbf4e7, 0x02bf753e, 0x017fcb73, 0x037cc826, 0x0002758d}}}, + {X: Field{[10]uint32{0x023e2224, 0x019dfaf1, 0x0212fb17, 0x01c9187a, 0x02310f91, 0x00a140f0, 0x0226f266, 0x0282a97d, 0x01ae93d3, 0x00084bac}}, Y: Field{[10]uint32{0x036d1b67, 0x033f51d2, 0x02fa51df, 0x03fbd7f5, 0x010bbc5a, 0x03d4a09a, 0x038d9fdc, 0x00805b1c, 0x0233347f, 0x0014795f}}}, + {X: Field{[10]uint32{0x01e9eab4, 0x02175dcd, 0x0277e9a0, 0x024e39bc, 0x01dedb3b, 0x000f3898, 0x00481452, 0x027e4cca, 0x02c8940b, 0x00149a54}}, Y: Field{[10]uint32{0x01a42918, 0x013d3361, 0x0210952e, 0x023c50fe, 0x001d9aa5, 0x006013fe, 0x01fe2fd8, 0x00aabe69, 0x03a356df, 0x002195f3}}}, + {X: Field{[10]uint32{0x001c099f, 0x022f81d3, 0x036ef8f9, 0x00f2e5ea, 0x010419e0, 0x0254e8b4, 0x03a8778c, 0x00a04b92, 0x010def76, 0x00083c5d}}, Y: Field{[10]uint32{0x02cd485e, 0x03a2cc6e, 0x0060ebd8, 0x01396af0, 0x01d9d97b, 0x01a87b0b, 0x020bf881, 0x034a9fec, 0x01f53e7a, 0x0034bfba}}}, + {X: Field{[10]uint32{0x027ee910, 0x024db735, 0x02496da2, 0x0397bed9, 0x01dbc7f5, 0x03c4f1a4, 0x023cfb27, 0x00599708, 0x03b7ea01, 0x00388c68}}, Y: Field{[10]uint32{0x0365d53f, 0x02d7f02f, 0x0011e96e, 0x000bec5c, 0x0345e4f6, 0x0337c4f0, 0x027316c7, 0x0004c7cf, 0x002e18e8, 0x002a9917}}}, + {X: Field{[10]uint32{0x01c702ad, 0x005d2d89, 0x002cbed7, 0x0189a1e8, 0x01d01aa9, 0x014b9ca6, 0x02eac355, 0x009b74f6, 0x01523fd0, 0x001e9393}}, Y: Field{[10]uint32{0x01b965d2, 0x02ccc13f, 0x01b8471e, 0x03047e50, 0x007d2bdf, 0x0335f269, 0x00612044, 0x02396ab9, 0x02b6a739, 0x000d4704}}}, + {X: Field{[10]uint32{0x03f137b3, 0x013471b2, 0x03eaa557, 0x019c6688, 0x039a8589, 0x0000431b, 0x00a5a5ca, 0x0159c19f, 0x007e7696, 0x003f4bdc}}, Y: Field{[10]uint32{0x00315408, 0x01d4c1be, 0x038aa1ae, 0x021e78ef, 0x01df00e2, 0x033957d0, 0x039b1613, 0x0391ccc7, 0x030c1d5a, 0x00311690}}}, + {X: Field{[10]uint32{0x002bb89d, 0x024634fc, 0x01373f3f, 0x0293e099, 0x036c2ac2, 0x034c121d, 0x0011d676, 0x03d3f384, 0x001e8cf2, 0x003141b3}}, Y: Field{[10]uint32{0x01d3118a, 0x019078a9, 0x02f0c058, 0x01b8bd63, 0x01bea33d, 0x03dee982, 0x0247f6d1, 0x026cccbe, 0x03b37402, 0x002379b7}}}, + {X: Field{[10]uint32{0x035c0369, 0x0012dd6a, 0x02eebb82, 0x035f63e1, 0x00ad1bb4, 0x0327378f, 0x02b901c3, 0x03e6661a, 0x0102d9cc, 0x000ba9eb}}, Y: Field{[10]uint32{0x02b0ed43, 0x000c6543, 0x03d9ce40, 0x0189253a, 0x032b2135, 0x02bdda51, 0x03648ddd, 0x000c09d8, 0x03d86d75, 0x0004488a}}}, + {X: Field{[10]uint32{0x02159c5c, 0x00e33467, 0x0279c4c3, 0x00eb77f4, 0x00f8a602, 0x028ab04d, 0x004b421b, 0x039394be, 0x01923555, 0x002ae330}}, Y: Field{[10]uint32{0x0351ee1a, 0x007c8fe1, 0x00ff514d, 0x03ad532a, 0x015a5b54, 0x0311241e, 0x029fbda6, 0x0236f08f, 0x03bdcc26, 0x000b1238}}}, + {X: Field{[10]uint32{0x01dad430, 0x02bd01fd, 0x00e04c54, 0x009fcb3f, 0x02c37784, 0x029c4226, 0x0348e1c2, 0x0107ea46, 0x02e1cc7c, 0x00223fb0}}, Y: Field{[10]uint32{0x033ed80b, 0x02277ae2, 0x02cf3c4b, 0x019bec7f, 0x02dce306, 0x02c0d709, 0x02c7a049, 0x01994d7e, 0x02884f69, 0x00332d17}}}, + {X: Field{[10]uint32{0x034b0d41, 0x034dda1d, 0x0357c011, 0x02871931, 0x02940522, 0x03a83373, 0x02c31272, 0x03d746d0, 0x03ae1acc, 0x00101161}}, Y: Field{[10]uint32{0x030e787b, 0x028e4ffb, 0x01325f96, 0x03ad7395, 0x0163401d, 0x02cd46cd, 0x0368c369, 0x0187d3dc, 0x025b25ae, 0x003a373c}}}, + {X: Field{[10]uint32{0x02b9ab8a, 0x0093469f, 0x01097514, 0x033ef136, 0x0128a377, 0x009d4245, 0x00cf20ab, 0x02a30234, 0x02b9cade, 0x00229c07}}, Y: Field{[10]uint32{0x02ba5a45, 0x02737ab2, 0x0143a454, 0x0099bc0b, 0x01265e8b, 0x02a62d68, 0x0076154c, 0x02b1c30f, 0x018282a9, 0x0013c116}}}, + {X: Field{[10]uint32{0x01ad3d56, 0x00aa9e22, 0x0038929b, 0x001b1b59, 0x0366e15e, 0x00422930, 0x02141fdb, 0x00270a76, 0x01781940, 0x0030a04a}}, Y: Field{[10]uint32{0x035db5c1, 0x024db22d, 0x01afa974, 0x039db952, 0x029c9db5, 0x032c7951, 0x0034255d, 0x03a5a68a, 0x02fb6670, 0x00215027}}}, + {X: Field{[10]uint32{0x031d72fe, 0x03ee0401, 0x021298ad, 0x02d0aea9, 0x000f8ea4, 0x002e0af8, 0x03b04d19, 0x03210e4a, 0x02b1c810, 0x0027ff4d}}, Y: Field{[10]uint32{0x01b38404, 0x028f5a80, 0x03d871ca, 0x0291a997, 0x026f25fd, 0x03ea7f86, 0x002955eb, 0x0037e069, 0x024ba11f, 0x0004789e}}}, + {X: Field{[10]uint32{0x01a48b96, 0x01be1e69, 0x02b25f1c, 0x011d78ff, 0x0239e431, 0x0143bb18, 0x01072107, 0x02c05f2b, 0x0044bc92, 0x002b1280}}, Y: Field{[10]uint32{0x02b8dfe1, 0x02233907, 0x00de2d5f, 0x02fd15ed, 0x03f526bb, 0x011307d4, 0x03498533, 0x000bfc79, 0x03ba7310, 0x001071f0}}}, + {X: Field{[10]uint32{0x0306eb5a, 0x0393a19e, 0x0214224a, 0x01b35d93, 0x0357d808, 0x03467f17, 0x03c83bf9, 0x02a482cf, 0x001c157c, 0x0031e2c4}}, Y: Field{[10]uint32{0x038126c8, 0x00dfc674, 0x001d2deb, 0x033570a7, 0x02b7a9d7, 0x013cee3d, 0x035f533b, 0x0183ffeb, 0x006eb9d6, 0x0006a34b}}}, + {X: Field{[10]uint32{0x03147cd2, 0x0396ba1d, 0x03d13578, 0x02e39b45, 0x01c24b0d, 0x02bb7648, 0x03c1c2db, 0x0122e57c, 0x03055723, 0x003423ce}}, Y: Field{[10]uint32{0x022713cb, 0x0187899d, 0x00696914, 0x02bd77f8, 0x034987df, 0x0028e148, 0x02e3e5c9, 0x01f2eda6, 0x00de0a06, 0x0009ed7f}}}, + {X: Field{[10]uint32{0x01e312f5, 0x02312ca9, 0x004893d0, 0x01471602, 0x001091cf, 0x01f1707f, 0x01db0f1c, 0x03d87ae0, 0x003d5060, 0x00103a81}}, Y: Field{[10]uint32{0x0166b27c, 0x005a8007, 0x01f30848, 0x00fbed96, 0x02043de0, 0x0167c54d, 0x02719be2, 0x00c0bf80, 0x02c42836, 0x000bbc47}}}, + {X: Field{[10]uint32{0x018362e7, 0x0212b40d, 0x02ec39f1, 0x03e76ec7, 0x0117db73, 0x0090bae9, 0x00827b28, 0x02d2cb7a, 0x00bdfb53, 0x003e7441}}, Y: Field{[10]uint32{0x01771877, 0x0333f3d3, 0x03167296, 0x03052bdb, 0x0268f4e3, 0x01f50fc2, 0x02707b6d, 0x006520ae, 0x020b6c37, 0x0035d912}}}, + {X: Field{[10]uint32{0x03f9ddc9, 0x00dde37b, 0x02b6e570, 0x028905c4, 0x00fea5f8, 0x0268176b, 0x02132b40, 0x0120a539, 0x02ee14c3, 0x003749da}}, Y: Field{[10]uint32{0x01ceb7ef, 0x0260d4e9, 0x0066b7bc, 0x0180add0, 0x034803f7, 0x025a4343, 0x02de6553, 0x03bb25ff, 0x017d5d92, 0x00026f98}}}, + {X: Field{[10]uint32{0x01155d49, 0x03a13c18, 0x012f4c8b, 0x035de149, 0x032104c7, 0x03c36e36, 0x03d11f67, 0x01ef4319, 0x0039d5f1, 0x002148be}}, Y: Field{[10]uint32{0x023ea117, 0x00ea5656, 0x00777316, 0x0375667e, 0x02e01f3e, 0x03729256, 0x039b59cd, 0x007e3db2, 0x01518031, 0x002dde46}}}, + {X: Field{[10]uint32{0x02b5b225, 0x000c362d, 0x0264eeb2, 0x01992ff3, 0x02510491, 0x018519ca, 0x0002a624, 0x02fa383f, 0x02bdb4f3, 0x001cca00}}, Y: Field{[10]uint32{0x02a3c6f3, 0x01aadc91, 0x01f8e35a, 0x018b4455, 0x02d9022d, 0x0302c973, 0x0105f92c, 0x03b875a9, 0x01ec590e, 0x001ef533}}}, + {X: Field{[10]uint32{0x0167af62, 0x036d5cd6, 0x02fc68fb, 0x02bf1125, 0x01f5ffcb, 0x022f7a85, 0x0273276b, 0x020d4887, 0x01a12c4f, 0x0006cd90}}, Y: Field{[10]uint32{0x01664048, 0x03619b66, 0x021cef0f, 0x00c81ea3, 0x000b824c, 0x02d33407, 0x01e2e153, 0x00adecbb, 0x02f5e5d1, 0x0000f543}}}, + {X: Field{[10]uint32{0x0301a7ce, 0x0254974f, 0x00c852c7, 0x01576efa, 0x010c8972, 0x02d9b4e4, 0x02cbe60c, 0x0213ffb5, 0x02184e92, 0x0034c0d3}}, Y: Field{[10]uint32{0x01d09e25, 0x03e3e67e, 0x013b48c4, 0x0313bacd, 0x0211172a, 0x017c6e87, 0x0094b058, 0x01439ca8, 0x030416ce, 0x002cd998}}}, + {X: Field{[10]uint32{0x01e9db17, 0x00c9c29a, 0x0176d65c, 0x00aa8eb4, 0x0261c6db, 0x023d3e16, 0x03a44610, 0x03d7bc63, 0x0200bd22, 0x00239ea0}}, Y: Field{[10]uint32{0x03530568, 0x012cec7c, 0x01ceadee, 0x01d466cd, 0x004a4824, 0x01c7d335, 0x03536edc, 0x025e6fe1, 0x03b51cce, 0x002107f8}}}, + {X: Field{[10]uint32{0x00a4027e, 0x02c2d958, 0x009e85da, 0x00f60e40, 0x01c4af5f, 0x005086b8, 0x02aee276, 0x0219c746, 0x00de29ab, 0x003f332d}}, Y: Field{[10]uint32{0x037f993b, 0x02f48b83, 0x01c47fa6, 0x0352fa8a, 0x01a6e269, 0x03a5df9c, 0x036ac069, 0x0226bf56, 0x0396203b, 0x002808a7}}}, + {X: Field{[10]uint32{0x004c8a26, 0x00b001f9, 0x02576925, 0x01d87e67, 0x039e74a4, 0x03ab5c16, 0x00681f0a, 0x02060213, 0x017f4435, 0x0039a33f}}, Y: Field{[10]uint32{0x0028f82e, 0x004874b1, 0x013c1672, 0x01863a7c, 0x01712291, 0x03c343ad, 0x0378d50c, 0x038ab908, 0x00a7b027, 0x002b7670}}}, + {X: Field{[10]uint32{0x006891d8, 0x0381184b, 0x029a8072, 0x0022dc9b, 0x0263bfe0, 0x022ecc94, 0x026de7ac, 0x02b05921, 0x03ad4b81, 0x0022dbc3}}, Y: Field{[10]uint32{0x024bc9ca, 0x03b2bb6e, 0x01288092, 0x023e98a4, 0x0391493e, 0x0289ff84, 0x008d328c, 0x0012de02, 0x0108a8d6, 0x0026eb59}}}, + {X: Field{[10]uint32{0x024b78b1, 0x035266f5, 0x021ba8cf, 0x010d5ea4, 0x02470f89, 0x0019d185, 0x03178cf2, 0x00652498, 0x00aa37ac, 0x00042283}}, Y: Field{[10]uint32{0x0265bf55, 0x0067d928, 0x032a75a8, 0x0149844a, 0x039b7c04, 0x03fd45f1, 0x03e302e1, 0x0255bd7f, 0x0122be05, 0x001a0543}}}, + {X: Field{[10]uint32{0x0357edb6, 0x0100a131, 0x0208b429, 0x02949952, 0x02ab8e13, 0x00dc2971, 0x032daa83, 0x0315e474, 0x03330844, 0x003fb460}}, Y: Field{[10]uint32{0x02457fe5, 0x02707fcd, 0x01e56f83, 0x00bb4fe2, 0x00b1b52c, 0x0254ba8d, 0x0229a976, 0x02ae13ae, 0x03378395, 0x0019ef77}}}, + {X: Field{[10]uint32{0x00170a2f, 0x02cbb824, 0x00da501f, 0x02108d46, 0x00848b2d, 0x02933789, 0x03ed6f10, 0x01b3cd42, 0x039decd5, 0x002fafec}}, Y: Field{[10]uint32{0x03a11573, 0x0350328a, 0x0275197d, 0x036c2987, 0x0005acb2, 0x0051b652, 0x0125fbde, 0x03e21c8a, 0x00b3bb86, 0x0004c0ad}}}, + {X: Field{[10]uint32{0x001e716c, 0x01efca06, 0x0286c9c6, 0x015e74a2, 0x02af8d50, 0x01369ed5, 0x0070d3cb, 0x034edb11, 0x02ed2a58, 0x0019c4d6}}, Y: Field{[10]uint32{0x02fd6664, 0x01202723, 0x03040019, 0x00fc14fa, 0x0230fa2f, 0x03cdd111, 0x00f3e778, 0x038fbf72, 0x02ab2786, 0x0025f102}}}, + {X: Field{[10]uint32{0x0354f90e, 0x024a3950, 0x038b9c37, 0x01782436, 0x03c3dea7, 0x0135b7c0, 0x0309dd41, 0x01b96b36, 0x01bb0956, 0x002c03ad}}, Y: Field{[10]uint32{0x029b1258, 0x03e4fbb9, 0x0164d8ae, 0x01c044b2, 0x02ccc3a6, 0x02666bce, 0x0173aa63, 0x0399d3a6, 0x02411cb6, 0x001b4483}}}, + {X: Field{[10]uint32{0x03bb73a2, 0x03cce13c, 0x03bb8ecd, 0x024b7a7b, 0x01233375, 0x028e6cb6, 0x01db6d3b, 0x00808bc2, 0x026cbe8d, 0x001c86c6}}, Y: Field{[10]uint32{0x0205310f, 0x01632392, 0x020885b4, 0x039e542f, 0x014acbb2, 0x0253e01d, 0x01ae1f2e, 0x003d1c1d, 0x0362631a, 0x00336d06}}}, + {X: Field{[10]uint32{0x038a0837, 0x028f9137, 0x03f71d10, 0x020e5226, 0x0242f60b, 0x02431083, 0x0147cde1, 0x004b2a37, 0x00ac015b, 0x0032e35e}}, Y: Field{[10]uint32{0x0296dbc2, 0x01f33ffa, 0x022d5d17, 0x022c4206, 0x03abdc44, 0x03ecb849, 0x00d3846c, 0x00d9d7a3, 0x01a6a307, 0x00202f8c}}}, + {X: Field{[10]uint32{0x00781920, 0x03b1e15b, 0x0017a0af, 0x00af8bb8, 0x0137e5c5, 0x03450f95, 0x03f3ae66, 0x03621348, 0x03cc4919, 0x0012473e}}, Y: Field{[10]uint32{0x02874189, 0x01fb3115, 0x03ee62b1, 0x0353b706, 0x003ba714, 0x01367cbb, 0x004d29cc, 0x00c2234d, 0x03502628, 0x001d8c86}}}, + {X: Field{[10]uint32{0x02b507b4, 0x01c02cda, 0x0027cfb3, 0x011b17af, 0x038145d1, 0x02088c0e, 0x02ed33ff, 0x00898c8e, 0x03ee4899, 0x0001b28c}}, Y: Field{[10]uint32{0x00b11f4e, 0x00fa34b0, 0x03ec644e, 0x002a7276, 0x038c376a, 0x002548af, 0x00a20cfd, 0x03419078, 0x02b3f189, 0x0025adce}}}, + {X: Field{[10]uint32{0x01d842c7, 0x032aea06, 0x00f8997c, 0x03be6058, 0x001bf602, 0x008b3e9a, 0x03b33d38, 0x025c6db2, 0x03cb3c48, 0x001b47f7}}, Y: Field{[10]uint32{0x03b1713f, 0x01b4a733, 0x0376909c, 0x0311565a, 0x00fa555a, 0x01bc1180, 0x017c0629, 0x02098979, 0x03c46608, 0x00020af1}}}, + {X: Field{[10]uint32{0x02a43554, 0x038fea7f, 0x01b55c88, 0x00f0f87a, 0x02daeb53, 0x01ac8de5, 0x01ac3ca3, 0x00bd069a, 0x02991cf9, 0x0028fa05}}, Y: Field{[10]uint32{0x012855f1, 0x02520c8c, 0x020fa25e, 0x03d5e1b4, 0x0165887d, 0x015014c2, 0x0206b0b4, 0x0119ebe8, 0x029be802, 0x0021e9be}}}, + {X: Field{[10]uint32{0x01d49c70, 0x0230fa1f, 0x03ab571f, 0x013cfcbf, 0x007f570e, 0x0142cab1, 0x02c7438d, 0x030ca53a, 0x03d7cbfb, 0x003f212a}}, Y: Field{[10]uint32{0x03f73dd9, 0x014ddf69, 0x0075b691, 0x00ee959b, 0x02589f6c, 0x0266d905, 0x01b3f1cd, 0x015ac396, 0x02690713, 0x001d11ec}}}, + {X: Field{[10]uint32{0x0355d1b1, 0x02090200, 0x01769539, 0x02a1ce9a, 0x01af4e02, 0x03b28568, 0x00d31252, 0x0056e860, 0x02408fc5, 0x002fac8c}}, Y: Field{[10]uint32{0x019c1459, 0x030d0fd4, 0x01e95b3b, 0x028417ae, 0x00e2bbe6, 0x006dd96c, 0x02deba93, 0x02a6ab97, 0x000d6fa8, 0x0004be92}}}, + {X: Field{[10]uint32{0x0299eb8e, 0x0180d906, 0x00f13df7, 0x00ed810d, 0x010a50e6, 0x02f0094a, 0x02373d71, 0x035fcc66, 0x0279cffa, 0x001a2245}}, Y: Field{[10]uint32{0x00772fb8, 0x01ed6dda, 0x00524da0, 0x0258b9bb, 0x037736ce, 0x01b40540, 0x02a7c1e8, 0x022a8b4b, 0x01b76db2, 0x00102de3}}}, + {X: Field{[10]uint32{0x03068817, 0x0007b8ae, 0x01d96ed4, 0x03350a3a, 0x03b42e2f, 0x023ed754, 0x022f736e, 0x02c103f7, 0x01ad1ae7, 0x0003b10d}}, Y: Field{[10]uint32{0x0096f9f2, 0x02fb23bf, 0x03ac244b, 0x01175943, 0x0126860c, 0x01b13de5, 0x0028a856, 0x010dbd2a, 0x02aa1283, 0x0004efdb}}}, + {X: Field{[10]uint32{0x03de3033, 0x0165341a, 0x0249f374, 0x01d9885a, 0x0060a755, 0x01df9241, 0x03b7ce7f, 0x01a22df7, 0x02fa661f, 0x0019e7d6}}, Y: Field{[10]uint32{0x03617ca1, 0x03ecd71b, 0x017094e0, 0x00ca921f, 0x02c8fddd, 0x023c172d, 0x00f14bfc, 0x013f6956, 0x03d96c25, 0x003fcfff}}}, + {X: Field{[10]uint32{0x0233be60, 0x026994bd, 0x02d68ba8, 0x000bb3ad, 0x011aa2fc, 0x010c1ec8, 0x0348aeb6, 0x009b97ef, 0x00ea05dc, 0x0027faf6}}, Y: Field{[10]uint32{0x02630bee, 0x0390d923, 0x0099272b, 0x0258b1de, 0x033fc5dc, 0x02ef1783, 0x036e785c, 0x00e292b4, 0x03c8ea62, 0x0030219e}}}, + {X: Field{[10]uint32{0x000b1601, 0x00df24d8, 0x03acfe21, 0x02046d64, 0x010347b3, 0x03763e7c, 0x02bed696, 0x02d23b6d, 0x0154c534, 0x003621ac}}, Y: Field{[10]uint32{0x0375d077, 0x02ad7583, 0x03964f10, 0x03064edd, 0x03d74028, 0x03faa8fd, 0x02246c8e, 0x036aa713, 0x0118aa07, 0x002932f0}}}, + {X: Field{[10]uint32{0x006e9d47, 0x03929d11, 0x0349ab7e, 0x009f73b0, 0x01096a8e, 0x03fc85e8, 0x03f6ab68, 0x028e9820, 0x03efc187, 0x002be332}}, Y: Field{[10]uint32{0x03e941f0, 0x01c5b3da, 0x03dc4990, 0x00cc96a3, 0x031662a7, 0x0395539b, 0x025b625b, 0x000e49f6, 0x027c9988, 0x0000fb8c}}}, + {X: Field{[10]uint32{0x01d3d26a, 0x00662f1f, 0x033654a6, 0x0162a65e, 0x0042d334, 0x012952a1, 0x0051d224, 0x0098728d, 0x00e7891c, 0x0007a600}}, Y: Field{[10]uint32{0x01a215d4, 0x0269dcd9, 0x013bd566, 0x03259bdd, 0x03978120, 0x020b9acd, 0x031a321e, 0x03f03757, 0x0186bd6f, 0x000c8be2}}}, + {X: Field{[10]uint32{0x03150044, 0x0193159d, 0x015e415d, 0x029a8b49, 0x00aae4ff, 0x00ea43cc, 0x000dc97f, 0x02002561, 0x02f29f00, 0x00045718}}, Y: Field{[10]uint32{0x02d8af95, 0x035f8cba, 0x01a14a8f, 0x017a2f0b, 0x02cceef9, 0x0393f7c2, 0x03660e01, 0x03397bf5, 0x00127e37, 0x00136513}}}, + {X: Field{[10]uint32{0x02e0178c, 0x01565a0a, 0x02ba2598, 0x017fd0a0, 0x033f5313, 0x0144896f, 0x00d78e8e, 0x01e776cd, 0x039dacbf, 0x000072e7}}, Y: Field{[10]uint32{0x011a4bf5, 0x01a32d2f, 0x0284a50c, 0x03421577, 0x02d7b602, 0x02f3c8d3, 0x01595e20, 0x026f2508, 0x00e37a18, 0x0023f4e9}}}, + {X: Field{[10]uint32{0x03bfe357, 0x01e7b94b, 0x0370b66a, 0x0163e779, 0x01af86d2, 0x0326478e, 0x02b2a5bd, 0x03059d2e, 0x03c463e4, 0x0018a856}}, Y: Field{[10]uint32{0x02f52749, 0x02f792e3, 0x01e9f9f7, 0x0107a3af, 0x02d376fe, 0x01bd1548, 0x02da69fe, 0x01f93495, 0x029fd946, 0x002de3f2}}}, + {X: Field{[10]uint32{0x02df505e, 0x0047a4d7, 0x01ec454b, 0x00a96867, 0x026bd2c8, 0x01cefb53, 0x0170914a, 0x006520c5, 0x00e05bf3, 0x0015d29b}}, Y: Field{[10]uint32{0x00001318, 0x0206a5d7, 0x00b789b2, 0x02ea2ed7, 0x02d02dba, 0x006a6943, 0x02a60b8c, 0x03cce3c3, 0x02cccbd6, 0x0039ecb8}}}, + {X: Field{[10]uint32{0x024084e6, 0x02b47549, 0x023194ad, 0x02ad5839, 0x01c5ae50, 0x027b493f, 0x039cedad, 0x018692eb, 0x037ca3a3, 0x001931b8}}, Y: Field{[10]uint32{0x00116067, 0x025bb59a, 0x008d3f79, 0x003a09c7, 0x004b7a48, 0x00d6b801, 0x0054a07f, 0x02d01027, 0x035656b6, 0x0039b90b}}}, + {X: Field{[10]uint32{0x0100fd84, 0x002041d2, 0x03b11553, 0x011ab79f, 0x0371b277, 0x01d581e9, 0x0246af84, 0x02379555, 0x0297fe4a, 0x00124196}}, Y: Field{[10]uint32{0x030ae7f9, 0x0217c6b5, 0x03342834, 0x01efeed0, 0x0094e721, 0x01ec9d9f, 0x038eb43c, 0x00c2426a, 0x009f67a0, 0x0026175a}}}, + {X: Field{[10]uint32{0x030999cb, 0x02532a8c, 0x009aa443, 0x0079f962, 0x028500c9, 0x03a227cc, 0x02a683b7, 0x0242f61d, 0x03f91857, 0x001bf4cb}}, Y: Field{[10]uint32{0x01d2de3b, 0x025ea321, 0x0278c644, 0x024e3c69, 0x03efbd64, 0x031afc07, 0x013784e9, 0x03c975ea, 0x00841be1, 0x0004bfa0}}}, + {X: Field{[10]uint32{0x02d3b185, 0x02e4ad98, 0x0098b4eb, 0x03109bf7, 0x012d6d12, 0x01c25214, 0x0334812f, 0x027239bf, 0x00da4818, 0x001299f5}}, Y: Field{[10]uint32{0x038150f5, 0x033a945f, 0x01540684, 0x0174e269, 0x033e5009, 0x03e9c6e3, 0x03c668ee, 0x02ddddcd, 0x03f2f6e5, 0x00163aa0}}}, + {X: Field{[10]uint32{0x039f4db2, 0x0386fae9, 0x00c85987, 0x03165708, 0x00edecf4, 0x026b6d19, 0x020752db, 0x009dc174, 0x0131d3a9, 0x003a86b2}}, Y: Field{[10]uint32{0x0322b83e, 0x03dbcd19, 0x008309c3, 0x014da292, 0x03426b57, 0x001bf646, 0x0316597b, 0x02580560, 0x030e25aa, 0x0033da26}}}, + {X: Field{[10]uint32{0x01545c5a, 0x0136fd37, 0x006c12de, 0x03cfc65b, 0x0161414a, 0x02af2672, 0x032663f7, 0x00149f55, 0x026e248a, 0x00232cd6}}, Y: Field{[10]uint32{0x000cfcfa, 0x0254b99a, 0x02a7c4a3, 0x02afcdaf, 0x01c43292, 0x00235403, 0x02dfc3fa, 0x0336d99b, 0x00e047da, 0x0012ccb9}}}, + {X: Field{[10]uint32{0x027f21c8, 0x02673374, 0x008e3c8d, 0x02110c1e, 0x00843186, 0x01160558, 0x02f8dfbf, 0x030bab3f, 0x000cf150, 0x00091f20}}, Y: Field{[10]uint32{0x031d0db6, 0x010ba147, 0x030a7579, 0x01776cf9, 0x02a70839, 0x020a7adf, 0x026462f5, 0x03468398, 0x00dc914f, 0x003320b6}}}, + {X: Field{[10]uint32{0x03426673, 0x012191cc, 0x02482c9f, 0x0133b480, 0x025e0c4a, 0x0040dc23, 0x00f35666, 0x0249f3ec, 0x03c407fb, 0x001950f5}}, Y: Field{[10]uint32{0x0107ebab, 0x023cf51e, 0x0019c88d, 0x00c0ff72, 0x0020bbc7, 0x00c7a9d4, 0x00ae0d16, 0x02b5d605, 0x029a69b4, 0x003894ac}}}, + {X: Field{[10]uint32{0x0388e6d0, 0x0155ad30, 0x026c29b3, 0x036cb840, 0x02d5e759, 0x03d72705, 0x01da4aca, 0x00ce8e82, 0x0255d81c, 0x00313c44}}, Y: Field{[10]uint32{0x00a8fd49, 0x03554747, 0x014f24fc, 0x02ac61ba, 0x0195379e, 0x0123d463, 0x00e5530e, 0x022ad605, 0x02a81af4, 0x0038b98d}}}, + {X: Field{[10]uint32{0x02019eec, 0x0363be57, 0x005981ba, 0x023f2798, 0x01b08284, 0x012bd681, 0x003d92a1, 0x00e6ddce, 0x029d85da, 0x0033c61a}}, Y: Field{[10]uint32{0x0079e3fc, 0x01156f2c, 0x0064248f, 0x01f81873, 0x006b49f3, 0x0100425a, 0x03672a16, 0x03f8214f, 0x021bc860, 0x0032af78}}}, + {X: Field{[10]uint32{0x02ea8f32, 0x02ba40e1, 0x037f6be9, 0x011cf517, 0x00fe9d1d, 0x0222e3f6, 0x015c2c7a, 0x03704f96, 0x0353ad69, 0x0039b0f8}}, Y: Field{[10]uint32{0x00690be1, 0x001f0a2b, 0x02b57021, 0x008357b4, 0x0396b5a9, 0x012617cc, 0x0210800a, 0x01707485, 0x00c94f45, 0x001f4efb}}}, + {X: Field{[10]uint32{0x01060988, 0x029ecbb0, 0x01c118d6, 0x03ddcc34, 0x01d1ba01, 0x033c8a44, 0x0295dc6b, 0x01553551, 0x03a39bcb, 0x000e09ec}}, Y: Field{[10]uint32{0x0225a211, 0x0142bff2, 0x027bfd9f, 0x01890648, 0x00c800a3, 0x02e3d304, 0x0018c5ec, 0x03ba0c6e, 0x0047b7c9, 0x000c904c}}}, + {X: Field{[10]uint32{0x006d24fa, 0x01582373, 0x0013e48f, 0x021446d5, 0x004b55ed, 0x0102c3bd, 0x01ae898c, 0x01268aa3, 0x0138a4b1, 0x003fcdf3}}, Y: Field{[10]uint32{0x01c49048, 0x00cb2b2e, 0x03ceca68, 0x0354810c, 0x01f3ffde, 0x01a14ea5, 0x03a489b8, 0x019995f0, 0x01198f4c, 0x00179856}}}, + {X: Field{[10]uint32{0x020ce509, 0x034fa28c, 0x001def68, 0x01f11545, 0x01d9e53c, 0x03a0edd4, 0x03343229, 0x00beb87b, 0x03c85b49, 0x002f7fd3}}, Y: Field{[10]uint32{0x03de3d20, 0x013f7822, 0x00b8a43b, 0x0139135c, 0x02531f8a, 0x02656784, 0x015088a2, 0x01759985, 0x00649dcc, 0x003a3f66}}}, + {X: Field{[10]uint32{0x03bcd0af, 0x02a6cf0e, 0x02aef625, 0x001c9051, 0x02e59d10, 0x00063c47, 0x032719d9, 0x03cb55fe, 0x029c313f, 0x003f5ae8}}, Y: Field{[10]uint32{0x01c1079d, 0x00fa5f7d, 0x02bf6de7, 0x03a078e2, 0x035018db, 0x0065ae1d, 0x01f584b3, 0x00430c0e, 0x035e9133, 0x00061f6b}}}, + {X: Field{[10]uint32{0x0329ff28, 0x02dc42c6, 0x03b621d0, 0x01e05017, 0x004f4b5f, 0x02b0c05e, 0x032ae1c3, 0x01a4a7bd, 0x022d4860, 0x003a8f10}}, Y: Field{[10]uint32{0x03bf208c, 0x03fbe48c, 0x02af2564, 0x01f3be66, 0x01d10b37, 0x028c5b89, 0x03637eef, 0x0381bf0d, 0x001ec6c3, 0x0039162d}}}, + {X: Field{[10]uint32{0x007b3978, 0x01c14fd2, 0x03c390f8, 0x03b6bc6c, 0x0002ba8a, 0x002d166e, 0x0228924f, 0x03580234, 0x01334982, 0x001194dc}}, Y: Field{[10]uint32{0x01adf3f0, 0x03fd9693, 0x017006bb, 0x0368ee25, 0x023b2444, 0x00850f72, 0x003bb29e, 0x0277bfc9, 0x014c1318, 0x003f6599}}}, + {X: Field{[10]uint32{0x0178d8f5, 0x00dc5da1, 0x039dd996, 0x012a8b43, 0x01b5b29b, 0x03e78414, 0x036227f9, 0x001a6ab1, 0x03f11226, 0x003f6924}}, Y: Field{[10]uint32{0x01d46fa3, 0x02e1b1f8, 0x03a06d8e, 0x02d4958c, 0x02e04e55, 0x02600e98, 0x03a69d7f, 0x004db7d0, 0x013df63d, 0x00168cd6}}}, + {X: Field{[10]uint32{0x01f3e4c1, 0x0185d3ce, 0x000cd096, 0x015f15c8, 0x027ab5e7, 0x03a8dbfb, 0x028e2835, 0x00062951, 0x02e95f09, 0x001d3f10}}, Y: Field{[10]uint32{0x018751f0, 0x02c94848, 0x010b32a8, 0x01d52ff4, 0x033760e0, 0x017e3d75, 0x006204d4, 0x0324536a, 0x03403802, 0x00332a82}}}, + {X: Field{[10]uint32{0x00483d53, 0x022ec6bb, 0x03bafe11, 0x030a0503, 0x030d98f8, 0x0239051d, 0x03818da5, 0x01e68032, 0x004a997b, 0x0002633b}}, Y: Field{[10]uint32{0x02aaec08, 0x01a26b1f, 0x02ae4d81, 0x02782103, 0x01ac422d, 0x020b0675, 0x03b82fa1, 0x017354d9, 0x00581494, 0x000bf398}}}, + {X: Field{[10]uint32{0x03cba60f, 0x00dd2c44, 0x01fc13c2, 0x01025b31, 0x01e4fa15, 0x025ff55d, 0x015119f6, 0x032f7081, 0x01b789a5, 0x0031d0b7}}, Y: Field{[10]uint32{0x02f3532d, 0x02837a91, 0x0168013f, 0x03d3cac7, 0x01b32248, 0x039b6ea8, 0x002474b0, 0x02438750, 0x012834a9, 0x0026c2bc}}}, + {X: Field{[10]uint32{0x0391eb89, 0x0027f479, 0x0019b774, 0x0360ec4e, 0x005b5973, 0x03131c89, 0x00979136, 0x0019aad6, 0x004f9a78, 0x0036e8b8}}, Y: Field{[10]uint32{0x033baf43, 0x03f29798, 0x016a889d, 0x03821c11, 0x03aa0e90, 0x005e3c1d, 0x00240e7a, 0x017dd05a, 0x01223adb, 0x000d1d1e}}}, + {X: Field{[10]uint32{0x02f6538d, 0x0271a710, 0x01fbf106, 0x02183ada, 0x036cc47f, 0x03091cac, 0x0184dcb6, 0x021619ee, 0x02436e59, 0x001b532b}}, Y: Field{[10]uint32{0x01e0a84f, 0x02ec7cf5, 0x01cedb98, 0x019f59fc, 0x02125c2b, 0x00fbfbd4, 0x03c53c92, 0x03df3b75, 0x00c9f0c4, 0x0031fed6}}}, + {X: Field{[10]uint32{0x00523982, 0x005a80ee, 0x0010f9cc, 0x00e5bf65, 0x029ec5b5, 0x02eb8a46, 0x0264ed43, 0x01ec156d, 0x036ed5b6, 0x0013115f}}, Y: Field{[10]uint32{0x00f344eb, 0x007fb548, 0x00e988e9, 0x01ffb086, 0x02a435f4, 0x029ca09e, 0x022ed682, 0x03867d51, 0x03cf20aa, 0x00124b96}}}, + {X: Field{[10]uint32{0x0346eb3f, 0x035107f2, 0x018179cd, 0x030c1933, 0x0151fd8a, 0x01d2b8a5, 0x00033bfd, 0x022907d6, 0x01223477, 0x00135f9a}}, Y: Field{[10]uint32{0x022750c4, 0x024bd1b1, 0x012ad0c0, 0x001ef443, 0x036d7bbd, 0x01eb692e, 0x00538791, 0x0274f0e9, 0x00b2ff5c, 0x001d5bb0}}}, + {X: Field{[10]uint32{0x03d464b2, 0x0311f8c1, 0x0115cfef, 0x027292be, 0x004a4839, 0x02dd3be5, 0x03c565ea, 0x0351e6f6, 0x025069ba, 0x0002b16f}}, Y: Field{[10]uint32{0x02874345, 0x02df3eb7, 0x00381928, 0x02a94a6d, 0x008bad5d, 0x02739176, 0x0322c546, 0x0042d8dd, 0x03febc58, 0x000c91b8}}}, + {X: Field{[10]uint32{0x023995b2, 0x027a1036, 0x002d15d6, 0x002d8362, 0x0224f91e, 0x014d2c96, 0x026a4812, 0x0004e6ff, 0x01412135, 0x001f6a23}}, Y: Field{[10]uint32{0x00b9c587, 0x0080d23c, 0x03eb5cbc, 0x00b262b6, 0x026a2d09, 0x025dc90c, 0x00bb03cf, 0x0293e1c0, 0x018d62a7, 0x0026222b}}}, + {X: Field{[10]uint32{0x01abf149, 0x014af8ec, 0x037d4e8b, 0x00ac1744, 0x015d3b92, 0x034f3ad2, 0x01aa3eb4, 0x02734832, 0x031a6323, 0x000e27fc}}, Y: Field{[10]uint32{0x00fe7c93, 0x03000dce, 0x02d49dc3, 0x03b55456, 0x01042f54, 0x01db0521, 0x022ab22b, 0x002fca28, 0x022fbc84, 0x002c3b0a}}}, + {X: Field{[10]uint32{0x016c4370, 0x009e9756, 0x036f8f3c, 0x012637f3, 0x02a94b2e, 0x00f55cdb, 0x025afaad, 0x00a2cba9, 0x02cf5fb1, 0x00307306}}, Y: Field{[10]uint32{0x034fd38e, 0x010279a4, 0x0153b27c, 0x02a706ec, 0x00ecfec6, 0x028aa233, 0x006bf2da, 0x02b4c5b3, 0x004d1986, 0x002240d6}}}, + {X: Field{[10]uint32{0x03c9aa3a, 0x01462d21, 0x03cf98b3, 0x015fa46c, 0x0002a349, 0x00725b01, 0x0340be83, 0x01a28a91, 0x0252b927, 0x000e66b3}}, Y: Field{[10]uint32{0x00800005, 0x03ac4d12, 0x02869786, 0x030f2812, 0x03fd9af1, 0x035827e8, 0x017ae095, 0x00e91e84, 0x00b3abdb, 0x002420c5}}}, + {X: Field{[10]uint32{0x0206d0a2, 0x020eea6e, 0x03c76d82, 0x001832b6, 0x01470cc6, 0x001694ae, 0x02d98593, 0x000695c0, 0x03fd8c9d, 0x0001a550}}, Y: Field{[10]uint32{0x031057df, 0x03a2865c, 0x01d1b6f4, 0x030e2a40, 0x00404eb1, 0x00ca6022, 0x0348f17b, 0x01cbb4b8, 0x03d9a0c3, 0x003a6639}}}, + {X: Field{[10]uint32{0x00200100, 0x02dabdfa, 0x02d6d400, 0x00f3dc0e, 0x00911e55, 0x01cac70a, 0x01289a58, 0x011bbd68, 0x014fdf9b, 0x00085cb5}}, Y: Field{[10]uint32{0x03687a8c, 0x00625c46, 0x035d9edc, 0x03afd90a, 0x0334a8fb, 0x01cac89b, 0x0020df57, 0x00397832, 0x007d3b79, 0x0008486d}}}, + {X: Field{[10]uint32{0x015e8b56, 0x017df3a7, 0x03f286d4, 0x00e84390, 0x01cc2713, 0x01248e59, 0x026847d2, 0x00939743, 0x03e937a3, 0x003d81bd}}, Y: Field{[10]uint32{0x0286e007, 0x039d5c4f, 0x008d1a30, 0x02024728, 0x03f5b805, 0x024c9284, 0x03379448, 0x00878b44, 0x03b8622a, 0x001c004f}}}, + {X: Field{[10]uint32{0x0040fc99, 0x03639c5f, 0x0214edfc, 0x00b7526a, 0x012f95bb, 0x00d0abcd, 0x0032013b, 0x02d93c7d, 0x00c2dfce, 0x0027c548}}, Y: Field{[10]uint32{0x018e863d, 0x035534e2, 0x001996ca, 0x029040c2, 0x02d53dc0, 0x0192a41f, 0x024fe3b7, 0x03c0123e, 0x0226feb1, 0x003fa3f2}}}, + {X: Field{[10]uint32{0x031eaa08, 0x024dc288, 0x0260518a, 0x00632ca1, 0x0053afe4, 0x01724f4e, 0x00674eb7, 0x019dbbac, 0x036e7587, 0x00199c2b}}, Y: Field{[10]uint32{0x03eb09f3, 0x02933b92, 0x0053734b, 0x03314936, 0x00fb59fc, 0x02ec4bf6, 0x03fcee90, 0x01c7b825, 0x035edfc0, 0x000a64ff}}}, + {X: Field{[10]uint32{0x03898350, 0x0166a52c, 0x0152465f, 0x013ab5b2, 0x0140650a, 0x03a5530b, 0x00a4e2fe, 0x0312f393, 0x018b345c, 0x000571b5}}, Y: Field{[10]uint32{0x0363cf7f, 0x0039de28, 0x02cf3a6b, 0x02a9cf7c, 0x00221b12, 0x014a34b0, 0x020f3adf, 0x01865996, 0x013b4727, 0x00022531}}}, + {X: Field{[10]uint32{0x01389621, 0x00665ddd, 0x024548a9, 0x0082583a, 0x00adfffd, 0x017e1692, 0x0293ef17, 0x03790b24, 0x02bf60db, 0x002f12ad}}, Y: Field{[10]uint32{0x01040e42, 0x00d1d846, 0x01a4437a, 0x01d18552, 0x0100791a, 0x0335c64c, 0x016bb68e, 0x038a9d17, 0x00ba24a4, 0x003f8a28}}}, + {X: Field{[10]uint32{0x013e6ee1, 0x03cb8443, 0x01c8054e, 0x0141001f, 0x0064f20e, 0x031c0eea, 0x015e87f1, 0x03cbdb92, 0x006323fb, 0x00176ac7}}, Y: Field{[10]uint32{0x02695d93, 0x00d2a194, 0x023059c1, 0x0305acc3, 0x03e7f01a, 0x039a2ffe, 0x02db4153, 0x0182f6b9, 0x0200cf44, 0x0007f430}}}, + {X: Field{[10]uint32{0x028acaf2, 0x01f0625a, 0x03bb2dd6, 0x03639c0b, 0x035cea0b, 0x030ce73a, 0x0228dbb0, 0x01f111ef, 0x0157d735, 0x000b7c73}}, Y: Field{[10]uint32{0x02f1b9e8, 0x03d096b8, 0x01741492, 0x019e6577, 0x0186eefa, 0x0136ddbd, 0x039c0319, 0x0323770e, 0x001120cb, 0x000cc648}}}, + {X: Field{[10]uint32{0x00d9ab8d, 0x01377bd8, 0x02fea058, 0x019054d5, 0x023d9f97, 0x034aeb1d, 0x0100585e, 0x036bc20c, 0x00175a02, 0x000b606b}}, Y: Field{[10]uint32{0x01f9a0b7, 0x02060f0b, 0x011c9cd5, 0x00b33a7d, 0x0021052e, 0x039b09b9, 0x0297fd49, 0x0217d5e0, 0x00d13b17, 0x003e6423}}}, + {X: Field{[10]uint32{0x037dc097, 0x0241c090, 0x00db59ef, 0x03d3c47a, 0x0367b1e7, 0x00d5bac5, 0x000d40a5, 0x00b9cc91, 0x0362fb73, 0x0007eb05}}, Y: Field{[10]uint32{0x039b8729, 0x0176569e, 0x031584df, 0x009c04a7, 0x015ae7ce, 0x01d72cc3, 0x01a08ace, 0x01444cad, 0x004ca58d, 0x003b755e}}}, + {X: Field{[10]uint32{0x00c8c98e, 0x00659e0e, 0x01a9cc2b, 0x03c266c5, 0x0245caba, 0x02aa421b, 0x0093e884, 0x02e42e03, 0x035b4694, 0x00341a82}}, Y: Field{[10]uint32{0x0347def3, 0x00833ec1, 0x02da4986, 0x00517de2, 0x0114fcc8, 0x008bfcec, 0x01b391b2, 0x02c93f34, 0x02ba2777, 0x00132b51}}}, + {X: Field{[10]uint32{0x01e53445, 0x0054ac5f, 0x01d6929b, 0x02e33e6c, 0x01870059, 0x02dbc1a5, 0x007928ac, 0x0103e664, 0x03275902, 0x00124a37}}, Y: Field{[10]uint32{0x0300d505, 0x029d468c, 0x00ac53db, 0x0330a1aa, 0x03240b83, 0x01f70cda, 0x00c400f3, 0x00ec39ec, 0x020b655b, 0x002ddcf9}}}, + {X: Field{[10]uint32{0x03a28390, 0x018e7fe1, 0x01dda1b8, 0x01430cc7, 0x03f945d4, 0x00c8a09f, 0x02992617, 0x0060452e, 0x01f9cd54, 0x002986f3}}, Y: Field{[10]uint32{0x00d93a68, 0x03fa01ee, 0x004eeb40, 0x01c3af99, 0x018e61b3, 0x0007f893, 0x0201b2b3, 0x02eca151, 0x016ed6fd, 0x000f9dc7}}}, + {X: Field{[10]uint32{0x01db93c3, 0x0106c544, 0x0093f9f6, 0x013041fc, 0x030fb8e3, 0x00029e5d, 0x031228c0, 0x02deaece, 0x01b93e2f, 0x0014d68d}}, Y: Field{[10]uint32{0x02ff786f, 0x027fb26c, 0x02e96f0c, 0x02d7a354, 0x0292475f, 0x01f0b8f0, 0x0283fba2, 0x033230e0, 0x03355657, 0x00091c7f}}}, + {X: Field{[10]uint32{0x0065d4d0, 0x01e42d31, 0x00acfa5f, 0x00ab442e, 0x00f23ad4, 0x01af9c2c, 0x02888bbc, 0x003ca4dd, 0x012ce014, 0x0039a299}}, Y: Field{[10]uint32{0x001a7385, 0x03e7074f, 0x0094c06c, 0x01f82e03, 0x00ea6e0c, 0x02b54848, 0x034ecb6d, 0x00182cc4, 0x010cc368, 0x001275ce}}}, + {X: Field{[10]uint32{0x03e25fde, 0x03c3a64d, 0x007576b4, 0x01bc22f1, 0x01f5f05f, 0x03a883a6, 0x017855c3, 0x03334fbc, 0x027a74df, 0x003a24e7}}, Y: Field{[10]uint32{0x0261b173, 0x020a7fb5, 0x0388b3e0, 0x015368b0, 0x033773f4, 0x0127930a, 0x00c0fdf4, 0x0156df24, 0x033eff0a, 0x001ad229}}}, + {X: Field{[10]uint32{0x00751543, 0x0003ebd2, 0x01dafbfd, 0x020d9f0c, 0x007fe164, 0x029b9c2b, 0x00fa2930, 0x0061d200, 0x03ea3145, 0x00125804}}, Y: Field{[10]uint32{0x038c4332, 0x00b8bc6a, 0x03f65614, 0x0022e14d, 0x02581e15, 0x020accc4, 0x00001cb2, 0x0155be29, 0x01118790, 0x002d5c54}}}, + {X: Field{[10]uint32{0x004b1e1f, 0x0370f060, 0x0120189d, 0x00a79f31, 0x01bb0f6c, 0x00981342, 0x0157a072, 0x030ea55a, 0x01b0b1ef, 0x001111cd}}, Y: Field{[10]uint32{0x0259d6e4, 0x02f9001f, 0x0321f9ae, 0x027cca96, 0x023e9a43, 0x00143956, 0x0332a857, 0x02eacea5, 0x00a3461a, 0x002c6b58}}}, + {X: Field{[10]uint32{0x02d9511c, 0x02d0450f, 0x02475da3, 0x02279dea, 0x03e88821, 0x02e72630, 0x01a40e74, 0x01f573e1, 0x02c84acd, 0x00016016}}, Y: Field{[10]uint32{0x023c07c0, 0x0204d35a, 0x02363bb4, 0x00882bab, 0x0301ad00, 0x03635a6d, 0x0170dcf0, 0x014cfdef, 0x023bfbba, 0x003254a4}}}, + {X: Field{[10]uint32{0x039a9501, 0x02ddfbc9, 0x00898dca, 0x02f711b2, 0x02c12619, 0x02da4080, 0x01c53a12, 0x031e1578, 0x011830fd, 0x0022b045}}, Y: Field{[10]uint32{0x01ca4fa4, 0x035af52a, 0x0053ad59, 0x02e376cc, 0x00d5deb3, 0x02fec800, 0x0015493a, 0x03e83874, 0x00c77867, 0x000a7edf}}}, + {X: Field{[10]uint32{0x02ab542d, 0x01ed1102, 0x01ec67bd, 0x01bc8bd0, 0x014d7022, 0x031efbfd, 0x03c8a7cc, 0x02632da3, 0x01d3e429, 0x002a91eb}}, Y: Field{[10]uint32{0x003683e9, 0x0079d731, 0x01816f77, 0x013f0656, 0x024f8e8c, 0x03d9d166, 0x034f9e39, 0x036630eb, 0x0081ebef, 0x0033e96b}}}, + {X: Field{[10]uint32{0x0199889a, 0x02236e79, 0x013e419e, 0x026390cf, 0x03d39848, 0x019248ad, 0x0133f753, 0x0053ba48, 0x0127a27a, 0x003cd410}}, Y: Field{[10]uint32{0x001b45df, 0x0337c218, 0x03313c09, 0x008e819a, 0x0256c6d4, 0x01ef2e21, 0x02cdae54, 0x01a2a213, 0x037e9f98, 0x003c6be7}}}, + {X: Field{[10]uint32{0x024bf08d, 0x03bbbb5f, 0x0398c7c6, 0x03964986, 0x02272d3c, 0x026a6269, 0x00870766, 0x039a20d6, 0x0344edcb, 0x000cdcc3}}, Y: Field{[10]uint32{0x01775a6b, 0x0172f9b8, 0x02794860, 0x01fb31c2, 0x01b6fd05, 0x02f4b5e2, 0x02a32d81, 0x005b412c, 0x0128d877, 0x000fe0ce}}}, + {X: Field{[10]uint32{0x02dfb0d6, 0x02d2850f, 0x034786e5, 0x01fef84d, 0x00a33d41, 0x02492730, 0x00bdf072, 0x03d61220, 0x02dc8c06, 0x000c5a75}}, Y: Field{[10]uint32{0x0274ce5f, 0x018fa1aa, 0x037fcea1, 0x0030bf79, 0x00a31160, 0x023d0a32, 0x0382f596, 0x00e0e6e9, 0x022dec56, 0x000aa450}}}, + {X: Field{[10]uint32{0x002a4429, 0x03f331bc, 0x038e980c, 0x0114355f, 0x03c8c43a, 0x02a370fa, 0x007a64d5, 0x02ba073c, 0x0182013a, 0x00363191}}, Y: Field{[10]uint32{0x03822aea, 0x012312a4, 0x02a7be7f, 0x011e1278, 0x02c4773d, 0x027fb8ec, 0x012f195c, 0x018eba32, 0x00519688, 0x003121cc}}}, + {X: Field{[10]uint32{0x002b6f11, 0x007da7d0, 0x03fe1789, 0x03605368, 0x007e59c8, 0x018c6e21, 0x03cb0395, 0x0091bde9, 0x001f307e, 0x002b99c4}}, Y: Field{[10]uint32{0x01ed44cb, 0x007871c4, 0x022aee41, 0x03e5f608, 0x031d3900, 0x027e68d5, 0x02767afa, 0x0027a2e5, 0x03b4a90b, 0x003d7cb6}}}, + {X: Field{[10]uint32{0x01dbd8ee, 0x035fc520, 0x00f0c1a9, 0x010e095d, 0x02b4e2ff, 0x02068b17, 0x00a7dc9c, 0x020ce070, 0x023183ba, 0x002a7a1c}}, Y: Field{[10]uint32{0x02468901, 0x03775be5, 0x023354b7, 0x02b0f5ce, 0x03333153, 0x039a0d13, 0x01fb59be, 0x0038cf5a, 0x019990d9, 0x0025a041}}}, + {X: Field{[10]uint32{0x003376f2, 0x01078d39, 0x0048dad1, 0x01e7ed6f, 0x00694ef8, 0x00cf9a12, 0x014f43aa, 0x03502c9a, 0x021c0ae7, 0x00185afc}}, Y: Field{[10]uint32{0x0080fc77, 0x01772526, 0x02799bf0, 0x016a8f67, 0x024a2772, 0x02d693ea, 0x02451153, 0x0282ea0c, 0x03832aa8, 0x002fb063}}}, + {X: Field{[10]uint32{0x033f5c2d, 0x0144262b, 0x0295f8d3, 0x033dc069, 0x0339be47, 0x03a6f96e, 0x02882b11, 0x00cf51e2, 0x0335601f, 0x000487a0}}, Y: Field{[10]uint32{0x0103b3e8, 0x00a8a613, 0x03659f68, 0x01c11216, 0x03010dd0, 0x02ffe077, 0x005fdfdc, 0x02812df6, 0x013318fa, 0x000ba64a}}}, + {X: Field{[10]uint32{0x009f1141, 0x02325eee, 0x0193325c, 0x00a12a42, 0x003a83cc, 0x03bc6f12, 0x0013948f, 0x032a7025, 0x03973025, 0x002fe211}}, Y: Field{[10]uint32{0x02ad5386, 0x01c4fd9b, 0x0363f0e2, 0x0181aaee, 0x016de247, 0x020e3449, 0x015ae3a7, 0x03475e1b, 0x03263d26, 0x000654e8}}}, + {X: Field{[10]uint32{0x02f811f0, 0x0180295a, 0x02124e86, 0x0383ebb6, 0x00dd1b06, 0x0371d734, 0x0094d4bd, 0x0003e617, 0x01a65a38, 0x001f0a3a}}, Y: Field{[10]uint32{0x02b5c277, 0x005218e2, 0x03863134, 0x035bcb90, 0x002d396f, 0x001d09ed, 0x014cedb7, 0x027c0e24, 0x01b70e33, 0x0028dd5b}}}, + {X: Field{[10]uint32{0x00a66077, 0x024c5ca4, 0x02b9cb8b, 0x0244c6f0, 0x0346be07, 0x02e48e1e, 0x00b5bf6b, 0x00b3d073, 0x01ad45e6, 0x00397b1b}}, Y: Field{[10]uint32{0x004f0e19, 0x00ceaeb9, 0x00eda67c, 0x0249e884, 0x012bacd0, 0x038f1348, 0x014bea4b, 0x000f2be1, 0x02cc7757, 0x00340117}}}, + {X: Field{[10]uint32{0x018c2fed, 0x00d85a44, 0x02043583, 0x00f8d363, 0x00703626, 0x0112965d, 0x031c3525, 0x025517ec, 0x021f9203, 0x001bf25b}}, Y: Field{[10]uint32{0x038a9a51, 0x02eaeb62, 0x0089d9aa, 0x00376434, 0x026ca7c2, 0x010e5f8d, 0x030457f8, 0x037a365a, 0x02871571, 0x00340cb7}}}, + {X: Field{[10]uint32{0x006e4133, 0x0244569d, 0x0149acf4, 0x03738684, 0x021db684, 0x01f04c51, 0x02790914, 0x02711d0b, 0x03511c21, 0x002278f4}}, Y: Field{[10]uint32{0x030c5c90, 0x00be4618, 0x00b03689, 0x02eeec89, 0x0352fde5, 0x000f55fa, 0x00b53d23, 0x0211a361, 0x030b672e, 0x002aaf65}}}, + {X: Field{[10]uint32{0x010d5890, 0x0238628e, 0x01de84ff, 0x011c3fa8, 0x00c043e9, 0x02b6e36a, 0x00eb44ea, 0x01914e1e, 0x00f0b213, 0x000ade98}}, Y: Field{[10]uint32{0x004a5244, 0x02eeadf4, 0x02f41ae8, 0x01b46409, 0x01b80668, 0x02ce2cd9, 0x03407091, 0x00ca8164, 0x03161ba0, 0x000320a6}}}, + {X: Field{[10]uint32{0x009627e7, 0x01c8141b, 0x029d42f8, 0x01e6498e, 0x01bfeb98, 0x021e0bc9, 0x037c3dfa, 0x02badf9b, 0x031ac2c2, 0x001192e7}}, Y: Field{[10]uint32{0x02f7502c, 0x016d6d6d, 0x028aadac, 0x001db2d3, 0x029a23a1, 0x0140e1d7, 0x03761dbe, 0x02f30b7d, 0x03f459e1, 0x001f0982}}}, + {X: Field{[10]uint32{0x019b616f, 0x02d8e89d, 0x035ab268, 0x006a61ba, 0x000b2514, 0x01dd2d9c, 0x0331519e, 0x008a5438, 0x02304357, 0x001e494f}}, Y: Field{[10]uint32{0x027f88e1, 0x000d61b8, 0x03f69100, 0x0363c95d, 0x02ed6467, 0x01a59972, 0x00f5bae9, 0x008d4ec8, 0x017a55b6, 0x00369827}}}, + {X: Field{[10]uint32{0x01399556, 0x010b45b7, 0x02773876, 0x00250d65, 0x01019acb, 0x0154643e, 0x02b1967f, 0x03032d70, 0x007ce900, 0x00018d0a}}, Y: Field{[10]uint32{0x03debead, 0x02d186b0, 0x037581fc, 0x00f8c4af, 0x00223c47, 0x014ccd2b, 0x00042db2, 0x005804c3, 0x01098cf0, 0x00288d42}}}, + {X: Field{[10]uint32{0x021bee98, 0x01fc60d0, 0x00223358, 0x012e4588, 0x02d7ef2f, 0x01a9d6d0, 0x0018557f, 0x03f56e8d, 0x01c38bd8, 0x001d8448}}, Y: Field{[10]uint32{0x02dd530f, 0x025ef6d4, 0x010405c8, 0x00d2bebb, 0x0276070e, 0x02eca489, 0x026eeb01, 0x01d0d443, 0x015ff9c1, 0x0010051c}}}, + {X: Field{[10]uint32{0x01453413, 0x0375819b, 0x034b3e63, 0x03870bc1, 0x0077990f, 0x039428ac, 0x01a30784, 0x037c6967, 0x00c1bfbb, 0x00098632}}, Y: Field{[10]uint32{0x02a48da0, 0x01a7774c, 0x01ab0581, 0x016cc9bf, 0x024bdaf3, 0x03a8f2d1, 0x00e584b4, 0x02daac63, 0x023720f5, 0x002b94e6}}}, + {X: Field{[10]uint32{0x00f685be, 0x007c76e4, 0x0020dab3, 0x02d70266, 0x00d91699, 0x0124c22d, 0x03a57e19, 0x03c097f1, 0x00cc10c6, 0x00350a7f}}, Y: Field{[10]uint32{0x02648edf, 0x026f5396, 0x00964068, 0x00f5bedb, 0x00a8df04, 0x02f945a2, 0x0014ae91, 0x01646379, 0x01c1ee15, 0x00368ac5}}}, + {X: Field{[10]uint32{0x00e8b705, 0x036a3639, 0x00b6d56d, 0x03d8d994, 0x01bf1e0c, 0x028b6bbd, 0x0207625b, 0x0232acdb, 0x03c7c04b, 0x001a8638}}, Y: Field{[10]uint32{0x00e94eec, 0x005762f0, 0x0049ed62, 0x010097f3, 0x0120e754, 0x03149507, 0x039c9dab, 0x025b6faf, 0x0330f56c, 0x00198a44}}}, + {X: Field{[10]uint32{0x00f97756, 0x01e848be, 0x032201a3, 0x03fe906c, 0x01d7ca3e, 0x01a88719, 0x002fa4ad, 0x03cff952, 0x0046d1c9, 0x002616da}}, Y: Field{[10]uint32{0x02a3a92e, 0x03d5102a, 0x01592d56, 0x030234e4, 0x03bb9dc6, 0x03150fe2, 0x022f2c32, 0x023dadda, 0x03dd98e1, 0x000f8ac8}}}, + {X: Field{[10]uint32{0x026e8c64, 0x024a5b27, 0x03f3355c, 0x038e5953, 0x0296fba8, 0x031ef328, 0x02ee3395, 0x00e2918f, 0x01db4ba8, 0x00252283}}, Y: Field{[10]uint32{0x00f5c1d8, 0x010c970f, 0x00d2e12c, 0x03b4bde5, 0x01c7b705, 0x03949f58, 0x03b69b52, 0x0360fad9, 0x0025da19, 0x00316cd3}}}, + {X: Field{[10]uint32{0x00a3de2e, 0x02a903ea, 0x028c4256, 0x0331a521, 0x020a437f, 0x020985ec, 0x0246b47e, 0x02c0fede, 0x002c1332, 0x0010ccb4}}, Y: Field{[10]uint32{0x02aa5289, 0x02f83762, 0x01de1e1b, 0x02adcdd9, 0x00393985, 0x025045e0, 0x00327c03, 0x015576a5, 0x016f5f9c, 0x0039b946}}}, + {X: Field{[10]uint32{0x022a5aa3, 0x0330fedc, 0x01d96a67, 0x0315ac84, 0x02f7e12d, 0x0235a7d6, 0x0150b68a, 0x032257cc, 0x03b92ac1, 0x0017725d}}, Y: Field{[10]uint32{0x0107844d, 0x0342e567, 0x0217d10f, 0x00d0d040, 0x0283260c, 0x0331a5b4, 0x03d29123, 0x03b27872, 0x00a74bf1, 0x00116223}}}, + {X: Field{[10]uint32{0x03d15764, 0x006a078f, 0x022b0c6e, 0x035f418e, 0x00605e3b, 0x00000e49, 0x030cb6df, 0x03c492a6, 0x0134ca94, 0x0016e73d}}, Y: Field{[10]uint32{0x00897458, 0x006f2f00, 0x03d1d0d8, 0x01233a22, 0x03f9ba4b, 0x0282cb59, 0x0248790f, 0x01bffaf6, 0x01c3b051, 0x00113a63}}}, + {X: Field{[10]uint32{0x01372f59, 0x035ffdb5, 0x00a6697f, 0x02c25d1b, 0x02e2feb4, 0x022578b7, 0x026baf9c, 0x01c531f4, 0x00073a63, 0x00210d4c}}, Y: Field{[10]uint32{0x00c7a175, 0x00fcda2c, 0x022d23ca, 0x01f209b1, 0x023f9fea, 0x03cbcd14, 0x037361c0, 0x02751132, 0x029e3768, 0x0035cdce}}}, + {X: Field{[10]uint32{0x021e6a61, 0x000c3eb0, 0x02619804, 0x037fe1d1, 0x008f1a28, 0x00e09b9e, 0x008485fc, 0x026d7227, 0x000e3eef, 0x00273c00}}, Y: Field{[10]uint32{0x0291543c, 0x0184bdff, 0x020a1ac2, 0x01daaa47, 0x002764cd, 0x00801708, 0x021fcb9d, 0x012cb653, 0x033ad868, 0x000acf6a}}}, + {X: Field{[10]uint32{0x00e1235c, 0x01c68913, 0x035e9996, 0x014e0ebf, 0x038ee028, 0x012469d5, 0x0088b25b, 0x00623882, 0x03dc5897, 0x002eca4b}}, Y: Field{[10]uint32{0x012507e5, 0x00bd6690, 0x023a09e0, 0x03dc9f86, 0x00d5e9b8, 0x01624cd2, 0x03839909, 0x01e18ef2, 0x01c350ba, 0x0034edb6}}}, + {X: Field{[10]uint32{0x03b7d680, 0x01c32403, 0x01ced2d7, 0x01afc9f1, 0x03efd2bc, 0x008e6d88, 0x008a21a9, 0x03b55daa, 0x01d89835, 0x002575b4}}, Y: Field{[10]uint32{0x00baf048, 0x02ff819b, 0x02468e40, 0x00e31cb3, 0x02b39e7d, 0x03cf39a4, 0x034ac720, 0x01973bea, 0x01ad39db, 0x0032454d}}}, + {X: Field{[10]uint32{0x01d09a46, 0x01428ea1, 0x00fd89ee, 0x021f7cb2, 0x0115ea37, 0x00328325, 0x02c3fb90, 0x03b08270, 0x020fa164, 0x0032f8fc}}, Y: Field{[10]uint32{0x02fb9a28, 0x00bbfe42, 0x00e8b825, 0x01469962, 0x01734a22, 0x0061b9bb, 0x02222804, 0x00596d23, 0x0354faea, 0x00335625}}}, + {X: Field{[10]uint32{0x039f604a, 0x0278a4ec, 0x020949f3, 0x03d121f5, 0x01002942, 0x0299e0d7, 0x031c215b, 0x02788166, 0x02b99bab, 0x000f8076}}, Y: Field{[10]uint32{0x0123d481, 0x0172d7a1, 0x022670bd, 0x03e7a2da, 0x00d0a556, 0x019e7cfa, 0x03509798, 0x014113b8, 0x00323336, 0x002d0777}}}, + {X: Field{[10]uint32{0x02afef7a, 0x004e991d, 0x03350972, 0x0238578f, 0x01c79891, 0x012d8cc7, 0x031cfd2e, 0x03725857, 0x00c05543, 0x000a625d}}, Y: Field{[10]uint32{0x0299da2f, 0x0360181e, 0x0257de5c, 0x028d8b2d, 0x0222354e, 0x011fd82c, 0x00e02e87, 0x0362fa9d, 0x035555f2, 0x001a0060}}}, + {X: Field{[10]uint32{0x011fdc61, 0x019e4fd4, 0x003dfd93, 0x0322824f, 0x022aabde, 0x0107453d, 0x03764b46, 0x00f25ba8, 0x034d5476, 0x00075c19}}, Y: Field{[10]uint32{0x00dfe632, 0x03ad2f8e, 0x0010e8a4, 0x000588f7, 0x02807741, 0x025d4fd0, 0x024378e5, 0x0112f18c, 0x01ac697e, 0x00259d2b}}}, + {X: Field{[10]uint32{0x000fece1, 0x02c713c1, 0x00fbacc0, 0x02be46ae, 0x0073c47a, 0x023e2d8d, 0x021875ec, 0x02e5c189, 0x0107b43a, 0x001d4880}}, Y: Field{[10]uint32{0x03aeaffb, 0x01580ba8, 0x00b7b088, 0x035670d4, 0x0041bc9a, 0x02d5bbee, 0x02ebf2bf, 0x001f404a, 0x027cc3bf, 0x000a4253}}}, + {X: Field{[10]uint32{0x03779720, 0x039e4883, 0x03df92e7, 0x0232743b, 0x03fc7f4c, 0x002eb20e, 0x01b31aab, 0x013b0c9f, 0x01ffb347, 0x0033eb6e}}, Y: Field{[10]uint32{0x019a09b2, 0x002e64c3, 0x00b06ab0, 0x001b34ae, 0x0297d418, 0x02a67ea0, 0x0322ee02, 0x023315e3, 0x017f6f7b, 0x003fedd9}}}, + {X: Field{[10]uint32{0x01cb828f, 0x03a2daf0, 0x026f464c, 0x03d35ee0, 0x0334a7b4, 0x027612a9, 0x02e46e13, 0x01580eb7, 0x019dbe3c, 0x00093ba4}}, Y: Field{[10]uint32{0x03ff1506, 0x0297a985, 0x03e29364, 0x01dbb55f, 0x01ca6514, 0x00e6e3c4, 0x020b63c5, 0x0151ee4d, 0x0356794b, 0x001100e5}}}, + {X: Field{[10]uint32{0x00b100f4, 0x00c3bfdf, 0x011dd1b5, 0x014ff90e, 0x00c50ddb, 0x02972fbb, 0x016b8f10, 0x01495bd3, 0x02462f75, 0x00166578}}, Y: Field{[10]uint32{0x001dc64a, 0x005875b6, 0x0018ce08, 0x01ac4f74, 0x03fe78ac, 0x010049ff, 0x02d7ba20, 0x01459711, 0x027c7da0, 0x001df776}}}, + {X: Field{[10]uint32{0x034d54dd, 0x035470c8, 0x019c29db, 0x00dc073c, 0x00364f8c, 0x02464f02, 0x029fa205, 0x011e3384, 0x007197dd, 0x0029c8cd}}, Y: Field{[10]uint32{0x01796e68, 0x00bbbc4c, 0x019ad92f, 0x00446874, 0x009cfdd7, 0x006a5999, 0x00a5fa00, 0x00b32ce1, 0x015eec2b, 0x000b139a}}}, + {X: Field{[10]uint32{0x032251a5, 0x015b3404, 0x01c234ed, 0x0358eb50, 0x01a57cfe, 0x037a7f32, 0x0275fcc5, 0x00872f5f, 0x0369d5bc, 0x001919aa}}, Y: Field{[10]uint32{0x01294dc9, 0x0037e909, 0x005d2099, 0x033f12bc, 0x022e0c1e, 0x03da2536, 0x0222f5e5, 0x005b89d9, 0x03896dbb, 0x001db9fb}}}, + {X: Field{[10]uint32{0x01c28e60, 0x02b3683d, 0x014f11e0, 0x02d478cf, 0x017fab8b, 0x03c85851, 0x02fca2ab, 0x0222af79, 0x0390a293, 0x00297b33}}, Y: Field{[10]uint32{0x020e3ac3, 0x0016c998, 0x023f7948, 0x038b2044, 0x03110e74, 0x019a42b7, 0x02886435, 0x0047cdcf, 0x0116468a, 0x002bf5d6}}}, + {X: Field{[10]uint32{0x029c2779, 0x03561c7b, 0x01cdf89e, 0x01813472, 0x006a15d0, 0x00fb6796, 0x02e52a1e, 0x01e367c9, 0x02c74936, 0x0010946e}}, Y: Field{[10]uint32{0x02987aa5, 0x016b62dc, 0x0138d3a1, 0x032437fe, 0x004bb023, 0x01980ef3, 0x0190c60e, 0x01c5b5da, 0x027d92e6, 0x003e877c}}}, + {X: Field{[10]uint32{0x027db30e, 0x00b0a93e, 0x01903f04, 0x03409aa0, 0x030f40c9, 0x006078a0, 0x00f6b973, 0x03308763, 0x02a204c3, 0x001dea79}}, Y: Field{[10]uint32{0x00155aa0, 0x00f79746, 0x03180b6e, 0x0041cacb, 0x03e78d93, 0x02a84333, 0x01b757fa, 0x017336f7, 0x03ef23f2, 0x00287bd3}}}, + {X: Field{[10]uint32{0x03dbea6b, 0x007fdf9b, 0x0239de75, 0x003a667d, 0x02e9c0d2, 0x015dfe8a, 0x02de73c4, 0x01386f5a, 0x0161c40d, 0x000cff9e}}, Y: Field{[10]uint32{0x01f54849, 0x0102e335, 0x03037058, 0x0251c8ca, 0x039a5919, 0x01930c33, 0x016e7c14, 0x00c1b38c, 0x01cd4eeb, 0x00246df5}}}, + {X: Field{[10]uint32{0x01179564, 0x02085c3e, 0x003115b6, 0x00054927, 0x03395357, 0x01216f8b, 0x00a9d8cb, 0x00884692, 0x032e5ee5, 0x0010fd9a}}, Y: Field{[10]uint32{0x01a46a45, 0x03de1d0b, 0x028921db, 0x0265ca39, 0x003555e6, 0x018fd7e2, 0x030cf7fe, 0x03aefc30, 0x015ffec0, 0x0014dc2d}}}, + {X: Field{[10]uint32{0x00b19bfc, 0x0116db0e, 0x0170e1a7, 0x010dcfd6, 0x03ad2f0b, 0x011baa1e, 0x00c7f6b4, 0x0041d35d, 0x021497ef, 0x0012b4d9}}, Y: Field{[10]uint32{0x035cfd39, 0x0133583b, 0x03cfc0cd, 0x0208ca7a, 0x036f9eea, 0x00dbe143, 0x02da00d4, 0x016ff57a, 0x01aa769a, 0x0023d770}}}, + {X: Field{[10]uint32{0x0012754d, 0x035654f0, 0x012f9155, 0x019a6cbc, 0x02593368, 0x016de5ea, 0x0334dc97, 0x013553cd, 0x02ef9520, 0x0025e66a}}, Y: Field{[10]uint32{0x003e6353, 0x016a1d7a, 0x02f3a984, 0x03b3a88d, 0x0044c256, 0x03124b55, 0x025b476b, 0x0385cd0e, 0x00a3d31f, 0x0012dacd}}}, + {X: Field{[10]uint32{0x01d828a1, 0x03275045, 0x00dca0fb, 0x0145be6a, 0x03c1c22f, 0x0038d759, 0x003f2525, 0x018d70b4, 0x01f0c6e4, 0x00321892}}, Y: Field{[10]uint32{0x0295ec73, 0x026519fb, 0x0102586d, 0x024d1a7c, 0x02465238, 0x012f1dac, 0x01260b39, 0x013437d3, 0x030b37dc, 0x0003885d}}}, + {X: Field{[10]uint32{0x0256038d, 0x03370b99, 0x0308e3ac, 0x039824be, 0x0061a08f, 0x033f5018, 0x0282c840, 0x021fbf1c, 0x00c5de56, 0x002d237f}}, Y: Field{[10]uint32{0x00e8927c, 0x02db467f, 0x01566277, 0x0254deb4, 0x01c0b52a, 0x01c51d99, 0x0369c7bc, 0x01c1d1c7, 0x021fec73, 0x00021f8f}}}, + {X: Field{[10]uint32{0x02357fca, 0x000ff353, 0x02da8585, 0x0134d9cc, 0x030146fa, 0x034e0da8, 0x025c828f, 0x0154d718, 0x036c62d6, 0x001df73a}}, Y: Field{[10]uint32{0x00228bd4, 0x00747a86, 0x0367e909, 0x02321fee, 0x024304d0, 0x034dc3b4, 0x01b85213, 0x025c4d49, 0x02005a13, 0x003642c9}}}, + {X: Field{[10]uint32{0x0175e49a, 0x0191d40c, 0x01c17473, 0x00f8ccbd, 0x0069cfb4, 0x0331c2b2, 0x031cd633, 0x00061137, 0x00bf4cda, 0x0016d623}}, Y: Field{[10]uint32{0x02d55cda, 0x022432be, 0x017c0d47, 0x01e11d1a, 0x01a52e19, 0x03e57f39, 0x02b823b2, 0x02792a13, 0x031df9e6, 0x0005093b}}}, + {X: Field{[10]uint32{0x0320b20c, 0x001da164, 0x003b7da1, 0x02944711, 0x032c50ce, 0x03277764, 0x00702518, 0x01082023, 0x03ba8393, 0x003021ee}}, Y: Field{[10]uint32{0x0209d996, 0x00881ee4, 0x02b5f6ec, 0x00f1faf0, 0x00f637c2, 0x032f92cc, 0x030e3455, 0x0157cec0, 0x02697175, 0x001dfc9a}}}, + {X: Field{[10]uint32{0x0031ed94, 0x011d304c, 0x02a3835e, 0x0183c45f, 0x00247d7d, 0x030b1563, 0x00b3e7cf, 0x0020bc82, 0x017b68f8, 0x00234581}}, Y: Field{[10]uint32{0x02ba3eca, 0x01442475, 0x0314fed5, 0x029fbb1a, 0x016ffb8c, 0x02710e78, 0x00f6e0d1, 0x0344f440, 0x01b662ff, 0x000f4c17}}}, + {X: Field{[10]uint32{0x01c184b7, 0x03f7307b, 0x019d9242, 0x02597878, 0x03d17daa, 0x03dcdc7f, 0x03b8cd2a, 0x00af21b6, 0x00a603d3, 0x001d7fb8}}, Y: Field{[10]uint32{0x03efa2f8, 0x03f71924, 0x0040910b, 0x027a6810, 0x01061ee8, 0x020245e5, 0x03c992ff, 0x0025d7f9, 0x00ffabc3, 0x0030ac79}}}, + {X: Field{[10]uint32{0x03368abb, 0x0170789b, 0x007a110d, 0x01d51839, 0x02dda7fb, 0x02a1dc42, 0x00925990, 0x0024f5f4, 0x0159b147, 0x0019768e}}, Y: Field{[10]uint32{0x01862844, 0x01171708, 0x03ce95e3, 0x00a32eb8, 0x00a6f530, 0x0268c08c, 0x032b463d, 0x0307870f, 0x01f52f92, 0x000d6678}}}, + {X: Field{[10]uint32{0x027933d3, 0x0102dbe5, 0x03f4df81, 0x016fd101, 0x005dda1a, 0x01d4e61c, 0x02b787ca, 0x0084975d, 0x00109463, 0x0019587f}}, Y: Field{[10]uint32{0x020e6337, 0x02a6d564, 0x01ad629f, 0x00ddb4e8, 0x02cd083f, 0x02dba200, 0x02e8aeca, 0x00a0a0fa, 0x03cea88e, 0x001301b1}}}, + {X: Field{[10]uint32{0x00c4410e, 0x0179e920, 0x016a35ca, 0x00c19993, 0x03c8a3fc, 0x02748cd0, 0x03041a6a, 0x00dc0548, 0x03807049, 0x0032694f}}, Y: Field{[10]uint32{0x036e4bf9, 0x01128882, 0x02d42183, 0x02b7c8d9, 0x02369d4d, 0x038ec9cd, 0x02f0dd06, 0x003517af, 0x00a9b2e3, 0x0026bd1c}}}, + {X: Field{[10]uint32{0x03b89158, 0x00d165cc, 0x03bf03c7, 0x00517d5d, 0x00c203f8, 0x02e68550, 0x009f45a1, 0x015b76c0, 0x01f3443e, 0x00170549}}, Y: Field{[10]uint32{0x034f4f18, 0x00d24efa, 0x03c02f5b, 0x03eb2e67, 0x0358574a, 0x01895c1e, 0x00f4c803, 0x03646b5d, 0x02f7cb3e, 0x00259e24}}}, + {X: Field{[10]uint32{0x001648ed, 0x024e72d5, 0x01454d69, 0x02a5d7d8, 0x0269bb6e, 0x01cbfb83, 0x00add6d4, 0x005c75c5, 0x00dad87c, 0x000d5973}}, Y: Field{[10]uint32{0x0062aef8, 0x01a8b64d, 0x014edd48, 0x029daa35, 0x034f02d3, 0x00022c65, 0x03d09bbd, 0x018d6176, 0x03bfec2b, 0x0027df61}}}, + {X: Field{[10]uint32{0x010e3614, 0x03799847, 0x01edabd8, 0x03744e2d, 0x004527d3, 0x00a85297, 0x00f29df4, 0x0386a2bf, 0x0334c0f5, 0x001000fb}}, Y: Field{[10]uint32{0x003048c4, 0x0131a093, 0x00e2cd3c, 0x003cd85d, 0x033d3ead, 0x0160e70b, 0x03d0a763, 0x0133bf30, 0x01524489, 0x0019c80c}}}, + {X: Field{[10]uint32{0x012ea57f, 0x01574764, 0x013931cf, 0x0088024a, 0x02138864, 0x02d25689, 0x03b7de39, 0x0141e4fa, 0x035b3796, 0x003d7137}}, Y: Field{[10]uint32{0x01eb3482, 0x0011f80c, 0x02968f30, 0x0295f4c6, 0x03aca34d, 0x028d8434, 0x03672c74, 0x02331168, 0x003e12a9, 0x002c2e4f}}}, + {X: Field{[10]uint32{0x029e213a, 0x0259e4d5, 0x010b397a, 0x0239a73b, 0x01cbe869, 0x019600a2, 0x023533e5, 0x021b36e9, 0x0280e211, 0x0002f27d}}, Y: Field{[10]uint32{0x032e06a3, 0x004fea6c, 0x01d72007, 0x03d6e478, 0x017bf54e, 0x01f48137, 0x03b94ff8, 0x01463543, 0x03788105, 0x001ab7fe}}}, + {X: Field{[10]uint32{0x01a16516, 0x02674ab2, 0x006b055f, 0x011d39c1, 0x01549e83, 0x028f8988, 0x03e15d37, 0x02204514, 0x0397f1fe, 0x001373a1}}, Y: Field{[10]uint32{0x03e668ea, 0x0381d52a, 0x01d4337c, 0x02a1d26a, 0x02fc8a8a, 0x035c35ec, 0x00fd9f37, 0x02096a57, 0x0377cca7, 0x003a979a}}}, + {X: Field{[10]uint32{0x0359b16b, 0x01a74fa5, 0x01eee818, 0x02149944, 0x02af2a4f, 0x000024e0, 0x032a0c04, 0x0255c2f5, 0x02ba1ef2, 0x003d26d6}}, Y: Field{[10]uint32{0x017c7f7d, 0x02391675, 0x01202865, 0x010ed060, 0x021d2fb3, 0x0182af19, 0x02125d0f, 0x03a349a5, 0x0020b996, 0x000b925b}}}, + {X: Field{[10]uint32{0x012125ec, 0x006fb902, 0x03fa054a, 0x001df5f5, 0x00a2d02f, 0x00afca52, 0x00ff7657, 0x038749ed, 0x014a7573, 0x0009a45f}}, Y: Field{[10]uint32{0x03cd8f97, 0x0173a0c1, 0x006780ad, 0x00c02986, 0x017eb125, 0x03e32232, 0x02fd2d5c, 0x019a80a9, 0x037eae9b, 0x002e391f}}}, + {X: Field{[10]uint32{0x0329d290, 0x03eab53e, 0x03cb1cd7, 0x01bb3e2e, 0x007ead77, 0x0084f9b6, 0x00b71daf, 0x00bf9263, 0x00d6285a, 0x0006d252}}, Y: Field{[10]uint32{0x00d3bfd8, 0x00306d09, 0x0227bdd3, 0x0266cbd7, 0x00d56984, 0x00b4a186, 0x0336c7a9, 0x0364966d, 0x001fef87, 0x0006ad02}}}, + {X: Field{[10]uint32{0x01ae64ca, 0x022f55e6, 0x036c7725, 0x03d29a58, 0x00f8b20f, 0x02a6594f, 0x019676fe, 0x02ebde77, 0x02ec8179, 0x000535c4}}, Y: Field{[10]uint32{0x000c6ef0, 0x01b8138e, 0x03ad6d36, 0x00e14eeb, 0x0006f385, 0x01cb38fc, 0x030df37d, 0x0143b0ca, 0x00a64246, 0x000b876e}}}, + {X: Field{[10]uint32{0x01952453, 0x01a53dc7, 0x038134d9, 0x02222d6f, 0x03a11119, 0x01111644, 0x01967e15, 0x01da1278, 0x02204174, 0x0001d9d4}}, Y: Field{[10]uint32{0x0182fd31, 0x01da10fb, 0x01c27377, 0x00f58253, 0x00de1a5c, 0x029c8b79, 0x0155a906, 0x02d80ce8, 0x00636457, 0x000fc7ec}}}, + {X: Field{[10]uint32{0x0149fc63, 0x012e8d37, 0x00937fc8, 0x01be5ac9, 0x020a53b1, 0x002ec789, 0x0016d028, 0x022d9d00, 0x0134a882, 0x0016b239}}, Y: Field{[10]uint32{0x00a1fc73, 0x03881bae, 0x0187a8e5, 0x021c457a, 0x0018568f, 0x0242739c, 0x005a4296, 0x03edec0b, 0x020f68f5, 0x00064f40}}}, + {X: Field{[10]uint32{0x034a14b8, 0x00880b6a, 0x02c43337, 0x0375ab3d, 0x02d618d0, 0x0064d127, 0x01135b60, 0x0158a94c, 0x02b28d16, 0x0021f377}}, Y: Field{[10]uint32{0x03846e2e, 0x01a32ea7, 0x0084be5b, 0x009404d7, 0x01cd7094, 0x038ba44a, 0x011cecbd, 0x022b6650, 0x00e67c95, 0x00170779}}}, + {X: Field{[10]uint32{0x024c84cb, 0x01de2810, 0x02d52f8c, 0x01fbac35, 0x004d4f8b, 0x03ea198c, 0x021dfe7a, 0x03427d23, 0x0225a39e, 0x00310c72}}, Y: Field{[10]uint32{0x0100d825, 0x02b8299c, 0x034292ae, 0x035b8d7f, 0x00489ede, 0x00c4a4cc, 0x00f2d11d, 0x02f9b4d7, 0x03d65b2d, 0x00114181}}}, + {X: Field{[10]uint32{0x00a3dd5a, 0x03cda0e2, 0x02c1d9bf, 0x000970bc, 0x03aaa930, 0x003b7128, 0x03af3d44, 0x0068452f, 0x01e8985c, 0x00231408}}, Y: Field{[10]uint32{0x012fb108, 0x02d82aa8, 0x01db13c2, 0x02bb50c5, 0x02b6d31f, 0x0025bf52, 0x01d74ba6, 0x0360701c, 0x00aa8077, 0x00132e58}}}, + {X: Field{[10]uint32{0x02513d4f, 0x0275c5db, 0x01bb770b, 0x012c99e0, 0x0306e7a1, 0x005df6ef, 0x017c07a0, 0x01d21630, 0x00bb38a4, 0x000ce395}}, Y: Field{[10]uint32{0x00420548, 0x02033e31, 0x026fb92f, 0x03554bb9, 0x02c44a6a, 0x019dd8ee, 0x02951def, 0x033e9308, 0x024e84ca, 0x001e1dab}}}, + {X: Field{[10]uint32{0x031f3c5a, 0x01bba34b, 0x0061bcb0, 0x0385fbfd, 0x013c7b0f, 0x03349a2b, 0x03683abc, 0x00e88645, 0x00a9efbb, 0x0021fcef}}, Y: Field{[10]uint32{0x01229b61, 0x028cfb55, 0x007f8361, 0x03c6845f, 0x00e5cc11, 0x03d7eef2, 0x001f258b, 0x03f15122, 0x02a1eccc, 0x0029e874}}}, + {X: Field{[10]uint32{0x013a3e40, 0x001eeed0, 0x01aad524, 0x037119f2, 0x00de27d6, 0x029a9e36, 0x016a0375, 0x01615a39, 0x03df8ed8, 0x0003d008}}, Y: Field{[10]uint32{0x03e178cc, 0x03e7da87, 0x001615cf, 0x0114f89d, 0x03d5e2c5, 0x03567cdc, 0x0230e566, 0x00e845aa, 0x0142fc4e, 0x002c9264}}}, + {X: Field{[10]uint32{0x006f2d3a, 0x00215927, 0x001a8927, 0x00bcdd38, 0x03453b51, 0x0398ecbe, 0x013d282f, 0x02288a27, 0x03c6d55a, 0x0033ed47}}, Y: Field{[10]uint32{0x0070635d, 0x01ffa724, 0x0125eb56, 0x004872c9, 0x03e4ea53, 0x01879874, 0x02c120e7, 0x0047b4a3, 0x02232838, 0x0023528c}}}, + {X: Field{[10]uint32{0x0243c539, 0x01f3a5ab, 0x00486893, 0x02c45c87, 0x01c45f77, 0x0089258d, 0x03219db2, 0x00051c2f, 0x020b9705, 0x00166912}}, Y: Field{[10]uint32{0x03039afa, 0x0364c781, 0x00efd158, 0x01644ddd, 0x02400ff9, 0x017ae29d, 0x021d0cd5, 0x003cfc77, 0x00a66a91, 0x0000c787}}}, + {X: Field{[10]uint32{0x00a8ee7e, 0x015c3a0a, 0x0386f8ab, 0x01cc67f5, 0x02d8e26d, 0x012ecea3, 0x03446281, 0x01e8ddaa, 0x0256ec27, 0x002e673b}}, Y: Field{[10]uint32{0x023494ad, 0x02c44d70, 0x0223062a, 0x00c74773, 0x00b6be5d, 0x01360305, 0x013b16ab, 0x017535c9, 0x0398dda0, 0x0011b83c}}}, + {X: Field{[10]uint32{0x01172bd2, 0x001eb403, 0x03cb0252, 0x00ad4a51, 0x001c6b92, 0x0369d6ce, 0x00398725, 0x006889b4, 0x036ad96b, 0x0028e784}}, Y: Field{[10]uint32{0x02abb532, 0x00286e6d, 0x023a2d91, 0x01de2bc6, 0x007dbfc9, 0x0258e7ea, 0x010fa717, 0x038238f4, 0x0358074d, 0x001e9701}}}, + {X: Field{[10]uint32{0x03001976, 0x02365d15, 0x039c45b4, 0x0154d7d1, 0x032c23c8, 0x02dd44ad, 0x02dd59ae, 0x02dd3989, 0x01253b2e, 0x001ba2d0}}, Y: Field{[10]uint32{0x012bc88e, 0x02667a33, 0x02b47873, 0x020bb086, 0x020715bc, 0x032e16a8, 0x0004068a, 0x0301157a, 0x00e1e4e8, 0x003302e2}}}, + {X: Field{[10]uint32{0x01abb019, 0x0111e294, 0x024189c4, 0x01bc7263, 0x03cd1fb6, 0x03bf44d0, 0x03b6ec98, 0x010627df, 0x02f5681e, 0x002650ad}}, Y: Field{[10]uint32{0x010e7a9a, 0x01459e63, 0x02430569, 0x01afb499, 0x02d2fe98, 0x01f26278, 0x0211e6ff, 0x00b54a42, 0x02bbb0cc, 0x00080343}}}, + {X: Field{[10]uint32{0x0078506d, 0x0383df94, 0x01744642, 0x03dcbabf, 0x02759636, 0x0122bcd4, 0x0166918b, 0x02e52510, 0x01ec3c57, 0x001ff738}}, Y: Field{[10]uint32{0x03baabd2, 0x004e8ab5, 0x0146b2e3, 0x01e5974f, 0x0353cfb9, 0x038b4b39, 0x03786ed1, 0x01db8dce, 0x02efc19a, 0x0035de16}}}, + {X: Field{[10]uint32{0x03989c57, 0x035381a4, 0x01b04a70, 0x01362065, 0x035f5165, 0x01df1e6a, 0x030906bd, 0x020fc3c5, 0x005c958c, 0x001bc4c8}}, Y: Field{[10]uint32{0x03b55ee0, 0x023c4fdc, 0x02c99e84, 0x02655445, 0x01033deb, 0x0254368d, 0x028d4f1c, 0x03920ec9, 0x015bb386, 0x0022b268}}}, + {X: Field{[10]uint32{0x0297654e, 0x03352d8d, 0x007e6e50, 0x013d6d09, 0x03cd405f, 0x0137fefe, 0x00a0665f, 0x01a6f810, 0x035d833c, 0x003e5568}}, Y: Field{[10]uint32{0x03c9ee44, 0x03e93d62, 0x0183e4e2, 0x02c9f686, 0x00f56e80, 0x0103acdf, 0x02f2407f, 0x020e2692, 0x03ce2246, 0x00227d3e}}}, + {X: Field{[10]uint32{0x02248007, 0x03edaa09, 0x00132e65, 0x0346248e, 0x010b58b8, 0x037e5e63, 0x02257431, 0x011a8d0a, 0x012d6196, 0x0036f345}}, Y: Field{[10]uint32{0x02d8ba13, 0x02d34d8c, 0x01dcec02, 0x038f4086, 0x03e57d23, 0x039a0c3d, 0x0025e9e2, 0x023f4f91, 0x017ec194, 0x0019be9c}}}, + {X: Field{[10]uint32{0x026e8ebe, 0x03a854d7, 0x035cc71e, 0x02ca2cd6, 0x0399f713, 0x00b9e54f, 0x03cfb1da, 0x02427eb1, 0x00e8e57b, 0x003c6baf}}, Y: Field{[10]uint32{0x01d9d516, 0x03d842f9, 0x0157e1b7, 0x0365617f, 0x0288b0bf, 0x00b93d65, 0x01c24d09, 0x0396a983, 0x02143e77, 0x0021d57e}}}, + {X: Field{[10]uint32{0x00b55187, 0x01b92281, 0x005f5fef, 0x016a4754, 0x01c002bc, 0x0010c241, 0x01ceab65, 0x0212ffe2, 0x024d941f, 0x00288085}}, Y: Field{[10]uint32{0x02f057ff, 0x00ecfbf0, 0x004c1bee, 0x0256b7a2, 0x01b6d4b0, 0x02e6f393, 0x0172e978, 0x01a2d479, 0x002b2bc2, 0x00038335}}}, + {X: Field{[10]uint32{0x028ad68a, 0x01011f72, 0x02861e78, 0x02942009, 0x02b1344d, 0x021fe2e6, 0x000eccb2, 0x039f7a52, 0x025746fd, 0x0015cb85}}, Y: Field{[10]uint32{0x01eb5d9f, 0x01a585cc, 0x01170475, 0x01ac283f, 0x0239eda8, 0x00176b5d, 0x02461eb4, 0x02aed234, 0x01e7c066, 0x00305d2b}}}, + {X: Field{[10]uint32{0x03eba31d, 0x0333a696, 0x00dac58a, 0x03296799, 0x00b67047, 0x01db927a, 0x00b1052b, 0x035d4f02, 0x0107fee4, 0x003d38b2}}, Y: Field{[10]uint32{0x0011c42c, 0x02fe1c4b, 0x030f8f41, 0x00d09201, 0x032b76d1, 0x02a3fa25, 0x00b8317c, 0x034b6392, 0x022d3a92, 0x002c90ea}}}, + {X: Field{[10]uint32{0x01f06dd5, 0x0258e97f, 0x00463e06, 0x0207c934, 0x02266987, 0x01a2026c, 0x029e436d, 0x015c5bd7, 0x02ec8445, 0x0029bf1a}}, Y: Field{[10]uint32{0x0018ca8d, 0x02402a86, 0x013d5073, 0x013a4614, 0x00a96b7f, 0x01d2367c, 0x02135fdf, 0x03f461ab, 0x0215548e, 0x003705a9}}}, + {X: Field{[10]uint32{0x0205f026, 0x03378b56, 0x009bcc00, 0x033ac133, 0x00c4ffb3, 0x00dfcb2f, 0x00d8eec9, 0x02594a73, 0x00175fde, 0x002f601a}}, Y: Field{[10]uint32{0x00a26216, 0x008a2cd9, 0x03f76bce, 0x01d1454a, 0x02db0482, 0x02daf771, 0x03e6a0d8, 0x010ca383, 0x02e78e01, 0x002c9e46}}}, + {X: Field{[10]uint32{0x000165ef, 0x021b74d7, 0x0251e163, 0x02c8e976, 0x032d8614, 0x032b9ae3, 0x015e810e, 0x00f482e7, 0x02676f8c, 0x003e2229}}, Y: Field{[10]uint32{0x009a0dea, 0x00f6b724, 0x0223942a, 0x014f7890, 0x03579788, 0x031ec7ae, 0x034bfe39, 0x03cfbfdb, 0x020fe429, 0x003ed3b8}}}, + {X: Field{[10]uint32{0x009ae200, 0x0221df10, 0x02fd23ba, 0x039af69d, 0x01c3182e, 0x034583f3, 0x01023a48, 0x02a9c7b2, 0x02055adb, 0x001f2347}}, Y: Field{[10]uint32{0x03907ceb, 0x0385d90b, 0x00524f16, 0x0293cb23, 0x01c489b9, 0x033a0dde, 0x02936f4f, 0x01548f65, 0x020bec59, 0x00228ee0}}}, + {X: Field{[10]uint32{0x02fabf43, 0x00539d89, 0x0159e75c, 0x02dd48a6, 0x026dfd9b, 0x024eebdc, 0x00ccd715, 0x01c48184, 0x02a4ee25, 0x0006221b}}, Y: Field{[10]uint32{0x0091531d, 0x026361b8, 0x01d31ffa, 0x0210e622, 0x02898a31, 0x01f40ade, 0x033ad3f0, 0x01a2c034, 0x0295f570, 0x00099b19}}}, + {X: Field{[10]uint32{0x03e52cba, 0x03f73e9a, 0x009a3184, 0x0265419e, 0x011242a0, 0x02b00dae, 0x039a44ec, 0x02b6f4cc, 0x031e38c8, 0x003fa9c3}}, Y: Field{[10]uint32{0x039e7915, 0x009bb38e, 0x0046883e, 0x00bf5d17, 0x02076c0e, 0x00d99c2d, 0x0058093a, 0x0306e777, 0x01f50ba8, 0x00277fdb}}}, + {X: Field{[10]uint32{0x03d1365a, 0x0312d28d, 0x00c8fb1d, 0x01eff908, 0x0096dcbf, 0x01e5146e, 0x0199142e, 0x00f241db, 0x038945aa, 0x001378c0}}, Y: Field{[10]uint32{0x0287cba4, 0x0193b634, 0x0316d356, 0x02884ec2, 0x03992ac0, 0x0006ccdd, 0x001eb2e2, 0x03799090, 0x029e9093, 0x0033b9d3}}}, + {X: Field{[10]uint32{0x02104fb2, 0x02220c06, 0x03da3739, 0x01adad6f, 0x028c2d8e, 0x03040a60, 0x03b8c401, 0x02f9e718, 0x01d1eafe, 0x0019f427}}, Y: Field{[10]uint32{0x01360a5f, 0x03ea96ef, 0x0098461f, 0x016367cb, 0x00d4f035, 0x0063e26f, 0x019049e8, 0x00365a3a, 0x01089266, 0x00043ad5}}}, + {X: Field{[10]uint32{0x00e6010f, 0x03f75dd0, 0x01b5af5f, 0x03d3fe8c, 0x01325e55, 0x01c0c735, 0x0396d4d8, 0x00d3e34e, 0x00fe1868, 0x000ad75c}}, Y: Field{[10]uint32{0x0095ed02, 0x029351ea, 0x03b1f7bd, 0x024327d4, 0x00384398, 0x02c8206d, 0x031f54af, 0x028dcde2, 0x025324d2, 0x00191b9f}}}, + {X: Field{[10]uint32{0x017be248, 0x03d8b7f8, 0x00752527, 0x008f2893, 0x005d600b, 0x02bb42b4, 0x03f7b446, 0x029db064, 0x02998700, 0x0032d098}}, Y: Field{[10]uint32{0x0019a8b6, 0x03a4e796, 0x006e65ac, 0x01413086, 0x03bcfd02, 0x03339dc8, 0x01f74eb8, 0x01832439, 0x0213f3eb, 0x0024a10f}}}, + {X: Field{[10]uint32{0x018e4e41, 0x00137b50, 0x00d25f9b, 0x014ff638, 0x0322d0b8, 0x039b7a22, 0x01ce4d01, 0x02f15c4d, 0x037e75b3, 0x000fb9aa}}, Y: Field{[10]uint32{0x034bcc87, 0x0154da06, 0x027689ad, 0x013da03b, 0x006ee1ab, 0x00cfd480, 0x01b6afc9, 0x01466e4c, 0x03984e52, 0x001a720f}}}, + {X: Field{[10]uint32{0x0087e7be, 0x010217f2, 0x01724e90, 0x031ca8e1, 0x016918ac, 0x005f5e0a, 0x0232df6f, 0x01450c5c, 0x00b0a95a, 0x00160ddd}}, Y: Field{[10]uint32{0x007c3e7b, 0x01cdaaa0, 0x0042418c, 0x03f8542d, 0x03f8f047, 0x019970d4, 0x00160730, 0x033c5cc3, 0x02660ee8, 0x000ceec7}}}, + {X: Field{[10]uint32{0x0079dc1a, 0x020e381c, 0x03fcb0a8, 0x000269e8, 0x03eb3341, 0x02990fa8, 0x0082b772, 0x009e1de4, 0x01ef3982, 0x002bccb8}}, Y: Field{[10]uint32{0x0295fd4c, 0x027b2dd3, 0x037f8b3a, 0x00c792d2, 0x03169383, 0x0068d9a5, 0x02ee7e8b, 0x0048f9ce, 0x028dc660, 0x001a6178}}}, + {X: Field{[10]uint32{0x0034d0c4, 0x02b705b8, 0x03f9c948, 0x02737aae, 0x0150f724, 0x03eff0fd, 0x020c740e, 0x01d5466d, 0x03dd3266, 0x001bb7df}}, Y: Field{[10]uint32{0x02f46026, 0x01144f43, 0x016d40bb, 0x0052edf6, 0x0164534f, 0x02c249a4, 0x030de819, 0x01f69d7e, 0x03185def, 0x003c2317}}}, + {X: Field{[10]uint32{0x01f16b42, 0x00293c00, 0x01f0072a, 0x0182cff6, 0x0086257a, 0x02060878, 0x0104120a, 0x023e51b1, 0x02455d26, 0x000ee699}}, Y: Field{[10]uint32{0x00fe7c7b, 0x006f774b, 0x00117e2e, 0x0121916c, 0x023dfa48, 0x01864041, 0x03601090, 0x01b02257, 0x0215aedf, 0x003b560e}}}, + {X: Field{[10]uint32{0x007a1039, 0x00eb429d, 0x03ae2d68, 0x010e0ba2, 0x0327b529, 0x02804ac3, 0x03cbdf07, 0x03f6c345, 0x03082b5c, 0x002f40d6}}, Y: Field{[10]uint32{0x03b2ef54, 0x003e68e6, 0x03f61ac9, 0x030e2d8a, 0x00e94a23, 0x01cafa2b, 0x0135ccd5, 0x035fa2a8, 0x03aded4a, 0x00192532}}}, + {X: Field{[10]uint32{0x015338c3, 0x0116d13c, 0x02ff7a8c, 0x02c50408, 0x024dda59, 0x022780e0, 0x03316ef0, 0x00602eb8, 0x0319fe9b, 0x003897ef}}, Y: Field{[10]uint32{0x034c7cf2, 0x0220d8c5, 0x03be6f63, 0x00467d3e, 0x007c2c8f, 0x0214b9a5, 0x02412581, 0x037548d0, 0x03f658a3, 0x00117b11}}}, + {X: Field{[10]uint32{0x00ffc9b8, 0x01cb993b, 0x02e6c7c0, 0x0170e1c7, 0x01f30f59, 0x00059501, 0x02ebea75, 0x01cd5814, 0x01cd8ffd, 0x000b88c7}}, Y: Field{[10]uint32{0x0359317a, 0x03cc591b, 0x0127d29c, 0x032fb946, 0x027610d4, 0x02892b78, 0x018f3d3e, 0x02586a11, 0x0052db15, 0x00031991}}}, + {X: Field{[10]uint32{0x01338fc8, 0x0161983d, 0x020483b4, 0x01d299a9, 0x01fd2a41, 0x00c5b819, 0x01ae1260, 0x0189bc6c, 0x01c93932, 0x001f03ca}}, Y: Field{[10]uint32{0x01cd037f, 0x008cee9d, 0x00162350, 0x013e6326, 0x01b76e2c, 0x021fd5aa, 0x0255d7a5, 0x0049cb00, 0x033ddf6f, 0x0009fbd4}}}, + {X: Field{[10]uint32{0x00d5bb48, 0x02da881f, 0x019ba31b, 0x0385c2ca, 0x027bd857, 0x01e53ecc, 0x003e0144, 0x027fbfed, 0x021cea6f, 0x0039c0b5}}, Y: Field{[10]uint32{0x023f79c9, 0x0303acc6, 0x02f2112e, 0x02bf298e, 0x00ee5e28, 0x03781de5, 0x0228a712, 0x03b8f9fc, 0x0081c924, 0x00311de6}}}, + {X: Field{[10]uint32{0x02c852a8, 0x02b917d9, 0x026d8cc2, 0x02900d69, 0x01c362c5, 0x030591fb, 0x0275c117, 0x0306d6fb, 0x0044eade, 0x003c5e00}}, Y: Field{[10]uint32{0x029e1c18, 0x01dd5c8c, 0x030f89a6, 0x00121727, 0x01e8b7a3, 0x00e00c43, 0x00f63ac1, 0x00e5dfc2, 0x01f0f31b, 0x0017e37a}}}, + {X: Field{[10]uint32{0x0312dd9e, 0x001c07c7, 0x0369f8d0, 0x02dc5982, 0x011582cc, 0x00999969, 0x0152c533, 0x016c6352, 0x037f22ec, 0x001e906c}}, Y: Field{[10]uint32{0x007fc443, 0x01425458, 0x002b9db7, 0x017890a7, 0x01344886, 0x028bc780, 0x00cd74d2, 0x00967020, 0x02132c57, 0x0021102f}}}, + {X: Field{[10]uint32{0x002db6d3, 0x033342ca, 0x02779ca4, 0x005b5482, 0x02a5ce63, 0x01f0d546, 0x00f4e165, 0x035a7866, 0x037d8111, 0x000253ff}}, Y: Field{[10]uint32{0x005c6fc0, 0x00926f14, 0x03b909c3, 0x00c0ea4c, 0x0342541d, 0x02c763b5, 0x00a75d38, 0x0030155e, 0x0270026c, 0x00120b24}}}, + {X: Field{[10]uint32{0x03f4e9d1, 0x03251005, 0x02560a54, 0x0224bdc3, 0x01d37759, 0x02c1692a, 0x00ac76b1, 0x03eaa55b, 0x004e8a3f, 0x0035a9b5}}, Y: Field{[10]uint32{0x00863e1a, 0x01ee95e4, 0x00b6cdc5, 0x021f78e2, 0x03c7b93e, 0x00ea2815, 0x023bbe78, 0x0277a645, 0x0322cd83, 0x001230ee}}}, + {X: Field{[10]uint32{0x00cdf80c, 0x00813e54, 0x03d53699, 0x024e56e4, 0x02c47c09, 0x00550ee4, 0x01dbc477, 0x03b6ac79, 0x01c08e24, 0x00330389}}, Y: Field{[10]uint32{0x011fb70b, 0x00a0af41, 0x038c8220, 0x015490c6, 0x031a977c, 0x02d29b4e, 0x0376ab2c, 0x033ced0e, 0x00b37170, 0x0008314b}}}, + {X: Field{[10]uint32{0x02f8d827, 0x0095ced8, 0x01be3db7, 0x0291041e, 0x01efddb6, 0x03ee0f2d, 0x025d0eac, 0x0346be84, 0x03684cb7, 0x0033e54f}}, Y: Field{[10]uint32{0x00909c0c, 0x027b76cc, 0x009ac0b8, 0x01406bf2, 0x03b302fa, 0x038f9428, 0x0047a7b8, 0x0046c42a, 0x0366a45d, 0x001c33f8}}}, + {X: Field{[10]uint32{0x0015d5dc, 0x02675ada, 0x0319fbff, 0x01d450ea, 0x02f8ce69, 0x03f57f87, 0x016b7112, 0x02ac1bfc, 0x02942b34, 0x0006b089}}, Y: Field{[10]uint32{0x036539fc, 0x038fe96a, 0x026154d9, 0x0348911d, 0x011bd823, 0x027859a0, 0x01b7fddd, 0x0025d53a, 0x017e02bd, 0x00290f51}}}, + {X: Field{[10]uint32{0x024d65c2, 0x03dc8c9e, 0x029e9bb9, 0x03f6904b, 0x00496349, 0x0256501b, 0x03800bcf, 0x02012bc3, 0x03ff1153, 0x00340aee}}, Y: Field{[10]uint32{0x0002a384, 0x03fff06e, 0x032f2876, 0x02087083, 0x020d41e6, 0x03bc22d5, 0x0344f9b9, 0x00cbdc75, 0x00de3c78, 0x000177a0}}}, + {X: Field{[10]uint32{0x031831a7, 0x021496d3, 0x0204025a, 0x009920de, 0x02d8a603, 0x0312ca67, 0x021cc2b2, 0x013b8d0b, 0x03478d46, 0x000f32b4}}, Y: Field{[10]uint32{0x002691c0, 0x00dac9b4, 0x0035af30, 0x00f926d4, 0x0147492f, 0x033acd00, 0x0079fdd6, 0x0156d82b, 0x024ca59b, 0x000d7a8a}}}, + {X: Field{[10]uint32{0x02033688, 0x01ee90cd, 0x0106b80f, 0x02cc1067, 0x01b3a758, 0x03fe12cf, 0x0362e90f, 0x030f3835, 0x01543e69, 0x003ab135}}, Y: Field{[10]uint32{0x01deacbe, 0x01a84bf4, 0x01dbf17f, 0x01b7250d, 0x02ee00fb, 0x036a8611, 0x00449aad, 0x01d2effa, 0x02dac543, 0x002a993e}}}, + {X: Field{[10]uint32{0x03fca753, 0x02383318, 0x037a9a02, 0x01974f6e, 0x015df624, 0x00cef8a0, 0x026d0c61, 0x00dc4ccc, 0x01b173d9, 0x000f4a1e}}, Y: Field{[10]uint32{0x00d6e0f0, 0x029ca59a, 0x00c9d8f0, 0x0230a9aa, 0x01fd38a0, 0x01336e34, 0x023eecb3, 0x02d7a2a7, 0x024d9b95, 0x0015db39}}}, + {X: Field{[10]uint32{0x0176ca14, 0x0138c11a, 0x03ce4cf7, 0x015a67ae, 0x0272358a, 0x02a31d9a, 0x0137087c, 0x01a0b894, 0x038d56a9, 0x000fd62a}}, Y: Field{[10]uint32{0x0321f29d, 0x010169ec, 0x02315447, 0x00280579, 0x01f6bce2, 0x02d2036b, 0x030f45f1, 0x02a2a07c, 0x03d101a2, 0x000f2414}}}, + {X: Field{[10]uint32{0x03fd12d7, 0x01776c44, 0x01b97314, 0x004d6211, 0x022a4ed9, 0x022bab90, 0x029df0fa, 0x03346506, 0x0289b48d, 0x0013d7c4}}, Y: Field{[10]uint32{0x00dc1428, 0x03e095b8, 0x03e86077, 0x01a968f0, 0x0342ac0d, 0x0288cf77, 0x02286ed0, 0x0195dc0f, 0x032cc40c, 0x002d70f8}}}, + {X: Field{[10]uint32{0x03376a76, 0x00e4b724, 0x03bc5ad0, 0x037fe682, 0x03e4a9dc, 0x028aeb35, 0x00e70ddd, 0x031beb9d, 0x01e2a52d, 0x0029928a}}, Y: Field{[10]uint32{0x018a9590, 0x02c05990, 0x0330b4eb, 0x0332c395, 0x01c776f2, 0x00f770d9, 0x02efe873, 0x02c6ddee, 0x00a6faa9, 0x002b78be}}}, + {X: Field{[10]uint32{0x00480e70, 0x0331f6f2, 0x02f04994, 0x017788d2, 0x00b8694b, 0x0071b4f8, 0x0186f94e, 0x03e22b47, 0x0212c4d6, 0x0037b82a}}, Y: Field{[10]uint32{0x02f93389, 0x01947e18, 0x002193d4, 0x0320034d, 0x02413ae1, 0x00cb4c35, 0x01368df3, 0x00df3ea7, 0x00d4cbda, 0x0032f66b}}}, + {X: Field{[10]uint32{0x01796936, 0x003c6235, 0x01f74f9c, 0x023220bf, 0x01772b95, 0x003ad9bf, 0x013e2948, 0x01ab86d9, 0x019dc8af, 0x00219dea}}, Y: Field{[10]uint32{0x0397232e, 0x03abe07f, 0x029ed783, 0x0075370f, 0x00662115, 0x002187d1, 0x03a24f3a, 0x0012392d, 0x00c8348c, 0x000c719a}}}, + {X: Field{[10]uint32{0x02997fee, 0x005e307d, 0x01d80ed6, 0x0306633b, 0x02f44aed, 0x02f5b59d, 0x0229bc79, 0x029f30ac, 0x013acb73, 0x0014445f}}, Y: Field{[10]uint32{0x01110cd6, 0x0395a30e, 0x01a4d174, 0x01c0c870, 0x0278f207, 0x00258d0f, 0x00651d30, 0x0217045c, 0x0004123f, 0x001718e3}}}, + {X: Field{[10]uint32{0x03141b12, 0x0328e0e7, 0x024689c3, 0x03e0d08f, 0x020a83c9, 0x00ba8490, 0x03585d45, 0x0020a3a1, 0x03646967, 0x0012362b}}, Y: Field{[10]uint32{0x0265e9de, 0x035938d4, 0x0040fdc4, 0x00d6501b, 0x011998dd, 0x00157b41, 0x029843b9, 0x01269f1a, 0x0342f07f, 0x001562a3}}}, + {X: Field{[10]uint32{0x02966d2c, 0x03a03d7d, 0x0317aecb, 0x01f7d6ee, 0x01d4060c, 0x0070593a, 0x003d4574, 0x03bb9685, 0x02c1b0fd, 0x0018aea6}}, Y: Field{[10]uint32{0x01d9450e, 0x01b04629, 0x00aedb58, 0x019cec0d, 0x019329fe, 0x01c2cee6, 0x0096494b, 0x0105b17f, 0x013f2290, 0x00196819}}}, + {X: Field{[10]uint32{0x01febf0d, 0x00a5f492, 0x0004a486, 0x00150fcc, 0x00508d8d, 0x00f1e4c4, 0x02f20580, 0x0295ad43, 0x03cb679d, 0x002f937d}}, Y: Field{[10]uint32{0x01f3ba9b, 0x01b10f35, 0x03a0995f, 0x00183e8f, 0x00ca6973, 0x032a21a5, 0x018cb8ba, 0x00f9fea2, 0x0150dd5f, 0x00306d59}}}, + {X: Field{[10]uint32{0x00c9979d, 0x010d6c0a, 0x010c3a0c, 0x00b33855, 0x02424eac, 0x0211ccc5, 0x02cdf340, 0x0381a016, 0x036ccca2, 0x00392700}}, Y: Field{[10]uint32{0x01609a1b, 0x02264b98, 0x03bcab16, 0x0078ed0a, 0x0121186b, 0x009ebf5f, 0x010d273d, 0x03f7956f, 0x025f0457, 0x00115af0}}}, + {X: Field{[10]uint32{0x03fd58e3, 0x01e9be25, 0x01302705, 0x006ab570, 0x02976e70, 0x02ddd30a, 0x03ddfc9c, 0x017642cf, 0x01eda81d, 0x002b9a11}}, Y: Field{[10]uint32{0x02d755bc, 0x01299d5f, 0x03e11e5b, 0x01b39a6c, 0x00450112, 0x014e694d, 0x026194e7, 0x038d8264, 0x0055322a, 0x0014a6f7}}}, + {X: Field{[10]uint32{0x02a25e1b, 0x03ab8c6f, 0x02d183fb, 0x02652867, 0x004c2744, 0x035c4e19, 0x00717e02, 0x02ddcb32, 0x00f8bcc2, 0x0014a876}}, Y: Field{[10]uint32{0x0189011b, 0x01a79810, 0x001dc9f8, 0x01cf1c0d, 0x03dbb806, 0x00edd4a2, 0x00e77f95, 0x01e25212, 0x032ce7f1, 0x00368a82}}}, + {X: Field{[10]uint32{0x02a2250a, 0x03ce0165, 0x02918425, 0x02724349, 0x010cc552, 0x035692af, 0x0119f50d, 0x01e01357, 0x0301d89a, 0x003feeeb}}, Y: Field{[10]uint32{0x029880e2, 0x00dfb666, 0x0214538c, 0x0043dac6, 0x022d5144, 0x00bf84c8, 0x02a47a6c, 0x018af416, 0x03b7eba6, 0x00222d7d}}}, + {X: Field{[10]uint32{0x038c942e, 0x0296783f, 0x011f9fe5, 0x0323fd81, 0x014473fb, 0x013e15c9, 0x03840eed, 0x006adebe, 0x0038aab5, 0x0001bfe9}}, Y: Field{[10]uint32{0x0202d775, 0x02131fb9, 0x01f8e668, 0x0168ab1f, 0x0350a0e9, 0x02584ef2, 0x0060dc66, 0x028100ce, 0x02dd3b88, 0x0016c089}}}, + {X: Field{[10]uint32{0x00a2fc79, 0x03b250c2, 0x00cb5a45, 0x01eb22f2, 0x00c2c1b7, 0x00749a84, 0x00f5ee59, 0x0311f8c6, 0x0258f92a, 0x00272255}}, Y: Field{[10]uint32{0x001045f9, 0x02b3ea70, 0x0338e516, 0x0057fdd3, 0x00ef4b01, 0x0378963b, 0x0255e286, 0x02f563c5, 0x01e2665e, 0x001c201c}}}, + {X: Field{[10]uint32{0x01861ba9, 0x037dbc30, 0x03bb5df1, 0x0338153e, 0x00a59bb3, 0x03afb38f, 0x01bffd18, 0x00d6c4ff, 0x020defba, 0x0014cb9b}}, Y: Field{[10]uint32{0x02bc5b8a, 0x02d1d52b, 0x027fff61, 0x003e942e, 0x0336f04b, 0x0192d164, 0x0332ed24, 0x02ef0fad, 0x01dad326, 0x0006bd19}}}, + {X: Field{[10]uint32{0x01fff425, 0x01238039, 0x02ea138d, 0x02020f69, 0x038a8a9f, 0x01432d28, 0x01add8eb, 0x01c24833, 0x0321e3f2, 0x0026410c}}, Y: Field{[10]uint32{0x0377ea6f, 0x0347c123, 0x03786ef9, 0x00937ca6, 0x02404ecb, 0x0394b0cd, 0x025b1be8, 0x00943f67, 0x0197325c, 0x00046fa1}}}, + {X: Field{[10]uint32{0x004084f9, 0x02bd1b9f, 0x0217287d, 0x01730cc7, 0x017d7908, 0x008308af, 0x00a6e941, 0x00d2a668, 0x00803a09, 0x00259e64}}, Y: Field{[10]uint32{0x00005e03, 0x011b08e6, 0x02d047dc, 0x02ab5d72, 0x02574903, 0x02ca04bb, 0x0120b5c9, 0x002ff9a9, 0x012d1845, 0x003aa400}}}, + {X: Field{[10]uint32{0x02a0afb9, 0x036b0dce, 0x006ab729, 0x006d3f0e, 0x021f36f7, 0x03bfdd85, 0x02d99819, 0x03f8433d, 0x0157915f, 0x001d3d74}}, Y: Field{[10]uint32{0x01b29eb5, 0x02750846, 0x0009a2c4, 0x02925069, 0x034e4ce4, 0x03323111, 0x02e225cd, 0x02f1d04a, 0x011e4922, 0x00152800}}}, + {X: Field{[10]uint32{0x01927855, 0x0335aa30, 0x0231e3e7, 0x035caa81, 0x0176e5f3, 0x0235e9d4, 0x000ddebe, 0x00e5555c, 0x035381c6, 0x00049a49}}, Y: Field{[10]uint32{0x039ae553, 0x03833070, 0x017b72c5, 0x03f544cd, 0x013eefef, 0x0387442d, 0x00554fa1, 0x000b5513, 0x00768110, 0x002e4b94}}}, + {X: Field{[10]uint32{0x00230d9f, 0x03801ee0, 0x028e11aa, 0x02f37471, 0x00d7cdcf, 0x03c63604, 0x036ae35a, 0x00f5cc16, 0x001b1d14, 0x000213be}}, Y: Field{[10]uint32{0x0175d42a, 0x028bb72d, 0x001bb33c, 0x0116a9b8, 0x02b0dda6, 0x00e28b96, 0x02bcf2c6, 0x033a3087, 0x022ba5b4, 0x0032b8e6}}}, + {X: Field{[10]uint32{0x009037ad, 0x00544b7b, 0x02a62dd7, 0x034a9ccf, 0x01c8d89d, 0x03b58aa1, 0x007af5e0, 0x01ab1d99, 0x01a3326e, 0x000708ab}}, Y: Field{[10]uint32{0x02aab458, 0x00126045, 0x00b64493, 0x03726580, 0x00bc4142, 0x02e79bf5, 0x0246283c, 0x029abe67, 0x00c61562, 0x003d6966}}}, + {X: Field{[10]uint32{0x024aff1b, 0x01c7307e, 0x03f4e736, 0x012142ef, 0x03c00f1f, 0x02781054, 0x00dd35fe, 0x02af56aa, 0x024ff08e, 0x001ae472}}, Y: Field{[10]uint32{0x01b31852, 0x00943f84, 0x039778cb, 0x0069f761, 0x01b3c955, 0x00413d61, 0x0368c8b6, 0x03e6753e, 0x02da85ad, 0x0031b36a}}}, + {X: Field{[10]uint32{0x01f85bc2, 0x01e2573b, 0x0188e23f, 0x02d7a3dc, 0x00b99063, 0x020dcdb9, 0x03f03219, 0x00855d84, 0x01996d2e, 0x0015eed2}}, Y: Field{[10]uint32{0x0347cc3a, 0x036dd96a, 0x0150e94f, 0x0050156d, 0x02d0a1ad, 0x01cea0b6, 0x034b9b20, 0x02a43a49, 0x01c672ee, 0x0024ed1b}}}, + {X: Field{[10]uint32{0x0233ba6e, 0x03d49812, 0x001ccb40, 0x0289e2be, 0x00067c38, 0x018f7e3c, 0x016d9f24, 0x0159b841, 0x0327ebf7, 0x001d5e42}}, Y: Field{[10]uint32{0x009d2045, 0x0267172e, 0x02dac6be, 0x01c66b81, 0x003af8dc, 0x011bab75, 0x025decf3, 0x002976c1, 0x00a3d99b, 0x00328323}}}, + {X: Field{[10]uint32{0x0074ebe9, 0x02f2ed41, 0x00a08f32, 0x03d36e31, 0x028dd7b4, 0x00c01287, 0x032b6fde, 0x01642fdf, 0x01ada90b, 0x00329e9d}}, Y: Field{[10]uint32{0x03fc69e3, 0x037b5a60, 0x03a1efd3, 0x0166b372, 0x00512732, 0x003c7700, 0x00e8a08e, 0x01479efd, 0x019c5c93, 0x002cc9e3}}}, + {X: Field{[10]uint32{0x0390b2d1, 0x013d754b, 0x0365c07a, 0x016bcc61, 0x0147b65a, 0x014aecd9, 0x02a8d6ce, 0x018a50e4, 0x00b93bf4, 0x0029b71a}}, Y: Field{[10]uint32{0x010ad45b, 0x00970cf2, 0x024de8f9, 0x01220648, 0x0237f533, 0x024c7718, 0x033c76a0, 0x01558683, 0x0167fc57, 0x00106e9b}}}, + {X: Field{[10]uint32{0x03b6bba5, 0x036b87da, 0x01b56fe0, 0x0130fd49, 0x002fafed, 0x0030d844, 0x035a0252, 0x03242b1f, 0x01f3f8af, 0x0036884e}}, Y: Field{[10]uint32{0x036349db, 0x001819c6, 0x02c369ad, 0x00743d6e, 0x0271e92c, 0x03968e53, 0x0097522d, 0x03605b70, 0x0388fa9e, 0x00256b72}}}, + {X: Field{[10]uint32{0x013da4de, 0x023893d0, 0x002cdf5a, 0x01ec8fc4, 0x03215935, 0x02aea732, 0x034194bf, 0x00018eb2, 0x00752f0e, 0x0028cac9}}, Y: Field{[10]uint32{0x03e576cc, 0x034c587a, 0x013dbddf, 0x02e0d3c1, 0x03e09f8a, 0x030d40db, 0x0316ffd8, 0x009ff31d, 0x0143bd8b, 0x0015f7d0}}}, + {X: Field{[10]uint32{0x01e9bedc, 0x00e2532b, 0x01392b89, 0x03c8b248, 0x02741718, 0x008cf1ce, 0x0319d8ba, 0x013fcf1c, 0x011d3382, 0x002aba92}}, Y: Field{[10]uint32{0x001a63a7, 0x02d85513, 0x02f4eb24, 0x00cb57e3, 0x01a7ad0d, 0x016bb61b, 0x026a3a1a, 0x0371964e, 0x029184d8, 0x000323ec}}}, + {X: Field{[10]uint32{0x007f2c75, 0x0222b362, 0x015e7ed3, 0x0170ac0c, 0x01ccf75d, 0x01a3ed8e, 0x00f3eb3d, 0x0026f489, 0x00e27a84, 0x000a4d78}}, Y: Field{[10]uint32{0x0168aad4, 0x026a4e31, 0x001640c8, 0x00343f7f, 0x03977e90, 0x00603530, 0x03d00680, 0x02b90260, 0x002462c9, 0x000313fc}}}, + {X: Field{[10]uint32{0x030fe577, 0x0091339d, 0x0218163d, 0x02581419, 0x03fdebbd, 0x02fabfb2, 0x034259aa, 0x01c94d60, 0x00769e2e, 0x001ff2a0}}, Y: Field{[10]uint32{0x01bc3542, 0x0384f355, 0x02ed99a5, 0x02e9f6eb, 0x0369cfec, 0x03f453fe, 0x003b8f6f, 0x03b48b2b, 0x03abf04d, 0x0028f770}}}, + {X: Field{[10]uint32{0x028b483e, 0x02d06457, 0x002a96a7, 0x031c4c59, 0x00bc129e, 0x01ed144d, 0x01e665f5, 0x02929fe9, 0x01c601ca, 0x00316d7c}}, Y: Field{[10]uint32{0x00b538e4, 0x01efeee7, 0x012576d3, 0x019b6332, 0x0173dabb, 0x0098047a, 0x0358fd0c, 0x0263368f, 0x0016da50, 0x0009b2ce}}}, + {X: Field{[10]uint32{0x01a50d88, 0x03eda81e, 0x034f456b, 0x01d33ff6, 0x03d7d5b1, 0x01e400d6, 0x01ecf4bf, 0x019dc993, 0x0274df43, 0x00104368}}, Y: Field{[10]uint32{0x039a6abf, 0x034aefbb, 0x000f88e1, 0x00e56efc, 0x02254a19, 0x01065e7e, 0x002ef1e8, 0x02cd25b7, 0x0168188e, 0x001c7206}}}, + {X: Field{[10]uint32{0x0367769a, 0x01634173, 0x03387540, 0x02b142af, 0x036f7976, 0x00e89a06, 0x036c5a24, 0x032002ae, 0x00ca334d, 0x000f664a}}, Y: Field{[10]uint32{0x01d2beb7, 0x03d3a7e5, 0x0115b2e4, 0x02af137c, 0x0062bf01, 0x00282879, 0x0183cdd8, 0x009ed4f8, 0x01dc7661, 0x0033f300}}}, + {X: Field{[10]uint32{0x00040cec, 0x03d0db32, 0x009192e4, 0x0387ce7f, 0x02d858ea, 0x000028c8, 0x037ce312, 0x0392991d, 0x017bc523, 0x00196a3d}}, Y: Field{[10]uint32{0x01192432, 0x01ff7018, 0x01b323f0, 0x03f30815, 0x03c9df69, 0x008affd8, 0x03f7b0ea, 0x00dd16c7, 0x00b99e95, 0x002081a6}}}, + {X: Field{[10]uint32{0x0192fb79, 0x00f99a97, 0x021531ac, 0x00e4929c, 0x0055f4e5, 0x0189c969, 0x013ef5ca, 0x001b0bff, 0x03ccbaa6, 0x00213954}}, Y: Field{[10]uint32{0x00c5f8d2, 0x03f43ce7, 0x01d674dc, 0x01d4640b, 0x014c0b5f, 0x03004887, 0x01f77311, 0x025197f6, 0x03324aaa, 0x000d35ab}}}, + {X: Field{[10]uint32{0x00773783, 0x03059a80, 0x036ac5f8, 0x02d3de68, 0x00dda3d4, 0x03451b6a, 0x011578d5, 0x00489bce, 0x01582885, 0x000ed29d}}, Y: Field{[10]uint32{0x01a59e53, 0x0021306c, 0x007877d0, 0x02f1335f, 0x021a4249, 0x013534d6, 0x00b3cc14, 0x00f30bad, 0x02fc4de8, 0x0038df25}}}, + {X: Field{[10]uint32{0x00cee6b0, 0x01b67bd4, 0x01db8922, 0x01e1920b, 0x02743395, 0x01ff344b, 0x00898193, 0x013a37a9, 0x012c0616, 0x001b6ef4}}, Y: Field{[10]uint32{0x01e02b90, 0x005845ab, 0x02a70333, 0x03182000, 0x020eed3b, 0x0069a2b3, 0x0247c17e, 0x0345514b, 0x0349b3f5, 0x00227923}}}, + {X: Field{[10]uint32{0x03c441f6, 0x03edcaa5, 0x03e02f0b, 0x0275b307, 0x02f1118e, 0x03e12bdc, 0x020b7431, 0x019205d2, 0x00db3b92, 0x002d9060}}, Y: Field{[10]uint32{0x03b25fd2, 0x03c30b13, 0x004d99e1, 0x036fab1c, 0x0033cc19, 0x03256817, 0x03a4f0f8, 0x00205899, 0x019783d0, 0x002ce53e}}}, + {X: Field{[10]uint32{0x016b5c56, 0x003c0e88, 0x02115b26, 0x02fb91ac, 0x0137e96f, 0x02ed9fca, 0x037fc08e, 0x01df1b65, 0x038cf473, 0x00085cfc}}, Y: Field{[10]uint32{0x012e2abf, 0x008becc8, 0x0136f27e, 0x006939e7, 0x023bd1c6, 0x01afb3d5, 0x008c6df0, 0x029a13f6, 0x027803c4, 0x002f680a}}}, + {X: Field{[10]uint32{0x005c5214, 0x03899b7f, 0x0356a222, 0x029aa289, 0x02ea2b89, 0x033cd781, 0x00df0b48, 0x00bc3619, 0x00d3f373, 0x0027767b}}, Y: Field{[10]uint32{0x03e921fe, 0x035c4b85, 0x0106fa70, 0x0069437b, 0x01dcf00b, 0x01f6e52b, 0x019256a5, 0x0209083b, 0x03202ba6, 0x00390ba9}}}, + {X: Field{[10]uint32{0x03af71a9, 0x004873f9, 0x0136b02a, 0x00c98134, 0x029d3982, 0x03dca424, 0x0149526a, 0x02d8bb75, 0x03ed5ceb, 0x001c17e7}}, Y: Field{[10]uint32{0x010d30a8, 0x00b30a5d, 0x01d2c44d, 0x00028580, 0x002b32c1, 0x01e9e18f, 0x0269a4a5, 0x01cbac4b, 0x017daa44, 0x002ecb2c}}}, + {X: Field{[10]uint32{0x00ef4410, 0x02130acb, 0x031a217b, 0x028a3637, 0x033fbcda, 0x03f04978, 0x037fcd8c, 0x01a6f5fe, 0x00d18071, 0x003c6a42}}, Y: Field{[10]uint32{0x00911512, 0x02a91a2e, 0x02cc14e7, 0x03921e04, 0x02d792bb, 0x0214799e, 0x01cfa759, 0x01b15be0, 0x0008804c, 0x0003a1b3}}}, + {X: Field{[10]uint32{0x01355f57, 0x03370938, 0x00d5fd40, 0x00d1491f, 0x005625e4, 0x02148983, 0x012a4756, 0x00f2071d, 0x01793569, 0x0036c317}}, Y: Field{[10]uint32{0x0283daea, 0x030ba371, 0x02629fe8, 0x0354d533, 0x01d0de9b, 0x014e7af9, 0x0321f1e2, 0x034a54dd, 0x02a9fb00, 0x00048317}}}, + {X: Field{[10]uint32{0x02423ec6, 0x03b652f2, 0x00af59a2, 0x01c1ed4f, 0x02e979d4, 0x010476a1, 0x0158f683, 0x01fa486c, 0x01355600, 0x00179356}}, Y: Field{[10]uint32{0x0272d935, 0x01ddcf98, 0x026dcb94, 0x02824a1d, 0x01c309b5, 0x0339abbf, 0x0062fb37, 0x027b4c9e, 0x03001a0e, 0x001c5622}}}, + {X: Field{[10]uint32{0x03ec7f28, 0x00abd013, 0x02bcd487, 0x0019fb3e, 0x00a264d1, 0x00904059, 0x017fd112, 0x0397e23a, 0x02083c46, 0x00069e7b}}, Y: Field{[10]uint32{0x02349111, 0x03de8c8c, 0x02aacc4d, 0x03536501, 0x0254f94b, 0x0229723f, 0x016289f1, 0x01d54c0d, 0x03fc49bf, 0x003e4a36}}}, + {X: Field{[10]uint32{0x00ac5468, 0x028ebcdb, 0x0346e86c, 0x00492af7, 0x011c3a18, 0x00e8290d, 0x000a2d7f, 0x00311b2d, 0x008be3be, 0x0039a4fe}}, Y: Field{[10]uint32{0x01649cc4, 0x002529b7, 0x00efb78f, 0x0135994e, 0x03fb4f35, 0x022bb16b, 0x032db89d, 0x00a8aebb, 0x03bd24ab, 0x00157c2d}}}, + {X: Field{[10]uint32{0x029ca25e, 0x0315468c, 0x03e581bc, 0x015d7435, 0x0043bb61, 0x017a5b8a, 0x03b12d4f, 0x00f1dbdc, 0x00b1f3c7, 0x001b457a}}, Y: Field{[10]uint32{0x017f069d, 0x030d620b, 0x0365db74, 0x02f9b8ed, 0x01173f8c, 0x0067e296, 0x020d05e4, 0x01909cca, 0x02e18438, 0x003c87cf}}}, + {X: Field{[10]uint32{0x03ddb682, 0x02aab78e, 0x02dc48a5, 0x0393fd4d, 0x0220dd98, 0x01964f45, 0x0303f2cf, 0x012bd254, 0x0127b261, 0x00122e3c}}, Y: Field{[10]uint32{0x03546e3f, 0x0395fb0b, 0x02e99c7c, 0x0075a00e, 0x02a50d19, 0x0175e1b5, 0x027e23b5, 0x01f18944, 0x01baec13, 0x0023b46e}}}, + {X: Field{[10]uint32{0x02eb3028, 0x029f03d6, 0x023d4170, 0x02923fdf, 0x008c29fc, 0x028cb828, 0x0319f291, 0x01144251, 0x0231ee1e, 0x000bb0c9}}, Y: Field{[10]uint32{0x017aa945, 0x015e171a, 0x02c91610, 0x03e04faa, 0x02491572, 0x0341f426, 0x010ee359, 0x014db963, 0x019fe21b, 0x003ae187}}}, + {X: Field{[10]uint32{0x03afce3a, 0x02e3282b, 0x017b6776, 0x019ba861, 0x007ab72f, 0x01573251, 0x012c13fb, 0x0353517b, 0x02cb3b35, 0x003de583}}, Y: Field{[10]uint32{0x0010f08a, 0x0366b9e1, 0x00510cd6, 0x01fe3e1f, 0x03d8f7cf, 0x0280bba9, 0x0140334d, 0x01ad029c, 0x00f8d40f, 0x00240917}}}, + {X: Field{[10]uint32{0x02613ef2, 0x011c496e, 0x035af7a2, 0x02e31f72, 0x01139b29, 0x0163cea8, 0x0385780d, 0x03df9bbc, 0x003e4b22, 0x002a5333}}, Y: Field{[10]uint32{0x02845409, 0x03511768, 0x00c45e94, 0x032e33e9, 0x02782471, 0x02f1a99b, 0x01ba357c, 0x03e836a2, 0x00fadd6a, 0x003bdc14}}}, + {X: Field{[10]uint32{0x01485c38, 0x018bd53d, 0x0239956d, 0x03b45c21, 0x028c42b3, 0x0315bc09, 0x03d6f576, 0x03d0c034, 0x03f86d80, 0x0039229f}}, Y: Field{[10]uint32{0x029a6255, 0x03671697, 0x00231a7b, 0x00091ee6, 0x03e429b7, 0x01ffed0a, 0x01e3c65c, 0x01ec2c8a, 0x0229b499, 0x002c5a54}}}, + {X: Field{[10]uint32{0x0322d2ae, 0x027a6edf, 0x00d9eac7, 0x02efd922, 0x02cccb09, 0x00a98cf5, 0x025b422b, 0x0320eb36, 0x008c7d46, 0x0037e652}}, Y: Field{[10]uint32{0x0345fd4b, 0x01dd58bc, 0x038c3e04, 0x01176468, 0x03aaf83a, 0x02f4f1ca, 0x001a8785, 0x03d17114, 0x0280a958, 0x00225240}}}, + {X: Field{[10]uint32{0x0322fd84, 0x03bd06bb, 0x03770553, 0x00f8a6c9, 0x032bb4e4, 0x02e8d23b, 0x024368eb, 0x03e7d1bd, 0x02c04db9, 0x00285431}}, Y: Field{[10]uint32{0x01c5c201, 0x0193ca46, 0x01ccae1f, 0x01fad121, 0x00e7b539, 0x0038fb47, 0x0122ab02, 0x01683b0e, 0x0274e152, 0x001877ea}}}, + {X: Field{[10]uint32{0x03aa0edd, 0x02a9507c, 0x024e1204, 0x03ff615a, 0x00937392, 0x0326128a, 0x03aa167b, 0x031be475, 0x01fa452e, 0x0026df7b}}, Y: Field{[10]uint32{0x03d2c74a, 0x012a113f, 0x03e7910a, 0x002732b6, 0x03b4262c, 0x0326cc6a, 0x020ef6e7, 0x01a37af2, 0x01122f51, 0x0028dfd2}}}, + {X: Field{[10]uint32{0x00e51904, 0x03b4d60a, 0x01a23d38, 0x00f3e482, 0x02ad1aa8, 0x01e69641, 0x00f75c55, 0x03a9c6c8, 0x02516d0c, 0x0031f5de}}, Y: Field{[10]uint32{0x00a44bd6, 0x0393635d, 0x00e7f56d, 0x02232d7b, 0x0108e5a2, 0x026c36ba, 0x030a7a14, 0x00d980de, 0x007d9e1a, 0x000e669f}}}, + {X: Field{[10]uint32{0x02fe73fd, 0x009e52d0, 0x02e8d806, 0x03b2cee1, 0x02fc1d1d, 0x01cf6604, 0x026c2b0f, 0x0396e685, 0x00298e4d, 0x0034c4ea}}, Y: Field{[10]uint32{0x03708fe4, 0x02a20c07, 0x02a16fc9, 0x027182bd, 0x03b8514c, 0x02ef6d36, 0x03062c5d, 0x01b8bcd3, 0x023a7eb2, 0x00194911}}}, + {X: Field{[10]uint32{0x03211e5f, 0x0181ffa5, 0x038b9787, 0x00f1263c, 0x022e6c2a, 0x00f13c63, 0x0069b8e8, 0x031a4c19, 0x023b4d66, 0x0012efcd}}, Y: Field{[10]uint32{0x011c60c3, 0x01ba301f, 0x025629f2, 0x01670378, 0x0382bb0d, 0x00605dd0, 0x03b64061, 0x01cb1631, 0x024b2438, 0x002790b2}}}, + {X: Field{[10]uint32{0x021e9cf2, 0x0114d7e1, 0x0003e3f8, 0x00ddd19d, 0x01d471bd, 0x0199f3c6, 0x027ef1da, 0x033a1b52, 0x00ed23a0, 0x0000ef84}}, Y: Field{[10]uint32{0x0066d885, 0x02c10cd0, 0x00ead0a7, 0x02432e57, 0x00edfd20, 0x026ee7ea, 0x034748a4, 0x005f0194, 0x03780cb3, 0x002ee564}}}, + {X: Field{[10]uint32{0x01ca2076, 0x02736cd7, 0x01d96b16, 0x026032e9, 0x00946da1, 0x034a7bb1, 0x01074ec8, 0x0258f20a, 0x0080d723, 0x003f347e}}, Y: Field{[10]uint32{0x02a87b01, 0x024674ec, 0x013467c0, 0x02b896fb, 0x02d3b105, 0x03e97f21, 0x00ec2755, 0x018b8713, 0x00e3a313, 0x0025226f}}}, + {X: Field{[10]uint32{0x02b317c4, 0x03009c7e, 0x0217cf0e, 0x02a14b34, 0x01f39f42, 0x023a81a0, 0x027114cd, 0x00d98acb, 0x0358993d, 0x0002d7ec}}, Y: Field{[10]uint32{0x03a71b43, 0x02ceeefc, 0x0334a791, 0x0314537d, 0x0380a653, 0x02c12b09, 0x01bfa828, 0x00b2f3c3, 0x02b8ee62, 0x00227623}}}, + {X: Field{[10]uint32{0x03e274e7, 0x00920563, 0x037c9556, 0x01fd8139, 0x0330fc13, 0x00b32acf, 0x000f39bd, 0x0118291d, 0x02d17fca, 0x002a1aee}}, Y: Field{[10]uint32{0x030753fb, 0x02de8a40, 0x01a0bd03, 0x038498fd, 0x031394ed, 0x01258b01, 0x0294742e, 0x026b1e34, 0x0259ba96, 0x00309b70}}}, + {X: Field{[10]uint32{0x0330d29a, 0x02486004, 0x01467887, 0x025309f4, 0x019dd3fc, 0x024d744a, 0x034bc7ba, 0x02f259f8, 0x01f6348c, 0x0003b4c8}}, Y: Field{[10]uint32{0x03f7c3b5, 0x00349468, 0x021351be, 0x00085400, 0x00fc5ac4, 0x03c1ef72, 0x03b44d6c, 0x0177871d, 0x0360832b, 0x002d01e0}}}, + {X: Field{[10]uint32{0x02d17dea, 0x035c6506, 0x0097996e, 0x023dc07f, 0x022c425b, 0x03825312, 0x01e827ed, 0x02e4dbd5, 0x0275e4dd, 0x003205e4}}, Y: Field{[10]uint32{0x002553a7, 0x03fa6776, 0x02622e16, 0x018f14ac, 0x038ce5e9, 0x019921ab, 0x009b0b92, 0x034597ad, 0x005be241, 0x003667c7}}}, + {X: Field{[10]uint32{0x0284985b, 0x03435f77, 0x02512df1, 0x00b87647, 0x010eeaf8, 0x03e37f3f, 0x02743283, 0x02ce0d24, 0x013f23b9, 0x001bc23c}}, Y: Field{[10]uint32{0x00bd602e, 0x00ff8236, 0x03a76a4a, 0x00788b31, 0x010665d6, 0x000dc2b1, 0x0258ed05, 0x010ce9bb, 0x0029f99f, 0x0025adaa}}}, + {X: Field{[10]uint32{0x038f9d5a, 0x031f99e7, 0x015e4b35, 0x01b28461, 0x03e6ab5d, 0x03ab0f97, 0x01f8b609, 0x02753fbe, 0x03e3410f, 0x002510e9}}, Y: Field{[10]uint32{0x03eded57, 0x003e4d8e, 0x01b538fa, 0x03756847, 0x02ac9b2a, 0x001eaf08, 0x03c93e6d, 0x0230fcc6, 0x03b57818, 0x00363141}}}, + {X: Field{[10]uint32{0x033c502b, 0x01c0fd44, 0x013d2e37, 0x0120378a, 0x01d38c88, 0x01c015bb, 0x03afcfa5, 0x00da06b4, 0x00ca3ed5, 0x0010cbaa}}, Y: Field{[10]uint32{0x03edff71, 0x00ce26da, 0x00118faa, 0x0371909c, 0x010965dd, 0x009b1a98, 0x0266a498, 0x00aec023, 0x028b70b5, 0x00278648}}}, + {X: Field{[10]uint32{0x0182403b, 0x0240ff86, 0x032c130f, 0x03ab8adc, 0x005e22ff, 0x00f1ffb6, 0x02584a3d, 0x00bf6316, 0x009a42f8, 0x000745d6}}, Y: Field{[10]uint32{0x00c39ceb, 0x003d549e, 0x00e9454e, 0x017ef978, 0x03511e96, 0x0117c31a, 0x0164ed02, 0x03482099, 0x03b48f18, 0x0027def3}}}, + {X: Field{[10]uint32{0x018e6b2d, 0x00da87f8, 0x0098b554, 0x03fffdf0, 0x021ab8c6, 0x024104b3, 0x02778ea7, 0x0211bd97, 0x01b5cd84, 0x001d0ce6}}, Y: Field{[10]uint32{0x00b784bc, 0x03d26cb6, 0x03145fb1, 0x02739733, 0x01e84ff4, 0x0006dbf4, 0x0166d3fc, 0x006f9399, 0x001a8280, 0x00371b32}}}, + {X: Field{[10]uint32{0x0110b2a7, 0x0268369e, 0x0071fa27, 0x00cb817e, 0x025330d2, 0x02d7e490, 0x023e80e3, 0x0123058b, 0x01583b28, 0x00390de1}}, Y: Field{[10]uint32{0x01624b68, 0x036b3c15, 0x011f080c, 0x006f41db, 0x01d5e242, 0x005e6862, 0x013f99f8, 0x01e3901f, 0x0171aa49, 0x0030e6d0}}}, + {X: Field{[10]uint32{0x0318d63e, 0x0009acd9, 0x02a10664, 0x033bd7d0, 0x038f8a99, 0x00029918, 0x0355ac7d, 0x00e6a3c5, 0x00a31b16, 0x003bbdda}}, Y: Field{[10]uint32{0x0224a991, 0x01211cc7, 0x01ef5ee6, 0x02e22f8a, 0x01878efc, 0x03a5ec19, 0x030043af, 0x039a186b, 0x01f4cbf4, 0x000aa401}}}, + {X: Field{[10]uint32{0x03c91fe9, 0x0032a86f, 0x0129a180, 0x027ecb7a, 0x00fc2afa, 0x01807612, 0x00dce1bd, 0x0184b3d0, 0x02872504, 0x000576d1}}, Y: Field{[10]uint32{0x027eded8, 0x01c43313, 0x03515f17, 0x002e568b, 0x021e7236, 0x0242e0b2, 0x00678a9d, 0x02366941, 0x024e7d50, 0x002a2db9}}}, + {X: Field{[10]uint32{0x014a4191, 0x015eeb43, 0x022a0c77, 0x00fbf1e3, 0x01d2b330, 0x015a87f6, 0x028d2a04, 0x02a12e74, 0x02cf2529, 0x002b517e}}, Y: Field{[10]uint32{0x0254f069, 0x012a234d, 0x0125aa6b, 0x002583e6, 0x01bf8d81, 0x03ddf56b, 0x02f58678, 0x00c0d45b, 0x0171473f, 0x00069e39}}}, + {X: Field{[10]uint32{0x01151824, 0x02526d6e, 0x03d8958c, 0x01b57e92, 0x021c19b6, 0x0224aeb0, 0x0375050a, 0x01ed33ad, 0x03446e02, 0x0010680d}}, Y: Field{[10]uint32{0x01140317, 0x0150df65, 0x00e74bb4, 0x033590d7, 0x0027c53a, 0x00381ea1, 0x021cb2e6, 0x034e3e9c, 0x00ddfa96, 0x003b5f11}}}, + {X: Field{[10]uint32{0x03217ae0, 0x0047c749, 0x00740560, 0x035836b0, 0x015a70d5, 0x003c410f, 0x03645890, 0x031ffcb3, 0x006958f4, 0x0008082e}}, Y: Field{[10]uint32{0x01c4e9e0, 0x02e53df8, 0x02aa0490, 0x0184a754, 0x02b37f59, 0x0093ac71, 0x01946171, 0x03d0c686, 0x01e22757, 0x00044656}}}, + {X: Field{[10]uint32{0x02bd4ba1, 0x00e0ea7a, 0x00180283, 0x0155c400, 0x0299c5f7, 0x021685a7, 0x033bf27d, 0x01d2a543, 0x0146859f, 0x000be66a}}, Y: Field{[10]uint32{0x0389fc53, 0x0153dd37, 0x039fa128, 0x02753a35, 0x0236ecba, 0x03982164, 0x024ed246, 0x03aa891e, 0x0182d3ca, 0x000f9888}}}, + {X: Field{[10]uint32{0x02369baa, 0x03af7467, 0x03a3c177, 0x01d752a0, 0x010e7c56, 0x03889fca, 0x027688c2, 0x014e4005, 0x018957f6, 0x003773ce}}, Y: Field{[10]uint32{0x034b2431, 0x0077004b, 0x01b873da, 0x0233cac4, 0x01c3c342, 0x02437408, 0x01a3ceea, 0x020ce88e, 0x023f3fa6, 0x0029c031}}}, + {X: Field{[10]uint32{0x011ace4f, 0x03441086, 0x0117b73b, 0x02ab02de, 0x0392df1e, 0x024c6716, 0x022fa9e0, 0x008d8067, 0x03b80425, 0x002618e9}}, Y: Field{[10]uint32{0x003b69e6, 0x018d58b8, 0x02b6a3bf, 0x02b93c6c, 0x023a1fa7, 0x00928c3a, 0x0309f8c7, 0x02ac852f, 0x01a9281d, 0x00126926}}}, + {X: Field{[10]uint32{0x01733886, 0x02a3d637, 0x01d2e467, 0x03bcf1b5, 0x0219cb4d, 0x012e3a4b, 0x033734a6, 0x01645cd3, 0x01f9ea2c, 0x001b1519}}, Y: Field{[10]uint32{0x020e733c, 0x03f110c7, 0x03c8d3da, 0x017e8701, 0x03768f65, 0x00c66acf, 0x02a2616a, 0x03cd7456, 0x02bb179d, 0x00015f88}}}, + {X: Field{[10]uint32{0x00f3fcdd, 0x01e7c514, 0x03a530d9, 0x0153f9c0, 0x0025acb6, 0x02c281a4, 0x00ca387f, 0x00efac34, 0x0113360b, 0x002acdd5}}, Y: Field{[10]uint32{0x0041be4a, 0x01170bdb, 0x027c5464, 0x01d940fb, 0x0157f0f7, 0x030de9bb, 0x03842f43, 0x00b7966d, 0x0149309a, 0x000fa704}}}, + {X: Field{[10]uint32{0x002603d2, 0x00481e93, 0x03111482, 0x02a7a450, 0x00ff0878, 0x0016c8b4, 0x03aee379, 0x03bac2c8, 0x03ea4a72, 0x001ab2f8}}, Y: Field{[10]uint32{0x030d32b9, 0x032c6777, 0x025330ae, 0x00f39256, 0x02ac2ca2, 0x03279a01, 0x023dad76, 0x01365a85, 0x00be9f93, 0x0007b3bf}}}, + {X: Field{[10]uint32{0x02955d89, 0x03e573ce, 0x008c3653, 0x00141fc7, 0x03b4ddd1, 0x01d9b894, 0x00ac9f9c, 0x00310979, 0x014458fd, 0x001e5574}}, Y: Field{[10]uint32{0x0250aaca, 0x00d40925, 0x01245847, 0x00ec0349, 0x0340c672, 0x00e880a1, 0x02892255, 0x021fc252, 0x01f73043, 0x0023ea71}}}, + {X: Field{[10]uint32{0x01ace377, 0x0083360d, 0x0213228c, 0x02ff95e0, 0x02d488eb, 0x01ef4f68, 0x02b25a22, 0x010cfdc0, 0x010c0090, 0x002d65cb}}, Y: Field{[10]uint32{0x02b008fa, 0x035932d0, 0x03212cf3, 0x0211702f, 0x00e3e78f, 0x005d2cbf, 0x01ef70ed, 0x00f7949e, 0x00bf7fbc, 0x0008d51c}}}, + {X: Field{[10]uint32{0x00bcf886, 0x02d22f41, 0x038e4d9c, 0x01f91257, 0x02cc500d, 0x00f31e7c, 0x004f3bc5, 0x03e9a288, 0x001033a5, 0x002899aa}}, Y: Field{[10]uint32{0x015949f8, 0x022def7d, 0x011ecb56, 0x00916c2e, 0x03d52b78, 0x011bcf8d, 0x00390e6a, 0x0056dd99, 0x01a1958d, 0x000c6a2c}}}, + {X: Field{[10]uint32{0x00b9cc15, 0x03908751, 0x03123451, 0x00fdf783, 0x01ae7f4f, 0x03a7df08, 0x03bf47e1, 0x006d8d6e, 0x02ec2119, 0x00071904}}, Y: Field{[10]uint32{0x002c685a, 0x0188a131, 0x0169d82a, 0x006c8bfe, 0x016e7fec, 0x000958c2, 0x0173851d, 0x0313cfd6, 0x022c1111, 0x0020cfe2}}}, + {X: Field{[10]uint32{0x020b7fda, 0x018841cf, 0x01f68a74, 0x01f17989, 0x03817267, 0x03b813fc, 0x019ccbef, 0x016d5e70, 0x02ab1757, 0x003b8d4c}}, Y: Field{[10]uint32{0x027e8718, 0x03d1441b, 0x00f53a9a, 0x02d24acb, 0x0304b704, 0x03123b9a, 0x01ff04dc, 0x0261ee0f, 0x00c8b2fd, 0x003c4b84}}}, + {X: Field{[10]uint32{0x021a3838, 0x011367fb, 0x0115e379, 0x012c0259, 0x0152ef9a, 0x01fd6d2f, 0x012765af, 0x01e4dcbb, 0x03be0486, 0x0017b443}}, Y: Field{[10]uint32{0x00080573, 0x03218ced, 0x028af2a8, 0x01ed7ef1, 0x02a4bffd, 0x00977399, 0x00ac6410, 0x00e493b6, 0x01b49fbe, 0x002313ae}}}, + {X: Field{[10]uint32{0x001378d2, 0x00754d74, 0x0152a15a, 0x0165c208, 0x01b8f6b8, 0x01cd0838, 0x03e7345f, 0x0217b5a7, 0x0221f04c, 0x003f8d22}}, Y: Field{[10]uint32{0x001f2b7b, 0x0273f482, 0x019117fa, 0x00f5f67e, 0x03506947, 0x038e3908, 0x02abd103, 0x02afd173, 0x0046c9f5, 0x00356575}}}, + {X: Field{[10]uint32{0x032436e9, 0x0221d17e, 0x0223dbda, 0x02730245, 0x03b57367, 0x016e8e5c, 0x021e1c0b, 0x012e8021, 0x0369b7b6, 0x0001c500}}, Y: Field{[10]uint32{0x03a12b2d, 0x01da9520, 0x010ad1f3, 0x01881cb1, 0x0240dfa3, 0x003199cb, 0x003bc213, 0x02581ca3, 0x0350f979, 0x003c1dc0}}}, + {X: Field{[10]uint32{0x01dad15d, 0x020855e6, 0x01bd40aa, 0x036ea0e0, 0x020a7465, 0x0048c025, 0x02c6b88b, 0x0078eb9f, 0x00e48e98, 0x001b4531}}, Y: Field{[10]uint32{0x03e0f841, 0x016c1439, 0x0299a50e, 0x023ed6fa, 0x01f9c6de, 0x02d62cb5, 0x02635f6d, 0x0344aa93, 0x02aaa5f2, 0x00097934}}}, + {X: Field{[10]uint32{0x024383da, 0x036c2bc6, 0x0228daea, 0x01c416ed, 0x004dffe0, 0x015413a2, 0x020558e5, 0x01f5f8d8, 0x01c6a683, 0x001e4c6e}}, Y: Field{[10]uint32{0x03e80c0b, 0x033fb7be, 0x002ff9d5, 0x0012108b, 0x0196b7a9, 0x03cef4e3, 0x0112128b, 0x00971b77, 0x02733209, 0x00161b2a}}}, + {X: Field{[10]uint32{0x01cec834, 0x03342f79, 0x03d95b0e, 0x01149eaa, 0x0088dca1, 0x005462e2, 0x00e1f32a, 0x00f50d74, 0x016a35b8, 0x000527a7}}, Y: Field{[10]uint32{0x025606f5, 0x01d316b3, 0x02e1fcbc, 0x03300641, 0x00f87b11, 0x03404bed, 0x01d49b38, 0x033197a4, 0x02a0fd84, 0x0011601e}}}, + {X: Field{[10]uint32{0x01297394, 0x026f49c3, 0x03ff7b80, 0x025b0a12, 0x001bf6e6, 0x01e52404, 0x02f2b59d, 0x0146a088, 0x036eb4b3, 0x00195ac9}}, Y: Field{[10]uint32{0x03763291, 0x01cca05e, 0x025d9b64, 0x034feaa3, 0x03905eb6, 0x0038d624, 0x00ebfa9a, 0x010e8a4a, 0x03095f86, 0x0021d1bc}}}, + {X: Field{[10]uint32{0x031eb02e, 0x012d8283, 0x000a6988, 0x00814e62, 0x033656a7, 0x01e14b87, 0x022370ff, 0x01a627b9, 0x01e36808, 0x00183ce6}}, Y: Field{[10]uint32{0x0044ad59, 0x02cadbf5, 0x0267d4f1, 0x03f937bc, 0x039e5976, 0x0082dde7, 0x0251676d, 0x02f85214, 0x005a8347, 0x00157728}}}, + {X: Field{[10]uint32{0x006eaa13, 0x036f9062, 0x00e0d4ca, 0x016a4063, 0x01034a30, 0x013e6f70, 0x006f4175, 0x02907029, 0x03030a67, 0x00136f68}}, Y: Field{[10]uint32{0x03a48fc4, 0x01616e0f, 0x03970c22, 0x025748f5, 0x01909a3b, 0x010cedd1, 0x01f9fe64, 0x00d16359, 0x0086fec3, 0x003818b3}}}, + {X: Field{[10]uint32{0x010363d1, 0x03ca8037, 0x03111d07, 0x0313d256, 0x03f8c8b1, 0x0360671a, 0x03c10c8f, 0x01336569, 0x01ca04d6, 0x00205ab8}}, Y: Field{[10]uint32{0x02526009, 0x03470619, 0x0366b2df, 0x03c83524, 0x03b12187, 0x03a744ee, 0x02a55208, 0x035bf55b, 0x03ffc331, 0x003027da}}}, + {X: Field{[10]uint32{0x0081b52b, 0x00636be0, 0x020a000f, 0x011305b5, 0x01872029, 0x0178a22b, 0x032b8fae, 0x03829f0e, 0x039c983f, 0x001160e7}}, Y: Field{[10]uint32{0x01dd8649, 0x02169a99, 0x004db2a7, 0x01af3684, 0x01aff40c, 0x0020d6be, 0x01f7beb3, 0x013ad020, 0x02074de7, 0x003e4da3}}}, + {X: Field{[10]uint32{0x00223465, 0x016dba35, 0x00d5063c, 0x01f6c8ef, 0x0244b715, 0x0309153c, 0x004c482e, 0x0080ec78, 0x02483a49, 0x00142b92}}, Y: Field{[10]uint32{0x015f3008, 0x02e8df9f, 0x0065836d, 0x00a170d9, 0x010a6190, 0x0160ef69, 0x032031ec, 0x00b87d97, 0x03d7e7bd, 0x00386e33}}}, + {X: Field{[10]uint32{0x016b72d6, 0x010657d8, 0x039dba69, 0x012fb49b, 0x03c5d8bb, 0x0086b39d, 0x02dde15b, 0x01422467, 0x02316039, 0x0037ddec}}, Y: Field{[10]uint32{0x034344a4, 0x03254022, 0x0303717d, 0x0032ccfc, 0x00c99e27, 0x019cd997, 0x00cff822, 0x02fef2e2, 0x01b89ece, 0x002292dd}}}, + {X: Field{[10]uint32{0x0233277d, 0x02c2e3bc, 0x01345437, 0x02358ecb, 0x016d2d23, 0x0009d01d, 0x00419d67, 0x00bc62dd, 0x0219978e, 0x003b1b03}}, Y: Field{[10]uint32{0x0236e553, 0x018fc2c9, 0x02d8a4a3, 0x01a05cf3, 0x0296bd39, 0x016ff931, 0x0171dc13, 0x03133189, 0x039a02df, 0x003e436a}}}, + {X: Field{[10]uint32{0x017b3329, 0x00640458, 0x03e4ba46, 0x0215214a, 0x005af2a8, 0x029c8886, 0x014eacb1, 0x03f39a9b, 0x016f90e7, 0x000a1d10}}, Y: Field{[10]uint32{0x02eb4466, 0x0374997a, 0x0282d448, 0x01256d36, 0x03b8628e, 0x0244ab5f, 0x024c9af7, 0x0359222e, 0x0275f6ce, 0x0007cc8d}}}, + {X: Field{[10]uint32{0x00ff4247, 0x02b3cfdc, 0x01d2be7d, 0x032e25f2, 0x02529de5, 0x00edb74f, 0x0087f3e8, 0x00ea03e3, 0x03ec586d, 0x0021c8d9}}, Y: Field{[10]uint32{0x02a3ac05, 0x01a144a9, 0x02eeceef, 0x032792d8, 0x017dc571, 0x0109f802, 0x00768b5e, 0x0210ede2, 0x00e0fae0, 0x00396ed8}}}, + {X: Field{[10]uint32{0x024713cc, 0x02368f90, 0x01f4891b, 0x02c84efc, 0x004339a0, 0x00312bcd, 0x0030ce94, 0x03f4c2b9, 0x00040baf, 0x003043c8}}, Y: Field{[10]uint32{0x0231c7ee, 0x00dfef61, 0x02e59c35, 0x01e58d0f, 0x03bf6dbf, 0x00fe0bb7, 0x006d456b, 0x026cdb15, 0x0055f0c3, 0x000defa4}}}, + {X: Field{[10]uint32{0x00d847c5, 0x01b7651c, 0x0059da35, 0x02cee4ef, 0x00733b8b, 0x00cd4fa0, 0x01f0f150, 0x00c015af, 0x02e191c8, 0x0005384b}}, Y: Field{[10]uint32{0x03efcfb2, 0x01438ea6, 0x020dab15, 0x00c80634, 0x01d487f0, 0x019b5c91, 0x0332ba7c, 0x005e044a, 0x038ee00c, 0x003a5c1e}}}, + {X: Field{[10]uint32{0x009fdf36, 0x01e08f12, 0x003057b5, 0x02d2ba01, 0x003687ea, 0x02b414f9, 0x00dd89f6, 0x00de774b, 0x021e2583, 0x0036b0ee}}, Y: Field{[10]uint32{0x03e2c041, 0x011d171b, 0x03fa4761, 0x010bf4de, 0x02d13a69, 0x00b47b13, 0x0020ab1c, 0x00546557, 0x024d8821, 0x001178f6}}}, + {X: Field{[10]uint32{0x03800bf4, 0x01373faf, 0x00b09264, 0x02eff74b, 0x00a2507d, 0x000e968b, 0x039fad0b, 0x021abba1, 0x027a05c0, 0x00366ff1}}, Y: Field{[10]uint32{0x02be6730, 0x00518d00, 0x02ca42fc, 0x023ac8f9, 0x02e5bb4e, 0x024d243d, 0x036c8b1e, 0x03d6f454, 0x014b5a39, 0x00380577}}}, + {X: Field{[10]uint32{0x0196c61e, 0x01861cde, 0x00b34007, 0x00704bdb, 0x028a9a98, 0x03659660, 0x00d7e581, 0x03283c5c, 0x00522f04, 0x00379bcd}}, Y: Field{[10]uint32{0x032a0cc7, 0x00153bbd, 0x00e3b826, 0x0053fc09, 0x012fc6d8, 0x00d3857c, 0x039c251f, 0x013ea50e, 0x033b28d7, 0x0007b05b}}}, + {X: Field{[10]uint32{0x00e30eaf, 0x02fe0a28, 0x00d93f54, 0x00e93ea3, 0x02b35c87, 0x00d94a0f, 0x00a15ef2, 0x005eba21, 0x0355338e, 0x0010caac}}, Y: Field{[10]uint32{0x01447807, 0x00f73fe5, 0x02b9e870, 0x0029f61a, 0x01caa9af, 0x00830429, 0x023e0767, 0x0036fc22, 0x02a10a13, 0x003d5819}}}, + {X: Field{[10]uint32{0x037c4d99, 0x0102359f, 0x02afa35a, 0x0036d6fa, 0x008d9699, 0x02550c75, 0x010f546d, 0x009f0e8d, 0x0107cfa1, 0x000f4b8d}}, Y: Field{[10]uint32{0x035f74f2, 0x015564e8, 0x02ac51b2, 0x0020aef4, 0x017f4a05, 0x003e288d, 0x01655cab, 0x030dcc51, 0x005f4711, 0x00369822}}}, + {X: Field{[10]uint32{0x00ba87ef, 0x01b94609, 0x0183f457, 0x03180646, 0x03f781c7, 0x017cedc6, 0x0029d0a5, 0x0352f8df, 0x031cb96d, 0x001fcfd0}}, Y: Field{[10]uint32{0x00b8bfec, 0x032009d8, 0x021c1695, 0x03093a45, 0x02cfdb08, 0x01c5dee5, 0x00259f6f, 0x034930ae, 0x03457649, 0x003d37d0}}}, + {X: Field{[10]uint32{0x03687143, 0x00129fcb, 0x017163d6, 0x0357c4a3, 0x026f7b67, 0x015639ab, 0x036cdd8b, 0x01c00112, 0x0359f2c8, 0x00109c2f}}, Y: Field{[10]uint32{0x01a99315, 0x023aaf53, 0x0174e0d0, 0x0037b494, 0x006c4a18, 0x01689549, 0x025da0a1, 0x03e465a1, 0x00ef2e8f, 0x00000d63}}}, + {X: Field{[10]uint32{0x03603852, 0x0256e31f, 0x02ebd46f, 0x02ac3af8, 0x01b7931c, 0x0147194e, 0x013af50d, 0x03f27104, 0x022b9930, 0x003198dc}}, Y: Field{[10]uint32{0x025ecfab, 0x01c237a4, 0x0313f719, 0x0231e3e3, 0x020b9476, 0x00f292cc, 0x0132a310, 0x008f63ad, 0x03b32cdf, 0x000d10f9}}}, + {X: Field{[10]uint32{0x006c4e14, 0x023c58b2, 0x0214f21f, 0x03ce56b9, 0x010168e8, 0x019b95fe, 0x03d7b65c, 0x03fc0b3a, 0x0064e396, 0x002c0052}}, Y: Field{[10]uint32{0x002eb876, 0x02f92e86, 0x0272cb7d, 0x027a8381, 0x004a80b6, 0x02d4048c, 0x025007da, 0x02537bb9, 0x01d7e2ec, 0x000fdb26}}}, + {X: Field{[10]uint32{0x0284f41a, 0x00310436, 0x03b2e125, 0x03d34919, 0x03c2d735, 0x032e0b90, 0x03329f0c, 0x02768d74, 0x019398fe, 0x00193273}}, Y: Field{[10]uint32{0x024372e9, 0x02544555, 0x0105ec8d, 0x01e3fd42, 0x01c223ef, 0x033b7c12, 0x0206fc6d, 0x0180cf44, 0x00ab71bf, 0x003492d4}}}, + {X: Field{[10]uint32{0x0129b766, 0x03f676f3, 0x02736ab4, 0x03533cc9, 0x00ecccfa, 0x009f6e58, 0x0359706b, 0x0161893d, 0x001d51e0, 0x003ff821}}, Y: Field{[10]uint32{0x01cf2562, 0x001d245e, 0x00a0177c, 0x0244c2cd, 0x03eb5d83, 0x01360193, 0x02c15952, 0x01b0413f, 0x01c9f695, 0x001af47c}}}, + {X: Field{[10]uint32{0x03ca7432, 0x034fe6dd, 0x020fa47f, 0x01873c3c, 0x034b4518, 0x03103479, 0x0138d630, 0x03165eeb, 0x00c0c053, 0x00034774}}, Y: Field{[10]uint32{0x0055976f, 0x0288ef5b, 0x0103280b, 0x02b77a4a, 0x035c9dc5, 0x02aabd9a, 0x03b5628d, 0x0257c0f9, 0x03fdb594, 0x000d2aa5}}}, + {X: Field{[10]uint32{0x028e5779, 0x03b2916b, 0x01d8df99, 0x00106c61, 0x019153f7, 0x03e65bc7, 0x0249cd3a, 0x035fde8f, 0x02e8c76b, 0x0021e90d}}, Y: Field{[10]uint32{0x011006f3, 0x02f9e5fc, 0x02027b6d, 0x03fdaa26, 0x00369ea4, 0x0287f0db, 0x0105d5b2, 0x00e113fe, 0x03f91255, 0x00234b3c}}}, + {X: Field{[10]uint32{0x0327c379, 0x03a7b2f7, 0x016e4b59, 0x0037354e, 0x00180107, 0x023f58bb, 0x00f707da, 0x031100e1, 0x00a74899, 0x00295140}}, Y: Field{[10]uint32{0x03cb2668, 0x00d15c8c, 0x02cae2f3, 0x00fc4768, 0x005315df, 0x00b249fe, 0x035b5e57, 0x02ec1817, 0x004a6d26, 0x00388591}}}, + {X: Field{[10]uint32{0x03d8187b, 0x02f54695, 0x00a9c88f, 0x01c821a4, 0x0328417b, 0x012358c8, 0x01aea85b, 0x0067d3e9, 0x00f799a3, 0x0024dfa9}}, Y: Field{[10]uint32{0x03dc9d9d, 0x03215533, 0x027bbb24, 0x036a9f4f, 0x00fce77b, 0x00510e2b, 0x01ce4afd, 0x02bb22df, 0x03fc9eb4, 0x000a4c69}}}, + {X: Field{[10]uint32{0x03fa6f36, 0x02c1766d, 0x03f07a1e, 0x018e3525, 0x02c70608, 0x02c13fc9, 0x00dbc96c, 0x012a8c81, 0x0076bb91, 0x00141e4f}}, Y: Field{[10]uint32{0x00bdab21, 0x00ff59c1, 0x03fbdeb1, 0x000daec7, 0x03d963b6, 0x0077a7bc, 0x00940df4, 0x001d8ada, 0x0078b5e3, 0x002beabf}}}, + {X: Field{[10]uint32{0x02d8bb5a, 0x025d9bc1, 0x01bf13a2, 0x02098755, 0x01f8da52, 0x02ff86b5, 0x011c5709, 0x03959373, 0x0230fada, 0x0022d801}}, Y: Field{[10]uint32{0x032916c0, 0x0108481a, 0x01f4dc11, 0x026e7080, 0x01788538, 0x0164dd30, 0x005a7c38, 0x010e6bb1, 0x024a3bd0, 0x003efc6d}}}, + {X: Field{[10]uint32{0x038c8458, 0x03cf40b9, 0x027bd635, 0x010c8ac5, 0x021fc616, 0x03ff062e, 0x03c96500, 0x0057b68d, 0x03dde32a, 0x00053a22}}, Y: Field{[10]uint32{0x036f02c9, 0x007bfa65, 0x009d735b, 0x004dd809, 0x035cc2cd, 0x01d6bf82, 0x02355be4, 0x003ea97e, 0x02c3dc24, 0x00020b07}}}, + {X: Field{[10]uint32{0x011c6c06, 0x00bf3d26, 0x00a30a91, 0x024bbf1c, 0x01975a3d, 0x031e2c72, 0x013dc028, 0x0211cb51, 0x00a324b6, 0x00308079}}, Y: Field{[10]uint32{0x00e2dc08, 0x01a7a73c, 0x00cee624, 0x02334e37, 0x02a82f5f, 0x031e1a84, 0x03f3e503, 0x039b423a, 0x015441d6, 0x000098ea}}}, + {X: Field{[10]uint32{0x019db4fb, 0x03443b82, 0x035a70c5, 0x00b9846c, 0x01409418, 0x0060a337, 0x0061b1e1, 0x022cfdc6, 0x025d319a, 0x001025d9}}, Y: Field{[10]uint32{0x027a506a, 0x02dc3540, 0x027a85dc, 0x0255415c, 0x03322a6b, 0x01bffb80, 0x02cd1ef5, 0x00ac7d5d, 0x00ebb1aa, 0x0032835f}}}, + {X: Field{[10]uint32{0x0027fa92, 0x03aad26d, 0x037a445d, 0x007cde94, 0x01371334, 0x02f814b6, 0x02021a04, 0x00a4fb74, 0x007aeff9, 0x0005cf4a}}, Y: Field{[10]uint32{0x02432548, 0x02691b05, 0x00e541fb, 0x00b34fe7, 0x0172e530, 0x015c9519, 0x03c37b58, 0x00621b09, 0x0204f03a, 0x002589b8}}}, + {X: Field{[10]uint32{0x014d4256, 0x0086911a, 0x039e78f1, 0x031a3c7c, 0x01227fb8, 0x0098a6fb, 0x014b03c9, 0x00453cc3, 0x034d001b, 0x003248f1}}, Y: Field{[10]uint32{0x035b3d29, 0x004d1016, 0x002731f4, 0x000f62b5, 0x00c9f918, 0x03c089e2, 0x00d1e08e, 0x004e0842, 0x026bdd5e, 0x00163b6f}}}, + {X: Field{[10]uint32{0x00b92d46, 0x0312adc3, 0x01a57c88, 0x02f9b2e4, 0x0393e5a8, 0x025b3cc7, 0x03104c51, 0x0170b4f7, 0x0106b1f2, 0x0024be9e}}, Y: Field{[10]uint32{0x0087f307, 0x0185d472, 0x0024079a, 0x017b3962, 0x00ae99a7, 0x02f34367, 0x0374db62, 0x007f07a3, 0x02bd7934, 0x00284858}}}, + {X: Field{[10]uint32{0x00639140, 0x02a8f102, 0x0294c691, 0x024412ba, 0x00976a9c, 0x034c3577, 0x008e17ee, 0x01e30aa7, 0x01f6f51f, 0x000dd1df}}, Y: Field{[10]uint32{0x00089872, 0x0357f0aa, 0x037305c2, 0x019bd419, 0x0325c3da, 0x0142c114, 0x006e15de, 0x0195b193, 0x02ed1955, 0x001a9a89}}}, + {X: Field{[10]uint32{0x010521bf, 0x03682637, 0x0359667a, 0x0090db17, 0x00be9bc7, 0x02fc03ec, 0x034e78ca, 0x03ce37e0, 0x02591195, 0x002d6cbb}}, Y: Field{[10]uint32{0x01ddd5e4, 0x01c1b885, 0x03e44314, 0x02c03f63, 0x00cc8bae, 0x0146afa4, 0x01d276d9, 0x00c0211b, 0x03859523, 0x00043cdb}}}, + {X: Field{[10]uint32{0x02a137bb, 0x0116c0f4, 0x03630948, 0x00d5dbb2, 0x02560393, 0x034c1fbc, 0x02415e90, 0x006ff8da, 0x01b8443f, 0x0002c174}}, Y: Field{[10]uint32{0x01066cbc, 0x01fc189f, 0x02f6465f, 0x01200f87, 0x0054098f, 0x03c358fe, 0x002a4156, 0x002cb0c4, 0x024bddc9, 0x00267fb3}}}, + {X: Field{[10]uint32{0x01d918fd, 0x01aba281, 0x03179de7, 0x0219b342, 0x03d69dcd, 0x025496d6, 0x03d703ae, 0x02cef73b, 0x01bd4778, 0x003975c4}}, Y: Field{[10]uint32{0x01b64248, 0x0070d71b, 0x01327542, 0x0092bce2, 0x009685d5, 0x03fbd5a4, 0x0088e218, 0x016ca683, 0x00ae5aa0, 0x0022bc05}}}, + {X: Field{[10]uint32{0x02fa4f30, 0x007de1a1, 0x03eb9f4f, 0x00471092, 0x001e217d, 0x0344de66, 0x031c6fc4, 0x0120beff, 0x02b8377a, 0x001dc0f2}}, Y: Field{[10]uint32{0x0084e8b3, 0x000d5c7a, 0x03f0a8e9, 0x03b5082b, 0x008dd329, 0x015a324b, 0x02247fd5, 0x02e36f1f, 0x01d13c80, 0x000cc8fb}}}, + {X: Field{[10]uint32{0x014f3cc8, 0x017d8985, 0x03085540, 0x00b3052c, 0x032c87da, 0x00a910d5, 0x02cf7225, 0x02d220d9, 0x0329c18b, 0x003e0d2b}}, Y: Field{[10]uint32{0x015ab248, 0x0007fb6f, 0x015c2820, 0x0311c5d8, 0x026bd8f7, 0x03f56f31, 0x027dc094, 0x01068a78, 0x02c0ca54, 0x000ba282}}}, + {X: Field{[10]uint32{0x03bbaee0, 0x01d0cd92, 0x03a794c7, 0x01f40740, 0x0213bbcd, 0x007614ab, 0x038ee845, 0x00f18076, 0x013d13f3, 0x001e0ec2}}, Y: Field{[10]uint32{0x00ae5b4b, 0x0326e09d, 0x001ab66e, 0x031c105c, 0x036b5fb1, 0x03b0b3be, 0x00dbfb20, 0x01aaffe8, 0x0301cfde, 0x000eaa42}}}, + {X: Field{[10]uint32{0x001c3391, 0x00b69678, 0x022666f9, 0x02087062, 0x033ae42e, 0x023bcb1d, 0x00a243b4, 0x002e6405, 0x0035a777, 0x002f8f31}}, Y: Field{[10]uint32{0x00e4a701, 0x02a49d97, 0x01c51e6a, 0x00149775, 0x00a560f7, 0x0187af16, 0x01fc64de, 0x02316056, 0x01360911, 0x003c34ef}}}, + {X: Field{[10]uint32{0x003b606d, 0x0024a15e, 0x02a08fc9, 0x001a115d, 0x0197f89e, 0x03fb86b8, 0x03624545, 0x0003bbf8, 0x03d7adac, 0x000fa602}}, Y: Field{[10]uint32{0x01c5c228, 0x00ccffba, 0x0088a34d, 0x00c14ff5, 0x0367455e, 0x03824451, 0x00734347, 0x0251b1d1, 0x0241204c, 0x003193c3}}}, + {X: Field{[10]uint32{0x0182b442, 0x02f3ecb5, 0x027c335b, 0x01517757, 0x0291d7b1, 0x025e435c, 0x0159bf12, 0x0079a8d2, 0x0140aa62, 0x0029ac10}}, Y: Field{[10]uint32{0x03cce830, 0x00705a6a, 0x0137f804, 0x0363b90b, 0x03a997f8, 0x010abdb9, 0x021d1515, 0x01765d79, 0x01e29cc0, 0x00272cb2}}}, + {X: Field{[10]uint32{0x03fa721b, 0x02038a91, 0x002e51f2, 0x00b4888e, 0x0229ba43, 0x00a6cb0e, 0x009a6a1b, 0x032e3e84, 0x003fc133, 0x001fa9ea}}, Y: Field{[10]uint32{0x0299d7e8, 0x01f763a9, 0x031b45bb, 0x01d78e15, 0x026aabab, 0x03450c29, 0x01c5562a, 0x01dcc60c, 0x00e88a1f, 0x0032f8e1}}}, + {X: Field{[10]uint32{0x010fa042, 0x00ab2982, 0x026c8d84, 0x03b851aa, 0x008189f9, 0x0052e9b5, 0x002b5fca, 0x027af8be, 0x007ef0fc, 0x0021497a}}, Y: Field{[10]uint32{0x0332c86f, 0x01c39d5a, 0x022a686c, 0x0391f7f8, 0x00192873, 0x028d295c, 0x02a393f2, 0x028f3c60, 0x0278f311, 0x00373c1a}}}, + {X: Field{[10]uint32{0x03d56dce, 0x029ed06e, 0x00fc0952, 0x03cdb341, 0x0316daff, 0x0197fa59, 0x0129c337, 0x0034327b, 0x037dfa05, 0x001d5569}}, Y: Field{[10]uint32{0x03152177, 0x035bc7c5, 0x019cfd0b, 0x024a0c1a, 0x0118dc03, 0x002bcc44, 0x03d0a3cd, 0x03707f62, 0x00a7bdc3, 0x00261530}}}, + {X: Field{[10]uint32{0x02ac296b, 0x03b85f66, 0x02f710be, 0x02eefb98, 0x00972bb3, 0x00cf8031, 0x026f0261, 0x036b0453, 0x02a07a0a, 0x0027b450}}, Y: Field{[10]uint32{0x037a9d08, 0x0142880a, 0x03f6a391, 0x02144709, 0x009f4dca, 0x01a66bd4, 0x00d4006f, 0x038ee349, 0x02416c80, 0x00307aba}}}, + {X: Field{[10]uint32{0x03c56b79, 0x00ec6a37, 0x029d5fb1, 0x0310b805, 0x00c9d761, 0x00463f60, 0x02aa67c8, 0x02333424, 0x00b3784d, 0x0028ff4b}}, Y: Field{[10]uint32{0x007ea755, 0x02ff56fe, 0x01f6d659, 0x03c9e827, 0x02b0d13d, 0x03243562, 0x00fcdd48, 0x0157cb54, 0x034155db, 0x001d7366}}}, + {X: Field{[10]uint32{0x005ad251, 0x014880d8, 0x0142fc99, 0x038a2edb, 0x01554338, 0x02703884, 0x01ad598b, 0x01fba1e6, 0x0205217e, 0x000aad2f}}, Y: Field{[10]uint32{0x0076d853, 0x03d78c55, 0x01dc7bd8, 0x0320f231, 0x03b788af, 0x00f8791e, 0x008c8eb8, 0x01b529ff, 0x0258da06, 0x000b0a86}}}, + {X: Field{[10]uint32{0x0248c383, 0x02959ee1, 0x033592ce, 0x002767e3, 0x0308c95d, 0x019bb33a, 0x02268af5, 0x006ababd, 0x0088af8c, 0x0012bf0a}}, Y: Field{[10]uint32{0x004f5eed, 0x0164cdaa, 0x0005458b, 0x012f8778, 0x03cf3f28, 0x03a671fa, 0x01025797, 0x03a4ba62, 0x03825e69, 0x002c789a}}}, + {X: Field{[10]uint32{0x018e3d4a, 0x00086d4b, 0x0188b548, 0x03236bf6, 0x02f63f5f, 0x02b070ac, 0x0038600a, 0x0274b920, 0x03aa9231, 0x00376003}}, Y: Field{[10]uint32{0x0039ed7d, 0x006a5dc4, 0x0260ce8e, 0x024853fb, 0x028fdbc1, 0x006206f1, 0x02522ac9, 0x01a35d83, 0x00926e04, 0x00167fa0}}}, + {X: Field{[10]uint32{0x02378c91, 0x029d3cf1, 0x017e2af5, 0x0209b7e7, 0x0007bb51, 0x02bec1fe, 0x039bc886, 0x0297e226, 0x03d1daa3, 0x00212abc}}, Y: Field{[10]uint32{0x0035afbb, 0x030a920e, 0x030e8011, 0x021add13, 0x03a04fd5, 0x0333825a, 0x0331218e, 0x0375be98, 0x02b845ea, 0x003d0592}}}, + {X: Field{[10]uint32{0x03c40b2b, 0x02b4ea09, 0x02fcc8ad, 0x0202e233, 0x00d2ffc1, 0x037feda4, 0x02823a3a, 0x0276e2a4, 0x02c39e2e, 0x002ddc3c}}, Y: Field{[10]uint32{0x000d53e6, 0x01667a37, 0x0122e79f, 0x025f29b3, 0x037e319c, 0x01ba9593, 0x01b90a91, 0x01260974, 0x02370989, 0x0003df1b}}}, + {X: Field{[10]uint32{0x02bb2b29, 0x00879fae, 0x0336236a, 0x021c924f, 0x017cb1db, 0x02c41f32, 0x0145c5fb, 0x039559c0, 0x00a8a0d7, 0x00298182}}, Y: Field{[10]uint32{0x0354de5f, 0x009715de, 0x00e1906f, 0x007ed603, 0x01a289c9, 0x03528e06, 0x0006f906, 0x01152259, 0x027c4e41, 0x000d08d4}}}, + {X: Field{[10]uint32{0x03414597, 0x02d926d4, 0x032d921e, 0x03dff2af, 0x0320f6b0, 0x0324469c, 0x02b4e5fc, 0x00e4e979, 0x00f97b7f, 0x00203d1c}}, Y: Field{[10]uint32{0x03d9adc3, 0x033a7c4a, 0x03e4afa1, 0x01392d6d, 0x03770fa1, 0x004f0fce, 0x028faea0, 0x02f8304c, 0x02f96e1b, 0x0015f63c}}}, + {X: Field{[10]uint32{0x015abb6f, 0x032ccea6, 0x017fe261, 0x036c7c0e, 0x0072e4a3, 0x01929ed6, 0x03f0096c, 0x012330ff, 0x03f21f52, 0x00138446}}, Y: Field{[10]uint32{0x02eb2b9f, 0x02b2eda5, 0x02b0f6d5, 0x0050c7ea, 0x00c03af6, 0x0182f64c, 0x01829c1d, 0x00cefd7f, 0x01721027, 0x0009273c}}}, + {X: Field{[10]uint32{0x022844c9, 0x005b1a31, 0x034f0184, 0x0037ce05, 0x00960cb7, 0x0083a17b, 0x0254660a, 0x00763040, 0x00b547fa, 0x001f6303}}, Y: Field{[10]uint32{0x0335a271, 0x00015c57, 0x00743404, 0x02b87daf, 0x0372b0f1, 0x00d633f4, 0x017335bf, 0x0135e685, 0x023c17ec, 0x000b5e6e}}}, + {X: Field{[10]uint32{0x030a0034, 0x00aabe59, 0x013aaf61, 0x02e26d65, 0x0014b132, 0x016a7cbc, 0x023d48fa, 0x01be95fc, 0x00bd9589, 0x002f0353}}, Y: Field{[10]uint32{0x03a0639d, 0x0283d20b, 0x01412480, 0x00fca3a9, 0x0383d756, 0x015dcef2, 0x02410915, 0x019605e9, 0x02707b31, 0x003d7419}}}, + {X: Field{[10]uint32{0x02d37a40, 0x039c3ead, 0x006a42df, 0x029a9f99, 0x015cceb0, 0x024c8785, 0x02ddbe1c, 0x03445657, 0x02aead08, 0x002c5528}}, Y: Field{[10]uint32{0x0216592a, 0x01794fcc, 0x00756c8b, 0x0234278f, 0x0217120d, 0x0257225b, 0x01e586f6, 0x0344af40, 0x0221674d, 0x0026aeb7}}}, + {X: Field{[10]uint32{0x0372e1e4, 0x01729615, 0x03325531, 0x0159f91d, 0x02314be7, 0x0107f8b9, 0x013bc318, 0x001bc9c1, 0x0034a6ce, 0x003bd80f}}, Y: Field{[10]uint32{0x009ad65d, 0x02b965f1, 0x00f5164a, 0x023cef42, 0x0115fced, 0x0206688c, 0x03a7e57d, 0x02c2e648, 0x022896f3, 0x003e7aef}}}, + {X: Field{[10]uint32{0x02aa9376, 0x0388ffa0, 0x016e2c04, 0x03686b12, 0x01014f7b, 0x02b70010, 0x01a05d91, 0x007aeeb5, 0x036c2d90, 0x00298045}}, Y: Field{[10]uint32{0x02e88ab8, 0x0228c0c6, 0x01e68f8c, 0x03e74fab, 0x03d59abc, 0x03a450dd, 0x032fb849, 0x00d924dd, 0x01b7ce0c, 0x003de077}}}, + {X: Field{[10]uint32{0x0031e6a7, 0x00c54e57, 0x007eb273, 0x03bcea40, 0x03b1c7f0, 0x0326a409, 0x03968b9b, 0x00413bea, 0x0147b6b3, 0x002af105}}, Y: Field{[10]uint32{0x017e0ec9, 0x02e28df6, 0x00dce879, 0x034d498a, 0x03594c5b, 0x035e0e66, 0x00a1821d, 0x0075bef6, 0x00a228f2, 0x00334a16}}}, + {X: Field{[10]uint32{0x007f5a81, 0x038e85f6, 0x008a92f2, 0x029b4c6d, 0x02941d1d, 0x009b904e, 0x024c4300, 0x031c86cb, 0x010500c9, 0x0024a240}}, Y: Field{[10]uint32{0x0260a5da, 0x025fca36, 0x03e2bb30, 0x02669f2f, 0x0015c223, 0x004ed1f1, 0x0032e17c, 0x03185c79, 0x007b1bdc, 0x003072b6}}}, + {X: Field{[10]uint32{0x037ca563, 0x01129f70, 0x00228ad1, 0x0201af59, 0x00500a7a, 0x0251da43, 0x02468319, 0x00d7291a, 0x02a69f4b, 0x00394837}}, Y: Field{[10]uint32{0x022a82de, 0x02c34f22, 0x03356638, 0x002b6d9c, 0x01e2330b, 0x02b538b6, 0x0355dda6, 0x023efa40, 0x0366ac3f, 0x001b0035}}}, + {X: Field{[10]uint32{0x017fadc4, 0x00b5c071, 0x03fb3750, 0x005463c3, 0x02ac2e93, 0x035bbc97, 0x03d18a79, 0x03c70695, 0x0223e2b3, 0x00300cde}}, Y: Field{[10]uint32{0x00808b65, 0x00851bd4, 0x021eccdd, 0x00e3db81, 0x017ac7e9, 0x001e95c3, 0x029c3d5b, 0x037cd51c, 0x0073be22, 0x003f3a96}}}, + {X: Field{[10]uint32{0x0181ac04, 0x0049e6ca, 0x0193cfa5, 0x02583d4d, 0x001b796a, 0x00b47589, 0x01fb6a76, 0x00b01dad, 0x02bb6a8e, 0x0009db18}}, Y: Field{[10]uint32{0x021afc1a, 0x00ba85db, 0x0292b73e, 0x01e0223d, 0x00773c45, 0x01a588db, 0x01284d7d, 0x000748fe, 0x025abb6b, 0x001714e9}}}, + {X: Field{[10]uint32{0x01663a5f, 0x00776fa3, 0x01ed4fad, 0x01bd9ea7, 0x00c4a2de, 0x00f23b79, 0x037ccdd4, 0x00770ae0, 0x0287e505, 0x00181387}}, Y: Field{[10]uint32{0x03429bee, 0x001ac9e2, 0x0034902d, 0x01ce670d, 0x02ace4c4, 0x01113618, 0x014d6759, 0x0065ce4f, 0x023ce351, 0x003dc3f8}}}, + {X: Field{[10]uint32{0x0041f6fa, 0x038e21d7, 0x00eec3b6, 0x02bbdf93, 0x024aba16, 0x03a40e6e, 0x00b05be5, 0x02441b56, 0x011f470d, 0x003cbf05}}, Y: Field{[10]uint32{0x01e98de0, 0x02a485b8, 0x037b85d2, 0x01ce705a, 0x00d41887, 0x001da418, 0x027f2d6e, 0x01718f63, 0x02c7f1aa, 0x003d26f4}}}, + {X: Field{[10]uint32{0x000ac560, 0x0240b84d, 0x00315eb0, 0x025359ac, 0x007ee0b2, 0x0391babe, 0x001d9cd7, 0x00d3bcee, 0x03460e9f, 0x002380c4}}, Y: Field{[10]uint32{0x00394296, 0x00517e4b, 0x00dca450, 0x023003b0, 0x02006b02, 0x03b81413, 0x027441c0, 0x00787944, 0x00bda5e2, 0x003fc032}}}, + {X: Field{[10]uint32{0x01a9970b, 0x027d03f9, 0x01a0a96b, 0x02cea174, 0x03d4e26e, 0x02ca553a, 0x021cbe16, 0x01ea3c9e, 0x031ad75b, 0x002a1a03}}, Y: Field{[10]uint32{0x02070c01, 0x0065cef9, 0x024c6950, 0x02fb10a5, 0x02757401, 0x00fd4a25, 0x03281f2a, 0x036b18e5, 0x0341a55b, 0x001831af}}}, + {X: Field{[10]uint32{0x004f4658, 0x039b1bd4, 0x03066128, 0x00035372, 0x0009ca8c, 0x002171e5, 0x03407c05, 0x00ba8780, 0x01e7f4d8, 0x00135a28}}, Y: Field{[10]uint32{0x03d1ce76, 0x009979e8, 0x02af4d36, 0x0028e99c, 0x0126a955, 0x030db75b, 0x0295d2d2, 0x00da44aa, 0x0211e5dd, 0x00217177}}}, + {X: Field{[10]uint32{0x02c2a7a9, 0x02882bb9, 0x024835c6, 0x0306b9e2, 0x01758c0b, 0x0340bace, 0x003cdc1b, 0x021925a6, 0x001c2a6d, 0x000dc23d}}, Y: Field{[10]uint32{0x03ec4152, 0x014febea, 0x039e7f45, 0x01171c2b, 0x023c2b71, 0x02aac64f, 0x01ae0f87, 0x03d77572, 0x019e79b7, 0x000c42de}}}, + {X: Field{[10]uint32{0x0115f059, 0x038de028, 0x01a92f6c, 0x0334eaec, 0x022d1a18, 0x00fd6dcc, 0x03961814, 0x02317fc6, 0x01674502, 0x0023220e}}, Y: Field{[10]uint32{0x020725d8, 0x0229f9d8, 0x00e10b00, 0x01097237, 0x0040128e, 0x019b761f, 0x03441800, 0x01212830, 0x02d4e4ae, 0x0009158e}}}, + {X: Field{[10]uint32{0x018f8fb0, 0x0387fd35, 0x0305d0a0, 0x03098d08, 0x03652e83, 0x0129c98e, 0x010fd1a9, 0x01eb4ef7, 0x036a7b37, 0x00311179}}, Y: Field{[10]uint32{0x03acc89d, 0x033a9872, 0x01b8cc94, 0x039c8c19, 0x02f60ae2, 0x02ab9f71, 0x03bd3c13, 0x036d84eb, 0x001adc8d, 0x0012fd69}}}, + {X: Field{[10]uint32{0x02419f16, 0x03d976a3, 0x02e8deb2, 0x017bb6ab, 0x0236949d, 0x0292e7f5, 0x019f1d4d, 0x00d7f983, 0x013ac8a6, 0x0012b658}}, Y: Field{[10]uint32{0x00b0d7c4, 0x02d2545a, 0x0331642a, 0x01ded2c1, 0x01387458, 0x03c6a06e, 0x0131c83e, 0x0283eceb, 0x03068f67, 0x0016a6d6}}}, + {X: Field{[10]uint32{0x0360c943, 0x0074a7f5, 0x00b0c20d, 0x02f163a4, 0x022e397f, 0x0122a998, 0x0349d776, 0x03f9b26a, 0x02e1958b, 0x002facfa}}, Y: Field{[10]uint32{0x0382c9b8, 0x03bfe200, 0x02678dba, 0x01edaa08, 0x03ec76f2, 0x02a9a36b, 0x01dc6fb5, 0x019eac89, 0x02bef43a, 0x00035691}}}, + {X: Field{[10]uint32{0x0134f397, 0x026867f4, 0x018ab9df, 0x0050f900, 0x034623fc, 0x035281da, 0x03f1daea, 0x0086cef8, 0x02b0bc0e, 0x002aaa6a}}, Y: Field{[10]uint32{0x0342e40b, 0x01c0ee89, 0x0390ed3c, 0x03e2ead9, 0x02d3f094, 0x03e8b6b4, 0x000347e8, 0x00b1969b, 0x03fe1964, 0x000271f5}}}, + {X: Field{[10]uint32{0x0199dc52, 0x035a956b, 0x01356604, 0x01867f57, 0x00d40116, 0x0073e749, 0x017ae86f, 0x03d118bf, 0x028999d6, 0x00154f07}}, Y: Field{[10]uint32{0x0150cebc, 0x002f5bfd, 0x004ed646, 0x0250de4d, 0x013f6fe4, 0x01f17c37, 0x02ba776f, 0x02b169b4, 0x013b8410, 0x0009ad03}}}, + {X: Field{[10]uint32{0x02a1abc8, 0x03afe096, 0x0128ab47, 0x0025567b, 0x00c3d565, 0x01c97581, 0x00dae9c4, 0x023f10e6, 0x01ea3637, 0x00216621}}, Y: Field{[10]uint32{0x000687f5, 0x00c7f3fc, 0x030669e5, 0x02a8f102, 0x020e6e84, 0x02cb458d, 0x02fd9305, 0x02e58eec, 0x02f9fc74, 0x003eb96b}}}, + {X: Field{[10]uint32{0x00368f93, 0x01ef7bbc, 0x0254b0bb, 0x00ca9c31, 0x0189e510, 0x00ee08d1, 0x00bf7c16, 0x01752155, 0x0118679c, 0x0017ec28}}, Y: Field{[10]uint32{0x03c2a2d0, 0x03c6099a, 0x00c70a4c, 0x02b4e765, 0x005b9966, 0x02e5761a, 0x0302111e, 0x005b4efe, 0x01f04a68, 0x0003a355}}}, + {X: Field{[10]uint32{0x00f91dfa, 0x02fa0be5, 0x00302194, 0x0175df39, 0x02bbed44, 0x039c376b, 0x03d737c1, 0x03854f26, 0x034786f3, 0x00029090}}, Y: Field{[10]uint32{0x03beed46, 0x00595239, 0x02496971, 0x02963b04, 0x01a54239, 0x0096da7f, 0x0012f4df, 0x03f6a704, 0x02d6abd9, 0x0009f472}}}, + {X: Field{[10]uint32{0x00c821e7, 0x006e4868, 0x003eef57, 0x0115cac2, 0x00394659, 0x01ca4c43, 0x028213cc, 0x0307ce82, 0x0108063f, 0x0017401d}}, Y: Field{[10]uint32{0x02b2df3a, 0x00744aff, 0x007f939f, 0x0205ac10, 0x02d99bfa, 0x0048e121, 0x00c26056, 0x01681ecb, 0x03c45d05, 0x00394e3e}}}, + {X: Field{[10]uint32{0x002e3db9, 0x00bd7a0a, 0x02a525f8, 0x02a9c737, 0x01e80393, 0x012aadfe, 0x00605a0e, 0x000a1a4d, 0x01b897b1, 0x0028fac9}}, Y: Field{[10]uint32{0x01e7f77d, 0x00f60fdc, 0x00c6f030, 0x022f9a24, 0x036beec5, 0x00a259f1, 0x036baaf1, 0x03117908, 0x00c21430, 0x0038acd5}}}, + {X: Field{[10]uint32{0x0097981b, 0x00b8273a, 0x01f0fff7, 0x01453a8d, 0x021e309e, 0x0043f205, 0x033f51cd, 0x00c80a5b, 0x02208a13, 0x001cfd8c}}, Y: Field{[10]uint32{0x02420179, 0x03b41cc2, 0x01dc4015, 0x01ea286d, 0x02309525, 0x00d26a4b, 0x01f7ded0, 0x03ccbb5b, 0x0159cc78, 0x0010d04a}}}, + {X: Field{[10]uint32{0x00da41af, 0x03b139d2, 0x01bb4ccf, 0x00b7c6ee, 0x00776051, 0x01811992, 0x00d9628f, 0x02d7ce3c, 0x01d1c21b, 0x0017c209}}, Y: Field{[10]uint32{0x025c0cab, 0x0108e7ff, 0x02323b37, 0x02e30925, 0x005becd4, 0x01964a09, 0x031abd5b, 0x03784a13, 0x020e1d95, 0x0037aeb1}}}, + {X: Field{[10]uint32{0x03d84294, 0x00967fbd, 0x0276da10, 0x03ff19a9, 0x02efc26d, 0x03448a53, 0x023f624c, 0x03a7cbeb, 0x02f2b4a8, 0x003310a9}}, Y: Field{[10]uint32{0x03230519, 0x0383850e, 0x016901ba, 0x0385a804, 0x03118a7a, 0x02d7ec5f, 0x03f2adb2, 0x02f417c4, 0x0200f92c, 0x00246c99}}}, + {X: Field{[10]uint32{0x03635a17, 0x0000bb1b, 0x022618f0, 0x035af44d, 0x034de0c5, 0x03bef347, 0x01aad7a8, 0x0384fea0, 0x00e76eeb, 0x001f55b8}}, Y: Field{[10]uint32{0x03fa1ad8, 0x004eb090, 0x01754f7d, 0x03b156a4, 0x00051122, 0x03a9779f, 0x01ca813e, 0x038fb91b, 0x0307fe55, 0x00255189}}}, + {X: Field{[10]uint32{0x03a5be61, 0x015301bd, 0x00dc6add, 0x03f0f1d9, 0x02fba8ca, 0x02b6d5ad, 0x03605b3a, 0x017b12b2, 0x021b4fe8, 0x001e5cad}}, Y: Field{[10]uint32{0x02b8c7d8, 0x0249b24c, 0x037dd9f4, 0x03397516, 0x024764c4, 0x011aa3a4, 0x00f5141c, 0x03e9ba9f, 0x02702642, 0x002e8619}}}, + {X: Field{[10]uint32{0x01025626, 0x00208d75, 0x02e0bbbe, 0x01fcd87e, 0x034344c8, 0x019d3e43, 0x01f63609, 0x00540226, 0x0040347b, 0x003b7229}}, Y: Field{[10]uint32{0x032cd77b, 0x007b3106, 0x024864d0, 0x008a6947, 0x027bf841, 0x034502cb, 0x00c7cefa, 0x02fd666f, 0x03409a14, 0x000be049}}}, + {X: Field{[10]uint32{0x01b16899, 0x021df34f, 0x00d18d54, 0x02fc9558, 0x02d4ea1b, 0x027e6661, 0x0327b571, 0x03d354bd, 0x01c97a8c, 0x002f66d9}}, Y: Field{[10]uint32{0x02fe432d, 0x02638af0, 0x019af7db, 0x00fd77fa, 0x01ee9c8e, 0x02f93e18, 0x00d9e02d, 0x023972fc, 0x01274e87, 0x001673dc}}}, + {X: Field{[10]uint32{0x00f35782, 0x038ab313, 0x02106f3b, 0x00096542, 0x0072d918, 0x01317636, 0x03565714, 0x03a3334d, 0x02381191, 0x0009d8d7}}, Y: Field{[10]uint32{0x00d1ab7d, 0x0264bdc3, 0x00ce9db1, 0x03cdf9ae, 0x00eb5251, 0x03d46eb5, 0x03fa3ab8, 0x021c3401, 0x0247a019, 0x0030d67f}}}, + {X: Field{[10]uint32{0x0321d85c, 0x0377c84e, 0x03261839, 0x03d2577e, 0x00359950, 0x01e803a6, 0x02abad14, 0x014c02a5, 0x00c316c0, 0x001124b7}}, Y: Field{[10]uint32{0x009ad35b, 0x00d3b5f7, 0x02433189, 0x02fe9630, 0x02fafed4, 0x008a7716, 0x03b8c6d2, 0x00790b6f, 0x0371a4e8, 0x0003b7c4}}}, + {X: Field{[10]uint32{0x01f9c67b, 0x02a981bb, 0x03c01279, 0x031b3b8d, 0x0325887f, 0x02f623e3, 0x028a3869, 0x00079637, 0x0040409e, 0x003e0493}}, Y: Field{[10]uint32{0x026fa6bc, 0x01830868, 0x009d3655, 0x0231879d, 0x022b0f00, 0x035fcd98, 0x026269c3, 0x03b82a28, 0x01d1d31f, 0x0003801c}}}, + {X: Field{[10]uint32{0x0205a2b5, 0x0212f0e6, 0x030b1b57, 0x00ce3d57, 0x02ce3aed, 0x03579470, 0x000716ad, 0x03337e8b, 0x0367066e, 0x0033165e}}, Y: Field{[10]uint32{0x00682865, 0x00e9061d, 0x022da74e, 0x039fcfbc, 0x03df52da, 0x00a3a356, 0x0212ec40, 0x010f6747, 0x01fc394a, 0x0004b80c}}}, + {X: Field{[10]uint32{0x005aeda2, 0x034c78a0, 0x022ee6fd, 0x01c698c8, 0x03d4a45f, 0x03549774, 0x01642707, 0x020fef48, 0x02c6bc12, 0x00050b2c}}, Y: Field{[10]uint32{0x02d66ec0, 0x017b7197, 0x02f2e181, 0x03edf1a1, 0x00ed082b, 0x02fb1916, 0x015b7180, 0x0108ab93, 0x0112c72c, 0x002f7a4f}}}, + {X: Field{[10]uint32{0x001d2d3c, 0x03645230, 0x0147968f, 0x01d78fc3, 0x01c33273, 0x02a25dea, 0x016704a1, 0x0165079a, 0x0202dd76, 0x003efd35}}, Y: Field{[10]uint32{0x006afa8d, 0x03c4e5b0, 0x0118d08e, 0x02ca6bdf, 0x00c7b96f, 0x01a3d858, 0x014cae8e, 0x02572e9b, 0x01f799e8, 0x00196d1b}}}, + {X: Field{[10]uint32{0x01bfffb8, 0x0048f863, 0x02bc7c6d, 0x036f3163, 0x01f09436, 0x03053143, 0x0300ea5e, 0x03a3338c, 0x0157bb5f, 0x003bf6d7}}, Y: Field{[10]uint32{0x0203fe01, 0x01ee2900, 0x00deb813, 0x01fb7758, 0x01d444e4, 0x019ef627, 0x019ce931, 0x00318988, 0x0003d9a9, 0x000e420e}}}, + {X: Field{[10]uint32{0x003f35ad, 0x0241d08b, 0x03d74976, 0x03c7ab7a, 0x02921f59, 0x01afcb53, 0x00b36c7b, 0x00155c2d, 0x0334faa3, 0x0016f290}}, Y: Field{[10]uint32{0x021206e3, 0x03489ef0, 0x0345b520, 0x00a8d4fe, 0x0179d27f, 0x03591b6d, 0x03f2fe1c, 0x018fdc8a, 0x02f5e2a6, 0x000f25ee}}}, + {X: Field{[10]uint32{0x01156632, 0x03c7cfd4, 0x00d4c49f, 0x025c69cf, 0x01ff921e, 0x012a9990, 0x018a0f05, 0x03c1956b, 0x03bce90c, 0x0026a876}}, Y: Field{[10]uint32{0x031a4200, 0x00efd00a, 0x012dc651, 0x01eae404, 0x016e0b33, 0x02730449, 0x002f0f0b, 0x03a176e0, 0x001d8bf1, 0x0032fdba}}}, + {X: Field{[10]uint32{0x03c2d408, 0x02a5589c, 0x01b86aba, 0x01bfbfc2, 0x035386e5, 0x037b0a09, 0x01d4d23d, 0x01d9d935, 0x005586ed, 0x000bf1ff}}, Y: Field{[10]uint32{0x01d6285f, 0x0272041a, 0x03f3f54f, 0x01617531, 0x016019a5, 0x000c42d7, 0x037b0c3e, 0x00d2bb91, 0x01e4773c, 0x0016ffda}}}, + {X: Field{[10]uint32{0x034190b2, 0x03332ef4, 0x03f34764, 0x00403cbf, 0x026ef3b2, 0x0037e445, 0x01954878, 0x01bcb10c, 0x0141c3ac, 0x002397ee}}, Y: Field{[10]uint32{0x0110d2ce, 0x026ebaff, 0x02c4b1df, 0x027b73c6, 0x038d29b5, 0x039eccbe, 0x03ae154c, 0x01a38b18, 0x01b15f66, 0x0036f8b0}}}, + {X: Field{[10]uint32{0x033d49c6, 0x006f5842, 0x03690480, 0x001c99a4, 0x02dcfbaa, 0x02a56e36, 0x013389ea, 0x035b7417, 0x03594748, 0x001e96ee}}, Y: Field{[10]uint32{0x034187c0, 0x03b7ab18, 0x03fa7fd4, 0x0073bff8, 0x00ca1386, 0x0048d71a, 0x00b755c6, 0x00cffa36, 0x0043a42d, 0x0030b4a0}}}, + {X: Field{[10]uint32{0x03b76753, 0x03ebc86f, 0x00745f87, 0x0388894d, 0x00917c2f, 0x02d8c738, 0x033ee1b1, 0x00d4c6b9, 0x00bdf0d3, 0x00256fae}}, Y: Field{[10]uint32{0x0064f45b, 0x030bc2c3, 0x00adaa43, 0x020df88c, 0x03b9bd77, 0x01283932, 0x03e269fb, 0x0165d549, 0x0200d9c5, 0x0031b3e1}}}, + {X: Field{[10]uint32{0x02968d25, 0x003488f8, 0x03a32054, 0x0365dae3, 0x03576dbb, 0x002ae5e4, 0x00fa4809, 0x01b700c1, 0x030c6d89, 0x003d13b2}}, Y: Field{[10]uint32{0x0321086a, 0x027cd4f0, 0x038106d1, 0x003d79db, 0x01e20e47, 0x03a91a82, 0x0203c629, 0x010ca5da, 0x00f62964, 0x00151419}}}, + {X: Field{[10]uint32{0x038109de, 0x01274994, 0x01e074fb, 0x0309dc18, 0x01d56d68, 0x03deb899, 0x033ef501, 0x024db985, 0x00d33dbd, 0x002374cb}}, Y: Field{[10]uint32{0x003f1e76, 0x0217dc1f, 0x00851ae9, 0x00968430, 0x00ad158c, 0x011f5b64, 0x012bca8a, 0x02b0814e, 0x025c80da, 0x001ac443}}}, + {X: Field{[10]uint32{0x0237997b, 0x01d77698, 0x01a8c770, 0x00fe2473, 0x010fea5e, 0x01c74113, 0x03bc77eb, 0x03d5e353, 0x0130b0f0, 0x000f52bf}}, Y: Field{[10]uint32{0x018bb9ce, 0x02c7bf01, 0x0093ed83, 0x02af9d21, 0x020ae286, 0x02708eb6, 0x013d4424, 0x03d5fb1e, 0x00e8664d, 0x000a05b8}}}, + {X: Field{[10]uint32{0x01d95ff1, 0x03ff45e1, 0x020200a5, 0x0204b4af, 0x02b83913, 0x01a81ee8, 0x015ccac8, 0x00ec8aca, 0x01fbbeaa, 0x002a6dce}}, Y: Field{[10]uint32{0x03b84f1b, 0x016cabaf, 0x02d401a5, 0x00ae3b5e, 0x00d3c5d4, 0x0310ff7b, 0x016d7323, 0x029abbda, 0x023021d6, 0x00287420}}}, + {X: Field{[10]uint32{0x0203715a, 0x01fd1ae4, 0x03632bb7, 0x019eb3e6, 0x02a37e5d, 0x022d5659, 0x02cc754c, 0x0147aff0, 0x0347e512, 0x003a4025}}, Y: Field{[10]uint32{0x02f9df72, 0x036ad3f3, 0x03907d9c, 0x01e85f38, 0x00756f27, 0x015c6962, 0x03476f25, 0x03e65dc6, 0x01679ea8, 0x000d0962}}}, + {X: Field{[10]uint32{0x021a3f2e, 0x01d90e7c, 0x006c1a83, 0x0104eb13, 0x002108fe, 0x02ccc821, 0x00d09b96, 0x035d3309, 0x00ed55aa, 0x001f8d23}}, Y: Field{[10]uint32{0x00389e5f, 0x033e0fad, 0x020f91ed, 0x00bcd964, 0x01c884c2, 0x010e793d, 0x0065706e, 0x009e5761, 0x038e3b72, 0x000e61d3}}}, + {X: Field{[10]uint32{0x03b1f55a, 0x029d29be, 0x01220aaa, 0x02da2834, 0x038e340f, 0x003f3034, 0x032cdabf, 0x035c055b, 0x02765ec2, 0x0029f759}}, Y: Field{[10]uint32{0x0341d447, 0x029439cb, 0x00e73760, 0x02b5117a, 0x0163710d, 0x02c02efa, 0x02ded9b0, 0x0298f4a4, 0x03f2ab00, 0x002dc246}}}, + {X: Field{[10]uint32{0x03f57025, 0x02354780, 0x03a96a30, 0x00a91a4f, 0x0051c085, 0x01b624d3, 0x0033a481, 0x032fdb70, 0x01e9a8cc, 0x0002e15e}}, Y: Field{[10]uint32{0x0158268b, 0x0337315c, 0x00feca8b, 0x00cdbda5, 0x0242c888, 0x02f046f6, 0x0164a3e0, 0x00546cbc, 0x00df4d79, 0x0039a5bb}}}, + {X: Field{[10]uint32{0x03f57af8, 0x00b0b0af, 0x03cdabb4, 0x007519e1, 0x03184f1c, 0x01ed669f, 0x00c8c72e, 0x002032fe, 0x00459de0, 0x0001eca7}}, Y: Field{[10]uint32{0x03801799, 0x011b7a57, 0x026145dc, 0x02dc97d3, 0x02817578, 0x000ddbb7, 0x0101ca56, 0x0344f506, 0x0367a6d8, 0x001037a0}}}, + {X: Field{[10]uint32{0x02f00f9f, 0x026bf765, 0x0214e017, 0x0276cc7f, 0x030d1c4e, 0x002df940, 0x020e34ef, 0x016f9eb0, 0x026f89b6, 0x00073bfe}}, Y: Field{[10]uint32{0x0276f179, 0x01d12d46, 0x02da979a, 0x03d6f2a9, 0x008e293b, 0x005e4384, 0x018feb78, 0x00c2f7b6, 0x00b1f059, 0x001bf7ba}}}, + {X: Field{[10]uint32{0x01e58d74, 0x0365f645, 0x01e47ca2, 0x03fa8013, 0x0280ba4e, 0x00078bb1, 0x01d01e9a, 0x000715b5, 0x016d11d3, 0x00155b8b}}, Y: Field{[10]uint32{0x0249d711, 0x00b175d4, 0x0096108a, 0x031cbd36, 0x013d66e6, 0x03bb2f26, 0x01ba7eef, 0x035edad5, 0x009bb633, 0x0025620d}}}, + {X: Field{[10]uint32{0x01e51586, 0x02ae45e8, 0x026ba6a7, 0x03d3a7b9, 0x02b97f7b, 0x00ad8ba8, 0x004518a4, 0x00f723b4, 0x028873b9, 0x002cd41b}}, Y: Field{[10]uint32{0x030b3b38, 0x00eb9306, 0x023fd582, 0x027c7e3f, 0x025917a3, 0x02b2ea7f, 0x0293eaa7, 0x03edeff9, 0x01001230, 0x0011d3e0}}}, + {X: Field{[10]uint32{0x012628f3, 0x01d2e5af, 0x00504e97, 0x00e86665, 0x001ba7ff, 0x0243b99f, 0x001a886f, 0x0124236c, 0x02f389cb, 0x0003461a}}, Y: Field{[10]uint32{0x02a2db7d, 0x023dfbbc, 0x0021d5d0, 0x01bfd046, 0x02d01d74, 0x0218bbcd, 0x0378c75a, 0x01f372d1, 0x002bc656, 0x000ece5e}}}, + {X: Field{[10]uint32{0x03987bb7, 0x02215cbb, 0x00d55d67, 0x0200aa04, 0x0119e8c9, 0x018b18e7, 0x02459000, 0x016b08fe, 0x0121e106, 0x003e5476}}, Y: Field{[10]uint32{0x01d7d950, 0x002631fe, 0x0207055d, 0x019aedda, 0x01051abc, 0x03d54ed7, 0x03db2397, 0x03a5d409, 0x01c187f8, 0x00373df7}}}, + {X: Field{[10]uint32{0x00d915ec, 0x00f83eb1, 0x0242ebb5, 0x01d3f20a, 0x038bcbf8, 0x03cd0382, 0x021b75e8, 0x01bf1845, 0x02167bac, 0x002373a3}}, Y: Field{[10]uint32{0x00ae940c, 0x004985f8, 0x03674e32, 0x03d240cb, 0x039c0287, 0x01349bb5, 0x00b410b3, 0x02e7ae6d, 0x03a14a9e, 0x00047394}}}, + {X: Field{[10]uint32{0x01e26e2b, 0x00e7baa6, 0x005dc4f4, 0x016bb56a, 0x02755dfc, 0x0304a9ea, 0x012ed15e, 0x0290f35f, 0x00dda0a7, 0x00338b4f}}, Y: Field{[10]uint32{0x03a5a145, 0x025f1801, 0x0009a36b, 0x0191f886, 0x036a8eed, 0x03160881, 0x035c2853, 0x009d03a9, 0x02bbe7ca, 0x001aa5ab}}}, + {X: Field{[10]uint32{0x00d92092, 0x00e42a37, 0x000f05ea, 0x00295632, 0x00f712c4, 0x020ce492, 0x03367b5c, 0x0353173b, 0x02fcdcc2, 0x0008e519}}, Y: Field{[10]uint32{0x03ac28cd, 0x02157849, 0x0318ed0e, 0x02acedf5, 0x0265d176, 0x023805cd, 0x023ee8e9, 0x03c22f29, 0x023c9b49, 0x003cb388}}}, + {X: Field{[10]uint32{0x0163e033, 0x0297fb8d, 0x0395e0f6, 0x01911d98, 0x034a2f3c, 0x00c7825c, 0x005bcd83, 0x00f02367, 0x0364341d, 0x000882ad}}, Y: Field{[10]uint32{0x02df5011, 0x03360dd5, 0x03f4cf9d, 0x028d5e05, 0x03aa51a9, 0x02d48300, 0x03dc7a42, 0x004fbd19, 0x0060d030, 0x003b0791}}}, + {X: Field{[10]uint32{0x004b469f, 0x03ffa024, 0x03db4ee2, 0x004993e8, 0x02845f0b, 0x00f13443, 0x03ffd81f, 0x01a9b1c3, 0x01fe1640, 0x00355157}}, Y: Field{[10]uint32{0x020aaf9a, 0x00428401, 0x019b8088, 0x03c0abe5, 0x0028a20a, 0x0056125f, 0x01d99e49, 0x00798899, 0x038d257e, 0x00283e4e}}}, + {X: Field{[10]uint32{0x00e60c72, 0x03627ca2, 0x0137e1a9, 0x03e73f07, 0x02f5039c, 0x007bb034, 0x0054665f, 0x03c1777c, 0x0377a1f6, 0x00148d9c}}, Y: Field{[10]uint32{0x02c7bb41, 0x027f1767, 0x01ce6a03, 0x005b663e, 0x00d05e70, 0x038925e8, 0x018d0477, 0x030d4b35, 0x0355430f, 0x001e3627}}}, + {X: Field{[10]uint32{0x03a56395, 0x0377a957, 0x02c9f4c1, 0x03c644b9, 0x01a8e569, 0x01cd9049, 0x023dc886, 0x0250889a, 0x01133ecc, 0x0016e658}}, Y: Field{[10]uint32{0x02436d0a, 0x010abd93, 0x00f19101, 0x02a84226, 0x03f7a0bc, 0x0178bf57, 0x00ac902c, 0x01b2bd76, 0x03641207, 0x002ee75d}}}, + {X: Field{[10]uint32{0x004c13fb, 0x0093ccae, 0x00f0c07c, 0x010f6e5b, 0x03eecd1a, 0x02c299dc, 0x007fa4a5, 0x03479963, 0x035cbfbe, 0x003cdb36}}, Y: Field{[10]uint32{0x018c394c, 0x01b24640, 0x039b9315, 0x039d1e4d, 0x01993744, 0x006d8996, 0x016aee18, 0x03b68a45, 0x02f05ee9, 0x0033f1b4}}}, + {X: Field{[10]uint32{0x0079a6f9, 0x017ee45c, 0x03e44059, 0x00cc43b1, 0x030842ce, 0x014c499b, 0x00bf7545, 0x01ebcace, 0x018e2510, 0x000c8231}}, Y: Field{[10]uint32{0x02c785d7, 0x011d628c, 0x001c645a, 0x028b2220, 0x03653599, 0x0257b0b2, 0x01d9ab58, 0x02db2581, 0x01cb5346, 0x0020c71b}}}, + {X: Field{[10]uint32{0x009927a7, 0x014e4623, 0x025a8c52, 0x020d9406, 0x02472535, 0x01135cd5, 0x0021b80b, 0x00438aa8, 0x02071f85, 0x002981ce}}, Y: Field{[10]uint32{0x0364fec9, 0x03c64698, 0x032462a9, 0x00361600, 0x026fefa3, 0x033f26ee, 0x0318baad, 0x01d84859, 0x03c54c8a, 0x003a4ea7}}}, + {X: Field{[10]uint32{0x01f0d913, 0x00d5d62e, 0x007139e3, 0x01f8d589, 0x00f7ec1a, 0x02a9fffa, 0x00f21476, 0x02bdfc98, 0x0062f79e, 0x000cd42d}}, Y: Field{[10]uint32{0x01152959, 0x01c5c448, 0x00d4e805, 0x02f120a9, 0x03020f33, 0x02a34ba4, 0x03d2341b, 0x0048883e, 0x01b30fce, 0x0007c327}}}, + {X: Field{[10]uint32{0x03073caa, 0x03893380, 0x0344c11d, 0x00f99bd9, 0x00177391, 0x02859433, 0x007c89b5, 0x00a9d248, 0x03170bc8, 0x00295356}}, Y: Field{[10]uint32{0x02cd3ab8, 0x01edec4c, 0x033afcdb, 0x009be4ad, 0x02fe62dc, 0x02488b27, 0x007fe5d4, 0x0374460f, 0x035f5309, 0x000f090e}}}, + {X: Field{[10]uint32{0x00a04cf8, 0x0095ca41, 0x005cae5b, 0x01b558e4, 0x028a7d34, 0x0071e18f, 0x0024f7b0, 0x01e8d285, 0x02bf676a, 0x00196428}}, Y: Field{[10]uint32{0x03e781e7, 0x01419168, 0x02f09396, 0x03b10919, 0x004f8d0c, 0x03a8bdcd, 0x002d972e, 0x0106684e, 0x00030490, 0x00047356}}}, + {X: Field{[10]uint32{0x03cba9a5, 0x025bb271, 0x0159289e, 0x00f7ed6e, 0x01884039, 0x028d9c04, 0x03461a20, 0x03d22f4b, 0x00029fc7, 0x002cf027}}, Y: Field{[10]uint32{0x00f5cfa9, 0x03324ac2, 0x0360ab97, 0x035abcb6, 0x03c6a3e6, 0x0300c38a, 0x03bb1bda, 0x012b4065, 0x026cbce5, 0x0039ed6a}}}, + {X: Field{[10]uint32{0x00fa8bc0, 0x024a4e46, 0x0064426a, 0x03be3f75, 0x02cdc693, 0x022ca65c, 0x03361439, 0x004de9f6, 0x02a8044a, 0x0035e5a3}}, Y: Field{[10]uint32{0x0157a75c, 0x009bb22b, 0x022e5283, 0x01d35d36, 0x0156dd31, 0x004338b9, 0x015dd294, 0x010d3b2f, 0x01892901, 0x00209009}}}, + {X: Field{[10]uint32{0x038e8304, 0x0167c020, 0x0365c6d9, 0x03212d40, 0x033bf6ed, 0x009406b6, 0x02ca172b, 0x03e73347, 0x006c2f98, 0x002295ef}}, Y: Field{[10]uint32{0x03e7d14e, 0x02ff8361, 0x038b992c, 0x00404691, 0x01bf6434, 0x02fe9a30, 0x00b5d67c, 0x0166150e, 0x0062a0f8, 0x000bafd5}}}, + {X: Field{[10]uint32{0x0073fd22, 0x03435418, 0x03b4e551, 0x034dfc3b, 0x011a555d, 0x023218f3, 0x00b8d18f, 0x0142a30f, 0x00416847, 0x0014621a}}, Y: Field{[10]uint32{0x02f3f192, 0x0145f68d, 0x03691f30, 0x0141b14b, 0x006a28ce, 0x00bd660f, 0x00e0f15c, 0x00eb429b, 0x009b9e98, 0x003ac17c}}}, + {X: Field{[10]uint32{0x027c85f3, 0x0124f8bd, 0x037b0ab7, 0x005a6e7a, 0x02d3a026, 0x00575574, 0x02ab8566, 0x01e53ea7, 0x035f27e4, 0x003faa30}}, Y: Field{[10]uint32{0x00148864, 0x012940a3, 0x03c889b5, 0x03d52aa5, 0x03b24158, 0x038ae8b9, 0x01123378, 0x01b8ea61, 0x0297cf0a, 0x0030c977}}}, + {X: Field{[10]uint32{0x01f94b63, 0x01409fb4, 0x0051077b, 0x01a5fbd3, 0x01d79d5f, 0x01707273, 0x01ab955d, 0x009793e3, 0x00ccd7bc, 0x001984b3}}, Y: Field{[10]uint32{0x0057860b, 0x0012668d, 0x0320073d, 0x0200570e, 0x03e9bd6a, 0x0094f7e6, 0x02abab50, 0x02342b9e, 0x02c17a37, 0x00185544}}}, + {X: Field{[10]uint32{0x006f8746, 0x02f5f92a, 0x03533cbd, 0x019e7db4, 0x02f8a7ae, 0x00c66655, 0x009d6983, 0x01676c13, 0x007a4998, 0x0032662c}}, Y: Field{[10]uint32{0x01d17138, 0x0046fc23, 0x038a66af, 0x03a444e0, 0x0137d6b5, 0x03a881ba, 0x019d81b0, 0x01dd7a89, 0x0371919e, 0x00367804}}}, + {X: Field{[10]uint32{0x024cc1e1, 0x003ec30e, 0x004bb052, 0x00551835, 0x00c32e39, 0x00f77242, 0x00fcd0d2, 0x02597e15, 0x0269c5cf, 0x00170391}}, Y: Field{[10]uint32{0x035adea1, 0x02e42719, 0x0055464f, 0x03b722cf, 0x0189f5ed, 0x0343df2e, 0x0335ffac, 0x0269374b, 0x03af7e0f, 0x0033faee}}}, + {X: Field{[10]uint32{0x0158c0fd, 0x036fee1c, 0x0350bcb2, 0x016d93e5, 0x037ab319, 0x01aa74fe, 0x02f6433c, 0x01459fc1, 0x02483038, 0x00343f76}}, Y: Field{[10]uint32{0x031283db, 0x000838fb, 0x03c358f0, 0x0057442a, 0x03f5c6e3, 0x01860cda, 0x02e13598, 0x03d87f20, 0x01776a34, 0x00133795}}}, + {X: Field{[10]uint32{0x024a3e81, 0x01c0617e, 0x00fd37bc, 0x014c66df, 0x0007cab1, 0x0088b39d, 0x01482656, 0x03d96817, 0x030fd78b, 0x00364955}}, Y: Field{[10]uint32{0x03c1924c, 0x0360dc21, 0x00ed1673, 0x03833740, 0x00ff52be, 0x027195d7, 0x021a5c7b, 0x02ea4068, 0x019ac448, 0x00000f0e}}}, + {X: Field{[10]uint32{0x018374c8, 0x030861c2, 0x00f9a1d0, 0x013f5e06, 0x02a023cc, 0x0212c200, 0x037d6074, 0x012eb081, 0x016d81f8, 0x001174ad}}, Y: Field{[10]uint32{0x0019d7f4, 0x01901067, 0x03f05030, 0x007e122e, 0x00982941, 0x009598f3, 0x010506ea, 0x032cdeb5, 0x00d192a9, 0x00053286}}}, + {X: Field{[10]uint32{0x02157400, 0x005c2de7, 0x03fba5b7, 0x01e196a4, 0x00ea8c19, 0x03e6843e, 0x013404dd, 0x0316efde, 0x00118588, 0x001ab4eb}}, Y: Field{[10]uint32{0x011686d7, 0x018bfa60, 0x02c97a87, 0x02b45cc7, 0x02382eb5, 0x035d8a4b, 0x0320e80f, 0x00b0ffb7, 0x001f1e24, 0x003e895d}}}, + {X: Field{[10]uint32{0x02595f52, 0x0387afd2, 0x00bf5028, 0x00a00b77, 0x0026d540, 0x004ac876, 0x03ea9e39, 0x02582de4, 0x0045b6dc, 0x00176891}}, Y: Field{[10]uint32{0x01f16026, 0x01007cd9, 0x005fd01b, 0x03663222, 0x02fabfa0, 0x03e28bf4, 0x015063bf, 0x0329a626, 0x038cad1d, 0x002f063f}}}, + {X: Field{[10]uint32{0x0132b346, 0x0057bf2b, 0x00f445ed, 0x0227549f, 0x03d7b5f1, 0x01975c4c, 0x039b89f8, 0x021b4a4e, 0x006811ce, 0x00377fd9}}, Y: Field{[10]uint32{0x027f5737, 0x03b68d95, 0x0110db1a, 0x019c4fa9, 0x034d236b, 0x004ac070, 0x021ae080, 0x0005af84, 0x0194cb22, 0x001c983a}}}, + {X: Field{[10]uint32{0x0097f029, 0x0279a6fe, 0x012436ad, 0x02637275, 0x02c1030d, 0x02142611, 0x032f50bc, 0x03ea4f43, 0x033b9120, 0x002a2e7f}}, Y: Field{[10]uint32{0x0066c591, 0x01f8cca1, 0x017b2359, 0x03da8ac7, 0x00c866aa, 0x00ec1fbf, 0x01a4c2ca, 0x01a1cbaa, 0x029a4e51, 0x00172fe8}}}, + {X: Field{[10]uint32{0x01dbcafd, 0x03068054, 0x00eb7a2f, 0x01921a3b, 0x02628752, 0x03237bac, 0x03c18eda, 0x0275a9c8, 0x03fb177b, 0x00250c1d}}, Y: Field{[10]uint32{0x00e7eb4e, 0x03d2a546, 0x01442e48, 0x004be97f, 0x03ccb6e3, 0x031f7e4f, 0x038248da, 0x0007274f, 0x01fc41ad, 0x0000866a}}}, + {X: Field{[10]uint32{0x0058b8e3, 0x0043cd99, 0x0174e9e8, 0x027e9593, 0x0382b33f, 0x00917aef, 0x0360f524, 0x0205ebf7, 0x01ac09c9, 0x001d72d8}}, Y: Field{[10]uint32{0x0003c367, 0x02b7f7bb, 0x00fb85b3, 0x01df3563, 0x02664414, 0x0277dae7, 0x00986f5f, 0x00210d18, 0x01bdf66f, 0x002aa04d}}}, + {X: Field{[10]uint32{0x031fccc8, 0x0039f238, 0x010c5075, 0x03cee6eb, 0x02c34fdc, 0x0239fc2b, 0x00922b22, 0x023a152f, 0x017727cb, 0x0006edf8}}, Y: Field{[10]uint32{0x00221ca3, 0x00368e30, 0x023d5238, 0x0030f989, 0x02855ea0, 0x0109737a, 0x01e322c2, 0x0179c2f6, 0x00861e85, 0x002efdca}}}, + {X: Field{[10]uint32{0x03ee8dbb, 0x02a536a2, 0x02a2eafd, 0x01c72638, 0x0087f024, 0x001743cc, 0x034b41cf, 0x036fcd16, 0x004b39e9, 0x002510ce}}, Y: Field{[10]uint32{0x024544ee, 0x0380723e, 0x02504aba, 0x015fdbde, 0x03e7b5da, 0x01f8e4e7, 0x00ac6e22, 0x0047d8e3, 0x0173ccb2, 0x0038d984}}}, + {X: Field{[10]uint32{0x03740d25, 0x033a9dbb, 0x0183961c, 0x015359a4, 0x00b4c27d, 0x0306a59a, 0x011638ae, 0x02aaca35, 0x01d5a68c, 0x00126f45}}, Y: Field{[10]uint32{0x0318c6e4, 0x01d0e7cf, 0x03e579db, 0x0183ab3c, 0x0377563b, 0x02657303, 0x03b9f0bd, 0x0391f7ef, 0x00688760, 0x001923f2}}}, + {X: Field{[10]uint32{0x02cfed85, 0x02517f5e, 0x02f9073f, 0x01e2960c, 0x02c151aa, 0x001e241f, 0x013684fd, 0x027a1613, 0x038e9280, 0x003431ed}}, Y: Field{[10]uint32{0x02970c89, 0x02e56ce3, 0x01d5707a, 0x01d48ab6, 0x03be91e4, 0x030c1480, 0x0129046b, 0x012902d5, 0x01abbe49, 0x002a0365}}}, + {X: Field{[10]uint32{0x02eb9275, 0x01af5f64, 0x00bf0cd9, 0x0361e5d2, 0x027c4c28, 0x033721d6, 0x018f9c75, 0x0088c97a, 0x01463ab2, 0x0037af77}}, Y: Field{[10]uint32{0x02b9799c, 0x02531c42, 0x00754ab5, 0x0192c4af, 0x0150d020, 0x01cebc96, 0x03b3dd7a, 0x03f2c17f, 0x008dc3ff, 0x0003440f}}}, + {X: Field{[10]uint32{0x03f33998, 0x01004bc6, 0x02dc33f6, 0x032152c0, 0x029f9ebc, 0x03681cc4, 0x022d6bf9, 0x01a8563a, 0x017c192a, 0x00075e6c}}, Y: Field{[10]uint32{0x00f60a5e, 0x039aef53, 0x00a12b78, 0x020af102, 0x020c7876, 0x033d91c0, 0x00d986fb, 0x0322a014, 0x00b3dbc1, 0x001bb206}}}, + {X: Field{[10]uint32{0x0281ca1b, 0x03f4db9b, 0x018449ed, 0x015c9931, 0x0374bd3b, 0x03454d7f, 0x009c38d7, 0x011fa5ca, 0x02ebff5d, 0x000bfadd}}, Y: Field{[10]uint32{0x01f93b74, 0x030ceee2, 0x00899378, 0x01d1e267, 0x03bb462e, 0x03e72af1, 0x02e18cd1, 0x02a08f7e, 0x024a7ba3, 0x00116f53}}}, + {X: Field{[10]uint32{0x00682573, 0x00bf82ec, 0x013c0637, 0x00e52619, 0x013eef1b, 0x0393d7bf, 0x0372ab62, 0x0169dfd4, 0x0190faef, 0x00005343}}, Y: Field{[10]uint32{0x02081453, 0x02a4bd8d, 0x0131236b, 0x025dcae8, 0x01601a4f, 0x01c65a0c, 0x0130f51d, 0x02e4c13d, 0x029a80c2, 0x00145fc5}}}, + {X: Field{[10]uint32{0x03313321, 0x008aafff, 0x02476fd5, 0x00dd1b4b, 0x02ad0941, 0x0042ce6c, 0x00bd9adb, 0x02470ce1, 0x03a5728f, 0x001cc1a9}}, Y: Field{[10]uint32{0x03a915a2, 0x005ee06d, 0x02a85a8e, 0x03b496e1, 0x01574c85, 0x0124bc6c, 0x03bd4e4f, 0x03a1ecd6, 0x02aba5b9, 0x00085788}}}, + {X: Field{[10]uint32{0x0255aaba, 0x0134d89a, 0x0171976d, 0x01e9cdfa, 0x00fd2406, 0x0263eb48, 0x02873a06, 0x036e32cc, 0x014f870c, 0x00217611}}, Y: Field{[10]uint32{0x0117e4a2, 0x010d2c4c, 0x033bb951, 0x03b8446b, 0x01539fe7, 0x02e720cf, 0x02a0715c, 0x027a3948, 0x000a36eb, 0x000db58f}}}, + {X: Field{[10]uint32{0x034384c3, 0x0028392c, 0x00dffc1f, 0x00a25b63, 0x0202f7da, 0x0386448a, 0x01b21cb9, 0x019ea896, 0x03829930, 0x0031a3d9}}, Y: Field{[10]uint32{0x0079e94a, 0x030da04c, 0x014ffb7d, 0x024daca6, 0x0308dcd4, 0x026575a8, 0x02484fb0, 0x00ce1dfa, 0x016a331c, 0x001d39ba}}}, + {X: Field{[10]uint32{0x00214dd3, 0x038c6101, 0x0217fe18, 0x0141a1c2, 0x00e29cd8, 0x00d47227, 0x02d5c9c3, 0x01554211, 0x01115dbe, 0x00205120}}, Y: Field{[10]uint32{0x030d19a8, 0x02af2c59, 0x02785210, 0x00f97b75, 0x01540ea3, 0x011e1a27, 0x03740e92, 0x030a71a5, 0x00b3d4cd, 0x001d775e}}}, + {X: Field{[10]uint32{0x00c945f5, 0x00120558, 0x00ebe3e2, 0x006f3d85, 0x0324214e, 0x01c1bc87, 0x0325993a, 0x0351e3d7, 0x0319de24, 0x000c42d6}}, Y: Field{[10]uint32{0x004318c3, 0x00ccc9c4, 0x021a147e, 0x014fc0a8, 0x01bf04cc, 0x03a1035a, 0x01d017e2, 0x03481782, 0x02ca0f01, 0x0022d0b1}}}, + {X: Field{[10]uint32{0x03c4bc3e, 0x0165d302, 0x03420a02, 0x00471a13, 0x01b0a90f, 0x00b9b514, 0x01e4bcab, 0x038ae77f, 0x03c74baf, 0x0033e291}}, Y: Field{[10]uint32{0x034c97d1, 0x00806ef8, 0x01c3d1cc, 0x01a70299, 0x02614d8a, 0x0321d8af, 0x02331e62, 0x021a65e1, 0x0264a9a7, 0x003c2dec}}}, + {X: Field{[10]uint32{0x038650fc, 0x011ebe62, 0x002d33d7, 0x0221a6e6, 0x03ab5533, 0x00f4ed82, 0x00100ec6, 0x02a4139c, 0x02267352, 0x00283f18}}, Y: Field{[10]uint32{0x0385865f, 0x025bcace, 0x02497e2b, 0x02cfe659, 0x03cd162e, 0x00870e67, 0x0388c395, 0x013ad192, 0x014c16b2, 0x002e8eb9}}}, + {X: Field{[10]uint32{0x00ff8bdb, 0x038f08db, 0x03fb07dc, 0x01c29386, 0x032e1eaf, 0x000114cc, 0x00d03391, 0x03751d61, 0x03e2535e, 0x002ab976}}, Y: Field{[10]uint32{0x03a7449b, 0x02554ced, 0x00321911, 0x03168d56, 0x02a51d85, 0x011cdccb, 0x02784392, 0x001adeec, 0x01f6e558, 0x001f3ea9}}}, + {X: Field{[10]uint32{0x0103ae39, 0x0285eec1, 0x01bd50b0, 0x009a1b69, 0x005c3172, 0x009c1686, 0x000792fb, 0x01d5432f, 0x03115b89, 0x002293a4}}, Y: Field{[10]uint32{0x017cef2c, 0x03a48ff4, 0x016922dd, 0x0362a770, 0x022442ae, 0x02a85d5c, 0x011b976d, 0x00231c5d, 0x01c8d85f, 0x000588eb}}}, + {X: Field{[10]uint32{0x03066463, 0x0336b1a1, 0x03f26a51, 0x028332eb, 0x018627e1, 0x02404096, 0x015cd612, 0x002c254a, 0x0135eca9, 0x0032f3bd}}, Y: Field{[10]uint32{0x03212653, 0x01fee35a, 0x03c259d8, 0x005cd18b, 0x02498fee, 0x03143855, 0x00afb9d8, 0x032670ff, 0x03fac2a2, 0x0019470b}}}, + {X: Field{[10]uint32{0x010f8c99, 0x00bab07b, 0x02609990, 0x0134bab5, 0x010bf12c, 0x00ae7210, 0x0290e336, 0x00af42ea, 0x01594d6a, 0x000965c5}}, Y: Field{[10]uint32{0x0075245e, 0x02b4afca, 0x02a8294b, 0x008b4289, 0x01d974dd, 0x00cfa2ec, 0x004002bc, 0x00132e05, 0x036cc974, 0x00127806}}}, + {X: Field{[10]uint32{0x02f1445f, 0x00b34a6d, 0x02a89167, 0x0178fa6c, 0x00a707da, 0x0203c0d9, 0x0389044c, 0x027daeb0, 0x028b2b04, 0x002dd535}}, Y: Field{[10]uint32{0x01e37740, 0x02bb1793, 0x01da1af2, 0x01097d37, 0x02bea555, 0x037f0bd3, 0x0092e3ed, 0x008f459c, 0x03c1625e, 0x0006ca6d}}}, + {X: Field{[10]uint32{0x03084037, 0x02263fd3, 0x0040aafa, 0x022f4a53, 0x02ab0bde, 0x03ce2d68, 0x03ca2fe2, 0x023ce731, 0x01a850e6, 0x00082ba9}}, Y: Field{[10]uint32{0x03f59444, 0x03877c00, 0x00fc20b4, 0x00f0c48c, 0x02ab1e88, 0x03f9f86c, 0x02fd6a56, 0x019bb1aa, 0x02b3f176, 0x001bb55d}}}, + {X: Field{[10]uint32{0x031979a6, 0x017876f8, 0x01e7bf0d, 0x0341f340, 0x02c6939f, 0x025fae16, 0x008cba9a, 0x03a48cca, 0x0202919d, 0x0009a113}}, Y: Field{[10]uint32{0x009ebfb7, 0x03154817, 0x005a16c7, 0x030a0cb1, 0x00cc08a6, 0x0063ed83, 0x026f11e5, 0x03eb4409, 0x028e06a5, 0x0000f7e6}}}, + {X: Field{[10]uint32{0x0028414c, 0x0372a577, 0x033fd485, 0x01ac68e2, 0x00efbe0a, 0x03b37e6d, 0x00fd413b, 0x026abc9f, 0x026133a6, 0x00046bf2}}, Y: Field{[10]uint32{0x03737b1c, 0x007d6b36, 0x0377b212, 0x03eee724, 0x009e4678, 0x0391ed00, 0x0047bbf8, 0x01ff988a, 0x0390c067, 0x002352e1}}}, + {X: Field{[10]uint32{0x00d2a63d, 0x01e37bba, 0x0160df3d, 0x01ec8f9c, 0x00498633, 0x039fa578, 0x03be09fc, 0x017594de, 0x00d52fe2, 0x00311b85}}, Y: Field{[10]uint32{0x01d2b723, 0x01d7563d, 0x017589b1, 0x03bd0fe8, 0x011f04b9, 0x0377d9e9, 0x0008dd77, 0x03a7fcb4, 0x01ab4211, 0x0028803f}}}, + {X: Field{[10]uint32{0x0055e4d7, 0x03673635, 0x02142d31, 0x00f23d63, 0x01241228, 0x00429d81, 0x01f598a2, 0x03f82491, 0x0212578a, 0x00015c2a}}, Y: Field{[10]uint32{0x00c50ac8, 0x00b03c4b, 0x01601b93, 0x02a57429, 0x019a2bed, 0x0144a81c, 0x03439e08, 0x00378750, 0x0361f8e9, 0x0030a3f6}}}, + {X: Field{[10]uint32{0x03c3fa64, 0x00c4237e, 0x00d1f3a3, 0x02b33ec5, 0x02224236, 0x00e15385, 0x0170b84e, 0x033a80a1, 0x035e88a1, 0x0034c4b6}}, Y: Field{[10]uint32{0x0397e1de, 0x0185fdb3, 0x026cf36b, 0x012ba9cb, 0x0064b8aa, 0x000c724c, 0x01fa0aae, 0x00e0f211, 0x00891843, 0x00329794}}}, + {X: Field{[10]uint32{0x02398087, 0x013b022a, 0x00a6d1fe, 0x02e1d889, 0x01c9be5e, 0x009e7c00, 0x01a9ad99, 0x019c3853, 0x00769981, 0x0007b88a}}, Y: Field{[10]uint32{0x02176dcc, 0x00c727c0, 0x034526ff, 0x02896031, 0x00b68603, 0x01511835, 0x0242c650, 0x038deb7f, 0x0114e303, 0x00188404}}}, + {X: Field{[10]uint32{0x03bb81a0, 0x02a6a955, 0x004a94af, 0x035cb530, 0x011700b9, 0x03259300, 0x005511d1, 0x013fd2ba, 0x02cde2b8, 0x0007ee72}}, Y: Field{[10]uint32{0x03737fcb, 0x0159d497, 0x0038ee04, 0x01acb3e8, 0x0115b130, 0x0108050d, 0x019f59f7, 0x017cab5b, 0x03c1295c, 0x0010c2dc}}}, + {X: Field{[10]uint32{0x011c085b, 0x00685d98, 0x01145f19, 0x02e7e913, 0x034a998b, 0x0201f9d0, 0x032934a9, 0x002d1da7, 0x002dd3cf, 0x00341332}}, Y: Field{[10]uint32{0x01be5fa9, 0x00805a40, 0x0392d155, 0x02b32196, 0x018f4c13, 0x03848f75, 0x02cf1cac, 0x03454710, 0x01afb551, 0x001e9286}}}, + {X: Field{[10]uint32{0x03e7e9aa, 0x03a1c133, 0x01e15712, 0x02295237, 0x038a544f, 0x009f7d77, 0x00b97f1f, 0x0345faea, 0x02088bd4, 0x0007932c}}, Y: Field{[10]uint32{0x019b828d, 0x0119b369, 0x03e515e8, 0x025971c6, 0x03db0663, 0x00ff68fc, 0x019930a5, 0x00cfb39e, 0x021eb729, 0x00360171}}}, + {X: Field{[10]uint32{0x0251590d, 0x01b71237, 0x028c717d, 0x01a77cf7, 0x008f769f, 0x02f3f6ae, 0x032bbadc, 0x02168359, 0x0398707a, 0x001482a8}}, Y: Field{[10]uint32{0x02e9ada8, 0x01495513, 0x0052a39a, 0x01366638, 0x013b5472, 0x0045daab, 0x01095e2f, 0x01e88b02, 0x00e4a904, 0x002634d1}}}, + {X: Field{[10]uint32{0x03614ef2, 0x032b1b9e, 0x005d7a79, 0x0325e0c9, 0x00e7080a, 0x001a4ff2, 0x00d45a06, 0x03bdf0b8, 0x03de165b, 0x000ea7f8}}, Y: Field{[10]uint32{0x03038d4a, 0x00187bdc, 0x0398e151, 0x0126a9b5, 0x007607ff, 0x024d3222, 0x02895f52, 0x037bbf1e, 0x0046fd3f, 0x00014625}}}, + {X: Field{[10]uint32{0x02149938, 0x03639cf6, 0x0005665f, 0x00190dcc, 0x018e3c68, 0x02db5a32, 0x0289a3a2, 0x00201790, 0x01ccc26c, 0x002724a7}}, Y: Field{[10]uint32{0x016ba2fa, 0x0285034e, 0x02dd956a, 0x00b6aaf9, 0x02c81edf, 0x00409d8a, 0x039f6bab, 0x024824fc, 0x0140b4c2, 0x001b7efe}}}, + {X: Field{[10]uint32{0x01be419e, 0x005dd222, 0x00a660d1, 0x02af1a6b, 0x03ee22ab, 0x0179e822, 0x02f1e42e, 0x0019462e, 0x00cef4e0, 0x000d56d8}}, Y: Field{[10]uint32{0x002604e2, 0x011bd0ff, 0x031b1ed1, 0x02baed13, 0x034fc01d, 0x02d4fedc, 0x020eaaac, 0x03ec417f, 0x023bb277, 0x001fd1e2}}}, + {X: Field{[10]uint32{0x03f7f37f, 0x039efcf5, 0x01705dfc, 0x02465d0e, 0x01ea9660, 0x00478406, 0x0389bb1c, 0x01110b84, 0x014f21ad, 0x001daffc}}, Y: Field{[10]uint32{0x0289d763, 0x01a95260, 0x0307b93f, 0x03e2488f, 0x02a29a34, 0x0308b80b, 0x034da79b, 0x02ac4ad7, 0x0291376a, 0x000e1568}}}, + {X: Field{[10]uint32{0x0156b454, 0x023e2d98, 0x021dbfa0, 0x02ffe88b, 0x02becbb4, 0x01620ce5, 0x023aadd3, 0x01e8edf8, 0x00df1057, 0x00246ee7}}, Y: Field{[10]uint32{0x00edbb91, 0x0333c965, 0x01a1ef2c, 0x010b0b2a, 0x00a3edea, 0x005846d7, 0x0053e93d, 0x026c0bb7, 0x039e4f14, 0x003b1b2e}}}, + {X: Field{[10]uint32{0x00865562, 0x00c4296a, 0x02537f8c, 0x01f53acc, 0x010a7dde, 0x003116c2, 0x0081204f, 0x01b184d9, 0x010f1ba8, 0x002795ac}}, Y: Field{[10]uint32{0x028aa67c, 0x010d8756, 0x022d516f, 0x02bc3461, 0x028b523e, 0x027ba31a, 0x03ca1a37, 0x0305b122, 0x013d8552, 0x00337cd1}}}, + {X: Field{[10]uint32{0x008e09f9, 0x0125cb66, 0x00af500f, 0x01d53a69, 0x01a11dcb, 0x00e4c15c, 0x02e28a42, 0x01af7939, 0x014daf28, 0x00139cd6}}, Y: Field{[10]uint32{0x018a36e7, 0x02d47c51, 0x02418cd1, 0x014c20a2, 0x01af0d8e, 0x0289d00d, 0x03d812ce, 0x010b3b80, 0x03d070c0, 0x002967c8}}}, + {X: Field{[10]uint32{0x0123d860, 0x02b254ce, 0x01bb1d9f, 0x01cc12c4, 0x00393d59, 0x032cb185, 0x01d3c557, 0x0227e9a4, 0x03f7e92d, 0x00055bf7}}, Y: Field{[10]uint32{0x013b360b, 0x03ac04e8, 0x032ee620, 0x033408c4, 0x00bff653, 0x0199408f, 0x02d68f64, 0x01d833bd, 0x0237c448, 0x0013a4a5}}}, + {X: Field{[10]uint32{0x028ea03b, 0x0029f9eb, 0x0356998b, 0x01487e24, 0x0170d23d, 0x00f4d36e, 0x017a9052, 0x008cd975, 0x0250eb37, 0x003cb22d}}, Y: Field{[10]uint32{0x001a7881, 0x010aa1c6, 0x0183d72f, 0x031d9ce5, 0x00204488, 0x002f7a7b, 0x03422a56, 0x026fda5c, 0x031484a9, 0x002f66b0}}}, + {X: Field{[10]uint32{0x0351e3e3, 0x01399eb1, 0x0316cd4a, 0x028806b8, 0x0288d526, 0x01ee05ae, 0x01bb92ba, 0x01d0c17d, 0x0257a4a3, 0x0009f74d}}, Y: Field{[10]uint32{0x03be3304, 0x019092e0, 0x00e8c022, 0x0007df61, 0x008a756b, 0x03fa5d79, 0x03af3d51, 0x029005ab, 0x01d3c0fa, 0x0022033f}}}, + {X: Field{[10]uint32{0x03b3d1bc, 0x013c58fa, 0x037081c6, 0x020b099c, 0x037a3901, 0x03312dfc, 0x00c5d981, 0x00d5f00f, 0x020c19f7, 0x003db097}}, Y: Field{[10]uint32{0x0289e43d, 0x039f08a3, 0x03c2f183, 0x014ab7cd, 0x01295341, 0x010ecd62, 0x0144d666, 0x0283e8e6, 0x03ea7c05, 0x0023202c}}}, + {X: Field{[10]uint32{0x03fad4f2, 0x02b1fd29, 0x01f45087, 0x0015c5bf, 0x02ae2803, 0x0274dd84, 0x02847d3d, 0x017a87a8, 0x000c7130, 0x00319e20}}, Y: Field{[10]uint32{0x000b63c6, 0x0127a21b, 0x022d92d5, 0x00e7c41b, 0x0055d41d, 0x02fabd76, 0x0349a42e, 0x00ae3376, 0x03f4d2fb, 0x002f97fe}}}, + {X: Field{[10]uint32{0x03f6d560, 0x0244ba04, 0x03d30931, 0x037e816f, 0x02f98177, 0x023c347b, 0x01e2d3a6, 0x01de1bf2, 0x0221e66b, 0x003cd76c}}, Y: Field{[10]uint32{0x003f29fa, 0x01f30039, 0x007c7bb6, 0x0054da9f, 0x0209eccb, 0x03f96c7b, 0x0174ca5a, 0x00810226, 0x00080e6b, 0x0012266a}}}, + {X: Field{[10]uint32{0x03e69de9, 0x00718e64, 0x00debd02, 0x0013101d, 0x035d944f, 0x00ce2230, 0x01843d6c, 0x018cfb6e, 0x037da915, 0x000ae4f8}}, Y: Field{[10]uint32{0x030522f0, 0x034f2212, 0x001676f2, 0x017f1c94, 0x00366a4a, 0x004c83bf, 0x0372a58f, 0x0287324f, 0x0095c6ff, 0x003acf44}}}, + {X: Field{[10]uint32{0x02091b69, 0x02407459, 0x02331060, 0x02522c52, 0x03e4875b, 0x03f6d01b, 0x01913ab0, 0x011c5bd4, 0x03b39045, 0x00206008}}, Y: Field{[10]uint32{0x0227e7b1, 0x039130a8, 0x00990f98, 0x0227e9f6, 0x026fe573, 0x00e393cb, 0x01af3e1f, 0x03911c31, 0x018a6224, 0x002cfd5c}}}, + {X: Field{[10]uint32{0x00662bb6, 0x00fc180f, 0x001fbdb3, 0x01ec84f7, 0x006645ce, 0x016c5061, 0x02e565b6, 0x029a76ca, 0x026a244c, 0x000059db}}, Y: Field{[10]uint32{0x022e0298, 0x028c7ee0, 0x001fdcf4, 0x026c5bb3, 0x01aeb968, 0x034b1f03, 0x03208300, 0x0177049a, 0x03a5deef, 0x00223872}}}, + {X: Field{[10]uint32{0x00298d54, 0x00b2c877, 0x02e4c391, 0x0150c38c, 0x01d96574, 0x008f8bc8, 0x0229d733, 0x00df78e1, 0x01a1a925, 0x0000be4c}}, Y: Field{[10]uint32{0x030ef904, 0x0077eba8, 0x03ccc52e, 0x03442f6e, 0x0195a5b2, 0x015899c4, 0x036fe43f, 0x003ebbbb, 0x01086fbc, 0x0024ca4b}}}, + {X: Field{[10]uint32{0x01fd0279, 0x01cc3228, 0x001af2d1, 0x03044898, 0x02be8a32, 0x013d1521, 0x03f20d9b, 0x0232462f, 0x0212f0dd, 0x001ee935}}, Y: Field{[10]uint32{0x02401179, 0x00d39e34, 0x00310d02, 0x0316f131, 0x013018e3, 0x0334126a, 0x0220af14, 0x0190c6cb, 0x02a1f5b0, 0x0022ab5e}}}, + {X: Field{[10]uint32{0x001d5e78, 0x01aa9872, 0x023d8528, 0x00233323, 0x03d6974d, 0x008de67a, 0x039b2be7, 0x01ea45a9, 0x02b085fe, 0x0003a37e}}, Y: Field{[10]uint32{0x023f926c, 0x02ead01b, 0x0181c37d, 0x00eec637, 0x00fbaec5, 0x01521eee, 0x0195d47a, 0x02d55b99, 0x006e519d, 0x0008485a}}}, + {X: Field{[10]uint32{0x0184ab5e, 0x02432683, 0x0264c94c, 0x028554d6, 0x02ea751d, 0x01facb9a, 0x01071061, 0x01fbd1be, 0x03bcb159, 0x001f5588}}, Y: Field{[10]uint32{0x00ce7575, 0x0372f0a8, 0x037e4204, 0x0351759a, 0x00701b3c, 0x02f8ba2e, 0x0114b70e, 0x031378c5, 0x03318004, 0x003718e7}}}, + {X: Field{[10]uint32{0x00a7ffa3, 0x03213ee2, 0x02ad57b9, 0x005a0778, 0x001e4ac9, 0x00ee0880, 0x0186194b, 0x02fb1d22, 0x022d8074, 0x00023a07}}, Y: Field{[10]uint32{0x019fa890, 0x02052641, 0x03e6cdc7, 0x026a37e4, 0x03fa94e9, 0x018b40fd, 0x016f6cf7, 0x01120329, 0x001df4a3, 0x0010217b}}}, + {X: Field{[10]uint32{0x028da71e, 0x034ea169, 0x0052b53e, 0x0324ad73, 0x0173e68a, 0x01a71a0a, 0x018affd1, 0x03b98978, 0x03e78290, 0x002a7568}}, Y: Field{[10]uint32{0x00805fd6, 0x026f92ad, 0x02536ee8, 0x0083391e, 0x028d6e8b, 0x01e4ce22, 0x009ed298, 0x01622546, 0x016bf9eb, 0x000736ab}}}, + {X: Field{[10]uint32{0x03dba2cd, 0x02c48f15, 0x00497d64, 0x03c391ab, 0x00984985, 0x00c4be12, 0x037b3134, 0x01f0380e, 0x03cabcda, 0x0013df05}}, Y: Field{[10]uint32{0x034a25d7, 0x02d72a28, 0x00f5e888, 0x002a6eaa, 0x00c87701, 0x0141c334, 0x00be7c1d, 0x0030efcf, 0x01d95f47, 0x002182fb}}}, + {X: Field{[10]uint32{0x03a64921, 0x02ec2ae7, 0x025b5b4f, 0x00f14d5c, 0x01034b8c, 0x0155cd3a, 0x01bd016f, 0x029ee6a4, 0x017a9234, 0x0011e3cf}}, Y: Field{[10]uint32{0x00051a1f, 0x02d364ee, 0x021018ff, 0x015360fc, 0x003f2530, 0x0087a69f, 0x02bca05c, 0x00fc63ae, 0x0394f025, 0x0036e5e8}}}, + {X: Field{[10]uint32{0x027963d5, 0x014bac7f, 0x02329f25, 0x02ad87ee, 0x033ea09a, 0x007685e7, 0x037cc01b, 0x01b9f5a7, 0x017b73d9, 0x002b39f9}}, Y: Field{[10]uint32{0x02908918, 0x03bee249, 0x0211b796, 0x013040c1, 0x017e213e, 0x03809659, 0x010f824b, 0x02f413b2, 0x01f22b8d, 0x003e8094}}}, + {X: Field{[10]uint32{0x0108d1fd, 0x001039ea, 0x01f24374, 0x03e28742, 0x034401f2, 0x0337da7b, 0x013757cd, 0x001dc609, 0x0067f517, 0x003355ba}}, Y: Field{[10]uint32{0x03338fe1, 0x012ee89f, 0x03b90a45, 0x02109ded, 0x0183e4bd, 0x03d8831f, 0x02b29a22, 0x002e9228, 0x021652cf, 0x0021e3dc}}}, + {X: Field{[10]uint32{0x024d5329, 0x00f944fb, 0x03e33e92, 0x01cae819, 0x0167a2c6, 0x01ec9769, 0x031dd249, 0x03e26992, 0x025cd9d2, 0x000c10ba}}, Y: Field{[10]uint32{0x0268b1fb, 0x03906cd6, 0x0261281c, 0x021a3817, 0x02d3fa1d, 0x01b489e8, 0x028568cd, 0x01a85282, 0x0144d551, 0x0002e130}}}, + {X: Field{[10]uint32{0x02712ec0, 0x0147b267, 0x03f1bce3, 0x02455ebc, 0x0130a2e2, 0x02be80d1, 0x002b042b, 0x03b49802, 0x008da094, 0x00015782}}, Y: Field{[10]uint32{0x026b33e9, 0x03274bb1, 0x01db2082, 0x037e0b54, 0x0100caca, 0x00531512, 0x00919335, 0x020c9258, 0x017f6439, 0x0031be0a}}}, + {X: Field{[10]uint32{0x03408966, 0x02d1a44e, 0x01875e63, 0x020fbb5c, 0x01e0e0da, 0x0295e83a, 0x03f91817, 0x024ef28d, 0x013a69dd, 0x002f4b6c}}, Y: Field{[10]uint32{0x01b0da2d, 0x029d0a82, 0x00cf8078, 0x0391016e, 0x00187ee6, 0x03d96cfe, 0x03c25d50, 0x026cbc48, 0x0260f948, 0x0011b849}}}, + {X: Field{[10]uint32{0x03d3d210, 0x0158939f, 0x03ecb609, 0x006661a9, 0x00ef7c52, 0x013b4685, 0x02678e62, 0x0211557f, 0x0110cdbb, 0x001f5e94}}, Y: Field{[10]uint32{0x02c6c37c, 0x01d2965a, 0x00867727, 0x03680570, 0x00626a46, 0x02ea9281, 0x019d640a, 0x011493e0, 0x01c3c0a5, 0x003255e3}}}, + {X: Field{[10]uint32{0x037a3fa7, 0x02cc3d24, 0x037825bd, 0x00a406f5, 0x02fd4e6d, 0x013b6af1, 0x01669813, 0x004d50aa, 0x0317513b, 0x0007bc48}}, Y: Field{[10]uint32{0x010e1ade, 0x012276d6, 0x00039909, 0x02651a13, 0x01123198, 0x01aa327e, 0x011cee33, 0x02f3bcd1, 0x0288a391, 0x0038392d}}}, + {X: Field{[10]uint32{0x0206baaf, 0x00c33a85, 0x01d1949d, 0x021a2e68, 0x029f463b, 0x00cb4bc4, 0x02c6b2e3, 0x02e5db6f, 0x0003766f, 0x003bfe81}}, Y: Field{[10]uint32{0x001cb082, 0x00877bef, 0x003c2382, 0x03116d28, 0x03b0cbfd, 0x0280f785, 0x00de1b7d, 0x03e993ce, 0x0083bf3e, 0x002316c7}}}, + {X: Field{[10]uint32{0x0087d65c, 0x03699868, 0x02069df5, 0x0036743a, 0x0320bf78, 0x01cebd6f, 0x025f0222, 0x02810955, 0x01e976a9, 0x0037249c}}, Y: Field{[10]uint32{0x023d6063, 0x033629ad, 0x010c1944, 0x01f18852, 0x0055ce7c, 0x031ceddb, 0x02f11bb1, 0x034c3261, 0x01e7b27b, 0x0037219e}}}, + {X: Field{[10]uint32{0x00264619, 0x02ad052e, 0x031b2384, 0x024c0376, 0x02a1336b, 0x01d54075, 0x00f69462, 0x0280b086, 0x01c21e1c, 0x0002b877}}, Y: Field{[10]uint32{0x01b26b48, 0x03d0881f, 0x0076a01f, 0x0326a21f, 0x0332466b, 0x026a9db5, 0x00e5c8e1, 0x018497b2, 0x039d300b, 0x000871ac}}}, + {X: Field{[10]uint32{0x0282cf5b, 0x0338ead3, 0x00a1285c, 0x0226fcaf, 0x01033dd9, 0x00c5918d, 0x00924808, 0x00d724ae, 0x000ffe58, 0x002ba8b0}}, Y: Field{[10]uint32{0x03dfa97f, 0x0064eca4, 0x029673e8, 0x035014ee, 0x039aad65, 0x019c2c64, 0x0220e84e, 0x0184490a, 0x00cf935a, 0x00185566}}}, + {X: Field{[10]uint32{0x02ebf696, 0x02322fa2, 0x0066b634, 0x00f98db2, 0x01b45e72, 0x02451d9f, 0x01b30b65, 0x00ea1bd5, 0x021634b4, 0x00244f43}}, Y: Field{[10]uint32{0x01971a9f, 0x01e9710e, 0x00305148, 0x00385235, 0x0039c0c1, 0x00c5c809, 0x02574af4, 0x03f69340, 0x020751af, 0x00385319}}}, + {X: Field{[10]uint32{0x03c26fc0, 0x0094b48e, 0x0005a301, 0x00f621e3, 0x0040fc16, 0x02ec3e72, 0x00d61916, 0x02b20178, 0x0354775c, 0x0013c2cc}}, Y: Field{[10]uint32{0x018da1e3, 0x03f0fcef, 0x01ac3fa8, 0x01ddba15, 0x016c0e10, 0x03cf897c, 0x02eb2eb5, 0x03f7e0e9, 0x00863aed, 0x002c2dd5}}}, + {X: Field{[10]uint32{0x0316129d, 0x028f693c, 0x0083b181, 0x02583e02, 0x02f469df, 0x03197ab4, 0x033b2f75, 0x025e3dd9, 0x014073cc, 0x00176886}}, Y: Field{[10]uint32{0x02f311d1, 0x03051663, 0x031eaf3b, 0x036d8a16, 0x030237b1, 0x0067ad50, 0x00d5e63e, 0x0099c15c, 0x0080743d, 0x002145b4}}}, + {X: Field{[10]uint32{0x03e74a23, 0x03bbb45a, 0x0163dd4b, 0x00c89a74, 0x02a8fbc1, 0x00d0134d, 0x0392fb46, 0x03e46b32, 0x0330ca7a, 0x001db86c}}, Y: Field{[10]uint32{0x027f5326, 0x02b83787, 0x02791bca, 0x000000c6, 0x0002ce28, 0x03fe837b, 0x016f2e52, 0x023bcfb2, 0x0253c590, 0x00042ce4}}}, + {X: Field{[10]uint32{0x02393e64, 0x025d743b, 0x01be1d76, 0x015d9c77, 0x018fe8ef, 0x022c8cd6, 0x03912637, 0x003b860b, 0x008b2f21, 0x00312f92}}, Y: Field{[10]uint32{0x0379f449, 0x01389c2e, 0x02aee10d, 0x01c3e01f, 0x00b910cd, 0x02632809, 0x00beadcb, 0x02695120, 0x012fa1a0, 0x002fb04e}}}, + {X: Field{[10]uint32{0x0333ff37, 0x00329724, 0x0254256d, 0x000134da, 0x0025f5be, 0x00f58230, 0x0313848d, 0x03f5dec7, 0x018da141, 0x000151a4}}, Y: Field{[10]uint32{0x01914ac7, 0x008fa3ce, 0x004dcc2d, 0x02920cdc, 0x03b0b82b, 0x033e686f, 0x0300d716, 0x02f86973, 0x00c79684, 0x0000f475}}}, + {X: Field{[10]uint32{0x026078de, 0x03065809, 0x0210a320, 0x02c6719f, 0x002e6df8, 0x023fc3d0, 0x03368b09, 0x03af44b7, 0x03c42c51, 0x00337f1b}}, Y: Field{[10]uint32{0x0189cb0d, 0x02f81a3f, 0x0063c0fe, 0x0046dbdd, 0x03c26894, 0x02cddd3c, 0x03bef456, 0x01499151, 0x0130023e, 0x0016617a}}}, + {X: Field{[10]uint32{0x00f03034, 0x02ef351f, 0x00e99c99, 0x012d1c63, 0x02036f0e, 0x01023851, 0x021eec62, 0x005281bc, 0x00cc593b, 0x001dcc3f}}, Y: Field{[10]uint32{0x02016b72, 0x023e644f, 0x0001ccc2, 0x02ddbe5c, 0x0152beac, 0x024aa9f7, 0x030151b4, 0x03904a70, 0x03e20736, 0x003c5f43}}}, + {X: Field{[10]uint32{0x0141b3ea, 0x01acd51e, 0x03090572, 0x02a57eb7, 0x01d855a7, 0x03e256f1, 0x00c7b559, 0x0023d19d, 0x03de4743, 0x0022a930}}, Y: Field{[10]uint32{0x00b8594d, 0x0357dc57, 0x018be7db, 0x01085432, 0x0278d9da, 0x03d00fb4, 0x034ae9ad, 0x00988c6f, 0x004a0eac, 0x003c9d71}}}, + {X: Field{[10]uint32{0x0325bb79, 0x01534434, 0x0313c5cb, 0x0375e156, 0x01f32d33, 0x02250124, 0x036f87ff, 0x03a49625, 0x01a497a4, 0x0005649b}}, Y: Field{[10]uint32{0x03ce8e51, 0x03c5b619, 0x00d40d35, 0x01e20a20, 0x001aa03c, 0x0327dc6e, 0x031bf67e, 0x02fea3a1, 0x00b65b1e, 0x00056b18}}}, + {X: Field{[10]uint32{0x01b1710d, 0x02bbaf7d, 0x02dbb35f, 0x01175159, 0x02fc99f5, 0x00005a23, 0x0062b48f, 0x0055d1e5, 0x00feaa74, 0x00157d3d}}, Y: Field{[10]uint32{0x0302d15f, 0x01486d2e, 0x03e0f662, 0x02b6db8f, 0x03d015a4, 0x01f7fb0f, 0x027b8945, 0x0132139d, 0x020563f2, 0x00203b3a}}}, + {X: Field{[10]uint32{0x00e93cee, 0x00dfda38, 0x03e0d0b1, 0x035d335c, 0x02f04a60, 0x0136ccdf, 0x0357c4ae, 0x01fccfe8, 0x02cf402f, 0x0025695a}}, Y: Field{[10]uint32{0x036501fd, 0x0086d3bb, 0x021a4bd5, 0x038f396d, 0x01d21c89, 0x00c326b9, 0x034e72ca, 0x02ea105b, 0x01bfb7c9, 0x0039c901}}}, + {X: Field{[10]uint32{0x027a2aac, 0x02206ae3, 0x03cd64b0, 0x03fc1266, 0x03c2a697, 0x00daa5e0, 0x0034b7bc, 0x01eed44c, 0x0190b50d, 0x000a2a7f}}, Y: Field{[10]uint32{0x0394a788, 0x00fea8e5, 0x01720b58, 0x03d453e8, 0x01a37cfa, 0x005421e0, 0x02635968, 0x01fa9268, 0x01b05c7e, 0x001dac54}}}, + {X: Field{[10]uint32{0x0334b672, 0x03e97bf9, 0x0393cb36, 0x034e6736, 0x00b571e2, 0x02b0e3ac, 0x0116b93e, 0x018b1290, 0x01136d64, 0x001901b7}}, Y: Field{[10]uint32{0x01d7fd1e, 0x03a8d617, 0x0274fdef, 0x006a5df6, 0x01b4c5eb, 0x00aa447e, 0x019c9d06, 0x0398514b, 0x037b92b8, 0x000e5d31}}}, + {X: Field{[10]uint32{0x01066529, 0x022d99bc, 0x003c2e3c, 0x01f8dd9c, 0x029d40c3, 0x024cdd1f, 0x03ef9039, 0x03870253, 0x023fcb62, 0x0023f63c}}, Y: Field{[10]uint32{0x014ab5c8, 0x003815c3, 0x02baf310, 0x004c8244, 0x025ba190, 0x016498a5, 0x029099d7, 0x005d6c92, 0x039bde10, 0x0022c2cb}}}, + {X: Field{[10]uint32{0x03a1a24b, 0x03bb0558, 0x023cc3e0, 0x02acb49c, 0x03cc525b, 0x02325390, 0x00679bdc, 0x01cda270, 0x022bd445, 0x00145e02}}, Y: Field{[10]uint32{0x00e01109, 0x000fe8bc, 0x03dfc646, 0x028cd4c3, 0x014b6b08, 0x024e4713, 0x006e5db2, 0x02347b1d, 0x019b0e17, 0x001409b3}}}, + {X: Field{[10]uint32{0x00283561, 0x02d0aa63, 0x01065bee, 0x00d1a123, 0x025b8c85, 0x0364e772, 0x02fe0e5c, 0x03e6fcf4, 0x013ae7c7, 0x002a8052}}, Y: Field{[10]uint32{0x00da82d9, 0x0220440b, 0x030f0e9e, 0x0022cf84, 0x021783e9, 0x006678f4, 0x023af145, 0x02d78d91, 0x03454a42, 0x002823c2}}}, + {X: Field{[10]uint32{0x00ceab70, 0x029814c6, 0x01afb97f, 0x035065b3, 0x010e4456, 0x01a89fa0, 0x001c4fad, 0x039b52b2, 0x0349d4bb, 0x003362ad}}, Y: Field{[10]uint32{0x01f59beb, 0x00bc6e17, 0x01231da3, 0x020ec14a, 0x01ca8621, 0x0335eb4f, 0x01c92493, 0x02883780, 0x0339bd68, 0x003f1b1d}}}, + {X: Field{[10]uint32{0x01fe3e32, 0x02fb1715, 0x027eae00, 0x03871668, 0x02379f56, 0x002ed221, 0x017bc54e, 0x014079e8, 0x02f2e824, 0x0039a737}}, Y: Field{[10]uint32{0x02c41cd4, 0x03616362, 0x03c80f41, 0x0399b12e, 0x013fe735, 0x018a45e4, 0x0125338f, 0x014e6040, 0x01104037, 0x0003a03b}}}, + {X: Field{[10]uint32{0x03ff8a8d, 0x00623836, 0x004a2f30, 0x01a5e406, 0x00f6b6ec, 0x038c6073, 0x0308af19, 0x007dfbbe, 0x02d9182b, 0x0016939c}}, Y: Field{[10]uint32{0x01f9da19, 0x0049408b, 0x00bee2d9, 0x0189ed6c, 0x017b62ea, 0x02b0ce97, 0x031c5885, 0x015f60ec, 0x03f2d5a8, 0x000b473d}}}, + {X: Field{[10]uint32{0x00984a2b, 0x00f46d7e, 0x0330a8f2, 0x01517740, 0x020d78f1, 0x024829e7, 0x00416b03, 0x01884504, 0x005948bd, 0x00278002}}, Y: Field{[10]uint32{0x008e3f62, 0x00459d32, 0x03338db6, 0x01683634, 0x00151ab8, 0x036c37f2, 0x030680ce, 0x03f4f308, 0x00920412, 0x000dab81}}}, + {X: Field{[10]uint32{0x018bc6ff, 0x00bc84c9, 0x00d18ac8, 0x0217c2f2, 0x0399f884, 0x03a90971, 0x02d35d4a, 0x021cd3b2, 0x03aeb12f, 0x001f82e5}}, Y: Field{[10]uint32{0x01f3946e, 0x01902d5a, 0x037bccc7, 0x01011a4b, 0x00ab95fb, 0x02c2db97, 0x003b0b8a, 0x006da8ff, 0x0224a4be, 0x0039dbd3}}}, + {X: Field{[10]uint32{0x01038ee2, 0x00cdb198, 0x00c860b9, 0x039606f8, 0x02b3064b, 0x019e1e3e, 0x0281ff28, 0x03125772, 0x00fb1bdf, 0x00188a17}}, Y: Field{[10]uint32{0x009b5161, 0x013705e1, 0x024f771f, 0x0360869b, 0x00a65ca8, 0x03c56775, 0x0285ea08, 0x03a7cd03, 0x03e45f60, 0x003cb246}}}, + {X: Field{[10]uint32{0x02c82623, 0x03c49aa9, 0x00ac8006, 0x02ebbbcf, 0x00cd3765, 0x01b57067, 0x01870ef3, 0x02d735a6, 0x02812de1, 0x001c08d3}}, Y: Field{[10]uint32{0x01330736, 0x00e6ee10, 0x036ec071, 0x01a43f56, 0x023140f7, 0x0011ce2e, 0x03f3c920, 0x029ddc98, 0x018a0f92, 0x0038b6fe}}}, + {X: Field{[10]uint32{0x015db07d, 0x025e29f3, 0x025e6136, 0x0399fd2f, 0x037dc1b4, 0x010d2c29, 0x0240ef57, 0x035737b7, 0x00618f31, 0x002b9dc1}}, Y: Field{[10]uint32{0x013d16e6, 0x034fa4f6, 0x03b01d46, 0x004a5459, 0x005cc43e, 0x001d00df, 0x0120e420, 0x01121cfd, 0x01646558, 0x00293894}}}, + {X: Field{[10]uint32{0x006f2b53, 0x0126dbc9, 0x026049e3, 0x039f590f, 0x005b7f4c, 0x01a39825, 0x02b78fb7, 0x01a62d22, 0x008fe4db, 0x0033b1eb}}, Y: Field{[10]uint32{0x025fadfb, 0x01b4006d, 0x03c325ca, 0x03d2035a, 0x017f5d3c, 0x0293f20c, 0x03bfd2a7, 0x001a150c, 0x01459933, 0x001246ed}}}, + {X: Field{[10]uint32{0x005eee36, 0x013571df, 0x006658db, 0x033f0bfe, 0x010852e4, 0x01588a5e, 0x02f62e83, 0x03927c9d, 0x0296b051, 0x002009db}}, Y: Field{[10]uint32{0x002f6d9d, 0x035f713d, 0x0330cf06, 0x0394dccf, 0x002c4d4c, 0x03dd44e9, 0x00d526e5, 0x0227c21c, 0x02968825, 0x003d4435}}}, + {X: Field{[10]uint32{0x0285b27d, 0x0110c5f6, 0x02741b89, 0x03260af6, 0x00e9e351, 0x03e3e142, 0x0163934e, 0x03eabb98, 0x03d49d85, 0x002c6409}}, Y: Field{[10]uint32{0x0247a824, 0x02ecdcba, 0x002d6dba, 0x0048815d, 0x028439f8, 0x00bac10b, 0x038443af, 0x039a72cd, 0x01cbdec0, 0x00304918}}}, + {X: Field{[10]uint32{0x030c792c, 0x0016cb95, 0x0308129e, 0x01bfef10, 0x01989c65, 0x02b851fc, 0x013fc78a, 0x0300074f, 0x014acf07, 0x0015d667}}, Y: Field{[10]uint32{0x018514b0, 0x02ef7100, 0x03a23f13, 0x03ce4042, 0x0238b57a, 0x02d2d3c0, 0x00e181b1, 0x02e85b86, 0x020fd215, 0x00173e3a}}}, + {X: Field{[10]uint32{0x02e6e4b7, 0x01b9063a, 0x01490bad, 0x0230ac1f, 0x00306e6f, 0x014f9d8f, 0x03cda2b6, 0x002e0b14, 0x0283fa11, 0x0016add8}}, Y: Field{[10]uint32{0x015e8ea0, 0x00deaead, 0x02884f74, 0x01c9058a, 0x03aebe82, 0x00decfe0, 0x027de95b, 0x01e38c5e, 0x0243cc2a, 0x003fcd95}}}, + {X: Field{[10]uint32{0x019d4a85, 0x000f9fe5, 0x00898649, 0x03910943, 0x0266ea88, 0x02800c77, 0x012dd45f, 0x035edfa9, 0x01e48602, 0x001ee4f6}}, Y: Field{[10]uint32{0x022b52f0, 0x01474cc5, 0x01099a48, 0x01807cab, 0x030f6dd0, 0x03beb5b0, 0x00f50a0f, 0x007fa428, 0x02015ab9, 0x0026732c}}}, + {X: Field{[10]uint32{0x0396ebb6, 0x038b38be, 0x00a9307e, 0x0086e584, 0x011de26a, 0x02cded2e, 0x0101be72, 0x009dd904, 0x00b6af64, 0x000b561e}}, Y: Field{[10]uint32{0x00fc585a, 0x012f5f0b, 0x018f547d, 0x01aedf48, 0x00a88706, 0x019c5bcb, 0x00815d94, 0x00013a08, 0x005ddf4b, 0x0004e3b8}}}, + {X: Field{[10]uint32{0x0160af3b, 0x00c9a739, 0x03ee7ac1, 0x03d4e33e, 0x03cf1ccf, 0x039072d5, 0x00a0fce2, 0x00cb6809, 0x0068eebc, 0x000758dc}}, Y: Field{[10]uint32{0x0276eadb, 0x0333f4b0, 0x009ed1b4, 0x0252dfba, 0x02d589a4, 0x0377282b, 0x005ce542, 0x0191159a, 0x01f1a289, 0x001aa4cb}}}, + {X: Field{[10]uint32{0x027de64c, 0x0273c111, 0x029a3947, 0x03bc3fa4, 0x0326a478, 0x0244ac15, 0x0187a680, 0x0048d7cc, 0x036b460e, 0x0020aeae}}, Y: Field{[10]uint32{0x0345647f, 0x00227844, 0x00faff51, 0x0068c9f4, 0x015de43a, 0x013560da, 0x033c11c9, 0x000e5807, 0x0233603d, 0x000ea7d3}}}, + {X: Field{[10]uint32{0x0348090a, 0x01b72a82, 0x01262c27, 0x00d0306e, 0x00a01c51, 0x036ab984, 0x03d899a9, 0x016ff6d8, 0x031d4e71, 0x002ba1b9}}, Y: Field{[10]uint32{0x00fd7b5e, 0x00778a53, 0x02126a30, 0x020e7271, 0x006f2f9e, 0x02d1619e, 0x02c4df93, 0x023deffa, 0x008bfcae, 0x000d592d}}}, + {X: Field{[10]uint32{0x02a413e8, 0x01d0d90a, 0x0000ef57, 0x02f247d0, 0x02664c50, 0x007accad, 0x02d6ad7f, 0x00730fd2, 0x02fbfc66, 0x000d6970}}, Y: Field{[10]uint32{0x02d6cde5, 0x006f33b2, 0x02752711, 0x0249332b, 0x01b901d6, 0x022a0721, 0x00727826, 0x019920f8, 0x01a2887f, 0x0012940a}}}, + {X: Field{[10]uint32{0x0058e2dc, 0x01ac1a56, 0x0360ecbc, 0x0259b1b5, 0x02763244, 0x03494766, 0x027c29ad, 0x00229d87, 0x007f4dd5, 0x000e1afc}}, Y: Field{[10]uint32{0x02407696, 0x006b61f7, 0x01f41e81, 0x008456a0, 0x020f07c6, 0x023ec52c, 0x0103e196, 0x0280e076, 0x00049c1f, 0x00353c52}}}, + {X: Field{[10]uint32{0x02346f96, 0x0379aa84, 0x00909fab, 0x01f32f5c, 0x03f9c46c, 0x02441361, 0x02c445ec, 0x03d33142, 0x001c9bd6, 0x0037fb0e}}, Y: Field{[10]uint32{0x017553f1, 0x033fc09e, 0x03f2e56c, 0x01da922d, 0x03d1ce0f, 0x0365a516, 0x017ef3ca, 0x01926f7e, 0x00f825b6, 0x00179cd1}}}, + {X: Field{[10]uint32{0x002abbb2, 0x0307aa21, 0x00aaa007, 0x000b48d6, 0x02f8a243, 0x03a82ff0, 0x013e0b70, 0x00133152, 0x00c604db, 0x000d81b7}}, Y: Field{[10]uint32{0x0287301d, 0x011f9e15, 0x025edbb5, 0x02c6f880, 0x0387eea8, 0x03b28d99, 0x03569a1f, 0x026dd2e2, 0x003bbc4d, 0x0029721d}}}, + {X: Field{[10]uint32{0x012b0016, 0x014a0979, 0x012b6660, 0x00e239db, 0x00db0860, 0x007464a8, 0x03025a47, 0x025b8a68, 0x0337e190, 0x000d1079}}, Y: Field{[10]uint32{0x01eef0da, 0x02d83de0, 0x01b9e7db, 0x0128de18, 0x015eb9bd, 0x02c8ce8e, 0x003ad47b, 0x032639cf, 0x037ed5ca, 0x0001b443}}}, + {X: Field{[10]uint32{0x02636e99, 0x01504289, 0x03030002, 0x02fd737f, 0x01b1d902, 0x015aa73d, 0x02a7a5c4, 0x0230d2d7, 0x002e460d, 0x002cb25f}}, Y: Field{[10]uint32{0x02057b7c, 0x0227a8f8, 0x02bfa232, 0x007c9c85, 0x021f151e, 0x03da5cf8, 0x03417b3c, 0x03bcc1d4, 0x0081a8c8, 0x0019c4cc}}}, + {X: Field{[10]uint32{0x03e045fd, 0x03054055, 0x01a973b6, 0x02dcf6d1, 0x019b7932, 0x016409ed, 0x03fdabed, 0x00f773e3, 0x018b59a4, 0x0009d02f}}, Y: Field{[10]uint32{0x03b02a85, 0x01e01fa4, 0x0182e1ea, 0x0392c3af, 0x03987aab, 0x0304ddd4, 0x00787a63, 0x006b50b0, 0x02b1f69f, 0x002041bc}}}, + {X: Field{[10]uint32{0x01b6c21b, 0x01597862, 0x009a69ee, 0x01a76331, 0x00aaa8e2, 0x00fe5003, 0x00b4f400, 0x02530336, 0x03d9bdbd, 0x00286b3f}}, Y: Field{[10]uint32{0x02f0235b, 0x0305afc3, 0x00a66df7, 0x03033065, 0x00bcc4fd, 0x03d393d1, 0x00acfbd4, 0x03d4625d, 0x017e0733, 0x0018bb1f}}}, + {X: Field{[10]uint32{0x03349847, 0x007d05d5, 0x00cff630, 0x02f4ccb6, 0x019a5357, 0x00e34eab, 0x038c0f15, 0x012b30c9, 0x02d68d52, 0x00142eca}}, Y: Field{[10]uint32{0x03acfb32, 0x00d4a1fe, 0x03139b85, 0x039659df, 0x02ba4b33, 0x03bc062e, 0x03d4c6e1, 0x009af6e5, 0x03d5d035, 0x00363f0c}}}, + {X: Field{[10]uint32{0x034fdbd9, 0x03420e17, 0x0132ec9f, 0x02823f43, 0x01948e2c, 0x008a2040, 0x035e8601, 0x02d3eb59, 0x02626031, 0x003af7ec}}, Y: Field{[10]uint32{0x000dbf2e, 0x018a69e9, 0x02a0a9c4, 0x010a2546, 0x034f853a, 0x019b8c66, 0x03964e44, 0x0044f76c, 0x026cc470, 0x002c1e01}}}, + {X: Field{[10]uint32{0x018bd48f, 0x022dd0ba, 0x001f63a4, 0x03e05c55, 0x01d57b35, 0x0023f56b, 0x02f73e82, 0x00a8bef7, 0x00236548, 0x00176bd3}}, Y: Field{[10]uint32{0x0287f967, 0x031d728b, 0x0327db2c, 0x03cb08c0, 0x009cbd11, 0x03e8f7fb, 0x03fc83c4, 0x02181fd7, 0x03cb5a24, 0x0024056f}}}, + {X: Field{[10]uint32{0x028533c7, 0x0147327b, 0x0277d085, 0x017cac4a, 0x01238c90, 0x00d4fe09, 0x0219517f, 0x0020519e, 0x00205d84, 0x0008b6e7}}, Y: Field{[10]uint32{0x006dcdf8, 0x01c0e2ce, 0x0231c85f, 0x00a6d811, 0x027ad19e, 0x02e6b3c3, 0x02192642, 0x00a8a28c, 0x03c82343, 0x001a0286}}}, + {X: Field{[10]uint32{0x00c100ae, 0x01ca1875, 0x00d4f4db, 0x016111a5, 0x019fb446, 0x021b9b95, 0x0225213f, 0x02f94649, 0x01d102e8, 0x0010110d}}, Y: Field{[10]uint32{0x011586d1, 0x0213de1b, 0x00f4cb62, 0x016a5078, 0x02dd734e, 0x03e09246, 0x02047768, 0x03bbeba3, 0x0282b321, 0x0027af39}}}, + {X: Field{[10]uint32{0x0037530f, 0x00994cba, 0x009f260c, 0x027331a7, 0x00fe59df, 0x0354b687, 0x0200d1a3, 0x029b7be1, 0x02ff6831, 0x003730db}}, Y: Field{[10]uint32{0x0377a893, 0x0256b307, 0x014d65b7, 0x03fda643, 0x03b6b385, 0x01e159b2, 0x0298c135, 0x02dfa17a, 0x01e67360, 0x0021826d}}}, + {X: Field{[10]uint32{0x001a1514, 0x014f9e67, 0x019a8b43, 0x0101178b, 0x00e991d1, 0x018cf2d2, 0x004cd04c, 0x00e0f929, 0x03941a1c, 0x003bc37e}}, Y: Field{[10]uint32{0x036f6f42, 0x01721abd, 0x006d461e, 0x02f0f8cd, 0x019c3599, 0x01a4fb41, 0x033afabf, 0x017e6adc, 0x0160f2a7, 0x00009a17}}}, + {X: Field{[10]uint32{0x01766b8a, 0x02f14dc7, 0x01b3086a, 0x02eb6758, 0x02410b0f, 0x03299ac1, 0x012e18f2, 0x03bf5ad3, 0x00fdc6c3, 0x00092213}}, Y: Field{[10]uint32{0x00e2267d, 0x01ec5f6b, 0x0119e465, 0x0066a9a1, 0x0086a786, 0x0288f04c, 0x015c6bf8, 0x036a9f4e, 0x008566f3, 0x001f0737}}}, + {X: Field{[10]uint32{0x02cd8b20, 0x01d18c92, 0x01a450de, 0x00219e36, 0x01485b07, 0x0206dbc1, 0x0207756f, 0x012a04b1, 0x0291c700, 0x001506d9}}, Y: Field{[10]uint32{0x01c609d7, 0x0179d931, 0x0117fc7f, 0x037eba61, 0x00cefff3, 0x008e0de1, 0x009f0d50, 0x010a6b1d, 0x03018a3c, 0x0037733c}}}, + {X: Field{[10]uint32{0x01fa822d, 0x0090b068, 0x03b9a138, 0x0322ee76, 0x02f792cf, 0x03c7e0a5, 0x005eea4f, 0x00b8fea4, 0x01696726, 0x0001518a}}, Y: Field{[10]uint32{0x01e6880e, 0x02b6ff88, 0x0218570d, 0x01c043db, 0x03da2d73, 0x02195967, 0x02d8e7f9, 0x02549d3e, 0x02898e42, 0x0018c048}}}, + {X: Field{[10]uint32{0x00848e83, 0x0200833b, 0x01f6d6e1, 0x01241b3a, 0x003ddfd9, 0x001185bf, 0x0122bb97, 0x004a7734, 0x0112ad2c, 0x002501c2}}, Y: Field{[10]uint32{0x0314017b, 0x02e9b66d, 0x01536d1f, 0x03e0ad5c, 0x00b5d261, 0x0169cca9, 0x0101080b, 0x0327c532, 0x00e56bfa, 0x00270ece}}}, + {X: Field{[10]uint32{0x023ca6c9, 0x02e4a95b, 0x020173ed, 0x0180d94e, 0x02ea73b0, 0x00505ee4, 0x028071cc, 0x01987abe, 0x00e48ddc, 0x000a98cc}}, Y: Field{[10]uint32{0x03fc7d79, 0x01d878f0, 0x016f3d8b, 0x00e1ad54, 0x035802bc, 0x02fd3eea, 0x02d56a3f, 0x030d42e8, 0x01cd4754, 0x002ce314}}}, + {X: Field{[10]uint32{0x03f7424d, 0x02c11eb4, 0x00c39dac, 0x0071fbf1, 0x008c418c, 0x03fd69f5, 0x024078c5, 0x03685d6b, 0x00935f95, 0x002450b9}}, Y: Field{[10]uint32{0x0085cd05, 0x022b732e, 0x02ac0e69, 0x01fd629f, 0x0137d0ab, 0x0293e6c1, 0x0284ea55, 0x00cea7a1, 0x0274c471, 0x00054596}}}, + {X: Field{[10]uint32{0x0285804d, 0x03a995b2, 0x0169ad1e, 0x01c9ff2f, 0x000bb8d3, 0x022351fa, 0x0263ef38, 0x0137bb6e, 0x03295cac, 0x000b8662}}, Y: Field{[10]uint32{0x0380fd52, 0x01ae7b19, 0x02e63067, 0x01a07148, 0x00eb3824, 0x02c720c3, 0x02b0c2b1, 0x03fef854, 0x01b3e700, 0x000c7757}}}, + {X: Field{[10]uint32{0x0272f72d, 0x03d4db2c, 0x0264e5a3, 0x038befc0, 0x0032a671, 0x02f66f16, 0x023e52a7, 0x032bebc4, 0x01e9b2ef, 0x002d138d}}, Y: Field{[10]uint32{0x02a43423, 0x005a9696, 0x02b0871c, 0x0304e4d2, 0x03f80c81, 0x0090f992, 0x032b80a1, 0x027f5098, 0x03e3beb3, 0x00235227}}}, + {X: Field{[10]uint32{0x003a3cd7, 0x037d906e, 0x013beefd, 0x02d6439b, 0x00f609f0, 0x008918f7, 0x02cf365c, 0x012db6d7, 0x0101e132, 0x0037266b}}, Y: Field{[10]uint32{0x0111b682, 0x03f921bb, 0x003decf0, 0x02511e81, 0x03a4c1e7, 0x00e4f021, 0x000ad6a4, 0x02fabccb, 0x02ca2fea, 0x002d2d08}}}, + {X: Field{[10]uint32{0x0162a359, 0x03146ebe, 0x0237648f, 0x03f3a8a1, 0x013029eb, 0x021a3d34, 0x02af89bb, 0x0070b73e, 0x038eeb99, 0x00385d20}}, Y: Field{[10]uint32{0x00e7570b, 0x016b4aa8, 0x01ec70c0, 0x018a086a, 0x000238dc, 0x0369731d, 0x031b60a4, 0x0377252e, 0x008727cb, 0x003e0373}}}, + {X: Field{[10]uint32{0x02583d33, 0x00437ea8, 0x0349765d, 0x0062d5a2, 0x014ca21d, 0x02dce7ad, 0x00d79a48, 0x005b510b, 0x018b15bd, 0x0018900d}}, Y: Field{[10]uint32{0x00ec2d00, 0x00f0375b, 0x0013fa61, 0x005b7ccd, 0x01fc5461, 0x0290db54, 0x02d8caa8, 0x01d543b5, 0x014d724e, 0x001ab2c1}}}, + {X: Field{[10]uint32{0x023f8d70, 0x01a0d0b9, 0x007b2e62, 0x01dcb070, 0x02aa61c0, 0x03f4ebde, 0x03a29b4b, 0x02b03d50, 0x00eb560a, 0x0029d5ff}}, Y: Field{[10]uint32{0x000352da, 0x0031033d, 0x0057b39d, 0x01419d25, 0x02b4c074, 0x02f1a880, 0x00713e27, 0x015743ed, 0x02eff808, 0x00161933}}}, + {X: Field{[10]uint32{0x03777bba, 0x02f5044b, 0x008143a1, 0x02602f1d, 0x01d4b1f4, 0x03942746, 0x02e94162, 0x00527640, 0x007357c3, 0x003cdb84}}, Y: Field{[10]uint32{0x03d1993e, 0x02a5a60e, 0x0025a14a, 0x010de3c3, 0x0045f74b, 0x01b0ff92, 0x00d93967, 0x009a4f90, 0x022d139a, 0x003535f6}}}, + {X: Field{[10]uint32{0x024af99a, 0x01a75648, 0x0020b172, 0x013f3125, 0x004a8e0e, 0x0189dfbc, 0x0134949b, 0x003fdc4e, 0x014b55a4, 0x00213bcb}}, Y: Field{[10]uint32{0x01ea73a6, 0x020c2161, 0x03e3e80a, 0x01d9d53b, 0x0260465e, 0x02c759d4, 0x03f2b7a0, 0x01423d97, 0x00b701d3, 0x0015ebff}}}, + {X: Field{[10]uint32{0x03ce7576, 0x01e1e10f, 0x03f4784f, 0x037d022c, 0x0296b046, 0x03fca2eb, 0x02fdca34, 0x03d9b5f7, 0x024b274f, 0x0004e3bd}}, Y: Field{[10]uint32{0x02e1ecf1, 0x021546ff, 0x03d4ced9, 0x004bb929, 0x01dfe979, 0x000c94bb, 0x02010cbd, 0x01f10d04, 0x00e51d51, 0x003af741}}}, + {X: Field{[10]uint32{0x011f318c, 0x032d820f, 0x0189b435, 0x00a38b66, 0x032d4547, 0x01434c15, 0x02a11455, 0x015a4884, 0x03fe2ba0, 0x003a0bc0}}, Y: Field{[10]uint32{0x0012dcda, 0x017d8fd6, 0x010f2eb2, 0x00dd8099, 0x03613b29, 0x028d3848, 0x02aaf1fe, 0x0162064a, 0x03b9cf29, 0x0006469b}}}, + {X: Field{[10]uint32{0x02afb317, 0x02f4b216, 0x0296be44, 0x02630346, 0x00111170, 0x03cd17b0, 0x035fb3e7, 0x01beb1fa, 0x0000676b, 0x0015a9a1}}, Y: Field{[10]uint32{0x031dfb4e, 0x016c33a7, 0x0194903f, 0x03f33874, 0x02f49ff2, 0x03106067, 0x01dcb5f4, 0x02df316e, 0x027a5ae1, 0x000e9060}}}, + {X: Field{[10]uint32{0x001309f5, 0x028f0cb7, 0x010084ef, 0x006b9029, 0x028f735b, 0x007c9982, 0x02fe255e, 0x00f6d3ce, 0x007f1b35, 0x0020bd5d}}, Y: Field{[10]uint32{0x024a0144, 0x02a64189, 0x03bd7dd5, 0x028a933d, 0x03d05f9e, 0x0055caef, 0x007e4c67, 0x03007dfa, 0x0103f4cc, 0x0010ba2e}}}, + {X: Field{[10]uint32{0x02e0cf13, 0x02b5651d, 0x002bb0bf, 0x03040678, 0x0280ef76, 0x01dacc4d, 0x0389e0c3, 0x00659292, 0x0141c47b, 0x002244da}}, Y: Field{[10]uint32{0x002d3f3b, 0x01d4de8b, 0x0221af6f, 0x01641dfd, 0x01d722e6, 0x005df18d, 0x0071bc50, 0x01593fd2, 0x0385fb6a, 0x002ce8a9}}}, + {X: Field{[10]uint32{0x02238909, 0x018297d0, 0x01df1c73, 0x02ee5d9c, 0x010b9954, 0x03bd7628, 0x030cb51e, 0x03d60003, 0x01690c98, 0x00318942}}, Y: Field{[10]uint32{0x018ec724, 0x01cc68c1, 0x01240219, 0x0365ac7b, 0x01552d5b, 0x0065f83a, 0x013f935e, 0x02ac8937, 0x024c915e, 0x0020f40c}}}, + {X: Field{[10]uint32{0x03c7e3b4, 0x0047f523, 0x00184274, 0x02377439, 0x01ad1293, 0x03aa6761, 0x024a481d, 0x00c80119, 0x02d96391, 0x00388e66}}, Y: Field{[10]uint32{0x03c69d47, 0x01537e24, 0x03298f9b, 0x0287ec43, 0x005d8b1f, 0x02270de0, 0x02836ed3, 0x00a388ba, 0x0162beae, 0x00183fff}}}, + {X: Field{[10]uint32{0x0003d959, 0x03e0870c, 0x007b85a1, 0x035f09f3, 0x020a59c5, 0x032345e5, 0x02383d6c, 0x00a64a69, 0x031c186d, 0x00013402}}, Y: Field{[10]uint32{0x02487640, 0x00c9fa33, 0x01cb4687, 0x0375be35, 0x02dd4aa3, 0x002df1f9, 0x01c8ce7a, 0x0067f527, 0x02d127eb, 0x0021d4ba}}}, + {X: Field{[10]uint32{0x0264121e, 0x025ceba4, 0x003185ea, 0x028d6591, 0x00933cbf, 0x02df8712, 0x02548e98, 0x014b246a, 0x03ef8b8b, 0x000d1198}}, Y: Field{[10]uint32{0x014d9efd, 0x02b9d814, 0x02b06dfe, 0x01738bdc, 0x036fe388, 0x02fa959c, 0x017e6240, 0x023bb2e5, 0x01c89dfe, 0x001cf426}}}, + {X: Field{[10]uint32{0x00de6648, 0x0222ef68, 0x019e35c7, 0x0355f28c, 0x03f411d3, 0x02526d3c, 0x03038d47, 0x00aa60cc, 0x004ddbd2, 0x000dffd2}}, Y: Field{[10]uint32{0x00547c67, 0x02b9aa48, 0x00bfba9a, 0x021a0e60, 0x03a45cf0, 0x03b07d70, 0x03b14554, 0x0236074b, 0x014b5161, 0x0015694e}}}, + {X: Field{[10]uint32{0x03556ca5, 0x0256c185, 0x012e14d7, 0x01c035bc, 0x00d2881f, 0x0331b4f6, 0x01339d14, 0x0019ae42, 0x01db0ad5, 0x0033cef3}}, Y: Field{[10]uint32{0x01678a6f, 0x025e91c4, 0x000b13c1, 0x03dc22df, 0x00b61b90, 0x009d8089, 0x020e4023, 0x003c8188, 0x02bc99e2, 0x003849a1}}}, + {X: Field{[10]uint32{0x01a73402, 0x000bb7d7, 0x00d4149f, 0x02852606, 0x03d35e47, 0x00f5d296, 0x00f91101, 0x0346b28e, 0x02e7db8f, 0x00258740}}, Y: Field{[10]uint32{0x01fed240, 0x0014561c, 0x0282a1db, 0x02b7f8be, 0x01765dc8, 0x03fc85fa, 0x0115ca3b, 0x019df059, 0x02acd698, 0x002518ba}}}, + {X: Field{[10]uint32{0x006ec3ba, 0x02be5fad, 0x0135c5e1, 0x00901169, 0x003648b7, 0x01d2052b, 0x0122ca60, 0x02399497, 0x0390574a, 0x0010f98b}}, Y: Field{[10]uint32{0x01939734, 0x01a8d6cf, 0x033a318f, 0x02167b71, 0x03e141dc, 0x00634140, 0x029e20ed, 0x033c5e4d, 0x025617c1, 0x001b7bc2}}}, + {X: Field{[10]uint32{0x03dfdbb7, 0x02001495, 0x0116033b, 0x02d2a58b, 0x020457e4, 0x0237a4ec, 0x02113cf9, 0x000630d4, 0x03799d79, 0x00279a0a}}, Y: Field{[10]uint32{0x0049041b, 0x00fb1754, 0x001e93f2, 0x0153ba6a, 0x01b29833, 0x010174b2, 0x00468a06, 0x018d0e27, 0x0316bfe9, 0x00276e72}}}, + {X: Field{[10]uint32{0x01a1a8b4, 0x021db935, 0x008f9436, 0x0390800b, 0x025f9682, 0x02148064, 0x0222d130, 0x02d676ca, 0x03a78079, 0x001e4061}}, Y: Field{[10]uint32{0x03fa456e, 0x02564b2b, 0x004de17e, 0x0075a981, 0x02ade0ad, 0x01aa39aa, 0x014381e5, 0x00c600d9, 0x0346f6b4, 0x00009722}}}, + {X: Field{[10]uint32{0x00169583, 0x0339557c, 0x02b1d683, 0x030c356e, 0x01662a0d, 0x016887ff, 0x0222d653, 0x012cce67, 0x038a6c74, 0x0024a292}}, Y: Field{[10]uint32{0x026fcf84, 0x01373266, 0x01eaa75d, 0x03d9a1ff, 0x01323d55, 0x03fb21ea, 0x01af7e45, 0x02552f87, 0x0284c064, 0x000947fb}}}, + {X: Field{[10]uint32{0x02084c88, 0x01b0fd2f, 0x03fde6c1, 0x00fa6efe, 0x03a6ffb7, 0x03262e1b, 0x01872de8, 0x00bcb2b1, 0x00da8118, 0x001a13a2}}, Y: Field{[10]uint32{0x036383fe, 0x03c19173, 0x00bb60bf, 0x02c1abee, 0x03ad179e, 0x01d55eac, 0x01ae45ff, 0x018b5648, 0x019dfc9d, 0x0031146d}}}, + {X: Field{[10]uint32{0x01174343, 0x02defe93, 0x02f6cad7, 0x033aa165, 0x038e8166, 0x02526f3a, 0x00ebfa86, 0x02c335ea, 0x0283a403, 0x0022f74b}}, Y: Field{[10]uint32{0x00177172, 0x032f23ea, 0x03bad08c, 0x0167a7bf, 0x03643bb3, 0x03b24df0, 0x0307b2fe, 0x020be1f5, 0x014797f6, 0x001c8830}}}, + {X: Field{[10]uint32{0x02399543, 0x03a02c2f, 0x008b4b69, 0x01a791a5, 0x03b71958, 0x03e487da, 0x0258ef50, 0x01254a14, 0x03216e3c, 0x0030fe8e}}, Y: Field{[10]uint32{0x02ec1796, 0x03b654c2, 0x0310fc8e, 0x0285d22e, 0x015a519c, 0x0009b0b1, 0x00880503, 0x01986ddc, 0x00ed21f6, 0x003ac811}}}, + {X: Field{[10]uint32{0x037e63a2, 0x028e29eb, 0x02b483d6, 0x034b990a, 0x00195a8b, 0x0034d578, 0x01fb0df5, 0x00a564de, 0x0013eb2d, 0x0007018f}}, Y: Field{[10]uint32{0x030f2abb, 0x03d5cde1, 0x02ed7cfc, 0x01d1fd11, 0x02b00428, 0x0310389a, 0x005005c8, 0x027fd9d7, 0x0392d14c, 0x000814e3}}}, + {X: Field{[10]uint32{0x0331d452, 0x006d7803, 0x0399981f, 0x037841f8, 0x016c6086, 0x009f2d4e, 0x002dc6c2, 0x03063d2e, 0x03977b54, 0x00183019}}, Y: Field{[10]uint32{0x0098429a, 0x0157c637, 0x0013b737, 0x03dc2ab3, 0x02ce0e8b, 0x015ebebf, 0x03d2617b, 0x0046cb9b, 0x02c4e3eb, 0x000fd151}}}, + {X: Field{[10]uint32{0x02a36856, 0x03c022ff, 0x01722c0a, 0x00aebc61, 0x03421cdc, 0x008c7b62, 0x0263e90a, 0x01aaef3c, 0x03999225, 0x003f0573}}, Y: Field{[10]uint32{0x0235d798, 0x00d375f1, 0x0197e276, 0x025fd726, 0x00c01dbd, 0x0268efc9, 0x01d46e46, 0x00214dc3, 0x02a4d9c4, 0x002af8d1}}}, + {X: Field{[10]uint32{0x03249454, 0x023f9109, 0x02ee5c6f, 0x01a99649, 0x001a92b0, 0x0322c1ee, 0x00da262b, 0x00eedd0a, 0x01851817, 0x003d850e}}, Y: Field{[10]uint32{0x0301cf84, 0x00f38635, 0x004aab9f, 0x03a6731e, 0x0011fced, 0x02fa397a, 0x001f06d4, 0x01630835, 0x02ef3a25, 0x002c760c}}}, + {X: Field{[10]uint32{0x0261b5f5, 0x0085b73b, 0x00bc7ad5, 0x010c4275, 0x0301f1fd, 0x01a845aa, 0x02685427, 0x02110907, 0x00a96221, 0x0015e516}}, Y: Field{[10]uint32{0x0053e2d8, 0x0352d84b, 0x03e237bd, 0x01365eba, 0x0021274a, 0x00d6fb5c, 0x00c8d461, 0x015f1857, 0x007468c1, 0x000cf959}}}, + {X: Field{[10]uint32{0x01fe62e7, 0x01479e90, 0x023bd8c0, 0x0007f85f, 0x03abab20, 0x038d57a3, 0x0162678f, 0x0104cad5, 0x03dcb080, 0x0018dd54}}, Y: Field{[10]uint32{0x03572dce, 0x005e4826, 0x00d3c319, 0x025a1d38, 0x036989b2, 0x019ee853, 0x026a9511, 0x01b87fc6, 0x01c2ad58, 0x000a2f5b}}}, + {X: Field{[10]uint32{0x0180e2a3, 0x00dc8bad, 0x028ea66c, 0x036d5dfe, 0x0389e99d, 0x03953d60, 0x01ddb923, 0x02156f88, 0x030f6f64, 0x003baef5}}, Y: Field{[10]uint32{0x02fd4d68, 0x021a09cc, 0x00e1dedc, 0x0260f7d8, 0x007c9866, 0x034eb13b, 0x015606ea, 0x000d1529, 0x017915b5, 0x000f46da}}}, + {X: Field{[10]uint32{0x006c56fb, 0x0143909a, 0x01ddb2e3, 0x022db971, 0x023a6e88, 0x01de448d, 0x011135f3, 0x02c769a2, 0x031f2bf4, 0x0013b224}}, Y: Field{[10]uint32{0x02a09bc7, 0x0277c8d5, 0x019f535d, 0x004155a4, 0x003cbab9, 0x02370f8a, 0x03197704, 0x00c1aaf5, 0x02794c2b, 0x00357db1}}}, + {X: Field{[10]uint32{0x02e9730e, 0x03094eaf, 0x001a735b, 0x01733137, 0x018f4937, 0x03f571dc, 0x004deabf, 0x01f9e9f6, 0x0376fc5b, 0x001ad69f}}, Y: Field{[10]uint32{0x03b58af8, 0x0277d910, 0x00b7af8f, 0x02afdab6, 0x039eafb8, 0x006155d5, 0x02562df1, 0x017daac4, 0x01c48fbf, 0x0007a4d7}}}, + {X: Field{[10]uint32{0x02013af7, 0x0391e227, 0x00f27683, 0x03cc8753, 0x035f5b73, 0x01f8a601, 0x024c7591, 0x02562909, 0x01ebf620, 0x000a8c4a}}, Y: Field{[10]uint32{0x01020da4, 0x006487f4, 0x036c689a, 0x00be9b09, 0x01406673, 0x036e2b1f, 0x0346edef, 0x00a2cfe8, 0x01e4c1fc, 0x003a503d}}}, + {X: Field{[10]uint32{0x0328b5ab, 0x03d458ee, 0x02d124c6, 0x00ef120d, 0x0294a872, 0x02fcb209, 0x0307f345, 0x010fcde0, 0x001ce994, 0x00022ffa}}, Y: Field{[10]uint32{0x00433c71, 0x0192b0fc, 0x01348364, 0x01214b99, 0x0087de98, 0x02345de9, 0x028edc26, 0x017ebe5d, 0x0227857e, 0x00162c5b}}}, + {X: Field{[10]uint32{0x02d61be3, 0x00cdef62, 0x00f831c1, 0x024a8143, 0x01054236, 0x03934d5b, 0x039daf3e, 0x0159b4b4, 0x00d9449c, 0x0011e083}}, Y: Field{[10]uint32{0x0152c2e4, 0x03ca3326, 0x026655e5, 0x0232a6ba, 0x011200d3, 0x00bc9d11, 0x02d069d2, 0x02a04001, 0x02032988, 0x001237eb}}}, + {X: Field{[10]uint32{0x01a934e2, 0x03a64855, 0x01131cd6, 0x0149075f, 0x00f9e8dc, 0x0130fbca, 0x01221d88, 0x00d81627, 0x03ce8e45, 0x000b5fc0}}, Y: Field{[10]uint32{0x03ee9c72, 0x00ae3a2d, 0x0043a57a, 0x01c9b5b2, 0x0116a7b2, 0x00a1813e, 0x014d55fe, 0x03ce387c, 0x03c05a39, 0x0021052c}}}, + {X: Field{[10]uint32{0x01d8e37b, 0x008017a6, 0x0267f1dc, 0x01b2cec7, 0x03f5a5b0, 0x02109416, 0x0150d4ee, 0x02321b08, 0x00ec919d, 0x0020e21f}}, Y: Field{[10]uint32{0x02b4c009, 0x03ba5064, 0x03e327a2, 0x039fe620, 0x03fcea9d, 0x03962117, 0x0134fe12, 0x03ab89e3, 0x03cdf5c9, 0x003fb839}}}, + {X: Field{[10]uint32{0x01ca1e24, 0x037c6474, 0x010f3f37, 0x002469ed, 0x00a9d0b7, 0x01970ff8, 0x028c03f5, 0x02eac836, 0x01e1138b, 0x0001467e}}, Y: Field{[10]uint32{0x0261ba9e, 0x0300da86, 0x039eb367, 0x02a6b79a, 0x01ef6cd6, 0x0207a5bd, 0x0231ec07, 0x033908fd, 0x02fe2bff, 0x001935ae}}}, + {X: Field{[10]uint32{0x028fba61, 0x004eb652, 0x02e6c3cd, 0x03998fb7, 0x023946ff, 0x00a4d854, 0x02de2087, 0x01d3a9a6, 0x038f84bc, 0x0020247d}}, Y: Field{[10]uint32{0x030bda1a, 0x00ea7302, 0x02212fe1, 0x03b0e79e, 0x006765fa, 0x01c02aab, 0x03a5d90d, 0x01a23072, 0x018baf84, 0x0006aaa9}}}, + {X: Field{[10]uint32{0x02db3afc, 0x023a5f9e, 0x01bb49ed, 0x00815b35, 0x018388cf, 0x028dbc43, 0x02a53434, 0x015d21f0, 0x000dd3fe, 0x00142af0}}, Y: Field{[10]uint32{0x01ed25ea, 0x00390763, 0x015d68a8, 0x03640eb7, 0x01670fe0, 0x026e76c0, 0x0064f01d, 0x00103ec7, 0x019514b6, 0x002ae2eb}}}, + {X: Field{[10]uint32{0x02a2f110, 0x001dcacd, 0x0131faa2, 0x00b9b44a, 0x0120e572, 0x010dab9d, 0x024f2533, 0x007d12a7, 0x00bb4da0, 0x002a690a}}, Y: Field{[10]uint32{0x034c0c5f, 0x0321141d, 0x037a0557, 0x02da16d0, 0x00f8c226, 0x03e94f88, 0x00f05822, 0x0289b110, 0x021a1830, 0x002e8144}}}, + {X: Field{[10]uint32{0x007a83ce, 0x026c742b, 0x03ecf64e, 0x0396ddd4, 0x01d6948b, 0x0047a668, 0x03fa11b2, 0x0359ddc9, 0x03d46314, 0x0035ebf6}}, Y: Field{[10]uint32{0x00e21d04, 0x02e8734d, 0x008f480a, 0x03e945ca, 0x03ee9b2a, 0x0272d0aa, 0x010ed9d7, 0x012aee8e, 0x017d748a, 0x002d7e2e}}}, + {X: Field{[10]uint32{0x036de265, 0x00aaff66, 0x03a99d62, 0x006b5462, 0x0113f19b, 0x019cab15, 0x0141694b, 0x01119a8f, 0x034cd2b5, 0x000adae0}}, Y: Field{[10]uint32{0x02b9b0d6, 0x033b141e, 0x01df187c, 0x026e24b6, 0x0174ec84, 0x032facb9, 0x01d52dd3, 0x02cf4ab4, 0x0193ddc0, 0x00306489}}}, + {X: Field{[10]uint32{0x016ac8ea, 0x018326ea, 0x025a2513, 0x012c68fb, 0x03f29c34, 0x0270471a, 0x016ef7ea, 0x00fe8c56, 0x034ad7f9, 0x003ce4f3}}, Y: Field{[10]uint32{0x028133e1, 0x03b6ea9e, 0x027ec41b, 0x02ccd78e, 0x01fbfa56, 0x00341849, 0x02480163, 0x033bae43, 0x00a9de67, 0x0013a047}}}, + {X: Field{[10]uint32{0x008f418a, 0x0235d7a7, 0x03c0e084, 0x02f414be, 0x00bbc546, 0x028922a5, 0x03050120, 0x02c95204, 0x02504e14, 0x002f0ee4}}, Y: Field{[10]uint32{0x02a58223, 0x03bcab69, 0x022d9af0, 0x00e31d86, 0x018f5eca, 0x00475e31, 0x013a911f, 0x021f05d9, 0x03c6f8b4, 0x002694ab}}}, + {X: Field{[10]uint32{0x036055c0, 0x019fbbd7, 0x01cec014, 0x00eefdbe, 0x03e71edc, 0x02af6c7d, 0x021e1704, 0x03ee29cc, 0x0273c601, 0x000bd683}}, Y: Field{[10]uint32{0x0153e393, 0x00fd1099, 0x002ebc5a, 0x033c4f65, 0x02b79a5e, 0x03e01c84, 0x01d97f80, 0x00b2c4ee, 0x010d142d, 0x00362ec7}}}, + {X: Field{[10]uint32{0x03a54ae8, 0x00fb4d1c, 0x0215bfa1, 0x01efd72f, 0x018d8d8d, 0x0245b047, 0x01099b96, 0x01a6b213, 0x01e3b4fc, 0x002e0f94}}, Y: Field{[10]uint32{0x023dda5b, 0x00d970b2, 0x02a78f3f, 0x0211b876, 0x01daeb7a, 0x01f3f094, 0x0018084a, 0x00e48c88, 0x038869c5, 0x0008cb83}}}, + {X: Field{[10]uint32{0x03516377, 0x026902f9, 0x00c0ea24, 0x00c16423, 0x00e90e9b, 0x03ba2416, 0x032b3722, 0x01e8c854, 0x019350b0, 0x000425c6}}, Y: Field{[10]uint32{0x020a1055, 0x025adb96, 0x03f672c7, 0x03e7395b, 0x010dc735, 0x00c21e67, 0x023a3a5e, 0x0168126f, 0x027c7bd5, 0x001a682d}}}, + {X: Field{[10]uint32{0x005c4477, 0x009e88fa, 0x01647dcb, 0x0053051a, 0x02622508, 0x000a6774, 0x0171711a, 0x014063cf, 0x035cc95d, 0x0036fbbd}}, Y: Field{[10]uint32{0x00d66413, 0x01daa422, 0x0175335e, 0x038c72fe, 0x00676311, 0x03148dfe, 0x02a68556, 0x013e38ae, 0x02cd1633, 0x003751c4}}}, + {X: Field{[10]uint32{0x03af114f, 0x0201b55a, 0x00d29d96, 0x02239328, 0x03027238, 0x00ded043, 0x0005f185, 0x03a4e3cd, 0x01992bde, 0x000a32c4}}, Y: Field{[10]uint32{0x001e5aa3, 0x03afd2fa, 0x03fea695, 0x01b30a95, 0x01c3e2ef, 0x00e973a2, 0x029fc1e8, 0x0376078e, 0x03febbe5, 0x00039b18}}}, + {X: Field{[10]uint32{0x029f60ba, 0x02e8b893, 0x02da3790, 0x016b919d, 0x00caef38, 0x0273b175, 0x039f1768, 0x03a67997, 0x030b64ef, 0x003c28b7}}, Y: Field{[10]uint32{0x007a4519, 0x02db4520, 0x01a85713, 0x0081ef3c, 0x02006a25, 0x02a9df69, 0x0098c12a, 0x03d99051, 0x0208b900, 0x0029f29f}}}, + {X: Field{[10]uint32{0x002b0f00, 0x037ff952, 0x01410799, 0x001a6aec, 0x0254fe9b, 0x03d54c41, 0x007ad4f0, 0x010e5837, 0x02eb38e5, 0x00346ed1}}, Y: Field{[10]uint32{0x02ce4214, 0x007e48ba, 0x00b14a03, 0x00b2be4c, 0x00d03bbd, 0x01a09adb, 0x00a54639, 0x00c2d834, 0x019fe088, 0x00052c18}}}, + {X: Field{[10]uint32{0x0369517a, 0x00333807, 0x00a8415c, 0x00083152, 0x0185d740, 0x03074268, 0x01adb31a, 0x0049a97d, 0x02567705, 0x0009ef4b}}, Y: Field{[10]uint32{0x01468d32, 0x01e064a9, 0x0008f655, 0x02b61cd3, 0x03202690, 0x0238c0b5, 0x01ce428a, 0x00734a7e, 0x01d7cba2, 0x0004880f}}}, + {X: Field{[10]uint32{0x03d21d9c, 0x010c806f, 0x003bd61d, 0x0376e36f, 0x0355441a, 0x02cad9db, 0x03835efa, 0x038805a4, 0x03901c72, 0x001acb31}}, Y: Field{[10]uint32{0x02dd7456, 0x016ce8d2, 0x015601bd, 0x0014639d, 0x006690bb, 0x018bfce3, 0x03f90d4b, 0x00124f6b, 0x0006deea, 0x001665cd}}}, + {X: Field{[10]uint32{0x00840f27, 0x0027ed65, 0x012675df, 0x024f981f, 0x01c63c3b, 0x02ff35af, 0x02a8bcc6, 0x014f158c, 0x003f32f9, 0x001d7a17}}, Y: Field{[10]uint32{0x00b6bb30, 0x03c07b5b, 0x01c47723, 0x02832fdb, 0x00bc59ac, 0x0109b99a, 0x0324f89d, 0x031cf65a, 0x03768714, 0x0008bd68}}}, + {X: Field{[10]uint32{0x006d56a7, 0x00802e7e, 0x0268315e, 0x0149a314, 0x02f26e17, 0x038a3c79, 0x000eed57, 0x0054bd07, 0x0071969e, 0x0034de8c}}, Y: Field{[10]uint32{0x02ff6181, 0x0080d59d, 0x036d3abe, 0x030ed1d0, 0x0370e296, 0x025885c8, 0x004b1fbd, 0x00747437, 0x03269875, 0x0014f549}}}, + {X: Field{[10]uint32{0x03414976, 0x014407a9, 0x001d237d, 0x0262538d, 0x02676931, 0x03860eec, 0x01466408, 0x01a5ccd9, 0x03047f5e, 0x001c56ec}}, Y: Field{[10]uint32{0x01a968d4, 0x01827ba8, 0x01acadb7, 0x03ec0f60, 0x02a89dd1, 0x03a570f5, 0x01ea6722, 0x0357a1e9, 0x035f9e82, 0x000a1103}}}, + {X: Field{[10]uint32{0x02c642e8, 0x022b7df6, 0x0013968d, 0x0292c21f, 0x028e4924, 0x01a04bb0, 0x034a52cc, 0x0056569e, 0x002a4f5b, 0x003dcb45}}, Y: Field{[10]uint32{0x021087dd, 0x023e5e9d, 0x007a6537, 0x0333eebd, 0x00585486, 0x03165305, 0x02ab9bbb, 0x0010b3c5, 0x004bb5d8, 0x001406d9}}}, + {X: Field{[10]uint32{0x01284c26, 0x00ee58b0, 0x03f28024, 0x01b363ef, 0x00384084, 0x0291a7cd, 0x003cf020, 0x0228e97f, 0x038fb4ca, 0x001ecfbf}}, Y: Field{[10]uint32{0x01748579, 0x0240ad6c, 0x00522811, 0x01bbf544, 0x023bbf63, 0x03858408, 0x00bc5555, 0x01849294, 0x00fd1539, 0x002f8962}}}, + {X: Field{[10]uint32{0x02113dd8, 0x017f0de2, 0x018a59cc, 0x00d7fcad, 0x03ec2a70, 0x025d3933, 0x03652257, 0x03b29334, 0x00d771fb, 0x0009106a}}, Y: Field{[10]uint32{0x02447981, 0x00a624e0, 0x00fccae1, 0x00b64c5b, 0x00fe035d, 0x02b08cd8, 0x03f4c6a7, 0x019c4d2e, 0x03760531, 0x000152c1}}}, + {X: Field{[10]uint32{0x00cf7591, 0x03a68a85, 0x0024de78, 0x01f2d92e, 0x02512d09, 0x03d2ace1, 0x03916b12, 0x019f2916, 0x024ed054, 0x003083f2}}, Y: Field{[10]uint32{0x00eecc02, 0x008d56b9, 0x0346d02b, 0x022c8e33, 0x03931fc4, 0x036b4439, 0x007e69c9, 0x0101cb2a, 0x00c796ee, 0x0022146b}}}, + {X: Field{[10]uint32{0x009ec8e7, 0x024bac81, 0x01d67634, 0x01b5a437, 0x00a34c6c, 0x035d604c, 0x00e415aa, 0x01498edd, 0x028d0137, 0x000bdac3}}, Y: Field{[10]uint32{0x02f25dbe, 0x01354e36, 0x02868e38, 0x01d7d88d, 0x03adc722, 0x02d327d9, 0x02cb614e, 0x03da9e5d, 0x01f8438c, 0x003431e4}}}, + {X: Field{[10]uint32{0x02b665dd, 0x02e47aac, 0x00762c5a, 0x00f0f763, 0x01fc0037, 0x00dd36c8, 0x00b3ed11, 0x0015b5be, 0x01be426f, 0x002febf0}}, Y: Field{[10]uint32{0x010e2a2e, 0x00d84545, 0x02781684, 0x01429d64, 0x006dc400, 0x02841b69, 0x027b0710, 0x0000e9fe, 0x0297a4cf, 0x0027107c}}}, + {X: Field{[10]uint32{0x01cb4e8c, 0x024c1db3, 0x01be91df, 0x03dc5ca3, 0x03895980, 0x01d675d3, 0x0376f860, 0x0009cdb5, 0x01ca9056, 0x0033dc47}}, Y: Field{[10]uint32{0x034f1cd5, 0x0102a9dc, 0x020124e1, 0x02991fb3, 0x022f91f6, 0x02226c8f, 0x0156defe, 0x0085bf8d, 0x01bfcf25, 0x0014a8de}}}, + {X: Field{[10]uint32{0x03d1384b, 0x0145b26a, 0x0394e1c3, 0x01d46191, 0x03f516fd, 0x00da43cb, 0x0001ec36, 0x03c6630c, 0x01de27aa, 0x002e6fa5}}, Y: Field{[10]uint32{0x02cb6df9, 0x030489c7, 0x013cd27f, 0x0160aea1, 0x001ff85d, 0x02232e3e, 0x029b6144, 0x03710c0f, 0x0397dca1, 0x001a21d7}}}, + {X: Field{[10]uint32{0x00e9638e, 0x014ddcca, 0x03331fff, 0x02cf095f, 0x037bec31, 0x01466b80, 0x0042b377, 0x01aa314d, 0x03e6c4d0, 0x003d7c95}}, Y: Field{[10]uint32{0x03e986dd, 0x03c85950, 0x0169e35f, 0x03b2ed00, 0x02c80bea, 0x03483432, 0x012e3ed0, 0x00c84eed, 0x020a48d0, 0x002da879}}}, + {X: Field{[10]uint32{0x00099ce7, 0x02455799, 0x02bf9df0, 0x00ff2db3, 0x02a5281b, 0x002bdf64, 0x00036033, 0x022a8456, 0x034c17e3, 0x003f0d71}}, Y: Field{[10]uint32{0x0379dae9, 0x00e489f6, 0x0245ac62, 0x02ecbb23, 0x018421fb, 0x0205344c, 0x00c1c589, 0x01a4ed69, 0x004d41e8, 0x001b8be6}}}, + {X: Field{[10]uint32{0x014384dd, 0x00bf33b5, 0x00aa7473, 0x0287338d, 0x02c1bc18, 0x027feb29, 0x005e5a98, 0x01cd8dd0, 0x020149d9, 0x002b04d7}}, Y: Field{[10]uint32{0x02f021d0, 0x00685882, 0x01cb1c47, 0x014d844f, 0x01d8e545, 0x027e35c2, 0x00cbf630, 0x0129adaf, 0x02cdff95, 0x000f8e2e}}}, + {X: Field{[10]uint32{0x035f345d, 0x01d3e4a7, 0x01055f36, 0x015f3d30, 0x01bfd8f6, 0x01e46806, 0x02400c4e, 0x03175e00, 0x03fbefb3, 0x00182804}}, Y: Field{[10]uint32{0x00a1bd97, 0x00817cce, 0x035b2711, 0x019151a2, 0x039907e3, 0x028c8004, 0x00a5138c, 0x03f8f8a8, 0x00483582, 0x001f9d8f}}}, + {X: Field{[10]uint32{0x01a7acb7, 0x03413a86, 0x013a906e, 0x01642fbe, 0x02ceb3a6, 0x029e2664, 0x023d0273, 0x01ea290e, 0x01065d90, 0x00282668}}, Y: Field{[10]uint32{0x03c5a50d, 0x038f5ed6, 0x007db06f, 0x02836c50, 0x02d5cca4, 0x03c326d1, 0x034bb579, 0x008bff00, 0x03fbfe3c, 0x0004dfe7}}}, + {X: Field{[10]uint32{0x00a792ab, 0x03d3f0e5, 0x0107b09e, 0x005c127c, 0x00c6ed70, 0x00472769, 0x03ea5a8c, 0x018f5861, 0x0286d027, 0x0026e876}}, Y: Field{[10]uint32{0x0263f741, 0x00866759, 0x01650c47, 0x029970b6, 0x008716ae, 0x0005d461, 0x03879089, 0x0167156f, 0x02d8ab54, 0x003c6788}}}, + {X: Field{[10]uint32{0x0277ada0, 0x01453269, 0x0134f63a, 0x00e24d42, 0x01b5e022, 0x03ca3643, 0x03e93633, 0x0050c05e, 0x001ad30d, 0x000d909c}}, Y: Field{[10]uint32{0x01aba970, 0x00378efc, 0x02c22344, 0x02613d4a, 0x026432fa, 0x02a2ef61, 0x0279f487, 0x02ef1b13, 0x02b9c76b, 0x000bf7e6}}}, + {X: Field{[10]uint32{0x02941a5b, 0x028e94b5, 0x02c31c2e, 0x003551c4, 0x0106188c, 0x00b261c6, 0x0153012e, 0x01c26363, 0x0058100b, 0x000a7de7}}, Y: Field{[10]uint32{0x022d524b, 0x01a242e6, 0x01bf3721, 0x02dc0b56, 0x02919d5b, 0x021a8a01, 0x00ec42f5, 0x0306ec34, 0x0199eaa6, 0x002fa7b7}}}, + {X: Field{[10]uint32{0x01ba1bbc, 0x034b11e2, 0x03061e5e, 0x0342b17f, 0x0004b470, 0x00ffacd4, 0x02d5030c, 0x00a13e05, 0x02dfbc35, 0x0038046a}}, Y: Field{[10]uint32{0x00c979e3, 0x0030068f, 0x0270055a, 0x02a4fd2c, 0x03021ec1, 0x00a4ef9d, 0x026ee97f, 0x016468db, 0x03934f2b, 0x00382a63}}}, + {X: Field{[10]uint32{0x03d78585, 0x025bb813, 0x02dfb3ed, 0x0145dfff, 0x020ee06a, 0x022e4887, 0x02b54b68, 0x014d58df, 0x016b00fe, 0x00297220}}, Y: Field{[10]uint32{0x01ff8e5f, 0x02f96a32, 0x0076fe03, 0x0076bb59, 0x037d6595, 0x029abb54, 0x00977929, 0x02c46912, 0x037b9d63, 0x000fe198}}}, + {X: Field{[10]uint32{0x03194707, 0x03c5b271, 0x02509abe, 0x038244a8, 0x022e6d49, 0x01c23f39, 0x0207798e, 0x00d42e54, 0x00237e44, 0x000ee54b}}, Y: Field{[10]uint32{0x01d68936, 0x026d676f, 0x02edaff4, 0x00c5af37, 0x02e6ebb6, 0x01e44b99, 0x0141a385, 0x01b22b27, 0x032a419e, 0x003de125}}}, + {X: Field{[10]uint32{0x0157af04, 0x000bc937, 0x02632725, 0x004667e1, 0x02b75dd6, 0x021e92aa, 0x007982a1, 0x0054be03, 0x02bcd9d8, 0x002365e5}}, Y: Field{[10]uint32{0x03e611bd, 0x026080ad, 0x0092c89c, 0x034a63a6, 0x010317c2, 0x035a2654, 0x015695f2, 0x0078e8a3, 0x007994a3, 0x003ee6c5}}}, + {X: Field{[10]uint32{0x0202de40, 0x005dc11a, 0x03f51845, 0x01edbbd9, 0x014fde4d, 0x01e2259a, 0x036f689d, 0x01911454, 0x005b2f4e, 0x0025acaf}}, Y: Field{[10]uint32{0x008e89cc, 0x01712842, 0x0178b214, 0x026cd4b0, 0x01914eee, 0x03eff394, 0x039bbf5a, 0x020b6d40, 0x0126f919, 0x00382ddb}}}, + {X: Field{[10]uint32{0x032e2d79, 0x03bd7490, 0x0103625b, 0x02e68743, 0x034e3ab2, 0x01963be5, 0x028f54d8, 0x0254038a, 0x03109f12, 0x0026fdf3}}, Y: Field{[10]uint32{0x016e8582, 0x0343c652, 0x0020be32, 0x029c66f3, 0x01dd6373, 0x0223af49, 0x038bb521, 0x0071a146, 0x03adf77e, 0x000844f5}}}, + {X: Field{[10]uint32{0x03d4f1b7, 0x0013cabc, 0x00dab11a, 0x00f58756, 0x00c91f85, 0x0366a861, 0x008c7414, 0x016d7abf, 0x03a72037, 0x000434ff}}, Y: Field{[10]uint32{0x03298c90, 0x0043a8c3, 0x0321beeb, 0x002b505b, 0x02c98d75, 0x03e30fc0, 0x015c7046, 0x03d0f2c8, 0x032a8a96, 0x00307e12}}}, + {X: Field{[10]uint32{0x003a5eb6, 0x019e7a03, 0x00e92c0e, 0x01fa210c, 0x030e9257, 0x006da1cc, 0x01636920, 0x007342e3, 0x022b6adf, 0x0015b593}}, Y: Field{[10]uint32{0x02f71cc0, 0x0069badf, 0x0382451b, 0x01f89792, 0x025d4b68, 0x01f579a5, 0x00427c25, 0x02108d22, 0x030efbe9, 0x0000004d}}}, + {X: Field{[10]uint32{0x031528bf, 0x02b70d1c, 0x021c1420, 0x014a95a0, 0x026dbfa3, 0x003091e4, 0x01eddbd2, 0x033c81d7, 0x003e1c83, 0x003fb128}}, Y: Field{[10]uint32{0x01a95509, 0x01f9aa2f, 0x00b2aa78, 0x023bf5ef, 0x031bab78, 0x00e1fa6f, 0x03a0d98f, 0x0390b4ee, 0x02af8670, 0x002854ac}}}, + {X: Field{[10]uint32{0x03ee92eb, 0x030983cb, 0x03001779, 0x036ca6a1, 0x02a45d11, 0x02256796, 0x02e6d53e, 0x02a6b18e, 0x01177cce, 0x0016029d}}, Y: Field{[10]uint32{0x029e8edd, 0x03d3e719, 0x02a06862, 0x02436304, 0x0086733a, 0x0054dd69, 0x008c4111, 0x03193081, 0x029c3263, 0x001e4ef9}}}, + {X: Field{[10]uint32{0x02f636f6, 0x036e5d9a, 0x002f535e, 0x034b437b, 0x02991b46, 0x004de866, 0x017431b1, 0x0073af3e, 0x03e57893, 0x0024a1af}}, Y: Field{[10]uint32{0x0329f516, 0x006d6974, 0x015f28cb, 0x020147b7, 0x00c55fce, 0x0014ede0, 0x00b38fb2, 0x036d0a0f, 0x0130e962, 0x001f9dd3}}}, + {X: Field{[10]uint32{0x00f4890d, 0x008b070a, 0x02041e54, 0x01476982, 0x02803e38, 0x03fbb196, 0x002cf2ee, 0x0099494e, 0x01a99b70, 0x00181b55}}, Y: Field{[10]uint32{0x00eda1a7, 0x02295314, 0x02e5407f, 0x00147d3b, 0x0379ae2c, 0x006e2a85, 0x004a1e03, 0x01904528, 0x026e3c2a, 0x00372256}}}, + {X: Field{[10]uint32{0x01f917f5, 0x001fda5d, 0x00df66e8, 0x03180139, 0x0011387d, 0x033f23b6, 0x03ef2f1b, 0x03073773, 0x0140833e, 0x00285a83}}, Y: Field{[10]uint32{0x022d6527, 0x0246f620, 0x01388ba9, 0x03658c04, 0x037fd281, 0x02203421, 0x01f32a82, 0x01294c54, 0x013713de, 0x0015235f}}}, + {X: Field{[10]uint32{0x039f0329, 0x027430d3, 0x0262d9b7, 0x0057b7d6, 0x004a687a, 0x03881c9b, 0x03e3e7aa, 0x01388e68, 0x01d2be57, 0x00001652}}, Y: Field{[10]uint32{0x005288a9, 0x02a44851, 0x0255f337, 0x01de5c8f, 0x02f7f4e7, 0x01203de3, 0x01d94275, 0x02c970c4, 0x025a167a, 0x001c772c}}}, + {X: Field{[10]uint32{0x0168b240, 0x01f1395e, 0x01536cef, 0x00ce0840, 0x03cd1e23, 0x02707fd3, 0x017b295e, 0x00362927, 0x024ae67b, 0x002107d3}}, Y: Field{[10]uint32{0x031f4161, 0x019c7415, 0x03d5cb56, 0x00de335c, 0x01ccae80, 0x0236f99e, 0x03979f4a, 0x0293b43a, 0x009c265f, 0x0007d587}}}, + {X: Field{[10]uint32{0x02cb7442, 0x00fb0791, 0x0240ddd4, 0x02b80289, 0x03faf680, 0x0109e23f, 0x03d4b831, 0x03a7ca22, 0x01f8c748, 0x0008988f}}, Y: Field{[10]uint32{0x03a55da3, 0x003804e1, 0x03aaad5e, 0x01ed2530, 0x0317d582, 0x033a7de1, 0x024381d0, 0x02d64be5, 0x000adfcd, 0x000e03bc}}}, + {X: Field{[10]uint32{0x005185e4, 0x0319523d, 0x02e2dc88, 0x037aced9, 0x02670083, 0x0298285f, 0x007a21e5, 0x00c07ba8, 0x03c36438, 0x00205819}}, Y: Field{[10]uint32{0x01c4cbf7, 0x020abb93, 0x02647f59, 0x03b11409, 0x022eeedc, 0x00dbf0e7, 0x00f4e8e2, 0x03a7c7c1, 0x011b9a95, 0x0016be8e}}}, + {X: Field{[10]uint32{0x02085c1f, 0x01a49373, 0x02485354, 0x0270b065, 0x017d28af, 0x02a38109, 0x00f6431b, 0x0314c493, 0x01614745, 0x003e3c8d}}, Y: Field{[10]uint32{0x0334750f, 0x0199d4d9, 0x01e7507f, 0x01d6b34a, 0x02bd1012, 0x03f9dad7, 0x008c1b93, 0x006d5695, 0x0067e3b4, 0x00028594}}}, + {X: Field{[10]uint32{0x03f2f57a, 0x00ee4cd5, 0x03e23775, 0x00f77812, 0x0228bb93, 0x01c214ec, 0x01537d4c, 0x02285709, 0x0184e25b, 0x00084c95}}, Y: Field{[10]uint32{0x02e873e2, 0x02dc9fa1, 0x01f53d20, 0x03c566e8, 0x03f627b5, 0x01fc869b, 0x00b00d51, 0x03d5e83c, 0x00f2078e, 0x000dc232}}}, + {X: Field{[10]uint32{0x03dfbda3, 0x0335a98f, 0x01c77845, 0x02b2f245, 0x0188b0ba, 0x03feb050, 0x00c24b37, 0x0066cb00, 0x03fcf485, 0x002cbd3d}}, Y: Field{[10]uint32{0x0157702c, 0x0138a31f, 0x03e171c9, 0x00eb356c, 0x03de4972, 0x03d33cf1, 0x03196bb5, 0x03b90cf9, 0x019e6f52, 0x002c81ad}}}, + {X: Field{[10]uint32{0x027f7265, 0x004bfb3b, 0x02064622, 0x014f6b2b, 0x03fd9c5c, 0x01593e70, 0x0070fd39, 0x00001adf, 0x014f5f42, 0x002d3997}}, Y: Field{[10]uint32{0x016bee0e, 0x01cd41a0, 0x025bffc0, 0x0235a119, 0x0003c75b, 0x020fb0b1, 0x021723ea, 0x00efd3cc, 0x02f2e399, 0x000c1edb}}}, + {X: Field{[10]uint32{0x023a7240, 0x00d4ac77, 0x00bab8f2, 0x007410fd, 0x03aa58b6, 0x01e63ba4, 0x033968e9, 0x0026b497, 0x01939ac6, 0x0013c411}}, Y: Field{[10]uint32{0x038179ae, 0x00887b9f, 0x024bd186, 0x0224fd2a, 0x03ed9d0a, 0x01569424, 0x01698f5c, 0x0257e960, 0x03bb9883, 0x003b6361}}}, + {X: Field{[10]uint32{0x014672fa, 0x01f00592, 0x00738d09, 0x02148e22, 0x0390018e, 0x02b5d4a7, 0x026b2157, 0x0304967e, 0x00ffe515, 0x0026d79d}}, Y: Field{[10]uint32{0x01fece15, 0x00f8ebc8, 0x00bc43db, 0x03610786, 0x01fe2df3, 0x00fecee7, 0x01bf70c4, 0x00c3c5ef, 0x026d4c4e, 0x00075561}}}, + {X: Field{[10]uint32{0x0217e302, 0x0205f21f, 0x02cf510d, 0x030b1da8, 0x0330f8a2, 0x024e1ec6, 0x02968f94, 0x03dc6040, 0x0042ac8c, 0x0001defd}}, Y: Field{[10]uint32{0x032af0e9, 0x039d5bf4, 0x021f26a6, 0x0217dbbb, 0x01e4daaa, 0x01b16fbb, 0x03b1103e, 0x0011ac74, 0x02611d90, 0x002ec3e7}}}, + {X: Field{[10]uint32{0x00c266a9, 0x034e22de, 0x00fe64bc, 0x01a4c20d, 0x00d2f5d4, 0x005aa662, 0x0028f34b, 0x008125ac, 0x025cd49f, 0x0009f784}}, Y: Field{[10]uint32{0x00b54bfe, 0x00f78957, 0x039b81a4, 0x00b4c8e5, 0x0384cdfc, 0x000e6b4a, 0x019dac24, 0x0364a8ab, 0x02a8483d, 0x003d0f61}}}, + {X: Field{[10]uint32{0x03e9c116, 0x00262712, 0x01b13225, 0x03c1fe11, 0x017f026c, 0x03bed6a3, 0x03b60ae4, 0x01d78652, 0x0178ae1d, 0x00086fdc}}, Y: Field{[10]uint32{0x01b8d967, 0x03da26bb, 0x0081d434, 0x02455a59, 0x0076b522, 0x034ed63e, 0x03444664, 0x037c5745, 0x02adbc21, 0x001b2aa0}}}, + {X: Field{[10]uint32{0x0232e234, 0x00916c15, 0x0156a66d, 0x03e6702e, 0x02dc9100, 0x020a2768, 0x0365b7f0, 0x0005a906, 0x025493ee, 0x00000924}}, Y: Field{[10]uint32{0x03c45b3d, 0x01738c41, 0x016f82ed, 0x0119ebb2, 0x00d883ff, 0x013dbe41, 0x004c5367, 0x007e6054, 0x01941cb5, 0x002f28c0}}}, + {X: Field{[10]uint32{0x01867f76, 0x039d4e1f, 0x016fe230, 0x00966e4c, 0x00ea8e94, 0x02e4dc42, 0x02d89b96, 0x00ad3351, 0x00c1e347, 0x0034fd91}}, Y: Field{[10]uint32{0x018cade5, 0x02cb6943, 0x03b7c597, 0x02b8c5af, 0x0202e536, 0x01489e50, 0x0337ed9d, 0x025cca8e, 0x0203fd62, 0x00246089}}}, + {X: Field{[10]uint32{0x0325b261, 0x00dfdeb8, 0x02e89d03, 0x01d51894, 0x01915c26, 0x011fd95b, 0x00e52c81, 0x034532a2, 0x034b0e2b, 0x00321187}}, Y: Field{[10]uint32{0x00dcae06, 0x033bb6a7, 0x02b07e38, 0x016aa2a4, 0x01fa3b61, 0x011bbf7d, 0x0232868e, 0x01e66cfd, 0x018197ac, 0x000625c4}}}, + {X: Field{[10]uint32{0x0395a380, 0x00cd0ab0, 0x0060d913, 0x01aaaa96, 0x01a8c240, 0x01ef5b28, 0x0357e1da, 0x02a4e306, 0x0190be20, 0x002db97d}}, Y: Field{[10]uint32{0x018a04b6, 0x011b579f, 0x02026ff1, 0x0325a9b7, 0x01cf01ee, 0x02d698c1, 0x0186569a, 0x03ab79cb, 0x00f1a2f2, 0x00299ca3}}}, + {X: Field{[10]uint32{0x01eb5d6c, 0x013b2556, 0x008c0312, 0x0237c524, 0x018b7013, 0x017bf043, 0x014eee4b, 0x0007415b, 0x039d4657, 0x000f4945}}, Y: Field{[10]uint32{0x0395980f, 0x00ca9c62, 0x03c8c3e0, 0x028ab155, 0x023b56f7, 0x00f1625e, 0x03e88e2b, 0x035fb18c, 0x03fe1d61, 0x000562de}}}, + {X: Field{[10]uint32{0x02f94d99, 0x026965d1, 0x02927984, 0x004646bd, 0x00d85155, 0x03689fc4, 0x0093425b, 0x00526656, 0x0154c717, 0x0002aed7}}, Y: Field{[10]uint32{0x00b9a161, 0x015108b1, 0x03ad04e4, 0x002b64f5, 0x037012ff, 0x03d08270, 0x0106e89f, 0x0237a8db, 0x03cc3be2, 0x001337fa}}}, + {X: Field{[10]uint32{0x0325c73e, 0x014a41ec, 0x0224c523, 0x0219cfb1, 0x02f12433, 0x038c72ec, 0x00dedaa4, 0x03e70a40, 0x0125115e, 0x00262740}}, Y: Field{[10]uint32{0x00c6c8df, 0x01a081a5, 0x000c8d16, 0x018ca547, 0x00d553df, 0x0109e5d4, 0x01f28ee1, 0x0381c3f0, 0x02e9945d, 0x0034da67}}}, + {X: Field{[10]uint32{0x02013884, 0x03908c97, 0x02af82d0, 0x004f20a8, 0x015e05db, 0x003b7dc3, 0x028bbe4e, 0x0347fc18, 0x01d429c3, 0x00313171}}, Y: Field{[10]uint32{0x03a97eea, 0x02e9f9fb, 0x023ee0f2, 0x003744cc, 0x03ccee86, 0x002b7a5f, 0x029da677, 0x0222a7f0, 0x00b88251, 0x0030b1db}}}, + {X: Field{[10]uint32{0x02c0807b, 0x00552789, 0x01edc360, 0x0047b02e, 0x03be9471, 0x000283a0, 0x035080a9, 0x02d97236, 0x0050c623, 0x002198b6}}, Y: Field{[10]uint32{0x01da840b, 0x03c3db8d, 0x01526b3d, 0x01333e32, 0x03f91e72, 0x0246020e, 0x02a72b32, 0x039e93d9, 0x0277b0c9, 0x00029c75}}}, + {X: Field{[10]uint32{0x01083898, 0x03b6c5c7, 0x02626cbd, 0x031f03aa, 0x00543b73, 0x00eaef51, 0x0309b389, 0x0166fccc, 0x03497e73, 0x00349bfb}}, Y: Field{[10]uint32{0x01851395, 0x00e07e1e, 0x03ad956d, 0x00835236, 0x0004d60c, 0x0141c3e4, 0x0101ea9a, 0x002ce5ad, 0x0209bb09, 0x002b62ec}}}, + {X: Field{[10]uint32{0x029d8d0f, 0x01e17488, 0x009838f8, 0x03d7c5cf, 0x025b4560, 0x02d00844, 0x0342ff85, 0x02da09f5, 0x00e8c584, 0x0015a6fa}}, Y: Field{[10]uint32{0x001b8559, 0x036bf1f5, 0x0235422e, 0x00cd789b, 0x0247c74a, 0x02692754, 0x015581bf, 0x01f626a3, 0x01a4a826, 0x002c24e0}}}, + {X: Field{[10]uint32{0x030116d4, 0x0279e534, 0x02255d4a, 0x02ef256a, 0x03842f82, 0x01658363, 0x0167bc6c, 0x021eceb6, 0x00c34d17, 0x00378d2b}}, Y: Field{[10]uint32{0x021816d3, 0x02cf5de8, 0x00505b6c, 0x002fbc26, 0x00e322c4, 0x0220f4fc, 0x00f4d3e0, 0x02d4a95f, 0x001cb2b6, 0x000bf76d}}}, + {X: Field{[10]uint32{0x01c50b1a, 0x01bea671, 0x003d5544, 0x0101c376, 0x03ece852, 0x01d0a96c, 0x0149b861, 0x02dd89b5, 0x034876db, 0x0011d0c2}}, Y: Field{[10]uint32{0x03200df1, 0x00d5e92b, 0x033e85af, 0x01223771, 0x02b53dd0, 0x0323b1dc, 0x006a0ead, 0x0115cd63, 0x02ba0700, 0x0035d564}}}, + {X: Field{[10]uint32{0x02e9fe13, 0x002c25f5, 0x00fd7914, 0x03fbdb1a, 0x018c2d8f, 0x01aeeadb, 0x017339b7, 0x01c99ae8, 0x00b5e668, 0x003c7478}}, Y: Field{[10]uint32{0x0324e580, 0x0150f56f, 0x0350bb96, 0x013699f6, 0x03a1d849, 0x008c03e5, 0x01c54837, 0x00ce14d2, 0x0226fc23, 0x00002958}}}, + {X: Field{[10]uint32{0x00cdbcd0, 0x0056e17e, 0x004c3c05, 0x03fce0fd, 0x006e8132, 0x025a30dd, 0x03d0426e, 0x003784f6, 0x03357614, 0x0008a9bd}}, Y: Field{[10]uint32{0x03d18d1b, 0x038d157e, 0x01e48e69, 0x0276a101, 0x03430a39, 0x003e5690, 0x00dc0044, 0x0038f8d6, 0x01a89027, 0x00277362}}}, + {X: Field{[10]uint32{0x01a9ada2, 0x019538f8, 0x02867b46, 0x00c30a78, 0x02fc307b, 0x01d10ba3, 0x030c6ea5, 0x0232826e, 0x03280afd, 0x000b7714}}, Y: Field{[10]uint32{0x0087dee4, 0x03b6dcf0, 0x03393b5f, 0x024c665d, 0x0107d077, 0x007fe438, 0x02daa6e3, 0x039ba1ef, 0x010edb84, 0x001ee6ae}}}, + {X: Field{[10]uint32{0x01da0fca, 0x0078b065, 0x03a9e1a0, 0x015151b7, 0x011fb1c8, 0x0162e719, 0x00a116c0, 0x03d4bf4c, 0x0039a60a, 0x00182dbe}}, Y: Field{[10]uint32{0x00d26c40, 0x01360f88, 0x02bcdca5, 0x00187615, 0x03b0e743, 0x011a763a, 0x039b07b2, 0x02d052f8, 0x029f28cf, 0x00179dfd}}}, + {X: Field{[10]uint32{0x01dee53c, 0x009a9f43, 0x02776dcd, 0x00a15f25, 0x022a1f1f, 0x0257a90e, 0x0306bfdf, 0x024b9432, 0x019b9b90, 0x0009e430}}, Y: Field{[10]uint32{0x014e7f64, 0x01767cdc, 0x005b6271, 0x01662caf, 0x00de0677, 0x00085c26, 0x0387afaa, 0x01b9e2c8, 0x0120d04e, 0x003f7ba8}}}, + {X: Field{[10]uint32{0x01113803, 0x03e411bd, 0x037c00d7, 0x028d1453, 0x02db181e, 0x03eb65e0, 0x03576b16, 0x02f22c49, 0x020f9ee8, 0x0039510c}}, Y: Field{[10]uint32{0x00510741, 0x00465cb0, 0x01e0f952, 0x002b89ad, 0x023c7368, 0x03739f0c, 0x01b63dd9, 0x01d1139a, 0x02fb0239, 0x002e4dd8}}}, + {X: Field{[10]uint32{0x0355313d, 0x026abeb6, 0x00cee39f, 0x0335a6ed, 0x038e2706, 0x02f535d3, 0x00a236cb, 0x00a35618, 0x01ae73e4, 0x001b1fc9}}, Y: Field{[10]uint32{0x00dc9121, 0x012d6072, 0x030916a4, 0x012f577f, 0x018db30c, 0x0163aa48, 0x020864be, 0x026c63a6, 0x03c9e33f, 0x003632e3}}}, + {X: Field{[10]uint32{0x0393d4e8, 0x03a94ee6, 0x03499121, 0x00e80c3b, 0x03dd9eaa, 0x00e54bc9, 0x01e9c3ef, 0x00351d34, 0x0328ff71, 0x000a2746}}, Y: Field{[10]uint32{0x02880667, 0x02ce52bb, 0x03e38cf2, 0x00c9dfd2, 0x02642859, 0x0116cf2e, 0x00d5cb72, 0x00b75613, 0x000aaebc, 0x003cdabe}}}, + {X: Field{[10]uint32{0x0110b5aa, 0x028769d6, 0x03476b9f, 0x022b53bd, 0x002a6f4a, 0x0244c306, 0x0287b5d2, 0x0359cc97, 0x0197ac01, 0x003c0aad}}, Y: Field{[10]uint32{0x00e38adb, 0x025902b3, 0x02aaffe8, 0x007d97b2, 0x01d3262d, 0x030d18cf, 0x02c53795, 0x022c4fb3, 0x002aecf2, 0x002ba230}}}, + {X: Field{[10]uint32{0x00a0413a, 0x03e10637, 0x01a8d2d8, 0x01c13b0a, 0x03c625bb, 0x01b531b4, 0x0332c82d, 0x00c4195d, 0x034f71a7, 0x0002a6a5}}, Y: Field{[10]uint32{0x01b372cd, 0x022496e4, 0x01c2126e, 0x02b33f47, 0x01af1497, 0x0183b479, 0x02f222d8, 0x03a5bf57, 0x0033eed4, 0x0030837d}}}, + {X: Field{[10]uint32{0x0177496a, 0x0073d023, 0x0071f4a2, 0x03f05941, 0x024cc392, 0x018d2d57, 0x020e9c78, 0x00226466, 0x010d728e, 0x001e1986}}, Y: Field{[10]uint32{0x000cfd22, 0x004a44eb, 0x01b23035, 0x038ea4da, 0x0029d79d, 0x00d68799, 0x028e265c, 0x008bbf2a, 0x00d95404, 0x0006ed7f}}}, + {X: Field{[10]uint32{0x0333b9ac, 0x004c2920, 0x00773ce0, 0x016a4443, 0x0025cc11, 0x018f6550, 0x00e4e2de, 0x02e3afc0, 0x03e344b3, 0x003229ff}}, Y: Field{[10]uint32{0x02e67b6e, 0x0148ff97, 0x02806dbb, 0x003f6a5f, 0x02ca9128, 0x032a1c91, 0x00141aa5, 0x018ed59d, 0x03e5010c, 0x003287fe}}}, + {X: Field{[10]uint32{0x039208ba, 0x0259b993, 0x033472f9, 0x00cf533c, 0x019cc1e6, 0x01369a1c, 0x0019e84e, 0x01ab4e0d, 0x026a13ff, 0x0001b2ee}}, Y: Field{[10]uint32{0x02214a88, 0x0228a987, 0x011fcfac, 0x02258a9f, 0x03058598, 0x02711986, 0x0392c34e, 0x024fd13e, 0x01820c78, 0x000d4489}}}, + {X: Field{[10]uint32{0x019de719, 0x008ff6bf, 0x03e1287b, 0x020526e8, 0x00ffe9aa, 0x031d976b, 0x01450c82, 0x021847ad, 0x01bd691a, 0x00381fe3}}, Y: Field{[10]uint32{0x00fbc509, 0x02c18763, 0x02bc6894, 0x01b96d49, 0x030acb0c, 0x0384631f, 0x01937994, 0x033fba89, 0x01f08e39, 0x0024cb8d}}}, + {X: Field{[10]uint32{0x02d2c5d4, 0x00ce8b21, 0x029b84b6, 0x00e3f331, 0x0151f3e2, 0x034fcca9, 0x02720d71, 0x02505b37, 0x009832fd, 0x001884da}}, Y: Field{[10]uint32{0x02784e9c, 0x03dc576f, 0x00f68206, 0x01b5a72f, 0x03791f3b, 0x03c79665, 0x016d9684, 0x01f90616, 0x024d6224, 0x0004dfa6}}}, + {X: Field{[10]uint32{0x03a7b9eb, 0x013a3036, 0x004f2325, 0x02e87a9a, 0x0240a318, 0x01c43021, 0x03eb2faf, 0x019c1894, 0x018862de, 0x0022c041}}, Y: Field{[10]uint32{0x01bfd264, 0x008dc686, 0x0348e2ce, 0x00655bc3, 0x03dbd7e4, 0x01e8cfe7, 0x00bf43cf, 0x01b18333, 0x0062dcc5, 0x00152922}}}, + {X: Field{[10]uint32{0x00f213d8, 0x01203aa1, 0x031cfeaf, 0x021f70c2, 0x023fb2ed, 0x015af2eb, 0x03bbbace, 0x020d1bfb, 0x008c14af, 0x0004b4e4}}, Y: Field{[10]uint32{0x0267fdfc, 0x0206a626, 0x0024ecb1, 0x01766396, 0x01fef41e, 0x000b1366, 0x02764210, 0x036b2611, 0x01fbdf7d, 0x003f1185}}}, + {X: Field{[10]uint32{0x01784cd2, 0x018b4580, 0x013dc8da, 0x01bb7df0, 0x02b47428, 0x00a48a64, 0x00e368f6, 0x0331a6ef, 0x01e2a7b8, 0x00086741}}, Y: Field{[10]uint32{0x034c7f5c, 0x00785e28, 0x02de2076, 0x00ec8587, 0x03dd2820, 0x023eeafb, 0x029407de, 0x02c79e3b, 0x03739a7e, 0x0022bb93}}}, + {X: Field{[10]uint32{0x005de204, 0x00016db6, 0x03074852, 0x004f0e32, 0x0049bbe2, 0x034997ce, 0x011fa23a, 0x03ea47da, 0x01599a76, 0x0035f433}}, Y: Field{[10]uint32{0x011ce2fa, 0x023cdf24, 0x019d1e93, 0x018302c7, 0x03ed1a2d, 0x01c9683b, 0x021330ea, 0x0036b97a, 0x032c6075, 0x003cd255}}}, + {X: Field{[10]uint32{0x02bb6c6d, 0x03d25e3a, 0x0042d635, 0x02ecb1dc, 0x009f65cf, 0x03ea3f0f, 0x018b73f6, 0x02408e0f, 0x01f5a04c, 0x0028fe9a}}, Y: Field{[10]uint32{0x03cbdea2, 0x007296b0, 0x03e8372c, 0x035d6665, 0x010accb2, 0x00e268bc, 0x0395b18f, 0x02aac52b, 0x01a89994, 0x0031e628}}}, + {X: Field{[10]uint32{0x03b2d1cd, 0x0322bec4, 0x00e92cc5, 0x01307414, 0x00854073, 0x0176505c, 0x0072e71e, 0x0115f5e6, 0x001a825c, 0x00240ba2}}, Y: Field{[10]uint32{0x01a62d43, 0x020b0c2f, 0x01e338ac, 0x001f33f2, 0x02de099f, 0x018be091, 0x0163cccf, 0x01bee444, 0x013263bf, 0x003fc1d4}}}, + {X: Field{[10]uint32{0x0329c144, 0x03318381, 0x03505d34, 0x01693e32, 0x036923ea, 0x03c64cae, 0x021aa2b3, 0x00155b4d, 0x01f24c47, 0x000c97c6}}, Y: Field{[10]uint32{0x0294bec4, 0x01f11ae7, 0x021782a5, 0x03058665, 0x0173e3e9, 0x006fe3e7, 0x001bf358, 0x028337e6, 0x02b829a6, 0x003d2a6b}}}, + {X: Field{[10]uint32{0x021edd4b, 0x02c1f1be, 0x0024763b, 0x0117ac1e, 0x00bcdf72, 0x033ffeb3, 0x025f8602, 0x033d854f, 0x03b441a6, 0x001a653c}}, Y: Field{[10]uint32{0x0074c174, 0x02c45806, 0x03bd927d, 0x02ae1fdc, 0x02198ee4, 0x00fc1454, 0x00479d8d, 0x02a25ca7, 0x01ea892d, 0x003b0bf1}}}, + {X: Field{[10]uint32{0x02cb2d8c, 0x0284149a, 0x0137f3b7, 0x028ad6eb, 0x005663c5, 0x02307daa, 0x011bd2f0, 0x01e5bff5, 0x00324e8f, 0x00086156}}, Y: Field{[10]uint32{0x01897c2d, 0x03475da8, 0x00cf4b15, 0x0255759f, 0x033b93c4, 0x000d0efd, 0x0290d44b, 0x0300f265, 0x02cb33ce, 0x0039df3b}}}, + {X: Field{[10]uint32{0x0191b099, 0x01d33be7, 0x021b0a56, 0x00fd21ea, 0x01319693, 0x0391dcad, 0x027c312a, 0x02a00695, 0x023b32f2, 0x0024176a}}, Y: Field{[10]uint32{0x01cf369f, 0x0161c710, 0x021d6b69, 0x010d6cb2, 0x0382b648, 0x019ff705, 0x0291d5d7, 0x005c644d, 0x01c36d27, 0x002fd8a1}}}, + {X: Field{[10]uint32{0x025339f1, 0x02547bad, 0x017f5b39, 0x01d8c54e, 0x031b6853, 0x036f839f, 0x03e51613, 0x001491d7, 0x038434b6, 0x0037df3e}}, Y: Field{[10]uint32{0x03558243, 0x00333d37, 0x00d2ee58, 0x00f1be91, 0x010d1beb, 0x03659475, 0x0153393d, 0x039154b6, 0x017e1419, 0x0039c973}}}, + {X: Field{[10]uint32{0x01732491, 0x016f2d39, 0x024a5d8c, 0x01d8a33d, 0x00385cb2, 0x03297ae0, 0x0096b821, 0x00ae7a8f, 0x02fc8884, 0x0039fee7}}, Y: Field{[10]uint32{0x00f22331, 0x00a054de, 0x03d5f5e9, 0x00a3b76a, 0x011353c1, 0x019d6a5f, 0x03b83900, 0x0380dc98, 0x02bca6f9, 0x0032399d}}}, + {X: Field{[10]uint32{0x0124285b, 0x008da773, 0x012fecc1, 0x00575c78, 0x01bad797, 0x029103d6, 0x02ac0a3f, 0x02885879, 0x030c272b, 0x003468d7}}, Y: Field{[10]uint32{0x019edb3c, 0x02e526b2, 0x02ec1806, 0x02a25840, 0x0049dc41, 0x02c55900, 0x02f2f21b, 0x01c5b6e7, 0x00f7d475, 0x0007d6dc}}}, + {X: Field{[10]uint32{0x027b079f, 0x0043694a, 0x032e5551, 0x00a41164, 0x024f4204, 0x01eb98a7, 0x03da74ac, 0x03753385, 0x02e85f2d, 0x00019ae9}}, Y: Field{[10]uint32{0x03a80402, 0x002279c1, 0x03733263, 0x0010d921, 0x02219679, 0x026f7fef, 0x01a4f357, 0x03bef3d3, 0x005beb8e, 0x00363aeb}}}, + {X: Field{[10]uint32{0x00f3a749, 0x03ce682d, 0x01e487b1, 0x008875ee, 0x00c36e7c, 0x01d7e714, 0x03cf8065, 0x00414ad2, 0x029a2688, 0x0001bdfd}}, Y: Field{[10]uint32{0x0331a4c4, 0x00d6a99c, 0x0202b892, 0x016096ed, 0x00bc1835, 0x03058394, 0x00352b9c, 0x02e22ead, 0x03840d89, 0x0004741a}}}, + {X: Field{[10]uint32{0x026c0abd, 0x00308724, 0x01b90eda, 0x03fa132b, 0x0141c23a, 0x017006b1, 0x01699067, 0x0140ec98, 0x016f571d, 0x0012f85b}}, Y: Field{[10]uint32{0x02c1d06d, 0x013f8ca7, 0x011bd9a0, 0x023f2c8c, 0x01d9ede7, 0x034cffb5, 0x02116c5d, 0x03cb7586, 0x02deffa1, 0x00004107}}}, + {X: Field{[10]uint32{0x01e75886, 0x03c142c0, 0x029bd33b, 0x00d43b95, 0x03191603, 0x005a6315, 0x00abbc79, 0x02b2d9d8, 0x005db55e, 0x0022be23}}, Y: Field{[10]uint32{0x01d9a12c, 0x02fd65af, 0x02beaf61, 0x02d74af9, 0x00ca203e, 0x025801f0, 0x02eeb245, 0x02d2c4a6, 0x010b6bf2, 0x0013d6e1}}}, + {X: Field{[10]uint32{0x00ef8672, 0x02d82213, 0x035072e2, 0x00602339, 0x01edb695, 0x00e457a0, 0x03648491, 0x03ae3869, 0x037a3316, 0x002b4cf9}}, Y: Field{[10]uint32{0x037ccd90, 0x0297932b, 0x0313f16c, 0x0227c563, 0x016c4f4f, 0x025431d7, 0x01157fd7, 0x022f6769, 0x01e24bc8, 0x003e8058}}}, + {X: Field{[10]uint32{0x01d8c2bc, 0x037b6cf6, 0x01ba069e, 0x007d808b, 0x01cdb51e, 0x0070d121, 0x0196ee9b, 0x02bf9e47, 0x01ef7620, 0x001112a0}}, Y: Field{[10]uint32{0x0351e2fd, 0x006bc465, 0x03b52e64, 0x00a47beb, 0x02bd2683, 0x02ff366e, 0x02811c7f, 0x013af0bb, 0x03d9a49d, 0x002a2005}}}, + {X: Field{[10]uint32{0x02aa5c51, 0x002d98f3, 0x00aa51d1, 0x034492b2, 0x0377af3a, 0x01940e8b, 0x0387e9d2, 0x03e2d981, 0x03a39530, 0x0016c781}}, Y: Field{[10]uint32{0x037810b9, 0x00311c3d, 0x0013b450, 0x0041eef4, 0x02e87cb5, 0x021aa01a, 0x031e59b6, 0x0383ec9c, 0x00d38d55, 0x003f3d30}}}, + {X: Field{[10]uint32{0x03174309, 0x00cfb45c, 0x02844ba5, 0x01f65897, 0x01b1d42e, 0x00c5f99f, 0x034c4033, 0x01aa195e, 0x00170e98, 0x00000fa3}}, Y: Field{[10]uint32{0x00cd6caa, 0x03d54865, 0x03e5e696, 0x03d70a5b, 0x029db702, 0x00f1fb83, 0x020f3966, 0x028d743a, 0x009ff4f5, 0x0037baf9}}}, + {X: Field{[10]uint32{0x00d112c1, 0x03a0f601, 0x017e5746, 0x0241fc75, 0x036432af, 0x011ad4a2, 0x024c078b, 0x032c6674, 0x02ee5e9b, 0x0028425b}}, Y: Field{[10]uint32{0x02e7c6d4, 0x0229db74, 0x02fc13f0, 0x003f87a4, 0x0097eace, 0x033553cf, 0x02b3019a, 0x00db3595, 0x00fe6994, 0x002f44f9}}}, + {X: Field{[10]uint32{0x0265f2f0, 0x001c6dd9, 0x0093898c, 0x024d37b4, 0x00368610, 0x0269d7ba, 0x000a6d89, 0x0379d76d, 0x01794218, 0x00151d61}}, Y: Field{[10]uint32{0x01174548, 0x0184fd86, 0x021b5c6f, 0x02fca71d, 0x026bcde4, 0x0376a995, 0x00dcd94f, 0x031a25c3, 0x024213e1, 0x000ef555}}}, + {X: Field{[10]uint32{0x01456057, 0x02f1a511, 0x02df7f7b, 0x02417ba6, 0x02a44002, 0x013dd161, 0x0356604f, 0x02f112ff, 0x0192fcb4, 0x0013acca}}, Y: Field{[10]uint32{0x0245c3d4, 0x0185502e, 0x03609216, 0x02319b6d, 0x00e0cc9d, 0x0014400c, 0x0277c673, 0x027c06b6, 0x00f26834, 0x00215daa}}}, + {X: Field{[10]uint32{0x0261a22d, 0x016d322d, 0x01ea269c, 0x008fe4b9, 0x000f2917, 0x026429f0, 0x01428e75, 0x0124cf1b, 0x01efd2eb, 0x000d42cb}}, Y: Field{[10]uint32{0x00de6943, 0x003ec964, 0x0159e354, 0x02a04c83, 0x0370f807, 0x0203bd6f, 0x02126d83, 0x03cd2fcd, 0x0300add9, 0x00186b36}}}, + {X: Field{[10]uint32{0x01f360ff, 0x03f6611d, 0x03017d7a, 0x01ac0c1a, 0x032da3c9, 0x02b284a6, 0x037341ee, 0x0220654c, 0x00bece7f, 0x002453aa}}, Y: Field{[10]uint32{0x01ac7b53, 0x01ca98e1, 0x01213d32, 0x02927f22, 0x03582948, 0x022c90b6, 0x03b563ce, 0x02029d20, 0x0148ebef, 0x003caa95}}}, + {X: Field{[10]uint32{0x03dc0fef, 0x01891ae0, 0x01a33459, 0x03e714f8, 0x03ad6d44, 0x01c38fd7, 0x02baa6bd, 0x0097d2ea, 0x021738da, 0x0003d95b}}, Y: Field{[10]uint32{0x01fd83e5, 0x0076b256, 0x03ef54c3, 0x012c8103, 0x00c742ce, 0x00dcf0b1, 0x025f53cf, 0x024a1c29, 0x00fc3463, 0x00102a2d}}}, + {X: Field{[10]uint32{0x033b618f, 0x0399dc64, 0x00182ce3, 0x008e8849, 0x02d77e10, 0x0036a99b, 0x00310bbc, 0x00f39519, 0x02f0334e, 0x00291f22}}, Y: Field{[10]uint32{0x000c7f08, 0x0254a503, 0x02c4b522, 0x00ba1c57, 0x0341ec5b, 0x0285c4fa, 0x031694ff, 0x01f1d579, 0x0354056d, 0x001b6f32}}}, + {X: Field{[10]uint32{0x00753ca9, 0x01bba74c, 0x02688676, 0x00c47ab3, 0x003b5fde, 0x0085e357, 0x007947f8, 0x0012997a, 0x00625e1d, 0x0002a28a}}, Y: Field{[10]uint32{0x02fc2169, 0x03cbc78b, 0x023ba94d, 0x01d75ce4, 0x021feb3f, 0x03e8426f, 0x039e672e, 0x02813429, 0x02f7483a, 0x003e0ab5}}}, + {X: Field{[10]uint32{0x01c017d0, 0x00fde88c, 0x008371e8, 0x002283d1, 0x034fe062, 0x03f501fb, 0x02903cb3, 0x02e15789, 0x014e5f8e, 0x002807fd}}, Y: Field{[10]uint32{0x032edf92, 0x016cbb83, 0x03ee2f0e, 0x00009d98, 0x009fd59b, 0x01f64945, 0x0018ec07, 0x0069a213, 0x02f9c52f, 0x000891f1}}}, + {X: Field{[10]uint32{0x0142aed1, 0x01f21d63, 0x0072ff2d, 0x038c47d8, 0x0061ef4f, 0x02668c83, 0x02adbd60, 0x03226db2, 0x003a626a, 0x0039ec27}}, Y: Field{[10]uint32{0x00609fdc, 0x02bbf34e, 0x005e2c0f, 0x0285b667, 0x0337c3c5, 0x000f3d68, 0x01c64ace, 0x0143a639, 0x02d36a7b, 0x0023b665}}}, + {X: Field{[10]uint32{0x023ff2fd, 0x016916e1, 0x037173f3, 0x025cdcf2, 0x0196307c, 0x01816410, 0x009fb522, 0x00a81b2a, 0x0253336c, 0x000eeea7}}, Y: Field{[10]uint32{0x03d24799, 0x03a0d049, 0x0160d52a, 0x008dba32, 0x00419d51, 0x0153a6e3, 0x00ccaeae, 0x03f05bd6, 0x01093faf, 0x003cbfa4}}}, + {X: Field{[10]uint32{0x000630a3, 0x0017e70b, 0x00acdaf9, 0x0086d890, 0x0311950c, 0x010cbd4c, 0x01224000, 0x0005d088, 0x02b6dc66, 0x003d8748}}, Y: Field{[10]uint32{0x009ffb05, 0x006915c1, 0x02796142, 0x01405778, 0x00692bb2, 0x0337eac6, 0x02b7e865, 0x00b3ce4f, 0x035a1a66, 0x000181a3}}}, + {X: Field{[10]uint32{0x00a80962, 0x026f9c3a, 0x02d13718, 0x037009c0, 0x01891c45, 0x03cf91c8, 0x0038dcb8, 0x0288b62f, 0x00556b1a, 0x00296d82}}, Y: Field{[10]uint32{0x00b1ddb6, 0x02640cbf, 0x0234a071, 0x01a5f357, 0x023a9b3a, 0x01b060ab, 0x0220b99e, 0x0017287f, 0x03d2d5e3, 0x003ddfe5}}}, + {X: Field{[10]uint32{0x01e1a259, 0x02a97321, 0x02ac1be3, 0x006ca008, 0x02f03030, 0x039bd64b, 0x00ae950b, 0x00958b87, 0x02f900eb, 0x001c30ea}}, Y: Field{[10]uint32{0x00587583, 0x0085ee53, 0x01deb61f, 0x02fa85eb, 0x033f91f2, 0x004eabbd, 0x00626f72, 0x034c6739, 0x03cd31a8, 0x000fcb2d}}}, + {X: Field{[10]uint32{0x0106e530, 0x01744da3, 0x03d93b97, 0x02bf0cf9, 0x01a67952, 0x010f9e44, 0x01fcc4d4, 0x0178dca3, 0x01d1a875, 0x000775c3}}, Y: Field{[10]uint32{0x0190d084, 0x0077f35c, 0x020c4014, 0x01f6dafb, 0x01240e67, 0x03b31cf7, 0x00400742, 0x0253bd1c, 0x01741f58, 0x0011a13e}}}, + {X: Field{[10]uint32{0x0083fcf9, 0x020331a4, 0x035462b1, 0x00f5195c, 0x02f5d37c, 0x034372a0, 0x016bb7f2, 0x03f52f63, 0x018d7aac, 0x0035135a}}, Y: Field{[10]uint32{0x007dc407, 0x026fafc2, 0x03e47281, 0x0104dd02, 0x03c0c940, 0x031056f5, 0x0067b0f4, 0x00a59643, 0x003d0423, 0x00286360}}}, + {X: Field{[10]uint32{0x01b34ca5, 0x02700414, 0x019f9410, 0x00418553, 0x0362730a, 0x02c6f0ee, 0x0122ae74, 0x015d0a15, 0x02e13045, 0x00211626}}, Y: Field{[10]uint32{0x03b3606c, 0x03d88d4d, 0x0390349b, 0x02e8f78e, 0x03de14fc, 0x00be9c1f, 0x02ffce9b, 0x02bd26fd, 0x0208f2a9, 0x002e5e7e}}}, + {X: Field{[10]uint32{0x03724627, 0x034bc122, 0x006f5469, 0x00fff413, 0x01bc84e7, 0x03fc5707, 0x0131c1ef, 0x02265afb, 0x03df8911, 0x000f7b23}}, Y: Field{[10]uint32{0x03eb2c8c, 0x0389c406, 0x0310c16a, 0x028aff50, 0x03daccca, 0x013fe237, 0x011a555f, 0x016f3f6f, 0x03c1e20b, 0x002c50fc}}}, + {X: Field{[10]uint32{0x00cac160, 0x03d0dd02, 0x0012a2f0, 0x037905ed, 0x02023a8d, 0x00339197, 0x01bfcc47, 0x0367180e, 0x03c5519d, 0x000d9e97}}, Y: Field{[10]uint32{0x03f021a6, 0x03eb1729, 0x03cc2dba, 0x00825ea1, 0x03faa648, 0x00f83e3c, 0x011b136a, 0x03f2438a, 0x01df2c6b, 0x0016e3ef}}}, + {X: Field{[10]uint32{0x0063efc1, 0x00c95b25, 0x02cce5fa, 0x03f521ee, 0x031e7c2e, 0x003623a4, 0x03ab6b32, 0x0181bd82, 0x007e7777, 0x0022a956}}, Y: Field{[10]uint32{0x03f091dc, 0x00e7f474, 0x00c1888a, 0x00d11278, 0x0150beeb, 0x02b548a2, 0x02921eca, 0x0284cb05, 0x036c98bf, 0x002b16e9}}}, + {X: Field{[10]uint32{0x0084cae0, 0x01afcf03, 0x038c6a5d, 0x0107b299, 0x02af3aa4, 0x02c34471, 0x00fd9e60, 0x00cba80c, 0x01910ea6, 0x001e7000}}, Y: Field{[10]uint32{0x01dfb899, 0x034b608e, 0x01e85472, 0x037caf46, 0x01ae9c8b, 0x03d0070b, 0x000b659b, 0x02a504eb, 0x00703b19, 0x000fe550}}}, + {X: Field{[10]uint32{0x03a04fc8, 0x03e2fe00, 0x018b3d4e, 0x0292b692, 0x01e858aa, 0x01920c95, 0x01951a06, 0x027a5737, 0x032221a5, 0x00321379}}, Y: Field{[10]uint32{0x02f0a0b9, 0x02f11452, 0x01102158, 0x03483d8e, 0x010548fc, 0x01888112, 0x0011109a, 0x02fca37e, 0x0158915a, 0x001cf37a}}}, + {X: Field{[10]uint32{0x01a9d6d5, 0x01ae24ad, 0x00c218cb, 0x0373f9a5, 0x01fedf74, 0x028f164d, 0x023822b2, 0x01f58781, 0x0050c632, 0x0022c6e3}}, Y: Field{[10]uint32{0x00fe168b, 0x01832c00, 0x037f841f, 0x01ad6d90, 0x00c03676, 0x03fd0c53, 0x03dfc479, 0x0190d7d1, 0x01529f15, 0x0015ef62}}}, + {X: Field{[10]uint32{0x00702c52, 0x00ff5492, 0x03650e78, 0x039dc675, 0x0033a31c, 0x0107e061, 0x0117c4a3, 0x00be6148, 0x008a3ae8, 0x002d17bb}}, Y: Field{[10]uint32{0x020a1c90, 0x0231b867, 0x0046dc98, 0x02167ba4, 0x03254117, 0x0280525e, 0x005d0fce, 0x01ad3c24, 0x035cc708, 0x0033555a}}}, + {X: Field{[10]uint32{0x00757319, 0x001de020, 0x01cd2c57, 0x004e196a, 0x0031ab70, 0x031632f7, 0x034871ea, 0x025b1d9e, 0x00ddd930, 0x0028b577}}, Y: Field{[10]uint32{0x03064547, 0x0351ab92, 0x001a60a6, 0x02a2bd8b, 0x03227ae8, 0x00782d4d, 0x02b5978b, 0x02c8fa79, 0x02b4b130, 0x001ea901}}}, + {X: Field{[10]uint32{0x01ed2b2d, 0x0053066e, 0x025db3d3, 0x0064486b, 0x01e97f6e, 0x01426fb0, 0x0164ea83, 0x0165429d, 0x02b4e5d3, 0x001c480d}}, Y: Field{[10]uint32{0x00a93616, 0x01d0539a, 0x0172a21d, 0x00cbe725, 0x00e3a322, 0x0094d0b2, 0x0298d2f4, 0x0183a811, 0x03f38d05, 0x0009618b}}}, + {X: Field{[10]uint32{0x00bfb392, 0x00ad54bc, 0x02df0756, 0x038c1e56, 0x03dca402, 0x026bf25c, 0x02e58c87, 0x0322ea50, 0x00f7d70f, 0x0016f3bc}}, Y: Field{[10]uint32{0x03af1919, 0x032c2242, 0x0247454c, 0x0391cc95, 0x011a444c, 0x00ff15be, 0x03b0e12c, 0x016ff4fb, 0x024cecb4, 0x001f3216}}}, + {X: Field{[10]uint32{0x01741ada, 0x0076164e, 0x02b0eb5c, 0x00519d9e, 0x03b9e5f2, 0x03d713a6, 0x03ab9f0a, 0x02286c2b, 0x002f9d50, 0x0037355c}}, Y: Field{[10]uint32{0x01cc1fa1, 0x009463b7, 0x0335f9eb, 0x0161bc31, 0x013369d5, 0x00949940, 0x00d40a4a, 0x038e9f73, 0x02d7ea13, 0x003dfaba}}}, + {X: Field{[10]uint32{0x02cb3d9f, 0x02e46ef9, 0x02ec9784, 0x02e4974f, 0x02363bfc, 0x02e2dc5d, 0x01c3ade1, 0x018a7424, 0x00d0004f, 0x000b3a8c}}, Y: Field{[10]uint32{0x01c42624, 0x011825a8, 0x036e3444, 0x0152ce6c, 0x03c48ba4, 0x00f778d2, 0x009a76aa, 0x02c5c73f, 0x03ada42a, 0x002a0fd2}}}, + {X: Field{[10]uint32{0x01c32f8d, 0x01b7f1e8, 0x035d009c, 0x035ba540, 0x01150e54, 0x029064d3, 0x015fcb13, 0x00647b7c, 0x01f2767b, 0x002162d0}}, Y: Field{[10]uint32{0x03de8dd7, 0x03b3e0a7, 0x01358e5c, 0x0277d975, 0x00b34d6e, 0x01200a8a, 0x00a21720, 0x0257d51e, 0x017d76dc, 0x0020602e}}}, + {X: Field{[10]uint32{0x030e81e6, 0x03f40830, 0x01294245, 0x01a034bc, 0x033eb9a6, 0x03d06004, 0x01234e5f, 0x0166e1b4, 0x0002bee3, 0x00357260}}, Y: Field{[10]uint32{0x033781de, 0x02bad256, 0x0376d921, 0x03a47640, 0x03a0b6bc, 0x00bf21ed, 0x01a2e4ee, 0x031e5419, 0x01a4cd2b, 0x0013948b}}}, + {X: Field{[10]uint32{0x0120c1ed, 0x01b0e865, 0x00fb7d4d, 0x01db6a2b, 0x0134002d, 0x00b792df, 0x024ddf58, 0x03aa7dc6, 0x01622f9c, 0x0003afe4}}, Y: Field{[10]uint32{0x02d4e251, 0x02074616, 0x0136ecd4, 0x0126394d, 0x027e43d0, 0x00631d6a, 0x03fb4833, 0x02073638, 0x03223e18, 0x003bb9d4}}}, + {X: Field{[10]uint32{0x0261db4d, 0x01bdb202, 0x01ff6b40, 0x0013cd9a, 0x000acc45, 0x03dd2f9a, 0x002e111a, 0x015bcc23, 0x02a9d087, 0x0000e1fd}}, Y: Field{[10]uint32{0x03cdd28a, 0x02d54ba1, 0x00c4a59d, 0x0288dc89, 0x01ed0bbb, 0x033d73d3, 0x01f96d5d, 0x017e449b, 0x01e3ea1d, 0x000a2165}}}, + {X: Field{[10]uint32{0x03e46714, 0x01d255b7, 0x020df255, 0x03ba7fbc, 0x009aa409, 0x01648051, 0x03a2d70e, 0x0354b8e0, 0x01c0989b, 0x00225ffc}}, Y: Field{[10]uint32{0x01adc9d1, 0x03b3e942, 0x016c6bca, 0x01a4db7f, 0x02de0940, 0x0112a1ce, 0x0295a006, 0x0194a7d3, 0x00c9308c, 0x000f3ef0}}}, + {X: Field{[10]uint32{0x01a395af, 0x01fbc6ad, 0x03eefb57, 0x00ddbe13, 0x03bbcbb3, 0x00b62c93, 0x02bbf21e, 0x02131e2d, 0x00a68e04, 0x000c956a}}, Y: Field{[10]uint32{0x0112aeb3, 0x0089664a, 0x0081fd81, 0x0355107a, 0x0379ef3f, 0x00b5d224, 0x014a426d, 0x012e139b, 0x0002f920, 0x0005ecf0}}}, + {X: Field{[10]uint32{0x01c55599, 0x023be7f7, 0x01b7e277, 0x00079c1c, 0x011fbca1, 0x007b6889, 0x003eeafb, 0x038ec0e5, 0x0152d4d9, 0x000b292a}}, Y: Field{[10]uint32{0x03891e00, 0x00b858c8, 0x016a0989, 0x032d8f28, 0x03e98631, 0x01d231fa, 0x01a2c044, 0x030637e0, 0x02ccdf02, 0x002feb2e}}}, + {X: Field{[10]uint32{0x024383b2, 0x0017dab7, 0x03d73105, 0x03e22936, 0x02046ee5, 0x006dbb2d, 0x03b0410e, 0x00cd2b51, 0x009c478c, 0x0030fa0a}}, Y: Field{[10]uint32{0x02f0f55f, 0x00012cf5, 0x0391fde4, 0x03b89c9e, 0x0000229b, 0x02d3b488, 0x03f4309c, 0x0048e191, 0x02ceb043, 0x0015e4b0}}}, + {X: Field{[10]uint32{0x01119049, 0x02f49f05, 0x019d5f87, 0x02376e4b, 0x0086fb96, 0x01fe6108, 0x03ad63c6, 0x024be619, 0x0360a862, 0x000aef7b}}, Y: Field{[10]uint32{0x00a85362, 0x0219d598, 0x03538802, 0x018953c0, 0x00e75dac, 0x03503534, 0x0099d193, 0x0311e4a4, 0x03623536, 0x003d292d}}}, + {X: Field{[10]uint32{0x032496a9, 0x00cf2e7f, 0x03d2ce03, 0x01ef88ab, 0x01fe3ee4, 0x005292f8, 0x0014ef07, 0x02b2cc60, 0x00909e7d, 0x001de9b8}}, Y: Field{[10]uint32{0x0251065f, 0x01746214, 0x00384381, 0x009f858f, 0x0234461e, 0x00658524, 0x01915d18, 0x0241b347, 0x0075b1a9, 0x00153c39}}}, + {X: Field{[10]uint32{0x00f40ff0, 0x00e79141, 0x00b1145c, 0x0391e4d4, 0x02ea94d5, 0x01e7d935, 0x034f4139, 0x0249537a, 0x016b7871, 0x0034656e}}, Y: Field{[10]uint32{0x00e0636c, 0x01fdca70, 0x0069bd99, 0x02b696bd, 0x00b8245c, 0x002936e2, 0x032d4b2b, 0x0211ba51, 0x0040613c, 0x0008e291}}}, + {X: Field{[10]uint32{0x00815b1f, 0x029866c1, 0x01bd8113, 0x00552369, 0x00ad024d, 0x00213d05, 0x03b0f3c6, 0x029975d6, 0x0336208a, 0x0030e6a8}}, Y: Field{[10]uint32{0x0126fe5a, 0x00cc54c4, 0x012004b2, 0x014db612, 0x02455a00, 0x0395cfb9, 0x0083b226, 0x00775052, 0x02d63274, 0x001eaac7}}}, + {X: Field{[10]uint32{0x01e31f30, 0x01dd933f, 0x028d2296, 0x01c11362, 0x01d6661c, 0x00932ecc, 0x020bd270, 0x020b6f2f, 0x023d0baf, 0x003a0328}}, Y: Field{[10]uint32{0x0197451b, 0x0211d129, 0x017138c4, 0x01091a18, 0x01f67e81, 0x03ae0f97, 0x03c583a5, 0x01e1e2f2, 0x01d47318, 0x002854f4}}}, + {X: Field{[10]uint32{0x0272ef80, 0x032dec0b, 0x00120711, 0x017f82bb, 0x01f3e850, 0x0356569f, 0x016723a4, 0x0308e83e, 0x0265a5a9, 0x000e56de}}, Y: Field{[10]uint32{0x009bf990, 0x026979f9, 0x034b6222, 0x000ca64b, 0x034f88cf, 0x02895950, 0x02d37b19, 0x01b8e4da, 0x01d54747, 0x00164083}}}, + {X: Field{[10]uint32{0x010b495c, 0x03f688a4, 0x02577644, 0x0117ffbc, 0x02e8b495, 0x0144a976, 0x017e2cd9, 0x008f49ed, 0x00dbb83e, 0x0019e9fa}}, Y: Field{[10]uint32{0x00965735, 0x014c0cba, 0x01f15a87, 0x03b9a338, 0x0041fd34, 0x03a02d04, 0x00a89f78, 0x02e7d040, 0x019d3791, 0x001f0052}}}, + {X: Field{[10]uint32{0x01c0c7e7, 0x02cecfdb, 0x03892ac9, 0x00218508, 0x03ecfb4b, 0x032f8b38, 0x01863952, 0x039ec21a, 0x027d76d2, 0x003100e3}}, Y: Field{[10]uint32{0x01e92f3b, 0x0080d459, 0x0229e72f, 0x002d9909, 0x00012946, 0x030d3f23, 0x02a27bab, 0x026df4c9, 0x030d9efc, 0x00186ece}}}, + {X: Field{[10]uint32{0x03a25e5a, 0x0095a630, 0x019a88a5, 0x00201c28, 0x01b9bdda, 0x03f0fd5d, 0x029c52f5, 0x034ebbb9, 0x01e226a4, 0x001dc169}}, Y: Field{[10]uint32{0x03c7a1b7, 0x020f92d4, 0x022073a8, 0x00088901, 0x0244be9e, 0x0071aa60, 0x0026973d, 0x001be309, 0x016cf019, 0x00116382}}}, + {X: Field{[10]uint32{0x00ff48d0, 0x028d1d4d, 0x028759e4, 0x03c6d192, 0x0268a5f1, 0x007f80e5, 0x02994fa0, 0x02d7985a, 0x03c35958, 0x003cf3a2}}, Y: Field{[10]uint32{0x010058fe, 0x02891cf8, 0x00d6b222, 0x02821d40, 0x038dc92a, 0x01ebb18f, 0x008c441f, 0x035e2d9f, 0x0197be3a, 0x00270687}}}, + {X: Field{[10]uint32{0x00a4e0d0, 0x0279fccf, 0x005d7664, 0x02b6bd5a, 0x003ebb94, 0x00075be2, 0x029d764e, 0x033af6e6, 0x0120de69, 0x002417b0}}, Y: Field{[10]uint32{0x00a9d554, 0x039127a7, 0x030e93a8, 0x004b5e6a, 0x024d42ce, 0x01470032, 0x00a75d0e, 0x02a8e9dd, 0x02993974, 0x0024985f}}}, + {X: Field{[10]uint32{0x0321eeed, 0x02b69a26, 0x006b4f15, 0x011ff6c9, 0x0127d484, 0x01993078, 0x02d0edc3, 0x02164a2e, 0x024da357, 0x002c6dd2}}, Y: Field{[10]uint32{0x013206d9, 0x02c9baa7, 0x021328f5, 0x0240cf13, 0x00c14e4d, 0x00c8b134, 0x00e38231, 0x027a3ef3, 0x01c7b84e, 0x00310d4e}}}, + {X: Field{[10]uint32{0x03d8bcf1, 0x03ee58c0, 0x02025bd5, 0x01344b4f, 0x038dcf81, 0x0310b6ad, 0x03a2a471, 0x00b51acb, 0x0165c72f, 0x00035100}}, Y: Field{[10]uint32{0x0343ae3e, 0x001c87d4, 0x0022aca3, 0x01247601, 0x03fabab7, 0x031da0f7, 0x03ad9cff, 0x017eb3a5, 0x0150261f, 0x00382192}}}, + {X: Field{[10]uint32{0x0053b303, 0x00fe4e54, 0x02ed1de0, 0x02bd9602, 0x03fe08d5, 0x0355ce95, 0x03910be6, 0x00669fde, 0x004f722c, 0x003fd493}}, Y: Field{[10]uint32{0x0353bf0d, 0x02ea986d, 0x0391398f, 0x01a18bd7, 0x035b9f13, 0x00c80cd6, 0x0262deab, 0x02aa2ece, 0x014e5b25, 0x0003f52b}}}, + {X: Field{[10]uint32{0x018d091e, 0x017fbc63, 0x01a4463a, 0x02c128eb, 0x038fafa2, 0x02706e90, 0x0376a53c, 0x00420f92, 0x00bd331c, 0x003bff78}}, Y: Field{[10]uint32{0x01947dde, 0x038530c7, 0x02b9aee0, 0x037cad06, 0x02c563bd, 0x01b33bc3, 0x02e54208, 0x0084179a, 0x029ca75c, 0x003f5ea1}}}, + {X: Field{[10]uint32{0x033875e8, 0x03115c4b, 0x01278f40, 0x01939027, 0x021115ba, 0x0160eb6c, 0x034a304b, 0x03667a22, 0x02c099c8, 0x002979d1}}, Y: Field{[10]uint32{0x02934a68, 0x0307bbcb, 0x00c07fd2, 0x00e7767a, 0x02841709, 0x001cfdff, 0x00baba4f, 0x00e0c0b1, 0x0112c2af, 0x001fe0c8}}}, + {X: Field{[10]uint32{0x02ccb431, 0x006424cc, 0x0246a1ba, 0x01d121be, 0x037df5e2, 0x03f91544, 0x00daa722, 0x03a50e76, 0x01e3af5e, 0x001ab32e}}, Y: Field{[10]uint32{0x0328dcae, 0x03277267, 0x01dc443e, 0x00207f3d, 0x01a3faf1, 0x01a3e4b9, 0x03c26a9b, 0x01960141, 0x0258842d, 0x003c3785}}}, + {X: Field{[10]uint32{0x032b6d4e, 0x0225e2bd, 0x023ba1ec, 0x00c7b404, 0x00b86f3d, 0x03be15a6, 0x00e782b3, 0x00cafdba, 0x0055e40d, 0x003204f4}}, Y: Field{[10]uint32{0x01068ca6, 0x01e40463, 0x0128d288, 0x03d0aee5, 0x0047d37e, 0x021318a0, 0x01a41916, 0x0118c713, 0x03572f92, 0x002ebdb5}}}, + {X: Field{[10]uint32{0x03c7aaf9, 0x02a11365, 0x01177038, 0x0398bf7c, 0x03599dfa, 0x02f93561, 0x03baeb58, 0x03f18913, 0x00122cad, 0x0022e208}}, Y: Field{[10]uint32{0x02f7a6a3, 0x00f1e081, 0x00b2d409, 0x0291da02, 0x007867c8, 0x029690aa, 0x016e131f, 0x003693dc, 0x0293ac90, 0x003d79b0}}}, + {X: Field{[10]uint32{0x017310ce, 0x006760cb, 0x017ee096, 0x00d1341c, 0x03bc02ff, 0x03fea910, 0x00a5acc4, 0x03960ad5, 0x0050f49e, 0x0023c1d4}}, Y: Field{[10]uint32{0x01f7fd3f, 0x0284c56d, 0x021c9b99, 0x02a1adc0, 0x01f1f9f9, 0x011e668f, 0x00555c4a, 0x034c95f3, 0x01bb7ab3, 0x0004ee40}}}, + {X: Field{[10]uint32{0x00374c58, 0x035047ec, 0x01f66921, 0x036c8720, 0x0389a456, 0x00bdcb25, 0x025fb1df, 0x00f950f1, 0x02f8cf64, 0x002ef214}}, Y: Field{[10]uint32{0x030a590b, 0x012ee8ac, 0x032cd4c1, 0x00be13c0, 0x03a27e1c, 0x02c922cf, 0x03f604cf, 0x007892ca, 0x02bbe797, 0x002b423a}}}, + {X: Field{[10]uint32{0x0280bc1f, 0x000940c6, 0x009fcffa, 0x0332c795, 0x03009278, 0x03730b72, 0x00edddc9, 0x0156ee1e, 0x004b662b, 0x000b5df7}}, Y: Field{[10]uint32{0x00d058eb, 0x01821c3b, 0x03fffa8e, 0x0282272b, 0x02c07707, 0x01dbbdbb, 0x01a62f4e, 0x03ca86b4, 0x00d84fa7, 0x000a22ec}}}, + {X: Field{[10]uint32{0x03ccbdf9, 0x01e452b5, 0x00b4ffea, 0x02ae7216, 0x00c90945, 0x012ee9b2, 0x03df7d99, 0x02a1bae6, 0x031ff3b4, 0x002f20fd}}, Y: Field{[10]uint32{0x03232292, 0x034f9252, 0x00b30020, 0x018e8ea2, 0x01fa3c25, 0x03446550, 0x01ed4553, 0x01f48e02, 0x03a3e506, 0x00063a47}}}, + {X: Field{[10]uint32{0x00200919, 0x036d0d4b, 0x037b3205, 0x03038aee, 0x0045f83d, 0x011f4149, 0x0211b7e8, 0x02239ac3, 0x02578d9b, 0x001f56e5}}, Y: Field{[10]uint32{0x00515ba9, 0x03d55c24, 0x00d352fa, 0x01caabf5, 0x00b1c9e6, 0x015a6bd3, 0x00e7230c, 0x0304370a, 0x037b8830, 0x00079a27}}}, + {X: Field{[10]uint32{0x000cdc80, 0x03e4a288, 0x03cdc1ba, 0x021f2b30, 0x01516148, 0x01183128, 0x01bab4c7, 0x021a20c7, 0x03648d75, 0x00217a7c}}, Y: Field{[10]uint32{0x01369e27, 0x0239684c, 0x03a9dd5f, 0x03d300ff, 0x035ba5e4, 0x001fdff0, 0x025224cc, 0x01170161, 0x01180d50, 0x001fd339}}}, + {X: Field{[10]uint32{0x02cd0810, 0x00765d12, 0x0065da10, 0x01dd16c7, 0x029c1d10, 0x02ef6dc6, 0x0055816d, 0x0252f4d2, 0x00dfc1c0, 0x001094e4}}, Y: Field{[10]uint32{0x0349bc00, 0x01df53c7, 0x0327d1e2, 0x030c2303, 0x02707547, 0x0027785d, 0x0026d94f, 0x0135c1a4, 0x00dd20ef, 0x00207c53}}}, + {X: Field{[10]uint32{0x013549d7, 0x036bfd90, 0x004194ce, 0x0026fe39, 0x02dbb594, 0x00283dd6, 0x00d00bb6, 0x024eb094, 0x030b66dc, 0x000f31f3}}, Y: Field{[10]uint32{0x00204a58, 0x01307587, 0x0323a066, 0x00668afa, 0x02ae17b7, 0x037dc399, 0x008bcf99, 0x036267da, 0x032fc3db, 0x000cc698}}}, + {X: Field{[10]uint32{0x0270853d, 0x00acfaf3, 0x035f017e, 0x00a8af8e, 0x009d6a0b, 0x03fde276, 0x03c923bc, 0x02f3a023, 0x008db8a1, 0x003f5c82}}, Y: Field{[10]uint32{0x01eaf599, 0x0037b242, 0x03494b71, 0x02a37d91, 0x0193db4a, 0x0282fb76, 0x03296383, 0x0066ebac, 0x0323a388, 0x0034e44a}}}, + {X: Field{[10]uint32{0x03e65060, 0x02cd6b3b, 0x037a6b72, 0x01071f74, 0x01c73185, 0x0282ea89, 0x00940af9, 0x025b6936, 0x038d5e00, 0x000f9563}}, Y: Field{[10]uint32{0x0260e90a, 0x01414f79, 0x00dde769, 0x00c5ffb0, 0x03f78f64, 0x02ea56e1, 0x03bdb3ef, 0x020170fa, 0x017f069d, 0x000a900f}}}, + {X: Field{[10]uint32{0x00694a7e, 0x03c81276, 0x00b01e82, 0x00aa43f4, 0x03721ec3, 0x0386dd17, 0x0000149f, 0x03c8885b, 0x0223f525, 0x001c1c20}}, Y: Field{[10]uint32{0x03d12569, 0x036afafb, 0x0354b410, 0x02218d98, 0x01fce17d, 0x01f650ed, 0x0186ac90, 0x0354fc67, 0x0387f0b4, 0x003bd2b5}}}, + {X: Field{[10]uint32{0x02414f72, 0x03a4452a, 0x012fc6e5, 0x02537be7, 0x02440b4a, 0x007933dd, 0x01eddb71, 0x03ebd92e, 0x0225eabf, 0x003b28a5}}, Y: Field{[10]uint32{0x037618cf, 0x00e2e388, 0x009dcd35, 0x00a0a0e6, 0x03f798b6, 0x03162433, 0x03bb2274, 0x028ff2c8, 0x007575af, 0x003c7e0e}}}, + {X: Field{[10]uint32{0x03297695, 0x00e3d957, 0x00108778, 0x02959b5b, 0x02da7423, 0x02186496, 0x0206db46, 0x03c31311, 0x0350542d, 0x0016df11}}, Y: Field{[10]uint32{0x011f784d, 0x008ae79e, 0x010795f9, 0x00b57a01, 0x01de04db, 0x033669a9, 0x00cb1a24, 0x02227f5b, 0x03661ae1, 0x0010a044}}}, + {X: Field{[10]uint32{0x00012042, 0x026e61af, 0x0038cb37, 0x01a20016, 0x02bd5da1, 0x039e20bf, 0x02982dd1, 0x02cbbb4d, 0x03e6040c, 0x002bc697}}, Y: Field{[10]uint32{0x013e6224, 0x0104856b, 0x00778b7e, 0x023a18f5, 0x02576877, 0x03f3f228, 0x03d12ed1, 0x0298d298, 0x0149305f, 0x001c55c1}}}, + {X: Field{[10]uint32{0x0366b1d2, 0x00659da4, 0x0346a9a3, 0x022c755d, 0x03e1e8b1, 0x00627132, 0x03cd1be1, 0x01f9c3e0, 0x03a24678, 0x001c9d10}}, Y: Field{[10]uint32{0x0116d540, 0x024a341b, 0x03dead68, 0x0303480b, 0x004df56a, 0x01dc396d, 0x02565cc1, 0x00fa2684, 0x00269bba, 0x00218d5e}}}, + {X: Field{[10]uint32{0x02640b8d, 0x03866284, 0x012556c5, 0x00aeafcf, 0x03ae2c9a, 0x004e647d, 0x01e68352, 0x0398a852, 0x0179db34, 0x0000259e}}, Y: Field{[10]uint32{0x019edcc4, 0x0301f07f, 0x03b014d4, 0x009c946c, 0x018547b8, 0x02fcf47b, 0x02e44ac3, 0x015944f3, 0x014f5244, 0x00267707}}}, + {X: Field{[10]uint32{0x03203601, 0x03ee20eb, 0x038b159d, 0x01f6f95e, 0x02be5693, 0x0016c1ac, 0x02f9d739, 0x0124789f, 0x01db08f3, 0x001e5002}}, Y: Field{[10]uint32{0x02da40b6, 0x0329878a, 0x017e750e, 0x009090e4, 0x005db60d, 0x022761ad, 0x026a0872, 0x03873456, 0x024d7ee5, 0x00169ab5}}}, + {X: Field{[10]uint32{0x01851d10, 0x018a5faa, 0x015110cf, 0x00bd41e4, 0x03d2f421, 0x03ec3747, 0x029470b1, 0x02c2436e, 0x02396f90, 0x0021f2f6}}, Y: Field{[10]uint32{0x001b63f0, 0x02480169, 0x013e773a, 0x014b8473, 0x03fb8f79, 0x01561771, 0x01fb4c9c, 0x03e65d40, 0x01f3a2a4, 0x00272825}}}, + {X: Field{[10]uint32{0x0110acb0, 0x0116c06e, 0x01fa84b2, 0x036816e5, 0x02cd1f3a, 0x006f9f84, 0x00207720, 0x005d4963, 0x0303475d, 0x0027b55e}}, Y: Field{[10]uint32{0x03bbd5eb, 0x03ba8da8, 0x0350d324, 0x0112387b, 0x03253106, 0x0032cfa2, 0x0058a7bd, 0x0206be17, 0x005443bd, 0x00356324}}}, + {X: Field{[10]uint32{0x028b0402, 0x00d53980, 0x02be7d5d, 0x0087f499, 0x0335fd95, 0x01844cd8, 0x02c77e38, 0x011260b6, 0x022292ca, 0x003be342}}, Y: Field{[10]uint32{0x00b58b6b, 0x01629d0f, 0x0037ff97, 0x034b8ad0, 0x02f2f547, 0x01df06a6, 0x0223e5b6, 0x02076a92, 0x034a5568, 0x00395712}}}, + {X: Field{[10]uint32{0x0127e3d9, 0x000565f4, 0x01c75abd, 0x0386c4bd, 0x002299f6, 0x03e93b42, 0x02d369f4, 0x03ca7540, 0x01f5a274, 0x001b6e88}}, Y: Field{[10]uint32{0x01a39d94, 0x0369de94, 0x00f3c930, 0x02774b7c, 0x01c951f6, 0x039ba720, 0x00302de3, 0x03907a31, 0x032f0a0c, 0x001da17d}}}, + {X: Field{[10]uint32{0x00399a3d, 0x0111a4f2, 0x032aa6ba, 0x026dfecc, 0x02784196, 0x01bb4a94, 0x001b0f42, 0x0308d5f7, 0x02bf857a, 0x0023370f}}, Y: Field{[10]uint32{0x03f910ca, 0x01dbe92d, 0x02beca58, 0x02ac9d22, 0x03df250d, 0x02da2866, 0x00d87249, 0x031c501b, 0x03c1915a, 0x0008d374}}}, + {X: Field{[10]uint32{0x01eca2da, 0x03f620ad, 0x00de1e88, 0x03e8a4d1, 0x00a9c790, 0x011c1a26, 0x03391b6f, 0x0196d1f8, 0x01c8caa6, 0x0028020a}}, Y: Field{[10]uint32{0x01424110, 0x02d4c5bf, 0x02aa8184, 0x025d81a3, 0x00234862, 0x020c6095, 0x004b1299, 0x01333962, 0x00c71e83, 0x002df23f}}}, + {X: Field{[10]uint32{0x0149ce6a, 0x02007748, 0x005f5640, 0x00bbbfdf, 0x02a4ed5b, 0x0353c8b5, 0x012e54a1, 0x02fac528, 0x0362446c, 0x00161cbd}}, Y: Field{[10]uint32{0x00ee198f, 0x0283070a, 0x01e2ac75, 0x0362eeb3, 0x004c37d5, 0x010d93bd, 0x030c29e2, 0x015fe869, 0x03e88627, 0x0022ab34}}}, + {X: Field{[10]uint32{0x02fd34f2, 0x0331ae40, 0x03b2fec4, 0x02b24674, 0x0353e7ce, 0x016d4cb3, 0x02677d2e, 0x01c543c8, 0x01c05dba, 0x002dc3b5}}, Y: Field{[10]uint32{0x00d28cf8, 0x035120a9, 0x0083126b, 0x026c2158, 0x0376c3d6, 0x006363f2, 0x03cee0b0, 0x005c728b, 0x0128cc74, 0x001f90fd}}}, + {X: Field{[10]uint32{0x0053bb52, 0x00305ae0, 0x027d309d, 0x00169e42, 0x022e8ca5, 0x03ac272e, 0x01a6d7c8, 0x0187431f, 0x02133c61, 0x0012faa8}}, Y: Field{[10]uint32{0x01d4f6d5, 0x02b372a6, 0x03ffadb1, 0x01b30a62, 0x03070349, 0x012cbb84, 0x0226d8fe, 0x0368bb19, 0x003c9cbd, 0x00369302}}}, + {X: Field{[10]uint32{0x01804831, 0x003a07c1, 0x035fc8a1, 0x00d134d3, 0x0108594b, 0x017e6af4, 0x00de363c, 0x0060d29e, 0x02c653ce, 0x002a34c7}}, Y: Field{[10]uint32{0x02c5cff9, 0x0130a1b6, 0x00bce64f, 0x00616529, 0x008c462c, 0x02df22e9, 0x01b5601c, 0x038dc27b, 0x01cd7cbb, 0x002d35aa}}}, +} + +var prec = [64][16]XY{ + { + {X: Field{[10]uint32{0x02f81798, 0x00a056c5, 0x028d959f, 0x036cb738, 0x03029bfc, 0x03a1c2c1, 0x0206295c, 0x02eeb156, 0x027ef9dc, 0x001e6f99}}, Y: Field{[10]uint32{0x0310d4b8, 0x01f423fe, 0x014199c4, 0x01229a15, 0x00fd17b4, 0x0384422a, 0x024fbfc0, 0x03119576, 0x027726a3, 0x00120eb6}}}, + {X: Field{[10]uint32{0x00709ee5, 0x03026e57, 0x03ca7aba, 0x012e33bc, 0x005c778e, 0x01701f36, 0x005406e9, 0x01f5b4c1, 0x039441ed, 0x0031811f}}, Y: Field{[10]uint32{0x00cfe52a, 0x010c6a54, 0x010e1236, 0x0194c99b, 0x02f7f632, 0x019b3abb, 0x00584194, 0x030ce68f, 0x00fea63d, 0x0006b85a}}}, + {X: Field{[10]uint32{0x00e036f9, 0x007c44ef, 0x019b0860, 0x01160dbe, 0x01b531c8, 0x0227548a, 0x0344f85f, 0x030c4124, 0x02019258, 0x003e4c22}}, Y: Field{[10]uint32{0x00b8e672, 0x027f5d61, 0x0231b6cb, 0x0264d308, 0x026500a9, 0x028dfcd5, 0x02337e62, 0x03a0503f, 0x030f632d, 0x000e23de}}}, + {X: Field{[10]uint32{0x00c4cd13, 0x02a52afa, 0x0358474f, 0x02403b81, 0x00cc6c13, 0x00c2c501, 0x01e49049, 0x0203cd60, 0x03f1c10d, 0x003924f6}}, Y: Field{[10]uint32{0x03739922, 0x025ef711, 0x03e40cfe, 0x00cefef7, 0x00d967ae, 0x03a94512, 0x002e2098, 0x0156dd59, 0x013ea0d4, 0x00147b66}}}, + {X: Field{[10]uint32{0x0240efe4, 0x02355a6c, 0x01ab7cba, 0x02f77186, 0x00e88b84, 0x0297144a, 0x034a7250, 0x00824d56, 0x024d1a07, 0x000be2f7}}, Y: Field{[10]uint32{0x02ac62d6, 0x021f4ea9, 0x02840dca, 0x006eac35, 0x02f78827, 0x01b27109, 0x01ba9dda, 0x038f5b53, 0x022636e5, 0x00362b08}}}, + {X: Field{[10]uint32{0x00297556, 0x015e8518, 0x0218b2f0, 0x00be15a2, 0x0382f647, 0x01548d74, 0x0053a143, 0x03ba9081, 0x03d5755e, 0x003ffe5e}}, Y: Field{[10]uint32{0x0075f297, 0x01c30dac, 0x024a03c8, 0x03d9463f, 0x00de80f0, 0x03d17158, 0x03e96017, 0x02d883ce, 0x037aacfb, 0x002b849d}}}, + {X: Field{[10]uint32{0x02c4f9bc, 0x02f77b72, 0x0239ce92, 0x01f80cc3, 0x023d419b, 0x00ba9e83, 0x018f365f, 0x02d3aa8e, 0x00646e5d, 0x00172f7c}}, Y: Field{[10]uint32{0x007264da, 0x02098a02, 0x027b5a50, 0x02e04ff7, 0x03a813d0, 0x01869536, 0x0178d6d8, 0x0165828c, 0x0240ba25, 0x001abaf2}}}, + {X: Field{[10]uint32{0x010a2a01, 0x0213bcf8, 0x0088a677, 0x001796be, 0x030a1bdd, 0x01c3cf0b, 0x033843fb, 0x00d476bf, 0x01e15cca, 0x000bc079}}, Y: Field{[10]uint32{0x00bde904, 0x028b2ddb, 0x03617b5d, 0x035ae96d, 0x00c2e213, 0x00cb44ed, 0x03d082a1, 0x026524a4, 0x00a74153, 0x0017136a}}}, + {X: Field{[10]uint32{0x0027ccbe, 0x03c4437f, 0x02714c35, 0x025d315f, 0x01e09796, 0x03d566af, 0x02d178a9, 0x03d94c26, 0x00e2f0c7, 0x002b3521}}, Y: Field{[10]uint32{0x024f9c37, 0x03098ab1, 0x00e0f05c, 0x0290dd7e, 0x01add888, 0x018ed87a, 0x03809717, 0x0367f590, 0x0121b0a7, 0x00330ce2}}}, + {X: Field{[10]uint32{0x03e247c7, 0x01a38a91, 0x002b752a, 0x026c650f, 0x013442d4, 0x02b9ab97, 0x0077c7b1, 0x032188d5, 0x019e47f3, 0x002810d3}}, Y: Field{[10]uint32{0x037368d7, 0x03b94ec0, 0x021593cb, 0x00bb61de, 0x016f794c, 0x00e8931a, 0x036c7e69, 0x02f09e8e, 0x02425419, 0x00224eae}}}, + {X: Field{[10]uint32{0x01a008cb, 0x0305e257, 0x03891bbe, 0x002f9705, 0x00564998, 0x003196ab, 0x034246b7, 0x0104797b, 0x03f858a9, 0x001dd2b9}}, Y: Field{[10]uint32{0x0153c61b, 0x035d3272, 0x016a8301, 0x038b7fe7, 0x01372db1, 0x01edecd9, 0x003dd56d, 0x01786409, 0x0032eb6b, 0x00366128}}}, + {X: Field{[10]uint32{0x00afe85a, 0x003d1c1c, 0x0095bc5b, 0x01065880, 0x03687cf4, 0x035cd18c, 0x0038f004, 0x01586c57, 0x01d548e7, 0x00340445}}, Y: Field{[10]uint32{0x00062327, 0x0146c4fd, 0x02d526b0, 0x017766a1, 0x0179238c, 0x005ef605, 0x0364537e, 0x03835ea2, 0x03fdc815, 0x002a7cd3}}}, + {X: Field{[10]uint32{0x01405aa8, 0x0377e3c6, 0x018cddee, 0x03198439, 0x01b075fb, 0x00dd2194, 0x011d205c, 0x00a22f1f, 0x03c2d975, 0x003ca1dc}}, Y: Field{[10]uint32{0x0303ed81, 0x0172d4b6, 0x0291f29b, 0x0369487e, 0x033a1a06, 0x01736bd1, 0x00212eb6, 0x002a25d6, 0x002e8d88, 0x0002ac24}}}, + {X: Field{[10]uint32{0x00e823e4, 0x02c90698, 0x009e6e49, 0x018d9e25, 0x0226aa7b, 0x01f4e38c, 0x024e67f0, 0x01c673f5, 0x039e895e, 0x001267f7}}, Y: Field{[10]uint32{0x03a13f5b, 0x03d03500, 0x015bcc65, 0x0309e8fe, 0x00464279, 0x01ecf519, 0x03044e4a, 0x02154643, 0x02c4b54e, 0x0032b0bd}}}, + {X: Field{[10]uint32{0x027e080e, 0x036f3e38, 0x0379e44a, 0x01bcf217, 0x0131e594, 0x0257fd04, 0x0065ae30, 0x03aa5969, 0x014f7d43, 0x0035e493}}, Y: Field{[10]uint32{0x02a26b58, 0x013727fd, 0x013a5c50, 0x00af625b, 0x03ea40af, 0x02331b7b, 0x0042ec22, 0x01ca9a0e, 0x0072a86c, 0x0016078a}}}, + {X: Field{[10]uint32{0x026dec0a, 0x03ba278a, 0x01ae9c44, 0x01a6e1e9, 0x03b2a313, 0x00708fa5, 0x011aabc2, 0x027b14c0, 0x0293b59e, 0x003983f3}}, Y: Field{[10]uint32{0x01616821, 0x00cb339a, 0x03f0be1f, 0x00791348, 0x00129689, 0x015e4dc4, 0x0399f34f, 0x02564a76, 0x007399e5, 0x003df8d4}}}, + }, + { + {X: Field{[10]uint32{0x026dec0a, 0x03ba278a, 0x01ae9c44, 0x01a6e1e9, 0x03b2a313, 0x00708fa5, 0x011aabc2, 0x027b14c0, 0x0293b59e, 0x003983f3}}, Y: Field{[10]uint32{0x01616821, 0x00cb339a, 0x03f0be1f, 0x00791348, 0x00129689, 0x015e4dc4, 0x0399f34f, 0x02564a76, 0x007399e5, 0x003df8d4}}}, + {X: Field{[10]uint32{0x03143e65, 0x0036f501, 0x0261d75d, 0x02e26412, 0x02dacffc, 0x00bcde33, 0x036e054e, 0x0288b51e, 0x01d74fb5, 0x0034c066}}, Y: Field{[10]uint32{0x00106ab9, 0x00ffc7c9, 0x0019605b, 0x030d93b6, 0x011f760c, 0x0260e019, 0x016dec9e, 0x03570ecf, 0x019d0ae3, 0x002540e3}}}, + {X: Field{[10]uint32{0x0118e5c3, 0x021c2a84, 0x02bc19bd, 0x009d14af, 0x03fc579b, 0x013996d2, 0x001656ef, 0x00c1f6d1, 0x035d9645, 0x001bb28c}}, Y: Field{[10]uint32{0x01a08668, 0x028bde01, 0x02c34498, 0x00e8efe3, 0x003a496a, 0x012e1d68, 0x02f57907, 0x001c4164, 0x03b57a7a, 0x00354048}}}, + {X: Field{[10]uint32{0x0074ef8b, 0x024639be, 0x03d81e37, 0x007736eb, 0x00fc4c6f, 0x020ca08f, 0x01051eaf, 0x03aadc2c, 0x01542d16, 0x002fc8f0}}, Y: Field{[10]uint32{0x02831d9f, 0x00dfbf99, 0x02f784dc, 0x01520478, 0x00c522fc, 0x0294e4b9, 0x01928a0b, 0x000dcdeb, 0x026fc330, 0x00172ce1}}}, + {X: Field{[10]uint32{0x0387f62e, 0x034c7853, 0x021270ec, 0x00e18dc5, 0x0010e6e6, 0x00d1967c, 0x03c744ed, 0x0243b035, 0x03bef1bf, 0x003a588e}}, Y: Field{[10]uint32{0x004ee737, 0x004fabe9, 0x0044e530, 0x032775a2, 0x01fe6043, 0x03b6aa4a, 0x03e953a8, 0x0267a783, 0x003b4bc2, 0x000e2a5d}}}, + {X: Field{[10]uint32{0x038cb0e3, 0x00ceb29f, 0x023a4439, 0x00ff87bf, 0x02a22eb5, 0x02cbadcb, 0x0264e044, 0x01b63e3e, 0x00e57445, 0x000fc3a0}}, Y: Field{[10]uint32{0x025f404f, 0x00a278ba, 0x013a4cb0, 0x00ea996d, 0x03950125, 0x0217406c, 0x00b9c084, 0x02f247a4, 0x03d7296c, 0x0032d9b5}}}, + {X: Field{[10]uint32{0x028d733c, 0x02ab7e0a, 0x028f9eb0, 0x02fd8bf2, 0x02ffc274, 0x002035a0, 0x004a36f2, 0x0076e822, 0x0173e516, 0x002f20b7}}, Y: Field{[10]uint32{0x007797f0, 0x0218413d, 0x017301e7, 0x02eb9ce2, 0x03ae93a0, 0x0067c0b7, 0x029b4bf7, 0x0072b152, 0x003a044b, 0x00397ca3}}}, + {X: Field{[10]uint32{0x0369a24e, 0x001dd159, 0x01655647, 0x035c014d, 0x00bcf55c, 0x01f459c7, 0x02c3d09f, 0x01e819a5, 0x03e4033f, 0x000d3fce}}, Y: Field{[10]uint32{0x03cc2f1a, 0x00419e9c, 0x03681849, 0x030fa3e2, 0x0055df16, 0x020c8263, 0x02619d89, 0x01b154fd, 0x01623a23, 0x00176744}}}, + {X: Field{[10]uint32{0x03bc7671, 0x03f88c57, 0x00e32d7e, 0x03214a16, 0x00743f1b, 0x01e63d24, 0x00291ce1, 0x01c84748, 0x0248c765, 0x00238f44}}, Y: Field{[10]uint32{0x00717dec, 0x00771906, 0x0144a7ef, 0x02aa98f8, 0x02b9352b, 0x00e4fa43, 0x00480e19, 0x032e07d9, 0x00e10ecf, 0x00026692}}}, + {X: Field{[10]uint32{0x01b03f6c, 0x030cab54, 0x0184b05e, 0x0048aa6c, 0x02a4d047, 0x03dcfd5d, 0x00776838, 0x036488af, 0x03a27a52, 0x000c2244}}, Y: Field{[10]uint32{0x00fe4c67, 0x02d7bf3a, 0x01f1260a, 0x03aa0af4, 0x01a8333f, 0x01b00dd7, 0x023531f6, 0x02f97e47, 0x009543fe, 0x003d296c}}}, + {X: Field{[10]uint32{0x02b31db2, 0x021d0caf, 0x006a0f32, 0x009e23d4, 0x028fcae8, 0x002228ad, 0x02a193ed, 0x02926225, 0x01aa2234, 0x001e2a24}}, Y: Field{[10]uint32{0x01fa4343, 0x027588ee, 0x0382d306, 0x03376002, 0x0254379b, 0x01cc0b7d, 0x035f2552, 0x00d72ff3, 0x035beb50, 0x001a44a8}}}, + {X: Field{[10]uint32{0x03ce1752, 0x01d43dcc, 0x0204ec7b, 0x025f5f34, 0x02e783c7, 0x026726ba, 0x02ddf64d, 0x0318d604, 0x0258d01d, 0x0035e836}}, Y: Field{[10]uint32{0x0362cef4, 0x0009ce01, 0x03742bbc, 0x02a3018a, 0x010be040, 0x0038a119, 0x03292834, 0x0200cbdb, 0x00e06800, 0x002449dc}}}, + {X: Field{[10]uint32{0x01b0e595, 0x0123dde3, 0x002bb653, 0x02e7ee82, 0x03a7163c, 0x00581dba, 0x00e37658, 0x006c5f5f, 0x001855db, 0x001f619e}}, Y: Field{[10]uint32{0x00733de8, 0x01478eaf, 0x01532999, 0x01383897, 0x00293784, 0x0353e20e, 0x0162e2be, 0x03e1dcb9, 0x02dfec86, 0x0038ae66}}}, + {X: Field{[10]uint32{0x00e6b514, 0x03115c1b, 0x03322609, 0x031e6cd5, 0x01890905, 0x00211352, 0x005c3560, 0x03b45622, 0x01c2f919, 0x00022f22}}, Y: Field{[10]uint32{0x00c95157, 0x00fd33aa, 0x036f06f6, 0x0158449d, 0x01172d30, 0x02d624b0, 0x0376fec3, 0x03305b79, 0x03cdd7cd, 0x0034c4fc}}}, + {X: Field{[10]uint32{0x02060dfc, 0x03fbe145, 0x02a2a008, 0x02108179, 0x0276545f, 0x0106ac21, 0x0094b9dc, 0x00ab2121, 0x010f0058, 0x0037714c}}, Y: Field{[10]uint32{0x03820ca8, 0x03e2adb9, 0x00730fb5, 0x031aaf41, 0x0041dbaf, 0x0323c3a4, 0x011ab6dc, 0x025a4806, 0x033af20d, 0x002e834b}}}, + {X: Field{[10]uint32{0x01f51508, 0x01b88ff5, 0x01ca1064, 0x02af56b0, 0x00d8c39c, 0x01cb788e, 0x02a6e3e1, 0x002767a8, 0x023212c6, 0x0020a089}}, Y: Field{[10]uint32{0x02e26caf, 0x02dbabfd, 0x017bed31, 0x02b0bdec, 0x0262d613, 0x002d82b3, 0x00256e83, 0x037f917a, 0x00098557, 0x00047e2a}}}, + }, + { + {X: Field{[10]uint32{0x01f51508, 0x01b88ff5, 0x01ca1064, 0x02af56b0, 0x00d8c39c, 0x01cb788e, 0x02a6e3e1, 0x002767a8, 0x023212c6, 0x0020a089}}, Y: Field{[10]uint32{0x02e26caf, 0x02dbabfd, 0x017bed31, 0x02b0bdec, 0x0262d613, 0x002d82b3, 0x00256e83, 0x037f917a, 0x00098557, 0x00047e2a}}}, + {X: Field{[10]uint32{0x0334a24d, 0x038b003b, 0x019d0926, 0x01a36785, 0x010adbc9, 0x033e4635, 0x01a857a9, 0x027fce41, 0x00b287a7, 0x001194dc}}, Y: Field{[10]uint32{0x033887f4, 0x023ec82c, 0x03a10a2f, 0x02c8574d, 0x01588e09, 0x037bb0b0, 0x02f8bdaf, 0x03020a92, 0x01b38368, 0x000d794c}}}, + {X: Field{[10]uint32{0x017e8dfa, 0x03032e79, 0x02184fcf, 0x02468f1f, 0x00098091, 0x032a6328, 0x01a30f8a, 0x02713036, 0x032ff079, 0x002098b3}}, Y: Field{[10]uint32{0x03ac376a, 0x03fe363e, 0x0047835c, 0x00ccac53, 0x0057b6ed, 0x016cd3cd, 0x03ee22ec, 0x0279399b, 0x01e20910, 0x0020ff65}}}, + {X: Field{[10]uint32{0x0285131f, 0x02406cb8, 0x03088d5b, 0x0337204e, 0x00aaec6e, 0x01ab5890, 0x024a18f6, 0x02f5df59, 0x03b8e23c, 0x000907fa}}, Y: Field{[10]uint32{0x0350026d, 0x00f99bc9, 0x035afabb, 0x003ef432, 0x00cd50fd, 0x00e6077e, 0x00420bd1, 0x03e34f5b, 0x00d9ff94, 0x00144cde}}}, + {X: Field{[10]uint32{0x026bdb6f, 0x00b922c0, 0x00b94905, 0x0351edcd, 0x037ca41b, 0x033a6721, 0x00105b24, 0x0377545a, 0x008b1da0, 0x00066097}}, Y: Field{[10]uint32{0x009cfc9b, 0x03dc2131, 0x013a6b5d, 0x033233db, 0x00ebe9ee, 0x013d67db, 0x00261cc9, 0x021e3cc8, 0x010f0d4c, 0x0018a50c}}}, + {X: Field{[10]uint32{0x0070620c, 0x03307c9f, 0x008d9d17, 0x02faaf0a, 0x004998c4, 0x02d9c5e0, 0x00dd31a2, 0x008db718, 0x00a48d2c, 0x000594ea}}, Y: Field{[10]uint32{0x015b32cd, 0x00ba074c, 0x01c526ca, 0x01237f4f, 0x00012af7, 0x03be9c07, 0x03a99474, 0x01fdebab, 0x010935af, 0x0000ce0a}}}, + {X: Field{[10]uint32{0x0182824c, 0x0342548f, 0x034e650e, 0x00d17854, 0x02dfa58e, 0x01b0a667, 0x005f56ec, 0x0064510f, 0x006c1160, 0x001bc4b6}}, Y: Field{[10]uint32{0x02eb34d0, 0x0270d201, 0x03c5b857, 0x01042152, 0x01391c92, 0x03588dda, 0x01994f3f, 0x02fe821d, 0x03f44ab3, 0x001713fd}}}, + {X: Field{[10]uint32{0x03920471, 0x02d8c1a6, 0x01e0dedc, 0x0217d08f, 0x01fc318b, 0x00f63e36, 0x024cc298, 0x03e9e7f3, 0x034ea172, 0x001746f6}}, Y: Field{[10]uint32{0x03b83103, 0x00c199bd, 0x02e7b703, 0x02665b15, 0x0279eb1e, 0x02288995, 0x00bb9943, 0x0278b9e5, 0x02677937, 0x000a10e0}}}, + {X: Field{[10]uint32{0x03453629, 0x037700b6, 0x02603076, 0x03703d67, 0x0245cfdc, 0x008eafbd, 0x0262716a, 0x02a97450, 0x006f9a0a, 0x00080ea3}}, Y: Field{[10]uint32{0x03f89f84, 0x0071e14f, 0x01ed4597, 0x009714a1, 0x02686deb, 0x03d04184, 0x00c76d15, 0x0366e4db, 0x0353de5d, 0x000ec3c2}}}, + {X: Field{[10]uint32{0x0147f3d6, 0x011955ec, 0x00b45b94, 0x0085eae3, 0x03553199, 0x01195440, 0x026a3632, 0x02c78467, 0x0332c294, 0x0011d291}}, Y: Field{[10]uint32{0x00628ba4, 0x03a14a0a, 0x01300dce, 0x005c0438, 0x0311fa7f, 0x00e922a8, 0x02cc30cc, 0x03c13bb4, 0x02231206, 0x00251897}}}, + {X: Field{[10]uint32{0x006c7ecb, 0x004c3779, 0x00ce9783, 0x00ff96ed, 0x009d3aed, 0x0219b87b, 0x01ef7334, 0x01060720, 0x02eb3d03, 0x001b8ab2}}, Y: Field{[10]uint32{0x02bc8720, 0x024807bb, 0x0112c844, 0x02e46d9d, 0x02fac706, 0x003ed90e, 0x000c4daf, 0x03b85276, 0x006797ef, 0x00279869}}}, + {X: Field{[10]uint32{0x031dabcd, 0x010ae9b9, 0x00b4f47d, 0x01262797, 0x0354d3fe, 0x002d4dcf, 0x018ae326, 0x03d0f182, 0x00fb6b63, 0x003527b9}}, Y: Field{[10]uint32{0x016603c2, 0x02a433c0, 0x03031e66, 0x024c4bfd, 0x02129c50, 0x0186fcd5, 0x0087ea7a, 0x0124375f, 0x039209a5, 0x00014c78}}}, + {X: Field{[10]uint32{0x00a4147e, 0x00063cfc, 0x03201eb7, 0x022fddd7, 0x002747dd, 0x02924296, 0x021717e8, 0x0055aebd, 0x0092e9e9, 0x003569c1}}, Y: Field{[10]uint32{0x03fb65ff, 0x02cf2e0c, 0x0357f8e4, 0x0211e59f, 0x02f4c4d9, 0x0197814c, 0x00909907, 0x02271bf1, 0x02f5dbab, 0x00276d49}}}, + {X: Field{[10]uint32{0x003841c6, 0x02a3da2d, 0x02fbd63d, 0x03034d0f, 0x0212aa3c, 0x033afd30, 0x03b6b52d, 0x00226526, 0x009e03df, 0x001b3044}}, Y: Field{[10]uint32{0x0154e94d, 0x00ce91ae, 0x02cf5b97, 0x00f8b641, 0x00d79b43, 0x028a7ffb, 0x03d3d6b0, 0x012dd83f, 0x02fe9c09, 0x002bd586}}}, + {X: Field{[10]uint32{0x00edcec6, 0x036d1af6, 0x00f454ed, 0x030b4d8d, 0x02a1061c, 0x000b36b1, 0x023efc63, 0x022ea014, 0x019aabe1, 0x000e3144}}, Y: Field{[10]uint32{0x0133db08, 0x0382fec6, 0x030a6456, 0x0208ad54, 0x0328a16c, 0x01d7ca0b, 0x00cb2da2, 0x01cca99a, 0x012285d9, 0x00399277}}}, + {X: Field{[10]uint32{0x01e5b739, 0x03396d54, 0x022ed73f, 0x00cff488, 0x01e0b938, 0x01bf211b, 0x0399cc6c, 0x021969cb, 0x019f728b, 0x0005d785}}, Y: Field{[10]uint32{0x01fed695, 0x029bffba, 0x0345c6ef, 0x016b7490, 0x02acb595, 0x03fdc7d7, 0x02f97a51, 0x01e7ae93, 0x020d9e3c, 0x0034d41b}}}, + }, + { + {X: Field{[10]uint32{0x01e5b739, 0x03396d54, 0x022ed73f, 0x00cff488, 0x01e0b938, 0x01bf211b, 0x0399cc6c, 0x021969cb, 0x019f728b, 0x0005d785}}, Y: Field{[10]uint32{0x01fed695, 0x029bffba, 0x0345c6ef, 0x016b7490, 0x02acb595, 0x03fdc7d7, 0x02f97a51, 0x01e7ae93, 0x020d9e3c, 0x0034d41b}}}, + {X: Field{[10]uint32{0x02bc47d6, 0x02012791, 0x0121bce7, 0x02d71b68, 0x0130fdfe, 0x004e7188, 0x03fbcc8e, 0x00cb5e97, 0x013f03ff, 0x00108e80}}, Y: Field{[10]uint32{0x03548a34, 0x00db9b62, 0x0009ed12, 0x030d493c, 0x03720d8e, 0x02bdacf1, 0x0179f7bb, 0x0365c284, 0x000fe1e1, 0x002e46b8}}}, + {X: Field{[10]uint32{0x01041216, 0x01fe3c71, 0x0036a65b, 0x03da10ae, 0x023f7335, 0x030bfb54, 0x00b59efd, 0x02b3d04a, 0x017b21f7, 0x00369d4c}}, Y: Field{[10]uint32{0x02708572, 0x034ca61b, 0x00edadae, 0x01eb9deb, 0x02e9aac0, 0x010b5ff1, 0x019e21b3, 0x0357c37c, 0x0046bf72, 0x001cfe28}}}, + {X: Field{[10]uint32{0x0016824a, 0x037dbde1, 0x02741302, 0x00bcecf8, 0x0249df66, 0x0335a1dd, 0x0107a7ab, 0x02e41422, 0x0245ac1f, 0x0004475a}}, Y: Field{[10]uint32{0x0108e9d0, 0x00447508, 0x00a4ca9a, 0x02265b6b, 0x02f07000, 0x03c19654, 0x00d48dbf, 0x02bfeee4, 0x011c478e, 0x0001a5a4}}}, + {X: Field{[10]uint32{0x0065a930, 0x010f9c79, 0x012fdb01, 0x0305ac4d, 0x022587f1, 0x02a0bac7, 0x033c58c4, 0x01275c15, 0x01b48e97, 0x00071c71}}, Y: Field{[10]uint32{0x034638b5, 0x01cfdb30, 0x00d471d8, 0x00fedc5d, 0x0079345e, 0x0092eda3, 0x013f1f28, 0x03e8309c, 0x0334e8f5, 0x0012a470}}}, + {X: Field{[10]uint32{0x0062bac0, 0x014c93cf, 0x02b06950, 0x037d47c2, 0x0219150d, 0x00fa2dc3, 0x024b7d2c, 0x011a704d, 0x00f9023f, 0x00254c3c}}, Y: Field{[10]uint32{0x0218e309, 0x02af6a5d, 0x01c68478, 0x0214bc7f, 0x00e25b32, 0x026cccf8, 0x01d2f7f5, 0x008788d3, 0x005a8f9f, 0x0023cf0c}}}, + {X: Field{[10]uint32{0x02db6ee7, 0x0236b96e, 0x02077e31, 0x010c9d12, 0x007850dd, 0x0026d327, 0x02e837a9, 0x02959a4d, 0x02fc1f31, 0x00361392}}, Y: Field{[10]uint32{0x002ebed2, 0x0155b9b5, 0x0264982d, 0x025d2a8f, 0x01fdd8ac, 0x01597793, 0x0238d58f, 0x01e7384a, 0x009a7c7b, 0x00394960}}}, + {X: Field{[10]uint32{0x03ced775, 0x03b77806, 0x00e56ab5, 0x02297bdd, 0x037290b6, 0x032e773f, 0x0395dbeb, 0x0322e2b5, 0x01c97ac7, 0x0012929b}}, Y: Field{[10]uint32{0x038dd66d, 0x03e3da29, 0x002acb2b, 0x036d091d, 0x031de90c, 0x02703d15, 0x03ef9f73, 0x0079ca50, 0x01b01663, 0x0014a644}}}, + {X: Field{[10]uint32{0x009e6d10, 0x03a7b3e9, 0x019d2394, 0x03cebab2, 0x03f60adf, 0x017fdbb4, 0x0322b928, 0x02053506, 0x004bde66, 0x003cf511}}, Y: Field{[10]uint32{0x0347da3f, 0x00e33014, 0x02c630a0, 0x01433a75, 0x03fc1ada, 0x026292d6, 0x02b95ac1, 0x0058f52e, 0x00dfa6f0, 0x000290c9}}}, + {X: Field{[10]uint32{0x0147b4b3, 0x0246dde9, 0x01411f5e, 0x0347f599, 0x00356929, 0x0026548b, 0x0382efee, 0x013dd477, 0x002f1d8e, 0x003c01b1}}, Y: Field{[10]uint32{0x006aa74b, 0x03d127ea, 0x03ae1b5e, 0x03bb5af9, 0x0275c933, 0x0393df45, 0x007848a4, 0x01482971, 0x00d4a666, 0x003da055}}}, + {X: Field{[10]uint32{0x01d33a07, 0x02cd01ba, 0x03cab48c, 0x0022a8e6, 0x004e72ee, 0x036f7d01, 0x0085520c, 0x007627e4, 0x012c9d9c, 0x002b8c19}}, Y: Field{[10]uint32{0x00a0b2a6, 0x01c303d8, 0x0295c748, 0x03d77f5f, 0x031c9c37, 0x036e3573, 0x00ce7d33, 0x03f95fbf, 0x01c38d63, 0x001b2e76}}}, + {X: Field{[10]uint32{0x003c9c8f, 0x0010e177, 0x027b2067, 0x03b8f90d, 0x00f2816f, 0x02a8ccac, 0x009ff43a, 0x0263f5bc, 0x02dcbe42, 0x0019ef80}}, Y: Field{[10]uint32{0x013652d9, 0x02126616, 0x002be553, 0x03d82e23, 0x03cd993b, 0x020a45a4, 0x00945b60, 0x03be128b, 0x01a73e4d, 0x001ea6d5}}}, + {X: Field{[10]uint32{0x0028caca, 0x01952e43, 0x001da759, 0x02ef320a, 0x021869c7, 0x00ce2326, 0x0217e758, 0x03872057, 0x032a5bd5, 0x00363706}}, Y: Field{[10]uint32{0x03b3ec7a, 0x019dba88, 0x028f6cdb, 0x00b3b204, 0x007d315d, 0x00091f65, 0x02d8da42, 0x031f5631, 0x02d927ce, 0x00233b02}}}, + {X: Field{[10]uint32{0x018b01b5, 0x00be5d14, 0x03adac5c, 0x022e1c42, 0x01ddccc8, 0x0149016c, 0x0250c453, 0x03a21706, 0x0346403d, 0x00039a6c}}, Y: Field{[10]uint32{0x00d965c5, 0x03b8da1e, 0x0283e418, 0x017cf401, 0x03cedf59, 0x01f5f74d, 0x01ed70ab, 0x03914987, 0x02c5fcd7, 0x0002d3be}}}, + {X: Field{[10]uint32{0x03c4416f, 0x007ed98e, 0x00402892, 0x008fcc2c, 0x01a7aefd, 0x000cbcc7, 0x01425a8d, 0x013b3356, 0x0292c5f8, 0x0009d278}}, Y: Field{[10]uint32{0x006bbd8e, 0x022f78bf, 0x021057e9, 0x02d97ba5, 0x02f59e9f, 0x03f2b6cf, 0x03d94990, 0x00af1100, 0x014e3767, 0x0014330b}}}, + {X: Field{[10]uint32{0x03ff4640, 0x02eb63e0, 0x02ffe526, 0x01f95554, 0x0053441c, 0x01898bb8, 0x00eac05b, 0x00327267, 0x00d447b0, 0x000d8f64}}, Y: Field{[10]uint32{0x03ee9de9, 0x000f1fce, 0x01ecb620, 0x02402066, 0x0145b9a8, 0x01fccd8c, 0x03b44539, 0x00888654, 0x03adfc73, 0x0001389c}}}, + }, + { + {X: Field{[10]uint32{0x03ff4640, 0x02eb63e0, 0x02ffe526, 0x01f95554, 0x0053441c, 0x01898bb8, 0x00eac05b, 0x00327267, 0x00d447b0, 0x000d8f64}}, Y: Field{[10]uint32{0x03ee9de9, 0x000f1fce, 0x01ecb620, 0x02402066, 0x0145b9a8, 0x01fccd8c, 0x03b44539, 0x00888654, 0x03adfc73, 0x0001389c}}}, + {X: Field{[10]uint32{0x0392c541, 0x004a972b, 0x0359dd27, 0x0004bb7e, 0x030b62fb, 0x024ec0af, 0x03973c6c, 0x01fa6d54, 0x0066ed9a, 0x001306e6}}, Y: Field{[10]uint32{0x028fe020, 0x013cff71, 0x031ad72c, 0x035f90fa, 0x00c652ea, 0x0395b9a7, 0x03cb753c, 0x02283dfe, 0x02d320be, 0x00307de4}}}, + {X: Field{[10]uint32{0x02e55dc8, 0x024485bd, 0x004394b8, 0x02dbab28, 0x026ff95a, 0x00142510, 0x004a440c, 0x03fecaea, 0x004790c5, 0x00110c50}}, Y: Field{[10]uint32{0x03e323b3, 0x02512bb6, 0x02e5031d, 0x02de7aa8, 0x03a66a29, 0x0190bfb5, 0x019837f5, 0x019be3fa, 0x0142e653, 0x0025ac30}}}, + {X: Field{[10]uint32{0x02aaf3d1, 0x023ca32f, 0x03135e0c, 0x02f068a3, 0x023233ed, 0x01e02d53, 0x01a2f3c0, 0x02c4ad4a, 0x0077ba83, 0x0029020e}}, Y: Field{[10]uint32{0x00b254b9, 0x02d4d37c, 0x02f90b12, 0x015dbb47, 0x022001e7, 0x00d86cf8, 0x03f83d69, 0x02f1e6e2, 0x0212feef, 0x00103a7d}}}, + {X: Field{[10]uint32{0x001b23a8, 0x0252175c, 0x02e0adfe, 0x011c2a1f, 0x01ab7b7d, 0x02484227, 0x02243d5b, 0x02a1f049, 0x028d866c, 0x002788bf}}, Y: Field{[10]uint32{0x0084edae, 0x0104f142, 0x01cecf7a, 0x0127ed44, 0x03c0f7c9, 0x0267054c, 0x03f3f020, 0x00b4405d, 0x00e9ca12, 0x003f4bfc}}}, + {X: Field{[10]uint32{0x03f0e9aa, 0x0178658c, 0x0134b3eb, 0x01dac46f, 0x02681127, 0x01604e34, 0x0124ae0d, 0x009ab6de, 0x03e8575f, 0x00394e03}}, Y: Field{[10]uint32{0x0082720f, 0x02904d90, 0x0318ec4b, 0x0177d1a0, 0x016fb94e, 0x00932380, 0x02913639, 0x02d0756d, 0x00739087, 0x002e5ff6}}}, + {X: Field{[10]uint32{0x031a70e4, 0x01022fc1, 0x03475dd7, 0x007d7d73, 0x01cd5ee5, 0x01c14c1b, 0x01d69e64, 0x00aa34bb, 0x02d503ce, 0x0014237d}}, Y: Field{[10]uint32{0x01950984, 0x0396fdca, 0x02dfedf2, 0x00a3ba2a, 0x014ec032, 0x00cf9271, 0x03304aa7, 0x0310b5dd, 0x039b933b, 0x00055310}}}, + {X: Field{[10]uint32{0x0140d33a, 0x00f6d69e, 0x003b98cd, 0x00291508, 0x036e0d88, 0x03d5b21b, 0x00e3e1a2, 0x0302d4e9, 0x0241d28c, 0x002a0131}}, Y: Field{[10]uint32{0x0146967a, 0x03a57e9b, 0x036a943c, 0x02a273dc, 0x001af18c, 0x005811fa, 0x02c2842c, 0x029b40f7, 0x03252b2f, 0x00256fa0}}}, + {X: Field{[10]uint32{0x021abe11, 0x03f69db3, 0x0220f6ea, 0x0309672c, 0x02dab921, 0x00c0496c, 0x00df5819, 0x025d8cce, 0x03845510, 0x0038f6ff}}, Y: Field{[10]uint32{0x03a8de63, 0x026b5527, 0x01c414b4, 0x0240f1ad, 0x03d3c97d, 0x02e2a3bc, 0x038fa75d, 0x00508590, 0x01099a34, 0x0001bcbe}}}, + {X: Field{[10]uint32{0x023968b6, 0x00a4de2d, 0x03ab2e69, 0x0197b678, 0x02f40261, 0x0224224e, 0x005a9600, 0x01e7ed0f, 0x023dfc65, 0x003de92f}}, Y: Field{[10]uint32{0x00c34882, 0x03768cb4, 0x0105e494, 0x02e34440, 0x0299702f, 0x023294b4, 0x01290303, 0x03185487, 0x036ce823, 0x0035b77b}}}, + {X: Field{[10]uint32{0x03593449, 0x006c8d80, 0x006ffdcf, 0x004b90a9, 0x02f61b7c, 0x001f4052, 0x00d9c13a, 0x0250361e, 0x0064c7de, 0x00066b38}}, Y: Field{[10]uint32{0x01f83631, 0x0052e4eb, 0x0068a3a4, 0x027d0210, 0x02ac710b, 0x02500b11, 0x02bd739d, 0x028cceff, 0x02035268, 0x0038de64}}}, + {X: Field{[10]uint32{0x02bc61d6, 0x034d86fb, 0x002de1ae, 0x029f67fd, 0x018a8fd3, 0x035ac7d4, 0x015f0d15, 0x026bc30e, 0x03e4a3ed, 0x0024e7fc}}, Y: Field{[10]uint32{0x03f5cb70, 0x03a919a8, 0x03f82e75, 0x01bade31, 0x00980bf2, 0x03c05b01, 0x006fc4ee, 0x02a43a75, 0x03cf08b7, 0x0037aace}}}, + {X: Field{[10]uint32{0x00ba6b63, 0x03a624b3, 0x03bb5ee3, 0x01d3f42c, 0x010a0fe6, 0x03aa238c, 0x00c33228, 0x01f6a842, 0x00ec20f8, 0x00361d03}}, Y: Field{[10]uint32{0x0134c5f3, 0x028db01a, 0x0294abee, 0x01730e05, 0x0140104f, 0x000eb0df, 0x00a6ee99, 0x00cafcde, 0x0133c6b9, 0x00191cb0}}}, + {X: Field{[10]uint32{0x028ff2cf, 0x03b5ba22, 0x02094a34, 0x0171ec18, 0x0038ea75, 0x00901469, 0x03a98dba, 0x02b8c1e5, 0x025f1c4c, 0x000066a7}}, Y: Field{[10]uint32{0x030e4352, 0x01f9d9b6, 0x02d353a7, 0x03ba2121, 0x000ce7eb, 0x0004adcc, 0x01062925, 0x02bd7bea, 0x0067ea85, 0x00079987}}}, + {X: Field{[10]uint32{0x033ec038, 0x013fcb06, 0x02b27619, 0x01ab9831, 0x00d9fd51, 0x03ca4294, 0x0083e762, 0x01820d92, 0x03391b50, 0x00162b0c}}, Y: Field{[10]uint32{0x00246279, 0x02a8fc44, 0x03bca16e, 0x00f02d3e, 0x03021904, 0x02647fa5, 0x0379249e, 0x024b65e1, 0x0306d55c, 0x002458f5}}}, + {X: Field{[10]uint32{0x03fdf80c, 0x01e69577, 0x00d1b69f, 0x0206856f, 0x0043e4a7, 0x01d158e2, 0x02244b5b, 0x030afa31, 0x03165df3, 0x0022d2d7}}, Y: Field{[10]uint32{0x03d4fd36, 0x03fc3197, 0x02e56b3e, 0x0151858b, 0x00f9e336, 0x02ac3681, 0x03bd7813, 0x0022d2cf, 0x026f68d3, 0x0012ab42}}}, + }, + { + {X: Field{[10]uint32{0x03fdf80c, 0x01e69577, 0x00d1b69f, 0x0206856f, 0x0043e4a7, 0x01d158e2, 0x02244b5b, 0x030afa31, 0x03165df3, 0x0022d2d7}}, Y: Field{[10]uint32{0x03d4fd36, 0x03fc3197, 0x02e56b3e, 0x0151858b, 0x00f9e336, 0x02ac3681, 0x03bd7813, 0x0022d2cf, 0x026f68d3, 0x0012ab42}}}, + {X: Field{[10]uint32{0x0355e4be, 0x03c99c51, 0x0197abb3, 0x03b905f2, 0x0071af64, 0x020f1844, 0x0217c7ec, 0x0245c633, 0x00e4e132, 0x003b4317}}, Y: Field{[10]uint32{0x007bf42f, 0x027e9ba8, 0x01ab163f, 0x0095d8f7, 0x0049d939, 0x029fa9a0, 0x03dad7f5, 0x0116f6fc, 0x03c7bc23, 0x000886a7}}}, + {X: Field{[10]uint32{0x015812dd, 0x00a960bd, 0x030e2a0a, 0x008d54b4, 0x023d4467, 0x00163de3, 0x02abed6c, 0x00d4bc2d, 0x017a92ff, 0x001c0a6f}}, Y: Field{[10]uint32{0x022d2927, 0x03319ac6, 0x0073c721, 0x01090ecb, 0x0047dae8, 0x00c1a0eb, 0x016544ae, 0x02cf49f7, 0x02dafde8, 0x002c3bbe}}}, + {X: Field{[10]uint32{0x03cec8ab, 0x01b9b201, 0x012ced4b, 0x0159b815, 0x00e53254, 0x00fc7eba, 0x0315c3f8, 0x039a52ce, 0x0013c44c, 0x003ebb2c}}, Y: Field{[10]uint32{0x03155070, 0x0077f66a, 0x02e2e898, 0x021ae178, 0x019c32b2, 0x030bec4f, 0x02e02c6e, 0x032d5ff0, 0x01e90e9e, 0x0033026d}}}, + {X: Field{[10]uint32{0x01486ed1, 0x0395a0ef, 0x01b6a49c, 0x02e92559, 0x005745be, 0x0233dd58, 0x01d4109d, 0x01726402, 0x01caeae6, 0x002733fb}}, Y: Field{[10]uint32{0x01e95d8d, 0x03567b5d, 0x02aa24f6, 0x0165a564, 0x01242167, 0x0002cd04, 0x01224812, 0x00cb3ed8, 0x01713d6a, 0x001f0bd3}}}, + {X: Field{[10]uint32{0x0181fdc2, 0x02affe6c, 0x02364dcd, 0x02ed7318, 0x02dd2f62, 0x0228d39f, 0x02264b81, 0x01b91d2a, 0x002af47e, 0x003d0b04}}, Y: Field{[10]uint32{0x0085d7fd, 0x000024e9, 0x00f2681f, 0x00b668ab, 0x024c1550, 0x021bf88a, 0x03ad05cb, 0x0201b1e3, 0x02b46cfe, 0x0015d40e}}}, + {X: Field{[10]uint32{0x03d0eaca, 0x01ac69d6, 0x00ab7a20, 0x01dae8b5, 0x01d0c745, 0x032937c6, 0x028fde33, 0x01050cd6, 0x03876341, 0x00336692}}, Y: Field{[10]uint32{0x03ff4acc, 0x03ebed6a, 0x0234f6e6, 0x023bb5bd, 0x030127b3, 0x00cfa822, 0x01488ae9, 0x03c8fa05, 0x0079a1e8, 0x003c1156}}}, + {X: Field{[10]uint32{0x02d1b1f7, 0x0193aba6, 0x00d3e07f, 0x02093c8f, 0x01b3b2dd, 0x01f2f2bf, 0x0331a0b3, 0x034bcb21, 0x02132dca, 0x00026ee2}}, Y: Field{[10]uint32{0x03811c80, 0x00c189f0, 0x02d53641, 0x0103d1d4, 0x010f54a8, 0x03e18fa1, 0x039dd284, 0x038ee6db, 0x02b2afee, 0x002516ec}}}, + {X: Field{[10]uint32{0x03bc57c6, 0x0254e8f1, 0x036cbf20, 0x0288fac9, 0x004903d7, 0x00f58c25, 0x00f2d2e9, 0x026faa21, 0x002f88ed, 0x002b4262}}, Y: Field{[10]uint32{0x024a0ab8, 0x00b03b6b, 0x022d3ca3, 0x00dcd643, 0x037b311d, 0x0276af97, 0x00186c72, 0x0294ae8a, 0x008c42fb, 0x001c90f0}}}, + {X: Field{[10]uint32{0x03927dc7, 0x036ad913, 0x018a49e2, 0x00358f50, 0x0337a7a4, 0x019a8508, 0x029ed953, 0x029aef99, 0x00cc082b, 0x00389828}}, Y: Field{[10]uint32{0x02aef35d, 0x03cdbd11, 0x0382da45, 0x02d118b2, 0x00edbcc0, 0x0096fd10, 0x033cb3d7, 0x02759fc1, 0x0344b0da, 0x000dfb99}}}, + {X: Field{[10]uint32{0x03a56302, 0x00c31caa, 0x01862ea8, 0x00debc3c, 0x00f506a9, 0x027eb4b8, 0x02da2d2a, 0x02907c7a, 0x010aeb3c, 0x0036744a}}, Y: Field{[10]uint32{0x00291c29, 0x0376bea2, 0x00f2aeaa, 0x03367e9d, 0x001739ae, 0x0098e1b9, 0x01715c67, 0x00fbb40a, 0x0113ec2d, 0x001fad4c}}}, + {X: Field{[10]uint32{0x02dd7dd6, 0x01b51f7b, 0x0168c386, 0x03899786, 0x0049376f, 0x039f3f7b, 0x01a7840e, 0x01492f29, 0x036a24c7, 0x000cb3f3}}, Y: Field{[10]uint32{0x0208e330, 0x03512bbf, 0x0208b25f, 0x03480d26, 0x027a0d8c, 0x0027d587, 0x008096a4, 0x01dd2188, 0x0234976a, 0x0008611a}}}, + {X: Field{[10]uint32{0x00d1243a, 0x034dc13d, 0x025fdbac, 0x0008fd52, 0x0002b126, 0x018fd561, 0x00d21ac0, 0x01b3be47, 0x01de539d, 0x002f141e}}, Y: Field{[10]uint32{0x015db68a, 0x02545a21, 0x03169f5c, 0x03d6c7d1, 0x035f7ee4, 0x037ff235, 0x02c72b94, 0x0172ee3b, 0x023b3a70, 0x0019418a}}}, + {X: Field{[10]uint32{0x02abf83d, 0x0340ff7d, 0x00596696, 0x0163ecb4, 0x02b8f940, 0x00348b00, 0x00be68f1, 0x03127cfb, 0x02dde85a, 0x0008d72a}}, Y: Field{[10]uint32{0x0133e191, 0x03b27a43, 0x010ae7f4, 0x0358c8d8, 0x013f0518, 0x0324eb62, 0x00232a5b, 0x011fafb9, 0x01c745fd, 0x003704be}}}, + {X: Field{[10]uint32{0x034a3f9f, 0x009139ad, 0x0016908d, 0x01977026, 0x02c287a6, 0x036c9896, 0x03deaae7, 0x031fa244, 0x037e505f, 0x00134c69}}, Y: Field{[10]uint32{0x001e0ba7, 0x02c0904c, 0x00a754fc, 0x0146db80, 0x03cbf6fb, 0x01e009d4, 0x0318f38c, 0x015d6c1a, 0x02c96098, 0x00088907}}}, + {X: Field{[10]uint32{0x0232fcda, 0x00456494, 0x0277bcb6, 0x03fe9b03, 0x03b700db, 0x02f55231, 0x03771c00, 0x0265b5af, 0x02a6e5db, 0x001c8f2e}}, Y: Field{[10]uint32{0x02b39f5f, 0x0301a767, 0x0094801d, 0x0194dde5, 0x022660a0, 0x0220935b, 0x02113748, 0x031262a4, 0x03b5595c, 0x0025ba19}}}, + }, + { + {X: Field{[10]uint32{0x0232fcda, 0x00456494, 0x0277bcb6, 0x03fe9b03, 0x03b700db, 0x02f55231, 0x03771c00, 0x0265b5af, 0x02a6e5db, 0x001c8f2e}}, Y: Field{[10]uint32{0x02b39f5f, 0x0301a767, 0x0094801d, 0x0194dde5, 0x022660a0, 0x0220935b, 0x02113748, 0x031262a4, 0x03b5595c, 0x0025ba19}}}, + {X: Field{[10]uint32{0x00a030d5, 0x00e0f583, 0x009071fd, 0x010c1e61, 0x022d240a, 0x01dce8f1, 0x03d7dc45, 0x01d134d0, 0x0386437b, 0x0015fbe9}}, Y: Field{[10]uint32{0x00b02f9e, 0x02ad109d, 0x0174ab07, 0x00ab97a6, 0x00689b6d, 0x023780fb, 0x03627c92, 0x02146224, 0x030bd1b4, 0x0035c4b6}}}, + {X: Field{[10]uint32{0x00633cb1, 0x01f827a0, 0x02113256, 0x012da740, 0x03575a22, 0x008607f2, 0x00627321, 0x032b5003, 0x00f317aa, 0x001b77a7}}, Y: Field{[10]uint32{0x03ce6b34, 0x03526a99, 0x01ef357d, 0x036b3e16, 0x0080b27f, 0x006e99aa, 0x019ef86a, 0x03907572, 0x03e7a707, 0x0024623e}}}, + {X: Field{[10]uint32{0x00584dd5, 0x03f1ddc3, 0x0012a7fa, 0x01f8c9ec, 0x01108057, 0x01489b2e, 0x01f7e9cd, 0x02f10a8b, 0x01436a28, 0x000992ef}}, Y: Field{[10]uint32{0x0304ab11, 0x0089e4dd, 0x00d8de61, 0x010dc5ee, 0x026a1182, 0x030cef88, 0x0375ce24, 0x024ed353, 0x03a94ee0, 0x00361f1b}}}, + {X: Field{[10]uint32{0x0133f3c5, 0x0294634a, 0x02522419, 0x01c457c4, 0x00085a0f, 0x0391ee14, 0x004bb7f8, 0x0337a04f, 0x032cd5b5, 0x00121be9}}, Y: Field{[10]uint32{0x02fb0f53, 0x0129c6b2, 0x023b79ad, 0x020f3c3c, 0x0362d9b7, 0x03323c67, 0x00c48bae, 0x03750f92, 0x0319f56b, 0x0018b848}}}, + {X: Field{[10]uint32{0x00e5467d, 0x02f5da91, 0x03ace4d0, 0x02e066ef, 0x0140908a, 0x03b25c3a, 0x021f62e0, 0x028488b0, 0x00f0fc69, 0x0025f419}}, Y: Field{[10]uint32{0x029cb3fa, 0x00c03f47, 0x03ccd797, 0x02e153c5, 0x03da5fb3, 0x02142187, 0x037c66fa, 0x000b300f, 0x032ed334, 0x002265d3}}}, + {X: Field{[10]uint32{0x0299f728, 0x01650897, 0x02204ebd, 0x03ef9bc4, 0x03677375, 0x01da94c0, 0x024ff27b, 0x02bd3ed9, 0x0174a894, 0x00091e5a}}, Y: Field{[10]uint32{0x03aaebff, 0x000145ba, 0x022d837a, 0x030255d6, 0x025adbf3, 0x03635992, 0x012e87e7, 0x00c007b1, 0x0144688f, 0x0038f5e3}}}, + {X: Field{[10]uint32{0x032438e8, 0x009af612, 0x02c9d2bf, 0x007f56f7, 0x01a78bc6, 0x008da9e7, 0x0085c056, 0x034aef6b, 0x0124bd40, 0x002a5319}}, Y: Field{[10]uint32{0x018661f4, 0x00b236fc, 0x01b2bc2e, 0x0182838e, 0x027e5d3c, 0x0140678e, 0x03921950, 0x018a03f5, 0x03d992f9, 0x002d4807}}}, + {X: Field{[10]uint32{0x03b0079a, 0x0031b50b, 0x02049c9e, 0x03dc8e49, 0x00916f9e, 0x01ace0c9, 0x01a59ee7, 0x017fc18c, 0x03daa3d5, 0x000bce72}}, Y: Field{[10]uint32{0x005690ba, 0x00a5cc0b, 0x00230fe2, 0x02f220a8, 0x039bfb3f, 0x01e36962, 0x02936d02, 0x00e60d36, 0x03de1386, 0x002afab6}}}, + {X: Field{[10]uint32{0x018086c8, 0x01bca26e, 0x023ff5f4, 0x00d2d899, 0x0040c10e, 0x02aa39bf, 0x01263b70, 0x00af74a2, 0x025baa80, 0x000fa10b}}, Y: Field{[10]uint32{0x02e939a9, 0x012d44e3, 0x03d4ef99, 0x01dadd79, 0x0037b8e5, 0x006c1df0, 0x01370463, 0x039cb86e, 0x03f5fc92, 0x00227c93}}}, + {X: Field{[10]uint32{0x00f7ab73, 0x00c02cb9, 0x003a7793, 0x03aa7511, 0x0262e3d4, 0x014d2bb4, 0x0239e86c, 0x0186e95a, 0x016c327d, 0x003968c7}}, Y: Field{[10]uint32{0x00561f42, 0x00e8ff1c, 0x03a21391, 0x0126a032, 0x01bf8c44, 0x0293b397, 0x0118a977, 0x0275e830, 0x003d8d1e, 0x000dde23}}}, + {X: Field{[10]uint32{0x03613bec, 0x02072e44, 0x03e67cca, 0x02744073, 0x028bb5fc, 0x01d3e5ca, 0x031b33dc, 0x00def7b7, 0x02b8c939, 0x000b73f2}}, Y: Field{[10]uint32{0x02039215, 0x00c24926, 0x01f383e7, 0x02eb4cfd, 0x003732cf, 0x01bdb1bd, 0x03088b7d, 0x02904997, 0x00dd9474, 0x0011b6f1}}}, + {X: Field{[10]uint32{0x014dcd86, 0x024a68f0, 0x031b588f, 0x00825afd, 0x011fc5d4, 0x0014773c, 0x010dd982, 0x00d11f7d, 0x014a0d15, 0x00330e27}}, Y: Field{[10]uint32{0x00f0a873, 0x02db7672, 0x0387468e, 0x0063f9f9, 0x0205c57e, 0x03aa4432, 0x0168bdbb, 0x02efb66d, 0x03d660f6, 0x0024eb93}}}, + {X: Field{[10]uint32{0x03b4f6be, 0x00f5d937, 0x02b64844, 0x03fd3e8f, 0x02b567d5, 0x023c3a2d, 0x004bb042, 0x0208a23b, 0x03d1ae75, 0x0028ab94}}, Y: Field{[10]uint32{0x02eeb9a2, 0x008959d2, 0x00436c04, 0x019f0f50, 0x004c0efa, 0x0306d51f, 0x015679c7, 0x028261f2, 0x014d44b3, 0x001a4cd6}}}, + {X: Field{[10]uint32{0x00819311, 0x0271bade, 0x0314724f, 0x0388421d, 0x030b3e1e, 0x033d7b47, 0x010a17e0, 0x03a408dd, 0x01c89d71, 0x001fe4a4}}, Y: Field{[10]uint32{0x002eb125, 0x03e6d5eb, 0x02174aa9, 0x0102721a, 0x02120aaa, 0x0149056d, 0x010de8c4, 0x00fbc3d7, 0x011063ec, 0x00276803}}}, + {X: Field{[10]uint32{0x027dd7fa, 0x00cfb283, 0x019839a5, 0x0048dea4, 0x01094796, 0x00b0b4ed, 0x01feec81, 0x02fe62e9, 0x00d493be, 0x003bafe9}}, Y: Field{[10]uint32{0x01de8999, 0x0353f6b8, 0x03712ddf, 0x030e9c47, 0x019ae4cd, 0x005e0227, 0x02e7edaf, 0x03c3c9a7, 0x00a3970e, 0x001766a3}}}, + }, + { + {X: Field{[10]uint32{0x027dd7fa, 0x00cfb283, 0x019839a5, 0x0048dea4, 0x01094796, 0x00b0b4ed, 0x01feec81, 0x02fe62e9, 0x00d493be, 0x003bafe9}}, Y: Field{[10]uint32{0x01de8999, 0x0353f6b8, 0x03712ddf, 0x030e9c47, 0x019ae4cd, 0x005e0227, 0x02e7edaf, 0x03c3c9a7, 0x00a3970e, 0x001766a3}}}, + {X: Field{[10]uint32{0x03d297fd, 0x03ba4211, 0x026d676b, 0x03023d9d, 0x03c4ea4b, 0x00461257, 0x01c6031c, 0x01eff698, 0x02d7a7a9, 0x000e0712}}, Y: Field{[10]uint32{0x01493fc5, 0x0338c61f, 0x01c0093a, 0x00cb6e4e, 0x00f04510, 0x026457b3, 0x03e5fa70, 0x03bb923c, 0x013b238e, 0x0024dabd}}}, + {X: Field{[10]uint32{0x037ceceb, 0x019e3fee, 0x03af0f3f, 0x024e225f, 0x0073a59f, 0x03db9a05, 0x03fb8126, 0x035140db, 0x02204276, 0x0010dea1}}, Y: Field{[10]uint32{0x02c181e1, 0x00ef30d5, 0x01782736, 0x033f723e, 0x0387220f, 0x0274a5ff, 0x038feb69, 0x030cbda6, 0x03a13eea, 0x0002e45a}}}, + {X: Field{[10]uint32{0x02de454c, 0x035c108b, 0x008b2448, 0x017fbf74, 0x039cf1d0, 0x0254e311, 0x0210831d, 0x0318ef33, 0x01cd05ad, 0x00387bee}}, Y: Field{[10]uint32{0x00913797, 0x03f48cea, 0x014c6ad9, 0x01129e8b, 0x03464e32, 0x0391dc48, 0x0154c1ff, 0x026f9ec0, 0x0130d8af, 0x0003b2d1}}}, + {X: Field{[10]uint32{0x017f96f2, 0x035ca782, 0x0335cd58, 0x00a74b21, 0x03358235, 0x028f309c, 0x00b7e3b9, 0x0226f20f, 0x0313e2a4, 0x002a7be7}}, Y: Field{[10]uint32{0x02c04be4, 0x03556c15, 0x00702c03, 0x02bd6a6d, 0x01b74f89, 0x03aed84f, 0x016ee160, 0x0275f365, 0x00e59455, 0x003a0533}}}, + {X: Field{[10]uint32{0x00bf00eb, 0x036761f7, 0x002274c9, 0x022f0634, 0x0241b4e9, 0x0068c2f0, 0x03e16f6a, 0x03537126, 0x00ae96ea, 0x002e241c}}, Y: Field{[10]uint32{0x030e664e, 0x03c6f346, 0x02a671b7, 0x001adae5, 0x02cb0d8b, 0x007129d9, 0x02294e4c, 0x03623d1c, 0x00c2c8a2, 0x001bc932}}}, + {X: Field{[10]uint32{0x010cf77e, 0x02ad684d, 0x02b0dbc0, 0x01d152a2, 0x0207dbf5, 0x03ea8190, 0x03827d69, 0x00d6f954, 0x0141ee1d, 0x0019b601}}, Y: Field{[10]uint32{0x00eaa3a6, 0x03e5ebe8, 0x0376d2a5, 0x00eadec6, 0x029444b4, 0x00d584fd, 0x031d4205, 0x03ed0b0f, 0x03e732ff, 0x001473f7}}}, + {X: Field{[10]uint32{0x01eb99a4, 0x03fbacca, 0x03b18d33, 0x027ccf51, 0x00c7e541, 0x02bd1d6a, 0x02c235e9, 0x01c04316, 0x01b1a269, 0x0014c63e}}, Y: Field{[10]uint32{0x0291f92d, 0x009bbbbf, 0x02c652c7, 0x0103478f, 0x00a41f2b, 0x02ed017a, 0x032d93ae, 0x0290655d, 0x03eb4bed, 0x003d1333}}}, + {X: Field{[10]uint32{0x03213a5a, 0x01218a21, 0x0262b935, 0x0129e17e, 0x000b7320, 0x019330f2, 0x03508a1c, 0x00fe8afc, 0x01e13650, 0x0018ab01}}, Y: Field{[10]uint32{0x006a9e45, 0x0348703d, 0x014efc10, 0x000605e6, 0x01e55909, 0x01ea495e, 0x015e79e0, 0x029b934e, 0x01f3a0d1, 0x0008dbef}}}, + {X: Field{[10]uint32{0x03c76ac1, 0x0086cf3b, 0x02c05d6b, 0x02572908, 0x016124c3, 0x0354fa26, 0x021859a7, 0x00de10df, 0x03bfab10, 0x000623bc}}, Y: Field{[10]uint32{0x028f00bc, 0x0180ca94, 0x03875351, 0x03a0f1d8, 0x00e4d66d, 0x03ce638e, 0x005fb18c, 0x02ea6740, 0x017a052f, 0x0039bf26}}}, + {X: Field{[10]uint32{0x03bad12b, 0x03f52619, 0x02e1ec30, 0x0003abd9, 0x0385d5ea, 0x031bcb6c, 0x03613af5, 0x023d6d6f, 0x00497244, 0x003284f1}}, Y: Field{[10]uint32{0x0323b0f2, 0x0267d1a5, 0x03566896, 0x01c44695, 0x026370ab, 0x02ab68f5, 0x015fa64e, 0x021f22b0, 0x018361c2, 0x0020ea82}}}, + {X: Field{[10]uint32{0x02fbe7b2, 0x01bfe6ad, 0x025a3b9d, 0x03051635, 0x005eaded, 0x00aa2118, 0x036bbb1b, 0x0107e3cc, 0x03669cb4, 0x00099221}}, Y: Field{[10]uint32{0x01bc2a34, 0x029e2f08, 0x03603932, 0x0205a83a, 0x005638d9, 0x000b77c6, 0x02f2dcad, 0x0112623c, 0x02b4b201, 0x00278576}}}, + {X: Field{[10]uint32{0x0080414e, 0x03b97e57, 0x00f7fdda, 0x0218b59b, 0x0114ef8a, 0x01182792, 0x0011c4f4, 0x00aba16b, 0x0101a705, 0x00073b2c}}, Y: Field{[10]uint32{0x02169a3b, 0x03a524b4, 0x031d0dca, 0x039511c8, 0x02907557, 0x017b6b45, 0x01aa3283, 0x01f3ed39, 0x00669609, 0x003cd0d8}}}, + {X: Field{[10]uint32{0x0320907d, 0x00793462, 0x0051c50d, 0x0358581e, 0x003b15b2, 0x012143fd, 0x002f4589, 0x03089ec0, 0x01bc3e54, 0x003e62d7}}, Y: Field{[10]uint32{0x00c926af, 0x004c66d7, 0x00e35835, 0x038096a4, 0x0241fcd9, 0x02ea7327, 0x0139b706, 0x004fe90a, 0x00bd4f4a, 0x0038b542}}}, + {X: Field{[10]uint32{0x02d810a9, 0x016f2313, 0x00155c4f, 0x00fcf1c0, 0x024f889d, 0x0077c8e4, 0x010daf5f, 0x023e7325, 0x007504d7, 0x000a9a64}}, Y: Field{[10]uint32{0x029b4728, 0x01ace23e, 0x005c7cf8, 0x03a5fb05, 0x00667d47, 0x013ec13f, 0x02c58695, 0x03ff6b0f, 0x039b6c3d, 0x00153e40}}}, + {X: Field{[10]uint32{0x01a48db0, 0x01e0d6ce, 0x003bfefd, 0x028a6cf0, 0x019f1215, 0x02def791, 0x011d0a09, 0x01c59c9e, 0x00da696e, 0x000403d1}}, Y: Field{[10]uint32{0x03c65a09, 0x0357358a, 0x015ac0fb, 0x0063fd46, 0x02b7ff4a, 0x03024199, 0x008f3300, 0x002ddcbb, 0x013192a0, 0x00337678}}}, + }, + { + {X: Field{[10]uint32{0x01a48db0, 0x01e0d6ce, 0x003bfefd, 0x028a6cf0, 0x019f1215, 0x02def791, 0x011d0a09, 0x01c59c9e, 0x00da696e, 0x000403d1}}, Y: Field{[10]uint32{0x03c65a09, 0x0357358a, 0x015ac0fb, 0x0063fd46, 0x02b7ff4a, 0x03024199, 0x008f3300, 0x002ddcbb, 0x013192a0, 0x00337678}}}, + {X: Field{[10]uint32{0x024df706, 0x014a13c7, 0x008084b0, 0x03e48df4, 0x01d8d9c8, 0x02d31066, 0x0015dff2, 0x031dc6a1, 0x01f2ceb5, 0x00230262}}, Y: Field{[10]uint32{0x0172fa98, 0x02b168d7, 0x011aa736, 0x03d45594, 0x0060de6b, 0x0277259b, 0x012172cb, 0x0080d3ff, 0x01044f43, 0x003ed36f}}}, + {X: Field{[10]uint32{0x01bc15b4, 0x02684d25, 0x02ee69cb, 0x02391968, 0x01927502, 0x03b5f2a3, 0x0058ee9c, 0x02b727b6, 0x022e51ee, 0x00043a43}}, Y: Field{[10]uint32{0x00aa258d, 0x02f98256, 0x02a8834e, 0x018c0aed, 0x014ca589, 0x01ab47dd, 0x017a8c61, 0x03810935, 0x030380d5, 0x0031a28d}}}, + {X: Field{[10]uint32{0x0047bffd, 0x018f0cf7, 0x03c1bb1e, 0x00e6f256, 0x019c5285, 0x0098b009, 0x02481743, 0x019c1312, 0x013c5e26, 0x003ee3c5}}, Y: Field{[10]uint32{0x0149b095, 0x02917776, 0x02613090, 0x0226b150, 0x031dde13, 0x012f3354, 0x03a11d9b, 0x0188605b, 0x029dc5e0, 0x001b289e}}}, + {X: Field{[10]uint32{0x03e75269, 0x00ff0c0f, 0x033182dd, 0x033014f4, 0x01a377a3, 0x0052df73, 0x035b90b7, 0x0058e115, 0x0342da54, 0x003dd08b}}, Y: Field{[10]uint32{0x03e49bd5, 0x0203a1c5, 0x018e0189, 0x00dfd28e, 0x037fb3a2, 0x027d8d65, 0x00ce7dcb, 0x0024ff46, 0x031a3313, 0x00101b0b}}}, + {X: Field{[10]uint32{0x021c0a80, 0x00aaf21e, 0x01c740f6, 0x0163196a, 0x034d6251, 0x000bfe70, 0x03c9be70, 0x033296c5, 0x0268a614, 0x002dac56}}, Y: Field{[10]uint32{0x01ce0a03, 0x03404410, 0x016eeb6c, 0x02cc20b8, 0x009c9a12, 0x03d94db5, 0x00e223ee, 0x02d87a95, 0x0214d6cd, 0x003eb98b}}}, + {X: Field{[10]uint32{0x01a7175f, 0x02d9a5bd, 0x0342a653, 0x01c74c73, 0x03edb8e7, 0x00b577ae, 0x0079a558, 0x00f3fdca, 0x010417d4, 0x000b632b}}, Y: Field{[10]uint32{0x039d592a, 0x01eee46e, 0x025e0cf3, 0x03f672d7, 0x037a846b, 0x004b274d, 0x03232fa6, 0x02a529ee, 0x0383318c, 0x0031cfce}}}, + {X: Field{[10]uint32{0x03b2629a, 0x0286e2d2, 0x027b8b8f, 0x0161dcde, 0x0065a02c, 0x01ca1c21, 0x00cc9f0a, 0x0145d568, 0x033fd75d, 0x0039d1cc}}, Y: Field{[10]uint32{0x0146f6d6, 0x0365869a, 0x0169a9f8, 0x02a9b86a, 0x01c88376, 0x00130960, 0x00436038, 0x00304533, 0x02014507, 0x003cabff}}}, + {X: Field{[10]uint32{0x00b51045, 0x0326f0e5, 0x025b3e34, 0x025bcc70, 0x03bbc6c8, 0x007a33dc, 0x0273d4eb, 0x01ba962b, 0x011db98a, 0x0007b2ff}}, Y: Field{[10]uint32{0x02c70026, 0x019c4040, 0x0022d53a, 0x011ad0d9, 0x00b19006, 0x0126a6ce, 0x03d0bb18, 0x030e9911, 0x02308b99, 0x00073db8}}}, + {X: Field{[10]uint32{0x0013e439, 0x016d5b19, 0x02f674a3, 0x03bf7757, 0x02f92f69, 0x01fb6d92, 0x00b1bfeb, 0x038a5abe, 0x03b8b477, 0x00265d06}}, Y: Field{[10]uint32{0x0032cd5b, 0x015f609a, 0x026e43e6, 0x0325a5d1, 0x02b17c15, 0x01638f9e, 0x035aa562, 0x0326979c, 0x01b07bd9, 0x003791fa}}}, + {X: Field{[10]uint32{0x01358533, 0x0335d9ba, 0x00b9df7a, 0x03e753ed, 0x0010a933, 0x0074caa3, 0x02955a29, 0x01d4a20f, 0x00c5fe57, 0x00268225}}, Y: Field{[10]uint32{0x0360ba08, 0x03871770, 0x01dadfb3, 0x02f6ee03, 0x0165a6e5, 0x0153f0c8, 0x0117d5f9, 0x023f0c7e, 0x03c4201b, 0x0029e620}}}, + {X: Field{[10]uint32{0x02b062d4, 0x02a942a4, 0x02141a7c, 0x03966eda, 0x027a5ce7, 0x00fa889e, 0x03b17128, 0x03ab281b, 0x02a43256, 0x000d658f}}, Y: Field{[10]uint32{0x03b25302, 0x02a9346e, 0x019b1a10, 0x02e59379, 0x02d04082, 0x027022a5, 0x00ce196f, 0x039726ff, 0x01454951, 0x003d96f8}}}, + {X: Field{[10]uint32{0x018ef7f6, 0x01017586, 0x00f9f694, 0x03dde81e, 0x025923f3, 0x00ee2ba9, 0x019c8527, 0x034b8d6f, 0x0049db4f, 0x00199376}}, Y: Field{[10]uint32{0x011eac94, 0x025bfcd7, 0x02ecee74, 0x02cc6e39, 0x03fc3d3a, 0x03411633, 0x0048ce5d, 0x01e4ca85, 0x001717f2, 0x002b5448}}}, + {X: Field{[10]uint32{0x019334f0, 0x02d9bcc4, 0x011b60d0, 0x03ece82b, 0x0174728e, 0x0170a790, 0x020e8248, 0x030c871a, 0x037b02cf, 0x0033aede}}, Y: Field{[10]uint32{0x01e45191, 0x0142f494, 0x036cb167, 0x0276e780, 0x004765a2, 0x0374b8dc, 0x01ec0f74, 0x0128cae8, 0x0243633b, 0x003f8f7c}}}, + {X: Field{[10]uint32{0x03c934b3, 0x0029adf0, 0x022c4e0c, 0x02016c2b, 0x022b31f5, 0x020469c0, 0x031d9669, 0x02e18e08, 0x029377d0, 0x0020844e}}, Y: Field{[10]uint32{0x002c6a0f, 0x01798ab1, 0x0280377e, 0x009a6911, 0x00aa1f7c, 0x0168318a, 0x0066cf2b, 0x00d99821, 0x00dac9ae, 0x0023686e}}}, + {X: Field{[10]uint32{0x0134fd2d, 0x02b379b9, 0x033852c8, 0x011193ce, 0x03a77f8d, 0x02813005, 0x009227a4, 0x03b46c77, 0x03e262c7, 0x003840c6}}, Y: Field{[10]uint32{0x0056a00d, 0x03c63ca5, 0x02d79a44, 0x01067873, 0x02f292dd, 0x0165d4d6, 0x036a4176, 0x010179ae, 0x01928940, 0x00275c18}}}, + }, + { + {X: Field{[10]uint32{0x0134fd2d, 0x02b379b9, 0x033852c8, 0x011193ce, 0x03a77f8d, 0x02813005, 0x009227a4, 0x03b46c77, 0x03e262c7, 0x003840c6}}, Y: Field{[10]uint32{0x0056a00d, 0x03c63ca5, 0x02d79a44, 0x01067873, 0x02f292dd, 0x0165d4d6, 0x036a4176, 0x010179ae, 0x01928940, 0x00275c18}}}, + {X: Field{[10]uint32{0x015c8356, 0x009f8daa, 0x0185784e, 0x03177a53, 0x01028a6a, 0x03ca6cb2, 0x0395dcd0, 0x0227aae7, 0x03224c80, 0x003d2e4f}}, Y: Field{[10]uint32{0x02001fd3, 0x02186e6f, 0x0209abd5, 0x00d12455, 0x00c37ef1, 0x0103bba4, 0x025f6a7a, 0x018b7ec3, 0x02ec0629, 0x00299ea4}}}, + {X: Field{[10]uint32{0x03028d83, 0x0188ebbb, 0x03961579, 0x01b6e9d0, 0x03619592, 0x01779a76, 0x01abe5a1, 0x0217b1a9, 0x03c4e3c7, 0x0029fafd}}, Y: Field{[10]uint32{0x01d0bed1, 0x000e4ae6, 0x03919964, 0x009d2c14, 0x0347a389, 0x00112012, 0x019c7377, 0x018b573f, 0x012fbfe3, 0x00188145}}}, + {X: Field{[10]uint32{0x03160e8a, 0x018bf85e, 0x0296c20d, 0x004be5f9, 0x00d51e85, 0x0096c22c, 0x01622ea0, 0x0148dac6, 0x00a1fce5, 0x0002746b}}, Y: Field{[10]uint32{0x00a04c44, 0x0014315f, 0x035e534e, 0x03ba484a, 0x026fe9e0, 0x0036309f, 0x016692ce, 0x03c318f9, 0x008f5101, 0x000454c6}}}, + {X: Field{[10]uint32{0x03dd5cfa, 0x00390089, 0x014b5bae, 0x004dfc27, 0x036a89c5, 0x0098d18c, 0x01c6a534, 0x013d3073, 0x008dcb02, 0x0016d728}}, Y: Field{[10]uint32{0x0248e98c, 0x0129be67, 0x029d3e66, 0x0332bcc9, 0x00bfd067, 0x0221a425, 0x011f0cea, 0x016097a6, 0x02f70aa1, 0x000fb32d}}}, + {X: Field{[10]uint32{0x03b61ee5, 0x021104de, 0x00c13f28, 0x038bec7c, 0x02da4f04, 0x025d2b9b, 0x02638cd8, 0x0086e198, 0x0230cc87, 0x003524cc}}, Y: Field{[10]uint32{0x01d694a8, 0x03693439, 0x00ddc662, 0x0231690e, 0x021ad12c, 0x03b2bed7, 0x00c5e9d1, 0x02748fb7, 0x01abf51a, 0x00008702}}}, + {X: Field{[10]uint32{0x03531f82, 0x014a38c8, 0x02c9f2b9, 0x01aec430, 0x01ff5132, 0x02708b0a, 0x02f3e748, 0x012ed733, 0x02acc111, 0x00011bc9}}, Y: Field{[10]uint32{0x03ceda07, 0x017f22c2, 0x01c7fa50, 0x01736ad5, 0x01d02594, 0x03f0c95e, 0x02370ac2, 0x020bab38, 0x0331635b, 0x001ae012}}}, + {X: Field{[10]uint32{0x01ba7fc2, 0x035f411d, 0x01562e97, 0x024eff0e, 0x03518b3a, 0x02087379, 0x022ad793, 0x00ae7862, 0x01cc454c, 0x00319b16}}, Y: Field{[10]uint32{0x035f5956, 0x00f1a73d, 0x015977ec, 0x0376c565, 0x02f00a60, 0x02b0432c, 0x024f3cea, 0x003f3efa, 0x03e2bfb3, 0x0036564b}}}, + {X: Field{[10]uint32{0x00432711, 0x00550dc4, 0x02b9060b, 0x00bf7645, 0x02cf140b, 0x02265916, 0x0396f0f0, 0x03bed4d7, 0x02d931e0, 0x00304649}}, Y: Field{[10]uint32{0x03e2610c, 0x009878bb, 0x00055e49, 0x00b283cd, 0x0383ab92, 0x01b331b3, 0x0094bf18, 0x02da2461, 0x00cc7d25, 0x0022f87e}}}, + {X: Field{[10]uint32{0x02be316c, 0x01b1b348, 0x03ad0f83, 0x00fc9e39, 0x016bf404, 0x0097bd7c, 0x017cef5b, 0x00deccac, 0x01aa4a0b, 0x00156735}}, Y: Field{[10]uint32{0x03e04013, 0x02ae7267, 0x000e71a6, 0x0074d81e, 0x038a389a, 0x01d31a4b, 0x01ba9298, 0x0101dbcb, 0x009c08d4, 0x002ab551}}}, + {X: Field{[10]uint32{0x01257963, 0x0261d3e8, 0x02861c17, 0x014b0d2a, 0x005b018d, 0x00e25e71, 0x01bb54b5, 0x023cb9b3, 0x02e9eb68, 0x001a4211}}, Y: Field{[10]uint32{0x026f9835, 0x01d96651, 0x02b253a5, 0x02a08724, 0x036cbc3c, 0x024beedf, 0x0017024f, 0x03af16d0, 0x03cb7f3f, 0x00389217}}}, + {X: Field{[10]uint32{0x0004554a, 0x03772f3b, 0x00ffe530, 0x02ed1a23, 0x00aadcff, 0x028428bb, 0x00652c27, 0x0346811d, 0x03c89873, 0x00225bcd}}, Y: Field{[10]uint32{0x029138df, 0x03e7f864, 0x017dcd68, 0x0186b310, 0x01e6085b, 0x03a046fc, 0x0222bb04, 0x0312b369, 0x03e7224a, 0x000e0108}}}, + {X: Field{[10]uint32{0x02e23ace, 0x004e52f7, 0x012fd2d1, 0x0196d537, 0x01dec87c, 0x0128ca45, 0x027552df, 0x0082eaee, 0x03fb8c92, 0x003ecf7d}}, Y: Field{[10]uint32{0x0322e8de, 0x037bd325, 0x03f5ee09, 0x010bfb49, 0x029e7271, 0x036ead62, 0x02251540, 0x00f1594a, 0x01bc11c7, 0x0014438a}}}, + {X: Field{[10]uint32{0x00d36f89, 0x003c4c17, 0x00b925f9, 0x031b9c03, 0x031e4754, 0x00a403b8, 0x01d68b87, 0x0148e594, 0x03176915, 0x00120adb}}, Y: Field{[10]uint32{0x00a4f423, 0x0328dc9c, 0x01a68467, 0x00d10b52, 0x0219ee07, 0x035ffa4b, 0x018c23e6, 0x03316b2c, 0x011df9a5, 0x003a30f0}}}, + {X: Field{[10]uint32{0x00272351, 0x01f3fbd4, 0x03109860, 0x00f7e67f, 0x0170734b, 0x02ac7350, 0x038a3eb3, 0x01462cfa, 0x02c24f5c, 0x001b7617}}, Y: Field{[10]uint32{0x03c7664b, 0x01fe8adf, 0x0017c9b0, 0x03df0f82, 0x03877c6f, 0x03d7106d, 0x01407f9a, 0x0109f827, 0x03f4121f, 0x0005ba99}}}, + {X: Field{[10]uint32{0x0094696d, 0x039a2364, 0x02af52d5, 0x019a9075, 0x005cf8b2, 0x010ef5fb, 0x002839f1, 0x016d4c2b, 0x00ae46d5, 0x003fba9b}}, Y: Field{[10]uint32{0x00090088, 0x0177afc6, 0x0042d315, 0x015f3105, 0x00981c89, 0x03cfb357, 0x02e4e12b, 0x0386eac1, 0x036c97dc, 0x00395f1a}}}, + }, + { + {X: Field{[10]uint32{0x0094696d, 0x039a2364, 0x02af52d5, 0x019a9075, 0x005cf8b2, 0x010ef5fb, 0x002839f1, 0x016d4c2b, 0x00ae46d5, 0x003fba9b}}, Y: Field{[10]uint32{0x00090088, 0x0177afc6, 0x0042d315, 0x015f3105, 0x00981c89, 0x03cfb357, 0x02e4e12b, 0x0386eac1, 0x036c97dc, 0x00395f1a}}}, + {X: Field{[10]uint32{0x02752b08, 0x010102bb, 0x021870aa, 0x0382ccc6, 0x01141eca, 0x036cb85e, 0x03261af9, 0x021f8714, 0x03621adb, 0x00134002}}, Y: Field{[10]uint32{0x00302cea, 0x00a147d2, 0x0293a3e7, 0x03c4671c, 0x00cb7df5, 0x00b65cb3, 0x02d82558, 0x0349572d, 0x038f18e0, 0x001a8356}}}, + {X: Field{[10]uint32{0x00dfd587, 0x00d86ed2, 0x02656079, 0x00e326c0, 0x015ec4ba, 0x033d684b, 0x0067aaa2, 0x01422cd2, 0x001bacf4, 0x0014212d}}, Y: Field{[10]uint32{0x01470e89, 0x027a5fe4, 0x035606e7, 0x0181a247, 0x035db6f5, 0x014a49d1, 0x01aa6c85, 0x0034c586, 0x031a1d98, 0x000d2a58}}}, + {X: Field{[10]uint32{0x035c58ef, 0x0258bf51, 0x01b77f89, 0x0100f87c, 0x00d657a0, 0x011c5c4a, 0x02a26211, 0x0281775a, 0x00ca203d, 0x001c7d5c}}, Y: Field{[10]uint32{0x035d420e, 0x01269cb4, 0x03e7df86, 0x00030cd8, 0x01f2445d, 0x02f256e3, 0x01557345, 0x02203749, 0x015b95dc, 0x003ad090}}}, + {X: Field{[10]uint32{0x02b34cc6, 0x008c985e, 0x00a12d08, 0x01d9f3cc, 0x00c80c29, 0x00635c4a, 0x03b3f1fd, 0x0357a94f, 0x003e0642, 0x0013c530}}, Y: Field{[10]uint32{0x007e681f, 0x03094be6, 0x01d0225e, 0x033a3a07, 0x00b9de3c, 0x00e98950, 0x013a70f4, 0x03a25319, 0x00a8caa4, 0x001ed4f4}}}, + {X: Field{[10]uint32{0x00953fa9, 0x01655b5b, 0x003db4d0, 0x00a7c2e3, 0x0228ab26, 0x02f46301, 0x01f485d4, 0x024c8ce9, 0x010eaaab, 0x002927b4}}, Y: Field{[10]uint32{0x02fb4c72, 0x00af4891, 0x0181b67b, 0x00d25a38, 0x035ae875, 0x0037f77e, 0x03476c0a, 0x014e6380, 0x0094660f, 0x00331cae}}}, + {X: Field{[10]uint32{0x0241d90d, 0x01dc4044, 0x004f8342, 0x01076c91, 0x03e81cf1, 0x03b774d8, 0x01436095, 0x027b4750, 0x007e49c7, 0x0029d36e}}, Y: Field{[10]uint32{0x037adad4, 0x01462e0f, 0x02313f32, 0x024d1282, 0x00a9ee50, 0x02205c72, 0x03dd08a5, 0x03bbcc9f, 0x01cdaf23, 0x003de1a4}}}, + {X: Field{[10]uint32{0x03ff8359, 0x022c1810, 0x03651604, 0x00771979, 0x0046b482, 0x00876805, 0x01282b5c, 0x03494edf, 0x03629f7b, 0x0028adec}}, Y: Field{[10]uint32{0x0286fec2, 0x025ffb3f, 0x03835a23, 0x00d411bc, 0x0110d108, 0x01c78a72, 0x02937a3f, 0x0048b55e, 0x00941695, 0x001a4c0e}}}, + {X: Field{[10]uint32{0x01c1ae1f, 0x0332888c, 0x000b2a5e, 0x031a2b35, 0x00456e58, 0x02e8d596, 0x00dcd44e, 0x028b3e6b, 0x025744ba, 0x001a407e}}, Y: Field{[10]uint32{0x022838b0, 0x00cc1974, 0x03a930f8, 0x0297971d, 0x01d79f3b, 0x00a72403, 0x01b5380c, 0x03084918, 0x00882273, 0x000d7797}}}, + {X: Field{[10]uint32{0x01f1f366, 0x002404e6, 0x036be34f, 0x01e8f401, 0x004a7905, 0x01265364, 0x015f216b, 0x01fdee92, 0x025c5da4, 0x001744d3}}, Y: Field{[10]uint32{0x00990f2c, 0x0034fa71, 0x00b39e2b, 0x005882a2, 0x03cf02d6, 0x00ea0adc, 0x03e2a4ae, 0x011410b6, 0x034d3e08, 0x0000ec7b}}}, + {X: Field{[10]uint32{0x027a4bdb, 0x00c4206c, 0x00cac4b0, 0x0010d525, 0x01046a6d, 0x006ee8d7, 0x004b643f, 0x02049e89, 0x002d1d43, 0x00234f36}}, Y: Field{[10]uint32{0x029a8a2c, 0x00d31f39, 0x01296c3d, 0x01f4dc2b, 0x02d4e380, 0x001d88db, 0x00fbf9d0, 0x0107d1c3, 0x016180ee, 0x0026f509}}}, + {X: Field{[10]uint32{0x03a1d916, 0x025b4ff9, 0x01f3a3c0, 0x00e5747c, 0x00315b0a, 0x0176ec1c, 0x006158a6, 0x027432eb, 0x01acb6d5, 0x001943be}}, Y: Field{[10]uint32{0x0068387b, 0x0127299c, 0x026ba858, 0x00229db0, 0x0158bb46, 0x01e6e0b1, 0x029c0b92, 0x02c461c3, 0x01f21162, 0x00021744}}}, + {X: Field{[10]uint32{0x00ec1d2d, 0x0334f1ad, 0x00f45440, 0x0171b9f6, 0x03d9099f, 0x019eda47, 0x029d6729, 0x011ce6bf, 0x0363d606, 0x003abe60}}, Y: Field{[10]uint32{0x00838452, 0x039d5813, 0x00b53fcf, 0x01515fa1, 0x02a9f52d, 0x01ac666a, 0x01228a0e, 0x023489dd, 0x003a7fe7, 0x00394606}}}, + {X: Field{[10]uint32{0x03d98ee1, 0x0323a022, 0x012bed42, 0x01ea4226, 0x03579df3, 0x023ee865, 0x027c924a, 0x00860ffa, 0x02ce0ceb, 0x00075dc2}}, Y: Field{[10]uint32{0x0138ffca, 0x02e05e47, 0x017ecf9f, 0x029038f5, 0x0237f61c, 0x01954aa1, 0x0163038b, 0x03d779e2, 0x0005f46e, 0x0009e3e2}}}, + {X: Field{[10]uint32{0x005ae767, 0x00d6fdc1, 0x0371cbcb, 0x032e7a25, 0x00c273a9, 0x0301b976, 0x0340e052, 0x02d8d19b, 0x01163aed, 0x003ee56f}}, Y: Field{[10]uint32{0x03bf0e11, 0x00fa82be, 0x03134185, 0x01c62967, 0x03b816f4, 0x01a089d6, 0x0004d9d3, 0x0376f148, 0x00d811a8, 0x00199305}}}, + {X: Field{[10]uint32{0x01ec6cb1, 0x02a5e2f0, 0x003de33f, 0x01f60216, 0x00feed65, 0x01bff28f, 0x027be4be, 0x027372cd, 0x011d9104, 0x003699ea}}, Y: Field{[10]uint32{0x0268be1d, 0x03aa389e, 0x000a17e9, 0x031423dd, 0x01dec7ad, 0x0325e039, 0x03463f7e, 0x010af107, 0x02354816, 0x0026eb2a}}}, + }, + { + {X: Field{[10]uint32{0x01ec6cb1, 0x02a5e2f0, 0x003de33f, 0x01f60216, 0x00feed65, 0x01bff28f, 0x027be4be, 0x027372cd, 0x011d9104, 0x003699ea}}, Y: Field{[10]uint32{0x0268be1d, 0x03aa389e, 0x000a17e9, 0x031423dd, 0x01dec7ad, 0x0325e039, 0x03463f7e, 0x010af107, 0x02354816, 0x0026eb2a}}}, + {X: Field{[10]uint32{0x03e741c9, 0x00f32087, 0x01a835ee, 0x00d733a9, 0x018bbd9f, 0x03c0361c, 0x00c0cfaa, 0x03bd61f0, 0x01365fa1, 0x00136eb3}}, Y: Field{[10]uint32{0x038eb623, 0x03843e0c, 0x0135f60b, 0x02827f01, 0x010cc384, 0x020e0a67, 0x01cfd59e, 0x0224b9ff, 0x000e8a51, 0x0005b0d5}}}, + {X: Field{[10]uint32{0x01bc8a44, 0x03741945, 0x011a19ef, 0x01df2f85, 0x03684101, 0x029697f1, 0x00565a4b, 0x03b68f4e, 0x00583cfc, 0x00134060}}, Y: Field{[10]uint32{0x02dbc09e, 0x03e53246, 0x01a362f1, 0x011a160b, 0x03969420, 0x01f58e04, 0x029ba800, 0x03d74d9f, 0x02c18cb4, 0x000e8cf1}}}, + {X: Field{[10]uint32{0x00e218da, 0x036a2ead, 0x0205087e, 0x03c549a1, 0x010f4c85, 0x03d07096, 0x00f17d8f, 0x026fbb9a, 0x03c48150, 0x0004f47f}}, Y: Field{[10]uint32{0x03191c19, 0x02d06776, 0x01127e0d, 0x0081b56f, 0x01a4ad01, 0x006dd62f, 0x00b9337b, 0x0258773b, 0x011fa991, 0x0018020e}}}, + {X: Field{[10]uint32{0x01daeb00, 0x02ad4a19, 0x01f76bc1, 0x00933991, 0x015923eb, 0x00edba74, 0x02cb6a27, 0x03e55c20, 0x0107df5c, 0x000bd985}}, Y: Field{[10]uint32{0x033992c0, 0x01d9e260, 0x0308c122, 0x009c6574, 0x006ecdee, 0x00802b74, 0x039537a8, 0x02ccfdbb, 0x02136f52, 0x003f5704}}}, + {X: Field{[10]uint32{0x035b4eb8, 0x0084f924, 0x01a3cf52, 0x03c6ae2d, 0x0207f557, 0x032bcb73, 0x03f54a3c, 0x00895bc3, 0x00e43adf, 0x0030465a}}, Y: Field{[10]uint32{0x03911add, 0x01265b5b, 0x0149b704, 0x02504a9c, 0x0242f8b4, 0x019d9be0, 0x039d81fe, 0x01163e0d, 0x02937786, 0x002ffd79}}}, + {X: Field{[10]uint32{0x016aa6d9, 0x02a42824, 0x02dcf182, 0x02d91dc0, 0x003662c8, 0x0060d68e, 0x00f174da, 0x011f4895, 0x017d05fe, 0x003d6504}}, Y: Field{[10]uint32{0x032e50cf, 0x001a5baf, 0x01b86c7d, 0x0220f9ad, 0x037a9277, 0x00252f3a, 0x025dbdab, 0x006c4b3d, 0x01a56e97, 0x0032a9d8}}}, + {X: Field{[10]uint32{0x02e96db8, 0x02d032a8, 0x01bff133, 0x005b38a7, 0x033cc9d9, 0x016c14ce, 0x019c79c4, 0x018001d9, 0x039cef6c, 0x000866d3}}, Y: Field{[10]uint32{0x013b6bc7, 0x03c069e3, 0x0176527d, 0x0314fa41, 0x02394f8a, 0x000dca9b, 0x0244180c, 0x03bfabd6, 0x0205d959, 0x00093671}}}, + {X: Field{[10]uint32{0x02c6f4c0, 0x0380e55e, 0x01c4ccaa, 0x03a3312f, 0x01da4e8d, 0x01a59c47, 0x021c38be, 0x02737b13, 0x017f1f4d, 0x0003cb53}}, Y: Field{[10]uint32{0x02339b58, 0x01eeeb5c, 0x02656e7e, 0x029e4090, 0x028f6a10, 0x00e079c7, 0x03b27fdf, 0x0379345f, 0x03857e93, 0x000fb227}}}, + {X: Field{[10]uint32{0x00284327, 0x0347e6bd, 0x02facc56, 0x02c0e0e9, 0x03ac4020, 0x001a8d05, 0x003ebdd8, 0x02d17375, 0x00bdcd64, 0x0003da10}}, Y: Field{[10]uint32{0x01e2ab72, 0x0349d691, 0x01eb7400, 0x029dc4ae, 0x03b68dab, 0x02d8452b, 0x01e8bff4, 0x0069dd25, 0x037f100f, 0x003cc134}}}, + {X: Field{[10]uint32{0x03428cb2, 0x01414ff7, 0x02b55d85, 0x03f59a88, 0x01233822, 0x0256343c, 0x037a1815, 0x012ef47a, 0x02c2e2a1, 0x00075773}}, Y: Field{[10]uint32{0x015b189b, 0x03b44022, 0x004a51e5, 0x00be1d81, 0x00bd3e91, 0x021bc2e2, 0x00787824, 0x03231434, 0x0083b142, 0x001b9710}}}, + {X: Field{[10]uint32{0x01dffc96, 0x02e84256, 0x01857295, 0x0296beb1, 0x019228cd, 0x0205fac0, 0x039b395c, 0x00f7abdb, 0x00bee148, 0x0005871b}}, Y: Field{[10]uint32{0x03492de4, 0x02f3d846, 0x00621c93, 0x0324babe, 0x019b9634, 0x032c60c1, 0x01259391, 0x03fe616f, 0x0292a6b9, 0x002289b2}}}, + {X: Field{[10]uint32{0x00381273, 0x03aa23ea, 0x01ae5fb0, 0x02581a4f, 0x02d84376, 0x031049b3, 0x01ea9b2c, 0x019d0e7f, 0x02fd3009, 0x00227668}}, Y: Field{[10]uint32{0x0309773d, 0x03acfbb4, 0x03324a03, 0x0202b449, 0x018f61d6, 0x01b3d8bd, 0x03aaf207, 0x01bd40dd, 0x01b451d6, 0x0037f289}}}, + {X: Field{[10]uint32{0x010a683f, 0x018557e0, 0x031be4cf, 0x00c6fdba, 0x005248bd, 0x00626aa3, 0x02c7285f, 0x035283f9, 0x02cc3f64, 0x001e0f43}}, Y: Field{[10]uint32{0x00f54c4c, 0x019b38b8, 0x01ee9dfd, 0x0221c8e5, 0x02b5de92, 0x01fcb547, 0x02b74572, 0x03d28c05, 0x01029073, 0x0008029b}}}, + {X: Field{[10]uint32{0x01c71d91, 0x00cacb2d, 0x00fd21cc, 0x00b8aa25, 0x0223945e, 0x0056bfb3, 0x02a1c131, 0x002b8714, 0x038783a5, 0x0020c646}}, Y: Field{[10]uint32{0x02148a61, 0x027b0238, 0x005ee70b, 0x0145d411, 0x0217a11f, 0x005f2ba2, 0x006de13d, 0x006dc278, 0x03157380, 0x00382b1f}}}, + {X: Field{[10]uint32{0x0237b7c0, 0x01173306, 0x0069f575, 0x03deec44, 0x01ec08d0, 0x03bc8854, 0x02000935, 0x0133769b, 0x03aa0b33, 0x0014e413}}, Y: Field{[10]uint32{0x022771c8, 0x02c25ac0, 0x034699dc, 0x02078510, 0x00139999, 0x00834f07, 0x009eccac, 0x0041b623, 0x03d0bc80, 0x0016f021}}}, + }, + { + {X: Field{[10]uint32{0x0237b7c0, 0x01173306, 0x0069f575, 0x03deec44, 0x01ec08d0, 0x03bc8854, 0x02000935, 0x0133769b, 0x03aa0b33, 0x0014e413}}, Y: Field{[10]uint32{0x022771c8, 0x02c25ac0, 0x034699dc, 0x02078510, 0x00139999, 0x00834f07, 0x009eccac, 0x0041b623, 0x03d0bc80, 0x0016f021}}}, + {X: Field{[10]uint32{0x00a47ca9, 0x0343c7ce, 0x005ad57c, 0x02aab43e, 0x012a6ee7, 0x00c5a657, 0x03991196, 0x0119d4f3, 0x01af9d41, 0x0000695d}}, Y: Field{[10]uint32{0x03ebcdb7, 0x0177cb9d, 0x03ea667c, 0x01767d35, 0x00bdb93c, 0x006ee1a6, 0x015fc52e, 0x00370f31, 0x01cb8ab2, 0x000c0e3c}}}, + {X: Field{[10]uint32{0x00a2050e, 0x0310bf92, 0x00a6771a, 0x015d857e, 0x01742ef5, 0x0391e6e2, 0x03769cc6, 0x01cc625a, 0x00fd24bc, 0x0019cdc9}}, Y: Field{[10]uint32{0x021d3d70, 0x03269241, 0x01cc2b90, 0x03f50cd2, 0x01be6bac, 0x02a21adb, 0x03482c09, 0x01288080, 0x0257896a, 0x003933e0}}}, + {X: Field{[10]uint32{0x0315565b, 0x0275d578, 0x00c6ee30, 0x020f4f08, 0x02d3a61a, 0x01d85575, 0x031f5c1b, 0x0350e729, 0x00437621, 0x003d7c38}}, Y: Field{[10]uint32{0x012ecc82, 0x010c2bf7, 0x0240a678, 0x02fcfb5f, 0x02a5bf61, 0x037dc406, 0x02189160, 0x0014afd8, 0x0262be5a, 0x001ae7d3}}}, + {X: Field{[10]uint32{0x02de63bf, 0x01b920e0, 0x01c66cbf, 0x00ca1c98, 0x00e03af5, 0x03d859aa, 0x0198a631, 0x0130c279, 0x03a472df, 0x0010d9bb}}, Y: Field{[10]uint32{0x017924cd, 0x01a90238, 0x02d6b02c, 0x01496aa9, 0x02f33b0c, 0x00c09a3a, 0x022537e1, 0x035f38bb, 0x0109bee2, 0x000b9f76}}}, + {X: Field{[10]uint32{0x01a78179, 0x03d807ea, 0x02afe34c, 0x00149835, 0x036b50e9, 0x00827b67, 0x01a47336, 0x02e37241, 0x03f37081, 0x00265729}}, Y: Field{[10]uint32{0x03ec1f47, 0x03eed32b, 0x00e52931, 0x015a6ad9, 0x02bbcc85, 0x0124a18e, 0x0234d880, 0x015cead7, 0x01e95553, 0x00366816}}}, + {X: Field{[10]uint32{0x02f96190, 0x0149ffc1, 0x0125ef10, 0x03a41f25, 0x03d1f02d, 0x019ea9d7, 0x03e55696, 0x02ac7e5e, 0x03627991, 0x001ef5d4}}, Y: Field{[10]uint32{0x03da00f6, 0x005c812a, 0x02695a3d, 0x0170783a, 0x02ce0fcc, 0x010e09f5, 0x02d64749, 0x018c2757, 0x02b3dbba, 0x0020cdbc}}}, + {X: Field{[10]uint32{0x01362d33, 0x01e0767d, 0x03642cbe, 0x00851889, 0x0347cbc9, 0x01c32938, 0x027f36d9, 0x01ba695e, 0x030b6c0b, 0x0023d41b}}, Y: Field{[10]uint32{0x03fa243f, 0x021f4321, 0x00eaf304, 0x01750eee, 0x0048cf92, 0x03c70cda, 0x030c5424, 0x0185c654, 0x015d2afa, 0x0011a7e5}}}, + {X: Field{[10]uint32{0x02ad41ed, 0x0054c555, 0x0352433b, 0x00d7d3c0, 0x020308ac, 0x02463724, 0x023419e8, 0x035706be, 0x027bddaa, 0x0013dfa4}}, Y: Field{[10]uint32{0x02642d57, 0x00d5e19f, 0x0375bdf4, 0x01c53abd, 0x022e7314, 0x00ea3da9, 0x02980df5, 0x022c4154, 0x005156a8, 0x0037f9dd}}}, + {X: Field{[10]uint32{0x025e6618, 0x010e868f, 0x03cb4c18, 0x03d6763f, 0x03166d65, 0x03904918, 0x02017141, 0x01f6fe1f, 0x007338b9, 0x003ef084}}, Y: Field{[10]uint32{0x0230c860, 0x01536808, 0x00cf20ed, 0x00fc772f, 0x017f3c4f, 0x03ce6c47, 0x0160c1a6, 0x025052d2, 0x0059185c, 0x0027e6c2}}}, + {X: Field{[10]uint32{0x03748690, 0x01814499, 0x00b01cfa, 0x0137618c, 0x007d5790, 0x0374cf40, 0x03452b1e, 0x00733252, 0x03867d29, 0x0008d572}}, Y: Field{[10]uint32{0x0089582b, 0x011d4c53, 0x0139147c, 0x01633472, 0x00582868, 0x016a9f16, 0x01b85ec1, 0x0387e3d5, 0x018a5a71, 0x000870bc}}}, + {X: Field{[10]uint32{0x009135d3, 0x02361761, 0x031fc13d, 0x03404b90, 0x0274203c, 0x004c2c5a, 0x00134294, 0x02a16997, 0x03c7ef82, 0x00016502}}, Y: Field{[10]uint32{0x022255d2, 0x035d1465, 0x02391d02, 0x00a32640, 0x02f12863, 0x02ad9a1e, 0x035b0c7a, 0x02ad84bd, 0x0185eb4f, 0x002414de}}}, + {X: Field{[10]uint32{0x02de7f16, 0x03a88582, 0x0028c6da, 0x03a4f2f8, 0x00ae9cba, 0x0309d749, 0x03592ab6, 0x0295b004, 0x025b9b3d, 0x0002d9a0}}, Y: Field{[10]uint32{0x00c56217, 0x01109a12, 0x00d2bd94, 0x0037cf9f, 0x03b7243c, 0x02d5ea5f, 0x03a76ba8, 0x026cffbc, 0x00b818e0, 0x00287ee8}}}, + {X: Field{[10]uint32{0x00d2374d, 0x00c1c059, 0x02b2bc63, 0x025a133f, 0x00dcf38a, 0x02cffda9, 0x025a9f71, 0x03274976, 0x02d8b5e5, 0x0005bba3}}, Y: Field{[10]uint32{0x00865998, 0x016f2d3f, 0x01dd980e, 0x003b9b53, 0x02075513, 0x016dbfd8, 0x026b843e, 0x03c44228, 0x03f0546f, 0x003d4039}}}, + {X: Field{[10]uint32{0x01060d5b, 0x01ac08a6, 0x03a7c290, 0x02c470e8, 0x03904613, 0x027e5472, 0x0109b2fd, 0x0008b2d8, 0x003cf0bd, 0x003d8081}}, Y: Field{[10]uint32{0x02f88f13, 0x01bd42c6, 0x01a3f76f, 0x034adf74, 0x0237aa56, 0x0313defa, 0x01a8f64a, 0x033c6620, 0x0306c1f0, 0x003c0dad}}}, + {X: Field{[10]uint32{0x02d86047, 0x02567d0e, 0x00bcaeff, 0x0010ea6e, 0x0379b53a, 0x0132a419, 0x01cca776, 0x020e9dc6, 0x010bd359, 0x00239ef3}}, Y: Field{[10]uint32{0x0060372a, 0x00011fa1, 0x028b3ea1, 0x00b91ff5, 0x0179e88e, 0x032a5451, 0x00310420, 0x0292ce50, 0x030b2a3d, 0x00042ddd}}}, + }, + { + {X: Field{[10]uint32{0x02d86047, 0x02567d0e, 0x00bcaeff, 0x0010ea6e, 0x0379b53a, 0x0132a419, 0x01cca776, 0x020e9dc6, 0x010bd359, 0x00239ef3}}, Y: Field{[10]uint32{0x0060372a, 0x00011fa1, 0x028b3ea1, 0x00b91ff5, 0x0179e88e, 0x032a5451, 0x00310420, 0x0292ce50, 0x030b2a3d, 0x00042ddd}}}, + {X: Field{[10]uint32{0x013f0351, 0x00a022fc, 0x009e777d, 0x0234f40e, 0x033bc15b, 0x025a5437, 0x010f3199, 0x01ca770d, 0x03aa195e, 0x000cecd6}}, Y: Field{[10]uint32{0x038d7418, 0x0140f332, 0x01b702bc, 0x03bef222, 0x00aa6560, 0x012354af, 0x00640362, 0x02fe1fe5, 0x0185640a, 0x00296280}}}, + {X: Field{[10]uint32{0x001ead4b, 0x0221e681, 0x003c1ffe, 0x03eda46c, 0x023a75ed, 0x02bf9daf, 0x014734ef, 0x00cdfb1c, 0x000c8c8f, 0x002ff243}}, Y: Field{[10]uint32{0x02fedaed, 0x00b1bc21, 0x02e3e745, 0x03fccb82, 0x02fb468e, 0x01410b4d, 0x03a718dd, 0x037b4936, 0x01b1e09c, 0x001ea520}}}, + {X: Field{[10]uint32{0x0014bb36, 0x0371ec91, 0x03ca6d71, 0x00272b5e, 0x0256f6e1, 0x01c7df88, 0x0383ad20, 0x00fe5572, 0x02ae22c9, 0x000dd37b}}, Y: Field{[10]uint32{0x01af734a, 0x016faa63, 0x00321787, 0x018c0395, 0x013828d6, 0x0201bdca, 0x0032c06f, 0x013e6458, 0x01b64fcd, 0x0005c459}}}, + {X: Field{[10]uint32{0x01bb3b3e, 0x01ef41dd, 0x033cb26e, 0x005fbe7d, 0x03507536, 0x030b4fd6, 0x025993e8, 0x02aa9372, 0x011cbe3f, 0x001ccb7c}}, Y: Field{[10]uint32{0x03366693, 0x01df87b5, 0x00436cc5, 0x01b59316, 0x02e69dad, 0x00094e45, 0x03e25584, 0x0265df2d, 0x003ede8f, 0x001fd064}}}, + {X: Field{[10]uint32{0x01b7ad0d, 0x03215bb9, 0x011d3694, 0x01f2a743, 0x0076ee76, 0x01b45b11, 0x010d8a49, 0x0380370b, 0x010dabb5, 0x000e955a}}, Y: Field{[10]uint32{0x02e8c407, 0x0261e42c, 0x01218d6c, 0x022b2b0c, 0x0301cacb, 0x01fbe67c, 0x021fbac9, 0x0195efec, 0x021975a0, 0x0030f8a3}}}, + {X: Field{[10]uint32{0x008dc3b9, 0x016cf062, 0x00c99c5f, 0x0093a5dd, 0x0019a669, 0x0325fbd8, 0x01a8840c, 0x011ed0a3, 0x00b96039, 0x00133825}}, Y: Field{[10]uint32{0x01c0de52, 0x013dedb9, 0x006502c1, 0x008327a8, 0x0216205b, 0x029dab28, 0x03b4d80c, 0x026cfb55, 0x03babf1a, 0x00014e43}}}, + {X: Field{[10]uint32{0x02e7d616, 0x02992b5a, 0x01f0c5e8, 0x03cad8aa, 0x00944dba, 0x016bac37, 0x006e0739, 0x03ab95f1, 0x009c7f3a, 0x0008e030}}, Y: Field{[10]uint32{0x021bbc1a, 0x026f9205, 0x02756009, 0x00523e11, 0x0293af92, 0x01426c26, 0x0198aefd, 0x0255abc5, 0x02193464, 0x001be3a1}}}, + {X: Field{[10]uint32{0x02aafe5a, 0x01d782c2, 0x02edd4c3, 0x02ce9426, 0x00e25470, 0x02c08ff4, 0x018a6a95, 0x019f7a5b, 0x02b76fc6, 0x0026a5a3}}, Y: Field{[10]uint32{0x02d975c0, 0x02ff5093, 0x00cc0ce6, 0x0029979c, 0x02e7b588, 0x03618743, 0x03c66d03, 0x02e8a553, 0x0307a6d3, 0x002afdbe}}}, + {X: Field{[10]uint32{0x03a32402, 0x018b453b, 0x025348d9, 0x0184f19a, 0x025e659c, 0x000e00d3, 0x037db3bb, 0x03aaaf83, 0x02ced74c, 0x00060293}}, Y: Field{[10]uint32{0x00894b4e, 0x00de0371, 0x0118b320, 0x024dff73, 0x01a602c5, 0x013fafa1, 0x03bfc2f2, 0x035f8ab6, 0x015747ba, 0x00126293}}}, + {X: Field{[10]uint32{0x034c6397, 0x0072fe7c, 0x00d09375, 0x02d401d3, 0x0107dd3d, 0x014dac88, 0x00aef802, 0x0186553c, 0x03ed0171, 0x0034f1be}}, Y: Field{[10]uint32{0x00cb3f9c, 0x0323415a, 0x00e00b1f, 0x00224178, 0x028a0c77, 0x00baad91, 0x018394d9, 0x00abc651, 0x02c55e5e, 0x00128374}}}, + {X: Field{[10]uint32{0x01b2df82, 0x0291ec26, 0x00fb1927, 0x00591c41, 0x00ec5e7a, 0x0338cb01, 0x012d18ec, 0x02e4b332, 0x005c62bf, 0x00101699}}, Y: Field{[10]uint32{0x01307dbf, 0x00a0d282, 0x0062b5da, 0x02cb3b71, 0x022ffa9d, 0x008df9c4, 0x00aca61e, 0x025b83d7, 0x0014f44d, 0x002f0f2d}}}, + {X: Field{[10]uint32{0x02c3137e, 0x020964c2, 0x0244619b, 0x018a96bd, 0x03fe925b, 0x02aace54, 0x02f06a76, 0x010ee380, 0x03981292, 0x00132f78}}, Y: Field{[10]uint32{0x02c02fe6, 0x023c573b, 0x02d60c00, 0x02b9623a, 0x00d193a7, 0x02e530dc, 0x0092a134, 0x01856540, 0x00608f13, 0x001b3955}}}, + {X: Field{[10]uint32{0x010ce56e, 0x006788f9, 0x014a3c71, 0x03c35de4, 0x02c8293a, 0x032f9e05, 0x00590fca, 0x006bcf9a, 0x00d3ce53, 0x002a9b71}}, Y: Field{[10]uint32{0x01edd739, 0x03ce8d1f, 0x010a8b9d, 0x036be3dc, 0x03c11984, 0x03997998, 0x01f6edc5, 0x0394a5b8, 0x018fa241, 0x003af1e6}}}, + {X: Field{[10]uint32{0x00fbf84b, 0x008c1b38, 0x00b8a47a, 0x032ef0fc, 0x0303c48f, 0x030533ae, 0x03d9c730, 0x01891ee2, 0x033c82b1, 0x0012e74c}}, Y: Field{[10]uint32{0x036c3c48, 0x03b92d28, 0x035e6239, 0x010f8bd6, 0x036766d5, 0x019e6dfa, 0x0313d982, 0x03054954, 0x03fbe24c, 0x003f5ff1}}}, + {X: Field{[10]uint32{0x01c43862, 0x01078566, 0x026690a8, 0x03c60e5f, 0x0271a7f4, 0x026e06f7, 0x01081868, 0x03fc879b, 0x0134c1cd, 0x000e17bb}}, Y: Field{[10]uint32{0x002e5453, 0x0163f955, 0x01c8cc04, 0x03b0821b, 0x036b304e, 0x027afd15, 0x001de19e, 0x008fd59c, 0x03c3e8ea, 0x000a0efa}}}, + }, + { + {X: Field{[10]uint32{0x01c43862, 0x01078566, 0x026690a8, 0x03c60e5f, 0x0271a7f4, 0x026e06f7, 0x01081868, 0x03fc879b, 0x0134c1cd, 0x000e17bb}}, Y: Field{[10]uint32{0x002e5453, 0x0163f955, 0x01c8cc04, 0x03b0821b, 0x036b304e, 0x027afd15, 0x001de19e, 0x008fd59c, 0x03c3e8ea, 0x000a0efa}}}, + {X: Field{[10]uint32{0x00f2827c, 0x00e89c1e, 0x01ce2dc8, 0x010afbf0, 0x0147c826, 0x0357d9f4, 0x016be134, 0x01520011, 0x02083daf, 0x003dbd88}}, Y: Field{[10]uint32{0x00aaa102, 0x02c82d48, 0x01bf6d15, 0x01d120c8, 0x03e657ca, 0x00d9f3b9, 0x02c5715b, 0x00e83ebc, 0x02817de7, 0x0006f353}}}, + {X: Field{[10]uint32{0x02e2d9b3, 0x034c1aad, 0x0163514b, 0x020c6ce3, 0x0241db92, 0x0273e115, 0x012ea613, 0x00179d78, 0x00f397c7, 0x000668c5}}, Y: Field{[10]uint32{0x03aaaf33, 0x00bb8972, 0x03e56d55, 0x00749012, 0x03a5021d, 0x01fd4a2c, 0x00965f88, 0x00a3748d, 0x00f5dac7, 0x001b2b36}}}, + {X: Field{[10]uint32{0x015adcb6, 0x024c825c, 0x02f369d8, 0x0339f631, 0x01cd91c3, 0x0347f095, 0x030cb3c3, 0x00f78af5, 0x01188f95, 0x003ec9b9}}, Y: Field{[10]uint32{0x00ba68f3, 0x02f28ed6, 0x02b5449d, 0x00c6e2de, 0x0116d2cb, 0x027405da, 0x02846a71, 0x028d3563, 0x00811012, 0x003cf84a}}}, + {X: Field{[10]uint32{0x02f00480, 0x0161fac4, 0x01cee7d8, 0x00128403, 0x01203588, 0x013d9c86, 0x01c98636, 0x036a8d57, 0x014b95a8, 0x0016103b}}, Y: Field{[10]uint32{0x0222cf9e, 0x00b578af, 0x03872159, 0x01514ab8, 0x02ba7522, 0x00577636, 0x0168deaa, 0x03c5041e, 0x026b220b, 0x0019c336}}}, + {X: Field{[10]uint32{0x03a52264, 0x01cdf658, 0x00b3752e, 0x000c5500, 0x03d0adfc, 0x02b9473f, 0x006e2a9a, 0x01ffa6a0, 0x000de818, 0x00217ff7}}, Y: Field{[10]uint32{0x02da2082, 0x01f4a6a0, 0x01d0498c, 0x0324ac5e, 0x00678182, 0x01551c1b, 0x02568f50, 0x0252342f, 0x00187ae2, 0x000ffb8c}}}, + {X: Field{[10]uint32{0x03f54c42, 0x0137ba08, 0x03dc8e48, 0x00f09a68, 0x0145dc1a, 0x03b394c9, 0x0058c1f4, 0x0063ec77, 0x01a53469, 0x0027d5c0}}, Y: Field{[10]uint32{0x03eb6a21, 0x0387124b, 0x02527860, 0x012ac867, 0x0189ee78, 0x01ca6ff7, 0x0395b6b5, 0x02795efe, 0x03b8801d, 0x00339ee3}}}, + {X: Field{[10]uint32{0x00788c1e, 0x0136dd58, 0x011d7ed4, 0x00183a2f, 0x03d18c37, 0x018f3aad, 0x035c6bc7, 0x004cb4a3, 0x025911b9, 0x00226448}}, Y: Field{[10]uint32{0x028f0ef1, 0x031088a3, 0x01e11635, 0x0213f7be, 0x0236969c, 0x026c4dbe, 0x03876355, 0x02b26c9e, 0x01987cc9, 0x0036a2d3}}}, + {X: Field{[10]uint32{0x0122461a, 0x0104cca5, 0x018327e9, 0x00996f1c, 0x00bcb30a, 0x019fbe68, 0x03b87010, 0x0233f006, 0x0169235a, 0x0009fd84}}, Y: Field{[10]uint32{0x03301a2d, 0x0132be71, 0x039446aa, 0x00836a18, 0x00e4981b, 0x01d0a3ba, 0x008c5612, 0x01ab4ba9, 0x01a9900a, 0x003944bc}}}, + {X: Field{[10]uint32{0x02ddd3ac, 0x03662579, 0x006516db, 0x00ce8bc0, 0x037bf8f6, 0x0338b568, 0x012d90d6, 0x00b82561, 0x03e6732a, 0x0025bb94}}, Y: Field{[10]uint32{0x029b6fde, 0x0096cd9c, 0x01c06fbf, 0x025db19b, 0x02ef0d07, 0x03afc783, 0x004c9711, 0x00a7cb63, 0x02eae4b6, 0x000e6e72}}}, + {X: Field{[10]uint32{0x014f36b9, 0x00b26cb4, 0x03390cce, 0x02ed8ee7, 0x012598ca, 0x017d2a60, 0x01bf2f43, 0x03e50498, 0x01856cee, 0x001901de}}, Y: Field{[10]uint32{0x00b4b50a, 0x02c7ba79, 0x02eb2894, 0x01c12673, 0x008cda08, 0x02169edb, 0x010d75fd, 0x01bbebbe, 0x028f44e5, 0x00369864}}}, + {X: Field{[10]uint32{0x02a88c9c, 0x03fd692d, 0x01f069c1, 0x0198c527, 0x02a37b68, 0x01cb2a8a, 0x021d9ac9, 0x0244e62c, 0x0081e547, 0x001e1964}}, Y: Field{[10]uint32{0x01a7d19b, 0x0164d15d, 0x02a155e0, 0x026c0ead, 0x0112cf91, 0x017a0658, 0x028fa722, 0x0034ada7, 0x007792a3, 0x0016688c}}}, + {X: Field{[10]uint32{0x00d6b76f, 0x018f7e65, 0x015dbcef, 0x03eed320, 0x027fe5a9, 0x00277fab, 0x02f708bc, 0x019a7d14, 0x00e31c85, 0x00288dd4}}, Y: Field{[10]uint32{0x01cca8da, 0x024b3323, 0x008d141d, 0x0047f6e1, 0x03e7707c, 0x03504444, 0x032fa3e4, 0x0379b6b0, 0x0314a6e7, 0x003dcce6}}}, + {X: Field{[10]uint32{0x00c13079, 0x0336c4f4, 0x01688d4f, 0x00055374, 0x026f3e5a, 0x036bcc05, 0x01fea76e, 0x003aee02, 0x010b6e1f, 0x001794ad}}, Y: Field{[10]uint32{0x00e1296f, 0x00f1239c, 0x00e1cc10, 0x0344f58f, 0x004a3829, 0x01280fab, 0x02987853, 0x012c326d, 0x02e73a35, 0x000667b7}}}, + {X: Field{[10]uint32{0x00eee475, 0x03a7193f, 0x0382b12e, 0x00a103b5, 0x01ab6ac8, 0x00f2bfd0, 0x013c021f, 0x00de357b, 0x0007a3f2, 0x002efc6b}}, Y: Field{[10]uint32{0x03fe5067, 0x008a8021, 0x001d6846, 0x02250e2d, 0x0324eb9d, 0x01ac57f8, 0x0083cc83, 0x01839842, 0x00deead4, 0x002d2fee}}}, + {X: Field{[10]uint32{0x03fac3a7, 0x01bb61b0, 0x03bc9c60, 0x0129651f, 0x000fddf8, 0x004f7e86, 0x03c73a44, 0x03c6458d, 0x01b803ec, 0x0001be76}}, Y: Field{[10]uint32{0x02842160, 0x0224180e, 0x01002d86, 0x00bd70a0, 0x007ea4dd, 0x03917135, 0x038e2a30, 0x0166e9a6, 0x028e6030, 0x001f2031}}}, + }, + { + {X: Field{[10]uint32{0x03fac3a7, 0x01bb61b0, 0x03bc9c60, 0x0129651f, 0x000fddf8, 0x004f7e86, 0x03c73a44, 0x03c6458d, 0x01b803ec, 0x0001be76}}, Y: Field{[10]uint32{0x02842160, 0x0224180e, 0x01002d86, 0x00bd70a0, 0x007ea4dd, 0x03917135, 0x038e2a30, 0x0166e9a6, 0x028e6030, 0x001f2031}}}, + {X: Field{[10]uint32{0x037fd72d, 0x03489d12, 0x01a175c9, 0x03969f93, 0x01da1745, 0x01120a4e, 0x01c36c28, 0x01047073, 0x02ea252b, 0x002ba1bb}}, Y: Field{[10]uint32{0x02ee38bc, 0x0132de93, 0x03728233, 0x015451cb, 0x018d9211, 0x0227fc3a, 0x02b0ace5, 0x000be58a, 0x03c97073, 0x00067a64}}}, + {X: Field{[10]uint32{0x021ce204, 0x035d7a34, 0x023d524e, 0x0239099d, 0x03b2a725, 0x0329bdcb, 0x0374d859, 0x03193ee0, 0x01d162b3, 0x0010f290}}, Y: Field{[10]uint32{0x034a8f6b, 0x014113a4, 0x02468e52, 0x02ccfa92, 0x039ab6c7, 0x0236e8c7, 0x0250f921, 0x008fe871, 0x0282e370, 0x00373a96}}}, + {X: Field{[10]uint32{0x00169290, 0x011d099f, 0x032ee7a1, 0x01d73cdb, 0x008718be, 0x01b70b12, 0x01d2f8c5, 0x03fd5798, 0x01f90bbf, 0x00089232}}, Y: Field{[10]uint32{0x003ea257, 0x036284a2, 0x02be2369, 0x0008d768, 0x00e16375, 0x010d6e86, 0x006bb55b, 0x03bb5e94, 0x00692d21, 0x003e8165}}}, + {X: Field{[10]uint32{0x03e6efda, 0x033a4b3a, 0x0005964f, 0x03cfe1ca, 0x01922d4f, 0x0216941b, 0x026f7237, 0x00afd6d9, 0x02ef2289, 0x00270f81}}, Y: Field{[10]uint32{0x03aefc7d, 0x0103cca9, 0x03df7df1, 0x01a1ecdb, 0x01d43bc8, 0x03389bf5, 0x030b2d44, 0x0248f62b, 0x01e5e762, 0x0029edc2}}}, + {X: Field{[10]uint32{0x00978583, 0x0290c805, 0x0213f5b3, 0x02bbc185, 0x00cdd6e9, 0x003e4885, 0x03841999, 0x00c4dd25, 0x009b9cf2, 0x000c2afe}}, Y: Field{[10]uint32{0x01c75777, 0x00600d47, 0x004ac446, 0x0288eed6, 0x0063120e, 0x00386ae0, 0x037b4f2d, 0x01d26337, 0x0115477f, 0x0012c0d4}}}, + {X: Field{[10]uint32{0x02c88be2, 0x009ead71, 0x025e2791, 0x008341bb, 0x03ea2c78, 0x020c1dd6, 0x0372759d, 0x003c0cee, 0x02a313e2, 0x00175be2}}, Y: Field{[10]uint32{0x017ad75d, 0x03954fc3, 0x012c2892, 0x023a9afe, 0x00edab6f, 0x02c22f08, 0x01aaf33a, 0x0353a31c, 0x018d8d56, 0x002b712c}}}, + {X: Field{[10]uint32{0x010964e3, 0x036b12ed, 0x02f76fd0, 0x01df7471, 0x00a99f08, 0x02502174, 0x0011b48d, 0x01101d2b, 0x0216e05c, 0x0038469b}}, Y: Field{[10]uint32{0x0282bfc8, 0x03efe2c1, 0x00c6f767, 0x0384e0c6, 0x0017adc6, 0x01bc2bc9, 0x02d5e259, 0x0350c386, 0x025b87a2, 0x0021f581}}}, + {X: Field{[10]uint32{0x02d1b844, 0x024d46e4, 0x02484f28, 0x020b05cf, 0x01c69c03, 0x004e22f1, 0x02b15c3c, 0x00357f21, 0x01c304a6, 0x003d5f4d}}, Y: Field{[10]uint32{0x01266837, 0x02eaef58, 0x01c6a464, 0x0080c245, 0x00700697, 0x027918d3, 0x004d3f5a, 0x03d365e4, 0x019ea98e, 0x001c1fcf}}}, + {X: Field{[10]uint32{0x021f51d3, 0x01c591ec, 0x03df8739, 0x0118b0e7, 0x0011f80d, 0x036842ea, 0x00d419b9, 0x02a5573a, 0x03216726, 0x001a9cfe}}, Y: Field{[10]uint32{0x01224b17, 0x00937669, 0x03774018, 0x011a2d82, 0x022db482, 0x025c844c, 0x02a7d294, 0x03cf09ff, 0x02fca1ed, 0x0013cf3b}}}, + {X: Field{[10]uint32{0x00c7cb09, 0x03401fcf, 0x03435234, 0x01a28746, 0x023bc7eb, 0x00f61c51, 0x016e1fee, 0x025297d6, 0x007a3a65, 0x0004f9d8}}, Y: Field{[10]uint32{0x00079160, 0x01d6a282, 0x036411be, 0x02ed9ad5, 0x0165eae2, 0x02cd0a67, 0x025fdd85, 0x02e2c78c, 0x008de8fb, 0x000a1372}}}, + {X: Field{[10]uint32{0x00288015, 0x00df98fb, 0x019cc39a, 0x014fbb72, 0x024673f8, 0x0016daa9, 0x01fac61a, 0x0379bda0, 0x02aad936, 0x002a8053}}, Y: Field{[10]uint32{0x02c1006f, 0x00539991, 0x00ad9df8, 0x001d0f3b, 0x03ef4b9b, 0x03dec3d8, 0x032a7e43, 0x02fa6b0f, 0x03c04636, 0x000f7a44}}}, + {X: Field{[10]uint32{0x00cdee05, 0x00338496, 0x003b9006, 0x02c85cbb, 0x01a8761f, 0x02c1a407, 0x000250b1, 0x020b9890, 0x03225681, 0x000a6fa8}}, Y: Field{[10]uint32{0x022651c8, 0x0280d669, 0x018e39e4, 0x02db231a, 0x03f9fc31, 0x021c17b1, 0x0009b3fb, 0x02683aa4, 0x01a2690e, 0x001f1036}}}, + {X: Field{[10]uint32{0x011d45f9, 0x02155e3c, 0x026144cf, 0x0379b1e5, 0x02ba4c1c, 0x01f6de5b, 0x022ef2c7, 0x0144ad3a, 0x03d35337, 0x000dabb8}}, Y: Field{[10]uint32{0x00febad4, 0x02eacfdf, 0x036069d3, 0x0342b11c, 0x00004b35, 0x01f263d5, 0x00b95470, 0x018271e7, 0x0235cd69, 0x0032ab76}}}, + {X: Field{[10]uint32{0x02f18ada, 0x01b1d584, 0x01bcc11b, 0x024eef6f, 0x01d460bd, 0x00cf5296, 0x0036faff, 0x02239f67, 0x006d2382, 0x003d485e}}, Y: Field{[10]uint32{0x03953516, 0x01a2bf48, 0x030981dd, 0x028db16f, 0x02aa5ef4, 0x03347475, 0x0026102b, 0x036d5fb3, 0x03bf6038, 0x00381a1b}}}, + {X: Field{[10]uint32{0x02d0e6bd, 0x01f839d0, 0x01e5313b, 0x018f6c3d, 0x03f774d1, 0x00135bb2, 0x022147c1, 0x0138960a, 0x0001243c, 0x000cc8b5}}, Y: Field{[10]uint32{0x0028b2a0, 0x00e8ba5b, 0x03af624f, 0x00fa8a1c, 0x032805f6, 0x0376be6d, 0x03019bc4, 0x013bd6fe, 0x0397e966, 0x0015b9c1}}}, + }, + { + {X: Field{[10]uint32{0x02d0e6bd, 0x01f839d0, 0x01e5313b, 0x018f6c3d, 0x03f774d1, 0x00135bb2, 0x022147c1, 0x0138960a, 0x0001243c, 0x000cc8b5}}, Y: Field{[10]uint32{0x0028b2a0, 0x00e8ba5b, 0x03af624f, 0x00fa8a1c, 0x032805f6, 0x0376be6d, 0x03019bc4, 0x013bd6fe, 0x0397e966, 0x0015b9c1}}}, + {X: Field{[10]uint32{0x00ade462, 0x025b4cb0, 0x00f29fc6, 0x0323ab6f, 0x010d4cdd, 0x01320335, 0x00ef31b0, 0x02f6b848, 0x000250ce, 0x00234988}}, Y: Field{[10]uint32{0x0326470c, 0x002a2e43, 0x00b3ad8e, 0x0139c99e, 0x021d4afb, 0x00fb8dae, 0x01f6f2dc, 0x03d0df4c, 0x03b4715b, 0x003afb4e}}}, + {X: Field{[10]uint32{0x019ab499, 0x0274fc81, 0x00330abd, 0x0271b9cf, 0x000b1329, 0x019fc06f, 0x02196b3c, 0x0016e974, 0x03f3015c, 0x001e2eab}}, Y: Field{[10]uint32{0x02e097fd, 0x0348c63f, 0x01199681, 0x03ba3449, 0x0291632e, 0x0360820b, 0x00a84e0e, 0x0302bebf, 0x00dbdb06, 0x002b52f7}}}, + {X: Field{[10]uint32{0x0116e633, 0x01190f85, 0x01c8b916, 0x00341cb6, 0x038ed493, 0x0165340e, 0x00068a1f, 0x02faa739, 0x00766eae, 0x00048e30}}, Y: Field{[10]uint32{0x037b7805, 0x036dca31, 0x0022805c, 0x00b731d0, 0x03094625, 0x0070f705, 0x00979e2d, 0x004d675b, 0x002dbb27, 0x0022a76c}}}, + {X: Field{[10]uint32{0x0106ace6, 0x00f85b3f, 0x020ca449, 0x00dbe0e8, 0x0223709b, 0x024a6ac6, 0x00b84984, 0x038f5308, 0x0211a14a, 0x001bdc3c}}, Y: Field{[10]uint32{0x0202d5de, 0x02fb4d2d, 0x005ee048, 0x019af96b, 0x00753295, 0x01ee67d4, 0x015d8f34, 0x01edcdbe, 0x02309402, 0x001e47a2}}}, + {X: Field{[10]uint32{0x01cd5379, 0x018ccc29, 0x03cadc30, 0x00e161c2, 0x032db794, 0x02a93488, 0x002481b8, 0x004e0a9e, 0x02d56bdd, 0x0005f01c}}, Y: Field{[10]uint32{0x0108cd25, 0x02b8146c, 0x02d0df7c, 0x01d8996e, 0x038959ac, 0x03c740d3, 0x03c1247a, 0x0281939d, 0x01f4283d, 0x0036406f}}}, + {X: Field{[10]uint32{0x00ee1b40, 0x03b8fb98, 0x02247dc8, 0x016dc7a5, 0x008ced48, 0x0040f335, 0x00949f19, 0x029057e0, 0x01b29d6a, 0x00385667}}, Y: Field{[10]uint32{0x038f93a6, 0x018997b5, 0x0199de1d, 0x01d2f0ca, 0x03a6363a, 0x028bf1f3, 0x02f894aa, 0x035283be, 0x02232a81, 0x001e4cd8}}}, + {X: Field{[10]uint32{0x008e7a66, 0x0005549e, 0x0021619b, 0x00a0ac3b, 0x01cddcd7, 0x029a846e, 0x032ea758, 0x0270579e, 0x030770cb, 0x0009c756}}, Y: Field{[10]uint32{0x003c9727, 0x035c9638, 0x0024e7a8, 0x038d422a, 0x03e2a065, 0x026b21df, 0x017d0994, 0x03d24791, 0x005834e7, 0x00174ea9}}}, + {X: Field{[10]uint32{0x01c00c3e, 0x037e8a12, 0x008e2f81, 0x000f2448, 0x01f00e8f, 0x03514616, 0x02562d33, 0x01a5590d, 0x00970440, 0x002ec2c1}}, Y: Field{[10]uint32{0x01955a35, 0x02a60b44, 0x0090a799, 0x013a4177, 0x02fe6704, 0x02ac6c14, 0x01d2fa17, 0x027d8d95, 0x005853af, 0x001019f9}}}, + {X: Field{[10]uint32{0x00a923b7, 0x03a1f62a, 0x01b30da1, 0x03bb6071, 0x02aef650, 0x020ce099, 0x00708ab6, 0x0269c150, 0x039b2199, 0x002b0ab2}}, Y: Field{[10]uint32{0x03cd20a6, 0x030492b5, 0x03a4fa2d, 0x02fc4b49, 0x0360b0d0, 0x004f67ac, 0x01afa0df, 0x01c93472, 0x028511c1, 0x001da110}}}, + {X: Field{[10]uint32{0x01dd32e6, 0x01d6e701, 0x01ee7e0e, 0x0146d4f9, 0x03c663b5, 0x01d697ef, 0x0249dbe0, 0x01e27a6d, 0x01554195, 0x00371690}}, Y: Field{[10]uint32{0x014a99b9, 0x01f6de9d, 0x01bcf80e, 0x0241db92, 0x002ff2ee, 0x006fd651, 0x00ea5e20, 0x019e9db7, 0x00a63f9f, 0x0012bcea}}}, + {X: Field{[10]uint32{0x022d8dae, 0x00f00632, 0x01ea9579, 0x03e47f49, 0x02ac32a5, 0x032c895b, 0x02b25ef9, 0x024be6e9, 0x00026211, 0x002209c7}}, Y: Field{[10]uint32{0x021e77d9, 0x009b03cf, 0x01099fb4, 0x01b71c5f, 0x00c30087, 0x016afd6b, 0x01c8b3ae, 0x01daa900, 0x01535071, 0x0035c677}}}, + {X: Field{[10]uint32{0x0144e7cb, 0x0116eb11, 0x020359ed, 0x0096d4a5, 0x01a10642, 0x004053a6, 0x03354a57, 0x00ee76f8, 0x01703987, 0x00055b86}}, Y: Field{[10]uint32{0x01250a37, 0x00e4b02b, 0x039cd6d5, 0x02357ad0, 0x009496d5, 0x00e0d2fa, 0x039572a6, 0x0241f6a4, 0x019f8f31, 0x001af023}}}, + {X: Field{[10]uint32{0x0089240f, 0x02eb7267, 0x03b858f5, 0x02ebe8b9, 0x0274f8c4, 0x01f8385d, 0x00ee0919, 0x01cce386, 0x010d652d, 0x00056e0e}}, Y: Field{[10]uint32{0x0326f04a, 0x03e7be38, 0x033352e2, 0x02ad7068, 0x01b30367, 0x01e967e6, 0x03dd7ccc, 0x023420ea, 0x020c8efe, 0x001e1b3c}}}, + {X: Field{[10]uint32{0x019853ca, 0x02f0a731, 0x03f54dbf, 0x01ae7c66, 0x0348e962, 0x0239c584, 0x00a76a22, 0x010e09af, 0x00cecb68, 0x00109a6f}}, Y: Field{[10]uint32{0x01b8d367, 0x0163bd4d, 0x028a3da9, 0x0297e796, 0x01fd3940, 0x010c6902, 0x0084ca9c, 0x005adc8f, 0x001a82c0, 0x003b4ac7}}}, + {X: Field{[10]uint32{0x0134ab83, 0x035d34a0, 0x03397721, 0x026bdd90, 0x00741b3f, 0x0259961a, 0x011770d8, 0x02df68af, 0x007d2de0, 0x002159cb}}, Y: Field{[10]uint32{0x010313a6, 0x00c253de, 0x00f44c8e, 0x03f314a6, 0x01e77f17, 0x0298b0b9, 0x034049bf, 0x02cbad8d, 0x039b5b43, 0x001f1206}}}, + }, + { + {X: Field{[10]uint32{0x0134ab83, 0x035d34a0, 0x03397721, 0x026bdd90, 0x00741b3f, 0x0259961a, 0x011770d8, 0x02df68af, 0x007d2de0, 0x002159cb}}, Y: Field{[10]uint32{0x010313a6, 0x00c253de, 0x00f44c8e, 0x03f314a6, 0x01e77f17, 0x0298b0b9, 0x034049bf, 0x02cbad8d, 0x039b5b43, 0x001f1206}}}, + {X: Field{[10]uint32{0x0317fc25, 0x02e42f07, 0x02d96998, 0x011b7cb9, 0x033b89ea, 0x01722987, 0x00186121, 0x027b00db, 0x036b740f, 0x0014d333}}, Y: Field{[10]uint32{0x03e86e76, 0x031fdbb3, 0x028ddd71, 0x01deff74, 0x010ae3d2, 0x00b550d5, 0x02ae3dd3, 0x00b76d18, 0x00b09c8b, 0x00355c57}}}, + {X: Field{[10]uint32{0x03ba9000, 0x001c8ea0, 0x028b6fdf, 0x0271a097, 0x01c4872f, 0x0210050f, 0x00876075, 0x036305a1, 0x00f9fff1, 0x002b0e1d}}, Y: Field{[10]uint32{0x0310cf0a, 0x00f1f65b, 0x029fa4da, 0x0035fd9b, 0x03085e35, 0x01045fe4, 0x022dde89, 0x0301a6e1, 0x012308a1, 0x002a997a}}}, + {X: Field{[10]uint32{0x00bee8b6, 0x01c248fa, 0x008d2c71, 0x011fb3ef, 0x0179020d, 0x023e2abb, 0x01e14201, 0x02dfcc20, 0x035cee87, 0x002a4747}}, Y: Field{[10]uint32{0x010644c1, 0x0345aa90, 0x03225003, 0x027d8a32, 0x02f80056, 0x0376b4ec, 0x03189c8d, 0x023b8569, 0x024ee2df, 0x001d228c}}}, + {X: Field{[10]uint32{0x0106dbd4, 0x001bd9bb, 0x00d081a6, 0x0215e288, 0x01ec0e3f, 0x0268f9ca, 0x0114075e, 0x01c04e6b, 0x00e7aa68, 0x0015c357}}, Y: Field{[10]uint32{0x011ed495, 0x016fb3af, 0x00bed5a6, 0x01b71918, 0x03b683a3, 0x007406ee, 0x0366e671, 0x000bd816, 0x0349420e, 0x0029ab94}}}, + {X: Field{[10]uint32{0x03ba402e, 0x0358c2c5, 0x02989ae5, 0x0170b410, 0x03c3b81a, 0x021238f0, 0x03ead0c4, 0x0280a962, 0x035cd18f, 0x0023a246}}, Y: Field{[10]uint32{0x00fad9e0, 0x02d89e71, 0x027ee8e1, 0x0090855e, 0x02af650c, 0x013ca8c1, 0x038d0e40, 0x0319a02c, 0x020e6a9e, 0x003974c3}}}, + {X: Field{[10]uint32{0x012d230e, 0x0307e482, 0x03928434, 0x02834a4c, 0x01daee32, 0x000d9bbd, 0x03c229ee, 0x022edbe1, 0x00702826, 0x001d6d7e}}, Y: Field{[10]uint32{0x011570b8, 0x032f7ef5, 0x038fb037, 0x02c01447, 0x020267a4, 0x01377ea3, 0x01787455, 0x02148d8f, 0x0221e3a7, 0x00149f33}}}, + {X: Field{[10]uint32{0x0184cf74, 0x02870956, 0x01f10aa1, 0x0116fbd8, 0x000735ae, 0x00b50e0f, 0x02214dde, 0x0238d706, 0x0023d90c, 0x00305723}}, Y: Field{[10]uint32{0x01ccb000, 0x0123360e, 0x015a2c4a, 0x00b542c0, 0x0247bf77, 0x0097f5ee, 0x01c6f45e, 0x0088d723, 0x00d82852, 0x000aea55}}}, + {X: Field{[10]uint32{0x034fcc0e, 0x01afdab0, 0x0084c47b, 0x0290af8e, 0x00927f10, 0x01f49672, 0x025b80e2, 0x037b0ac2, 0x02fae1ed, 0x00113f23}}, Y: Field{[10]uint32{0x019c420a, 0x03c0c79c, 0x0089d9cf, 0x0292f341, 0x03720e94, 0x020cf4f5, 0x01267e78, 0x004d9f92, 0x0294ba9b, 0x0034b1f7}}}, + {X: Field{[10]uint32{0x0142dea9, 0x004fc3a2, 0x03130584, 0x0232e2df, 0x02ab35a9, 0x0182a1ff, 0x006ad8ba, 0x0176d9e5, 0x02133428, 0x000559a1}}, Y: Field{[10]uint32{0x027be3df, 0x0151bc0d, 0x02dcbf92, 0x01a22c8f, 0x02de4828, 0x02c83f48, 0x02894eff, 0x03c14413, 0x03aa0e82, 0x0013cd65}}}, + {X: Field{[10]uint32{0x03b69991, 0x01207f22, 0x03175d5a, 0x028b0cc1, 0x01fffb3f, 0x0380bd4d, 0x02a16620, 0x01ef1a19, 0x0247bace, 0x0037a8ae}}, Y: Field{[10]uint32{0x016fe2df, 0x01d0aa7c, 0x019bc706, 0x02cd887b, 0x03229dcd, 0x013dee79, 0x01cbfec8, 0x00a392b1, 0x03d6d90c, 0x002b8a2f}}}, + {X: Field{[10]uint32{0x036bcfe8, 0x03b58794, 0x03bb3e61, 0x027b5a6d, 0x020e0c17, 0x001acc66, 0x02ca8f23, 0x02666d1c, 0x00bc1cc6, 0x0004ccbe}}, Y: Field{[10]uint32{0x02e78402, 0x00374b36, 0x0021451b, 0x009356a3, 0x01ba93b4, 0x017701a0, 0x0367c453, 0x00bb5c4f, 0x03ee2960, 0x0030e771}}}, + {X: Field{[10]uint32{0x014fc9cc, 0x01034094, 0x021658c2, 0x02f0a691, 0x0226d00a, 0x012e2a0d, 0x001cf6cc, 0x01a35bbf, 0x0098a6e1, 0x000e5a3f}}, Y: Field{[10]uint32{0x03ad37dd, 0x00e52257, 0x03334019, 0x01dbfe23, 0x011a1465, 0x02ab4cb2, 0x037982d1, 0x0164a048, 0x03d0db4b, 0x001e272e}}}, + {X: Field{[10]uint32{0x00cc84bf, 0x00ebcf85, 0x01f27c02, 0x01b7bae8, 0x0380bf1d, 0x030a9254, 0x00e37159, 0x00205a0c, 0x01364e54, 0x002d775a}}, Y: Field{[10]uint32{0x0374750c, 0x01485f38, 0x01a90c78, 0x037b75ac, 0x01353110, 0x01635051, 0x0118733c, 0x032dadaf, 0x005853c7, 0x0012cdbb}}}, + {X: Field{[10]uint32{0x020c85f1, 0x0308646b, 0x03a250ae, 0x014d80e8, 0x01a6a52e, 0x015e5175, 0x0325df09, 0x01a8a49a, 0x010698e0, 0x001a25a4}}, Y: Field{[10]uint32{0x01c1de21, 0x01208ccb, 0x003922c7, 0x02768354, 0x011f40c1, 0x021175cb, 0x03305c1d, 0x025e495b, 0x03b4b38c, 0x002bbf4f}}}, + {X: Field{[10]uint32{0x00c82a0a, 0x02566bd8, 0x00832ffd, 0x03183d9a, 0x010f9226, 0x006504ec, 0x006c9f19, 0x022291ac, 0x03809b19, 0x0002522f}}, Y: Field{[10]uint32{0x00c8e589, 0x02dfe236, 0x012bed4c, 0x002325f3, 0x006d4dff, 0x0070d063, 0x02b74c5d, 0x01991b71, 0x02856dcb, 0x0014e958}}}, + }, + { + {X: Field{[10]uint32{0x00c82a0a, 0x02566bd8, 0x00832ffd, 0x03183d9a, 0x010f9226, 0x006504ec, 0x006c9f19, 0x022291ac, 0x03809b19, 0x0002522f}}, Y: Field{[10]uint32{0x00c8e589, 0x02dfe236, 0x012bed4c, 0x002325f3, 0x006d4dff, 0x0070d063, 0x02b74c5d, 0x01991b71, 0x02856dcb, 0x0014e958}}}, + {X: Field{[10]uint32{0x028b000a, 0x03ac115f, 0x01e51396, 0x00cc7a09, 0x02ef16c1, 0x00a47c2d, 0x01ce4c66, 0x0164d835, 0x007f372e, 0x0009a54b}}, Y: Field{[10]uint32{0x01ef705a, 0x035007c1, 0x027318c3, 0x023d94f5, 0x02debe39, 0x035a2108, 0x03c893d2, 0x029a218a, 0x024c5800, 0x003d44fa}}}, + {X: Field{[10]uint32{0x00c8ac7f, 0x00bf97ee, 0x02a52728, 0x03b9978a, 0x01641242, 0x0015be12, 0x003396d2, 0x00aef2d7, 0x02fbe382, 0x0026516c}}, Y: Field{[10]uint32{0x01aea3b0, 0x0250e85a, 0x00dfa96d, 0x008fbb6b, 0x01282f7a, 0x02ca3bfd, 0x03db44ff, 0x00a0b581, 0x01824b0f, 0x000fbbfb}}}, + {X: Field{[10]uint32{0x02134f96, 0x0096225d, 0x030e9f10, 0x0195cb5a, 0x03f52119, 0x00c7fc90, 0x032be8b1, 0x0316f6fb, 0x00e6fc23, 0x00318b96}}, Y: Field{[10]uint32{0x014cf97e, 0x01dfb534, 0x01c3e822, 0x00d58dcc, 0x01bcfb85, 0x00c507f1, 0x03d67675, 0x02859e30, 0x027d45b1, 0x0010e5e0}}}, + {X: Field{[10]uint32{0x029e353a, 0x035e78e5, 0x021f6ed1, 0x00214aef, 0x0210a044, 0x0041f57f, 0x01f82227, 0x01c3988d, 0x006b2058, 0x000a8c53}}, Y: Field{[10]uint32{0x01746067, 0x0249b879, 0x018bfc25, 0x02ab6c99, 0x00138a54, 0x02ea86e8, 0x0063e476, 0x009eb069, 0x000bf35a, 0x0005692b}}}, + {X: Field{[10]uint32{0x02fccf64, 0x02926624, 0x0318e3ba, 0x03789604, 0x033bd278, 0x01f2576f, 0x028772c7, 0x018df6c1, 0x015c0eb4, 0x00031f44}}, Y: Field{[10]uint32{0x0078fee0, 0x01b4ecca, 0x0268d53f, 0x020e566b, 0x0148785d, 0x01e2bc51, 0x02424b84, 0x02c111ea, 0x007b1925, 0x0012aa1d}}}, + {X: Field{[10]uint32{0x01b84966, 0x00bd27ba, 0x03ff989e, 0x001b75fc, 0x011b4f41, 0x029adb24, 0x00b6faf3, 0x03f0b526, 0x0100b703, 0x00165669}}, Y: Field{[10]uint32{0x03473a6a, 0x0198c861, 0x0242640a, 0x030233f8, 0x009100dc, 0x03720a9c, 0x00312820, 0x02a25fe5, 0x02741f5c, 0x0000dc39}}}, + {X: Field{[10]uint32{0x03188cbb, 0x01be2002, 0x01e97368, 0x0080201f, 0x00b81c03, 0x005988ac, 0x003329a7, 0x0171d05a, 0x00520eec, 0x00041d18}}, Y: Field{[10]uint32{0x03272124, 0x01ed8d87, 0x03da601d, 0x01d23738, 0x01242e0d, 0x033d5284, 0x0326b9b9, 0x016630d4, 0x00c09a21, 0x002af975}}}, + {X: Field{[10]uint32{0x03c6b173, 0x0326e48a, 0x03feb3b0, 0x00f1fbb4, 0x017dd862, 0x0016d7e7, 0x0160c463, 0x00bfa384, 0x01393722, 0x0027bacc}}, Y: Field{[10]uint32{0x0323a71d, 0x02588365, 0x00c4b953, 0x02fb439c, 0x030ea71a, 0x02ee86b8, 0x02aabfdb, 0x03563654, 0x01e0110e, 0x0038487c}}}, + {X: Field{[10]uint32{0x02d2cf25, 0x03a6f24a, 0x03a94457, 0x0136f249, 0x037ba49b, 0x009ecf0b, 0x011e80ba, 0x02a72c63, 0x029bf3da, 0x00148366}}, Y: Field{[10]uint32{0x0285181f, 0x02db20e8, 0x030c7610, 0x019446fd, 0x022bab0b, 0x012ea5c1, 0x030ae71b, 0x007ab923, 0x009b1027, 0x003949bd}}}, + {X: Field{[10]uint32{0x02c805f3, 0x00910fdf, 0x01591577, 0x01d42766, 0x007de40f, 0x001ba5e2, 0x02bb2388, 0x0063d45b, 0x03e4c7f7, 0x000e7313}}, Y: Field{[10]uint32{0x023c48d3, 0x0068304e, 0x012e4d19, 0x00dcff24, 0x01bbb957, 0x03d0b79f, 0x01e6693c, 0x03e3cc54, 0x032c5a46, 0x003b2c51}}}, + {X: Field{[10]uint32{0x008d5622, 0x02baeb15, 0x03d2e8b5, 0x03bde946, 0x03e1db07, 0x02fcce06, 0x01586a81, 0x0254d68e, 0x011e6168, 0x0017f1b0}}, Y: Field{[10]uint32{0x01ac1683, 0x03610040, 0x03f300d0, 0x00239b1e, 0x030e05ad, 0x000d9eb2, 0x019ba2db, 0x03676e70, 0x02549aa1, 0x00043a03}}}, + {X: Field{[10]uint32{0x0222580e, 0x018bed73, 0x0388793d, 0x025b4b5b, 0x02c71328, 0x0136f534, 0x012ffde6, 0x0371a5a2, 0x007466ec, 0x003e5320}}, Y: Field{[10]uint32{0x0127db82, 0x0148fd9c, 0x01d4e81e, 0x0114c8dc, 0x029887ec, 0x02d6a07d, 0x014bff6a, 0x00896a46, 0x03dc6785, 0x0017a71f}}}, + {X: Field{[10]uint32{0x00a3d8a5, 0x02ad81f0, 0x02f99123, 0x01a115cf, 0x0126d77d, 0x00fb426b, 0x031274a3, 0x035ba4d0, 0x03e5d872, 0x0016a90c}}, Y: Field{[10]uint32{0x013c2ba7, 0x03dfbddb, 0x02ef4fb5, 0x03d4b675, 0x0116475c, 0x01ca2958, 0x02394aec, 0x039e6866, 0x01fc682a, 0x003773a8}}}, + {X: Field{[10]uint32{0x00c4f21f, 0x0102eb44, 0x01a7a6be, 0x0165340f, 0x025024a9, 0x02c66674, 0x0002068d, 0x03458bf3, 0x006c6ad5, 0x0023332e}}, Y: Field{[10]uint32{0x029dfea0, 0x0049ba9c, 0x03e28f7f, 0x02b20992, 0x014b92dc, 0x0321d629, 0x01bef549, 0x00710da6, 0x02586275, 0x0015fe25}}}, + {X: Field{[10]uint32{0x038fd8e8, 0x0336067c, 0x0352acce, 0x0137f1a5, 0x00f1b0e4, 0x000a1cea, 0x0067ce0f, 0x00070d3c, 0x027f4618, 0x00189833}}, Y: Field{[10]uint32{0x02b4ae17, 0x0213a56c, 0x00198c1a, 0x008e0147, 0x03ecd292, 0x01da87bd, 0x03090497, 0x02d5c69f, 0x002b6fa5, 0x002f0b6a}}}, + }, + { + {X: Field{[10]uint32{0x038fd8e8, 0x0336067c, 0x0352acce, 0x0137f1a5, 0x00f1b0e4, 0x000a1cea, 0x0067ce0f, 0x00070d3c, 0x027f4618, 0x00189833}}, Y: Field{[10]uint32{0x02b4ae17, 0x0213a56c, 0x00198c1a, 0x008e0147, 0x03ecd292, 0x01da87bd, 0x03090497, 0x02d5c69f, 0x002b6fa5, 0x002f0b6a}}}, + {X: Field{[10]uint32{0x01477c2d, 0x019d1bcf, 0x0127e076, 0x01465aab, 0x0316e65c, 0x0213c684, 0x008409be, 0x0069cf7b, 0x024748ad, 0x00217636}}, Y: Field{[10]uint32{0x03d1dd70, 0x02605bf1, 0x015a6207, 0x0080cf13, 0x0094b0a0, 0x007bf1ef, 0x02b53653, 0x019a4161, 0x0353665c, 0x00162522}}}, + {X: Field{[10]uint32{0x01136602, 0x02e91950, 0x03a5bbb0, 0x01203678, 0x0138c46f, 0x008ccecf, 0x0058937f, 0x037f0cf4, 0x03280482, 0x0021f449}}, Y: Field{[10]uint32{0x00af6aac, 0x020f1076, 0x03f7c4f6, 0x01d1bf4e, 0x0387a884, 0x03d9dd14, 0x02a276cf, 0x000f7a49, 0x00870a5a, 0x001c7389}}}, + {X: Field{[10]uint32{0x000b80d9, 0x000c4b5b, 0x007f0485, 0x00403f71, 0x024d1e7e, 0x030fb8fb, 0x00892e9c, 0x012e5a30, 0x0166e7ec, 0x00238a9c}}, Y: Field{[10]uint32{0x02b29f50, 0x0187cab5, 0x0349a49c, 0x02235c18, 0x005297b6, 0x005aa752, 0x02dd29b7, 0x02f964b3, 0x03a9ae2c, 0x003ab6c2}}}, + {X: Field{[10]uint32{0x00c5a916, 0x00175cd2, 0x010f25b2, 0x00354d58, 0x013f5c44, 0x02ad52a8, 0x00acc63d, 0x03a5d1ac, 0x013fe261, 0x003f575f}}, Y: Field{[10]uint32{0x02db8bda, 0x02cdec1e, 0x02faab14, 0x0052f73d, 0x03e5d738, 0x0271ed4b, 0x0343ca67, 0x016c1f4a, 0x02d0eeb5, 0x0003760f}}}, + {X: Field{[10]uint32{0x00e74459, 0x028d722c, 0x036dd674, 0x018e1f76, 0x01fef237, 0x004f22a4, 0x00f46587, 0x015a0164, 0x001d4ec0, 0x000a37de}}, Y: Field{[10]uint32{0x035e656f, 0x001f303b, 0x02f0a8de, 0x029406b9, 0x00a3795b, 0x003c89e5, 0x00db1789, 0x003c5f2c, 0x02a66a13, 0x003c5267}}}, + {X: Field{[10]uint32{0x01f7529c, 0x0264258d, 0x011dd45d, 0x0262d6f5, 0x0138765b, 0x034d10e0, 0x02453c32, 0x009848ae, 0x0010981c, 0x00378375}}, Y: Field{[10]uint32{0x00cd88fe, 0x008300b9, 0x0374063c, 0x031a226d, 0x00178924, 0x035e8d5c, 0x02109822, 0x00517e6c, 0x029d10a2, 0x0035c29b}}}, + {X: Field{[10]uint32{0x004561be, 0x007e8f4b, 0x0190f992, 0x03a04d67, 0x00ee4ab2, 0x01e3e254, 0x00366ecd, 0x03d63b72, 0x035842bf, 0x001da6f1}}, Y: Field{[10]uint32{0x00d9685f, 0x0082ffec, 0x033add59, 0x01d9ede1, 0x0341a177, 0x01cfd751, 0x01ce4cef, 0x020eeb23, 0x03362fe7, 0x0012fe05}}}, + {X: Field{[10]uint32{0x00f76d11, 0x00bd234e, 0x015573c8, 0x003efe14, 0x02151100, 0x0270a4a8, 0x005befc3, 0x03d139a7, 0x008ada4c, 0x002c9b08}}, Y: Field{[10]uint32{0x03b7356b, 0x03002c78, 0x0224bdc1, 0x01967609, 0x03050030, 0x0033590c, 0x004e87d9, 0x034cf3c3, 0x00820949, 0x0007c73e}}}, + {X: Field{[10]uint32{0x008e129e, 0x00e76825, 0x01b10312, 0x02cb00a2, 0x032bd1df, 0x0394f0b7, 0x00f8de28, 0x0133debc, 0x00efb7b2, 0x0019b8ff}}, Y: Field{[10]uint32{0x02e7bbea, 0x02f0d80b, 0x03b5172b, 0x027b4694, 0x035fd7d9, 0x0337e032, 0x00b5bf34, 0x0303d966, 0x034fb770, 0x00082fe2}}}, + {X: Field{[10]uint32{0x029e22db, 0x038ec199, 0x00933f94, 0x03d67e72, 0x02ac993f, 0x00630a53, 0x023bd290, 0x03d48e9f, 0x00b8fc7f, 0x003f3ac5}}, Y: Field{[10]uint32{0x002260a1, 0x01cb6c97, 0x03e4cbf5, 0x01e4e93a, 0x00ad550e, 0x0097c249, 0x018a5a75, 0x02e347f3, 0x033a40d6, 0x00192a9a}}}, + {X: Field{[10]uint32{0x01c71143, 0x0367714a, 0x017ea346, 0x02b113c1, 0x012e7ead, 0x0008fe8d, 0x027ccf90, 0x03a840f2, 0x039622bb, 0x0003ad17}}, Y: Field{[10]uint32{0x0370b136, 0x02336882, 0x01bf4c8a, 0x03a9a8ac, 0x03d65969, 0x00078a15, 0x03601f59, 0x02f43d5c, 0x03585838, 0x0014b10b}}}, + {X: Field{[10]uint32{0x038a2755, 0x02105e68, 0x005506f0, 0x01c59527, 0x0253721a, 0x02d41fea, 0x00175774, 0x0172b157, 0x02623ccd, 0x0013a426}}, Y: Field{[10]uint32{0x03cca3de, 0x02927d88, 0x0000caf7, 0x025348a6, 0x03b6cd53, 0x001d5676, 0x03246dd5, 0x00d6bb3b, 0x02878cce, 0x002b95b6}}}, + {X: Field{[10]uint32{0x0007d7c8, 0x0345234f, 0x0232f00c, 0x01d7e0a7, 0x01e0f196, 0x03cf5226, 0x0070411b, 0x02dcf5a1, 0x008ab230, 0x000f3e48}}, Y: Field{[10]uint32{0x024cee08, 0x02a476b6, 0x0059c0c4, 0x032356e3, 0x009d4684, 0x017059c8, 0x02ce6ca6, 0x02197547, 0x024c15af, 0x003780f1}}}, + {X: Field{[10]uint32{0x003ba64d, 0x01625666, 0x015a3a82, 0x01de2316, 0x02bde60f, 0x02e39038, 0x030a145e, 0x01300efe, 0x015c22e0, 0x0030d9d1}}, Y: Field{[10]uint32{0x022181fd, 0x03323e5a, 0x00f14614, 0x02b285de, 0x0342626a, 0x01365931, 0x00e0e6e8, 0x0180cc20, 0x02d069cb, 0x000e9482}}}, + {X: Field{[10]uint32{0x0037fa2d, 0x00f32348, 0x01c43295, 0x03d5d6ff, 0x03043ec8, 0x02efd040, 0x00348414, 0x036350f6, 0x01e0afc1, 0x003940df}}, Y: Field{[10]uint32{0x01755bda, 0x01772107, 0x01f10e0e, 0x000fb120, 0x01bd5f5b, 0x02e642f7, 0x0398d09f, 0x034ed7e7, 0x034baa94, 0x00115c54}}}, + }, + { + {X: Field{[10]uint32{0x0037fa2d, 0x00f32348, 0x01c43295, 0x03d5d6ff, 0x03043ec8, 0x02efd040, 0x00348414, 0x036350f6, 0x01e0afc1, 0x003940df}}, Y: Field{[10]uint32{0x01755bda, 0x01772107, 0x01f10e0e, 0x000fb120, 0x01bd5f5b, 0x02e642f7, 0x0398d09f, 0x034ed7e7, 0x034baa94, 0x00115c54}}}, + {X: Field{[10]uint32{0x023d34ef, 0x00f231e7, 0x02ddb8c6, 0x01f1e4a8, 0x02c3ab21, 0x00b586cf, 0x00b6cf7d, 0x015253d0, 0x01a467fd, 0x00297803}}, Y: Field{[10]uint32{0x037adb4c, 0x0171738b, 0x000acb85, 0x03f9e424, 0x025b60dc, 0x026fd0f4, 0x01726fe9, 0x02155508, 0x01f5e560, 0x000263f9}}}, + {X: Field{[10]uint32{0x037e7775, 0x02a29b85, 0x015f6388, 0x024e23b6, 0x02b5e155, 0x03d4a46b, 0x00543bac, 0x00cf3b96, 0x023aff96, 0x0027625a}}, Y: Field{[10]uint32{0x02056691, 0x03db4eae, 0x0253befc, 0x01fb8a64, 0x01e899cd, 0x0094249f, 0x02964ed7, 0x02fc2e53, 0x01e43f49, 0x0037646a}}}, + {X: Field{[10]uint32{0x03b91252, 0x00dc5835, 0x0172ae67, 0x00b911dd, 0x006d4afd, 0x0326fef1, 0x019f4bb1, 0x00ad00d4, 0x01f5ef3a, 0x002a6505}}, Y: Field{[10]uint32{0x03edc264, 0x00ddeb12, 0x00ddd73a, 0x02b5643d, 0x02899a16, 0x013dbdad, 0x022f10f2, 0x03e12ee7, 0x024cae81, 0x0020b439}}}, + {X: Field{[10]uint32{0x002a3293, 0x0381378f, 0x0076c5fd, 0x01bba40d, 0x015688b8, 0x00a0bd33, 0x02b0a573, 0x00de4b43, 0x00ee7116, 0x0020c9ee}}, Y: Field{[10]uint32{0x020df9bd, 0x02153863, 0x02a416bc, 0x02d3b8c9, 0x0096afda, 0x009e5c21, 0x03b3ea66, 0x02a63862, 0x02266ee0, 0x0001265f}}}, + {X: Field{[10]uint32{0x00904ed3, 0x015fc7a3, 0x01784159, 0x01624161, 0x00df2a74, 0x0049c8e1, 0x03f8e643, 0x00637fe5, 0x002d2db8, 0x000033e3}}, Y: Field{[10]uint32{0x016f77c1, 0x02658ede, 0x02827b00, 0x01e74cbd, 0x0122991d, 0x0146f604, 0x01d5c1bd, 0x03510467, 0x000ea781, 0x002aab40}}}, + {X: Field{[10]uint32{0x0162c042, 0x006c9b11, 0x03b1a242, 0x008d2e37, 0x02092d23, 0x03e6a3b5, 0x016661d8, 0x02c5a25f, 0x02aa2a6d, 0x0016b90a}}, Y: Field{[10]uint32{0x0379269c, 0x017337e3, 0x018dbf90, 0x025441f3, 0x0294e0db, 0x000e2752, 0x01c1ddc6, 0x00147aad, 0x027c05ff, 0x0026764e}}}, + {X: Field{[10]uint32{0x02540f17, 0x01196d9a, 0x0132bd8c, 0x01c17c30, 0x004c750d, 0x023e4d7e, 0x00edde09, 0x0347f1f6, 0x029f9e4f, 0x002d5bd3}}, Y: Field{[10]uint32{0x0200102d, 0x00bf2b80, 0x0285446a, 0x018f2f32, 0x0121d429, 0x00160b47, 0x01c11adf, 0x02a15b4f, 0x013429cc, 0x000cba39}}}, + {X: Field{[10]uint32{0x0285af61, 0x02204a17, 0x02766b34, 0x008b752b, 0x034e8ed7, 0x01b086c3, 0x02eb68ff, 0x0323ad66, 0x02e426a1, 0x0024b08e}}, Y: Field{[10]uint32{0x036a2b09, 0x008d9a70, 0x02fed4e7, 0x020ad8a1, 0x012d23ad, 0x01ce355e, 0x03217d5c, 0x006ed027, 0x008f0155, 0x0010533e}}}, + {X: Field{[10]uint32{0x01e5d1b3, 0x02a92096, 0x02a3e280, 0x0227f5b2, 0x0048c9b7, 0x003f36cc, 0x027e4c6f, 0x0120ef47, 0x0151caf6, 0x000eae94}}, Y: Field{[10]uint32{0x02f30087, 0x02d9e350, 0x02ee6a85, 0x01674b79, 0x01e18463, 0x01f5cb32, 0x024ec804, 0x01474241, 0x0223bff2, 0x0023079c}}}, + {X: Field{[10]uint32{0x03b5eba8, 0x02bc6cb1, 0x02a36ce2, 0x031fe463, 0x022dabed, 0x02be37d0, 0x010f4176, 0x037c4223, 0x008c76af, 0x003fb958}}, Y: Field{[10]uint32{0x010b9b5c, 0x00574da3, 0x014793f5, 0x010afe41, 0x02e380ff, 0x00a1f053, 0x01402f99, 0x0162bec4, 0x019134fe, 0x000e01d6}}}, + {X: Field{[10]uint32{0x00f8cffd, 0x02d66223, 0x01ae61b2, 0x0056de91, 0x01432e6b, 0x01e6f762, 0x01afb88f, 0x02306f51, 0x037f1fe7, 0x00002026}}, Y: Field{[10]uint32{0x01b5f32f, 0x03516863, 0x01f93d91, 0x03eb64ae, 0x0112a340, 0x0394bf72, 0x008c836d, 0x02a18c0a, 0x0022bf41, 0x003e05f8}}}, + {X: Field{[10]uint32{0x0063caf4, 0x00ee92cf, 0x03d5281e, 0x02aca3d4, 0x00a28ff3, 0x018a9abf, 0x02113b4c, 0x019f9882, 0x00eb92e6, 0x0010b951}}, Y: Field{[10]uint32{0x029c29c8, 0x02bb0265, 0x005f1187, 0x01edafbf, 0x0073a50e, 0x01d0579e, 0x01f220c1, 0x0319c7dc, 0x00e0f91c, 0x0027fe15}}}, + {X: Field{[10]uint32{0x03ed9ef9, 0x006417bd, 0x0063d6c6, 0x02803bc3, 0x02ad2ba5, 0x01ff064a, 0x01f78494, 0x03529d07, 0x02ddd352, 0x000cb779}}, Y: Field{[10]uint32{0x031fb871, 0x02e11a00, 0x034b21ab, 0x00de7263, 0x0059ec1b, 0x0356307d, 0x036a4f94, 0x019ef388, 0x03dc3420, 0x0010745e}}}, + {X: Field{[10]uint32{0x020f09a1, 0x00af6617, 0x0328380a, 0x03c6e500, 0x02f0a109, 0x011c03bf, 0x0196ed2a, 0x00b38e0e, 0x03b66553, 0x001ebb60}}, Y: Field{[10]uint32{0x01857d73, 0x036337a1, 0x00a54045, 0x00c03cfd, 0x02d88b2f, 0x0040cb63, 0x01afd0ab, 0x03bdf1f7, 0x005f9a31, 0x003d6e15}}}, + {X: Field{[10]uint32{0x00fce725, 0x019a82b9, 0x005b7258, 0x03471a9b, 0x00e7e8db, 0x03c5dc6d, 0x02a905e8, 0x001eb7d7, 0x02b0f4a2, 0x003818dc}}, Y: Field{[10]uint32{0x02ee31dd, 0x000d3e53, 0x00870b27, 0x01de1c41, 0x00d7484a, 0x03569223, 0x0227bb2a, 0x0233f84a, 0x0174bce1, 0x001ea422}}}, + }, + { + {X: Field{[10]uint32{0x00fce725, 0x019a82b9, 0x005b7258, 0x03471a9b, 0x00e7e8db, 0x03c5dc6d, 0x02a905e8, 0x001eb7d7, 0x02b0f4a2, 0x003818dc}}, Y: Field{[10]uint32{0x02ee31dd, 0x000d3e53, 0x00870b27, 0x01de1c41, 0x00d7484a, 0x03569223, 0x0227bb2a, 0x0233f84a, 0x0174bce1, 0x001ea422}}}, + {X: Field{[10]uint32{0x02d2ff3e, 0x026bb90f, 0x02d3cfe0, 0x036d3b1b, 0x00045ebf, 0x03eb4fcf, 0x00dbd304, 0x01ae3e72, 0x034ca204, 0x0003ab04}}, Y: Field{[10]uint32{0x01210988, 0x0081881f, 0x01376e17, 0x025adfc8, 0x01ac19f6, 0x00ac45e6, 0x03f103bf, 0x026d0916, 0x01be7935, 0x001258c3}}}, + {X: Field{[10]uint32{0x02328d6a, 0x02a06236, 0x0018bdba, 0x00ea56b7, 0x03b24d77, 0x016c23e9, 0x00689918, 0x0138028d, 0x005ba623, 0x003198f0}}, Y: Field{[10]uint32{0x02c9b8c0, 0x002edaaf, 0x039cc23b, 0x03a944af, 0x03dd8551, 0x01d5c4c5, 0x01afdcf2, 0x0070e34e, 0x018d5f72, 0x000ccc7a}}}, + {X: Field{[10]uint32{0x03bfa4dc, 0x01c1b937, 0x01b17476, 0x01e01321, 0x03f5948a, 0x02b6ed07, 0x012119d7, 0x03a8660e, 0x0190731f, 0x00359e21}}, Y: Field{[10]uint32{0x013b5406, 0x02f35aef, 0x0207cca7, 0x03137726, 0x026206f1, 0x008704ea, 0x00ef5c6d, 0x018f1250, 0x00c89d50, 0x000a3aaa}}}, + {X: Field{[10]uint32{0x0196de2f, 0x0072120e, 0x01114bc9, 0x00bb82c9, 0x0177cedf, 0x0283f93a, 0x02b30dee, 0x01a91673, 0x0282dfb8, 0x0034ff09}}, Y: Field{[10]uint32{0x00526f8c, 0x02489075, 0x03f168c4, 0x02637dea, 0x024e59b4, 0x013de076, 0x00b4754d, 0x002863da, 0x0399a45f, 0x00313c37}}}, + {X: Field{[10]uint32{0x02143fb0, 0x00d69958, 0x005dd6dc, 0x020c2f08, 0x03a9fb92, 0x011e6565, 0x03aff339, 0x020de433, 0x001c33af, 0x000a4ab7}}, Y: Field{[10]uint32{0x036ad01c, 0x036d8f38, 0x01d4d8a9, 0x00b5cd7a, 0x02d83e66, 0x03313b3d, 0x031968a0, 0x02d91fcf, 0x021bcee0, 0x00281c99}}}, + {X: Field{[10]uint32{0x03e697ea, 0x03123440, 0x003e85c6, 0x03ee617e, 0x019ce678, 0x028feaf4, 0x00a1fec9, 0x03008df7, 0x0343feb2, 0x00305e92}}, Y: Field{[10]uint32{0x02dc6c87, 0x00ee1f77, 0x002ab0ee, 0x02d5fe7c, 0x0296e1a1, 0x025807eb, 0x02178f71, 0x0165532b, 0x002d55ab, 0x000e4d57}}}, + {X: Field{[10]uint32{0x008ff9b3, 0x017ed039, 0x0301a727, 0x00815666, 0x03c7b1a6, 0x00adc752, 0x03f210f1, 0x01025d2a, 0x00cbd9a0, 0x001a4c3f}}, Y: Field{[10]uint32{0x02e96a4e, 0x036ad7e3, 0x0051acfd, 0x004f92b3, 0x00090f9b, 0x01d7db5e, 0x030fcdb8, 0x0007ab68, 0x0294b947, 0x001fc0ab}}}, + {X: Field{[10]uint32{0x0163da1b, 0x00b0c08c, 0x0231182d, 0x03983e4e, 0x029a0ede, 0x03f047f7, 0x009349d7, 0x0242d1a3, 0x037ca267, 0x0023d862}}, Y: Field{[10]uint32{0x03bdd76e, 0x00c48440, 0x036e7c7f, 0x01a8c926, 0x026450c6, 0x01eb1690, 0x03bda74d, 0x03adbad7, 0x0325f08b, 0x001e08cf}}}, + {X: Field{[10]uint32{0x010cec10, 0x02c26d53, 0x016b084f, 0x03f2ab7b, 0x02ba25f0, 0x00b4f39c, 0x02b0e61b, 0x0079a6ba, 0x029ca332, 0x0013654a}}, Y: Field{[10]uint32{0x03d06932, 0x00dac4ee, 0x014da8ee, 0x037f213d, 0x02ba4aa2, 0x01ed72d3, 0x002aec78, 0x009e7915, 0x004a66dd, 0x002c5e06}}}, + {X: Field{[10]uint32{0x02c8ae90, 0x01643f83, 0x005deee8, 0x024ba2ef, 0x00cfb26b, 0x0320fc6e, 0x02d5b8da, 0x0079bae1, 0x00f15b7a, 0x0025e630}}, Y: Field{[10]uint32{0x012844d3, 0x02b0bab9, 0x008e27a9, 0x016f40c6, 0x02e2e496, 0x03e71cef, 0x02ec9494, 0x00bb4f74, 0x02aa75a4, 0x002e9038}}}, + {X: Field{[10]uint32{0x00b90e0b, 0x03079b0c, 0x00a4589e, 0x00e7ec25, 0x03d6ff1d, 0x02719d6c, 0x01c804a5, 0x019f4ffb, 0x03f9ad54, 0x00290d41}}, Y: Field{[10]uint32{0x021fdc20, 0x0002e64e, 0x01b5a3f0, 0x00d94d66, 0x00dc2a20, 0x0102fa30, 0x02d07ccb, 0x035c6850, 0x01c94c3f, 0x001f23cb}}}, + {X: Field{[10]uint32{0x01d66b7f, 0x0065e3c4, 0x01c8105a, 0x0141461f, 0x017aa692, 0x0224a11d, 0x00f1b90b, 0x00b59d1f, 0x02e3fb5a, 0x003f7e9b}}, Y: Field{[10]uint32{0x00e5178b, 0x023e019e, 0x00de9daa, 0x03744f5e, 0x00d846f9, 0x00f68631, 0x000c1c9a, 0x02636e4f, 0x031e2249, 0x0013673c}}}, + {X: Field{[10]uint32{0x01c0d7ad, 0x01ad6196, 0x0093ab83, 0x036de8ad, 0x011ddb64, 0x01d2799c, 0x0211ca1a, 0x03eeebbf, 0x02cd4b7b, 0x001cac13}}, Y: Field{[10]uint32{0x0323cd97, 0x039bfd19, 0x034fb2ef, 0x01a0771b, 0x0196265d, 0x0364d340, 0x01d452d6, 0x028d633b, 0x03ea0e64, 0x001a196c}}}, + {X: Field{[10]uint32{0x0265bcf0, 0x01d5e124, 0x03d30b80, 0x01e10471, 0x0269ce2b, 0x0073c883, 0x01ea9a46, 0x02790eb7, 0x0238de22, 0x003f5633}}, Y: Field{[10]uint32{0x03996292, 0x039ea73a, 0x00d1df33, 0x03f8a3c7, 0x0387261b, 0x0121793e, 0x0382ab9a, 0x00856f54, 0x01e53763, 0x003ff829}}}, + {X: Field{[10]uint32{0x00559754, 0x035a4234, 0x0358540a, 0x03778a8f, 0x0204b10b, 0x03033808, 0x010bbf9d, 0x03514d63, 0x02715cd5, 0x00084f1e}}, Y: Field{[10]uint32{0x00b458f2, 0x00b09d4d, 0x03eeddff, 0x03d7cda9, 0x00bb4850, 0x0116e864, 0x013ad062, 0x018941c0, 0x010b5ae4, 0x0012db6b}}}, + }, + { + {X: Field{[10]uint32{0x00559754, 0x035a4234, 0x0358540a, 0x03778a8f, 0x0204b10b, 0x03033808, 0x010bbf9d, 0x03514d63, 0x02715cd5, 0x00084f1e}}, Y: Field{[10]uint32{0x00b458f2, 0x00b09d4d, 0x03eeddff, 0x03d7cda9, 0x00bb4850, 0x0116e864, 0x013ad062, 0x018941c0, 0x010b5ae4, 0x0012db6b}}}, + {X: Field{[10]uint32{0x02c87fac, 0x00e25783, 0x03cf0899, 0x01d188b9, 0x020d1ab9, 0x00c8d203, 0x02e9fed8, 0x0269fd9a, 0x008132b4, 0x00071795}}, Y: Field{[10]uint32{0x03c2d4ef, 0x035ecf57, 0x0324c555, 0x03ac9bf8, 0x03a3deac, 0x03530ab4, 0x03959fa1, 0x011a3cae, 0x020f837f, 0x0013ff3d}}}, + {X: Field{[10]uint32{0x0205dccc, 0x03600467, 0x0293e532, 0x03b53066, 0x02ae3fa3, 0x0254f45c, 0x006e096b, 0x0280c255, 0x02e1753d, 0x002e33bd}}, Y: Field{[10]uint32{0x006d5750, 0x012833f3, 0x02813301, 0x030da9ad, 0x01df757f, 0x0134af66, 0x00d4a74e, 0x026efda9, 0x0260a6cc, 0x000c0ae2}}}, + {X: Field{[10]uint32{0x00531dbc, 0x03f2e875, 0x00970e20, 0x0067fb57, 0x021f901c, 0x002ef1f3, 0x036e9421, 0x019a377b, 0x010602c5, 0x001189db}}, Y: Field{[10]uint32{0x0286b8e2, 0x01cc0265, 0x03c99af8, 0x03efff86, 0x01498bad, 0x01c37b66, 0x02922875, 0x01d6e128, 0x0324d44c, 0x000383df}}}, + {X: Field{[10]uint32{0x033bb31a, 0x037fb84d, 0x017b485b, 0x01ad7f6e, 0x01701f7b, 0x03aed7d2, 0x02a0bde2, 0x01ce1780, 0x03e779b4, 0x0000fecc}}, Y: Field{[10]uint32{0x01215c9e, 0x032f9a5f, 0x000d4e34, 0x01db11d9, 0x03c65a7c, 0x02eed5ca, 0x00c161aa, 0x03f8a078, 0x0152548e, 0x003cdab6}}}, + {X: Field{[10]uint32{0x006df50d, 0x03bb405a, 0x012bd0c4, 0x00a871be, 0x00cd5e79, 0x03020818, 0x03d87442, 0x007c0b5b, 0x0230935c, 0x000e95c5}}, Y: Field{[10]uint32{0x0059679b, 0x0162ca3a, 0x01a11d21, 0x007aede0, 0x01e0aaf8, 0x015c2837, 0x02f3ff2e, 0x03ccbd45, 0x0073b599, 0x0021784e}}}, + {X: Field{[10]uint32{0x019a4ab4, 0x01457af7, 0x037c0a5b, 0x0306156e, 0x02717c36, 0x0343de8d, 0x0316f7b4, 0x00f84587, 0x00d109ec, 0x0012c5df}}, Y: Field{[10]uint32{0x035ab6f7, 0x0377f918, 0x01f558aa, 0x0157c5d0, 0x006e37e2, 0x00d89ad2, 0x028f6729, 0x03e997f6, 0x02e9a5e2, 0x000fb259}}}, + {X: Field{[10]uint32{0x022f001d, 0x013bc4d4, 0x01899611, 0x02b371e3, 0x036850e0, 0x030c6458, 0x025eb211, 0x03093d39, 0x00eca7a6, 0x003bfa9a}}, Y: Field{[10]uint32{0x03bc4415, 0x021067dc, 0x00771c12, 0x027ece12, 0x03e41395, 0x00dc6685, 0x0150307a, 0x00f05368, 0x03869d58, 0x002aae11}}}, + {X: Field{[10]uint32{0x001c23a4, 0x01beca6c, 0x01cf56f4, 0x01611e92, 0x01c22a41, 0x026e735d, 0x0203829b, 0x01e81b0a, 0x035206a2, 0x0017a1c0}}, Y: Field{[10]uint32{0x00d986f9, 0x01e65ac4, 0x00fda121, 0x021d2933, 0x01a2171d, 0x038b1b8b, 0x01755d1a, 0x0248879c, 0x004efb9c, 0x0016e599}}}, + {X: Field{[10]uint32{0x0291dc6e, 0x007bc8b0, 0x01fbd8b4, 0x02a537ca, 0x02661fa8, 0x028f8e3c, 0x03136c23, 0x016c9171, 0x0347a3f1, 0x0033c2f7}}, Y: Field{[10]uint32{0x037a8196, 0x00f05136, 0x032a99c7, 0x03f4aed7, 0x02b4fc6c, 0x015e463d, 0x00523b4e, 0x03d44693, 0x001c6e61, 0x000e30b8}}}, + {X: Field{[10]uint32{0x007b0c66, 0x03cd7480, 0x006fb1f3, 0x039195b2, 0x0034a7fe, 0x002b3add, 0x032244f6, 0x01a02911, 0x0301930d, 0x00395170}}, Y: Field{[10]uint32{0x01f2d470, 0x03d5f49c, 0x0239dd87, 0x02386d68, 0x0397e582, 0x02566f2f, 0x01c6fda3, 0x025579f9, 0x000e8c62, 0x00381a8d}}}, + {X: Field{[10]uint32{0x008f7e09, 0x028ad9fe, 0x012cde2a, 0x01e6e9f6, 0x02b3a037, 0x0117702f, 0x00e12e5a, 0x017f2ef6, 0x023d4f20, 0x00179aa1}}, Y: Field{[10]uint32{0x00dfca97, 0x018a19d2, 0x00fe3bbd, 0x00dc8ed3, 0x00a68e50, 0x01a5008d, 0x004a8d1f, 0x023b7f11, 0x02078a38, 0x003095c6}}}, + {X: Field{[10]uint32{0x03648bba, 0x020642e0, 0x007444a5, 0x02c1a70f, 0x0082a0f0, 0x03c06ce6, 0x033ee225, 0x03d60284, 0x02157a54, 0x002ca910}}, Y: Field{[10]uint32{0x00fb6452, 0x03ead280, 0x017bb246, 0x00547270, 0x01c0d855, 0x03ef5f8c, 0x01fbc978, 0x0199867a, 0x03c2b693, 0x003f93d7}}}, + {X: Field{[10]uint32{0x0304ab91, 0x039d78ac, 0x01557679, 0x00650914, 0x0325a40c, 0x02de0470, 0x02383063, 0x00452e29, 0x03ea8fe5, 0x0001e87f}}, Y: Field{[10]uint32{0x0397e554, 0x03d18ed9, 0x01d9d35a, 0x03a86402, 0x01287e5d, 0x00d12965, 0x010437c4, 0x01f151a4, 0x0021b0fd, 0x00384301}}}, + {X: Field{[10]uint32{0x03ab27d0, 0x03748bba, 0x0103fcf6, 0x03e8b114, 0x03f70b41, 0x02365c01, 0x02970191, 0x00e1946e, 0x020f3d45, 0x0006e423}}, Y: Field{[10]uint32{0x00d3d110, 0x0219d790, 0x011b571e, 0x024d61f9, 0x02b5bbca, 0x005f12e6, 0x0357c918, 0x01ad79bc, 0x025eec46, 0x0026db58}}}, + {X: Field{[10]uint32{0x00fbd53c, 0x030e8ec2, 0x02cddf0c, 0x01c2b718, 0x03e2838c, 0x015066a1, 0x03b9352a, 0x02cd3a36, 0x032a7af4, 0x00139f09}}, Y: Field{[10]uint32{0x03dcaae6, 0x00e50605, 0x01d33e0b, 0x0052ffdf, 0x03530b96, 0x037bda06, 0x02fd09f6, 0x002c6385, 0x00766c9d, 0x0005dd27}}}, + }, + { + {X: Field{[10]uint32{0x00fbd53c, 0x030e8ec2, 0x02cddf0c, 0x01c2b718, 0x03e2838c, 0x015066a1, 0x03b9352a, 0x02cd3a36, 0x032a7af4, 0x00139f09}}, Y: Field{[10]uint32{0x03dcaae6, 0x00e50605, 0x01d33e0b, 0x0052ffdf, 0x03530b96, 0x037bda06, 0x02fd09f6, 0x002c6385, 0x00766c9d, 0x0005dd27}}}, + {X: Field{[10]uint32{0x006e1b4d, 0x00879b9f, 0x00790e28, 0x01686fbe, 0x009b11f2, 0x038e1767, 0x00a269f4, 0x02223c9a, 0x03b02696, 0x00226405}}, Y: Field{[10]uint32{0x0014ab2b, 0x02baf6b6, 0x03212009, 0x0303e4ca, 0x02e4e51b, 0x018d62fe, 0x00579833, 0x00d3c2ed, 0x00dab5b3, 0x0010eb8b}}}, + {X: Field{[10]uint32{0x0121b3ff, 0x02611939, 0x0350cee2, 0x005fa6a9, 0x01233c07, 0x026b8929, 0x0244d2be, 0x011571d7, 0x023010c9, 0x00009213}}, Y: Field{[10]uint32{0x0269da7e, 0x02b92e40, 0x008bbcc1, 0x037a48eb, 0x03ad7006, 0x02cb43ba, 0x02c2b3c2, 0x038c341f, 0x00a0aa23, 0x00258674}}}, + {X: Field{[10]uint32{0x025f712f, 0x018d685f, 0x003a8af2, 0x02fe46d6, 0x022831f5, 0x00c89fc3, 0x034728e6, 0x017f52a3, 0x00f76e90, 0x0019fd91}}, Y: Field{[10]uint32{0x007160e5, 0x02b2d79c, 0x02198d68, 0x0223df4d, 0x005e0e14, 0x0161b3de, 0x01adeb7b, 0x017413c1, 0x028f6644, 0x002e0cf5}}}, + {X: Field{[10]uint32{0x004ba7b9, 0x02de7ea0, 0x01751f96, 0x01c0c1d0, 0x0220d6a4, 0x01cb2553, 0x039b70d6, 0x03395fbd, 0x0126cfb6, 0x0005b071}}, Y: Field{[10]uint32{0x005bd741, 0x02f8e947, 0x029cc475, 0x0006f726, 0x02ec755c, 0x0322a537, 0x02627459, 0x0050e418, 0x037c3403, 0x0036c55f}}}, + {X: Field{[10]uint32{0x00692fd1, 0x01825850, 0x00dfe2b2, 0x01b32f64, 0x02dcf43c, 0x02c7c643, 0x00aadef4, 0x03fe0038, 0x00b49901, 0x001394f2}}, Y: Field{[10]uint32{0x028625e0, 0x024c39cc, 0x01753934, 0x03695ff2, 0x01a87a50, 0x01c86768, 0x02cd709a, 0x02807861, 0x024f4d41, 0x00375b8f}}}, + {X: Field{[10]uint32{0x036683fa, 0x01921ea8, 0x00825e83, 0x014e03b0, 0x0295821b, 0x01149ed9, 0x0289ce77, 0x00c6be1e, 0x00d753f9, 0x0000e5cf}}, Y: Field{[10]uint32{0x034a577f, 0x03ecaddf, 0x001dedf5, 0x03863fa6, 0x00d77884, 0x00ad689b, 0x03e12b63, 0x028e8d90, 0x022cc30c, 0x000e33d6}}}, + {X: Field{[10]uint32{0x0389a762, 0x0098fb4e, 0x02b8dc10, 0x00c04bb9, 0x02930dc9, 0x01a2d1c4, 0x000a0549, 0x009557ea, 0x036c9365, 0x000c9fe1}}, Y: Field{[10]uint32{0x01203301, 0x03f6566e, 0x03dfe9c9, 0x01c3faf5, 0x01755350, 0x038665ee, 0x01969255, 0x01009ac2, 0x00eab352, 0x002cb501}}}, + {X: Field{[10]uint32{0x00bf6f06, 0x02ce6670, 0x03b57180, 0x00c89410, 0x01713c13, 0x000815d9, 0x02c04f4b, 0x03c54470, 0x03ba72ec, 0x002e9aa6}}, Y: Field{[10]uint32{0x001db551, 0x02fbdc1e, 0x03aafe32, 0x03deb1a5, 0x029e5d14, 0x01562f63, 0x0020bf2e, 0x0046c0c8, 0x0238b34a, 0x0004ddc7}}}, + {X: Field{[10]uint32{0x01637b39, 0x03c46655, 0x01fa2799, 0x02617b1d, 0x026c52b9, 0x0300c05a, 0x015b9286, 0x02b1730f, 0x01da6b99, 0x00033cf1}}, Y: Field{[10]uint32{0x02852a40, 0x01e8f5e8, 0x01c3cd24, 0x00148f09, 0x0137acd3, 0x00600929, 0x00671adc, 0x026d904d, 0x012fd9f3, 0x0000b3ed}}}, + {X: Field{[10]uint32{0x01231a43, 0x03be7c1c, 0x003b9fd1, 0x035996b5, 0x0344d514, 0x0137910b, 0x02ed9506, 0x01374b62, 0x00cc27cc, 0x000d716f}}, Y: Field{[10]uint32{0x0220c8f6, 0x01cb9145, 0x030ae7db, 0x033018f3, 0x014cf7a4, 0x01be9627, 0x00e5820b, 0x011b39cd, 0x01723b97, 0x00038d9d}}}, + {X: Field{[10]uint32{0x0149827b, 0x038d5f6d, 0x03d6148c, 0x03cf8486, 0x01fcc4f7, 0x038b38c4, 0x0212e06d, 0x01d7cea0, 0x00f5e0d3, 0x003391f4}}, Y: Field{[10]uint32{0x03aed097, 0x032697fb, 0x029df43c, 0x00bfc15d, 0x0329e659, 0x016e6b43, 0x009139fe, 0x00352756, 0x00fb9963, 0x000571a6}}}, + {X: Field{[10]uint32{0x01d40609, 0x002f15bf, 0x00d76bf4, 0x02603607, 0x02c74190, 0x01620d5a, 0x022f12fc, 0x021af284, 0x00245c55, 0x003f51e7}}, Y: Field{[10]uint32{0x0264ca53, 0x00bc4d9a, 0x024739de, 0x035c9872, 0x019113ae, 0x0326107f, 0x00ad7a43, 0x02bfbfcb, 0x03b52694, 0x000c1a73}}}, + {X: Field{[10]uint32{0x0148be00, 0x03f9c55f, 0x03e13b38, 0x03a85a63, 0x03f60682, 0x03e550f1, 0x030e2207, 0x010bcd3a, 0x00bd4a8e, 0x0024c6fe}}, Y: Field{[10]uint32{0x0344f452, 0x01aa44c7, 0x01df5158, 0x01aacccf, 0x026a43ee, 0x00503afb, 0x03388e61, 0x00820f46, 0x03f0489c, 0x003c454e}}}, + {X: Field{[10]uint32{0x03799a7f, 0x01c0bd4a, 0x028424db, 0x03354ee3, 0x004f18b6, 0x03cb1f55, 0x02d8eb9a, 0x036192f7, 0x002a3acc, 0x001b1000}}, Y: Field{[10]uint32{0x03c81e32, 0x03320b34, 0x003f68b5, 0x01320812, 0x01c07abd, 0x0387772f, 0x00b836a0, 0x00d6f9a4, 0x001530b6, 0x002570b7}}}, + {X: Field{[10]uint32{0x00fb27b6, 0x009f8a10, 0x00576324, 0x02caf90c, 0x01c76e3d, 0x005a1aa9, 0x03238ad6, 0x022c6c43, 0x023dbe77, 0x003fa9d3}}, Y: Field{[10]uint32{0x023cb96f, 0x034f6dfc, 0x03b77701, 0x01ae5cfd, 0x03126b59, 0x032dabe4, 0x03674dec, 0x004ca5f3, 0x00db9b0b, 0x001b815a}}}, + }, + { + {X: Field{[10]uint32{0x00fb27b6, 0x009f8a10, 0x00576324, 0x02caf90c, 0x01c76e3d, 0x005a1aa9, 0x03238ad6, 0x022c6c43, 0x023dbe77, 0x003fa9d3}}, Y: Field{[10]uint32{0x023cb96f, 0x034f6dfc, 0x03b77701, 0x01ae5cfd, 0x03126b59, 0x032dabe4, 0x03674dec, 0x004ca5f3, 0x00db9b0b, 0x001b815a}}}, + {X: Field{[10]uint32{0x039756e4, 0x025f2587, 0x030488fd, 0x039778dc, 0x02bb570e, 0x003a3343, 0x00e03d85, 0x0203fc60, 0x01c83042, 0x003b6510}}, Y: Field{[10]uint32{0x033abfae, 0x03827e4f, 0x0298bff0, 0x01d3f937, 0x0209f237, 0x02c4e447, 0x02176128, 0x03e866be, 0x029efe8b, 0x000f6fa7}}}, + {X: Field{[10]uint32{0x02889756, 0x0206ba6f, 0x00bb25dd, 0x0265ec01, 0x03f27b64, 0x01c6267c, 0x02cd97b2, 0x03faa089, 0x03c33211, 0x001d8ba2}}, Y: Field{[10]uint32{0x00a6b774, 0x0096781f, 0x03a5e25e, 0x00c52213, 0x031972db, 0x0260b8d1, 0x03cc4f14, 0x03a5f0f1, 0x00260af3, 0x00300a25}}}, + {X: Field{[10]uint32{0x011cf119, 0x02b40cf5, 0x00d3015b, 0x03613ead, 0x015b10bd, 0x012d21d4, 0x03ed3f62, 0x01f0ff27, 0x018ee67a, 0x000a765a}}, Y: Field{[10]uint32{0x01056339, 0x021d015d, 0x002963c8, 0x003a4e9f, 0x03b89c94, 0x013c725b, 0x03a12540, 0x00ad149d, 0x00517dc8, 0x001ff40b}}}, + {X: Field{[10]uint32{0x0175d2ea, 0x01d7a5c2, 0x028ea26f, 0x03e84053, 0x011e52ac, 0x00c23d2a, 0x019bdbb2, 0x0254d238, 0x0147df60, 0x0037c1df}}, Y: Field{[10]uint32{0x01936f95, 0x030b678c, 0x01277aa3, 0x02e13ef7, 0x008a1ec5, 0x0228949f, 0x008425c9, 0x01fd1093, 0x028800ef, 0x003e185e}}}, + {X: Field{[10]uint32{0x02714560, 0x01602969, 0x006c2875, 0x0009f95b, 0x00247f21, 0x00696a17, 0x007ef64f, 0x034dae75, 0x0275579a, 0x000e2e0a}}, Y: Field{[10]uint32{0x0374299e, 0x021ccd29, 0x02284ada, 0x00efbdc5, 0x017d94f2, 0x00590d16, 0x03f56346, 0x007bd0a2, 0x02976f26, 0x003e7629}}}, + {X: Field{[10]uint32{0x004c92d7, 0x01247eef, 0x011b45b8, 0x01bb950e, 0x0135db4d, 0x00d2c50a, 0x017dea83, 0x03680cb8, 0x01758bd3, 0x0027cf9f}}, Y: Field{[10]uint32{0x014906dd, 0x02eff3ec, 0x021186cb, 0x000f5a53, 0x02452a23, 0x02eac540, 0x0062b21c, 0x0119ad62, 0x001ea77d, 0x003b34a1}}}, + {X: Field{[10]uint32{0x03422491, 0x031114df, 0x00cff467, 0x012a1818, 0x01fd453e, 0x00d6028c, 0x03fb7bd3, 0x024db5bc, 0x03d05013, 0x00049ad5}}, Y: Field{[10]uint32{0x01a3ef84, 0x00c7c667, 0x01347afa, 0x030c2fce, 0x00e148ba, 0x00afcfec, 0x004a3eba, 0x018b0b8f, 0x00130616, 0x003069f7}}}, + {X: Field{[10]uint32{0x02a8c483, 0x0035ccac, 0x00ac35ae, 0x02231410, 0x01174b0c, 0x03be54a0, 0x038c3d22, 0x033e7b70, 0x015d7b5c, 0x0028331e}}, Y: Field{[10]uint32{0x02cc6ba9, 0x019d1564, 0x03605509, 0x006f7da4, 0x006b348f, 0x008c77de, 0x0374fc97, 0x021cfb88, 0x0122f8b3, 0x002af0c0}}}, + {X: Field{[10]uint32{0x02faf403, 0x01588e8e, 0x03576051, 0x03ee5eb5, 0x0338a0ae, 0x02282d6f, 0x00faffac, 0x007d59c3, 0x0179b9e8, 0x00068904}}, Y: Field{[10]uint32{0x00d79a16, 0x02db9039, 0x0360d590, 0x03d05e37, 0x002c8177, 0x02416ddb, 0x03f27493, 0x01030b12, 0x00c0a867, 0x00238728}}}, + {X: Field{[10]uint32{0x01dd3aee, 0x03c6daf1, 0x012f2170, 0x022a3e5b, 0x0213153a, 0x01aa5db2, 0x0222a9ac, 0x031f3383, 0x00a51553, 0x001b4714}}, Y: Field{[10]uint32{0x01f597f7, 0x00d5393f, 0x013adfee, 0x002aa3b5, 0x00851e31, 0x00a1f51d, 0x03272002, 0x037f725d, 0x008e06ab, 0x002bffc5}}}, + {X: Field{[10]uint32{0x03720b26, 0x00bac126, 0x03cd0762, 0x017e6333, 0x0026f283, 0x004e4188, 0x006bbed4, 0x01a3b87d, 0x01ae9ac9, 0x000f8431}}, Y: Field{[10]uint32{0x01d92db5, 0x03a631eb, 0x01e43346, 0x02936f82, 0x00e2ff79, 0x01c8578a, 0x00665b28, 0x0222456a, 0x02cffe42, 0x0031cd71}}}, + {X: Field{[10]uint32{0x00a6d0bb, 0x032a6df9, 0x02fdc678, 0x008bd686, 0x03659d31, 0x02299063, 0x011a6d8a, 0x03e7cfcc, 0x01618b97, 0x001797c7}}, Y: Field{[10]uint32{0x0033eaf9, 0x00e11e44, 0x0253a168, 0x00b941bd, 0x0272555f, 0x0139c876, 0x00f6bcd0, 0x039bdcd6, 0x002b06a7, 0x0035ec54}}}, + {X: Field{[10]uint32{0x01543cb4, 0x020e9f59, 0x00299e00, 0x02db08b4, 0x003c4529, 0x0203aa28, 0x03684d05, 0x02152a2a, 0x03ae9734, 0x001cfe1e}}, Y: Field{[10]uint32{0x00856cdd, 0x03761cb1, 0x02d7a3d2, 0x03d4d5fc, 0x019d5c42, 0x028500a2, 0x03fbfc11, 0x03e1bfba, 0x00f03a87, 0x000df19b}}}, + {X: Field{[10]uint32{0x03005e3f, 0x026d7913, 0x01bd2dda, 0x00c6fb0e, 0x015af68e, 0x03806852, 0x013cb9ac, 0x0109ffff, 0x026b3c16, 0x003e04e2}}, Y: Field{[10]uint32{0x03357eb7, 0x01f8080b, 0x0221342d, 0x02f5552f, 0x01f4ec41, 0x02a972d4, 0x01015e57, 0x03af67e7, 0x033befb4, 0x00329d63}}}, + {X: Field{[10]uint32{0x03bdde39, 0x000a9105, 0x0032952c, 0x01e6dd81, 0x031544e1, 0x02665a34, 0x022570d5, 0x033c3842, 0x0113f677, 0x001db990}}, Y: Field{[10]uint32{0x0101ac01, 0x005d4b46, 0x02032b4b, 0x034ad5b4, 0x035e2a33, 0x01a07c34, 0x03066d70, 0x02573d5d, 0x038dee4e, 0x00324377}}}, + }, + { + {X: Field{[10]uint32{0x03bdde39, 0x000a9105, 0x0032952c, 0x01e6dd81, 0x031544e1, 0x02665a34, 0x022570d5, 0x033c3842, 0x0113f677, 0x001db990}}, Y: Field{[10]uint32{0x0101ac01, 0x005d4b46, 0x02032b4b, 0x034ad5b4, 0x035e2a33, 0x01a07c34, 0x03066d70, 0x02573d5d, 0x038dee4e, 0x00324377}}}, + {X: Field{[10]uint32{0x021187a5, 0x02666a0e, 0x02e691cf, 0x0188b0a6, 0x00005d57, 0x00587204, 0x007c9d88, 0x031cefba, 0x030e9e52, 0x001c2294}}, Y: Field{[10]uint32{0x033db9c0, 0x013c66d1, 0x03e8a58a, 0x00f1b4d4, 0x003ecda7, 0x02db4e0a, 0x01656dcb, 0x02a25fea, 0x0011e1f9, 0x0026e212}}}, + {X: Field{[10]uint32{0x0078ee8d, 0x01424730, 0x019442f0, 0x033941a4, 0x024ebf20, 0x02a6d3fd, 0x03f7263a, 0x02a6f897, 0x03ad859d, 0x00342395}}, Y: Field{[10]uint32{0x01a63e86, 0x01fd370b, 0x02d9de99, 0x033e508b, 0x00123ef7, 0x015f9b7d, 0x02172ee7, 0x02235cb5, 0x03984ab4, 0x00214ba5}}}, + {X: Field{[10]uint32{0x01e4f5be, 0x02c5b1b3, 0x0359e2e1, 0x01b61aca, 0x039f374b, 0x017918b3, 0x03d64839, 0x00ef8866, 0x034fc48b, 0x000673c0}}, Y: Field{[10]uint32{0x03321af2, 0x0054cadb, 0x01c0c0a9, 0x0324fc3c, 0x03ef91d1, 0x02c60651, 0x034be68a, 0x02d19b0e, 0x0306a15a, 0x000a38ca}}}, + {X: Field{[10]uint32{0x029129ec, 0x00519c10, 0x02548159, 0x033c7920, 0x000cae3a, 0x0334c742, 0x018be80e, 0x01349d7d, 0x0085e4d4, 0x001f69b0}}, Y: Field{[10]uint32{0x00d9ff0e, 0x002bb8ab, 0x0186aeb5, 0x02195329, 0x030448c0, 0x024589ef, 0x01d02074, 0x00615d44, 0x006bb9f4, 0x003d2605}}}, + {X: Field{[10]uint32{0x029c22bc, 0x02b950c3, 0x0042fd43, 0x035a46f3, 0x0201da67, 0x026f1ef9, 0x01b3444d, 0x03ac8dd9, 0x02a5e99e, 0x0014cd73}}, Y: Field{[10]uint32{0x03dacb60, 0x03099cb2, 0x0319b3c2, 0x008db287, 0x02c8c30c, 0x0033ae1a, 0x027f080f, 0x01489281, 0x0020769c, 0x000efe34}}}, + {X: Field{[10]uint32{0x01654f22, 0x00f52554, 0x02ee94f8, 0x02508c6a, 0x03b2f7f3, 0x039a7653, 0x03e9001b, 0x02f9b886, 0x00cff5c1, 0x00243424}}, Y: Field{[10]uint32{0x001a43e1, 0x037815d8, 0x038740f5, 0x0194f68f, 0x036dd635, 0x01afdc0c, 0x03f021e0, 0x03d86a54, 0x021d2bac, 0x003355a6}}}, + {X: Field{[10]uint32{0x017cf3e8, 0x02f08274, 0x02219e3a, 0x000d2fa8, 0x02ee93bd, 0x00e5fd5d, 0x0319c2f8, 0x017c35f1, 0x00a078cb, 0x002bdb11}}, Y: Field{[10]uint32{0x0351baea, 0x03741805, 0x01435b8a, 0x03a9f283, 0x03ec362a, 0x032c91b7, 0x01e73153, 0x012cc2be, 0x016fe85d, 0x0001e102}}}, + {X: Field{[10]uint32{0x036b19fa, 0x03bd9471, 0x019d71b6, 0x01b41a20, 0x02d9d6e0, 0x02084a4b, 0x0322c310, 0x0347b31c, 0x00587cf1, 0x003691e6}}, Y: Field{[10]uint32{0x026f5af7, 0x009bbacc, 0x03c206aa, 0x00fa554f, 0x02a67bd1, 0x038595a7, 0x03369077, 0x02bc0745, 0x03789bcc, 0x003aec75}}}, + {X: Field{[10]uint32{0x02569044, 0x03e47b75, 0x02ef96d2, 0x01b3e833, 0x0033c039, 0x017163cc, 0x002bafe9, 0x01894e75, 0x020d6f7d, 0x002a8871}}, Y: Field{[10]uint32{0x02f37766, 0x00931070, 0x00334c19, 0x03044e4a, 0x02ee5aba, 0x0106b7d3, 0x01d26add, 0x01aba9b4, 0x0086fc4e, 0x002cab9a}}}, + {X: Field{[10]uint32{0x01135dbd, 0x00bed96e, 0x0231ecd9, 0x02bce761, 0x00f0c087, 0x00ba625f, 0x017aaf58, 0x03b9ab60, 0x0104a8dd, 0x0038f91d}}, Y: Field{[10]uint32{0x0348045d, 0x01abcf91, 0x01da9690, 0x03fd7b25, 0x02a5a202, 0x00ae0fff, 0x018c8195, 0x031b102e, 0x03f809cb, 0x0024c296}}}, + {X: Field{[10]uint32{0x03f4de54, 0x00798853, 0x002be5bc, 0x0247a74f, 0x00a5cabd, 0x00528a16, 0x034031cf, 0x000a8b0e, 0x00355df2, 0x0015c5b7}}, Y: Field{[10]uint32{0x00100fa5, 0x0293f554, 0x02417d3e, 0x0333411f, 0x01ebf3fe, 0x0264c931, 0x02aa661a, 0x020fce47, 0x00400a5b, 0x002617db}}}, + {X: Field{[10]uint32{0x01ee455f, 0x002e7973, 0x00075cbf, 0x039ba339, 0x02ff67ff, 0x0202f6d2, 0x0345338f, 0x02a6c291, 0x016fe870, 0x001fa319}}, Y: Field{[10]uint32{0x031b9cba, 0x037a6605, 0x02627173, 0x019d1bd1, 0x034aa2d1, 0x0200e94e, 0x03f760f4, 0x01d03ca8, 0x0232ca30, 0x002f7771}}}, + {X: Field{[10]uint32{0x0369b57c, 0x00540365, 0x03c7b1e6, 0x02f0e78b, 0x01da5033, 0x02f8fc13, 0x008f1925, 0x00a0ad4d, 0x01cb592d, 0x0000c194}}, Y: Field{[10]uint32{0x033236e3, 0x00e9417c, 0x038057ff, 0x0061ce7d, 0x03192a4d, 0x0215a0b0, 0x00e2423e, 0x030262b1, 0x0033bb7a, 0x00094822}}}, + {X: Field{[10]uint32{0x0298b59e, 0x025ae6d9, 0x007a4377, 0x009624d1, 0x020a3359, 0x00f8f1c9, 0x02b035ab, 0x017ac56f, 0x01f891a9, 0x000f7e10}}, Y: Field{[10]uint32{0x0392baf5, 0x02399e5a, 0x009f8bcf, 0x01ec8525, 0x027bfc86, 0x00473ce1, 0x002bae8f, 0x02430768, 0x02df98b0, 0x002ce3f9}}}, + {X: Field{[10]uint32{0x03cbb891, 0x0054090a, 0x00bee3ab, 0x010f7c9b, 0x028f7cc6, 0x010fe3e6, 0x0281baa7, 0x02af87a0, 0x016b03b2, 0x0031ce31}}, Y: Field{[10]uint32{0x019a84c3, 0x01cd765a, 0x00fe917e, 0x03bde203, 0x0382314e, 0x032feeee, 0x0318f2ea, 0x03494dfd, 0x0178951a, 0x00224fed}}}, + }, + { + {X: Field{[10]uint32{0x03cbb891, 0x0054090a, 0x00bee3ab, 0x010f7c9b, 0x028f7cc6, 0x010fe3e6, 0x0281baa7, 0x02af87a0, 0x016b03b2, 0x0031ce31}}, Y: Field{[10]uint32{0x019a84c3, 0x01cd765a, 0x00fe917e, 0x03bde203, 0x0382314e, 0x032feeee, 0x0318f2ea, 0x03494dfd, 0x0178951a, 0x00224fed}}}, + {X: Field{[10]uint32{0x0262ab1b, 0x02ac1e11, 0x009e4dda, 0x03a926e3, 0x00647197, 0x00b9eaa5, 0x0332a699, 0x000dd0d6, 0x005ecd7c, 0x00155e21}}, Y: Field{[10]uint32{0x016f3511, 0x03463cc1, 0x024de316, 0x01d1a975, 0x03f653a7, 0x034a9014, 0x026d0a51, 0x038b0f3a, 0x03978b6d, 0x00398741}}}, + {X: Field{[10]uint32{0x0361d58d, 0x02abcce1, 0x00e2f34b, 0x03902358, 0x02ca4c9b, 0x01c837de, 0x02240a35, 0x01851842, 0x0127823f, 0x002e3118}}, Y: Field{[10]uint32{0x011051a4, 0x03a82ea7, 0x03c5b638, 0x01e17841, 0x013f7504, 0x01fcf141, 0x02458f69, 0x038df452, 0x016c5170, 0x0023e7b6}}}, + {X: Field{[10]uint32{0x008b6c29, 0x021a6e25, 0x0196094f, 0x0153f38e, 0x0122f123, 0x03433b33, 0x03fa3bc1, 0x0193312a, 0x003888a3, 0x0011fcce}}, Y: Field{[10]uint32{0x02537ef9, 0x03b84483, 0x014a81ed, 0x025623e6, 0x0118bb49, 0x02d05b1c, 0x00e48675, 0x00a4dc64, 0x028d0f03, 0x001232a6}}}, + {X: Field{[10]uint32{0x010b0040, 0x002cc101, 0x00adc2db, 0x02e7c04d, 0x01f3f47d, 0x03a68d9c, 0x010c993f, 0x01c7de8d, 0x029f7102, 0x0002355b}}, Y: Field{[10]uint32{0x033fd0a1, 0x03899e96, 0x002beb58, 0x01c8385e, 0x01f6d7c4, 0x035e6ca1, 0x03d150a8, 0x026a887f, 0x01aebd0a, 0x00284861}}}, + {X: Field{[10]uint32{0x0166ff40, 0x037a8684, 0x0336da14, 0x012907ff, 0x02caeebf, 0x0392028b, 0x038125d8, 0x0234adf1, 0x00331881, 0x001ac010}}, Y: Field{[10]uint32{0x0171b847, 0x0104c3a7, 0x02de9eb7, 0x03db9fcf, 0x00076883, 0x0242fcbc, 0x00943a05, 0x03eb265a, 0x033ae8aa, 0x00107346}}}, + {X: Field{[10]uint32{0x03573b7f, 0x0158f7c4, 0x02270f56, 0x017b4c2d, 0x03889a1c, 0x02f9968d, 0x0220f977, 0x03398d07, 0x0232d42f, 0x003704fc}}, Y: Field{[10]uint32{0x001f2ba6, 0x03348a13, 0x00b1c42a, 0x01c05d01, 0x02704554, 0x012a429d, 0x03410da8, 0x00d030f1, 0x0280429e, 0x0032426e}}}, + {X: Field{[10]uint32{0x01ff4adb, 0x029b23c1, 0x03768a81, 0x035bf2fb, 0x0214f570, 0x01a9757d, 0x026b4c9c, 0x02e33f91, 0x0334ae41, 0x00303007}}, Y: Field{[10]uint32{0x00351065, 0x03bfdceb, 0x01b85fc4, 0x0345c345, 0x02cdbc43, 0x001d6e33, 0x0137a0b4, 0x01fd71f2, 0x01bee435, 0x0002e13d}}}, + {X: Field{[10]uint32{0x03ae9ceb, 0x03d642e1, 0x02d14b02, 0x03a9c3bc, 0x00226c21, 0x02c8466a, 0x0319565d, 0x01fc1ceb, 0x01e601df, 0x0009700b}}, Y: Field{[10]uint32{0x03c6e275, 0x024344d2, 0x00726470, 0x037c2996, 0x0137c641, 0x03eb4475, 0x0084e0dc, 0x00e0f032, 0x02d2c812, 0x0022a7fa}}}, + {X: Field{[10]uint32{0x032c1a1c, 0x000675e4, 0x01d6e365, 0x006808af, 0x03a2f32b, 0x002d8ee4, 0x0229ea40, 0x032f6cf4, 0x03bc468e, 0x000ea4cb}}, Y: Field{[10]uint32{0x01343540, 0x02a49a5f, 0x028b684a, 0x0055d268, 0x02c0417e, 0x03720742, 0x009547d4, 0x015ea007, 0x00540f34, 0x002b4f60}}}, + {X: Field{[10]uint32{0x005a3c34, 0x00263dbb, 0x009fe1f8, 0x0300a565, 0x00aece82, 0x01eb8f96, 0x02b9f4ca, 0x039273a2, 0x011b2cf8, 0x003fb767}}, Y: Field{[10]uint32{0x013d7714, 0x0152fd38, 0x0029762b, 0x011a66fe, 0x00adaeb5, 0x0323d2c0, 0x03e85312, 0x02e382c2, 0x00c31853, 0x00294b89}}}, + {X: Field{[10]uint32{0x00d6bf1f, 0x00841ae0, 0x03cbb045, 0x00fa6093, 0x0146bd03, 0x01acd1ae, 0x0121e927, 0x02e0f28d, 0x0343451c, 0x0030ccdc}}, Y: Field{[10]uint32{0x00b01f48, 0x0396108f, 0x02162f95, 0x01083899, 0x0198ba36, 0x01cb0c55, 0x01ff31af, 0x00b3684f, 0x01391b81, 0x000bbbfa}}}, + {X: Field{[10]uint32{0x02b6a396, 0x0395346a, 0x020769b4, 0x0246844d, 0x0373021b, 0x03a1222c, 0x02e2d7f5, 0x029230b7, 0x0286bc6e, 0x000f838c}}, Y: Field{[10]uint32{0x0180e27e, 0x00c79236, 0x00f6a2eb, 0x0107cd1a, 0x026ab010, 0x02d14ff1, 0x031fe1de, 0x00de593c, 0x0172fa3b, 0x00329120}}}, + {X: Field{[10]uint32{0x02f027e9, 0x03d31236, 0x0277e27b, 0x036fb951, 0x03d7ca75, 0x01fb5b45, 0x03c7cd53, 0x00f894f0, 0x033d3ea8, 0x001698a1}}, Y: Field{[10]uint32{0x004c68b4, 0x02764161, 0x035fb319, 0x00c27299, 0x03988af4, 0x03b15e90, 0x02409cfe, 0x01abf69d, 0x0079a5bf, 0x003db651}}}, + {X: Field{[10]uint32{0x001023ec, 0x00d6188d, 0x03570aaf, 0x03ddbfb3, 0x035645d8, 0x0260ae6b, 0x002e0200, 0x00b4a126, 0x013080c3, 0x000d12ae}}, Y: Field{[10]uint32{0x021eeb87, 0x02260a47, 0x015d704f, 0x01abf0e6, 0x03fc4e97, 0x02945317, 0x038f2d1e, 0x0118a9cf, 0x03042b24, 0x001b870a}}}, + {X: Field{[10]uint32{0x00f6c14b, 0x03a7d962, 0x01014372, 0x017cea49, 0x03d1d72e, 0x0325ca1d, 0x024c7637, 0x016e0789, 0x026548b6, 0x00362558}}, Y: Field{[10]uint32{0x017d991f, 0x018fb5d7, 0x027e1793, 0x018caec1, 0x0303428d, 0x0230d03a, 0x00ec6081, 0x01fab9ca, 0x0238f2bc, 0x003fafea}}}, + }, + { + {X: Field{[10]uint32{0x00f6c14b, 0x03a7d962, 0x01014372, 0x017cea49, 0x03d1d72e, 0x0325ca1d, 0x024c7637, 0x016e0789, 0x026548b6, 0x00362558}}, Y: Field{[10]uint32{0x017d991f, 0x018fb5d7, 0x027e1793, 0x018caec1, 0x0303428d, 0x0230d03a, 0x00ec6081, 0x01fab9ca, 0x0238f2bc, 0x003fafea}}}, + {X: Field{[10]uint32{0x03078424, 0x02d652dd, 0x00c3fba5, 0x01e83b10, 0x0303ecaf, 0x0000e899, 0x03a43622, 0x00113a28, 0x02ef8971, 0x003f44db}}, Y: Field{[10]uint32{0x0271ddf1, 0x007bbbf1, 0x01fa8cd6, 0x03de28ab, 0x017cf2b1, 0x01717be9, 0x021d191b, 0x014b319e, 0x0034f3c6, 0x0008636a}}}, + {X: Field{[10]uint32{0x0127b756, 0x02a1ffd8, 0x0170480b, 0x0392ae82, 0x0203428b, 0x00182d05, 0x01362da5, 0x03c499cb, 0x002f716d, 0x001b631e}}, Y: Field{[10]uint32{0x03172571, 0x007dd2af, 0x01cca655, 0x0368b5f3, 0x034e3aa6, 0x01b4d36b, 0x019a82d3, 0x02e44451, 0x030896fd, 0x00266bb7}}}, + {X: Field{[10]uint32{0x01b1cb3c, 0x03613b23, 0x0024a5f1, 0x028350fc, 0x021b7003, 0x01d467e1, 0x01cca536, 0x0234503a, 0x029dd963, 0x003667a3}}, Y: Field{[10]uint32{0x038637a7, 0x028a78da, 0x0365cd88, 0x03e3ff21, 0x026286fe, 0x02f3ae9b, 0x005bb321, 0x028e9ea5, 0x01ad1cc0, 0x000db706}}}, + {X: Field{[10]uint32{0x018cf17a, 0x03869cdd, 0x023524de, 0x032e9620, 0x00f1f85d, 0x02d025fe, 0x0059aef1, 0x01eb2a34, 0x02dd95bf, 0x003af2af}}, Y: Field{[10]uint32{0x00aa0ccd, 0x033717d7, 0x0295c446, 0x004b42b3, 0x0310fad2, 0x01f0cb9a, 0x0000a1b6, 0x02e72c0b, 0x020f8f22, 0x0011f4f3}}}, + {X: Field{[10]uint32{0x01a3c43c, 0x012cb154, 0x02258e4c, 0x032a3b3b, 0x000df701, 0x02ab99c5, 0x00c1f2b4, 0x03356d23, 0x029467ca, 0x0015b276}}, Y: Field{[10]uint32{0x00d7c9ed, 0x0362df48, 0x00aa1824, 0x03e4cbb7, 0x0241d40f, 0x0372da14, 0x03c7964d, 0x027b0bcc, 0x02cb42c7, 0x000e351a}}}, + {X: Field{[10]uint32{0x00855c5b, 0x03b9456b, 0x00afbbce, 0x006805f2, 0x00118562, 0x0385ff0a, 0x0331a369, 0x03389114, 0x012e4bd4, 0x003a37d3}}, Y: Field{[10]uint32{0x02465650, 0x0179cb0b, 0x00d7d59d, 0x017c7879, 0x019663b5, 0x027bccb1, 0x004db4f5, 0x026c9911, 0x0170c47f, 0x001b15ff}}}, + {X: Field{[10]uint32{0x00385172, 0x01bda34f, 0x02636fd4, 0x00781103, 0x01d20335, 0x016c2464, 0x03d8a54e, 0x020c5e86, 0x01619a19, 0x0000ff7c}}, Y: Field{[10]uint32{0x00cb9794, 0x0319fc3f, 0x0232b79a, 0x027a439c, 0x015b9b92, 0x03215cdd, 0x0070c7d3, 0x004b0ff9, 0x02c06e5c, 0x00102340}}}, + {X: Field{[10]uint32{0x02e7e454, 0x03d6f694, 0x02150d08, 0x03bc3c39, 0x02fe32ef, 0x02a60598, 0x02486023, 0x02a0ca44, 0x03d718ec, 0x00101a34}}, Y: Field{[10]uint32{0x00ef191e, 0x02b37976, 0x03332779, 0x03b44f0d, 0x01988d21, 0x03674e34, 0x02c14597, 0x011eaae7, 0x03b7254a, 0x00233614}}}, + {X: Field{[10]uint32{0x01d8247e, 0x0307fd4d, 0x011eb400, 0x0309445a, 0x00cd4780, 0x03e82de8, 0x02101f9a, 0x0157395b, 0x01bba2c3, 0x000cfab2}}, Y: Field{[10]uint32{0x033da9bf, 0x005aac2b, 0x0007f372, 0x00dedfa9, 0x0184f8cf, 0x03457bcb, 0x0061f2af, 0x01f10751, 0x0173e4e1, 0x000d65cc}}}, + {X: Field{[10]uint32{0x02c5d939, 0x01eb7e11, 0x033de085, 0x021deea4, 0x02a475a2, 0x0032809f, 0x01bf32e6, 0x009782d5, 0x02cdb1d8, 0x00049543}}, Y: Field{[10]uint32{0x01e757c9, 0x01d3f156, 0x0143192a, 0x007fb363, 0x02838b74, 0x01dc929c, 0x008e43c1, 0x035e9d51, 0x0334f872, 0x001ee3e0}}}, + {X: Field{[10]uint32{0x01f771c8, 0x0092740b, 0x00c87b9e, 0x0047b825, 0x00335a52, 0x0007e1d4, 0x032c2b3c, 0x03240a74, 0x006d922d, 0x002dc795}}, Y: Field{[10]uint32{0x03f48c51, 0x00e89be4, 0x02286245, 0x00ad56ee, 0x0026bd52, 0x0338a23d, 0x0112a4cc, 0x03e401e2, 0x03a8cec9, 0x0039f33b}}}, + {X: Field{[10]uint32{0x02c8a56f, 0x002ab195, 0x0342138d, 0x0150d3cd, 0x0385093c, 0x02beb423, 0x01bb7b53, 0x0217531a, 0x031ac3b5, 0x00251359}}, Y: Field{[10]uint32{0x027be289, 0x01371976, 0x0117eb9f, 0x01d37419, 0x0167d4c1, 0x00ceb186, 0x01439361, 0x007ffd30, 0x01977b50, 0x0029c419}}}, + {X: Field{[10]uint32{0x03194444, 0x01cc24b4, 0x03ea268f, 0x0252ea9f, 0x02850fea, 0x0361e867, 0x02239666, 0x009ae184, 0x0196ba15, 0x003eb3d7}}, Y: Field{[10]uint32{0x00bad676, 0x02fd2211, 0x0100b552, 0x0116e51f, 0x02be72b2, 0x024b76b1, 0x01b77563, 0x0113da4d, 0x007bb8ad, 0x001f3ae4}}}, + {X: Field{[10]uint32{0x0208f15a, 0x02e2862b, 0x0100baee, 0x01b7204a, 0x01fd69e5, 0x02b4f0c1, 0x02b03655, 0x026833f9, 0x0291cd09, 0x0021a953}}, Y: Field{[10]uint32{0x01388308, 0x013479f0, 0x0254d352, 0x00496cd4, 0x0377129d, 0x035d5a19, 0x032a8d06, 0x021180e9, 0x014837a7, 0x0033fb98}}}, + {X: Field{[10]uint32{0x03676e03, 0x01429593, 0x00edd491, 0x00da4fa1, 0x01ceffc7, 0x01c7a1d8, 0x00f64335, 0x01d463ac, 0x00032a95, 0x002e36a5}}, Y: Field{[10]uint32{0x02fdf6e7, 0x023939d3, 0x03b51148, 0x013657fc, 0x0092cc58, 0x018a022c, 0x0099cc97, 0x0287935f, 0x03a44805, 0x000a0137}}}, + }, + { + {X: Field{[10]uint32{0x03676e03, 0x01429593, 0x00edd491, 0x00da4fa1, 0x01ceffc7, 0x01c7a1d8, 0x00f64335, 0x01d463ac, 0x00032a95, 0x002e36a5}}, Y: Field{[10]uint32{0x02fdf6e7, 0x023939d3, 0x03b51148, 0x013657fc, 0x0092cc58, 0x018a022c, 0x0099cc97, 0x0287935f, 0x03a44805, 0x000a0137}}}, + {X: Field{[10]uint32{0x01af726a, 0x00fd0531, 0x036e6d41, 0x0172c96f, 0x01469a3e, 0x02ad883e, 0x032cb698, 0x0317394f, 0x0105ed8c, 0x001b4db4}}, Y: Field{[10]uint32{0x03f9fc7d, 0x00124684, 0x00a35c57, 0x00dad042, 0x01dcc599, 0x0171400a, 0x018c66c9, 0x019a79cb, 0x0034e377, 0x00392e97}}}, + {X: Field{[10]uint32{0x02e1346b, 0x02612771, 0x031c5ea1, 0x0040e16b, 0x005abe7b, 0x013454b0, 0x00c761f1, 0x03442f95, 0x00ff0982, 0x0001a41a}}, Y: Field{[10]uint32{0x03226c13, 0x01629535, 0x0026e7bb, 0x00e65318, 0x02a4f689, 0x0021910a, 0x005db2bd, 0x03789b6a, 0x03e090bf, 0x002e18f8}}}, + {X: Field{[10]uint32{0x0140db99, 0x00a8c329, 0x0012286e, 0x03014d2e, 0x03eb1309, 0x01bc2c38, 0x02883fa6, 0x02b03341, 0x01e10cd3, 0x000eadaf}}, Y: Field{[10]uint32{0x03da78a3, 0x01cff8c6, 0x00043e68, 0x02c38da7, 0x0038d137, 0x0284fa67, 0x03117a96, 0x01c75ff0, 0x02079be8, 0x002eb298}}}, + {X: Field{[10]uint32{0x00a1f6a1, 0x01a47f37, 0x03f1a30e, 0x0050d233, 0x01068cbd, 0x007a1b38, 0x006dc5cb, 0x025d854a, 0x0093cb25, 0x0022630d}}, Y: Field{[10]uint32{0x024f647c, 0x037083c5, 0x0179ca4a, 0x025e7caf, 0x03b2a7cf, 0x00ab1ba4, 0x00454245, 0x02955276, 0x0186ab56, 0x001d7dd6}}}, + {X: Field{[10]uint32{0x0235c795, 0x038aef1c, 0x001d7584, 0x0163af55, 0x030b0d89, 0x03472275, 0x03b05b37, 0x025d2ce4, 0x022435ef, 0x00018f11}}, Y: Field{[10]uint32{0x03110258, 0x00b70256, 0x029bd3f3, 0x02b3e926, 0x029e4acb, 0x00c7216d, 0x01f660d9, 0x0210110c, 0x03b91303, 0x00389fe6}}}, + {X: Field{[10]uint32{0x011e3998, 0x02780f0f, 0x00328aa6, 0x02e45e81, 0x025e56c8, 0x008a89d3, 0x01299d70, 0x022fc069, 0x02fed291, 0x002c84f8}}, Y: Field{[10]uint32{0x025fb81e, 0x032f718c, 0x01175ec2, 0x016faf7b, 0x03d53416, 0x00e90ef0, 0x0161ebf8, 0x00f04b0f, 0x02c20f2d, 0x0008a7e3}}}, + {X: Field{[10]uint32{0x031048da, 0x01efc9e7, 0x013ba777, 0x03cdcf77, 0x02ba2fd4, 0x0341ef38, 0x03a069d9, 0x015bc3f6, 0x00e3f1ad, 0x001e598d}}, Y: Field{[10]uint32{0x0106cf01, 0x026f8928, 0x00862e8f, 0x03633f5d, 0x02532576, 0x029e49fc, 0x01e74735, 0x002e255b, 0x02b6cfb2, 0x001363b8}}}, + {X: Field{[10]uint32{0x025be234, 0x0387fb28, 0x0350700b, 0x039c377c, 0x020e83e3, 0x00581b81, 0x01d0ba69, 0x03e4f974, 0x02d816c7, 0x0012cece}}, Y: Field{[10]uint32{0x020e8362, 0x02df80e4, 0x01b84063, 0x024b3c84, 0x0041e7fd, 0x03633013, 0x035e96df, 0x02f271e1, 0x023b85da, 0x0017bb00}}}, + {X: Field{[10]uint32{0x005201e1, 0x0026b270, 0x0377dab2, 0x016ba0da, 0x01d264cb, 0x03a8d7e6, 0x02bd55cd, 0x01e2ba14, 0x02b06e6c, 0x0030a671}}, Y: Field{[10]uint32{0x00f51ba3, 0x00cc4e94, 0x02ae9add, 0x03d60eb0, 0x03bd74dc, 0x035dd335, 0x0084f24f, 0x02016ce2, 0x01923611, 0x0016a9ce}}}, + {X: Field{[10]uint32{0x0289f55e, 0x018d29f8, 0x02707b96, 0x03c38b1d, 0x022976b0, 0x01e2596f, 0x00251b02, 0x013e5808, 0x00b6ddb0, 0x0027dee2}}, Y: Field{[10]uint32{0x021e4bde, 0x034ed97f, 0x022b1b3c, 0x0383ac42, 0x03c0e536, 0x0263f1c7, 0x03146b42, 0x0043def8, 0x0384c704, 0x000cbe7d}}}, + {X: Field{[10]uint32{0x001cbaab, 0x01e9fc5b, 0x0164cfd3, 0x01e40cf5, 0x001acab8, 0x029c18d7, 0x00ab6c18, 0x0181c566, 0x0298fb35, 0x00340c6b}}, Y: Field{[10]uint32{0x01116b26, 0x02411fe1, 0x01fdc4c3, 0x013f6f59, 0x036dfb4a, 0x0372d373, 0x02e4c06a, 0x01613a39, 0x02b4e954, 0x00105465}}}, + {X: Field{[10]uint32{0x01fe1d2b, 0x01272307, 0x038e5165, 0x002795a1, 0x00c493f5, 0x00fedce9, 0x02ccadfd, 0x01238f9d, 0x03e9cb74, 0x00356290}}, Y: Field{[10]uint32{0x00d50922, 0x009e56e3, 0x02fbffcf, 0x008572f5, 0x0354d9ba, 0x020a09da, 0x02729132, 0x020f3c42, 0x026ba058, 0x003f05e1}}}, + {X: Field{[10]uint32{0x007996c0, 0x03ef5611, 0x0269a626, 0x01c9dae8, 0x016e2eed, 0x02fb743a, 0x03979577, 0x00d590e6, 0x02d86a95, 0x0005ba16}}, Y: Field{[10]uint32{0x00151d48, 0x022f192e, 0x01d54488, 0x02b6715a, 0x0221b642, 0x0003b556, 0x0217e5ce, 0x0124fbec, 0x00aeb424, 0x001d022c}}}, + {X: Field{[10]uint32{0x009c795e, 0x00546f89, 0x0005e124, 0x02aa673a, 0x02ed4406, 0x0309fa93, 0x02d969c3, 0x020c4335, 0x01397111, 0x0008749c}}, Y: Field{[10]uint32{0x01208ece, 0x004bb0e6, 0x03761b00, 0x01292b7e, 0x03d67194, 0x008aed30, 0x0335b855, 0x02b3a85d, 0x01b4b075, 0x0025317e}}}, + {X: Field{[10]uint32{0x03c0df5d, 0x0045de38, 0x02792f1a, 0x03ed455a, 0x032019ef, 0x01d75fea, 0x00adab94, 0x02cce9f6, 0x0214441f, 0x003a03fa}}, Y: Field{[10]uint32{0x02c9ec78, 0x010a46da, 0x02ea9fcb, 0x0202bcc8, 0x032d155e, 0x00f2a511, 0x009768ca, 0x0001dc7a, 0x027f638e, 0x003bb477}}}, + }, + { + {X: Field{[10]uint32{0x03c0df5d, 0x0045de38, 0x02792f1a, 0x03ed455a, 0x032019ef, 0x01d75fea, 0x00adab94, 0x02cce9f6, 0x0214441f, 0x003a03fa}}, Y: Field{[10]uint32{0x02c9ec78, 0x010a46da, 0x02ea9fcb, 0x0202bcc8, 0x032d155e, 0x00f2a511, 0x009768ca, 0x0001dc7a, 0x027f638e, 0x003bb477}}}, + {X: Field{[10]uint32{0x0383cd58, 0x0039e2c3, 0x039162db, 0x00e1df4b, 0x03122dcc, 0x03bf9e8d, 0x01ac4ed1, 0x00499660, 0x01f08ea4, 0x00110328}}, Y: Field{[10]uint32{0x008a3f4b, 0x02f01a6e, 0x02260b07, 0x0109a702, 0x02a21e4d, 0x03538bc0, 0x00954dc9, 0x03848abe, 0x00d2cd5e, 0x0029b22c}}}, + {X: Field{[10]uint32{0x03592d55, 0x00d67b35, 0x010192c0, 0x011d038d, 0x0106d5b9, 0x00cf38ec, 0x02fef696, 0x00149822, 0x02dbc4a1, 0x00174bb1}}, Y: Field{[10]uint32{0x035183a7, 0x039743ab, 0x01174266, 0x0336b445, 0x010e2a7b, 0x01a335a5, 0x03710fa2, 0x0117ad63, 0x01f89c6e, 0x0002a4b3}}}, + {X: Field{[10]uint32{0x02998b10, 0x02f689c4, 0x029d9e81, 0x02f306c8, 0x019bc70e, 0x00ea41e0, 0x037f829d, 0x01b07317, 0x03af2b96, 0x003da532}}, Y: Field{[10]uint32{0x00f05e51, 0x0222c5c0, 0x02a47f67, 0x030c60f0, 0x02eb6c64, 0x0311b60a, 0x03c5ffac, 0x03c0f58c, 0x02ba61be, 0x0010298f}}}, + {X: Field{[10]uint32{0x028f9f5c, 0x03d2d27f, 0x00a51991, 0x03856620, 0x017361f1, 0x0057d013, 0x02cae342, 0x03dd0bf8, 0x01c3b11b, 0x002b0dc7}}, Y: Field{[10]uint32{0x025a503c, 0x020ffccc, 0x01e1d17a, 0x0163b9d4, 0x01229534, 0x009539cd, 0x02101e73, 0x0291dffc, 0x02c18709, 0x00314585}}}, + {X: Field{[10]uint32{0x015bf84c, 0x012e3e39, 0x01027a74, 0x03b55c36, 0x03d964c6, 0x008f2b93, 0x01d3c252, 0x01b32397, 0x0099ceb9, 0x00189e0a}}, Y: Field{[10]uint32{0x0315fa2a, 0x0073ead7, 0x036ed6f5, 0x039f7745, 0x039a020d, 0x025c99e0, 0x00549722, 0x028a2407, 0x00a40911, 0x00359c2b}}}, + {X: Field{[10]uint32{0x01e33446, 0x00723546, 0x0385df4a, 0x03114abc, 0x0240893b, 0x0088a85e, 0x008c0bd0, 0x0210324d, 0x003a14f1, 0x00225080}}, Y: Field{[10]uint32{0x02387689, 0x00e28039, 0x00f9840d, 0x00d9e79d, 0x006bfd77, 0x03bf7938, 0x00b2d6d0, 0x001de936, 0x039595a5, 0x002a7f40}}}, + {X: Field{[10]uint32{0x01d553fd, 0x0284cd63, 0x02414f95, 0x0257022d, 0x0047abf6, 0x02689654, 0x036d4f43, 0x01a12142, 0x022a3556, 0x0022dba1}}, Y: Field{[10]uint32{0x029be5ed, 0x00f6b4cf, 0x003d0d80, 0x016860ce, 0x0124ac3c, 0x013ae7e8, 0x010bc2df, 0x0072d034, 0x00910ed1, 0x003a9782}}}, + {X: Field{[10]uint32{0x0113cb26, 0x00a3256e, 0x016d03d7, 0x027004ef, 0x0099eb41, 0x01541726, 0x00da44ff, 0x010aa28b, 0x026b30a3, 0x0009dc09}}, Y: Field{[10]uint32{0x0348a7a2, 0x01c5ccfc, 0x01bebbfe, 0x006f3205, 0x00e940c9, 0x01fcacc9, 0x012d24d0, 0x036c6955, 0x005e79b0, 0x003d926f}}}, + {X: Field{[10]uint32{0x030c58bd, 0x010912b3, 0x024ce23f, 0x0137d911, 0x0228d49f, 0x01aabb3d, 0x019e1005, 0x013024cb, 0x006e2484, 0x0034eb7c}}, Y: Field{[10]uint32{0x03c89387, 0x0392ae4d, 0x00c9ce52, 0x027e92e6, 0x02aee386, 0x03fd8e2e, 0x03b2febc, 0x0181def7, 0x01b4fc2a, 0x0015fa67}}}, + {X: Field{[10]uint32{0x015e8247, 0x02a80856, 0x00d1af0a, 0x01155a1b, 0x0097bfdc, 0x033e2ea4, 0x025e6e01, 0x03b485e3, 0x00d383cb, 0x001d7934}}, Y: Field{[10]uint32{0x01982d22, 0x00ff6756, 0x01893ca2, 0x02dbaa6b, 0x007ddab5, 0x01edc9b5, 0x01f970ec, 0x002641d0, 0x02a17541, 0x0007f390}}}, + {X: Field{[10]uint32{0x039715c2, 0x011c743c, 0x0129a399, 0x0087e629, 0x01690065, 0x028cffb7, 0x011f78ce, 0x00f616d0, 0x0288f19a, 0x000bc627}}, Y: Field{[10]uint32{0x0171dfea, 0x018d6110, 0x014f066a, 0x038b0da1, 0x03eb3333, 0x03443e7d, 0x0308475e, 0x035f3f7d, 0x01f8f3c5, 0x0032468e}}}, + {X: Field{[10]uint32{0x02333323, 0x027d1369, 0x02bf4747, 0x0071a3d2, 0x009cbbbc, 0x026136a1, 0x0020d605, 0x02efc0fc, 0x02383361, 0x000fb46d}}, Y: Field{[10]uint32{0x01d61ba3, 0x00ff122d, 0x037294b1, 0x02842de3, 0x02a9b728, 0x0223e4a7, 0x017c9896, 0x013b9d76, 0x01a48b5b, 0x003613cb}}}, + {X: Field{[10]uint32{0x023eb3fc, 0x018bb73e, 0x02398875, 0x02513643, 0x0277ee68, 0x02229bdf, 0x0246b408, 0x01aedddf, 0x00bb0a1b, 0x0034b372}}, Y: Field{[10]uint32{0x02d37564, 0x021f6cf7, 0x00927442, 0x02e4c42d, 0x02c1f217, 0x033e49bb, 0x01e95362, 0x018411b7, 0x02f9e5c5, 0x003154e2}}}, + {X: Field{[10]uint32{0x033980bf, 0x0015f52c, 0x000baf25, 0x00b94374, 0x0368a370, 0x00d23750, 0x006fd772, 0x020606e1, 0x02f06a75, 0x001c3f74}}, Y: Field{[10]uint32{0x00b75785, 0x03aa33a8, 0x00a5612e, 0x020e175d, 0x030a1035, 0x007b965a, 0x03a410d1, 0x021a5a55, 0x02c0d0d5, 0x0017b7f2}}}, + {X: Field{[10]uint32{0x00e16070, 0x001eef31, 0x02915ddc, 0x000c7bf5, 0x03f2a182, 0x03559d50, 0x03a48e51, 0x01c10c4e, 0x017bdfcd, 0x0028c05a}}, Y: Field{[10]uint32{0x02177ea1, 0x03468107, 0x01a130c0, 0x03df0284, 0x031735db, 0x017503e6, 0x01809fa2, 0x0393d420, 0x011cfb67, 0x001cdc3e}}}, + }, + { + {X: Field{[10]uint32{0x00e16070, 0x001eef31, 0x02915ddc, 0x000c7bf5, 0x03f2a182, 0x03559d50, 0x03a48e51, 0x01c10c4e, 0x017bdfcd, 0x0028c05a}}, Y: Field{[10]uint32{0x02177ea1, 0x03468107, 0x01a130c0, 0x03df0284, 0x031735db, 0x017503e6, 0x01809fa2, 0x0393d420, 0x011cfb67, 0x001cdc3e}}}, + {X: Field{[10]uint32{0x024ba5ae, 0x0080c5bc, 0x035d8114, 0x000130d2, 0x00b43965, 0x0382ffdd, 0x028d2419, 0x03c127cf, 0x019cff79, 0x0009f879}}, Y: Field{[10]uint32{0x003a45b3, 0x016ffba2, 0x023f784a, 0x029a6be9, 0x01df48a1, 0x031e77c1, 0x01b5e3cf, 0x038827b8, 0x02a6c804, 0x000c42c9}}}, + {X: Field{[10]uint32{0x038011fc, 0x0049c004, 0x00562670, 0x019eb5ca, 0x0183596a, 0x00880293, 0x02b13308, 0x03ac4455, 0x03a30815, 0x001ba0c4}}, Y: Field{[10]uint32{0x0315ab7d, 0x02da7e8f, 0x01f9a6ac, 0x016ba714, 0x0026af91, 0x0076b0c1, 0x0212db20, 0x03c81306, 0x018bdc24, 0x003051e0}}}, + {X: Field{[10]uint32{0x00aed7ae, 0x0245d727, 0x03b4f996, 0x037a13ef, 0x035a39ad, 0x024b5f93, 0x0188ec38, 0x012bb859, 0x03a5f686, 0x0031c4b9}}, Y: Field{[10]uint32{0x02156294, 0x00522a91, 0x0263784d, 0x01512c33, 0x01380d8e, 0x00477679, 0x02d4b823, 0x018ecd97, 0x01075163, 0x00125910}}}, + {X: Field{[10]uint32{0x000e6ba7, 0x01d26e34, 0x02f7f53a, 0x016d1245, 0x003d36ec, 0x0136786d, 0x011e038a, 0x02147caf, 0x01099784, 0x003e54aa}}, Y: Field{[10]uint32{0x0175e4c1, 0x02bbb940, 0x022b98db, 0x01ed318a, 0x02555716, 0x009fe83d, 0x01376a2e, 0x033afe18, 0x025b08ab, 0x00362a4e}}}, + {X: Field{[10]uint32{0x015b6f7e, 0x0127d716, 0x02021f95, 0x014f4e2c, 0x01beb32b, 0x00261db3, 0x02053aad, 0x028c320e, 0x011d04cd, 0x00296b1f}}, Y: Field{[10]uint32{0x02b19c84, 0x02edcc22, 0x00a4848d, 0x0183d606, 0x0399e391, 0x01f67b86, 0x00c3c924, 0x03d56cdb, 0x020ab540, 0x0037c2e2}}}, + {X: Field{[10]uint32{0x03aa0e93, 0x001968a0, 0x01f62690, 0x010ebbec, 0x028f2e39, 0x0367a24e, 0x00031a19, 0x03fb9d41, 0x015e31d3, 0x0025005b}}, Y: Field{[10]uint32{0x03addac2, 0x03b49a21, 0x0307a38e, 0x00eea95e, 0x03f48437, 0x03bb9bf5, 0x0355d354, 0x01365900, 0x02ee5c45, 0x0019d40c}}}, + {X: Field{[10]uint32{0x00a6db03, 0x00f87f91, 0x01d791b4, 0x01bd609d, 0x00b2c85d, 0x02e19d7f, 0x01c0d426, 0x008d7419, 0x0104a4b3, 0x0002ff01}}, Y: Field{[10]uint32{0x024b8542, 0x03234691, 0x00f0558a, 0x025cd175, 0x02374271, 0x0129b264, 0x038ec7f9, 0x03cd14fe, 0x027a6c34, 0x00065551}}}, + {X: Field{[10]uint32{0x0266b17b, 0x01218b80, 0x03b32b0f, 0x0288098a, 0x02023568, 0x02a7c270, 0x03978846, 0x02ca246e, 0x0174d59f, 0x003bc8b4}}, Y: Field{[10]uint32{0x01dac83e, 0x01b810de, 0x001b732a, 0x01bdc70d, 0x033ee727, 0x038d2841, 0x039ccc3a, 0x0131d5a3, 0x00c97ab2, 0x002f15e1}}}, + {X: Field{[10]uint32{0x034318b5, 0x00b150ba, 0x0045657f, 0x0204bd6e, 0x0272ed5c, 0x03c815fb, 0x0388a38d, 0x02343d55, 0x01fbe194, 0x0026217d}}, Y: Field{[10]uint32{0x0199175c, 0x01509505, 0x004af2fe, 0x03b59da4, 0x027c82ad, 0x01a33ae3, 0x012c4677, 0x0263e65b, 0x02f69ef1, 0x0004d7f5}}}, + {X: Field{[10]uint32{0x02d382a0, 0x00c056a4, 0x019ae231, 0x02f38bb3, 0x03f28dcb, 0x02cb7e49, 0x00acc780, 0x0224b4e7, 0x03ce4ceb, 0x002d7dfb}}, Y: Field{[10]uint32{0x01b4b532, 0x03c2aee9, 0x038c5ba2, 0x01b4a6b3, 0x0371fb09, 0x0032f774, 0x00957c6e, 0x03c8d4f0, 0x005b51c3, 0x001a10d5}}}, + {X: Field{[10]uint32{0x0281c1bc, 0x0292b933, 0x01b33b93, 0x03962aed, 0x03d25365, 0x01a339d9, 0x01815b8d, 0x00118d6b, 0x0305465c, 0x0000cd83}}, Y: Field{[10]uint32{0x026cbedd, 0x034a2595, 0x0150176d, 0x03ad7204, 0x03231728, 0x004c19d4, 0x0369c425, 0x0140053f, 0x01f90c57, 0x001f922d}}}, + {X: Field{[10]uint32{0x012cffa5, 0x02491910, 0x005c47e6, 0x00219a33, 0x0389ed42, 0x02f51890, 0x00754d8f, 0x0041d902, 0x03d2b2e7, 0x00073770}}, Y: Field{[10]uint32{0x0121954e, 0x01b62735, 0x03528ade, 0x0109acda, 0x02c41c98, 0x0250ac22, 0x01b126bf, 0x03e298ff, 0x020cb2f1, 0x000791da}}}, + {X: Field{[10]uint32{0x008993f7, 0x027dcd01, 0x03ce1150, 0x008fe09c, 0x02962552, 0x0322eb90, 0x034fbe1b, 0x0214458c, 0x006a56a3, 0x00021d4d}}, Y: Field{[10]uint32{0x02b9dcc2, 0x030b205c, 0x0018e601, 0x03c6c498, 0x03c9f4d4, 0x01d7e8a1, 0x02994e6e, 0x022c0c43, 0x00a8a2ef, 0x0001939b}}}, + {X: Field{[10]uint32{0x00a9f22f, 0x03f90e4d, 0x00e2ad35, 0x031485ea, 0x00cc0819, 0x01220d6c, 0x01f8b8b9, 0x03a4e7c8, 0x0359f25c, 0x000ab32c}}, Y: Field{[10]uint32{0x035c4927, 0x01772ced, 0x0150b7b7, 0x02fb16e9, 0x01154bd7, 0x037c3b7c, 0x0213a37e, 0x034b9464, 0x00e9588a, 0x00354629}}}, + {X: Field{[10]uint32{0x03b04ed4, 0x02b18f8f, 0x03fffab7, 0x002c44c1, 0x0208cc33, 0x0099e378, 0x03f9d051, 0x02e4d918, 0x01b389d6, 0x00242b61}}, Y: Field{[10]uint32{0x036ef150, 0x03535232, 0x0094d991, 0x02f8560a, 0x0039aefa, 0x009c88ae, 0x03dcbd94, 0x020986bf, 0x023620a3, 0x0003941e}}}, + }, + { + {X: Field{[10]uint32{0x03b04ed4, 0x02b18f8f, 0x03fffab7, 0x002c44c1, 0x0208cc33, 0x0099e378, 0x03f9d051, 0x02e4d918, 0x01b389d6, 0x00242b61}}, Y: Field{[10]uint32{0x036ef150, 0x03535232, 0x0094d991, 0x02f8560a, 0x0039aefa, 0x009c88ae, 0x03dcbd94, 0x020986bf, 0x023620a3, 0x0003941e}}}, + {X: Field{[10]uint32{0x03dc0151, 0x022c3b69, 0x03bad281, 0x039919c1, 0x017e125b, 0x0210978f, 0x00b1d154, 0x0101dfd1, 0x000ef8c9, 0x001f8b35}}, Y: Field{[10]uint32{0x00721ec7, 0x02f14e48, 0x0082c9a3, 0x0102bbb8, 0x01889bee, 0x0087be57, 0x0261a8b3, 0x03eace0a, 0x01082adc, 0x002416dd}}}, + {X: Field{[10]uint32{0x00b7b678, 0x0176ccec, 0x03816627, 0x0046f3d8, 0x02f13c43, 0x009adb1d, 0x0186bca4, 0x008c6e86, 0x017334e4, 0x00061b92}}, Y: Field{[10]uint32{0x00d91fc1, 0x001dbcbe, 0x035dca7a, 0x00951254, 0x02110772, 0x002df99f, 0x03fc825c, 0x02f612a9, 0x00e49807, 0x00303518}}}, + {X: Field{[10]uint32{0x0345e597, 0x000eb904, 0x03cf90e1, 0x03e76e14, 0x039c636b, 0x007bd4a9, 0x00975bbd, 0x036b3887, 0x012195be, 0x002851bd}}, Y: Field{[10]uint32{0x005a770a, 0x0159dabd, 0x014b0767, 0x02c887c2, 0x00ea67a5, 0x02ecc6d0, 0x0295dd2d, 0x03fac26b, 0x030ab053, 0x00296a66}}}, + {X: Field{[10]uint32{0x03421fb8, 0x01b972ec, 0x015d0cf0, 0x03cbbd69, 0x02984971, 0x00edc904, 0x0206b34c, 0x02fd8b9f, 0x01834f6d, 0x00018723}}, Y: Field{[10]uint32{0x023ccd80, 0x03bd9a13, 0x00dd2995, 0x012ce9bf, 0x00806713, 0x03817ad7, 0x01392590, 0x02d2deea, 0x02d99003, 0x001b7f1a}}}, + {X: Field{[10]uint32{0x03b9dc8f, 0x03226e12, 0x01333d08, 0x00fbd7b7, 0x01aba9e9, 0x0149e1f4, 0x00f70353, 0x01a19092, 0x01cee1c2, 0x003f6650}}, Y: Field{[10]uint32{0x019780d5, 0x03ab94f9, 0x0138d743, 0x03f7bbfa, 0x027872b2, 0x02221679, 0x0297e057, 0x039bd1b7, 0x0075bd40, 0x001e907b}}}, + {X: Field{[10]uint32{0x036b35a4, 0x012f862b, 0x03b48712, 0x029aac9f, 0x01889f37, 0x00ce9a2b, 0x03632407, 0x03944edc, 0x023a208e, 0x003da9ad}}, Y: Field{[10]uint32{0x01f422a6, 0x02dbfb20, 0x01862cae, 0x01b9d7b8, 0x0319d575, 0x0158061b, 0x02d3704f, 0x004e2c72, 0x00a8002d, 0x000f7df2}}}, + {X: Field{[10]uint32{0x00e45444, 0x02d4ff13, 0x004e20cb, 0x007bfb33, 0x00dbde42, 0x0096a045, 0x03bf9dab, 0x024ee6f3, 0x01a1cf19, 0x0034931d}}, Y: Field{[10]uint32{0x03dd4a57, 0x00c91a61, 0x02524cb9, 0x03d267c7, 0x02bf7593, 0x003969e2, 0x00b7d181, 0x0307473f, 0x012de84d, 0x00163f87}}}, + {X: Field{[10]uint32{0x02954c11, 0x0208fa29, 0x01018b96, 0x00f05583, 0x037fa8a4, 0x0141de3f, 0x00d1b0f1, 0x030dd888, 0x0028c286, 0x0021e8bf}}, Y: Field{[10]uint32{0x032a8b45, 0x038ccb89, 0x0124b756, 0x00fca9e0, 0x02cc4893, 0x00349d4c, 0x031948da, 0x03b3be5e, 0x018b45aa, 0x000ceb54}}}, + {X: Field{[10]uint32{0x03a43ddc, 0x006bfa61, 0x02e4aeeb, 0x0286a655, 0x0124282c, 0x039ef7d5, 0x001eb85e, 0x02b1b684, 0x03864946, 0x002a2c22}}, Y: Field{[10]uint32{0x03a2a6b8, 0x000720b7, 0x036c3870, 0x0114ac41, 0x00a325b4, 0x03c3a3b7, 0x01591ffd, 0x01a807cc, 0x028bc8a3, 0x001fc03f}}}, + {X: Field{[10]uint32{0x02706ab6, 0x01d1cab8, 0x03c0dae4, 0x00774b94, 0x023c0b34, 0x030e133f, 0x0156efcb, 0x02069a11, 0x02046e78, 0x003851cb}}, Y: Field{[10]uint32{0x0158de05, 0x021a85a7, 0x0127536e, 0x015514f3, 0x00aa589d, 0x0321887e, 0x03691978, 0x023f1a0f, 0x02aa47c5, 0x0020b364}}}, + {X: Field{[10]uint32{0x03963645, 0x0250cb0e, 0x031f8e3e, 0x0201f9c7, 0x032dcdb2, 0x038c4cbe, 0x034781a2, 0x0298f9b9, 0x014fb1b8, 0x00317c25}}, Y: Field{[10]uint32{0x008be2dd, 0x0221d3c0, 0x03e4edbf, 0x00ac011e, 0x02a33050, 0x009835f9, 0x023cb440, 0x02dbec62, 0x031021b0, 0x003554b4}}}, + {X: Field{[10]uint32{0x03a84fb6, 0x02b95081, 0x01021ebf, 0x01d43e85, 0x03c42368, 0x03922e7a, 0x00b4d601, 0x02bbd77a, 0x02c804f8, 0x00072be4}}, Y: Field{[10]uint32{0x03149109, 0x00606409, 0x0267616b, 0x01a5a8b3, 0x02ec1cc1, 0x03c40588, 0x01a64f8f, 0x0394e920, 0x005ac976, 0x002f092e}}}, + {X: Field{[10]uint32{0x01c8381f, 0x024c48fa, 0x011a753a, 0x0358e0f0, 0x000ed3d6, 0x013f8404, 0x02beb463, 0x025f38d3, 0x0355bc6d, 0x0037ceb3}}, Y: Field{[10]uint32{0x0347de3a, 0x03f5a588, 0x009e61af, 0x01f99f8e, 0x03b10195, 0x036b347a, 0x0099c1de, 0x01e9d698, 0x00ca5190, 0x001acf76}}}, + {X: Field{[10]uint32{0x02955911, 0x0233f852, 0x0152db76, 0x0289837b, 0x03107e16, 0x00f5e0e5, 0x009efe9b, 0x01943496, 0x0169af09, 0x001c16ff}}, Y: Field{[10]uint32{0x03d200e4, 0x01f1a4ff, 0x0272d8bb, 0x0148a90b, 0x02297f3b, 0x0150147e, 0x0263d81f, 0x03e6429f, 0x00130b73, 0x003852a9}}}, + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + }, + { + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + {X: Field{[10]uint32{0x00f27076, 0x011f7e13, 0x03eaee68, 0x02b79d89, 0x01d89858, 0x03f66bd6, 0x02febe77, 0x020563f2, 0x02fd784e, 0x0013526b}}, Y: Field{[10]uint32{0x03aa781e, 0x002d9880, 0x018466b9, 0x0069f7d3, 0x006e0f2d, 0x016729bc, 0x023f2103, 0x0344d79c, 0x0059a10d, 0x00334cbf}}}, + {X: Field{[10]uint32{0x023809fa, 0x00ae3b74, 0x014be18e, 0x02cd4765, 0x00fd845c, 0x009147c2, 0x0293363f, 0x027c8a2e, 0x01be2e50, 0x000e0e07}}, Y: Field{[10]uint32{0x031fed52, 0x001d460c, 0x0324dbd7, 0x032ccb63, 0x003681fc, 0x0083ac73, 0x01405a55, 0x005f72c2, 0x010a0fb9, 0x003928cb}}}, + {X: Field{[10]uint32{0x01b62026, 0x02f2d5ca, 0x01d4ee8d, 0x03822274, 0x038d2a3d, 0x03d716a9, 0x016619e1, 0x01be14df, 0x039e85d5, 0x001d5914}}, Y: Field{[10]uint32{0x02ce0cf3, 0x00b23eb6, 0x01f33417, 0x036552de, 0x01684aac, 0x029c8a49, 0x031df524, 0x02cf1948, 0x01413749, 0x003075a1}}}, + {X: Field{[10]uint32{0x03c2a310, 0x01099225, 0x026303ea, 0x02950048, 0x01f186ae, 0x0291a668, 0x0121b82a, 0x00ab9bda, 0x0324e437, 0x00124989}}, Y: Field{[10]uint32{0x0227ded0, 0x006da057, 0x038ce0c4, 0x004a9d7f, 0x036d1636, 0x01c50c0e, 0x02cfa569, 0x02afe568, 0x0373bca7, 0x0004cdf9}}}, + {X: Field{[10]uint32{0x03663da4, 0x019b0640, 0x00b81f81, 0x02467d74, 0x03a5a362, 0x03112a8a, 0x008a6ed7, 0x01c179a0, 0x02356aa5, 0x001a9992}}, Y: Field{[10]uint32{0x03fc22c4, 0x00c4fecc, 0x004c9c28, 0x0049f9b0, 0x01089916, 0x01afc335, 0x0386ec19, 0x03a62ca7, 0x025954fd, 0x00112684}}}, + {X: Field{[10]uint32{0x02bd2d31, 0x012c1e73, 0x01b8d138, 0x015bfc1b, 0x004dcc1a, 0x011df8be, 0x02253b3e, 0x00324357, 0x028c1a24, 0x0038c195}}, Y: Field{[10]uint32{0x02546e44, 0x02d020e4, 0x03826692, 0x010af8dc, 0x02ffbc80, 0x03df436d, 0x00f2b107, 0x01098222, 0x03e37893, 0x0003ab1b}}}, + {X: Field{[10]uint32{0x03b4a278, 0x0136b355, 0x0082b536, 0x017c7fd0, 0x0078f61a, 0x02b67332, 0x006ff301, 0x009de59d, 0x017ad9df, 0x000842a4}}, Y: Field{[10]uint32{0x007b2231, 0x01c4ff43, 0x00bfc7f2, 0x006abfc8, 0x013789e6, 0x02359cdf, 0x039be81f, 0x0395ede8, 0x035450b5, 0x0019c386}}}, + {X: Field{[10]uint32{0x023136b0, 0x0030e78d, 0x01dd9c53, 0x0366aad0, 0x0374ebf8, 0x00fef58c, 0x01b0e762, 0x033bf09c, 0x000e2428, 0x000ee784}}, Y: Field{[10]uint32{0x00dbbc8a, 0x03b05bdb, 0x01f81953, 0x028ceb4c, 0x02a2ae28, 0x03d1d6c9, 0x01533eb8, 0x02edc77c, 0x00152d16, 0x003ebee6}}}, + {X: Field{[10]uint32{0x0190124e, 0x023ad4f7, 0x0085dea9, 0x01a14a07, 0x02c1e802, 0x036ce055, 0x029a1946, 0x015505df, 0x0293c06c, 0x001ebab2}}, Y: Field{[10]uint32{0x02021e31, 0x001e0408, 0x0104b3f5, 0x03e6e42a, 0x0159bc1b, 0x01b07654, 0x02caff04, 0x0243c13e, 0x03190c13, 0x0037eca6}}}, + {X: Field{[10]uint32{0x03485d3f, 0x023c11cb, 0x03eee960, 0x01a2041e, 0x0317ca07, 0x0177b7bd, 0x036ca80f, 0x0326a4ad, 0x0149712a, 0x002ec2ab}}, Y: Field{[10]uint32{0x00a2f975, 0x00e4940f, 0x00bffe79, 0x03e8c59c, 0x00895a5a, 0x00a5f68d, 0x00d201f7, 0x0151e63b, 0x0053c583, 0x003a9a67}}}, + {X: Field{[10]uint32{0x01ed815e, 0x01c0b541, 0x017b470f, 0x02af0700, 0x0166f440, 0x02551eb4, 0x035fad21, 0x0128cbae, 0x02c679f7, 0x00155a36}}, Y: Field{[10]uint32{0x00602df0, 0x02fd9300, 0x02151d9b, 0x03bb8960, 0x03eb05f7, 0x0341cfca, 0x00d6fe01, 0x02e99160, 0x00742788, 0x001ea17e}}}, + {X: Field{[10]uint32{0x02718dc9, 0x03b4ce8d, 0x023de4ae, 0x0136c044, 0x03e1e58b, 0x02bf8044, 0x028eb197, 0x03f30353, 0x02c8e4ee, 0x001e4242}}, Y: Field{[10]uint32{0x00fae7c5, 0x00c8ac47, 0x0008b963, 0x02dc2ea4, 0x02dd36af, 0x0366aa95, 0x01816cbc, 0x016e3c4f, 0x022b9190, 0x003aaadc}}}, + {X: Field{[10]uint32{0x0244a0c8, 0x0306f70b, 0x01932abe, 0x0100bb8a, 0x032c9be7, 0x031d0db0, 0x01bae600, 0x0250f2f2, 0x02884807, 0x001807a7}}, Y: Field{[10]uint32{0x0200e557, 0x024d04ae, 0x02659547, 0x0169ad1b, 0x01424e0c, 0x03feaeec, 0x00b8cfa9, 0x023b31c5, 0x02aa6fdc, 0x00169e88}}}, + {X: Field{[10]uint32{0x0360c7d1, 0x025a531f, 0x01ad2a26, 0x039f35dd, 0x028dd71d, 0x01526e99, 0x003dbbce, 0x01ed5470, 0x01ade9f9, 0x0039df20}}, Y: Field{[10]uint32{0x02d72449, 0x01607ca0, 0x006d34ec, 0x03dc70a6, 0x03631470, 0x03aa0550, 0x03c3b323, 0x004c8717, 0x0078eef8, 0x000eb3c5}}}, + {X: Field{[10]uint32{0x03231e11, 0x01bf5414, 0x01e3e668, 0x01940da0, 0x011f48e8, 0x02630d82, 0x0399ff91, 0x0217597f, 0x030176af, 0x00393cfe}}, Y: Field{[10]uint32{0x03eb73bc, 0x030e15db, 0x011c9822, 0x013b2547, 0x006cc7e7, 0x0280adca, 0x021a6d0e, 0x013c7059, 0x033ad0ef, 0x000798d8}}}, + }, + { + {X: Field{[10]uint32{0x03231e11, 0x01bf5414, 0x01e3e668, 0x01940da0, 0x011f48e8, 0x02630d82, 0x0399ff91, 0x0217597f, 0x030176af, 0x00393cfe}}, Y: Field{[10]uint32{0x03eb73bc, 0x030e15db, 0x011c9822, 0x013b2547, 0x006cc7e7, 0x0280adca, 0x021a6d0e, 0x013c7059, 0x033ad0ef, 0x000798d8}}}, + {X: Field{[10]uint32{0x03cdaf2f, 0x03b888ce, 0x032953bf, 0x02096e85, 0x0388531a, 0x02f6cd8b, 0x0064110a, 0x01cf807b, 0x03b76867, 0x0012cc32}}, Y: Field{[10]uint32{0x0126b5b7, 0x00cf518f, 0x00575680, 0x020790d2, 0x011fdf3c, 0x01f0f12a, 0x01e2c577, 0x018a6dbe, 0x010265bb, 0x001d318d}}}, + {X: Field{[10]uint32{0x03f05bd6, 0x027c139a, 0x01946539, 0x000c84aa, 0x00a2f56e, 0x02d1c37b, 0x032f51fe, 0x013fa420, 0x0241bee4, 0x0024030c}}, Y: Field{[10]uint32{0x000d358b, 0x00ab4efc, 0x03b15de5, 0x0160f13b, 0x01d69853, 0x01c2c90e, 0x01c72045, 0x03c3d7e5, 0x01e8e8b1, 0x001b0c7e}}}, + {X: Field{[10]uint32{0x0273059f, 0x03a70a69, 0x03a192ff, 0x01414383, 0x03ec1171, 0x01d19205, 0x015b20b1, 0x01c03734, 0x00aa7ae1, 0x0032ed0d}}, Y: Field{[10]uint32{0x027c070c, 0x02a59088, 0x03845b7d, 0x013c2b57, 0x0141d45e, 0x022d77eb, 0x02d49233, 0x02f45d58, 0x000ab4da, 0x00128688}}}, + {X: Field{[10]uint32{0x03105c50, 0x030a3327, 0x005257a7, 0x03bdec4e, 0x0182e0de, 0x00f08cf3, 0x028cc340, 0x0242ab58, 0x0362ab05, 0x0016a340}}, Y: Field{[10]uint32{0x00a4cde9, 0x02c8060e, 0x013c35c9, 0x02299b40, 0x00a605f6, 0x0050ffdd, 0x02a6b724, 0x0394da4d, 0x02b113d4, 0x0030167a}}}, + {X: Field{[10]uint32{0x032e294d, 0x03ecbde9, 0x00dd5be6, 0x028fc034, 0x02f158eb, 0x037dfb71, 0x02289eae, 0x00d2e469, 0x00805cd5, 0x000a77f9}}, Y: Field{[10]uint32{0x00469b52, 0x00dc983b, 0x02e69441, 0x0070e4a7, 0x01d1f196, 0x02281793, 0x0034e758, 0x01cb866d, 0x0026d006, 0x002fd9b6}}}, + {X: Field{[10]uint32{0x02d64feb, 0x03862e6c, 0x0292c647, 0x02964a48, 0x003772f8, 0x01b2e93a, 0x02f3a577, 0x03d82923, 0x01031232, 0x00364fd3}}, Y: Field{[10]uint32{0x00698359, 0x03ef564d, 0x00da37b0, 0x002fbb24, 0x0193e043, 0x01372313, 0x037311c5, 0x009cce88, 0x015d45cb, 0x001e4955}}}, + {X: Field{[10]uint32{0x02de12c0, 0x01e1b841, 0x010e94d4, 0x03161d18, 0x006d9cda, 0x0155c913, 0x02d7b1e7, 0x00b07341, 0x016d9c10, 0x003d1e01}}, Y: Field{[10]uint32{0x025361fe, 0x01db39b2, 0x012d769a, 0x03d826ae, 0x0026c17e, 0x001a1a53, 0x00095e01, 0x00e51b9a, 0x0210f33e, 0x001fc279}}}, + {X: Field{[10]uint32{0x039fbc84, 0x00813350, 0x02016722, 0x0245815e, 0x037e7062, 0x018ab196, 0x014e2bc6, 0x00a1106c, 0x01c6e36f, 0x000bc1da}}, Y: Field{[10]uint32{0x00201bec, 0x0240b787, 0x015d73fb, 0x01a93137, 0x01cca79b, 0x02438852, 0x01df0079, 0x02f777e9, 0x03724d73, 0x002d0d3c}}}, + {X: Field{[10]uint32{0x0026dea2, 0x02cbf4b4, 0x005d8928, 0x0114b167, 0x0187c84c, 0x0269b758, 0x01a1e26d, 0x02efef5c, 0x0248d561, 0x0007773e}}, Y: Field{[10]uint32{0x003de522, 0x0121cf46, 0x0273406f, 0x02314701, 0x00666fd6, 0x0100b008, 0x03ea34d6, 0x00e9f507, 0x001fa992, 0x0031be90}}}, + {X: Field{[10]uint32{0x02a758ea, 0x01fab321, 0x019c4d53, 0x006249fc, 0x01911883, 0x01505b8e, 0x006895a1, 0x000c2656, 0x0380559e, 0x003f9f99}}, Y: Field{[10]uint32{0x037ab649, 0x008b6576, 0x020d1e4f, 0x001d10c4, 0x033b8017, 0x02124947, 0x0008e169, 0x0372e623, 0x0167a281, 0x000e2a9a}}}, + {X: Field{[10]uint32{0x033773f7, 0x03c011b0, 0x019953c7, 0x034d16d6, 0x0150d44f, 0x0278dca8, 0x01410c00, 0x008db4f8, 0x0226f5dd, 0x000d56cc}}, Y: Field{[10]uint32{0x0087c182, 0x00f0ffc6, 0x01109005, 0x01e33389, 0x001e25df, 0x03487f2e, 0x0310eedd, 0x000eb527, 0x00807047, 0x00023b29}}}, + {X: Field{[10]uint32{0x00fffefa, 0x005589a3, 0x01afade7, 0x013dc194, 0x01101804, 0x0030ebe1, 0x01f6f915, 0x00c49f5b, 0x01ca7538, 0x00246ebd}}, Y: Field{[10]uint32{0x037f6faf, 0x00dbcd37, 0x0303dc7d, 0x00439bf4, 0x02f4bef3, 0x01f74f64, 0x01969f12, 0x02f3af97, 0x03119347, 0x00013973}}}, + {X: Field{[10]uint32{0x00785491, 0x037d01a4, 0x025d1dd3, 0x01792baa, 0x035291de, 0x00be19ad, 0x019f43cb, 0x002eb958, 0x00f17f26, 0x0024ac78}}, Y: Field{[10]uint32{0x00be555b, 0x0234d816, 0x00d7b9c9, 0x01df88a2, 0x003985fb, 0x00d396b4, 0x027c1d10, 0x02798f85, 0x00028d8d, 0x00207b11}}}, + {X: Field{[10]uint32{0x0133c546, 0x00245fa3, 0x01af32fc, 0x02cca17b, 0x0382575f, 0x003d7775, 0x02c5373e, 0x01e29f2c, 0x0121cb3f, 0x00111610}}, Y: Field{[10]uint32{0x000b4fd4, 0x01b461c0, 0x0273660a, 0x00f3ecb2, 0x00852f0a, 0x0246b688, 0x0225eae3, 0x01d4e9dc, 0x0377f3f8, 0x000c2364}}}, + {X: Field{[10]uint32{0x00eae29e, 0x02dbab88, 0x01d0716f, 0x00bc3538, 0x02c7034f, 0x01169099, 0x0161537a, 0x03ccc7ae, 0x029b18eb, 0x0023003e}}, Y: Field{[10]uint32{0x0302414b, 0x00a93199, 0x02c54e7d, 0x03ea078d, 0x00c2fada, 0x01cdb25d, 0x01c343a3, 0x008686a7, 0x0267fea5, 0x003be91c}}}, + }, + { + {X: Field{[10]uint32{0x00eae29e, 0x02dbab88, 0x01d0716f, 0x00bc3538, 0x02c7034f, 0x01169099, 0x0161537a, 0x03ccc7ae, 0x029b18eb, 0x0023003e}}, Y: Field{[10]uint32{0x0302414b, 0x00a93199, 0x02c54e7d, 0x03ea078d, 0x00c2fada, 0x01cdb25d, 0x01c343a3, 0x008686a7, 0x0267fea5, 0x003be91c}}}, + {X: Field{[10]uint32{0x018ada5f, 0x0326ac30, 0x02fb3e84, 0x01fca448, 0x03fd7e29, 0x00daf87b, 0x03b5bf96, 0x02d1bea2, 0x00176da2, 0x000933f0}}, Y: Field{[10]uint32{0x038a586b, 0x02984e65, 0x014f268f, 0x028693e0, 0x03ed959c, 0x037b6a49, 0x028714d5, 0x01869a61, 0x03bb079c, 0x003affe3}}}, + {X: Field{[10]uint32{0x03fd913d, 0x025580fa, 0x009eac3f, 0x039bb953, 0x0050a680, 0x030aa348, 0x0107a084, 0x0377e1d3, 0x02a7e907, 0x000d8d8a}}, Y: Field{[10]uint32{0x012e243d, 0x03e6bab1, 0x03aafc44, 0x00435acb, 0x02d830bb, 0x00368aa0, 0x01624437, 0x02bf54d0, 0x00676cb8, 0x00123c9e}}}, + {X: Field{[10]uint32{0x00679da2, 0x00c62565, 0x017edf10, 0x01ff1fc1, 0x0216ddd6, 0x004a4bb1, 0x02ded72a, 0x02f20ba8, 0x0158d4b9, 0x0000129f}}, Y: Field{[10]uint32{0x039ffe26, 0x01fd211d, 0x0228a487, 0x025258fe, 0x0371c3b4, 0x03b1c6ce, 0x031d8147, 0x032dd79a, 0x01b76702, 0x002e62b1}}}, + {X: Field{[10]uint32{0x01132896, 0x02eafe6b, 0x02c967ca, 0x02eadef1, 0x01fcb1e3, 0x03764803, 0x015ad962, 0x00780bca, 0x036df32a, 0x001121e5}}, Y: Field{[10]uint32{0x03685248, 0x0006c4ab, 0x02a7a48c, 0x016989da, 0x0306b40d, 0x0115868c, 0x009a9077, 0x02bf87bf, 0x0060d115, 0x0009ef56}}}, + {X: Field{[10]uint32{0x035732c0, 0x021934dd, 0x037aa859, 0x039c8cdd, 0x02202fe5, 0x032c425b, 0x00a5d1b7, 0x012e6d89, 0x0331f8b7, 0x0023cf33}}, Y: Field{[10]uint32{0x01b9415b, 0x02f79799, 0x00825e73, 0x01dd5216, 0x00a90e68, 0x01f394f6, 0x02f46d99, 0x0394c627, 0x013e2d39, 0x0019fc73}}}, + {X: Field{[10]uint32{0x03a2670c, 0x0055bdaf, 0x033e6e08, 0x00ae8189, 0x007400f8, 0x00cd40c9, 0x02a9caa8, 0x020de22d, 0x02c28bcb, 0x0012934e}}, Y: Field{[10]uint32{0x02c1764d, 0x02e7ff75, 0x03eed808, 0x0132fca6, 0x01493059, 0x03bc0ae7, 0x027711dd, 0x01693c5f, 0x011c0184, 0x001c2aee}}}, + {X: Field{[10]uint32{0x007c4b65, 0x00d3ab72, 0x032a9ccf, 0x0228781e, 0x0196f880, 0x0019b392, 0x036c5e2c, 0x00071ff1, 0x01c4cbd0, 0x003b9f5a}}, Y: Field{[10]uint32{0x0136a95a, 0x023d13b4, 0x002e523e, 0x0266eba5, 0x02c33e89, 0x00c3cbb8, 0x0192abf0, 0x004e0868, 0x026ec1a4, 0x003b3218}}}, + {X: Field{[10]uint32{0x00b24aa7, 0x01abf893, 0x01c530d9, 0x0318e4d1, 0x00903108, 0x03fe3f86, 0x02e6fd89, 0x00600b0e, 0x01190ae9, 0x0017decb}}, Y: Field{[10]uint32{0x02693d7d, 0x0201d0d2, 0x01d0c6d7, 0x01c24f20, 0x03ce8deb, 0x03399f11, 0x023f80a3, 0x03caccc2, 0x0200c4fd, 0x0001dc0d}}}, + {X: Field{[10]uint32{0x03004130, 0x018cb5ff, 0x02b09842, 0x00ce070d, 0x0249fd86, 0x01532d6a, 0x02a14e52, 0x0061ac99, 0x01b5f72d, 0x001435dd}}, Y: Field{[10]uint32{0x036e406d, 0x02e31937, 0x024c3456, 0x0117bbda, 0x032975d9, 0x0004018f, 0x01724346, 0x02955f14, 0x023b0f4e, 0x000d007b}}}, + {X: Field{[10]uint32{0x037fb8bd, 0x006f17cb, 0x0090a419, 0x02857f90, 0x007bc464, 0x025221b6, 0x02c24e6d, 0x024340ab, 0x0051339d, 0x00144e5d}}, Y: Field{[10]uint32{0x03908c0f, 0x012b0b60, 0x00d5a809, 0x034f8fe6, 0x03fafc32, 0x03a05711, 0x008fefda, 0x00efcd2e, 0x003e4764, 0x003f35c5}}}, + {X: Field{[10]uint32{0x00889f3f, 0x007e0e4d, 0x01da7f2a, 0x022d1425, 0x03c4feb2, 0x005a6c3a, 0x02a3469b, 0x00465887, 0x0026f1b2, 0x0021e644}}, Y: Field{[10]uint32{0x03bb792b, 0x00b7e6f0, 0x0037b49e, 0x006fca18, 0x01e932f6, 0x005fc9e7, 0x032f2cb7, 0x00765884, 0x014ca5a9, 0x00377aae}}}, + {X: Field{[10]uint32{0x0236ca73, 0x01d2457b, 0x033ede2b, 0x034daeef, 0x03eac864, 0x03c05221, 0x0029112b, 0x037ee2a9, 0x02d62bfb, 0x0033e0c5}}, Y: Field{[10]uint32{0x02c25534, 0x0248650b, 0x0310f5b4, 0x02636235, 0x001c9615, 0x0037329a, 0x00445089, 0x0275cf8e, 0x018deb5d, 0x00027fad}}}, + {X: Field{[10]uint32{0x019c8f0a, 0x036611af, 0x00e64afc, 0x00b22f61, 0x00af3e9f, 0x0300ea1f, 0x0126603b, 0x02913f0e, 0x00ed297b, 0x001b8845}}, Y: Field{[10]uint32{0x016a2c9b, 0x02452374, 0x0195ebd7, 0x01d743e5, 0x01090bec, 0x00317647, 0x026d50f8, 0x001b89f6, 0x020cc26f, 0x00015646}}}, + {X: Field{[10]uint32{0x0352f97d, 0x024df5ad, 0x036613c8, 0x031d7cd1, 0x025a2efb, 0x0233e985, 0x039d2866, 0x02d27794, 0x029a4c4b, 0x00218437}}, Y: Field{[10]uint32{0x031b1af2, 0x01f73507, 0x003e0805, 0x027d5155, 0x0257ab4d, 0x014cfe67, 0x03cd99b2, 0x002ef24d, 0x03a02b63, 0x0034c665}}}, + {X: Field{[10]uint32{0x00cb3e41, 0x03f77f18, 0x012c0997, 0x013cc22e, 0x03143d08, 0x027a63b4, 0x010cec0a, 0x020a7cf8, 0x00e69dd4, 0x0039e89b}}, Y: Field{[10]uint32{0x032cfd51, 0x02a50873, 0x003e20e8, 0x0301083a, 0x00d0a6b2, 0x02abeec6, 0x01b006a1, 0x02612d1c, 0x02300fa7, 0x000a9d63}}}, + }, + { + {X: Field{[10]uint32{0x00cb3e41, 0x03f77f18, 0x012c0997, 0x013cc22e, 0x03143d08, 0x027a63b4, 0x010cec0a, 0x020a7cf8, 0x00e69dd4, 0x0039e89b}}, Y: Field{[10]uint32{0x032cfd51, 0x02a50873, 0x003e20e8, 0x0301083a, 0x00d0a6b2, 0x02abeec6, 0x01b006a1, 0x02612d1c, 0x02300fa7, 0x000a9d63}}}, + {X: Field{[10]uint32{0x034ae861, 0x0396e45e, 0x02fa9d97, 0x03935b8c, 0x01203c35, 0x01c8227d, 0x038bfb67, 0x03e34034, 0x02ba036b, 0x003d72be}}, Y: Field{[10]uint32{0x0182239c, 0x0308e703, 0x005f3cc9, 0x027154bc, 0x019b3b2a, 0x01020e45, 0x03f99046, 0x01b605ef, 0x038a022a, 0x00067a0e}}}, + {X: Field{[10]uint32{0x02ee42db, 0x027f4afe, 0x0314a70f, 0x016d1cc1, 0x01d9bbbc, 0x007b2ff0, 0x03b6edb9, 0x024543f1, 0x03e7d9b5, 0x00330d09}}, Y: Field{[10]uint32{0x01d87bdb, 0x00a70045, 0x0022dc62, 0x02b639c9, 0x0010e5cb, 0x02c85480, 0x01e3fd3f, 0x031a8621, 0x0041a521, 0x003a8926}}}, + {X: Field{[10]uint32{0x012a9651, 0x035335ef, 0x0182084f, 0x02712532, 0x028f9e50, 0x01fa0150, 0x01f5156d, 0x00fc7c4b, 0x0024ceb6, 0x003a4e24}}, Y: Field{[10]uint32{0x02786824, 0x0378add7, 0x00bfefef, 0x033b19dc, 0x018d7110, 0x019c6abc, 0x0287abaf, 0x019657e4, 0x00872372, 0x0021921a}}}, + {X: Field{[10]uint32{0x02d4a086, 0x00d9b19f, 0x0010eff4, 0x00563a71, 0x00b1d75c, 0x02f2d73d, 0x003c585f, 0x011177b2, 0x01bacd98, 0x002523c1}}, Y: Field{[10]uint32{0x022bca4b, 0x006003e7, 0x022d1a2a, 0x029c70fe, 0x011c2328, 0x00044e50, 0x03450a66, 0x00a8ce0b, 0x009ffb5a, 0x0021932a}}}, + {X: Field{[10]uint32{0x0296e4f1, 0x029c594b, 0x00030cb0, 0x01802ba0, 0x02ff5f01, 0x00d7bf32, 0x01777083, 0x0065f880, 0x008f0198, 0x0015aec5}}, Y: Field{[10]uint32{0x02b0582e, 0x027c067b, 0x030eb588, 0x0348012b, 0x037313d1, 0x038c3aa7, 0x0303ed8b, 0x0028cefa, 0x00a56130, 0x00282561}}}, + {X: Field{[10]uint32{0x03542c21, 0x02fa9b2d, 0x00c15c0c, 0x034a3a99, 0x03ae19f4, 0x01475b50, 0x016fc454, 0x026b2419, 0x01629291, 0x00096106}}, Y: Field{[10]uint32{0x032bfabf, 0x02f8c659, 0x02d7b3be, 0x021b930a, 0x01f3e3a1, 0x031d44f5, 0x025daa4c, 0x00912007, 0x031f1cdb, 0x003f2cd6}}}, + {X: Field{[10]uint32{0x00ddab8b, 0x03506b9f, 0x00e6fcf2, 0x00494f1a, 0x039f0e4d, 0x020b430d, 0x0116900d, 0x0095afb4, 0x01d87829, 0x00099156}}, Y: Field{[10]uint32{0x001de473, 0x0192d140, 0x031e6c9f, 0x02bce72b, 0x037a8631, 0x00d01cb5, 0x03bc6370, 0x0144b3bd, 0x011926d3, 0x001e796f}}}, + {X: Field{[10]uint32{0x001ecbf8, 0x01187d03, 0x017ca43c, 0x037a6bbb, 0x036489f0, 0x007a1087, 0x029754cc, 0x0314948a, 0x01c41373, 0x001f84b3}}, Y: Field{[10]uint32{0x00bed615, 0x016e336c, 0x019f59d4, 0x00763f87, 0x01c969f6, 0x03934496, 0x03f94dab, 0x0320dc50, 0x0388888d, 0x001c4a13}}}, + {X: Field{[10]uint32{0x018a26c1, 0x028a3ee2, 0x0304ae2d, 0x0285ce4e, 0x019a954f, 0x0309b871, 0x02351579, 0x014aedba, 0x00fd373b, 0x002da832}}, Y: Field{[10]uint32{0x0278217c, 0x0143b6a2, 0x01a06f55, 0x03a162ad, 0x00fc94a5, 0x02f69feb, 0x0101e3fe, 0x01d2526a, 0x03bfda03, 0x0017bc64}}}, + {X: Field{[10]uint32{0x00557d86, 0x01994705, 0x03ff417e, 0x011e3999, 0x031cfeec, 0x028169b3, 0x02b91ca7, 0x010a99dc, 0x02ff2a37, 0x0012e3b0}}, Y: Field{[10]uint32{0x01167eb9, 0x026c646d, 0x03692bdd, 0x03bc3f0f, 0x0328d5f2, 0x0149eb17, 0x024072de, 0x015eac52, 0x03ff04c1, 0x003f79b0}}}, + {X: Field{[10]uint32{0x01f23d1f, 0x015fd660, 0x036d8a4c, 0x035c8300, 0x02b6b25f, 0x03f62829, 0x03d489e1, 0x002eeef4, 0x00153d67, 0x002ce63a}}, Y: Field{[10]uint32{0x032ff3fc, 0x00faffe0, 0x016cd158, 0x022b4985, 0x02ea791d, 0x02c02e94, 0x037feb2f, 0x03d1fc1f, 0x0022572d, 0x001a7d67}}}, + {X: Field{[10]uint32{0x0380763c, 0x020b4ed1, 0x0291d52b, 0x017a4995, 0x025f8a6d, 0x025eb01f, 0x02436dc6, 0x00e9094c, 0x01073396, 0x003f3570}}, Y: Field{[10]uint32{0x00e851cb, 0x039d080e, 0x023a4b54, 0x00b9c591, 0x00b119b2, 0x03dcb8e3, 0x0320db35, 0x00b118ed, 0x03e2e552, 0x0006376a}}}, + {X: Field{[10]uint32{0x03e9fc8d, 0x0311e98c, 0x028ad2b1, 0x0026093c, 0x0348b848, 0x0118c69c, 0x00d0b205, 0x0177fe9b, 0x01c1bb42, 0x0018d283}}, Y: Field{[10]uint32{0x033f87b6, 0x01fcc2c9, 0x00616958, 0x02863b57, 0x03519ad5, 0x03792a73, 0x0205a657, 0x012db2bf, 0x021fe75a, 0x0035d6f8}}}, + {X: Field{[10]uint32{0x018ef686, 0x00ef8c17, 0x02e66bce, 0x03d0089c, 0x03f68e48, 0x02099b94, 0x038a5daf, 0x032f9488, 0x00ee5843, 0x002403cb}}, Y: Field{[10]uint32{0x0121a8cf, 0x029259f8, 0x016d5073, 0x03d0f245, 0x00596cdf, 0x00d27444, 0x01c551b1, 0x01096b58, 0x0155ec60, 0x001ccab0}}}, + {X: Field{[10]uint32{0x026b80ef, 0x00a7acf7, 0x0024f3cf, 0x0259f5e5, 0x0171cbcb, 0x00ef2f71, 0x03540c22, 0x00bb2348, 0x020ee366, 0x002d9167}}, Y: Field{[10]uint32{0x0271ba45, 0x02fc2d86, 0x01b2ff30, 0x01b5238d, 0x03c4b3ae, 0x0159876c, 0x01adf16e, 0x0381b787, 0x036d06f3, 0x00019f21}}}, + }, + { + {X: Field{[10]uint32{0x026b80ef, 0x00a7acf7, 0x0024f3cf, 0x0259f5e5, 0x0171cbcb, 0x00ef2f71, 0x03540c22, 0x00bb2348, 0x020ee366, 0x002d9167}}, Y: Field{[10]uint32{0x0271ba45, 0x02fc2d86, 0x01b2ff30, 0x01b5238d, 0x03c4b3ae, 0x0159876c, 0x01adf16e, 0x0381b787, 0x036d06f3, 0x00019f21}}}, + {X: Field{[10]uint32{0x033eb51f, 0x03bcdd40, 0x00211253, 0x01daf9e7, 0x03b68905, 0x007d0564, 0x0136f730, 0x00f22393, 0x00f0d982, 0x0039763a}}, Y: Field{[10]uint32{0x0262a2d9, 0x016f6596, 0x0354979d, 0x011b67c3, 0x00e509dc, 0x023fbbbc, 0x0316a57d, 0x00f812ae, 0x01b7861e, 0x0013707a}}}, + {X: Field{[10]uint32{0x019888e9, 0x033c9e4c, 0x00a8b439, 0x01afc912, 0x033d12ba, 0x0259a059, 0x0260d302, 0x029b8b77, 0x02773ac3, 0x0007e43a}}, Y: Field{[10]uint32{0x03113b79, 0x037f25fb, 0x022e656f, 0x03fb9654, 0x00213751, 0x007ae5aa, 0x00153d27, 0x02843a56, 0x027c15da, 0x00226f8d}}}, + {X: Field{[10]uint32{0x03155e64, 0x019d9203, 0x0011737a, 0x013ea28c, 0x01ab66be, 0x006eb837, 0x02b0f732, 0x0230f715, 0x03f77dbc, 0x002a7289}}, Y: Field{[10]uint32{0x021b3297, 0x03cccf15, 0x030ae1f3, 0x02086f2b, 0x00875d41, 0x0300b401, 0x017d2246, 0x00535346, 0x035678fb, 0x003d2ecc}}}, + {X: Field{[10]uint32{0x0162222c, 0x03bedbcd, 0x032c6085, 0x01e6479b, 0x02de0344, 0x00d2d4ae, 0x0302bad3, 0x0382b5b9, 0x014dedff, 0x0004e939}}, Y: Field{[10]uint32{0x00200145, 0x0059a32a, 0x004c08cb, 0x01deb724, 0x02d4f9c5, 0x03582694, 0x00ac2f81, 0x03a04ecb, 0x014e5816, 0x0032759f}}}, + {X: Field{[10]uint32{0x01bf6c42, 0x02acf770, 0x0075393e, 0x026c4662, 0x02f7793d, 0x01b3b9d3, 0x03465481, 0x00171fb9, 0x033cd6c1, 0x00340b86}}, Y: Field{[10]uint32{0x03bc54cc, 0x018ca3e1, 0x02aac133, 0x026e4c6d, 0x02bca587, 0x00349149, 0x0332270d, 0x00896049, 0x00f3ca8e, 0x002682dd}}}, + {X: Field{[10]uint32{0x003b46bb, 0x0393703d, 0x02525437, 0x018feb24, 0x0112ed3a, 0x0211576f, 0x0007c05d, 0x02ab7475, 0x02bf233c, 0x00186647}}, Y: Field{[10]uint32{0x0020a848, 0x03d64073, 0x00d8ef48, 0x027294bb, 0x011ca872, 0x01beeb7c, 0x02f38716, 0x03924a54, 0x0308f3fd, 0x00007178}}}, + {X: Field{[10]uint32{0x02ee247c, 0x02f18a75, 0x00ee06d4, 0x0211fd47, 0x011f478e, 0x0073f9d6, 0x03a10561, 0x035fc97a, 0x01800686, 0x001a3edc}}, Y: Field{[10]uint32{0x0201865d, 0x03e08b46, 0x03c9dae1, 0x002c131c, 0x039a8d58, 0x0006c301, 0x03354275, 0x0258d9cd, 0x023462dd, 0x003344b4}}}, + {X: Field{[10]uint32{0x021add3b, 0x02f8f774, 0x03d8f7e5, 0x013d15c9, 0x018b9a94, 0x03458984, 0x0039cdb0, 0x034e1d24, 0x02a4b787, 0x003a89eb}}, Y: Field{[10]uint32{0x028ce7dd, 0x038a476d, 0x01be71b5, 0x035a3938, 0x0278b212, 0x00970bd8, 0x023ceb23, 0x005f795c, 0x01e6e42a, 0x0031c3fc}}}, + {X: Field{[10]uint32{0x02da1f54, 0x016af6f8, 0x025df934, 0x03088c50, 0x021b2b52, 0x024d1445, 0x03550ab1, 0x0183ae61, 0x03b23df2, 0x001c4dfd}}, Y: Field{[10]uint32{0x01c3edbc, 0x02350db3, 0x01bb84af, 0x03551b3f, 0x03ebf081, 0x03c98029, 0x00dacb17, 0x0201d397, 0x02d80435, 0x0017f9e2}}}, + {X: Field{[10]uint32{0x011ff757, 0x02be2ed8, 0x0226e6e8, 0x01d07130, 0x029b4ce9, 0x01b8adb6, 0x01010f8b, 0x03f552ea, 0x01356b7f, 0x00165194}}, Y: Field{[10]uint32{0x014d031a, 0x019bb2a2, 0x03e3b28a, 0x01edfeff, 0x01961bbc, 0x017101be, 0x02038d01, 0x009d4010, 0x020ce5df, 0x000d844d}}}, + {X: Field{[10]uint32{0x036c15c2, 0x03d1fc63, 0x00f1ca1e, 0x005323ce, 0x003de764, 0x027450d2, 0x01739813, 0x01d5ffa8, 0x0052bca1, 0x002115aa}}, Y: Field{[10]uint32{0x03174134, 0x03bf0ca2, 0x03671ff1, 0x002615be, 0x034cc90f, 0x0041e79f, 0x0349ec37, 0x00b37bf4, 0x0246d484, 0x00386e76}}}, + {X: Field{[10]uint32{0x036160b5, 0x009628d8, 0x02bc0676, 0x0091c39f, 0x00ccc53f, 0x000247b0, 0x003af797, 0x00ca43a1, 0x023915f7, 0x0005ac9b}}, Y: Field{[10]uint32{0x00a1dc0e, 0x0097efd6, 0x03ef8146, 0x02b1c2e8, 0x00e1363a, 0x018d9535, 0x03643524, 0x03be2ed8, 0x025a6302, 0x000183d5}}}, + {X: Field{[10]uint32{0x021b793e, 0x0077a4e3, 0x025183d6, 0x028ac34b, 0x01d36aee, 0x033eab93, 0x002eccf2, 0x00739970, 0x017c9835, 0x0013c545}}, Y: Field{[10]uint32{0x03ba9889, 0x03307f70, 0x007aab4f, 0x012cd529, 0x02c0daff, 0x03352833, 0x01da9db9, 0x02e4e7f2, 0x0366079d, 0x00302538}}}, + {X: Field{[10]uint32{0x03b32db8, 0x0134a24d, 0x0391f396, 0x0127d91d, 0x01c91ed7, 0x010b3aa1, 0x02a143c8, 0x027e4c6f, 0x0295c455, 0x000092d4}}, Y: Field{[10]uint32{0x0264f760, 0x0153eaaa, 0x001a9594, 0x0044816e, 0x0062ab68, 0x031796fa, 0x02e2821c, 0x00c271ed, 0x038f5bff, 0x001827fb}}}, + {X: Field{[10]uint32{0x016943e8, 0x0283d6d2, 0x005a5ded, 0x0319f9cf, 0x031d6f1f, 0x0063c188, 0x03234aa1, 0x02e101e4, 0x00c8280b, 0x0035a2a0}}, Y: Field{[10]uint32{0x03133120, 0x0321099a, 0x0295a294, 0x023de114, 0x035b0e7b, 0x01ec38a2, 0x00b1f917, 0x021b4031, 0x01fff4b5, 0x0036e2ea}}}, + }, + { + {X: Field{[10]uint32{0x016943e8, 0x0283d6d2, 0x005a5ded, 0x0319f9cf, 0x031d6f1f, 0x0063c188, 0x03234aa1, 0x02e101e4, 0x00c8280b, 0x0035a2a0}}, Y: Field{[10]uint32{0x03133120, 0x0321099a, 0x0295a294, 0x023de114, 0x035b0e7b, 0x01ec38a2, 0x00b1f917, 0x021b4031, 0x01fff4b5, 0x0036e2ea}}}, + {X: Field{[10]uint32{0x0012b6fd, 0x02888b29, 0x02b828bd, 0x00f1bdc0, 0x00aced05, 0x01d48dcf, 0x02f8efb3, 0x0102f900, 0x009c677a, 0x003c5a90}}, Y: Field{[10]uint32{0x00a052da, 0x036b9dfb, 0x03ca4268, 0x0164927a, 0x02165406, 0x0138c393, 0x026a75a7, 0x009e675e, 0x01171453, 0x000a904c}}}, + {X: Field{[10]uint32{0x00a1c4f9, 0x010aa863, 0x0228235b, 0x00d32adf, 0x004f4efe, 0x0187c5bd, 0x000b83da, 0x01ca3131, 0x038f22bd, 0x001e057d}}, Y: Field{[10]uint32{0x0378bc15, 0x007a8dad, 0x011e19ab, 0x039855df, 0x015cb42d, 0x011630d7, 0x0193cf31, 0x02bda9f7, 0x01e8cd39, 0x00307180}}}, + {X: Field{[10]uint32{0x026dd4e4, 0x0282db8c, 0x018325c1, 0x00bdafb6, 0x01b89f4f, 0x025dbe13, 0x0237f699, 0x01bd0bef, 0x0106ab76, 0x0010552d}}, Y: Field{[10]uint32{0x035ded1c, 0x0164a541, 0x02dd46c8, 0x03674788, 0x02414ea9, 0x004097fd, 0x006e44d6, 0x02622253, 0x035043c5, 0x0008eb41}}}, + {X: Field{[10]uint32{0x028c8530, 0x01b870fb, 0x00d8e6d2, 0x0207be3d, 0x01512df6, 0x005a9b1b, 0x0377c640, 0x01005db8, 0x03cda0ec, 0x0030e49c}}, Y: Field{[10]uint32{0x018446c7, 0x00c3c3de, 0x01715c40, 0x02f68bbb, 0x0050edfc, 0x0070c666, 0x001d3944, 0x00f23a74, 0x02425743, 0x0023106f}}}, + {X: Field{[10]uint32{0x03ed5996, 0x0133a2d0, 0x02f53bde, 0x01664d82, 0x006831fe, 0x00a06e49, 0x02fbc903, 0x0293a924, 0x03e9fe99, 0x000691ad}}, Y: Field{[10]uint32{0x00c85cae, 0x013b447a, 0x0345c2ee, 0x02a7bd49, 0x01508794, 0x0018fafd, 0x03ee084a, 0x03715c38, 0x001ea3f1, 0x001a0f3a}}}, + {X: Field{[10]uint32{0x037a26c1, 0x00902ec8, 0x036a531f, 0x0163036f, 0x01166c6e, 0x00740ec9, 0x0122431c, 0x0046c09d, 0x0047f584, 0x00368c5d}}, Y: Field{[10]uint32{0x00f74d6f, 0x020dbb3b, 0x01525f51, 0x03175ea0, 0x03d36836, 0x0096762d, 0x0384167c, 0x0231a748, 0x03b87f5d, 0x001d4ee5}}}, + {X: Field{[10]uint32{0x037f0246, 0x0069e98f, 0x03ddf4c5, 0x0127f1c9, 0x0293e86e, 0x02d655ba, 0x00a8d4d0, 0x02570420, 0x012769cc, 0x002dcf19}}, Y: Field{[10]uint32{0x022a407b, 0x0394593a, 0x014e5597, 0x03931b95, 0x021a0d72, 0x016db07a, 0x0135893c, 0x032a752d, 0x03107174, 0x002699f6}}}, + {X: Field{[10]uint32{0x0339dc49, 0x018a2a4d, 0x01603d2b, 0x03699bd5, 0x02239392, 0x02ffc8c6, 0x024ac508, 0x0039b041, 0x02cb02af, 0x001a92f9}}, Y: Field{[10]uint32{0x02edd5cf, 0x028ae77c, 0x00a4d3e6, 0x0132c529, 0x00ab7e2b, 0x003ea016, 0x00166e36, 0x001d65f7, 0x03aa2a89, 0x003c5763}}}, + {X: Field{[10]uint32{0x00f8fb8c, 0x026fe776, 0x01e148ad, 0x026ea96f, 0x014cdc2b, 0x031cc044, 0x012facb5, 0x00803254, 0x027060d8, 0x000d966e}}, Y: Field{[10]uint32{0x00c8a3d1, 0x011ae31f, 0x0313575e, 0x0353912e, 0x031e142e, 0x031d261f, 0x01725f8e, 0x00685c4e, 0x01e806e0, 0x0013b9ea}}}, + {X: Field{[10]uint32{0x02987fac, 0x03a28311, 0x02f6798b, 0x021902a1, 0x008bc90f, 0x03b2628f, 0x02982603, 0x01fc4d13, 0x029f13ae, 0x00007df1}}, Y: Field{[10]uint32{0x01174c68, 0x0079ce06, 0x03c263f9, 0x038867da, 0x01cb7f5d, 0x00a6adbe, 0x031036e3, 0x0288b796, 0x003f36fd, 0x002753b3}}}, + {X: Field{[10]uint32{0x022e607b, 0x034d673b, 0x036aa1f4, 0x03b1b03c, 0x0388aa1e, 0x015ff74a, 0x01111f56, 0x01dcb083, 0x0367fd31, 0x0001dccf}}, Y: Field{[10]uint32{0x00614763, 0x03cc4773, 0x017d26a2, 0x03816f80, 0x0089e3bd, 0x02ec55bd, 0x0263a8c5, 0x020a17ab, 0x00fbac17, 0x003f67fa}}}, + {X: Field{[10]uint32{0x02daba4d, 0x00e86f5d, 0x016261d3, 0x003880c6, 0x039c65fb, 0x023e8af2, 0x03062edd, 0x034e072d, 0x0001761f, 0x00155fa5}}, Y: Field{[10]uint32{0x03a52316, 0x01d286ed, 0x0190a513, 0x03d7e90d, 0x02c5e9b8, 0x01732f21, 0x0135cfa1, 0x029f811b, 0x033a601f, 0x001e9fa3}}}, + {X: Field{[10]uint32{0x0005fbdd, 0x00b6734f, 0x001396e2, 0x0149d392, 0x0279589d, 0x01abe80c, 0x0120654b, 0x003120e2, 0x010a0031, 0x0038f91d}}, Y: Field{[10]uint32{0x0135b883, 0x0088c745, 0x02ffbcba, 0x02ff173e, 0x00b46587, 0x01868481, 0x02350499, 0x00964014, 0x0301abad, 0x0003e9e5}}}, + {X: Field{[10]uint32{0x01f5341a, 0x03d4bfca, 0x036b8038, 0x00b19a58, 0x019cc7a3, 0x01ec4050, 0x029d40ea, 0x0216a4ec, 0x02821998, 0x000eb6b6}}, Y: Field{[10]uint32{0x0186c6cc, 0x016024d9, 0x00fbcb51, 0x0396d17a, 0x03e9d6d2, 0x01aac405, 0x02e35bf3, 0x00da7d54, 0x02228999, 0x002ffa87}}}, + {X: Field{[10]uint32{0x028d3d5d, 0x016603f0, 0x01cea409, 0x02e5cd12, 0x009612ae, 0x001e8c2c, 0x01c02709, 0x0201094b, 0x017df65c, 0x000c92bb}}, Y: Field{[10]uint32{0x02ab7c84, 0x00892be5, 0x02843967, 0x0031f8cc, 0x0319213b, 0x02bb07d3, 0x030c0c35, 0x007cbfc4, 0x025774b6, 0x0019228d}}}, + }, + { + {X: Field{[10]uint32{0x028d3d5d, 0x016603f0, 0x01cea409, 0x02e5cd12, 0x009612ae, 0x001e8c2c, 0x01c02709, 0x0201094b, 0x017df65c, 0x000c92bb}}, Y: Field{[10]uint32{0x02ab7c84, 0x00892be5, 0x02843967, 0x0031f8cc, 0x0319213b, 0x02bb07d3, 0x030c0c35, 0x007cbfc4, 0x025774b6, 0x0019228d}}}, + {X: Field{[10]uint32{0x02919749, 0x00e0e06c, 0x01b1fa8f, 0x012a3783, 0x03f72b3e, 0x02035c80, 0x01326818, 0x012408a3, 0x031ea26f, 0x000cb24c}}, Y: Field{[10]uint32{0x0290b5e3, 0x03a5ec3c, 0x02b09631, 0x02f6b8e6, 0x00268a4a, 0x01bcf6ee, 0x01a2f02b, 0x0272d5a5, 0x032b3420, 0x0035f349}}}, + {X: Field{[10]uint32{0x03d53ed3, 0x0245d60b, 0x02ccef5c, 0x03ee7695, 0x01163f74, 0x0077df12, 0x00f60b93, 0x01cab56e, 0x03d59967, 0x00082102}}, Y: Field{[10]uint32{0x027a7132, 0x010ff946, 0x00899871, 0x01ce539c, 0x025487c4, 0x01aebeb0, 0x03bd476a, 0x02090d21, 0x0097cec1, 0x003ca64d}}}, + {X: Field{[10]uint32{0x039795e4, 0x0308949e, 0x02b8e1e1, 0x02db8611, 0x0069c161, 0x03fb1ac7, 0x002f6a70, 0x00de1528, 0x033b3b98, 0x003aca4b}}, Y: Field{[10]uint32{0x0253a0fe, 0x03a74beb, 0x01c6f5b7, 0x01d42444, 0x0357131d, 0x005160d6, 0x016634af, 0x02fa005a, 0x025a96ee, 0x002310f0}}}, + {X: Field{[10]uint32{0x00a35b35, 0x00b2ed62, 0x0121edbd, 0x02297028, 0x011ab5d8, 0x01623aff, 0x013d029e, 0x00e6eef4, 0x03f60eb3, 0x0039adaf}}, Y: Field{[10]uint32{0x001007bd, 0x00a4f6e7, 0x019c7c57, 0x0274efa6, 0x01fe3b6c, 0x00d65877, 0x02f43e38, 0x034bcc99, 0x02bd3300, 0x000697fc}}}, + {X: Field{[10]uint32{0x0032f9a2, 0x02e38a48, 0x006ccc48, 0x0143e87f, 0x03ce566f, 0x007fe3d8, 0x02374cb3, 0x009903b4, 0x02bd9a6b, 0x00096ab1}}, Y: Field{[10]uint32{0x0351d4f0, 0x008c284a, 0x033d9e76, 0x02ef1067, 0x02559883, 0x013c643d, 0x0332f54f, 0x0151b05b, 0x023ba644, 0x003d69b1}}}, + {X: Field{[10]uint32{0x00360dd3, 0x03be34b0, 0x022090d4, 0x00db6143, 0x0347a8a8, 0x038338ee, 0x030b8086, 0x0266ca22, 0x03745be4, 0x003814c5}}, Y: Field{[10]uint32{0x0024f87b, 0x03b3644f, 0x03dc2b2a, 0x037a6040, 0x0061b987, 0x016da805, 0x0009582b, 0x00bce736, 0x0371a5d9, 0x0037070e}}}, + {X: Field{[10]uint32{0x01303fdd, 0x00e755e2, 0x02d35aea, 0x01fc6747, 0x014d7145, 0x00127ef8, 0x020d4310, 0x017bcb98, 0x0201df3b, 0x0029968e}}, Y: Field{[10]uint32{0x02e68703, 0x0112a340, 0x013cadad, 0x00093ebb, 0x0286861d, 0x003b4b1d, 0x0343d8d9, 0x0171bee3, 0x00940cff, 0x001e63a8}}}, + {X: Field{[10]uint32{0x0098dfea, 0x011998b4, 0x038797c1, 0x0324ba99, 0x03fadcb3, 0x020e9795, 0x018e5d2a, 0x01b16780, 0x033a7788, 0x002a054e}}, Y: Field{[10]uint32{0x026d892f, 0x026a77db, 0x034158a4, 0x03dd0b6b, 0x03b1b5e0, 0x01e14f80, 0x018db9c5, 0x0183f14f, 0x016461d0, 0x000a91ce}}}, + {X: Field{[10]uint32{0x024c9489, 0x00c354b4, 0x00a98616, 0x039b8539, 0x00c0aef4, 0x01ba754a, 0x027887ff, 0x019f0a68, 0x0315d9d5, 0x0018a06e}}, Y: Field{[10]uint32{0x01f42bc6, 0x01fc9ae7, 0x033ad918, 0x01374c86, 0x0145fd96, 0x01ba6efd, 0x02738f45, 0x02a19648, 0x01a0908d, 0x000bf4f1}}}, + {X: Field{[10]uint32{0x03cecfa5, 0x039de922, 0x03b020a7, 0x03686c5a, 0x032a0d62, 0x00e3b68e, 0x034695c6, 0x02b76b7a, 0x03b30fec, 0x0013c170}}, Y: Field{[10]uint32{0x01d37b53, 0x034092a5, 0x008cd2ec, 0x00c7c06d, 0x01447ee4, 0x01654d2e, 0x01632361, 0x0109beb7, 0x01ea603d, 0x0014e926}}}, + {X: Field{[10]uint32{0x00445a7a, 0x00c72ea5, 0x01ec5901, 0x03c2073c, 0x01df9535, 0x01807235, 0x02f11b6c, 0x031afec4, 0x03bc9f06, 0x003e0bfb}}, Y: Field{[10]uint32{0x002a7a98, 0x02b38619, 0x011e5963, 0x02d91903, 0x00b51c83, 0x02502d29, 0x003942c1, 0x01ad9d54, 0x03bdc6fb, 0x00252ecd}}}, + {X: Field{[10]uint32{0x004b96aa, 0x039d9642, 0x03cce461, 0x00d548aa, 0x02d02986, 0x028ee603, 0x02405e1a, 0x02a46f89, 0x02b99f67, 0x00364c26}}, Y: Field{[10]uint32{0x02b28a86, 0x0313cdf0, 0x02978f26, 0x03eebf3f, 0x03d3b6c9, 0x009d32d7, 0x0210f066, 0x03155f5f, 0x032a9b4e, 0x001bbe66}}}, + {X: Field{[10]uint32{0x02b7d2d5, 0x03750ac5, 0x02a66f6f, 0x0134755b, 0x022637b8, 0x00bbd40b, 0x030f3d32, 0x01080f20, 0x03aa9783, 0x0028a16a}}, Y: Field{[10]uint32{0x0001f99c, 0x01754be4, 0x013e9c40, 0x0086dadd, 0x02d86573, 0x0042cb8a, 0x03952dfe, 0x01eb1a4a, 0x0292cd1b, 0x00395ba5}}}, + {X: Field{[10]uint32{0x038fcf0e, 0x02e34167, 0x026facf7, 0x03f79f12, 0x01d65b6f, 0x03aa8d04, 0x01c3446d, 0x00b4d6ea, 0x00a13856, 0x001f561f}}, Y: Field{[10]uint32{0x00bc9459, 0x03068276, 0x0380a501, 0x002b4c8d, 0x00c46390, 0x033f5ab4, 0x023400b6, 0x0131849c, 0x00038830, 0x0029ca57}}}, + {X: Field{[10]uint32{0x01054c96, 0x02f4dcff, 0x00a888e8, 0x00eea347, 0x00eec414, 0x017fb977, 0x011dfdbe, 0x03987db5, 0x014919cd, 0x00137e70}}, Y: Field{[10]uint32{0x02d10d5d, 0x02eb01b2, 0x0090192e, 0x03370a21, 0x00b5d506, 0x02876175, 0x00974c23, 0x021ca014, 0x0051092d, 0x00000d7b}}}, + }, + { + {X: Field{[10]uint32{0x01054c96, 0x02f4dcff, 0x00a888e8, 0x00eea347, 0x00eec414, 0x017fb977, 0x011dfdbe, 0x03987db5, 0x014919cd, 0x00137e70}}, Y: Field{[10]uint32{0x02d10d5d, 0x02eb01b2, 0x0090192e, 0x03370a21, 0x00b5d506, 0x02876175, 0x00974c23, 0x021ca014, 0x0051092d, 0x00000d7b}}}, + {X: Field{[10]uint32{0x01a49e04, 0x01ac3f07, 0x00d70c0c, 0x015395ea, 0x00e9de45, 0x012e1c22, 0x01317d4e, 0x02663349, 0x02d8d2cc, 0x003b4cb2}}, Y: Field{[10]uint32{0x001db9e0, 0x0048345f, 0x02b7db63, 0x02b2d27e, 0x0352da9f, 0x02167482, 0x001ca375, 0x00081295, 0x035f1d03, 0x0004a7fb}}}, + {X: Field{[10]uint32{0x01ef001d, 0x00897697, 0x0227ef4f, 0x035a626e, 0x0321f9bb, 0x0278ed92, 0x020bd1c0, 0x00b2bc83, 0x032db27e, 0x00295268}}, Y: Field{[10]uint32{0x00624783, 0x036c69fc, 0x0305add5, 0x00a98b25, 0x02eb141e, 0x02296515, 0x00cc30ed, 0x019b2f7d, 0x027906d9, 0x001e66de}}}, + {X: Field{[10]uint32{0x0083f855, 0x0106353a, 0x00016cb7, 0x032d8f0d, 0x0228c36d, 0x031c0d9b, 0x009e4111, 0x0183c601, 0x03724d63, 0x003a086a}}, Y: Field{[10]uint32{0x01852ddf, 0x03831a96, 0x023efed4, 0x031853b0, 0x018b3b19, 0x0105b3d6, 0x010d4115, 0x00f38d9f, 0x03f863f5, 0x002b7bf2}}}, + {X: Field{[10]uint32{0x012ed4cb, 0x03bc7971, 0x02c5a05a, 0x03ecf027, 0x02c954de, 0x00d4cb9b, 0x0308bd98, 0x03b3448f, 0x0330da07, 0x001f9e63}}, Y: Field{[10]uint32{0x00bb9462, 0x005981e5, 0x037a1257, 0x006ffe7c, 0x03b17357, 0x03bcbc15, 0x01a9549d, 0x02b20c10, 0x00c4a24d, 0x00348f73}}}, + {X: Field{[10]uint32{0x0206e37a, 0x01de2b10, 0x00731a24, 0x02523141, 0x034d8c18, 0x02d689d3, 0x00e83f46, 0x02000b3d, 0x0387f286, 0x002d49aa}}, Y: Field{[10]uint32{0x00c5ccab, 0x019e3ffc, 0x0392abf3, 0x026c03e8, 0x0128ce53, 0x0029bc63, 0x00aaced6, 0x00363b57, 0x01d77810, 0x001907cd}}}, + {X: Field{[10]uint32{0x03630834, 0x00e83ef4, 0x00067fdf, 0x00a18f6b, 0x008463f1, 0x02a32042, 0x01b9e96b, 0x011e0eb5, 0x02003151, 0x000893e8}}, Y: Field{[10]uint32{0x007a2272, 0x0311cdf1, 0x00f75cd3, 0x013b0294, 0x013d6292, 0x0247427d, 0x00b70fa3, 0x036970f1, 0x0232bb3e, 0x002ef953}}}, + {X: Field{[10]uint32{0x0041742e, 0x03d67bad, 0x006e9fbf, 0x011ebce0, 0x032f14a5, 0x0325a4e9, 0x015452fb, 0x03484bd1, 0x0194e51a, 0x000fc362}}, Y: Field{[10]uint32{0x03ecadbe, 0x014d8ef3, 0x03d958c6, 0x00b0eb44, 0x031e205e, 0x011e9b82, 0x025cb0e8, 0x00f71117, 0x0023f28c, 0x003ef5db}}}, + {X: Field{[10]uint32{0x003c19d7, 0x01927456, 0x0357bb67, 0x0116b0b3, 0x02bbbb5e, 0x0108a3bc, 0x01a25cce, 0x00e7904a, 0x00cc600a, 0x0030b528}}, Y: Field{[10]uint32{0x0107928d, 0x00a2e0b1, 0x01c9772f, 0x020c5cd1, 0x0126804a, 0x03d04983, 0x0183b5f7, 0x018a5350, 0x00f9c080, 0x00196b68}}}, + {X: Field{[10]uint32{0x01848116, 0x01507957, 0x027bba04, 0x0003f278, 0x001cc9b1, 0x03a52115, 0x0072ce10, 0x034ef814, 0x019abb39, 0x0005a4de}}, Y: Field{[10]uint32{0x027198b3, 0x03d9b080, 0x012e483d, 0x03971366, 0x02c03193, 0x01b1837b, 0x02af60f1, 0x03631539, 0x033b9cb2, 0x00312710}}}, + {X: Field{[10]uint32{0x00940c9a, 0x0202b52f, 0x0233084c, 0x0384ebd0, 0x0113cf3c, 0x01137708, 0x01585e27, 0x03cc6439, 0x027ec305, 0x000bb08a}}, Y: Field{[10]uint32{0x011e7a4d, 0x0253f661, 0x01bdacd1, 0x020f668d, 0x03124051, 0x00a71ffa, 0x02e24f50, 0x01e5a130, 0x0068de33, 0x0022c769}}}, + {X: Field{[10]uint32{0x01d9123f, 0x00e0c7ae, 0x03a7d7e9, 0x006c7e22, 0x0129fc79, 0x03ef47a4, 0x015f8eca, 0x01a9bcbe, 0x038f72aa, 0x000d06d4}}, Y: Field{[10]uint32{0x00bb9a40, 0x0282abc6, 0x026ed19e, 0x029c14a8, 0x0072dee6, 0x0049366b, 0x02f2f041, 0x03167ae9, 0x024719c1, 0x00161604}}}, + {X: Field{[10]uint32{0x01683eeb, 0x003b97f7, 0x03133aa7, 0x00e28234, 0x033e36eb, 0x00212e3c, 0x01af6525, 0x0233b2ac, 0x01738f9a, 0x002bf19a}}, Y: Field{[10]uint32{0x00cd4509, 0x00a72acc, 0x01fdc91e, 0x015497b7, 0x02570bab, 0x0288e705, 0x0359c7fc, 0x009d4af0, 0x01976dd2, 0x00000b08}}}, + {X: Field{[10]uint32{0x03aad77f, 0x001ec731, 0x03b7fa7d, 0x037c3d69, 0x006d4ebb, 0x01da659c, 0x004afc3a, 0x02e378ca, 0x033ec68e, 0x0013c3aa}}, Y: Field{[10]uint32{0x00e6eea8, 0x00fc4773, 0x0092ce6c, 0x0234096b, 0x00adaa07, 0x00ab0bca, 0x008de306, 0x02dd5d68, 0x027176eb, 0x002ca3a8}}}, + {X: Field{[10]uint32{0x036f4293, 0x0007e1ed, 0x01139ea2, 0x02d594f1, 0x0210e978, 0x01c2ca0b, 0x01bc8cf3, 0x00cc2448, 0x035a9f34, 0x0034955e}}, Y: Field{[10]uint32{0x0282740a, 0x0061e894, 0x01a5f1db, 0x00e37901, 0x03e34b68, 0x02d2b487, 0x0282f06e, 0x009fc049, 0x034355e4, 0x0029e1ec}}}, + {X: Field{[10]uint32{0x001f98cd, 0x0326722b, 0x00308cbf, 0x001535fc, 0x01523489, 0x03319808, 0x02d8a9c1, 0x0121c3eb, 0x01a84a47, 0x00270e46}}, Y: Field{[10]uint32{0x00fc599d, 0x039780f5, 0x008e6be7, 0x03ddb193, 0x01905326, 0x00983990, 0x00f044bf, 0x03755d61, 0x030f4a4d, 0x00376e13}}}, + }, + { + {X: Field{[10]uint32{0x001f98cd, 0x0326722b, 0x00308cbf, 0x001535fc, 0x01523489, 0x03319808, 0x02d8a9c1, 0x0121c3eb, 0x01a84a47, 0x00270e46}}, Y: Field{[10]uint32{0x00fc599d, 0x039780f5, 0x008e6be7, 0x03ddb193, 0x01905326, 0x00983990, 0x00f044bf, 0x03755d61, 0x030f4a4d, 0x00376e13}}}, + {X: Field{[10]uint32{0x014a09ec, 0x03bededa, 0x035f0435, 0x0294fa14, 0x000cd326, 0x01724aa9, 0x002fc69d, 0x03603c29, 0x01326255, 0x000b8f01}}, Y: Field{[10]uint32{0x00c7327e, 0x0121a062, 0x02651253, 0x00f1c1ed, 0x03e048a5, 0x020bf06a, 0x01ae240b, 0x01bed6f7, 0x0091656c, 0x000007fe}}}, + {X: Field{[10]uint32{0x03b64db3, 0x026354e3, 0x0138417b, 0x0328e775, 0x02a7ede4, 0x0394ee35, 0x03bb83fb, 0x0332dd02, 0x039229bd, 0x00304508}}, Y: Field{[10]uint32{0x000259be, 0x0033a7ff, 0x027d1e23, 0x02413515, 0x01a87580, 0x03a5e2f4, 0x00ecde4f, 0x01bf0a97, 0x02dc5b48, 0x00048dfd}}}, + {X: Field{[10]uint32{0x039c7ce6, 0x03c668aa, 0x00934205, 0x005a8642, 0x00337103, 0x03893769, 0x015fb7e3, 0x00561eb8, 0x024ccfa4, 0x003a38a8}}, Y: Field{[10]uint32{0x0036267c, 0x0007ada2, 0x03a73b2c, 0x000ed709, 0x016e09e6, 0x02fb8816, 0x02f2b2b3, 0x01746d32, 0x03ce0c6f, 0x0011b260}}}, + {X: Field{[10]uint32{0x03081e46, 0x03b60d00, 0x019ea1ed, 0x02315515, 0x013a5221, 0x02498d1c, 0x02d9c2c1, 0x01c89020, 0x03f831a7, 0x001b16d2}}, Y: Field{[10]uint32{0x03fbcd70, 0x03e72e02, 0x02a62ed1, 0x0209ab08, 0x0041d0cf, 0x038af91e, 0x0347863c, 0x0350bec8, 0x03714926, 0x0032c144}}}, + {X: Field{[10]uint32{0x011349e2, 0x00cab77c, 0x00c05808, 0x03d05d49, 0x0160e3ec, 0x0106b5e3, 0x02147e9a, 0x030b9f98, 0x0324c6b9, 0x003e0160}}, Y: Field{[10]uint32{0x032025fc, 0x0311a796, 0x0288d5fa, 0x02d589b7, 0x03509498, 0x03a84488, 0x0281aa60, 0x015b3737, 0x025a0a88, 0x00257183}}}, + {X: Field{[10]uint32{0x024dcd4b, 0x0396bb11, 0x00124dca, 0x03566447, 0x010c30c7, 0x02ac4291, 0x0270665c, 0x02b792d5, 0x0056670c, 0x00387a6a}}, Y: Field{[10]uint32{0x03041f2c, 0x02d897ae, 0x02b292d0, 0x026ab285, 0x027f44d1, 0x02c95de4, 0x02c43599, 0x0314c6de, 0x02954455, 0x00158ac2}}}, + {X: Field{[10]uint32{0x02c7b3c2, 0x034e59a2, 0x01b5f5b0, 0x0248e0f5, 0x0212acaf, 0x01c00ca8, 0x030a38b1, 0x01cf0acb, 0x02ac5d85, 0x0029d526}}, Y: Field{[10]uint32{0x0287eaef, 0x03245c64, 0x016dffa0, 0x00554dc4, 0x035d6b51, 0x00651f4a, 0x01a1d70c, 0x009054cd, 0x01b90d1c, 0x002f45f4}}}, + {X: Field{[10]uint32{0x03add73c, 0x021dbf8a, 0x00b7d005, 0x03640a99, 0x008fd9cd, 0x03b70508, 0x00a74e42, 0x02c265de, 0x0257ad11, 0x00146c86}}, Y: Field{[10]uint32{0x0336d8d1, 0x0352b87a, 0x034ba6f7, 0x003ca31c, 0x026c2013, 0x034b073e, 0x00a07f01, 0x034f9755, 0x0010001f, 0x00001e4c}}}, + {X: Field{[10]uint32{0x017e2c95, 0x037265af, 0x00d82ab7, 0x02852e1e, 0x036f3f2b, 0x02b15055, 0x019a12a8, 0x034697b7, 0x03fbb24a, 0x003281f2}}, Y: Field{[10]uint32{0x0150dfa2, 0x0266eb23, 0x00cbf05e, 0x03ccedf8, 0x013ac306, 0x030419b2, 0x00a2267b, 0x003b7d2a, 0x011032df, 0x002bb70c}}}, + {X: Field{[10]uint32{0x0309f34b, 0x01742dce, 0x026ce6d7, 0x03982331, 0x01e58873, 0x00fce758, 0x02b6296f, 0x02de6186, 0x03a63b1c, 0x0025c07c}}, Y: Field{[10]uint32{0x00df5793, 0x03214330, 0x00794acd, 0x00e5ff73, 0x037104bc, 0x0055a0cd, 0x03031b53, 0x003b4575, 0x03bb8caf, 0x000f7512}}}, + {X: Field{[10]uint32{0x02548418, 0x01c7446b, 0x03923173, 0x01f62260, 0x02dce488, 0x00de8d06, 0x03072b05, 0x01f8a4be, 0x00c9e481, 0x000b9b6c}}, Y: Field{[10]uint32{0x00a2b918, 0x01e4b004, 0x035f1e69, 0x01cf870f, 0x004b8e1d, 0x022a4459, 0x01314897, 0x01befe88, 0x02411d77, 0x001d3ada}}}, + {X: Field{[10]uint32{0x031e2f46, 0x039888ef, 0x0383015c, 0x007a1c9d, 0x035270f7, 0x00358f15, 0x01592e04, 0x019b3111, 0x001d2c9e, 0x00280dad}}, Y: Field{[10]uint32{0x02ffb349, 0x00789a57, 0x031f4f73, 0x020b3fc2, 0x010680e2, 0x01e7ac23, 0x031f6aa4, 0x01acf5f7, 0x01a003e9, 0x0030efe4}}}, + {X: Field{[10]uint32{0x03db2a09, 0x00154580, 0x01bbf096, 0x021f7080, 0x01f63142, 0x029d9b68, 0x01638800, 0x0030d4af, 0x0004d9c3, 0x002c2773}}, Y: Field{[10]uint32{0x00b1a093, 0x01f6cea0, 0x014e7aed, 0x035305ab, 0x026a951b, 0x02bab403, 0x008d1635, 0x009037dc, 0x006481cf, 0x00229fcc}}}, + {X: Field{[10]uint32{0x004cea08, 0x022e40e3, 0x0221dbcd, 0x02e8383a, 0x02654b58, 0x01001194, 0x00a61153, 0x023141bd, 0x02dbaa4e, 0x001aa17e}}, Y: Field{[10]uint32{0x0062f4f3, 0x037b3966, 0x021b6a19, 0x012d0f5c, 0x00b4271a, 0x023f988c, 0x01933c14, 0x0196754c, 0x0204bae4, 0x00002d91}}}, + {X: Field{[10]uint32{0x00a959e5, 0x004e0848, 0x014cc5a2, 0x00ea2e47, 0x0391e149, 0x036381ae, 0x0205f281, 0x00bf7e37, 0x030b1dd1, 0x001815c5}}, Y: Field{[10]uint32{0x0385a2a8, 0x026fa4c8, 0x00c65e89, 0x02f0fb89, 0x02465152, 0x01c77c98, 0x019a2daf, 0x01201eb7, 0x00b26a6a, 0x002686bc}}}, + }, + { + {X: Field{[10]uint32{0x00a959e5, 0x004e0848, 0x014cc5a2, 0x00ea2e47, 0x0391e149, 0x036381ae, 0x0205f281, 0x00bf7e37, 0x030b1dd1, 0x001815c5}}, Y: Field{[10]uint32{0x0385a2a8, 0x026fa4c8, 0x00c65e89, 0x02f0fb89, 0x02465152, 0x01c77c98, 0x019a2daf, 0x01201eb7, 0x00b26a6a, 0x002686bc}}}, + {X: Field{[10]uint32{0x02fd545c, 0x02729760, 0x00e66189, 0x0237528a, 0x037c133f, 0x01b72177, 0x014110a4, 0x0381900e, 0x01677c52, 0x0019dcff}}, Y: Field{[10]uint32{0x007eb1ae, 0x01fc0d25, 0x00f98e8c, 0x03d6871b, 0x03ead780, 0x034ac91a, 0x00f25c9d, 0x0194bc3c, 0x02d8cd97, 0x001113ad}}}, + {X: Field{[10]uint32{0x031c032b, 0x036858a5, 0x01c980d4, 0x02285ebf, 0x01ff6b66, 0x03f1d9b1, 0x0111b5fd, 0x000980f7, 0x00fcd6e0, 0x001c7aea}}, Y: Field{[10]uint32{0x0268359f, 0x02d6a385, 0x00755e7a, 0x0345dd2d, 0x0371931a, 0x01532edf, 0x0260516f, 0x034e77bd, 0x02624b61, 0x0034bfc4}}}, + {X: Field{[10]uint32{0x0386f021, 0x03185ac2, 0x00050373, 0x00e0411a, 0x020374e4, 0x038321f0, 0x03c79aac, 0x0395948d, 0x0194d17c, 0x00383e1b}}, Y: Field{[10]uint32{0x01bf325a, 0x02de732d, 0x0045b3b6, 0x0300457f, 0x009a80bc, 0x0072268b, 0x011e832f, 0x02f3d1ea, 0x0073730a, 0x000315c7}}}, + {X: Field{[10]uint32{0x0203a61c, 0x0391d14a, 0x00574d06, 0x03d1a41c, 0x00507868, 0x02aaa774, 0x0217442b, 0x02748cb2, 0x0305b324, 0x002157b0}}, Y: Field{[10]uint32{0x025dfc07, 0x031baab1, 0x004965df, 0x013a85f9, 0x02d332f7, 0x02d0bed3, 0x003cbff9, 0x00705fd5, 0x012ec5f0, 0x00037617}}}, + {X: Field{[10]uint32{0x02aa138b, 0x00367dce, 0x02cd66df, 0x002fbde1, 0x0363efba, 0x03119c7f, 0x003ebc18, 0x02b8a1e5, 0x0249d3c3, 0x00105ff8}}, Y: Field{[10]uint32{0x021ae869, 0x0246ccd2, 0x026afd1c, 0x037b0155, 0x03c19daf, 0x003ea795, 0x00a5d29f, 0x00f8e308, 0x01d7bcd2, 0x00008d62}}}, + {X: Field{[10]uint32{0x0332d706, 0x03029207, 0x00678b00, 0x0291d1a8, 0x020618cc, 0x00256fe8, 0x010d29a3, 0x03efc7c5, 0x006abab3, 0x000f3912}}, Y: Field{[10]uint32{0x007fd9e4, 0x01cd8dff, 0x0289f40b, 0x010f3587, 0x02edd156, 0x00425241, 0x02fd046b, 0x01e14a23, 0x008daae3, 0x0039dd50}}}, + {X: Field{[10]uint32{0x02da6e03, 0x001dcb00, 0x016038ad, 0x03e4232b, 0x034c277d, 0x035a5bd3, 0x0191e193, 0x0141073a, 0x01ab9f24, 0x0010b285}}, Y: Field{[10]uint32{0x00347793, 0x02227ea3, 0x03ea7836, 0x029a041a, 0x02d66e85, 0x032e003b, 0x03ce4d1f, 0x015f2591, 0x0326c81c, 0x001a34bb}}}, + {X: Field{[10]uint32{0x011cd3fb, 0x01032ede, 0x03e686db, 0x03f65ca6, 0x034a2a33, 0x03e2113a, 0x02e03218, 0x00dfebc0, 0x01143f4e, 0x00047331}}, Y: Field{[10]uint32{0x01160d86, 0x01c5ae95, 0x03472a93, 0x03f4b374, 0x01fa0b1e, 0x00e3308e, 0x028e2449, 0x00477ad4, 0x032a902b, 0x0012a95a}}}, + {X: Field{[10]uint32{0x01583a3e, 0x02ebc10a, 0x02808108, 0x02662c55, 0x00b15205, 0x036521c7, 0x0275dbbe, 0x03df955c, 0x033f16d0, 0x00162255}}, Y: Field{[10]uint32{0x025b124f, 0x016632df, 0x029cf8f1, 0x01335331, 0x0096fe29, 0x0269ad39, 0x00f5df8a, 0x015bf811, 0x0062c558, 0x0006be8a}}}, + {X: Field{[10]uint32{0x018f7552, 0x02e44658, 0x00fac387, 0x022e6015, 0x01bd4113, 0x0208e0b7, 0x0397774f, 0x0271bd0e, 0x0317e514, 0x0000942e}}, Y: Field{[10]uint32{0x0110b14d, 0x0212588d, 0x02f1e3f0, 0x00f0ccf5, 0x03da006f, 0x03fa7605, 0x02d7df75, 0x020208d0, 0x00fc9bbe, 0x001cc64c}}}, + {X: Field{[10]uint32{0x0307e636, 0x0162d040, 0x011d97e1, 0x039cc858, 0x00b4a77d, 0x028844b2, 0x01bc29bd, 0x01d910f7, 0x01601638, 0x0008867c}}, Y: Field{[10]uint32{0x01f15109, 0x0286cb5c, 0x02f55e07, 0x0034fdce, 0x016dd723, 0x02e08c2f, 0x0006d4f1, 0x028bd86e, 0x00ac5cb6, 0x00012a61}}}, + {X: Field{[10]uint32{0x03725d12, 0x004fa4e7, 0x0347505d, 0x02ef72d7, 0x03d94642, 0x02808bef, 0x00a39ce0, 0x01ff4ead, 0x0088b346, 0x00069d27}}, Y: Field{[10]uint32{0x03ac56e4, 0x01945348, 0x01aa7013, 0x01a62643, 0x03607208, 0x00abcf63, 0x018be75c, 0x0038b3d1, 0x019573ec, 0x001fa474}}}, + {X: Field{[10]uint32{0x02c704c0, 0x00b59c2d, 0x0394f5d2, 0x0183b378, 0x00560446, 0x00d41e09, 0x027f8a6e, 0x0099d285, 0x0107c92f, 0x0029deaa}}, Y: Field{[10]uint32{0x02dfea48, 0x02f1c11f, 0x01462af8, 0x0311d056, 0x014c921f, 0x030af56a, 0x01e188e5, 0x033f93c8, 0x02e5bf35, 0x002e2206}}}, + {X: Field{[10]uint32{0x01fae458, 0x0012394a, 0x0097fd61, 0x0109d9bb, 0x028b0a5c, 0x037edecc, 0x01d156a5, 0x00863042, 0x005be0f8, 0x0031d41a}}, Y: Field{[10]uint32{0x0357b598, 0x01a10655, 0x011a2b01, 0x0140cd65, 0x000a5dca, 0x019cb1ed, 0x012f414c, 0x007817ed, 0x01f8cf92, 0x003ab5e5}}}, + {X: Field{[10]uint32{0x00b94266, 0x01a5cfbb, 0x01f12b1a, 0x03ee9f53, 0x0080cef0, 0x006368c6, 0x01439a45, 0x02104508, 0x038e23a0, 0x00295db7}}, Y: Field{[10]uint32{0x01b28ec8, 0x02f846b8, 0x019f3ee8, 0x029fd453, 0x00432e10, 0x0163360b, 0x02b97afe, 0x0102cb24, 0x0320e766, 0x001029af}}}, + }, + { + {X: Field{[10]uint32{0x00b94266, 0x01a5cfbb, 0x01f12b1a, 0x03ee9f53, 0x0080cef0, 0x006368c6, 0x01439a45, 0x02104508, 0x038e23a0, 0x00295db7}}, Y: Field{[10]uint32{0x01b28ec8, 0x02f846b8, 0x019f3ee8, 0x029fd453, 0x00432e10, 0x0163360b, 0x02b97afe, 0x0102cb24, 0x0320e766, 0x001029af}}}, + {X: Field{[10]uint32{0x02704896, 0x015c96f6, 0x03b8dcec, 0x018f26b3, 0x026f3ba0, 0x02f9c6eb, 0x02520867, 0x0168ed51, 0x0062ef3b, 0x00279773}}, Y: Field{[10]uint32{0x0282c835, 0x009da772, 0x0351248f, 0x006180c3, 0x0279605d, 0x0131d848, 0x03d3a215, 0x017cfa97, 0x012ddb92, 0x001bfb74}}}, + {X: Field{[10]uint32{0x019ed6c1, 0x02bad633, 0x013d6b68, 0x016f0f56, 0x02c24e74, 0x0017b743, 0x03fc1877, 0x03d4fa02, 0x036dcb74, 0x0000ca0c}}, Y: Field{[10]uint32{0x00fafeee, 0x01baf9be, 0x0094adec, 0x037c972d, 0x00265bf4, 0x00835f23, 0x02d5943a, 0x027ca311, 0x003812fd, 0x001c6a26}}}, + {X: Field{[10]uint32{0x00bf7ea0, 0x03b561d1, 0x01833953, 0x028173bd, 0x00e33625, 0x01bc0ec8, 0x016e9f97, 0x0116b7e3, 0x00375b87, 0x0029f782}}, Y: Field{[10]uint32{0x03bcabaa, 0x030154e6, 0x01aa2e04, 0x0303faf1, 0x02645a47, 0x012223a6, 0x004a0b33, 0x02979484, 0x02b057ad, 0x00298f65}}}, + {X: Field{[10]uint32{0x0235983a, 0x02a6a34c, 0x00eb2919, 0x00dc04ef, 0x01e38a10, 0x003f854c, 0x023926d7, 0x00715371, 0x02ae8b91, 0x003393d3}}, Y: Field{[10]uint32{0x013cdecf, 0x035ac643, 0x0340aecf, 0x008a3afd, 0x03526c65, 0x039c1d50, 0x02de0249, 0x03eeecfa, 0x0173c390, 0x003cf27e}}}, + {X: Field{[10]uint32{0x02da57e4, 0x01592299, 0x019f86b7, 0x01bbf737, 0x0298c499, 0x018c6f07, 0x01ea2a74, 0x0062e76f, 0x02e39839, 0x001a4336}}, Y: Field{[10]uint32{0x033f33bb, 0x00656d24, 0x023d42b6, 0x03ef3a56, 0x01f863d8, 0x01656253, 0x01fd91bf, 0x01e691ea, 0x0079677b, 0x002102b7}}}, + {X: Field{[10]uint32{0x01b0e6c9, 0x02aad995, 0x00c89a6d, 0x033de1b9, 0x01db5ff9, 0x037e2f2f, 0x0228fb36, 0x018889e3, 0x03a54b98, 0x00136faf}}, Y: Field{[10]uint32{0x02b2cc25, 0x029e1557, 0x00efae94, 0x02caf141, 0x03589311, 0x03888a7c, 0x01a626e6, 0x00ebb7d1, 0x03b03c91, 0x00043fb9}}}, + {X: Field{[10]uint32{0x02d916fb, 0x023e8412, 0x024a3a9f, 0x03f7a527, 0x03e68065, 0x0073fd32, 0x03c35ac0, 0x02032704, 0x018e6890, 0x00309999}}, Y: Field{[10]uint32{0x00887814, 0x03bd4ae8, 0x0138856a, 0x037fad84, 0x036b8fec, 0x009189ea, 0x0398170b, 0x036aac3d, 0x013854e7, 0x0039fa16}}}, + {X: Field{[10]uint32{0x01857295, 0x00068469, 0x03f0164e, 0x01fc0d0c, 0x0069c8e4, 0x02872848, 0x02e118fc, 0x0170862c, 0x000bfef4, 0x00290a89}}, Y: Field{[10]uint32{0x027eb9c1, 0x00ddffb2, 0x0139556b, 0x00b34546, 0x0027a1c2, 0x01376931, 0x026b22b2, 0x0175159e, 0x03f26100, 0x000ea82c}}}, + {X: Field{[10]uint32{0x005c5b40, 0x02f3f580, 0x03d1e269, 0x021e6ee7, 0x03150b96, 0x023330f7, 0x01ed382e, 0x0334536b, 0x00c8bf53, 0x00292d4f}}, Y: Field{[10]uint32{0x01c61bfd, 0x017b45b4, 0x019e3d1f, 0x026fdd49, 0x03199cca, 0x037f6961, 0x015ca003, 0x016e0112, 0x00ce8300, 0x0033bbc2}}}, + {X: Field{[10]uint32{0x03cdc098, 0x003fd55b, 0x02803222, 0x003dab91, 0x01550ae0, 0x00312670, 0x03f1f86c, 0x008899e9, 0x032f96fb, 0x000d384a}}, Y: Field{[10]uint32{0x027474e2, 0x02c6b79a, 0x003f664c, 0x00c3c662, 0x0304df51, 0x005e5cb6, 0x034cbc84, 0x034c8b65, 0x02ddd7b5, 0x002992b0}}}, + {X: Field{[10]uint32{0x00fb8036, 0x02262a97, 0x035085f9, 0x024b0368, 0x033ad09a, 0x03f59fa0, 0x02117dd1, 0x011ed22b, 0x0351fb16, 0x0033fd89}}, Y: Field{[10]uint32{0x00f59de0, 0x03ced689, 0x02825843, 0x0363d80c, 0x0278a589, 0x021850f1, 0x03e34b58, 0x00b46b17, 0x0126bd54, 0x00337d3b}}}, + {X: Field{[10]uint32{0x03173b92, 0x01bad7a3, 0x037611cd, 0x03d05a7e, 0x003b7e72, 0x03d3595a, 0x0231a218, 0x0247ca6f, 0x0240d9bb, 0x00043d34}}, Y: Field{[10]uint32{0x033146c2, 0x00801b58, 0x02db7c90, 0x0274521a, 0x0290bb76, 0x00ce422e, 0x01b25a5a, 0x014eb484, 0x01950917, 0x0021438b}}}, + {X: Field{[10]uint32{0x004393d7, 0x01983b74, 0x01de1ee6, 0x00959dd2, 0x03869dff, 0x008d5cf8, 0x017f8936, 0x03cee10c, 0x00018a78, 0x0037a87f}}, Y: Field{[10]uint32{0x01710ccd, 0x01f53be5, 0x00cbdbf9, 0x0268ade7, 0x03af6def, 0x01b59b80, 0x03f134ff, 0x0171434e, 0x01cc942e, 0x0013d952}}}, + {X: Field{[10]uint32{0x00d84958, 0x03f4766a, 0x005caee6, 0x02c5b2b3, 0x026a11de, 0x03503321, 0x0319b976, 0x01df9d27, 0x000b69b6, 0x003a11ba}}, Y: Field{[10]uint32{0x0082cf9f, 0x01191ede, 0x001a640c, 0x00d9c783, 0x03ad51a3, 0x01e62ddb, 0x01bd9104, 0x01f89507, 0x00fc894c, 0x0028a72e}}}, + {X: Field{[10]uint32{0x0258ad71, 0x018e226f, 0x03a208f7, 0x03d73e68, 0x00bb30d1, 0x0277a30e, 0x005fe962, 0x030f8c28, 0x038c28de, 0x001dde29}}, Y: Field{[10]uint32{0x019f43ac, 0x004ff07f, 0x02c563b5, 0x0047fc92, 0x0087b384, 0x00bfd600, 0x0098e12f, 0x02c8bfdc, 0x019ab5a5, 0x000d189b}}}, + }, + { + {X: Field{[10]uint32{0x0258ad71, 0x018e226f, 0x03a208f7, 0x03d73e68, 0x00bb30d1, 0x0277a30e, 0x005fe962, 0x030f8c28, 0x038c28de, 0x001dde29}}, Y: Field{[10]uint32{0x019f43ac, 0x004ff07f, 0x02c563b5, 0x0047fc92, 0x0087b384, 0x00bfd600, 0x0098e12f, 0x02c8bfdc, 0x019ab5a5, 0x000d189b}}}, + {X: Field{[10]uint32{0x0073e879, 0x02870944, 0x02ea7a7e, 0x016b8413, 0x032cf16a, 0x03c3f8e4, 0x02f482d7, 0x001b458c, 0x016b5ca0, 0x0039ee5e}}, Y: Field{[10]uint32{0x02a89d98, 0x01c4226e, 0x00af338e, 0x0097b6a6, 0x029cb5bf, 0x00df3072, 0x002102a7, 0x0278bf7d, 0x008c1916, 0x0004ae26}}}, + {X: Field{[10]uint32{0x0319c869, 0x031bab8c, 0x032702f7, 0x0175d87a, 0x0018a9f9, 0x03f32b37, 0x01839022, 0x00ff2340, 0x005d9817, 0x000c0601}}, Y: Field{[10]uint32{0x02b856f0, 0x031db274, 0x01a7bfc0, 0x032928f6, 0x03ca2a84, 0x03588b8e, 0x02624320, 0x02dedbe1, 0x01782503, 0x002b17f1}}}, + {X: Field{[10]uint32{0x02628f0f, 0x035c8afc, 0x02919865, 0x02abcabb, 0x0365423d, 0x02f8269c, 0x00915a24, 0x01880f0b, 0x00185087, 0x0001c6fc}}, Y: Field{[10]uint32{0x01a1c334, 0x03172f51, 0x000bbb57, 0x01a88c72, 0x02098f9c, 0x03021338, 0x03600bc1, 0x033d2b8c, 0x015d504d, 0x00149ea8}}}, + {X: Field{[10]uint32{0x01ed29b5, 0x01a61be9, 0x01d1b4c6, 0x0181c4ab, 0x01f5830b, 0x0298f221, 0x02b67db9, 0x01fbcd0e, 0x01b61ee5, 0x000c8a20}}, Y: Field{[10]uint32{0x00d15ad2, 0x03c49b9f, 0x03604ef4, 0x02ae53b9, 0x01ca83ae, 0x01054c78, 0x010b19df, 0x00d13ac4, 0x028417a0, 0x00059dc0}}}, + {X: Field{[10]uint32{0x00953133, 0x01f726c6, 0x021ae647, 0x00a9d21c, 0x017fb3b4, 0x03f337ea, 0x012806c0, 0x03748e20, 0x034fed0d, 0x000282ca}}, Y: Field{[10]uint32{0x00af0fc9, 0x00928dcd, 0x00ba94bc, 0x03a2c3b5, 0x016fa384, 0x01916323, 0x001c6ca8, 0x02fcbc0f, 0x002cfb5a, 0x00336846}}}, + {X: Field{[10]uint32{0x02c96100, 0x02a101e1, 0x008e63bf, 0x006a9ba7, 0x00a16301, 0x037cf6f3, 0x003dd9b2, 0x006e7fed, 0x033ac0fb, 0x000fce11}}, Y: Field{[10]uint32{0x02624707, 0x00ab06fc, 0x031bcf1e, 0x01f02dd7, 0x0166571c, 0x03c1e739, 0x034c4462, 0x000e5494, 0x0055f5d4, 0x001c31a7}}}, + {X: Field{[10]uint32{0x039620e1, 0x00ddb7e8, 0x013786f6, 0x03214048, 0x025b1911, 0x0300f0e7, 0x0232e594, 0x0395a0ce, 0x003acb9b, 0x0000860d}}, Y: Field{[10]uint32{0x006998b5, 0x00667d94, 0x009ec5e0, 0x0290bd0f, 0x00443299, 0x000beff0, 0x03f24fd6, 0x0142fabc, 0x0148970a, 0x002faa07}}}, + {X: Field{[10]uint32{0x0122d2ac, 0x031bb1bf, 0x02ce0234, 0x0049b72a, 0x0310ddfe, 0x01e177cb, 0x003c0e09, 0x029db72d, 0x03c5fd27, 0x000a2044}}, Y: Field{[10]uint32{0x0342a268, 0x03ad57e3, 0x008fd081, 0x01285523, 0x03ddc3d4, 0x0325d84d, 0x00777260, 0x031723c8, 0x030158fb, 0x002869fa}}}, + {X: Field{[10]uint32{0x02e515dd, 0x0284ebbf, 0x024228c1, 0x008cd0ea, 0x029d0453, 0x012f7f8b, 0x035866ab, 0x0306083b, 0x02fee6ee, 0x0028afe6}}, Y: Field{[10]uint32{0x02c30212, 0x02a5ac01, 0x018745c3, 0x02aa6a3a, 0x0000f2e3, 0x03017a8a, 0x00a5e2ab, 0x02adece8, 0x0071c55c, 0x0016846f}}}, + {X: Field{[10]uint32{0x005f8ea8, 0x02a03749, 0x02900d4b, 0x038e5934, 0x01d17248, 0x01c467f9, 0x03f4d95d, 0x00e8a954, 0x0200c846, 0x003e58e8}}, Y: Field{[10]uint32{0x01bc99eb, 0x0157ec16, 0x020824bc, 0x00d6762d, 0x008bb8f2, 0x03fd09c8, 0x03722301, 0x020f028e, 0x00268c7f, 0x00272165}}}, + {X: Field{[10]uint32{0x030a2a53, 0x03c3b037, 0x0211e7ea, 0x02cfe059, 0x02d51dca, 0x00ea6e24, 0x00394574, 0x0265f0ea, 0x018d07c3, 0x001be194}}, Y: Field{[10]uint32{0x033bfeb2, 0x02695d1c, 0x01f35113, 0x01cbaa81, 0x00bf54f7, 0x029c265a, 0x0376ea95, 0x020bca6d, 0x0216fd45, 0x003542bd}}}, + {X: Field{[10]uint32{0x0206a315, 0x02a20c49, 0x023ad9e1, 0x01cbc9a5, 0x02407260, 0x0243825f, 0x00d8b2a5, 0x03669fe6, 0x024cff70, 0x00297648}}, Y: Field{[10]uint32{0x023b68d1, 0x0184cd67, 0x027c9d35, 0x00d1f446, 0x01ed4d0d, 0x01e6037a, 0x03306abd, 0x03696cd0, 0x03003b20, 0x0021cca2}}}, + {X: Field{[10]uint32{0x00d52891, 0x027abd36, 0x01f52af1, 0x03620fae, 0x0339a0f7, 0x02c5ffe9, 0x0244de90, 0x02378d19, 0x03c9cbc5, 0x000ef092}}, Y: Field{[10]uint32{0x0105b79c, 0x03478a13, 0x032d1386, 0x00a02921, 0x004da845, 0x02fed23d, 0x02bed840, 0x00f629ff, 0x00a48a78, 0x003c238c}}}, + {X: Field{[10]uint32{0x02231493, 0x02ded501, 0x00d469cd, 0x020c3331, 0x0096411a, 0x003979a9, 0x034e41d0, 0x030d813a, 0x002e1b73, 0x003c7fa6}}, Y: Field{[10]uint32{0x018848c1, 0x02a6699d, 0x030d0196, 0x00d1b97f, 0x03f173fb, 0x03df6674, 0x02d3c205, 0x01377085, 0x01eaed9a, 0x000b8806}}}, + {X: Field{[10]uint32{0x02d903ac, 0x03b6a701, 0x03e5cb09, 0x01d396b5, 0x02d5f962, 0x039ebf4b, 0x0329fd30, 0x02a1118d, 0x015ee637, 0x00024a25}}, Y: Field{[10]uint32{0x03cd091f, 0x0203a4d6, 0x0183fc51, 0x03bea2a3, 0x02ac3d26, 0x024ea57b, 0x0378a130, 0x010aa09e, 0x01003d3f, 0x00309588}}}, + }, + { + {X: Field{[10]uint32{0x02d903ac, 0x03b6a701, 0x03e5cb09, 0x01d396b5, 0x02d5f962, 0x039ebf4b, 0x0329fd30, 0x02a1118d, 0x015ee637, 0x00024a25}}, Y: Field{[10]uint32{0x03cd091f, 0x0203a4d6, 0x0183fc51, 0x03bea2a3, 0x02ac3d26, 0x024ea57b, 0x0378a130, 0x010aa09e, 0x01003d3f, 0x00309588}}}, + {X: Field{[10]uint32{0x0359dd9e, 0x0011e983, 0x030e7231, 0x03156d63, 0x027ce5e9, 0x032c62b5, 0x01163b04, 0x034d436b, 0x01ee3771, 0x0013e26f}}, Y: Field{[10]uint32{0x0156b049, 0x01ab8c80, 0x01f5c101, 0x014198e3, 0x031e4882, 0x010eec91, 0x00baf4c0, 0x007da571, 0x02d5227a, 0x00329e54}}}, + {X: Field{[10]uint32{0x0074b839, 0x004a1d5e, 0x02b41811, 0x02ce54f4, 0x02be4115, 0x008c2dab, 0x03df0dfb, 0x0396a014, 0x001fc0e1, 0x000f80ee}}, Y: Field{[10]uint32{0x000594ba, 0x0073959f, 0x01b8da0c, 0x03c3f6ad, 0x027de5c5, 0x01c663d9, 0x00f66075, 0x01fd0b11, 0x0163dff0, 0x00344eb8}}}, + {X: Field{[10]uint32{0x03f01197, 0x030c533f, 0x005bf529, 0x03c1e689, 0x0194b668, 0x00b0f132, 0x0396baca, 0x0316a030, 0x0304cae3, 0x0032e7a0}}, Y: Field{[10]uint32{0x03989c1d, 0x01381d8e, 0x00a24c33, 0x02300578, 0x0341b2d1, 0x03c22245, 0x03258cdf, 0x0039a849, 0x02801eb8, 0x0018b1f4}}}, + {X: Field{[10]uint32{0x0357a513, 0x03de39a0, 0x0023f3a3, 0x004d16cc, 0x01f151bd, 0x028a48b1, 0x02fa283a, 0x0124b358, 0x00b7a2f4, 0x003998b0}}, Y: Field{[10]uint32{0x0017d07e, 0x02880728, 0x00d89192, 0x0358954e, 0x01d8035c, 0x00486906, 0x01ae208a, 0x01148c17, 0x013ce612, 0x002ac2c6}}}, + {X: Field{[10]uint32{0x01a7d197, 0x03a434ee, 0x019459ba, 0x030623a9, 0x035e83a8, 0x008b08d2, 0x038ffe0a, 0x03d8e51d, 0x0254280d, 0x0030b162}}, Y: Field{[10]uint32{0x01eeb5e9, 0x00732fe2, 0x002484e4, 0x011516b6, 0x020a47ec, 0x00bb4e69, 0x03041ab6, 0x00249d5c, 0x0288366e, 0x001cba8c}}}, + {X: Field{[10]uint32{0x0337d242, 0x017dfbf7, 0x014b0499, 0x02981e70, 0x01c29fec, 0x02f8d61f, 0x03862c7c, 0x03db2e10, 0x00b1c94c, 0x00102fe0}}, Y: Field{[10]uint32{0x02405088, 0x03609e69, 0x035583d1, 0x02e90af4, 0x0274321e, 0x02c9bf84, 0x013fe9b1, 0x02abc13d, 0x0135d856, 0x002d5e77}}}, + {X: Field{[10]uint32{0x008d2cc2, 0x027ff094, 0x0058c15f, 0x0351c123, 0x018e0bee, 0x001cc371, 0x00cf2a41, 0x01a6f4f2, 0x01b0f89c, 0x0038bcd2}}, Y: Field{[10]uint32{0x00d4c04f, 0x011ef638, 0x03db37e3, 0x03a38272, 0x0242344b, 0x0180856e, 0x0060aec7, 0x01c8de06, 0x03280f82, 0x0007facb}}}, + {X: Field{[10]uint32{0x015a3558, 0x00acd916, 0x027f2baf, 0x021788d2, 0x02ac071f, 0x0236d67d, 0x02f97813, 0x0329c201, 0x0297601d, 0x000f453f}}, Y: Field{[10]uint32{0x0043df4c, 0x036ceb19, 0x01727c6a, 0x03851f07, 0x0082e0a2, 0x02fd5b85, 0x029a931d, 0x0207be3c, 0x01d6e846, 0x0005b1af}}}, + {X: Field{[10]uint32{0x00ea4178, 0x031c0905, 0x03cd510f, 0x0153931d, 0x03782e03, 0x01dd2532, 0x00453c6a, 0x018da1a0, 0x0072d175, 0x00011c2a}}, Y: Field{[10]uint32{0x00098bd6, 0x01127c6e, 0x01aea079, 0x01c1a613, 0x0319b568, 0x034e7032, 0x02145e9f, 0x026b359d, 0x03a9c110, 0x00022669}}}, + {X: Field{[10]uint32{0x02b1fc24, 0x027d6b60, 0x03570ede, 0x0071f8fd, 0x012528d8, 0x03249219, 0x001ac4d2, 0x01949473, 0x0140e82e, 0x00375be9}}, Y: Field{[10]uint32{0x029b74ca, 0x00c71183, 0x022304a4, 0x01afb5cc, 0x03ec10de, 0x00595f9d, 0x026f1ebf, 0x0061bf8d, 0x037eb1d3, 0x0019f98a}}}, + {X: Field{[10]uint32{0x03369217, 0x0379b658, 0x011ead74, 0x01a40198, 0x01ca1c39, 0x01013ab3, 0x01a278f5, 0x03589288, 0x00ffcba4, 0x0010b714}}, Y: Field{[10]uint32{0x022dbc57, 0x0025f88f, 0x01e841c3, 0x03b2a380, 0x03a7a139, 0x0182ea14, 0x0178f5f1, 0x016c75fb, 0x021f6638, 0x00296ea6}}}, + {X: Field{[10]uint32{0x01d08e02, 0x02a4564f, 0x0302881e, 0x02dff6b7, 0x00108547, 0x028f47a0, 0x0069499a, 0x0175e03e, 0x01a82de5, 0x0004fe8b}}, Y: Field{[10]uint32{0x00b03410, 0x0150770f, 0x02b97da5, 0x02ec6690, 0x03e644af, 0x02ed0cb1, 0x03356206, 0x0369c8c4, 0x00b04555, 0x0004d8ce}}}, + {X: Field{[10]uint32{0x0246a9e9, 0x006b3a45, 0x03b0423f, 0x029f62b9, 0x015dcbb7, 0x03329d77, 0x01f82bb9, 0x03bdd5f4, 0x039c4b0a, 0x002560ad}}, Y: Field{[10]uint32{0x0256a698, 0x035d24ea, 0x002ffbc4, 0x0317c4ee, 0x0001cbb5, 0x02be39a9, 0x02c6acee, 0x009bbb53, 0x01800ed4, 0x0008819f}}}, + {X: Field{[10]uint32{0x004ee41a, 0x00ceae65, 0x029a6ac2, 0x0374edf5, 0x02879b56, 0x00b1a0a0, 0x03c10b67, 0x002910fd, 0x0051d3c7, 0x00341b12}}, Y: Field{[10]uint32{0x03295e6f, 0x03e13a62, 0x02e252f1, 0x00d1858b, 0x019b7b84, 0x013d8c24, 0x030acd4f, 0x0342b6ee, 0x014c0584, 0x0016057f}}}, + {X: Field{[10]uint32{0x03d82751, 0x02b9d458, 0x0354527a, 0x02a41eb4, 0x015645b4, 0x0038eca1, 0x01064f3a, 0x02c424e6, 0x02f3ec6d, 0x0021743f}}, Y: Field{[10]uint32{0x02b1f962, 0x008de893, 0x0331582c, 0x03a5a1dc, 0x023e8751, 0x020b3d59, 0x01d496e5, 0x02302f8a, 0x008413a3, 0x0007c0d9}}}, + }, + { + {X: Field{[10]uint32{0x03d82751, 0x02b9d458, 0x0354527a, 0x02a41eb4, 0x015645b4, 0x0038eca1, 0x01064f3a, 0x02c424e6, 0x02f3ec6d, 0x0021743f}}, Y: Field{[10]uint32{0x02b1f962, 0x008de893, 0x0331582c, 0x03a5a1dc, 0x023e8751, 0x020b3d59, 0x01d496e5, 0x02302f8a, 0x008413a3, 0x0007c0d9}}}, + {X: Field{[10]uint32{0x015fcade, 0x015b4507, 0x01ff7563, 0x038025c4, 0x0068b482, 0x034477c1, 0x007a6cfc, 0x0313d3d8, 0x034b19a4, 0x001ade43}}, Y: Field{[10]uint32{0x0338d3ff, 0x03fe1bf0, 0x02b0ab6f, 0x02d1ef89, 0x03a83fa5, 0x032b8272, 0x016661f9, 0x03acfbca, 0x001b2ff9, 0x00340ea6}}}, + {X: Field{[10]uint32{0x00de4cf3, 0x0154187b, 0x0066ab99, 0x00d51e28, 0x039340e5, 0x005766b9, 0x03c2d26d, 0x008b0ef9, 0x034ac114, 0x000e136a}}, Y: Field{[10]uint32{0x012d0566, 0x01e5ac89, 0x03a73b7c, 0x00ce5d46, 0x001f430a, 0x00ad31bc, 0x034ed6da, 0x03290efe, 0x01bcd1b9, 0x0035b8f1}}}, + {X: Field{[10]uint32{0x03a3e0cb, 0x03336af8, 0x00be0bb0, 0x037a165e, 0x023d2479, 0x03313e3f, 0x022c367a, 0x02fb4f05, 0x032c2d7e, 0x00104526}}, Y: Field{[10]uint32{0x039033a8, 0x024ba60c, 0x00f2470e, 0x0017bd24, 0x00b3ec78, 0x0240b3ca, 0x0015c9b9, 0x00c150ad, 0x0392db7c, 0x00324356}}}, + {X: Field{[10]uint32{0x025238c2, 0x03cfa487, 0x00b8b98a, 0x0170e03b, 0x0040355f, 0x03a0bb52, 0x031610b4, 0x0056a906, 0x000eb7d4, 0x00053c3b}}, Y: Field{[10]uint32{0x02f07922, 0x01a8d1e4, 0x0139d6e8, 0x03600c12, 0x03d25c00, 0x02109d1f, 0x01fc73e3, 0x01760248, 0x013dd483, 0x002ac4b5}}}, + {X: Field{[10]uint32{0x02972627, 0x00d9a822, 0x01e1f8a4, 0x00100948, 0x00e19216, 0x02f11068, 0x018c1efc, 0x03857206, 0x030949bf, 0x00228c61}}, Y: Field{[10]uint32{0x02bb8af9, 0x011ed591, 0x00bcce7b, 0x016b0fbf, 0x00174436, 0x0161eea9, 0x0177ed28, 0x02993425, 0x008768f7, 0x00192edf}}}, + {X: Field{[10]uint32{0x0143e94d, 0x00d4bbf5, 0x00e188f6, 0x029d5be6, 0x02dd1302, 0x02968376, 0x01c34678, 0x00a1fb10, 0x03bb782c, 0x003ad0bc}}, Y: Field{[10]uint32{0x01924d89, 0x01677911, 0x02d42405, 0x02379835, 0x034cd846, 0x03f37edd, 0x020dd572, 0x0364b726, 0x01074f25, 0x0008d29b}}}, + {X: Field{[10]uint32{0x03f3d3fc, 0x03774a38, 0x01cebf8d, 0x0208170a, 0x02664a9b, 0x021ca9ee, 0x02c3dfe2, 0x021277eb, 0x00fa4e7c, 0x00347eb5}}, Y: Field{[10]uint32{0x00f3704d, 0x008d0f14, 0x03326ed2, 0x00c7bfcd, 0x00bad371, 0x0162de06, 0x033f70e8, 0x03f7f951, 0x0314a348, 0x0023f865}}}, + {X: Field{[10]uint32{0x0219aaed, 0x01396d5f, 0x03327032, 0x037a3199, 0x00459bac, 0x0381aa48, 0x02ec02f6, 0x008366a7, 0x00ca5168, 0x00073c4e}}, Y: Field{[10]uint32{0x012f400e, 0x01ba975a, 0x03ffbc13, 0x023fbf1d, 0x03479eef, 0x02db7785, 0x00372a66, 0x018e197d, 0x02f3171c, 0x0035bff6}}}, + {X: Field{[10]uint32{0x00ba68dd, 0x01cee8b8, 0x02d65374, 0x010e31fa, 0x02bca7c9, 0x0076b4c4, 0x0266838c, 0x01d049fc, 0x02abfe2b, 0x000172fa}}, Y: Field{[10]uint32{0x01d03959, 0x00a7cc9f, 0x033b5942, 0x01c17794, 0x007f3d96, 0x0141bbe8, 0x01386665, 0x0055baba, 0x03b6fa90, 0x0004f288}}}, + {X: Field{[10]uint32{0x02a8aa39, 0x0303a7ed, 0x03ac55f6, 0x01ed29e3, 0x0137a663, 0x01266436, 0x035a0968, 0x03504b21, 0x02be5f40, 0x002d61a1}}, Y: Field{[10]uint32{0x03493c1f, 0x01e4d74a, 0x0347b8fc, 0x02639b6c, 0x01abbdaf, 0x01302a47, 0x01478d45, 0x0230b052, 0x014324c7, 0x00158cb5}}}, + {X: Field{[10]uint32{0x023a1550, 0x011319f2, 0x01f279a5, 0x027e3bff, 0x01801da9, 0x007e2dd4, 0x0130976e, 0x015d04b7, 0x01ab3405, 0x003aff1a}}, Y: Field{[10]uint32{0x01362f6e, 0x010afd90, 0x00b1951f, 0x00639a30, 0x037983c8, 0x01fd3f41, 0x01f199db, 0x02d5028f, 0x00cdb99c, 0x0038bffa}}}, + {X: Field{[10]uint32{0x003b4cc5, 0x007af8ec, 0x037c2ee9, 0x02e96871, 0x02572831, 0x01fcea00, 0x035bc4fe, 0x0330ad9e, 0x01b06b8b, 0x0017f067}}, Y: Field{[10]uint32{0x01b57c28, 0x00e7ee19, 0x03ec4a3b, 0x000f3021, 0x009276f5, 0x028e97bd, 0x022138f9, 0x031f19bb, 0x00c0ec98, 0x003b23a1}}}, + {X: Field{[10]uint32{0x028d319f, 0x02fce397, 0x018e948b, 0x0185b510, 0x00e66aa5, 0x01eab260, 0x010b6533, 0x02a19841, 0x0350ce93, 0x001b3970}}, Y: Field{[10]uint32{0x01cf513f, 0x031af5e5, 0x0378308a, 0x03803b14, 0x012da8f2, 0x02ef88fc, 0x013e3e8c, 0x00f216fb, 0x0026e250, 0x00254340}}}, + {X: Field{[10]uint32{0x00b38cb5, 0x02e15f53, 0x00948bb4, 0x037d34e2, 0x03e10b7f, 0x034fba86, 0x03a8a40f, 0x038a277a, 0x030d42ed, 0x002e23ed}}, Y: Field{[10]uint32{0x0165f3d7, 0x03e9d596, 0x00c7197b, 0x00489ebe, 0x024d4f3e, 0x02cd6a38, 0x034bb994, 0x00ca0180, 0x02ad46ea, 0x0035b1cd}}}, + {X: Field{[10]uint32{0x0126087e, 0x01012091, 0x020308f5, 0x02220b68, 0x01fdfb6d, 0x01e62e17, 0x009b6041, 0x033a5f07, 0x01ce97ee, 0x003fcac3}}, Y: Field{[10]uint32{0x00c29907, 0x0147807c, 0x02ceb2c9, 0x01bee438, 0x02c7b7ed, 0x01341e4d, 0x034c4dc5, 0x02e8622b, 0x03fef524, 0x00124f44}}}, + }, + { + {X: Field{[10]uint32{0x0126087e, 0x01012091, 0x020308f5, 0x02220b68, 0x01fdfb6d, 0x01e62e17, 0x009b6041, 0x033a5f07, 0x01ce97ee, 0x003fcac3}}, Y: Field{[10]uint32{0x00c29907, 0x0147807c, 0x02ceb2c9, 0x01bee438, 0x02c7b7ed, 0x01341e4d, 0x034c4dc5, 0x02e8622b, 0x03fef524, 0x00124f44}}}, + {X: Field{[10]uint32{0x0149f8ef, 0x00ea6bcc, 0x034583bd, 0x013b98e2, 0x023deb5c, 0x032c6ec8, 0x0229ebbe, 0x01b27de3, 0x03bc5f36, 0x000a60b6}}, Y: Field{[10]uint32{0x02c7a248, 0x01c9ac05, 0x02d8456e, 0x02504b8f, 0x01095db9, 0x01ed6f27, 0x03a5339c, 0x00882ae7, 0x03e9af66, 0x002986d6}}}, + {X: Field{[10]uint32{0x01d681f9, 0x00153f9e, 0x02b9fc59, 0x03beb23f, 0x0066ce0e, 0x000b252c, 0x037ff25e, 0x008c2222, 0x01f2775f, 0x0031d17f}}, Y: Field{[10]uint32{0x03bb1247, 0x005cd0de, 0x005c7603, 0x00d719f5, 0x038cdbd3, 0x003a0619, 0x031394c7, 0x03979e29, 0x02f2f6b9, 0x00164088}}}, + {X: Field{[10]uint32{0x0380441b, 0x0227d848, 0x03658852, 0x01160385, 0x0060011f, 0x0125f6d6, 0x036eb590, 0x0303dad0, 0x01042af0, 0x00068a39}}, Y: Field{[10]uint32{0x0052af25, 0x03d81aa1, 0x027aeb05, 0x016d1bb9, 0x0104b3e7, 0x025dbc3b, 0x038329a8, 0x0276adf1, 0x027996c5, 0x00155de6}}}, + {X: Field{[10]uint32{0x01cd0ea3, 0x0133bb4d, 0x004815e0, 0x03a0832b, 0x02b34478, 0x019cb9fc, 0x0259e5eb, 0x00142c9e, 0x01f3a975, 0x002aec9e}}, Y: Field{[10]uint32{0x00307bce, 0x024c4cdf, 0x033b6470, 0x0016780b, 0x007c9769, 0x00c1e3b5, 0x034be0c0, 0x025c367e, 0x003bbf17, 0x00177b84}}}, + {X: Field{[10]uint32{0x009a2115, 0x03f54d19, 0x025ebe77, 0x00245e95, 0x02ec7960, 0x01902606, 0x006aca9d, 0x031b1b75, 0x0052b194, 0x003f5cf0}}, Y: Field{[10]uint32{0x02ba6cda, 0x032adee9, 0x0021f049, 0x0158ba75, 0x0104f601, 0x01bdf5b6, 0x00abab02, 0x02211008, 0x00c1c817, 0x001881da}}}, + {X: Field{[10]uint32{0x03c9ee3e, 0x038bcfc6, 0x0382c5c2, 0x02a58f9c, 0x01ea9fa1, 0x0099fb44, 0x03aeaa74, 0x01a0a09f, 0x010b59fc, 0x000fe045}}, Y: Field{[10]uint32{0x019aae06, 0x02b6c316, 0x001603ce, 0x0373f36a, 0x027623b2, 0x011e5598, 0x031beb3c, 0x02a0b519, 0x0268fdbf, 0x00067222}}}, + {X: Field{[10]uint32{0x021e30a7, 0x03c38e58, 0x003242ee, 0x02de6176, 0x002edd5e, 0x034fc805, 0x0250cc0b, 0x00c18074, 0x03e9535f, 0x000322e0}}, Y: Field{[10]uint32{0x03f688de, 0x03defae7, 0x0134dbeb, 0x00dee61c, 0x00aacad2, 0x03bf7215, 0x010e3f17, 0x036b1ee1, 0x0077065f, 0x0003731c}}}, + {X: Field{[10]uint32{0x00e4a007, 0x006fbebe, 0x0358b617, 0x033c22ec, 0x0015ecee, 0x0295b1fb, 0x014ba33a, 0x00b79a56, 0x032dd008, 0x00173e04}}, Y: Field{[10]uint32{0x0068b883, 0x00fc2424, 0x03fe8ce6, 0x025b1e71, 0x02c8946f, 0x01230f7d, 0x02d41588, 0x03e837d2, 0x025c0d61, 0x002d16bb}}}, + {X: Field{[10]uint32{0x003c18e1, 0x00fbf313, 0x03230300, 0x03eeeab5, 0x00ba4ae5, 0x012eb1fd, 0x02267110, 0x0035ae44, 0x01458351, 0x002cfe81}}, Y: Field{[10]uint32{0x02aa2b4f, 0x007efb84, 0x02542cb1, 0x0267c433, 0x01aa55a4, 0x0193f9bf, 0x02182980, 0x03d5adee, 0x00759340, 0x002a1709}}}, + {X: Field{[10]uint32{0x02c2d4a7, 0x01bf9ec9, 0x03fb1095, 0x024cef3f, 0x021bc36f, 0x031013b4, 0x03e33973, 0x02925194, 0x024d0d4b, 0x002db57f}}, Y: Field{[10]uint32{0x02e86371, 0x03739f8e, 0x03cc8118, 0x0139bd78, 0x02745b7e, 0x037fff63, 0x03cf9209, 0x035b0537, 0x03a13abb, 0x0011fcdc}}}, + {X: Field{[10]uint32{0x03816b2f, 0x021b0d46, 0x02e11fdb, 0x021048a3, 0x01ee0cb7, 0x009b1757, 0x00165fe1, 0x00699dba, 0x02dd6595, 0x00169351}}, Y: Field{[10]uint32{0x03e86c60, 0x01ebae1c, 0x00cebaf9, 0x0317ecfb, 0x02b50e6c, 0x03cf7f35, 0x003e27f8, 0x0182ac0a, 0x0396ca0e, 0x001df248}}}, + {X: Field{[10]uint32{0x0066dd33, 0x00cd88bf, 0x036dc509, 0x023fc771, 0x02ea8fbc, 0x000a6c08, 0x03b1b150, 0x01621c1a, 0x03c066cf, 0x0018722e}}, Y: Field{[10]uint32{0x02f10bfa, 0x02ea7ced, 0x00c8ca3b, 0x03ab0a08, 0x036a5106, 0x026174fe, 0x0269994b, 0x03dc0d11, 0x02239e54, 0x0024d667}}}, + {X: Field{[10]uint32{0x035cacbb, 0x019233cc, 0x01b26fce, 0x00a2f58d, 0x0118ac30, 0x0318899c, 0x0177e5bd, 0x003335ee, 0x01b12c72, 0x0013f5a6}}, Y: Field{[10]uint32{0x021ad839, 0x00bbea23, 0x03e6133b, 0x02cba088, 0x00aa998e, 0x036d878b, 0x0079dbfc, 0x0282bb65, 0x02f3f511, 0x0031b243}}}, + {X: Field{[10]uint32{0x016b2ff8, 0x016df337, 0x008fa980, 0x0305ca1b, 0x01876336, 0x03b0ef7c, 0x009f5373, 0x01e1461f, 0x03a57426, 0x002538ca}}, Y: Field{[10]uint32{0x00e1af3e, 0x0121554b, 0x03e13add, 0x010949af, 0x00b33af0, 0x018b67a3, 0x031e4886, 0x0013864b, 0x008b43da, 0x000346d1}}}, + {X: Field{[10]uint32{0x0056e241, 0x03978b3e, 0x01d28780, 0x0052335b, 0x0357f1ee, 0x0006c84a, 0x012b2e63, 0x0203aa7b, 0x03e4b1e8, 0x00209fee}}, Y: Field{[10]uint32{0x02c293ec, 0x016da2eb, 0x03166d60, 0x00c61a40, 0x007ff7a6, 0x0347449a, 0x03ef2c67, 0x01ec2dc6, 0x00923c72, 0x003183e7}}}, + }, + { + {X: Field{[10]uint32{0x0056e241, 0x03978b3e, 0x01d28780, 0x0052335b, 0x0357f1ee, 0x0006c84a, 0x012b2e63, 0x0203aa7b, 0x03e4b1e8, 0x00209fee}}, Y: Field{[10]uint32{0x02c293ec, 0x016da2eb, 0x03166d60, 0x00c61a40, 0x007ff7a6, 0x0347449a, 0x03ef2c67, 0x01ec2dc6, 0x00923c72, 0x003183e7}}}, + {X: Field{[10]uint32{0x00b1815d, 0x03912dc3, 0x03461ef6, 0x024862e1, 0x0260470a, 0x01db9acd, 0x02d7c8d5, 0x01ae5cf8, 0x02a7dce5, 0x002ddfc4}}, Y: Field{[10]uint32{0x0257dbc5, 0x00f4af23, 0x0016d6ba, 0x03e46912, 0x014c42f0, 0x00f30b99, 0x00cefb37, 0x02b310fc, 0x01b14f86, 0x0012dbe1}}}, + {X: Field{[10]uint32{0x03b80fa7, 0x012172ce, 0x01388634, 0x01aedc10, 0x033aa7da, 0x00c82067, 0x011a06bd, 0x030bef03, 0x031f6308, 0x000215f8}}, Y: Field{[10]uint32{0x01366b2d, 0x020847c2, 0x0016abd9, 0x0010f35c, 0x03172e37, 0x0372dc51, 0x017cc9d1, 0x005c824b, 0x03423ae0, 0x003d90e4}}}, + {X: Field{[10]uint32{0x005565ec, 0x0176b4b1, 0x005970fe, 0x037d25df, 0x02d858d8, 0x02de7e55, 0x03308b2c, 0x02fc491e, 0x03943018, 0x001225ce}}, Y: Field{[10]uint32{0x02ed07e9, 0x01e41d7e, 0x037b83b8, 0x02596011, 0x01511b35, 0x005116bc, 0x037bb3a0, 0x03706d90, 0x01684f3c, 0x001d87dd}}}, + {X: Field{[10]uint32{0x01c70e63, 0x000b0e82, 0x01496f5d, 0x01e39d4f, 0x029cbb8b, 0x019299cb, 0x005c6557, 0x018010d5, 0x00ea56bd, 0x000a2ab3}}, Y: Field{[10]uint32{0x0057da4e, 0x000e20bc, 0x021e8b9f, 0x03391136, 0x03f5fc59, 0x01da3aed, 0x0289667c, 0x0038559e, 0x022ef81a, 0x000ada4c}}}, + {X: Field{[10]uint32{0x036d6cd3, 0x0002af9e, 0x0378833a, 0x00740e24, 0x03341661, 0x015948e5, 0x0269b870, 0x02061206, 0x02167f2b, 0x003a8499}}, Y: Field{[10]uint32{0x00f450be, 0x018a497d, 0x01a88aae, 0x00b7aef8, 0x01b1c975, 0x00451789, 0x00e112bf, 0x038ff6ab, 0x02e5078e, 0x00086938}}}, + {X: Field{[10]uint32{0x03e674b5, 0x03714bdc, 0x00aac601, 0x02739c18, 0x0392d8f6, 0x033ae293, 0x01db2c9b, 0x02998517, 0x0225a055, 0x0028bced}}, Y: Field{[10]uint32{0x02937941, 0x00e32383, 0x03a53b09, 0x00c5f0cf, 0x039222fa, 0x00ca9f12, 0x0044a90f, 0x01a2ba00, 0x0159614c, 0x001883a8}}}, + {X: Field{[10]uint32{0x03fd71fa, 0x0135d0ae, 0x027d4a4d, 0x00996d14, 0x030b775a, 0x029c1305, 0x02972728, 0x015671b5, 0x018e8eb5, 0x003a4c49}}, Y: Field{[10]uint32{0x034d3307, 0x02f434c5, 0x035f33d9, 0x0386ed78, 0x00b3946c, 0x032552d0, 0x01eb4169, 0x037b83a1, 0x03364c3f, 0x003ec78c}}}, + {X: Field{[10]uint32{0x011eb056, 0x00058c76, 0x01386c76, 0x036e3b3f, 0x01a002ef, 0x00fd457d, 0x018b5c6a, 0x01648c76, 0x03c9eaae, 0x000f13e0}}, Y: Field{[10]uint32{0x005cecab, 0x01624f68, 0x02b87742, 0x0112073d, 0x001982b5, 0x00ec9e20, 0x02d6573c, 0x022da8ce, 0x0007514a, 0x002511e4}}}, + {X: Field{[10]uint32{0x008fadf1, 0x00f632d5, 0x01f9de64, 0x021e9c4b, 0x0300359b, 0x0224605e, 0x0365f8de, 0x01091270, 0x00387f7f, 0x003b7ce1}}, Y: Field{[10]uint32{0x00415fb6, 0x010db3db, 0x03d2879c, 0x004f7a8d, 0x030f4e88, 0x0082a9ad, 0x01802351, 0x0214037b, 0x01b0a189, 0x001cb4ed}}}, + {X: Field{[10]uint32{0x0186dfa9, 0x0187f6ef, 0x013a7190, 0x029026e6, 0x02dc38b4, 0x02040eea, 0x01c1e03e, 0x019f538a, 0x01288a99, 0x002bfe38}}, Y: Field{[10]uint32{0x01d12681, 0x000f0db0, 0x039c7071, 0x02a51067, 0x00f9116d, 0x03f3d4fd, 0x013ebaa1, 0x01f0ff4f, 0x03b32137, 0x002362d2}}}, + {X: Field{[10]uint32{0x00ff55c5, 0x008f5097, 0x01ec9771, 0x00a0689d, 0x035f4efd, 0x020ad2d8, 0x0012c1e7, 0x0110b29b, 0x01fdfb25, 0x0033cdab}}, Y: Field{[10]uint32{0x01a0228e, 0x009e2148, 0x02706aca, 0x03097034, 0x03a7547e, 0x02f67c81, 0x002f58b3, 0x01da1927, 0x02166ae0, 0x00345a84}}}, + {X: Field{[10]uint32{0x009ba9c1, 0x009cdae6, 0x0338e28f, 0x02968274, 0x01e40f7c, 0x03b3b95e, 0x0058262a, 0x0002cfa1, 0x004528dc, 0x0034fede}}, Y: Field{[10]uint32{0x0351b267, 0x02e237fa, 0x02de0061, 0x03570046, 0x02341ced, 0x022dc3f9, 0x03ca0575, 0x02d39f29, 0x0034efa6, 0x003e2535}}}, + {X: Field{[10]uint32{0x0181f79b, 0x015032f0, 0x02db4fe8, 0x01943392, 0x02e045d8, 0x01a97289, 0x01f82e7c, 0x037ebb8b, 0x00a26c63, 0x000c7203}}, Y: Field{[10]uint32{0x01225400, 0x027949b5, 0x025f1f0b, 0x03abd444, 0x01622ff9, 0x023cc364, 0x014e4d36, 0x009b7cc2, 0x02c12029, 0x0024ad67}}}, + {X: Field{[10]uint32{0x032bb909, 0x025b0743, 0x00d999da, 0x01f14d66, 0x03639102, 0x02461f5f, 0x00729883, 0x02aa23fd, 0x000e0ac9, 0x0013b24c}}, Y: Field{[10]uint32{0x00cf4071, 0x028e0fe9, 0x03827b88, 0x020836b0, 0x02d52e16, 0x0213126e, 0x000dc451, 0x00137172, 0x0106be1b, 0x001e0ae8}}}, + {X: Field{[10]uint32{0x0120e2b3, 0x02d63e88, 0x039aa7f3, 0x0339fd1f, 0x017a58fd, 0x0339b948, 0x03e4ae34, 0x02f6eb9e, 0x01f21f51, 0x003aa992}}, Y: Field{[10]uint32{0x025ad93d, 0x0294c16e, 0x03e59d47, 0x0197c4fd, 0x0201a6b9, 0x021e6a96, 0x01a80f89, 0x02c0eb1a, 0x01ed5bbb, 0x002f8c9e}}}, + }, + { + {X: Field{[10]uint32{0x0120e2b3, 0x02d63e88, 0x039aa7f3, 0x0339fd1f, 0x017a58fd, 0x0339b948, 0x03e4ae34, 0x02f6eb9e, 0x01f21f51, 0x003aa992}}, Y: Field{[10]uint32{0x025ad93d, 0x0294c16e, 0x03e59d47, 0x0197c4fd, 0x0201a6b9, 0x021e6a96, 0x01a80f89, 0x02c0eb1a, 0x01ed5bbb, 0x002f8c9e}}}, + {X: Field{[10]uint32{0x03c9b0a8, 0x02f07307, 0x03db453d, 0x0171c17c, 0x029e337b, 0x00089e7a, 0x0223ea50, 0x025fbb09, 0x01b3beb9, 0x000eb6e7}}, Y: Field{[10]uint32{0x005bbdda, 0x039e5d7c, 0x026cc61a, 0x03e61c09, 0x02aad9c8, 0x030257fd, 0x0374de07, 0x0139c4f1, 0x016daee7, 0x000dd38b}}}, + {X: Field{[10]uint32{0x032e070d, 0x00ff4e8f, 0x02a98f58, 0x007314a9, 0x0229aab7, 0x021411f8, 0x00731c3b, 0x012affd2, 0x01e9042f, 0x0012dca9}}, Y: Field{[10]uint32{0x016dd780, 0x02ea0bba, 0x00c3de44, 0x03774a52, 0x00b0b465, 0x0343cf04, 0x0277bb36, 0x03873d80, 0x014e1d6a, 0x00166787}}}, + {X: Field{[10]uint32{0x00ae86f9, 0x03a78324, 0x03caf054, 0x015a58f9, 0x01fefdff, 0x01b17f1a, 0x010955e5, 0x0272edf8, 0x03ac428e, 0x0004a794}}, Y: Field{[10]uint32{0x0289c85d, 0x03bf7347, 0x0201b822, 0x03f45acf, 0x03b2a232, 0x01c4860f, 0x01a2115b, 0x0268a6cb, 0x03958aee, 0x001057b2}}}, + {X: Field{[10]uint32{0x0202591c, 0x039ff612, 0x025a1e9c, 0x02596144, 0x013ef549, 0x01787f58, 0x026bfbeb, 0x03238a16, 0x03fc6539, 0x002a7f24}}, Y: Field{[10]uint32{0x01bec2dc, 0x02b77bda, 0x03253790, 0x01057f3d, 0x01ca888c, 0x02a45979, 0x004c17a1, 0x021c5cfa, 0x0339dc53, 0x00270b39}}}, + {X: Field{[10]uint32{0x005912ec, 0x01c0283e, 0x01113428, 0x00139182, 0x0327f9ca, 0x02abc150, 0x03499694, 0x016de1aa, 0x01d4e3fb, 0x002a9c48}}, Y: Field{[10]uint32{0x02e35978, 0x0132c992, 0x02cbdb11, 0x02a33815, 0x03fee134, 0x01a8bb7a, 0x005266b9, 0x02542714, 0x0077dad0, 0x0031a43c}}}, + {X: Field{[10]uint32{0x01968b59, 0x001b838b, 0x03c2e110, 0x02b84f2e, 0x0309a28b, 0x0026c09d, 0x03d7ac12, 0x027c29a9, 0x017c1a6f, 0x00325000}}, Y: Field{[10]uint32{0x01e572fb, 0x035d9023, 0x009c8fef, 0x02d90e43, 0x00e2842c, 0x016d5d0b, 0x038a1bfa, 0x0218804e, 0x02500c9b, 0x000e7648}}}, + {X: Field{[10]uint32{0x0055b8da, 0x0090f57a, 0x00711922, 0x01f44a25, 0x02c75626, 0x03b84255, 0x005ecb6a, 0x0251216e, 0x0094c8f6, 0x00180511}}, Y: Field{[10]uint32{0x034e4bbd, 0x0001643c, 0x02a4bad5, 0x0309f8fc, 0x03543955, 0x004cb996, 0x00be1fd9, 0x03991a7a, 0x0269f681, 0x0022ed75}}}, + {X: Field{[10]uint32{0x026b3332, 0x01cccd5c, 0x01de6a28, 0x0341cfb9, 0x00310388, 0x01c2fe38, 0x02793a5f, 0x000093b1, 0x039d7eed, 0x0007e12e}}, Y: Field{[10]uint32{0x00e8d52e, 0x010a28c5, 0x003a2554, 0x00b50db7, 0x00c2bcce, 0x016e7b7c, 0x007c27f7, 0x027b3095, 0x01072bca, 0x003b9c9b}}}, + {X: Field{[10]uint32{0x01972bcb, 0x02565e6c, 0x00ceb9dd, 0x00f8907b, 0x02c2f22e, 0x03b685dd, 0x028e0213, 0x027c0a3d, 0x0057c8bb, 0x000f7cb4}}, Y: Field{[10]uint32{0x025d09df, 0x008b34f5, 0x00771b28, 0x025a0065, 0x031b9144, 0x011a9a12, 0x026b23b0, 0x01bbab5b, 0x01c640c8, 0x00371fac}}}, + {X: Field{[10]uint32{0x01efa98e, 0x02a952b3, 0x027995cd, 0x01a046b0, 0x03724844, 0x02647a71, 0x028157b3, 0x03f341b2, 0x00890945, 0x0003c4f8}}, Y: Field{[10]uint32{0x02286767, 0x029dda6f, 0x02ccdc08, 0x01785b3a, 0x03287e70, 0x01ecd8b6, 0x023f8b0a, 0x01f140d7, 0x01f1764e, 0x002b7548}}}, + {X: Field{[10]uint32{0x03d292dc, 0x001a893f, 0x014ce1b8, 0x0202c5dc, 0x01775e26, 0x01ef5e76, 0x008070d3, 0x03e4d2e9, 0x01533720, 0x0012e645}}, Y: Field{[10]uint32{0x03095ca6, 0x0297ff95, 0x02afd433, 0x03116cdd, 0x03938323, 0x017c07d5, 0x03c0a74b, 0x00e889b7, 0x01496110, 0x0038c9dd}}}, + {X: Field{[10]uint32{0x01f59b6b, 0x00700efa, 0x00e2fa5e, 0x018f0622, 0x03e9b38c, 0x035609b4, 0x0328a1d2, 0x03b1f6cd, 0x01a551dd, 0x00377864}}, Y: Field{[10]uint32{0x02cb1410, 0x03658a49, 0x00fecf6a, 0x02ef9c55, 0x028b5738, 0x0314b853, 0x02757d61, 0x01d72f82, 0x03780282, 0x0016cafe}}}, + {X: Field{[10]uint32{0x03b43eeb, 0x0346cd08, 0x0184feee, 0x0006fe04, 0x00181c94, 0x03cd6717, 0x024825ff, 0x017a4dfa, 0x03979eb9, 0x0020f100}}, Y: Field{[10]uint32{0x0084fb51, 0x00d021b5, 0x03b40aff, 0x032ad54f, 0x0295b6bf, 0x0003586c, 0x03c1e46d, 0x03b8f42f, 0x03f2437c, 0x000a55d7}}}, + {X: Field{[10]uint32{0x01c6b699, 0x03157f72, 0x02871b68, 0x00d5af91, 0x02a86f57, 0x01ed05a0, 0x016d7bf9, 0x01bde968, 0x012eed83, 0x0017eac0}}, Y: Field{[10]uint32{0x01c6c3aa, 0x00c854b0, 0x03519b17, 0x01ffaa20, 0x0390ab11, 0x00358bde, 0x02bb4113, 0x034513a7, 0x0270a3c3, 0x000b66fe}}}, + {X: Field{[10]uint32{0x0234d24f, 0x00d8cb76, 0x037401e2, 0x03c32684, 0x0141b6d8, 0x033d0bb9, 0x011df6de, 0x005a764e, 0x0143c5cf, 0x0039290b}}, Y: Field{[10]uint32{0x02ba9414, 0x03dc4c77, 0x024f13a7, 0x037ea363, 0x00e886ee, 0x02e2b4d3, 0x03c99ccf, 0x031cd49b, 0x02e716d1, 0x001367e4}}}, + }, + { + {X: Field{[10]uint32{0x0234d24f, 0x00d8cb76, 0x037401e2, 0x03c32684, 0x0141b6d8, 0x033d0bb9, 0x011df6de, 0x005a764e, 0x0143c5cf, 0x0039290b}}, Y: Field{[10]uint32{0x02ba9414, 0x03dc4c77, 0x024f13a7, 0x037ea363, 0x00e886ee, 0x02e2b4d3, 0x03c99ccf, 0x031cd49b, 0x02e716d1, 0x001367e4}}}, + {X: Field{[10]uint32{0x028f62bb, 0x03cba8cf, 0x00d2a303, 0x018bdeb9, 0x010553c5, 0x01b13bd3, 0x030acf85, 0x02c634fb, 0x01fb84cf, 0x003f5914}}, Y: Field{[10]uint32{0x032c0911, 0x03642184, 0x0283fd0a, 0x024b4803, 0x00fa2ab4, 0x02f0d133, 0x03e7a5c1, 0x0055e2db, 0x02b2b187, 0x0039d173}}}, + {X: Field{[10]uint32{0x03ea0c68, 0x01042bce, 0x0392b5c8, 0x008d9dec, 0x03094301, 0x034e5beb, 0x009bc8e8, 0x028e8925, 0x0234e156, 0x000f9065}}, Y: Field{[10]uint32{0x0245edb6, 0x02dbfdc6, 0x01a1abcb, 0x0118c0f3, 0x022fa119, 0x01c1a4c1, 0x033cbfe3, 0x0087dfcd, 0x019d924b, 0x000048f1}}}, + {X: Field{[10]uint32{0x01fe696b, 0x0347ee75, 0x007a1fa1, 0x035773cf, 0x030042e2, 0x03e7b6ee, 0x02e81a06, 0x021af1c5, 0x007cb240, 0x0007bb88}}, Y: Field{[10]uint32{0x0029337b, 0x0159c39d, 0x0294ebb4, 0x00b82bf5, 0x037a0206, 0x01187257, 0x03196d12, 0x009a734a, 0x0119aef6, 0x00194b2f}}}, + {X: Field{[10]uint32{0x039824d7, 0x01748f24, 0x01897af7, 0x0130d472, 0x036eb7b6, 0x03dfc2d5, 0x014a3e62, 0x01d423bb, 0x00f5455d, 0x0023650e}}, Y: Field{[10]uint32{0x0366489f, 0x0013d224, 0x0063d8a0, 0x02e0c9ac, 0x038fb9e2, 0x02adbbdb, 0x0260bd31, 0x01b0a8b2, 0x00734fee, 0x000c9878}}}, + {X: Field{[10]uint32{0x03d4b84a, 0x02053105, 0x033e69a9, 0x0123c7d0, 0x00621ddf, 0x00a141c1, 0x022a492d, 0x00bf2c31, 0x01e58dc7, 0x003c4ea6}}, Y: Field{[10]uint32{0x03fd1c81, 0x0243f154, 0x01962859, 0x011c43cb, 0x02b6e37d, 0x038ff81b, 0x02b91cd1, 0x03a656a9, 0x00cd0f0b, 0x000cf0b2}}}, + {X: Field{[10]uint32{0x00d713de, 0x0201c6a6, 0x026208e4, 0x03edd0a3, 0x039360c2, 0x03f95150, 0x00a912a2, 0x01510835, 0x00c558ee, 0x002dc949}}, Y: Field{[10]uint32{0x038350e9, 0x03f94966, 0x01fcb76f, 0x01bf9129, 0x010482d2, 0x0275a505, 0x002d182e, 0x00f91441, 0x039a8a28, 0x0013146c}}}, + {X: Field{[10]uint32{0x0394c0d5, 0x0103c67b, 0x0257908d, 0x0005f15c, 0x01e1c0fc, 0x011b8844, 0x025ab2c3, 0x03ac5351, 0x033ea8a9, 0x003303a8}}, Y: Field{[10]uint32{0x03452fe6, 0x02f965eb, 0x03543dea, 0x0099844f, 0x03f6074f, 0x017ef998, 0x03dd203b, 0x0228bec8, 0x023b711c, 0x003e641e}}}, + {X: Field{[10]uint32{0x023b2cb4, 0x01b0a4ff, 0x010402cc, 0x016fcdc8, 0x023049f3, 0x00484527, 0x01c76e38, 0x0049466b, 0x035a216d, 0x000f7917}}, Y: Field{[10]uint32{0x007eb02f, 0x038ceb0c, 0x0044cf61, 0x03996a1c, 0x02823e28, 0x025f2441, 0x0208aa4a, 0x02b77143, 0x0198405e, 0x002e8aa1}}}, + {X: Field{[10]uint32{0x020c0222, 0x02f5d44a, 0x00b559cc, 0x03e720ba, 0x0016937e, 0x005c03cb, 0x00a18bfc, 0x0228111b, 0x024d9ca5, 0x002792b1}}, Y: Field{[10]uint32{0x00fdc9bb, 0x03dd9ce9, 0x0104e16c, 0x003cf6ae, 0x001c6203, 0x00ecc034, 0x000e8df6, 0x039d34c2, 0x011d9fe4, 0x0033a917}}}, + {X: Field{[10]uint32{0x00e4e5bf, 0x011d9bdb, 0x005b1723, 0x021a8240, 0x029b67ca, 0x012241ab, 0x023fce37, 0x02fa1f07, 0x01c68959, 0x0021447c}}, Y: Field{[10]uint32{0x01789c08, 0x024a5130, 0x025262fc, 0x0226f14d, 0x032da878, 0x01aa8008, 0x01ddf7ec, 0x03521d30, 0x01cf91bc, 0x003b37fd}}}, + {X: Field{[10]uint32{0x02735a1e, 0x030ec513, 0x01fa05f0, 0x0259af98, 0x004003e0, 0x018480bf, 0x038cddad, 0x015b2d1a, 0x03c0799b, 0x0019e2b1}}, Y: Field{[10]uint32{0x02f7c055, 0x00e97dc4, 0x01457a36, 0x02ccf4dc, 0x02597fff, 0x01c417a3, 0x030ff3d5, 0x00a16de9, 0x0233d9a5, 0x00021453}}}, + {X: Field{[10]uint32{0x013258ab, 0x0159a28f, 0x014dc31b, 0x02062af0, 0x0157d242, 0x03852ad6, 0x03a1c72e, 0x018088b3, 0x012e81cf, 0x00231681}}, Y: Field{[10]uint32{0x022d0f8f, 0x038214c0, 0x004ade57, 0x03e70365, 0x0246dae8, 0x00130230, 0x01a80c79, 0x02f6841e, 0x034bb443, 0x001a0476}}}, + {X: Field{[10]uint32{0x022aa9b8, 0x03a5dc20, 0x02f8ed7b, 0x00a4cd41, 0x0300006e, 0x0316b517, 0x026895d9, 0x003db375, 0x0114d868, 0x00192ea5}}, Y: Field{[10]uint32{0x02163565, 0x0347ee6d, 0x03b35e93, 0x01bda0c1, 0x025fef1b, 0x0066f927, 0x0207728c, 0x006f6edf, 0x0322a643, 0x002049cf}}}, + {X: Field{[10]uint32{0x0391bcee, 0x030a82af, 0x00d84158, 0x023c7830, 0x03f5cf1d, 0x015afc4d, 0x0063cec5, 0x00d582f7, 0x0016debd, 0x0033bdfe}}, Y: Field{[10]uint32{0x01966b33, 0x0136a7e0, 0x036ac6bb, 0x000a85cb, 0x03a63e4b, 0x00074917, 0x023b339c, 0x021c0491, 0x00836374, 0x0019f9d3}}}, + {X: Field{[10]uint32{0x0300bf19, 0x01cee750, 0x02a49471, 0x01daa23f, 0x0392b535, 0x02cd4ada, 0x0160fada, 0x02f76550, 0x03ef360c, 0x0007b203}}, Y: Field{[10]uint32{0x0107cefd, 0x03370730, 0x0207b671, 0x01fd8a56, 0x020146e7, 0x01eaefd7, 0x03a4958a, 0x00d034bc, 0x013756b5, 0x002bbbfa}}}, + }, + { + {X: Field{[10]uint32{0x0300bf19, 0x01cee750, 0x02a49471, 0x01daa23f, 0x0392b535, 0x02cd4ada, 0x0160fada, 0x02f76550, 0x03ef360c, 0x0007b203}}, Y: Field{[10]uint32{0x0107cefd, 0x03370730, 0x0207b671, 0x01fd8a56, 0x020146e7, 0x01eaefd7, 0x03a4958a, 0x00d034bc, 0x013756b5, 0x002bbbfa}}}, + {X: Field{[10]uint32{0x014ff9e4, 0x03a01750, 0x010560da, 0x03dbaf62, 0x038e8462, 0x013f242e, 0x02eaa034, 0x012f1b2f, 0x023519f0, 0x0016f9fa}}, Y: Field{[10]uint32{0x03e0bdbb, 0x002c1e11, 0x02309403, 0x00c08466, 0x020e99c6, 0x0156adff, 0x03f890f6, 0x0398151d, 0x02c3f638, 0x000cbccb}}}, + {X: Field{[10]uint32{0x02fea1f9, 0x01f2ef14, 0x012b94b1, 0x01423011, 0x01c4ff0b, 0x01c4194c, 0x00fddab6, 0x03cba0ef, 0x000a55d1, 0x0029b722}}, Y: Field{[10]uint32{0x03c345e9, 0x0305391e, 0x037e63b1, 0x036df9a3, 0x00057b89, 0x01ab2f14, 0x00683a11, 0x019f0c0e, 0x00547dc3, 0x001fbc6a}}}, + {X: Field{[10]uint32{0x01db7bb8, 0x02d517d3, 0x03991e3f, 0x01927e14, 0x00d50028, 0x0237dfd7, 0x013fc869, 0x01399420, 0x01116eae, 0x00163c26}}, Y: Field{[10]uint32{0x025b2d6e, 0x031cd60b, 0x00302bde, 0x0018b45d, 0x02507ee4, 0x0118e019, 0x022ff761, 0x00446835, 0x002aaffe, 0x001f81c0}}}, + {X: Field{[10]uint32{0x02d6c9b3, 0x01030fc1, 0x01637c8d, 0x03a1d219, 0x028c6c4c, 0x0229206e, 0x01c229c7, 0x011664af, 0x013fea42, 0x003f9aea}}, Y: Field{[10]uint32{0x0148bdfb, 0x031e23ea, 0x029b00c2, 0x02fc170b, 0x02d980f1, 0x01504ed5, 0x03b41b34, 0x0261cada, 0x00d74053, 0x001fba46}}}, + {X: Field{[10]uint32{0x007985c4, 0x004f9dc7, 0x02b108b6, 0x01256e78, 0x00134bfc, 0x00bdd30d, 0x00284280, 0x026df395, 0x01caf7b5, 0x0008c82d}}, Y: Field{[10]uint32{0x002c6d44, 0x013c77d3, 0x02b8d4ff, 0x00847367, 0x03d96f10, 0x03e6f2a4, 0x00721b81, 0x03a50c63, 0x003dc88b, 0x0031e7e5}}}, + {X: Field{[10]uint32{0x00f95151, 0x03c41cc3, 0x00b64422, 0x01b910b1, 0x01b96480, 0x030237b4, 0x020c8c2d, 0x0262fec0, 0x02f146fc, 0x00057578}}, Y: Field{[10]uint32{0x03f8ecf2, 0x0281f30b, 0x000f9482, 0x02e5f763, 0x01bb204f, 0x022408fe, 0x010e1097, 0x0353b1fe, 0x0231915f, 0x00296dcb}}}, + {X: Field{[10]uint32{0x009a8e2c, 0x030581b3, 0x021c1413, 0x00693306, 0x03823d8d, 0x021832c3, 0x03cc04fd, 0x0242d8ce, 0x00b9b297, 0x002c3e79}}, Y: Field{[10]uint32{0x033d0db4, 0x0019b137, 0x00ee76c2, 0x000b05c7, 0x003350cc, 0x01bf78fc, 0x00bb0b90, 0x0379b507, 0x03f1843a, 0x00127a0a}}}, + {X: Field{[10]uint32{0x016a5658, 0x02042e4a, 0x025643d7, 0x014907bd, 0x023814b2, 0x01eb8a6f, 0x007e0092, 0x0111eb63, 0x00725688, 0x0021303a}}, Y: Field{[10]uint32{0x001b80d1, 0x019ca6f6, 0x01fd22d9, 0x02607d3c, 0x02d3a61a, 0x0194dc97, 0x007e3190, 0x008b1282, 0x0380c160, 0x00099660}}}, + {X: Field{[10]uint32{0x01d6fad4, 0x000bca76, 0x0124c5aa, 0x033c7268, 0x0094b357, 0x004f567d, 0x02d04ce2, 0x0247b23e, 0x0280670a, 0x0015b6d8}}, Y: Field{[10]uint32{0x019e0836, 0x02703f4d, 0x01cc867a, 0x02868c79, 0x03f5b8b2, 0x035a0c31, 0x03591016, 0x009c9143, 0x0394db57, 0x0036834e}}}, + {X: Field{[10]uint32{0x00dc6a0f, 0x02ed7225, 0x01575375, 0x02450bf8, 0x02744341, 0x00b01df0, 0x01264e7a, 0x01cc7559, 0x01c71a93, 0x003fb5ac}}, Y: Field{[10]uint32{0x036fc7e0, 0x0235cb65, 0x00409ccb, 0x024c28ff, 0x031374d5, 0x0134eb88, 0x039181ae, 0x03fc2a11, 0x03e6b0ff, 0x002378aa}}}, + {X: Field{[10]uint32{0x023a809c, 0x0382c2f2, 0x0346d79f, 0x03d75e60, 0x02dab662, 0x00952a27, 0x03cf97e4, 0x037d5afe, 0x02c83933, 0x0004979f}}, Y: Field{[10]uint32{0x009e70d9, 0x032402a5, 0x00a3dda8, 0x00bbc1ff, 0x031e4e3b, 0x015c868d, 0x03747caf, 0x032ce221, 0x02ede254, 0x003834fd}}}, + {X: Field{[10]uint32{0x00e29355, 0x02217c46, 0x00d86db3, 0x024ce5c8, 0x002f1c8e, 0x0008ee76, 0x00ef8604, 0x032f1c3f, 0x01d992d3, 0x000a9a93}}, Y: Field{[10]uint32{0x01cc2872, 0x00f803ed, 0x0076c005, 0x00e99313, 0x01fe905a, 0x009a3e43, 0x00fdc81e, 0x01f831d8, 0x03ba7c4a, 0x00219df7}}}, + {X: Field{[10]uint32{0x03681028, 0x00a54479, 0x01bb47f5, 0x017abf2e, 0x03196e23, 0x036bcf63, 0x033ce97d, 0x008386fc, 0x03f1185d, 0x00286b2c}}, Y: Field{[10]uint32{0x00a11c9d, 0x02918f85, 0x017881f1, 0x009c7e83, 0x0266eecb, 0x0223c316, 0x00475882, 0x02ca6da8, 0x03a61abb, 0x00156a20}}}, + {X: Field{[10]uint32{0x0148dabf, 0x03ea23f8, 0x038eb1f9, 0x02e4d275, 0x01c1add2, 0x017eb9cd, 0x0364ec23, 0x01d51b65, 0x03026c92, 0x00390b64}}, Y: Field{[10]uint32{0x011e1361, 0x00b1d5a0, 0x03eb9d77, 0x01c0679d, 0x00327275, 0x037ce14c, 0x0338cebf, 0x0212c362, 0x022c6e2d, 0x001904e1}}}, + {X: Field{[10]uint32{0x026642be, 0x02d64a0d, 0x03a889dd, 0x01c5f562, 0x03ce3490, 0x02037ea2, 0x0300af46, 0x0030be46, 0x038c0467, 0x00051a9d}}, Y: Field{[10]uint32{0x0183efd0, 0x00a5d20f, 0x01ed1d0b, 0x0074bdf9, 0x030aaa97, 0x02752ca1, 0x0269827f, 0x000a2b75, 0x00ec3354, 0x002cc638}}}, + }, + { + {X: Field{[10]uint32{0x026642be, 0x02d64a0d, 0x03a889dd, 0x01c5f562, 0x03ce3490, 0x02037ea2, 0x0300af46, 0x0030be46, 0x038c0467, 0x00051a9d}}, Y: Field{[10]uint32{0x0183efd0, 0x00a5d20f, 0x01ed1d0b, 0x0074bdf9, 0x030aaa97, 0x02752ca1, 0x0269827f, 0x000a2b75, 0x00ec3354, 0x002cc638}}}, + {X: Field{[10]uint32{0x01de5cac, 0x008d955e, 0x0261911b, 0x00f1fb2c, 0x03eefc98, 0x02f34533, 0x0270b5c0, 0x01f89395, 0x00ce8a59, 0x0015d3bc}}, Y: Field{[10]uint32{0x035a4805, 0x026ba9b1, 0x0008cae5, 0x01efbc40, 0x011a260a, 0x01a6de11, 0x016ada05, 0x00671cef, 0x0130281f, 0x00026e66}}}, + {X: Field{[10]uint32{0x03315443, 0x00e1ce09, 0x027299d9, 0x03552ba1, 0x013d79bb, 0x002850a8, 0x02c89982, 0x024d7fd0, 0x00040660, 0x003f1a5b}}, Y: Field{[10]uint32{0x03d28960, 0x003582d5, 0x011b1749, 0x0218426f, 0x01487ff4, 0x01a59ded, 0x030e1cdd, 0x01624aef, 0x03ebf83b, 0x00383389}}}, + {X: Field{[10]uint32{0x020966d3, 0x030b5d09, 0x00645808, 0x0306bbfe, 0x0110a770, 0x026320d7, 0x0109397b, 0x03e7e176, 0x02799d8b, 0x0034f65f}}, Y: Field{[10]uint32{0x033c2e52, 0x03ae1420, 0x004eebdd, 0x0046fa37, 0x03b5e487, 0x03500eb4, 0x02a89275, 0x032579aa, 0x006376ba, 0x002376ed}}}, + {X: Field{[10]uint32{0x02fdb4eb, 0x02cbd705, 0x02a79d1b, 0x01e718b9, 0x028fa3dd, 0x00afac24, 0x0256a356, 0x03cab46b, 0x0221ff4f, 0x0025d2bc}}, Y: Field{[10]uint32{0x01f6f484, 0x0270f7ea, 0x00234840, 0x00a8efff, 0x01111c57, 0x00b0243b, 0x011e43d0, 0x000f2993, 0x007d5350, 0x0015548e}}}, + {X: Field{[10]uint32{0x006b5b56, 0x01857f5f, 0x00b607f3, 0x02abb622, 0x014185c8, 0x02fc8039, 0x03587ed3, 0x010ce337, 0x025700ef, 0x00283a21}}, Y: Field{[10]uint32{0x021d7518, 0x02f7944e, 0x00a51a16, 0x0075c216, 0x01526b87, 0x0214f7ab, 0x01a6b89b, 0x02b542e6, 0x02839fa9, 0x003d6e91}}}, + {X: Field{[10]uint32{0x015aeee3, 0x0012b6d7, 0x00813739, 0x030d9963, 0x01e8284b, 0x01a49c31, 0x0121b3a6, 0x00e62c24, 0x019b49de, 0x0016eaad}}, Y: Field{[10]uint32{0x00f69717, 0x00a6bedc, 0x01eed82d, 0x0276af4c, 0x03215ddc, 0x007ff6bd, 0x01a00866, 0x01fa15b9, 0x03617c0f, 0x002295df}}}, + {X: Field{[10]uint32{0x028c6d4b, 0x003ee4e5, 0x00c12004, 0x033e3d25, 0x02b2be78, 0x032efb82, 0x0174e782, 0x006261ee, 0x013288b3, 0x002c6a99}}, Y: Field{[10]uint32{0x0091ac51, 0x02798aba, 0x03cc383d, 0x02427588, 0x03100a1d, 0x0358ea0e, 0x004aa8e2, 0x0035c49a, 0x031c6081, 0x001fb581}}}, + {X: Field{[10]uint32{0x01726890, 0x02c7913d, 0x03d15851, 0x03fab20d, 0x02e59025, 0x03e44283, 0x0032fceb, 0x0310f404, 0x03a7eb49, 0x003eda17}}, Y: Field{[10]uint32{0x0035783a, 0x03aa3cee, 0x039b2606, 0x004ba439, 0x014fa6cb, 0x02192e82, 0x01ca16d9, 0x0178ba1a, 0x0322c98e, 0x0035d437}}}, + {X: Field{[10]uint32{0x02c6e5bb, 0x03b6bb18, 0x03e6ab7e, 0x03b8d5b3, 0x0324fdff, 0x024a965f, 0x00ab0b83, 0x00417cd6, 0x004108c7, 0x0009445b}}, Y: Field{[10]uint32{0x037e1321, 0x011cca83, 0x0272d4dc, 0x037d4730, 0x0377c508, 0x02057763, 0x037406dc, 0x01df807a, 0x0113e771, 0x0018361a}}}, + {X: Field{[10]uint32{0x00bca48a, 0x012fc4ea, 0x0362f546, 0x03d3a0f7, 0x0178b4d5, 0x00a1fdc7, 0x0327b91c, 0x0265682a, 0x03f659e2, 0x00177963}}, Y: Field{[10]uint32{0x02fd41cd, 0x0253a034, 0x00aa9587, 0x0271383e, 0x003fe5bd, 0x014b4f21, 0x01a623c2, 0x026d54c2, 0x033d8035, 0x001a168e}}}, + {X: Field{[10]uint32{0x00cedd26, 0x01977dd4, 0x015541d7, 0x0277a95c, 0x023cc8b9, 0x0258e78a, 0x01d8100f, 0x03aec984, 0x00372961, 0x002be212}}, Y: Field{[10]uint32{0x00e43f7f, 0x039eb4ec, 0x001708b6, 0x01219ea9, 0x0254549e, 0x02fb4be5, 0x00cbb88e, 0x01c0c34a, 0x03f97b16, 0x003715fe}}}, + {X: Field{[10]uint32{0x01ef63b6, 0x00e0d139, 0x0182ebde, 0x0059cc6c, 0x005ab4d0, 0x02d3f072, 0x01b7fda3, 0x0062febc, 0x01cdead6, 0x001bc609}}, Y: Field{[10]uint32{0x01c655f3, 0x0211b3d1, 0x0145412c, 0x019009fe, 0x013c895a, 0x020ccd15, 0x034204d7, 0x02446e63, 0x027dd591, 0x003fc25f}}}, + {X: Field{[10]uint32{0x02a50e2d, 0x02796c7e, 0x00bdc39f, 0x03b3dab9, 0x00b5a275, 0x00206b74, 0x0256e3ea, 0x0200d96c, 0x02605b88, 0x00148435}}, Y: Field{[10]uint32{0x02fda8ee, 0x026a24d6, 0x0286eb02, 0x03371909, 0x035a273d, 0x03fd9622, 0x0013c0e7, 0x034c04e7, 0x034a5dec, 0x000d7d99}}}, + {X: Field{[10]uint32{0x00a63f3b, 0x0011fb7d, 0x039727b5, 0x000665e3, 0x0183203b, 0x039db1d9, 0x007115f5, 0x028ddad6, 0x0095f762, 0x00317b2e}}, Y: Field{[10]uint32{0x01005024, 0x03cdd1a1, 0x03ee5b53, 0x03b978c2, 0x008beb65, 0x03e48cfb, 0x02a4058f, 0x0207cdd3, 0x01181978, 0x00088949}}}, + {X: Field{[10]uint32{0x0180eef9, 0x01aa1e4c, 0x039776d7, 0x008268a2, 0x028d0012, 0x02a81ec4, 0x03acebb1, 0x0397c1f8, 0x00f61d22, 0x003e9430}}, Y: Field{[10]uint32{0x034f2811, 0x03635f4f, 0x0213b38c, 0x024e95e8, 0x025e6832, 0x00a069a2, 0x02cd2872, 0x03aea6dc, 0x02922397, 0x001ae131}}}, + }, + { + {X: Field{[10]uint32{0x0180eef9, 0x01aa1e4c, 0x039776d7, 0x008268a2, 0x028d0012, 0x02a81ec4, 0x03acebb1, 0x0397c1f8, 0x00f61d22, 0x003e9430}}, Y: Field{[10]uint32{0x034f2811, 0x03635f4f, 0x0213b38c, 0x024e95e8, 0x025e6832, 0x00a069a2, 0x02cd2872, 0x03aea6dc, 0x02922397, 0x001ae131}}}, + {X: Field{[10]uint32{0x007f5048, 0x016f88c6, 0x006d459c, 0x0349120e, 0x02e72328, 0x00ba420d, 0x00140fe0, 0x01d381e0, 0x02ee6190, 0x0018e593}}, Y: Field{[10]uint32{0x01309df8, 0x028a1362, 0x02c84383, 0x024d3779, 0x013d580b, 0x00d2fef2, 0x01ff9b1c, 0x033d068e, 0x033a6b89, 0x000edb3e}}}, + {X: Field{[10]uint32{0x01da5e12, 0x03838ce4, 0x00b2971e, 0x0100572b, 0x02a9c60a, 0x028728ad, 0x02329f93, 0x038c6f36, 0x023c4379, 0x003dd40b}}, Y: Field{[10]uint32{0x0385f4eb, 0x02e717a0, 0x00ebc7a4, 0x00bbdc97, 0x007b86d3, 0x00f59c81, 0x0170945c, 0x03ebf566, 0x01edd67c, 0x000f15fd}}}, + {X: Field{[10]uint32{0x02db2a65, 0x012e87ae, 0x01a31f81, 0x00ab4f2f, 0x01afd7f1, 0x003f27dd, 0x01469ddf, 0x02df88b4, 0x025b4d15, 0x00168f38}}, Y: Field{[10]uint32{0x01327f1d, 0x005c33c7, 0x03e8ed8b, 0x030f6097, 0x033ee28b, 0x03cfe66b, 0x03a6dbfb, 0x017d8e1c, 0x025b92e0, 0x0022cd04}}}, + {X: Field{[10]uint32{0x00b7d105, 0x0124cc44, 0x03c9f207, 0x012e5395, 0x03f4ca5c, 0x038d156c, 0x024f6624, 0x01618a8e, 0x00f983ae, 0x0004bf9e}}, Y: Field{[10]uint32{0x03794a60, 0x02b1bee7, 0x010b8458, 0x01975bba, 0x031dece2, 0x0269f2dd, 0x02b5aa19, 0x02f3dde1, 0x01a338d6, 0x000818bc}}}, + {X: Field{[10]uint32{0x0232478e, 0x00c481cf, 0x027ed237, 0x023caa6e, 0x0024ab31, 0x03cccac8, 0x02c6b7f3, 0x004e203f, 0x01d60106, 0x00350804}}, Y: Field{[10]uint32{0x004e88d4, 0x0015a074, 0x00cc31ce, 0x00bcd542, 0x036fb24b, 0x012fe11e, 0x02d5f5f4, 0x0138306c, 0x00e9a37d, 0x002eb975}}}, + {X: Field{[10]uint32{0x020c5d05, 0x00760ce7, 0x02daff62, 0x0142a95c, 0x02480e6c, 0x020212c6, 0x004bb102, 0x011cf563, 0x031347df, 0x001daab0}}, Y: Field{[10]uint32{0x01ece63e, 0x01866dd4, 0x02ee3556, 0x033c0579, 0x034b1225, 0x00809897, 0x02f32c83, 0x01c3beaf, 0x02ef0d5c, 0x003bd55d}}}, + {X: Field{[10]uint32{0x029f44d0, 0x01ccdd52, 0x03a0016a, 0x01b9a6a3, 0x0385dbcb, 0x0037907f, 0x010be34f, 0x00fb69a4, 0x01af98f9, 0x00173981}}, Y: Field{[10]uint32{0x01d30105, 0x0017cd22, 0x00cc6c0d, 0x02fe8cbb, 0x00ab3cb1, 0x0071db16, 0x0256bd03, 0x01aff9ee, 0x039bec22, 0x00133773}}}, + {X: Field{[10]uint32{0x0053c086, 0x01bd217f, 0x01aec9e2, 0x00d27268, 0x00c6b55c, 0x017a2041, 0x0260c314, 0x0173321f, 0x025bbe5c, 0x002998ff}}, Y: Field{[10]uint32{0x01016201, 0x03140ca9, 0x00fc0e69, 0x0295ce65, 0x03991ecc, 0x02608f70, 0x01b102c8, 0x007efd74, 0x017f6b21, 0x002d5066}}}, + {X: Field{[10]uint32{0x01f40840, 0x0035a472, 0x0359eaa2, 0x010a7954, 0x03a71df4, 0x00e290d1, 0x00eaa239, 0x03dd07f9, 0x0121121f, 0x00380d1b}}, Y: Field{[10]uint32{0x03d7ce72, 0x0286abfc, 0x033edc39, 0x0269baf4, 0x02269cd3, 0x03b9ee8a, 0x016d4a97, 0x02255b5d, 0x03713c99, 0x000fb9a0}}}, + {X: Field{[10]uint32{0x03758574, 0x02007b52, 0x01c6e9ad, 0x02250d3e, 0x03d83266, 0x02b8af7c, 0x03ca1027, 0x0336096d, 0x027a0206, 0x0037a554}}, Y: Field{[10]uint32{0x0367232a, 0x037c7f3e, 0x02deb4b7, 0x00145568, 0x03bae6a1, 0x03c5a7b5, 0x021dc847, 0x03453938, 0x0056ac93, 0x001334f8}}}, + {X: Field{[10]uint32{0x016ddcd3, 0x01c8dee8, 0x0003556a, 0x000087a8, 0x03044b11, 0x02e1d86b, 0x035beb6c, 0x0267b7de, 0x0136f64e, 0x0006b86b}}, Y: Field{[10]uint32{0x027eb2b7, 0x0118674b, 0x0213c7cc, 0x0377f2ed, 0x0159616a, 0x00841122, 0x0074f775, 0x02488167, 0x014987a0, 0x001c0581}}}, + {X: Field{[10]uint32{0x0185474f, 0x026e2aff, 0x00668d77, 0x00ae258d, 0x02894c4a, 0x011e16ba, 0x02dccbe4, 0x00ab76ff, 0x00e066d3, 0x002369af}}, Y: Field{[10]uint32{0x017b4ef7, 0x03e71f4f, 0x01d7a5fd, 0x024c176f, 0x010b1cc5, 0x01c77ffc, 0x03ddf5d0, 0x0353fe13, 0x006af31e, 0x0004ff1b}}}, + {X: Field{[10]uint32{0x029de533, 0x03ffe242, 0x02e3c80f, 0x019c08d5, 0x002a9bb5, 0x0191c49d, 0x02979f6a, 0x0243e483, 0x01123337, 0x00044e2b}}, Y: Field{[10]uint32{0x01332573, 0x02dc253f, 0x040006a8, 0x002d1528, 0x03f679bd, 0x03e569f7, 0x030dc3e9, 0x0076521b, 0x01b75875, 0x002cd549}}}, + {X: Field{[10]uint32{0x01d042ea, 0x0350959f, 0x02fd06b5, 0x0299163a, 0x02ebfa26, 0x00cf24ef, 0x03d6649e, 0x02e8e6c6, 0x00c7cfb3, 0x001cca6b}}, Y: Field{[10]uint32{0x035c94a1, 0x0233fb0b, 0x034f0ada, 0x01cc77ea, 0x02184897, 0x03eada3b, 0x0284e794, 0x01bc5224, 0x013541b7, 0x00249c92}}}, + {X: Field{[10]uint32{0x03067ec2, 0x00f4cad7, 0x025220e5, 0x02d756ee, 0x021a288a, 0x03623a10, 0x025bf6b7, 0x006846c6, 0x01d0ca72, 0x00368758}}, Y: Field{[10]uint32{0x02d836f1, 0x03ee83c6, 0x0348a655, 0x026749e6, 0x0166a738, 0x0072478a, 0x00076616, 0x00c1b1e7, 0x015a7c99, 0x002055fd}}}, + }, + { + {X: Field{[10]uint32{0x03067ec2, 0x00f4cad7, 0x025220e5, 0x02d756ee, 0x021a288a, 0x03623a10, 0x025bf6b7, 0x006846c6, 0x01d0ca72, 0x00368758}}, Y: Field{[10]uint32{0x02d836f1, 0x03ee83c6, 0x0348a655, 0x026749e6, 0x0166a738, 0x0072478a, 0x00076616, 0x00c1b1e7, 0x015a7c99, 0x002055fd}}}, + {X: Field{[10]uint32{0x00d3c369, 0x0084348b, 0x02934b3c, 0x020f87e3, 0x02236054, 0x03704a0e, 0x005d5f61, 0x0311137e, 0x000b4ef4, 0x00271ef8}}, Y: Field{[10]uint32{0x02329515, 0x038ffae8, 0x01cbd29e, 0x00e859da, 0x003e3115, 0x03390052, 0x0226d455, 0x0034814a, 0x00de74b2, 0x00248830}}}, + {X: Field{[10]uint32{0x0295a8db, 0x021dccbe, 0x036f615d, 0x03111e74, 0x03b83ec0, 0x0246c5c8, 0x02966469, 0x03741067, 0x01a46303, 0x0038fa43}}, Y: Field{[10]uint32{0x030d1cf9, 0x01b3dfc6, 0x00d3d101, 0x025f3261, 0x02fbb1ef, 0x01c0b9da, 0x00faa90c, 0x005e2ec0, 0x03c0056c, 0x003ef94e}}}, + {X: Field{[10]uint32{0x03b8c9e3, 0x03364b5e, 0x0178e76b, 0x029c1504, 0x0174dd06, 0x02333124, 0x01664b23, 0x0098eed5, 0x03f42825, 0x0003f360}}, Y: Field{[10]uint32{0x034aa9ad, 0x03557ef7, 0x03bf4e86, 0x0337c589, 0x03adbeae, 0x017f6da0, 0x018232de, 0x03ef3b47, 0x01cfeac5, 0x001b02f0}}}, + {X: Field{[10]uint32{0x012ee214, 0x02bf5904, 0x0154017a, 0x025e564c, 0x00782a4e, 0x01703007, 0x03650dfd, 0x035dd6a2, 0x02c732e3, 0x0027d3ff}}, Y: Field{[10]uint32{0x0085f37a, 0x01108894, 0x000283ef, 0x024c2f22, 0x019719b6, 0x035d71a7, 0x0296682f, 0x00bcb983, 0x02e1318e, 0x0018e738}}}, + {X: Field{[10]uint32{0x001d0ce6, 0x030f72d5, 0x00d41f4f, 0x028b3d66, 0x02748992, 0x00e817ec, 0x0214cce3, 0x02a504bb, 0x022937f1, 0x00050a56}}, Y: Field{[10]uint32{0x0338bb86, 0x0206a2b5, 0x0241a52a, 0x01806d74, 0x01310895, 0x011020ec, 0x0031c448, 0x0141c46c, 0x0363df11, 0x003fa9d4}}}, + {X: Field{[10]uint32{0x0361a0a5, 0x01a05147, 0x00e3ef8b, 0x0386cf05, 0x004b1253, 0x03d102cb, 0x031a0a41, 0x012b06c5, 0x022d4113, 0x0010c7d8}}, Y: Field{[10]uint32{0x00cef899, 0x01edff9e, 0x0177246b, 0x0010d559, 0x0241baaa, 0x01c8ea9c, 0x02de6519, 0x010e3db5, 0x027fe7aa, 0x0028a60c}}}, + {X: Field{[10]uint32{0x026b64f1, 0x00e6512c, 0x02d995cf, 0x00a3d51d, 0x01b7edcf, 0x01447967, 0x00da4c62, 0x03c04353, 0x007f1b58, 0x001c5d50}}, Y: Field{[10]uint32{0x024234d5, 0x039fbeac, 0x01d2a426, 0x02ddd11c, 0x02b01fe8, 0x00d3321b, 0x02d34011, 0x035543cd, 0x014344e3, 0x0010ed15}}}, + {X: Field{[10]uint32{0x03748503, 0x0099f559, 0x028e7cac, 0x011dcc4c, 0x000e6e0e, 0x03e284ab, 0x0362ef39, 0x023ee1b2, 0x02ddece7, 0x00264f6e}}, Y: Field{[10]uint32{0x02b0cee2, 0x01cd84df, 0x01aa49ba, 0x03da6e2b, 0x0217f87b, 0x01e87d46, 0x01f78478, 0x03bbade1, 0x01ee8569, 0x0029486a}}}, + {X: Field{[10]uint32{0x03421e21, 0x0136ea65, 0x022f4e46, 0x0288f3bf, 0x003aca86, 0x010633eb, 0x00289212, 0x005dcaea, 0x006b84e5, 0x0003083a}}, Y: Field{[10]uint32{0x01aa6a45, 0x020f5928, 0x01349dfc, 0x03d96f42, 0x0386ee76, 0x0386696d, 0x01237a11, 0x02b6b068, 0x01bf76d0, 0x003d587a}}}, + {X: Field{[10]uint32{0x02d23d80, 0x02889d69, 0x00d478de, 0x007c991d, 0x00e10bd1, 0x024258b0, 0x039431cb, 0x017a968c, 0x02ba06ad, 0x001d7c5e}}, Y: Field{[10]uint32{0x000dd57e, 0x02a16c0a, 0x02590986, 0x03b6ed3a, 0x02372ffb, 0x0066d8a4, 0x03c7d0bf, 0x026a031f, 0x02fe1563, 0x00281e98}}}, + {X: Field{[10]uint32{0x03344f7f, 0x0233e712, 0x020c4c71, 0x03f52339, 0x00ee8b89, 0x0349b504, 0x017e32cb, 0x0382b83a, 0x004bd972, 0x000d5332}}, Y: Field{[10]uint32{0x01db82d6, 0x02c46ba9, 0x020ec7e4, 0x0006180b, 0x018e36c6, 0x026ea215, 0x010b493f, 0x01ad759d, 0x0329291c, 0x0027012f}}}, + {X: Field{[10]uint32{0x01ad3413, 0x02e6db58, 0x01684ae2, 0x00100c9f, 0x028db9c0, 0x032e1ede, 0x0295f485, 0x03d2829b, 0x015e11d9, 0x00199e15}}, Y: Field{[10]uint32{0x02bca672, 0x0204081f, 0x02660124, 0x0054eb71, 0x02a6ce2d, 0x01f2f7e7, 0x01266d92, 0x03d91a49, 0x023de278, 0x00144376}}}, + {X: Field{[10]uint32{0x0102b4b1, 0x01ed7e0d, 0x00a44748, 0x01535b02, 0x01c4af25, 0x018884ea, 0x0086c0f2, 0x0250a101, 0x0018da0f, 0x002b3bc5}}, Y: Field{[10]uint32{0x02e85bfc, 0x007e9e59, 0x0078c6f8, 0x0242b7c6, 0x012a3f62, 0x03625c73, 0x00017b53, 0x01e93781, 0x019fd7e8, 0x003134d5}}}, + {X: Field{[10]uint32{0x02cc8563, 0x002bd6c1, 0x001eaac0, 0x016fff84, 0x009224df, 0x00658da2, 0x02c82bd8, 0x01dd22b6, 0x02362cda, 0x003af712}}, Y: Field{[10]uint32{0x0394ccfa, 0x005ef3a8, 0x00f9249b, 0x02492481, 0x03bec407, 0x033753c1, 0x01ee35e6, 0x034d7e6c, 0x0144e856, 0x0019668c}}}, + {X: Field{[10]uint32{0x01064e13, 0x00ec1843, 0x01e062a7, 0x038111bc, 0x0215311d, 0x023f5059, 0x015ff98e, 0x001a41c8, 0x02ff0c97, 0x002a38a0}}, Y: Field{[10]uint32{0x01f4cc0c, 0x01f1cc44, 0x02bd6cef, 0x00f94375, 0x008b679a, 0x02c94562, 0x03b7f3c5, 0x007026af, 0x015b8db8, 0x001fe5cd}}}, + }, + { + {X: Field{[10]uint32{0x01064e13, 0x00ec1843, 0x01e062a7, 0x038111bc, 0x0215311d, 0x023f5059, 0x015ff98e, 0x001a41c8, 0x02ff0c97, 0x002a38a0}}, Y: Field{[10]uint32{0x01f4cc0c, 0x01f1cc44, 0x02bd6cef, 0x00f94375, 0x008b679a, 0x02c94562, 0x03b7f3c5, 0x007026af, 0x015b8db8, 0x001fe5cd}}}, + {X: Field{[10]uint32{0x037653a1, 0x03ae7a9f, 0x027c1c15, 0x02a9d4f5, 0x03efbe9e, 0x03a99b98, 0x0076f805, 0x02bb2f2e, 0x02e7e27f, 0x0032b1bc}}, Y: Field{[10]uint32{0x02c5e556, 0x0042b43f, 0x003a068c, 0x0395a204, 0x0081e83a, 0x010a8d14, 0x01b65d9a, 0x01bc6533, 0x02e5e2aa, 0x003df505}}}, + {X: Field{[10]uint32{0x023979b5, 0x00666c2e, 0x0029e22a, 0x023799fa, 0x00ba288f, 0x03b90394, 0x0337f0b1, 0x03898c9f, 0x03c5cdad, 0x002b8881}}, Y: Field{[10]uint32{0x0050fa6f, 0x00f359a1, 0x0388968f, 0x01f4df53, 0x00fca87b, 0x00eb5c18, 0x00c92452, 0x027dc6b5, 0x02510c07, 0x003aa47f}}}, + {X: Field{[10]uint32{0x0224003d, 0x03d2ac21, 0x00b11cc9, 0x00a508e3, 0x014ab767, 0x016390c9, 0x03c5932e, 0x03481bbe, 0x0246ee37, 0x0039b7f7}}, Y: Field{[10]uint32{0x0216b93b, 0x02194388, 0x017dd754, 0x03a949ff, 0x003b1ce5, 0x0223e488, 0x02f48f7b, 0x00e5263c, 0x03b7be91, 0x0021c9ec}}}, + {X: Field{[10]uint32{0x02fca824, 0x00064403, 0x024fae41, 0x013fa885, 0x01e0be0c, 0x01961518, 0x02c54100, 0x02b39673, 0x010cad72, 0x0032e37b}}, Y: Field{[10]uint32{0x03227361, 0x002f4163, 0x01742f14, 0x037f1e4c, 0x0096ad1f, 0x028b32f1, 0x0316c487, 0x0223216c, 0x008f740d, 0x000ce940}}}, + {X: Field{[10]uint32{0x00e4dd6a, 0x0384787b, 0x01cef559, 0x02728c88, 0x020a00e4, 0x02359311, 0x01eca37e, 0x00ad92f2, 0x00f7b279, 0x001276f9}}, Y: Field{[10]uint32{0x029e3eae, 0x02dca90a, 0x03b69b13, 0x00bf2816, 0x021c3855, 0x01a48956, 0x01fe33db, 0x02071cb1, 0x02984704, 0x002e2d5c}}}, + {X: Field{[10]uint32{0x03cbd327, 0x006d368e, 0x02aee941, 0x01488792, 0x02b04e08, 0x01f9dbb5, 0x0294900d, 0x020d9c23, 0x03298af1, 0x002c314e}}, Y: Field{[10]uint32{0x017be436, 0x01af128b, 0x02a0f161, 0x0031d18d, 0x03d82a22, 0x02d9acab, 0x00f6a601, 0x01fa858e, 0x03401fbd, 0x003b8aa5}}}, + {X: Field{[10]uint32{0x00dce109, 0x00440d52, 0x011d3b0e, 0x005273c8, 0x02e250e3, 0x02b25820, 0x0240cfc7, 0x0208f59a, 0x009cd9a6, 0x000f1382}}, Y: Field{[10]uint32{0x0219aeea, 0x03d9648e, 0x02697e2b, 0x010b65ff, 0x039579e1, 0x015d934d, 0x0357bca1, 0x0246d201, 0x02669fe1, 0x0010feef}}}, + {X: Field{[10]uint32{0x03b836a1, 0x03bed8e5, 0x01ef7de6, 0x017fdd9e, 0x02c80640, 0x039dfd49, 0x018862ec, 0x02e48353, 0x033f329d, 0x001bdae9}}, Y: Field{[10]uint32{0x02832b84, 0x037cbec1, 0x03f934db, 0x014a2387, 0x00d8990c, 0x016fba70, 0x030b8a40, 0x030638f6, 0x0217ff5f, 0x00371de2}}}, + {X: Field{[10]uint32{0x025d5241, 0x015adfe0, 0x012f6680, 0x032a482f, 0x02563ed7, 0x002cfaa2, 0x00277d34, 0x019d394d, 0x01ada779, 0x003e3307}}, Y: Field{[10]uint32{0x0070e10a, 0x02bc0e3c, 0x00bd4960, 0x01b187ac, 0x0052c2d7, 0x01459bc1, 0x03e892fa, 0x01c3facc, 0x024410b1, 0x0004f793}}}, + {X: Field{[10]uint32{0x02b39ede, 0x038d0827, 0x012d42ae, 0x00cb5c18, 0x00310880, 0x004090d8, 0x00ff467e, 0x00abd2ef, 0x027dc742, 0x001f51c6}}, Y: Field{[10]uint32{0x03f6607e, 0x02f3652a, 0x028fd0c9, 0x01f4708a, 0x027795cf, 0x03ff21be, 0x0382231e, 0x0215941e, 0x0319f3a6, 0x0000129e}}}, + {X: Field{[10]uint32{0x00e5f03a, 0x022d6f7d, 0x006d54fe, 0x03ac7858, 0x0196565f, 0x035f7f8d, 0x03dcfb33, 0x02f8cdcd, 0x03dd0289, 0x002030d3}}, Y: Field{[10]uint32{0x023ca504, 0x03d151bf, 0x005cb117, 0x03bc7cc9, 0x03d30b2a, 0x01f72680, 0x02db5700, 0x007b3557, 0x0056a78c, 0x00091f82}}}, + {X: Field{[10]uint32{0x025eb1c1, 0x03527895, 0x01c5aa56, 0x019f36b9, 0x027fcd75, 0x0260bc25, 0x030fcc31, 0x00feb1c1, 0x0163f9b7, 0x003c0094}}, Y: Field{[10]uint32{0x01de2ae0, 0x01f5c11b, 0x011e57da, 0x01735b34, 0x018576ff, 0x0289abfb, 0x026b4a5d, 0x00837d31, 0x01e8883d, 0x000153aa}}}, + {X: Field{[10]uint32{0x0214f422, 0x00281872, 0x00deca61, 0x03b67931, 0x00b383e4, 0x0136f1ef, 0x03e80221, 0x037cf52b, 0x02e897a9, 0x001b3b46}}, Y: Field{[10]uint32{0x004fc091, 0x00f690f6, 0x00932ae7, 0x0321e6a7, 0x008ca102, 0x02f9ae6e, 0x0095a728, 0x0239eaed, 0x02eb1b0f, 0x00096222}}}, + {X: Field{[10]uint32{0x02c32c64, 0x00d424f6, 0x00bf84cf, 0x000fb2b9, 0x020e36fe, 0x03d1dc57, 0x0304e950, 0x008ea83d, 0x000001ed, 0x002b0485}}, Y: Field{[10]uint32{0x02b1a867, 0x00ab6eb7, 0x03089881, 0x00e9694f, 0x03ed5a5d, 0x00c12668, 0x030b6957, 0x022ebc61, 0x00cbac33, 0x0033a3af}}}, + {X: Field{[10]uint32{0x0319497c, 0x00e0b7a0, 0x008c022f, 0x03e94494, 0x015d59b1, 0x0244f2ac, 0x039e56e6, 0x02161cb4, 0x03b9c9a2, 0x0005d294}}, Y: Field{[10]uint32{0x039afa73, 0x0284eb01, 0x0054383d, 0x007632e6, 0x02646b3a, 0x0311fe79, 0x034155f2, 0x0270595e, 0x0037abfc, 0x00333277}}}, + }, + { + {X: Field{[10]uint32{0x0319497c, 0x00e0b7a0, 0x008c022f, 0x03e94494, 0x015d59b1, 0x0244f2ac, 0x039e56e6, 0x02161cb4, 0x03b9c9a2, 0x0005d294}}, Y: Field{[10]uint32{0x039afa73, 0x0284eb01, 0x0054383d, 0x007632e6, 0x02646b3a, 0x0311fe79, 0x034155f2, 0x0270595e, 0x0037abfc, 0x00333277}}}, + {X: Field{[10]uint32{0x000dd273, 0x0368dbe1, 0x001115f5, 0x00383914, 0x03d53d28, 0x006e4ba8, 0x007071ef, 0x01aed8c3, 0x02e79694, 0x000839b8}}, Y: Field{[10]uint32{0x0346b593, 0x033f456e, 0x0293cc07, 0x01e4f6a1, 0x01811ec9, 0x01e1d195, 0x00ba1ad9, 0x01679128, 0x02fe4f15, 0x0034eb5e}}}, + {X: Field{[10]uint32{0x014b8367, 0x0201cf5d, 0x006bfe94, 0x01f59f54, 0x01b775b7, 0x0210da97, 0x00aa5d45, 0x0149b903, 0x014ae446, 0x00179682}}, Y: Field{[10]uint32{0x01ce85ca, 0x00a6a764, 0x03fa4453, 0x03bcf797, 0x02796aa9, 0x01ca92de, 0x00901f15, 0x0178170b, 0x00c9a479, 0x002ba2be}}}, + {X: Field{[10]uint32{0x02077674, 0x0153cc06, 0x00ca3e7b, 0x004db309, 0x0035ae68, 0x039c76dc, 0x00280a07, 0x01476ea0, 0x0024d7a3, 0x0023832a}}, Y: Field{[10]uint32{0x02b7ed98, 0x0132fb04, 0x010290b8, 0x00674be4, 0x03cff604, 0x0298b3d5, 0x0169d24d, 0x00b50771, 0x02075919, 0x00013b15}}}, + {X: Field{[10]uint32{0x03b10d9d, 0x0215e4e5, 0x00fcaf19, 0x0062747e, 0x01e6a52f, 0x00432e0b, 0x02ccb833, 0x00ba1677, 0x00adb970, 0x00003538}}, Y: Field{[10]uint32{0x0140dced, 0x0040121c, 0x01923e82, 0x0325e38b, 0x030b5898, 0x00c8a1fd, 0x012f8464, 0x0190251f, 0x01981837, 0x0021ee00}}}, + {X: Field{[10]uint32{0x00bcad59, 0x017a0d83, 0x02aa07b0, 0x00169382, 0x017c845a, 0x017e40bc, 0x0217c85a, 0x00d801ea, 0x001152ac, 0x000bb5db}}, Y: Field{[10]uint32{0x00ea66fe, 0x031ea271, 0x0394114a, 0x0004c29f, 0x015f72c6, 0x0205d9fb, 0x01a6eaec, 0x017c88b3, 0x014043b8, 0x0018e7d3}}}, + {X: Field{[10]uint32{0x009caee8, 0x00469827, 0x030bb208, 0x0116c689, 0x03632e20, 0x03b12999, 0x037a19ae, 0x01d303db, 0x021368ef, 0x0000d994}}, Y: Field{[10]uint32{0x0372b711, 0x03b1a8ed, 0x03a7f0a9, 0x0224ca56, 0x0101cba9, 0x02e9a511, 0x009fc681, 0x037b6665, 0x032b2a93, 0x0007c630}}}, + {X: Field{[10]uint32{0x00192441, 0x02bf17aa, 0x034afe96, 0x00868c86, 0x01afdb58, 0x038f59b0, 0x03a63553, 0x020b4717, 0x00da51c9, 0x003deed4}}, Y: Field{[10]uint32{0x005165ae, 0x0103a875, 0x0074bbc6, 0x007eef13, 0x01b1cfdc, 0x03799217, 0x01bc63bd, 0x029498c4, 0x03e30334, 0x0024f30e}}}, + {X: Field{[10]uint32{0x0046c85c, 0x03e5d465, 0x0006353f, 0x00239807, 0x02de37de, 0x00fdb1ba, 0x00676c45, 0x023c7ea8, 0x01056fdb, 0x00039624}}, Y: Field{[10]uint32{0x0148972e, 0x031df9c8, 0x01add5f6, 0x013a0337, 0x00f49023, 0x03d20626, 0x007418ba, 0x01ef683b, 0x005f11fa, 0x0038e692}}}, + {X: Field{[10]uint32{0x015ae087, 0x01240401, 0x00a57e03, 0x01be8d25, 0x00c671b9, 0x010e8544, 0x03945fb7, 0x029660b4, 0x03155b6e, 0x0028d199}}, Y: Field{[10]uint32{0x02887627, 0x03cd98c8, 0x030bccb3, 0x01bc8e53, 0x01c53eab, 0x028a8c14, 0x02fe9a1a, 0x0316f637, 0x03a5e56b, 0x00087297}}}, + {X: Field{[10]uint32{0x022e1259, 0x022b7cf0, 0x0362aff1, 0x02901a04, 0x01931739, 0x0001dddc, 0x02cf5faa, 0x0118fcad, 0x026d26f1, 0x0029d004}}, Y: Field{[10]uint32{0x034a5f43, 0x01c5c90c, 0x02dad5f7, 0x01d4ec75, 0x0117865e, 0x019f1fb9, 0x005f174a, 0x03c7fc6c, 0x03baf194, 0x00016a7f}}}, + {X: Field{[10]uint32{0x00b84b48, 0x03d15c79, 0x017ea830, 0x031e67a0, 0x0091adf4, 0x03505fdc, 0x0110f577, 0x0293d506, 0x030e7d45, 0x0017ec77}}, Y: Field{[10]uint32{0x03be8eb8, 0x037a9a8d, 0x021ad77e, 0x02421cfc, 0x020629c3, 0x039b4960, 0x00f4646f, 0x013527ef, 0x03bcbc3c, 0x000854be}}}, + {X: Field{[10]uint32{0x0308f1fe, 0x0285e8f2, 0x007bfd88, 0x039c2e82, 0x03d7ce7e, 0x0360b45d, 0x01405765, 0x01d39299, 0x00216d94, 0x0021f92e}}, Y: Field{[10]uint32{0x02d5e2ec, 0x01d2b26b, 0x02d9d75f, 0x036f59e1, 0x006e2f23, 0x00be30b3, 0x03d7f8ea, 0x01233b35, 0x02c07663, 0x003dd38e}}}, + {X: Field{[10]uint32{0x01b8f255, 0x01b661fe, 0x00d21114, 0x039d24a8, 0x01e77d43, 0x02aa0bfa, 0x022e4608, 0x02e29058, 0x017478e1, 0x00256ef6}}, Y: Field{[10]uint32{0x00361439, 0x038ffa0a, 0x03fc1010, 0x02bbf1dd, 0x00f2ba72, 0x003cb436, 0x032c208f, 0x031dff7b, 0x02d129e3, 0x002fb50e}}}, + {X: Field{[10]uint32{0x01c4d15c, 0x01c039a8, 0x0274b9a8, 0x02fc1f03, 0x00105ea7, 0x00495291, 0x02c22c0c, 0x01e696a4, 0x03463fea, 0x000d7a86}}, Y: Field{[10]uint32{0x033fe1ea, 0x00e6ebdf, 0x0095edc9, 0x0280c194, 0x005d633a, 0x01d34ec6, 0x008fa5fd, 0x034b35e2, 0x01651b9e, 0x002b4864}}}, + {X: Field{[10]uint32{0x0075b7ba, 0x03f7fc25, 0x00b3d884, 0x00c39246, 0x03e039e7, 0x01406336, 0x03e57edf, 0x01e170f4, 0x02981943, 0x002564e5}}, Y: Field{[10]uint32{0x0124f2fd, 0x022afe1d, 0x01385e9b, 0x019321c2, 0x009c653f, 0x02e735a1, 0x020386a4, 0x00c7762e, 0x012888c3, 0x000b9f95}}}, + }, + { + {X: Field{[10]uint32{0x0075b7ba, 0x03f7fc25, 0x00b3d884, 0x00c39246, 0x03e039e7, 0x01406336, 0x03e57edf, 0x01e170f4, 0x02981943, 0x002564e5}}, Y: Field{[10]uint32{0x0124f2fd, 0x022afe1d, 0x01385e9b, 0x019321c2, 0x009c653f, 0x02e735a1, 0x020386a4, 0x00c7762e, 0x012888c3, 0x000b9f95}}}, + {X: Field{[10]uint32{0x03c8f53b, 0x01d6a502, 0x007c7072, 0x01ace45d, 0x02d70222, 0x035cf657, 0x0232ca7d, 0x029f7abf, 0x0005ff0d, 0x0032fb85}}, Y: Field{[10]uint32{0x00c87f45, 0x00b9ac9e, 0x03728292, 0x03da049b, 0x030d9ff4, 0x02e0a533, 0x01f3e689, 0x03e40ad4, 0x034f4e75, 0x003d8847}}}, + {X: Field{[10]uint32{0x03d69985, 0x03177643, 0x032aea09, 0x032db77d, 0x009f309c, 0x02f333c5, 0x00f690df, 0x00bdf9e2, 0x0275ceb7, 0x0002ba5d}}, Y: Field{[10]uint32{0x0009a003, 0x023ad045, 0x01aff89c, 0x0105ebb8, 0x01d0b99d, 0x01469531, 0x038dfee0, 0x023453a6, 0x0173f6e4, 0x00244866}}}, + {X: Field{[10]uint32{0x00b311dd, 0x01f222c5, 0x01b9cf37, 0x02bbef5c, 0x003de3be, 0x02e894b8, 0x0180bfa0, 0x03d6b375, 0x02d28faa, 0x002b756e}}, Y: Field{[10]uint32{0x01d6c38d, 0x0260bcd2, 0x01b8902f, 0x039d9a6e, 0x0352d4e1, 0x00d66053, 0x00e434f8, 0x030e965d, 0x00f4da3d, 0x003a710f}}}, + {X: Field{[10]uint32{0x01262b90, 0x0064f7f6, 0x0029a9dc, 0x0307f8f3, 0x03b723c4, 0x02009747, 0x0365f177, 0x0184bb26, 0x022a5ac1, 0x000ac561}}, Y: Field{[10]uint32{0x003d7557, 0x0265b992, 0x009a4991, 0x01c3e652, 0x026f5349, 0x02a1d241, 0x0230d52d, 0x00cfea9e, 0x013daa0a, 0x000bac01}}}, + {X: Field{[10]uint32{0x0078afb0, 0x016b9e58, 0x021974e7, 0x031b1049, 0x0314ff12, 0x019b45c1, 0x00d4468c, 0x018ed492, 0x03cd7661, 0x0008275a}}, Y: Field{[10]uint32{0x0340b310, 0x006ddd69, 0x023e385d, 0x024ce7d3, 0x0301edb7, 0x02626296, 0x0165baba, 0x00ca0282, 0x03429e7b, 0x00068bc4}}}, + {X: Field{[10]uint32{0x00e7be40, 0x025c532a, 0x00ee593f, 0x02524410, 0x02f2d2c8, 0x01b91da6, 0x0295c161, 0x03b99dfb, 0x02ed1a96, 0x001abe7a}}, Y: Field{[10]uint32{0x02387e1c, 0x005b809b, 0x01569fa4, 0x019a83d6, 0x0145e3f6, 0x00d1f720, 0x009ea428, 0x0199259c, 0x02116900, 0x002ce04a}}}, + {X: Field{[10]uint32{0x017c0979, 0x01900283, 0x00c96f5f, 0x0052f16a, 0x024a29b3, 0x03d073b4, 0x029df3df, 0x005c50fe, 0x032ba817, 0x0014fc90}}, Y: Field{[10]uint32{0x037b36a2, 0x01fa4314, 0x03845f9f, 0x03d727a2, 0x024bd5a4, 0x0046c1f7, 0x014e3e09, 0x01e6df33, 0x03fbc1f0, 0x002f54bb}}}, + {X: Field{[10]uint32{0x0082801e, 0x02dbe83d, 0x00155d26, 0x022f16f5, 0x0140794f, 0x032e35be, 0x03aab424, 0x00513bac, 0x00ee0444, 0x0016599a}}, Y: Field{[10]uint32{0x00870c37, 0x01c523c1, 0x0135ad47, 0x032d8f4d, 0x028db6c1, 0x01dc4c13, 0x008f9608, 0x03bd7c7b, 0x00a85bba, 0x002526a8}}}, + {X: Field{[10]uint32{0x00977063, 0x00102962, 0x00c4fef4, 0x022fec4c, 0x0365bf6f, 0x019f83f6, 0x0150f838, 0x0269bd87, 0x029e047f, 0x0029d8b9}}, Y: Field{[10]uint32{0x014f6ef1, 0x00da7e0a, 0x00e62a06, 0x028e5b7f, 0x01958b48, 0x00cdcaa2, 0x021732d9, 0x00455e06, 0x0157cbed, 0x001ae637}}}, + {X: Field{[10]uint32{0x032c19fd, 0x026cb9f0, 0x028c3e4c, 0x03a41600, 0x034acab8, 0x02d5c2d6, 0x01f4d17a, 0x0141d8bf, 0x01881b50, 0x002fa134}}, Y: Field{[10]uint32{0x02f1281f, 0x025294dc, 0x01c37676, 0x03d57943, 0x007955a7, 0x00c20e65, 0x01e65f48, 0x01425134, 0x00cb32dc, 0x003bfe58}}}, + {X: Field{[10]uint32{0x0355a9bf, 0x02c0a637, 0x01bf8ebc, 0x03bca7a9, 0x00f6b015, 0x0075f15e, 0x00307f60, 0x00c60604, 0x00eb9c6e, 0x001c98a6}}, Y: Field{[10]uint32{0x003accae, 0x01be2c2f, 0x033b4e11, 0x032f0019, 0x00be797b, 0x00f42678, 0x0035a2ef, 0x026ff6a6, 0x0001a9de, 0x000e3522}}}, + {X: Field{[10]uint32{0x02c69482, 0x02dd7f55, 0x02167bd1, 0x01004cbe, 0x00cbeab5, 0x02bcaf22, 0x0357274c, 0x01fb9507, 0x00314c0d, 0x002619e8}}, Y: Field{[10]uint32{0x03792cd7, 0x0018451b, 0x028a916f, 0x033d4558, 0x039e6245, 0x006ea658, 0x0392d55b, 0x020d3e71, 0x015a3b10, 0x00340b98}}}, + {X: Field{[10]uint32{0x01a7e7d2, 0x01fcb610, 0x03d85995, 0x0230fbea, 0x03a4c90e, 0x0251b791, 0x03af7555, 0x039229a4, 0x030f1339, 0x002e4d04}}, Y: Field{[10]uint32{0x00653d39, 0x02646a26, 0x00c41a4a, 0x036f9c37, 0x03ffd381, 0x02fde347, 0x00929a5f, 0x0015daa8, 0x036b9b2d, 0x002548cf}}}, + {X: Field{[10]uint32{0x01557aa1, 0x008e7647, 0x03c2978a, 0x03fb3407, 0x03df1d92, 0x002675aa, 0x027f2ea0, 0x02056964, 0x024540d8, 0x002a19bc}}, Y: Field{[10]uint32{0x01430634, 0x006eed30, 0x01a4b798, 0x0319f184, 0x0161eb69, 0x036c384e, 0x013d8fa5, 0x00ad135e, 0x01f6a802, 0x002d61ce}}}, + {X: Field{[10]uint32{0x0182b151, 0x004d0327, 0x03a2dbb5, 0x00f5587e, 0x03cca0a4, 0x02c426a3, 0x005a1153, 0x00795b59, 0x0250ae40, 0x0034a98e}}, Y: Field{[10]uint32{0x00f89405, 0x01085d37, 0x00a52d41, 0x002bd213, 0x00a70f75, 0x00a52088, 0x01aee58b, 0x03f2dd59, 0x02fb6443, 0x003a0b61}}}, + }, + { + {X: Field{[10]uint32{0x0182b151, 0x004d0327, 0x03a2dbb5, 0x00f5587e, 0x03cca0a4, 0x02c426a3, 0x005a1153, 0x00795b59, 0x0250ae40, 0x0034a98e}}, Y: Field{[10]uint32{0x00f89405, 0x01085d37, 0x00a52d41, 0x002bd213, 0x00a70f75, 0x00a52088, 0x01aee58b, 0x03f2dd59, 0x02fb6443, 0x003a0b61}}}, + {X: Field{[10]uint32{0x0272da5f, 0x0312eb32, 0x013497c6, 0x01acdb10, 0x0122b9cd, 0x00cdc97e, 0x03c72020, 0x0149788e, 0x03a76100, 0x002ebc60}}, Y: Field{[10]uint32{0x00f2a0cf, 0x03398a2a, 0x01361377, 0x031729ce, 0x018e2336, 0x035a6c74, 0x008bd58d, 0x0134cd5a, 0x03be9ccb, 0x0037ab27}}}, + {X: Field{[10]uint32{0x024b3ba0, 0x027d8d7b, 0x031f1785, 0x03d7c62f, 0x035c2abe, 0x006fc917, 0x03e170f3, 0x03edcefb, 0x0105221f, 0x00104204}}, Y: Field{[10]uint32{0x03525595, 0x02587705, 0x02455486, 0x02159681, 0x00133649, 0x035ae126, 0x00a65ae1, 0x0159a3cb, 0x036976ff, 0x00370dfc}}}, + {X: Field{[10]uint32{0x016c3943, 0x02b29631, 0x02a5ffa5, 0x00b55add, 0x015adbd0, 0x03923dbf, 0x01332906, 0x01008e3e, 0x00a7e384, 0x003debbe}}, Y: Field{[10]uint32{0x00f442f1, 0x03d89feb, 0x01003431, 0x0212a373, 0x03eec301, 0x00eacff3, 0x0042bbdc, 0x0369e5f1, 0x0344d5ff, 0x00138ec2}}}, + {X: Field{[10]uint32{0x03d98ded, 0x02726e24, 0x00218462, 0x020cee28, 0x02dbdf22, 0x014c7597, 0x00f22990, 0x03032323, 0x0210a16c, 0x0018e8a8}}, Y: Field{[10]uint32{0x00d1cfc2, 0x0065f538, 0x0073a519, 0x0280271e, 0x021fabf6, 0x013b6511, 0x02503325, 0x031dbf41, 0x02e2e7fe, 0x00220ad0}}}, + {X: Field{[10]uint32{0x000e5485, 0x02799a80, 0x01df0208, 0x022fd769, 0x02451306, 0x01cc83c4, 0x02c70862, 0x02f7fe38, 0x02d793a2, 0x0007349d}}, Y: Field{[10]uint32{0x005fbd7f, 0x033c1462, 0x024ecca5, 0x01c2c826, 0x0399d0e2, 0x014ba5df, 0x00b34d45, 0x02bdce35, 0x01d18b2e, 0x0019856f}}}, + {X: Field{[10]uint32{0x00045445, 0x0186942e, 0x00d7eea8, 0x01c6407a, 0x0080ff73, 0x0355efbc, 0x0312e2e5, 0x019f28f7, 0x015d449d, 0x00030560}}, Y: Field{[10]uint32{0x0054a206, 0x03e1f550, 0x00ea3214, 0x0390d963, 0x00ba3054, 0x0198f34a, 0x0293c3b6, 0x01045742, 0x020a3ae9, 0x000bcc35}}}, + {X: Field{[10]uint32{0x01924459, 0x032515c4, 0x0278c1fa, 0x00968f1e, 0x037af2fa, 0x03776ec7, 0x022e29f0, 0x0240db16, 0x03cb1001, 0x0037ed51}}, Y: Field{[10]uint32{0x0065fd9e, 0x00178373, 0x031dcfa2, 0x00c39700, 0x0022af09, 0x03721933, 0x00389ce9, 0x011c222e, 0x02a9ba0f, 0x0026b334}}}, + {X: Field{[10]uint32{0x03857faf, 0x0048e730, 0x019701e9, 0x03787a58, 0x03882fca, 0x020a3bdf, 0x017ba8f4, 0x022a7035, 0x036b89ae, 0x0031d5fa}}, Y: Field{[10]uint32{0x00584ca4, 0x0276c328, 0x014c101d, 0x00344062, 0x03627d31, 0x022fb186, 0x03369f20, 0x03fcd895, 0x01cfcd23, 0x003c0e96}}}, + {X: Field{[10]uint32{0x02f8b517, 0x02ecd463, 0x01bac9a8, 0x00691c5c, 0x0177c277, 0x02845789, 0x01bc8064, 0x036c9257, 0x02f7ccc4, 0x001c4808}}, Y: Field{[10]uint32{0x009da1ac, 0x01f7ca09, 0x01d7748b, 0x037cef5e, 0x01a3603e, 0x00251d50, 0x03101f9b, 0x03a4a2b9, 0x0338de4d, 0x002f55e0}}}, + {X: Field{[10]uint32{0x0059225d, 0x034613d5, 0x018d10e4, 0x01f8b621, 0x0244faf7, 0x006700a8, 0x015d4099, 0x028343e0, 0x03aeadaf, 0x003ea018}}, Y: Field{[10]uint32{0x02ce1507, 0x02df8edf, 0x0059c3a2, 0x00db401f, 0x000a2b6c, 0x00931097, 0x00de2208, 0x0301a458, 0x039057c0, 0x0002e9c7}}}, + {X: Field{[10]uint32{0x010bc03e, 0x014f566a, 0x015e33c7, 0x024d4780, 0x0084b0f3, 0x011143e0, 0x01a925f7, 0x001cba79, 0x00ed2c82, 0x000b3bb6}}, Y: Field{[10]uint32{0x02b82adc, 0x01cae2de, 0x03cd01cb, 0x033c8354, 0x034a1df9, 0x03f1f6ba, 0x0050eb7a, 0x0378fb36, 0x0380e9b9, 0x002909da}}}, + {X: Field{[10]uint32{0x02f0d044, 0x027fa505, 0x021a7967, 0x03524279, 0x01aaba9f, 0x018bb829, 0x02f69cf8, 0x015ea278, 0x03c59d02, 0x00196328}}, Y: Field{[10]uint32{0x03cb872d, 0x007ccbbd, 0x00e89add, 0x018f1063, 0x0255a167, 0x004ef4dd, 0x0165d627, 0x0095183c, 0x01377aea, 0x002b9730}}}, + {X: Field{[10]uint32{0x02aa2494, 0x03538c50, 0x00c9a50c, 0x03f9f744, 0x027bdcdd, 0x013aef20, 0x01136e7c, 0x03a3b374, 0x009a4539, 0x000de71d}}, Y: Field{[10]uint32{0x02c86c63, 0x03ea7a33, 0x016435be, 0x029edfa1, 0x011364f6, 0x019e0fc4, 0x01c0ef1d, 0x0300c4f2, 0x03848bf9, 0x00289518}}}, + {X: Field{[10]uint32{0x0296756d, 0x02b255cd, 0x01417ab5, 0x01815958, 0x00676af1, 0x034fcc17, 0x00c19835, 0x03caeb39, 0x034aaf91, 0x000c7252}}, Y: Field{[10]uint32{0x0208ae78, 0x0117a377, 0x01070abc, 0x032b9ab4, 0x0283aedf, 0x02bd0581, 0x00b8b59a, 0x020ea6fd, 0x004b556e, 0x003e03e2}}}, + {X: Field{[10]uint32{0x0217e073, 0x01be6d15, 0x0317b343, 0x02f4e0e4, 0x026bacbd, 0x01f3f721, 0x02e7896d, 0x007ae243, 0x02233547, 0x0019161f}}, Y: Field{[10]uint32{0x03af6589, 0x026797a7, 0x02ab3582, 0x00e44ceb, 0x0185b90a, 0x01f0a668, 0x016dd644, 0x000b8aba, 0x01d5bf69, 0x003667f3}}}, + }, + { + {X: Field{[10]uint32{0x0217e073, 0x01be6d15, 0x0317b343, 0x02f4e0e4, 0x026bacbd, 0x01f3f721, 0x02e7896d, 0x007ae243, 0x02233547, 0x0019161f}}, Y: Field{[10]uint32{0x03af6589, 0x026797a7, 0x02ab3582, 0x00e44ceb, 0x0185b90a, 0x01f0a668, 0x016dd644, 0x000b8aba, 0x01d5bf69, 0x003667f3}}}, + {X: Field{[10]uint32{0x0384480d, 0x03362310, 0x032ef44b, 0x0288aa47, 0x0294e0b6, 0x024bc304, 0x0328b54c, 0x02503cb3, 0x02b142df, 0x002e19b5}}, Y: Field{[10]uint32{0x004cafa8, 0x0166d1c3, 0x006d60e6, 0x02012c76, 0x0024e522, 0x02a6b5eb, 0x02278d7e, 0x03adc226, 0x00b3426a, 0x0006452c}}}, + {X: Field{[10]uint32{0x02103dd6, 0x01c51c83, 0x00859adf, 0x0301f001, 0x02c34604, 0x0164a85e, 0x02213cfc, 0x000fe0da, 0x03d55a42, 0x002f11de}}, Y: Field{[10]uint32{0x02f7c343, 0x0020b635, 0x004ac639, 0x01cb18ed, 0x015d2935, 0x01b7a98e, 0x03ac552c, 0x037549b2, 0x022429a8, 0x0038c787}}}, + {X: Field{[10]uint32{0x01b20d6c, 0x02736a07, 0x02455d22, 0x0393b53f, 0x03e2d52a, 0x0040aea1, 0x019d1646, 0x02067b13, 0x009085de, 0x003b0aee}}, Y: Field{[10]uint32{0x029cf4a0, 0x02671358, 0x03a98a0e, 0x012fa1fb, 0x0233a236, 0x01425031, 0x02f66f06, 0x004e84cc, 0x017661e0, 0x00333b30}}}, + {X: Field{[10]uint32{0x004eab31, 0x0370ec35, 0x034907d0, 0x00501398, 0x000ac5af, 0x019efe3a, 0x003b4232, 0x02e0e00c, 0x00fe5a6b, 0x0016276d}}, Y: Field{[10]uint32{0x01361f6a, 0x02baf9d4, 0x038db941, 0x01548523, 0x031f610e, 0x012f643c, 0x00706202, 0x028a93d8, 0x005c108a, 0x00189551}}}, + {X: Field{[10]uint32{0x02695f94, 0x0202c60d, 0x03fa592d, 0x031a4589, 0x0362a169, 0x02be6a73, 0x00cb8683, 0x023d7f43, 0x0151b455, 0x002c7497}}, Y: Field{[10]uint32{0x02e32736, 0x01fae697, 0x03edca5b, 0x0236ae18, 0x0360f6f1, 0x026aea05, 0x03ea0ac1, 0x0242c7de, 0x0272030e, 0x001c1b76}}}, + {X: Field{[10]uint32{0x020c2c41, 0x02585ca6, 0x036c67bf, 0x0071580c, 0x0042831c, 0x035bb6df, 0x00a1860a, 0x00be8baa, 0x0337d16e, 0x0004ce6c}}, Y: Field{[10]uint32{0x01f1bc2b, 0x03c152ea, 0x023a4185, 0x03e1f7a4, 0x006b1227, 0x0044e8d0, 0x023240fd, 0x02b96e9e, 0x016362c7, 0x0027e6ca}}}, + {X: Field{[10]uint32{0x03b09d0f, 0x0183b2c8, 0x03ecf38a, 0x01903d42, 0x01e50050, 0x03951641, 0x01d75ef5, 0x025b3b4e, 0x03e389e2, 0x001c7129}}, Y: Field{[10]uint32{0x020ddb62, 0x02c7c05c, 0x03fc7637, 0x0021298b, 0x02786f2b, 0x00be042a, 0x033e0a29, 0x03cee82b, 0x02db737a, 0x0004c4fe}}}, + {X: Field{[10]uint32{0x00fc47af, 0x012c7e16, 0x00dec370, 0x0320cb03, 0x00a8ddfe, 0x00006d5a, 0x010329b5, 0x033c5f31, 0x03a11363, 0x001ffcee}}, Y: Field{[10]uint32{0x01ba43a7, 0x0185933e, 0x02c297f8, 0x006b462e, 0x0317a53b, 0x011cd11a, 0x03c891b7, 0x0298a682, 0x03ae8018, 0x0007dae9}}}, + {X: Field{[10]uint32{0x0241e20e, 0x03132ea7, 0x03864d1d, 0x00f5e34c, 0x0138a87a, 0x00e934fa, 0x030f7f00, 0x013722f2, 0x01c4a511, 0x003f0e57}}, Y: Field{[10]uint32{0x03cf42ee, 0x036330b9, 0x00e2b77a, 0x0169a179, 0x02022147, 0x02f76db5, 0x02b81a98, 0x01f42533, 0x009108d0, 0x000e19b8}}}, + {X: Field{[10]uint32{0x01213775, 0x01358025, 0x02a99018, 0x00ec8f50, 0x0100b429, 0x03fb1fd8, 0x001e9395, 0x0182ed85, 0x00463ceb, 0x0023b19c}}, Y: Field{[10]uint32{0x0041ffff, 0x0043cf9e, 0x011e90e0, 0x0282f33d, 0x0271da98, 0x033b7b83, 0x02643415, 0x016f8c1b, 0x026fa0da, 0x0023d629}}}, + {X: Field{[10]uint32{0x02f83231, 0x01c4062d, 0x025e3499, 0x0239d810, 0x00b7c30d, 0x016cff74, 0x01158276, 0x02e89aa3, 0x00c53502, 0x002143e3}}, Y: Field{[10]uint32{0x032e8373, 0x00c6a757, 0x0177f4a0, 0x0285dc8b, 0x010a85bf, 0x020b31e2, 0x03f7086b, 0x02414f42, 0x01be02a7, 0x002f12a7}}}, + {X: Field{[10]uint32{0x0052abbb, 0x00ffe34d, 0x01c2e3cb, 0x00bf8ae5, 0x01ae6aa7, 0x03657525, 0x01bac3fe, 0x0006ee27, 0x01b441e7, 0x0020f798}}, Y: Field{[10]uint32{0x014eb66e, 0x0145dac1, 0x002918a0, 0x00daef39, 0x03d79c5f, 0x03138558, 0x03fb6af8, 0x01827e9a, 0x0334a34c, 0x000cbc38}}}, + {X: Field{[10]uint32{0x032e6ffa, 0x00441937, 0x0176388b, 0x00dedc55, 0x0246be9f, 0x011d4351, 0x005bb6a9, 0x0067ec51, 0x02f98f94, 0x0014ffa2}}, Y: Field{[10]uint32{0x00e92eb5, 0x03acdc99, 0x030c22a1, 0x03980ef5, 0x005fb5f8, 0x01193797, 0x000cf6c4, 0x01518859, 0x017e7b51, 0x0024ca20}}}, + {X: Field{[10]uint32{0x019276f1, 0x022309bd, 0x03b15e96, 0x02ca4a85, 0x0033ae25, 0x03df361a, 0x00bb5c00, 0x03076c6a, 0x03898f50, 0x000f5d98}}, Y: Field{[10]uint32{0x019cbcb3, 0x012996e1, 0x0178601e, 0x008066c6, 0x02f32198, 0x02b60ccf, 0x0176e34d, 0x01f76d82, 0x01737a18, 0x0034dd9a}}}, + {X: Field{[10]uint32{0x0145e458, 0x035b21b7, 0x027fd358, 0x033a8943, 0x002f0aa6, 0x01527781, 0x02546d3e, 0x036216ce, 0x01e0e4e4, 0x0021206f}}, Y: Field{[10]uint32{0x0379057e, 0x012c6d65, 0x02e556d6, 0x0310ac98, 0x02900a79, 0x033b2cb2, 0x0225bf39, 0x00137612, 0x038cba54, 0x000e3b9e}}}, + }, + { + {X: Field{[10]uint32{0x0145e458, 0x035b21b7, 0x027fd358, 0x033a8943, 0x002f0aa6, 0x01527781, 0x02546d3e, 0x036216ce, 0x01e0e4e4, 0x0021206f}}, Y: Field{[10]uint32{0x0379057e, 0x012c6d65, 0x02e556d6, 0x0310ac98, 0x02900a79, 0x033b2cb2, 0x0225bf39, 0x00137612, 0x038cba54, 0x000e3b9e}}}, + {X: Field{[10]uint32{0x00e9f114, 0x010cd49b, 0x021dde54, 0x0014a655, 0x03392ed6, 0x007524af, 0x0143c6cd, 0x00ea2e7f, 0x0050bd38, 0x00258a69}}, Y: Field{[10]uint32{0x024aa391, 0x025cb128, 0x02f8dca3, 0x00f9715a, 0x01b92559, 0x0033bd93, 0x02befd22, 0x02db5d5d, 0x03280c5f, 0x002fd0e6}}}, + {X: Field{[10]uint32{0x012da17d, 0x0283e905, 0x0246b160, 0x036c2341, 0x0011dc13, 0x03f802f2, 0x014e6b05, 0x02317c22, 0x011e0f51, 0x000efabb}}, Y: Field{[10]uint32{0x00c768d2, 0x0012617b, 0x00416ce7, 0x01ee37fb, 0x0154cde7, 0x03a0386d, 0x034a8beb, 0x01eb37fb, 0x03f55aff, 0x0030ec35}}}, + {X: Field{[10]uint32{0x02ca6cc3, 0x00e36589, 0x0218383d, 0x011f861f, 0x031477d7, 0x033224f7, 0x01730da7, 0x011a23ac, 0x0047ef1e, 0x002dcec7}}, Y: Field{[10]uint32{0x014fdba3, 0x00d75da9, 0x03f5afac, 0x014825d5, 0x017322a2, 0x03320142, 0x017d64bb, 0x008aa429, 0x01cb2949, 0x001610c5}}}, + {X: Field{[10]uint32{0x024edcc5, 0x03e85f6e, 0x011b7234, 0x0085080c, 0x03e74e32, 0x0249d665, 0x012dfc03, 0x0275861d, 0x03a0cbdc, 0x001b9cf6}}, Y: Field{[10]uint32{0x019da0e4, 0x007df375, 0x039037b3, 0x0369c019, 0x03278a77, 0x0220a1a4, 0x02455088, 0x033122fa, 0x01fc49ee, 0x003b82b0}}}, + {X: Field{[10]uint32{0x0063e1be, 0x026b4134, 0x01a75c1b, 0x028bdf8e, 0x03a92429, 0x036f3c09, 0x02615253, 0x00ac51c8, 0x01d11d60, 0x0004c590}}, Y: Field{[10]uint32{0x01fec890, 0x007fcf88, 0x01b77fdd, 0x0303e5d1, 0x03bd0fae, 0x036f4afa, 0x002e30fc, 0x00e7c1a9, 0x02617960, 0x00130ef6}}}, + {X: Field{[10]uint32{0x0280b979, 0x03131092, 0x03b31409, 0x03e8ca6a, 0x000490f5, 0x0291f0c4, 0x027d97ea, 0x02d649d8, 0x018937e5, 0x001dc1b7}}, Y: Field{[10]uint32{0x0126cfde, 0x03d20410, 0x03e3214c, 0x00d3f5fb, 0x0117fa0a, 0x007aa71c, 0x038dd799, 0x02dc51dd, 0x01827d5b, 0x002280aa}}}, + {X: Field{[10]uint32{0x038f93e0, 0x038864b4, 0x0099f9c6, 0x00eed9da, 0x03d05b2a, 0x01e8bfbd, 0x03989200, 0x00600c47, 0x02b2db40, 0x003b7f85}}, Y: Field{[10]uint32{0x029405ad, 0x005e4f78, 0x0227e3d0, 0x000311b8, 0x025b3d51, 0x02c17434, 0x0174faa4, 0x036cda53, 0x02f1fca5, 0x003b9a40}}}, + {X: Field{[10]uint32{0x026fe285, 0x02e712dc, 0x03127dcd, 0x00a504fb, 0x02a45bac, 0x007e781a, 0x02f3c7a4, 0x0303e034, 0x02c5929b, 0x0005b508}}, Y: Field{[10]uint32{0x0155b441, 0x003ff9b0, 0x00d4233e, 0x0044dcd9, 0x01e93f0c, 0x018d4c6c, 0x02b7e69a, 0x009906a2, 0x00fa51e2, 0x00037e22}}}, + {X: Field{[10]uint32{0x01e306a5, 0x004cae1a, 0x007f15d3, 0x00931309, 0x02b8b5f6, 0x017cb971, 0x027129b3, 0x0030cd24, 0x0363f9f3, 0x0025cb2c}}, Y: Field{[10]uint32{0x02e86295, 0x007f502d, 0x00f35d06, 0x03b732b5, 0x01b85702, 0x02f1941e, 0x01e77fe5, 0x024aa97e, 0x0304e2df, 0x002b98d1}}}, + {X: Field{[10]uint32{0x02cfa513, 0x0042f2ae, 0x023aeae3, 0x027e6983, 0x004e2407, 0x003d5aa7, 0x01a34475, 0x01b58ea9, 0x0247eec7, 0x0007f303}}, Y: Field{[10]uint32{0x007afc9c, 0x01d6e904, 0x03918750, 0x03459260, 0x004beded, 0x00ce7e6d, 0x00e38754, 0x0151e2d2, 0x01a041e3, 0x00059770}}}, + {X: Field{[10]uint32{0x0046e079, 0x0280d49f, 0x0078dd12, 0x002e17a7, 0x00ab6693, 0x000ae8dd, 0x02f75adb, 0x02b14c3f, 0x02ad2acf, 0x002ae1b0}}, Y: Field{[10]uint32{0x0236ffe1, 0x00a2f05d, 0x017c0ec4, 0x03a12143, 0x01ce7728, 0x01cc8032, 0x01c46d4d, 0x00a6af3d, 0x0286019f, 0x00048270}}}, + {X: Field{[10]uint32{0x02dc69b2, 0x009c1f3f, 0x0371721a, 0x0226c9ad, 0x02a50a60, 0x0172a8e1, 0x00643043, 0x02e285cc, 0x0073ad6c, 0x00304ae4}}, Y: Field{[10]uint32{0x00dd41dd, 0x02ba6c08, 0x032a0032, 0x02f8f49e, 0x02b8ee1d, 0x03e2525d, 0x0372dc89, 0x0337c765, 0x003fe534, 0x000c5cf1}}}, + {X: Field{[10]uint32{0x02341142, 0x031ef3a7, 0x02760d3e, 0x03add91c, 0x007ae684, 0x0268459a, 0x021bd217, 0x028ec06e, 0x00110c2d, 0x00319c07}}, Y: Field{[10]uint32{0x020f4dad, 0x01318567, 0x03e57892, 0x02e96f26, 0x015d07fc, 0x03867d68, 0x03869bbd, 0x0376654b, 0x02b38d6c, 0x000a8083}}}, + {X: Field{[10]uint32{0x0161fe4d, 0x03d6177e, 0x03197ab6, 0x01be2c41, 0x028a1488, 0x004b29cf, 0x033e9313, 0x01ea3e8f, 0x0385dc32, 0x0034166f}}, Y: Field{[10]uint32{0x02e823c2, 0x00d6c19a, 0x0364cb99, 0x0287d36a, 0x00fd388b, 0x0212556d, 0x020765dc, 0x014978ff, 0x0260c08b, 0x0011441e}}}, + {X: Field{[10]uint32{0x00af666b, 0x018c0fdb, 0x00e30bcd, 0x034f12c7, 0x037ffcfe, 0x0205fd18, 0x036979ae, 0x000aa98a, 0x0257a781, 0x0004d192}}, Y: Field{[10]uint32{0x036ecc27, 0x0256a41f, 0x002e13f4, 0x02a07425, 0x0248f300, 0x00f32c32, 0x03e43345, 0x011603bd, 0x01900461, 0x001a6f85}}}, + }, + { + {X: Field{[10]uint32{0x00af666b, 0x018c0fdb, 0x00e30bcd, 0x034f12c7, 0x037ffcfe, 0x0205fd18, 0x036979ae, 0x000aa98a, 0x0257a781, 0x0004d192}}, Y: Field{[10]uint32{0x036ecc27, 0x0256a41f, 0x002e13f4, 0x02a07425, 0x0248f300, 0x00f32c32, 0x03e43345, 0x011603bd, 0x01900461, 0x001a6f85}}}, + {X: Field{[10]uint32{0x025084ae, 0x02127181, 0x02577c75, 0x01f73aaf, 0x019182be, 0x017f84b4, 0x005c88c8, 0x014d8bb0, 0x00f53224, 0x003acf3e}}, Y: Field{[10]uint32{0x016b9480, 0x01f07ffe, 0x012a66f6, 0x03179f6f, 0x01f52b45, 0x03f72928, 0x03e63dce, 0x035c010f, 0x038222d9, 0x00320cf1}}}, + {X: Field{[10]uint32{0x02ca5f51, 0x01ac8263, 0x01aebf21, 0x006e53f2, 0x03ddea17, 0x03c16d73, 0x02ed6b2b, 0x039a58b1, 0x0114dd9e, 0x00377a75}}, Y: Field{[10]uint32{0x00c638f7, 0x01a69cf4, 0x0171f9ad, 0x03a37a25, 0x0150feeb, 0x029fe3c2, 0x011f34b0, 0x02044762, 0x01133ce2, 0x002e139a}}}, + {X: Field{[10]uint32{0x02e9a5d0, 0x016f2f30, 0x001d9f8e, 0x03e61288, 0x02a576fc, 0x0211466c, 0x03a60f21, 0x02665d3d, 0x027d092d, 0x002f7c69}}, Y: Field{[10]uint32{0x0162ff7b, 0x013dc061, 0x02461cdb, 0x01879589, 0x02a6280b, 0x01afdeea, 0x00be54a8, 0x0286aaa0, 0x002bab65, 0x00102564}}}, + {X: Field{[10]uint32{0x019c88e4, 0x001ac166, 0x006ec2f9, 0x00f882b5, 0x039aed51, 0x004812c5, 0x01f406eb, 0x024dcdba, 0x02102369, 0x003f4698}}, Y: Field{[10]uint32{0x015bc8df, 0x02324596, 0x000f299c, 0x03525730, 0x02dc6b71, 0x0125dde0, 0x013c0695, 0x03082fec, 0x0354b9c8, 0x0006b25e}}}, + {X: Field{[10]uint32{0x009b0cca, 0x031a9568, 0x016f01cc, 0x02249293, 0x01a34575, 0x028a3696, 0x00454f68, 0x03d32357, 0x00b1dbb0, 0x000354e3}}, Y: Field{[10]uint32{0x00929e05, 0x02c51f83, 0x034c9731, 0x02676244, 0x038534cd, 0x003bb5f3, 0x00a8d5c4, 0x0304432c, 0x03ac7a3e, 0x0032065a}}}, + {X: Field{[10]uint32{0x038018ce, 0x0056d6d7, 0x02d68bd5, 0x01ce3624, 0x03cf2da5, 0x00b21b71, 0x03ffce4f, 0x025ae7c4, 0x0131d8c2, 0x0013b921}}, Y: Field{[10]uint32{0x0248381f, 0x016986c7, 0x006013c3, 0x01c6d3a0, 0x02710749, 0x0031f179, 0x03b4408d, 0x03e2d7f1, 0x02d4810b, 0x002da3e7}}}, + {X: Field{[10]uint32{0x0327e771, 0x017f05ce, 0x0262abde, 0x02591df6, 0x008c3b41, 0x019120ed, 0x01be267b, 0x03b0a735, 0x026eddc4, 0x001a215a}}, Y: Field{[10]uint32{0x03bbdab6, 0x02358a81, 0x0333a611, 0x03ca4ec1, 0x02331d22, 0x0067ded2, 0x036fd49c, 0x0287ec4e, 0x01f14f79, 0x001de8cf}}}, + {X: Field{[10]uint32{0x01473678, 0x014ba47c, 0x012f7028, 0x0254250e, 0x00cba057, 0x016e301c, 0x01e314c5, 0x00036ffd, 0x009c34c4, 0x003f5db3}}, Y: Field{[10]uint32{0x01144f4f, 0x0193baa3, 0x008437e1, 0x03b85007, 0x0260628e, 0x0340cb35, 0x03ee0a73, 0x010f6b83, 0x01437871, 0x003c8119}}}, + {X: Field{[10]uint32{0x02e66b24, 0x00014cb3, 0x00366b5f, 0x003fb5ee, 0x02e8b9c6, 0x03c6b7b4, 0x0244d99b, 0x031ee203, 0x00cfb9e9, 0x00133576}}, Y: Field{[10]uint32{0x000932fd, 0x03bf6ebd, 0x03aed221, 0x01784b4b, 0x03ca61e4, 0x0335b440, 0x024e8c39, 0x012d567f, 0x0282deb9, 0x0015dbab}}}, + {X: Field{[10]uint32{0x017a2193, 0x002dc523, 0x0146edf0, 0x0113c65d, 0x012c691e, 0x012d3a88, 0x026ce827, 0x02d00867, 0x03a33123, 0x002168aa}}, Y: Field{[10]uint32{0x00cdcf3a, 0x0320f52c, 0x012427f0, 0x037e70ec, 0x03e1c6da, 0x007300a7, 0x02c6082d, 0x00145b60, 0x0057eb2b, 0x002704a6}}}, + {X: Field{[10]uint32{0x01d7e577, 0x00c0f3bb, 0x004d56ae, 0x015a14db, 0x03d3a0f2, 0x003a8841, 0x00604727, 0x03dec96b, 0x010f8828, 0x0030d4b5}}, Y: Field{[10]uint32{0x00d9b570, 0x013fe23e, 0x017063ca, 0x02cad848, 0x0300a8ab, 0x02f39e7e, 0x03d53145, 0x02e6e5aa, 0x0038ba76, 0x002f9dca}}}, + {X: Field{[10]uint32{0x037568b0, 0x000c16cd, 0x03b0535b, 0x03406780, 0x0335ae8d, 0x01e0d943, 0x00b6d6c5, 0x03f9d110, 0x03fc73cf, 0x00349776}}, Y: Field{[10]uint32{0x0339929c, 0x004e49b7, 0x03f0060a, 0x022078f0, 0x03832273, 0x0379f64a, 0x02aef74c, 0x01224e2f, 0x037593f8, 0x001e8ebf}}}, + {X: Field{[10]uint32{0x02712536, 0x0158fa07, 0x03e71a33, 0x03d5bfd7, 0x02a85051, 0x02d8d7a7, 0x006de71a, 0x00ea7f82, 0x0286b0a4, 0x0001a453}}, Y: Field{[10]uint32{0x001128f1, 0x011dc4e0, 0x029da2a2, 0x01ac2bde, 0x00896c22, 0x016b0a30, 0x018aceae, 0x02f4149f, 0x012852d9, 0x000adf9e}}}, + {X: Field{[10]uint32{0x031d7c13, 0x03944629, 0x03a3855f, 0x03dfe83f, 0x01641ab5, 0x01eab201, 0x0307e9a9, 0x0129c957, 0x013143e9, 0x0011604d}}, Y: Field{[10]uint32{0x02ff63cf, 0x022f154e, 0x016b9963, 0x01550af6, 0x01702006, 0x01f75a72, 0x03f50f17, 0x026b62d5, 0x00ec1497, 0x0027d616}}}, + {X: Field{[10]uint32{0x0183f366, 0x028e834b, 0x00588cad, 0x03b78bca, 0x020cd9cc, 0x0307725e, 0x02f430bc, 0x03f8ba6b, 0x01f5b713, 0x002f12a7}}, Y: Field{[10]uint32{0x001f33c1, 0x02359996, 0x03b16d75, 0x03efe951, 0x02a6e8a9, 0x012de632, 0x03937adf, 0x017018e0, 0x01ca6e78, 0x00034ea0}}}, + }, + { + {X: Field{[10]uint32{0x0183f366, 0x028e834b, 0x00588cad, 0x03b78bca, 0x020cd9cc, 0x0307725e, 0x02f430bc, 0x03f8ba6b, 0x01f5b713, 0x002f12a7}}, Y: Field{[10]uint32{0x001f33c1, 0x02359996, 0x03b16d75, 0x03efe951, 0x02a6e8a9, 0x012de632, 0x03937adf, 0x017018e0, 0x01ca6e78, 0x00034ea0}}}, + {X: Field{[10]uint32{0x03fceb19, 0x0379517c, 0x00409282, 0x0087de17, 0x002e89b2, 0x0339eead, 0x005c7626, 0x033302af, 0x015e11ce, 0x003690cf}}, Y: Field{[10]uint32{0x02f5cc64, 0x039c4829, 0x03277684, 0x00b6489e, 0x018e77fc, 0x03e57948, 0x02bbdc4a, 0x0040c077, 0x03d321a8, 0x00392636}}}, + {X: Field{[10]uint32{0x0312be3c, 0x028b8cbd, 0x02a66b06, 0x023b6851, 0x007295f1, 0x02c0054d, 0x00725dba, 0x02cde34f, 0x009d9331, 0x000e75cd}}, Y: Field{[10]uint32{0x006ff65c, 0x00067d07, 0x01644cc3, 0x0297b290, 0x00ef5ef7, 0x019a04ba, 0x0127554c, 0x00efdfec, 0x034f56ef, 0x0023e4a6}}}, + {X: Field{[10]uint32{0x02cf692a, 0x0389d716, 0x03e0654d, 0x0229c881, 0x01bcc483, 0x00705bbf, 0x01c11698, 0x031fb070, 0x021ee9e8, 0x0000c7a3}}, Y: Field{[10]uint32{0x016f667a, 0x00aa13ac, 0x033b09cc, 0x009f16fd, 0x03706498, 0x00359d0e, 0x01097029, 0x00d4f767, 0x035b465b, 0x002b5f9f}}}, + {X: Field{[10]uint32{0x0377f22b, 0x0393ef37, 0x02e035aa, 0x00e653e0, 0x02c69972, 0x02656bc9, 0x011cd6c2, 0x00774279, 0x0217f7dc, 0x003c32e9}}, Y: Field{[10]uint32{0x0109a03c, 0x0238b1d6, 0x015661fc, 0x01fa4282, 0x0004f18c, 0x0145b410, 0x03326c36, 0x037e627b, 0x034313f9, 0x0006896a}}}, + {X: Field{[10]uint32{0x03829372, 0x002a929d, 0x00553dec, 0x003222e9, 0x03c49b30, 0x00e15e5a, 0x03626ae5, 0x0034ecc4, 0x00c90f3e, 0x002d0c67}}, Y: Field{[10]uint32{0x02dd5427, 0x02733002, 0x011bb772, 0x005728f8, 0x02707b12, 0x03087168, 0x037afe09, 0x0140affe, 0x00499a6f, 0x0011c1f5}}}, + {X: Field{[10]uint32{0x02509c12, 0x03373531, 0x0347658a, 0x008d6f47, 0x018d6bfe, 0x021c9a3b, 0x01170e8d, 0x01534c87, 0x02b9db21, 0x000e075e}}, Y: Field{[10]uint32{0x02b46102, 0x010aa38b, 0x02af7546, 0x0161b39b, 0x03205828, 0x02996079, 0x01d24573, 0x00f6a7ad, 0x035b7fda, 0x00291eaa}}}, + {X: Field{[10]uint32{0x01f488b6, 0x02f5ffe0, 0x0291592b, 0x00d8ff1e, 0x03e9c9bf, 0x00995fdc, 0x03e00d86, 0x01845574, 0x0207a88d, 0x002a61e1}}, Y: Field{[10]uint32{0x031dab1d, 0x029eeec0, 0x01c6d495, 0x006592b5, 0x0239d0f0, 0x00855f08, 0x0063e7c8, 0x02575870, 0x01abd588, 0x00346068}}}, + {X: Field{[10]uint32{0x004fe955, 0x00ed358e, 0x03ce48db, 0x0296818e, 0x03f69956, 0x02532294, 0x013b73e6, 0x021f991e, 0x005467ab, 0x0029c0fc}}, Y: Field{[10]uint32{0x021344bd, 0x02cbbef5, 0x0277fa26, 0x00a7165c, 0x03539e16, 0x02c64666, 0x02a792d6, 0x011eb703, 0x0135a2b0, 0x0035403e}}}, + {X: Field{[10]uint32{0x038a8cc6, 0x0024edb0, 0x038fbe64, 0x007a7da7, 0x00ba2e12, 0x03b5fcf7, 0x02279ff6, 0x0105f923, 0x00c750b3, 0x000cc649}}, Y: Field{[10]uint32{0x02587810, 0x02383ed1, 0x01b54c4e, 0x026b3a7a, 0x017fb99e, 0x038bfecc, 0x025b601b, 0x03c060ae, 0x01411b33, 0x0032a3de}}}, + {X: Field{[10]uint32{0x02eace58, 0x02595b01, 0x0211d349, 0x018e8bcc, 0x031b7e45, 0x0014e80f, 0x006ad0d7, 0x01435d1b, 0x03c5aad5, 0x001cf1ac}}, Y: Field{[10]uint32{0x02f8654e, 0x002a45ca, 0x01291717, 0x0236eee3, 0x02aa6a87, 0x019b6471, 0x02909913, 0x013dd06e, 0x00a4733a, 0x000e8bed}}}, + {X: Field{[10]uint32{0x01cbcb9e, 0x03c449b3, 0x03c3df4b, 0x02277360, 0x01d6fa56, 0x03f50dd8, 0x00c32447, 0x00cdea7b, 0x02d7119d, 0x003372c4}}, Y: Field{[10]uint32{0x0161cfd1, 0x029616b2, 0x03340a08, 0x0090d637, 0x01a199af, 0x01b7a652, 0x02fbea09, 0x03c47eff, 0x02e17bb9, 0x0039a678}}}, + {X: Field{[10]uint32{0x00181d5e, 0x00e22fc0, 0x02f2054b, 0x02a6e56a, 0x00de71b3, 0x0303b76e, 0x0100d3a1, 0x011ff687, 0x03e7506d, 0x003189fc}}, Y: Field{[10]uint32{0x029f886d, 0x0240298d, 0x022c3927, 0x0015272f, 0x028ef6b0, 0x02287df5, 0x01696013, 0x00a98ecb, 0x01d71e44, 0x0035e3e7}}}, + {X: Field{[10]uint32{0x025fe9cc, 0x011f3dcc, 0x008db1d7, 0x02ecd276, 0x03fbb883, 0x00b52b08, 0x00411084, 0x00c6c4dc, 0x026328ec, 0x0031bb57}}, Y: Field{[10]uint32{0x028fd94b, 0x02f38712, 0x02cf10c0, 0x00ad83c8, 0x02844f97, 0x031fdeca, 0x032ee125, 0x03e0c0a4, 0x005b49d7, 0x003791d0}}}, + {X: Field{[10]uint32{0x03828b16, 0x00a367ed, 0x0047f34e, 0x023ca292, 0x03a04795, 0x03c1b794, 0x025f40a6, 0x0348cfe8, 0x02be0edf, 0x002ee23e}}, Y: Field{[10]uint32{0x02ea5df7, 0x011ce882, 0x02969c51, 0x01d38e87, 0x03ec4a81, 0x00456458, 0x01dc5960, 0x03a374d1, 0x02b304f5, 0x002dcd9d}}}, + {X: Field{[10]uint32{0x01324caa, 0x02acc3f9, 0x032a3954, 0x038c2a51, 0x02694b65, 0x0114a8cb, 0x03d8c749, 0x022f0348, 0x017bf829, 0x00230a2a}}, Y: Field{[10]uint32{0x03ef9482, 0x00771cf2, 0x039459e7, 0x03c11472, 0x037ae784, 0x03df303a, 0x00fedf31, 0x01464cde, 0x0063a330, 0x001028c1}}}, + }, + { + {X: Field{[10]uint32{0x01324caa, 0x02acc3f9, 0x032a3954, 0x038c2a51, 0x02694b65, 0x0114a8cb, 0x03d8c749, 0x022f0348, 0x017bf829, 0x00230a2a}}, Y: Field{[10]uint32{0x03ef9482, 0x00771cf2, 0x039459e7, 0x03c11472, 0x037ae784, 0x03df303a, 0x00fedf31, 0x01464cde, 0x0063a330, 0x001028c1}}}, + {X: Field{[10]uint32{0x0211d8e2, 0x02c807dd, 0x03c4d5df, 0x03a37927, 0x02c8130f, 0x011fc368, 0x03ed5a60, 0x028bc65a, 0x01872a38, 0x002ac6b0}}, Y: Field{[10]uint32{0x0029d15b, 0x01607cf1, 0x0145f01a, 0x034cf879, 0x02f7ef93, 0x02da90ad, 0x02a5f39d, 0x005e87a6, 0x037a324d, 0x0004fd28}}}, + {X: Field{[10]uint32{0x0354dd40, 0x03a1c551, 0x026cf863, 0x00c7f0d1, 0x01a24226, 0x035cbdba, 0x034841fc, 0x037f3d16, 0x007032c0, 0x0025ca49}}, Y: Field{[10]uint32{0x02a36143, 0x02d24bca, 0x02f49384, 0x014956b2, 0x0290dae8, 0x02f537cd, 0x015c75dc, 0x03a87734, 0x0244265f, 0x00247468}}}, + {X: Field{[10]uint32{0x0251b3fa, 0x02bb9909, 0x03434226, 0x0195dcb7, 0x038ea1b3, 0x014fcc7b, 0x003a6072, 0x03e0b4dc, 0x029b5bee, 0x0009593f}}, Y: Field{[10]uint32{0x01e5122d, 0x00b9a8c0, 0x0016edb8, 0x02adade6, 0x0314f37d, 0x0080e497, 0x03a14ae1, 0x00e24257, 0x03a60678, 0x0022b67d}}}, + {X: Field{[10]uint32{0x002ca7ff, 0x0360bae3, 0x0021a3c2, 0x0176577c, 0x03180364, 0x028bc9eb, 0x00791ad5, 0x01e5b814, 0x0397580a, 0x002258df}}, Y: Field{[10]uint32{0x00493e68, 0x0105785c, 0x02ab7bed, 0x028e390b, 0x01f87bc6, 0x010d5d22, 0x03b9cf15, 0x02109355, 0x01248c88, 0x000b47f8}}}, + {X: Field{[10]uint32{0x007a89ee, 0x030d4cc3, 0x014f8057, 0x0271eadb, 0x024bdbc5, 0x03261962, 0x0060b88f, 0x01e7844a, 0x00e26a41, 0x001c7be9}}, Y: Field{[10]uint32{0x01366a2e, 0x0224ca70, 0x01a0b4f4, 0x02e2397a, 0x022aaafa, 0x005ca528, 0x03b2c32b, 0x0092ba7b, 0x001f8bb6, 0x000517ea}}}, + {X: Field{[10]uint32{0x00a8dd7f, 0x01b58e83, 0x0381a618, 0x000d5a84, 0x021bc728, 0x0354d5d0, 0x01c9da03, 0x017824bf, 0x00e71be2, 0x000c204e}}, Y: Field{[10]uint32{0x0292c7f2, 0x017c91e2, 0x01915e41, 0x01190d2b, 0x00c81656, 0x00502386, 0x039ec45d, 0x03f24978, 0x02d28828, 0x000a3478}}}, + {X: Field{[10]uint32{0x02180068, 0x0238f4eb, 0x03103b17, 0x01b082f4, 0x027ea3d5, 0x00c37006, 0x006c5c0c, 0x016c32ff, 0x0136ffac, 0x003fcf58}}, Y: Field{[10]uint32{0x008c6077, 0x01aedb86, 0x035e670a, 0x03c90007, 0x01547676, 0x0365ab70, 0x010372cd, 0x00003903, 0x01be84e4, 0x0004cc8e}}}, + {X: Field{[10]uint32{0x026a3fb1, 0x03315a21, 0x02206c0d, 0x00a0664b, 0x036ec009, 0x016da18b, 0x025750c8, 0x03ad9747, 0x00e82a6d, 0x0015d7f1}}, Y: Field{[10]uint32{0x002655ad, 0x023a42a4, 0x02f2f09b, 0x01cf1a8e, 0x02ed33b5, 0x01e3a1f6, 0x031dbc29, 0x03f28b59, 0x039042a6, 0x001bdbb6}}}, + {X: Field{[10]uint32{0x0121250a, 0x039ff72f, 0x00ad4954, 0x01d60e66, 0x03df45e1, 0x010d5579, 0x01e342ba, 0x022b494c, 0x01480bab, 0x000fea45}}, Y: Field{[10]uint32{0x02a76731, 0x021b00be, 0x01fb791c, 0x01680cad, 0x002e45e5, 0x00eec49f, 0x01bdf960, 0x02c0c33d, 0x02905499, 0x002fe6d9}}}, + {X: Field{[10]uint32{0x010117df, 0x01aa291e, 0x0102921b, 0x02ef3880, 0x03da253b, 0x03ba8aa3, 0x03f26f81, 0x02ade889, 0x0036b64e, 0x00297b24}}, Y: Field{[10]uint32{0x006462fe, 0x00a04cfe, 0x02363d81, 0x03c15852, 0x031c8461, 0x0347e83d, 0x0197983a, 0x01010031, 0x02625ec1, 0x002de771}}}, + {X: Field{[10]uint32{0x01e0545f, 0x0008d263, 0x0074f5cb, 0x0368841b, 0x0080e625, 0x02cd422b, 0x035ea004, 0x01c4928d, 0x03cc58e0, 0x00148116}}, Y: Field{[10]uint32{0x006c3d91, 0x028d3014, 0x01af236e, 0x003caa3f, 0x03793b9d, 0x00338c4a, 0x030ed9c2, 0x0048eb50, 0x01fcebe3, 0x0006cfcc}}}, + {X: Field{[10]uint32{0x032ad712, 0x03e5d705, 0x007290b0, 0x02c37841, 0x015a398c, 0x0118d26e, 0x01e79761, 0x002c2527, 0x03e91331, 0x002854f7}}, Y: Field{[10]uint32{0x0148fdd2, 0x017d94e3, 0x03329c8a, 0x00a16bc2, 0x02bd053f, 0x007c6e26, 0x00318d5f, 0x016cbf12, 0x00413fb0, 0x003f6536}}}, + {X: Field{[10]uint32{0x0220479f, 0x004f430c, 0x0338a89f, 0x02579796, 0x035de47b, 0x00dd80d8, 0x0162c8d2, 0x00bf6e00, 0x036ebe47, 0x00162d50}}, Y: Field{[10]uint32{0x027db17a, 0x01cdd795, 0x0334144a, 0x03120a6e, 0x0396af27, 0x00bdb7a0, 0x02913a25, 0x019cb138, 0x02b055cd, 0x002175ed}}}, + {X: Field{[10]uint32{0x01cf5b3a, 0x030dc044, 0x02781030, 0x020ef6d6, 0x00c4433a, 0x023b7209, 0x01c34d08, 0x0118564d, 0x02c6af79, 0x00269506}}, Y: Field{[10]uint32{0x02a44ae4, 0x0155d7cd, 0x0252d63f, 0x0389487a, 0x035548fe, 0x0223d1d7, 0x03e1af36, 0x01aadf2b, 0x00c1cb10, 0x002d9852}}}, + {X: Field{[10]uint32{0x03accae0, 0x012e8447, 0x0333748c, 0x0031692e, 0x023c8b35, 0x03c1c7f4, 0x01d94ce4, 0x009ea307, 0x02661395, 0x00023aa5}}, Y: Field{[10]uint32{0x0262b945, 0x03cd28c3, 0x038e955a, 0x02fa73c3, 0x0335b783, 0x02e57175, 0x00e7c0cf, 0x009e0b89, 0x02bbc8ee, 0x001883be}}}, + }, + { + {X: Field{[10]uint32{0x03accae0, 0x012e8447, 0x0333748c, 0x0031692e, 0x023c8b35, 0x03c1c7f4, 0x01d94ce4, 0x009ea307, 0x02661395, 0x00023aa5}}, Y: Field{[10]uint32{0x0262b945, 0x03cd28c3, 0x038e955a, 0x02fa73c3, 0x0335b783, 0x02e57175, 0x00e7c0cf, 0x009e0b89, 0x02bbc8ee, 0x001883be}}}, + {X: Field{[10]uint32{0x0190b632, 0x00c4c768, 0x01ab9a29, 0x008e92ad, 0x0263cf2a, 0x01556760, 0x0266df31, 0x003367ce, 0x03717622, 0x003097d8}}, Y: Field{[10]uint32{0x009590cf, 0x02fcf5bf, 0x03a1d6ee, 0x03fe7809, 0x000a9f04, 0x020275e6, 0x01049903, 0x00a1ce62, 0x03ede94d, 0x0014c553}}}, + {X: Field{[10]uint32{0x02a06f5e, 0x0102d659, 0x0037021a, 0x0145ba82, 0x02a34192, 0x0098edc5, 0x03b0d421, 0x0094eb0d, 0x00fbea14, 0x000e0ec9}}, Y: Field{[10]uint32{0x03c6e772, 0x03d1e1b4, 0x02b04089, 0x01d2ee30, 0x01e8f6ae, 0x013a9686, 0x00f566d5, 0x02e88113, 0x006ac4ed, 0x001533dc}}}, + {X: Field{[10]uint32{0x0066d561, 0x032cedf5, 0x00b4de2c, 0x0370c65e, 0x000c7b55, 0x01a21513, 0x002d82a5, 0x01aeacfa, 0x01fe3cce, 0x000aa7a3}}, Y: Field{[10]uint32{0x02e76373, 0x0333d494, 0x02182f96, 0x03b05e80, 0x035e01ea, 0x0022e5b3, 0x007b5ad6, 0x01947eeb, 0x01a5c16e, 0x000077fb}}}, + {X: Field{[10]uint32{0x0238a136, 0x01d70751, 0x00195c79, 0x038cda0e, 0x002b0d1c, 0x01835e43, 0x01e59c6b, 0x03b5b5e2, 0x02d03e02, 0x0039a10c}}, Y: Field{[10]uint32{0x006c2584, 0x03460423, 0x03336aaf, 0x03af6cd5, 0x032e09e3, 0x02807991, 0x012a7303, 0x01699893, 0x001398e3, 0x003296f9}}}, + {X: Field{[10]uint32{0x03cf2dce, 0x026d0236, 0x006c0213, 0x00417077, 0x0068114a, 0x00bfe660, 0x009e4c99, 0x018862f5, 0x014292e4, 0x0025798b}}, Y: Field{[10]uint32{0x00c86594, 0x0377f7d6, 0x0120e62b, 0x0180dc13, 0x025e7b30, 0x010a354b, 0x03a26e2b, 0x00a1d460, 0x0184296c, 0x0001ada0}}}, + {X: Field{[10]uint32{0x02e8c10c, 0x021f1105, 0x016807ce, 0x017ce46f, 0x03b47298, 0x01cc1b9f, 0x02fbdece, 0x0170a83b, 0x0159e2fe, 0x000e5775}}, Y: Field{[10]uint32{0x01fe638e, 0x035b64c1, 0x0122cbc3, 0x0013719a, 0x034c909c, 0x03fe9389, 0x0013e87a, 0x00ab1741, 0x00d4b459, 0x003f58b7}}}, + {X: Field{[10]uint32{0x038be384, 0x034c810f, 0x036c3e8b, 0x02b68c76, 0x0271ec0a, 0x03f7bc1c, 0x01ad6c94, 0x00f86c94, 0x00a42be6, 0x002c8de4}}, Y: Field{[10]uint32{0x0319880e, 0x0291cf7a, 0x00b58d10, 0x03d0527b, 0x0117f004, 0x02a07e51, 0x0150f88a, 0x017b6fa3, 0x014919d5, 0x003f1ada}}}, + {X: Field{[10]uint32{0x016c14ef, 0x01936c83, 0x03c8f516, 0x01d41be4, 0x000858fc, 0x03b89920, 0x02eed5be, 0x01772e7d, 0x02dc3552, 0x001e9452}}, Y: Field{[10]uint32{0x033fbd13, 0x00f861c2, 0x0224f7ad, 0x03dcaa9b, 0x0329beae, 0x0323d70d, 0x017f0b94, 0x039363a2, 0x01fed152, 0x0015bb74}}}, + {X: Field{[10]uint32{0x017ec94b, 0x03c14f42, 0x01c2dff9, 0x02472356, 0x0127ed70, 0x02b9a060, 0x02215aa8, 0x03bfb47b, 0x03cb7b4a, 0x002c844e}}, Y: Field{[10]uint32{0x007831ad, 0x03efff1a, 0x010fdbd5, 0x002c8d5f, 0x03094322, 0x01532d3a, 0x01a0b534, 0x03b9cc41, 0x027399e8, 0x0024efa7}}}, + {X: Field{[10]uint32{0x036d65eb, 0x0118f413, 0x021524a9, 0x01dd5100, 0x035a9910, 0x012423c8, 0x028ef3bf, 0x0364363a, 0x01584325, 0x0007b87f}}, Y: Field{[10]uint32{0x0122941c, 0x00dae497, 0x002b11e0, 0x03a618d6, 0x02ca32f4, 0x03d0bf3e, 0x03ab9fc4, 0x031cf073, 0x0091bdd6, 0x002eda4a}}}, + {X: Field{[10]uint32{0x03a6257f, 0x01499165, 0x02c40b80, 0x02c689e9, 0x011873c3, 0x02c1f9e2, 0x0024274a, 0x013c9699, 0x01c8e1f5, 0x001c7a4d}}, Y: Field{[10]uint32{0x01b1e582, 0x005d1874, 0x00f7a5b2, 0x015033dc, 0x02ef2523, 0x01eb8a94, 0x02d86ba4, 0x008944f7, 0x0259f47c, 0x001e364f}}}, + {X: Field{[10]uint32{0x0236cb44, 0x02543bc3, 0x020191f1, 0x01b23728, 0x01617e8b, 0x0220cd5f, 0x0058fd0d, 0x02aaa2f0, 0x0234d38f, 0x00055455}}, Y: Field{[10]uint32{0x03495a68, 0x02bd1947, 0x001e5329, 0x01d7c083, 0x01a8c371, 0x0118c817, 0x030e3f0b, 0x0148578d, 0x03c75557, 0x002ad3ff}}}, + {X: Field{[10]uint32{0x01ca950e, 0x0211c91e, 0x03bacbf0, 0x01d8aec4, 0x0139e015, 0x03b8b118, 0x02f8be79, 0x02572b14, 0x01ca4ee7, 0x002af114}}, Y: Field{[10]uint32{0x029490d2, 0x039f6326, 0x013ec07c, 0x00033a95, 0x02526840, 0x00b24515, 0x01dfb80c, 0x0029676c, 0x00befe82, 0x002b89c6}}}, + {X: Field{[10]uint32{0x0027bacc, 0x0251841d, 0x022e151f, 0x019374b5, 0x029e7331, 0x0163712a, 0x0358eb09, 0x014804d8, 0x006446bf, 0x000ef1af}}, Y: Field{[10]uint32{0x02d6fda6, 0x00cff57a, 0x02b4714c, 0x02948a2f, 0x03d71b75, 0x01b5b00a, 0x0362ee22, 0x030c1736, 0x00c07176, 0x00238c17}}}, + {X: Field{[10]uint32{0x039a9787, 0x01db313a, 0x0168092f, 0x02056566, 0x0189bdde, 0x02f4de23, 0x0269716b, 0x028181d1, 0x01faef5b, 0x00374d89}}, Y: Field{[10]uint32{0x0244a573, 0x01a34031, 0x0395937f, 0x0260a20c, 0x02941461, 0x0115cc72, 0x01a25010, 0x00c35187, 0x03a3520e, 0x001e8623}}}, + }, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go new file mode 100644 index 00000000..051b8d1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go @@ -0,0 +1,113 @@ +package secp256k1go + +/* +import ( + "os" + "fmt" + "time" +) + + +var ( + pre_g, pre_g_128 []XY + prec [64][16]XY + fin XY +) + + +func ecmult_start() { + return + sta := time.Now() + + g := TheCurve.G + + // calculate 2^128*generator + var g_128j XYZ + g_128j.SetXY(&g) + + for i := 0; i < 128; i++ { + g_128j.Double(&g_128j) + } + + var g_128 XY + g_128.SetXYZ(&g_128j) + + // precompute the tables with odd multiples + pre_g = g.precomp(WINDOW_G) + pre_g_128 = g_128.precomp(WINDOW_G) + + // compute prec and fin + var gg XYZ + gg.SetXY(&g) + ad := g + var fn XYZ + fn.Infinity = true + for j:=0; j<64; j++ { + prec[j][0].SetXYZ(&gg) + fn.Add(&fn, &gg) + for i:=1; i<16; i++ { + gg.AddXY(&gg, &ad) + prec[j][i].SetXYZ(&gg) + } + ad = prec[j][15] + } + fin.SetXYZ(&fn) + fin.Neg(&fin) + + if false { + f, _ := os.Create("z_prec.go") + fmt.Fprintln(f, "package secp256k1\n\nvar prec = [64][16]XY {") + for j:=0; j<64; j++ { + fmt.Fprintln(f, " {") + for i:=0; i<16; i++ { + fmt.Fprintln(f, "{X:" + fe2str(&prec[j][i].X) + ", Y:" + fe2str(&prec[j][i].Y) + "},") + } + fmt.Fprintln(f, "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_pre_g.go") + fmt.Fprintln(f, "package secp256k1\n\nvar pre_g = []XY {") + for i := range pre_g { + fmt.Fprintln(f, "{X:" + fe2str(&pre_g[i].X) + ", Y:" + fe2str(&pre_g[i].Y) + "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_pre_g_128.go") + fmt.Fprintln(f, "package secp256k1\n\nvar pre_g_128 = []XY {") + for i := range pre_g_128 { + fmt.Fprintln(f, "{X:" + fe2str(&pre_g_128[i].X) + ", Y:" + fe2str(&pre_g_128[i].Y) + "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_fin.go") + fmt.Fprintln(f, "package secp256k1\n\nvar fim = XY {") + fmt.Fprintln(f, "X:" + fe2str(&fin.X) + ", Y:" + fe2str(&fin.Y) + ",") + fmt.Fprintln(f, "}") + f.Close() + } + + println("start done in", time.Now().Sub(sta).String()) +} + + +func fe2str(f *Field) (s string) { + s = fmt.Sprintf("Field{[10]uint32{0x%08x", f.n[0]) + for i:=1; i= 0 { + nonce = newRandomNonceNumber() + } + return nonce +} + +// Sign sign hash, returns a compact recoverable signature +func Sign(msg []byte, seckey []byte) []byte { + if len(seckey) != 32 { + log.Panic("Sign, Invalid seckey length") + } + if secp.SeckeyIsValid(seckey) != 1 { + log.Panic("Attempting to sign with invalid seckey") + } + if len(msg) == 0 { + log.Panic("Sign, message nil") + } + if len(msg) != 32 { + log.Panic("Sign, message must be 32 bytes") + } + + nonce := newSigningNonce() + sig := make([]byte, 65) + var recid int // recovery byte, used to recover pubkey from sig + + var cSig secp.Signature + + var seckey1 secp.Number + var msg1 secp.Number + + seckey1.SetBytes(seckey) + msg1.SetBytes(msg) + + if msg1.Sign() == 0 { + log.Panic("Sign: message is 0") + } + + ret := cSig.Sign(&seckey1, &msg1, &nonce, &recid) + + if ret != 1 { + log.Panic("Secp25k1-go, Sign, signature operation failed") + } + + sigBytes := cSig.Bytes() + for i := 0; i < 64; i++ { + sig[i] = sigBytes[i] + } + if len(sigBytes) != 64 { + log.Panicf("Invalid signature byte count: %d", len(sigBytes)) + } + sig[64] = byte(recid) + + if recid > 4 { + log.Panic("invalid recovery id") + } + + return sig +} + +// VerifySeckey verifies a secret key +// Returns 1 on success +func VerifySeckey(seckey []byte) int { + if len(seckey) != 32 { + return -1 + } + + //does conversion internally if less than order of curve + if secp.SeckeyIsValid(seckey) != 1 { + return -2 + } + + //seckey is just 32 bit integer + //assume all seckey are valid + //no. must be less than order of curve + //note: converts internally + return 1 +} + +// VerifyPubkey verifies a public key +// Returns 1 on success +func VerifyPubkey(pubkey []byte) int { + if len(pubkey) != 33 { + return -2 + } + + if secp.PubkeyIsValid(pubkey) != 1 { + return -1 // tests parse and validity + } + + return 1 //valid +} + +// VerifySignatureValidity verifies a signature is well formed and not malleable +// Returns 1 on success +func VerifySignatureValidity(sig []byte) int { + //64+1 + if len(sig) != 65 { + log.Panic("VerifySignatureValidity: sig len is not 65 bytes") + return 0 + } + //malleability check: + //highest bit of 32nd byte must be 1 + //0x7f is 126 or 0b01111111 + if (sig[32] >> 7) == 1 { + return 0 // signature is malleable + } + //recovery id check + if sig[64] >= 4 { + return 0 // recovery id invalid + } + return 1 +} + +// VerifySignature for compressed signatures, does not need pubkey +// Returns 1 on success +func VerifySignature(msg []byte, sig []byte, pubkey1 []byte) int { + if msg == nil || len(sig) == 0 || len(pubkey1) == 0 { + log.Panic("VerifySignature, ERROR: invalid input, empty slices") + } + if len(sig) != 65 { + log.Panic("VerifySignature, invalid signature length") + } + if len(pubkey1) != 33 { + log.Panic("VerifySignature, invalid pubkey length") + } + + if len(msg) == 0 { + return 0 // empty message + } + + // malleability check: + // to enforce malleability, highest bit of S must be 1 + // S starts at 32nd byte + // 0x80 is 0b10000000 or 128 and masks highest bit + if (sig[32] >> 7) == 1 { + return 0 // valid signature, but fails malleability + } + + if sig[64] >= 4 { + return 0 // recovery byte invalid + } + + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + return 0 // pubkey could not be recovered, signature is invalid + } + + if len(pubkey2) != 33 { + log.Panic("recovered pubkey length invalid") // sanity check + } + + if !bytes.Equal(pubkey1, pubkey2) { + return 0 // pubkeys do not match + } + + return 1 // valid signature +} + +// RecoverPubkey recovers the public key from the signature +func RecoverPubkey(msg []byte, sig []byte) []byte { + if len(sig) != 65 { + log.Panic("sig length must be 65 bytes") + } + + var recid = int(sig[64]) + + pubkey, ret := secp.RecoverPublicKey(sig[0:64], msg, recid) + + if ret != 1 { + if DebugPrint { + log.Printf("RecoverPubkey: code %d", ret) + } + return nil + } + + if pubkey == nil { + log.Panic("ERROR: impossible, pubkey nil and ret == 1") + } + if secp.PubkeyIsValid(pubkey) != 1 { + log.Panicf("secp.RecoverPublicKey returned invalid pubkey %s", hex.EncodeToString(pubkey)) + } + + return pubkey +} + +// ECDH raise a pubkey to the power of a seckey +func ECDH(pub, sec []byte) []byte { + if len(sec) != 32 { + log.Panic("secret key must be 32 bytes") + } + + if len(pub) != 33 { + log.Panic("public key must be 33 bytes") + } + + if VerifySeckey(sec) != 1 { + if DebugPrint { + log.Printf("Invalid Seckey") + } + return nil + } + + if ret := VerifyPubkey(pub); ret != 1 { + if DebugPrint { + log.Printf("Invalid Pubkey, %d", ret) + } + return nil + } + + pubkeyOut := secp.Multiply(pub, sec) + if pubkeyOut == nil { + return nil + } + if len(pubkeyOut) != 33 { + log.Panic("ERROR: impossible, invalid pubkey length") + } + return pubkeyOut +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/input-hashes.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/input-hashes.golden new file mode 100644 index 00000000..445d849b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/input-hashes.golden @@ -0,0 +1,14 @@ +{ + "hashes": [ + "66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925", + "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "ae1d9ccf7ce3717a9aa3316c6b7850d0a85bc0466bc1b572545f90ccf1b59130", + "a4cfaddadceb816c4dad0a10d933a1880f9b47b9f943ca93b91cc3a046567fda", + "1d93be8a70df9e7450a0ce98231c58d7353e025cd1e9db32a00c2fd0a1643d96", + "a0c10151fc212bc313332c58aba5e19de1d6787178613819ff8dc6db270c66fc", + "fc54b1c9039285084cec65510329331a82397afff54706a9ac611b95c933f783", + "621484cec82cca5d8fb163d80c361ddf7320913fb294a3855c3e4db60440919b", + "b780c445c161b65c3dc1046cfba900161fe8a5f644907995b077f1afd231b230", + "4eefdc2b82e79d98fd3f323b5c284a1c35f4a8a862d9e83c8b96cd647ca3794d" + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/many-addresses.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/many-addresses.golden new file mode 100644 index 00000000..53e251ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/many-addresses.golden @@ -0,0 +1,6005 @@ +{ + "seed": "d2lyZSBqdW5rIG9yaWdpbmFsIHN3b3JkIGJyZWFkIGJvdHRvbSBhcm1vciBkb2cgc25vdyBhY2NpZGVudCBpbmZvcm0gcmlnaWQ=", + "keys": [ + { + "address": "2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP", + "bitcoin_address": "1j3UPpqLX13rAiZMb5QqbZzBvqXptuLAv", + "secret": "e7550f33084a1b8ba935e2a943201adbea065ba9e87ae1e07c5a0b1d87ea8f3e", + "public": "024386ad78055064e65086ab69ae5c1629aca2fc7e4857261d141c181236700ae0" + }, + { + "address": "2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd", + "bitcoin_address": "18YZ63fRTaeGxyCou9f4Cp5Yfks55sMX1Y", + "secret": "cd6c5e2d56c302496009c0cd8006e9264a69606524fc7f58b45351d2cd883209", + "public": "02b7e753683d5b53b5ce1c800dbfee62594d7d3f1d5f8a2af8f9b9b6d01fac02e3" + }, + { + "address": "8LbGZ9Z9r7ELNKyrQmAbhLhLvrmLJjfotm", + "bitcoin_address": "1MKxHfTysWh6d4aUrt5mavMF5tGu3m13Eh", + "secret": "4976bba22c7f481334844d8f6c8d513c573d881f64a55981506b11dab581c39f", + "public": "038c977ea6bdef6f74ab9864cdbfa3065b5aeecfb1b9fc71f2459e3609a242082b" + }, + { + "address": "7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", + "bitcoin_address": "17hiNheV49asAtFgzznLHvvep3tKzPSeQs", + "secret": "097669b9fa165f102c4c9aa098ae3ee4ff2554788b875cb5b0aa76d225eaccf5", + "public": "021c52a4b715fc1cdc6ab6d7c8bc8d9e0ace43ae5321a07a950d63eced0b82f8fc" + }, + { + "address": "gwgdez9f3BLvQyNE5tMFS75p69zs2i3mRq", + "bitcoin_address": "1JeHyasX1sg57FyqsZT5zAeGkkzwvDCXuz", + "secret": "52d5cba120ee89ac59506d19900833e0d4d696fa56549f3f2418958791d5f880", + "public": "022e678bb9add17994fb4603914c8fa229b5c0aac6b725e24e256f6533bb185ae7" + }, + { + "address": "aSEqXrooiycfyXDc2aLYLGSmjrozJh3jCn", + "bitcoin_address": "14nNGrX2jG231u6hHESduUVaqCUYJfCaRG", + "secret": "3bd338e8674ca06431eeca83d062f17557402b88afa9daa015783e47788168b1", + "public": "038f4cbfb7b0548f53a8fe25cce2c938acbf2d17ccbea347a10872317cb5168178" + }, + { + "address": "2Z6WpR2RoBBF722hZ75ShDp1LVmojSRfAiF", + "bitcoin_address": "17hGsDUmXe6nXG6BXwM9Xe1QcqeU69zZzZ", + "secret": "d7f3f12937a4429299e67d5f916a503fdc2ba3064d89b6b39930f5265a8d792a", + "public": "0363044bd9d59c9461dddd3a0aeb5e973d696ff5f1153c1e930263244aa8066a87" + }, + { + "address": "25sH1HLTQbr1CR4uxkMFtJY2WLLwFVPqzKQ", + "bitcoin_address": "15391158MCwt86NbUKuWGXRma8rp9RdwHC", + "secret": "2c47f82501fdb00b7d47a545ab5d1e0a148c1ed6d47e8f5630091561465ed40e", + "public": "03992d87f8e40ed2e55304a05e3bf7e12c9e8713498a90acfa51c046c9746d8f0f" + }, + { + "address": "MGiD4Bg65F7bQhaKmhCLsaVKKeEFLuGgA3", + "bitcoin_address": "1JugmvsSS6z6qCuMBrQNia9jpnuYvyHRGM", + "secret": "fc7f9fb98804537752ec2d2e58618ac316e556af202294a109ddad5747b18d31", + "public": "02f4bb55716f1c7d7bd69e1f0fa7ffc50094fa348be3633a916c8da21298c2db55" + }, + { + "address": "2bYFuBzZ7QiEbpJophC2pFhQLbEFt3YSSJH", + "bitcoin_address": "1AdZUqe3sFJSPJyR6XyF3xpa1CFWzztM53", + "secret": "c8c40438a94ccfff9b2fe7150ff7a4193341a55893aad88c06f05b904bc2aab3", + "public": "0377b14de3039f77bcf3f5f4ba852a9b36eab3d7618c59c33336aa17870162d446" + }, + { + "address": "yExu4fryscnahAEMKa7XV4Wc1mY188KvGw", + "bitcoin_address": "1PvMguZUZkmt4ZRxuQWdV9eUT4Zi1yqtbn", + "secret": "ccf9b32c1f573a7e1cbdaefb791e515847e857fa6e44a42a4bcb396c5e5e7544", + "public": "0399e8ac882b086491e424a04cd8289e340a5cf132c74950659bd21262db5674a7" + }, + { + "address": "23GxEvPcy5vFPuzuP8o3PBag3HgQdoaWyXb", + "bitcoin_address": "1EE46EfqpsHavQJU516v51ADpTjnybFWyv", + "secret": "815d3fb815e4cc29c5e17acd597c570a8f1f9108ae955c01fd756ba5564bba4f", + "public": "0370dc9f523c4bef8697e87a59cc6c54f4e89d513a8bf08b1cabab7a357a508957" + }, + { + "address": "2C3JbrfoE4dSjZ5dE4hxrYCmmmrcFEGyiUL", + "bitcoin_address": "1ESPG75CWwTntHXvwCR3PhJvLgjQprixx8", + "secret": "5e01bf90d5331617a5c83afec44ce5b13dadbfc94efa58f2445ac2e9885c867e", + "public": "03761fa32c428788d875e670ad62f128da4ee70ccafc9577b6f1e3ba69a5195137" + }, + { + "address": "KE9oA24AuPzDzWBEjhGJu7PHZsQjGXYcww", + "bitcoin_address": "12V7ZzvCtW69PMNWvyZjzxkMK4Dhky2DNX", + "secret": "70a250282d1b56abffee25badeb702c2ca82650c67ffa8be526cd600007406da", + "public": "034e06e04e3c6a32ddbc25c7572343d50a3c4eedd596550ccea33aeb24410d2422" + }, + { + "address": "2KnZdRBrVkK7EyzPxFdYrAoZ17MwjxxaCR", + "bitcoin_address": "1FAZWYP3k7kFVFrV4AHKHf1ZJDpAcqNAA2", + "secret": "4627499983552fea4be50a879b5923f039959baa3af2e0699381a95507f0e6ab", + "public": "02dba9c7be5ea5668554d295027eaec51b69a582f4561d13afa8ee9004b2941b2a" + }, + { + "address": "2NGNQTdVNxZQPpBvj64ecidwXF3ZhhkX922", + "bitcoin_address": "1FWysyVBvK8SRH8fZGTfXxDCGi2ZgUnuUJ", + "secret": "76446750f1f12301fed6037803d0560c008a98a2fa34ab5a1ddaa8ff9dcd3a52", + "public": "026341de878a483526cbf90a591fe8b6fa77fa775d3dfabca8ac5be72aa83690ef" + }, + { + "address": "3sNLvvtb5wFLMhoFxhSb9FiySLGoAzNbGd", + "bitcoin_address": "1DLmvLvjk7KU56m6bF9nuFgKib7RwWLjS5", + "secret": "9f9b67cde19a83f752c9639a86ec935526e1ab8a38dd23a702686e0e9d4e45b0", + "public": "0398a29c3eb0462bb65757990a762f7e5062db04fa228168c8a308348f1ff5903d" + }, + { + "address": "2kaTspbcfCyWNatPbRNZ55Xg8zyp77rNgv7", + "bitcoin_address": "16Epeebvdgt2raLuQRWtvmHhMMNjSnVXww", + "secret": "2ef76df65020b8c65ba9c6d71dd027cac4892e7e8ff1c8b12f87a48be1e117d0", + "public": "02d16798077bb6dc624d3dbbe99c698c7b91b17157beaba72216b6d85b436a3529" + }, + { + "address": "2mcYBt3gpiYFjkTZQHP142R3NF4JZimhSzk", + "bitcoin_address": "1LfPrqrHdZWc7M97hrxurAKZ61Ebn1F9kr", + "secret": "7c2e5e465f172630375aad2b57a45b654c10a9a805f0f25b1a34ceec1b420a74", + "public": "024ab0a1303bbe5e09222c39276da19ff1f761cd1a164dabbb48e6f388a7a82f8d" + }, + { + "address": "d4vFNveNynBj56XWK4M5cHw5JGLdc9arDb", + "bitcoin_address": "1PyuRxJV6qvfPcJw8YmAwhDZXv3JRYgkS7", + "secret": "0e956d92efe55a0b6c0b4db9a2f25d370961da54295ebf45fa8cd0bf4d4c3a3e", + "public": "0396a73e38515653a2b58030489cdb85b8dd000293597eab9616dcbfe0d02892a2" + }, + { + "address": "trJzid787SDzbZke8HGGabsRJxf5UYQ24t", + "bitcoin_address": "1BGnTbzKH11z634EZChdxu8ueZSaqXuHDo", + "secret": "aa3eab38c574d811d2238f88a8db27c3973c5f3454e50224340abbb70510da2f", + "public": "037570e5c30c2cd11af39ef7cfd8d3d1d09bc9a6618fa649b484f76560f27d9fdb" + }, + { + "address": "843rtbppb1fS7GLipW2VdAJ6U3ASNYEYXS", + "bitcoin_address": "1xpBR4ujZ2VfQPjDct4cVovgiyNBrJeed", + "secret": "f700853e5a35c9993f7951b5b7c9bcba595f8a0ac6394e233fdb40c2955bafd9", + "public": "027b6f77c26d08e3ad3bed214f8bd450635c3f53879c60ad51560eb877753dccda" + }, + { + "address": "Jn8SM7bRtzC49hb5ndj8RSjbqUUUPqMj3A", + "bitcoin_address": "1C34YDP6YqjdpoGFtZveWJZKunk78DbQTA", + "secret": "dd09b66bc338c831be7d3e781345957e0b04c691cb9e3fec7104202aabc3b949", + "public": "036abfb1f082662fbe2d39ad34c9cfa4f58f57160d77a7ef997c6738ce7cc496fd" + }, + { + "address": "2BwTfjCK38ucP4UAdAX1HbzR7etZcBY6FXr", + "bitcoin_address": "1HViemK3bHGzib5hbYUAMcq6e7HYATfRPL", + "secret": "68928b66031781cc596dd42bf1234c6ae315df97791a2f96bd5c74d2251497bb", + "public": "0328b1281495e1547dc27a29fb29f4a1b66b66fb8358e126beafd76dadbc8272c5" + }, + { + "address": "2XRhzqNgRJgT6rNp1FVp2SyZfrDedjSKUWx", + "bitcoin_address": "1cy2bSeiVsFHCoADdebEvW6W3s44J2v5X", + "secret": "8800062e991bed81298c23b773050edc552390bc5d0eefa6abec0237524a1866", + "public": "020c41cb5d5294a18378f8141b7868d39c9f9c7b0ed2d5f862222a103cd9d491e9" + }, + { + "address": "o8xuJ8PVfeBCSsZkR5hoB12ooBwXJzVztB", + "bitcoin_address": "16Y42omdtrTkzByMcKs92t4pkeZcybspry", + "secret": "7a54ee9f88101d3623b81556b36922b18b6fe2bff154170322544602daa2685a", + "public": "02d8f4e328d0c04218f563ad17edf39af82dcc8b5f8d5639a6ece03239c7695d4e" + }, + { + "address": "S49fz7SUwStZvhTM7DuJfN2DKPgkb9bo5r", + "bitcoin_address": "1Abp3EyP5zS1D17vMXzvGSyhefJten2txn", + "secret": "9cd5662056a5ebfd882c63852c8bcff133d7fdec0c7c51d3cecc4b41dbb9c5aa", + "public": "02bc622382316e90b2dc4c63a6638719f710dad0024818d96a42c67bbf49f49632" + }, + { + "address": "FZRetm6mneEEkXzZTGhMfWvK4yaSo1rjf4", + "bitcoin_address": "1JLDYtnLH4CLRuSFukPKzHsCXgNenF7aRv", + "secret": "673a827dc5452987a4e944dd5edfc286f815c3fcaa7a9f219d46cfcbb56b5dd4", + "public": "03abc7caef609535b9bbec78b24c2f0944e2d3cd472021e2e714f5136b757b85c4" + }, + { + "address": "pC4nG37Nz9VWTfEXJjgSP7wKDRzNkF4bn2", + "bitcoin_address": "16vcAZM2iuGBKMR7j7eEMFAQD4qLmwfvJL", + "secret": "a76c7a8c63a7c65eedf815ec927b0ec4236944d57bd975cbe3b0ba7c15a238a7", + "public": "03e9bf477af127058244bd5ada03d17f966ae1ac35fee464347aeca568643dae4c" + }, + { + "address": "uVfk3t6iE5f37MVCDKrquUewt2KJWZJNTP", + "bitcoin_address": "1CaNfgdhquybHRcLPL74jhGiVNYNt6V9qB", + "secret": "f1fada84b0e61f65814ac2647a8e8f776fed9d07659cf5540817e712ee4d603e", + "public": "03ac4c5040d5e6c0fb9536968e4c59b826a5bcded4af44a1c70cb06c2998e772b6" + }, + { + "address": "25sESDqRTSKZbq1Z7UUykw1UxnxejaeHKNV", + "bitcoin_address": "1hRHetLTsJw5LDg8c2cu4weDV37WrotZu", + "secret": "e66fce8a4934642b40de3206937bab985279d043a5dd063e04c2718d93612d00", + "public": "024b1e68e39344b6e3857434c4929f3c0409897725ddf6b82e363446964a5a7f8f" + }, + { + "address": "agYZZqeEPpHYS2Ks9tmtbBEg6xTCYZVatb", + "bitcoin_address": "1Dh4KmJ5nKuguEaKFKhAEDYJGeR6iBRvqL", + "secret": "8b111a441d22f5bc465913e318ff99a5dfe7df5cb011c59d8197809209e47ad6", + "public": "03e36c45480e687f6f2ac25608d0b8e75ea8ada441965c927a4b15a78e3f94c82a" + }, + { + "address": "2TpoqeGL2tHKnfBzaBpD6oo3E37rA5X74bA", + "bitcoin_address": "163oYyMAPQtSvJGAaF3cSGHNSTr2up9YPE", + "secret": "09bc51ed1979b9c3011519f2a6c900762cea345aa1af5c73a2ab94054c0e177c", + "public": "021b11212bd1127d4606e48c36938a92696d115dfb37880e3e81b8d5b59171fde3" + }, + { + "address": "22y8iKcVhL9337QPXWAM5m68f9eKHcjhU44", + "bitcoin_address": "1HPN1A6spPRejMNmMY7kEd88MKvkHAWK2T", + "secret": "af7212e928b268c0c8078fe972dd394cace9551d36b6c0c60fd264542b6b5256", + "public": "02c1147a11a54d5545f696f6c5047d1571e6b432de8a57e3dff461f159f59a88ea" + }, + { + "address": "f1YscDhp9YWMEnYbPtdJE4F7yaV7GsNTPS", + "bitcoin_address": "1Ew5JhNcH4SfM4ZUCrMRQmukm9AyDceQjG", + "secret": "d8e41cba017811d71814bd36bcd31eb63fd6ee9745a3b2436eebdd2700f58bc1", + "public": "03346a3a79d5d6eea45ba3abca39284ff97d0ccd4371487d72f3b4767d70a5df79" + }, + { + "address": "nHPDziRL3wwDpe9rGsTUEocAQbyRHAJigC", + "bitcoin_address": "1ESHQBbv8LakFs8yZyKrkQfCLwz5nGj2pS", + "secret": "c1bfbcd71db2d80d2cfd1d703a2c77d218cfcf887bdc31e54c8de628b9056fbc", + "public": "038e900f336f7c079594b2932ab6a477c88c0fc15499eca290c1901408ac0f5b6b" + }, + { + "address": "bx6Z6THQsmto8ANcgNb9WGhpedQWhvKiPD", + "bitcoin_address": "1FigmshAUTuGEiVSijeuHcD2avwhP6ou8m", + "secret": "909c29237a00742601bd955e68bd816f7e7bc6dd59ce3073c29bd33d541a2bae", + "public": "037b9af02809edd2690be5816a2884c2c13b81dac4664ae9b77955c1311b270116" + }, + { + "address": "2NAfLeTNC19wof25NSBNpKGTtKt1iEZtxDT", + "bitcoin_address": "1DimUWDkvdsZ1o7sbabNT6zAoxN4fh3Vn2", + "secret": "2e9162ff3277034514612537d06bff053b0739de417887d3aff7f4cad7234422", + "public": "02210135701345e15b2aaf4deda129cd751c47e3a37911d38c9cc69c2865b69c5f" + }, + { + "address": "9L2uQrmvmgeQDYSgiPAmczWAgJTWekBG6X", + "bitcoin_address": "16DmYCm1qzc6iSazyeqC9etneg3NKXbcct", + "secret": "74e851270b94649cc8b53aa56ae2e188de32d43346a17e7e82e492dab1104a3a", + "public": "02adcb621c62eb75c79ea6436017e5d34631cd376aa8e965d760cfd8bf7f9a225a" + }, + { + "address": "8pDsA7hNgcGmugiq9SqbpBAr8LNvqXhYCd", + "bitcoin_address": "127BezA4fgvkPMqrFa6i21y7WMp1Hj9Koz", + "secret": "df3557714a662940a82c11d84663c55c8de236095c28a31b9ec1b149b0a7bdfc", + "public": "03f1ea020b8a21dcf7c6fc3540f96ff6444f121f397ae04cadf65cb057848b80c6" + }, + { + "address": "HDVGBNTJmnVeU1wY4iEiDmT4KoNoJ97DVk", + "bitcoin_address": "14GZqTYYoCBgjsW5Qi28DVFWkaVMTjTUME", + "secret": "5041f6146dd91ca0213e2df48cf8c9bd0f99c64fc8a0b64726b44fbbc5f547d1", + "public": "031a66ada2536a17a5490072f0aee3d980b13de58700d933b691d2b95491701eaf" + }, + { + "address": "28GUdCt1ACa7Rn8pN9ekxugDh1hWgiY8W5m", + "bitcoin_address": "19qEvbgVckCLm7w5UXYJDQgciMqmTGRM2F", + "secret": "a60c4ba7fdf08fd40149620ae0e8fc4286d6283269239f302407cd1281d57580", + "public": "023fecb3e413741c3f97ef44ae34a3c9b1d32bc77ec1cb5d2e0a62c61dbb336248" + }, + { + "address": "zW4yhXcYE1ehseDfsCyRJCfsT9aFJ1P7j9", + "bitcoin_address": "16pKEtLY51WXrjEQjBqNkBbhEDepzNuCvM", + "secret": "121b9d7572889ef55b0208dca8a483887c0b2058db5a891196f561210f0fddb4", + "public": "037cfcbe2648f52ff55a77fbd120797beeeb12b3dafa78ad161bcbf539dedbe336" + }, + { + "address": "8oEmZLjUnFx8DCt6Jpbyz7iNDEfgg5FwXG", + "bitcoin_address": "19kHV9G4A4CmsguoGhSsAMZnHkUiYyMJL4", + "secret": "4c3c253abc435b410fd2705af8f0f790c3eab26415e25b7209472a40d0b0d1f3", + "public": "028d7c6613d9a95c0eab9698afbc2f2429c2fc67e62380b6536421e1b4cb4cf059" + }, + { + "address": "2FxepT5DXPGNW647tuCakM4HxzLPKXA5mnP", + "bitcoin_address": "1H54gQ41cAniUvGL4pZqoCAvi3CXz39BdJ", + "secret": "a938eed62cfb072cc74404a3133c91cd2cc056ceb466c00f466e000bd466983d", + "public": "03e72d38296b249fe8104308120c09a46155d8a31abb0e1869a56c66bd3e87f7f5" + }, + { + "address": "2Rt2P1Vh4o4GK5EwfqF8ndxscxRZErTuyV9", + "bitcoin_address": "1GNU6UcVZv1JnArXL4VibCVzCbaHtY3CKX", + "secret": "ee422bd4c063752400d45bae49135f9af10fe29d20fd5eca3116377406523de1", + "public": "0314e0b4a496c865dd68c18cf89f19d8f09cfc0fd4f6e94578af99c6325e699802" + }, + { + "address": "Y1g9wuCKZjCArscCAdw2YjyWoiwv5Dgv7U", + "bitcoin_address": "1LxDdLvhdrnE2J4X1SyEbDWTfrMAHk2kiu", + "secret": "550c62a0491ad444acf71d6eae431b4b0503df53f9e495d2340f36d4da47e9c4", + "public": "032f92422e238e703eded027945a9836efad0f1007bee51e4c32b457cade288e80" + }, + { + "address": "2Fafftp7czxeoiio5bNHUN3WbfvrJPghVZn", + "bitcoin_address": "1M6eL5Q42zUC2Hhi4FmN5gpRegmEE3dRqX", + "secret": "f4a0576bbff57e5d01ca0fc14b26407325ee7f5bc5b7f5f146dee7a6cfb0a31e", + "public": "038f0dadbe3227fae1a18427cacf83a004c63c51dc8860b7028e95cf148d000d57" + }, + { + "address": "2W5K63cGj1DsvB7RkjmpM43PgajoJKemynv", + "bitcoin_address": "1AW5ekE78wrWFh18BxZMxCZ8L9cR9kC32D", + "secret": "f0f2c983402bf6273aa88b42de4f03876f7beda8f8ad4d94ff35cf1c784667b4", + "public": "02d1c067f11e13275865477cdbd4596be460eace6d76a28e2a4190869c2a2ce598" + }, + { + "address": "2JmV5HRoUcQY4qfBCfUFgg1GKSbAW24iFDP", + "bitcoin_address": "1KkL2aLDQfabSHjN3maRfDDMtPQ3bKYbv2", + "secret": "95d2a4a278f65f262f265a485d0341b5cbadfa913a06fe4ec168a94eb469c78a", + "public": "03b3856f613e7cf421e89c7ed8d9f218835bfff56fc85813a774545d811c4a1d05" + }, + { + "address": "JWyJu3N51syANQWy8CR5H8UyoM1W4zHbja", + "bitcoin_address": "1916komFWE9CkASeuJoz62Y6ju3FXv6NC2", + "secret": "40709c6b0060a61fcbbff96623330fb65bc38d193ccaaf612ad06157c5135772", + "public": "03bdf149804ccfa96942a0985132dcadba7275b30f7cecff92f36dfff4195c4336" + }, + { + "address": "atsx4Dc6dnqoJQHKPDjR6hgjjEtF7cNhSw", + "bitcoin_address": "16AFvENwh8W93C8zZ6dZdGizj1e6JM7c6a", + "secret": "c4e95cc86105d81321c5d7c5d93f7ca9956511e621ebe0a92a18e36c333922e9", + "public": "0314ab127f4fc734f7421a4e470f8bd763f6c63c6bd7e27644a0964f50fb736a5a" + }, + { + "address": "G6TVGZhGKttfCybksiQ77EYuQ6QUuXVsFs", + "bitcoin_address": "131bJvqnppb6X4X5DEYb9169oFn6RkY9xc", + "secret": "5a1e028796d742347c7f17c2cabbcafc47c5d8fef5c34e31bcfa012cca8bb724", + "public": "028f2dc1e3dbb4cd78cdfec0a0a9d8e88d4f7d3a231530136030714b5c82040c2a" + }, + { + "address": "tnmiayXaehMjUutwQiMnjfwumiJii3Negi", + "bitcoin_address": "1UU6TZr6szRyJT1kBaMYuTzzH14WJXjst", + "secret": "ad96aca0144c11368637c0a0c204cb54812d2e6e401c35b414ac3b8e020a3d56", + "public": "03aa85be4ad8bde40cdd03f1733cab365ffe8645ac8860c13f8ee98eee7f587a47" + }, + { + "address": "qKBvbpxDrCC13fJih6z786gYkCMfPr4yt9", + "bitcoin_address": "1GWGSkcfBgHtQQ8ihw7h8cssNSA47Gvz1f", + "secret": "e62bcf14a9c22421cf790b112a49a41d292abf8f957c595d1604fe242218617f", + "public": "033fb1376285345ea5d55f282239c9ebe6a34b0bdcc2a24fd7e50f2dcd7a9f0323" + }, + { + "address": "2Q3fiiv1VnZq52EXRegs7Zm2uNuN1VqYEr6", + "bitcoin_address": "17kgPA8Dj3krYkdQpEsfMTzz7vdZQ6eYyV", + "secret": "402d0cd54cf447d0d1a6edce5b363f6d052ac923ac07880261ab1966323970f3", + "public": "036491f6619e034c7031284cd222785b9ee0873f20019e49eb80e599423050a4f2" + }, + { + "address": "2XTfvKh4sjavjxWzUpun2aEioprqmjy8DRg", + "bitcoin_address": "12PuJiPsnXmLgeJA5D4YuDxuQdJ74S81Di", + "secret": "4dccf074e0c8e4d01fb29a41da3b05acea13693c0d83ccef456f78493787de7a", + "public": "023c992a18276d82533dc77c0d12f65668083a75f9b4b8963fc1284f34b1bfd6dd" + }, + { + "address": "rDdVaVDJhB1idZHPXbQ3PmDFV1ieXp51hq", + "bitcoin_address": "1ASAAsauwboSn6QPtxbCmfUwWYtTZf4Fhc", + "secret": "2fa5575b7df071950d930de9c9e00adfc8d7e41ae4e7731296b938874c4d324f", + "public": "0252de761de10cf981f0cec0171f713090944a85970cc911e35433427991e5381c" + }, + { + "address": "5MyhUZ9JkQ8nNh11JManWvm8btNEmBDHm9", + "bitcoin_address": "1HnMysqfVmUEWZmZSCgxVL8m4CaqieoBeA", + "secret": "12be2aab0d9b3556254e6ac9ec5480f9eeee5a9e9cd48d4ee5b26863cde25694", + "public": "03d0325101940bac1762da47ed2a30916fb381a461474ed6611afaed556d32836b" + }, + { + "address": "2faGziNRteqfmS2iT2JHrqg3DGJCr7bwPuf", + "bitcoin_address": "19otXo9qS94KLQ5gYcmcxSogR95cWXBMHJ", + "secret": "d90f354a51fccdb09f854300ad60d85999062cb716b1f3e8ad706b20e99f6571", + "public": "03637c8155e9858f168a15283d0804840e01b02654ab30dc7505fdf88d7aa88ae4" + }, + { + "address": "s6nvRxY2XmgzUNxHPhpvZWL7KxgXHjpeEx", + "bitcoin_address": "12mZpjy6FfcpJmP5eF14ANUCF1P2FrMBzy", + "secret": "caa73fdc76cecdf09c278d82eda4ce9ff40c297580dcdc191a4bd43ac0804d53", + "public": "03af813f6b8137f46ba8b77cc9f1cba50f93689ba7ce5498a7edc59a0e3314c6c4" + }, + { + "address": "i4NJfp663DS2BKoZqRrwZWyqJmhV49rWVM", + "bitcoin_address": "14P5UJAtdVNrYbjuMwnDARjia4UrVe2zrb", + "secret": "5becbb9a2f3dd5ddfe991b5d8d4c7c2d578ae4d612e92fc64fe902a4233a1ee1", + "public": "0237fa3963e2fc18f0f29e323ce3c01a7ec26550a4e17fa5dfbdd748d4a0a9e116" + }, + { + "address": "fcvhLM6vswQ1Gv6TjSjiadS6zoE7zDshJa", + "bitcoin_address": "1DJaW9bXmv6w9EYWzqxQeDHFvak3WQH6Fh", + "secret": "3dcf4be5fbd7fcec93f17a2a07854e902396f8ee7f0ee136633520c00bf8f26a", + "public": "022c509d2fa07aa98b90d4056497822853c53115f519eef7560aa0b08504c59a73" + }, + { + "address": "nfSyJEW2ABm9W8vEQiRsrWEiFu7t68YkYc", + "bitcoin_address": "1CwcAVRncdFFNb5xkF3a3E4yXo3mw6q2vZ", + "secret": "26e4d66a9d8a84b8bb249179d360817f042b065ed4f6dbd88ced895efdd660d8", + "public": "025898ccdd8f913077758d97d7dff8704eecbfcdc9d6ed6aac6e46884aeeff1b80" + }, + { + "address": "bQB98uNcaCJXWWeGr6x6xrGq5NMzbSfw7B", + "bitcoin_address": "1F4jbZomxCngjKtyacX3CjUgTzqT846MNi", + "secret": "e01f466060b0a3ed01a453362d3ffd0f0612ae7dd8f9b5c1d23f3e5df7cc40c2", + "public": "0361f9eb0b245e30d44fe15780b06d67f04d1c175f2ee155e6028a14f6dba72864" + }, + { + "address": "242BmWuosWU4Sj5e3kvDQ6ibvzNqZUzZ4de", + "bitcoin_address": "1CYPuZNRBMWFMTJ5frd4LkpPkbbRoJz1mg", + "secret": "4730bf793535f544e4c3abe6d54921801305850f769cbcb64bd65f76da1928fd", + "public": "02f311980d0636ff8fe655b6a695d6214fd09d02d03ba426d1da42dce5585802e2" + }, + { + "address": "26BWqf1QCBxGUdnbuonjWRi27LVVLmab2Z3", + "bitcoin_address": "1LnHo2dDwVWs4bYw3tLewRXcZeALX2EuvL", + "secret": "ea4b5510b9a4fbac1057012004999622d16b0e8b89cadce161ff1196cdb5cd17", + "public": "02080ce1982679c7cc351d36a4f4d4725bec9167c781df0f93de7a63d02117eaa2" + }, + { + "address": "MLXZvSFYD2Q3ST9hWHJK4wgMmoSCBW4cvi", + "bitcoin_address": "1D3n6eSbrcV5QmgpUHmnwthwrqQvhmofg9", + "secret": "fb0b97b8fcd171b41fd436b8b513794adfda84fdfd2c6f472a40380a49508462", + "public": "0314787b7d974e093a356713a5be01b14586351a91464f8762ed179290e1324f9d" + }, + { + "address": "wdVZgcdoPVpdEhAM5SBQ4gm3aZQU5rbCjm", + "bitcoin_address": "163UEEWapbBDtGb3gdpSLcQNA4kdzNskWe", + "secret": "4f6c7aa166ebedcf651b11804a969cb0ab939b1bea36bc0c7ca50f0bcb208798", + "public": "03876a421f40c2fc8c6aabc3e4449f882915c2ab5a1d15b5c3329c46e61e417508" + }, + { + "address": "22z6getjDD2GNjXZqe8tHjt5ypjutAEFoLo", + "bitcoin_address": "1GSCqSuMkazX4PfHVVZ6a1YWy28aeUotfc", + "secret": "0f3d5966a4dc8b6dc64a338e16de058728c1cf2c3f839b3cb05931bd1745eec6", + "public": "029512639e507dcccabde5d47fc5e8a4a95e222c86f5b62bf210329aec935a63b0" + }, + { + "address": "2GEFesXK5Uv14hn5Bmqwd61c1CCQGMvbZLh", + "bitcoin_address": "18i3Vn1UzMgmnCQZD4mAYB8ezKm3ADU8pJ", + "secret": "4cf001cad4d96d2f2a43089246a1c756e1c23729d1d024f5d332de17e7800c53", + "public": "03045c57e07f9a97d650fe10bf7f3fee1ec1fcaa706e4d7438b5dab09198b840a0" + }, + { + "address": "24zxvoEFNb6ww8zDnchMsqdBoJuBL2t6LQD", + "bitcoin_address": "1JH8qQvT6NUHFvr4mUs1rGPuFVB5JawfkG", + "secret": "fdae58716ebdc041a3a15c70b829af15f13560a371f57086a9f44f3a0faa772f", + "public": "025b943230dcdca2a78d9e2ef9b655c310fcc1bbe6493f05f5cb685b8fa4c570b8" + }, + { + "address": "2F9PfKBjsUMEViRoM1jKAG55T1fSu6hg1aU", + "bitcoin_address": "1AAvkQnBSuEavaJVzxLEXY1XnbnyDKE5X1", + "secret": "219b0e3e367bb102d9e221b3f9505fb808bc086c9bd39d85f3043d59a0b858e4", + "public": "037cd54ab5c37e03c911ee05f7a06dac32bb55b5a18c8c51a2098905ee4f4d2731" + }, + { + "address": "k6s7miNx1cnYVEgUPQD2iqufKzQpRDmzQ", + "bitcoin_address": "1LrScMjMviVreWzYAHMV5BeCjXjAiBAwz6", + "secret": "ccc0b397cada9ce4237a0a99697ade6adb57902cb30b7205c1572c377b34b778", + "public": "037bb2652a57a019ba2409b589522ef8a469a140537b33550e161676c0ba609fb4" + }, + { + "address": "S8kVNfBsuRPY8UcwVC44L4JmHF9c2vdoz", + "bitcoin_address": "1JVdwdveXbUjPHVv6xjGJbic382K8cPjtS", + "secret": "02a608c34f19e5f5d48eb3779bc61997c6228d6a83d32ffa21cc5e00c0c66a63", + "public": "0264d8c516969cbe5bf6882187105c72e33c44534203c935cba5bceda4875bd48b" + }, + { + "address": "2ELFHvS8iJs7g9hAYmSQ4d3fPkHPZ7GSYb2", + "bitcoin_address": "13Di7UWLrbjQFJDEad4xKZ5ZEBxrc3q4gL", + "secret": "c4d7f23d8df026b38083120e820bc90150557567591f16891de724d1cbef936c", + "public": "02773b43ebe9825f49ffbf9869a63870427c0a2d952e259fb6f14d177100fc918a" + }, + { + "address": "hVeQGNagmE3VdB8FAipt4Ya792T7JhXruJ", + "bitcoin_address": "14YLogirqihw5cM1heNwXxaTmfeiCmqL65", + "secret": "4197e0ecf350e45e082214b47e17284ecfaf1fea454032595b143a0d89d79aeb", + "public": "037e25ac47ca505d157eb26196263b1747e71548381130bacdf8688c0f31e29d58" + }, + { + "address": "2gzCB5wvkKAAjind13d6r4oSm2wasV4aTjA", + "bitcoin_address": "1DHcv7n14Nz6cJ2yvEDMbWysbPbBeQ2XYi", + "secret": "9e7cdb5242980b321a79f4247362d34c0df1552dcacab20f8dc831c06d4687a1", + "public": "020b81829cd7049a05c9403d9243247b62099a7373b5687300c4f05a3d6996522b" + }, + { + "address": "6DhQZL3HQG1Ai4pH9c72G2Svy2ELaozDpH", + "bitcoin_address": "1MrnzuYjAAke1byoXSVZuV9ssfHoBZWxhP", + "secret": "ea67b633edf994dae447cfbf50852ba075be004e23f4d99962317c62d25be769", + "public": "03e11ab39dadfac039500dd103f7f466b266a08e69ab2b3b0990b620720bafebfe" + }, + { + "address": "2Tw4op3FCi2aXuSySqPEkxUxAVHCi8Wyxwp", + "bitcoin_address": "1GDM5RW5ZYrP8kf8f1B9pJc3k2UJbNSFFk", + "secret": "9a921268064f24b0e07d8740b72cfc658ca198dfe2af0b373ddf643dba4de755", + "public": "02aba206211ca5a9eff06f96823d3214dd21b2b7456de48f7fe51ffe4f7b7074bd" + }, + { + "address": "2apYHtvxjoen5tFVrb88XkjPRHp61bnMmYF", + "bitcoin_address": "1PWLA1dvKNCJiy99VZZLZ3mdRHhnCphKNz", + "secret": "7828fe7605bbbf70fc0003d04ec85a860376e8d1d8ea13fda2079be6b11b5c2d", + "public": "02e717897f6b0f94f69a393f895c9df2da0e45d895cddbbe95256f6ae0c433c7fe" + }, + { + "address": "1NdzQhMertw6PGza5eSxqfWMhMjGhbYszx", + "bitcoin_address": "1NH5p91t8ddF2zs2QyxkSzk1fnKzQbLKWd", + "secret": "6f539af4e8b9001e591421e2830a3a2508dcb1637f46203e5a80fe84a9952a9b", + "public": "0263b7563c486dcc9ab1f0d46a5c10ceae652339c353031296c9f1d7deb3fd2683" + }, + { + "address": "xQgKsD9dAHf3NAazojsQ8WYzbaAyrJZeVy", + "bitcoin_address": "1LikCz6dBh6La9PAJNr2HQLarN1mNVS5U5", + "secret": "ac07ce6a66f23f5ecfd0e0d983297e18a945730cf653405029c2e94cc7975ad6", + "public": "037104e7bbc30d57f60ce85bd56b19ad72507079dbb9befeb524bec6c6f6b35f8f" + }, + { + "address": "2SShMG5rU7mJ7v6wsjtFYgxrNB56P3cpdrS", + "bitcoin_address": "16JWLGfob4h7rkab4gfN2eY54eJbff8bN5", + "secret": "4a59d42ba0cf18052321f70d008820256b790ca132461ec0bbbdbe1e03bcab40", + "public": "0321b0224eae60e8518343b6cc8ac9943561edb276bfc468aac589eed9e1044415" + }, + { + "address": "M6JKu4bqGgnJ9ZFuodqfxdzN7Y4q6yoDYZ", + "bitcoin_address": "1tVysubyBJsWU9bBo44hpazBnNA8ZjcgE", + "secret": "dd8a0861ba597070c6d3b43be005e764dd2960bd12ba86baaec4c914132eff60", + "public": "03b046f7c69dee941ebdd54498386338bc2378ae983c9d6b949e3019205dcc7be6" + }, + { + "address": "21vVXWwfSgmhVjMZKzRqQphhHWJhQN9PDmy", + "bitcoin_address": "19sJ1KvSam3r8wEKE51v8BSnarudqShP61", + "secret": "29d4bc0900ad68a07c4d4678f9b75155fd06aae8d8c96637a75cce4f2cb332ed", + "public": "029b294458e653d166fddc0f96898b19b74b7ef9f5372c722ac159dcdd7a633557" + }, + { + "address": "HPju6EpzFnWijK4YF2PKhGw36zpC5MTPqc", + "bitcoin_address": "1PQrKCXpDTNrZRsLyfAnAtwrTWEnqyK11K", + "secret": "c1a77068a552a8183a634ee9aa117b21cb9c9d3d71bf885f747cf45a109f3bb9", + "public": "03b13f40cb83bc0fe2386b36ce0fa0c4426ebe68cca13d969951e019539aaa67dc" + }, + { + "address": "B4X6nsN8LUFZnyzPU3xuVJvJseVy5QFywn", + "bitcoin_address": "1J6hEXert9rx3c9gTJHdUT4r8fvbL9DiyV", + "secret": "5eb166ba3ca4da3353078eca2ca23fda60698388b37f860456a84a1317c669d5", + "public": "020d49986dc4f72bbf500b1d334570fbe96938b51b659f2628f51f65a8211e3afc" + }, + { + "address": "rA8hZGYDhU6mpYdXvwJwdMkCijiGHxGG22", + "bitcoin_address": "13HUY4XQUBmomzct2RfGaJc3UWBUPfcr2w", + "secret": "d8e8829f9729315b9ba98dc56e4aad0e85464b9f6bbb4728f705c1c40414177c", + "public": "022764a5135d53da5c995b93ec79259ad4895d0252f61020f9244914957ec4e67b" + }, + { + "address": "fHnsaH3e5F4iMSAaRBFdDvNuEXWMiG4h6z", + "bitcoin_address": "18YoUTZrv5tTuaUtSrmvCVKS1ujFxzHyH8", + "secret": "01897cda7e654eaa1204a88bdd0cc1a3c97ead4a56d5fdf0392bea2e5e188146", + "public": "03f1ff4bbe86bcd2b9a352f886df871b09b2cdd0820db6ec12473a620e3ab40cab" + }, + { + "address": "NpcgbvncaoAW2TZDbLvA3SgRBKGKjFBnss", + "bitcoin_address": "1DmzLxwsr1K7smUD4ShGpRB2dYavZxNqPK", + "secret": "afc18ea7580c9563bac4fad5408e27bed5fa5c3b48f72b71de3771e4f4daa9e5", + "public": "02401f34ac31518444750a1aec8aebbb98396a788bcee54235c62cc8c7f1855d38" + }, + { + "address": "7mZibtJzH5BV7nTsk2L2E8ybPJQzXgsjjY", + "bitcoin_address": "1FsyyxNVWvSczCiona9aZFkRMNZeuY4L52", + "secret": "4f8468222e72f899d3eca4bb752e46338430df815ff32dbea405077a970a42a3", + "public": "033c5e16a1857eb18cbdaa0760defc375c11c7a990f22947b32f603127fe8fec81" + }, + { + "address": "rTrV5jQZ1116ubbxqTD3r9VVgd9bRausbm", + "bitcoin_address": "13DVjXhc4LhdYQR5bCZoR5N8NcXrtahBjf", + "secret": "f26dfd8767fe4f2d99a006b20dcc1b760a1784e11469f601e33da7413006721d", + "public": "02d53189e1719326ca40f472c452f18bcf499f2eec21e11f39c366ba3cd1693f4d" + }, + { + "address": "2HCBvVq4Z7rsJ7o3NdRGoG2DT1KZ5EinoD7", + "bitcoin_address": "1ExRRW8Ebyb7rYCsiD3va6MGZt3SiFido9", + "secret": "02a404e6b1ef80a48f9339deab225c0ded0b6a80d26b28746e1292ab01413a14", + "public": "025318a298154019bda73f131fde9878ec04832efb78369cf1fc90d2c3a6da74f0" + }, + { + "address": "2RUhPZhqiAoSiEYBrymsdAJ6t5VkEVV8sTc", + "bitcoin_address": "1F5Da82QqKWCQDK8wZxs4Pdnb9myWJpbJa", + "secret": "4557c781294d893b66792f88bd6c7557ed85bc471d735b0cdaaa9e070dab173f", + "public": "02e2dd3b4e6ba39a59977a0ea678293255b3bc7d29351f0ec053c203a778dcefe2" + }, + { + "address": "Avk4QuxAyeFr7VtchVebEY6Raz4uRs4UZM", + "bitcoin_address": "18GUUVWdn4n71mUHyzihHftP34S7bghXNn", + "secret": "c73eb18af7efe89e31f452d912719611f8cab5872fa2d66c61ff376cf57fc9fc", + "public": "03907b52c063332d80a3aa3b9824c2a1873e966caee5a05c495487cd4bd30d2662" + }, + { + "address": "MGgcz3urE7CCqBm7BrUyiv5YgSkzM1zmAk", + "bitcoin_address": "162NAzAtYUMF8k27BzkfWkxFgQDH1obqar", + "secret": "7ba7d4ae04765fe5f69d8e1072b22dc2bd5d8e89fc7ea9177e51e7407cb80324", + "public": "023ef86e43a831ed5ea3faa6c0b6c92ef447ead071c32085ba186b615af3e7849f" + }, + { + "address": "2MYqwgpjcM4KooQG5kPE7nqicqqma8TPoQH", + "bitcoin_address": "1MGgSXcPHVTjdMLH4UQ4hii49ftstuaiQz", + "secret": "5a26e22f142054c7e91ac5de6e257d341a66dea9b377f5a1524e8733909061be", + "public": "033956c4733f9983bb70877076e9a16da0a3192bb6412fe7285048f1efba2a835d" + }, + { + "address": "ae8Ah32GU21Jk2K8ryWB3xdcyBmLZT7Gob", + "bitcoin_address": "1AAamdfk7zEYjZqQtNovp4KpBfuhafaQsH", + "secret": "1831d4b0c420224c83020eb30671836d8722e752619e8bbfff631ef4f4d229fb", + "public": "03b88178014789d21bc222e02cd802496baac40ad729b0183fb2da47d6b0bdf879" + }, + { + "address": "Hft6JuhuFhKpQmCteJp4y63GHadLWbtP5m", + "bitcoin_address": "1KBR4MpqfJeV7sYwREf514JEtiPVkYUeyH", + "secret": "815d2fdde17cdf80623cb0e4798553f929b247b79faea9cde29cb213be378b56", + "public": "02fb184a0fa61e856f1c3e6324ed6089fe81e211bfc1ab746c89d4962b4ffe525a" + }, + { + "address": "dNwZxggozhUJ9Kvfm3ArnH2KDVFi6gkG9z", + "bitcoin_address": "15nwfc3HieYWGhq9Z8HkdgvNVsnJ3BwCK6", + "secret": "9547add3c5808753234603f06a90dbee06728be93345d74c6e1a5639341053f0", + "public": "03ba596f4f81a2b4033a557175e9fff808ea41804ebdfb2583bbb7807c1a7242d8" + }, + { + "address": "2LBqp8gpoo7V5Am7ExiaycspCkzwDybmCus", + "bitcoin_address": "19BDaYFdMdd7iNi96cSJkAikzQzTLSFuVQ", + "secret": "2fefb1881c3102faaa2105597a139f601105fb705f2a7c7a23e12049507b9236", + "public": "035421fe09128dbccb1bb951847800525cfd979006482a0576f3db7983f005b9b9" + }, + { + "address": "CNoWEhb8kKXFWESa5vyqkpnEm37owGLncC", + "bitcoin_address": "1y9y8Ec7S9VUoN8JL8s8UP8TAyMNyF6NF", + "secret": "3afab960a2d0fc16cc418946397251ada6243348bfb8cda133157e1932e519e9", + "public": "03e8f8a2ba639a925de7f93538838b6530b68ef53a7ebdafdc399b1e2e6066088e" + }, + { + "address": "2jSnuGTDS7fbkfgwjkNErXGyz4Xx8hNT5CX", + "bitcoin_address": "1FFJWMAJ1RbXuMsZTYcsM4USK6fvE7wekT", + "secret": "7c124e22cba0f682a2a2a94144adf670f8e5c09228decab2a1cf531ffa59f82c", + "public": "03f88d2c546d56f7034fdd597f6e2c6cb1c00d54d69b605e3d0bb02b743bd9159b" + }, + { + "address": "BK1sByWwm6ZyCFvt1MYCnuhutEEoVKm1sL", + "bitcoin_address": "1M6zUjVPhgvm7nHkJvFkWgAm1rNrEuuNFg", + "secret": "51607221de3b4eede57796c66a418200535af5af75b73b8d48d47effa0d08e9c", + "public": "03efb377e6ee222a37a0d7f73be09a25947c5afc5b0aba90138344b44dce8e11c0" + }, + { + "address": "zmQok3As5KxobevD9YvReWkQDGC6AVNExn", + "bitcoin_address": "1FG6aby1V4mCPGQDXFNZT422C1Brtgziu8", + "secret": "f121104cd3d4fa345efd445fb8a39f52dec4a01d9948805dbe2fb2d8dd1153a0", + "public": "03997df1f0d27b539122782b6612529fdbef763de2ec3142844953b7f1fd91a254" + }, + { + "address": "JGRc5N3eEWYhasHmjWpiQ8RqFEQHFsgVev", + "bitcoin_address": "1LEL7PYG23TLqWsVdiNzG7sxAbDgHzimyb", + "secret": "efe5cb99efa43af9966268472eb5f2836af65d1878e12b3483dee1cd7f5ee967", + "public": "02d3cddc6ceb7eb6bc94244760b1b80e0fd8d32653c762a046f07379473e7a069b" + }, + { + "address": "5yDKACKJgXGeMLTJoT9Ak8GMKQrMuZtAXX", + "bitcoin_address": "1Cvj53iCqMx7595yZvDsyPsAj5c613z6W4", + "secret": "311d2ac25e2e93b75e4b221744a0544cd2c61cbed0f2ae9f2d1b96fb685de826", + "public": "03a460ee0fa4ae57cece255da2d237b155ef36add87596945c45ee399d9d092a61" + }, + { + "address": "Qt4eK48vohSAe9KL1VguDCdTsRbwqm4Nxi", + "bitcoin_address": "1GCVGvhYdaEPUv6pXsk3cdKjJDUoJ1cMBh", + "secret": "65e4f0874bed373e927927bcf2c4a0b3695d623dcd9b82699a23e090f4d695ff", + "public": "03cdb9a9ca9e32fa1c21f45f97951d2e86d5801800f0e199a171a5932c46ee59d0" + }, + { + "address": "oDydBKTwxrA5SG8BRXkjgC8p8bCLCKX7CB", + "bitcoin_address": "1McvZGUA8waAzYJyifF8VrzxWzpR3dk9b5", + "secret": "532b52c6afc906733f9a8d54f571bb46f8236aedbf99950f9441fd66195869e7", + "public": "033a17e3b255c31d2c462612cf55c7822b462072823c7aebd64d758013eb321ef8" + }, + { + "address": "2mtd6hKNAebgEXs3MKLUZj2Hbw98B6RWVJu", + "bitcoin_address": "12PrYKUVXTbcA7f2VN1UoMcXWj6t3kZ55b", + "secret": "1d5df1bf4861aca59db4601886abf9c14215bb47dd498328d0854f5958e2cd52", + "public": "0217ffc7084bdd74bc7c512251ae2b6875d6dad5e519d6d91a39e9cec457b77b58" + }, + { + "address": "SnSBaGjufieLSyi193EDTNP2nqS3CRuEDr", + "bitcoin_address": "1MYDNAG88QoMzDTeLBkNr7F84rEdQsuc2N", + "secret": "f22dd87c70e283100b42adafc2d766153ed090247dcd909894e9340b35926464", + "public": "031d9e9e4e86b10f0a32a6af86dfd4c0ab8c1e18e1a2410a3abfbcdc6fa54d74f9" + }, + { + "address": "aBbez48E247uZMtn4vQVCFkac8iuuJZXu3", + "bitcoin_address": "1J35G13QmXnHAoqbed6osZAxMjjb5SQ6Ue", + "secret": "cd5ccab9036554e4d7d5124393ca441e115d3b681543c1ae0e09e8cdce38ccc8", + "public": "022c1a6fcad7a9a2ae3a66dc2802482f028dcf9e156377de508592b6ddabc84a4a" + }, + { + "address": "RY9YMTk1PavUEQNbdqyVHdNNVPDDQvisys", + "bitcoin_address": "1Hi6VxMvRVb9eEAGwNWLqnzsmSuBagyJXG", + "secret": "7ce9cc17a56b261615d768361a89bd287ea24f845267e5cc5fdd8f8d492e5cf1", + "public": "030ff1f4d7abb8780198d610d84a21bddc57cbea7625b43eab90a612f5e360345f" + }, + { + "address": "YVjTfb8TGxDRfXCnqNmZj9WocQ8t48bXid", + "bitcoin_address": "1KStCCSnTWswKUv9uykTjGST8FBgcK39HF", + "secret": "94594f06051e8d60e315dd05dc7efdd99b033bb01071a48f2c4f0c5d14bfdeb6", + "public": "036d46388cb90f08c49d8c58ceb89b9713f9f28d5e40fc6ebeca7d1ffb628a3b93" + }, + { + "address": "4y2U1dJwDgL17A919tqmjqEfzXqMN1sfJr", + "bitcoin_address": "1KUouuPHoodd9RdqE3iUUr8FTpoND7nsKu", + "secret": "0d845f4f5b6fef53b40bfd07d7175881f96cf26861a298c96d1310969174e9d0", + "public": "0349290922a67e016f3fa308f0a7dbb151b1f86f19be4cbcab6ba870b5075f1fb7" + }, + { + "address": "NcapPnAXXQbKGRrxGi83uJJLb5vk2VaRT5", + "bitcoin_address": "1KM3Nb77Ud6G65KGN7QbaqHV3W1G654bEr", + "secret": "183ceb7edab8ee4a5aa307f66f3cf7a55f1e271f8064e0ed74f2390a954c9005", + "public": "02977fcd738a85253b58b7a2ef2ff36d47a5b3a6aa1aa343bf6bf62954b878b9ed" + }, + { + "address": "D8PPZ13Ex6wr5Mn64RRBorPcQnfGYYrpHo", + "bitcoin_address": "15xuB8odDbFVsn8qRW5cifCHE6FHw5QdAZ", + "secret": "8f619639b6eb91aedd1213d9581e1651fe0b564ddf7a2623cfed817c8c181da6", + "public": "02d41cdbdb8785fd538e887f82752fbef97efc94669001849fae65fc1d68f84f52" + }, + { + "address": "2d4fGA1RtyybodYc3q7sMiKX1BrznHP53Px", + "bitcoin_address": "14EcfTDYusEkhcibcPaoJVMsALYK6EnqCF", + "secret": "c7eea265a0472d0de21010f87c0db5a88b7f6bbccbb7b2fc89f12bd9198d9f80", + "public": "03b0599b68daa9ec4c330d840517d041f638dcae1ca8cb93bad5c2e83db2a6010b" + }, + { + "address": "vaeR4TDLoUiYzJULM7FByv9owEKMkX5cG4", + "bitcoin_address": "16NXi3J6TxRA2BMFK23azH2FzZcSsnaDDm", + "secret": "e27f88009bf53b0253ebfeec1c5cfa3831041a6a977a0a1fbaeebcfa3b515ff0", + "public": "0394fbf78b5909af228443f95e3bba853e1669a17e328314e27906637ee3e879c5" + }, + { + "address": "HHiby3rggQqcvcMWey7B2FFAwn4UPQSsky", + "bitcoin_address": "17gruRJuGKk5inPPvjzDGNCMZgNxrLdYTp", + "secret": "0e513ab67bc9eae469626faee07dcdc95d886feee2dba72160cd824dbdcb002f", + "public": "025ac4561cbd4acecd25d95e09d1c0df88f3f181120be234cb182e4c6422090172" + }, + { + "address": "DRbn4e9kumeadJD6bx5Zwc9hJR33pCJ3Eu", + "bitcoin_address": "15kpVuU3qo8qPas1xfKzmcVxFqzcPxaVT1", + "secret": "e1a3e5b5f6378bbac69f4c851aba44d5508b6879ae173ed538a7f58eee98c005", + "public": "03b2ec20a6bc7089b22e02f3877648ae92d6a961cbb0764264aff9635cb9b8bc66" + }, + { + "address": "eF2QTjnUujZiyEReWFFtgCcF78bseuf2uR", + "bitcoin_address": "1B72y7CEuSyEYWiisrpvCnRoEpBdJsYVas", + "secret": "5f9ac6bf76829a442c2e524d424fb91123e2afc9520df6fdeb9fa7985c017e9b", + "public": "021bc1cd131c269c4413aa235851449bf66d433ad2f7a6abe426f3d4251a38b4e3" + }, + { + "address": "GpdAHSAGjNBLy7f35PSgQd8fvmCYBWDS8k", + "bitcoin_address": "1Gg2wUr3q1wrDpAJkZDVu1FiD3NChBp1CZ", + "secret": "18fe04699878a57546523dc3076b1c47d63bdb091eeefb2839eec162619fc1d7", + "public": "025d0f942436a465d4f027c00652717f6b77a09485ae5631a7cb0c7c0ac3edb40b" + }, + { + "address": "2epTtuKgNH7hzfbFV6QNSzEvP9vv2uUpfnT", + "bitcoin_address": "18BSfxCKVWYrmEazSnbM9Dvbq8b6T5p2kv", + "secret": "c8755985ea031954c0501c048d8950c35685577cd543adc214c03437af59cf20", + "public": "03c88abdb994b24ea489bda4ab140e4c5cd9fadb95d395a11fb99fe7e790bbc4c0" + }, + { + "address": "2Qpz4d9HZzb1uaeN5uyjDonR3MR1f5v4qjV", + "bitcoin_address": "14cG4HnqjftikCuS9wbtqhNybL7tfk6kH6", + "secret": "b8ea20e202b9e411ab47c6da122aa0d2b2953567d61a99471a4ce66518bcb8be", + "public": "025c77a070003120f1af15aa42ae9740b44abe229ea7250b77eb1ba0033220a9d2" + }, + { + "address": "2iG4Fs82QP6WxCxayVbTfmoTH4M4N7Lvos9", + "bitcoin_address": "1Pksy1F8LshzxqknunUjnHZwLEe6cmF684", + "secret": "9fcb5c59bf38c087b0e427e6c10db9990056b65560b79402e1fce98f14652cd3", + "public": "031d315e2eb87ee8032dd461a5485876c1139a9c28c7e624cea4a3649f8aef35ec" + }, + { + "address": "2NKE64LsSB77PCUPud1heKa8xmjadonV3SU", + "bitcoin_address": "16YjpmdB7r8Ao9vpb4pcQ9z1pbbyVKgus2", + "secret": "9b05f64e513868d2388c06a9ad974146a2b036a40910f9ddab77a9d75c11a751", + "public": "03adfe42ccd50b9577fa7620945d72c70a5b096d6c97d0b6fe3a3f25a4fad56f6f" + }, + { + "address": "Aezo2HdLAbaoZguPpszC9ZUxhmJHmAFnfT", + "bitcoin_address": "1GDxiEQcNteHkUcDb1MbkuUx1jX9pEFBac", + "secret": "c4a375cc88e1b0164a8a6e1d02d309312e256f84b18ea085d31806a1268c98cd", + "public": "03bc9e850dd82d2171f821fe8eeb98497dc0d3864544099ed2df96d26afa407e30" + }, + { + "address": "rhhySrhPyMSZ9DxDHFrHR7ktnEu7AkqB4K", + "bitcoin_address": "1BGhisxbDxiiWS2usfQHUTtNWq6eE2QpUe", + "secret": "0c41ee6da35751a7dbaca48f0634f69ddc5b69d2586093a1047011cbf10cfde7", + "public": "03b1952ff8bcfd8d1febcd8876e11212108860879eec9e05d8f985951861df81b1" + }, + { + "address": "bxfcnYtu2tJU23uVKmw9qV9CffuN2Lzvu9", + "bitcoin_address": "12h17kjrzBEMKadtzbKLMeMrCJzScCrowo", + "secret": "a999df119d86f4a42617d53bad1a7536c5241d9bf63600a9d4245f07df3d3bd3", + "public": "0350e14e6de722e11f27ccb942e2a564738748a4678213a640ba3d3af0083f1f92" + }, + { + "address": "2m8ndBh1iPqPNBNGJe9vd5gThJ45KzTz4Fd", + "bitcoin_address": "14Z99TfTeJFG5GB92Jhjn2DgnZV5Rm5zX3", + "secret": "0523f1e4e57c30371b7f7b7f89f47ee9bb4d2d177c57da5a28d25ebd7ce71a46", + "public": "02e8a36d23ea250088c113d0b6f41ed40d22c3cff4ca3356f50637eb020088aa43" + }, + { + "address": "PHXhq5ArUzYZJSJ8PiBSUj4ef2sc4zEtW4", + "bitcoin_address": "1GJJx87fbhB9VZfyWU2vm18zw4SeKTVrKJ", + "secret": "afc892144fd61f4c3ad6c1cbc493c317ed007dc43fc414f73a380f08697303a8", + "public": "037ffedafde38ebc382fd26c61622a258a1ed18d2f7a0587a5c37a93b6e48e0f96" + }, + { + "address": "2WCPdhx6QR9RxRxDntTG6iZa1as2ja6btJR", + "bitcoin_address": "1MzEnmuY3trdgHY5oKFqax4Zsf1MtBkxut", + "secret": "1818a34ac2b005aa1f3f259dc16d189620f76515a3528985766761fe9198c53d", + "public": "027fee0b90497183521704f2929cded0adb3cf7123fc17b929e9de3a45d9927833" + }, + { + "address": "2bFrdk6bqR8FLQ6kYF4UPgnVjs2mF1DsfoS", + "bitcoin_address": "1MMXYjCFLh59gwkUSTHNJF7HibaqWMdZ75", + "secret": "f5c7bd0bd1853186cdf8a529d904f1916076880a1c5cd4a828730674a09817f2", + "public": "02c4e443c03b8c12e140ab0270fc0c67a144144e3dcd02963e107facc5dac5e428" + }, + { + "address": "2cwNZy4SWDT1zX5uJesdCKU2fFKjrcmpzvL", + "bitcoin_address": "1HG8Lu7vkrjq7NaGU4gHo7itTvTsMHdBsB", + "secret": "38296af1206f02b7650d5be42b8533ef5870c54c146c39239beabf6d500218e4", + "public": "0290aaa6866d979208b6a7ac2984015813ed4ec47f6a9ac49cc032fbc16b4533f3" + }, + { + "address": "2bwm9u7aGPMc7pfmHezfhLFabAuH7H6EBTx", + "bitcoin_address": "1EGPSamSsC73aLszwoW3aGk5nMcEmWiXFV", + "secret": "c98a3735e47a9c498dabae93f8b40683619eb1a37756e3b786b2d40dd001d7be", + "public": "03b9f0815dd914ef4e71caba76a11cfa41fc8d7063038b337a9c600c9a36273822" + }, + { + "address": "d4i4nQXJnoPiyPXnBFobXGM7nFqR7kJNZe", + "bitcoin_address": "1B8aDaL2ufnpe9NAxWBq95iLzYmLdPihrf", + "secret": "e3ed12b80054877ae1d5d9ca1be4dfc483d5ad4b44dffb14b331e9b8c07acae0", + "public": "02317c1f881a8f39c9987cf6daa3c8887ca03d91b3bd5f915d3dd3c8eb7dc90c29" + }, + { + "address": "2H9VJjLXy8nugAdyLLCRSJi1dwRx8oWxFaU", + "bitcoin_address": "15K3TK69w9bapGSPhECQRRsr7HRR168d26", + "secret": "e296d63f3558df4bd455a9850bd9420e2ac5f3bd2cbf8de148a14369705370a6", + "public": "03b4fec118a0e5409f5c7ae65462f56d5f40f477b0227083f238f49b9f90f8f70b" + }, + { + "address": "2Mvc6WgBeU4p7QKaDbKPspwfNvTbncAY5Et", + "bitcoin_address": "1PYfghL3dBHxvovijszqr3QVbBtpMnt6uv", + "secret": "20dd7688888654a5f214bee8d411c5635e0be8c8b13d9ea4719521959e65840f", + "public": "020993b1c2fb2e251064b1c53bcd1e5f18e7f7b5b845d8fca619ff5654de57bab6" + }, + { + "address": "2UjjeJqwrL8zhL9hiQHsfyQS1ACo7oQQnsE", + "bitcoin_address": "1CMSoyWEP3ThuGc3o6qUX4HXQuX5c5gcT3", + "secret": "8dad55ff69be245c2f6714dd514338118b4e18f4743b65c1a318b8ae8acafae4", + "public": "0294b9b8baa6b0f15f00f707a02c5f4002074bd9461982c6153b87573c7e2176ec" + }, + { + "address": "2N5b3ujSAFtGPbAVvZ5PSMtirXPAGxXDbzm", + "bitcoin_address": "1NkjWibR6PVD4tzwB5yPQ2hy8Mehy1PpRM", + "secret": "0c878e067cb6dbecf3af796ea802d685a6bd463f24b84a3ef973797596081e52", + "public": "033df20062b208d521babdbc6105e65e02f40283132af33fea83aaf1e41b9a5c23" + }, + { + "address": "2LD16WXviY1JcFLL3Zz1Amcb4NPhMAzeqCB", + "bitcoin_address": "1Hc5Qc8rbgtoaScJiF16iYnd6j5CQSJzG", + "secret": "aa9f09e643003c1227741d2c7c031d84cc4bc78269e988576a1e96ad94ab7baf", + "public": "037f33fdad8e27e15217a7c5a9b9ad7072439ee03176fd747c16a240938fe855dd" + }, + { + "address": "NRA6Li4MRknBbKaNEhRoxkP8g6r94r2Gnm", + "bitcoin_address": "16w9RvttK8dWW93EuMVpXfm7fJnAx7AGbG", + "secret": "4c44a49639f2885c2e2897a98a4d1135255a8a5fcfd17cec0f452571f547d7f0", + "public": "0334f64e4c6af2e283a7a994132ac8d6f652b1de0442540028c168e36007c998ac" + }, + { + "address": "2hnM4BQEaaNjdyGDcRe5yRVXE9i3oLDUxY2", + "bitcoin_address": "1HsjcwnhRyxGCqnBF6G83Ph2FxcZzQDY8y", + "secret": "fc1b2dd7770ff800de4fee7eb01ec6c06499939dd9c4ae6ac51047dc803f177d", + "public": "036c44f8a8ba59edcccf49a6dee7d22ddda61272fff258ba19614a529768105dc9" + }, + { + "address": "LZh8LgTSoTo1YgRpSkh5etREEyFgkLtQyh", + "bitcoin_address": "1KnCUKnXBAYJcAyRBPWzHoeyoY7qftcoa8", + "secret": "08d6246e2b3ae9ead57557f64d369507f2c6de10823864c33b68ab824229b7a0", + "public": "038f5db7aef3d2086f0e4f5fa6fb84057b8a7ad37eff06ee446911a385fd8197f1" + }, + { + "address": "KGToyy5gNPmoSxM4hUu4HDYjEVEv7kf7xQ", + "bitcoin_address": "1BV8ofcibMgaJBUtzkxLaKw2tNUUjmH5xS", + "secret": "ad4a60e329f80e0b3ed882b9497f5078f61e15168c92181c4cf6c86142cabfd2", + "public": "036e48c7dd1294354ec1181c1c41f55211c5c27069fa98c2c192c1fb6f1095fc23" + }, + { + "address": "2eVWTrgYXbDZnke76xyAFdFZeRWykNf8SFx", + "bitcoin_address": "1Kbyz7dKGY19nr6YTXM2V7Xqv3xELD6i27", + "secret": "3e2680dc4b231fe0c8f51b8a2c134b1fbde1f03ef8967011c1eac2054f65c741", + "public": "03c40c4d319aecf727e8b79e8b5dd2bba74d2d97d8da3486bf0e7df85458c3e7ab" + }, + { + "address": "EXeNXEayVMot8oAPsa4moaMyZ7ZqTNHdKN", + "bitcoin_address": "12JMTaj9mTQbmpEaDwfzR51qTwAhGLGEAT", + "secret": "bb4b593aac3b8938757e975b5f2f1ea203d56d4072c53e80f9b605ab35a70d55", + "public": "037a7744437290765a6024781596087b7554387227430c1feb5829879d242e3409" + }, + { + "address": "2Vt7Jv3tRKuTKu3H7eBffotFssGtcmxeUGG", + "bitcoin_address": "1Hm3JGYGdyK1hP2itd7tGM28ET2muEe8CL", + "secret": "5c6e8086199ecec957180e2bc5ddc894f91cb2ff118f10815358766dd6ce03d7", + "public": "0227df153973f5468a6b601b0aec4bf6c4f50ad3293b705d47fbc767dfe112cfdc" + }, + { + "address": "2anB6NqHTEP4MZ1kBf25m1AoZPaF5HCRNf2", + "bitcoin_address": "1Mf5BA7L3xARYADXZNuCXGzge5mfDFurce", + "secret": "f458a9a6f1345679295b52660daaab2e6c2ddfd9eec96de1309d29b8645de564", + "public": "030651edf0fa34aa2a8bd48f55304c30fa3156636ab22b72978fa2ede9c035238d" + }, + { + "address": "2MR9xtMD2fVReBmXauYAomuaMgjvgnuBzit", + "bitcoin_address": "16HhewbTZmHq2x4uFm94NNyAMPth1cEik5", + "secret": "97150bc09d496aac364d1e9dd497a082b8671d47c1fa3479f55131bcdbdd9e02", + "public": "02ff32925ac8e230d9652d112b61908ae00ced09d71b9353bfa8eba16c328e772d" + }, + { + "address": "2iRSWoCyw9nNSkcWzV1ntHZDzq4g5d7EjpM", + "bitcoin_address": "1NgV3Gps8nk2AYtpMVrWnmBVBm8CsaH8kj", + "secret": "4d60df4c11698ccd0ee61e1df48016f37bf4f2f5bb14518003b1d69b1397bcd5", + "public": "03907ffdf7c2ce2d673625e03967b9bb40b5ecdee8143f92a61bc5f8e46cafeaa1" + }, + { + "address": "Up9XUznLumQuJ6waAJAYCCvFimKkStGJ8", + "bitcoin_address": "19LB3fxAaweoNjzKehSVzY6Z3TDtDwHkU9", + "secret": "5519a06420ba5c073901876d3b1f11a9fb8b5be9766e0f05c025e525fc0a1ab2", + "public": "022463fb3a5fc5a850c12fa1da8a7c6b23f604a60136600234ea6a5ce7224e0735" + }, + { + "address": "2LQzzLF1wzgXVJGfrJwbj8fbCCKHsYPcpdk", + "bitcoin_address": "159UieWn5C2sL6fmWrb56eG3TcEDzUVeJf", + "secret": "ee48e87aa610c69d99b3257bcc5359730d16e6afc06b9b9a9757c277c0c94c47", + "public": "02da4067d72fe2d00b13d22843fac5d8b6153eed2cbed55810c22416906f7072b0" + }, + { + "address": "LKziTaWPqm1mqcuuFy25uk3nPgjQCeKpG9", + "bitcoin_address": "1GfTfcZBjHDsqbtrfnunFJqQZqnNPqnAt6", + "secret": "6222fdf0802f55ca91e656fe74408245aa477486acc16a1dff9bec220f26c3c1", + "public": "023298ce81f51ba19e8b93442cdebb4d34c5d25e82ed9cf89da090a6919bac92a4" + }, + { + "address": "2KJ5NEvapzdghqB7b8gVdU9eaYMk5Tgy2Me", + "bitcoin_address": "1EPgSpTLxuu8AZBPouyiKVg8twLJMTfTTA", + "secret": "6aa4dc4a06ef5063e3ebc083430def90f28cd90a05b13ce4ccbff29661340547", + "public": "0391782a7b3a5d8d2b34f7d2d0220a8471c1bf049ec51ea87712ba8f24a735f0fc" + }, + { + "address": "wteD4LYHyxZSBfnaik89dbELxBWoQubkB7", + "bitcoin_address": "1CZYa5vPpho41UkC39vSnL2EtMX4bjUt7C", + "secret": "03f083aced4af42b6aab54b7aa648825fbee5fe9b5b6c61535e9f6017142e256", + "public": "027c3406cfff5e4af70371660b31bc6cacca686299f24eb69becbdf30c991c8510" + }, + { + "address": "2L1CsK1CdeAG7tkwa27y5QVkHPLxzizcdTC", + "bitcoin_address": "1Gazw3eYCNt9d1NkbENdz2g6g8eDSDKHsG", + "secret": "c92dbefc11b3067762d632b5c0dfb335de6503ec5611599a98021ffccc72f3e4", + "public": "03910aaf182abbfb2cab0b137c90c2069451858ba4178f8e3b37ef395514581943" + }, + { + "address": "2Hba4NtNTJNhCPbbPTgiXNf7zGiuN22WDhC", + "bitcoin_address": "189Xn8V4sb79oECpnfoAKidS4SyEeHFg1Y", + "secret": "9ee66eee2ed4f0025c5f83e6042eebe189eaa46bfe6f6670bc0b32400cc46e98", + "public": "03fac3efccaad9eb1302982d97e76d0b675752e98f37d7b6bbf7a014bfa373a292" + }, + { + "address": "Fct5xp4TiAfoVj53FsVgz2Xvfu3VoSoGwh", + "bitcoin_address": "1EwaTFCg2aYmwf5hVZ9D8cebTQ6u4tkgLu", + "secret": "68533cfb6e102c1218d07c468bc0111e378ee524438c7493f0c6599280885cff", + "public": "034f00bfef452bdbdcdd0c55cf0e328acd67c9769dff7c8097f968734598c512d9" + }, + { + "address": "22n8VjKLqCBWMBrsmorJL4LwN3tezm5gEmS", + "bitcoin_address": "1HiocXeLXWjGHLf5aJz7o13TaCtCBcFLZn", + "secret": "4412597ea62ba47aa723023684be9f579628c79c40df98b139400304c4b32429", + "public": "037334c374d9ab761d5d9b738b07a48434444156f3fe293f222ee621615a008cd0" + }, + { + "address": "ZpBxiDKig7YMP4kpb26aGHyL2smaebcEHr", + "bitcoin_address": "1MAWmh87jqL7QkXG5AqxxwQdRDfKK6DR6b", + "secret": "d941ba613cdc2b87609c336d2063bf612e540875a4dc904ea4e63d9db4210650", + "public": "036c7bc521bf8a4700a2629a0643dcd1d157959284aed13b74339a0006357838df" + }, + { + "address": "2P6fGBjKESXhkpCPmij9e6A1NerU2ryy3xV", + "bitcoin_address": "18GNydRJUp4AwjfPUR5fybBsEqhjttJ2vv", + "secret": "5a6082c021c71535cacc07a5df04fc0e8a6eacebbdbd454ebeec87be95309c7f", + "public": "03c981d0bc997b4ab838a0f2009fa4e3211b2073b4b15a12a711ded2895bd69f9d" + }, + { + "address": "gByzB6sPJ7RmVpk1md1sXm6HLGKU8knjWi", + "bitcoin_address": "1JgTjwpHhG9qZXerq3tJLt2oEZssJ1Bcpq", + "secret": "e4f6298b83374823d72aa3796d7a4054a669c377090f61d1a11521390ce56745", + "public": "0227e1fd95615063c435c4f9ebe82c2d5dea86491c8b412d60b56a7e48bfbd9a4a" + }, + { + "address": "CwbKzRpBo1KMi4hrBBhQpfRbYqp4V8Zbf4", + "bitcoin_address": "17PU4BmmFGaYdFSTbAy78YC4RFvsQwf5FJ", + "secret": "688f61a4f695771ec1bc1329c86d057b551cf5aff926b184be538846483028ce", + "public": "03407a7bf3e89de64044ff4d28d289a54651c3320edf98640dfa479501b5c67de3" + }, + { + "address": "HvvEsysCjqffVAu4YWubvfv5yYYzf57Vnw", + "bitcoin_address": "1GUDHu7Xc9UjSNgsKxWg62sYdH8VR8bK3r", + "secret": "08b6180067c0e32854776a2b70c226abc9bccbb9c03b718ebfe625563d139d4a", + "public": "03015c8f13f0029cd5f666211955f1a1208735844256cf32ca32486853175c2abb" + }, + { + "address": "nVyEuvxiTYTzN6QqcmRj9wU17fHMa4VJta", + "bitcoin_address": "1BqrMpzbtzVpiWDF5f8RqLrCpVQr9pGbhJ", + "secret": "98bb4aea9cdc25f26e9ea16f0c17f171fc2b52645c25c72ebc02e2be0b561b86", + "public": "03b557c6cdb5bf376a38d06f53450b3fd5a9925e73f1c3ce03daf7702f98040621" + }, + { + "address": "2Swcj8nQBcNTtpExUnDLxhfYuvgo1ZPzX2N", + "bitcoin_address": "1FizcCarVHfyqS9t2HpaEziFJbpRFYGGfp", + "secret": "c3f23a6efd8d79499b054bf933460d843aa62ff66dfdaf69306ad92ceb0b63f8", + "public": "0256bee55434ce76ae429e74b63cf7c3c7961bb1c702203200f08ab063f1f895dc" + }, + { + "address": "fYMS9Gw91GaQcUNS8yCSVR8aWXC7RCJ79H", + "bitcoin_address": "1AkxELaCzDLqAPFFrenk9WWHavqysmgSHD", + "secret": "64ef7e0063f803ec119a6afc327c4a4df9d196ecec2deac3e4c64b418a72fb79", + "public": "02ac29f3444911103ce467990640372b23c2f1a98e8495e193ac576686eeee6948" + }, + { + "address": "AsNPg1CrLTFKNa1vviV5HkMJSZ38NXvVev", + "bitcoin_address": "16nk71Lm57dutgqQRAg9uFdQkYAoYB45qq", + "secret": "68d3bec66658ca2f4723d3c514a3ff65cab561e75e694204849b5c1b4733def2", + "public": "03c8d03e195092d202c6f75bd17c26d30c9841df9266a450e5a153bbb85951c2a8" + }, + { + "address": "uomhwkEj2mEc9JNvZTFpufDuxpornqcLr4", + "bitcoin_address": "1Dmt3jZwFjZbzqYygSdFDvz7XCCmjBz2ji", + "secret": "b0b2c25646387fad2336a3abd66d20fc7fd261b5a776e4e510e46975d5678034", + "public": "02047af97b315e20bb41c74427bf67feb838eca34bd82d8a1a78631c6450409a36" + }, + { + "address": "288trEspbRwW1NXhMUG6zSMmn1z1Yupss7K", + "bitcoin_address": "11669FtZYH8S9wNdSmQeAGfogigqVEpMZL", + "secret": "248d74d293a4689cb6a0160b4d3368b4ed8dd7a850587b3b23d069ea1e61039b", + "public": "03b65684d345fb8b319d50f4cffb672e9fd2ef99cbabf8ed13db898a1b40c2eb54" + }, + { + "address": "mC5F53X8PeJTqw8C8oAmbG6AcYA7zHTpWv", + "bitcoin_address": "1BPkTVCjcfywK79AjqaiLaEcaCabFHLLud", + "secret": "f88ee9fd93b3ef3bbc3e0abc31c0e14132079f91877bf27fc45fc612a11c8d04", + "public": "02ffacc6e508e69889db4b3df93b5c04f9ee20655bca13c0c76ae7d442d9a824a2" + }, + { + "address": "2N9TR5jDQWfSPvf2UTneWTTPzAzGixTUbxt", + "bitcoin_address": "15BJDk5X14cEJWZ6v63ZaYG4bc7R2Mx9Sy", + "secret": "4e8e791dd29ea7842d682b42a7e1236be9c787706dd5f130de9b2262f4aac59b", + "public": "03e1288e0f91cc983220bbde8a8eedcf82e0727670fe746d54ccad7aad336919ee" + }, + { + "address": "xQZoBgh6s3YEkaWxJcBJJj1caCqEr3qs18", + "bitcoin_address": "1GR6tcbuh86X5db1MKyNwdokYMiy222u33", + "secret": "09e91887df03369c64df32b6c05c19d4eab03760c6949586173b8df7f55e5528", + "public": "026e4ee5352bd39ed09ccc6b4f1f6893b450b6c554680277af3127d66925aa29ff" + }, + { + "address": "o1DeUpx1vAjsgz6xwdHQmjpVPsmaeArGYy", + "bitcoin_address": "1Ga3wvDvD3Juc8FwDvk5mryjz8XT9nALJn", + "secret": "eb76ba401eb1ce6f42a8a9b24766f98add7e717c96197b79806c5ae08c7fc36f", + "public": "03a5931787aa1f2e1bc5f03c160b1e72c42f00cc8ed5a6f78181ae26cf016699f4" + }, + { + "address": "26uyax1suGxdRZ7gJUjFKH3t8ptAnB3f1Ab", + "bitcoin_address": "1K1BbQSBFxvGYBsYmJF2BQzY7dUumjftKt", + "secret": "42b0c6d8afdc6c266e6afd7feec00f6fbc4298bf4b3e63e2c20a29c736b7ee3e", + "public": "02be4b56afdba2426151e542100fdb523271e8d0ca4fff3dde46a5ef90a2010bed" + }, + { + "address": "2GYqEYdWH4wd3aeCxWnAXAVBvfMiYL1rRpk", + "bitcoin_address": "1B9JUDvZspqKYkespgR7Djq668oWfozxsp", + "secret": "8662f1b8d3ca64d2eb00eebe3e245e99054d4bcb67d8bf7aad5f928516885e09", + "public": "0307c321ea95fd65d2e6b3985155d0d9899b6818bd7892347ffe8c261862da2b23" + }, + { + "address": "Xp5R1dYx4haxYjmZDpjBTUaGAqYTU6jRtP", + "bitcoin_address": "19rngLn5eeqop947gpRYFF9Js6kxL1xBBR", + "secret": "f5c6a132ec483f08b48d7965fa5c034a26247f1e55d77e6dc4ebccc781902680", + "public": "03245b41ed7ac350d9993fa89a6afddaf52d61244229a8b89c653af757054b9516" + }, + { + "address": "ZLwQzFUw75sbsMWTLS8H9jA2m3czji6hop", + "bitcoin_address": "13aMmcEhwXV7qy6DXK2efSYQZ95nej8vXp", + "secret": "1f05950172c640ab56ec5752c11139569f7c76736f00b94b397cad2c4f4977c8", + "public": "03b8b5bc8dd2c640e69c5f88c98f6ac0bed85f8119409147e7638b80c3931a2313" + }, + { + "address": "mLP32Fyc39JZxnvp2ZsEDK2xVKUv4YSQ49", + "bitcoin_address": "1755nhV2A7w5NnCZ8MA6ZkCRsunbhKsjhd", + "secret": "8d74584cca5c9941d4306ed7061a4d5632546d22635f0aaf54fabf4081078c10", + "public": "03bca03957963890c237254b7a6293d398df43f275d1705d9d2ee81dcad889163e" + }, + { + "address": "9H2rHSAsnEPey7Q9reVfQjFcn6HeuA6nZU", + "bitcoin_address": "12gEMnKRwJ1FWj8wiXgwxD4eUViKUDWqaH", + "secret": "f57f5c41a54b051c24195e9fda9e17c69ada46354ad0e100358db1153c15219c", + "public": "0294cac47535ba46b16380074e5a20b2e106eda46ef58d8588b34ffdda2b649753" + }, + { + "address": "RWeWyPo5jMW3RTQZhi4umoomc26asiQg71", + "bitcoin_address": "12ddQfcCtMKs3anpgYr8obDkmjV2RUF8Xp", + "secret": "3dcce71b3d62e7e9d60a8b0a7e7db415d2f29dabbbf9a90d9e4d028f5a2526d5", + "public": "0255f81c8260bb65c55b53ad5fcacfe14542dbb1478230bfc465f74d35f63d2ef7" + }, + { + "address": "489PcrGj1QQtFvdnrLYpabE99gVhK7CZDb", + "bitcoin_address": "12tKjc2NHLcTW942X5MzuECZ17HjtwA7LD", + "secret": "25e23bc3379bb160ee17faeb169d5b10e378cd4ff0c241ea47639d5ca5e3393b", + "public": "02351b30079c2adcc588fd1c50a68ca4c6b217129f0605f35057668eaf8528563b" + }, + { + "address": "fvAjpa6JpTXEEbuDLVd7fbaxyRpS97a35S", + "bitcoin_address": "16gaujLoDJMuTgvFvsmqTUzPG5DVtZrB3h", + "secret": "52724a60664d7b0d1b3f463324910c2b1924450be5b05e8d7a2db4bc53d453eb", + "public": "0209f0eb2cf37d24b74f01d385e77200d75e5ee67b2977c578443c8310fb9b2d7a" + }, + { + "address": "ZCV1g67KVwHfSGNfafFSSQBUHYeERkPNas", + "bitcoin_address": "16Vz6o56PUz5HY7V41t8hgckNWQ6BeTzBr", + "secret": "d6a7110de3a1ad13e9c01390c665810a596d8c6d1d4941532b32260b6defe285", + "public": "03b765ba10a5e030c8da62982214f549120fe18358f18f60855325939adad24c4e" + }, + { + "address": "2UQ9bjUN8YBtaLZrXFoFgdEz6H3PqfQRPnJ", + "bitcoin_address": "1PkHDBh9HCGt6iv5qTquTkQsMj8Fc7SJm3", + "secret": "8312de52989274e63b461bcd89cf9341b8014d3324892b8424146f3538e2ee27", + "public": "0318382d608f7da849b65e058db3afa32136f3b893f90b678001f0241a196ab325" + }, + { + "address": "2MdhNzpmAJxHnHBqsGmvSJVLzVYmMiX2qVq", + "bitcoin_address": "1PJPQkYvoc2icfW6uHQAvmbdbci4bBwbTb", + "secret": "fe3cd4f2731045ae184501ce477eb7745300158369ee44c3fdf5a87a2d5b8952", + "public": "039c452532ea6ca6af3eb68772172d42778c090cd199ba3e7009c06b0cb6c51b1f" + }, + { + "address": "816Gwzyu248U21D6f46r75pnVuv3AtHWrF", + "bitcoin_address": "1CPdWt4FQuzBbYMEYj9V3wgPNB5wHgSeRH", + "secret": "a71958850157ca5af9430ac1f7150f12970a3e5cc49f2b2f0b250f7262ee657e", + "public": "023385b52bd7cb2b0e5a749b59f1402237ddc355258a36011e03b860679e4b2728" + }, + { + "address": "NKYP3ZvpAa6ad2SvENi6T5HKwHeLbrVYT4", + "bitcoin_address": "1C5d5jFUfsnfJmoyy9xE9hqATDCiUYj5gG", + "secret": "01ca13b25a13f4fc7d4712b11861bba3d213e4ccb65d06e0572cdc7d14ce15a6", + "public": "02b313de4985803a1d054804fba3e723f88e64c6a2ec7fbe44303d1c4652c98c3c" + }, + { + "address": "2VjJfmxYideGu2ypmZJfLJZhVv3yxYED7of", + "bitcoin_address": "1FpxBz61HRtkJU8YD734PMLftCfPkJhJ67", + "secret": "f58e7c75269761d1cbd1c9c034afb754434f05f327e291ba96ca8ed727caa66e", + "public": "02be84a327e37a6d8267bc626c38bed05d2950e2ca1e4349905704f7f5c404ebeb" + }, + { + "address": "eAPpk64h74tsYepanFtSFzPzr82B2avcDT", + "bitcoin_address": "1CcphQPESCC7JWmCDnpeJBy5wJ6EPssr7t", + "secret": "7a0d7756af1ceb796d4aa202b10dd626bae3b530b714a3c90e075a2f0e301ab1", + "public": "0280324942ed3da9244cc0fec7fc32240792529d313e565c5f7cc8fb3dd38f453e" + }, + { + "address": "dT9rzRU52tZEUGohPpibWgGwZHSe7H5xjG", + "bitcoin_address": "1JCBFf7heKGgMVHhQr2wcgNcJFD8tZupCt", + "secret": "39b16997962b2a8749203fc137aaa5bc3ed17f0202f6e7965a60c2dd7302f4b2", + "public": "02c35a4dc1a33451a49ff10a38cf2e040054d775df92749f98c220d9665de0d3b4" + }, + { + "address": "2NJ6w1Q7oKUnLPZ4rkdFqxoSXSh7jPdkPMg", + "bitcoin_address": "1AFKTXZ2ECZFbwa3LiHaPGoVnGyyHYoNJW", + "secret": "cfb00a95d0bfbb4a1f2f5fbaab246b537ce130006f503dd3ed6108cb2f6fc25e", + "public": "03628ab3111affac3e804cca531c6392f25cb9accad0bc3439bc3fa3396c075756" + }, + { + "address": "sdrAWYjVrewkKMcpmxvcfS8NpFVoz8mQta", + "bitcoin_address": "12W3jqJdP6sEzDjHmaSCVtEzNQhSYsQTRa", + "secret": "122f3a66ae026891431a535ecd4a7ce87b766b36ee06cc982bae63d55b48840d", + "public": "03856a4861a9d5d1d0dcbce11fccfd15b14e621965577d7f84ad44a008a3a82488" + }, + { + "address": "AtpEoDv9QzZ1msqRpS67AfKmNUYMdZqtWR", + "bitcoin_address": "1MbUtV7UnocTsmgmwZMQ2sg4sQvVFWnpds", + "secret": "ad22f66b3f09fe8150b318dc2bf070c0e994a7a303eea67e5c784dc91cf93781", + "public": "03c43d4d1115804698e7f1e154b93537c91a61e579044682385b38abf606fc13f3" + }, + { + "address": "2RJsEraWYadfeoBhfJrBrvidi3u9VxTYpow", + "bitcoin_address": "1Ca8cwyBBF7g5NCRFRYuNZjwExE1yacRLV", + "secret": "828c57ebac860ef0f55510655de61e642aa329bd0ef90a0a407ad88a4cdb6c2f", + "public": "0200ba05a1798468845e97875530a31317ed9a428393f972f4f0bad6786cb77d77" + }, + { + "address": "8hjVBQTV9x3eL7MRXgqV9UM64rYur64iJt", + "bitcoin_address": "121EVx2iSzq27tKvG6v5GNJ32Cgeg5YMe4", + "secret": "202190f9d8a5adbc1ba486df7f076fba0338440a97595a88c49c870e4f1cc39b", + "public": "02d25d29264dab7b03d48aa58091d249de7ce2ccad2db54bf18949bf19b2c9eb05" + }, + { + "address": "PEq6dSumPciu9yo98jMQdHQ8msF2JbfnXc", + "bitcoin_address": "1Jae89Veqr8ddqqfvmp3mPutq3S9qnVnQq", + "secret": "fb4a81bfb954ec7bdc5f6c6ccb2bc18d00428be1a64ad095154939ea8d945449", + "public": "02fc4697cb9d1a8c364b685342894127d162ef5d7a3b7b9b26a0d9931247a4d549" + }, + { + "address": "2VV5BMupLapDN23JrhZu1rbS97zcYBbqkgU", + "bitcoin_address": "18FNz4wWRK981eQwS9cWHRkuvYEr4sa1bW", + "secret": "6970bfcd764f98f6095604f78a59ede3b079fdc7b9b369c28617405def807d85", + "public": "02a25a01476d6ea82a58c4022a8b5a379f4257a1aed8bee8968cbf3c162c84a16d" + }, + { + "address": "QcQpkqG2fRxcQsirLKHGJ2sYs5HTYrf7v9", + "bitcoin_address": "1NN8qvVLiLiKJJdv6TMAs1GEmUZPekZewp", + "secret": "1aa78e544b013fba58e38ae786767d93384cd75e02f3d4d059fcd0a099e34ae5", + "public": "0310f3a6b1152884ecc8d16417f0b9de900d86c29707538900f1fed76a8388af64" + }, + { + "address": "GEir5to36spsZ5uzSTck3pdLCFG2Tuq1p8", + "bitcoin_address": "1CHtnJSLXcZhY8tExDbzpGVWz9WxrxyGmX", + "secret": "f48ba7c9a2b190d50b093a4bda6b0979dd4110cfd7fb3405c965805aebe44b67", + "public": "02c20825470a7658c012e38b3901631f41d4371b0048653f62975cfb0fbdd2c867" + }, + { + "address": "8KM9nD2XJTrSSff2vfuFYVvZcGbLj8eA7u", + "bitcoin_address": "13cdT4mHAvijTKuXk3kh7b3EYNxScVjzDK", + "secret": "f274cd6a8279bab87069888a3d1dbf029ff46be4fd2e57d1a2fc82643a99878e", + "public": "0234e5b6d95fe79d493d0ecec613e9e0f0bc738c36ba1b77addf4b1f2fa6b71c67" + }, + { + "address": "2XaPonNm8z6upuKv5xtQpd7WmeRKTPUuoKH", + "bitcoin_address": "1BiuJwSpYibsUaEfqdgFmFhSCs7EqZmVHM", + "secret": "b866d4cac48a0670f498e9b4c10edbc27560db7fb0701e4ff87a13f6e24f9f19", + "public": "0321c3fb78a69728088f6b7316e03795bc487b41ba87a5cb92c3be85377ae95871" + }, + { + "address": "iN2qYbja7wU1Gp2JnoMUH5QiSammUC7baZ", + "bitcoin_address": "1PVHj4ZCX6pNWmR3pTBHtXAqUt2NLgMih1", + "secret": "588ceb37fe6370051d4cdabce2bf19035fd8ad9e8dfd334322d43fc2e16acae0", + "public": "02e3132cdd81d56c6628cd5d851cea5930f0f53e5ffc6a5e35d87a9f85186d823a" + }, + { + "address": "GbTRDoRiK7FrTca2MVEbQ9r9TK9PGqLhLX", + "bitcoin_address": "1K5Fqh9mquLxkESpsgtzUhZb6aakvKaZsS", + "secret": "89898c1b41e26fcd6a41e97c27f560f5db50c92e6830377379d84d767e6b6a3c", + "public": "03bfb7365227b03415f2f4e56821a7ad1baeae87b7c35b3e4bd393e7ff5218c392" + }, + { + "address": "SnfWDBRmDkshVcSgLfw5cYoAgmKVFygyS", + "bitcoin_address": "1H5w5P5vipvw7nTKc1ZYwpkhEmoTerwz3R", + "secret": "26030f3717e988f6739b27292401aaf8f9f7731c016fa1f5e1a7af384f22db2e", + "public": "03c754deb4f25d2d81cba3b6f0bdfa68907a37d9d87b7f5127f477cf3b1446d567" + }, + { + "address": "3SLNRTzvWE2qxPJH3zJdFZmZSNu2gnpXwr", + "bitcoin_address": "18qWHu1DScQbiFnMq5TZ8RDqpucxNc1dpz", + "secret": "bf33312864090d552a1f1c17435fab813d9dcfc5000f9b2a7aa693355856fef0", + "public": "02f684e4edc5d1dfeb37a770e08e57dd6a49cd8bda524631b7b208d6523c29b0ba" + }, + { + "address": "rsnD7sxaPfXqbqYXPggvLnWYQ9FTTERHYA", + "bitcoin_address": "1FRDDjiy6MKUAxx3aDPMnBL1aWcLMuBkw7", + "secret": "aae8981a907d7e0e5bd0baf1919f8dc663504a215223c3ed57cf70c823a3cacd", + "public": "03d18f871b16e48337b99fa6d9cee89212e53bb26eae9d73017ec796a09480fe64" + }, + { + "address": "2Ni5D2DznHv38gyn6E5Hc8mqBkrMQ1VfKq3", + "bitcoin_address": "1LQRfhZhcLnsr7UU5vRzE6jL6P3SVquuEZ", + "secret": "7673157ecbf104fec8687bebc5d8ad81dd5e93a0a8b92bbfcbee246dc7d3c7ef", + "public": "02bac8f5f1120987cb3fd7ffd4958cdc50e3906ffdd6062fd9ef4b96c7ff769970" + }, + { + "address": "2bso1AeKwYVDgZuiN8XLjNKx3xBHMm7M7xo", + "bitcoin_address": "12U5VmpZfwZuC8BNVwa36FiCcEE87wDT3q", + "secret": "c41954726c0d4369932006758b39f1afdded0d309ff99d8c1772f993570f267f", + "public": "039c3f264f985f26dd31cff7b0830c2bcc58ce13f54c191fce6d45fb827500ae83" + }, + { + "address": "2kooXVM5k6vn4y4jJcmgCJPnoqB4ydkTtUo", + "bitcoin_address": "1ABhxChMvC9ceZ3voSAs4TTKRzxALqtnES", + "secret": "4db9d88541c0efd0cdb9fa3acbb3b6e0ab3db4010a59aa78dd1488ad8c28ed14", + "public": "03bed7e9a58022dd6b2727439e1993b03088a61f2518a78436e4208efa19c4883e" + }, + { + "address": "2QiJF7CCM1tf6ESVHzrJbVckHcehKtGKAXP", + "bitcoin_address": "1LBm8y7RZw4yAcyzS1go5oSHuUDByaYG5Z", + "secret": "d530371a1e54014249b716d0f58ea68ca94a8c29cc2c77766032f9ee7675d076", + "public": "021bec8c0d092baf315dc4f51bb6a74ab276f3366a7f5a9aa72da8531b6dfdc93a" + }, + { + "address": "2ZFwFc7gPebsz3329NMpZPdrbSdTCvioRjn", + "bitcoin_address": "1Es7cS9JdeHEqDxQ6axe41EkYtoCYAFYg6", + "secret": "7bae0524fb5739792d1ca70ff661eee59d193113d2959308472efad7f745abc0", + "public": "02a497a0c6534627babf9ac0c9613702bf0774e3c663faa3a173daa489cfe9c032" + }, + { + "address": "2crTgsFrcHwrx96qTgNd5v2eZRhDSGwD9KU", + "bitcoin_address": "1jDLn1KXCoWA1qzD8A8VmpDyzeG26rhUm", + "secret": "0144fa3a146902f05d05ce1ea93d7f9f7740cd9515463541234b035ac7c13c10", + "public": "02a749c44375ac2f409ccade010712fc0b7108faedc9066e52656df90713407c1f" + }, + { + "address": "WTGdQJWnTZJy8BheAdohn9bDj1S1CJbcMK", + "bitcoin_address": "1AenW2BSrhRZ1Pj4xtC1HJrYWEszsHnJZm", + "secret": "320fff3d17aee027ab0a021d62984dc71e20e2a313d550d6bc71a7037da76ad4", + "public": "030b6ffda04d9048c4bcc32a2746f994eefde6b4a1707b5b2f4148503115227cbc" + }, + { + "address": "28JuPfNb5KQcTbMZorM5ffH5Z6dnqYoH5rs", + "bitcoin_address": "1BZ1oGvR9EwLrasW5WtxFjD7U84uadEBSV", + "secret": "5bf42214cfb2fb2b370dde6c400b89659c5b10d82623d5fb37051082be4dbc69", + "public": "03f727682db76736b93347b8f31414520db4fbfa8de36864ec33a5e397ced943de" + }, + { + "address": "2jYZCimvDikD1etTuiwNVkYdDVYoRkW5ajL", + "bitcoin_address": "18AC5mKsBHXCu3Qfse5Gee1w8bFga6xyAu", + "secret": "05140478b6c6839636564892946b45df6b3019681672f9b104c86ccfad644f1e", + "public": "02b04c95e8face2cb50c64526ca0d7c804811e4ca45ccd34ccc954d86692a39537" + }, + { + "address": "2Ws2CbP8zi2rmDoTV5wxXHYiBSgC4FcFbDH", + "bitcoin_address": "125UTSQ8eaGJ13eaJT59cEVxdPE7CdmCTF", + "secret": "2bd204df49886647bad2806269730ca62d071fc446f42881cd2b4f1fcc98d00a", + "public": "022aa6887280a4006676f44589b4b74a0e8358b627e797964f4d9ac466b35cf42d" + }, + { + "address": "eZLF5WNWovZ5N4KC8vZtS38K2A4u4BQs7w", + "bitcoin_address": "1NqMiuBFQ481mzTruTbWQZLn4SpUsP5H29", + "secret": "e7a78096dcea1a150b559775f643908650d1eac4bcca20de411a2764790ab1f5", + "public": "03ee354b340b4a723fdcb1ba2c11331bda62c40fd1c0f0cc52c5f876c66c95ff58" + }, + { + "address": "fadbXiZAhdLmL4DPDPFYGyqsZJxhDGrBnv", + "bitcoin_address": "17EZo9RG6zPcbSCmsDmymnnb3wPXh8Yjzj", + "secret": "c05043fe99c3315c8354326c6a7e38410372f2b27f68eab88e74d6f73f170993", + "public": "02a96ee70543de38766532aa7d58eb3d36ec7846ff57f3ac251e2522ff072cf046" + }, + { + "address": "dmEhj2EdVXyP6gTmNVwAv9cg1jsHNFR9kG", + "bitcoin_address": "17T6tgk6y5ufC4WaGiBpNAZLc65W7z6cJG", + "secret": "a09c86ebcaff266c7213d42a8fa98c1ffbbe12b91559a0d0b6a7936b3e16503f", + "public": "039dbf5a286018aa46bb4714984cdce0ae4eee0f35803495ca595b69adc5e07769" + }, + { + "address": "6MyEQAeTLFjYYxG52FPgpNrHDasYFrjXgy", + "bitcoin_address": "12KumkdT8xBd3ByXERYiZd6v692mCveNqQ", + "secret": "7a37469469c1063b3ec2ff3504df6e7a6a91aa1055a998dcc11e2781168b3797", + "public": "02980f6dc6efc5b1a259b1c588fb27b9c01ce6c366da9dacba815616351d62afc6" + }, + { + "address": "2Qh8ycrQGRuDaTmqjtJ6GQQCjL5KRCpAE7L", + "bitcoin_address": "1MVMYon6rSvcbGWUaJtfEj9MWZJ76NV62w", + "secret": "53c278e573892656e5ebc94420ad4f4460f368c2c9ea6a89b3534414d5cd8635", + "public": "021543e5108cd46d6038eb2f2274c59cc2670ac395b73611b0f381734f2acf6641" + }, + { + "address": "2aceT88Aq7FHfqxo2aBoiyDDw7rB57QsWtn", + "bitcoin_address": "1Gdh3EjFJTYK3stEt4z1TnymtGsSAUpbCf", + "secret": "d30bc636046b7fd619fa64d056c7bcae6d183b1e64e003ce9a358bd9be3ef3bc", + "public": "02f7c3b95e046785f21c280ead0a1eb3db86e87ba56a95671d1c44b5f72e93cb32" + }, + { + "address": "4Smrr2YzK2W52cxZxiCLoJhgPi81mSSZ2U", + "bitcoin_address": "1BwYuwKJVCjyACTNfgyzxLY2dP3JjqDBvH", + "secret": "0641dcb8d208b0012909b8e7705ec077fd485e43778e4b8dbcaef8eb925c42cc", + "public": "023143e54417d2df738825c2d521e283ba6b2ef611b3d53bb4fa0ec09ca33671f7" + }, + { + "address": "2b7YVEDW5WkLzrqfoZrkxzhuESHEwHF3xph", + "bitcoin_address": "1G5JnKPnarER8tr6sme2XJdZmypJPJqUx", + "secret": "77ebcdd32c08a25ff00b56603fbacb18d44eb869107e1b0a5b34f85bdcbb1672", + "public": "033c0e22d985b797c944acb9d176ff51200446aeed5a31cbd452b8aaa3f0364e1c" + }, + { + "address": "JaR22JZKMWEBSPNFiDKKCM8gatkWo9LVrJ", + "bitcoin_address": "19wbibojeyEqfAmMw7hsRSS8arJss54fEZ", + "secret": "e31e98a9043ecbb6ffa15fd480e0f1f169d86ffc440a56581f2cb994b887f71f", + "public": "02d604d042b35e8882515b5bb6d3c3a8f66b0fc816fa6dac3b88aa97ea9a8c8442" + }, + { + "address": "2j5pAjhg9yPyLuzBJnG6jPFq8Moi58Db1Fy", + "bitcoin_address": "1CMHBXaTDcNiDEtfUUye3UyoZ3GHQP4rjY", + "secret": "7ca8e3dec55937eb12e1abce3ae262ae1ecba643c69d4268c0b39b7c38e902f8", + "public": "0321f9d1f269d36138604eb84dc1087ac7b06e3bd0511a1f1128c089fc6b61dcb2" + }, + { + "address": "25PWupb7kLuFdM3UQK8tvcT98h7i5UDHkXT", + "bitcoin_address": "13NFP8W4jQq2p8M69TPeoYkxkgFfSe3F6e", + "secret": "15c148fca7434a18c484b539830abfd9ee169d39c3bf95e13cec5877ae5137bc", + "public": "023ba5a705ac79594261ebe524de80c022dfd42bda9094e8a4fa69889e6ccfcac2" + }, + { + "address": "2LWHyVRV3AEtYLvN6TwUzbFE7g2ccmhTVEm", + "bitcoin_address": "1SFDs4GBUWg2PJYvjyd7VNz6ADkQj4aCn", + "secret": "3bd05a85518a0596564796356e6ef267e99e8de6aa529a0bb70a992dfbd1abfe", + "public": "023f07f1368ace33dab9fdf039e05137b8df01ac5864723a8e913d7c74eed72c3a" + }, + { + "address": "2mJ7HbAJiYmNahgLpCSmxWg8HbAx15XPkzy", + "bitcoin_address": "19Sm18NshxViHH9oHvbrh8F6EYqRBHWYEK", + "secret": "4929beb2e5e57a9a5f1679b3a60bd6d20dbcd7b2a2527dd55f036d6e0a0eede7", + "public": "03ecbda83c01407aaf4f4856865fdbf082c12884a82e787ec0ce3d9c02bd6fa565" + }, + { + "address": "rVg9n43dSffZoVYdPyhpNemNbHDcZcnFnh", + "bitcoin_address": "1P8h4yzGieaMVTDZ33Vf2zChSrG4THQyES", + "secret": "c564ddbf95b83a7806655aed2277f7aab9b7fb14bb106baa03f497dbf3d7882f", + "public": "03972a262ab0052092640c9ab72b82617883a49b58df548f00b627286dd658efea" + }, + { + "address": "BvURWh8mAbBBqpqN6YcaVMo4xaqABPkjAK", + "bitcoin_address": "17gbQBBVA3kPzWjgRGSsJepNKDnURMRrMd", + "secret": "53f6d7e20bab00854fe7cb1671eac9ce35f997ccef7a5c68088a60709ba3598a", + "public": "02b92fba69673ce455c828a6eb473a185a3b5739fd928bbdf0e017c85bf973a084" + }, + { + "address": "298GYxeyvXBFpA9b32nf838vHz2L5bGQoKs", + "bitcoin_address": "19uxZinU2AmXbfxcUvvVZ7ZKhvWdMMjEc", + "secret": "e30820c25276c84d31b3048597f19f42b3eb204572d8d275c8f5f76788c9d3f5", + "public": "0278dc9c5578ed235bf491b5ce0fb47afcb1a1a57f73db7cc9f303055a124ba7e9" + }, + { + "address": "nRJwAXzpr766ne9BbdgX4wtf3vCkb6FFe", + "bitcoin_address": "12NFwrPoeZrTBwZQt4FzCsoQTrG3zWzZ7G", + "secret": "70ca6ef64244fd4f00651ed245f1f87390320b79ef721bdb6d87c14b52693c6e", + "public": "0362e369ee21ff7d59208212a8b9b696c617dda85821e4ef42194aa96c3581549c" + }, + { + "address": "TCXZMKsbdqy5yMnkuWgpVA5h8rZdK6odrS", + "bitcoin_address": "1HDsW8oTJi7aX1gdRXsURMYfphnzaZXxTU", + "secret": "6d5b53a3cd6e1b4b6cdfc44989627c71d5fe406dda8043eee286e40d4691890e", + "public": "037a95a70a38f2371799bc3cf2f329986d6f64bcad8455b93ec368c619696df252" + }, + { + "address": "yUMbbPX3JyD4oSA6L9cYDiEHpRqM5DZzEK", + "bitcoin_address": "1H2YNfgXgxtzhGsNFfzmUDchgyZRo7dDwC", + "secret": "ac9c752c92b9fab9859f41d4df2799ba3083c0d0261557d1563ce10ba2c14763", + "public": "027c5e3452c791d2d21e9a11f2362fc86258ea4470d3271422cfea29aa18d65e0d" + }, + { + "address": "22LAVaqjZaQk66dw8thM5eN9883pfwxF7ve", + "bitcoin_address": "1HV5fRv5HJpNmHhJGniQJRVPR1BARCRD9n", + "secret": "1da6d30d4fed6353c051770fa8df8bb25073d2a65c83be50516c7ece3407b698", + "public": "0333620b3e2078bcd027a76ffe66baa972baea3b1eefe02ed76b9a17ccc7d995b1" + }, + { + "address": "Gn9QCBzKVxHHh8SGb66wpu84BZuCw7PHbm", + "bitcoin_address": "1Jzhq8N6rNchKpRFgBPdniKFC5Zpd1j41T", + "secret": "16b00b79e3747c8e166120fe366546c32799aee2bab5ad442227b5c2173dc94f", + "public": "024726f46895b7ac02795bd5bea795ba7a51dc2ffd53a90c840c73657b25680c63" + }, + { + "address": "2kT2ZUiL7vzt446hY8Xc2Nx2ohGzcFjtZwM", + "bitcoin_address": "18EYnxLhTvTPPvu5ML6vZv1Ccnt2Q6Nmum", + "secret": "f0daf3cfa005eb279b7244beb2ea779ac76b1ea77045cf00c7379b75aad4805a", + "public": "03a8f0fef09af25c1f30e8267af7759b02942875d12e265a3896e7ef6399cf43af" + }, + { + "address": "2g7bpFrHiyyZhjFr8NNLoVoEL1HLcGyfXFP", + "bitcoin_address": "1HVfpJYvTZ2DquR7HpQdmW6WpZZAEemqQt", + "secret": "42e7c043b5bad590914cabd9da1c64fd95ba0e3618cf217c9e56e2cda849a1dd", + "public": "03d315900f1fa2b0363971f66067cb95b5e062799542417861acce3905ef009924" + }, + { + "address": "2aFx6zgr764yaew5kBJL83xKvJXtaFYrNe5", + "bitcoin_address": "1H4RifXGE7YRzYtKRsrTDCrQA87GEEKh7X", + "secret": "609ef2d18c07a72423ae24c2c0de839b900dd660106a4d2352606be503ab887f", + "public": "03070b88d231d49d34e46cf719e47fb0abd2d9b9db9dd571931cd0e33e9a21f251" + }, + { + "address": "2axw8SpzvpY6QJze48DubE7SVwhpfEdTt1e", + "bitcoin_address": "13dsNveiqEmEBRaHo5M9vJmHGELNm3zghU", + "secret": "3ae1e46578207468ba3ff0dc9e8670d3e92361eb8e4bdc7f372096a10fdea1fd", + "public": "02bda68d95c5516ec84e5e8ce328f6354a7f3fa1e8e0376b8708d570dc4e7cb551" + }, + { + "address": "y8DV3nCwaDs9PtsQbiZnueVcbqB5FNho3h", + "bitcoin_address": "1HxXcjcibFAsrXYY65ptqwDY6zU6qPdQoP", + "secret": "c4c7d8f99d6df9127b6ce974e4b5791619b7a6d9230bd7ea494ddd5321c3b02d", + "public": "032da1fe104a466b03731eb9fd85709ee31a91b3eaedbaca165413526ecdd87dd9" + }, + { + "address": "eJHjp2SLL6ZUtYHhfEMNdN3c49k6QU8W1k", + "bitcoin_address": "1CVYSLH4mrXUheQcz3H3HSfbKzGGsEhmFo", + "secret": "fc4c34570ee70911601b48a8881e93c713d9552cb9499c871454b1247619f7f1", + "public": "036cbcc6c350ae878de0382b4d4a998f85490f6ccd288aa37356730eae31e1d3e4" + }, + { + "address": "ZBRYcydEtrkGHYVFRmHQpzVwfDimNC7rfj", + "bitcoin_address": "1Bstoq2KqkPXiUkYhGptLwhzCUCD4TciXM", + "secret": "2df0754861dd3c563c5c1a3efb75befff40774022fd74835abe23fae37c03f49", + "public": "03f5e7d8028debaee9b5f29b2196c652cc7dbeb05f6dfd2ff19e1a7934febac699" + }, + { + "address": "J2Lu6gP8zXyq6EjayWtV8cDmdi6M73Jn5B", + "bitcoin_address": "1Nt14VDfHJa6jGLsLuZ8qmzRn5jWNcpDFz", + "secret": "4f82d68560df1e74999982c4087955f02eadadce6502054ec431a2a2958c27d5", + "public": "038494fb1ea6767a31005b3e2018500644fe5f9229d1facc6d3cbd086c1434a120" + }, + { + "address": "kXVPezUrC5jjzS1bcVEUgaXfqqPYpPG3jQ", + "bitcoin_address": "19WGgiNKxusUDrVW9SoHaX2BmJjMgrgFAy", + "secret": "72b9f75282bcfaf7c3e468f7a090bb3322ea4dceb96449a0e02d25826e242dcb", + "public": "0335224bb5460f92b2afc546fac694cc6af797543dbddc491235fe9469c269b5a8" + }, + { + "address": "sfBsXAZBz5VynyFGyEx1TA1EVA2SNS4Q3S", + "bitcoin_address": "1AznjSztpC86VLxy7MciB6yJgASP1ibFTo", + "secret": "599c05c64d67fbf675b01219f15e82a4837acdefa30d714a7d9162550604ed51", + "public": "025eef68fc3790f499996747cf941398c8f90f57a47d8ec93cccbea84081b51058" + }, + { + "address": "2Q6guBQ4Mota7bUYx2TD3xwWd9oMRScu8q4", + "bitcoin_address": "17PSuaCAe3EX5Q2XU2L7jWf7m6TgX4F6bc", + "secret": "34378458342db0df22be23ec49aa0f0e911900447c6c7f8ee2e69b79d6e9d309", + "public": "029cb1684854b84198bc61cc8fd7f42d39d259912c6f7e65d228bef8846433720f" + }, + { + "address": "9DqzJkWCWK5kCVaqY1cXszUtNdwvNZJSJd", + "bitcoin_address": "12VwnAGLGnzqfxAozhvVwcamYoKLFeLeYV", + "secret": "e381d7d02fc85b55ef129e13a10d5e7980bf88ecb631d55a9564085b6955f7cb", + "public": "033005b5aac2fdba5442c2d30adf6bac3bef6989b8f71530c91a28a7fe76908a78" + }, + { + "address": "CitkJhr47JTB2gTQhwcYXBsJrxLiHqixK4", + "bitcoin_address": "1EGkZS1MHQWCnriyF7hcEv1xYfajKXuAYw", + "secret": "7c776045c28bc10641f50461d4e985d6f28687f01a6635fb52406e2c073837b4", + "public": "0251c6fff14db8af2f982a840921ab6b228bab890ffcb2047ca9999029aa26f068" + }, + { + "address": "vFUe7fcmLXGhF2fKRF8zfWCLUujDEgLVAn", + "bitcoin_address": "1LcK3kxj8BXaNERHAzHgMpJ4UkYktArkjY", + "secret": "f643dfd7a3fa2b46e5ea2ec8d63e1fa81aa0124f24cec7902b55e8090f354867", + "public": "03cd6e4e5cc5779262e293938773a1fe3537e8bd0da18f8353a002c516a491a364" + }, + { + "address": "bNM3CoJCTquonnV3fGAHSHjkXU4VVXAtnm", + "bitcoin_address": "19SDZos7b3sy4eo3Er1mJCMgt1ombCpnXF", + "secret": "b1303503a813b58803536d68466a197b1bb3a101ec9a1bf8fbd2369d49b364db", + "public": "02a1e47b9d9f2438582fb53aeb049c715b7a061ec5f5ff0a4390a27c1c9fb5daee" + }, + { + "address": "2BDGGpDt5TeQqtxJiwCsYfUqSH3RnDaJvrT", + "bitcoin_address": "16JgK6bvczAJ33hGj8JiT1hRtXV6tKYhkz", + "secret": "62ae0cb5fb989bac7245e194d13deb83bbe7997b316a13b384afaab7d8160c27", + "public": "02285851f4a07f8247d0e718dfc9ba3c0739eb0384025bd1088e5b2fc5075cb544" + }, + { + "address": "WPP7JbSpJbHy13p3tAtSxFgKg15tna37nz", + "bitcoin_address": "13nAsEPZDyyZsTShPoKDznQbGFxhnd6SGz", + "secret": "81158f1ca73b5b92e88e35864c2cc32a7e6dc4aa1dc69549b69488be0f939210", + "public": "0399c5c339ea989ac64e6c0b8c46088241e654ea12be19055b0f3602185f59113c" + }, + { + "address": "CLWUkduHRQ3VDqWCtLPu73CWRuyYRcywUh", + "bitcoin_address": "1NaZRwzGkXGXmKizewH6oveuF2Gk4FNV9n", + "secret": "a2e2f95581ae88117371cbae30bfe82ab85b16ab30ee792c99815515f4b03144", + "public": "021025967d1d2d7cd6bae8259ade3dbec5c5c7340f7cc96ef9faa98a4e8e89356b" + }, + { + "address": "2hsch7LCnK94zgFRBbL6N5nSwHHoZLv55iY", + "bitcoin_address": "1EMUGB1o13oyghChb6cdfzp3zuL8H4FK7a", + "secret": "919e0a2d7d8f4ebb28bb9f8f4725433850e5e3d3ec90ba4f2b8bed56b736b095", + "public": "021da1eacfee5cf2ad3c323953c8ee5be4ef8ee23fb2abe88b2cb4114c24402ac1" + }, + { + "address": "GJLtCoZnL4di3kHwvkJtR8CW92iN8Vjmcv", + "bitcoin_address": "17KbsfZzrFL7BvLqvNv2R5DiLzcppchR8c", + "secret": "e7102c8e401b2d30627764d44d7233d37ad7f5e83f935499581c4118e7c3e545", + "public": "0297dd6e1b2b55a29022578bcb8f2a97c4ebd1f04e14004c83742948baf15db34a" + }, + { + "address": "dF5jq7t2pMQJbacvfPFbxbiTRYi8dt8Mh2", + "bitcoin_address": "18ghfSG4kbbB4XVEbThxjgpjq1MtA8kcsc", + "secret": "aa520684df5e3db05607e59f3e1a039348113fa32f844473c5a3b5be8cba448b", + "public": "039230da7d6b4324dbab6315c9268dec4c913e9eb2fc2cc59daf29e2195ba0c0fb" + }, + { + "address": "W1DHb2MP4dfnLYgS7YmTGrwT3jGkyYzTaV", + "bitcoin_address": "1LJyrppAWTUEZRiTAPX6yVomcG2dH7mNw1", + "secret": "4dc879f1a4d782bfcd3921714deb2371da5df3b2f46537283ccbfe919a21ee3f", + "public": "02a1596f4f937a01189f494ed81fb8354101e1c5f633d34ab6e6b189c99bfd5d95" + }, + { + "address": "14Dzj9AmYcmqHADtmZaiaGAAYPTJF5iu3Q", + "bitcoin_address": "1QDzbnawkZKos1pvrxT3ggVr5FS7436Zga", + "secret": "3179eab44f64ab0e35f3b4842112eb6cbb18ccba16b7668866adcda6ddac4882", + "public": "0395997101d2d8ca8ab15058f8e465d4b87a422ab825aaa8616dc62373f01c81ec" + }, + { + "address": "Qt3q3oPi1HN4v6iPj3EbfaaV9kMU6Qb9hh", + "bitcoin_address": "1EzwZ8xDFtG2URCVnFrnBZqA3e9gtvttd4", + "secret": "ea350bd2044b3a9352393f5169c3881d8146a5577da478c0e2185b56d7e84e59", + "public": "028959d6882142bb5dec9fdd5b4a2c93b2762df2923598e056622b899ed332f062" + }, + { + "address": "2LdwMr8hZ7MeQ6uS5e89Jwq3KjqvWQguXpN", + "bitcoin_address": "1MWkWKQWFiwJJcDPXzQgPBWCM7M7c9exW4", + "secret": "2e145d25d59f1e5314ba3f290a81ccd6d71dfe6b998352688dda120aafeb2b4c", + "public": "02e0a927394aa47473cf544a5ef5a21985d14204adb5e1bea315096f41d5d38307" + }, + { + "address": "6z7d9KEtvBw8q2VZqz7PBSwHaCAYD9SBiz", + "bitcoin_address": "1EhFVjtJp6ZNPfP8SydM536oNkiT7Bmzs5", + "secret": "ec9dc327f748b8a02b7b931d761e41f9406fa1ef637113acfea60a395f07f703", + "public": "03610bf697e09ce02f54c830792678c008542d19fca2e625706fada2eb5012a3a8" + }, + { + "address": "SeECPVtog2nqdBuhCASpu5GFW7kAQ2aWse", + "bitcoin_address": "1PjnkyeEoJEJm9JtHk3y2MhkUuP21Pb6o7", + "secret": "45cf169176971687dd96d56d544dd4739b3c3c7b24eef38e2b2eec449259fa09", + "public": "02f2ecfb3e58709626fdc9de870bb11d8a5ada1b5088af73b0d49ee2397ebdadfc" + }, + { + "address": "2RfMB8P2jTG5dLcrLus4CTZZH6mke47G1yF", + "bitcoin_address": "1QBQoZjgwpk8sEfdE79yvJBiEWsAoqFV6i", + "secret": "72082e472815e974af51c5ca2611dbd65be5d498305616aeff0e21845eb2f6fb", + "public": "022736c896b113689d8891ee1dadd6e90a357d25143199202223637127c1c082be" + }, + { + "address": "jsHspZyTeoWLQ5R3GAXPDmMdXiWMos8Lfr", + "bitcoin_address": "1CfVo27cxanhQum3M8MZkBga17F5E7fx4", + "secret": "d3b02aa4038b4c0a71588a45d9f75a670c35e28c600cee1d2de7d2a04bdb720f", + "public": "03a2ddc1d41e53f6b73967a1b47a6928be2bd29a3c0729a267d71ef8df83b4a05f" + }, + { + "address": "25CSv2NqfsHSodz2cRueFGwAbdzUiuHHLxb", + "bitcoin_address": "17VxLQZsgBMTc1qRxQZxNmPTff2agkvhff", + "secret": "f556a089f138f59e3000571593b7f9559c1f546b5f9d1f475bcf6768611c9baa", + "public": "0305705d3549479c977fed1227e84c0bb1e349c6fa2374e4f8931c7592f1e980d5" + }, + { + "address": "2SitgCMQcxkiCF9Jf4pACRa5H5z1Y78BQ87", + "bitcoin_address": "15x55PD5V4NJjrNuB66Q6wJ8xr6cgzoUtA", + "secret": "219e289fee89a7afeb2fc1316e8399953bf879f607cbebab264bbe1927cf7527", + "public": "027a4480740e264da975b95df8333c4877180c546e26cd4ef280de97822491b479" + }, + { + "address": "Gr1aAJwLcHgR2bumhPAyS9en2VnRFZz278", + "bitcoin_address": "1D45eix9i8FzgpiAU4kaS2Q5dJgCxfnbjQ", + "secret": "9980f094f2582e0810ce8cbf488c44d68ed60f6a45b94d4a5a56f4dd95ee0954", + "public": "02554006809341e915b01dc0e9687efab3f00b274b47bb61febfb2b5898128b95b" + }, + { + "address": "22k2EBqKnNRAbuGRdSCoL9EkrfvocHs2w8j", + "bitcoin_address": "1L6RCuysZu71YC5SFzXzvdHToSHZJarrUY", + "secret": "8382c706a7533cff4bca93e5dd7428eef94df089461c3fb11c9dc9a0ee3b4bd6", + "public": "023f7dc5cbc6164735acf1e0abab395d99a41fb4ed26056be2f7844c31a03c48f4" + }, + { + "address": "N31RqZUYjL4e4VFFR14rtN7DqgrnZwqbC3", + "bitcoin_address": "17rCqiZHG398jnk5bficqiD7XLL338VFre", + "secret": "2b6c4d56af2d787de889eaad0d97a07f209851a2b6589edf5a1c7a3a4f33e09f", + "public": "0312eccb8c1542b4c5d108538da52ddc5850175df7a7de3b1398155614e792cc7e" + }, + { + "address": "9Pkybqiwz1EmDy2b9L9Nkc88mc6zvPRsWT", + "bitcoin_address": "15JjSXrQvxAzFUJvDBLmJTptq14Fwa5rTw", + "secret": "1c055ba9e77726033ebfe32237bd425a140110549d82e2311d086bb48af1608c", + "public": "035304c818e2c5c93aa671d150ec763a193064d9cd95d8711254a77c8995e3f52f" + }, + { + "address": "BKvj6kmqdx2j35qJdJ5DPAKjJR8vzLU9q9", + "bitcoin_address": "1H2GDLHWeRQxfwE8L64sGXgxtNFDC5SQSz", + "secret": "30130b623de1c08e1cb7ad95a1dd87a3a321f402b9712229e6ce62b7e1efc501", + "public": "026878a7175b2fc3d0ef5a458079eeb1b63d1a63505ac71fa0667239efb3a348da" + }, + { + "address": "RFR4UhmnBPFZb5sg7zyQrr3Jw4So1u7tmv", + "bitcoin_address": "15EbenUbT7unxDV32sPJ1BfPjMck9rt14b", + "secret": "bb50fcc6980cdcd78fb3e58dd73b9a0adf6fc4539c7e56b8af9f04437f740b10", + "public": "034aac6f55a6ec5e87ace89ae7823b04ef43851316eb3bf85b52a783cb9f97927a" + }, + { + "address": "2W81p8QoSnMKvTdnBqb91J2aucdtjwVNUFo", + "bitcoin_address": "1P2xqxJppxnYcvKNQFQkfXADNNceGoAXHd", + "secret": "b3e1914296ef75748cc4cc7772880186b0ea31afea9f36a92836c3d03d66b28b", + "public": "03d9677912768e36ebab0aecb6849c9e09b161e689521bb93e3cfd5687d5eea42b" + }, + { + "address": "rLjhyJVYUrqpgimkycfCdPfi77GGTerroe", + "bitcoin_address": "1EpZ2fRe21JQ6aU7j7B8fqgkUfX9xAKBzo", + "secret": "192af09cc5032ee7dc03652c72ef0936efc1a413eb74c3b98acb50ccac9a97a8", + "public": "032eb1861040be977bd41a7ddfb8230e6d9f0ecc53b43dc6bfe3f873455011ac45" + }, + { + "address": "2GahVFLmUyYWycDo9eXvq51ekc32VgxKwRs", + "bitcoin_address": "1LL4bN8fA4YrjzRA9VKAVw5GN68GbfvtoG", + "secret": "536ee03f10031d63eb4c1f4433598dfa587a9edf031c162770eb76ea300b2410", + "public": "02be4a70bcb626976057df5e8a87f2727c6dc6dec80c1a5aa63e14d14a606387ac" + }, + { + "address": "23CNqwuhjigvmeGq1MABeYoTceo6PMFndun", + "bitcoin_address": "187EcBQBPBCe1VoJystqpV1DwQQBfQzcyW", + "secret": "89a4c39206bfe84ee531233692ec4d7da526f15e24fe66b06c0f539920620f87", + "public": "028b954910c22532fc7a3af3b5b3b03460209711c048c19d46e756312c06f6bf44" + }, + { + "address": "2M7tTKyESdcKE66Q4gJpvbDGAxryCM2MfjF", + "bitcoin_address": "1MjZa77ru58aGi4nBKbufRqNPZ99cSsUKh", + "secret": "72c021662645cc9b8b2177ad62e0f5211ade182742976a8fbbea55a44c26dba4", + "public": "031bfaf003af08ef951f3ce58096fb09eeb6935b6e3e7e5a230b70c963652f9d40" + }, + { + "address": "2A8vRNeRFyB423goYsfaf2XJfFnwLVBEogG", + "bitcoin_address": "1CchGYaf9DVSomnUUNGs6UTgmmAXpQNTaz", + "secret": "3f193e4554fd7e6755b017b7db495c2d290351cb65ef3cce34c69e340cfaf177", + "public": "030b4d89c711efc08d9392c4cfa106bc1313c478826453fdcbc115d69866a6d896" + }, + { + "address": "2QRYen7D9tDdLeJD5bXuKfuYKBbo23o4ABo", + "bitcoin_address": "1AHgVNAhEB4QA5oPC3ESC4E4Z3kUFTGjCq", + "secret": "69da90dc5871fc04146acf8a1e4121de64e55b97e1629cee8d0bba6b464f6a8d", + "public": "0203ffa8dfeb26dda72992ef3d4126c989651cd6279d4e738110296ab9b90b2515" + }, + { + "address": "2SkcSFj97J2BQU5hd4QTm5onBeXiwRsVtmd", + "bitcoin_address": "13cjEmSxqGo4fFupSFxoAP6NEbH2rZydqk", + "secret": "3d3e5bbba89085b9f3925abf1a892d4e6be4f459e935e05a71ad04ea88fe6ddc", + "public": "03c1cafc2eae3d0f3b109f942234d1fd83489e040373477dba9e27a801b3bd6588" + }, + { + "address": "fA4ByNSX3amgkeVF3ZFQ44gAsDybhD1urU", + "bitcoin_address": "1BuuCW76UBVeYdm1CC5SQocAkomvpVv6Zv", + "secret": "68a10f706545aa984a8df888700d822793d8ddf9c1999e329ea6a579bbc33175", + "public": "02cd9aaccfabadcc58ae9612cc034054595a8004401c05b314121a4d83fd966339" + }, + { + "address": "2m6BdfcCCGxbSXELzBjGNnAMxPoej35TLwt", + "bitcoin_address": "1KNgk4fZMycncrxMhgTSWYPwhTgtNBs3jm", + "secret": "bafb45146ecd2536e463c08c6b3b18534dff04f03d2a2828c889792b83b2b6b7", + "public": "039ae122d8357f4d6053be5d29a3d9ea72926c6c3fe6b586179fb11808e561c0b9" + }, + { + "address": "f9hJHRytfpoEa8B4BpNs8gvT1unMjvTFpf", + "bitcoin_address": "15muvQd7PyVJPU8oyiB9HRjUBprz7P8SSX", + "secret": "ed643cc27ce09053207c7b8eacb7ab98cff341217f2d398dc80728ba3dbc319a", + "public": "029e91944afc94461da0b314b75f07e1aca7de0af053329bf9eca191f5e9480471" + }, + { + "address": "26F9aPSV1mHR2wmqWtiY2FdXwiZG6GC1WxZ", + "bitcoin_address": "1FwrmfajDWfK1FqBVz2oMZinzQE9PSTpmq", + "secret": "5207daceea9d884ed6e35ce719fbb356a33d6a2013e1d1159d021da4cbc4ebf1", + "public": "03d41debc510d99b3be9a3fd290ed44cb6edbd4c94fd6e18cef6faacaf8a931e1f" + }, + { + "address": "62mX2aD2aDNfh5zCrrLAyw5bPPoVtsmsaS", + "bitcoin_address": "17Hno7wUxD3rVeQzDKqGAZvXHSZGTyqD2s", + "secret": "c702c01d2a48e072f21d811535ec30edf8d1940957ec61bca0082e3959f6b2fe", + "public": "03b1daa11a074fee7dda44270d842753c49eb916c19066e85bf5bd0608409060aa" + }, + { + "address": "QroU1WomNFwEpKNooGfSVqJhaPepn82jx7", + "bitcoin_address": "1nzZLpwzmvqqmLXY6QMg1yteQpwjLz8Ef", + "secret": "21e0c30a0af7930ebbab4de7723849b2c712c670d8caa66c7a600c44774b1f30", + "public": "0379bef14165a6c65fc2bd41d11077d25fd4701afffb0e3203422cdc85d0cd2b88" + }, + { + "address": "B2qurPj5Vosgdb3vMF9tNSbzvCwQvZT6Vt", + "bitcoin_address": "1ALM3q3UzGhyu5XfdYeb1od4eMBMhLnksD", + "secret": "67538ed445290e3552443d4b0b5def55ce9e14127055b89ca1a58a21589896e7", + "public": "0374a42e90a4336a0c7147d624f69070ac3ad046a3c2540fac75d874a518f2ef6e" + }, + { + "address": "rKR2aYWXsKdPe7TfeLCKpC99zZe9KrTjMK", + "bitcoin_address": "1A5bMdW3iTzrGoFiWqoZHFmTTsqo9V4dgu", + "secret": "4249267d631619da0bcbb7296779c2c74df42c3a21e7fb0241e9e45ebdf31bef", + "public": "03d0abd9eeb44e08e9e57f2c750657113eca20b16bf0ad63c46834bf526b9c7067" + }, + { + "address": "2fH2mNcRGcwTqUhi6yBhieXGuU45AiR1rSA", + "bitcoin_address": "17YVZveUvUScfcdSxpnQUBr64CL7VT6qUq", + "secret": "c1bbea6cb9ae73181b273c5f5bd7918b4c28d0e3902efe8eefa837a03c8b6f61", + "public": "03289894de48c672ca592a35fd083859bbb1d991d77cfef8d20b0fed1159e80e3b" + }, + { + "address": "61w9ZrrWmSXprKv87Nt4QRVf7vy6xZxx3S", + "bitcoin_address": "12V4VPDFgJpwspsnW2QzmY28hv7v93LMyC", + "secret": "9473ca381c03ece2f1895ca34c58ebd8ecfd6469e486d8e15baff9badbb8798c", + "public": "03095b664426e488732806e0c08b4b7e5cd49a2653c029eee6931b93cb361130e4" + }, + { + "address": "EiRhqw7RKPTSwmkEUzmWTB9anAfxB2u3HT", + "bitcoin_address": "1JG7rDuS8AoNfBmXj4ouvXrcr8uacT4EnY", + "secret": "847acc35d8932f3f0d2e9fbc57557b949be580e93a7228a4e6b8fb154f448208", + "public": "033f3d37b184bac7eccb3fbe9bb6f3fc1416f7234b8670b67b65f8948e8f8fec16" + }, + { + "address": "2SNQebSnRZUyMKRyEZyemuRZWPiiN4iSUSu", + "bitcoin_address": "1KDr1J8wQ3UzNVVUHFk1wDRZGb7SH8R5NK", + "secret": "b065935a2dc91950e4381a88907ea5bcb081eb9115e88e573c8ee73baa3bdce2", + "public": "030d9f84a7af08f7d8b104113e72e1bf56efa5cf8f9bec50356f442ac71fbcf767" + }, + { + "address": "FuBAryyosutbMmanUFRzJyqwXkwh7kdGEU", + "bitcoin_address": "1QAELtEqS8CNwnixEE2Tat2Gnx4D3X7xkG", + "secret": "0ff066fed0235320963798399f2a8def41aa9700d2f84205f6caa63422ba6dcf", + "public": "0333e807c0be00d228199cb50869176b8d3021e58faf2f3e0403a09bd010216f28" + }, + { + "address": "ovUyGnQCsAFCY4CzfNGPfpBNe4L1yXoPS7", + "bitcoin_address": "1DCgVpSwBDgTsySoAFSdQZ7tqKhGoqNVtw", + "secret": "cab4652334411dc9504f420b936d5ac85a6a50c4bc5245cec04e08898ae6a236", + "public": "030ef30e7219e020b9f9e77240fed42739b5b47063373b8e5fa2a4cd19cab80d9c" + }, + { + "address": "z8EFc9WUA6Z4PnWDHC1rcby6mMxR6yq8uj", + "bitcoin_address": "1Hu7y3Wrv6JFzE3D97Bc9kobZA4sCM7Xii", + "secret": "396b40376a1f66fe79b8050d8c2b7fd72c5442429cea1de9c3e9b7b10b93c36c", + "public": "032194941eefbd5480556832f47fc9495f2dd4daee52153fe4bca687f13e102c54" + }, + { + "address": "2cgrysvL5TgPD3Zo1bQ7atHePjU7pBbi5HM", + "bitcoin_address": "1NVS8oFV9KaUnmZGrZPvWkhQiWHt8veWCM", + "secret": "66dd774702819987b97c150b2baef6ca69d7fa77b474ae6b827b434a4a22190e", + "public": "02e84cfcfbaae65066fc96271c87c2a74f6af8870cd5f90b19003abb2695bceef0" + }, + { + "address": "CBC3XTB4jQeeQiw1K25MBVy665AmN7ndcS", + "bitcoin_address": "18ncsWjDezvm59ysE6cW1E7xa6Vj6ge4d8", + "secret": "dec7e76355a27ffaaf7d706091b3321a877bff8acd255fda5a34a21819b413c0", + "public": "02c7e48a9e20852a8e25ea0670ac9a320c682d4a2f1602c1ff4b00e00bde283e91" + }, + { + "address": "x8Amv5taKJPoBogmVgNJjtyddz21hYeGzY", + "bitcoin_address": "1JyGLBsWTRWVTrJL4yf39iVoGCFNonEk53", + "secret": "a11279a7533f382fe1c4797a35ca4c8e62577de9d32be5002037abb63c917937", + "public": "037d4322a6cedd200aeb6403700b5f723b8a4aea1f922527657572ae7da751dc8f" + }, + { + "address": "2f5JG9tVG1eJsCV6MiSAXXn9z2qLu1WwPBZ", + "bitcoin_address": "1G4uhdgiFq25wrpY4R3E3XDxdLeXRQADak", + "secret": "63cb1ce295c72df8d9a5cdf619aaab3f6531a6f8f428fb61676f319f6443b1ba", + "public": "028e3738fa11f56333e6c6319de2acc192d998767100b079dec938c66c33447d10" + }, + { + "address": "2YnwtL7Eax6ALym5ZhtbZc5mVi69SAQa7qW", + "bitcoin_address": "1KFXWL2CQGV8CSrxH3tTMvRCRZAiV6AjPs", + "secret": "fabc193d52d4bf936067eadd28c936e7c4bbf5b65bdf904e00cc80e7aad8aec4", + "public": "037e8be0c5076b7b7d9aafcbbeb1deaa872bde340171362dca6a32595c08a71501" + }, + { + "address": "n8VxbBynsNFRjMpjx2PoyCsqCobNd3tTGy", + "bitcoin_address": "1EZRumeL2ieY94vBmbZcYrpznKcD7epLER", + "secret": "d3b704c0fa85c62df383ef4c5d691920cb56f8a2eb0c676662349f592b2fda35", + "public": "0223c0bdc26f80f6b8689286475a1f6a1462b3f763368c8926681dc212e8a49d37" + }, + { + "address": "2GcfeP65kgZJsQxgjTnAbUDNXUX5pMS6qwA", + "bitcoin_address": "1EuYWuVbq4XuSYu9Lw53cHTq1SaAekjNLD", + "secret": "3084c64edd34f827750497f7ae3c432484bc86ec1ee03c236c83c10c2189100f", + "public": "02cd4aed33c68c2380060d807b2eae38c8460bcb494a68882b3560e5e917808150" + }, + { + "address": "SC23LSoVTHMLfdsy1dZA4ysYzLWYwLe3VW", + "bitcoin_address": "17dKC4oDjtLNG9jSEYzc4Sa32sXHGMFS11", + "secret": "04c3536aec2531dbab08bd614adfd9839150b82b8f15cb7a7228b04171cf9310", + "public": "0357e08cbc0fae044ee6109394bb70675c05effee3d0bc76c95cd1f3814498dcb2" + }, + { + "address": "2mBQma7LZa74M3WFJCws6dwZKn3YQBMg6rA", + "bitcoin_address": "1NWsAKS472TnSsR7P5W1r8n5PzECDWbMKS", + "secret": "aa5e825ace5471708b05f3f50929c180f85e8cc19db9975bc02934a3e0469cd2", + "public": "03474646c2920067a9fe223c1ba7411afe48327370afa1298fdf08b8077d9ee19e" + }, + { + "address": "2FxdQDCLe7c1mhtKGJEnj5sTmcyoEuQwit4", + "bitcoin_address": "1K7zr65GSdnLBnHUqtWbK7EepsMS8tr6mQ", + "secret": "5732ba0920c7688da18a7d2313c982cb4f05de6c8f8cd953b57883c64d19d01f", + "public": "020bd054f35df3619681e88b8f5b1e02d16e92136067ea29d0e944065bc17febe8" + }, + { + "address": "opjMWDaZnfGytaigCzDS1WZcMRCZQEvDSh", + "bitcoin_address": "12moK5FPkrYiFP4dSvV1jgAvFxbLtGSYnD", + "secret": "960c1024d6b803bb61d729f56edaca88bebd8dd25d611cd90f8c1553d72cc23f", + "public": "02c6ca3390d4ca5b9f9d8ffa81f217438b371505f7943f1b821ccaf267502896c7" + }, + { + "address": "287avDBot4sKcLa6uVHX6CEActGrW5z9W8J", + "bitcoin_address": "1ARhCyyrn69uRSLXtngtPzjgzgYvA6GRyw", + "secret": "0b7f4c468e9b57a69e7af6887e055ff0bc9b6c0dbd236c738b8d83e515eba25d", + "public": "0297142932f8df1b0e6def85fad14db4f5e99cc34a2bdaf9e1d4d94d5d43ff09b6" + }, + { + "address": "VDkbYkMPHKbXHs3hLyh4XC5ohQVUeyhw91", + "bitcoin_address": "1AoKxJWmoMqnRJwy2oz6uQhyEPufySDnpj", + "secret": "92e524d5eaeea948e6d5562488d971f0e4dc45d2a5f94dd4af7191bb91b93fb6", + "public": "02a5d4694d6485b3b9bc18e875d04773fd35eb4bd68cfa10bcc6e9348b5c845965" + }, + { + "address": "mAtUfYshMbtEJzjuKYcU2t6T3dZe4y2khb", + "bitcoin_address": "12QK53M8vARSrx7bFmmgcqUb9RQ8dkeVcP", + "secret": "c553186bcc8b7b6da5dcff3f522153b6a5af4df9e358f028e3fab1b02d7a7dd9", + "public": "039a29f469d54ff46f32bc5f246aa5c3714480304984e3232b723838c4d06dad0a" + }, + { + "address": "2NAdsgf4ZJJt5mFNw8at8hCR5RMQDNzwiwJ", + "bitcoin_address": "1L6effjU4hnh1XiAENiNKfLC3qNSpbUB7B", + "secret": "652f9b2e81b4882b0a3ed0acad1870f906c47b741f3264e9437578270a77fd6f", + "public": "0224d49247228129e7e7ac57aa56be2d2a318dc57841975d5d11400ec226101326" + }, + { + "address": "vcGe4piafnmA7HooScfnaPoMeAUzkGV2es", + "bitcoin_address": "1X5EkNQjFM3kdfZxmRnZEaxX8MmVzngvm", + "secret": "3d36f0ff8d896a4e29ee908c90269ef4da1950f5d43d709d46ebef82b42ec902", + "public": "0232b6196f9a91a97bcef66cefd06ced834b6e57962915762b7f3d93347eb7512a" + }, + { + "address": "TU2RS7a9ZDUuj1X7fTBXhqo9jJpa5wRGEh", + "bitcoin_address": "1L5XzGGUi5iw3unpdrLSJXByWckFHzNrKA", + "secret": "3404371d8a927f2b948ad1050a085d8c152051e6ee97aedb77c44ed3f6c0a86b", + "public": "029b1d98a32c56d68abb0c7b74f5508b4b0cbb23ffe2d6c53e7859c8fc047ac16f" + }, + { + "address": "2d7H8CquSYs2nin9jaZ13hGZta5FsStFZo8", + "bitcoin_address": "17N9cCbZFEjuopQRYcHmp7dpVjGjrQjy65", + "secret": "5039e52f7321bfa5b97ea5b6bc585df9e54d5e5d1a27758135cc842b65898882", + "public": "03e9ea87ac0e016f2fe8b789bbfa4a941c3cfcfdbadae82c4c5fdb13b5ba7389f7" + }, + { + "address": "AvV5YY5QUnFLLSJMKhu9DsuxxrZt5wpvdQ", + "bitcoin_address": "1Dt6WBYotbNB2FTPe8RP6Vpj7Nw2qyE2gc", + "secret": "a75da19d2e65a262e1a3560376e2d292a741f3a4b679fc3b86a6f342c41f7595", + "public": "03388b89a69105f3fbad86cff7edbbda8c7a6b65f670bd1ea65c1bd29ab8927794" + }, + { + "address": "ZnvGRWPCyM8BVpFWNMwAuNJu3W9Qu4EcjM", + "bitcoin_address": "1NgXA9Z7jYk6rhecxNVmZTwfbcWCHzAdFK", + "secret": "b36e756f2985b372c860d9c8ee82d701446a99df55369a09d9245cebffb7f6fc", + "public": "03211ffaccb7fc6be9ec8dfca941bd18a24834ce783071324e7797167966c169dd" + }, + { + "address": "qoVWHHmz3cst7ejrDs5Ak1veNqXvc6bKNs", + "bitcoin_address": "17YWajL6QKp8zcq3pPVVqveA4Kqk5AQdx", + "secret": "6d9ba763e4b5ece32546a46271be8024627663f8a05eb90cf7ff10aad43bb0b4", + "public": "03ae2573c7cac526eed1b7ea204d98b57b905ccfa565317562903238d9047318b6" + }, + { + "address": "27WSr8SckJGeSd9wZeuWmEXhkwZagupQBhQ", + "bitcoin_address": "1cKCM9VMiLrXyBwMWRdMnGU8dq8zKxcef", + "secret": "0eed689ddc8783a2d7405b3c7b727f5e283adf51a79c00633e06f4d7af69ea71", + "public": "03e01b17ede565155704d1d38b169772189c572f3d8daf7217bf10cfdec744f00e" + }, + { + "address": "jfHgeppkfWrLrfLDefT1ubVcX8CZtEHrxd", + "bitcoin_address": "12tLeB1kzBmNgvmSTzMtghuDNhB26nKCa4", + "secret": "ac6093af30358cd772157c99144ca77b8b51374d4d42d16ff4c044a79f659d1b", + "public": "0244bb127e905e68ac4f77a02d36f8bd43a180fdfda205c5dde80c216027fe5d3d" + }, + { + "address": "7kUKMbna5G2BnYdRaUNguDcRxZqU4DJE5Y", + "bitcoin_address": "13QeXUqhUK4e12koLxVS3zfbUbRf42j4Vj", + "secret": "aeb2ba2cd9a26758c46ff42fdd59fa2e109a57a2a7e0b6a71cd929cfb7d3c734", + "public": "02020ceac637c2e0a627a5b495991925432b2f38b278a39972c6ae3e77b5cf72dd" + }, + { + "address": "uXumjBr72CzvyStXFAcQZ7KyHazCGC7bYF", + "bitcoin_address": "1Jqf3ykjKqHBVExRQmE7ZB89pxnHZtj7Ju", + "secret": "3e1745a1032a59a4f381389fb0371169a87286a29f9d7697d095b5d65cca2457", + "public": "02da2344d15c5d43d19b9f350b1c725c636004934f087b67b240fb44d674344af7" + }, + { + "address": "2cjZgqBybtHQNio2h1hmb8W1VuNHZ9CiJMo", + "bitcoin_address": "1BWG5ECUjunq3LMtFc8g3yEjLAT8UKREsi", + "secret": "866bb52ec8c6e51e52120b64bc42277b0123c5d200ea17d20cf365eb0f343087", + "public": "039391283693aa699e839a7ac00962bc23dbb563882d1b5db5774418a5d16093d4" + }, + { + "address": "2KuhVZmuxygrtPKYXygnzWmrJxyth7aHmHo", + "bitcoin_address": "1NdohSNmwJqWyVuyvjHnT6yXxnzugLVv2E", + "secret": "114e79415b9b6162578bd08983fde25c8708fbc204669e32d244761adf81be6d", + "public": "034f94c72ad911244a5dae6a7d2cafd9e1e88edf87d244fb8478ebfcc607c8b5c0" + }, + { + "address": "9f51KEwdZ2k6fbJKw2No5QcEZfh1FcQT99", + "bitcoin_address": "19igwpqvooHb7UDPum3T2YREc22UhkGFWE", + "secret": "e36c8f6818e4f3a759b1f1c22339cb7a1a560bee4b590270ecde2789990280a1", + "public": "02dec657da3437d526c7bec71d91cbe3ebb9993e7cbb69b5844fe8d02c035a29dc" + }, + { + "address": "CUFdMUnVtSmLtXAC5ktYSSywEaQ9uxUivn", + "bitcoin_address": "1QDa15EVy7LEJwvGQ6MVhzhfZRA9Qem6Av", + "secret": "f8c15fcb6c56e3d1a5f13b02f3d6f3d751c9f113ec3837ac9ca49986e5c79938", + "public": "032e56e60227fdc1c4e7100e1a5bb8853c102efd072f7e3d3b255d98da7645e7ff" + }, + { + "address": "2QVfVHQ7c81vSHQjXwjfueUxmycPXeSoh8p", + "bitcoin_address": "1GW4QVL8BP8LzHPgshrhWtGix9xPAx9wQT", + "secret": "dd71cbe703a2aafbd6e4e9e33d5dd9845d432ca8c16dd0076330cd2aad1ea18a", + "public": "029f3682ffb06648d5ccae4e579920840a162e884cf18ea1c76f7861038d41c715" + }, + { + "address": "2aT8vQA3MncGyw2XfhqisJUuTeL8gt67r7N", + "bitcoin_address": "1BFpLwhgCrdrwGV5YjVkdfgpXkB69vKUC9", + "secret": "6f4002a5258fd36acfca3ffca8f46148788346ba97e290ce1580e3f0e40a67ed", + "public": "039ca89216842186b5d4c3d8824d9a62aa7e6a7258c51fbbde2b7582c6ab3cfd61" + }, + { + "address": "2LjJYUvxEeiuSHdmqa6WriCcrVMUgbYsC4g", + "bitcoin_address": "1D86PFjxWkS7yrWbzHXZjkPJFrCqeGgQrR", + "secret": "9d5b1907abaf169e86622e520f46530b15016a3c56e6473980783eb9e7e3bb1f", + "public": "03d47c7a4ba64efd5ceec1d90370dcb79c4a5792334f2a8fb3f816ab3de0aba6f3" + }, + { + "address": "H8WyRMJiyuttgg7raK3MHvuaP1sYYVt2GR", + "bitcoin_address": "16N8yFeB6mCdttT8Uf6uKMstFyPY5wFkju", + "secret": "d8d258e9d6ac67a32b2bbdb2fe56c753a3d4b2c45370c2081f539c87119db3e8", + "public": "0237505507f545ffb6e5762d3ee5ba7b2dbe03e1cb0b73454538331009dbb06474" + }, + { + "address": "RnvXdAurMy5aeEpGKfanQsphVYXtvPvyws", + "bitcoin_address": "1Nuf9X82iZEZMiQ6aLLuvW6HzmooLj7oAx", + "secret": "b3767d3cb4903870b7c40b50d235366e58fb24c7a2e5ac1607ced94126d308e8", + "public": "02cf83f66d10e315d6d84644682cd792e45cbad330704c7fc8951176c301ce6a09" + }, + { + "address": "2EGguQkd9xNM6rz43bQpPH5SUBbyPCypu2Y", + "bitcoin_address": "1Nc29WpkKqqScnr2hk5W4DByXUL1jM2jpx", + "secret": "544b281008d4de4530b39b3cbfa257b8d6c7df865fadb0f3ff875f0a024f16ad", + "public": "03b2d7195dabc09a3ed2ac92d44436ad57e5150d02be25db571fa2a9db513c72ed" + }, + { + "address": "2Zo7LMedeibm88xHbD6BihxYF9VbxueAsww", + "bitcoin_address": "1GHCjTvW4BFZzSL8GVoCXsK1g9ZpEMAfAD", + "secret": "10cb3fc3bfe1039921b82dd2be1a036ae7d989ac5f1308441e7cb27bfa999706", + "public": "02b69743fab8f7ef1c5572ed9efded6802054e8668c8372a718a1ed231f376e9eb" + }, + { + "address": "Er7xL49Yz8yTdxTHZ2aWF899fZwuBcN2w9", + "bitcoin_address": "1Mx6CuyksMQT68nSUTHZDSgVtEFcLauRfU", + "secret": "ee2dd1b1a27c83e12f78fd0eacb66c0b9ee63f71f49f62f2163cacaf24c96724", + "public": "037c596ce52db6b28e1a9080c0e8d0914768e7f7cb4c1b56ae01437602d91c14bf" + }, + { + "address": "Ssu5YEgifibQKpoPKNZmwPVAKEt6gdqXrS", + "bitcoin_address": "1P97Drm17gpMe5DG79zUfvSFgibzQnu9Su", + "secret": "94c8c227b8cef1971f0c88b79742da648da391682eaaaf72639bfc516024ce14", + "public": "03e6aa8cd03076584a0664a1d61609e20ea12e900eba179c7c0f1c935ae90faf52" + }, + { + "address": "6ZEir4GMrZ9dCu3LjF1txAyKxmHP1Z6B64", + "bitcoin_address": "1P9SEBtiorKHHjxSTrBG8WWwZ126EpiuKY", + "secret": "567c951ab4d83106e0ec0dfcabf84d9d4f553e828a8bf29ba3ebe2c3f2f6a6df", + "public": "026eb292c89a292a5386cf84cc0150b9d246b80e7993b15bdb63ac6ad84ff3ebcb" + }, + { + "address": "uF1CcstJsQwissNWqN6HUzbedUVHeWN919", + "bitcoin_address": "1P2ynsPKYYwX3DSBc5XuHB4MuZrTcoEgcy", + "secret": "3063086d76d5cb9e8a6b5fb1cfe9cb962dec10b02f84b52823ef66a29031b883", + "public": "0374369d1129cb7e0ee36c245f1de5cdce492addf44a3121fadc088aeea218b41c" + }, + { + "address": "LumhVq7XrSSzaV6EcGFcNJa2PRhUw4EvRS", + "bitcoin_address": "15zLYE2xMbJVhA9kvUVEKSD86LYCNnKgr9", + "secret": "b8e85174ad383c1b31cf412e36a8dfc5c7a70be075bb6dbb3f1265c8d45a1716", + "public": "033e763b16e8be84bf728c03a8a842de3e9b668db298e1d7a9a42fcbac397a87b9" + }, + { + "address": "928Epy9MYb3aXiSX3jViUK2quJUHddzm24", + "bitcoin_address": "1EsqG1QsP8Cr91a9pk2tP5BN3pjWgqZ5kF", + "secret": "3b6bf331929bba2a60117ede5aa6e82be42dcb59fec6dfc8b7d56da04229ac15", + "public": "0247c4215f2b6d5b7e9741b229653aebcb9fd407023ce710dfa8a0dcbd6f2061b8" + }, + { + "address": "x6fedkRZ2f3uAFWYuAhMHbwvezuW4YakrZ", + "bitcoin_address": "12J9ccTzUjf7DZpPmmy7kLvSiciAnqqp1i", + "secret": "be633fc2e4797327d173ff4129d17b7f00164cdf4e6bcda36575ed50e733f6be", + "public": "03b73a0b399d47ce4790adee1f5b7cab3beaf7d127ce8137d93fd8dd0589e69fb3" + }, + { + "address": "jzij8bbtnsQMJox9mVxE9Wbt2cZji1av1Q", + "bitcoin_address": "17CaGTQo4892j327pvCtS2WZ6XDzJ2eBL", + "secret": "6c5f2687c2a14db0bdd44e293294da17b6c48cf1a245dec3a724a503ac7d2d20", + "public": "03ea4ff6cc2f3bc601adfad608e0558418bf0982b803bd6c61fab1d5f7082504bb" + }, + { + "address": "24JypXuBsutTE9Au31byi6cgYUVfXDa76Yx", + "bitcoin_address": "1HxFNhvUD97TcpyNtrmdi5K88MobjreZSA", + "secret": "caa801e43715a4080604ab1962a74b6985481a4c42377f5c210b969bae817522", + "public": "02fd5562bea861fec333eddd21a49611e9efaab8e593b7f8898614982e414fa537" + }, + { + "address": "sq1oxMdWKu9y1GqYDQzydUsLsnCaSsgFdV", + "bitcoin_address": "1KVXgxAmNXjZbMabPypMtFfNsb8AP9h94f", + "secret": "115a9ee9d3a969c4c6777347e3047af13158f6b2feb2f96a207fc2bbbe6b989c", + "public": "0357723a1e36cfc4ca932d05aef4ff571a74dd01d72bb21df6a1df2b6dd6634c06" + }, + { + "address": "XF3MJCJf34rbZ71QSmTWzsc2K1EW5zp11L", + "bitcoin_address": "17UjLtHKnyqnhYMGrxQqLBWMqxVqhZh7mo", + "secret": "a15da09058bb45eee32fd2ea2421f1cd9910e1f822355aada7abaf98ac09820d", + "public": "0296785ce0760c05db6e9f81d1650d5dd71a70fe9881039592e91f3ae1f905cf37" + }, + { + "address": "2MuLPu4CtC8rCaGvVXdaFsvZCGEBSFquKyT", + "bitcoin_address": "1k89yL2Xd21CpAo7FsS331ttMZxRhCzWL", + "secret": "c2d06a485140ef111c0df041d019cf7f5f6f2a57a88f98b4818bcd3471fefbf8", + "public": "02d037fa293b9c13d7332fb57873a5c9ef6fd3faec48e2192073e4cecafa383c7f" + }, + { + "address": "2AjTTLFwqFBTv9B4TqEttxgGxd6qdb6Rc95", + "bitcoin_address": "16Km8QNBPrV7cQBysdh3DapXJGtp3LrGqz", + "secret": "00755ec32e300f700b65e584e00d642a7f94b68bac09fa56d9dd52f68367d06c", + "public": "021767b3cb8da064c221e18e5da4aba858c0783253b807cb0e7d3034e2a6971a40" + }, + { + "address": "YVao3N44KWz1gWwFA99SzE4eEWuiNDQa6", + "bitcoin_address": "17uxy2HRojBfQ1JE6My6E1dif8UqsXLbNf", + "secret": "5d419baf49e43360a2db92ff445473ae5369a3854274088447f3b8aaa730e4a1", + "public": "02671cc9348c2b37412f7be7f44cfaf887878faa61ba2977d76a341121ec8543f5" + }, + { + "address": "2B6CQHAyf7hXBdujhdth8m3iXeGKoj1cUy5", + "bitcoin_address": "1GqwLCuHprE6SNC2yj5LysUqo1WnGDvhzh", + "secret": "5ce953dbca541c64186c6cd9be8ea528b4b2e46ca018da86c568eff924bc2950", + "public": "0346f13ae7df82aeacc3f1a0264b7e1d710f09e8464acd68989bd4009d8df44912" + }, + { + "address": "9qNtyuayg8LsLBxwByHFrSo6dMK5okoFVj", + "bitcoin_address": "1NP1k2Bp9N1yHGpJgBMKY6QVKWyDjSWnim", + "secret": "22c33cd73e3c93597e7a30e0e2f7263100dff55d1fbb1cbc28862a4adc01e393", + "public": "039f4e4dcdc790708675a86f89ff79ece90e2d2db6963453bb05639cea1277e0e6" + }, + { + "address": "KEaVf8Zwk9erYrwqYg5vLuTWGDZfFZvzH6", + "bitcoin_address": "1B4eo4N7doKvzoQuKAHgLMQVgXKfJGwuAL", + "secret": "52b2e3d1fe43daef1de9ecc03f26d769d2a585e75caf027dcdd8e9a001de559e", + "public": "02e4ef2ea0fe31a8cacff87eb21d60c54bae50e6e69c725c06dae4851853c1f821" + }, + { + "address": "273HzqvvGsbfqN4DzmLXSHwxoQGvr6h2JDa", + "bitcoin_address": "1GEyYAJytRgzJzQ5xy6syMXh4FLgaWjiMU", + "secret": "76ad5b4e12a5ab1a7b8b229bda86214d00a8c96a48d36ea2b10c7407ce385477", + "public": "0251e9738384fe9bd8c9bcdb49db45b37cb817032ad5e972bbc4e62fe221f6537e" + }, + { + "address": "tCmpCM4QEmcW4KmfyGJHCUGtdpwKM95M36", + "bitcoin_address": "16NKPF5d1LJtdSSYQsprmMvwyEg768DwBQ", + "secret": "430d620b2194fa6ae143bf501ce4c6afa86cf59deff48e94d4a61aa0eac3af84", + "public": "0336454abd9fcfc96d5b9089939265878f0c192beaab0266792496b3547b999624" + }, + { + "address": "2Nr54S79UTeMQai98FHMbytUvoYpVhhTXSA", + "bitcoin_address": "12eEfauFKCHYrcninaWvuWpaRve9oHQ4Jw", + "secret": "302e30106eb4510299016075449887cfe695e7b5bcc64acadd2b9257caaf8307", + "public": "026f54ddb61336452eb33fc82ce2eaa1cb2a1fc463d5061a6437e6a379763d6725" + }, + { + "address": "VETgdwGFKAc417h7jG8AcpDWvVaSvJja3A", + "bitcoin_address": "15wAXSyBUk5MHgqawWv1gkTwAyKzui8R5M", + "secret": "ee896d44fd6a6d9a3c5d54843e1d5e2acdfd8f8b94a89e971af11250b7001ab6", + "public": "0321a92b89701a16780e524564a01b8a8c487927f6be5e5d1e8e503c1db8b6656f" + }, + { + "address": "aDooZkbTToo2zhsthv4DLzy4b2sB1hL72y", + "bitcoin_address": "1c22WrEvcnPFrrySe5abwnTRqNGUX5aPL", + "secret": "5036311405ab856a08752b575c77f9689d034804fd88013cd61ab1ef8ecfdc88", + "public": "0332eabe8dd5ad5bf2df2eed4c194a194688f55d559873362e19879486395404fe" + }, + { + "address": "2TeicjTeiN788NHkpLCYXabcViRYRzyHnS4", + "bitcoin_address": "1PNmq52kFBixzwKr7n5FDsMTaDKAe1YJ6v", + "secret": "0d5615b3585c8039e8111839037d5f278761e3e2516ee747b92a8bdfa8a3042d", + "public": "02e46c9b263f06841bb8df6d05edb7f965272cfd7a84c79a7cc34eca522f3d5aa7" + }, + { + "address": "9gAGvw6ALttV6qsCv9yoHn2duKkvawUMT5", + "bitcoin_address": "1BRbUy6tC4dQZ71BJNcnTkJ3bY8WvUP1hj", + "secret": "4461a0e36f4e178dd98d073e524f6c175c4af13d69e5895ca7d113155b7058b6", + "public": "036d44c748a5f4a0da05e9f08412ac59370fcc1456657c8da02696042b6e549319" + }, + { + "address": "2RymuWexhMxWGqZMK8H7gjcpKHYzJ7KTW3K", + "bitcoin_address": "1F5j24yZMAG4xoo2xqXWb38MaQY5tbecUH", + "secret": "fef98b243643886cd6eaeb4b03718b2583e98a5cd335f7aa145888df0e3e62ac", + "public": "0363f7994223cc65f5c344a5418bedd4fc7ec3f153651fe9babff0e387c07cfdb1" + }, + { + "address": "tRzJDgcGujKjFLvhiP29DwCFcSENXwD8NQ", + "bitcoin_address": "14Sbfo7SrsRfgToGbzrGkD7CTV117BWxmn", + "secret": "c550510324920ebc38c2b3d8f7207b45c72f53146bbe75297f65fda29adefe70", + "public": "03f1c9b77f74670325f9ed5c9144405e227a4ebc19fa2f71f263197cac542f1090" + }, + { + "address": "4fnAyeKwaaFqhL7KpWVk3dXGjTUKkZMWAE", + "bitcoin_address": "17KH58rJ1JtZvhSZLKmSLVkv36QLmPPDGz", + "secret": "adefed215155b9c86cf6b529cdaedeecf54813be2a92b7e25cf3607b635def63", + "public": "02b9ee73048d5e1547f6064c8ef19a40e334c239a0d50e2e7742881abccf4834db" + }, + { + "address": "cUg6C5xPeULFUYAi7k5z825UCFktGr8QHg", + "bitcoin_address": "1BdFqfDMzf6QACebeepWuGHfEjSEpjgvx1", + "secret": "6ece6dd12c75bbc6147091af4ee1eb6b9ca83daa4c8c74fb857dde9a559ff354", + "public": "03ea642b0f6dfe84807c2be013b697e811b056f38854185c0624e509fb115696b9" + }, + { + "address": "vJVpVYYvDY4mA8kdrtuo8W1A1TeyRqou8y", + "bitcoin_address": "1DJwRgEdbkJU5xUXcYAqmCpHMsh5vKhRcs", + "secret": "a1536d32a2a0b53847cfc69a2ac15934c8f4b5d5d3601a7ce683f454c958a9bb", + "public": "031edeb3a15926ab996d39934138f4776c8903cdd2b3373b93464a19352fc0119e" + }, + { + "address": "y8hhvxPjZpinCChM9K2PLDBW4g1av1ZcHE", + "bitcoin_address": "1HP6bXe4f6nHJdBd1hhfohrjPpDLJfPPP8", + "secret": "e29e15da9d8b981d7e511eee9ce4b3320b72eb476a7ea405431b15ebb04e8a9c", + "public": "0220c85610ff73b1eec67c09305d94cf094acdde37396da909de697e6c2a91f9ec" + }, + { + "address": "2mMfN6DGbDSjaUVVkigCvBUvrW2Te1jkWCt", + "bitcoin_address": "1CNZYN2MnhfW6bVNzJLQTsXduLFLjMUod3", + "secret": "8409735d24e573dd2c8b49f9eed1a4b43a92a0b0538fdb1a3453b012b7862c41", + "public": "0203e0317f62b21015090c038e8402cf9f68e90b4f309f848479290fff989ea77c" + }, + { + "address": "2fZZnSM65DF5XKtnNttaVkNBAEky9GNdoEG", + "bitcoin_address": "1HWymkV4HSVfxkDZBpdNobaHiC6E89Aspn", + "secret": "ccc43a9f9b194263c547e8bc7c386513d0aeed9d16747e86ff0be5e70994515b", + "public": "0358b3ce59c1362d05214c30b581fc4571053672e84c4a7bc2a94293f4b3f47c89" + }, + { + "address": "8yh8LN8kFCg3pXqEtzyTKNMwyjNAVDsNVU", + "bitcoin_address": "14F1smGV4d7tbSajzddZ8zq9asbB7ZaMwN", + "secret": "38d2135b506023ea860c37fd7b7744daa81e25f170a746cbcd7dc0ecf54e2415", + "public": "02112e98e0e9c524440a36f77cab80a971369f4e21d9e19492481318ccdc081090" + }, + { + "address": "jkFvb3j5YzTCg1LnEKrUGnjbAQmJqFhHuc", + "bitcoin_address": "1F1wK2o5Rjz5jDK9j41nEVyBJLTRYn3zyj", + "secret": "be596616d27c8e0396ebefdcb1897829bb39a7710b92f17548ae6812cb367b2e", + "public": "02959ca4a318184bc71c8e7df8636fc4d6cb3704386453967972fcece861df57df" + }, + { + "address": "m7QnzaABKgNqx4ekdVLf5SdWGUxVSFgPHP", + "bitcoin_address": "17sds9ESD4mUYD3ZoVdgbygoinMs8zZaJe", + "secret": "d1c9d0827322a843c37fe58d3169d145d5e8477f9714e44ac6575de9f20c5bce", + "public": "022169ceb4f864b4766f7f1c085564f1334a63c6c7611787ea7f80828d9e41671d" + }, + { + "address": "2Db6fRqRY7fkYpdFMp7ik9eSicRHUPcXXuY", + "bitcoin_address": "184aMznPMUiwpBiu3Mtxm8KSorjVTM8GxM", + "secret": "1ca5d69c367a4dd6f7ad4b702825e17fe66a2c0a6e219b03f00f4648598b056d", + "public": "0215e7d934e04d7b12385ffbe6e55b4dd539d4bb45b138396c18c5aa9854562896" + }, + { + "address": "6MiD95xbpTiX85WaezBFMx31qHU2Cy8mGb", + "bitcoin_address": "18yrEkNRSzBHBcBwEbTL4nUJwL7R9ris7Q", + "secret": "cc3e2454363c09febf2940941b07477d226af5ab09d598f57818423586ddc3a7", + "public": "025ed910484ad0d8d837475339882248638efa73f1d96b29ee681b8dd1f3e710bf" + }, + { + "address": "2j3PE1Gnw7dimka8tbe2DWM7nadFtKZDRCi", + "bitcoin_address": "15v3CYiGp1zKpioGNtPYtxhJCbJYWcbrbA", + "secret": "b33249380ad2c5ca60577db005bbf15e24cd260e5dbe06c8da9e877373d79bea", + "public": "02e90a239e782a8dbfbee2aac3d2d729bc45059a80f67ee3d52ce4e24b24a7aeae" + }, + { + "address": "oUmQZvH1kKqfKEhj9EkjPH7mJsDd9PekUH", + "bitcoin_address": "1NbLyu2Tz8gLw9dkguHbGt1arJf9DxUxak", + "secret": "ed2166711c446df7efe1615619a99ae9f9192cd548f28c2d76e0ef224003ea01", + "public": "03f2707b4ce0ab1664b4ec6ca958e9a6ad53de97687b933b11f36309c3ae9463ec" + }, + { + "address": "P381ZTCxZB7XJgTBnv8Je6YdQj5oRCnWrV", + "bitcoin_address": "155bct4ZJVXpEGdfEyVysBeNsnSxGrq9KC", + "secret": "20412f51c1283546151fae13238c8173f71517e839df2399f59d6975d867ba00", + "public": "022fdf6aab50d1c7ba9f07dca660507294c2347e9f0455e9d906a8b76d46232be5" + }, + { + "address": "bvjjm4USaFY153twBg4k11mKKW1SZri7Kr", + "bitcoin_address": "14BYVXuy4tNhpXAmWrf8819bbW3hiKxCbj", + "secret": "9ebc684f04adf27593e3d3862042c867d9e7b93a15486d1b910cd3df01d6f5e1", + "public": "03a26dd8d7c5536fa1ba0b8ea88974a1449796bd7a03613c7a8d0386f634d83605" + }, + { + "address": "SjAB5JX8MngBBmZqHAQv6b4xBf8EU6TUdH", + "bitcoin_address": "17wt1fG9spG8JeGzdNknHBUUtbR7X6i8Hg", + "secret": "ef9391016d560ed1bb76e27712b3eafba14a97d765e3a2c95e4a33c91e3daba7", + "public": "03e7e8262b1b397ef1f5d956b9b4ef46a87670c6e74bb84dd63d649074d6a90d95" + }, + { + "address": "AaowUNsWWGCTSQt8Ubg9t7t66WXgNm8qj6", + "bitcoin_address": "1Bfk1iu5tG6zczSQSDCUK77FUN4SCA4V7k", + "secret": "ce21b58c3a7f7eb5d7c5231a906215a39d13771d903ee07b1bd6ed2175180f68", + "public": "03c5b1e76ad124d9558599a670af3f196aa8380ba2068a3f8fd86b78959553af50" + }, + { + "address": "7M5c2bpc6vChU5LjgSenmEiRxKvFrjdJRm", + "bitcoin_address": "12mhvGJaCis6dpVYAsMnbnxdx2nV2nBGc4", + "secret": "a9b800fd9e55855e3938b2d81b7ef5f38c3ca48f4ff6f16e2a846bc8924daf9e", + "public": "02db984277e99de74db246766d96923d0da2025588bce93b3002f67020bef74a60" + }, + { + "address": "2A5Bu1Ho179P2EyoNcY6iuuweMpnTo6Dszj", + "bitcoin_address": "1KB9xagLRno8W29YAqTx1Fm3yCFMLN4Xwp", + "secret": "916a59a3fb9e8cf7ca8b57e12c479a3bececb4e2cc045b138c30d24193b2907d", + "public": "03f05db64aacd7f1872deade0890c84144ce00e38a5dc07e2880079f8e480a2eab" + }, + { + "address": "25dcnottoLnueHerPbKAhZRmUoXjKHpUTi1", + "bitcoin_address": "1EU5jcmKPkWy49mh2Xq9zmDkm8JXgT2Kwk", + "secret": "787132dcc79020e6037ad2b33708a2ccf0221154be3a53779bb13ac7fff938ab", + "public": "03b740ebcd062875de83f984c37d71f1dbe56b054bb39ac1d1294d52e8cb702d58" + }, + { + "address": "Yez45aeDFBzSDLpLRT4j1ZW6Wu4dH487QH", + "bitcoin_address": "164KhWZku8ALp5BFjAYPTTocW5CjeB98FL", + "secret": "b55fe82dbcab00982ae20bdc5d6d2205132161e91eb4bc80646e5d3e56e26deb", + "public": "024b71d54e31d943a04299bee61abaa0410b665724fddbc02062544521826b66c8" + }, + { + "address": "4wzjraRSLhkmQBfdzPYu9DcLoJCLtg4PjN", + "bitcoin_address": "1E9z7LtRUAvzS9icCUpA7A1WyU7o7tZ9X8", + "secret": "a0297d49a0ac7db02f303fca9e342fde7d3fa9588322a50be65711f3b33125ce", + "public": "0363eb9e525f712ce3549366d42944d9bb11f4489d38f61d30bf319f242f0bfcf6" + }, + { + "address": "PCgs68kierVHr2ZqQKkACJe5uFCaqn4Twa", + "bitcoin_address": "12i9spEqwzTGnVrQjLkdCvr3bjXFQ6oxbq", + "secret": "362097a58bdd050e595df2f2e49ad7be2202eacb5a7bd86c50a9b44c9d10ad73", + "public": "023f74ca7041a7d9f3ac4c524f8686018d8a24a735fbf942b271ceb2eaa840c875" + }, + { + "address": "pJ1EMgaUEpeTSXu1X469gtXhjd6RvCjNq1", + "bitcoin_address": "18VtPDQFzne7wkgAM57c22BoQPdeYZo8C8", + "secret": "556e1fab62c57725765b5250062b6b9e3d2af8bbdb522255d1304f12047d283e", + "public": "020a6a5ab65ffb60e706fc1febcdbabdee7f8f3f916a2100dcab925cc8ed0b34c0" + }, + { + "address": "PY91kddKVU4mVe2pcM4ZmEvsdP25rFze7J", + "bitcoin_address": "12atBgpg1mDEdqmjYgWzh1NgKS9qRVVLD7", + "secret": "23bfe9afcd904fd9aff9838dfd1edd67b897cc9b2aef6fa5eeff116103887a6a", + "public": "038824148c1b8ecf7848dd3d1acb359423334c5822fc46dba4016da02810d30f74" + }, + { + "address": "2NRQSCu82A61Q3Crm6fMJLUuwEnwMraT2FF", + "bitcoin_address": "1J9ovbS9XXo8mY9jm1oZhkWL5WA3Lm7uwv", + "secret": "c352efce59357fb758de15e09f00e2638b504123212003157a3917e8f41a2e96", + "public": "0202ccfdf6248cab6f045e620789fc7c9eb2a561ff80c2a89f0cd478b15d1576b0" + }, + { + "address": "3RRzhD77qJoXvM6v5D9qxdHfoKjUhnEYhX", + "bitcoin_address": "1HGHaGximnMDxizx8hhGXQwb9DAnQ64Nq9", + "secret": "63c1cb5a1c165c78c847548390a01b8bff6682a1b247373ed6887aed21dc4bb3", + "public": "02d608b2d0df929b6ab7b261f5670d53f406e27b2bcfb00e024dd256c85623b77a" + }, + { + "address": "2d1BVVuCTEhTxdKfKJnRYB1QZvAZQnzKqKb", + "bitcoin_address": "1Bp32B1rhN9b8FVtCfe5X8z76atKnLhSML", + "secret": "c888dc692ac017a6e7937fe04612473ee816f3f35c0a5a099d13adb9af7f7571", + "public": "0219c3f2baf3665dc97ddbeabbfbda43c37f9a797c66623c2d2f991e8b39a99858" + }, + { + "address": "HqZLYWBYACeiSgC3ZugJuq9hwgmDTrDgRN", + "bitcoin_address": "13FuYFhqwCSczFhvPPWDvK9uD7wZVc677A", + "secret": "fd1780ef43c24ede009e36107e15903a29fc150a1581a7844370e440cc922e56", + "public": "021ebef79e0e5afce2d4d4eafb2199cd558507ca1a0ab33556c464b41b020aa5e8" + }, + { + "address": "2cXxCXNXbFx6vF7AyK4Jq4Tn8gvL1tGxjJZ", + "bitcoin_address": "1N98PV4fdYrhoitqZu1LVqiXfV1uQntvuj", + "secret": "fb90dd91878c0a09f823b8142f71f702bbe2cec4319403b37967e17cef6aee0c", + "public": "022491a0e903acf81c62f8e13c2e342905374acc4afe48b8cf8650f269899e5bee" + }, + { + "address": "u1qW96EaRAuxaKWTJT4Uu7v1EEiiDkDbpT", + "bitcoin_address": "1BkMhGPtnR7HaS3mZd3DYU3UYUXDMGTUnC", + "secret": "5a3211ed2aff62a77006ae14b4af4cbece71e3932fe835cab03e7778b42684dc", + "public": "02676a8a39902a79d7057b177552fa7c99ccfeacd8d1ed5f4cef52d20909bdf067" + }, + { + "address": "K5PVBVZjJkg84f83p6A4Bu66NJPJBoVHYp", + "bitcoin_address": "1HtL61PUSuCfpx13CbYFKwFBAT94eJA2tS", + "secret": "1214af921adc1234c210a62675b5c4b962be4708638a67b2c840b950a7da2bc3", + "public": "02ac6ece3449fcaa163302eed3e3dd9293a46457533e4b5f28c137bed59da53e4b" + }, + { + "address": "2Gg92Ak9qtPMmijPb5W6kB8M3S5J41qwJHT", + "bitcoin_address": "1Kg2Ft9a7fLfB1kHfrrri6D2g2itagBz86", + "secret": "7a9d1e7742bca2aeb4a5b1a2bdbb304293477bb14345676a27a2052e5d4ca1f8", + "public": "03eea804e1a66b4b00ab6957a03e07750b9bf716be5deec43642e20549f54af1e6" + }, + { + "address": "CmFiKdFeKorB7hsKCmjhKCw8UScJCfXx5d", + "bitcoin_address": "19HoF6BTQqY6zqUuvxPEXJ286xB5W55C3z", + "secret": "7be562525ad05357770a38a48380a23ee8d1b9b6118ff0d36f1205d3b265727a", + "public": "0316c776b70f4ae4c158e68c3393a68b3f9bc76864c805386e93057fccde70953b" + }, + { + "address": "29tcDz14WSM58YkXMhaPJfiwUtTJDAXt2zn", + "bitcoin_address": "1JHXsH5ifsKEP7kJdbJskzUr7PvsabwE7f", + "secret": "c0bb01bbb159b0bedf44cb7ba6f8d688ba94370daa08bdaaa5b8644b57045758", + "public": "029f5edc881fd9c965626bd57608b3d39cbc03bc12891684bd3545e02e77932c98" + }, + { + "address": "23QXSzuMwpeTpdfag88sM7teo2BC2dEiqUm", + "bitcoin_address": "1HPxtgWEdCGyFuqakqSLU7VYLWYFQzKyMs", + "secret": "34ba38674aef49b33ce5deee37b685e6ebec56f3e1f249c4d9ef6bb5169c775b", + "public": "0242e775c22b176ec52c313fdb2c070c34a1de75b9f5b0aaeb5c4f37858c7541e5" + }, + { + "address": "j2twcqftn4NGiaEKTG8C8EE8ThV5E854NL", + "bitcoin_address": "18M8E4Lixq6r2XyhGSWA9Rdh919mo18tag", + "secret": "646c729eb1df22aef8c1ae4ae5fbc493241b2beffbed8cf80fe29b59c61b5946", + "public": "03ceae5231f5e67bbc1958e45cd8e13861373bd273f8a014c031af845384c26642" + }, + { + "address": "XPNkBF8xkXbFZnwvJs2mGKVtzqbYT1sxMu", + "bitcoin_address": "14K23fz3KbH6KHJbB7CtUp52yeKEtS6sK3", + "secret": "69e76a9701546342dc4a67b4b96d88387113cd0ed03334e76ecfb7f760539b90", + "public": "029dc62e8c891bf8996292dd7b9dbd4f35de762e82ca1e34075aa7772f3bde6340" + }, + { + "address": "2GWkZ9KZZ3tqL5b3WU7bWQBBAPTnoffrRch", + "bitcoin_address": "1JABA47VKnHDaEW2JRC4BvTo3Qs8rBVfya", + "secret": "e8b1495cd299d98bc817123bc3925aa58b43d80fc2e54f2572bce0ebcf890167", + "public": "02763f7a152c2190cabe16a1f29035c6c70b80a3636e5568fa4fdfcfe35094bfae" + }, + { + "address": "DmJHLWMHp5JNCFcpwt3JmxbywjNrne5jEi", + "bitcoin_address": "1AQ1etPSvfEo9qcJuMM9AwGEkJw5Jd7Z6E", + "secret": "8c2f4d83eafc53c13a85ff8035403c61d9e4c17f1453cf87b6be7b0dc6ef9e9b", + "public": "0371288fe9beaa9fc75a63444803969ad821550141e74712e9dbee02b21725875d" + }, + { + "address": "26jmnqf7s3FPRu2wLBqQc5KfbBKrkgtLerT", + "bitcoin_address": "1LEmRgjpB9ES4cQf4fCLLbkkMR1rhTPm15", + "secret": "026406771a4e3b8baf98de0521150c91eb068422d37af2974bfc6ae0d4fdcd50", + "public": "03e47579aced7c10ad1c479e46e13e930b535ac90b628d29d89f6d02a75ce6bf80" + }, + { + "address": "2UUvsfNWQNycy6smEG8c2bMNyCh9qQ9P5EY", + "bitcoin_address": "12Y2WGj6Ln2FrE3M3GhuKQaKbkpz4oizPJ", + "secret": "1814c9a6e012f1b4dabac7e7040adbe519e3e8071c15089b5620d091e3c26cc5", + "public": "020429f24353d0ebf7a17c9acb952df72b6364a010c69d5d98c61ccb462a65b2b5" + }, + { + "address": "haWRgQvuH4MdCSyjAUxzzunVLwNi3vgoj4", + "bitcoin_address": "1MqmRTEgirxhDJ5uPT6nmsftqAFekAHCVU", + "secret": "5ae9f61a0c40f15c178775033192c68581f7dc014a5c7f23b1f8342e853a919d", + "public": "022139698f089264428fe2e194d7ff0138e633f3b21cb39768b9c6f65dfa689eb5" + }, + { + "address": "28wV2r2XHDMdAgriHeYL9Mq1W7TmJufBwp9", + "bitcoin_address": "1NgEfdiHqtfTV6B8Py1so5C9CDfpSNwgh9", + "secret": "bc37955215e69841e42c9881e284fe53eb090598f3f511fed533e3e82478e83a", + "public": "03c2c2c3a698da61e8a3d95744326e1015c1842aa84a091565cd3b235b1d55a16d" + }, + { + "address": "28WhxGF5tSuvWF4D9tSJqp4Tz3dAynY4rkx", + "bitcoin_address": "1K4r9VSGYSyJ7cg3DK9owB9X6ZGnfiSahP", + "secret": "c7666cc0687a4cf835972c65c58f5a395beca834eeb8c7e0db1e87de1ee5ea43", + "public": "03c2ed06a2d7c5ab80d35d0c792ef4b3c9630a50ebb6c23aa886d4981437c79389" + }, + { + "address": "etcmKzzd4K8NT6n8aTiMtUkNxFc8sz8vyx", + "bitcoin_address": "1ivxwc9eQEn69GxfyFauZEvH41vpQKgcP", + "secret": "a3fd517ccfa8ab4623d02331e818c4d713e26f7cc7d18b2a7e1125ce3e405335", + "public": "02e1438126acabe6a4c2eaff465a5b0899b4cf66fe762f92434d6ad91b44a3ae3a" + }, + { + "address": "F4YnpYwedDV3DSuTVgAqN2F7mikJkRhcTP", + "bitcoin_address": "15cUM2ruCVErZ5SK7txiuSPPiEq7Yrsa61", + "secret": "efa78a590bd91f5b51964d3a4537abd76f03c41d93e2f68923df89662f52d32f", + "public": "03b05cc039402bd180818546c50dce27f21cc34f85d0f0a108fdadf8a6aa670d82" + }, + { + "address": "2c6N2MabsomEg3JKDkch4Jpz29bsNU2chWp", + "bitcoin_address": "18SdCHnH5GVMNgwBZgSsB4R8Dxj9C46mvd", + "secret": "f0873cd7a110412e885761425372f29c72555e50fbba2af0cbdc2745f60717b6", + "public": "030da68239a9b2f59b09726846321a3ab9268912b01802743098721229b4e36c90" + }, + { + "address": "23LApPWq6hQYCe6G4cgaPnYVS8pAX84FBaR", + "bitcoin_address": "12CjZ8futiCaQzcNyL6SUutTqgSCYHZ6w2", + "secret": "52aa35161bc67fbeb4db60e92872d737679da25a4fb65331f8ff49cebe9ec56f", + "public": "03038fde27b7f8ef7554632abf454ddb8e0dc428785851afb742599a4a69371822" + }, + { + "address": "xFw9ZDCbQFG7DpRiQPTzb2WNRHqrkj7RGQ", + "bitcoin_address": "18cB4d78M8gZntjdz9kUtCbi8B8NJAtaj", + "secret": "eca2b0b5b6b1d84723b01384112f25786c5c8f3445c941070a71cc76aa95ba88", + "public": "039b957325b2c35cd8734b8d1cf83facc02e497ad886940350a68e2f480768b0e5" + }, + { + "address": "268GpgoU9Hv289M8Hse1akwZde5ag9uj53x", + "bitcoin_address": "1HAW5XnYwxGGJk2pVk2sk9qnv1i3TgTXfi", + "secret": "2b5b22635f3aacc25b8e49aeef42bd6d64a02417a80e9ec724a68cb219a7c0a2", + "public": "02d8e1b7b6ceee82a2ed233139abca00cf638c8f2398d477f0dd06b4660e294f45" + }, + { + "address": "2FCo3HNQxWgh5K56mfG2RwLAvzagB6d1jah", + "bitcoin_address": "17guDqNBgor6ZVkbkvc2MX6x98yxyynqkt", + "secret": "4d9df01b27be68b30693b07335823009231b9da913c91b8e5d8b8d4bf0f52f5b", + "public": "0313287d7d4684f66fe587df1543766dd415c9086e8c95b8daba9242d0853b164a" + }, + { + "address": "2MpDqMjjZ5yULWt4CVDCxdPQGJVuGhaajfw", + "bitcoin_address": "1FAqNhkTanvVaqsAH49DRx8yDBtrsYAK9p", + "secret": "f54df30c69b3319ed9b23ab5a6b8f304bde489876d94a321929551d0a8308519", + "public": "02b67fe14d0c9341f3ac2aee4469517c8afe0a7e4377bd17a23016a08489f4a9a5" + }, + { + "address": "2Xz7wn9Bxb2tszHxPDNgewe4FkxQk4SccBT", + "bitcoin_address": "1PKrtFgH9b31SuAshQxqweLy5TwRgJ7mVY", + "secret": "2c1a5fd49bb16649b9a928dcdb0d3c1ecd6846a53cc59d1456883b7669dc89fb", + "public": "03c627ab67dfafd83933b644c17154cb3952fefd97cc88d80b4710c0e90f4175fd" + }, + { + "address": "sGEef8vBoVE4EroM3Zt1f1isXbpyEkQDMb", + "bitcoin_address": "1AoX3Li3dTfeBerKNWGRWFLdHEfPca7fV2", + "secret": "8a630f2682bd44c03490b6387bae44e5842af0b6b08b2b1c0a4549e73342fb53", + "public": "029d3349abd73409c2ab4ca0d69159dd09f3648abd85128f559a422a61499cf46d" + }, + { + "address": "HxKmR2d1tRHRXeAQ4tL7ekbi3MRfyHVWow", + "bitcoin_address": "1HnPkWWtouVKYbjsYw9gnpUDnCWKhwhdUX", + "secret": "3d7de091a784479b3af9ca73d8dcb8646b055b33faf8ee18b88a188a6048bd40", + "public": "03fa8f11fc56eab51d0f1658b8476afda73eae0e5d4adb3af4e721fcbd732ca25f" + }, + { + "address": "2eD58A32HBAUhHVfCgF9udzJRdswTuuG5mi", + "bitcoin_address": "16hMyErfk14e5KnxsC8wHw8esKjvsncCPE", + "secret": "6d6790b0807b0dc719eddfe623b1ea711075609d3be17609731f5d9ed05d6365", + "public": "021a69827e26d0c81e1fd1a690f84d94fc183bfc066e8aea1f0485ce1fffb4faa6" + }, + { + "address": "2e2Mr8MjvUHmMSf4DayyoVqgSerZyFsK79W", + "bitcoin_address": "18VqW8vFwRbpNn6U2UACJMnEo6wAxLoXhN", + "secret": "f09b7f763a7cbbcf01a63a81dd0a60fa014e0a96ff609dc544b3d003d0f82b70", + "public": "02746c6784634fb65f5d0b6a73a023464c47a4232831b548a57b5d4039a177388d" + }, + { + "address": "27JVEagjW413PVigf6ALjqNCgm99xS5jj25", + "bitcoin_address": "1HgWUhBxLJrQzgofMdHs3NmsbfavBkUyGR", + "secret": "e4d69a0e022f119941ece60c0b0fe8f36d93f7f7115fba75ba6c3c646bc0b804", + "public": "039ad4b9726873f1ddd35ee87cd49aafd1734cea699ed9feb3c5fcc6f5a20ab237" + }, + { + "address": "d2LgfFBTFTwxP7PyzHwpqhHKc4BLPbA5cv", + "bitcoin_address": "1GeV1TgDh71CF82EALZXRT83WnV9eiYXK3", + "secret": "fc46fbbfa893010b6b3b7a82aeb52290d58f6d14d25a68232f0143b99eb95966", + "public": "0248ef5a23acdf96f41e3a3f1b796baa6e4bcd303f223f92b34025f11f3875117e" + }, + { + "address": "DYnuqgGZsGk49sU7c8SFqCezEzeZMnYT6h", + "bitcoin_address": "1BABD5Q44XuZwJtoKrDBAJpQ3Bk59GghJg", + "secret": "dc7b04fe3530713ecb0bc55ad66236040f3df7962d0f7764184059a5300de5ae", + "public": "023240e626ea68612bf3a722df5cf567052e807a555b63eafd3c3fdabab1aa60fc" + }, + { + "address": "2XpYsb37q5XDQHvtK19wZbsTrNzkH7BVc21", + "bitcoin_address": "18H9LuwjVx7yZVn7b3AFSo7QdBMhhcQuN1", + "secret": "b2d00fb19032ca52ab73f6308248e3fbdaa6e747a5f00af9cdb4fa914d76e19e", + "public": "021a7d5d53479b596f9510b9fa23e682dc02930e715550cf70ef9844c62a9f7944" + }, + { + "address": "ucW7K9gf3qU3RN2b4i6bGxFYrL3woqAGgb", + "bitcoin_address": "15VpYZu6QSchUR2P3ZDXk9VjbomTcgqsV3", + "secret": "9ad70994a257aee7ada71f7f93ce52973febe7cbeeeaac7ebdbdf1e6c481dfec", + "public": "02ea5e47e063bdf92c93e0bcfa3ce25fba9f4df0c28ff008c6b17737bd0e994292" + }, + { + "address": "25fbmTF3vThUywruNQqVXE45sViGFJREY18", + "bitcoin_address": "1Hz4CnvvTnPXuoUQxbMP5FjvYUQQhQiLo4", + "secret": "f62247d6d0644814ab52dd187d34a409d7e4fd92cf84525adb6703a1d85aad7f", + "public": "021f05d696dedef4f9739c6a7a258e49d62cef2d53c23a37a0a3589f95e6cf7b02" + }, + { + "address": "xYMp4hezFHZQDDyRZeAdv12fwaCiJ2vMdY", + "bitcoin_address": "1DmU5oevmaKJEZcRpW2A6Sh7R5GuKQyL1t", + "secret": "6b4ab66f5d8913678ba852718f6ea0e663a6433f7f3d748966b4063c3a6177d9", + "public": "0302f82272e3d4ab41c5f2d90af3d457f1317ec703cb28e10f657f34c4b702142d" + }, + { + "address": "2QtyuU4brhrHAfUTKba4nRTMzGk1tEXruVM", + "bitcoin_address": "1FNviBBK4bjXzNHJLxK7u6ioCQ6Fg8w8Fo", + "secret": "6e9aa8ecbedcefbbae841c8b9abf7c72d047ee02d02ab3de3235e02d24d9bcd9", + "public": "03eb4850fb800b164540382b34d7d92c07f054383c4c5e8cd6da2b2d721fb27c42" + }, + { + "address": "2kvThk3SQYaNSNN5HrjPTbTFM74vXj3T65T", + "bitcoin_address": "1HtgpLNGddmDdS4pVNY3kzqQv7juW9iPPz", + "secret": "bdf9c95a73abeb67f87cb4cd628ffe1c8f11efb6538feca26b50bd8697b6df2e", + "public": "02d4cec5d6667aee1afb4c077f34031b05879ab4246decd0eed08218a8bfca1778" + }, + { + "address": "gEnn3tL7KwqmVuXQgndgbdxKesw8XLwMJ4", + "bitcoin_address": "1CwypzWAJaJtnJUuiHpPxjswNFh8jP6snJ", + "secret": "e98a343f67ba8e50dcdd8d23a32bb4fca328fc6c3ed3dfb21646a48e396c0c08", + "public": "03a69b41e972c2735d740f1c1e96b7bfcc9c20d157c3fd6981170f5171fdb0a5de" + }, + { + "address": "QhJj9DnTETkK6BKN5hX8CNxoiDrpRvp9p8", + "bitcoin_address": "1K67MJwGgMsZZGiEV858638oZBUxfjoNLs", + "secret": "e4e661663ed2750e8abdb0c6a66dd61bf3883155212c83e0d6e2ebfaf47c4138", + "public": "02e8d9982798c5f006a0adcbef9ec806a894bc88de7adce0b7839a197a437fc417" + }, + { + "address": "occqAdzZCGaz6ZHLmyW1FCSrRcL5Am49Pv", + "bitcoin_address": "1AtYKiVaNXGSLi7aLK8vdVcu7TwQkFmrtk", + "secret": "20b851a7b0615ceade0f4777e0d58b0f6f8531d1e367a4523f8f182d534bfe55", + "public": "03bea4e1361b538fe990a04555d9dd02fbf7f7b6a7e04fffa80914a5b1f5b9d74d" + }, + { + "address": "22YUVaU84KrbVogn9sjpATTEVH4KsVWdmsh", + "bitcoin_address": "14cT3TZPoW7aGT9YrLdQaUW474F1poDnNu", + "secret": "d75b07572d7bbd6aed033392cef11e46ea53b07a309e10a88cb13b7dc7b895fd", + "public": "0235ac4849583dde931ab62f283ca3b6788acfbcdc9118f95e8e70b9235b0f20f6" + }, + { + "address": "67Bvi6FjvJrmtVs8knw5jrhbB9CHbydGmb", + "bitcoin_address": "1Mhp2Z6xExFtmbNfCpAUG4eoHF1arBdMdT", + "secret": "f1ab28b4d9a4e7154200f9e97021b505680f2b6aff67b84556d3595f24b3526b", + "public": "03658ae2dfaf17d476e66d3fc37c60589a358dc2cee8a0da100745672266c6f174" + }, + { + "address": "234EUS3L1CSktQjv7Gew3XyuiWfuyYsW7zk", + "bitcoin_address": "14LUsDyLQchYW5gAMsLe3aFDLByhCkaiG4", + "secret": "34d2973733c9907551bd889bf373e43a2e8c5b725c047f30fd280c11fc5022a0", + "public": "03f26a30354f239883057cb42ef7c332ab02509d0cf65abf0a4a62023a8d649ecc" + }, + { + "address": "rh4HV53HPjP5EVzovH1N3MpS56xEFHBWR9", + "bitcoin_address": "1MJ5AjkZmH5swMbbyh2GtioKioYVXD2QqZ", + "secret": "1ea8940d0b18999efd6f6cf7d59f40372732e10abd9f08d2bdf366fe3daddbd4", + "public": "03eaf9fc065239fba9e5fc042b250988c52aa6ac9e5775d4719004b20b431297cb" + }, + { + "address": "2YzJk1MuPpnAvKXYMTyRM1VsgwrvsdxfjT", + "bitcoin_address": "1CR7siCgbSj55ZPXYqLpFPWvFJGxJSyrzq", + "secret": "bfc39b678b8ab0c31baf501d510548b7e88f1a2c4c0d61a56d99ac334eb4420a", + "public": "02e73b0cb3d96c20b4611e74cdb81501f5dc8aec50784e021cee7e3a3599eb8de4" + }, + { + "address": "2EkVeCkNTSD7QEaz88g6tL72174si87xSVL", + "bitcoin_address": "1BSxnDHa9S4tfBMjo4e5FV1gbDxy5cX1hQ", + "secret": "4412a0ad23f28be3735698d4a086e9c285a5f6ae1651a95b526f3bed320b3de1", + "public": "02fbf462883546a2e516aa22f1f5f06c89a6a3b7cde80b59e7ef39bfcb94a78e50" + }, + { + "address": "2L8NW3x6F9fnMVgosWWdEcXmdkt5Sfhkyip", + "bitcoin_address": "19NkymzaRLVfYPnHbih23fBoHmaNbY6rBi", + "secret": "da5743dd6f09bd139c9c6e2105843b19de9a3393a7549c79edf91532387bd6ad", + "public": "03fd90e6f33e338fa4e9f6111396585c124b83d6b390b39f92d072bdd862831d7e" + }, + { + "address": "22ZB5dM2NVyz13YiuwvW9X7uKABoEbHSwYN", + "bitcoin_address": "1KHAcEL29mtNhoWigUneF6H665xAYdaQ5o", + "secret": "910176e477b73d66007ae2f5d44a7bc71fc21891ad1bbfd988d8badcfb1fdcab", + "public": "036d9ba5504a7fa6f55577ee34b5e8f2e989aab504dca6ba265d26e6518f5fc5a6" + }, + { + "address": "2RcNdAmomK5hPkrzEagpBPbJKPG1YhfqBZX", + "bitcoin_address": "1EdgbpqybSggQP7voJGkPscro3gyCiwhCr", + "secret": "8b656b8a83350a408db0258f81c1fff913c6caf10fcb53049be6cdf5f6850ccd", + "public": "03e0e7fd4a33c7e2af83e476ad5d78f5fa91cd8f16c5f3a3904875444f76b038de" + }, + { + "address": "mECP2omm6nNKCRbUUEA3ngU83gBtbG2p53", + "bitcoin_address": "14LWvRMPhtKWQ8GmgtVPSN1zLEBKqPcdSu", + "secret": "3306fa898776691df724ca8b72dd5ebebe9a166a9f107a281b7e83e0bcf34d8c", + "public": "034a9096445d1401a979fc821bdefa15f44df8dc02ae88e051c6a7b45a577dfc64" + }, + { + "address": "22nsdEVSxa5aDvpFPeyTz9qpcc2h8PLzRt4", + "bitcoin_address": "1J7cUUzp6PHVDD8387PQAeCedi1JyNg7mY", + "secret": "e6fe5bdf75d6e4f7aaea16388cf2450fc1839b088c415bd3f7b9a65958c08f18", + "public": "03349d2964d9d6dada8ae6934b76145cc4d92bc43a41edb55d548a7da36530ed2a" + }, + { + "address": "2gadfsU9qYJSKcjYSbYGjrRXffK9grr74T6", + "bitcoin_address": "1JCHoZz63cnZshbw635YJeyPpgPxY3qPz8", + "secret": "56d995f35b80a3046af165ad9dc0a507ecdafa9a947403ceb63c79a3084be6ba", + "public": "034010692d87e47df712c37a3490f096d4323b0148d71eb06756d1153e47de9558" + }, + { + "address": "24krePYfSFjn21YTDA2e5FAWZefu8qE8Z3R", + "bitcoin_address": "1BRV2pyBpgvRJ1e7UovipvQmfzqnf3L2Bv", + "secret": "493102a3bbcfb4178ec7c1072631ce03f7f3e1d07d5876f07c3902cddea3e5fc", + "public": "03253e2a852b5aa4f8fe11d5d32cb8364dcd5460665935b47138ab945a1b7550a7" + }, + { + "address": "rcqLsBcsWXHodbDaCLHcjQJKSJ8kD1q4Ff", + "bitcoin_address": "1DghEhH3eJAVrMvRDBXrqCiAK94bRLivN4", + "secret": "cc8d395693f126bdbdabb3622933d1c0bc148a2d929bc30e66e22f07421f1592", + "public": "027558c499a52a96043a001f8999a6cd38a3fd2527fccf28d12edbc90fb7641aee" + }, + { + "address": "wvFzxVWV9xGs2ppokV3wmpy2C9BcUe3DZy", + "bitcoin_address": "1E5buqiTuRJapvuHJTP8JChmTQ2VLyV1ZX", + "secret": "e8e09e51b8add90be81a392196c76930e876c97cb8b1df408eec8df13c215b19", + "public": "028e99b6990ae84d590aa30acffe4b9a1fe5033cbbdbcd9971022c6e249b43d98a" + }, + { + "address": "21124BfJReTshKP7zKthRyLAkjSnvbo3JL2", + "bitcoin_address": "1DnYEBjvapKPJrrDginzJh11CTeQgNtWZm", + "secret": "f452d999bbfbe7da6cf10d8e602a09543ed716167649dbc6b260f218d08d0a33", + "public": "0323535070dbdc40d0e3e5ce3f1f75af79922dafed3f8a3d102fbc891b9be3efaf" + }, + { + "address": "KKqLNqWvbsMZ5sYKAZpXLZm39jZ8zUamy4", + "bitcoin_address": "1EgrQeZngXFR4SHmbnfvNdPvQB6naFgBTa", + "secret": "0fd7f48cc79b6252dcbd7a24d5f3e4099acfd16368f8f2e7c7db356ad1488284", + "public": "02cc8fbdac02a1050df58a28793247184b810bceeda25b7e2879ccc4b695cdfd20" + }, + { + "address": "2afkMQHbNM5EGuVPt69yjjzxfPsih4hzfAt", + "bitcoin_address": "17m418exG5Q1qP6BgzQFd21dr5GVBAnh7H", + "secret": "7ef7f98aa685734f83c7faeae4cb687b246c21998d29961d5899757814a1c28b", + "public": "0321f6a774876011ce97bb51f15a35ef2aedee2bf9aa9e5a2be3193d7bdd4020df" + }, + { + "address": "QqrvnPdiJm4qg2PZuhAEYWCHo4s9VRzQ1d", + "bitcoin_address": "1Q1NULJ84Mw65gjSJjxr2e8mqbJqRn7fVy", + "secret": "3ccaf169d3c906c5475f0d2ed148a6a0bedb23b88df3a16f485fb7a27c61f465", + "public": "031d90572ce93b645673c299b4d3540fcb11cac5137356ebff65f29e47e75bf921" + }, + { + "address": "26oEbwGTv2tGemBwWvbANw5z9oW1odHLKU", + "bitcoin_address": "15pXrDTE16hiPgLyaKsZo1DjWuWdTyQFSY", + "secret": "cbdfa24088c30d9c07bf634e84a739773b79bfadea68db57e7e690cdce00395d", + "public": "0320275a12cbc4888b9b0390de849c2bf6811a128212e43c2359fcecd2e5bc3fd0" + }, + { + "address": "2bNwEBFte5ezxWk4hVB2gSDzh3YTacKYxKo", + "bitcoin_address": "15YpeWbfFRMkmhpuSs1npmLnuoS4Wn2iNX", + "secret": "a216d679e012a931b34ddf4716f4d5184073afd962f3ffd293cdd1974eb5e919", + "public": "03fca51ddac76f423fc3863eeb7681a564f75c16026da6bafa50096c6748bf4dce" + }, + { + "address": "2M9Ms8uouj4wVZSd9sJXNFMYMDCBrLQPwNj", + "bitcoin_address": "1127a4gNNVErHhTmXdM5ajj8kU8dn97Mns", + "secret": "2e3757e0b1c32e5c930c27f9ef8a60f8eaf934b063cdfb788370f0f4a0b12100", + "public": "03022caa31c325e86fe4f9f28b7a3f4474587722821c7e0384a7e05b7aa6a8e72e" + }, + { + "address": "ZVD9KiPi2BjuXvqa2uVSUz9UVvyt6bCin7", + "bitcoin_address": "1HhY9i11XZUu32qC1zHZzBYPTB4HkBpDky", + "secret": "16d14664cb9c65122d76a74d8fcdf542f5a4badc4e63da12f9a2e21a49364142", + "public": "027044e66f79defc67e06bcd5aab6921a985c1a78e5f9c965b2b8b576aec5be7a4" + }, + { + "address": "EWFzgYgdjU6CVtPXyP4WrwMondHoPX9VSi", + "bitcoin_address": "1GmznM8Gjy4xQ6TNJKTEUDwYe8GF9PLCxb", + "secret": "bf6f0cf4e0786300a07294f18d9c0619ee77e224274ddb0b4c74ef9b5ae12bec", + "public": "02c402d13f5bda635669b0b384e2a7f937ea3668d14c6667472fbe974027f338fd" + }, + { + "address": "frgeQ5LGCQiJdqbBPmzJrvHf7osA95iCN", + "bitcoin_address": "1BLAC2zkK3zyPJ9HyZgazaiVE6FPRHbEHA", + "secret": "1b533323661fc93337c9a09546613f13f10c0dedb756a935791336b1c847a012", + "public": "022dc106b9222bd5779688fbc75010ee6f24d9491a7db1dea0bfad969d27080483" + }, + { + "address": "2Ygc9Y4SWt6pErg3smALUqb4nxe8y3Aa5SV", + "bitcoin_address": "18WHSKDFDsN7n7Gqvua4xKfS825yJ15Cm5", + "secret": "5aff64e7ee0c57c08b80c66d91c5db5d0892a7a182eaaf9fb775eb77d128e731", + "public": "0349af83b3db967df7319957aad339eeb85550e57835f4acc07293e2eb353de8de" + }, + { + "address": "VZSQ6ji6oeLZgxd5Nzzt67JPUFzm9oXa7D", + "bitcoin_address": "1DSGczefUUa7vWeFSmtNBNrED7c4Fie4P3", + "secret": "bdcf7de5460ecaca02d4e485892a4858ad4c4a7a17d57fdfa8f311a0a3b386c2", + "public": "0335f1138f086f04fba73c261ddbc263f9187454b9dcaaac91d2f628ff64e2d7fb" + }, + { + "address": "2UtPuf7UmE1RMaKaRnQnsUmHsHmTyv2GCqd", + "bitcoin_address": "179siq9DPGGP7yb4riQQhfDHkpt5nXnKGG", + "secret": "33f62c9b2d5984aaa7df578a2d8109a010f400b522d95294dad79d0579b69790", + "public": "032c2ca487f68198688cff80a29f59ff68dcd659082b8b28e850343a810702b6d0" + }, + { + "address": "CQNjG6VeT7XLoFd2DHxj7Bdu1ofdkvf9Hz", + "bitcoin_address": "13BLEMEznhDpWKJDyLEDRGrdg3U7fmdLq3", + "secret": "0d323574b86731c76d23912641b4272aad76c610641794f6008de85245d90501", + "public": "03cdb086cb3d513a001501591289093bff66c0e4694390b120c9997af573789fee" + }, + { + "address": "cFhdRpgfDXFD1d9tzSGTDxVkyexiHHbscT", + "bitcoin_address": "14ZZ8w5USeZwe6Eg2aa2HjJzP1oVRaMD9W", + "secret": "04b1bc8cc808c62c32ff387b2cfae435b3fa48e6775a98cf564e5c77d58c4d80", + "public": "03214b11698b52fa5efea3549a08c69afad4d14d2e1949a267f29a7486f40d1662" + }, + { + "address": "EPqkNxDnvQorZaKoEtjGcGKURNcywr3dny", + "bitcoin_address": "1LZ9SSESs5ZD1Sa5p59kEqeAGEkQnLrvmz", + "secret": "de6c09ad0b43723096aa1b5ad133a194954793f2005066d2f3f7f629bbd14429", + "public": "0285584deec2240b44f3ba9fa9380b39aed1582896e38fe0c8254bdb1e14bd7f0a" + }, + { + "address": "UhCE6NpRtm1Bd44MkPgVKToavRRLqoJbDr", + "bitcoin_address": "13gzqhWnwt6NNC6AWvYFf7ZNCU6snmXDsk", + "secret": "3fb29d455a7d5917a88f001aec8bb44ea20d17d7a68019b4e29320cb1bcd4561", + "public": "025c453cb7b8c4470678976e1e08baf10852d9b28a5a21b55376766f302af15d32" + }, + { + "address": "j6rcr86aiDCMtHj57zQt3f4MkG9zoscywy", + "bitcoin_address": "16MmZKhENbWLsLvqptkJby5GVF8q1dJnHj", + "secret": "1e05688f0796d4bc347a92bac8748bca26fc4cf749836672d240fcae8b8ac467", + "public": "038b8875d803161483165346766f9a1bdea5b123b38d7705538d6a1d8d5cdf54c8" + }, + { + "address": "G8unj5XY9mKMjPZ66KNrADKojueP3FxpFV", + "bitcoin_address": "1DjfzTQvznspT3xGr7TT5WVr2StxmN82Zy", + "secret": "4eb017d642be8864dd5c54d0e81d4804fd588361fa14f31b099cb5211a0b14e4", + "public": "03c0b736889e8cfa84b9fbbe9053f508a5cfe44c6148e0b575cf0d136204adc9c0" + }, + { + "address": "iEY1wongyqqfMMCwwKa6yKnrBPzWRv6Cjd", + "bitcoin_address": "1Gr2bqdCiW5XSnjBopbeRqrMgoKQf5ACTw", + "secret": "205d5d8cac7ef46d7049a8e360b5db56690c939178ca1cd46db8a686d9f2ca81", + "public": "026953569b00b6d1545899246f12bbace2fd78f568a004d0d08ac61525c0eb8e10" + }, + { + "address": "8MofVFHLEyfDbybjEuj8Av3tvtAHm7aB6i", + "bitcoin_address": "13AFc1zNdNWfJRBPYkZSk4QS5JX8ebdBi1", + "secret": "b88a93973a8a62453a83c10e00817112922471d2270d1cb0c8490fffa98ff4a5", + "public": "034abbe2d59395e30fa5e769961bc54beaa08598370b3e85193a9e200d8b18213c" + }, + { + "address": "LokNHE2zyrZgjpXXWrWY5L5BNsXR6qJR6D", + "bitcoin_address": "18Sobk2me4WTpgcjbdGn4sE6DgBgHKpzyW", + "secret": "fab1c44ee39d0839860710e49df3f47b35d48465573c0251bd844fd90a6366f2", + "public": "0251740aa6f68cb3290cb0d72db8d9c03447bc747da7f272847417cc8e40330e9c" + }, + { + "address": "NXV5XL7rggQ8GAPDjJ62jpXkYGJ8VAXSba", + "bitcoin_address": "1GFukEQ4FV9c8JqdAKMDruW8V7hrTTF66s", + "secret": "631b5a1fd96e7a99ebe33d4788a8d6e45a6d4b116b11bac53aadd116f39c4c11", + "public": "03670833bc074d7009dfcd1a61cf5b63a08ea0bd58f0f295121b8d5825d897dba8" + }, + { + "address": "frEtjtXJoKyuyq49akz1Zx3yLMpni5gYh2", + "bitcoin_address": "1HNWRDMt2G8h5SXMoPtcZNJFXSXLwiRV7g", + "secret": "8d50af61f21107f572606d21c35e453f997ec17e941f2b7afbc051acb36283f2", + "public": "038daf6200f2ca021673a6915e57b4c424ab2ac1c1b749db8dc059607d2092b1e3" + }, + { + "address": "2Fp1fioauYwyMikcL9VphTrG72ZBwP21WF8", + "bitcoin_address": "1c2GznKC6wqR1aV7vsMca1SbgSwpNZPEn", + "secret": "af01bdd50bf4187bc8fd855962fc0a68ba55b3950d9abb192ec7b5179638e045", + "public": "02619d27f77c97b36ce895a9ad47339ef69a9f02a6953379d077d078ba7bc6535b" + }, + { + "address": "PeoTufGJDpATgy7y5fKUkM9xoL8tzk4LUA", + "bitcoin_address": "1CpxJDzsZ1xFdhCazV9q49RgVHRQoCwRPc", + "secret": "f8c45f4c7034fff54f2c8f2f2b8f9ea356b299c73a66a9979832ab7e162ecf59", + "public": "03f4f3d208cea7bb257b6e6e84def31a26b22a2375c9ed50e0e02041ece9b09f50" + }, + { + "address": "2avexrXAe1yFcmEaFSMpp4E6bkHDyonTg8i", + "bitcoin_address": "18ckgcA2LJdQVrcdfmT6A3LxmQA63sA71A", + "secret": "4f62ec6881c21bc8ec63676b124ce103a59d2acfac567827d29d9f3bd8015562", + "public": "03e17e14a0c2691b025b2a07d63ac21fb28451db69d8e18904ff8161ca6bd93f68" + }, + { + "address": "pwNab8Wa7Sag9Cg2FmEDF56izp8mD7kzQw", + "bitcoin_address": "1Q922ScbuSn5Z8LEQSWHQpVpBMjitnSVkJ", + "secret": "fcdf5e499b22ec63290dc2c680f87745aea192abf5aaef858c007e946ac3002b", + "public": "02ad66e1ecc629d989a0c80f81997906f5465ab1d4ff908f02f23e8a96cfe00f50" + }, + { + "address": "scN5GgoA6epthFqoXEKc2Y5QZz8jyT9FNf", + "bitcoin_address": "1NcTbnEQVuNYGDkRxpnW79dm7iXBoiaDuG", + "secret": "24decfe6e2e505c5fb7a9a7a6608587883554ed81bfdc581921525a5a23f6305", + "public": "0344f0bedc327fa09c9686235ea3b2139c07259497264c2b4461cedda3f55399fb" + }, + { + "address": "SEAR4hqpuvGLPVoGLpd5U61aoYHUc6jNqG", + "bitcoin_address": "17Pe67zy2Hk4PdMvY3uw6JX1R7YYKGqLNQ", + "secret": "b5093a711d22263967e5ce2b2aad751e6742cb34ab51c8d517a328cb406cf801", + "public": "02b5fd3eb5a00f7bb172fab386af63c965e72c1874520fcf2121bb3bb96988f68b" + }, + { + "address": "2agxCQqyVw2Ne1n4CtBboaWQ3YjmhXaocdh", + "bitcoin_address": "12wZmmFDHoKmUWt3fsPceU8FGsBacqMENr", + "secret": "ae897238f5b80a8312437b2335442d83c695feb68b44482f5bc2684079ca40a1", + "public": "0294e9cf3b98d6c5386dee498da50e2a0fd28244d9edc82aa0aa3212c4c0ef06a7" + }, + { + "address": "XoHShPLTkcUeFqiwSEfRgvJnHHKhNYAHc6", + "bitcoin_address": "17cjKKuS1DoQyMtVPjQoqPsMUkEw1A8z1k", + "secret": "bcc65eae057e0fcf3e423255a0f5ae2ce146919bb707dfd4bd3fb762fd69d78e", + "public": "03c740e434cf3614b53c2788274f7a356905a8a1a27725d6ae9e67cb1a006027cf" + }, + { + "address": "2hGNn3KRW1Amg5xWEW8HXDW9pNhdyvp3Bxa", + "bitcoin_address": "1AmhPqfpiLWZBtKHs8kskjShyeAA5zrFap", + "secret": "7b39b68fc581a9bd7d759a74dbc1d7beab35e0a64660372ea1d598ced36d9ee8", + "public": "02a8f5bdc94366497ffbdf88fdc423b51718947a0a523ec63547f88b1c10c0382e" + }, + { + "address": "26T57mqYiFif4KBVW3N9w16RGfSg8VP9FfW", + "bitcoin_address": "1Cj2pNB5avfrhcieqf4SziBxcdWKQPfFG7", + "secret": "c71f7cabea5b39352997f647f1481710c13ae1a29a06f01480af3cab1e6b2f8b", + "public": "032f0a83a1826005975aad6e23c87088000bef7fafd11a52e1dadfae590e859a0e" + }, + { + "address": "2eCjgi3o6eTNtj5fiTs9Lu7CW5WMXWZhfXN", + "bitcoin_address": "1BTSmfd3iaAVQ2Z69pkSsNvVbZ2YBWBLDE", + "secret": "8d6142ee69ff6eba19bcd25fb16f1c781a93d404385dd9b90e85a4881187797e", + "public": "0339f788c880d61c3f6fcc23e0e90a1c18f79460533f392389650151314d59058b" + }, + { + "address": "22a6YptFqi4MjqsDjFp2L3d5ZGV9NDuczfh", + "bitcoin_address": "14Nu322uuwrAs7Jmx5UrjTc17B7JjyVB8K", + "secret": "865f1a3d7d1a95b54627dcf64e3677cca758a7cf35aab7389cb2eba2ec6607d9", + "public": "0266e102621ee4087707692aca8cb858cb51ecbcb5579b99cb2725749674394766" + }, + { + "address": "2Tzi3mCkXk2h3GshRuw89zcku2WbvZiYXmf", + "bitcoin_address": "1KWieEnkgYWewhjisNTzBvw2EtoKGkH65n", + "secret": "1a4167d782b49faacbb3c89994bad131ce61850641f79e52e4246bb1a05bbce2", + "public": "02632b4a6bb063f28ddf1034ede2e900194dc1d4d709c33672fd33070291f53d3c" + }, + { + "address": "9YRxCxLexL89oe8RV2SFCZy4AQaBYXAsLf", + "bitcoin_address": "1H4iv73Uv469JbUe2pt9ApVyL31hr1Ajaa", + "secret": "253249e9c22d9c28a110be2d8be3acbdc6a3d04bd001a07aa6759a3be2a4c591", + "public": "02548f69543f4622659ee0ef77db503e734112813f70d3bfe6b4223b395a74364e" + }, + { + "address": "EXAHo74kkrdfFnFTEU6zKSMubBYyY6ZmWL", + "bitcoin_address": "1CVkYJxjWVM9dncsJarNRSAPF4Th4eTQd1", + "secret": "1a5f08c53c600ab5a52e948bbbe77cce9ad52e90aa14d16d78938fbacebc2c4b", + "public": "02cfb2fcf1ff02fe24d210df86d12cbbdc81429eea6613824c031a8da77db2065e" + }, + { + "address": "2RRBNvJSxReWxHRTqxHoUs8gMuhkBAvQaVM", + "bitcoin_address": "1Nxmu2RmRvRnzVByYE655eNyfhYXNMoTeU", + "secret": "4ad2c6899bdad0d7a8b36ae0ba0fa22cf6713fe48a454327ebafd2a2cee2bf57", + "public": "02835fe7180f085ed98bbb305c84470d585a391a9b53cccb344f26ab0591efe186" + }, + { + "address": "DLLAzoNAdSqmjoeHY1Zs4C8cF5TsVrhxMw", + "bitcoin_address": "1Jrwy9YByu8B4gyBpgoAJe3TppbnYKeztH", + "secret": "436f14e457a94af30f1064a3ebe4b925feb0bb08728b9b37ce6e3fb2f048e6d3", + "public": "03e6c236453466b1c7e7ec6edb05d8ce526f9b34ed696526e39cfa0e7974289043" + }, + { + "address": "2g7WeX2ieVcucWtFhqVouh2U34VT7jBTKvY", + "bitcoin_address": "1JVaWP2dy9j5FhNyEQ13qCpnu4GVKb8jeh", + "secret": "6c147b748cde69b07054d13132180dff1e2968ec311727c3d5b430074abcc53d", + "public": "02515f6a52401a03498092aa16c0fe94725030545b987e2572c5700e91c7dbb7a1" + }, + { + "address": "27rnygUUorp69QkwCHqzy5WJMc1hnxoxN6n", + "bitcoin_address": "1iCzjamUkKEUacTAXe6h6p5FVcDkdfAxv", + "secret": "2f0606e012fa536aff11702f3fc192550abbea7ca580f65ff44013f6e6d2ee62", + "public": "02ddafc8f9963dab80b74c602d49a42f9ae8fbee1ebe9c10d72ef00284c563527f" + }, + { + "address": "2RcdcDLnqB9pvNPy15MaqcSNjFjZ3ToYQt5", + "bitcoin_address": "1Fvyv4iNuvYv4hm1oqea9p3KpfraTi9F3K", + "secret": "0fd61a8d1265e0479293983b5b6628867fd99f965179e5d51901c602ef2c8671", + "public": "03b9420f1acadb53799c7bcc7693d1024e45b66998821c957abf57def534c82d3e" + }, + { + "address": "2L4E53nxkgMtdEJMVEetmEqN8VsH8bvN3qL", + "bitcoin_address": "1KZJ4CofwZzwtq2aRrH8TkVdrgskDC48Zc", + "secret": "5bcf2fd07fa946483b0bff30d0008398e584ff001093e588c99d4fb4303a6654", + "public": "02cc1fd871d6ad834a8c7997c38b1101b7bb781ca886add7ff39032d7e11774031" + }, + { + "address": "nasKi6MWvCCyupab4SoScbhxJDYyzS6NzC", + "bitcoin_address": "1DmRRH35mi199cFEJBcjMXiYQLuZAAMQtY", + "secret": "9c3dce71afa6edd50d843534d0d5bc755c36e0609ebb4d42c14f144d67b57867", + "public": "033b9a12e3ac267d17c0ad1fcbd0e6204d57f021cdc3e7d63a186fb6b46c9a9344" + }, + { + "address": "JtrbAukxBVGesZgcuU46nqwYnMJxSvS69w", + "bitcoin_address": "1GTKStVNa5XVtZgpuA9Pa8uVXzZVaLUqoH", + "secret": "f6f2398e745d764547fae8d939cc137b21f0788f4bcc2b18aaa98ce9b5bfe3e6", + "public": "028a5936ce42aae51a92e89ed3d000b81e186892e3ab72da8ea02f36e1a09656d9" + }, + { + "address": "CmJZiinFtNVFsFGCo4ad5Trup7DBmehmB1", + "bitcoin_address": "18L7gmZTRQYnzY22zoXutuKUPqdrZXvCQJ", + "secret": "deb89ee1539b6cb4ed4a3ac1153f6893565b4279d9aec526651e712a02bd29e4", + "public": "03b3ff7fb687b17b45178138fbce9bba96f1def5781564adb5964bb5c1d292f2da" + }, + { + "address": "28t9se5L397uuatoiv2y4q65ZB73C2dxRRw", + "bitcoin_address": "1FH6AdXTiv7afWp9B7RJk6jgqAWDStEfnA", + "secret": "ac33995bc96e8ff83a12a49b22673484f8c3f742e2a9be2ccb74739d603e023e", + "public": "02863968a7c079c5ec060dea520c87396a60b840d7373cb6ea1a1c250f8e273031" + }, + { + "address": "2bjyscrwVN6nSWxM8L1yhavTY5326GUgdMU", + "bitcoin_address": "1PYz1EXJhAnEFKvghnWeV7wcWnRnEsdXmJ", + "secret": "54faa9a7a42f6159ddd56d8edf97acf1004129786d6e7beb88e0c7471ca32c67", + "public": "023f441a065b9026c6574ab08869d322d1dee79cae99f7bc1b71b98db92fab567d" + }, + { + "address": "2fmezc3WLhTCwfTz5AG9C9s7YtmGaisLSLz", + "bitcoin_address": "1JpXi6V1gPa5uiJsAfhvbbdhHL7RFTNPU5", + "secret": "c2c7d6d6cda61f543af9793d80508bc62b19896216039ef946d8ba68fcf84798", + "public": "0290d8e460b751e0cafe38855a130effeb6f090a0213374b537d6759c617ff4c68" + }, + { + "address": "2PwxALhCSc4XrgRCMknLxFWMoRwc8WYF2cr", + "bitcoin_address": "18JYVvEs3QedgfobGjm3jRFqmN3fTyho1t", + "secret": "c7c3b8f070204163dac5aa2b4318181540662a63bd4f0ba14906e44a6337fbd8", + "public": "028af1aceed2ebe9cf27ff522fecf8136c066d6c6c3af1e4030c8f9e124ef71602" + }, + { + "address": "BQFdx54A54kcGLx15CGi6Ffnaz8iCTksfX", + "bitcoin_address": "1JGKVZzeSXuUWbXscVo5PFnvdvAcUoVpz1", + "secret": "f7ec3ed86093aebef546cb068c0aff22079f84f388d16399ae7410d171b8a095", + "public": "020310b0d4934d5f28db1e6db364392d3e71cd6e31b95a94d4bd5cc23b7d9e8c41" + }, + { + "address": "UNEV8oNtzoUHHTRuYSZs4uMCEYZFk8Bob5", + "bitcoin_address": "14nL495YinbfPNHqrpdav83YQ9KvzFkTFT", + "secret": "8e0c7f3926a867b0bfdd1d1b62ed3462f9e564040f013039ee4e94c8b7519512", + "public": "02450766db9e74917020297e0e3d509a584390be68fed4ee488362734f075f38d1" + }, + { + "address": "2ZMV9ShQLokk1HTUVhqzR8J9tABBxnzASnA", + "bitcoin_address": "1E8Bj4tHqedouQjfqW2bTEdELsajv5jMGv", + "secret": "ab2059ce17a55d13e96137be6838b108105d561e6a888116550d0fbfbe8d1e31", + "public": "02d21a40b09a09dbf8947f67317f2262d2c72fbf0a96c8f143c65a09355a3b96d1" + }, + { + "address": "KeykKcYHZy4WKXXsEor6o9PuUJFTUVXbz4", + "bitcoin_address": "15CN5mydStXUq9pYafjVpYSDohyN9XG1gC", + "secret": "d7a282eeb2a7b1182977013d3583fa13e80d955be8ce2cdd2125635812a79a73", + "public": "022d38ed4c43431b5ac35352b2aa5291c3754075a232b694a6e06740be7f2353c7" + }, + { + "address": "irKDBpNkRF59SEC4aeJ3uBnGfsX6T991dx", + "bitcoin_address": "17cTmmCoxSDKbWmEoLiQWCXLpDr1CQ5thR", + "secret": "be96ac4a73e5aedd538eb1c38bdd31ecd4600b1f4987bf64128bede52820f02a", + "public": "0233d41add351854a597a7fd80ba47c5124ae8d926c3c24b531600c2e4f9688275" + }, + { + "address": "2LWEVDkftAQjJBgaW8MPPTrijdXyH4wGjEn", + "bitcoin_address": "18Aeiq3EpNNh1bWs4SdK8FWni2JqzuP9r3", + "secret": "f6639cb6b9a3ae2cabfe37404110cb17a0787fd92a109258a6fa19b183003764", + "public": "0381f5570ce75b62b655e9aecbb02bf5376adba0e91f21e893ea92e21c8a50bc2a" + }, + { + "address": "u7uJsj6EsCd7Z57jQnGQNFAis2YiyoeuuM", + "bitcoin_address": "1PrvQvpgoNBKwkwnSEs3UGPrLta4NNkTQk", + "secret": "034d44196c5ee1eded33599fb1bc8cf205b544f86e8947afbf49a868d081206b", + "public": "0245a408560b1f747c86b47033b083729f5785ef6b00cb37fba401ddc4545384da" + }, + { + "address": "EuuHKQUFGgHN68T6VkssAwNxP4e1htMEAU", + "bitcoin_address": "1M2PHZQm7D6smjosTSxvksGf66Bdx1kf8B", + "secret": "cda4c7df62d18d8ce0141c62fb52f05c7a987706ccbc26fdc8a900836711772f", + "public": "02894d1a4b8e222e1ae067c20567475322f925dfeca1405e2e30b845e3ef047756" + }, + { + "address": "TFVXLJKgoGENxDPfiNn9h1eXWLbER71Dgn", + "bitcoin_address": "19SGTz1oTi5kyqcshwxPLFP2F9YffhZJ5W", + "secret": "0e7d7e87f806b6d5e1063318268fc1df380d1e0aa13499d2b7e6034b89e94943", + "public": "033e8aba7f8c579c7164aa2369c62a3cbcb24bd0b49bf5339841d3c42048405a38" + }, + { + "address": "2bFS9uBumCkSkFhbaV8q3dYnNxx7725JVDV", + "bitcoin_address": "1JhT2pVGVrTs7uqgYs5DzV1Tq5SYRXwNZs", + "secret": "28672a34711c4d818c8feb835dd2198e0dda20d4dffeaf78dcdffef05c991370", + "public": "03c88bdfb32a4c8932ef3b06d066495700cc5161886f6350f7dd46469b56ac3ca2" + }, + { + "address": "a3QUbyUgZaXcZtZPFm9ChWNt5DjYgo2wKH", + "bitcoin_address": "1N7P4zuJQn28ryKRLruGJi8Auiuux9b26R", + "secret": "dc644efb58c344e4f999080d7d8847ff159710c85d0726b80036c47e336a0ec0", + "public": "03494aee0e1406ba2ebf85de3d3fa5cd19877e81720be24140d9d703eadd14d881" + }, + { + "address": "2NZGkbUWx7CHzJ6LHTf7KpcDJNbMmM7PG6z", + "bitcoin_address": "1FvmxEADLcqD8oj8sPJ5jqKGZQScrf6ZAP", + "secret": "5d4fa6c7fdf51ef26a9095245dfe6ad181f5284d338cb5b008e38a6e07399b68", + "public": "035492a39daa2b6abd7530b5846e06fce0ff45f69f62ac722f0e315a092d377923" + }, + { + "address": "2daa3YQCFEXFqwZ7HwrfhSQXgmDucjkKC2R", + "bitcoin_address": "1KTD2VkRGLPzLRjYL3dcnotesVPZizrXg5", + "secret": "a9d6dc77d7e4633075d0581eb43cb6266bedba600c62a98fd2a6349b04b98ef2", + "public": "03d83767f81104accce7893437d33f613567d85ddede6b88c0973ee8ec672fa7f0" + }, + { + "address": "2HrVw78xZrjDMz8YahiRXVgghRJNYxvoMv7", + "bitcoin_address": "1EBJ3rYpwjgZxHc8zzZgrTrHYF8nFqBJEJ", + "secret": "65a75bf3ea1df83c1d56297990620ef347b6671e4530991a15a4a0abc4b91c53", + "public": "0306ca67b3fd9b45f14865afe7405dd8810d81ef0fb27e11d4a98862565ea54eda" + }, + { + "address": "isQzfULaF8qsZwEjVqttXC5p3CwWdVrsEm", + "bitcoin_address": "114AVVPeUE1EHP9E4dkrJ13SG6J5h4bQiM", + "secret": "f421529f43cf5de54382f390fb7d4118f7151bf2b114eec6205d9fe557d07024", + "public": "02727f6d688ffc1afb11202b85b37e35478b5619afde09081620018f485970cae9" + }, + { + "address": "bBHE5LpRBZEaY7upVZrk9THomitAmUQ7pw", + "bitcoin_address": "1M2eTTKem8FetFrNZ7Pj4bfTEENZWMRJPU", + "secret": "22f23e4560ace182ebb9e4c809236e3c37e636d02cbe41dc7f57f1b0d53c3034", + "public": "03457a68ca3c395a1615bd7b41db4338b1648c076fe008973377252f23d538637e" + }, + { + "address": "R2Tmy6uLAyyBVkV9c5EzLvx7dn7QWkgRCp", + "bitcoin_address": "192dGBx2WTV8yhV7JipbsCQbc51uHyvv7S", + "secret": "5f6cd6f06cc6c5658f2212002bb31984e98edce455cae435b0abd2dd68549c95", + "public": "03a51c801274b5774032661bbfb691d832da2ecf19d77a6be035a4e0080b618d8e" + }, + { + "address": "2FbLk1kx2pqoKJifFNVKYYdhxKQEJLqBa4p", + "bitcoin_address": "1Ks8rUU3u6EZfUtJanW7Bt2uqKrnaSGEDU", + "secret": "bd3591b1afd596cdceb604d4c8755faf9effaa8e6a42637066db28b22bfbfd7e", + "public": "03717c0ad9214a4e590fc0379be9696c4168443458e75a3552cb1cce9f40e5bae4" + }, + { + "address": "D4F4Vo5xPLu4YX1sTaKzQfUGnmGk3yCUb3", + "bitcoin_address": "1HRScMbJkK8keXToZaihXeb4gMTGqPvja9", + "secret": "03e60b222f3d7571669e7f943e85d08a65693c8d2054da755149802a69307411", + "public": "03078a2be8905c0c4bd5bb15bc52388f90c996f7e59c8a0351dcba8876e0102c55" + }, + { + "address": "uZKWALKm9AYC3GQxxC1T5i4SZTtDaQ3ov4", + "bitcoin_address": "1E3PAjqJXNY5u1xj4QteKhTsdvai4e8QnK", + "secret": "be694dcc0b7c37ca2251b509dec610b1501ea16cf2dc7e48fb44953eb881373b", + "public": "028fb5be4d87deb707259c4fd9fba441f3f89f171c9b5b39cc7cdb3aa694694bec" + }, + { + "address": "2Bg7DduvSuHQQodT8rDm3zgubnLApfwe1qF", + "bitcoin_address": "1FirLXoxrdLgCwhV67ytDy6RauD2aezv1s", + "secret": "6a10bfa1c59f6d4cd1be7e707320efa6160853bdfbcc7969f9b30fbf0a9626b9", + "public": "03bdc46bff88f5854dd6aacf5a69e8b344a45633c6b2fe46b902188f70d7f4af46" + }, + { + "address": "XLkHshahJQ4QM3XdFqeuTEfzq2B2Sut1gB", + "bitcoin_address": "1DYPSqdQLd18S7YHmeLpdQo7B2kguHam14", + "secret": "48d4aed38ddaf9131b75c34976cd6983d4c35009eda7461217f9f24dcf51c854", + "public": "02ea0380924ec74c9a1e61ad665c283c6dd8e69d5a403318ea0c9f6dfe6bb71c47" + }, + { + "address": "2BPMq8EUBGRyrz8NDSaUSGT9NrFrcDjq1pN", + "bitcoin_address": "1Jw2LZUhreEp9m9rXJLEu5fk5oNiqLrUgh", + "secret": "96819304e4803e15daa655205cee676dc04417c368b9851280c2c54fe509956c", + "public": "02382b4e6a8feb6d13de1394bcd4fd9dab6e6bdf4de96c9f0efd917d5997b94f21" + }, + { + "address": "2GGWkSEStqCKs2kGUa4pDbg4RxHJVhh3DyQ", + "bitcoin_address": "12gg17VT7oruffaALNibUgHJLk7tLcMu1D", + "secret": "e81e01c500a5f159cd5451b054568ee1ffb2700ddf61fd38371d0e128934007a", + "public": "0270cfe30a0fb41dfe30b9d897580ea16a401c4c41babfb41a78b1f20c12caf0d1" + }, + { + "address": "2JAihz1jHZxDVSJ478Yx2cdkseqm6ZfNnr9", + "bitcoin_address": "1GWin6cSffpUQjACDgnuS63YZNMM1N6ZpG", + "secret": "c40ae6bb5a1c19764797563de1eb978ba85c686a379247adcf36426918f8f25c", + "public": "03d8a1fd67726ce2aba192f8358ce9143b8eec0066d80e93333f27931c8c96af56" + }, + { + "address": "2e3SyTQALdRjunDL4VpUkQqZ7kL45twGSvy", + "bitcoin_address": "1HY7RshWXzRdPZoFuhZiPtQrnmEiSyfLaS", + "secret": "443200ff2becf64f313a047c0afe64470a1b79ea56802a2a782d8a4c3b0e8bd7", + "public": "03245acebda4649d21578bd2ac5466470125d9785668e0d0e6d6969ef23d99dfc5" + }, + { + "address": "iXws2tgmeN1i68GAoneEcEzASNosHZCrR4", + "bitcoin_address": "1KKHhEWg4NQhjvcj6TmNY4mcmpVridEWKj", + "secret": "a525b3c37481552bebf2b7f6849d5cbf8d891f804427ceb01b4d0fcffc3e6a6b", + "public": "03631cb9c53d25e67cede82f50e5fb1c905a166569894b2f1a75109253ea455ce4" + }, + { + "address": "RULqwD1WjY678XddBPK3qRJC1KC1MLg5zi", + "bitcoin_address": "1NXJjPKM1LTF5TVnTGHRtJK4q9MADdBrWH", + "secret": "9d465bdd07bbde238dc7dfe872cb05a3a8461893af61ea37f85a8805edce44d4", + "public": "0379f5996ed66ac9a17a990cba9b619cfabf87336fb41043145d240bf88c1c4087" + }, + { + "address": "2e4ekDcVtjG6PHuaeVBd6y7JSiLKphizGo9", + "bitcoin_address": "12HVsJadAe2FSZPhdq2ob7DC4rEJuyHonT", + "secret": "601832e7a373217b5c84c5d77cfb1581069f970c0ec3f96f59f2907a69bb9c6a", + "public": "026302c344271cc040efd6536cdf77fb09f2a8b7cf49a2159a595770e25a741873" + }, + { + "address": "2iLYSsW9o3GGnEWRgcuPiXrmZ3xpKR5SbH3", + "bitcoin_address": "12YRjMqh3rXs6LuYEMHiGNQFLVegzak39t", + "secret": "130179676d01bc4f06e818b9746ebefbb2ae3d7aeeb287e85db1dbcfd1f12ede", + "public": "02057b44f1b07039ff175a24e133240ee378d036fa07b82b6f897ae352b8e9c66b" + }, + { + "address": "5Xx14ZZYBtd32jH8vRaQVydBo37PKDPXSn", + "bitcoin_address": "17YKmfTCX7jDAPU3T3N3pAvcDBjhiDJjH5", + "secret": "bd8f3c1423a321e75bb1358e9e48befad2730aa0eb351f35b89264686482833e", + "public": "024cac9550b8b534595cc4b648335256ce22e25911cfe85e6b50a59484ef0a6331" + }, + { + "address": "28m9mZA2vpkYVRotYxaWU2cAJ5rNA4fU8qo", + "bitcoin_address": "1BYmmpSpYTkJFWTkByqMbBs5GY4d3MRZCj", + "secret": "43e19b1dde61837e9237afd145664c21d57ef0878c298b22db20d9f1383c5a0d", + "public": "02c2d5b3e587facaa13bc9b480be8995b06cdbb83edecc7b9a751342a1dc47d3e0" + }, + { + "address": "k5zSTYgM1JJygeyj1HiH29quDhz7kp7CdE", + "bitcoin_address": "142AfB3RnSyTyhrmQJ6D14Um14pZLF8YdC", + "secret": "037824cdfa5b27ea0918ffaa34a700a32a8d216f04aef0335d775adc5dd47ef9", + "public": "0257aaf74b90dce0b3bcc41b0d28ccbcb6f4bd6c06fb24c283a740bfae74cdc136" + }, + { + "address": "2Q8onKZCoJE6YLfSqENhPyvkHtxvduBy2t5", + "bitcoin_address": "1Aeth9EoKxwfBXpxXNvKW7CQLkUJCwXJFJ", + "secret": "53e6dde235adc370674fa60b7718b8b8e66e37ddadad2c4a75acf50f8d1975a5", + "public": "0244e3aefc7b751b97ca4a0302d31f361a93fcbb1d89ac1b1b8bf6039975c6088e" + }, + { + "address": "2K9tDb6pEaLXzndCDnSEotEiYBQazoDEmMd", + "bitcoin_address": "1MdzubW4X5qohtgH5UsgynVvrfVu6ZTbC6", + "secret": "127cf350a9dd07e2622d53b5c3ddbf73030882d55538746896b135004e9668e8", + "public": "0299325e94d7e822b53055d1400a91d914993b96b78b2273d52e9032710a2d7404" + }, + { + "address": "2Po1yzP4RSDm8p1w1tF2nbwcUcCKaEEoQJq", + "bitcoin_address": "1MavSA5iscNjiuUWSB9sqtBQhRDjHa1sev", + "secret": "74ed922d8ee20fa41c5cbbec171d1248da080b3a974d0784737709749c6d9374", + "public": "0316f6d02dc551aef7eb45cd6d271a333ffea11c2a3b6c95ba84f44b1a7e366da9" + }, + { + "address": "ztvFFxYHYLzGDmW83chkUToB8Htkz8119D", + "bitcoin_address": "18ZCjHpGSfMgSYfAdDDMAPUtxNNYY7tiX4", + "secret": "1696d5006de140218790c9620873ce0b1b605711686a0b9fced1c0b10677b5be", + "public": "025d0053049ba7034a6d227041ee2800b3d4b575506c85b62a0a2e22791f88c093" + }, + { + "address": "22QmSnYryfxUNRpgM6j9uA57Dn7Jhn3JxFG", + "bitcoin_address": "1XMXCGP1eGJT9eHFGBsJC2Qe1oBvRQXNA", + "secret": "05042fa3951fcc1c3e392349d8589cefdc6a1eb6d986f497fce500bcc454b4c4", + "public": "023ec539cc83b92a8121c0e45a3d21ac79c364455efd3df406a87845ecb7f120be" + }, + { + "address": "1EXdxZfNk4VW9ZdXd8VHUah3nBmARtfD4r", + "bitcoin_address": "13BtBjqaTJbzDm2ikvx88vSQeNpELZuA72", + "secret": "291a3c544d77662dd4266425368f39e05b91ca916a8b0b4bcc773567b0bc461a", + "public": "03612f2c6450b0e95960d8b5d6b56dbb12652193f843b30cc9770e46761cdfd24c" + }, + { + "address": "AH5WE6cxeqJ7g8ThBWCt6351dpmqZxEtvR", + "bitcoin_address": "1MVGtN4ZVF8XNaJvtvmx3suZCBvrYZjtLk", + "secret": "387d9f7de29bbcac267ce51dd1cd09cce463cf4daa2e208f5a5caf79129cb03e", + "public": "02144e16ad2e88d743de602393d93b9154c30579789546f39b1538c787934d23e9" + }, + { + "address": "2bUvBzrA2rySkTsTz8ubjxUiLG2X2UXk132", + "bitcoin_address": "144A9YJHxnMLPw5yTcgLBwHLb43YtceQrN", + "secret": "730001c2c9564606fe0148a9b25a22150b386edbc657b81bcf63fe4f5e77e9ae", + "public": "03ae3acf63026f08d3369d57ea42f277c6b5dcf5c2c36f1dbe1d1d8b54b493cc82" + }, + { + "address": "K8jHVZcygoN3e7Uh57nUfQJzmews7rWi79", + "bitcoin_address": "1PpN83j7g3FA1uxiR68YMrgucbkC99Xb4Y", + "secret": "02b6931812541d3cb7de3dcc88c877918d477ca0cf6f25ee7d728059bf11ba97", + "public": "0225b37ef3f5014dd5b6eeefcc480e1b136c28e9147f98e14ffcbaa6ee2283ff11" + }, + { + "address": "Cr2ErUjL1UqhiVMVuPu5o73NDQhRFp43up", + "bitcoin_address": "1P3oR4USRnYP2LsvR1pWG1CdAqCvrevVXM", + "secret": "e55e26e1fa9decc1e8030bcabfe2c996e08a2a009984128e7301cb815d96bd61", + "public": "037599174736e30d76f9ecc5dd1107ba032353641ed7eb6acce126b0018c7ce71e" + }, + { + "address": "2UrDkbr8qkLaUJHMYkXN3k9xvmh4D19Ucei", + "bitcoin_address": "14psMjksrEQ1tGw79ZrgW4SYe1LXKW94V1", + "secret": "4a8f360f40ee58ff53e957782eb3aadb861a6e0ec252339c83b5579c1990a37e", + "public": "03b9c9c0631811a24edf9e79901114d1d03b762561183d2651443ccd65e16568d7" + }, + { + "address": "2SnMjTtr3WRJ6q8GU68CnT3vMPtrXcRLiHK", + "bitcoin_address": "16U7arsrHyV69TbZA382DhJzHGNR5GKH9k", + "secret": "9ca92d31e7fa4b7827126bab0ab02d2bcb608af1e9efbf4ee0edbca3c387fa36", + "public": "03856adf3f6a7079e6d42275a21fa0ce851eda69b1cbfbd96d25f2d72228498b1b" + }, + { + "address": "2dXPVZij2rRzCERmaXs5fjnB2epMy6ftAsj", + "bitcoin_address": "1EGuiWmw3SFrqjC8fM5NR1TCekquV7CE1b", + "secret": "28ca80b3f0db34c13e73b7ad5ff8605a6ce9099f06494a1a7b6727c51c64110d", + "public": "03545172070d03df86e8ad6580ae6fcebb6a775f2a0612d373395279debd7269e6" + }, + { + "address": "aMdRuCA5s1Ak8QqcEn7gmX9xFUJXebbntH", + "bitcoin_address": "15VeCqvPSVXJJqQ8EgNtS9LommF4tCYADD", + "secret": "d24f4bb16b89077ab63a2faa921162f4f9ff33558c6ac33ac72f76af45cd6fb6", + "public": "02866b765a68f1befb293cce71775697e8cd03cf3102a9888f337e5b1703e751d1" + }, + { + "address": "HJd5e87cu7zu2GEWweaf4SVYX1PCxHnHmE", + "bitcoin_address": "1EckWwCNheK2Uk8CymcGSWt3wezyTZ8G2R", + "secret": "be3aa9e7df5bf981a75ed0b655c7490d2611c23b973a902d8dc5295c4b41b555", + "public": "02833598127e11f7935000892baf351e5a0de50a008d5864f9a951fd5449859e66" + }, + { + "address": "RjvjFhLR8UWA8UUBwmyPFV4V99snhSujJU", + "bitcoin_address": "182dmQsWosncV7qgsRsxKfq4PMXrpL56DC", + "secret": "9f17ea1077558a3c898f0d080eccb1bb2385beabf092b3f84e027a9a84fa2e1b", + "public": "02f6ae99ad5a0e79e75f681b8c365e33ed31041d6038139c8f0c46a9cc467b0efe" + }, + { + "address": "smnUYq9hco8u5Q19wWRNtMieS91EA76vCY", + "bitcoin_address": "1zosHy7AS9TuyMfQ1M3LvqdJogaWAUSGD", + "secret": "b813a912be979cabdbca7b9b7d432b6b969c8b7d9b9b0c69f7e697945989aa98", + "public": "03ac5574e7787a94d7e79733f7c1f428805bd502608888a670e41c548cd3d466d9" + }, + { + "address": "2KKp3DbztvFi1Dq7fCbqJW3jyMLxRcVgoXf", + "bitcoin_address": "158vTgueeeFMCNY1BEFsLEgwf4Z9wqP5DG", + "secret": "8bbb021e60073065cd2250b0784e47fb0cca7974853166e3e942c070ad192a95", + "public": "02fd39b777e33098fa4c953b2f98660005a27fbfbea9c8ec8bb96fda649a139edf" + }, + { + "address": "oPWJvhk5tDy222LCYAzJUJZce13cVoZTba", + "bitcoin_address": "1PwQzLxDcRQ2cJiAXZcEtFQSdEvTDA4p3R", + "secret": "0ac8ae1963c9b62b27d6a0dc32a21daab5197c4e81ce81bd5f06253a36b0eece", + "public": "03c29d315728a212c153f094f68a93693bb09aa3868f5c0ce9dc349e2792f0bbb9" + }, + { + "address": "V2KpF1Yoht3iGMEpJ6VKLpm65uYxEmk6L8", + "bitcoin_address": "14HvriRqxgghSSydAn6jndbw47Kg6P6i6f", + "secret": "c1786113036db1edbd2e7e85322ba5b0f49a71b49d975cc503ec0bbeef70c8ff", + "public": "02a7359427fc56d44639ad1823805fe2790034811320361c0884e8dc3f9253bea1" + }, + { + "address": "ghZL4ds3pEAQ86zaZ2VqXaHajC7AWPvazN", + "bitcoin_address": "17nZXg7vmrM6E4dovFzh67h3Um7GYKefTo", + "secret": "7ecedb39e58d7dad0d035c947e350d7266a836533294dd0b645288f31fb6ce3e", + "public": "03ff6b7ae9a48247ae440fe8277a748995d1294ad40175eb63810864bb05624984" + }, + { + "address": "jRzDnixfu9hJoTGA19diDvUZmx4wFMFzYz", + "bitcoin_address": "1NCa34dnw5HKYg8KTedaJPHoKy9iY68zbg", + "secret": "184e8fdc7e1cd4d666c578601f9230f93611f465bce0e429b2e7406f41a249f2", + "public": "030e121a88721a5e312c6508e3d76cae63d27cfcd5fa0d5109a620174bfecc7355" + }, + { + "address": "24ZgZVdovTJGACYDmzTr2UmCiXvLS2BDisr", + "bitcoin_address": "1Mjm5hQ3FwQX7fGvAmsqHLdeVmxXYoTAdz", + "secret": "6201e4a74d799d9322a373d5577466f0b958ebc66e36b0c943837be70c4856c1", + "public": "03cfde6af9a8673a45c7394073a7bef3d5c734ed5fbd9e5d6bff0905521508f036" + }, + { + "address": "9QLaTBBFzbNT7FqtLyr4mC3SjUF81wscKu", + "bitcoin_address": "1GxUyCW4MqzJaonUYDjWsHizAkeS5DewQ6", + "secret": "e14ed2a6506c03fb7235637ec696508d9a4f224130db2112448284d97319f729", + "public": "0257544ad0489b631d7f839ba50ba8d817fce3b68849b014535c7c579b053af479" + }, + { + "address": "2mrdnsDH8GkDxzTfKLGM5Qic6twVNnUzUCp", + "bitcoin_address": "1LvVQK4KsQad3skX1zUD82Eo3t2yXsPnrx", + "secret": "4272244bad296247de956a03b15027018dc3eaa997c7eddb62e11eb4b62a5fce", + "public": "025079ec188d81448851558da00f1375167a99f5a47ba55178c23bd5fd83e8fdf8" + }, + { + "address": "5r1ppyYuyjxLRchj8iR88z2v2YmSjA4uRH", + "bitcoin_address": "1AVFBSFeptALW6xWrFpZ6LFvXadMm6SG9E", + "secret": "41399be04144c30fba7767d2a8b320b051efd72727a73b0eede7503a150b82c0", + "public": "0348852f17e6e423f99a927ae6711f0ca386950dadfd23e87d986e13c049249636" + }, + { + "address": "d6Kr1rcKXZFsbiA9XnAvYraR7K9b14mtJN", + "bitcoin_address": "1AmUDCyFS5w9zBetQwkGuogvcaMJnB3hfW", + "secret": "6dde963a31bd1c4ea9dac7c262a503f73f7f00a30b6bd684d39c7b774fbff32b", + "public": "039e9dfa055b56922799d5abeb4d9ac9afd653563b5827c1c0a3382cb33d32b937" + }, + { + "address": "23w3Mpx7B6T7YzS61KzGRTdFaqqVhfhSPVh", + "bitcoin_address": "16NXiff63VwSL1KryHDwxqa2p7bLZoiLrT", + "secret": "3e1e627486422c1e38525ffd5f3a20b84698337fd376a6298914b9f7ad215cc5", + "public": "03fc41d428a7984ab2e8a86de2c72fc843e3cd0822694a58b33f1d30295384b091" + }, + { + "address": "2UE1RjgYByFJTaZWm7CASrJ1zLpD6A2ibpN", + "bitcoin_address": "12HQbmPmHptHh6uN4kpnMtxhju4ibUDJQm", + "secret": "1658c7ea9d9c887b47df2bf778a2a9f02acc7342c7ee98e16250e51193f70e20", + "public": "020d1c92e2a29a11e5b77449d817edaebb620f4bcf089108fd5892d5e293760855" + }, + { + "address": "2gUQycnLvW5PNbjx8zbX6qqKSMx8AZcbHJN", + "bitcoin_address": "1L1S6nCZ4Dn86enJy5AddX6MP7PLVadnZ6", + "secret": "29990b7a22aeaea7dc196cd588c0855ae29b9cc501ef5f36a0e48493994c8121", + "public": "039a9f1c0426e4acc12d754e38373d7db58eb5fb5eab6adfd920ab57ee786d7b5c" + }, + { + "address": "LJJtdHQ8YwTXyv9ZiNTrCGgh8N6iud2jH8", + "bitcoin_address": "1EEBauBVWaYnhMEWjNLW87WpfsQd5Meocv", + "secret": "0f7a45ac7fa48214e22ae57d598357c6502b0120a53f0846a89d24b278869625", + "public": "03f96bd4d570ad5e3a424ca6b5e1fcbe2baa3990e9f930d8d096ae6e72f41908da" + }, + { + "address": "2erBQmqWbCn42XHgv5mX4FGdYmWwGWNwJtF", + "bitcoin_address": "1NTrQHGbTRQwTXDRdthJu4NmCjZr8BroQN", + "secret": "fc8ca55c4e86af2ab9d79035618bfbeea89c4582c39f6a53cf254fa0334eadd6", + "public": "02950e3d4516dc08c46228b6a77b0f28d73eeea47fd4d31ad9fb9246ff0c02fb13" + }, + { + "address": "pvvZnFhT5braNsvEF1LEDABDLXJPPy9n3D", + "bitcoin_address": "1Hu1qVUepMZG8mAFu1nT6QwevA5Y6P6DNX", + "secret": "f9d86da49c0584a6640aa990599f0d9986f58650eefad763a7eaaa90b747666e", + "public": "0268c65be7256ea4d769e8a723698db683faccc1e21b1fd38a31a591825d07202b" + }, + { + "address": "6SnfZwj1UeVtzg25n9wnkj1dun4ZWHMUwa", + "bitcoin_address": "1DvHvSFg6UqcmbP8Y4iFVK4SfxcuUbtixv", + "secret": "6d3afb2bab90de214060fed091f8dfde04fa19c540d896b5c81495d98e5256af", + "public": "03484096e0e52f26f11fd5bdb501666d4c74cd15c291d038aa9b3f9680f097d6f1" + }, + { + "address": "22Y6d1jn78SCSrea9dipxWZsHMmGYVVzrEa", + "bitcoin_address": "1PQZis9goUgaYG2f2JrbXA7DMLZgvc56DD", + "secret": "0669359fcf951af5c51ae9731c5064bd7c937015ff88842ea15971fd8a01cf8c", + "public": "03004bda791425eb21c1143628c200df0cbe2e26349a175fdcb2a6dd54e135e03c" + }, + { + "address": "c6sPKAa4oJ6pnVdLSpcsfBtvseHFCN66p3", + "bitcoin_address": "17WKchqTSL4GBx7qjy4r4Hs486efvFngrr", + "secret": "983bb4b8c8390b8a00024074b43227e2afeb1b30080e91bdb241f2434cba3c9a", + "public": "037b6f7922f08910e0b282e08206517659565254795299cf212724bc10063a76dd" + }, + { + "address": "HgoqRHGQCqjBaib5JnGxzzqJerYpSQDoDo", + "bitcoin_address": "17VabjUW6MrRTM9SnXDNFJk6WVCwCV9Exd", + "secret": "c43caa26364198a11e898020edb42eb38b48715a7047b4a970b6bd80038c7c6e", + "public": "03b6ece9d98596d9ac7b3e2297c0b321a897bdb539f38c7850a9981ab940a464e7" + }, + { + "address": "vujxJAz6RJrNhwGpRKEHTnwFvTQ4mQwfrs", + "bitcoin_address": "1LL2SVegTtbM85q6xwtL44FAoCGN7HhFt5", + "secret": "031b4b8e634853c180f13d3f8aebf5a44dc3d85eef6f5e86ae3091abf8e49a06", + "public": "03bdd90e83de029d7d1e9950d4ea800542b47fb1bb2e5666ab1b5ba4f5d12c1d05" + }, + { + "address": "HXdBWU4ned4Q19MUJvr1T8BkC2Y7gYJHhq", + "bitcoin_address": "1LQ8vL6Zi4kpKBv3ZVmX94PZZPqonpCnj5", + "secret": "06962e39a38fbe298731924221cfa42ed0ae9abb105843cbac487019252879a1", + "public": "02363ee0442a993d4dad2666ebdc7465e2ad30b38f74ebc2ce5be39cc5731283ab" + }, + { + "address": "2mJtA9XppXTh9o2267QFqmgUc4vQtMxH4Pf", + "bitcoin_address": "17tVCcEGKBzAAiq1p9owX25CYKZu9mnBr1", + "secret": "a3c41a8aa49ac7c989744f59037ab6e7ba02305e3ddb09948664698fb3c7b546", + "public": "025677fc7e26cbff2de1d162979d011fb49c2f94a51ae0049a96354798f8df9493" + }, + { + "address": "2WuGtr54gfEM6E4hzARgeDMiVke4mZGjyK8", + "bitcoin_address": "1DuKSs8ouciMxkaTbBDprPkEYo7haKJmGq", + "secret": "e701ca2b190297d5b5d17fc8e85400e555a1cd4ce59d9ec9039615560d5a77e1", + "public": "03e4a81a81a0b38d3804c998ea6d3e40eca24b301d9200d7a40f47a7bef8b1bfaf" + }, + { + "address": "21SkhMpvCAxvVnVRa3QnKEocXrPbEfpQXer", + "bitcoin_address": "1CT5661bQU3k5nD1nq1nKCKse6Q76ZbJjK", + "secret": "06f71a679c3dba236d942839f9cecd105c93df008dbda4e88502a70c67aa66b9", + "public": "02e0b7a344d4a571cdaf8b0f46feb2007a80c24027f71848745568685a33ce9a84" + }, + { + "address": "2Hch5H6WNpXjExggAWUVUozAZaBRWEWvpsE", + "bitcoin_address": "1PWhL5LoearMctxkm26tTXDU4v5imJKvcf", + "secret": "ffbd71a2fe82aeb6afeba8f7dc4247820bf479ac5beb7a95ee12e1d511736cf9", + "public": "028b22c80b41a8a2fdf64d78ceefc639745b87b6909dc4130c7bfa8828d5aad1f5" + }, + { + "address": "2FRNJ4e3FDtY9c8RALijiiXqsqZNbkHHGsB", + "bitcoin_address": "13WxFikLf6YKYsr9D3GoAQdKgSgPpakLVV", + "secret": "ea2a4ac1c298304f065d00f113125596155c2c99641988240be833c09673bf05", + "public": "030f33fa43b5854f000799468b1802e61baf183baac079e66f124c2a133e3997ab" + }, + { + "address": "iszc3eZpwcUu1GQQSz3CMnN4veQ44yMYRs", + "bitcoin_address": "1H6x13254UfyWFdTDaxJaB4LZADaxLMNfq", + "secret": "ea333ff90f76fb162dae8290d0984043e39cf6339e608e1265fb5b747b49d9a1", + "public": "038f2cbe9174da40beffc058f1a89467b1c37dce1777ab9352992f90a38763f02c" + }, + { + "address": "2iaaVJguAHYeytjfLcDVLLJLVSgPtAxBHHb", + "bitcoin_address": "16FQ5yeeGbx39yqNuD69KBnefYc8bCwWZi", + "secret": "0c4a939514204b5f8a7327b36c491281652900993a1d78d356cad26f4370ea23", + "public": "023611dea864deef27decd48b58def13dab411eb9cdb8c32662f457af30cbece7b" + }, + { + "address": "2W3ep1m7sk4opyxoX3k4CTsmgHeqfSGuZ7y", + "bitcoin_address": "122CPhviwdvp3j5KHuCC8qwS3SskRjpPRH", + "secret": "3b21495ebefdbe33ecd33bbd9bef707648252d3306256b3852f2c1e32cf19301", + "public": "030e7e2017177e74a272c6f231dc429d47d842b86032f9e825e26dcd33808d7052" + }, + { + "address": "27qTt9ETdo1L8WjA38ui2mVctqu1akWnPn2", + "bitcoin_address": "12rXDAcd4P4bNQtdRLUec7WPuarJXrLLAu", + "secret": "bd2722b3935a9f91cb7d158a36a53c33a27f32a07d02f4ea160596d96d9d2682", + "public": "02932a6c3dbb4efebec33236009ed9f625560df67703ce162d8579af9c2c28817e" + }, + { + "address": "dBFXCh3oZmfLEadzRpZuLvp7b6ty6MUH8B", + "bitcoin_address": "1MaP7jdD4eVeKwvaFXfeabgTPeos9xHsib", + "secret": "080caa4dbf128bbb328ec33fc87ccca81171ce16f30697b4198e247bdd49295f", + "public": "0260863678aacc4fd7ab87668e54d7be15a7a762a276070efd6cf3f93a285ee4a9" + }, + { + "address": "Vm38DRDiryXCdiUUy7L3ewfsADF8x3xrvG", + "bitcoin_address": "17suVPBkBvwQX8Sob2nEcjwZQxdaNTzsxw", + "secret": "9f8df7712861e96c82d2af651ebd06ddfe79b31635aca4539a018e6ee3533ecf", + "public": "02d40797f08f3d9ac42c73367db84b4243fc87dedcefe91f1ad44e288e58177389" + }, + { + "address": "x4FCuwHK2B8uxy6TcW7v9V4rMTe2inrjCp", + "bitcoin_address": "1K8VwtLroCAEcWcSyuvuPiahaRTN4K8BCy", + "secret": "ccc879b0ea61fc4960ad3933d592c407618af109c4cc87221fe9235adba4c499", + "public": "02ab01ad4cad7b1bcc9d20219415fb92fd9bc819f6cac43cf36867e8284d41d50b" + }, + { + "address": "2moHfKQdFLvdpdioxUiewyQz81yBKA2T22m", + "bitcoin_address": "16fZA6VowNUUmwDUbkAd3aC9sKAFtBeqx9", + "secret": "cb2e589bc0fc5c3fc5f9dfbaf454f5c5d6eb2fc7be47a547c4ffceeafe074cfa", + "public": "020233f795f9380e7d04c9c8d4639c7d8ec598e4e4c8de59a4c73a76c3bfd4f161" + }, + { + "address": "eNpWwxqZeY1PYuj8M4M5TwoF3jPFsoKifj", + "bitcoin_address": "1Mx4smWCCMxuAZ81zYSWSJXULR78uR1SFm", + "secret": "73ba8fe059ce1c08c5c716300d2bc92097b9dd92fbb0581f624d7b064ba0fb29", + "public": "037382d2900cea5956f8cdedd21e8cd81a63ea0227090deec7f5a7685279c711f4" + }, + { + "address": "2g51QorpyKSr6rrCxf4dD4CeZEYAMURc3dw", + "bitcoin_address": "1DWKYm7Nvedk1WWkkBrsQEaQEkW2XNUBxB", + "secret": "f3861c2d1e69b93b666aacdf0cc2cdffea36c7e7b83dc1718829ce79e7513c68", + "public": "02381d60f8d1803ec10ac693e9d3060b9b796946f503ee7eb01f967c8bd5e5d89d" + }, + { + "address": "2DKTyBvzGiaPU2kL51AVubLGQFq2mjTr4HE", + "bitcoin_address": "1BAV7oUWtFq6iQoKpq6TVSZaFJmXm7ocHE", + "secret": "c3b3d02cea87e4f6c335784d4cfbdaaec7bcd7e45836567c60230f49ec8b304c", + "public": "02274e27234d8e7a0a15155fda616f7e75188cc1b96e463ae399d77cd17ac56db8" + }, + { + "address": "2CFcXpDqV5vNd4UzoHTsjPDTWuryZcQExsR", + "bitcoin_address": "1BiJFwWqXZm13bXp3edNgYa8FACVYubW9b", + "secret": "a239a35c1279ceeaa4f6f23837e92c464e71dcc86a2217587b1c1d0fdf9d4657", + "public": "02c8dfb3b231c7ba9cc67d84b9c6fdae1945f5c61ea5ff9b443abf866e373e2050" + }, + { + "address": "2gDrnTUUeZ1xrC3hCJyXhkrkm79yABLpdxP", + "bitcoin_address": "1PhLMnnzSioFEEi5PEu21pLJjwyXB2fsaa", + "secret": "6c3652adfe9e2cd2704fa0b1181b90ffd7dc4f8a4153a633103057e08b5ff881", + "public": "024b3b047a60af29f997d46cfe157a57bc77bd53a894dc6c8557d038e6d817d763" + }, + { + "address": "5fHL9AfwcqgYEMvjqyX5RVeksU5x4hEG75", + "bitcoin_address": "1B8J5KzJbdrXMBMNQJ2MuvpPj7oouqMFAt", + "secret": "f3451f3fc143fbb7dc7b1302841dbfb29c795dfd86402e2dd625c9870382b801", + "public": "02a858158514e7355b25ade1ff88d7381c3a0bc2b3d0af7dc7a15fc085e3e9ef36" + }, + { + "address": "2BbgUyWCqJ66xaznA5o84Fu64DzBrCTwvyK", + "bitcoin_address": "19TdqBhFRb9ViMo6riHnBCCU26wA1PakRM", + "secret": "17bb9b6b89948673b6faf3bba8c0680ca1b77ee23b16e0b2b23d4d31693de961", + "public": "02fd5e3ac72dbec55b340529bf913c62075ccf8cb399d008c8716048468cb1931a" + }, + { + "address": "2G8GaA8JYfVqj3ooDtkzWN2fNideKU8b9xK", + "bitcoin_address": "1GpGVwonG5D3YTGxeb1UKvzRYnVVyWBovF", + "secret": "770fa4cc2d8f1a8a686281e8aab3ff589a852ae450983bc3accca5080495829b", + "public": "02d69f91cb1e70caeaa8839c1635643b0360f0cafc9d890ef8c1bb7c91ca40ea35" + }, + { + "address": "2BwjUtSuGKCph4EfkthDa2CdyaGzHy4WDjD", + "bitcoin_address": "17KXLhhLcWSsL9R3S6jG5GMVqKhH5n6WCs", + "secret": "b6dccd72e79f39bb939f2efdf1a90868a09dadf400629465e1ab97e2236ee7cb", + "public": "039cc9b2602ab2ffa175f87ad776a1e040555d4dd3485fc09a03dbdbe39c8740f7" + }, + { + "address": "wa5sR5oYKKY5PyqG5rnBCzafjhFmU5Mk2o", + "bitcoin_address": "18TgqhTVqDF2A4c19dST93uRPL5YhLEy4Z", + "secret": "3879cdb11ae8bd760a2378c178b29fd694d3c7447e03d161f8fd19dcfad6512d", + "public": "02d6fb32ef1862b79b935dff7bb5aa868b040749ff08a9dbe8f6054e953dd3504a" + }, + { + "address": "2APKsjpuiYDw7DgC1rK4NEtGCu61V4zAc4o", + "bitcoin_address": "1B7k1rSMzZni1KwzCF861u228Dyvei7aXz", + "secret": "91b23e1ef44587743475ca071a4ebdc3be0e87ffe46657be9299e17b3f0fbdc0", + "public": "0314cb0648861cb94994bc2631a4c782bcf0bdabec37bf3de1a170fd0503b9d258" + }, + { + "address": "2FwB1ZYgAB44ENWpudrpmYujkFZBT1ARF2q", + "bitcoin_address": "1PBcmx7uYGUqi5mi7ovAPbZFUx1FLN35Kt", + "secret": "16f82f75f6ea09ab92cb4110e1a397dd71fbec81ad7faa9c7a54c90875757a3c", + "public": "03017078b4d051aee4050e7dacd1b886cf27432d4e90286e47fd9501922476617d" + }, + { + "address": "WFNNgbZzsTztN2HvLroNXNDjP4y2qz2Wgw", + "bitcoin_address": "18XyRXxaMDi8PGKQKQUWCKap1SQ9V58hiM", + "secret": "b245f9311b8a69ade2b61164e18585ec636b0b4b9a5356b7561950c9b5beedb6", + "public": "029b5a844da9c824f7338a5d759402f7dc871ca4e331f38bf363f7e91cf7057ee3" + }, + { + "address": "JrF81tT3NehqrGLEWJPqTntBecMkZHbTLa", + "bitcoin_address": "17mWnTxuunHFvPm6ZTtcqw7G13UUsPJ6c1", + "secret": "a7fc0662dfd8fd39f8589903c95abc60b22cdf45ad67fb2a5a65dc7e2c3ef9ab", + "public": "03c67fef9d6aec9e842b7915d78a060ae2271b01cb8945d1e14fb8c16ae2b8a3c5" + }, + { + "address": "h3vEzWCwWSGxyEXHhmVbGurjYNfJbnxgpX", + "bitcoin_address": "1Gbv4gBitiA2QkE9RGSfaUD5SkLDoZAUJH", + "secret": "287cdfea83b55bf184e81c0ea6889832db112c8a8762f2331d78caa7cf9baca7", + "public": "02b1104780c99c9e6f9d94ae9a564517362f374c536271f18fdad6334f219f45c4" + }, + { + "address": "2UnSqnvfPVgWXEuNuEdmBKoyJ3xBvPnY2fo", + "bitcoin_address": "16nYYGtepEx9dRWqx72nxmzTJrc8o1MaYE", + "secret": "df35877a008cf9e514c9f64b245b5a3e0ad134bbc2e95ce9557551c79e46fd52", + "public": "03284b8af8e7cf913f02734f74a00a1df9102e8f6e93e826176a830a7aa5324fdc" + }, + { + "address": "VZptjy7VaWQjY5crMtFbDWq3mu4t5Lypso", + "bitcoin_address": "1DYLy3oAUa7ijfXtF5s6DxGijJK3G6bCEM", + "secret": "f91ba72711696fa175a549dbed4efdff703664fbd7dc98dc7c64619ba32e6390", + "public": "02b1bc13a83d263633164df5fb9eb71e913105bf2e6589ac9b5607223f7170b481" + }, + { + "address": "K6Zvz4DHtdih5k8JBcPdcXZRRDhTBWMtD3", + "bitcoin_address": "1hMpKG7QnaCvTFc575rWKhG19v6NNL4zA", + "secret": "fd515d026596d95fd283ea3ff94a3220e58c1e283711f79b0720d8bae7df5801", + "public": "03bb2baf3490d40fab6171d4d2e4387d72f43d40f516e8ea219530ebab2fc19a47" + }, + { + "address": "23WQc4TFLtfZQADK42fTfqLvqd5fVc3eCFb", + "bitcoin_address": "1G53MVdmp4NvqfkM5nSeMT4JqRuchdVRx2", + "secret": "9f49138a3f36e5fe5b2b020e7595ea39cedb7db6c55da6864d15966b118ab3d7", + "public": "02a25227209e5620211e2b5c61f20f7376c83015fdd338f6ab30a5221d71a5fcb7" + }, + { + "address": "GLSoByoK4BEQWfiZ3rbLqLxmSyhfijHrbj", + "bitcoin_address": "1G54e5ZLcxnRdmNjjkj4Gtq8bHU4ABEQpJ", + "secret": "027bf03c34f696cee5042061902d4b15e7f9c5163e2abef6d2bbb24989e3660b", + "public": "038d3c9c0734574ab07c02d905a7c045571803fc0ee93cee1626b3a15b4c993f49" + }, + { + "address": "tNdNWcH2F96PAUtB7pC4n5M5TBSTpxKVse", + "bitcoin_address": "1LdSe8ySHYXri4LmeBRLcMgGZ1VvBWRnBK", + "secret": "e9415a0e3e395800cc7551be12b54bd04dc3c4bd29995a031dbf11ea3121998f", + "public": "02db97fd454c0d93e60841a153d22471ba7e82b6aa2e3f49d19fb4bc52a8c1f5ba" + }, + { + "address": "2VNyTcriS4FrYVotvAJaqmQuYwYSBAYEKjk", + "bitcoin_address": "1CShyB7ybibGE5saMa8iRPGWMmt3jS5BMA", + "secret": "347e2aa0653c13973c2694e3bf368f9e84deada71edc0cd4d6f8b587b81d767d", + "public": "02b4a1fa85c4a9d2a6868efde449a41249bb4f8c1b3081fa9dd0085ed414286497" + }, + { + "address": "2eu6HH8nryPEjbg9TMvxNi5miWwiFHdXEbf", + "bitcoin_address": "1JzFVfmjWygzZ6obppo9WXAWakitmLoipu", + "secret": "e1086f1538f9f99ac01dda8b722c6973ac2b890fbd8c0836115a1ecf8196c84b", + "public": "03e52237f3adc43fb7f086c089c452f85fd9fedf8b50bd1c69965124e7828c31eb" + }, + { + "address": "UG8Dvm24teXpSs4MWY4BpBENnT7BnFbDNK", + "bitcoin_address": "14FH1mTy8UvSzbiZHmnSEbMoFDWQpjb3TR", + "secret": "3bddb147f42c46c265fa2cee35c90c182604618d822e22760dedfd5bc2c41199", + "public": "039087ce76a965f0b3dbbcb3b3532544b94c96d73ee4d41804f358d19648642bce" + }, + { + "address": "dzdJh62tUkWbFkHcEJYNeDrNYF6osZew1S", + "bitcoin_address": "1AmDQZxi6NkE7tWLf5LM6CKuSMngMT1pQJ", + "secret": "e5b4fd658c62ede1ec0a9b073ab9a70cf63fd0cb55a00d173657893c935d4909", + "public": "037a2e8f9a1600a8550a27792d7a543bfeaf4e6183f2ff280bef6c1f8ed85d9d07" + }, + { + "address": "a6zxRQZdY7ZurpcUXEo3GBpX5Kf95F7JhX", + "bitcoin_address": "1Me3o4D43bYrZ5ezFXHdj67EWCLzqHMLQj", + "secret": "d3968dada23fbe55a954aa2d6b34c7570d5846a84b806c052c3a3adcab120b79", + "public": "03db3c65748908d1b55ad7b8c96eb8973df440e1971f05066636f4c39b53262361" + }, + { + "address": "2GGTTctwYB3iHjYBDE9WFxGXJLFBUn7UzXn", + "bitcoin_address": "1KU4KpCLGWatwLZCz8EW2dye84qRb2gF3T", + "secret": "48435832c57f48ee7f19f6a09c752e5c2e0f230ce6ff1904445b39c3e9203e0b", + "public": "02c686311de0b0f37073bef4e2743c2f42052e0258e1dc6541cff2571268d1c852" + }, + { + "address": "2aVNmkkrKkCRSxe5JnX9QnvMhNXwwczk6nN", + "bitcoin_address": "1Q4FWZoDhjKP1fFbP15vdgaDe5ZxWAbESf", + "secret": "0eeef28c43478e967e0434dcd1231af081abd3ba31d80a8b021cf0fdc8847307", + "public": "03881a9cc92cf911a5d1c7e7c7ed6e1f38f85cdf42415dbc27a5bee88c17c52836" + }, + { + "address": "21py334hX7LKskHjLZhUPeEtJ7TYKVqfaFY", + "bitcoin_address": "1KhXz3G9ECHbmjdDVy6B7zNvBpQHwKTTdt", + "secret": "eb9e056f34028cf4546c287c7f4dc37c92d58c26b6546dfc17911359c93ae7aa", + "public": "02e3c5bbe2ccd4edee09601caa941e19847df1e8b40117557fbcf95354b817abda" + }, + { + "address": "2TKYS9gbr3CnSmAiLewX7RppUzC7r8NX6Hd", + "bitcoin_address": "15wWLwptFEKvsJyqWsGi7iY23h2gqGnE1d", + "secret": "f792b0c3e445775b4ba17400525848f3e27199bebd29380474ffcacc1a8a6ac7", + "public": "033ed56d7ba7138d71a213adcf823d9728547e849afcdf02aa0c40f6536537109d" + }, + { + "address": "27T6vpidojqAZgPhFA1gV32hbAGEvxYhrhk", + "bitcoin_address": "1Ffn5QpDLHuKBXMw3N5Y9DsBwUzQiA6Y31", + "secret": "f5b982ac586e994fa405c8b57225d4cb9f79e6823439e930ca6c3675856bf87a", + "public": "033f52847eda3a395ba83baa7aff6c40b6c27cab7e31bbff2e59aad5fcd2c39f7a" + }, + { + "address": "fKRmxuEydH3xr84jJbM2RmXLTrUQY754CM", + "bitcoin_address": "18FhydWFpi1rhjx48xgiPk6oFvFaiL4CsS", + "secret": "26d4a55a93849fdbe9df353a8a94f36fdc29850c26a80af1efd9052d77f7f97e", + "public": "035ef6fdf9d281e09fe89737a9d5aa1ba7a2f353471ccf753035a4d59b084a36c4" + }, + { + "address": "oxCKHFyceqKrQz5ufoNkiNou9vx6yiCxrf", + "bitcoin_address": "19z29UpJhbDKCXGV22TZewShTMxMnEZjM5", + "secret": "7d88523fb836a1e68249bd8b30052e2dd0105f925b0bee6192f318df099e8104", + "public": "03be2cbff63238343dfa80072c431a7fdc09efddf529b0fd403722ae3976ef6981" + }, + { + "address": "3RJy9j7ztK14sJgA5NyoLMLAUNxAFg11Lt", + "bitcoin_address": "1C4GahCZ8M8BjdB6HfYcHDxkGqxW6bjtZq", + "secret": "7476b76ac6ad3254575f2cebf43333b02ca6b263ad06938286c00e217f39864f", + "public": "03755eb7bbd9500055a58a6c05144b2479888bc59d4284b3d66bbc7e9b8d78c903" + }, + { + "address": "99Rq9gQBzT6o7hHVh9mwBi2KWpDrVueokr", + "bitcoin_address": "1HxHFszwGh4iA6KqPVTP4FCSVhHKvBHxbL", + "secret": "efc2a3b8cb9d78f38c3432040e2e2ecc6588125338224a90ba96a72e6df63150", + "public": "03bd8601f987579cebe725c52db9f343744165c023c8cc011b643df1cd0f9c4187" + }, + { + "address": "229uFKbAxjKb3S3dWxGLRUhU7nN2rm7AjJ", + "bitcoin_address": "1LzeKSBZknzWxkUexu2HfkRCJnexd6QKue", + "secret": "9fb9f20b2e6a51603689d48f53f7c65f3fbe37019f6e4dd86f37602599a8c4fc", + "public": "03735784436e95bd5de80a203aebf28f4ff01d51c15bc724cafca7b7681abbc5f8" + }, + { + "address": "R1EMZ6BCUN2euBPftE5P9xMcR2wH6wFyuV", + "bitcoin_address": "1MG3gVT7qnjX331fNSidshfprv4YkoZXUq", + "secret": "29b9c973254a1fde206af582fb3bb1dd6fe5719180640d5f15a52c963bfa17d5", + "public": "0371f270f8f053116ab75c995f06ad975417c10a3bd6134d6032fffad8e8d08114" + }, + { + "address": "KbDQwkTKbeG5WSWJo1Vvp4RoRktGyDuUTx", + "bitcoin_address": "18AJroTdtyMZPy3y3zFTCpuG8aZRsMjEuX", + "secret": "55bf5909518a71986710f11bb911c42c9a2af2714041c2cd5cb85f3232035fec", + "public": "02d133fc33f2ecef76aff19b8e0730a1fb3b63287b1a68023ab5403cfc56d02f27" + }, + { + "address": "xVa8iZKV9oFwgCDooUJRpSmj6GV7HGywBp", + "bitcoin_address": "1NbRtCtZXw388Gxg4YRC7c6AT2XDfvAJ6o", + "secret": "8590b46cec2d565adf8e9463a5a28b3f8e3c6f6ac7ca54e7446f5f8aa61ee7c3", + "public": "033d2efefd95dc97173cec2327ef9ad8f643ef40811cee511e63370ed052904e71" + }, + { + "address": "mhkWnCSekNPca91xzoGijAzk7pK5xe7YVa", + "bitcoin_address": "1QJGGZMu6g8bi5rtxqz5HUAT7fp7XrEhv6", + "secret": "81bef4b4678092a023b72b425ba9518d577e86f5a8b9337f77ce3cacfea56f6a", + "public": "027616c1c5cf8efdd7a148fa20c037c2a3910ad6cb6518844aa56f4b8cc0cbdae9" + }, + { + "address": "2H5W2Jw38hV6eoLWNUPqExSJ8AuQC96Qfav", + "bitcoin_address": "1Mgbh44Am1XXDvMx4GqkMWt4BPYUYumFJh", + "secret": "c3680727fbdd7b7d8b79d7f736886df08470801cb2a868e010b27e4d8414e1d9", + "public": "02811390fbacb53a0b30d76f70acc9da9e06aa5acf0166b8206dbc73c3836b5ebf" + }, + { + "address": "gBqUqD4wvWmsEMk73iZ77fL9QwKXMX2C4c", + "bitcoin_address": "13imE5Lfnag9jKBPZsCnfTENJU5ZQx8afu", + "secret": "c44b381379048198f1d676149bc496aee52a78ae356cc8ada3f6ceded0b8f9bc", + "public": "02603067281ccef6bef438e77296ef76679128c0eaf4a43c215df5dcb08a1d15fc" + }, + { + "address": "2aBtN3zU8f5nHW4z9HgRyaviqQAx4kNoUBt", + "bitcoin_address": "1JRC1aYmVDWjozkVedZXZsQnoeAX4p1gcH", + "secret": "2584c7512d2ec4a9e2836db33adfd709676768b823266260d8ef86abcfaf3cb0", + "public": "03c64e69cd4d2c448425dacbd34b68104820d14dcda260a9e088e1aa6bb13f9832" + }, + { + "address": "MpJfVPxdSwDePFQqzqreFqFHyFPnFvPmxZ", + "bitcoin_address": "19FXtmdkrjwwpBrAHRjnsqUzAepJb3RrDZ", + "secret": "8bf59fcce66654480b1ab5f0d792532b11829ec84b93ee325f4fcd7b7da99fa0", + "public": "02dc2a97e5e0b5986db4d7682928b3d18aad18a4375b2ca4f5d5b611592d629170" + }, + { + "address": "fMXu7ACfhpAddDQUcYMhFVtBjfeXTxPZSg", + "bitcoin_address": "1PZjutS2LUWW8G7ht9MKivMDB2qUz2nmvj", + "secret": "ad848094a7299cf5e485debc38ae745312f1de43297c214eca1712a8ed56aeda", + "public": "022e13429bd73cf57a0b81b2d14e99a6f215ca643f567275b9a4ea48aa98d2bc36" + }, + { + "address": "2HzJgfGUhaszpeqvvBkxTunGQWvMo4oi4De", + "bitcoin_address": "12CLT2bTvU9EhDC7jF4TkLMJjaBMvuoEwd", + "secret": "817eafc5caff271c2a4caa381c4340d70594110ac5a5564b322b2bd9b7317fd2", + "public": "03f2f8dd9b867e863d7afc5e222d49788cc80f937b3a69d27775866f28ee557f00" + }, + { + "address": "TEfAFxc3b7BTnq2nBQNbwNDdNQVGLEDzZi", + "bitcoin_address": "1HLCfL3XVQoMJ84L1bupzLUQpMcCqAVWBz", + "secret": "040e3177db9566e5902b2c8313d31e29aa17015580de4b66b0dcc3a6760fe697", + "public": "02a8cdd0040d877f7553f35021f8ff7bc13cb6f6f7b16d4bf71f1eeab8b417ae48" + }, + { + "address": "MQ9xeCGvPPcQsrjeu1tQ6h4W1Kf2q9BoG2", + "bitcoin_address": "1AzzT8wzx5Dswg8QXcszUNRGz4iH7dR64y", + "secret": "9aad6041f7eede6e858e0379c0afd24f60a9c73346be12ce9fa23bc58607f0e3", + "public": "032afabdf323ebf7b961340fd32b8cd5dceaca5b58f81f3f28bf547fc978fb34c8" + }, + { + "address": "23cxi2zraJZqyHLG1ModJpLBSohWDn7T9ZP", + "bitcoin_address": "1EGSw9KNHbm6pobfkszR4C19TpwPzgWs1Z", + "secret": "cb9886037a6d33329a05f8eb2668f9c68721682ac4f68767bbed2dd087938b5e", + "public": "03923baf3cc7f3e53edf3cdc60c7d64f83649ec9b8ad611a190bfc93f77cf165ca" + }, + { + "address": "2ARxqoM21PhW9zLqreZvoyhG2xuVQBnWVsB", + "bitcoin_address": "1LFKVnHTtQ4JcBnQmYybzDKRBCNTGJC2T1", + "secret": "b8d18a20d90c3be8509e1a1c14ea2a084c546dce3800fcfd64427e8e11cb842a", + "public": "03c6a58df05a703a561a9bda49ac053ee063f4684e2d689e64a57eb415a799bde1" + }, + { + "address": "2hFDnFqkKbfBgrShepvK2DazTQv4Lvcb2fS", + "bitcoin_address": "1L2qWDRxU1oH4resXY98kPzM1tJ3VSkfWv", + "secret": "300d26fcf88f23e874f714b16e5c9539064e74d3e5fd379e0bcd407811885ca9", + "public": "02c8b777679aa8fff406b3065f92815e1e7dd4e06acfb2cc2cf73d834640efba6f" + }, + { + "address": "2EMb44AyrsLU9tcMaGZH5qKMAWURWjXtj1C", + "bitcoin_address": "178Wt3ddQo8WfqzL6dYnCjdAudiY87jK56", + "secret": "2c7d8fbc9e91d0754a184b52363b2c5ce304031b30d7488a15ec53404ca1f81b", + "public": "03aeb51a80bd56711beef6bbbfc26cfeb2356e932fbc3c6c6b8c6d7442b1d2556d" + }, + { + "address": "RsWcgENNPyhM7KHFTo9VCLw5b4uU4CLmpU", + "bitcoin_address": "1BN6YjVNcyZgUBSZi5SmKfrJTJN6T9Bjof", + "secret": "ac9a2f724bba9198c756b026e5df829b8e72df7837182cff61a961a84ded209b", + "public": "0364313c902a7e6197e95aaa85218532b2626b10836d2dcc8078dd18022d3a28ad" + }, + { + "address": "2SvGwVovNFjwS91HNF1vrMjEfT7STTG9r4N", + "bitcoin_address": "1AnyFqqVM4t9uz5Dd9X75cV3D5yZo24EwH", + "secret": "ffb644d19360dd7eebf66abfa70e492ed3a276aefe38c172a11b0284aa169541", + "public": "03f3a1532a61087e9bc8f6a6ba81102d429de7414ae0085ba9f51594e68e3d1a97" + }, + { + "address": "rZMkh43Pod6kpNBGNaBXNoqXotme9NHBC8", + "bitcoin_address": "1H5f9eK2JRr9aXH5221FpLDw7ApGEWB7TE", + "secret": "5558f95e18cf37496521c244e37fc0f842e936d20cb203c3a0e6bc8f6d2e8a9e", + "public": "03f571e0a9a233ce8cd348606b097c728649f7c5c1dcbe0f5ca2874dad3de77919" + }, + { + "address": "2RxvaL652F4Wyoq3PLjr4tFEaSbbeeJZBqe", + "bitcoin_address": "187Pzqvnkm4ps7KAr8QPyq1pS1e9eLMdan", + "secret": "f5b3d206cc14c4b57df04a2fabbbaf91cd6a7e9d07c1d09bde4c0ebaa43b3ee1", + "public": "03bf9105249ae909f87dab44e18a8a052940a17180b4da0f5222f8cb5f2562da76" + }, + { + "address": "2Mt4eBP7iXYxYJD59UET1DpFJSG6HoTavJg", + "bitcoin_address": "1377gVipiUbm3hZH4YJzPjeYRbrsmCppQJ", + "secret": "7ffc75211c93ae6363522dd6b1750ff54204c0f1204edce6e368ca3b771ba821", + "public": "0221463c98407c8e24b21cfa4ec10960747daca19569ea4b3f11c71e98d27da0f6" + }, + { + "address": "qDQMt3d5dYCohkMT5B6izsGHkPRUeVZcLK", + "bitcoin_address": "1NN44uTwComXahZbZqKXivo8zA8a3U5goJ", + "secret": "b683a64ccb4319188831f8ba86c7bcb596da63d10ce89d0ca64c8dd1915cf669", + "public": "02b6a6fa5b9c8ff7836fc761be9ab4da0d2e27c53ebde0d8869a7d128cc72801a8" + }, + { + "address": "2S5Nk6LmUD1cPeVk1gBkVT9ca47EPxrmZqi", + "bitcoin_address": "19Wb7Wwe4EMHsjTX3ckG9tMo7RbDQ3NgbE", + "secret": "d3874feee7af97339d66a43890b16e1fa4e490ad6d8bca3eb69ce2b20fd8ad55", + "public": "036918969f7908670b5dffd58efd16003757f43e647c7698496ef534bb7332703e" + }, + { + "address": "2j8fTL6mXwNG1aHz4xfGLcNxomnNtsDeyXY", + "bitcoin_address": "124M37HQBhdgZY8Sou7RwFLsAp2Yddjxom", + "secret": "0f3bdc50d6664a7b9b1b537aa8c34bdfa648c9a3cbe5f45afa88cdeb15feec44", + "public": "0242704747967357dda0fe5f6f2868e2e558dc7fe8bbd653164cf87b94bf309cdb" + }, + { + "address": "2kEpigdrfgbuN2sczody557JbVjLVd6CtZb", + "bitcoin_address": "1Ge1Q7MBqFGjmwLemLrxspVmZTqKvSYMDy", + "secret": "a34e6bf7b8d3b20500f51695d36b667d9b88ba9f442cf4290260baf8e15bedbe", + "public": "03300db6dc465d523c01152f1e91ff50537804890a0b4457607e5bed41ce268993" + }, + { + "address": "2KGErAn9X6KUykj175VQ6GWkcHTQ9xg4yvK", + "bitcoin_address": "1HA2VbL8VM64wTwThtZSXeNASBGsq4C3ut", + "secret": "c6f96ec8d7b9bbd628852c417ec221fd8cbe301af5800914bd48886099a99a31", + "public": "027b6393a34246599475d26a5c35169431d79ce0b062d3bb25ce4a00b5f469b63a" + }, + { + "address": "Md27STrLZhDXCzeyiWV4dnYha4LLwoWbjo", + "bitcoin_address": "14rdpiuiRg6tHKmmMoQ8NDnyVBaNSAmf4p", + "secret": "2a0b423abe24b1554fbdf5a0cb23b8c537ae9763e94b27a4492ec5f73fe37c10", + "public": "0249ab7ea2652438992c2cda1f23b01678f9de1b037d2db8c1171c7e3a67fdddc1" + }, + { + "address": "23YsH6ZZcyVsVmoKhJ1GgFL3HudWQwUgrm9", + "bitcoin_address": "13yaxH8sjsDX6SFwswut8g3EiQqhNvzu7Y", + "secret": "db525456d04f0fec18a228065fe5c977e818854337937d491a4eeb9401236550", + "public": "022bbdf07624dc2bb2ae619781cf217cee4121fa53267a7e99c275ec9b692f8f76" + }, + { + "address": "SCWSUcZYva8MDEKRY7YmdYRoNj5sFe1XQJ", + "bitcoin_address": "1A4ixPhDKAyaaWgBe8StrJK482aL86i6cz", + "secret": "e0912a7bb851cedca4500657294f1bdd3fb6549f2187d458edd7c8cd468566ed", + "public": "032e20e706fd2f9745569d6f714c6fd0941f6c4b2806c00ecf15409a8d9256db72" + }, + { + "address": "2JgFxPbynhqiMvRREQ45cKiDdsiibSjK2et", + "bitcoin_address": "142pyVHqfMBBWeGDnk945j5evPnVpj9C36", + "secret": "09d3054ad1d287561b31569e18c1d46a3a45ff74ea86515c1d0aa119a993b717", + "public": "031e2aa54504dd6cfb2d6911033df39de005a31bc110916dd046bf15f82fc9347c" + }, + { + "address": "2k9byFja2RVJa4rFc9reVuNdn3Qq3cZFoRY", + "bitcoin_address": "16AGiHUVcLFgZCu1FzKu1upd8DT8TLK1Vx", + "secret": "943b62a940a348d81993958200d8bdfc00c13b1b376478635e07b68f080a6178", + "public": "02421da715e7043dbab22e0016018e4c94e8bee58f4c9335fa115f0c83244dce18" + }, + { + "address": "2MoEjzeLCtzMPv8ZGbkAkQeC5479wH9ha4w", + "bitcoin_address": "19WfSNNon2qseqjyQhndnQwSDM4zbjbjXV", + "secret": "c65414ed2eb2d83ac87c77ac6646ada456573761400108b8e0d05de9a5ce5fff", + "public": "03741c4051901ea5bff8e8d59676f0fd6ed7763d295e92fd1d800c6363da1609ff" + }, + { + "address": "zTtMPPtk2wiUac2uB7Qc1k7JC6ssPnTeRy", + "bitcoin_address": "1Ayid5wsoBBrxEKJBWjZ2Dk5MN4fBh2Grh", + "secret": "79a8da2939915b0da33fe11abce0fe80c7a68e0fc6d372b500fbe06f3269d165", + "public": "02489ef908c3f224d8b8e68d7e9399dfa66ff53dbda4a452d55a01ca2ff7278d7a" + }, + { + "address": "21jfiioBpG4oYW8KjYpSs9cV14aub75ZQha", + "bitcoin_address": "1PETTE74DYTSLEu3a7nwA4Vc3Rhu1wmu4D", + "secret": "9aa3371acdc4444d281a770e7579c42d2b81f24b5e8c7434fd3754212b577bd1", + "public": "03d4e9be8f6b7378f7448435a1043636bf9a77602b6a2446c417c8f0d289cf04b8" + }, + { + "address": "2jhGXgUkXV7L6o2ooBSJTRiZp8voCXsws8L", + "bitcoin_address": "1JkzBprjb7KF83mxWCgn2UUegXhX6zSqJn", + "secret": "312c20808b5c6ccb4305db4cc49831322ed841aa354c5e6f6f78ad58ea770381", + "public": "038aec6a7a2ff76b2ef68347d8cae7b6fbad292a07466ec69ba0643bf21ac3b2cf" + }, + { + "address": "hkQ28aDsUPiqtGAvVdhq9HS2JYGZPvSy7c", + "bitcoin_address": "1DhuvsPix7DQzA2N2bWmnt4wTCUamdgjRA", + "secret": "fa115d4a9929c01d41d7c1c23a197f377fb06166d0207f859bf469e75675c6dc", + "public": "02896b7c2842f4b641a3f723adc9445620f6ef1f6c354846958569349e19f15a9b" + }, + { + "address": "2HXGxGiyTiiA5JViSuYDva96pacPkKEg2DU", + "bitcoin_address": "113vkiV9oQThVKEV1EW4mKQ4gb2y6hK5xG", + "secret": "1091f0c9a82613f7879461d623e5420981116629d8163a6486ee564c95407f9f", + "public": "0277d34e24239b4be68dee716c04c4f29961bfdc89c0f1a90250d8a4a1b0ec508b" + }, + { + "address": "ETt8tPLv7KdEn3isJ8ovCk6Arpt38R8Xi9", + "bitcoin_address": "12i5Cq7taJUfCLPg4i31TivbUGZNJwYj1N", + "secret": "2d5964c37e55bdb7daba25b8f73cd30e7658263f679a9771c6eaa76d73a469da", + "public": "021098ab98d1dd4beabaab7108e2dc267d96085defb391db4797119bdeb7b6c10d" + }, + { + "address": "2aL2T8aem5nGM2dzzkQUZyhoYziUZ2q6fWG", + "bitcoin_address": "1AGum6NprMmXVMNe11pNtB9nhnKKJU2kbQ", + "secret": "ce625aaeeb7aa8d0967c20a572040b71622d225abcde8c7166f0e355163be56b", + "public": "027ab9006f88a03876f9ffa2bdd87fb687f3c9edfcec37bcb4023f7fbed35832df" + }, + { + "address": "MKutfh1PF7dQ2yyLLyVyUyKLrCcKFcrXi8", + "bitcoin_address": "18bmwNtZRLqVb9zmhiicAEMEGCeDUMhcxG", + "secret": "c52636ac3ebdadae875e9a74b264d1b2ce4c82034415ebefb5827e1bb6fd1e4b", + "public": "029ecbd866ab779ed2cd90dbfb34b7283da00d3f9b71ed805ca92c6944ee30955f" + }, + { + "address": "BcpL5eUt2jXBMCUEYJMKbDzsNHqFbapSUf", + "bitcoin_address": "1Aat3CatddK4Z1hLHvDchXf5AKwgH2TSuh", + "secret": "0ec1616139c61bdcd4f93d86c1115077e769080410b5d077718d43715eb49323", + "public": "03550226d015d7cd3298e48acd54bc0a5698905a87c5ada8467d4d0a0565362f7a" + }, + { + "address": "C6wHriSkyTXN1MxkX3c4tDFUw8qAS6gZt6", + "bitcoin_address": "1AEcNbpHdd8vRX9debLWDt4ksX9sYnDYbv", + "secret": "7e74eceae672c54786531c9c37840da266cdccdd334271a4034fe87805fa22dc", + "public": "036af0726c32dbda8b224d655b1f572bcf625bc8701ecc1f53fa0e5ca45b2a5809" + }, + { + "address": "21QWTX5QyFovW5ezTQ2as3ndPtmk5ScYiFS", + "bitcoin_address": "14a7Eb72yUWDV53DNBvFgeu5Qq5gcB9Pyt", + "secret": "65da770ee49d0b6f62cd85db5153a6961d4345f02cd1e460209b9abac795624a", + "public": "03cb526f36a2bc9dce0adaa33c27cb10302927c9ad50de88ea541e81789b246298" + }, + { + "address": "LA9fKvqm5A9k1agtszrWfnPKKjgtu8VxFR", + "bitcoin_address": "1Jq6H9SVZ35DdMcSVPmgHRmZghegxGoHaQ", + "secret": "4e02f9b57a3ad01a77e30951c2ca97ca0955f39a54346ce47311cadcedfc2f08", + "public": "027ca7b0b8a83845c3d1318b3e54ba94fccd14f259865dd770b80443b5631fa10d" + }, + { + "address": "2TxMvLAFWwm145FndHzESjU6HZLU6r4vQAq", + "bitcoin_address": "1MQGuCM8SknsiFZF8aj7sngixQ1XtX886F", + "secret": "c0c11b487b7d307d0cce023520f94c9d2e5d1e656ea3eb2ca3adc1361998ad04", + "public": "03ac77cd63f2176fef590a3a30e619e4127fe6c1b45368682b468375bc908dbcf3" + }, + { + "address": "xd9dBK1mKxiXDBHgd9Eg35Cz9sLbkgcLws", + "bitcoin_address": "17Rndp22RA4oDPbJ7f5PzgLLq9GA4pabvr", + "secret": "ff38df8c6834713082048d42afd3218bab991ca44044c971774ff2fa7a0dc918", + "public": "029b1c4622f0248a0975cfcd8502fa6d528d6a2a6d397601af0628fd09b6c4dcbb" + }, + { + "address": "NwGDy3Qoj6k8nqRqaTQk7r2jUfzLs5AEny", + "bitcoin_address": "1DjYtz7Fg2QcEACokmRxzsRjYJWg6RwQ79", + "secret": "b79e882093fd2adb54b4fa6e408cea0273f8252acd4179540d7fdda6ad367dcf", + "public": "03dbed449745129f24b6b18b68272ff5d9fe3008ad4670adee385b669674f34d4f" + }, + { + "address": "d4H2t1an8nB89LEK4Jt5mWdFokoW1cWieK", + "bitcoin_address": "1FpHfXQ9B29QGteNnPUbdqA7tmTTcmjBNc", + "secret": "4d9d83192e7fed98e7db7ce06a84c0c0b7d909fecdfbe5d0c357f69ac9838869", + "public": "0259d4c22e3388e6720f75481de2c0ae3b45d08c0e1c8ba6876d2cda2c65d2d225" + }, + { + "address": "2jTF7ftopY2Hj6xqNeLGcWv9PtPZoo2JYav", + "bitcoin_address": "1KxQ1dWiawUvchewVyabwUAtBaCS3rFDU3", + "secret": "5342506eefc9b01f50e4844179ec6d2c180e35b28b05f56b8f6af2de40f6edd1", + "public": "03d628a9bb74f35bc9318b7b28ba90421fbabd774cc0c004bb26b567c3beaefb94" + }, + { + "address": "2Zbxb2VLkptcheURB1GvfgCor8c7QMtiWbr", + "bitcoin_address": "1FstRh7eK5fkTYKv9Z2v9iBVaK9Mam8fMM", + "secret": "7c4cf9f367c4e6b48edd68b8c8cd9e8871f7e221374f2b5d8cd3d08203b076f7", + "public": "02aef811f1013bbb834716e05e798f73e5a6921f58dfea6c8c3398b9f3019fdc6a" + }, + { + "address": "2m8BVtBjvPHX5gki7X1BnyiTmK66t35mQDD", + "bitcoin_address": "14p6FXpXNdVQyAn2Y1g8YpYQm8owD3nJeW", + "secret": "b057ced7e5492e9ded80586b5eb2f76114a6c251ed5e39b24c3ec21251fea1be", + "public": "034b17a6fd6bfd049ef97e8784cbf60e107c8221b78d5500cba83aa9e59cf738ec" + }, + { + "address": "2FaK8WZ1F1BKHSjbdhyfSsJsEK3QoHcJSKi", + "bitcoin_address": "1D29G7ESWwP7wfSWzs4ZMe1JhkuAvgem64", + "secret": "c79f87f1bf048398a6472d874391d4cd3b5c7a39a6ff61e086f175640d7447bf", + "public": "033db0c425c4155a970fd67804944b021d40ff2d3551950ed9da5c610a43425d55" + }, + { + "address": "2CRGhkAxp5buiGacrgrfubi7Uhn4X8KHJdG", + "bitcoin_address": "19pjETJ6ibxb224LZL3TWY66XmvteC5J74", + "secret": "26865442a8640529bbe092aa2f91668866ab75c8bf0749f4be250f873f62881a", + "public": "03cc4acb6abce20eadd4ac2733842dc94d8b8af31cc6ba1199190c48bfcd07e7ff" + }, + { + "address": "VNy1SQuLkrD7DFtUGCv2ZRovVoRYTgQxBB", + "bitcoin_address": "1C1Twr24TaeWZh8bPeE3K29sM7kGQQBFLX", + "secret": "246e7490fb721da5d00e3ef037a0cf91e83b9448db618d4e7f1529a5db2f3dbd", + "public": "02c5697d970be8cae8b2f74e5b8482b872f130fd396d317494865d761303c969ae" + }, + { + "address": "gRiFHzstLZD8DYbVGUwy5wnX9zA6yVaUs", + "bitcoin_address": "1BU5rXb7tYHPyZuEM1ZF6WF5tFXhAzyQCW", + "secret": "d1e407b654de28a5edc1e76efe740d22c57e12dffb6651851272e1b50543822f", + "public": "03acd87ee0ba18abf1f86526d38e7e0e38869cc08f612439ee3a30fb3c35406167" + }, + { + "address": "2XAGsYg7bbb6wcFb6TJzSsutWpGQb95LQLS", + "bitcoin_address": "1GMRQqGSJ2gzPeQW37K4bLjT4VMkLnuaHL", + "secret": "e6a4e56812750dd194a556f6e0777f09fea03b4bb22e2529344f7ab664e64321", + "public": "031039ebe4e1d925358ce5640fa9b740238ce14f568d26835927449c5274e8a992" + }, + { + "address": "pYg6r2ysRY1v84tzCunvg9G3VZkF6cD2LN", + "bitcoin_address": "1MqTV7AohFEw91nygLoeHtgLYmHuJ1G7N7", + "secret": "7c553337f10619cd16eb1659a3edd2e897e7687960f27c6fc4b56805b048c3e6", + "public": "02a21ce35dc6e62279f2276e5a3eb684c6f15164218be90b39caf52fb2b5cc092c" + }, + { + "address": "wRT6Q3pkwHcgqWQBMh5QJQgzGQ9p2rDo64", + "bitcoin_address": "1LE7mbLuDc9cG65xgMA5NaadGaXtZTRsDz", + "secret": "b0736043e34e014da806c851fd4ba9b5884871f1a8bf907255d0d75087295424", + "public": "0231bdbf26e1d2bf65a713ed36008a6b471db068266de238ec15d02f46b1a349ee" + }, + { + "address": "Zu6t4hJBBUJU4ovfceA2HL7VSPybkzxPk2", + "bitcoin_address": "18q1oTX7bAAhhVUMoSLFR5N4hBmLXcwMX1", + "secret": "1994b927514fdee4f75f6421a03536eae2fb2af384e9fdd8d070cd1b8bb1d310", + "public": "0220bd88e29aec79bdd0b5ff0117273722f4e27e37e2fda6211489bbe3df06c1a8" + }, + { + "address": "rj8c2gwEmCqPPQ8aeCrDTkJdmxDoScddVA", + "bitcoin_address": "1NsZ1yWN7ZNMNkEvrKvyQpyGM28B3jhxKL", + "secret": "3bff5ba7558f7b7dbb57f9bac31ed15f5c8593497e847124808990dba099137c", + "public": "02f4de29bd53fe8376aee85bbdca748fb83bf80b1161efeaa3e23cc939035de782" + }, + { + "address": "EhEDFabctpkEQaJQ733WLfWUn6MpqZU42v", + "bitcoin_address": "1Bp8yu2vqwFCDeh6WYnRGEDqoiXgERxucy", + "secret": "29da61ba08814ac6cfc1c06e931142afe3785bcc8640ad712d817de2fbb0eb23", + "public": "02c890ef71edf9fe2b1d3b8a8a7cd8e0925e9a55b093fe0e34a1ed5c336b0051c9" + }, + { + "address": "gpAimarggdCr22gAJ4kxiF3aQecXaxQR2V", + "bitcoin_address": "1JB6nxkhNjHkoguu368m3XgrpzmprCAag2", + "secret": "83b195bedb8c8ab123ac337aa943fb8366e87a0b78a46f11a6e99811b754cc28", + "public": "0233a097a9f450f42884d32110ba6b9b384339044ad7abbdca8a9dbd10644c7c04" + }, + { + "address": "277i1qEXLAMWB4EWpimpnHSrVu6zB765nfM", + "bitcoin_address": "1DkqJ2k6bS5g7p4UgDXF6TQUJ3fZRtyHFL", + "secret": "d4e2ab32dfac3fd6db1aa5e48f93369f71fb22519512aa08e27780e900bcab8e", + "public": "02734ce3a6116b3701a67d169c0cae42422bf81f2e16ee10626ae8b2534fffc8cf" + }, + { + "address": "vKSL2GSF1kf1GQ7dLqqLsvJBXbaijecZwm", + "bitcoin_address": "194YCp5aeFtPH7hGjXYs8VFNydAMBNqSFC", + "secret": "1e9ba0985d8e225e6b5df2a15e38503886df0fc2173b3e3d9ac7660a72f3ab5b", + "public": "0321019f74d1f922b8bb10eb6a5445c7fd7cf4e4dd4f0867bf64f43c0be0c0c800" + }, + { + "address": "2E83iNBy7MQyBCuHy42D69ib4fY3PmpJGzK", + "bitcoin_address": "19oJquHfgZCrTbXYY3pU9dkTVpR3hXa78A", + "secret": "ac1edd6226835a859e5fe8c5cb1a0fdf94f68ed17219da5743083aaf93f3eeac", + "public": "03c4b5da359619972014f1f55197d9493e392aedc96d9e814ca71128747cfc20b4" + }, + { + "address": "CpZCFZEjSxMnMqeWWXuo3QgNw8zMUS35fb", + "bitcoin_address": "1C1j26YZXPktwRgpVJmjjD7VcExjwjWi5C", + "secret": "db3c84f4b276bf9985c9a645f92a477fea63e5d5eff9a51c35d323a87f9b4c42", + "public": "03dc61b6619fb09fd7d69559f5c6775651b92c5c988290f481cbb7e7a2fb8365e7" + }, + { + "address": "14fcNNPALfDmtfjt3iqnUx5ECKozQwpNuY", + "bitcoin_address": "1PziGmuTvRUpiAkrckMq3GeuUrWdY2bN5X", + "secret": "00d33565e34e583a79468d6401a4789e7d623fb3e69d8d20b9f4d5751f7d0551", + "public": "0244b282442667183a585263c8a631c7abf0245228829b59d7314da2792066f92d" + }, + { + "address": "yqK6WFVBpuDN4kfcqVqMi5YDVkwE2iuozQ", + "bitcoin_address": "115Gy4PtnJMVupfkF9ggGkcbstR1bLXnoE", + "secret": "e155a8a39e9e4ba79e16ec0ba2f7c60bf2bbb9b70011219400999a920706345f", + "public": "02b55a56bc0b74fd16fd17aba5211421f040950e9484483af788ea07dd3d7183e5" + }, + { + "address": "W51H6pd82ZWMw69h51yqufMkFKKTLJ6cUD", + "bitcoin_address": "1NXdJMxZfMCyLyedYXf3zZY94GmLWu9J5Q", + "secret": "ee32e6b847c7061bf1a351c1b37ab31d7c2f7d530a59757c6c69929c9a50277c", + "public": "03186946c764572808287eff9ec29cb1db45511785f3ab3372d77ba90fb27c8f1c" + }, + { + "address": "WeBMYEagMqSvmHsFA3KuPAaarBwZyXGSG", + "bitcoin_address": "1LC3v7k5Az4vBvsUuXzqdCLYveyb9D22ZS", + "secret": "1b3c9c5dd6b081a20bc2d24262b8007dbc2c541b71d18cf38c21f41451f90205", + "public": "031f28f96a5ea3640814207a223679603599e47b4f5f97f84788263760051d72be" + }, + { + "address": "xDmCFbvJ54uUFsWs9JdMVRc4pLgGSfMJg7", + "bitcoin_address": "15c3GQasUyMwkFFzbjmhXBk65MWY1NBGtU", + "secret": "8ab8de8bcd5b3ca578efc354834fd5808e732785424f14041b5bd88e52d74058", + "public": "03afbbefa4aab3a996d06d66db94d6a2bfe3c73e2ab06866b267322eedc4e8ad74" + }, + { + "address": "X6yjHdHhJjoZd22mBKzPbtmoAdn1c1GEFd", + "bitcoin_address": "1HFdgyugvFuPzBucsfHAnbj7URA3rhsgxc", + "secret": "960bf9bbad1970f6e29a9dc94e7257fd97c2921336b71345575b701853b1b03b", + "public": "029a88fc03edbea796c19081151942fadad9def61bacbe4acbb2d8e5cc32b3791d" + }, + { + "address": "2NtkQYTkB1Gtv5vEuxnJ2rnw7vBx2MaFZ3f", + "bitcoin_address": "1C96tVPycRe4pW4zpjV5Q5AfLVkRsncnRW", + "secret": "244dff8ab639cd4d1ae38e838fcb970d0e409440214aade40ccac2b0c93748c0", + "public": "02f15c4404d16679aecaf06a4c0a84599287f9a672ef81311c85b25f6d11fe2bac" + }, + { + "address": "qdUuCBtnWFPkqoLS4T4QeJhv1MTFd65ir9", + "bitcoin_address": "1G17rujw5mQMMRFRrsZZazrbCdQVe8BAQZ", + "secret": "328e730c6ed08d616ca8740bc05de4144f1f39a89b2840636d13dd9eeb69a1fc", + "public": "033cae48014b7dd9aaf8ac182b9d11acaf2119c4e8b136ea2eb8ef42a75e7b45c0" + }, + { + "address": "Ce24goELgjozPagSMjUJrKdYCwfzi7guUF", + "bitcoin_address": "1PWvFbbBSV1X4cBAUd9TpnThMuuTm45RVc", + "secret": "f37bba7af44d3338c12bd91f95d0879aed78bd8763925dc657faf33f0335b089", + "public": "038ec03df3b4b5c5a51abc135de0d2641a892382732fd2471133b70b9da2a99944" + }, + { + "address": "C5x5R9HUaTp5nr44tX7KgguMp7FW3874Ri", + "bitcoin_address": "1HQGnAGEfN4ro4vZYE7X4Sm6Hbnv95FV1T", + "secret": "fa0d9ece0ac17368976ec01348503cc026a19510218f660ae0abbe6965233e2e", + "public": "029e6d69030cb4730b95648443820e3f974e70b9d7d5ce2a2559163e0463668153" + }, + { + "address": "2b8k8jUXfHnDpEDk9APRWowqVHMs1C6u2xd", + "bitcoin_address": "1LFS7K9ZckRvzeGmAcKWMvT1pimXRf6683", + "secret": "fbe064b4fcd145c2155d717bb1916b1c7d73c1d624691b36bf7df1332de410b2", + "public": "0292d4e8e577b274d72e74b3fb54e56443cc2f4ea586748e86a8311a474457e2b4" + }, + { + "address": "MPZ54f9653bA1V9sDRTgPFgnYWdqdU7ye6", + "bitcoin_address": "19gEDayzWwm6YLJeu2UDxjcFXaoqsrZp5H", + "secret": "2fdf6ae40789196480461853f075b6bf34fda7f118949c4401b5d4c05dca43c8", + "public": "03e3178668134726e267877354a3e34383823bdffee27b3f7edde6b882fa4b2183" + }, + { + "address": "CicfeSE7jKdooXwA6pb2SFVmTKnBd2b2RB", + "bitcoin_address": "1nSAeWNCXiEMZtjrhKZM8nh3RqgWLrPtL", + "secret": "a1f4b57b2de3389fd1b45bdb838b789a7699c5ca1d0bf458d84faa4a9e68512a", + "public": "0343a7cfd8b57d9359de6062547c3fda453cccbc4ba7524656e9ca58bd5e4f1ec1" + }, + { + "address": "2itVDbUu9t6Y1sJB5hqGUECp3r2mA1KEg3D", + "bitcoin_address": "1KTPrnz9WJU5BP3f5VzQcbi9xpFgr11FXG", + "secret": "2b5a9358c31be11e49985c2f6e11c9039e105ca9175980609c7052cd5ad10b73", + "public": "03c06daebbf6d2c25955b3461fcc8fe73c93f1fb35ec46f0129cd03560137cab17" + }, + { + "address": "hmMGDgFx1gEVCA7FsB9Xo2AmiGXnYaZAck", + "bitcoin_address": "183XKTrBys7qfWYaYteVCDNFCHLdtBWGkc", + "secret": "a53404405b2c79359d04eaea710d283371a92e18caabe8e0cd169bb77cada7ac", + "public": "0332aed6d0d7cb573817142a69be2f34257bd95b95e04a7f29750ef284fe248ffd" + }, + { + "address": "2Hz4RbBvSeNbTwhFer6vV1Y7uUfqbN7FiFX", + "bitcoin_address": "13avX3iThU7o5gQdYsLjwE21yFK6jxPzrb", + "secret": "f5643dcfc17be04b092340b11fdad373d4bc5cab710761bdcfb94d76c005383e", + "public": "033fe130623f83bba6cbfeed537952d030f0ee3f99a4b9bcc18ebf6471274e1851" + }, + { + "address": "9Q5qJ39aeRmY8ippsZCiodMyon2wzfhDYk", + "bitcoin_address": "1Dh8bnYrGkopnjUr5AsX91vho7o2dQ98t9", + "secret": "37e970e52d13e3b95c4db1e5e5b8b13b87a03fcc433e81d49912726033ba5b12", + "public": "02d02350a1b27a087cf0301583551ad488d336b5cd2dec48006b6dcf2a08ab0509" + }, + { + "address": "pXys5mPkk4jwQW3xYRyqEyQJLKz4WEypsv", + "bitcoin_address": "19aC6LUJJ7w9awwproP4PQN6dQvD7sAA9j", + "secret": "381dd50ffc4dcc059beeada39ce30da070c0fa67fbeff5f4b183c2c3e427e7c6", + "public": "021a36d9ab658c57ff3f5734eafed081feed61ae1d6e15f0fd56bef992ab9a326d" + }, + { + "address": "aVp2GMSoJaXJp98jfksbyGxUVmkyYCTyHK", + "bitcoin_address": "1Ex3HU6EL5gfE4WVJgExjz4EnEWbe8qTPL", + "secret": "9598203aeae46c16a3f57551ba6541dc83052eb62bfffa65c67beb66e2468c16", + "public": "037985090f64098cbe218815361bf49a1143de4260e85519b9bbe64a18d7a009a0" + }, + { + "address": "2d6weK4E7LmeQ6viCECBKteexwQfmXJefeV", + "bitcoin_address": "1NGTq3KU34d8FY9GFF9nBKKjfw3FjroabA", + "secret": "55c82c51607d2612d2c558c87c0ccd2b1c1b02a16616d632f09eded8ca9eeb5d", + "public": "0378bb0f40994c3bd0d789b5cc48aea01872136c0e25eb27e0593c4f8fdae2b63c" + }, + { + "address": "17eYicrsFCUDmQ9Ay6k2enNG6kDRpH27Um", + "bitcoin_address": "1NDfaAVJ2vayLgpzngTqDyZcDxmGMrks1u", + "secret": "1d5a0997833672800fbf7f55b9dbd5eef6bc53c033c0659db8a474faba7428bb", + "public": "039fa99bbce21aaf219d1eadd3c9851280b447a21f5e42c3083e01243093f5d237" + }, + { + "address": "2SSfBC3MeLVgb3XyBGGXsKYzckjCbYKUgsP", + "bitcoin_address": "14Z3oSPPKJjqi1dTqXDFmcZZa6U1VcDBYK", + "secret": "c948107863c1f274f82c8e7759521f575b616fc0b593bb7a3f16cb84337ead51", + "public": "03fb19b4b9769665a86d3554ee26b7e44585f6d9a90109a915cfde83271d7bc5c3" + }, + { + "address": "2n18ViQiVXuUqwjEszaSWvi1kANDYKeQH5y", + "bitcoin_address": "18g2YNhZxUVnQqHxSMi8Am2JZ3gYfD43EK", + "secret": "497d87deccaf1e7c30cf18833c580ac4263ae6e010273805b1940a0e652ffc3f", + "public": "02e5ee7a913f43f7f6adeb6a6f52f0eed025267b930426747909af342b5123e106" + }, + { + "address": "2UmBGe17SSXBpYpp1t68zCU9ojfjk66dYNH", + "bitcoin_address": "1PwCseJHh1JxntAQm7n18mcJoWaGsqL7hV", + "secret": "d42ac161ded15f405c83b5bd2645ffb3f9c8f28095dbe2277de723395550a453", + "public": "02118d8b12f20485921989d7156e9cd06a9233abe03286992fd94116fa57b8df4d" + }, + { + "address": "U8YL4g25u9NnpALPn5aBGbosJXidvCooCr", + "bitcoin_address": "1PWdNaa9Ypu4PrTfxGZ9nHL2fMLqiUg8fn", + "secret": "b6b75cfa9529e12e39394a5852a077061b172da0cd6090a4271f4f942b82e7d6", + "public": "02c5094141d4e994dd81e81e4e91a6b81051370b96ebf41a624f3499f9b4525119" + }, + { + "address": "2U2k86ibWdUoe5BNBj54d96sw3rFYXnSySH", + "bitcoin_address": "1DUHTKDAzPxzZXaSekp9i2Ap692hHAHDVH", + "secret": "e715f598acf607c8552679d0d1833e4ca10aef44e4d662aca8ea84adb71840e9", + "public": "024041c3512656d1736bf7ee532a726ff43a4b4b93a89cf437640ca3f6f17f8eee" + }, + { + "address": "FaibKxHFYdqaorDr3KYXq1pnAYE8581MuH", + "bitcoin_address": "1m1QweuNthpiV55wh6C15D532mT8QPSUT", + "secret": "cf2ebf9d3f6d34189b32c7e7730de432e6ccf9858becc80be734523c5876ce2e", + "public": "02b6b3963a2517bc2010d3042e5e8e595c6074538b22db7fdbcc0c2d6cf5931922" + }, + { + "address": "pB9Q5eXorXGxNZtxfr2Mzuk7xFBYNpMnEo", + "bitcoin_address": "1EB6J1hGoUj1PgFJicjToRqaVJvrwejgBP", + "secret": "8f92555b725ed6e25a5e5805f53c5624b58a9706cb144d5a07d60509713fbdc7", + "public": "03c97d38b690b41240cd7e1bbf23529d178742736d6f1ff9f5a8a688747eda0e71" + }, + { + "address": "2Rbxzsa7C3B6cYTdk3Fun32woki93ewxvNu", + "bitcoin_address": "13PFYnCbBNjrGtuxnFUtuwLrNiXmKMc4kN", + "secret": "bb6d4b2d400e6c1b631eed7d4f572fabb51081327bb6645c425d9663e0ef8a12", + "public": "0363d28fb085932c0cfcc17f1174fd70973798ce480af85ff4430bf0bcd4715199" + }, + { + "address": "Diq3gG7K6evBUEE8osDTPq4QKtXzbxUtDi", + "bitcoin_address": "13Sub1greCzauuWrVUSiP7F3z4hzZWtCGp", + "secret": "81b5d2598b5dbb522a57b67073bbb6a130f0711923448dff127c02861b03a946", + "public": "03b0bb0ab5ca2984c0f0fcada6907ca8250d22a001ee69380b083df443265e3a98" + }, + { + "address": "2epzEVetCYHwuGNZefGrZmzYtpeaHoDAQEY", + "bitcoin_address": "1LiEM2FSEannkHC6dAFmNGuJWLLWypC7XX", + "secret": "8dacd77988acda3ff11b62ea1d8ae24b45d398b43f91147cac23451c5b68afb8", + "public": "035afc03e6b69359125261b3c78994c6b04525f09b0ae1c5111357be772ca88aa1" + }, + { + "address": "2Qkx7LFzEfxJzqWRPxTGjE4h8sFwnnfZSsw", + "bitcoin_address": "1Kdmj93Zs47XgEBrL6aYwyomb7urrW451H", + "secret": "d828a1ea868827488473c9cd4347c10408c00b4b42c649a975f9385560128607", + "public": "0381df65e2ae07acc12d48e09253698fa510bcc9c9f8ec34a136c9fe248c432103" + }, + { + "address": "gj6RTW7z32ScNorWP5WzHCgPPrh3KT8kmU", + "bitcoin_address": "177Ra6m5CFD2SPqhKEYsjEptnx55ZusYiK", + "secret": "6d10041a9ef43512dffb1a94c82171ae2afecdb62a729c48072a877967d2264e", + "public": "036bc174c86d63f4470e151ada6b664dfd7c29bce402543ed249aa7ba67568df00" + }, + { + "address": "zAS1wCFHtdeUgwRWFY2N4cMCPnSTLd5R6A", + "bitcoin_address": "16Lke6w9MSb4xqVz8t5sgFYx29n1Eb1o7J", + "secret": "0c072c2ec7c3a4feb9b946856082b9ee4f35295bf9b278349a254d3d12260c80", + "public": "02439f39e43b0a399cf84982f1e7085b5a2c0fcc248aa6ff6a7a80e1260c8293c2" + }, + { + "address": "6Fs7FRMk3GN8Z1wxksyJQTbmwjgZPcT3Qj", + "bitcoin_address": "1FeJ1B3FuAWvuys42SebULQ4LFB1TcVfxy", + "secret": "11fa5cc4f1da12b142b18f031b8de70588492f3f7c136b8227236da184bbd17b", + "public": "02773f6b07f15b38a96b3f3395206513372e92376098c2421bc8778424ef19a199" + }, + { + "address": "WpjbGPfvrPARdjnfARbsPhA64BU36oaKms", + "bitcoin_address": "1PEkTpk5VFHDhTPYJBbKwso1Se76GLcAqd", + "secret": "a3ca77abbd98c442c15ec3a9d755f708474576986d00a082b4999939786b8bd8", + "public": "03a4b79952218f7d035de076d464eb61ef837bf58db060a4765462c95b4342a8a6" + }, + { + "address": "26XKvqVnXe91pE1a6nnfZyjHRmNcHNQX14Q", + "bitcoin_address": "1EmTRjqzmgcUcCJ1STFCXBf82TGdhtPphR", + "secret": "816345565c3d408ec600f7f012185e5e35fb201a2517f56235e96730021a032d", + "public": "02d5ee48f9e78e6ccfcf20716ad8991624df0e2f08f9585071852d7cdab2505306" + }, + { + "address": "6ymppMLFLv9hDKngn3vUGXuKa82n8fVNRX", + "bitcoin_address": "13Kh5TxxGzb9W7U7aThN1QU3j6V2xYCbKY", + "secret": "04341a22e621f8e46dace5b8f4e6b4a7160b864474c04c3d96874e02d1ef1277", + "public": "038c519a633e90ad55987f55ee03acac4bf269323dd3e5367597e56dab4f0a16dd" + }, + { + "address": "3BfpvXz5km93FKb1L9q3e4gZ5tiLoNN6ES", + "bitcoin_address": "1AT6AMqfV22sc7KM9y1QAf4Quk32Jax3Jt", + "secret": "388a333fde8f497babb32008b17f4172849320f16bdd6688fd6582a52d61be2f", + "public": "03ed04ed7f880f3cd8290b53ea0f41f44f227e842abcc43d73a9640e5ce216a79a" + }, + { + "address": "EaBntaU8c9V3EnfSo6uALdB7NVNVm7BSfU", + "bitcoin_address": "113WqRbrKWicSNXbPc9uH3TXYq9vLMbMK7", + "secret": "2f0cea8d8d0be0bb2b826b813cd24da9bc6a059f785dfca5f372d1fa3ed66020", + "public": "03893d78ebea3f3835ec5b88aa5b0fa616a165af23384328a1689c684af46f74e0" + }, + { + "address": "85ewkkmYE23QsaJ8QGHDQ6c788CUTDEh2m", + "bitcoin_address": "1G8SGum6vH538P2zNPoK7w8LZx69k7ucrZ", + "secret": "8156a464cd249208b3456c7c1be5d8ecad3d42212278cb5db58d036503316501", + "public": "02cf694432823e75825bf1a9034c2b7ad054210bad5d58250b0dd8e8107a808abb" + }, + { + "address": "2fkBZZHm9KzJCj9uTwyU2EKeGVGaq2T6Tsh", + "bitcoin_address": "18SAfu6jwVDRvaDYi4H5bboRggFUCKvgoi", + "secret": "1ba157b63be9213eac9504fe35bb9b8b8441256bf486e1184d1ec95de2360b62", + "public": "03026989d4b9ba7c82055586525a3081b52ef0bdec1c60dd72c5cd2a317d7b7b9a" + }, + { + "address": "shgRMgZie6idoREA27V8zzB4YKHp6g3D53", + "bitcoin_address": "1NLzDQToztsSpTAjh1sCSeB8UNz2t3u6tT", + "secret": "0b530bc844170e8c96e2fa0270bc25b18158b1cd0a0dc335a2082ad78ab952ce", + "public": "02b9be84fbe4377cb38084efb37101296fa74871438153bc7c10b50e648a467f59" + }, + { + "address": "2WXMUMWm9BxPgg1nu8Pjo9VAA3kv6z1wctC", + "bitcoin_address": "14vQabaGBQ9kUxEPj8kyg7vYAshJsDDQhH", + "secret": "677e5a6bd11d2d7950ed67cdf19b2321a7ef6735793540615d7dee25f4a89099", + "public": "036d544ff08e196318752c2d0694cfdd2df265fd37f8f701309b206169c894464a" + }, + { + "address": "9h7vgZXrxvpSNkh9v4di38NfsAAoCKxdTV", + "bitcoin_address": "144cGMxabwPSa6c9pynHPRmdzuVcV389EN", + "secret": "64687125d8d1d0301bcb7c7f8254148ba674f2fd7976fbfd478e388e2fbdaf34", + "public": "03dda10d0169d9492fe86e73dcb4bee444f8655a3ec54630599e1873b49d62361c" + }, + { + "address": "2A8uy8LLb5VxUt9z2V2tqvFJZujEQKBvHk", + "bitcoin_address": "1MkNccq22S4k3jeMVA4pyPCLdL7iidDpu9", + "secret": "4418550903f77fb6afc475aa45f6d46385505aaa261d3333782739aac63775c7", + "public": "022ed942f2c7f4ae006a56d40d2f2973a9f6489539712b09755611e519861a915d" + }, + { + "address": "QcURHwLk8cNaycfrcB2Rw4eLojXTXFafrG", + "bitcoin_address": "1KUGpFXGdfKQQbehmNL2u2EbkFgFvEvbzP", + "secret": "22ca073353e4e79b3568d7f273bdd4d7798f32211856394caa568c06e45eb379", + "public": "02a633a0584586a40799160dc620f5198cbf9288ca1e067cce1f9983e7cd536616" + }, + { + "address": "251iuEvBheMsacZDSmnQeekfPtwjQpf33hH", + "bitcoin_address": "16BCBayxkvr7GXUP4TKxjpkQvEAkRjSyQp", + "secret": "63751fb3da5decacd945ca81560f083dff8eb89807b8e9111e306e547578ad5b", + "public": "02ed51caff4445482542a0b6ff7156da9bdf7cfa8d722c7b181c1c402e5b33beea" + }, + { + "address": "CJPiAxCd5B6SEg8gwPDGFi8wfQ7MmmCY5U", + "bitcoin_address": "1MssPwu2xKWjr8Grph7Qc2tCZyTFLd5ydF", + "secret": "1ac56d8474ba1909a44e93fd62516514219c3df4b1d83a0caa3cfc8a9926ae98", + "public": "021c30a39512cd8ae0a1dac9bbe80031548c2efea00046312e84bb90265c674315" + }, + { + "address": "2WngTwv8JkpeBGnz78k9WuzUYhspAcjV4zF", + "bitcoin_address": "1Ju1LQC7wwMEAWTaTyeZtkSKh7inFredSH", + "secret": "e077f3e181e3870cb6c3f3ee95b61c3cb61a05c40661073729a71e228940486c", + "public": "03da594d2e0fa86a0e77bc47b832fd1f270189b8e509dcc14e801103a202388467" + }, + { + "address": "282LaqNpQNhgBAGQW3uVJgTTFFbjX1qvAEp", + "bitcoin_address": "1GZbReUqLxqdKsT7TmzNhL4u8XFxmd8PM2", + "secret": "26e1bf94fa2c8a12ea407e10bea604142e7b81c879cadd378a8c151503a1dbcb", + "public": "03609ceab8230f56a60c6d85f9a4ee0b5f3275ae6ee204c297cf3906404a0e607d" + }, + { + "address": "2M2nyEzS8KcEgBHTFpTpQu5WuCHMqpwyaZQ", + "bitcoin_address": "1FxoZt3rnZFnbfBYnm6W2kb9grEbpw6vKx", + "secret": "485604374652f35a5812dd9b75019d7082209c02cf775e837500fd0233436a03", + "public": "03a7cdab6917f1f5d458774a1a6a37216da8476822bc1f9e89c66bdc7cd0650997" + }, + { + "address": "P9xPYDRBaZxSczCGXnkepWtZfvjKWcjAJr", + "bitcoin_address": "19HaMHSrt7zzCsQRh3PeZnM6Qkj8RF3eAW", + "secret": "9abd8aca5eb851431dde8a2aba245fa3dca2f196596c75bee0b4b1f5c54a8bae", + "public": "02baac3167bc9450f0595027f30bdd5fa52e8e7e2c3db98528b4bec3b116ba03ad" + }, + { + "address": "23avPf1yDCPwYDooFJ2uA3ygMshBq24oa3b", + "bitcoin_address": "1HaXbpnvLe1RMCq6WXTpUa1Yv2ArvFjFxa", + "secret": "425570cb9fd473ffafa9c3b10aa9658301e94171cf6625b8a0c8f1a1f284575e", + "public": "02b3c25bc926088840fe0325c4c277d1e5e135ecc47d77ee30135824767a682af3" + }, + { + "address": "MFY41NGXYtAxyWsrSPFGojAVuLRUS24tZ6", + "bitcoin_address": "1HEKhcSEbcXwR7couU7HABPN3uSRnJL4T5", + "secret": "aed7361510bb9fad15a1efb6599d7759ae3e4c154145f386e415d2d86af09b3b", + "public": "027658dc03f023433ebae5b19fc13110b8bc81786355a62cb0395fc4f3e44f200f" + }, + { + "address": "2mJhg63fvEcfvHkjABt1sqhsV9U1R9fi67g", + "bitcoin_address": "1NLNviCRDCqPVNFET3Z9zEuE7Z9D2yBvjf", + "secret": "c0739f6996b0fece57a490c12a6b037739526f709e56e8ec93db7ec58b27a341", + "public": "0383d00c097840d92b66c828d555f038dd23f160e1408394ab9708ad9602811803" + }, + { + "address": "B7uERaApqSwMahW6VeqZ2HekW6EHSRLuhu", + "bitcoin_address": "1NDBYy8MenxUDLVQhyKJZjnFbCut9AMaHd", + "secret": "e68379b76208250614afae494bbfe5da612e9c0de863ad2c916aae46f5a92887", + "public": "0256404e09850fdbd455763e45b75b79aec15b5eb005cb89b906fa5c6099f84ec3" + }, + { + "address": "68qcyx2YJY1C1sFvBkSPpmqpN2G88e2CvA", + "bitcoin_address": "12RR5aHhW5N8RHqfkbkRepHusRhbLbgrYf", + "secret": "f9adaa10140355edb590e61818712040662491a6eb59765fd3d8364badcb27bc", + "public": "0321c06486d367c4c40313672c3b6998c7291e3cbe0519e13827a7c4049d5c16a3" + }, + { + "address": "2FaMkeRPxhdiuDhUhXqLPv15pnmsS1oSkqo", + "bitcoin_address": "1PqAiUD8AwduA8enXhK76Fn22UwmBNHMN2", + "secret": "f0ad71ef9b7bbd682988ee3b7ec68ead4c9e7dae2e0fc41813ccf719b6ce2857", + "public": "02647a9839758ed0830bdeb1c1ce2769acbe4e8deeee42ee745d3d7f18e8f261d2" + }, + { + "address": "CFdDHPNwmVk6WhC39WCvWyrzs6SRo2bLXz", + "bitcoin_address": "1PX5QJAP82u3oQaZPsrPHGHst2sbJFtJDH", + "secret": "ffa8b3da58c93aba377e1292afc33849cd796d826d185aa04964473f0e978343", + "public": "0288f6df8b041860d17fd8d991c87a164ab51905f79c85bf93930042ce196c1df9" + }, + { + "address": "FKmFe5i5z2krYxQkg8NTq8PgPXRdP6xjLs", + "bitcoin_address": "1DSHDMjYrsaQtJgFrEwapruCwz4FboVQnP", + "secret": "06e70a542984378260026ba1a0cb09fec849a6e3de827129be09234c45959046", + "public": "022df795fa62b6497c171898520b4012b89ef28e66dfb2ec4c01dbd83d6a633d08" + }, + { + "address": "NxKCPRWfvHmpavAZw5MjP5d9JcXieC34Kp", + "bitcoin_address": "1LJZTQWRBHiNQLZG4o5CBP4dNjH9AZqE4T", + "secret": "9ccb0d6970a675903491fe280f6b07dcb018d3d7e470f3c1a6ec2984aaee7bcc", + "public": "0220b8d468f5f1f65ef33948aca4606fd21bc8b908a28f14b0de18dd18ccebb838" + }, + { + "address": "RJgPnJMTKBo7KuEDPd7GQQB4DeEtyczUT5", + "bitcoin_address": "15bSLsp93ReM2KjDyRigifmHKxxGEdWYUp", + "secret": "3a765a74fd919c407a95ce6d2ad9491641589a60878b785d9e18639e3ed185da", + "public": "03fbfd66876c8200c688488876f227df16a665e50f455ad01b3264658797c54f73" + }, + { + "address": "2ZK6KxmX9T9qk5UnFb9SfNM8LvrJejux5kt", + "bitcoin_address": "1FekLsMeUzRL7Ut6Nm78hhz8B6AdAQpFJe", + "secret": "0990c94bb8b0d8f7cd3e7e097efc6e85525720992a9b8af9bf1f2e5127f11277", + "public": "0393941b893f7b4efa9d0ecc06df1b55d46ade9fe9b385bed458fc172094b9cbf8" + }, + { + "address": "2N3RdM5K4r3eYmHCFDH58CnUGx1gFMmx9o7", + "bitcoin_address": "14an3vbKXX3W6Rvz3oKJtHWvcQkB8V31k4", + "secret": "8cb43acb4b196c151e45227fbde9488d9e15bbf8da3a1b45b8997dada8700cde", + "public": "03f6c1da3c8f27ab64794a00599887c97f32cc9e42a822451ecf26d508eca9ad82" + }, + { + "address": "2H1VNSr9z5w1szqtva9bRUCLXsyvLNSXWrq", + "bitcoin_address": "14ozxgr3pVRfmJfQrV7M7kq9tYLEE2Hxnc", + "secret": "b695dcc4a615914926331365f1e894c6efb33078e44d87542bee580574f075b5", + "public": "035020067ebc6f0b5ada96bf2ee82177cbe2fab157cc6733cb52a05047e122e0fe" + }, + { + "address": "msNB3k7p23RwHgHhttqpuvw4psfysq1Rkh", + "bitcoin_address": "19FN1UmiS6kHUfjTwtxE4UQgbriyxhqVn6", + "secret": "75b36b96993b83d56a21376aefb2638fcadc03b3e1a1d67332aa4d5e05842167", + "public": "02cb48b18b854d05d3fe595c9036a3e0f486761c43e7dea7858a5378b97040f5f0" + }, + { + "address": "2f7axMoMyTFgCbkbsXvi7zRYgQFdhPZXh6P", + "bitcoin_address": "19hD1h8EdXJPqPGt1HoBHLQboMfD6pMXrx", + "secret": "04fbee77d3726559ed06eb2f63c11dcc231547910d70869a0e061cc858efd0fd", + "public": "02594db5ca23a3c18801205e3aa94b1e70e1eb632ff0e5fe092d1b8f109932a9e1" + }, + { + "address": "4nJxCkfZkzFC3Gcng9yB4jTYbc9jYoeWui", + "bitcoin_address": "1JcRdY6QrVYtjtGnYbFFkuyQVWDyRXF4M5", + "secret": "7b4eaa2f5be99c3ff630558e26ec8df249d2f3faa2f6d5e150ada68946e56024", + "public": "02d6e473a3f1d0ab1d10f3e49b22a0f10a0c7aaf6a91ea20a4c0cc402e7be557aa" + }, + { + "address": "yuGQw5TzntwHHSFZ3Fj1yNfU6DuVtrK2Bx", + "bitcoin_address": "1KmaDDTMZKcFbqkdY1STcmCfRisB8B26E5", + "secret": "d716d9193356f96d634913768b0a9fd5c76378d87e472a20afb086566b17ba7a", + "public": "03442b91d87ed6772e0fb557ba5ad2b481c78cca2730b4ffbc0cb637c14472f054" + }, + { + "address": "1L33Kg34Gj7yccMoJKXj2ivzQyxihoybaY", + "bitcoin_address": "13Re412JbF9DFSxTnuWD5nVSted35D8ZD6", + "secret": "4583af591c90d5df33029f874c76ada794ba7ba2800fbd91778131ab8fcccfa2", + "public": "03723d1d42bfc722cfdebee030af95936030f602ce3c464593eac6bb048df5989a" + }, + { + "address": "2NwiemjJATwoJ9r25Jfmi6biyYtBUJqZ7vD", + "bitcoin_address": "127q2ah8LSQdME22dB7ZvgSxZjgpSKATpJ", + "secret": "c96a2a6ecc7c964766e15cb3e6e976500153b5d6192d8dd4520a8ac9077bac4f", + "public": "03054413578006144e776be5d65c171667fd0466f41c865fffa8d8ca4f58d3b46d" + }, + { + "address": "wh6cxtvGracfHfKPga1Gw5aAYL7YjiaoLV", + "bitcoin_address": "1HXotrAs4RQwZKbgKUKJxgPTmqdfLckhVB", + "secret": "8c2e6470f1505d55fb80d4112807f7dfafcbebb3e33ed5e5bdf844fcd8415e09", + "public": "02a8e00fd4e4a06e017c17f3d93edac7060a8f97ec4c2226552b6881d94e102449" + }, + { + "address": "2jTGRGAkWVojYeNrJ1PtE1ppcq2mt2dCQP2", + "bitcoin_address": "1C8dJagcCGrjb8aHN2RLgvVW5yE6J6KQyr", + "secret": "f41b9f940cc71f9fc889bf8e1c42df2c8cdcfe051f6e9c0bca2f3567f991d9de", + "public": "03de30a46efc8ae7e14926487fd940bfbf9752fc48f8260d17362e59fcd98c3326" + }, + { + "address": "2gunAdaL2kStrQEcaiN3wYXpyuTZVdCQgJu", + "bitcoin_address": "1JRNLVwqAsTfBF1kWXi8Ho5zFpdfiMj1bv", + "secret": "ad8a98fea822a9f6e3dde77720ac33b645f1ee653653b5002daf0b51b36054cf", + "public": "03e71f0b9923dea45f5b36f03cb39ec95091be101f50b515dc4e7305786265f12a" + }, + { + "address": "2aqkXB7Ktc9UqD3cpD85LXWM6K15sExbmjd", + "bitcoin_address": "1G7HLq8tkbroRFW7aNw5azq11ZGiXoph3c", + "secret": "ed8a62664b20244f817ba415b88748ece10c6c017b47c1eadb6aefa81a1339e4", + "public": "032340ae72ed38c789d18e9c79337dc7ed3b758bf79ca46bc96d859842522579e2" + }, + { + "address": "wAzQNGrVRX4YUpa1cVAHHAfhDUNedenZq5", + "bitcoin_address": "1LfJrZC9DBduLgtmdTb6ASF4Uw544CVPKR", + "secret": "3142f3da96ee43338c96f9adfa031a4c8f9fd6c2ecb1a3445dcbb1120c25e9e1", + "public": "023795f20aace810257af3d7b3657f91871dd420dbf71b8325bf5d4c7483f64566" + }, + { + "address": "EPMifzsxYan5zGa4vQucqTqRhoD3FVppLJ", + "bitcoin_address": "1AkyyKgen8hJ5GwEcfRQPy4PndrZYJM5UV", + "secret": "c4822448039a8158ce1df9226658200617b9567731d40eeb194932420d3fa3b2", + "public": "02d9cf102f49f1f4a179bc1c3f1b1f98d9b048521a4030adefec219c578b084a40" + }, + { + "address": "S2A5TZc9KreFuyALfSrAEqtfAnDpNZc94m", + "bitcoin_address": "1Auuwbqn9Eyj7NftU2q33M2af81zv2K2q2", + "secret": "447e435d5b33194e4d9e4fc2843f0565a7d0d4b70f5aa9e5013b41f248cf91cd", + "public": "03c1fb28de9f691912d2a70babbc75bbb98f631600e271abfabf61d91cc8cc4daa" + }, + { + "address": "iAYSpkDoyaLaR84EfrtQvN717B9u6fj4qh", + "bitcoin_address": "1CxNVwqhy6XQj7kDdcmo1u1ojU6UNtD28j", + "secret": "e7f0edcc22d803e6cb9d267e081749371654f455ca285fe89933c036dcb371bc", + "public": "033557467e9d623824a3fedd7291f0305b8ee6ae2425031a9950bff58174971671" + }, + { + "address": "2K1nzfXsFnvSVZwMJL6WEvhW8qxobLtaQR7", + "bitcoin_address": "16qinXwBrx3ewaYdbYBhYZsPXPXCMqLmaV", + "secret": "e7698cbafa77734600bafc754f0d9a24ef84b94c16d69ef4594c375bc0c849f2", + "public": "026525ef0253337c276ccbd8d7c0182ab7ab48583d5ec743ab408514d6af2ecb0f" + }, + { + "address": "2NLypD5yFCBvqNQ46f8y2AjTzrQtmdR8Amg", + "bitcoin_address": "1AgyHYL91uvYL1rhZggMXv3xSrDV8PX5Cz", + "secret": "63356b3d581b1416150cfe17c698db997c734b2303b7e7364b91b42139597a14", + "public": "02174eda85628cdf4a38a6059ff96b58435c1f841d70ebde77838f14ce029de210" + }, + { + "address": "ycaUcxZ297suGDQHX8rAE2o66uBbaHSa9K", + "bitcoin_address": "1FG7bFd3eJDUg7xi5BArhD5sXiq9aVcN3i", + "secret": "22f75ca0d85ba3ab8ab6133c4f8222cca188418422d6c8f30535f0db6399a747", + "public": "0287d014af5975037275978bd20691124f4d906be9c09ac5901d6388abc6fb2806" + }, + { + "address": "cvDxKoZWNEhuG73dxxjwBHJwHqHoj82qQJ", + "bitcoin_address": "1AhEgnjmDDwQMFtctUgQZJnvKVSnW9ZWGE", + "secret": "3cbc7c5436572ea5ff736489d84420158600d5c39e8175d3d1f752bc1ced2b90", + "public": "03279f03cfaa48f1eb80c66138e4e32b22b943c0b46c387c4a26dbd1cca5ac4147" + }, + { + "address": "2V6bLf431P4U8odSUTozXtNVyVhhfD1x8ks", + "bitcoin_address": "18zmjjyo2Y5FXXzQbHNNYCrpVdLVqZCdAs", + "secret": "4a9234206aefb76345294863efc3e344ac8294542d6c78eaa8f0f94a396eca29", + "public": "02a096ec8754944a523602aa7141c17e76de62c2d910edc107d9e5d2e2ddfafac9" + }, + { + "address": "78CiJEYytgY1GY3e7YkEEtc3iKUh17BsRB", + "bitcoin_address": "1fMGRX3i2rV1ZVjQRobAyJYoHgD2PKz5w", + "secret": "e9fe953daa778f1a4e2ebac0f2d5efd9a10835d3301f51f6c23b3c03c1d6bd2f", + "public": "0311cf95a60d6e04ac1b08b3354efa2d364fc1f26d552b1f6f864379a264d49dcb" + }, + { + "address": "KxXp9kXfiUwqYApRBpSieRjG2gUz8MCAeA", + "bitcoin_address": "12tg2CKJWF8rXMQEgXZ2GqMPg2SqXD9r75", + "secret": "f9b6f18626230dc0221df145949885138b66add73f216febbe8da03216852fa5", + "public": "0200780f30aeb162071b8e8f863d81ca0a9aff46fbf8475da8faa702ac66f7a705" + }, + { + "address": "TRXyHSr7oGbVbJurhkJGgSA3Q1NvPQadqs", + "bitcoin_address": "1AmAvLMMqNPzShNLCY4SJ8wsHYak8R77Pq", + "secret": "189694b3d311db623cb393808e89cfcdff228f1675a8392f3a85882d116a442c", + "public": "0280a7a939f549d5d8c8fe377ebdde1413223b36708ea770a9fc37fc5bb4cfc742" + }, + { + "address": "2dzxhFNvfELuA7cPFsHR6z8NnoCZbBrwq8b", + "bitcoin_address": "1DM6h8dCe5sGv9oHwYJ8yyHvHWUPELCx8k", + "secret": "626fa9e02b3cb633ec3f5bd75aa7f39cb9c0c494ee9ffa1c059032086542ba54", + "public": "03aa1d51380d5ad3fe1e6c3bda6fc013d02dcd620784d5c1e37dbee85ad2296cb7" + }, + { + "address": "2NWM7ZKdpa1KAKbJGoh2kjKQWnF4PSRuTWd", + "bitcoin_address": "134dj6hn55rvZY5rtQjmeQz1jmWNTb8gMX", + "secret": "77a01079dad73056ca87d84251811bd0e4925e59e64ea2a957fcab3368f56d5c", + "public": "02ab48fa9293ae86ce7eb083a2c90d8f63301e115052cebe7e1dbb281f424ddb8a" + }, + { + "address": "23X2NT6wQJicBDvZMUDysSV3wMgXVSoxMr3", + "bitcoin_address": "19YWz2auGocufrL8MBVDdYyDiaCbccsxCG", + "secret": "aa7aff9bedd949cd11efdb243fea9e09e8a36700cf97d611122d9eeee9d597b4", + "public": "02bd0d5009b71f203acec6294881215d7db08595e9ed86dc92e634d5b0d2f23f0a" + }, + { + "address": "LH1YBP5AjvYaen4k7DYgFyAzqi9pKXBkgW", + "bitcoin_address": "12EMhEfoXks15DTUtDrAFgbXtZTTxhgasp", + "secret": "464afa06ba6e8c59a1f16315cdaba68549cd1616644a7a25b343390ca5d86bd3", + "public": "039bde448da1bd733e8582cd0a99f6288fa227e0f36f1e945603b2d83e5bb1edd1" + }, + { + "address": "LPedwEmoxZPp1Hfh2gM19aadcfjznvdcvA", + "bitcoin_address": "17Vj7Yd8GNFR8MfvGDMGWHZRit1s9Yn5dU", + "secret": "ea2e750dbbaba5eb4f25597e27f0ecdad267de8404adbcbdffdf9ece9cb0e168", + "public": "021d0f2e38c66ea712101b9c522e9ae53c827e8c3124608ef64fc3cb316b4f099f" + }, + { + "address": "iuEGDZe6HGaVkR8Z2UgdDopPQaJZ9GahVc", + "bitcoin_address": "1E8Hgz2dLR9MCEKTATZRbCNgXoqwKpKsNX", + "secret": "88f6191752848ad861182bc02853fa7a62b2ef1e6a037a81738eee0ee0d5d495", + "public": "0224a18069cbaa5ce86031530cc6c53f5be72cce4affe5aa9e2fad32e93b231c58" + }, + { + "address": "2fFT7hVto1ijQx5S7mNtiRA14nkxKHmd8X2", + "bitcoin_address": "1EW1bS48zkb8zQduKaEaX48tZZuhZefhW4", + "secret": "a2a4095a7ee80b306c02c0dfa672f6de067ba62f6dd23e48cbf925e7cffeb376", + "public": "03b12f22cfdccd4999c0f8623e1b482f11679591198d76d7c448de1209c2b75a6e" + }, + { + "address": "2epcFgre2Cfgzr1nkLgB5LHmQNPxdebFHVW", + "bitcoin_address": "16GK2oibZfBYNUmZkZ4YQz7wakEuyfichB", + "secret": "3b9ab3594ba9909e49e46438c637f9247c3b343027196533047369af3f86d761", + "public": "034075500701002c771f867a354c5b63dfd7a27b230d6604e2b8063b945e1c83d4" + }, + { + "address": "Vwgtss72ku5Ud7UDZL836MQJohdcSuwGub", + "bitcoin_address": "1N1CHBWNNaA954gzDyebbL6kHPY7BPmEDC", + "secret": "76690e5179208d5b72b57b19e492cd8201ee8867d5ebe40bdc8667af33b62da3", + "public": "03b88ae823021df56ada42cfc8c1fd88c7143eadea1ef884f1f0ee2e2943b8cdef" + }, + { + "address": "cXJ5ihXqFezFnWMygwsfifaskFT7xV4ghw", + "bitcoin_address": "1E4tMCxq4RqvVh6A5tKLcf8sGgmgpwe9UC", + "secret": "dc352ef72b282321a30ec9b0d959d4d9b77063a45f32d8c905448d0873460b69", + "public": "0320b8d9fb36ac1b22177930e31430d5b84c89aeb89ecdcd554872362c85afdc2e" + }, + { + "address": "2B5gSmoLbRppmBiHx8wxWwnX9Wt5XhV8c4m", + "bitcoin_address": "17wmvs1bfGXEkQnJUEitsg6RtxBsaeP7nZ", + "secret": "aa687c90db3b0c2f87bad5455fd030bc8775dd0ff8a65948bddb2476f573aa46", + "public": "03bc34b2d5cfb361477821c4d7707f239b95c87d26e6928d4f3f4acc2d6718149a" + }, + { + "address": "CrMPQ1PjwKWnDdPVAQaSfozkHPuKzDe4JK", + "bitcoin_address": "16Q8HK41tEc1HnMb7ucxxmMA5ZSV4PJkhP", + "secret": "688c5018bec02673824ff63699d3002f80382aa6ecc7d2767f8f3c74ffb0590d", + "public": "0341fb80c77b69a986a39d1797a0c5b8cf1b9ebbcbf4c108a122b153e2d8ac3063" + }, + { + "address": "UxFfwBKAquEJYus4FZRJXu3Hqcrb6XgVXA", + "bitcoin_address": "16TuzmBKwkGmqg29cyMwLAp7EVudquzzAE", + "secret": "1be47e095bab584745b8474c9b8e3c1bd03cd14ab6d4cdad4278a33d804e6018", + "public": "022b2ca9b29ffab11f2ce848851c326eb8f016e7d402477c80fadea819b4c7dc2c" + }, + { + "address": "2bKghkQxAUpLRL2CH5UXi5obZR3e7bMXjev", + "bitcoin_address": "1Loj1xd9F3pMnZRD1dSi17uBv3B44j2Dpv", + "secret": "4c8f815282e42bf87fd63533bd11c27bf2f684886419927ab539165869dabb47", + "public": "0327ff01fc52d974f53769efad15458ddfafc7526628faff0834b1688429abdb3a" + }, + { + "address": "yNQkWKwwyYaSWQRqxkuCPWLBDUny2VwRW5", + "bitcoin_address": "1EU1JoJAUxxHtZpn7btpUeWyPhq6er7Tue", + "secret": "e0a08d6aaa1efe1fd000901732256ef93946d68c038735b3ea99b54d0aeee8c2", + "public": "02c8c10b617f36160a432cf69551aaf10e5d92a3ef55b7960bfdea86b85c6a2aac" + }, + { + "address": "Ehy18wxh4BaU4H4ddKzhTe8upRdHdKgM3C", + "bitcoin_address": "184v3sLoojREoRSfeX98pdCGvFkSpPDRXy", + "secret": "cf82029c3429bf9e3a2918fbb059dfdf667f56ebab79c62bb3379c4bcad9fccd", + "public": "0341b4c77a846dfb985f5e25c21dded44577d51b8cbd2c6728f1ccfea6f80ba547" + }, + { + "address": "87CxDUGMUEG4TbmKuJrnE81tnDfdbji3iD", + "bitcoin_address": "1Aw8MpLkyrNo7MWJMi8LNVCu85Sef4Q8z8", + "secret": "7d9656cb64662392ed93c60d66c7c2e5c6d917bf955729c4672841b63e6967ff", + "public": "038a4b918b57f7b303ceb32f8b3e4a0a3f93907edca2c028b1eb1730890ff9de1c" + }, + { + "address": "M5Hd2UfGCYHHHAMRhhRNuMiH1L4PFTdBu7", + "bitcoin_address": "1B5TN65AELQKU4Wm5g8XAvhSnAt1d4ZJfW", + "secret": "7f96a3f77ee706de79268dc5b161305f0d60b32b5e39f827fb7c59c9d2c6f594", + "public": "03355b8c6ee5d09e41c5cfd0aefa230b3de94484bf65fe04b2b4ddad68a452cefe" + }, + { + "address": "7dCt8NcfvF2eqSDU31BSX6sdfbuYg6D7s3", + "bitcoin_address": "19qnYfZCWrkSRyibo54spwqpz6EYgHpsXC", + "secret": "c6d2f40294eeb8d5e9b05f79ff0011dcd641c318981f2a6fa118c1fee8301787", + "public": "026a28127485642665a7d791b8a94b7a19ec42ebaa30a6cae318ded26fc2e120eb" + }, + { + "address": "EfjaJj1zqUT7c44FtWTpTtZd9SctAsgYgN", + "bitcoin_address": "1KTiquEWwrvv4Q4JREwnEbtXNoiAJ5Ubiw", + "secret": "5fa1c6aefa6b2c3265181f94362798bd97ac1157e2825a555c3a73ab298c9085", + "public": "03c51dbc5d349755cb608535d9678b67690a83ce6f4b4abd2b4b1bfa3d8deda428" + }, + { + "address": "G4t7VPjovTXpPkB4WFR5NsQs6UCKsZMrTV", + "bitcoin_address": "1EjCW3rxpak2WyrdL1oVqHhbXNrCuge3b3", + "secret": "a92f1ab3e1c387727a160af2236d5b1140b69016d8e328d0600e3ba933eae344", + "public": "02f5ef7788d11f164cb17facc1c3d755954373ad43c350ee22de71b1b4d3f6a921" + }, + { + "address": "EqnAHqETs7ZqSEwmVGcUBWENuXfF3AwX7u", + "bitcoin_address": "1HxnaGbFb3NqsTDmVV6hAWjQ8MBYqa9qYx", + "secret": "8ed59413c05a8fb4258a38bc8e2ae33c549c31e953737433edccc00f6e281375", + "public": "03e99890fcf8468447dda686a52fcc4d2ebcb4a2a9598645cf17bd35e1b2036e4a" + }, + { + "address": "9JY67nL2TLrh4rf8W5KezEjakLffjJ7ZJv", + "bitcoin_address": "1Jz4EVX2ctoVzp4fJbe6jui3XWZyVgywTU", + "secret": "819c8cc72b0c266c144c6c77f359d0c5f476fefc7d5e48b0cc32e694e00a1be9", + "public": "024eb7dd60ec2195640e68ae70cafbf9d3f32ed84491e9ef9917d50a15da31156a" + }, + { + "address": "eJhighy1FQDgytHobEPkFUrc8MRRDUrERX", + "bitcoin_address": "1NVk4wkAQWYckiFSM4CivKkKaFTs98mM4S", + "secret": "d8ec3cefb2571360c9a63e100c133e1a28f5298479f6b71f24fd2e35a2ff391b", + "public": "02ae12cd82ddf09f2d41f2eeb4c89d7bcfcf7ea6d045825d5e7ff480006c873cac" + }, + { + "address": "sXKjeTQx1Kxg7JiUsY1s9JzxmaZAxJGz71", + "bitcoin_address": "16wLpQxon7W5Fo6jivp6Ux3ZPmTFsRLGhK", + "secret": "6d2213281136b28c2311ba20c7f06dfa2631023cb9c41600a343b12eab7a1fae", + "public": "03efe76de2c6f2bb427d311f819421fd737d9796ec4b5e884724bc83313bc7df25" + }, + { + "address": "2P4vNsCQX5e2TEFsA3phiEzzLNcsa55z5ZN", + "bitcoin_address": "18qmgKLtZTsXGE62bn7ktrDkWonMq1KEKo", + "secret": "7e34200c29f235e7d41165de73e3e24345b333f2d62b1332d1645c79a131fe41", + "public": "02431861ed3afa26be09c750021b2f0e91b115216ad177403e45135346d037c421" + }, + { + "address": "2hK3XCyTcLDihcW1EpBqvRhUEfQTySJvtZj", + "bitcoin_address": "1LEQZ4eKMsrGhkkB7qnjVhFFHHXAjP31ti", + "secret": "26e1cbc5e0d46ed4ce85ffec8e2673ceb4703796b88a3dc47207f2e08dcff8dd", + "public": "03c07daec002df3915d53e49dd3bf592056f9ec01c4c9f71463bebf622d8db9651" + }, + { + "address": "CMyzndV7XRPcWyvLQtUckf4AqXh2BzeDaZ", + "bitcoin_address": "112kRZL3nAuHRjLXvFtbYvVdhw5WiBcxJu", + "secret": "016be155c064286b20c31e3eb78570aee436b4a1bcb51553a98a3b88db3f1a0e", + "public": "02dffd952d6087b6839ff2fb5406f8df0a588b47fa37f6b6501adef82237cc91e5" + }, + { + "address": "2Sx6BgyjTNa4SRGzrtQ3XczPtwKykMDNYUU", + "bitcoin_address": "19eUjFCD68vFYhgaJWj6FpXiJQQJjbZmA4", + "secret": "fd0f956556804aa600fbe8d179a5cd5293fa543f4b301496df71d44ca18f9f44", + "public": "021306263d266c508be82703eca67e924138e8373fad6db63fb082b173e3790a83" + }, + { + "address": "X54kZpzfh2QgJKptToev26n3DKtREcoPu3", + "bitcoin_address": "12VH3XrAX8vYi3nJA9zW4adq1Hg2p1uV4a", + "secret": "5ebdaf145155d2c3b8f3c2058878121d4da049de70569287afcabdcedf9e548f", + "public": "0318d7c0dee3c80ed280adeddc136dfb8addc4a96a0fe1686ae40ad48c4538485a" + }, + { + "address": "2dy28oXtQ5xjMmk5WZoxestCyYrdDKp4k9a", + "bitcoin_address": "17z6SfFLKhRPe6jhxjj2sZst5CxrRJ3mKw", + "secret": "9fef49579fb653c9a1cb089f286318cd125db8da7a02e1603a516ce0e90b9519", + "public": "0367c6fa57634d2dd0ed737eeaf9a968ee566f0f9ff8c080fb5d3a20955f1b9cd1" + }, + { + "address": "2YsSC6ULU9ud1HFPx61iK1EmbtFPwuPvLmX", + "bitcoin_address": "13iawQAxZCzbmSpdu6ZzzsvwBLmGPP2RfD", + "secret": "93ca92327524ca10a615c97c803c31e181ec25e1221a66f6cf4ed45549832f05", + "public": "0272595118ad56acb6fd1a7e733d580fef7bd7177c8f5150e834daa4ade1f69d2c" + }, + { + "address": "c9yNnwGMSciNxtfCfDpZYQBqkKhcruoCBR", + "bitcoin_address": "19MPzVZVhpHZgEFQwrAtjevRgcFM8UFR1z", + "secret": "1837ba45ee86dbaa69529292dfbcc93c1424326ebdf8a77608f1a0f7f4e46679", + "public": "03a7a4a53f0e573ea39f83bb9bacd91ed402937678c7909a2630c852f6a677659c" + }, + { + "address": "2cPy9RXG1kqppk6hvBWJdYPusTM9oaNpaGY", + "bitcoin_address": "1HuyhBqP6VK1aL6uVuUveYz1nESGD9irkJ", + "secret": "5838f6f51f7ecda21c6bb33bb6878c0a9d25a86015dba6d79b0cdc472577dc4a", + "public": "02fb56f26293d4ac62f3e49e3b87e81c78661b8af91ccff7ee4f452cace307d842" + }, + { + "address": "2RrSuZnng4zVoTt4Ytq2tGqg9yYSXB4pwCn", + "bitcoin_address": "1MCzTXEtj3HemQQycgdNSDUYws7iwk78BB", + "secret": "97b347bb13110f84c58bb17e8ed424714a897f72893ed476f285db2e4fd8c80f", + "public": "0302adfd41a08a7f23338dcc45dd6fbd0bf3f4352f8abf814c10729a63c99863e9" + }, + { + "address": "3ThUUSbyeiP8sYcKUJfjTh68rZSBh2K1Qe", + "bitcoin_address": "16itR1eKnvNhBo4rLZn9MyQHFkp2jJWuZy", + "secret": "b5396837ab1890a661f493011d5d3198849ddf54f3620ddc89c7127cdc6e1031", + "public": "02a9b07fce49c94f70ad821eed6691d35435124528e4dfa060b218098794288782" + }, + { + "address": "2P7eu8oaRGRqfZMkm7XQCA4bkAMVuW7XarV", + "bitcoin_address": "1MR73WQnpp4uuy8dLZZ2bhR5ZntHkzE1Zi", + "secret": "aa11b35c65657a62aa20b44fa2d79d7e39f0d50af94c83758db244e63cf3deb7", + "public": "0301a3fe3b088d93bc40f197f476017d02a3f269bf7e402bc30e8028f95eeb323d" + }, + { + "address": "wDgABtGkzH1fFoPRFRdXXPC8Eh4fbXA44X", + "bitcoin_address": "12FTVFpFFbdxDKzj3LZhur8agLCaXAsYfg", + "secret": "e7e5b7774a59efaa663bb190f4141a443811fd915a0542ae6d5b80350ab4d566", + "public": "0398a4a1db8426a805b7c78a101605173073a26395b9e870894bcc19edad3ca1bf" + }, + { + "address": "2bxejRENs8r4JTvfcjzzPrYqAFHCZWZpUgT", + "bitcoin_address": "13ahe5zrTmT8b5jgT3VH2EACQbPnfBFvBx", + "secret": "fd684a261ce599c7e60b4ae3dd8c25ce6f379cd0917145e784b2d65bee3dbd40", + "public": "035ecac650a6ad90a0c7ce37c4a8f60470f720bc323665342b4c8a0891223e24fe" + }, + { + "address": "2KGpywnakyuFh8JwrQzkZVYZCNTUjNUP4QH", + "bitcoin_address": "17Z7xEf9NiTqCbRT7RMdGS11RbHQb3FQZU", + "secret": "1f6f6a383bde7f74e62906fdd0e732777bdbe083d8cbc3f937911ea97527fb09", + "public": "02710b1c5b760022a5defcd04a471cb156304bc97b0f2888ec0319677de684d1b3" + }, + { + "address": "RtK2DJPZQKcDtFQUEvmjDrVWGzZ7yBL5SY", + "bitcoin_address": "18ELnogN5MrbwwjmwykREHaiWnVBU5hkW", + "secret": "398bcee8a98af1760b796cf0ffb3b97915a5f7395976af48e56a88ff1723abc4", + "public": "0395443d2c26ad2e5b14c62d83d742c212741ea90a9f862270e9b6fa65f7f93eec" + }, + { + "address": "gSHFa7incxNmjnTRVeu9adx3H491Q6Z7gL", + "bitcoin_address": "1LZ2SKYpjEzYrFPSyMLwFyT67PEnh9iAM1", + "secret": "6f75672a799f02d99f8be68c3f5ec9cdaa4e225d6b63fb28413210592852339d", + "public": "0296ca726068a5902489957ec48c85cc9d77e868b159ba9ccd50e6a5a7208515b4" + }, + { + "address": "2VErjgC2zSFHYp8upgaUmYTpyqZm54HuaTy", + "bitcoin_address": "1BiTijoJ6hUiQ6itBnMM8mLd1meYL6Lswx", + "secret": "d9a70bdb789be436b144ff6b337fc2179ae4dab76cd17ac61c69f81eb669b7db", + "public": "032ddb910371263818b94e8d5d763718ad8d6a1134bb806c1f6c84358482cc68aa" + }, + { + "address": "aGCeAXjw7P3grVg2N7ccWqvM6Urtsrr56k", + "bitcoin_address": "1GeSpVZ6YSiunscgCwVLNfsTT5WYwHhMbu", + "secret": "1f6ac2fb2540969789c1e435cbf10e32f537603beb33afb9cc2561e1612bd3f0", + "public": "03930f9ac4c718599a2bb6dfa60215ea9679d393a57e2f1d0c1df60dd813b0e320" + }, + { + "address": "2Amstf2g1ABsQwZARZdP1hsyuTF2To4Qb7E", + "bitcoin_address": "1CacLrak1vamNF7A5wrCd3aeF7428m4K94", + "secret": "d5500918f2cf90b27f68e476a7f542201f881f62ab571c1a56f92b3ef2bbde98", + "public": "02d5c5807716a26bd520189294ee1394f9e331b052904bb74529e11af87ed4725a" + }, + { + "address": "LZH9W2Au9PdRNYChRYhQQ1WygQR2m1Gv8E", + "bitcoin_address": "13o9AarSKqVfZLbchHM4mcNvFpcciwSAEj", + "secret": "8565e2c08db9f98f6dceb06f01b6234960005f049360f9ab778864b278f53935", + "public": "035c4e48eba28145bf0c949a21b2d6d8ef0bb34112a5f75341372af93aa23d749b" + }, + { + "address": "tCNwshNocxoMVaRprwjnbfSoBtNXYdZbva", + "bitcoin_address": "15c5Qbo1K7a2butk8Wj1JxJTjf4kCNmiDC", + "secret": "e5125d5a11dd0bd007cb96b665ce5a6924b3980d9707324961f3a5d98eb37fc3", + "public": "0203fa587df0939b087dcfa338bdf509674ae0b3b8c2554717c0f9bd0accf7c0b1" + }, + { + "address": "2KiyEu5BhXanjwmjASUNXS3d5fgk1ra2Dwj", + "bitcoin_address": "16oQq939N4SYtfddKdS3DnTnu23CY75f8C", + "secret": "556baa1dc55107be4cfe1c345350aa3d0d6c029b3b7e11287b06ef648ef799ab", + "public": "03003633353160cdf7887f5cd7a1631c28b52589d6349fe26105fc7831822dac1f" + }, + { + "address": "26PYDLjvhxjrKMaRnqrBoNtD523VdpsbsfA", + "bitcoin_address": "1DmP3H3fXJhMshZbGfwwXHopHEHRADHEMz", + "secret": "a14b726d7f34d630b51c2d668c9d4a309ef13caa9d29faa9b25fb1acea77971f", + "public": "024015911a99f20fd61a7c836ef8bfb8c036322e9555d4f87fbfec8a280f251b13" + }, + { + "address": "2PMnPZxbrtjJBj4HtWnbNEJXGqNVuzg7L6T", + "bitcoin_address": "1LWdEXe6agCocqtQ2tZiZhU1jAppkaC2iC", + "secret": "1e057bdc28c90b117348301d61b7788799fa48747633b3ef65f128db85bf5f94", + "public": "032c82d55599f47c022b7ec1f2d94a63a980f88ed47e07eac48bbf0ac0bde7c3b3" + }, + { + "address": "ngEoKTA5kLWYecYcHpLUSrP8Renp5xG3Vf", + "bitcoin_address": "12T28C9PY8Qj6kLxbZpbYDApawWsPSe2pQ", + "secret": "63e673ad8615535dfec17d8d4232df7ce645556517e3a7a9b77cc535b62755c8", + "public": "037ffe90571b19501cc7c0e7619b6ee64f00f2f5f9bffc54b82e9637506a5179c7" + }, + { + "address": "2XTu3GjDN1haGmdP15JiedULe17Yvou3PUA", + "bitcoin_address": "18bfV1XrFfV2dncNwRRWHQkuuPnm6orgNi", + "secret": "d0354da826bc9131d5c511bab8180df24445d4ecf3ac1d163c586a60ba691639", + "public": "03ae79c37f3806808c63ee7ccb22f82b2f43ac4da2081fd15c26c2361585415d11" + }, + { + "address": "Mi81U5WwUVeD8gvQUHk4uVwARQbW6GGdCN", + "bitcoin_address": "1Hqv4pdJUxYDM7beYUVqyXL55T6WRzJ2va", + "secret": "cf4559eb1ab7e0dc0e2589ae74744a6c6440acc1c47c1e20af6597839302cfd8", + "public": "03f39538cbdae0192c6e467950c14e8b78181ac80a4f4be7118b920a0419d4748e" + }, + { + "address": "JS6ktiN7Ms79KoTQWGzZ1M8VAtRcrERu2N", + "bitcoin_address": "1MM9fbgu3jw8u9sLsGrGnTBzAXjXaxuXK", + "secret": "753330d28ab5b9236fc9e3d2b0e289b61dd9f08f38f1326cb2adc79d10465d4e", + "public": "0369365644818b84383ec3f85eaaf5de68874b2f0993a2ca80e9fd5520a80f1142" + }, + { + "address": "2ZNsWDs1TacJQw5JxiRgVhUAcxThC6WHuJe", + "bitcoin_address": "1DrM4HbLG8qBnJRZHgb5JMkn19LSWuatMY", + "secret": "fe014fb4af0b644d30ca6cbf94dd56f9489cfe049e76ea7868f4ff77302934f4", + "public": "032efedffc122bff9baef556ea5925ecfa2c67c495cb19d981a1bdcaa44e74351e" + }, + { + "address": "LxgmkPM2f1HRcRrmzr9N3cEXugNmXsN8qH", + "bitcoin_address": "15XGC9QXs8Ay8BKJVeg5mp1pUZb785GwM4", + "secret": "a21b407ba7d8c319036912b3959a158be0f06aae3736502c8b6f9e45c3622239", + "public": "0370e1ef67eefb04dc4b36793e1d8dacef50f1956062a41e16aefd0df257ae0690" + }, + { + "address": "222JtJnk5pvmP8nbET1au9SZbomfzwUKFs5", + "bitcoin_address": "1LxKyuHLP1thF2aAdnQoJKbZsYhKHqV67", + "secret": "fd1d0d6acb0f13009f1cc4067456d8b3e2ef43b1cd7ca9a5dceb9b682a29d10a", + "public": "03e193aa4c3448f010c380254a79bf4ec7936b92acda213d33b46f684c52077237" + }, + { + "address": "24voKQR8GY8aWuDp6deB16Nq8ZQMo1eKpmB", + "bitcoin_address": "1APV3kVWXNQXEfs5qYXNDWTBqZfuqk2cmX", + "secret": "dc2d1c7680935541cd768d6a15304edbd709b2d8a6d2414d138292a707b17fbd", + "public": "03e75c1f8746e2d0c7001212b5a2f81b1703efc0bf9cb8f8b34fb10be810fd543b" + }, + { + "address": "vWtNWUB6gkdeCn5YUXbXArYNVfJLP4Cz87", + "bitcoin_address": "1NkfvnQpPYcMHnR5ZUYiJu8n5z2ewzWpzx", + "secret": "0fb2a5b69860ebb7b5b17dcc20d283aa5f45983cbe0cd4a9fc2972f3b17b90f1", + "public": "02977a6e8bd289782fe6bc933e212fa7f13c6e915b44f8de61bed4786dd16f8f3e" + }, + { + "address": "F7vSLH9cg77q973YtGaWc5iodkMBpHiJ3T", + "bitcoin_address": "1Bk9hptwMzhJ57mpLEhpaQ4agT7pc4GuPc", + "secret": "57ed144cbfe320f19d3a3ad3d5d3e7103aa2fb62586d42da71e7f987da14b648", + "public": "022187aaee0d76e40534cc89ec0b299bc9e80fbf3fc10bcc0c01fead840cf80eb2" + }, + { + "address": "FuTw7roSkr6CNsKqzpUyQJvMpUReBSFTUd", + "bitcoin_address": "13uKXvNw8JgPFbKz3Jjf4vgvqkp146mWdv", + "secret": "31ca978b4bd2bf895eee56004c56e7a3d21e8ebdafeb572bbbecb36e0e16a5c2", + "public": "029eb0564cc27d0a4a65c1942e446585105cd05dc22a96f19764cdc8b7d0228f9b" + }, + { + "address": "hFGCMRbvKs4m1zAV1RqEGcyAi5SpMCco5N", + "bitcoin_address": "1JKkFsthhBrD8qbLfCxD17pzm6apYfjnpN", + "secret": "68cdd1bbbf0b0b8774a6f45be72e0b561e6d30348d64dacec06b194e4c957365", + "public": "03d126e5cdea74eda90d02651be16a70d0580315e1617a70fe46531016a2c00cd4" + }, + { + "address": "6GPVFb8T8Y4iBd3bAmyojBiMM8RnPYgZKS", + "bitcoin_address": "1D7uivqjTigPpSCf5cqP54TUcsMy5Baqac", + "secret": "ccb1e0206867f641e3abd217c1e9811ae39ab55909a7711a04702e5603827655", + "public": "02fd2e9b6e7468dc351f32e6dda6ab83edaab1eb3d7e4acdc3d740677f106ff907" + }, + { + "address": "Ef8qDc2Q7Sz7J3eFnvd98SMEJCHmURdzS8", + "bitcoin_address": "15BUyj9KXrdUBhmor8M1Jouahjo2dSPeNa", + "secret": "3a09f2bf6b43df6c213a94214dc65a9ad30c651d09e008be435e66e46ed41c14", + "public": "03cba4c199f928595615b8dbec52e7b20f1a10b40735adbbf7b6f107cd12751308" + }, + { + "address": "2DHxwQdqxY8NvwXBnwX7xhzs9aGKsspDbX1", + "bitcoin_address": "18dY534PjwaJcVhP7vTvZMUj45K45uU9Kp", + "secret": "e8813cacbdddfa7e48271964fb91a63eea487ca3f462e64ef598d3b5748f13aa", + "public": "02f156980f66466742b818fbe5fc452f7557f9e51f51e188543b746e5496fce569" + }, + { + "address": "gecvozAwkyuw9r6eUn8Rg59Y8DcgYk2dFB", + "bitcoin_address": "1KEmWUGUHeepfKJMYHaEp9eVoMxBfEma1L", + "secret": "fa9f8353f6a67de64f4a7d2719bd0c53bc80d48d05c272d59c7c3bd45d458bba", + "public": "02afa8788e25f7be793cd8c9cb505f7613015f1c0a2de08649757ed5bdffefcb94" + }, + { + "address": "81eQpxzb3xiQs6C9R16rTKJKKcPjAYP8CS", + "bitcoin_address": "1DwHbtokpysZfTuNNEWfu4RwaAKnmdQb51", + "secret": "fb50e96115ca8e95e5def16d2ad10834dd2c5fc3fc5cf819d86cc47355bf9579", + "public": "02e5f672d5af83ce1aaab51e99a1225574598b27c922b4f1a3feca3c20cd6d3ee3" + }, + { + "address": "9RckSwNRZvVSWHRYTGW5TpYzWYAfa14CuW", + "bitcoin_address": "1F5n2TVzgY7r3zEs1EGQXBCUhjAyrP5YHe", + "secret": "c0c14f4b99871b6ab8da7d3e44e76f943481e7d313f7df492f15512c42fd9bfb", + "public": "02f57a28bc829e1fb9862d0a063f19b99d7a1acf93ee52b21ef838ca5cce45a822" + }, + { + "address": "kR5sYz4U3hpfvV9UpJoHpGe4b5dvSgxq8d", + "bitcoin_address": "1HLK1Q4rpKvEBrj1nQHGGMi3Wf4MzU36qr", + "secret": "9b8e0a6e8e1ab9f089049a33be70b0ba67f9204227e49fa7085cfb12b9ffff44", + "public": "0271bc6796ff472cc141b0afc0169efccc865786b0d3a607cbaf31dd45fe1262e8" + }, + { + "address": "Nxo31uJshFSDeQqKTrFBayX2Kp4CELgnbi", + "bitcoin_address": "1P5jwvXkTiJPZtNkc1RZ23GpfGi6oqzJjf", + "secret": "29e4fdb5b7725afb1db7035cef6d4ef29cd818c81e66981a58d597c5d4259758", + "public": "02e95df9d7dca346d3fbbfb4a5c71689ff2226200f41118f951a3cf8d4f5574f78" + }, + { + "address": "2A7CxHDjsapYNt6NHQjWVKvxrXCFccKi6a4", + "bitcoin_address": "1PKat1DHiUr5zKHUzSPi4tV5BpdGVhXzwU", + "secret": "2087742e97dd285b394d6b2f171009da8b0fb858bd4a0527a4e1fd8d04f922c3", + "public": "02a10f6ff9086e45bb2ffd96f56dcaf5adc8759da06fac9265cd116f6da6cb8d0c" + }, + { + "address": "MydhPQrxZubrT36DLVBvm4ww8jPgwXh3FR", + "bitcoin_address": "1PjwH9T9svAtRCDUjXSDNeKdJnTWdTaBzc", + "secret": "a7d1a0b8a57b64b6149903ebf0b6aec407c5d8a7f5a0765b0fb62807fefdd9ee", + "public": "02858feda2754c0e692228f459b4f5b563adfc1c0d231d32777c369bfd12025261" + }, + { + "address": "2RCHxBQrfCpWpDgHhQMx9CDdNXuRSdBvQW7", + "bitcoin_address": "1PDg2tmWBBCMm6n36r6hpCcN3PMtcrP7a8", + "secret": "9e59e8c9248db0067f382ec45f8b50fdb229b7d35145912cbda5a60652e4e2fe", + "public": "03ebf7323c9d07ae87639780e7fd2368dbb2a2be81fe2422a0a6caa3fe95af8070" + }, + { + "address": "2CibMMEZLdQNDNUkeGTxukCyP9ZQyKTdTwr", + "bitcoin_address": "13bM3bbp94E3pBYkV7R5AYNmYCdsLTkqCr", + "secret": "20ef1184fdf206000b3afe262bb8c7c1f7e47779c37e25b4aa8bc9ce1fcdd5ce", + "public": "0228a3cbbdbe7b3c06de4ba6a57b90f0a32353d967b1df3d2a735eea9985483531" + }, + { + "address": "2kS7peVSHev3CmmdN7DLaZtjEzvfvKkk5YD", + "bitcoin_address": "1J3f79F4tJNnooJC8KjQ5pX4yyS5sJEUFE", + "secret": "92bc9d6ddf02530375b614e6dd951c0ae3732ba6186cdbac6ec2f0c85f40136d", + "public": "025a3b72d6a01728ddb251dc64295c7ccc8ece2dd068054c694ff856db247cf232" + }, + { + "address": "21oC4NFV2TGUjrGcrvPwVKpzgFkKM97kmB8", + "bitcoin_address": "1PprELhnSQYmJWXynNtWenppyT3iTfBYys", + "secret": "e61d9affee3d90ba37ea488fc7afc55ab78dd71e8b1b93b04ff83226aa4b73ce", + "public": "035d082c055d9c298234e57ec9871914c996884b2014de1c0eba6f958bd1353077" + }, + { + "address": "8u6dLFZSABo5ALndKjJ5ScYpDFv9R9uZDG", + "bitcoin_address": "1chB1CbUvM32g7mEocM6ZFJoqgCVYoVro", + "secret": "aa14f51b05ab597628809bed7e01008280d702fa85dcd8d6a284bdd5d18a5402", + "public": "02c089c13a962d52e5c46a445c5b6b4beb86ba95fa56359465e2308821e92e1261" + }, + { + "address": "k5Tw2oc5wEF7msAycqGdG6f7dFmSg3Y1Zb", + "bitcoin_address": "1GVQCFuXpZo4ZFftNqf1SHy5JkzP5hy4rJ", + "secret": "a6134facf7ed270bc3bc2c69cc8883f8f63e9c937232bc4c0cf6cead6bcce999", + "public": "02a63bff81da219a749e513ac2971ddf06938ecf358c7a0d4ab4a2cd3498deed9a" + }, + { + "address": "JYXHANNbaSnXJhNsCxjytkA2F6rxE2KidV", + "bitcoin_address": "1KkRx9yCqMLyvZZkeh7u5djTwFDcQe9qti", + "secret": "19b88e4a1a08ca94d8b1a63ebb5cac5e3f862bfd33c246ce754db589e322e19f", + "public": "033ff55a1af67ae3b294be6a2d8995572681e3b71b95aa70aa2d26ace15d2fa165" + }, + { + "address": "2MiD5TDqRpKggn1kKrgrtpAUsYaREZrAcPg", + "bitcoin_address": "1J9m182cq3UjctTRB2S9BJQGgHuJBK5By6", + "secret": "14d82b366ef04a93bde3bce086256e54cbd55f597f9d9cdd9fcbfb17c7fc751e", + "public": "0352d8e915e865373d83be53fc117872ad560b7a82e2f5db84bb4785dfa7f2fc26" + }, + { + "address": "2hSv2av4dyyrsA7PWyt8Z6DfRgTxQCZV6KF", + "bitcoin_address": "1FVBUXmA8HKCU9iHoER6wiVfCiFQuKRnf8", + "secret": "0cd99b278bbd4b0c3de49d5ea72b853e45e22b699086efacd3989aca748be469", + "public": "02382bffabcbfd3b8511528b3e0a2a17a543c8739475fdfe750874f3e04f57e3a1" + }, + { + "address": "RMEbHrzzidye3H366c38zoT9sEHcxbsndj", + "bitcoin_address": "13ihL71oYvQkrdoeELwxKYQktJdGZpYvBm", + "secret": "4d8949fda234c91983c3fed2b20e2122136f027b415c53c3b28fd3a9401030e4", + "public": "03413090be4d221f8a0d6a14bd411c296569417d04efd2a6bb75459a6808380bda" + }, + { + "address": "Vu9f2FuXNzXHhVZqLPjDjyaNLvF3eirA5B", + "bitcoin_address": "1HqnW79qXt2cVNkgxe3RHAUwVVzTzDEWmV", + "secret": "d2de1f7c3105cbac90d122261c0fcfcc74cca0b0bfbfe9f334f753f3e36f9021", + "public": "039923f773cb3c12812c304aab95965c1a86c576d88508bc8ef97265568684c465" + }, + { + "address": "PvJvPdr2V2B4rRZosBo2x2tHmWefXdgQhr", + "bitcoin_address": "1DNoPQkZD6b6v6YfPspeh1q5Qfsfnx1LKn", + "secret": "2ac57beaa74675d799d24540f398b2f08672db637eda8cf024eea9e458af72cb", + "public": "02ded23068562062cccd51936e7fad88f7a202a55349f54c47cfc6f9be27a78309" + }, + { + "address": "2kaCFQ7x8rBJ6JttjYP4psf6ejKwADrH3Ed", + "bitcoin_address": "1Gf92v1mu99ZekTrEJrenQboyiwZRSFhS1", + "secret": "341b2bec8e242e758ccce37178a134a50b3a97821c9d8a78c5f7f7c8fa545b72", + "public": "020dd4d4be64e0e7305e59bb928340e27f8381c3659e0b4f5fb3b746882e8fc609" + }, + { + "address": "2AYJYq4zBgKb1ZtC5RCF4TdG2zbbEAnfNch", + "bitcoin_address": "161qa9NjorumPiCGGSQSBLMaWBiP48eC9T", + "secret": "1c304b592dcc3f935134a24eb57988bb8344a8c061d2f82c045868295c8be5a3", + "public": "0213136dc207e6b37ac9de79bd26598d2fa2ec25dd0f1fb4b9d41595b58502b348" + }, + { + "address": "GK9gno6miV6T9UTUswvc8pRdFf8NfNQLwN", + "bitcoin_address": "1EkiPMyTingDSW3XGM5rm4MhiJwk1pAwHd", + "secret": "fcc02916da58e734019b145f5850d1859905b9cdd48944de073f12d2115702b7", + "public": "02a97331c4f06faef53ba8936e0965516c6ef605724decfe69481443cf4fc2a755" + }, + { + "address": "iUkqHafpgjy6onWwQnvzdHnZDEe8rQXLdR", + "bitcoin_address": "1KfHyCtLjzGCEVtDLg7gojjYtydTtTS8GV", + "secret": "01f973071fd0188319092052ac43ffce7972283d98855265d3d82ea6a5c7cff9", + "public": "039a5cab52c9950588ac44cb5ac805d27aca17a6f7515f03f6d8b2ba5f6b12c93d" + }, + { + "address": "txb8qzZRZT1WRXrg84kQS93omLXhnTF8As", + "bitcoin_address": "1HZVMRcaywEst1LMKu2tSLk6XEDhwGopqf", + "secret": "bf709d3b0eed838ff3edf0838a585d48de69b9ce8bdf389bb7d657cdde26a132", + "public": "03a08d2ab339e68465101d9dfbfa2b83265902ff5326b11b7ce53ea7f419bcd6e1" + }, + { + "address": "wydSm3axBbXCtygk3LEoUC6TDYzrASvY5e", + "bitcoin_address": "13vTH7zTDffveAjoPKMpYewk8Br9DRHrMs", + "secret": "8f3691f710738866731a562873a18a11b17aefeb5981a1c528cf94fb2961c1aa", + "public": "0342b15f8b54187e0528d67455f4f13fee993d2ce6c3e0330a48e805cdd8ffe8fe" + }, + { + "address": "GrcRWScVaDgjfY3vfybHCh4NiE3satxdYm", + "bitcoin_address": "15Pj5Z6D5wrEMxtBZ8UXbgyxJqyefL9onZ", + "secret": "7e10f5ebf6a8ebf21e62c80ea90bf39c8c885b0b682d488dbe5b3146ae3df21e", + "public": "03be16c5650fd39e75e6344f1f94e56b8e2e32200cde1caea4a2d6a9d0b72260c8" + }, + { + "address": "2bWdKXnEMhTD1XUY2aMeiVS5bZkUHpYmMGH", + "bitcoin_address": "1LzXZuYvBLJxG9RYynHcPR52irXTCwzkUu", + "secret": "185c0f312da84fecb88764438b48185aad42c7236180dc1961cedf4ca3bcccef", + "public": "030436246f3aea56925db62803f8e30d620b744aeac79e494890e2ecaaf6699fae" + }, + { + "address": "2V2Zi5eW2Uizu8mqBoCgfM2wNEsuBUV75MA", + "bitcoin_address": "12jMWRykzfk4QYaRF5CquvdDcq9aytAL4p", + "secret": "21f8705279bc92569a2d0cc3be054f6a34da982c7d8046ba3f92a7165bdaad2b", + "public": "030a582da2554ca666e19603ab129046e69afc88b2e10a643a053f935fa1ac91f9" + }, + { + "address": "2eoMqcWAh4CZ6fr5VF1P7JWByp9ZZyXxoLt", + "bitcoin_address": "13cVvhfvziUEirvpkoKTvsfPboecqVc9Tk", + "secret": "596d3109aa4d63509bae68a6d23bfa9b31f5118823208fafaa93e37dfb388ecc", + "public": "0212d52f6325785a064fda843f18936f41ab825adaf9d013b0cf6beb792ef3ac3d" + }, + { + "address": "2UJfBnL4wU9YrrC6qadiNHysCXn5uYSgJag", + "bitcoin_address": "1KvR19QS32z877KCrAxrguvdYD7cDwVSYn", + "secret": "00e57b2fea94a45bb324b69c6efe451164dcff3f030197294e71c9e38abae3db", + "public": "031fdd5da24da4f04ad91c96c764caff0c9d5f61234446b2d4587c141e7741b754" + }, + { + "address": "Prd3few66cjZHCdB6za6G4v7fnPzeSD2iN", + "bitcoin_address": "1LBwq7TiFdwZRA4z8Zr2dQKGHeXSU5m2hS", + "secret": "efa8feb48f1da1eeff8a66b0e051127846b73aa22c5bed6966048b8e09a17f47", + "public": "03f6e0fc17b5b3efc249986380633183ae578edd267055e9cb4b5c753414acd523" + }, + { + "address": "bs2oWEVpaH8fi2YqaDZ4VpSgEAcpjrBuLH", + "bitcoin_address": "1JoEQg5rvaEPovAsSQAfdV2sbNfsn1xt9g", + "secret": "2376d1e38d7b79a5edc8db82291f7d23226ae0c9c8e541f8197e67bdef978660", + "public": "036a9e6eee4f778b184b8252ff0fa93e7054cf00e01cdba67907a3d04cf4812b27" + }, + { + "address": "jdXefcHXereUDbC6JyM9p6YKDMr48q2WPg", + "bitcoin_address": "1F9EbwL5acGLBsYdHM3Nzk7qoCf9wofCvk", + "secret": "92181da42717c4ef58029f272e56e497b15147268b0c9e3830d8a76ac8293a73", + "public": "025e49a895fdd528d99561d7864076d1067683e374fcdd2b550a8bededeab01337" + }, + { + "address": "5NxWC4oktPpNE1bHAPksR6WRBuKj1dgdgj", + "bitcoin_address": "1H4NJjNeEuPMwUzGsaTmLvbPSs9tk17pUX", + "secret": "3797eb0d846c2bfa231b21a88f68aaecddc3e4bb5f5c40b08e12a30ca5a9a8b8", + "public": "031ad96ab1dfbeeaca199c561a185165fb957dbc9ab615af157954319936759915" + }, + { + "address": "8MAM31HoWXZvDucv6K2qXDoTiVEDUoTZVo", + "bitcoin_address": "1LWHZUp1jpU31zPhrHiEZs4mQKsvkNVX6z", + "secret": "d8c3a2b3899f1a4564d12960caf8bd2e02135981224d1f1251209209a1a7c3eb", + "public": "02be30b3205f3dd43c5224c96fc73460ba227ce463dbe3accb9f8cdd5e36e05bbc" + }, + { + "address": "Mzymc2SJmEtizbeBctHtWvLwkejj88PG84", + "bitcoin_address": "1DoDEzkV4MnhEG9i4wnUBHVR4hVUHZRJhM", + "secret": "5450122d57559c9524eb51445add43f6fdb9b5b3ef514daedbbb2409380f8091", + "public": "02a630725197056ad33d7d65e93ef00353de3b8516732ad3bf01b227457d4e2d33" + }, + { + "address": "pg3L2zkpFxWvZoFFrqJB6rpbLCc6AGzuRb", + "bitcoin_address": "1GDCWw84UX9Hsmzme3gz3Q3WHVXmNwLzJK", + "secret": "e43543544e2c5587a10cb0ac69cdb99a46f31cb8fcedf0d1aba4bef755175915", + "public": "035b250809634ca72f8ff5951c8b33b26665aa4d62e367befcee476d654c2db75b" + }, + { + "address": "2ND4LcwLPgoVf9h3mWCwNzRoMKRWiNtDaVb", + "bitcoin_address": "1DV5dZn7B7XoHeLoiC7Vg95KmkqhArsJZe", + "secret": "e8338cb5e4f5008d4c2a133a5f2c5daef0b9ad807b1edca149a3ce48302cd4e6", + "public": "028f8a7bed139ce4a708872273115dee124e9187936318afce6614aaeb68efe348" + }, + { + "address": "JbxjtGo3m6fb9NHD1PXdXiePmjQoCxYGcJ", + "bitcoin_address": "1ERh7uToWS85GwcdtTovGE5tCNJH1XQJ8N", + "secret": "4e8ca2101270bdf9d18826f5b4cb19d2dad0aff9e848583d4574ca4442e6c721", + "public": "03b1b4eb17becc25c2299489bf28db1bff7d4cd282128591ba6c849d2e76c7ded1" + }, + { + "address": "2Lu6tTQ72MKV9wquyaXFja6XU9vLFScmUiF", + "bitcoin_address": "1KmGV9q2m7DbtBBWyGAh8yhMqeraTtwMvX", + "secret": "e5dbfadb988d7117ff6ffe71064f6b0af0f689a7a30a605444f45a22dd998d43", + "public": "03b6764c3cf877df3cd6cc04813061985ca1fab72eeb0fdac8020d491a9b9cc8e6" + }, + { + "address": "Bk9aopdh4aVS9DXFVteEfnvK6B1G5ZQ6yF", + "bitcoin_address": "1FCGBsM2mXjAuqWa2ZeeTv9SyUgj8Xxn5A", + "secret": "3fb44c013e9119aae6de00c4d31911a9e3c8a8f7574d6087c16e97161b8d4fd7", + "public": "03679e922161ee237706bfb3b5d08b0ff3cd83cfb91b62687ce400e917115e84a3" + }, + { + "address": "pPHJkUrsgLHLrTW3W6A8MgdrYTCyb6uipf", + "bitcoin_address": "17hU74TQvmkT8X9zUigAxgwesRUUr9bWyU", + "secret": "e5efc89a01ff944f078aaa553ce1fd81774c5a0b8f74f39c49404cdb69bb3e41", + "public": "035b2e1d01c7dd09eabc905b3c274365abed2a5439b2dee9754bb1d3d760aaef48" + }, + { + "address": "2euWrr8eWQUwofQ84zQfpStygyUdLBmHG6T", + "bitcoin_address": "1MjvAWnD6u6j8pMFDFepUbew7wtUDsaiaL", + "secret": "8985df67d23fe2ed3ba1a487d9f4e6677752497c7690ef1d6b97242bba7e218d", + "public": "03092935e59628015a627db9dc3816d2b6323fc1b383d7b6c1bf0e7ffaebb7ff78" + }, + { + "address": "2JbV1HpUFaQNxBGGzXvmgKgsMRtRLiuu4iW", + "bitcoin_address": "1AV8iHBG3xAMxdzAeAY1q7jUXX3Vq9cG5f", + "secret": "403c5105e61a06dae3846df4bb9cb015c7073137fe8c5b69633ab5fafb2f50d2", + "public": "021bf36446a0583323f37b4ccf6c3a1f7eeb9c5b16dc164a9222ce1bf58e9765d8" + }, + { + "address": "nkSd3RskDcX1UVrbi7McpTWjDDHTatAFuC", + "bitcoin_address": "1DezgRSv7e5hC5EiLsoqogVHH5vLH5LJ6J", + "secret": "936535f0861ab8774e63a0da8910311215ee5b868d2b0fb7c63e9a6bd52556f3", + "public": "039b7b5687043d02634c7a37bdc49763da72ab6dd94e0e4bb9a57f46572d1c2c5f" + }, + { + "address": "2Tsgim6KU6LQmfdvhdWMFBQmLtYU8HhJ6h2", + "bitcoin_address": "1NgCLTVpCCYtZnbZNQrRim2QWRxfpF5Ngh", + "secret": "9e4dd2b272096951ef4776cdc7f176629c4fcdc964034847a482c3cc7de5eb02", + "public": "02a8e2ab0a854e1381b0632b0961633d541f31841512aae1089be8b8a89de1f96f" + }, + { + "address": "mF5CK5hbyT59F5mjS8Nmxhc8eqpu7ZoeiV", + "bitcoin_address": "1DdmshtDtWzk5cxu87wUudTq6WUB7emXWN", + "secret": "9f4424d21a2ae111217aadf776c9070f9e499beede5c0c6ab9d6a7e8f9e5a691", + "public": "03c3bb8a4676d5eb6d32c53c82c9b2bc6d37b8d98f414e67e59fc3ec4766e52b22" + }, + { + "address": "J5XUnSVpD5BoUQHPsJb1iHXBsmpZBnFoYV", + "bitcoin_address": "1JwM3L8aYjvhSaPnS5ozCR4iXSr83KhXas", + "secret": "c41cd6d22063a0f9d674e1c23f52f1842bed8938b17bf1f32db7d1ac70b10ac0", + "public": "02489d6562dacd0b39bd71d53c123dcb69b0edda93ee428554a904bfab2d77bed2" + }, + { + "address": "QJ9mJXCzFBRSL3xgVRSD9N2qJBZJfsMXDc", + "bitcoin_address": "1CLJufL8iKLKtvH6gqwahytqAFXbUB5hxP", + "secret": "7f399ba3f61828187c23d5649ca93a4dccff0170df1b98eace826bc10c44987a", + "public": "022a0380050debb4516116c052c6b6369da3f99d8e983227d1f1ab083a776c38f0" + }, + { + "address": "qeSQ75vnGJSdfBwHLdaxNbmmh4ubrnDAju", + "bitcoin_address": "12ydwQ9Yc1up4Mx4xTRg6VyaHmpacuvbUk", + "secret": "022965e0753ecc622455ce3e794efc10afd2969f588a5653cd14858a922de550", + "public": "02f3aba0f28b0c36eabf82777f7eac06b65da1b344b4d1564d66255fd9ecaabde1" + }, + { + "address": "DQBDX9kunUZc8EhaCDaTsWCsR8fQdMFqNJ", + "bitcoin_address": "1KQjDpybdHSGCLHkLS1xkkxT757ix1EDsS", + "secret": "34b344be4497e6969cbfae8e154d837c72c85f246bff54fa5a18eb16964b3479", + "public": "02e96f90e75ea904486562d31ec162cae8b75036a75d44888e55a2a062276c3c2b" + }, + { + "address": "2M8ffrt5gQ96ec8mid58y8dob4RpEQeKRtR", + "bitcoin_address": "12hYm8pxRdoEQHnShx6vmb8WhsCj61NoG8", + "secret": "d072f6a2b4f85461aef64cac0d2f63134ddec4b9891359295b9a155eae735c15", + "public": "02fd82ff7a4f209b35152da7dec8c55a6d715c3643ffe23e53cd701b7d665da62d" + }, + { + "address": "23q2Y6do8YQ5hLqgMWPLRJoGCgHCpnmFceJ", + "bitcoin_address": "1JpXoHLf5KMu9cYaPAJtKXGYua2EtQSB6q", + "secret": "ce494783eaea98c9c19083b79aef2f8fd4ff0e5ee27acc3ec3ab810706e7d8f3", + "public": "036226b6d29fc4db7410d7887be144b48ec7cf865bc2c8457417f2e5a4fe6c95e5" + }, + { + "address": "Mj8Az1NanWTB2bmQyyGjybYuVBvnRKjJvf", + "bitcoin_address": "19rSyepKBb21ajW5eVoZNE8NkA2yMzJCpZ", + "secret": "f75fd40219820fd2984e000c531e758cc5b8ae4fbc422f63ac3f8835b0eda06e", + "public": "0388fc76f02ccc90b86c240d880c9abf9a1a2299f7a59eb21f26f3d8d55bf5a6b9" + }, + { + "address": "2ZrbqGFYr8p9AHYrsGpMX81Svf3esHnv23w", + "bitcoin_address": "1MsAzwFLnP96RzuFn6pWhs2iWvmf2FHCJf", + "secret": "e84439ec6b8da8758f88e91f33fa37a47ff218098520c634e71fa21897720bf9", + "public": "03db7a56071a216deb554b5b3bba3966c531a63c4312a18504e2d0b5780303fca0" + }, + { + "address": "2buvFGVozbDCzRpadgLt8gYqwkYApVzWzXq", + "bitcoin_address": "12S6sxRtUjDRpqfSCYjpC5zSRpkQVJtPUF", + "secret": "648af6bb80e569e9e7d8155f81459d717fd7951362fde9ca5521cec0d7a8b44a", + "public": "021559a6f9630c7345bfa81feb9181624af8a21d831a49ecc9003a107619dd7cf0" + }, + { + "address": "rYd8g48TD4MQtPbKaCoZt8xzMNx1ppHqPd", + "bitcoin_address": "1D374ERwp5ZBmVwDoaBDpPdLLzVf9pC4i3", + "secret": "fa0a33e154a972151f7b7b371d5184b07ac8ddda8141e1d0b521003ddf05dd69", + "public": "03b12cef132a3b0d6fcf79acac849681f24478df506c778c34389b5a02c660778f" + }, + { + "address": "2LVoYHBtfPiXybV5D6DRq6X6qrQxbDB6wB4", + "bitcoin_address": "15QQHvxRG2TXLCQwxc31rYkhewCfZYqjuH", + "secret": "5a350017532d09953ed6e32bd8abb0f7a47268e0e4022cf15cbfadedf890518f", + "public": "03c7475b5097a89c68652a7aeabbec758aa18f102b2fc87289f993d694f0e89c80" + }, + { + "address": "nCGXsbdNQgf8HjjRDYzDouvFvQikmaZZVr", + "bitcoin_address": "15haBqYjhbzzunWKn5mqWXb9KBbUzZzB4z", + "secret": "f6579d55c6fc7525d283831af9360d8a20a7c856dbf92fb1c5a02c146f0413a9", + "public": "021780bf8d1862a81ea1a75a89a9576e0330d0b4d20a61e0817bf3b9f9d52a815a" + }, + { + "address": "9z44BB51AgYhr3Ljqb2zMWQrvLpbLYd27j", + "bitcoin_address": "1MJmn248oQEyzJ1HeokN15MnD9A6buoeZv", + "secret": "80530625c63b9b6c1dc510039f379a8b01b0d646fe569ea2ce35322a1894fdfe", + "public": "02765c54f55f261a24c164a2ece6662d0008eb3a9f3a379d19d2b624d431738a53" + }, + { + "address": "ZHmtrHfaxG8U7y7pjf9azLyUtvYuX15egH", + "bitcoin_address": "19dM7Ms3jtynRuuQAuMQyqyDpu24hUGdLG", + "secret": "14b437e7aee69001945c95d203c08f9d19dc8a8dde97c7133d296b883e58292c", + "public": "0394c3de2b6d85c29b7b066318a8bf83f9758474f595541d9154399a790d1a0299" + }, + { + "address": "bd1D8ZA24hn2nnXJFu8BVdCZ9k1TmMADoQ", + "bitcoin_address": "153HoAVZ4XZKsaXgNaQJX5yf7ZwjayS4tE", + "secret": "e32ec60d9815b47f4de798dec53ce29d706abd85838f6aed87bb9d251ef25114", + "public": "036c0a31bd777b096d09636c11892bcf197668cadd72d339a926a404fdb6e6c9d7" + }, + { + "address": "2g5eNKbSsUF2NXqGkPP9TuTa6YuiJTaPKgF", + "bitcoin_address": "16o3CutkcyBN28SdeC1jvQUERpAS161ssQ", + "secret": "12346069b478a1004cd81e9056a4d56c8e8dbce92cca698916e93e1609bd603f", + "public": "03861f1e168860ff59e647b1b64617bb08133815ffa56fe56a79d95f2a97654298" + }, + { + "address": "tDw9LMweotZST3PeEAneUJKM4qn2Ti8Pwz", + "bitcoin_address": "1pLinRCpwM58xZj1fE1sKEq9peKmJqQWV", + "secret": "a84d45ad2f527acbb1baa76fb15f252a4e5e79763a059232a412e585030446a8", + "public": "02300b36d580deb81b563d5430f1f91b930ec72838008a1f7304c466ffc70bec66" + }, + { + "address": "wHVfmjDbVKmfYntbXYARdPyDuUUoAAw6op", + "bitcoin_address": "1Be5tfn7SUzRm5nL3rLdnnhy3nZkza9fmZ", + "secret": "206f1e19e7b1b8c61fa20a1aef9863d3119f348c9b82d4f8fcae8de42525e6d9", + "public": "039a54db3c39cfc2fdd8a2386f9e98e55462c1f1a041432ee5fa87c1fa4f70efba" + }, + { + "address": "FgkCgYgEbc9rAuuNUdZgeUwCw3XrnGFX3s", + "bitcoin_address": "1Cr91twaYqkqZjLPLaKpoRmD6vuzPyx5aa", + "secret": "db7cde643d4847775836ec285af69de816f699048e64571cb911444e258cc40f", + "public": "028332c7267e536582c2308c166c5be90c1365fea194a4916bec575f19295259d3" + }, + { + "address": "2R9QoPRT5ucDMXQku5T3ZbHymPGkX6SNSgH", + "bitcoin_address": "129FLqYQcLpPoYk4s6uZDijYoi3Gyf3THP", + "secret": "9cb4301d96c544ce6f3c19071c5145b89b100ec8aef58bdf90c90aec054ce985", + "public": "03e9b2e1541e9559887ddc09f22f575de87db66b895eadce25cbb68bb243068b20" + }, + { + "address": "2n1NfYxcLwoH1jakovQ2sM4ShKH3Tcs4rWL", + "bitcoin_address": "15T8dviLFi2fT2ykHr4Rs2M7yqUSoUt616", + "secret": "7b031409b353b33f8921ede8a6b03c6b61a6b1a4fe81769c79751aa7b023ae3c", + "public": "03f024762d6f497aef1a1fb90deeb34da641b8a1a0470040a784fe85dae164a406" + }, + { + "address": "2E21TE2z5qCtTT9WwXNWD2jQBLeH7nGB6Kt", + "bitcoin_address": "15bM6dshvVUuRYMroNYMmYQ35ESG7EBuYJ", + "secret": "555190ea46cad100a23dc8261250dce85ae205d2848c81477ad0eec31d9070dc", + "public": "0252684dff78d0b15faadb0e0d4f3fdc9ac9f168b62721119bcba98609bded5caf" + }, + { + "address": "2gRYextJNcQE2TJUSCBxhcnEK1siAtH7mhU", + "bitcoin_address": "1MrZdkxS3THSV7zDth6irPd2D7eaweVDMq", + "secret": "fd895903859ca6a879f8a6214b67a4458a804965fcf85f893d04df4fcc1dbe30", + "public": "037b4075a8e23d4d14e5b2090fb78c0cb72737197f27ce1da81ccd1097cee99db4" + }, + { + "address": "2M2KmM33LeLGZ18e4G9CioqzSqaAsii44bE", + "bitcoin_address": "18eNEbAarg5cf9zHQzY6M7xxQixDqQAijC", + "secret": "2bd1ff5e663a33f3d36df0dce93148789ec358093ff3e335e88897027a639f81", + "public": "02e579ce75e735146329eb9b67c5af870fd95ab070bc18b80ce8a536c92db98189" + }, + { + "address": "zeUUj9uFNSgkW8VTHjR7AwhcfKsa7xDwMi", + "bitcoin_address": "1AEDsryXCrujTWmrqBwXqbi6F6MRSrYuD1", + "secret": "ed2b56c6babfc1a1a55f8d393f35b517993a61651b6380d938ab0dc322a00e66", + "public": "029306804e046440a614e43dca6854a37d194dd58867c2efbc109500a63b85a38f" + }, + { + "address": "2DdyebEM9mHwrX3jmcTvzgnmdBQYetyNWY3", + "bitcoin_address": "1Lg8yxqowZozNp3YEkf1vEdUfiwwtL9Pnp", + "secret": "4eb31d856d118fbf86e151a08615bd20248315f8ff9666e7470e5ded6423019e", + "public": "026812e3cfcfac2970a723e05c5c457ba99e2298b4ec06a5464e59064f29a10d95" + }, + { + "address": "WXAafhTwvot8bnNY1ekUDmad1b3xzW5KoB", + "bitcoin_address": "12tv3smHDLPpe3eMMKnBuJEYmB5ez3gos7", + "secret": "98690f96a8bcb814cdb88a6ca5c5bf260586a1919913a2af3e5bf47f4843cfc0", + "public": "03c1ef010a6891cb5f9a34302b52f6cf47e1859dfebbb0d8aec889ff93e95a27c8" + }, + { + "address": "5Qf7bQMDQgJSGMXPh6nNJdFHjbbPr6vyB3", + "bitcoin_address": "1HjZaZJBw1sT5xnnc3ejeht9PG1se1jzBy", + "secret": "87cac60697e5670624b0086a10e5a3a29b54fabcd302e8fb22e1f46a319c14b2", + "public": "020edf7e9ddb148abc5e22cca11b3eae82a28832d0069c0dd54d75f87105f1d2b1" + }, + { + "address": "SKVDSRbKdqMjhR2ciTEc8nr8zXNHAcrSfS", + "bitcoin_address": "13LmVbGZJU8oHQMMNFxHmR4gTW2zAxms3C", + "secret": "84f3f3b47fc67662ff7353d14f28c64d824b2e877d457fc749bc437e6bcd7058", + "public": "021e6d35f208aa9bb7d4c920c3b4d10eda891efd7f9af569e6e6bc624ec5c8f3f4" + }, + { + "address": "gowLNZDHBB9tNmEG6qz2NNwGkY1SouL1tm", + "bitcoin_address": "1A4RtbfEFU7pfwTBUkZHg77miS9x8otfjd", + "secret": "b25ece468580847a3857d3d694924060e1e385d8d6c85e98c1b495bdfd8cdcdd", + "public": "036a8d7baac3beadb20bf1b5b6e900c99f1a476b91e3ffdbd8ad6cbc2310055bb5" + }, + { + "address": "Fsh4tkUymVnqmGiAYC9wX48fw2fucNipFb", + "bitcoin_address": "1NfBep2LAJsLhpF9mNC5ncpD1NoDFnMr6Y", + "secret": "e3877a2e5b413ff58ac84a792cbdb604d38b960dd5e5ea978fafd0a60850f746", + "public": "025775cf3978b487bf7aa201683a82930a0c1e8a61d466936c07006f719bb7fdf5" + }, + { + "address": "2Ma9qXTpbJ9JmYuUhZU6y1nwXKzJwbE3i5B", + "bitcoin_address": "161yywi7o8hDJMCNc3yhfnQETLDbJMCp6b", + "secret": "6625fc71d334dd607a82f6cc4e73a260eb9ae5a08b31f323bd896714eb38c7a0", + "public": "03132099778fce50227afc5e41c65d9830ee2930bc789e242dc11f153dab5538dd" + }, + { + "address": "nsjzo4SXJK9AXaw8fSkossG7einZQxmjuj", + "bitcoin_address": "1AgigM9s8wHQk5HteSVXzorQshzwRsRuhi", + "secret": "5665f7c5048337a78dc75c98c591b31901ce7fc43a8ba5ebe7f45a5ab062d80f", + "public": "0263deef3218d427110f58d0d72a66d0deadfb2d9cca0aa2b2cd283ec805cf87ba" + }, + { + "address": "2ipWusQvA7UN552H7e1zY8pXb5h7z9cvwaj", + "bitcoin_address": "1HukHuxmTeayc1cxpzVU6CaYyBHymwtZxv", + "secret": "e0842dc4b26eb0d3f04ac0aa9abe86fd1bfa7202789543ff34fb08078457c419", + "public": "0252193f968bee3c45adb88c4881c0770b49440782a1ebc5095ef6c1453a3a039d" + }, + { + "address": "f1xfUvKjRCeBzvwdfCu399cebpX1vDFESV", + "bitcoin_address": "1PCjYexMWywyfNZjENNF27wAWJjKGsvUiz", + "secret": "f7b7138be61f2785e5d7dc9c4e987c1dabb7913c5c675d68cf0dbf6ea3511238", + "public": "0313f2f2a40cff2672943935a0b529624bd8be43d65de1eb076e983b2f0b60d36e" + }, + { + "address": "o3YhEi1J9QoEkk48YwCdhdSPTZVX3FJDGQ", + "bitcoin_address": "1CvYkysw2cMh7GLDXy1ViyBPMxSUYgQasj", + "secret": "2acfe55aaeccf96199403b04f37e350244b04875946bbacefc321f5514de675c", + "public": "02eded9af107b76a0339242ac409f01664979a8edf182760c393a2a67e9f78ed40" + }, + { + "address": "49SvQFsbWdBB5y7ijBYFcDJL59Aj5NckFY", + "bitcoin_address": "1GeyHm3neiW9sGgKUbxdEv2TZKEQpDPmjB", + "secret": "766221b7013f73b64fa328c2633456eb66fbc9dab7dabb17d3a87d1ed1fb1517", + "public": "03268b627d2d62a7541c7a376738a170c897316d93a07cfb3890414f010fb00db2" + }, + { + "address": "joV4SQMdpCUDUZftsKLd7NNLshkHxeysLY", + "bitcoin_address": "1DszKrPMFCUJAn7mA3uRZ1eL6v9JX6vLBJ", + "secret": "83fd7eaa0dfd5f7e7897994d162de93d91b09aff9b9b685133c3b3f372e00ced", + "public": "02afb8fbb2f77e29f3751a5e3c9be92b4a42e05955c7b58d5c09d878c233571460" + }, + { + "address": "SmSro39dpb6RCTSd3xAVpQcXtauUk2zzL4", + "bitcoin_address": "1BgnbCdKjtZoBPw5KNoA66XQPtyWVGgWZv", + "secret": "88c46c1b53ce49abc62814e5564496b3b0c1c3a51dad775191f8ddeec522f30f", + "public": "03cf3e3cb197c3746187b8a0f3550c8389e2a00af834dfcb81ef3eeb21c5143dd7" + }, + { + "address": "QQwrjn5k3khUgvHjPst6GVHn6F2AwNYs1p", + "bitcoin_address": "1DcU5co66DTLWsG6zeyppzbykzT9fwSETa", + "secret": "c82e491f70f9bbadc4bc518cc6d74eb9149b1a10e67529874dc9292339277d74", + "public": "027ab1776783179393527326b64836d737832cc5b9909cfd1219024e1e0fd0fdc3" + }, + { + "address": "JAgmiif855wDZgaC7U5wYg9dyuWi5nxPHr", + "bitcoin_address": "14rq7YtHxwkuGcUGAy79oxqmwzbxvp6yVV", + "secret": "25830dd91c4037776b390ee7f598aa8fe65847169437dd925e240883b1947b8d", + "public": "02b9f656a6ac504eac5f22cab1472e4760fd5064589ea36492dc6d7ba2753ee5e0" + }, + { + "address": "26MHnfJWUL4uNee9LjdAGLGa7HC4EpLH7S", + "bitcoin_address": "115LEiKBtH6xF47iL15L74yeqq1NcL4F2H", + "secret": "e70d55437795dda9fae07616b2eddc1f3ea6f3ab0f971e5f7091a225caf2fd88", + "public": "03440d9fd95ada18ac1076623f92f9e2fd7d2c4493c504bfb5faa2250aa7d50cdb" + }, + { + "address": "k4jTLy6nhFhpxXKogNAcbbhXeKYJXKqgA1", + "bitcoin_address": "1PNqiNy8fm6QbjkFgSTbm6Y9agQRqARGPR", + "secret": "fb3c20a167fa642a78d55347fa54d9e1d7e2a3a0f0b43534faa6d846b84516c8", + "public": "026648469e9a9f18ec527885fe8f2665acffa546979007758fe6ce2892f0a26e65" + }, + { + "address": "gMDDYLmdNigohzJbpH4pkZEVHGzdpJC9KR", + "bitcoin_address": "13z7H93SXZYaBYsAAocDg41S9CH2Eu4TmY", + "secret": "b06b09ff98110ed0e7b76ca84288d7a0a73693d0d1058310b46922873b276252", + "public": "0298bcde4659aafc2d6f55b394de41107c400ea786460e01595c1b0ce568d0f928" + }, + { + "address": "2QXKE1KgQvHLfrUuP7pK1xDo8BHsNNR5wu1", + "bitcoin_address": "14Nxg3rEXoZ1BszDGQdfpx1mg2Ut6djVNf", + "secret": "b476c0ede7587bb5d76532c984fa5a4d810aa4341990837ebdb70e9e4d4c2099", + "public": "0378972efc8ed0aff8fe5a9b530bd70b697150c45799567bb21fc24542802157e9" + }, + { + "address": "zRH1vs7WRARth893W7ZXL7dkp24JJEHLfm", + "bitcoin_address": "16uXSXWoyFLatboF1GLFoVBBmpz38GeWsm", + "secret": "137303696ccf1fe9c4a3167dcfdab890f10fd46861634c17b75203d1ed181bcb", + "public": "03b241d494fff26c5fc1a8f9c509284151794696e4bd5736184e42bda7a2d1ceb5" + }, + { + "address": "2bgEuW1vkDRfSvzVaHrsN2V7mahtMsopgJB", + "bitcoin_address": "195VfixRRfihsThi7eihStoUUj81z5xnry", + "secret": "7584cf68badbf5cf89950fa55e92d38ad678b320a2dd87baac186ed272e3fc73", + "public": "033697a7ff566de076c1f62e21964078876ff0bf00cb52c6b0ec28885a5703b4c6" + }, + { + "address": "S3M5uARXPFWon4dVxJbFt9oL5cPZDLGEzW", + "bitcoin_address": "15FjpDfSx6GpymbtTtf9zcV6sqoDxaSsXx", + "secret": "34b07e4545dc8d5681058630b94d16b76e302020a295fa72f1f3ea5f9e555ec2", + "public": "021f506a48039b0b9daf3857207c85213a2e6e9a86b9e7f19174835c0a7fc7ff3b" + }, + { + "address": "29LsJE9Rp9EfDjMCoFSwhsJPy1BvB9v7iaY", + "bitcoin_address": "1BaB7TxyPw5F4CexRrkJ3m5GFfCsYfMMSy", + "secret": "dc9574c4593e48481e7ed0e4178289f238f63cbeaf659d9d7d9e67a919b60ddb", + "public": "022922ad2cb0d3f22f0d7c8b990db9b1c98bbbdc5c172598da5c9b0cef6d8f3537" + }, + { + "address": "29gtaNw6Sh6Eza9CLNTR6AsLYP2s5RqxBcZ", + "bitcoin_address": "142XmpGMLZ3dy7J7x47657k2nwuQe71B9R", + "secret": "a76b65ce9b49e5ecd1952d117713097b3c8610bd6a024190fbee18e516e87d86", + "public": "03428a59615bb06d26ac224215f79b47b3b90aa677db112a2a80d8a9848722ec25" + }, + { + "address": "21iG54TP9jygdxhcdceUrk2Szvg3PRHteTc", + "bitcoin_address": "1Mxfh4sKD4wUZDcnmpJJRgaCyGd2EMCGFU", + "secret": "67c4ef1f760b5953ebb32055fd76d8c2bc2415c72ef8bfe1a8eb40647b199d7b", + "public": "0397a70380961422ea32c25a34b0cec7cc58fe7f62f9501177ece0b6acadc86c59" + }, + { + "address": "XEzXQfHKhQuMtgCHRRNWYZ7VTNCJUCy5Dr", + "bitcoin_address": "1qgKGTXCxzZXJ5L5vETAM6bQLHZkNBeBC", + "secret": "8b71c09585dcede6d668bf0020787ac50c9556714321c288b4e0eb8302864386", + "public": "03bbb9313b566fa2e5bb153af95992adb39d1f3a8f77ebe6d36cf1d9e874dec0fe" + }, + { + "address": "8safALsBasgBw5U52rryWk5vWa3XWmQfks", + "bitcoin_address": "16CjSNpoUpSBLby5ZymQF5sJRNNguSMyRM", + "secret": "ebb458a1777415e80574e94ba3fd381ecefd7871dd3f8e231ac97948d9d6af2e", + "public": "027841bd654f450121a3730982808e7526365f4ead99ed226cde64fbf460c9ef52" + }, + { + "address": "o5j27rParabrSJPUGGC26yX6pBqqNcDi7", + "bitcoin_address": "17hwMUoUxLf7STDYz6o1ShgFYWeWYuc2n8", + "secret": "5091e3ea0d50a88d12c2f331717f87b5289f26f12aab3145c017e59823617b9b", + "public": "024a2c3b28276e59db236ac1458c165a30f6e8fa8af411e663aa815d2f0e0f5a1e" + }, + { + "address": "26XbTkFX3sXem69GaSBHezQkmRzGJLJsdio", + "bitcoin_address": "1EKwBE29us2GZqHPvcjWGFFzc3PpjN8wXc", + "secret": "dbad683919d198390157accf51d1c246fa6282d0ab494aa418aeae9152219445", + "public": "03e4009cac3088edb22bfea5ad639016b64b36debb1f12475cf036c37ad4e5e69f" + }, + { + "address": "yuFUDW1RSa226gQKLG7d8GcCFxFVaSb3Zk", + "bitcoin_address": "1Q7K3xu8As2gVbuGNHKZ8Un7o9VUem2yVM", + "secret": "d2b5f0954912e055d0dd56cc3e921147c62942cb665b4d52e60530edb32d72d3", + "public": "03d12828f548687480d31b41dcc6c4e90b6abce46ddec55586a6e8acb7727157d4" + }, + { + "address": "2kmy4ccRfRCDcaFJw2G5WwikcoFCxTyFmTM", + "bitcoin_address": "1KGSerPu4DtbB5Zav8nMrFEiXbVQcKxpV1", + "secret": "4381f86b3987baf546fd72efa280b8dc6b0819fb463d8ae5d591ff5061b1c12e", + "public": "021b20bd44372c14999ddb5f777d7d16bb7c2df0123b210e1a8c7e56701accc848" + }, + { + "address": "2K5dB6rem74XYuajLLhmxk1Ym5ktyF2rHK6", + "bitcoin_address": "1Pm21axeLZRBT8uQS182bsf8kYLdojpnUs", + "secret": "d6aeac3755497bac024965298fa8e8c02766122c5e99af88091751a051a1a84f", + "public": "0243b5a4cb7d2a422e2ab703520fcafcad3a62c071a1e18e827cbdd16b982af1c7" + }, + { + "address": "DS89RK7MsmZErHe4vc4a3zqp7BCatZYYh1", + "bitcoin_address": "1DK32VGBSy5cTPs8STXEfVSxiJqk2pzMaR", + "secret": "198614c6bac55b6f1ff6561051c70cf4aea344587f637e526de39e9179d3a4da", + "public": "02c92b2f731386e94d4a43f965cc443c19e5da1b7915084ab4888cb8348944194d" + }, + { + "address": "ccuSWwS7Hvw7UdQgNaZGqeAXH4v3kCsoJi", + "bitcoin_address": "12r6HKbAis8vSdWpPjbfRbDiEYQ3PEWoMx", + "secret": "b1e8829213ff5231968cf5e7b9ff13cf83d945a7de3eb903eee46d857903f544", + "public": "0334c602e039256862c040ff3200bfd591fe65c5f10e0ec6fa8b173a03ab4b20c1" + }, + { + "address": "QxgofLYmG7Cyyqg9PPbcYWUE4Jf5r6JMmK", + "bitcoin_address": "1AeqiSCeKuxJ1Xj223HaUkHRfW5RcJEktj", + "secret": "9e617dceff8339cd34094b9ff8cf3ad9f66c702528b58391e94f7c9b775a2313", + "public": "02913bac8d16a9df9c8a94507a2d93d21d7bbeb5733e3f16a1a619c8d4649f610f" + }, + { + "address": "24BL6QMtEsank54gFDG6JfGbKkzcfmbYHvH", + "bitcoin_address": "1PbSUv5Hs2VhFgNVRLM88Da5LBzzKvuxbi", + "secret": "64dbde8e8125fc928c4805122ed1def7a968ac458d949d50e77b02a9b72ff16a", + "public": "029a30417b752a63570caf8b4caf3bbc9df6ace56320121f59d9f3f73ee5c66419" + }, + { + "address": "iNCaYPUY7iFwuNdKkBdF2QRbuJG2Z89T5T", + "bitcoin_address": "1Gz53uqH21wFkPcPKMTwzFyj5huDJZ4jiN", + "secret": "4532262c82d391663f96fb922d3eee86179deab0395f32e658c243dfc4b259f6", + "public": "03e9f19634daa5aea15533f097d2e65fee7e427a26f690530f8bdf8592e08563f8" + }, + { + "address": "B5PrWYoMX4X6xQy6vavi6aSB7niTTxBEUo", + "bitcoin_address": "1A4qMvu7RPJfSMmStdDzMXnL7kebxWw4v3", + "secret": "e43f066ecb51d8b88e92ec6bdc39b62482ef349353eea9daa6ba866f336d12dc", + "public": "03e36925d3826236e41efb6fa4c7efea1c84979cdcbb299707028fe8deb3344140" + }, + { + "address": "huYwnnc82FHNNdF6MomXUGE2aFu4Apo1eB", + "bitcoin_address": "1AhjjUUsFgSaECAEihA7BTQB8CZgUMt2Po", + "secret": "e835d2a47abf7865afaf03d7399e038ade3c79ed40ded121b3879010ea437ada", + "public": "0397c04c78b5f17306d04bdb8aa986808e2aa9f736376cba5246bc3c766a552f29" + }, + { + "address": "2Uidx5h6vU5ijGsigtrhtCymmXgkdScXu2A", + "bitcoin_address": "1LTpYytpSXDbCbv636cWCfoxZqoQf2PXPE", + "secret": "9c97a07295238b5e968fb6d256efc0298b2d86ad339f41a22aa99208e441462f", + "public": "0366fa3afaa882fe120c5461c7831818ad771eb4454ac1833be66e4409d68c1d5c" + }, + { + "address": "sssGhHuMTELS4afckMa5xCfFwUdoTpQogR", + "bitcoin_address": "17E58RAReDbJKsbnxsr2kLKQgBA9vJQzoU", + "secret": "b682db37d4e64798e7ffba455ecef95ee7134582f7ad72a4f077a4612dc71eff", + "public": "036b3043af63338f60227ecd8b810e122f6efae22fd83e579b7cfa75dffaca7638" + }, + { + "address": "23FmY9Rvb9WWDZnQegW9HcwPcSSWXJYy9rW", + "bitcoin_address": "1NRe9RuWymHPUGQ7jaYJvrVSZq7tQ6nUpc", + "secret": "92bbd9023b9bd5a1871b23a4ec30144b4a9403a27aacd207df2072096fc74a92", + "public": "02530c3e0158aeb99422c5c23114e494ccefbc6581b27e46b9c1163fe71973fbac" + }, + { + "address": "fqdRNStjfsNdmpK3DQK9WVTtSs2mph8Kwt", + "bitcoin_address": "1L2wQ8hqLcJcAHegs9PqFMqBjmJ3vfYRrY", + "secret": "66fb2e78682b560c4ae978c5ab294c8d7f6d710cdd5914b4d613aebd89d3572f", + "public": "022d6a236600e6672d9e4f7f10bde1b42f2950fcf21248c8f6488b95303539a3cc" + }, + { + "address": "ZJiG2CGoqtSx2GkuxFvoToLdcnVHHzDtHi", + "bitcoin_address": "1EFa8hURsQ2sjnLLgUmd9NG8xA2bi4HRsx", + "secret": "6d95dac69ac754af9e1afae5ca34aabdf9b810a108804c58723248fcf4f05466", + "public": "02092f669a4858e627bb5a371f629aa9de2db91e1ad7ba633d027b6354af8b6811" + }, + { + "address": "stC7w5uT6NxykyuDTr8wa5yXhHL1RQHHHC", + "bitcoin_address": "15PgLs8PkTMEDLkyFKJTuEGfoCARPauXJL", + "secret": "61073b41891fb56c71e5f7483e63807b6912763019630267c19ea9d9cfc93d84", + "public": "035c445fb99914723945b2c1e1b54b7ac35bed350284b0d93e5d492a41cc87d86d" + }, + { + "address": "BpWeZBhPNCYMpzBiKMcUNaR8qX4kdxdy3E", + "bitcoin_address": "1N4wxrJBVbihZVRHPdTn4HZTZdnApfBQe8", + "secret": "5ab3d7484566f08ff1be3c9c9dc74d001c5531fb5ecdf98f87bf4e36b6154153", + "public": "0229270ef80ce2340bdfffa6e4809fc43f9a033037f63a865acc69c12773b64054" + }, + { + "address": "2SMsFtscMGLu9Sx87HBebRG8naW4iLA2cZz", + "bitcoin_address": "16NNCoPkzPk4Zu6JYKFDuRfQm2jVcNZRb", + "secret": "1e528bd5632186db07cdef8449c1eedfae575ac4c56f0bf9440b4e6be28ccb27", + "public": "031b597d85b54343593060588e1c4d820a0295ca573cfb88b066be174b69a93a69" + }, + { + "address": "bnDptZijEK6av5LjjaywjhgkqyU3xRyadj", + "bitcoin_address": "1zPBiXQREiM4tBeD68Wo27P5mirQC9TFA", + "secret": "abaad2674b08b8869a3c66dd86a6197c3f0505cf07b1f20a8f9ae934ba2dbd1b", + "public": "027e4a5d95c683171da70094a3a12c2bdf9012745d509d1ee732e58c0045035a9a" + }, + { + "address": "wwW42DUNggV9cmupj1Qf6uHU5RmipL1dSC", + "bitcoin_address": "1M8cwbg14zgYZVtVV3rmTmKnLcFhH5XLvP", + "secret": "1b9a75bdcaf6b9b4d4f4994233126f28d63f56ed11d7067a69fabf946b313456", + "public": "02a842939d4a77bfcce9994708751b564ca29233672149b4d144da27586c98ecde" + }, + { + "address": "BnRkAyySwtJ3RU1AcqLfNBFUwi1wp4SoLP", + "bitcoin_address": "1Hvk35xWSF9JTTHLB2YbC6B2tbPwqTrMiD", + "secret": "9d3cbe92944aba5c8c0649161a398d3f8f458c269d760e9b625acce3a476ed8d", + "public": "025e1cd036ecbdbfb9123ff839f007ec0feb3cc66d1a82965ad373508079669031" + }, + { + "address": "jdgX9aogovnV3BLVg43MoRmSBXUKAaKwaT", + "bitcoin_address": "15LPviesNmW6pncYPrsrf176s8J7khQfMp", + "secret": "3291f3e77bcc03cb913fa0aaec62c75f43311037ee80c80df8d162969a8756ce", + "public": "02551abd2d1ba1bbd28d2e6016bc5e41a56d153313c762797c7b8749643134c4f1" + }, + { + "address": "ZG3RtZogdoEj2gUGkgZgyqD36EJnGaBKFL", + "bitcoin_address": "1JzxtGjJXVNzb9XasWvmezsdGGzHxEJ6AT", + "secret": "3dc50dea1948cac53baa20453eb4e457c545e7b6d07c07eab23952188bbe041d", + "public": "03a100b0493995563b865c1a58612843e9120dc6b0577f95b04e5839f0260d56c6" + }, + { + "address": "HvNoZMcknBtSHMGmkNAdviAqmiynJbkbEg", + "bitcoin_address": "1NjkpVs5ytZppotCHAQvLmXNWZgFozSGyn", + "secret": "6ba1222dddac6d0a5bf8a3539d01e4117e69b559287b0bf56afdd6055d927bc1", + "public": "035559216c7f0bfdd24b03208e5d77c82dffb7108570589b4c6e9172e982c9ca03" + }, + { + "address": "2R94sJXypsCnnhWauFb8XKtJrLfNJ6Jki7G", + "bitcoin_address": "147RiHEogaLqcQeJSTARXTrszpp4bUsSxW", + "secret": "4c8809559e07f860b56132a1cb6ab660db9bd15bee02991c93dcfcd9c453b7a4", + "public": "023c9af631584445b2a6c7c22353478db1ca9d546b7af5c7384e038dc6dc38085e" + }, + { + "address": "Bf3doov6qd9M9iTzw6ppuNSiv5FnsBnPFj", + "bitcoin_address": "1PLbP2ayEALT3GBmwxvNZQjgqMhyma3h9v", + "secret": "f513f76c64ddde08ddbbf2a38a39f864218d65ae23bf457a790ce5e1c5b37893", + "public": "0304b8ecf1a3aac1eaa6b67032047848389aa3feccdcc3cc6dd5ea661c85ee5f35" + }, + { + "address": "e6297wnTqHemj3UjUsHEcfkWgoYLY34ESP", + "bitcoin_address": "1LjhGZ2FkcSfu4kbxKFQxqKSQL1RQBGVhm", + "secret": "9d69dc4a3bec0c7c706356c6ecd1c7ac5162dca35a6aae6c9ed8df86885aae50", + "public": "0305c56afe0588c191b0dc1b0ce37df4dc8e71cf6e9e55fe68c18c094ed9dcbb5a" + }, + { + "address": "sFwqVVHrN7KHN41F8jU9g7kwYpAJkQ2YXf", + "bitcoin_address": "1Q1Xmt9EQ2XcfqqUSVxVzpgEBZPcY1VB5X", + "secret": "2fc60a5c19c707445faf08a76ef89f1d4d8ce0e6ab883711ba859851ceef19a1", + "public": "023e2ee53efc59e8516a65c36f5655d57b67ecf64afa4362235568d6fbdb9aa872" + }, + { + "address": "wTttDcbFvgPuniukJhxKV73XKxTGjLt7vA", + "bitcoin_address": "1QKuYtYvU5ix1dmmTBVbyEu9kVnXRAmUx2", + "secret": "545c0b9625e5b9c9929e267c4f10379447b7c5ee9fda6f6f6b3038ccd563266b", + "public": "0357953cc18907b20e5516dfe2fac4b35c33a778559fd21f2a7266defcc5b0b8c8" + }, + { + "address": "2SCgJ7nLb3To7LihhrKWfZLNoDr88k4pcEE", + "bitcoin_address": "1BAnskvjSc6CBVky2btvuGbvbuk1s3btmk", + "secret": "8f37ec0ae63e299a6ec5db7fe241dc30acc8bcb1f629d66326c7aa79f5263d6a", + "public": "03eba8479f757c91703601cafbb601db428be8f9acd9c6d2c05440fd42d87fbf2f" + }, + { + "address": "265SGFsQ5a65k16Mifui5R1GvtuDpnuN49Q", + "bitcoin_address": "15cRBi9h368vqLJ3eDBXhYzRbtREWbpiZa", + "secret": "c98ec995d808922549bcbc5217c826bd3e0369754dd09396bbda8c5a7be6b1d2", + "public": "02cd1a00f584cab9c9fcddbc21ee8ce269d055ce230085a6318922335c00f0fabd" + }, + { + "address": "WJcJburNm8edTpbPVMNqnTuWFWWGRFUhTL", + "bitcoin_address": "17BP9z71cB2tu7YorM3YFTHmarFoePUmyi", + "secret": "3d8e9968716ef2e8ecf5c260a78af235a76be4c35c33b7ef44c9612ad061252b", + "public": "03aeb0564afd126b603a47116caa9a6a9bdaae72f6b16b57c278c8850e77669e63" + }, + { + "address": "2ZVfdVcExE27kEsqXTHRvH4CWhtrgerytru", + "bitcoin_address": "1HqpJ62xf29V3ymnKmC2UPDsXdW434mwBM", + "secret": "017a418ec986559a235f235e40dc1a4847c6ab6c8379769ca1e3f53263608a1e", + "public": "03093f374e5184893941460723c082e6c03edb07a24481011dc4913045e1988f3c" + }, + { + "address": "rrzosBqV6qPrLcXmUi38E4JuT5HK9p5EZ2", + "bitcoin_address": "1FU3mw2GJ4uJQUfxucP3Yvi6ELaqtu7Day", + "secret": "2be9b2d68a22435750341c07bfca519a0282f6b8e8a89504cf327fc0361d1794", + "public": "027ce626a4c6ed8ec8442d196c2779eefd48a1dbf14136cb4a2f1fe203d1a5488d" + }, + { + "address": "CAh4fftzSytRiuoD1mhKPr2odx1we74S9M", + "bitcoin_address": "1BEYmk7pB5ZXH3r1ErYo1YkVoqqWxBmSLv", + "secret": "7d86a42ac216a345c761f28412c606c3ddc518021c44ed5d9316469260eceb77", + "public": "02369a7e1b3527c29616f6b9cd7a9264ebe7c4fca5cec9249ec9c2fbdbaa79fca4" + }, + { + "address": "hT9MrhFKQ3st4LaCSpiLYMvHhKDjHsWhdM", + "bitcoin_address": "1Fdy4W5JoLq6uGp4jwpoDedCzetnBRvV2i", + "secret": "88e7e0a3b6709d657b686c3b44c7c94560f4287752206a80c819d18672042bbb", + "public": "02b1fe72058c93ef78e3a0d766a577d0483b34fb8e1310ebdfef3072373ee380d6" + }, + { + "address": "24U2xuWF4Sy7H54J84cTwMe19tZpJGFpYv6", + "bitcoin_address": "1EVZSvFYKmc1VLNnuzKsFP51vAsG9vA8DA", + "secret": "f66c96e161c59ff504434ef31cba28cc01bae76f9782c0ddff2b7a2b3483b44c", + "public": "0369d6be394fe7eabb5340fb2703efb82b07d92fafaf46a66716ef3e158abba759" + }, + { + "address": "2GdfV6jEBBCq39A1TAuReBR6MGu68NfAzQv", + "bitcoin_address": "1Dnr2hPXDbWZ8mr5HAbLSyxV2sP3ikboCJ", + "secret": "ed97ecfd2dcffc1bf79853d1b659720afa9334b3e94650a4a7561580e97699c4", + "public": "02abb05b3015f33f2c30230978b680f1e8e9ea00d1ee067521cb54ec3a5320a712" + }, + { + "address": "G4W6UDwRi3n4s3erXq5viKHfD8Gt6Dv6Jc", + "bitcoin_address": "13ptfZFj4DbyrWgQhpczPCibD3eFhwo7E9", + "secret": "36240bebec42b7928104606f9f939eb155ba296e567b8c62dccec004ad603339", + "public": "038808ca90a168226c3083378e9d6a43e2637d0a3ed61ea1ffbdd5619a3b2ddb03" + }, + { + "address": "2EDc2WfM84fEXwahWNynu3iDXLZeJvzSunL", + "bitcoin_address": "1Ji8RkNdaMyqMpyzXPRpF5zxpHNVpZKqYb", + "secret": "c9604c86f8a949e0d186bc656d6d3625dd3e248416e408a5c2ab8b7f70835926", + "public": "02fb89b41148210016e8ab63bc4175b0d3e8c07784536435f1535c37db523b5f04" + }, + { + "address": "2f7WZfa6CMs8YBuBpha6U7H2eSj93ePBX5j", + "bitcoin_address": "16qhCVcs8XtVvQR4HfsFR1DA4RherVEDrw", + "secret": "e6de015f90b46bff63dc0977b3e9c48338865bba24a09ee7012696c4cc56662f", + "public": "03fec5fff6df86f8783056e7e7e0d0ce9d160a62394afdbd7f4e73e1ca7f2f1a0a" + }, + { + "address": "6CGm1DqHawvJrfQjt2UfABWo3bhkr8UJQD", + "bitcoin_address": "1HGXDfYnQ3zDUVoMVv2jjgEbdqq6dYvrws", + "secret": "8d5e6cfd6440a1ca8583c59cc1f0155bcc3d3aa5e9b084d2490603acabc0fb75", + "public": "02357f3dcb10b5630bd904259bb75137889c04123b509b77cb9dcc33b9de2e1a69" + }, + { + "address": "5yq6MtxX9tP9dfM3A8FKH9xLY9UpAcxm4D", + "bitcoin_address": "15cj6ifV89JLThqEEvMonS2RTrwj5EpK9W", + "secret": "fea98f69b33c8a708459a4c224c4fefa66a152a0e6a853b85585f7147c0e95e0", + "public": "035a2b87b8d9ae00d39606bd626ab395814e2e1ae1fde6add2dba581ca00dd6200" + }, + { + "address": "GMaMEgBcs5csC5XamNTYyniVTo5ngHD8k5", + "bitcoin_address": "1LbTUwmeyeUUWQ9vB1TFx4LkXJkoYm3LNX", + "secret": "0da55fb8a6846a8a34e3965fcf0a33d314050c160bc3b9537cab8a385776ba42", + "public": "020c3aed49b27d6c62d76f209fe5227a2d4fbfaec5d7eff7015c5cb2c6403c2ff5" + }, + { + "address": "VPHFDCFDchimwsVGtc2jmPtycJwDnbp5EU", + "bitcoin_address": "16gjKq5E9Ya7PBYoPxcoUM2mQXcZWMx2eK", + "secret": "c9dd55ca1018b0d8533ba318ed08f1af73f9b98eb919f4b6af4c360becd3658e", + "public": "02b0dd156151a6228dc4cd5cc1ec9642f3215b919d793efb9900266bc18937345f" + }, + { + "address": "L3qpTuDGH5wem8EWY82fUwo1oYzFctess4", + "bitcoin_address": "1PH24NepbV3FpdsmEZSiBjEVpxVoXu5y57", + "secret": "b1e2ffdae4f2aa3b20df169a5034bd20c5a939084ac1539efa33cf673dfd1534", + "public": "0251e2d2a31adbf37e00c3e0406a15c0f97ae718ac2f284013154bd82a5b8d16f0" + }, + { + "address": "2BKAxsB6REMxDhQt3Bg4bRjvQwgpzYrpHGD", + "bitcoin_address": "1CowmWiTRVKPo2DpTRnmBDhBhv7FbCPJH4", + "secret": "94c2ab6880546c63f83e5704041aa006cdcba445233cf0ef710dc774c917af83", + "public": "031fc9a3ed32e2ff9ddbf8d64c5de39ff74847812ffd5a426dd35f7eb8ac56fea6" + }, + { + "address": "h4UF9sekW8WJDERLXiSU6JiwBJPCFXCVQz", + "bitcoin_address": "1JhhgKQFK5vVkMitUp6UfT1itWZMVzCAYi", + "secret": "e256c250043f7d7f4a60421c378c734a1b956dcbc22ff828b57e09f68fda47a7", + "public": "02c942fe2db3ef7c37ae64a7943733ed40da2bf4c7f479a5b1210fb5e57aa722cb" + }, + { + "address": "2C3wT9Wf7xsE5BNEPSj8KUerpPiYSeM9PLo", + "bitcoin_address": "1Ef8eartba7apA1u29c23kdXNhG4jpCLaK", + "secret": "85023f5d7ae3a15a82548e7785f9287d0d39b1c59920d08cd8f2dd61a227df87", + "public": "02bb78ffb03ee30ff07ae445989b15108df51c1306d5d712358ff3a77356fc928f" + }, + { + "address": "MeUC8cndNSMJdT2P7THbb7TzhfZEYbQwTF", + "bitcoin_address": "1KjSBQfrLMwTQTdntWfWBYKJFVMyBWredh", + "secret": "abfad820eb18e0fb504bdd0dfadfd98be92ca215d738c1d4c21aae87ced8fe79", + "public": "02bd31ffc3fc02ddc9c6bcfd3dad9ad4b2d51965cf368f854d9dff66f33b27e87e" + }, + { + "address": "MW7nP3oRdP1rfN6kpBjwQZ8f3MWrGEpc3F", + "bitcoin_address": "1PwnTQLJyfsHnkS8iVR9rR9fywwX4pVsfE", + "secret": "77b3b0b050d0ceb25ef73cb3cd47c16afc954b1d87b57e0b7e7215f4a1150c0e", + "public": "030ce0bdf4ee5b7fb72a4dad6d047832d52ddd34ecd8d81f81645f989c8dba2107" + }, + { + "address": "xHtjPK1SPcKTKmA6Hd3ybsL6GwBD1xyxUb", + "bitcoin_address": "197ncnN2iNMbQPQzvvoNMuVbU4VEp4Mp35", + "secret": "2a609e0536a025e55366035efbf9e28c3283f15daf9b2273e43154466e7afcf2", + "public": "02ac89388615f2b53f6890a31fbd75b31c6c27d522214843364da96ab41fe70e9d" + }, + { + "address": "2EUCXDL1Pnr35Abe3BAmewZkNtJX2Hqc2Ro", + "bitcoin_address": "1MjHNMJhu3KYKcb9Cd4PoBVNELr8sp5vZp", + "secret": "ec3bfc75efdb69da3ef0f609ded06b9848e7c5ba69cc76b4ba8e0f2fc5fac011", + "public": "0385bba88e897783786e06b55e535f13057ae68ef6f57b14ceb70e9dc4e34e92f8" + }, + { + "address": "2icjs7U7LjPRWArUe4dfKWEyXPNMKYfNqbf", + "bitcoin_address": "18ZAuqtTkb3s1ngvVQJ2bMxaBQxKpEzDwh", + "secret": "81995ff5e709bed9cf86966f88cb8da6095831f7090bdd64382b5e539246b454", + "public": "022f1466e726b826363ba710ab7575000f41e71e0ee7994f1af7331246224d766b" + }, + { + "address": "RJXHk1XPZv3gyQfydsSLY5vb82USLdpUTh", + "bitcoin_address": "1M6tg9GSTuxRYsPfnU5hWSwAwuBxtvPiYd", + "secret": "a627d0c088ae6c6a004435f93be2019e9735930e4026d14fbe0fb0309039a198", + "public": "02f200888ad6d3f3547f012d72d264fcf780e124f04aaad4acdb2617bcd901566b" + }, + { + "address": "2L5QFAHBPcogj4tVPvviCGgoEgK4yF9UHqK", + "bitcoin_address": "1Bkfa3yRJNphqS4vbbUKYkitu4vCs55ZVq", + "secret": "1fba9300ae3acb7d9d02b6be35bc7cdfe3fac495d79ef4080d25656632a75035", + "public": "03723bea8eae042c976de6884d9b54c0aa19286db7ee4c6e9740064301f465bc32" + }, + { + "address": "xz8JrwJdYru4vwnNbpt1wrXRF2NH89Khst", + "bitcoin_address": "15nbXnh87ZWVhkKatWm3EeeH4wnysFG5pD", + "secret": "a785c36c66f28f4c19818cbc54faaef43e574b2d42f8df864dbce43e177cfaea", + "public": "02ae807160537347a4eba3a0761b53e2f9c464b47e526d6d4d48052e888f434e0a" + }, + { + "address": "2EyfYcC8rHjycyL1yQqCBS16BtCvA1cwYxY", + "bitcoin_address": "1KPLEgPBvdtjuUAfM2BHpkSWUvPcaQ9NmF", + "secret": "bb152d93f18912155551d152c10ddab0c6ce77adf9092545dc458dc34dfbb603", + "public": "022c3c113b27a7726a6ad38e198b827f94a0de62cd319db41743dd08a740ed6b45" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0000.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0000.golden new file mode 100644 index 00000000..b66c202d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0000.golden @@ -0,0 +1,185 @@ +{ + "seed": "aG9iYnkgZ3JhY2UgbHVtYmVyIGN1cnZlIGRvdWJsZSBzY29ycGlvbiByb3RhdGUgaW5zcGlyZSBzaGl2ZXIgYWRkcmVzcyB3ZWFwb24gZG9vcg==", + "keys": [ + { + "address": "cfb24jWcms9pZtvEx3UjUuLPdT6rbx6r9M", + "bitcoin_address": "1GJ3vu6ZiskrnP7korsBVEanxb6fpqDjat", + "secret": "6614f0956f4e08e07ec2d4c2767b9f7121449fc2269e2b22f1a549d63e9f719b", + "public": "03b79123b2a3100420b19cccbfc688aa39f510b8491b67bdd296a92a021a3d0d8e", + "signatures": [ + "9ba679ebbcf6ebe265512d46265bdad40df99b5cb44a34f28466143cbc5f152d0e522018b8f4298ecadc129a1b471b0fd62cb51ea9305d93e3b189dd2b08e06c00", + "cf17711343205a01e4f5a6eeb81d3dbb523858cfd97e11281cff9617bd70932067b11313cde8b21487cfad20f7cca5f24fd7f1687fd073094eb2becf2e2ce37a00", + "1b45f0df19184f9e6047d2e4ae89cf5cc4f929fbcaed499ee7b2fc57c14e973f74ba3813bd28ea910a3e3d94ebab060353d564bac41cafcdc415226e9b8574d901", + "6e65a200a5a02eb1298c37d82005ced3e844d7065271db5752d242b611fef8ef2e3d811bbe83eb872213ca64bb9008bf6fe7edb548fea97e85dad05b4766cd6e01", + "7c020637b7d0f1748ad9891091de7f05f9b024d9bf4a68044515426f65d57cc3091b52ea7f72a571fcdcf629eb006523f4e173f0ab9fef7d1a906fa2956ef5fc01", + "1ca1cb90743f5599b206227ed8ae620b6e501cbffe662369a447f9846277d70569be1ea604c2c4d3af99ff5b1e5c4da0068bfa412f58f9c505d4747acd04962f01", + "af95ec5a6976f1da014accbc98aaa62340a4efd5f42c21a2ba73a53cf388b19022874e03e56cd77e9410e39fc937da8e02c23de7e3889c731d652c0da9aae16500", + "d1154d77593d24227e95233ffdb2862145457b97d27b4216e56b6a81523c9a455e37a98694c465d86573f0a55d20397a25f089738475114c954fa746b0c5ca1100", + "7d8e327ba9d328bd124b43f3d472b2a2ec45d4dd44be4a6d2a1edac8cb019c98675bcaf76e531e06e2c6c96294e8fefb1fbd29640e528a2d7671b1091c0a55b200", + "352d7850e4425012640dd63540d7fe760c728b6057bdd5722c862d59337dfe7c47bfc33bf439465ec4f833f10ef658469933765be14963982f6c112402e26d6000" + ] + }, + { + "address": "nJUPS5CrLV2iBdMvdMzMiP7iA2dzumaWGc", + "bitcoin_address": "19oERjBzyoVEL3TTXgwGnNUJSchGgtUdbT", + "secret": "93876705c31fbf77f756c7a59616ebafe12b5ec6bf6f0c85014b918fd79d6df6", + "public": "03e0298390270c0b67c62cc35b493503ae2b3e02d2d2e7711e03beb2b6f481115d", + "signatures": [ + "d6c5510639c65b5c78f2964b0d42e1ffbef3101cbe51b23ee9bb9bd627020bda7fef7c1d291fdfd46ae66825e0d419a561be56bdb4e6585a6d65bf9b25d4206e00", + "789de29db7d31f0fd788a2cb161290abe58f48c2538ea620c1ea9f1a73d723bd3d75287ecc450bfd0c401ee43f67f45ef003d53dd85514f980e69d6be3fbe2dc00", + "57c4cec61bcfb07af8d934d28afd239caa988c5b99e12fe3b157010bbb4200882896fe9d1aee6b53ee0cb59ce34e3184b347613d22ffd18d34e5ee32b14f4a0200", + "01598d2f3248547c4438669dd9cd4ddd43528d71de8d91493fa65297a88b6c8d23c876f2ca5e0e2ce2d9106342faf4cc2a5d7e71e8c363244e5e0d0a1723f40700", + "721a84e14995fd84f3d2b65d45e79bd012e59e1cb4f0a801a67129739f7949c91634cc5fed042d573d552b9e5b1c9f043b77b23988e2b1ec60f37a61c1e469bb01", + "c557e15d55028b279f899a6aed370aec27a66e59f2d3cfff517696b64d74a5a05106fad5e5b795f45383c358f554c4bd97d93728fd0bf41940005a72f85dd72c01", + "54241216147f863da2d7e0ec30bb61365343c498847fe3a788568e343e42fab947368fcb8a879766e99a85bd7614c968bd517e5ff1975195a49f999767b43e0e00", + "85c2649489658ab69ee9936b616d98a38d6c639c73d6dbc4bd434e0cd079b605131521529b2dd6d50b1d45621b7974cac8e7c6f0ad836ef102df53f60a43d8f801", + "58462dde6faf9bcfe80e3aa81e3976a3c1a5fbd4d0090b925641a15c21bc6d6a26dc6ba374765e7c470ddee3892c01c310c19a2178cbfb7260692fd3e3e3b67e01", + "ce1d26440fd13d4a4501b6417b8823c8e447f507c7a198e351633081e05a91df5d7d4fe3632c11a7d69cd1a646a23bedda6e4cbad037189b145f97713436e90e01" + ] + }, + { + "address": "UxnG3PoFvKtRuLu5nyFdb6eu6pu1SZadkR", + "bitcoin_address": "1BhEgmvmCi6h4hZBwdinzsKUfLkis9kNNR", + "secret": "c1b8c857a2039d6249d3bd4e25d40b34c358e136869592d03c1e3ea85e2916a9", + "public": "037a13b47233d512e123c180984a67571c6b0ed10c012351842846a4eb33b26e37", + "signatures": [ + "d08141df6b5627105e2ad7444c6ac67031eae74fffb1ac993038ab38081b05841c591e997942501dea90332e0c8c1c8d8d1fc041cb0284819935adac9998066a00", + "73dd6d14687efe1ba1a03e8de150dbcf16e4c91f14eb626bb39b0fb64df9156836e3923a84d95d6aecec4afb71b406c71fb6145541787830c6ca8bd07b74017301", + "033beb311d4a6306303d3e7c7089f51b06e8bf7ea0f49c2450e26cf228d0cd347e4aec6143db99a87db6bc4f25c3ba72aff652b95d8f09fc8c2bde54624540ca00", + "d045036a4c717792cd1b76d2b54218cbb2d0c3347cde1b685635ddf76fd310dd4ce356e1c97e25cb304f3850c751fbdae646f4c028c68bbef0ee0dcf5fb0ce6801", + "96ecb1fe556f543e6abdd72255f8b844e7574afb928617fa7f347030d17bbf8c745484dac51073ed18a9a1287844fa22d5b46ad5acbd67096d857da1b303e14801", + "3bbb6961256e153fba0c749b1cd73bc5d5aef993e37c28111a3f10218af4a8625d263224b43193c00d0b383c0dfd6ed5017cb764f0be76b744d0e01d1df8e66601", + "ea391ffb47c13a48f74a70b96490f7b0f7eefbe4222d55f7bfe004b1b04b983a56a465da3e033df40a3b51e63becdaddcdd38bdabcdc33b249a30a13689e5aca01", + "0bd57e44ab89c2c677eb0c491b6ed609c85018f0e875a7e1300d4699d60529e875e7850562e96fb90c897f316e5fd56d54170b3cd6320be2ce3eb5362d03cd3800", + "b27bb5e4a094442b30b7d55ba2c4996cce6e454f79c88c339ef89bb754c2b2ca561086e3ed647881fc4f6079831076d413ef027f942643a5e939ca41e583037401", + "26faa7a87708f5d27731e866ca1cce8864a4fb2e258eeb16de8bbf86c1fc4429736f07693a5e42f0bab79c696024ade370fd7374c93cc8b692bd56fb7093295600" + ] + }, + { + "address": "SZRDLCVHyoP7Xo5FEnEw7ckibmitbNx25V", + "bitcoin_address": "12H3horKLC9LrXsi76jnPXwSYZPMeevank", + "secret": "2ccb1679652e9bad28f3a316dd8d98ebfb5d8d72d679655365c4fd42e07089b1", + "public": "0284eefe3f4d6500fb563b69d52c7cfdf3152a3394321cfe1dc8d1de1e2868e3f2", + "signatures": [ + "392f6b36bf19de26894386049ae581aeb4f358296a02ea0666fa7a0c4732aa950d5b0410757644af454df89b1b6c6e8922676b21e095dc0fd094aee93e4be6a100", + "6eb48f725ed820f3001b88814a7ddbfc2dd60264612a29c2a6fe619dcd227fc3641873b78539dcb14fb74024e617b1e9c59ec71edd33f7292b5771a52bb6289d01", + "4b81f2caabe43a42915a7e19b34234f624f0dfa69353ccdc613874264bb5335003e6e04414ec7c84f4127f720b84772209ca59382fb4f38d102d312ecd4e64ac01", + "2428b1fd886fd31eea75246479dc120746ced1a4d97e633cea7a22ba67378f5636a09f06b6e9c66824efd5c761f1106b6aa15d4e0594c29239f4cb9dc1089bb800", + "627dde5f3179cfd4f1256018e59f17af2426a23d2131c4bc68d6cfb82b19a08f70e0ae7fe7d1029c71112272577c1db86086ed84ee5a7b17c112badcba0a601d00", + "8249b9da32a7f5c94035279ac4eb27f0e62cb50d230d1b30347d7cb0292dea8f2b662f54585a7bbd462858210010298abb3f7d1c16371d1221ff421a74a3744301", + "cd8c4985681c319ba9f7c797f5b9ba9c683776367dc4a90370ec09fcc8f6e0f07c7208db052e77ab6d595879e14423579eb2e2bc55ce04912e65f82601abbf6601", + "0aae569e4ceabbe5b8e1cec72ffc180fd9f93d5f17bc1b7df01e8951cb4c35a675f55a49ec380f8f33b561ff1647a063d4147808e94e2ae99dbcef97d2f1139d00", + "5b984636c673f60e7abe58c10a2e079f3e01da2fd8b41a239e6f596219dee2511ce4f0b35b1531ca8442137764980163509a3c05c219106c79a8e2f62b23d14701", + "9c6ff83bb5482a96c22eeef69246cede55105641018ef2d9cd40a265e45d402620403f555329262e20a5a0d053792ca7ddbdfc16d80552e4e0a8d6b83da86b9400" + ] + }, + { + "address": "2hSc4vmw59H1FEfsRUQ3eqvkceAAv6nanQE", + "bitcoin_address": "1NVMPk58vCB2342Z6rUoH9yKA21V8Cm2ez", + "secret": "867f5d21e6e2c3204b6c526ddd8a5d3b7fdaf8612f5bcb5423956a0d9eac9761", + "public": "02ddfd5d6c55293a925a7003bf23df040a91002f603c5db45c8605822f79caea01", + "signatures": [ + "e2255269e581bb78a86cd9b056d5089f03b77724401cfb900373571b5bce0c8069660bcdaaa99dc5df44214ffdf270d7e5065236867f20c2e692d2c4d7de0a4100", + "959d6ccae8bb8234634a5b15327a3e5ba03a15a6ac59341ed45f4e5767731bc358e2113667bf1fb15f15c0bde8b32d6aa83d4d9f91a8e479758373729641901401", + "cc8e9ec5f38f3d0a3ff71d507b9cd185ad7379448c2d33f4fc0944c4cf8d072f756e7cf1c38022375865105dbfaf5b7f71725e8c7a6491a1468db8ed93aa72df00", + "b82e4a33f0d9c4f6bdcf8a20acf103539bbd29d6e34dcbf15e396b980985f3a21d7903f83d6c61278d28de465f2a7ad2e8df1ae5db2bc823902bc63353e0937401", + "0783f3743f119b073a1ed59dea2641b5546fe585831597c655cb9841bc8ac16f656ac3ab9d16c57410bde691053675126c739cfc49694a3cf3030d776bb8def001", + "bfc6d5273d529ba5687a925e177740f33035a7677f366a3cb1660840954b417c0b9876d130231c1cffba939121d9ea12de9cecd88d6e84d5e9e061b4b443cab600", + "8edbbc3fa3c844abc1263b9ea429cde5df75524bb2acf2ffef42f65e4c1922b5676fa50b316ee8afec86fbcd116dd55218a44ceab2645d4bfb9e277822ea305a01", + "584242e0143eaa13dfb4736fab23f6a5e19848a3b625e59b9bf6c603789b00047371314b12fadc3b554437220c6af2ce6a406e694393d8e3da445496891d3ac800", + "d8fff1e095c12c899d7e993f5918e99164fa362d6262227d13f0e1f6ea40caa01fbab5f7b0252f306baa364a29e6824d4217bca7771b98e3114a6d9ddf72970000", + "6e4241e151308d5b33cd8256c7d614f804e668a61a16b4b7273f023c21d7e3006b41e1aff2703b4c8ce93da01484a70b6e9f09ebe09390f6f611db0694df44e700" + ] + }, + { + "address": "5vbcxd6wjxfVaa2rYqHXXYkW5cjFLmh8BS", + "bitcoin_address": "1DkRWzpE2mEeGujNTGqpTv5mpehpruwc1L", + "secret": "2bf3f42540a08a15ca280560e43efd112e843d4de930a2ad8de07b1befcf7231", + "public": "0243e58f57f152aceda76daef9332f9ef9f844e4ef5c1b15685359d0d0dfa07799", + "signatures": [ + "c562d6f8476717a027f1ab8c14f95e444f6a5c0eb789a640a56f58dc0339ced44a62e983abecb139a3a96ff2333a7561df23fa8b1705b8c06bc3b921a51afb4f00", + "4cc7e74e1f2e6136e1e122817f39f83faac6e9e022bd9d0361506a26b368ee28128d1ea7f0bbcb6971fda0caaed4e1e52a0270aeaeaf3daa0fd833ca1e17715201", + "88674e6524a76d0d2e1b8d07067b5342e890d9bf11091b0993b6a5cebc74f71e29dcbe6b0a41446e3d7079c1ba2a6a4df34a8a9cc9724c3dc887d40bd7f5f64401", + "488a99706031b162594963d5bbf78d426fb22dfef8491b32ff9b30a0dd18fb5f085021d97d2bebfb1132d86cfcf72e498a791e19811ff1b3985a499b059a1ebb00", + "438fec175b65eb9644fa9c88e4ebdd7d77c760822eef3bc0bc4ddbf7d04e5d5738928c1ba5e2a31cf006a21a4a888d1986043601a563fcea71afd4e7a46fc38c01", + "f7e70b4a33131be328f844d0011efaee24b63ae60c38f3e79d9cd29583f479d6125c20606de51cd56ad5bc047209f4abf0244335c8bd666306e318dfec5b11b200", + "c61983d341ea122a3001ad70a9e7bc009f564e57b0fb0b8af60e3d72f9326a6248cbad7faff8740da7b907fdc2bafbedd1593c9b83ceb418157232c8fa1802d001", + "afabaa96aa5543d5b7fee0b63c84a9a220c6de4fec3ca7a351b793aa417c28391455cbb90f298b873349f9abeff8fea461a6217a8e1694c69fba51a1d1b10c0500", + "faf1e87ae00172aa9832fa7aaf13297bda608165fc583623062d13360bcb4ab42d8ab9a9f202885030fafdf12c8c21f4bb2ff85a7855e8190b15f52dad3b122601", + "50392beddfed77190bc6c31746006ae525d6be392ebe65a71992711456491031238df2641834bd50cf119074b8f44cbbd5d44bbf8d939461d4d2d09cb022904101" + ] + }, + { + "address": "2ACC9xnasQo1uuJQiZwyxtLnCBxMACcZ5HA", + "bitcoin_address": "1CXd26Qi9HVppUWiuKeFnbMMWe2nsjJAPv", + "secret": "c2a0cef659813cf70809fb35804c0f6446524c039e4e14444c54f71d99888527", + "public": "0286b5204bdac7367a78f615f9cdfeb560fa36a7e2c9cd87d7193fb6dbd856a403", + "signatures": [ + "c77ab13d8107f4965708b75f24bdda7df11bb99b5cf0b8f7bdc8e071db62026b7179fb6256db5e36d926d8fc5227683e52277dea74b95f12c7eb6109049f813e01", + "958d52862b8f9c93bc63c3187a15e1f08e823aa0b4ce36b511668e7e082d05d976afc60b13012199bb5557f0d7726043f25e11434129f6bbc2ef665ad148492200", + "b9077e49d9f986de93cc360e5be3dbf8f30d91fc0f815752eaf0cbc64071000b16fbb965787a4a40eeaa8fd58d6f19e3ec49cdce059aad5f3674c4adaab72da901", + "3cbb3e9169b6116aef09e671e1f35cdbb7dc0fcea9e6f8152df98c371b3648491eaaf50a0cc6e672ed5e69f4255b9bff79532f8da101fa060d0b68ee0e86a86900", + "002895c8bd7a3537095f2e7670a909fd9502e25a6492278d2ae1b65a3f75642364dd31b5446c251174c57bccc5f40f9dfeffb959386a85b9473fabf1578be9f801", + "e3d5e49b8889cb5d655f4d4bdf16a2e3a35c88bc89f1a5c4a75aa82f93c8acc213770b1784c9bf5503f4ea127f4f928e36127d954b18cd3a5d75b1015966da1401", + "990c379fd3f47f08a6899f82f218ba9350e2a94fe046f9865b5ebef04dc734a808769bdfc057f45ea24ebc2a16363dd215c2656fee82792a34439c466a0c3fc201", + "60f194e854753e978e18455dfcd17ed6fc50dc9ecde80c9e78e9ba84238627a815f47b9a7633d6c0e963571a661c7e3896cd4fd26555df11b842466efa4de2ed00", + "12bc90a0c84c73c7b3331ac5106bc5b33202fd28428411721fb084bf5b57cd1517925c8f63265583c50ddafeed9c53c1817b1668a64480226161ec8aa43a73b101", + "ec850e2bc4ad3c96db1cb54cff954ed88566ed2046c806afb0f8218f92b66c9a2a51f2e948b36c5a0137781b82a401639e58301c790d2fad02c17de493bd9f7801" + ] + }, + { + "address": "kaVexneJnxkAbJMmmStgksNmJnZLC426Cm", + "bitcoin_address": "1FvmRnMsPnDJarJham71cgYy8PeBo7NkZo", + "secret": "af9e2a6f2298c2e47f1d77aa23707fdd2963fa83ec431bf48a8b9d15de8a790b", + "public": "029453f88f667c4f636d2461e03fdb8edd01376bf04c0f67ecdac93c38eb869f47", + "signatures": [ + "821915081c72f5b5c953d31cae7d74e65f4156aff94befb9fe18f3b6b4436102488d841a3112eeeb9cbaf1e07450fba1e76714983d5bb40cdbd4581c3a42a71700", + "2295b3fe78e5f199f8eff8648ddedb640dea47b46db10ee38a8942941ae1f70b25da39268774726427c3e77df81e338a91d1a1228053b417c33a9ea01e35854100", + "ebcb5e094ab5ff2c05ce9e6731d879379a59cde87168fda1c066cf8439bde9e53c463a4fecbc1e7eb72f65bd39ecfcc0e67f57dee9e866766e39ee3431e0337c01", + "afaec530e77e9e2906857324943441e574548873d1448348b4a754267d68217707bd6a5074ec510e6144f0dde0dfc8bdaf7e4e7dd58cdd83cae5454a7d0cac0f00", + "61f7f2667cec398d5f03b4d59abab20a7da2f9989efa068659f884bed748f49a449cc53a84a1d7ecb717902d4600c63cd2a4baeb16504563bf5b417157b43c5600", + "7ec0f56f2bb9cd8219ea83a4ac71477ce20061ac77889568f4e26633c68cd35b1cc2177e801eace67e7e11ec23c4d68a7fa324e6c32496cecbe0745eae3fbb3f00", + "25fc127004c1ea09e9f0b0c5bcb62ee8425b2a45484160ba0cdec8c3834ac2707963c59ff546e96f2912107cf0f808fdfc2c56562e19f9398ea37c888dcdfeeb00", + "9db1af6c0c87542eb3af726044951cf603faab78865862314283c48f608aa35846d660253b7d09f77a5b6873f3f77597e8f67f1cc02df53a7072da9cb7fe867a00", + "4c0308e93abf3ac49235e2d97b35f7ea80d18e7bd8da96cabc24c324e97705cd34094509727518ea807c20fc0b54b5d5ad0984d39c5c417b67db098563737d5701", + "6031dd2e342edf16e3d6de88a462a4bccab609efc48deb8c7f1d4d31de655c845e0513a38e2146043eaeb03f0bddd77d583e0ba55dd01379570f0c3116d2215d00" + ] + }, + { + "address": "JAiiQdrBFFSAgY2NxbU4PgKSzzycdjAJN9", + "bitcoin_address": "1BY1xYyAKLFRB6K9QRjToS6q7oY2bkrQV1", + "secret": "2e6a21b2b939aae41056675f2aa47fa9015ee2472864b0da10cb0b3ab81c7d83", + "public": "028022f636b47fd06b43abed097bd3c0fadf44689936cc5cef4e40291281964aae", + "signatures": [ + "ed6a323988302ae35f6bf4344d0feeaf6ca2cc98924c61d89d2baac4756f84af157c96fab9ccbf05ac1f3bbda3ab26c01bd0de2ea5d7516f1740f21990c0582700", + "816166e485e7a1fc98f013bcba8c86929b81d2b4ee98b116146bbfffc51405d61bd43d91a03969f08a062a74dee64eda518555a2f71ab2fe54606b11e010d23701", + "fa66344d7212ab12eefcdc2e30bead3eb015d9e328a09ee342a60fb50fdb1ab91db7ad1b0391a2c5e483435e177d2190dc9624212b02b9c4a8ebb6d8e23e5add00", + "92e6d0c388cc9bc4a2a42c7cf7d4eee0e9969ee2673d1b3f3cfa049cb069e361255f0e5e3fb1ad08eabadaf8338b990b9a3c03775e20499952144653c7d4c56701", + "491cd9ddb98909e25c019f93f75f42a3f3be73628ad5c822e619eb63d2bd47022d38afa0b1017529cc5afbcb8ffad74cdd216ba9dfd934b48b1d5a5f47f581da01", + "5407be85be4c256f186dd2b552c47d3a5a50bfb6bba489f9c3dfe3d95b7213372fb5a884beedd1ae250066ac2b264a5d60fd8520798ae0f990c1459bc3f79f6a00", + "35ab96ef9cf604e2ce83b7a2475700435426789bb56b2a4e3e39f2fbf84692f85b4501acb8129ff57f769a9ef1d5826509ff86474fd12e9882b204e956d7832b01", + "b4598b238badb2b0b06c6bc3f37ee59ad802cd45990646c1fc2ac157821ce159497fe4b0cb90dff620b1516952007b12af295aea98d3dae4d5b16820f17145a800", + "971802ee62ad7818279facc0c549f6a54da277b69d55e01fb02d557ce93788f32eddbed9fc62fcb68fe0429fa615369cb0fcf9dde3d5305477348acefd19e0cf01", + "4afc9fb67f058d08575ba3eea93fb6e6309cccca16e359197a6aa838c9be7c065138af45c012aca1f74914402b8c3d84f7094daf6300c9045db74e7ab1c3fa6701" + ] + }, + { + "address": "Z6XPgNGMRjR3dVjcm4A5CBqLS3aqVQcVaA", + "bitcoin_address": "1ExwcRbu3Z7B1Bh2kEJLqWR3UtSspxL3rr", + "secret": "0deaeda9c4f6391c54bb1ec5d16a31474b297f33d4e7af256286cea76e4fc40e", + "public": "024945c67ebb6749835872e06e9fe8d3f0fe13c154a5681764072daaebfc9f6c60", + "signatures": [ + "e8148d32e2bace9e7c8e6017e7229c3ce809ec88ceb83a01a2a2299fb87700576f79df74e7071e3216649de4653807a1c94193ac38f0d74d0abf25a6f8de750900", + "0ab4d582a506ccbfe351f54f676a97830fbc3efc24deb49f9410d8d80e0767e16fe6e0890c72b16774fc8aae801c698072e001b2d0c6ec2cb6637cc52517692900", + "1c6bf51244d387fae3b6409e5c42428c5a39db4178746298e29cf397b21335fb49deeb64ce486281fe6318f235213d016ef7142c7540fae3163a5de94f209ee600", + "f18778602f0cdef09fbc469c219e92c5bc52a5dcd7d873c2a4759d0938e503dc0d022341130004e45be1c7644d3ec3a338039d9c410352afce7e41dcb300728d01", + "2e0978dae226b1e70b46e88ab1fc2126fa1db334f022b0b960b3611e341b6986233ef8fc90a1a1ce28183b18a9ff5c701fbf340ddb4c45a88b1dfde74f7f39e101", + "3fe60797a43ffc78e26e55990e3eeea76e6e920e47ceb4a51a07ee22c2c0be1b7e51d098536a38537aa99d24af3c644db97337d51b65d13ccbd218b9839f179c01", + "ad77f584346779975e2fa12d3e7aaf0ea35b025298fde1f211488ed5b92d25343c86b4c2c0202748b80c2de9008fd043aa1d3f60262ec1f9f0f0e95dd4c2fa4800", + "27d66336014a5a93c5e2177ea72755fc0b858d7ab79a5976e38e5287549a6d0d0cee44bff45c3b7b89d6a1ea30cfda80c13f9a772d38bcd57c72f938db85afc101", + "9417eb0a9be763f5fb0ee8b189df8cf1a52657b87e545c28908802a7fa0c06442fd47c5ae49bd8fbc4e4985f82da6f86c2149e17fb903303420c7fe4d05a6b0500", + "421dbe10f4f49c005f3918511f9ff71ea6701ea76226cd1e6984329adbe4428745ce14e5768970e2e3fcd1408055b2f194f73cfff88aabd933bc8de4d607426f01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0001.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0001.golden new file mode 100644 index 00000000..44e07772 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0001.golden @@ -0,0 +1,185 @@ +{ + "seed": "d29yayBwcmlkZSB3YXJyaW9yIHRheGkga2ljayBhdGhsZXRlIGdvb2QgbWF6ZSBicmllZiBhZGRyZXNzIHNoaWZ0IGNyZWVr", + "keys": [ + { + "address": "2XDHP1JPEun347k6C559npPHT23V5GWeMkA", + "bitcoin_address": "16JRp1qD8WS2SV7wfRUTxAn3EmWSHveEaq", + "secret": "0e1e9ad1a0a6c688d9d04af22b2e07a13af293a05859ffb557c841daed509127", + "public": "02fbb044de5c57fae0a3e95ff02b9054ea82b54417a649088b76b4c340a38010ad", + "signatures": [ + "7d3283dcdfb1405890548d18839f6b7ecafe2087c5059e9d480e6161a79d6454213ca3da4653d39c269ecc909602f31fc7b3d6e7490d254baa166381281209be01", + "346269476c810294bf435f0567d1dbb397edef6e14e933215beb5cfbc07626c654e3012b5b56d218bb06ad9d384e19610824d80d618eb9c319ddfe206ba2655c01", + "1834af9a12d6a1f445441a23d320ab4f8a33b838c2055a3ba504c2e4b4e778fe5e2f7b1982f21129ed41eb20fa045f6bc0d248af77bf85830699826bf5b285d200", + "deee28aad8b2c995811b297d38ad4a27bbce26e7cd3a66e9ef69049a0336ccdb6a5d10c95b48cc561d1138b2eb21441bc83e7c02b7e759c8c270b17184d6f1e300", + "4b3657dff134d534749c5843eb3ddcccaa4f4c0cc7cc8d1916f002975dbc49d7731a595924b92d943a8c851f86ad78a017b35333302d51367b7029ab4750bcc301", + "5e045424c0cc976af4aed5c82418eb552b65f3daa5faed4ce7252e58edf6055c4ddde6b3769fbcde1daca74eb7681cc675cfbc2041d9b72094fd8dd0b87201fa01", + "9c5034280942f96a7dc805c436984a048a5f69b66c1dd1e8ebf07d9a34997a5f2f839a6bc4d6f17bf0f36fb3aab950dc9e5b62bee81bddabfc7d3aca80edf69b00", + "ffbda2b52e5f3e66b51feadecce7bfdad2fe28599233c5d458bad947f8760d11290a822629788ef521d39d7e0a7acb8b4bbfb7e69d3b45c88b98d594ba2bb84c00", + "0a21297c3a3b0ec4175428c78b656bfbae6864b4175fe02fa76cd9b353ca818a3ff3016c73ee471818f59d56112afbea170618e80eeb993d187bf7e4e608099f01", + "5edf4fb85781e57e15ac862da6bc40052edcb038a2716ddcbeaf99c6aa5e44037903672256d3d7959cc519fbfcbba47632f9c0648869844713e57dda74b87b9300" + ] + }, + { + "address": "Vqab1WiLJNvuijFgF1MMpvBxuq6sFUCA3T", + "bitcoin_address": "1667Prfv5W7PVYSpXEtSuv69eKmcw6drGL", + "secret": "2c7035ee76f97882a5c42f9876dd754babbf09acb0b78e05e7dcc51abfb41487", + "public": "03e775cae88d586b8df030ca149b93a71957a0a94c7e46c1d3a73b7f3c6488bea8", + "signatures": [ + "f33228d492945ea6ee40ca7b70161a9326f908f6153c2de82658047a0569f51f248cffb24033dbe9fffc6d7a9ec9745a3e52352ce3932a536fb6b4989506ee1101", + "e0509cdf76cd8a7dde14751190e8aa1272a04fe7635a51f454726e914c81e9a7744f189a3b62886bfbc33df0e5e56be6a16d555974955c124cea192cd0fed73000", + "7bb2e5b1162127af297a6cb76ab5979b1bef18bd309baa96e720aaf7188219ed58d0d520700c8415d4d5fbf75ad2d40960e63266d7db8a1c922940bb3770c46001", + "db6426d28e2345597df9aeb13b12a6921b4fcdd2c8017f33b98ad0a0062041072a1a270431d05a4af1a5f7e75eed79bbfe375682947e793011c31d4e1ac02bf800", + "01c403fd1157ebef2233dad324262fd6ccfcdb4a6537476acd9dff6490219fd214395056c03118f9543854822556667f1380bef6004b307683629ad0787c219a00", + "59eb6e47198963496cf86545e83375d5681031561de90e3e845d59317977a7aa4e70b08b87106f149139fce3514fbcf9d63d9da31a33c52a259b438050b86a7000", + "85e49ce059db04f9c567766831dad49aca85f1365d9a87e3b4cd3a948a42be82105b4d54cc47684c135b453e685b73e0472f42565d6f7d155937826cece3ff5000", + "f49bda680022309cb2480beaf3eb31dc88b6a17bb4f6afd00b75097ea8a17aee4594137fa0de216ae3e9b20846eee984e7cc4d5b68d9ea156ecef90bb371728400", + "93fe26c6153eb35fce04f0308ea84a36d4843f474c6afc4ab1ff8415b8274d1236f1d0b683b73b3098802d53e5ac2a0da06d9cd62de7cac8695e8d167baf15ab01", + "a65eaaceb3624a1e0ed73e5b04bd499b818e1636fa4f3145ba571e0d811a8ca42b8763f27a2a07b521fcb4c1f19e5e991127ca54692db641cfdf44d0bf39455600" + ] + }, + { + "address": "zAvpEnXXBKqLqUuqW4SXQKKpMSPRF78Pod", + "bitcoin_address": "156bKRXGD12qcSU8vdL3CRnYvXx5KDYJkP", + "secret": "ba66a37d7ef52c9145221b0b744afdc2a39922e512af4387fa6d109392929566", + "public": "02b2508601b986a275cde7ff449580639c8b78442ce0d87539110c5fbec4886f8e", + "signatures": [ + "8c2202d04ddc46d2fd066b440c263e00102a2c62efe4ad53bbbcfc7c119aa7a83130d56f7e7a117876a0d4285ba056ebfd2c66f8ae81272d9f0c39d0602a8cca00", + "50526c8372452645fb21a4f8b5a7cdeb4c937bc5d051beafd389911f6360514a4ec32e6d08c6227de99d7e03895385518dd5d4948b392935b7f8b69779ae1dae01", + "e4eb76d581d4f99b1904be74387ab7954b52bbd387e6f7c033083dd7024ca3c31952acb23da09ce66af2ccff81a2d59baf17cc454ad71d6bd4a109486fb4fdca01", + "84c8ec314681261c43bf9120544b9be17d2378d508ebb833a353c34216051f4d28c9713bad786d5a90b3a3b228467085dc05f4da092d6eba4c8643b0adb4e6d700", + "f46706a56fb07d67fd6cc2a4071af59863669acf2d7f1a9941f8b36bde42c47e767089a7e26eab64b5bc8a6e116044a9a5eb3eb1f2d0cb7d4f51f9e50a76ceb001", + "56e4b18df20901bfeae20cc9c9f45ad7a7a3c7d6d2506acf7571c04415308e00379fcc74cbef49823c51dad0c063f269596fa1ac434b8405cfb9d1b125b0a47500", + "0855cf0318fdc6d0c7f106630911171e7c51106e5e837df48fd117be59d92d5144d0ccba6a42791f48ba49f3388686176a2ade9f0a7d91a103b2add7ad3d682100", + "42c0522ac061f7d596462a20c5994201e1912ca4c0181ef7002570b0773181306038a5e0221b971f069599a1600d20cadaab5908d3944f885e1389b20ea16e0400", + "643bba11d65520ed42000e94d2da7800e7b595475606114d87b603c1af4276780d83db0cd39999ac96fa35cf9977ed5bc8352c2a94ea4629bb7d6ad733c73eb501", + "93b65ebc83179381e53c4010a7a63e95e2daa9ddefd4d05c342a6aa0a5891262764c21bd85cccca2a8f040a00b983836976540968e65f26ba62eaddf597d977801" + ] + }, + { + "address": "GykRXwXiz5kjHyBsrUkHRNToHWSKEEhkAd", + "bitcoin_address": "1GU13xJSdxU9xrm48UBqZ1xMrnJwAcSzCd", + "secret": "0c335f2076e58db76dde9a26dba8995028512180208c9ffc9c01928682814d91", + "public": "03a6963955bfa042116dbd4670361b989bcc0d841b96c0c402c83e7e1e23b64708", + "signatures": [ + "f9c115799f868fd84a1201021830966916a492e68a56592d5eb8dfbaad0d9c34564f420ab00996831f19db39bb94d81af763baad2d3e71f670f53e0e8003e1d301", + "a1ef2a9c00f6a4581105f586d735121f21f0236c48b1ad2d5466d392c53ad88f4bbe91493b909e48f6fa5a9ce5e7ebd93fc3c9a071bf2b760c6c771f04ed0b0601", + "394fee301cab788f7cc4af12f245a0b4765519cec1af7208409cabb06986add670f6c8641c4b40b7cd516d0283fe6c2ad872d953fb34fb9b554ac272268fb7a201", + "86493a09108cd772ed60f67ca2e5dad4c61d04e9dc24809247156400ca41e7ec31af35d01d71e24a3776673e7c825100678e9b7d060a7b5b5013160ac4f0a10e00", + "aefdfecc52c33f074351c497ffd2508d0bdb651f7b5745bdd98ae384c266f993336b6bd67d575d749db3c54bb2dad5d977958840309b954e3586e5b01fcb7b0701", + "3b032eb1fd883530a7d8f4fafd023f83da857f8c4381c1d0a055b8ffd1a3ad8b5554a1a295d188cca6ad6ab1ef9964610ea53d92cb868fc83b46a12206c70a8c01", + "e59f70fbfb3b23e75e290a0569f323ed6c82e721ba7b268b75b5833dbb3c739f4ee0d92593ccba21970fadae8904ce4e95e6edc6429377229b74f6bec34ec77201", + "b3936090c63f04f6a52720a102f1dc5ee26123758637b98e23c01dcee3d6f280266963e980439eb9bcdae68095fa5cb1d8bda02a1440be90a5e597f8c426bdb600", + "09cbc77d194f64d03a3ef27cc4716241f815e8b3b46e5ad4fa68277c5d8d1ecd72bdb8576be4e325fcbbc67aec516de0aead8f871ab9087ac53a39bf6f9db26601", + "704365c292a1d934d26956584bbe34ac0db54cf5b03ce3f9b1367805cd488ff830f0e2fe34727e8c7409fae6bd4878e10ae2b452fdf15c9a423afc79e653ea2801" + ] + }, + { + "address": "aZ9jLZm6MWpy6kF3kpjJTNo2eo4oLbeeXx", + "bitcoin_address": "1Age73SwxGVLvorS4Dbens1TeMn7GLtGvV", + "secret": "ecaef882b218b8e182f17883ed7462b4120064f26d5c7880a596e9f8bd0cff52", + "public": "0268e2cc53ec1d81dc64731495428a98db2331e9eab7ff899251931662ddd6c12b", + "signatures": [ + "b56be8c206b65c96cb8e0d174b289dc0f78d3d1657edf35eb2dbeae0260a89b96e7bd8847e206129348e0ab303f2a7f331d34fbe81d11b85aa02a6c0e9d3ee0200", + "b4bc4d5be6e24a0fb415c211f4420dc92729f0a1085126342d04fceead2ac7c1699542e02aef4e7a5b8426915a1a68beb1687669344256ac899e5332066a455201", + "4f037576467400a8b68bed9f47deac9956a1a6eb353677f10e21b5a424b2a0656efc0a949f9c0b125dc1c1208c80e708c5ab29eafdf97dd40f26172decd1726601", + "2365b10f2be2fdde0b7831bf3f9aa24fadcdf4713a6efb422a6790e353dd71c74d813e137da07a6f9e1ca515b10abfc316ba280eea0eb8d1645fbaba20c2e81800", + "cadf2560137316bb8827417e8ee322644cad64c4c1ec9aac63967f4a5ac0ae7971f5260c83d792c044332f07da13a0d573c9905f588b607486ffb00755a94f2600", + "a16edacc86031c008d0b5cba9365ca9c39ae724d030fa288d11726adf59e7e3f4060155ffea336028d03ccd08393dc27b427121fb5b63fba892171aa0d00920601", + "e85d863e3e5b30e31ca57c511614f6a53794a48a16197d2a504f6b4347e8417f73b2d1367988d687568f8b413c4d3b854daac8df95a64c22153b76e7ac03123201", + "a98e2e0361339e11417f4d8d45585e8fb3a517735793b2c4dcb7d06838ef80fc06706b99f91dbfdc7568ef720d9915169e63003b435c2e2d03557c90baca319e01", + "f2b62c93fb7d36e0bb6152ea57b7eb158fb93984f12fc7eba7151a8a4ebfeec902f2c2205a910c79288063e3b73896429f162cc253360f50aabe4372d81badff00", + "3d99597f0d9f53dbd009640fde0e7c44ff567babeb4d5eb54b7f00f50c337bc92155b9342cd817fff6291d70e614681b3d890a1249debd89a6d3e14e6641e2fc00" + ] + }, + { + "address": "2mLzdkpXtaLWvFuVvzNgZFcQgBnd2Nz6wEh", + "bitcoin_address": "12jJsGatGBVCxWF16yXDZFSDGDtNgJbowy", + "secret": "d35734c6a9df59900f8fac59396a1e1e735eb0c43443bba39ff814c9f91abd4e", + "public": "0272b067783e0ae0660364318bf3b408b12c105f6f75ad6da46bd88131f8cee2fb", + "signatures": [ + "ab9ea96f4f3638fdf6b5166d7c971b7e5aa71c042704ffb4c21657ef29cad87e2ec2c8b1d220ac68f40efbc7f9236bfb28c02762d52bf1b5677a7063682cacf600", + "e16e160405c0b410d1037fc217b32e2fcf626a27a5f50ee003065a8059bd40757e18a5f1d469009458725b936ba581a99af1183838fe7b0b3931cab941814cfb01", + "80c491a4668da1a22eb4eae950c1456a07919286656e327c0b9190c7004922ad50bb59de0620ef381cf1c10515b2f31d2850650ee65d3cf60fe44276bc7ce04f01", + "3d3f547e2644e3b8c49dc5a54882100bdb499879017f51949cf4bb8ccba9591040b1036483de48b27aba1bb7f8d73ac90a96fe787dddd233ee5406d3d8fcb4f600", + "72ccf7ebdef8e297db0a7348ff83bf6149e50daa24a29e38dd2c5f0d8ddd689f58034fcf8eafe64eacaba243dda0bfcc498743521f569301c9b19f95ea71d9ca01", + "b7347269ce29185b3ac9bf94f623307108dde70145978005d09c396d0739682028a3bbf0460eb7c848f3fd1648af5e90611e42b49901c40aa22e4f73bec0290b01", + "3658c5490f32f423ccdd10fbdb2c5ce674424c8635c1236ed88a37732f253d6212656ed16c70fbb31e9980f27ebbd34400a424d2110baf67c348c167033c7a0400", + "a4111d9b5b8ab7bbca90adb0b4c93faa45fcb03b717a6f11ac485b64ab3b0da505e2b749d971c700eafafea370c9feb66a1385943515950291fb3253b255505300", + "34e8c561770c77c2aa14f6955a1f5acfb29b7fd9ae846bb537c50f02833a35d656a8146517cb3312577a751f8fa1d3a1d48377a9ae6f3fec5fff3806f335fe3900", + "ed91dc06187be3c4688ffb6da8fe16392daf976dcc965faa4dad753a46cf2da476db8956787d98cac6af62665be2f31a9556b76d1cf4684127f90502d9a4ffd301" + ] + }, + { + "address": "2QDx8n4AqA2Zg6BjHPbvKa6jjTqn8GuvDmN", + "bitcoin_address": "1C4smDFUp8LxWU9MeunsbZ249RcWaBwTcU", + "secret": "d65af2ad4afa373ec16c002605d384c6dacc8e6f5b803eef066626f518eee964", + "public": "034591c117b23c0125cc41e78d887fb64d3ca4f4ba6c14ba9e5a03380114096ccf", + "signatures": [ + "0b4418424dc07e0ef668f9363ca9e069946c8f5f2e0e733177fc37ef9e9a0b17626fbc899ced973cd2b2794b9980bfe8004c5bd5f9f8e7545fbcf3d45387844600", + "18889e1bc48c7ec850fedb15d991145607c097c061c78eb8a88b709b01b7a996479f55f3ed9e44c8e48551d56e2292011e5e2af8820bd48e43a0a572dfd2197801", + "45e65bd3a99910aa5cde9d482bfb5ce61b138b8d3f0269b7d892e5975bea8c9b7ac6b85541000f75f7eb0998161357fb7cc54fbaee11436fbaffe77ccd0f0b7201", + "ec56ea2c59898f2885313db13dc7386d7d7339968139190905c0c8f6c1b93dc868b03b12f19efa0de748beda1727c9e7d2ad5b5f7121a4d77c38e675c70fcd6600", + "893f74090ec8b968a3576e22280c946f75fb59b6bc8b32c1f5b74485f1d555ca050285b91ee0ed5a3d3e997a7c9c2f3e680092025065f5047631de41e8b7359400", + "018748f5470e0ba9560ac9b284265fd93a7e65284cbde89cb8bd17c7bb570cc94ba0084159d0046769f2172152e53652e29c176fec65f03d8f319c1187530d1600", + "8abe93c4ad0a2860274a38adf092dde1e49ca71501840d66f1b3f515e99ba6b05f231a7fae44eaf376030f1727a0bd60d7623573b85198e6a4d995b84d89c8bb01", + "7767f6d6810a2026620886014d9197e67f73bc091b6c1356eca1eac80300f0a6080d8dbeb24785d1a53ee87612d833001b7f0368ed9699c559c7443c3148a95700", + "9740dce7801a4845fa194ad13ceab4179441f2cd708797ef1c1720bec9039d1a7adfc34098b756dfee4b02356ff86160322afc29ee603ba4a8091108ff4c619501", + "e75ac790094525f7eff99f14d92e7ec035b0134442f1ef55c6ded7af74d42a6c6f689e9fcbf2d9b3de722f9e1415e5c7dce756946e8ae8174a0866c22b8d9a8f01" + ] + }, + { + "address": "nSXnnQA2aaLHdzg9LXgyoY1bkRYyoJcPNK", + "bitcoin_address": "1GJZ4QMY3gZJz7NHtT4w5xXGfpsX6aumtz", + "secret": "3a6d13f46da4a800ef8c2e350f48e53cb601efca9c1af27f0650065d9334583b", + "public": "03865c2b491360dfe2afe6e918261b9e909cd87e53b61afa3edf4fcf47bc4f9d51", + "signatures": [ + "1d9ff908a3bbd7416efc2a9ad50ef9a3b7db795857755c79ce0457360812116f516960d1c6f97d1d8d0ac3ea2975cf2f4ffa0d08b1d35224ae9799e91b04fc2a01", + "957ae4c1a90e1465564112a513597c3bd6c8a1e341f682b8a251a0c6272e9f562a0d3d81665425e7f710fc3d20a9f8a4a28b6badd63c92922b1933fda2d8376b00", + "d791eda6f4548bb24fe5f0b1eddae7db453156187a10538fcd837fc63dc189f40359ed7cadd04c6dc65946488149854e4cb5baed743ddfd1c49247e7305d9fcb01", + "7188ed823f256af8a430f9c6e56769c3455b093fc649bfe6e779a97219b9d3673dbd5748cc3bfb8097708f997baf7b901290ba0daef661369738a5f7794e72cb00", + "5b5bd1b9b1ac663480cc4f1652151aa0a27d456392dbd7fa5c1077f14c523d200b9c677b150e4a03f68c363c987495b05cc7dbc1498f9347dd7e7b1c598f1c0b00", + "1d9535097480035b32e949d5b678ab1bc0a40f998eab8f411d8917232ac58af0022d32d709431a693639926e36ef70dcbdba6841bf8a6edf007d4b2b339b02bd00", + "f99830f86e5f4c812104bc7f7d4b0f2dea4e1afc0cc338e93f378cd82f044d4f2647771d665af37c3b83fa4ad153516a120f6177cad4c6b151bb7fbe057432b801", + "d28e2d7aa2964f048b262c9bcbb9a462196d81ffd491b36700cf1ebdcbe51a6104a97beff3265896731d03e7f98239358c14235e2480d10665573e838b6e6db000", + "97ed4c87a77ef0bd231debfe414bf1335e74be8a1d56dfc5fe7d8f611246506f1e7c6aa6395f2a0e31547d71e766358ab048581678d83b2ee2362b3e52ef7c3c01", + "d6717596c6f62d6430c475a46f6ae0e062cd667c1bbbee66cb448daef72e6ef1093011f7e398488b280ac763f3b11b93b2d643380d1e0514dbaac2d6293271c700" + ] + }, + { + "address": "25qo9WDafW5bL8J1rrfDo3zAFFmUbWM545B", + "bitcoin_address": "1MRmjS9Bf96eY2PP4QoGoLBMhdTJvTU4rK", + "secret": "03a71adfe4f3a34087b6b0f303f0678b218b386c3d129a8366f9fd40e11c1050", + "public": "03d5b421cffd4fa34d0aa36716d7b5f34c78ec362f6b2396d1104c490ecce196d0", + "signatures": [ + "2aea2918de643baa9bec04ea49f9c3bb7858b09e7d0a2dfa8ac718367951ebfe6e3825f4a5aa08f3a8ce3ac1fd021aa8dbd68f2b05ed18746a53d70cdcadb26400", + "c0475aa5ee4dc3d3264703195a145beb28731516684194fee43c9538444079670f30eb13522ad7ef654deed6a7a6a818f38d79219bdf6138461d43d8ede9aef901", + "7ac1e3195f1ef8b99084f2d97250b8dba8cd55148807f8d3437406e252938f1d78d86fa5f9b6949942ef4579fdb0a8dcbbf3cc37cbcecf51605ec4aa2922cf2500", + "af2afcacc960b2d12395e1de8668a456eb2526b250e5942db785fdf3a0b055d56015c367ed6de7efd680eeddc1a8f789ae787eda887b23a7e4f6c2f7575f10b000", + "4b9ab114829349ba27e34152b51f9d3c83198673a354a949934399088508d3d014baac7e910c367627e37a1544bab8ce1661600be92c346463497e6965551a9000", + "7e5c5d8f8f27d2c1461b6653089e7727c7a0f630ebe5012d07d75979095658ae0b5c679b3daa5ae34a528993d6c9f60319668f36e583bf607782766adc7d9fc400", + "ccd7e23d4de2f095d77d08b6e34e134521c5aeab84c9ae78c427cbdb0f72c310261444cf20d21ab84ac2ee6472b8163204323b5108adc59c6c01e72fdab6eb8100", + "f7eb4299d5b9fdecc1ea7b366b1d82713322d15390c057953d6b42ac76d0bacb36d9f3c5568bf2f5c6372d4f0fbcd630588f3c27c2309e1da4e02a09d4d6ce4201", + "384b61a3719213b153ca45d788c34738860c6353d6d15751225ae3d6dc35bc192c0189edd24f96f95898a29164291c047a1d11099d397600820e171dd813b94201", + "9392c342570352667d1d6ed8c1a8438bd8caae455e9901194f788c4fc653e04f43d328453c9818c0a1b009767e36a630ef9453a51b4aab4de80581a78119212000" + ] + }, + { + "address": "2U9tv3pcptMson7aVDj7epyVhuJBQkSTA8W", + "bitcoin_address": "1Ph4F8ZUGQpUvQYedQaXrgJwtXX63yRo1Z", + "secret": "a7832a68c6f1ce353b341c78661ec2e39291a3d02676a7804c04eae2a638a68b", + "public": "035bbcfedafcabc3f0bd26f3af4e9046d01e96e6d596e751e2a3922815f586d70e", + "signatures": [ + "d0857d3237ec891c839269dafd3df42be1e8429765673bcde990d2e760f827b9189da08b0037bd8a0423bc541798925a4396b79688cf9e329cf42881aff93d1a00", + "bd143fbef42414fc7520308c6492dde2fe442b19deb2d2c8412626c0f07526292ad3bca282cda727915408e14da782d3bff8047eec4011363a8db4ad562cba5700", + "4893755c3b2c465c3a503465a0cfc7828169fcdd52139f042ce4799dc9d0a4003cb4e40c271de767fc8df0a6f93745a591fc2dc13f6b17a12c95473c1042857a00", + "62f03a6284039b98acac22c0d64447ffd65be2101b22d104eb098e4a065d995d157226a117a6d34a2e2a053dc199b41a6e23074a8a700554c76fa45ffa4a1b8b00", + "99d7cc90fb119c8b722c0582bc097b5bb260b0a871c9c05439dad466d1c970f112cb4311efe7753d44e91dc0162c3d2befca32848767fa642b50725e02e02b1501", + "de62021fa95a4c90a5cee0b902d03119bb801ef99a6c575577b32f432be9da047e8b2a7e32e9910116219bf1c41dfafddf38f99ddeedd01ed1bed9853779e7e800", + "dfed34d6c672783dd664ec8f4444467b1e15c2e3aaefb21804545fb47398c3d3728c86c27e1507d6b14bf3c5f952d7a308f0fb5e5cb947dd0971cf37440086c700", + "4d410ada413d3af780693aab75d8280da0d9af542875f8b71f50ee194cf9829a33e23686760fb9a07f3bb37af99b1c97709c124b15c0fa89ec3f9709a1439fe801", + "a5ddc28a3ee448ca1cf28ea8ac3991ce2f1fe562d52c8a7634d58871744253f2132e8bc1e7c13a370429eefa26c6956c19cb548d5e4e663e47dca12fedd16a2300", + "3da1a98584f6ed35cbf918d514fcd5074157d91b99d84ee1267b10d40fe0d34b42d552f8ea1d09b44de9e32fc2339d1d784046d834c790c471fcb9249d4030a500" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0002.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0002.golden new file mode 100644 index 00000000..ed299b7e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0002.golden @@ -0,0 +1,185 @@ +{ + "seed": "jvgFL+YrrDSJWjeXY3tJo3dek4BbeV+UzrMZ3yir9Sg=", + "keys": [ + { + "address": "JQCEabhVC6ZbsgxbmA5MHTzhifUbX2PUPR", + "bitcoin_address": "19LDYB4rBGvmvF17jiWRFsZxByvsU8fMdZ", + "secret": "e7c807f67e53438daeafd79a7c52ffeb8d80bf5eec00f281515e7c1d7ceadd13", + "public": "02661206c9ce3649dc890e58e24763dd1f102e7312cf778bf15c0838a589736c7a", + "signatures": [ + "c8d3fdfa608b495c14fd0b47d6f8408a083986ddb58336082f1b0b2aad32aaeb27954f329267c4f2387104f80451a6abf237f40b5e93dbdddf39262fc35cc07e01", + "411f4b6179671d9d13233d9dc9ae4c41982b1e7ee5beeb7389435f8351ae1dcf31d2fed790a49d66cc74c714792d2029a75dea964dc2737428efdba056b4a7f001", + "87ab0f994df1c137ef4b0cdeb657630509eedab2f3fa390de2d8ef51f605743522119933f6751f446975616a95577398e7b0c44ab997634f716bbabcea9793c300", + "77714367c993faaf9162c73cff53f78a0f2bfe6be96b71d28ef2680cab54145047f69c6b592da393aa48891f87fdc261e0dbef1ef718fc0fac80cd11b4d9089200", + "1ee6bf3930d3220d2338a50e66c0e8192bfb98d8ab19e2bab7d0fca6aaf553d95e3f4dd3063d0a6ebf1f9d34a8a0f42c69c2050ff9174ec5a93269e7d6d4c20801", + "026c0be15dc3c74994c403ded0ec0b62982a4916f6cf7acbe644f1205b5cefbb1353ded02926f8450274ae95c89892032d23fb6a03ce192ee0a4408af42332e401", + "4739117ae45320d82e2e1b41ae3f60898e9bc0258d1d7b3f90de521db1ed8e9c67e4d9ee8b5d9ccbb1e5ca76d4cc3caa7bd1dc5fe343a4792b26ff29f0d894d301", + "1c367647b6f9f5da5b1d1ebe3ca06028cc285037c3df4d52c95c832280312e9833e65fadb77fff05e5d649ca5a65b57ed33135d5e190186f376eab30c195b2f901", + "21437ae018a00fc75f3ff8ecc69055fa20f320786bfc87e5a3dfd50767f5e64a392ff9dfdbfee7b28b25bfd043e98932ae3c2019e62bebc5ee09ce0385944a0100", + "93232ce00bc5f85f28cd93237be83f861f1fdae74d53c2ad024d4036420178bb1f6df282a829ca5b7361ea348d188ca88c537878644f8e1ccf3bef0e64536d2100" + ] + }, + { + "address": "2xYA6Ty5ngQSGxUxLarPiVpGexTWa7kmZ4", + "bitcoin_address": "1LCNQc9F4vDQWbCRVj5DwPaskbFM2W7eJj", + "secret": "cb09609a37b47ab42e522acc616a8276488b255b07c7d592a03de5fc19bd3ad4", + "public": "02be247f8c246ec549cd378ce34bcbfda52a59bb2cffc92cacc26877c2d0d4e06d", + "signatures": [ + "b218b9da47c96150d6477b44c656ab5bd4e3098f0a36cc37aee30d327e4bc1d37dde4dd8a4167d0fb54dae0b56fd7d7a7aaf7f7671898b81ed0958e4f51bcc0b01", + "3efdb6bd6b772dc8039ea5ce52c9d4714a3b075463180b5a45598523da21a7b32fc6e730a2b7cd48b7e3fb04f61bc8acf07ed6b97922dd3600a837a6d6ef601301", + "fce5664c0d550e19256dd04eb20ba1ae255a855702c7cbfc22576b9057ec32875953066bb020030eaa9a8c7856cb8c2c58c6a3e4cd2dcd7895de8f6bcd5157e801", + "95fe28da7561ddccc725d2fb3aa540bcc8e4571c60b0e744f0ada9db5ec772885a0efc8de1dbee4d347b1caf601f37d8d74a075a6dc290f4960cf70c8370563401", + "b70a88c6c2a2c76df89b481f3546e2a7ca08882f70447043313156a2d5b90e8d0de40c0c27e5dbc565d6148247582b6b05410d9d69998ed4332811436c7b458101", + "fb0f74606f4e239fb7134c6bf3d91cf3a2b76c4cdb08d4c8189c6b457b0663cb7272c6673c93d94e4d7cf94bbbf3af983f541b46a3598a0efe60bfa2fea4508b01", + "3c627b20e0298231599e59d4c803b8a49bab9baba4f45a49d616d4cd06660ffb1c2b60189845cf79546322b22396f613314807e034163e66d47318b9d0d35be501", + "4363cd2d43a6c23df3304023887d7a4d291645c425aaa1afadaf96f1c1ab51b709c054741e5ae7837de4238d0587634c2e189eeb0f01f6bec00cf273a9028c0b01", + "71448bee0563d244d32a17f4683da5c20b786f831cf32bd30f05cc12e376fd9f27c9c60a1130bf9887f2249f3286e4a855232091f1a8900dbfef9b1ad863f70500", + "10ea5ad3a7699ec6de2d3402c333f2fa8ba7b186a3eb378214098a8d1e829e6a4e42505ead889f03113b1a4088b583dac42830879876a9bc74cdd53a815c379301" + ] + }, + { + "address": "zNyfR5GRMNki3HcyWe8da1vhnq1Huf1pYE", + "bitcoin_address": "1FJfHuut1ihsJKQDCb5pFXmSKwCSE9eC4g", + "secret": "1469780a7a54f01572e2a29326b8726a1e5147a2d96222b1e8220b01e7ecb428", + "public": "02e8c038377cba9acf5e6bc9d886973538b8897eb34de689c957caacabe8db839c", + "signatures": [ + "2de7268716605679f813e044d0dc9592660ec76d9fd77eb6286c3ed9a56cc8726b63b69874c186335a5acef4477771748a33d4ea4c7040b6b712aa38e975a98701", + "e320dc92764ecec970a60a0a47fe1580162f2f97438bccab0496dda3a1d985d8132a3d7c5c2eeb7f0aca5ec71a855f9121f06778150d7d0505135304fe991edc01", + "fa5edd7910235a8e57b31fced17ae73d32366642eebb7919538ba17c565e40e37f3730ffecfc7ae42207e531921b7e0ca87bdef76523640659dc7337fba57a4101", + "04c046ff48bf60c1ae74b128d71988f5ce435ee99af83cadbf14c6dd7edb1ec61051fc0ff3c18b020ec642219c72dd45b7c76f4828bc432e181b37959f82d40301", + "b676b3cc400f3362342dd1d279a7230c57dca3973f5a82486717ccbe00dcddd87bb81cadd29fb322d02b2dcc59a3d47b78cdf25ea788ecd3e9ba7cf338d248c301", + "f8adc3b7f0c241f45d8c3ca7b4add88b819ff8388c6eda817f8fb44b5d46e1cf4f1a2554f68957ba82a36996926f25292b7dbce9a37047875eab3ccccea19d1e01", + "1c5c583bc903de18d020ba9dd2494fb9249b387252c3a7967f93ce8aaebfce184cb3edefa7480b886a944d1b1712e323fecceceb70a34371eaf1d87a5172a9fb01", + "7a20e7d8587ab4e612033448e19cbf2d76309ea3914b52578d6000fdfc8243d53ea7f25c81acba7eccb9feec3d09e20fe8947656beaccbc9d63bd6ef79ef96d701", + "800f68685440c16a9fe8eadf94e703b6cf750d798c19bb21df50e0afa2ab85e10a67b1773e571e55a26bca2d9c40ca6661815ad8723c5dc077be6a125d9019b800", + "479d3e035de00b7dcf5cbf5e5ca641b8524f8dc415ec6c60170fa367b9bfd3002cb2a9f477130f105d0ae4ce2d56ac4c4d6cb8aef7244f65ca04c149f469caa700" + ] + }, + { + "address": "2JLkLasmC3aZWegxfrFBMegUwPMMaTRHezu", + "bitcoin_address": "1MArgjc5wJxZKen65SDR8Y2RHJMcgVSbRv", + "secret": "0c0290d80263d5ca9c3a0d4a8425bfb340387660feb48de1e0020853daa12616", + "public": "03491b93d73f48083311ae3c06f3ecd8c16474e795a58e3ce301ff548e9bac33ed", + "signatures": [ + "13728767950c9ce26b4b7ce9c520a7ad36044ac27fa72a7264764b15b4fdb2e3404d3cd1e716907231fda3db6d4d7b9f1055cada44d72fc3939fe892f4bbf82401", + "d257c55f64e001336df83863ce2b065efab6c60799f7b13839f7abffed5bf5dd6a108c7db8b00dd4cc313150966a88b34770c9d963609054c3f791c15ecedb1401", + "531982656772e00adf2d87834a532310a1fe018a7e44a26b110db88cd51c240e3501514398eeb26ac535613b35a2f71942f6e621598d026c18d29127a8b5c33201", + "4095c7b25fc5deaeb3ceddbfbf65cafc5b060e5a790e9cec3b9b791d2e3a556258eea375d87839bbbd3e277c53be855c51417225dc9d586568cfbce1d542da4000", + "87511d32bd897733747252c3373a17849dd6b87c68f3eec30e30f47ff75a40982546d22a33bd2398d2525ff99980aa96ac0e17ed8ea8574329d427262cfb5d2401", + "d2011487bbd4b997db6c12978637c3c042e397d17d9924d65417b2134467a9d36ed7ac74fe0727ce3727dfff6d90e1607062edd16407f93b26e466162f188fb001", + "5f65d112bc25524334e028ac597c3f9e289394a0afb2e0af6b038eee2a66a40169246279115b5b95e0c4c79e9ce738ea79636c0ae7c1f1e2178a15acf3617f6e01", + "3e87be40a4d5a3c9bf3a8c5e8aded3e311788fecafa3736495a71e06876f55055d34376352cdc8c99de89ae69e48c7dc7f845278408562c681f1aaa02860995600", + "a92ca8f889bdce1c2bb27b1808156afee9c5448cbbf9eee7941e379797261a3346258d418dae445da9c483c55b68c10285c8c5ac59b9e9690b3f0bb429b8782000", + "138752502a10679ca518c2f1c8394b0f49a258a8f92f3e07752a72700817310a08e76da5600f15d214b58b0f3fa00a5797a23e294cc76f72c3913ebf624ed2fb01" + ] + }, + { + "address": "fVQJVXDCg3xx7nSK9NtLm7xw5wfhPenak8", + "bitcoin_address": "1KPFb2EBogDiYZPxGYmZRWSSw2StoctBD3", + "secret": "7a64f76a55d52e9ebcc2fd8703153eefe458b7983e8be501cd7b53e99eb7bc38", + "public": "032849624ed86775b96a940bb4c3ea30ce87d2bbf1bd78a8dffac5d5a26a32edb2", + "signatures": [ + "ad8e2123a55c325578facac3b33a4f893b3f2afb1065b6ae51b26a4937d4ac094b89ac89036849a7474539be19af5a82a10476bc9cba60a3c29eed8e16cdd97200", + "3e3811c10b7e1644e4cbb4feb05713be87055c3692124abb51f046d3572ce88367cb91dbbd56208c0958482730cfade12f481babc35839e37c063826f5b3165900", + "c3cc2e9ba9068e6896f15e522dc64a07c2d8767a50e3c95f5d591e708101575655006f4124a433c8045248737772d4f8c49db07bb4fb7e4638592ac2901dfdac00", + "f7e7bd47eb319bc33e14d340b73340c78527587e470a92a5372ff4d4b10780a03ec02ee20ba8387d2bc1f6faa4661c94e2193009c22bd3ae3c7218b70598dfd601", + "d25814fa5075fe6f6dde48d0036638803bde3cdf6162d284cd49182488cb76985f3a27becf6ca57a04a17286fd6479ce89e6e137e47b01a347db4df0983193ba00", + "d9db8532cc2595e35e499319e2193e28024d08f845c6ab83fc069009c3e901f9051953eefa426591d56d092ab7a4b7c8e0cafe3e6704ce0bd10466589cf7e75d01", + "5a7556a143df94e47195afd3ec97fbd8e5a10d970fee7135674a5cff47da053171750083f985fb09dceb762dc97582f87ac312331ae2d2aaef9f34c536bfaa7b01", + "b7e4cb3d1dd9405fa7c4342352fd0920078ceaacea6dcfb3fa5fc5b95ec4e9550c50500507cc8584f9671c8f2c52cc7f773451d94b34adde0438e14aa433461000", + "fb48718e2d5f99114064c368f825842544968cb59a59fe3247a21b0f959397723b838a8b8a9b52690eb14a404987206f5408600e5afe1f03918a1a91fc53451501", + "13cb6373816e236bdcb07c5700078604cbb6de83324ec4f952d9ce046991818242b3730f43bbc5644448fc65097c450191a3cb4a07aaa3115bf7b01de5c0a46f00" + ] + }, + { + "address": "65uJtfRcuUQnQ77iXgusuMwUUE8X3YypDu", + "bitcoin_address": "14zRETS9JvRvJ8rJpkyupMd86tir9m7frb", + "secret": "1e83fd70b9c3c83271856870fc194779562aada020bdd771e9db16a26fe0e699", + "public": "021733c35bab05988350a1a4012f1a960c9ec09df6581d0e205de3ef8b5589a006", + "signatures": [ + "2d41e8b8bb40a4f4e7a6f3d4e62ad54a1ee0606a968e317bc453a45632384fef6768fc26faafbdfda6893b6cd397d11f25bceab298bdffa0d15beeefebd4f51a01", + "9c7b0470d72e6adc12b1a1bc3cbce3a94a6a899f7a7cd29e4103f8ed25f1ea284dc034e5a4daaa44046869093bf65e5a918532b5f7ca9f3e5cfc5fb41db1341500", + "4376eeb10daf7003a33f1e09c8b308673b51395c607bb64dc2559dfbb669ecc84ab7ce243646b4f1078988051d1c2721a1ec834852313b2f0b1d0473d703914701", + "9e4c7b2251a21ecfa279428137229e0689e5d07fd045e5937996cf2ba36bc85e28a80a8dcc0d08d71a9aaf69e0681002dbdd0e7bf996220fb113e73e5a75d7cc01", + "3ce1f8df018a64a9d076f8418f92c4766aa48e4863b4dcf9e5259f844d8e93d35d04853654e953be812d13282a996efcf7bcbab951aa315e3f8bac3b4c0fad9f01", + "2f86dc5d8c351fe522dd28c48154f9012055cf84efe1e5ee852c35e0c1beca515df764310a3261656123cbb135cedb066f1e2d15c6d3da50809108b1dfee957100", + "630ec741f809aeeb3427b0c3ad6b87d579fec9fe1783f927a9186df5059d5c1803b9d0a91d1f4d7761b374cea2ed1c336de82f0abdbeafeb718894f0b2ac253400", + "211d06f41bdba332658455ecdb19e70f13533319e25e2d9e701201c4f6eb038a22a04478802a9fdc5da0ef96b4e97fca848d142c12d831269641aa013dd3da3000", + "e35d120fb5a7ee7d644bc0b4b22a81b3eef841ec1388d0d094c3aa85322f04325b208770d47a5d9dc251e7551d63801fb502d9d10d6d5e216ccf4f456408350000", + "7fdbea3efd7bc036fec0ca9eb26e0b7a257acf779ebcec1689b206f77dab863d0508e14c3cda0411f958975646b85ea99d67246eb0e000f96f7840a29c9878cf01" + ] + }, + { + "address": "DrbwF4PMmGLwV1n6b5r1yUcnRjESsB3xER", + "bitcoin_address": "1NZRW2vLMyzWRbtn2KBv2dj73P79YJhZEj", + "secret": "b2cac97f1fc63a1e1a16d1f322f4a33c173488ba3ebf5049931103728a822624", + "public": "02fefbbfe2f400b83ae244bb3bcd2e4073335d58c35659100f2b323d887982918a", + "signatures": [ + "d412750a5c4e7fe4564bee6f221389f0ada48c6ea612f77a9b1aeb586d8dc4a7129ff3e8aab7cfb9944e344d5e2129de4730a21e20d612a2e37f097549880b5a00", + "b2fa691f873903b0154d6347be1eddf989e67f390ab1e3f1e4c8cf1470acf4804a5d55356807561d5c6c3cd9ac7ef70d54f845d0afc42734a05310ee7bab55d801", + "e21e1102033378122861e21245e0ff0752aa94d7b097a26a16b92aebc7b7291670b5f9efa09b60bd72b21c1e386779400455708ffe36518299b25c1bc4695f9100", + "52351ba65627367f19b6ad38ebfc57b2d797770aaa45a5441e61857ba0aa07f5452412d20710e6ad4e15a9353244cd69fa01d09b17d1b2539774c0c2ee477f8901", + "129d602024659785f35229d08148eeb270192b5600a4f64ebd30bf1721f40ef70312cc10cb97cbcf2dc53da1e8b10723c43bec6b380344f635130ddcc89403f000", + "e7e63d42e064530b329837dd38955731fe3cb68c7f8cfbf7bb7452df2976842b299624c6b91be28fdc3c70fe80d844104d4f35b5c5a6f550471975de4519b66400", + "800fc84bc5cc7947c1860eb2d84e0a4a16995c75ed6023b34ba69b7b3ca0da10146fa36b391e95fd48af4e1281d129b73c66b7ae12141f1db72a177efea7835301", + "5bc5e990c347f77cd4a0db7debcdc92bb6c8d8f0287b2ac7e542ece2f5df3a2834490e90bb3ebb3021f444fc6638c6361a51f92b62616eb31730e53c74d17afe01", + "5b9537851a702c03851633a514750f4050f08430a287a885312c2b0db992879c5ac20bc4725ee26a83551f220314572fd8f23e5aaccfa0df80b8e9b38f357f1100", + "ef0c38e69e2a6f90da8bf5366984a20bcd1444e46d5a96448f7c7fc2026f13150822069375ad746c3502897ecb977b78df08e3c65cb4f2c26981f34a9e0dec7701" + ] + }, + { + "address": "8UtRig63MLaLcBWz1roupZjzgNFWZjFDPC", + "bitcoin_address": "1EpVc8Up59m7mQpPs1ysrEv58xYG5Drewp", + "secret": "84401dfa69739cf31e040af784a9f2fc92d2c403b77244c0ee1fda554b26609d", + "public": "036affad9cd7bae39d491c37cffe118d5b3d23a82cb7d251bd9b0a26e02ecfad91", + "signatures": [ + "93b45998033de9db250380fce60a61e3ade7e75eaaa616752efa84756278a152260b96b3d32033a243c525e81b70c7b304ba6dda691be1f031e1db5b8e40de2501", + "2993e15ae39378a443662deb0a2389df953c1b819c760b05bc8c57e8b2a47df76af6d61d06a60d16da662ede2e0e608cdb3a12d8789a8c4fe6a21f1eae6e63f601", + "dc85027cf73b354bd47b8399a22057baf11c4c59a133a335f598c5a32e3d0b410060a0e37f14b4254def16fc8b93347ab0bfdb56325dc3f361be6a45239c5b8600", + "cff714d386410016878b11ea5a20c756e2b8eb5126cd92efd668c48d4b3d1543499aa234bccd23730bc745954cd901e645763d3f0e25472ecf5b86563b15448a00", + "3a783749b0b78225ba0e6391927e4bc8093c1c0f7d165e79241d97d77dc969aa302a4447bdcf85ec3d2807ec49148dac1bd3c34c46f50ce835c408210d449fb501", + "f1fd6960250d78d7773fc114cb8b08eadc5616fba800ecbfe6591ed4351e0da77668b8691157742ba1046c957de85db1c2337da9c852270906b5f1edf262275801", + "8559c8902387ede48f83e19e9b9fbdc6aa4b30feaa5911c02311e02e683de49230895dd2de9cbea7cbd2c87c62705e3ea669f436bd131d2e14c946040a53c47b01", + "3194e03f394b5f5f73ec5cdf98188be9cd702a4b23650d34dcbc6ba838c449c6346931eca359b9014dfeaf59e223e49977cd48b997b2b95ce612934919583ee500", + "b56a1b1db892f1b55157f4460baeb410acb9e3941375993cd9487245791c45667de87e6a27130deac8ad53930cc7f4f36f60c194a6f9738b9b76099bdd9d258f00", + "fec84af4b8fab37a828ff011beed6850e12160d08c4bb5bc41d175f40b034b25357589de2f8a2c4031be33f6cba385782143870947d2238f3071bbe6a780492a01" + ] + }, + { + "address": "2FEcDysCMv4HMzwXqUGYdpEqPPzJmAanfo9", + "bitcoin_address": "1BLvp6SoyQL7VKKe6KUt9BsXiadBuDdEKi", + "secret": "e44eac00ad22c4e17a0749103e842c381db7bfdcf5589fee225d0171b044fa19", + "public": "029f93f0c3a354d1b89f6aaa93b80ce26cf674988a9cb8042b9291b47639b621e4", + "signatures": [ + "61d574bde2ad3a35a6d7ed33b47f5885ba88536f1dbe54bf4e61a4fad6eb383640da8d0e4b6f5552172cc7d0c9db11c4c7b4e8329223ebabf3349ea1dcf07a9101", + "4f2c6bd0058643ada8225fc910ae42edadd4ed77894880594fc6a14587d56d9b5b1689780ff5ffe0550e336ce8340915a4ed2e07d5317eeb8e8d4a195b31251100", + "6f4339f187cde041b7f4eed3171066abb1ac510afe00b334cdc6dbd460cff0be41ad89604f191db6666cf50a2cde47bb6b7555e6b200d4c1ec1ea22102adcd1201", + "1d1d56be698880ed0e3edb50071838b0cdf622cc9401c63b46497d121c7a35b44aaad0415496ac0ca4e7a6efc2c28aeae509cdecccb469335cf7dede8301b86401", + "8a33f78cb1e2767147a40bb33b2aa5ae367d4e07f9d954a11489901a49edf823431b7da2d23d48958416e310e9089e00b9f2695fcf0508993e8efab888703f0e01", + "02a2752aeeba167d66f8ec9443ad8575570d766bd226d4fcfa7f1037392c33e520750a77e8b62577d8e469fb05a3d33f8e9c18fb3a02f2ee69ca8043b063031c01", + "7ae9f070f1ac3292c3fed78d8676351fb330a8cccd016876576ad3d50bb861e41963bc58a736ec0f515e3879dd36ba86fa71632dfa1627b6a5f092d228e990f301", + "a9dc1cdb26c36c56346f0cdfce899db2dbea965e695846e09623cf09185e17b8495511b6e5972cc631f71f9735102585e744144ea36e990fefdc215da688c5df01", + "70ac0d8ba64116397c25d5515e9a9abd9a80eb028dfb44bee9b3ac97b2c00e9f0e8690ffa8d0ea8aa6bf6aca24b2fba06476c88170ef621f3002da946de2a83301", + "441200b55b63ae560addc5a020b56937fd25021b23e1d951ba7c57d90ff7672a371513739db52f4294bee054fa2ef8adeb4ed38bb4d0a2e83cacfbf9828bd8d500" + ] + }, + { + "address": "CZQfJSz4sSF5t3FVzu6kyvXYDugW3aSNVu", + "bitcoin_address": "1CZ2qQqnAfH26Qsn833ECnzxgDU7csecUY", + "secret": "c7a2c3a4d66588696d0bbbdae561d44c5ebfae50965bac29a5c34be86f9f2ad0", + "public": "03e40a507b0a3a2e27734098d565f8bd1892db382c325838b4bae875453a0cf5e8", + "signatures": [ + "785c64e60448d4c3c6e1e56bd0a1743c70fdfccfa0866385db6c86cf64dec8ea76e655a5621cb0c8f2f1e3e20b8aae8fcf2efabcb0539831ec7962fe310ea92b00", + "c0a18cb45d85e65de31fac27e60c602452ccf320e93bd217e001bba8a96a2fec3c51f6e6983386310a4f3ba3e06ea8b4fb6c62ec7698d12a41bde9fe278dc8f601", + "de824e91917697141f4d1ab5174477488468ed853dbff47710805d1abecd3df9454f497eecfc98a32189e00b5ccc0019bb0a06b56f6df7c77afbb4fbb65f639e00", + "1a54dbc4c6fbc4905feb7d3cdce1143f0e5bb1836c12b6e4bbf9fbece2987f6a3fc6838fe5704fa6fe97e0be3cbf73fead915bb9a9b1fd555eb6dda4ba69082700", + "7ff1df7d20ae44dfa8d03232328d0c921dee85441065691715b6a5604c74af135ec9de99dd075360893432889b3a4cbcd65fca62bb4a4b7de9d72ac9bb90e19200", + "27bb1cf484ee097e6eb0e0d1c09611e162ffb41479d172c8fd040d89781c268732dfabfa77c1d8c21b8a2be1167c24054960273005432edfcbe82bf86c7752fa00", + "adb2af1376af5008e9e59d1d7fd09e283ff2fabb9a8e0f75fed093418576f103311064ad3228a23e34363142f5415333bf97bca296f20aa2efaf11c5696428fc01", + "37135bb0ec3ef75b4490c32cb476bf80d04a8c175480a755edf07bd87a0575dc213e25cec0cbf100114daa083875390dad119f181a4044b61c1575414d5f38cf00", + "b0af6e597e32d5a34c75d1c7bcf9dba46edf8980a0da02378a4fa80e13c5c8e6684ab741a8dcc60a4032aec17310451c21d167493e4f91157f9054142090882f00", + "df3b1d979e90dc35f5f89f98a29f041b261f1e18d9c9ab4cf323b797e7a077d45db26932095c28d3e7a2cac92ed38079c8d3f3f2bfc60173fbd2ae64d51dfc5300" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0003.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0003.golden new file mode 100644 index 00000000..a3751bdf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0003.golden @@ -0,0 +1,185 @@ +{ + "seed": "osqujzBPUMZxaJ3Do1Y7kNVJkcvcD0MeduHY9y0YTG0=", + "keys": [ + { + "address": "DC6BLZG8zpsiSa1gGefwdPzuxpUccKrbXe", + "bitcoin_address": "18MpQvmcaHrJEVX8MkAKhfv64k8UFQbsEE", + "secret": "325da6487b7076dcf1eec385918306aa041351226beb3781640eae8a432e1055", + "public": "020f3512b4c14d806f71faaa21dac57a07649f3b6871425f654e3fbc7f65be1497", + "signatures": [ + "809c24982147fa79488cfbd3940e73e2ecf2ee9e467f0e18e39fdbf18db776de60419e3535bff3cf67ba2791457afe74722744a872e3fe18d3bc37d3d8d397be00", + "b4296714ecc2176ec0322cb6a13f9bd75a34f09d5365ae5131468682d1f674412c61a0c67085ad839cb61b51e9c5a7eaddcec7de4743ade77825b2e746b4963500", + "508056bd0ffed1dfd2c6b0cc0c9c6ad26225db5c43f315a87bf8251355686ae212746fe8f679b7a9fa1686e6fd4e20dfa924ad9f0d186431bd0e5854ee58193c01", + "4bb6ffcbdf92372d6b34fd216197482fc25a39492641e74fadcb54f461998a4339480cc1d2a6f9d082b8603ed0bcbaa3981ca871f515e32ebb4ad6fce804556701", + "2b9d6fb8dc332b4c35961b916ca8a2ff62992fc841302ccd8dc199b3795e95d0750b6b359841fbb1f9deb5d28040d3a13e8deb759f8c3d5e95a7b51de70c1a7a00", + "6295a6d33266334ca84e5f27937ca2eb0ad7de6e28e89607a061c6be2d26714f3dffdac337c67840d78dfbdcdef5f175cdcc681d31bca40ef33c742da9cdbf2b01", + "fa2c67f056fefc0345e38cea031b98deb7b94c0e8b354e4e14aa8a28e7e2f88e717fbc72ac2c7336f000180be95bcf2f3c72704027e91fadb91a1cf3794d977401", + "4c2e02faaa872d69564c1ec25d6ff77893808cf4b025a8271f716497e16f9244079b7bd642877f8595c5cec0a009b5773b1627017c2ef31fefb558e3ca87d09900", + "116efeb0211296184f0c6b52b71f43b9dfb7dbca6a641b6a5daa4646b44655b3094dda11541899c235ead9ee5ed5ea9888ed68f9fdf51a77c973dc27243c055c00", + "91007e5048b024ba6ea799d14c5d907d7febcb896d8d6b37c528d59f43f0ff033ba752ad336bad95cdb162c6b2c991e06d4e2aa72769de959d536a15049c6af401" + ] + }, + { + "address": "2dJiYdLAPrgJtNxmYbmx6Yjf3J6o6tTQTd5", + "bitcoin_address": "1BbMgnfAyBkv9nZ4Zdi94xsGRQeutP5iYz", + "secret": "ca3448d20174e2bef91842c97cc89961ce108b634798e3add08349d2ebb3b7af", + "public": "0363cad05bc20e6061d1687f02cbe2c23e188f7272bd06a17f5e1035b434215d95", + "signatures": [ + "707b5c34007269e88ce9898b604a1c9c9ad31e5989f8ee6fc682a5bec4b98c3832f33d84d9efb2f3ade0b8813aa5f3305517762719278172645d842bb0a3175600", + "ccbfac78d5323f046a6585ba6b6fe674edbe1e565d33207b0f662a28176d0e1e7711309c9df63edd6e08f3a7c454d94cde4fe146cde5f4cd686a2103e788ee4700", + "60b58eb3b8020113be1ae1025f5a5d57ddb4cb27adf0471f653fc4bf5a937a805d523921ce98c3f2f3f39811ca47601b4c1a5bef7ef3ae47c87877dfe49a04bd00", + "1cdc3524c0e0a18011f5e8a627979309606c826272e1339444349c356cdbc2c05728c3aa674446b38f076641ea3c032a007a030e4069a570874545c4663667ee00", + "786aee30a6087a5687781b3ed888907d1c067148339552b90c022b21728472613aa715b75cb141839c02b3a3e7d72b58e6cf1a66733be1bdc7d9f209a0cbcf2b01", + "44e13e6d249dc2120e5920a93ff9d14b6d8b9f4f76bf3b160111e7247d816a0d673da37fed5407fb4adaf4974751d17212a88d646889f3c21d18dfcb8236847101", + "d0665523c04db55188b1285f0f6fc79693f9468446b0e2209f1573bf2f1781b16d06368f0f1d7483ec3038e64af75569cb474eff030838397e1bfa331394f26f01", + "d73c18368eaa83cc36ed1ba70424ed51b6889a1bd184e8e63b05b320f0231c876d70bfbd5e287e81ee947b1961c88790285c70b3167197f04a3cbd026b4a9af800", + "d99efa290ad64474bc2c650af2e4623d491aab54317d73a4cbadbf10f706d49447b508e2874fe41fb5d62d8676df9775d3fe533e26c3b59e8290d02473b29b5901", + "e4708608839de5df88e9d8091816566060ce16715e6488c0b376a31dd977777279a6f88316f3d2c0716d92048b8d10689b273d83dadf5d4b167799abac89b59e01" + ] + }, + { + "address": "tNP6Z6m64tN66qv8MNbpgs3hXphXY84rLm", + "bitcoin_address": "1LKXRSznDK7nZ6b5rbxeMNEkyZif6QnPxm", + "secret": "52296f8c8b894ddf388ae2b000a023b6bd48817b9139e2495997a74775f5205c", + "public": "0229a7d3b520548fc3ce2d2008368d9b00ad9ff5ef045ac9ac7f3f8f3036434917", + "signatures": [ + "4bbfb348b79a401708a6a2a420e14fd003fb4a1a705b375ab679fc22a0a41f4272459c5d5f85282fc28566934d4577ae9b1a7089869331185a5f582dfd0e94b001", + "1c5c40dfd36fe3787fb6dd38be1dae85f6a6fd4b871916cd1b95c1034429472e4934998b8bc82bf166e14aa9367dfc18331db53224a1194ec97e506005cff1cc01", + "d90f16cea7f7098d6ff350a99a75747ae4d09052434c11d60d1f3bf44366d4fc310e19b33618ec4f3be097cf01c24fbc3cb5bc9289659e5b1cea5229490979a400", + "3ea89cb88d288bfe01f48409a9de0f869ab9de596ec9d01df313f5362d33b44845e96e60146b218a085a0d55526a6418eb02c37355167b0b632268becc33731c01", + "9e497a538a113c0872cd2427795e37dc0c6062065917cce07a6f406f2bcb1d203fd2fd6b2a411287cb253a6595da66c2c253e3d9035448bf1a867fc54afa719000", + "c19122058a54edb872e7c010a2fd7fd4f2c0612f5fe9dfdb69a23c257817643f4ff5774d3714b6efa9b5a585f5b89f1bd3febc43031d10526b78ba1c65a753f400", + "d2d796df07fa14f76b3ea84efef72d4412aaa67be7ced6b4c0ab2768968878614820fd94dab1b679a64548a4854f0beb7d6ce495d59b32e7226c4aa55b04be7800", + "7f9fa76140303717d61f6fa1beb1cb1d492599e8a4e9758a76c36f9bdb0f2e165a86cd84066d094b7b5a5b1f7e6669fed39ae381f03b54862662fdfae9317ba300", + "351feefd233570aa5390987f9dad774999ba97b2c1f39affa31a80b68030a4ea2afcbc0443ad0e90d6198fb22bc99a42afd1a264cd4866e2d7ac93a9bf03a79201", + "12683e4bd838a9ccbbea355a374eeed3eaa0339055cb90040c79570736175deb5568ea3b22bb642067a2db8245e83fa3e9ff14cfa17bfdcd7538d91784a8e75200" + ] + }, + { + "address": "28Jw9pmX3U7cckrah9kEkp72nPQ1rsRVEmN", + "bitcoin_address": "1PLNr7sgASUez2eK1Qvks2EfhHte1omPes", + "secret": "324ea8f53efd2dbd840d97b8eb1a81f4446a33ca0694c9e91fe87e82f0930d43", + "public": "03dfd1e1219d411414b1dd12efca1a54e96ead409cb810020af7c92c8bc6a03d62", + "signatures": [ + "095e9e13403b7b398249ba6b07121adea43086c9dae49259955c77bd0c42c84a66f58bc0cb6fe7e471d6dfb085f3fa936a730725ba551874b90c12d1f09e463d00", + "1872730df7a78b2400ce26692298c979460552a7e1bda64c702fd10d8df1956131fdcb3c53621ccb2032585ac0e11a5d685e12e658c7f3f0d105ff9b4176c30e01", + "c048a79e93c15a2820821d0a9f5d64ed5c1560c4a791baa79320b865a636d48932ac1db2fa43a58fb9e422da818bb971aa9a25be0e13646251d28ae94c5e2ba600", + "c7e67e2222a5243970e88be22d5cb13620635e2e2e93e1d81f441a4c7298c14f29a897b38b59bad93aaaec08c5e408a374804b2418cb6044ebb3cc3029afb7e401", + "cfe3f39d79f18c868bc9cd227f8cb32ccaab48b4e6481b72f9f3e74f17b87b5e5af1033b0ee04f410ccc20fc96242a5e5292ef40f91e3caddc3ddf6e83d1912401", + "a06f1eae2fb6125574ddd35a586b2034630d672a38691b459206b8ff1ec0a6e8681ea699daf0af611faf1e17fbad60436fcd5ba7022a0401c1936b77ac6e081e01", + "9ca4ab63017ea7639c8c17195e090c7d1006289da7ea61adb27cb3d647a9f44e756791099fbd7a380b780f6818eef289e7576140620a418a0fce013de7240a2701", + "08d70e714be4493282719e96c6ff7ca063b003e595e3c1fb7925c8494b17d2aa6d17eba028e8419fc2fd76e7b1352074d711964e9b2c3818eeaa6b611f4895b301", + "af0477044a15ecc71fcbf118695030d582930842eb49c1675a969cf2575dc2eb0d14d742ee694fd6dae8ca424143a5f22e53e01cf077ca8cd95434f0ff926d7701", + "f0f6f7da0e96362162e433b3b3c445ea90f1d18b32d9cc1413248f0dc27e68c6703af07525f4dfab6e09ca83bb360d9962f8b67e271fa1bbb485b884aca6bef801" + ] + }, + { + "address": "NBhY9RijacMUvN18h11DmPVSQTfiqwVd2a", + "bitcoin_address": "1NUp6Lf4U8VnMb1T1p2xLRoVnnVnwXmxXG", + "secret": "b07bcb05916fa130aad994a1d7de445acc2c28b2acfe97c1e6fbee7c95baaf5d", + "public": "029d8e3cce3767b3ecf6f615dfe46d8ef93538f2748d4f0a116eb4f55d6812d4cc", + "signatures": [ + "96d040001d138f7e8e8facf6add8ada3f2b3cbd73a9a7ce4184de7c6c8da694964df193acceb01fd53007f5947fbc035d8e85e84fb59d352ea746a068229326001", + "67bd4e12abb98df97009a415984c1c494f00946f0fe58ec8b93fb40a05bbbd571fe50029c7de9142a2466b60e835d78c33e0185aeca77af671be437a8abeef7b00", + "f4053547b9dedb47b479966fc4f31162f7d63c749beeebed4f9d0de0e59aef85145fe85cc249a776f35f0798d4c140f75babe24db0898e8e5aa0ad094a087d5900", + "91f63bb31c6ebc767194b073b81374d6748cebf10f46d8aacad986c450641939490f6a3380186f98540c5252882ab19d8093c25275d656577a67f2b4a51b573201", + "5fa1ac1fe4fc4e07923241de99b7a3d7471ae5d601277bbe3c21cda7c5ec9db44c89674432eb551580175e8001586203f4163b9686d82378c5b027f844c0da5601", + "c4fd4007a107d2b58389eb9bef87eec5e8e6721eab888a13a19b5059aba4a329162c64e9e7bcaefb043fb1fe677b2d6434fc99a9cfb1f60067c00d98b3cc5f2c00", + "4b2c0f225d0a94279ba2f99859a730aff20ee09eb161c9f74650f4061c8919ba364504dd91ba52e0339acedad7d65a5ef9734d5aada7aff1c3b707e28431772b01", + "f28b175b0ad668f075c998e6cd1325515dd6795e506b4e7f3b1b41167f8f7fc84ddf8eb85bbe32241347fb81c22a7ba46e052817b168102f43d630ed909231df01", + "ed07e4b55f64713de65af6e2d65fe9c88c782bd9f54b0cd30fc0c95f2b4d8e48244398e72b4aeb7bbe698f3032a5cdb39329e06952683dab69802861cf3f325200", + "c042e9d6c8a0919a297843013b0da4f16f62b0fb98ce047694f50f433ae9ae9a4dbce35a715a374d54034386efed191de09cbd4d1e180c5b292f06506298a74801" + ] + }, + { + "address": "2FyNgfqHoLncq9y2Ruz29KwueL7oK9aKryi", + "bitcoin_address": "16EDnragRFzC5csxV7uLhyiK3u4mQC48x8", + "secret": "f46a54411adb3a34ed4a11e4bf01d3d87ffefcc2a2ce158f415078c20e5b01f1", + "public": "029db862d6ecaa866217c85468d7b0164208dd37087a90c5c8428524959e982d79", + "signatures": [ + "192f8833f7172283c5c9c0294baca36002429782595fdc924c987099bddc7c6065683b14dd858eaa55ef7f87441e6848130ddba06b9cda2a41e635ab072f378601", + "93e6c81c91dd59aabd9247892a73f3939f1bb0b8ad6229c08e1f308f72275a066910573dbf60ef1f3a72f31bb0848e66e14c55771f5862d9d90b230c6fc8d02d00", + "1ce3643c9c018800ff12ba0a121b98a0f858ec40c2e6a9b5fd37abe0fd6d9e7d54612e64474ed28831fc0175bc989aa9f1aaa436a635207cdfa085d6e18906b001", + "429bc18483a652f86ae32e20c917de9ef043abe922c6bdc95d76724d95aae40c7c9e273784f58255e5ea873de4826b81686789470895984c7d8aac2a13365d3500", + "f4dd8039559a894885d1cf76043a4c4bc69be4e439050d965c4e2889818f582021d0850d7e2691b941d63b79819d9d11ee443f953395a1b76a54c794125a95e901", + "6f5b2ad4c639745a02a5633dc6f336ad1f8d4e035573abb8b9d91960b2ebea7601f62bacc3eb8c89b1707dc0ca3da4d0f8faf5b34f18ff8c0c86578d5340674c00", + "e9e052fec6c7086b57d7dc12ceec2f637eba01863336e6bc5a6d6405c8721ddc13f41a526937e82725037feef805603ce6a4c97421a28e5804c74ca66434404001", + "10c5f518ffd52e5b0759565706b618401d958e994a8cc48773b4081abe5f1c693c3d33378c08e29703018226148079fcb929c47389cca503155ffb7663c3fbfc00", + "3d943c9d9290f0c01410175ebfe7d33926c309b5a6724742632e962e2492181809596d7f5b712f64e82dcfef0e5f2dfe76d85911146e9920e5ac5392da1589de01", + "67bf7d8eaf1636985fb661774a0c4b5377184b5a5ac1f6f8c6ee4edda83ddbd22f161d315e924331ff5ae0919f83b1ce1b49cff295defe5617264e21aa75f18801" + ] + }, + { + "address": "24sXyRBQRq1kYZhwhfHhLU98DZGcTeHwQNz", + "bitcoin_address": "1MHAGA4oR9J9nDxSAuQJbMdtHbV3stZ8Te", + "secret": "af178cc4704bdd222cc94016d529c5420710de96ec8926bb0a395855875163b2", + "public": "0306b389235982bd983d081f6584bb45123bb45e8055a844562b37ce7971c539f9", + "signatures": [ + "a6d3d5d20fdd1620c4a60e665272657e24fbaee36f61121cf9807f2207823bc51900b811ffb4ab32a2a03081ff4faeaa2d16d73fa82dd1814c683d53add34d8101", + "a176b6bd3ca6d38d8b38492178d78950575ae7ba22a6e4c43c30010d0b88e37f7a59d1da6430c92ce9f45276ba75cf48a4ff25f4dc73be8428ceae7943c7a79101", + "ad4287bb732b1d2dd038d3a3efff7c14a617d1fcd14d5431a5dc3264f082ed0a4aceb53231c0025fff20ace3215755d83a4380e61d1762f5b2a7139678830be500", + "394c94399fea17bdc9d5ba2ce5895c671ab755d10a7b10cf9e414b779762b5a309960d0a5c6a63490959ac2aea2b78e3a46ff404d001bfb89217daaf6aac135801", + "2656802a9978b3ebf7bce6153e7ac3ceb227121a2a030d0a18c7555c30d332e80f75e0b528ba372f44e457989a5879016b84c06b2d9ba305adad899817ef2cf201", + "e9a7e15fc35ed1b76dd33a5bd54893e8655acea9313cc3c2c4e5561b07d97d9e67e953ebfa256470c8c680bb80ba373ac03d3cec9c8a11a036665df7db9001ef01", + "0fe18385d5e354c2d53398351d94f0c4716a27e8b2ed564643939a2ffe8f0bae79a0b60e15ed1d26a57277f25440aa1ffe87da1311e735f22c76bfe183f777c001", + "96ef9eb7cb0d210642b35dc139d86ec9bb1244045faed3b3e81fe03874aabdd316fe4c261d075373282a678c57b996f9c38f9aea0fafc7f95202fd057325492101", + "7b9fa00ed2687eece3dc9ebfd517c76e49cc435048320699b7983aab895c196a25eaa9c3b423aa5a56ebd27bc197ee40ca0705ed0bc082b5bf826d9f1faacd4f01", + "163d0482069bcec72d0cd9aacb4601902e41ff7c5268f8a80e3f3f1bea5390d2592d8c24c2784b645f5c1776835614a85679da210b9e2d67fcd72462acf73d9101" + ] + }, + { + "address": "2eEijADfBZAFk5WpNhQg24DnqPPWaUwd8G7", + "bitcoin_address": "1MnkMNVD4YLrPkhnFBY29N521ZqQxamX6i", + "secret": "a3d764738e2dc9eff6c1d423362b537d2e2d8346483d6a5a034293fd9d057aea", + "public": "02e7f5c694d4f4b4ecb146a634fbd3fe450b017a0b8306f4f351dce5773e81ba8b", + "signatures": [ + "4611b93df2c55426447f5bc13cb2dc60d738bc62b90e823e25cd0607154fe0b6194df3869d33c25db8c9ad94b89443440e01d617b26d628fe090a70db05588eb00", + "a7102de3b33131aaf1462c9b37c31da6c5e8fd8bf8f6ea5821eb3aec8672a93b42bc359635a36bddd0a0fff3ab605776cf63544adfe5044dfc302d6665f7d98c01", + "2a78f73c5fe82809661e4ab087fcff0275aeb6dbb6e5200359352d708705f6855828916a6442ee15e3689113ff3a00b0cd9617fdffb429d96885a5b881b1f6d700", + "b0d5621cd30790b21e32d079eaf465bb13356aa1972d91017ce5e53aa8d1acaa06bfb3850f59edcd71b5b7a5df72d87af038f1ae4a5bf19b6628a8fb046c360a01", + "ed1fc78e0f115aa052a9d3146b057516c140365176da613af737d1641d7c70f71324a533c06189f3bbfdb1420febb09917dec38ba2bbbe5cc4bccb89eb8f82fc00", + "db6cf55a88608ae3d438cb994c490c0c99a036c4254414f0c04be67475c179c95f5d6be14f009dbe391dc6c5c078c673e2b627b9018f425490d07e87352159f401", + "b43fc4b582eb91acc18cb03caa1b8460e85364115268cb4d70236b87fa58140b0644123f8df014d3c7195b3ce081294a9a7bb2946050ae24cbb98dd643e7e30100", + "5a14a381c75753e4f1403fecbdcff1ce0a0207ceceac88a6264b68eaa164a4263e419903c61b455b5894a3e83fdabf4137fe27ef57501b252a5a40b1733c2d8e00", + "1bc9144b3cc9c33032864d23c42d58da1cda12e782fcc20ff66487b6b4eac7655f4ba61d26aa2632c9033e9b5231da547d3737ebebe86c36d7219562e04792a901", + "44fa785abbbfd89a8dcf6bca7785e1fcd52188baf3368da756b7a8fba7d6360f54a974a54db38877cf84ff45ed136c0cb36573c3a26f952eba03a77de1a49b8700" + ] + }, + { + "address": "1CRfbjpqCGsrFuU1iRWQcCEfiS9vSDGDnb", + "bitcoin_address": "1f7rzih2XrFc43jCQU7nXxTLLQmCHyhSR", + "secret": "7c4fd501bb1a2f4dbf7dbf0bb9d0134fd90935d7ae5689d2005a030ee64ff0a6", + "public": "033f24693c5e97edcab4c2fa1a3cba46354af26865b055c6b7f699cd61b0731d69", + "signatures": [ + "9f01d4332f3e069d930d98ca5f7c8f23374924c317503b2859537fe014ab351c07c36c8a6ecf6a4c8bfc571558399cf3c31b4dbaff4b1d5ab37dfb0c0b0e384601", + "7e18b44021d19c3d4d36a2fccd3139c6bcf8f7e3bf2ecd0270d3e01eff0b94ca6366ba2e8fa086a6f2ee3d5d9197a47114333942b754ea9cef3e210e528af0c500", + "8912e1fa6852554783c4d77be8e45e7a14c0a4c8b0473201813430b1ea832a700031ca373e48ae06a78cb3d95f2cc24b93c0a2eb4c02db2511e3c2db7fffe4f401", + "1591e3f7dd9b74483bd6c65846b9e59f94aa2f6dd02213c715f720e098e19f517aecaed7eba340374cd69bd39c7c9d0accd78bb9c3b6caed9704e7751a27710e00", + "9ab1221cdb071b3baa1943e1e2065f581d2a81c1d33d42f00b106c0e52c03ba5326e99bad3e1a4fe76a5fec41a29a82a366d2df1ed7b5688e1c9c591a8c937af00", + "699e98e30bd3e769bac617bb874a84137e279a420e09acb1bdc85f69d1d8132509f958813b914327aefbde00232d2fd860bf37f0aa085c2c672a3b47cabe0d9a01", + "e731c954198de65dbb56cc586274804ca0148a1a9f0ab562be25c7ca5ccb5556101dcd76b3137da7a8847bf63465fe174e537a80e7f507dcbcbe29e8f99fd61401", + "2d8790ab17a76d20e1b6d213505d08fb95b0e949eae75c4aacf7e575680179620be72cb7781037aa4e5e9656eb8b6f86eb81644dd102bd4b8259668e7eed38b401", + "ddf5b3672691bb851ada7425a749bc95fda1fc6f5cd2a14e11881cb06033543619ae8665086e22c308040b5488a2c7885e4f73e506b69c7138ff7a67f474c11300", + "a835ca7b0a5b355dd58983932cf1d4d15035a86e49df81128ecaf9fb783317115f69aa5d6d75302a0c128e3c531577f77ad0d5b6d215d25b890e941938d3bab200" + ] + }, + { + "address": "2bDMZ8tKNd9jjpaxor2mNN7eyD3tvGQvGrh", + "bitcoin_address": "1HSdmraFMePhnAwHkYFBb5YxKZQ6bxpCEZ", + "secret": "5b5ca59c4abe3a782c370365bb9b85cb64ef66ed194fa2a0fb6b66616735d9e1", + "public": "0372ffabf5e1fe4289af91fdcded36bd3841e20926f9ea1e1048c1125c2aefb7bd", + "signatures": [ + "9760ad87d8566f068df40cb8b7510cc58fd5d8417c3c24e4a640f29e4af047c13fbfa476656295689a0a4543c0235af56a2b73cc310f9433f8392e8ecd36645301", + "5136f29e66edd0961f8a21511d04230ab71639aede10447cd21783ca79af10514420c3571d364112b3236e8e2c4613a1b35d365d522d7e57578d06bad5d6dd5701", + "206af9e7a04b8ff4f34fd353ff67c74723abcf6947c897901ada314ae14d5be60939fbcdfb0a19abd7dee745d4ef41d536dba5af63ff4ed51a9527f75d7653a000", + "39a21464e465370c3303fe9615535efd132b2a9625a5b687bd48dee0529cbd7926e45514566d8800bb0d730adca3a81a70d6092be7e0cce3c990585a37954a5701", + "177e0155ab098387673b2b95627f10437aa81aca8dae9d485f0a81d3a1954bee644ee54b2fbacb76ea2e3990d5ccbad69b6048adaad9f365627c3d4d62ff44a600", + "0e1e137d69c9b30ca391eeaafcc3e6c43b4d8261fa591ef9710e666797c214b54cedbfc2057a5c4c7f30ae3328b8286ee33bc38e301003b7d96a696628948f0401", + "0f6350ba71a39d629a37b79e4deeaa785dd634d833667379b5f56425632be10a7be104ebdfcc3304e6d2e7b672066305ee894187a86b1d04be617cea14d3b86b00", + "89d2aeccb2685af100c6df043f2ac618abffc9c25aac53e459231a9f86452a89005a26d25559688e543c24c23871e2c374a62237bf2d3c308c4b4e334970038200", + "e22ff4a474f973a28d084a842a3aabac7eea8c6d7f098b8dce13a327f9b4957b625ee95f947c86c072490a2606908dd6068df998106ea2a1bfefbdae1ee59f4c00", + "98902bc39b4e4d58dbb9906384dad91b0b2ba15f9b59f47b6d1985e1e48da08f213a4e785d5a1c18da576f5d9d2a37b4a6b21c330a26d4cad23bd75f1419e2cf01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0004.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0004.golden new file mode 100644 index 00000000..fe2b5266 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0004.golden @@ -0,0 +1,185 @@ +{ + "seed": "Y292ZXIgZmF0YWwgd2F2ZSBjb21pYyBzd2VhciBldmlsIHJlZ3JldCB2aWNpb3VzIGJyaXNrIHNjcmVlbiBjbGF5IGJlZm9yZQ==", + "keys": [ + { + "address": "2gSg5K2Aq7V52tPkQFMCfgHNhkae2KsTE7x", + "bitcoin_address": "1PQt9fRE6AqAfCHGhCtwNaDf6n51uB8tQT", + "secret": "6f1d4cae19bb875ef2588591612a73972d824ff40bbc8ed709831e71764e7897", + "public": "02e28e6d645e070e698c35fbceb8a81ab5e5d4912c8957d3e065e8966d19ad8960", + "signatures": [ + "ad1d4a3a61606df19d2d56083c4754f158a3cd76e60fbf6f12ec5293fe45fd0f7053bbc931322c3b6c289ed8b69eddc4517afcc9574eb6abf85dda7aca90eb0401", + "ca7cea4a7b3b705aec86d1cd5730ccbbc3521c9b4e5916db5df089307c14d89b655ee0d17da0729f7220b6ba79f39fad2fcf4370b1c1ebb1ab8d787868090ef301", + "f485b3a381b0f88629afddaaf895ca7dbe0f173db225c5f1bfd05b80bef18e5e330b2dfa46b460eaa11a0434010a76c8c710e44e489fa879091112f9f7ce51e501", + "c3f369e6685732b3f07deb7a271f786f90b3fa8cd69f217443c9e5d05aa2e9286225f6435ae60a3b7a5206bf35166a7960bbb640a5becad2d881f3a953b6887901", + "800b70203dea088ac2fd6e6e5c8a26b831a245998d540292cb2a69bec83f15ad172b805b8670a485ada4069816efea4c50fb1603913e00331562894c7df87ad001", + "bd558108807f9fdebe5cd192230d0acb651b992fdeb54f4e9b2e5fa0a13e069f366b8442478a62032847a832cc5462aff4b7458f18eb104ed8aba8501e4470a801", + "a5604f914b5169099a990f95dcd38d9f78d145b99f5c4160118c0b6f8f8948d47f0cf1a41887efcc6f821cb72eff0b66f5b7befd824ef9ed8f3a07ca671a1b6501", + "31455eed1035e50088ec9ab7097ee54a8e9f6dd5f233f1b95f2c6cdaced59dac23118ee87da70ec88056e48ad033ba81fa8c14ea891a6bc4b65ea2e08182f2ac01", + "5cbcbdfbc91b05bba7cf8a24ab13d5872dd0b148ec6141a4eae664b03b08e6795d89bf71203a6cc2021fb3a16429992c3de07d3a8d3f4504a0c2ff48e8dac5c901", + "0a42a468246b2807cb1b1a83edb251e1a81838fefb0c2414d569b593eae8d3932bedc14a5daebe0edd1910cf64e18d0ce70dffb536eefe8b7b9c27f2a630cad101" + ] + }, + { + "address": "DwLc3z1ff7uKUgcyAR3gQhfzJUHGMXktyj", + "bitcoin_address": "1L8Wty7FnC7F589ut7KGvaLcQhDLVJuibU", + "secret": "8592f9f419cb7b0fd4216e314b17cb3b58ec944979f8f6a34e21fda09e01fb2c", + "public": "02c0b5b53873ec9cba0790588c64244579b0b23eda646d6ddea6153cb97538b3bf", + "signatures": [ + "f174e61cabae3b37f1cfe3d1abbd606621765d02ed6bfa7124dae185aef762a51f6af575745d33d4b2d1664a0d95dfc82e9010bec8830e13aec03cacd6ab158801", + "28cc5c115b8bc99e6bc9d6281877417a2d5b45806205f4c430210157794920490d11d4d0de202357df8e8603dc3c74426b98d3c30fd7963198a0ac15a6e6954e00", + "c28d5d073b95ace0e2e0fef8c34bf5288633f5d60c33d2fc5fcf427c1d70a8a9045ba9db1510b68de5cd9ba2c8709a6cbd0e8c5b57cde5a601d1737f854a4e3f00", + "2c67e279048522919862955b1afe7c32f432deda62d90219505cbfe7473a976e1968d180f7d43b2b018e7f4f265d489358afc66ce0efc1836348f065fb03197c01", + "f8ede7998f1110729adce0af5f3926a3bd8927c178e98c45ba1529943913ea337d4b6661c54914d323be43a9d7596fe7ecba2a8717981ad2d9db835b898e08f701", + "8b8b94e9962b5332f1289a299b3b99529edfd4fe17ded5c0b38d6a23364cd41759f40ee4454dc9889d207a920fd09bedeaad78885a0af853cce2d1c15472412e00", + "697b517897a92769b59d9cfc86e2ce8650a51a318bee6808a10ae9e752e8fc6a587073b92da7431ac39fb8d7e77c98de1b19ae90451df69a03dcda911587c06100", + "e79c81ec05b0bde926a1ad3310ffc62423016213895bfcbac1e120cad6db1ba872dce323156b76bfe316467c26475a3ff1468e2e285cbf0c23e2ea542c3447e901", + "4f90c8736b8081e2d354c22f5e2f7e15f5fbd230305257a3f63fa89276c21c9206716122be313ca3c8560fe86c26c09b9d6e9ecaf8c7d4bffaebe20edef7444600", + "0c3e651b2b03dcbb6cdddce3612f4d0f414e11f949d046d9befb8b34b0baafb57fd3d8968f27c994a08be0fdd6be016bd55c73b4a9fea07ed44801e3dab6086e01" + ] + }, + { + "address": "25F9ZVk6tvues2LcxpRUCCjh7yubBBUXf1o", + "bitcoin_address": "13smkxWuUN5wCB6zKMxEHDUZPFrE2Stunt", + "secret": "618adb045d65f9c1f99bd8e8ff6098aa1c2abea4c8424a9ba50d2a46c7a4340b", + "public": "03eca0e99aec7896b84c683db6eb93fff2df7cf03389720ffd214eddf15f901390", + "signatures": [ + "c19580a393f382b914baae4fb0861c4bd667914729dfc2a2ba04359c247669e55da6940023902e17d1006bfb14b71e2cd6abf4388ba0f18964f51d8b4ac272ed01", + "97920bcbb32e3b0e853a2a7369d0c777826fca18037ec9711e74fc04e31de4af309a5cc22311e13d68197ec991abb351f3cdf8e0d8c112d0774d1ed0585f93ee01", + "febf199c3d88e46fd9aad05f1c612d95dc2b14a0e81113b844fca9152964fd8407866c9348572f70f8b1a8f6d313ced36314f04a616383cc3cff9f6faabffbb401", + "e5da5885db7f22a5aecc0bb7b8573703b450ad8fd454e65f658ce3e99280495a6201bcbc756ae9f7bcaaa387819f6e7bb921ba33d142077344bac8bca489cded00", + "52086e02e21e9ca4349ef74aadba227f30062a46b150fa6ba478a238084617dd48bf5cae7823683b1dd7ed0c1190ef301a5a9235fe0636fdc32cfd4a4effe0df01", + "3ff9158189c485c5dac9ca9b588291e8c7e02e148be3ac5dc15c8d1e744483b315c6c6d078d025e9537ef2a03ec813cfaded0de7afa37f329e94b6688f566c1a01", + "369c2bf1bce93ff4324683029bc35655f45c2214f7137a2ca67da406b982a9bd53f5e3a728abe88decc966ea4d7516523986b504ddc9f6e4038a80848a81ef9301", + "e673fc1269619a2bb56d3a5ab9d5d25412e8015074585abc94ec66bd5179d8c0272b48914b95f37e8ae92a25fabe6714e79ee90ef32d0d6a02fb55b72191ae5000", + "1defb8dc62e55cf8666b6f02ba3814095c686211a5194b214ef01a655f3ad03f71fcabac8760e2be64448207dd7a94e3c6502d272aabdb1bb2fece29ec4e82da01", + "96b40f52ac8edb532955af2b023078bb10a8583e06f50cb769aa79f27b6b1d6c487c1abfa02cade78f960698439569fc8fd75f88933c745ada0bc2c6efd7611201" + ] + }, + { + "address": "DJGUeQoBFUFmCeVSGkVY6DTcDzwAn3f6KX", + "bitcoin_address": "1EcNCc18ztioyPVqYARyMDtxgjRdeTgVoY", + "secret": "4fe0e662f034a0b4937c6d8ab1c9f49e6f612e8fcfd57d332705d69b05a2bee4", + "public": "0340c46145683e5aeb80354625ac586fa8142eea1894cb2b858a162673914701e1", + "signatures": [ + "d7a1198628f61f4925a314cd3468093d3231c99defa06f40bffe364693b5a06905d47a8a380666279e7a701d952ac3d148d99cfef84b60c39239cd2669ee641401", + "cb68e677160ff64bb60f5ebaf34317dfa0a88977819f807e5fca01320a493b192841804684874177c82a269eb867d118ad9e7e785d577b217b86a694a322c94e01", + "d901fe90a9b825ccdc5a0c7f154d839961658e6b0277310ebce6e27ff94ff05459b3356686cdd942060efe49413445e86ed1be410f5bbf88f0b4e5df35f9098e00", + "2c9d4bfc9ef82226b0b71cc4d725bc0b35ae15a8635e4c5900230b942ca0303e3a4ab3d5d57a02af7acd4bea6eb9d25fb52c3d0d43da43a854a309231ea9040f00", + "d01f41a7555d7d232e34dfcbfa6dffb0e0df120aecd9f6cace922c87ccc08063437073c07000b8b799ee52bb0cc438750502455141b5033a974eb3c4c7ead62000", + "908c2b370bd5a5bf23ee6e45211dd823bbc381e3d5b67b1a0844c7148b556c6e077ff844f4a17253993992be91ef1bd2f546f2847b9a5490fac0898e7536673b00", + "3fb2652982f07cb81c9b4df36b5719f29f42b2cd63f37227727a66652a757181620b676fe314394a9161e6a9193f6fea9244107d160bc02850484ebc0a2b1bc600", + "f1c38343dbcf9f4da4860554eeefa267cb18a35aeae5c0be0d6f4e81630b507860098120ce12924e7e237f4b72d0a3eb3669e687aea9b162db21417945ee679700", + "39332bf80f31e75d34ef1300cee7dbd87b5605d0714907e08d0cc552f86baf6e6346b68501bca34feb81f776af53053eaf36c91343d15e6e76d25f79c47fd6e801", + "c183c3f38336efe21ce302b914dcb06ef151f70bac7220c318b1cd68cc5d90f90a171263f5f67ca870fcb680e0307f1d872948d7d3458010864f0a3f284136b901" + ] + }, + { + "address": "Vh9Zt9oPMjsJxNVphCjiGUxHSixS48J3dF", + "bitcoin_address": "16J2S5ANbsY6SRVCoExeqwNPAXnjMoaHbK", + "secret": "c2fde07e45562dc50c18c1e7552e03ef28639c44b2bf3a4d363314203e3d5f4f", + "public": "02d40df519e11c34b78b2124820d5dc04c6f59f465d6263b68347a9f74a98048e7", + "signatures": [ + "a2d420be32276ba19ada464ae8b29eab9b07b20be80ed9a2998d7ed9cb872b767d4ddbaa6babeebac811a6dce35915d9279cc6d3c0a813fbc82a54dada6dfed401", + "4459aa264b6e3d724abc8043de82bb8eb3f2dbbca1367d4b36327738a37c2f842d92698747c24602274588a91c8b191d17f0b82fe10b48ef01a9defb14fb07bf01", + "7c890ef0145c41edbb3d56f37919efdc817b3d5e82976fe2ca0f98460315253325c47f553e91ab6a6c0531fefe7061d9c79f1f3983e46c7cc5d21fe7d4068b7701", + "20ed571ec5dbf4a322c3b447cc8d2b454150ddedf84ba086e5735451698f99101f86f82802643c9e49673f83a988d7b8193a011ce0a3c52e84c6fccb1172f8c700", + "64325c6f0ab86cadcb791a37de986659a83df1faeacd4112216b8ef2f7f0c1337c12e6af249244ed03a460c3b12636593cba964cce2beb052308d20777343b0501", + "1ed1e4d8ea4b5d925b7bc270d5013d11c5b99992c6f22fba3699c1b7fb08b79835f7ca88c52416b191cbba7cc275d7f5d9d6d693990d85c41e4a305469d0aa1400", + "02b1d63de47256007c751b9b7854ec997bf7c543af9f3536d831f2758643885b3e22d15755247365b21a5200aaada52e603b53187ad8ee5c73306ea8cd0a7cca00", + "3b7680d15858017a6795d2c3a3e292fbacf2604c5f7db30ef2270d9b6093648411dd4f1c1868a9cf2cbd51cba1a8c68f35f3492abfa9af493db4260e04438bf201", + "c1b24bcc8d83c07ab3bee8fd90cab612421c1e2eff21f03a26f49c933d94e4734b79ae74268d591b6b58d68b214b3458412f0585e9d2f9a7ae1b17ed36b0102d00", + "c0ba9d290f95ed0068e90cf68c4b98ee935d463820fa35cd152ca085b548dc6b08035498a6f23cc28da907ff320260b9aee8bc589c481629070673d4cb1cbb0501" + ] + }, + { + "address": "Z8JM2GA3ABPuKYwufFGkhvQrD2y52NFT2s", + "bitcoin_address": "1ELdqeuKfTjo6RBVPezv1B48txYzfK8vr", + "secret": "bdccd360c259b643e5f48a52043602ae46cf5f71a4604142794b687d21d1b8eb", + "public": "03fc611f00d187b85fb2d056a6a7e03a078939b1e9ff472c3f7b9575f5b459145d", + "signatures": [ + "7f023a6462b1eac2ad7226dbe884ffcb79cc640247f720a653cf62e4bca47d8519b98c45a7f5bb348f15f75cd33f5bdad5041dae85e9ba3ff073432a77f36bab00", + "1f9b6736fdaf0bc3934c687a0915acb1488f1ba30fee969c73f7f2dd16d011f65bb030cfb3738ac7dbed8b36585151f5adf2138075fcbe61ec7c3a2e0e5a6f2101", + "7fc3dab6e22ad333206069656f10ecc9600916f1cd0b49c5cc874c42102907f33bd20b18d4bf5bfdad1456eb7c8c7cfca1a676d525314f37f92977156af808fd00", + "a7697698ee9ab3368b5c6e75dca0fddf3f2ecf0378bd73481fd49e1d4f73a8b73988ea189cd301cf35b2bf4c9c8445f0a88bc2ed1d17f2e79f46336d6172442e00", + "0f6e0373d049e5cef26325258bdbc6d052826e18e26d8a7d4e7231d4c2f7f8af7f783fc5994c609e4acee8bc6777fcc62d40ee4595a2962b061475130b1e584f01", + "5727d799b297cf70b70c7267424f842cc78ff7853c7b56f0e47af60fe73a305f7713d11b418a1c4f214cfc2d87aeb5f90654e957a1752358a8bf160de86893af01", + "6abb7a9d88d099d1160ebb9f0f76e54874447214bea3d8bbcedae00c4eee34df5da3e84fb6cb35faa42688e7075351ef22b9b8543664dec354725de47c1f83b300", + "ee5966c6140b76fd30c4241c55ebb4e6e59be0546b41a7a2618a845b56edde5d63a0644551cca495bc6d1b4c8f8ba7067c3849391bba13a4a38a1c040f5ba44500", + "0692808145227bab7af3087c5e45f0fd2a468db2970c5fe37f0dfd2eab8dfc5752f18a2475a008f439c94d178a4b335304d4369096dc7e33735f73dcfa46e0a101", + "d6aabbf59d8b2ba240e9c415f95955892c7ea91e78e5c097ae126934a3ba6d592575f48b9ad58a1e65ebdd9d0464d5bfcbd4af4b849dca17d1dc2b17013623bc01" + ] + }, + { + "address": "22GWk6z8PQVKDoRNR9Mt3YusZBqf18RBdb2", + "bitcoin_address": "12rFcZuDzUcqYVyVKJsqX9tfBoZFk3C3Tf", + "secret": "02a29f33493d777d410677a8ffb9049ebd37c08e994e48ab7664b66f02fa034d", + "public": "03c2d659597aa5b59c6f64f7b75321d824432b5a41724a74a91a667d3a183e9d2c", + "signatures": [ + "94ba8c0c74b89e5bf2ea16b610de49b6cb82dab492228f7e2a08317fd32ffc994c0c440715c24bfa144d5e8f73d6bba3f66dedddd6524946eabad7733df86f0a00", + "ac497705c165952cedb8d8060cabc5753fa0de358af047a9569c0b989931ad25357887605eac25ecfd15fbd0c64eac6ddd65af25de11dd16ef24863f20886fa801", + "7a3c728bc7aeaf467d9285eb8b5200f9a9fdf97e9cc7c5fbf4fccc8a12c2d76b7a652321bba91e9f8a30569b56b5357a7b19a6b1870399dd9ac24ba5a199986d00", + "68bdd162a269d6536d8f03cfc395f5c3fbef268a18d6d85c535af73aac08d87d77c913500ef9fb9b5d6222d084111953b8f04f14ea7a73e1aabe36ef884ce32100", + "dfa9cb7e3a83c637e8759701edab94800808e4ae0611c6dd1a753b01431a84081ec0fe95dd4b0ad18884fc307d81292806ffcf837ccfec38ecc99f32659564b501", + "2ce3a840fa0cc355e9f0ba33571580c177753bffad543ceb20785319832eb6c71414d06f9c15e06311b201f8cb595f5abe5deb471a9efc8472ec1ffbd6765b3200", + "5b87c2450e587f2ba62fedb4fe46dd8b487ff19b24632c3dedc1999035457a37088c380db077ab84fd31cb414f80c99b05444dec8e0295f337a13f079747e8c300", + "712c0e4c8b261bb86d46b458c51fa33de865414dc008229d9fe523bc97a6eaba22b0b5e70be850b833a78db5e2cd4a3c64ec8380a7566d72bcb9a986234c84e001", + "e4671df444064977c74fccc8692f11eda6a7460765e437edda902d3c5aae2dd1353c88d783dc0200d769bd420d989155cbafffda4762795343055cd3d21ac7ec00", + "8c4077f1f6e7fdf022e0ab07b55b3f6c876e73879d1af32ce281f77cc936d4ad5a86667cb593d0c142efc707eb4f8e6c6770c8c72c2d89aa1fce466875afb7dd01" + ] + }, + { + "address": "Gy7bWVonUXNhGeuba6vuf9VCMxSDopVwXC", + "bitcoin_address": "1JQF1UpSoq3ytazfH3UKcfbNH2xM7UBaWa", + "secret": "127e2ae002a0089db7c77259210be6b39559f2de9e0dbf1a16e362c73e8e539e", + "public": "02b2bd36f4f2cec30c5679311a2a918b61593c46b6cf522908daafdc337bf6c73f", + "signatures": [ + "3c7e5cd75e42e58d4ffa2ca1a6f7d27df4c29454162329ee4395137fd911f90e2b3c855f37b20fdb915057be390de611ab7b9f8a306585a98bf37c9e9f9c74d601", + "5924e1c81b54945b3f1654ee12010984c18f39cdfe438339e672bb24b3ea245f55d46a79bf6359b41f08bd5317e7f52029ebf6a11001c184a2719f6e6312f94600", + "2dea341a911245608f6b92037f2ff9389ea009dca319db7ced270d766631d30043b8a627b5237d89c12c75085c84e0ea96e1a1cbb7ec44eb9b45646763cbba2b01", + "6270ba0e3dbd54f697f440cb4ec22c6551332ec07bd8040f6367df6717470fdc3957791332a244d270046d164124c80472ebaa7978d339df19dfbdab5c109d1f01", + "25ccbc38150545974f3b9cc52ef96130246fa9a3f64e6069a762989f5f8e9d8f015bad4faf0100a6eb0078770cf32c2bd997dea56facb314c47b3cdd37cc3d4501", + "6cdb3de2d53293aca9bfd74c6621c82af5f6e7102ecc4d658189d28021371791728c859162fa51f8b1823ceb19aa3037090bf18ce50fa5cbc56e5abd728eed4500", + "8253acc32c056cc0f10941e21ff25b17b4e2ff4ada8716315852e6ce459ee3b82f45747d867ccf0188a6b3799990e72298c31670f8bde9fd788c986e1779899500", + "7ea062c2bba7b93d31073f90df27a26543b67f357992fdcfa8e3a7db368cb0f141629c1498f010f2af86f1805556ccd4758fb8fbcc28a043e8b2025066d6f8b101", + "2e1270c4031965205ba2b8a4b85bc1945c0eed13b758e02fd627f96d89758b9f2f9819f90dc9f19fbb7f27c8b91adebba02055f72cd7ee3a07481587481c975001", + "8806abc33816a9fc503bc6f560f399b4073e8c27a42ad3e78ccaa643943164f41f8f0d016f9f32b25fcd98259b8e6d9244cdace4e0a813ec78d7ca6d9a89de9401" + ] + }, + { + "address": "C8jt5AnTY8rbxTpbY8JwWkPXYfoAQ4fikt", + "bitcoin_address": "1BYbAgQnbQ8tcMXfqEC7W1ZwhhRLqefgzZ", + "secret": "6612959069c41c6ed02d7e1a2a868a241fabb65bf8361c0082c797a87eafe119", + "public": "03e0f8e7fb3d410563352dbc65fdc0a42dd4f6c3702440c63f249d76b96585bafb", + "signatures": [ + "03fbaf561b2dc8eb519fdf55b887286d29ec6685ab043adcaefd84a5525a4e406d62f5209001e0dd07a5865603d36f29575322b21575d26e5644bf19bdaf46bb00", + "a5af3b7b26b4a0ef7099775a9ab9155b9619595146e584e794f08ccef4f870ac74b1cca792622fc0932025cc88f44a2b436e1035a377aa2fe31c51ee76fdcc4901", + "28bd55dc280a0d32cfc09325ba0c10cf83b45148d3b8e5b6e71f518c731426ee670a71850ce30bffd3faff287a75f338000b5faf4d3ce8e3625dbce87b09774d00", + "61b4dfe751c918060ea390cfe695b5284fddb0e260ed4a8fbd3bd50d2de7dc49260094650012c89f5f0a93fd5a29a0aa0a23a34dbdc46b0837801e6a2b8f744600", + "6ff07926f05fb316a1eed1bc6157681063c8545aab1b05b37f6d328564659cf0621bdb4935fc4d5dacd751132a1513b2ee23acc7eb7cc395e8a27a83b26f7eaa01", + "45ba72c2a125e68610f5f453709f4cd08e3be050f053bdc9d1788e65b2da7b085d36fee291feff41430a429a87a4b9cd8d43ea005e3b9f4b099a0c2c997983e401", + "4ab3341c870bc25dc9441a6e920b11ebb47cfda4f4645e51cdcea6fa99aeb68c06b5a0e4b3b41da3ecdcc5fb162609cf1f71d49c0461cbce484fd11c0a8557b700", + "aa253e2de851ccf7d3a41096ce5c0029cb4ac90f4ebee3eeb4395a54ac50361d3d16cfa3e8b764dcd8756f8d890bd5adfc72a43347c9ca81b072dec40b75ea3901", + "ecc90584883a76a56b914f73fd1367329db16d547e692a64fc59ba4ea86e5bf93598d53f0236834c98c3751795030578ba249fcbc69da087dd632886611ab96b01", + "0b9462cbe619e461b8a72a52194d0599cd63d130f10e905a1ffe8af03aa1584311953db3006f00e7d7273036b0d9c5347c3c586a8b8eeae315dafe6f8bb2340901" + ] + }, + { + "address": "baYpCovQfbz8Q2A9q5zp2AR4Q6hhCBL5pM", + "bitcoin_address": "18KpHaQ1jtQRV3GFdY4VECfdNXLFfWRZKj", + "secret": "1ec466e5d354246ba0b60dd2de440908d7909fa5c2443b67ee2d5d151b94bc3c", + "public": "02edc9f522f60e60763359f6fa8d55760ba814552961fba4e3035c2b722a89c2fa", + "signatures": [ + "7de1174714dd3ae5dbe8e6799cacdcbd03ae68b0440b04adeb46bb1136f333e55bd410dccc8489b3d01c5e4073a956caf4388bb803cc8d0105f22a585237a0ae01", + "2864b63a0ea3bec590a1cd4be61a31e086cae999fb7c78955fa86696fb3ace04753e70d4f14c83cb20b05bb9a30528aaba1f6f5a952995343495a4fb6c05079300", + "703edaf07205c2cc3bcfd26cf1608d679458bf92861880d7856489c42c50d712460335658b68625f9083430f5338d6bf42d3ba0f144f5ab533679556df92000a01", + "d4be1600c0cb92e0b07ca0263cd57d6c909849fdbbe5178fa97d983a406839a94c8b964b06066c27d13613d6addf21e151c630bff8c38092ed00de017d1562de00", + "c842070d8c933f4fd86667ed96cae99037195a88d5033dc76b95969766ccd9ac41432953188335399e7b2224958aaf08c5262bdff78a65f9191b5fa13547915d00", + "0dffc1ef0f4b1d62b997965a884728c25702d6fce447df95a0549e4cedfafcfd056ab44346bde268b8cd848b4e61d3c0ab8939cc251a935336ebe599886bde9800", + "d59b89ada61d412d26eb7a1451ff13c1872d93250243b359a368a1dac24566b0617172f14b76091b80f49bf8b02a8beaf85a461a521f1a977bbcfca1ad81225801", + "af4db82905ab7d4038d17c6c511cff360af7140ac3a99e5f9c4165d197f45185443fd0090e7be38f3be83cb3bb6fd2ab7b5f913fbfbfa0fb8c676936e995499701", + "005009764d6b272d9049808915172c3e8e38060c6227ea8fae538bbd273cd815393c215b0c04dce8400084dc3d83de618f7bb3f2f98f30a3a930b1e3286ac50100", + "85281a5f09289a2625bd5f23012e98c16ab43596c0bec18b64f47e0c67265b8020132a12b3c9e32c95c7155122ef88da0143d629f4256beb6c77db4077c562ad01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0005.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0005.golden new file mode 100644 index 00000000..9aba370d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0005.golden @@ -0,0 +1,185 @@ +{ + "seed": "rg==", + "keys": [ + { + "address": "E1YWJLum4Zo67o4HvSHcGwgTRRS5jsbM1S", + "bitcoin_address": "1ML9qfdnZfVa8UcWmTds5PuRo9nYxJQMVq", + "secret": "28cc037e29023331566461ef67695ec84cfe2e3963b3284cd39ee3be4340cb3f", + "public": "039f1cade86afd2d1c2aab43bb91f346dce39aade4f1c4539b68b220b2deafd2db", + "signatures": [ + "582ed859fd7ac1047451c96dece2fce048a7a2769dbf7d6e26fd6d8665ca77d74de3e4fff87cc8eae6d2be699110bdd461ad3d2cd26a5f3b0a1ee57eadb8926e00", + "65147b6a8bf3b95a29d3717c77c0673e03abfb2e1a1d087686272130b3120d5425970e25ef2f2fee5c094c41d3a6a61314b73c1d505b53bce259904854da270f00", + "be54697842c0ddc05fbc4456ed2d25c52c8cb6a421d63b69c8a74717a70245a9574314b50a9da78ee7ae1456693887b662699ec495e0192d6df6acc1fad1c28701", + "93bd2264ae0770bc43304dbf03d841044b92a9a0e1bcaf02616c9fc27981efea59bc48fdecde42419d8504889f2142d1912f68c2526ea6bac7bde4cc6899818900", + "279c3f244cd708c0382585497edbb979542362842f431bbb2fb79c1e32c349b95c53b90d170f18aac97fd8cf5f7a44d3e3d4ce80d44bfdcc28fdf96404c04f2200", + "790bd0d363885beb9ff0fbc40c2731a09efe3239a5c1bef3770f20845e15456967dae17ebf7672c3520b3f2056f1c041723d8adf6035a79bfadfa3538952368900", + "f7bd0099fd178cb133e8d756dc78b4ba9f35f0eee557d5a6cae15adfd3b5274c7b41077a8b1d938d7864cef8654ec0154f6698735fbfdddabdc11baed63b180f00", + "29e7751f0cee32a72664925334dfe384347524b950776f19bb8f1f65a6e709a23f9f8970f3e3bf47536a99ed2926aa5a9275b75f3383b3d34baf662c03bfbc5f00", + "a4db1d71434b9eb07c3f75e9b6f4116a0ce972420c1873e588410fbb89dc31ac3d812e71cf4909386dd46824f6baa9c5c3b6b27a5bc7f9e5988c60fdd5ec506f01", + "fcd688f407736fcf408a7aaf27f1b2cedb72f4f9f6de248c1b1be600d1a79d8200aadeb8d330062861b4a93c948d1be588d062d02c36bae498d3d969c4194c9a01" + ] + }, + { + "address": "2TXZrhjdPPVWX3mropZdAJ7C9tfKA1H5btJ", + "bitcoin_address": "13WWScVVP7psFr9YnDhAx2ztyDd7S33ffk", + "secret": "3a6ac4318cb089dee2fe368495932155be25dc2cfb1994986cdd5a4eeb97951d", + "public": "025a9903b928ef2f66596d3fec381bd8ab02be4dd419d6147a2839f4883720c424", + "signatures": [ + "0d1ce484bdef0becc50ccd02245871e1bd28338313ce57f754c931edab9a822638f9dcc028b722e0738d5beda6ff9ebe71db9a1c432bc144608a58da7b5a73a700", + "d1c15c29c7d9cfa1312ce992120ea80ad20b79d46edd91815c4bed09f414d4244882d6fdc99d7416a35f2af2a148ebf2adcf66d35e6f2acf9fb61d23ed31714201", + "8b746e791bdb92becec684471b0463aa4191ea1735599b5c48850693f79a1b4e195d559735e0db727ba02ed790cf17d724f2c8085bbc755b3e165eb7afe52aee00", + "4b8fe3f64d924f290d451cb3b34ad3433cf0f5a1e63e2ebaeadd8c19507a8f5d558d012dd1a348a7143a995f1d6fc87d476379843271c1a3b217eb835d6c1a5401", + "06548a750b3a35ebc8408d251aeec0e2deed67e37f297120acf78391ba611ef625bd64a40e2521acc1110b9fe4fbb47b8130a70d10e7f16f8d15ebdcae50cb4501", + "75d7cfcaaa4e9f483d11087f4e1460991b96a47e3c13be1c7711dab7f9fa9cf577085bdcd8be8f852efae4cdb5ff32acbb7c62f944565e5fa2773760279efa6401", + "2ab8f885369a6671cd27ff2990a8c363a7c4a06b7f83db97421443241204a410170c37e10c8912aba3475ed773b80853dfe6d17ed7d3918191ccbaf84640a62c00", + "8590c0d45abb75fa18976c9e5c9f28aaf157a5d00611321d7ae86d1adc4ef87a560dd28f3dec5db3ab0156c19431a19d900267a36d88bee206e42c17e0586d0f00", + "c4dfa4c79fa9ebdd739a89fac870cb8d38aa52480e63c59f42aa0046dcbbea5c2fca4e64421852c8dd62ff7870ca24fe44b5513374560d4aa49f60921ac712fc01", + "8a3d9436b8230a13ad2c00173e819deb4117fc106064b044ab560c89d7f01a065d6533d1d2aad1565b22f1b69d005ece97de62c6e8c45da8f853f532ecefa24f01" + ] + }, + { + "address": "PTu4VmJMkpSZNPyReRoH8n5MG1o3gaicPs", + "bitcoin_address": "1FBNEZxpmkDa11jUDNW9qQReUAjbgtPXUk", + "secret": "a9e8dce4a111f6e752bdf29a5879c2c5f77ecd1c5f612df3e9edb8b251df803c", + "public": "026c915201c05aac2a8893115fe41615a49ed8d601bbee9867c53c7e3813f95088", + "signatures": [ + "c723e8e7ac59644eb1a9a59e6b8dc261104e7f89cad7e7e508be71a93a9ecea70c63a10f0d93eb5edfb23b0183e0a654dd042cf2420c6228818e819f8a63a4c000", + "50bf3cd499902e7350d89531941af889a0dd9bb0e0bdea2282313c99b291a6884080095a1eeb55f5a65ebbd209d889dc264bb7da5ddb7e13706a88dc532e3c5401", + "f4a9c141f072faf21151839182d55e841e48ce3d793e14ffc36088ffd76b1d650760bb36721ae64b2792cf2eed0afb0fe1d862d42ba9673348382ff3f1ca245f01", + "37a7ff5a750b8b77fe93cc01f71f4d4a324ac70fd5d1527d5ab41c1775f09087321f3da3198c38bbef0cbb886596804a22006c704f6592652aae8366a1784e9201", + "95fa2b244623e26c29ee4cf050c73cac85f1b49246790f34838d2922e4b3c90d28377d332cd9f9bf122afccc889a84930b5ec196b399c9550b1b83372ad7486e01", + "b391dc7753846b34c00091914219addb98d2c8f843d21c72c8f0b57c9292ee4642599181c94129464cbdd8704b93babe7cc0b76d281555536a93b6a17ccf042001", + "54325c4d401df59c618bc76f16c1684f3cc25aad328f5944d232a9f0a3170d8a393ec2c78c7389be320044f0770bb6c2f9b97a0c8df111425f7683753c783e7600", + "9479da56bd083cd4e8f53e492e651105659ac18682488ccf9019084d14c8fa9560873c07e85f5fc002e573ff7c5465b8167382652d088082ec8584f93db0d5d301", + "a4c4429e46ab80549c155fbf05fd7ff5d1adc497024cff628f751522ce429a825856c0c7f62a1dc92fd95d62bacecc002a6800d41ef6db5d8737dacb9d60e08601", + "fc82184adaf042736fd92e36fc42dc7e0b63125b6014916065bd3858402a4d891c8c206bc05f3a60ed6623b107ee34ea8bfb5182e5d75c33b8b5672ec5c536c100" + ] + }, + { + "address": "mkx9CqV8vnX8m6wgMiQbW8gLLnHh6vGz4N", + "bitcoin_address": "1P5u52Q7fYKEnCnyUV1fZDQts8uVdo34ns", + "secret": "ec677f802da9627a8c4a90d385ae68399bfbb69c15dea4cba08573cd81ac5a9a", + "public": "038797d2c1174dbb2e128e165c9d3814cbbebcce024c6fd459043f0dc661c7db24", + "signatures": [ + "273a38e3d7ba7ac27064fb70420911526994f497976c809803cbf933b95651f570c82ed60b0d5eee3e434754f525716ba85d1fb4f4b6ccd85680f12c178af1fe00", + "e4efd05ec215a0bccf810283ce8397f023cb79cf549e9b84cc9a879da14a1def127b603baf0756698db559d4ce57f12c84a90233eb952857e3864236bfe413f900", + "cd7bdb06aa7c5fe19a365ed29c120edc4936443b074437e048a174525fc8a49678e6e5d34355d771835c176f281341eb621d1c9912db8d04d51ef9e8289b3c6301", + "186363b97aa04417a725771ab2f53219f75bbedcca84a7720c542bcf1b7a7bac1d195cad9b52b23efc8278e0035856d1c405220164b29189ed094dec7618656600", + "c6eec9029162fad395aca44947e6cda7517f10835e5ca801462fe7a868086eef3cf8d712bdda3f4aae38b288c09a3851cf6d8f418721886a0a8e87e9fab6bf2200", + "aefb39fc91f106de7f7349b53ce3e8efa97986ce3503e8ab527af820aaae04a053cf336698cebec7d306cf5c52618ff77aca763ae5393ce8d5f45a580ef9ad8a00", + "7f2ace494c7b7ddc380da34d60ef4152f1cdf8bdfe082603d86a9d52a543e66253635ec64531f6b09d5a546549300d0df2ded35ec25e84f7b0a961f8b392423500", + "1fc025543feb8990d415283e946d3d42593e3f4259ad36de79d3211640b61c2607da58688dc13734c15beb10018238aa22cea4460deb1c0a95626699c0b58f8201", + "a08ecaa36a67fffac7189c82a72ef65a419f8ac513cf87e7d1e2780c25da17e72d21e72755f88d6fad7f5c9b21fcb5d9ff3e1cc0796d46b978e0023663fed85d00", + "58733846895c696b0dc113a50751747fdb0dcf32b43171acc591013c2c6fbd7239f707a1c5820a8b922544d2cbd3f49bdcbba5e7bf28db69035bf30b202da4b601" + ] + }, + { + "address": "ufRofY1rDAa2QQojenfxsM4X6ibkqCeEb6", + "bitcoin_address": "12wjNx51QuZhedTPmHutbtvpkGZCSfabcn", + "secret": "661e38c38e3a9a5463be99e2e57d9dd6efd5569545cc0d4eda18be36911408e4", + "public": "025b6f563fdaf60aef899c7ea420397602b1b3ff23ff7a36230cfe55fd88368b8b", + "signatures": [ + "fc478aaf82572939f34775beba8665c9fe1366969dbe69dffc17824447f45192506556092180d7f76d3a317902e33a9706fce4d9dd41cfbc29794e31d00d123501", + "53bf45832787f16e51cb6bb8468a790cd494a3719b4430b84d1d4050a487d7ce347fc6e1cc810583b681447bbbbe0c9b2a98b12552417a4c687ce4de59de5e8400", + "fce73f2e0970d1d02338d808609010351a2c3cfa41f63e7e632b32741978f598158096d5dcc54584b05e288b3522db48d01e6295a1a64750d8c971e734d0597200", + "c44114e4381adc869165fc09554859f1f920e8cb25abbd10bda4f20c34fce4665b4403b43ab653f14354ca43e1cdc78e669b5448e4b9db5424704253141b62c500", + "80f551c54136d983cccb8e656eeba08874318b0fbb1239d2d0306d49a262591e7c44cfba78775ea5153b2bea5e6c108398b17c20fd8e401929c5e36aaa3b692801", + "4c978f3ffb2986d0251e54672cc393e1bbfed047083fd3ada43544bb2beb3f9b14f79550b5251431a4993ade176063589dc0df26ff16355b65b5ad6e06d9892100", + "460dc20c24368bc2793c15df634b3da1ecf55ce3d86507514a03d9b945663cf00887da944dc845fb1ef423e7ab51fe556b7391d697e6a69400e1e676f1ac24fe00", + "c90f01c37871140f69d90b2c5338ee058b0baacf05277bd5d1945fe465cbe0670133edf40c746ac174a5926b102dea63cde0e283e7d7d6b7cbb1faed0f5ffbe101", + "1ead603fecd7f7860eaed98169f33f479e45ca8ee2aa8bd220e9e602123435c84581a5f8603b2a9d16fd5811a3e6ade670fdc5114d7300bb1e12990c5c9eef4000", + "6731612a2c6b5ec693f8c710c9633840f321e572ae0a2a0e641193bd1fa543f55acf916bc16438ab756b365cefa68d749569fc49bd75a993cf193ab3036ea9b900" + ] + }, + { + "address": "jhRanaAD1Ta8fVFa6jR7u8sMtnABK8i6Fa", + "bitcoin_address": "1KaTpAZt4WWKQ33N1gvEbRNrjVZnLeE3DZ", + "secret": "1d3da4928ba90d5bf443fd7fb56a6ebfc2a01fcc30ee33eaf8465d82b683850b", + "public": "03f3cfdd8ef2bf64c313f2feb8e9a0124bcd5d633134fd8eed177f46e957a77e96", + "signatures": [ + "813cc034cb0a590d2b264178509c874a27978e1590b39536319fba150cf16727759965f1c02ec72d01d2c76b403753460cb569739a2b4193f94184508c5733ad01", + "eb31c1e18718ea401dd5b1bbeda01886a4c40272c8f6d0d56a5ecde09df3085d513be8293fb7e47d37de19849a756ee6fc7ac73f3a8a215b2096c5f7662cf2ba01", + "a8850cdf7936d3f8339029efa5bea9c9422719c52fd31386044c0f7ab8a628622b118d80df8a5972a5e0736de5a2ddb9684fdb8d620f7a68dd72e4a09c10bc7601", + "9d6c8ca1145714afed5a3b6e2ee995375ab6262cccf0d24f22cd7067a4350ed0751dd15bbe7ebac345a4d56d75a3c850f229d3aae44dfb7916c39e07f252d37900", + "84eb2b5c4d183334cfe54dc7601217f81672985a6f2504440ea867cea0eb8446193a6f82d38a1bf7a32c3d8f2bbd3afb57767837986537a1d9b7dfd05e4552e601", + "afb88d11917ae3cc498bf982efa0e5afb1c2d23eccd20dd5494766e763673dfb664aff38e6f6482deb6cb05f38439355ca3ffa395af381cafb8353a105cd321500", + "a4f772b50f0e7ad5bfac148f58bad6bf83a98954d04d51608a9a218b9adc1e5417fb5ca3210a3f04d0dfa2ab09e44f6b667a51f6f005e8366d83032e219706bb01", + "21bcb3564cafda1143937042447b79a89bf128d881a88099654a12c5ebc05f4b6b477da247639e2080f1e0a0c0c5cd5180f902735e634026235c2f3e1a9407db01", + "18259cab8828b0a8b4fdf6b116ea053a82e1ddb71ac3b8868d8f14b4ed3b8d290dbad8a67f9ebe626ecc213db20e3fd90ebda5edb995682be0afa8f35690bebd00", + "41d91535c7fd4a9d7835149d3eec0c72b90a6d1b73a92dc91c35af16f2d35c107bf9e4c2123e09921439e161891becc5a2be9c5ddbc8b1795cc6804ed3eab34901" + ] + }, + { + "address": "77W85kDVi2ygMY6EjQffPtZQ2A5K1kJeTp", + "bitcoin_address": "1GCs6JcqPYoZ8m4qNVQHKHboPbUaRjEvKz", + "secret": "450e7d29bdee2f8a2e15ae2730152483498dd0b31dfc693ec7e4fbc6eac502fc", + "public": "024e94e6e275c8a3c6e409c91b071b70c0c1ca2ddfbfd3d08cc76c1a98ea719eec", + "signatures": [ + "647bbd3dd48454ed1ca0075cc15a39a2be0c91842dfaa57907eabaf9ca6d561219e69cdd04804ac2b83508b779a2acb71cd3bae1f6e9e8352a8b1d9240fe9dc700", + "04e7cf21fbddb4b196ddda4b75bbc92e82f7ec92fae5c824da045e352845b4a127f84d07069132fc1530b425fc64791d556733422ecf6a571425f622b58cdd1f00", + "90545da6f9a0e89c703bea93df3ce2ca7c8cb05d137659a2a3407707164913f928712322ee2067b26ebff4cf052f811e630936f0ce21affcdc7d99f21e25fbe800", + "21ed7cee0e1df586105273b54228c54a21e7621fd97592d6ba5501e2a277ef7b03282b2109dc87c2770d28c3c9b381ad82c7c79b619322a1f797b5c95d95a9ea00", + "0f4fcd6374b0b9aa05a3a702e41afea1173bac9077f8b5d037395097ac5482931775f134d59c55f546ff33211bb1ca83911c1901f2e4aa44358d3e2df97a558000", + "4b3f21d76694fe2f03012f2f4cb506e128f610ea3e8738ac94f22523bf5e1f4830e712d3902342ae2779c49cb8ab05de744540443f69900f1904f5b2e5a767b901", + "e1a91763cc1105ea763e67b9cd1c25f74d41b39f400df22003d779f2c91e4ee20ef444a3c454f8eedfc6b127c8961be3e6b25a75db3ad49451774606d35bfb2c00", + "395b880f1c233c3c12c0a7d9ce08c5e95e35873e7b5659f8a1472f9a197f59d8345bf678724bdc2f83138cff4c3ccc5de81bb074efeeb2105a4aa28e66825e6e00", + "0ea0f9b45f425ea224675d88e24c092e369a2d2a969ac0bc959d4d7b1418c10223aab768d397b7a71967e27e3eef91494260b43a9da4460ed5f973220221c6cd01", + "4142a63fc2be7e70c9da1501360b84662bd02eda9dc2d7d5e6c6217d075d1d683faa45cea9069cc8fff98348c7f2f31ea30ef5da710f27a9203d13a41b89c00601" + ] + }, + { + "address": "2fDFwpM7P6tK3krFcrhaYY2x93B7D86dCnq", + "bitcoin_address": "1KxE7DPgoZMWSgFQth4J6jEhSmrf919Mxe", + "secret": "189bd3947f4682e4bbdff3195eb88cc75c023248242fc1a2d3e37d707551e593", + "public": "02ba296ae39678461dc7a1963624b71f8038d6f74785f01d8e884c72f228cf7e88", + "signatures": [ + "89fe07b2f3da7f6e1c5de1dc60111033b8976a7e79e7fcf062c0c8ab3d7e9ea0206e68b8b01170fb5d7f491142725573625b3a006df68af15836496f00013b1900", + "62923dcc288cf2e7a118e44a4e087d13c86cc63f1f5157f0199ae98a900eb81d20702990fb9804c7d3ee668ddb80ed1cb36855ce479b54f0971ef7300373e72d01", + "59479f47a39299809c24b8e206f129d204597f2bfb416bbfbd4b8608a1d89fe33d3c1ccc4ac469393b12ef514f5c82d2e2ca780187ba1ab1e376f164649cf62501", + "d3fd138264c4b63d19341ba742456ff50b63bfb62bd7b2d70f18901a1d1478b73f03e45328e587d0f11c16c3dbd43c1ddab6c4ad989975e47093a4362287313200", + "397e578ba4e262ac884394d924650ea6b5065c72ea0ad1e917ba256875afca776055d0cfb36f4720d76f7b276da462fcd09e2f3ff791827660cd3ac139d1deb801", + "9fa423cad02fb69b578d38a059bcbe142ff273a91a042f61da0f73b72c80f8e24ed3a7cd1c8986af7de8ca603b2fd09812d14c098556fcb3879be8fd65fde9a501", + "a35ad7955b416e9db5f0070fcfcd601084ea72d313f1f5f20fe7ddda8f4e8cb0608d0a524ec33c0c7c7b9e22942cc26c13f1b5d986695ad9611aa38490dcd2d900", + "ea661e1459ead9509b69621676e1bc53ab2844c189df802caba4894d22daf93b1711c6ed4095ecf989794c5ff7f6af97f2cdb200fc4185b657a986b75910c90500", + "16064c60d7077e55795adc7c0f34ab0fdaffdedb7a128e99c0af9f1365463ffe62c8e537e4f591b0dcd3a26393f04eaa0651a9fd4f3d9152da2cc96e3b0590af01", + "98ecc21e4cc24e917150352ff2cd1df43a18fd7c81934ab5826763d300848962261ba895d13a8b5d102c1b4897cefcc5ae3bb777dfd882dbcc3a0437b1a7d9d301" + ] + }, + { + "address": "Ly5LPYccXjDtx3EA1Amb6kwZe4xL2HTCJT", + "bitcoin_address": "1cwEbutdfQrEJ8yvFA6VcumVYARuKwXf6", + "secret": "2a00b256c613cf7de4acb7b47efb7b5be2cc328012717f3d585e6eea02df6f53", + "public": "03713f5421167dd1b76aeccb351d4bcf4086edc9c9be95d4f9efc4b27bb41c93b9", + "signatures": [ + "e8b8246e1dd328a7fd59d5e5023ae736d14f03f55c71a1e164642f0abd2d46975c27ae7b4ba1cd0acb39cf55fb24e7c6146011e3bb4fa7d425693b0ee8a3fd2901", + "c92fff56058c70c86863c7b703cf245a73ef615f4985c9951b2647be5c4b543f0c840ef819c7bf0583a11627785ab310a21338597fbc8900aa2f0b21fe81f90701", + "4f319b9e8697570ca0acae7423498da1aae0b53497f5feb3752279c7416498eb4b8a0b61f9be697dbe59bf9071c4c507fc0d6f59cfa29003aba8789a2caf5cde01", + "6ca0e05d533fffd7a3514c8d0cf7be303cb901dd19171a07b9dedccdcee28c830231e465c24d2f728dc88e9d9a742923b237f69132fdd45d282bad446e60750501", + "e8a4f6ce818a4a66e9fec715a01d4412d6bc8ec64199764f6864cd1004a6a54919897cc7403ef9106a5dfc76c16d56fbfcfe6f72f762726715148a09322bd5eb01", + "f236ab0ccb778d2cb2f3b1c94ed6e2aca5c2dee17a0fbb5bd560cc463e4fc8602e60c1dba5efab13f452a6b205cc231cf65bd015183855ea00d457a5fa0bd34201", + "d0114bad79c8173035bbbb330ce157fc1c1cee17de0801ac594d2b86931f42c54cb01efe70cc49bbcbffd85f363821efda30357e819d9a71e64f092b53f18cf500", + "6830f56c0c6db89cebe1672b1ad58ab4691e72c8e7ab44430cea79f1df58924504154d1f6109526f57d53f89186c4c631755123274d53365de0fc8c74ea2ff1e00", + "c580993fc7bf98f4d75d64119ae5e3472d2108add0a3ac427470b253433d9f8d36ab1e2e2e60cda7b7701ba0a78387df04ee3679a5fe0011306d8ee29ebd102100", + "a90ad4f18a5292bbf30e6b6a9e8143573524823d3e6b0a066ed78b3e9f30be6c0285e6554e6e9a1c24a01809dc7e0d439fdb57ac054259ec10895a52a5c2873400" + ] + }, + { + "address": "fVskJWYkJekapAcR3QQvBsegn63BkRCsE", + "bitcoin_address": "1Er2JKisz7jZ4WUS2AzoiEnciKRo92rGMF", + "secret": "115c197195ed609ebb91e4d81a5fa57f0819ce9e08774a330db4fa52d97417da", + "public": "024a4807e5f3c20b777705cee1a58905355232210e84b72c74e25cffd9fcb110ed", + "signatures": [ + "f210a289f3cf7dea3476400432a8a64e7b2c62a3b12e8f3fd9c8c22d4928e5c607894263fcbd23e0538dae2deb979b555d11539034b8ff31f99fc7f51d69a30100", + "f463eb2677fa97af9666a103e110010484197271ef4e710dd792b8fe0964c9b8307c9c40fdf5633d278f3ad3fc1f00b10c42310d11135158851b6b19edbccab901", + "14e222fff75aa114b3145022a34eadc6abb64e69e7f1b905430c38b7e4e4af294c720a884a9c16f44c8386cb91cd53b2af334da27177fb4f1d282ebfeeb80aa401", + "9df1ad76f388829b069d4474c4ecf0d8bf7de01a31e287b10fcc883c4fa714441490fb088d0586402cfdda4202e4f648ef9257be506daadb9803ddb84545eed200", + "9c83abbf506869f684bdec893a5d5d1291929c6b66e9fd35ebe655e1528f2b0d63563a380785345aab85e375132b7257b6b26a066b6a20c9c8ec58adea33122001", + "80b6477e48dbb5ea75eab67eb887fce8229ba9352fdf1175f6e502301be5ff0e370504d8ccf447dc76e58ebf0a8effcd3604b5f3935fefb78e6230fb1aa3df9a00", + "2bb168b7613b165187391ea14889863d43a8d967e63edee1fae608d2cfb7a7ff4939a76a1571e67481065c4e56a72d2bdd55877c474fd62dfaffcc6926a360bb00", + "eff83a7caddce6009dd76d07a5a9a09478e3300dacb39c4aca637d653ec4cdfb380bf7e83aa27fdc632467b4a64834055012601d05306ef3aa7cecc86f50ddd000", + "6f87163870bd241190f9bca7d3df36901d8139892f21a6db2575cc5b7f1cc55a21d85e68bc73fac1e2d29fe01d51fbd55741e7a727ced4947c8d6712f64dcf5801", + "7ecaa15895a85a13a2f8faeaca642e4439187f1899fadc7f954624764b29b64e0e617808ff959e0a584284f65931807817d3ae23255ee8cce74a8b65412507bb00" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0006.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0006.golden new file mode 100644 index 00000000..28bcc8ec --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0006.golden @@ -0,0 +1,185 @@ +{ + "seed": "5MnQdu6vWeP9NddFiehxsGwspc8aff/Fuzs5W3c6L1I=", + "keys": [ + { + "address": "rLjV76Fayt9WU5rk19FnzWeZEbF8nWqGHH", + "bitcoin_address": "1GL7YXV85q9GDmGXThGx5bYhy26S6H5LhU", + "secret": "953b69e03457e239449ef051aee7a5fd9ad4f832bc60e8915e0f07b52598206b", + "public": "0296d12f5627840862172af9aa4a22574c427e60bfccdeef22e675b137b439b92b", + "signatures": [ + "4c9836174cf0204d88ec36d6cebf72aaabd1c5085ebba250e12e5fa21e629a9e78d71b3a0faced4cfdf037110b452acca16e2efae3a16efaa84c5132951139f600", + "e27307fdd00c852a4d209fa94502e580d7aa33c64cdf811c743c394430f1b2d361a1108937a57fe35ceba04b96498421f8210fe32cfe1223601565b918e70e9c01", + "d29f5c767b865f6311218d23cccf4dbc728a4cb4a148c7863a4475e4aae268af27e38557216a8290ba01fe1047b7400c6743388f75d999af176e3bbc1957ac2000", + "30d45245cc67ae3ca1bc840d90e3535ede9ce5008796a2c90250f7de86500da86f17b19a343ef2051d3526fd33a5894927b09234b86f58f469a3f1d018094dc401", + "826d791c834ed696f9f961f0a7f971716c66efe58a6ccce16e4b3cf834fc49d95051cc8bea2cf183a1d05b04ba9ed407648329f51224781a27bc01fc1fe75d2101", + "b0fbf1f4e21d32b4f3a6398da88e8d4dec7f20eddc4938d7fc493997254245fe257ab78edf9412fe3cc1d773e3c28b41669504baed686320abdd0edf21f2259d01", + "7515f2946fc8e43199818bb95926934d6a5be0722782ad44fbc67489019564094f378b3c57d1b11bcfe14bf2c0eae08aa9b9186f7b1c072a03ecc03ba416f33801", + "870ce446e34720816170da99f49a843537ff6cf299d7562af82fd9025deafb0b315529625a47049408d081da2b3429f555c74d7657917b8f7ba8fe0fefe0cd0f01", + "94fe3ce87ddc7f386fa597df17d53d9aa33d01a8aa2ab37a18a40128541af8874e1e05cbb6429f40710d945ae493aa033387696884788dd9ef9322030f1c246300", + "1700b3a08d9733e486dbbd26f67b48add3b43d72a952930c786ab44e5f31866f14d20319a6b1a72bdbb091d89ef7bd55ce9078c8c86aa2f0bc30e75f13b8142201" + ] + }, + { + "address": "2d94nXraZtkPD2GiSCfzugewm9cRbCVDNnm", + "bitcoin_address": "18n9xYGZhqQ7bjgSgf54KvGWVt8bjgujac", + "secret": "4f8db9121a8fb6bdbc8de701593e953b6022431d9045b914e58c0fbf109cf1cb", + "public": "029cc260c200b5893e55faa5f23baf6268e0f20e77ee1b524b37f6e1e6ca9a1814", + "signatures": [ + "96cc1e166e56335bc6f859557ef73c2b7a96e3cbca0f32d901052fa55023a88732b40ce4e45ee236ffc07e0c4d2db6c294cc7f1d3a2f39d5e6e0f11da3c2259b00", + "7478758d8006ecb8103311c394931722a03f3bcdddeada8afd37b9d93b39d67033833444097d3d979bd9913526300f6491107be0d31acad6c28591d8529e24cc01", + "db8a4f5dd1d5cd811cd08f4ac1c4effb55ee93498f7d5f4d1531c315f047ffba605861a92e5d5358a87e7763ac223c6edc2489c9a08ebdbd3d37e7728ade58f300", + "7dd0865d18a574266d0dd3b173e03c2e8cf92ae77af99a8f68b9c7db2837326c769c69968837647d5b763a13f1caa9cef07804cbd814140d66607b0d151014c900", + "7f97f9fa0d45f1eda3e985b3e64b4656ef38480644c355b644e01dd772aa7c374db2e37f819d008d2da57d564fce1c0544e17206f3200dd12161777428c383c401", + "7a1aa12c91e34842ab1b8cdfc3e4d46d2f1a8af0267ff74aeb24a942d78fcd544438341e30c91c161689491514bb1d19e6881758007b25f0e6a87be044ea8c3d00", + "b823e93c1fa6e3391910ca4e461c58e51118e76470dc88506f183f6661f8ff0f03e4e4f1c58c06ff40446dccc0b9a9bb65b7793589e8402860f0d60f368659ca00", + "36751c77d88427b43ef8b68f15a2cdb48225a98e506d40fbb09f442cd513621615fb62d138933d7b88812f054be3c21ce1a626162abcc705bd45d4299c5ed15800", + "0932a2f7eedb5f7b9fc67602c1379254682892da2af0b5b8ac06d417b5136b756b96c281c4ab3735b9e3f8195747128b4cb46a704702b42d54c99e2b79ea98db00", + "9a7b5f8c7a78eaae1fc9c6ec63372297748a3e977a3b06919ececd3859e0ff5973c2fe2effedc1b01888f87d1ebfeb7b96dfb5dd6a9c96f804dfe56e9504c0dd01" + ] + }, + { + "address": "gVpAMGVd271pzHcNZiMzU7FDNqUiP78BwT", + "bitcoin_address": "1KhP54Cd5pfE492oqWxKxNxiJ7FEinv6hU", + "secret": "1a59b0065001a05a93d72d5939fddb148c5cfb775a0e2a27a99c6d54372939ca", + "public": "036de1827a8524f166854bc7b85510d17ebe0369fe828d8f8c40e930569dce118d", + "signatures": [ + "0dd770f09abc025ea1f3bc25b8910f85ddc5bd2adbfde66d247607a069405bb10cc60ee15cf03524dd5c15365214401b0d911110ac2ec6d530850c097bd543cd00", + "69b432114a086fb15dc22d85340d605bb73e81dcc48b2d3ac776fc84686e19304850f09c69d54dae0b30704a7693a33956303c5118cde508295927599e13cc6501", + "0f43fcde4a728d8c8a354aaaf12bf7585f52cbef863d99c63c9a0308ea53a5a32af018116c1669667ac5a62acadc0ef198dbac3d72821ea300b5459de615b91e00", + "af29eb64035e6e7282927df51f1506e5b0d12db63fdd567a23bd386e086d1559770b918ae23d51a73cf6059c8475f611c786b81c6b15233a2b707cdffa71af6600", + "7ee7e341312c1c2fbc6179f325a58cb592b740353431679e178213cdfd0cc0726247a34b9379559fa091eaf45e5b4e39e7687eb83729f409c6cdba842bba197601", + "18aa13d884feab6eb0d57fc85500cc714a49b45ca1529f4cc6eb5c6521e0126c027679f19d06d629789480342209ffcec217e0620d632cfb82afdae61c53c14500", + "3256f3bae51169f46403562616cf71988324e86bfdb7e7c24f431fbd4451ed29302dd9762a2a296f9cbb58dc757c2d0757fce4601977547c6a54a30dfe56c9f000", + "3214ce760c0f3dfc8463c85b4c5bf1c81759c3d45e85d8d061af54bae927ebb3297b7e30e9a24341b1a620d81a8cdc7e5bcaca4bae94e910a8dd4111bac8956601", + "bbbac8d56a6c385825c5549fe5efd900331864550d4c56f9930c3eae8e1f34ef7d6fb9c51f731aa4d501b224f37ce6ac73141f2bbfdcb881379d4d019761c59b01", + "f3fb7ea9622f83cba22743363780060afd9c6e5a46971636edccb41c90332caf6340aaf635bea94085b8cefe0533536bcc0076ab305bf0ca30dedf9e8d9ba35e01" + ] + }, + { + "address": "2TpmTjZqMDwwnmMum5CqDZjyjekoQxctUaZ", + "bitcoin_address": "15PpWQEfVTcRdygX68G2KJAyXASydjS7Ch", + "secret": "df84bb1a455c464ebb1da23257ce7e2998d6a2f92e2864a9e9adddd3f017d784", + "public": "03a9aa938ee9aec021db0717c0737973e68a39b4d0a2b0c168135a98a1a7c64dbe", + "signatures": [ + "2c64c71319bb1650d862f7d7d981947866d3249dd88f18e7955cec62343e6b5d68fa07470cf84d29731989f2c7b5132de1197cc54af7c13b0ac93b09c3779f0801", + "0023899b5ec712d998eed46bdba397be815fe1d0bf17dd1fed798a7d6cebd90e15ef600c2ef755cbfaea7705cf8f9c151b59c652775dcb8a1bf193a0f157844100", + "f291b5461df348d6b63e956b8ceff056c85dc80062fb4109f8ad4b7c92e64b5a3be753846525a0929e10223e6b50d6ab3705f259d515a4e861172171ab40bc4e00", + "3338f44cfaa47203cc6b7f40608a4a7391e3116244e7e3c2926d895bbd42d6841954685b36f65007fd768dd99b54f398de79d57355e5fd1d70f88ad83e27153000", + "a6fa07fdf20f918b7e834c258c759b8c8c701d990e879cbf3031935afc21ef882ef1e5802e4a6203a4e8be329f629185031948f46362ab8b9798990f10ded16c00", + "147ad65314e28af6c3153d74e278777184d4da1daf328f90da98f1f2049254a843d780f7ff795bc5e64960555355ea600897dcc6aeff4ad9e20b98d37702386800", + "8b6a680ec0484a272a0bfe3a22e3d2e764b78e71f0f616ca678d350b46aa8ff90d8d4c1281dea8ed555f90ca721da4960268e3376d752c772c2bf1114fb9b80900", + "a978234a0f34f7acda0716902b32a13738532ffe1f80b7f2194f5f595cc5f0f4083163aa767d6d84d40a0ec8f2ba9cd7a29e7778aadc15387201b6d3418d391500", + "5e4a552f73c260759372db4b6ab76dceab031ee738aae499b0495b214e7664a50fc03a74d2fe5c04e77edba12149b37beff9d4b247d3cacefc09696f7f67e2a801", + "838b75641e209dc77a8b72e7ae3ff0cd00df644abf5889949ccbabce2bccb3e563525b3bfed5ef54785432b87206342ead57e1b404235bc96b32980a570b25e100" + ] + }, + { + "address": "2fznUrLmmNj3vrq6kqhYTPdEcxsPF3gd2Bc", + "bitcoin_address": "1EgxcUiXQiP467VJqtHTh7MapbESARYUBm", + "secret": "49db3eb8a8973862917e151d92ad0d159a5a11de20ca3fe299f2fc4ec71a9161", + "public": "03b0f175d8daf4d0b353cd28a6d454a39cedfe58d4d9447b47bf19cdcdc985b2c8", + "signatures": [ + "ca098ae575f90a7cb8a33024977b5511b54be8207ee45e607d0a1b2b01df75053eb358c3d1afc7cd6a14d127f37217def7d617fae164ed865fbb6edcd519bd1d00", + "3a57e71e97f360e0760586b567d9a9cd54aa578348c5ccc5b8105aab532ba4396ff942cfee75b255b39a60bdf8dfdd86218301a233b113da1110de51502f8a1500", + "67b95edd21d74b9348e2f1a9b04459edb63a1f6025f967f3e9bf237b01bc1dff426287145206d285984881a76d353416b0a09092f020389a26dc6ed2083a479101", + "929c014bbc57f925525698c7d382d98b7997a46bd8ef5d6cb195fea87a7c45575c55a8e9d9578f0847fad452b39a32e25968d546cd90bc9ce4adb0d9f9d82fa200", + "763f05ac9198194298c92246ac056bf1b9f92c808260aca82fa976b803d11c8d1e2afaa965baa5ecf38d656e3ca3c2035ba18518765a7aac0bb6d9106fef6fbb00", + "3abe07f94713ca02e09662cc1127822cb7c8a2fd68ecfe859777dc818c67e94331366941b9e3131d3f8173a504982f043d985e00de6291bc48fd2e7a362f9ee601", + "5f2062b454a14402f952b1f82e275c9e94d5a803302b7d960aa8fe739157b7dc6ebc1f8b284e2a1f7b94b7622a1cbd6928a8596cd843f93cb829b919f9d1e50600", + "61803922611692eb0f4776862841583e6e31844c71f12af2e6eb1316350017f731a6be87b0dee2ed0e32ad98f72e1e86ad50a481a2b153226b532e3473020ec201", + "c08e615dc8e024d42e22553de77971c3eb19de95e178528be685c2c9fe3f64aa59541a40158a3ced9a4aa974b0fad13e57d9bc6fe182c78b5a3a9f37dbcace5a01", + "fdef54961fc0756322e658a993f3cc4e982b770483ee763fc40bfff7b37943c771e7a4f44b4bd48dee2c0a722f184f0c8faa22173c3b2f1da0a3d3ac2965f3f901" + ] + }, + { + "address": "2gQbpB4v3yXRyF6oorigjnUUQaNzM8KuQtD", + "bitcoin_address": "1HMtJ331rLQR2FhxydXRViun2tQxB7GWL1", + "secret": "60961b0cb2ff7ec60965404fed8b5dbf29edbec06bb8325b03957ea5cc191970", + "public": "02c4534d31801b121ff729abc6873ac9ce3fca7f8f87f4b4aa001a9990845bed33", + "signatures": [ + "8502a96792de276b98893482baea1d2d1b1cfd7aa6e028662400f3f59212b034270f86e8f98a38a8b3bc0452afe3c51730fe321833d97a6f2af0a75f239a565901", + "f80fbe0a4126504ea331b1eda8c0ba9c33ae9bbe43b80a109a7d4e2dc102a5be7aed8abf4ea85dfc6378f7a090317df37a2bcad54ca4982871aeb0fce5b497a001", + "e8e4ce06507f1aa72def1b965fe4a2eecbf5f3cc9533138be8db41e78768ac8445db94f136d8b373a21f5991679091914c849736fdf842d35e4ce9b66d38ce9e00", + "9d1a1454348343036699d8be3be97912e4b29428e3642344557e24f0ce7be7537e150b9895636e28947b4ee1a42ca037c392fbb9fcc419ce5f250718684d71cb01", + "60fd7de5912ab8b581be9d6c396c838ecdb497c706c38f45a6a2b730b8d1e5ac2562ece612d9debf93f453ae45136d131d08a53e6a1d393914571d1c551b1f2e01", + "ef9f454083f9a2550115585dcf1d45e3c3cafa1460b0730ceb1dae89ad07d07e67499e3ea50ab5798c16923325b7d33b70456425d124d0a7be86ed2efbd4133b00", + "6f8231bf2769af9d12d011798307d7faf9580135df840576dc57addb0d66eec33c343646d92bb2297a8d1085d953be6f96697c88e2f978f4033b7bf4ddafe73400", + "8667448f5154ef26d1e65a6d29f04c2a510fb97d7de90949b3f47a3aede8694d1fbabc3c16f64b698d1fdc2d986bd5e8df0ebe09ecab5399cfbab39a8ac80b9e01", + "4f964bb6101b0126e44e1e71abdb414e937b7668ee97074a69b628c15ac78d524fd45f39a1be141ead32df77a8ad0a62cfb6c05d5eafdf69d6c80932219c856a01", + "660763690925139272e41c09c27885b1c5d8aae87bbe2c02fd83d57f9db9c57a69aa933da8a4a37cb56dcaea20c0f742cfb00294dec4a6c66ce7dddb5669d9f101" + ] + }, + { + "address": "2FmtRamAEN3Eiw2eqroJt3nhHzgo9VxTvPK", + "bitcoin_address": "1KyXLZQK4Rg4UBsuJJqrgFFo3VwqNxAZhf", + "secret": "5127d7f0c06d335e1584ddcbf4534c8a5be109ec2e28a2f40aa5491427b7452c", + "public": "03103745843f93a49c945f4fbc0bf4ff479101c22a3ece11220cafa109280b494f", + "signatures": [ + "6f9e4d1d02cca690bf0e2ed204e32b11357588a77f8605280bcb92f148cb4003166a5aef470d4e3170e68f6be369e4444b8b04290ed5a0d564e6e5f86cda0b8701", + "7e5649e2e83de29a9058fa138d253133c7bb8d0594c3cb546ade2a026796050013926bfd1a8a7bc7f92875e2275224037932568b60dfc7bc2ae2ebc6a1b0f82501", + "b5d0be26eff1bcc5ae0d03a115baa82d52cb33c13833351362cfa2bf4c2db3075f7035d08b3ae0f850c63b87358e1bfe557678bbcc7226097c9e45310f9a5e6b00", + "74352b57c8344b32c37420f636892e592842c5e1794d2bf0369d4f4dbb005406152b7725f68726df8274246e7923b2aac6e43314569cd54863158d0f9ffdcd2500", + "366cefeba68f76d1ef460ac310d0654ba8434ea30e79b445cd7481b1356482d107a7148c2495b0d143d800024cde9364aecea0d1457a8fed1a2c1de326c2777701", + "2d0a2fa37cc5e3cb4a882d0632fe2204cc26c4340a13376e7b0805264a77a32313ae46ced96592e9a25a7773b7cdb38ed0a6ed4db445c079b5cadee8202d29b900", + "ec35429af03b64053d09c0e7e1413331e261ec2652c9a5ab268fc48c8a7449d13b4f707aaa5edc48fd78feb5018fb000f53521ed9167841b618a9a27a153567500", + "d8f999ae5e660966147c9faa1acb503ad6750ba1f5fbc14fd1806eaf6667bc3636cb000d5e02f68963b7e6af546d21d0c0f4c97eb13411a03da3870c73a685d801", + "f49df2eb22d660fad6d4f529b0c645023d4c9b37822bc728bb80a28ce5cb2898618f080208f48643efd045c130025f9f3223c568a5a2505a8b2747880af730b201", + "17d9223864ee1764545b1bd74330f3d692052f42b73ae530712ce7b3a02e0336316736ae1e054e80da778e173f9cc6e93bd865e208b41ddd6bb7b8231d0af4e700" + ] + }, + { + "address": "k46MSCkDYk6ZaHcj2ytwZamLRr5w4QUEwe", + "bitcoin_address": "1MD7YdmaLZ2Q2Xccy7XBsdS1ouo8tKkiWj", + "secret": "2b1ba25cdecc2b0c4b7938c220615929abca0d1df1d673604f8b370f145467fe", + "public": "02771a319f31f4d999adb58b1df0042a525e539d6cb4bc3721efd7ab2cfcd0a3e2", + "signatures": [ + "59851f4aa542003febf2d39ebadbd07ddd12cd41a665a8fc052ba01b1c484a6d407bdc61b449cdbeadf73f6ba5866685651b7d0249527a82f965d5a2b314c4af00", + "40f631b61815f54e0a12eaac988684f4808462f19f7b76deed56ce3f3dd2bf2827104ee2ab71c3a96773de3bef7a41df960fb98329852a42be09227a1c9ed89b00", + "f539e928d4c68938eb6eddd169a09edb46c056771185968d548b7886f5c1eb9b7895cff1df13be0d70c51bffd0c98f8fee9dafb68d5d8d3bc1b2f6a5e700c9cf00", + "d1b9277ce64f26956d65b15bac44a3ec80bd2024e098be69bfb6ec36a4718aa75fb6e8b353008a20bd4dc994ae9e7bd928c6efacfbca7d2e07861e3fcd74f51301", + "bf919b227af4075ca7864fceca4dad5a21ca9c1f124fce3b8f66f8406322fb021c85aee03128fb1b43fe0ea91ea825932b4dbd468c15ffbc8e5d36f69906f45200", + "36a6c965fbaf282058fb5fefc466d9f4df508598be400eb1f9415533554c59ac18f04007eefce37f5c8e9ef7901e65deb2a2219e2aa7ab638e4370bee9c98d5d01", + "30ea0d7dc2735767bd60d85cbfb39c19d0b4a2d7aa81157a2d647c548c7eb9082b991300b5608d13eb2bae260c4eea723f92a0c1fa82a267fa34498fcec117d000", + "91ac4a1889132a827df3d7dbee5aa95a4c9b111283cc1209c0a7ff77dbe782cf31c8f32320bb3344e06a3c114e18fa0da245f4749b11a27ab918c521637d6c8700", + "8c59fa54d45f81390b67c23659c831786376bd7d730a9af1e936f09dfb0cf11321200469f6ce4c2ebd53f7ef09069c314d9742ac540c3ae90bd4dcd805ea6e3f01", + "1055cbb78a97a410fc3663dfad3bfe21865da1854cf196d1f532ae42d9161783284210305c1abd09f77f0c36131458506d3e84dc19e87a3255e1fe220018169c01" + ] + }, + { + "address": "2GAWkAhh6ddxLGT38b2XHCuhdbRx9Jvf4pk", + "bitcoin_address": "19JtZ2B8VfUGEvVpZDc4DuKUoFAraxpq8w", + "secret": "e0c84b3bd790f03c58548657cad0a83cc302d1b75d7b6b3d8edfc21d8c2289cd", + "public": "028209201b8152ea8fd7f7711eeb82354f67cf1cf1b4082160f9f04eca421bea2e", + "signatures": [ + "2b390a37a9cb797fb637ba4ef700637108629067a6666d5e1ee23bf448fd171e0f7218eeb61ab445ebd7c14ed3998f3dcf0a3aa22b66e7d5a545a31a6829e5f501", + "871b75956dceef0b0edfe032290de7cc86347154cfdda5f589298e6aee850bbc2668a09c61d71f92ca98347c39e33d52193f61cdf125db85d463bd24b3805a4500", + "dcdc972a97aa2c3784a9d48a886d344a1db80a26e0015c54590621ac2fdc9c6e40149a4966a80b4b96a3f92cb40fb48043c359f44e58134c0addedba9257506b00", + "de090ac5cdfdb9082e682534f1486f426343c9aad870ad45291a8343524ddd67379f76bb35f75191ccd45c5286b48e4cf5049b975d07548b97fdb31d86c1fa5100", + "7bf2158c903b09045bedaceaff8f15603c762543d6854e60037529a20f401f766979df98a63a9432f6154b010deed9772ad21a15bc3a162b49bd5f11bd4d96ea01", + "ae300255bfb6443a65ede797bce0944bf7a503d38c4b161935f44ed2f7738e347040bb8309017d5d6c14161aaa0075f301d957c8a761b33284d6d535547bff9100", + "e61371336baabb089fe52ff52751e5e41f34820c4875f0a2cedb2e20cd8c1c2b638f3b0b04b199dcb2699428fbdd1e55ffcee0744d46c503ee125ea533d567d701", + "e22f88a49370f37b078fed65668cbdee44567ef3254693a9fc0aa181739acf2f3ced7c4ff5fc8204304122c3072c2e1dd8a44989cf6bd77ab4709d6fd1e3952400", + "76d6cb79f1529b03762fd3323fd381174568a05f7c799faed8be6a0080d89d9b3c607d378178b6e941e2fdbeaab235f2cdfd37fbfb9922170193d6508081148c01", + "1cc5722eb5e17c21114daba7c19ae25649ee79482ef8b681015f8d708aae2aca4b3abc6b345410f94193d4e9e8de50cda2f5a5e52befdfc9e7c81a42757eec3d01" + ] + }, + { + "address": "EzfiGbJmK9AtLocAbUUgKt5FbvkptAfLqC", + "bitcoin_address": "1Fn4KpLtjzUzupW15VS6s4TpciCkDo8av5", + "secret": "4da01bf2216bb743f5412fcb843d79ed3bc22a03ff7ca0b314255fd622d90874", + "public": "0342b3d108f4f046af97cd92244b841b6ada34f52548d944d3e22344a952e3d173", + "signatures": [ + "d320e4335cad33aee05f4149326c9975464d2b8b0f24fb0ecd68d57c19f6df3f3dd0df782322bfab34be399762e3c43c91e8e61fb2d52d9d41b63663ced9e71c01", + "ac536af52e3f49f392a5612bb227c25c3ab58c60b6d2646ca43b465d409620230a52304d22c942f28d5a6f7d2e69093e828027dd6dd5ba4af5e91a6fa423cb1000", + "922a0df5d51a5a7f64b42a2a3491842350cb37f3d3331e14cc2458e449f384f158b9d6814017cf2b8dbba0962315808163af33dc85f73339aea0db2f1249e4c901", + "19ab17f648411a76c8011199a3f648bf4678ec8086ee97bdfd09a6abac3703190d75dd1444404a97505401e5c5465cff9c73f8281ab300ea2bb473647265cf3301", + "df43f4d301309340903b862f6002d8746b622c7f8aebbbe6a3b9fac0d17e8e933a32313dc3faec39590c414d5d9dac92705e72c45be95a1e53c9476c96b35f8400", + "91af75028b21573abc40d3b7a652850202898b2692e5fc77223ea7c8bcac75f002d42a0968e9bd12cddd0f5dfe8372f441dec2108650d8892ec133428099951601", + "4ea9d6a9cd5a4298b9649a83837a1492339c53fc2db3e120003f5e3f33e13984739b7f2fdebc10ba7b465e000c2167e8b215f250379d7c864f98d16e6d9e130901", + "61ba9794787249f40c9d49e451f7605d7e7df411db3e6833f3ec6b436139583615644f11da4e650dd170c501e6f4011691c9dd1eb8371f7e06b5de59cb4767b800", + "8e3ce6420e9e3ffb84d87f4b62738114f93afc76650c184445e5e625b7470fd01f1052b3c85f629053fad8bc8e2b356885f1cb82e647254d4e5f79d86cc94f4d01", + "2966a1e0262bb90144cbcbce45fbe477f9ff135ec4aa59f8fed4225ad88c8acb4eb639cf1dfffd7f702b7c9695b427dd91274904394597bb83209f00b7403a8900" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0007.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0007.golden new file mode 100644 index 00000000..647fc10a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0007.golden @@ -0,0 +1,185 @@ +{ + "seed": "cGlsbCBnZW5yZSBwYW50aGVyIGZhY3VsdHkgZ3JhY2UgZ29zcGVsIHJpYiBpY2UgcmVmbGVjdCBzbGFiIHRoZXkgamF6eg==", + "keys": [ + { + "address": "mPSsNuUTsMdvc6afNScJGAYWLTK6zjpaXr", + "bitcoin_address": "1GDwEYgaR3dGzQP5mX6rQ57hFx517D5Hzb", + "secret": "b4635dce2ea621928c61bbfb2132090c674e99b9ca6017a6c7ab33dfdbefdee8", + "public": "028e6507a815ed048711b7bc74214addda37b5197d3128419fe2cf1f46aa6f4da6", + "signatures": [ + "8669aca771dc0437ff8e12b65ad4458b4e38c1bcb1b1ff29f8182780057942b82f5877933306f93753d76c5e74d0915bbc8ab62c6a641b2bd7ccea69797f5ac700", + "97ea4fdd2fec0593c93c8d37f2e938057fb570f023e73b8b441d5eeabfc2a72764a3f851f7da5c5f3af3d969d87f86fa905cc9f1bf6472e2a749f60d6891b2d901", + "4ef65b166932549734074a92f77266c70696f2ec5d64aee324f6cc68cc6dc20b0fbdfac4d871c47bfe97f11070ef74900f9da818bd5a0f44bab01b35cd47fb7501", + "da6383da7ae60f724056a120280e8fa24abcf08c0ee32024165090edc7e472b14c81d41c9d52b637efc1c7114ab65f53890251caede1dfed2ad2beda0bb57b6c00", + "ca7d081115500cb95a9b8e4990429f2d1df284ee6088503721c100d8132c54ac1298e9b79b1546a09877e658735192292283d8396734607a90905c98c7f5b1d301", + "50906532962f9b50c8db4a9836669fd0d62f7a33d3d58b33e95cdad4ddc99f207c9f75fb0fedcda2f87ced5fc9d48e2eaef274a7395d68f31749282ca96f729100", + "e316c729311f1cb873bb245e128775948f4782f9e36e9112bea1d4c1ac8644ce2b3c4c914b1ac36c102fcef8e99391ecdd5bcfae3bafcbb002c5b0f6eba25b5c01", + "af312200f509edd20bec70328b8f88ba71a57b299b46799d15d9a8afbc7ff2a173d7f67a70b7a527e7bdca3ca0d0980cf84efbee41d2eebcea8d81d79da6843c00", + "04c2cd593c4cba96a0fe54fc119b3fd00efb82bb20bd71aed1fbbaca05a588a239f4975d39351bc085a2b8c0043a08ee09351e3594554a23b357fb5223f7769801", + "792267a2445428980b35e0d59f3f656bd4c71f0e6c4b8fd1f89930060d90ad8b26dfe4e4aeae7df72b42e7d4b5a5781c402cbeed51a23302f65c321a2d847d6801" + ] + }, + { + "address": "2Necqw9k3NCEtj9FY28Kx7NV5nSCGQ1joHi", + "bitcoin_address": "1HH6aokmmxSaajT18BaMqETUiENsrx9xVQ", + "secret": "7655913737a47a580d2c388440d9236a0283050aadc7b167f2584e9878b066b2", + "public": "02bd478e24155889b48977d6ac97fc7bdedd146fb2c983960e28d63a20a1adb6c5", + "signatures": [ + "aee5eee74330efeb184999e59b5b26516a124f6c320d9df6167cad45ff297c4f43525905e5fdf73f07f6925cb4084fca43fbfeffaff5eee81d52f53ca08d2c3e00", + "d97bdbc541dd80006dcc5e4c6001f044e20ebfae2f6410a2af7e44acb9ff4c0f68e0debc89784258f6f8d04e0d58e4342ddf0ea52dfbfcd693dfd00b6cae60a401", + "726eb4a9402228f925da2aa936b635bf1d3b587e7566620f0d5e359a0596c35d62a786f1d604d5109420e3449232622c3ea440341715119821c8392908e0db3601", + "b591beb1c89636c14a82694323df81508bfd6f209ffa768d0f2f74b27b2572aa65719c48732ea457e628ffd68fe3125801336f147968da55f8165ec020f480bc01", + "9f5ea12b545d1ca7f4ede6515e4f88e92aeb075e470d69a4a5df5b8516eafcdf762be8995c70fc788f886a7440781c95c384f7a8a4cd5e9a7e228366374ece3b01", + "f8e7277a042429076ceddc5b896f6ed69864776dc904572cb499be4672b16d0613e046fc3626a953343046c60e86114f59a24e46ef96f5b7032b8b204d18f4ad01", + "2c4b74070467fc30c8f902cffd43cfb21e7d5dce587fd1ebb07ad4374df020e240c0191cd5e68f4913d1b99a87f9c68cb59bb877296aa6a531e6bad860c0ab5300", + "00a0d16272360c4f47de24be8962cd3f3cdc13fbc8ea64aa57f138f12b9de5082ce3ee1e50906b74552dd5f99cb10d517e4aeffd308b43f680443a223363b9cd00", + "3aa6aa35b15eda95eee58a82e8a2e54780b77248e6020149407e3981a721129401319fe05da2a9e768baf195547c5180c52bd2b862af445b5b0ad50f8557aaf900", + "863ad24a59dcfd63da8c41af9334137277cbfedaed35c0c85d1424751c3cd871191ae55d8227dafbbf9596966a759c77fea4da7a2eaabf126aa47e9608cc000400" + ] + }, + { + "address": "ajzwXmj91ZKMnHeJ8LasEEzjd43fGJo2P9", + "bitcoin_address": "1PbXphU2k3egpKE8FfQBgiqDVPYs1fSdDF", + "secret": "b1410fe8b4705b209bdbce08b800017e52d34ebb5cbf62f84bfba61c146312c6", + "public": "033c8dcfced958c25c2e522a854c102da4901ab2985474183e3563b5540b4c7b00", + "signatures": [ + "24643acd511ef7d7310f30d42c6e627cd7fe33681b5a6e3752f3a29176b44c7a547dd22d421019223d0575478cd20ce96931afd3ce50bab7ec7814b07f5690a701", + "20300a8466aa41d9ca854c4cd18291d6aafb8be050db7553573493387ea56808494e4bfe7bd40670813ead46f6dceb0bc147faa7804eed7738de4588466f800300", + "8d47354f77889b8b6e5c91af0771b6c6a1f8cdc704184a635fe06ed839f054ae264189d96c05444c3412a352e5141e08adfdb9f71a6694f98b029d43dd47251101", + "a13d77d2f566e73cdf93b915f24ca8408716400261ae15997dd6ce6a7ea0372e03def52420d5951645211c59057f911215ef25f8534867da690ff90fd9f7247f00", + "0980bb01721d53f0498801b77ac4d916a89f17c243f8e6323fa0988245dfd6c74d2919c4dccf3732567349349fe83be40c0dd068e9b49517cf15d0700ab1811501", + "d8f02afe36134fa6b42a649fc5c779a2c22edf4ab828da68c5f891d99823a3a72345a4e0a0770404f890fb385bd306a4d25e92a6dd5e6d1fdaebac427c10c3c600", + "706d0784c82536a5f2b79622a8c6c73bcccf8384dd22c4b0d2a8bee0918e1492240ff03af79937797292475464e04cd0976bf3a9ce3602405f6808c9af98bfd800", + "cc27141a61bcafeb90ff4a55c25b2f80f5a4a8bf1d9b23dc56990b06ea523a91650b356d9a24b9624fe74541a117542d2f20992bf047114680c8d2169dd6404b01", + "052427033c268b9b576a93fa05513f07f5fe090aa1040d94ed116db202e064af58e2f05f9ebee6f405448ec70e41173ad39e29f8462e6a4a82c6e76e2790b94700", + "215d08a564e5fef911b8fa1b7dfb84d9d7013501efc3ab92a7ea2bce8282dd8c31db5c2bbfb44df63b8b93e6bd2099cab367ed1d9584b432c85018f816b7302a01" + ] + }, + { + "address": "KAcJer4yML3KndgxtHGs2SoGLmRTxJCynf", + "bitcoin_address": "1BY4SkiaZb6LKYs2TW2r5P7JF9SuvPjKSC", + "secret": "4a5e44f0036c42fde00ec8dc633969474fabda864e45f5035b18f4d15c8321aa", + "public": "03f7d1f72c91c5e6878c76cd1e5b84996a0c0a8ef36efb550d01f7af459606b48b", + "signatures": [ + "3a5ff4fe01d7cb3739f2976746d396eb18f1f181bd5948395d4c41e7326ade1215da758964d42ba65158bf7e03ff8c7eb7c0dfbc914eb365e1fc0ea6c02b24eb01", + "3c391bba2682abef47fdff47022a590859abb9e95fb7dbe7317f6094901189160b114cdf44b240851c939f22e1540ff3086f91340b3c3b842fea5fffcadeab6100", + "c2be33d40825d186a950a653b61cad1b16ec0429689867a82b0f44f1a6cd633d03a6e6272e0cb886f1bff6a014516cf181a2cf6e12658d6ff32d6b32d69eedc300", + "4cce6a1330e0e838aae3747ca45f35b9df835f8744fc4ea10aecc7aa0f14946c3a780554f6fb2de15ba38c067b5e13d7d88c31c9e77bf622339cdbbc3be985fe01", + "7513352f17bf50544d3b808f9be00b9263f4328ce98db10f3f8e6e601145673c0bb2ac0dbe4784a370434d45f209dbd6afe1c4c26e0e7f8eb2427b94293f91c500", + "3f3bc0a9d2979a813bc0e1d9f6f755fa0f542796c3a2db18c04c39aeeb1822842c4d1373bd524c45aa8b537b71e5848ffefc65871b3b91e753e54ea1dc66acb501", + "1ebfd245fb5b3654ccd95be0e7f4a644896c5e5ba758778d77de878f860e4d8a3a4c33f7407db1fc5734672fb046a5c02776e13c0d56eb8ff8105ba68d52cda901", + "49e5a8fbad3e381488d6ef1ff2a8d58167cd1d17edb597c8e88a24b6e5e17e8c442d4eaca8e1bc7050bbfd439a86e857a9cdf1b704d5aa2addb016eb5af77a1e00", + "36a9f46810244e5eb23e823965a83224cf2783c140f6042fb35568ce9abb33242616c0ef0b619d9034205f01b4b7155a8237c9745fe905078dc4bd2c8fb8599001", + "e016afc5f089018881eb7516cbd07e37e044565aa826d7e37c9aea005be336f158eda455c30e03eb7cfd56bb79c5895dab15ae575b18d4b1b2de8a8645529a5601" + ] + }, + { + "address": "X8yAtMRCVageKAgRixGESP5vRJoe1evT9w", + "bitcoin_address": "16oj2N9wWmv8kNhFyLVKFrUUAFtc8LQR2q", + "secret": "e2107eba690b1df6e0d3a08373921d0a19ac491bb10380e40dc6717ed11bdd16", + "public": "036a17b121be33dce4f868d591c82268cc86d765db3b86a447ea50b7d1915db8be", + "signatures": [ + "90fdd824c80b4d683ad26e8950aaa9c9459891374e6d519154e16833d9c6ee801c5d7d202c204e85530ae4ee0a38e9b115528bb3446364c945d529f9dd1d185601", + "b51a66267ef5c3373cd2d19e569d65349acbd3e1bf2e4422f5ef9fefbfbefc4c18fbd07ab1d008c887cb52c179dd15c7ad1f6a348a5bac45071b62ad4f9690a900", + "629bdb73080d5a2148d3a6d68e46c29509285edca81d9ec602a6eae1ee1fc31b4cc421a925e5c1a55f77ececbe201146afcc93ebb1376bcdc8a0950f61a3010c00", + "e392a4bde506161eac5473a3f646d3a153efb718405bc3ca96ae4d6d302c25964ac38e211ecb52564f459098f865f3b7000e58f30afc444a6b9fd6837a61b90500", + "7ac54bbdaa5a2b800904fc79cee2b55a6a2953b31292824bdfe2796228b2c97c06a0d1032adf26570c139ca5ceb7ea17d677be5e32f3d73edb61b49dd21e312a00", + "7f4e56604ebece2f589ba9cc8bdd3ceed3cae3bc7c737946c69637613a497b0a22d7bf916b70cd40fa7532cf91bff9d48c9cedc0e8fcc24c2a1d5a70ecbc51f200", + "74b00a4928e33bc6121e6eb622707487fad27282c736620892c0015b7b7db96a1e94f3a19f0da4096c8034456185107911c25a01248afdfd4a49f98f38bce89001", + "8a880ee824069f49a1f4e7d5cd76d70b44990cb8902379ae64713921bd8c0ebb4e6f63f4c3849e3fcce331f77c080120cf2409aded25bf48000c64a2515cd28401", + "4121056c8a3696b6158d8e3301e23c514a5863ecc1926db3c6ca313583098fc409d61ec72f9d3bcd0c215defe6cd5a07c4b2aa062e55c9c4e631ac3db237443e01", + "264e63e3df6bf4495d12d1df6db295b61ce99b9e477c1a3e6ac9fa413a11410455f173038160aaea178bcc71a3da7deefb70fac5f1f7fdc9dcfcf8d5d2f74ce901" + ] + }, + { + "address": "2XKCgWpkUHdPxBhzgN6RNFDQSFDpbfjTM97", + "bitcoin_address": "1GeQaUh8bPpeMtst3EY9Kq1LY1zoQ3St4U", + "secret": "bd04dd38b12d99d5d99da868871ce4c8ec3005e615043e7f6ef766bbfa041d88", + "public": "02037e40467e07e07528f1076e64429ce8efc955ac73b741f2775df7ab7c83e9dc", + "signatures": [ + "25a7ebaeaa0eba12d350cd2e022fffa3ee7d73b60bcfb1b7dc6ea3a930ab16e065a23d7caf1f79bdb390e3de2b1c09371ff22369a1b51a0ebfbee5a11d20883a01", + "d3d06e33fd3597af973851f1ef82278083f8a8a6bd58c6d33ce59264cbcd26a13daf8906cf2699c3846e64a2fd7e7dfbb092f2e4e3925157cfaea7788b8efd0900", + "e97b9b1349bd9b38912270f20c664b1f52c1ccf2dc6122c089fb6bba1c9a1864430ba63af58748de4f3c2d97172577a0b7bc659a31be9e492af81a612d3ca66601", + "5b69a9fef8e54fc5e262b62a5de331a9a7f16dcbe41f61799d367c0a4d965e8b1bbef4bce114397dba8d01b8a86a87f1ebb03ed8f3b3250d95c72963acbb7f8400", + "c34181e4a138f719197db757f12063cf844e5ce384594122b7ea668063a2dea318b00fd391471fa4a6b951f9d3cfac173ff2f4204e912f4a762f6f3eed2ee30c01", + "585ed7c1228fd22d7d481cb6e3c484c8749572050aad297aa9e406b948ec42d67430f39a4a7c46b65e876eecd8d4383aa89ce4eaff4268802cf1369663be9c4000", + "a3ba44c0e700bb0cf95efc6b0c215af840d929522d6f46efd6bd2f4b3d03bbd822139ae82e476b0d8419db6b106418286800d420fa6017ad460980e499ff547600", + "23d1eb4d7379ebdb764e6c99949a8ddd76306f351559db3e6b20aa44b5cd2b201ae1656f92dff367ef9b1608e98206fa97a61291ac28b1894d06a8267751dce000", + "9b61d09bdfca7e6c22fc89e1e60a85b94641fb2496d9259d9a277a48403551351505f6c412a67cfa2870fd43cffadb11d83c46b3abc9e2d7e335db819d775a8201", + "8da42dbeb2e06fc69ecafeb7bf9cb06f1f7c18ff16fcd0e1a3260dfe9302293e68d0408cdb6d2264a979a1eb855d503af18248beadb95ad14ced7fd4b65c516500" + ] + }, + { + "address": "WmcZyCWxhWWBXhcW1KuBf9ft1j8wzTw9EU", + "bitcoin_address": "1H1DWxZQcgnYA5ir6zNVk4N3VBxtd8qvJ8", + "secret": "47cdecfb4697492b71ea68c871fbffcd3d7ab6df36f5cb744c7530c88a775703", + "public": "0393d74aaf73d8bda3199efcc619d7bb3f26cfc95800e3a0ab5ea029182669a0e6", + "signatures": [ + "0cd5e03900cb1f6b9217a68b5456595a5e8693e247d06b59ff1df287b4c8d3bf7a39ae9e794c3ccca84fed36b447b6256df5b6886b73d1f15a47efab6ed7abd101", + "1ee6a768810935fb72d74ca1fb946786c944cb335b1cd95c33d10e1a5ac16e0e18f6a0e4102e99ddb6cfcda7faf4ab49e1a93e1133d488aa6c23ce1a5fe251f201", + "001e7e58de32386c7e5d3b64a967ab804fb147cea16b184c2644a8685922fada0f648c9223baadbde6e637be0ce26bf477d1b2922decd993e1d97bf968b7972100", + "2bc7c3a115f6fe9fabe9a0ac3729d665621e0a1ef5026c41fb65f328914b84a6228cc3491dc07a5cd5f0b6c6a9373b1aa6f4a51f1bd370b74a2827f1773fe31501", + "bd114507fae6943f5adc330ce600b1bb8f67f72bb57f2975348f91e85a5e333440bb6cfbe0b692f63e6aa1e14ddbf62078adf5f6a620dad5b88659ac89485c5600", + "4a147ee3c96cb3563c1b06b251eb947f18ebd45c13d5121745cb0c2676a1dac47e41569699501664495527228cb5d5227e77262a6fee592c2e39d4d076ba736600", + "869de9726a35885a2e1542d059e38637f07a1f7a748f85e248b10a21321fb7a90c895931eedb897d99608115cb3e95e5f3464402099b451b14ccda964585abec00", + "e04d0d2574924c2e42c0402a8586463c68f0c9817c2eab2b0ae12d7614602e5f51a1e3ca41dbed052456c8efe96101c6176af9ef79b785351623b53c8028b2e401", + "d8b3678390136043eb595c3440e891d217024abbe8bcbf8fe359bef38282298b7b3250ca4fd74036386a480529d24bd23facf4b109bc565c61c47ad3515c3d5901", + "77e465dcfb285aee33e2c07ffd22e0cbe66123fdb6d83139f26b2eb5a151e6cc3df0614f9a4687207877f573c9a776bbe8e8582ec76264e68cba2e23db6f866300" + ] + }, + { + "address": "sQsVTtmRVSBQvXB66Li2HmZFqxjJNt174d", + "bitcoin_address": "12AgUdpFuiph7U9xubxFT55GeSpESC2s7f", + "secret": "dda8c4aed2d9dd515df72e4a31c3fd05815f7ed3b2f2b2e203d12f7fc48f90ef", + "public": "020dedd0243219fec27920385309b31ea68d3418df5cba597bbba0dc794fff11f8", + "signatures": [ + "9e6b99596d5fa55c07c9daaa893ff65cd713aeb723337996c51e3a42b13bf76e04090eaa3365a5d6297065e229e21315b60e14411ad660d8a74a4c1e2ff4dc9901", + "320954de1ac17b54446863320f55e18ecbf4dd65bab9288d18f25ec163762b42132ff562af17f2b8f2c759f96b2dbe0f4642376c8e8b64164f3ee323dc26bcaf00", + "00e678398b522707f33435ad16714372447cc0dfb0857f744d86fe3cdae1f375235dd78bf6d07eb559b844971754f8199999105b76b0994501fa34c96333c4a400", + "8b8d6c37c63458744011eb7f181e9221029081910565fdb34e4e4ee70ae992df04f005ef1da8920bb820b124571093ae59b2b75e87c6de069c109c308d61314b00", + "45acf679d22c6727f187a2e2516599d1597e8ba0ec268918e2b0ccada99c85136cdecba2d94cf31137b612e87819fa2fd0efcca7aa85771c9ac9f13b00c74afa01", + "1f3b2ae803fb5605cc4d698c1787777d448eefe2deb2571975886c62bf1f83881543913b7182358d7457842be6937a3fbf142ae776180ee2a0488e568898240a00", + "19902fc27e1b56e81e2f98fb4f89b8f15a716c96dca83407917ed615674b77bf0cbf8f7de42fb19da7d40d7de49e8eed4d24d0e260c3421184688b1bdc07cca200", + "c40fb53834a3198829961133e3543d786ba2719b89a059022affd7f3820a38727523fa0dccbf645b492780af141c0ddbdb421fff18f8f97a15e2d7d18114d66c01", + "5c65768f4ccbce98584a050c845264a6a19233260e7d711c48ace814d0820c43681f2d175722518df44cd135c759f54082c9eb866c967892df43875156a9420701", + "5c91737f504558b000539d368aba1c5ea62d4b5346ecac64ffcd2b5ef820b01675a58703e39a55889d1128f678f0ee13ba0170b11fdd6a02eeab87f5485eb79901" + ] + }, + { + "address": "HAZJiBg33BdkdW3RLqg6CmUe9rTyjobvfM", + "bitcoin_address": "1KmxdNkzwDWytpEXHU3WGjdL3c8pM5o4Hv", + "secret": "2d046d99674e756338789b24c04cbbd0c022c06482f7592a19dab3d8da473135", + "public": "03c5784476d10e4110236c60af26f085d3f7bebcfae0a2cc06ddc95e8dfe01da4c", + "signatures": [ + "7ac208a7d530b1b5777b6416ca89d52e3fd4047d488cfc043dbf655cdbf535c55ae6234531e652376dc034ed3620b64fc7182a4e712569d07f4bfffda421cdff01", + "c8c0f9e69ff25a3a79fcd78efacdba7255fe22e69907fbb23164c6dacf74f0da013213ab8b072dcb11429e4de0d8a5080063b09a613fdd5ecad1028374c3a0e100", + "519ec555c35fd5669e00aab7c8a6d244361f11934b154e026194485d456c019e69eba81ccd983a62ca529ca3203e3a1e8d98e09c5b38044f1e47628f8e6deed000", + "ee211016b58172b2b28cbf34e501484126ac1f49ee1b89d8c2d4f03bdce628382e07f7f7f1fce3ea0b24e413452660a061377f8df4161fba404c48c07f96529a01", + "333d5e802b0b72c72c6bd615521cb3b557cd4ee15a58134e18c7305bb9f909223c4ef26dc3fc26c63a064f88cd1ed77c2a7bcf9a9f530fe7080ce102032b680d00", + "c251824690e71e8766f8896aa79b37054be3e0c981836a664066adde3cee3e482c240364fdcd5cb1398c7af02671f4a999a6ae5313db94f7c13a97b3b4a1b72100", + "2e674b3e7a2988f2d1cd6ea8440a13f78bc9a0dd948c1cb6b2ebc89b766af4531b31de154016462426d7b3594ac2283214d6f5f7cffdeab426fb83ac9f91882f01", + "0d923ce2a834ec22daa222c5997d439406be1e41b1ce8e10110568fceea3b64a2f8b4ca395d2b7be1d1eea8c47845e683ad9c5d26e1f58fb639c07ed8476e60600", + "ced0ca11d628b4f1eeda80ae34c312aa5140c65b781cb7848952bebf3a66c926424f8fa8b605c1542261a088290ca4e2854567be62620fc6920fea5b3d8a1d2501", + "0a83eccbd0c8df9b0f8ad166d892b84d85b2861d945539b124f657400d52c8261db09b5eea6d03e181d38af344c49e3f6356444bc7bb2a93c7662666daf0c2ff01" + ] + }, + { + "address": "KAU6CLysbrc41MdFKHNioXsJNcFQTLZSWV", + "bitcoin_address": "1EHCm7o2wF7HayRtMCXYxB4n4fgCRoQo9N", + "secret": "fd2de4b3e1284eee8ec5884d92ae5841bef651fa324b001bbf99b7a96a4ee232", + "public": "032548366a5a732e4b389f8fa5d8c0e5debe5be166de2b557fd58dc78d1693de2d", + "signatures": [ + "fd3b22598a78353042190783d3410bf0bccab1331a4e167a2f60057a5511a4425953fe8b7d7099b96f711eec98078ab44c14c4638a8055f750f79384cd5c9e2b00", + "7b6157888227e72af6d22f2964ae61a8d3dc12fc72396b5302e65d2bdfa0e54e13128e531490afe48a7b75e31461587f67f741fd78cb6b15b4da8d8b12fd44e000", + "41b4944313bbb5414956049204dc8cccb782c664cc990e31447904ee317ae75655df2780d60aee06d80a99d6cde3731024d364238cf48ece1129b9f6d9e5e6cd01", + "aa892a1e3becba91b7d2ae3aeb04309e6be4221bc972100fce3f275e6982b8b2124e21016d5edcf8d533b5dc25ccab9656927fa03d6428c4ae8c8fc01be830ef01", + "b7757db90ae36a75c0730786e121567715dfef02f0fde002c56fce4282fae3f1386007b9d6889550e26d756cdf9b22e29614e9ca8325f285e9d19737a8fd768601", + "12a0c556c743f4e10cf60d8e25cf19520b2c83ff10aa508000f9153c38c7b00f4a13bc9c453d6037ad048e3cd4484fbba37ed072698dce7dbdf8a6a153bd1b7801", + "7eba52f7fa4a007f022cefde6a293ba46166420552b06855b34419392a8e906b10005884da94e87f677183f622c0de3066a5e73e1e512107892c967fc71094de00", + "602b4fdd642fbe5630e36c80409db56bf49c672080dfacca681933d086cac6184fec501ffec1e53a0695e06fda2781e33c44f601b2047c2c9392a16f195ff3c701", + "4f09c6bfb9a839e67c39ea1b44ddb21fb4c25808b9d72e8eb2a0667c9b79464d4f2b74908d3c0307eac43bc648467cc5ff3efbb3b500d5f2d110dbac977a18b601", + "f7635143e6d3dc5ffc4918944a4dbd783c7fffced7b8db8c243677af745750b72101ba863d037c27c862a02acabcd897850f34f3b4e7c649de784c937391332c01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0008.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0008.golden new file mode 100644 index 00000000..76e249f6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0008.golden @@ -0,0 +1,185 @@ +{ + "seed": "c2xpY2UgZGVtYW5kIGR1dHkgZm9sZCBob25leSByb3lhbCBvcHRpb24gZnVlbCBmb2FtIGdob3N0IHRvb2wgd2VsY29tZQ==", + "keys": [ + { + "address": "2hBixkyUneVyeWK8HXr9S5wTuHPPjLQfVNk", + "bitcoin_address": "17uTZ2KeSJnsE782j69h8y5JDkrWKnF5vz", + "secret": "a4196da38de61394985555f95c8cb063b055f11a654806d1bc9000ca65fd48b8", + "public": "026a7c59d51fd0412c7964e85d428e8e7f462596bf55b6e92fb42dda47523fda13", + "signatures": [ + "2d324fb86d84dce6babbab85615e3fa8fcf40db5265eb12c7d2177463d414f4074f46bfea5af54d9a1e4718d6a3854ad3dd0c07218f7b337b0451677ea1f553a00", + "6eb90b199fb3777ea55a938d99eb0aa5660000bc12945cd7500bc3e465e00fee5eb0779fe7f83d04858928376bbe74faef7b10477fdb78247f5e5f45318d5d4000", + "32e36ef19c712fdd1080090d5231e8c1a756161b26da3d55c8fd86994d66d8c07ce4f774fd2e05d75ffcf9ba6a38396ea58774e6db1d8858232cb1be6a394d8901", + "9cd97b11b5fefde1a0418d6b52436c6cac206e79ebe124053bf365e5d9ed9db042a9b0fe513c3cfaf790af1bc5711b45ccc5ed0724c44e33eec62ab3bc460e4800", + "00b53304db9b47062c92c91a392e104e51cb91ece9426434f32fff31ea1fbddb5324cd9906564c603c8a36ae54f19748a281474ecc8ec788677dc15f3c5ddc1b01", + "41d8e48ebc1a724a242024ef1a2121077cff8f2bd78f27893ebbc14442854f3036094b99ab8f8c7c662005cb32b3bad03858a9d47a8d8eec0c0829d06f37d31b00", + "eaa1f2b114c70d7a04c9eda7892c615ff33b4f0f05e2e9b8b28bc0f5672c04d95f84f284912bf8222b80ce237294c163ee2ee928f0400b1602979de890b8330d01", + "3b4586cc527ab41c6c65383dee57a12000a2f3df181cfbad65511a6203666640681286b23cf890e72405023ed282d67c060433b93a0601e2c0014e7deaa1b92100", + "05ddb5df8ad91c32b933a1fe8c0ae217287f51494635f5dc46f3b8c0c58ed8e54b0f1a522ebef697d41bb7a776702fd7f81710db217346f372acf2140a0a0b7200", + "9fa9c7e922a89fe3f9beb528fc030b9ef53284144e92b95a13cfd19bce14dd9f19d5407a8c4273b6c17fd61c73178b7af32c8c217f00a131f3625cd145c08acf00" + ] + }, + { + "address": "2X1uf2u1LK2S8CC8e3VWGVLjiVhHGkPyB51", + "bitcoin_address": "1GDtCg5s4RkU1BiUE7HtXZwg25ahP9CHrm", + "secret": "46d449a4e9edcfd54dc0d21d75797421a3f0aaf6363b4fa489e3889a8dcb34d5", + "public": "03c164e6e935c29b4a93ba87cbcdabc49b8639bdc69f1e89dcffc026dfac7393c8", + "signatures": [ + "2bb7fae7a294a511468194fcbe2000cc7d4e3da84dba19226f89f446c9cd67853a1d6b9519354c9de307f10d9a375aa4f2af3601de56312b087a15317f40938001", + "b84ecbc6f15a0e377bc74efa502029ac87b55bc3d3ffc79867c41c909d34b7112ea1353b9da4024eb3f083bbbc04214f5332cb2d4d25bfb4b47ae0f95515ef9c01", + "1c9a32563e107c5d225dad141db80175d92997dd44ac7b1d0f6c2b0c5fba018373276221bf930f508ffe429ab0efd1a88cf54449d26992cb392983f0f7785dd800", + "df150b6b76ce86e688e3817fc10d16aac4da2e5723ce75181254269175e491a613e7d69f892d718d10fd5a8abc54fc266c731b33f77599c0a30b9186d6cf8dbd00", + "e869020afcdbcc8c07ee6dd356f83daa1aa5522aa3c2d9a0627c76e4745f0d0f4e3593a69a6a22ad3e5ddf7759b6d9ffa36f0c081f5462cb1cc76765da12e50600", + "3ab42e19889ca8527bc75dd3a320ffc7602371ae754c28cc61d2ad986268ab62790a940a0f9a9e7a9c1b32c0f98fd2c52c55171fb7de8f5b4f339997df46e76800", + "20a89d2aa6ebc277ad374e1ba8a8cb54bba5da83f4b0b786d71f7118c87bc73e680641af294c70a4bd5c6d837a8ae373a272e56e1ef6879ef2868c0d40f67a3e01", + "7a12400e7ba39600a1b2dfd9da749b34eff25246c83ecdea065cdf5f1df5046937cfeeab9c9096c678ad27b96ceaeca81e6cd20c00d23b7aabcaa13143649fdf00", + "389b8fab74bd3c02c51029543663f8930e3b37aba3ae08264761ec8cd77fbcbc24fa5bf47482ff4db62ece7ce5c9f8554b685379256228e208f7d65a8e33c37c00", + "351ff96e4913784381de11fda7b52abb87d4b786add98e534d215236100f44922435e0f8e8a264d720a8b49b88307be2a098c0614610a216dbe8862f5e51d4cb01" + ] + }, + { + "address": "nTsFenEp3j6vda1f5uRe4d8H7ZEXQkHEZ3", + "bitcoin_address": "16QVahwhZdYgFszL2NNgjBgdqZ85FPsgJN", + "secret": "c7bee90a73f6cffb9abcb920ee497fe7522fff3ec46b35cae5f07bf3fb0490a2", + "public": "037d3dfc78dfa302b464ef903a085fddf94251587290d965754d8530be02322743", + "signatures": [ + "8869ee2ff57bb97475d007f70279f9e3b81193259e64e2bed77957e8f6cdfcbb4ab2501d617c5ca2d1dc89233817a0b91f5a8a2d23aae07354d5ebbe97a3dd9c00", + "10af988a9c826232bafc857dbdde32c76cd6532d0213f101d4afa3994da15a261210b9ae7b69273b538fb6c3deb17cd53113f3b1cb01ac9e8604d209cc78cab900", + "6e858a10f3ddf96b2fd8d49806dca2dcb0745979e288c8a4a913e7bf6c722a531d285d2f081164d414af64bfa8ef6c8c9928ed7d25cce9bb28a698582802fa0d00", + "3b1ae90d38869d522cc70e6d4a51063bab5eceaef100cba3190c15dd63681067700cf336565409075b825e4031112e1eb0bcd209a7a0f5a99eae804b9599104601", + "4bd286c40792b96bf0d1588be470b96d2fd2e4ad7ec3d48e81fc129a95274b9b5ac15138902cab4112730ab83767dbd9845fb3157dfc89131a5e4f36fa63fc0f01", + "1270a0b3f00f41e1f10eb53fdcb5de369585bd95a0900231c7e7f03c2b0cec942adae9e17a043774bec2e40d36fa15e4c9adfb9133cb8ede06d07f840137c57601", + "8a12e03ae27a954c4f8e865fa6428ef4806c40391015962d9ed151a9cfe3a87274a3b1095b76e47aa72e01512bf5d412caca5e336c198f82db668bea7abc452f01", + "1ee1f0fcac14db2ce6203065e58f80fd7e518a56904dba875928baac48abf454513225dd572c9d3c28c11580a7b480dd8c34c24baa2a895ee5b61b0613ba507300", + "d0bd8fbb858f52de5f38029c5251941a0a2cfdf3cfaf8da684db747b4470f6943fe545e9c31a8666546d5d1b67399fa013394418f638de3fdb54d93d68347d2c00", + "cc8842288635cecfcf885db9863a870674d37285a795a326ea11ce93aff2aef0372e06054831dd776cf0d986e7e01a05070a2572bb7926635fe153a464e64e3400" + ] + }, + { + "address": "2Zj9ehnjn7c2P9AcoxbvQPBiX72yjHEJaPb", + "bitcoin_address": "17nM58J8nMbsQrffdEyJ93xC9zGMAhY3iF", + "secret": "8727e233f4165d2cf3805052e9df916b81a19d2e859c48e15576fba347d4123b", + "public": "03ec84a0cebc8c690f106fde7df91b86f7b7dd2bd6bbc15d19b6813d11bf523113", + "signatures": [ + "d878d051562f5872f20cf27067b54b677a7ed2ab44e4b88791933369e632993244d88b54060d3253e60afaffc30d8f89b6de5fedba6c90dad01ab9680ad2796a00", + "fb2f87e024946cbdeb11fca226d0efcbdb7d5c27e24b260bb1f6184bdb6446881917d5ab8e0f780fffa13b9459c6e751de391b3d7f1c61938736f8df5550534401", + "3d6b8527fb2b455a6d8565bef090728d3e0ba88b5f1a0599d296d21f268763120ab02a9f3521a96c4e93ad369080db860f6c00da586e91664e5cc410d9b6e99b00", + "baf8d8164e225bcef8a8ded4d54980af405fb6ff28281a16f64586f78a1a0d82670cdf6195f9ae7bc2a7ae9d9f5e32f81e5e6623e239005f4db8cf84ba85c10200", + "90f5ed24882e6e7dfd4eea059e3ac3d2414fb9d1cf7f58156be9e194c1d35e1b44b063a7c81c595d7e818ac6b28aa4aabfc9d8dab2d9c34310d6432dbbc5907101", + "cac8341488306402682b33e723ace25e45f599520753b65f0744cdaa64b14069255126d9d7ad18e219794165f6b723c500e72195ac535a554092444b0c9ebe6000", + "e8e3a8a6937abe48b730de30c5f486f9dc583f7054315c8c96c51e54be8a76772b476fea0543d6f825aa02fb8fb6b7b4c9350bb33889b16eb968fcfc3a64678500", + "cfd8a7cda65e598602bb91d522bb328a3a273b803b6e0e209019987487b1de7a52a87fbce1a87df47756a94ce97e3c51d6f4e66703f2c4893ab11304c407e56001", + "206e31703569b50ac2b2fe0d7d128dc53200a7f84ae74c0cd5153271e9d9d4367a9ad4d7c6b19236b836394ac40a1723468f96a35f4e813d4dc499f50feec2d300", + "7235cdbf150eaf66951644d4fc07226997c313c33eeb171f0bffc5548223317a2c6d933f970656babddba290e044a03d880eb5cb2d77d3036c3f925dd9b7a46201" + ] + }, + { + "address": "4DueLL7QCMVrwsbR5ydfJ9pnR8vahYytBz", + "bitcoin_address": "12TthuZ7jdk5tVpyBeTvPoatBok2aP6hNz", + "secret": "ae81bed68945bf50c190e743deb49273168569001e452be70725e1d4844594b4", + "public": "0295546a4287fb64ae8077ac4b8ea13768122654901492f3920541d76bd2b7acc4", + "signatures": [ + "bdbb583965e1281daa47dc4010c30251dfd30473e44348dd9111d517117f5d4b56c6ed8d137e0eb0e68634e196266c0c8de51d5250549a760c46d1198ca7795a00", + "be84724248bfbe549ec32ba7c06ab7d40f0671248b349e9b4587a248a2459cc31f0fcceb2da8a5d5715dbcd9ac92082029bec9ebef4c00a59f18a5fbecd81ab000", + "c215694fddc95dbf210c4e6291ffec12c2dc431583159efbb0ea0edec08549cd27ba5a682b07fb1cc97e6ad92cc8c41fb6755ec2fda6edae10c575f93a0b761901", + "b23e9e76c81ee93e6a27e984bff91cd9546282cc55c8c8bc06502715484fe0610692f71015579110c1f96609550e7d4b0c30ea8fe291c80c73e65915b97644ea01", + "d0e910ee5328f38fb8283e87e7e64c38a99b2cf0e3ec5da096b032d77ec7be814a110c66b1e13632ff373b56c5a307d013d636aaceefa92f9683f71ce4c7478901", + "021a0670aabb167b9e7f184501247b031cc34492e2f22565b3173aa7091ac49f64c8f2535cfa4855ebf8e4ee1e522cfc6242ee87cb75cca29623269a954f465701", + "aa9c6f5a2ade42fe2f520115508c9182fa9652880511027190d26ee56ef088134d7689ceb3dd7a1c6350b8a49817759ec15b9d3ab7f0514ad51446902b41fc2e00", + "14182c66e730a7a8c22746abbb683d2f65a4492ed644e835aa376d81d848edcb229b813c89ce41bed07b4114b7d8b558a7b53132065bdd9769c228d195a204fd00", + "4036bd33c3b8e0aeded4275d0d5928c71e808350ef1c6926987c5377cc48395870169fb2987db63a5641080a2037e9fe5881b8e38e493063727d31327d04952d00", + "8434cec2a8c8ec3daa591a4b2cfe87426b4b71d0ae5397225ff39ad01c5fe15e209ca7e4de4056a64f043b73b622ccf4d2b3d27f362cf7d7fe932c5f110d986a01" + ] + }, + { + "address": "2XUMdVGXbHaBmFBiYcfwssY5vXnQTav3BP5", + "bitcoin_address": "1HkYVzNq2SJ4qBmLsw4uTHqDn1Y4LtBa9T", + "secret": "312483999efe5e2a416a5300c9ada328cd422b8eb81d348aef76b1ab254ffa31", + "public": "028992d0ba3ec0cd066223a35fc6221c89433e373836e42ab820909dae2a7649c1", + "signatures": [ + "da51c05e697d2eca9f130713c958e0517d17a8ff829f6e6e7df581c74954b1b75d475bcbe3e96fa64048fd89cd4f5abb418efdc780ae1fd44553f9980ded225800", + "d77d1bb5711b9f08dfcf7f5cc69aa3883c34b5a38dfe428aa705ee2190c2ef6c4a1572e07348616f57f1a6133161136278c39a16a421039c1ccf6de16a02431500", + "6cef8f2474eb973aedcd8e86fbf82de5245db429408e8161343d681440c08a0730fb6f80fd42ba3f10a74a784b18e3cf7c36a2cf89bae3446f0348904527d55400", + "296ca1df8fa846a321f4ca49b76e06e2b8712bd4a7276f0651c38ef1aab9af265c411d0a76dc499073e7be7b60033db5cf2dd85858311c17dd9fb7582a954a7f01", + "3528f0101c5dc155c9d68580ab804e424a6bf81ea85bdd3864ae6eb347960aab33b20a3d4ac2763a2bb50de1b5cf11362086a5659e5859c7d6aa2d64d6a489e501", + "3c18a53e7f1a1d627435f685d3dfd4b7ae2c40ab4b43de1c559b5f8dea6c44a358fa73f0fe004fc42c1f660b711215e477a3752dcebad0af01a4d86b7b3cc91800", + "7a5d1227d136933f935dcac3198ffd462d00fa9e91d76d071d69331cdeaa98a33ca61def907610fc121daaa9d552f872090adb31d25f60023c9dba8d422c335c00", + "a3738eec0537aba0fcbc71627f588452b7401e5892939aba2119e1b063902da55fd912777e1d2bcc61944f77236efd2d7a84f3817b1a996a320f71fbbc7dc0c000", + "3afed1e7749b9bd23a97a55bf9e6aa9f9533151ffb731afa52455a00ec9f1aa9575369c0ce426d64830a6bfa708218ebd337728b914297002db298f10cba9b3e00", + "b0886b57153458794497fff860c70955b7ea80146ef30e413300527f547798e3775bd769893bec65c7cea503d4fd8703e08b6aef736027ba2feb06315f9b2b4000" + ] + }, + { + "address": "2f1gvQUSUucGZ1xtNcqDb2QqT8mR2YtJF2r", + "bitcoin_address": "1EtkQmyW3b8s1YDrAfmZKCg5wco8az78Hm", + "secret": "435d065f46be884edaf18ef9371ae6b9723e0931a45551447826368b3b1472be", + "public": "03dc267f778651a06be4b14f2a47063aacca922a218a1f984f224a8ec55f6b8da9", + "signatures": [ + "2c7ab60525daea6fd2bd2a2944d3f7ac62443f2c5f3ca4dea2252a7bc6d7a7520cf8e0e0e29167cdca142e1c6106b0f723d9caeaf181bb7ba7be3d3dd049053000", + "49dee8cb5efabb28ab2bd248482d913a7de2bce830637728e6926ca6f9607a8436eecb06aadbec7eb8fc49064a73d48de1215d2541e196f450a870565dd8562100", + "1ababc8f886af10ae76d167a93c6a6d5049c7d2b72257c6d51fb0242fb2d13a027b92c76463e3981489e665b7bff2707c577d960cadd5b392aad117f13e1218500", + "8461a17909adf7e7ba21ba08f9a351e3f059cce7b81458121e432a1b07c2353e46c874dce95d02adfa1cbdd723785eecabe93c3a65ac732e497a6a0adfc0350c00", + "3e458d37cd58a426d176f2e3acf123880f44607db8805f5cefd4c438c4eb1ed779eb69fd65dbba39d91cbefc9f54eebe9322aff7c8989f506cd1bd74a05fd66700", + "6658d5242d1fb860d4de1d54cbb6290893990a84bb139a9b79c50c20fa8f5add37af3552601645ac8fe35ad5790ebfd8fcf8b371b9f862e67e48b929bbba3f1800", + "71b2930f5e1b703e90d328f65164673a26558a3126ead81d61807354d59cf91e622d19725c201ec16fbc621feb5679957bf710fb5d54935673e8cadc4e25be1001", + "cc4c1e0fdd2301539ec0ace1eff47807af38c26c20c0b7304abfa75346472ccb38dedab61733895911e37591b35eae5be7daa554f22e75baec3f5b9b158d758900", + "5cac030ff5bb66bb091a86693a2d972540cfb61bd79869a866124dffb515f50907f7c90e99e09c04c3bdf18b7aeb5a82d5d9d983e2993c01a75571a335c8852101", + "9758a5917b51e9989f476eb9fa051a32d2ecf19ad6ddbc2aefb81ba95c16e52d3dc528db27b34ea150344458490d58868e5ca493b8ad4cf21dc356e776d0d54c01" + ] + }, + { + "address": "2QnMSr9PedSgf84NreugQJaxnaGJLHY9axQ", + "bitcoin_address": "1ELDRCnKJTidvyAtN62fKUgeAb9KSToELw", + "secret": "9e3b1370323a9aeb7ef6872489f3e33a0349235854464d656ce4b0dc00ea56be", + "public": "0255538dfa3b6c02635b667704512bfc4c3d33c48dc878d8576076e530382f34e8", + "signatures": [ + "9e40e30eb9ad0d99b592a148ba1066542651e04e90bfc30bdd98c258754ef77d500d11f51ec5eefa4a1be570d12cfc580bc55793fe430e75e31676f9b2c1bef901", + "0f19610905349de8673a6c9ed78158a899f6fd25a37efd22b9657af5b51026246669112914c6d203364456d8c1ae06d5767bc12ee51e91608bbf8b54ebf2ae2300", + "14dd6d4ebad35dff18c60df85ceefa17a03a9e0c5e2c004cc0ecd29ca8096e716333d8e24a32d0ab3cd74ac7fe917e4ebad00828c27093b6dd26eea20f0def4801", + "ca337390ff73808c302904675b4f954b6d4be500ed1cbbe1536693f3ed185edc5973e64764773763408d366d7dc80c209fb3cb323300bed542c359686548046a01", + "5bd597d9019853d5d13f89d55fdffe6a12e1f1969e786ce52aef28df44da1b04595b497136dda48e5eeca2b19741d3851c08d51b18a994f55e1c45bbadfe9d8a01", + "90d711499247f36f3280b09bb6fb9d1a9e89ac3b055bb59bead4c08945d2f9de59f0d6840314ca4641d39a80d9ebdcfc6cabc603db53cef6fd12240c576c7f0400", + "9f742e202407c4fc7462278dc4b8382ed34161faca80f3015861b8cc9cf9b1256d7017777e2fc68eeaf913725dfea2af2cdcdac76f88415dbcd2f6e65b9ef98001", + "20fd3fb2c83a63f69a7fc021d8cad22bbf9516f4b1f4053d4e032d5089d644c638eab2fdd8cbd9a7e5e2d797cfcfe6426aee8bb570c6799eef48a84fb333e24a01", + "0f4135937cde24fb32c92be875d39022920e04d76f0a99e60328556570b2250b69df184f9ea803c9cb720d441139d3369e29a4ce53252d7b71b015303d6cf22b00", + "2cea41e7728facd686876fc173ec9f3b82e243db23d284394b46ac929c254e564a58772ffc1cd1ff1940d0dc5ad7969f134471ab408acea0116c1bf2346befcc01" + ] + }, + { + "address": "Zi6vjiuB86UidJSxPnRnLuoQKNqbhKDTQX", + "bitcoin_address": "1KG4D2TG8R4XUGo5nNru95r1wNVNtJB1b5", + "secret": "a7d72f9c41978b79e61dcb6de20d05d31850bbbd5defe2e594262157292eba49", + "public": "02f947801d035fb531c1859be4045d3d6f54d4df41927277a42040c25ace724972", + "signatures": [ + "34e7d96043aaedc7b18d19a44934e9a59695bf5cb2b8ce04e845b6d5547103f046150acb03a3d08dceee0648a96d0877b7747d07d609b5bc2738eed78406571101", + "9eec6edabe7cc6c38a3c8f731aa310683f5b1b5b7f18ff597ce1cc85b69316226bdb6a853054bd0e0b07f7b6e95a14c1b331ceb47c42c7de0f64978e23c3f89401", + "024c006a48beefc070dbda72b0335726bc875143330cd5a5063b5d36bf81bfa971cf8b5bd8b0a097f9ce85b5e1e32d3516b9dc7fc18b2d07f967d2a0a85404e800", + "fae32316c3926889b4a6c351e32865c5f619e84678db65eeb9a8b97b2aa60859246e416af3844a9a8d036fc95cd583ff6d194424fdaab1a75d6302bec4d5fe2101", + "c8e1782059a35a98d0dc23ddc45a29e6ee37855e7ffc3a2db02ba548be82943d4c01190bcb22d8bde6a18545428022a5cae17efe9b1b59bcb054190016be55f800", + "67437425c618bc99fc2b111ac534a8337db17b07f05c2dc0c8699809de0c69ac5201bd0ce83d4af61df6597f0aa819c66c859b3fdf07e12739494e942dcac83901", + "7df6c5bda9dcef9a81ea470d1cf0a6c465220ff8cdc9a549021e02fa1dfbf2aa16f2434d181db5ac44ef949b0447bb56ce0ab2cf43e0ee6c7f4835267c12d48401", + "a55b5663ec5c53f034f45c199ca720198e272d25012444d6ed1e2c8dc312223a084126d0b7b0cb0dd9753fc68d3a1c3daf625203756c6c92a924aeed718680e600", + "c3a346976e04f54d750dd830fdea864495e3ae80e1a3995e5b7852db907cac1f454d95532fb7c536daf11003987065fc835414b1a19cfdd9d08f4332ae1e691901", + "53022befceb0a4f6de14ee1a6f287e75413614f4df77b0ce4c1a1e8d85f8947e7ecc9ede42ba82ee06f06b4a6dc70a25cc12fe9ecc6f1c4e31350980140144f701" + ] + }, + { + "address": "2EVQ1xmJ6A4iHeZXRtD7DawoBoxX1vRmBxq", + "bitcoin_address": "1E8ky3Yft457oH64JyNQH8DLBKBgE2cSD5", + "secret": "04ccdc4fb9e5d77140a5ab7710b4993f9accbca372d142e358301f1bf096e05c", + "public": "03fc5a8249345fbf2b876f4d0234efec9e88b6a9b3a6ea3fdaede839f0520cd2bf", + "signatures": [ + "a47efd9e820c974dd9107bbed207f6324c042a21ff0d41e323f799974ea963282fe800b1f1067d8c7753b3e666dfff01f2bb6516121fd1cc3afdb5ed2d45ffa701", + "39b2a9098ed07c55e1492ac28673dfde7a9fb683bbc5c9ce62079c7abae343764dfe618112bbcd5805226e9a45a98f8efac840d38ae4db420fdc13e6dc9f05a800", + "a7934bb9e039f1ebda681cc87c833c7158666a9cabcfde5ed95aad53f1fb529733daa506e7f65845e4a5c7891ae059d62a52885010a4113d844df2d03acd17ed01", + "d8dd518bbf0d921954a840ca9326f9eef5b17eb00e4c158c03b298426f682a55077685305337e06a1d5b0ed3d48be76e6a404eda1bbf4a0f58bd84ea0920a28b01", + "3787c025ec0a21ef202b340770fb21d9c5204d969feceaa7639316b0875f0a6875db7554b4cf67c476f32292d7415ff07eaf73d9922e2639890d15dac3fd2e0200", + "89dd0b2bef097e4a7da14f90bca131005084ed954434627ba3c9e904515120d309a0fe9ae64c5191eb483d07a294ac37be0d53153d511dcfe8a339b79db1572b00", + "b559569007407a5cca128d0a3153a8572d8e8d1c765913b23ea27036955962470abf538464d519fcfaa4caadf9322c3f0a1a432ca5d3f45bd993c6965f4e63d000", + "15ebb160d7813b01269fd09e07d62b27b1665d243ee1c1be913595bccc6fe3377b46e2f1ce0fe485a810bb98c988d70b9dcf3a377d99ebe664b88a2239ceeef800", + "1ec59aa97c2e40a0766bc470b0a2079c58f337a6c8eca1372696785446f77b1b42704bec74c429eb2a084a00e676d084b175323dd43022f99fe513c17625d0db00", + "ed37c8d62f87802a0cc8e2feaa56c9ce46681d07f31da88c958317e5616b1278043e6abb646407909ab2d7f8ea880a7d89e696052a9b01da573a967fb91f141301" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0009.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0009.golden new file mode 100644 index 00000000..0c81620f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0009.golden @@ -0,0 +1,185 @@ +{ + "seed": "vWqzW+tavumliuNymgNb1scvd3DxS3kEU9EznZRyjys=", + "keys": [ + { + "address": "dxJmhYz5CYqbxaurBDKndour8bKsX2BCg2", + "bitcoin_address": "1MAstZvnBScd1L8UXFiFTrx3VZpEAaa2dp", + "secret": "103bc41600c537a83751efc3b3375224ab5e50f062d5f679ba39a69676ddf4af", + "public": "028628228b9fa099df41f59a84685964e7b5b9aa2c2517027bc97163932d3f44e1", + "signatures": [ + "673112ab3fc33c8611b71baf4f5859b11f15775c619435285c076c77406ddd5b355ec1dc1091481ecea3ec23b05857fa5756842b19433cbd16edb98b276b4f3300", + "b884b685184fd7b18465d266e5c0aa3f715ef1ebdd2c510fd1d93985ed73700e07cd8967fb4bb41baac5dfb1b5acd43542368843571a8c2328c04ecd99480fc700", + "74ab28ea8eaa8abc10a60900da86209415f9c2da7c40c4dcae9c24f4a7577607264c1fa8abc18afbdf618726c5fa4088d074b22281419fa72042204da4d101f700", + "42e5c576f3c946efdf7433f68bf8bb08bdb9a4cd96b1df6ae21c1f977452565b144a0a3431d1fd01964c016a545f70581508ada70ed2d2e2471f61adb9fae9e200", + "d94e96c42e8206c754363103c1dab199ba324ca4a84382800cf95be2bb2fec4a641352aac50919a636cf60e21f6124b0898096b2537737e132b3a591a73631de01", + "462dcbfca20d8db7933e5ce611bbeaf3445be562df729e7110fb262651efb8512186b6b19902894c2ee0dd2749612c839976b6ba56b42d091357b9f63f40400800", + "1a7f718160e4ebc415679c176b4266582cdb59d0d3cc6d5844375604313513356663f148e0813fe02a6b4e657c76cb2fd5095a78048c639e431def9a0ea1f36e01", + "0c94e5e5dfe0ce864cfbf722ebe2e567f7b3b0303eae438f1a8fae2c232b8f95344ff2b43c1c5473942eda7e2c292b11c99bba70281964ff03105a1b916155f601", + "ee890cc57362d5adfb7e664671a4073c5d126b5da52835089916e45f5ee71cb227bae34bfa070ad0920bd9106fd0bad517bd7346cd85d7042a2ba88c029eef2e00", + "0199f28e2f9497c17c59e31c863984d7d4848720c9c151b6334e2c56dee15fcf2d642e073bfb728498342d9f19ea1dc6f9a4e8af31056e850405a5009be6f6c701" + ] + }, + { + "address": "wWfAkC5DRKmBesD3ycyZPLA9WUC5hKBY8J", + "bitcoin_address": "1E7TnoD76B8VAnNahgkt3XdYme5hC2MjbW", + "secret": "ec68100218702342e62a0138e49fecf0281e97214f224f3ab2591be5094764e9", + "public": "020c1e5d0e449141cd10910c9ae064d878537bcf7a617e6f694a9f377a6528b96b", + "signatures": [ + "74dd33ff9586150eb0a6566e31da608be6cd9519c0a373a10794a3f2b0415ffa2f0b4304e895b4d9c7a6a1bbcbd0e4557800732ecf39239c193e27738f432fdf01", + "d23c6e62b777c96c1e21091fea380733c223bd68811c7bad12fcbf9a159b84992c7b011e4152d0339bbdc4ead5de4aa1a288997ef3a5ad0bdaaf79653077df7900", + "237df8d524e32e90b2e2e009b0defe40769fb341147191b2ba45aa277aadf81068fe8f206ef713e674ebaea775385b053c85be37dc2490c0c4f736a7a1feaa8301", + "83157989273570d30d0221ccff0497c8e9837d728fee2adf2b3142e8f04cef2943410fff868ec9c7e68602e083420b29706d3926c2d397e1e1587c31a60c9a3501", + "34212857e85e5dd71748f02f77941550164b4702dc55cfc835a22cb99e30ece054c53f43a3bddf4ce800bb2aecb2ecc87137acd3ca8a269af9763bc3abfed62e00", + "5348dd18e2bbc319860ddbe3b5ef9627447718252a189ea5957982acf54f0c3d4d6bc9d191cc6cf454281cb74fbdc9e05971b712119bd39332d94a4d03340d2d00", + "14f7d8da4fd890f6bdeb978a389a65d954a82037f1a59a3c22a952d1a6071a5601c460f31a6cdd5b9749412d44b8399068c9605b18c9677ab89ee3d92fb74a1200", + "4cbbb3a086dbae9049670ee8b55e31ab36fc012ab22674b4f036091bb511011a5ab11e3500a47f09b0187a407cbbbcaa3b8addd885b6b0639278903bd2d64a7b01", + "c8db912171497d49570aa43ccb6a5984f25fef8f44dcfe6edf4fae6e737082ec03d531e0f77057b47dbc5e50af5b67b74fb8915fa802f21e63c1db9125ce579300", + "d13cfe83aa0faffd130cede0acd5c6066c333474e7f2a059be3e3c27c081620d6f5fb985f4f595377332abdad3de0e27db9ccff7dbb24211b7375682c46f3d4601" + ] + }, + { + "address": "2NpdyMGSis7pKksyJdw2Lw9CkLxRXQ4mXfQ", + "bitcoin_address": "17oq2UFxc1MQKua35heEuVUfoJQzxFHgJe", + "secret": "e08ae8786cf4f17a7b6024143f7e99261b0f30f240b4a4eef241051f4b051c57", + "public": "03185a63e2d55ae868e815e5ccec398ad955f5ddf8f7f5878843810d22a95d8749", + "signatures": [ + "5d97d0bb03d8eff8cd742665a59e6cc7bee75c809f46396b607613e5e6bca6a84aa089f7cd8f53b18d6bc3068493ac1077da6f818bd65e18457d5b457549b9a501", + "66db0f30c1e6ede54bb6f70fff659935ac180bf41d62b2f3a649d8821d90e9f9452393d0ef245a4b9070a3e7a93b05fe3933ec5bfd3042ea3a644e77816e57a900", + "4dcd8b7df6aa6fddb60c9ae6781426d09f43b3f72bbc8c6e2f80e2f052bb29fb68d0541edf0bd7fc58b468850110fb3209742c3a1e4cbd0fa385adc55d76bf2301", + "b64aa7147d42e3e67617f21b5f49d0ce03dd5ff677efe922a57d783f438facb43d35df5d3f5bc6bf4418b12189bda65e791e837fab789f5765c58a4f3362758701", + "a61449bbae701565ec8b9101ffcb1e5cf8ccaf0148cc074649322d2ab07df14329b60562740b410dd042996d17f9fcf9bcf48eef01cf14439cfb7679ce49ace200", + "9ec3b65bd966d8d29037a74ecb0da1425a8bff15b82fb5aaa5ce85dfdc26a0c869d43b8073dc98d9871907908b13ed80997a11bf61724646d94525d0ca33185401", + "5764aa6b439d5eaa4ea629cc0bcd0d0bdfae933da8a4aa1beaf7ed8d6c751446784fbc57f0182c6f7bb13c33641dacfad3ca0065c1bad8c49690ba42abaf00ab01", + "1a48518590d1ad8fd92863486c10078b3c1703037cbea02e81ab17c41f52e8120b394db294c7ea4a4d8c9e5e735bd30c3a1574125e8005b80b2d429c4baa764b00", + "12e8b5c303a9d348bfbbfc7ccf5a74e9c1701482f95d818f51aefeff982e18ad0e25b86221553e6282be68cfe384ef7729cd716b3b66e48863fdebee137d2d8801", + "d9abcdf0970a1b8fd7721fd8bb7a6f2712cf331d04e300b7cb0a12caef919d2b335bef5436cb624cba1aa669df168840eb80e0f9f40c6ed180ac58fad922a4d601" + ] + }, + { + "address": "2YsC7EayfSJEMpH5tkFABZ7NxksBxUcRKFM", + "bitcoin_address": "18MyBDnkWSq1NCmaLQkq9Jb8dhdZBWmmmh", + "secret": "d609d3e43e182e23c9414e10427b1c8437d5de881836ae882819b4ccfd39ea03", + "public": "028158909c3c9e59135b6019738c31acba380d2d42cd07b3bc0e302fbfae9c3ed0", + "signatures": [ + "5de888e7d8889d800935e92430ef045b4b61896ff9b400edea6a9f184e56be5954ba6dd40388a43332cb2515553e227e936c3f39a40ae7fa254a37dfd478a89a00", + "9534f206b47c69377a9134a5a372817e68893181d5489f411a90ab47748e7fb621b840c0d2a857b7555f266611960c47814d3c9460c6f0ee33b688a7a95e0d8d01", + "fdb21218173ee37a35a864e6ee685b66ca3b3a62275499b5050ba9563203634f7f4ea6988aef0cd05b504e0a4f090a341d3cade4fc72876171a41d4a8e7900a001", + "c444d5d828e5d9551e6c85a0744655d75fdb35c90174557c442f6866130489a07f8d3e72ab8f1c4937b5b56174e83f1f0099fe8a90a2034a30ff33a58cd95b0a01", + "7b105ce2133aa4f330c7bcef90473b0433ffb8f15eff07533f31083d816a05c86e18e972ba8200db9c173eaccd57658d29e541805c467642b7c71fa3dcfa9e6d00", + "6c83b4cfaad9fe84e9fb6221c96f3e3f7a8a570d912df042c17f01877fcbc5755b52aacf432a0655461446c25ebb6668828f2c93930dc0c25cd0625204fc6f7401", + "a524aef799f60bda7106f53f7be4f6dfa23c650f0183fb6c8c7945f7a1091db10b569cf203541516404853c6f84b0c903015bc1ea4b84689f76503af90819fc801", + "64e06be4685c5f44276114ee82eadd0ac0fd2dc32e06695aea6b9bb1c4f539bf13a1dbcef6083d764d8fa1246ce72888fb242e5e2e2fd40708a1101f078f568400", + "0405169edaf9044e0730ebfadf22bdba6d29433227626eb1183b4e1fad384bee129c911097fd5b5996a045a39b75fae33f20d6610f3c160ba6c9f7fa61afddad01", + "3a4d6eac4ae0c420a2b07539deea5b9703816b8f1c63ee015e9300a89192035e4a6bfdc1c0764268b36f545ba40dc69b0de024fb89b367f74f0582c49991f1bc00" + ] + }, + { + "address": "VWBgiD8Bm82C5scBT7ouJXUdCt5WYBmwid", + "bitcoin_address": "1NJB9REAKRBoAnQ9dFrczG4yQsD8uA4B4p", + "secret": "cd6cac0f13566084bff6d1415a6cf5b481d1180dff8041f4b0cbbc3ad9c45575", + "public": "02db0ddcb741d0ea2e05d2e299a09d063456dc3370cb8ba32adbcbd5f2de195d55", + "signatures": [ + "01b8d8773c41c67426921f5668f6327f3a678119f207fbbb3ea88031fbc3928a3b516ef61495997234e59ed5548b5ed94f59f988e3de4d12f57bbfdecf2ba00000", + "1832e3ef1aa54595cfce5706271449f00f634ddf07a124673027e65bedfa3751377dc647490148c8a753c8458824edeeb7a6a1dce149a49cd57f04d26cf775bd01", + "a32e7217378671d22ee640ad993cefe1cd7d35dcb8ec8c4946a202246b8ddc837e0933dc6246bf061115e7adf77b1ea7cee2e570da6afd263c4bee68061c7a2601", + "ea42d95fdb6dab4c5df0cbb87fa8f893724d26b1784b7e19eb799f1f8a5facc34eef7b929acb300c953864ff36dfebab0e4c069174217c8ef3cfef6587f5644600", + "a281a7e62930e0ac659ef9c372ad192cf86db5f35d71c656b72b03b9b439fc8d551bbcd58b8904f8653dc4fb3698774cebca153ea664040ce0184be627d31ab001", + "83c70b8c70db7fcb8da6887a6c0d575383ceae53c28f904a31ee69ce6106317a23e6c764a23b55118cc8d52bb621ee3f9782165580d98bf4b74f10ccdac5f2a700", + "42ded223b124824f156a96ec2a3b39a98daa76eb845e365c1238a38f7b49e663286b94e55dc245221d85345497f223d1dd81aecbdec5613efe4c4ca901a3c9ee01", + "c07eed52f2b0a550e57cba0175ec37fcb71aca4ed0fc37c4528a01117c6a52665196310f3b56b8439a156c33ee67a6108cca46b7b6081c5fad30be432f2f0e8701", + "04faaea1a63d8c3fb7174d21785afdae0e8520a4bfa9e5a82f4915be48cd4180158490d079fa2b7633d4082c8f1ab2a25a9ce4e99690b08cfe95ee60a92eff8d00", + "12826d3405affe5552bbe42b5e9f1ffcbdbfe3b88b537ca1c6d52a53fce068f5482f9c9026b8e72858506d9b8d1bec3b1cda36878ce979916382e880af7715e901" + ] + }, + { + "address": "6d9MoeBRrPUSW7C88QFe8T83GKxKfd2CY2", + "bitcoin_address": "15aBq8xuAWsLY8aaC8KbGkP1M8Fq6otHtX", + "secret": "e7cba671232e76a905770b9dcfc280a0f47db8e37fd2e5cd32cf67d3d7e44c4f", + "public": "02ab3080b4ea8a74789ca7ba75577609de2961e01e583d8432f50e112ae1c6a7dc", + "signatures": [ + "0f15c8684f255ae234760053b193e2e3e799e0972f11aa7cd6ab62e29a4fba093d66356b08a0fc544a6c62c37b419e65982dacac87c445570a76cdfb3e981e2101", + "84e597668750e6c582ac72925d5f51c1ac43913f15472a13f45470d8e35ea6da6134b2d0fb356a6386a0d7bc95b4d35deeb8381d61e73ad852975e0c188364ec00", + "f2be4f437fb1a7f8e6ae876833d02a1b2407e29c393565f43cf28a6416cdc839593188c29d402479321d4cbfe92f0c70664bf19f550eba0c72c2e064727b93fc01", + "e8ea5937f15a16c93b56b60e527f14b343453a689b2fbbf98141775e7419f030190a32e8a831c4148f703f1861da656e93365cf6bb59aee628270bde6b6310a701", + "122ebc51724839413d8760e5b7e6317e7348e3c06690083baa2b5dda38cb103d3d6fbd0b924cbcdb4803a7c13de1b3a3794b464a6e2cf7ad9cc33305cb3e704401", + "e68851a6bbde68b5645eac304e0be24f3e8b51c763b0a5b3cc3b7d58b9ce1b4a3ff54a30199ad276a41015781f951f058eb20e513dbbe0097da5840821afa8eb01", + "23555eb3dcfcb3757f0ab11f822822da366baa4148448e76f4123ce944f0b4c80e1998aaf3e00b38e8efd33d8cecfab46901cce7655f37958d67d92b280e687401", + "46e956e8a6c12707ed890079afdecae1c94c5e39d3d04c312bd5477e6770e3274fb763ca342857e80358a2101e628e7d1a653f227307337cb292a005ce2f03db00", + "d3c7b3ebebd0fc24f378f1ac9a2f60bf9c96d9d88d64369f33fdb97893585b303d6cf556dbc12e991c336ac7df9e48cda650f4e5219696108f295af769cea5f601", + "9f8ba0642998c5da0c4691eae7a51a64120ab74ebce32d58fe8f0c11683ad06f232dd3f3b0b9aec0b1c53687298be5584b259bc7738ef54b247c6e436929e01200" + ] + }, + { + "address": "UBGqCZrRCWLNVUTejLUTmWs3ZjcdnanAEa", + "bitcoin_address": "1Dcp3so2H2zR5jQABLGgTD1PQN1D8ZcqMu", + "secret": "cefc013f3eef428213011a542db07a220e85b2ea978caec5c47170e2fbc52a61", + "public": "0316f70fba8d65a0f9f3e49b1cbbc3fd3ce83b62725a59ed85bc1693c98e9c0f24", + "signatures": [ + "e15da877661402d0c6c8440d05c3780591c61c5f46094258363b5ced7a3c23e565468cd9cda0a34be02efd37e49239d3b9d6f3fe64f53f359dd1dc52275f6c6900", + "b5dd04df253eab7c671b4414e1dc706f703016f9f545e4d765160fa8511e4e553ce7ffae05b9a527b84ffeca7ea531a7f8bd51add548305d3bff5273b3db6b3601", + "c3135db42f34ab5443ba8ce3e6833c24ca84100d3247fcbb71b8615dc958ee917edb1deb12bc9eb3c259d43958ee10a53e22e966ffeff4116a04714a88ee285c01", + "9183ca8eb77e2bed8c9a788fb13c0f2c834619edc7013f58ae7c7444016012ff033bfbb32494cef26f0e308aa69d4c10cc92b0a8dc3da23d883319808496dff301", + "7ccf91f8222c834c99d28f79d7f858c028150bd0f234fafbaf55a39bc1d9f1c30c39672373d94b2c66658c91f770a280882909717eb4e6020650cac801c7aa5401", + "6f7bd016f7130ce5f33f46da12046b1bc9a8fc03e5fed7165ed16b1eb96012b12ce6166c43af598e24d8eaa8e08c60923de15e55088148993cab843f7fac758001", + "1b62fdbcd1b0eeb42a2ea162ac8332607007d3e94c40d3f329fc5f06abcab57b493cbd3f4b490c5635390500c66d45f51bbd340899922aff54204a2cbbb1ac9d00", + "bba47fe6febf896cc1f9f02a34d77710a050adaa8fbbd9ef2b51bbffca08cb9a22146c0eb84099cf48b499715675417a486abe4de28f99a24a75e9bccc1e91c301", + "ec16b3721e1f05d368969b88a9cb476e8aa7c0177691bc080d5f698decf5969f5d7910d95360cd49700f191cf0f7745d01c09468a1061d28630f8b4f923fad1800", + "76a0ca994efc4714a3d1bf10c7ad81825500a2492ab5df87682acd145bfc6c1e234c1e6238254bc451ae957353531bf2bdfa7899e99c3f7eeedfcc0d3d35a9bc01" + ] + }, + { + "address": "28mhRTjG2P2fah7AJuUrBygpxhmheYy4qwi", + "bitcoin_address": "1AfeXSrnGF5tVDXedZjEfz9WkH3Pi5BdCW", + "secret": "a5bf25ae3ac443489d23aa9fa45810a36deb19fc56fb67d09ca920868ee81933", + "public": "02e2a845979adc6147886e594728f975b3121fbeae3bb5e026a2b2738c104175cf", + "signatures": [ + "459509346729140b8534d06867f7c3885a59b38ca9264ae6243e83fd71ff023631aa62a9926ebc21b164717e227813c0a84b222cf7881038d7692c208f1911d300", + "36dd71d7c43b438be226dc6bb3d1695162da774d4aa9d73621ce40f17e71d59c47129046201b7f7ff42128af0df2b8b1075d3c96135fef755cd50d78f443965800", + "e3dbb279b2df949cccd238fd7c9682024a7e86ef4be62c46c21d1a5add6d5bd75ece28373bf65ef0ef01e35873510e1bd6d632390c1d0043af57ee6fcb8e423100", + "21bb5e11f34214dd7472ddccf0e156ae8c2a3b2519022246ba77f2ba804593ee21fe5b20dde87ac0e60948400187cbef45b70ac20f44add46cfd045d87b839ba00", + "f8ae837a61c9a083e366417f0e4be2d43d490add9d34ff4c513d6222194c16232a01b51b9205946f4cd66a5ba69f1ccb6dd4ba3906ec17711547378545d1be7e01", + "0393357ff49e2de374492fdea60319320c37ccbc03e7e6b9ac42ee3422303cfe0648c75c57d3062b5c33634ab0916baa88a998505281287e99ebbb000cd2e42301", + "2900df4afc8b3a123c0ebca53ed6f6398e5172f5f9676b76efd6dd2d5c4fda68568b72fe2cfeefdeed89fa2604d7bd6b3bc9ec9cddb307832a2d4368d863bafa00", + "f10ed20af67fd8a37f4100885e08195460728c89dd5651047e658cc679237c445377114888c7f4402140f2886492038be603087cc921d1baa2ce5ba62e9e40ad00", + "8e00142a82c8259adbb209104373e52d7b3986fda2a29af86e4915706675a35b3af0b4a31002d263355d47e6072a7959d4eacacafdffc5279f6e90bab4e6a84e01", + "87f22431354dcb7f1484d18a1207365d69b69341bcbdd49dbb76ad9ce53cdd3f7c806f14e71b3f05fc1b43726b3be409cb4b06f2738553c61e2ee7713898157300" + ] + }, + { + "address": "o8KcCaEq7rUzk9jU3ej9NXz8ySGoAsM9wq", + "bitcoin_address": "16AMWy71saM3WdkKpUvXgcKbFWVkqCJRNP", + "secret": "a774d84ad42813d48f293e77fd9d872d4bc5dcf94a968fbac437811a37e0273f", + "public": "028084b66fe7cd20247fe319bbd62116732e22219ce6ac0c38b10ee7df6a5e84ef", + "signatures": [ + "1f173b3cbdf6157b181cb88ba8fde5490288b1c994eb3d15dd64109207aa330a1eb99b8061555b30addf7e5a1410b22c1791ec979e9f1e359fe67bdf1bc331b000", + "e44ee5d90f91ac62a4b08ca7adabb3f4fbf242fda2c60db76730788a1746012517b7e656078c36e6d2aed28bfb65cded94d4f776c7f3e339829668e2d24fbb8701", + "684052ce6947cf8ef9c661c317136f087f8ccdfaf8b9e9b309c6e61ea43ae09808fd5a912a45e6ac71e4833d7089e1b610dfa1a67e2e3826722a145efe7ced6501", + "673ce36127a13f491044262e8d238aaaf5dc806bed61d7999a262ab215aff64747c2440e532d8bdc6b04b889aa856e0e53f2fd1bb2bc514854e46cda7fac379f00", + "2ac98375228432233fb3d2d3e3e985bef2e46b65a906300f759f6c5588f30d21656385d9a48412387199a44eb21ec2a9da4434e981c5b6e1dc2740565a381eb601", + "acba6f64c54168e9d0a3dfc01b52326a2c2f18d3af10ca6ebbac6bfca02064147887a6cec9613dcbbcb909de55dd5870561c4d6a98683cd1bd34db16c93f6b4a01", + "9b0b680d306e8f196fb882c8ad3fe3591486b19487c5ff7c5ede4a9c86809da6586d28e62bcdafe4bf6d1f48b0714e8f876fdc9bee9c5a946db34d095fb66a3501", + "5c1a56d3fcd09a8d749ff6e69eab86c3a850d9ac4cd4aad1e650c7cf83545cf22192288535eed8d67b1bcd49ca0c4d3ec950b1eac2d1ebf52d052ad46323f76401", + "4ff012ec8b1e136eda5d7638e407985ec6ac20932a60cc9f6387cfbd07e5eb8c6b9e991876f1230008e76b9881425a10f74f731bd67b95c44fecb7239cc215df01", + "15f1b3110921e7113a3e2c0153699c4932189a9f11e08e5e780b171eb6b3dfff5ef5c2b283ef0883ce128c32323efe8ae4aa240d70113ca0103870842e65482701" + ] + }, + { + "address": "F5b64tWsytrtoTB7Gka3Y8gL8bcozi9ZwC", + "bitcoin_address": "1NmBTxNGgVNnWk4fM6vgP7cuFTmBAXSNRf", + "secret": "c9da0f4e53c8299fc289eea70a8204053f8e2d357496bf37673b7a2a09606239", + "public": "0249ea059bbf219d4e5fa61b68009dcf568a4c3b8838281066098c9c70e6302e14", + "signatures": [ + "2b6a68e36f23bb4e70e325b74df03af03507c617e1a3f2f3d9ae9de51684e69502a1d4b9d4576a58851c3c30dda5098fb5e483c387a6791d220ae360fa46db1101", + "9bf76435655fd5517083d56112a85d6390f2cdb29ef0083b72f05fc80513553d3855fd859c062c615197f85fa6ea2f64df0a08c05f6fde543aae1e5b06fb070001", + "b4b3d577b3f634171ff462e6ea1a5d7847095c9be3afe56e1ffb5910bdaf5993776a79fb0a11d31af5b8ad03fb82dd60852da5db60812fcb66c430b76e6590c900", + "aea6e04924a561febd89188d0735fccbc342d23afa7d4874a3fb7deec80e38902c85c386e2319bf165b28e07f8f2e5bc65d53124a2e18f3664f14f3156916cf000", + "de5a68867d648b90fb090b366800a458eae988401778295d6737161bc2cb403b7a6c65054ab8a63de5da6b78017dba1fb5225c6d49fa02b0a884c8139e00b6c601", + "b00a6f1b743f2ad3efd370c33bd763924615e06d9640d7473183822f8aa6be792dfca685286084a2d88027079a4eb510c49192da0355217685900c644c37a29300", + "e2c318045aefc3099a25545c35bad5c8b34a9566b5a5e3813a3ca0b9c82698e27209aa93d369b788d8567a9f77c47796060895a566c961652b606f40e73735ca01", + "707e73c79f3212dd48e2d14a807f59a4ce2cbab2d60f9bfd213f3253b4b37c962f66e7b22e16633bae7c6fd4cd25489f731b99f6a68062532f509214ca7593ef00", + "acaf82b616b71700291f97934baf5693a018f685594af570ff51e6b19bb93238174b5d5bd4fb70e7ca1c7a247b795817269e4a93c399d2e55065f9851e0c6d2501", + "7a6afd718dd5126b7a238933f0ab66a93f68bd83b0e233698706662eed4d61486eeb68af6bc69c63f30a6107584a302dd2f3d404feb35868f155b83939541e0800" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0010.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0010.golden new file mode 100644 index 00000000..92582afd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0010.golden @@ -0,0 +1,185 @@ +{ + "seed": "58OY1/IoLeJIrfYkiwmSc3IbtSF/XwYHExUdRFPL0G4=", + "keys": [ + { + "address": "2SrJiwmXj5RmsN9DzCVzNFuQDA2ps8FToiE", + "bitcoin_address": "178VNk9bgK4XAu6ibTeE8BHTvJpm5V8ewg", + "secret": "646ffabadff7a510e36d37a6559b98c24956a62275bc6ac80fb2597985c1557f", + "public": "022b32f9b0f70ed57f356a49faa999f5bfc25f6f1863db2ee5fd2aa1cac0592877", + "signatures": [ + "6ca2305b555ad4757be898041a936b5ba013a0213c24b37abe5dd6586c1dd3e3718f1e38c72481c39d4733994ef2db85528d4307162923427b2cd3fdf67103de00", + "c33f4665e035ca0534798d866857da38b37fc7aa24ce2828d9639bd0cb88ee6e14fe150b016e1cd842a6056d2093629eb272b13b86afb71771dd8064f65a8bb800", + "fc2377a4be18e2c53fd277b136117468b7c8fd12d3abbe6561c210d6c29c56ae3afb4508d5e74ae75c697d51d578458e7b7310a6bebe4c97fbd51e9ab84f7fe000", + "40637de52a5d28d87db456c85b3854a4b73865fa3dacead32bf5d3d24349aef0680735f2083b1c4c0dc10d2f5ff8b84189ecf3c196ebe09d479587334a56145601", + "1265e4ecaea5ba5e80f7125e28fcd6a228e0899e53fce3fe5fc1087a1c931f28710662c01c1986775761f0ed677c5dd663c43b8a3db4e7c34414ccb61fc9daa801", + "02e14ddc2c85600f466297b5938bea2fce271dee37cc4e54c812c4040364e7bd3a57b5ce9839877b7742695c55c85de569aef2faeeac234cfda4246a0d21c0a801", + "614aee033e979afe8cccfbb568dc4f3b1fdb368e249f913ac12a3cd26d4746a52e87252b156dd3c572e1eec02bde554c0d5afb0ee37648aef342d8a401f3332901", + "79e3de5d0b0996e66cb2edc8a683a7ac8aff4a79ec4afab42fa4ccb4bbb0df4439c9e0ec9acc390c9b0c639f6be1d61b7ab9942113f9adeb1642724515cebe0b01", + "8c6ab61c14112eb77e0e3dc0550aa47a14c88bf51b9f3b7bdf40ee666330ab313787b54300c2f405bcca00f7f8a157426cb8b87984e091ba30c095704fdc27e700", + "c30dc8967b5c2fd418e7cebb7dc5cbacc2694da4b80e3fec197b8a8b54a9c517383a2cea7a07bbbc166f53e171d58e3a971e618c62e43a86bd8c529fea53376d00" + ] + }, + { + "address": "28EpfFX9Syr1E1DTtufp4rt6KHDKWJLUCzw", + "bitcoin_address": "1DC8sdaT7ioCFTnXR9MnWzem6XJQXhuKze", + "secret": "8597cc7736e6a039267fa3ccba8eb73360ab492282026ab8b73328da061d3256", + "public": "0276f2290c48973bd92552fbad3a9ac4ff433a8da13e13beaeaab95f164edb8ef8", + "signatures": [ + "403e2bf565bd10642a72ac10ecb868dd54f22413f1983c5dd8352ea3f5af2e3f660f790c200fc38d135f61c97169c7a6a51d77d00975e95598d47c19b7eab0c001", + "4d9011b95d86cdfcb867ee695d40417b96a1030afef22682874879a9a55b6cb108afb8963d5f89344e396b60e17ef758813a6ec4c669786184031e814c417e0801", + "7505f810db7cf603f5f370f0442cfb15211395fbcaa1876eab3015aa96e11c3d52b681d3b8758b878cd577c984bff55492ffdefd8979d28e355950fa7aa4aa3300", + "9b969732d7672397c3b85b9279a8c7e633f3d59446824ba3c77360c0a1f2d6f315d548aa2576b61285388d6fb1d6f33815cd746b85ab4baec28d3aee3ef06e6c00", + "57c1c7d20cabbf967a68356f806115a1e900211159a2a40dc6fa3420432523977443cb3bdca94911c04f9a15dbe87cae661a085aec6044e9c561df654449f36f01", + "54189224c9c02dc272dfb4474a802083e1ac372350ded7539db03bf60ab918187a2b63a8041e79e0b8bbfd2af09417f71f553972c914df8f956cab8cc4eed2a801", + "a5987f6d62982652f06f5cebfe4a83fe8918566100f9b28b65478a5100164ecc2b366f92ed006321e1300931dca8fa5661a906145fb769ea6351dee3b5215d2900", + "ead667dc0d71e3e6877da08dfa17720e80e372bddf067a6783ff723a37f004ac675d15229369aac75bdcf1875cd548b7b068a41d04b50cfd8bc5b07ddbb13d9e00", + "3dc279ce62d0ea023e13007c737635f752787ca6f5268d12e6347331eb0edb274d702d485599954ec99cea8556aca04d538c87695c2c1c9c1551288b047486f500", + "d5c31767dea1490d951cadc4bf1472ec341b83b3edcb397eb3281af60b48ad4d68ec1d3a192d05af7883a19eb955e2ce4c30db6a7387a708bb41f33d9300ac5f01" + ] + }, + { + "address": "2j5u9ieaqLQjoEru9V9sMqLPL4cncKJfpoU", + "bitcoin_address": "1PqiDh4u8eFy3K4SmekZXJp6YW6yGQ4Af3", + "secret": "720a01fccd31cc08832df230316cb89e619113d951475c97b9dc350122036cd8", + "public": "03ad8eec89298721e6f6da1ad420fe178e4e37ba6c5fbeb707375380454eda84b6", + "signatures": [ + "89272a6545cd40117f89c7e18594e5794a72445fb45752d64f9a1d606f7e69604992268952b136b192c0dafab15b9bb322401b967f18536f0f5b78c7ff75f38800", + "06b3fcef37e36255613a3805d31ca5753c1e11ed1c554d6c8c4676c78fd9c53b2a1b0d19ef37b7e8062a65d5e982fec61fd5097d49fb5198c376e914571623dd00", + "82359df3355f1823d03c0aefa5fe9f04f208cd7105f9ea310c615bc6a857f2c153f68e8b1e2ea4fc952c1dbeed02ca31a5f425aa23234ef31a1b052ab177ea1301", + "72ed2078e5bec03162cf64aca6eae363aaae0b402324dd74e7ff630f0d48c67d6e781d0f2612fae060577d827fd7987e4a0d6b6254babc3744c08a98ad85ee9c01", + "fd6d6acb517bf4b27cf1e6b03bb1f2b4213e883c4174c56b14c2ff429aace102214df6bee50df0b5707cb59e215eef0a2138fdf3d94ae01537b03ad4f20d279d00", + "491360c4d4937e2a1e9523051909639a8262bbdbc77becfdf82dedff9fb9c7710b7ac8b9b97aee6267fde5635d247e1c16a1a26a82c9727778c6eaa5b7e3d50e01", + "dc6468ceb3dd16c717549a68ce0d03cc3394891e9118663aabe2de125fea621c16de79f0864fd44b5e23c2058ed8f8e65156abd27e89bea63627afb4487e7af501", + "22ecb0f1e4b39838cb386ff2c705c22b35ee0a84d95ee5cf739a97d3a6bf51be245ae7392a89d05def89a5075b3590d2ebccbc1458371e5cf5a4aae932904d8201", + "806050af0d6b5d2b806f06927438981c648ec6ee3469fae4cfd4d64a31fdfbc57ea6347828cc15ad8092cefb59a738a61bdda7e823282472a688ec288da08e4c01", + "c7e31a146353e1273a1c0f5ba4205e743ed67da7515f1cc052d2c0c24e86445905ada83acf5ddf68b9124c8edb149cf96851f01d41b8a8515d22f0ffb8a86a9101" + ] + }, + { + "address": "2KoZQBUD99gg5jKrZLLycqJvjMvKFf2APLA", + "bitcoin_address": "1QJpA41HCC2GrxTWDb9j9FmxtyDQyPHVgi", + "secret": "5a04368aefae7f463f31da6955d7c08249460e3c90da76936b641f25f7c6ea91", + "public": "03ee8074e5474b0712267b0f66ffc17f42d130523ff4c3f78217532540c89f4609", + "signatures": [ + "aef0feb04a3a4e4318282c0b8d2bcc1f658470be785aa4a3639117035f7b5f357562f1167230ca14aee019f8c32e9c072299a8918f5a76fed3c3f54a40661f1501", + "ffea567262851e00794d58ff9bff182a19fd97862a4e0dba414ae8681ac8f03d5396550c2a867def5be17f5e38296c40c8b6a994870604ccccc2326c5709062d01", + "3d88280db03a3ba9b15929f0f9d6339c835218e60e82780b9a1becfdf674550852149d4e068f2527ae425d280bbdf70bd37ef98ce2dde4d5d3feddcd87497c7a00", + "d53f2a4c346b8c007530beb4c1a28904b0cfa876325cf9790489959f82d4ad74035d957cbbf335177912ea7278f45bf86fa8d47ed9929d78d43da6a9637bd1ea00", + "b02fc80ec2869131159c562df839971b3285ea9dbf3b1279835ade6ec0fc2110228eb443d743bfd1bca24f20308d6034f1a5654f2dc81df537f761aef1234a7701", + "bba9e94d716a041fccdd03498047d9ffaf55a28b1ba905915464255af0b883d03a109c7afde2fbcca2ec9bc2f9bccaab9e07898017d40882fd6be9d12423825b00", + "9b557e95d53b22903526cca3e17468ab029bcb478708ad88c3581f0aff4fbaf4328bb3839134933f3a252432f01573e3f8111f0bbac6c61528de302abf286ff600", + "fec6d86d9efaf625b18c0f48ac7856f1825dfe82495c167a0f44511e9cb52b5c1ac4bd6a5015feb5cabfd39a62f48da6d267da23e5a49d6a1d66c34cd9588ad201", + "1a3ad7d2f56ed736cfe7db24673bfd917bc582b3a63132828372da1def7ae91f5cf322f8d35aba104eb71004658ded222f6411e36079a17a1c7d99473bf2a8b001", + "e3faf295d743fe5e38c1517b1437bea083c4908004dacec1177e410dce94278a4477cbdc751cfb1497a5cfc9c6707ee47bd1e34fc35e0bd27411c3fe69e8186f00" + ] + }, + { + "address": "2YUgePgEgTrbACq7vrna1NXVGUzrBERj4dw", + "bitcoin_address": "15Ds5XSjPykJu1fcQ5LN6hTupgR6jJ2JU4", + "secret": "5674c557050ac9dd67cebf9629b9af676024f126e3a52e856fead1ff51521c06", + "public": "025358627a6f01a52f446cc7b643b813482ae3077cd3760385b6700d83def6cf39", + "signatures": [ + "d807b670e83a1dd3424f916a7226d44bf3c9c8cea11f6fb37fe8e96b031f95d52fe48d0a3649e7777cb003a03890c127020bb698dea5e4eba0dd4c3beaf289fd00", + "0437e62986f35dc27782a1697e282da1a7ed39032ae01bf66ed61fdca42e87821a8939036ee91a16ab7bc917d2aa74fb059a6961d8265f98fbcf209e73c3f4db00", + "54d9401e1d6e12f7ce81223ab450134e1a39c7a2077de5ce121156fd56f345f3240cf8b9803df2bf7f105d1db73d8aa1e275dc5926e9340d9c4398f9b8af929800", + "8f052c5c4b6093a88bd24c80d1bc783945ad34b71b00ddc3f5bd6c948419308954e20d8ad22636c082ea536a431c96473531899f2566b57de9d038749e71fd9f01", + "8ecf28f58913914851d5fe5a1181ae665a7d536acd8e3cffd55e1e37e1bc1b8946b1dfbd091b0945dfe944123ba3df27d596dd7866169f4878614cca58b0f4eb01", + "b2c4e3e9bd832da27a0766914652b48a3b93e66cdf558343a4fac554844b99da27d9091693cc8fc5c89f769b870f29cf56b855f29a2f7ee1130b1f51a4d11f4b00", + "2bb5c25e4cd8ad7353d64f5e3ad8c23aa213c71c60c14a207805dc03562b8b1928a1f285fba00eecaf2fe00825574c7cee09cc3eb06a510a87fe3327a2ed808100", + "b00bd2eb6cdc38d9de63fb3ac5f249cc1b65d0aaea101a096d3434563a930a837aa7bf3cc91d7a28c4fe2a0cbacb20e9cf16ddd0e2fd305053c69d0962ad434200", + "1443132e898aef931e53552c74e87a0226227a443dea6d656d02e41e2d03a27749c6f2dc39e0f1de5441d2a828f66b60c598c197bc6a32e0e670143e57802cf200", + "ee030515f8444a3f9abd4cf883fe0d56ac35e44e4a17f3a91619bcd9892649f31ecf607475aaea87b69bfb25fdc6f785aeba8c3f64eb20624ddb18020fcb8d1f00" + ] + }, + { + "address": "dVMg6FSsHo191yyMzvKAu8jNempZbKnkRS", + "bitcoin_address": "1DAVaZm9Xkty6UxvyLXTdm2pEGreEaXjCh", + "secret": "d5c59918edbc439fdc9237ea652127f3f83722895e07b82e5a5094fb628d21fd", + "public": "02697d387c359d57c492f24403a10e2ee47e54866ee381cdacbb5b7cf8ab6e1b80", + "signatures": [ + "a7e7bc206006583d3c9fcf9380c3cc9d3c405eacca2f65f8fdf1ebded73695824cb75bd9cbcd7446c19a45e907e3c3ce2bfc84d4dbe890280d9a41640a1fde7100", + "0e68259177452e77fe363f86c8dfa8f4eda29cb75400f05d1353cc5d7cfc64a36aa54a266635ba55110141a66a63c19429650d72a17f57ad18ccdfded25a264400", + "331e14a445fb114fe7960de531de1612aca3d6701dabcafddc155065e1f9322247a19bf3ff1e9804d4169e6f295215bf41642ac095a6e540e4161b44d660ea1b01", + "69bc7a31bda0c4600e66c7ac02dcfd49bf8ea99cd6f8aec851882204076b2eaa1457b47038230bbd6dca6ae72c404b73e3e2ed4fbe642b5ac9a22c214788363900", + "951cb4a095b98c49470fd3ad7befda82093ce231623ff346947e6eb078f3114020fa56918d334fc29ff724b794a7fe3698eb473efa95c053cc43b1a75c069a9201", + "48fad2b7d86a9b8b7ed87c506d7957bc32c1df1a56af9f2f2f44a382f182a6277766c39ef39fdb580a488393b90937ee0217708c3266f680b62cc980575957c701", + "40ba88d401efc157039d9b305a0ba136d7aaddf9fa97e3e8b11012532eeb8c2f72b910e96029e6a40ae73f15949c692770f95bddbbaebcbae1df67d6002f5a2a01", + "9e5889ba9f34e0dbd4e9dfa354533bf005ead72f170c00b562bb08fe40c7f6e0323b94e84d55637e5dc9b6f007240fc4fbc3bea7c8632aef1b6d10fa9c68d32400", + "7acffdee6552639aa7a1960a0c80366e72f28e74826d17cc4eb2804d516c57f67d2c015df16f5ec84b46963925b53cb3b9e8538360c66a334adba487b4a065ea01", + "11131aa556119bce1540e2820bf21925e5ee2ad16057a6ed3aca1ccb600697ae449bdd0b266838edfc8b02c82b01158035b041c3c844fc7995cc86ff5372749701" + ] + }, + { + "address": "25NJpLNrTci5BtBtLGzGzeU2ABvT9Nw4d3f", + "bitcoin_address": "1Q8x4maP4k43UCqgFFoPVyPnKkwWonqWYd", + "secret": "0d3ac7f674c3177de5555a6a0e7d97eca63651f686942111ecedbd00c586d03c", + "public": "02c18d3e9b15c91247a2c71ce8c2e27e1b008de4d17ffa388d34b35fb27f3ba1a7", + "signatures": [ + "459d02374af7e0547df8d3ac93bbbf477d9b13add08cea4a2c4a9d55e04bb9501ea2f10c8fc68cde1ad2539df321032fd2f2fe56b010a8afac91f65d63c1ab0900", + "da1e742628e40682df13b888c7b166220638af152120a18fbc3e41cfbc4a2b8c0fffda7514e1c84c0f9211e0efff55ef7699560e64bba76adee30f341f5edd5301", + "da1893f530c4fe952d2da3a56d7b5f40e29e24368c00bea9c6d1317287f646fa08d251e69052b97f7c1d4033936b00ade787de33e6fa8ef939ea4412fe96bfdb01", + "0b782c5ad45598c6678b11254821637c3aaee8c4677dcb38285793337df838924160101e905f89502d30ad3761b4894dad68b7d2601f949301ed5ae4079cbcb400", + "3355727fd4fc2342737c86fc1c01bff49cf1afe258a927064edfc48c2445582d1415b3c74fea1ad22c5d9df4bcb0a65f6e633b729dfe088b29041a013e67db6c01", + "c493605d78ca352ae5758c7b56e9d6b338411e2c78e3cf244df3f5182d55f8de32c3a8464e00de450320d6f62cbbf00719d34d9bd6262cae586befc2bcc0601300", + "833b50000dd4564746e3dd0a90023f5fc74eb443795d2f986a568196fd849fc41751145da01b8a6753867184e02da5e023b12b1638a06bc5e2821afce12c6ee200", + "fb702b3cfb5c4225e14a9f9c56e9959d6f73ad6b8cd17b127187127665e9ca035718e5c139fb2c495425bea29c9c65b2be97f4c642b0da60a37bd10d717ac9f900", + "2dedc42424ffa658049e251c9d0a690a31637f5353e5d1a0d423c1efa3c361fa47c54f642f1876b5089f7c059796579f4a556821f3aa2810678face35c8fe22401", + "6ab859b8b4cf7e047e1e0f8134655aec58c04d0ed86b909d4290c8c335fc9816591fa8236258144b5c4b44c8ce746a11b4e1cfb1b5a259c2ff3e3beeafa26c0c00" + ] + }, + { + "address": "21ryRMcQ4jvpDLv947JhNYFGhkBdPfTa7Ft", + "bitcoin_address": "14xyeb1JLKjD2eGpZB8FK6jHQsxF15urXw", + "secret": "cce2107186b602a42f83bdd37870457404daf2d327c83f02422a381628d2350b", + "public": "0240ae55709e29278c3c5df3eba50d14caf9ef73cce3329c05c56595384e801a81", + "signatures": [ + "f59f660e8a14a0ce2b5c866a077ba83529b466658293067c6d16bc3ca1bb512c1cb4923fd4011e23ab572714b7dae244cbbec5518570ca3978a04902adcc183f00", + "e4ac4e486160881d9ba88c70a3aec2c5b0df4e56b1dfaa8212be1e5ed52a2ac36495d35e71791418948689e551886704fd669b2981edb13a8b4b2f385ad301ed01", + "517f2f1532c4986176854141b4a1fd4da24f1a7824a534e1dfa7430d6c6bcff66808f8bd72223a4a8caaf636f4408744372bfe2bdab86eb7c86f862dca40a53200", + "9d597dac44c1dae6b8d940ff6fc61474f6109b07cd4cf036f1c04702c5de5c613b09c0610da9a80f386d2dab714d72b804b0f4404a59d03f8fa63dd9738ed1d301", + "67b3708f680fc77279d0c1e7e65ee6b009223f83d63be3cf3bd2f050110222ac7b069b8fa6fe51bcd18f8332e3696e89ed759eb6d3b01f6a47de09cf1f929a3801", + "c6ba13f4754a3378272eb6ef0bb8543c1c821cbac252cdb23ea3a5687e4672ab6e9f9ebba8f77c2d0805f4c72f81455ae5e91d5669c48cedef9ecc0eb7fce1fc00", + "9db0cf266b02ffc7715d53796c871f0b6cbd221d1d8e6da6dada54198348c4c446b8c2a77ae8f2734ef4209caba8173c86fbe7ea4393cc53021e1e0ff7b5940d01", + "2eaa229d2fddd9dcad651f375202e71168be4b350a1e897b1fe2f27f8660e60131129a497d90254832045c830971578e0f7c1c963b75ada05e7589679fa23c9901", + "36a806424d934f5200b94d16a531d8375bd75183e72b9fc060b3868610930b411e298110ce7d0fd6a3325d83b896cd224c9cb293054553b7a7b3035aaadc39c901", + "5d660629134419b57f48ffea9756105649061067178059caab7c4d285e6a4ba572565e9b7aa7fc8700536e25d7c0dc04ebbe6d50647af58c04e7347d9b3557c601" + ] + }, + { + "address": "2UpJ9CTUUzbSjSfByhiYG7TDuHpyuRCXmjN", + "bitcoin_address": "1DgFp47Fbn1zZfsq7AXsjghih3viLugJNZ", + "secret": "01776da713f58690c4ba654afa403ee43527a3697b32c898164b1739b1a8307e", + "public": "03b8f7b20aa8cbdb7b40de6426fcb4a5eb2517dbfbc6e532ec1612341b51a234e8", + "signatures": [ + "7fc7d6a44b4368ee439be43108306c1b78c90f401b7bf5806dea4793ed5941fe67c3fc8700751e21841c16b37f1a22d7ef354b85b39e73dbd38dac6c1d76dd8a01", + "5e634789d9dd8748ce83b5a173ec580a2e2483170f10e391b37e71fa1a0513d7407089d0e3ff410d122518b7ccaad7f39d3e6d87fc731259ab162e2e65eb2e3e00", + "15ba0d2d44d9ba95ff5477275b646d6fd129454a364feccc96eadda27666c2a9419453e2e9fe6890037dbc14d347813ba3cac14bdf11b33dc388466eeacacaa801", + "de5a67850d94ad5183c032b75255de8d125acb9ab613c3a678aa4b0bef2205fb0067b51ba705b25038619a4d99be5f9b6144beb0e758a070e0a5781d1f3d793501", + "60f137a5017662523950c544b23334d98f4ddd044d9ed1d9ae529394431f00883bb79088b7fa127a679a2998dd1bbec57aaa1e9abcb803540e520414ce69760b01", + "273cad4820707e6af38d07e847a579f297200cb567fae62c69ca68cdc0d32c5d7b365b2e8c74d74d802874fa98ba3d1d342246989d56eed0d876e4373cd82a5900", + "7ccf9b45d6368690c145d62acb788b8e1d0c555e8a8e3e3d396ba7f3cdf9fe7b3bad3bdbbc3bf26f5f07a9d7cffedd5f54fff4d06f7354fe60baae6498f0325801", + "c38ea111a10d599bee668edef517315c5a3a960fd38258578033ff9b8a92b9c2443e5dab03a7fa5596280b5aa8fda6c6cc0feb5c921d8cba90ba897d0e61c3b800", + "1268fee5962b4b33fe144373ecbbcf5a4524adec330e46144de4d5de7d7f45f64f26531869aea55eff07b8ab76a6b4c27e7e0582bc5bf2d0e31cca5c82bd60f500", + "7bcf7fd288b4f734ff16fe8c49682997126350fbd5df9537c009995a0859f8ce30c4748c4965c144c415af1f8434e4e2ec1023ca00cc793c55505c7fb4e4f94800" + ] + }, + { + "address": "kwyudpCciG9nTC98vz8b3qrQM9DP2pn9wx", + "bitcoin_address": "1Cvec3BJSb2b1k6GfSNNeYGYLQgUHwvLti", + "secret": "3bfecb42d2aa5f86043bf61ebb1ffcc52c3355e0cb5866cc6d4db80d467b5387", + "public": "021d7c5180dffb1d3e65a341525fe952d65627bb1e4d881777b278665b138419d1", + "signatures": [ + "d8fd20b09ef6f55bf0d668e9d70c42906c54551357122c363d1c8dfd427cb1fd157a47ba228f011e4654b94ac08239ffc955174c0b3123cd445c964ee81e3d3f01", + "40b439422c0be6b652784484e3f760dbe243d2e0639cc2d0b26405615142a3625c1bdd3b088e1444b6f350a01c3ea58439938d01dd0e5b7c840c81f47722b6c601", + "b79308cd0df36560badef6f66fc137a98d0ec27bd5be97b5b83ad94b7d26d94471c3b1d8814008c41524a204aadf208bef1deec1b4019720d2a751455b9d1eea01", + "5a286c751257180a33677d22ea8c66cb457436dd54babe3cdebdf932f6da769b24f99f6cbddfcdffb2d4b5a810431f412737d5bfb9f0de42808d926561b557f301", + "bd066317a372c59468c72f9aae202fe7a5f2f954058ced864b31523961068e0a1bc7e10fcee9ec16cf44580e4d3e7f6194b74dbd6bcf4cd1c5a35640b56293f601", + "cd6fef0e0329f7c11a1785c9b0788ba8be92a5d063486872ab8e85bedd9749995166dde4562ceab241e97f9441e9bb73c54eae7dc3eebea7cac286955ad9016300", + "a5656209f4e0d02c32c38322296de87bdd9688d560dd1d46025929f9a8adc3dc7cbd5127f06c58caf405c8e4c8add84e7e9319aef965e85f7c658173001b8c2f01", + "f3f53b4e7def065704eaf65ff500d33b0522524eb240ecd68d149902334d653a25ec6be35ff944478a852fbc74657d4c6e1c3caef0a525161dbc1b124920cd5000", + "14315ad0efe67c42a7c78da6b84709b22ed187d9417fd2639c88a8f5badf411b0c9ff5ff0420c05d63eb55ce98c743b8e74f73d100cf236cc30b4b397e25a13a01", + "8cd16c423b8ddb65d690651975404a6ead1c8bec450e24181e6c1f1ff914313f2744980e4a3f37977b91133c0c87430156073ef8f523a160e3f266eaa9d4e39100" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0000.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0000.golden new file mode 100644 index 00000000..20d1f44e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0000.golden @@ -0,0 +1,233 @@ +{ + "seed": "c6+3UuaifzancN6Ao2shsCzQdKhOV1y5cu+QfoxW3PlejDwjsowN+gaRDmKDVkh4VSDfB1cWTcBECHzo/JfrEg==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA2q12eAxWQxXDmSEktK9kSCptc1ZAQtQxx96EAVycNkW9ej33TeW7hbiyA7jrJcNMvChVaZqEusjDBZGAa9cUuym9dikGENLXj83Joqh6DR", + "xpub": "xpub6FpMS9hrLnWpSFWhrurA7a9ZSdr3ZscGLB4h2YubAiHV2T4BazxkfVvCpRnK9URcs32BFHrwTCrSb88fTbWAgsuggBvVFrRVBN76QKDQYSx", + "identifier": "f70edef3511de54ba6a9897e7ecda543a0bb8ca7", + "depth": 5, + "child_number": 0, + "address": "2cihoL8mWTVyQ6tnbzZjbm8nZfF6WmL4aUm", + "bitcoin_address": "1PXKidZajdwhX1BGPrrbunWLXciDeCZrE7", + "secret": "49f054b4adaa7a21b74c76605caadad1dd7742c4b8ec5d6a004f05051ad7f155", + "public": "029d83f5a288f520e471fbe9888e51e96d8694ae8f5bd5d81d7409499a0ef4f951", + "signatures": [ + "acec27b5dccf5461b78aae5d8bf68f74c394cec04bc159222cd6f94495f2e1ed49477750ff0a2a9c0f5e165a3ac28c74420e786696499eafccb1e5da6718150a00", + "ca4ff31a5c0a50cb8c717db86828776e5b66649b7033ffd7d2d400481a89c8c422edc11df42f02dc93c1c4bbf9b29104bb9fcf8980d4fa01a816d37f4d7c5dda00", + "64ef245bef8c5939d1cd23d1d110a87075fd48d2f8e3c2af81fafb3a9b6038d27800aa5b1121d2a75c2adad25809e0c6b31eb4a931e9feaa2a51ad9f0d4493f300", + "63a42f72f636e10b2601c42d430aac8fc7e6b7c38652ed6cef5c695a11ac04ca5569f40fccbd7424a7a7b67e2bd19ec98ea7b789d151248650a5cb5e775034f101", + "93f72e26ec196cda5219c827445f03af5fd405994af53c46abe775c420b74d5c74018a335a8a389a2ddac6cf56c265e67cc17a92a49e2eef33e9ac5f9573257e00", + "27e92e22ac3d9fd9799bf5eaa2bd669851548f20653857756cae441a07981c1a3e5bac7c1744eb862fbcf3d09d6bf7599543f998d011e7ef25f510a865024c0e00", + "0a520c290ae22b2c2aabebcc588278670ef4d47c930f9417ce04ceb0400b829e194de1958cfbd8b9da7545d2c7c1f084684e0ecadfa290aaed67b852e05f5c1d00", + "256754c12f6886965db5b7b0f32f5f59f1bdbec0c2ee543efa7206c6d04616895667fe6c643acf2b8cf773bf2e1e9b0022a93e81e75354c2a7cbf3f62984229900", + "9a8b8603109358bc39df4c335e96862b452dc1ed4bf66d02d0a3d1f485beba9a17e20f0a2de1f3c1ef5e0cf1a01b4cf86359b467a12c16159352e59573db1cc701", + "7863fae03231a85efd730157f54c34329db9f01969fb347464ae4e615a0013395b0e75911b28c3cb71bc59935fc70147ff188159d6d0d7ea10c8ee7fa9542a6b00" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA2q12eAxWQxXHbRDPW3p75UFHkErnWUahEbV7SunA3VWGR4Ee7tSJti8knqWHKB8jyUExK8BS96Ph2eChg7R5WjWtZuLY62QvGkkh8smp36", + "xpub": "xpub6FpMS9hrLnWpW5VgVXapUDQyqn5MByCS4TX5uqKPiP2V9DPPBfCgrh2cc5mh3XdnJ6wRxjPHekiyVhwtBiaVrHJVkRwTiBuPSp7Q9W2KdBD", + "identifier": "7c61c196f0057e0f873e0d9d2eb7705836f5ee45", + "depth": 5, + "child_number": 1, + "address": "2QVa6rzDMsZPUQSHrz5AXjvGMtDt6CbkaNY", + "bitcoin_address": "1CLfu1S9Tzu8PhMq1UxVcWS8EZNTiVZgog", + "secret": "508b3cb81cb00dfcf58ff2b428d8f324d1371fd0e2b4ff44744ae2772cc8c8dd", + "public": "034b43b388140fe7a4889a768b4bb7ff7b6a243d639b0885b1ddb53e8dd01fd45e", + "signatures": [ + "e8f3733d3e74a9c5c8ecf7409247fb176f465555721164fd749cf6096d4d89663b81f4df98f28c05fa65645687a705909d4d952418d6544d8cee96f1f80e41f601", + "3c4bd23f292d7e845be8f26e2265c53292f2eea99a47de240cb40f265902946b04894effacf540e4cef92675506ad6b862eb3fc0527920999bbcb9794ef09cc201", + "f8b0d7104dd9c4673f4bcb20caaf59de1cee75ed7cd13f36759981e4598fe6160dfa9b8a92549ea9a08593bc32a4eaadb89d61b9642e70682cc613c8ba4c6ed301", + "1e6941031fc9909db28aba90eea57318d634a0aac0e841ad149f9439aaf219f5010481a4a4cd8764427b041f371b12d5673cc887ebe7a8cffcf8f2e6e3b687f500", + "193a958f660ce59d15529ba96dbc479c71d50b8625341b27865dfa7528701217027c890f6865a5748d6010b853cabc1c26385b46e7cfee0b07c265bfeb954ce201", + "ef5ca256e761c74078928e83b023b1407bdcb2ca79dbe72017a1b98f4bf47cb6145815afab28fc1d348ef627dbdce33b463eb8f9ada447ea23b69d29c3262a7d01", + "75f6ee3061a2ea52244686941c3640e3ce993bc1cefafe9cb7fabe43eca5e24c58b0ef6596c67947cc47f696b1f5d3ce5bda4788f1e8afedd432cd9e09e7b8db00", + "46414c7064cd891cb869475e2b9263b8c93e193fab27829c8b345c8aeeeb0fe434c761c2c2204d75cb3bb9b2b72a5cfcb66ffde9f1bd947acacc14047b855b7d00", + "23a34e10fcdc0a7533eb360cc9c0b7b52a6acea39e6d807980d35b9b20a15d022fd1e3a395b76bf28bb33450f886384bf7fe0bc89e034707e4a41fe78e91e40801", + "25d6584d4a423e80f0ff702d0db92871c0c90e54174549bb733e2042abef5a6d2b2e7a8f6b6cfe947a6bf0649dd9e759085a2e7b2eb5c3849a78a269de28820601" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA2q12eAxWQxXLzKSrCN8MRDg5FPH331LLyrANg3rG8TwkX7ePqwAKemX4nmevQyBxeDL2p59cz4h4Eos9DsgiVdbJ7wpaBZKesLHNTcd33r", + "xpub": "xpub6FpMS9hrLnWpZUPuxDu8iZAQdHDmSVjBiCmmB4TTpTzvdKSnwPFQsT5zv3J1YHwGDSJo1c1843rsAyiFY2bduA9s5cnZBkRBEWxxhmX1ZqX", + "identifier": "50a0807e391728d3a54e2740a8f17b1a980e1639", + "depth": 5, + "child_number": 2, + "address": "2ZgHr7QUgrQhXbpqoox7yhBdXMVGmTm5J8e", + "bitcoin_address": "18MKLDWp1SFpekExGPYzuEwtavG8GgPSDV", + "secret": "891a1172147ee629a0d933f6366a1b81ff84a55921818d1e2f036c9ac82a8616", + "public": "024652353eb6e9cf9c1134eab12a5c64c582eb02bf75de963d9f9fcbe7babfd693", + "signatures": [ + "6cf6e286baa1a26474093a3c6c42e2f7095840eef80290e62bb98763273add0f06b0dc1212efd274ffe1d8442e1b933d76965f828df3d89fbe4ac58e89fbd8b500", + "dcec3e221ba351e6d60c1524ce090f488135c8295edb2f92e4a0e6a9f8fb042900ac57deb47046cffcbdba5b745bcc3d51ca40bed3d6f27d245c11d978a17f2301", + "79c68f05d0efae09a88b9e7bdb583bad1d8a3651d12001767f494e3a6cc114a72dbad0d64f00366aed83c6f81195dec6b1d4677b59577c34aabb9ff09f9d849a00", + "27e6aec20b397500b499149ca305076214c6bfe4da41ed6568677effc1a55fdf1f62e8dca3a61dd939bec14ce73538c55bc3420ce1ec6e77ce86845e36c07a9700", + "d9965016bc515ccede7976b393db0367b5fafcb06317ced30ff7f0e92ea73ff954a01f60f4ca3636acde363fc517565c22ec7687926ed01c279e4e59f802a2e500", + "7d943c90762bbbd6bcf53280bff6cad0c43f6390e40fea1ba210ef6c8fb4e3716192f22df087dd11f3b85e3e9e4ec7bbc453e38c7250af1adae39fb79241fcc900", + "06fba7f8f52773b0be6e58678de6825e3af7b1af6d80678b5d6a0e1b617e3ac10e36593786f08036a8979b923103882e1c704c279e2d879ea85d596f92faa78c01", + "688b01c1c775af40163fe4a6fc2e8f2cc4f2ed4f4d3f5b8b6312a0801fb1aa71792ab1ac2554986a917286d96a871fad48ddc9f5382b4387657ccae4b227a8af00", + "fdabd0d96161ce2386eda2e15e168d94c8e29ad8c0287df6483bf39b69ce67aa6abb34f5838b8d5df3f744373e44b1bfa5d3182c79203f505c4bfe75791e674400", + "8e4a8637adc42b46547a3dfff627f7055dd7f6c139c05d7eee34de58f8efcbf307a04bf2338eae083ca40f9ca2d73cb5d76464a8b19d229a29ab4fb23245633801" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA2q12eAxWQxXPBMMcjDgb3f67M1JvKEUAKYARRVXvGDbxwb62AR9bMT1hkaTM3tszhmNycKWndqQyWJKSX1oT6yH3Syev7wRzWs8wKcbKeE", + "xpub": "xpub6FpMS9hrLnWpbfRpikkgxBbpfNqoKmxKXYTmDou9UbkaqjvEZhjQ99mVZ3pK2y6VzyiH2vZKvSy2NWPSF7Gj5HgC5aumQ9Hyq8ZM7FPv21f", + "identifier": "582f892bac496af23a343ac54d5bcd42ab701fd4", + "depth": 5, + "child_number": 3, + "address": "23w9wjEubh2MhSVdG8hxDUbnrGMSsMa5v9n", + "bitcoin_address": "193HQjDnHqtq1wDDjcMbnf4NvPVs5bKyNh", + "secret": "75709e410104ed3207ad2ffaea26186ad4c5b5ccab9ef569363b5341a853504f", + "public": "039848f2c50f50270a3c495f355e4f53be1b98c050113951ac558fe932735ac571", + "signatures": [ + "67eda47fb7fd8f924c05ffa4b488af83388c9c3b09f00295ea68a6cf3a0ca4155f88a5683c30e89b76061975174eb9112d517d5e8a272bad7042920e4549d11701", + "c584ab7853ab4410689f9836cdaef339aa09ac5178b51b9b6db2a8c7fa524fc76002a0904a5b91481cd1a9e22b1bc23df7287c5472d445731f164cad54ece62500", + "3f286b5b80e37ba3bc2691742ff744d040224366d21355e8da1652e32c357db82a915d08ede616e73bdc5f3b0acb54df3f6e00ce9388f5172766bcbee57e657601", + "e1eef50cb7606e17fa9d5545c05bed8fd061ec60f6eb819b47a48ac81b52cdfe52dd889217994aa0496556bfcb997b12e4e917029be9138277f8ed3fec829a0900", + "ba98dc7425c25004a69ca5b567ef64d646942bdaf1c260689937b2ec0561bb560e05b7a7792224f7ca07a2e96506ee7cef316343f71ae75a68165cad83fc960101", + "c029e4bd77599c7bb1e728140c37a862cb0bceb60dbb2bcdd54c79613c34dcb96c8bde1301f2462841ab1421d5dcc4d860de6bd15073b8f9fd7547dd32e0ccc501", + "aada3cd4ac7fa21ee66825699ef050ae2661e6b3a314d9e3c0247e6cc03695c770ab45bee3c240e024a2ebb0ab74733c6206b98d1c6c166f06040afb9b9c9d7c01", + "ac3f5f0e1864473f54e2a7fabe97c57a3822c2474788271f9be9d174a4e10f32766d27a15d08d96d21526f0d58ae8c595eb80e43885fe8c702718c22e528595f00", + "7b57a74853c8c26dc4cc0b7781f122265b3c3833fde655131fb9096167a7dff3258134231e6d49e9feadc127981df2ac43c309d14d5ab25aa97e5460bf5eb11701", + "813452107a16fcdd06f49d53c27a4dc2780c1889a602d6b84503ab577c39a3327bb0264cc084d8885508f2ce612e57b1691a1ad0a0b43a0f5b31002e47a6007501" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA2q12eAxWQxXQrjJLTq5nPtzw99kKFWoMoim8G6q4T1nb53f84UJjbwweW2jKDey1R5qfehx1ezx9Jca14q23zxjtBGCgfuX8o71spYLATA", + "xpub": "xpub6FpMS9hrLnWpdLomSVN69XqjVAzEiiEej2eMveWScnYmTsNofbnZHQGRVkCvVBhTbxYo3eUD17AwzPLhdRXWiaHX3o9yUigh6yuhSenCadt", + "identifier": "82f79f4017f2983f95e2ac5065f6ad64c0fc7859", + "depth": 5, + "child_number": 4, + "address": "2mF9Cx2re21EyUSpJkMqAwqmfanatKSqBzP", + "bitcoin_address": "1CwVV2E4dJARuddG2xinn4phErWc8cu947", + "secret": "7f71cf7d15383a84a0001712f00d0f3548cd3170538bd93c4477f152c779a2dc", + "public": "020ee1b01e2c6f5f6e63b5f4a8fe723d2a74af337935e052f26212dae66254f2a2", + "signatures": [ + "6b00e64876029d9c29f297849fd8debac0a13a83092107ad652b71c17fe4e06a6c05f1b42cc7942905af9d1935dda39ea58c2170047c064b8d06bc64dc66f49e01", + "65fda48a171cbb80f6b5e9c258f0b3731a376f8635ef5ef00429d1f57e531cd17605c03a0498038d6e5e61b8e39625e5b7b89a455bb32e222acea25160fa350600", + "ac99b084a96041970cb40cbfd996a7600b5f0a77dc2fb26fa4b1f9672ac6a4c364df5d2af171c3d306e836009ff809e51ae5e0d8f43889eba3e72d5c3de563d500", + "bd352fc2efa2be9541dfb79c193fd0a8d548e24d430475badeb242b0e3a65a7767f762a311506e914c26b65847aa1b2ed3ae3fcc5d69a1f76fad60aec1c961d200", + "1681ba18e8c21bd09463909db7662b4fb703fff721a369cdfecddadc2d839780681d01340f2165e18800c13b13c9121e68849eebeb71ce39d36c45da75db202d01", + "ee31d60332a491e56e52e7d551e47a182cca7b8c32e843ec85766ae25a8e9cfc2cd6239ecfd241f79b80e46babc80ccff9c194f35f2c3ae8367f15b14b50f2fe01", + "f0b9b8a00529c7daf7b92875568028b95309ab34c12f1cc4935a8c8f36ce4264127d1a78b859c1f8f201e04defe6d96d3b8c2b58244006ba1cb12eeb5c00c2e401", + "c8f05117147d35e693ff6f728b7f4b78036ab93473f3c6656b30e61f5cbde2450ab99069fab7c0447d7a1088ff4fd6270b6cd32ceb3977aeaba5d52038bff0b000", + "850b70dc524699ee765f3aa4dfcc205d270b408d15a1e5373fc3171c893a7e1e1c9572bdf727fd43cb09b33cdfbd95410e50dce77d96a9d2f3636442c7fdcffc00", + "ca1323f4bc710d7a5fbadc9819ff4633eafe7cdf10d208aa0cc34e5f28cd1cc47c4686bdd6893845fbfe577b60a0be11eff9cc2d2700f241afd023d3248669a600" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA2q12eAxWQxbeTXXVeC42RirrgfBYRYxEomtJfnKftXEsDMHhjaw6yQ6v2LJtNf6YbNhkr8fbz1RcoGr5Dc1xQS2KJHsQjRt2WCfosEwUqB", + "xpub": "xpub6FpMS9hrLnWtrwbzbfj4PZfbQiVfwtGoc2hV74BwEE4Dk1gSFGuBemiamG9FCouMdirgUwM8nCiVVbKXwq8QZQ4odedzg1HPh87qy3vZ1tj", + "identifier": "22e071b253c0858a7ee31006f1db44497330b24c", + "depth": 5, + "child_number": 100, + "address": "fwBx5CM9DYy4LLzuo55ZrPgbw62dE7xhc2", + "bitcoin_address": "14BQrB4xuaMWt5CuaXSBinDx5uZTHcvFcQ", + "secret": "a8e85c1863c14603b0ffc30840bba8fb2035897eb96d0cb34c62358022556a1c", + "public": "020814810b6dde18bb581a0a0bee982c9e620dc65e483f4a00de994d5aa655a20f", + "signatures": [ + "912dc19892e1bea87b9e71da136ea8679958528c2677f22680bd6e31b4ea2a0218fcb9cccd46bf20d83933fcd2931d077addb55a726a1175071592519f1bcf6801", + "1acb0759d578ad8fc00ce321d5182f959bbe7e0f48083449dbba2b6b34aeaa6e3d2ff7659fc95724a08cda375c839f9819e233869382cad36a82b84b1875004d01", + "a1c33184b797f1da37959b0d90b417aa8036042f4d52bebf642fc9517c35e42b4dce0a255f7f792a5a1a2ecacd2b637ad3e409099401649d61003329279920e500", + "80561236ba3dad9ed3848a10597f7d7914488fdb618cfae91c0192c266bb0caa10f72880ab18793e4d76bdb594183c73c840648bf1094a314076beff5e5cb5b400", + "05c4690986f766b29b0ee4d50374a851209b479fb8efda6cfd653545491e6f01175ae179067caff55ff232d68d536cf4a220693f024d00f3a394972ea43902c001", + "345ada413c56aebeec19de8b9b8176d054f4dfa7f68996bfcd9ea130d2ff24e10587569499e9702733b7f431cbd109c2bf83c923f485e7446c38aea2f126a38a00", + "ad6fd09fdfdebd22d708fa78174115cc1bd9f88c2318d47829bc65a6402e4d451df6047b3c3b9f8e42eb12691184ae420d66b41207d22a25ef942e9f1f6c950b00", + "270980b6148fc530cac28d52cd1809daae0c2506b42d8a5101e0ec567f4b37db78bc606d6196fdc64549127ac9785a2ab8e041c8668ba89e7f0de0d802076b5801", + "efae30be055b1d52e97cdea95a92615360a87527f4f204ba931929ace7f3abd118815b174c0b303c77ae75c706409a4ced89b7ac6df185a04220e28dd6df9d7d01", + "1072992051b0d8216786d37bc6734c8f2434973b0756f263dcac4c312bdf8afe759d8fa0c02441ae7a726216ea6382a7c6828037ced01a5814be27eddd937a8301" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA2q12eAxWQyJEX5k7xHTzewcr1TMFwhBVNYkskWKh3BVnEmbkgQPHqu9To1aMFnagLRwCztBpDqwHHHc28FVHPdNnptdeoGYwA3GCKTcng1", + "xpub": "xpub6FpMS9hrLnXbT1ADDypUMntMQ3HqfQR2rbUMg8uwFNiUf36kJDidqeDdK4vUdtkWKVdepzqLFCk6ABzPqPSxM3yGCqvSZS3KqCP5JeNMFkx", + "identifier": "a73880cbdf00b123033f2b85ee7cf17b378488a5", + "depth": 5, + "child_number": 1024, + "address": "HTUVnz6XSNsbFy6VeeLzcL7HLjPHjTDFxY", + "bitcoin_address": "1GFBXwZLKv2oeBbFSsrdfMH3Ve2kNi9mon", + "secret": "836f1659c429cb969b7b671ebeccab9276e125cb2952db3f93a8962aeb607282", + "public": "02f78af41c2f1cefff5baafe81292ecad725e60b809f6d65a1bbe7daeb06aff0bb", + "signatures": [ + "2f3d93cbe48a42f96d5810cf9cbcc74413686ba09d123d4207bc0120c356398f227509088bdcf101a4e097be54209cb4f68faaad56666215917c9f6543e4cfdc00", + "72a3bbb5f96c7112ce100a16b4d4c1efb317111b3031a0ea9fd4daa5c4cc99774cc3fc0ebbe7175b75361a95841dca57e276fdd9614ffe78663f95211449835001", + "d5c8b1a2b9d08c071df90e28bf4dbff501eef5c99be1f70ca4cf345eab8b150237ed17e2f9002559f5213d87682bc0ecdbd59aba643de4829473b562e660b0be01", + "a4dd577e07c86fecf7e40e02f85ecb0bb6221411d4cf02cbbf8ab136dfd1318d3edf1dee60519782343a794c521e3124d9ee05a90ddfcf9b7fc16cf79920ce3401", + "ad172fe3a5f7bfeec318f939286c9235e7f7278992d3a1d35a4c5faeccbaf2da1dab66176c232469934644a09246c60c0a3541962ae489ac483c93a1c87539a101", + "810a1b4cdb945338f1cc721c73843e5fd083390057df2b697b6d351722b5965917c0b27d9eaad64fed91a2e6435beb79e21c2a3b49e93388787c43f64e76e73e01", + "53a99ebed90e9856fc20e2475d4d5f20e18e3124875e8695dc1e4b713da65ac87d0c0ae48b98740bbc4b5f718f713ff703c14810ad9dd7272b1da794bb5d875300", + "07afc51611b4880222bf51fa5dc9d74d8b3c0dab144af8daabd774e84f867faa059cf00131cbb0b0fc02fbb4d26f3fa15fba1a3db80143ba8b58545073ea580601", + "0c7eee0904edf49fa08299b3e80557c927992d43d5767dca41e9012c02769db63f1da42486c45514303b573d9b05fa9453ddad325ca8c95bba49a71bb10dcf6301", + "1e093ae088efeec6ab67131d892085d410faf2783baa9449d97cd2b96fc521827ec0878dbba741f37964c7d2672dfc28aa5dc5602f8bdbf0e7f0a217291e52e701" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA2q12eB6r5VR1tz2JTcSpUwo3HAm5mqCSUBrG3AjYPbu44cw2h1Ugrea5VeHbGAi861BPrw77WxXnaQb1JCby1aLCuQQu7B1XKnsiAe23dB", + "xpub": "xpub6FpMS9hzgT3iEP4VQV9TBctXbK1FVEZ3oh7T4RaM6j8svrx5aEKjEey3vmMo8Bo8gq6iJhSjgcHHhUKgNaHhWqwR1SbZDD5mRzRYsimBWzT", + "identifier": "32384be3acb6d3a0c570bf42058b20759eda44db", + "depth": 5, + "child_number": 2147483548, + "address": "WTspYmPiH2frXjs16P5Fx93k9w6zUzwTWW", + "bitcoin_address": "15aYE8wfe38jRi3Zz5CTZtWEa4fbexi4pe", + "secret": "45da175a3f3e817bd050797e835f58c72069f36f4b0f9f622e88d362904e31c5", + "public": "02a017d8af56624f53fe32a205561e693e30b273cdb8f61e0cd021dad24fe14313", + "signatures": [ + "964ae9f497ed957ca0f87736d86b69e8a34fbe59f4f40cad5ecc84b541305ef552c1ef185d63bd318430396b98fb8ff984ff91a8dfd76e78fc3bc39a73c5ac5801", + "9bcc3a2bb921faa711bf079473a00ebe7c85246df96ece9444276263cf00312f6f2096c14fa56dc2bb5dd939e5dd4e730bc09a7bd258718ff804f64fa0178e8f00", + "92aa4918a1ab146af8d02cdd3d48312bef2d88a8884794e7900dcacebaec5e9b7fe2a952160ddcf83b80e9e89ceae3b1cfc3c9eab51559b9114959702b3a3b8800", + "d7795f4e8c7609f82809dde765077ca08eeba747ec2a4c840e019ba2af0757220f9b4bf3ce16f6d4ba22146b13d75b6052db89257a0ecc8047767be371e31ba301", + "4a434e91fdcb34b3ed6bd47d0c5f80b5e45d3f175ffc9ff3fe7bfbea91a21d793ae7cc9992516c31e3bdea7846c3aa33afe1a7e316284ad7ee636ab92142f13a00", + "4af1521ddf5c4e89e1252e462ed63b5724ac5f4169584630044f06cee2baa5bc08753e8c6bdbe6667e2986a356aa166d8eeae9a9137b0ffba2c726fd76f9ea4501", + "962dbef71ffd92af5364e22ad59d8c91bb22179bce9f8f5309458f559f7121194cebc99125a7b8cd572797af07dab35221ee6e026902d58acf6cacd4922d572500", + "9d4e0aebe271952ced323357524e2cbc35e52039cee4896a4150bc598b7db5e96154b437598507a8e96ffd9c6978931307c19166b85c9103983c123070ccbc6301", + "d9f2b64d0fbbe7e5402b5d646749983c9a8b01c2b2b9b6bb4e4fb37703dfec8b18e1cab477e861ac4297450cfba7c9256990add2f952ec843decaa1af28e591500", + "c7d0fed33f73ada6178ddce03a0df3041f0ea6183b2d81b6f5080b453c1d62ad51966844392650c875b89b7173a62bc4b4bab6fbdccab9a1c02c7a3bf63e778c01" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA2q12eB6r5VVPAugR9USNaDLGcPfPiemKpeNCLBtPtmJ9EskkYFFGoXu6mFHVjaxncZq3m8FQSGZGcSby2rF96um9cK6mTWoAeTXt6jfpYp", + "xpub": "xpub6FpMS9hzgT3nbez9XB1SjiA4peE9oBNch3ZxzibVxEJH23CuJ5ZVpbrNx3Syf6fGU3TQ8JgpRD6raeCKo86E342pxA2YGaf4EuSP6tiKGBf", + "identifier": "7c439a5d85a11f3a24dc159fbcbe02ec7da1dd0d", + "depth": 5, + "child_number": 2147483647, + "address": "bA8WffzfznG1AZN3NuWNYLjHNhu3kU7i8w", + "bitcoin_address": "1CL3mveofmFEhwHiymrAfhnCbUcgZ53u2W", + "secret": "4fc7bfb6d55deb25ec8037e65addfc751d90e5eaec8d9f6ab832bf105e8f6c23", + "public": "02ea03d78964aca430c41b13fd755399c3753e4b92a349c2e68af42c306675bd97", + "signatures": [ + "32da805dfc2d44a4220fdd2aa5b8ed96db93a131948bf5c445332f98eb5eac5509539c71289ab0e4c4d47372cccc9e70394fb2d28a5fe5438baa8e699eecdf1100", + "f64ca831100395efacc26f4ead2f021860e9f943d63fba1c16f05a41194f4e4411d9ef5abba74cadb62ad98d475fc9fa311bc132c7dc2e6f8f2c3c181f9f48eb00", + "ccc5fa12f691ae734349f1262fa8277b4ecb25bc0000cc2f73ef499d6f055068689f90a9c574e1aa56307ba6bf7fcd817c009adbcfa2f83d217c99945ae3773f00", + "07cb73e4edf8feae163dac70856f9464847dfa61e3a350ecdf176d343d7069eb45f7666cd3b8582043ac4f9786d3a6c45f4a02f2b04fcb97cd61d413bacbad3a01", + "d31dade431b4857239d281dada66cfeb90a2d1b19f2ca46850987b8f01209120730bf77a3c947ee83cc43f5a8fc7fbd8b7fcbd7b144f1e51fc922d6a9ea64bca00", + "7f80a0f94685217a37b17c1da86e09cdb1e3448759fd0e0557ae72c41ab32d422b89857674e9a332e00c71ee784d7e7130d04f7ab5f58b15fdac778034e0a37000", + "2ac80707d9d5e828761a6502d26b5ce46f91af723bd6ad6e68ee5c054eb1a99a51d0bd9676cb8bc378b2315edf40e660bbce9c92b8a7a3c68860ea158ad59cc400", + "aa9c96145c169a6df0510942110e226a5042dcdd57c8fe1e0e30263524778009549ceeeccc4e72b0362e0cf97ee6bc0e48134caa7dcc03fcf735804b9159283601", + "0b0c6497e26417e96f28f7b4bf2a444d59c7771fbf8ce2acee1af673c2a78b3f6562326dcb6fb2006d6f63aacc37e04786c65209c5529fdf8777c04c26ccf5e400", + "f19bc8cf6031a9f3238db9a242fdc7c7ebcd90794db6b000345a59cebe8418de16721043c7751fbab4e38b12549f89ee5e6cb979d8c7803e012523a7e0fff32e00" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0001.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0001.golden new file mode 100644 index 00000000..c79870b8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0001.golden @@ -0,0 +1,233 @@ +{ + "seed": "iqwBScw9PXSl6JtFECoosRVCZZlsyu87DogMj4iVAKZOw4UOaweK9OoJ00bjnD51N9Axo2rtPkTHN2VKzY2ofQ==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3utJ1RhnU2BgJtEkEpo4RpN7Sop4WQ61HisEYV5TQDZgo3d6VQnqnh2X3XXGm3eHHYRY2HCtcmJkYc81XBoZtQSE4egW3wDxHeHFmHCQCq", + "xpub": "xpub6GuEhWxbcqaUtnxhrGMoRZm6fUeJTy7wNWeU2vth1jkYZbNme2j3Pb1WNLuZjRQcnosJAwYNxs2nAHRVcFKhSqY5LDqvFvsVpuEFxWxjYpF", + "identifier": "8a166b7b15cac9b5053d4105b55d477d80ee46a2", + "depth": 5, + "child_number": 0, + "address": "28GDT7YkX9LmEqXFMawMQ8ZH3LkxVdp3xGR", + "bitcoin_address": "1Db97EPeD5ig5m5ZcVPUSx3qE8etMZNRbt", + "secret": "24dcf62450b5abe2f6ef7df0572656ad21d2f4939ed344610f432b51ceeaa43b", + "public": "035a4b7a6fc5810bc1cf2c8f4c760c56b1adc278f1675f8853859879d73f786b6c", + "signatures": [ + "a47464ac9ed9d0c307366664b86437d394c268500fd005b01eb09db306540fdc64626eb32d1c0392f86949b3540bef8410f815bb8f480eb3f07ac4eb4779cbab01", + "8fd8f1609fbb861951313e63c020f80364f7a0778ea475f394b7f175200fde287e20c5fd5fda27eb24ec2ed9d2063e17205bafe58194a0d768157c66427983eb01", + "0fee776b483d1540b4be784c1c750618f4e1f1e959a4c89d806bfe2c6d2cc969161762004dde99f630748f4a38e3bd559940add94e559d2f9bb1fe6a06979a7701", + "9fc8718a3de0356ca5b6136694e2290996fb6ce660c714c132cd2e097a3dfbf64fbfb82def1bbe10b230668b438268e0c479931604fbc015f77e161d4b82c40600", + "36b95dc5f1d892020e4c30f23ada0f6da145bdc99884d2df00b1c0e038150cfa7507a93eb68c290ddb91d99c0d3921e6384225de5b16d2988259046de6174e0b00", + "84a0efdcdff4e4a08dcaeb2d1b9c890eafd599b06b94bb9906c1ef08be765c786ca8b1e5ef119b8acd37c8563c41fc33a8286ecdba633a4c1e139521c6f8179601", + "dc7811a647b7f905c498499171b561f14c1dea130320a044122c6ff518030d112ff7aa0ab899540e51907f26da0368a0089e34b6d80bdabca17dc2cb5caf01d000", + "71932e2d9a2a04a7e9d8ad79bc3fd23c89f6138434930df9ef15ca713389b6fe74aca1901775aa089d991f153f2b635f54735f73020cf394f3bee56e393c1a1000", + "b4d3b4b57a1c7705ea27fb304ac661c6bd0b9a3ca8fd7e0d9d6ecea05d4b81be71dfb6815f9114959609485ce85c98e12148c6ec1e821df81a56b1c196699f5100", + "60ce6964a58c8c8ef5d58de06abd6662f8d099736cc8b39a348d9312f33cebf805e9a0e7662749c3d600f728a6c8b047e5f65db7987c64e889ce47a492c0ccac00" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3utJ1RhnU2BjygAvzhLMAGMbFccrPCohi7pniQMaYidnSUdpCGzHT2epZa1mtU1ZD9F9vbdmw62kxgyL2cycSLPe3ahyufbvhMwuZVdRhJ", + "xpub": "xpub6GuEhWxbcqaUxTke32ELiJD69HT7Fqvf4w3Rb6oy8tFcfEonMjbEqFM8frroBrTzHcD4pZFxH6VrUPUjknuWMhikd4YE4bwqW56G96hmEKt", + "identifier": "8da1ef59d14220db58bb239c8baed59743e950fd", + "depth": 5, + "child_number": 1, + "address": "21TT1GXFasfsE45JmucnAm4SZJZ4rYC6LtK", + "bitcoin_address": "1DutGVE7YAv3qAZYdFspHWMJiHK2KAWXqs", + "secret": "055ad0a685cf4ff39f3623c9e22c898bf22bd87a13ddf92afeee3e8417e0dcc4", + "public": "032ed823773bb41ca74369908ee73935d675e6ed930532367a11f1cd2fce59f561", + "signatures": [ + "9dcfcc86da8b1b417184feaece62430c1086f49cafef7e84aed3506fbf9a617c4055d351e371496531f858c91277b42f9c76840f968cb2c222b77222da71acf401", + "bef21d026663189e4a34a52d6e8635881ea2022e8eebc971daa76df1172cf7757985d62cc368df2c43342a8ccea6474575a5f7aca9f3d534c578d8e139a112da01", + "9901982e9cc90a9452425c3a26a7a24446d4a462379b3c073a188f60851dd1154150ef2ac886aa606c5e89b0e5b2f08df8690cfa7e49742cb79f596600ebe17501", + "a58a341683c266f93ea08e44be0a05edd647ad31464a7d1c96c68ee189c8fdc310516972faf151274875d7bc370cf2707a92d3c862cddb46aa8776ba5bdbbf0e00", + "6337fb043d2f5bd53d5c80fbb3de7644c5a097d5d6cc98bd907807a14f9ea2a0641be3d63a3d37f56fa86b6179c2515d8e6330c5383f9c9aa6429c254589083400", + "546d2d8df73078d0e6c55d17234f7418a990a17ca1c34e6b6bf911a7996abfda27dc542165ec1ff5ba8c74e4faa0334a3cceaf8893af1c8a2ad2474ff373e23001", + "07beb0ef5db2edf1ccb6cee36d6addbb2b7b7232c40b4b234ae1866364fbc3ce48ab3a74248a8db7b3149ce444decd436bc7fcde5b19a200960b72895c54231500", + "9fb255f8e98d569b806c1eb359ae3a4172792bac394801d2221b4af8b9e554b445d708912d96301a63d92853a05c1a7c6eadea38d88f163528c4e0c21114bad900", + "ded877c06dff920321f71896cc1d34f08e547135cf3c9857c41332142e4f60f1396f224a2e17aa470fd96c88b9b852b73046918a7d272db6ab6df64d9db6639900", + "de510444d9f76d90268900b11b72071f8caf7bac2034934307d5cf1ce81d0c946851fd619fe0ee48f540431e9f8c11702876a578ffc6fcaf92096f86ee13aa8a01" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3utJ1RhnU2Bn248Wotp4K1TbDe14zeVv7i6aFMqyJdzuAez1BMoscrf6mzpEepqvSAvYh9Z8aydZEWkup1oznKeZmy7cJDrjnepjbBe8Bt", + "xpub": "xpub6GuEhWxbcqaUzW8bcqRpRSxC9FUVUTNMHLdhNdmTXeAymxz8Yig4RRB8x39hdNTZoUjduH1rFJz246zvnWfxk7LaHmVULWvNZX3w6Lrf9Kd", + "identifier": "e560f6ee15bb2ff1b8c6c640bc07b411ec65fa5b", + "depth": 5, + "child_number": 2, + "address": "2ZrqAonBrZmSLd48UkxNq9Yyi4fjeAGkUU3", + "bitcoin_address": "1Muqu9StkszhGsFCcqGhixQLu8H6ENDhXt", + "secret": "caf54cb27d4a749ef8e09bdd3995c8872a35aa27d16a5645d498a756dc637fc0", + "public": "02db1fe78d937f3d18cad3f5c37cdc1ed197336793b2695ef63948364a3d5b2384", + "signatures": [ + "5dd82b22468be3d982780830e04834077595aff76424eb20bf9b5033235af8ce36511422759cd9da04b50753873a30876db8d02d8a439153466bc616452b5de200", + "440cacafe7817ffd612f3e2fb07dc93e22be6360f0bc42e615343cbe20a56c752111e39759b95af532b6cc168aee141e54c6b2dde214a2c8d697ded8bebf952801", + "c23f8514de9b9e34287b49c3739850852d0e791fe881bd358586c17375b7905f10d09a2d7bd92497586447a092de6af6c897090d7152bc997777e0e5b986e0dd01", + "046cae7c89b6e4ac862bd8ee8cd101f1c0547a2cc229c759e51ed06cab25be0f6d1d88cda3558511c4a70ebdd2decdcbd4797faeb9d64678af30d438efed5d4801", + "4fd9cb549abe5a96fb18a1bece1eff73d2cc99f56f06a06d73b70c5da87dd26228991340d1ed49a0daf8502f264f1cf58add7537e67da9a68b06d6250e12811a01", + "5ef398024a53915ba3c7f839af42a5b5cdcf5028cf74fc491625548d7dc1b58b2e92b4833bcd81a167c6aaaf835aedb7555143e0abd384ee09dc4d73220e570900", + "6f50c9cd0947d68c99269e58d536850d834778fe6d002542fed79959e5f506d4685c96043d3795f74c720c3c18b8248196eae2050aeb3ffc35c05c9440bce0af01", + "d6cca29068db2690a0caeda7e63260add60f55e60d17541edfcba40f5a237cb161e9c06016c9e073e0cbc094cc0282c0bcf78e56e10b7c23d5555d3e23ba539b00", + "84051940b57eefb4ca6e1b5a6210395d4a2bc0f925e4ef7bd6e2598914ab323279b105ad977aff7cba5d60973ba997f7f748a6df8c593807a20bd5cb1d73a0d300", + "71fd4b6c72abcb8e91624b9e64a7fe285ab49b8aead40a83772a415ba27a7b4b44f563b605cb90b48adea0be18ec2c0ebcc0d1753a959ff90f126ec875fac14c00" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3utJ1RhnU2BoQzYwRv84rfCWRdZehtqTuGLXVvhVcBCrMRj7JXWLdtPTkToTv2d3oayF5DFNJkwe2nydozai7BRugrf8H7uRT8eVGx6tAY", + "xpub": "xpub6GuEhWxbcqaV1u523TT8Rzbw4TU44Acgq8BwKtLK3wiBj9kseqqktSCsK3jsc3j14r57HLM8Y8D6SsvZQTgz8aoqak2UfrVRgJDjqr6Au5X", + "identifier": "70f3415f8ac7c8280dac7af3d7e6af054969552e", + "depth": 5, + "child_number": 3, + "address": "221FmrphMDnKyDZCbkDnXjKN7JJUn1Zam2X", + "bitcoin_address": "1BJE6AWjcK5Q5bsJaA1eDtt2Qbpvyub5dt", + "secret": "207abd36390cd174a12ba51b2431353921bd3ced52c2e4a41640992f2564f8b4", + "public": "03485a6c254257cd87cbf6733634edd85994372d5e9a93deec35f58bf00435fb51", + "signatures": [ + "10fd66b5fdf42ff3c91f71d46e90546809c2afc04a2e90ed0a841f25c5f9319c0e263052870bb91b701de50edaf53e2b0cafad55cbdc93c8fe29ced99c5b6c8101", + "967d8c358f830fbe7813510ab4ff613e410a7852ab63d29accfd3b2b0f0f1ebb532271f377e55956349cf858b02aabbeb284f52f78d31870c6c8d93a67e3e41700", + "54389ae0d50df748ce073fb2c860abef1b19cf4d065270ff0b0e75f812efb5846cca466f3b4d80c267a50ef39cb011cc60b681d20e1252b79f18a4e57e9cae2e01", + "c184efb5647b290b0ee63629a8ec45655ce28580e3de775744752a3f9cd0be6b1ef4bd6793a87a1e8fad4e1a94c01c808d1b521fe6c512c17576802153ae44f201", + "06c98413a53079c24a669e29574a84de2037781e189f6150ab05a5a7aa00f39004843536fe4a49b364a97a7e596d629a3f89e6c1f2f9614b482ae01e3c509b5a00", + "4e9240608a98ff817ca56f12e270cab5c3082a5400046c5c2fa22391f3d115f93695b473c3e070103a8fe215464495298c4febf401646109f994bf8be2ad77cf00", + "facf6e6e06ace4b58e1f13c081536d162c91b7713790728d28e1f9bd4c72eba5068ce3601cf71be75c47984a370a72ecdd5c5cfce266db863fb1aa26ea23c94a01", + "5bf30e9a42fdd7b41eb8a2df395ed1941e85a87cbe67307e72417fc36feb159d6a8b42ae4f20994b8648544878dd66f276f353dd4e78a0a94110aada875f6f0501", + "5b6a34165da4832f6ad0f38fa54acd238a1af25918d742ea4e090260039b981e31c006dad762ba2958a0d518cf70553b07b2c54e1f8605dd0e358ce04aca2b4401", + "c2c329354f45c576a1f7da3210145619d625127138142a95219f2712c7306d496ebd33593a2723bb1b8a38403419addc54f2df5c16d30a886b3a827a9748070300" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3utJ1RhnU2Bsb8zJPExWGpDdicb4JsTaaGqoo1feiAMNqCH4XTJtqxUPHj7BVR8WNbAz8qUG2RrLcUzX227EKxLXqLh4A1KgaYwp1wtZkp", + "xpub": "xpub6GuEhWxbcqaV65DTQQmxsQkxBkT5TmbJwoCScBRHD3hLFdXRc4mZSeGxEai6uiCWmjmsn4bcSi287BhNksNQKNo7M89uM5i2jA9nfdRh3Mz", + "identifier": "23e82aa6198f7661d99d8aa561dca75a384e6d9e", + "depth": 5, + "child_number": 4, + "address": "2TV5dXNJRQL47M88fChujCbV96i5T1EB1Gq", + "bitcoin_address": "14Grmw4KjPnrr1TsnVGu9o3UwwGWjVyUsz", + "secret": "9c0fc9b6a7da9de9d86d826f1a6132d56c93253f661082be0c6f23f091257d65", + "public": "039d2980b44ab8a1b9e5f07ecd5e4b16c6ad8270961b9b22205215d27e0a62df4f", + "signatures": [ + "0832020e160fd2162e9708c575fada466ce68895398edbb7512aaa9135ca82aa541a87bc120c3a04996821044a6259d40aa71f3d4de555235b669e22331f363301", + "a07c010350295a06930ce49bb75553fb8774364386023e9793d698090125fc965c53435c474a0f7196a3b4697dc65cf28ea72857d70faffc50016e154dfc65a901", + "ff7cae86939bac1924cbb910a72f5da639e2ee15c3f7763612964eb50bc0508377518953664cbd94c44376933b184c4ca53708968ec8fea92f27350cda238c4f01", + "3a6864968d098686aa1fc91ac25786611c372743a9baca972af3e531ffc2962e0f139964be39de44084dd1af821876f09c416b6f7f53ed15f5a148d9e2d75dac00", + "3cede898ae529c1abf1bdb05773d995ce1737a6570c916a2a777f339ae9999f9449832156cbfd8232b12d8d703cad382c26854575be3e72f45eac3bb79bb306601", + "fe33b986ab25d8fbca7e5623acb3b653ca15fce88624054425b4ceee7f9003dc444a75a5170b6947bb6c8a5e2b081e2ab44fa616bd3c0074ab29798ea154efad01", + "9f8455e7805f44abb7f5f45b1984e848be9dd18f1f07ca66bdb0ed406e8de27d7bd67239c175e8e0896125b9809da37a4ede76a5393f530ccd05bf710408197c01", + "ccea7fbf812472861f4fc905f402e0fcc8865b471bf9b4931a0d7465c78181ed119f74608afe5c28fa5b0f1cdf1761c20d5721910749b562d47c8fb8693f33ed00", + "308b13adc487d8411f3ae23c40c0fc48c1c57124183b0ce7a630d383d5b77aab5a1d6d38dbc6980d0799126187c8b954867e8776271074d62f7315d4be06f65b01", + "ac8a3d33071cae8a6af50ab1a0754699aae3a6a1abd8eac139ab2aadebe95c8535f633f92abd7015fe73a79343ea22493eacdec41c8885ff6b9843a4a2de154900" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3utJ1RhnU2G4CubDaaYQ72FmkiZYWYq1hAbm1MegVcYZrM6utrHYfJNbdaBiKHcQURakJhvbmnmnofQkmCvk1zCkA9NEBKjr2FSh92dcHa", + "xpub": "xpub6GuEhWxbcqaZGgz4Kc7YmExzKnZ3wyGgNv6CZPmGEq9XSegFTSAY6TcrSumcVibWVyueGeZMuWhfPTtsjSj8XtCWvZ5Nassn3KRQbGdgJoJ", + "identifier": "e4b949a1dc2473a8927f33d09c19abd389d24b5e", + "depth": 5, + "child_number": 100, + "address": "m1ohRbL32CYwZ7zzi9t7N8QNNLhHAsB7Au", + "bitcoin_address": "1MrP2kLt6q15Zw18CuVti4nKvRtgouNbcn", + "secret": "31b898bd4a4d9325ba18e9577ac91eff2ffcf2ea301cf43caf7c9200c2cc00cf", + "public": "02cb5a9063dc31f2b81b2ddc3fe167ef18ec249a89222376c2b249b1a54ab83dcf", + "signatures": [ + "26ab2847df56cc13efc308491827d48345fb5e39d9c39ed32ce87796940aaa6b63a43b659b73e7e87927536eee727fde758f5bf7f2c9ef4e4bfd9d862bdc2a5600", + "8b5e6f0b25c82f1f042f045e7752ad2853a9fb5e88e43a9ce773530dfdaa78d107e5b5bf6670f0186633306d534a1494415e3a9c99a4f16f1e1359b63cbd4ad300", + "88a50e0286d4a72b2df1fb9afc3900acb7e70919a0b7424f292a36af2e991f1f5f5bb6543dda36a3b540d89edc4cb995f72f8d8f473131cbd6b2459a0b54681301", + "80bc43871cbfb3543677cccaf021081374576157857e68902c899ee5c03bf8bd10cb9d08b1fa45f505226c24dddfa044f1c7f9035c3b072e02d52f7dc6d27adb00", + "5d160f7d0722be3825aaa0f740304e817d382443a809f4704ce7fcdc928751d65d7c31d8e0b3d1957b4ee13f86675ee7d05180d634d468e543cc710720ea427800", + "6a16c0c7f281129ef99dfa8af569dfc352886be7201ce503bbf63fca776656773e530c8844a9de139125a76c5e60985c787b710a335512fdb65db96c3607a46000", + "9ba33505dbbe668d79b456a671b1b2628aabca4148fc4ef5f07ab225bc48388059398def1950b48fb80922e7873bb629dac9b7faa44b937bbe7694267ff3716901", + "bccdf92f1f767a7fa603da832430e2c14e0c2754664a728413142ff11ca573dd1a25e9537cae8980bcc433c82224af5b720f87ebaf2f6d0015e4ae1f7ef7d50400", + "7454d9d59c53e190d3cd2fe3a0e489fa2c0a2dedf1e367bac0fd75fec2f63eb97dd25687758ddf63ca89974d18cfdf9adc0cc170943ec03b61680ff54e3d72f200", + "41edc30e77910c09d47e204e5a9a7c9f8586ed953228d3b7ee7c3a34de7654d40dc2a627d4163ea0f9b08362d8be6b20e013988deeb3f90cec55328711be860100" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3utJ1RhnU2xg8Rfs6fZSFAZXhzMivfjJYEcSUYuxAhX7wkUvhYHvqMVoQe1kc6G38FNTkSBUYkX2UpNguMKmBQxfK37qGe6mFFNxTYK8q4", + "xpub": "xpub6GuEhWxbcqbFtcW8y8CZoP7J5jpr8PPafmADErxXWWEVzk5dUErYUdfyeg9Dok3eh7tsqe352nPz5yahjJLjE8CBMRLqkRVrt8eKQBQahyp", + "identifier": "7abf462d9e4a5e79ab488d0ae27941bea8770b92", + "depth": 5, + "child_number": 1024, + "address": "t1DpPkBSe3jAgeWN2ohC6YzvqvAhnAMf8s", + "bitcoin_address": "1CC2aN4UN4rYNjhUYu2vDPa1WMior7wRL6", + "secret": "ae6bbb63d3cda20792110d882457804951d9a575368aa68b70325fdc30c69466", + "public": "02ecbaf57af5d4c143c6503a68d68759e4d5fe15d11b52ddc7d7d0118ba9bf9f5e", + "signatures": [ + "6c60b18c1954f219f0367f4bbb6fb94ba4e0cfbfed4542da9ca6cdac3fc99fb01e0f4dd6d088f7a44a8585cecbe3888cd11b3de5c80b861e763d82c4e5e0303900", + "16084357a13b1736fcedcefee739b9b6e6874d09012b92a82ee596afad34e1ab517a50bd0c89ae6d92d9eabc1efc9d85d9a3b57f9a687a68fdab45ffd249e3aa01", + "8fa028f54dcc12f8f844fd6123a4b3e0e8d95ef90ea18986246348dc9ddb9cbc5d7e584889d6f3e5218094ab0cada74029f9c3ed03b81da440906040976b4bbc00", + "5b22e8948ed706166d2e38314d3a0ea74a34008f3bd9a4a27b88d6b69902c9a52aa9f170b49ba4c42df0fcc42cb242fb88818b6c44fd1216ddc1a7f3e39af1f900", + "35a8bce0ecf08d782b359ff6118a9a0605606dffb574e2d63261a80f1503ff617e354a73248731cdeb5ca8f7daa8153b290275b3ecd3506e3b211d6debabf5aa00", + "02f6e4f91c5899bb08ccc4e201e227854303c6380e56595d7305aa66a1cd017a1b4f3e5245b22745affea6c4bce0b0e4a7f219fb41a0ec8e1865d8091118fed601", + "20f0a127e1f73b6b015e0c9770bab9d7e8b3b29f3488fe82617a751b0a399bda3825d47c2c703323d4eaea3c7c06ce2af1e4133d11aab4829a11707bffbe9d1b01", + "0133f2a093536f83e534325696059ed26cdd30cf810656393e20cf72bf7decb255754cd30de65615686ef1b661c75b7192d20f5c1326ee720e171d0ded161a8601", + "2654b2d6c7c667ac7ebb58954fbd23aedd2282ae0e65a921a09ef3beb371042c00b38edea185c34ad12dca01a2ba3977a7866d0d6dc1c223a576db682eaf774101", + "b70361cf91862a3d6bfbc75ad115117804d694f73f025367b88a67017fab285a3c35125f5a5f0298167862b0843c5a1a3c7268c1dab34a876a62208e95878f7e01" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3utJ1Rr88Z5TqtR5q6hcTpf54Ahy34yygYq7cz9sbbQ9JLfYNTekMQQeTLG6c73KdriT5F8TXQWhyFDyhizxRYtdDZijZso9nQdGMscirG", + "xpub": "xpub6GuEhWxjxW7NgKxtBrdhybmPd61CNVnqLuURv1PmRw8P26fp5umuJ9itVhh6X9Feq4oAC4csLm7MYadY8L2kMDATMaeQeu5thm2ijwWh2pp", + "identifier": "981492b7a357b3925207328cfd5d514224d8cae5", + "depth": 5, + "child_number": 2147483548, + "address": "a9i4AP1JjMEw3py9Vinv1eJtDnzRQrTJxw", + "bitcoin_address": "1Es8MbzTGj5tkxssjjT5ai8sSSwhCNq4Sv", + "secret": "7e53f69e43773ab6b60d14ad6f583d59a77a30bb5d01524e76e28c735fd11f88", + "public": "0225edf7c4ab0edb404ba1c0fdb906fdbf2d0219b8c23843ca37f8b6f979883526", + "signatures": [ + "df251929837e95d516453e33ffb1d5b1573698e921637010ad8bfa452dcdd57f491034f99812f83dbe2c700ea9dcf52fef388c5a206a1211066044db701ad94901", + "7104477f80044453010088d2553ab65f62b4294aed1612dd73e42e7b9a3a9fae72f30289930fbbfd8223865ed138cadf98688c9e527638583b080341e56860b500", + "8f971cb901ff7f4ffbc40704256c6426bcaf70472fc5133258b6790817f3bfec65eaeb495960f40f0fdeaa1044f6d091ffe3f713b9032b58ec22f423a6c492b201", + "52a08321316c1282edb43467a623cc246a056f8ee33c8a544efa6afc385909cb08e07c75fd004be1bd3242511801b1eb31a6f2d6362971b14cacfee37ad1872000", + "c7ff9282138aa7a1e19fbb0e56ce6f59d887febf5e106c72e50cf05fc27b857e52bb0bb5e8f013e66897a992132bc186e98cfc20324f407cfc32c96eeefb5b1d00", + "1b5236f0f76a260a2a4a4eaac5bec2b50aeb7b2788e68bd7ecbed7c096855d61667950c1709cd26ab991d433144d944d5b44882c0f20a1dc0ec75813dd1c832701", + "c5169b1143a978109ac5e986da9908d49dcd5b80c4a8ecc47f5b23b48c5b6f7c544b4cf26c51f1a982700e971a0faa09722d223ea0428b51fd6874a5a494a69600", + "999e472f9bbc1cfa378ff59590d512c17fa5de51bc1eec8201fbe936a59302140457a44dfcd5a06f6ad3a18cb1c9b9fa55f54503b52b9870f8ce447c3b2595d701", + "22518764a60a8ed53f2b4fb34395d0017f10fa5a9c0d27ec314cf22240aa866a7483c3e168de5ef30a1738e9e8950dec11542c16ce66b1257650e8e2ff93842801", + "8694ac8f49af712a5bd8646775e83f076cadfeb6330f58e80e1141ebf2ff6f6028b45dfcedcf38eb6abbf3cd01307e44876baceeae9d97b615289808c3a8cf6801" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3utJ1Rr88Z9q1x3sgpbonP56LzP3v9g5kqHQNRQ3LwGTejiDLu9QgT2c42v7s7K9e7MwdQ5anXRTv9WmeUZ9fN59VD5x4ordXJ6UgRoGom", + "xpub": "xpub6GuEhWxjxW7T3W2WyiMcAvKoeNpsTNsXSyktCkq1bgUFLT4rktDPxUmWTM2mcv2878JhYppyuPrwcFagvcCEquLDXctY5q5shmQa9pcQQK6", + "identifier": "f33cbc86009a5b48582384973ff281a58b57548c", + "depth": 5, + "child_number": 2147483647, + "address": "mdDsxa4FgU168HU6Sx8prk2jXGTpFvpJEC", + "bitcoin_address": "1PB7xf19Vk6biorQXYyd8W8xzRADFRBrYL", + "secret": "0dd6558bc32ed960cac50043ae5960a5c6805c85b0e20154a03d9c6f70e661bc", + "public": "0310e2e047eba8ade874979bd286a0fd84fcad215229f57287f6a87e9d4564742a", + "signatures": [ + "33f66c4f74671dfe1ec42fc4ec4352575c31a423e482dbe54c9086a8d20180425d98f2970944efe5e2ce8cfb285d63d89abb164ae128c01e03c5557ad4ea1b0201", + "c2789e9df7118056c9f383197ba4691699b59e714f7bf7df3355ce765382415e521e6e0b4fead4871da9f97b6afdf762579971385b6fc785265da76f04a313ef01", + "e0a51466735ab90dc69ba971ce1e171e78c7b40c68d429ae9a93460eea348ad32c888602c6abd22559fac74960617fe4a7c604a8215a045a68db246ce190ab3100", + "f1149e7a6979dd8e25e52dba02a36e0f277b45295919dd96b1a99ca3e153674651d9dba9330b7436b5609e06eb59fa10e348ee6a859ca938c2b71a6a4e65a0f701", + "ed8f1d50131642f73f696278aef543db7ff8949e60cb0484cc731c8890faa6f56955ed62541690db6e55a27a73932eb973888326bad1a8a78dae49df1e9eeb1e00", + "6d24a544b6758dd65f0a2452cd0e8d90b0a66a7d0572d034299601b53e5206fc5fa952186c2ab689f0dd2854426e2a6e23418a89aa28e5dfee321e7a6c2ab85300", + "33a72c923dbd609c8c900379e0b454ed8a4ad04a581716c42c455775964937c70a5f2dbfb51a39355fa2d6ad0fb29c1a74599da276a347c5aa5b3a2e50d4c49501", + "3beedf40187d3ceac5f665fb636bb6643ad329dc3c582a8e26123d0329e8a41820f9c76a251a2ebfc0fdaf56c72cb27e6129bb89d676ce4f3a1e64c8a1f7c51e01", + "27b96b58a333df384be74e33b9a168ecab5683d0d75e184dd17ff2a0afb466801eea701ce78e628a84ecdd563bf6bfacdb6c506d2875a6e28787d9d92926aa8101", + "a600a2bade62fbbcaf81abcfdab01e97293a8f26af4777e19821f2a64509a7c924203cfdca49c57343d5a66447d9dfb5e701d94d2fa24df2c671aecd333ab68e01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0002.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0002.golden new file mode 100644 index 00000000..d016bfda --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0002.golden @@ -0,0 +1,233 @@ +{ + "seed": "oBfq4P6UMze5OBu4EtwFoTovtD7AB6IyUTobrk3wJ04=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3GKSTGBcZC5VFAn5ywQBifWWeWDQJFN1fwkgsS4utLk2kTkcqPT3qXHr3pnrytgHcDQ7vqW1gRsGK6vQAJzAm5EU4bk3QyZZ8R6zeo6Cp6", + "xpub": "xpub6GFfqxo5SvkNhjFFC1UQYrcF4gLhokyDNtsMVFqgUDsiuYnuANhhbdqmhKgCYSAGZF1TDzqruCcYdk5WwGiFmpnVSzKs2XLudbeLERazLk2", + "identifier": "1420f10654d3fd5e5603c2eb71a7d514ed7c8f20", + "depth": 5, + "child_number": 0, + "address": "29H8xrq6otYbz3wHHUNxG6Ts4vnQyX1VB2W", + "bitcoin_address": "12qRyeqWqJeFEeLvCbG7mCt5poy8UEed3d", + "secret": "3253017ef44e2bd47efcb6d9de46452e74e1ebfc51ee54de43a4e6454a4fb74c", + "public": "029e80563dd5f64674cc2c0b016a303b937c62a7454d5ce2fc95e0886d7a668f63", + "signatures": [ + "e36caac30c3982710c15a224438e7544d97218527410d73a4919880a1e13dc1e2b674e9202c0eca1088fc8446bcc8b0eeedcaf3e403e809e22a54dfa64d7c64e01", + "85a23e1b1daf33c49b33d679a535fec9bb23fe52710951ee7de0f1f91fa876fe664db739be4f05a0d9443da2c41d289a9b9109c9754f02439726074de7c47aa700", + "3842e26658daaedd7c52d63a56f81087964add74349636edc3746e268df10d7414599442a574261c9b8ee2b69cbde48c1da92d603d2ef94ec04c5dae6974aae800", + "cbf45decf872f864c1108274625a006d1f7bd72f6032b236a944cec4bc42706071d424b0bba71b8b359363df3357fa860c3a8f35c89684b70e03c6bdb72d8e6501", + "63045376a125d1d56229fabaa19f0302e2805b0a140dfdf2c6e152d2c1c35961563d035aecf2de2f0480da99727d52ee6e6867715ef9065f597e4e4922c4a1f501", + "c501e4c3c8204305fd4b51841ac211e06367349c8fff7bd0d818bbdb0d3e765f735de0eb4470b28d5d7a07a010baf998c13cabd58fbcbf8a1d29aca7f42b734501", + "a0e90771c87605e8b84b7eb0b7d34f52724f724ae9625310a56a1887a38318053740bc926665cce1f375fae44acdfdcb4ce689dc88924a7f3a0b5f4fcc2b782b01", + "85aecd792030138ca8c2e0c43bba9c1bcc9122722adda08a8af154dbedfa5fcb5210bbcf2cd34e3e3418693bfa4382030a2fa191b0f54a83d4e1387f00564dca01", + "ef31db97c3622a2efdebe6b6f6bf91f74cfe3a39618997a1b26de17355e49600541907418dfb8b6a1a115d33a01d90ce1cf9c651632398309130c89c0a8918a300", + "0d9029343f9088ed2b519f47ba01500be3620cfb9a9cfb410cc231e20bb088186e6ec82a9ccd8d9e874d35c63cc1e38004cf487eb1ebe371c0042858b1a4f18700" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3GKSTGBcZC5WkEEmagWyRJSLNs2ZDaUNT5PLS1dmtDYURcviPuWC22U4jq9WMFFPNmdcmcuuFk7X35AQHF8H88dbGECRmXwK9BqBQeWLzG", + "xpub": "xpub6GFfqxo5SvkNjEJhscDXLZFAtQhWxgJKjfzz8pRFLDkXMDx5FwDkjpLwv2iUEFYf1hbiW3oZhxzwkKRFyL3RHzfS9LCbqQLZjVbtNQqVm9h", + "identifier": "cf0cf2f6dab202be41d804f49f075acef469a0a9", + "depth": 5, + "child_number": 1, + "address": "muzcUVUhcD2WSHeEYGSNS9ayNx7q5M6z6R", + "bitcoin_address": "1KsnPRkPrDb88oouVBJrgzcfWkS7zmysXL", + "secret": "8a255306583de4d6ca7d451d361d2d579464148bebe21dd0413d2e215c1e12eb", + "public": "037e5dba2ca2efdc117a6d9059a9baac4d94dcd4dfdab410d96f24d9effc64dfcf", + "signatures": [ + "f22a9618f2a0cd14f3ad37282246e44c930072b63388690957ab7d92ab2533f83d171893b49fbb5b060ab490479762f325034c00e29f06034b51ae1d0c7cb81d00", + "66967f983713ddd0938151b7397405b82fcc705d1eecec471bb6d48c01f7029f2be71767056e3c4da4018f561b86ab1243ea937187bc8289107f6c24b60998c300", + "59389ce80445b1e7a7508a6db6a591696500efde19fc94a7d1b2249a4571e7aa344e64d706a31a63fb4ba18a874e8d48cd08ea278917f46cce6584404bec639c00", + "b482167f2141f8acd65bb1a6a1b907c129a378445d13321fd1d7cbc713cf8ff9675a43285e014488c95062e18a5edde66b615656a012ee7dbbe6a77d9ce543bb01", + "de52ccf950fe50e4b2ed262a52f076d96c476b792d3b61afdccba98151046a2e01c80b8e50e3a75efa9b08e618086832c3188a56f64667837fc2e47b226d773b01", + "48b04f8e586e1338efc030c3b190c105f206312ac5b78296c42a048e3dffd67e35bca3e55bd9b1a47712d105414980700024a35502ff946b393ca890279711e300", + "4434f6fc2b0ed63a3e79206ed0f9bd19575612b8b67bd4250aaee83efa4a64b2695941c33ea2e6a3b6436674ffa7537e50d861a42ac355b14d7f71ef9cd4dfd301", + "f790c1d66bc6f37e47f1bc99741a96d285b2e88fed0f1051d5ae4fc6d8655a8f3e87c3473c2d85bbb2b0d214ce29da124dca82865f87645ac68d9550ba29e3fe00", + "bf90d4e7055649425f236706867c8abd5786568011299cd1567b2865125c2cbd17ec383f8fdb486f7e987e7dcaef9e52bbd31030dcd813cf6f369dedf37a279901", + "128c9aa4e83c02bbb6f3fa2db4afabc596faa3efc5f03af5186c3baaf593591a25f5307e47cc488f94b384264373cd4f22c264dd6cd6ea596d485c29cd77cd0300" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3GKSTGBcZC5acG1Fo4meuU9FELJZkbgBpJ87Jtezr9Ywrn6QASjSYYVdT2tf72GJC4zJcKTYDRARwgTpYwhuejZs8Fz5bWoAUAs7oP7zqx", + "xpub": "xpub6GFfqxo5SvkNo6LUMpbn23QsoGAnyDKXZ3DiuhJGZBgXpf7EwhkyzLryUgUJ1mgrnjXTcd5GwHo2su59BEqJBQ5anMWhfytUYi2VJVsncNa", + "identifier": "a9586bc448073426b3346b3e1fb0574f935d04e6", + "depth": 5, + "child_number": 2, + "address": "2Vdr1t9tkGshWPXf6GqXnba3qnZSWkSuD2o", + "bitcoin_address": "1GSR81uWH9wtXqjBvPARPGYVti4wQYj1SL", + "secret": "f6ffb07409aa86ab6be4ce86802d4c7b76451a5ffc126854f10ee5fcfa17f4d9", + "public": "022546ab73d9df80dee1410befb33e34f72f26764f23c7b12d376e483371ca5c02", + "signatures": [ + "e103a997ebcaaf2199ff7724b5e873bb6dc8d6264be61bda4fe522f9a5d5298b1b93d311a31f6f03fa19b87baf9f8df948cb7059e22f2a79387ae9755f8d4a2c00", + "b8426d0d3c441ff617409a97a5202d21b8618355667e3f9ea9957fcd19cb28b20b1c76f47f19ac48664650662b7bb6a2ff3143c68e213f3ee093a31b7cddf10b01", + "34d6cfae344f9be458ecc0307a86898feca4915a58ad7d5bed83cfe247a6f18f03430e2282ea142e6aa9ef664f4f4402730e91f40a8a728785b0990c76cc945900", + "dc3cdefd0142dcec981e4d3ac57a3810c8f26e0eeb62f1ec9310cfe2cab990436f27399eb6d566a6adfb942d8d044de13ec9ed98d0212e7d2cf69bf22af9c78201", + "d8e723042b8c72e090f03e857273c61b95bb33f360a6d3c15138188f5dab05231023a1de9b9312ebca95f1eb47294f82d628964d9fa69b9f604055761685127701", + "0e58c2757592920c79f89f69684cb5047c2040c912f8d52681076a20602076d33908048ed0626d54602442c6f2093e1c4a7cded1ae5973398df0ef9a50398e5d01", + "d4591030a8ee37e9a60dc4a91f17b4f6d67bcff40494eff1ac8e3ee19d3d2b9c14b573c1ce754b104230bc5b82ef700f3403f8a857a8d7ad3872768d100deb1200", + "5ba4adb9f42503f092f1aa6e7e42f690742c64d1ce21b81d499cb0af2301c16e78574053cef08ffbec382e98b9553d3792982b870e73dc3b80fd8aa7ddac1b7a01", + "674c97a9bd52aaec6c895287139ae794127963500905945776dd4c2a1b9dbfa163e94a7f789dee088ffe1a43df97b02ad97585169ef8a04aa20da47d387a7d3200", + "8848761de19d0c50b39ca9c6c60b6c48a686dff6473cac45ae509d01df80fb1e02f263f81928dba04a049364ca4cbbfdf94928509169005410052c0a73f214cb01" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3GKSTGBcZC5chbthRXvVpfX6ZxMJWQy87DPKT4drbJx1M3Qr4KpMrp33Hr3UTLNUfR64VFEbM9yHWPv1FyjGRA1e9sMNinsH6Kvz8nec2y", + "xpub": "xpub6GFfqxo5SvkNqBgMoT4vrxcFebnqhy8pVL8z7qUFQvqvt9NZPbe4uf8WtbA7j34AVXc4ndM936hssMChKcn6KanFqVyBN2P37H1rFuCC4G9", + "identifier": "27333e5c912196956d567094d2a50321e62cdd7e", + "depth": 5, + "child_number": 3, + "address": "FZFUYWGD1efpmZemofMeBt6oPdHFt53AXR", + "bitcoin_address": "14aGjx3snwxtdApsw7iEr2YFYbU1MXgd5L", + "secret": "b2c1a5fb19dfc23ac83a3e84170e193a632d5457480e9a4d0bb58bd0740ded67", + "public": "03df2d012f596d33b828208fc23968c2804f7480ccb2a38207bfeb8dfebbfbc31e", + "signatures": [ + "80ee093812a9b581d9a594f29d7857105a9a6e4e76803808ffc9c3ac7f68d07202fe2ba1927dd98ab120c5bcc58b1970e41c51759732c5e8bdd35c07d4ec0f8b01", + "27bd5df8dfa4af4c7c0620573eb56c7b61771286c411ff2585ab62586c540a206755f30b7c2b6db0a4e7f38149db6e1adea272ca059c279ece05243639abe77100", + "bcc26c8b5d99bcced80bb90e882d3417c58306580d26f890c07364850cf5c00950ab64cea7e9279f5a31cffe44df64b63cbf144140c56d70e40372938768d45400", + "c2f85c1f5ff0ffe1daf70080a59d104ebdd5b8da53cdb55c89630ba6bd9acc393308856bed317b2ae92af703656f0b179d25a1695171ebb4c1d67e1f384a530300", + "3921f54c04bd65bc2503bda849b92f6def4f4858c79bef499de3b62b2df3ec0016c803ddcde1a07efeb3de50d0e8cb3df29b2e2c07525ff417de22608c34b84c01", + "8fc415e30fcfedf19cdd8a280a176a131d04d2bd027225109e49c54a383a55cb4f9d20079cff534b813ae75b7b93ed74225184cb664dca6cc6ac391607fe7bc801", + "80760efe8dcc2741a50ced886641c61df4ab1cf0ed2c504c76db873324043c6b77c392870d172edffdff1b54de098fe4f29521bad2538d4980ddd5e08cfe096900", + "bb8a3f7b5cd5d318e292ff931e9c5051da1c7792470d257e5d05331107fc6a5963613db8ba1a89fc1058c4f75c9ec2595d0645a09f5c0bd99c8c9648ab92620901", + "421c765d5ca8aa4370d8bbd000cbaa2ea4428a617a323e928e1d248f06029e0e4c7a06dc3ac840c7ba55391fc28d8a1ea4880b01aaa2f09b74c577b94c62f61f01", + "f534a0b752aa69089b7ea22a098cf100d1cef75f9e399be8b81c9406297c717a4c4ef24fde9b7ab752dcb4ae8ca820aa86914d4af65ac86195526b023fbb765100" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3GKSTGBcZC5fXpyjPNfwSb8amH55tGAjsM1RP2QcEC8UxUNUnjLEtP3d3dTxDY7fy7QZs5VPLUhfT69jDibJw48UkGVzvqFXnwF1q8TD8Q", + "xpub": "xpub6GFfqxo5SvkNt1uSqQugJaXs8o7ZVLz276GcDmS2AZj7MkoX2L3anghXUMzGCdSyMtfqFMngMY5nrLFapyDdXfzMyocSnseScRLG9D7PUxv", + "identifier": "85af0c752fd12cdbdb0d8db00418dcab8e72c6a0", + "depth": 5, + "child_number": 4, + "address": "t4p94aKVc4WmKELFhemALTXpM8nifQWmZm", + "bitcoin_address": "1DBra7Fb4jw8p4cVCT3U4wkSk8AmckSPHd", + "secret": "16547122c4e26d630874744d15e8c1cf0ab848edde8b9158c445364f795eac26", + "public": "03cca17454a589d0d849a172f631ce32239c15142e22a205517fea659d2270f9a7", + "signatures": [ + "626a9baa73232dcc0c3351cee265cac4792ae0157d21a0db577132279e882ce5175495956e9809232f74bb0e1a85dc2f8bc78be5c4ee8f01b02e6a893a65e9aa00", + "f5339b1c87857617b69dc560c451bfa35a39d8a61e1cc9f533a4644f6b76a37c0b54ee755edebcb415434c8786a80d4f5ce868fbdde34c31a0af05bd7e04acbd01", + "ade343d9126554701f6a4f790fd2e95f9900a68cd370fc55da3a292bec0d01e409f5b4d3766e22ff491195cddf2532214915fa7e30a75ece301ac7cf0a1f237d00", + "015f14829adc974fd12d2f1351a906e8df6fc39e3c5d68d710ff90a5ce07109b02d4b9a19e2552e60542b950569d6323c123aa7d1893e02034df32e937d848bb00", + "654162655a3adac3adb56e2b1a3b4d26639899a3b5d2730bbe36839ebd339bf45abc8edfaed9f667fd9422b71bfe96f1aa1d6494ae5fb48449d3c0b7d32a650c00", + "e399cc15b5ba6a943be036521119f54aebbcd6e023933d747d66239e096ffb6c45a6f78d4603e3502b4c1ab2e84077df92b8b99b3d40e5fd25053ab3fc0ec37300", + "3de1b8c700ee26cb61d63032cbc02e48550594e1ae16e2c86c6fdbd83bdea25230a03e45b8d98eeef77a237b86d0370f33e02dea724975ec9d27c6c7133e8b5301", + "ed1f8bfebd25d9db6fe3e777b8f49c3db8bab361b2c19ce73d7508ff456919c10cee56797ba5ab126f49ef282cb055345786372cf2c6c27a76c8d23bcc42630f00", + "8f7129072446ec309bcb2a66dd9931da16bf26f3a80c8c524d21383d8090716b055dad5ae7c1ad18be5593e44283ba77eb8057c14024f21ae983af16a44be6cb00", + "1fd88f3fcc15f9b78e308c4cb5bb8d1b773f6b0ca3caf93b80c6969b7fb55d64644fa035c9c190578150d949ad1e98ed6ee1d7ba6d5db130b04f927250b3e8cd01" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3GKSTGBcZC9s2MDexykCvb4evpt1mVrHNMaCWRg96tYWsqpT5MNgb2BzDkbuZ6WsroYGb8PMNduJ6Z7iM3i21M3ShfJfzjEYv3sqTwKtyS", + "xpub": "xpub6GFfqxo5SvkT5WRgkzWka4XoCxfNREDhebHAztqHhSRXPgAxzcfdEPLfqVkoKtxcaoKmcchUh1EcQVMjtuzQTGj2EhjKgn5N4pAZUwSQrvu", + "identifier": "26a5764c8b6ec0a27847ee390a10e60b633994b7", + "depth": 5, + "child_number": 100, + "address": "2hZH4dE4KHwB3hoQEDEbkS8K9zqrH54ZNxE", + "bitcoin_address": "14XLtoJ7pzTfnxj5vLbZXWuiYeCp1VWejz", + "secret": "659c231424344d715b08c6e783cd5b3cf78f0d053cb12ff186387bc75f721168", + "public": "02e5be1b32814cd1e1fa7e7293092a5b08278e45133f08acd4b5520687ef0ef6bf", + "signatures": [ + "572700756ad92d2a2b553920e155211e312d932efb2c4b5f53a20d264291139a5c94a9e8b6dd573013e7f693c32e3f34f2c4bb8862976de092df02c5e4f124a700", + "19766b1040d55d3246965112ae514d550d32c77a09a5884bfe4e31fcc9f86b9b68501c324ba8946a5fd5a5ebcbbbb70c49231513f520471c6cc63ca5c572954b01", + "1a2d1af6d23cbda1a86a6cd083274b2b3e91b7147231df34332c2599b57c02b45c127e6f73b70ab966066ab3f31d1ebaf7778c1435db16f02f66e7a63ee3e62000", + "eb08f1a68cbeddf796881e37be48589ca09a986903a85f781b62be61bab9c5d664b94ef041c7e254747cf9add4021fbe629ad019bcbd7488cfc4942ec9fc107101", + "8094a14a620da3720be013e8c68d8a2cbe2d7edac442bd9646a830986d47aefa77b39d9b5a87464d13042eab0fe5a51a4152b3cf3497da2b9bdc049842384e5300", + "65e0cce292a2936a63469c0fbb7c4619d9084b14fe1267818585fa62074bd25042f95e27a7a1f5b8e5bfd54bc12d98fb273aba527a80bedc721f33d8dc9399ef00", + "2a5cebabbb8895789bbaaa3a4450b0f0da817fb65dc4b37878e16d1fb9f095c4597aeb94805a5326db5f77e0951ebe68925c405bfb596cac850189f213c3e31c00", + "6471a28909dfaaafbe15072428bb9d9fd4ccc681eff3e11c8e5616b2122bf31d532095621b3800602d5e81a8c4a7411ffcb9b0a6e892da8f5b322324020a22fb00", + "85519525e86e50ca53bd871214946997e3051b29ffdd722170a971cc6098e5be30eda098c049e6c3e3f474dd7010b28f9c2318bfc3ab5bb035943ffa8266ed2700", + "9b73a348880171d7bf924bc0915f7a6803bc97d5f0b52dc278a1bb5f15f8a7a34cc5fa980a9dc313aba6ad35c3e99a50448a5b99e12f465242be1ae471e4d71c01" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3GKSTGBcZCrUjNoT58frJFr56q1sp13QXkRuCH7sf2KXfR7inZdmupm4pNAc7bYYCbxjUdt3JS1UxpGvvec132EudHPMuyWyj48GMgbEBV", + "xpub": "xpub6GFfqxo5Svm9hDTGZ6fgDSCad8fWHGitmkg2hagjRzZJQTkGGKstKi9Ev6NrL3SRgDyRgTftq9cednzQ2H4Mk5eSc8NjGPHfZapgyUnUCvF", + "identifier": "376531168f2b6cc08ff9b51698dcb6c478989583", + "depth": 5, + "child_number": 1024, + "address": "2Wqrk4VqR4s22yEAF5fA2DwNx2NQ912xPyJ", + "bitcoin_address": "163uPUeowWktjK46M7aY5VvZdpKWN6LmP9", + "secret": "4388228b9fe7a03652347ef593e0ff75693ce6186521bbc0db97b1f83c6b67d6", + "public": "02c4c5c2af5528f59daf444ef262c728c764d5f10f83bfda7f56a1a3236a5c680b", + "signatures": [ + "fe8e38b66d7a9b697a543f32e661c28e1640bfe253ce6958a99a0baba1ec3e563e2f5126c8c605735292669878a9de41111ed5201bd004114af20b62611a248b00", + "a0e9d900837792dc4aaaff8f2b87d040c6b873a267b60c00c9e273c1bf42958e1949b222964bef3908e9668471391fda0242075b3f4b7bf704fc53681cc553c701", + "d57009e209ae9b8da23e9579ba6040674b503c146813a833d6010923452374d51da9a636c47282e59ebd148a213de55d141b745ecc824d2988cb85a09dacc8b600", + "2201280307d350d9c4022048077dc4882d61a9c003a8847541cf4b360b65d3005d5c030c925c3388496ff6be0eecfb60958620df0cf9e605aa92a3906267224a00", + "8957dd50f1ba856ac732da25d5380221d5698a0af239f1c245730c095fc0a6af6543b5a5def87c69cbd6d217715e59bb62b201065880730c2fa450e6772b323900", + "c60f87b3b8b62229d12dfb8a0a37da06e376d7516d986b33dcd9a16cde9fd54967a79e6ed868797cfc566695b57049f6dfcc3e3cb2e75cf8333ba7b67d92015b01", + "922b9af58cd2652c8b21ce82ec5d6853a004695ac6894b0198af496c04f8d88c73682f74a10cf12eb60417159278f5b6b2a75c5ad4e2afcfe21f85f1b419680400", + "5607cd076c5b6dac0d90fe3553d38df900298c2a7d959d1c17d66672500f70c35ac318e418373ff0517455f084bcc5ad7728a310664ca1c97e174275dddc16d000", + "4421d63d362f514c103e15e151745c970bf234fe0740f5e2fb2d33c6c964fb1e0d2ea06f0b1399011f0d1c18c1fd7de066f1a71a6883e37c98767ce41267fa7501", + "9f0f4dc45ce491b4b142ff963302455125a1ccb85a56ce52566c639a63fbd584200aa3d7c65791533b31bdb055ee37e65ef59ceaaf37d25b151e585061da014300" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3GKSTGKxDiyFcHrYLn7UASmMwmXYLXhVZPC4QqyFg1umpiRT2Rqfi5C6Rbg6Q2q1BRMihoJHHydYCG54ndoqArALmFZT5H732zvhiGWEw4", + "xpub": "xpub6GFfqxoDnbHGU6NKeNK7qJPVuyc1woFYrnJnroFap1Yted3ZzZk6DWPfwhFSZap999EbGKK9GMfdWzRUfpcwxTermfDnBSESBzKykABKr3n", + "identifier": "d84a3bb1ad1fe55bdb0354083d78350fea6afcee", + "depth": 5, + "child_number": 2147483548, + "address": "wMwH3RPiPZLq8sJEEEc3mEKsCmjcmg2zVT", + "bitcoin_address": "1LidtFLMCGUiTrEwteCSM6K7gKpw9ZBx8F", + "secret": "b0165b43487bcc15a2d94bad32b230474085505bad8b2b167ef48e5d254eb323", + "public": "0301d4ade3ce24b56c8fc345a75726cd850f5241f14d9da101a6e775cf1328baae", + "signatures": [ + "f334e7b86b34f04806fc452b7d7d08c1d6d305ba57b2cb496f010c79361c3c6a5e2395fba52d37536ed54bd8961c34ccf7e360f29ebd31e5f7b2272a184bf93800", + "e587edfdbf4354a820b69389cd7ef7d186bf88841e5b4e0b60d9ad6efde72fcf3c14fd3875a11dbaa5bc2546f17e71e1e894ca5a7738751ce9e08ed3f568eeae00", + "2476414593544a27a8f35f085ee9d3b5d4e46113c8fbc073940f9d9b8447ace10771dbb7b76ce54b23d4ddf17198f9a2988e0dfc65779cf6835591f35f7e163300", + "6f5eccac2fcdfbd30a1b840689a2714b1552bb4c993aa5fd612f506d0738f19d33ab4ca117e76f49df9f6c5c6fd7840937158e68abe7f81c00109974c9ba0a7400", + "70b4c97f451c4778a9380ddd7bf38b3a24b7c182714a16e82a48f85192da2406486e4f1822dc072ea7562ab97cadca67db46c59316bf003cd69da6f49c0fdf8100", + "1e5e999c70c8ff1c53ba55a8cd32036a358159d85e2a3d908466c8cbc085f135315ee584eef61c582f9981d57c127e2bbd27402ac326876b343037e09faa171701", + "b284942852365b8224a94b62a8a69155e4ec12951a32ff34d3908211aac9426b67bf2a992c6aad72bf69b5e8986723213797d365a7896dc57a2f59cc215ae06b01", + "4117926fa788fbce489732fd72b1506cbfc122006cd0ed9771c91f07c298c91d65d65f2ec54b7e6ec7540361e01c72f6d470380867c84b9a536888377cbc3cad01", + "033f1ca1040f82a1e6b1563f1c99d65610a8f5961e08a8e0d85fbaa4de9c0f4a3798d0e5240ea7a4ecb102a9f97f69244a60b2f85d646e0c36e5b376829fbf0300", + "db2354b85063d433b3e217123a1657309840803a3576dd29f12273f0d879b5c93684e3ee3987f6d4b226256c8838596747526d71ea0924d251c69b6af34c012f00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3GKSTGKxDj3cs6xzbwxmZQ9NVMWUow4XKK4yVUvvkDdbgJXiwoAWmuqFrwu8vbAjkTAPXuoS2fV2WFwfsr5C4oXKNvDKFdMV5iWwJE4oXi", + "xpub": "xpub6GFfqxoDnbHLqMBS6dUy8hLsvXBztGeutYEfmstYV5kcUUdgGV7R4aEK7BVnriqm5EtcYpxwo8Y78miVKuXfZMwn3GdQyMU4Z8L87hRN867", + "identifier": "153d7869daf97f4f6915d067432100847db105d5", + "depth": 5, + "child_number": 2147483647, + "address": "NwvAhucFatmbHM2DHFF5rfrNkP5WYsBHHR", + "bitcoin_address": "12wJq4jGvuBa2vxEhMJMGAiuhRnzK2RaKT", + "secret": "2abcbb14ca42677698ef70c61339bcc927fa5a80cc01e22cda9751e60ce886a2", + "public": "03fa3aa875333bf2eb35e434091d84c9f7f33cec6b94176805576922178efa5ed5", + "signatures": [ + "c41d747331bd9bee7c64b0943797e0dcf88b24ec32f3fcffc8a6a712067776d014ac7c165b070e81e1c2a98677d2ae19a9f87f4ff0b07fbced37335c6c2960a700", + "b7476c7c2fb04959f50f12c326f6ae8622e0d678f551b99c8a100293833332253da0b84f0fc3eb4035b49672b053b201e9985bbe841c787503a16bde1fe7d08e00", + "f9a6a3ab7fcb39d5cbfbe2533ba1f00e4d2e55e5608b6385a049b37d0e861c4c36ed258440f1d91877de190dd2c82b29cfb5433d5bcfe35c52cbfadfd07975eb00", + "c7e63f0d1d5eb0da8e98fcdfbccfeada38413f77d54c3bd9bfab2c659245b9617cd639fe10c88554edd6333021953a4ecd870af47f1da8451a25fb5d9dba35d801", + "16b0da8cb138a5de0accfb3965e45916425d6f26a6671d0d43c4279c0d3a70534f59d15ddb53369fafa59429d6b6104b0d415ec1db9452bdaa4e312b3879e37d01", + "e0bcdaa49050f1e5e0b3a4d1a8ad25967c4045dd0b4afa51004030adbbb550c97c4595ac891660d66c0ba2fb9a0930b27d0f3749da06cf7ed0265f9cce2991a500", + "7c37b3600186fea7827248a436de54f8f9a25bf877b8d4f09b5b86beab7e84b832dcc9970586b470ba290134bbb3284620e5e69f235271a5231705809e4296da01", + "ee4e94224ab4950aa382539d19f9cce776e6a9c0208619124d9d1ee518510a012d39bc533478d6996179acc7dd71bbc92ba0511a5b209458e91015c4353f759101", + "f6a417945f65af03f0c5f9347c177e8bd88a317b931856b584248a1dead48b377f6439d06eb6d775fc1639032722ed9f3bfb1c5222ff27ecf5a863969a6ac1ef00", + "02ac73e76645b4b3e88a91fbc852f62f5fc56c42fa2fea5bd400596da10e4c5b34bb3dfbac49965028450ae6c78354e86dc8b4bb057c8a77f9dfed773d1253d201" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0003.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0003.golden new file mode 100644 index 00000000..5b733aff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0003.golden @@ -0,0 +1,233 @@ +{ + "seed": "1XoRKDU3iECa8KEMmsWvZgY4/HO8G01OfwCf1HcEKsk=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3HG1Rk1HM9ZWtYnUqVfQmDMVwjnAhN2ybPPBUQZJvtxtR42A4kM55V4a5GdaByvnpLbkJ3EkXUDW8P9fAmeHxjWwtZfzrVmK9Zyu97GJnh", + "xpub": "xpub6GGcQwGu7ihrjNdFas2fmuA63yaGaA5tLpJyyrpAsGRwmDPAhc4bcsoYRMvtS9Gjo3nyKRXPaSYYKResdf52gjyjQTqFBVryjpAmy3fU3de", + "identifier": "cea5662776f130e1273ddedacab4cae680a2a5ad", + "depth": 5, + "child_number": 0, + "address": "Zsm4MpMhjQCuFbq5QD6U6JLP9Kufzkm3Nd", + "bitcoin_address": "1KqeLeLnrX5RgYJasgjzVgx3otpuK14HAA", + "secret": "e546cf8082daad04ec1c86b22d9b651b04aa7ccf44c8e14bb13ff13fa3a00241", + "public": "03bbd3e2a8ded9965b673844465a15737e69873ba0dada2fd97b815e7836f555c8", + "signatures": [ + "829d4f67dfa11ef7f1b7ffc089b38b639c9b54b900ddff38a61ac1f5cde778ce50594aa0490b055c69822e197e40921e97077f777d3d7facaaf5f1de33be4a5d01", + "04d485028852680d888be85847034430a6c94fb38045c248bb2177b2608e20791fdd6ad19370a452c0c96deb3ca68fb0970db3f3fa75584f1291fe20ae2a99e200", + "2634a9fdc9f9d3ce18a848a5a98c576fecaa50f86e942901ea2ccd3c513f6623480ec015e40c203e0fccb5d773347539109f2c7e970a0e6991e6d76dd246e27201", + "a95653bddacddeb94cc8e4ab9e0bd1b39af2fd86203edf76794b48d5af384c4926cb245583072ddd298a63a5c26eb161d8a5d6a2c7475620d926ba3827887a3501", + "85781fcea6cb20723f80d0a4f3ae12efffd7c5e7fcad5004fa8ed606d5afbf8668aa9fcef28d8893b2c5a6964c5957753658112310e4fe8a3e5a9418d39ca50b00", + "a85079b461ac3a825c5b4685a57478232074d3b27e91d3e369e604a78abc67c2359b3d58a18b72daf0cf1b95e410af7f4dd6f5cdfb80f7b0b6557bec5ad8b59200", + "4f4fcd11689bf808ac92aff9729dbf533213dba690cce0ffd8435360d4ff3eb148ed52a89f5819925d3d194e54b5391b4b848c8ffed88393e318a9b65285dce700", + "7547b41d7c4a136a31f19c87fefade0bea559e79334c849f1b310215284dec7f3c93458d78a14fa3413e802f0e603f974fd2fdcc3ae8038c828f1d02b6cbcab300", + "e6f7c824eb6e3705912239064d86f6d3806f01e99eb8a31fd3f341f88e74033324c38d8d24fb3f3e4734e12c13606e6303546880830c812fee95dd4d5045afc701", + "ddde7cb4b8a183dfeb2d248c3d0b6441fc1e4a2216c3118cc5e13691d67e64906f2d9994518b1e1d562b777157ed4b90bdf028d847808f16bf4a541f3ccdf1f300" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3HG1Rk1HM9ZaRhphLMiu3JYQJ7rxCP4z9Nymo5MdzMHw72BKjboD9wjqU6sRDsH5hP1pZ7sSv4Qk9XEmSq7edFCmrWfNRJDsxw422RmHaP", + "xpub": "xpub6GGcQwGu7ihrnunHoMtjGBFGxKxMMf6vMNJaaBUyCKtGouMKsGv3kxGDgjpYySenqxNYcze5e7Vjt6zatxeWeKtu4GuWqTWa4gd1odVMjXb", + "identifier": "6c922284d4273e56733aba1e003edc3977cf23c3", + "depth": 5, + "child_number": 1, + "address": "6NfX1WnVYWYTFjq9PwPobH5pxFTBk68yNP", + "bitcoin_address": "1Au53LyJzrSfR8bAY3z58Kq1mrJPc85z3o", + "secret": "e1286205d53a54247708564bf9266756ac8bc7e706d81883f380725270549d45", + "public": "033bca9524546d0b523f50b7aedb2aae2f2093a04b8047a1a85de361b783d7aee5", + "signatures": [ + "56a8c378982a0e258ad3c6080288b623134648fb537355ef3d7227cbcc55ac8a1b7e340892db93a192060023c2b8ec4dcf96ebbbcb8ba05e4fc3940b7a7bcedb00", + "97e67a191af5a8b2bb429ccf8bee4fab688c8195770692d247f73f0e4c9f51563efa7b81374d2c9c5d347ad8b854af44bc28341a6e919e83e67ea7870e29e63701", + "8f06ba45b391d84872c50548664f02ce62b5bbde1848a9e7db4cb42f8d12aec57271ebecc8f37310f51e6a85eacaab694756837e1fe22620a81efadf6f5c092b01", + "c57f6bc31d00d2d929535c15d5dc0094ff0e4e5ff47b73da8c6202b493f2eedf38b8abda157df2c86165a09603801f6746ecf6e5d372e8c010dc9a510e3b5ca901", + "49c6b418de97da39a52a4b6341e315618b1b8ac01eb10d014a0f1f1c8fc09fc4099e786e739b48b78638a60b46402319ef74c2099b1147725f634a5fd0c5a81d00", + "f1f7bc12b613929688c7aba305f257711871a86af73183c1c2d3e2617897ee713c314e1ce43da65fd7f8b30335eeab6f233a21eb58a870f5c27e9bdf8263d9ae01", + "e2464daf62f399512934674e0621564e5b2d6e64a45a043b6b07b3ca5a2e4f2e060254ee412308f1b3893f7aca3ce7e0dbb2d2d2c8b983814d1ec5bfa7a9646c01", + "fdaabdabc57d93b7667edffcc97a7eff02be96ffc4a0413e94b2fd4698b3b1fd5dd6d35fbebf302902f865fa50141e545da5854a9d599758e3d86ba2374cdbbd01", + "84ad0e4490847d65facafb065cc6e0ab68bf3643f0d65782e03b9c326443f1f5234b776eebe2ca002678f73ef7afe244663ae93268e8009369eeb636637ce8f801", + "62f4e060adb4401a74b93b5d8190f06cd7dd7f214de225ae51e40a983346952d6dbaa204c4a0082841fbd2e33fc5fc58d2a10e4b6714bf006ab28785ccbc3cfd00" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3HG1Rk1HM9ZdshqSaxSRufbDmTw62snFfJngXnY5mtY7QGisVYoq9HJ3VvHuoFinyyYYcJCxx38kurKjYFts5ksrGaN5qdyRD9gmkqumtZ", + "xpub": "xpub6GGcQwGu7ihrrMnJYcVSo3cKmoJRVVbdctEPUvC9e7RWzCbsR2s4NwbmtjykYNZLzTti3kTBUmnHxxdBHBGKnzfgtocK3wdfmHH39yLXCpZ", + "identifier": "7e03f8e18fbcd5df595ca46c83b593454cab67f2", + "depth": 5, + "child_number": 2, + "address": "21UNT58xQRbDoDg4zpBrbZpnnsujPVa2rBW", + "bitcoin_address": "1CVJuAUXxrCcTU9RPYLgAFL5EjQojKQjtw", + "secret": "aff94206a07ddb32a5dd1fe58c357b6b0a067aa0c3a35bc3ef1d4b268fa078be", + "public": "02301f1bd410cbaf1853be67cc73849f8f6968fb4ab6303b83d5073644d43099fc", + "signatures": [ + "67a1bf4f8e3b2ca5f483b65a00871da7e35569fb29adf7365a739638897b25b47686a72a9e8caedacf148b2b5773111153fdbe18133e32b936bde12eeae2c63101", + "4de672dd76d80f03f8ca81eabe24e3da0f34be951741e63eb4602608566054bf6aedccac298c3bc9373eb06c2507ef1e1ab6c62b9dc32a4401b88fd197a27b8701", + "633c30156bce4c7575ab7cb8f19028c2a9eb9e35752ce2a5ca88fdf86aaa705c1710380fd28a0af6a8cead20cb94118a15a6c3560ba9412c2cd8911ad87d91c401", + "24ee87c42c4f10e3f18a95a1a147119062f7a1fa05ae4ef1d33840e7c18f34566e0924def467531e6a41f327af2c9da41e52bc1dffe2db7bf586af19ef594fe700", + "0bdf3ee9088243b7ead7150d350bf4eb8994c5e71418db9b508a3a45aa32618574e5bb915a4e94dcb9ef629a364fb1d7cfb7c33975c844f5d953f50045fd08d501", + "c2c3e56f797dea29f4f383c33b0693d273e7b14bfb1249351abc2bb652c283a46415cb545dad2c94a1643a47695d5f1030c609a8149eb361352774079c719dfe00", + "27234de13b2843ed7fd32c7465efe05c6d653bca99f9f93b2a2de323564c0cba5f97e7cc6db0886d0957e38f6b08dcc7104d66b30f889448cf47a96482cb373a00", + "c7cc3e9066e2e75047a874e320318b2e91112b9da82acec38d088554fefd786a7188ce3b1d8f9d454c99b18db4f26589dfa14ca8ba19bee2fdbf9989e7b18db300", + "675fd4ee49698b8e02f94b7429c8f032cbcb277a3674315f19abbeeb2ad981a9246b2b69d6f44634a12ba1fd485e623ff0ec913fa3ad1c9298aa650dc0f2ab6801", + "a3ebf9a15729c90fc2778bbe0d56c1e6b390d8a1166ec22c5f5b01a861ad8efb61d62feb665d7de0d43412a46525c7313f28c3ea95360eae025da49327847f7b00" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3HG1Rk1HM9ZexcmyDP8ZZMz6PFbsXWwHUiUE7kDwycaTNZLAWmwxhAXjpAkX4untz3rziuR9HnWLPbmyK8cLrYwgDCPjjHf94GbyzrhVxx", + "xpub": "xpub6GGcQwGu7ihrsShF5Ev8vhJieR66GzEnehe52W9qWK9ZLAtUi46CWVV1b53vWqyZ3chATPq6fSt4RFsGFotD8nHVH16GczopscBPaT21t3o", + "identifier": "0e1102e916cc2661c59798eec8f15420fb76eb51", + "depth": 5, + "child_number": 3, + "address": "2gepnUKNxZDyHWgtHjJyNc5i5599L9oRiBy", + "bitcoin_address": "12HNqf4iNCwc7HvpLBTc5pg7vQ1hhGaAXb", + "secret": "bcecf19baa5fa862972ec5b000cdff120773801141cbaa162db70357ac5daff0", + "public": "02a9697d94383ec822644e22f2cd5c80fd923aebf355a738322013718e8b171609", + "signatures": [ + "77a76dd276f05987bcd05aab42ec6819d081cabe5a977be83bc5a95af14a407869c18a4696190618216e9fb1c04c565290d9fbd6f6bb49a4ffef6078646b0c4301", + "7f5ca141ecb66b4ad9f111845b4ee623a7dbf09a8fd42c43f711736ed59aa07b5db8e8d5140f3f583e6b68d958bdef54e8f403c9e91acd6367aa979c47eae8b001", + "675f4e8fecda25404cc11ba957b5c9d9e83ad0469b7152c7d47a6d862834ea624e6f7eb3541d281ba0017cd8ca08b0dcd3d5091bab79410129f1b523912c06a500", + "1e7ac982aae371b27b606c2bbbc406a7148b10849b95e60875e7d944978afa854648d53abad685f595f0f748b7f8ffa360deab67eca95039d29548365d32343e00", + "db4e1e65bb87b291897c6a9dba93b6726057f2c7bce175415c1513762f761db3733f1dfe2c188ea5eb711887c63546d86a6ac24be6f2ccbc1fbb93d6a41f70a601", + "a3451b4f71543cdf13ae68638766bb5c8a7bcbe3d04f48b327ef7d351d41d091595aea38a17396670c6bd69998fbe177f9d03c24a6cd6770e78a154a5dbc8f8900", + "58428b88208450d4e53536823bc755f4cb0977bf8eeccb89af81ed326d2f1f631bcfd172dc2ea130ba30f1ad6afd1604a9495d2f1ec3e56f503bb92fde31da4b00", + "67a59dd5b10b43aabae60ecf7b6a917224429bb2974b390ff6b7c79d4bb6bfe5350cffe7191a09898879124e1568e81c21115aa23d97c4ce282eace242adb0d901", + "7dc46ceb7ed8d5678c8c9ab37e18a1bd55a6e0a8cc285359ada9008b8bda8f8c5cb1f7bdd3972470f4e6d397dadaf3ee9c13a345a2326d2d919cafda49de3e8400", + "ddce48242d9a4bfa9997d0ea7b40fcf1d0a32f39382aa995cd072d2504d931c445bf9afe0993dc3b08eee0c30ea1dc8ca8af6e5ed2c8e3bbf17cac31607fb0d001" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3HG1Rk1HM9ZhX95VjCFwMf5QQ34Pv2PwZ2gRb83j39JeNWBtYsH3zDfbwe6P6AeVYJXCTstQLwByzyyRRkeUWufDjjX4F3zV1mKTrAeQZM", + "xpub": "xpub6GGcQwGu7ihrv1DYbkjGJVboxRsYoNkFJmxHDyXfHNgHXAqLS6BXbnY9TCdRnYVuyNHWZRgfX7SByfN5SYUyYA9n18rDAysgM3MguLrBHd3", + "identifier": "72f333c27cd0b9f5f7409aa1c4946470d43f0b25", + "depth": 5, + "child_number": 4, + "address": "rUY2s56NpcWcjSvhmpRWUqkMotrnu9ChNs", + "bitcoin_address": "1BUoNrTtSG2Q9pYCBmkFTmskrZ9tPNQF5R", + "secret": "21a7731d626de3a01361dfe6901eec68d55c9b01eb6266113ffbaae91faffb83", + "public": "021c21f64bf3ff7ca6bc9dfeda558e7b1c405d962d0ad2adce1ee7904e409cf23a", + "signatures": [ + "93f409f4c9f167abc6cfcf6d8250768fce5609157b4cc4c89f3330fda91548b6087d3b99f8a83a575b3ad106cbc9174a1b513a180c3fb81bda21a29872b7bb3400", + "20eac1bd1f10f462f1022eb1f104fdc3232ea22cfbc80e32c3e819cc9abdbfd3173f951ba8d6a13afda04689a3c8d413f19e35c053ecb015d068199194f6022000", + "152c1082e7d6cd1456b76d86b7bb0edc463e2fa618df704bbfc75ea8bddced1328dd2897ddc2d69a5e566b2b9209083f64041c8e7c1539383230f169a3a8b1e800", + "f4ff2d687c1fcf7928f19d1b467088b8e3f8d7f96acd61066cb65d85809fdeb91f980ee34fcf5ca8032f0deeb75f44140c67de7d1812cf5af406d1108984b82c00", + "619587644cda0d5d3500aecb4b843dc08b5e960b46b5fba2767b5e61d5311c621c93459cf471182b9eb6d86010ff20f96a7e6e9a177d1ce9b24cc3eb7e8c8a8800", + "8000a96f9c8a74516ebe344cde480fd68829c67e800d8b7a95b60eee7f404914528f8e2a06fd55799c1f3d62ef2c80bf3bd5cb7454bdd8ec0649ae04c397b7da01", + "a2d94d6c4932284da4009e9674058814459675672ad91954f122063c6e648de72a97f2d3d7f9b465fd2ff242c4095dff89a28367cbbb28201cc022de68ba744401", + "b6c0b29963a26c10396c5d50037ef720f9c94fa060ad4eb0690a7b0ecef2247e51eb142c1027b57fbfe32ae889b194d7e3ba3f7bb3c92c017214c8cd6b739e7301", + "c9032190015d6754c5b14b2fe6b6e52b8ec6f6789bb9d6c4a35911270b2ca20303ca345388e1257219540aa7b7e9c860a042d30bc1d4fb7ea4b204e95cc1014a00", + "4da899cf992c8640a0fcdb0c69eaab23bffb681e43992b08a72322d00a15951e5fae7bd237ecfa34e8c7b4244a68286eda3ff231a2bba39c70ef97ce8b5e083c00" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3HG1Rk1HM9dwdsK7KsJLDu2uA2uQudfmwarCNNC9NKjnz9VY1vmXWCMEzQ7NRBWKWE8yGcJ1rPzdgs3m4zP5ts3dsZtExNuDpF1egqe2eo", + "xpub": "xpub6GGcQwGu7ihwA7wnDMQJhMqmTBsPpNMX9AWSzkmohhrifnUe5ZF25JWq6GQmuEQrCaMQ3MX4ejaEg7eQd8zB6mymzZFrNf8Hc2aMXx4HPEf", + "identifier": "e62af2fe925ee9090ab9d5ab41a206784206616e", + "depth": 5, + "child_number": 100, + "address": "T61SVfXmvWf1ryJKHAzeNboDH2VpeQ5S4w", + "bitcoin_address": "1Mz1sHSkZX5xJ497Sc8McSoCsugYAipcg5", + "secret": "eec980eab4f84fd49827987477f454dada3080a682bc1879a241794c0981de10", + "public": "036ffb2fc73316bbd53647f36d6b31cec659a3c849b41e9c870c6301f1d8012b74", + "signatures": [ + "ce8dba7ddbbfba68b2e6a65487c681d12c1c1c55f1afacf12e6e22a2430577a10e006beba001d8cc4f216aa0ac61ffb9e72cf6f04af8358b2c5bb2484dbb336100", + "be9a0a06044f58648b5e33b52022b09d6df4b51bd1842845ee860568de91f6fb256fbe74aea2b772622bcfda94b697a229e1ae67788fab052bc55a002f633d8901", + "6d4db7372e50d2d107bd1b6d180686c32a8e4758775ef0692d9077c6d454df926e5452140d4adff1cac58b5e3f600cb28f00be719a092df7d41637e6f033f83601", + "8349e45cec3d7c8b2d9bc088ec9c35b04f17471cfeaaade4d1224595c312c00f398562b39138e826c872a994d4e1cc1d0c4d3d529be24f1fc2e4506981be5efb00", + "69d31516fc617f32beb96e5d615d0dffb557cc6d3e25418f5634e35196761ce62f5246f4a7d720ea1cbec05de0cf8ce7380646cb2c80f545d8b39385ee587d1d00", + "80c696dde879db3bfd5b6f9e0e83e49d2d9b87cec39522b91cc54ae1fd727abd1ea1d73ec7e0fc13a71fff7b16951d8d6dcdceb7977a210b919fb5501e145ed701", + "866aa6bdbbfb094f664298fff9a6b1a43e8b9e2a272c6a6c50a6957829e6066731492a303f8da1c1636a7d4964e372026b6aea807d07562aa82a35f9c6b2d76a01", + "4308d1d3b93055e9771e08e189482f21b87268f792502dc70440eab5d3090b53379be27312b80cff008f0eb45b0959dbaa8bdd87581dfdc226b185749a192c8101", + "d785671fcf457bd03cc16882cecbf4b35498043bca5aa4c7655b52d3bb95d1ed1bc3ab26b262cb4c39742016ac0e43ab0cc4215a2f11535e8c37077e4a3517b000", + "04464f70fd4cc8bb222d839c1c884c08b54fec65d8235454bce27f3a90f44f337199d0a431359beb0c86a079a14641a85096a261ad5d8dbd71888d9eb9e7eed200" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3HG1Rk1HMALXoCekjTTkccCQi58ErroddYBfHvDU9RQWvkSdC6ureLJyufdZswA4cAuX3cYitUvkjZYCALVKLzbVV1fQoSFSszVnzYHCmQ", + "xpub": "xpub6GGcQwGu7iidkHH7rkzU7kYvxjuceKaezrTnTgKq2UxPPj5bAjRAQSenqA6A5QpE2RHu8XWSyyt3LKPKFCt15sw6ZpAmBwMstYW2SwTqWyo", + "identifier": "21a876c593439681f760d65f1d0a179d59e7f414", + "depth": 5, + "child_number": 1024, + "address": "18hnQrUuZG3GeUK9qv3dLx1HBa7GTuEpJm", + "bitcoin_address": "144y7Qqe7SEXvF8f3Vsuh1MwvHeNcGhbne", + "secret": "cd07cce4bcb1341ba633f5e88c09d6222248ce0df899b9c1a251da70cfda8dc2", + "public": "027d0363659a1d88cb0322116b3164d2d26c46b937e6b73f68342859b86844d29e", + "signatures": [ + "0186ad85999705d99ea9f1a6a26807f2338ce93f1459eccc6174f20c4944bc441203ba2026e8a84f49052aa4dbba3c729201c956b73431d4cd7b0d6f9b775e6400", + "b49efae7c8a0e551b3d3207d70e7f506fdb9d594c1f2bba77978702e02ba4fc8135f2dc8e5d6e4985fd7e41776873bd89fb12a0f9c66243f785e578d6966fecc00", + "5e8b64a0362cde44e109f3f94e5794b6ab8a29fe807d09fea95ae8222fdff46f15ec5cc0df900dd5bf425ebd791f8eb697a5fd1d1c34d2ca00319e168393ea9a00", + "4ab02611c1fb5c375ac506cd756930fcbc4d0cc7d7bf9934ea93b96f46504d5e23619d8e9c7884ffdfa814338f5c01b6da9baac2e42633f1981d43a69c3681d601", + "95f1ed4a9fe7dccd3f822ce25a75fb89b9b65e23d4815da88b8f2b2b390f1bbc7b1b7042e44d67e8ec7eb160720052c39d137996fa10f56b30d00682d237103d00", + "b07b4d93b3bfd0033bc009e011d0a5a23b77b37422c0c6d52a73ce8af332d0dd47fe090d07e47dbd7f4ae6ae10876203e72cc4193071caa609fb99be0a82199800", + "3c9c3203b5dbb41f95ff342ff6c0c19ec16eb1411f8a54cce63cf99b9385dd6b25d2b01cda781156d51f1f661969b02998ebb02c5810b76215ebbd62142adfdf01", + "08d1334b5446fab21919a4ee507a1f0a0ac97904e7b4c8d14026830d3e1c560c6d3aee1b21e50c22b8674730d1b2428832f6805257df399e8787c87c7cc942f300", + "d4a8f0e5ede6ab22bce3cd1d69a77da21078c4d5b9a291a08f3623acc0336d503a56a28ccce40ba9aa05ed733663d9c04915ffbf60b2fcb50159ad0b062ff2e401", + "a2fce2e0404e29e9bd3de6655f2c856f87b79e53157e7b97e3c93cfea8d0d801615a379fa4122aa76e1b36fe99eb596f10ac6054f028961ace622e4a2f1504f601" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3HG1Rk9d1gTK8tAC15DX5ZQMTgACFH5QeBVdD37MTuRYWRuhv6WSG8yeyjEYbxELJYqDnVyqbdsZ55i7Y4VgeYdDaLTeRF5RPkYxJpumHv", + "xpub": "xpub6GGcQwH3TPEkXcxdJ2cDtDW8uVWebhzvms76RbSiuoSQRJm4FTQkz4TTWEME5K2RGgNfeJnfeRWnG8VA4n5fE1zW1ddBa5m916stP7BxZSy", + "identifier": "08526f2f29d393761e59b99e17950573a1f49f57", + "depth": 5, + "child_number": 2147483548, + "address": "21rLW32R51FJWixCoykHuwpHxTaT2KH3RvT", + "bitcoin_address": "1m1AAvkcvy1zYJyngpyFcxXzRd1BLwpwH", + "secret": "7d056c93326ed177e0f190542fdb67f6aea105a4d2276bff5480e7e8a3afb619", + "public": "024709e21a7709eabac5f2e1452486689c0d154556830ec85a2b5c33574adcf825", + "signatures": [ + "1dd05061c85e905a614716da2df7e00af9dd0359adabf1b4e3c575938212ef431c3d8042310176da40f8f60a607397568af7f207abb1afa8086d3614c7a860b501", + "c9a31da674df3610a39ece0a0abf756a80b50214e43cc4c960cef1800cb6fbeb140b3a78857082823de9422d376237b12fe4280a23c000c9e147d15aec2aff4901", + "d3266a420a6d93fca467a7ec27dcb0225b4049e5b5e8235b737b0aa5cd8aadef346e0af638a9e00fdc02a30d83b2d49c182ffc3dfbff4ac33fff6766a3a672ec00", + "4a76b9ec17b547e7cfdd6d0ac9fe548f955520e3005be18f5fbe94c30feab3dd0bb518907772175df92fd28619a50f26872caa05625d4ae5a97efe1bc49adaf501", + "0d34b96d9335a1fee114bf475c2cb7690cbc7b9b24180bb95574a30c65a7e5bb2d3d37b25e28e02640cf871b74e10b0340441d6dbada2c92d232bd8e2fdf177901", + "0eda70322b92e8fdeaf61f6e7471172e226867d17661e22aa730e8de9928dc0271fdc343623886fab83174a9b7a9aec6e13d330fa52d6082cf2052b482ca483b00", + "75c35fa2eec7ede43cbb13e3194d0014cbd930bc5b232462b0aea134997526f6738db588cbe26e90425cf31694b52aceee5be17d4640cf213a867bc0a2c3e48c00", + "ce387338299c4db02dea57bedb905ab34c3c0a6a40dc788960e5a9b55ff0c3096805ff4971e8f28094e17b22ff2abe43b3d97f97fb42c4abef6bb35758f9ca1901", + "1c738b6dd5d534fb605ae16516aa5e173db6c70a2028a8bb73318c5fabf868a718cfad2b00e2439ed2920151f69691552858121b25bb8a6ccca73c90c629c7d600", + "a4da2445b4d9671e36e362124e27e7407c9643ff9b64f4363c9ed06afb008f7c39a823e0b45ce89c6c4b02fd741f5bec0b95cebf002c17f81c55fddf0c50c48a01" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3HG1Rk9d1gXfMqpW9Qim32CeSjQ494mo9Kk1LkKjTaEJA18KDnF2NWZkNYeHrHUPGhpbgMEya5VhiVFMW4DoQbrpeXadwcvKUrkAWSe8Uw", + "xpub": "xpub6GGcQwH3TPEpsqvHcAwj8AxwCUZtTbndANFLoj9wHo7DAxLGrm6VaAq3be7CaU6CnTsvz6y7R3c3NmE43XRuiLXAN2S2Ma4ckjkKJPpdrhn", + "identifier": "8a9bb157becf3f1ed64785d9f2636e9686a7af46", + "depth": 5, + "child_number": 2147483647, + "address": "2EFurXRnberywz4Nt8DcSBVLiXr4U35tVgn", + "bitcoin_address": "1DdtmCGDMhFeyqbgugamP9D58vE1kSQHJ4", + "secret": "5911d6dd366407c533af91013e03d5115940b2f30b9455f2bce84733b4874a62", + "public": "029efbacb3e9eef3411de18f2c238184128d9789b7f4dfd63f458ea7a3fee3546f", + "signatures": [ + "a1ed7c759396a0e771c044b90d90321a4bdfcd2fd165c1c971ffb6b53ebb20ff56d0361b992d1e3920c91e86c0aed16bf9d0e9e8417cc38f687b3c27f3eed98c00", + "46fbcd4fc661f1aaa48ed437e5d82328e78cf3bb5a35da30751f80f9496922534b17c3a1da25837fb39c6880f4a8072f0c94e6cb4cdca63884c36df72d3ede5701", + "d6deeb403063239753ef1571d84c1509f1a2dc395cd25626b0f76c0e7ec8aa1a07435eaec91fe91382116b293939592c42d546d30fcd02b7261d55b985588aaf00", + "2ec0a91ab5d1b85bff432f3d8a35308e8860f29cdd48306d1053a09e4f4d00467e0f578fc878a1e6056e4b1871b919ee6e1806df12a0b93eda867379283ae17600", + "bda18ce37b6a766d78e83ed9bf92308c1a3ef8b71edce6e788c7c068fc7d5dfd48f6669b1a9577e660484aa11e72406757fb493e6ed7e9b76bfaf07d7b64054001", + "4f51cffb686da7648f0210001911d037eee4313863bf92a048970bcc4c5d7d645add26d0f7b1dfbcef45967fecc4b1271c3bb984fae42f0e38a736b0e017c29c01", + "b31dd7d3b87aed4987aabcf1c62d42e1d48c65201a7cb76b740204c0401b63de47b8ca9d6024e262b317a7f5746af29f15942ddc17b829237471eb731a07f1c600", + "04d1f4d00420251339a35526b748f66b6f49263a6f0b2c39c43ec20a9d0de08714463f6616e2aca684eac5586aa7094082f3c5b5624c725a0a41f316c312ba8800", + "5e5c9fa694896e062820239bb351d56e49b1fe365bcad7cde4cfdd5c8bb5bf9734f89b95350a1591c0b0ef346fd66ebbc7d1ebfa33a2ea032e30b7f038577dcb01", + "f56b6b1ea2f2ad50aaccb10c08a268d9ed396c6da304234b485e91f7d29b6ed817284a4e56270a5cd57996f9d1add98f4a44783a07edf7184d0c1f8bcb6cd06b01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0004.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0004.golden new file mode 100644 index 00000000..6f2d3224 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0004.golden @@ -0,0 +1,233 @@ +{ + "seed": "yN00njU366Rfp4BBJlOxm/L1RRWyAjH2/T7fMsKN1Y976eqBVk/edfnU3RjJyUmbyl6wO8vQTiBqHvlz8DmMsw==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3H8E2onTKbNgq3mJmNXDyPPe1qVEMWXkjQZZPjrQnNRBUSHrVSqhXsHTbEvAgsGwH7w6PkeosZzp7tSvccg9uyfyPoJ1RRYdmo3fWcQjU4", + "xpub": "xpub6GGUdYLgHh9fuK8EQnuXb7L8C3fydpEP7xLAMn9Ty7uQ4GmSQ2m6FLBmJtGvwtzGVQjA7rH4uLfLfb934yDzvXDUtk7BXTK2b5emGuiNakc", + "identifier": "eced16c4be0a13005a427373adb7b4404180dfb1", + "depth": 5, + "child_number": 0, + "address": "rZdYrnbTwaQoAKJEAb7B8ydnUt7qBpmN3N", + "bitcoin_address": "1NbkVW1zNduqkUpind4zmgVGVQRjSzpCCm", + "secret": "3017cd3a9e7e4486a145246d066699de42cdcfc69e1cff986752d7fb8abd6e9a", + "public": "03380be49544108f74d246a6bfd3ae706aaaa91dde6414bb99fd61853c01173a55", + "signatures": [ + "77ea332da724a53e188d35b3e7b58b6cd95e4c024c37984f3d2d7fc9fe0127da22e4c62724f358fd0059d0217c251926df17ccaf76d40241ed0ffa3c37ae11dd01", + "97f0eee4822064667dca3907217bccfd66a91ae5b96c30fb921c6a8f9fd2e3667b0d500ab81b9ecd3283072b85a3c0a9bddb5b7738ab00b857567eb726339b7900", + "9b5575938ce6c2903d8760cbbff8e03ed2855ee352ddab5e8a457f9afdfa9733367fe803d9fa91e72aec39a81dfde337073b7f0476bdebfb7d6c3fafb3c21b0a00", + "968e3995c811b6d24c23501766af99582135a38a1183d7810455c6e5cfc24be416148486c6ae9a7dbfd67dd924c74ab53ac83bbd20ae60342058c8f2f8d069ac00", + "0449dfbf7ec5dad030876a644b8b2ea545ce2f22c35b92c56cb05cb3d7024e695b950a944930abdbc78489367cdb19a53292cd4ffe8331e10082b83a7a30b68601", + "f8abbb910395545b73a302288e34fdd3022e406fdc03cc0861ea67e81cd3358001c161f2a947a4af8432ea227beeacb03d3195e88c679f29d0a11acb497502b700", + "7f66de636702080805cd5ef5bd6494da674a8f1d7aac2c3b5d60732fce3aa60948466502fd2e68f4b754785d06fc9d354b3be585e5900be171fbe67ba5bf91c201", + "90c997d87c56531cd9a32949b2d0f45f5e672bcdb3981d0792221c55ff3d77705f26a514b5822980bd9c662a29082e768b2b95f0396fc5d8daee55b6141c453901", + "22c146febeef4d63018296d2af2f9449f06f1b98776ff160d2677977906508040df5a18699a7ecba241d852dbdc86f148413a44d049359df898b27a91ce3289901", + "e0b9d3114367922cc3116a1d528eb58fb4b6b927e44fe459de23041ad4271cdc60ed464ca28d3362449d426d5c48fcc3402cfc50f8f309275c3bfa2c6ce5ead100" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3H8E2onTKbNibZ95qntRo6YaBrtLpcrceYYDnfgnYjcc6bkan6hMxtLxchJjjnmWmzRxyHH4g17gPkBnNVqA6o1e79vrANCMqTU2k635Q5", + "xpub": "xpub6GGUdYLgHh9fw5dcBsKtnw3H8DhNkHLhysU92B5JLtGbUtvu8KQwumCpovSBdhkxzk5bF9zMTiBnyPF2quzq6Z4QDgJ91TmrLhwYHJmF4EK", + "identifier": "f59ea80827de513e69b9290033077f905365b289", + "depth": 5, + "child_number": 1, + "address": "2bWfaHaKvvRrZ5d98q89vHwE3E8kiViogmo", + "bitcoin_address": "1PPicdvYcSFY8r9nw98CdLabVyLn51usa8", + "secret": "6458c6f8e0d4a0195e16e9ec936d3048c27e8e0fc8a9e00fdcfd7197852c1c46", + "public": "03c9164fb890d0f72c7d39aaba806d4d7286f8a3bc11a66bd8bc0263cd6f865f3d", + "signatures": [ + "1b9b8984338aa1129e6c11e16e6d8c5bdfb117cfbda95fe61e7635e382d8a51c7c521b7ebb1523a94085c9a26b3e5de17577c9af7e35c5a6f6c33cc366383e8901", + "4e5d740a57374bc1c8ae883b22a0c0ec0848dc495a48f80007fd45acc39bc642770376e3f87444e20c0d296623558c62251b993a75114ec874664076fc82122900", + "531276b4715a6e95e3dcc938e28da1919dfc16a4c77c23c3ebc19e5df2ac505f55dfccc3caeb13c4049b9ad2c43598357d1700452baee869db448d31a98218a901", + "c0326a57a5f973a4d1cf46ed6f07fca45da774f6bde4f98842341adb58287b1c04de5a0cfdbc1c55754d269f62e04c97027a7b44fcc640f0ea6dbbeb9f94116001", + "2c5f4f0ebfe105ec94ec20b91547b6af449280b5d3d524d970aa650a862a454b0d477fb572f687f76d3fd302fcbd34faa8398b447b97433e7df3f028d208884d00", + "239450538c8cea088e6f4f5f4797a5ace926e3fa5afed7ce66d2df3dba4ca16920b74603bb87441b06d5782b71eb8c8743eeb79c0dcbebcdb478bdf203be878200", + "3a9e6f9b943cd2f2bf988384a7a02caa991422fa3fda02943aefcf4626ee1fc51aa346cc26eff681b46fb4942aa39800cc0d5bc5162b481a7faeb6eca26d72a601", + "4dd1c3aa9277c92681be5836315a56fd04e2aabb64d23a68daabdb33342b0a5253379f5d4ffefe7450d69f168bb45d630cc64c49d2f60438386d8c2613bf653900", + "8fc92a9d7e2e68abbfcf1a80928ce00bb658e0a08af0e6db282288a7c56449b049a9f40f0ed28b43e9b028f9cec4e9b534eb83d28692293ad1fffe386eac921101", + "373ab76dc7d70e43c8bddbbcb27edb9368275c477f42c0374548092b7dd3ee307498ff1f868c89865dcbde5903737758ac3d8079e652981ca0bbc75a7563fb3601" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3H8E2onTKbNoFqjcEBrDFikE9VUXxNpz12Qs7jqR8p5xxVTpZuG9jBmYrfUphVLHnVk8FQd6hR98VVMBXawdNEW6Sfz9NiPdwfvbJ6gBUK", + "xpub": "xpub6GGUdYLgHh9g1jvCiFiraPfUnBKxwR6gMDx1fW9SyUM4qkpcN7DWhXWFQAexbkLRdS1hR8xZfc6pPJ3177CG3KrKXiXLjSafD2FVXHT53nH", + "identifier": "7477770880b9d65c0c4fae4d3235eb81dec87aee", + "depth": 5, + "child_number": 2, + "address": "ccZYserQ5WMSn6GUNqegzgUo8WxdjoYdfw", + "bitcoin_address": "1BcpVpodSJCoTLTu5DMNrzVxU9x13o192P", + "secret": "31cee729e603ef41d255d7766b0c624e55fea78f2bd7ca7696c953b6e0c15299", + "public": "03b7b3ecb0de83d9de036036767d1d389d726f9d845fdc0682e573131a924a0ed7", + "signatures": [ + "6107f8da9a5eed76dabb8a0acff73d14639fa1d5b2d09e75bdf8ae66d8a80a2635d3fb382c8250dd8e6048280fb07249285f36e7786448e866b4a4f0e946c0fb01", + "9a611c8912b10361687f811ed57fb2302cc175351234940591fd0571167bfa446e2ac49ef533216955a462fe9517d208d6fc826fe8a4ad4d33cc0de079d9f3b401", + "f07a9f8988b8fb7067263be316c60e60ec0633e8579aa4e6c4deb98b517116e91f281a48806569dad965d6badb102761fdf79053537796d824135f4aa1cfcd3001", + "af538c9af06edad1c5b900afc6d62e719ccfc3b8d6089d4ac353c8ed6d157a87182ce5c31abda72b716da930c647b9dbe87d645fc77ffadf9f81b99c11fd167600", + "0f1eff95fea2a4dbf9df50e7f77014421ef9a2cf097026f9c632b5c5219733d37c2ac602aace55f55c25ee4eb23488a47fefe10fb96f471b71522c4c4c9af56f01", + "dce2b3a015b8fb3c18945d551a9281271e7d0a3fd71a21ef89813d19a2b29b622a21157d21c995bd15dd93393b8a6183e11dd6387e06912293d445e0951a090a01", + "f7754a723dd96687579579a71a154991a76618845cc1c32c4977b46f694351b212c53840dfc63eae27dd7ef92e2981a6a02658316eeeb3efc4823a47eb03dea200", + "9c5c29c6c7c8dace214e20880634a85062897cfdd4d688e1646d5cf97ba3b5f0706fef031ea993ef9170eb4da4d89c6e29fb158070cdc4d4a54698eb82637f8d00", + "bc3b509251732baf67281353d7acd5d77ad3d28bdf09e75c3e07ab11417efab56057b0fe4c36b11d0ad2dd41113ea0c4b09203d6b41e076009592acabdb5357300", + "483668320bb682fc89bdafcf5bc7f4060d5b76ba9dbf8749d5ee48c64fad6ce75744ffc7438f3890bbb4754607318102cd9552860d3ec1760949f739f0b0001001" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3H8E2onTKbNoRg5hHYVhhByazZU2nhUeGwixM14t8N2ianbpas7bkV8mNK9Gw224Gk9MtNyaZfer2w6ZRHsZUFZbBbNXXfdaAbN3JdnQcZ", + "xpub": "xpub6GGUdYLgHh9g1ukYoK5W4q8i92PxSFRL1VsKkjQgSTu1bP7kN8BN9Yocccy6MNf1Bm9tMpGJT2p23DFyi5YszMxhLzeJjSmFvD1t5M7AfL4", + "identifier": "18cf54c891fe9bbf22fa8fb87e496db343fe1886", + "depth": 5, + "child_number": 3, + "address": "26AkGJMepC1VPi4zCYsT4CPweUJAUyhnUDA", + "bitcoin_address": "13GBbEBSuYRdyRoDSmmanoMpNPtAneEDBp", + "secret": "a0aeac879d0569673e6e4bf5b73478da5e55eb3daf906262e376d0cc41b6d2ee", + "public": "026f251be2e0f62df164d592330e7ca5e498aec2847fb988059a1e0d861c3a42f7", + "signatures": [ + "d290e8dba6d5226f0a2028366857fe86203a05d568c41dcd4c204a38e49a12e75ac94d6a764b9baeb689f70fc794f1f057bb8d8b3cfc692eb54dfd02d628b70400", + "805c56a71746661734b4aef4555d8328db144daa2ecd722d7be3c7f011712a557ac158a2ff1934db9c2dde6cb446d2b0296ae40f371a89049d431ed4d679a48a00", + "2f8d3785dbbc165980fd2f4e1c9c690bcc4482087f2de9ccd705b32caaecdbdd725da8ef2f73e1974c58e20841ba375c9e1275e6938b91a004f111fc7b0628d501", + "8c3bb5c5bf65c6edf5e61f9ae5cb9210ef9f77600ac6c1826b75f5ebc45bb3ff5cc780335143226707382f43427134d86beb1a4d0cb8cc38b21f1cb83f3a026f01", + "fdee79ec8b80406e907ad81a2ed35b19205c4cf68ab8042ce878b192dee8beae52e63fc17e5361b67b6fa7c621bd844a75d3b8263bb0bd71c5faefe1dd79a04c01", + "d5bf09640e6bbfb1ccf40394bd673c1353118e99a5bce5490e6101805a180d6f77a9b643c65d9232efa9e5aeecde195f60308fe98722d34461b43b0f00ab9f6400", + "e1e5332801edc4b22d0a888c2988a137a162d82c4be137a2c109f8b4902e2960021ac9c352b345532f2b345f0be8c319ae5d7e32c2c922e412cfcaa1e2ff7d2401", + "cd9b2179f760bdf63923925fb1fe659df1f4d3e39c0f6d244442bcd55c9fc90c03b0883ee50c37be9e4f7ee325e6df15ba00f4a560de85d5dc2fb0443a80f66901", + "1f808b09cfeaf6921f01b5ab13ec3fca9f1fc5afbaf8849fe8aca747f19f277267c67d575270f717919142c3e41a6657e02861afd0e303790047c603d841e9ce01", + "f1d5848e1cd42fc0cb9968352beea6f2fc44d5f3b4bfa90c72673930881c8fa945c045fe764e287c78d52fc8876dd228584df076c568db7a82138181265e7b4500" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3H8E2onTKbNqvJYZQnV4aNyPwvfp1dgwRwLQMMrRkgc8KWz2JC9LBGJa44Esg55T65smoVTLfpne7SrfVaqGsPBfD1bKQCy61fKJsjDYYP", + "xpub": "xpub6GGUdYLgHh9g4QP1fSKVRiKhwymADUMYJerwCjmTz6Db17r8ZqWPsyanRKCFGiC3nm4KnTj4SbSK6xKefq6Qcw1X5RjQhzrYfWGag8qPDNC", + "identifier": "79c3af23df9135c536423b715d23f22a57f9c571", + "depth": 5, + "child_number": 4, + "address": "vJEKjqa6dPAA2ybrLUJLVhQWtVQw8mvct1", + "bitcoin_address": "1C6qBasTzmB66WiJ5EFAtZEiSabXvsdcaZ", + "secret": "cd1f9b1813e7024017bbcc0f52d42db226bb8a09192c9763e71a9d1b3179e4db", + "public": "02db4b24121f9abe795421e4e20f2072112f041d5dc69a1c861e8435002167643b", + "signatures": [ + "5476dd869bd9d70c0802a35958298959a6be3e67a4fe10d0fb9439bff930d5931418dd67a1d00eb74303196511b0b6967777a21439de48d61c93442ffd3ceb8901", + "34f9111316f5c86d84cf96c1a2f6bb09f80369a771ba64bde0e24e6931003ed24acf3339e3caddd8643b345957bec5c52b2d56b1c18ce042685e6302c3876eb101", + "bbe837341e658d8dbd89058eba0918ba9730472309284620c685eccc3e4a06a121d733e6dd75c5345a378cddf7506676cc3148137b27a14be4d95961b6522d7e01", + "65af658239de38fd2ed7d2c81b6423fcb99a0b09b7c1459b56ed1e78fcee957706b6c8716ebc886b3936b11fe4ffa2a694e4724ba4298a0769eb0c2bab133b5b01", + "92d5a48ada4a71bea215af4fc04d8771dfe3f5c65f26d4589cc4c278f7de6cad7ff61e2764f115d5ae8b9832122003d01db7387e871258d35eade1cdd2d8d5cc01", + "3d7908f28db6f8931c7674a111177e8fd5cc6bea29bbff747f77f76249826ae5526d226b4fb3e529d513333a7885aaf3e4c933e50eb6cdee27afab4b40df109600", + "d56e3a6c800c49a6f27ee5c432cb2d30212eb6e99b5ac68ae6684f1fe70bffa205de2b76b6bf6eefb887db3905aedfeba29b81f29a454a8f0e082b2510f830ec00", + "96d2a6ca6b1cf082cd38cea755d9b41565ce85cb8e19cf54c434ba76e1fb9ccb1d5a5aabda3d3fbe2c4160a5aa0897f12ad11e6f7137b29703f3ed1ef7a3d80101", + "51f0fad103339b6e0a59fc04265776a08cf23ea151d00f2db6f5ab92f53a14cf5ffcb369a7acadd032e6e5ee5401f2d2bc5e3a824dfc8c10a9fcd96e90c1650f00", + "e012535618dc9106cf2697934cbc7c41a69a9ddd008324ca58526d6aaf4d19f32abaa781a4064abc9721b93756d0b8db4a706e5ffa8fe87a7a61a330c8d0f52e00" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3H8E2onTKbT4pJjkSdHhx6YkToh7VgDu6Wg6HouEBmmKRwNYVQo3NgsMn53zWBLgJpscuJYV8H9c1um2qk4sTCngYS2HXmuTUjLg9ZEick", + "xpub": "xpub6GGUdYLgHh9kHJPCrUAJ563HJVeBWxQ5GKSGtgDWnXJkCEGX62j3bB1MD3zrd7jKoi7sAMYQ7yJ8HYM8boSoYuwvHEyMakW8pzxgpFiKiVu", + "identifier": "828583dfbc73d1f6579f06ab8e1c431c5506890b", + "depth": 5, + "child_number": 100, + "address": "2PvHdUC8bwwqrtuh7KckjZf2mjRUEvafCkw", + "bitcoin_address": "1Cu8njTUP61rp1ZGaoksrqAyFGMXavRnFV", + "secret": "4539d0bfb4b1d670d546b208909ef296f1ad4c1babf0f789e3856e7f71c1c9b4", + "public": "02bb6247c30d794a106e115700d92e8fa32ca8d00d8366ca3de555fd92f086f3ca", + "signatures": [ + "a9769b3b597c9fb5629d2e333bd95454f36b41d6f8c75726b8e22f5ea3b44acd228a78978ad0def49e7595ed5d6d2d4225d5d45e4a3508d0865583fb8c7ca8ea01", + "f593b9130a90e0970177b8c270561184dedd893ba9216847d68462ecdfcc4e001b1c4f6189a46a3456e4b2bdcccb633acba21e03346f245010cda9edb2a933e801", + "a5e07f63e8f02a19c7ed582cb8b008cdbef19c36cf0c229f53e5a15bee40127502a5986a15df1893b71450f8b1a2e5677bada96c6f6b9de561e90090c1cc3fbc01", + "1dcc43e91a90906fd55e44accaf562879313003745a1371e22a2bac9398f147431dd99a53b1d40493304212d1fd8228d477bba921f0d1eb4cdb532dcd0b8d14d00", + "77695f5854cce2b751457f76dccd337b68736de4dbf2dc1107cabad25e60b636790b7d14fe2fb57732abe80149473d728341a5d6a48a2dc5a84b59fd45f3120000", + "b4541e87bfda0eb1731c6bb5c6be9f0aeb15eb46cec6398975013824509e6bce74729e30103140ec3f78ebc6668a18a7f3b0de4030fc395ad22c551785d0e80b01", + "09f0dc662f0766782024dc5f899b837d81502adde7ca48f6ebc91e879ad446ac721bf1cbe94f1737a2cc4c47cc84d9ce48b3973cef438fad1f09aa6eeff8ae8700", + "e0f1cc9fb59a807616770e058ce2a994c29c47f709c04b98a451f90caaa016fb10da3be1673c05e255163d43c4e548d976863f2703b2999b2366014320ff3dee00", + "fe478bacc3f5445656580e40d5017fe2bbf851182d7a24231e5aea1d732d91bf6981591cb048457764396efbaa377ebc86f7f699b2e224137fd642e665bc374001", + "c5a24c112059112d7c507ebc59a916dbd76fcd8756ea63ab19dcd566fd4656b97ed1b3297fa2b151ed9eb5737b0b650ca1cd7f080aa1d9b82219db3ed2523e6801" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3H8E2onTKc9fbs4L7pUJRLp1KsMCa4LwT39ewAfofTijLtBhcardCpUmPB8cQ6Awt9KhbVrZj9mHyXs5hjVbySknvaLc4KmgcUy9Jrc2V3", + "xpub": "xpub6GGUdYLgHhASt5wXS9MUfZHYZMhqc2nCJfxkTKaHMzzhc9DLF9u7B18xcfNqjdHGKeRGxzdiQg847b3Ygo5MgNwZSRkF1vDcaX35KGqHnRh", + "identifier": "bc232161b0bfd5767544aefed783bd99cbe97170", + "depth": 5, + "child_number": 1024, + "address": "YZ8GTjPy4ikHdzhtkx8hJngeurqnhquKdE", + "bitcoin_address": "1J9n7y5cAhgtbiShjUr9HNpfnrMF9xs4f4", + "secret": "301daba6477b25fb5677b96226f9140d5b8d76e9f6f6279b764788ca441f875f", + "public": "02ca636aa2cc9197e60082a0a463e2e58e6d22ee388de19e3706b9e87adc065589", + "signatures": [ + "aab180bffea668527bcbd2795beed17b89dcd2546e45118d55e00ae5d9d755890cefbdfc069289c172ce3c16aad8bba25e9fbccdd62e62c9811928e2e5b7acbd01", + "929afd9841757d7c16b623600380630ff3696064d1f1dac892e819490017a4397c5aa4fc83274c9dbf54e83c3cb6848beffd1b3a7f8b5567b6c0b44e4eb2e56401", + "3c49fe6b08e5835ce356142f97c207603e07eba05c701d31b819468059a81dac5a1bbbf54b20c9e49ff4d7b9f2bd86437aa7268dc4ca73e893b1d1d1eadeb0b000", + "43175c9a810106cc3bdc6eb19b48a6246742b3fe0298a51c8e41811cf6a65f9f270368686e41e1c0f491690ec38eaa6da82baeec51c20775c57a3aa0702ed58b00", + "03c12b9b7ecb79d813018b926445c5f8233e54ef7fe03d8333141d86eebf3fcb71b1812d265b2657b624c97bc7cd31d85fd6d69123f98f32c21586ab9e1cf61d00", + "58b56563fc2c1c4bfdf1d79f78d394e4654280c7ada195370e2312f3400b60524ce31ad2258d5ce0389f95c2e4572ba9e338af0d0b0d4daa126d7c1d7aa9d3ce00", + "12dc315f4338b21c7288506071b5627e25c818408cf01a7879d49e8b2b8938445f68ccc6a1f75e04eb38f9e47df3ce3898d84b2e5331f20925b1e5c745d8115200", + "d4fa3f1caec18c23739a118db9b93d54795937bf0057aebf4e3ac04623ca9fa817c2fb378068d5c6e201f6f3cf69213536d5e821a713c896d367e29193766fd700", + "f822586097d506c6989340121cf5dd2febee6372dab7b09239b5d108511e68b6405effe886ad02369724c5a3ea8a8af16599985868b51d971e0a2ae62a7b367d00", + "3576fa9ef63edcf4fe96f21c70776a7bbdf5734b7ff56b2d950832982c17d1f07397aa07a3a728b51358419b3a02e2ceeaf504ef7a78f1e4913c7e41cb5e0dd300" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3H8E2ovnz8GVZko4C5TgCnAZNZ8VnSnHjqb9eBb5ttghhvWGf9RwDrC27w1rYChSrG99ZMAyUnaw5JfzSJvzUnSwPLj6ayaAwHvFvPTQ3u", + "xpub": "xpub6GGUdYLpdMgZi3qGADcU3Liu7QPcuFAdexmBx2bCeERfaWFepCTgV2AfsNsYA7KAmhCLct6yiNMWWE7vaE8tcq1bz3gw3brdAYqvA57bbDz", + "identifier": "ce0b9aab84a3a7c4d5c75811082444ff2a2732f7", + "depth": 5, + "child_number": 2147483548, + "address": "2cuLhdgZgr6AXhmyF6yYzKyVaWJRFcW2Azp", + "bitcoin_address": "1KnU6noEE4QwhjJAHfDpXXDruHpp2oT4WT", + "secret": "be4b0cc6786bdf2b527154a7a757cef672e048c932dd31fbf3341b5342ffe9d9", + "public": "02b262f350379dec955204ee0a19b0724cd7f42b621df634df7acb03ea1ff68c39", + "signatures": [ + "9029e98931e0d792b9bf652c33ef73959483f16d6823203df5f53c88f59f23014d8d51b6c28036805b571685e4ed9325e43fc82d25d2a114f7bf7442d223ac0601", + "d3f26186ba18177d938688cd5317c41ca5d86fc3510eb3e98c2acdc4b89af13d28965a17ef527fbe5045933d310b5041233ba2eec4aaeb475cc2d00e08398cc700", + "c658bb4c4a19460785f4b19e255f65765eb765fa655e538c6cddd5c43e7b02ee698a1118a4f3b2f60207d7a74642958899fcbe99c4e2cb70b26556866effc55f00", + "b19891f3d3b9a49fa12a10bfd736e36a532854e1d9d1bbffd3b03f89ccfd267e4fe66534b79fb70a3fdbcdb4dcf2afb59de3751ff89c0b4708d7922d714b747600", + "dc297f41a9fc48bde978701b4ad32e16aa9e9a6df1d57a00c6cb3eebfb514e434e5f9b50cf9f883f8db473da8e7ba404972f6812537a4b7374a18cce17e5c63901", + "8fad34248773028e4c7a8691604b8a5143dc7c85349b6cd2199be6ef03aa85fc13c35208b3b32eab38cf20ddfa58b518390b4baf666c56e6f87fe043e196388801", + "0973530251e80b26d0a87c2b26440843577e1608a11943f1bc346c2082825daa1f80d8166ea80df3b16fe731050287732dd0cbb9e3fa62e0d37b479f7961e32201", + "b45ce2dd43e3f44494c8e5abd3e227ba206d7b7e2b403fa60846e228eee5aa4d0901d42ad275b1080d8fe9faa6f439a8b3404ea8b0e67e1dbdc016c42e6f6a7d00", + "22841f49aa6a93d29eae4d515f582cebc724aa879e085cd3881973106f3d60734641c9319acf15468a97f7f8401e84e4b1ab701a9c80854e4dd48681c258689c01", + "d2bc23ea22a36bbc9171f775f297f6504cd446bb71f1d326a43c7b9fc293508f6ba8f789ee63482c86e4da1429500744fde5f4385ebf22cafbf456e23237de0a00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3H8E2ovnz8LoiYnk1KjoapodW4awePogXF5XYXzT47zeqPiMKWyw4UKuQ6QoynTHkK18jjajz2QXEDm12VvXukKTBjXtpdDdgWmFFTQyKP", + "xpub": "xpub6GGUdYLpdMge2CdFr2rkAimYBXu5M77f3kAgKvwc1PeyXdirtrqEUrnokeuudRn1AMEc5eKH3UmrzQvVaP9pqprvhyNrdhVFaiE9TyQWBNH", + "identifier": "ca6a69e5f6f70b1b01bebc7d0f6c9d8b43e88010", + "depth": 5, + "child_number": 2147483647, + "address": "GM1wxtJF8XjgvPtadxLSVgUSAwctNnwavf", + "bitcoin_address": "1KTGyW3nE12gNvkLykGCpYXwboA2CUQ3Qz", + "secret": "91438db682c4df6e6ee82b77c46a556431ed0a2a9e47856a135fb971e0d38972", + "public": "0275679e0ccfdce20d19fcf71147a62b1646d661e95a63252613bd77b453c0e2cb", + "signatures": [ + "28097b88f1ab09c58c3499b5839b3bb0833c6fabdfbcce656ecfc2d8310a42cb6a4ba14137c98c0740061f522bd687f9de861c56bf993ece6c1752dda5bc336200", + "5f64fecf7d721b06c294915c14a81eb5165b819b0fcf41ca884749c67e3ba5484eb549437927e26f3e8921f3a9c6e5c6c327dd43da11bde202a4e08ca335547300", + "aaa6c1e0b62cc58d098efea18bbc6cb6b3d40640dedfc1e568bd0ea9ec7dcea432fdd7241a8b5414ad54fa350df478b47433d0cbaf3dec689219b06c35cd49f701", + "1ed0cf9549e60cd55e8ea0d28b355003d02f9ff00e7635d87c690165e80528b83d6e469c78bb152af49235efd290a0a25ebdb3d20fe114a6520224fb4fe7146801", + "0f0e81e9074fe1513e36bb3c2b0250e5c63b06097b483cab0535499dd78ad02225b91454f3d4b5f140ec6be8e333f0a446a1f25fb232fd4479d389781a3aec8501", + "5fc8088c87bdb5b124a25feb2429dfa959c64de695b7c409d896ae811e342e610e4addcc8d9610ec974f9572978d30352fe43cf3262a944b65893a3f87d83ba301", + "f2c1d93416b369a41cf4ba6bd2ab725c23df7b3f8e6605367150e21c6a2eb8485479e1a9acbba85922de3f07f480792a1bda9f39d68b702afbce109041425ce400", + "70d2cb7e2d68e1e59a574cb197125a501f7b926b3d0ec445b2c0968937aa33c819bf15e2c3a0f2aab0b0e50389a4bbc229590c41e78229fdad0034449f46f93601", + "5c57ec8c25e36579dc86a0cbee7b85aa0d5341b9bf40f165c70a83d5895d045236eee7238254c4e76f115c88f8e4d5b2303a4dee84f967f8340a21b2f60aa21301", + "99e170f935c8caa31e5f23c7169f57dd0ad72a521013cda7b07b423211a2c278088f31855007c00d15b63b104d4230db14e2192053bfca914482c2b47342436500" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0005.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0005.golden new file mode 100644 index 00000000..9c6bc4c6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0005.golden @@ -0,0 +1,233 @@ +{ + "seed": "7TvpJyVd5yv09z4mtMYiPR87CI2RHnon1/I8CUUITkbB82Xu1l/s2n/NoEOWYIm9dWi35JHsPcg8G0cAVXbyYA==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3GNj7biiqkjuejHkuASAcx8owhTNyE6idL5bYHnHeyS8g7u3XZRmFJKeJXgXkNYpJLDSYgkhXmUdZ5pKvuStDyy9PtoTrNm97BP5ww1f9H", + "xpub": "xpub6GFj8d8cZDK388okrvhSXktsMyXwnRwx5rFgPvhPqzWR1UT3b4sgK3coVZQdVUt8kWJxnsbMcYn4npJB9jJGZ9hS42aGPVZJPHTegDfhSX5", + "identifier": "fdd8540db0649709b16245c1130cd1e2b9bd4ca2", + "depth": 5, + "child_number": 0, + "address": "2YaKbueByqMefgp9sFHjcSPw8KQ9kP52uro", + "bitcoin_address": "1Q9D7Hn1NCBBYw7x2Ba1u6z2Jj3eUKEm1L", + "secret": "314db696368f4c796cc13fcbbff9cbb9260a70504c198e5eea89ecbc189deb5c", + "public": "021d479ebb78bbd2f914cef1423cd0762858fa0a02c1b5601d8fb43a14bfd23250", + "signatures": [ + "d7e060e06784b2004a6483069d4bb42c642446b680e479f64c3580eb1ce9a0770fbd765c4bf090a4ad45cfd0203a1676522a686a3755c3434c7d448bf336dc8201", + "1571af34e69eaa01d35d9e7a51e0c2f87e8afa58135ca8f2a83cddb49d29405628324d29539fbe91945440ba93646e0c39a149f8c7832c11e6764920303a599500", + "fa7a4ebac940c21dd7d494f9a76ec15f69031545b7b62c9d6198b05df700b85b5431245b48498a99fc24ab4fb5a83b920a391909637c7ec078074b95d122838c00", + "c4f6d7a79a3d7122b3155c17bfb626cb273e85a3547c4443a0766d05396616e85188e7a661a14f1982a3208e50ef1f77b4a437f67794bc01f0990372a9f4bdb000", + "30d641bebfc34447dccc1c248dc32d0fd05a83d193afe93987a0f85284991e4c0c0324b8fd5dd68e080986dc7cb37713c051eafcb6de9bf5d2b18be78e2e55f001", + "9d5c0d8e714ed26ca015263c3b186fc2ee3be6be5453801a0e3cb46764c21b5b254368223f35726c3c59b8ee14d6a49a9c360923569dcbaaa546adcdf2d2d67901", + "b25b523d82a0de509e002f7c0fb7bdeb1bae82f923b7ff5e72bb8a70be1d4d421f0401d52c03f0d9436aba3e1be79dcac0d3ad2dbf59aa04f9a9ab9c195099a200", + "eddeb86a96657d3d456d4eb7b14a26c473d2ab89434ff60391f2b4d184316b924fa6fd51fe4236065e63ef0fa1c71baca0d2a20f4cf95b346fab5e87bb6df29501", + "71dac11cc38d0fe44700f18eb836eeb81c3610b739aba86615f1ca8db6a54dd1044ced104737e5443071f2e4d40268891f2787654f3ab01a643dca47a6691f3e01", + "8b5019f7c1ca05e340fbf832d525ba3fd3c3bb52b58178bb335b15ecba630f08207f2e0ab813340c91783033c4cac0f9956963f7151f10c02bd128cdc545731c00" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3GNj7biiqkjxgUdoN3DMTG7zHd3MgakuMjoYpx9gj5uRVMXCXwjTXWqjKGm158DSiuTMCPFzZp8VeSaAhxdWEhRfeY5Wd1eWqX5UV5NVfZ", + "xpub": "xpub6GFj8d8cZDK3BAZ6uPaDibCrYKTXm9JcGafQMDMmF4ctJHgfk5Fz1KqKad8gE1nfuFJ9qUGsc8YmVACXEBTpFxRWQGkTi1f9yxRVEQ2bhbA", + "identifier": "b5074c53d020984321dc1878d8aae494576d2170", + "depth": 5, + "child_number": 1, + "address": "2YafWS7kuRd1omKbUARrYXfQ4Qkn6k9XmYv", + "bitcoin_address": "1HWC3ok9ABgSDJG9RzQ69wf83imkoeGxuB", + "secret": "3fe1a8589b3e5d1aef622c7b2a6434539d4274a190e50c0cf506a40916ecedd6", + "public": "03b49b786630ed72ca263ed632d180060833043bfcd17b0f1dc834c202e644e314", + "signatures": [ + "8ea314518f012e5eb8be6d00e8cda65912a215bfd9f2e582be94086635b6069548b612873ea9a8d3f627986cecb8c35bb52a8e33e9b7aea3f1ac3f742dc4e78b01", + "6427ef64405576de19fd33b7bbb8b70a046122da5bf1823212753a74a2277fc4207b190280abdce97a7b2673fdb7fdada5999dac0758962812651b9a7efc690300", + "0c6c35a3029af0703b1dc5d747e0c0d47524bb443b0f63309375c879933e14714e36d2947b13ce8293bc57dd62b29a1a6f442663bf14e031ebd84cb4332bb66500", + "fe3157ed0bf3c2e4dea5ef3e426ff08f5fa6e56d716ed6d9ddb59feb6fd14a4815fe07c2151dd86864edb6744adb03e9b66e5900cd308e0ef865fa9d875bd5c800", + "6bed0f3e7dbbe68237490fff8b6050a2bff7417e450b21776ecd162e64fc4ad66ca63256a0f3e436aab9fc230aa3c41f36bda7a08f539f20fbfba13a4b4808a801", + "07fb0e9350e992d9cd6eba60d84696a70e32340daae2440fe6d51218608e86087fd8031f17291d2f31622057740202369b5ac65fd278ae0436310622ab6fb5ab00", + "6a01292bec75542036e1ef869e100bd1aadbc8c08449118509a17149e8e185491f7a416e5543b52e7071d1079a01d918f34a45422964a07813b7938cc9e33ebc01", + "7370f6c07ad340c45bccd39f5fc6e5bf21679a7644930db5437fc9be26391f04245ab6165a3d253b5190e63f6d2c16efd9881d2c847fd63e718799ed65afbd9d01", + "2c65068eebdd31c4c339754fa2628d6f4a07a4e1a8aa19ac026b7996e074495e05adabe3a943a614f48aecb6a30662853197f4991a5305c8a6acc59b04e0fe1801", + "5c6aad8d5b11753cf41d478ee1a366265fbd0c92cdbf983bcf74454b83b773907fa4f565dfb8ced61a63b1dddff76476b73fc20df079c53380c2c2eca521acc201" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3GNj7biiqkk2KETbWAqAxUKxu1kwQKW8Q9RGCs8yEhwuAubWvBMSut1HPaK64781CeoJWaikH5rsPfqGgrmrVo7rRguJFAkXTTeL5Gq1Rh", + "xpub": "xpub6GFj8d8cZDK3EoJvhXhqY6R4WvrFLs3MVd524bGkXaEvmyEk4TVbziCV8iGSYjqkwjBDiEm7SpusMXDuz37JXffGuNLzTHvz7bJgTYwBTJV", + "identifier": "a8b4dfb303c14e3e3146e641c7dc14e962531732", + "depth": 5, + "child_number": 2, + "address": "24En1bJj9LsScFBHStVzP2SAKbdnXfpVQXy", + "bitcoin_address": "1GP3CZYvFjHqPVN3h49wNnqRQLmMF5jKZv", + "secret": "0aa484757b5e9eca6980f3efec09808ed492cc25f19e6c86f4116d3b65d70792", + "public": "03ecd6606e548de584712d98af3e6a58a3ccf0a8e635d3757c8d425737f546c3b3", + "signatures": [ + "a93cac6f0f9c146e1561bc4d2543813231a1c2fc4ef56f7b858c36f8d2da789815cc3204c5c069a28d3ebb8b05435b4420755abab72822cccbe7ebbaf102583800", + "8402e1e3407a2a25235ab3b0778a7cefd8e492cebf8e34b1d382f07732d9f4552f90c871c2d448f9395bf81f4b40b2d4f88a0a0bfdbaaa2154e1de8d978c4d0801", + "5a71b5c8a943ebc2b19603124c93b89d55f439d52666881b8180ce0313fa7daf4c41dabf7307bf55c8158373aac3b202ee2f32e655525afe21df0324714ba9f401", + "ec5812cbee692c014d91c069fcc702d140cc28648feb12e45c0c4cf849a7ca824b187e49676f77096dfdb6553ddddca0bf328bf21582499dfec22a82b9b6623200", + "3978a6224d19e26e577f98f55f15a1fd06a04c18fecf6d773a05369e7f4538e940fcc52e8905b7f1d63aeb1757fd82510118a90d84ab81af10ed42c73e70017501", + "ca18563c6a18b004f04c21f25096e62547006f58bfb1f727da212a6221e9901114a352ed763919f35379e27367f08f48f99666e381077af3313a40776b480ac900", + "c174c1fac8ec17b661439fac8b73879ec9cfcd902f0216848bd68058c3910ef63247caf90fe0ee59c421af3feba39586f9c0ba768feb582454f4e51fe2c2048e01", + "e5d1d19b011301e074a8ebd96b468528c1183730ddb5f4241d829f138708d56112450e903930a6c241585d602597750d0a00a60ae1dc85d7fb36bd20e4bcdc2e01", + "5d4d801278979e23e1f3f1acd6054496f19c35427fa0f2b737f44d9d280b51fc35a212af53ca174c279c8a5f3e1586b806e3b5cf5f2013929938a322a049cb7b01", + "0148fea1f1b71e557b24cc0c015b9c8281c216d2f381ac60a976d8616c7f9e6b1fef6a3da9abf728c2a3affaef5b80d56a9faedb4fb930bd8597690251cac72500" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3GNj7biiqkk45bRbdg7Zrm6knfp9SFVj4CX8vKXj2YPY2v5Zo9N5A6Aa5bddfF4yKUQT2hjtyPB21MPiZs6yEsFFHDCw9kgEjtqdo7URRc", + "xpub": "xpub6GFj8d8cZDK3GZfthfD7vzhqJpWJYtyM6H87wJj9HN5NQqFE7LTccxQeRMkbd5K3NcnHPcL7xUY2ch7coo5SZMXUxVcQSsGjL4atf5yU7CP", + "identifier": "8a06d8e805a86edebadbcff61fa9b098813a85ed", + "depth": 5, + "child_number": 3, + "address": "sFeFgmtwczBk9oTZDNukxhj1w5JSGBv6ob", + "bitcoin_address": "1DapTENzEkdUMNWYfZ4UkGFzBMjA8n3243", + "secret": "c1af5ae6f9748968ff73d73de76ee8ef7ed41eca86cc25efd472e1661198b46e", + "public": "0355ba3e7c7433aa0914bfbe9215dc11699fb0b7c1eb69bad0899da66caa7b8749", + "signatures": [ + "fce5cee85c1c9620e417d9fc7e05da44ddaa21abf1abb76058d99cfb649be7701c290be3852f61c13c720bc470d89c48e4059d8501eb888f95e3c2efea72c8c800", + "50d44923d89c93185941a1bdc1c2b0607c2e206f64e7598de7e9cd6cc6f68b991a69b88c122a5ab1b502c55264cc7e60313415670860300c704d470225ce503e00", + "be98e889caa944dd81d7243f6a30341a4836b2d9859c68a2e0cc0e72ed037f7e0a212305147cd8fc9b2f82cfe1262eeab4eb6adff87c73ed8d5d60d37b6606ed00", + "1d7a310795bf283fa7f9ed8438f947a79cbd3f74a2fc213d4d903b07e526ef6e5e873c7092a688bfe67d210a9e02557873ae2de30ca66a7de31e9d9f9e8a28a900", + "3986b6647de47381aa76dcff533926d72caba39279e1fc7dc560473943befa1f515816242447f9ee934c647fc67636d3d35849741f5b6a21c55a0eccc8270ce400", + "89f266f0e8e1d04bcc1563d16fbe7289dfc7123335f8cd3699f25e5b4c9d9f0961d83f43b590289e212a026d0d121cf050241acd2e2a7d9f1c6d0f18f242424d01", + "389f96a13ea5d5e87fcce123a743c0eef88f5c4efb7f95c738ef307d98b2ae382984ae147cc687f3f9a289b05e893013436a4abb1beaeea3c141054d4280eb7300", + "3842e07635a04021536e8cc1ba2288911019f99b9647541d61c96a48363b7f0840da564743c359ee605bce970cdf3ba50fc469650adc89d77bd6f83983502d4300", + "0ee2bcbb0ca347eb19cb4559b8627c3c358582d8b62d402ef5c53f2f7189bdf56df0808499c4e174c3c64554268a9df113f61f4837817ace9763e0e4af750fd800", + "aa5a24db1ecaf438ca73060052145cfae94a744eb314dc0a38e478931c292fb15318ac610b591ba12d0a2ef08a39b6116e7f1675993f106f90c00117dad6b3fd00" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3GNj7biiqkk5EtVDjwSqAfFySuCptJB9gdcXspnCQjAS1J5MvV7SyJZ6F79ySikDULgUXap7pUC3XcY8qhJpqx26Tg9Kzzm46a2irbeoyP", + "xpub": "xpub6GFj8d8cZDK3HixxKmUTCJbzXUjhEM22WuZDLGEPkkG9JodDuToMzmd2wYSUJSS6advjHwCwNZ3KDro4X9U2wbmcRMr8q52L1Ysw3ZQkypR", + "identifier": "c176f4fc33d26501bdcd164060e8d982dc06bf88", + "depth": 5, + "child_number": 4, + "address": "9R37YMw6DSow1vbfXeZDJWzFA7EmFFny13", + "bitcoin_address": "1JdwvJKkJLoswNupCuw1phpP9sP7NwKBw3", + "secret": "833579c4b80f6e704a6fce2c1d19853cc961c570d34a7d714eff7100181e468e", + "public": "03b2732ec533a140538ac9c0d7223f2bb11903a4d91e584f55a55c4a96b985e3d1", + "signatures": [ + "0ad9902a57aa8943047252e4bb9eb21f8aa18f54ed0d625c5e737ec1ed4f19941b463b232f98242a3eaff716006cd7abab186f19a4fc41e09ca5ce3341a7893601", + "622b9a74f79f259740b3c23cf3873f25fe3e85e8e3fdb721796b16f2b35dcb4e19ad1e3c38276dc0289ce835f53db9f5ac0c2354e6d593c51941494e5a191e7900", + "c105b32130961fd55ce9b15f64f16ac4671edb5c2bbb5b3c06b1f2f3de9b35f842ee2cedf6fb77e8b838b2ec7c2e18a06cf6c7225fcda55ffaa0de39809c156000", + "c2e3db378b426c9ff45bd6696aba4799b3ab9f4fa423d4e76db12e153ac596305797e91f1793e1184f69e29aac44b3cbecf311b344a9ac619fc3cc585572c6d400", + "551732a63332ab7e7a7578a9929447941e133fb1c18fd661800fd8993f6488ab6be1de6276ac87f00d3ba7d8d69c66e2059ad52dbb593a22a975935991f6b0e400", + "7f2503979c8de4eb6a749a7d6750d3af22a5aa4cbb49198a1c41c468fbbd36fc22188e2658ab2303a8eee3a694d5ac2f07466feebc07677df17ab6ced3ec1f1f00", + "0afa3f784f4d0babee1d69f0772a9aacbffc392fbf15baaf21ae22f7e7a6a3a7705be1d44a5f86dc392fefe1676b0d6ea8df1a0f45b00a4630159658e477cc3d01", + "b6e2e0e04c32c58e77fb1359ad27f0d4d9096c5057e9b9eca55d69657f0f581d34a19a905f0c296998f9b0a9465e134a77bea550d65a9047e55daab5f8ba961d01", + "fe0f51112605a7f679e9fb8d421d8b7c87e389e6d4f99b5b36300912923809a7175e58c042b955c794b0c2c4a2d96e489d09c0086cc6b96e2ff078e1cb58fcda00", + "93ebf8d2f4920797b8f3c8b1deb67869bb8e4fa34a2758b8c05a635984cd7961536a4973d6c028b1ff39d4919925777082d5a0be51f32a301ee61413782a651000" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3GNj7biiqkpJ876gF26jDujBjwF8NruABocwB7oBbh7HY4cX3YghHksFBxHaNuYB5q7vbQSrUD1AUtmm1hfoE6pJvLSNrzst9kgLPTkjwt", + "xpub": "xpub6GFj8d8cZDK7WcBZnGZ76MrTjmmjXqakXQjDjZXQjwE6ALPm4arwF65M6VBNrh6JcEnhWz46nfF51spFdrLpSFWLmy7VtWC7kYVnV28p1Fi", + "identifier": "ba9c60ecb18726d309620aa3a2b55006b3e495ca", + "depth": 5, + "child_number": 100, + "address": "UiWxcuHEhNYmoTHfKrMePpbAiBBRHpEafr", + "bitcoin_address": "1J1i24JLiyfAigu3416EmsiuuqmxjPFWZD", + "secret": "84572ca17ed6bad59631ca2732d036847686147df908638a3700817da338040e", + "public": "03a5727493f19245c46f8e0d077c71808c957b3e166eca774290d221a9934fc118", + "signatures": [ + "179ddc5e87167abc25f738e7133e38b789b6963559a491f199c1e195e80c2718743db2be8998dcb0b00d598c4cde57d0687bccae83b3eb6f9200f422aa2e498701", + "a532ea3c3760c8c103f672be8501bc05830e7047e80f40a49bffed89511773094388bbac326b76adf9d79ba429d9dd6d47628d7cc348ba09946a1ee387ca270101", + "4b32403902a51454333163a247c5ab2dc6f7a4fc3e06f827f0a56aa03b1831657341136efb9e6e9dfcf06f5d2ab5efa54afcd48943bd37b7e01d91c2c845b0ff00", + "541ab0eedad363e2bcbe9205a7d95de93b422632c5418465406cdf9f0a30f9ac3175b7f0969176ef0f9b8bf607d301ed9c72ecac90ec2dfb8c782f2b4fcd0d8201", + "ab2e13040cf5bb7e9f1675e093bc000969bff30c2fa4e8b49b31c7635d5930647285f5436e67c420b259add47689a536d29fff830dd105a45078c4592fd7647b00", + "b7c794a0c118d6e0bae6773f17c3af508747b7c7286f3c99136df30dc4b6a0ee034af721108ee8a7d0e4857fb92c48e1a935f4b5a22f94728a71f2e832ecd7d900", + "df66ff07624f9d6d9937d7c7e11f3afa881ea18e199eb3177eea2ff3797ed3e5457211da0aa4dffeb98ded0e436e7102633f9b3cf5078ea5ee9a1cca18f8e5b600", + "63b2369a0872e819f4477714c93cd54fd1a1c358254119887e8efbf482002db773b9d0426886ad1f3f938b327b0ca5b8ce235a05d135a927256e05910bb11df601", + "d8abcc776286ba29b4604d75fa2eeba662e6dbc6099cbf1c25293d5abcc4171a5ead2474f6aa67ae48ec128b145a3c6992ad0a2fb0f4e928bc3100e9539233b900", + "acba638f49f243d508bda06867e528bf4129ae9839d92249ec60452cf535cc94581162a84d4b85f188ea04e5ec77928c0d38c3e9c9a14cfc167fe93b2602581701" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3GNj7biiqmWu5mZ8WRWaFXp8uQ2dtPYfobXDAdHn2VnCL8ypXacWMVRPVURUqqPoQfdmEA3fZYDZYeFKQMBzmUAEL7qYdLNRio77WnTZRE", + "xpub": "xpub6GFj8d8cZDKp7Zr2EXxWwPUYgwEX3M7Q32X81Z2uLN2m58U8N4ts49ouEnSJbvTiNDP7pm43E3FPnHXHyY1P5xAsVYsMZzDK9qhVbWL161N", + "identifier": "c4c61e4a40c7f9f21beca0bf406fd2d5f61f7813", + "depth": 5, + "child_number": 1024, + "address": "ykeskbhEiFbw1ruyHw8hVySZdFh46WcT7v", + "bitcoin_address": "1JwSn6rkhbVbAbaALucRdyc1udgR5jmurr", + "secret": "1119e1c466621c643163eb0d32d550fe468e117178355d8fef398d0ae8852cad", + "public": "030fac1cead02c766281904a1b35aeebba7f90184baab8040a9b9b7d1ec166d161", + "signatures": [ + "64d6f88e1e1b441b632114782aca58e6a616afbadd2c7478a3fb04601cb7f19d707d696fcf1fd4f7ddcf4a66b0e38d331eada63a9dbd3afd27d40ed7f30054d300", + "e208cde021870bf14e933b7d2e0be7c70db15175e84f9543bae45ec1cdd20dd6113000095220f48d1a34e4320e9c76fb81c8566f6811978d649033c1c5d43c4100", + "b22d80a636b4893ed29d8e1401749e5c3729158a664cf03f4e75387ed38119ad750b2c3e4973e0adfda00ba044517961d9ae8318763a2673b97fe135d5e46c4b01", + "5dc8731b62ddfc72d0e241c664bbcec659bdc8216b112b71f8f1a3f78f6f424b68936ffae9717431ea82b8c60dc710e20e664247e79c0b00a3307ccbe2b163c400", + "0c737736f1007a83fd7636d04c40b2f5ced22928a87f8b9a5163124d080cfc5159591a36b7e4e5cb7795c02fc1e7a8639157035092bd27cfe73c80d6d4a5dca901", + "960dbf471671abfa00615ca5b00d7ba9872f3ea1fc159f4ab6568c67b51dc5fe3ce32960ec9ed234e4466f5871f4a561c1c9d23ac3a6179f6a877a01a74084a500", + "3bb6614b5c72cbec01c3c23bb7d57cda1cf7ccfe969c3f41b8c47c2f645c03fc36424f590f6ef8d59c74220f0258512c17174f03e9e098c7941f9144f77dd6de01", + "5657bcc6fb327900f852b8471493b6be5798cd90dcde324a5020a0178cab0fe47b148834a9bebeff220f566f44eaaf5ab2d749fd64dd85078ef2d3883e14889e00", + "fd410bee29e489db02ff8eafd6481c88a6fcace2f10359913a57130ec51e09a34748c17e4d3e58d3143cd70a57b2bfaeec23054eb84ef8bc0290961206ed611201", + "594e49b5fef7b33d887f8e43f8fabe303d5279b1bfce0ef89d74ecce30102131739c024e91eb8612cabaed7fb5db57a97f6080ae0f0a80eb12ebbc4d9865c06101" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3GNj7bs4WHdgpoHJESpgz8s4LiYhso3CcgyUf4bacMjniGcnx9NiJx8SUmHF1FhyUbTUA3mR85wB7PSYrohTAGwrSoigDVQm3PqLGfzkNf", + "xpub": "xpub6GFj8d8ktsqvuJskQFyq485bcNZ37LWtZqcaH3UD8wtifWbmLVTdG7GcHjYfkodEnNaNZ5Zdjq5NSMDbnyFdNn5t9TyVLX4n43HBnyPgy3A", + "identifier": "ce46cd786a7db52b8c4b0393b98d5c99cc1b8f9f", + "depth": 5, + "child_number": 2147483548, + "address": "efNnfCmEzWQ6n1RyE1Cmstofd8apNNbt8K", + "bitcoin_address": "1Koh1yDa83bxFsXv961q8FKEkYnxw2FBZk", + "secret": "ec5dc914b132a6225895acc582e62edeb5286c0a6eb24afacf35cb7f7adc3c56", + "public": "02cbb81bd5c8679b01000c1494429a46e7394ac0e6607812ba4375a8d965193cee", + "signatures": [ + "f6c703865ad6f1922363e6c1723dc7d6d21a4b5674fd88e8a94de1ba7b812dab58083f41f963d836575586b43244e8aa6ba47dbfb066d9f0073e8a9901e94bc600", + "b6a063bcf6db68da669b139ba87cd5baf9a60c202cdcdacfedb7a75db4246e8e6dfe34dfb01b1234401a8dd727197aa7d1201ed89155a425e8a6b56f76b58e1300", + "c46af51d1931c2a080b78f3db83e31732850eeb5b1bd537a9cc5fffa8406cc1b6ae2b6b00fd10e2f21f640b31283492378490e4bb074fbdd1cc9006c9789561a01", + "edf26dc0040f80db022b26934969ea7a4596505d73cb25d1dfaab919cd4b66376664ddab98515020ccc4d4bdb20ce5166920253dcf15d9931439680c80c8524b00", + "fe25e894ba76d725b069d0dc8a7915eec010c0d6ca51fe5b3e803e43b01adaf372207fe5e0cabd8a688565808bde78fa3bd0bfb247548f3f31d7c8fa0e977ed700", + "04ee143872624acdd9381d75667d46b678f2e11f01e8ac5e93baac073e6adbde2d02316d8ff058f4e4fe077dd8eec9d070866b9260f100464931a5e806afb9bc00", + "37dc1399610b75d0a36a03b326d78980220386b36d818e585f2779c7d56c88930fd95eec064a4914455e2b16e8f3f5e3ccfad9b37c5eab8eb556ba878a5a490f01", + "d48a1d425e597309cc34997808edfbc984bfbb598814bcd729bc0711586854cf62610a0f414a8d20e236cdf25ee17ef83906cb3b8229d352ae1374511a80ede001", + "f8c993d6da7f0197ed3ce7cb8292684cef38f3a181e767c81ee96ec99dc4f0fa3db0b1d2532acedd64d7c5ee44d622e24a1e94adb77928cb92cc3f466ea0191800", + "32e74fcabfdaae98e207e1456f945f55e6617f29900bfc36d8aa0ca559d4a8f42d9e8254c3f2b159bdcde4bcec76d0229ef37c23fd7e31a88eafd7996f6ca6ea00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3GNj7bs4WHi3YRrdrvaTXAhPHJKABeSpnxjnLZV5XszfG52KomH11VB367v27DrpHUpH1tYGycTftUbqfQtrn4QbVMnVXWHqmvuG24heAo", + "xpub": "xpub6GFj8d8ktsr1G2WKjtTapf7RwK8oZeNJC1tLaiy6dsQyY4QAsM5XYooetKWXv8YM1AJKNtksPiSxLPvMKkD2s6uU9zNSmX6F1HmLUhYzYvM", + "identifier": "5ad2c9dc53a924e7a8d021083f32f403f77c4592", + "depth": 5, + "child_number": 2147483647, + "address": "2BTCXCxX9Jqmod8rMUUgjvJVxctDjFuBKSH", + "bitcoin_address": "19HEL7FSC9x28Wc1yRQeMK73ukHS8oCMUc", + "secret": "e07a0b7085afd77758cb2e5f6df147cf7c50d185fa23ce2f5969c36778f103f3", + "public": "02086edeba828baa10aefa06b4ecaa90628332f488abdf2bfaf4fe9d9c9c96c702", + "signatures": [ + "84b9ff4c5941be83e5cd6cfe7114efbde0a4f50962e5e6faf9baadbfbce32d7540110564fff1eb7d320ba61231f850657443f77712f993b409adb5270ab3af1d01", + "4e09492a5267274bc7b7487f0d1b83b40406e1f89eb6f1acea9948020f208b5469646b3dfaf3d4cb4b05c2753b14476f8904c7df96a95914f87f61f85a45a80801", + "9629aafdbb44a07d1dd88e38e320250ad339e1e93407b099fb1c4972c6722f745173aa85826ea84eb0ca82ed8d6f7a0d29c9053bc01abab2d20f64e8d6bf175c00", + "f3d689dba1a1dc8024a4bab90a1ac632452e9345414a824e6e67d7bca99c31fc610c6cb33cd447db126c9abf7d6ec637b25a3bcbb0046f7565c1cecf20ba52df00", + "a38267b7067cbccabd8a0fdc4b7c1e03b90bc9068a4ea36a526d61063938a3a94b1169c3c8690e1e54d3682e6c9c8b8c5980a1c090276300cb0eaa762a10245d00", + "3955e6cd8b57dbffdd4d92d6568dd39275fa7d6fd4612c35c401243c37f38bbe6594bbf51f5e6d6fc6499f027e063d61c83e82abcf87968469860e567c5a43d501", + "b3632753440f5eaf2efb47af9cf9a6954942447a3bbcd19f4c499694d24928fc61020972ae69c14335bb48085eefa64b12589da6e436dd280542d0acd3f22abd01", + "a8b937fab10fdfc0405aed6e5d4e378ae9f6dcf53236c6d5d57a1677d1da258b4690702a5d59a43c2fd22fa50fdf9838b6b558869d138c169a44d14ec1ea8ea700", + "05ce6e9bc2c4620553d4e175a8735cfcd618dbe1aeb355ae36c9279212a2cb410dffa73b5a3f699bb23cacd9a307c1aa6f011a8dfcac527d5eb1dedb040ad09e00", + "d724bea2dba9f10600d5b2a33f237f250c5d725cd169b39904a909fe83e351a6595c2fd4de07a70309f18fb89b2a473c8985c6a4277d29413c029741d94c5adb01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0006.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0006.golden new file mode 100644 index 00000000..60ef73bf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0006.golden @@ -0,0 +1,233 @@ +{ + "seed": "7NGJd2MwBTrtEw8eTt0ogvY2o3JrDviXmib0PCRKhfY=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3ske3kp7x6Eu1JtGodt2qAthvMYzi6P6t7rQXRULntDMUvjjqEF91uN1Nf3qWS3vWPdFJiJjKr4y1RVCrDYyYz3pbkJC6TfZFETLQgRNnT", + "xpub": "xpub6Gs73ZHhxKeY7VPMNqAtPy7dFxC3QApEU73TCuq5u8RCEHFtHNYVgpDqrgDCggcPis4H3ReqPAgvv7BCSaqvvTaGsk4sFbd63sFRF5j6z8y", + "identifier": "c58c3b5b77d294009c51a40410986b1c60714536", + "depth": 5, + "child_number": 0, + "address": "4nbe4MfkZnxRWUfuebhST8CNk6TkWL7iZT", + "bitcoin_address": "1K1Y7GjpQLHV5Z6KP83B8ZVR94f7sqtAaR", + "secret": "a9021583cceede72400fa11c68dd7fbebd7d25db1cefa95caf880debe18cac37", + "public": "03f5656aa88fa3843fe8081c3f0e5de40901eee7fdc3e28e348fe671a83ff2db9d", + "signatures": [ + "ef96baa4903c05ae96ca69a7bb66953b12536295e911f0834784d978e57963174adf2caff4f6113eaa4288e676b0d34a6c6770ae68617cf597fb8ebac74b07b201", + "09d4275ac7143d3c40856455f9680cd96b4c1641aae36f88620bc1c86f833f6d4cc0d7bf47d569243b392a49371d00f60bc0e5dc73b3ffe6bc65af1fe986a67c01", + "57f93892393e50c9cca9cfb4709e57495ab4ad662214dcb4b645bd6507cbba87303d3efc7ec68a312be9b64a8d001079b384e5c28e9ecb265c3b235a893eff8300", + "be5326d9004544b338b803945687d20fa15c74f5f7786e15adabc92e0c10ece00afd36c326058fb20546ff7252f81658aa501a370cf394968b706b8f219e5bb600", + "7b420059eec1eb72c7733f18a1a3c1bb4b54c39e521531244e7d2105559d89b465d2cbd2a74f26c070437cdc7b265bdeeba92657aa02f11fa70023cc5fbddf8501", + "002e94c28cdc7f757ac1c7d2c58b4a337244e15dab7fc405e0a34f56ba0109eb0a6dbc9f1f107ce87781f9d2e898a53253d0ecb7f6713a9d40b07f1d5cb6b61101", + "852fa1b2b4fb0d653333202ff22327089bb8939d1391e067673697269fb60d3016399f14c5152a95d7c0e763dd98862e5880402b755c6b773461fc7c1574d4aa00", + "ec679fa05b7819049eee38a79d1e2d2834bb3c6ecdc4663d5a5922ae529b9e5f7dcf72260064604c0a25a1ce4af012788b3142820b47ce5e7a21639b1e715fb700", + "72cbe795e12040beedb889fa3594d1ccbcbb1996c24a2cc05120e20b908786db512c86fd0a8affd96c7e520c51c645535fdfeefe42ec88d4d0e3a43dfac60c2801", + "0762ed0d2de5c408b0dc7097e51c7ff1136baeaa858c886fc04534c60fe166e20280aca9d8d9e3347a42f07ee3c68c5eaa2d34a6b449e7acab4941e49467ee3c01" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3ske3kp7x6ExaVsZiMa4Cky9Qce8f4sNu1vjjNhBJ2pvXcytyPyGyKBgCENR8U29KxQATDvAvs95QYAz33NjqRp24sNRawZJFZ2VZHRQN7", + "xpub": "xpub6Gs73ZHhxKeYB4aLfjtaRLhhhST8Y7nik7wXY7nJjdZooKx8SWiDpmdfXURKo78WmJCni29xj9Ch8tHU6yDE9tywMGAKs1YVnQMiugujnv6", + "identifier": "336508b18c4bd6bd3d325e2daa8467fc6bab0648", + "depth": 5, + "child_number": 1, + "address": "WVfZHMzFzrKpojtbuaZzAXVt9UcXeCXpWa", + "bitcoin_address": "15gkVkGDYpV7sCmrWS58ttpPfG9ChcK6bG", + "secret": "0c564eab8e71ee5e7c11622d7d32e55a905fae294e8f89f0009afff67f0c4a42", + "public": "02a4e5a1a75d3fd9ba13a8d2f0aa6e9191b5b16c5d2491e7e9fd1787eea377316f", + "signatures": [ + "b391d7f28e3c0d7386352006c286151ad35ef42618dd84145adb36eb825cf8ab31486298fe3f36f38d8dc2821acefc0458ba72ad9d6d1202e6d95d56fe90cc4900", + "5c0b4ccd8fd6f4a3c82008c4fc7cf5764f4a5c450d0426649996347006e0fe5e7cdf314915bcce0e6044cac756e4973b6e6b391bc4e7d8ac4f311fad7f50ba1100", + "6ba217be6daf3f8d5c4b4b17b6de354023306bf00e458e83c5f9a067d234a4855f5f1ca35c2ec79273055ac336bbd2825b5d8ddb96a53843689bf7124577548f00", + "85e9fea422e90e042712070edada0f8dcea79c4311a4c93b587dfbb01b40d5834a1ec488e7574e6912c458c45185a5a8b311dd119aba5de5ad6de741de12abd600", + "c6f1d09cddca12bd522b327cc946dbcf50f2192ed7b983600252bfbb056cffa6062a9b3768792dc5d4f1a76657cdfc2c4644a6158a07c08389fe85bedc69b1c501", + "7b9554ed0f83645741750a2c456d9e4fc7d8b06a89f79d00fe52f52b9f12f3355237d6a0b816985126dedf62b8f4e2127325d31cdacf612560805a1bb6bb3c3301", + "facd95016afcbddc8b59b068b0e1eb5fcfa750aa448667c214d5ac430ae4623936b1eca8e164ad8d2321ed6fc007a0a82292749af325b8a489417e2402a7304101", + "cbd5a7e70f98033509f306f9316df7a7b3d31b1ec8c4fcbeed4a010f9454b6751dd57e8e027a3b06deb9a0de13b6d91b39e5582a371f7f419a90c6587774d56900", + "b70a20b7bd5defe372fb54acf458b553b98845f2f7e3b2a2299762ce2a846ec3010402ae36141842484e083afe454ed8f38489ee48705e1545027e0849bdf9a801", + "7811db2e23b117f56d352992822979a0767b36920af644108fea3d41336daf6e1375ec8553f53e5d9e3a38a37715fe5cbe5fef8cf649cbf832f19d74e864876901" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3ske3kp7x6Eyrm2HZ1a5thnW6iuA2AvGjx94kvNkdTekBmQWt2PWoTu9T7DZiofBe1Rv1wdb4zXRD4yhrHxD9tEsh4LU9x6uugXF4XrnTq", + "xpub": "xpub6Gs73ZHhxKeYCLqVPaYaT2eX48ZPZUtmdxsjs9KzJxzdcz6Z4RLe4bnNzjcuKtVgMMwgPvRuRQEqsaSWCvfgwp3P4fZWF3kWzHaBh2cpXWK", + "identifier": "302b31d074ed971e0acbbaaeab28f2da4c85a404", + "depth": 5, + "child_number": 2, + "address": "dZetczK1iadBpfyUBQCff9NXyLQPcdBfbH", + "bitcoin_address": "15PhBRPAmX98iaL2H5wPEsbjSmRmfBgAcP", + "secret": "43b69da1add1ab2a5411ca18189393d7e34a119011db0963ec35f90f7d0d4420", + "public": "0306cdba7432a07cf12beb82ac637f1a9d1d47224d364e90fc0d87e7f488503b67", + "signatures": [ + "9a56e0cc5921a22bd9bd07a1823e82e5e220489874af119f4ed3defe3fccd46c2534bff81ea1262efa49c69d1c039626a18c82983851961e424f81113a321aa500", + "14082821a64b00a5b95660f1d040e7f620b9a8ace9582a8e64995219927ab95a5da6f6a2c8a591c9d7fa31ce63e9483224a61f20a48075111b59d36627acfda200", + "2c3b302688b34b5c4dc4b24b033b7c83ff6faf0275848ecf9e7a185f319a2df86648896b0f1df079da77b0a2fb1d245b4bb71a87be804248f22545f9305b5e3801", + "b1b54c9f6a4bfce4265396c4950e7213e1da9395fc6841d915fe937d52f8f6313b39cc88df6116d218786ff3660981f9c3dd219b679e278fff16301081b09c9c01", + "cbcdc57de4d89293de62262613a00bad4b551216fbdd1d2319d0178ce3296d6741f83e3b32cde8c449c6e49adca31c3e47a4fec75955da7ea4f6f74d4b321b3901", + "34334c4e24d9eea7295a17d1795a73131020a5900d54dc56dfc870dffbbe03234ef88fe4fab25407296ecb148b0792753aeaf4fc8cde40a47f56f3ed14c4888100", + "d5d61e68d8d45c3265da6a4b2120c0c1aad2f468a4b305ac3eecdf719154c8057afd5ee7b0e1ab8f7bb441164089e37c2fd6b44084a121c31f39e15f40000a6900", + "27996e3880e7cf9ed3f29ce49099c0c43379387fd29318cb607351f9646d4e917893f9dd0f7d93f4940174d05aa69c2699947bf54fac17e54239ac2c57d5ebbd00", + "98176b24153c5fe06fd07260b556b6c4e8153d9dc509cb1202326997f17f6ca0398ba1ac787c9e66c9ee73f62932c567c883e635405eb2960ef4c210d883666b00", + "d9ba5aa10a469e6d492121548dd0553fcb62ef44d7cd418de7a4742405f7633315cc38e0c145aa6645e494547e96f822c53aa5d710493678ca0f5e4643188bfb00" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3ske3kp7x6F3T1TyEy9vNoHGmnQyg1P5jW1NCtpGDEnpDarfYpifEyxpT6fF29RhNANTCZg18ywotQyxtusJ8zjor31diEFsi3UyHePQhW", + "xpub": "xpub6Gs73ZHhxKeYFw5w5GWAHWk1pocuP8jESxRcAbJRpYmmh1v1D68yD3JSfhzWLBsc2FWU8bUtCKqUYVEpqr7Ka7jVCTMBKRdnVxvYoUcgaTj", + "identifier": "2f1b1e4f7fdc377e1a67b1d89bded4fe2360a413", + "depth": 5, + "child_number": 3, + "address": "X53w9siTY5ci67heRVXi45JzbcMYxHrqHq", + "bitcoin_address": "15J5FEfLRyGnQnDJZ1XXroYTckdDqsUnjd", + "secret": "a0e3116c07e1166033b792a1105a16216057aab5a0825b713f98ca74406dacc3", + "public": "028ee768128b5c7946fe352d5139d1f17dd0a4608feedca87464f74aaeb492eb76", + "signatures": [ + "ac5d5451a035a2790a0778d45bc5076a5c65b3282f7820a66cf38ca285c2eac67276ae51952c3d99bcc9017f092a6e87374b87e8b2afcd3ee3d618b09ec3e42100", + "3d904a9e035e6264426c09c3171429870735cf7885c15c1d8690413b30b4b0bc1a92c27994e28fb79d082858c437bdc7d0a3636a24a24281b19d3e51e5ef62a400", + "18f2c10fb503db7b9f3396860a0528e9b8154c980cfa0ac06be501d663ee850b0a75a370f38df7336babc4d57bc6bbd1717eeefe1cca3d90b6e22644a515fff300", + "1ab8dcc63deb688fe912ecc93b109103181c5691cc4a56fddf09361358e548226e289d9b651c745f56d1251b974e782614dbee4b6f6c6e00f63b828574a2333e00", + "367a14851a36102ac21ddda4764591fcac85789f8975169cc604924f4f291cfd7c87abd8d093a51c0f1054330da7809b9c42feb8d551c1ccb6774735cf11dd5001", + "cb632238f71fd71defff4cb3dfaa9c2de70d84b7d3a9d6f36182b0ee2018953c31a0c5f238533c59b35e48066433d74b23d3199a8c1cd7e5f30821f5f32cd94400", + "925c55b0f544540485ca25aab48b4e394298728f824bde1c720dc3f0a92c86bf3c41130f205009c93c09d703e0a6eb11b78e964ff3a6febee58e9b2115e61ba500", + "7bc00a724fecefda0aa31bb2e33976015f07261580fadb812909150e606e03d479f8eb100f82ba5e9fe860ef960ce6703b8c7c02c6ef80dec5534fa56c79771e01", + "22ff8b491dc8ec7a615262a1073a55ea424b39d9e11fb43b868692ad6cf947b047f8355d2a49fba69c5f24240819d6819e20c9de4caa48e5bc90bbf39a0c118c01", + "75dfd640146ee948ca1cc56481e6af4ab32e9234b03dd30f64a4b4310f5c2e4904fd95090f28036597e4763991225483b05310ea708f5940ce2dc26ed39bf92201" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3ske3kp7x6F6E7RaAMebbgdb5yQ2euAkJ5eDhNxFXg4TKqYTCZMhhfqBxXrL8ZbBcpEbox61br59E8RfKUkzNA5mry7Qp65rph745GRZR2", + "xpub": "xpub6Gs73ZHhxKeYJiBtgBtexjdN97otS7d27X1F25nZosD3L8AgzjscFVzK3G6V3eV1YzAmpdjCWdD9TcKsVabzay38dppwRgxRGvmH7wbcarS", + "identifier": "eae1036b9422f8b198d75c6a426e3a0a3b005f3d", + "depth": 5, + "child_number": 4, + "address": "2YtMNHowkj9MCcAwKEGRXxgBbAQuZEWxpkJ", + "bitcoin_address": "1NQvg6G2vcpuLXioVuZH2gDSHSTR5ndxUz", + "secret": "46778f731d2dfa2c57bfa0ac2e22173fbd3eee3066d9c36f263933571f93e0d6", + "public": "0393f22fdfd0376e584bf4728c093b09bfd7969bbb16b722904667b4d04b5270da", + "signatures": [ + "e6e5af47c544c1c90f96027fc6336c4fca7906ae83be00eb8631e3459bf011a136ab2b7249984efa3d894473ac1af08d9625de08cda34eb0488835efa71064d100", + "e4f778b5f8ba30dabeb0cb94c96037aae10a072b34c93a56a648580aeff6b13d636b5953f0822a6f8cde141a0c928aff993174f8acb49d143aa9f8e2c4e78be001", + "00a9d12c7e7d4e8a09c618b7193590e49fd88973e58188491dd248f6329ff9eb6b6a0885d4004f9c16b079bc61136c3cbfc3c1775f1430b9ef4968e7c7df07dc00", + "3a6ef460e8a063ec75cd1c7a5c1ae33ef120697c9ea2b9249468678a8775c5ba4cbb79d210888ce3a689b6ab858dcd991c93ea40605f4a5652e7f92a686a936a00", + "b889fb65186bf2d45854c696a68698cee64ba2c87ddc5840c11ff9192cda167a1371c7723b7f9dbc39337d49409def3ef644456c4bf806939705ab6ed61d419300", + "e1d27a23ae3f7608755198874d857d071ee5cd6287ee8502a46525fd68b147486b0e9498293d484b8958bae0c28caf3bfcebb1c804c1d03a5854ac186af4b7d700", + "c3dd2307ba2c962c2cb859eb5e19c657492ac2052b7a908aaeaf22c4715a725d3e240bf3811cf6a81c713c39f439c48b32cbab2b4155311044a2096e75fe02cb00", + "98b1c3aa6d639b032fd35a5d9976bb3de03d6d606b45dbb6dbc7baf4454799372ead374e8921ac3ecb202a8ad462364722c60e804627bc513008df3fdffa08f200", + "146a74d85572bef2b5f2cda85365b950aeae52d5a3755c714dbb17be88993df7183c19a79a2d94a3bacd7810bfeec6c63e8f0c669763c373f4249fc203271cd100", + "6222b9392b994ac4bbf6186f48ffe69b75a5cc128f42aa96d9362ff283d8cac03e88107618c82f301b1adac201e14361b63d0cf954e68f782290068add23e24b01" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3ske3kp7x6KJcuzix2pcecb237YdRJsePthBdTgZsCWKSnNZYuvgFdBLeaYGfMuMSvPDoqAgxfZ7AcNxaZDtgoQr7DqUGm8SNVn64YatQp", + "xpub": "xpub6Gs73ZHhxKecX6zTpyZpynZKa4x32t2j1cpHz1sJ8CjVCF7X76EBE3wfButL1pNHQNKrxPeh7kYNmQcWc2u4HbDvnLDJAgfQhKSCApJ6TMJ", + "identifier": "54809c20e30f6d5f938038222b9b3a170ee255c9", + "depth": 5, + "child_number": 100, + "address": "ka9oFSHGTPFX5izfEFWWDnR2iJEAUtKbni", + "bitcoin_address": "18hoq5un6ooBfLqS3pFATqwHCguHy7wTKA", + "secret": "24bd035d9ad1a9ec7f70f8fbfb27807a71e11fa15cc294b10172997c9d7371e1", + "public": "02491e87f22f23844be126889cc64244cdd8c88458323c3745f67b899273067fee", + "signatures": [ + "ff90d992e8fc20b7c2930554cf5d100bdf2155c28e7910f47a06f9024968927606e0859aa1328819e95f86810d29b76a12891b6cedc65b375d23dab69cdc4e9300", + "9705e6531e72823537c3dcd3f8a1c1d83dba7f8f3b9bbedffafd162002bd38ad7b2f1ca7af643de58733791ffd2f434f3e88339b036adcfc6d271f96cceaafe601", + "b243a826978ffb16713b4846845b2e2a3dc48f3c7fa2a1b43554bbb7cd493c602cbc64604d312a6be1de74d76493f8b30dd78dc732c709253048197721c2e20100", + "4956054d070835a4933633c9783755402714408c325788685099dc43d01f24f81412aafda7c0a47238a26feaeb2acbd652238276e49662a502f44c613876af2501", + "7f73db11f586410ecfec75afadc097750547b6f75e644ab3b5d37cef58d245255066f70b0ec6ff02ef1ee14ccdd8b0ba9ff32eed95deeccd374490a6a50cf21f00", + "bf2e9124ad3f5e7c9171709bedd013770cd51af35742e11ee6028ab55176430470a2d87ac0486fd6aa99c94e4ba7fcba53d5dc5568bedb9b6a78facc35aae38601", + "147285e699fbeec01f6cc1d7c45b2aacc6cd04fd152c40c5ecda5589ef31b2093a8c4db237e4cbb6b6ac3af2ad6bd3caa2d0177ae42757896f52617e057a3efd01", + "c83d260746b3b4316825f0c2d3f3c3e5bbba2de4a4dfa979962c6458265fa5612f3358d44d8e66a0fc90ba2ff4fdc8f47eec640b7503eb39d1a0590985771b9600", + "c421f3e56193750c61efe9d08daa5994baf40d2a7b02b7e3de8970122857e9f92d3123e8cb9b3751b744935675ccf1c654fbbbeb06b6c7cef953234520da799200", + "acf046b9f4ccce4bb45592edbed7debd8bc674a55ee625ec7e095a4486f79bbe0bd1c23431f02f3bcb9bff59228b689cfd3aa0e385e6620dcd832d5b5968670a00" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3ske3kp7x71uLp5Hrvco4j4Z6uWGyQdBoXBYm615YiftCXgYSzFDNajjhWy7s2npUUJYd7RL2kZkBaqyDkg859q1jArmgQkyt2iqEW3TC6", + "xpub": "xpub6Gs73ZHhxKfK7ptYPtTdACfo78jzgS8UZ2SnM9VcdtFekzrq5zJVmAuDayFfTwLzhoVu3PTfWjB49MKWDJPUSgPQRtvR5tWRKCVGvq7ZvgT", + "identifier": "4b281a6080a6cf4c5bb7744b0fc8193b2cc4e33c", + "depth": 5, + "child_number": 1024, + "address": "28VSxfzirpgUZzUDeQ3Pi2JL9k82YzhYiwu", + "bitcoin_address": "17rPio7PeZT3MmRFkYDfBPuUspyNWfczAh", + "secret": "6bfc970f6b94633f88632088b6d7623649dc76e11a4e838deaafdd9ec1596551", + "public": "02c8ebfe0c19cd00e425a6585a8952fb3b316f6903451f16105b5e814c1711db6e", + "signatures": [ + "641a92be23941fecf623bfb0a8bde25a9ff0884ef429b9d687b6bbe55e0a54321ea387d577486b654a307113134e9dc482fbde12731f26fefcb561dee610401b01", + "281e501300fed31c9571b3952ff8263086adfd0d9395b8299097d96cb2f983194ba6a8aceca55c888edbf67802d61ca47360eae610aa5f6d48e4363ac462092200", + "8b319845613e1ba23eb2c20af4a2cd46f986ba1e9e7fa32a4f7e8be3c1dfa93275b97df750fa0d5ce95a343c0d14723b45c751441f59a1bf0cbe3e663d62a44701", + "f2b5c0e8976129e3d02831a6b8ebeca1b4045b4053d2253799d70a6094d40f6b3656baff1c8f8cdd21f99e81df618ca720b83cf87734d948c0e666cb5ad63d7200", + "ac7e319c51f7f7a98c056c6329af3dc97ec334cc780f2637e80f8e7c41529ea55eae5a061ee708ca0ec8388798027e5621bac2a21a12ce290a6011c5678c0b0801", + "c8fb759986eaa695ce98654437d530cd6688272cfe451f48995dbd27551d28cf2a004f526144ebd07bbb2eaee701fa4e687a0a5da345116cbe6bd1a298a9f69200", + "0f46fed007b5e79eef13637abf0f8ac03935eb487bb6ac34ec5fad79c31cceca4962a08ed34e8bea3548219238299bb382ab19a9c571206ac2fd52fade8eb07401", + "82823e1da544c968c5ca1949545d4e0c386312ce0ebdd7c44804b288163c8bf31cc903f40e39248adfb58b3b91d1851f98283d07085ea67447e2cddf5b2d99ce01", + "00275761cff7f37876971c4d8d21e72b6c13cca6ce5a424bca459a0147746a616a166461406e571e20ecbdd7cfcbea78756a1f741d9b236f85096ab71e0fa6e601", + "4e8861b0c4d82b8d8bb760638b33395b6552f8c4de4d6e906bd07f0f4da3d00a3b5b7c9278696fdfcaffb50a0415fa5dac6dc9718ec12123f83e89870437cf0501" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3ske3kxTcd8gvCEBVn6e98QHF9NPVMAfZigcr2vMimJR4TsTgoPucffcXSsEaXeWe8fvdYtdBqnjAEjmEsjf48hE7z9mcn2X9W45wYvY2x", + "xpub": "xpub6Gs73ZHrHzBRuQGhHXK71H58qGyrnx522neHRESXv4JHHro21E7eTQz9TmSfEoxyyGEFNZWYLmBwzbnS5T5kbXCmCxWfdd2Lz3djGUwv9fX", + "identifier": "2bb826880f9946a1e8e1c881f86fb07d651a4528", + "depth": 5, + "child_number": 2147483548, + "address": "18eV7TkZnHYCP32178vhmAX4uJJHj34n51", + "bitcoin_address": "14zAfFYNnLXVhTd3XZeqPmAXJnx61MNS8X", + "secret": "f080cd13387227fce2276e2128456ba407e2c377ad0b4f89e3d37c427c429de3", + "public": "026853b22ac4904bd323e38394b691fc09bdfe5f32ee5594aea55b74001e88980a", + "signatures": [ + "4222ddb4c8d4a1f57acc92e4ffcb9ac55158fc17478b3633aa5991a806cc77020e4333b4d3a97cd6faf4ef3170c61e2318e0814c3fe36a4529285e159c5a69c201", + "518428fc8bf42b95c8d920ac47f76775f8aa1baad5b77fcce3f4bda7317aa506299235117683ec09f80044a6bc97638c0cc652b1b5b6ca183c9cd00fb1f69f0c01", + "a5a2e27cb524330db78f405c6ea4d450844dd7a819448c81f2716c0a604938bc0657bed68695784cfbc6ba8bc34bdd40f59b1d953aefcf395b2649d80c87114c00", + "ec0874e98fd3ba43f67240a8b2d727a76f079f560a95b864f9a3ba94807a6534040a5a66c7da214a2035dc9656059697462cc22483fd90fa6e7642a343248a9200", + "1aa49d3202492ebc9d3bb5bd975ddfd18ac295399168bfe506a108a17d97c3b72bbea4bb7a9408d5fbd84218bf19ee0608a11349ee524e78dc23d6749efe2ba300", + "7e15363240e879107720c0ff8a8db7efca51e7728fcd679890a5214201e432b30a09962d78fd3f2f223415273c5d44facc94092ea2a90723f007b31f3c99c79000", + "9dafc0a558e385d3ffe7b109fa771646a7b18717e147bbbd38a88934d783081a51acb510fc1e9d1a118c7489118689297c7be923c9360fc97f98c084fa7ea2d401", + "32ae8658615934be6b58a18aaf6d2603a973bfd7124b1d5aa024d7ecf02e852351bee90b5108a98598ba3871277057738542c8ed09e73f90ba06783d365aee4d01", + "88538ddfd4a209a8d9a8c683e3dafef106f7d3ecc6fb2017845338fbef13331543842e62be4ad3d37047690453c88ae5a0cf029c03f6e9fcfbec42edfbe9315001", + "1abd946a75d4a91ead75b4bfa04dfcffc009e9cff0e2ecf281483aec60a20a247f23ac8daa499a433eb161ad73c8109421e38dfa9dbed32e8b343bd4ee3f72b001" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3ske3kxTcdD4JiDb8eqZG4MdM55HEDPp2yUDxM6j6zUoYtreG7r43rH36MVJwnZdPHo1x9Gf1oweJSZjKTovGxtP5LvLk1eiB6mC2z2Cc4", + "xpub": "xpub6Gs73ZHrHzBWGnnghABqvQ16BNuZggwFBFu52LkiHSXTgME1BoS6brAktMfbhTMUPCfQC3HzVtpGbzoRtQgiMGN4TztKaBcArMPzktDChSC", + "identifier": "1200bcbd3702e5c4698b9d9f51090aa155c051e6", + "depth": 5, + "child_number": 2147483647, + "address": "2JatuRBuxcpRbw9DRGFwgKBvdC4QVE38qk2", + "bitcoin_address": "12eC3gNZRtPTk4vd6yVHxsqS7XaYv7qgZR", + "secret": "749aea338e40cee8140b3b926b5159e9480bea522c8e007c6886bfd5820061ea", + "public": "0299b748cee8d69924bb79df20f6d9c4345ef880e0f7794d6e6db578417371cbca", + "signatures": [ + "18a3f0ccd93cc59081bc4cbd7eafc20defe429bbbbb9fbb3963d29ea3b1eae1f074a725d09f9e7f43c862cc3081d0d8e89157776c04e7a4637ca9e48c7b60ec001", + "388e6011005b1418f2fff3ad35ee5e7db92d6e42b28ccafe5e51d06334883a2b5522f85ae3c78df499c69e36dfcb3bc862bdf655ae14b8076a4de2c45e954f0d01", + "cb2a830d76c8e4b6baee3652f2d66b80e1162befa742ad8351fa6baab5341f66405efb0d1d06d136035142d5d028e3b82c70a96455a60aeec66ca2875aa4309600", + "5e6a567a87938cbfcf92fb623626deabc135b4073c7171dbeeb3a8a595901b3b52b01baea121b06f2e536971a435faca63ad40eb9deac26e787d1293f836a67800", + "fa4409981808850b3ffed571d9b5994be31ea11ace4e33362693fb686cc963881d1a703aee71f6d4d2ffde4b0a3e42532ca4fdacbc582da28b6b742f64c469c100", + "54b3f74d6875036dfbfb1eb48cc4eb769c59bf141c71983e5a21124b870c6a783e372806c19c61b781dc9d735b5525e365b8469040003aae89bdc1f3bcf77ac101", + "4da9dacc842f789b6ea7a12b9a2cb7317d610e77786360647945b29927b07c1f34991c4cffe53010f470c37eb267ce470b4f1e118fdf1d37ee4620366ab4a63901", + "2f5cb0678372198ddff1ef4d3b42b644f457814e1d5c2a664209725143f9a61c48e86223003146f0d38abaadf09bb56b43d0f04edb7743d99b72a42d15e267b800", + "a3c853ac8e20d77cbf8c584c612c722c66b67b2b080fd1a65ab9bd8648eb77c047be072d23bab8d3183b7376928b761f418d6dc14d703c9ef74bc508d5f02c7901", + "1179c6dd84b39f98b079686100f9dd22c6cb8c9be2ab9498fd3d43f58047d5c53e58858a583065a2a5b2e028a1d7b5ff0d61520eb20fde9d78143e2c8250df0500" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0007.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0007.golden new file mode 100644 index 00000000..59b105a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0007.golden @@ -0,0 +1,233 @@ +{ + "seed": "zvlj08VEYR+WAKhGKWSIzXvI4kYdyEkDerOUA6wpW/k6hdNy4aaLimJ8RmUzUCJVHwaZO0jxIB+5KkmEts2usw==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA36SKN3dXZZ56EF4htbFGb2AeDdGwo7f4rzqwGtqUjKbD3Y8Rs24eaViCeQ5KoME5dCKJmM53hm5Zee9Y1BWK8NDkxyhDUFnmoRkWeDoij9", + "xpub": "xpub6G5nisaXMw7NJiKXov8FdixuCFTmMFqWS5vSjfJT34ra5qsGyQLKCNpC3vhMaBYDG39wR5zDnQYxQ6ozTv3FgZnBmnyMB5PSwncxzoVM3sJ", + "identifier": "85c54b21bf861e041248d0dd1bb90820d98e4d1a", + "depth": 5, + "child_number": 0, + "address": "yaSgtpLMYd5mzJqDk7UkGMTf6AcSmAWiza", + "bitcoin_address": "1DCKDhtfmxq94WWkTQVbzyTBvu1HDNvLTj", + "secret": "64be0f848111158a76926ffb2ff5bc567cd38f736cff5e9e9f38515c1b886583", + "public": "030baa2ae103ef794c6a17fdbdd7c857e47a21da8603c84bde57564b4c70389235", + "signatures": [ + "ae2e6861f69f3b20fbeda6803aed5f8477a3199574072b8217f77720ba8984777f0cdce63f5d850f6977390f8a565b2e2d5ec17207032a265e687c458d191d2e00", + "46fe1471b269064c1a7179996f8c7027ae3f57e4cefa0bd7e1119c573ec7f3f9226dc51bb4b47ac7cfbb3f63c9c02db728987f368924d3986c2481428c1e3c4d01", + "b907d1246631153ff98218f8ffcfdbe3f5f402a66aa76c2dabd519721a76f2f41d5f2d655320e97fcf1a41353f02d1797bcb9b3a32187d64eee09711354a347a01", + "c9ca5dc9b86aa631d703ebf5992a68804dd8ba2a7b0c9c0306da0fd85c2452310a6e024a39021140c575c04c0353e217206e8808cf7b6b6f3467ab82444dd25201", + "792012aa3c5f767c463645c3755f8260500a9612047a53600c00092d5059704901997c314d3a55f50e64c9fdb3715c1501b99be1887438c7e10314785233fdd401", + "2212ef8f4a163edc76abc76bc7df30a125efcbf6d8d63046ed4d0a8b8fbf0b1f1b841a94faf6dce43151b67c1cf8105eb3548524f62738c6d5d04da0f0c80a0e00", + "694a0f4f884fdfaac2673c3a7ec49dfa03ce53dfc997ddb1239e71a1e8d0e8042b80eb582fdb2f8f66746ba4f7014b8dc2bba2f1f164c8805c61615048c990bd00", + "35d2b0ac99c0aafd0489f1ac1d5625757c33164e2e6422106608ff8c7b29ec6a39d889601bc1131fe886a161632bfe2098719bb25211ba95da277573a0bb7c6800", + "46e28cd8943120fd064d72b19223bcf7c4e5147b874bba9d76e579682f4d21d50a5491306c1f8adfa7216ddebb84ab603b42f06c5279e82425c723b9794da91d00", + "2d5a3ec04d2d0e29dde337e7be325ace2707757e337c7e4d290ad512f5a5eff8197a445679e691b0123aeedc9cf1139fd770e24dfa20c5b3d97d849b1990085301" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA36SKN3dXZZ578rQzf2AxU7ofvSMttLghRFuDu7vFC2s8Lma5n8iUyDTDffyoGdGL4wkQYWJdczQLfdwER5r9rKp8kuVy8sa9MvEMgexnQN", + "xpub": "xpub6G5nisaXMw7NKcvt6gZBKc4YDxGrJM4Y4eBW2HXXoXZr196idKSy2mXw4y1rVJg8tn19QMCZq2itYuox8pUDtYUMxuyqgz8nkjX2spJ6srK", + "identifier": "ab2f8aef674f93333689c7c6fed5b98c37f7d670", + "depth": 5, + "child_number": 1, + "address": "h6zQwEN5Lc4qjWat5mt4f1T81fBM2W9L5d", + "bitcoin_address": "1Gc9W8UEnbTUutr53teGRM7UmMGm2QdraJ", + "secret": "a32a0b77820cbb5222ef74dff39d95dbb74eb40e4cd0bfc419b0fc17f1e3887d", + "public": "03d3ac17e2629c0976575f76c7257609eb02b0f3b61639e73b125a2c930a77daa6", + "signatures": [ + "8248e6dff8ceeb9424b58852991e1645a4d369b05e3df3266155a9217845c4944e4acea9efbcca76d6a902bbd9eb902f72dc892f0637a99218db5bde879c39ce01", + "5d015559999621ab5b06e7cee281fdc36d4172518b0be09a971e4754e4ec08776810d1cb43f4f6933a1f75c332f6d0bb6c37bfd8702123ee7290d8a96d76a89200", + "cc1dcfb5ab1442a6aa682f2c0c6a013f819403d78fbbaed8d97889565af7794f7592a35321dd8c5a79f7737fb46ca9eb74a029d6a3135ccda157c392051ba21e00", + "06c496ed3435da2da30adc5b746c8a081adce7a8b9e34e0cc8a9feac5fbf9ec720cbbfa38dc85df107a1876791ba386e6299ef8cdeb208fc801d2ed15d99b12301", + "8257ed264fdbe5d1c5707a01ab2adbd755e7f1b41f1312e4897147b4bf020c280253881d3586c981e5d0d16aeb3262fb1345e3cfffe2aae45b120499cff7f72200", + "75bb1c6b007c652a19e621d4f91b46d14a92f71786ae02e11571cfaf310a7a376ce301685c0be5457297dd988fcccc692ce0d40966ea144f0999b25844ad3a2e00", + "88a89e4904c48e3875c1c919fa6270db45130bddb5046f4de10644e764b849d81e367599487ea59acac9610e67bcc79fd3be602fb9445084bb1eac69148da21e00", + "65d7e15c2a9bc9d975fea59dad15352049b020039ae9aeb90df41ee70e7f2d4a0c9038fccd55788efa2f235b1481d9768c25e97e2797baf6f0146dc3f1c5c8f101", + "230895aff0622b60f2efe5d11fece62cc5dfae03b99dce4f0f5e811759afbc07523eccadaa3aa4b0cf7c162c4bf8a1a4896cf4b8332951dc76ef17abc3c0b32201", + "ef66f4d53e8a5144c563e131075c25a04ccbb90fa3a2e00a2fa969469804d1e63f1fb0ab7ecf89749b4530b3e760df11393009bfaff34636460eada2c87e0f9300" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA36SKN3dXZZ5C6i1AUPTzJ1dQj89dAvAYXj5tDxHj2ypewHxvNajT7VRBmh5zDUDpmZ3Go1xkRQ8oeE8hKpQMCRiN6nVWPAyieWEZeHZrxP", + "xpub": "xpub6G5nisaXMw7NQanUGVvUMRxMxkxe2de1ukeggcMuHNWoXjd7Tutyzuou34ca8XcQGbbpJdNQoaHgaM1MXWpTMdqdGewtoK4qqMZRay34qzN", + "identifier": "c15e3e18be167abeaf058d05d306e8caddb0b5a0", + "depth": 5, + "child_number": 2, + "address": "22Dy3CYVAVjsxrKfaSRiLdYF1YcfPEzUsWw", + "bitcoin_address": "1JdSK7U3CvrEG6qykx8GtezqKGtfNBeu6g", + "secret": "a23a41f2307d18e9f26ddca64857929b27c3a3aa656d593ddf55980c63bca48a", + "public": "039b5ba2c172368c94ec9ccaa95d6ef21ba58fa634ca166eb025da0a80cc2b7049", + "signatures": [ + "11b7870815c2d923afdbe0bc188892dae43245c14167c29c27204ebe2bf41e2a70c0b33137b9eb31ae5b225377c2c0e447ed171600b5b7e22e44f8b544ae2b6600", + "4ce06ef06c9bc2c504f19fa7fa9ee412a033b5c17e6ecb8bd63511cfd5abffee09a11950deb1fc9116a78d8b6a4ef8d23a066a3e853d2f420f6a52fbfced871200", + "723d9e20fe6269abc8a4efbe83851cff7d4d8ad25e9dc6f54692e28b46c961451b8e071dce1e25090119e69098a82e61160c36a0044ff9bb7848d296e6a45c0500", + "9369245343725ef3f372e6fe6bfcb14cf980fa658da57fde467dc18f8b5da2753e611642d6523e31d810bc9deedebd7e23c276b866c5cbdb0a8f212f216c3ce600", + "7a315c1620b878e488dba804ae50fe69c3d9b91825b05080ae89080715fd70976d4644f73629392a1c9378b08a2b9898f845255777783d3a097b7aeaecba2c1f01", + "6d64a01666c4ece9fdd20154ce033dfbea84ce0bd311812dcf27adceb2044b5c77cc0dbf8ec72bb3e1662b59cf40ae7070faf38139bed246e34c3423883b915400", + "35dc0231b6337fb3e5f450bfbe82799fda44fde1714c20236d34a814d8f0388a13bc101bd53491ad6e2bd41ff3a39e0c4aaca5f8cc8685056c99b72fe3a11b9b01", + "f5be29fb9d8dbc29767127c5ef71e3a59b0c05c84c5f5392dabff9430377588018f63d772573ce5342e47bd5b5096ddcde103c4c1023ceb314b06072ad25354a00", + "f289f20ef5d6ec0e9acc2f58db78477cd9649338d0389f9374303bf75f628adb202cea2dab29c8475035c5bae2416b89e71400e1b63b83974179f6420e6a05d700", + "dd9b1f1b11c6a29b04d24aa9f68bf9b25cf21d04d48ff3a785d71a73b84676262d351c84d7e70700c3c876b66a157980f73da3feeaa725b94b144928d2d3b66701" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA36SKN3dXZZ5CaFsiNyiNZDAWHCD1XijgYyPUYcSU38Wk9HFk6oTdehVaDszELGt2u9ZxFd4cLekHCgY2Kb61YMfZVdQKVBPMzSAABB4zn9", + "xpub": "xpub6G5nisaXMw7NR4LLpQWijh9u4K2hQzSb3mtzGw242NfVcwcQHe7iBT1yRWqETv3m38oQxkRvUCyybo8EfSkm69vNkYg1QRdUHKuQ6w7LyfV", + "identifier": "b5f64d9e2075154ed2f7cbdc976e69eccc3a6e3a", + "depth": 5, + "child_number": 3, + "address": "2E2QQPR5ZmFaKFZP8rvibJmquRPBwTwxQFd", + "bitcoin_address": "1Hb8NAhdHwSiLhoUb5TVUYnUwUSQnCF7G3", + "secret": "6202419dccbad7368b29e0862c5f1d7d18820cc7ba9262dd949fdddd061f7e69", + "public": "035f22cb7b8dae0ea3419f66df05aab375c42cace1ca3e785f5b305f07400243f8", + "signatures": [ + "ed750c25e28f4caad0ece22f6b48163df00834894756bd1498191591aafab8cf513e9cfc06c85b81353d74a2ee00d7f18a5ac0e13fb9240dcafcc1ecbf07e61501", + "1baa492d0d2929c32843e4eb1a396e3f3d21957b7d8f3952420d6ab4d73f466165fc1fd41247c73952e21c62596ae519fc5a4e8bc183ee08103f5c7d76bb4ca600", + "1bcda28e0164653841fba9ba72f3516866976390ae5fbb3c41a31e1e5d52f8693912c7537d68f2f09333698c3440e727a0da1ba80757a0f1f0b764523bcef21e01", + "08f7278074917c906e61880b5d50f186d1bc5f80984a39531d0d37c002d858176e1ecac7cefcc72da4ea634a97e64898437a905eaac1f0f82871cf02711be4aa00", + "0b77d2cae7669ea1c1b9012bfbae2665a8fdd0cafc5cb181b5e1a51895a9ebb31f73d994049da7779368cfff21a25d69745dab98ad2c3a751df872b298dc48fa00", + "d4a1b80939238fb1219fb18a467e835eb1a8bce03b86c593e6ee9c0ccbdbad5c3f4ee89b3fb4174d6e8031811529017490e96d663d79eb5c584d697bfe21e79400", + "3c241111843434352beabedb4b22e812a160ac8db6f7a6dfa5e930692f51bd0f2f3f12fd65b34c41658b82f0e9496abbb7f80b34249ab8931f329632e44daab601", + "cacbd9c16a8f8e6af585e24619ac6bb938030202649be3f99268bbdecb40ed845f894168bbcae6ed3910eacb962339b90ebe60ec4718e7ee9e225b66aae19a7401", + "1c130ab8a0b088c8fd336eadcf584b21289c9272557e9efbdc536d62d587d4e441e7d641ec99cab855a93e72c0dc2059e00409319bcd6df568ce582eda4ec36201", + "925221e4938f4f73b3d846d6edfb1240f43f8d32ef7b98557d3764fc9b44b1134b0c6ca11ceb6d1331410a7f060db77a929b248ebe88ecda25e96fb6526b6b4c01" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA36SKN3dXZZ5H4FpV613xXfDowioVdS2dbQs7zes4ytEQhMLLuH2jubuvFctv8H8j3qtJjn57w6rAnNNLzvjRJ13meTASbxYG56WHYYa6ZM", + "xpub": "xpub6G5nisaXMw7NVYLHb7Y4KfbxMyZHu69szpLTvP4UdKRDHVgUtSbHHhvPmWrRhNhHXhBMEH6gySXJvMTQCED9c2dNkXt59CavT1BmS3sryFa", + "identifier": "965e64ad95508fc97170841c20133c253a29ef07", + "depth": 5, + "child_number": 4, + "address": "24zfb5vcRf4aDzZtDNHsLx8MRhmn4YJUEhW", + "bitcoin_address": "1Ei5SLPEp9zRY4fNJLV8BtKGvYM7FyYtR7", + "secret": "22d2a270b93942de0ccc9a6ec1e972bff0eff3c4830831b837d34b2601a47a0b", + "public": "023d8910e592648d7a7dee8cd9ad381e743cdc093d8473ebc31e3255291916b436", + "signatures": [ + "c80d23f351db74e8c7fa33626ac4567ef43c221c3f1bf8a4f0d7fcd28cdf74c71fbd2c38c0ed28020086747499b990ba3658e38a7fd09a02c8b00e4df250468d01", + "129f77de0dbbbe810d2aaa90108aeccd2c3e3b3a5276c50c3f21e5b054b535432184dab8c3682f97750d5bb762009286aa0a5fa6c19eaed9a4e84c8c7abbb66301", + "2647d4cf223ff1bc72cef3f27be461994b32ed420abee5aba3987b1aae410f9b651af066942b90e1f0b86f642c0238e55e71c8979f93a83e1e127c9eecd96ba500", + "bf6a3284ead814c794a03328804810e9ce8c72cda89e4a4baef8704e16ec4ea170fa208d33994e44eb6b99447ce672511c5660bdec1144b5829188f2977d67c600", + "1ab557cfd027657d051df6e9c5d6bce61222d324ac34e157161392b5d33641f61ff0a3c95b317497f006fe1b21401247e7094ec707d86e3ffea913b45ea3067001", + "743a6453f9579df49389010757aa56c3d5820d2a2d82797e895bfd6b7756754775e76b960d08f321132d38eca7e89fc2e204c05201f9a5ceca6126e3b958054101", + "05e1751299791cb02b3e66d3965d421cb26e7f362e8522fe87ef819864d2a33700603e8cbb0381ca4272c244bea2666784e65c2dfad3123fd3a7c6b8ef83b24601", + "935cc99ae62db2082ff0e021fad8685e5a9fb2931c94cb561d514e802a715815294a5397ba76a9b6e98c6e54cdfbf6818d704b403fac528c0e6d0d565ea64f0101", + "5ffe54b7f15698a74d536a2f21cec631a099c8a684668020752138faa772864569da6ced47dcbe013f433515ccdcdc4ab987d44ad7c571a77ef3d7ac9b459c1e00", + "2bf865e15f9ac8bcdc4e8f37b2b779b8d67d111c785ea5298765652e4268f9b75360d920f017be24fb7d0800bfbb3e71f0fbfdf0ea0690e4a6188822108ac32f01" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA36SKN3dXZZ9VnpyRWE5ocWkjB3TpfiRyjNi4miJ6yMDM1KuvfsVy9dy3tGVLbdyhx3t2e8bhLcNokmFQeayXwxDSfofC5eXsdNAtkfutRb", + "xpub": "xpub6G5nisaXMw7SiGuSXXm6AkTVHCsxE8SHLxJJsA7ufJtCDof4UDBkWwxSu9i6xaygxpsA3oT4imP1UwcYq36NYs768cnGRUffse4nqVMiAJF", + "identifier": "81e9f0c69091b26bdab7e9cc3597218c5c65795e", + "depth": 5, + "child_number": 100, + "address": "2FJPZTBduyndudos8RVPcNUP7NeEN19TNSG", + "bitcoin_address": "1CqvRDi3nBQKJjH7m5vZRmZ8TzfEk7214p", + "secret": "e872043093d649db24be5adb03ee798ca7c8a4529adda857556546978263dde9", + "public": "031e984f536d4acf675514b6a7d113e48d023fdc8e6903002fea2de0258492fcdf", + "signatures": [ + "7888edd4201c7e50d516bf9ad0a2484dc36e0745c2992c679a76683579ddbb8e021761033b2a02eaee4a0e2e0cfa40e3a6e5b5ac183c42ceb341990d4aeae80f01", + "16c86a72d19b8b4ae86327ece22dbc8e8781c144df15cf8ee68e6fdfab8d2b5e68318d8bfa4da79feff828109d2bdd93e9f68a1f1a0200009ce1491d067ccd6400", + "87aa955c19d104d94361eb544ca1d19d5e8b4ccb9a5e6d7bebe57e49d38d5ac11d83eacfaa1a8df800899048f323517135d7859fb61c64c7157cf4d4f1f4432b00", + "702fc5f299af68132ba5ba150061bda5c3bb7f97d1f6332c608fa243eb0d49507a6b363f17de706809e0e9b501ad06cf2f1150a315a36d2f702ae50335c0e1c300", + "5968377134bfe1a3cdd837c02ab430523287f47e295537beb1127da98277baef437ba19933294e2430fd58e4b42bd22e04c3d2a77f0e16707cafa5ffc6e47d4a00", + "d1fcbb01bbe266c647ec1e3f91f66983cba70c5c1d497ad721e546dfa8b7ede00ea92a7043069a5fcc8fbb14ba96b1474ea6659260f6c7c9d8657bbf0f7fef8d00", + "b02e170a4196c55ae521187b7a23e24a232585186aa2eaeae39bcad42958aa882ad4caa701aecf89f91911ff1a14d1327cb1e0ea11aa9271b07b48e41ef47f0300", + "6b600587a4f1356e66938678d9fbde994c10f36a92a1c2ed1b1a4ef22d24b99a62bddaa80667cc4a0149b0992b564fe43ab6524df6937c10334ce39ffab33e7001", + "2bb000bf5071d1dc374b56fb4672b5629181ac86a80707151094815b56a992313181c8482738a324b2a1d900f834e763527c4638df11aafe6f84b73c15fa385d00", + "17688109a3dcdc2ba72ffd2c25cf609d08650762152d569679ad333c0ad802901055cb23786a02726179bcdc704ccaa42e0e00b859b31fc6675bef60968123aa01" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA36SKN3dXZZr5rrGqcxAKegKFiySa7sQYEk1ZYRAxbLih1w5csoYNwh3nrcagiFV4FBxP75XFnaobw3mw7eDY8heGHakpwbxXqKqfZ9bWnm", + "xpub": "xpub6G5nisaXMw89JLvjweVAgnd3okovyabFuTfcMvpnWvshZpGEAR7nvk1Xe7avFSWWSc5KdLsPPcayEJV5NMSVn6RfTBtCai86M3HxyFmqrup", + "identifier": "a5be07cbed614ed137e1ab3f79f4e1e395453534", + "depth": 5, + "child_number": 1024, + "address": "2fvLV4QM1gsRWHG8LsDGTye3hWbv6eYWPH", + "bitcoin_address": "1G7N9CaExgLC1E3Yr6y99qrnheLE4vF8HZ", + "secret": "af05a28f240b790d0a2e0b3fd3a864d1a91e6a854a8bf671debc53dda8546419", + "public": "02a73c78801e3056b83a5a75e7d13bcd49d5ed4c1952e4b010010f03912578462f", + "signatures": [ + "68b881e663c25e80e26e8c30e349a28a4eb1f15b9ab45055bb72a6cdbbf6929c7c9f80bdc44def0810979b9eff6dddf2bdc40399d3e729f2530245a59b97a56c00", + "b820055de945b3aa08098f483fd8882813226cc49504db2586d153e3dc2c46f21c42aca0389351db531220ccb3e741efcc03031c272b24857aa093bd35223e2c01", + "1df1a4a74896bfa01c0f91cf8da52ca0d634d8516e7128013bb2cf71d7aab484080d5c50b7d12a4674e5ddaa9372064ebc303f46c2b3f6ebc42ea09889aaf89900", + "e9f26497605e201b13e616aa7577f70b5c3da3410656ac9496526810003d273941ab74b11e57f3b19c48149ec4046493c0fa2cc2de178fa78bb85f93c395b9bc01", + "51346b2aab4108b41f3edfc3e10137b5fbd4ab8b308576e77ceacedc876af09c19413ebc53c9a71cb0d71755bc776b7e9d33c53d6ae4537a5b9016dcbc747ed000", + "bb6123caa1ea40cc29f956f2387eeac14e18b97fb06f2b665d4bc82716ab56625e1b97e0dd2ae4c83e092f1abdbcbe5ad30ae9d693a1a8f3296e2e17048963e800", + "f5d2869eb7aab39715a1f83f8b807505bb0ef552423e96c4318ba9cb9e4cf3112dd4adf40e51eb3dad5b5f2a9afbe35dfa3779442a37971e646b351b4bf3ff4300", + "cc1b72f6aebb57ca0ced63d36c477cb5fa6ec49b7f8d66fc42f6752d0b53e47a1ccd1a608d0b93ffaae16fa45ab7e11550bd5d48af5b1bd3955360e77f2fb3de00", + "2f951940c8b831b75faea9974ff8ffe6881528fc138ec823939483cecb0a12943f36b690bb04ae142d332ec06787da03943a9f6bf34d693e2e27090bdfdd2e8701", + "395eca1f2c4ad09f52b10c2b2021a28cfd0d28379c5fb06907796666cbefa0ed133b368fad09823fc4f57612e967856a63138fa8d504097f28e8b63c58a576b300" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA36SKN3msE5xsSYdt83qJv8MBVktQqEff9oZ9JHbDxyhxUtStX9Rw3rppmQHo8xatgkr5aobDXa45LkBdAJmSgQb7DADpCeEqqLkxr9X2om", + "xpub": "xpub6G5nisafhbeG5vd6z9aqg455jXbNpHxX2Nj9wghCnJWgqHDbS4TgUrBJg5Xu3WRsVL5w24jokNb8RpCRabhcyUVJ91WsWrcHyKsgbGButva", + "identifier": "ddecc92d14294885d3b62a5b83006b71da75fa91", + "depth": 5, + "child_number": 2147483548, + "address": "kc2jKoqPfrsDG5sdJ38VtxiEXrzQxGnFZs", + "bitcoin_address": "1MERzZgGRLfTSibQZrvzzw4WeGeQ7bRvzQ", + "secret": "1ecca2ba397754b6e0ebe8ec48b46f55ea63b33ffe2a9fce2e60f36870f2eb8c", + "public": "03b726c46139741c19757c9447da0465976c9dd98dc3a4137a0ab209868ebd9cf2", + "signatures": [ + "e93e3d8cfcda69a92b15f6d47b66af2518c3f15e21035371736dc140dc724b723d2aa447ff8b10f02dcc701d8a999945786420bca244fc506e9db6df5fd5575401", + "fb09024f53658c78218225e2232e67ed930edbc40aa275358f330fd9dec2342967e882f386eccffa52016d34c9dadec040632243385af5e0dff3d3b3cc7c6bd201", + "5e94f85e9f7add65978ed662750931e1a5460f5efd493ab337c5b143dbc06df805c852f4e4e968bf9e7e408c2dd650acea89ae0a8259c07ba8ddf6653ec9296b01", + "15338fa498d968b26a7954fd31494edee46d556c0715da39a729f434aa9068e01d13eba4a7244b6d3cdca0cd9c00428efc15c20c14f661f437987dd764bae25c00", + "7d85634d72135f52572eb94d48cdb3ae8fd069390e8a823e462314abcc545e68211dab9e2c67d02dd9ac16fb70d9b0d0fe421c2a4b7951691cc4c7620a2e192100", + "ed4f5ea73f06b7f690f74a6b65cd3205559754ba10db89935bfde2245904c66046d14174518f692390be5c0c299da933f606e26f6d6c86d2665b014e3d21401f00", + "eea1e2320e7524009595f17837944dbe51e8ee4bf88b13e5237d97e82baff108774c66d5048bca55fa7cec9cda732722207eaf87ced7d520be4afeaca1aa4e4701", + "f866fbfc1d88f039d804773304e7063b7c6ba8ba2146924f2f9f2d25f65f9b4f595777296b626ac833b9b7237861644921d4bad67aa77047b3d077de3dd379da01", + "469d6f529d4c5db3ff45f7e4270aa888551f5816c33ec8279058b2de6dc49c9b39f1d1ac80edba63eb0f519f808f06536414c727a6a87da8acdbcfbe072d8ce001", + "efcba60fcd06fa5e2df9f18426af7a4068fc1eff10217a528fa678031510404a6703ef80e805df7af869b227739d80af81c6b7ecd72461fded4244cc30f3fa0c00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA36SKN3msE63EF5qh23NaBa3YF3vQNHzKNxs1S7UMpKCBY5d8XoP3KbFoffT8wR4kuVHVH7BMrP4UWLbhwxyG8a1yEFVyVkMxBtNj2ArRJ9", + "xpub": "xpub6G5nisafhbeLSjAJo3aNwKWn6GtQoq1qgbtTopX5v9rB4LQmg57db7ujexCBDeAqfbimVaxCf7b67Dw1CwYMPKjFJ5G9YQSZXBGbJ4F7xqN", + "identifier": "0cd5648a22ebdb0b19bc6a582af6c3785ae77f2b", + "depth": 5, + "child_number": 2147483647, + "address": "oMwM8oqPV9iQMXVcJKSg4ERS1AXbDmgW9u", + "bitcoin_address": "12Ark6AJEihnbWJNCgGXCei5fYHZMakkh9", + "secret": "10a5ebc558c11f26cf354497156ce7221b2dce61f041c7dfe2ab2dfb14b81c2d", + "public": "02d6198f51baa8f580c5ab1f692cc5eab2e78e78b06152dd38caebae1af6db5c48", + "signatures": [ + "7d3021706c7f03484ef7d2ebb64f72b886bcbd2ffad01db8e88ec68f20a1484b2c78ced7b1c559e3ec21ad75532deffeaa5a7e27079fd418747da64f8814d1cf00", + "1a11a97a537fae4c6e41fe3fcb3651d1f0d60d36d61d7f03185eddc433c00f3c3777445c6ee415e5df81bf59e014614f88a5ca6753a0b3928fe1c4c786ca11d900", + "0cd4eae51114c1503473e41e448bd5f7439115ba8cd07007db0c67e7eb07445343748f7354abb6cb95f1559ee2e90a0d55fee9b59bc737810d9b261e4ba0b9c900", + "4d75498343b976923b35ad7f4a3a24471c84c134b78a5f65f974421dc4aca3694ca097d5e4381c57c6e918a80a9147c5615c929d0741133fe4c8d0d528f2789001", + "8d3e6e24f4663dd754e4cfd40b99c6ed703acaec5812a7fbc39a4c12f56d657539d65dab36176a058acae3e767f02f221229d9a230f8a62a83e7df004df323bf00", + "e00bc1d700b80c41770b692644cda8eda56fad2fe9a11af08a1b6f58c58ce9fc3d491e754f76bfbd5b315c3f034b8ab0621eb0322e700c9b3497137e14e4c51600", + "664602c3c2176eaa1b216c7b2f79a7340d5439f0f79cadea686b1859d16b85d13ec3be26c8383e18ea8fff39a1dbf71ea98b89bd9efbcd2dcc20a70ff762643701", + "b4ecd6481452d09e08c9f86b7a447114dcbd54be4f20156d6cdf6fa7f5dcf29c010d8b27ff22225bdf89151eb43ea62db46aa79a2fb6a39acad05af1435805b701", + "ed215fa63e85c11625cd25a980813b13787872ce938b9317a0026a903a5651cf61f181abba4639abf3cf09442b43e25549833fb1cc53e36ff9bcac01bc40f80801", + "484338e0ecd1aa2bd83c0b104993617bc22eca40375330a64d513b5d07f4b97c2b827bcf5f0c97c2cbdc505ad242a50d84129df358b32f0c260e6abd8b5adbd501" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0008.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0008.golden new file mode 100644 index 00000000..d93b6ba5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0008.golden @@ -0,0 +1,233 @@ +{ + "seed": "nHWmElaBKmYqH+jR4NdOBArvxqs87xM58UsUcEDbBBw=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA2pXopDD7PUbN3BHKXP5fSTB6A86JAT1m42CTrUbEsRDLQnMnFLdMinM1MPg6ppV2vcHPm9vbQytujqCD5upLyKvqFu5nQf5fbKJL1v7yNi", + "xpub": "xpub6FotDKk6wm2taXFkRYv62aPueBxahdAs8GwoGEtCoCxCDD7WKnesuX6preNGY1FvTCPiBagHSJQYXobVvDviVc75nMZguD2w7rgHbh45prZ", + "identifier": "fab50406299adc01bf4c7213a928db4feefb8780", + "depth": 5, + "child_number": 0, + "address": "TqdqsoxpBcMdeh1AZmHZAiF9cE58kDKbgv", + "bitcoin_address": "1Prcn9iToif1KegfM1a3NT81CNjr1chADu", + "secret": "93c5de921924b273c1c8bb2a852c85a0ab4b4e2c5a8d50173133e63fe1d9235a", + "public": "0393f621e6b4a650d6c506e2453839a5479220750c82b694b79388d1719bddcd43", + "signatures": [ + "2d286b10c27c2680b835b8426d994cca0f1a39385c0742eb6666b4daf1318ef67992de4ca699c7d0ddb9849d30082b479a60fbd09c1056fbe863ea0eecf03fc000", + "ae3aac7e46ec47053d9b0e57081e4a3ec216e48eb9507a59088532ccab2ead8d046312e031d3805c995b8e1d57c4ee9f5548a5ede1a73e738d3ad6b3c16c8c5700", + "19b1507a7561d2e21372f60db56e44725fc908dc8f0f9f681a927d68fbf8f8ff113916b05891b328c04e9ededd6345c52faaa37f766e6e9bc4c07daa25da573a00", + "ba679afd2fd61833d19d2dcc12cf3c5684288ad86a8c05899e774d4ba84f055a7982867106a99b28d77846af3c81e8f5f9459024dd0b9001cf3684b40eebf3df01", + "349ec6a71395c1763ff4bf5379d78b32af681672f3d8cb28d7a5fb69c0472e181dccd90ef8d80e2c090ffd82b1319dffea3af7c8ed71f738813e00b2e69dd6a701", + "d8b8d0cadc3f724c209db34d3ad48cfb4e8e9a506e8a16c69a91782440237f594891bc7635911d7f9b64338bcb87d8968c26c7d07d9bf6b71d84b3d0e72e719001", + "8b281b8ab4e0d9814f4af77c8e4a683ee9b4469977219160c7d8d6ead1d528ed728b177ba72331f7be191d12659b2256dca6871862a2fce1f456353b54e5726b01", + "56910275de01632dccdc8f7fcd511a035b93a0ea40ee3c960a6aa02e3e50122a0e24b4fb112a2d9cf53ebaf967c9649ace51d5b8588ce05f815034a0d4f7100d00", + "17e98213da8a2ca177634e20b9551e4b2cd831d62cc0001613cc6e5b3168ae092d6085e441147008935dfc743764d8315b79a50653d4a6871eb60a94a93d3c6c01", + "b6e176dfe29dd5b046b53a5bda8db08ae79d2b7d155c77f144dbdfa81cb9907d10453473249406e4067ed23a1ecf787e5a93a89260dc8f28a2e2559fdd5cc98101" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA2pXopDD7PUbQpsbg9eNjtEnsHWsCqcuJG1YvenDPHToFoE3tVTH9VmmiRNutw1cWqKdTadhz7rpYRiUBkZTC8Moq71L97k9xPS9QYUr3ad", + "xpub": "xpub6FotDKk6wm2tdJx4nBBP72BXRKMMcJLkfUw9j3Bpwczn8bZCS2mXhJ6FZhXECd3Y5GNeZZc4RX6BTw923jV8dPVS5FNELFwTRBixw4HtU6u", + "identifier": "a96bc332ca5d782f2fffc07c0f027b898eac57b2", + "depth": 5, + "child_number": 1, + "address": "5AM94DUGV5EdCD9DZSZdjDKbb3qntYJJnn", + "bitcoin_address": "1GSpHtYVMt9Z37t5magUMFmj9JC2PxK9tr", + "secret": "9b2a1fa82b9777c37c94e6fdd45d4ff0867074becce18fcc0ce8462d357c5126", + "public": "032dbb551459b62da261a484811c463bb7e91d1cf40460e3dac74df282d44c4b0a", + "signatures": [ + "ed1e043460c8e02d010717ff6f37609f53718459bb9949669d07ca849270c55e1bf3471a9b03b9137cdf71f7306f2f1b7a43a98915cb8a694a88d38e5a7d114101", + "e0564265d563770bc70f89c83e8d69588c9d7add30ed8735563af4e866999fd47f50560e59f889f4895b7de788da08c42b787480e78c0e1a00dcaa53006185cf01", + "12c489523fd28ceb4f8a95834002c8ee6b0034ea79bd5fb6704eec42385de9e13b0f4de671cc587a2aee534ef61ef251599df4eb7f8c9130b8f1e8093b71fe5f01", + "7f7d78519769a9aeb506062f08af3e82b051a1969b4d68ce4d2033b3ccfcf75a6e146f650e62172720ebc0896a8bbb00c01075993da5b48f456956e5cd815b1300", + "7965a268ae9f6e1ba388488511cd7e984b661a70777c0bf6c7456b41167a24a00d9c44b1995cd4d9a9f405e79ef6e9b72d68c1639efb9197fa9ea09ee56b586701", + "562944d11309059dfa6613344484331550747f1b09c2df15aec2723b575f5af91a280eab71be9efbcd4f5c968d6de4debaf36f2e4982cb1b0646ba12f023e51400", + "893c520478f042a957ad5c099c99ed8f28b4139603d3d48caeb569def8f641f53b14dce5424bed587cdb5183590477edf16b72b5d7f573031f3839f30472b7c301", + "26bd42cafff01e71a03f986c3908399266b67641ad2ed451b18cc9bc69b0432d73ba9265c415fbde8f925ee913002c0695cfd041001e26923fa677a1d5ba856700", + "83408f4bb423c82effea6e848aad1dc4b72037f05fdc32717f84e5cbcc6d139e48f46b63709ad64d4b5d90be88f3a7680da6b3438a078e5decd132431279d69001", + "cf2416d725b4d03b9481028784e539a57fb2316fa1a8ddc938f2717b524f7ea77264ac7f1adcf3eee8de5c5918079593e615c38a61d40fe6de89a44d798616ca01" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA2pXopDD7PUbSHkEDXaq1PVJMyaYidocMWTqsLCvxFsZq6UG86RiR49V9kJm6fyAHDBBV8gmE1qH1ZUwGKjf7oQzhr7A94iZfKx6ZKZPFDg", + "xpub": "xpub6FotDKk6wm2temphKZ7qNXS2v1R386XTijPSficYWbQYhtoQfdjxxrTy12AXGPi9NHMtxoQDfkpWSbBcTZJ2NVg7YYzrXiQZACaax6LLgFy", + "identifier": "ca5a5e74565b2cc11e5910b60947642aaffab324", + "depth": 5, + "child_number": 2, + "address": "2iWWUMZtEqXMhd8hwEVL1thqUMwJZnTtUPa", + "bitcoin_address": "1KSwkhL9miH97Qg2gh98j2kt3h1W7DRbzF", + "secret": "84d6bd376b119b4c487f2c534239c28d2bb2bc0f0a703c46cad2f1d0a5ed8e0b", + "public": "02f1d165488990533211bf90a0ceea782559c555012f947524ef1f8aa76e3de4c7", + "signatures": [ + "ec7517c6986865267288498a75e25e0d928d51792563458222daa35106aa4a8212eb7d84e9030773b2be265ff2c60f45bf3cc5aafa5c5b17ef0adbe6da4da86700", + "a6dbb94ed5a611f6354a6ce8305ed8b2483eb7d7c383d55098003d30632a58f1281a655bf3586ab85a6a81b71e21bab06208d448e095ff471f50dd3da2c2757601", + "cef2819bcb5114baa09e878876e7e78299e845aba1db7b48fd62945ca1813fc8064b733e3dac9af20ddffb10ebb4278ba62fcaaf7238ff1bb58266a5a0f5402d01", + "3b204db561b8babe97bd5558ca922e25269fab7dcc20ed030d0e3e9e3aed7bac71ceb1deb9360788e4e7450b1969734d601eaa7f1eb95c98562137eee7d2bc7800", + "88dc45af941a7d2a95728df4ad19f4c3ebe336462cf89cce88c0dfdd90794e63415d50d87525a6a1c37a178be4bd980c0e0016f8830dd20cd063e152d1e71f9200", + "a6e1769716670f9ca1068ad886d29fd4b0a4beed5df59a0a196a68adfabfeef56d36e358ad16eef91f4c0e42a9846d1e7defc4b90fb9394ad00a3463a0945a9e01", + "7faa0b00d510581a7f033cbe67df4bc35d5ab84b7a889cd8d6d05af040050dc34faa313795693f6f1e5b9cdb467c2265f73166c725ddd99ca7e238001fb07f0e01", + "6cb7e096f3becfbfe0ae5b7bd8819ea44b6b3eab1b58fd2e061f8154a176ead12734b5ba6db0e0890b1b4e33cf01846ee2afbf7512ffe45c2f8da7d1f3b3637801", + "d319990859e3bbc428025d1945522105bc4c7eb00df15f5037daf68b91e935115f33445c0e13cd1d78ca9a2f96e21f5dd8a2d544049ed666c5bea442506cf8d701", + "3b01502e91da42e53eab14a356162b0b765e7c7cc10b2a41d5c8dfb44075e192478757306af98e1e1a44c2e110eb21e59838a0a875eec402e3fe9f09395fbd9501" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA2pXopDD7PUbUPzRVG3vjkWs7bdzwT5JvVi3khGh9R63tEsgBGMbsoyDQwkhtajWadgx5Jw85LjKHLAfPZLTKwQdtDXpvB2oYteJEmcNQhw", + "xpub": "xpub6FotDKk6wm2tgt4tbHaw6tTbfdUVLuoAHideZ5gJhkd2m3CpiofrRcHhGDB9GghQufCCRozLHnKjHno27JBCV3WMTivzmnBBTBMCdWURgsK", + "identifier": "91fe12a6ad44fde230e26eb5cf25b1a735db9b7c", + "depth": 5, + "child_number": 3, + "address": "wcXaUmVijU2NweTprXDWw4xW4Ypy3SFYT7", + "bitcoin_address": "1EJwM7CfBeDPHMj8UaScQVRW13EwjatSsZ", + "secret": "e33ceb092795e1ca4fbdca896343e73897b108ffacd642711b760bf0cc7d0ebf", + "public": "0316b74ff54c8a99a0268cc3a20c71984159bf87226a67928e481abe46ea968881", + "signatures": [ + "74e6d91632c0349608c06650a36974aca4568aad1284ba8e2697d38c9fe3b62a081f8eaced03b176412613510c34ac66575a14450e49eee41c95685c2244de9e01", + "85614aa67b1b27015c0b7bf3f50820ef13e0693efd2cf05c2a8eaaa28e96a69a4597c782cb411b0dcf667be341904bc46dbeb79b9f4234a4cb671aaf4569319b00", + "3fa82976c181200de4fd683c0a5de3d7435ac8311d26b92b159870b794b6366e33fb95037365a6b26e3773e469d8c3a42cb717d7a960c823a463a71aeb38c50201", + "0a2797595672349391b664cccb425f9665f09b6cf5079d285112cc006677d2874e3d074e708a5cac9bed2d782176802574290094f847b6b826c6de7f09ee003401", + "dda3337ae37a4b998b0a40e2c71f6580a887935c7c50e0f9c0ff7aa28eb3d32679d053683539661e342db42287b715f7942f95fc9233ebd165357513e6da5ffc00", + "ab463cea2e4e6cc1e07ca745d219babdfaaf22feba5560c15606dc9bb1c27720599ac64af0ac37f854b1c16f932cd283f0accbdb595b363c0e7913018ed23aee01", + "babfcc56a0bbef4495a3ce00fd09c707098067cc64ef09e27f0e9f911dd5ab835aae4523687682c186ca8315cf5f37645f44da82f3ad2d495002e7a1fb10814d00", + "c17f4a9d1ec093a01ce84d7aff063cd9f5a7aa4c8be5a776038f22e073e4d57d4d5607a97772e21d6a6756a99e5d1b85fcb351f71fec66e5dc047f579c233cba00", + "c5e9477d09a9182645e6b949e931208abc498ee831a9d8a1789bbae52e8a6df2767b79452113aa96bbd19dcb4f35e4550cb787b0a404452eef67fcab2e11118b00", + "34ab82ac3c865b7b2426bbdfe60142489a02e129b05bd6bc14443c6bfaa5190f659dd38bbd84fbd26497e3bebf6ad5a2f119c515fddd655c3d1ca6fcebe5419400" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA2pXopDD7PUbY8rvdSYb1XLyAo8HwLU3Pmc6wgvXMj29bWGsak2uS9wb7bwFk9v2HX83PcsW82iavzsVGiKMSLRqK1uV71FQa3b8DSefyx2", + "xpub": "xpub6FotDKk6wm2tkcwPjU5bNfHhipxnLoBtkzXhk5L8v4Z8UJc28HM9yxG4xrCoY8FZS32Le1rDquH7uiPwJJJWwJxaJVNRrP6dvZRsFg8Xn9v", + "identifier": "bc418bc8c364db529e22eda04e2ecb890aa86c64", + "depth": 5, + "child_number": 4, + "address": "WSetNApuhRCEn38KrT9Tyr5iu4moGp4KHL", + "bitcoin_address": "1JAQZHNa12F1g9wZQr6VHZXf8sGzsTZzCT", + "secret": "e08911a642319a4185e0b8b442c799a0b716bb29b8db97de205accd58fbed8b7", + "public": "027c22016e9d01ce4e9ab33e6a1fb8b2afd17606e4a6d57fba50149dca21a3eb14", + "signatures": [ + "848ab82159c31fd248b31da3ca57ab4af7084b0bee7e8a047126042dd540791a1e37241f09c681ec5dc05709d0725fa04d24d874f20346e969d5ecb88c349a7a01", + "35ffd3532c1310add7515093de79e7e5d62eff3a849a5a867635e676349718b547ac045cf445942da1b76d2c99b21e8241cba7cbfc17590364d02a49dedec6b501", + "2875d87fb0af2a89456f0aefd46759b0960724f5c79dc5a496880faddaeebeb4314aa8e5e618e5752567ace990dcc2f5e8c10956c0a3337066f47ef9fbb7f50001", + "773b5677af94346829f332e094777b1f6700681267e5f0305099a479b691b9e3700c43e3acf8a11c211e261599ed2e885c41635c02e7b2657f8a32617aaff21701", + "5b778d013cfb3c9e8d05ab24428084d584817baf8d23b6b147238fc40f16550011ad1a70b790d9fbb8b9d3336126ca968d04c2670bf01d9a1fdf77bb737ce48701", + "8b4daa7b3b1ecebf576f255533ab9b9afe7fd9fe1bd6305bf3ef68f6d3e80b6957ef81758bae291f16bd74f5edbe1e2f7fd00a8a17af074c37e1d9d3e85cf1e700", + "24a645417e8483aee61607835293525a23a24cadef18d9bd70b6a48c8600ffd5077d9da75d7309e569487857eebf9101d08eb94673daee27348aeeb482375c1001", + "0ac599329b8051c7cf80d0722b0037090dc5ec51cfcecc9b0b01e60e0a22ddcc249df69a19c06f7eb4f3da00bf38ad7adfc92de44f0cdefedc7330419d30f5b901", + "0bd61b6842f3d562c0f41a58d96cf8e39d0b025e92ca1606a61688bfa4f6eec44a3c31145ec53a0efc7e654d301b99de1a68d0e9420e138d9d45fa95f983fedb01", + "02245cb018f2608797c942f693bf7f1e84452912bffccb3168f70a34e54df0c91ada356f931089f1f1f31c5e44bce85c7b2dea42abcc178c71d80c169122567c00" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA2pXopDD7PUfjGzDG4TA5wwBPMUJo48HeEjbdGB6MtjBgnqj8r9tqKq4fZSYnWqyGC96GDtRNX7FD2GXTnTCG189AWq1nsECeF1KsWhTHXp", + "xpub": "xpub6FotDKk6wm2xwm4gN5zAT5suwPJoCWr91TfCReahvEGAZbAsgPU9P89YWrRKdXwGF3FCiDG3hfTeZrkXMTcXavKo1LeA5YMgtJr5kndwYME", + "identifier": "b2bcc35293358ae99dd840be4f1204ee02615fd1", + "depth": 5, + "child_number": 100, + "address": "mZUFtTnc2JgrW5r96Js6tB7V41VXBN56mb", + "bitcoin_address": "1HJ5QdPwHqcEekbvjeGiv1NxFC1H8F7fbF", + "secret": "e681d653c210cd5b54d112615a057ae450c01ffdbe6c4577bb90a8c874ec7542", + "public": "03e71a70a458c24304e1636a9c77dbd509c20373a32a5987495009e8ebb8a3c0d9", + "signatures": [ + "3c584158820e8637ac0cf3ec826c423bf16bb9e27486ad1767b9cc5fe148d0a7009ee1c300ab06fdfe636439ab2c69e731dc6b5b4e98329edcffb1a3f1dc45c001", + "7999c7641d7ff5bd4a11c4d1fff5249905a9d7d43295d0eb52a8777007682ce7278ce91f12fe763bdeb670ef382c60d8c8600591fee2f23809ab67c729a9157000", + "5aa47375bf3bedde4d74cd7740b9ecf5dff2d9ec8231e92810ff40d68abbf8c417d9bdbe2e2a24f3d32263fabb2b56057da82431c8354dfba57500d878409c3001", + "6e788c56822bad4419a968138bfe501ce45a2747be9806b0f054eadb2c2a2a7028e893d68a8c4230c11b00a6a8623ffa98b69769585aef69d2123752a074d52801", + "abbb60deb4ba734dfcfd2315481843211c35b85f13e955b72968f6746ee1e62170dea96826d11e9cf611a47197669567fcb44e5e7c0cdfe856c1c41ea2ae233a00", + "58f8337d845f81b90625c61ba9f06e3cf68b4a928ba649930f647283150d0cef601b90668ce20d49bc994eb6877b071eb7a2905ca82c75ce928e6873f437b16500", + "18de55e263931d5eae6ba9ddef39ff4b9b6e8c60b9ef47682cc0fe99c1c9cf1d4cfa0fac94711fbacb9071d2396d8f0c2f4dbdccd3e0d4196dbbb4a1a1936b9c01", + "2246ca24ae5f011d3d20ae97d11761085b7ff8897d1695fa15e23bdc730671fb5d07da27c30f6dfdd6341dc320e006c8deb357a6673dc4efcb8b9575ec44eae900", + "36e900bfc907beed2418e1d8093235649db4590f42d50fe41ba81aed592dee323f1987b34a18ddebfdf752b5329b4b9b58494ca2db7e21cad4f85fc7ef0581c600", + "8e8498b20949e99559d8eb1944a404874b6a95641589f8b7db6c735419824461043af32b8500be87bd0a12ae7f1c58a1aac3b051ba0bd9211a48d7c112197d4f00" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA2pXopDD7PVNLiv8wzWHF4gGWvtn2QWnasfs9b9wihomJZX38uE15gBS7EieoAm2kSkxaGcpzVmDaMMNys8ftd5q1ufW54VB81tyTGWgRYR", + "xpub": "xpub6FotDKk6wm3fZCzc423HcCd14xjGRsEdx6bTwyZZH3LkBMrBgSYFdUVuxXQbwb1G7raQhKrLzfxjpxuzfBrEbnuWcHQeQqm3waNwrpSAxsN", + "identifier": "ad894b6ea83033a70248b8209e279e1da9e34c10", + "depth": 5, + "child_number": 1024, + "address": "2TGnVnPxxwb6n7dfAEJcmTrTPteDcJAFHX5", + "bitcoin_address": "1GpaNb2cDc4oes9ZEkewFv4r12ZgyqZiJu", + "secret": "16a0a114eac88cb3abc32f88d122099e3f74ff5b4e35f129b0ff873fabc0f480", + "public": "02f106b5eee64deedb2ec5370c3db51ce36bd29d549b6c7e2a83f227fffb33afd9", + "signatures": [ + "3e22e0d0fd7ff86bbc3d02564244f9e39c39487d345980b661f7095624827e6d1ee5272e27e50dba112327e64c4f663cfd9613ac59d26f8dccfbed83c98501bd00", + "134a01839b7c7f054eb5dbccc73280bd6dceb345f3cff9ee674d55466d68c9555ce5e15ced0ba933d2e63342467364b5f589d2b7e779ab479c33866006a60ca300", + "161163debc5f456527ddf8977e27b0d86876eb1e0788e7e8235108cbb97b5fe86bdcd88863badb47241cef067d248830038ecd5dc502c444be577e92bd49cf4800", + "d81ae0a207483b337110ce8ff69cc8498c27c63d2545b742a09cb36561b9905c132fc7112701e8abe43cf68f23f69eb7ae745cd80f1d20322b95faf367d96edb00", + "17bd6c461cc46b6e71b9e4aea049bed26e144dfe81e1c81f9eb2064ba414783b2986321ebb04956ef96bc9d155ecb5a55baa6d700bae58bb34ecabe6da38391401", + "b4d7917c5e8c1133c5a91c732586ee5a48f5587d7603d97288232240619630cc257c46dcd99a8d3a616e3d5610b4b9504c3fc4b478b6731335fca74cf1bb8c9f00", + "2c38acd89da2d000f66187572f756c6b59ba0fa81b96dea95201e560c5266b182941181b15060907847a6cca905172f7f52798cc106f1b7d4998b4ce98270e2600", + "3fdb7c6de121c12befce96cc39d8320b458d70f2ab3e18c1160e59ede98f38a47303f8027fc8ff66c00340af03949027a31d3bbed47afbcc91f54c4c2480281700", + "2b9b0f82253574f00ff0563624c4b59c141f078d91c218998f3dfb3599e44a0a39709703d66d2c795851c17d0715dcffc1425c407bb6a3e45b4e975f2e48151400", + "f721ed0389977b9039d628812a71ea14be2912060b03d7e20bbf3108a69a7e344978e37220e00cbc41fed65cf0da36e9d1c6360373ff62c8f3d53bbbda5759f701" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA2pXopDMT41V8fUpy8fLh6xo2TSS8bX3msTEr41kfQQ1MgByWNrFuW72jQUfo7eMsunQ3tZMK8Xk5vc5kQ7HJ2zJGACs23HCF9Z7E5ecEgd", + "xpub": "xpub6FotDKkFHRZnM9ZJ5ACM4EuXaVGvY4Eu96NqeSRNDjvzEUX83vAWTJRWagPWvefW6YJoADmGud5WvMrAdopeNcLiimUxihAXTE3srsMGGJC", + "identifier": "52f6e6858ce99ab8d3607f57457832103e8f01e3", + "depth": 5, + "child_number": 2147483548, + "address": "QBdP49hnURgF4bYEY1Pf8TMHL3EUh3cxcy", + "bitcoin_address": "18ZgBgCcYpJcwqaaThHNaQ75MU9P37ubjE", + "secret": "52f3a4ba64d18077679d43a86ba132934c2551a487dd9e7a9943ca638547de53", + "public": "02c6efdee572366c75effe5a05f8fcb0255b43f944c8eb51e5439484aa27ae0786", + "signatures": [ + "92baebdc8135e8dbabacd894f209e9d1cf044f3920c4d031ee79885f44677eb0086ac874aa8c93378742af64d57fec501419a696282693f7d62aba2dc6e9d6a200", + "107578b6d5d69fec7a5607e42f4bd8225fbd04cd423e13d9bcbadbb914f68e37691ad4be2fda8993f4c8bc4affdeb8cc7bf783788bfaadb46700ce99c06a96e500", + "d724277ab98223fd633f99aa1cc9c2299d5fd673b08531701de71a4dec784de840c4cf4fa0d615a5e83aa3eb6ff6efbe778891b5ecc5e64657ef2d9f0b153c6801", + "26a31756db4d6010bdf9081853c68a25f09b902811acf45a1c3a84ec8cdfc9b46a75af21748990609ae0fcb764bbd34a9ab6800cc017aad7591fb0624999976e00", + "48bb88cb592b16729d375a7050fff061bf6754b2a3b1196872db0bfea960552548dad75b9f6533909c6ede0848f39fe574d58a998de989bc2b9c99c5c560f0b301", + "113045e845812e8e89980c06926797e7bec9be7141528b27627f766f32a432235944fe94970e5b4d0a16350f616f2027df99d58fd819ea81a53bc70a2d0b369801", + "4e4bae11d8ac020de91c3d4131436c83a1bc9d47b609c2f1fcf648055a1cbdc028c65ac550f8722a3660901b6053e83d3ba5dd8e88f163a4049d6aa876b20e5f00", + "2d9fb1e77056cd081190e559cf9eb056fb46e3ae9af83dd0f3a9ed478e2e4cc1572df86c9f57d76adfb6c959d7e2b0f259383abb203d5d2cbc25bc9322f0112b00", + "79a626acfa484ab7f4637e9e04faf84aaf166643d83575a78a3ecb279b9e9a6f0d288a37d601af73889a82499defec67d627d38a2c3dc80c21a95ed0978d336401", + "a174fbf2300af6b5055068da3564ec481deba65bc458f633d530a377629a661d735147777844e8cd78a9d2962ff0e6d682445b3d60b7120fe535585cc5ba05a201" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA2pXopDMT41ZVkAsQz42EAN4wKdBcgtvwz4dmw4wM4BfkKrSjYF8rDaayTfLfnZMcZbtfLWmVbe5pgoHh7raRdPcLfoE2cS26kAFXqYqdD2", + "xpub": "xpub6FotDKkFHRZriEFLX1b2bJJoVMTg29cnKCzEaKUYuPied8BbH5ZPQ1u4piyNgLWPUCmvTLVAaBJeN12KRcifzfW33Z8UBpKS46vU8Wj4t2R", + "identifier": "f68411f8fd8d8b1d2b22a13cb2df1f0b671d9d6b", + "depth": 5, + "child_number": 2147483647, + "address": "2iBq8iWqoDHztPjm77xbTDLxmTGDPPULEn5", + "bitcoin_address": "1PUTSbAXGURy2149kqSSzuu6JeDdqunBCm", + "secret": "89e4154fc3fc53a9574948037c269c4c41c3bfc8993c6e63f72e69220a1d261b", + "public": "02aed491f8c8ac1f34f3f2d23e2d22262cbee81bbe390f4bac7f4cc393c184880c", + "signatures": [ + "45b4cf0dec6a7b40c3c8d21debf276aeb055894cf9361a5a8e4b2fea6091b2572b7503c7a1f33f791cac9e54fe56c5afb981f10d51fd06c2c491d4db40ab45c800", + "bde43265626e5c7ca1e9024bc57290cd00813101c50d9ff3fc6f32074cb5f58f45d2f63189733d7a3d903348297548b188499cc665b5c246f2d61962d46efd2001", + "97cdfe39614062c153f1cd1a882f0ee4b8d9da9e76fdcc17b97da7c72c69e8b66c938bf42c14416f4b075e74883905c561e3081a514213c1fbd112b088b6fc8701", + "bcf7023226ef7c859491d3fe682650c784b450dcf23f0d9f5b9379d49b540b391636ad18d9671862203e0a7159eee84fc37a2a1ce951e837b22f6640e5aabd4f00", + "d8cae4d0dda542822987f5052d75ca0245ffadeaa586f3120aed84c1e8528c0d2ae6b0c6969c4a7cf035259aa9dcd93329276d7922c111a67810eae50c3181ed01", + "60009a2ecca2c45b5417c081ba5d0f0151fee0559824ce4ba35040012da916b42bb6d4d9befd0d7c50fb77f76abe416668bc9dd81d36a19a70be59311aad748401", + "5a713679c46cebc0cd3541a976013a0c87607e367f372544c8d4a614dc39bbcd518da08310b8289a5c47b69ab143b7fe336361af17afc6ebfbe405dc0eb4262400", + "c885035bd79f0d650d7804c0584aaa534b0050175c64fcf40e3dd72d8dda93421a7eae924e41137b1db2e21cb715a6f5a18d480c3c73ecc41e01541ca06749f401", + "b4d4445b724e290076b4edc725e528bbd8e124d50dc4cb0312d33ac24c813dfb0b1212a9417d34df16e11781118858557d937e17bba92aee7593c174e0d2aef801", + "95fddd785a113b37eebe27d2f496af93f0c3fd43cfcc2d1b3997ee41cb0ea83c04c3597a6244f17277c430d6c65a2a8e39ad4d8edbb18ea87405ccf96764809a00" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0009.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0009.golden new file mode 100644 index 00000000..40ee334f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0009.golden @@ -0,0 +1,233 @@ +{ + "seed": "QoO+EC/Fy+5nnhFNhp+1aGc40PgOZLgtEGrHyRsnxZU=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA4JhKSdQQ7CvhX85y8tWMmwH5rKsJHJQ5P7jb8iMv5BuPR7vqvorcKzyUa6TcL6HgrgfFEg4pDSTo3ZKyK9Dxvwnh3ZCfXhgQjNzRKdF3sa", + "xpub": "xpub6HJ3ixAJEUmDv1CZ5ARWiut1dtAMhk2FSc3LPX7yUQitGDT5PU87A8KTKq2CfiSUkXG72Tb1bMUjqyV7Zir1vnDaJNwd9sbuhc9Z8fPt588", + "identifier": "247f3ffca231bc338c46eb4a3baaab1bd111e866", + "depth": 5, + "child_number": 0, + "address": "H2LvJRsGmexXvgPtYzhhSUDr14cTJWpCbz", + "bitcoin_address": "14KymPTyGyyUehvqJh66HoMH7MtKV5j9RE", + "secret": "9cc29b58a871649f3f7f87403674e805c8cfaaf57b4e877c4eca7f2ca08cb6cd", + "public": "028f1510484f246592668317fce7a66f64dd1e59aa717b1a6cfa5251c8e32039d0", + "signatures": [ + "3a6e4e6cade31656d899f1d2de25c6167ab99b46b97431b29f6b790aad6db7b864b1f33ff38e83bbcaae0381f2261679ba7db09813ab6d80b28041bbdbf955c201", + "f1c82f9553639842e26554c4c76c50150ff179bc158e8e743332c319d0421b404babef0f40e17cfaf288627121c8faa70a7c1944b8635f1bb2193003cead0b8a01", + "992693f305348c561558a6502f52467f69871dfa980df9953ab19409467ed9a73f52e5bcef4d0ded94897fbd10ec07ef717f9a25a16065cc2795765481ea329701", + "c24d4b744ba367aa5d1c53d0efafd33738357505b3ffba0ab92d5b31af8afa1203b960c64b149771d40e97472aee12536b69deb0467b636f1a75a3d046650f4f01", + "e078c1f3b843be82a9b68b12bb3d00ea6b74291e11c001752e25cc4268e0553455b2fc318681f8e93a4d9960f4ff614ff6046c17836bd64c8d575bcdadaa524301", + "76fb53ccb4d854def019930b2d2f63d5f8d614b6ad44cc6484616e5ebe51bba82989982eb2df93e3e2a569e3f4de4010c00113899fd2764fc2aa627e89cf1a6800", + "c408b9f1e7fdf8d4064c492e357c9c32c87537c4477c2f666e56a11053a0578477124071edd764fbf885c53429add8157490c6d9b55f6d7e4761d1bbb0eba0ec01", + "65f32c78d15c257bc71276643247b0a45ab943f775590e65bae699a5cf6a0fec41b8fa247ed9d862fe67efc2ff67835f0dca156b1fdb8371e3929151c829568401", + "afaceae48c8fa7dee3aa9160d6ae1ca7aa1e6f0fa2d5310ad96e432499d9355f32579ffa9da4c3d201b5f6956040bbf66c054d67b264b04da432dc08061180ab01", + "c7a72b144fe9255c751dcba73996fec8e00d135802d4b546ead9c3e32b15e9c433b1e7efb2a270c8430bd394b1d085201ea3c3a6008ec8e4f61f8937eff1523500" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA4JhKSdQQ7CvkZFZs2pd7kgRCPgSFS17QyumgtPUQdLwC6ci71nPdUdFPdCaJhvknoZvUXznRm8W763iZp4e8pMguHV3ivkKRUAsGpJavsb", + "xpub": "xpub6HJ3ixAJEUmDy3L2y4MdUtd9kRWvetixnCqNVGo5xxsv4twreZ6eBGwjEvjf2Cy2RwFK3sVSSDQhsvMG9Nj7zkfYNdwzaHKsiZmhWeEyMNG", + "identifier": "4401008bb500bf9fb43b5278aa2efa5d5fa600d0", + "depth": 5, + "child_number": 1, + "address": "221SN2x3fVsjbZE6Uy1akayVSsSxbSrfXrQ", + "bitcoin_address": "17Ca9g5gERKFzvDGdxB8JyTuE2JWxTdVwK", + "secret": "1e6959b0f1f247f4d6f6b0adbf7e7923d35971133b762b8ab867f83a079e991e", + "public": "03685dfd3ed4ffbfb5559c2a2c5a1a3f2e5122c754281e089d3f2bfc54e69cef87", + "signatures": [ + "73f9f3e1ecba45a72e7c09a78a5b91ecbbd27625c4b0f7950abb61c49247f6f60e03e92d5177b3e42a935646cba78ee523f258cd293e19861bbe7ab86a7540a400", + "002d1d2bed281e7772625cc973a9de2d474439ed76b029cff0e62791b9fd59ff6ebd8946cd0cc0efe76bfa2b4c89b709669d0c9160a3bc08af58dd971c2d4a1c00", + "de213b04463d58c333ed6bdbf7a23bdcc1cd56c3544c62218d50b4c4c32d270e574a97bdd48c458f1adc7c058fd7db0a5970ed50a62ecd389d94a0e43f7bc20600", + "a550eabf4cd94405b420c521ec0ff846744bb4af8efdcc04e43592809afb0d7e2995f29c17272ab8fe07707034d4c19fa5e952485feeeae1725a0bbe8913ad1100", + "ba716326c11426a0bac159b5f0dbc8c56d4dcbddad7ec9e7f6cfce11e10a9c7417c37fa1553ac2150131082b8a3675a944c153d4cfc44a5cd92e4283f8d3b9f600", + "21968341e2754a540eb19d572e89b2511855089c2064b6575d187ffc4e808c6c2f4ec331b8d932943160c429cb19aeee705c2863802311c4d87e36825f66d76700", + "c36f06fd86ac422c103ecc31f2cb0d3986e6323b72e620999b5cc01344aa58cc3db3ed9398574445f204ec5a38c2aab5d5d841e18c9859a7f1eb5e29762683b001", + "44e2ddd7370a56b05438f31a8660a735533508630d8ccd2abac12d434fde101c4ca2895712863ba012f2cae89941a2d2078ac3de28465e832aaa20caf1aec23e01", + "34155ddec94466e7a5786d5d27fef794cbebebcbe50486761dd37d93c8fa9b1c1d9f63732fa90ca9fdc86c710d01218bf308f02f75756e20299ebc4316d1f71500", + "9eaafc935db0629162046eaa66388c9eca60854be581901ccb005f04cdb52fa04e30e9a4aa3c1c249eacf35beadaaca9b5a1d4caa1b6009ca5192bb3887457d800" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA4JhKSdQQ7Cvnuwvs56Hg2WnLWgEADwFNtaJtxEDLNrvH6m8EuRnR8EZZtFAvP8i6cxSnySZDFbpUp5T7KePpSubK3Mxd1wE7EjTLZ8Q7sv", + "xpub": "xpub6HJ3ixAJEUmE1Q2Py6dJ3ATWtYWiZgf6k7VuhLdptiPu9u6GnSk2xvZ3RA6YNvCNrxGkTfuUh188dWJhtVvJXGZM7jcf5Fn751T5BWUrdJP", + "identifier": "3ccd1ae177d549d2ec43b5027a3f6f8d5eb0fe2e", + "depth": 5, + "child_number": 2, + "address": "shXCYh4ZyQSBfSQe19tVUdeNvPmNvmHFVj", + "bitcoin_address": "16YVFTQVn61dL2JDf8c4rsSYMm2juqZ6w7", + "secret": "09261875a89f6304f0c9addb5e3ed61e0149aff5590deaa8779ebf8e665e03f8", + "public": "02753d2682845b36ae569a6a16eb15dc5e8fcd85bffabe1db428c00a10c0db238a", + "signatures": [ + "5604db204c65e8470187cf8ca3de8be4bfa59da40f46a10b62832c05176cc25976d4fa2ec41c03bc650d1e4aa5f8b2d7618e90ded3120c30dbdbf0f029fd5aa900", + "edc20dbf3ddb758da5a9e5315fa1a223ed917203a07f89aa6c87053d64e952c21d4f840fc4cdb233d6ba8aacf81ac843f7a56150a80f7dbb42ab8b2bc0c06fba00", + "5012b0ac4cb79c0911763ad90db1dc659c9e0ad394a51af7c85f4935be9a4de147c0effdbafd222f068a1bd0b66555085336ad3098ef3a5d0b1175097f8012d901", + "087f1963d741dd3ff222b9514cc0d906ca02992bed39643462457dcdefa3bc8639d8b6e746d18209edc63a66af0a880b90c63acde5b5fa898b47398238b8777b00", + "b4ed47f9eca987d3d0008b952caaa99b982914bb7be07d5f131ffa674f3d933d07a6927fa01a22bdaafe2f7a21788c6f47d878b23de39c5d0632515b17c9ee9601", + "1b3d5b0d5ad2030f535c35459ac56e19267692ff843b44ea7c1b0c74bce9bdd57f9cdbf37ffecc5ed79906bed5738e2ce768579c523103ee6134811a4317736801", + "3b0cc7c9cdc06e897b20b40e518d86a67b189eb40697ed6fd58e2f09e27f36245d497eef6bb6c28f4247cc7fd3c6cc789bd11aa63e1e0d9827014bf52301e82600", + "17461cf3e03e5cdc95dac2bc1e7e1328ad0d6655043620d31a27679028db2df64c27e1edb23b26e6b6ac29c59c63d87cc523d6c1810fbc4f1d6602e17981292501", + "33608650edeff9d7e4eacb3b77b594ba0954bf34120ca543d34718fe10f1ce7463e8bdf8fa5652641b6adbdc4aacad59e975243502dbfe7906c621408e7fa45b00", + "26595a9943df3b7c57baee922e90061b27faceba12f0c7c2925f65ee1fe4aedf49ec4c0fd58aa69bc2a3c6feae7f8c743bb14d63182cfaedc51a7d4bd503887000" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA4JhKSdQQ7Cvs1kCwCFxbPdUDyv6cKAbVw1KSdopuz6ZP31N97tVMq7iAY5bZpeexuCVDM1pHYgJbqPmvVGgBQyZ37m7Bkt8dE9veHYtfcj", + "xpub": "xpub6HJ3ixAJEUmE5Vpg3DnxxXaCn1kb1mtSs9vvF2DSUKdYFqLWgfCjudSC1oj9hWiz5VpNNz2NB265XjrJjHsAx4EcJNdrpB6ZwApfV1LAXTQ", + "identifier": "af93344b591975a41e130ca4cd1b79a58b82f8e7", + "depth": 5, + "child_number": 3, + "address": "bRjURMXshhfasXNyu6Q1LCMYADsSTRKD2p", + "bitcoin_address": "1H1MbW9sqYwzgkc88KuJiF9BUhhLGghjQk", + "secret": "430384666da1bffae02d1a5e6776a75e5ca35fd4fdb8d48a572a8738627dfc52", + "public": "02944634e732d294cf72390a11819daad59f509d99bf316f70f038cb2442d1097f", + "signatures": [ + "f8371112885d06e38f94b2c011e5edddb819ea54cc8f877b10d5f2abbf080df64b4ea64ce63928ea5cc76c34165edd10b84a33892eb5b263d202297aa7e098c700", + "2e0eb74ca891faea2a0b2338674ad56573e96c61b7256a29928600a90c91a52542f69a648f5d28b7b8a99bbb99628b57cdb6405a807949c901e678a24f55b76100", + "5ec42c90386ce51cb942bd686448307bb2e8da409150c1c45686967c89596368187824c244dbad18f8f7b81e2bff74e34e37686e3cc7c61a4e14f6460851f28500", + "bfc87b1f60c12a3e242b51a1ae4d9885baa325e8e97c4d9dce90efc9d2dd79a8703245b7152276fea5c4831c14abd16d3f94b3f2368d5a205c60d81489f7ca9101", + "72c8326c35603a98fd07f71ca2083e087d4f803348b8906a9b479f9cf41604d77cf47493fee2b7fe81dddce4daae656ab7ece379b3156ebc1bd5f2ce8ea9bf4600", + "ff6fcb6834ea1e90cb5712b9ec13c74e1a2adb139184c7d9369514abddc0338970636620d93beb5e50cffac45059807f146c14d3adbfcd76a0d82d387eef6d7301", + "90612212c1e92db794dca964daa1a2375715680f7e771afc847c5f49fe140b7474b6b2d472d2e2f9661d049f247c93be45d48e702221dd0a7a285427731553a101", + "8d12a3266361efd01a6e8f8401fd9bd29689cadadafa21cbabdfe6927617eecf2cee93f554ba9d77c849e45b119d29ff3c8d128acab83cd72acc485e12e06de801", + "40f3a5476aa0d2002bfd49e7d917705f21c9667fc51886fadd8e8433801b8279309160ca6fe295759ec7c4bdfd76836e6f2b7effe3035f628eb2e7576b23731b01", + "6b98b1526f9f4aecea2a952dcaff250b279bea49a61bc90c502e108b8ce008884bab5f19ceaa06626e55876753a44e80458695294478da81dbdcf2c174289c0a01" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA4JhKSdQQ7CvucHsNZtZwGhPoJyXgB1M6yTBh6ecCzj4qMUe1NkebERpThccdLCuxuWhJsyNraVGbrv5nA1zmjxPjpf99jhKfkMwaPeQ5Yp", + "xpub": "xpub6HJ3ixAJEUmE86NLUbRaJQe8MLp25djCUCNnVV4DmLG3i9onYv4u92kJK2JF7kCav5bnhmx1YmyYQZ3apL67rGp8T2fgKkZWQcy7oGnTuwy", + "identifier": "78227668af2f756d60f8a4cfe98ceb08820d6936", + "depth": 5, + "child_number": 4, + "address": "25jmhUgi71TKZVNPpaxT5umyXEiuYcojYmS", + "bitcoin_address": "1BxDNX5QS1vczcmSq1bBiq8mrfCXaUMbpf", + "secret": "015b641efb18f90c08dec4490c8b10edbe51ee7bcbd4a1dffd8bbf90dff890e3", + "public": "03e26ae8ce501f7f3f3f7915abf518db3ab8a78466ec3aa49d6c0f825733a80d6d", + "signatures": [ + "2d9126ba49e9882a0249697254faec9d6cbcb97ade9063c21c97a7b253321c1e79da33e3f5729bde9cadeec373ce0dcd5e51cc726fcdb194b278368ec9324d8e01", + "1419446f7a125efa9acc5606b3836bb1db7a6a1343c3da33afcfffcd1698e84274d664412a46466880ecf9591df1c6830be7bcfd597e959546b9ceff766c37fa01", + "a9b2b0edcbd0b8f0f394839ad11bd1baf23a064e5fc5ed9bf1acd9e95a92a31b5bedbfa0c4709f0733e1cdfd1da45a2c42e9b5bfa210d13295bc2108e9158baf00", + "8139315815d8077e5bacaec3490b3cf67850df73cec67b19442d2ea886f7b28760771ea211a2a9caf4be71b407c8ec4202f25f0cefd37f36b40c3e285986114501", + "9bd80bce5f14158376d459cab7b9673ab0dc8c3ee5d11746a12edf4e2fcec9ab7ae7394b36addc324f07a99ac0ee5f663b8e7e6682790e320797dc37c119b4aa01", + "6ac99c416d57d5b34d4021b866e47f97d70f1dd6f46ba09b11665633383eeaa809b7911a401f053020490426980977790a179fee4bd1cd39e86607c08992dc0c01", + "3d4c7d74a54b18185b5c21373dd55d7b1a3e33179280cd98a4189372af8eadbd7435b828bcc25b0e0f2c5705354e1dcc1c2aad94261784eed7f53ccd0082cbac01", + "ec1bc2a6b562b84b9fa935dab32f0bd3ee443fff22344c7b5c79f9e58a694c1e5f17e6eadb7c760be1eec9cb9c42c34af60cd91d4afbb20538178ec4ad9057eb01", + "9b97e3d14c54c524e4824141660cc407e3ed461d97fa97a7e45609b9708e32ed3115cbd008c7ed074d0ed4bb7c4000d659ac82b86c9c8b951268e0bda5896ca101", + "e6839674c06402169066ccb53d70184cba2b07c3005506c919685480427367c27258eb87a44ba22b7f65ac66cabb9cd7b15bccebfb9193479f8a62f96113f96700" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA4JhKSdQQ7D18rfBxChUMfhdkD4e7XtLYKutEHAn4uZ8MzR8YykkGEkuCtxUJPmjynAFE4ju3jFhysqhCtYzdoEWBke5bMnMvJCcaCSdQRk", + "xpub": "xpub6HJ3ixAJEUmJMLjf4EEUioeNJEu8WzcBuYqV2faPdF67EnkH6X4zp35P4ChGc9v3pRQ6dqxAX1TZkjMm2bi7cbtU59igRGmHbgSSrvZnyFN", + "identifier": "25803aac87eaf1641445a637e8c475101240b561", + "depth": 5, + "child_number": 100, + "address": "ZkS8VRWpnb3af4kNzM35i7xZbdQTAJaYQb", + "bitcoin_address": "14RHccsHZ4AEjFLrSujrF75wZJ5NmdUxBp", + "secret": "53959039f3067e1b0754f0494af00058df9838db8fc11314676ec5130b2eef0a", + "public": "03b825195ea0169aa16889509aa6ece904b9e016deb2c743baa43f48c961c024db", + "signatures": [ + "fd17c5ac47e1abea30de46abdc4b09907af112d45005537c56b479106bea59c40a282a7aaea447b36bdd1b631fca5c41519e3500084c0f2b3bc8db7b4e6c50cf01", + "dac190c6d3aee7f3a033fe83ab281ca5395d5b5f6ffadf65649a239886d26bdf5b20392fdc39e6a3e65f270dcbd509804b93872e144ce9ef10aa97e936fb9da101", + "4cb35288a0e08b8e6e961dda795522b77225986bc08efc1d18d223b33b928a6f20411fdfa5481a0928df6eb246e70fe9b7b63f0e97d170e442a65d47caaf3a1301", + "b58e2aeaececacbf02d78f9fc789c2d38fd75d93a25863ee7a37fdb9f03050446406ea7e601b135a850c4ef23848602a863f3eb986a4f6a7babb9f6df1054bd300", + "ebe476f6227291c1a1bc0a6e7eece6e875beb6fa9bc683b2f7cdb4daea3341c6471cb4e798ef07a4fe534c3827b7711f3999318c4d14212d3457a3facf8e82b301", + "0f91120f69fe48dfc62d1c2cc7e3100dbfc2b12d35c0b4e99a3dc821f15ce9ed33e4ed341c8897e51a4777d345fed73f5bb15d46825d75637a9c8ae8bb36457a01", + "9b81ad6cbdee36fd0406301209d84501784a90adc7fd5641df5ea8580b5dc8aa17751d5451baeedb104174aeccc42808ebc2de9fc9db9c9ded32be7c2ad03c3200", + "7f99bb1d1b66d6ef16aabfad3e4ed8c5697320927097248d4958bc6e75a279ce7bfe4508edf5da4e80e8de655d08720e516cbb4f8a33221284a4c320f9b88bda01", + "b14387c2c0f93b90cd8663fada9d14d7592eab30cc6bd468aa517fdd1fff7755099040e5db4db6bdad4a115df461298a45e7589bb0130548ce43eb8acc04bbb700", + "e8c7f60462bec7cdc889ccf6157746c6bcc67f7eae8278b10383466b9b6d553555a466d986228a8a60741f63af27fc42e9b5c4106b8746f5457aa96ebd92dd9700" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA4JhKSdQQ7Dhj6pZ97qS54SfkEHdBZguQEHKGEhShwLhaEsJ2d1aJ2ihe1E2yothEPS7kQ9S523z578agvAVT7uXqzdUoNQXZr7JrgH2jB2", + "xpub": "xpub6HJ3ixAJEUmzwau2F9NSSCPQJG87b2QkmTCv4d74GGsgT3CSaAKpqq3BVJjoj9q5k95Ka9XBHnLH7ptU7HRcCu8oU5K726KHFSSkApSNj2z", + "identifier": "a22478122f973b0e4f5d253ee3fe1ef6b5074ded", + "depth": 5, + "child_number": 1024, + "address": "2EHn6xNgZ9a67bPtAtRB7dCAJHiECwcaiPT", + "bitcoin_address": "1FnL9zMw2An8qhcrkNPV6kYpqVSQUsnUwa", + "secret": "9384c058c07447b7d020e0377dc614bf982de7114a4302a63579deb86402187d", + "public": "03da800849098e0c5abcdd9dea1bda611c8195106caa13d6caf3b402da9d920613", + "signatures": [ + "c48302c51a3ebbfdc669beaa18308babff89878aab899d2e94044041dd6da0a83964e6df8b32075956fb99e75c0333a7455a51c47e89297419b687697424f5f901", + "879a9e17a7312be700afdb63190419cf03a9322d89899ff2a05362cb163bad123e4c86ef82f1c327945e14552f697c1dceb64a1e967a69d6a2110ac4621305f800", + "c8224dba96b555f027bc78f54b963131ca08b2b17bad31ca9cba2bc743a199273465320a8624a775f0d0aff9af8e2a557fa500e931ef85853bcdc729ce53839001", + "4338280a69f6457156acead6f706c1c0dba83c7426ec915ef38f7d303e7f87ad7c3facdab2ee1bc5118d938f8b807c6dbf9f262ba8790747aeac8994cb9f18e300", + "407f018d1ed39b66b1da788c09b77714882645c11769886d6a6c301d44a6c7705ded9b89eb88c4428910db0dc954d59b0f6dcc6f5d6c9c190fc34e2b1a50df3b00", + "1a2b9516ef295ecd74b6a48164434400ff2388eabadb4f59b14e8637020bbdf4135455b5f7e0ac9ce067af72403cf4aa76e8f7d0e34c19af4e1496c22d9d332e00", + "eaacbd9193997d7636cbe1751968b78d854775b472ab313b30f3f5eb4d517f0318799693869ddb37b0c99bb039c370bcfc4778afd739e22ec2f54433641d529c01", + "c7ed254b9606ed22ab3e29ee8b314d530b014a39273dda507558f427181bf8100a9aad6e260850f5087e736d7631f81efcfbf736c304ecfb79d2b436f993f30f00", + "9c64358cf53300c867b8b6f3fc44e94b67d6e85dc657326afa6c31479801b9941b29ccd4dee36e053946c912a37aa4ef5852bd81270bb7b1ced0ca327ab596a501", + "3deb6f7e9e63b44916c82aa96040565367172b9b849f68b0b670d4b5e0a5d6b843eee7c874b361f35677ac3ac40fb7db5cfc98ec962a63156476743bf3707d4d00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA4JhKSdYjmjpWDp7fZngLn3555skaePuCd6G8ofrS3ppbJJ2fUS866kp21BWiJC3P5ZBPaSMh1tgMTCXhYNnczDhqYvVkXZWWzGx3zsHKEV", + "xpub": "xpub6HJ3ixASa9J7ihtambKghuyod7iEz77kZr1rwC5TzPMoU6dBD1kNdu5HsEmmezbSvgHkdPgreN7gkafQK5HjcnBZZNnii56p43hUG84SYhM", + "identifier": "b3fd3ce3d75e5662398e140dc02aec463cc21406", + "depth": 5, + "child_number": 2147483548, + "address": "dUR6iUdRVM81inzyjmaExNoNcb7fdTNetX", + "bitcoin_address": "1HQhKcVu8yaE2dsgkH4pd1JqUmJUtNs14P", + "secret": "e70c0cb188ad34c1ec4d1ce7e01f3ac8791315905915b41ff8b612e092d27742", + "public": "02296e39bece343f378b32dd954343e8c80c51c7726c6e7dc3b6378bd287b9bec5", + "signatures": [ + "68ba65a993100d2986635e1996faac09dfe4966f4d5855249c6c0d8b9df4b989052ff41da4f27dec238ab791649bf362f5f8721debeac99d1cf66a26d4cf7a1701", + "db1458848613f5956c066f4293923520882014c9550a99c2da07da22939879d0537b77a0ef5609d7a6beb15fcb1ccfcf12ce8252f0ac152924b931a8678eb65900", + "8522f9b4add8e423f018e6285a68b206e9165d3e08d83a16a8e72f743b4a15317ae9245bdcf386e0f8a6c72c2b3a264cdafcca5cbe099284225203ab33347c3e00", + "41936e1a7075e1b989b3e3eb7b996a2218c825a4633aa5df7b89bf8f86dc29c87876552beac3e5df7f60ad9c95133b23db7378f4363586aad925a79fe4df85ff00", + "55454771d9798d3c8609bc8530f03f63e6803a335e6fe749da635734da0eb45b1b099a704f86ec2686e4948d8ffa98eed122427668e80be9c2e73d1c9c91d39100", + "96ff23d27aeeb35c7e7516d16e49dc142d0feaef8ae437ffd62f279ed52f983b371d05e755cedfe2f1a2a7d6cf05c3b54caa96b162ebaef05e86abcf8fc4db2000", + "40d9d294f9156ce35c05df860981605904673ad97cfeb896f3a5036e94fe702b7680e0cb524b0937f37a268ea1847a46c3b3cf813935edc07b83a2649790178901", + "2ba1620ff7f0446eb23df59d6246bf3dc01bfb0495fa8b094af2becb51be13e103def7fd1a7d6cb99943f647a6b68a0898a5f0645ad6c622af58deef647bf48c01", + "260e1376304047fd67787f763ae8400314835712de5b262c259f1f27da60895a3ba1806a460113e528016dab34761e664c297c683f43b8dd1f5098d78faae90401", + "d012b216822fe71605c8876e5d5c3b1a243db5f0310554d2ee39171d175b0ef7645094206b9c4c410891ae8f3456ea5d8aaf06b4af104c22932797a5bb48703801" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA4JhKSdYjmjtqdazBVcXirTdn2EzTedKT76LVbGngDH1cNFnSAFc7WQf5vVoL4QfcFzUATAfXkS4cvD4ZFcZTLZFrkEYgQoCq1gWRg39eGF", + "xpub": "xpub6HJ3ixASa9JC47fTHX9Y5zQNL45Us7MApL1wHygQEYozVAavyhZrfJj8wDnHqvVZSyHs3LePrZ3VptmQtNE9JxTMRGMuffRuhCELR72qpKp", + "identifier": "f0336f412f5acb38268e89f793b638b7f685cce0", + "depth": 5, + "child_number": 2147483647, + "address": "2VrywEebQKtq1exXLgReUtNFJiqfbbgFZgK", + "bitcoin_address": "1Nu4nn5M6qG3ZgyaSo5JaGop27m6vdDurR", + "secret": "a1787c17f19360c572d70b615a651083f22d38c35c281cc66b23cbdecd206436", + "public": "03ca4c73d0f2092822c6ab230c42b43580f752a3379be413a07d76f2e7ec9a9f07", + "signatures": [ + "88e77c3681c9485b92222613cc676aa57c9029438969aa80d28905d32ccf5f4a27433a8b46853fe7093faae1b861f505b83c9c9655ee774c7ea38fdff6627e6c01", + "dde2e5c5b977f5be5681d9e66d353589267c03e20c11b970508883c45ae29dcc565e2dc47bd4b3408ea2a223343270f906cb0dda7fdade0b8ea65035771f10fc01", + "c99f20bda63d4af58a835b7a42ef70155334bab3e9621efdec7ee4c75a6331450a6adb5744ad5d9e852d8d21d8fdcb4dd25397c2e58cf46014f329f74f8414ec00", + "5f9634525bb5340d16747d05a072e958b577b96c1798697b30e2e0fefe9800557284dc0711a29db56ce3726cf779bda24b0b79e7e9783fba2a5f0dab41fae13501", + "4d80ca47a02aab0875fefffb8fa51af5f26a3e93b2671f2961bcbadbd511dde164178f2c2ed58c8d9d6561e879c376fbdbde8b8d2d44f2cabb53bba45686e45000", + "052e91dee950a22d52df20cd392bc2ac22ee01501cc0d6a9b0a29dd28cb0338e705c4ebf9c0b84611ffe0ece3373e4732cb3a151924807e4fdbe153bc11faaa401", + "bec9ae7d66eccea4c3bc9baa514beb23ccd3fe0960df2cb28e75dd5fc999b3f17c621ad8ea56284d7e458e1a6a91a5a32b1545da3dc471634409c26e845ac3d801", + "420d755f280476a7ddfaa11be6bef78f228badf2962299d949a5bc3e7355629e39e449896bc6debce53bf8d6b85ad4a8d32a64a339e7f0d9d80d380e16e719fc00", + "932e98f53317d68cd591097ba5a48cbf59b04fffefa40b6bd141a3b3ed7786353a9c687c1cacfabc393c38027dd35508746b3a79ebe2c5884c50e97a432e204700", + "8acd8d53a958922f1db3cb29b7c3c5679adaaa1edb4fe3e654ecbb32dd4ad9591c34d59ec4bf3d4784b475f550e27f6632b9326687a199a007e0d9f102475bb300" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite.go new file mode 100644 index 00000000..70e6cfc8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite.go @@ -0,0 +1,527 @@ +/* +Package testsuite is the cipher testdata testsuite +*/ +package testsuite + +import ( + "bytes" + "encoding/base64" + "encoding/hex" + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/base58" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" +) + +// InputTestDataJSON contains hashes to be signed +type InputTestDataJSON struct { + Hashes []string `json:"hashes"` +} + +// KeysTestDataJSON contains address, public key, secret key and list of signatures +type KeysTestDataJSON struct { + Address string `json:"address"` + BitcoinAddress string `json:"bitcoin_address"` + Secret string `json:"secret"` + Public string `json:"public"` + Signatures []string `json:"signatures,omitempty"` +} + +// SeedTestDataJSON contains data generated by Seed +type SeedTestDataJSON struct { + Seed string `json:"seed"` + Keys []KeysTestDataJSON `json:"keys"` +} + +// Bip32KeysTestDataJSON contains address, public key, secret key and list of signatures +type Bip32KeysTestDataJSON struct { + Path string `json:"path"` + XPriv string `json:"xpriv"` + XPub string `json:"xpub"` + Identifier string `json:"identifier"` + Depth byte `json:"depth"` + ChildNumber uint32 `json:"child_number"` + + KeysTestDataJSON +} + +// Bip32SeedTestDataJSON contains data generated by Seed +type Bip32SeedTestDataJSON struct { + Seed string `json:"seed"` + BasePath string `json:"base_path"` + ChildNumbers []uint32 `json:"child_numbers"` + Keys []Bip32KeysTestDataJSON `json:"keys"` +} + +// InputTestData contains hashes to be signed +type InputTestData struct { + Hashes []cipher.SHA256 +} + +// ToJSON converts InputTestData to InputTestDataJSON +func (d *InputTestData) ToJSON() *InputTestDataJSON { + hashes := make([]string, len(d.Hashes)) + for i, h := range d.Hashes { + hashes[i] = h.Hex() + } + + return &InputTestDataJSON{ + Hashes: hashes, + } +} + +// InputTestDataFromJSON converts InputTestDataJSON to InputTestData +func InputTestDataFromJSON(d *InputTestDataJSON) (*InputTestData, error) { + hashes := make([]cipher.SHA256, len(d.Hashes)) + for i, h := range d.Hashes { + var err error + hashes[i], err = cipher.SHA256FromHex(h) + if err != nil { + return nil, err + } + } + + return &InputTestData{ + Hashes: hashes, + }, nil +} + +// KeysTestData contains address, public key, secret key and list of signatures +type KeysTestData struct { + Address cipher.Address + BitcoinAddress cipher.BitcoinAddress + Secret cipher.SecKey + Public cipher.PubKey + Signatures []cipher.Sig +} + +// ToJSON converts KeysTestData to KeysTestDataJSON +func (k *KeysTestData) ToJSON() *KeysTestDataJSON { + sigs := make([]string, len(k.Signatures)) + for i, s := range k.Signatures { + sigs[i] = s.Hex() + } + + return &KeysTestDataJSON{ + Address: k.Address.String(), + BitcoinAddress: k.BitcoinAddress.String(), + Secret: k.Secret.Hex(), + Public: k.Public.Hex(), + Signatures: sigs, + } +} + +// KeysTestDataFromJSON converts KeysTestDataJSON to KeysTestData +func KeysTestDataFromJSON(d *KeysTestDataJSON) (*KeysTestData, error) { + addr, err := cipher.DecodeBase58Address(d.Address) + if err != nil { + return nil, err + } + + btcAddr, err := cipher.DecodeBase58BitcoinAddress(d.BitcoinAddress) + if err != nil { + return nil, err + } + + s, err := cipher.SecKeyFromHex(d.Secret) + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(d.Public) + if err != nil { + return nil, err + } + + var sigs []cipher.Sig + if d.Signatures != nil { + sigs = make([]cipher.Sig, len(d.Signatures)) + for i, s := range d.Signatures { + var err error + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + } + + return &KeysTestData{ + Address: addr, + BitcoinAddress: btcAddr, + Secret: s, + Public: p, + Signatures: sigs, + }, nil +} + +// SeedTestData contains data generated by Seed +type SeedTestData struct { + Seed []byte + Keys []KeysTestData +} + +// ToJSON converts SeedTestData to SeedTestDataJSON +func (s *SeedTestData) ToJSON() *SeedTestDataJSON { + keys := make([]KeysTestDataJSON, len(s.Keys)) + for i, k := range s.Keys { + kj := k.ToJSON() + keys[i] = *kj + } + + return &SeedTestDataJSON{ + Seed: base64.StdEncoding.EncodeToString(s.Seed), + Keys: keys, + } +} + +// SeedTestDataFromJSON converts SeedTestDataJSON to SeedTestData +func SeedTestDataFromJSON(d *SeedTestDataJSON) (*SeedTestData, error) { + seed, err := base64.StdEncoding.DecodeString(d.Seed) + if err != nil { + return nil, err + } + + keys := make([]KeysTestData, len(d.Keys)) + for i, kj := range d.Keys { + k, err := KeysTestDataFromJSON(&kj) + if err != nil { + return nil, err + } + keys[i] = *k + } + + return &SeedTestData{ + Seed: seed, + Keys: keys, + }, nil +} + +// ValidateSeedData validates the provided SeedTestData against the current cipher library. +// inputData is required if SeedTestData contains signatures +func ValidateSeedData(seedData *SeedTestData, inputData *InputTestData) error { + keys := cipher.MustGenerateDeterministicKeyPairs(seedData.Seed, len(seedData.Keys)) + if len(seedData.Keys) != len(keys) { + return errors.New("cipher.GenerateDeterministicKeyPairs generated an unexpected number of keys") + } + + for i, s := range keys { + if err := validateKeyTestData(inputData, s, seedData.Keys[i]); err != nil { + return err + } + } + + return nil +} + +func validateKeyTestData(inputData *InputTestData, s cipher.SecKey, data KeysTestData) error { + if s == (cipher.SecKey{}) { + return errors.New("secret key is null") + } + if data.Secret != s { + return errors.New("generated secret key does not match provided secret key") + } + + p := cipher.MustPubKeyFromSecKey(s) + if p == (cipher.PubKey{}) { + return errors.New("public key is null") + } + if data.Public != p { + return errors.New("derived public key does not match provided public key") + } + + addr1 := cipher.AddressFromPubKey(p) + if addr1 == (cipher.Address{}) { + return errors.New("address is null") + } + if data.Address != addr1 { + return errors.New("derived address does not match provided address") + } + + addr2 := cipher.MustAddressFromSecKey(s) + if addr1 != addr2 { + return errors.New("cipher.AddressFromPubKey and cipher.AddressFromSecKey generated different addresses") + } + + btcAddr1 := cipher.BitcoinAddressFromPubKey(p) + if btcAddr1 == (cipher.BitcoinAddress{}) { + return errors.New("bitcoin address is null") + } + if data.BitcoinAddress != btcAddr1 { + return errors.New("derived bitcoin address does not match provided bitcoin address") + } + + btcAddr2 := cipher.MustBitcoinAddressFromSecKey(s) + if btcAddr1 != btcAddr2 { + return errors.New("cipher.BitcoinAddressFromPubKey and cipher.BitcoinAddressFromSecKey generated different addresses") + } + + validSec := secp256k1.VerifySeckey(s[:]) + if validSec != 1 { + return errors.New("secp256k1.VerifySeckey failed") + } + + validPub := secp256k1.VerifyPubkey(p[:]) + if validPub != 1 { + return errors.New("secp256k1.VerifyPubkey failed") + } + + if inputData == nil && len(data.Signatures) != 0 { + return errors.New("seed data contains signatures but input data was not provided") + } + + if inputData != nil { + if len(data.Signatures) != len(inputData.Hashes) { + return errors.New("Number of signatures in seed data does not match number of hashes in input data") + } + + for j, h := range inputData.Hashes { + sig := data.Signatures[j] + if sig == (cipher.Sig{}) { + return errors.New("provided signature is null") + } + + err := cipher.VerifyPubKeySignedHash(p, sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifyPubKeySignedHash failed: %v", err) + } + + err = cipher.VerifyAddressSignedHash(addr1, sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifyAddressSignedHash failed: %v", err) + } + + err = cipher.VerifySignatureRecoverPubKey(sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifySignatureRecoverPubKey failed: %v", err) + } + + p2, err := cipher.PubKeyFromSig(sig, h) + if err != nil { + return fmt.Errorf("cipher.PubKeyFromSig failed: %v", err) + } + + if p != p2 { + return errors.New("public key derived from signature does not match public key derived from secret") + } + + sig2 := cipher.MustSignHash(h, s) + if sig2 == (cipher.Sig{}) { + return errors.New("created signature is null") + } + + // NOTE: signatures are not deterministic, they use a nonce, + // so we don't compare the generated sig to the provided sig + } + } + + return nil +} + +// Bip32KeysTestData contains address, public key, secret key and list of signatures +type Bip32KeysTestData struct { + Path string + XPriv *bip32.PrivateKey + KeysTestData +} + +// ToJSON converts Bip32KeysTestData to Bip32KeysTestDataJSON +func (k *Bip32KeysTestData) ToJSON() *Bip32KeysTestDataJSON { + sigs := make([]string, len(k.Signatures)) + for i, s := range k.Signatures { + sigs[i] = s.Hex() + } + + return &Bip32KeysTestDataJSON{ + Path: k.Path, + XPriv: k.XPriv.String(), + XPub: k.XPriv.PublicKey().String(), + Identifier: hex.EncodeToString(k.XPriv.Identifier()), + Depth: k.XPriv.Depth, + ChildNumber: k.XPriv.ChildNumber(), + + KeysTestDataJSON: KeysTestDataJSON{ + Address: k.Address.String(), + BitcoinAddress: k.BitcoinAddress.String(), + Secret: k.Secret.Hex(), + Public: k.Public.Hex(), + Signatures: sigs, + }, + } +} + +// Bip32KeysTestDataFromJSON converts Bip32KeysTestDataJSON to Bip32KeysTestData +func Bip32KeysTestDataFromJSON(d *Bip32KeysTestDataJSON) (*Bip32KeysTestData, error) { + addr, err := cipher.DecodeBase58Address(d.Address) + if err != nil { + return nil, err + } + + btcAddr, err := cipher.DecodeBase58BitcoinAddress(d.BitcoinAddress) + if err != nil { + return nil, err + } + + s, err := cipher.SecKeyFromHex(d.Secret) + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(d.Public) + if err != nil { + return nil, err + } + + var sigs []cipher.Sig + if d.Signatures != nil { + sigs = make([]cipher.Sig, len(d.Signatures)) + for i, s := range d.Signatures { + var err error + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + } + + xPrivBytes, err := base58.Decode(d.XPriv) + if err != nil { + return nil, err + } + + xPriv, err := bip32.DeserializePrivateKey(xPrivBytes) + if err != nil { + return nil, err + } + + identifier, err := hex.DecodeString(d.Identifier) + if err != nil { + return nil, err + } + + if !bytes.Equal(xPriv.Identifier(), identifier) { + return nil, errors.New("xpriv identifier does not match identifier") + } + + if xPriv.Depth != d.Depth { + return nil, errors.New("xpriv depth does not match depth") + } + + if xPriv.PublicKey().String() != d.XPub { + return nil, errors.New("xpub derived from xpriv does not match xpub") + } + + if xPriv.ChildNumber() != d.ChildNumber { + return nil, errors.New("xpriv child number does not match child number") + } + + return &Bip32KeysTestData{ + Path: d.Path, + XPriv: xPriv, + + KeysTestData: KeysTestData{ + Address: addr, + BitcoinAddress: btcAddr, + Secret: s, + Public: p, + Signatures: sigs, + }, + }, nil +} + +// Bip32SeedTestData contains data generated by Seed +type Bip32SeedTestData struct { + Seed []byte + BasePath string + ChildNumbers []uint32 + Keys []Bip32KeysTestData +} + +// ToJSON converts Bip32SeedTestData to Bip32SeedTestDataJSON +func (s *Bip32SeedTestData) ToJSON() *Bip32SeedTestDataJSON { + keys := make([]Bip32KeysTestDataJSON, len(s.Keys)) + for i, k := range s.Keys { + kj := k.ToJSON() + keys[i] = *kj + } + + return &Bip32SeedTestDataJSON{ + Seed: base64.StdEncoding.EncodeToString(s.Seed), + BasePath: s.BasePath, + ChildNumbers: s.ChildNumbers, + Keys: keys, + } +} + +// Bip32SeedTestDataFromJSON converts Bip32SeedTestDataJSON to Bip32SeedTestData +func Bip32SeedTestDataFromJSON(d *Bip32SeedTestDataJSON) (*Bip32SeedTestData, error) { + seed, err := base64.StdEncoding.DecodeString(d.Seed) + if err != nil { + return nil, err + } + + keys := make([]Bip32KeysTestData, len(d.Keys)) + for i, kj := range d.Keys { + k, err := Bip32KeysTestDataFromJSON(&kj) + if err != nil { + return nil, err + } + keys[i] = *k + } + + return &Bip32SeedTestData{ + Seed: seed, + BasePath: d.BasePath, + ChildNumbers: d.ChildNumbers, + Keys: keys, + }, nil +} + +// ValidateBip32SeedData validates the provided Bip32SeedTestData against the current cipher library. +// inputData is required if Bip32SeedTestData contains signatures +func ValidateBip32SeedData(seedData *Bip32SeedTestData, inputData *InputTestData) error { + mk, err := bip32.NewPrivateKeyFromPath(seedData.Seed, seedData.BasePath) + if err != nil { + return err + } + + if len(seedData.ChildNumbers) != len(seedData.Keys) { + return errors.New("len(seedData.ChildNumbers) must equal len(seedData.Keys)") + } + + for i, n := range seedData.ChildNumbers { + k, err := mk.NewPrivateChildKey(n) + if err != nil { + return err + } + + if err := validateBip32KeyTestData(inputData, seedData.BasePath, seedData.Seed, k, n, seedData.Keys[i]); err != nil { + return err + } + } + + return nil +} + +func validateBip32KeyTestData(inputData *InputTestData, basePath string, seed []byte, s *bip32.PrivateKey, childNumber uint32, data Bip32KeysTestData) error { + path := fmt.Sprintf("%s/%d", basePath, childNumber) + pathXPriv, err := bip32.NewPrivateKeyFromPath(seed, path) + if err != nil { + return err + } + + if s.String() != pathXPriv.String() { + return errors.New("xpriv generated with NewPrivateChildKey differs from xpriv generated with NewPrivateKeyFromPath") + } + + pubKey := cipher.MustNewPubKey(s.PublicKey().Key) + secKey := cipher.MustNewSecKey(s.Key) + + if cipher.MustPubKeyFromSecKey(secKey) != pubKey { + return errors.New("pubkey derived from bip32 key does not match pubkey derived from bip32 key converted to cipher key") + } + + return validateKeyTestData(inputData, secKey, data.KeysTestData) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite_test.go new file mode 100644 index 00000000..e848465f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite_test.go @@ -0,0 +1,111 @@ +package testsuite + +import ( + "os" + "path/filepath" + "regexp" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +const ( + testdataDir = "./testdata/" + manyAddressesFilename = "many-addresses.golden" + inputHashesFilename = "input-hashes.golden" + seedFileRegex = `^seed-\d+.golden$` + bip32SeedFileRegex = `^seed-bip32-\d+.golden$` +) + +func TestManyAddresses(t *testing.T) { + fn := filepath.Join(testdataDir, manyAddressesFilename) + + var dataJSON SeedTestDataJSON + err := file.LoadJSON(fn, &dataJSON) + require.NoError(t, err) + + data, err := SeedTestDataFromJSON(&dataJSON) + require.NoError(t, err) + + err = ValidateSeedData(data, nil) + require.NoError(t, err) +} + +func TestSeedSignatures(t *testing.T) { + fn := filepath.Join(testdataDir, inputHashesFilename) + + var inputDataJSON InputTestDataJSON + err := file.LoadJSON(fn, &inputDataJSON) + require.NoError(t, err) + + inputData, err := InputTestDataFromJSON(&inputDataJSON) + require.NoError(t, err) + + seedFiles, err := traverseFiles(testdataDir, seedFileRegex) + require.NoError(t, err) + + for _, fn := range seedFiles { + t.Run(fn, func(t *testing.T) { + fn = filepath.Join(testdataDir, fn) + + var seedDataJSON SeedTestDataJSON + err := file.LoadJSON(fn, &seedDataJSON) + require.NoError(t, err) + + seedData, err := SeedTestDataFromJSON(&seedDataJSON) + require.NoError(t, err) + + err = ValidateSeedData(seedData, inputData) + require.NoError(t, err) + }) + } +} + +func TestBip32SeedSignatures(t *testing.T) { + fn := filepath.Join(testdataDir, inputHashesFilename) + + var inputDataJSON InputTestDataJSON + err := file.LoadJSON(fn, &inputDataJSON) + require.NoError(t, err) + + inputData, err := InputTestDataFromJSON(&inputDataJSON) + require.NoError(t, err) + + seedFiles, err := traverseFiles(testdataDir, bip32SeedFileRegex) + require.NoError(t, err) + + for _, fn := range seedFiles { + t.Run(fn, func(t *testing.T) { + fn = filepath.Join(testdataDir, fn) + + var seedDataJSON Bip32SeedTestDataJSON + err := file.LoadJSON(fn, &seedDataJSON) + require.NoError(t, err) + + seedData, err := Bip32SeedTestDataFromJSON(&seedDataJSON) + require.NoError(t, err) + + err = ValidateBip32SeedData(seedData, inputData) + require.NoError(t, err) + }) + } +} + +func traverseFiles(dir string, filenameTemplate string) ([]string, error) { //nolint:unparam + files := make([]string, 0) + if err := filepath.Walk(dir, func(_ string, f os.FileInfo, _ error) error { + if !f.IsDir() { + r, err := regexp.MatchString(filenameTemplate, f.Name()) + if err == nil && r { + files = append(files, f.Name()) + } + } + return nil + }); err != nil { + return nil, err + } + + return files, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/add_private_key.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/add_private_key.go new file mode 100644 index 00000000..edde0003 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/add_private_key.go @@ -0,0 +1,133 @@ +package cli + +import ( + "fmt" + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func addPrivateKeyCmd() *cobra.Command { + // TODO -- allow private key to be entered privately, same as the password can be + addPrivateKeyCmd := &cobra.Command{ + Short: "Add a private key to wallet", + Use: "addPrivateKey [wallet] [private key]", + Long: `Add a private key to wallet. + + This method only works on "collection" type wallets. + Use "skycoin-cli walletCreate -t collection" to create a "collection" type wallet. + + Use caution when using this from your shell. The private key will be recorded + if your shell's history file, unless you disable the shell history. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered from the + history log. If you do not include the "-p" option you will be prompted to + enter your password after you enter your command.`, + SilenceUsage: true, + Args: cobra.ExactArgs(2), + DisableFlagsInUseLine: true, + RunE: func(c *cobra.Command, args []string) error { + walletFile := args[0] + skStr := args[1] + + password, err := c.Flags().GetString("password") + if err != nil { + return err + } + pr := NewPasswordReader([]byte(password)) + + err = AddPrivateKeyToFile(walletFile, skStr, pr) + + switch err.(type) { + case nil: + fmt.Println("success") + return nil + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + }, + } + + addPrivateKeyCmd.Flags().StringP("password", "p", "", "wallet password") + + return addPrivateKeyCmd +} + +// AddPrivateKey adds a private key to a wallet.Wallet. Caller should save the wallet afterwards +func AddPrivateKey(wlt *wallet.CollectionWallet, key string) error { + sk, err := cipher.SecKeyFromHex(key) + if err != nil { + return fmt.Errorf("invalid private key: %s, must be a hex string of length 64", key) + } + + pk, err := cipher.PubKeyFromSecKey(sk) + if err != nil { + return err + } + + addr := wlt.AddressConstructor()(pk) + + entry := wallet.Entry{ + Address: addr, + Public: pk, + Secret: sk, + } + + return wlt.AddEntry(entry) +} + +// AddPrivateKeyToFile adds a private key to a wallet based on filename. +// Will save the wallet after modifying. +func AddPrivateKeyToFile(walletFile, key string, pr PasswordReader) error { + wlt, err := wallet.Load(walletFile) + if err != nil { + return WalletLoadError{err} + } + + if wlt.Type() != wallet.WalletTypeCollection { + return fmt.Errorf("only %q type wallets can have keypairs added manually", wallet.WalletTypeCollection) + } + + if pr == nil && wlt.IsEncrypted() { + return wallet.ErrMissingPassword + } + + addKey := func(w *wallet.CollectionWallet, key string) error { + return AddPrivateKey(w, key) + } + + if wlt.IsEncrypted() { + addKey = func(w *wallet.CollectionWallet, key string) error { + password, err := pr.Password() + if err != nil { + return err + } + + return wallet.GuardUpdate(w, password, func(wlt wallet.Wallet) error { + return AddPrivateKey(wlt.(*wallet.CollectionWallet), key) + }) + } + } + + if err := addKey(wlt.(*wallet.CollectionWallet), key); err != nil { + return err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return err + } + + if err := wallet.Save(wlt, dir); err != nil { + return WalletSaveError{err} + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/address_gen.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/address_gen.go new file mode 100644 index 00000000..1ea4c180 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/address_gen.go @@ -0,0 +1,329 @@ +package cli + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func addressGenCmd() *cobra.Command { + addressGenCmd := &cobra.Command{ + Short: "Generate skycoin or bitcoin addresses", + Use: "addressGen", + Long: `Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, _ []string) error { + numAddresses, err := c.Flags().GetInt("num") + if err != nil { + return err + } + if numAddresses <= 0 { + return errors.New("num must be > 0") + } + + coinName, err := c.Flags().GetString("coin") + if err != nil { + return err + } + + coinType, err := wallet.ResolveCoinType(coinName) + if err != nil { + return err + } + + encrypt, err := c.Flags().GetBool("encrypt") + if err != nil { + return err + } + + mode, err := c.Flags().GetString("mode") + if err != nil { + return nil + } + + label, err := c.Flags().GetString("label") + if err != nil { + return nil + } + + hideSecrets, err := c.Flags().GetBool("hide-secrets") + if err != nil { + return nil + } + + seed, err := resolveSeed(c) + if err != nil { + return err + } + + var password []byte + if encrypt { + switch strings.ToLower(mode) { + case "json", "wallet": + default: + return errors.New("Encrypt flag requires -mode to be json") + } + + var err error + password, err = PasswordFromTerm{}.Password() + if err != nil { + return err + } + } + + w, err := wallet.NewWallet(wallet.NewWalletFilename(), wallet.Options{ + Coin: coinType, + Label: label, + Seed: seed, + Encrypt: encrypt, + Password: password, + CryptoType: wallet.DefaultCryptoType, + GenerateN: uint64(numAddresses), + Type: wallet.WalletTypeDeterministic, + }) + if err != nil { + return err + } + + if hideSecrets { + w.Erase() + } + + rw := w.ToReadable() + + switch strings.ToLower(mode) { + case "json", "wallet": + output, err := json.MarshalIndent(rw, "", " ") + if err != nil { + return err + } + + fmt.Println(string(output)) + case "addrs", "addresses": + for _, e := range rw.GetEntries() { + fmt.Println(e.Address) + } + case "secrets": + if hideSecrets { + return errors.New("secrets mode selected but hideSecrets enabled") + } + for _, e := range rw.GetEntries() { + fmt.Println(e.Secret) + } + default: + return errors.New("invalid mode") + } + + return nil + }, + } + + addressGenCmd.Flags().IntP("num", "n", 1, "Number of addresses to generate") + addressGenCmd.Flags().StringP("coin", "c", "skycoin", "Coin type. Must be skycoin or bitcoin. If bitcoin, secret keys are in Wallet Import Format instead of hex.") + addressGenCmd.Flags().StringP("label", "l", "", "Wallet label to use when printing or writing a wallet file") + addressGenCmd.Flags().Bool("hex", false, "Use hex(sha256sum(rand(1024))) (CSPRNG-generated) as the seed if not seed is not provided") + addressGenCmd.Flags().StringP("seed", "s", "", "Seed for deterministic key generation. Will use bip39 as the seed if not provided.") + addressGenCmd.Flags().BoolP("strict-seed", `t`, false, "Seed should be a valid bip39 mnemonic seed.") + addressGenCmd.Flags().IntP("entropy", "e", 128, "Entropy of the autogenerated bip39 seed, when the seed is not provided. Can be 128 or 256") + addressGenCmd.Flags().BoolP("hide-secrets", "i", false, "Hide the secret key and seed from the output when printing a JSON wallet file") + addressGenCmd.Flags().StringP("mode", "m", "wallet", "Output mode. Options are wallet (prints a full JSON wallet), addresses (prints addresses in plain text), secrets (prints secret keys in plain text)") + addressGenCmd.Flags().BoolP("encrypt", "x", false, "Encrypt the wallet when printing a JSON wallet") + + return addressGenCmd +} + +func resolveSeed(c *cobra.Command) (string, error) { + entropy, err := c.Flags().GetInt("entropy") + if err != nil { + return "", nil + } + + switch entropy { + case 128, 256: + default: + return "", errors.New("entropy must be 128 or 256") + } + + seed, err := c.Flags().GetString("seed") + if err != nil { + return "", nil + } + + strictSeed, err := c.Flags().GetBool("strict-seed") + if err != nil { + return "", nil + } + + if seed != "" { + if strictSeed { + if err := bip39.ValidateMnemonic(seed); err != nil { + return "", fmt.Errorf("seed is not a valid bip39 seed: %v", err) + } + } + + return seed, nil + } + + useHex, err := c.Flags().GetBool("hex") + if err != nil { + return "", nil + } + + if useHex { + seed = cipher.SumSHA256(cipher.RandByte(1024)).Hex() + } else { + e, err := bip39.NewEntropy(entropy) + if err != nil { + return "", err + } + + seed, err = bip39.NewMnemonic(e) + if err != nil { + return "", err + } + } + + return seed, nil +} + +func fiberAddressGenCmd() *cobra.Command { + fiberAddressGenCmd := &cobra.Command{ + Use: "fiberAddressGen", + Short: "Generate addresses and seeds for a new fiber coin", + Long: `Addresses are written in a format that can be copied into fiber.toml + for configuring distribution addresses. Addresses along with their seeds are written to a csv file, + these seeds can be imported into the wallet to access distribution coins.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) (err error) { + if len(args) > 0 { + return errors.New("this command does not take any positional arguments") + } + + fiberNumAddresses, err := c.Flags().GetInt("num") + if err != nil { + return nil + } + + entropy, err := c.Flags().GetInt("entropy") + if err != nil { + return nil + } + + addrsFilename, err := c.Flags().GetString("addrs-file") + if err != nil { + return nil + } + + seedsFilename, err := c.Flags().GetString("seeds-file") + if err != nil { + return nil + } + + overwrite, err := c.Flags().GetBool("overwrite") + if err != nil { + return nil + } + + if fiberNumAddresses < 1 { + return errors.New("num must be > 0") + } + + switch entropy { + case 128, 256: + default: + return errors.New("entropy must be 128 or 256") + } + + addrs := make([]cipher.Address, fiberNumAddresses) + seeds := make([]string, fiberNumAddresses) + + for i := 0; i < fiberNumAddresses; i++ { + e, err := bip39.NewEntropy(entropy) + if err != nil { + return err + } + + seed, err := bip39.NewMnemonic(e) + if err != nil { + return err + } + + _, seckey, err := cipher.GenerateDeterministicKeyPair([]byte(seed)) + if err != nil { + return err + } + addr := cipher.MustAddressFromSecKey(seckey) + + seeds[i] = seed + addrs[i] = addr + } + + _, err = os.Stat(addrsFilename) + if err != nil { + if !os.IsNotExist(err) { + return err + } + } else if !overwrite { + return fmt.Errorf("-addrs-file %q already exists. Use -overwrite to force writing", addrsFilename) + } + + _, err = os.Stat(seedsFilename) + if err != nil { + if !os.IsNotExist(err) { + return err + } + } else if !overwrite { + return fmt.Errorf("-seeds-file %q already exists. Use -overwrite to force writing", seedsFilename) + } + + addrsF, err := os.Create(addrsFilename) + if err != nil { + return err + } + defer func() { + cErr := addrsF.Close() + if cErr != nil { + err = cErr + } + }() + + seedsF, err := os.Create(seedsFilename) + defer func() { + cErr := seedsF.Close() + if cErr != nil { + err = cErr + } + }() + + for i, a := range addrs { + if _, err := fmt.Fprintf(addrsF, "\"%s\",\n", a); err != nil { + return err + } + if _, err := fmt.Fprintf(seedsF, "\"%s\",\"%s\"\n", a, seeds[i]); err != nil { + return err + } + } + + return nil + }, + } + + fiberAddressGenCmd.Flags().IntP("num", "n", 100, "Number of addresses to generate") + fiberAddressGenCmd.Flags().IntP("entropy", "e", 128, "Entropy of the autogenerated bip39 seeds. Can be 128 or 256") + fiberAddressGenCmd.Flags().StringP("addrs-file", "a", "addresses.txt", "Output file for the generated addresses in fiber.toml format") + fiberAddressGenCmd.Flags().StringP("seeds-file", "s", "seeds.csv", "Output file for the generated addresses and seeds in a csv") + fiberAddressGenCmd.Flags().BoolP("overwrite", "o", false, "Allow overwriting any existing addrs-file or seeds-file") + + return fiberAddressGenCmd +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/addresscount.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/addresscount.go new file mode 100644 index 00000000..92769127 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/addresscount.go @@ -0,0 +1,26 @@ +package cli + +import ( + "github.com/spf13/cobra" +) + +func addresscountCmd() *cobra.Command { + return &cobra.Command{ + Short: "Get the count of addresses with unspent outputs (coins)", + Long: "Returns the count of all addresses that currently have unspent outputs (coins) associated with them.", + Use: "addresscount", + Args: cobra.NoArgs, + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getAddresscount, + } +} + +func getAddresscount(_ *cobra.Command, _ []string) error { + addresscount, err := apiClient.AddressCount() + if err != nil { + return err + } + + return printJSON(addresscount) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/blocks.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/blocks.go new file mode 100644 index 00000000..8015304d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/blocks.go @@ -0,0 +1,49 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" +) + +func blocksCmd() *cobra.Command { + blocksCmd := &cobra.Command{ + Short: "Lists the content of a single block or a range of blocks", + Use: "blocks [starting block or single block seq] [ending block seq]", + Args: cobra.RangeArgs(1, 2), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getBlocks, + } + + return blocksCmd +} + +func getBlocks(_ *cobra.Command, args []string) error { + var start, end string + start = args[0] + + if len(args) == 1 { + end = start + } else { + end = args[1] + } + + s, err := strconv.ParseUint(start, 10, 64) + if err != nil { + return fmt.Errorf("invalid block seq: %v, must be unsigned integer", start) + } + + e, err := strconv.ParseUint(end, 10, 64) + if err != nil { + return fmt.Errorf("invalid block seq: %v, must be unsigned integer", end) + } + + rlt, err := apiClient.BlocksInRange(s, e) + if err != nil { + return err + } + + return printJSON(rlt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/broadcast_rawtx.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/broadcast_rawtx.go new file mode 100644 index 00000000..8ad1a6be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/broadcast_rawtx.go @@ -0,0 +1,29 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func broadcastTxCmd() *cobra.Command { + return &cobra.Command{ + Short: "Broadcast a raw transaction to the network", + Use: "broadcastTransaction [raw transaction]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: func(_ *cobra.Command, args []string) error { + rawtx := args[0] + + txid, err := apiClient.InjectEncodedTransaction(rawtx) + if err != nil { + return err + } + + fmt.Println(txid) + return nil + }, + } + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance.go new file mode 100644 index 00000000..5e002aac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance.go @@ -0,0 +1,259 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// Balance represents an coin and hours balance +type Balance struct { + Coins string `json:"coins"` + Hours string `json:"hours"` +} + +// AddressBalances represents an address's balance +type AddressBalances struct { + Confirmed Balance `json:"confirmed"` + Spendable Balance `json:"spendable"` + Expected Balance `json:"expected"` + Address string `json:"address"` +} + +// BalanceResult represents an set of addresses' balances +type BalanceResult struct { + Confirmed Balance `json:"confirmed"` + Spendable Balance `json:"spendable"` + Expected Balance `json:"expected"` + Addresses []AddressBalances `json:"addresses"` +} + +func walletBalanceCmd() *cobra.Command { + return &cobra.Command{ + Short: "Check the balance of a wallet", + Use: "walletBalance [wallet]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + RunE: checkWltBalance, + } +} + +func addressBalanceCmd() *cobra.Command { + return &cobra.Command{ + Short: "Check the balance of specific addresses", + Use: "addressBalance [addresses]", + Long: `Check balance of specific addresses, join multiple addresses with space. + example: addressBalance "$addr1 $addr2 $addr3"`, + Args: cobra.MinimumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: addrBalance, + } +} + +func checkWltBalance(c *cobra.Command, args []string) error { + w := args[0] + balRlt, err := CheckWalletBalance(apiClient, w) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + return printJSON(balRlt) +} + +func addrBalance(_ *cobra.Command, args []string) error { + numArgs := len(args) + + addrs := make([]string, numArgs) + + var err error + for i := 0; i < numArgs; i++ { + addrs[i] = args[i] + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + balRlt, err := GetBalanceOfAddresses(apiClient, addrs) + if err != nil { + return err + } + + return printJSON(balRlt) +} + +// PUBLIC + +// CheckWalletBalance returns the total and individual balances of addresses in a wallet file +func CheckWalletBalance(c GetOutputser, walletFile string) (*BalanceResult, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + var addrs []string + addresses := wlt.GetAddresses() + for _, a := range addresses { + addrs = append(addrs, a.String()) + } + + return GetBalanceOfAddresses(c, addrs) +} + +// GetBalanceOfAddresses returns the total and individual balances of a set of addresses +func GetBalanceOfAddresses(c GetOutputser, addrs []string) (*BalanceResult, error) { + outs, err := c.OutputsForAddresses(addrs) + if err != nil { + return nil, err + } + + return getBalanceOfAddresses(outs, addrs) +} + +func getBalanceOfAddresses(outs *readable.UnspentOutputsSummary, addrs []string) (*BalanceResult, error) { + addrsMap := make(map[string]struct{}, len(addrs)) + for _, a := range addrs { + addrsMap[a] = struct{}{} + } + + addrBalances := make(map[string]struct { + confirmed, spendable, expected wallet.Balance + }, len(addrs)) + + // Count confirmed balances + for _, o := range outs.HeadOutputs { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.confirmed.Coins += amt + b.confirmed.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + // Count spendable balances + for _, o := range outs.SpendableOutputs() { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.spendable.Coins += amt + b.spendable.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + // Count predicted balances + for _, o := range outs.ExpectedOutputs() { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.expected.Coins += amt + b.expected.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + toBalance := func(b wallet.Balance) (Balance, error) { + coins, err := droplet.ToString(b.Coins) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: coins, + Hours: strconv.FormatUint(b.Hours, 10), + }, nil + } + + var totalConfirmed, totalSpendable, totalExpected wallet.Balance + balRlt := &BalanceResult{ + Addresses: make([]AddressBalances, len(addrs)), + } + + for i, a := range addrs { + b := addrBalances[a] + var err error + + balRlt.Addresses[i].Address = a + + totalConfirmed, err = totalConfirmed.Add(b.confirmed) + if err != nil { + return nil, err + } + + totalSpendable, err = totalSpendable.Add(b.spendable) + if err != nil { + return nil, err + } + + totalExpected, err = totalExpected.Add(b.expected) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Confirmed, err = toBalance(b.confirmed) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Spendable, err = toBalance(b.spendable) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Expected, err = toBalance(b.expected) + if err != nil { + return nil, err + } + } + + var err error + balRlt.Confirmed, err = toBalance(totalConfirmed) + if err != nil { + return nil, err + } + + balRlt.Spendable, err = toBalance(totalSpendable) + if err != nil { + return nil, err + } + + balRlt.Expected, err = toBalance(totalExpected) + if err != nil { + return nil, err + } + + return balRlt, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance_test.go new file mode 100644 index 00000000..c2cff384 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance_test.go @@ -0,0 +1,262 @@ +package cli + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestGetBalanceOfAddresses(t *testing.T) { + addrs := []string{ + testutil.MakeAddress().String(), + testutil.MakeAddress().String(), + testutil.MakeAddress().String(), + } + + hashes := make([]string, 10) + for i := 0; i < len(hashes); i++ { + h := testutil.RandSHA256(t) + hashes[i] = h.Hex() + } + + cases := []struct { + name string + outs readable.UnspentOutputsSummary + addrs []string + result *BalanceResult + err error + }{ + { + name: "confirmed == spendable == expected", + outs: readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashes[0], + Address: addrs[0], + Coins: "99.900000", + CalculatedHours: 3000, + }, + { + Hash: hashes[1], + Address: addrs[0], + Coins: "0.100000", + CalculatedHours: 120000, + }, + { + Hash: hashes[2], + Address: addrs[2], + Coins: "23.111111", + CalculatedHours: 123, + }, + }, + }, + addrs: addrs, + result: &BalanceResult{ + Confirmed: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Spendable: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Expected: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Addresses: []AddressBalances{ + { + Confirmed: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Spendable: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Expected: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Address: addrs[0], + }, + { + Confirmed: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Spendable: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Expected: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Address: addrs[1], + }, + { + Confirmed: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Spendable: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Expected: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Address: addrs[2], + }, + }, + }, + }, + + { + name: "confirmed != spendable != expected", + outs: readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashes[0], + Address: addrs[0], + Coins: "89.900000", + CalculatedHours: 3000, + }, + { + Hash: hashes[1], + Address: addrs[0], + Coins: "0.100000", + CalculatedHours: 97000, + }, + { + Hash: hashes[5], + Address: addrs[0], + Coins: "10.000000", + CalculatedHours: 23000, + }, + { + Hash: hashes[2], + Address: addrs[2], + Coins: "1.000001", + CalculatedHours: 23, + }, + { + Hash: hashes[6], + Address: addrs[2], + Coins: "22.111110", + CalculatedHours: 100, + }, + }, + OutgoingOutputs: readable.UnspentOutputs{ + { + Hash: hashes[5], + Address: addrs[0], + Coins: "10.000000", + CalculatedHours: 23000, + }, + { + Hash: hashes[6], + Address: addrs[2], + Coins: "22.111110", + CalculatedHours: 100, + }, + }, + IncomingOutputs: readable.UnspentOutputs{ + { + Hash: hashes[3], + Address: addrs[1], + Coins: "1.000000", + CalculatedHours: 333, + }, + { + Hash: hashes[4], + Address: addrs[1], + Coins: "0.111111", + CalculatedHours: 0, + }, + { + Hash: hashes[7], + Address: addrs[2], + Coins: "44.999999", + CalculatedHours: 433, + }, + }, + }, + addrs: addrs, + result: &BalanceResult{ + Confirmed: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Spendable: Balance{ + Coins: "91.000001", + Hours: "100023", + }, + Expected: Balance{ + Coins: "137.111111", + Hours: "100789", + }, + Addresses: []AddressBalances{ + { + Confirmed: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Spendable: Balance{ + Coins: "90.000000", + Hours: "100000", + }, + Expected: Balance{ + Coins: "90.000000", + Hours: "100000", + }, + Address: addrs[0], + }, + { + Confirmed: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Spendable: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Expected: Balance{ + Coins: "1.111111", + Hours: "333", + }, + Address: addrs[1], + }, + { + Confirmed: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Spendable: Balance{ + Coins: "1.000001", + Hours: "23", + }, + Expected: Balance{ + Coins: "46.000000", + Hours: "456", + }, + Address: addrs[2], + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + result, err := getBalanceOfAddresses(&tc.outs, tc.addrs) + require.Equal(t, tc.err, err) + require.Equal(t, tc.result, result) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/checkdb.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/checkdb.go new file mode 100644 index 00000000..5b6b53a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/checkdb.go @@ -0,0 +1,141 @@ +package cli + +import ( + "fmt" + "os" + "time" + + "github.com/boltdb/bolt" + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/apputil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +const ( + blockchainPubkey = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +) + +// wrapDB calls dbutil.WrapDB and disables all logging +func wrapDB(db *bolt.DB) *dbutil.DB { + wdb := dbutil.WrapDB(db) + wdb.ViewLog = false + wdb.ViewTrace = false + wdb.UpdateLog = false + wdb.UpdateTrace = false + wdb.DurationLog = false + return wdb +} + +func checkDBCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify the database", + Use: "checkdb [db path]", + Long: `Checks if the given database file contains valid skycoin blockchain data. + If no argument is specificed, the default data.db in $HOME/.$COIN/ will be checked.`, + Args: cobra.MaximumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: checkDB, + } +} + +func checkDB(_ *cobra.Command, args []string) error { + // get db path + dbPath := "" + if len(args) > 0 { + dbPath = args[0] + } + dbPath, err := resolveDBPath(cliConfig, dbPath) + if err != nil { + return err + } + + // check if this file exists + if _, err := os.Stat(dbPath); os.IsNotExist(err) { + return fmt.Errorf("db file: %v does not exist", dbPath) + } + + db, err := bolt.Open(dbPath, 0600, &bolt.Options{ + Timeout: 5 * time.Second, + ReadOnly: true, + }) + + if err != nil { + return fmt.Errorf("open db failed: %v", err) + } + pubkey, err := cipher.PubKeyFromHex(blockchainPubkey) + if err != nil { + return fmt.Errorf("decode blockchain pubkey failed: %v", err) + } + + go func() { + apputil.CatchInterrupt(quitChan) + }() + + if err := visor.CheckDatabase(wrapDB(db), pubkey, quitChan); err != nil { + if err == visor.ErrVerifyStopped { + return nil + } + return fmt.Errorf("checkdb failed: %v", err) + } + + fmt.Println("check db success") + return nil +} + +func checkDBEncodingCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify the database data encoding", + Use: "checkDBDecoding [db path]", + Long: `Verify the generated binary encoders match the dynamic encoders for database data. + If no argument is specificed, the default data.db in $HOME/.$COIN/ will be checked.`, + Args: cobra.MaximumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: checkDBDecoding, + } +} + +func checkDBDecoding(_ *cobra.Command, args []string) error { + // get db path + dbPath := "" + if len(args) > 0 { + dbPath = args[0] + } + dbPath, err := resolveDBPath(cliConfig, dbPath) + if err != nil { + return err + } + + // check if this file exists + if _, err := os.Stat(dbPath); os.IsNotExist(err) { + return fmt.Errorf("db file: %v does not exist", dbPath) + } + + db, err := bolt.Open(dbPath, 0600, &bolt.Options{ + Timeout: 5 * time.Second, + ReadOnly: true, + }) + + if err != nil { + return fmt.Errorf("open db failed: %v", err) + } + + go func() { + apputil.CatchInterrupt(quitChan) + }() + + if err := visor.VerifyDBSkyencoderSafe(wrapDB(db), quitChan); err != nil { + if err == visor.ErrVerifyStopped { + return nil + } + return fmt.Errorf("checkDBDecoding failed: %v", err) + } + + fmt.Println("check db decoding success") + return nil + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/cli.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/cli.go new file mode 100644 index 00000000..acd289a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/cli.go @@ -0,0 +1,320 @@ +/* +Package cli implements the CLI cmd's methods. + +Includes methods for manipulating wallets files and interacting with the +REST API to query a skycoin node's status. +*/ +package cli + +import ( + "encoding/json" + "errors" + "flag" + "fmt" + "net/url" + "path/filepath" + "syscall" + + "os" + + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "golang.org/x/crypto/ssh/terminal" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var ( + // Version is the CLI Version + Version = "0.27.0" +) + +const ( + walletExt = "." + wallet.WalletExt + defaultCoin = "skycoin" + defaultRPCAddress = "http://127.0.0.1:6420" + defaultDataDir = "$HOME/.$COIN/" +) + +var ( + envVarsHelp = fmt.Sprintf(`ENVIRONMENT VARIABLES: + RPC_ADDR: Address of RPC node. Must be in scheme://host format. Default "%s" + RPC_USER: Username for RPC API, if enabled in the RPC. + RPC_PASS: Password for RPC API, if enabled in the RPC. + COIN: Name of the coin. Default "%s" + DATA_DIR: Directory where everything is stored. Default "%s"`, defaultRPCAddress, defaultCoin, defaultDataDir) + + helpTemplate = fmt.Sprintf(`USAGE:{{if .Runnable}} + {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} + {{.CommandPath}} [command] [flags] [arguments...]{{end}}{{with (or .Long .Short)}} + +DESCRIPTION: + {{. | trimTrailingWhitespaces}}{{end}}{{if .HasExample}} + +EXAMPLES: +{{.Example}}{{end}}{{if .HasAvailableSubCommands}} + +COMMANDS:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}} + {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} + +FLAGS: +{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} + +GLOBAL FLAGS: +{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} + +Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} + {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} + +Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} + +%s +`, envVarsHelp) + + // ErrWalletName is returned if the wallet file name is invalid + ErrWalletName = fmt.Errorf("error wallet file name, must have %s extension", walletExt) + // ErrAddress is returned if an address is invalid + ErrAddress = errors.New("invalid address") + // ErrJSONMarshal is returned if JSON marshaling failed + ErrJSONMarshal = errors.New("json marshal failed") +) + +var ( + cliConfig Config + apiClient *api.Client + quitChan = make(chan struct{}) +) + +// Config cli's configuration struct +type Config struct { + DataDir string `json:"data_directory"` + Coin string `json:"coin"` + RPCAddress string `json:"rpc_address"` + RPCUsername string `json:"-"` + RPCPassword string `json:"-"` +} + +// LoadConfig loads config from environment, prior to parsing CLI flags +func LoadConfig() (Config, error) { + // get coin name from env + coin := os.Getenv("COIN") + if coin == "" { + coin = defaultCoin + } + + // get rpc address from env + rpcAddr := os.Getenv("RPC_ADDR") + if rpcAddr == "" { + rpcAddr = defaultRPCAddress + } + + if _, err := url.Parse(rpcAddr); err != nil { + return Config{}, errors.New("RPC_ADDR must be in scheme://host format") + } + + rpcUser := os.Getenv("RPC_USER") + rpcPass := os.Getenv("RPC_PASS") + + home := file.UserHome() + + // get data dir dir from env + dataDir := os.Getenv("DATA_DIR") + if dataDir == "" { + dataDir = filepath.Join(home, fmt.Sprintf(".%s", coin)) + } + + if os.Getenv("WALLET_DIR") != "" { + return Config{}, errors.New("the envvar WALLET_DIR is no longer recognized by the CLI tool. Please review the updated CLI docs to learn how to specify the wallet file for your desired action") + } + if os.Getenv("WALLET_NAME") != "" { + return Config{}, errors.New("the envvar WALLET_NAME is no longer recognized by the CLI tool. Please review the updated CLI docs to learn how to specify the wallet file for your desired action") + } + + return Config{ + DataDir: dataDir, + Coin: coin, + RPCAddress: rpcAddr, + RPCUsername: rpcUser, + RPCPassword: rpcPass, + }, nil +} + +// FullDBPath returns the joined data directory and db file name path +func (c Config) FullDBPath() string { + return filepath.Join(c.DataDir, "data.db") +} + +func resolveDBPath(cfg Config, db string) (string, error) { + if db == "" { + db = cfg.FullDBPath() + } + + // If db is only the basename, use the default data dir + if filepath.Base(db) == db { + db = filepath.Join(cfg.DataDir, db) + } + + absDB, err := filepath.Abs(db) + if err != nil { + return "", fmt.Errorf("Invalid data path %s: %v", db, err) + } + return absDB, nil +} + +// NewCLI creates a cli instance +func NewCLI(cfg Config) (*cobra.Command, error) { + apiClient = api.NewClient(cfg.RPCAddress) + apiClient.SetAuth(cfg.RPCUsername, cfg.RPCPassword) + + cliConfig = cfg + + skyCLI := &cobra.Command{ + Short: fmt.Sprintf("The %s command line interface", cfg.Coin), + Use: fmt.Sprintf("%s-cli", cfg.Coin), + } + + commands := []*cobra.Command{ + addPrivateKeyCmd(), + addressBalanceCmd(), + addressGenCmd(), + fiberAddressGenCmd(), + addressOutputsCmd(), + blocksCmd(), + broadcastTxCmd(), + checkDBCmd(), + checkDBEncodingCmd(), + createRawTxnCmd(), + createRawTxnV2Cmd(), + signTxnCmd(), + decodeRawTxnCmd(), + encodeJSONTxnCmd(), + decryptWalletCmd(), + encryptWalletCmd(), + lastBlocksCmd(), + listAddressesCmd(), + listWalletsCmd(), + sendCmd(), + showConfigCmd(), + showSeedCmd(), + statusCmd(), + transactionCmd(), + verifyTransactionCmd(), + verifyAddressCmd(), + versionCmd(), + walletCreateCmd(), + walletAddAddressesCmd(), + walletKeyExportCmd(), + walletBalanceCmd(), + walletHisCmd(), + walletOutputsCmd(), + richlistCmd(), + addressTransactionsCmd(), + pendingTransactionsCmd(), + addresscountCmd(), + distributeGenesisCmd(), + } + + skyCLI.Version = Version + skyCLI.SuggestionsMinimumDistance = 1 + skyCLI.AddCommand(commands...) + + skyCLI.SetHelpTemplate(helpTemplate) + skyCLI.SetUsageTemplate(helpTemplate) + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + + return skyCLI, nil +} + +func printHelp(c *cobra.Command) { + c.Printf("See '%s %s --help'\n", c.Parent().Name(), c.Name()) +} + +func formatJSON(obj interface{}) ([]byte, error) { + d, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return nil, ErrJSONMarshal + } + return d, nil +} + +func printJSON(obj interface{}) error { + d, err := formatJSON(obj) + if err != nil { + return err + } + + fmt.Println(string(d)) + + return nil +} + +// readPasswordFromTerminal promotes user to enter password and read it. +func readPasswordFromTerminal() ([]byte, error) { + // Promotes to enter the wallet password + fmt.Fprint(os.Stdout, "enter password:") + bp, err := terminal.ReadPassword(int(syscall.Stdin)) //nolint:unconvert + if err != nil { + return nil, err + } + fmt.Fprintln(os.Stdout, "") + return bp, nil +} + +// PUBLIC + +// WalletLoadError is returned if a wallet could not be loaded +type WalletLoadError struct { + error +} + +func (e WalletLoadError) Error() string { + return fmt.Sprintf("Load wallet failed: %v", e.error) +} + +// WalletSaveError is returned if a wallet could not be saved +type WalletSaveError struct { + error +} + +func (e WalletSaveError) Error() string { + return fmt.Sprintf("Save wallet failed: %v", e.error) +} + +// PasswordReader is an interface for getting password +type PasswordReader interface { + Password() ([]byte, error) +} + +// PasswordFromBytes represents an implementation of PasswordReader, +// which reads password from the bytes itself. +type PasswordFromBytes []byte + +// Password implements the PasswordReader's Password method +func (p PasswordFromBytes) Password() ([]byte, error) { + return []byte(p), nil +} + +// PasswordFromTerm reads password from terminal +type PasswordFromTerm struct{} + +// Password implements the PasswordReader's Password method +func (p PasswordFromTerm) Password() ([]byte, error) { + v, err := readPasswordFromTerminal() + if err != nil { + return nil, err + } + + return v, nil +} + +// NewPasswordReader creats a PasswordReader instance, +// reads password from the input bytes first, if it's empty, then read from terminal. +func NewPasswordReader(p []byte) PasswordReader { + if len(p) != 0 { + return PasswordFromBytes(p) + } + + return PasswordFromTerm{} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/cli_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/cli_test.go new file mode 100644 index 00000000..9c2a90eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/cli_test.go @@ -0,0 +1,72 @@ +package cli + +import ( + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func Example() { + // In cmd/skycoin-cli/skycion-cli.go: + cfg, err := LoadConfig() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + cli, err := NewCLI(cfg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := cli.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func TestLoadConfig(t *testing.T) { + t.Run("set COIN", func(t *testing.T) { + val := "foocoin" + os.Setenv("COIN", val) + defer os.Unsetenv("COIN") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.Coin, val) + }) + + t.Run("set RPC_ADDR", func(t *testing.T) { + val := "http://111.22.33.44:5555" + os.Setenv("RPC_ADDR", val) + defer os.Unsetenv("RPC_ADDR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.RPCAddress, val) + }) + + t.Run("set RPC_ADDR invalid", func(t *testing.T) { + val := "111.22.33.44:5555" + os.Setenv("RPC_ADDR", val) + defer os.Unsetenv("RPC_ADDR") + + _, err := LoadConfig() + testutil.RequireError(t, err, "RPC_ADDR must be in scheme://host format") + }) + + t.Run("set DATA_DIR", func(t *testing.T) { + val := "/home/foo/" + os.Setenv("DATA_DIR", val) + defer os.Unsetenv("DATA_DIR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.DataDir, val) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx.go new file mode 100644 index 00000000..723489cf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx.go @@ -0,0 +1,996 @@ +package cli + +import ( + "encoding/csv" + "encoding/json" + "errors" + "fmt" + "os" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var ( + // ErrTemporaryInsufficientBalance is returned if a wallet does not have enough balance for a spend, but will have enough after unconfirmed transactions confirm + ErrTemporaryInsufficientBalance = errors.New("balance is not sufficient. Balance will be sufficient after unconfirmed transactions confirm") +) + +// SendAmount represents an amount to send to an address +type SendAmount struct { + Addr string + Coins uint64 +} + +type sendAmountJSON struct { + Addr string `json:"addr"` + Coins string `json:"coins"` +} + +func createRawTxnCmd() *cobra.Command { + createRawTxnCmd := &cobra.Command{ + Short: "Create a raw transaction that can be broadcast to the network later", + Use: "createRawTransaction [wallet] [to address] [amount]", + Long: `Create a raw transaction that can be broadcast to the network later. + + Note: The [amount] argument is the coins you will spend, with decimal formatting, e.g. 1, 1.001 or 1.000000. + + The [to address] and [amount] arguments can be replaced with the --many/-m or the --csv option. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + Args: cobra.MinimumNArgs(1), + RunE: func(c *cobra.Command, args []string) error { + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + txn, err := createRawTxnCmdHandler(c, args) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + rawTxn, err := txn.SerializeHex() + if err != nil { + return err + } + + if jsonOutput { + return printJSON(struct { + RawTx string `json:"rawtx"` + }{ + RawTx: rawTxn, + }) + } + + fmt.Println(rawTxn) + + return nil + }, + } + + createRawTxnCmd.Flags().StringP("from-address", "a", "", "From address in wallet") + createRawTxnCmd.Flags().StringP("change-address", "c", "", `Specify the change address. +Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets).`) + createRawTxnCmd.Flags().StringP("many", "m", "", `use JSON string to set multiple receive addresses and coins, +example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`) + createRawTxnCmd.Flags().StringP("password", "p", "", "Wallet password") + createRawTxnCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + createRawTxnCmd.Flags().String("csv", "", "CSV file containing addresses and amounts to send") + + return createRawTxnCmd +} + +func createRawTxnV2Cmd() *cobra.Command { + createRawTxnCmd := &cobra.Command{ + Short: "Create a raw transaction that can be broadcast to the network later", + Use: "createRawTransactionV2 [wallet] [to address] [amount]", + Long: `Create a raw transaction that can be broadcast to the network later. + + Note: The [amount] argument is the coins you will spend, with decimal formatting, e.g. 1, 1.001 or 1.000000. + + The [to address] and [amount] arguments can be replaced with the --csv option., + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + Args: cobra.MinimumNArgs(1), + RunE: func(c *cobra.Command, args []string) error { + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + req, err := makeWalletCreateTxnRequest(c, args) + if err != nil { + return err + } + + rsp, err := apiClient.WalletCreateTransaction(*req) + if err != nil { + return err + } + + if jsonOutput { + return printJSON(rsp) + } + + fmt.Println(rsp.EncodedTransaction) + + return nil + }, + } + + createRawTxnCmd.Flags().StringP("from-address", "a", "", "From address in wallet") + createRawTxnCmd.Flags().StringP("change-address", "c", "", `Specify the change address. + Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets).`) + createRawTxnCmd.Flags().String("csv", "", "CSV file containing addresses and amounts to send") + createRawTxnCmd.Flags().StringP("password", "p", "", "Wallet password") + createRawTxnCmd.Flags().BoolP("unsign", "", false, "Do not sign the transaction") + createRawTxnCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + + createRawTxnCmd.Flags().BoolP("ignore-unconfirmed", "", false, "Ignore unconfirmed transactions") + createRawTxnCmd.Flags().StringP("hours-selection-type", "", transaction.HoursSelectionTypeAuto, "Hours selection type") + createRawTxnCmd.Flags().StringP("hours-selection-mode", "", transaction.HoursSelectionModeShare, "Hours selection mode") + createRawTxnCmd.Flags().StringP("hours-selection-share-factor", "", "0.5", "Hour selection share factor") + + return createRawTxnCmd +} + +func makeWalletCreateTxnRequest(c *cobra.Command, args []string) (*api.WalletCreateTransactionRequest, error) { + unsign, err := c.Flags().GetBool("unsign") + if err != nil { + return nil, err + } + + walletFile := args[0] + w, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + wltAddr, err := fromWalletOrAddress(c, walletFile) + if err != nil { + return nil, err + } + + var addrs []string + if wltAddr.Address != "" { + addrs = append(addrs, wltAddr.Address) + } else { + for _, addr := range w.GetAddresses() { + addrs = append(addrs, addr.String()) + } + } + + ctr, err := makeCreateTransactionRequest(c, args, addrs) + if err != nil { + return nil, err + } + + req := api.WalletCreateTransactionRequest{ + Unsigned: unsign, + WalletID: w.Filename(), + CreateTransactionRequest: *ctr, + } + + if w.IsEncrypted() && !unsign { + p, err := getPassword(c) + if err != nil { + return nil, err + } + defer func() { + p = nil + }() + req.Password = string(p) + } + return &req, nil +} + +func getPassword(c *cobra.Command) ([]byte, error) { + p, err := c.Flags().GetString("password") + if err != nil { + return nil, err + } + defer func() { + p = "" + }() + + return NewPasswordReader([]byte(p)).Password() +} + +func makeCreateTransactionRequest(c *cobra.Command, args []string, fromAddrs []string) (*api.CreateTransactionRequest, error) { + hoursSelection, err := getHoursSelection(c) + if err != nil { + return nil, err + } + + iu, err := c.Flags().GetBool("ignore-unconfirmed") + if err != nil { + return nil, err + } + + var changeAddr *string + ca, err := c.Flags().GetString("change-address") + if err != nil { + return nil, err + } + if ca != "" { + changeAddr = &ca + } + + to, err := getToAddressesV2(c, args[1:]) + if err != nil { + return nil, err + } + + return &api.CreateTransactionRequest{ + IgnoreUnconfirmed: iu, + HoursSelection: *hoursSelection, + ChangeAddress: changeAddr, + Addresses: fromAddrs, + To: to, + }, nil +} + +func getToAddressesV2(c *cobra.Command, args []string) ([]api.Receiver, error) { + csvFile, err := c.Flags().GetString("csv") + if err != nil { + return nil, err + } + + if csvFile != "" { + fields, err := openCSV(csvFile) + if err != nil { + return nil, err + } + return parseReceiversFromCSV(fields) + } + + if len(args) < 2 { + return nil, fmt.Errorf("requires at least 2 arg(s), only received %d", len(args)) + } + + toAddr := args[0] + if _, err := cipher.DecodeBase58Address(toAddr); err != nil { + return nil, err + } + + coins := args[1] + if _, err := droplet.FromString(coins); err != nil { + return nil, err + } + + return []api.Receiver{{ + Address: toAddr, + Coins: coins, + }}, nil +} +func getHoursSelection(c *cobra.Command) (*api.HoursSelection, error) { + hst, err := c.Flags().GetString("hours-selection-type") + if err != nil { + return nil, err + } + + hsm, err := c.Flags().GetString("hours-selection-mode") + if err != nil { + return nil, err + } + + sf, err := c.Flags().GetString("hours-selection-share-factor") + if err != nil { + return nil, err + } + + return &api.HoursSelection{ + Type: hst, + Mode: hsm, + ShareFactor: sf, + }, nil +} + +type walletAddress struct { + Wallet string + Address string +} + +func fromWalletOrAddress(c *cobra.Command, walletFile string) (walletAddress, error) { + address, err := c.Flags().GetString("from-address") + if err != nil { + return walletAddress{}, err + } + + wltAddr := walletAddress{ + Wallet: walletFile, + } + + wltAddr.Address = address + if wltAddr.Address == "" { + return wltAddr, nil + } + + if _, err := cipher.DecodeBase58Address(wltAddr.Address); err != nil { + return walletAddress{}, fmt.Errorf("invalid address: %s", wltAddr.Address) + } + + return wltAddr, nil +} + +func getChangeAddress(wltAddr walletAddress, chgAddr string) (string, error) { + if chgAddr == "" { + switch { + case wltAddr.Address != "": + // use the from address as change address + chgAddr = wltAddr.Address + case wltAddr.Wallet != "": + // get the default wallet's coin base address + wlt, err := wallet.Load(wltAddr.Wallet) + if err != nil { + return "", WalletLoadError{err} + } + + if wlt.EntriesLen() > 0 { + chgAddr = wlt.GetEntryAt(0).Address.String() + } else { + return "", errors.New("no change address was found") + } + default: + return "", errors.New("wallet file, from address and change address are empty") + } + } + + // validate the address + _, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return "", fmt.Errorf("invalid change address: %s", chgAddr) + } + + return chgAddr, nil +} + +func getToAddresses(c *cobra.Command, args []string) ([]SendAmount, error) { + csvFile, err := c.Flags().GetString("csv") + if err != nil { + return nil, err + } + many, err := c.Flags().GetString("many") + if err != nil { + return nil, err + } + + if csvFile != "" && many != "" { + return nil, errors.New("-csv and -m cannot be combined") + } + + if many != "" { + return parseSendAmountsFromJSON(many) + } else if csvFile != "" { + fields, err := openCSV(csvFile) + if err != nil { + return nil, err + } + return parseSendAmountsFromCSV(fields) + } + + if len(args) < 2 { + return nil, fmt.Errorf("requires at least 2 arg(s), only received %d", len(args)) + } + + toAddr := args[0] + + if _, err := cipher.DecodeBase58Address(toAddr); err != nil { + return nil, err + } + + amt, err := getAmount(args) + if err != nil { + return nil, err + } + + return []SendAmount{{ + Addr: toAddr, + Coins: amt, + }}, nil +} + +func openCSV(csvFile string) ([][]string, error) { + f, err := os.Open(csvFile) + if err != nil { + return nil, err + } + defer f.Close() + + r := csv.NewReader(f) + return r.ReadAll() +} + +func parseSendAmountsFromCSV(fields [][]string) ([]SendAmount, error) { + var sends []SendAmount + var errs []error + for i, f := range fields { + addr := f[0] + + addr = strings.TrimSpace(addr) + + if _, err := cipher.DecodeBase58Address(addr); err != nil { + err = fmt.Errorf("[row %d] Invalid address %s: %v", i, addr, err) + errs = append(errs, err) + continue + } + + coins, err := droplet.FromString(f[1]) + if err != nil { + err = fmt.Errorf("[row %d] Invalid amount %s: %v", i, f[1], err) + errs = append(errs, err) + continue + } + + sends = append(sends, SendAmount{ + Addr: addr, + Coins: coins, + }) + } + + if len(errs) > 0 { + errMsgs := make([]string, len(errs)) + for i, err := range errs { + errMsgs[i] = err.Error() + } + + errMsg := strings.Join(errMsgs, "\n") + + return nil, errors.New(errMsg) + } + + return sends, nil +} + +func parseReceiversFromCSV(fields [][]string) ([]api.Receiver, error) { + var sends []api.Receiver + var errs []error + for i, f := range fields { + addr := f[0] + + addr = strings.TrimSpace(addr) + + if _, err := cipher.DecodeBase58Address(addr); err != nil { + err = fmt.Errorf("[row %d] Invalid address %s: %v", i, addr, err) + errs = append(errs, err) + continue + } + + _, err := droplet.FromString(f[1]) + if err != nil { + err = fmt.Errorf("[row %d] Invalid amount %s: %v", i, f[1], err) + errs = append(errs, err) + continue + } + + sends = append(sends, api.Receiver{ + Address: addr, + Coins: f[1], + }) + } + + if len(errs) > 0 { + errMsgs := make([]string, len(errs)) + for i, err := range errs { + errMsgs[i] = err.Error() + } + + errMsg := strings.Join(errMsgs, "\n") + + return nil, errors.New(errMsg) + } + + return sends, nil +} + +func parseSendAmountsFromJSON(m string) ([]SendAmount, error) { + sas := []sendAmountJSON{} + + if err := json.NewDecoder(strings.NewReader(m)).Decode(&sas); err != nil { + return nil, fmt.Errorf("invalid -m flag string, err: %v", err) + } + + sendAmts := make([]SendAmount, 0, len(sas)) + + for _, sa := range sas { + amt, err := droplet.FromString(sa.Coins) + if err != nil { + return nil, fmt.Errorf("invalid coins value in -m flag string: %v", err) + } + + sendAmts = append(sendAmts, SendAmount{ + Addr: sa.Addr, + Coins: amt, + }) + } + + return sendAmts, nil +} + +func getAmount(args []string) (uint64, error) { + amount := args[1] + amt, err := droplet.FromString(amount) + if err != nil { + return 0, fmt.Errorf("invalid amount: %v", err) + } + + return amt, nil +} + +// createRawTxnArgs are encapsulated arguments for creating a transaction +type createRawTxnArgs struct { + WalletID string + Address string + ChangeAddress string + SendAmounts []SendAmount + Password PasswordReader +} + +func parseCreateRawTxnArgs(c *cobra.Command, args []string) (*createRawTxnArgs, error) { + wltAddr, err := fromWalletOrAddress(c, args[0]) + if err != nil { + return nil, err + } + + changeAddress, err := c.Flags().GetString("change-address") + if err != nil { + return nil, err + } + chgAddr, err := getChangeAddress(wltAddr, changeAddress) + if err != nil { + return nil, err + } + + toAddrs, err := getToAddresses(c, args[1:]) + if err != nil { + return nil, err + } + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + password, err := c.Flags().GetString("password") + if err != nil { + return nil, err + } + pr := NewPasswordReader([]byte(password)) + + return &createRawTxnArgs{ + WalletID: wltAddr.Wallet, + Address: wltAddr.Address, + ChangeAddress: chgAddr, + SendAmounts: toAddrs, + Password: pr, + }, nil +} + +func createRawTxnCmdHandler(c *cobra.Command, args []string) (*coin.Transaction, error) { + parsedArgs, err := parseCreateRawTxnArgs(c, args) + if err != nil { + return nil, err + } + + // TODO -- load distribution params from config? Need to allow fiber chains to be used easily + // There's too many distribution parameters to put them in command line, but we could read them from a file. + // We could also have multiple hardcoded known distribution parameters for fiber coins, in the source, + // but this wouldn't work for new fiber coins that hadn't been hardcoded yet. + if parsedArgs.Address == "" { + return CreateRawTxnFromWallet(apiClient, parsedArgs.WalletID, + parsedArgs.ChangeAddress, parsedArgs.SendAmounts, + parsedArgs.Password, params.MainNetDistribution) + } + + return CreateRawTxnFromAddress(apiClient, parsedArgs.Address, + parsedArgs.WalletID, parsedArgs.ChangeAddress, parsedArgs.SendAmounts, + parsedArgs.Password, params.MainNetDistribution) +} + +func validateSendAmounts(toAddrs []SendAmount) error { + for _, arg := range toAddrs { + // validate to address + _, err := cipher.DecodeBase58Address(arg.Addr) + if err != nil { + return ErrAddress + } + + if arg.Coins == 0 { + return errors.New("Cannot send 0 coins") + } + } + + if len(toAddrs) == 0 { + return errors.New("No destination addresses") + } + + return nil +} + +// PUBLIC + +// CreateRawTxnFromWallet creates a transaction from any address or combination of addresses in a wallet +func CreateRawTxnFromWallet(c GetOutputser, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader, distParams params.Distribution) (*coin.Transaction, error) { + // check change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + // check if the change address is in wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + _, ok := wlt.GetEntry(cAddr) + if !ok { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + // get all address in the wallet + totalAddrs := wlt.GetAddresses() + addrStrArray := make([]string, len(totalAddrs)) + for i, a := range totalAddrs { + addrStrArray[i] = a.String() + } + + return CreateRawTxn(c, wlt, addrStrArray, chgAddr, toAddrs, password, distParams) +} + +// CreateRawTxnFromAddress creates a transaction from a specific address in a wallet +func CreateRawTxnFromAddress(c GetOutputser, addr, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader, distParams params.Distribution) (*coin.Transaction, error) { + // check if the address is in the default wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + srcAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + return nil, ErrAddress + } + + _, ok := wlt.GetEntry(srcAddr) + if !ok { + return nil, fmt.Errorf("%v address is not in wallet", addr) + } + + // validate change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + _, ok = wlt.GetEntry(cAddr) + if !ok { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + return CreateRawTxn(c, wlt, []string{addr}, chgAddr, toAddrs, password, distParams) +} + +// GetOutputser implements unspent output querying +type GetOutputser interface { + OutputsForAddresses([]string) (*readable.UnspentOutputsSummary, error) +} + +// CreateRawTxn creates a transaction from a set of addresses contained in a loaded wallet.Wallet +func CreateRawTxn(c GetOutputser, wlt wallet.Wallet, inAddrs []string, chgAddr string, toAddrs []SendAmount, password []byte, distParams params.Distribution) (*coin.Transaction, error) { + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + // Get unspent outputs of those addresses + outputs, err := c.OutputsForAddresses(inAddrs) + if err != nil { + return nil, err + } + + inUxs, err := outputs.SpendableOutputs().ToUxArray() + if err != nil { + return nil, err + } + + txn, err := createRawTxn(outputs, wlt, chgAddr, toAddrs, password) + if err != nil { + return nil, err + } + + // filter out unspents which are not used in transaction + var inUxsFiltered coin.UxArray + for _, h := range txn.In { + for _, u := range inUxs { + if h == u.Hash() { + inUxsFiltered = append(inUxsFiltered, u) + } + } + } + + head, err := outputs.Head.ToCoinBlockHeader() + if err != nil { + return nil, err + } + + if err := visor.VerifySingleTxnSoftConstraints(*txn, head.Time, inUxsFiltered, distParams, params.UserVerifyTxn); err != nil { + return nil, err + } + if err := visor.VerifySingleTxnHardConstraints(*txn, head, inUxsFiltered, visor.TxnSigned); err != nil { + return nil, err + } + if err := visor.VerifySingleTxnUserConstraints(*txn); err != nil { + return nil, err + } + + return txn, nil +} + +func createRawTxn(uxouts *readable.UnspentOutputsSummary, wlt wallet.Wallet, chgAddr string, toAddrs []SendAmount, password []byte) (*coin.Transaction, error) { + // Calculate total required coins + var totalCoins uint64 + for _, arg := range toAddrs { + var err error + totalCoins, err = mathutil.AddUint64(totalCoins, arg.Coins) + if err != nil { + return nil, err + } + } + + spendOutputs, err := chooseSpends(uxouts, totalCoins) + if err != nil { + return nil, err + } + + txOuts, err := makeChangeOut(spendOutputs, chgAddr, toAddrs) + if err != nil { + return nil, err + } + + f := func(w wallet.Wallet) (*coin.Transaction, error) { + keys, err := getKeys(w, spendOutputs) + if err != nil { + return nil, err + } + + return NewTransaction(spendOutputs, keys, txOuts) + } + + makeTxn := func() (*coin.Transaction, error) { + return f(wlt) + } + + if wlt.IsEncrypted() { + makeTxn = func() (*coin.Transaction, error) { + var tx *coin.Transaction + if err := wallet.GuardView(wlt, password, func(w wallet.Wallet) error { + var err error + tx, err = f(w) + return err + }); err != nil { + return nil, err + } + + return tx, nil + } + } + + return makeTxn() +} + +func chooseSpends(uxouts *readable.UnspentOutputsSummary, coins uint64) ([]transaction.UxBalance, error) { + // Convert spendable unspent outputs to []transaction.UxBalance + spendableOutputs, err := readable.OutputsToUxBalances(uxouts.SpendableOutputs()) + if err != nil { + return nil, err + } + + // Choose which unspent outputs to spend + // Use the MinimizeUxOuts strategy, since this is most likely used by + // application that may need to send frequently. + // Using fewer UxOuts will leave more available for other transactions, + // instead of waiting for confirmation. + outs, err := transaction.ChooseSpendsMinimizeUxOuts(spendableOutputs, coins, 0) + if err != nil { + // If there is not enough balance in the spendable outputs, + // see if there is enough balance when including incoming outputs + if err == transaction.ErrInsufficientBalance { + expectedOutputs, otherErr := readable.OutputsToUxBalances(uxouts.ExpectedOutputs()) + if otherErr != nil { + return nil, otherErr + } + + if _, otherErr := transaction.ChooseSpendsMinimizeUxOuts(expectedOutputs, coins, 0); otherErr != nil { + return nil, err + } + + return nil, ErrTemporaryInsufficientBalance + } + + return nil, err + } + + return outs, nil +} + +func makeChangeOut(outs []transaction.UxBalance, chgAddr string, toAddrs []SendAmount) ([]coin.TransactionOutput, error) { + var totalInCoins, totalInHours, totalOutCoins uint64 + + for _, o := range outs { + totalInCoins += o.Coins + totalInHours += o.Hours + } + + if totalInHours == 0 { + return nil, fee.ErrTxnNoFee + } + + for _, to := range toAddrs { + totalOutCoins += to.Coins + } + + if totalInCoins < totalOutCoins { + return nil, transaction.ErrInsufficientBalance + } + + outAddrs := []coin.TransactionOutput{} + changeAmount := totalInCoins - totalOutCoins + + haveChange := changeAmount > 0 + nAddrs := uint64(len(toAddrs)) + changeHours, addrHours, totalOutHours := transaction.DistributeSpendHours(totalInHours, nAddrs, haveChange) + + if err := fee.VerifyTransactionFeeForHours(totalOutHours, totalInHours-totalOutHours, params.UserVerifyTxn.BurnFactor); err != nil { + return nil, err + } + + for i, to := range toAddrs { + // check if changeHours > 0, we do not need to cap addrHours when changeHours is zero + // changeHours is zero when there is no change left or all the coinhours were used in fees + // 1) if there is no change then the remaining coinhours are evenly distributed among the destination addresses + // 2) if all the coinhours are burned in fees then all addrHours are zero by default + if changeHours > 0 { + // the coinhours are capped to a maximum of incoming coins for the address + // if incoming coins < 1 then the cap is set to 1 coinhour + + spendCoinsAmt := to.Coins / 1e6 + if spendCoinsAmt == 0 { + spendCoinsAmt = 1 + } + + // allow addrHours to be less than the incoming coins of the address but not more + if addrHours[i] > spendCoinsAmt { + // cap the addrHours, move the difference to changeHours + changeHours += addrHours[i] - spendCoinsAmt + addrHours[i] = spendCoinsAmt + } + } + + outAddrs = append(outAddrs, mustMakeUtxoOutput(to.Addr, to.Coins, addrHours[i])) + } + + if haveChange { + outAddrs = append(outAddrs, mustMakeUtxoOutput(chgAddr, changeAmount, changeHours)) + } + + return outAddrs, nil +} + +func mustMakeUtxoOutput(addr string, coins, hours uint64) coin.TransactionOutput { + uo := coin.TransactionOutput{} + uo.Address = cipher.MustDecodeBase58Address(addr) + uo.Coins = coins + uo.Hours = hours + return uo +} + +func getKeys(wlt wallet.Wallet, outs []transaction.UxBalance) ([]cipher.SecKey, error) { + keys := make([]cipher.SecKey, len(outs)) + for i, o := range outs { + entry, ok := wlt.GetEntry(o.Address) + if !ok { + return nil, fmt.Errorf("%v is not in wallet", o.Address.String()) + } + + keys[i] = entry.Secret + } + return keys, nil +} + +// NewTransaction creates a transaction. The transaction should be validated against hard and soft constraints before transmission. +func NewTransaction(utxos []transaction.UxBalance, keys []cipher.SecKey, outs []coin.TransactionOutput) (*coin.Transaction, error) { + txn := coin.Transaction{} + for _, u := range utxos { + if err := txn.PushInput(u.Hash); err != nil { + return nil, err + } + } + + for _, o := range outs { + if err := txn.PushOutput(o.Address, o.Coins, o.Hours); err != nil { + return nil, err + } + } + + txn.SignInputs(keys) + + err := txn.UpdateHeader() + if err != nil { + return nil, err + } + + return &txn, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx_test.go new file mode 100644 index 00000000..1528c5c9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx_test.go @@ -0,0 +1,600 @@ +package cli + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +func TestMakeChangeOut(t *testing.T) { + // single destination test + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 400e6, + Hours: 1, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 300e6, + Hours: 1, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(100e6), chgOut.Coins) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + + require.Exactly(t, uint64(1), chgOut.Hours) + require.Exactly(t, uint64(0), spendOut.Hours) + + // multiple destination test + uxOuts = []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 10e6, + Hours: 8, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 5e6, + Hours: 16, + }, + } + + spendAmt = []SendAmount{ + { + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 1e6, + }, + { + Addr: "2CgSQ4FbtfbP6fJqmy75WwkW2tNsKPL2zzp", + Coins: 2e6, + }} + + _, err = cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err = makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and two output to the destination in toAddrs + require.Len(t, txOuts, 3) + + chgOut = txOuts[2] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(12e6), chgOut.Coins) + + for i := range spendAmt { + require.Equal(t, spendAmt[i].Addr, txOuts[i].Address.String()) + require.Exactly(t, spendAmt[i].Coins, txOuts[i].Coins) + } + + require.Exactly(t, uint64(18), chgOut.Hours) + require.Exactly(t, uint64(1), txOuts[0].Hours) + require.Exactly(t, uint64(2), txOuts[1].Hours) +} + +func TestMakeChangeOutMinOneCoinHourSend(t *testing.T) { + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 400e6, + Hours: 200, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 300e6, + Hours: 100, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 0.001e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(699.999e6), chgOut.Coins) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + + require.Exactly(t, uint64(269), chgOut.Hours) + require.Exactly(t, uint64(1), spendOut.Hours) +} + +func TestMakeChangeOutCoinHourCap(t *testing.T) { + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 400e6, + Hours: 2000, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 300e6, + Hours: 1000, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(100e6), chgOut.Coins) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + + require.Exactly(t, uint64(2100), chgOut.Hours) + require.Exactly(t, uint64(600), spendOut.Hours) +} + +func TestMakeChangeOutOneCoinHour(t *testing.T) { + // As long as there is at least one coin hour left, creating a transaction + // will still succeed + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 10, + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + Coins: 400e6, + Hours: 0, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 11, + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + Coins: 300e6, + Hours: 1, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(100e6), chgOut.Coins) + require.Exactly(t, uint64(0), chgOut.Hours) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + require.Exactly(t, uint64(0), spendOut.Hours) +} + +func TestMakeChangeOutInsufficientCoinHours(t *testing.T) { + // If there are no coin hours in the inputs, creating the txn will fail + // because it will not be accepted by the network + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 10, + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + Coins: 400e6, + Hours: 0, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 11, + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + Coins: 300e6, + Hours: 0, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + _, err = makeChangeOut(uxOuts, chgAddr, spendAmt) + testutil.RequireError(t, err, fee.ErrTxnNoFee.Error()) +} + +func TestChooseSpends(t *testing.T) { + // Start with readable.UnspentOutputsSummary + // Spends should be minimized + + // Insufficient HeadOutputs + // Sufficient HeadOutputs, but insufficient after adjusting for OutgoingOutputs + // Insufficient HeadOutputs, but sufficient after adjusting for IncomingOutputs + // Sufficient HeadOutputs after adjusting for OutgoingOutputs + + var coins uint64 = 100e6 + + hashA := testutil.RandSHA256(t).Hex() + hashB := testutil.RandSHA256(t).Hex() + hashC := testutil.RandSHA256(t).Hex() + hashD := testutil.RandSHA256(t).Hex() + + addrA := testutil.MakeAddress().String() + addrB := testutil.MakeAddress().String() + addrC := testutil.MakeAddress().String() + addrD := testutil.MakeAddress().String() + + cases := []struct { + name string + err error + spendLen int + ros readable.UnspentOutputsSummary + }{ + { + "Insufficient HeadOutputs", + transaction.ErrInsufficientBalance, + 0, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "75.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "13.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Sufficient HeadOutputs, but insufficient after subtracting OutgoingOutputs", + transaction.ErrInsufficientBalance, + 0, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "75.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "50.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + OutgoingOutputs: readable.UnspentOutputs{ + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "50.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Insufficient HeadOutputs, but sufficient after adding IncomingOutputs", + ErrTemporaryInsufficientBalance, + 0, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "20.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "30.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + IncomingOutputs: readable.UnspentOutputs{ + { + Hash: hashC, + Address: addrC, + BkSeq: 134, + Coins: "40.000000", + CalculatedHours: 200, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashD, + Address: addrD, + BkSeq: 29, + Coins: "11.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Sufficient HeadOutputs and still sufficient after subtracting OutgoingOutputs", + nil, + 2, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "90.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashC, + Address: addrC, + BkSeq: 19, + Coins: "20.000000", + CalculatedHours: 1, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + OutgoingOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Sufficient HeadOutputs and still sufficient after subtracting OutgoingOutputs but will have no coinhours", + fee.ErrTxnNoFee, + 0, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "90.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashC, + Address: addrC, + BkSeq: 19, + Coins: "30.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + OutgoingOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + spends, err := chooseSpends(&tc.ros, coins) + + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + } else { + require.NoError(t, err) + require.Equal(t, tc.spendLen, len(spends)) + + var totalCoins uint64 + for _, ux := range spends { + totalCoins += ux.Coins + } + + require.True(t, coins <= totalCoins) + } + }) + } +} + +func TestParseSendAmountsFromCSV(t *testing.T) { + cases := []struct { + name string + fields [][]string + amts []SendAmount + err error + }{ + { + name: "valid simple case", + fields: [][]string{ + {"2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP", "123"}, + {"2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd", "123.456"}, + {"8LbGZ9Z9r7ELNKyrQmAbhLhLvrmLJjfotm", "123.456789"}, + {"7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", "0"}, + }, + amts: []SendAmount{ + { + Addr: "2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP", + Coins: 123e6, + }, + { + Addr: "2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd", + Coins: 123456e3, + }, + { + Addr: "8LbGZ9Z9r7ELNKyrQmAbhLhLvrmLJjfotm", + Coins: 123456789, + }, + { + Addr: "7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", + Coins: 0, + }, + }, + }, + + { + name: "invalid coins value", + fields: [][]string{ + {"7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", "0.1234567"}, + }, + err: errors.New("[row 0] Invalid amount 0.1234567: Droplet string conversion failed: Too many decimal places"), + }, + + { + name: "invalid address value", + fields: [][]string{ + {"xxx", "0.123"}, + }, + err: errors.New("[row 0] Invalid address xxx: Invalid address length"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + amts, err := parseSendAmountsFromCSV(tc.fields) + + if tc.err != nil { + require.Equal(t, tc.err, err) + require.Nil(t, amts) + return + } + + require.NoError(t, err) + require.Equal(t, tc.amts, amts) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/decrypt_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/decrypt_wallet.go new file mode 100644 index 00000000..0ce1e099 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/decrypt_wallet.go @@ -0,0 +1,82 @@ +package cli + +import ( + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func decryptWalletCmd() *cobra.Command { + decryptWalletCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "decryptWallet [wallet]", + Short: "Decrypt a wallet", + Long: `Decrypt an encrypted wallet. The decrypted wallet will be written + on the filesystem in place of the encrypted wallet. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + w := args[0] + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + + _, err := decryptWallet(w, pr) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + return nil + }, + } + + decryptWalletCmd.Flags().StringP("password", "p", "", "wallet password") + + return decryptWalletCmd +} + +func decryptWallet(walletFile string, pr PasswordReader) (wallet.Wallet, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + if !wlt.IsEncrypted() { + return nil, wallet.ErrWalletNotEncrypted + } + + if pr == nil { + return nil, wallet.ErrMissingPassword + } + + wltPassword, err := pr.Password() + if err != nil { + return nil, err + } + + unlockedWlt, err := wallet.Unlock(wlt, wltPassword) + if err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + // save the wallet + if err := wallet.Save(unlockedWlt, dir); err != nil { + return nil, WalletLoadError{err} + } + + return unlockedWlt, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/distribute_genesis.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/distribute_genesis.go new file mode 100644 index 00000000..6ee184f2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/distribute_genesis.go @@ -0,0 +1,147 @@ +package cli + +import ( + "errors" + "fmt" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/droplet" +) + +func distributeGenesisCmd() *cobra.Command { + cmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "distributeGenesis [genesis address secret key]", + Short: "Distributes the genesis block coins into the configured distribution addresses", + Long: `Distributes the genesis block coins into the configured distribution addresses. + + The genesis block contains a single transaction with a single output that creates all coins + in existence. Skycoin expects the second block to be a "distribution" transaction, where + the genesis coins are split into N distribution addresses, each holding an equal amount. + + RPC_ADDR must be set, to communicate with a running Skycoin node.`, + RunE: distributeGenesisHandler, + } + + cmd.Flags().StringP("genesis-seckey", "s", "", "Genesis address secret key") + + return cmd +} + +func distributeGenesisHandler(c *cobra.Command, args []string) error { + sk, err := cipher.SecKeyFromHex(args[0]) + if err != nil { + return errors.New("invalid genesis secret key") + } + + // Obtain the genesis uxid from the node + uxID, err := getGenesisUxID() + if err != nil { + return err + } + + txn, err := createDistributionTransaction(uxID, sk, params.MainNetDistribution) + if err != nil { + return err + } + + health, err := apiClient.Health() + if err != nil { + return err + } + + // If the node is a block publisher node, we can skip the broadcast and + // avoid any broadcast related errors. Otherwise, InjectTransaction would + // require that the block publisher node be connected to another peer. + // Otherwise, inject the transaction normally, which requires the node + // to be connected to peers, or else an error is returned. + // This allows the user to use this command against a block publisher node + // during setup, or against a local node, after setting up a block publisher + // node elsewhere. + if health.BlockPublisher { + if _, err := apiClient.InjectTransactionNoBroadcast(txn); err != nil { + return err + } + } else { + if _, err := apiClient.InjectTransaction(txn); err != nil { + return err + } + } + + return nil +} + +func getGenesisUxID() (string, error) { + // Check that the only block is the genesis block + bm, err := apiClient.BlockchainMetadata() + if err != nil { + return "", err + } + if bm.Head.BkSeq != 0 { + return "", errors.New("genesis output has already been distributed") + } + + b, err := apiClient.BlockBySeq(0) + if err != nil { + return "", err + } + + // Sanity checks + if len(b.Body.Transactions) != 1 { + return "", errors.New("genesis block has multiple transactions") + } + if len(b.Body.Transactions[0].Out) != 1 { + return "", errors.New("genesis block has multiple outputs") + } + + return b.Body.Transactions[0].Out[0].Hash, nil +} + +func createDistributionTransaction(uxID string, genesisSecKey cipher.SecKey, p params.Distribution) (*coin.Transaction, error) { + // Sanity check + addrs := p.AddressesDecoded() + if p.MaxCoinSupply%uint64(len(addrs)) != 0 { + return nil, errors.New("the number of distribution addresses must divide MaxCoinSupply exactly") + } + + var txn coin.Transaction + + output, err := cipher.SHA256FromHex(uxID) + if err != nil { + return nil, fmt.Errorf("invalid uxid") + } + + if err := txn.PushInput(output); err != nil { + return nil, err + } + + coins := (p.MaxCoinSupply / uint64(len(addrs))) * droplet.Multiplier + hours := uint64(1000) + + for _, addr := range addrs { + if err := txn.PushOutput(addr, coins, hours); err != nil { + return nil, err + } + } + + seckeys := make([]cipher.SecKey, 1) + seckey := genesisSecKey.Hex() + seckeys[0] = cipher.MustSecKeyFromHex(seckey) + txn.SignInputs([]cipher.SecKey{ + genesisSecKey, + }) + + if err := txn.UpdateHeader(); err != nil { + return nil, err + } + + if err := txn.Verify(); err != nil { + return nil, err + } + + return &txn, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/encrypt_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/encrypt_wallet.go new file mode 100644 index 00000000..50547f72 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/encrypt_wallet.go @@ -0,0 +1,87 @@ +package cli + +import ( + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func encryptWalletCmd() *cobra.Command { + encryptWalletCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Short: "Encrypt wallet", + Use: "encryptWallet [wallet]", + Long: `Encrypt a decrypted wallet. The encrypted wallet file + will be written on the filesystem in place of the decrypted wallet. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + w := args[0] + cryptoType, err := wallet.CryptoTypeFromString(c.Flag("crypto-type").Value.String()) + if err != nil { + printHelp(c) + return err + } + + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + + _, err = encryptWallet(w, pr, cryptoType) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + return nil + }, + } + + encryptWalletCmd.Flags().StringP("password", "p", "", "wallet password") + encryptWalletCmd.Flags().StringP("crypto-type", "x", "scrypt-chacha20poly1305", "The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor") + return encryptWalletCmd +} + +func encryptWallet(walletFile string, pr PasswordReader, cryptoType wallet.CryptoType) (wallet.Wallet, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + + if pr == nil { + return nil, wallet.ErrMissingPassword + } + + password, err := pr.Password() + if err != nil { + return nil, err + } + + if err := wallet.Lock(wlt, password, cryptoType); err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + // save the wallet + if err := wallet.Save(wlt, dir); err != nil { + return nil, WalletLoadError{err} + } + + return wlt, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_addrs.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_addrs.go new file mode 100644 index 00000000..3e4463d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_addrs.go @@ -0,0 +1,183 @@ +package cli + +import ( + "errors" + "fmt" + "path/filepath" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func walletAddAddressesCmd() *cobra.Command { + walletAddAddressesCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "walletAddAddresses [wallet]", + Short: "Generate additional addresses for a deterministic, bip44 or xpub wallet", + Long: `Generate additional addresses for a deterministic, bip44 or xpub wallet. + Addresses are generated according to the wallet type's generation mechanism. + + Warning: if you generate long (over 20) sequences of empty addresses and use + a later address this can cause the wallet history scanner to miss your addresses, + if you load the wallet from seed elsewhere. In that case, you'll have to manually + generate addresses to cover the gap of unused addresses in the sequence. + + BIP44 wallets generate their addresses on the external (0'/0) chain. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered from the + history log. If you do not include the "-p" option you will be prompted to + enter your password after you enter your command.`, + RunE: generateAddrs, + } + + walletAddAddressesCmd.Flags().Uint64P("num", "n", 1, "Number of addresses to generate") + walletAddAddressesCmd.Flags().StringP("password", "p", "", "wallet password") + walletAddAddressesCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format") + + return walletAddAddressesCmd +} + +func generateAddrs(c *cobra.Command, args []string) error { + // get number of address that are need to be generated. + num, err := c.Flags().GetUint64("num") + if err != nil { + return err + } + + if num == 0 { + return errors.New("-n must > 0") + } + + jsonFmt, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + w := args[0] + + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + addrs, err := GenerateAddressesInFile(w, num, pr) + + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + if jsonFmt { + s, err := FormatAddressesAsJSON(addrs) + if err != nil { + return err + } + fmt.Println(s) + } else { + fmt.Println(FormatAddressesAsJoinedArray(addrs)) + } + + return nil +} + +// GenerateAddressesInFile generates addresses in given wallet file +func GenerateAddressesInFile(walletFile string, num uint64, pr PasswordReader) ([]cipher.Addresser, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + genAddrsInWallet := func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) { + return w.GenerateAddresses(n) + } + + if wlt.IsEncrypted() { + genAddrsInWallet = func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) { + password, err := pr.Password() + if err != nil { + return nil, err + } + + var addrs []cipher.Addresser + if err := wallet.GuardUpdate(w, password, func(wlt wallet.Wallet) error { + var err error + addrs, err = wlt.GenerateAddresses(n) + return err + }); err != nil { + return nil, err + } + + return addrs, nil + } + } + + addrs, err := genAddrsInWallet(wlt, num) + if err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + if err := wallet.Save(wlt, dir); err != nil { + return nil, WalletSaveError{err} + } + + return addrs, nil +} + +// FormatAddressesAsJSON converts []cipher.Address to strings and formats the array into a standard JSON object wrapper +func FormatAddressesAsJSON(addrs []cipher.Addresser) (string, error) { + d, err := formatJSON(struct { + Addresses []string `json:"addresses"` + }{ + Addresses: AddressesToStrings(addrs), + }) + + if err != nil { + return "", err + } + + return string(d), nil +} + +// FormatAddressesAsJoinedArray converts []cipher.Address to strings and concatenates them with a comma +func FormatAddressesAsJoinedArray(addrs []cipher.Addresser) string { + return strings.Join(AddressesToStrings(addrs), ",") +} + +// AddressesToStrings converts []cipher.Address to []string +func AddressesToStrings(addrs []cipher.Addresser) []string { + if addrs == nil { + return nil + } + + addrsStr := make([]string, len(addrs)) + for i, a := range addrs { + addrsStr[i] = a.String() + } + + return addrsStr +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_wallet.go new file mode 100644 index 00000000..c4f24948 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_wallet.go @@ -0,0 +1,316 @@ +package cli + +import ( + "encoding/hex" + "errors" + "fmt" + "os" + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +const ( + // AlphaNumericSeedLength is the size of generated alphanumeric seeds, in bytes + AlphaNumericSeedLength = 64 +) + +func walletCreateCmd() *cobra.Command { + walletCreateCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "walletCreate [wallet]", + Short: "Create a new wallet", + Long: `Create a new wallet. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered + from the history log. If you do not include the "-p" option you will + be prompted to enter your password after you enter your command. + + All results are returned in JSON format in addition to being written to the specified filename.`, + SilenceUsage: true, + RunE: generateWalletHandler, + } + + walletCreateCmd.Flags().BoolP("random", "r", false, "A random alpha numeric seed will be generated.") + walletCreateCmd.Flags().BoolP("mnemonic", "m", false, "A mnemonic seed consisting of 12 dictionary words will be generated") + walletCreateCmd.Flags().Uint64P("wordcount", "w", 12, "Number of seed words to use for mnemonic. Must be 12, 15, 18, 21 or 24") + walletCreateCmd.Flags().StringP("seed", "s", "", "Your seed") + walletCreateCmd.Flags().StringP("seed-passphrase", "", "", "Seed passphrase (bip44 wallets only)") + walletCreateCmd.Flags().Uint32P("bip44-coin", "", uint32(bip44.CoinTypeSkycoin), "BIP44 coin type") + walletCreateCmd.Flags().StringP("coin", "c", string(wallet.CoinTypeSkycoin), "Wallet address coin type (options: skycoin, bitcoin)") + walletCreateCmd.Flags().Uint64P("num", "n", 1, `Number of addresses to generate.`) + walletCreateCmd.Flags().StringP("label", "l", "", "Label used to identify your wallet.") + walletCreateCmd.Flags().StringP("type", "t", wallet.WalletTypeDeterministic, "Wallet type. Types are \"collection\", \"deterministic\", \"bip44\" or \"xpub\"") + walletCreateCmd.Flags().BoolP("encrypt", "e", false, "Create encrypted wallet.") + walletCreateCmd.Flags().StringP("crypto-type", "x", string(wallet.DefaultCryptoType), "The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor") + walletCreateCmd.Flags().StringP("password", "p", "", "Wallet password") + walletCreateCmd.Flags().StringP("xpub", "", "", "xpub key for \"xpub\" type wallets") + + return walletCreateCmd +} + +func generateWalletHandler(c *cobra.Command, args []string) error { + wltName := args[0] + // wallet filename must have the correct extension + if filepath.Ext(wltName) != walletExt { + return ErrWalletName + } + + // check if the wallet file does exist + if _, err := os.Stat(wltName); err == nil { + return fmt.Errorf("%v already exists", wltName) + } + + // get number of address that are need to be generated + num, err := c.Flags().GetUint64("num") + if err != nil { + return err + } + if num == 0 { + return errors.New("-n must > 0") + } + + label := c.Flag("label").Value.String() + + s := c.Flag("seed").Value.String() + random, err := c.Flags().GetBool("random") + if err != nil { + return err + } + + mnemonic, err := c.Flags().GetBool("mnemonic") + if err != nil { + return err + } + + wordCount, err := c.Flags().GetUint64("wordcount") + if err != nil { + return err + } + + if !mnemonic && c.Flags().Changed("wordcount") { + return errors.New("-m must also be set when using -wordcount") + } + + encrypt, err := c.Flags().GetBool("encrypt") + if err != nil { + return err + } + + walletType, err := c.Flags().GetString("type") + if err != nil { + return err + } + if !wallet.IsValidWalletType(walletType) { + return wallet.ErrInvalidWalletType + } + + coinStr, err := c.Flags().GetString("coin") + if err != nil { + return err + } + coin, err := wallet.ResolveCoinType(coinStr) + if err != nil { + return err + } + + var bip44Coin *bip44.CoinType + if c.Flags().Changed("bip44-coin") { + bip44CoinInt, err := c.Flags().GetUint32("bip44-coin") + if err != nil { + return err + } + + c := bip44.CoinType(bip44CoinInt) + bip44Coin = &c + } + + xpub, err := c.Flags().GetString("xpub") + if err != nil { + return err + } + + var sd string + switch walletType { + case wallet.WalletTypeBip44: + var err error + sd, err = parseBip44WalletSeedOptions(s, random, mnemonic, wordCount) + if err != nil { + return err + } + + case wallet.WalletTypeDeterministic: + var err error + sd, err = parseDeterministicWalletSeedOptions(s, random, mnemonic, wordCount) + if err != nil { + return err + } + + case wallet.WalletTypeCollection: + if s != "" || random || mnemonic { + return fmt.Errorf("%q type wallets do not use seeds", walletType) + } + if c.Flags().Changed("num") { + return fmt.Errorf("%q type wallets do not support address generation", walletType) + } + num = 0 + + case wallet.WalletTypeXPub: + if s != "" || random || mnemonic { + return fmt.Errorf("%q type wallets do not use seeds", walletType) + } + + default: + return fmt.Errorf("unhandled wallet type %q", walletType) + } + + seedPassphrase, err := c.Flags().GetString("seed-passphrase") + if err != nil { + return err + } + + cryptoType, err := wallet.CryptoTypeFromString(c.Flag("crypto-type").Value.String()) + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + switch pr.(type) { + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return err + } + + if !encrypt && len(p) != 0 { + return errors.New("password should not be set as we're not going to create a wallet with encryption") + } + } + + var password []byte + if encrypt { + var err error + password, err = pr.Password() + if err != nil { + return err + } + } + + opts := wallet.Options{ + Label: label, + Seed: sd, + SeedPassphrase: seedPassphrase, + Encrypt: encrypt, + CryptoType: cryptoType, + Password: password, + Type: walletType, + GenerateN: num, + Coin: coin, + Bip44Coin: bip44Coin, + XPub: xpub, + } + + wlt, err := wallet.NewWallet(filepath.Base(wltName), opts) + if err != nil { + return err + } + + if err := wallet.Save(wlt, filepath.Dir(wltName)); err != nil { + return err + } + + return printJSON(wlt.ToReadable()) +} + +// wordCountToEntropy maps a mnemonic word count to its entropy size in bits +func wordCountToEntropy(wc uint64) (int, error) { + switch wc { + case 12: + return 128, nil + case 15: + return 160, nil + case 18: + return 192, nil + case 21: + return 224, nil + case 24: + return 256, nil + default: + return 0, errors.New("word count must be 12, 15, 18, 21 or 24") + } +} + +func newMnemomic(wc uint64) (string, error) { + entropySize, err := wordCountToEntropy(wc) + if err != nil { + return "", err + } + e, err := bip39.NewEntropy(entropySize) + if err != nil { + return "", err + } + return bip39.NewMnemonic(e) +} + +func parseBip44WalletSeedOptions(s string, r, m bool, wc uint64) (string, error) { + if s != "" && (r || m) { + return "", errors.New("-r and -m can't be used with -s") + } + + if r { + return "", errors.New("-r can't be used for bip44 wallets") + } + + if m || s == "" { + var err error + s, err = newMnemomic(wc) + if err != nil { + return "", err + } + } + + if err := bip39.ValidateMnemonic(s); err != nil { + return "", fmt.Errorf("seed must be a valid bip39 mnemonic: %v", err) + } + + return s, nil +} + +func parseDeterministicWalletSeedOptions(s string, r, m bool, wc uint64) (string, error) { + if s != "" { + // 111, 101, 110 + if r || m { + return "", errors.New("seed already specified, must not use -r or -m again") + } + // 100 + return s, nil + } + + // 011 + if r && m { + return "", errors.New("for -r and -m, only one option can be used") + } + + // 010 + if r { + return MakeAlphanumericSeed(), nil + } + + // 001, 000 + return newMnemomic(wc) +} + +// PUBLIC + +// MakeAlphanumericSeed creates a random seed with AlphaNumericSeedLength bytes and hex encodes it +func MakeAlphanumericSeed() string { + seedRaw := cipher.SumSHA256(secp256k1.RandByte(AlphaNumericSeedLength)) + return hex.EncodeToString(seedRaw[:]) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/empty.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/empty.go new file mode 100644 index 00000000..a0bb99d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/empty.go @@ -0,0 +1,2 @@ +// Package integration implements CLI integration tests +package integration diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/integration_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/integration_test.go new file mode 100644 index 00000000..05a44335 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/integration_test.go @@ -0,0 +1,3529 @@ +// Package integration_test implements CLI integration tests +package integration_test + +import ( + "bytes" + "encoding/csv" + "encoding/hex" + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "math/rand" + "os" + "os/exec" + "path/filepath" + "reflect" + "regexp" + "strconv" + "strings" + "sync" + "testing" + "time" + + "github.com/andreyvit/diff" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cli" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/droplet" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +const ( + binaryName = "skycoin-cli.test" + + testModeStable = "stable" + testModeLive = "live" + + // Number of random transactions of live transaction test. + randomLiveTransactionNum = 500 + + testFixturesDir = "testdata" + + stableWalletName = "integration-test.wlt" + stableEncryptWalletName = "integration-test-encrypted.wlt" +) + +var ( + binaryPath string + + update = flag.Bool("update", false, "update golden files") + liveTxFull = flag.Bool("live-tx-full", false, "run live transaction test against full blockchain") + testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") + + cryptoTypes = []wallet.CryptoType{wallet.CryptoTypeScryptChacha20poly1305, wallet.CryptoTypeSha256Xor} + + validNameRegexp = regexp.MustCompile(`^[a-zA-Z0-9_\-]+$`) + stripCoverageReport = regexp.MustCompile(`PASS\ncoverage: [\d\.]+% of statements in github.com/SkycoinProject/skycoin/\.\.\.\n$`) +) + +type TestData struct { + actual interface{} + expected interface{} +} + +func init() { + rand.Seed(time.Now().Unix()) +} + +func sanitizeName(s string) (string, error) { + if s == "" { + return "", errors.New("sanitizeName name empty") + } + s = strings.Replace(s, " ", "-", -1) + if !validNameRegexp.MatchString(s) { + return "", errors.New("sanitizeName name has invalid characters") + } + return s, nil +} + +// coverprofileNames manages names for unique coverprofile outputs from invocations of the cli test binary +type coverprofileNames struct { + names map[string]struct{} + sync.Mutex +} + +func newCoverprofileNames() *coverprofileNames { + return &coverprofileNames{ + names: make(map[string]struct{}), + } +} + +func (n *coverprofileNames) makeName(name string) (string, error) { + name, err := sanitizeName(name) + if err != nil { + return "", err + } + coverprofile := fmt.Sprintf("cli-%s", name) + + coverprofile = n.add(coverprofile) + + return coverprofile, nil +} + +func (n *coverprofileNames) add(s string) string { + n.Lock() + defer n.Unlock() + + i := 1 + _, ok := n.names[fmt.Sprintf("%s.coverage.out", s)] + for ok { + x := fmt.Sprintf("%s-%d.coverage.out", s, i) + _, ok = n.names[x] + if !ok { + s = x + } + i++ + } + + s = fmt.Sprintf("%s.coverage.out", s) + n.names[s] = struct{}{} + return s +} + +var ( + cpNames = newCoverprofileNames() +) + +func execCommand(args ...string) *exec.Cmd { + // Add test flags to arguments to generate a coverage report + coverprofile, err := cpNames.makeName(args[0]) + if err != nil { + panic(err) + } + args = append(args, []string{fmt.Sprintf("--test.coverprofile=../../../coverage/%s", coverprofile)}...) + return exec.Command(binaryPath, args...) +} + +func execCommandCombinedOutput(args ...string) ([]byte, error) { + cmd := execCommand(args...) + output, err := cmd.CombinedOutput() + if err != nil { + return output, err + } + // Remove the trailing coverage statements that the test cli binary produces due to coverage mode, e.g. + // PASS + // coverage: 8.1% of statements in github.com/SkycoinProject/skycoin/... + output = stripCoverageReport.ReplaceAll(output, nil) + return output, nil +} + +func TestMain(m *testing.M) { + if !enabled() { + return + } + + abs, err := filepath.Abs(binaryName) + if err != nil { + fmt.Fprintf(os.Stderr, "get binary name absolute path failed: %v\n", err) + os.Exit(1) + } + + binaryPath = abs + + // Build cli binary file. + // Args to build the cli binary without coverage: + // args := []string{"build", "-o", binaryPath, "../../../cmd/skycoin-cli/skycoin-cli.go"} + // Compile the binary with test flags enabled to get a coverage report from the binary + args := []string{"test", "-c", "-tags", "testrunmain", "-o", binaryPath, "-coverpkg=github.com/SkycoinProject/skycoin/...", "../../../cmd/skycoin-cli/"} + if err := exec.Command("go", args...).Run(); err != nil { + fmt.Fprintf(os.Stderr, "Make %v binary failed: %v\n", binaryName, err) + os.Exit(1) + } + + ret := m.Run() + + // Remove the generated cli binary file. + if err := os.Remove(binaryPath); err != nil { + fmt.Fprintf(os.Stderr, "Delete %v failed: %v", binaryName, err) + os.Exit(1) + } + + os.Exit(ret) +} + +func createUnencryptedWallet(t *testing.T) (string, func()) { + return createTempWallet(t, "", false) +} + +func createUnencryptedWalletAt(t *testing.T, filename string) (string, func()) { + return createTempWallet(t, filename, false) +} + +func createEncryptedWallet(t *testing.T) (string, func()) { //nolint:unparam + return createTempWallet(t, "", true) +} + +// createTempWallet creates a temporary dir, and if encrypt is true, copy +// the testdata/$stableEncryptedWalletName file to the dir. If it's false, then +// copy the testdata/$stableWalletName file to the dir +// returns the temporary wallet filename, cleanup callback function, and error if any. +func createTempWallet(t *testing.T, filename string, encrypt bool) (string, func()) { + var dir string + if filename == "" { + var err error + dir, err = ioutil.TempDir("", "wallet-data-dir") + require.NoError(t, err) + } else { + dir = filepath.Dir(filename) + } + + // Copy the testdata/$stableWalletName to the temporary dir. + wltName := filepath.Base(filename) + if wltName == "" || wltName == "." { + if encrypt { + wltName = stableEncryptWalletName + } else { + wltName = stableWalletName + } + } + + walletFile := filepath.Join(dir, wltName) + f, err := os.Create(walletFile) + require.NoError(t, err) + + defer f.Close() + + rf, err := os.Open(filepath.Join(testFixturesDir, wltName)) + require.NoError(t, err) + + defer rf.Close() + + _, err = io.Copy(f, rf) + require.NoError(t, err) + + return walletFile, func() { + // Delete the temporary dir + err = os.RemoveAll(dir) + if err != nil { + t.Logf("Failed to cleanup temp wallet dir %s: %v", dir, err) + } + } +} + +// createTempWalletDir creates a temporary wallet dir, +// Returns wallet dir path and callback function to clean up the dir. +func createTempWalletDir(t *testing.T) (string, func()) { + dir, err := ioutil.TempDir("", "wallet-data-dir") + require.NoError(t, err) + + return dir, func() { + os.RemoveAll(dir) + } +} + +func loadJSON(t *testing.T, filename string, obj interface{}) { + f, err := os.Open(filename) + require.NoError(t, err) + defer f.Close() + + err = json.NewDecoder(f).Decode(obj) + require.NoError(t, err) +} + +func loadGoldenFile(t *testing.T, filename string, testData TestData) { + require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") + + goldenFile := filepath.Join(testFixturesDir, filename) + + if *update { + updateGoldenFile(t, goldenFile, testData.actual) + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + err = json.NewDecoder(f).Decode(testData.expected) + require.NoError(t, err, filename) +} + +func updateGoldenFile(t *testing.T, filename string, content interface{}) { + contentJSON, err := json.MarshalIndent(content, "", "\t") + require.NoError(t, err) + contentJSON = append(contentJSON, '\n') + err = ioutil.WriteFile(filename, contentJSON, 0644) + require.NoError(t, err) +} + +func checkGoldenFile(t *testing.T, goldenFile string, td TestData) { + loadGoldenFile(t, goldenFile, td) + require.Equal(t, reflect.Indirect(reflect.ValueOf(td.expected)).Interface(), td.actual) + checkGoldenFileObjectChanges(t, goldenFile, td) +} + +func checkGoldenFileObjectChanges(t *testing.T, goldenFile string, td TestData) { + // Serialize expected to JSON and compare to the goldenFile's contents + // This will detect field changes that could be missed otherwise + b, err := json.MarshalIndent(td.expected, "", "\t") + require.NoError(t, err) + + goldenFile = filepath.Join(testFixturesDir, goldenFile) + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + c, err := ioutil.ReadAll(f) + require.NoError(t, err) + + sc := string(c) + sb := string(b) + "\n" + + require.Equal(t, sc, sb, "JSON struct output differs from golden file, was a field added to the struct?\nDiff:\n"+diff.LineDiff(sc, sb)) +} + +func mode(t *testing.T) string { + mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") + switch mode { + case "": + mode = testModeStable + case testModeLive, testModeStable: + default: + t.Fatal("Invalid test mode, must be stable or live") + } + return mode +} + +func enabled() bool { + return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" +} + +func doStable(t *testing.T) bool { + if enabled() && mode(t) == testModeStable { + return true + } + + t.Skip("Stable tests disabled") + return false +} + +func doLive(t *testing.T) bool { + if enabled() && mode(t) == testModeLive { + return true + } + + t.Skip("Live tests disabled") + return false +} + +func doLiveWallet(t *testing.T) bool { + if *testLiveWallet { + return true + } + + t.Skip("Tests requiring wallet envvars are disabled") + return false +} + +func dbNoUnconfirmed(t *testing.T) bool { + x := os.Getenv("DB_NO_UNCONFIRMED") + if x == "" { + return false + } + + v, err := strconv.ParseBool(x) + require.NoError(t, err) + return v +} + +// requireWalletEnv checks if live wallet tests are enabled and the CLI_WALLET_FILE environment variable is set +func requireWalletEnv(t *testing.T) string { + if !doLiveWallet(t) { + t.Fatal("not doing live wallet tests, should have skipped") + } + + walletFile := os.Getenv("CLI_WALLET_FILE") + if walletFile == "" { + t.Fatal("missing CLI_WALLET_FILE environment variable") + } + + return walletFile +} + +func doLiveOrStable(t *testing.T) bool { + if enabled() { + switch mode(t) { + case testModeStable, testModeLive: + return true + } + } + + t.Skip("Live and stable tests disabled") + return false +} + +func rpcAddress() string { + rpcAddr := os.Getenv("RPC_ADDR") + if rpcAddr == "" { + rpcAddr = "http://127.0.0.1:6420" + } + + return rpcAddr +} + +func newClient() *api.Client { + c := api.NewClient(rpcAddress()) + c.SetAuth(os.Getenv("RPC_USER"), os.Getenv("RPC_PASS")) + return c +} + +func useCSRF(t *testing.T) bool { + x := os.Getenv("USE_CSRF") + if x == "" { + return false + } + + useCSRF, err := strconv.ParseBool(x) + require.NoError(t, err) + return useCSRF +} + +func doHeaderCheck(t *testing.T) bool { + x := os.Getenv("HEADER_CHECK") + if x == "" { + return false + } + + doHeaderCheck, err := strconv.ParseBool(x) + require.NoError(t, err) + return doHeaderCheck + +} + +func TestWalletAddAddresses(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + encrypted bool + args []string + isUsageErr bool + expectOutput []byte + goldenFile string + }{ + { + name: "walletAddAddresses", + encrypted: false, + expectOutput: []byte("7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\n"), + goldenFile: "generate-addresses.golden", + }, + { + name: "walletAddAddresses -n 2 -j", + encrypted: false, + args: []string{"-n", "2", "-j"}, + expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\",\n \"2EDapDfn1VC6P2hx4nTH2cRUkboGAE16evV\"\n ]\n}\n"), + goldenFile: "generate-addresses-2.golden", + }, + { + name: "walletAddAddresses -n -2 -j", + encrypted: false, + args: []string{"-n", "-2", "-j"}, + isUsageErr: true, + expectOutput: []byte("Error: invalid value \"-2\" for flag -n: strconv.ParseUint: parsing \"-2\": invalid syntax"), + goldenFile: "generate-addresses-2.golden", + }, + { + name: "walletAddAddresses in encrypted wallet", + encrypted: true, + args: []string{"-p", "pwd", "-j"}, + expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\"\n ]\n}\n"), + goldenFile: "generate-addresses-encrypted.golden", + }, + { + name: "walletAddAddresses in encrypted wallet with invalid password", + encrypted: true, + args: []string{"-p", "invalid password", "-j"}, + expectOutput: []byte("invalid password\n"), + }, + { + name: "walletAddAddresses in unencrypted wallet with password", + encrypted: false, + args: []string{"-p", "pwd"}, + expectOutput: []byte("wallet is not encrypted\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + walletFile, clean := createTempWallet(t, "", tc.encrypted) + defer clean() + + args := append([]string{"walletAddAddresses", walletFile}, tc.args...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + return + } + + if tc.isUsageErr { + require.True(t, bytes.Contains(output, tc.expectOutput)) + return + } + + require.Equal(t, tc.expectOutput, output) + + require.NoError(t, err) + + var w wallet.ReadableCollectionWallet + loadJSON(t, walletFile, &w) + + // Use loadJSON instead of loadGoldenFile because this golden file + // should not use the *update flag + goldenFile := filepath.Join(testFixturesDir, tc.goldenFile) + var expect wallet.ReadableCollectionWallet + loadJSON(t, goldenFile, &expect) + if tc.encrypted { + // wipe secrets as it's not stable + expect.Meta["secrets"] = "" + w.Meta["secrets"] = "" + } + require.Equal(t, expect, w) + }) + } +} + +func TestVerifyAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + addr string + err error + errMsg string + }{ + { + "valid skycoin address", + "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + nil, + "", + }, + { + "invalid skycoin address", + "2KG9eRXUhx6hrDZvNGB99DKahtrPDQ1W9vn", + errors.New("exit status 1"), + "Error: Invalid checksum", + }, + { + "invalid bitcoin address", + "1Dcb9gpaZpBKmjqjCsiBsP3sBW1md2kEM2", + errors.New("exit status 1"), + "Error: Invalid checksum", + }, + } + + for _, tc := range tt { + output, err := execCommandCombinedOutput("verifyAddress", tc.addr) + if err != nil { + require.Error(t, tc.err, "%v", err) + require.Equal(t, tc.err.Error(), err.Error()) + require.Equal(t, tc.errMsg, strings.Trim(string(output), "\n")) + return + } + + require.Empty(t, output, string(output)) + } +} + +func TestDecodeRawTransaction(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + rawTx string + goldenFile string + errMsg []byte + }{ + { + name: "success", + rawTx: "2601000000a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd401000000a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01010000004d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc0400000000bae12bbf671abeb1181fc85f1c01cdfee55deb97980c9c0a00000000543600000000000000373bb3675cbf3880bba3f3de7eb078925b8a72ad0095ba0a000000001c12000000000000008829025fe45b48f29795893a642bdaa89b2bb40e40d2df03000000001c12000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec09c0fc9b01000000001b12000000000000", + goldenFile: "decode-raw-transaction.golden", + }, + { + name: "invalid raw transaction", + rawTx: "2601000000a1d", + errMsg: []byte("Error: invalid raw transaction: encoding/hex: odd length hex string\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput("decodeRawTransaction", tc.rawTx) + if err != nil { + require.Error(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + require.NoError(t, err) + + var txn readable.Transaction + err = json.NewDecoder(bytes.NewReader(output)).Decode(&txn) + require.NoError(t, err) + + var expect readable.Transaction + checkGoldenFile(t, tc.goldenFile, TestData{txn, &expect}) + }) + } + +} + +func TestEncodeJSONTransaction(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + pathToGoldenFile := func(filename string) string { + return filepath.Join(testFixturesDir, filename) + } + + tt := []struct { + name string + rawTx string + errMsg []byte + args []string + }{ + { + name: "encode success", + rawTx: "2601000000a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd401000000a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01010000004d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc0400000000bae12bbf671abeb1181fc85f1c01cdfee55deb97980c9c0a00000000543600000000000000373bb3675cbf3880bba3f3de7eb078925b8a72ad0095ba0a000000001c12000000000000008829025fe45b48f29795893a642bdaa89b2bb40e40d2df03000000001c12000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec09c0fc9b01000000001b12000000000000", + args: []string{"encodeJsonTransaction", pathToGoldenFile("decode-raw-transaction.golden")}, + }, + { + name: "encode recompute success", + rawTx: "b7000000006b1a69b76b2412314b2b928ad5e97c31c034be5734f9fa77f31f11b6b933b97601000000ddf4bd79f66ea9c7849c5240a27d9a4745ad4661bdac2179184447088512bb3e62c89efa4fd2cee05980c59b38ef23ddbd09bb77e54e94a0f9123d968a090d420101000000f7c183c1823266aff172928f8d06aa65531643456f97ccca6bd34d15e92fac7d01000000000421aa1694a5b04955781d91880d16c0e9c4227ae8030000000000001600000000000000", + args: []string{"encodeJsonTransaction", "--fix", pathToGoldenFile("recompute-transaction-hash.golden")}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + if err != nil { + require.Error(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + require.NoError(t, err) + + output = bytes.Trim(output, "\n") + + require.Equal(t, tc.rawTx, string(output)) + }) + } +} + +func TestAddressGen(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + err error + check func(t *testing.T, output []byte) + }{ + { + name: "addressGen --mode=wallet", + args: []string{"addressGen", "--mode=wallet"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms that the seed is consisted of 12 words + seed := w.Seed() + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + }, + }, + { + name: "addressGen --mode=wallet --num 2", + args: []string{"addressGen", "--mode=wallet", "--num", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms that the seed is consisted of 12 words + seed := w.Seed() + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + + // Confirms that the wallet have 2 address + entries := w.GetEntries() + require.Len(t, entries, 2) + + // Confirms the addresses are generated from the seed + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.MustPubKeyFromSecKey(key) + addr := cipher.MustAddressFromSecKey(key) + require.Equal(t, addr.String(), entries[i].Address) + require.Equal(t, pk.Hex(), entries[i].Public) + require.Equal(t, key.Hex(), entries[i].Secret) + } + }, + }, + { + name: "addressGen --mode=wallet -n 2", + args: []string{"addressGen", "--mode=wallet", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms that the seed is consisted of 12 words + seed := w.Seed() + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + + // Confirms that the wallet have 2 address + entries := w.GetEntries() + require.Len(t, entries, 2) + + // Confirms the addresses are generated from the seed + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.MustPubKeyFromSecKey(key) + addr := cipher.MustAddressFromSecKey(key) + require.Equal(t, addr.String(), entries[i].Address) + require.Equal(t, pk.Hex(), entries[i].Public) + require.Equal(t, key.Hex(), entries[i].Secret) + } + }, + }, + { + name: "addressGen --mode=wallet --hide-secrets -n 2", + args: []string{"addressGen", "--mode=wallet", "--hide-secrets", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms the secrets in Entries are hidden + require.Len(t, w.GetEntries(), 2) + for _, e := range w.GetEntries() { + require.Equal(t, e.Secret, "") + } + }, + }, + { + name: "addressGen -m=wallet -i -n 2", + args: []string{"addressGen", "-m=wallet", "-i", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms the secrets in Entries are hidden + require.Len(t, w.GetEntries(), 2) + for _, e := range w.GetEntries() { + require.Equal(t, e.Secret, "") + } + }, + }, + { + name: "addressGen --mode=wallet--coin=bitcoin -n 2", + args: []string{"addressGen", "--mode=wallet", "--coin=bitcoin", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeBitcoin, wallet.CoinType(w.Meta["coin"])) + + entries := w.GetEntries() + require.Len(t, entries, 2) + + // Confirms the addresses are bitcoin addresses that generated from the seed + seed := w.Seed() + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.MustPubKeyFromSecKey(key) + sk := cipher.BitcoinWalletImportFormatFromSeckey(key) + address := cipher.BitcoinAddressFromPubKey(pk) + require.Equal(t, address.String(), entries[i].Address) + require.Equal(t, pk.Hex(), entries[i].Public) + require.Equal(t, sk, entries[i].Secret) + } + }, + }, + { + name: "addressGen --mode=wallet -c=btc -n 2", + args: []string{"addressGen", "--mode=wallet", "-c=btc", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeBitcoin, wallet.CoinType(w.Meta["coin"])) + + entries := w.GetEntries() + require.Len(t, w.GetEntries(), 2) + + // Confirms the addresses are bitcoin addresses that generated from the seed + seed := w.Seed() + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.MustPubKeyFromSecKey(key) + sk := cipher.BitcoinWalletImportFormatFromSeckey(key) + address := cipher.BitcoinAddressFromPubKey(pk) + require.Equal(t, address.String(), entries[i].Address) + require.Equal(t, pk.Hex(), entries[i].Public) + require.Equal(t, sk, entries[i].Secret) + } + }, + }, + { + name: "addressGen --mode=wallet --hex", + args: []string{"addressGen", "--mode=wallet", "--hex"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the seed is a valid hex string + _, err = hex.DecodeString(w.Seed()) + require.NoError(t, err) + }, + }, + { + name: "addressGen --mode=addresses", + args: []string{"addressGen", "--mode=addresses"}, + check: func(t *testing.T, v []byte) { + // Confirms that only addresses are returned + v = bytes.Trim(v, "\n") + _, err := cipher.DecodeBase58Address(string(v)) + require.NoError(t, err) + }, + }, + { + name: "addressGen --mode=addresses --entropy=256", + args: []string{"addressGen", "--mode=addresses", "--entropy=256"}, + check: func(t *testing.T, v []byte) { + // Confirms that only addresses are returned + v = bytes.Trim(v, "\n") + _, err := cipher.DecodeBase58Address(string(v)) + require.NoError(t, err) + }, + }, + { + name: "addressGen --entropy=9", + args: []string{"addressGen", "--entropy=9"}, + check: func(t *testing.T, v []byte) { + require.Equal(t, "Error: entropy must be 128 or 256\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + { + name: "addressGen --mode=wallet --seed 123", + args: []string{"addressGen", "--mode=wallet", "--seed", "123"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + pk, sk := cipher.MustGenerateDeterministicKeyPair([]byte("123")) + addr := cipher.AddressFromPubKey(pk) + entries := w.GetEntries() + require.Len(t, entries, 1) + require.Equal(t, addr.String(), entries[0].Address) + require.Equal(t, pk.Hex(), entries[0].Public) + require.Equal(t, sk.Hex(), entries[0].Secret) + }, + }, + { + name: "addressGen --mode=wallet -s 123", + args: []string{"addressGen", "--mode=wallet", "-s", "123"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + pk, sk := cipher.MustGenerateDeterministicKeyPair([]byte("123")) + addr := cipher.AddressFromPubKey(pk) + entries := w.GetEntries() + require.Len(t, entries, 1) + require.Equal(t, addr.String(), entries[0].Address) + require.Equal(t, pk.Hex(), entries[0].Public) + require.Equal(t, sk.Hex(), entries[0].Secret) + }, + }, + { + name: "addressGen --hide-secrets --mode=secrets", + args: []string{"addressGen", "--mode=secrets", "--hide-secrets"}, + check: func(t *testing.T, v []byte) { + require.Equal(t, "Error: secrets mode selected but hideSecrets enabled\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + { + name: "addressGen --mode=secrets", + args: []string{"addressGen", "--mode=secrets"}, + check: func(t *testing.T, v []byte) { + // Confirms that only secret keys are returned + v = bytes.Trim(v, "\n") + _, err := cipher.SecKeyFromHex(string(v)) + require.NoError(t, err) + }, + }, + { + name: "addressGen --mode=secrets --coin=bitcoin", + args: []string{"addressGen", "--mode=secrets", "--coin=bitcoin"}, + check: func(t *testing.T, v []byte) { + // Confirms that only secret keys are returned + v = bytes.Trim(v, "\n") + _, err := cipher.SecKeyFromBitcoinWalletImportFormat(string(v)) + require.NoError(t, err) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + if tc.err != nil { + require.Error(t, err) + require.Equal(t, tc.err.Error(), err.Error()) + } else { + require.NoError(t, err) + } + + tc.check(t, output) + }) + } +} + +func TestFiberAddressGen(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + checkAddrsFile := func(t *testing.T, fn string, n int) []string { + b, err := ioutil.ReadFile(fn) + require.NoError(t, err) + + addrs := strings.Split(strings.TrimSpace(string(b)), "\n") + require.Equal(t, n, len(addrs)) + + rx := regexp.MustCompile(`"([a-zA-Z0-9]+)",`) + + addrsMap := make(map[string]struct{}, len(addrs)) + out := make([]string, len(addrs)) + for i, a := range addrs { + _, ok := addrsMap[a] + require.False(t, ok) + addrsMap[a] = struct{}{} + + matches := rx.FindStringSubmatch(a) + require.Len(t, matches, 2) + addr := matches[1] + + _, err := cipher.DecodeBase58Address(addr) + require.NoError(t, err) + + out[i] = addr + } + + return out + } + + checkSeedsFile := func(t *testing.T, fn string, entropy int, addrs []string) { + f, err := os.Open(fn) + require.NoError(t, err) + defer f.Close() + + r := csv.NewReader(f) + records, err := r.ReadAll() + require.NoError(t, err) + require.Len(t, records, len(addrs)) + + seedsMap := make(map[string]struct{}, len(records)) + + for i, x := range records { + require.Len(t, x, 2) + + // addr is valid and matches the addr written to the addrs file + addr := x[0] + _, err := cipher.DecodeBase58Address(addr) + require.NoError(t, err) + require.Equal(t, addrs[i], addr) + + seed := x[1] + + // no duplicate seeds + _, ok := seedsMap[seed] + require.False(t, ok) + seedsMap[seed] = struct{}{} + + // seed is a valid mnemonic + err = bip39.ValidateMnemonic(seed) + require.NoError(t, err) + + // seed entropy is as expected + switch entropy { + case 128: + require.Len(t, strings.Split(seed, " "), 12) + case 256: + require.Len(t, strings.Split(seed, " "), 24) + default: + t.Fatalf("entropy must be 128 or 256") + } + + // seed generates the correct address + pk, _ := cipher.MustGenerateDeterministicKeyPair([]byte(seed)) + regenAddr := cipher.AddressFromPubKey(pk) + require.Equal(t, addr, regenAddr.String()) + } + } + + touch := func(t *testing.T, fn string) { + f, err := os.Create(fn) + require.NoError(t, err) + defer f.Close() + err = f.Close() + require.NoError(t, err) + } + + addrsFilename := "addresses.txt" + seedsFilename := "seeds.csv" + + cases := []struct { + name string + args []string + err error + setup func(t *testing.T) + check func(t *testing.T, v []byte) + }{ + { + name: "fiberAddressGen", + args: []string{"fiberAddressGen"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + addrs := checkAddrsFile(t, addrsFilename, 100) + checkSeedsFile(t, seedsFilename, 128, addrs) + }, + }, + { + name: "fiberAddressGen --entropy=256", + args: []string{"fiberAddressGen", "--entropy=256"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + addrs := checkAddrsFile(t, addrsFilename, 100) + checkSeedsFile(t, seedsFilename, 256, addrs) + }, + }, + { + name: "fiberAddressGen -n=1", + args: []string{"fiberAddressGen", "-n=1"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + addrs := checkAddrsFile(t, addrsFilename, 1) + checkSeedsFile(t, seedsFilename, 128, addrs) + }, + }, + { + name: "fiberAddressGen can't overwrite addrs file", + args: []string{"fiberAddressGen"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + touch(t, addrsFilename) + testutil.RequireFileExists(t, addrsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + require.Equal(t, "Error: -addrs-file \"addresses.txt\" already exists. Use -overwrite to force writing\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + { + name: "fiberAddressGen can't overwrite seeds file", + args: []string{"fiberAddressGen"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + touch(t, seedsFilename) + testutil.RequireFileExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileNotExists(t, addrsFilename) + require.Equal(t, "Error: -seeds-file \"seeds.csv\" already exists. Use -overwrite to force writing\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + { + name: "fiberAddressGen --overwrite", + args: []string{"fiberAddressGen", "--overwrite"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + touch(t, addrsFilename) + touch(t, seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + addrs := checkAddrsFile(t, addrsFilename, 100) + checkSeedsFile(t, seedsFilename, 128, addrs) + }, + }, + { + name: "fiberAddressGen --addrs-file=fooaddrs.txt --seeds-file=fooseeds.csv", + args: []string{"fiberAddressGen", "--addrs-file", "fooaddrs.txt", "--seeds-file", "fooseeds.csv"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, "fooaddrs.txt") + testutil.RequireFileNotExists(t, "fooseeds.csv") + }, + check: func(t *testing.T, v []byte) { + defer os.Remove("fooaddrs.txt") + defer os.Remove("fooseeds.csv") + testutil.RequireFileExists(t, "fooaddrs.txt") + testutil.RequireFileExists(t, "fooseeds.csv") + addrs := checkAddrsFile(t, "fooaddrs.txt", 100) + checkSeedsFile(t, "fooseeds.csv", 128, addrs) + }, + }, + { + name: "fiberAddressGen positional-args-not-allowed", + args: []string{"fiberAddressGen", "foo"}, + check: func(t *testing.T, v []byte) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + require.Equal(t, "Error: this command does not take any positional arguments\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.setup != nil { + tc.setup(t) + } + + output, err := execCommandCombinedOutput(tc.args...) + if tc.err != nil { + require.Error(t, err) + require.Equal(t, tc.err.Error(), err.Error()) + } else { + require.NoError(t, err) + } + + tc.check(t, output) + }) + } +} + +func TestStableListWallets(t *testing.T) { + if !doStable(t) { + return + } + + walletName, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("listWallets", filepath.Dir(walletName)) + require.NoError(t, err, output) + + var wlts struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) + require.NoError(t, err) + + var expect struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + checkGoldenFile(t, "list-wallets.golden", TestData{wlts, &expect}) +} + +func TestLiveListWallets(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("listWallets", filepath.Dir(fn)) + require.NoError(t, err) + + var wlts struct { + Directory string `json:"directory"` + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) + require.NoError(t, err) + require.NotEmpty(t, wlts.Wallets) + require.Equal(t, filepath.Dir(fn), wlts.Directory) + + // Defaults to $DATA_DIR/wallets when no arguments are specified + output, err = execCommandCombinedOutput("listWallets") + require.NoError(t, err) + + cfg := showConfig(t) + defaultDir := filepath.Join(cfg.DataDir, "wallets") + var wlts2 struct { + Directory string `json:"directory"` + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts2) + require.NoError(t, err) + require.NotEmpty(t, wlts2.Wallets) + require.Equal(t, defaultDir, wlts2.Directory) +} + +func showConfig(t *testing.T) cli.Config { + output, err := execCommandCombinedOutput("showConfig") + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + return ret +} + +func TestStableListAddress(t *testing.T) { + if !doStable(t) { + return + } + + walletName, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("listAddresses", walletName) + require.NoError(t, err) + + var wltAddresses struct { + Addresses []string `json:"addresses"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) + require.NoError(t, err) + + var expect struct { + Addresses []string `json:"addresses"` + } + checkGoldenFile(t, "list-addresses.golden", TestData{wltAddresses, &expect}) +} + +func TestLiveListAddresses(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("listAddresses", fn) + require.NoError(t, err) + + var wltAddresses struct { + Addresses []string `json:"addresses"` + } + + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) + require.NoError(t, err) + + require.NotEmpty(t, wltAddresses.Addresses) +} + +func TestStableAddressBalance(t *testing.T) { + if !doStable(t) { + return + } + + output, err := execCommandCombinedOutput("addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt") + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) + + var expect cli.BalanceResult + checkGoldenFile(t, "address-balance.golden", TestData{addrBalance, &expect}) +} + +func TestLiveAddressBalance(t *testing.T) { + if !doLive(t) { + return + } + + output, err := execCommandCombinedOutput("addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt") + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) +} + +func TestStableWalletBalance(t *testing.T) { + if !doStable(t) { + return + } + + fn, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("walletBalance", fn) + require.NoError(t, err, output) + + var wltBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) + require.NoError(t, err) + + var expect cli.BalanceResult + checkGoldenFile(t, "wallet-balance.golden", TestData{wltBalance, &expect}) +} + +func TestLiveWalletBalance(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("walletBalance", fn) + require.NoError(t, err) + + var wltBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) + require.NoError(t, err) + + require.NotEmpty(t, wltBalance.Confirmed.Coins) + require.NotEmpty(t, wltBalance.Addresses) +} + +func TestStableWalletOutputs(t *testing.T) { + if !doStable(t) { + return + } + + fn, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("walletOutputs", fn) + require.NoError(t, err, output) + + var wltOutput cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + var expect cli.OutputsResult + checkGoldenFile(t, "wallet-outputs.golden", TestData{wltOutput, &expect}) +} + +func TestLiveWalletOutputs(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("walletOutputs", fn) + require.NoError(t, err) + + var wltOutput cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + require.NotEmpty(t, wltOutput.Outputs.HeadOutputs) +} + +func TestStableAddressOutputs(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + goldenFile string + err error + errMsg string + }{ + { + name: "addressOutputs one address", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "address-outputs.golden", + }, + { + name: "addressOutputs two address", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}, + goldenFile: "two-addresses-outputs.golden", + }, + { + name: "addressOutputs two address one invalid", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "badaddress"}, + err: errors.New("exit status 1"), + errMsg: "Error: invalid address: badaddress, err: Invalid address length\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + require.Equal(t, tc.errMsg, string(output)) + return + } + + require.NoError(t, err) + + var addrOutputs cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) + + var expect cli.OutputsResult + checkGoldenFile(t, tc.goldenFile, TestData{addrOutputs, &expect}) + }) + } +} + +func TestLiveAddressOutputs(t *testing.T) { + if !doLive(t) { + return + } + + output, err := execCommandCombinedOutput("addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt") + require.NoError(t, err) + + var addrOutputs cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) +} + +func TestStableShowConfig(t *testing.T) { + if !doStable(t) { + return + } + + output, err := execCommandCombinedOutput("showConfig") + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // DataDir can't be checked perfectly without essentially + // reimplementing cli.LoadConfig to compare values + require.NotEmpty(t, ret.DataDir) + require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) + + ret.DataDir = "IGNORED/.skycoin" + + goldenFile := "show-config.golden" + + var expect cli.Config + td := TestData{ret, &expect} + loadGoldenFile(t, goldenFile, td) + + // The RPC port is not always the same between runs of the stable integration tests, + // so use the RPC_ADDR envvar instead of the golden file value for comparison + goldenRPCAddress := expect.RPCAddress + expect.RPCAddress = rpcAddress() + + require.Equal(t, expect, ret) + + // Restore goldenfile's value before checking if JSON fields were added or removed + expect.RPCAddress = goldenRPCAddress + checkGoldenFileObjectChanges(t, goldenFile, TestData{ret, &expect}) +} + +func TestLiveShowConfig(t *testing.T) { + if !doLive(t) { + return + } + + output, err := execCommandCombinedOutput("showConfig") + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // DataDir can't be checked perfectly without essentially + // reimplementing cli.LoadConfig to compare values + require.NotEmpty(t, ret.DataDir) + require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) + + coin := os.Getenv("COIN") + if coin == "" { + coin = "skycoin" + } + require.Equal(t, coin, ret.Coin) + + require.Equal(t, rpcAddress(), ret.RPCAddress) +} + +func TestStableStatus(t *testing.T) { + if !doStable(t) { + return + } + + output, err := execCommandCombinedOutput("status") + require.NoError(t, err) + + var ret cli.StatusResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // TimeSinceLastBlock is not stable + ret.Status.BlockchainMetadata.TimeSinceLastBlock = wh.FromDuration(time.Duration(0)) + // Version is not stable + ret.Status.Version = readable.BuildInfo{} + // Uptime is not stable + ret.Status.Uptime = wh.FromDuration(time.Duration(0)) + // StartedAt is not stable + ret.Status.StartedAt = 0 + goldenFile := "status" + if useCSRF(t) { + goldenFile += "-csrf-enabled" + } + if !doHeaderCheck(t) { + goldenFile += "-header-check-disabled" + } + if dbNoUnconfirmed(t) { + goldenFile += "-no-unconfirmed" + } + goldenFile += ".golden" + + var expect cli.StatusResult + td := TestData{ret, &expect} + loadGoldenFile(t, goldenFile, td) + + // The RPC port is not always the same between runs of the stable integration tests, + // so use the RPC_ADDR envvar instead of the golden file value for comparison + goldenRPCAddress := expect.Config.RPCAddress + expect.Config.RPCAddress = rpcAddress() + + require.Equal(t, expect, ret) + + // Restore goldenfile's value before checking if JSON fields were added or removed + expect.Config.RPCAddress = goldenRPCAddress + checkGoldenFileObjectChanges(t, goldenFile, TestData{ret, &expect}) +} + +func TestLiveStatus(t *testing.T) { + if !doLive(t) { + return + } + + output, err := execCommandCombinedOutput("status") + require.NoError(t, err) + + var ret cli.StatusResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + require.Equal(t, rpcAddress(), ret.Config.RPCAddress) +} + +func TestStableTransaction(t *testing.T) { + if !doStable(t) { + return + } + + type testCase struct { + name string + args []string + err error + errMsg string + goldenFile string + } + + tt := []testCase{ + { + name: "invalid txid", + args: []string{"abcd"}, + err: errors.New("exit status 1"), + errMsg: "Error: invalid txid\n", + goldenFile: "", + }, + { + name: "not exist", + args: []string{"540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759"}, + err: errors.New("exit status 1"), + errMsg: "Error: 404 Not Found\n", + goldenFile: "", + }, + { + name: "empty txid", + args: []string{""}, + err: errors.New("exit status 1"), + errMsg: "Error: txid is empty\n", + goldenFile: "", + }, + { + name: "genesis transaction", + args: []string{"d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add"}, + err: nil, + errMsg: "", + goldenFile: "genesis-transaction-cli.golden", + }, + } + + if !dbNoUnconfirmed(t) { + tt = append(tt, testCase{ + name: "unconfirmed", + args: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + goldenFile: "unconfirmed-transaction-cli.golden", + }) + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + args := append([]string{"transaction"}, tc.args...) + o, err := execCommandCombinedOutput(args...) + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + require.Equal(t, tc.errMsg, string(o)) + return + } + + require.NoError(t, err) + + var tx cli.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) + require.NoError(t, err) + + var expect cli.TxnResult + checkGoldenFile(t, tc.goldenFile, TestData{tx, &expect}) + }) + } + + scanTransactions(t, true) +} + +func TestLiveTransaction(t *testing.T) { + if !doLive(t) { + return + } + + o, err := execCommandCombinedOutput("transaction", "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add") + require.NoError(t, err) + var tx cli.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) + require.NoError(t, err) + + var expect cli.TxnResult + + loadGoldenFile(t, "genesis-transaction.golden", TestData{tx, &expect}) + require.Equal(t, expect.Transaction.Transaction, tx.Transaction.Transaction) + + scanTransactions(t, *liveTxFull) + + // scan pending transactions + scanPendingTransactions(t) +} + +func prepareCSVFile(t *testing.T, toAddrs [][]string) (csvFile string, teardown func(t *testing.T)) { + fn := "create_txn_test.csv" + tmpDir, err := ioutil.TempDir("", "create_raw_transaction") + require.NoError(t, err) + csvFile = filepath.Join(tmpDir, fn) + + f, err := os.Create(csvFile) + require.NoError(t, err) + defer f.Close() + w := csv.NewWriter(f) + + for _, to := range toAddrs { + err := w.Write(to) + require.NoError(t, err) + } + w.Flush() + require.NoError(t, w.Error()) + + return csvFile, func(t *testing.T) { + require.NoError(t, os.Remove(csvFile)) + } +} + +func TestLiveCreateRawTransactionV2(t *testing.T) { + if !doLive(t) { + return + } + + walletFile := requireWalletEnv(t) + w, err := wallet.Load(walletFile) + require.NoError(t, err) + addrs := w.GetAddresses() + require.Truef(t, len(addrs) >= 2, "wallet must have at least 2 addresses") + + // prepare csv file for testing + toAddrs := [][]string{ + {addrs[0].String(), "0.001"}, + {addrs[1].String(), "0.001"}, + } + csvFile, teardown := prepareCSVFile(t, toAddrs) + defer teardown(t) + + var testCases = []struct { + name string + args func(t *testing.T) []string + verify func(t *testing.T, data []byte) + }{ + { + name: "unsigned=true json=false", + args: func(t *testing.T) []string { + return []string{ + walletFile, + addrs[0].String(), // to address + "1.01", + "--unsign", + } + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.Equal(t, cipher.Sig{}, txn.Sigs[0]) + }, + }, + { + name: "unsigned=true json=true", + args: func(t *testing.T) []string { + return []string{ + walletFile, + addrs[0].String(), // to address + "1.01", + "--unsign", + "--json", + } + }, + verify: func(t *testing.T, data []byte) { + var rsp api.CreateTransactionResponse + err := json.NewDecoder(bytes.NewReader(data)).Decode(&rsp) + require.NoError(t, err) + }, + }, + { + name: "unsigned=false json=false", + args: func(t *testing.T) []string { + args := []string{ + walletFile, + addrs[0].String(), // to address + "1.01", + } + + // Require password if the wallet is encrypted + if w.IsEncrypted() { + password := os.Getenv("WALLET_PASSWORD") + if len(password) == 0 { + t.Fatal("missing WALLET_PASSWORD environment variable") + return nil + } + args = append(args, "-p", password) + } + return args + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.NotEqual(t, cipher.Sig{}, txn.Sigs[0]) + }, + }, + { + name: "unsigned=true json=false change-address", + args: func(t *testing.T) []string { + return []string{ + walletFile, + addrs[0].String(), // to address + "0.001", + "--unsign", + "--change-address", + addrs[1].String(), + } + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.Equal(t, cipher.Sig{}, txn.Sigs[0]) + require.Equal(t, 2, len(txn.Out)) + addrOutMap := make(map[string]struct{}) + for _, o := range txn.Out { + addrOutMap[o.Address.String()] = struct{}{} + } + + // Confirms that the toAddr exists in txn.Out + toAddr := addrs[1].String() + _, ok := addrOutMap[toAddr] + require.True(t, ok) + // Confirms that the change address exists in txn.Out + _, ok = addrOutMap[addrs[1].String()] + require.True(t, ok) + }, + }, + { + name: "unsigned=true json=false from-addrss", + args: func(t *testing.T) []string { + return []string{ + walletFile, + addrs[1].String(), // to address + "0.001", + "--unsign", + "--from-address", + addrs[0].String(), + } + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.Equal(t, cipher.Sig{}, txn.Sigs[0]) + // Get the uxouts of from address + uxoutsMap := getAddressOutputs(t, addrs[0].String()) + for _, in := range txn.In { + _, ok := uxoutsMap[in.String()] + require.True(t, ok) + } + }, + }, + { + name: "unsigned=true json=false -csv", + args: func(t *testing.T) []string { + return []string{ + walletFile, + "--unsign", + "--csv", + csvFile, + } + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.Equal(t, cipher.Sig{}, txn.Sigs[0]) + require.True(t, len(txn.Out) >= 2) + + // Confirms that the txn.Out contains the receiver address + addrOutMap := make(map[string]coin.TransactionOutput) + for i, o := range txn.Out { + addrOutMap[o.Address.String()] = txn.Out[i] + } + + for _, to := range toAddrs { + out, ok := addrOutMap[to[0]] + require.True(t, ok) + coins, err := droplet.FromString(to[1]) + require.NoError(t, err) + require.True(t, out.Coins >= coins) + } + }, + }, + } + + for _, tc := range testCases { + args := append([]string{"createRawTransactionV2"}, tc.args(t)...) + o, err := execCommandCombinedOutput(args...) + require.NoError(t, err) + tc.verify(t, o) + } +} + +func getAddressOutputs(t *testing.T, address string) map[string]struct{} { + output, err := execCommandCombinedOutput("addressOutputs", address) + require.NoError(t, err) + + var addrOutputs cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) + uxoutsMap := make(map[string]struct{}) + for _, o := range addrOutputs.Outputs.HeadOutputs { + uxoutsMap[o.Hash] = struct{}{} + } + return uxoutsMap +} + +// TODO cli doesn't have command to querying pending transactions yet. +func scanPendingTransactions(t *testing.T) { +} + +// scanTransactions scans transactions against blockchain. +// If fullTest is true, scan the whole blockchain, and test every transactions, +// otherwise just test random transactions. +func scanTransactions(t *testing.T, fullTest bool) { + // Gets blockchain height through "status" command + output, err := execCommandCombinedOutput("status") + require.NoError(t, err) + + d := json.NewDecoder(bytes.NewReader(output)) + d.DisallowUnknownFields() + + var status cli.StatusResult + err = d.Decode(&status) + require.NoError(t, err) + + txids := getTxids(t, status.Status.BlockchainMetadata.Head.BkSeq) + + l := len(txids) + if !fullTest && l > randomLiveTransactionNum { + txidMap := make(map[string]struct{}) + var ids []string + for len(txidMap) < randomLiveTransactionNum { + // get random txid + txid := txids[rand.Intn(l)] + if _, ok := txidMap[txid]; !ok { + ids = append(ids, txid) + txidMap[txid] = struct{}{} + } + } + + // reassign the txids + txids = ids + } + + checkTransactions(t, txids) +} + +func checkTransactions(t *testing.T, txids []string) { + // Start goroutines to check transactions + var wg sync.WaitGroup + txC := make(chan string, 500) + nReq := 4 + if useCSRF(t) { + nReq = 1 + } + for i := 0; i < nReq; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for txid := range txC { + t.Run(fmt.Sprintf("%v", txid), func(t *testing.T) { + o, err := execCommandCombinedOutput("transaction", txid) + require.NoError(t, err) + var txRlt cli.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&txRlt) + require.NoError(t, err) + require.Equal(t, txid, txRlt.Transaction.Transaction.Hash) + require.True(t, txRlt.Transaction.Status.Confirmed) + }) + } + }() + } + + for _, txid := range txids { + txC <- txid + } + close(txC) + + wg.Wait() +} + +func getTxids(t *testing.T, blockNum uint64) []string { + // p represents the number of blocks that each time we query, + // do not get all blocks in one query, which might run out of + // memory when blockchain becomes very huge. + p := 500 + n := int(blockNum / uint64(p)) + + // Collects all transactions' id + var txids []string + for i := 0; i < n; i++ { + txids = append(txids, getTxidsInBlocks(t, i*p+1, (i+1)*p)...) + } + + if (blockNum % uint64(p)) > 0 { + txids = append(txids, getTxidsInBlocks(t, n*p+1, int(blockNum)-1)...) + } + + return txids +} + +func getTxidsInBlocks(t *testing.T, start, end int) []string { + s := strconv.Itoa(start) + e := strconv.Itoa(end) + o, err := execCommandCombinedOutput("blocks", s, e) + require.NoError(t, err) + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(o)).Decode(&blocks) + require.NoError(t, err) + require.Len(t, blocks.Blocks, end-start+1) + + var txids []string + for _, b := range blocks.Blocks { + for _, tx := range b.Body.Transactions { + txids = append(txids, tx.Hash) + } + } + return txids +} + +func TestStableBlocks(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocks(t) + + // Tests blocks 180~181, should only return block 180. + output, err := execCommandCombinedOutput("blocks", "180", "181") + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect readable.Blocks + checkGoldenFile(t, "blocks180.golden", TestData{blocks, &expect}) +} + +func TestLiveBlocks(t *testing.T) { + if !doLive(t) { + return + } + + testKnownBlocks(t) + + // These blocks were affected by the coinhour overflow issue, make sure that they can be queried + blockSeqs := []int{11685, 11707, 11710, 11709, 11705, 11708, 11711, 11706, 11699} + + for _, seq := range blockSeqs { + output, err := execCommandCombinedOutput("blocks", strconv.Itoa(seq)) + require.NoError(t, err) + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + } +} + +func testKnownBlocks(t *testing.T) { + tt := []struct { + name string + args []string + goldenFile string + }{ + { + "blocks 0", + []string{"blocks", "0"}, + "block0.golden", + }, + { + "blocks 0 5", + []string{"blocks", "0", "5"}, + "blocks0-5.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect readable.Blocks + checkGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) + }) + } + + scanBlocks(t, "0", "180") +} + +func scanBlocks(t *testing.T, start, end string) { //nolint:unparam + outputs, err := execCommandCombinedOutput("blocks", start, end) + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(outputs)).Decode(&blocks) + require.NoError(t, err) + + var preBlocks readable.Block + preBlocks.Head.Hash = "0000000000000000000000000000000000000000000000000000000000000000" + for _, b := range blocks.Blocks { + require.Equal(t, b.Head.PreviousHash, preBlocks.Head.Hash) + preBlocks = b + } +} + +func TestStableLastBlocks(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + goldenFile string + errMsg []byte + }{ + { + name: "lastBlocks 0", + args: []string{"lastBlocks", "0"}, + goldenFile: "last-blocks0.golden", + }, + { + name: "lastBlocks 1", + args: []string{"lastBlocks", "1"}, + goldenFile: "last-blocks1.golden", + }, + { + name: "lastBlocks 2", + args: []string{"lastBlocks", "2"}, + goldenFile: "last-blocks2.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + + if bytes.Contains(output, []byte("Error: ")) { + require.Equal(t, string(tc.errMsg), string(output)) + return + } + + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect readable.Blocks + checkGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) + }) + } +} + +func TestLiveLastBlocks(t *testing.T) { + if !doLive(t) { + return + } + + tt := []struct { + name string + args []string + }{ + { + "lastBlocks 0", + []string{"lastBlocks", "0"}, + }, + { + "lastBlocks 1", + []string{"lastBlocks", "1"}, + }, + { + "lastBlocks 2", + []string{"lastBlocks", "2"}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + }) + } +} + +// TestLiveSend sends coin from specific wallet file, user should manually specify the +// wallet file by setting the CLI_WALLET_FILE environment variable +// +// Note: +// 1. This test might modify the wallet file, in order to avoid losing coins, we don't send coins to +// addresses that are not belong to the wallet, when addresses in the wallet are not sufficient, we +// will automatically generate enough addresses as coin recipient. +// 2. The wallet must must have at least 2 coins and 16 coinhours. +func TestLiveSend(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 16 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 16) + entries := w.GetEntries() + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTxn func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"send", fn, entries[0].Address.String(), coins} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + entries[1].Address.String(), + "0.5", + }, + { + entries[2].Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"send", fn, "-m", string(v)} + }, + checkTxn: func(t *testing.T, txid string) { + tx := getTransaction(t, txid) + // Confirms the second address receives 0.5 coin and 1 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, entries[1].Address.String(), 5e5, 1) + // Confirms the third address receives 0.5 coin and 1 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, entries[2].Address.String(), 5e5, 1) + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, entries[0].Address.String()) + require.True(t, coins >= 1e6) + }, + }, + { + // Send 0.001 coin from the third address to the second address. + // Set the second as change address, so the 0.499 change coin will also be sent to the second address. + // After sending, the second address should have 1 coin and 1 coin hour. + name: "send with -c(change address) -a(from address) options", + args: func() []string { + return []string{"send", fn, "-c", entries[1].Address.String(), + "-a", entries[2].Address.String(), entries[1].Address.String(), "0.001"} + }, + checkTxn: func(t *testing.T, txid string) { + tx := getTransaction(t, txid) + // Confirms the second address receives 0.5 coin and 0 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, entries[1].Address.String(), 5e5, 0) + // Confirms the second address have 1 coin and 1 coin hour + coins, hours := getAddressBalance(t, entries[1].Address.String()) + require.Equal(t, uint64(1e6), coins) + require.Equal(t, uint64(1), hours) + }, + }, + { + // Send 1 coin from second to the the third address, this will spend three outputs(0.2, 0.3. 0.5 coin), + // and burn out the remaining 1 coin hour. + name: "send to burn all coin hour", + args: func() []string { + return []string{"send", fn, "-a", entries[1].Address.String(), + entries[2].Address.String(), "1"} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms that the third address has 1 coin and 0 coin hour + coins, hours := getAddressBalance(t, entries[2].Address.String()) + require.Equal(t, uint64(1e6), coins) + require.Equal(t, uint64(0), hours) + }, + }, + { + // Send with 0 coin hour, this test should fail. + name: "send 0 coin hour", + args: func() []string { + return []string{"send", fn, "-a", entries[2].Address.String(), + entries[1].Address.String(), "1"} + }, + errMsg: []byte("See 'skycoin-cli send --help'\nError: Transaction has zero coinhour fee"), + checkTxn: func(t *testing.T, txid string) {}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args()...) + + output = bytes.TrimRight(output, "\n") + + if tc.errMsg != nil { + require.Equal(t, err.Error(), "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + require.NoError(t, err) + + // output: "txid:$txid_string" + // split the output to get txid value + v := bytes.Split(output, []byte(":")) + require.Len(t, v, 2) + txid := string(v[1]) + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait until transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTxn(t, txid) + }) + } +} + +func TestLiveSendNotEnoughDecimals(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 16 coin hours. + w, _, _ := prepareAndCheckWallet(t, 2e6, 16) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + // Send with too small decimal value + // CLI send is a litte bit slow, almost 300ms each. so we only test 20 invalid decimal coin. + errMsg := []byte("See 'skycoin-cli send --help'\nError: Transaction violates soft constraint: invalid amount, too many decimal places") + for i := uint64(1); i < uint64(20); i++ { + v, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send %v", v) + t.Run(name, func(t *testing.T) { + output, err := execCommandCombinedOutput("send", fn, w.GetEntryAt(0).Address.String(), v) + require.Error(t, err) + require.Equal(t, err.Error(), "exit status 1") + output = bytes.TrimRight(output, "\n") + require.Equal(t, errMsg, output) + }) + } + +} + +// TestLiveCreateAndBroadcastRawTransaction does almost the same procedure as TestLiveSend. +// Create raw transaction with command arguments the same as TestLiveSend, then broadcast the +// created raw transaction. After the transaction is confirmed, run the same transaction check +// function like in TestLiveSend. +func TestLiveCreateAndBroadcastRawTransaction(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + var tmpCSVFile string + + defer func() { + if tmpCSVFile != "" { + err := os.Remove(tmpCSVFile) + require.NoError(t, err) + } + }() + + tt := []struct { + name string + args func() []string + errMsg string + checkTxn func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"createRawTransaction", fn, w.GetEntryAt(0).Address.String(), coins} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.GetEntryAt(1).Address.String(), + "0.5", + }, + { + w.GetEntryAt(2).Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"createRawTransaction", fn, "-m", string(v)} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.GetEntryAt(0).Address.String()) + require.True(t, coins >= 1e6) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with --csv option", + args: func() []string { + fields := [][]string{ + {w.GetEntryAt(1).Address.String(), "0.5"}, + {w.GetEntryAt(2).Address.String(), "0.5"}, + } + + f, err := ioutil.TempFile("", "createrawtxn") + require.NoError(t, err) + defer f.Close() + + w := csv.NewWriter(f) + + err = w.WriteAll(fields) + require.NoError(t, err) + + w.Flush() + err = w.Error() + require.NoError(t, err) + + tmpCSVFile = f.Name() + + return []string{"createRawTransaction", fn, "--csv", tmpCSVFile} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.GetEntryAt(0).Address.String()) + require.True(t, coins >= 1e6) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // Create raw transaction first + output, err := execCommandCombinedOutput(tc.args()...) + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, string(output)) + return + } + + // Broadcast transaction + output, err = execCommandCombinedOutput("broadcastTransaction", string(output)) + require.NoError(t, err, string(output)) + + txid := string(bytes.TrimRight(output, "\n")) + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait until transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTxn(t, txid) + }) + } + + // Send with too small decimal value + errMsg := "Error: Transaction violates soft constraint: invalid amount, too many decimal places" + for i := uint64(1); i < uint64(20); i++ { + v, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send %v", v) + t.Run(name, func(t *testing.T) { + output, err := execCommandCombinedOutput("createRawTransaction", fn, w.GetEntryAt(0).Address.String(), v) + require.Error(t, err) + output = bytes.Trim(output, "\n") + require.Equal(t, errMsg, string(output)) + }) + } +} + +func getTransaction(t *testing.T, txid string) *cli.TxnResult { + output, err := execCommandCombinedOutput("transaction", txid) + if err != nil { + t.Log(string(output)) + return nil + } + + require.NoError(t, err) + + var tx cli.TxnResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&tx) + require.NoError(t, err) + + return &tx +} + +func isTxConfirmed(t *testing.T, txid string) bool { + tx := getTransaction(t, txid) + require.NotNil(t, tx) + require.NotNil(t, tx.Transaction) + require.NotNil(t, tx.Transaction.Status) + return tx.Transaction.Status.Confirmed +} + +// checkCoinhours checks if the address coinhours in transaction are correct +func checkCoinsAndCoinhours(t *testing.T, tx *cli.TxnResult, addr string, coins, coinhours uint64) { //nolint:unparam + addrCoinhoursMap := make(map[string][]readable.TransactionOutput) + for _, o := range tx.Transaction.Transaction.Out { + addrCoinhoursMap[o.Address] = append(addrCoinhoursMap[o.Address], o) + } + + os, ok := addrCoinhoursMap[addr] + if !ok { + t.Fatalf("transaction doesn't have receiver of address: %v", addr) + } + + var totalCoins, totalHours uint64 + for _, o := range os { + c, err := droplet.FromString(o.Coins) + if err != nil { + t.Fatalf("%v", err) + } + totalCoins += c + totalHours += o.Hours + } + + require.Equal(t, coins, totalCoins) + require.Equal(t, coinhours, totalHours) +} + +// prepareAndCheckWallet prepares wallet for live testing. +// Returns wallet.Wallet, total coin, total hours. +// Confirms that the wallet meets the minimal requirements of coins and coinhours. +func prepareAndCheckWallet(t *testing.T, miniCoins, miniCoinHours uint64) (wallet.Wallet, uint64, uint64) { //nolint:unparam + walletFile := requireWalletEnv(t) + // Checks if the wallet does exist + if _, err := os.Stat(walletFile); os.IsNotExist(err) { + t.Fatalf("Wallet file: %v does not exist", walletFile) + } + + // Loads the wallet + w, err := wallet.Load(walletFile) + if err != nil { + t.Fatalf("Load wallet failed: %v", err) + } + + if w.EntriesLen() < 3 { + // Generates addresses + _, err = w.GenerateAddresses(uint64(3 - w.EntriesLen())) + if err != nil { + t.Fatalf("Wallet generateAddress failed: %v", err) + } + } + + outputs := getWalletOutputs(t, walletFile) + // Confirms the wallet is not empty. + if len(outputs) == 0 { + t.Fatalf("Wallet %v has no coin", walletFile) + } + + var totalCoins uint64 + var totalCoinhours uint64 + for _, output := range outputs { + coins, err := droplet.FromString(output.Coins) + if err != nil { + t.Fatalf("%v", err) + } + + totalCoins += coins + totalCoinhours += output.CalculatedHours + } + + // Confirms the coins meet minimal coins requirement + if totalCoins < miniCoins { + t.Fatalf("Wallet must have at least %v coins", miniCoins) + } + + if totalCoinhours < miniCoinHours { + t.Fatalf("Wallet must have at least %v coinhours", miniCoinHours) + } + + if err := wallet.Save(w, filepath.Dir(walletFile)); err != nil { + t.Fatalf("%v", err) + } + return w, totalCoins, totalCoinhours +} + +func getAddressBalance(t *testing.T, addr string) (uint64, uint64) { + output, err := execCommandCombinedOutput("addressBalance", addr) + require.NoError(t, err, string(output)) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) + coins, err := droplet.FromString(addrBalance.Confirmed.Coins) + require.NoError(t, err) + + hours, err := strconv.ParseUint(addrBalance.Confirmed.Hours, 10, 64) + require.NoError(t, err) + return coins, hours +} + +func getWalletOutputs(t *testing.T, walletFile string) readable.UnspentOutputs { + output, err := execCommandCombinedOutput("walletOutputs", walletFile) + require.NoError(t, err, string(output)) + + var wltOutput cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + return wltOutput.Outputs.HeadOutputs +} + +func TestStableWalletHistory(t *testing.T) { + if !doStable(t) { + return + } + + fn, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("walletHistory", fn) + require.NoError(t, err, output) + + var history []cli.AddrHistory + err = json.NewDecoder(bytes.NewReader(output)).Decode(&history) + require.NoError(t, err) + + var expect []cli.AddrHistory + checkGoldenFile(t, "wallet-history.golden", TestData{history, &expect}) +} + +func TestLiveWalletHistory(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("walletHistory", fn) + require.NoError(t, err) + var his []cli.AddrHistory + err = json.NewDecoder(bytes.NewReader(output)).Decode(&his) + require.NoError(t, err) +} + +func TestStableCheckDB(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + dbPath string + result string + errMsg string + }{ + { + name: "no signature", + dbPath: "../../visor/testdata/data.db.nosig", + errMsg: "Error: checkdb failed: Signature not found for block seq=1000 hash=71852c1a8ab5e470bd14e5fce8e1116697151181a188d4262b545542fb3d526c\n", + }, + { + name: "invalid database", + dbPath: "../../visor/testdata/data.db.garbage", + errMsg: "Error: open db failed: invalid database\n", + }, + { + name: "valid database", + dbPath: "../../api/integration/testdata/blockchain-180.db", + result: "check db success\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput("checkdb", tc.dbPath) + if err != nil { + t.Log(string(output)) + require.Equal(t, tc.errMsg, string(output)) + return + } + require.NoError(t, err) + require.Equal(t, tc.result, string(output)) + }) + } +} + +func TestVersion(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + // Gets version in json format. + output, err := execCommandCombinedOutput("version", "-j") + require.NoError(t, err) + + var ver = struct { + Skycoin string `json:"skycoin"` + Cli string `json:"cli"` + RPC string `json:"rpc"` + Wallet string `json:"wallet"` + }{} + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ver) + require.NoError(t, err) + require.True(t, ver.Skycoin != "") + require.True(t, ver.Cli != "") + require.True(t, ver.RPC != "") + require.True(t, ver.Wallet != "") + + // Gets version without json format. + output, err = execCommandCombinedOutput("version") + require.NoError(t, err) + + // Confirms the result contains 4 version componments + output = bytes.TrimRight(output, "\n") + vers := bytes.Split(output, []byte("\n")) + require.Len(t, vers, 4) +} + +func TestStableWalletCreateXPubFlow(t *testing.T) { + if !doStable(t) { + return + } + + // The flow to create an xpub wallet is: + // - Create a bip44 wallet + // - Export an xpub key from the bip44 wallet + // - Create an xpub wallet from the xpub key + + dir, clean := createTempWalletDir(t) + defer clean() + + bip44Filename := filepath.Join(dir, "bip44.wlt") + + // Create a bip44 wallet + args := []string{"walletCreate", bip44Filename, "-t", "bip44", "-n", "10"} + _, err := execCommandCombinedOutput(args...) + require.NoError(t, err) + + // Export the xpub key from the bip44 wallet subpath 0'/0 + args = []string{"walletKeyExport", bip44Filename, "-k", "xpub", "--path", "0/0"} + output, err := execCommandCombinedOutput(args...) + require.NoError(t, err) + + xpub := strings.TrimSpace(string(output)) + + xpubFilename := filepath.Join(dir, "xpub.wlt") + + // Create an xpub wallet + args = []string{"walletCreate", xpubFilename, "-t", "xpub", "--xpub", xpub, "-n", "10"} + _, err = execCommandCombinedOutput(args...) + require.NoError(t, err) + + // Compare the entries of both wallets: they should match + w, err := wallet.Load(bip44Filename) + require.NoError(t, err) + + w2, err := wallet.Load(xpubFilename) + require.NoError(t, err) + + for i, e := range w.GetEntries() { + e2 := w2.GetEntryAt(i) + require.Equal(t, e.Public, e2.Public) + require.Equal(t, e.Address, e2.Address) + require.False(t, e.Secret.Null()) + require.True(t, e2.Secret.Null()) + require.Equal(t, e.ChildNumber, uint32(i)) + require.Equal(t, e.ChildNumber, e2.ChildNumber) + require.Equal(t, e.Change, e2.Change) + } +} + +func TestStableWalletCreate(t *testing.T) { + if !doStable(t) { + return + } + + defaultFilename := "skycoin-cli-integration-test.wlt" + + tt := []struct { + name string + filename string + args []string + setup func(t *testing.T, filename string) func() + errMsg string + errMsgFunc func(filename string) string + checkWallet func(t *testing.T, w wallet.Wallet) + }{ + { + name: "generate wallet with -r option", + args: []string{"-r", "-t", wallet.WalletTypeDeterministic}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + + // Confirms the seed is a valid hex string + _, err := hex.DecodeString(w.Seed()) + require.NoError(t, err) + + // Confirms the label is empty + require.Empty(t, w.Label()) + }, + }, + { + name: "generate wallet with -r option bip44", + args: []string{"-r", "-t", wallet.WalletTypeBip44}, + errMsg: "Error: -r can't be used for bip44 wallets\n", + }, + { + name: "generate wallet with -m option", + args: []string{"-m"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + + // Confirms the seed has 12 words + seed := w.Seed() + words := strings.Split(seed, " ") + require.Len(t, words, 12) + + err := bip39.ValidateMnemonic(seed) + require.NoError(t, err) + + // Confirms the label is empty + require.Empty(t, w.Label()) + }, + }, + { + name: "generate wallet with -s option", + args: []string{"-t", wallet.WalletTypeDeterministic, "-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Label()) + + require.Equal(t, "great duck trophy inhale dad pluck include maze smart mechanic ring merge", w.Seed()) + require.Equal(t, "2amA8sxKJhNRp3wfWrE5JfTEUjr9S3C2BaU", w.GetEntryAt(0).Address.String()) + require.Equal(t, "02b4a4b63f2f8ba56f9508712815eca3c088693333715eaf7a73275d8928e1be5a", w.GetEntryAt(0).Public.Hex()) + require.Equal(t, "f4a281d094a6e9e95a84c23701a7d01a0e413c838758e94ad86a10b9b83e0434", w.GetEntryAt(0).Secret.Hex()) + }, + }, + { + name: "generate wallet with -s option bip44", + args: []string{"-t", wallet.WalletTypeBip44, "-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Label()) + + require.Equal(t, "great duck trophy inhale dad pluck include maze smart mechanic ring merge", w.Seed()) + require.Equal(t, "skPFvAokn63RTHh8MR8cZuHUpzZiutFeks", w.GetEntryAt(0).Address.String()) + require.Equal(t, "0381a3a0ed879eae12a612d24c73c39ff1d9f3c238e10ecf29c318db11e84e1143", w.GetEntryAt(0).Public.Hex()) + require.Equal(t, "7519c63c890d593a11eeebfe4b4552f3d8a01094c086262e7c68a3e7adc61677", w.GetEntryAt(0).Secret.Hex()) + }, + }, + { + name: "generate wallet with -s option and seed-passphrase bip44", + args: []string{"-t", wallet.WalletTypeBip44, "--seed-passphrase", "foobar", "-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Label()) + + require.Equal(t, "foobar", w.SeedPassphrase()) + require.Equal(t, "great duck trophy inhale dad pluck include maze smart mechanic ring merge", w.Seed()) + require.Equal(t, "29bFTouyAtgRhdhHqiC6kccom3avjBpfnxS", w.GetEntryAt(0).Address.String()) + require.Equal(t, "02dbaefd35105e27ac7428505186844dcb9472021a5fdfb057c106722f3396bdf6", w.GetEntryAt(0).Public.Hex()) + require.Equal(t, "c2edb45b4c5c7828d6b879a163cb2bf016746e9c03efe5df24e9ded878b0b772", w.GetEntryAt(0).Secret.Hex()) + }, + }, + { + name: "generate wallet with -s option and seed-passphrase deterministic", + args: []string{"-t", wallet.WalletTypeDeterministic, "--seed-passphrase", "foobar", "-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + errMsg: "Error: seedPassphrase is only used for \"bip44\" wallets\n", + }, + { + name: "generate wallet with -n option, bip44", + args: []string{"-n", "5", "-t", wallet.WalletTypeBip44}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + require.Equal(t, wallet.WalletTypeBip44, w.Type()) + // Confirms the label is empty + require.Empty(t, w.Label()) + // Confirms wallet has 5 address entries + require.Len(t, w.(*wallet.Bip44Wallet).ExternalEntries, 5) + require.Len(t, w.GetEntries(), 5) + }, + }, + { + name: "generate wallet with -n option", + args: []string{"-n", "5"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + require.Equal(t, wallet.WalletTypeDeterministic, w.Type()) + // Confirms the label is empty + require.Empty(t, w.Label()) + // Confirms wallet has 5 address entries + require.Len(t, w.GetEntries(), 5) + }, + }, + { + name: "generate wallet with -l option", + args: []string{"-l", "integration-cli"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + label := w.Label() + require.Equal(t, "integration-cli", label) + }, + }, + { + name: "generate wallet with duplicate wallet name", + args: []string{}, + filename: stableWalletName, + setup: func(t *testing.T, filename string) func() { + _, clean := createUnencryptedWalletAt(t, filename) + return clean + }, + errMsgFunc: func(filename string) string { + return fmt.Sprintf("Error: %s already exists\n", filename) + }, + }, + { + name: "encrypt=true", + args: []string{"-e", "-p", "pwd"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + // Confirms the wallet is encrypted + require.True(t, w.IsEncrypted()) + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + // Confirms the secrets in address entries are empty + for _, e := range w.GetEntries() { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "encrypt=false password=pwd", + args: []string{"-p", "pwd"}, + errMsg: "Error: password should not be set as we're not going to create a wallet with encryption\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir, clean := createTempWalletDir(t) + defer clean() + + if tc.filename == "" { + tc.filename = defaultFilename + } + + walletName := filepath.Join(dir, tc.filename) + + if tc.setup != nil { + clean := tc.setup(t, walletName) + defer clean() + } + + if tc.errMsg != "" && tc.errMsgFunc != nil { + t.Fatal("errMsg and errMsgFunc can't be set together") + } + + errMsg := tc.errMsg + if tc.errMsgFunc != nil { + errMsg = tc.errMsgFunc(walletName) + } + + // Run command with arguments + args := append([]string{"walletCreate", walletName}, tc.args...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + require.Equal(t, []byte(errMsg), output) + return + } + + require.Empty(t, errMsg, "the command did not return an error, but we expected one") + + // os.Stdout should match the wallet written on disk + contents, err := ioutil.ReadFile(walletName) + require.NoError(t, err) + require.Equal(t, append(contents, '\n'), output) + + w, err := wallet.Load(walletName) + require.NoError(t, err) + + if !w.IsEncrypted() { + // Confirms all entries and lastSeed are derived from seed. + checkWalletEntriesAndLastSeed(t, w) + } + + // Checks the wallet with provided checking method. + require.NotNil(t, w) + require.NotNil(t, tc.checkWallet) + tc.checkWallet(t, w) + }) + } +} + +// checkWalletEntriesAndLastSeed confirms the wallet entries and lastSeed are derivied +// from the seed. +func checkWalletEntriesAndLastSeed(t *testing.T, w wallet.Wallet) { + switch w.Type() { + case wallet.WalletTypeDeterministic: + checkWalletEntriesAndLastSeedDeterministic(t, w) + case wallet.WalletTypeBip44: + checkWalletEntriesAndLastSeedBip44(t, w) + case wallet.WalletTypeCollection: + checkWalletEntriesAndLastSeedCollection(t, w) + default: + t.Fatalf("unknown wallet type %q", w.Type()) + } +} + +func checkWalletEntriesAndLastSeedDeterministic(t *testing.T, w wallet.Wallet) { + seed := w.Seed() + require.NotEmpty(t, seed) + + newSeed, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), w.EntriesLen()) + require.Len(t, seckeys, w.EntriesLen()) + for i, sk := range seckeys { + require.Equal(t, w.GetEntryAt(i).Secret, sk) + pk := cipher.MustPubKeyFromSecKey(sk) + require.Equal(t, w.GetEntryAt(i).Public, pk) + } + + lastSeed := w.LastSeed() + require.NotEmpty(t, lastSeed) + require.Equal(t, lastSeed, hex.EncodeToString(newSeed)) + + require.Empty(t, w.SeedPassphrase()) +} + +func checkWalletEntriesAndLastSeedBip44(t *testing.T, w wallet.Wallet) { + seed := w.Seed() + require.NotEmpty(t, seed) + // bip44 wallet seed must be a valid bip39 mnemonic + err := bip39.ValidateMnemonic(seed) + require.NoError(t, err) + + for _, e := range w.GetEntries() { + require.False(t, e.Secret.Null()) + require.False(t, e.Public.Null()) + } + + // lastSeed is only for "deterministic" type wallet + require.Empty(t, w.LastSeed()) +} + +func checkWalletEntriesAndLastSeedCollection(t *testing.T, w wallet.Wallet) { + require.Empty(t, w.Seed()) + require.Empty(t, w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) +} + +// TestLiveGUIInjectTransaction does almost the same procedure as TestCreateAndBroadcastRawTransaction. +// The only difference is we broadcast the raw transaction through the gui /injectTransaction api. +func TestLiveGUIInjectTransaction(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + require.NotEmpty(t, fn) + + c := newClient() + // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTxn func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"createRawTransaction", fn, w.GetEntryAt(0).Address.String(), coins} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.GetEntryAt(1).Address.String(), + "0.5", + }, + { + w.GetEntryAt(2).Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"createRawTransaction", fn, "-m", string(v)} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.GetEntryAt(0).Address.String()) + require.True(t, coins >= 1e6) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // Create raw transaction first + output, err := execCommandCombinedOutput(tc.args()...) + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, output) + return + } + + // Broadcast raw transaction with gui /injectTransaction + txid, err := c.InjectEncodedTransaction(string(output)) + require.NoError(t, err) + + txid = strings.TrimRight(txid, "\n") + t.Logf("txid: %s", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait until transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTxn(t, txid) + }) + } +} + +func TestEncryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) (string, func()) + errMsg []byte + errWithHelp bool + checkWallet func(t *testing.T, w wallet.Wallet) + }{ + { + name: "wallet is not encrypted", + args: []string{"-p", "pwd"}, + setup: createUnencryptedWallet, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.True(t, w.IsEncrypted()) + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + // Confirms that secrets in address entries are empty + for _, e := range w.GetEntries() { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "wallet is encrypted", + args: []string{"-p", "pwd"}, + setup: createEncryptedWallet, + errMsg: []byte("Error: wallet is encrypted\n"), + }, + { + name: "wallet doesn't exist", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) (string, func()) { + return "not-exist.wlt", func() {} + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt\" doesn't exist"), + }, + } + + for _, tc := range tt { + for _, ct := range cryptoTypes { + name := fmt.Sprintf("name=%v crypto type=%v", tc.name, ct) + t.Run(name, func(t *testing.T) { + walletFile, clean := tc.setup(t) + defer clean() + args := append([]string{"encryptWallet", walletFile, "-x", string(ct)}, tc.args[:]...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + } else { + require.Equal(t, tc.errMsg, output) + } + return + } + + w, err := wallet.Load(walletFile) + require.NoError(t, err) + tc.checkWallet(t, w) + }) + } + } +} + +func TestDecryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) (string, func()) + errMsg []byte + errWithHelp bool + checkWallet func(t *testing.T, w wallet.Wallet) + }{ + { + name: "wallet is encrypted", + args: []string{"-p", "pwd"}, + setup: createEncryptedWallet, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.False(t, w.IsEncrypted()) + require.Empty(t, w.CryptoType()) + require.Empty(t, w.Secrets()) + require.NotEmpty(t, w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + for _, e := range w.GetEntries() { + require.False(t, e.Secret.Null()) + } + }, + }, + { + name: "wallet is not encrypted", + args: []string{"-p", "pwd"}, + setup: createUnencryptedWallet, + errMsg: []byte("Error: wallet is not encrypted\n"), + }, + { + name: "invalid password", + args: []string{"-p", "wrong password"}, + setup: createEncryptedWallet, + errMsg: []byte("Error: invalid password\n"), + }, + { + name: "wallet doesn't exist", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) (string, func()) { + return "not-exist.wlt", func() {} + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt\" doesn't exist"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + walletFile, clean := tc.setup(t) + defer clean() + args := append([]string{"decryptWallet", walletFile}, tc.args...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + } else { + require.Equal(t, tc.errMsg, output) + } + return + } + + w, err := wallet.Load(walletFile) + require.NoError(t, err) + tc.checkWallet(t, w) + }) + } +} + +func TestWalletShowSeed(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) (string, func()) + errWithHelp bool + errMsg []byte + expectOutput []byte + }{ + { + name: "unencrypted wallet", + setup: createUnencryptedWallet, + expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), + }, + { + name: "unencrypted wallet with -j option", + args: []string{"-j"}, + setup: createUnencryptedWallet, + expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), + }, + { + name: "encrypted wallet", + setup: createEncryptedWallet, + args: []string{"-p", "pwd"}, + expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), + }, + { + name: "encrypted wallet with -j option", + setup: createEncryptedWallet, + args: []string{"-p", "pwd", "-j"}, + expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), + }, + { + name: "encrypted wallet with invalid password", + setup: createEncryptedWallet, + args: []string{"-p", "wrong password"}, + errMsg: []byte("Error: invalid password\n"), + }, + { + name: "wallet doesn't exist", + setup: func(t *testing.T) (string, func()) { + return "not-exist.wlt", func() {} + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt\" doesn't exist"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + wltFilename, clean := tc.setup(t) + defer clean() + args := append([]string{"showSeed", wltFilename}, tc.args...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + } else { + require.Equal(t, tc.errMsg, output) + } + return + } + + require.Equal(t, tc.expectOutput, output) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-balance.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-balance.golden new file mode 100644 index 00000000..3000ea6e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-balance.golden @@ -0,0 +1,31 @@ +{ + "confirmed": { + "coins": "63083.000000", + "hours": "38823396" + }, + "spendable": { + "coins": "63083.000000", + "hours": "38823396" + }, + "expected": { + "coins": "63083.000000", + "hours": "38823396" + }, + "addresses": [ + { + "confirmed": { + "coins": "63083.000000", + "hours": "38823396" + }, + "spendable": { + "coins": "63083.000000", + "hours": "38823396" + }, + "expected": { + "coins": "63083.000000", + "hours": "38823396" + }, + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-outputs.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-outputs.golden new file mode 100644 index 00000000..2ed45db6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-outputs.golden @@ -0,0 +1,48 @@ +{ + "outputs": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/block0.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/block0.golden new file mode 100644 index 00000000..88dad6b8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/block0.golden @@ -0,0 +1,37 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks0-5.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks0-5.golden new file mode 100644 index 00000000..7139777a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks0-5.golden @@ -0,0 +1,836 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + }, + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks180.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks180.golden new file mode 100644 index 00000000..cccffcd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks180.golden @@ -0,0 +1,47 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/decode-raw-transaction.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/decode-raw-transaction.golden new file mode 100644 index 00000000..6ad734be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/decode-raw-transaction.golden @@ -0,0 +1,38 @@ +{ + "length": 294, + "type": 0, + "txid": "a121fe93d0ddebc50e6916adebb524b5b4f087b7a35904b35586f908e3b6b09f", + "inner_hash": "a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd4", + "sigs": [ + "a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01" + ], + "inputs": [ + "4d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc" + ], + "outputs": [ + { + "uxid": "cf3a56d79a41112dbb1b2e78a61007071cfe23f1ea5acb7674c0d5e0e432c2ce", + "dst": "2JCPnb1212XWQn8GUsQyv4HuB5VrgGHzb7N", + "coins": "177.999000", + "hours": 13908 + }, + { + "uxid": "5e8289922005ac75828e14768d9d510c4c874bd25dff882aa7a9debc2a1fe573", + "dst": "PE2qwUxTxe9RpdTnMcJtrP98riLW83nx5d", + "coins": "180.000000", + "hours": 4636 + }, + { + "uxid": "d6e8ced2161776befded43ac5a6ef7faf92585e541df03bed0a5cf453b020db8", + "dst": "wnhsTd3oXoKNRyLWj893pScqWXPMNg85RM", + "coins": "65.000000", + "hours": 4636 + }, + { + "uxid": "cfd0f09c8e0b849162e5d684a9ab079550849b1f9fd463aeae9489d640622bcd", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "27.000000", + "hours": 4635 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-2.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-2.golden new file mode 100644 index 00000000..25e3a866 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-2.golden @@ -0,0 +1,29 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "integration-test.wlt", + "label": "integration-test", + "lastSeed": "0ba2094a20d5fd2a8bed063fc4bbd3d7d2d8cedd07317086780043937310a1f3", + "seed": "exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy", + "tm": "1518271871", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "f1877ae49e2233db10460d3c971b2aaccc04d771629bc98ee7a1dafca9baed8e" + }, + { + "address": "7g3M372kxwNwwQEAmrronu4anXTW8aD1XC", + "public_key": "0319527fa74053b148d7efe973c0ee734e49f52a11417232e582b8c51e389d638a", + "secret_key": "f46d3e7661a1daef6229f83b641f9666bcfce4f9f2bd1a0161b35ac8d8ff8a8b" + }, + { + "address": "2EDapDfn1VC6P2hx4nTH2cRUkboGAE16evV", + "public_key": "0259a2d466c3d021d78eb09ffc8b2f4a84ce5c13264a25c9069c149f9be99c8eb0", + "secret_key": "356a6d77c5322cee36d12ad6c91a9135c403a25273ea64b30db264a5aa1f8314" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-encrypted.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-encrypted.golden new file mode 100644 index 00000000..b8e5e555 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-encrypted.golden @@ -0,0 +1,28 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "integration-test-encrypted.wlt", + "label": "integration-test", + "lastSeed": "", + "secrets": "", + "seed": "", + "seedPassphrase": "", + "tm": "1518271871", + "type": "deterministic", + "version": "0.4" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "" + }, + { + "address": "7g3M372kxwNwwQEAmrronu4anXTW8aD1XC", + "public_key": "0319527fa74053b148d7efe973c0ee734e49f52a11417232e582b8c51e389d638a", + "secret_key": "" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses.golden new file mode 100644 index 00000000..f12b147d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses.golden @@ -0,0 +1,24 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "integration-test.wlt", + "label": "integration-test", + "lastSeed": "f4ee62d76b32106664da3be08ffcab6944a8826bf82f4e8be6c9e790169b1a95", + "seed": "exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy", + "tm": "1518271871", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "f1877ae49e2233db10460d3c971b2aaccc04d771629bc98ee7a1dafca9baed8e" + }, + { + "address": "7g3M372kxwNwwQEAmrronu4anXTW8aD1XC", + "public_key": "0319527fa74053b148d7efe973c0ee734e49f52a11417232e582b8c51e389d638a", + "secret_key": "f46d3e7661a1daef6229f83b641f9666bcfce4f9f2bd1a0161b35ac8d8ff8a8b" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction-cli.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction-cli.golden new file mode 100644 index 00000000..eec09db1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction-cli.golden @@ -0,0 +1,28 @@ +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction.golden new file mode 100644 index 00000000..06f23bb6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction.golden @@ -0,0 +1,28 @@ +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test-encrypted.wlt b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test-encrypted.wlt new file mode 100644 index 00000000..307c3d73 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test-encrypted.wlt @@ -0,0 +1,22 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "integration-test-encrypted.wlt", + "label": "integration-test", + "lastSeed": "", + "secrets": "dgB7Im4iOjEwNDg1NzYsInIiOjgsInAiOjEsImtleUxlbiI6MzIsInNhbHQiOiJidHVibVZ2eEhWNHVKc0szcHFwUE5xY3VoL1VvRjRYbjQ5N0IzLzhYUFhJPSIsIm5vbmNlIjoiSEZNd1VwYUNnYUk3eFo2SiJ9BceIdIv3aGRAsANPVAm6gvrgJd2jZxJLazBwd2yQhTTWXxYVReGEsL/fzYZyDbJNvJgGZpTJsQ0R2yVgjlRbr5Km6x4yiGk8riXWiQ1Tpcfjmst7vDzjq/lUrcci/lwuGwVNf+TsmhzyD/uvV/4yR8oPtZHgPDBoMIkB/NPawNkXkcP1D6lA5LAddWHkKt/SCRxF3YdKW64LjojqExUukYSLJenxFHkTbEB/QBLb/dfZXZolLYevIKbPH/Rt7qiwOj8bvfwPPlIRf101VCvqLW8q8fcfYzvidQyjz7CfW8wh6mqMmXW4Wp+I14BQIleuBlkd35Fz2etKMMiyyltYn5FaixbP2WHFHBBg+Yfm5OzYt5K7b0cG8kDfAN1PHyYc30o=", + "seed": "", + "tm": "1518271871", + "type": "deterministic", + "version": "0.3" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test.wlt b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test.wlt new file mode 100644 index 00000000..7cd53c28 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "integration-test.wlt", + "label": "integration-test", + "lastSeed": "1c0ff9dd77fb5dd079078c3098e61a9d99965e8d55121cc3fb576af61d6d450a", + "seed": "exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy", + "tm": "1518271871", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "f1877ae49e2233db10460d3c971b2aaccc04d771629bc98ee7a1dafca9baed8e" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks0.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks0.golden new file mode 100644 index 00000000..b5b27b9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks0.golden @@ -0,0 +1,3 @@ +{ + "blocks": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks1.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks1.golden new file mode 100644 index 00000000..cccffcd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks1.golden @@ -0,0 +1,47 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks2.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks2.golden new file mode 100644 index 00000000..b8e7f487 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks2.golden @@ -0,0 +1,90 @@ +{ + "blocks": [ + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-addresses.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-addresses.golden new file mode 100644 index 00000000..3f998267 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-addresses.golden @@ -0,0 +1,5 @@ +{ + "addresses": [ + "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN" + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-wallets.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-wallets.golden new file mode 100644 index 00000000..13e0c7fc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-wallets.golden @@ -0,0 +1,9 @@ +{ + "wallets": [ + { + "name": "integration-test.wlt", + "label": "integration-test", + "address_num": 1 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/recompute-transaction-hash.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/recompute-transaction-hash.golden new file mode 100644 index 00000000..bfa2e74b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/recompute-transaction-hash.golden @@ -0,0 +1,20 @@ +{ + "length": 183, + "type": 0, + "txid": "9b102b8a9882cd5dc2df8955fc1b8a1a75e11b9de61d272313c4da822920872b", + "inner_hash": "6b1a69b76b2412314b2b928ad5e97c31c034be5734f9fa77f31f11b6b933b976", + "sigs": [ + "ddf4bd79f66ea9c7849c5240a27d9a4745ad4661bdac2179184447088512bb3e62c89efa4fd2cee05980c59b38ef23ddbd09bb77e54e94a0f9123d968a090d4201" + ], + "inputs": [ + "f7c183c1823266aff172928f8d06aa65531643456f97ccca6bd34d15e92fac7d" + ], + "outputs": [ + { + "uxid": "d1e30a79ebaac4948c69ce8f61714320f996193544a815b58b6837bade5d86c3", + "dst": "2fRQzhdNP2QMG75GkZnm44H649QBcj2mZY", + "coins": "0.001000", + "hours": 22 + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/show-config.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/show-config.golden new file mode 100644 index 00000000..806277df --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/show-config.golden @@ -0,0 +1,5 @@ +{ + "data_directory": "IGNORED/.skycoin", + "coin": "skycoin", + "rpc_address": "http://127.0.0.1:1024" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled-no-unconfirmed.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled-no-unconfirmed.golden new file mode 100644 index 00000000..d445102c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled-no-unconfirmed.golden @@ -0,0 +1,50 @@ +{ + "status": { + "blockchain": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 0, + "time_since_last_block": "0s" + }, + "version": { + "version": "", + "commit": "", + "branch": "" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.27.0", + "open_connections": 0, + "outgoing_connections": 0, + "incoming_connections": 0, + "uptime": "0s", + "csrf_enabled": true, + "header_check_enabled": false, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": false, + "block_publisher": false, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 0 + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:1024" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled.golden new file mode 100644 index 00000000..5f9c8b6e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled.golden @@ -0,0 +1,61 @@ +{ + "status": { + "blockchain": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 1, + "time_since_last_block": "0s" + }, + "version": { + "version": "", + "commit": "", + "branch": "" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.27.0", + "open_connections": 0, + "outgoing_connections": 0, + "incoming_connections": 0, + "uptime": "0s", + "csrf_enabled": true, + "header_check_enabled": false, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": false, + "block_publisher": false, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 0, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com", + "version_url": "https://version.skycoin.com/skycoin/version.txt", + "bip44_coin": 8000 + } + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:1024" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-no-unconfirmed.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-no-unconfirmed.golden new file mode 100644 index 00000000..a3724a20 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-no-unconfirmed.golden @@ -0,0 +1,61 @@ +{ + "status": { + "blockchain": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 0, + "time_since_last_block": "0s" + }, + "version": { + "version": "", + "commit": "", + "branch": "" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.27.0", + "open_connections": 0, + "outgoing_connections": 0, + "incoming_connections": 0, + "uptime": "0s", + "csrf_enabled": false, + "header_check_enabled": true, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": false, + "block_publisher": false, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 0, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com", + "version_url": "https://version.skycoin.com/skycoin/version.txt", + "bip44_coin": 8000 + } + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:1024" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status.golden new file mode 100644 index 00000000..057da3f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status.golden @@ -0,0 +1,61 @@ +{ + "status": { + "blockchain": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 1, + "time_since_last_block": "0s" + }, + "version": { + "version": "", + "commit": "", + "branch": "" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.27.0", + "open_connections": 0, + "outgoing_connections": 0, + "incoming_connections": 0, + "uptime": "0s", + "csrf_enabled": false, + "header_check_enabled": true, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": false, + "block_publisher": false, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 0, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com", + "version_url": "https://version.skycoin.com/skycoin/version.txt", + "bip44_coin": 8000 + } + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:1024" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/two-addresses-outputs.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/two-addresses-outputs.golden new file mode 100644 index 00000000..05f79304 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/two-addresses-outputs.golden @@ -0,0 +1,58 @@ +{ + "outputs": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + }, + { + "hash": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/unconfirmed-transaction-cli.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/unconfirmed-transaction-cli.golden new file mode 100644 index 00000000..e302e7b5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/unconfirmed-transaction-cli.golden @@ -0,0 +1,38 @@ +{ + "transaction": { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-balance.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-balance.golden new file mode 100644 index 00000000..861022d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-balance.golden @@ -0,0 +1,31 @@ +{ + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "addresses": [ + { + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-history.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-history.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-history.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-outputs.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-outputs.golden new file mode 100644 index 00000000..798a9480 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-outputs.golden @@ -0,0 +1,17 @@ +{ + "outputs": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/last_blocks.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/last_blocks.go new file mode 100644 index 00000000..e5395496 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/last_blocks.go @@ -0,0 +1,38 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" +) + +func lastBlocksCmd() *cobra.Command { + return &cobra.Command{ + Short: "Displays the content of the most recently N generated blocks", + Use: "lastBlocks [numberOfBlocks]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getLastBlocks, + } +} + +func getLastBlocks(_ *cobra.Command, args []string) error { + num := args[0] + if num == "" { + num = "1" + } + + n, err := strconv.ParseUint(num, 10, 64) + if err != nil { + return fmt.Errorf("invalid block number, %s", err) + } + + blocks, err := apiClient.LastBlocks(n) + if err != nil { + return err + } + + return printJSON(blocks) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/list_addrs.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/list_addrs.go new file mode 100644 index 00000000..9c3d4f2e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/list_addrs.go @@ -0,0 +1,38 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func listAddressesCmd() *cobra.Command { + return &cobra.Command{ + Short: "Lists all addresses in a given wallet", + Use: "listAddresses [wallet]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: listAddresses, + } +} + +func listAddresses(_ *cobra.Command, args []string) error { + wlt, err := wallet.Load(args[0]) + if err != nil { + return WalletLoadError{err} + } + + addrs := wlt.GetAddresses() + + s, err := FormatAddressesAsJSON(addrs) + if err != nil { + return err + } + + fmt.Println(s) + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/list_wallets.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/list_wallets.go new file mode 100644 index 00000000..880a2e68 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/list_wallets.go @@ -0,0 +1,81 @@ +package cli + +import ( + "io/ioutil" + "path/filepath" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// WalletEntry represents an enty in a wallet file +type WalletEntry struct { + Name string `json:"name"` + Label string `json:"label"` + AddressNum int `json:"address_num"` +} + +func listWalletsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Lists all wallets stored in the wallet directory", + Use: "listWallets [directory]", + Long: `Lists all wallets stored in the wallet directory. + + The [wallet dir] argument is optional. If not provided, defaults to $DATA_DIR/wallets`, + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.MaximumNArgs(1), + RunE: listWallets, + } +} + +func listWallets(_ *cobra.Command, args []string) error { + var wlts struct { + Directory string `json:"directory"` + Wallets []WalletEntry `json:"wallets"` + } + + wlts.Wallets = []WalletEntry{} + + dir := filepath.Join(cliConfig.DataDir, "wallets") + if len(args) > 0 { + dir = args[0] + } + + var err error + dir, err = filepath.Abs(dir) + if err != nil { + return err + } + + wlts.Directory = dir + + entries, err := ioutil.ReadDir(dir) + if err != nil { + return err + } + + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, walletExt) { + continue + } + + path := filepath.Join(dir, name) + w, err := wallet.Load(path) + if err != nil { + return WalletLoadError{err} + } + wlts.Wallets = append(wlts.Wallets, WalletEntry{ + Name: name, + Label: w.Label(), + AddressNum: w.EntriesLen(), + }) + } + } + + return printJSON(wlts) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/outputs.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/outputs.go new file mode 100644 index 00000000..7c8ff8a5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/outputs.go @@ -0,0 +1,95 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func walletOutputsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Display outputs of specific wallet", + Use: "walletOutputs [wallet]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: getWalletOutputsCmd, + } +} + +func addressOutputsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Display outputs of specific addresses", + Use: "addressOutputs [address list]", + Long: `Display outputs of specific addresses, join multiple addresses with space, + example: addressOutputs $addr1 $addr2 $addr3`, + Args: cobra.MinimumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getAddressOutputsCmd, + } +} + +// OutputsResult the output json format +type OutputsResult struct { + Outputs readable.UnspentOutputsSummary `json:"outputs"` +} + +func getWalletOutputsCmd(_ *cobra.Command, args []string) error { + outputs, err := GetWalletOutputsFromFile(apiClient, args[0]) + if err != nil { + return err + } + + return printJSON(OutputsResult{ + Outputs: *outputs, + }) +} + +func getAddressOutputsCmd(_ *cobra.Command, args []string) error { + addrs := make([]string, len(args)) + + var err error + for i := 0; i < len(args); i++ { + addrs[i] = args[i] + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + outputs, err := apiClient.OutputsForAddresses(addrs) + if err != nil { + return err + } + + return printJSON(OutputsResult{ + Outputs: *outputs, + }) +} + +// PUBLIC + +// GetWalletOutputsFromFile returns unspent outputs associated with all addresses in a wallet file +func GetWalletOutputsFromFile(c GetOutputser, walletFile string) (*readable.UnspentOutputsSummary, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + return GetWalletOutputs(c, wlt) +} + +// GetWalletOutputs returns unspent outputs associated with all addresses in a wallet.Wallet +func GetWalletOutputs(c GetOutputser, wlt wallet.Wallet) (*readable.UnspentOutputsSummary, error) { + cipherAddrs := wlt.GetAddresses() + addrs := make([]string, len(cipherAddrs)) + for i := range cipherAddrs { + addrs[i] = cipherAddrs[i].String() + } + + return c.OutputsForAddresses(addrs) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/richlist.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/richlist.go new file mode 100644 index 00000000..891343fe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/richlist.go @@ -0,0 +1,58 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/api" +) + +func richlistCmd() *cobra.Command { + return &cobra.Command{ + Short: "Get skycoin richlist", + Long: "Returns top N address (default 20) balances (based on unspent outputs). Optionally include distribution addresses (exluded by default).", + Use: "richlist [top N addresses (20 default)] [include distribution addresses (false default)]", + Args: cobra.MaximumNArgs(2), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getRichlist, + } +} + +func getRichlist(_ *cobra.Command, args []string) error { + // default values + num := "20" + dist := "false" + + switch len(args) { + case 1: + num = args[0] + case 2: + num = args[0] + dist = args[1] + } + + n, err := strconv.Atoi(num) + if err != nil { + return fmt.Errorf("invalid number of addresses, %s", err) + } + + d, err := strconv.ParseBool(dist) + if err != nil { + return fmt.Errorf("invalid (bool) flag for include distribution addresses, %s", err) + } + + params := &api.RichlistParams{ + N: n, + IncludeDistribution: d, + } + + richlist, err := apiClient.Richlist(params) + if err != nil { + return err + } + + return printJSON(richlist) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/send.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/send.go new file mode 100644 index 00000000..a4a90578 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/send.go @@ -0,0 +1,67 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func sendCmd() *cobra.Command { + sendCmd := &cobra.Command{ + Args: cobra.MinimumNArgs(1), + Short: "Send skycoin from a wallet or an address to a recipient address", + Use: "send [wallet] [to address] [amount]", + Long: `Send skycoin from a wallet or an address to a recipient address. + + Note: the [amount] argument is the coins you will spend, 1 coins = 1e6 droplets. + + The [to address] and [amount] arguments can be replaced with the --many/-m option. + + If you are sending from a wallet without specifying an address, + the transaction will use one or more of the addresses within the wallet. + + Use caution when using the “-p†command. If you have command history enabled + your wallet encryption password can be recovered from the history log. + If you do not include the “-p†option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + rawTxn, err := createRawTxnCmdHandler(c, args) + if err != nil { + printHelp(c) + return err + } + + txid, err := apiClient.InjectTransaction(rawTxn) + if err != nil { + return err + } + + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + if jsonOutput { + return printJSON(struct { + Txid string `json:"txid"` + }{ + Txid: txid, + }) + } + + fmt.Printf("txid:%s\n", txid) + return nil + }, + } + + sendCmd.Flags().StringP("from-address", "a", "", "From address in wallet") + sendCmd.Flags().StringP("change-address", "c", "", `Specify the change address. +Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets).`) + sendCmd.Flags().StringP("many", "m", "", `use JSON string to set multiple receive addresses and coins, +example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`) + sendCmd.Flags().StringP("password", "p", "", "Wallet password") + sendCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + sendCmd.Flags().String("csv", "", "CSV file containing addresses and amounts to send") + + return sendCmd +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/show_seed.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/show_seed.go new file mode 100644 index 00000000..96670b49 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/show_seed.go @@ -0,0 +1,115 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func showSeedCmd() *cobra.Command { + showSeedCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "showSeed [wallet]", + Short: "Show wallet seed and seed passphrase", + Long: `Print the seed and seed passphrase from a wallet. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + w := args[0] + + password, err := c.Flags().GetString("password") + if err != nil { + return err + } + + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(password)) + seed, seedPassphrase, err := getSeed(w, pr) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + if jsonOutput { + v := struct { + Seed string `json:"seed"` + SeedPassphrase string `json:"seed_passphrase,omitempty"` + }{ + Seed: seed, + SeedPassphrase: seedPassphrase, + } + + return printJSON(v) + } + + fmt.Println(seed) + if seedPassphrase != "" { + fmt.Println(seedPassphrase) + } + return nil + }, + } + + showSeedCmd.Flags().StringP("password", "p", "", "Wallet password") + showSeedCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + + return showSeedCmd +} + +func getSeed(walletFile string, pr PasswordReader) (string, string, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return "", "", WalletLoadError{err} + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return "", "", wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return "", "", err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return "", "", wallet.ErrWalletNotEncrypted + } + } + + if !wlt.IsEncrypted() { + return wlt.Seed(), wlt.SeedPassphrase(), nil + } + + password, err := pr.Password() + if err != nil { + return "", "", err + } + + var seed string + var seedPassphrase string + if err := wallet.GuardView(wlt, password, func(w wallet.Wallet) error { + seed = w.Seed() + seedPassphrase = w.SeedPassphrase() + return nil + }); err != nil { + return "", "", err + } + + return seed, seedPassphrase, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/status.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/status.go new file mode 100644 index 00000000..816bccf7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/status.go @@ -0,0 +1,52 @@ +package cli + +import ( + cobra "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/api" +) + +// StatusResult is printed by cli status command +type StatusResult struct { + Status api.HealthResponse `json:"status"` + Config ConfigStatus `json:"cli_config"` +} + +// ConfigStatus contains the configuration parameters loaded by the cli +type ConfigStatus struct { + RPCAddress string `json:"webrpc_address"` +} + +func statusCmd() *cobra.Command { + return &cobra.Command{ + Use: "status", + Short: "Check the status of current Skycoin node", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.NoArgs, + RunE: func(_ *cobra.Command, _ []string) error { + status, err := apiClient.Health() + if err != nil { + return err + } + + return printJSON(StatusResult{ + Status: *status, + Config: ConfigStatus{ + RPCAddress: cliConfig.RPCAddress, + }, + }) + }, + } +} + +func showConfigCmd() *cobra.Command { + return &cobra.Command{ + Use: "showConfig", + Short: "Show cli configuration", + DisableFlagsInUseLine: true, + RunE: func(_ *cobra.Command, _ []string) error { + return printJSON(cliConfig) + }, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/transaction.go new file mode 100644 index 00000000..84b91830 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/transaction.go @@ -0,0 +1,405 @@ +package cli + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "strconv" + + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/wallet" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + + "github.com/spf13/cobra" +) + +// TxnResult wraps readable.TransactionWithStatus +type TxnResult struct { + Transaction *readable.TransactionWithStatus `json:"transaction"` +} + +func transactionCmd() *cobra.Command { + return &cobra.Command{ + Short: "Show detail info of specific transaction", + Use: "transaction [transaction id]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + txid := args[0] + if txid == "" { + return errors.New("txid is empty") + } + + // validate the txid + _, err := cipher.SHA256FromHex(txid) + if err != nil { + return errors.New("invalid txid") + } + + txn, err := apiClient.Transaction(txid) + if err != nil { + return err + } + + return printJSON(TxnResult{ + Transaction: txn, + }) + }, + } +} + +func decodeRawTxnCmd() *cobra.Command { + return &cobra.Command{ + Short: "Decode raw transaction", + Use: "decodeRawTransaction [raw transaction]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + txn, err := coin.DeserializeTransactionHex(args[0]) + if err != nil { + return fmt.Errorf("invalid raw transaction: %v", err) + } + + // Assume the transaction is not malformed and if it has no inputs + // that it is the genesis block's transaction + isGenesis := len(txn.In) == 0 + rTxn, err := readable.NewTransaction(txn, isGenesis) + if err != nil { + return err + } + + return printJSON(rTxn) + }, + } +} + +func encodeJSONTxnCmd() *cobra.Command { + cmd := &cobra.Command{ + Short: "Encode JSON transaction", + Use: "encodeJsonTransaction [file path or -]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: func(c *cobra.Command, args []string) error { + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + jsonFilePath := args[0] + var jsonFile *os.File + if jsonFilePath == "-" { + jsonFile = os.Stdin + err = nil + jsonFilePath = "" + } else { + jsonFile, err = os.Open(jsonFilePath) + } + if err != nil { + return fmt.Errorf("open file failed %s: %v", jsonFilePath, err) + } + var rTxn readable.Transaction + err = json.NewDecoder(jsonFile).Decode(&rTxn) + if err != nil { + return fmt.Errorf("invalid JSON transaction: %v", err) + } + + // fixHashes recomputes the txn hashes + // the recomputation of hash is needed when txn info for e.g. the sig is changed + fixHashes, err := c.Flags().GetBool("fix") + if err != nil { + return err + } + + if fixHashes { + err = recomputeHashes(&rTxn) + if err != nil { + return err + } + } + + txn, err := readableToCreatedTransaction(&rTxn).ToTransaction() + if err != nil { + return err + } + rawTxn, err := txn.SerializeHex() + if err != nil { + return err + } + if jsonOutput { + return printJSON(struct { + RawTx string `json:"rawtx"` + }{ + RawTx: rawTxn, + }) + } + fmt.Println(rawTxn) + return nil + }, + } + cmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + cmd.Flags().BoolP("fix", "f", false, "Recompute transaction inner and outer hashes") + return cmd +} + +func readableToCreatedTransaction(rTxn *readable.Transaction) *api.CreatedTransaction { + inputs := make([]api.CreatedTransactionInput, len(rTxn.In)) + outputs := make([]api.CreatedTransactionOutput, len(rTxn.Out)) + for i, rIn := range rTxn.In { + inputs[i] = api.CreatedTransactionInput{ + UxID: rIn, + } + } + for i, rOut := range rTxn.Out { + outputs[i] = api.CreatedTransactionOutput{ + UxID: rOut.Hash, + Address: rOut.Address, + Coins: rOut.Coins, + Hours: strconv.FormatUint(rOut.Hours, 10), + } + } + cTxn := api.CreatedTransaction{ + Length: rTxn.Length, + Type: rTxn.Type, + TxID: rTxn.Hash, + InnerHash: rTxn.InnerHash, + Fee: "", + Sigs: rTxn.Sigs[:], + In: inputs, + Out: outputs, + } + return &cTxn +} + +func recomputeHashes(rTxn *readable.Transaction) error { + t := coin.Transaction{} + + t.Length = rTxn.Length + t.Type = rTxn.Type + + var err error + + sigs := make([]cipher.Sig, len(rTxn.Sigs)) + for i, s := range rTxn.Sigs { + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return err + } + } + + t.Sigs = sigs + + in := make([]cipher.SHA256, len(rTxn.In)) + for i, UxID := range rTxn.In { + in[i], err = cipher.SHA256FromHex(UxID) + if err != nil { + return err + } + } + + t.In = in + + out := make([]coin.TransactionOutput, len(rTxn.Out)) + for i, o := range rTxn.Out { + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return err + } + + coins, err := droplet.FromString(o.Coins) + if err != nil { + return err + } + + out[i] = coin.TransactionOutput{ + Address: addr, + Coins: coins, + Hours: o.Hours, + } + } + + t.Out = out + + // recompute inner hash + rTxn.InnerHash = t.HashInner().Hex() + t.InnerHash, err = cipher.SHA256FromHex(rTxn.InnerHash) + if err != nil { + return err + } + + // recompute txid + rTxn.Hash = t.Hash().Hex() + + return nil +} + +func addressTransactionsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Show detail for transaction associated with one or more specified addresses", + Use: "addressTransactions [address list]", + Long: `Display transactions for specific addresses, separate multiple addresses with a space, + example: addressTransactions addr1 addr2 addr3`, + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getAddressTransactionsCmd, + } +} + +func getAddressTransactionsCmd(c *cobra.Command, args []string) error { + // Build the list of addresses from the command line arguments + addrs := make([]string, len(args)) + var err error + for i := 0; i < len(args); i++ { + addrs[i] = args[i] + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + // If one or more addresses have been provided, request their transactions - otherwise report an error + if len(addrs) > 0 { + outputs, err := apiClient.TransactionsVerbose(addrs) + if err != nil { + return err + } + + return printJSON(outputs) + } + + return fmt.Errorf("at least one address must be specified. Example: %s addr1 addr2 addr3", c.Name()) +} + +func verifyTransactionCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify if the specific transaction is spendable", + Use: "verifyTransaction [encoded transaction]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.MaximumNArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + encodedTxn := args[0] + if encodedTxn == "" { + return errors.New("transaction is empty") + } + + _, err := apiClient.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: encodedTxn, + }) + if err != nil { + return err + } + + fmt.Println("transaction is spendable") + + return nil + }, + } +} + +func pendingTransactionsCmd() *cobra.Command { + pendingTxnsCmd := &cobra.Command{ + Short: "Get all unconfirmed transactions", + Use: "pendingTransactions", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.NoArgs, + RunE: func(c *cobra.Command, _ []string) error { + isVerbose, err := c.Flags().GetBool("verbose") + if err != nil { + return err + } + + if isVerbose { + pendingTxns, err := apiClient.PendingTransactionsVerbose() + if err != nil { + return err + } + + return printJSON(pendingTxns) + } + + pendingTxns, err := apiClient.PendingTransactions() + if err != nil { + return err + } + + return printJSON(pendingTxns) + }, + } + + pendingTxnsCmd.Flags().BoolP("verbose", "v", false, + `Require the transaction inputs to include the owner address, coins, hours and calculated hours. + The hours are the original hours the output was created with. + The calculated hours are calculated based upon the current system time, and provide an approximate + coin hour value of the output if it were to be confirmed at that instant.`) + + return pendingTxnsCmd +} + +func signTxnCmd() *cobra.Command { + signTxnCmd := &cobra.Command{ + Short: "Sign an unsigned transaction with specific wallet", + Use: "signTransaction [wallet] [raw transaction]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(2), + RunE: func(c *cobra.Command, args []string) error { + id := args[0] + rawTxn := args[1] + + // Decode the raw transaction to see if the transaction already signed + txn, err := coin.DeserializeTransactionHex(rawTxn) + if err != nil { + return err + } + + emptySig := cipher.Sig{} + if len(txn.Sigs) > 0 && txn.Sigs[0] != emptySig { + return fmt.Errorf("Transaction already signed") + } + + // Check if wallet is encrypted + req := api.WalletSignTransactionRequest{ + WalletID: id, + EncodedTransaction: rawTxn, + } + + // Load wallet to check if the wallet is encrypted + w, err := wallet.Load(id) + if err != nil { + return err + } + + // Read wallet password from terminal if it is encrypted + if w.IsEncrypted() { + v, err := readPasswordFromTerminal() + if err != nil { + return err + } + req.Password = string(v) + defer func() { + // Wipe out the password from memory + v = []byte{} + req.Password = "" + }() + } + + // Send transaction signing request + signedTxn, err := apiClient.WalletSignTransaction(req) + if err != nil { + return err + } + + return printJSON(signedTxn) + }, + } + + return signTxnCmd +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/verify_address.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/verify_address.go new file mode 100644 index 00000000..f2f2bef9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/verify_address.go @@ -0,0 +1,21 @@ +package cli + +import ( + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +func verifyAddressCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify a skycoin address", + Use: "verifyAddress [skycoin address]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: func(_ *cobra.Command, args []string) error { + _, err := cipher.DecodeBase58Address(args[0]) + return err + }, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/version.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/version.go new file mode 100644 index 00000000..7cb5af17 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/version.go @@ -0,0 +1,50 @@ +package cli + +import ( + "fmt" + "reflect" + + "github.com/spf13/cobra" +) + +func versionCmd() *cobra.Command { + versionCmd := &cobra.Command{ + Use: "version", + Short: "List the current version of Skycoin components", + Args: cobra.NoArgs, + SilenceUsage: true, + RunE: func(c *cobra.Command, _ []string) error { + var ver = struct { + Skycoin string `json:"skycoin"` + Cli string `json:"cli"` + RPC string `json:"rpc"` + Wallet string `json:"wallet"` + }{ + Version, + Version, + Version, + Version, + } + + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + if jsonOutput { + return printJSON(ver) + } + + v := reflect.ValueOf(ver) + t := reflect.TypeOf(ver) + for i := 0; i < v.NumField(); i++ { + fmt.Printf("%s:%v\n", t.Field(i).Tag.Get("json"), v.Field(i).Interface()) + } + + return nil + }, + } + + versionCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format") + + return versionCmd +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_history.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_history.go new file mode 100644 index 00000000..3f1d9f69 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_history.go @@ -0,0 +1,249 @@ +package cli + +import ( + "errors" + "fmt" + + "time" + + "sort" + + cobra "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// AddrHistory represents a transactional event for an address +type AddrHistory struct { + BlockSeq uint64 `json:"-"` + Txid string `json:"txid"` + Address string `json:"address"` + Amount string `json:"amount"` + Timestamp time.Time `json:"timestamp"` + Status int `json:"status"` + + coins uint64 +} + +type byTime []AddrHistory + +func (obt byTime) Less(i, j int) bool { + return obt[i].Timestamp.Unix() < obt[j].Timestamp.Unix() +} + +func (obt byTime) Swap(i, j int) { + obt[i], obt[j] = obt[j], obt[i] +} + +func (obt byTime) Len() int { + return len(obt) +} + +func walletHisCmd() *cobra.Command { + walletHisCmd := &cobra.Command{ + Short: "Display the transaction history of specific wallet. Requires skycoin node rpc.", + Use: "walletHistory [wallet]", + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: walletHistoryAction, + } + + return walletHisCmd +} + +func walletHistoryAction(c *cobra.Command, args []string) error { + w := args[0] + + // Get all addresses in the wallet + addrs, err := getAddresses(w) + if err != nil { + return err + } + + if len(addrs) == 0 { + return errors.New("Wallet is empty") + } + + // Get all the addresses' historical uxouts + totalAddrHis := []AddrHistory{} + for _, addr := range addrs { + uxouts, err := apiClient.AddressUxOuts(addr) + if err != nil { + return err + } + + addrHis, err := makeAddrHisArray(apiClient, addr, uxouts) + if err != nil { + return err + } + totalAddrHis = append(totalAddrHis, addrHis...) + } + + // Sort the uxouts by time ascending + sort.Sort(byTime(totalAddrHis)) + + return printJSON(totalAddrHis) +} + +func makeAddrHisArray(c *api.Client, addr string, uxOuts []readable.SpentOutput) ([]AddrHistory, error) { + if len(uxOuts) == 0 { + return nil, nil + } + + var addrHis, spentHis, realHis []AddrHistory + var spentBlkSeqMap = map[uint64]bool{} + + for _, u := range uxOuts { + amount, err := droplet.ToString(u.Coins) + if err != nil { + return nil, err + } + + addrHis = append(addrHis, AddrHistory{ + BlockSeq: u.SrcBkSeq, + Txid: u.SrcTx, + Address: addr, + Amount: amount, + Timestamp: time.Unix(int64(u.Time), 0).UTC(), + Status: 1, + coins: u.Coins, + }) + + // the SpentBlockSeq will be 0 if the uxout has not been spent yet. + if u.SpentBlockSeq != 0 { + spentBlkSeqMap[u.SpentBlockSeq] = true + spentHis = append(spentHis, AddrHistory{ + BlockSeq: u.SpentBlockSeq, + Address: addr, + Txid: u.SpentTxnID, + Amount: "-" + amount, + Status: 1, + coins: u.Coins, + }) + } + } + + if len(spentBlkSeqMap) > 0 { + spentBlkSeq := make([]uint64, 0, len(spentBlkSeqMap)) + for seq := range spentBlkSeqMap { + spentBlkSeq = append(spentBlkSeq, seq) + } + + getBlkTime, err := createBlkTimeFinder(c, spentBlkSeq) + if err != nil { + return nil, err + } + + for i, his := range spentHis { + spentHis[i].Timestamp = time.Unix(getBlkTime(his.BlockSeq), 0).UTC() + } + } + + type historyRecord struct { + received []AddrHistory + spent []AddrHistory + } + + // merge history in the same transaction. + hisMap := map[string]historyRecord{} + for _, his := range addrHis { + hr := hisMap[his.Txid] + hr.received = append(hr.received, his) + hisMap[his.Txid] = hr + } + for _, his := range spentHis { + hr := hisMap[his.Txid] + hr.spent = append(hr.spent, his) + hisMap[his.Txid] = hr + } + + for txid, hs := range hisMap { + var receivedCoins, spentCoins, coins uint64 + for _, h := range hs.received { + receivedCoins += h.coins + } + for _, h := range hs.spent { + spentCoins += h.coins + } + + isNegative := spentCoins > receivedCoins + + if spentCoins > receivedCoins { + coins = spentCoins - receivedCoins + } else { + coins = receivedCoins - spentCoins + } + + amount, err := droplet.ToString(coins) + if err != nil { + return nil, err + } + + if isNegative { + amount = "-" + amount + } + + var his AddrHistory + if len(hs.received) > 0 { + his = hs.received[0] + } else { + his = hs.spent[0] + } + + realHis = append(realHis, AddrHistory{ + BlockSeq: his.BlockSeq, + Txid: txid, + Address: addr, + Amount: amount, + Timestamp: his.Timestamp, + Status: 1, + }) + } + + return realHis, nil +} + +func createBlkTimeFinder(c *api.Client, ss []uint64) (func(uint64) int64, error) { + // get spent blocks + blocks := make([]*readable.Block, 0, len(ss)) + for _, s := range ss { + block, err := c.BlockBySeq(s) + if err != nil { + return nil, err + } + + blocks = append(blocks, block) + } + + if len(blocks) == 0 { + return nil, fmt.Errorf("found no block") + } + + return func(seq uint64) int64 { + for _, b := range blocks { + if seq == b.Head.BkSeq { + return int64(b.Head.Time) + } + } + panic("block not found") + }, nil +} + +func getAddresses(f string) ([]string, error) { + wlt, err := wallet.Load(f) + if err != nil { + return nil, err + } + + addrs := wlt.GetAddresses() + + strAddrs := make([]string, len(addrs)) + for i, a := range addrs { + strAddrs[i] = a.String() + } + + return strAddrs, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_key_export.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_key_export.go new file mode 100644 index 00000000..5208019d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_key_export.go @@ -0,0 +1,159 @@ +package cli + +import ( + "errors" + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func walletKeyExportCmd() *cobra.Command { + walletKeyExportCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + RunE: walletKeyExportHandler, + Use: "walletKeyExport [wallet]", + Short: "Export a specific key from an HD wallet", + Long: `This command prints the xpub or xprv key for a given + HDNode in a bip44 wallet. The HDNode path is specified with --path. + This path is the portion of the bip44 path. + + Example: -k xpub --path=0 prints the account 0 xpub + Example: -k xpub --path=0/0 prints the account 0, external chain xpub + Example: -k xprv --path=0/1 prints the account 0, change chain xprv + Example: -k pub --path=0/1/9 prints the account 0, external chain child 9 public key + Example: -k prv --path=0/1/8 prints the account 0, change chain child 8 private key + + The bip32 path node apostrophe is implicit for the first element of the path. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered + from the history log. If you do not include the "-p" option you will + be prompted to enter your password after you enter your command.`, + } + + walletKeyExportCmd.Flags().StringP("key", "k", "xpub", "key type (\"xpub\", \"xprv\", \"pub\", \"prv\")") + walletKeyExportCmd.Flags().StringP("path", "p", "0/0", "bip44 account'/change subpath") + + return walletKeyExportCmd +} + +func walletKeyExportHandler(c *cobra.Command, args []string) error { + keyType, err := c.Flags().GetString("key") + if err != nil { + return err + } + if err := validateKeyType(keyType); err != nil { + return err + } + + w, err := wallet.Load(args[0]) + if err != nil { + return err + } + + switch w.Type() { + case wallet.WalletTypeBip44: + default: + return fmt.Errorf("support wallet types: %q", wallet.WalletTypeBip44) + } + + wb := w.(*wallet.Bip44Wallet) + + coin, err := wb.CoinHDNode() + if err != nil { + return err + } + + path, err := c.Flags().GetString("path") + if err != nil { + return err + } + + nodes, err := parsePath(path) + if err != nil { + return err + } + if len(nodes) > 3 { + return errors.New("path can have at most 3 elements") + } + + acct, err := coin.Account(nodes[0]) + if err != nil { + return err + } + + if len(nodes) == 1 { + return printKey(keyType, acct.PrivateKey) + } + + change, err := acct.NewPrivateChildKey(nodes[1]) + if err != nil { + return err + } + + if len(nodes) == 2 { + return printKey(keyType, change) + } + + child, err := change.NewPrivateChildKey(nodes[2]) + if err != nil { + return err + } + + if len(nodes) == 3 { + return printKey(keyType, child) + } + + return nil +} + +func validateKeyType(kt string) error { + switch kt { + case "xpub", "xprv", "pub", "prv": + default: + return errors.New("key must be \"xpub\", \"xprv\", \"pub\" or \"prv\"") + } + + return nil +} + +func printKey(kt string, k *bip32.PrivateKey) error { + if err := validateKeyType(kt); err != nil { + return err + } + + switch kt { + case "xpub": + fmt.Println(k.PublicKey().String()) + case "xprv": + fmt.Println(k.String()) + case "pub": + fmt.Println(cipher.MustNewPubKey(k.PublicKey().Key).Hex()) + case "prv": + fmt.Println(cipher.MustNewSecKey(k.Key).Hex()) + default: + panic("unhandled key type") + } + + return nil +} + +func parsePath(p string) ([]uint32, error) { + pts := strings.Split(p, "/") + idx := make([]uint32, len(pts)) + for i, c := range pts { + x, err := strconv.ParseUint(c, 10, 32) + if err != nil { + return nil, fmt.Errorf("invalid path node number %q at position %d", c, i) + } + idx[i] = uint32(x) + } + + return idx, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block.go new file mode 100644 index 00000000..00a9a898 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block.go @@ -0,0 +1,236 @@ +/* +Package coin defines the core blockchain datastructures. + +This package should not have any dependencies except for go stdlib and cipher. +*/ +package coin + +import ( + "fmt" + "log" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +//go:generate skyencoder -struct BlockHeader -unexported +//go:generate skyencoder -struct BlockBody -unexported + +// MaxBlockTransactions is the maximum number of transactions in a block (see the maxlen struct tag value applied to BlockBody.Transactions) +const MaxBlockTransactions = 65535 + +// Block represents the block struct +type Block struct { + Head BlockHeader + Body BlockBody +} + +// HashPair including current block hash and previous block hash. +type HashPair struct { + Hash cipher.SHA256 + PrevHash cipher.SHA256 +} + +// BlockHeader records the block header +type BlockHeader struct { + Version uint32 + + Time uint64 + BkSeq uint64 // Increment every block + Fee uint64 // Fee in block + + PrevHash cipher.SHA256 // Hash of header of previous block + BodyHash cipher.SHA256 // Hash of transaction block + + UxHash cipher.SHA256 // XOR of sha256 of elements in unspent output set +} + +// BlockBody represents the block body +type BlockBody struct { + Transactions Transactions `enc:",maxlen=65535"` +} + +// SignedBlock signed block +type SignedBlock struct { + Block + Sig cipher.Sig +} + +// VerifySignature verifies that the block is signed by pubkey +func (b SignedBlock) VerifySignature(pubkey cipher.PubKey) error { + return cipher.VerifyPubKeySignedHash(pubkey, b.Sig, b.HashHeader()) +} + +// NewBlock creates new block. +func NewBlock(prev Block, currentTime uint64, uxHash cipher.SHA256, txns Transactions, calc FeeCalculator) (*Block, error) { + if len(txns) == 0 { + return nil, fmt.Errorf("Refusing to create block with no transactions") + } + + fee, err := txns.Fees(calc) + if err != nil { + // This should have been caught earlier + return nil, fmt.Errorf("Invalid transaction fees: %v", err) + } + + body := BlockBody{txns} + head := NewBlockHeader(prev.Head, uxHash, currentTime, fee, body) + return &Block{ + Head: head, + Body: body, + }, nil +} + +// NewGenesisBlock creates genesis block +func NewGenesisBlock(genesisAddr cipher.Address, genesisCoins, timestamp uint64) (*Block, error) { + txn := Transaction{} + if err := txn.PushOutput(genesisAddr, genesisCoins, genesisCoins); err != nil { + return nil, err + } + body := BlockBody{Transactions: Transactions{txn}} + prevHash := cipher.SHA256{} + bodyHash := body.Hash() + head := BlockHeader{ + Time: timestamp, + BodyHash: bodyHash, + PrevHash: prevHash, + BkSeq: 0, + Version: 0, + Fee: 0, + UxHash: cipher.SHA256{}, + } + b := &Block{ + Head: head, + Body: body, + } + + return b, nil +} + +// HashHeader return hash of block head. +func (b Block) HashHeader() cipher.SHA256 { + return b.Head.Hash() +} + +// Time return the head time of the block. +func (b Block) Time() uint64 { + return b.Head.Time +} + +// Seq return the head seq of the block. +func (b Block) Seq() uint64 { + return b.Head.BkSeq +} + +// Size returns the size of the Block's Transactions, in bytes +func (b Block) Size() (uint32, error) { + return b.Body.Size() +} + +// NewBlockHeader creates block header +func NewBlockHeader(prev BlockHeader, uxHash cipher.SHA256, currentTime, fee uint64, body BlockBody) BlockHeader { + if currentTime <= prev.Time { + log.Panic("Time can only move forward") + } + bodyHash := body.Hash() + prevHash := prev.Hash() + return BlockHeader{ + BodyHash: bodyHash, + Version: prev.Version, + PrevHash: prevHash, + Time: currentTime, + BkSeq: prev.BkSeq + 1, + Fee: fee, + UxHash: uxHash, + } +} + +// Hash return hash of block header +func (bh *BlockHeader) Hash() cipher.SHA256 { + return cipher.SumSHA256(bh.Bytes()) +} + +// Bytes serialize the blockheader and return the byte value. +func (bh *BlockHeader) Bytes() []byte { + buf, err := encodeBlockHeader(bh) + if err != nil { + log.Panicf("encodeBlockHeader failed: %v", err) + } + return buf +} + +// Hash returns the merkle hash of contained transactions +func (bb BlockBody) Hash() cipher.SHA256 { + hashes := make([]cipher.SHA256, len(bb.Transactions)) + for i := range bb.Transactions { + hashes[i] = bb.Transactions[i].Hash() + } + // Merkle hash of transactions + return cipher.Merkle(hashes) +} + +// Size returns the size of Transactions, in bytes +func (bb BlockBody) Size() (uint32, error) { + // We can't use length of self.Bytes() because it has a length prefix + // Need only the sum of transaction sizes + return bb.Transactions.Size() +} + +// Bytes serialize block body, and return the byte value. +func (bb *BlockBody) Bytes() []byte { + buf, err := encodeBlockBody(bb) + if err != nil { + log.Panicf("encodeBlockBody failed: %v", err) + } + return buf +} + +// CreateUnspents creates the expected outputs for a transaction. +func CreateUnspents(bh BlockHeader, txn Transaction) UxArray { + var h cipher.SHA256 + // The genesis block uses the null hash as the SrcTransaction [FIXME hardfork] + if bh.BkSeq != 0 { + h = txn.Hash() + } + uxo := make(UxArray, len(txn.Out)) + for i := range txn.Out { + uxo[i] = UxOut{ + Head: UxHead{ + Time: bh.Time, + BkSeq: bh.BkSeq, + }, + Body: UxBody{ + SrcTransaction: h, + Address: txn.Out[i].Address, + Coins: txn.Out[i].Coins, + Hours: txn.Out[i].Hours, + }, + } + } + return uxo +} + +// CreateUnspent creates single unspent output +func CreateUnspent(bh BlockHeader, txn Transaction, outIndex int) (UxOut, error) { + if outIndex < 0 || outIndex >= len(txn.Out) { + return UxOut{}, fmt.Errorf("Transaction out index overflows transaction outputs") + } + + var h cipher.SHA256 + // The genesis block uses the null hash as the SrcTransaction [FIXME hardfork] + if bh.BkSeq != 0 { + h = txn.Hash() + } + + return UxOut{ + Head: UxHead{ + Time: bh.Time, + BkSeq: bh.BkSeq, + }, + Body: UxBody{ + SrcTransaction: h, + Address: txn.Out[outIndex].Address, + Coins: txn.Out[outIndex].Coins, + Hours: txn.Out[outIndex].Hours, + }, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder.go new file mode 100644 index 00000000..26cb15e0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder.go @@ -0,0 +1,407 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeBlockBody computes the size of an encoded object of type BlockBody +func encodeSizeBlockBody(obj *BlockBody) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + for _, x1 := range obj.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + return i0 +} + +// encodeBlockBody encodes an object of type BlockBody to a buffer allocated to the exact size +// required to encode the object. +func encodeBlockBody(obj *BlockBody) ([]byte, error) { + n := encodeSizeBlockBody(obj) + buf := make([]byte, n) + + if err := encodeBlockBodyToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeBlockBodyToBuffer encodes an object of type BlockBody to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeBlockBodyToBuffer(buf []byte, obj *BlockBody) error { + if uint64(len(buf)) < encodeSizeBlockBody(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + return nil +} + +// decodeBlockBody decodes an object of type BlockBody from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeBlockBody(buf []byte, obj *BlockBody) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]Transaction, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Transactions[z1].Length = i + } + + { + // obj.Transactions[z1].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Type = i + } + + { + // obj.Transactions[z1].InnerHash + if len(d.Buffer) < len(obj.Transactions[z1].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].InnerHash[:], d.Buffer[:len(obj.Transactions[z1].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].InnerHash):] + } + + { + // obj.Transactions[z1].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Sigs = make([]cipher.Sig, length) + + for z3 := range obj.Transactions[z1].Sigs { + { + // obj.Transactions[z1].Sigs[z3] + if len(d.Buffer) < len(obj.Transactions[z1].Sigs[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Sigs[z3][:], d.Buffer[:len(obj.Transactions[z1].Sigs[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Sigs[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].In = make([]cipher.SHA256, length) + + for z3 := range obj.Transactions[z1].In { + { + // obj.Transactions[z1].In[z3] + if len(d.Buffer) < len(obj.Transactions[z1].In[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].In[z3][:], d.Buffer[:len(obj.Transactions[z1].In[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].In[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Out = make([]TransactionOutput, length) + + for z3 := range obj.Transactions[z1].Out { + { + // obj.Transactions[z1].Out[z3].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Address.Version = i + } + + { + // obj.Transactions[z1].Out[z3].Address.Key + if len(d.Buffer) < len(obj.Transactions[z1].Out[z3].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Out[z3].Address.Key[:], d.Buffer[:len(obj.Transactions[z1].Out[z3].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Out[z3].Address.Key):] + } + + { + // obj.Transactions[z1].Out[z3].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Coins = i + } + + { + // obj.Transactions[z1].Out[z3].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Hours = i + } + + } + } + } + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeBlockBodyExact decodes an object of type BlockBody from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeBlockBodyExact(buf []byte, obj *BlockBody) error { + if n, err := decodeBlockBody(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder_test.go new file mode 100644 index 00000000..6cf1acda --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyBlockBodyForEncodeTest() *BlockBody { + var obj BlockBody + return &obj +} + +func newRandomBlockBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockBody { + var obj BlockBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenBlockBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockBody { + var obj BlockBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilBlockBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockBody { + var obj BlockBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderBlockBody(t *testing.T, obj *BlockBody) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeBlockBody(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeBlockBody() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeBlockBody(obj) + if err != nil { + t.Fatalf("encodeBlockBody failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeBlockBody produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeBlockBody()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeBlockBodyToBuffer(data3, obj); err != nil { + t.Fatalf("encodeBlockBodyToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 BlockBody + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 BlockBody + if n, err := decodeBlockBody(data2, &obj3); err != nil { + t.Fatalf("decodeBlockBody failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlockBody bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockBody()") + } + + // Decode, excess buffer + var obj4 BlockBody + n, err := decodeBlockBody(data3, &obj4) + if err != nil { + t.Fatalf("decodeBlockBody failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeBlockBody bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeBlockBody bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockBody()") + } + + // DecodeExact + var obj5 BlockBody + if err := decodeBlockBodyExact(data2, &obj5); err != nil { + t.Fatalf("decodeBlockBody failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockBody()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeBlockBody(data4, &obj3); err != nil { + t.Fatalf("decodeBlockBody failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlockBody bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderBlockBody(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *BlockBody + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyBlockBodyForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomBlockBodyForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenBlockBodyForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilBlockBodyForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderBlockBody(t, tc.obj) + }) + } +} + +func decodeBlockBodyExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj BlockBody + if _, err := decodeBlockBody(buf, &obj); err == nil { + t.Fatal("decodeBlockBody: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockBody: expected error %q, got %q", expectedErr, err) + } +} + +func decodeBlockBodyExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj BlockBody + if err := decodeBlockBodyExact(buf, &obj); err == nil { + t.Fatal("decodeBlockBodyExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockBodyExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderBlockBodyDecodeErrors(t *testing.T, k int, tag string, obj *BlockBody) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeBlockBody(obj) + buf, err := encodeBlockBody(obj) + if err != nil { + t.Fatalf("encodeBlockBody failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockBodyExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockBodyExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockBodyExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockBodyExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeBlockBodyExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderBlockBodyDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyBlockBodyForEncodeTest() + fullObj := newRandomBlockBodyForEncodeTest(t, rand) + testSkyencoderBlockBodyDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderBlockBodyDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder.go new file mode 100644 index 00000000..f91f5275 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder.go @@ -0,0 +1,168 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeBlockHeader computes the size of an encoded object of type BlockHeader +func encodeSizeBlockHeader(obj *BlockHeader) uint64 { + i0 := uint64(0) + + // obj.Version + i0 += 4 + + // obj.Time + i0 += 8 + + // obj.BkSeq + i0 += 8 + + // obj.Fee + i0 += 8 + + // obj.PrevHash + i0 += 32 + + // obj.BodyHash + i0 += 32 + + // obj.UxHash + i0 += 32 + + return i0 +} + +// encodeBlockHeader encodes an object of type BlockHeader to a buffer allocated to the exact size +// required to encode the object. +func encodeBlockHeader(obj *BlockHeader) ([]byte, error) { + n := encodeSizeBlockHeader(obj) + buf := make([]byte, n) + + if err := encodeBlockHeaderToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeBlockHeaderToBuffer encodes an object of type BlockHeader to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeBlockHeaderToBuffer(buf []byte, obj *BlockHeader) error { + if uint64(len(buf)) < encodeSizeBlockHeader(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Version + e.Uint32(obj.Version) + + // obj.Time + e.Uint64(obj.Time) + + // obj.BkSeq + e.Uint64(obj.BkSeq) + + // obj.Fee + e.Uint64(obj.Fee) + + // obj.PrevHash + e.CopyBytes(obj.PrevHash[:]) + + // obj.BodyHash + e.CopyBytes(obj.BodyHash[:]) + + // obj.UxHash + e.CopyBytes(obj.UxHash[:]) + + return nil +} + +// decodeBlockHeader decodes an object of type BlockHeader from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeBlockHeader(buf []byte, obj *BlockHeader) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Version = i + } + + { + // obj.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Time = i + } + + { + // obj.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.BkSeq = i + } + + { + // obj.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Fee = i + } + + { + // obj.PrevHash + if len(d.Buffer) < len(obj.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.PrevHash[:], d.Buffer[:len(obj.PrevHash)]) + d.Buffer = d.Buffer[len(obj.PrevHash):] + } + + { + // obj.BodyHash + if len(d.Buffer) < len(obj.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.BodyHash[:], d.Buffer[:len(obj.BodyHash)]) + d.Buffer = d.Buffer[len(obj.BodyHash):] + } + + { + // obj.UxHash + if len(d.Buffer) < len(obj.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.UxHash[:], d.Buffer[:len(obj.UxHash)]) + d.Buffer = d.Buffer[len(obj.UxHash):] + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeBlockHeaderExact decodes an object of type BlockHeader from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeBlockHeaderExact(buf []byte, obj *BlockHeader) error { + if n, err := decodeBlockHeader(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder_test.go new file mode 100644 index 00000000..784c38f4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyBlockHeaderForEncodeTest() *BlockHeader { + var obj BlockHeader + return &obj +} + +func newRandomBlockHeaderForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockHeader { + var obj BlockHeader + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenBlockHeaderForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockHeader { + var obj BlockHeader + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilBlockHeaderForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockHeader { + var obj BlockHeader + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderBlockHeader(t *testing.T, obj *BlockHeader) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeBlockHeader(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeBlockHeader() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeBlockHeader(obj) + if err != nil { + t.Fatalf("encodeBlockHeader failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeBlockHeader produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeBlockHeader()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeBlockHeaderToBuffer(data3, obj); err != nil { + t.Fatalf("encodeBlockHeaderToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 BlockHeader + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 BlockHeader + if n, err := decodeBlockHeader(data2, &obj3); err != nil { + t.Fatalf("decodeBlockHeader failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlockHeader bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockHeader()") + } + + // Decode, excess buffer + var obj4 BlockHeader + n, err := decodeBlockHeader(data3, &obj4) + if err != nil { + t.Fatalf("decodeBlockHeader failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeBlockHeader bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeBlockHeader bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockHeader()") + } + + // DecodeExact + var obj5 BlockHeader + if err := decodeBlockHeaderExact(data2, &obj5); err != nil { + t.Fatalf("decodeBlockHeader failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockHeader()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeBlockHeader(data4, &obj3); err != nil { + t.Fatalf("decodeBlockHeader failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlockHeader bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderBlockHeader(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *BlockHeader + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyBlockHeaderForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomBlockHeaderForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenBlockHeaderForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilBlockHeaderForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderBlockHeader(t, tc.obj) + }) + } +} + +func decodeBlockHeaderExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj BlockHeader + if _, err := decodeBlockHeader(buf, &obj); err == nil { + t.Fatal("decodeBlockHeader: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockHeader: expected error %q, got %q", expectedErr, err) + } +} + +func decodeBlockHeaderExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj BlockHeader + if err := decodeBlockHeaderExact(buf, &obj); err == nil { + t.Fatal("decodeBlockHeaderExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockHeaderExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderBlockHeaderDecodeErrors(t *testing.T, k int, tag string, obj *BlockHeader) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeBlockHeader(obj) + buf, err := encodeBlockHeader(obj) + if err != nil { + t.Fatalf("encodeBlockHeader failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockHeaderExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockHeaderExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockHeaderExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockHeaderExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeBlockHeaderExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderBlockHeaderDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyBlockHeaderForEncodeTest() + fullObj := newRandomBlockHeaderForEncodeTest(t, rand) + testSkyencoderBlockHeaderDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderBlockHeaderDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_test.go new file mode 100644 index 00000000..d32879ee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_test.go @@ -0,0 +1,204 @@ +package coin + +import ( + "errors" + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) + _genTime uint64 = 1000 + _genCoins uint64 = 1000e6 + _genCoinHours uint64 = 1000 * 1000 +) + +func tNow() uint64 { + return uint64(time.Now().UTC().Unix()) +} + +func feeCalc(t *Transaction) (uint64, error) { + return 0, nil +} + +func badFeeCalc(t *Transaction) (uint64, error) { + return 0, errors.New("Bad") +} + +func makeNewBlock(t *testing.T, uxHash cipher.SHA256) *Block { + body := BlockBody{ + Transactions: Transactions{Transaction{}}, + } + + prev := Block{ + Body: body, + Head: BlockHeader{ + Version: 0x02, + Time: 100, + BkSeq: 0, + Fee: 10, + PrevHash: cipher.SHA256{}, + BodyHash: body.Hash(), + }} + b, err := NewBlock(prev, 100+20, uxHash, Transactions{Transaction{}}, feeCalc) + require.NoError(t, err) + return b +} + +func addTransactionToBlock(t *testing.T, b *Block) Transaction { + txn := makeTransaction(t) + b.Body.Transactions = append(b.Body.Transactions, txn) + return txn +} + +func TestNewBlock(t *testing.T) { + // TODO -- update this test for newBlock changes + prev := Block{Head: BlockHeader{Version: 0x02, Time: 100, BkSeq: 98}} + uxHash := testutil.RandSHA256(t) + txns := Transactions{Transaction{}} + // invalid txn fees panics + _, err := NewBlock(prev, 133, uxHash, txns, badFeeCalc) + require.EqualError(t, err, fmt.Sprintf("Invalid transaction fees: Bad")) + + // no txns panics + _, err = NewBlock(prev, 133, uxHash, nil, feeCalc) + require.EqualError(t, err, "Refusing to create block with no transactions") + + _, err = NewBlock(prev, 133, uxHash, Transactions{}, feeCalc) + require.EqualError(t, err, "Refusing to create block with no transactions") + + // valid block is fine + fee := uint64(121) + currentTime := uint64(133) + b, err := NewBlock(prev, currentTime, uxHash, txns, func(t *Transaction) (uint64, error) { + return fee, nil + }) + require.NoError(t, err) + require.Equal(t, b.Body.Transactions, txns) + require.Equal(t, b.Head.Fee, fee*uint64(len(txns))) + require.Equal(t, b.Body, BlockBody{Transactions: txns}) + require.Equal(t, b.Head.PrevHash, prev.HashHeader()) + require.Equal(t, b.Head.Time, currentTime) + require.Equal(t, b.Head.BkSeq, prev.Head.BkSeq+1) + require.Equal(t, b.Head.UxHash, uxHash) +} + +func TestBlockHashHeader(t *testing.T) { + uxHash := testutil.RandSHA256(t) + b := makeNewBlock(t, uxHash) + require.Equal(t, b.HashHeader(), b.Head.Hash()) + require.NotEqual(t, b.HashHeader(), cipher.SHA256{}) +} + +func TestBlockBodyHash(t *testing.T) { + uxHash := testutil.RandSHA256(t) + b := makeNewBlock(t, uxHash) + hb := b.Body.Hash() + hashes := b.Body.Transactions.Hashes() + txn := addTransactionToBlock(t, b) + require.NotEqual(t, hb, b.Body.Hash()) + hashes = append(hashes, txn.Hash()) + require.Equal(t, b.Body.Hash(), cipher.Merkle(hashes)) +} + +func TestNewGenesisBlock(t *testing.T) { + gb, err := NewGenesisBlock(genAddress, _genCoins, _genTime) + require.NoError(t, err) + + require.Equal(t, cipher.SHA256{}, gb.Head.PrevHash) + require.Equal(t, _genTime, gb.Head.Time) + require.Equal(t, uint64(0), gb.Head.BkSeq) + require.Equal(t, uint32(0), gb.Head.Version) + require.Equal(t, uint64(0), gb.Head.Fee) + require.Equal(t, cipher.SHA256{}, gb.Head.UxHash) + + require.Equal(t, 1, len(gb.Body.Transactions)) + txn := gb.Body.Transactions[0] + require.Len(t, txn.In, 0) + require.Len(t, txn.Sigs, 0) + require.Len(t, txn.Out, 1) + + require.Equal(t, genAddress, txn.Out[0].Address) + require.Equal(t, _genCoins, txn.Out[0].Coins) + require.Equal(t, _genCoins, txn.Out[0].Hours) +} + +func TestCreateUnspent(t *testing.T) { + txn := Transaction{} + err := txn.PushOutput(genAddress, 11e6, 255) + require.NoError(t, err) + bh := BlockHeader{ + Time: tNow(), + BkSeq: uint64(1), + } + + tt := []struct { + name string + txIndex int + err error + }{ + { + "ok", + 0, + nil, + }, + { + "index overflow", + 10, + errors.New("Transaction out index overflows transaction outputs"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + uxout, err := CreateUnspent(bh, txn, tc.txIndex) + require.Equal(t, tc.err, err) + if err != nil { + return + } + requireUnspent(t, bh, txn, tc.txIndex, uxout) + }) + } +} + +func TestCreateUnspents(t *testing.T) { + txn := Transaction{} + err := txn.PushOutput(genAddress, 11e6, 255) + require.NoError(t, err) + bh := BlockHeader{ + Time: tNow(), + BkSeq: uint64(1), + } + uxouts := CreateUnspents(bh, txn) + require.Equal(t, len(uxouts), 1) + requireValidUnspents(t, bh, txn, uxouts) +} + +func requireUnspent(t *testing.T, bh BlockHeader, txn Transaction, txIndex int, ux UxOut) { + require.Equal(t, bh.Time, ux.Head.Time) + require.Equal(t, bh.BkSeq, ux.Head.BkSeq) + require.Equal(t, txn.Hash(), ux.Body.SrcTransaction) + require.Equal(t, txn.Out[txIndex].Address, ux.Body.Address) + require.Equal(t, txn.Out[txIndex].Coins, ux.Body.Coins) + require.Equal(t, txn.Out[txIndex].Hours, ux.Body.Hours) +} + +func requireValidUnspents(t *testing.T, bh BlockHeader, txn Transaction, + uxo UxArray) { + require.Equal(t, len(txn.Out), len(uxo)) + for i, ux := range uxo { + require.Equal(t, bh.Time, ux.Head.Time) + require.Equal(t, bh.BkSeq, ux.Head.BkSeq) + require.Equal(t, txn.Hash(), ux.Body.SrcTransaction) + require.Equal(t, txn.Out[i].Address, ux.Body.Address) + require.Equal(t, txn.Out[i].Coins, ux.Body.Coins) + require.Equal(t, txn.Out[i].Hours, ux.Body.Hours) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs.go new file mode 100644 index 00000000..457e5eb2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs.go @@ -0,0 +1,327 @@ +package coin + +import ( + "bytes" + "errors" + "fmt" + "log" + "sort" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +/* + Unspent Outputs +*/ + +/* +- hash must only depend on factors known to sender +-- hash cannot depend on block executed +-- hash cannot depend on sequence number +-- hash may depend on nonce + +- hash must depend only on factors known to sender +-- needed to minimize divergence during block chain forks +- it should be difficult to create outputs with duplicate ids + +- Uxhash cannot depend on time or block it was created +- time is still needed for +*/ + +/* + For each transaction, keep track of + - order created + - order spent (for rollbacks) +*/ + +//go:generate skyencoder -struct UxHead -unexported +//go:generate skyencoder -struct UxBody -unexported + +// UxOut represents uxout +type UxOut struct { + Head UxHead + Body UxBody //hashed part + //Meta UxMeta +} + +// UxHead metadata (not hashed) +type UxHead struct { + Time uint64 //time of block it was created in + BkSeq uint64 //block it was created in, used to calculate depth + // SpSeq uint64 //block it was spent in +} + +// UxBody uxbody +type UxBody struct { + SrcTransaction cipher.SHA256 // Inner Hash of Transaction + Address cipher.Address // Address of receiver + Coins uint64 // Number of coins + Hours uint64 // Coin hours +} + +// Hash returns the hash of UxBody +func (uo *UxOut) Hash() cipher.SHA256 { + return uo.Body.Hash() +} + +// SnapshotHash returns hash of UxBody + UxHead +func (uo *UxOut) SnapshotHash() cipher.SHA256 { + n1 := encodeSizeUxBody(&uo.Body) + n2 := encodeSizeUxHead(&uo.Head) + buf := make([]byte, n1+n2) + + if err := encodeUxBodyToBuffer(buf[:n1], &uo.Body); err != nil { + log.Panicf("encodeUxBodyToBuffer failed: %v", err) + } + if err := encodeUxHeadToBuffer(buf[n1:], &uo.Head); err != nil { + log.Panicf("encodeUxHeadToBuffer failed: %v", err) + } + + return cipher.SumSHA256(buf) +} + +// Hash returns hash of uxbody +func (ub *UxBody) Hash() cipher.SHA256 { + buf, err := encodeUxBody(ub) + if err != nil { + log.Panicf("encodeUxBody failed: %v", err) + } + return cipher.SumSHA256(buf) +} + +/* + Make independent of block rate? + Then need creation time of output + Creation time of transaction cant be hashed +*/ + +// ErrAddEarnedCoinHoursAdditionOverflow is returned by UxOut.CoinHours() if during the addition of base coin +// hours to additional earned coin hours, the value would overflow a uint64. +// Callers may choose to ignore this errors and use 0 as the coinhours value instead. +// This affects one existing spent output, spent in block 13277. +var ErrAddEarnedCoinHoursAdditionOverflow = errors.New("UxOut.CoinHours addition of earned coin hours overflow") + +// CoinHours Calculate coinhour balance of output. t is the current unix utc time. +func (uo *UxOut) CoinHours(t uint64) (uint64, error) { + if t < uo.Head.Time { + log.Printf("Calculating coin hours with t < head time") + return uo.Body.Hours, nil + } + + seconds := t - uo.Head.Time // number of seconds + + // Calculate whole coin seconds + wholeCoins := uo.Body.Coins / 1e6 + wholeCoinSeconds, err := mathutil.MultUint64(seconds, wholeCoins) + if err != nil { + err := fmt.Errorf("UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=%d coins=%d uxid=%s", seconds, wholeCoins, uo.Hash().Hex()) + log.Printf("%v", err) + return 0, err + } + + // Calculate remainder droplet seconds + remainderDroplets := uo.Body.Coins % 1e6 + dropletSeconds, err := mathutil.MultUint64(seconds, remainderDroplets) + if err != nil { + err := fmt.Errorf("UxOut.CoinHours: Calculating droplet seconds overflows uint64 seconds=%d droplets=%d uxid=%s", seconds, remainderDroplets, uo.Hash().Hex()) + log.Printf("%v", err) + return 0, err + } + + // Add coinSeconds and seconds earned by droplets, rounded off + coinSeconds := wholeCoinSeconds + dropletSeconds/1e6 + + coinHours := coinSeconds / 3600 // coin hours + totalHours, err := mathutil.AddUint64(uo.Body.Hours, coinHours) // starting+earned + if err != nil { + log.Printf("%v uxid=%s", ErrAddEarnedCoinHoursAdditionOverflow, uo.Hash().Hex()) + return 0, ErrAddEarnedCoinHoursAdditionOverflow + } + return totalHours, nil +} + +// UxHashSet set mapping from UxHash to a placeholder value +type UxHashSet map[cipher.SHA256]struct{} + +// UxArray Array of Outputs +// Used by unspent output pool, spent tests +type UxArray []UxOut + +// Hashes returns Array of hashes for the Ux in the UxArray +func (ua UxArray) Hashes() []cipher.SHA256 { + hashes := make([]cipher.SHA256, len(ua)) + for i, ux := range ua { + hashes[i] = ux.Hash() + } + return hashes +} + +// HasDupes checks the UxArray for outputs which have the same hash +func (ua UxArray) HasDupes() bool { + m := make(UxHashSet, len(ua)) + for i := range ua { + h := ua[i].Hash() + if _, ok := m[h]; ok { + return true + } + m[h] = struct{}{} + } + return false +} + +// Set returns the UxArray as a hash to struct{} map to be used as a set. +// Should only be used for membership detection +func (ua UxArray) Set() UxHashSet { + m := make(UxHashSet, len(ua)) + for i := range ua { + m[ua[i].Hash()] = struct{}{} + } + return m +} + +// Sort sorts UxArray +func (ua UxArray) Sort() { + sort.Sort(ua) +} + +// Len returns length of UxArray +func (ua UxArray) Len() int { + return len(ua) +} + +// Less checks if UxArray[i] < UxArray[j] +func (ua UxArray) Less(i, j int) bool { + hash1 := ua[i].Hash() + hash2 := ua[j].Hash() + return bytes.Compare(hash1[:], hash2[:]) < 0 +} + +// Swap swaps value of UxArray[i] and UxArray[j] +func (ua UxArray) Swap(i, j int) { + ua[i], ua[j] = ua[j], ua[i] +} + +// Coins returns the total coins +func (ua UxArray) Coins() (uint64, error) { + var coins uint64 + for _, ux := range ua { + var err error + coins, err = mathutil.AddUint64(coins, ux.Body.Coins) + if err != nil { + return 0, errors.New("UxArray.Coins addition overflow") + } + } + + return coins, nil +} + +// CoinHours returns the total coin hours +func (ua UxArray) CoinHours(headTime uint64) (uint64, error) { + var hours uint64 + for _, ux := range ua { + uxHours, err := ux.CoinHours(headTime) + if err != nil { + return 0, err + } + + hours, err = mathutil.AddUint64(hours, uxHours) + if err != nil { + return 0, errors.New("UxArray.CoinHours addition overflow") + } + } + return hours, nil +} + +// AddressUxOuts maps address with uxarray +type AddressUxOuts map[cipher.Address]UxArray + +// NewAddressUxOuts creates address uxouts map +func NewAddressUxOuts(uxs UxArray) AddressUxOuts { + uxo := make(AddressUxOuts) + for _, ux := range uxs { + uxo[ux.Body.Address] = append(uxo[ux.Body.Address], ux) + } + return uxo +} + +// Keys returns the Address keys +func (auo AddressUxOuts) Keys() []cipher.Address { + addrs := make([]cipher.Address, len(auo)) + i := 0 + for k := range auo { + addrs[i] = k + i++ + } + return addrs +} + +// Flatten converts an AddressUxOuts map to a UxArray +func (auo AddressUxOuts) Flatten() UxArray { + oxs := make(UxArray, 0, len(auo)) + for _, uxs := range auo { + for i := range uxs { + oxs = append(oxs, uxs[i]) + } + } + return oxs +} + +// Sub returns a new set of unspents, with unspents found in other removed. +// No address's unspent set will be empty +// Depreciate this: only visor uses it +func (auo AddressUxOuts) Sub(other AddressUxOuts) AddressUxOuts { + ox := make(AddressUxOuts, len(auo)) + for a, uxs := range auo { + if suxs, ok := other[a]; ok { + ouxs := uxs.Sub(suxs) + if len(ouxs) > 0 { + ox[a] = ouxs + } + } else { + ox[a] = uxs + } + } + return ox +} + +// Add returns a new unspents, with merged unspents +func (auo AddressUxOuts) Add(other AddressUxOuts) AddressUxOuts { + ox := make(AddressUxOuts, len(auo)) + for a, o := range auo { + ox[a] = o + } + + for a, uxs := range other { + if suxs, ok := ox[a]; ok { + ox[a] = suxs.Add(uxs) + } else { + ox[a] = uxs + } + } + return ox +} + +// Sub returns a new UxArray with elements in other removed from self +// Deprecate +func (ua UxArray) Sub(other UxArray) UxArray { + uxa := make(UxArray, 0) + m := other.Set() + for i := range ua { + if _, ok := m[ua[i].Hash()]; !ok { + uxa = append(uxa, ua[i]) + } + } + return uxa +} + +// Add returns a new UxArray with merged elements +func (ua UxArray) Add(other UxArray) UxArray { + m := ua.Set() + for i := range other { + if _, ok := m[other[i].Hash()]; !ok { + ua = append(ua, other[i]) + } + } + return ua +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs_test.go new file mode 100644 index 00000000..b1485c5e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs_test.go @@ -0,0 +1,577 @@ +package coin + +import ( + "bytes" + "errors" + "math" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func makeUxBody(t *testing.T) UxBody { + body, _ := makeUxBodyWithSecret(t) + return body +} + +func makeUxOut(t *testing.T) UxOut { + ux, _ := makeUxOutWithSecret(t) + return ux +} + +func makeUxBodyWithSecret(t *testing.T) (UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeUxOutWithSecret(t *testing.T) (UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return UxOut{ + Head: UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} + +func TestUxBodyHash(t *testing.T) { + uxb := makeUxBody(t) + h := uxb.Hash() + assert.NotEqual(t, h, cipher.SHA256{}) +} + +func TestUxOutHash(t *testing.T) { + uxb := makeUxBody(t) + uxo := UxOut{Body: uxb} + assert.Equal(t, uxb.Hash(), uxo.Hash()) + // Head should not affect hash + uxo.Head = UxHead{0, 1} + assert.Equal(t, uxb.Hash(), uxo.Hash()) +} + +func TestUxOutSnapshotHash(t *testing.T) { + ux := makeUxOut(t) + h := ux.SnapshotHash() + // snapshot hash should be dependent on every field in body and head + ux2 := ux + ux2.Head.Time = 20 + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Head.BkSeq = 4 + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.SrcTransaction = testutil.RandSHA256(t) + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.Address = makeAddress() + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.Coins = ux.Body.Coins * 2 + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.Hours = ux.Body.Hours * 2 + assert.NotEqual(t, ux2.SnapshotHash(), h) +} + +func TestUxOutCoinHours(t *testing.T) { + uxo := makeUxOut(t) + + // Less than 1 hour passed + now := uint64(100) + uxo.Head.Time + hours, err := uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours) + + // 1 hours passed + now = uint64(3600) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours+(uxo.Body.Coins/1e6)) + + // 6 hours passed + now = uint64(3600*6) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours+(uxo.Body.Coins/1e6)*6) + + // Time is backwards (treated as no hours passed) + now = uxo.Head.Time / 2 + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours) + + // 1 hour has passed, output has 1.5 coins, should gain 1 coinhour + uxo.Body.Coins = 1e6 + 5e5 + now = uint64(3600) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // 2 hours have passed, output has 1.5 coins, should gain 3 coin hours + uxo.Body.Coins = 1e6 + 5e5 + now = uint64(3600*2) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+3, hours, "%d != %d", uxo.Body.Hours+3, hours) + + // 1 second has passed, output has 3600 coins, should gain 1 coin hour + uxo.Body.Coins = 3600e6 + now = uint64(1) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // 1000000 hours minus 1 second have passed, output has 1 droplet, should gain 0 coin hour + uxo.Body.Coins = 1 + now = uint64(1000000*3600-1) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours, hours) + + // 1000000 hours have passed, output has 1 droplet, should gain 1 coin hour + uxo.Body.Coins = 1 + now = uint64(1000000*3600) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // 1000000 hours plus 1 second have passed, output has 1 droplet, should gain 1 coin hour + uxo.Body.Coins = 1 + now = uint64(1000000*3600+1) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // No hours passed, using initial coin hours + uxo.Body.Coins = _genCoins + uxo.Body.Hours = _genCoinHours + hours, err = uxo.CoinHours(uxo.Head.Time) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours) + + // One hour passed, using initial coin hours + hours, err = uxo.CoinHours(uxo.Head.Time + 3600) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours+(_genCoins/1e6)) + + // No hours passed and no hours to begin with + uxo.Body.Hours = 0 + hours, err = uxo.CoinHours(uxo.Head.Time) + require.NoError(t, err) + require.Equal(t, hours, uint64(0)) + + // Centuries have passed, time-based calculation overflows uint64 + // when calculating the whole coin seconds + uxo.Body.Coins = 2e6 + _, err = uxo.CoinHours(math.MaxUint64) + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=18446744073709551515 coins=2 uxid=")) + + // Centuries have passed, time-based calculation overflows uint64 + // when calculating the droplet seconds + uxo.Body.Coins = 1e6 + 1e5 + _, err = uxo.CoinHours(math.MaxUint64) + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "UxOut.CoinHours: Calculating droplet seconds overflows uint64 seconds=18446744073709551515 droplets=100000 uxid=")) + + // Output would overflow if given more hours, has reached its limit + uxo.Body.Coins = 3600e6 + uxo.Body.Hours = math.MaxUint64 - 1 + _, err = uxo.CoinHours(uxo.Head.Time + 1000) + testutil.RequireError(t, err, ErrAddEarnedCoinHoursAdditionOverflow.Error()) +} + +func makeUxArray(t *testing.T, n int) UxArray { + uxa := make(UxArray, n) + for i := 0; i < len(uxa); i++ { + uxa[i] = makeUxOut(t) + } + return uxa +} + +func TestUxArrayCoins(t *testing.T) { + uxa := makeUxArray(t, 4) + + n, err := uxa.Coins() + require.NoError(t, err) + require.Equal(t, uint64(4e6), n) + + uxa[2].Body.Coins = math.MaxUint64 - 1e6 + _, err = uxa.Coins() + require.Equal(t, err, errors.New("UxArray.Coins addition overflow")) +} + +func TestUxArrayCoinHours(t *testing.T) { + uxa := makeUxArray(t, 4) + + n, err := uxa.CoinHours(uxa[0].Head.Time) + require.NoError(t, err) + require.Equal(t, uint64(400), n) + + // 1 hour later + n, err = uxa.CoinHours(uxa[0].Head.Time + 3600) + require.NoError(t, err) + require.Equal(t, uint64(404), n) + + // 1.5 hours later + n, err = uxa.CoinHours(uxa[0].Head.Time + 3600 + 1800) + require.NoError(t, err) + require.Equal(t, uint64(404), n) + + // 2 hours later + n, err = uxa.CoinHours(uxa[0].Head.Time + 3600 + 4600) + require.NoError(t, err) + require.Equal(t, uint64(408), n) + + uxa[2].Body.Hours = math.MaxUint64 - 100 + _, err = uxa.CoinHours(uxa[0].Head.Time) + require.Equal(t, errors.New("UxArray.CoinHours addition overflow"), err) + + _, err = uxa.CoinHours(uxa[0].Head.Time * 1000000000000) + require.Equal(t, ErrAddEarnedCoinHoursAdditionOverflow, err) +} + +func TestUxArrayHashArray(t *testing.T) { + uxa := makeUxArray(t, 4) + hashes := uxa.Hashes() + assert.Equal(t, len(hashes), len(uxa)) + for i, h := range hashes { + assert.Equal(t, h, uxa[i].Hash()) + } +} + +func TestUxArrayHasDupes(t *testing.T) { + uxa := makeUxArray(t, 4) + assert.False(t, uxa.HasDupes()) + uxa[0] = uxa[1] + assert.True(t, uxa.HasDupes()) +} + +func TestUxArrayRemoveDupes(t *testing.T) { + uxa := makeUxArray(t, 4) + assert.False(t, uxa.HasDupes()) + assert.Equal(t, uxa, uxa.removeDupes()) + uxa[0] = uxa[1] + assert.True(t, uxa.HasDupes()) + uxb := uxa.removeDupes() + assert.False(t, uxb.HasDupes()) + assert.Equal(t, len(uxb), 3) + assert.Equal(t, uxb[0], uxa[0]) + assert.Equal(t, uxb[1], uxa[2]) + assert.Equal(t, uxb[2], uxa[3]) +} + +func TestUxArraySub(t *testing.T) { + uxa := makeUxArray(t, 4) + uxb := makeUxArray(t, 4) + uxc := append(uxa[:1], uxb...) + uxc = append(uxc, uxa[1:2]...) + + uxd := uxc.Sub(uxa) + assert.Equal(t, uxd, uxb) + + uxd = uxc.Sub(uxb) + assert.Equal(t, len(uxd), 2) + assert.Equal(t, uxd, uxa[:2]) + + // No intersection + uxd = uxa.Sub(uxb) + assert.Equal(t, uxa, uxd) + uxd = uxb.Sub(uxa) + assert.Equal(t, uxd, uxb) +} + +func manualUxArrayIsSorted(uxa UxArray) bool { + isSorted := true + for i := 0; i < len(uxa)-1; i++ { + hi := uxa[i].Hash() + hj := uxa[i+1].Hash() + if bytes.Compare(hi[:], hj[:]) > 0 { + isSorted = false + } + } + return isSorted +} + +func TestUxArraySorting(t *testing.T) { + uxa := make(UxArray, 4) + for i := 0; i < len(uxa); i++ { + uxa[i] = makeUxOut(t) + } + isSorted := manualUxArrayIsSorted(uxa) + assert.Equal(t, sort.IsSorted(uxa), isSorted) + // Make sure uxa is not sorted + if isSorted { + uxa[0], uxa[1] = uxa[1], uxa[0] + } + assert.False(t, manualUxArrayIsSorted(uxa)) + assert.False(t, sort.IsSorted(uxa)) + uxb := make(UxArray, 4) + for i, ux := range uxa { + uxb[i] = ux + } + sort.Sort(uxa) + assert.True(t, sort.IsSorted(uxa)) + assert.True(t, manualUxArrayIsSorted(uxa)) + assert.False(t, sort.IsSorted(uxb)) + uxb.Sort() + assert.Equal(t, uxa, uxb) + assert.True(t, sort.IsSorted(uxb)) + assert.True(t, manualUxArrayIsSorted(uxb)) +} + +func TestUxArrayLen(t *testing.T) { + uxa := make(UxArray, 4) + assert.Equal(t, len(uxa), uxa.Len()) + assert.Equal(t, 4, uxa.Len()) +} + +func TestUxArrayLess(t *testing.T) { + uxa := make(UxArray, 2) + uxa[0] = makeUxOut(t) + uxa[1] = makeUxOut(t) + h := make([]cipher.SHA256, 2) + h[0] = uxa[0].Hash() + h[1] = uxa[1].Hash() + assert.Equal(t, uxa.Less(0, 1), bytes.Compare(h[0][:], h[1][:]) < 0) + assert.Equal(t, uxa.Less(1, 0), bytes.Compare(h[0][:], h[1][:]) > 0) +} + +func TestUxArraySwap(t *testing.T) { + uxa := make(UxArray, 2) + uxx := makeUxOut(t) + uxy := makeUxOut(t) + uxa[0] = uxx + uxa[1] = uxy + uxa.Swap(0, 1) + assert.Equal(t, uxa[0], uxy) + assert.Equal(t, uxa[1], uxx) + uxa.Swap(0, 1) + assert.Equal(t, uxa[0], uxx) + assert.Equal(t, uxa[1], uxy) + uxa.Swap(1, 0) + assert.Equal(t, uxa[1], uxx) + assert.Equal(t, uxa[0], uxy) +} + +func TestAddressUxOutsKeys(t *testing.T) { + unspents := make(AddressUxOuts) + ux := makeUxOut(t) + ux2 := makeUxOut(t) + ux3 := makeUxOut(t) + unspents[ux.Body.Address] = UxArray{ux} + unspents[ux2.Body.Address] = UxArray{ux2} + unspents[ux3.Body.Address] = UxArray{ux3} + keys := unspents.Keys() + assert.Equal(t, len(keys), 3) + dupes := make(map[cipher.Address]byte, 3) + for _, k := range keys { + dupes[k] = byte(1) + assert.True(t, k == ux.Body.Address || k == ux2.Body.Address || k == ux3.Body.Address) + } + assert.Equal(t, len(keys), len(dupes)) +} + +func TestAddressUxOutsMerge(t *testing.T) { + unspents := make(AddressUxOuts) + unspents2 := make(AddressUxOuts) + ux := makeUxOut(t) + ux2 := makeUxOut(t) + ux3 := makeUxOut(t) + ux4 := makeUxOut(t) + ux3.Body.Address = ux.Body.Address + + unspents[ux.Body.Address] = UxArray{ux} + unspents[ux2.Body.Address] = UxArray{ux2} + unspents2[ux3.Body.Address] = UxArray{ux3} + unspents2[ux4.Body.Address] = UxArray{ux4} + + // Valid merge + keys := []cipher.Address{ux.Body.Address, ux2.Body.Address, ux4.Body.Address} + merged := unspents.Merge(unspents2, keys) + assert.Equal(t, len(unspents), 2) + assert.Equal(t, len(unspents2), 2) + assert.Equal(t, len(merged), 3) + assert.Equal(t, merged[ux.Body.Address], UxArray{ux, ux3}) + assert.Equal(t, merged[ux2.Body.Address], UxArray{ux2}) + assert.Equal(t, merged[ux4.Body.Address], UxArray{ux4}) + + // Duplicates should not be merged + unspents[ux4.Body.Address] = UxArray{ux4} + unspents[ux.Body.Address] = UxArray{ux, ux3} + merged = unspents.Merge(unspents2, keys) + assert.Equal(t, len(merged), 3) + assert.Equal(t, merged[ux.Body.Address], UxArray{ux, ux3}) + assert.Equal(t, merged[ux2.Body.Address], UxArray{ux2}) + assert.Equal(t, merged[ux4.Body.Address], UxArray{ux4}) + + // Missing keys should not be merged + merged = unspents.Merge(unspents2, []cipher.Address{}) + assert.Equal(t, len(merged), 0) + merged = unspents.Merge(unspents2, []cipher.Address{ux4.Body.Address}) + assert.Equal(t, len(merged), 1) + assert.Equal(t, merged[ux4.Body.Address], UxArray{ux4}) +} + +func TestAddressUxOutsSub(t *testing.T) { + up := make(AddressUxOuts) + up2 := make(AddressUxOuts) + uxs := makeUxArray(t, 4) + + uxs[1].Body.Address = uxs[0].Body.Address + up[uxs[0].Body.Address] = UxArray{uxs[0], uxs[1]} + up[uxs[2].Body.Address] = UxArray{uxs[2]} + up[uxs[3].Body.Address] = UxArray{uxs[3]} + + up2[uxs[0].Body.Address] = UxArray{uxs[0]} + up2[uxs[2].Body.Address] = UxArray{uxs[2]} + + up3 := up.Sub(up2) + // One address should have been removed, because no elements + assert.Equal(t, len(up3), 2) + _, ok := up3[uxs[2].Body.Address] + assert.False(t, ok) + // Ux3 should be untouched + ux3 := up3[uxs[3].Body.Address] + assert.Equal(t, ux3, UxArray{uxs[3]}) + // Ux0,Ux1 should be missing Ux0 + ux1 := up3[uxs[0].Body.Address] + assert.Equal(t, ux1, UxArray{uxs[1]}) + + // Originals should be unmodified + assert.Equal(t, len(up), 3) + assert.Equal(t, len(up[uxs[0].Body.Address]), 2) + assert.Equal(t, len(up[uxs[2].Body.Address]), 1) + assert.Equal(t, len(up[uxs[3].Body.Address]), 1) + assert.Equal(t, len(up2), 2) + assert.Equal(t, len(up2[uxs[0].Body.Address]), 1) + assert.Equal(t, len(up2[uxs[2].Body.Address]), 1) +} + +func TestAddressUxOutsAdd(t *testing.T) { + up := make(AddressUxOuts) + up2 := make(AddressUxOuts) + uxs := makeUxArray(t, 4) + + uxs[1].Body.Address = uxs[0].Body.Address + up[uxs[0].Body.Address] = UxArray{uxs[0]} + up[uxs[2].Body.Address] = UxArray{uxs[2]} + up[uxs[3].Body.Address] = UxArray{uxs[3]} + + up2[uxs[0].Body.Address] = UxArray{uxs[1]} + up2[uxs[2].Body.Address] = UxArray{uxs[2]} + + up3 := up.Add(up2) + require.Equal(t, 3, len(up3)) + require.Equal(t, len(up3[uxs[0].Body.Address]), 2) + require.Equal(t, up3[uxs[0].Body.Address], UxArray{uxs[0], uxs[1]}) + require.Equal(t, up3[uxs[2].Body.Address], UxArray{uxs[2]}) + require.Equal(t, up3[uxs[3].Body.Address], UxArray{uxs[3]}) + require.Equal(t, up3[uxs[1].Body.Address], UxArray{uxs[0], uxs[1]}) + + // Originals should be unmodified + assert.Equal(t, len(up), 3) + assert.Equal(t, len(up[uxs[0].Body.Address]), 1) + assert.Equal(t, len(up[uxs[2].Body.Address]), 1) + assert.Equal(t, len(up[uxs[3].Body.Address]), 1) + assert.Equal(t, len(up2), 2) + assert.Equal(t, len(up2[uxs[0].Body.Address]), 1) + assert.Equal(t, len(up2[uxs[2].Body.Address]), 1) +} + +func TestAddressUxOutsFlatten(t *testing.T) { + up := make(AddressUxOuts) + uxs := makeUxArray(t, 3) + uxs[2].Body.Address = uxs[1].Body.Address + emptyAddr := makeAddress() + + // An empty array + up[emptyAddr] = UxArray{} + // 1 element array + up[uxs[0].Body.Address] = UxArray{uxs[0]} + // 2 element array + up[uxs[1].Body.Address] = UxArray{uxs[1], uxs[2]} + + flat := up.Flatten() + assert.Equal(t, len(flat), 3) + // emptyAddr should not be in the array + for _, ux := range flat { + assert.NotEqual(t, ux.Body.Address, emptyAddr) + } + if flat[0].Body.Address == uxs[0].Body.Address { + assert.Equal(t, flat[0], uxs[0]) + assert.Equal(t, flat[0].Body.Address, uxs[0].Body.Address) + assert.Equal(t, flat[0+1], uxs[1]) + assert.Equal(t, flat[1+1], uxs[2]) + assert.Equal(t, flat[0+1].Body.Address, uxs[1].Body.Address) + assert.Equal(t, flat[1+1].Body.Address, uxs[2].Body.Address) + } else { + assert.Equal(t, flat[0], uxs[1]) + assert.Equal(t, flat[1], uxs[2]) + assert.Equal(t, flat[0].Body.Address, uxs[1].Body.Address) + assert.Equal(t, flat[1].Body.Address, uxs[2].Body.Address) + assert.Equal(t, flat[2], uxs[0]) + assert.Equal(t, flat[2].Body.Address, uxs[0].Body.Address) + } +} + +func TestNewAddressUxOuts(t *testing.T) { + uxs := makeUxArray(t, 6) + uxs[1].Body.Address = uxs[0].Body.Address + uxs[3].Body.Address = uxs[2].Body.Address + uxs[4].Body.Address = uxs[2].Body.Address + uxo := NewAddressUxOuts(uxs) + assert.Equal(t, len(uxo), 3) + assert.Equal(t, uxo[uxs[0].Body.Address], UxArray{ + uxs[0], uxs[1], + }) + assert.Equal(t, uxo[uxs[3].Body.Address], UxArray{ + uxs[2], uxs[3], uxs[4], + }) + assert.Equal(t, uxo[uxs[5].Body.Address], UxArray{ + uxs[5], + }) +} + +/* + Utility Functions +*/ + +// Returns a copy of self with duplicates removed +// Is this needed? +func (ua UxArray) removeDupes() UxArray { + m := make(UxHashSet, len(ua)) + deduped := make(UxArray, 0, len(ua)) + for i := range ua { + h := ua[i].Hash() + if _, ok := m[h]; !ok { + deduped = append(deduped, ua[i]) + m[h] = struct{}{} + } + } + return deduped +} + +// Combines two AddressUxOuts where they overlap with keys +// Remove? +func (auo AddressUxOuts) Merge(other AddressUxOuts, + keys []cipher.Address) AddressUxOuts { + final := make(AddressUxOuts, len(keys)) + for _, a := range keys { + row := append(auo[a], other[a]...) + final[a] = row.removeDupes() + } + return final +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder.go new file mode 100644 index 00000000..af07767d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder.go @@ -0,0 +1,135 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeTransactionInputs computes the size of an encoded object of type transactionInputs +func encodeSizeTransactionInputs(obj *transactionInputs) uint64 { + i0 := uint64(0) + + // obj.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.In)) * i1 + } + + return i0 +} + +// encodeTransactionInputs encodes an object of type transactionInputs to a buffer allocated to the exact size +// required to encode the object. +func encodeTransactionInputs(obj *transactionInputs) ([]byte, error) { + n := encodeSizeTransactionInputs(obj) + buf := make([]byte, n) + + if err := encodeTransactionInputsToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionInputsToBuffer encodes an object of type transactionInputs to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionInputsToBuffer(buf []byte, obj *transactionInputs) error { + if uint64(len(buf)) < encodeSizeTransactionInputs(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.In maxlen check + if len(obj.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.In length check + if uint64(len(obj.In)) > math.MaxUint32 { + return errors.New("obj.In length exceeds math.MaxUint32") + } + + // obj.In length + e.Uint32(uint32(len(obj.In))) + + // obj.In + for _, x := range obj.In { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeTransactionInputs decodes an object of type transactionInputs from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransactionInputs(buf []byte, obj *transactionInputs) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.In = make([]cipher.SHA256, length) + + for z1 := range obj.In { + { + // obj.In[z1] + if len(d.Buffer) < len(obj.In[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.In[z1][:], d.Buffer[:len(obj.In[z1])]) + d.Buffer = d.Buffer[len(obj.In[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionInputsExact decodes an object of type transactionInputs from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionInputsExact(buf []byte, obj *transactionInputs) error { + if n, err := decodeTransactionInputs(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder_test.go new file mode 100644 index 00000000..0614758c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyTransactionInputsForEncodeTest() *transactionInputs { + var obj transactionInputs + return &obj +} + +func newRandomTransactionInputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionInputs { + var obj transactionInputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionInputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionInputs { + var obj transactionInputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionInputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionInputs { + var obj transactionInputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransactionInputs(t *testing.T, obj *transactionInputs) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransactionInputs(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransactionInputs() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransactionInputs(obj) + if err != nil { + t.Fatalf("encodeTransactionInputs failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransactionInputs produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransactionInputs()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionInputsToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionInputsToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 transactionInputs + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 transactionInputs + if n, err := decodeTransactionInputs(data2, &obj3); err != nil { + t.Fatalf("decodeTransactionInputs failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransactionInputs bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionInputs()") + } + + // Decode, excess buffer + var obj4 transactionInputs + n, err := decodeTransactionInputs(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransactionInputs failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransactionInputs bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransactionInputs bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionInputs()") + } + + // DecodeExact + var obj5 transactionInputs + if err := decodeTransactionInputsExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransactionInputs failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionInputs()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransactionInputs(data4, &obj3); err != nil { + t.Fatalf("decodeTransactionInputs failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransactionInputs bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransactionInputs(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *transactionInputs + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionInputsForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionInputsForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionInputsForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionInputsForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransactionInputs(t, tc.obj) + }) + } +} + +func decodeTransactionInputsExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj transactionInputs + if _, err := decodeTransactionInputs(buf, &obj); err == nil { + t.Fatal("decodeTransactionInputs: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionInputs: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionInputsExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj transactionInputs + if err := decodeTransactionInputsExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionInputsExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionInputsExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionInputsDecodeErrors(t *testing.T, k int, tag string, obj *transactionInputs) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransactionInputs(obj) + buf, err := encodeTransactionInputs(obj) + if err != nil { + t.Fatalf("encodeTransactionInputs failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionInputsExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionInputsExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionInputsExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionInputsExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionInputsExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionInputsDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionInputsForEncodeTest() + fullObj := newRandomTransactionInputsForEncodeTest(t, rand) + testSkyencoderTransactionInputsDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionInputsDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder.go new file mode 100644 index 00000000..21697577 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder.go @@ -0,0 +1,179 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeTransactionOutputs computes the size of an encoded object of type transactionOutputs +func encodeSizeTransactionOutputs(obj *transactionOutputs) uint64 { + i0 := uint64(0) + + // obj.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Out)) * i1 + } + + return i0 +} + +// encodeTransactionOutputs encodes an object of type transactionOutputs to a buffer allocated to the exact size +// required to encode the object. +func encodeTransactionOutputs(obj *transactionOutputs) ([]byte, error) { + n := encodeSizeTransactionOutputs(obj) + buf := make([]byte, n) + + if err := encodeTransactionOutputsToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionOutputsToBuffer encodes an object of type transactionOutputs to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionOutputsToBuffer(buf []byte, obj *transactionOutputs) error { + if uint64(len(buf)) < encodeSizeTransactionOutputs(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Out maxlen check + if len(obj.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Out length check + if uint64(len(obj.Out)) > math.MaxUint32 { + return errors.New("obj.Out length exceeds math.MaxUint32") + } + + // obj.Out length + e.Uint32(uint32(len(obj.Out))) + + // obj.Out + for _, x := range obj.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + return nil +} + +// decodeTransactionOutputs decodes an object of type transactionOutputs from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransactionOutputs(buf []byte, obj *transactionOutputs) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Out = make([]TransactionOutput, length) + + for z1 := range obj.Out { + { + // obj.Out[z1].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out[z1].Address.Version = i + } + + { + // obj.Out[z1].Address.Key + if len(d.Buffer) < len(obj.Out[z1].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out[z1].Address.Key[:], d.Buffer[:len(obj.Out[z1].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out[z1].Address.Key):] + } + + { + // obj.Out[z1].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Coins = i + } + + { + // obj.Out[z1].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionOutputsExact decodes an object of type transactionOutputs from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionOutputsExact(buf []byte, obj *transactionOutputs) error { + if n, err := decodeTransactionOutputs(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder_test.go new file mode 100644 index 00000000..02d90d45 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyTransactionOutputsForEncodeTest() *transactionOutputs { + var obj transactionOutputs + return &obj +} + +func newRandomTransactionOutputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionOutputs { + var obj transactionOutputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionOutputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionOutputs { + var obj transactionOutputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionOutputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionOutputs { + var obj transactionOutputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransactionOutputs(t *testing.T, obj *transactionOutputs) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransactionOutputs(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransactionOutputs() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransactionOutputs(obj) + if err != nil { + t.Fatalf("encodeTransactionOutputs failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransactionOutputs produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransactionOutputs()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionOutputsToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionOutputsToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 transactionOutputs + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 transactionOutputs + if n, err := decodeTransactionOutputs(data2, &obj3); err != nil { + t.Fatalf("decodeTransactionOutputs failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransactionOutputs bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionOutputs()") + } + + // Decode, excess buffer + var obj4 transactionOutputs + n, err := decodeTransactionOutputs(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransactionOutputs failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransactionOutputs bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransactionOutputs bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionOutputs()") + } + + // DecodeExact + var obj5 transactionOutputs + if err := decodeTransactionOutputsExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransactionOutputs failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionOutputs()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransactionOutputs(data4, &obj3); err != nil { + t.Fatalf("decodeTransactionOutputs failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransactionOutputs bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransactionOutputs(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *transactionOutputs + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionOutputsForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionOutputsForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionOutputsForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionOutputsForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransactionOutputs(t, tc.obj) + }) + } +} + +func decodeTransactionOutputsExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj transactionOutputs + if _, err := decodeTransactionOutputs(buf, &obj); err == nil { + t.Fatal("decodeTransactionOutputs: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionOutputs: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionOutputsExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj transactionOutputs + if err := decodeTransactionOutputsExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionOutputsExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionOutputsExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionOutputsDecodeErrors(t *testing.T, k int, tag string, obj *transactionOutputs) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransactionOutputs(obj) + buf, err := encodeTransactionOutputs(obj) + if err != nil { + t.Fatalf("encodeTransactionOutputs failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionOutputsExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionOutputsExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionOutputsExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionOutputsExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionOutputsExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionOutputsDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionOutputsForEncodeTest() + fullObj := newRandomTransactionOutputsForEncodeTest(t, rand) + testSkyencoderTransactionOutputsDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionOutputsDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder.go new file mode 100644 index 00000000..538f1c97 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder.go @@ -0,0 +1,357 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeTransaction computes the size of an encoded object of type Transaction +func encodeSizeTransaction(obj *Transaction) uint64 { + i0 := uint64(0) + + // obj.Length + i0 += 4 + + // obj.Type + i0++ + + // obj.InnerHash + i0 += 32 + + // obj.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Sigs)) * i1 + } + + // obj.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.In)) * i1 + } + + // obj.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Out)) * i1 + } + + return i0 +} + +// encodeTransaction encodes an object of type Transaction to a buffer allocated to the exact size +// required to encode the object. +func encodeTransaction(obj *Transaction) ([]byte, error) { + n := encodeSizeTransaction(obj) + buf := make([]byte, n) + + if err := encodeTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionToBuffer encodes an object of type Transaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionToBuffer(buf []byte, obj *Transaction) error { + if uint64(len(buf)) < encodeSizeTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Length + e.Uint32(obj.Length) + + // obj.Type + e.Uint8(obj.Type) + + // obj.InnerHash + e.CopyBytes(obj.InnerHash[:]) + + // obj.Sigs maxlen check + if len(obj.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Sigs length check + if uint64(len(obj.Sigs)) > math.MaxUint32 { + return errors.New("obj.Sigs length exceeds math.MaxUint32") + } + + // obj.Sigs length + e.Uint32(uint32(len(obj.Sigs))) + + // obj.Sigs + for _, x := range obj.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.In maxlen check + if len(obj.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.In length check + if uint64(len(obj.In)) > math.MaxUint32 { + return errors.New("obj.In length exceeds math.MaxUint32") + } + + // obj.In length + e.Uint32(uint32(len(obj.In))) + + // obj.In + for _, x := range obj.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Out maxlen check + if len(obj.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Out length check + if uint64(len(obj.Out)) > math.MaxUint32 { + return errors.New("obj.Out length exceeds math.MaxUint32") + } + + // obj.Out length + e.Uint32(uint32(len(obj.Out))) + + // obj.Out + for _, x := range obj.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + return nil +} + +// decodeTransaction decodes an object of type Transaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransaction(buf []byte, obj *Transaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Length = i + } + + { + // obj.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Type = i + } + + { + // obj.InnerHash + if len(d.Buffer) < len(obj.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.InnerHash[:], d.Buffer[:len(obj.InnerHash)]) + d.Buffer = d.Buffer[len(obj.InnerHash):] + } + + { + // obj.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Sigs = make([]cipher.Sig, length) + + for z1 := range obj.Sigs { + { + // obj.Sigs[z1] + if len(d.Buffer) < len(obj.Sigs[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sigs[z1][:], d.Buffer[:len(obj.Sigs[z1])]) + d.Buffer = d.Buffer[len(obj.Sigs[z1]):] + } + + } + } + } + + { + // obj.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.In = make([]cipher.SHA256, length) + + for z1 := range obj.In { + { + // obj.In[z1] + if len(d.Buffer) < len(obj.In[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.In[z1][:], d.Buffer[:len(obj.In[z1])]) + d.Buffer = d.Buffer[len(obj.In[z1]):] + } + + } + } + } + + { + // obj.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Out = make([]TransactionOutput, length) + + for z1 := range obj.Out { + { + // obj.Out[z1].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out[z1].Address.Version = i + } + + { + // obj.Out[z1].Address.Key + if len(d.Buffer) < len(obj.Out[z1].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out[z1].Address.Key[:], d.Buffer[:len(obj.Out[z1].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out[z1].Address.Key):] + } + + { + // obj.Out[z1].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Coins = i + } + + { + // obj.Out[z1].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionExact decodes an object of type Transaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionExact(buf []byte, obj *Transaction) error { + if n, err := decodeTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder_test.go new file mode 100644 index 00000000..1048aa4d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyTransactionForEncodeTest() *Transaction { + var obj Transaction + return &obj +} + +func newRandomTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransaction(t *testing.T, obj *Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransaction(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransaction() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransaction produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransaction()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 Transaction + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 Transaction + if n, err := decodeTransaction(data2, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Decode, excess buffer + var obj4 Transaction + n, err := decodeTransaction(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // DecodeExact + var obj5 Transaction + if err := decodeTransactionExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransaction(data4, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransaction(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *Transaction + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransaction(t, tc.obj) + }) + } +} + +func decodeTransactionExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj Transaction + if _, err := decodeTransaction(buf, &obj); err == nil { + t.Fatal("decodeTransaction: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransaction: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj Transaction + if err := decodeTransactionExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionDecodeErrors(t *testing.T, k int, tag string, obj *Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransaction(obj) + buf, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionForEncodeTest() + fullObj := newRandomTransactionForEncodeTest(t, rand) + testSkyencoderTransactionDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions.go new file mode 100644 index 00000000..5d340aca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions.go @@ -0,0 +1,788 @@ +package coin + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "log" + "math" + "sort" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +var ( + // DebugLevel1 checks for extremely unlikely conditions (10e-40) + DebugLevel1 = true + // DebugLevel2 enable checks for impossible conditions + DebugLevel2 = true +) + +//go:generate skyencoder -struct Transaction -unexported +//go:generate skyencoder -struct transactionInputs +//go:generate skyencoder -struct transactionOutputs + +type transactionInputs struct { + In []cipher.SHA256 `enc:",maxlen=65535"` +} + +type transactionOutputs struct { + Out []TransactionOutput `enc:",maxlen=65535"` +} + +/* +Transaction with N inputs, M ouputs is +- 32 bytes constant +- 32+65 bytes per input +- 21+8+8 bytes per output + +Skycoin Transactions are +- 97 bytes per input + 37 bytes per output + 37 bytes +Bitcoin Transactions are +- 180 bytes per input + 34 bytes per output + 10 bytes + +Sigs is the array of signatures +- the Nth signature is the authorization to spend the Nth output consumed in transaction +- the hash signed is SHA256sum of transaction inner hash and the hash of output being spent + +The inner hash is SHA256 hash of the serialization of Input and Output array +The outer hash is the hash of the whole transaction serialization +*/ + +// Transaction transaction struct +type Transaction struct { + Length uint32 // length prefix + Type uint8 // transaction type + InnerHash cipher.SHA256 // inner hash SHA256 of In[],Out[] + + Sigs []cipher.Sig `enc:",maxlen=65535"` // list of signatures, 64+1 bytes each + In []cipher.SHA256 `enc:",maxlen=65535"` // ouputs being spent + Out []TransactionOutput `enc:",maxlen=65535"` // ouputs being created +} + +// TransactionOutput hash output/name is function of Hash +type TransactionOutput struct { + Address cipher.Address // address to send to + Coins uint64 // amount to be sent in coins + Hours uint64 // amount to be sent in coin hours +} + +// Verify attempts to determine if the transaction is well formed. +// Verify cannot check transaction signatures, it needs the address from unspents +// Verify cannot check if outputs being spent exist +// Verify cannot check if the transaction would create or destroy coins +// or if the inputs have the required coin base +func (txn *Transaction) Verify() error { + return txn.verify(true) +} + +// VerifyUnsigned attempts to determine if the transaction is well formed, +// but requires the transaction to have at least one null signature. +// Verify cannot check transaction signatures, it needs the address from unspents +// Verify cannot check if outputs being spent exist +// Verify cannot check if the transaction would create or destroy coins +// or if the inputs have the required coin base +func (txn *Transaction) VerifyUnsigned() error { + return txn.verify(false) +} + +func (txn *Transaction) verify(signed bool) error { + if len(txn.In) == 0 { + return errors.New("No inputs") + } + if len(txn.Out) == 0 { + return errors.New("No outputs") + } + + // Check signature index fields + if len(txn.Sigs) != len(txn.In) { + return errors.New("Invalid number of signatures") + } + if len(txn.Sigs) > math.MaxUint16 { + return errors.New("Too many signatures and inputs") + } + + if len(txn.Out) > math.MaxUint16 { + return errors.New("Too many ouptuts") + } + + // Check duplicate inputs + uxOuts := make(map[cipher.SHA256]struct{}, len(txn.In)) + for i := range txn.In { + uxOuts[txn.In[i]] = struct{}{} + } + if len(uxOuts) != len(txn.In) { + return errors.New("Duplicate spend") + } + + if txn.Type != 0 { + return errors.New("transaction type invalid") + } + + // Prevent zero coin outputs + // Artificial restriction to prevent spam + for _, txo := range txn.Out { + if txo.Coins == 0 { + return errors.New("Zero coin output") + } + } + + // Check output coin integer overflow + coins := uint64(0) + for _, to := range txn.Out { + var err error + coins, err = mathutil.AddUint64(coins, to.Coins) + if err != nil { + return errors.New("Output coins overflow") + } + } + + // Check that Size and Hash can be computed + txnSize, txnHash, err := txn.SizeHash() + if err != nil { + return err + } + + // Check txn Size set correctly + if txn.Length != txnSize { + return errors.New("Incorrect transaction length") + } + + // Check for duplicate potential outputs + outputs := make(map[cipher.SHA256]struct{}, len(txn.Out)) + uxb := UxBody{ + SrcTransaction: txnHash, + } + for _, to := range txn.Out { + uxb.Coins = to.Coins + uxb.Hours = to.Hours + uxb.Address = to.Address + outputs[uxb.Hash()] = struct{}{} + } + if len(outputs) != len(txn.Out) { + return errors.New("Duplicate output in transaction") + } + + // Check inner hash + innerHash, err := txn.hashInner() + if err != nil { + return fmt.Errorf("HashInner failed: %v", err) + } + + if innerHash != txn.InnerHash { + return errors.New("InnerHash does not match computed hash") + } + + // Validate signatures + for i, sig := range txn.Sigs { + if sig.Null() { + // Check that signed transactions do not have any null signatures + if signed { + return errors.New("Unsigned input in transaction") + } + // Ignore null signatures if the transaction is unsigned + continue + } + + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) + if err := cipher.VerifySignatureRecoverPubKey(sig, hash); err != nil { + return err + } + } + + // Check that unsigned transactions have at least one non-null signature + if !signed { + if !txn.hasNullSignature() { + return errors.New("Unsigned transaction must contain a null signature") + } + } + + return nil +} + +func (txn Transaction) verifyInputSignaturesPrelude(uxIn UxArray) error { + if len(txn.In) != len(uxIn) { + return errors.New("txn.In != uxIn") + } + if len(txn.In) != len(txn.Sigs) { + return errors.New("txn.In != txn.Sigs") + } + if txn.InnerHash != txn.HashInner() { + return errors.New("Invalid Tx Inner Hash") + } + for i := range txn.In { + if txn.In[i] != uxIn[i].Hash() { + return errors.New("Ux hash mismatch") + } + } + return nil +} + +// VerifyInputSignatures verifies the inputs and signatures +func (txn Transaction) VerifyInputSignatures(uxIn UxArray) error { + if err := txn.verifyInputSignaturesPrelude(uxIn); err != nil { + if DebugLevel2 { + log.Panic(err) + } + return err + } + + // Check signatures against unspent address + for i := range txn.In { + if txn.Sigs[i].Null() { + return errors.New("Unsigned input in transaction") + } + + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // use inner hash, not outer hash + err := cipher.VerifyAddressSignedHash(uxIn[i].Body.Address, txn.Sigs[i], hash) + if err != nil { + return errors.New("Signature not valid for output being spent") + } + } + + return nil +} + +// VerifyPartialInputSignatures verifies the inputs and signatures for signatures that are not null +func (txn Transaction) VerifyPartialInputSignatures(uxIn UxArray) error { + if err := txn.verifyInputSignaturesPrelude(uxIn); err != nil { + if DebugLevel2 { + log.Panic(err) + } + return err + } + + // Check signatures against unspent address for signatures that are not null + for i := range txn.In { + if txn.Sigs[i].Null() { + continue + } + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // use inner hash, not outer hash + err := cipher.VerifyAddressSignedHash(uxIn[i].Body.Address, txn.Sigs[i], hash) + if err != nil { + return errors.New("Signature not valid for output being spent") + } + } + + return nil +} + +// PushInput adds a unspent output hash to the inputs of a Transaction. +func (txn *Transaction) PushInput(uxOut cipher.SHA256) error { + if len(txn.In) >= math.MaxUint16 { + return errors.New("Max transaction inputs reached") + } + txn.In = append(txn.In, uxOut) + return nil +} + +// UxID compute transaction output id +func (txOut TransactionOutput) UxID(txID cipher.SHA256) cipher.SHA256 { + var x UxBody + x.Coins = txOut.Coins + x.Hours = txOut.Hours + x.Address = txOut.Address + x.SrcTransaction = txID + return x.Hash() +} + +// PushOutput Adds a TransactionOutput, sending coins & hours to an Address +func (txn *Transaction) PushOutput(dst cipher.Address, coins, hours uint64) error { + if len(txn.Out) >= math.MaxUint16 { + return errors.New("Max transaction outputs reached") + } + txn.Out = append(txn.Out, TransactionOutput{ + Address: dst, + Coins: coins, + Hours: hours, + }) + return nil +} + +// SignInput signs a specific input in the transaction. +// InnerHash should already be set to a valid value. +// Returns an error if the input is already signed +func (txn *Transaction) SignInput(key cipher.SecKey, index int) error { + if index < 0 || index >= len(txn.In) { + return errors.New("Signature index out of range") + } + + if len(txn.Sigs) == 0 { + txn.Sigs = make([]cipher.Sig, len(txn.In)) + } + if len(txn.In) != len(txn.Sigs) { + return errors.New("Number of signatures does not match number of inputs") + } + + if !txn.Sigs[index].Null() { + return errors.New("Input already signed") + } + + h := cipher.AddSHA256(txn.InnerHash, txn.In[index]) + txn.Sigs[index] = cipher.MustSignHash(h, key) + + return nil +} + +// SignInputs signs all inputs in the transaction +func (txn *Transaction) SignInputs(keys []cipher.SecKey) { + if len(keys) != len(txn.In) { + log.Panic("Invalid number of keys") + } + if len(keys) > math.MaxUint16 { + log.Panic("Too many keys") + } + if len(keys) == 0 { + log.Panic("No keys") + } + if len(txn.Sigs) > 0 && txn.hasNonNullSignature() { + log.Panic("Transaction has been signed") + } + + txn.InnerHash = txn.HashInner() // update hash + + sigs := make([]cipher.Sig, len(txn.In)) + for i, k := range keys { + h := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // hash to sign + sigs[i] = cipher.MustSignHash(h, k) + } + txn.Sigs = sigs +} + +// Size returns the encoded byte size of the transaction +func (txn *Transaction) Size() (uint32, error) { + buf, err := txn.Serialize() + if err != nil { + return 0, err + } + return mathutil.IntToUint32(len(buf)) +} + +// IsFullyUnsigned returns true if the transaction is not signed for any input. +// Unsigned transactions have a full signature array, but the signatures are null. +// Returns true if the signatures array is empty. +func (txn *Transaction) IsFullyUnsigned() bool { + for _, s := range txn.Sigs { + if !s.Null() { + return false + } + } + + return true +} + +// IsFullySigned returns true if the transaction is fully signed. +// Returns true if the signatures array is empty. +func (txn *Transaction) IsFullySigned() bool { + if len(txn.Sigs) == 0 { + return false + } + + for _, s := range txn.Sigs { + if s.Null() { + return false + } + } + + return true +} + +// hasNonNullSignature returns true if the transaction has at least one non-null signature +func (txn *Transaction) hasNonNullSignature() bool { + for _, s := range txn.Sigs { + if !s.Null() { + return true + } + } + + return false +} + +// hasNullSignature returns true if the transaction has at least one null signature +func (txn *Transaction) hasNullSignature() bool { + for _, s := range txn.Sigs { + if s.Null() { + return true + } + } + + return false +} + +// Hash an entire Transaction struct, including the TransactionHeader +func (txn *Transaction) Hash() cipher.SHA256 { + b, err := txn.Serialize() + if err != nil { + log.Panicf("Hash: txn.Serialize failed: %v", err) + } + return cipher.SumSHA256(b) +} + +// SizeHash returns the encoded size and the hash of it (avoids duplicate encoding) +func (txn *Transaction) SizeHash() (uint32, cipher.SHA256, error) { + b, err := txn.Serialize() + if err != nil { + return 0, cipher.SHA256{}, err + } + s, err := mathutil.IntToUint32(len(b)) + if err != nil { + return 0, cipher.SHA256{}, err + } + return s, cipher.SumSHA256(b), nil +} + +// UpdateHeader saves the txn body hash to TransactionHeader.Hash +func (txn *Transaction) UpdateHeader() error { + s, err := txn.Size() + if err != nil { + return err + } + txn.Length = s + txn.Type = byte(0x00) + txn.InnerHash = txn.HashInner() + return nil +} + +// HashInner hashes only the Transaction Inputs & Outputs +// This is what is signed +// Client hashes the inner hash with hash of output being spent and signs it with private key +func (txn *Transaction) HashInner() cipher.SHA256 { + h, err := txn.hashInner() + if err != nil { + log.Panicf("hashInner failed: %v", err) + } + return h +} + +func (txn *Transaction) hashInner() (cipher.SHA256, error) { + txnInputs := &transactionInputs{ + In: txn.In, + } + txnOutputs := &transactionOutputs{ + Out: txn.Out, + } + n1 := encodeSizeTransactionInputs(txnInputs) + n2 := encodeSizeTransactionOutputs(txnOutputs) + buf := make([]byte, n1+n2) + + if err := encodeTransactionInputsToBuffer(buf[:n1], txnInputs); err != nil { + return cipher.SHA256{}, fmt.Errorf("encodeTransactionInputsToBuffer failed: %v", err) + } + + if err := encodeTransactionOutputsToBuffer(buf[n1:], txnOutputs); err != nil { + return cipher.SHA256{}, fmt.Errorf("encodeTransactionOutputsToBuffer failed: %v", err) + } + + return cipher.SumSHA256(buf), nil +} + +// MustSerialize serializes the transaction to bytes, panics on error. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) MustSerialize() []byte { + b, err := encodeTransaction(txn) + if err != nil { + log.Panicf("encodeTransaction failed: %v", err) + } + return b +} + +// Serialize serializes the transaction to bytes. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) Serialize() ([]byte, error) { + return encodeTransaction(txn) +} + +// MustSerializeHex serializes the transaction to a hex string, panics on error. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) MustSerializeHex() string { + return hex.EncodeToString(txn.MustSerialize()) +} + +// SerializeHex serializes the transaction to a hex string. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) SerializeHex() (string, error) { + b, err := txn.Serialize() + if err != nil { + return "", err + } + return hex.EncodeToString(b), nil +} + +// MustDeserializeTransaction deserializes a transaction, panics on error +func MustDeserializeTransaction(b []byte) Transaction { + txn, err := DeserializeTransaction(b) + if err != nil { + log.Panicf("Failed to deserialize transaction: %v", err) + } + return txn +} + +// DeserializeTransaction deserializes a transaction +func DeserializeTransaction(b []byte) (Transaction, error) { + txn := Transaction{} + if err := decodeTransactionExact(b, &txn); err != nil { + return Transaction{}, fmt.Errorf("Invalid transaction: %v", err) + } + return txn, nil +} + +// MustDeserializeTransactionHex deserializes a transaction hex string, panics on error +func MustDeserializeTransactionHex(s string) Transaction { + txn, err := DeserializeTransactionHex(s) + if err != nil { + log.Panicf("Failed to deserialize transaction: %v", err) + } + return txn +} + +// DeserializeTransactionHex deserializes a transaction hex string +func DeserializeTransactionHex(s string) (Transaction, error) { + b, err := hex.DecodeString(s) + if err != nil { + return Transaction{}, err + } + return DeserializeTransaction(b) +} + +// OutputHours returns the coin hours sent as outputs. This does not include the fee. +func (txn *Transaction) OutputHours() (uint64, error) { + hours := uint64(0) + for i := range txn.Out { + var err error + hours, err = mathutil.AddUint64(hours, txn.Out[i].Hours) + if err != nil { + return 0, errors.New("Transaction output hours overflow") + } + } + return hours, nil +} + +// Transactions transaction slice +type Transactions []Transaction + +// Fees calculates all the fees in Transactions +func (txns Transactions) Fees(calc FeeCalculator) (uint64, error) { + total := uint64(0) + for i := range txns { + fee, err := calc(&txns[i]) + if err != nil { + return 0, err + } + + total, err = mathutil.AddUint64(total, fee) + if err != nil { + return 0, errors.New("Transactions fee totals overflow") + } + } + return total, nil +} + +// Hashes caculate transactions hashes +func (txns Transactions) Hashes() []cipher.SHA256 { + hashes := make([]cipher.SHA256, len(txns)) + for i := range txns { + hashes[i] = txns[i].Hash() + } + return hashes +} + +// Size returns the sum of contained Transactions' sizes. It is not the size if +// serialized, since that would have a length prefix. +func (txns Transactions) Size() (uint32, error) { + var size uint32 + for i := range txns { + s, err := txns[i].Size() + if err != nil { + return 0, err + } + + size, err = mathutil.AddUint32(size, s) + if err != nil { + return 0, err + } + } + + return size, nil +} + +// TruncateBytesTo returns the first n transactions whose total size is less than or equal to size +func (txns Transactions) TruncateBytesTo(size uint32) (Transactions, error) { + var total uint32 + for i := range txns { + pending, err := txns[i].Size() + if err != nil { + return nil, err + } + + pendingTotal, err := mathutil.AddUint32(total, pending) + if err != nil { + return txns[:i], nil + } + + if pendingTotal > size { + return txns[:i], nil + } + + total = pendingTotal + } + + return txns, nil +} + +// SortableTransactions allows sorting transactions by fee & hash +type SortableTransactions struct { + Transactions Transactions + Fees []uint64 + Hashes []cipher.SHA256 +} + +// FeeCalculator given a transaction, return its fee or an error if the fee cannot be calculated +type FeeCalculator func(*Transaction) (uint64, error) + +// SortTransactions returns transactions sorted by fee per kB, and sorted by lowest hash if tied. +// Transactions that fail in fee computation are excluded +func SortTransactions(txns Transactions, feeCalc FeeCalculator) (Transactions, error) { + sorted, err := NewSortableTransactions(txns, feeCalc) + if err != nil { + return nil, err + } + sorted.Sort() + return sorted.Transactions, nil +} + +// NewSortableTransactions returns an array of txns that can be sorted by fee. +// On creation, fees are calculated, and if any txns have invalid fee, there are removed from consideration +func NewSortableTransactions(txns Transactions, feeCalc FeeCalculator) (*SortableTransactions, error) { + newTxns := make(Transactions, len(txns)) + fees := make([]uint64, len(txns)) + hashes := make([]cipher.SHA256, len(txns)) + j := 0 + for i := range txns { + fee, err := feeCalc(&txns[i]) + if err != nil { + continue + } + + size, hash, err := txns[i].SizeHash() + if err != nil { + return nil, err + } + + // Calculate fee priority based on fee per kb + feeKB, err := mathutil.MultUint64(fee, 1024) + + // If the fee * 1024 would exceed math.MaxUint64, set it to math.MaxUint64 so that + // this transaction can still be processed + if err != nil { + feeKB = math.MaxUint64 + } + + newTxns[j] = txns[i] + hashes[j] = hash + fees[j] = feeKB / uint64(size) + j++ + } + + return &SortableTransactions{ + Transactions: newTxns[:j], + Fees: fees[:j], + Hashes: hashes[:j], + }, nil +} + +// Sort sorts by tx fee, and then by hash if fee equal +func (txns SortableTransactions) Sort() { + sort.Sort(txns) +} + +// Len returns length of transactions +func (txns SortableTransactions) Len() int { + return len(txns.Transactions) +} + +// Less default sorting is fees descending, hash ascending if fees equal +func (txns SortableTransactions) Less(i, j int) bool { + if txns.Fees[i] == txns.Fees[j] { + // If fees match, hashes are sorted ascending + return bytes.Compare(txns.Hashes[i][:], txns.Hashes[j][:]) < 0 + } + // Fees are sorted descending + return txns.Fees[i] > txns.Fees[j] +} + +// Swap swaps txns +func (txns SortableTransactions) Swap(i, j int) { + txns.Transactions[i], txns.Transactions[j] = txns.Transactions[j], txns.Transactions[i] + txns.Fees[i], txns.Fees[j] = txns.Fees[j], txns.Fees[i] + txns.Hashes[i], txns.Hashes[j] = txns.Hashes[j], txns.Hashes[i] +} + +// VerifyTransactionCoinsSpending checks that coins are not destroyed or created by the transaction +func VerifyTransactionCoinsSpending(uxIn UxArray, uxOut UxArray) error { + coinsIn := uint64(0) + for i := range uxIn { + var err error + coinsIn, err = mathutil.AddUint64(coinsIn, uxIn[i].Body.Coins) + if err != nil { + return errors.New("Transaction input coins overflow") + } + } + + coinsOut := uint64(0) + for i := range uxOut { + var err error + coinsOut, err = mathutil.AddUint64(coinsOut, uxOut[i].Body.Coins) + if err != nil { + return errors.New("Transaction output coins overflow") + } + } + + if coinsIn < coinsOut { + return errors.New("Insufficient coins") + } + if coinsIn > coinsOut { + return errors.New("Transactions may not destroy coins") + } + + return nil +} + +// VerifyTransactionHoursSpending checks that hours are not created by the transaction +func VerifyTransactionHoursSpending(headTime uint64, uxIn UxArray, uxOut UxArray) error { + hoursIn := uint64(0) + for i := range uxIn { + uxHours, err := uxIn[i].CoinHours(headTime) + if err != nil { + // If the error was specifically an overflow when adding the + // earned coin hours to the base coin hours, treat the uxHours as 0. + // Block 13277 spends an input which overflows in this way, + // so the block will not sync if an error is returned. + if err == ErrAddEarnedCoinHoursAdditionOverflow { + uxHours = 0 + } else { + return err + } + } + + hoursIn, err = mathutil.AddUint64(hoursIn, uxHours) + if err != nil { + return errors.New("Transaction input hours overflow") + } + } + + hoursOut := uint64(0) + for i := range uxOut { + // NOTE: addition of hours is not checked for overflow here because + // this would invalidate existing blocks which had overflowed hours. + // Hours overflow checks are handled as a "soft" constraint in the network + // until those blocks are repaired. + hoursOut += uxOut[i].Body.Hours + } + + if hoursIn < hoursOut { + return errors.New("Insufficient coin hours") + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions_test.go new file mode 100644 index 00000000..adee28d3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions_test.go @@ -0,0 +1,1159 @@ +package coin + +import ( + "bytes" + "encoding/hex" + "errors" + "math" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/testutil" + _require "github.com/SkycoinProject/skycoin/src/testutil/require" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +func makeTransactionFromUxOuts(t *testing.T, uxs []UxOut, secs []cipher.SecKey) Transaction { + require.Equal(t, len(uxs), len(secs)) + + txn := Transaction{} + + err := txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + + for _, ux := range uxs { + err = txn.PushInput(ux.Hash()) + require.NoError(t, err) + } + + txn.SignInputs(secs) + + err = txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +func makeTransactionFromUxOut(t *testing.T, ux UxOut, s cipher.SecKey) Transaction { + return makeTransactionFromUxOuts(t, []UxOut{ux}, []cipher.SecKey{s}) +} + +func makeTransaction(t *testing.T) Transaction { + ux, s := makeUxOutWithSecret(t) + return makeTransactionFromUxOut(t, ux, s) +} + +func makeTransactionMultipleInputs(t *testing.T, n int) (Transaction, []cipher.SecKey) { + uxs := make([]UxOut, n) + secs := make([]cipher.SecKey, n) + for i := 0; i < n; i++ { + ux, s := makeUxOutWithSecret(t) + uxs[i] = ux + secs[i] = s + } + return makeTransactionFromUxOuts(t, uxs, secs), secs +} + +func makeTransactions(t *testing.T, n int) Transactions { //nolint:unparam + txns := make(Transactions, n) + for i := range txns { + txns[i] = makeTransaction(t) + } + return txns +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func copyTransaction(txn Transaction) Transaction { + txo := Transaction{} + txo.Length = txn.Length + txo.Type = txn.Type + txo.InnerHash = txn.InnerHash + txo.Sigs = make([]cipher.Sig, len(txn.Sigs)) + copy(txo.Sigs, txn.Sigs) + txo.In = make([]cipher.SHA256, len(txn.In)) + copy(txo.In, txn.In) + txo.Out = make([]TransactionOutput, len(txn.Out)) + copy(txo.Out, txn.Out) + return txo +} + +func TestTransactionVerify(t *testing.T) { + // Mismatch header hash + txn := makeTransaction(t) + txn.InnerHash = cipher.SHA256{} + testutil.RequireError(t, txn.Verify(), "InnerHash does not match computed hash") + + // No inputs + txn = makeTransaction(t) + txn.In = make([]cipher.SHA256, 0) + err := txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "No inputs") + + // No outputs + txn = makeTransaction(t) + txn.Out = make([]TransactionOutput, 0) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "No outputs") + + // Invalid number of sigs + txn = makeTransaction(t) + txn.Sigs = make([]cipher.Sig, 0) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Invalid number of signatures") + txn.Sigs = make([]cipher.Sig, 20) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Invalid number of signatures") + + // Too many sigs & inputs + txn = makeTransaction(t) + txn.Sigs = make([]cipher.Sig, math.MaxUint16+1) + txn.In = make([]cipher.SHA256, math.MaxUint16+1) + testutil.RequireError(t, txn.Verify(), "Too many signatures and inputs") + + // Duplicate inputs + ux, s := makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + err = txn.PushInput(txn.In[0]) + require.NoError(t, err) + txn.Sigs = nil + txn.SignInputs([]cipher.SecKey{s, s}) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Duplicate spend") + + // Duplicate outputs + txn = makeTransaction(t) + to := txn.Out[0] + err = txn.PushOutput(to.Address, to.Coins, to.Hours) + require.NoError(t, err) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Duplicate output in transaction") + + // Invalid signature, empty + txn = makeTransaction(t) + txn.Sigs[0] = cipher.Sig{} + testutil.RequireError(t, txn.Verify(), "Unsigned input in transaction") + + // Invalid signature, not empty + // A stable invalid signature must be used because random signatures could appear valid + // Note: Transaction.Verify() only checks that the signature is a minimally valid signature + badSig := "9a0f86874a4d9541f58a1de4db1c1b58765a868dc6f027445d0a2a8a7bddd1c45ea559fcd7bef45e1b76ccdaf8e50bbebd952acbbea87d1cb3f7a964bc89bf1ed5" + txn = makeTransaction(t) + txn.Sigs[0] = cipher.MustSigFromHex(badSig) + testutil.RequireError(t, txn.Verify(), "Failed to recover pubkey from signature") + + // We can't check here for other invalid signatures: + // - Signatures signed by someone else, spending coins they don't own + // - Signatures signing a different message + // This must be done by blockchain tests, because we need the address + // from the unspent being spent + // The verification here only checks that the signature is valid at all + + // Output coins are 0 + txn = makeTransaction(t) + txn.Out[0].Coins = 0 + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Zero coin output") + + // Output coin overflow + txn = makeTransaction(t) + txn.Out[0].Coins = math.MaxUint64 - 3e6 + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Output coins overflow") + + // Output coins are not multiples of 1e6 (valid, decimal restriction is not enforced here) + txn = makeTransaction(t) + txn.Out[0].Coins += 10 + err = txn.UpdateHeader() + require.NoError(t, err) + txn.Sigs = nil + txn.SignInputs([]cipher.SecKey{genSecret}) + require.NotEqual(t, txn.Out[0].Coins%1e6, uint64(0)) + require.NoError(t, txn.Verify()) + + // Valid + txn = makeTransaction(t) + txn.Out[0].Coins = 10e6 + txn.Out[1].Coins = 1e6 + err = txn.UpdateHeader() + require.NoError(t, err) + require.NoError(t, txn.Verify()) +} + +func TestTransactionVerifyUnsigned(t *testing.T) { + txn, _ := makeTransactionMultipleInputs(t, 2) + err := txn.VerifyUnsigned() + testutil.RequireError(t, err, "Unsigned transaction must contain a null signature") + + // Invalid signature, not empty + // A stable invalid signature must be used because random signatures could appear valid + // Note: Transaction.Verify() only checks that the signature is a minimally valid signature + badSig := "9a0f86874a4d9541f58a1de4db1c1b58765a868dc6f027445d0a2a8a7bddd1c45ea559fcd7bef45e1b76ccdaf8e50bbebd952acbbea87d1cb3f7a964bc89bf1ed5" + txn, _ = makeTransactionMultipleInputs(t, 2) + txn.Sigs[0] = cipher.Sig{} + txn.Sigs[1] = cipher.MustSigFromHex(badSig) + testutil.RequireError(t, txn.VerifyUnsigned(), "Failed to recover pubkey from signature") + + txn.Sigs = nil + err = txn.VerifyUnsigned() + testutil.RequireError(t, err, "Invalid number of signatures") + + // Transaction is unsigned if at least 1 signature is null + txn, _ = makeTransactionMultipleInputs(t, 3) + require.True(t, len(txn.Sigs) > 1) + txn.Sigs[0] = cipher.Sig{} + err = txn.VerifyUnsigned() + require.NoError(t, err) + + // Transaction is unsigned if all signatures are null + for i := range txn.Sigs { + txn.Sigs[i] = cipher.Sig{} + } + err = txn.VerifyUnsigned() + require.NoError(t, err) +} + +func TestTransactionVerifyInput(t *testing.T) { + // Invalid uxIn args + txn := makeTransaction(t) + _require.PanicsWithLogMessage(t, "txn.In != uxIn", func() { + _ = txn.VerifyInputSignatures(nil) //nolint:errcheck + }) + _require.PanicsWithLogMessage(t, "txn.In != uxIn", func() { + _ = txn.VerifyInputSignatures(UxArray{}) //nolint:errcheck + }) + _require.PanicsWithLogMessage(t, "txn.In != uxIn", func() { + _ = txn.VerifyInputSignatures(make(UxArray, 3)) //nolint:errcheck + }) + + // txn.In != txn.Sigs + ux, s := makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + txn.Sigs = []cipher.Sig{} + _require.PanicsWithLogMessage(t, "txn.In != txn.Sigs", func() { + _ = txn.VerifyInputSignatures(UxArray{ux}) //nolint:errcheck + }) + + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + txn.Sigs = append(txn.Sigs, cipher.Sig{}) + _require.PanicsWithLogMessage(t, "txn.In != txn.Sigs", func() { + _ = txn.VerifyInputSignatures(UxArray{ux}) //nolint:errcheck + }) + + // txn.InnerHash != txn.HashInner() + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + txn.InnerHash = cipher.SHA256{} + _require.PanicsWithLogMessage(t, "Invalid Tx Inner Hash", func() { + _ = txn.VerifyInputSignatures(UxArray{ux}) //nolint:errcheck + }) + + // txn.In does not match uxIn hashes + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + _require.PanicsWithLogMessage(t, "Ux hash mismatch", func() { + _ = txn.VerifyInputSignatures(UxArray{UxOut{}}) //nolint:errcheck + }) + + // Unsigned txn + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + txn.Sigs[0] = cipher.Sig{} + err := txn.VerifyInputSignatures(UxArray{ux}) + testutil.RequireError(t, err, "Unsigned input in transaction") + + // Signature signed by someone else + ux, _ = makeUxOutWithSecret(t) + _, s2 := makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s2) + err = txn.VerifyInputSignatures(UxArray{ux}) + testutil.RequireError(t, err, "Signature not valid for output being spent") + + // Valid + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + err = txn.VerifyInputSignatures(UxArray{ux}) + require.NoError(t, err) +} + +func TestTransactionPushInput(t *testing.T) { + txn := &Transaction{} + ux := makeUxOut(t) + require.NoError(t, txn.PushInput(ux.Hash())) + require.Equal(t, len(txn.In), 1) + require.Equal(t, txn.In[0], ux.Hash()) + txn.In = append(txn.In, make([]cipher.SHA256, math.MaxUint16)...) + ux = makeUxOut(t) + err := txn.PushInput(ux.Hash()) + testutil.RequireError(t, err, "Max transaction inputs reached") +} + +func TestTransactionPushOutput(t *testing.T) { + txn := &Transaction{} + a := makeAddress() + err := txn.PushOutput(a, 100, 150) + require.NoError(t, err) + require.Equal(t, len(txn.Out), 1) + require.Equal(t, txn.Out[0], TransactionOutput{ + Address: a, + Coins: 100, + Hours: 150, + }) + for i := 1; i < 20; i++ { + a := makeAddress() + err := txn.PushOutput(a, uint64(i*100), uint64(i*50)) + require.NoError(t, err) + require.Equal(t, len(txn.Out), i+1) + require.Equal(t, txn.Out[i], TransactionOutput{ + Address: a, + Coins: uint64(i * 100), + Hours: uint64(i * 50), + }) + } + + txn.Out = append(txn.Out, make([]TransactionOutput, math.MaxUint16-len(txn.Out))...) + err = txn.PushOutput(a, 999, 999) + testutil.RequireError(t, err, "Max transaction outputs reached") +} + +func TestTransactionSignInput(t *testing.T) { + txn, seckeys := makeTransactionMultipleInputs(t, 3) + require.True(t, txn.IsFullySigned()) + + // Input is already signed + err := txn.SignInput(seckeys[0], 0) + testutil.RequireError(t, err, "Input already signed") + require.True(t, txn.IsFullySigned()) + + // Input is not signed + txn.Sigs[1] = cipher.Sig{} + require.False(t, txn.IsFullySigned()) + err = txn.SignInput(seckeys[1], 1) + require.NoError(t, err) + require.True(t, txn.IsFullySigned()) + err = txn.SignInput(seckeys[1], 1) + testutil.RequireError(t, err, "Input already signed") + + // Transaction has no sigs; sigs array is initialized + txn.Sigs = nil + require.False(t, txn.IsFullySigned()) + err = txn.SignInput(seckeys[2], 2) + require.NoError(t, err) + require.False(t, txn.IsFullySigned()) + require.Len(t, txn.Sigs, 3) + require.True(t, txn.Sigs[0].Null()) + require.True(t, txn.Sigs[1].Null()) + require.False(t, txn.Sigs[2].Null()) + + // SignInputs on a partially signed transaction fails + require.Panics(t, func() { + txn.SignInputs(seckeys) + }) + + // Signing the rest of the inputs individually works + err = txn.SignInput(seckeys[1], 1) + require.NoError(t, err) + require.False(t, txn.IsFullySigned()) + err = txn.SignInput(seckeys[0], 0) + require.NoError(t, err) + require.True(t, txn.IsFullySigned()) + + // Can use SignInputs on allocated array of empty sigs + txn.Sigs = make([]cipher.Sig, 3) + txn.SignInputs(seckeys) + require.True(t, txn.IsFullySigned()) +} + +func TestTransactionSignInputs(t *testing.T) { + txn := &Transaction{} + // Panics if txns already signed + txn.Sigs = append(txn.Sigs, cipher.Sig{}) + require.Panics(t, func() { txn.SignInputs([]cipher.SecKey{}) }) + // Panics if not enough keys + txn = &Transaction{} + ux, s := makeUxOutWithSecret(t) + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + ux2, s2 := makeUxOutWithSecret(t) + err = txn.PushInput(ux2.Hash()) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 40, 80) + require.NoError(t, err) + require.Equal(t, len(txn.Sigs), 0) + require.Panics(t, func() { txn.SignInputs([]cipher.SecKey{s}) }) + require.Equal(t, len(txn.Sigs), 0) + // Valid signing + h := txn.HashInner() + require.NotPanics(t, func() { txn.SignInputs([]cipher.SecKey{s, s2}) }) + require.Equal(t, len(txn.Sigs), 2) + h2 := txn.HashInner() + require.Equal(t, h2, h) + p := cipher.MustPubKeyFromSecKey(s) + a := cipher.AddressFromPubKey(p) + p = cipher.MustPubKeyFromSecKey(s2) + a2 := cipher.AddressFromPubKey(p) + require.NoError(t, cipher.VerifyAddressSignedHash(a, txn.Sigs[0], cipher.AddSHA256(h, txn.In[0]))) + require.NoError(t, cipher.VerifyAddressSignedHash(a2, txn.Sigs[1], cipher.AddSHA256(h, txn.In[1]))) + require.Error(t, cipher.VerifyAddressSignedHash(a, txn.Sigs[1], h)) + require.Error(t, cipher.VerifyAddressSignedHash(a2, txn.Sigs[0], h)) +} + +func TestTransactionHash(t *testing.T) { + txn := makeTransaction(t) + h := txn.Hash() + h2 := txn.HashInner() + require.NotEqual(t, h, cipher.SHA256{}) + require.NotEqual(t, h2, h) +} + +func TestTransactionUpdateHeader(t *testing.T) { + txn := makeTransaction(t) + h := txn.InnerHash + txn.InnerHash = cipher.SHA256{} + err := txn.UpdateHeader() + require.NoError(t, err) + require.NotEqual(t, txn.InnerHash, cipher.SHA256{}) + require.Equal(t, txn.InnerHash, h) + require.Equal(t, txn.InnerHash, txn.HashInner()) +} + +func TestTransactionHashInner(t *testing.T) { + txn := makeTransaction(t) + + require.NotEqual(t, cipher.SHA256{}, txn.HashInner()) + + // If txn.In is changed, inner hash should change + txn2 := copyTransaction(txn) + ux := makeUxOut(t) + txn2.In[0] = ux.Hash() + require.NotEqual(t, txn, txn2) + require.Equal(t, txn2.In[0], ux.Hash()) + require.NotEqual(t, txn.HashInner(), txn2.HashInner()) + + // If txn.Out is changed, inner hash should change + txn2 = copyTransaction(txn) + a := makeAddress() + txn2.Out[0].Address = a + require.NotEqual(t, txn, txn2) + require.Equal(t, txn2.Out[0].Address, a) + require.NotEqual(t, txn.HashInner(), txn2.HashInner()) + + // If txn.Head is changed, inner hash should not change + txn2 = copyTransaction(txn) + txn.Sigs = append(txn.Sigs, cipher.Sig{}) + require.Equal(t, txn.HashInner(), txn2.HashInner()) +} + +func TestTransactionSerialization(t *testing.T) { + txn := makeTransaction(t) + b, err := txn.Serialize() + require.NoError(t, err) + txn2, err := DeserializeTransaction(b) + require.NoError(t, err) + require.Equal(t, txn, txn2) + + // Check reserializing deserialized txn + b2, err := txn2.Serialize() + require.NoError(t, err) + txn3, err := DeserializeTransaction(b2) + require.NoError(t, err) + require.Equal(t, txn2, txn3) + + // Check hex encode/decode followed by deserialize + s := hex.EncodeToString(b) + sb, err := hex.DecodeString(s) + require.NoError(t, err) + txn4, err := DeserializeTransaction(sb) + require.NoError(t, err) + require.Equal(t, txn2, txn4) + + // Invalid deserialization + require.Panics(t, func() { + MustDeserializeTransaction([]byte{0x04}) + }) + + // SerializeHex + x, err := txn.SerializeHex() + require.NoError(t, err) + txn5, err := DeserializeTransactionHex(x) + require.NoError(t, err) + require.Equal(t, txn, txn5) + + // Invalid hex deserialization + require.Panics(t, func() { + MustDeserializeTransactionHex("foo") + }) + + ss, err := txn.Serialize() + require.NoError(t, err) + require.Equal(t, ss, txn.MustSerialize()) + sshh, err := txn.SerializeHex() + require.NoError(t, err) + require.Equal(t, sshh, txn.MustSerializeHex()) +} + +func TestTransactionOutputHours(t *testing.T) { + txn := Transaction{} + err := txn.PushOutput(makeAddress(), 1e6, 100) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 200) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 500) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 0) + require.NoError(t, err) + hours, err := txn.OutputHours() + require.NoError(t, err) + require.Equal(t, hours, uint64(800)) + + err = txn.PushOutput(makeAddress(), 1e6, math.MaxUint64-700) + require.NoError(t, err) + _, err = txn.OutputHours() + testutil.RequireError(t, err, "Transaction output hours overflow") +} + +func TestTransactionsSize(t *testing.T) { + txns := makeTransactions(t, 10) + var size uint32 + for _, txn := range txns { + encodedLen, err := mathutil.IntToUint32(len(encoder.Serialize(&txn))) + require.NoError(t, err) + size, err = mathutil.AddUint32(size, encodedLen) + require.NoError(t, err) + } + + require.NotEqual(t, size, 0) + s, err := txns.Size() + require.NoError(t, err) + require.Equal(t, s, size) +} + +func TestTransactionsHashes(t *testing.T) { + txns := make(Transactions, 4) + for i := 0; i < len(txns); i++ { + txns[i] = makeTransaction(t) + } + hashes := txns.Hashes() + require.Equal(t, len(hashes), 4) + for i, h := range hashes { + require.Equal(t, h, txns[i].Hash()) + } +} + +func TestTransactionsTruncateBytesTo(t *testing.T) { + txns := makeTransactions(t, 10) + var trunc uint32 + for i := 0; i < len(txns)/2; i++ { + size, err := txns[i].Size() + require.NoError(t, err) + trunc, err = mathutil.AddUint32(trunc, size) + require.NoError(t, err) + } + + // Truncating halfway + txns2, err := txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, len(txns2), len(txns)/2) + totalSize, err := txns2.Size() + require.NoError(t, err) + require.Equal(t, totalSize, trunc) + + // Stepping into next boundary has same cutoff, must exceed + trunc++ + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, len(txns2), len(txns)/2) + totalSize, err = txns2.Size() + require.NoError(t, err) + require.Equal(t, totalSize, trunc-1) + + // Moving to 1 before next level + size5, err := txns[5].Size() + require.NoError(t, err) + require.True(t, size5 >= 2) + trunc, err = mathutil.AddUint32(trunc, size5-2) + require.NoError(t, err) + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, len(txns2), len(txns)/2) + + totalSize, err = txns2.Size() + require.NoError(t, err) + size5, err = txns[5].Size() + require.NoError(t, err) + require.Equal(t, totalSize, trunc-size5+1) + + // Moving to next level + trunc++ + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, len(txns2), len(txns)/2+1) + size, err := txns2.Size() + require.NoError(t, err) + require.Equal(t, size, trunc) + + // Truncating to full available amt + trunc, err = txns.Size() + require.NoError(t, err) + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, txns, txns2) + size, err = txns2.Size() + require.NoError(t, err) + require.Equal(t, size, trunc) + + // Truncating over amount + trunc++ + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, txns, txns2) + size, err = txns2.Size() + require.NoError(t, err) + require.Equal(t, size, trunc-1) + + // Truncating to 0 + trunc = 0 + txns2, err = txns.TruncateBytesTo(0) + require.NoError(t, err) + require.Equal(t, len(txns2), 0) + size, err = txns2.Size() + require.NoError(t, err) + require.Equal(t, size, trunc) +} + +func TestVerifyTransactionCoinsSpending(t *testing.T) { + // Input coins overflow + // Insufficient coins + // Destroy coins + + type ux struct { + coins uint64 + hours uint64 + } + + cases := []struct { + name string + inUxs []ux + outUxs []ux + err error + }{ + { + name: "Input coins overflow", + inUxs: []ux{ + { + coins: math.MaxUint64 - 1e6 + 1, + hours: 10, + }, + { + coins: 1e6, + hours: 0, + }, + }, + err: errors.New("Transaction input coins overflow"), + }, + + { + name: "Output coins overflow", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: math.MaxUint64 - 10e6 + 1, + hours: 0, + }, + { + coins: 20e6, + hours: 1, + }, + }, + err: errors.New("Transaction output coins overflow"), + }, + + { + name: "Insufficient coins", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 20e6, + hours: 1, + }, + { + coins: 10e6, + hours: 1, + }, + }, + err: errors.New("Insufficient coins"), + }, + + { + name: "Destroyed coins", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 5e6, + hours: 1, + }, + { + coins: 10e6, + hours: 1, + }, + }, + err: errors.New("Transactions may not destroy coins"), + }, + + { + name: "valid", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 11, + }, + { + coins: 10e6, + hours: 1, + }, + { + coins: 5e6, + hours: 0, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var uxIn, uxOut UxArray + + for _, ch := range tc.inUxs { + uxIn = append(uxIn, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + for _, ch := range tc.outUxs { + uxOut = append(uxOut, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + err := VerifyTransactionCoinsSpending(uxIn, uxOut) + require.Equal(t, tc.err, err) + }) + } +} + +func TestVerifyTransactionHoursSpending(t *testing.T) { + // Input hours overflow + // Insufficient hours + // NOTE: does not check for hours overflow, that had to be moved to soft constraints + // NOTE: if uxIn.CoinHours() fails during the addition of earned hours to base hours, + // the error is ignored and treated as 0 hours + + type ux struct { + coins uint64 + hours uint64 + } + + cases := []struct { + name string + inUxs []ux + outUxs []ux + headTime uint64 + err string + }{ + { + name: "Input hours overflow", + inUxs: []ux{ + { + coins: 3e6, + hours: math.MaxUint64 - 1e6 + 1, + }, + { + coins: 1e6, + hours: 1e6, + }, + }, + err: "Transaction input hours overflow", + }, + + { + name: "Insufficient coin hours", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 15e6, + hours: 10, + }, + { + coins: 10e6, + hours: 11, + }, + }, + err: "Insufficient coin hours", + }, + + { + name: "coin hours time calculation overflow", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 11, + }, + { + coins: 10e6, + hours: 1, + }, + { + coins: 5e6, + hours: 0, + }, + }, + headTime: math.MaxUint64, + err: "UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=18446744073709551615 coins=10 uxid=", + }, + + { + name: "Invalid (coin hours overflow when adding earned hours, which is treated as 0, and now enough coin hours)", + headTime: 1e6, + inUxs: []ux{ + { + coins: 10e6, + hours: math.MaxUint64, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 1, + }, + }, + err: "Insufficient coin hours", + }, + + { + name: "Valid (coin hours overflow when adding earned hours, which is treated as 0, but not sending any hours)", + headTime: 1e6, + inUxs: []ux{ + { + coins: 10e6, + hours: math.MaxUint64, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 0, + }, + }, + }, + + { + name: "Valid (base inputs have insufficient coin hours, but have sufficient after adjusting coinhours by headTime)", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 15e6, + hours: 10, + }, + { + coins: 10e6, + hours: 11, + }, + }, + headTime: 1492707255, + }, + + { + name: "valid", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 11, + }, + { + coins: 10e6, + hours: 1, + }, + { + coins: 5e6, + hours: 0, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var uxIn, uxOut UxArray + + for _, ch := range tc.inUxs { + uxIn = append(uxIn, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + for _, ch := range tc.outUxs { + uxOut = append(uxOut, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + err := VerifyTransactionHoursSpending(tc.headTime, uxIn, uxOut) + if tc.err == "" { + require.NoError(t, err) + } else { + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), tc.err)) + } + }) + } +} + +func TestTransactionsFees(t *testing.T) { + calc := func(txn *Transaction) (uint64, error) { + return 1, nil + } + + var txns Transactions + + // Nil txns + fee, err := txns.Fees(calc) + require.NoError(t, err) + require.Equal(t, uint64(0), fee) + + txns = append(txns, Transaction{}) + txns = append(txns, Transaction{}) + + // 2 transactions, calc() always returns 1 + fee, err = txns.Fees(calc) + require.NoError(t, err) + require.Equal(t, uint64(2), fee) + + // calc error + failingCalc := func(txn *Transaction) (uint64, error) { + return 0, errors.New("bad calc") + } + _, err = txns.Fees(failingCalc) + testutil.RequireError(t, err, "bad calc") + + // summing of calculated fees overflows + overflowCalc := func(txn *Transaction) (uint64, error) { + return math.MaxUint64, nil + } + + _, err = txns.Fees(overflowCalc) + testutil.RequireError(t, err, "Transactions fee totals overflow") +} + +func TestSortTransactions(t *testing.T) { + n := 6 + var txns Transactions + for i := 0; i < n; i++ { + txn := Transaction{} + err := txn.PushOutput(makeAddress(), 1e6, uint64(i*1e3)) + require.NoError(t, err) + err = txn.UpdateHeader() + require.NoError(t, err) + txns = append(txns, txn) + } + + hashSortedTxns := append(Transactions{}, txns...) + + sort.Slice(hashSortedTxns, func(i, j int) bool { + ihash := hashSortedTxns[i].Hash() + jhash := hashSortedTxns[j].Hash() + return bytes.Compare(ihash[:], jhash[:]) < 0 + }) + + cases := []struct { + name string + feeCalc FeeCalculator + txns Transactions + sortedTxns Transactions + }{ + { + name: "already sorted", + txns: Transactions{txns[0], txns[1]}, + sortedTxns: Transactions{txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + return 1e8 - txn.Out[0].Hours, nil + }, + }, + + { + name: "reverse sorted", + txns: Transactions{txns[1], txns[0]}, + sortedTxns: Transactions{txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + return 1e8 - txn.Out[0].Hours, nil + }, + }, + + { + name: "hash tiebreaker", + txns: Transactions{hashSortedTxns[1], hashSortedTxns[0]}, + sortedTxns: Transactions{hashSortedTxns[0], hashSortedTxns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + return 1e8, nil + }, + }, + + { + name: "invalid fee multiplication is capped", + txns: Transactions{txns[1], txns[2], txns[0]}, + sortedTxns: Transactions{txns[2], txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + if txn.Hash() == txns[2].Hash() { + return math.MaxUint64 / 2, nil + } + return 1e8 - txn.Out[0].Hours, nil + }, + }, + + { + name: "failed fee calc is filtered", + txns: Transactions{txns[1], txns[2], txns[0]}, + sortedTxns: Transactions{txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + if txn.Hash() == txns[2].Hash() { + return 0, errors.New("fee calc failed") + } + return 1e8 - txn.Out[0].Hours, nil + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := SortTransactions(tc.txns, tc.feeCalc) + require.NoError(t, err) + require.Equal(t, tc.sortedTxns, txns) + }) + } +} + +func TestTransactionSignedUnsigned(t *testing.T) { + txn, _ := makeTransactionMultipleInputs(t, 2) + require.True(t, txn.IsFullySigned()) + require.True(t, txn.hasNonNullSignature()) + require.False(t, txn.IsFullyUnsigned()) + require.False(t, txn.hasNullSignature()) + + txn.Sigs[1] = cipher.Sig{} + require.False(t, txn.IsFullySigned()) + require.True(t, txn.hasNonNullSignature()) + require.False(t, txn.IsFullyUnsigned()) + require.True(t, txn.hasNullSignature()) + + txn.Sigs[0] = cipher.Sig{} + require.False(t, txn.IsFullySigned()) + require.False(t, txn.hasNonNullSignature()) + require.True(t, txn.IsFullyUnsigned()) + require.True(t, txn.hasNullSignature()) + + txn.Sigs = nil + require.False(t, txn.IsFullySigned()) + require.False(t, txn.hasNonNullSignature()) + require.True(t, txn.IsFullyUnsigned()) + require.False(t, txn.hasNullSignature()) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder.go new file mode 100644 index 00000000..f5e4026a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder.go @@ -0,0 +1,138 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeUxBody computes the size of an encoded object of type UxBody +func encodeSizeUxBody(obj *UxBody) uint64 { + i0 := uint64(0) + + // obj.SrcTransaction + i0 += 32 + + // obj.Address.Version + i0++ + + // obj.Address.Key + i0 += 20 + + // obj.Coins + i0 += 8 + + // obj.Hours + i0 += 8 + + return i0 +} + +// encodeUxBody encodes an object of type UxBody to a buffer allocated to the exact size +// required to encode the object. +func encodeUxBody(obj *UxBody) ([]byte, error) { + n := encodeSizeUxBody(obj) + buf := make([]byte, n) + + if err := encodeUxBodyToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxBodyToBuffer encodes an object of type UxBody to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxBodyToBuffer(buf []byte, obj *UxBody) error { + if uint64(len(buf)) < encodeSizeUxBody(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.SrcTransaction + e.CopyBytes(obj.SrcTransaction[:]) + + // obj.Address.Version + e.Uint8(obj.Address.Version) + + // obj.Address.Key + e.CopyBytes(obj.Address.Key[:]) + + // obj.Coins + e.Uint64(obj.Coins) + + // obj.Hours + e.Uint64(obj.Hours) + + return nil +} + +// decodeUxBody decodes an object of type UxBody from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxBody(buf []byte, obj *UxBody) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.SrcTransaction + if len(d.Buffer) < len(obj.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.SrcTransaction[:], d.Buffer[:len(obj.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.SrcTransaction):] + } + + { + // obj.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Address.Version = i + } + + { + // obj.Address.Key + if len(d.Buffer) < len(obj.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Address.Key[:], d.Buffer[:len(obj.Address.Key)]) + d.Buffer = d.Buffer[len(obj.Address.Key):] + } + + { + // obj.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Coins = i + } + + { + // obj.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Hours = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxBodyExact decodes an object of type UxBody from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxBodyExact(buf []byte, obj *UxBody) error { + if n, err := decodeUxBody(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder_test.go new file mode 100644 index 00000000..6f01f3b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUxBodyForEncodeTest() *UxBody { + var obj UxBody + return &obj +} + +func newRandomUxBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxBody { + var obj UxBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxBody { + var obj UxBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxBody { + var obj UxBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxBody(t *testing.T, obj *UxBody) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxBody(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxBody() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxBody(obj) + if err != nil { + t.Fatalf("encodeUxBody failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxBody produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxBody()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxBodyToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxBodyToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UxBody + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UxBody + if n, err := decodeUxBody(data2, &obj3); err != nil { + t.Fatalf("decodeUxBody failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxBody bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxBody()") + } + + // Decode, excess buffer + var obj4 UxBody + n, err := decodeUxBody(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxBody failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxBody bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxBody bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxBody()") + } + + // DecodeExact + var obj5 UxBody + if err := decodeUxBodyExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxBody failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxBody()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxBody(data4, &obj3); err != nil { + t.Fatalf("decodeUxBody failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxBody bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxBody(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UxBody + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxBodyForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxBodyForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxBodyForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxBodyForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxBody(t, tc.obj) + }) + } +} + +func decodeUxBodyExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxBody + if _, err := decodeUxBody(buf, &obj); err == nil { + t.Fatal("decodeUxBody: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxBody: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxBodyExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxBody + if err := decodeUxBodyExact(buf, &obj); err == nil { + t.Fatal("decodeUxBodyExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxBodyExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxBodyDecodeErrors(t *testing.T, k int, tag string, obj *UxBody) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxBody(obj) + buf, err := encodeUxBody(obj) + if err != nil { + t.Fatalf("encodeUxBody failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxBodyExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxBodyExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxBodyExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxBodyExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxBodyExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxBodyDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxBodyForEncodeTest() + fullObj := newRandomUxBodyForEncodeTest(t, rand) + testSkyencoderUxBodyDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxBodyDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder.go new file mode 100644 index 00000000..5563be78 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder.go @@ -0,0 +1,93 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeUxHead computes the size of an encoded object of type UxHead +func encodeSizeUxHead(obj *UxHead) uint64 { + i0 := uint64(0) + + // obj.Time + i0 += 8 + + // obj.BkSeq + i0 += 8 + + return i0 +} + +// encodeUxHead encodes an object of type UxHead to a buffer allocated to the exact size +// required to encode the object. +func encodeUxHead(obj *UxHead) ([]byte, error) { + n := encodeSizeUxHead(obj) + buf := make([]byte, n) + + if err := encodeUxHeadToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxHeadToBuffer encodes an object of type UxHead to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxHeadToBuffer(buf []byte, obj *UxHead) error { + if uint64(len(buf)) < encodeSizeUxHead(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Time + e.Uint64(obj.Time) + + // obj.BkSeq + e.Uint64(obj.BkSeq) + + return nil +} + +// decodeUxHead decodes an object of type UxHead from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxHead(buf []byte, obj *UxHead) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Time = i + } + + { + // obj.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.BkSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxHeadExact decodes an object of type UxHead from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxHeadExact(buf []byte, obj *UxHead) error { + if n, err := decodeUxHead(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder_test.go new file mode 100644 index 00000000..8792d519 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUxHeadForEncodeTest() *UxHead { + var obj UxHead + return &obj +} + +func newRandomUxHeadForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxHead { + var obj UxHead + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxHeadForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxHead { + var obj UxHead + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxHeadForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxHead { + var obj UxHead + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxHead(t *testing.T, obj *UxHead) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxHead(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxHead() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxHead(obj) + if err != nil { + t.Fatalf("encodeUxHead failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxHead produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxHead()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxHeadToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxHeadToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UxHead + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UxHead + if n, err := decodeUxHead(data2, &obj3); err != nil { + t.Fatalf("decodeUxHead failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxHead bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxHead()") + } + + // Decode, excess buffer + var obj4 UxHead + n, err := decodeUxHead(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxHead failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxHead bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxHead bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxHead()") + } + + // DecodeExact + var obj5 UxHead + if err := decodeUxHeadExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxHead failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxHead()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxHead(data4, &obj3); err != nil { + t.Fatalf("decodeUxHead failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxHead bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxHead(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UxHead + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxHeadForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxHeadForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxHeadForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxHeadForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxHead(t, tc.obj) + }) + } +} + +func decodeUxHeadExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxHead + if _, err := decodeUxHead(buf, &obj); err == nil { + t.Fatal("decodeUxHead: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxHead: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxHeadExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxHead + if err := decodeUxHeadExact(buf, &obj); err == nil { + t.Fatal("decodeUxHeadExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxHeadExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxHeadDecodeErrors(t *testing.T, k int, tag string, obj *UxHead) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxHead(obj) + buf, err := encodeUxHead(obj) + if err != nil { + t.Fatalf("encodeUxHead failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxHeadExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxHeadExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxHeadExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxHeadExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxHeadExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxHeadDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxHeadForEncodeTest() + fullObj := newRandomUxHeadForEncodeTest(t, rand) + testSkyencoderUxHeadDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxHeadDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/blockstat.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/blockstat.go new file mode 100644 index 00000000..2d853848 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/blockstat.go @@ -0,0 +1,627 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "bytes" + "container/heap" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" +) + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +// How many (hash,signer_pubkey) pairs to acquire for decision-making. +// This also limits forwarded traffic, because the messages in excess +// of this limit are discarded hence not forwarded: +var Cfg_consensus_max_candidate_messages = 10 + +// +//////////////////////////////////////////////////////////////////////////////// +var all_zero_hash = cipher.SHA256{} +var all_zero_sig = cipher.Sig{} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockStat +// +//////////////////////////////////////////////////////////////////////////////// +type BlockStat struct { + priority int // Mandatory item for an element of container/heap + index int // Mandatory item for an element of container/heap + + // [JSM:] For a given block sequence number (or 'seqno'), we + // want + // + // map: hash -> set + // + // The 'pubkey' is recovered from '(sig,hash)' pair. Also, we + // want the number of unique 'pubkey', which is the number of + // independent block-makers. It shows how reliable the averaging + // would be. + // + // [JSM:] We need to put an upper limit to the + // ConcensusParticipant's bandwidth requirement in order to + // prevent a certain kind of attack on the network. As an + // implementation of that requirement, we stop collecting (hence, + // stop propagating) the blocks with the same sequence number + // after we have observed a sufficient number of builders. + // + // [JSM:] The hash that has largest number of unique pubkeys is + // selected as the block for the given seqno. + + // [JSM:] This approach is to guard against what can be called an + // "amplification attack": A node/pubkey with many subscribers + // publishes a block that says "Earth is flat". The above pubkey + // is (and has been) trusted by many, but at the moment the pubkey + // has been compelled, say, under a threat of burning on a steak, + // to publish a clearly-wrong block. You, as a listening pubkey, + // have N1 nodes as publisher; + // each of them is connected, or have a route, to the + // above pubkey that is being coersed. Meanwhile, there are N2 + // pubkeys that published "Earth is round" block. If you neglect + // to check the origin of the block [i.e. who signed it], and if + // it happens that N1 >> N2 (e.g. 1000 >> 100), then you would + // conclude, quite incorrectly, that the network agrees that + // "Earth is flat". If, however, you take into account the origin + // of the block, you would see that all N1 blocks are merely + // duplicates sent out with the intention to manipulate network + // consensus, while all N2 messages came from unique + // signers. Therefore you conclude that you have only one block + // "Earth is flat" and many blocks "Earth is round", e.g. 1 << + // 100. So you chose "Earth is round" block. The idea of this + // approach (or a guard, if you will) can be expressesd as + // follows: "Q: Can one billion peasants be all wrong + // simultaneously? A: Yes, if they learn what they should think + // from the same wall-glued newspaper." + // + // (Side node: this approach has several useful side-effects + // that we shall not discuss here.) + + hash2info map[cipher.SHA256]HashCandidate + + // FOR NOW this is just a label and is used to + // set/read. Invariant: all Blocks stored/referenced here have + // same seqno. + seqno uint64 + + // After the class instance was used to select Block for + // consensus, we do not update the stats. + frozen bool + + // This is to limit traffic due to forwarding. A side-effect is + // limited statistics. See'Cfg_consensus_max_candidate_messages'. + // Explanation: every node in the network is allowed to make (and + // publish) blocks, but we do not wish to receive all of these + // messages. + accept_count int + + // + // BEG debugging/diagnostics + // + debug_pubkey2count map[cipher.PubKey]int + debug_count int + + // The number of events that would have qualified to be utilized, + // but were rejected due to 'frozen == true' + debug_reject_count int + + // Ignored due to limitations on how much we want to accept and forward + debug_neglect_count int + + debug_usage int + // + // END debugging/diagnostics + // +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) is_consistent() bool { + for _, info := range self.hash2info { + if !info.is_consistent() { + return false + } + } + // TODO 1: Need to extract pubkey from 'self.hash2info' and from + // 'self.debug_pubkey2count', and make sure they are the same. + + // TODO 2: make sure all debug counters are consistent. + return true +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) Init() { + self.priority = 0 + self.index = -1 + + self.hash2info = make(map[cipher.SHA256]HashCandidate) + self.seqno = 0 + self.frozen = false + self.accept_count = 0 + // + self.debug_pubkey2count = make(map[cipher.PubKey]int) + self.debug_count = 0 + self.debug_reject_count = 0 + self.debug_neglect_count = 0 + self.debug_usage = 0 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) GetSeqno() uint64 { + return self.seqno +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) Clear() { + + for i, info := range self.hash2info { + info.Clear() + delete(self.hash2info, i) + } + self.seqno = 0 + self.frozen = false + self.accept_count = 0 + // + for i, _ := range self.debug_pubkey2count { + delete(self.debug_pubkey2count, i) + } + self.debug_count = 0 + self.debug_reject_count = 0 + // NOTE: 'self.debug_usage' is kept as-is +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) try_add_hash_and_sig( + hash cipher.SHA256, + sig cipher.Sig) int { + + if self.frozen { + // To get a more accurate number of rejects, one would need to + // do as below, except insertion/updating. However, we do not + // want to incurr a calculation in order to get a more + // accurate debug numbers. So we simply: + self.debug_reject_count += 1 + return 3 + } + + // 2016090* ROBUSTNESS: We need to put a limit on the number of + // (signer_pubkey,hash) pairs that we process and forward. One + // reason is to prevent an attack in which the attacker launches a + // large number of nodes each of which make valid blocks, thus + // causing large traffic that can potentially degrade the network + // performance. Example: when we receive, say 63 + // (signer_pubkey,hash) pairs for a given seqno, we stop listening + // for the updates. Say, the breakdown is: hash H1 from 50 + // signers, hash H2 from 10, hash H3 from 2 and hash H4 from 1. + // We make a local decision to choose H1. + if self.accept_count >= Cfg_consensus_max_candidate_messages { + self.debug_neglect_count += 1 + return 1 // same as skip + } + + // 20160913 Remember that we move those BlockStat that are old + // enought (seqno difference is used as a measure of time + // difference) to BlockChain, so that the storage requerement for + // each node is now smaller. Yet we keep the limits to avoid + // excessive forwarding. + + // At the end of the function, one of them must be 'true'. + action_update := false + action_skip := false + action_insert := false + + var info HashCandidate + + if true { + var have bool + + info, have = self.hash2info[hash] + + if !have { + info = HashCandidate{} + info.Init() + action_insert = true + } else { + if _, saw := info.sig2none[sig]; saw { + action_skip = true + } else { + action_update = true + } + } + } + + if action_insert || action_update { + + if sig == all_zero_sig || hash == all_zero_hash { // Hack + return 4 // <<<<<<<< + } + + // PERFORMANCE: This is an expensive call: + signer_pubkey, err := cipher.PubKeyFromSig(sig, hash) + if err != nil { + return 4 // <<<<<<<< + } + + // Now do the check that we could not do prior to + // obtaining 'signer_pubkey': + if _, have := info.pubkey2sig[signer_pubkey]; have { + // WARNING: ROBUSTNESS: The pubkey 'signer_pubkey' has + // already published data with the same hash and same + // seqno. This is not a duplicate data: the duplicates + // have been intercepted earlier bsaged in (hash,sig) + // pair; instead, the pubkey signed the block again and + // published the result. So this can be a bug/mistake or + // an attempt to artificially increase the traffic on our + // network. + self.debug_reject_count += 1 + + action_update = false + action_skip = true + action_insert = false + + fmt.Printf("WARNING: %p, Detected malicious publish from"+ + " pubkey=%s for hash=%s sig=%s\n", &info, + signer_pubkey.Hex()[:8], hash.Hex()[:8], sig.Hex()[:8]) + } + + // These bools could have change, see above: + if action_insert || action_update { + if false { + fmt.Printf("Calling %p->ObserveSigAndPubkey(sig=%s,"+ + " signer_pubkey=%s), hash=%s\n", &info, + sig.Hex()[:8], signer_pubkey.Hex()[:8], hash.Hex()[:8]) + } + info.ObserveSigAndPubkey(sig, signer_pubkey) + self.accept_count += 1 + } + } + + if action_insert { + self.hash2info[hash] = info + } + + self.debug_count += 1 + self.debug_usage += 1 + + //if !(action_update || action_skip || action_insert) { + // panic("Inconsistent BlockStat::try_add_hash_and_sig()") + // return -1 + //} + + if action_update || action_insert { + return 0 + } + + if action_skip { + return 1 + } + + return -1 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) GetBestHashPubkeySig() ( + cipher.SHA256, + cipher.PubKey, + cipher.Sig) { + + var best_n int = -1 + + var best_h cipher.SHA256 + + for hash, info := range self.hash2info { + n := len(info.pubkey2sig) + + if best_n < n { + best_n = n + best_h = hash + } else if best_n == n { + // Resolve ties by comparing hashes: + if bytes.Compare(best_h[:], hash[:]) < 0 { + // Updating 'best_n' is unnecessary, but keep it here + // to help avoiding cut-and-paste errors: + best_n = n + best_h = hash + } + } + } + + if best_n <= 0 { + return cipher.SHA256{}, cipher.PubKey{}, cipher.Sig{} // <<<<<<<< + } + + var best_p cipher.PubKey + var best_s cipher.Sig + + // Resolve ties (if any) by comparing signatures. Do not use + // pubkey for this purpose as we do not want, for example, to have + // same pubkey sign most of blocks. + + // NOTE 1: We want a deterministic algo here, so that each + // ConsensusParticipant across the network would choose same + // (hash,sig) to go to blockchain. + + // NOTE 2: A simplified version of consensus can be imagined, in + // which ConsensusParticipant rejects a hash if it saw it already; + // this results in local blockchains with same transactions [when + // consensus id reached] but *different* signers. Which is not + // good from general entropy considerations. + initialized := false + + for pubkey, sig := range self.hash2info[best_h].pubkey2sig { + if initialized { + if bytes.Compare(best_s[:], sig[:]) < 0 { + best_p = pubkey + best_s = sig + } + } else { + best_p = pubkey + best_s = sig + + initialized = true + } + } + + return best_h, best_p, best_s +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) Print() { + + hash, _, _ := self.GetBestHashPubkeySig() + fmt.Printf("BlockStat={count(hash)=%d,count(pubkey)=%d,count(event)=%d"+ + ",accept_count=%d,seqno=%d,debug_usage=%d,frozen=%t,"+ + "debug_reject_count=%d,debug_neglect_count=%d,best_hash=%s}", + len(self.hash2info), + len(self.debug_pubkey2count), + self.debug_count, + self.accept_count, + self.seqno, + self.debug_usage, + self.frozen, + self.debug_reject_count, + self.debug_neglect_count, + hash.Hex()[:8]) +} + +//////////////////////////////////////////////////////////////////////////////// +type PriorityQueue []*BlockStat // Contained in BlockStatQueue + +// NOTE: a shallow copy (of the slice) is made here +func (pq PriorityQueue) Len() int { + return len(pq) +} + +// NOTE: a shallow copy (of the slice) is made here +func (pq PriorityQueue) Less(i int, j int) bool { + return pq[i].priority < pq[j].priority +} + +// NOTE: a shallow copy (of the slice) is made here +func (pq PriorityQueue) Swap(i int, j int) { + pq[i], pq[j] = pq[j], pq[i] + pq[i].index = i + pq[j].index = j +} +func (pq *PriorityQueue) Push(x interface{}) { + n := len(*pq) + item := x.(*BlockStat) + item.index = n + *pq = append(*pq, item) +} +func (pq *PriorityQueue) Pop() interface{} { + old := *pq + n := len(old) + item := old[n-1] + item.index = -1 // for safety + *pq = old[0 : n-1] + return item +} + +// update modifies the priority and value of an Item in the queue. +func (pq *PriorityQueue) update_priority(item *BlockStat, priority int) { + item.priority = priority + heap.Fix(pq, item.index) +} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockStatQueue +// +//////////////////////////////////////////////////////////////////////////////// +type BlockStatQueue struct { + // BlockStatQueue is a wrapper around a priority queue; the latter + // is prioretized by Block seqno. The wrapper provides setters and + // getters. The setters trim queue size as appropriate. + queue PriorityQueue +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) is_consistent() bool { + // TODO: implement. + return true +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) Len() int { + return len(self.queue) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) Print() { + n := len(self.queue) + fmt.Printf("BlockStatQueue={n=%d", n) + + for i := 0; i < n; i++ { + fmt.Print(",") + self.queue[i].Print() + } + + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) try_append_to_BlockStatQueue( + blockPtr *BlockBase) int { + + // Use a superficial, quick test here. A thorough check will be + // done later in this function. + if secp256k1.VerifySignatureValidity(blockPtr.Sig[:]) != 1 { + return 4 // Error + } + + if blockPtr.Sig == all_zero_sig || blockPtr.Hash == all_zero_hash { // Hack + return 4 // <<<<<<<< + } + + // At the end of the function, one of them must be 'true'. + action_update := false + action_skip := false + action_insert := false + + var update_index int = -1 + + n := len(self.queue) + if n > 0 { + f := self.queue[0] + l := self.queue[n-1] + // ROBUSTNESS Set a max to what 'f - l' can be. For example, + // if the limit is 100 and the queue has only one block with + // seqno 7, then do not accept blocks with seqno >= + // 107. This is to prevent Memory Overflow attack. + + if blockPtr.Seqno < f.seqno { + // TODO: Accept, unless 'f.seqno - 1' is already in the + // (consented) blockchain; otherwise reject/ignore. FOR + // NOW, accept unless queue length would be too large. + + // + // + // TODO: evaluae -------------------- URGENT !!!!! + // + // + already_in_blockchain := false + // + // + // + // + if already_in_blockchain { + fmt.Print("DEBUG Already in blockchain. Ignoring block.\n") + action_skip = true + } else if l.seqno-blockPtr.Seqno > + Cfg_consensus_candidate_max_seqno_gap { + fmt.Printf("DEBUG proposed=%d, first=%d, last=%d. Too far"+ + " behind. Ignoring block.\n", + blockPtr.Seqno, f.seqno, l.seqno) + action_skip = true + } else { + action_insert = true + } + + } else if blockPtr.Seqno > l.seqno { + // TODO: Accept, unless 'blockPtr.seqno > l.seqno' is + // large, e.g. the perceived block is way ahead of the + // last block in the queue. FOR NOW, accept unless queue + // length would be too large. + if blockPtr.Seqno-f.seqno > + Cfg_consensus_candidate_max_seqno_gap { + fmt.Printf("DEBUG proposed=%d, first=%d, last=%d. Too far"+ + " ahead. Ignoring block.\n", + blockPtr.Seqno, f.seqno, l.seqno) + action_skip = true + } else { + action_insert = true + } + } else { + // The 'blockPtr.seqno' is in between, so we need to insert + // a new or find the element with same seqno and update it. + + // PERFORMANCE TODO: Avoid linear search by using a + // lookup, or using other properties of Heap object. If + // n/a, use Binary Search. + S := blockPtr.Seqno + found := false + for i := range self.queue { + s := self.queue[i].seqno + if s < S { + // keep searching + } else if s == S { + found = true + action_update = true + update_index = i + break + } else if s > S { + break + } + } + if !found { + action_insert = true + } + } + } else { + // The queue is empty, so insert the block. + action_insert = true + } + n = -1 // guard + + //if !(action_update || action_skip || action_insert) { + // panic("Inconsistent") + // return -1 + //} + + var status_code int = 1 + + if !action_skip { + + // TAG Consensus: if we receive 100 copies of a Block (or + // Block's hash) that originated from the same block maker, + // then the statistical significance of them is not higher + // than that of only 1 copy. The significance is roughly + // proportional to sqrt of the number of different [ideally, + // independent-thinking] signers for a Block with the same + // hash and same seqno. + + should_forward_to_subscribers := false + + if action_update { + + res := self.queue[update_index]. + try_add_hash_and_sig(blockPtr.Hash, blockPtr.Sig) + if res == 0 { + should_forward_to_subscribers = true + } + + } else if action_insert { + + bs := BlockStat{} + bs.Init() + bs.seqno = blockPtr.Seqno + res := bs.try_add_hash_and_sig(blockPtr.Hash, blockPtr.Sig) + + if res == 0 { + // Keep these two together: + heap.Push(&self.queue, &bs) + self.queue.update_priority(&bs, int(blockPtr.Seqno)) + // TODO: Above, try to remove the cast. + + should_forward_to_subscribers = true + } + } + + if should_forward_to_subscribers { + status_code = 0 + } + + } + + return status_code +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/connection_manager.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/connection_manager.go new file mode 100644 index 00000000..e8a2cf3b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/connection_manager.go @@ -0,0 +1,25 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +//"github.com/SkycoinProject/skycoin/src/cipher" + +//////////////////////////////////////////////////////////////////////////////// +type ConnectionManagerInterface interface { + SendBlockToAllMySubscriber(blockPtr *BlockBase) + + Print() // For debugging + + // IMPORTANT: When connection manager (i.e. an implementation of + // this interface) receives a message with 'BlockBase', the + // manager should call + // + // ConsensusParticipant.OnBlockHeaderArrived(blockPtr *BlockBase) + // + // function. This is not currently enforced, but is required for the + // consensus to work properly. +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus.go new file mode 100644 index 00000000..eb790bb0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus.go @@ -0,0 +1,257 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +var Cfg_debug_block_duplicate bool = false +var Cfg_debug_block_out_of_sequence bool = true +var Cfg_debug_block_accepted bool = false +var Cfg_debug_HashCandidate bool = false + +// How many blocks we hold in memory. Older blocks are expected (not +// implemented yest as of 20160920) to be written to disk. +var Cfg_blockchain_tail_length int = 100 + +// To limit memory use and prevent some mild attacks: +var Cfg_consensus_candidate_max_seqno_gap uint64 = 10 + +// When to decide on selecting the best hash from BlockStat +// so that it can be moved to BlockChain: +var Cfg_consensus_waiting_time_as_seqno_diff uint64 = 7 + +// How many (hash,signer_pubkey) pairs to acquire for decision-making. +// This also limits forwarded traffic, because the messages in excess +// of this limit are discarded hence not forwarded: +//var Cfg_consensus_max_candidate_messages = 10 + +// +//////////////////////////////////////////////////////////////////////////////// +//var all_zero_hash = cipher.SHA256{} +//var all_zero_sig = cipher.Sig{} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockBase +// +//////////////////////////////////////////////////////////////////////////////// +type BlockBase struct { + Sig cipher.Sig + Hash cipher.SHA256 + Seqno uint64 +} + +//func (self *BlockBase) GetSig() cipher.Sig { return self.Sig } +//func (self *BlockBase) GetHash() cipher.SHA256 { return self.Hash } +//func (self *BlockBase) GetSeqno() uint64 { return self.Seqno } + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockBase) Init( + sig cipher.Sig, + hash cipher.SHA256, + seqno uint64) { + + self.Sig = sig + self.Hash = hash + self.Seqno = seqno +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockBase) Print() { + fmt.Printf("BlockBase={Sig=%s,Hash=%s,Seqno=%d}", + self.Sig.Hex()[:8], self.Hash.Hex()[:8], self.Seqno) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockBase) String() string { + return fmt.Sprintf("BlockBase={Sig=%s,Hash=%s,Seqno=%d}", + self.Sig.Hex()[:8], self.Hash.Hex()[:8], self.Seqno) +} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockchainTail is the most recent part of blockchain that is held in memory +// +//////////////////////////////////////////////////////////////////////////////// +type BlockchainTail struct { + // The tail of Blockchain that we keep. + // PERFORMANCE: TODO: Use a fixed-length double-ended queue + + blockPtr_slice []*BlockBase + // This is for a lookup of content + hash_to_blockPtr_map map[cipher.SHA256]*BlockBase +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) Init() { + self.hash_to_blockPtr_map = make(map[cipher.SHA256]*BlockBase) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) is_consistent() bool { + // TODO Validate + // blockPtr_slice + // and + // hash_to_blockPtr_map + // against each other + return true +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) append_nocheck(blockPtr *BlockBase) { + n := len(self.blockPtr_slice) + if n+1 > Cfg_blockchain_tail_length { + // Trim the size: + b0p := self.blockPtr_slice[0] + delete(self.hash_to_blockPtr_map, b0p.Hash) // pop 1 of 2 + b0p = nil + self.blockPtr_slice[0] = nil + self.blockPtr_slice = self.blockPtr_slice[1:] // pop 2 of 2 + } + // Append + self.hash_to_blockPtr_map[blockPtr.Hash] = blockPtr // push 1 of 2 + self.blockPtr_slice = append(self.blockPtr_slice, blockPtr) // push 2 of 2 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) try_append_to_BlockchainTail(blockPtr *BlockBase) int { + n := len(self.blockPtr_slice) + if n > 0 { + // Step 1 of 2: check for presence: + _, have := self.hash_to_blockPtr_map[blockPtr.Hash] + if have { + if Cfg_debug_block_duplicate { + // Duplicate hash detected. Silently ignore it. We + // expect to have this condition often enough. + fmt.Printf("Block is duplicate so ignored.\n") + } + return 1 // Duplicate hash + } + // Step 2 of 2: check for sequence numbers: + curr := self.blockPtr_slice[n-1].Seqno // Most recent + next := curr + 1 + prop := blockPtr.Seqno + if prop < next { // uint cmp + if Cfg_debug_block_out_of_sequence { + fmt.Printf("Block's seqno is too low (%d vs %d), block"+ + " ignored.\n", prop, curr) + } + return 2 // SeqNo too low + } else if prop > next { // uint cmp + if Cfg_debug_block_out_of_sequence { + fmt.Printf("Block's seqno is too high (%d vs %d), block"+ + " ignored.\n", prop, curr) + } + return 3 // SeqNo too high + } + } + self.append_nocheck(blockPtr) + if Cfg_debug_block_accepted { + fmt.Printf("Block is accepted, len(blockchain)=%d.\n", + len(self.blockPtr_slice)) + } + return 0 // Inserted +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) GetNextSeqNo() uint64 { + n := len(self.blockPtr_slice) + if n > 0 { + return 1 + self.blockPtr_slice[n-1].Seqno + } + return 1 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) Print() { + n := len(self.blockPtr_slice) + fmt.Printf("BlockchainTail={n=%d", n) + + for i := 0; i < n; i++ { + fmt.Print(",") + self.blockPtr_slice[i].Print() + } + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// HashCandidate +// +//////////////////////////////////////////////////////////////////////////////// +type HashCandidate struct { + pubkey2sig map[cipher.PubKey]cipher.Sig // Primary data + sig2none map[cipher.Sig]byte // Lookup without (expensive) pubkey recovery +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) Init() { + self.pubkey2sig = make(map[cipher.PubKey]cipher.Sig) + self.sig2none = make(map[cipher.Sig]byte) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) ObserveSigAndPubkey( + sig cipher.Sig, + pubkey cipher.PubKey) { + + if Cfg_debug_HashCandidate { + for k, v := range self.pubkey2sig { + fmt.Printf("HashCandidate %p pubkey2sig: pubkey=%s sig=%s\n", + self, k.Hex()[:8], v.Hex()[:8]) + } + for k, _ := range self.sig2none { + fmt.Printf("HashCandidate %p sig2none: sig=%s\n", self, k.Hex()[:8]) + } + } + + self.pubkey2sig[pubkey] = sig + self.sig2none[sig] = byte('1') + + n1 := len(self.pubkey2sig) + n2 := len(self.sig2none) + if n1 != n2 { + fmt.Printf("Inconsistent HashCandidate: n1=%d n2=%d\n", n1, n2) + panic("Oops") + } + +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) Clear() { + for i, _ := range self.pubkey2sig { + delete(self.pubkey2sig, i) + } + for i, _ := range self.sig2none { + delete(self.sig2none, i) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) is_consistent() bool { + // TODO: implement + // NOTE: sig <- (hash,pubkey) is not deterministic, + // so + // len(self.pubkey2sig) + // len(self.sig2none) + // are not necessarily the same, even if same 'hash' was signed. + // The code of class BlockStat prevents calling + // ObserveSigAndPubkey() using same 'pubkey' and different 'sig', so + // the two lengths should be the same. TODO: move this detection + // to this class. + + return true +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus_test.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus_test.go new file mode 100644 index 00000000..a5abc921 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus_test.go @@ -0,0 +1,208 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "testing" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" +) + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockchainTail_01(t *testing.T) { + bq := BlockchainTail{} + bq.Init() + if !bq.is_consistent() { + t.Log("BlockchainTail::is_consistent()") + t.Fail() + } +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockchainTail_02(t *testing.T) { + + bq := BlockchainTail{} + bq.Init() + + // Use more than configured length to ensure some elements are + // removed: + n := Cfg_blockchain_tail_length * 2 + + for i := 0; i < n; i++ { + x := secp256k1.RandByte(888) // Random data. + h := cipher.SumSHA256(x) // Its hash. + + b := BlockBase{Hash: h, Seqno: uint64(i)} // OK to leave '.sig' empty + + bq.append_nocheck(&b) + } + + if len(bq.blockPtr_slice) != Cfg_blockchain_tail_length { + t.Log("BlockchainTail::append_nocheck() incorrect append or remove.") + t.Fail() + } + + if !bq.is_consistent() { + t.Log("BlockchainTail::is_consistent()") + t.Fail() + } +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockchainTail_03(t *testing.T) { + + bq := BlockchainTail{} + bq.Init() + + h1 := cipher.SumSHA256(secp256k1.RandByte(888)) + b1 := BlockBase{Hash: h1, Seqno: 1} // OK to leave '.sig' empty + + r1 := bq.try_append_to_BlockchainTail(&b1) + if r1 != 0 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): initial insert failed.") + t.Fail() + } + if bq.GetNextSeqNo() != b1.Seqno+1 { + t.Log("BlockchainTail::GetNextSeqNo() failed.") + t.Fail() + } + + r1dup := bq.try_append_to_BlockchainTail(&b1) + if r1dup != 1 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): duplicate hash not detected.") + t.Fail() + } + + h2 := cipher.SumSHA256(secp256k1.RandByte(888)) + b2 := BlockBase{Hash: h2, Seqno: 2} // OK to leave '.sig' empty + + r2 := bq.try_append_to_BlockchainTail(&b2) + if r2 != 0 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): next insert failed.") + t.Fail() + } + if bq.GetNextSeqNo() != b2.Seqno+1 { + t.Log("BlockchainTail::GetNextSeqNo() failed.") + t.Fail() + } + + h3 := cipher.SumSHA256(secp256k1.RandByte(888)) + b3 := BlockBase{Hash: h3, Seqno: 0} // OK to leave '.sig' empty + + r3 := bq.try_append_to_BlockchainTail(&b3) + if r3 != 2 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): low seqno not detected. ret=", r3) + t.Fail() + } + + b3.Seqno = 4 + r4 := bq.try_append_to_BlockchainTail(&b3) + if r4 != 3 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): high seqno not detected.") + t.Fail() + } + +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockStat_01(t *testing.T) { + bs := BlockStat{} + bs.Init() + + _, seckey := cipher.GenerateKeyPair() + hash := cipher.SumSHA256(secp256k1.RandByte(888)) + sig := cipher.MustSignHash(hash, seckey) + + var r int = -1 + + r = bs.try_add_hash_and_sig(hash, cipher.Sig{}) + if r != 4 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect invalid signature.") + t.Fail() + } + r = bs.try_add_hash_and_sig(cipher.SHA256{}, sig) + if r != 4 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect invalid hash and signature.") + t.Fail() + } + r = bs.try_add_hash_and_sig(cipher.SHA256{}, cipher.Sig{}) + if r != 4 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect invalid hash and signature.") + t.Fail() + } + + //signer_pubkey, err := cipher.PubKeyFromSig(cipher.Sig{}, cipher.SHA256{}) + //if err != nil { + //fmt.Printf("Got pubkey='%s' from all-zero sig and all-zero hash.\n", signer_pubkey.Hex()) + //} + + bs.frozen = true + r2 := bs.try_add_hash_and_sig(hash, sig) + if r2 != 3 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect frozen.") + t.Fail() + } + bs.frozen = false + + r3 := bs.try_add_hash_and_sig(hash, sig) + if r3 != 0 { + t.Log("BlockStat::try_add_hash_and_sig() failed to add.") + t.Fail() + } + + sig2 := cipher.MustSignHash(hash, seckey) // Redo signing. + r4 := bs.try_add_hash_and_sig(hash, sig2) + if r4 != 1 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect duplicate (hash,pubkey).") + t.Fail() + } + + r5 := bs.try_add_hash_and_sig(hash, sig) + if r5 != 1 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect duplicate (hash,sig).") + t.Fail() + } + +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockStat_02(t *testing.T) { + bs := BlockStat{} + bs.Init() + + hash1 := cipher.SumSHA256(secp256k1.RandByte(888)) + n1 := 3 + + for i := 0; i < n1; i++ { + _, seckey := cipher.GenerateKeyPair() + sig := cipher.MustSignHash(hash1, seckey) + bs.try_add_hash_and_sig(hash1, sig) + } + + hash2 := cipher.SumSHA256(secp256k1.RandByte(888)) + n2 := 2 + + for i := 0; i < n2; i++ { + _, seckey := cipher.GenerateKeyPair() + sig := cipher.MustSignHash(hash2, seckey) + bs.try_add_hash_and_sig(hash2, sig) + } + + hash3 := cipher.SumSHA256(secp256k1.RandByte(888)) + n3 := 1 + + for i := 0; i < n3; i++ { + _, seckey := cipher.GenerateKeyPair() + sig := cipher.MustSignHash(hash3, seckey) + bs.try_add_hash_and_sig(hash3, sig) + } + + best_hash, _, _ := bs.GetBestHashPubkeySig() + if best_hash != hash1 { + t.Log("BlockStat::try_add_hash_and_sig() or BlockStat::GetBestHashPubkeySig() issue.") + t.Fail() + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/README.md b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/README.md new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/README.md @@ -0,0 +1 @@ + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example.go new file mode 100644 index 00000000..d1630d78 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example.go @@ -0,0 +1,768 @@ +// +build ignore + +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package main + +// +// WARNING: WARNING: WARNING: Do NOT use this code for obtaining any +// research results. This file is only an illustration. A realistic +// simulation would require to have (i) nonzero latencies for event +// propagation and (ii) an event queue inside the implementation of +// MeshNetworkInterface. +// + +import ( + "flag" + "fmt" + mathrand "math/rand" + "os" + "sort" + + // + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/consensus" +) + +var Cfg_print_config bool = true +var Cfg_debug_connect_request bool = false +var Cfg_debug_node_final_state bool = false +var Cfg_debug_node_summary bool = false +var Cfg_debug_show_block_maker bool = false + +var Cfg_simu_topology_is_random bool = true + +var Cfg_simu_num_node int = 100 +var Cfg_simu_num_blockmaker int = 10 +var Cfg_simu_prob_malicious float64 = 0.0 +var Cfg_simu_prob_duplicate float64 = 0.0 + +var Cfg_simu_num_block_round int = 10 +var Cfg_simu_fanout_per_node int = 3 + +// Will be reset later, based on values of other parameters: +var Cfg_simu_num_iter int = 0 + +//////////////////////////////////////////////////////////////////////////////// +type MinimalConnectionManager struct { + theNodePtr *consensus.ConsensusParticipant + // + publisher_key_list []*MinimalConnectionManager + subscriber_key_list []*MinimalConnectionManager +} + +func (self *MinimalConnectionManager) GetNode() *consensus.ConsensusParticipant { + return self.theNodePtr +} +func (self *MinimalConnectionManager) RegisterPublisher(key *MinimalConnectionManager) bool { + + self.publisher_key_list = append(self.publisher_key_list, key) + return true +} +func (self *MinimalConnectionManager) SendBlockToAllMySubscriber(blockPtr *consensus.BlockBase) { + for _, p := range self.subscriber_key_list { + p.GetNode().OnBlockHeaderArrived(blockPtr) + } +} +func (self *MinimalConnectionManager) RequestConnectionToAllMyPublisher() { + for _, p := range self.publisher_key_list { + p.OnSubscriberConnectionRequest(self) + } +} +func (self *MinimalConnectionManager) OnSubscriberConnectionRequest(other *MinimalConnectionManager) { + self.subscriber_key_list = append(self.subscriber_key_list, other) +} +func (self *MinimalConnectionManager) Print() { + detail := false + + fmt.Printf("ConnectionManager={publisher={n=%d", + len(self.publisher_key_list)) + + if detail { + for _, val := range self.publisher_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") + + fmt.Printf(",subscriber={n=%d", len(self.subscriber_key_list)) + if detail { + for _, val := range self.subscriber_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +func pretty_print_flags(prefix string, detail bool) { + if detail { + + max1 := 0 + max2 := 0 + + flag.VisitAll(func(f *flag.Flag) { + len1 := len(f.Name) + len2 := len(fmt.Sprintf("%v", f.Value)) + if max1 < len1 { + max1 = len1 + } + if max2 < len2 { + max2 = len2 + } + }) + + format := fmt.Sprintf(" --%%-%ds %%%dv %%s\n", max1, max2) + format = "%s" + format + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf(format, prefix, f.Name, f.Value, f.Usage) + }) + + } else { + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf("%s--%s=%v\n", prefix, f.Name, f.Value) + }) + + } +} + +//////////////////////////////////////////////////////////////////////////////// +func cmd_line_args_process() { + + var ip *int = nil + var qp *uint64 = nil + var dp *float64 = nil + var bp *bool = nil + + // + // Simulation parameters + // + ip = &Cfg_simu_num_node + flag.IntVar(ip, "simu-num-nodes", *ip, "Number of nodes in the network.") + + ip = &Cfg_simu_num_blockmaker + flag.IntVar(ip, "simu-num-blockmaker", *ip, + "Number of nodes in the network that make blocks.") + + dp = &Cfg_simu_prob_malicious + flag.Float64Var(dp, "simu-prob-malicious", *dp, + "Probability that a node temporarily joins a malicious group that"+ + " publishes same block in order to cause a fork of the blockchain.") + + dp = &Cfg_simu_prob_duplicate + flag.Float64Var(dp, "simu-prob-duplicate", *dp, + "Probability that a node sends a duplicate message with same hash but"+ + " different signature. (Duplicate (hash,sig) pairs are easily"+ + " detected and discarded.)") + + ip = &Cfg_simu_num_block_round + flag.IntVar(ip, "simu-num-rounds", *ip, + "Number of block rounds. When all them are published and the"+ + " resulting messages propagate, the simulation ends.") + + ip = &Cfg_simu_fanout_per_node + flag.IntVar(ip, "simu-fanout-per-node", *ip, + "Number of incoming (and outgoing) connections to (and from) each"+ + " node.") + + bp = &Cfg_debug_connect_request + flag.BoolVar(bp, "debug-connect-request", *bp, "") + + bp = &Cfg_print_config + flag.BoolVar(bp, "print-config", *bp, "") + + bp = &Cfg_debug_node_final_state + flag.BoolVar(bp, "debug-node-final-state", *bp, "") + + bp = &Cfg_debug_node_summary + flag.BoolVar(bp, "debug-node-summary", *bp, "") + + bp = &Cfg_debug_show_block_maker + flag.BoolVar(bp, "debug-show-block-maker", *bp, "") + + bp = &Cfg_simu_topology_is_random + flag.BoolVar(bp, "simu-topology-is-random", *bp, + "Connect nodes randomly or place them in one circle.") + + // + // Consensus parameters + // + + bp = &consensus.Cfg_debug_block_duplicate + flag.BoolVar(bp, "debug-block-duplicate", *bp, "") + + bp = &consensus.Cfg_debug_block_out_of_sequence + flag.BoolVar(bp, "debug-block-out-of-sequence", *bp, "") + + bp = &consensus.Cfg_debug_block_accepted + flag.BoolVar(bp, "debug-block-accepted", *bp, "") + + bp = &consensus.Cfg_debug_HashCandidate + flag.BoolVar(bp, "debug-hash-candidate", *bp, "") + + ip = &consensus.Cfg_blockchain_tail_length + flag.IntVar(ip, "blockchain-tail-length", *ip, + "Blocks held in memory. This limits memory usage.") + + qp = &consensus.Cfg_consensus_candidate_max_seqno_gap + flag.Uint64Var(qp, "consensus-candidate-max-seqno-gap", *qp, + "Proposed blocks (or consensus candidates) are ignored if theie seqno"+ + " is too high or too low w.r.t. what is stored. This limits memory"+ + " use and helps prevents some mild attacks.") + + qp = &consensus.Cfg_consensus_waiting_time_as_seqno_diff + flag.Uint64Var(qp, "consensus-waiting-time-as-seqno-diff", *qp, + "When to decide on selecting the best hash from BlockStat"+ + " so that it can be moved to blockchain.") + + ip = &consensus.Cfg_consensus_max_candidate_messages + flag.IntVar(ip, "consensus-max-candidate-messages", *ip, + "How many (hash,signer_pubkey) pairs to acquire for decision-making."+ + " This also limits forwarded traffic, because the messages in excess"+ + " of this limit are discarded hence not forwarded.") + + // + // + // + show := flag.Bool("show", false, "Show current parameter values and exit.") + + // + // + flag.Parse() + // + // + + if Cfg_simu_num_node < Cfg_simu_num_blockmaker { + fmt.Printf("Invalid input: --simu-num-nodes=%d < --simu-num-blockmaker="+ + "%d. Exiting.\n", Cfg_simu_num_node, Cfg_simu_num_blockmaker) + os.Exit(1) + } + + if Cfg_simu_prob_malicious < 0. || 1 < Cfg_simu_prob_malicious { + fmt.Printf("Invalid input: --simu-prob-malicious=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + if Cfg_simu_prob_duplicate < 0. || 1 < Cfg_simu_prob_duplicate { + fmt.Printf("Invalid input: --simu-prob-duplicate=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + // + // Derived parameters + // + + // Most likely we do not need that many. However, we keep the + // number high so it would not interfere with message propagation + // by premature exit from the vent loop. Yet we keep it finite to + // prevent an infinite run that can be caused by a bug: + + Cfg_simu_num_iter = 10 * // '10' is a heuristic + Cfg_simu_num_node * Cfg_simu_num_blockmaker * + Cfg_simu_num_block_round * Cfg_simu_fanout_per_node + + if *show { + pretty_print_flags("", true) + os.Exit(1) + } else { + if Cfg_print_config { + pretty_print_flags("FILE_Config.txt|", false) + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// The body of this function lends itself to something like +// +// ConsensusParticipant::BuildAndPropagateNewBlock() +// +// Before doing so, ConsensusParticipant would need to accumulate +// transactions, possibly negotiate with others as to who makes blocks +// etc. FOR NOW, any node can make (and publish) blocks. +// +func propagate_hash_from_node( + h cipher.SHA256, + nodePtr *consensus.ConsensusParticipant, + external_use bool, + external_seqno uint64) { + + // + // WARNING: Do NOT use this code for obtaining any research + // results. This file is only an illustration. A realistic + // simulation require to have nonzero latencies for event + // propagation and to have an event queueu inside the + // implementation of MeshNetworkInterface. + // + + o := external_seqno // HACK for DEBUGGING + if !external_use { + o = nodePtr.GetNextBlockSeqNo() // So that blocks are ordered. + } + + b := consensus.BlockBase{} + b.Init( + nodePtr.SignatureOf(h), // Signature of hash. + h, + o) + + nodePtr.OnBlockHeaderArrived(&b) +} + +//////////////////////////////////////////////////////////////////////////////// +func print_stat(X []*MinimalConnectionManager, + iter int) { + + n := 0 + for i, _ := range X { + n += X[i].GetNode().Incoming_block_count + } + + msg_per_node_per_round := + float64(n) / float64(Cfg_simu_num_node*Cfg_simu_num_block_round) + + msg_per_node_per_round_per_link := msg_per_node_per_round / + float64(Cfg_simu_fanout_per_node) + + msg_per_node_per_round_per_blockmaker := msg_per_node_per_round / + float64(Cfg_simu_num_blockmaker) + + // Print for viewing: + fmt.Printf( + "MSG_STAT iter %d\n"+ + "MSG_STAT msg_count_all %d\n"+ + "MSG_STAT num_node %d\n"+ + "MSG_STAT num_blockmaker %d\n"+ + "MSG_STAT num_block_round %d\n"+ + "MSG_STAT fanout_per_node %d\n"+ + "MSG_STAT max_candidate_messages %d (This limits the effect of"+ + " having large num_blockmaker)\n"+ + "MSG_STAT msg_per_node_per_round %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_link %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_blockmaker %.3f\n", + iter, n, Cfg_simu_num_node, Cfg_simu_num_blockmaker, + Cfg_simu_num_block_round, Cfg_simu_fanout_per_node, + consensus.Cfg_consensus_max_candidate_messages, + msg_per_node_per_round, + msg_per_node_per_round_per_link, + msg_per_node_per_round_per_blockmaker) + +} + +//////////////////////////////////////////////////////////////////////////////// +func Simulate_compare_node_StateQueue( + X []*MinimalConnectionManager, + global_seqno2h map[uint64]cipher.SHA256, + global_seqno2h_alt map[uint64]cipher.SHA256, +) { + // + // Step 1 of 3: for each observed seqno, find the histogram of + // 'best' hash. The historgam is formed by summing over nodes. + // + type QQQ map[uint64]map[cipher.SHA256]int + xxx := make(QQQ) // Access: [seqno][hash]=count + type ZZZ []QQQ // Access: [node][seqno][hash]=count + + ni := len(X) + + zzz := make(ZZZ, ni) + + for i := 0; i < ni; i++ { // Nodes + nj := X[i].GetNode().Get_block_stat_queue_Len() + + zzz[i] = make(map[uint64]map[cipher.SHA256]int) + + for j := 0; j < nj; j++ { // Elements in node's BlockStatQueue + + // 'bs' a pointer: + bs := X[i].GetNode().Get_block_stat_queue_element_at(j) + seqno := bs.GetSeqno() + hash, _, _ := bs.GetBestHashPubkeySig() + + if _, have := xxx[seqno]; !have { + xxx[seqno] = make(map[cipher.SHA256]int) + } + xxx[seqno][hash]++ + + if _, have := zzz[i][seqno]; !have { + zzz[i][seqno] = make(map[cipher.SHA256]int) + } + zzz[i][seqno][hash]++ + } + } + // + // Step 2 of 3. For each seqno, find the most-frequently observed + // hash. Also, find the ratio of blocks accepted to blocks + // published. + // + yyy := make(map[uint64]cipher.SHA256) // Access: [seqno]=hash + + var accept_count int = 0 + var total_count int = 0 + + for seqno, hash2count := range xxx { + var best_count int = 0 + var sum_count int = 0 + var best_hash cipher.SHA256 // undef + + initialized := false + + for hash, count := range hash2count { + if initialized { + if best_count < count { + best_count = count + best_hash = hash + } + } else { + initialized = true + + best_count = count + best_hash = hash + } + sum_count += count + } + + if initialized { + yyy[seqno] = best_hash + + // Here all 'seqno' contribute equally: + accept_count += best_count + total_count += sum_count + } + } + + if true { + keys := []int{} + for seqno, _ := range yyy { + keys = append(keys, int(seqno)) + } + + sort.Ints(keys) + + for _, key := range keys { + seqno := uint64(key) + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + + prescribed := best_hash == global_seqno2h[seqno] + malicious := best_hash == global_seqno2h_alt[seqno] + + fmt.Printf("CONSENSUS: seqno=%d best_hash=%s prescribed=%t"+ + " malicious=%t\n", seqno, best_hash.Hex()[:8], prescribed, + malicious) + } + + } + fmt.Printf("CONSENSUS: total_count=%d accept_count=%d, accept_ratio=%f\n", + total_count, accept_count, float32(accept_count)/float32(total_count)) + + for i, zzz_i := range zzz { + join_count := 0 // How many have selected the most popular hash. + other_count := 0 // How many have selected NOT the most popular. + prescribed_count := 0 // How many have selected the intended hash. + malicious_count := 0 // How many have selected the malicious hash. + + for seqno, hash2count := range zzz_i { + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + prescribed := global_seqno2h[seqno] + malicious := global_seqno2h_alt[seqno] + + for hash, count := range hash2count { + if hash == best_hash { + join_count += count + } else { + other_count += count + } + + if hash == prescribed { + prescribed_count += count + } + if hash == malicious { + malicious_count += count + } + } + } + + fmt.Printf("NODE i=%d join_count=%d other_count=%d prescribed_count="+ + "%d malicious_count=%d\n", + i, join_count, other_count, prescribed_count, malicious_count) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func get_random_index_subset(N int, S int) []int { + // N - population size + // S - subset size + + if N < 0 { + N = 0 + } + if S < 0 { + S = 0 + } + if S > N { + S = N + } + + index_map := make(map[int]int, S) + if 2*S < N { + // Include at random + for i := 0; i < 3*S; i++ { // '3' is a heuristic + if len(index_map) >= S { + break + } + index_map[mathrand.Intn(N)] = 1 + } + } else { + // Fill up + for i := 0; i < N; i++ { + index_map[i] = 1 + } + n := N - S + // Exclude at random + for i := 0; i < 3*n; i++ { // '3' is a heuristic + if len(index_map) <= S { + break + } + delete(index_map, mathrand.Intn(N)) + } + } + + keys := []int{} + + for k, _ := range index_map { + keys = append(keys, k) + } + + return keys +} + +//////////////////////////////////////////////////////////////////////////////// +// +// main +// +//////////////////////////////////////////////////////////////////////////////// +func main() { + + cmd_line_args_process() + + // PERFORMANCE: + cipher.DebugLevel1 = false + cipher.DebugLevel2 = false + + var X []*MinimalConnectionManager + + var hack_global_seqno uint64 = 0 + + seed := "hdhdhdkjashfy7273" + _, SecKeyArray := + cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), Cfg_simu_num_node) + + for i := 0; i < Cfg_simu_num_node; i++ { + cm := MinimalConnectionManager{} + // Reason for mutual registration: (1) when conn man receives + // messages, it needs to notify the node; (2) when node has + // processed a mesage, it might need to use conn man to send + // some data out. + nodePtr := consensus.NewConsensusParticipantPtr(&cm) + s := SecKeyArray[i] + nodePtr.SetPubkeySeckey(cipher.PubKeyFromSecKey(s), s) + + cm.theNodePtr = nodePtr + + X = append(X, &cm) + } + if false { + fmt.Printf("Got %d nodes\n", len(X)) + } + + if Cfg_simu_topology_is_random { + + fmt.Printf("CONFIG Topology: connecting %d nodes randomly with approx"+ + " %d nearest-neighbors in and approx %d nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + for i, _ := range X { + cm := X[i] + for g := 0; g < Cfg_simu_fanout_per_node; g++ { + j := mathrand.Intn(Cfg_simu_num_node) + if i != j { + cm.RegisterPublisher(X[j]) + } + } + } + } else { + + fmt.Printf("CONFIG Topology: connecting %d nodes via one (thick)"+ + " circle with approx %d nearest-neighbors in and approx %d "+ + "nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + n := len(X) + for i := 0; i < n; i++ { + + cm := X[i] + + c_left := int(Cfg_simu_fanout_per_node / 2) + c_right := Cfg_simu_fanout_per_node - c_left + + for c := 0; c < c_left; c++ { + j := (i - 1 - c + n) % n + cm.RegisterPublisher(X[j]) + } + + for c := 0; c < c_right; c++ { + j := (i + 1 + c) % n + cm.RegisterPublisher(X[j]) + } + } + } + + // Connect. PROD: This should request connections. The + // connections can be accepted, rejected or never answered. Such + // replies are asynchronous. SIMU: we connect synchronously. + for i, _ := range X { + X[i].RequestConnectionToAllMyPublisher() + } + + global_seqno2h := make(map[uint64]cipher.SHA256) + global_seqno2h_alt := make(map[uint64]cipher.SHA256) + + iter := 0 + block_round := 0 + done_processing_messages := false + for ; iter < Cfg_simu_num_iter; iter++ { + + if true { + if block_round < Cfg_simu_num_block_round { + + // NOTE: Propagating blocks from here is a + // simplification/HACK: it implies that we have + // knowledge of when messaging due to previous + // activity (blocks and connections) has + // stopped. Again, we make blocks from here for + // debugging and testing only. + + //x := secp256k1.RandByte(888) // Random data in SIMU. + x := make([]byte, 888) + mathrand.Read(x) + + h := cipher.SumSHA256(x) // Its hash. + + //x_alt := secp256k1.RandByte(888) // Random data in SIMU. + x_alt := make([]byte, 888) + mathrand.Read(x) + h_alt := cipher.SumSHA256(x_alt) // Its hash. + + global_seqno2h[hack_global_seqno] = h + global_seqno2h_alt[hack_global_seqno] = h_alt + + indices := get_random_index_subset(Cfg_simu_num_node, + Cfg_simu_num_blockmaker) + + if Cfg_debug_show_block_maker { + fmt.Printf("block_round=%d, Random indices of block-"+ + "makers: %v\n", block_round, indices) + } + + n_forkers := int(Cfg_simu_prob_malicious * float64(len(indices))) + + for i := 0; i < len(indices); i++ { + // TODO: Have many nodes send same block, and a few nodes + // send a different block. Research the conditions under + // which the block published by the majority would + // dominate the other one. + index := indices[i] + nodePtr := X[index].GetNode() + + malicious := (i < n_forkers) + duplicate := (mathrand.Float64() < Cfg_simu_prob_duplicate) + + ph := &h + if malicious { + ph = &h_alt + } + + rep := 1 + if duplicate { + rep = 2 + } + + // + // WARNING: In a reslistic simulation, one would + // need to remove the assumption of knowing global + // properties such as 'hack_global_seqno' + // + if malicious { + fmt.Printf(">>>>>> NODE (index,pubkey)=(%d,%s) is"+ + " publishing ALTERNATIVE block\n", index, + nodePtr.Pubkey.Hex()[:8]) + } + + for j := 0; j < rep; j++ { + // Signing same hash multiple times produces different + // signatures (for a good reason). We do it + // here to test if malicious re-publishing is + // detected properly. + propagate_hash_from_node(*ph, nodePtr, true, + hack_global_seqno) + } + } + + hack_global_seqno += 1 + block_round += 1 + } else { + done_processing_messages = true + break // <<<<<<<< + } + } + } + + zzz := "done" + if !done_processing_messages { + zzz = "***NOT done***" + } + + fmt.Printf("Done (i) making Blocks, %s (ii) processing responses."+ + " See stats on the next few lines. Used iterations=%d, unused"+ + " iterations=%d. Exiting the event loop now.\n", + zzz, iter, Cfg_simu_num_iter-iter) + + print_stat(X, iter) + + if Cfg_debug_node_final_state { + for i, _ := range X { + fmt.Printf("FILE_FinalState.txt|NODE i=%d ", i) + X[i].GetNode().Print() + fmt.Printf("\n") + } + } + + if Cfg_debug_node_summary { + Simulate_compare_node_StateQueue(X, global_seqno2h, global_seqno2h_alt) + } +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_gnet.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_gnet.go new file mode 100644 index 00000000..3193d1eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_gnet.go @@ -0,0 +1,1043 @@ +// +build ignore + +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package main + +// +// WARNING: WARNING: WARNING: Do NOT use this code for obtaining any +// research results. This file is only an illustration. A realistic +// simulation would require to have (i) nonzero latencies for event +// propagation and (ii) an event queue inside the implementation of +// MeshNetworkInterface. +// + +import ( + "flag" + "fmt" + "log" + mathrand "math/rand" + "os" + "sort" + "time" + + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + // + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/consensus" +) + +var Cfg_print_config bool = true +var Cfg_debug_connect_request bool = false +var Cfg_debug_node_final_state bool = false +var Cfg_debug_node_summary bool = false +var Cfg_debug_show_block_maker bool = false + +var Cfg_simu_topology_is_random bool = true + +var Cfg_simu_num_node int = 10 +var Cfg_simu_num_blockmaker int = 2 +var Cfg_simu_prob_malicious float64 = 0.0 +var Cfg_simu_prob_duplicate float64 = 0.0 + +var Cfg_simu_num_block_round int = 10 +var Cfg_simu_fanout_per_node int = 3 + +// Will be reset later, based on values of other parameters: +var Cfg_simu_num_iter int = 0 + +var common_channel uint16 = 3 + +//////////////////////////////////////////////////////////////////////////////// +func pretty_print_flags(prefix string, detail bool) { + if detail { + + max1 := 0 + max2 := 0 + + flag.VisitAll(func(f *flag.Flag) { + len1 := len(f.Name) + len2 := len(fmt.Sprintf("%v", f.Value)) + if max1 < len1 { + max1 = len1 + } + if max2 < len2 { + max2 = len2 + } + }) + + format := fmt.Sprintf(" --%%-%ds %%%dv %%s\n", max1, max2) + format = "%s" + format + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf(format, prefix, f.Name, f.Value, f.Usage) + }) + + } else { + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf("%s--%s=%v\n", prefix, f.Name, f.Value) + }) + + } +} + +//////////////////////////////////////////////////////////////////////////////// +func cmd_line_args_process() { + + var ip *int = nil + var qp *uint64 = nil + var dp *float64 = nil + var bp *bool = nil + + // + // Simulation parameters + // + ip = &Cfg_simu_num_node + flag.IntVar(ip, "simu-num-nodes", *ip, "Number of nodes in the network.") + + ip = &Cfg_simu_num_blockmaker + flag.IntVar(ip, "simu-num-blockmaker", *ip, + "Number of nodes in the network that make blocks.") + + dp = &Cfg_simu_prob_malicious + flag.Float64Var(dp, "simu-prob-malicious", *dp, + "Probability that a node temporarily joins a malicious group that"+ + " publishes same block in order to cause a fork of the blockchain.") + + dp = &Cfg_simu_prob_duplicate + flag.Float64Var(dp, "simu-prob-duplicate", *dp, + "Probability that a node sends a duplicate message with same hash but"+ + " different signature. (Duplicate (hash,sig) pairs are easily"+ + " detected and discarded.)") + + ip = &Cfg_simu_num_block_round + flag.IntVar(ip, "simu-num-rounds", *ip, + "Number of block rounds. When all them are published and the"+ + " resulting messages propagate, the simulation ends.") + + ip = &Cfg_simu_fanout_per_node + flag.IntVar(ip, "simu-fanout-per-node", *ip, + "Number of incoming (and outgoing) connections to (and from) each"+ + " node.") + + bp = &Cfg_debug_connect_request + flag.BoolVar(bp, "debug-connect-request", *bp, "") + + bp = &Cfg_print_config + flag.BoolVar(bp, "print-config", *bp, "") + + bp = &Cfg_debug_node_final_state + flag.BoolVar(bp, "debug-node-final-state", *bp, "") + + bp = &Cfg_debug_node_summary + flag.BoolVar(bp, "debug-node-summary", *bp, "") + + bp = &Cfg_debug_show_block_maker + flag.BoolVar(bp, "debug-show-block-maker", *bp, "") + + bp = &Cfg_simu_topology_is_random + flag.BoolVar(bp, "simu-topology-is-random", *bp, + "Connect nodes randomly or place them in one circle.") + + // + // Consensus parameters + // + + bp = &consensus.Cfg_debug_block_duplicate + flag.BoolVar(bp, "debug-block-duplicate", *bp, "") + + bp = &consensus.Cfg_debug_block_out_of_sequence + flag.BoolVar(bp, "debug-block-out-of-sequence", *bp, "") + + bp = &consensus.Cfg_debug_block_accepted + flag.BoolVar(bp, "debug-block-accepted", *bp, "") + + bp = &consensus.Cfg_debug_HashCandidate + flag.BoolVar(bp, "debug-hash-candidate", *bp, "") + + ip = &consensus.Cfg_blockchain_tail_length + flag.IntVar(ip, "blockchain-tail-length", *ip, + "Blocks held in memory. This limits memory usage.") + + qp = &consensus.Cfg_consensus_candidate_max_seqno_gap + flag.Uint64Var(qp, "consensus-candidate-max-seqno-gap", *qp, + "Proposed blocks (or consensus candidates) are ignored if theie seqno"+ + " is too high or too low w.r.t. what is stored. This limits memory"+ + " use and helps prevents some mild attacks.") + + qp = &consensus.Cfg_consensus_waiting_time_as_seqno_diff + flag.Uint64Var(qp, "consensus-waiting-time-as-seqno-diff", *qp, + "When to decide on selecting the best hash from BlockStat"+ + " so that it can be moved to blockchain.") + + ip = &consensus.Cfg_consensus_max_candidate_messages + flag.IntVar(ip, "consensus-max-candidate-messages", *ip, + "How many (hash,signer_pubkey) pairs to acquire for decision-making."+ + " This also limits forwarded traffic, because the messages in excess"+ + " of this limit are discarded hence not forwarded.") + + // + // + // + show := flag.Bool("show", false, "Show current parameter values and exit.") + + // + // + flag.Parse() + // + // + + if Cfg_simu_num_node < Cfg_simu_num_blockmaker { + fmt.Printf("Invalid input: --simu-num-nodes=%d < --simu-num-blockmaker="+ + "%d. Exiting.\n", Cfg_simu_num_node, Cfg_simu_num_blockmaker) + os.Exit(1) + } + + if Cfg_simu_prob_malicious < 0. || 1 < Cfg_simu_prob_malicious { + fmt.Printf("Invalid input: --simu-prob-malicious=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + if Cfg_simu_prob_duplicate < 0. || 1 < Cfg_simu_prob_duplicate { + fmt.Printf("Invalid input: --simu-prob-duplicate=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + // + // Derived parameters + // + + // Most likely we do not need that many. However, we keep the + // number high so it would not interfere with message propagation + // by premature exit from the vent loop. Yet we keep it finite to + // prevent an infinite run that can be caused by a bug: + + Cfg_simu_num_iter = 10 * // '10' is a heuristic + Cfg_simu_num_node * Cfg_simu_num_blockmaker * + Cfg_simu_num_block_round * Cfg_simu_fanout_per_node + + if *show { + pretty_print_flags("", true) + os.Exit(1) + } else { + if Cfg_print_config { + pretty_print_flags("FILE_Config.txt|", false) + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// The body of this function lends itself to something like +// +// ConsensusParticipant::BuildAndPropagateNewBlock() +// +// Before doing so, ConsensusParticipant would need to accumulate +// transactions, possibly negotiate with others as to who makes blocks +// etc. FOR NOW, any node can make (and publish) blocks. +// +func propagate_hash_from_node( + h cipher.SHA256, + nodePtr *consensus.ConsensusParticipant, + external_use bool, + external_seqno uint64) { + + // + // WARNING: Do NOT use this code for obtaining any research + // results. This file is only an illustration. A realistic + // simulation require to have nonzero latencies for event + // propagation and to have an event queueu inside the + // implementation of MeshNetworkInterface. + // + + o := external_seqno // HACK for DEBUGGING + if !external_use { + o = nodePtr.GetNextBlockSeqNo() // So that blocks are ordered. + } + + b := consensus.BlockBase{} + b.Init( + nodePtr.SignatureOf(h), // Signature of hash. + h, + o) + + nodePtr.OnBlockHeaderArrived(&b) +} + +//////////////////////////////////////////////////////////////////////////////// +// MESSAGE +type BlockBaseWrapper struct { + consensus.BlockBase +} + +func (self *BlockBaseWrapper) String() string { + return fmt.Sprintf("BlockBaseWrapper={Sig=%s,Hash=%s,Seqno=%d}", + self.Sig.Hex()[:8], self.Hash.Hex()[:8], self.Seqno) +} +func (self *BlockBaseWrapper) Handle(context *gnet.MessageContext, closure interface{}) error { + + if false { + fmt.Printf("@@@ consensus.BlockBase Handle: context={%v} closure={%v} data={%v}\n", context, closure, self) + } + + arg := closure.(*PoolOwner) + arg.DataCallback(context, self) + return nil +} + +//array of messages to register +var messageMap map[string](interface{}) = map[string](interface{}){ + "id01": BlockBaseWrapper{}, //message id, message type +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +type PoolOwner struct { + pCMan *MinimalConnectionManager + + pDispatcherManager *gnet.DispatcherManager + pDispatcher *gnet.Dispatcher + pConnectionPool *gnet.ConnectionPool + // + isConnSolicited map[string]bool // Addr -> bool + // + key_list []string // To preserve the order. + key_map map[string]byte // To avoid duplicates. + // + debug_num_id int + debug_nickname string +} + +func (self *PoolOwner) Shutdown() { + self.pConnectionPool.Shutdown() +} + +func (self *PoolOwner) Init(pCMan *MinimalConnectionManager, listen_port uint16, num_id int, nickname string) { + + config := gnet.NewConfig() + config.Port = uint16(listen_port) + + cp := gnet.NewConnectionPool(config) + + dm := gnet.NewDispatcherManager() + + self.isConnSolicited = make(map[string]bool) + + cp.Config.MessageCallback = dm.OnMessage + cp.Config.ConnectCallback = self.OnConnect + cp.Config.DisconnectCallback = self.OnDisconnect + + d := dm.NewDispatcher(cp, common_channel, self) + d.RegisterMessages(messageMap) + + self.pCMan = pCMan + self.pDispatcherManager = dm + self.pDispatcher = d + self.key_map = make(map[string]byte) + self.pConnectionPool = cp + + self.debug_num_id = num_id + self.debug_nickname = nickname +} + +func (self *PoolOwner) Run() { + + cp := self.pConnectionPool // alias + + if cp.Config.Port != 0 { + if err := cp.StartListen(); err != nil { + log.Panic(err) + } + go cp.AcceptConnections() + } + + go func() { + for true { + // [JSM] 20161025 The 'Sleep' below is a workaround of + // unresolve concurrency issues in file gnet/pool.go + // class ConnectionPool. + time.Sleep(time.Millisecond * 1) + cp.HandleMessages() + } + }() + +} +func (self *PoolOwner) DataCallback(context *gnet.MessageContext, xxx *BlockBaseWrapper) { + + if self.isConnSolicited[context.Conn.Addr()] { + + var msg consensus.BlockBase + msg.Sig = xxx.Sig + msg.Hash = xxx.Hash + msg.Seqno = xxx.Seqno + + self.pCMan.GetNode().OnBlockHeaderArrived(&msg) + + } else { + // Ignoring + } +} +func (self *PoolOwner) OnConnect(c *gnet.Connection, is_solicited bool) { + self.isConnSolicited[c.Addr()] = is_solicited + + if false { + for channel, pDispatcher := range self.pDispatcherManager.Dispatchers { + // (BTW, pDispatcher.ReceivingObject is '&PoolOwner') + + // Each channel (or subscription subject) might require + // specific action to be taken on connect, such as request + // initial values from solicited, authenticate the client + // from unsolicited one etc. + _ = channel + _ = pDispatcher + } + } +} +func (self *PoolOwner) OnDisconnect(c *gnet.Connection, reason gnet.DisconnectReason) { + + if false { + for channel, pDispatcher := range self.pDispatcherManager.Dispatchers { + // (BTW, pDispatcher.ReceivingObject is '&PoolOwner') + + // Each channel (or subscription subject) might require + // specific action to be taken on disconnect, such as + // reconnect, clean up etc. + _ = channel + _ = pDispatcher + } + } + + delete(self.isConnSolicited, c.Addr()) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *PoolOwner) RequestConnectionToKeys() { + for _, key := range self.key_list { + go func(arg string) { + _, err := self.BlockingConnectToUrl(arg) + if err != nil { + log.Panic(err) + } + }(key) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *PoolOwner) RegisterKey(key string) bool { + + if _, have := self.key_map[key]; have { + return false // Let caller handle his issues. + } + + self.key_list = append(self.key_list, key) + self.key_map[key] = byte('1') + + return true + +} +func (self *PoolOwner) GetListenPort() uint16 { + return self.pDispatcher.Pool.Config.Port +} +func (self *PoolOwner) BlockingConnectTo(IPAddress string, port uint16) (*gnet.Connection, error) { + url := fmt.Sprintf("%s:%d", IPAddress, port) + conn, err := self.pDispatcher.Pool.Connect(url) + return conn, err +} +func (self *PoolOwner) BlockingConnectToUrl(url string) (*gnet.Connection, error) { + conn, err := self.pDispatcher.Pool.Connect(url) + return conn, err +} +func (self *PoolOwner) BroadcastMessage(msg gnet.Message) error { + return self.pDispatcher.BroadcastMessage(common_channel, msg) +} +func (self *PoolOwner) Print() { + detail := true + + fmt.Printf("PoolOwner={%d,%s,keys={n=%d", + self.debug_num_id, self.debug_nickname, len(self.key_list)) + + if detail { + for _, val := range self.key_list { + fmt.Printf(",%s", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}}") +} + +//////////////////////////////////////////////////////////////////////////////// +func print_stat(X []*MinimalConnectionManager, iter int) { + + n := 0 + for i, _ := range X { + n += X[i].GetNode().Incoming_block_count + } + + msg_per_node_per_round := + float64(n) / float64(Cfg_simu_num_node*Cfg_simu_num_block_round) + + msg_per_node_per_round_per_link := msg_per_node_per_round / + float64(Cfg_simu_fanout_per_node) + + msg_per_node_per_round_per_blockmaker := msg_per_node_per_round / + float64(Cfg_simu_num_blockmaker) + + // Print for viewing: + fmt.Printf( + "MSG_STAT iter %d\n"+ + "MSG_STAT msg_count_all %d\n"+ + "MSG_STAT num_node %d\n"+ + "MSG_STAT num_blockmaker %d\n"+ + "MSG_STAT num_block_round %d\n"+ + "MSG_STAT fanout_per_node %d\n"+ + "MSG_STAT max_candidate_messages %d (This limits the effect of"+ + " having large num_blockmaker)\n"+ + "MSG_STAT msg_per_node_per_round %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_link %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_blockmaker %.3f\n", + iter, n, Cfg_simu_num_node, Cfg_simu_num_blockmaker, + Cfg_simu_num_block_round, Cfg_simu_fanout_per_node, + consensus.Cfg_consensus_max_candidate_messages, + msg_per_node_per_round, + msg_per_node_per_round_per_link, + msg_per_node_per_round_per_blockmaker) + +} + +//////////////////////////////////////////////////////////////////////////////// +func Simulate_compare_node_StateQueue( + X []*MinimalConnectionManager, + global_seqno2h map[uint64]cipher.SHA256, + global_seqno2h_alt map[uint64]cipher.SHA256, +) { + // + // Step 1 of 3: for each observed seqno, find the histogram of + // 'best' hash. The historgam is formed by summing over nodes. + // + type QQQ map[uint64]map[cipher.SHA256]int + xxx := make(QQQ) // Access: [seqno][hash]=count + type ZZZ []QQQ // Access: [node][seqno][hash]=count + + ni := len(X) + + zzz := make(ZZZ, ni) + + for i := 0; i < ni; i++ { // Nodes + nj := X[i].GetNode().Get_block_stat_queue_Len() + + zzz[i] = make(map[uint64]map[cipher.SHA256]int) + + for j := 0; j < nj; j++ { // Elements in node's BlockStatQueue + + // 'bs' a pointer: + bs := X[i].GetNode().Get_block_stat_queue_element_at(j) + seqno := bs.GetSeqno() + hash, _, _ := bs.GetBestHashPubkeySig() + + if _, have := xxx[seqno]; !have { + xxx[seqno] = make(map[cipher.SHA256]int) + } + xxx[seqno][hash]++ + + if _, have := zzz[i][seqno]; !have { + zzz[i][seqno] = make(map[cipher.SHA256]int) + } + zzz[i][seqno][hash]++ + } + } + // + // Step 2 of 3. For each seqno, find the most-frequently observed + // hash. Also, find the ratio of blocks accepted to blocks + // published. + // + yyy := make(map[uint64]cipher.SHA256) // Access: [seqno]=hash + + var accept_count int = 0 + var total_count int = 0 + + for seqno, hash2count := range xxx { + var best_count int = 0 + var sum_count int = 0 + var best_hash cipher.SHA256 // undef + + initialized := false + + for hash, count := range hash2count { + if initialized { + if best_count < count { + best_count = count + best_hash = hash + } + } else { + initialized = true + + best_count = count + best_hash = hash + } + sum_count += count + } + + if initialized { + yyy[seqno] = best_hash + + // Here all 'seqno' contribute equally: + accept_count += best_count + total_count += sum_count + } + } + + if true { + keys := []int{} + for seqno, _ := range yyy { + keys = append(keys, int(seqno)) + } + + sort.Ints(keys) + + for _, key := range keys { + seqno := uint64(key) + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + + prescribed := best_hash == global_seqno2h[seqno] + malicious := best_hash == global_seqno2h_alt[seqno] + + fmt.Printf("CONSENSUS: seqno=%d best_hash=%s prescribed=%t"+ + " malicious=%t\n", seqno, best_hash.Hex()[:8], prescribed, + malicious) + } + + } + fmt.Printf("CONSENSUS: total_count=%d accept_count=%d, accept_ratio=%f\n", + total_count, accept_count, float32(accept_count)/float32(total_count)) + + for i, zzz_i := range zzz { + join_count := 0 // How many have selected the most popular hash. + other_count := 0 // How many have selected NOT the most popular. + prescribed_count := 0 // How many have selected the intended hash. + malicious_count := 0 // How many have selected the malicious hash. + + for seqno, hash2count := range zzz_i { + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + prescribed := global_seqno2h[seqno] + malicious := global_seqno2h_alt[seqno] + + for hash, count := range hash2count { + if hash == best_hash { + join_count += count + } else { + other_count += count + } + + if hash == prescribed { + prescribed_count += count + } + if hash == malicious { + malicious_count += count + } + } + } + + fmt.Printf("NODE i=%d join_count=%d other_count=%d prescribed_count="+ + "%d malicious_count=%d\n", + i, join_count, other_count, prescribed_count, malicious_count) + } +} + +//////////////////////////////////////////////////////////////////////////////// +type MinimalConnectionManager struct { + theNodePtr *consensus.ConsensusParticipant + + // MinimalConnectionManager solicit a conn to them; receive data + // from them but do not send anything + publishers PoolOwner + + // MinimalConnectionManager accept + // connections. MinimalConnectionManager send data to them; does + // not receive anything; ignores all incoming data + subscribers PoolOwner +} + +func (self *MinimalConnectionManager) Init(listen_port uint16, num_id int, nickname string) { + self.publishers.Init(self, 0, num_id, nickname+";recv_from_pub") + self.subscribers.Init(self, listen_port, num_id, nickname+";send_to_sub") +} +func (self *MinimalConnectionManager) Run() { + self.publishers.Run() + self.subscribers.Run() +} +func (self *MinimalConnectionManager) ShutdownPublishing() { + self.subscribers.Shutdown() +} +func (self *MinimalConnectionManager) ShutdownSubscribing() { + self.publishers.Shutdown() +} +func (self *MinimalConnectionManager) GetListenPort() uint16 { + return self.subscribers.pDispatcher.Pool.Config.Port +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *MinimalConnectionManager) GetNode() *consensus.ConsensusParticipant { + return self.theNodePtr +} +func (self *MinimalConnectionManager) RegisterPublisher(key string) bool { + return self.publishers.RegisterKey(key) +} +func (self *MinimalConnectionManager) SendBlockToAllMySubscriber(xxx *consensus.BlockBase) { + var msg BlockBaseWrapper + msg.Sig = xxx.Sig + msg.Hash = xxx.Hash + msg.Seqno = xxx.Seqno + + self.subscribers.pDispatcher.BroadcastMessage(common_channel, &msg) +} +func (self *MinimalConnectionManager) RequestConnectionToAllMyPublisher() { + self.publishers.RequestConnectionToKeys() + + // NOTE: The node does not request connection to subscriber; + // instead, the subscriber request connection to Node. +} +func (self *MinimalConnectionManager) OnSubscriberConnectionRequest(key string) { + fmt.Printf(">>>>>>>>>>>>>>>> GOT HERE. Please cooment this line out >>>>>>>>>>>>>>>>>>>>>>>>>\n") + + // FOR NOW accept all connection request. TODO: check for black + // list, latency table etc. + var acceptable = true + if acceptable { + self.subscribers.RegisterKey(key) + } +} +func (self *MinimalConnectionManager) Print() { + fmt.Printf("ConnectionManager={Pub={") + self.publishers.Print() + fmt.Printf("},Sub={") + self.subscribers.Print() + fmt.Printf("}}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +func get_random_index_subset(N int, S int) []int { + // N - population size + // S - subset size + + if N < 0 { + N = 0 + } + if S < 0 { + S = 0 + } + if S > N { + S = N + } + + index_map := make(map[int]int, S) + if 2*S < N { + // Include at random + for i := 0; i < 3*S; i++ { // '3' is a heuristic + if len(index_map) >= S { + break + } + index_map[mathrand.Intn(N)] = 1 + } + } else { + // Fill up + for i := 0; i < N; i++ { + index_map[i] = 1 + } + n := N - S + // Exclude at random + for i := 0; i < 3*n; i++ { // '3' is a heuristic + if len(index_map) <= S { + break + } + delete(index_map, mathrand.Intn(N)) + } + } + + keys := []int{} + + for k, _ := range index_map { + keys = append(keys, k) + } + + return keys +} + +//////////////////////////////////////////////////////////////////////////////// +// +// main +// +//////////////////////////////////////////////////////////////////////////////// +func main() { + + cmd_line_args_process() + + // PERFORMANCE: + cipher.DebugLevel1 = false + cipher.DebugLevel2 = false + + var X []*MinimalConnectionManager + + var hack_global_seqno uint64 = 0 + + seed := "hdhdhdkjashfy7273" + _, SecKeyArray := + cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), Cfg_simu_num_node) + + for i := 0; i < Cfg_simu_num_node; i++ { + var cm MinimalConnectionManager + cm.Init(6060+uint16(i), i, "fox") + + // Reason for mutual registration: (1) when conn man receives + // messages, it needs to notify the node; (2) when node has + // processed a mesage, it might need to use conn man to send + // some data out. + nodePtr := consensus.NewConsensusParticipantPtr(&cm) + s := SecKeyArray[i] + nodePtr.SetPubkeySeckey(cipher.PubKeyFromSecKey(s), s) + + cm.theNodePtr = nodePtr + + X = append(X, &cm) + } + if false { + fmt.Printf("Got %d nodes\n", len(X)) + } + + if Cfg_simu_topology_is_random { + + fmt.Printf("CONFIG Topology: connecting %d nodes randomly with approx"+ + " %d nearest-neighbors in and approx %d nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + n := len(X) + + for i := 0; i < n; i++ { + + cm := X[i] + + indices := + get_random_index_subset(Cfg_simu_num_node, Cfg_simu_fanout_per_node) + for _, j := range indices { + if i != j { + cm.RegisterPublisher(fmt.Sprintf("127.0.0.1:%d", X[j].GetListenPort())) + fmt.Printf("TOPOLOGY: port %d solicits conn to port %d\n", cm.GetListenPort(), X[j].GetListenPort()) + + } + } + } + } else { + + fmt.Printf("CONFIG Topology: connecting %d nodes via one (thick)"+ + " circle with approx %d nearest-neighbors in and approx %d "+ + "nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + n := len(X) + + for i := 0; i < n; i++ { + + cm := X[i] + + c_left := int(Cfg_simu_fanout_per_node / 2) + c_right := Cfg_simu_fanout_per_node - c_left + + for c := 0; c < c_left; c++ { + j := (i - 1 - c + n) % n + cm.RegisterPublisher(fmt.Sprintf("127.0.0.1:%d", X[j].GetListenPort())) + } + + for c := 0; c < c_right; c++ { + j := (i + 1 + c) % n + cm.RegisterPublisher(fmt.Sprintf("127.0.0.1:%d", X[j].GetListenPort())) + } + } + } + + // Start GoRoutines related to connectivity + for i, _ := range X { + X[i].Run() + } + + fmt.Printf("Waiting for start ...\n") + time.Sleep(time.Millisecond * 10) + + // Connect. PROD: This should request connections. The + // connections can be accepted, rejected or never answered. Such + // replies are asynchronous. SIMU: we connect synchronously. + for i, _ := range X { + X[i].RequestConnectionToAllMyPublisher() + } + + fmt.Printf("Waiting for connections ...\n") + time.Sleep(time.Second * 1) + + global_seqno2h := make(map[uint64]cipher.SHA256) + global_seqno2h_alt := make(map[uint64]cipher.SHA256) + + iter := 0 + block_round := 0 + done_processing_messages := false + for ; iter < Cfg_simu_num_iter; iter++ { + + if false { + fmt.Printf("Iteration %d\n", iter) + } + + //fmt.Printf("Waiting for messages to propagate ...\n") + time.Sleep(time.Millisecond * 100) + + if true { + if block_round < Cfg_simu_num_block_round { + + if true { + t := time.Now() + fmt.Printf("wall_time=%02d:%02d:%02d"+ + " block_round=%d\n", t.Hour(), t.Minute(), t.Second(), + block_round) + } + + // NOTE: Propagating blocks from here is a + // simplification/HACK: it implies that we have + // knowledge of when messaging due to previous + // activity (blocks and connections) has + // stopped. Again, we make blocks from here for + // debugging and testing only. + + //x := secp256k1.RandByte(888) // Random data in SIMU. + x := make([]byte, 888) + mathrand.Read(x) + + h := cipher.SumSHA256(x) // Its hash. + + //x_alt := secp256k1.RandByte(888) // Random data in SIMU. + x_alt := make([]byte, 888) + mathrand.Read(x) + h_alt := cipher.SumSHA256(x_alt) // Its hash. + + global_seqno2h[hack_global_seqno] = h + global_seqno2h_alt[hack_global_seqno] = h_alt + + indices := get_random_index_subset(Cfg_simu_num_node, + Cfg_simu_num_blockmaker) + + if Cfg_debug_show_block_maker { + fmt.Printf("block_round=%d, Random indices of block-"+ + "makers: %v\n", block_round, indices) + } + + n_forkers := int(Cfg_simu_prob_malicious * float64(len(indices))) + + for i := 0; i < len(indices); i++ { + // TODO: Have many nodes send same block, and a few nodes + // send a different block. Research the conditions under + // which the block published by the majority would + // dominate the other one. + index := indices[i] + nodePtr := X[index].GetNode() + + malicious := (i < n_forkers) + duplicate := (mathrand.Float64() < Cfg_simu_prob_duplicate) + + ph := &h + if malicious { + ph = &h_alt + } + + rep := 1 + if duplicate { + rep = 2 + } + + // + // WARNING: In a reslistic simulation, one would + // need to remove the assumption of knowing global + // properties such as 'hack_global_seqno' + // + if malicious { + fmt.Printf(">>>>>> NODE (index,pubkey)=(%d,%s) is"+ + " publishing ALTERNATIVE block\n", index, + nodePtr.Pubkey.Hex()[:8]) + } + + for j := 0; j < rep; j++ { + // Signing same hash multiple times produces different + // signatures (for a good reason). We do it + // here to test if malicious re-publishing is + // detected properly. + propagate_hash_from_node(*ph, nodePtr, true, + hack_global_seqno) + } + } + + hack_global_seqno += 1 + block_round += 1 + } else { + done_processing_messages = true + break // <<<<<<<< + } + } + } + + fmt.Printf("Waiting to finish ...\n") + time.Sleep(time.Millisecond * 500) + + zzz := "done" + if !done_processing_messages { + zzz = "***NOT done***" + } + + if false { + // [JSM] Do not call these FOR NOW: ConnectionPool does not + // implement shutdown correctly. + for i, _ := range X { + X[i].ShutdownPublishing() + } + for i, _ := range X { + X[i].ShutdownSubscribing() + } + } + + fmt.Printf("Done (i) making Blocks, %s (ii) processing responses."+ + " See stats on the next few lines. Used iterations=%d, unused"+ + " iterations=%d. Exiting the event loop now.\n", + zzz, iter, Cfg_simu_num_iter-iter) + + print_stat(X, iter) + + if Cfg_debug_node_final_state { + for i, _ := range X { + fmt.Printf("FILE_FinalState.txt|NODE i=%d ", i) + X[i].GetNode().Print() + fmt.Printf("\n") + } + } + + if Cfg_debug_node_summary { + Simulate_compare_node_StateQueue(X, global_seqno2h, global_seqno2h_alt) + } +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_minimal.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_minimal.go new file mode 100644 index 00000000..0ebd72e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_minimal.go @@ -0,0 +1,166 @@ +// +build ignore + +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package main + +import ( + "fmt" + mathrand "math/rand" + + // + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" + "github.com/SkycoinProject/skycoin/src/consensus" +) + +var Cfg_simu_num_node int = 5 +var Cfg_simu_fanout_per_node int = 2 + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +type MinimalConnectionManager struct { + theNodePtr *consensus.ConsensusParticipant + // + publisher_key_list []*MinimalConnectionManager + subscriber_key_list []*MinimalConnectionManager +} + +func (self *MinimalConnectionManager) GetNode() *consensus.ConsensusParticipant { + return self.theNodePtr +} +func (self *MinimalConnectionManager) RegisterPublisher(key *MinimalConnectionManager) bool { + + self.publisher_key_list = append(self.publisher_key_list, key) + return true +} +func (self *MinimalConnectionManager) SendBlockToAllMySubscriber(blockPtr *consensus.BlockBase) { + for _, p := range self.subscriber_key_list { + p.GetNode().OnBlockHeaderArrived(blockPtr) + } +} +func (self *MinimalConnectionManager) RequestConnectionToAllMyPublisher() { + for _, p := range self.publisher_key_list { + p.OnSubscriberConnectionRequest(self) + } +} +func (self *MinimalConnectionManager) OnSubscriberConnectionRequest(other *MinimalConnectionManager) { + self.subscriber_key_list = append(self.subscriber_key_list, other) +} +func (self *MinimalConnectionManager) Print() { + detail := false + + fmt.Printf("ConnectionManager={publisher={n=%d", + len(self.publisher_key_list)) + + if detail { + for _, val := range self.publisher_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") + + fmt.Printf(",subscriber={n=%d", len(self.subscriber_key_list)) + if detail { + for _, val := range self.subscriber_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// main +// +//////////////////////////////////////////////////////////////////////////////// +func main() { + + var X []*MinimalConnectionManager + + // Create nodes + for i := 0; i < Cfg_simu_num_node; i++ { + cm := MinimalConnectionManager{} + // Reason for mutual registration: (1) when conn man receives + // messages, it needs to notify the node; (2) when node has + // processed a mesage, it might need to use conn man to send + // some data out. + nodePtr := consensus.NewConsensusParticipantPtr(&cm) + cm.theNodePtr = nodePtr + + X = append(X, &cm) + } + + // Contemplate connecting nodes into a thick circle: + n := len(X) + for i := 0; i < n; i++ { + + cm := X[i] + + c_left := int(Cfg_simu_fanout_per_node / 2) + c_right := Cfg_simu_fanout_per_node - c_left + + for c := 0; c < c_left; c++ { + j := (i - 1 - c + n) % n + cm.RegisterPublisher(X[j]) + } + + for c := 0; c < c_right; c++ { + j := (i + 1 + c) % n + cm.RegisterPublisher(X[j]) + } + } + + // + // Request connections + // + for i := 0; i < n; i++ { + X[i].RequestConnectionToAllMyPublisher() + } + + { + // + // Choose a node to be a block-maker + // + index := mathrand.Intn(Cfg_simu_num_node) + nodePtr := X[index].GetNode() + + // + // Make a block (actually, only a header) + // + x := secp256k1.RandByte(888) // Random data. + h := cipher.SumSHA256(x) // Its hash. + b := consensus.BlockBase{} + b.Init( + nodePtr.SignatureOf(h), + h, + 0) + + // + // Send it to subscribers. The subscribers are also publishers; + // they send (forward, to be exact) the header to thire respective + // listeners etc. + // + nodePtr.OnBlockHeaderArrived(&b) + } + + // + // Print the state of each node for a review or debugging. + // + for i, _ := range X { + fmt.Printf("FILE_FinalState.txt|NODE i=%d ", i) + X[i].GetNode().Print() + fmt.Printf("\n") + } + +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/participant.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/participant.go new file mode 100644 index 00000000..113ed6d0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/participant.go @@ -0,0 +1,180 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +//////////////////////////////////////////////////////////////////////////////// +// +// Struct ConsensusParticipant is inteneded to extend (or be contained in) +// github.com/SkycoinProject/skycoin/src/mesh*/node struct Node, so that +// Node can participate in consensus. +// +//////////////////////////////////////////////////////////////////////////////// +type ConsensusParticipant struct { + Pubkey cipher.PubKey // Who we are + Seckey cipher.SecKey // For signing + + pConnectionManager ConnectionManagerInterface + + // The tail of Blockchain that I keep. + block_queue BlockchainTail + + // Candidates Blocks. + block_stat_queue BlockStatQueue + + Incoming_block_count int +} + +func (self *ConsensusParticipant) GetConnectionManager() ConnectionManagerInterface { + return self.pConnectionManager +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) GetNextBlockSeqNo() uint64 { + return self.block_queue.GetNextSeqNo() +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) SetPubkeySeckey( + pubkey cipher.PubKey, + seckey cipher.SecKey) { + + self.Pubkey, self.Seckey = pubkey, seckey + //self.pConnectionManager.SetPubkey(pubkey) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) Print() { + fmt.Printf("ConsensusParticipant={pubkey=%s,block_msg_count=%d,", + self.Pubkey.Hex()[:8], self.Incoming_block_count) + + self.pConnectionManager.Print() + + fmt.Printf(",block_queue={") + self.block_queue.Print() + fmt.Printf("}") + + fmt.Printf(",block_stat_queue={") + self.block_stat_queue.Print() + fmt.Printf("}") + + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +func NewConsensusParticipantPtr(pMan ConnectionManagerInterface) *ConsensusParticipant { + + node := ConsensusParticipant{ + pConnectionManager: pMan, + block_queue: BlockchainTail{}, + Incoming_block_count: 0, + } + node.block_queue.Init() + //node.block_stat_queue.Init() + + // In PROD: each reads/loads the keys. In case the class does not + // expect to sign anything, SecKey should not be stored. + + // In SIMU: generate random keys. + node.SetPubkeySeckey(cipher.GenerateKeyPair()) + + return &node +} + +//////////////////////////////////////////////////////////////////////////////// +// Reasons for this function: 1st, we want to minimize exposure of +// SecKey, even in same process space. 2nd, functions Sign and +// SignHash already exists, so want keep search/browse/jump-to-tag +// unambiguous. +func (self *ConsensusParticipant) SignatureOf(hash cipher.SHA256) cipher.Sig { + + // PERFORMANCE: This is expensive when cipher.DebugLevel2 or + // cipher.DebugLevel1 are true: + return cipher.MustSignHash(hash, self.Seckey) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) Get_block_stat_queue_Len() int { + return self.block_stat_queue.Len() +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) Get_block_stat_queue_element_at( + j int) *BlockStat { + + return self.block_stat_queue.queue[j] // A pointer, BTW +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) OnBlockHeaderArrived(blockPtr *BlockBase) { + + self.Incoming_block_count += 1 // TODO: move this to try_add_hash_and_sig + + res1 := self.block_stat_queue.try_append_to_BlockStatQueue(blockPtr) + if res1 == 0 { + self.harvest_ripe_BlockStat() + self.pConnectionManager.SendBlockToAllMySubscriber(blockPtr) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) harvest_ripe_BlockStat() { + + // POLICY: The BlockStat entries that have much smaller seqno + // than the most recent one, 'blockPtr.seqno', are converted + // to Blocks and appended to blockchain. + n := len(self.block_stat_queue.queue) + if n == 0 { + return + } + + top_seqno := self.block_stat_queue.queue[n-1].seqno + + for i := 0; i < n; i++ { + statPtr := self.block_stat_queue.queue[i] + if statPtr.seqno+ + Cfg_consensus_waiting_time_as_seqno_diff <= top_seqno { + + if !statPtr.frozen { + // + // BEG updating local blockchain + // + + hash, _, sig := statPtr.GetBestHashPubkeySig() + + blockPtr := &BlockBase{ + Sig: sig, + Hash: hash, + Seqno: statPtr.seqno, + } + res := self.block_queue.try_append_to_BlockchainTail(blockPtr) + if res == 0 { + // TODO: 'frozen' items should be removed and the 'best' + // moved to BlockchainTail. + statPtr.frozen = true + } else { + // Appending did not work. Need to examine 'res' + // and log the reason why. + blockPtr = nil + } + // + // END updating local blockchain + // + + } + + } else { + break // The rest are not ripe yet + } + } + +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/public_broadcast_channel/public_broadcast_channel.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/public_broadcast_channel/public_broadcast_channel.go new file mode 100644 index 00000000..8fa44fcb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/public_broadcast_channel/public_broadcast_channel.go @@ -0,0 +1,2 @@ +//nolint +package public_broadcast_channel diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder.go new file mode 100644 index 00000000..ca165cac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder.go @@ -0,0 +1,78 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeAnnounceBlocksMessage computes the size of an encoded object of type AnnounceBlocksMessage +func encodeSizeAnnounceBlocksMessage(obj *AnnounceBlocksMessage) uint64 { + i0 := uint64(0) + + // obj.MaxBkSeq + i0 += 8 + + return i0 +} + +// encodeAnnounceBlocksMessage encodes an object of type AnnounceBlocksMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeAnnounceBlocksMessage(obj *AnnounceBlocksMessage) ([]byte, error) { + n := encodeSizeAnnounceBlocksMessage(obj) + buf := make([]byte, n) + + if err := encodeAnnounceBlocksMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeAnnounceBlocksMessageToBuffer encodes an object of type AnnounceBlocksMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeAnnounceBlocksMessageToBuffer(buf []byte, obj *AnnounceBlocksMessage) error { + if uint64(len(buf)) < encodeSizeAnnounceBlocksMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.MaxBkSeq + e.Uint64(obj.MaxBkSeq) + + return nil +} + +// decodeAnnounceBlocksMessage decodes an object of type AnnounceBlocksMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeAnnounceBlocksMessage(buf []byte, obj *AnnounceBlocksMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.MaxBkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.MaxBkSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeAnnounceBlocksMessageExact decodes an object of type AnnounceBlocksMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeAnnounceBlocksMessageExact(buf []byte, obj *AnnounceBlocksMessage) error { + if n, err := decodeAnnounceBlocksMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder_test.go new file mode 100644 index 00000000..f5b81167 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyAnnounceBlocksMessageForEncodeTest() *AnnounceBlocksMessage { + var obj AnnounceBlocksMessage + return &obj +} + +func newRandomAnnounceBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceBlocksMessage { + var obj AnnounceBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenAnnounceBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceBlocksMessage { + var obj AnnounceBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilAnnounceBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceBlocksMessage { + var obj AnnounceBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderAnnounceBlocksMessage(t *testing.T, obj *AnnounceBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeAnnounceBlocksMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeAnnounceBlocksMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeAnnounceBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeAnnounceBlocksMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeAnnounceBlocksMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeAnnounceBlocksMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeAnnounceBlocksMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeAnnounceBlocksMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 AnnounceBlocksMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 AnnounceBlocksMessage + if n, err := decodeAnnounceBlocksMessage(data2, &obj3); err != nil { + t.Fatalf("decodeAnnounceBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeAnnounceBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceBlocksMessage()") + } + + // Decode, excess buffer + var obj4 AnnounceBlocksMessage + n, err := decodeAnnounceBlocksMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeAnnounceBlocksMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeAnnounceBlocksMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeAnnounceBlocksMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceBlocksMessage()") + } + + // DecodeExact + var obj5 AnnounceBlocksMessage + if err := decodeAnnounceBlocksMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeAnnounceBlocksMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceBlocksMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeAnnounceBlocksMessage(data4, &obj3); err != nil { + t.Fatalf("decodeAnnounceBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeAnnounceBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderAnnounceBlocksMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *AnnounceBlocksMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyAnnounceBlocksMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomAnnounceBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenAnnounceBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilAnnounceBlocksMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderAnnounceBlocksMessage(t, tc.obj) + }) + } +} + +func decodeAnnounceBlocksMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj AnnounceBlocksMessage + if _, err := decodeAnnounceBlocksMessage(buf, &obj); err == nil { + t.Fatal("decodeAnnounceBlocksMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeAnnounceBlocksMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeAnnounceBlocksMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj AnnounceBlocksMessage + if err := decodeAnnounceBlocksMessageExact(buf, &obj); err == nil { + t.Fatal("decodeAnnounceBlocksMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeAnnounceBlocksMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderAnnounceBlocksMessageDecodeErrors(t *testing.T, k int, tag string, obj *AnnounceBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeAnnounceBlocksMessage(obj) + buf, err := encodeAnnounceBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeAnnounceBlocksMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeAnnounceBlocksMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeAnnounceBlocksMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeAnnounceBlocksMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeAnnounceBlocksMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeAnnounceBlocksMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderAnnounceBlocksMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyAnnounceBlocksMessageForEncodeTest() + fullObj := newRandomAnnounceBlocksMessageForEncodeTest(t, rand) + testSkyencoderAnnounceBlocksMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderAnnounceBlocksMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder.go new file mode 100644 index 00000000..e8406f49 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder.go @@ -0,0 +1,135 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeAnnounceTxnsMessage computes the size of an encoded object of type AnnounceTxnsMessage +func encodeSizeAnnounceTxnsMessage(obj *AnnounceTxnsMessage) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Transactions)) * i1 + } + + return i0 +} + +// encodeAnnounceTxnsMessage encodes an object of type AnnounceTxnsMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeAnnounceTxnsMessage(obj *AnnounceTxnsMessage) ([]byte, error) { + n := encodeSizeAnnounceTxnsMessage(obj) + buf := make([]byte, n) + + if err := encodeAnnounceTxnsMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeAnnounceTxnsMessageToBuffer encodes an object of type AnnounceTxnsMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeAnnounceTxnsMessageToBuffer(buf []byte, obj *AnnounceTxnsMessage) error { + if uint64(len(buf)) < encodeSizeAnnounceTxnsMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 256 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeAnnounceTxnsMessage decodes an object of type AnnounceTxnsMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeAnnounceTxnsMessage(buf []byte, obj *AnnounceTxnsMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 256 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]cipher.SHA256, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1] + if len(d.Buffer) < len(obj.Transactions[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1][:], d.Buffer[:len(obj.Transactions[z1])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeAnnounceTxnsMessageExact decodes an object of type AnnounceTxnsMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeAnnounceTxnsMessageExact(buf []byte, obj *AnnounceTxnsMessage) error { + if n, err := decodeAnnounceTxnsMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder_test.go new file mode 100644 index 00000000..7875c8ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyAnnounceTxnsMessageForEncodeTest() *AnnounceTxnsMessage { + var obj AnnounceTxnsMessage + return &obj +} + +func newRandomAnnounceTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceTxnsMessage { + var obj AnnounceTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenAnnounceTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceTxnsMessage { + var obj AnnounceTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilAnnounceTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceTxnsMessage { + var obj AnnounceTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderAnnounceTxnsMessage(t *testing.T, obj *AnnounceTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeAnnounceTxnsMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeAnnounceTxnsMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeAnnounceTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeAnnounceTxnsMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeAnnounceTxnsMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeAnnounceTxnsMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeAnnounceTxnsMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeAnnounceTxnsMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 AnnounceTxnsMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 AnnounceTxnsMessage + if n, err := decodeAnnounceTxnsMessage(data2, &obj3); err != nil { + t.Fatalf("decodeAnnounceTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeAnnounceTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceTxnsMessage()") + } + + // Decode, excess buffer + var obj4 AnnounceTxnsMessage + n, err := decodeAnnounceTxnsMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeAnnounceTxnsMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeAnnounceTxnsMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeAnnounceTxnsMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceTxnsMessage()") + } + + // DecodeExact + var obj5 AnnounceTxnsMessage + if err := decodeAnnounceTxnsMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeAnnounceTxnsMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceTxnsMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeAnnounceTxnsMessage(data4, &obj3); err != nil { + t.Fatalf("decodeAnnounceTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeAnnounceTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderAnnounceTxnsMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *AnnounceTxnsMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyAnnounceTxnsMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomAnnounceTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenAnnounceTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilAnnounceTxnsMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderAnnounceTxnsMessage(t, tc.obj) + }) + } +} + +func decodeAnnounceTxnsMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj AnnounceTxnsMessage + if _, err := decodeAnnounceTxnsMessage(buf, &obj); err == nil { + t.Fatal("decodeAnnounceTxnsMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeAnnounceTxnsMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeAnnounceTxnsMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj AnnounceTxnsMessage + if err := decodeAnnounceTxnsMessageExact(buf, &obj); err == nil { + t.Fatal("decodeAnnounceTxnsMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeAnnounceTxnsMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderAnnounceTxnsMessageDecodeErrors(t *testing.T, k int, tag string, obj *AnnounceTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeAnnounceTxnsMessage(obj) + buf, err := encodeAnnounceTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeAnnounceTxnsMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeAnnounceTxnsMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeAnnounceTxnsMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeAnnounceTxnsMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeAnnounceTxnsMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeAnnounceTxnsMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderAnnounceTxnsMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyAnnounceTxnsMessageForEncodeTest() + fullObj := newRandomAnnounceTxnsMessageForEncodeTest(t, rand) + testSkyencoderAnnounceTxnsMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderAnnounceTxnsMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announced_txns.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announced_txns.go new file mode 100644 index 00000000..3ca38bdc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announced_txns.go @@ -0,0 +1,44 @@ +package daemon + +import ( + "sync" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +type announcedTxnsCache struct { + sync.Mutex + cache map[cipher.SHA256]int64 +} + +func newAnnouncedTxnsCache() *announcedTxnsCache { + return &announcedTxnsCache{ + cache: make(map[cipher.SHA256]int64), + } +} + +func (c *announcedTxnsCache) add(txns []cipher.SHA256) { + c.Lock() + defer c.Unlock() + + t := time.Now().UTC().UnixNano() + for _, txn := range txns { + c.cache[txn] = t + } +} + +func (c *announcedTxnsCache) flush() map[cipher.SHA256]int64 { + c.Lock() + defer c.Unlock() + + if len(c.cache) == 0 { + return nil + } + + cache := c.cache + + c.cache = make(map[cipher.SHA256]int64) + + return cache +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections.go new file mode 100644 index 00000000..dd94678a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections.go @@ -0,0 +1,554 @@ +package daemon + +import ( + "errors" + "fmt" + "sync" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/iputil" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +// ConnectionState connection state in the state machine +// Connections have three states: "pending", "connected" and "introduced" +// A connection in the "pending" state has been selected to establish a TCP connection, +// but the connection has not been established yet. +// Only outgoing connections will ever be in the "pending" state; +// incoming connections begin at the "connected" state. +// A connection in the "connected" state has established a TCP connection, +// but has not completed the introduction handshake. +// A connection in the "introduced" state has completed the introduction handshake. +type ConnectionState string + +const ( + // ConnectionStatePending prior to establishing a connection + ConnectionStatePending ConnectionState = "pending" + // ConnectionStateConnected connected, but not introduced + ConnectionStateConnected ConnectionState = "connected" + // ConnectionStateIntroduced connection has introduced itself + ConnectionStateIntroduced ConnectionState = "introduced" +) + +var ( + // ErrConnectionNotExist connection does not exist when performing an operation that requires it to exist + ErrConnectionNotExist = errors.New("Connection does not exist") + // ErrConnectionExists connection exists in Connections + ErrConnectionExists = errors.New("Connection exists") + // ErrConnectionIPMirrorExists connection exists for a given base IP and mirror + ErrConnectionIPMirrorExists = errors.New("Connection exists with this base IP and mirror") + // ErrConnectionStateNotConnected connect state is not "connected" + ErrConnectionStateNotConnected = errors.New("Connection state is not \"connected\"") + // ErrConnectionGnetIDMismatch gnet ID in argument does not match gnet ID on record + ErrConnectionGnetIDMismatch = errors.New("Connection gnet ID does not match") + // ErrConnectionAlreadyIntroduced attempted to make invalid state transition from introduced state + ErrConnectionAlreadyIntroduced = errors.New("Connection is already in introduced state") + // ErrConnectionAlreadyConnected attempted to make invalid state transition from connected state + ErrConnectionAlreadyConnected = errors.New("Connection is already in connected state") + // ErrInvalidGnetID invalid gnet ID value used as argument + ErrInvalidGnetID = errors.New("Invalid gnet ID") +) + +// ConnectionDetails connection data managed by daemon +type ConnectionDetails struct { + State ConnectionState + Outgoing bool + ConnectedAt time.Time + Mirror uint32 + ListenPort uint16 + ProtocolVersion int32 + Height uint64 + UserAgent useragent.Data + UnconfirmedVerifyTxn params.VerifyTxn + GenesisHash cipher.SHA256 +} + +// HasIntroduced returns true if the connection has introduced +func (c ConnectionDetails) HasIntroduced() bool { + switch c.State { + case ConnectionStateIntroduced: + return true + default: + return false + } +} + +type connection struct { + Addr string + ConnectionDetails + gnetID uint64 +} + +// ListenAddr returns the addr that connection listens on, if available +func (c *connection) ListenAddr() string { + if c.ListenPort == 0 { + return "" + } + + ip, _, err := iputil.SplitAddr(c.Addr) + if err != nil { + logger.Critical().WithError(err).WithField("addr", c.Addr).Error("connection.ListenAddr addr could not be split") + return "" + } + + return fmt.Sprintf("%s:%d", ip, c.ListenPort) +} + +// Connections manages a collection of Connection +type Connections struct { + conns map[string]*connection + mirrors map[uint32]map[string]uint16 + ipCounts map[string]int + gnetIDs map[uint64]string + listenAddrs map[string][]string + sync.Mutex +} + +// NewConnections creates Connections +func NewConnections() *Connections { + return &Connections{ + conns: make(map[string]*connection, 32), + mirrors: make(map[uint32]map[string]uint16, 32), + ipCounts: make(map[string]int, 32), + gnetIDs: make(map[uint64]string, 32), + listenAddrs: make(map[string][]string, 32), + } +} + +// pending adds a new pending outgoing connection +func (c *Connections) pending(addr string) (*connection, error) { + c.Lock() + defer c.Unlock() + + ip, port, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithField("addr", addr).WithError(err).Error("Connections.pending called with invalid addr") + return nil, err + } + + if _, ok := c.conns[addr]; ok { + return nil, ErrConnectionExists + } + + c.ipCounts[ip]++ + + conn := &connection{ + Addr: addr, + ConnectionDetails: ConnectionDetails{ + State: ConnectionStatePending, + Outgoing: true, + ListenPort: port, + }, + } + + c.conns[addr] = conn + c.listenAddrs[addr] = append(c.listenAddrs[addr], addr) + + logger.WithField("addr", addr).Debug("Connections.pending") + + return c.conns[addr], nil +} + +// connected the connection has connected +func (c *Connections) connected(addr string, gnetID uint64) (*connection, error) { + c.Lock() + defer c.Unlock() + + fields := logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + } + + if gnetID == 0 { + logger.Critical().WithFields(fields).WithError(ErrInvalidGnetID).Error("Connections.connected called with invalid gnetID") + return nil, ErrInvalidGnetID + } + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithFields(fields).WithError(err).Error("Connections.connected called with invalid addr") + return nil, err + } + + conn := c.conns[addr] + + if conn == nil { + c.ipCounts[ip]++ + + conn = &connection{ + Addr: addr, + } + + c.conns[addr] = conn + } else { + fields := logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + "state": conn.State, + "outgoing": conn.Outgoing, + "connGnetID": conn.gnetID, + } + + switch conn.State { + case ConnectionStatePending: + case ConnectionStateConnected: + logger.Critical().WithFields(fields).Error("Connections.connected called on already connected connection") + return nil, ErrConnectionAlreadyConnected + case ConnectionStateIntroduced: + logger.Critical().WithFields(fields).Error("Connections.connected called on already introduced connection") + return nil, ErrConnectionAlreadyIntroduced + default: + logger.WithFields(fields).Panic("Connection state invalid") + } + } + + c.gnetIDs[gnetID] = addr + conn.gnetID = gnetID + conn.ConnectedAt = time.Now().UTC() + conn.State = ConnectionStateConnected + + fields["outgoing"] = conn.Outgoing + + logger.WithFields(fields).Debug("Connections.connected") + + return conn, nil +} + +// introduced the connection has introduced itself +func (c *Connections) introduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) { + c.Lock() + defer c.Unlock() + + fields := logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + } + + if gnetID == 0 { + logger.Critical().WithFields(fields).WithError(ErrInvalidGnetID).Error("Connections.introduced called with invalid gnetID") + return nil, ErrInvalidGnetID + } + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithFields(fields).WithError(err).Error("Connections.introduced called with invalid addr") + return nil, err + } + + conn := c.conns[addr] + if conn == nil { + return nil, ErrConnectionNotExist + } + + fields["outgoing"] = conn.Outgoing + + errorFields := logrus.Fields{ + "state": conn.State, + "connGnetID": conn.gnetID, + } + + switch conn.State { + case ConnectionStatePending: + logger.Critical().WithFields(fields).WithFields(errorFields).Error("Connections.introduced called on pending connection") + return nil, ErrConnectionStateNotConnected + case ConnectionStateConnected: + if gnetID != conn.gnetID { + logger.Critical().WithFields(fields).WithFields(errorFields).Error("Connections.introduced called with different gnet ID") + return nil, ErrConnectionGnetIDMismatch + } + case ConnectionStateIntroduced: + logger.Critical().WithFields(fields).WithFields(errorFields).Error("Connections.introduced called on already introduced connection") + return nil, ErrConnectionAlreadyIntroduced + default: + logger.WithFields(fields).WithFields(errorFields).Panic("invalid connection state") + } + + if err := c.canUpdateMirror(ip, m.Mirror); err != nil { + logger.WithFields(fields).WithFields(errorFields).WithField("mirror", m.Mirror).WithError(err).Debug("canUpdateMirror failed") + return nil, err + } + + // For outgoing connections, which are created by pending, + // the listen port is set from the addr's port number. + // Since we are connecting to it, it is presumed to be that peer's open listening port. + // A misbehaving peer could report a different ListenPort in their IntroductionMessage, + // but it shouldn't affect our records. + if conn.Outgoing && conn.ListenPort != m.ListenPort { + logger.Critical().WithFields(fields).WithFields(logrus.Fields{ + "connListenPort": conn.ListenPort, + "introListenPort": m.ListenPort, + }).Warning("Outgoing connection's ListenPort does not match reported IntroductionMessage ListenPort") + } + + listenPort := conn.ListenPort + if !conn.Outgoing { + listenPort = m.ListenPort + } + + if err := c.updateMirror(ip, m.Mirror, listenPort); err != nil { + logger.WithFields(fields).WithField("mirror", m.Mirror).WithError(err).Panic("updateMirror failed, but shouldn't") + } + + conn.State = ConnectionStateIntroduced + conn.Mirror = m.Mirror + conn.ProtocolVersion = m.ProtocolVersion + conn.ListenPort = listenPort + conn.UserAgent = m.UserAgent + conn.UnconfirmedVerifyTxn = m.UnconfirmedVerifyTxn + conn.GenesisHash = m.GenesisHash + + if !conn.Outgoing { + listenAddr := conn.ListenAddr() + c.listenAddrs[listenAddr] = append(c.listenAddrs[listenAddr], addr) + } + + logger.WithFields(fields).Debug("Connections.introduced") + + return conn, nil +} + +// get returns a connection by address +func (c *Connections) get(addr string) *connection { + c.Lock() + defer c.Unlock() + + return c.conns[addr] +} + +func (c *Connections) getByListenAddr(listenAddr string) []*connection { + c.Lock() + defer c.Unlock() + + addrs := c.listenAddrs[listenAddr] + if len(addrs) == 0 { + return nil + } + + conns := make([]*connection, len(addrs)) + for i, a := range addrs { + conns[i] = c.conns[a] + } + + return conns +} + +func (c *Connections) getByGnetID(gnetID uint64) *connection { + c.Lock() + defer c.Unlock() + + if gnetID == 0 { + return nil + } + + addr := c.gnetIDs[gnetID] + if addr == "" { + return nil + } + + return c.conns[addr] +} + +// modify modifies a connection. +// It is unsafe to modify the Mirror value with this method +func (c *Connections) modify(addr string, gnetID uint64, f func(c *ConnectionDetails)) error { + conn := c.conns[addr] + if conn == nil { + return ErrConnectionNotExist + } + + if conn.gnetID != gnetID { + return ErrConnectionGnetIDMismatch + } + + // copy and modify + cd := conn.ConnectionDetails + + f(&cd) + + // compare to original + if cd.Mirror != conn.ConnectionDetails.Mirror { + logger.WithFields(logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + }).Panic("Connections.modify connection Mirror was changed") + } + + if cd.ListenPort != conn.ConnectionDetails.ListenPort { + logger.WithFields(logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + }).Panic("Connections.modify connection ListenPort was changed") + } + + conn.ConnectionDetails = cd + + return nil +} + +// SetHeight sets the height for a connection +func (c *Connections) SetHeight(addr string, gnetID uint64, height uint64) error { + c.Lock() + defer c.Unlock() + + return c.modify(addr, gnetID, func(c *ConnectionDetails) { + c.Height = height + }) +} + +func (c *Connections) updateMirror(ip string, mirror uint32, port uint16) error { + x := c.mirrors[mirror] + if x == nil { + x = make(map[string]uint16, 2) + } + + if _, ok := x[ip]; ok { + return ErrConnectionIPMirrorExists + } + + x[ip] = port + c.mirrors[mirror] = x + + return nil +} + +// canUpdateMirror returns false if a connection already exists with the same base IP and mirror value. +// This prevents duplicate connections to/from a single client. +func (c *Connections) canUpdateMirror(ip string, mirror uint32) error { + x := c.mirrors[mirror] + if x == nil { + return nil + } + + if _, ok := x[ip]; ok { + return ErrConnectionIPMirrorExists + } + + return nil +} + +// IPCount returns the number of connections for a given base IP (without port) +func (c *Connections) IPCount(ip string) int { + c.Lock() + defer c.Unlock() + return c.ipCounts[ip] +} + +// Len returns number of connections +func (c *Connections) Len() int { + c.Lock() + defer c.Unlock() + return len(c.conns) +} + +// OutgoingLen returns number of outgoing connections +func (c *Connections) OutgoingLen() int { + c.Lock() + defer c.Unlock() + n := 0 + for _, conn := range c.conns { + if conn.Outgoing { + n++ + } + } + return n +} + +// PendingLen returns the number of status pending connections +func (c *Connections) PendingLen() int { + c.Lock() + defer c.Unlock() + n := 0 + for _, conn := range c.conns { + if conn.State == ConnectionStatePending { + n++ + } + } + return n +} + +// remove removes connection. Returns an error if the addr is invalid. +// If a connection with this address does not exist, nothing happens. +func (c *Connections) remove(addr string, gnetID uint64) error { + c.Lock() + defer c.Unlock() + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithError(err).Error("Connections.remove called with invalid addr") + return err + } + + conn := c.conns[addr] + if conn == nil { + return ErrConnectionNotExist + } + + fields := logrus.Fields{ + "addr": addr, + "connGnetID": conn.gnetID, + "gnetID": gnetID, + "listenPort": conn.ListenPort, + } + + if conn.gnetID != gnetID { + logger.Critical().WithFields(fields).Warning("Connections.remove gnetID does not match") + return ErrConnectionGnetIDMismatch + } + + x, ok := c.mirrors[conn.Mirror] + if ok { + if x[ip] != conn.ListenPort { + logger.Critical().WithFields(fields).Warning("Indexed IP+Mirror value found but the ListenPort doesn't match") + } + + delete(x, ip) + } + + if len(x) == 0 { + delete(c.mirrors, conn.Mirror) + } + + if c.ipCounts[ip] > 0 { + c.ipCounts[ip]-- + } else { + logger.Critical().WithFields(fields).Warning("ipCount was already 0 when removing existing address") + } + + listenAddr := conn.ListenAddr() + if listenAddr != "" { + addrs := c.listenAddrs[listenAddr] + for i, a := range addrs { + if a == conn.Addr { + addrs = append(addrs[:i], addrs[i+1:]...) + break + } + } + if len(addrs) == 0 { + delete(c.listenAddrs, listenAddr) + } else { + c.listenAddrs[listenAddr] = addrs + } + } + + delete(c.gnetIDs, conn.gnetID) + delete(c.conns, addr) + + return nil +} + +// all returns a copy of all connections +func (c *Connections) all() []connection { + c.Lock() + defer c.Unlock() + + conns := make([]connection, 0, len(c.conns)) + for _, c := range c.conns { + conns = append(conns, *c) + } + + return conns +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections_test.go new file mode 100644 index 00000000..88db3a58 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections_test.go @@ -0,0 +1,513 @@ +package daemon + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +var userAgent = useragent.MustParse("skycoin:0.24.1(foo)") + +func getMirrorPort(c *Connections, ip string, mirror uint32) uint16 { + c.Lock() + defer c.Unlock() + + x := c.mirrors[mirror] + if x == nil { + return 0 + } + + return x[ip] +} + +func TestConnectionsOutgoingFlow(t *testing.T) { + conns := NewConnections() + + ip := "127.0.0.1" + port := uint16(6060) + addr := fmt.Sprintf("%s:%d", ip, port) + + all := conns.all() + require.Empty(t, all) + + require.Equal(t, 0, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 0, conns.Len()) + require.Empty(t, conns.mirrors) + + // Flow: pending, connected, introduced + + c, err := conns.pending(addr) + require.NoError(t, err) + + require.True(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Equal(t, port, c.ListenPort) + require.Equal(t, ConnectionStatePending, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 1, conns.OutgoingLen()) + require.Equal(t, 1, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Empty(t, c.Mirror) + require.Empty(t, conns.mirrors) + require.False(t, c.HasIntroduced()) + require.Equal(t, addr, c.ListenAddr()) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + _, err = conns.pending(addr) + require.Equal(t, ErrConnectionExists, err) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 1, conns.OutgoingLen()) + require.Equal(t, 1, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Empty(t, conns.mirrors) + require.False(t, c.HasIntroduced()) + require.Equal(t, addr, c.ListenAddr()) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + _, err = conns.introduced(addr, 1, &IntroductionMessage{ + UserAgent: userAgent, + }) + require.Equal(t, ErrConnectionStateNotConnected, err) + require.Equal(t, 1, conns.PendingLen()) + + c, err = conns.connected(addr, 1) + require.NoError(t, err) + + require.True(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Equal(t, port, c.ListenPort) + require.Equal(t, ConnectionStateConnected, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 1, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Empty(t, c.Mirror) + require.Empty(t, conns.mirrors) + require.False(t, c.HasIntroduced()) + require.Equal(t, addr, c.ListenAddr()) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + m := &IntroductionMessage{ + // use a different port to make sure we don't overwrite the true listen port + ListenPort: port + 1, + Mirror: 1111, + ProtocolVersion: 2, + UserAgent: userAgent, + } + + c, err = conns.introduced(addr, 1, m) + require.NoError(t, err) + + require.True(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Equal(t, port, c.ListenPort) + require.Equal(t, ConnectionStateIntroduced, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 1, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Equal(t, m.Mirror, c.Mirror) + require.Equal(t, m.ProtocolVersion, c.ProtocolVersion) + require.Len(t, conns.mirrors, 1) + require.Equal(t, port, getMirrorPort(conns, ip, c.Mirror)) + require.True(t, c.HasIntroduced()) + require.Equal(t, addr, c.ListenAddr()) + require.Equal(t, userAgent, c.UserAgent) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + require.Equal(t, c, conns.get(c.Addr)) + require.Equal(t, c, conns.getByGnetID(c.gnetID)) + require.Equal(t, []*connection{c}, conns.getByListenAddr(c.ListenAddr())) + + err = conns.remove(addr, 1) + require.NoError(t, err) + + require.Equal(t, 0, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 0, conns.Len()) + require.Empty(t, conns.mirrors) + + all = conns.all() + require.Empty(t, all) + + require.Nil(t, conns.getByGnetID(c.gnetID)) + require.Nil(t, conns.getByListenAddr(c.ListenAddr())) + require.Nil(t, conns.get(c.Addr)) +} + +func TestConnectionsIncomingFlow(t *testing.T) { + conns := NewConnections() + + ip := "127.0.0.1" + port := uint16(6060) + addr := fmt.Sprintf("%s:%d", ip, port) + + all := conns.all() + require.Empty(t, all) + + require.Equal(t, 0, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 0, conns.Len()) + require.Empty(t, conns.mirrors) + + // Flow: connected, introduced + + c, err := conns.connected(addr, 1) + require.NoError(t, err) + + require.False(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Empty(t, c.ListenPort) + require.Equal(t, ConnectionStateConnected, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Empty(t, c.Mirror) + require.Empty(t, conns.mirrors) + require.False(t, c.HasIntroduced()) + require.Empty(t, c.ListenAddr()) + require.Empty(t, conns.listenAddrs) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + m := &IntroductionMessage{ + // use a different port to make sure that we use the self-reported listen port for incoming connections + ListenPort: port + 1, + Mirror: 1111, + ProtocolVersion: 2, + UserAgent: userAgent, + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 1111, + MaxDropletPrecision: 2, + }, + } + + c, err = conns.introduced(addr, 1, m) + require.NoError(t, err) + + require.False(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Equal(t, m.ListenPort, c.ListenPort) + require.Equal(t, ConnectionStateIntroduced, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Equal(t, m.Mirror, c.Mirror) + require.Equal(t, m.ProtocolVersion, c.ProtocolVersion) + require.Len(t, conns.mirrors, 1) + require.Equal(t, m.ListenPort, getMirrorPort(conns, ip, c.Mirror)) + require.True(t, c.HasIntroduced()) + require.Equal(t, fmt.Sprintf("%s:%d", ip, m.ListenPort), c.ListenAddr()) + require.Equal(t, userAgent, c.UserAgent) + require.Equal(t, uint32(4), c.UnconfirmedVerifyTxn.BurnFactor) + require.Equal(t, uint32(1111), c.UnconfirmedVerifyTxn.MaxTransactionSize) + require.Equal(t, uint8(2), c.UnconfirmedVerifyTxn.MaxDropletPrecision) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + err = conns.remove(addr, 1) + require.NoError(t, err) + + require.Equal(t, 0, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 0, conns.Len()) + require.Empty(t, conns.mirrors) + + all = conns.all() + require.Empty(t, all) + + require.Nil(t, conns.getByGnetID(c.gnetID)) + require.Nil(t, conns.getByListenAddr(c.ListenAddr())) + require.Nil(t, conns.get(c.Addr)) +} + +func TestConnectionsMultiple(t *testing.T) { + conns := NewConnections() + + addr1 := "127.0.0.1:6060" + addr2 := "127.0.0.1:6061" + + _, err := conns.pending(addr1) + require.NoError(t, err) + + _, err = conns.pending(addr2) + require.NoError(t, err) + + require.Equal(t, 2, conns.OutgoingLen()) + require.Equal(t, 2, conns.PendingLen()) + require.Equal(t, 2, conns.IPCount("127.0.0.1")) + + _, err = conns.connected(addr1, 1) + require.NoError(t, err) + require.Equal(t, 1, conns.PendingLen()) + + _, err = conns.connected(addr2, 2) + require.NoError(t, err) + require.Equal(t, 0, conns.PendingLen()) + + _, err = conns.introduced(addr1, 1, &IntroductionMessage{ + Mirror: 6, + ListenPort: 6060, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.NoError(t, err) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, len(conns.mirrors)) + + // introduction fails if a base IP + mirror is already in use + _, err = conns.introduced(addr2, 2, &IntroductionMessage{ + Mirror: 6, + ListenPort: 6061, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.Equal(t, ErrConnectionIPMirrorExists, err) + require.Equal(t, 0, conns.PendingLen()) + + c := conns.get(addr2) + require.Equal(t, ConnectionStateConnected, c.State) + require.Equal(t, c, conns.getByGnetID(2)) + require.Equal(t, []*connection{c}, conns.getByListenAddr("127.0.0.1:6061")) + + _, err = conns.introduced(addr2, 2, &IntroductionMessage{ + Mirror: 7, + ListenPort: 6061, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.NoError(t, err) + require.Equal(t, 2, len(conns.mirrors)) + require.Equal(t, 2, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 2, conns.Len()) + require.Equal(t, 2, conns.IPCount("127.0.0.1")) + c = conns.get(addr2) + require.Equal(t, ConnectionStateIntroduced, c.State) + require.Equal(t, c, conns.getByGnetID(2)) + require.Equal(t, []*connection{c}, conns.getByListenAddr("127.0.0.1:6061")) + + // Add another connection with a different base IP but same mirror value + addr3 := "127.1.1.1:12345" + _, err = conns.connected(addr3, 3) + require.NoError(t, err) + + _, err = conns.introduced(addr3, 3, &IntroductionMessage{ + Mirror: 6, + ListenPort: 6060, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.NoError(t, err) + + require.Equal(t, 2, len(conns.mirrors)) + require.Equal(t, 2, len(conns.mirrors[6])) + require.Equal(t, uint16(6060), getMirrorPort(conns, "127.0.0.1", 6)) + require.Equal(t, uint16(6061), getMirrorPort(conns, "127.0.0.1", 7)) + require.Equal(t, uint16(6060), getMirrorPort(conns, "127.1.1.1", 6)) + + require.Equal(t, 2, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 3, conns.Len()) + require.Equal(t, 2, conns.IPCount("127.0.0.1")) + require.Equal(t, 1, conns.IPCount("127.1.1.1")) + + err = conns.remove(addr1, 2) + require.Equal(t, ErrConnectionGnetIDMismatch, err) + require.Equal(t, 3, conns.Len()) + + err = conns.remove(addr1, 1) + require.NoError(t, err) + err = conns.remove(addr2, 2) + require.NoError(t, err) + err = conns.remove(addr3, 3) + require.NoError(t, err) + require.Empty(t, conns.mirrors) + require.Equal(t, 0, conns.Len()) + + err = conns.remove(addr1, 1) + require.Equal(t, ErrConnectionNotExist, err) +} + +func TestConnectionsMultipleSameListenPort(t *testing.T) { + conns := NewConnections() + + addr1 := "127.0.0.1:6060" + addr2 := "127.0.0.1:51414" + + c, err := conns.pending(addr1) + require.NoError(t, err) + require.Equal(t, []*connection{c}, conns.getByListenAddr(addr1)) + + c2, err := conns.connected(addr2, 2) + require.NoError(t, err) + require.Equal(t, []*connection{c}, conns.getByListenAddr(addr1)) + + _, err = conns.introduced(addr2, 2, &IntroductionMessage{ + Mirror: 6, + ListenPort: 6060, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.NoError(t, err) + + listenAddrConns := conns.getByListenAddr(addr1) + require.Len(t, listenAddrConns, 2) + require.True(t, *listenAddrConns[0] == *c || *listenAddrConns[0] == *c2) + if *listenAddrConns[0] == *c { + require.Equal(t, c2, listenAddrConns[1]) + } else if *listenAddrConns[0] == *c2 { + require.Equal(t, c, listenAddrConns[1]) + } + + err = conns.remove(addr1, 0) + require.NoError(t, err) + + listenAddrConns = conns.getByListenAddr(addr1) + require.Len(t, listenAddrConns, 1) + require.Equal(t, c2, listenAddrConns[0]) + + err = conns.remove(addr2, 2) + require.NoError(t, err) + require.Len(t, conns.getByListenAddr(addr1), 0) + + err = conns.remove(addr2, 2) + require.Equal(t, ErrConnectionNotExist, err) + + require.Len(t, conns.listenAddrs, 0) +} + +func TestConnectionsErrors(t *testing.T) { + conns := NewConnections() + + _, err := conns.pending("foo") + testutil.RequireError(t, err, "address foo: missing port in address") + + _, err = conns.connected("foo", 1) + testutil.RequireError(t, err, "address foo: missing port in address") + + _, err = conns.introduced("foo", 1, &IntroductionMessage{}) + testutil.RequireError(t, err, "address foo: missing port in address") + + err = conns.remove("foo", 0) + testutil.RequireError(t, err, "address foo: missing port in address") + + _, err = conns.introduced("127.0.0.1:6060", 1, &IntroductionMessage{}) + require.Equal(t, ErrConnectionNotExist, err) + + _, err = conns.connected("127.0.0.1:6060", 0) + require.Equal(t, ErrInvalidGnetID, err) + + _, err = conns.introduced("127.0.0.1:6060", 0, &IntroductionMessage{}) + require.Equal(t, ErrInvalidGnetID, err) +} + +func TestConnectionsSetHeight(t *testing.T) { + conns := NewConnections() + addr := "127.0.0.1:6060" + height := uint64(1010) + + err := conns.SetHeight(addr, 1, height) + require.Equal(t, ErrConnectionNotExist, err) + + c, err := conns.connected(addr, 1) + require.NoError(t, err) + require.Empty(t, c.Height) + + err = conns.SetHeight(addr, 1, height) + require.NoError(t, err) + + err = conns.SetHeight(addr, 2, height) + require.Equal(t, ErrConnectionGnetIDMismatch, err) + + c = conns.get(addr) + require.NotNil(t, c) + require.Equal(t, height, c.Height) +} + +func TestConnectionsModifyMirrorPanics(t *testing.T) { + conns := NewConnections() + addr := "127.0.0.1:6060" + + _, err := conns.connected(addr, 1) + require.NoError(t, err) + + // modifying mirror value causes panic + require.Panics(t, func() { + conns.modify(addr, 1, func(c *ConnectionDetails) { //nolint:errcheck + c.Mirror++ + }) + }) + + // modifying ListenPort causes panic + require.Panics(t, func() { + conns.modify(addr, 1, func(c *ConnectionDetails) { //nolint:errcheck + c.ListenPort = 999 + }) + }) +} + +func TestConnectionsStateTransitionErrors(t *testing.T) { + conns := NewConnections() + addr := "127.0.0.1:6060" + + _, err := conns.pending(addr) + require.NoError(t, err) + + // pending -> pending fails + _, err = conns.pending(addr) + require.Equal(t, ErrConnectionExists, err) + + // pending -> introduced fails + _, err = conns.introduced(addr, 1, &IntroductionMessage{}) + require.Equal(t, ErrConnectionStateNotConnected, err) + + _, err = conns.connected(addr, 1) + require.NoError(t, err) + + // connected -> connected fails + _, err = conns.connected(addr, 1) + require.Equal(t, ErrConnectionAlreadyConnected, err) + + // connected -> introduced fails if gnet ID does not match + _, err = conns.introduced(addr, 2, &IntroductionMessage{}) + require.Equal(t, ErrConnectionGnetIDMismatch, err) + + _, err = conns.introduced(addr, 1, &IntroductionMessage{}) + require.NoError(t, err) + + // introduced -> connected fails + _, err = conns.connected(addr, 1) + require.Equal(t, ErrConnectionAlreadyIntroduced, err) + + // introduced -> pending fails + _, err = conns.pending(addr) + require.Equal(t, ErrConnectionExists, err) + + // introduced -> introduced fails + _, err = conns.introduced(addr, 1, &IntroductionMessage{}) + require.Equal(t, ErrConnectionAlreadyIntroduced, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon.go new file mode 100644 index 00000000..a2cfbde7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon.go @@ -0,0 +1,1798 @@ +/* +Package daemon controls the networking layer of the skycoin daemon +*/ +package daemon + +import ( + "errors" + "fmt" + "math/rand" + "reflect" + "sort" + "strings" + "sync" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/elapse" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/iputil" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // ErrNetworkingDisabled is returned if networking is disabled + ErrNetworkingDisabled = errors.New("Networking is disabled") + // ErrNoPeerAcceptsTxn is returned if no peer will propagate a transaction broadcasted with BroadcastUserTransaction + ErrNoPeerAcceptsTxn = errors.New("No peer will propagate this transaction") + + logger = logging.MustGetLogger("daemon") +) + +// IsBroadcastFailure returns true if an error indicates that a broadcast operation failed +func IsBroadcastFailure(err error) bool { + switch err { + case ErrNetworkingDisabled, + gnet.ErrPoolEmpty, + gnet.ErrNoMatchingConnections, + gnet.ErrNoReachableConnections, + gnet.ErrNoAddresses: + return true + default: + return false + } +} + +const ( + daemonRunDurationThreshold = time.Millisecond * 200 +) + +// Config subsystem configurations +type Config struct { + Daemon DaemonConfig + Messages MessagesConfig + Pool PoolConfig + Pex pex.Config +} + +// NewConfig returns a Config with defaults set +func NewConfig() Config { + return Config{ + Daemon: NewDaemonConfig(), + Pool: NewPoolConfig(), + Pex: pex.NewConfig(), + Messages: NewMessagesConfig(), + } +} + +// preprocess preprocess for config +func (cfg *Config) preprocess() (Config, error) { + config := *cfg + if config.Daemon.LocalhostOnly { + if config.Daemon.Address == "" { + local, err := iputil.LocalhostIP() + if err != nil { + logger.WithError(err).Panic("Failed to obtain localhost IP") + } + config.Daemon.Address = local + } else { + if !iputil.IsLocalhost(config.Daemon.Address) { + logger.WithField("addr", config.Daemon.Address).Panic("Invalid address for localhost-only") + } + } + config.Pex.AllowLocalhost = true + } + config.Pool.port = config.Daemon.Port + config.Pool.address = config.Daemon.Address + + if config.Daemon.DisableNetworking { + logger.Info("Networking is disabled") + config.Pex.Disabled = true + config.Daemon.DisableIncomingConnections = true + config.Daemon.DisableOutgoingConnections = true + } else { + if config.Daemon.DisableIncomingConnections { + logger.Info("Incoming connections are disabled.") + } + if config.Daemon.DisableOutgoingConnections { + logger.Info("Outgoing connections are disabled.") + } + } + + if config.Daemon.MaxConnections < config.Daemon.MaxOutgoingConnections { + return Config{}, errors.New("MaxOutgoingConnections cannot be more than MaxConnections") + } + + if config.Daemon.MaxPendingConnections > config.Daemon.MaxOutgoingConnections { + config.Daemon.MaxPendingConnections = config.Daemon.MaxOutgoingConnections + } + + config.Pool.MaxConnections = config.Daemon.MaxConnections + config.Pool.MaxOutgoingConnections = config.Daemon.MaxOutgoingConnections + config.Pool.MaxIncomingMessageLength = int(config.Daemon.MaxIncomingMessageLength) + config.Pool.MaxOutgoingMessageLength = int(config.Daemon.MaxOutgoingMessageLength) + + // MaxOutgoingMessageLength must be able to fit a GiveBlocksMessage with at least one maximum-sized block, + // otherwise it cannot send certain blocks. + // Blocks are the largest object sent over the network, so MaxBlockTransactionsSize is used as an upper limit + maxSizeGBM := maxSizeGiveBlocksMessage(config.Daemon.MaxBlockTransactionsSize) + if config.Daemon.MaxOutgoingMessageLength < maxSizeGBM { + return Config{}, fmt.Errorf("MaxOutgoingMessageLength must be >= %d", maxSizeGBM) + } + + userAgent, err := config.Daemon.UserAgent.Build() + if err != nil { + return Config{}, err + } + if userAgent == "" { + return Config{}, errors.New("user agent is required") + } + config.Daemon.userAgent = userAgent + + return config, nil +} + +// maxSizeGiveBlocksMessage return the encoded size of a GiveBlocksMessage +// with a single signed block of the largest possible size +func maxSizeGiveBlocksMessage(maxBlockSize uint32) uint64 { + size := uint64(4) // message type prefix + size += encodeSizeGiveBlocksMessage(&GiveBlocksMessage{}) // size of an empty GiveBlocksMessage + size += encodeSizeSignedBlock(&coin.SignedBlock{}) // size of an empty SignedBlock + size += uint64(maxBlockSize) // maximum size of all transactions in a block + return size +} + +// DaemonConfig configuration for the Daemon +type DaemonConfig struct { //nolint:golint + // Protocol version. TODO -- manage version better + ProtocolVersion int32 + // Minimum accepted protocol version + MinProtocolVersion int32 + // IP Address to serve on. Leave empty for automatic assignment + Address string + // BlockchainPubkey blockchain pubkey string + BlockchainPubkey cipher.PubKey + // GenesisHash genesis block hash + GenesisHash cipher.SHA256 + // TCP/UDP port for connections + Port int + // Directory where application data is stored + DataDirectory string + // How often to check and initiate an outgoing connection to a trusted connection if needed + OutgoingTrustedRate time.Duration + // How often to check and initiate an outgoing connection if needed + OutgoingRate time.Duration + // How often to re-attempt to fill any missing private (aka required) connections + PrivateRate time.Duration + // Maximum number of connections + MaxConnections int + // Number of outgoing connections to maintain + MaxOutgoingConnections int + // Maximum number of connections to try at once + MaxPendingConnections int + // How long to wait for a version packet + IntroductionWait time.Duration + // How often to check for peers that have decided to stop communicating + CullInvalidRate time.Duration + // How often to update the database with transaction announcement timestamps + FlushAnnouncedTxnsRate time.Duration + // How many connections are allowed from the same base IP + IPCountsMax int + // Disable all networking activity + DisableNetworking bool + // Don't make outgoing connections + DisableOutgoingConnections bool + // Don't allow incoming connections + DisableIncomingConnections bool + // Run on localhost and only connect to localhost peers + LocalhostOnly bool + // Log ping and pong messages + LogPings bool + // How often to request blocks from peers + BlocksRequestRate time.Duration + // How often to announce our blocks to peers + BlocksAnnounceRate time.Duration + // How many blocks to request in a GetBlocksMessage + GetBlocksRequestCount uint64 + // Maximum number of blocks to respond with to a GetBlocksMessage + MaxGetBlocksResponseCount uint64 + // Max announce txns hash number + MaxTxnAnnounceNum int + // How often new blocks are created by the signing node, in seconds + BlockCreationInterval uint64 + // How often to check the unconfirmed pool for transactions that become valid + UnconfirmedRefreshRate time.Duration + // How often to remove transactions that become permanently invalid from the unconfirmed pool + UnconfirmedRemoveInvalidRate time.Duration + // Default "trusted" peers + DefaultConnections []string + // User agent (sent in introduction messages) + UserAgent useragent.Data + userAgent string // parsed from UserAgent in preprocess() + // Transaction verification parameters for unconfirmed transactions + UnconfirmedVerifyTxn params.VerifyTxn + // Random nonce value for detecting self-connection in introduction messages + Mirror uint32 + // Maximum size of incoming messages + MaxIncomingMessageLength uint64 + // Maximum size of incoming messages + MaxOutgoingMessageLength uint64 + // Maximum total size of transactions in a block + MaxBlockTransactionsSize uint32 +} + +// NewDaemonConfig creates daemon config +func NewDaemonConfig() DaemonConfig { + return DaemonConfig{ + ProtocolVersion: 2, + MinProtocolVersion: 2, + Address: "", + Port: 6677, + OutgoingRate: time.Second * 5, + OutgoingTrustedRate: time.Millisecond * 100, + PrivateRate: time.Second * 5, + MaxConnections: 128, + MaxOutgoingConnections: 8, + MaxPendingConnections: 8, + IntroductionWait: time.Second * 30, + CullInvalidRate: time.Second * 3, + FlushAnnouncedTxnsRate: time.Second * 3, + IPCountsMax: 3, + DisableNetworking: false, + DisableOutgoingConnections: false, + DisableIncomingConnections: false, + LocalhostOnly: false, + LogPings: true, + BlocksRequestRate: time.Second * 60, + BlocksAnnounceRate: time.Second * 60, + GetBlocksRequestCount: 20, + MaxGetBlocksResponseCount: 20, + MaxTxnAnnounceNum: 16, + BlockCreationInterval: 10, + UnconfirmedRefreshRate: time.Minute, + UnconfirmedRemoveInvalidRate: time.Minute, + Mirror: rand.New(rand.NewSource(time.Now().UTC().UnixNano())).Uint32(), + UnconfirmedVerifyTxn: params.UserVerifyTxn, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + MaxBlockTransactionsSize: 32768, + } +} + +//go:generate mockery -name daemoner -case underscore -inpkg -testonly + +// daemoner Daemon interface +type daemoner interface { + Disconnect(addr string, r gnet.DisconnectReason) error + DaemonConfig() DaemonConfig + sendMessage(addr string, msg gnet.Message) error + broadcastMessage(msg gnet.Message) ([]uint64, error) + disconnectNow(addr string, r gnet.DisconnectReason) error + addPeers(addrs []string) int + recordPeerHeight(addr string, gnetID, height uint64) + getSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) + headBkSeq() (uint64, bool, error) + executeSignedBlock(b coin.SignedBlock) error + filterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) + getKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) + requestBlocksFromAddr(addr string) error + announceAllValidTxns() error + pexConfig() pex.Config + injectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) + recordMessageEvent(m asyncMessage, c *gnet.MessageContext) error + connectionIntroduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) + sendRandomPeers(addr string) error +} + +// Daemon stateful properties of the daemon +type Daemon struct { + // Daemon configuration + config DaemonConfig + + // Components + Messages *Messages + pool *Pool + pex *pex.Pex + visor *visor.Visor + + // Cache of announced transactions that are flushed to the database periodically + announcedTxns *announcedTxnsCache + // Cache of connection metadata + connections *Connections + // connect, disconnect, message, error events channel + events chan interface{} + // quit channel + quit chan struct{} + // done channel + done chan struct{} +} + +// New returns a Daemon with primitives allocated +func New(config Config, v *visor.Visor) (*Daemon, error) { + config, err := config.preprocess() + if err != nil { + return nil, err + } + + pex, err := pex.New(config.Pex) + if err != nil { + return nil, err + } + + d := &Daemon{ + config: config.Daemon, + Messages: NewMessages(config.Messages), + pex: pex, + visor: v, + + announcedTxns: newAnnouncedTxnsCache(), + connections: NewConnections(), + events: make(chan interface{}, config.Pool.EventChannelSize), + quit: make(chan struct{}), + done: make(chan struct{}), + } + + d.pool, err = NewPool(config.Pool, d) + if err != nil { + return nil, err + } + + d.Messages.Config.Register() + + return d, nil +} + +// ConnectEvent generated when a client connects +type ConnectEvent struct { + GnetID uint64 + Addr string + Solicited bool +} + +// DisconnectEvent generated when a connection terminated +type DisconnectEvent struct { + GnetID uint64 + Addr string + Reason gnet.DisconnectReason +} + +// ConnectFailureEvent represent a failure to connect/dial a connection, with context +type ConnectFailureEvent struct { + Addr string + Solicited bool + Error error +} + +// messageEvent encapsulates a deserialized message from the network +type messageEvent struct { + Message asyncMessage + Context *gnet.MessageContext +} + +// Shutdown terminates all subsystems safely +func (dm *Daemon) Shutdown() { + defer logger.Info("Daemon shutdown complete") + + // close daemon run loop first to avoid creating new connection after + // the connection pool is shutdown. + logger.Info("Stopping the daemon run loop") + close(dm.quit) + + logger.Info("Shutting down Pool") + dm.pool.Shutdown() + + logger.Info("Shutting down Pex") + dm.pex.Shutdown() + + <-dm.done +} + +// Run main loop for peer/connection management +func (dm *Daemon) Run() error { + defer logger.Info("Daemon closed") + defer close(dm.done) + + logger.Infof("Daemon UserAgent is %s", dm.config.userAgent) + logger.Infof("Daemon unconfirmed BurnFactor is %d", dm.config.UnconfirmedVerifyTxn.BurnFactor) + logger.Infof("Daemon unconfirmed MaxTransactionSize is %d", dm.config.UnconfirmedVerifyTxn.MaxTransactionSize) + logger.Infof("Daemon unconfirmed MaxDropletPrecision is %d", dm.config.UnconfirmedVerifyTxn.MaxDropletPrecision) + + errC := make(chan error, 5) + var wg sync.WaitGroup + + wg.Add(1) + go func() { + defer wg.Done() + if err := dm.pex.Run(); err != nil { + logger.WithError(err).Error("daemon.Pex.Run failed") + errC <- err + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + if dm.config.DisableIncomingConnections { + if err := dm.pool.RunOffline(); err != nil { + logger.WithError(err).Error("daemon.Pool.RunOffline failed") + errC <- err + } + } else { + if err := dm.pool.Run(); err != nil { + logger.WithError(err).Error("daemon.Pool.Run failed") + errC <- err + } + } + }() + + blockInterval := time.Duration(dm.config.BlockCreationInterval) + blockCreationTicker := time.NewTicker(time.Second * blockInterval) + if !dm.visor.Config.IsBlockPublisher { + blockCreationTicker.Stop() + } + + unconfirmedRefreshTicker := time.NewTicker(dm.config.UnconfirmedRefreshRate) + defer unconfirmedRefreshTicker.Stop() + unconfirmedRemoveInvalidTicker := time.NewTicker(dm.config.UnconfirmedRemoveInvalidRate) + defer unconfirmedRemoveInvalidTicker.Stop() + blocksRequestTicker := time.NewTicker(dm.config.BlocksRequestRate) + defer blocksRequestTicker.Stop() + blocksAnnounceTicker := time.NewTicker(dm.config.BlocksAnnounceRate) + defer blocksAnnounceTicker.Stop() + + // outgoingTrustedConnectionsTicker is used to maintain at least one connection to a trusted peer. + // This may be configured at a very frequent rate, so if no trusted connections could be reached, + // there could be a lot of churn. + // The additional outgoingTrustedConnectionsTicker parameters are used to + // skip ticks of the outgoingTrustedConnectionsTicker in the event of total failure. + // outgoingTrustedConnectionsTickerSkipDuration is the minimum time to wait between + // ticks in the event of total failure. + outgoingTrustedConnectionsTicker := time.NewTicker(dm.config.OutgoingTrustedRate) + defer outgoingTrustedConnectionsTicker.Stop() + outgoingTrustedConnectionsTickerSkipDuration := time.Second * 5 + outgoingTrustedConnectionsTickerSkip := false + var outgoingTrustedConnectionsTickerSkipStart time.Time + + privateConnectionsTicker := time.NewTicker(dm.config.PrivateRate) + defer privateConnectionsTicker.Stop() + cullInvalidTicker := time.NewTicker(dm.config.CullInvalidRate) + defer cullInvalidTicker.Stop() + outgoingConnectionsTicker := time.NewTicker(dm.config.OutgoingRate) + defer outgoingConnectionsTicker.Stop() + requestPeersTicker := time.NewTicker(dm.pex.Config.RequestRate) + defer requestPeersTicker.Stop() + clearStaleConnectionsTicker := time.NewTicker(dm.pool.Config.ClearStaleRate) + defer clearStaleConnectionsTicker.Stop() + idleCheckTicker := time.NewTicker(dm.pool.Config.IdleCheckRate) + defer idleCheckTicker.Stop() + + flushAnnouncedTxnsTicker := time.NewTicker(dm.config.FlushAnnouncedTxnsRate) + defer flushAnnouncedTxnsTicker.Stop() + + // Connect to all trusted peers on startup to try to ensure a connection establishes quickly. + // The number of connections to default peers is restricted; + // if multiple connections succeed, extra connections beyond the limit will be disconnected. + if !dm.config.DisableOutgoingConnections { + wg.Add(1) + go func() { + defer wg.Done() + dm.connectToTrustedPeers() + }() + } + + var setupErr error + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + + // Process SendResults in a separate goroutine, otherwise SendResults + // will fill up much faster than can be processed by the daemon run loop + // dm.handleMessageSendResult must take care not to perform any operation + // that would violate thread safety, since it is not serialized by the daemon run loop + wg.Add(1) + go func() { + defer wg.Done() + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + loop: + for { + elapser.CheckForDone() + select { + case <-dm.quit: + break loop + + case r := <-dm.pool.Pool.SendResults: + // Process message sending results + elapser.Register("dm.Pool.Pool.SendResults") + if dm.config.DisableNetworking { + logger.Error("There should be nothing in SendResults") + return + } + dm.handleMessageSendResult(r) + } + } + }() + +loop: + for { + elapser.CheckForDone() + select { + case <-dm.quit: + break loop + + case <-cullInvalidTicker.C: + // Remove connections that failed to complete the handshake + elapser.Register("cullInvalidTicker") + if !dm.config.DisableNetworking { + dm.cullInvalidConnections() + } + + case <-requestPeersTicker.C: + // Request peers via PEX + elapser.Register("requestPeersTicker") + if dm.pex.Config.Disabled { + continue + } + + if dm.pex.IsFull() { + continue + } + + m := NewGetPeersMessage() + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Error("Broadcast GetPeersMessage failed") + continue + } + + case <-clearStaleConnectionsTicker.C: + // Remove connections that haven't said anything in a while + elapser.Register("clearStaleConnectionsTicker") + if !dm.config.DisableNetworking { + conns, err := dm.pool.getStaleConnections() + if err != nil { + logger.WithError(err).Error("getStaleConnections failed") + continue + } + + for _, addr := range conns { + if err := dm.Disconnect(addr, ErrDisconnectIdle); err != nil { + logger.WithError(err).WithField("addr", addr).Error("Disconnect") + } + } + } + + case <-idleCheckTicker.C: + // Sends pings as needed + elapser.Register("idleCheckTicker") + if !dm.config.DisableNetworking { + dm.pool.sendPings() + } + + case <-outgoingConnectionsTicker.C: + // Fill up our outgoing connections + elapser.Register("outgoingConnectionsTicker") + dm.connectToRandomPeer() + + case <-outgoingTrustedConnectionsTicker.C: + // Try to maintain at least one trusted connection + elapser.Register("outgoingTrustedConnectionsTicker") + // If connecting to a trusted peer totally fails, make sure to wait longer between further attempts + if outgoingTrustedConnectionsTickerSkip { + if time.Since(outgoingTrustedConnectionsTickerSkipStart) < outgoingTrustedConnectionsTickerSkipDuration { + continue + } + } + + if err := dm.maybeConnectToTrustedPeer(); err != nil && err != ErrNetworkingDisabled { + logger.Critical().WithError(err).Error("maybeConnectToTrustedPeer") + outgoingTrustedConnectionsTickerSkip = true + outgoingTrustedConnectionsTickerSkipStart = time.Now() + } else { + outgoingTrustedConnectionsTickerSkip = false + } + + case <-privateConnectionsTicker.C: + // Always try to stay connected to our private peers + // TODO (also, connect to all of them on start) + elapser.Register("privateConnectionsTicker") + if !dm.config.DisableOutgoingConnections { + dm.makePrivateConnections() + } + + case r := <-dm.events: + elapser.Register("dm.event") + if dm.config.DisableNetworking { + logger.Critical().Error("Networking is disabled, there should be no events") + } else { + dm.handleEvent(r) + } + + case <-flushAnnouncedTxnsTicker.C: + elapser.Register("flushAnnouncedTxnsTicker") + txns := dm.announcedTxns.flush() + + if err := dm.visor.SetTransactionsAnnounced(txns); err != nil { + logger.WithError(err).Error("Failed to set unconfirmed txn announce time") + } + + case <-blockCreationTicker.C: + // Create blocks, if block publisher + elapser.Register("blockCreationTicker.C") + if dm.visor.Config.IsBlockPublisher { + sb, err := dm.createAndPublishBlock() + if err != nil { + logger.WithError(err).Error("Failed to create and publish block") + continue + } + + // Not a critical error, but we want it visible in logs + head := sb.Block.Head + logger.Critical().WithFields(logrus.Fields{ + "version": head.Version, + "seq": head.BkSeq, + "time": head.Time, + }).Info("Created and published a new block") + } + + case <-unconfirmedRefreshTicker.C: + elapser.Register("unconfirmedRefreshTicker") + // Get the transactions that turn to valid + validTxns, err := dm.visor.RefreshUnconfirmed() + if err != nil { + logger.WithError(err).Error("dm.Visor.RefreshUnconfirmed failed") + continue + } + // Announce these transactions + if err := dm.announceTxnHashes(validTxns); err != nil { + logger.WithError(err).Warning("announceTxnHashes failed") + } + + case <-unconfirmedRemoveInvalidTicker.C: + elapser.Register("unconfirmedRemoveInvalidTicker") + // Remove transactions that become invalid (violating hard constraints) + removedTxns, err := dm.visor.RemoveInvalidUnconfirmed() + if err != nil { + logger.WithError(err).Error("dm.Visor.RemoveInvalidUnconfirmed failed") + continue + } + if len(removedTxns) > 0 { + logger.Infof("Remove %d txns from pool that began violating hard constraints", len(removedTxns)) + } + + case <-blocksRequestTicker.C: + elapser.Register("blocksRequestTicker") + if err := dm.requestBlocks(); err != nil { + logger.WithError(err).Warning("requestBlocks failed") + } + + case <-blocksAnnounceTicker.C: + elapser.Register("blocksAnnounceTicker") + if err := dm.announceBlocks(); err != nil { + logger.WithError(err).Warning("announceBlocks failed") + } + + case setupErr = <-errC: + logger.WithError(setupErr).Error("read from errc") + break loop + } + } + + if setupErr != nil { + return setupErr + } + + wg.Wait() + + return nil +} + +// Connects to a given peer. Returns an error if no connection attempt was +// made. If the connection attempt itself fails, the error is sent to +// the connectionErrors channel. +func (dm *Daemon) connectToPeer(p pex.Peer) error { + if dm.config.DisableOutgoingConnections { + return errors.New("Outgoing connections disabled") + } + + a, _, err := iputil.SplitAddr(p.Addr) + if err != nil { + logger.Critical().WithField("addr", p.Addr).WithError(err).Warning("PEX gave us an invalid peer") + return errors.New("Invalid peer") + } + + if dm.config.LocalhostOnly && !iputil.IsLocalhost(a) { + return errors.New("Not localhost") + } + + if c := dm.connections.get(p.Addr); c != nil { + return errors.New("Already connected to this peer") + } + + cnt := dm.connections.IPCount(a) + if !dm.config.LocalhostOnly && cnt != 0 { + return errors.New("Already connected to a peer with this base IP") + } + + logger.WithField("addr", p.Addr).Debug("Establishing outgoing connection") + + if _, err := dm.connections.pending(p.Addr); err != nil { + logger.Critical().WithError(err).WithField("addr", p.Addr).Error("dm.connections.pending failed") + return err + } + + go func() { + if err := dm.pool.Pool.Connect(p.Addr); err != nil { + dm.events <- ConnectFailureEvent{ + Addr: p.Addr, + Solicited: true, + Error: err, + } + } + }() + return nil +} + +// Connects to all private peers +func (dm *Daemon) makePrivateConnections() { + if dm.config.DisableOutgoingConnections { + return + } + + peers := dm.pex.Private() + for _, p := range peers { + logger.WithField("addr", p.Addr).Info("Private peer attempt") + if err := dm.connectToPeer(p); err != nil { + logger.WithField("addr", p.Addr).WithError(err).Debug("Did not connect to private peer") + } + } +} + +// connectToTrustedPeers tries to connect to all trusted peers +func (dm *Daemon) connectToTrustedPeers() { + if dm.config.DisableOutgoingConnections { + return + } + + logger.Info("Connect to trusted peers") + // Make connections to all trusted peers to try to ensure a connection + // MaxDefaultPeerOutgoingConnections limits will be enforced in gnet + // after connections have been established, so not all trusted peers will be connected to. + peers := dm.pex.TrustedPublic() + for _, p := range peers { + if err := dm.connectToPeer(p); err != nil { + logger.WithError(err).WithField("addr", p.Addr).Warning("connect to trusted peer failed") + } + } +} + +// maybeConnectToTrustedPeer tries to connect to one trusted peer if there are no trusted connections +func (dm *Daemon) maybeConnectToTrustedPeer() error { + if dm.config.DisableOutgoingConnections { + return ErrNetworkingDisabled + } + + peers := dm.pex.TrustedPublic() + for _, p := range peers { + // Don't make a connection if we have a trusted peer connection + if len(dm.connections.getByListenAddr(p.Addr)) != 0 { + return nil + } + } + + connected := false + for _, p := range peers { + if err := dm.connectToPeer(p); err != nil { + logger.WithError(err).WithField("addr", p.Addr).Warning("maybeConnectToTrustedPeer: connectToPeer failed") + continue + } + connected = true + break + } + + if !connected { + return errors.New("Could not connect to any trusted peer") + } + + return nil +} + +// connectToRandomPeer attempts to connect to a random peer. If it fails, the peer is removed. +func (dm *Daemon) connectToRandomPeer() { + if dm.config.DisableOutgoingConnections { + return + } + if dm.connections.OutgoingLen() >= dm.config.MaxOutgoingConnections { + return + } + if dm.connections.PendingLen() >= dm.config.MaxPendingConnections { + return + } + if dm.connections.Len() >= dm.config.MaxConnections { + return + } + + // Make a connection to a random (public) peer + peers := dm.pex.RandomPublic(dm.config.MaxOutgoingConnections - dm.connections.OutgoingLen()) + for _, p := range peers { + if err := dm.connectToPeer(p); err != nil { + logger.WithError(err).WithField("addr", p.Addr).Warning("connectToPeer failed") + } + } + + // TODO -- don't reset if not needed? + if len(peers) == 0 { + dm.pex.ResetAllRetryTimes() + } +} + +// Removes connections who haven't sent a version after connecting +func (dm *Daemon) cullInvalidConnections() { + now := time.Now().UTC() + for _, c := range dm.connections.all() { + if c.State != ConnectionStateConnected { + continue + } + + if c.ConnectedAt.Add(dm.config.IntroductionWait).Before(now) { + logger.WithField("addr", c.Addr).Info("Disconnecting peer for not sending a version") + if err := dm.Disconnect(c.Addr, ErrDisconnectIntroductionTimeout); err != nil { + logger.WithError(err).WithField("addr", c.Addr).Error("Disconnect") + } + } + } +} + +func (dm *Daemon) isTrustedPeer(addr string) bool { + peer, ok := dm.pex.GetPeer(addr) + if !ok { + return false + } + + return peer.Trusted +} + +// recordMessageEvent records an asyncMessage to the messageEvent chan. Do not access +// messageEvent directly. +func (dm *Daemon) recordMessageEvent(m asyncMessage, c *gnet.MessageContext) error { + dm.events <- messageEvent{ + Message: m, + Context: c, + } + return nil +} + +func (dm *Daemon) handleEvent(e interface{}) { + switch x := e.(type) { + case messageEvent: + dm.onMessageEvent(x) + case ConnectEvent: + dm.onConnectEvent(x) + case DisconnectEvent: + dm.onDisconnectEvent(x) + case ConnectFailureEvent: + dm.onConnectFailure(x) + default: + logger.WithFields(logrus.Fields{ + "type": fmt.Sprintf("%T", e), + "value": fmt.Sprintf("%+v", e), + }).Panic("Invalid object in events queue") + } +} + +func (dm *Daemon) onMessageEvent(e messageEvent) { + // If the connection does not exist or the gnet ID is different, abort message processing + // This can occur because messageEvents for a given connection may occur + // after that connection has disconnected. + c := dm.connections.get(e.Context.Addr) + if c == nil { + logger.WithFields(logrus.Fields{ + "addr": e.Context.Addr, + "messageType": fmt.Sprintf("%T", e.Message), + }).Info("onMessageEvent no connection found") + return + } + + if c.gnetID != e.Context.ConnID { + logger.WithFields(logrus.Fields{ + "addr": e.Context.Addr, + "connGnetID": c.gnetID, + "contextGnetID": e.Context.ConnID, + "messageType": fmt.Sprintf("%T", e.Message), + }).Info("onMessageEvent connection gnetID does not match") + return + } + + // The first message received must be INTR, DISC or GIVP + if !c.HasIntroduced() { + switch e.Message.(type) { + case *IntroductionMessage, *DisconnectMessage, *GivePeersMessage: + default: + logger.WithFields(logrus.Fields{ + "addr": e.Context.Addr, + "messageType": fmt.Sprintf("%T", e.Message), + }).Info("needsIntro but first message is not INTR, DISC or GIVP") + if err := dm.Disconnect(e.Context.Addr, ErrDisconnectNoIntroduction); err != nil { + logger.WithError(err).WithField("addr", e.Context.Addr).Error("Disconnect") + } + return + } + } + + e.Message.process(dm) +} + +func (dm *Daemon) onConnectEvent(e ConnectEvent) { + fields := logrus.Fields{ + "addr": e.Addr, + "outgoing": e.Solicited, + "gnetID": e.GnetID, + } + logger.WithFields(fields).Info("onConnectEvent") + + // Update the connections state machine first + c, err := dm.connections.connected(e.Addr, e.GnetID) + if err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("connections.Connected failed") + if err := dm.Disconnect(e.Addr, ErrDisconnectUnexpectedError); err != nil { + logger.WithError(err).WithFields(fields).Error("Disconnect") + } + return + } + + // The connection should already be known as outgoing/solicited due to an earlier connections.pending call. + // If they do not match, there is e.Addr flaw in the concept or implementation of the state machine. + if c.Outgoing != e.Solicited { + logger.Critical().WithFields(fields).Warning("Connection.Outgoing does not match ConnectEvent.Solicited state") + } + + if dm.ipCountMaxed(e.Addr) { + logger.WithFields(fields).Info("Max connections for this IP address reached, disconnecting") + if err := dm.Disconnect(e.Addr, ErrDisconnectIPLimitReached); err != nil { + logger.WithError(err).WithFields(fields).Error("Disconnect") + } + return + } + + logger.WithFields(fields).Debug("Sending introduction message") + + if err := dm.sendMessage(e.Addr, NewIntroductionMessage( + dm.config.Mirror, + dm.config.ProtocolVersion, + dm.pool.Pool.Config.Port, + dm.config.BlockchainPubkey, + dm.config.userAgent, + dm.config.UnconfirmedVerifyTxn, + dm.config.GenesisHash, + )); err != nil { + logger.WithFields(fields).WithError(err).Error("Send IntroductionMessage failed") + return + } +} + +func (dm *Daemon) onDisconnectEvent(e DisconnectEvent) { + fields := logrus.Fields{ + "addr": e.Addr, + "reason": e.Reason, + "gnetID": e.GnetID, + } + logger.WithFields(fields).Info("onDisconnectEvent") + + if err := dm.connections.remove(e.Addr, e.GnetID); err != nil { + logger.WithError(err).WithFields(fields).Error("connections.Remove failed") + return + } + + // TODO -- blacklist peer for certain reasons, not just remove + switch e.Reason { + case ErrDisconnectIntroductionTimeout, + ErrDisconnectBlockchainPubkeyNotMatched, + ErrDisconnectInvalidExtraData, + ErrDisconnectInvalidUserAgent: + if !dm.isTrustedPeer(e.Addr) { + dm.pex.RemovePeer(e.Addr) + } + case ErrDisconnectNoIntroduction, + ErrDisconnectVersionNotSupported, + ErrDisconnectSelf: + dm.pex.IncreaseRetryTimes(e.Addr) + default: + switch e.Reason.Error() { + case "read failed: EOF": + dm.pex.IncreaseRetryTimes(e.Addr) + } + } +} + +func (dm *Daemon) onConnectFailure(c ConnectFailureEvent) { + // Remove the pending connection from connections and update the retry times in pex + logger.WithField("addr", c.Addr).WithError(c.Error).Debug("onConnectFailure") + + // onConnectFailure should only trigger for "pending" connections which have gnet ID 0; + // connections in any other state will have a nonzero gnet ID. + // if the connection is in a different state, the gnet ID will not match, the connection + // won't be removed and we'll receive an error. + // If this happens, it is a bug, and the connections state may be corrupted. + if err := dm.connections.remove(c.Addr, 0); err != nil { + logger.Critical().WithField("addr", c.Addr).WithError(err).Error("connections.remove") + } + + if strings.HasSuffix(c.Error.Error(), "connect: connection refused") { + dm.pex.IncreaseRetryTimes(c.Addr) + } +} + +// onGnetDisconnect triggered when a gnet.Connection terminates +func (dm *Daemon) onGnetDisconnect(addr string, gnetID uint64, reason gnet.DisconnectReason) { + dm.events <- DisconnectEvent{ + GnetID: gnetID, + Addr: addr, + Reason: reason, + } +} + +// onGnetConnect Triggered when a gnet.Connection connects +func (dm *Daemon) onGnetConnect(addr string, gnetID uint64, solicited bool) { + dm.events <- ConnectEvent{ + GnetID: gnetID, + Addr: addr, + Solicited: solicited, + } +} + +// onGnetConnectFailure triggered when a gnet.Connection fails to connect +func (dm *Daemon) onGnetConnectFailure(addr string, solicited bool, err error) { + dm.events <- ConnectFailureEvent{ + Addr: addr, + Solicited: solicited, + Error: err, + } +} + +// Returns whether the ipCount maximum has been reached. +// Always false when using LocalhostOnly config. +func (dm *Daemon) ipCountMaxed(addr string) bool { + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithField("addr", addr).Error("ipCountMaxed called with invalid addr") + return true + } + + return !dm.config.LocalhostOnly && dm.connections.IPCount(ip) >= dm.config.IPCountsMax +} + +// When an async message send finishes, its result is handled by this. +// This method must take care to perform only thread-safe actions, since it is called +// outside of the daemon run loop +func (dm *Daemon) handleMessageSendResult(r gnet.SendResult) { + if r.Error != nil { + var lg logrus.FieldLogger + if r.Error == gnet.ErrMsgExceedsMaxLen { + lg = logger.Critical() + } else { + lg = logger + } + + lg.WithError(r.Error).WithFields(logrus.Fields{ + "addr": r.Addr, + "msgType": reflect.TypeOf(r.Message), + }).Warning("Failed to send message") + return + } + + if m, ok := r.Message.(SendingTxnsMessage); ok { + dm.announcedTxns.add(m.GetFiltered()) + } + + if m, ok := r.Message.(*DisconnectMessage); ok { + if err := dm.disconnectNow(r.Addr, m.reason); err != nil { + logger.WithError(err).WithField("addr", r.Addr).Warning("disconnectNow") + } + } +} + +// requestBlocks sends a GetBlocksMessage to all connections +func (dm *Daemon) requestBlocks() error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.config.GetBlocksRequestCount) + + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Debug("Broadcast GetBlocksMessage failed") + return err + } + + return nil +} + +// announceBlocks sends an AnnounceBlocksMessage to all connections +func (dm *Daemon) announceBlocks() error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot announce blocks, there is no head block") + } + + m := NewAnnounceBlocksMessage(headSeq) + + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Debug("Broadcast AnnounceBlocksMessage failed") + return err + } + + return nil +} + +// createAndPublishBlock creates a block from unconfirmed transactions and sends it to the network. +// Will panic if not running as a block publisher. +// Will not create a block if outgoing connections are disabled. +// If the block was created but the broadcast failed, the error will be non-nil but the +// SignedBlock value will not be empty. +// TODO -- refactor this method -- it should either always create a block and maybe broadcast it, +// or use a database transaction to rollback block publishing if broadcast failed (however, this will cause a slow DB write) +func (dm *Daemon) createAndPublishBlock() (*coin.SignedBlock, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + sb, err := dm.visor.CreateAndExecuteBlock() + if err != nil { + return nil, err + } + + err = dm.broadcastBlock(sb) + + return &sb, err +} + +// ResendUnconfirmedTxns resends all unconfirmed transactions and returns the hashes that were successfully rebroadcast. +// It does not return an error if broadcasting fails. +func (dm *Daemon) ResendUnconfirmedTxns() ([]cipher.SHA256, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + txns, err := dm.visor.GetAllUnconfirmedTransactions() + if err != nil { + return nil, err + } + + var txids []cipher.SHA256 + for i := range txns { + txnHash := txns[i].Transaction.Hash() + logger.WithField("txid", txnHash.Hex()).Debug("Rebroadcast transaction") + if _, err := dm.BroadcastTransaction(txns[i].Transaction); err == nil { + txids = append(txids, txnHash) + } + } + + return txids, nil +} + +// BroadcastTransaction broadcasts a single transaction to all peers. +func (dm *Daemon) BroadcastTransaction(txn coin.Transaction) ([]uint64, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + m := NewGiveTxnsMessage(coin.Transactions{txn}, dm.config.MaxOutgoingMessageLength) + if len(m.Transactions) != 1 { + logger.Critical().Error("NewGiveTxnsMessage truncated its only transaction") + } + + ids, err := dm.broadcastMessage(m) + if err != nil { + logger.WithError(err).Error("Broadcast GiveTxnsMessage failed") + return nil, err + } + + logger.Debugf("BroadcastTransaction to %d conns", len(ids)) + + return ids, nil +} + +// BroadcastUserTransaction broadcasts a single transaction to all peers. +// Returns an error if no peers that would propagate the transaction could be reached. +func (dm *Daemon) BroadcastUserTransaction(txn coin.Transaction, head *coin.SignedBlock, inputs coin.UxArray) error { + ids, err := dm.BroadcastTransaction(txn) + if err != nil { + return err + } + + accepts, err := checkBroadcastTxnRecipients(dm.connections, ids, txn, head, inputs) + if err != nil { + logger.WithError(err).Error("BroadcastUserTransaction") + return err + } + + logger.Debugf("BroadcastUserTransaction transaction propagated by %d/%d conns", accepts, len(ids)) + + return nil +} + +// checkBroadcastTxnRecipients checks whether or not the recipients of a txn broadcast would accept the transaction as valid, +// based upon their reported txn verification parameters. +// If no recipient would accept the txn, an error is returned. +// The number of recipients that claim to accept the transaction is returned. +func checkBroadcastTxnRecipients(connections *Connections, ids []uint64, txn coin.Transaction, head *coin.SignedBlock, inputs coin.UxArray) (int, error) { + // Check if the connections will accept our transaction as valid. + // Clients v24 and earlier do not propagate soft-invalid transactions. + // Clients v24 and earlier do not advertise a user agent. + // Clients v24 and earlier do not advertise their transaction verification parameters, + // but will use defaults of BurnFactor=2, MaxTransactionSize=32768, MaxDropletPrecision=3. + // If none of the connections will propagate our transaction, return an error. + accepts := 0 + + for _, id := range ids { + c := connections.getByGnetID(id) + if c == nil { + continue + } + + if !c.HasIntroduced() { + continue + } + + // If the peer has not set their user agent, they are v24 or earlier. + // v24 and earlier will not propagate a transaction that does not pass soft-validation. + // Check if our transaction would pass their soft-validation, using the hardcoded defaults + // that are used by v24 and earlier. + if c.UserAgent.Empty() { + if err := verifyUserTxnAgainstPeer(txn, head, inputs, params.VerifyTxn{ + BurnFactor: 2, + MaxTransactionSize: 32 * 1024, + MaxDropletPrecision: 3, + }); err != nil { + logger.WithFields(logrus.Fields{ + "addr": c.Addr, + "gnetID": c.gnetID, + }).Debug("Peer will not propagate this transaction") + continue + } + } + + accepts++ + } + + if accepts == 0 { + return 0, ErrNoPeerAcceptsTxn + } + + return accepts, nil +} + +// verifyUserTxnAgainstPeer returns an error if a user-created transaction would not pass soft-validation +// according to a peer's reported verification parameters +func verifyUserTxnAgainstPeer(txn coin.Transaction, head *coin.SignedBlock, inputs coin.UxArray, verifyParams params.VerifyTxn) error { + // Check the droplet precision + for _, o := range txn.Out { + if err := params.DropletPrecisionCheck(verifyParams.MaxDropletPrecision, o.Coins); err != nil { + return err + } + } + + // Check the txn size + txnSize, err := txn.Size() + if err != nil { + logger.Critical().WithError(err).Error("txn.Size failed unexpectedly") + return err + } + + if txnSize > verifyParams.MaxTransactionSize { + return visor.ErrTxnExceedsMaxBlockSize + } + + // Check the coinhour burn fee + f, err := fee.TransactionFee(&txn, head.Time(), inputs) + if err != nil { + return err + } + + if err := fee.VerifyTransactionFee(&txn, f, verifyParams.BurnFactor); err != nil { + return err + } + + return nil +} + +// Disconnect sends a DisconnectMessage to a peer. After the DisconnectMessage is sent, the peer is disconnected. +// This allows all pending messages to be sent. Any message queued after a DisconnectMessage is unlikely to be sent +// to the peer (but possible). +func (dm *Daemon) Disconnect(addr string, r gnet.DisconnectReason) error { + logger.WithFields(logrus.Fields{ + "addr": addr, + "reason": r, + }).Debug("Sending DisconnectMessage") + return dm.sendMessage(addr, NewDisconnectMessage(r)) +} + +// Implements private daemoner interface methods: + +// requestBlocksFromAddr sends a GetBlocksMessage to one connected address +func (dm *Daemon) requestBlocksFromAddr(addr string) error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks from addr, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.config.GetBlocksRequestCount) + return dm.sendMessage(addr, m) +} + +// broadcastBlock sends a signed block to all connections +func (dm *Daemon) broadcastBlock(sb coin.SignedBlock) error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + m := NewGiveBlocksMessage([]coin.SignedBlock{sb}, dm.config.MaxOutgoingMessageLength) + if len(m.Blocks) != 1 { + logger.Critical().Error("NewGiveBlocksMessage truncated its only block") + } + + _, err := dm.broadcastMessage(m) + return err +} + +// DaemonConfig returns the daemon config +func (dm *Daemon) DaemonConfig() DaemonConfig { + return dm.config +} + +// connectionIntroduced transfers a connection to the "introduced" state in the connections state machine +// and updates other state +func (dm *Daemon) connectionIntroduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) { + c, err := dm.connections.introduced(addr, gnetID, m) + if err != nil { + return nil, err + } + + listenAddr := c.ListenAddr() + + fields := logrus.Fields{ + "addr": addr, + "gnetID": m.c.ConnID, + "connGnetID": c.gnetID, + "listenPort": m.ListenPort, + "listenAddr": listenAddr, + } + + if c.Outgoing { + // For successful outgoing connections, mark the peer as having an incoming port in the pex peerlist + // The peer should already be in the peerlist, since we use the peerlist to choose an outgoing connection to make + if err := dm.pex.SetHasIncomingPort(listenAddr, true); err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("pex.SetHasIncomingPort failed") + return nil, err + } + } else { + // For successful incoming connections, add the peer to the peer list, with their self-reported listen port + if err := dm.pex.AddPeer(listenAddr); err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("pex.AddPeer failed") + return nil, err + } + } + + if err := dm.pex.SetUserAgent(listenAddr, c.UserAgent); err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("pex.SetUserAgent failed") + return nil, err + } + + dm.pex.ResetRetryTimes(listenAddr) + + return c, nil +} + +// sendRandomPeers sends a random sample of peers to another peer +func (dm *Daemon) sendRandomPeers(addr string) error { + peers := dm.pex.RandomExchangeable(dm.pex.Config.ReplyCount) + if len(peers) == 0 { + logger.Debug("sendRandomPeers: no peers to send in reply") + return errors.New("No peers available") + } + + m := NewGivePeersMessage(peers, dm.config.MaxOutgoingMessageLength) + + return dm.sendMessage(addr, m) +} + +// announceAllValidTxns broadcasts valid unconfirmed transactions +func (dm *Daemon) announceAllValidTxns() error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + // Get valid unconfirmed transaction hashes + hashes, err := dm.visor.GetAllValidUnconfirmedTxHashes() + if err != nil { + return err + } + + return dm.announceTxnHashes(hashes) +} + +// announceTxnHashes announces transaction hashes, splitting them into chunks if they exceed MaxTxnAnnounceNum +func (dm *Daemon) announceTxnHashes(hashes []cipher.SHA256) error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + // Divide hashes into multiple sets of max size + hashesSet := divideHashes(hashes, dm.config.MaxTxnAnnounceNum) + + for _, hs := range hashesSet { + m := NewAnnounceTxnsMessage(hs, dm.config.MaxOutgoingMessageLength) + if len(m.Transactions) != len(hs) { + logger.Critical().Error("NewAnnounceTxnsMessage truncated hashes that were already split up") + } + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Debug("Broadcast AnnounceTxnsMessage failed") + return err + } + } + + return nil +} + +func divideHashes(hashes []cipher.SHA256, n int) [][]cipher.SHA256 { + if len(hashes) == 0 { + return [][]cipher.SHA256{} + } + + var j int + var hashesArray [][]cipher.SHA256 + + if len(hashes) > n { + for i := range hashes { + if len(hashes[j:i]) == n { + hs := make([]cipher.SHA256, n) + copy(hs, hashes[j:i]) + hashesArray = append(hashesArray, hs) + j = i + } + } + } + + hs := make([]cipher.SHA256, len(hashes)-j) + copy(hs, hashes[j:]) + hashesArray = append(hashesArray, hs) + return hashesArray +} + +// sendMessage sends a Message to a Connection and pushes the result onto the SendResults channel. +func (dm *Daemon) sendMessage(addr string, msg gnet.Message) error { + return dm.pool.Pool.SendMessage(addr, msg) +} + +// broadcastMessage sends a Message to all introduced connections in the Pool. +// Returns the gnet IDs of connections that broadcast succeeded for. +// Note that a connection could still fail to receive the message under certain network conditions, +// there is no guarantee that a message was broadcast. +func (dm *Daemon) broadcastMessage(msg gnet.Message) ([]uint64, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + conns := dm.connections.all() + var addrs []string + for _, c := range conns { + if c.HasIntroduced() { + addrs = append(addrs, c.Addr) + } + } + + return dm.pool.Pool.BroadcastMessage(msg, addrs) +} + +// disconnectNow disconnects from a peer immediately without sending a DisconnectMessage. Any pending messages +// will not be sent to the peer. +func (dm *Daemon) disconnectNow(addr string, r gnet.DisconnectReason) error { + return dm.pool.Pool.Disconnect(addr, r) +} + +// pexConfig returns the pex config +func (dm *Daemon) pexConfig() pex.Config { + return dm.pex.Config +} + +// addPeers adds peers to the pex +func (dm *Daemon) addPeers(addrs []string) int { + return dm.pex.AddPeers(addrs) +} + +// recordPeerHeight records the height of specific peer +func (dm *Daemon) recordPeerHeight(addr string, gnetID, height uint64) { + if err := dm.connections.SetHeight(addr, gnetID, height); err != nil { + logger.Critical().WithError(err).WithField("addr", addr).Error("connections.SetHeight failed") + } +} + +// getSignedBlocksSince returns N signed blocks since given seq +func (dm *Daemon) getSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) { + return dm.visor.GetSignedBlocksSince(seq, count) +} + +// headBkSeq returns the head block sequence +func (dm *Daemon) headBkSeq() (uint64, bool, error) { + return dm.visor.HeadBkSeq() +} + +// executeSignedBlock executes the signed block +func (dm *Daemon) executeSignedBlock(b coin.SignedBlock) error { + return dm.visor.ExecuteSignedBlock(b) +} + +// filterKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) filterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) { + return dm.visor.FilterKnownUnconfirmed(txns) +} + +// getKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) getKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) { + return dm.visor.GetKnownUnconfirmed(txns) +} + +// injectTransaction records a coin.Transaction to the UnconfirmedTxnPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard constraints, it is rejected, and error will not be nil. +// If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. +func (dm *Daemon) injectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) { + return dm.visor.InjectForeignTransaction(txn) +} + +/* Connection management API */ + +// Connection a connection's state within the daemon +type Connection struct { + Addr string + Pex pex.Peer + Gnet GnetConnectionDetails + ConnectionDetails +} + +// GnetConnectionDetails connection data from gnet +type GnetConnectionDetails struct { + ID uint64 + LastSent time.Time + LastReceived time.Time +} + +func newConnection(dc *connection, gc *gnet.Connection, pp *pex.Peer) Connection { + c := Connection{} + + if dc != nil { + c.Addr = dc.Addr + c.ConnectionDetails = dc.ConnectionDetails + } + + if gc != nil { + c.Gnet = GnetConnectionDetails{ + ID: gc.ID, + LastSent: gc.LastSent, + LastReceived: gc.LastReceived, + } + } + + if pp != nil { + c.Pex = *pp + } + + return c +} + +// newConnection creates a Connection from daemon.connection, gnet.Connection and pex.Peer +func (dm *Daemon) newConnection(c *connection) (*Connection, error) { + if c == nil { + return nil, nil + } + + gc, err := dm.pool.Pool.GetConnection(c.Addr) + if err != nil { + return nil, err + } + + var pp *pex.Peer + listenAddr := c.ListenAddr() + if listenAddr != "" { + p, ok := dm.pex.GetPeer(listenAddr) + if ok { + pp = &p + } + } + + cc := newConnection(c, gc, pp) + return &cc, nil +} + +// GetConnections returns solicited (outgoing) connections +func (dm *Daemon) GetConnections(f func(c Connection) bool) ([]Connection, error) { + if dm.pool.Pool == nil { + return nil, nil + } + + cs := dm.connections.all() + + conns := make([]Connection, 0) + + for _, c := range cs { + cc, err := dm.newConnection(&c) + if err != nil { + return nil, err + } + + ccc := *cc + + if !f(ccc) { + continue + } + + conns = append(conns, ccc) + } + + // Sort connnections by IP address + sort.Slice(conns, func(i, j int) bool { + return strings.Compare(conns[i].Addr, conns[j].Addr) < 0 + }) + + return conns, nil +} + +// GetDefaultConnections returns the default hardcoded connection addresses +func (dm *Daemon) GetDefaultConnections() []string { + conns := make([]string, len(dm.config.DefaultConnections)) + copy(conns[:], dm.config.DefaultConnections[:]) + return conns +} + +// GetConnection returns a *Connection of specific address +func (dm *Daemon) GetConnection(addr string) (*Connection, error) { + c := dm.connections.get(addr) + if c == nil { + return nil, nil + } + + return dm.newConnection(c) +} + +// DisconnectByGnetID disconnects a connection by gnet ID +func (dm *Daemon) DisconnectByGnetID(gnetID uint64) error { + c := dm.connections.getByGnetID(gnetID) + if c == nil { + return ErrConnectionNotExist + } + + return dm.Disconnect(c.Addr, ErrDisconnectRequestedByOperator) +} + +// GetTrustConnections returns all trusted connections +func (dm *Daemon) GetTrustConnections() []string { + return dm.pex.Trusted().ToAddrs() +} + +// GetExchgConnection returns all connections to peers found through peer exchange +func (dm *Daemon) GetExchgConnection() []string { + return dm.pex.RandomExchangeable(0).ToAddrs() +} + +/* Peer Blockchain Status API */ + +// BlockchainProgress is the current blockchain syncing status +type BlockchainProgress struct { + // Our current blockchain length + Current uint64 + // Our best guess at true blockchain length + Highest uint64 + // Individual blockchain length reports from peers + Peers []PeerBlockchainHeight +} + +// newBlockchainProgress creates BlockchainProgress from the local head blockchain sequence number +// and a list of remote peers +func newBlockchainProgress(headSeq uint64, conns []connection) *BlockchainProgress { + peers := newPeerBlockchainHeights(conns) + + return &BlockchainProgress{ + Current: headSeq, + Highest: EstimateBlockchainHeight(headSeq, peers), + Peers: peers, + } +} + +// PeerBlockchainHeight records blockchain height for an address +type PeerBlockchainHeight struct { + Address string + Height uint64 +} + +func newPeerBlockchainHeights(conns []connection) []PeerBlockchainHeight { + peers := make([]PeerBlockchainHeight, 0, len(conns)) + for _, c := range conns { + if c.State != ConnectionStatePending { + peers = append(peers, PeerBlockchainHeight{ + Address: c.Addr, + Height: c.Height, + }) + } + } + return peers +} + +// EstimateBlockchainHeight estimates the blockchain sync height. +// The highest height reported amongst all peers, and including the node itself, is returned. +func EstimateBlockchainHeight(headSeq uint64, peers []PeerBlockchainHeight) uint64 { + for _, c := range peers { + if c.Height > headSeq { + headSeq = c.Height + } + } + return headSeq +} + +// GetBlockchainProgress returns a *BlockchainProgress +func (dm *Daemon) GetBlockchainProgress(headSeq uint64) *BlockchainProgress { + conns := dm.connections.all() + return newBlockchainProgress(headSeq, conns) +} + +// InjectBroadcastTransaction injects transaction to the unconfirmed pool and broadcasts it. +// If the transaction violates either hard or soft constraints, it is neither injected nor broadcast. +// If the broadcast fails (due to no connections), the transaction is not injected. +// However, the broadcast may fail in practice, without returning an error, +// so this is not foolproof. +// This method is to be used by user-initiated transaction injections. +// For transactions received over the network, use daemon.injectTransaction and check the result to +// decide on repropagation. +func (dm *Daemon) InjectBroadcastTransaction(txn coin.Transaction) error { + return dm.visor.WithUpdateTx("daemon.InjectBroadcastTransaction", func(tx *dbutil.Tx) error { + _, head, inputs, err := dm.visor.InjectUserTransactionTx(tx, txn) + if err != nil { + logger.WithError(err).Error("InjectUserTransactionTx failed") + return err + } + + if err := dm.BroadcastUserTransaction(txn, head, inputs); err != nil { + logger.WithError(err).Error("BroadcastUserTransaction failed") + return err + } + + return nil + }) +} + +// InjectTransaction injects transaction to the unconfirmed pool but does not broadcast it. +// If the transaction violates either hard or soft constraints, it is not injected. +// This method is to be used by user-initiated transaction injections. +// For transactions received over the network, use daemon.injectTransaction and check the result to +// decide on repropagation. +func (dm *Daemon) InjectTransaction(txn coin.Transaction) error { + _, _, _, err := dm.visor.InjectUserTransaction(txn) + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon_test.go new file mode 100644 index 00000000..e23734b4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon_test.go @@ -0,0 +1,342 @@ +package daemon + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func TestDivideHashes(t *testing.T) { + hashes := make([]cipher.SHA256, 10) + for i := 0; i < 10; i++ { + hashes[i] = cipher.SumSHA256(cipher.RandByte(512)) + } + + testCases := []struct { + name string + init []cipher.SHA256 + n int + array [][]cipher.SHA256 + }{ + { + "has one odd", + hashes[:], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + []cipher.SHA256{ + hashes[3], + hashes[4], + hashes[5], + }, + []cipher.SHA256{ + hashes[6], + hashes[7], + hashes[8], + }, + []cipher.SHA256{ + hashes[9], + }, + }, + }, + { + "only one value", + hashes[:1], + 1, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + }, + }, + }, + { + "empty value", + hashes[:0], + 0, + [][]cipher.SHA256{}, + }, + { + "with 3 value", + hashes[:3], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + }, + }, + { + "with 8 value", + hashes[:8], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + []cipher.SHA256{ + hashes[3], + hashes[4], + hashes[5], + }, + []cipher.SHA256{ + hashes[6], + hashes[7], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + rlt := divideHashes(tc.init, tc.n) + require.Equal(t, tc.array, rlt) + }) + } +} + +func TestVerifyUserTxnAgainstPeer(t *testing.T) { + now := uint64(time.Now().UTC().Unix()) + + cases := []struct { + name string + err error + txn coin.Transaction + head *coin.SignedBlock + inputs coin.UxArray + verifyParams params.VerifyTxn + }{ + { + name: "invalid droplet precision", + err: params.ErrInvalidDecimals, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 111100, + }, + }, + }, + verifyParams: params.VerifyTxn{ + MaxDropletPrecision: 3, + }, + }, + + { + name: "invalid txn size", + err: visor.ErrTxnExceedsMaxBlockSize, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e6, + }, + }, + }, + verifyParams: params.VerifyTxn{ + MaxDropletPrecision: 3, + MaxTransactionSize: 1, + }, + }, + + { + name: "invalid burn fee", + err: fee.ErrTxnInsufficientFee, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e6, + Hours: 100, + }, + }, + }, + head: &coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: now, + }, + }, + }, + inputs: coin.UxArray{ + { + Head: coin.UxHead{ + Time: now, + }, + Body: coin.UxBody{ + Coins: 1e6, + Hours: 150, + }, + }, + }, + verifyParams: params.VerifyTxn{ + MaxDropletPrecision: 3, + MaxTransactionSize: 99999999, + BurnFactor: 2, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := verifyUserTxnAgainstPeer(tc.txn, tc.head, tc.inputs, tc.verifyParams) + require.Equal(t, tc.err, err) + }) + } +} + +func TestCheckBroadcastTxnRecipients(t *testing.T) { + // contains a connection not introduced and a connection without user agent + connections := NewConnections() + + // one connection connected but not introduced + _, err := connections.connected("1.1.1.1:9999", 3) + require.NoError(t, err) + + // one connection introduced without user agent + _, err = connections.connected("2.2.2.2:9999", 1) + require.NoError(t, err) + _, err = connections.introduced("2.2.2.2:9999", 1, &IntroductionMessage{ + Mirror: 6666, + ListenPort: 9999, + ProtocolVersion: 2, + }) + require.NoError(t, err) + + // contains a connection not introduced, a connection without user agent + // and a connection with user agent + connections2 := NewConnections() + + // one connection connected but not introduced + _, err = connections2.connected("1.1.1.1:9999", 3) + require.NoError(t, err) + + // one connection introduced without user agent + _, err = connections2.connected("2.2.2.2:9999", 1) + require.NoError(t, err) + _, err = connections2.introduced("2.2.2.2:9999", 1, &IntroductionMessage{ + Mirror: 6666, + ListenPort: 9999, + ProtocolVersion: 2, + }) + require.NoError(t, err) + + // one connection introduced with user agent + _, err = connections2.connected("3.3.3.3:9999", 2) + require.NoError(t, err) + _, err = connections2.introduced("3.3.3.3:9999", 2, &IntroductionMessage{ + Mirror: 7777, + ListenPort: 9999, + ProtocolVersion: 2, + UserAgent: useragent.MustParse("skycoin:0.25.1"), + UnconfirmedVerifyTxn: params.VerifyTxn{ + MaxDropletPrecision: 4, // the default precision for unspecified peers is 3 + MaxTransactionSize: 32768, + BurnFactor: 2, + }, + }) + require.NoError(t, err) + + cases := []struct { + name string + err error + accepts int + connections *Connections + ids []uint64 + txn coin.Transaction + head *coin.SignedBlock + inputs coin.UxArray + }{ + { + name: "accepted by connection with no user agent", + err: nil, + accepts: 1, + connections: connections, + ids: []uint64{1, 2, 999}, // includes unknown gnet id to make sure it doesn't crash on bad input + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e6, + }, + }, + }, + head: &coin.SignedBlock{}, + inputs: coin.UxArray{ + { + Body: coin.UxBody{ + Coins: 1e6, + Hours: 100, + }, + }, + }, + }, + + { + name: "not accepted by connection with no user agent", + err: ErrNoPeerAcceptsTxn, + accepts: 0, + connections: connections, + ids: []uint64{1, 2}, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e2, + }, + }, + }, + head: &coin.SignedBlock{}, + inputs: coin.UxArray{ + { + Body: coin.UxBody{ + Coins: 1e2, + Hours: 100, + }, + }, + }, + }, + + { + name: "connections contains a connection that specifies user agent, which will propagate a txn even if soft-invalid", + err: nil, + accepts: 1, + connections: connections2, + ids: []uint64{1, 2, 3}, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e1, + }, + }, + }, + head: &coin.SignedBlock{}, + inputs: coin.UxArray{ + { + Body: coin.UxBody{ + Coins: 1e1, + Hours: 100, + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + accepts, err := checkBroadcastTxnRecipients(tc.connections, tc.ids, tc.txn, tc.head, tc.inputs) + require.Equal(t, tc.err, err) + require.Equal(t, tc.accepts, accepts) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder.go new file mode 100644 index 00000000..3e8ed070 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder.go @@ -0,0 +1,118 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeDisconnectMessage computes the size of an encoded object of type DisconnectMessage +func encodeSizeDisconnectMessage(obj *DisconnectMessage) uint64 { + i0 := uint64(0) + + // obj.ReasonCode + i0 += 2 + + // obj.Reserved + i0 += 4 + uint64(len(obj.Reserved)) + + return i0 +} + +// encodeDisconnectMessage encodes an object of type DisconnectMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeDisconnectMessage(obj *DisconnectMessage) ([]byte, error) { + n := encodeSizeDisconnectMessage(obj) + buf := make([]byte, n) + + if err := encodeDisconnectMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeDisconnectMessageToBuffer encodes an object of type DisconnectMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeDisconnectMessageToBuffer(buf []byte, obj *DisconnectMessage) error { + if uint64(len(buf)) < encodeSizeDisconnectMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.ReasonCode + e.Uint16(obj.ReasonCode) + + // obj.Reserved length check + if uint64(len(obj.Reserved)) > math.MaxUint32 { + return errors.New("obj.Reserved length exceeds math.MaxUint32") + } + + // obj.Reserved length + e.Uint32(uint32(len(obj.Reserved))) + + // obj.Reserved copy + e.CopyBytes(obj.Reserved) + + return nil +} + +// decodeDisconnectMessage decodes an object of type DisconnectMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeDisconnectMessage(buf []byte, obj *DisconnectMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.ReasonCode + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.ReasonCode = i + } + + { + // obj.Reserved + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Reserved = make([]byte, length) + + copy(obj.Reserved[:], d.Buffer[:length]) + d.Buffer = d.Buffer[length:] + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeDisconnectMessageExact decodes an object of type DisconnectMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeDisconnectMessageExact(buf []byte, obj *DisconnectMessage) error { + if n, err := decodeDisconnectMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder_test.go new file mode 100644 index 00000000..f19ef035 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyDisconnectMessageForEncodeTest() *DisconnectMessage { + var obj DisconnectMessage + return &obj +} + +func newRandomDisconnectMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *DisconnectMessage { + var obj DisconnectMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenDisconnectMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *DisconnectMessage { + var obj DisconnectMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilDisconnectMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *DisconnectMessage { + var obj DisconnectMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderDisconnectMessage(t *testing.T, obj *DisconnectMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeDisconnectMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeDisconnectMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeDisconnectMessage(obj) + if err != nil { + t.Fatalf("encodeDisconnectMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeDisconnectMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeDisconnectMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeDisconnectMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeDisconnectMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 DisconnectMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 DisconnectMessage + if n, err := decodeDisconnectMessage(data2, &obj3); err != nil { + t.Fatalf("decodeDisconnectMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeDisconnectMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeDisconnectMessage()") + } + + // Decode, excess buffer + var obj4 DisconnectMessage + n, err := decodeDisconnectMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeDisconnectMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeDisconnectMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeDisconnectMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeDisconnectMessage()") + } + + // DecodeExact + var obj5 DisconnectMessage + if err := decodeDisconnectMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeDisconnectMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeDisconnectMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeDisconnectMessage(data4, &obj3); err != nil { + t.Fatalf("decodeDisconnectMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeDisconnectMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderDisconnectMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *DisconnectMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyDisconnectMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomDisconnectMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenDisconnectMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilDisconnectMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderDisconnectMessage(t, tc.obj) + }) + } +} + +func decodeDisconnectMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj DisconnectMessage + if _, err := decodeDisconnectMessage(buf, &obj); err == nil { + t.Fatal("decodeDisconnectMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeDisconnectMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeDisconnectMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj DisconnectMessage + if err := decodeDisconnectMessageExact(buf, &obj); err == nil { + t.Fatal("decodeDisconnectMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeDisconnectMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderDisconnectMessageDecodeErrors(t *testing.T, k int, tag string, obj *DisconnectMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeDisconnectMessage(obj) + buf, err := encodeDisconnectMessage(obj) + if err != nil { + t.Fatalf("encodeDisconnectMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeDisconnectMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeDisconnectMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeDisconnectMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeDisconnectMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeDisconnectMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderDisconnectMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyDisconnectMessageForEncodeTest() + fullObj := newRandomDisconnectMessageForEncodeTest(t, rand) + testSkyencoderDisconnectMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderDisconnectMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors.go new file mode 100644 index 00000000..8cb21b5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors.go @@ -0,0 +1,112 @@ +package daemon + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/daemon/gnet" +) + +var ( + // ErrDisconnectVersionNotSupported version is below minimum supported version + ErrDisconnectVersionNotSupported gnet.DisconnectReason = errors.New("Version is below minimum supported version") + // ErrDisconnectIntroductionTimeout timeout + ErrDisconnectIntroductionTimeout gnet.DisconnectReason = errors.New("Introduction timeout") + // ErrDisconnectIsBlacklisted is blacklisted + ErrDisconnectIsBlacklisted gnet.DisconnectReason = errors.New("Blacklisted") + // ErrDisconnectSelf self connnect + ErrDisconnectSelf gnet.DisconnectReason = errors.New("Self connect") + // ErrDisconnectConnectedTwice connect twice + ErrDisconnectConnectedTwice gnet.DisconnectReason = errors.New("Already connected") + // ErrDisconnectIdle idle + ErrDisconnectIdle gnet.DisconnectReason = errors.New("Idle") + // ErrDisconnectNoIntroduction no introduction + ErrDisconnectNoIntroduction gnet.DisconnectReason = errors.New("First message was not an Introduction") + // ErrDisconnectIPLimitReached ip limit reached + ErrDisconnectIPLimitReached gnet.DisconnectReason = errors.New("Maximum number of connections for this IP was reached") + // ErrDisconnectUnexpectedError this is returned when a seemingly impossible error is encountered, e.g. net.Conn.Addr() returns an invalid ip:port + ErrDisconnectUnexpectedError gnet.DisconnectReason = errors.New("Unexpected error") + // ErrDisconnectMaxOutgoingConnectionsReached is returned when connection pool size is greater than the maximum allowed + ErrDisconnectMaxOutgoingConnectionsReached gnet.DisconnectReason = errors.New("Maximum outgoing connections was reached") + // ErrDisconnectBlockchainPubkeyNotMatched is returned when the blockchain pubkey in introduction does not match + ErrDisconnectBlockchainPubkeyNotMatched gnet.DisconnectReason = errors.New("Blockchain pubkey does not match") + // ErrDisconnectBlockchainPubkeyNotProvided is returned when the blockchain pubkey in introduction is not provided + ErrDisconnectBlockchainPubkeyNotProvided gnet.DisconnectReason = errors.New("Blockchain pubkey is not provided") + // ErrDisconnectInvalidExtraData is returned when extra field can't be parsed + ErrDisconnectInvalidExtraData gnet.DisconnectReason = errors.New("Invalid extra data in message") + // ErrDisconnectReceivedDisconnect received a DisconnectMessage + ErrDisconnectReceivedDisconnect gnet.DisconnectReason = errors.New("Received DisconnectMessage") + // ErrDisconnectInvalidUserAgent is returned if the peer provides an invalid user agent + ErrDisconnectInvalidUserAgent gnet.DisconnectReason = errors.New("Invalid user agent") + // ErrDisconnectRequestedByOperator the operator of the node requested a disconnect + ErrDisconnectRequestedByOperator gnet.DisconnectReason = errors.New("Disconnect requested by the node operator") + // ErrDisconnectPeerlistFull the peerlist is full + ErrDisconnectPeerlistFull gnet.DisconnectReason = errors.New("Peerlist is full") + // ErrDisconnectInvalidBurnFactor invalid burn factor in introduction message + ErrDisconnectInvalidBurnFactor gnet.DisconnectReason = errors.New("Invalid burn factor in introduction message") + // ErrDisconnectInvalidMaxTransactionSize invalid max transaction size in introduction message + ErrDisconnectInvalidMaxTransactionSize gnet.DisconnectReason = errors.New("Invalid max transaction size in introduction message") + // ErrDisconnectInvalidMaxDropletPrecision invalid max droplet precision in introduction message + ErrDisconnectInvalidMaxDropletPrecision gnet.DisconnectReason = errors.New("Invalid max droplet precision in introduction message") + + // ErrDisconnectUnknownReason used when mapping an unknown reason code to an error. Is not sent over the network. + ErrDisconnectUnknownReason gnet.DisconnectReason = errors.New("Unknown DisconnectReason") + + disconnectReasonCodes = map[gnet.DisconnectReason]uint16{ + ErrDisconnectUnknownReason: 0, + + ErrDisconnectVersionNotSupported: 1, + ErrDisconnectIntroductionTimeout: 2, + ErrDisconnectIsBlacklisted: 3, + ErrDisconnectSelf: 4, + ErrDisconnectConnectedTwice: 5, + ErrDisconnectIdle: 6, + ErrDisconnectNoIntroduction: 7, + ErrDisconnectIPLimitReached: 8, + ErrDisconnectUnexpectedError: 9, + ErrDisconnectMaxOutgoingConnectionsReached: 10, + ErrDisconnectBlockchainPubkeyNotMatched: 11, + ErrDisconnectInvalidExtraData: 12, + ErrDisconnectReceivedDisconnect: 13, + ErrDisconnectInvalidUserAgent: 14, + ErrDisconnectRequestedByOperator: 15, + ErrDisconnectPeerlistFull: 16, + ErrDisconnectInvalidBurnFactor: 17, + ErrDisconnectInvalidMaxTransactionSize: 18, + ErrDisconnectInvalidMaxDropletPrecision: 19, + + // gnet codes are registered here, but they are not sent in a DISC + // message by gnet. Only daemon sends a DISC packet. + // If gnet chooses to disconnect it will not send a DISC packet. + gnet.ErrDisconnectSetReadDeadlineFailed: 1001, + gnet.ErrDisconnectInvalidMessageLength: 1002, + gnet.ErrDisconnectMalformedMessage: 1003, + gnet.ErrDisconnectUnknownMessage: 1004, + gnet.ErrDisconnectShutdown: 1005, + gnet.ErrDisconnectMessageDecodeUnderflow: 1006, + gnet.ErrDisconnectTruncatedMessageID: 1007, + } + + disconnectCodeReasons map[uint16]gnet.DisconnectReason +) + +func init() { + disconnectCodeReasons = make(map[uint16]gnet.DisconnectReason, len(disconnectReasonCodes)) + + for r, c := range disconnectReasonCodes { + disconnectCodeReasons[c] = r + } +} + +// DisconnectReasonToCode maps a gnet.DisconnectReason to a 16-byte code +func DisconnectReasonToCode(r gnet.DisconnectReason) uint16 { + return disconnectReasonCodes[r] +} + +// DisconnectCodeToReason maps a disconnect code to a gnet.DisconnectReason +func DisconnectCodeToReason(c uint16) gnet.DisconnectReason { + r, ok := disconnectCodeReasons[c] + if !ok { + return ErrDisconnectUnknownReason + } + return r +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors_test.go new file mode 100644 index 00000000..a40f5af6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors_test.go @@ -0,0 +1,29 @@ +package daemon + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/daemon/gnet" +) + +func TestDisconnectReasonCode(t *testing.T) { + c := DisconnectReasonToCode(ErrDisconnectIdle) + require.NotEqual(t, uint16(0), c) + + r := DisconnectCodeToReason(c) + require.Equal(t, ErrDisconnectIdle, r) + + // unknown reason is fine + c = DisconnectReasonToCode(gnet.DisconnectReason(errors.New("foo"))) + require.Equal(t, uint16(0), c) + + r = DisconnectCodeToReason(c) + require.Equal(t, ErrDisconnectUnknownReason, r) + + // unknown code is fine + r = DisconnectCodeToReason(999) + require.Equal(t, ErrDisconnectUnknownReason, r) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder.go new file mode 100644 index 00000000..0ddfa8ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder.go @@ -0,0 +1,93 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeGetBlocksMessage computes the size of an encoded object of type GetBlocksMessage +func encodeSizeGetBlocksMessage(obj *GetBlocksMessage) uint64 { + i0 := uint64(0) + + // obj.LastBlock + i0 += 8 + + // obj.RequestedBlocks + i0 += 8 + + return i0 +} + +// encodeGetBlocksMessage encodes an object of type GetBlocksMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGetBlocksMessage(obj *GetBlocksMessage) ([]byte, error) { + n := encodeSizeGetBlocksMessage(obj) + buf := make([]byte, n) + + if err := encodeGetBlocksMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGetBlocksMessageToBuffer encodes an object of type GetBlocksMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGetBlocksMessageToBuffer(buf []byte, obj *GetBlocksMessage) error { + if uint64(len(buf)) < encodeSizeGetBlocksMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.LastBlock + e.Uint64(obj.LastBlock) + + // obj.RequestedBlocks + e.Uint64(obj.RequestedBlocks) + + return nil +} + +// decodeGetBlocksMessage decodes an object of type GetBlocksMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGetBlocksMessage(buf []byte, obj *GetBlocksMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.LastBlock + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.LastBlock = i + } + + { + // obj.RequestedBlocks + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.RequestedBlocks = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGetBlocksMessageExact decodes an object of type GetBlocksMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGetBlocksMessageExact(buf []byte, obj *GetBlocksMessage) error { + if n, err := decodeGetBlocksMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder_test.go new file mode 100644 index 00000000..2179f03d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGetBlocksMessageForEncodeTest() *GetBlocksMessage { + var obj GetBlocksMessage + return &obj +} + +func newRandomGetBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetBlocksMessage { + var obj GetBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGetBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetBlocksMessage { + var obj GetBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGetBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetBlocksMessage { + var obj GetBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGetBlocksMessage(t *testing.T, obj *GetBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGetBlocksMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGetBlocksMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGetBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeGetBlocksMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGetBlocksMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGetBlocksMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGetBlocksMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGetBlocksMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GetBlocksMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GetBlocksMessage + if n, err := decodeGetBlocksMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGetBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGetBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetBlocksMessage()") + } + + // Decode, excess buffer + var obj4 GetBlocksMessage + n, err := decodeGetBlocksMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGetBlocksMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGetBlocksMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGetBlocksMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetBlocksMessage()") + } + + // DecodeExact + var obj5 GetBlocksMessage + if err := decodeGetBlocksMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGetBlocksMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetBlocksMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGetBlocksMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGetBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGetBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGetBlocksMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GetBlocksMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGetBlocksMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGetBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGetBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGetBlocksMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGetBlocksMessage(t, tc.obj) + }) + } +} + +func decodeGetBlocksMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GetBlocksMessage + if _, err := decodeGetBlocksMessage(buf, &obj); err == nil { + t.Fatal("decodeGetBlocksMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGetBlocksMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGetBlocksMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GetBlocksMessage + if err := decodeGetBlocksMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGetBlocksMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGetBlocksMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGetBlocksMessageDecodeErrors(t *testing.T, k int, tag string, obj *GetBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGetBlocksMessage(obj) + buf, err := encodeGetBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeGetBlocksMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGetBlocksMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGetBlocksMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGetBlocksMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGetBlocksMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGetBlocksMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGetBlocksMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGetBlocksMessageForEncodeTest() + fullObj := newRandomGetBlocksMessageForEncodeTest(t, rand) + testSkyencoderGetBlocksMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGetBlocksMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder.go new file mode 100644 index 00000000..e6ae83cf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder.go @@ -0,0 +1,135 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeGetTxnsMessage computes the size of an encoded object of type GetTxnsMessage +func encodeSizeGetTxnsMessage(obj *GetTxnsMessage) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Transactions)) * i1 + } + + return i0 +} + +// encodeGetTxnsMessage encodes an object of type GetTxnsMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGetTxnsMessage(obj *GetTxnsMessage) ([]byte, error) { + n := encodeSizeGetTxnsMessage(obj) + buf := make([]byte, n) + + if err := encodeGetTxnsMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGetTxnsMessageToBuffer encodes an object of type GetTxnsMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGetTxnsMessageToBuffer(buf []byte, obj *GetTxnsMessage) error { + if uint64(len(buf)) < encodeSizeGetTxnsMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 256 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeGetTxnsMessage decodes an object of type GetTxnsMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGetTxnsMessage(buf []byte, obj *GetTxnsMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 256 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]cipher.SHA256, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1] + if len(d.Buffer) < len(obj.Transactions[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1][:], d.Buffer[:len(obj.Transactions[z1])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGetTxnsMessageExact decodes an object of type GetTxnsMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGetTxnsMessageExact(buf []byte, obj *GetTxnsMessage) error { + if n, err := decodeGetTxnsMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder_test.go new file mode 100644 index 00000000..79e9ed94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGetTxnsMessageForEncodeTest() *GetTxnsMessage { + var obj GetTxnsMessage + return &obj +} + +func newRandomGetTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetTxnsMessage { + var obj GetTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGetTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetTxnsMessage { + var obj GetTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGetTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetTxnsMessage { + var obj GetTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGetTxnsMessage(t *testing.T, obj *GetTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGetTxnsMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGetTxnsMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGetTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeGetTxnsMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGetTxnsMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGetTxnsMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGetTxnsMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGetTxnsMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GetTxnsMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GetTxnsMessage + if n, err := decodeGetTxnsMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGetTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGetTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetTxnsMessage()") + } + + // Decode, excess buffer + var obj4 GetTxnsMessage + n, err := decodeGetTxnsMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGetTxnsMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGetTxnsMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGetTxnsMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetTxnsMessage()") + } + + // DecodeExact + var obj5 GetTxnsMessage + if err := decodeGetTxnsMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGetTxnsMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetTxnsMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGetTxnsMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGetTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGetTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGetTxnsMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GetTxnsMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGetTxnsMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGetTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGetTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGetTxnsMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGetTxnsMessage(t, tc.obj) + }) + } +} + +func decodeGetTxnsMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GetTxnsMessage + if _, err := decodeGetTxnsMessage(buf, &obj); err == nil { + t.Fatal("decodeGetTxnsMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGetTxnsMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGetTxnsMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GetTxnsMessage + if err := decodeGetTxnsMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGetTxnsMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGetTxnsMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGetTxnsMessageDecodeErrors(t *testing.T, k int, tag string, obj *GetTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGetTxnsMessage(obj) + buf, err := encodeGetTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeGetTxnsMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGetTxnsMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGetTxnsMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGetTxnsMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGetTxnsMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGetTxnsMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGetTxnsMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGetTxnsMessageForEncodeTest() + fullObj := newRandomGetTxnsMessageForEncodeTest(t, rand) + testSkyencoderGetTxnsMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGetTxnsMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder.go new file mode 100644 index 00000000..eaa84a60 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder.go @@ -0,0 +1,579 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeGiveBlocksMessage computes the size of an encoded object of type GiveBlocksMessage +func encodeSizeGiveBlocksMessage(obj *GiveBlocksMessage) uint64 { + i0 := uint64(0) + + // obj.Blocks + i0 += 4 + for _, x1 := range obj.Blocks { + i1 := uint64(0) + + // x1.Block.Head.Version + i1 += 4 + + // x1.Block.Head.Time + i1 += 8 + + // x1.Block.Head.BkSeq + i1 += 8 + + // x1.Block.Head.Fee + i1 += 8 + + // x1.Block.Head.PrevHash + i1 += 32 + + // x1.Block.Head.BodyHash + i1 += 32 + + // x1.Block.Head.UxHash + i1 += 32 + + // x1.Block.Body.Transactions + i1 += 4 + for _, x2 := range x1.Block.Body.Transactions { + i2 := uint64(0) + + // x2.Length + i2 += 4 + + // x2.Type + i2++ + + // x2.InnerHash + i2 += 32 + + // x2.Sigs + i2 += 4 + { + i3 := uint64(0) + + // x3 + i3 += 65 + + i2 += uint64(len(x2.Sigs)) * i3 + } + + // x2.In + i2 += 4 + { + i3 := uint64(0) + + // x3 + i3 += 32 + + i2 += uint64(len(x2.In)) * i3 + } + + // x2.Out + i2 += 4 + { + i3 := uint64(0) + + // x3.Address.Version + i3++ + + // x3.Address.Key + i3 += 20 + + // x3.Coins + i3 += 8 + + // x3.Hours + i3 += 8 + + i2 += uint64(len(x2.Out)) * i3 + } + + i1 += i2 + } + + // x1.Sig + i1 += 65 + + i0 += i1 + } + + return i0 +} + +// encodeGiveBlocksMessage encodes an object of type GiveBlocksMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGiveBlocksMessage(obj *GiveBlocksMessage) ([]byte, error) { + n := encodeSizeGiveBlocksMessage(obj) + buf := make([]byte, n) + + if err := encodeGiveBlocksMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGiveBlocksMessageToBuffer encodes an object of type GiveBlocksMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGiveBlocksMessageToBuffer(buf []byte, obj *GiveBlocksMessage) error { + if uint64(len(buf)) < encodeSizeGiveBlocksMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Blocks maxlen check + if len(obj.Blocks) > 128 { + return encoder.ErrMaxLenExceeded + } + + // obj.Blocks length check + if uint64(len(obj.Blocks)) > math.MaxUint32 { + return errors.New("obj.Blocks length exceeds math.MaxUint32") + } + + // obj.Blocks length + e.Uint32(uint32(len(obj.Blocks))) + + // obj.Blocks + for _, x := range obj.Blocks { + + // x.Block.Head.Version + e.Uint32(x.Block.Head.Version) + + // x.Block.Head.Time + e.Uint64(x.Block.Head.Time) + + // x.Block.Head.BkSeq + e.Uint64(x.Block.Head.BkSeq) + + // x.Block.Head.Fee + e.Uint64(x.Block.Head.Fee) + + // x.Block.Head.PrevHash + e.CopyBytes(x.Block.Head.PrevHash[:]) + + // x.Block.Head.BodyHash + e.CopyBytes(x.Block.Head.BodyHash[:]) + + // x.Block.Head.UxHash + e.CopyBytes(x.Block.Head.UxHash[:]) + + // x.Block.Body.Transactions maxlen check + if len(x.Block.Body.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Block.Body.Transactions length check + if uint64(len(x.Block.Body.Transactions)) > math.MaxUint32 { + return errors.New("x.Block.Body.Transactions length exceeds math.MaxUint32") + } + + // x.Block.Body.Transactions length + e.Uint32(uint32(len(x.Block.Body.Transactions))) + + // x.Block.Body.Transactions + for _, x := range x.Block.Body.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + // x.Sig + e.CopyBytes(x.Sig[:]) + + } + + return nil +} + +// decodeGiveBlocksMessage decodes an object of type GiveBlocksMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGiveBlocksMessage(buf []byte, obj *GiveBlocksMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Blocks + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 128 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks = make([]coin.SignedBlock, length) + + for z1 := range obj.Blocks { + { + // obj.Blocks[z1].Block.Head.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.Version = i + } + + { + // obj.Blocks[z1].Block.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.Time = i + } + + { + // obj.Blocks[z1].Block.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.BkSeq = i + } + + { + // obj.Blocks[z1].Block.Head.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.Fee = i + } + + { + // obj.Blocks[z1].Block.Head.PrevHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Head.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Head.PrevHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Head.PrevHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Head.PrevHash):] + } + + { + // obj.Blocks[z1].Block.Head.BodyHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Head.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Head.BodyHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Head.BodyHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Head.BodyHash):] + } + + { + // obj.Blocks[z1].Block.Head.UxHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Head.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Head.UxHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Head.UxHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Head.UxHash):] + } + + { + // obj.Blocks[z1].Block.Body.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions = make([]coin.Transaction, length) + + for z5 := range obj.Blocks[z1].Block.Body.Transactions { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Length = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Type = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash):] + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions[z5].Sigs = make([]cipher.Sig, length) + + for z7 := range obj.Blocks[z1].Block.Body.Transactions[z5].Sigs { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7] + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7][:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7])]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7]):] + } + + } + } + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions[z5].In = make([]cipher.SHA256, length) + + for z7 := range obj.Blocks[z1].Block.Body.Transactions[z5].In { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].In[z7] + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7][:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7])]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7]):] + } + + } + } + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions[z5].Out = make([]coin.TransactionOutput, length) + + for z7 := range obj.Blocks[z1].Block.Body.Transactions[z5].Out { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Version = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key[:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key):] + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Coins = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Hours = i + } + + } + } + } + } + } + } + + { + // obj.Blocks[z1].Sig + if len(d.Buffer) < len(obj.Blocks[z1].Sig) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Sig[:], d.Buffer[:len(obj.Blocks[z1].Sig)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Sig):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGiveBlocksMessageExact decodes an object of type GiveBlocksMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGiveBlocksMessageExact(buf []byte, obj *GiveBlocksMessage) error { + if n, err := decodeGiveBlocksMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder_test.go new file mode 100644 index 00000000..0190251c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGiveBlocksMessageForEncodeTest() *GiveBlocksMessage { + var obj GiveBlocksMessage + return &obj +} + +func newRandomGiveBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveBlocksMessage { + var obj GiveBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGiveBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveBlocksMessage { + var obj GiveBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGiveBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveBlocksMessage { + var obj GiveBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGiveBlocksMessage(t *testing.T, obj *GiveBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGiveBlocksMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGiveBlocksMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGiveBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeGiveBlocksMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGiveBlocksMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGiveBlocksMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGiveBlocksMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGiveBlocksMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GiveBlocksMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GiveBlocksMessage + if n, err := decodeGiveBlocksMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGiveBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGiveBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveBlocksMessage()") + } + + // Decode, excess buffer + var obj4 GiveBlocksMessage + n, err := decodeGiveBlocksMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGiveBlocksMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGiveBlocksMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGiveBlocksMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveBlocksMessage()") + } + + // DecodeExact + var obj5 GiveBlocksMessage + if err := decodeGiveBlocksMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGiveBlocksMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveBlocksMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGiveBlocksMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGiveBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGiveBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGiveBlocksMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GiveBlocksMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGiveBlocksMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGiveBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGiveBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGiveBlocksMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGiveBlocksMessage(t, tc.obj) + }) + } +} + +func decodeGiveBlocksMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GiveBlocksMessage + if _, err := decodeGiveBlocksMessage(buf, &obj); err == nil { + t.Fatal("decodeGiveBlocksMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGiveBlocksMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGiveBlocksMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GiveBlocksMessage + if err := decodeGiveBlocksMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGiveBlocksMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGiveBlocksMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGiveBlocksMessageDecodeErrors(t *testing.T, k int, tag string, obj *GiveBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGiveBlocksMessage(obj) + buf, err := encodeGiveBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeGiveBlocksMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGiveBlocksMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGiveBlocksMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGiveBlocksMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGiveBlocksMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGiveBlocksMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGiveBlocksMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGiveBlocksMessageForEncodeTest() + fullObj := newRandomGiveBlocksMessageForEncodeTest(t, rand) + testSkyencoderGiveBlocksMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGiveBlocksMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder.go new file mode 100644 index 00000000..af71acb6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder.go @@ -0,0 +1,149 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeGivePeersMessage computes the size of an encoded object of type GivePeersMessage +func encodeSizeGivePeersMessage(obj *GivePeersMessage) uint64 { + i0 := uint64(0) + + // obj.Peers + i0 += 4 + { + i1 := uint64(0) + + // x1.IP + i1 += 4 + + // x1.Port + i1 += 2 + + i0 += uint64(len(obj.Peers)) * i1 + } + + return i0 +} + +// encodeGivePeersMessage encodes an object of type GivePeersMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGivePeersMessage(obj *GivePeersMessage) ([]byte, error) { + n := encodeSizeGivePeersMessage(obj) + buf := make([]byte, n) + + if err := encodeGivePeersMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGivePeersMessageToBuffer encodes an object of type GivePeersMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGivePeersMessageToBuffer(buf []byte, obj *GivePeersMessage) error { + if uint64(len(buf)) < encodeSizeGivePeersMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Peers maxlen check + if len(obj.Peers) > 512 { + return encoder.ErrMaxLenExceeded + } + + // obj.Peers length check + if uint64(len(obj.Peers)) > math.MaxUint32 { + return errors.New("obj.Peers length exceeds math.MaxUint32") + } + + // obj.Peers length + e.Uint32(uint32(len(obj.Peers))) + + // obj.Peers + for _, x := range obj.Peers { + + // x.IP + e.Uint32(x.IP) + + // x.Port + e.Uint16(x.Port) + + } + + return nil +} + +// decodeGivePeersMessage decodes an object of type GivePeersMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGivePeersMessage(buf []byte, obj *GivePeersMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Peers + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 512 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Peers = make([]IPAddr, length) + + for z1 := range obj.Peers { + { + // obj.Peers[z1].IP + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Peers[z1].IP = i + } + + { + // obj.Peers[z1].Port + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.Peers[z1].Port = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGivePeersMessageExact decodes an object of type GivePeersMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGivePeersMessageExact(buf []byte, obj *GivePeersMessage) error { + if n, err := decodeGivePeersMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder_test.go new file mode 100644 index 00000000..b67e6e64 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGivePeersMessageForEncodeTest() *GivePeersMessage { + var obj GivePeersMessage + return &obj +} + +func newRandomGivePeersMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GivePeersMessage { + var obj GivePeersMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGivePeersMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GivePeersMessage { + var obj GivePeersMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGivePeersMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GivePeersMessage { + var obj GivePeersMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGivePeersMessage(t *testing.T, obj *GivePeersMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGivePeersMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGivePeersMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGivePeersMessage(obj) + if err != nil { + t.Fatalf("encodeGivePeersMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGivePeersMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGivePeersMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGivePeersMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGivePeersMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GivePeersMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GivePeersMessage + if n, err := decodeGivePeersMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGivePeersMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGivePeersMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGivePeersMessage()") + } + + // Decode, excess buffer + var obj4 GivePeersMessage + n, err := decodeGivePeersMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGivePeersMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGivePeersMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGivePeersMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGivePeersMessage()") + } + + // DecodeExact + var obj5 GivePeersMessage + if err := decodeGivePeersMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGivePeersMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGivePeersMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGivePeersMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGivePeersMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGivePeersMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGivePeersMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GivePeersMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGivePeersMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGivePeersMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGivePeersMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGivePeersMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGivePeersMessage(t, tc.obj) + }) + } +} + +func decodeGivePeersMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GivePeersMessage + if _, err := decodeGivePeersMessage(buf, &obj); err == nil { + t.Fatal("decodeGivePeersMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGivePeersMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGivePeersMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GivePeersMessage + if err := decodeGivePeersMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGivePeersMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGivePeersMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGivePeersMessageDecodeErrors(t *testing.T, k int, tag string, obj *GivePeersMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGivePeersMessage(obj) + buf, err := encodeGivePeersMessage(obj) + if err != nil { + t.Fatalf("encodeGivePeersMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGivePeersMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGivePeersMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGivePeersMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGivePeersMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGivePeersMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGivePeersMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGivePeersMessageForEncodeTest() + fullObj := newRandomGivePeersMessageForEncodeTest(t, rand) + testSkyencoderGivePeersMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGivePeersMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder.go new file mode 100644 index 00000000..3524fc12 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder.go @@ -0,0 +1,408 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeGiveTxnsMessage computes the size of an encoded object of type GiveTxnsMessage +func encodeSizeGiveTxnsMessage(obj *GiveTxnsMessage) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + for _, x1 := range obj.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + return i0 +} + +// encodeGiveTxnsMessage encodes an object of type GiveTxnsMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGiveTxnsMessage(obj *GiveTxnsMessage) ([]byte, error) { + n := encodeSizeGiveTxnsMessage(obj) + buf := make([]byte, n) + + if err := encodeGiveTxnsMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGiveTxnsMessageToBuffer encodes an object of type GiveTxnsMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGiveTxnsMessageToBuffer(buf []byte, obj *GiveTxnsMessage) error { + if uint64(len(buf)) < encodeSizeGiveTxnsMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 256 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + return nil +} + +// decodeGiveTxnsMessage decodes an object of type GiveTxnsMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGiveTxnsMessage(buf []byte, obj *GiveTxnsMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 256 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]coin.Transaction, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Transactions[z1].Length = i + } + + { + // obj.Transactions[z1].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Type = i + } + + { + // obj.Transactions[z1].InnerHash + if len(d.Buffer) < len(obj.Transactions[z1].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].InnerHash[:], d.Buffer[:len(obj.Transactions[z1].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].InnerHash):] + } + + { + // obj.Transactions[z1].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Sigs = make([]cipher.Sig, length) + + for z3 := range obj.Transactions[z1].Sigs { + { + // obj.Transactions[z1].Sigs[z3] + if len(d.Buffer) < len(obj.Transactions[z1].Sigs[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Sigs[z3][:], d.Buffer[:len(obj.Transactions[z1].Sigs[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Sigs[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].In = make([]cipher.SHA256, length) + + for z3 := range obj.Transactions[z1].In { + { + // obj.Transactions[z1].In[z3] + if len(d.Buffer) < len(obj.Transactions[z1].In[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].In[z3][:], d.Buffer[:len(obj.Transactions[z1].In[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].In[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Out = make([]coin.TransactionOutput, length) + + for z3 := range obj.Transactions[z1].Out { + { + // obj.Transactions[z1].Out[z3].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Address.Version = i + } + + { + // obj.Transactions[z1].Out[z3].Address.Key + if len(d.Buffer) < len(obj.Transactions[z1].Out[z3].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Out[z3].Address.Key[:], d.Buffer[:len(obj.Transactions[z1].Out[z3].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Out[z3].Address.Key):] + } + + { + // obj.Transactions[z1].Out[z3].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Coins = i + } + + { + // obj.Transactions[z1].Out[z3].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Hours = i + } + + } + } + } + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGiveTxnsMessageExact decodes an object of type GiveTxnsMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGiveTxnsMessageExact(buf []byte, obj *GiveTxnsMessage) error { + if n, err := decodeGiveTxnsMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder_test.go new file mode 100644 index 00000000..42de5b15 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGiveTxnsMessageForEncodeTest() *GiveTxnsMessage { + var obj GiveTxnsMessage + return &obj +} + +func newRandomGiveTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveTxnsMessage { + var obj GiveTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGiveTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveTxnsMessage { + var obj GiveTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGiveTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveTxnsMessage { + var obj GiveTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGiveTxnsMessage(t *testing.T, obj *GiveTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGiveTxnsMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGiveTxnsMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGiveTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeGiveTxnsMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGiveTxnsMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGiveTxnsMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGiveTxnsMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGiveTxnsMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GiveTxnsMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GiveTxnsMessage + if n, err := decodeGiveTxnsMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGiveTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGiveTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveTxnsMessage()") + } + + // Decode, excess buffer + var obj4 GiveTxnsMessage + n, err := decodeGiveTxnsMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGiveTxnsMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGiveTxnsMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGiveTxnsMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveTxnsMessage()") + } + + // DecodeExact + var obj5 GiveTxnsMessage + if err := decodeGiveTxnsMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGiveTxnsMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveTxnsMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGiveTxnsMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGiveTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGiveTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGiveTxnsMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GiveTxnsMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGiveTxnsMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGiveTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGiveTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGiveTxnsMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGiveTxnsMessage(t, tc.obj) + }) + } +} + +func decodeGiveTxnsMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GiveTxnsMessage + if _, err := decodeGiveTxnsMessage(buf, &obj); err == nil { + t.Fatal("decodeGiveTxnsMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGiveTxnsMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGiveTxnsMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GiveTxnsMessage + if err := decodeGiveTxnsMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGiveTxnsMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGiveTxnsMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGiveTxnsMessageDecodeErrors(t *testing.T, k int, tag string, obj *GiveTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGiveTxnsMessage(obj) + buf, err := encodeGiveTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeGiveTxnsMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGiveTxnsMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGiveTxnsMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGiveTxnsMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGiveTxnsMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGiveTxnsMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGiveTxnsMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGiveTxnsMessageForEncodeTest() + fullObj := newRandomGiveTxnsMessageForEncodeTest(t, rand) + testSkyencoderGiveTxnsMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGiveTxnsMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/README.md b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/README.md new file mode 100644 index 00000000..df437742 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/README.md @@ -0,0 +1,7 @@ +gnet +==== + +[![GoDoc](http://godoc.org/github.com//skycoin/gnet?status.png)](http://godoc.org/github.com/skycoin/gnet) + +[Godoc generated documentation](https://godoc.org/github.com/skycoin/gnet) + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher.go new file mode 100644 index 00000000..f8787026 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher.go @@ -0,0 +1,209 @@ +package gnet + +import ( + "errors" + "fmt" + "math" + "net" + "reflect" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +var ( + // ErrMsgExceedsMaxLen is returned if trying to send a message that exceeds the configured max length + ErrMsgExceedsMaxLen = errors.New("Message exceeds max message length") +) + +// SendResult result of a single message send +type SendResult struct { + Addr string + Message Message + Error error +} + +func newSendResult(addr string, m Message, err error) SendResult { + return SendResult{ + Addr: addr, + Message: m, + Error: err, + } +} + +// Serializes a Message over a net.Conn +func sendMessage(conn net.Conn, msg Message, timeout time.Duration, maxMsgLength int) error { + m, err := EncodeMessage(msg) + if err != nil { + return err + } + if len(m) > maxMsgLength { + return ErrMsgExceedsMaxLen + } + return sendByteMessage(conn, m, timeout) +} + +// msgIDStringSafe formats msgID bytes to a string that is safe for logging (e.g. not impacted by ascii control chars) +func msgIDStringSafe(msgID [4]byte) string { + x := fmt.Sprintf("%q", msgID) + return x[1 : len(x)-1] // trim quotes that are added by %q formatting +} + +// Event handler that is called after a Connection sends a complete message +func convertToMessage(id uint64, msg []byte, debugPrint bool) (Message, error) { + msgID := [4]byte{} + if len(msg) < len(msgID) { + logger.WithError(ErrDisconnectTruncatedMessageID).WithField("connID", id).Warning() + return nil, ErrDisconnectTruncatedMessageID + } + + copy(msgID[:], msg[:len(msgID)]) + + if debugPrint { + logger.WithField("msgID", msgIDStringSafe(msgID)).Debug("Received message") + } + + msg = msg[len(msgID):] + t, ok := MessageIDReverseMap[msgID] + if !ok { + logger.WithError(ErrDisconnectUnknownMessage).WithFields(logrus.Fields{ + "msgID": msgIDStringSafe(msgID), + "connID": id, + }).Warning() + return nil, ErrDisconnectUnknownMessage + } + + if debugPrint { + logger.WithFields(logrus.Fields{ + "connID": id, + "messageType": fmt.Sprintf("%v", t), + }).Debugf("convertToMessage") + } + + v := reflect.New(t) + m, ok := (v.Interface()).(Message) + if !ok { + // This occurs only when the user registers an interface that does not + // match the Message interface. They should have known about this + // earlier via a call to VerifyMessages + logger.Panic("Message obtained from map does not match Message interface") + return nil, errors.New("MessageIdMaps contain non-Message") + } + + used, err := deserializeMessage(msg, v) + if err != nil { + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "connID": id, + "messageType": fmt.Sprintf("%v", t), + }).Warning("deserializeMessage failed") + return nil, ErrDisconnectMalformedMessage + } + + if used != uint64(len(msg)) { + logger.WithError(ErrDisconnectMessageDecodeUnderflow).WithFields(logrus.Fields{ + "connID": id, + "messageType": fmt.Sprintf("%v", t), + }).Warning() + return nil, ErrDisconnectMessageDecodeUnderflow + } + + return m, nil +} + +// Wraps Serializer.Decode and traps panics as an error +func deserializeMessage(msg []byte, v reflect.Value) (n uint64, err error) { + defer func() { + if r := recover(); r != nil { + logger.Critical().Warningf("Recovering from deserializer panic: %v", r) + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("Message deserialization failed") + } + } + }() + + iface := v.Interface() + x, ok := iface.(Serializer) + if !ok { + return 0, errors.New("deserializeMessage object does not have Serializer interface") + } + + return x.Decode(msg) +} + +// EncodeMessage packs a Message into []byte containing length, id and data +func EncodeMessage(msg Serializer) ([]byte, error) { + t := reflect.ValueOf(msg).Elem().Type() + + // Lookup message ID + msgID, succ := MessageIDMap[t] + if !succ { + logger.Panicf("Attempted to serialize message struct not in MessageIDMap: %v", msg) + } + if uint64(len(msgID)) > math.MaxUint32 { + return nil, errors.New("Message ID length exceeds math.MaxUint32") + } + + // Compute size of encoded Message object + bMsgLen := msg.EncodeSize() + if bMsgLen > math.MaxUint32 { + return nil, errors.New("Message length exceeds math.MaxUint32") + } + + // Compute message + message ID length + bLen, err := mathutil.AddUint32(uint32(bMsgLen), uint32(len(msgID))) + if err != nil { + return nil, err + } + + // Serialize total message length + bLenPrefix := encoder.SerializeUint32(bLen) + if uint64(len(bLenPrefix)) > math.MaxUint32 { + return nil, errors.New("Message length prefix length exceeds math.MaxUint32") + } + + mLen, err := mathutil.AddUint32(bLen, uint32(len(bLenPrefix))) + if err != nil { + return nil, err + } + + // Allocate message bytes + m := make([]byte, mLen) + + // Write the total message length to the buffer + copy(m[:], bLenPrefix[:]) + + // Write the message ID to the buffer + copy(m[len(bLenPrefix):], msgID[:]) + + // Encode the message into the message buffer + if err := msg.Encode(m[len(bLenPrefix)+len(msgID):]); err != nil { + return nil, err + } + + return m, nil +} + +// Sends []byte over a net.Conn +var sendByteMessage = func(conn net.Conn, msg []byte, timeout time.Duration) error { + deadline := time.Time{} + if timeout != 0 { + deadline = time.Now().Add(timeout) + } + if err := conn.SetWriteDeadline(deadline); err != nil { + return err + } + if _, err := conn.Write(msg); err != nil { + return &WriteError{ + Err: err, + } + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher_test.go new file mode 100644 index 00000000..4b56e938 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher_test.go @@ -0,0 +1,246 @@ +package gnet + +import ( + "bytes" + "errors" + "net" + "reflect" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/testutil" +) + +var ( + _sendByteMessage = sendByteMessage +) + +func resetHandler() { + sendByteMessage = _sendByteMessage +} + +func TestMsgIDStringSafe(t *testing.T) { + var id [4]byte + require.Equal(t, "\\x00\\x00\\x00\\x00", msgIDStringSafe(id)) + + id = [4]byte{'F', 'O', 'O', 'B'} + + require.Equal(t, "FOOB", msgIDStringSafe(id)) + + id = [4]byte{200, 2, '\n', '\t'} + + require.Equal(t, "\\xc8\\x02\\n\\t", msgIDStringSafe(id)) + + id = [4]byte{'\'', '\\', ' ', '"'} + + require.Equal(t, "'\\\\ \\\"", msgIDStringSafe(id)) +} + +func assertIsMessage(t *testing.T, x interface{}) { + _, ok := x.(Message) + require.True(t, ok) +} + +func TestConvertToMessage(t *testing.T) { + assertIsMessage(t, &ByteMessage{}) + EraseMessages() + resetHandler() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + c := &Connection{} + b := make([]byte, 0) + b = append(b, BytePrefix[:]...) + b = append(b, byte(7)) + m, err := convertToMessage(c.ID, b, testing.Verbose()) + require.NoError(t, err) + require.NotNil(t, m) + if m == nil { + t.Fatalf("ConvertToMessage failed") + } + bm := m.(*ByteMessage) + require.Equal(t, bm.X, byte(7)) +} + +func TestConvertToMessageNoMessageID(t *testing.T) { + EraseMessages() + resetHandler() + c := &Connection{} + b := []byte{} + m, err := convertToMessage(c.ID, b, testing.Verbose()) + require.Nil(t, m) + require.Error(t, err) + require.Equal(t, ErrDisconnectTruncatedMessageID, err) +} + +func TestConvertToMessageUnknownMessage(t *testing.T) { + EraseMessages() + resetHandler() + c := &Connection{} + b := MessagePrefix{'C', 'C', 'C', 'C'} + m, err := convertToMessage(c.ID, b[:], testing.Verbose()) + require.Error(t, err) + require.Equal(t, ErrDisconnectUnknownMessage, err) + require.Nil(t, m) +} + +func TestConvertToMessageBadDeserialize(t *testing.T) { + EraseMessages() + resetHandler() + RegisterMessage(DummyPrefix, DummyMessage{}) + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + c := &Connection{} + // Test with too many bytes + b := append(DummyPrefix[:], []byte{0, 1, 1, 1}...) + m, err := convertToMessage(c.ID, b, testing.Verbose()) + require.Error(t, err) + require.Nil(t, m) + + // Test with not enough bytes + b = append([]byte{}, BytePrefix[:]...) + m, err = convertToMessage(c.ID, b, testing.Verbose()) + require.Error(t, err) + require.Equal(t, ErrDisconnectMalformedMessage, err) + require.Nil(t, m) +} + +func TestConvertToMessageNotMessage(t *testing.T) { + EraseMessages() + resetHandler() + RegisterMessage(NothingPrefix, Nothing{}) + // don't verify messages + c := &Connection{} + require.Panics(t, func() { + _, _ = convertToMessage(c.ID, NothingPrefix[:], testing.Verbose()) //nolint:errcheck + }) +} + +func TestDeserializeMessageTrapsPanic(t *testing.T) { + resetHandler() + EraseMessages() + p := 7 + m := &PointerMessage{Ptr: &p} + b := []byte{4, 4, 4, 4, 4, 4, 4, 4} + _, err := deserializeMessage(b, reflect.ValueOf(m)) + require.Error(t, err) + require.Equal(t, "Decode error: kind ptr not handled", err.Error()) +} + +func TestEncodeMessage(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + m := NewByteMessage(7) + b, err := EncodeMessage(m) + require.NoError(t, err) + require.True(t, bytes.Equal(b, []byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E', 7})) +} + +func TestEncodeMessageUnknownMessage(t *testing.T) { + resetHandler() + EraseMessages() + require.Panics(t, func() { + _, _ = EncodeMessage(&DummyMessage{}) //nolint:errcheck + }) +} + +func TestSendByteMessage(t *testing.T) { + resetHandler() + b := []byte{1} + c := NewCaptureConn() + err := sendByteMessage(c, b, 0) + require.NoError(t, err) + require.True(t, bytes.Equal(c.(*CaptureConn).Wrote, b)) + require.True(t, c.(*CaptureConn).WriteDeadlineSet) +} + +func TestSendByteMessageWithTimeout(t *testing.T) { + resetHandler() + b := []byte{1} + c := NewCaptureConn() + err := sendByteMessage(c, b, time.Minute) + require.NoError(t, err) + require.True(t, bytes.Equal(c.(*CaptureConn).Wrote, b)) + require.True(t, c.(*CaptureConn).WriteDeadlineSet) +} + +func TestSendByteMessageWriteFailed(t *testing.T) { + resetHandler() + c := &FailingWriteConn{} + err := sendByteMessage(c, nil, 0) + require.Error(t, err) +} + +func TestSendByteMessageWriteDeadlineFailed(t *testing.T) { + resetHandler() + c := &FailingWriteDeadlineConn{} + err := sendByteMessage(c, nil, 0) + require.Error(t, err) +} + +func TestSendMessage(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + m := NewByteMessage(7) + sendByteMessage = func(conn net.Conn, msg []byte, tm time.Duration) error { + expect := []byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E', 7} + require.True(t, bytes.Equal(msg, expect)) + return nil + } + err := sendMessage(nil, m, 0, 1024) + require.NoError(t, err) + + err = sendMessage(nil, m, 0, 1) + testutil.RequireError(t, err, "Message exceeds max message length") +} + +/* Helpers */ + +func failingSendByteMessage(conn net.Conn, m []byte, tm time.Duration) error { + return errors.New("send byte message failed") +} + +type CaptureConn struct { + Wrote []byte + WriteDeadlineSet bool + net.Conn +} + +func NewCaptureConn() net.Conn { + return &CaptureConn{Wrote: nil, WriteDeadlineSet: false} +} + +func (cc *CaptureConn) Write(b []byte) (int, error) { + cc.Wrote = b + return len(b), nil +} + +func (cc *CaptureConn) SetWriteDeadline(t time.Time) error { + cc.WriteDeadlineSet = true + return nil +} + +type FailingWriteDeadlineConn struct { + net.Conn +} + +func (c *FailingWriteDeadlineConn) SetWriteDeadline(t time.Time) error { + return errors.New("failed") +} + +type FailingWriteConn struct { + net.Conn +} + +func (c *FailingWriteConn) Write(b []byte) (int, error) { + return 0, errors.New("failed") +} + +func (c *FailingWriteConn) SetWriteDeadline(t time.Time) error { + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message.go new file mode 100644 index 00000000..a67aa39d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message.go @@ -0,0 +1,140 @@ +package gnet + +import ( + "reflect" +) + +const messagePrefixLength = 4 + +// MessagePrefix message prefix identifies a message +type MessagePrefix [messagePrefixLength]byte + +// MessagePrefixFromString creates MessagePrefix from string +func MessagePrefixFromString(prefix string) MessagePrefix { + if len(prefix) == 0 || len(prefix) > 4 { + logger.Panicf("Invalid prefix %s", prefix) + } + p := MessagePrefix{} + for i, c := range prefix { + p[i] = byte(c) + } + for i := len(prefix); i < 4; i++ { + p[i] = 0x00 + } + return p +} + +// Serializer serialization interface +type Serializer interface { + EncodeSize() uint64 + Encode([]byte) error + Decode([]byte) (uint64, error) +} + +// Handler message handler interface +type Handler interface { + // State is user-defined application state that is attached to the Dispatcher. + // If a non-nil error is returned, the connection will be disconnected. + Handle(context *MessageContext, state interface{}) error +} + +// Message message interface +type Message interface { + Handler + Serializer +} + +// MessageContext message context +type MessageContext struct { + ConnID uint64 // connection message was received from + Addr string +} + +// NewMessageContext creates MessageContext +func NewMessageContext(conn *Connection) *MessageContext { + if conn.Conn != nil { + return &MessageContext{ConnID: conn.ID, Addr: conn.Addr()} + } + return &MessageContext{ConnID: conn.ID} +} + +// MessageIDMap maps message types to their ids +var MessageIDMap = make(map[reflect.Type]MessagePrefix) + +// MessageIDReverseMap maps message ids to their types +var MessageIDReverseMap = make(map[MessagePrefix]reflect.Type) + +var registeredMsgsCount = 0 + +// RegisterMessage registers a message struct for recognition by the message handlers. +func RegisterMessage(prefix MessagePrefix, msg interface{}) { + t := reflect.TypeOf(msg) + id := MessagePrefix{} + copy(id[:], prefix[:]) + _, exists := MessageIDReverseMap[id] + if exists { + logger.Panicf("Attempted to register message prefix %s twice", string(id[:])) + } + _, exists = MessageIDMap[t] + if exists { + logger.Panicf("Attempts to register message type %v twice", t) + } + MessageIDMap[t] = id + MessageIDReverseMap[id] = t + + registeredMsgsCount++ +} + +// VerifyMessages calls logger.Panic if message registration violates sanity checks +func VerifyMessages() { + if registeredMsgsCount != len(MessageIDMap) { + logger.Panic("MessageIDMap was altered without using RegisterMessage") + } + if registeredMsgsCount != len(MessageIDReverseMap) { + logger.Panic("MessageIDReverseMap was altered without using RegisterMessage") + } + + for t, k := range MessageIDMap { + // No empty prefixes allowed + if k[0] == 0x00 { + logger.Panic("No empty message prefixes allowed") + } + // No non-null bytes allowed after a nul byte + hasEmpty := false + for _, b := range k { + if b == 0x00 { + hasEmpty = true + } else if hasEmpty { + logger.Panic("No non-null bytes allowed after a nul byte") + } + } + // All characters must be non-whitespace printable ascii chars/digits + // No punctation + for _, b := range k { + if !((b >= '0' && b <= '9') || (b >= 'A' && b <= 'Z') || + (b >= 'a' && b <= 'z') || b == 0x00) { + logger.Panicf("Invalid prefix byte %v", b) + } + } + + // Confirm that all registered messages support the Message interface + // This should only be untrue if the user modified the message map + // directly + mptr := reflect.PtrTo(t) + if !mptr.Implements(reflect.TypeOf((*Message)(nil)).Elem()) { + logger.Panicf("Invalid message at ID %s: Message must implement the gnet.Message interface", string(k[:])) + } + } + if len(MessageIDMap) != len(MessageIDReverseMap) { + logger.Panic("MessageIdMap mismatch") + } + // No empty prefixes + // All prefixes must be 0 padded +} + +// EraseMessages wipes all recorded message types +func EraseMessages() { + MessageIDMap = make(map[reflect.Type]MessagePrefix) + MessageIDReverseMap = make(map[MessagePrefix]reflect.Type) + registeredMsgsCount = 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message_test.go new file mode 100644 index 00000000..19b78d92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message_test.go @@ -0,0 +1,253 @@ +package gnet + +import ( + "errors" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func TestNewMessageContext(t *testing.T) { + c := &Connection{} + mc := NewMessageContext(c) + require.Equal(t, mc.ConnID, c.ID) +} + +func TestRegisterMessage(t *testing.T) { + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + require.Equal(t, len(MessageIDMap), 1) + require.Equal(t, len(MessageIDReverseMap), 1) + require.NotNil(t, MessageIDReverseMap[DummyPrefix]) + + RegisterMessage(ErrorPrefix, ErrorMessage{}) + require.Equal(t, len(MessageIDMap), 2) + require.Equal(t, len(MessageIDReverseMap), 2) + require.NotNil(t, MessageIDReverseMap[ErrorPrefix]) +} + +func TestEraseMessages(t *testing.T) { + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + require.Equal(t, len(MessageIDMap), 1) + require.Equal(t, len(MessageIDReverseMap), 1) + EraseMessages() + require.Equal(t, len(MessageIDMap), 0) + require.Equal(t, len(MessageIDReverseMap), 0) +} + +func TestVerifyMessages(t *testing.T) { + // VerifyMessages either no-ops or panics. Make sure it doesnt panic + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + RegisterMessage(ErrorPrefix, ErrorMessage{}) + require.NotPanics(t, VerifyMessages) +} + +func TestVerifyMessagesDuplicateRegistered(t *testing.T) { + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + require.Panics(t, func() { RegisterMessage(DummyPrefix, DummyMessage{}) }) + require.Panics(t, func() { RegisterMessage(BytePrefix, DummyMessage{}) }) +} + +func TestVerifyMessagesNotAMessage(t *testing.T) { + EraseMessages() + RegisterMessage(NothingPrefix, Nothing{}) + require.Panics(t, VerifyMessages) +} + +func TestVerifyMessagesBadPrefix(t *testing.T) { + EraseMessages() + // Can't be all null + RegisterMessage(MessagePrefix{0x00, 0x00, 0x00, 0x00}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + // Can't start with nul + RegisterMessage(MessagePrefix{0x00, 'A', 'A', 'A'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + // Can't have non nul after nul + RegisterMessage(MessagePrefix{'A', 0x00, 'A', 'A'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + // Can't have invalid ascii bytes + RegisterMessage(MessagePrefix{'A', 'A', 'A', '\n'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '@'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', ' '}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '{'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '`'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '['}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '/'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', ':'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + // Some valid messages + RegisterMessage(MessagePrefix{'1', '9', 'A', 'z'}, DummyMessage{}) + require.NotPanics(t, VerifyMessages) + EraseMessages() +} + +func TestVerifyMessagesCorruptMap(t *testing.T) { + // MessageIdMap circumvented + EraseMessages() + mtype := reflect.TypeOf(DummyMessage{}) + MessageIDMap[mtype] = DummyPrefix + require.Panics(t, VerifyMessages) + delete(MessageIDMap, mtype) + // MessageIdReverseMap circumvented + EraseMessages() + MessageIDReverseMap[DummyPrefix] = mtype + require.Panics(t, VerifyMessages) + delete(MessageIDReverseMap, DummyPrefix) +} + +func TestMessagePrefixFromString(t *testing.T) { + EraseMessages() + require.Panics(t, func() { MessagePrefixFromString("") }) + require.Panics(t, func() { MessagePrefixFromString("xxxxx") }) + require.Equal(t, MessagePrefixFromString("abcd"), MessagePrefix{'a', 'b', 'c', 'd'}) + require.Equal(t, MessagePrefixFromString("abc"), MessagePrefix{'a', 'b', 'c', 0x00}) + require.Equal(t, MessagePrefixFromString("ab"), MessagePrefix{'a', 'b', 0x00, 0x00}) + require.Equal(t, MessagePrefixFromString("a"), MessagePrefix{'a', 0x00, 0x00, 0x00}) +} + +/* Helpers */ + +type Nothing struct{} + +var NothingPrefix = MessagePrefix{'N', 'O', 'T', 'H'} + +type DummyMessage struct{} + +var DummyPrefix = MessagePrefix{'D', 'U', 'M', 'Y'} + +// EncodeSize implements gnet.Serializer +func (dm *DummyMessage) EncodeSize() uint64 { + return uint64(encoder.Size(dm)) +} + +// Encode implements gnet.Serializer +func (dm *DummyMessage) Encode(buf []byte) error { + buf2 := encoder.Serialize(dm) + if len(buf) < len(buf2) { + return errors.New("Not enough buffer data to encode") + } + copy(buf[:], buf2[:]) + return nil +} + +// Decode implements gnet.Serializer +func (dm *DummyMessage) Decode(buf []byte) (uint64, error) { + return encoder.DeserializeRaw(buf, dm) +} + +func (dm *DummyMessage) Handle(context *MessageContext, x interface{}) error { + return nil +} + +type ErrorMessage struct{} + +var ( + ErrorPrefix = MessagePrefix{'E', 'R', 'R', 0x00} + ErrErrorMessageHandler = errors.New("Bad") +) + +// EncodeSize implements gnet.Serializer +func (em *ErrorMessage) EncodeSize() uint64 { + return uint64(encoder.Size(em)) +} + +// Encode implements gnet.Serializer +func (em *ErrorMessage) Encode(buf []byte) error { + buf2 := encoder.Serialize(em) + if len(buf) < len(buf2) { + return errors.New("Not enough buffer data to encode") + } + copy(buf[:], buf2[:]) + return nil +} + +// Decode implements gnet.Serializer +func (em *ErrorMessage) Decode(buf []byte) (uint64, error) { + return encoder.DeserializeRaw(buf, em) +} + +func (em *ErrorMessage) Handle(context *MessageContext, x interface{}) error { + return ErrErrorMessageHandler +} + +type ByteMessage struct { + X byte +} + +var BytePrefix = MessagePrefix{'B', 'Y', 'T', 'E'} + +// EncodeSize implements gnet.Serializer +func (bm *ByteMessage) EncodeSize() uint64 { + return uint64(encoder.Size(bm)) +} + +// Encode implements gnet.Serializer +func (bm *ByteMessage) Encode(buf []byte) error { + buf2 := encoder.Serialize(bm) + if len(buf) < len(buf2) { + return errors.New("Not enough buffer data to encode") + } + copy(buf[:], buf2[:]) + return nil +} + +// Decode implements gnet.Serializer +func (bm *ByteMessage) Decode(buf []byte) (uint64, error) { + return encoder.DeserializeRaw(buf, bm) +} + +func (bm *ByteMessage) Handle(c *MessageContext, x interface{}) error { + return nil +} + +func NewByteMessage(x byte) Message { + return &ByteMessage{X: x} +} + +type PointerMessage struct { + Ptr *int +} + +// EncodeSize implements gnet.Serializer +func (m *PointerMessage) EncodeSize() uint64 { + return uint64(encoder.Size(m)) +} + +// Encode implements gnet.Serializer +func (m *PointerMessage) Encode(buf []byte) error { + buf2 := encoder.Serialize(m) + if len(buf) < len(buf2) { + return errors.New("Not enough buffer data to encode") + } + copy(buf[:], buf2[:]) + return nil +} + +// Decode implements gnet.Serializer +func (m *PointerMessage) Decode(buf []byte) (uint64, error) { + return encoder.DeserializeRaw(buf, m) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool.go new file mode 100644 index 00000000..7142c39a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool.go @@ -0,0 +1,1066 @@ +/* +Package gnet is the core networking library +*/ +package gnet + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "net" + "reflect" + "sync" + "time" + + "io" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/daemon/strand" + "github.com/SkycoinProject/skycoin/src/util/elapse" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// DisconnectReason is passed to ConnectionPool's DisconnectCallback +type DisconnectReason error + +const ( + receiveMessageDurationThreshold = 500 * time.Millisecond + readLoopDurationThreshold = 10 * time.Second + sendInMsgChanDurationThreshold = 5 * time.Second + sendLoopDurationThreshold = 500 * time.Millisecond +) + +var ( + // ErrDisconnectSetReadDeadlineFailed set read deadline failed + ErrDisconnectSetReadDeadlineFailed DisconnectReason = errors.New("SetReadDeadline failed") + // ErrDisconnectInvalidMessageLength invalid message length + ErrDisconnectInvalidMessageLength DisconnectReason = errors.New("Invalid message length") + // ErrDisconnectMalformedMessage malformed message + ErrDisconnectMalformedMessage DisconnectReason = errors.New("Malformed message body") + // ErrDisconnectUnknownMessage unknown message + ErrDisconnectUnknownMessage DisconnectReason = errors.New("Unknown message ID") + // ErrDisconnectShutdown shutting down the client + ErrDisconnectShutdown DisconnectReason = errors.New("Shutdown") + // ErrDisconnectMessageDecodeUnderflow message data did not fully decode to a message object + ErrDisconnectMessageDecodeUnderflow DisconnectReason = errors.New("Message data did not fully decode to a message object") + // ErrDisconnectTruncatedMessageID message data was too short to contain a message ID + ErrDisconnectTruncatedMessageID DisconnectReason = errors.New("Message data was too short to contain a message ID") + + // ErrConnectionPoolClosed error message indicates the connection pool is closed + ErrConnectionPoolClosed = errors.New("Connection pool is closed") + // ErrWriteQueueFull write queue is full + ErrWriteQueueFull = errors.New("Write queue full") + // ErrNoReachableConnections when broadcasting a message, no connections were available to send a message to + ErrNoReachableConnections = errors.New("All pool connections are unreachable at this time") + // ErrNoMatchingConnections when broadcasting a message, no connections were found for the provided addresses + ErrNoMatchingConnections = errors.New("No connections found for broadcast addresses") + // ErrPoolEmpty when broadcasting a message, the connection pool was empty + ErrPoolEmpty = errors.New("Connection pool is empty after filtering connections") + // ErrConnectionExists connection exists + ErrConnectionExists = errors.New("Connection exists") + // ErrMaxIncomingConnectionsReached max incoming connections reached + ErrMaxIncomingConnectionsReached = errors.New("Max incoming connections reached") + // ErrMaxOutgoingConnectionsReached max outgoing connections reached + ErrMaxOutgoingConnectionsReached = errors.New("Max outgoing connections reached") + // ErrMaxOutgoingDefaultConnectionsReached max outgoing default connections reached + ErrMaxOutgoingDefaultConnectionsReached = errors.New("Max outgoing default connections reached") + // ErrNoAddresses no addresses were provided to BroadcastMessage + ErrNoAddresses = errors.New("No addresses provided") + + // Logger + logger = logging.MustGetLogger("gnet") +) + +// ReadError connection read error +type ReadError struct { + Err error +} + +func (e ReadError) Error() string { + return fmt.Sprintf("read failed: %v", e.Err) +} + +// WriteError connection read error +type WriteError struct { + Err error +} + +func (e WriteError) Error() string { + return fmt.Sprintf("write failed: %v", e.Err) +} + +// Config gnet config +type Config struct { + // Address to listen on. Leave empty for arbitrary assignment + Address string + // Port to listen on. Set to 0 for arbitrary assignment + Port uint16 + // Maximum total connections. Must be >= MaxOutgoingConnections + MaxDefaultPeerOutgoingConnections. + MaxConnections int + // Maximum outgoing connections + MaxOutgoingConnections int + // Maximum allowed default outgoing connection number + MaxDefaultPeerOutgoingConnections int + // Messages greater than length are rejected and the sender disconnected + MaxIncomingMessageLength int + // Messages greater than length are not sent and an error is reported in a SendResult + MaxOutgoingMessageLength int + // Timeout is the timeout for dialing new connections. Use a + // timeout of 0 to ignore timeout. + DialTimeout time.Duration + // Timeout for reading from a connection. Set to 0 to default to the + // system's timeout + ReadTimeout time.Duration + // Timeout for writing to a connection. Set to 0 to default to the + // system's timeout + WriteTimeout time.Duration + // Message sent event buffers + SendResultsSize int + // Individual connections' send queue size. This should be increased + // if send volume per connection is high, so as not to block + ConnectionWriteQueueSize int + // Triggered on client disconnect + DisconnectCallback DisconnectCallback + // Triggered on client connect + ConnectCallback ConnectCallback + // Triggered on client connect failure + ConnectFailureCallback ConnectFailureCallback + // Print debug logs + DebugPrint bool + // Default "trusted" peers + DefaultConnections []string + // Default connections map + defaultConnections map[string]struct{} +} + +// NewConfig returns a Config with defaults set +func NewConfig() Config { + return Config{ + Address: "", + Port: 0, + MaxConnections: 128, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + MaxDefaultPeerOutgoingConnections: 1, + DialTimeout: time.Second * 30, + ReadTimeout: time.Second * 30, + WriteTimeout: time.Second * 30, + SendResultsSize: 2048, + ConnectionWriteQueueSize: 128, + DisconnectCallback: nil, + ConnectCallback: nil, + DebugPrint: false, + defaultConnections: make(map[string]struct{}), + } +} + +const ( + // Byte size of the length prefix in message, sizeof(int32) + messageLengthPrefixSize = 4 +) + +// Connection is stored by the ConnectionPool +type Connection struct { + // Key in ConnectionPool.Pool + ID uint64 + // TCP connection + Conn net.Conn + // Message buffer + Buffer *bytes.Buffer + // Reference back to ConnectionPool container + ConnectionPool *ConnectionPool + // Last time a message was fully parsed and handled + LastReceived time.Time + // Last time a message was sent to the connection + LastSent time.Time + // Message send queue. + WriteQueue chan Message + Solicited bool +} + +// NewConnection creates a new Connection tied to a ConnectionPool +func NewConnection(pool *ConnectionPool, id uint64, conn net.Conn, writeQueueSize int, solicited bool) *Connection { + return &Connection{ + ID: id, + Conn: conn, + Buffer: &bytes.Buffer{}, + ConnectionPool: pool, + LastReceived: Now(), + LastSent: Now(), + WriteQueue: make(chan Message, writeQueueSize), + Solicited: solicited, + } +} + +// Addr returns remote address +func (conn *Connection) Addr() string { + return conn.Conn.RemoteAddr().String() +} + +// String returns connection address +func (conn *Connection) String() string { + return conn.Addr() +} + +// Close close the connection and write queue +func (conn *Connection) Close() error { + err := conn.Conn.Close() + close(conn.WriteQueue) + conn.Buffer = &bytes.Buffer{} + return err +} + +// DisconnectCallback triggered on client disconnect +type DisconnectCallback func(addr string, id uint64, reason DisconnectReason) + +// ConnectCallback triggered on client connect +type ConnectCallback func(addr string, id uint64, solicited bool) + +// ConnectFailureCallback trigger on client connect failure +type ConnectFailureCallback func(addr string, solicited bool, err error) + +// ConnectionPool connection pool +type ConnectionPool struct { + // Configuration parameters + Config Config + // Channel for async message sending + SendResults chan SendResult + // All connections, indexed by ConnId + pool map[uint64]*Connection + // All connections, indexed by address + addresses map[string]*Connection + // connected default peer connections + defaultOutgoingConnections map[string]struct{} + // connected outgoing connections + outgoingConnections map[string]struct{} + // User-defined state to be passed into message handlers + messageState interface{} + // Connection ID counter + connID uint64 + // Listening connection + listener net.Listener + listenerLock sync.Mutex + // operations channel + reqC chan strand.Request + // quit channel + quit chan struct{} + done chan struct{} + strandDone chan struct{} + wg sync.WaitGroup +} + +// NewConnectionPool creates a new ConnectionPool that will listen on +// Config.Port upon StartListen. State is an application defined object that +// will be passed to a Message's Handle(). +func NewConnectionPool(c Config, state interface{}) (*ConnectionPool, error) { + for _, p := range c.DefaultConnections { + c.defaultConnections[p] = struct{}{} + } + + if c.MaxConnections < c.MaxOutgoingConnections+c.MaxDefaultPeerOutgoingConnections { + return nil, errors.New("MaxConnections must be >= MaxOutgoingConnections + MaxDefaultPeerOutgoingConnections") + } + + return &ConnectionPool{ + Config: c, + pool: make(map[uint64]*Connection), + addresses: make(map[string]*Connection), + defaultOutgoingConnections: make(map[string]struct{}), + outgoingConnections: make(map[string]struct{}), + SendResults: make(chan SendResult, c.SendResultsSize), + messageState: state, + quit: make(chan struct{}), + done: make(chan struct{}), + strandDone: make(chan struct{}), + reqC: make(chan strand.Request), + }, nil +} + +// Run starts the connection pool +func (pool *ConnectionPool) Run() error { + defer close(pool.done) + defer logger.Info("Connection pool closed") + + // The strand processing goroutine must be started before any error can be + // returned from Run(), otherwise the Shutdown() call will block if an error occurred + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + pool.processStrand() + }() + + // start the connection accept loop + addr := fmt.Sprintf("%s:%v", pool.Config.Address, pool.Config.Port) + logger.Infof("Listening for connections on %s...", addr) + + ln, err := net.Listen("tcp", addr) + if err != nil { + return err + } + + pool.listenerLock.Lock() + pool.listener = ln + pool.listenerLock.Unlock() + +loop: + for { + conn, err := ln.Accept() + if err != nil { + // When Accept() returns with a non-nil error, we check the quit + // channel to see if we should continue or quit + select { + case <-pool.quit: + break loop + default: + // without the default case the select will block. + logger.Error(err.Error()) + continue + } + } + + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + if err := pool.handleConnection(conn, false); err != nil { + logger.WithFields(logrus.Fields{ + "addr": conn.RemoteAddr(), + "outgoing": false, + }).WithError(err).Error("pool.handleConnection") + } + }() + } + pool.wg.Wait() + return nil +} + +// RunOffline runs the pool in offline mode. No connections will be accepted, +// but strand requests are processed. +func (pool *ConnectionPool) RunOffline() error { + defer close(pool.done) + pool.processStrand() + return nil +} + +func (pool *ConnectionPool) processStrand() { + defer close(pool.strandDone) + for { + select { + case <-pool.quit: + return + case req := <-pool.reqC: + if err := req.Func(); err != nil { + logger.WithField("operation", req.Name).WithError(err).Error("strand req.Func failed") + } + } + } +} + +// Shutdown gracefully shutdown the connection pool +func (pool *ConnectionPool) Shutdown() { + logger.Info("ConnectionPool.Shutdown called") + close(pool.quit) + logger.Info("ConnectionPool.Shutdown closed pool.quit") + + // Wait for all strand() calls to finish + logger.Info("ConnectionPool.Shutdown waiting for strandDone") + <-pool.strandDone + + logger.Info("ConnectionPool.Shutdown closing the listener") + + // Close to listener to prevent new connections + pool.listenerLock.Lock() + if pool.listener != nil { + if err := pool.listener.Close(); err != nil { + logger.WithError(err).Warning("pool.listener.Close error") + } + } + pool.listener = nil + pool.listenerLock.Unlock() + + logger.Info("ConnectionPool.Shutdown disconnecting all connections") + + // In readData, reader.Read() sometimes blocks instead of returning an error when the + // listener is closed. + // Directly close all connections before closing the listener. + // TODO -- could conn.Close() block too? + pool.disconnectAll() + + if len(pool.pool) != 0 { + logger.Critical().Warning("pool.pool is not empty after calling pool.disconnectAll()") + } + if len(pool.addresses) != 0 { + logger.Critical().Warning("pool.addresses is not empty after calling pool.disconnectAll()") + } + + logger.Info("ConnectionPool.Shutdown waiting for done") + + <-pool.done +} + +// strand ensures all read and write action of pool's member variable are in one thread +func (pool *ConnectionPool) strand(name string, f func() error) error { + name = fmt.Sprintf("daemon.gnet.ConnectionPool.%s", name) + return strand.Strand(logger, pool.reqC, name, f, pool.quit, ErrConnectionPoolClosed) +} + +// ListeningAddress returns the address on which the ConnectionPool listens on +func (pool *ConnectionPool) ListeningAddress() (net.Addr, error) { + if pool.listener == nil { + return nil, errors.New("Not listening, call StartListen first") + } + return pool.listener.Addr(), nil +} + +func (pool *ConnectionPool) canConnect(a string, solicited bool) error { + if pool.isConnExist(a) { + return ErrConnectionExists + } + + if solicited { + if _, ok := pool.Config.defaultConnections[a]; ok && pool.isMaxOutgoingDefaultConnectionsReached() { + return ErrMaxOutgoingDefaultConnectionsReached + } else if pool.isMaxOutgoingConnectionsReached() { + return ErrMaxOutgoingConnectionsReached + } + } else if pool.isMaxIncomingConnectionsReached() { + return ErrMaxIncomingConnectionsReached + } + + return nil +} + +// newConnection creates a new Connection around a net.Conn. Trying to make a connection +// to an address that is already connected will failed. +func (pool *ConnectionPool) newConnection(conn net.Conn, solicited bool) (*Connection, error) { + a := conn.RemoteAddr().String() + + if err := pool.canConnect(a, solicited); err != nil { + return nil, err + } + + if solicited { + pool.outgoingConnections[a] = struct{}{} + + if _, ok := pool.Config.defaultConnections[a]; ok { + pool.defaultOutgoingConnections[a] = struct{}{} + l := len(pool.defaultOutgoingConnections) + logger.WithField("addr", a).Debugf("%d/%d outgoing default connections in use", l, pool.Config.MaxDefaultPeerOutgoingConnections) + } + } + + // ID must start at 1; in case connID overflows back to 0, force it to 1 + pool.connID++ + if pool.connID == 0 { + pool.connID = 1 + } + + nc := NewConnection(pool, pool.connID, conn, pool.Config.ConnectionWriteQueueSize, solicited) + + pool.pool[nc.ID] = nc + pool.addresses[a] = nc + + return nc, nil +} + +// Creates a Connection and begins its read and write loop +func (pool *ConnectionPool) handleConnection(conn net.Conn, solicited bool) error { + defer logger.WithField("addr", conn.RemoteAddr()).Debug("Connection closed") + addr := conn.RemoteAddr().String() + + c, err := func() (c *Connection, err error) { + // TODO -- when limits in newConnection() are reached, should we allow the peer + // to be added anyway, so that we can disconnect it normally and send a disconnect packet? + // It would have to allowed to complete the handshake, otherwise the DISC packet will be ignored + // Or we would have to permit a DISC packet before an INTR + // But the read/write loop would still need to be started + // A ConnectEvent would need to be triggered, or else the DisconnectEvent gnet ID will not match the + // pending connection's zero gnet ID. + defer func() { + if err != nil { + if closeErr := conn.Close(); closeErr != nil { + logger.WithError(closeErr).WithField("addr", addr).Error("handleConnection conn.Close") + } + } + }() + + err = pool.strand("handleConnection", func() error { + var err error + c, err = pool.newConnection(conn, solicited) + if err != nil { + return err + } + + if pool.Config.ConnectCallback != nil { + pool.Config.ConnectCallback(c.Addr(), c.ID, solicited) + } + + return nil + }) + + return + }() + + // TODO -- this error is not fully propagated back to a caller of Connect() so the daemon state + // can get stuck in pending + if err != nil { + logger.WithError(err).WithField("addr", conn.RemoteAddr()).Debug("handleConnection: newConnection failed") + if pool.Config.ConnectFailureCallback != nil { + pool.Config.ConnectFailureCallback(addr, solicited, err) + } + return err + } + + msgC := make(chan []byte, 32) + + type methodErr struct { + method string + err error + } + errC := make(chan methodErr, 3) + + var wg sync.WaitGroup + wg.Add(1) + qc := make(chan struct{}) + go func() { + defer wg.Done() + if err := pool.readLoop(c, msgC, qc); err != nil { + errC <- methodErr{ + method: "readLoop", + err: err, + } + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + if err := pool.sendLoop(c, pool.Config.WriteTimeout, pool.Config.MaxOutgoingMessageLength, qc); err != nil { + errC <- methodErr{ + method: "sendLoop", + err: err, + } + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + elapser := elapse.NewElapser(receiveMessageDurationThreshold, logger) + defer elapser.CheckForDone() + + for msg := range msgC { + elapser.Register(fmt.Sprintf("pool.receiveMessage address=%s", addr)) + if err := pool.receiveMessage(c, msg); err != nil { + errC <- methodErr{ + method: "receiveMessage", + err: err, + } + return + } + elapser.CheckForDone() + } + }() + + select { + case <-pool.quit: + if err := conn.Close(); err != nil { + logger.WithError(err).WithField("addr", addr).Error("conn.Close") + } + case mErr := <-errC: + err = mErr.err + logger.WithError(mErr.err).WithFields(logrus.Fields{ + "addr": addr, + "method": mErr.method, + }).Error("handleConnection failure") + + // This Disconnect does not send a DISC packet because it is inside gnet. + // A DISC packet is not useful at this point, because the error is most likely + // that the connection is unreachable. + // However, it may also be that the connection sent data that could not be deserialized + // to a message. + if err := pool.Disconnect(c.Addr(), mErr.err); err != nil { + logger.WithError(err).WithField("addr", addr).Error("Disconnect") + } + } + close(qc) + + wg.Wait() + + return err +} + +func (pool *ConnectionPool) readLoop(conn *Connection, msgChan chan []byte, qc chan struct{}) error { + defer close(msgChan) + // read data from connection + reader := bufio.NewReader(conn.Conn) + buf := make([]byte, 1024) + + elapser := elapse.NewElapser(readLoopDurationThreshold, logger) + sendInMsgChanElapser := elapse.NewElapser(sendInMsgChanDurationThreshold, logger) + + defer elapser.CheckForDone() + defer sendInMsgChanElapser.CheckForDone() + + for { + elapser.Register(fmt.Sprintf("readLoop addr=%s", conn.Addr())) + deadline := time.Time{} + if pool.Config.ReadTimeout != 0 { + deadline = time.Now().Add(pool.Config.ReadTimeout) + } + if err := conn.Conn.SetReadDeadline(deadline); err != nil { + return ErrDisconnectSetReadDeadlineFailed + } + data, err := readData(reader, buf) + if err != nil { + return err + } + + if data == nil { + continue + } + + // write data to buffer + if _, err := conn.Buffer.Write(data); err != nil { + return err + } + // decode data + datas, err := decodeData(conn.Buffer, pool.Config.MaxIncomingMessageLength) + if err != nil { + return err + } + for _, d := range datas { + // use select to avoid the goroutine leak, + // because if msgChan has no receiver this goroutine will leak + select { + case <-qc: + return nil + case <-pool.quit: + return nil + case msgChan <- d: + default: + return errors.New("readLoop msgChan is closed or full") + } + } + sendInMsgChanElapser.CheckForDone() + } +} + +func (pool *ConnectionPool) sendLoop(conn *Connection, timeout time.Duration, maxMsgLength int, qc chan struct{}) error { + elapser := elapse.NewElapser(sendLoopDurationThreshold, logger) + defer elapser.CheckForDone() + + for { + elapser.CheckForDone() + select { + case <-pool.quit: + return nil + case <-qc: + return nil + case m := <-conn.WriteQueue: + elapser.Register(fmt.Sprintf("conn.WriteQueue address=%s", conn.Addr())) + if m == nil { + continue + } + + err := sendMessage(conn.Conn, m, timeout, maxMsgLength) + + // Update last sent before writing to SendResult, + // this allows a write to SendResult to be used as a sync marker, + // since no further action in this block will happen after the write. + if err == nil { + if err := pool.updateLastSent(conn.Addr(), Now()); err != nil { + logger.WithField("addr", conn.Addr()).WithError(err).Warning("updateLastSent failed") + } + } + + sr := newSendResult(conn.Addr(), m, err) + select { + case <-qc: + return nil + case pool.SendResults <- sr: + default: + logger.WithField("addr", conn.Addr()).Warning("SendResults queue full") + } + + if err != nil { + return err + } + } + } +} + +func readData(reader io.Reader, buf []byte) ([]byte, error) { + c, err := reader.Read(buf) + if err != nil { + return nil, &ReadError{ + Err: err, + } + } + if c == 0 { + return nil, nil + } + data := make([]byte, c) + copy(data, buf) + return data, nil +} + +// decode data from buffer. +func decodeData(buf *bytes.Buffer, maxMsgLength int) ([][]byte, error) { + dataArray := [][]byte{} + for buf.Len() > messageLengthPrefixSize { + prefix := buf.Bytes()[:messageLengthPrefixSize] + // decode message length + tmpLength, _, err := encoder.DeserializeUint32(prefix) + if err != nil { + // encoder.DeserializeAtomic should only return an error if there wasn't + // enough data in buf to read the integer, but the prefix buf length + // is already ensured to be long enough + logger.Panicf("encoder.DeserializeUint32 failed unexpectedly: %v", err) + } + + length := int(tmpLength) + + // Disconnect if we received an invalid length + if length < messagePrefixLength { + logger.WithFields(logrus.Fields{ + "length": length, + "messagePrefixLength": messagePrefixLength, + }).Warningf("decodeData: length < messagePrefixLength") + return [][]byte{}, ErrDisconnectInvalidMessageLength + } + + if length > maxMsgLength { + logger.WithFields(logrus.Fields{ + "length": length, + "maxMsgLength": maxMsgLength, + }).Warning("decodeData: length > maxMsgLength") + return [][]byte{}, ErrDisconnectInvalidMessageLength + } + + if buf.Len()-messageLengthPrefixSize < length { + return [][]byte{}, nil + } + + buf.Next(messageLengthPrefixSize) // strip the length prefix + data := make([]byte, length) + _, err = buf.Read(data) + if err != nil { + return [][]byte{}, err + } + + dataArray = append(dataArray, data) + } + return dataArray, nil +} + +// isConnExist check if the connection of address does exist +func (pool *ConnectionPool) isConnExist(addr string) bool { + _, ok := pool.addresses[addr] + return ok +} + +func (pool *ConnectionPool) isMaxIncomingConnectionsReached() bool { + return len(pool.pool) >= (pool.Config.MaxConnections - pool.Config.MaxOutgoingConnections - pool.Config.MaxDefaultPeerOutgoingConnections) +} + +func (pool *ConnectionPool) isMaxOutgoingConnectionsReached() bool { + return len(pool.outgoingConnections) >= pool.Config.MaxOutgoingConnections +} + +func (pool *ConnectionPool) isMaxOutgoingDefaultConnectionsReached() bool { + return len(pool.defaultOutgoingConnections) >= pool.Config.MaxDefaultPeerOutgoingConnections +} + +func (pool *ConnectionPool) updateLastSent(addr string, t time.Time) error { + return pool.strand("updateLastSent", func() error { + if conn, ok := pool.addresses[addr]; ok { + conn.LastSent = t + } + return nil + }) +} + +func (pool *ConnectionPool) updateLastRecv(addr string, t time.Time) error { + return pool.strand("updateLastRecv", func() error { + if conn, ok := pool.addresses[addr]; ok { + conn.LastReceived = t + } + return nil + }) +} + +// GetConnection returns a connection copy if exist +func (pool *ConnectionPool) GetConnection(addr string) (*Connection, error) { + var conn *Connection + if err := pool.strand("GetConnection", func() error { + if c, ok := pool.addresses[addr]; ok { + // copy connection + cc := *c + conn = &cc + } + return nil + }); err != nil { + return nil, err + } + + return conn, nil +} + +// Connect to an address +func (pool *ConnectionPool) Connect(address string) error { + if err := pool.strand("canConnect", func() error { + return pool.canConnect(address, true) + }); err != nil { + return err + } + + logger.WithField("addr", address).Debugf("Making TCP connection") + conn, err := net.DialTimeout("tcp", address, pool.Config.DialTimeout) + if err != nil { + return err + } + + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + if err := pool.handleConnection(conn, true); err != nil { + logger.WithFields(logrus.Fields{ + "addr": conn.RemoteAddr(), + "outgoing": true, + }).WithError(err).Error("pool.handleConnection") + } + }() + return nil +} + +// Disconnect removes a connection from the pool by address and invokes DisconnectCallback +func (pool *ConnectionPool) Disconnect(addr string, r DisconnectReason) error { + return pool.strand("Disconnect", func() error { + logger.WithFields(logrus.Fields{ + "addr": addr, + "reason": r, + }).Debug("Disconnecting") + + // checks if the address is default node address + isDefaultOutgoingConn := false + if _, ok := pool.Config.defaultConnections[addr]; ok { + if _, ok := pool.outgoingConnections[addr]; ok { + isDefaultOutgoingConn = true + } + } + + conn := pool.disconnect(addr, r) + + if conn == nil { + return errors.New("Disconnect: connection does not exist") + } + + if isDefaultOutgoingConn { + l := len(pool.defaultOutgoingConnections) + logger.Debugf("%d/%d default connections in use", l, pool.Config.MaxDefaultPeerOutgoingConnections) + } + + if pool.Config.DisconnectCallback != nil { + pool.Config.DisconnectCallback(addr, conn.ID, r) + } + + return nil + }) +} + +func (pool *ConnectionPool) disconnect(addr string, r DisconnectReason) *Connection { + conn, ok := pool.addresses[addr] + if !ok { + return nil + } + + fields := logrus.Fields{ + "addr": addr, + "id": conn.ID, + } + + delete(pool.pool, conn.ID) + delete(pool.addresses, addr) + delete(pool.defaultOutgoingConnections, addr) + delete(pool.outgoingConnections, addr) + if err := conn.Close(); err != nil { + logger.WithError(err).WithFields(fields).Error("conn.Close") + } + + logger.WithFields(fields).WithField("reason", r).Debug("Closed connection and removed from pool") + + return conn +} + +// disconnectAll disconnects all connections. Only safe to call in Shutdown() +func (pool *ConnectionPool) disconnectAll() { + for _, conn := range pool.pool { + addr := conn.Addr() + pool.disconnect(addr, ErrDisconnectShutdown) + } +} + +// GetConnections returns an copy of pool connections +func (pool *ConnectionPool) GetConnections() ([]Connection, error) { + conns := []Connection{} + if err := pool.strand("GetConnections", func() error { + for _, conn := range pool.pool { + conns = append(conns, *conn) + } + return nil + }); err != nil { + return nil, err + } + return conns, nil +} + +// Size returns the pool size +func (pool *ConnectionPool) Size() (l int, err error) { + err = pool.strand("Size", func() error { + l = len(pool.pool) + return nil + }) + return +} + +// SendMessage sends a Message to a Connection +func (pool *ConnectionPool) SendMessage(addr string, msg Message) error { + if pool.Config.DebugPrint { + logger.WithField("msgType", reflect.TypeOf(msg)).Debug("SendMessage") + } + + return pool.strand("SendMessage", func() error { + if conn, ok := pool.addresses[addr]; ok { + select { + case conn.WriteQueue <- msg: + default: + logger.Critical().WithField("addr", addr).Info("Write queue full") + return ErrWriteQueueFull + } + } else { + return fmt.Errorf("Tried to send %T to %s, but we are not connected", msg, addr) + } + return nil + }) +} + +// BroadcastMessage sends a Message to all connections specified in addrs. +// If a connection does not exist for a given address, it is skipped. +// If no messages were written to any connection, an error is returned. +// Returns the gnet IDs of connections that the message was queued for sending to. +// Note that actual sending can still fail later, if the connection drops before the message is sent. +func (pool *ConnectionPool) BroadcastMessage(msg Message, addrs []string) ([]uint64, error) { + if pool.Config.DebugPrint { + logger.WithField("msgType", reflect.TypeOf(msg)).Debug("BroadcastMessage") + } + + if len(addrs) == 0 { + return nil, ErrNoAddresses + } + + queuedConns := make([]uint64, 0, len(addrs)) + + if err := pool.strand("BroadcastMessage", func() error { + if len(pool.pool) == 0 { + return ErrPoolEmpty + } + + fullWriteQueue := 0 + foundConns := 0 + + for _, addr := range addrs { + if conn, ok := pool.addresses[addr]; ok { + foundConns++ + select { + case conn.WriteQueue <- msg: + queuedConns = append(queuedConns, conn.ID) + default: + logger.Critical().WithFields(logrus.Fields{ + "addr": conn.Addr(), + "id": conn.ID, + }).Info("Write queue full") + fullWriteQueue++ + } + } + } + + if foundConns == 0 { + return ErrNoMatchingConnections + } + + if fullWriteQueue == foundConns { + return ErrNoReachableConnections + } + + return nil + }); err != nil { + return nil, err + } + + return queuedConns, nil +} + +// Unpacks incoming bytes to a Message and calls the message handler. If +// the bytes cannot be converted to a Message, the error is returned as the +// first return value. Otherwise, error will be nil and DisconnectReason will +// be the value returned from the message handler. +func (pool *ConnectionPool) receiveMessage(c *Connection, msg []byte) error { + m, err := convertToMessage(c.ID, msg, pool.Config.DebugPrint) + if err != nil { + return err + } + if err := pool.updateLastRecv(c.Addr(), Now()); err != nil { + return err + } + return m.Handle(NewMessageContext(c), pool.messageState) +} + +// SendPings sends a ping if our last message sent was over pingRate ago +func (pool *ConnectionPool) SendPings(rate time.Duration, msg Message) error { + now := time.Now().UTC() + var addrs []string + if err := pool.strand("SendPings", func() error { + for _, conn := range pool.pool { + if conn.LastSent.Add(rate).Before(now) { + addrs = append(addrs, conn.Addr()) + } + } + return nil + }); err != nil { + return err + } + + for _, a := range addrs { + if err := pool.SendMessage(a, msg); err != nil { + return err + } + } + + return nil +} + +// GetStaleConnections returns connections that have been idle for longer than idleLimit +func (pool *ConnectionPool) GetStaleConnections(idleLimit time.Duration) ([]string, error) { + now := Now() + var idleConns []string + if err := pool.strand("GetStaleConnections", func() error { + for _, conn := range pool.pool { + if conn.LastReceived.Add(idleLimit).Before(now) { + idleConns = append(idleConns, conn.Addr()) + } + } + return nil + }); err != nil { + return nil, err + } + + return idleConns, nil +} + +// Now returns the current UTC time +func Now() time.Time { + return time.Now().UTC() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool_test.go new file mode 100644 index 00000000..16213234 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool_test.go @@ -0,0 +1,1383 @@ +package gnet + +import ( + "bytes" + "errors" + "fmt" + "net" + "strings" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +const ( + addr = "127.0.0.1:50823" + port = 50823 + address = "127.0.0.1" + silenceLogger = false +) + +func init() { + if silenceLogger { + logging.Disable() + } +} + +func newTestConfig() Config { + cfg := NewConfig() + cfg.Port = uint16(port) + cfg.Address = address + cfg.MaxConnections = 24 + cfg.MaxOutgoingConnections = 8 + cfg.MaxDefaultPeerOutgoingConnections = 8 + return cfg +} + +func TestNewConnectionPool(t *testing.T) { + cfg := newTestConfig() + cfg.MaxConnections = 108 + cfg.DialTimeout = time.Duration(777) + + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + require.Equal(t, cfg, p.Config) + require.Equal(t, cfg.Port, p.Config.Port) + require.Equal(t, cfg.Address, p.Config.Address) + require.NotNil(t, p.pool) + require.Equal(t, 0, len(p.pool)) + require.NotNil(t, p.addresses) + require.Equal(t, 0, len(p.addresses)) + require.Equal(t, uint64(0), p.connID) +} + +func TestNewConnection(t *testing.T) { + cfg := newTestConfig() + cfg.ConnectionWriteQueueSize = 101 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + wait() + + err = p.strand("", func() error { + c := p.addresses[conn.LocalAddr().String()] + require.Equal(t, c, p.pool[p.connID]) + require.Equal(t, uint64(1), p.connID) + require.Equal(t, c.Addr(), conn.LocalAddr().String()) + require.Equal(t, cfg.ConnectionWriteQueueSize, cap(c.WriteQueue)) + require.NotNil(t, c.Buffer) + require.Equal(t, 0, c.Buffer.Len()) + require.Equal(t, p, c.ConnectionPool) + require.False(t, c.LastSent.IsZero()) + require.False(t, c.LastReceived.IsZero()) + return nil + }) + require.NoError(t, err) + + p.Shutdown() + <-q +} + +func TestNewConnectionAlreadyConnected(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + require.False(t, solicited) + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + ac := p.addresses[conn.LocalAddr().String()] + require.NotNil(t, ac) + require.Equal(t, c.ID, ac.ID) + + _, err = p.newConnection(c.Conn, true) + require.Error(t, err) + require.Equal(t, ErrConnectionExists, err) + + p.Shutdown() + <-q +} + +func TestAcceptConnections(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + var wasSolicited *bool + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + wasSolicited = &solicited + require.False(t, solicited) + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + require.Len(t, p.addresses, 1) + require.Len(t, p.pool, 1) + + require.Equal(t, conn.RemoteAddr().String(), c.Conn.LocalAddr().String()) + require.Equal(t, conn.LocalAddr().String(), c.Conn.RemoteAddr().String()) + + require.NotNil(t, wasSolicited) + require.False(t, *wasSolicited) + + p.Shutdown() + <-q +} + +func TestStartListenFailed(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + pp, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + err = pp.Run() + require.Error(t, err) + require.True(t, strings.HasSuffix(err.Error(), "bind: address already in use")) + + p.Shutdown() + <-q +} + +func TestStopListen(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + _, err = net.Dial("tcp", addr) + require.NoError(t, err) + wait() + + err = p.strand("", func() error { + require.Equal(t, len(p.pool), 1) + return nil + }) + require.NoError(t, err) + + p.Shutdown() + <-q + + require.Nil(t, p.listener) +} + +func TestHandleConnection(t *testing.T) { + cfg := newTestConfig() + + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Unsolicited + cc := make(chan *Connection, 1) + var wasSolicited *bool + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + wasSolicited = &solicited + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + var c *Connection + waitTimeout := time.Second * 3 + select { + case c = <-cc: + case <-time.After(waitTimeout): + t.Fatal("Timed out waiting for connection") + } + require.NotNil(t, c) + + var exist bool + err = p.strand("isConnExist", func() error { + exist = p.isConnExist(conn.LocalAddr().String()) + return nil + }) + require.NoError(t, err) + require.True(t, exist) + + dc := p.disconnect(conn.LocalAddr().String(), ErrDisconnectUnknownMessage) + require.NotNil(t, dc) + + require.NotNil(t, wasSolicited) + require.False(t, *wasSolicited) + + // Solicited + wasSolicited = nil + p.Config.ConnectCallback = func(addr string, id uint64, s bool) { + wasSolicited = &s + cc <- p.pool[2] + } + + done := make(chan struct{}) + go func() { + defer close(done) + err = p.handleConnection(conn, true) + require.NotEqual(t, ErrConnectionExists, err) + require.NotEqual(t, ErrMaxIncomingConnectionsReached, err) + require.NotEqual(t, ErrMaxOutgoingConnectionsReached, err) + require.NotEqual(t, ErrMaxOutgoingDefaultConnectionsReached, err) + }() + + c = nil + select { + case c = <-cc: + case <-time.After(waitTimeout): + t.Fatal("Timed out waiting for connection") + } + require.NotNil(t, c) + require.Equal(t, addr, c.Addr()) + + p.Shutdown() + + select { + case <-done: + case <-time.After(waitTimeout): + t.Fatal("Timed out waiting for done") + } + + select { + case <-q: + case <-time.After(waitTimeout): + t.Fatal("Timed out waiting for quit") + } +} + +func TestConnect(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + err = p.Connect(addr) + require.NoError(t, err) + wait() + + // If already connected, should return same connection + err = p.Connect(addr) + require.Equal(t, ErrConnectionExists, err) + wait() + + delete(p.addresses, addr) + + p.Shutdown() + <-q + + // Pool is shutdown, connect should fail + wc := make(chan struct{}) + var connectErr error + go func() { + defer close(wc) + connectErr = p.Connect(addr) + }() + + <-wc + + require.Error(t, connectErr) +} + +func TestConnectNoTimeout(t *testing.T) { + cfg := newTestConfig() + cfg.DialTimeout = 0 + cfg.Port++ + + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + p.Shutdown() + <-q + + err = p.Connect(addr) + wait() + + require.Error(t, err) +} + +func TestDisconnect(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + _, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + var cAddr string + err = p.strand("", func() error { + cAddr = c.Addr() + return nil + }) + require.NoError(t, err) + + err = p.strand("", func() error { + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + require.Equal(t, cAddr, addr) + } + return nil + }) + require.NoError(t, err) + + err = p.Disconnect(c.Addr(), ErrDisconnectMalformedMessage) + require.NoError(t, err) + + err = p.strand("", func() error { + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + t.Fatal("disconnect unknown connection should not see this") + } + return nil + }) + require.NoError(t, err) + + err = p.Disconnect("", nil) + require.Equal(t, errors.New("Disconnect: connection does not exist"), err) + + p.Shutdown() + <-q +} + +func TestConnectionClose(t *testing.T) { + c := &Connection{ + Conn: NewDummyConn(addr), + Buffer: &bytes.Buffer{}, + WriteQueue: make(chan Message), + } + + c.Buffer.WriteByte(7) + require.Equal(t, c.Buffer.Len(), 1) + c.Close() + + select { + case <-c.WriteQueue: + case <-time.After(time.Millisecond): + t.Fatalf("WriteQueue should be closed") + } + + require.Equal(t, c.Buffer.Len(), 0) +} + +type fakeConn struct { + net.Conn + addr string +} + +func (f fakeConn) RemoteAddr() net.Addr { + return fakeAddr{ + addr: f.addr, + } +} + +type fakeAddr struct { + net.Addr + addr string +} + +func (f fakeAddr) String() string { + return f.addr +} + +func TestGetConnections(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + c := &Connection{ + ID: 1, + Conn: fakeConn{addr: "1.2.3.4"}, + } + d := &Connection{ + ID: 2, + Conn: fakeConn{addr: "2.3.4.5"}, + } + e := &Connection{ + ID: 3, + Conn: fakeConn{addr: "3.4.5.6"}, + } + + p.pool[c.ID] = c + p.pool[d.ID] = d + p.pool[e.ID] = e + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conns, err := p.GetConnections() + require.NoError(t, err) + require.Equal(t, len(conns), 3) + + m := make(map[uint64]*Connection, 3) + for i, c := range conns { + m[c.ID] = &conns[i] + } + + require.Equal(t, len(m), 3) + for i := 1; i <= 3; i++ { + require.Equal(t, m[uint64(i)], p.pool[uint64(i)]) + } + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopReadError(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + readDataErr := "read failed: failed" + + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, readDataErr, reason.Error()) + } + + // 1: + // Use a mock net.Conn that captures SetReadDeadline + // and throws an error on Read + reconn := NewReadErrorConn() + go func() { + err := p.handleConnection(reconn, false) + require.Equal(t, readDataErr, err.Error()) + }() + + <-cc + + wait() + + require.True(t, reconn.(*ReadErrorConn).GetReadDeadlineSet() != time.Time{}) + reconn.Close() + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 10): + t.Fatal("wait for disconnectCalled timed out") + } + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopSetReadDeadlineFailed(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + // 2: + // Use a mock net.Conn that fails on SetReadDeadline + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, ErrDisconnectSetReadDeadlineFailed, reason) + } + + rdfconn := &ReadDeadlineFailedConn{} + go func() { + err := p.handleConnection(rdfconn, false) + require.Equal(t, ErrDisconnectSetReadDeadlineFailed, err) + }() + + <-cc + + rdfconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopInvalidMessageLength(t *testing.T) { + cfg := newTestConfig() + cfg.MaxIncomingMessageLength = 1 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + // 3: + // Use a mock net.Conn that returns some bytes on Read + // Look for these bytes copied into the eventChannel + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, ErrDisconnectInvalidMessageLength, reason) + } + + raconn := newReadAlwaysConn() + go func() { + err := p.handleConnection(raconn, false) + require.Equal(t, ErrDisconnectInvalidMessageLength, err) + }() + + <-cc + + wait() + raconn.stop() + wait() + raconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopTerminates(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + readDataErr := "read failed: done" + + // 4: Use a mock net.Conn that successfully returns 0 bytes when read + rnconn := newReadNothingConn() + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, readDataErr, reason.Error()) + } + go func() { + err := p.handleConnection(rnconn, false) + require.Equal(t, readDataErr, err.Error()) + }() + + <-cc + + wait() + rnconn.stop() + wait() + rnconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestProcessConnectionBuffers(t *testing.T) { + assertIsMessage(t, &DummyMessage{}) + assertIsMessage(t, &ErrorMessage{}) + + resetHandler() + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + RegisterMessage(ErrorPrefix, ErrorMessage{}) + VerifyMessages() + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + t.Fatalf("Unexpected disconnect address=%s reason=%v", addr, reason) + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + // Write DummyMessage + _, err = conn.Write([]byte{4, 0, 0, 0}) + require.NoError(t, err) + _, err = conn.Write([]byte{'D', 'U', 'M', 'Y'}) + require.NoError(t, err) + + wait() + + err = p.strand("", func() error { + require.NotEqual(t, c.LastReceived, time.Time{}) + return nil + }) + require.NoError(t, err) + + // Push multiple messages, the first causing an error, and confirm that + // the remaining messages were unprocessed. + t.Logf("Pushing multiple messages, first one causing an error") + + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, reason, ErrErrorMessageHandler) + } + + _, err = conn.Write([]byte{4, 0, 0, 0, 'E', 'R', 'R', 0x00}) + require.NoError(t, err) + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 2): + t.Fatal("disconnect did not happen, would block") + } + + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + fmt.Println(reason) + t.Fatal("should not see this") + } + + _, err = conn.Write([]byte{4, 0, 0, 0, 'D', 'U', 'M', 'Y'}) + require.NoError(t, err) + + wait() + + conn, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c = <-cc + require.NotNil(t, c) + + disconnectCalled = make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, c.Addr(), addr) + require.Equal(t, reason, ErrDisconnectInvalidMessageLength) + require.Nil(t, p.pool[1]) + require.Nil(t, p.pool[2]) + } + + // Sending a length of < messagePrefixLength should cause a disconnect + t.Logf("Pushing message with too small length") + + _, err = conn.Write([]byte{messagePrefixLength - 1, 0, 0, 0, 'B', 'Y', 'T', 'E'}) + require.NoError(t, err) + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 2): + t.Fatal("disconnect did not happen, would block") + } + + // Sending a length > MaxIncomingMessageLength should cause a disconnect + conn, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c = <-cc + require.NotNil(t, c) + + t.Logf("Pushing message with too large length") + p.Config.MaxIncomingMessageLength = 4 + p.Config.MaxOutgoingMessageLength = 4 + disconnectCalled = make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, r DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, ErrDisconnectInvalidMessageLength, r) + } + + _, err = conn.Write([]byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E'}) + require.NoError(t, err) + + <-disconnectCalled + + err = p.strand("", func() error { + require.Nil(t, p.pool[1]) + require.Nil(t, p.pool[2]) + require.Nil(t, p.pool[3]) + return nil + }) + require.NoError(t, err) + + p.Shutdown() + <-q +} + +func TestConnectionWriteLoop(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.pool[1] + } + + disconnectErr := make(chan DisconnectReason, 1) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + fmt.Printf("DisconnectCallback called, address=%s reason=%v\n", addr, reason) + disconnectErr <- reason + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + wait() + + // Go's internals seem to be blocking on network read, write something to + // the connection to hopefully avoid this + _, err = conn.Write([]byte{0}) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + m := NewByteMessage(88) + // Send a successful message to b + err = p.SendMessage(c.Addr(), m) + require.NoError(t, err) + + var sr SendResult + select { + case sr = <-p.SendResults: + case <-time.After(time.Second * 2): + t.Fatal("No send results, would block") + } + + require.Len(t, p.SendResults, 0) + + require.Equal(t, sr.Message, m) + require.Equal(t, sr.Addr, c.Addr()) + require.Nil(t, sr.Error) + + err = p.strand("", func() error { + c = p.pool[c.ID] + return nil + }) + require.NoError(t, err) + require.NotNil(t, c) + + lastSent := c.LastSent + require.False(t, lastSent.IsZero()) + + // Send a failed message to c + sendByteMessage = failingSendByteMessage + + err = p.SendMessage(c.Addr(), m) + require.NoError(t, err) + + select { + case sr = <-p.SendResults: + case <-time.After(time.Second * 2): + t.Fatal("No send results, would block") + } + require.Equal(t, sr.Message, m) + require.Equal(t, sr.Addr, c.Addr()) + require.NotNil(t, sr.Error) + + reason := <-disconnectErr + require.NotNil(t, reason) + require.Equal(t, errors.New("send byte message failed"), reason) + + // c.LastSent should not have changed + require.Equal(t, lastSent, c.LastSent) + + p.Shutdown() + <-q +} + +func TestPoolSendMessageOK(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + cfg.WriteTimeout = time.Second + cfg.SendResultsSize = 1 + cfg.ConnectionWriteQueueSize = 8 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + _, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + m := NewByteMessage(88) + err = p.SendMessage(c.Addr(), m) + require.NoError(t, err) + + p.Shutdown() + <-q +} + +func TestPoolSendMessageWriteQueueFull(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + cfg.WriteTimeout = time.Second + cfg.SendResultsSize = 1 + cfg.ConnectionWriteQueueSize = 0 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + _, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + + // Send messages faster than can be processed to trigger ErrWriteQueueFull + attempts := 100 + gotErr := false + var once sync.Once + m := NewByteMessage(88) + addr := c.Addr() + var wg sync.WaitGroup + wg.Add(attempts) + for i := 0; i < attempts; i++ { + go func() { + defer wg.Done() + err := p.SendMessage(addr, m) + if err == ErrWriteQueueFull { + once.Do(func() { + gotErr = true + }) + } + }() + } + + wg.Wait() + + require.True(t, gotErr) + + p.Shutdown() + <-q +} + +func TestPoolBroadcastMessage(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + cfg.ConnectionWriteQueueSize = 1 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + ready := make(chan struct{}) + var i int + var counterLock sync.Mutex + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + counterLock.Lock() + defer counterLock.Unlock() + i++ + if i == 2 { + close(ready) + } + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn1, err := net.Dial("tcp", addr) + require.NoError(t, err) + + // Go's internals seem to be blocking on network read, write something to + // the connection to hopefully avoid this + _, err = conn1.Write([]byte{0}) + require.NoError(t, err) + + conn2, err := net.Dial("tcp", addr) + require.NoError(t, err) + + // Go's internals seem to be blocking on network read, write something to + // the connection to hopefully avoid this + _, err = conn2.Write([]byte{0}) + require.NoError(t, err) + + <-ready + + var addrs []string + err = p.strand("addresses", func() error { + for a := range p.addresses { + addrs = append(addrs, a) + } + return nil + }) + require.NoError(t, err) + require.NotEmpty(t, addrs) + + m := NewByteMessage(88) + n, err := p.BroadcastMessage(m, addrs) + require.NoError(t, err) + require.Equal(t, 2, len(n)) + + _, err = p.BroadcastMessage(m, []string{}) + require.Equal(t, ErrNoAddresses, err) + + _, err = p.BroadcastMessage(m, []string{"1.1.1.1"}) + require.Equal(t, ErrNoMatchingConnections, err) + + // Spam the connections with so much data that their write queue overflows, + // which will cause ErrNoReachableConnections + attempts := 1000 + gotErr := false + var once sync.Once + var wg sync.WaitGroup + wg.Add(attempts) + for i := 0; i < attempts; i++ { + go func() { + defer wg.Done() + _, err := p.BroadcastMessage(m, addrs) + if err == ErrNoReachableConnections { + once.Do(func() { + gotErr = true + }) + } + }() + } + + wg.Wait() + + require.True(t, gotErr) + + p.Shutdown() + <-q +} + +func TestPoolReceiveMessage(t *testing.T) { + wait() + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + RegisterMessage(ErrorPrefix, ErrorMessage{}) + VerifyMessages() + + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + c := NewConnection(p, 1, NewDummyConn(addr), 10, true) + + // Valid message received + b := make([]byte, 0) + b = append(b, BytePrefix[:]...) + b = append(b, byte(7)) + err = p.receiveMessage(c, b) + require.NoError(t, err) + require.False(t, c.LastReceived.IsZero()) + + // Invalid byte message received + b = []byte{1} + err = p.receiveMessage(c, b) + require.Error(t, err) + + // Valid message, but handler returns a DisconnectReason + b = make([]byte, 0) + b = append(b, ErrorPrefix[:]...) + err = p.receiveMessage(c, b) + require.Equal(t, err, ErrErrorMessageHandler) + + p.Shutdown() + <-q +} + +// Helpers + +func wait() { + time.Sleep(time.Millisecond * 150) +} + +type DummyAddr struct { + addr string +} + +func NewDummyAddr(addr string) *DummyAddr { + return &DummyAddr{ + addr: addr, + } +} + +func (da *DummyAddr) Network() string { + return da.addr +} + +func (da *DummyAddr) String() string { + return da.Network() +} + +type DummyConn struct { + net.Conn + addr string +} + +func NewDummyConn(addr string) net.Conn { + return &DummyConn{addr: addr} +} + +func (dc *DummyConn) RemoteAddr() net.Addr { + return NewDummyAddr(dc.addr) +} + +func (dc *DummyConn) LocalAddr() net.Addr { + return dc.RemoteAddr() +} + +func (dc *DummyConn) Close() error { + return nil +} + +func (dc *DummyConn) Read(b []byte) (int, error) { + return 0, nil +} + +func (dc *DummyConn) SetWriteDeadline(t time.Time) error { + return nil +} + +func (dc *DummyConn) Write(b []byte) (int, error) { + return len(b), nil +} + +type ReadErrorConn struct { + net.Conn + ReadDeadlineSet time.Time + sync.Mutex +} + +func NewReadErrorConn() net.Conn { + return &ReadErrorConn{} +} + +func (rec *ReadErrorConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (rec *ReadErrorConn) SetReadDeadline(t time.Time) error { + rec.Lock() + defer rec.Unlock() + rec.ReadDeadlineSet = t + return nil +} + +func (rec *ReadErrorConn) GetReadDeadlineSet() time.Time { + rec.Lock() + defer rec.Unlock() + return rec.ReadDeadlineSet +} + +func (rec *ReadErrorConn) Read(b []byte) (int, error) { + return 0, errors.New("failed") +} + +func (rec *ReadErrorConn) Close() error { + return nil +} + +type ReadDeadlineFailedConn struct { + net.Conn +} + +func (c *ReadDeadlineFailedConn) Read(b []byte) (int, error) { + return 0, nil +} + +func (c *ReadDeadlineFailedConn) SetReadDeadline(t time.Time) error { + return errors.New("Failed") +} + +func (c *ReadDeadlineFailedConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (c *ReadDeadlineFailedConn) Close() error { + return nil +} + +type readAlwaysConn struct { + net.Conn + stopReading chan struct{} +} + +func newReadAlwaysConn() *readAlwaysConn { + return &readAlwaysConn{ + stopReading: make(chan struct{}), + } +} + +func (c *readAlwaysConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (c *readAlwaysConn) Close() error { + return nil +} + +func (c *readAlwaysConn) Read(b []byte) (int, error) { + select { + case <-c.stopReading: + return 0, errors.New("done") + default: + } + + if len(b) == 0 { + return 0, nil + } + + b[0] = byte(88) + + return 1, nil +} + +func (c *readAlwaysConn) SetReadDeadline(t time.Time) error { + return nil +} + +func (c *readAlwaysConn) stop() { + close(c.stopReading) +} + +type readNothingConn struct { + net.Conn + stopReading chan struct{} +} + +func newReadNothingConn() *readNothingConn { + return &readNothingConn{ + stopReading: make(chan struct{}), + } +} + +func (c *readNothingConn) Read(b []byte) (int, error) { + select { + case <-c.stopReading: + return 0, errors.New("done") + default: + } + + time.Sleep(time.Millisecond * 2) + return 0, nil +} + +func (c *readNothingConn) SetReadDeadline(t time.Time) error { + return nil +} + +func (c *readNothingConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (c *readNothingConn) Close() error { + return nil +} + +func (c *readNothingConn) stop() { + close(c.stopReading) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder.go new file mode 100644 index 00000000..5c210d02 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder.go @@ -0,0 +1,162 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeIntroductionMessage computes the size of an encoded object of type IntroductionMessage +func encodeSizeIntroductionMessage(obj *IntroductionMessage) uint64 { + i0 := uint64(0) + + // obj.Mirror + i0 += 4 + + // obj.ListenPort + i0 += 2 + + // obj.ProtocolVersion + i0 += 4 + + // omitempty + if len(obj.Extra) != 0 { + + // obj.Extra + i0 += 4 + uint64(len(obj.Extra)) + + } + + return i0 +} + +// encodeIntroductionMessage encodes an object of type IntroductionMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeIntroductionMessage(obj *IntroductionMessage) ([]byte, error) { + n := encodeSizeIntroductionMessage(obj) + buf := make([]byte, n) + + if err := encodeIntroductionMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeIntroductionMessageToBuffer encodes an object of type IntroductionMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeIntroductionMessageToBuffer(buf []byte, obj *IntroductionMessage) error { + if uint64(len(buf)) < encodeSizeIntroductionMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Mirror + e.Uint32(obj.Mirror) + + // obj.ListenPort + e.Uint16(obj.ListenPort) + + // obj.ProtocolVersion + e.Int32(obj.ProtocolVersion) + + // omitempty + if len(obj.Extra) != 0 { + + // obj.Extra length check + if uint64(len(obj.Extra)) > math.MaxUint32 { + return errors.New("obj.Extra length exceeds math.MaxUint32") + } + + // obj.Extra length + e.Uint32(uint32(len(obj.Extra))) + + // obj.Extra copy + e.CopyBytes(obj.Extra) + + } + + return nil +} + +// decodeIntroductionMessage decodes an object of type IntroductionMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeIntroductionMessage(buf []byte, obj *IntroductionMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Mirror + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Mirror = i + } + + { + // obj.ListenPort + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.ListenPort = i + } + + { + // obj.ProtocolVersion + i, err := d.Int32() + if err != nil { + return 0, err + } + obj.ProtocolVersion = i + } + + { + // obj.Extra + + if len(d.Buffer) == 0 { + return uint64(len(buf) - len(d.Buffer)), nil + } + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Extra = make([]byte, length) + + copy(obj.Extra[:], d.Buffer[:length]) + d.Buffer = d.Buffer[length:] + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeIntroductionMessageExact decodes an object of type IntroductionMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeIntroductionMessageExact(buf []byte, obj *IntroductionMessage) error { + if n, err := decodeIntroductionMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder_test.go new file mode 100644 index 00000000..3612afdb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyIntroductionMessageForEncodeTest() *IntroductionMessage { + var obj IntroductionMessage + return &obj +} + +func newRandomIntroductionMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *IntroductionMessage { + var obj IntroductionMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenIntroductionMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *IntroductionMessage { + var obj IntroductionMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilIntroductionMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *IntroductionMessage { + var obj IntroductionMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderIntroductionMessage(t *testing.T, obj *IntroductionMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeIntroductionMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeIntroductionMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeIntroductionMessage(obj) + if err != nil { + t.Fatalf("encodeIntroductionMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeIntroductionMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeIntroductionMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeIntroductionMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeIntroductionMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 IntroductionMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 IntroductionMessage + if n, err := decodeIntroductionMessage(data2, &obj3); err != nil { + t.Fatalf("decodeIntroductionMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeIntroductionMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIntroductionMessage()") + } + + // Decode, excess buffer + var obj4 IntroductionMessage + n, err := decodeIntroductionMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeIntroductionMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeIntroductionMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeIntroductionMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIntroductionMessage()") + } + + // DecodeExact + var obj5 IntroductionMessage + if err := decodeIntroductionMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeIntroductionMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIntroductionMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeIntroductionMessage(data4, &obj3); err != nil { + t.Fatalf("decodeIntroductionMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeIntroductionMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderIntroductionMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *IntroductionMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyIntroductionMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomIntroductionMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenIntroductionMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilIntroductionMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderIntroductionMessage(t, tc.obj) + }) + } +} + +func decodeIntroductionMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj IntroductionMessage + if _, err := decodeIntroductionMessage(buf, &obj); err == nil { + t.Fatal("decodeIntroductionMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeIntroductionMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeIntroductionMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj IntroductionMessage + if err := decodeIntroductionMessageExact(buf, &obj); err == nil { + t.Fatal("decodeIntroductionMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeIntroductionMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderIntroductionMessageDecodeErrors(t *testing.T, k int, tag string, obj *IntroductionMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeIntroductionMessage(obj) + buf, err := encodeIntroductionMessage(obj) + if err != nil { + t.Fatalf("encodeIntroductionMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeIntroductionMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeIntroductionMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeIntroductionMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeIntroductionMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeIntroductionMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderIntroductionMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyIntroductionMessageForEncodeTest() + fullObj := newRandomIntroductionMessageForEncodeTest(t, rand) + testSkyencoderIntroductionMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderIntroductionMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder.go new file mode 100644 index 00000000..21ca8c30 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder.go @@ -0,0 +1,93 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeIPAddr computes the size of an encoded object of type IPAddr +func encodeSizeIPAddr(obj *IPAddr) uint64 { + i0 := uint64(0) + + // obj.IP + i0 += 4 + + // obj.Port + i0 += 2 + + return i0 +} + +// encodeIPAddr encodes an object of type IPAddr to a buffer allocated to the exact size +// required to encode the object. +func encodeIPAddr(obj *IPAddr) ([]byte, error) { + n := encodeSizeIPAddr(obj) + buf := make([]byte, n) + + if err := encodeIPAddrToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeIPAddrToBuffer encodes an object of type IPAddr to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeIPAddrToBuffer(buf []byte, obj *IPAddr) error { + if uint64(len(buf)) < encodeSizeIPAddr(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.IP + e.Uint32(obj.IP) + + // obj.Port + e.Uint16(obj.Port) + + return nil +} + +// decodeIPAddr decodes an object of type IPAddr from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeIPAddr(buf []byte, obj *IPAddr) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.IP + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.IP = i + } + + { + // obj.Port + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.Port = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeIPAddrExact decodes an object of type IPAddr from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeIPAddrExact(buf []byte, obj *IPAddr) error { + if n, err := decodeIPAddr(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder_test.go new file mode 100644 index 00000000..6988eac2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyIPAddrForEncodeTest() *IPAddr { + var obj IPAddr + return &obj +} + +func newRandomIPAddrForEncodeTest(t *testing.T, rand *mathrand.Rand) *IPAddr { + var obj IPAddr + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenIPAddrForEncodeTest(t *testing.T, rand *mathrand.Rand) *IPAddr { + var obj IPAddr + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilIPAddrForEncodeTest(t *testing.T, rand *mathrand.Rand) *IPAddr { + var obj IPAddr + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderIPAddr(t *testing.T, obj *IPAddr) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeIPAddr(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeIPAddr() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeIPAddr(obj) + if err != nil { + t.Fatalf("encodeIPAddr failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeIPAddr produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeIPAddr()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeIPAddrToBuffer(data3, obj); err != nil { + t.Fatalf("encodeIPAddrToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 IPAddr + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 IPAddr + if n, err := decodeIPAddr(data2, &obj3); err != nil { + t.Fatalf("decodeIPAddr failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeIPAddr bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIPAddr()") + } + + // Decode, excess buffer + var obj4 IPAddr + n, err := decodeIPAddr(data3, &obj4) + if err != nil { + t.Fatalf("decodeIPAddr failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeIPAddr bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeIPAddr bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIPAddr()") + } + + // DecodeExact + var obj5 IPAddr + if err := decodeIPAddrExact(data2, &obj5); err != nil { + t.Fatalf("decodeIPAddr failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIPAddr()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeIPAddr(data4, &obj3); err != nil { + t.Fatalf("decodeIPAddr failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeIPAddr bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderIPAddr(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *IPAddr + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyIPAddrForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomIPAddrForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenIPAddrForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilIPAddrForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderIPAddr(t, tc.obj) + }) + } +} + +func decodeIPAddrExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj IPAddr + if _, err := decodeIPAddr(buf, &obj); err == nil { + t.Fatal("decodeIPAddr: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeIPAddr: expected error %q, got %q", expectedErr, err) + } +} + +func decodeIPAddrExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj IPAddr + if err := decodeIPAddrExact(buf, &obj); err == nil { + t.Fatal("decodeIPAddrExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeIPAddrExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderIPAddrDecodeErrors(t *testing.T, k int, tag string, obj *IPAddr) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeIPAddr(obj) + buf, err := encodeIPAddr(obj) + if err != nil { + t.Fatalf("encodeIPAddr failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeIPAddrExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeIPAddrExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeIPAddrExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeIPAddrExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeIPAddrExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderIPAddrDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyIPAddrForEncodeTest() + fullObj := newRandomIPAddrForEncodeTest(t, rand) + testSkyencoderIPAddrDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderIPAddrDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages.go new file mode 100644 index 00000000..77bde5b3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages.go @@ -0,0 +1,1390 @@ +package daemon + +import ( + "encoding/binary" + "errors" + "fmt" + "net" + "strings" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/iputil" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +// Message represent a packet to be serialized over the network by +// the gnet encoder. +// They must implement the gnet.Message interface +// All concurrent daemon write operations are synchronized by the daemon's +// DaemonLoop(). +// Message do this by caching the gnet.MessageContext received in Handle() +// and placing itself on the messageEvent channel. +// When the message is retrieved from the messageEvent channel, its process() +// method is called. + +// MessageConfig config contains a gnet.Message's 4byte prefix and a +// reference interface +type MessageConfig struct { + Prefix gnet.MessagePrefix + Message interface{} +} + +// NewMessageConfig creates message config +func NewMessageConfig(prefix string, m interface{}) MessageConfig { + return MessageConfig{ + Message: m, + Prefix: gnet.MessagePrefixFromString(prefix), + } +} + +//go:generate skyencoder -unexported -struct IntroductionMessage +//go:generate skyencoder -unexported -struct GivePeersMessage +//go:generate skyencoder -unexported -struct GetBlocksMessage +//go:generate skyencoder -unexported -struct GiveBlocksMessage +//go:generate skyencoder -unexported -struct AnnounceBlocksMessage +//go:generate skyencoder -unexported -struct GetTxnsMessage +//go:generate skyencoder -unexported -struct GiveTxnsMessage +//go:generate skyencoder -unexported -struct AnnounceTxnsMessage +//go:generate skyencoder -unexported -struct DisconnectMessage +//go:generate skyencoder -unexported -struct IPAddr +//go:generate skyencoder -unexported -output-path . -package daemon -struct SignedBlock github.com/SkycoinProject/skycoin/src/coin +//go:generate skyencoder -unexported -output-path . -package daemon -struct Transaction github.com/SkycoinProject/skycoin/src/coin + +// Creates and populates the message configs +func getMessageConfigs() []MessageConfig { + return []MessageConfig{ + NewMessageConfig("INTR", IntroductionMessage{}), + NewMessageConfig("GETP", GetPeersMessage{}), + NewMessageConfig("GIVP", GivePeersMessage{}), + NewMessageConfig("PING", PingMessage{}), + NewMessageConfig("PONG", PongMessage{}), + NewMessageConfig("GETB", GetBlocksMessage{}), + NewMessageConfig("GIVB", GiveBlocksMessage{}), + NewMessageConfig("ANNB", AnnounceBlocksMessage{}), + NewMessageConfig("GETT", GetTxnsMessage{}), + NewMessageConfig("GIVT", GiveTxnsMessage{}), + NewMessageConfig("ANNT", AnnounceTxnsMessage{}), + NewMessageConfig("DISC", DisconnectMessage{}), + } +} + +// MessagesConfig slice of MessageConfig +type MessagesConfig struct { + // Message ID prefices + Messages []MessageConfig +} + +// NewMessagesConfig creates messages config +func NewMessagesConfig() MessagesConfig { + return MessagesConfig{ + Messages: getMessageConfigs(), + } +} + +// Register registers our Messages with gnet +func (msc *MessagesConfig) Register() { + for _, mc := range msc.Messages { + gnet.RegisterMessage(mc.Prefix, mc.Message) + } + gnet.VerifyMessages() +} + +// Messages messages struct +type Messages struct { + Config MessagesConfig +} + +// NewMessages creates Messages +func NewMessages(c MessagesConfig) *Messages { + return &Messages{ + Config: c, + } +} + +// IPAddr compact representation of IP:Port +type IPAddr struct { + IP uint32 + Port uint16 +} + +// NewIPAddr returns an IPAddr from an ip:port string. +func NewIPAddr(addr string) (ipaddr IPAddr, err error) { + ips, port, err := iputil.SplitAddr(addr) + if err != nil { + return + } + + // TODO -- support ipv6 + ipb := net.ParseIP(ips).To4() + if ipb == nil { + err = errors.New("Ignoring IPv6 address") + return + } + + ip := binary.BigEndian.Uint32(ipb) + ipaddr.IP = ip + ipaddr.Port = port + return +} + +// String returns IPAddr as "ip:port" +func (ipa IPAddr) String() string { + ipb := make([]byte, 4) + binary.BigEndian.PutUint32(ipb, ipa.IP) + return fmt.Sprintf("%s:%d", net.IP(ipb).String(), ipa.Port) +} + +// asyncMessage messages that perform an action when received must implement this interface. +// process() is called after the message is pulled off of messageEvent channel. +// Messages should place themselves on the messageEvent channel in their +// Handle() method required by gnet. +type asyncMessage interface { + process(d daemoner) +} + +// GetPeersMessage sent to request peers +type GetPeersMessage struct { + addr string `enc:"-"` +} + +// NewGetPeersMessage creates GetPeersMessage +func NewGetPeersMessage() *GetPeersMessage { + return &GetPeersMessage{} +} + +// EncodeSize implements gnet.Serializer +func (gpm *GetPeersMessage) EncodeSize() uint64 { + return 0 +} + +// Encode implements gnet.Serializer +func (gpm *GetPeersMessage) Encode(buf []byte) error { + return nil +} + +// Decode implements gnet.Serializer +func (gpm *GetPeersMessage) Decode(buf []byte) (uint64, error) { + return 0, nil +} + +// Handle handles message +func (gpm *GetPeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gpm.addr = mc.Addr + return daemon.(daemoner).recordMessageEvent(gpm, mc) +} + +// process Notifies the Pex instance that peers were requested +func (gpm *GetPeersMessage) process(d daemoner) { + if d.pexConfig().Disabled { + return + } + + if err := d.sendRandomPeers(gpm.addr); err != nil { + logger.WithField("addr", gpm.addr).WithError(err).Error("SendRandomPeers failed") + } +} + +// GivePeersMessage sent in response to GetPeersMessage +type GivePeersMessage struct { + Peers []IPAddr `enc:",maxlen=512"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGivePeersMessage []*pex.Peer is converted to []IPAddr for binary transmission +// If the size of the message would exceed maxMsgLength, the IPAddr slice is truncated. +func NewGivePeersMessage(peers []pex.Peer, maxMsgLength uint64) *GivePeersMessage { + if len(peers) > 512 { + peers = peers[:512] + } + + ipaddrs := make([]IPAddr, 0, len(peers)) + for _, ps := range peers { + ipaddr, err := NewIPAddr(ps.Addr) + if err != nil { + logger.WithError(err).WithField("addr", ps.Addr).Warning("GivePeersMessage skipping invalid address") + continue + } + ipaddrs = append(ipaddrs, ipaddr) + } + + m := &GivePeersMessage{ + Peers: ipaddrs, + } + truncateGivePeersMessage(m, maxMsgLength) + return m +} + +// truncateGivePeersMessage truncates the blocks in GivePeersMessage to fit inside of MaxOutgoingMessageLength +func truncateGivePeersMessage(m *GivePeersMessage, maxMsgLength uint64) { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return + } + + // Measure the size of an empty message + var mm GivePeersMessage + size := mm.EncodeSize() + + // Measure the size of the peers, advancing the slice index until it reaches capacity + index := -1 + for i, ip := range m.Peers { + x := encodeSizeIPAddr(&ip) + if size+x > maxMsgLength { + break + } + size += x + index = i + } + + m.Peers = m.Peers[:index+1] + + if len(m.Peers) == 0 { + logger.Critical().Error("truncateGivePeersMessage truncated peers to an empty slice") + } +} + +// EncodeSize implements gnet.Serializer +func (gpm *GivePeersMessage) EncodeSize() uint64 { + return encodeSizeGivePeersMessage(gpm) +} + +// Encode implements gnet.Serializer +func (gpm *GivePeersMessage) Encode(buf []byte) error { + return encodeGivePeersMessageToBuffer(buf, gpm) +} + +// Decode implements gnet.Serializer +func (gpm *GivePeersMessage) Decode(buf []byte) (uint64, error) { + return decodeGivePeersMessage(buf, gpm) +} + +// GetPeers is required by the pex.GivePeersMessage interface. +// It returns the peers contained in the message as an array of "ip:port" +// strings. +func (gpm *GivePeersMessage) GetPeers() []string { + peers := make([]string, len(gpm.Peers)) + for i, ipaddr := range gpm.Peers { + peers[i] = ipaddr.String() + } + return peers +} + +// Handle handle message +func (gpm *GivePeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gpm.c = mc + return daemon.(daemoner).recordMessageEvent(gpm, mc) +} + +// process Notifies the Pex instance that peers were received +func (gpm *GivePeersMessage) process(d daemoner) { + if d.pexConfig().Disabled { + return + } + + peers := gpm.GetPeers() + + if len(peers) == 0 { + return + } + + // Cap the number of peers printed in the log to prevent log spam abuse + peersToFmt := peers + if len(peersToFmt) > 30 { + peersToFmt = peersToFmt[:30] + } + peersStr := strings.Join(peersToFmt, ", ") + if len(peers) != len(peersToFmt) { + peersStr += fmt.Sprintf(" and %d more", len(peers)-len(peersToFmt)) + } + + logger.WithFields(logrus.Fields{ + "addr": gpm.c.Addr, + "gnetID": gpm.c.ConnID, + "peers": peersStr, + "count": len(peers), + }).Debug("Received peers via PEX") + + d.addPeers(peers) +} + +// IntroductionMessage is sent on first connect by both parties +type IntroductionMessage struct { + c *gnet.MessageContext `enc:"-"` + UserAgent useragent.Data `enc:"-"` + UnconfirmedVerifyTxn params.VerifyTxn `enc:"-"` + GenesisHash cipher.SHA256 `enc:"-"` + + // Mirror is a random value generated on client startup that is used to identify self-connections + Mirror uint32 + // ListenPort is the port that this client is listening on + ListenPort uint16 + // Protocol version + ProtocolVersion int32 + + // Extra is extra bytes added to the struct to accommodate multiple versions of this packet. + // Currently it contains the blockchain pubkey and user agent but will accept a client that does not provide it. + // If any of this data is provided, it must include a valid blockchain pubkey and a valid user agent string (maxlen=256). + // Contents of extra: + // ExtraByte uint32 // length prefix of []byte + // Pubkey cipher.Pubkey // blockchain pubkey + // BurnFactor uint32 // burn factor for announced txns + // MaxTxnSize uint32 // max txn size for announced txns + // MaxDropletPrecision uint8 // maximum number of decimal places for announced txns + // UserAgent string `enc:",maxlen=256"` + // GenesisHash cipher.SHA256 // genesis block hash + Extra []byte `enc:",omitempty"` +} + +// NewIntroductionMessage creates introduction message +func NewIntroductionMessage(mirror uint32, version int32, port uint16, pubkey cipher.PubKey, userAgent string, verifyParams params.VerifyTxn, genesisHash cipher.SHA256) *IntroductionMessage { + return &IntroductionMessage{ + Mirror: mirror, + ProtocolVersion: version, + ListenPort: port, + Extra: newIntroductionMessageExtra(pubkey, userAgent, verifyParams, genesisHash), + } +} + +func newIntroductionMessageExtra(pubkey cipher.PubKey, userAgent string, verifyParams params.VerifyTxn, genesisHash cipher.SHA256) []byte { + if len(userAgent) > useragent.MaxLen { + logger.WithFields(logrus.Fields{ + "userAgent": userAgent, + "maxLen": useragent.MaxLen, + }).Panic("user agent exceeds max len") + } + if userAgent == "" { + logger.Panic("user agent is required") + } + useragent.MustParse(userAgent) + + if err := verifyParams.Validate(); err != nil { + logger.Panic(err) + } + + userAgentSerialized := encoder.SerializeString(userAgent) + verifyParamsSerialized := encoder.Serialize(verifyParams) + + extra := make([]byte, len(pubkey)+len(userAgentSerialized)+len(verifyParamsSerialized)+len(genesisHash)) + + copy(extra[:len(pubkey)], pubkey[:]) + i := len(pubkey) + copy(extra[i:], verifyParamsSerialized) + i += len(verifyParamsSerialized) + copy(extra[i:], userAgentSerialized) + i += len(userAgentSerialized) + copy(extra[i:i+len(genesisHash)], genesisHash[:]) + + return extra +} + +// EncodeSize implements gnet.Serializer +func (intro *IntroductionMessage) EncodeSize() uint64 { + return encodeSizeIntroductionMessage(intro) +} + +// Encode implements gnet.Serializer +func (intro *IntroductionMessage) Encode(buf []byte) error { + return encodeIntroductionMessageToBuffer(buf, intro) +} + +// Decode implements gnet.Serializer +func (intro *IntroductionMessage) Decode(buf []byte) (uint64, error) { + return decodeIntroductionMessage(buf, intro) +} + +// Handle records message event in daemon +func (intro *IntroductionMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + intro.c = mc + return daemon.(daemoner).recordMessageEvent(intro, mc) +} + +// process an event queued by Handle() +func (intro *IntroductionMessage) process(d daemoner) { + addr := intro.c.Addr + + fields := logrus.Fields{ + "addr": addr, + "gnetID": intro.c.ConnID, + "listenPort": intro.ListenPort, + } + + logger.WithFields(fields).Debug("IntroductionMessage.process") + + if err := intro.Verify(d.DaemonConfig(), logrus.Fields{ + "addr": addr, + "gnetID": intro.c.ConnID, + }); err != nil { + if err := d.Disconnect(addr, err); err != nil { + logger.WithError(err).WithFields(fields).Warning("Disconnect") + } + return + } + + if _, err := d.connectionIntroduced(addr, intro.c.ConnID, intro); err != nil { + logger.WithError(err).WithFields(fields).Warning("connectionIntroduced failed") + var reason gnet.DisconnectReason + switch err { + // It is hypothetically possible that a message would get processed after + // a disconnect event for a given connection. + // In this case, drop the packet. + // Do not perform a disconnect, since this would operate on the new connection. + // This should be prevented by an earlier check in daemon.onMessageEvent() + case ErrConnectionGnetIDMismatch, ErrConnectionStateNotConnected, ErrConnectionAlreadyIntroduced: + logger.Critical().WithError(err).WithFields(fields).Warning("IntroductionMessage.process connection state out of order") + return + case ErrConnectionNotExist: + return + case ErrConnectionIPMirrorExists: + reason = ErrDisconnectConnectedTwice + case pex.ErrPeerlistFull: + reason = ErrDisconnectPeerlistFull + // Send more peers before disconnecting + logger.WithFields(fields).Debug("Sending peers before disconnecting due to peer list full") + if err := d.sendRandomPeers(addr); err != nil { + logger.WithError(err).WithFields(fields).Warning("sendRandomPeers failed") + } + default: + reason = ErrDisconnectUnexpectedError + } + + if err := d.Disconnect(addr, reason); err != nil { + logger.WithError(err).WithFields(fields).Warning("Disconnect") + } + + return + } + + // Request blocks immediately after they're confirmed + if err := d.requestBlocksFromAddr(addr); err != nil { + logger.WithError(err).WithFields(fields).Warning("requestBlocksFromAddr") + } else { + logger.WithFields(fields).Debug("Requested blocks") + } + + // Announce unconfirmed txns + if err := d.announceAllValidTxns(); err != nil { + logger.WithError(err).Warning("announceAllValidTxns failed") + } +} + +// Verify checks if the introduction message is valid returning the appropriate error +func (intro *IntroductionMessage) Verify(dc DaemonConfig, logFields logrus.Fields) error { + // Disconnect if this is a self connection (we have the same mirror value) + if intro.Mirror == dc.Mirror { + logger.WithFields(logFields).WithField("mirror", intro.Mirror).Info("Remote mirror value matches ours") + return ErrDisconnectSelf + } + + // Disconnect if peer version is not within the supported range + if intro.ProtocolVersion < dc.MinProtocolVersion { + logger.WithFields(logFields).WithFields(logrus.Fields{ + "protocolVersion": intro.ProtocolVersion, + "minProtocolVersion": dc.MinProtocolVersion, + }).Info("protocol version below minimum supported protocol version") + return ErrDisconnectVersionNotSupported + } + + logger.WithFields(logFields).WithField("protocolVersion", intro.ProtocolVersion).Debug("Peer protocol version accepted") + + // v24 does not send blockchain pubkey or user agent + // v25 sends blockchain pubkey and user agent + // v24 and v25 check the blockchain pubkey and user agent, would accept message with no Pubkey and user agent + // v26 would check the blockchain pubkey and reject if not matched or not provided, and parses a user agent + // v26 adds genesis hash + // v27 would require and check the genesis hash + extraLen := len(intro.Extra) + if extraLen == 0 { + logger.WithFields(logFields).Warning("Blockchain pubkey is not provided") + return ErrDisconnectBlockchainPubkeyNotProvided + } + + var bcPubKey cipher.PubKey + if extraLen < len(bcPubKey) { + logger.WithFields(logFields).Warning("Extra data length does not meet the minimum requirement") + return ErrDisconnectInvalidExtraData + } + copy(bcPubKey[:], intro.Extra[:len(bcPubKey)]) + + if dc.BlockchainPubkey != bcPubKey { + logger.WithFields(logFields).WithFields(logrus.Fields{ + "pubkey": bcPubKey.Hex(), + "daemonPubkey": dc.BlockchainPubkey.Hex(), + }).Warning("Blockchain pubkey does not match") + return ErrDisconnectBlockchainPubkeyNotMatched + } + + i := len(bcPubKey) + if extraLen < i+9 { + logger.WithFields(logFields).Warning("IntroductionMessage transaction verification parameters could not be deserialized: not enough data") + return ErrDisconnectInvalidExtraData + } + if err := encoder.DeserializeRawExact(intro.Extra[i:i+9], &intro.UnconfirmedVerifyTxn); err != nil { + // This should not occur due to the previous length check + logger.Critical().WithError(err).WithFields(logFields).Warning("unconfirmedVerifyTxn params could not be deserialized") + return ErrDisconnectInvalidExtraData + } + i += 9 + + if err := intro.UnconfirmedVerifyTxn.Validate(); err != nil { + logger.WithError(err).WithFields(logFields).WithFields(logrus.Fields{ + "burnFactor": intro.UnconfirmedVerifyTxn.BurnFactor, + "maxTransactionSize": intro.UnconfirmedVerifyTxn.MaxTransactionSize, + "maxDropletPrecision": intro.UnconfirmedVerifyTxn.MaxDropletPrecision, + }).Warning("Invalid unconfirmedVerifyTxn params") + switch err { + case params.ErrInvalidBurnFactor: + return ErrDisconnectInvalidBurnFactor + case params.ErrInvalidMaxTransactionSize: + return ErrDisconnectInvalidMaxTransactionSize + case params.ErrInvalidMaxDropletPrecision: + return ErrDisconnectInvalidMaxDropletPrecision + default: + return ErrDisconnectUnexpectedError + } + } + + userAgentSerialized := intro.Extra[i:] + userAgent, userAgentLen, err := encoder.DeserializeString(userAgentSerialized, useragent.MaxLen) + if err != nil { + logger.WithError(err).WithFields(logFields).Warning("Extra data user agent string could not be deserialized") + return ErrDisconnectInvalidExtraData + } + + intro.UserAgent, err = useragent.Parse(useragent.Sanitize(userAgent)) + if err != nil { + logger.WithError(err).WithFields(logFields).WithField("userAgent", userAgent).Warning("User agent is invalid") + return ErrDisconnectInvalidUserAgent + } + i += int(userAgentLen) + + remainingLen := extraLen - i + if remainingLen > 0 && remainingLen < len(intro.GenesisHash) { + logger.WithFields(logFields).Warning("Extra data genesis hash could not be deserialized: not enough data") + return ErrDisconnectInvalidExtraData + } + copy(intro.GenesisHash[:], intro.Extra[i:]) + + return nil +} + +// PingMessage Sent to keep a connection alive. A PongMessage is sent in reply. +type PingMessage struct { + c *gnet.MessageContext `enc:"-"` +} + +// EncodeSize implements gnet.Serializer +func (ping *PingMessage) EncodeSize() uint64 { + return 0 +} + +// Encode implements gnet.Serializer +func (ping *PingMessage) Encode(buf []byte) error { + return nil +} + +// Decode implements gnet.Serializer +func (ping *PingMessage) Decode(buf []byte) (uint64, error) { + return 0, nil +} + +// Handle implements the Messager interface +func (ping *PingMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + ping.c = mc + return daemon.(daemoner).recordMessageEvent(ping, mc) +} + +// process Sends a PongMessage to the sender of PingMessage +func (ping *PingMessage) process(d daemoner) { + fields := logrus.Fields{ + "addr": ping.c.Addr, + "gnetID": ping.c.ConnID, + } + + if d.DaemonConfig().LogPings { + logger.WithFields(fields).Debug("Replying to ping") + } + if err := d.sendMessage(ping.c.Addr, &PongMessage{}); err != nil { + logger.WithFields(fields).WithError(err).Error("Send PongMessage failed") + } +} + +// PongMessage Sent in reply to a PingMessage. No action is taken when this is received. +type PongMessage struct { +} + +// EncodeSize implements gnet.Serializer +func (pong *PongMessage) EncodeSize() uint64 { + return 0 +} + +// Encode implements gnet.Serializer +func (pong *PongMessage) Encode(buf []byte) error { + return nil +} + +// Decode implements gnet.Serializer +func (pong *PongMessage) Decode(buf []byte) (uint64, error) { + return 0, nil +} + +// Handle handles message +func (pong *PongMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + // There is nothing to do; gnet updates Connection.LastMessage internally + // when this is received + if daemon.(daemoner).DaemonConfig().LogPings { + logger.WithFields(logrus.Fields{ + "addr": mc.Addr, + "gnetID": mc.ConnID, + }).Debug("Received pong") + } + return nil +} + +// DisconnectMessage sent to a peer before disconnecting, indicating the reason for disconnect +type DisconnectMessage struct { + c *gnet.MessageContext `enc:"-"` + reason gnet.DisconnectReason `enc:"-"` + + // Error code + ReasonCode uint16 + + // Reserved for future use + Reserved []byte +} + +// NewDisconnectMessage creates message sent to reject previously received message +func NewDisconnectMessage(reason gnet.DisconnectReason) *DisconnectMessage { + return &DisconnectMessage{ + reason: reason, + ReasonCode: DisconnectReasonToCode(reason), + Reserved: nil, + } +} + +// EncodeSize implements gnet.Serializer +func (dm *DisconnectMessage) EncodeSize() uint64 { + return encodeSizeDisconnectMessage(dm) +} + +// Encode implements gnet.Serializer +func (dm *DisconnectMessage) Encode(buf []byte) error { + return encodeDisconnectMessageToBuffer(buf, dm) +} + +// Decode implements gnet.Serializer +func (dm *DisconnectMessage) Decode(buf []byte) (uint64, error) { + return decodeDisconnectMessage(buf, dm) +} + +// Handle an event queued by Handle() +func (dm *DisconnectMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + dm.c = mc + return daemon.(daemoner).recordMessageEvent(dm, mc) +} + +// process disconnect message by reflexively disconnecting +func (dm *DisconnectMessage) process(d daemoner) { + logger.WithFields(logrus.Fields{ + "addr": dm.c.Addr, + "gnetID": dm.c.ConnID, + "code": dm.ReasonCode, + "reason": DisconnectCodeToReason(dm.ReasonCode), + }).Infof("DisconnectMessage received") + + if err := d.disconnectNow(dm.c.Addr, ErrDisconnectReceivedDisconnect); err != nil { + logger.WithError(err).WithField("addr", dm.c.Addr).Warning("disconnectNow") + } +} + +// GetBlocksMessage sent to request blocks since LastBlock +type GetBlocksMessage struct { + LastBlock uint64 + RequestedBlocks uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewGetBlocksMessage creates GetBlocksMessage +func NewGetBlocksMessage(lastBlock, requestedBlocks uint64) *GetBlocksMessage { + return &GetBlocksMessage{ + LastBlock: lastBlock, + RequestedBlocks: requestedBlocks, + } +} + +// EncodeSize implements gnet.Serializer +func (gbm *GetBlocksMessage) EncodeSize() uint64 { + return encodeSizeGetBlocksMessage(gbm) +} + +// Encode implements gnet.Serializer +func (gbm *GetBlocksMessage) Encode(buf []byte) error { + return encodeGetBlocksMessageToBuffer(buf, gbm) +} + +// Decode implements gnet.Serializer +func (gbm *GetBlocksMessage) Decode(buf []byte) (uint64, error) { + return decodeGetBlocksMessage(buf, gbm) +} + +// Handle handles message +func (gbm *GetBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gbm.c = mc + return daemon.(daemoner).recordMessageEvent(gbm, mc) +} + +// process should send number to be requested, with request +func (gbm *GetBlocksMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": gbm.c.Addr, + "gnetID": gbm.c.ConnID, + } + + // Record this as this peer's highest block + d.recordPeerHeight(gbm.c.Addr, gbm.c.ConnID, gbm.LastBlock) + + // Cap the number of requested blocks (TODO - necessary since we have size limits enforced later?) + requestedBlocks := gbm.RequestedBlocks + if requestedBlocks > dc.MaxGetBlocksResponseCount { + logger.WithFields(logrus.Fields{ + "requestedBlocks": requestedBlocks, + "maxRequestedBlocks": dc.MaxGetBlocksResponseCount, + }).WithFields(fields).Debug("GetBlocksMessage.RequestedBlocks value exceeds configured limit, reducing") + requestedBlocks = dc.MaxGetBlocksResponseCount + } + + // Fetch and return signed blocks since LastBlock + blocks, err := d.getSignedBlocksSince(gbm.LastBlock, requestedBlocks) + if err != nil { + logger.WithFields(fields).WithError(err).Error("getSignedBlocksSince failed") + return + } + + if len(blocks) == 0 { + return + } + + logger.WithFields(fields).Debugf("GetBlocksMessage: replying with %d blocks after block %d", len(blocks), gbm.LastBlock) + + m := NewGiveBlocksMessage(blocks, dc.MaxOutgoingMessageLength) + if len(m.Blocks) != len(blocks) { + logger.WithField("startBlockSeq", blocks[0].Head.BkSeq).WithFields(fields).Warningf("NewGiveBlocksMessage truncated %d blocks to %d blocks", len(blocks), len(m.Blocks)) + } + + if err := d.sendMessage(gbm.c.Addr, m); err != nil { + logger.WithFields(fields).WithError(err).Error("Send GiveBlocksMessage failed") + } +} + +// GiveBlocksMessage sent in response to GetBlocksMessage, or unsolicited +type GiveBlocksMessage struct { + Blocks []coin.SignedBlock `enc:",maxlen=128"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveBlocksMessage creates GiveBlocksMessage. +// If the size of message would exceed maxMsgLength, the block slice is truncated. +func NewGiveBlocksMessage(blocks []coin.SignedBlock, maxMsgLength uint64) *GiveBlocksMessage { + if len(blocks) > 128 { + blocks = blocks[:128] + } + m := &GiveBlocksMessage{ + Blocks: blocks, + } + truncateGiveBlocksMessage(m, maxMsgLength) + return m +} + +// truncateGiveBlocksMessage truncates the blocks in GiveBlocksMessage to fit inside of MaxOutgoingMessageLength +func truncateGiveBlocksMessage(m *GiveBlocksMessage, maxMsgLength uint64) { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return + } + + // Measure the size of an empty message + var mm GiveBlocksMessage + size := mm.EncodeSize() + + // Measure the size of the blocks, advancing the slice index until it reaches capacity + index := -1 + for i, b := range m.Blocks { + x := encodeSizeSignedBlock(&b) + if size+x > maxMsgLength { + break + } + size += x + index = i + } + + m.Blocks = m.Blocks[:index+1] + + if len(m.Blocks) == 0 { + logger.Critical().Error("truncateGiveBlocksMessage truncated blocks to an empty slice") + } +} + +// EncodeSize implements gnet.Serializer +func (m *GiveBlocksMessage) EncodeSize() uint64 { + return encodeSizeGiveBlocksMessage(m) +} + +// Encode implements gnet.Serializer +func (m *GiveBlocksMessage) Encode(buf []byte) error { + return encodeGiveBlocksMessageToBuffer(buf, m) +} + +// Decode implements gnet.Serializer +func (m *GiveBlocksMessage) Decode(buf []byte) (uint64, error) { + return decodeGiveBlocksMessage(buf, m) +} + +// Handle handle message +func (m *GiveBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + m.c = mc + return daemon.(daemoner).recordMessageEvent(m, mc) +} + +// process process message +func (m *GiveBlocksMessage) process(d daemoner) { + if d.DaemonConfig().DisableNetworking { + logger.Critical().Info("Visor disabled, ignoring GiveBlocksMessage") + return + } + + // These DB queries are not performed in a transaction for performance reasons. + // It is not necessary that the blocks be executed together in a single transaction. + + processed := 0 + maxSeq, ok, err := d.headBkSeq() + if err != nil { + logger.WithError(err).Error("d.headBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found, cannot execute blocks") + return + } + + for _, b := range m.Blocks { + // To minimize waste when receiving multiple responses from peers + // we only break out of the loop if the block itself is invalid. + // E.g. if we request 20 blocks since 0 from 2 peers, and one peer + // replies with 15 and the other 20, if we did not do this check and + // the reply with 15 was received first, we would toss the one with 20 + // even though we could process it at the time. + if b.Seq() <= maxSeq { + continue + } + + err := d.executeSignedBlock(b) + if err == nil { + logger.Critical().WithField("seq", b.Block.Head.BkSeq).Info("Added new block") + processed++ + } else { + logger.Critical().WithError(err).WithField("seq", b.Block.Head.BkSeq).Error("Failed to execute received block") + // Blocks must be received in order, so if one fails its assumed + // the rest are failing + break + } + } + if processed == 0 { + return + } + + headBkSeq, ok, err := d.headBkSeq() + if err != nil { + logger.WithError(err).Error("d.headBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found after executing blocks, will not announce blocks") + return + } + + if headBkSeq < maxSeq { + logger.Critical().Warning("HeadBkSeq decreased after executing blocks") + } else if headBkSeq-maxSeq != uint64(processed) { + logger.Critical().Warning("HeadBkSeq increased by %d but we processed %s blocks", headBkSeq-maxSeq, processed) + } + + // Announce our new blocks to peers + abm := NewAnnounceBlocksMessage(headBkSeq) + if _, err := d.broadcastMessage(abm); err != nil { + logger.WithError(err).Warning("Broadcast AnnounceBlocksMessage failed") + } + + // Request more blocks + gbm := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().GetBlocksRequestCount) + if _, err := d.broadcastMessage(gbm); err != nil { + logger.WithError(err).Warning("Broadcast GetBlocksMessage failed") + } +} + +// AnnounceBlocksMessage tells a peer our highest known BkSeq. The receiving peer can choose +// to send GetBlocksMessage in response +type AnnounceBlocksMessage struct { + MaxBkSeq uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceBlocksMessage creates message +func NewAnnounceBlocksMessage(seq uint64) *AnnounceBlocksMessage { + return &AnnounceBlocksMessage{ + MaxBkSeq: seq, + } +} + +// EncodeSize implements gnet.Serializer +func (abm *AnnounceBlocksMessage) EncodeSize() uint64 { + return encodeSizeAnnounceBlocksMessage(abm) +} + +// Encode implements gnet.Serializer +func (abm *AnnounceBlocksMessage) Encode(buf []byte) error { + return encodeAnnounceBlocksMessageToBuffer(buf, abm) +} + +// Decode implements gnet.Serializer +func (abm *AnnounceBlocksMessage) Decode(buf []byte) (uint64, error) { + return decodeAnnounceBlocksMessage(buf, abm) +} + +// Handle handles message +func (abm *AnnounceBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + abm.c = mc + return daemon.(daemoner).recordMessageEvent(abm, mc) +} + +// process process message +func (abm *AnnounceBlocksMessage) process(d daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": abm.c.Addr, + "gnetID": abm.c.ConnID, + } + + headBkSeq, ok, err := d.headBkSeq() + if err != nil { + logger.WithError(err).Error("AnnounceBlocksMessage d.headBkSeq failed") + return + } + if !ok { + logger.Error("AnnounceBlocksMessage no head block, cannot process AnnounceBlocksMessage") + return + } + + if headBkSeq >= abm.MaxBkSeq { + return + } + + // TODO: Should this be block get request for current sequence? + // If client is not caught up, won't attempt to get block + m := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().GetBlocksRequestCount) + if err := d.sendMessage(abm.c.Addr, m); err != nil { + logger.WithError(err).WithFields(fields).Error("Send GetBlocksMessage") + } +} + +// SendingTxnsMessage send transaction message interface +type SendingTxnsMessage interface { + GetFiltered() []cipher.SHA256 +} + +// AnnounceTxnsMessage tells a peer that we have these transactions +type AnnounceTxnsMessage struct { + Transactions []cipher.SHA256 `enc:",maxlen=256"` + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceTxnsMessage creates announce txns message. +// If the size of the message would exceed maxMsgLength, the hashes slice is truncated. +func NewAnnounceTxnsMessage(txns []cipher.SHA256, maxMsgLength uint64) *AnnounceTxnsMessage { + if len(txns) > 256 { + txns = txns[:256] + } + m := &AnnounceTxnsMessage{ + Transactions: txns, + } + hashes := truncateAnnounceTxnsHashes(m, maxMsgLength) + m.Transactions = hashes + return m +} + +// truncateAnnounceTxnsHashes truncates the hashes in AnnounceTxnsMessage to fit inside of MaxOutgoingMessageLength +func truncateAnnounceTxnsHashes(m *AnnounceTxnsMessage, maxMsgLength uint64) []cipher.SHA256 { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return m.Transactions + } + + // Measure the size of an empty message + var mm AnnounceTxnsMessage + size := mm.EncodeSize() + + if maxMsgLength < size { + logger.Panic("maxMsgLength must be <= 4 + sizeof(empty AnnounceTxnsMessage)") + } + + maxMsgLength -= size + + hashes := truncateSHA256Slice(m.Transactions, maxMsgLength) + + if len(hashes) == 0 { + logger.Critical().Error("truncateAnnounceTxnsHashes truncated hashes to an empty slice") + } + + return hashes +} + +func truncateSHA256Slice(hashes []cipher.SHA256, maxLength uint64) []cipher.SHA256 { + if len(hashes) == 0 { + return hashes + } + + size := len(hashes[0]) + + n := maxLength / uint64(size) + + if n > uint64(len(hashes)) { + return hashes + } + + return hashes[:n] +} + +// EncodeSize implements gnet.Serializer +func (atm *AnnounceTxnsMessage) EncodeSize() uint64 { + return encodeSizeAnnounceTxnsMessage(atm) +} + +// Encode implements gnet.Serializer +func (atm *AnnounceTxnsMessage) Encode(buf []byte) error { + return encodeAnnounceTxnsMessageToBuffer(buf, atm) +} + +// Decode implements gnet.Serializer +func (atm *AnnounceTxnsMessage) Decode(buf []byte) (uint64, error) { + return decodeAnnounceTxnsMessage(buf, atm) +} + +// GetFiltered returns txns +func (atm *AnnounceTxnsMessage) GetFiltered() []cipher.SHA256 { + return atm.Transactions +} + +// Handle handle message +func (atm *AnnounceTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + atm.c = mc + return daemon.(daemoner).recordMessageEvent(atm, mc) +} + +// process process message +func (atm *AnnounceTxnsMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": atm.c.Addr, + "gnetID": atm.c.ConnID, + } + + unknown, err := d.filterKnownUnconfirmed(atm.Transactions) + if err != nil { + logger.WithError(err).Error("AnnounceTxnsMessage d.filterKnownUnconfirmed failed") + return + } + + if len(unknown) == 0 { + return + } + + m := NewGetTxnsMessage(unknown, dc.MaxOutgoingMessageLength) + if len(m.Transactions) != len(unknown) { + logger.Warningf("NewGetTxnsMessage truncated %d hashes to %d hashes", len(unknown), len(m.Transactions)) + } + + if err := d.sendMessage(atm.c.Addr, m); err != nil { + logger.WithFields(fields).WithError(err).Error("Send GetTxnsMessage failed") + } +} + +// GetTxnsMessage request transactions of given hash +type GetTxnsMessage struct { + Transactions []cipher.SHA256 `enc:",maxlen=256"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGetTxnsMessage creates GetTxnsMessage. +// If the size of the message would exceed maxMsgLength, the hashes slice is truncated. +func NewGetTxnsMessage(txns []cipher.SHA256, maxMsgLength uint64) *GetTxnsMessage { + if len(txns) > 256 { + txns = txns[:256] + } + m := &GetTxnsMessage{ + Transactions: txns, + } + hashes := truncateGetTxnsHashes(m, maxMsgLength) + m.Transactions = hashes + return m +} + +// truncateGetTxnsHashes truncates the hashes in GetTxnsMessage to fit inside of MaxOutgoingMessageLength +func truncateGetTxnsHashes(m *GetTxnsMessage, maxMsgLength uint64) []cipher.SHA256 { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return m.Transactions + } + + // Measure the size of an empty message + var mm GetTxnsMessage + size := mm.EncodeSize() + + if maxMsgLength < size { + logger.Panic("maxMsgLength must be <= 4 + sizeof(empty GetTxnsMessage)") + } + + maxMsgLength -= size + + hashes := truncateSHA256Slice(m.Transactions, maxMsgLength) + + if len(hashes) == 0 { + logger.Critical().Error("truncateGetTxnsHashes truncated hashes to an empty slice") + } + + return hashes +} + +// EncodeSize implements gnet.Serializer +func (gtm *GetTxnsMessage) EncodeSize() uint64 { + return encodeSizeGetTxnsMessage(gtm) +} + +// Encode implements gnet.Serializer +func (gtm *GetTxnsMessage) Encode(buf []byte) error { + return encodeGetTxnsMessageToBuffer(buf, gtm) +} + +// Decode implements gnet.Serializer +func (gtm *GetTxnsMessage) Decode(buf []byte) (uint64, error) { + return decodeGetTxnsMessage(buf, gtm) +} + +// Handle handle message +func (gtm *GetTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(daemoner).recordMessageEvent(gtm, mc) +} + +// process process message +func (gtm *GetTxnsMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": gtm.c.Addr, + "gnetID": gtm.c.ConnID, + } + + // Locate all txns from the unconfirmed pool + known, err := d.getKnownUnconfirmed(gtm.Transactions) + if err != nil { + logger.WithError(err).Error("GetTxnsMessage d.getKnownUnconfirmed failed") + return + } + if len(known) == 0 { + return + } + + // Reply to sender with GiveTxnsMessage + m := NewGiveTxnsMessage(known, dc.MaxOutgoingMessageLength) + if len(m.Transactions) != len(known) { + logger.Warningf("NewGiveTxnsMessage truncated %d hashes to %d hashes", len(known), len(m.Transactions)) + } + + if err := d.sendMessage(gtm.c.Addr, m); err != nil { + logger.WithError(err).WithFields(fields).Error("Send GiveTxnsMessage") + } +} + +// GiveTxnsMessage tells the transaction of given hashes +type GiveTxnsMessage struct { + Transactions []coin.Transaction `enc:",maxlen=256"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveTxnsMessage creates GiveTxnsMessage. +// If the size of the message would exceed maxMsgLength, the transactions slice is truncated. +func NewGiveTxnsMessage(txns []coin.Transaction, maxMsgLength uint64) *GiveTxnsMessage { + if len(txns) > 256 { + txns = txns[:256] + } + m := &GiveTxnsMessage{ + Transactions: txns, + } + truncateGiveTxnsMessage(m, maxMsgLength) + return m +} + +// truncateGiveTxnsMessage truncates the transactions in GiveTxnsMessage to fit inside of MaxOutgoingMessageLength +func truncateGiveTxnsMessage(m *GiveTxnsMessage, maxMsgLength uint64) { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return + } + + // Measure the size of an empty message + var mm GiveTxnsMessage + size := mm.EncodeSize() + + // Measure the size of the txns, advancing the slice index until it reaches capacity + index := -1 + for i, txn := range m.Transactions { + x := encodeSizeTransaction(&txn) + if size+x > maxMsgLength { + break + } + size += x + index = i + } + + m.Transactions = m.Transactions[:index+1] + + if len(m.Transactions) == 0 { + logger.Critical().Error("truncateGiveTxnsMessage truncated txns to an empty slice") + } +} + +// EncodeSize implements gnet.Serializer +func (gtm *GiveTxnsMessage) EncodeSize() uint64 { + return encodeSizeGiveTxnsMessage(gtm) +} + +// Encode implements gnet.Serializer +func (gtm *GiveTxnsMessage) Encode(buf []byte) error { + return encodeGiveTxnsMessageToBuffer(buf, gtm) +} + +// Decode implements gnet.Serializer +func (gtm *GiveTxnsMessage) Decode(buf []byte) (uint64, error) { + return decodeGiveTxnsMessage(buf, gtm) +} + +// GetFiltered returns transactions hashes +func (gtm *GiveTxnsMessage) GetFiltered() []cipher.SHA256 { + return coin.Transactions(gtm.Transactions).Hashes() +} + +// Handle handle message +func (gtm *GiveTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(daemoner).recordMessageEvent(gtm, mc) +} + +// process process message +func (gtm *GiveTxnsMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + hashes := make([]cipher.SHA256, 0, len(gtm.Transactions)) + // Update unconfirmed pool with these transactions + for _, txn := range gtm.Transactions { + // Only announce transactions that are new to us, so that peers can't spam relays + // It is not necessary to inject all of the transactions inside a database transaction, + // since each is independent + known, softErr, err := d.injectTransaction(txn) + if err != nil { + logger.WithError(err).WithField("txid", txn.Hash().Hex()).Warning("Failed to record transaction") + continue + } else if softErr != nil { + logger.WithError(softErr).WithField("txid", txn.Hash().Hex()).Warning("Transaction soft violation") + // Allow soft txn violations to rebroadcast + } else if known { + logger.WithField("txid", txn.Hash().Hex()).Debug("Duplicate transaction") + continue + } + + hashes = append(hashes, txn.Hash()) + } + + if len(hashes) == 0 { + return + } + + // Announce these transactions to peers + m := NewAnnounceTxnsMessage(hashes, dc.MaxOutgoingMessageLength) + if len(m.Transactions) != len(hashes) { + logger.Warningf("NewAnnounceTxnsMessage truncated %d hashes to %d hashes", len(hashes), len(m.Transactions)) + } + + if ids, err := d.broadcastMessage(m); err != nil { + logger.WithError(err).Warning("Broadcast AnnounceTxnsMessage failed") + } else { + logger.Debugf("Announced %d transactions to %d peers", len(hashes), len(ids)) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_benchmark_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_benchmark_test.go new file mode 100644 index 00000000..0ef54e79 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_benchmark_test.go @@ -0,0 +1,237 @@ +package daemon + +import ( + "testing" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +var getPeersMessageObj = GetPeersMessage{} + +func BenchmarkDeserializeRawGetPeersMessage(b *testing.B) { + byt := encoder.Serialize(getPeersMessageObj) + result := &GetPeersMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeGetPeersMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&getPeersMessageObj) + } +} + +var givePeersMessageObj = GivePeersMessage{ + Peers: []IPAddr{ + { + IP: 1234, + Port: 1234, + }, + { + IP: 5678, + Port: 5678, + }, + { + IP: 9876, + Port: 9876, + }, + }, +} + +func BenchmarkDeserializeRawGivePeersMessage(b *testing.B) { + byt := encoder.Serialize(givePeersMessageObj) + result := &GivePeersMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeGivePeersMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&givePeersMessageObj) + } +} + +var introPubKey = cipher.MustPubKeyFromHex("03cd7dfcd8c3452d1bb5d9d9e34dd95d6848cb9f66c2aad127b60578f4be7498f2") + +var introMessageObj = IntroductionMessage{ + Mirror: 1234, + ListenPort: 5678, + ProtocolVersion: 1, + Extra: introPubKey[:], +} + +func BenchmarkDeserializeRawIntroductionMessage(b *testing.B) { + byt := encoder.Serialize(introMessageObj) + result := &IntroductionMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeIntroductionMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&introMessageObj) + } +} + +var giveBlocksMessageObj = GiveBlocksMessage{ + Blocks: []coin.SignedBlock{ + { + Block: coin.Block{ + Body: coin.BlockBody{ + Transactions: []coin.Transaction{ + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + }, + }, + }, + }, + { + Block: coin.Block{ + Body: coin.BlockBody{ + Transactions: []coin.Transaction{ + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + }, + }, + }, + }, + { + Block: coin.Block{ + Body: coin.BlockBody{ + Transactions: []coin.Transaction{ + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + }, + }, + }, + }, + }, +} + +func BenchmarkDeserializeRawGiveBlocksMessage(b *testing.B) { + byt := encoder.Serialize(giveBlocksMessageObj) + result := &GiveBlocksMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeGiveBlocksMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&giveBlocksMessageObj) + } +} + +var announceTxnsMessageObj = AnnounceTxnsMessage{ + Transactions: make([]cipher.SHA256, 3), +} + +func BenchmarkDeserializeRawAnnounceTxnsMessage(b *testing.B) { + byt := encoder.Serialize(announceTxnsMessageObj) + result := &AnnounceTxnsMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeAnnounceTxnsMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&announceTxnsMessageObj) + } +} + +var giveTxnsMessageObj = GiveTxnsMessage{ + Transactions: []coin.Transaction{ + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + }, +} + +func BenchmarkDeserializeRawGiveTxnsMessage(b *testing.B) { + byt := encoder.Serialize(giveTxnsMessageObj) + result := &GiveTxnsMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeGiveTxnsMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&giveTxnsMessageObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_test.go new file mode 100644 index 00000000..168a3c10 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_test.go @@ -0,0 +1,1093 @@ +package daemon + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +func TestIntroductionMessage(t *testing.T) { + defer gnet.EraseMessages() + setupMsgEncoding() + + pubkey, _ := cipher.GenerateKeyPair() + pubkey2, _ := cipher.GenerateKeyPair() + genesisHash := testutil.RandSHA256(t) + + invalidGenesisHashExtra := newIntroductionMessageExtra(pubkey, "skycoin:0.26.0", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash) + invalidGenesisHashExtra = invalidGenesisHashExtra[:len(invalidGenesisHashExtra)-2] + + type daemonMockValue struct { + protocolVersion uint32 + minProtocolVersion uint32 + mirror uint32 + recordMessageEventErr error + pubkey cipher.PubKey + disconnectReason gnet.DisconnectReason + disconnectErr error + connectionIntroduced *connection + connectionIntroducedErr error + requestBlocksFromAddrErr error + announceAllTxnsErr error + sendRandomPeersErr error + } + + tt := []struct { + name string + addr string + gnetID uint64 + mockValue daemonMockValue + userAgent useragent.Data + unconfirmedVerifyTxn params.VerifyTxn + intro *IntroductionMessage + }{ + { + name: "INTR message without extra bytes", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + disconnectReason: ErrDisconnectBlockchainPubkeyNotProvided, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + }, + }, + { + name: "INTR message with pubkey but nothing else", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: pubkey[:], + }, + }, + { + name: "INTR message with pubkey but empty user agent", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidUserAgent, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(pubkey[:], []byte{5, 0, 0, 0, 32, 32, 32, 32, 1, 0, 0, 0, 0}...), + }, + }, + { + name: "INTR message with all extra fields", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:6000", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: newIntroductionMessageExtra(pubkey, "skycoin:0.26.0", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + { + name: "INTR message with all extra fields and additional data", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:6000", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(newIntroductionMessageExtra(pubkey, "skycoin:0.26.0", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), []byte("additional data")...), + }, + }, + { + name: "INTR message with extra fields but invalid genesis hash data", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: invalidGenesisHashExtra, + }, + }, + { + name: "INTR message with different pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectBlockchainPubkeyNotMatched, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: newIntroductionMessageExtra(pubkey2, "skycoin:0.26.0", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + { + name: "INTR message with invalid pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: []byte("invalid pubkey"), + }, + }, + { + name: "INTR message with pubkey, malformed user agent bytes", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(pubkey[:], []byte{5, 0, 0, 0, 32, 32, 32, 32, 1, 1, 2, 3}...), // 3 bytes for useragent len prefix is invalid + }, + }, + { + name: "INTR message with pubkey, invalid user agent after parsing", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidUserAgent, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(append(pubkey[:], []byte{5, 0, 0, 0, 32, 32, 32, 32, 1}...), encoder.SerializeString("skycoin:0241")...), + }, + }, + { + name: "INTR message with pubkey, invalid burn factor", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidBurnFactor, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(append(pubkey[:], []byte{1, 0, 0, 0, 32, 32, 32, 32, 1}...), encoder.SerializeString("skycoin:0.24.1")...), + }, + }, + { + name: "INTR message with pubkey, invalid max transaction size", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidMaxTransactionSize, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(append(pubkey[:], []byte{2, 0, 0, 0, 1, 0, 0, 0, 1}...), encoder.SerializeString("skycoin:0.24.1")...), + }, + }, + { + name: "INTR message with pubkey, invalid max droplet precision", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidMaxDropletPrecision, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(append(pubkey[:], []byte{2, 0, 0, 0, 32, 32, 32, 32, 8}...), encoder.SerializeString("skycoin:0.24.1")...), + }, + }, + { + name: "Disconnect self connection", + addr: "12.12.12.12:6000", + mockValue: daemonMockValue{ + mirror: 10000, + disconnectReason: ErrDisconnectSelf, + }, + intro: &IntroductionMessage{ + Mirror: 10000, + }, + }, + { + name: "ProtocolVersion below minimum supported version", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + minProtocolVersion: 2, + disconnectReason: ErrDisconnectVersionNotSupported, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ProtocolVersion: 0, + }, + }, + { + name: "incoming connection", + addr: "121.121.121.121:12345", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:12345", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.24.1", + Remark: "foo", + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.24.1", + Remark: "foo", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ProtocolVersion: 1, + ListenPort: 6000, + Extra: newIntroductionMessageExtra(pubkey, "skycoin:0.24.1(foo)", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + { + name: "Connect twice", + addr: "121.121.121.121:6000", + gnetID: 2, + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectConnectedTwice, + connectionIntroducedErr: ErrConnectionIPMirrorExists, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:12345", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + Remark: "foo", + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + Remark: "foo", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ProtocolVersion: 1, + ListenPort: 6000, + Extra: newIntroductionMessageExtra(pubkey, "skycoin:0.26.0(foo)", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + { + name: "peer list full", + addr: "121.121.121.121:12345", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectPeerlistFull, + connectionIntroducedErr: pex.ErrPeerlistFull, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:12345", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + Remark: "foo", + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + Remark: "foo", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ProtocolVersion: 1, + ListenPort: 6000, + Extra: newIntroductionMessageExtra(pubkey, "skycoin:0.26.0(foo)", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + mc := &gnet.MessageContext{ + Addr: tc.addr, + ConnID: tc.gnetID, + } + tc.intro.c = mc + + d := &mockDaemoner{} + d.On("DaemonConfig").Return(DaemonConfig{ + ProtocolVersion: int32(tc.mockValue.protocolVersion), + MinProtocolVersion: int32(tc.mockValue.minProtocolVersion), + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.24.1", + }, + Mirror: tc.mockValue.mirror, + BlockchainPubkey: tc.mockValue.pubkey, + }) + d.On("recordMessageEvent", tc.intro, mc).Return(tc.mockValue.recordMessageEventErr) + d.On("Disconnect", tc.addr, tc.mockValue.disconnectReason).Return(tc.mockValue.disconnectErr) + d.On("connectionIntroduced", tc.addr, tc.gnetID, mock.MatchedBy(func(m *IntroductionMessage) bool { + t.Logf("connectionIntroduced mock.MatchedBy unconfirmedBurnFactor=%d", m.UnconfirmedVerifyTxn.BurnFactor) + if m == nil { + return false + } + + if tc.userAgent != m.UserAgent { + return false + } + if tc.unconfirmedVerifyTxn != m.UnconfirmedVerifyTxn { + return false + } + + return true + })).Return(tc.mockValue.connectionIntroduced, tc.mockValue.connectionIntroducedErr) + d.On("requestBlocksFromAddr", tc.addr).Return(tc.mockValue.requestBlocksFromAddrErr) + d.On("announceAllValidTxns").Return(tc.mockValue.announceAllTxnsErr) + d.On("sendRandomPeers", tc.addr).Return(tc.mockValue.sendRandomPeersErr) + + err := tc.intro.Handle(mc, d) + require.NoError(t, err) + + tc.intro.process(d) + + if tc.mockValue.disconnectReason != nil { + d.AssertCalled(t, "Disconnect", tc.addr, tc.mockValue.disconnectReason) + } else { + d.AssertNotCalled(t, "Disconnect", mock.Anything, mock.Anything) + require.Equal(t, genesisHash, tc.intro.GenesisHash) + } + }) + } +} + +func TestMessageEncodeDecode(t *testing.T) { + update := false + + introPubKey := cipher.MustPubKeyFromHex("03cd7dfcd8c3452d1bb5d9d9e34dd95d6848cb9f66c2aad127b60578f4be7498f2") + introGenesisHash := cipher.MustSHA256FromHex("9afa0004c0ae04fae7c48e3bc0a324c51100de9508ae6048ebdb6652dc94f0e2") + + cases := []struct { + goldenFile string + obj interface{} + msg interface{} + }{ + { + goldenFile: "intro-msg.golden", + obj: &IntroductionMessage{}, + msg: &IntroductionMessage{ + Mirror: 99998888, + ListenPort: 8888, + ProtocolVersion: 12341234, + }, + }, + { + goldenFile: "intro-msg-extra.golden", + obj: &IntroductionMessage{}, + msg: &IntroductionMessage{ + Mirror: 99998888, + ListenPort: 8888, + ProtocolVersion: 12341234, + Extra: newIntroductionMessageExtra(introPubKey, "skycoin:0.26.0(foo)", params.VerifyTxn{ + BurnFactor: 2, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, introGenesisHash), + }, + }, + { + goldenFile: "get-peers-msg.golden", + obj: &GetPeersMessage{}, + msg: &GetPeersMessage{}, + }, + { + goldenFile: "give-peers-msg.golden", + obj: &GivePeersMessage{}, + msg: &GivePeersMessage{ + Peers: []IPAddr{ + { + IP: 12345678, + Port: 1234, + }, + { + IP: 87654321, + Port: 4321, + }, + }, + }, + }, + { + goldenFile: "ping-msg.golden", + obj: &PingMessage{}, + msg: &PingMessage{}, + }, + { + goldenFile: "pong-msg.golden", + obj: &PongMessage{}, + msg: &PongMessage{}, + }, + { + goldenFile: "get-blocks-msg.golden", + obj: &GetBlocksMessage{}, + msg: &GetBlocksMessage{ + LastBlock: 999988887777, + RequestedBlocks: 888899997777, + }, + }, + { + goldenFile: "give-blocks-msg.golden", + obj: &GiveBlocksMessage{}, + msg: &GiveBlocksMessage{ + Blocks: []coin.SignedBlock{ + { + Sig: cipher.MustSigFromHex("8cf145e9ef4a4a5254bc57798a7a61dfed238768f94edc5635175c6b91bccd8ec1555da603c5e31b018e135b82b1525be8a92973c468a74b5b40b8da189cb465eb"), + Block: coin.Block{ + Head: coin.BlockHeader{ + Version: 1, + Time: 1538036613, + BkSeq: 9999999999, + Fee: 1234123412341234, + PrevHash: cipher.MustSHA256FromHex("59cb7d0e2ce8a03d1054afcc28a22fe864a8813460d241db38c59d10e7c29132"), + BodyHash: cipher.MustSHA256FromHex("6d421469409591f0c3112884c8cf10f8bca5d8ab87c9c30dea2ea73b6751bbf9"), + UxHash: cipher.MustSHA256FromHex("6ea6a972cf06d25908b29953aeddb68c3b6f3a9903e8f964dc89b0abc0645dea"), + }, + Body: coin.BlockBody{ + Transactions: coin.Transactions{ + { + Length: 43214321, + Type: 1, + InnerHash: cipher.MustSHA256FromHex("cbedf8ef0bda91afc6a180eea0dddf8e3a986b6b6f87f70e8bffc63c6fbaa4e6"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("1cfd7a4db3a52a85d2a86708695112b6520acc8dc83c86e8da67915199fdf04964c168543598ab07c2b99c292899890891950364c2bf66f1aaa6d6a66a5c9a73ff"), + cipher.MustSigFromHex("442167c6b3d13957bc32f83182c7f4fda0bb6bde893a41a6a04cdd8eecee0048d03a57eb2af04ea6050e1f418769c94c7f12fad9287dc650e6b307fdfce6b42a59"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("536f0a1a915fadfa3a2720a0615641827ff67394d2b2149d6db63b8c619e14af"), + cipher.MustSHA256FromHex("64ba5f01f90f97f84999f13aeaa75fed8d5b3e4a3a4a093dedf4795969e8bd27"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("23FF4fshzD8tZk2d88P22WATfzUpNQF1x85"), + Coins: 987987987, + Hours: 789789789, + }, + { + Address: cipher.MustDecodeBase58Address("29V2iRpZAqHiFZHHRqaZLArZZuTcZM5owqT"), + Coins: 123123, + Hours: 321321, + }, + }, + }, + { + Length: 98769876, + Type: 0, + InnerHash: cipher.MustSHA256FromHex("46856af925fde9a1652d39eea479dd92589a741451a0228402e399fae02f8f3d"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("92e289792200518df9a82cf9dddd1f334bf0d47fb0ed4ff70c25403f39577af5ab24ef2d02a11cf6b76e6bd017457ad60d6ca85c0567c21f5c62599c93ee98e18c"), + cipher.MustSigFromHex("e995da86ed87640ecb44e624074ba606b781aa0cbeb24e8c27ff30becf7181175479c0d74d93fe1e8692bba628b5cf532ca80fed4135148d84e6ecc2a762a10b19"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("69b14a7ee184f24b95659d6887101ef7c921fa7977d95c73fbc0c4d0d22671bc"), + cipher.MustSHA256FromHex("3a050b4ec33ec9ad2c789f24655ab1c8f7691d3a1c3d0e05cc14b022b4c360ea"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("XvvjeyGcTBVXDXmfJoTUseFiqHvm12C6oQ"), + Coins: 15, + Hours: 1237882, + }, + { + Address: cipher.MustDecodeBase58Address("fQXVLq9fbCC9XVxDKLAGDLXmQYjPy59j22"), + Coins: 2102123, + Hours: 1003, + }, + }, + }, + }, + }, + }, + }, + { + Sig: cipher.MustSigFromHex("8015c8776de577d89c29d1cbd1d558ba4855dec94ba58f6c67d55ece5c85708b9906bd0b72b451e27008f3938fcec42c1a28ddac336ae8206d8e6443b95dde966c"), + Block: coin.Block{ + Head: coin.BlockHeader{ + Version: 0, + Time: 1427248825, + BkSeq: 100, + Fee: 120939323123, + PrevHash: cipher.MustSHA256FromHex("04d40b5d27c539ab9d98934628604baef7dbfb1c35ddf9c0f96a67f6b061fa26"), + BodyHash: cipher.MustSHA256FromHex("9a67fbb00216ae99f334d4efa2c9c42a25aac5d1a5bbb2058fe5705cfe0e30ea"), + UxHash: cipher.MustSHA256FromHex("58981d30da11be3c8e9dd8fdb7b51b48ba13dc0214cf211251308985bf089f76"), + }, + Body: coin.BlockBody{ + Transactions: coin.Transactions{ + { + Length: 128, + Type: 99, + InnerHash: cipher.MustSHA256FromHex("e943fd54a8071bb0ae92800c23c5a26443b5e5bf9b9321cefcdd9e80f518c37e"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("cff49d1d450db812d42748d4f7001e03a1dd2b98afcbb62eca1b3b1fa137e5095a0368250aabd3976008afe61471ecd31ed99185c3df49269d9aada4ca1dd2eecb"), + cipher.MustSigFromHex("1313e5a80d6d9386fe2dffa13afba7277402f029d411e60f99b3806fee547d6157ca2d8d6407df3e858d6f3f58902f460412611282a0dec2468e41a2c5a39cc93e"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("6a76c83b7b75075e2e34405e21d5e8d37adb69e4e6487a6179944ea7e04bc7db"), + cipher.MustSHA256FromHex("a7555179a255e6a7dddb6121bd4c2259f75ebc321345be26b690f34094012f95"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("2RmSTGbj5qaFT1WvKGz4SobaT4xSb9GvaCh"), + Coins: 12301923233, + Hours: 39932, + }, + { + Address: cipher.MustDecodeBase58Address("uA8XQnNzS4kit9DFzybyVSpWDEDy62MXur"), + Coins: 9945924, + Hours: 9030300895893902, + }, + }, + }, + { + Length: 1304, + Type: 255, + InnerHash: cipher.MustSHA256FromHex("d92057e9a4874aa876b7fd20074d78a4d890c2d3af483a10206f243308586763"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("394d53cc0bfeef11cc94bf39316d555549cf1a1afd14920be7d065e7940cc60752b8ade8c37991307a5681b06e0445c1c19ceb0e6611fd4593dcc65d18975c87be"), + cipher.MustSigFromHex("50ad670bc672558c235653b6396135352bfbc8eec575de3cffce65d5a07076082f9694880eb6b1e708eb8fb39d21a96dd99615b5759fc917c3fdd4d9845489119b"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("f37057407a6b5b103218abdfc5b5527f8abcc229256c912ec81ac6d72b68454e"), + cipher.MustSHA256FromHex("9cd1fccddb5895ab77cd419802430e16a1e05f0f796d026fc69961c5c308b766"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("MNf67cWXYmSizin4XUtGnFfQQzxkvNqCEH"), + Coins: 1, + Hours: 1, + }, + { + Address: cipher.MustDecodeBase58Address("HEkH8R1Uc58mAjZqGM15cqF4QMqG4mu4ry"), + Coins: 1, + Hours: 0, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + goldenFile: "announce-blocks-msg.golden", + obj: &AnnounceBlocksMessage{}, + msg: &AnnounceBlocksMessage{ + MaxBkSeq: 50000, + }, + }, + { + goldenFile: "announce-txns-msg.golden", + obj: &AnnounceTxnsMessage{}, + msg: &AnnounceTxnsMessage{ + Transactions: []cipher.SHA256{ + cipher.MustSHA256FromHex("23dc4b68c0fc790989bb82f04b9d5174baab6f0f6808ed35be9b93cb73c69108"), + cipher.MustSHA256FromHex("2be4b0155c1ab9613007fe522e3b12bac4be79800a19bc8cd8ca343868caa583"), + }, + }, + }, + { + goldenFile: "get-txns-msg.golden", + obj: &GetTxnsMessage{}, + msg: &GetTxnsMessage{ + Transactions: []cipher.SHA256{ + cipher.MustSHA256FromHex("335b63b0f335c6aee5e7e1b3c62dd09bb6074e38b48e2469e294a019d5ae5aa1"), + cipher.MustSHA256FromHex("619a367f4e5dee741348366899237ddc920335fc847ccafdf2d32ed57bb7b385"), + }, + }, + }, + { + goldenFile: "give-txns-msg.golden", + obj: &GiveTxnsMessage{}, + msg: &GiveTxnsMessage{ + Transactions: coin.Transactions{ + { + Length: 256, + Type: 0, + InnerHash: cipher.MustSHA256FromHex("1773d8901df96bba4c6d65499e11e6ec73a9978c611d1463898ffbc2b49773fc"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("a711880ae54d1b6b9adade2ef1e743d6d539a78b0cecf1af08107e467956de80ef1d49fb5e896c9d0870ef8bf8a4d328ca0ecf7c1956866867ec56064e68f8a374"), + cipher.MustSigFromHex("f9890ddd93f9479e364261ebc647326d2fd57e50b7728795adbf507c956f9eb44f77207b528700c4cef338290cdfc17f814dc3d94e3d711e92492ecc7b8abef808"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("703f84ee0702b44fc89ce573a239d5fbf185bf5d4e7fc8f4930262bcda1e8fb0"), + cipher.MustSHA256FromHex("c9e904862da01f2d7676c12c4342dde36d9a9a9d25be5351e2b57fae6f426bb9"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("29VEn56iRr2TpVVpPoPxUJPfFWuhbLSBRdU"), + Coins: 1111111111111111111, + Hours: 9999999999999999999, + }, + { + Address: cipher.MustDecodeBase58Address("2bqs99tysFtfs8QPT81kpZWnzTT1rWd8xtQ"), + Coins: 9922581002, + Hours: 9932900022223334, + }, + }, + }, + { + Length: 13043, + Type: 128, + InnerHash: cipher.MustSHA256FromHex("a9da3e4acb1892a000c1b658a64d4e420d0c381862928ab820fb3f3a534a9674"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("7bbbdfd58c0533aed95f18d9413e0e0517892350eaf132eadf7a9a03d4a974ca0bc074abc001f86a34cf66c10f832dbcca20c2c67b5e8517f4ff0e1d0123fecb21"), + cipher.MustSigFromHex("68732b78ac3a4e2fe146b8819c8b1c0b126a0188008c9c7c98fee965beba039778010ff7b0379dadeeadbbc42f9541ce4ad3c8cec12108d3aa58aca583bddd0df0"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("766d6f6ed56599a91759c75466e3f09b9d6d5995b58dd5bbfba5af10b1a8cdea"), + cipher.MustSHA256FromHex("2c7989f47524721bb2c7a7f967208c9b1c01829c9a55addf22d066e5c55ab3ac"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("24iFsYHzVfYXo8cvWg1jhetpTMNvHH7j6AX"), + Coins: 1123103123, + Hours: 123000, + }, + { + Address: cipher.MustDecodeBase58Address("JV5xJ33po1Bj3dXZT3SYA3ZmnTibREFxxd"), + Coins: 999999, + Hours: 9043285343, + }, + }, + }, + }, + }, + }, + } + + if update { + for _, tc := range cases { + t.Run(tc.goldenFile, func(t *testing.T) { + fn := filepath.Join("testdata/", tc.goldenFile) + + f, err := os.Create(fn) + require.NoError(t, err) + defer f.Close() + + b := encoder.Serialize(tc.msg) + _, err = f.Write(b) + require.NoError(t, err) + }) + } + } + + for _, tc := range cases { + t.Run(tc.goldenFile, func(t *testing.T) { + fn := filepath.Join("testdata/", tc.goldenFile) + + f, err := os.Open(fn) + require.NoError(t, err) + defer f.Close() + + d, err := ioutil.ReadAll(f) + require.NoError(t, err) + + err = encoder.DeserializeRawExact(d, tc.obj) + require.NoError(t, err) + + require.Equal(t, tc.msg, tc.obj) + + d2 := encoder.Serialize(tc.msg) + require.Equal(t, d, d2) + }) + } +} + +func TestTruncateGivePeersMessage(t *testing.T) { + maxLen := uint64(1024) + m := &GivePeersMessage{} + + // Empty message, no truncation + prevLen := len(m.Peers) + truncateGivePeersMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Peers)) + + n := encodeSizeGivePeersMessage(m) + require.True(t, n <= maxLen) + + // One peer, no truncation + m.Peers = append(m.Peers, IPAddr{}) + prevLen = len(m.Peers) + truncateGivePeersMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Peers)) + + n = encodeSizeGivePeersMessage(m) + require.True(t, n <= maxLen) + + // Too many peers, truncated + n = encodeSizeIPAddr(&IPAddr{}) + m.Peers = make([]IPAddr, (maxLen/n)*2) + prevLen = len(m.Peers) + truncateGivePeersMessage(m, maxLen) + require.True(t, len(m.Peers) < prevLen) + require.NotEmpty(t, m.Peers) + + n = encodeSizeGivePeersMessage(m) + require.True(t, n <= maxLen) +} + +func TestTruncateGiveBlocksMessage(t *testing.T) { + maxLen := uint64(1024) + m := &GiveBlocksMessage{} + + // Empty message, no truncation + prevLen := len(m.Blocks) + truncateGiveBlocksMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Blocks)) + + n := encodeSizeGiveBlocksMessage(m) + require.True(t, n <= maxLen) + + // One block, no truncation + m.Blocks = append(m.Blocks, coin.SignedBlock{}) + prevLen = len(m.Blocks) + truncateGiveBlocksMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Blocks)) + + n = encodeSizeGiveBlocksMessage(m) + require.True(t, n <= maxLen) + + // Too many blocks, truncated + n = encodeSizeSignedBlock(&coin.SignedBlock{}) + m.Blocks = make([]coin.SignedBlock, (maxLen/n)*2) + prevLen = len(m.Blocks) + truncateGiveBlocksMessage(m, maxLen) + require.True(t, len(m.Blocks) < prevLen) + require.NotEmpty(t, m.Blocks) + + n = encodeSizeGiveBlocksMessage(m) + require.True(t, n <= maxLen) +} + +func TestTruncateGiveTransactionsMessage(t *testing.T) { + maxLen := uint64(1024) + m := &GiveTxnsMessage{} + + // Empty message, no truncation + prevLen := len(m.Transactions) + truncateGiveTxnsMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Transactions)) + + n := encodeSizeGiveTxnsMessage(m) + require.True(t, n <= maxLen) + + // One block, no truncation + m.Transactions = append(m.Transactions, coin.Transaction{}) + prevLen = len(m.Transactions) + truncateGiveTxnsMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Transactions)) + + n = encodeSizeGiveTxnsMessage(m) + require.True(t, n <= maxLen) + + // Too many transactions, truncated + n = encodeSizeTransaction(&coin.Transaction{}) + m.Transactions = make([]coin.Transaction, (maxLen/n)*2) + prevLen = len(m.Transactions) + truncateGiveTxnsMessage(m, maxLen) + require.True(t, len(m.Transactions) < prevLen) + require.NotEmpty(t, m.Transactions) + + n = encodeSizeGiveTxnsMessage(m) + require.True(t, n <= maxLen) +} + +func TestTruncateAnnounceTxnsHashes(t *testing.T) { + maxLen := uint64(1024) + m := &AnnounceTxnsMessage{} + + // Empty message, no truncation + prevLen := len(m.Transactions) + hashes := truncateAnnounceTxnsHashes(m, maxLen) + require.Equal(t, prevLen, len(hashes)) + + m.Transactions = hashes + n := encodeSizeAnnounceTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) + + // One block, no truncation + m.Transactions = append(m.Transactions, cipher.SHA256{}) + prevLen = len(m.Transactions) + hashes = truncateAnnounceTxnsHashes(m, maxLen) + require.Equal(t, prevLen, len(hashes)) + + m.Transactions = hashes + n = encodeSizeAnnounceTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) + + // Too many transactions, truncated + n = uint64(len(cipher.SHA256{})) + m.Transactions = make([]cipher.SHA256, (maxLen/n)*2) + prevLen = len(m.Transactions) + hashes = truncateAnnounceTxnsHashes(m, maxLen) + require.True(t, len(hashes) < prevLen) + require.NotEmpty(t, hashes) + + m.Transactions = hashes + n = encodeSizeAnnounceTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) +} + +func TestTruncateGetTxnsHashes(t *testing.T) { + maxLen := uint64(1024) + m := &GetTxnsMessage{} + + // Empty message, no truncation + prevLen := len(m.Transactions) + hashes := truncateGetTxnsHashes(m, maxLen) + require.Equal(t, prevLen, len(hashes)) + + m.Transactions = hashes + n := encodeSizeGetTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) + + // One block, no truncation + m.Transactions = append(m.Transactions, cipher.SHA256{}) + prevLen = len(m.Transactions) + hashes = truncateGetTxnsHashes(m, maxLen) + require.Equal(t, prevLen, len(hashes)) + + m.Transactions = hashes + n = encodeSizeGetTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) + + // Too many transactions, truncated + n = uint64(len(cipher.SHA256{})) + m.Transactions = make([]cipher.SHA256, (maxLen/n)*2) + prevLen = len(m.Transactions) + hashes = truncateGetTxnsHashes(m, maxLen) + require.True(t, len(hashes) < prevLen) + require.NotEmpty(t, hashes) + + m.Transactions = hashes + n = encodeSizeGetTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) +} + +func TestGetBlocksMessageProcess(t *testing.T) { + d := &mockDaemoner{} + + m := &GetBlocksMessage{ + LastBlock: 7, + // request more blocks than MaxGetBlocksResponseCount to verify capping + RequestedBlocks: 100, + c: &gnet.MessageContext{ + ConnID: 10, + Addr: "127.0.0.1:1234", + }, + } + + config := DaemonConfig{ + DisableNetworking: false, + MaxGetBlocksResponseCount: 20, + MaxOutgoingMessageLength: 1024, + } + + // Have getSignedBlocksSince return a lot of blocks to verify truncation + blocks := make([]coin.SignedBlock, 256) + + gbm := NewGiveBlocksMessage(blocks, config.MaxOutgoingMessageLength) + require.True(t, len(gbm.Blocks) < len(blocks), "blocks should be truncated") + require.NotEmpty(t, gbm.Blocks) + + d.On("DaemonConfig").Return(config) + d.On("recordPeerHeight", "127.0.0.1:1234", uint64(10), uint64(7)).Return() + d.On("getSignedBlocksSince", uint64(7), uint64(20)).Return(blocks, nil) + d.On("sendMessage", "127.0.0.1:1234", gbm).Return(nil) + + m.process(d) + + d.AssertExpectations(t) +} + +func setupMsgEncoding() { + gnet.EraseMessages() + var messagesConfig = NewMessagesConfig() + messagesConfig.Register() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/mock_daemoner_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/mock_daemoner_test.go new file mode 100644 index 00000000..49b16202 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/mock_daemoner_test.go @@ -0,0 +1,347 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package daemon + +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import gnet "github.com/SkycoinProject/skycoin/src/daemon/gnet" +import mock "github.com/stretchr/testify/mock" +import pex "github.com/SkycoinProject/skycoin/src/daemon/pex" +import visor "github.com/SkycoinProject/skycoin/src/visor" + +// mockDaemoner is an autogenerated mock type for the daemoner type +type mockDaemoner struct { + mock.Mock +} + +// DaemonConfig provides a mock function with given fields: +func (_m *mockDaemoner) DaemonConfig() DaemonConfig { + ret := _m.Called() + + var r0 DaemonConfig + if rf, ok := ret.Get(0).(func() DaemonConfig); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(DaemonConfig) + } + + return r0 +} + +// Disconnect provides a mock function with given fields: addr, r +func (_m *mockDaemoner) Disconnect(addr string, r gnet.DisconnectReason) error { + ret := _m.Called(addr, r) + + var r0 error + if rf, ok := ret.Get(0).(func(string, gnet.DisconnectReason) error); ok { + r0 = rf(addr, r) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// addPeers provides a mock function with given fields: addrs +func (_m *mockDaemoner) addPeers(addrs []string) int { + ret := _m.Called(addrs) + + var r0 int + if rf, ok := ret.Get(0).(func([]string) int); ok { + r0 = rf(addrs) + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// announceAllValidTxns provides a mock function with given fields: +func (_m *mockDaemoner) announceAllValidTxns() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// broadcastMessage provides a mock function with given fields: msg +func (_m *mockDaemoner) broadcastMessage(msg gnet.Message) ([]uint64, error) { + ret := _m.Called(msg) + + var r0 []uint64 + if rf, ok := ret.Get(0).(func(gnet.Message) []uint64); ok { + r0 = rf(msg) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]uint64) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(gnet.Message) error); ok { + r1 = rf(msg) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// connectionIntroduced provides a mock function with given fields: addr, gnetID, m +func (_m *mockDaemoner) connectionIntroduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) { + ret := _m.Called(addr, gnetID, m) + + var r0 *connection + if rf, ok := ret.Get(0).(func(string, uint64, *IntroductionMessage) *connection); ok { + r0 = rf(addr, gnetID, m) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connection) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, uint64, *IntroductionMessage) error); ok { + r1 = rf(addr, gnetID, m) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// disconnectNow provides a mock function with given fields: addr, r +func (_m *mockDaemoner) disconnectNow(addr string, r gnet.DisconnectReason) error { + ret := _m.Called(addr, r) + + var r0 error + if rf, ok := ret.Get(0).(func(string, gnet.DisconnectReason) error); ok { + r0 = rf(addr, r) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// executeSignedBlock provides a mock function with given fields: b +func (_m *mockDaemoner) executeSignedBlock(b coin.SignedBlock) error { + ret := _m.Called(b) + + var r0 error + if rf, ok := ret.Get(0).(func(coin.SignedBlock) error); ok { + r0 = rf(b) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// filterKnownUnconfirmed provides a mock function with given fields: txns +func (_m *mockDaemoner) filterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) { + ret := _m.Called(txns) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func([]cipher.SHA256) []cipher.SHA256); ok { + r0 = rf(txns) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.SHA256) error); ok { + r1 = rf(txns) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// getKnownUnconfirmed provides a mock function with given fields: txns +func (_m *mockDaemoner) getKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) { + ret := _m.Called(txns) + + var r0 coin.Transactions + if rf, ok := ret.Get(0).(func([]cipher.SHA256) coin.Transactions); ok { + r0 = rf(txns) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.Transactions) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.SHA256) error); ok { + r1 = rf(txns) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// getSignedBlocksSince provides a mock function with given fields: seq, count +func (_m *mockDaemoner) getSignedBlocksSince(seq uint64, count uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(seq, count) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64, uint64) []coin.SignedBlock); ok { + r0 = rf(seq, count) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64, uint64) error); ok { + r1 = rf(seq, count) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// headBkSeq provides a mock function with given fields: +func (_m *mockDaemoner) headBkSeq() (uint64, bool, error) { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 bool + if rf, ok := ret.Get(1).(func() bool); ok { + r1 = rf() + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func() error); ok { + r2 = rf() + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// injectTransaction provides a mock function with given fields: txn +func (_m *mockDaemoner) injectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) { + ret := _m.Called(txn) + + var r0 bool + if rf, ok := ret.Get(0).(func(coin.Transaction) bool); ok { + r0 = rf(txn) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 *visor.ErrTxnViolatesSoftConstraint + if rf, ok := ret.Get(1).(func(coin.Transaction) *visor.ErrTxnViolatesSoftConstraint); ok { + r1 = rf(txn) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*visor.ErrTxnViolatesSoftConstraint) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(coin.Transaction) error); ok { + r2 = rf(txn) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// pexConfig provides a mock function with given fields: +func (_m *mockDaemoner) pexConfig() pex.Config { + ret := _m.Called() + + var r0 pex.Config + if rf, ok := ret.Get(0).(func() pex.Config); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(pex.Config) + } + + return r0 +} + +// recordMessageEvent provides a mock function with given fields: m, c +func (_m *mockDaemoner) recordMessageEvent(m asyncMessage, c *gnet.MessageContext) error { + ret := _m.Called(m, c) + + var r0 error + if rf, ok := ret.Get(0).(func(asyncMessage, *gnet.MessageContext) error); ok { + r0 = rf(m, c) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// recordPeerHeight provides a mock function with given fields: addr, gnetID, height +func (_m *mockDaemoner) recordPeerHeight(addr string, gnetID uint64, height uint64) { + _m.Called(addr, gnetID, height) +} + +// requestBlocksFromAddr provides a mock function with given fields: addr +func (_m *mockDaemoner) requestBlocksFromAddr(addr string) error { + ret := _m.Called(addr) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(addr) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// sendMessage provides a mock function with given fields: addr, msg +func (_m *mockDaemoner) sendMessage(addr string, msg gnet.Message) error { + ret := _m.Called(addr, msg) + + var r0 error + if rf, ok := ret.Get(0).(func(string, gnet.Message) error); ok { + r0 = rf(addr, msg) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// sendRandomPeers provides a mock function with given fields: addr +func (_m *mockDaemoner) sendRandomPeers(addr string) error { + ret := _m.Called(addr) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(addr) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/README.md b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/README.md new file mode 100644 index 00000000..2dc91726 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/README.md @@ -0,0 +1,8 @@ +pex +=== + +Tools for implementing peer exchange (PEX) with Go + +[![GoDoc](http://godoc.org/github.com//skycoin/pex?status.png)](http://godoc.org/github.com/SkycoinProject/skycoin/src/daemon/pex) + +[Godoc generated documentation](http://godoc.org/github.com/SkycoinProject/skycoin/src/daemon/pex) diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist.go new file mode 100644 index 00000000..bcea692c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist.go @@ -0,0 +1,417 @@ +package pex + +import ( + "encoding/json" + "fmt" + "io" + "math/rand" + "os" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +// Peers peer list +type Peers []Peer + +// ToAddrs returns the address list +func (ps Peers) ToAddrs() []string { + addrs := make([]string, 0, len(ps)) + for _, p := range ps { + addrs = append(addrs, p.Addr) + } + return addrs +} + +// peerlist is a map of addresses to *PeerStates +type peerlist struct { + peers map[string]*Peer +} + +func newPeerlist() peerlist { + return peerlist{ + peers: make(map[string]*Peer), + } +} + +// Filter peers filter +type Filter func(peer Peer) bool + +// loadCachedPeersFile loads peers from the cached peers.json file +func loadCachedPeersFile(path string) (map[string]*Peer, error) { + peersJSON := make(map[string]PeerJSON) + err := file.LoadJSON(path, &peersJSON) + + if os.IsNotExist(err) { + logger.WithField("path", path).Info("File does not exist") + return nil, nil + } else if err == io.EOF { + logger.WithField("path", path).Error("Corrupt or empty file") + return nil, nil + } + + if err != nil { + logger.WithField("path", path).WithError(err).Error("Failed to load peers file") + return nil, err + } + + peers := make(map[string]*Peer, len(peersJSON)) + for addr, peerJSON := range peersJSON { + fields := logrus.Fields{ + "addr": addr, + "path": path, + } + + a, err := validateAddress(addr, true) + + if err != nil { + logger.WithError(err).WithFields(fields).Error("Invalid address in peers JSON file") + continue + } + + peer, err := newPeerFromJSON(peerJSON) + if err != nil { + logger.WithError(err).WithFields(fields).Error("newPeerFromJSON failed") + continue + } + + if a != peer.Addr { + fields["peerAddr"] = peer.Addr + logger.WithFields(fields).Error("Address key does not match Peer.Addr") + continue + } + + peers[a] = peer + } + + return peers, nil +} + +func (pl *peerlist) setPeers(peers []Peer) { + for _, p := range peers { + np := p + pl.peers[p.Addr] = &np + } +} + +func (pl *peerlist) hasPeer(addr string) bool { + p, ok := pl.peers[addr] + return ok && p != nil +} + +func (pl *peerlist) addPeer(addr string) { + if p, ok := pl.peers[addr]; ok && p != nil { + p.Seen() + return + } + + peer := NewPeer(addr) + pl.peers[addr] = peer +} + +func (pl *peerlist) addPeers(addrs []string) { + for _, addr := range addrs { + pl.addPeer(addr) + } +} + +func (pl *peerlist) seen(addr string) { + if p, ok := pl.peers[addr]; ok && p != nil { + p.Seen() + } +} + +// getCanTryPeers returns all peers that are triable(retried times blew exponential backoff times) +// and are able to pass the filters. +func (pl *peerlist) getCanTryPeers(flts []Filter) Peers { + ps := make(Peers, 0) + flts = append([]Filter{canTry}, flts...) +loop: + for _, p := range pl.peers { + for i := range flts { + if !flts[i](*p) { + continue loop + } + } + + ps = append(ps, *p) + } + + return ps +} + +// getPeers returns all peers that can pass the filters. +func (pl *peerlist) getPeers(flts []Filter) Peers { + ps := make(Peers, 0) +loop: + for _, p := range pl.peers { + for i := range flts { + if !flts[i](*p) { + continue loop + } + } + + ps = append(ps, *p) + } + + return ps +} + +// filters +func isPrivate(p Peer) bool { + return p.Private +} + +func isPublic(p Peer) bool { + return !p.Private +} + +func isTrusted(p Peer) bool { + return p.Trusted +} + +func hasIncomingPort(p Peer) bool { + return p.HasIncomingPort +} + +func canTry(p Peer) bool { + return p.CanTry() +} + +// isExchangeable filters exchangeable peers +var isExchangeable = []Filter{hasIncomingPort, isPublic} + +// removePeer removes peer +func (pl *peerlist) removePeer(addr string) { + delete(pl.peers, addr) +} + +// SetPrivate sets specific peer as private +func (pl *peerlist) setPrivate(addr string, private bool) error { + if p, ok := pl.peers[addr]; ok { + p.Private = private + return nil + } + + return fmt.Errorf("set peer.Private failed: %v does not exist in peer list", addr) +} + +// setTrusted sets peer as trusted peer +func (pl *peerlist) setTrusted(addr string, trusted bool) error { + if p, ok := pl.peers[addr]; ok { + p.Trusted = trusted + return nil + } + + return fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", addr) +} + +// setAllUntrusted unsets the trusted field on all peers +func (pl *peerlist) setAllUntrusted() { + for _, p := range pl.peers { + p.Trusted = false + } +} + +// setHasIncomingPort marks the peer's port as being publicly accessible +func (pl *peerlist) setHasIncomingPort(addr string, hasIncomingPort bool) error { + if p, ok := pl.peers[addr]; ok { + p.HasIncomingPort = hasIncomingPort + p.Seen() + return nil + } + + return fmt.Errorf("set peer.HasIncomingPort failed: %v does not exist in peer list", addr) +} + +// setUserAgent sets a peer's user agent +func (pl *peerlist) setUserAgent(addr string, userAgent useragent.Data) error { + if p, ok := pl.peers[addr]; ok { + p.UserAgent = userAgent + p.Seen() + return nil + } + + return fmt.Errorf("set peer.UserAgent failed: %v does not exist in peer list", addr) +} + +// len returns number of peers +func (pl *peerlist) len() int { + return len(pl.peers) +} + +// getPeer returns peer for a given address +func (pl *peerlist) getPeer(addr string) (Peer, bool) { + p, ok := pl.peers[addr] + if ok { + return *p, true + } + return Peer{}, false +} + +// clearOld removes public, untrusted peers that haven't been seen in timeAgo seconds +func (pl *peerlist) clearOld(timeAgo time.Duration) { + t := time.Now().UTC() + for addr, peer := range pl.peers { + lastSeen := time.Unix(peer.LastSeen, 0) + if !peer.Private && !peer.Trusted && t.Sub(lastSeen) > timeAgo { + delete(pl.peers, addr) + } + } +} + +// Returns n random peers, or all of the peers, whichever is lower. +// If count is 0, all of the peers are returned, shuffled. +func (pl *peerlist) random(count int, flts []Filter) Peers { + keys := pl.getCanTryPeers(flts).ToAddrs() + if len(keys) == 0 { + return Peers{} + } + + max := count + if max == 0 || max > len(keys) { + max = len(keys) + } + + ps := make(Peers, max) + perm := rand.Perm(len(keys)) + for i, j := range perm[:max] { + ps[i] = *pl.peers[keys[j]] + } + return ps +} + +// save saves known peers to disk as a newline delimited list of addresses to +// +func (pl *peerlist) save(fn string) error { + // filter the peers that has retrytime > MaxPeerRetryTimes + peers := make(map[string]PeerJSON) + for k, p := range pl.peers { + if p.RetryTimes <= MaxPeerRetryTimes { + peers[k] = newPeerJSON(*p) + } + } + + if err := file.SaveJSON(fn, peers, 0600); err != nil { + return fmt.Errorf("save peer list failed: %s", err) + } + return nil +} + +// increaseRetryTimes increases retry times +func (pl *peerlist) increaseRetryTimes(addr string) { + if p, ok := pl.peers[addr]; ok { + p.IncreaseRetryTimes() + p.Seen() + } +} + +// resetRetryTimes reset retry times +func (pl *peerlist) resetRetryTimes(addr string) { + if p, ok := pl.peers[addr]; ok { + p.ResetRetryTimes() + p.Seen() + } +} + +// resetAllRetryTimes reset all peers' retry times +func (pl *peerlist) resetAllRetryTimes() { + logger.Info("Reset all peer's retry times") + for _, p := range pl.peers { + p.ResetRetryTimes() + } +} + +func (pl *peerlist) findOldestUntrustedPeer() *Peer { + var oldest *Peer + + for _, p := range pl.peers { + if p.Trusted || p.Private { + continue + } + + if oldest == nil || p.LastSeen < oldest.LastSeen { + oldest = p + } + } + + if oldest != nil { + p := *oldest + return &p + } + + return nil +} + +// PeerJSON is for saving and loading peers to disk. Some fields are strange, +// to be backwards compatible due to variable name changes +type PeerJSON struct { + Addr string // An address of the form ip:port + // Unix timestamp when this peer was last seen. + // This could be a time.Time string or an int64 timestamp + LastSeen interface{} + Private bool // Whether it should omitted from public requests + Trusted bool // Whether this peer is trusted + HasIncomePort *bool `json:"HasIncomePort,omitempty"` // Whether this peer has incoming port [DEPRECATED] + HasIncomingPort *bool // Whether this peer has incoming port + UserAgent useragent.Data +} + +// newPeerJSON returns a PeerJSON from a Peer +func newPeerJSON(p Peer) PeerJSON { + return PeerJSON{ + Addr: p.Addr, + LastSeen: p.LastSeen, + Private: p.Private, + Trusted: p.Trusted, + HasIncomingPort: &p.HasIncomingPort, + UserAgent: p.UserAgent, + } +} + +// newPeerFromJSON converts a PeerJSON to a Peer +func newPeerFromJSON(p PeerJSON) (*Peer, error) { + hasIncomingPort := false + if p.HasIncomingPort != nil { + hasIncomingPort = *p.HasIncomingPort + } else if p.HasIncomePort != nil { + hasIncomingPort = *p.HasIncomePort + } + + // LastSeen could be a RFC3339Nano timestamp or an int64 unix timestamp + var lastSeen int64 + switch p.LastSeen.(type) { + case string: + lastSeenTime, err := time.Parse(time.RFC3339Nano, p.LastSeen.(string)) + if err != nil { + return nil, err + } + lastSeen = lastSeenTime.Unix() + case json.Number: + lastSeenNum := p.LastSeen.(json.Number) + var err error + lastSeen, err = lastSeenNum.Int64() + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("Invalid type %T for LastSeen field", p.LastSeen) + } + + addr, err := validateAddress(p.Addr, true) + if err != nil { + return nil, err + } + + return &Peer{ + Addr: addr, + LastSeen: lastSeen, + Private: p.Private, + Trusted: p.Trusted, + HasIncomingPort: hasIncomingPort, + UserAgent: p.UserAgent, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist_test.go new file mode 100644 index 00000000..f5d49aac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist_test.go @@ -0,0 +1,632 @@ +package pex + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +var testPeers = []string{ + "112.32.32.14:7200", + "112.32.32.15:7200", + "112.32.32.16:7200", + "112.32.32.17:7200", +} + +var wrongPortPeer = "112.32.32.14:1" + +/* Peer tests */ + +func TestNewPeer(t *testing.T) { + p := NewPeer(testPeers[0]) + require.NotEqual(t, p.LastSeen, 0) + require.Equal(t, p.Addr, testPeers[0]) + require.False(t, p.Private) +} + +func TestPeerSeen(t *testing.T) { + p := NewPeer(testPeers[0]) + x := p.LastSeen + time.Sleep(time.Second) + p.Seen() + require.NotEqual(t, x, p.LastSeen) + if p.LastSeen < x { + t.Fail() + } +} + +func TestPeerString(t *testing.T) { + p := NewPeer(testPeers[0]) + require.Equal(t, testPeers[0], p.String()) +} + +func TestLoadPeersFromFile(t *testing.T) { + tt := []struct { + name string + noFile bool + emptyFile bool + ps []string + expectPeers map[string]*Peer + err error + }{ + { + "no file", + true, + false, + testPeers[0:0], + map[string]*Peer{}, + nil, + }, + { + "one addr", + false, + false, + testPeers[:1], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + nil, + }, + { + "two addr", + false, + false, + testPeers[:2], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + }, + nil, + }, + { + "empty peer list file", + false, + true, + testPeers[0:0], + map[string]*Peer{}, + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + f, removeFile := preparePeerlistFile(t) + if !tc.emptyFile { + persistPeers(t, f, tc.ps) + } + + if tc.noFile { + // remove file immediately + removeFile() + } else { + defer removeFile() + } + + peers, err := loadCachedPeersFile(f) + require.Equal(t, tc.err, err) + require.Equal(t, len(tc.expectPeers), len(peers)) + for k, v := range tc.expectPeers { + p, ok := peers[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, *v, *p) + } + }) + } +} + +func TestPeerlistSetPeers(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect map[string]Peer + }{ + { + "empty peers", + []Peer{}, + map[string]Peer{}, + }, + { + "one peer", + []Peer{*NewPeer(testPeers[0])}, + map[string]Peer{ + testPeers[0]: *NewPeer(testPeers[0]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.peers) + require.Equal(t, len(tc.expect), len(pl.peers)) + for k, v := range tc.expect { + p, ok := pl.peers[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, v, *p) + } + }) + } +} + +func TestPeerlistAddPeer(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + addPeer string + dup bool + expectPeers map[string]*Peer + }{ + { + "add peer to empty peer list", + []Peer{}, + testPeers[0], + false, + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + }, + { + "add peer to none empty peer list", + []Peer{*NewPeer(testPeers[0])}, + testPeers[1], + false, + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + }, + }, + { + "add dup peer", + []Peer{{Addr: testPeers[0]}}, + testPeers[0], + true, + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + // init the peers + pl.setPeers(tc.initPeers) + + if tc.dup { + // sleep a second so that LastSeen is diff + time.Sleep(time.Second) + } + + // add peer + pl.addPeer(tc.addPeer) + + require.Equal(t, len(tc.expectPeers), len(pl.peers)) + for k, v := range tc.expectPeers { + p, ok := pl.peers[k] + require.True(t, ok) + if tc.dup { + require.True(t, p.LastSeen > v.LastSeen) + continue + } + + peersEqualWithSeenAllowedDiff(t, *v, *p) + } + }) + } +} + +func TestPeerlistAddPeers(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + addPeers []string + expectPeers map[string]*Peer + }{ + { + "add one peer to empty list", + []Peer{}, + testPeers[:1], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + }, + { + "add two peer to none empty list", + []Peer{*NewPeer(testPeers[0])}, + testPeers[1:3], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + testPeers[2]: NewPeer(testPeers[2]), + }, + }, + { + "add dup peers", + []Peer{*NewPeer(testPeers[0])}, + testPeers[:3], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + testPeers[2]: NewPeer(testPeers[2]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + // init peers + pl.setPeers(tc.initPeers) + + // add peers + pl.addPeers(tc.addPeers) + + require.Equal(t, len(tc.expectPeers), len(pl.peers)) + for k, v := range tc.expectPeers { + p, ok := pl.peers[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, *v, *p) + } + }) + } +} + +func TestPeerListSetTrusted(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + peer string + trust bool + err error + }{ + { + "set trust true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + true, + nil, + }, + { + "set trust false", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + false, + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + false, + fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + + // init peer + pl.setPeers(tc.initPeers) + + err := pl.setTrusted(tc.peer, tc.trust) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + p, ok := pl.peers[tc.peer] + require.True(t, ok) + require.Equal(t, tc.trust, p.Trusted) + }) + } +} + +func TestPeerlistFindOldestUntrustedPeer(t *testing.T) { + peer1 := Peer{ + Addr: "1.1.1.1:6060", + LastSeen: time.Now().UTC().Unix() - 60*60*24*2, + } + peer2 := Peer{ + Addr: "2.2.2.2:6060", + LastSeen: time.Now().UTC().Unix() - 60*60*24*7, + } + peer3 := Peer{ + Addr: "3.3.3.3:6060", + LastSeen: time.Now().UTC().Unix() - 60, + } + trustedPeer := Peer{ + Addr: "4.4.4.4:6060", + LastSeen: time.Now().UTC().Unix() - 60*60*24*30, + Trusted: true, + } + privatePeer := Peer{ + Addr: "5.5.5.5:6060", + LastSeen: time.Now().UTC().Unix() - 60*60*24*30, + Private: true, + } + + cases := []struct { + name string + initPeers []Peer + expect *Peer + }{ + { + name: "empty peerlist", + initPeers: []Peer{}, + expect: nil, + }, + + { + name: "no untrusted public peers", + initPeers: []Peer{ + trustedPeer, + privatePeer, + }, + expect: nil, + }, + + { + name: "one peer", + initPeers: []Peer{ + peer1, + }, + expect: &peer1, + }, + + { + name: "3 peers ignore trusted", + initPeers: []Peer{ + peer1, + trustedPeer, + peer2, + peer3, + }, + expect: &peer2, + }, + + { + name: "3 peers ignore private", + initPeers: []Peer{ + peer1, + privatePeer, + peer2, + peer3, + }, + expect: &peer2, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.initPeers) + + p := pl.findOldestUntrustedPeer() + require.Equal(t, tc.expect, p) + }) + } +} + +func TestPeerlistClearOld(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + timeAgo time.Duration + expectPeers map[string]Peer + }{ + { + "no old peers", + []Peer{ + {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + }, + 110 * time.Second, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + }, + }, + { + "clear one old peer", + []Peer{ + {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + {Addr: testPeers[1], LastSeen: time.Now().UTC().Unix() - 110}, + {Addr: testPeers[2], LastSeen: time.Now().UTC().Unix() - 120}, + }, + 111 * time.Second, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + testPeers[1]: {Addr: testPeers[1], LastSeen: time.Now().UTC().Unix() - 110}, + }, + }, + { + "clear two old peers", + []Peer{ + {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + {Addr: testPeers[1], LastSeen: time.Now().UTC().Unix() - 110}, + {Addr: testPeers[2], LastSeen: time.Now().UTC().Unix() - 120}, + }, + 101 * time.Second, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.initPeers) + + pl.clearOld(tc.timeAgo) + require.Equal(t, len(pl.peers), len(tc.expectPeers)) + for _, p := range tc.expectPeers { + v, ok := pl.peers[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, *v, p) + } + }) + } +} + +func TestPeerlistSave(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect map[string]Peer + }{ + { + "save all", + []Peer{ + {Addr: testPeers[0]}, + {Addr: testPeers[1]}, + }, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0]}, + testPeers[1]: {Addr: testPeers[1]}, + }, + }, + { + "save one peer", + []Peer{ + {Addr: testPeers[0], RetryTimes: MaxPeerRetryTimes + 1}, + {Addr: testPeers[1]}, + }, + map[string]Peer{ + testPeers[1]: {Addr: testPeers[1]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.peers) + + f, removeFile := preparePeerlistFile(t) + defer removeFile() + require.NoError(t, pl.save(f)) + + psMap, err := loadCachedPeersFile(f) + require.NoError(t, err) + for k, v := range tc.expect { + p, ok := psMap[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, v, *p) + } + }) + } +} + +func TestPeerCanTry(t *testing.T) { + testData := []struct { + LastSeen int64 + RetryTimes int + CanTry bool + }{ + { + time.Now().UTC().Add(time.Duration(100) * time.Second * -1).Unix(), + 1, + true, + }, + } + + for _, d := range testData { + p := Peer{ + LastSeen: d.LastSeen, + RetryTimes: d.RetryTimes, + } + require.Equal(t, d.CanTry, p.CanTry()) + } +} + +func TestPeerJSONParsing(t *testing.T) { + // The serialized peer json format changed, + // this tests that the old format can still parse. + oldFormat := `{ + "Addr": "11.22.33.44:6000", + "LastSeen": "2017-09-24T06:42:18.999999999Z", + "Private": true, + "Trusted": true, + "HasIncomePort": true + }` + + newFormat := `{ + "Addr": "11.22.33.44:6000", + "LastSeen": 1506235338, + "Private": true, + "Trusted": true, + "HasIncomingPort": true + }` + + check := func(p *Peer) { + require.Equal(t, "11.22.33.44:6000", p.Addr) + require.True(t, p.Private) + require.True(t, p.Trusted) + require.True(t, p.HasIncomingPort) + require.Equal(t, int64(1506235338), p.LastSeen) + } + + load := func(s string) PeerJSON { + var pj PeerJSON + dec := json.NewDecoder(strings.NewReader(s)) + dec.UseNumber() + err := dec.Decode(&pj) + require.NoError(t, err) + return pj + } + + pj := load(oldFormat) + p, err := newPeerFromJSON(pj) + require.NoError(t, err) + check(p) + + pj = load(newFormat) + p, err = newPeerFromJSON(pj) + require.NoError(t, err) + check(p) +} + +func peersEqualWithSeenAllowedDiff(t *testing.T, expected Peer, actual Peer) { + require.WithinDuration(t, time.Unix(expected.LastSeen, 0), time.Unix(actual.LastSeen, 0), 1*time.Second) + expected.LastSeen = actual.LastSeen + require.Equal(t, expected, actual) +} + +// preparePeerlistFile makes peers.json in temporary dir, +func preparePeerlistFile(t *testing.T) (string, func()) { + f, err := ioutil.TempFile("", PeerCacheFilename) + require.NoError(t, err) + + return f.Name(), func() { + os.Remove(f.Name()) + } +} + +func preparePeerlistDir(t *testing.T) (string, func()) { + f, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + + return f, func() { + os.Remove(f) + } +} + +func persistPeers(t *testing.T, fn string, peers []string) { + t.Helper() + peersMap := make(map[string]*Peer, len(peers)) + for _, p := range peers { + peersMap[p] = NewPeer(p) + } + + if err := file.SaveJSON(fn, peersMap, 0600); err != nil { + panic(fmt.Sprintf("save peer list failed: %v", err)) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex.go new file mode 100644 index 00000000..5e267e3a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex.go @@ -0,0 +1,761 @@ +// Package pex is a toolkit for implementing a peer exchange system +package pex + +import ( + "errors" + "fmt" + "io/ioutil" + "math" + "math/rand" + "net" + "net/http" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" + "sync" + "time" + + "github.com/cenkalti/backoff" + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +//TODO: +// - keep track of last time the peer was connected to +// - last time peer was connected to is more important than "seen" +// - peer "seen" means something else than use here +// - save last time connected to, use 0 for never +// - only transmit peers that have active or recent connections + +const ( + // DefaultPeerListURL is the default URL to download remote peers list from, if enabled + DefaultPeerListURL = "https://downloads.skycoin.com/blockchain/peers.txt" + // PeerCacheFilename filename for disk-cached peers + PeerCacheFilename = "peers.json" + // oldPeerCacheFilename previous filename for disk-cached peers. The cache loader will fall back onto this filename if it can't load peers.json + oldPeerCacheFilename = "peers.txt" + // MaxPeerRetryTimes is the maximum number of times to retry a peer + MaxPeerRetryTimes = 10 +) + +var ( + // ErrPeerlistFull is returned when the Pex is at a maximum + ErrPeerlistFull = errors.New("Peer list full") + // ErrInvalidAddress is returned when an address appears malformed + ErrInvalidAddress = errors.New("Invalid address") + // ErrNoLocalhost is returned if a localhost addresses are not allowed + ErrNoLocalhost = errors.New("Localhost address is not allowed") + // ErrNotExternalIP is returned if an IP address is not a global unicast address + ErrNotExternalIP = errors.New("IP is not a valid external IP") + // ErrPortTooLow is returned if a port is less than 1024 + ErrPortTooLow = errors.New("Port must be >= 1024") + // ErrBlacklistedAddress returned when attempting to add a blacklisted peer + ErrBlacklistedAddress = errors.New("Blacklisted address") + + // Logging. See http://godoc.org/github.com/op/go-logging for + // instructions on how to include this log's output + logger = logging.MustGetLogger("pex") + // Default rng + rnum = rand.New(rand.NewSource(time.Now().Unix())) + // For removing inadvertent whitespace from addresses + whitespaceFilter = regexp.MustCompile(`\s`) +) + +// validateAddress returns a sanitized address if valid, otherwise an error +func validateAddress(ipPort string, allowLocalhost bool) (string, error) { + ipPort = whitespaceFilter.ReplaceAllString(ipPort, "") + pts := strings.Split(ipPort, ":") + if len(pts) != 2 { + return "", ErrInvalidAddress + } + + ip := net.ParseIP(pts[0]) + if ip == nil { + return "", ErrInvalidAddress + } else if ip.IsLoopback() { + if !allowLocalhost { + return "", ErrNoLocalhost + } + } else if !ip.IsGlobalUnicast() { + return "", ErrNotExternalIP + } + + port, err := strconv.ParseUint(pts[1], 10, 16) + if err != nil { + return "", ErrInvalidAddress + } + + if port < 1024 { + return "", ErrPortTooLow + } + + return ipPort, nil +} + +// Peer represents a known peer +type Peer struct { + Addr string // An address of the form ip:port + LastSeen int64 // Unix timestamp when this peer was last seen + Private bool // Whether it should omitted from public requests + Trusted bool // Whether this peer is trusted + HasIncomingPort bool // Whether this peer has accessible public port + UserAgent useragent.Data // Peer's last reported user agent + RetryTimes int `json:"-"` // records the retry times +} + +// NewPeer returns a *Peer initialized by an address string of the form ip:port +func NewPeer(address string) *Peer { + p := &Peer{ + Addr: address, + Private: false, + Trusted: false, + } + p.Seen() + return p +} + +// Seen marks the peer as seen +func (peer *Peer) Seen() { + peer.LastSeen = time.Now().UTC().Unix() +} + +// IncreaseRetryTimes adds the retry times +func (peer *Peer) IncreaseRetryTimes() { + peer.RetryTimes++ + logger.WithFields(logrus.Fields{ + "addr": peer.Addr, + "retryTimes": peer.RetryTimes, + }).Debug("Increase retry times") +} + +// ResetRetryTimes resets the retry time +func (peer *Peer) ResetRetryTimes() { + peer.RetryTimes = 0 +} + +// CanTry returns whether this peer is tryable base on the exponential backoff algorithm +func (peer *Peer) CanTry() bool { + // Exponential backoff + mod := (math.Exp2(float64(peer.RetryTimes)) - 1) * 5 + if mod == 0 { + return true + } + + // Random time elapsed + now := time.Now().UTC().Unix() + t := rnum.Int63n(int64(mod)) + return now-peer.LastSeen > t +} + +// String returns the peer address +func (peer *Peer) String() string { + return peer.Addr +} + +// Config pex config +type Config struct { + // Folder where peers database should be saved + DataDirectory string + // Maximum number of peers to keep account of in the PeerList + Max int + // Cull peers after they havent been seen in this much time + Expiration time.Duration + // Cull expired peers on this interval + CullRate time.Duration + // clear old peers on this interval + ClearOldRate time.Duration + // How often to clear expired blacklist entries + UpdateBlacklistRate time.Duration + // How often to request peers via PEX + RequestRate time.Duration + // How many peers to send back in response to a peers request + ReplyCount int + // Localhost peers are allowed in the peerlist + AllowLocalhost bool + // Disable exchanging of peers. Peers are still loaded from disk + Disabled bool + // Whether the network is disabled + NetworkDisabled bool + // Download peers list from remote host + DownloadPeerList bool + // Download peers list from this URL + PeerListURL string + // Set all peers as untrusted (even if loaded from DefaultConnections) + DisableTrustedPeers bool + // Load peers from this file on disk. NOTE: this is different from the peers file cache in the data directory + CustomPeersFile string + // Default "trusted" connections + DefaultConnections []string +} + +// NewConfig creates default pex config. +func NewConfig() Config { + return Config{ + DataDirectory: "./", + Max: 65535, + Expiration: time.Hour * 24 * 7, + CullRate: time.Minute * 10, + ClearOldRate: time.Minute * 10, + UpdateBlacklistRate: time.Minute, + RequestRate: time.Minute, + ReplyCount: 30, + AllowLocalhost: false, + Disabled: false, + NetworkDisabled: false, + DownloadPeerList: false, + PeerListURL: DefaultPeerListURL, + DisableTrustedPeers: false, + CustomPeersFile: "", + } +} + +// Pex manages a set of known peers and controls peer acquisition +type Pex struct { + sync.RWMutex + // All known peers + peerlist peerlist + Config Config + quit chan struct{} + done chan struct{} +} + +// New creates pex +func New(cfg Config) (*Pex, error) { + pex := &Pex{ + Config: cfg, + peerlist: newPeerlist(), + quit: make(chan struct{}), + done: make(chan struct{}), + } + + // Load peers from disk + if err := pex.loadCache(); err != nil { + logger.Critical().WithError(err).Error("pex.loadCache failed") + return nil, err + } + + // Unset trusted status from any existing peers, regenerate + // them from the DefaultConnections + pex.setAllUntrusted() + + // Load default hardcoded peers, mark them as trusted + for _, addr := range cfg.DefaultConnections { + // Default peers will mark as trusted peers. + if err := pex.AddPeer(addr); err != nil { + logger.Critical().WithError(err).Error("Add default peer failed") + return nil, err + } + if err := pex.setTrusted(addr); err != nil { + logger.Critical().WithError(err).Error("pex.setTrusted for default peer failed") + return nil, err + } + } + + if cfg.DisableTrustedPeers { + // Unset trusted status from any existing peers + pex.setAllUntrusted() + } + + // Add custom peers + if cfg.CustomPeersFile != "" { + if err := pex.loadCustom(cfg.CustomPeersFile); err != nil { + logger.Critical().WithError(err).WithField("file", cfg.CustomPeersFile).Error("Failed to load custom peers file") + return nil, err + } + } + + // Save peers to disk + if err := pex.save(); err != nil { + return nil, err + } + + // Download peers from remote peers list if networking is enabled + if pex.Config.DownloadPeerList && !pex.Config.NetworkDisabled { + go func() { + if err := pex.downloadPeers(); err != nil { + logger.WithError(err).Error("Failed to download peers list") + } + }() + } + + return pex, nil +} + +// Run starts the pex service +func (px *Pex) Run() error { + logger.Info("Pex.Run started") + defer logger.Info("Pex.Run stopped") + defer close(px.done) + + defer func() { + // Save the peerlist + logger.Info("Save peerlist") + if err := px.save(); err != nil { + logger.WithError(err).Error("Save peerlist failed") + } + }() + + clearOldTicker := time.NewTicker(px.Config.ClearOldRate) + + for { + select { + case <-clearOldTicker.C: + // Remove peers we haven't seen in a while + if !px.Config.Disabled && !px.Config.NetworkDisabled { + func() { + px.Lock() + defer px.Unlock() + px.peerlist.clearOld(px.Config.Expiration) + }() + } + case <-px.quit: + return nil + } + } +} + +// Shutdown notifies the pex service to exist +func (px *Pex) Shutdown() { + logger.Info("Shutting down pex") + defer logger.Info("Pex shutdown") + close(px.quit) + <-px.done +} + +func (px *Pex) downloadPeers() error { + body, err := backoffDownloadText(px.Config.PeerListURL) + if err != nil { + logger.WithError(err).WithField("url", px.Config.PeerListURL).Error("Failed to download peers") + return err + } + + peers := parseRemotePeerList(body) + logger.WithField("url", px.Config.PeerListURL).Infof("Downloaded peers list, got %d peers", len(peers)) + + n := px.AddPeers(peers) + logger.WithField("url", px.Config.PeerListURL).Infof("Added %d/%d peers from downloaded peers list", n, len(peers)) + + return nil +} + +func (px *Pex) loadCache() error { + px.Lock() + defer px.Unlock() + + fp := filepath.Join(px.Config.DataDirectory, PeerCacheFilename) + peers, err := loadCachedPeersFile(fp) + + if err != nil { + return err + } + + // If the PeerCacheFilename peers.json file does not exist, try to load the old peers.txt file + if peers == nil { + logger.Infof("Peer cache %s not found, falling back on %s", PeerCacheFilename, oldPeerCacheFilename) + + fp := filepath.Join(px.Config.DataDirectory, oldPeerCacheFilename) + peers, err = loadCachedPeersFile(fp) + if err != nil { + return err + } + + if peers == nil { + logger.Infof("Fallback peer cache %s not found", oldPeerCacheFilename) + return nil + } + } + + // remove invalid peers and limit the max number of peers to pex.Config.Max + var validPeers []Peer + for addr, p := range peers { + if _, err := validateAddress(addr, px.Config.AllowLocalhost); err != nil { + logger.WithError(err).Error("Invalid peer address") + continue + } + + validPeers = append(validPeers, *p) + if px.Config.Max > 0 && len(validPeers) >= px.Config.Max { + break + } + } + + px.peerlist.setPeers(validPeers) + return nil +} + +func (px *Pex) loadCustom(fn string) error { + px.Lock() + defer px.Unlock() + + f, err := os.Open(fn) + if err != nil { + return err + } + + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return err + } + + peers, err := parseLocalPeerList(string(data), px.Config.AllowLocalhost) + if err != nil { + return err + } + + logger.Infof("Loaded %d peers from %s", len(peers), fn) + + px.peerlist.addPeers(peers) + return nil +} + +// SavePeers persists the peerlist +func (px *Pex) save() error { + px.Lock() + defer px.Unlock() + + fn := filepath.Join(px.Config.DataDirectory, PeerCacheFilename) + return px.peerlist.save(fn) +} + +// AddPeer adds a peer to the peer list, given an address. If the peer list is +// full, it will try to remove an old peer to make room. +// If no room can be made, ErrPeerlistFull is returned +func (px *Pex) AddPeer(addr string) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + if px.peerlist.hasPeer(cleanAddr) { + px.peerlist.seen(cleanAddr) + return nil + } + + if px.isFull() { + oldestPeer := px.peerlist.findOldestUntrustedPeer() + if oldestPeer == nil || time.Now().UTC().Unix()-oldestPeer.LastSeen < 60*60*24 { + return ErrPeerlistFull + } + + px.peerlist.removePeer(oldestPeer.Addr) + + if px.isFull() { + // This can happen if the node is run with a peers.json file that has more peers + // than the max peerlist size, then the peers.json file isn't truncated to the max peerlist size. + // It is not an error. + // The max is a soft limit; exceeding the max will not crash the program. + logger.Critical().Error("AddPeer: after removing the worst peer, the peerlist was still full") + } + } + + px.peerlist.addPeer(cleanAddr) + return nil +} + +// AddPeers add multiple peers at once. Any errors will be logged, but not returned +// Returns the number of peers that were added without error. Note that +// adding a duplicate peer will not cause an error. +func (px *Pex) AddPeers(addrs []string) int { + px.Lock() + defer px.Unlock() + + if px.Config.Max > 0 && px.peerlist.len() >= px.Config.Max { + logger.Warning("Add peers failed, peer list is full") + return 0 + } + + // validate the addresses + var validAddrs []string + for _, addr := range addrs { + a, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithField("addr", addr).WithError(err).Info("Add peers sees an invalid address") + continue + } + validAddrs = append(validAddrs, a) + } + addrs = validAddrs + + // Shuffle the addresses before capping them + rand.Shuffle(len(addrs), func(i, j int) { + addrs[i], addrs[j] = addrs[j], addrs[i] + }) + + if px.Config.Max > 0 { + rcap := px.Config.Max - px.peerlist.len() + if len(addrs) > rcap { + addrs = addrs[:rcap] + } + } + + px.peerlist.addPeers(addrs) + return len(addrs) +} + +// SetPrivate updates peer's private value +func (px *Pex) SetPrivate(addr string, private bool) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setPrivate(cleanAddr, private) +} + +// setTrusted marks a peer as a default peer by setting its trusted flag to true +func (px *Pex) setTrusted(addr string) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setTrusted(cleanAddr, true) +} + +// setAllUntrusted unsets the trusted field on all peers +func (px *Pex) setAllUntrusted() { + px.Lock() + defer px.Unlock() + + px.peerlist.setAllUntrusted() +} + +// SetHasIncomingPort sets if the peer has public port +func (px *Pex) SetHasIncomingPort(addr string, hasPublicPort bool) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setHasIncomingPort(cleanAddr, hasPublicPort) +} + +// SetUserAgent sets the peer's user agent +func (px *Pex) SetUserAgent(addr string, userAgent useragent.Data) error { + px.Lock() + defer px.Unlock() + + if !userAgent.Empty() { + if _, err := userAgent.Build(); err != nil { + return err + } + } + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setUserAgent(cleanAddr, userAgent) +} + +// RemovePeer removes peer +func (px *Pex) RemovePeer(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.removePeer(addr) +} + +// GetPeer returns peer of given address +func (px *Pex) GetPeer(addr string) (Peer, bool) { + px.RLock() + defer px.RUnlock() + return px.peerlist.getPeer(addr) +} + +// Trusted returns trusted peers +func (px *Pex) Trusted() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getPeers([]Filter{isTrusted}) +} + +// Private returns private peers +func (px *Pex) Private() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getCanTryPeers([]Filter{isPrivate}) +} + +// TrustedPublic returns trusted public peers +func (px *Pex) TrustedPublic() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getCanTryPeers([]Filter{isPublic, isTrusted}) +} + +// RandomPublic returns N random public untrusted peers +func (px *Pex) RandomPublic(n int) Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.random(n, []Filter{func(p Peer) bool { + return !p.Private + }}) +} + +// RandomExchangeable returns N random exchangeable peers +func (px *Pex) RandomExchangeable(n int) Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.random(n, isExchangeable) +} + +// IncreaseRetryTimes increases retry times +func (px *Pex) IncreaseRetryTimes(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.increaseRetryTimes(addr) +} + +// ResetRetryTimes reset retry times +func (px *Pex) ResetRetryTimes(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.resetRetryTimes(addr) +} + +// ResetAllRetryTimes reset all peers' retry times +func (px *Pex) ResetAllRetryTimes() { + px.Lock() + defer px.Unlock() + px.peerlist.resetAllRetryTimes() +} + +// IsFull returns whether the peer list is full +func (px *Pex) IsFull() bool { + px.RLock() + defer px.RUnlock() + return px.isFull() +} + +func (px *Pex) isFull() bool { + return px.Config.Max > 0 && px.peerlist.len() >= px.Config.Max +} + +// downloadText downloads a text format file from url. +// Returns the raw response body as a string. +// TODO -- move to util, add backoff options +func downloadText(url string) (string, error) { + resp, err := http.Get(url) //nolint:gosec + if err != nil { + return "", err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return string(body), nil +} + +func backoffDownloadText(url string) (string, error) { + var body string + + b := backoff.NewExponentialBackOff() + + notify := func(err error, wait time.Duration) { + logger.WithError(err).WithField("waitTime", wait).Error("waiting to retry downloadText") + } + + operation := func() error { + logger.WithField("url", url).Info("Trying to download peers list") + var err error + body, err = downloadText(url) + return err + } + + if err := backoff.RetryNotify(operation, b, notify); err != nil { + logger.WithField("url", url).WithError(err).Info("Gave up dowloading peers list") + return "", err + } + + logger.WithField("url", url).Info("Peers list downloaded") + + return body, nil +} + +// parseRemotePeerList parses a remote peers.txt file +// The peers list format is newline separated list of ip:port strings +// Any lines that don't parse to an ip:port are skipped, otherwise they return an error +// Localhost ip:port addresses are ignored +// NOTE: this does not parse the cached peers.json file in the data directory, which is a JSON file +// and is loaded by loadCachedPeersFile +func parseRemotePeerList(body string) []string { + var peers []string + for _, addr := range strings.Split(body, "\n") { + addr = whitespaceFilter.ReplaceAllString(addr, "") + if addr == "" { + continue + } + + // Never allow localhost addresses from the remote peers list + a, err := validateAddress(addr, false) + if err != nil { + err = fmt.Errorf("Peers list has invalid address %s: %v", addr, err) + logger.WithError(err).Error() + continue + } + + peers = append(peers, a) + } + + return peers +} + +// parseLocalPeerList parses a local peers.txt file +// The peers list format is newline separated list of ip:port strings +// Empty lines and lines that begin with # are treated as comment lines +// Otherwise, the line is parsed as an ip:port +// If the line fails to parse, an error is returned +// Localhost addresses are allowed if allowLocalhost is true +// NOTE: this does not parse the cached peers.json file in the data directory, which is a JSON file +// and is loaded by loadCachedPeersFile +func parseLocalPeerList(body string, allowLocalhost bool) ([]string, error) { + var peers []string + for _, addr := range strings.Split(body, "\n") { + addr = whitespaceFilter.ReplaceAllString(addr, "") + if addr == "" { + continue + } + + if strings.HasPrefix(addr, "#") { + continue + } + + a, err := validateAddress(addr, allowLocalhost) + if err != nil { + err = fmt.Errorf("Peers list has invalid address %s: %v", addr, err) + logger.WithError(err).Error() + return nil, err + } + + peers = append(peers, a) + } + + return peers, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex_test.go new file mode 100644 index 00000000..eb62a94e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex_test.go @@ -0,0 +1,1610 @@ +package pex + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +func TestValidateAddress(t *testing.T) { + cases := []struct { + addr string + allowLocalhost bool + err error + cleanAddr string + }{ + { + addr: "", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14:100112.32.32.14:101", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14000", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14:66666", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "0.0.0.0:8888", + allowLocalhost: false, + err: ErrNotExternalIP, + }, + { + addr: ":8888", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "224.1.1.1:8888", + allowLocalhost: false, + err: ErrNotExternalIP, + }, + { + addr: "112.32.32.14:0", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:1", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:10", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:100", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:1000", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:1023", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:65536", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14:1024", + allowLocalhost: false, + }, + { + addr: "112.32.32.14:10000", + allowLocalhost: false, + }, + { + addr: "112.32.32.14:65535", + allowLocalhost: false, + }, + { + addr: "127.0.0.1:8888", + allowLocalhost: true, + }, + { + addr: "127.0.0.1:8888", + allowLocalhost: false, + err: ErrNoLocalhost, + }, + { + addr: "11.22.33.44:8080", + allowLocalhost: false, + }, + { + addr: " 11.22.33.44:8080\n", + allowLocalhost: false, + cleanAddr: "11.22.33.44:8080", + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("%+v", tc) + t.Run(name, func(t *testing.T) { + cleanAddr, err := validateAddress(tc.addr, tc.allowLocalhost) + require.Equal(t, tc.err, err) + + if err == nil { + if tc.cleanAddr == "" { + require.Equal(t, tc.addr, cleanAddr) + } else { + require.Equal(t, tc.cleanAddr, cleanAddr) + } + } + }) + } +} + +func TestNewPex(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + config := NewConfig() + config.DataDirectory = dir + config.DefaultConnections = testPeers[:] + + // Add a peer and register it as a default peer. + // It will be marked as "trusted" + // in the peers cache file, but the next time it is loaded, + // it will be reset to untrusted because it is not in the + // cfg.DefaultConnections + addr := "11.22.33.44:5566" + config.DefaultConnections = append(config.DefaultConnections, addr) + + _, err = New(config) + require.NoError(t, err) + + // check if peers are saved to disk + peers, err := loadCachedPeersFile(filepath.Join(dir, PeerCacheFilename)) + require.NoError(t, err) + + require.Equal(t, len(testPeers)+1, len(peers)) + + for _, p := range append(testPeers, addr) { + v, ok := peers[p] + require.True(t, ok) + require.True(t, v.Trusted) + } + + // Recreate pex with the extra peer removed from DefaultConnections + config.DefaultConnections = config.DefaultConnections[:len(config.DefaultConnections)-1] + _, err = New(config) + require.NoError(t, err) + + peers, err = loadCachedPeersFile(filepath.Join(dir, PeerCacheFilename)) + require.NoError(t, err) + + require.Equal(t, len(testPeers)+1, len(peers)) + + for _, p := range testPeers { + v, ok := peers[p] + require.True(t, ok) + require.True(t, v.Trusted) + } + + v, ok := peers[addr] + require.True(t, ok) + require.False(t, v.Trusted) +} + +func TestNewPexDisableTrustedPeers(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + config := NewConfig() + config.DataDirectory = dir + config.DefaultConnections = testPeers[:] + config.DisableTrustedPeers = true + + _, err = New(config) + require.NoError(t, err) + + // check if peers are saved to disk + peers, err := loadCachedPeersFile(filepath.Join(dir, PeerCacheFilename)) + require.NoError(t, err) + + for _, p := range testPeers { + v, ok := peers[p] + require.True(t, ok) + require.False(t, v.Trusted) + } +} + +func TestNewPexLoadCustomPeers(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + fn, err := os.Create(filepath.Join(dir, "custom-peers.txt")) + require.NoError(t, err) + defer fn.Close() + + _, err = fn.Write([]byte(`123.45.67.89:2020 +34.34.21.21:12222 +`)) + require.NoError(t, err) + + err = fn.Close() + require.NoError(t, err) + + config := NewConfig() + config.DataDirectory = dir + config.DefaultConnections = nil + config.CustomPeersFile = fn.Name() + + _, err = New(config) + require.NoError(t, err) + + // check if peers are saved to disk + peers, err := loadCachedPeersFile(filepath.Join(dir, PeerCacheFilename)) + require.NoError(t, err) + + expectedPeers := []string{ + "123.45.67.89:2020", + "34.34.21.21:12222", + } + + for _, p := range expectedPeers { + v, ok := peers[p] + require.True(t, ok) + require.False(t, v.Trusted) + } + + require.Len(t, peers, len(expectedPeers)) +} + +func TestPexLoadPeers(t *testing.T) { + tt := []struct { + name string + filename string + peers []Peer + max int + expectN int + expectPeers []Peer + }{ + { + name: "load all", + filename: PeerCacheFilename, + peers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + max: 2, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + }, + { + name: "reach max", + filename: PeerCacheFilename, + peers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + max: 2, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + }, + { + name: "including invalid addr", + filename: PeerCacheFilename, + peers: []Peer{ + Peer{Addr: wrongPortPeer}, + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + max: 2, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + }, + { + name: "load all, fallback on oldPeerCacheFilename", + filename: oldPeerCacheFilename, + peers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + max: 2, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + }, + { + name: "no peers file", + filename: "foo.json", + peers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + max: 2, + expectN: 0, + expectPeers: nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + // write peers to file + fn := filepath.Join(dir, tc.filename) + defer os.Remove(fn) + + peersMap := make(map[string]Peer) + for _, p := range tc.peers { + peersMap[p.Addr] = p + } + + err = file.SaveJSON(fn, peersMap, 0600) + require.NoError(t, err) + + cfg := NewConfig() + cfg.DataDirectory = dir + cfg.Max = tc.max + + px := Pex{ + peerlist: newPeerlist(), + Config: cfg, + } + + err = px.loadCache() + require.NoError(t, err) + + require.Len(t, px.peerlist.peers, tc.expectN) + + psm := make(map[string]Peer) + for _, p := range tc.expectPeers { + psm[p.Addr] = p + } + + for _, p := range px.peerlist.peers { + v, ok := psm[p.Addr] + require.True(t, ok) + require.Equal(t, v, *p) + } + }) + } +} + +func TestPexAddPeer(t *testing.T) { + now := time.Now().UTC().Unix() + + tt := []struct { + name string + peers []Peer + max int + finalLen int + peer string + err error + removedPeer string + check func(px *Pex) + }{ + { + name: "ok", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + }, + max: 2, + peer: testPeers[1], + err: nil, + finalLen: 2, + }, + { + name: "invalid peer", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + }, + max: 2, + peer: wrongPortPeer, + err: ErrInvalidAddress, + finalLen: 1, + }, + { + name: "peer known", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + { + Addr: testPeers[1], + LastSeen: now - 60, + }, + }, + max: 2, + peer: testPeers[1], + err: nil, + finalLen: 2, + check: func(px *Pex) { + p := px.peerlist.peers[testPeers[1]] + require.NotNil(t, p) + // Peer should have been marked as seen + require.True(t, p.LastSeen > now-60) + }, + }, + { + name: "reach max", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + { + Addr: testPeers[1], + LastSeen: now, + }, + }, + max: 2, + peer: testPeers[3], + err: ErrPeerlistFull, + finalLen: 2, + }, + { + name: "reach max but kicked old peer", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + { + Addr: testPeers[1], + LastSeen: now - 60*60*24*2, + }, + }, + max: 2, + peer: testPeers[3], + err: nil, + finalLen: 2, + removedPeer: testPeers[1], + }, + { + name: "no max", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + { + Addr: testPeers[1], + LastSeen: now, + }, + }, + max: 0, + peer: testPeers[3], + err: nil, + finalLen: 3, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create temp peer list file + dir, removeDir := preparePeerlistDir(t) + defer removeDir() + + // create px config + cfg := NewConfig() + cfg.Max = tc.max + cfg.DataDirectory = dir + cfg.DefaultConnections = []string{} + + // create px instance and load peers + px, err := New(cfg) + require.NoError(t, err) + + px.peerlist.setPeers(tc.peers) + + err = px.AddPeer(tc.peer) + require.Equal(t, tc.err, err) + require.Equal(t, tc.finalLen, len(px.peerlist.peers)) + + if tc.check != nil { + tc.check(px) + } + + if err != nil { + return + } + + // check if the peer is in the peer list + _, ok := px.peerlist.peers[tc.peer] + require.True(t, ok) + + if tc.removedPeer != "" { + _, ok := px.peerlist.peers[tc.removedPeer] + require.False(t, ok) + } + }) + } +} + +func TestPexAddPeers(t *testing.T) { + tt := []struct { + name string + peers []string + max int + addPeers []string + addN int + expectPeers []string + }{ + { + "ok", + testPeers[:1], + 5, + testPeers[1:3], + 2, + testPeers[1:3], + }, + { + "almost full", + testPeers[:1], + 2, + testPeers[1:3], + 1, + testPeers[1:2], + }, + { + "already full", + testPeers[:2], + 2, + testPeers[2:3], + 0, + testPeers[0:0], + }, + { + "including invalid address", + testPeers[:1], + 2, + []string{testPeers[1], wrongPortPeer}, + 1, + testPeers[1:2], + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create temp peer list file + dir, removeDir := preparePeerlistDir(t) + defer removeDir() + + // create px config + cfg := NewConfig() + cfg.Max = tc.max + cfg.DataDirectory = dir + cfg.DefaultConnections = tc.peers + + // create px instance and load peers + px, err := New(cfg) + require.NoError(t, err) + + n := px.AddPeers(tc.addPeers) + require.Equal(t, tc.addN, n) + + for _, p := range tc.expectPeers { + _, ok := px.peerlist.peers[p] + require.True(t, ok) + } + }) + } +} + +func TestPexTrustedPublic(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + + "none peer", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1], Trusted: true, Private: true}, + }, + []Peer{}, + }, + { + + "one trusted public peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + Peer{Addr: testPeers[1], Trusted: true, Private: true}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + }, + }, + { + + "all trust peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + Peer{Addr: testPeers[1], Trusted: true, Private: false}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + Peer{Addr: testPeers[1], Trusted: true, Private: false}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + // get trusted public peers + peers := pex.TrustedPublic() + + require.Equal(t, len(tc.expect), len(peers)) + pm := make(map[string]Peer) + for _, p := range peers { + pm[p.Addr] = p + } + + for _, p := range tc.expect { + v, ok := pm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexRandomExchangeable(t *testing.T) { + tt := []struct { + name string + peers []Peer + n int + expectN int + expectPeers []Peer + }{ + { + name: "n=0 exchangeable=0", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 0, + expectN: 0, + expectPeers: []Peer{}, + }, + { + name: "n=0 exchangeable=1", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 0, + expectN: 1, + expectPeers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + }, + }, + { + name: "n=0 exchangeable=2", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 0, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + }, + }, + { + name: "n=1 exchangeable=0", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 1, + expectN: 0, + expectPeers: []Peer{}, + }, + { + name: "n=1 exchangeable=1", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: false}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 1, + expectN: 1, + expectPeers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + }, + }, + { + name: "n=1 exchangeable=2", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 1, + expectN: 1, + expectPeers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.RandomExchangeable(tc.n) + require.Len(t, peers, tc.expectN) + + // map expectPeers peers + psm := make(map[string]Peer) + for _, p := range tc.expectPeers { + psm[p.Addr] = p + } + + for _, p := range peers { + v, ok := psm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPeerRandomPublic(t *testing.T) { + tt := []struct { + name string + peers []Peer + n int + expectN int + }{ + { + "0 peer", + []Peer{}, + 1, + 0, + }, + { + "1 peer", + []Peer{ + Peer{Addr: testPeers[0]}, + }, + 1, + 1, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.RandomPublic(tc.n) + require.Len(t, peers, tc.expectN) + }) + } +} + +func TestPexRandomPublic(t *testing.T) { + tt := []struct { + name string + peers []Peer + n int + expectN int + expectPeers []Peer + }{ + { + "n=0 public=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 0, + 0, + []Peer{}, + }, + { + "n=0 public=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + Peer{Addr: testPeers[2], Private: true}, + }, + 0, + 2, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + }, + }, + { + "n=1 public=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 1, + 0, + []Peer{}, + }, + { + "n=1 public=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + Peer{Addr: testPeers[2], Private: true}, + }, + 1, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + }, + }, + { + "n=2 public=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 2, + 0, + []Peer{}, + }, + { + "n=2 public=1", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 2, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + }, + }, + { + "n=2 public=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + Peer{Addr: testPeers[2], Private: true}, + }, + 2, + 2, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + // get N random public + peers := pex.RandomPublic(tc.n) + + require.Len(t, peers, tc.expectN) + + // map the peers + psm := make(map[string]Peer) + for _, p := range tc.expectPeers { + psm[p.Addr] = p + } + + // check if the returned peers are in the expectPeers + for _, p := range peers { + v, ok := psm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexTrusted(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + + "no trust peer", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + []Peer{}, + }, + { + + "one trust peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + Peer{Addr: testPeers[1]}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + }, + }, + { + + "all trust peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + Peer{Addr: testPeers[1], Trusted: true}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + Peer{Addr: testPeers[1], Trusted: true}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.Trusted() + require.Equal(t, len(tc.expect), len(peers)) + + pm := make(map[string]Peer) + for _, p := range peers { + pm[p.Addr] = p + } + + for _, p := range tc.expect { + v, ok := pm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexPrivate(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + + "no private peer", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + []Peer{}, + }, + { + + "one private peer", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1]}, + }, + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + }, + }, + { + + "all trust peer", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + }, + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.Private() + require.Equal(t, len(tc.expect), len(peers)) + + pm := make(map[string]Peer) + for _, p := range peers { + pm[p.Addr] = p + } + + for _, p := range tc.expect { + v, ok := pm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexResetAllRetryTimes(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + "all", + []Peer{ + Peer{Addr: testPeers[0], RetryTimes: 1}, + Peer{Addr: testPeers[1], RetryTimes: 2}, + }, + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + pex.ResetAllRetryTimes() + + for _, p := range tc.expect { + v, ok := pex.peerlist.peers[p.Addr] + require.True(t, ok) + require.Equal(t, p, *v) + } + }) + } +} + +func TestPexIncreaseRetryTimes(t *testing.T) { + tt := []struct { + name string + peers []Peer + addr string + expect map[string]Peer + }{ + { + "addr not exist", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + testPeers[2], + map[string]Peer{ + testPeers[0]: Peer{Addr: testPeers[0]}, + testPeers[1]: Peer{Addr: testPeers[1]}, + }, + }, + { + "ok", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + testPeers[0], + map[string]Peer{ + testPeers[0]: Peer{Addr: testPeers[0], LastSeen: time.Now().UTC().Unix(), RetryTimes: 1}, + testPeers[1]: Peer{Addr: testPeers[1]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + pex.IncreaseRetryTimes(tc.addr) + + require.Equal(t, len(tc.expect), len(pex.peerlist.peers)) + for k, v := range tc.expect { + p, ok := pex.peerlist.peers[k] + require.True(t, ok) + if p.LastSeen != 0 { + require.InDelta(t, v.LastSeen, p.LastSeen, 2) + p.LastSeen = 0 + v.LastSeen = 0 + } + require.Equal(t, v, *p) + } + }) + } +} + +func TestPexResetRetryTimes(t *testing.T) { + tt := []struct { + name string + peers []Peer + addr string + expect []Peer + }{ + { + "no peer need reset", + []Peer{*NewPeer(testPeers[0]), *NewPeer(testPeers[1])}, + testPeers[2], + []Peer{*NewPeer(testPeers[0]), *NewPeer(testPeers[1])}, + }, + { + "reset one", + []Peer{ + Peer{Addr: testPeers[0], LastSeen: time.Now().UTC().Unix(), RetryTimes: 10}, + Peer{Addr: testPeers[1], RetryTimes: 2}, + }, + testPeers[0], + []Peer{ + Peer{Addr: testPeers[0], LastSeen: time.Now().UTC().Unix()}, + Peer{Addr: testPeers[1], RetryTimes: 2}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + pex.ResetRetryTimes(tc.addr) + + for _, p := range tc.expect { + v, ok := pex.peerlist.peers[p.Addr] + require.True(t, ok) + require.Equal(t, p, *v) + } + }) + } +} + +func TestPexRemovePeer(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + removePeer string + expect map[string]*Peer + }{ + { + "remove from empty peer list", + []Peer{}, + testPeers[0], + map[string]*Peer{}, + }, + { + "remove one", + []Peer{*NewPeer(testPeers[0]), *NewPeer(testPeers[1])}, + testPeers[0], + map[string]*Peer{ + testPeers[1]: NewPeer(testPeers[1]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeers) + + pex.RemovePeer(tc.removePeer) + + require.Equal(t, len(tc.expect), len(pex.peerlist.peers)) + for k, v := range tc.expect { + p, ok := pex.peerlist.peers[k] + require.True(t, ok) + require.Equal(t, *v, *p) + } + }) + } +} + +func TestPexSetPrivate(t *testing.T) { + tt := []struct { + name string + initPeer []Peer + peer string + private bool + err error + }{ + { + "set private true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + true, + nil, + }, + { + "set private false", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + false, + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + false, + fmt.Errorf("set peer.Private failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeer) + + err := pex.SetPrivate(tc.peer, tc.private) + require.Equal(t, tc.err, err) + if err != nil { + return + } + p, ok := pex.peerlist.peers[tc.peer] + require.True(t, ok) + + require.Equal(t, tc.private, p.Private) + }) + } +} + +func TestPexSetTrusted(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + peer string + err error + }{ + { + "set trust true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + // init peer + pex.peerlist.setPeers(tc.initPeers) + + err := pex.setTrusted(tc.peer) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + p, ok := pex.peerlist.peers[tc.peer] + require.True(t, ok) + require.True(t, p.Trusted) + }) + } +} + +func TestPexSetHasIncomingPort(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + peer string + hasIncomingPort bool + err error + }{ + { + "set has incoming port true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + true, + nil, + }, + { + "set has incoming port false", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + false, + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + false, + fmt.Errorf("set peer.HasIncomingPort failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeers) + + err := pex.SetHasIncomingPort(tc.peer, tc.hasIncomingPort) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + p, ok := pex.peerlist.peers[tc.peer] + require.True(t, ok) + require.Equal(t, tc.hasIncomingPort, p.HasIncomingPort) + }) + } +} + +func TestPexGetPeerByAddr(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + addr string + find bool + peer Peer + }{ + { + "ok", + []Peer{ + *NewPeer(testPeers[0]), + *NewPeer(testPeers[1]), + }, + testPeers[0], + true, + *NewPeer(testPeers[0]), + }, + { + "not exist", + []Peer{ + *NewPeer(testPeers[0]), + *NewPeer(testPeers[1]), + }, + testPeers[2], + false, + Peer{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeers) + + p, ok := pex.GetPeer(tc.addr) + require.Equal(t, tc.find, ok) + if ok { + require.Equal(t, tc.peer, p) + } + }) + } +} + +func TestPexIsFull(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + Config: Config{Max: 0}, + } + + require.False(t, pex.IsFull()) + + err := pex.AddPeer("11.22.33.44:5555") + require.NoError(t, err) + require.False(t, pex.IsFull()) + + pex.Config.Max = 2 + require.False(t, pex.IsFull()) + err = pex.AddPeer("33.44.55.66:5555") + require.NoError(t, err) + require.True(t, pex.IsFull()) + + pex.Config.Max = 1 + require.True(t, pex.IsFull()) +} + +func TestParseRemotePeerList(t *testing.T) { + body := `11.22.33.44:5555 +66.55.44.33:2020 +# comment + +127.0.0.1:8080 + 54.54.32.32:7899 +11.33.11.33 +22.44.22.44:99 +` + + peers := parseRemotePeerList(body) + require.Len(t, peers, 3) + require.Equal(t, []string{ + "11.22.33.44:5555", + "66.55.44.33:2020", + "54.54.32.32:7899", + }, peers) +} + +func TestParseLocalPeerList(t *testing.T) { + cases := []struct { + name string + body string + peers []string + allowLocalhost bool + err error + }{ + { + name: "valid, no localhost", + body: `11.22.33.44:5555 +66.55.44.33:2020 +# comment + + 54.54.32.32:7899 +`, + peers: []string{ + "11.22.33.44:5555", + "66.55.44.33:2020", + "54.54.32.32:7899", + }, + allowLocalhost: false, + }, + + { + name: "valid, localhost", + body: `11.22.33.44:5555 +66.55.44.33:2020 +# comment + +127.0.0.1:8080 + 54.54.32.32:7899 +`, + peers: []string{ + "11.22.33.44:5555", + "66.55.44.33:2020", + "127.0.0.1:8080", + "54.54.32.32:7899", + }, + allowLocalhost: true, + }, + + { + name: "invalid, contains localhost but no localhost allowed", + body: `11.22.33.44:5555 +66.55.44.33:2020 +# comment + +127.0.0.1:8080 + 54.54.32.32:7899 +`, + err: fmt.Errorf("Peers list has invalid address 127.0.0.1:8080: %v", ErrNoLocalhost), + allowLocalhost: false, + }, + + { + name: "invalid, bad address", + body: `11.22.33.44:5555 +66.55.44.33:2020 +# comment + + 54.54.32.32:99 +`, + err: fmt.Errorf("Peers list has invalid address 54.54.32.32:99: %v", ErrPortTooLow), + allowLocalhost: false, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + peers, err := parseLocalPeerList(tc.body, tc.allowLocalhost) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + require.Equal(t, tc.peers, peers) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pool.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pool.go new file mode 100644 index 00000000..9ecb9c7f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pool.go @@ -0,0 +1,124 @@ +package daemon + +import ( + "time" + + "github.com/SkycoinProject/skycoin/src/daemon/gnet" +) + +// PoolConfig pool config +type PoolConfig struct { + // Timeout when trying to connect to new peers through the pool + DialTimeout time.Duration + // How often to process message buffers and generate events + MessageHandlingRate time.Duration + // How long to wait before sending another ping + PingRate time.Duration + // How long a connection can idle before considered stale + IdleLimit time.Duration + // How often to check for needed pings + IdleCheckRate time.Duration + // How often to check for stale connections + ClearStaleRate time.Duration + // Buffer size for gnet.ConnectionPool's network Read events + EventChannelSize int + // Maximum number of connections + MaxConnections int + // Maximum number of outgoing connections + MaxOutgoingConnections int + // Maximum number of outgoing connections to peers in the DefaultConnections list to maintain + MaxDefaultPeerOutgoingConnections int + // Default "trusted" peers + DefaultConnections []string + // Maximum length of incoming messages in bytes + MaxIncomingMessageLength int + // Maximum length of outgoing messages in bytes + MaxOutgoingMessageLength int + // These should be assigned by the controlling daemon + address string + port int +} + +// NewPoolConfig creates pool config +func NewPoolConfig() PoolConfig { + return PoolConfig{ + port: 6677, + address: "", + DialTimeout: time.Second * 30, + MessageHandlingRate: time.Millisecond * 50, + PingRate: 5 * time.Second, + IdleLimit: 60 * time.Second, + IdleCheckRate: 1 * time.Second, + ClearStaleRate: 1 * time.Second, + EventChannelSize: 4096, + MaxConnections: 128, + MaxOutgoingConnections: 8, + MaxDefaultPeerOutgoingConnections: 1, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + } +} + +// Pool maintains config and pool +type Pool struct { + Config PoolConfig + Pool *gnet.ConnectionPool +} + +// NewPool creates pool +func NewPool(cfg PoolConfig, d *Daemon) (*Pool, error) { + gnetCfg := gnet.NewConfig() + gnetCfg.DialTimeout = cfg.DialTimeout + gnetCfg.Port = uint16(cfg.port) + gnetCfg.Address = cfg.address + gnetCfg.ConnectCallback = d.onGnetConnect + gnetCfg.DisconnectCallback = d.onGnetDisconnect + gnetCfg.ConnectFailureCallback = d.onGnetConnectFailure + gnetCfg.MaxConnections = cfg.MaxConnections + gnetCfg.MaxOutgoingConnections = cfg.MaxOutgoingConnections + gnetCfg.MaxDefaultPeerOutgoingConnections = cfg.MaxDefaultPeerOutgoingConnections + gnetCfg.DefaultConnections = cfg.DefaultConnections + gnetCfg.MaxIncomingMessageLength = cfg.MaxIncomingMessageLength + gnetCfg.MaxOutgoingMessageLength = cfg.MaxOutgoingMessageLength + + pool, err := gnet.NewConnectionPool(gnetCfg, d) + if err != nil { + return nil, err + } + + return &Pool{ + Config: cfg, + Pool: pool, + }, nil +} + +// Shutdown closes all connections and stops listening +func (pool *Pool) Shutdown() { + if pool == nil { + return + } + pool.Pool.Shutdown() +} + +// Run starts listening on the configured Port +func (pool *Pool) Run() error { + logger.Infof("daemon.Pool listening on port %d", pool.Config.port) + return pool.Pool.Run() +} + +// RunOffline runs the pool without a listener. This is necessary to process strand requests. +func (pool *Pool) RunOffline() error { + return pool.Pool.RunOffline() +} + +// sendPings send a ping if our last message sent was over pingRate ago +func (pool *Pool) sendPings() { + if err := pool.Pool.SendPings(pool.Config.PingRate, &PingMessage{}); err != nil { + logger.WithError(err).Error("sendPings failed") + } +} + +// getStaleConnections returns connections that have been idle for longer than idleLimit +func (pool *Pool) getStaleConnections() ([]string, error) { + return pool.Pool.GetStaleConnections(pool.Config.IdleLimit) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder.go new file mode 100644 index 00000000..57e768b1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder.go @@ -0,0 +1,528 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeSignedBlock computes the size of an encoded object of type SignedBlock +func encodeSizeSignedBlock(obj *coin.SignedBlock) uint64 { + i0 := uint64(0) + + // obj.Block.Head.Version + i0 += 4 + + // obj.Block.Head.Time + i0 += 8 + + // obj.Block.Head.BkSeq + i0 += 8 + + // obj.Block.Head.Fee + i0 += 8 + + // obj.Block.Head.PrevHash + i0 += 32 + + // obj.Block.Head.BodyHash + i0 += 32 + + // obj.Block.Head.UxHash + i0 += 32 + + // obj.Block.Body.Transactions + i0 += 4 + for _, x1 := range obj.Block.Body.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + // obj.Sig + i0 += 65 + + return i0 +} + +// encodeSignedBlock encodes an object of type SignedBlock to a buffer allocated to the exact size +// required to encode the object. +func encodeSignedBlock(obj *coin.SignedBlock) ([]byte, error) { + n := encodeSizeSignedBlock(obj) + buf := make([]byte, n) + + if err := encodeSignedBlockToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeSignedBlockToBuffer encodes an object of type SignedBlock to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeSignedBlockToBuffer(buf []byte, obj *coin.SignedBlock) error { + if uint64(len(buf)) < encodeSizeSignedBlock(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Block.Head.Version + e.Uint32(obj.Block.Head.Version) + + // obj.Block.Head.Time + e.Uint64(obj.Block.Head.Time) + + // obj.Block.Head.BkSeq + e.Uint64(obj.Block.Head.BkSeq) + + // obj.Block.Head.Fee + e.Uint64(obj.Block.Head.Fee) + + // obj.Block.Head.PrevHash + e.CopyBytes(obj.Block.Head.PrevHash[:]) + + // obj.Block.Head.BodyHash + e.CopyBytes(obj.Block.Head.BodyHash[:]) + + // obj.Block.Head.UxHash + e.CopyBytes(obj.Block.Head.UxHash[:]) + + // obj.Block.Body.Transactions maxlen check + if len(obj.Block.Body.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Block.Body.Transactions length check + if uint64(len(obj.Block.Body.Transactions)) > math.MaxUint32 { + return errors.New("obj.Block.Body.Transactions length exceeds math.MaxUint32") + } + + // obj.Block.Body.Transactions length + e.Uint32(uint32(len(obj.Block.Body.Transactions))) + + // obj.Block.Body.Transactions + for _, x := range obj.Block.Body.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + // obj.Sig + e.CopyBytes(obj.Sig[:]) + + return nil +} + +// decodeSignedBlock decodes an object of type SignedBlock from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeSignedBlock(buf []byte, obj *coin.SignedBlock) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Block.Head.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Block.Head.Version = i + } + + { + // obj.Block.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Head.Time = i + } + + { + // obj.Block.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Head.BkSeq = i + } + + { + // obj.Block.Head.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Head.Fee = i + } + + { + // obj.Block.Head.PrevHash + if len(d.Buffer) < len(obj.Block.Head.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Head.PrevHash[:], d.Buffer[:len(obj.Block.Head.PrevHash)]) + d.Buffer = d.Buffer[len(obj.Block.Head.PrevHash):] + } + + { + // obj.Block.Head.BodyHash + if len(d.Buffer) < len(obj.Block.Head.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Head.BodyHash[:], d.Buffer[:len(obj.Block.Head.BodyHash)]) + d.Buffer = d.Buffer[len(obj.Block.Head.BodyHash):] + } + + { + // obj.Block.Head.UxHash + if len(d.Buffer) < len(obj.Block.Head.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Head.UxHash[:], d.Buffer[:len(obj.Block.Head.UxHash)]) + d.Buffer = d.Buffer[len(obj.Block.Head.UxHash):] + } + + { + // obj.Block.Body.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions = make([]coin.Transaction, length) + + for z3 := range obj.Block.Body.Transactions { + { + // obj.Block.Body.Transactions[z3].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Length = i + } + + { + // obj.Block.Body.Transactions[z3].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Type = i + } + + { + // obj.Block.Body.Transactions[z3].InnerHash + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].InnerHash[:], d.Buffer[:len(obj.Block.Body.Transactions[z3].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].InnerHash):] + } + + { + // obj.Block.Body.Transactions[z3].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions[z3].Sigs = make([]cipher.Sig, length) + + for z5 := range obj.Block.Body.Transactions[z3].Sigs { + { + // obj.Block.Body.Transactions[z3].Sigs[z5] + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].Sigs[z5]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].Sigs[z5][:], d.Buffer[:len(obj.Block.Body.Transactions[z3].Sigs[z5])]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].Sigs[z5]):] + } + + } + } + } + + { + // obj.Block.Body.Transactions[z3].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions[z3].In = make([]cipher.SHA256, length) + + for z5 := range obj.Block.Body.Transactions[z3].In { + { + // obj.Block.Body.Transactions[z3].In[z5] + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].In[z5]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].In[z5][:], d.Buffer[:len(obj.Block.Body.Transactions[z3].In[z5])]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].In[z5]):] + } + + } + } + } + + { + // obj.Block.Body.Transactions[z3].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions[z3].Out = make([]coin.TransactionOutput, length) + + for z5 := range obj.Block.Body.Transactions[z3].Out { + { + // obj.Block.Body.Transactions[z3].Out[z5].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Out[z5].Address.Version = i + } + + { + // obj.Block.Body.Transactions[z3].Out[z5].Address.Key + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].Out[z5].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].Out[z5].Address.Key[:], d.Buffer[:len(obj.Block.Body.Transactions[z3].Out[z5].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].Out[z5].Address.Key):] + } + + { + // obj.Block.Body.Transactions[z3].Out[z5].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Out[z5].Coins = i + } + + { + // obj.Block.Body.Transactions[z3].Out[z5].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Out[z5].Hours = i + } + + } + } + } + } + } + } + + { + // obj.Sig + if len(d.Buffer) < len(obj.Sig) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sig[:], d.Buffer[:len(obj.Sig)]) + d.Buffer = d.Buffer[len(obj.Sig):] + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeSignedBlockExact decodes an object of type SignedBlock from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeSignedBlockExact(buf []byte, obj *coin.SignedBlock) error { + if n, err := decodeSignedBlock(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder_test.go new file mode 100644 index 00000000..bfe2b78e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder_test.go @@ -0,0 +1,422 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +func newEmptySignedBlockForEncodeTest() *coin.SignedBlock { + var obj coin.SignedBlock + return &obj +} + +func newRandomSignedBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.SignedBlock { + var obj coin.SignedBlock + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenSignedBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.SignedBlock { + var obj coin.SignedBlock + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilSignedBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.SignedBlock { + var obj coin.SignedBlock + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderSignedBlock(t *testing.T, obj *coin.SignedBlock) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeSignedBlock(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeSignedBlock() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeSignedBlock(obj) + if err != nil { + t.Fatalf("encodeSignedBlock failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeSignedBlock produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeSignedBlock()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeSignedBlockToBuffer(data3, obj); err != nil { + t.Fatalf("encodeSignedBlockToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 coin.SignedBlock + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 coin.SignedBlock + if n, err := decodeSignedBlock(data2, &obj3); err != nil { + t.Fatalf("decodeSignedBlock failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeSignedBlock bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSignedBlock()") + } + + // Decode, excess buffer + var obj4 coin.SignedBlock + n, err := decodeSignedBlock(data3, &obj4) + if err != nil { + t.Fatalf("decodeSignedBlock failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeSignedBlock bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeSignedBlock bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSignedBlock()") + } + + // DecodeExact + var obj5 coin.SignedBlock + if err := decodeSignedBlockExact(data2, &obj5); err != nil { + t.Fatalf("decodeSignedBlock failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSignedBlock()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeSignedBlock(data4, &obj3); err != nil { + t.Fatalf("decodeSignedBlock failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeSignedBlock bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderSignedBlock(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *coin.SignedBlock + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptySignedBlockForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomSignedBlockForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenSignedBlockForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilSignedBlockForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderSignedBlock(t, tc.obj) + }) + } +} + +func decodeSignedBlockExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.SignedBlock + if _, err := decodeSignedBlock(buf, &obj); err == nil { + t.Fatal("decodeSignedBlock: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeSignedBlock: expected error %q, got %q", expectedErr, err) + } +} + +func decodeSignedBlockExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.SignedBlock + if err := decodeSignedBlockExact(buf, &obj); err == nil { + t.Fatal("decodeSignedBlockExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeSignedBlockExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderSignedBlockDecodeErrors(t *testing.T, k int, tag string, obj *coin.SignedBlock) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeSignedBlock(obj) + buf, err := encodeSignedBlock(obj) + if err != nil { + t.Fatalf("encodeSignedBlock failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeSignedBlockExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeSignedBlockExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeSignedBlockExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeSignedBlockExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeSignedBlockExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderSignedBlockDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptySignedBlockForEncodeTest() + fullObj := newRandomSignedBlockForEncodeTest(t, rand) + testSkyencoderSignedBlockDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderSignedBlockDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/strand/strand.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/strand/strand.go new file mode 100644 index 00000000..5bdfbc67 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/strand/strand.go @@ -0,0 +1,135 @@ +/* +Package strand is a utility for linearizing method calls, similar to locking. + +The strand method is functionally similar to a lock, but operates on a queue +of method calls. +*/ +package strand + +import ( + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +const ( + // logDurationThreshold is how long to wait before reporting a function call's time + logDurationThreshold = time.Millisecond * 100 + // writeWait is how long to wait to write to a request channel before logging the delay + logQueueRequestWaitThreshold = time.Second * 1 +) + +var ( + // Debug enables debug logging + Debug = false +) + +// Request is sent to the channel provided to Strand +type Request struct { + Name string + Func func() error +} + +// Strand linearizes concurrent method calls through a single channel, +// to avoid concurrency issues when conflicting methods are called from +// multiple goroutines. +// Methods passed to Strand() will block until completed. +// Strand accepts a quit channel and will return quitErr if the quit +// channel closes. +func Strand(logger *logging.Logger, c chan Request, name string, f func() error, quit chan struct{}, quitErr error) error { + if Debug { + logger.WithField("operation", name).Debug("Strand precall") + } + + done := make(chan struct{}) + var err error + + req := Request{ + Name: name, + Func: func() error { + defer close(done) + + // TODO: record time statistics in a data structure and expose stats via an API + // logger.Debugf("%s begin", name) + + t := time.Now() + + // Log function duration at an exponential time interval, + // this will notify us of any long running functions to look at. + go func() { + threshold := logDurationThreshold + t := time.NewTimer(threshold) + defer t.Stop() + + for { + t0 := time.Now() + select { + case <-quit: + return + case <-done: + return + case <-t.C: + logger.WithFields(logrus.Fields{ + "operation": name, + "threshold": threshold, + }).Warning("Strand operation exceeded threshold") + threshold *= 10 + t.Reset(threshold) + } + t1 := time.Now() + logger.WithField("elapsed", t1.Sub(t0)).Info() + } + }() + + if Debug { + logger.WithField("operation", name).Debug("Stranding") + } + + err = f() + + // Notify us if the function call took too long + elapsed := time.Since(t) + if elapsed > logDurationThreshold { + logger.WithFields(logrus.Fields{ + "operation": name, + "elapsed": elapsed, + }).Warning() + } else if Debug { + logger.WithFields(logrus.Fields{ + "operation": name, + "elapsed": elapsed, + }).Debug() + } + + return err + }, + } + + // Log a message if waiting too long to write due to a full queue + t := time.Now() +loop: + for { + select { + case <-quit: + return quitErr + case c <- req: + break loop + case <-time.After(logQueueRequestWaitThreshold): + logger.Warningf("Waited %s while trying to write %s to the strand request channel", time.Since(t), req.Name) + } + } + + t = time.Now() + for { + select { + case <-quit: + return quitErr + case <-done: + return err + case <-time.After(logQueueRequestWaitThreshold): + logger.Warningf("Waited %s while waiting for %s to be done or quit", time.Since(t), req.Name) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-blocks-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-blocks-msg.golden new file mode 100644 index 00000000..f3f11cfa Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-blocks-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-txns-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-txns-msg.golden new file mode 100644 index 00000000..3ecbd103 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-txns-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-blocks-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-blocks-msg.golden new file mode 100644 index 00000000..375a53cb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-blocks-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-peers-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-peers-msg.golden new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-txns-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-txns-msg.golden new file mode 100644 index 00000000..0a34e926 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-txns-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-blocks-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-blocks-msg.golden new file mode 100644 index 00000000..726b8f5e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-blocks-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-peers-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-peers-msg.golden new file mode 100644 index 00000000..bfb63a68 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-peers-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-txns-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-txns-msg.golden new file mode 100644 index 00000000..cee5b302 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-txns-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg-extra.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg-extra.golden new file mode 100644 index 00000000..e35db5b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg-extra.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg.golden new file mode 100644 index 00000000..f2b19513 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/ping-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/ping-msg.golden new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/pong-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/pong-msg.golden new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder.go new file mode 100644 index 00000000..1db55f86 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder.go @@ -0,0 +1,358 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeTransaction computes the size of an encoded object of type Transaction +func encodeSizeTransaction(obj *coin.Transaction) uint64 { + i0 := uint64(0) + + // obj.Length + i0 += 4 + + // obj.Type + i0++ + + // obj.InnerHash + i0 += 32 + + // obj.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Sigs)) * i1 + } + + // obj.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.In)) * i1 + } + + // obj.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Out)) * i1 + } + + return i0 +} + +// encodeTransaction encodes an object of type Transaction to a buffer allocated to the exact size +// required to encode the object. +func encodeTransaction(obj *coin.Transaction) ([]byte, error) { + n := encodeSizeTransaction(obj) + buf := make([]byte, n) + + if err := encodeTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionToBuffer encodes an object of type Transaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionToBuffer(buf []byte, obj *coin.Transaction) error { + if uint64(len(buf)) < encodeSizeTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Length + e.Uint32(obj.Length) + + // obj.Type + e.Uint8(obj.Type) + + // obj.InnerHash + e.CopyBytes(obj.InnerHash[:]) + + // obj.Sigs maxlen check + if len(obj.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Sigs length check + if uint64(len(obj.Sigs)) > math.MaxUint32 { + return errors.New("obj.Sigs length exceeds math.MaxUint32") + } + + // obj.Sigs length + e.Uint32(uint32(len(obj.Sigs))) + + // obj.Sigs + for _, x := range obj.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.In maxlen check + if len(obj.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.In length check + if uint64(len(obj.In)) > math.MaxUint32 { + return errors.New("obj.In length exceeds math.MaxUint32") + } + + // obj.In length + e.Uint32(uint32(len(obj.In))) + + // obj.In + for _, x := range obj.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Out maxlen check + if len(obj.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Out length check + if uint64(len(obj.Out)) > math.MaxUint32 { + return errors.New("obj.Out length exceeds math.MaxUint32") + } + + // obj.Out length + e.Uint32(uint32(len(obj.Out))) + + // obj.Out + for _, x := range obj.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + return nil +} + +// decodeTransaction decodes an object of type Transaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransaction(buf []byte, obj *coin.Transaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Length = i + } + + { + // obj.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Type = i + } + + { + // obj.InnerHash + if len(d.Buffer) < len(obj.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.InnerHash[:], d.Buffer[:len(obj.InnerHash)]) + d.Buffer = d.Buffer[len(obj.InnerHash):] + } + + { + // obj.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Sigs = make([]cipher.Sig, length) + + for z1 := range obj.Sigs { + { + // obj.Sigs[z1] + if len(d.Buffer) < len(obj.Sigs[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sigs[z1][:], d.Buffer[:len(obj.Sigs[z1])]) + d.Buffer = d.Buffer[len(obj.Sigs[z1]):] + } + + } + } + } + + { + // obj.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.In = make([]cipher.SHA256, length) + + for z1 := range obj.In { + { + // obj.In[z1] + if len(d.Buffer) < len(obj.In[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.In[z1][:], d.Buffer[:len(obj.In[z1])]) + d.Buffer = d.Buffer[len(obj.In[z1]):] + } + + } + } + } + + { + // obj.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Out = make([]coin.TransactionOutput, length) + + for z1 := range obj.Out { + { + // obj.Out[z1].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out[z1].Address.Version = i + } + + { + // obj.Out[z1].Address.Key + if len(d.Buffer) < len(obj.Out[z1].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out[z1].Address.Key[:], d.Buffer[:len(obj.Out[z1].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out[z1].Address.Key):] + } + + { + // obj.Out[z1].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Coins = i + } + + { + // obj.Out[z1].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionExact decodes an object of type Transaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionExact(buf []byte, obj *coin.Transaction) error { + if n, err := decodeTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder_test.go new file mode 100644 index 00000000..a2040bde --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder_test.go @@ -0,0 +1,422 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +func newEmptyTransactionForEncodeTest() *coin.Transaction { + var obj coin.Transaction + return &obj +} + +func newRandomTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Transaction { + var obj coin.Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Transaction { + var obj coin.Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Transaction { + var obj coin.Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransaction(t *testing.T, obj *coin.Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransaction(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransaction() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransaction produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransaction()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 coin.Transaction + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 coin.Transaction + if n, err := decodeTransaction(data2, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Decode, excess buffer + var obj4 coin.Transaction + n, err := decodeTransaction(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // DecodeExact + var obj5 coin.Transaction + if err := decodeTransactionExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransaction(data4, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransaction(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *coin.Transaction + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransaction(t, tc.obj) + }) + } +} + +func decodeTransactionExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.Transaction + if _, err := decodeTransaction(buf, &obj); err == nil { + t.Fatal("decodeTransaction: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransaction: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.Transaction + if err := decodeTransactionExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionDecodeErrors(t *testing.T, k int, tag string, obj *coin.Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransaction(obj) + buf, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionForEncodeTest() + fullObj := newRandomTransactionForEncodeTest(t, rand) + testSkyencoderTransactionDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/fiber/config.go b/vendor/github.com/SkycoinProject/skycoin/src/fiber/config.go new file mode 100644 index 00000000..ed76effd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/fiber/config.go @@ -0,0 +1,177 @@ +/* +Package fiber provides configuration definitions and utilities for managing fiber coins +*/ +package fiber + +import ( + "fmt" + "strings" + + "github.com/spf13/viper" + + "github.com/SkycoinProject/skycoin/src/cipher/bip44" +) + +// Config records fiber coin parameters +type Config struct { + Node NodeConfig `mapstructure:"node"` + Params ParamsConfig `mapstructure:"params"` +} + +// NodeConfig configures the default CLI options for the skycoin node. +// These parameters are loaded via cmd/skycoin/skycoin.go into src/SkycoinProject/skycoin.go. +type NodeConfig struct { + // Port is the default port that the wire protocol communicates over + Port int `mapstructure:"port"` + // WebInterfacePort is the default port that the web/gui interface serves on + WebInterfacePort int `mapstructure:"web_interface_port"` + // GenesisSignatureStr is a hex-encoded signature of the genesis block input + GenesisSignatureStr string `mapstructure:"genesis_signature_str"` + // GenesisAddressStr is the skycoin address that the genesis coins were sent to in the genesis block + GenesisAddressStr string `mapstructure:"genesis_address_str"` + // BlockchainPubkeyStr is a hex-encoded public key used to validate published blocks + BlockchainPubkeyStr string `mapstructure:"blockchain_pubkey_str"` + // BlockchainSeckey is a hex-encoded secret key required for block publishing. + // It must correspond to BlockchainPubkeyStr + BlockchainSeckeyStr string `mapstructure:"blockchain_seckey_str"` + // GenesisTimestamp is the timestamp of the genesis block + GenesisTimestamp uint64 `mapstructure:"genesis_timestamp"` + // GenesisCoinVolume is the total number of coins in the genesis block + GenesisCoinVolume uint64 `mapstructure:"genesis_coin_volume"` + // DefaultConnections are the default "trusted" connections a node will try to connect to for bootstrapping + DefaultConnections []string `mapstructure:"default_connections"` + // PeerlistURL is a URL pointing to a newline-separated list of ip:ports that are used for bootstrapping (but they are not "trusted") + PeerListURL string `mapstructure:"peer_list_url"` + + // UnconfirmedBurnFactor is the burn factor to apply when verifying unconfirmed transactions + UnconfirmedBurnFactor uint32 `mapstructure:"unconfirmed_burn_factor"` + // UnconfirmedMaxTransactionSize is the maximum size of an unconfirmed transaction + UnconfirmedMaxTransactionSize uint32 `mapstructure:"unconfirmed_max_transaction_size"` + // UnconfirmedMaxDropletPrecision is the maximum number of decimals allowed in an unconfirmed transaction + UnconfirmedMaxDropletPrecision uint8 `mapstructure:"unconfirmed_max_decimals"` + // CreateBlockBurnFactor is the burn factor to apply to transactions when publishing blocks + CreateBlockBurnFactor uint32 `mapstructure:"create_block_burn_factor"` + // CreateBlockMaxTransactionSize is the maximum size of an transaction when publishing blocks + CreateBlockMaxTransactionSize uint32 `mapstructure:"create_block_max_transaction_size"` + // CreateBlockMaxDropletPrecision is the maximum number of decimals allowed in a transaction when publishing blocks + CreateBlockMaxDropletPrecision uint8 `mapstructure:"create_block_max_decimals"` + // MaxBlockTransactionsSize is the maximum total size of transactions in a block when publishing a block + MaxBlockTransactionsSize uint32 `mapstructure:"max_block_transactions_size"` + + // DisplayName is the display name of the coin in the wallet e.g. Skycoin + DisplayName string `mapstructure:"display_name"` + // Ticker is the coin's price ticker, e.g. SKY + Ticker string `mapstructure:"ticker"` + // CoinHoursName is the name of the coinhour asset type, e.g. Coin Hours + CoinHoursName string `mapstructure:"coin_hours_display_name"` + // CoinHoursNameSingular is the singular form of the name of the coinhour asset type, e.g. Coin Hour + CoinHoursNameSingular string `mapstructure:"coin_hours_display_name_singular"` + // CoinHoursTicker is the name of the coinhour asset type's price ticker, e.g. SCH (Skycoin Coin Hours) + CoinHoursTicker string `mapstructure:"coin_hours_ticker"` + // ExplorerURL is the URL of the public explorer + ExplorerURL string `mapstructure:"explorer_url"` + // VersionURL is the URL for wallet to check the latest version number + VersionURL string `mapstructure:"version_url"` + // Bip44Coin is the default "coin" value of the bip44 path + Bip44Coin bip44.CoinType `mapstructure:"bip44_coin"` + + // These fields are set by cmd/newcoin and are not configured in the fiber.toml file + CoinName string + DataDirectory string +} + +// ParamsConfig are the parameters used to generate params/params.go. +// These parameters are exposed in an importable package `params` because they +// may need to be imported by libraries that would not know the node's configured CLI options. +type ParamsConfig struct { + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 `mapstructure:"max_coin_supply"` + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 `mapstructure:"initial_unlocked_count"` + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 `mapstructure:"unlock_address_rate"` + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds. + // Once the InitialUnlockedCount is exhausted, UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 `mapstructure:"unlock_time_interval"` + // UserMaxDropletPrecision represents the decimal precision of droplets + UserMaxDropletPrecision uint64 `mapstructure:"user_max_decimals"` + // UserMaxTransactionSize is max size of a user-created transaction (typically equal to the max size of a block) + UserMaxTransactionSize int `mapstructure:"user_max_transaction_size"` + // DistributionAddresses are addresses that received coins from the genesis address in the first block, + // used to calculate current and max supply and do distribution timelocking + DistributionAddresses []string `mapstructure:"distribution_addresses"` + // UserBurnFactor inverse fraction of coinhours that must be burned, this value is used when creating transactions + UserBurnFactor uint64 `mapstructure:"user_burn_factor"` +} + +// NewConfig loads blockchain config parameters from a config file +// default file is: fiber.toml in the project root +// JSON, toml or yaml file can be used (toml preferred). +func NewConfig(configName, appDir string) (Config, error) { + // set viper parameters + // check that file is of supported type + confNameSplit := strings.Split(configName, ".") + fileType := confNameSplit[len(confNameSplit)-1] + switch fileType { + case "toml", "json", "yaml", "yml": + viper.SetConfigType(confNameSplit[len(confNameSplit)-1]) + default: + return Config{}, fmt.Errorf("invalid blockchain config file type: %s", fileType) + } + + configName = configName[:len(configName)-(len(fileType)+1)] + viper.SetConfigName(configName) + + viper.AddConfigPath(appDir) + viper.AddConfigPath(".") + + // set defaults + setDefaults() + + params := Config{} + + if err := viper.ReadInConfig(); err != nil { + return params, err + } + + if err := viper.Unmarshal(¶ms); err != nil { + return params, err + } + + return params, nil +} + +func setDefaults() { + // node defaults + viper.SetDefault("node.genesis_coin_volume", 100e12) + viper.SetDefault("node.port", 6000) + viper.SetDefault("node.web_interface_port", 6420) + viper.SetDefault("node.unconfirmed_burn_factor", 10) + viper.SetDefault("node.unconfirmed_max_transaction_size", 32*1024) + viper.SetDefault("node.unconfirmed_max_decimals", 3) + viper.SetDefault("node.create_block_burn_factor", 10) + viper.SetDefault("node.create_block_max_transaction_size", 32*1024) + viper.SetDefault("node.create_block_max_decimals", 3) + viper.SetDefault("node.max_block_transactions_size", 32*1024) + viper.SetDefault("node.display_name", "Skycoin") + viper.SetDefault("node.ticker", "SKY") + viper.SetDefault("node.coin_hours_display_name", "Coin Hours") + viper.SetDefault("node.coin_hours_display_name_singular", "Coin Hour") + viper.SetDefault("node.coin_hours_ticker", "SCH") + viper.SetDefault("node.explorer_url", "https://explorer.skycoin.com") + viper.SetDefault("node.version_url", "https://version.skycoin.com/skycoin/version.txt") + viper.SetDefault("node.bip44_coin", bip44.CoinTypeSkycoin) + + // build defaults + viper.SetDefault("build.commit", "") + viper.SetDefault("build.branch", "") + + // params defaults + viper.SetDefault("params.max_coin_supply", 1e8) + viper.SetDefault("params.initial_unlocked_count", 25) + viper.SetDefault("params.unlock_address_rate", 5) + viper.SetDefault("params.unlock_time_interval", 60*60*24*365) + viper.SetDefault("params.user_max_decimals", 3) + viper.SetDefault("params.user_burn_factor", 10) + viper.SetDefault("params.user_max_transaction_size", 32*1024) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/fiber/config_test.go b/vendor/github.com/SkycoinProject/skycoin/src/fiber/config_test.go new file mode 100644 index 00000000..9bda26d2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/fiber/config_test.go @@ -0,0 +1,60 @@ +package fiber + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/bip44" +) + +// TODO(therealssj): write better tests +func TestNewConfig(t *testing.T) { + coinConfig, err := NewConfig("test.fiber.toml", "./testdata") + require.NoError(t, err) + require.Equal(t, Config{ + Node: NodeConfig{ + GenesisSignatureStr: "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700", + GenesisAddressStr: "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + BlockchainPubkeyStr: "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a", + BlockchainSeckeyStr: "", + GenesisTimestamp: 1426562704, + GenesisCoinVolume: 100e12, + DefaultConnections: []string{ + "118.178.135.93:6000", + "47.88.33.156:6000", + "104.237.142.206:6000", + "176.58.126.224:6000", + "172.104.85.6:6000", + "139.162.7.132:6000", + }, + Port: 6000, + PeerListURL: "https://downloads.skycoin.com/blockchain/peers.txt", + WebInterfacePort: 6420, + UnconfirmedBurnFactor: 10, + UnconfirmedMaxTransactionSize: 777, + UnconfirmedMaxDropletPrecision: 3, + CreateBlockBurnFactor: 9, + CreateBlockMaxTransactionSize: 1234, + CreateBlockMaxDropletPrecision: 4, + MaxBlockTransactionsSize: 1111, + DisplayName: "Testcoin", + Ticker: "TST", + CoinHoursName: "Testcoin Hours", + CoinHoursNameSingular: "Testcoin Hour", + CoinHoursTicker: "TCH", + ExplorerURL: "https://explorer.testcoin.com", + VersionURL: "https://version.testcoin.com/testcoin/version.txt", + Bip44Coin: bip44.CoinTypeSkycoin, + }, + Params: ParamsConfig{ + MaxCoinSupply: 1e8, + UnlockAddressRate: 5, + InitialUnlockedCount: 25, + UnlockTimeInterval: 60 * 60 * 24 * 365, + UserBurnFactor: 3, + UserMaxTransactionSize: 999, + UserMaxDropletPrecision: 2, + }, + }, coinConfig) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/fiber/testdata/test.fiber.toml b/vendor/github.com/SkycoinProject/skycoin/src/fiber/testdata/test.fiber.toml new file mode 100644 index 00000000..459a238b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/fiber/testdata/test.fiber.toml @@ -0,0 +1,38 @@ +# fiber configuration +# Defaults are shown, commented out +# Some values have no defaults and must be filled in +[node] +genesis_signature_str = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" +genesis_address_str = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" +blockchain_pubkey_str = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +blockchain_seckey_str = "" +genesis_timestamp = 1426562704 +default_connections = [ + "118.178.135.93:6000", + "47.88.33.156:6000", + "104.237.142.206:6000", + "176.58.126.224:6000", + "172.104.85.6:6000", + "139.162.7.132:6000", +] +launch_browser = true +peer_list_url = "https://downloads.skycoin.com/blockchain/peers.txt" +unconfirmed_burn_factor = 10 +unconfirmed_max_transaction_size = 777 +unconfirmed_max_decimals = 3 +create_block_burn_factor = 9 +create_block_max_transaction_size = 1234 +create_block_max_decimals = 4 +max_block_transactions_size = 1111 +display_name = "Testcoin" +ticker = "TST" +coin_hours_display_name = "Testcoin Hours" +coin_hours_display_name_singular = "Testcoin Hour" +coin_hours_ticker = "TCH" +explorer_url = "https://explorer.testcoin.com" +version_url = "https://version.testcoin.com/testcoin/version.txt" + +[params] +user_burn_factor = 3 +user_max_transaction_size = 999 +user_max_decimals = 2 diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.angular-cli.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.angular-cli.json new file mode 100644 index 00000000..8fcfda2a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.angular-cli.json @@ -0,0 +1,65 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "desktopwallet" + }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets", + "favicon.ico", + "app/current-skycoin.json" + ], + "index": "index.html", + "main": "main.ts", + "polyfills": "polyfills.ts", + "test": "test.ts", + "tsconfig": "tsconfig.app.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "../node_modules/font-awesome/css/font-awesome.css", + "assets/fonts/material-icons/material-icons.css", + "styles.scss" + ], + "scripts": [ + "assets/scripts/qrcode.min.js" + ], + "environmentSource": "environments/environment.ts", + "environments": { + "dev": "environments/environment.ts", + "prod": "environments/environment.prod.ts" + } + } + ], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "lint": [ + { + "project": "src/tsconfig.app.json", + "exclude": "**/node_modules/**" + }, + { + "project": "src/tsconfig.spec.json", + "exclude": "**/node_modules/**" + }, + { + "project": "e2e/tsconfig.e2e.json", + "exclude": "**/node_modules/**" + } + ], + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "sass", + "component": {} + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.editorconfig b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.editorconfig new file mode 100644 index 00000000..6e87a003 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.gitignore b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.gitignore new file mode 100755 index 00000000..30c55b61 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.gitignore @@ -0,0 +1,41 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/README.md b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/README.md new file mode 100644 index 00000000..da9265bd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/README.md @@ -0,0 +1,71 @@ +# Skycoin desktop client + +The Skycoin wallet ships with a web interface which can be ran from the browser and/or Electron. + +The project contains both the source (src) and target (dist) files of this web interface. + +## Prerequisites + +The Skycoin web interface requires Node 8.10.0 or higher, together with NPM 5.6 or higher. + +## Installation + +This project is generated using Angular CLI, therefore it is adviced to first run `npm install -g @angular/cli`. + +Dependencies are managed with NPM 5, to install these run `npm install`. + +You will only have to run this again, if any dependencies have been changed in the `package-lock.json` file. + +## Compiling new target files + +After pulling the latest code, you might first have to update your dependencies, in case someone else has updated them. +You should always do this when compiling new production files: + +``` +rm -rf node_modules +npm install +``` + +This will remove the current dependencies, and install them from the `package-lock.json`. + +To compile new target files, you will have to run: `npm run build`. + +## Development server + +Run `npm start` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +Please note that you will most likely receive CORS errors as there's a difference between the port number of the source and destination. + +As a work-around, the development server will create a proxy from `http://localhost:4200/api` to `http://127.0.0.1:6420/`. + +You can route all calls to this address by changing the url property on the ApiService class. + +## Swaplab integration + +The wallet has a section for buying coins using the Swaplab service and, during development, it is possible to configure its operation, +in order to test its different parts without having to make a real exchange. The configuration is done by modifying the properties of +the `swaplab` object in [environment.ts](/src/gui/static/src/environment/environment.ts). + +If you set `swaplab.activateTestMode` to `true`, all operations made with the Swaplab integration will be faked. When creating a new +operation or opening an old one using the history, the system will show the operation progressing every few seconds, from the state in +which the user is expected to make the initial deposit to the moment in which the operation is completed. +If `swaplabTests.activateTestMode` is `false`, the integration will work as it should and you will be able to make real exchange transactions. + +Also `swaplab` has a property called `endStatusInError`. If you set it to `true` and `swaplabTests.activateTestMode` is also `true`, +all the faked operations will end in an error, instead of success. + +## Purchase API (teller) + +Please note that at the moment the Purchase API (teller) is both offline and not supporting CORS headers. + +While event.skycoin.com is not working, we will have to run the purchase API locally. + +Similar as the solution for the above CORS issue, you can circumvent CORS issues by changing the url property to '/teller/' + +## Style guide + +As an Angular application, we try to follow the [Angular style guide](https://angular.io/guide/styleguide). + +## Translations + +You can find information about how to work with translation files in the [Translations README](/src/gui/static/src/assets/i18n/README.md). diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js new file mode 100644 index 00000000..228c54da --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js @@ -0,0 +1 @@ +webpackJsonp([0],{dXVM:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Loading...",new:"New",load:"Load"},errors:{error:"Error","fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","error-decrypting":"Error decrypting the wallet","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs","window-size":"The window is too narrow for the content"},title:{language:"Select Language",wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",qrcode:"QR Code",reset:"Reset Password",exchange:"Exchange","select-address":"Select Address","order-history":"Order history"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.",synchronizing:"The wallet is synchronizing. Data you see may not be updated.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed","reset-link":"I forgot my password"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a hardware wallet?","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","new-addresses":"New Addresses","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.",delete:"Delete Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled","hw-security-warning":'Possible security risk. Access the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected for more information.',wallet:"Wallet","hardware-wallet":"Hardware Wallet","delete-confirmation":'WARNING: The wallet "{{ name }}" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list). Do you want to continue?',"delete-confirmation-check":"Yeah, I want to delete the wallet.","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the hardware wallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","unconventional-seed-title":"Possible error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed."},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},"add-addresses":{title:"Select quantity","name-quantity":"How many addresses to create","cancel-button":"Cancel","create-button":"Create"},address:{show:"Press to show",copy:"Copy","copy-address":"Copy address",copied:"Copied!",confirm:"Confirm address",outputs:"Unspent outputs",history:"History"}},send:{"synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","notes-label":"Notes","wallet-label":"Wallet","addresses-label":"Addresses","invalid-amount":"Please enter a valid amount","addresses-help":"Limit the addresses from where the coins and hours could be sent","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown","all-outputs":"All the outputs of the selected addresses","available-msg-part1":"With your current selection you can send up to","available-msg-part2":"and","available-msg-part3":"(at least","available-msg-part4":"must be used for the transaction fee).","change-address-label":"Custom change address","change-address-select":"Select","change-address-help":'Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the "Select" link to choose an address from one of your wallets',"destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to outputs","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced","select-wallet":"Select Wallet"},reset:{"wallet-label":"Wallet","seed-label":"Wallet seed","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","reset-button":"Reset"},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID","show-more":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","block-height-short":"Block","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",moving:"Internally moving",moved:"Internally moved",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)",filter:"Active filter: ",filters:"Active filters: ","all-addresses":"All addresses"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"},confirmation:{"header-text":"Confirmation","confirm-button":"Yes","cancel-button":"No",close:"Close"},service:{api:{"server-error":"Server error"},wallet:{"not-enough-hours":"Not enough available Coin Hours to perform the transaction!"}},"hardware-wallet":{general:{"default-wallet-name":"New hardware wallet","error-disconnected":"Unable to perform the operation. The hardware wallet is not connected.","simple-error":"Error, Unable to perform the operation.","generic-error":"Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.","generic-error-internet":"Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.","error-incorrect-wallet":"Unable to perform the operation. The connected hardware wallet is different from the expected one.","error-incorrect-pin":"Unable to perform the operation. The PIN you have entered is not correct.",confirm:"Please, confirm the operation in the hardware wallet.","confirm-and-more":"Please, confirm the operation in the hardware wallet and follow the instructions.",close:"Close",cancel:"Cancel",continue:"Continue",completed:"Operation completed successfully.",refused:"The operation failed or was canceled."},errors:{"too-many-inputs":"The transaction has too many inputs and can not be processed. Please contact technical support.","too-many-outputs":"The transaction has too many outputs and can not be processed. Please contact technical support."},"security-warning":{title:"Security warning",text:'The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected and solve the security problems before continuing.',check:"I understand the risks and want to continue",continue:"Continue",cancel:"Cancel"},options:{connecting:"Connecting...",disconnected:"No hardware wallet detected. Please connect a hardware wallet to use this option.","unconfigured-detected-title":"Unconfigured hardware wallet","unconfigured-detected":'A seedless hardware wallet has been detected. Select "Configure automatically" if you want to configure it as a brand new wallet and start using it immediately, or select "Restore backup" if you want to configure it with a previously created seed backup and thus be able to access your funds again.',"configured-detected":"Hardware wallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security warnings","security-warning-title":"Security warning","backup-warning":'You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the "Create a backup" option.',"pin-warning":'The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the "Create PIN code" option.',options:"Options:","configure-automatically":"Configure automatically","restore-backup":"Restore backup","create-backup":"Create a backup",wipe:"Wipe the device","confirm-seed":"Confirm seed","create-pin":"Create PIN code","change-pin":"Change PIN code","forgotten-pin1":"If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking","forgotten-pin2":"here."},"generate-seed":{text:"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.",configuring:"Configuring..."},"restore-seed":{text:"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.",warning:"WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.","error-wrong-word":"Error: The retyped word does not match the one requested by the hardware wallet.","error-invalid-seed":"Error: The seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: The seed is valid but does not match the one in the device."},added:{title:"New Hardware Wallet",configuring:"New hardware wallet detected. Configuring...",done:"Done",added1:"The connected hardware wallet has been added to the wallets list with the following name:",added2:"Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish."},wipe:{warning:"WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete":"Also remove from the wallets list"},"create-backup":{warning:'WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the "seed") will be able access the wallet balance, so extreme caution is advised.',instructions:"Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly."},"seed-word":{title:"Enter word",info1:"Enter the word indicated in the device",info2:"You will be asked to enter the words of your backup seed in random order, plus a few additional words.",word:"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. Two PINs you have entered do not match."},"enter-pin":{title:"Enter PIN","title-change-current":"Enter the current PIN","title-change-new":"Enter the new PIN","title-change-confirm":"Confirm the new PIN",instructions:"The PIN layout is displayed on the hardware wallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction.","instructions-change":"Please enter a hard-to-guess PIN of between 4 and 8 numbers.",help:"Need help?"},"pin-help":{title:"Help",part1:"When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.",part2:'To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is "23" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.',part3:'If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is "23", you can not simply type "23" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet.'},"create-tx":{title:"Create transaction"},"confirm-address":{title:"Confirm address",instructions:"Please confirm on the hardware wallet if the address is:","short-confirmation":"Address confirmed.",confirmation:'Address confirmed. For security, you can re-show the address in the hardware wallet using the "Confirm address" option, in the menu that you can display by pressing the button at the right of the address balance.'}},"time-from-now":{"few-seconds":"a few seconds ago",minute:"one minute ago",minutes:"{{time}} minutes ago",hour:"one hour ago",hours:"{{time}} hours ago",day:"one day ago",days:"{{time}} days ago"},exchange:{"you-send":"You send","you-get":"You get (approx.)","to-address":"To {{coin}} address",price:"Exchange rate","time-15":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-1":"I agree with","agree-2":"Terms of Use","agree-3":"and","agree-4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal",history:"Order history","order-not-found":"Order not found",status:"Status",exchanging:"Exchanging {{from}} for {{to}}",select:"Select",offline:"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later.","invalid-address":"Invalid address.",statuses:{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.",complete:"Exchange completed!","complete-info":"The funds have been successfully sent to your address.",error:"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{address:"Address",date:"Date"},details:{"exchange-addr":"Exchange address","exchange-addr-tag":"Payment ID or Destination Tag which must be used for the transaction","tx-id":"Transaction ID","order-id":"Order ID","initial-price":"Initial exchange rate","error-msg":"Error message",details:"Details","start-date":"Start date",back:"Back","back-alert":'The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the "Order history" button'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js new file mode 100644 index 00000000..8d077f5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js @@ -0,0 +1 @@ +webpackJsonp([1],{ODm5:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"\u5e01\u65f6",usd:"\u7f8e\u5143",loading:"\u52a0\u8f7d\u4e2d...",new:"\u65b0",load:"\u52a0\u8f7d"},errors:{error:"\u9519\u8bef","fetch-version":"\u65e0\u6cd5\u4eceGithub\u83b7\u53d6\u6700\u65b0\u7248\u672c","incorrect-password":"\u5bc6\u7801\u9519\u8bef","error-decrypting":"\u89e3\u5bc6\u94b1\u5305\u65f6\u51fa\u9519","api-disabled":"API\u7981\u7528","no-wallet":"\u65e0\u53ef\u652f\u4ed8\u94b1\u5305","no-outputs":"\u65e0\u672a\u4ea4\u6613\u8f93\u51fa","window-size":"\u7a97\u53e3\u592a\u7a84\uff0c\u5185\u5bb9\u653e\u4e0d\u4e0b"},title:{language:"\u9009\u62e9\u8bed\u8a00",wallets:"\u94b1\u5305",send:"\u53d1\u9001",history:"\u5386\u53f2","buy-coin":"\u4e70 Skycoin",network:"\u7f51\u7edc",blockchain:"\u533a\u5757\u94fe",outputs:"\u672a\u4ea4\u6613\u8f93\u51fa",transactions:"\u4ea4\u6613","pending-txs":"\u5f85\u5904\u7406\u4ea4\u6613",backup:"\u5907\u4efd\u94b1\u5305",explorer:"Skycoin Explorer",seed:"\u94b1\u5305\u79cd\u5b50",qrcode:"QR\u4ee3\u7801",reset:"\u91cd\u7f6e\u5bc6\u7801",exchange:"\u4ea4\u6613","select-address":"\u9009\u62e9\u5730\u5740","order-history":"\u8ba2\u5355\u5386\u53f2"},header:{"syncing-blocks":"\u533a\u5757\u540c\u6b65\u4e2d",update1:"\u94b1\u5305\u66f4\u65b0",update2:"\u53ef\u83b7\u53d6",synchronizing:"\u94b1\u5305\u6b63\u5728\u540c\u6b65\u3002\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002","pending-txs1":"\u8fd9\u91cc\u6709\u4e00\u4e9b","pending-txs2":"\u5f85\u5904\u7406\u4ea4\u6613.","pending-txs3":"\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002",errors:{"no-connections":"\u6ca1\u6709\u8fde\u63a5\uff0c\u4f60\u7684\u5ba2\u6237\u7aef\u6ca1\u6709\u8fde\u63a5\u5230\u4efb\u4f55\u5176\u4ed6\u8282\u70b9","no-backend1":"\u4e0d\u80fd\u5230\u8fbe\u540e\u7aef\u3002\u8bf7\u91cd\u65b0\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\u6216\u5bfb\u6c42\u6211\u4eec\u7684\u5e2e\u52a9","no-backend2":"Telegram","no-backend3":"",csrf:"\u5b89\u5168\u6f0f\u6d1e: CSRF\u672a\u5de5\u4f5c\uff0c\u8bf7\u7acb\u5373\u9000\u51fa\u3002"}},password:{title:"\u8f93\u5165\u5bc6\u7801",label:"\u5bc6\u7801","confirm-label":"\u786e\u8ba4\u5bc6\u7801",button:"\u7ee7\u7eed","reset-link":"\u6211\u5fd8\u8bb0\u4e86\u5bc6\u7801"},buy:{"deposit-address":"\u9009\u62e9\u4e00\u4e2a\u5730\u5740\u6765\u751f\u6210BTC\u5145\u503c\u94fe\u63a5\uff0c\u7528\u4e8e:","select-address":"\u9009\u62e9\u5730\u5740",generate:"\u751f\u6210","deposit-location":"\u5145\u503c\u4f4d\u7f6e","deposit-location-desc":"\u9009\u62e9\u4e00\u4e2a\u94b1\u5305\uff0c\u4ee5\u5728\u6211\u4eec\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\u5145\u503cSkycoin\u5230\u8be5\u94b1\u5305","make-choice":"\u505a\u9009\u62e9","wallets-desc":"\u6bcf\u5f53\u9009\u62e9\u4e00\u4e2a\u65b0\u7684\u94b1\u5305\u548c\u5730\u5740\uff0c\u4e00\u4e2a\u65b0\u7684BTC\u5730\u5740\u5c06\u4f1a\u751f\u6210\u3002\u4e00\u4e2a\u72ec\u7acb\u7684Skycoin\u5730\u5740\u6700\u591a\u53ef\u7ed1\u5b9a5\u4e2aBTC\u5730\u5740\u3002",send:"\u53d1\u9001Bitcoin","send-desc":"\u53d1\u9001Bitcoin\u81f3\u5982\u4e0b\u5730\u5740\u3002\u4e00\u65e6\u6536\u5230\uff0c\u6211\u4eec\u5c06\u4f1a\u6309\u5f53\u524d\u6c47\u7387: {{ rate }} SKY/BTC\u5145\u503cSkycoin\u5230\u9009\u4e2d\u94b1\u5305\u7684\u4e00\u4e2a\u65b0\u5730\u5740\u3002","fraction-warning":"\u8bf7\u6309SKY/BTC\u6c47\u7387\u7684\u500d\u6570\u53d1\u9001BTC! Skycoin\u662f\u4ee5\u6574\u6570\u53d1\u9001; SKY\u7684\u5c0f\u6570\u4f4d\u5c06\u4e0d\u4f1a\u53d1\u9001",receive:"\u63a5\u6536Sky","receive-desc":"\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\uff0c\u6211\u4eec\u5c06\u53d1\u9001Skycoin\u7ed9\u4f60\u3002\u4f60\u53ef\u80fd\u9700\u898120\u5206\u949f\u5230\u4e00\u4e2a\u5c0f\u65f6\u624d\u80fd\u6536\u5230\u8fd9\u4e9bSKY\u3002","status-button":"\u72b6\u6001:","check-status-button":"\u67e5\u770b\u72b6\u6001","new-order-button":"\u65b0\u8ba2\u5355"},wizard:{"wallet-desc":'\u5982\u679c\u4f60\u6ca1\u6709Skycoin\u94b1\u5305\uff0c\u8bf7\u4f7f\u7528\u751f\u6210\u7684\u79cd\u5b50\u6765\u521b\u5efa\u4e00\u4e2a\u65b0\u94b1\u5305\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u6709\u4e00\u4e2a\u94b1\u5305\uff0c\u5207\u6362\u5230"\u52a0\u8f7d\u94b1\u5305"\u5e76\u8f93\u5165\u4f60\u7684\u79cd\u5b50\u3002',"encrypt-desc":"\u901a\u8fc7\u52a0\u5bc6\u6765\u589e\u52a0\u94b1\u5305\u7684\u5b89\u5168\u6027\u3002\u8f93\u5165\u5bc6\u7801\u540e\uff0c\u4f60\u7684\u94b1\u5305\u4f1a\u88ab\u52a0\u5bc6\u3002\u53ea\u6709\u8f93\u5165\u5bc6\u7801\u624d\u53ef\u4ee5\u8bbf\u95ee\u7684\u94b1\u5305\u6216\u79fb\u52a8\u8d44\u91d1\u3002","hardware-wallet-link":"\u4f7f\u7528\u786c\u4ef6\u94b1\u5305\uff1f","finish-button":"\u5b8c\u6210","back-button":"\u540e\u9000",confirm:{title:"\u4fdd\u62a4\u4f60\u7684\u79cd\u5b50!",desc:"\u8bf7\u786e\u4fdd\u4f60\u5df2\u7ecf\u5199\u4e0b\u4f60\u7684\u79cd\u5b50\u5e76\u5c06\u5b83\u50a8\u5b58\u5728\u4e86\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u6062\u590d\u4f60\u7684Skycoin\u94b1\u5305",checkbox:"\u5b83\u5f88\u5b89\u5168\uff0c\u6211\u53d1\u8a93\u3002",button:"\u7ee7\u7eed"}},wallet:{"new-address":"\u65b0\u5730\u5740","new-addresses":"\u65b0\u5730\u5740","show-empty":"\u5c55\u793a\u7a7a\u5730\u5740","hide-empty":"\u9690\u85cf\u7a7a\u5730\u5740",encrypt:"\u52a0\u5bc6\u94b1\u5305",decrypt:"\u89e3\u5bc6\u94b1\u5305","decrypt-warning":"\u8b66\u544a: \u51fa\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u5efa\u8bae\u5c06\u94b1\u5305\u52a0\u5bc6\u3002\u5efa\u8bae\u8c28\u614e\u4e00\u70b9\u3002",delete:"\u5220\u9664\u94b1\u5305",edit:"\u7f16\u8f91\u94b1\u5305",add:"\u6dfb\u52a0\u94b1\u5305",load:"\u52a0\u8f7d\u94b1\u5305","encryption-enabled":"\u52a0\u5bc6\u5df2\u542f\u7528","encryption-disabled":"\u52a0\u5bc6\u5df2\u7981\u7528","hw-security-warning":'\u53ef\u80fd\u7684\u5b89\u5168\u98ce\u9669\u3002\u5f53\u786c\u4ef6\u8bbe\u5907\u5df2\u8fde\u63a5\u65f6(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684"\u786c\u4ef6\u94b1\u5305"\u6309\u94ae)\u8bbf\u95ee\u786c\u4ef6\u94b1\u5305\u9009\u9879\u4ee5\u83b7\u53d6\u66f4\u591a\u4fe1\u606f',wallet:"\u94b1\u5305","hardware-wallet":"\u786c\u4ef6\u94b1\u5305","delete-confirmation":'\u8b66\u544a: \u94b1\u5305"{{ name }}"\u5c06\u4ece\u5217\u8868\u4e2d\u5220\u9664\u3002\u82e5\u60f3\u91cd\u65b0\u6dfb\u52a0\uff0c\u9700\u91cd\u65b0\u8fde\u63a5\u8bbe\u5907\u5e76\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u7684\u9009\u9879\u5217\u8868(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684"\u786c\u4ef6\u94b1\u5305"\u6309\u94ae)\u3002\u4f60\u60f3\u7ee7\u7eed\u5417\uff1f',"delete-confirmation-check":"\u662f\u7684\uff0c\u6211\u60f3\u8981\u5220\u9664\u94b1\u5305\u3002","max-hardware-wallets-error":"\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u91cc\u7684\u5730\u5740\u5df2\u7ecf\u8fbe\u5230\u5141\u8bb8\u7684\u6700\u5927\u503c\u3002","add-many-confirmation":"\u8b66\u544a: \u5982\u679c\u4f60\u5728\u4e0d\u4f7f\u7528\u524d\u4e00\u4e2a\u5730\u5740\u7684\u60c5\u51b5\u4e0b\u6dfb\u52a0\u592a\u591a\u5730\u5740\uff0c\u6216\u8005\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662f\u6700\u540e\u4e00\u4e2a\u5730\u5740\u800c\u4e0d\u662f\u7b2c\u4e00\u4e2a\u5730\u5740\uff0c\u90a3\u4e48\u5982\u679c\u4f60\u5c1d\u8bd5\u4f7f\u7528\u79cd\u5b50\u6062\u590d\u94b1\u5305\uff0c\u6709\u4e9b\u5730\u5740\u5c06\u53ef\u80fd\u65e0\u6cd5\u81ea\u52a8\u6062\u590d\uff08\u4f60\u5fc5\u987b\u624b\u52a8\u6dfb\u52a0\u5b83\u4eec\uff09\u3002 \u4f60\u60f3\u7ee7\u7eed\u5417\uff1f",new:{"create-title":"\u521b\u5efa\u94b1\u5305","load-title":"\u52a0\u8f7d\u94b1\u5305","encrypt-title":"\u52a0\u5bc6\u94b1\u5305","name-label":"\u540d\u79f0","seed-label":"\u79cd\u5b50","confirm-seed-label":"\u786e\u8ba4\u79cd\u5b50","seed-warning":"\u8bb0\u4f4f\u79cd\u5b50! \u628a\u5b83\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002 \u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u4f60\u7684\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u627e\u56de\u4f60\u7684\u94b1\u5305!","create-button":"\u521b\u5efa","load-button":"\u52a0\u8f7d","cancel-button":"\u5220\u9664","12-words":"12\u5b57","24-words":"24\u5b57","generate-12-seed":"\u751f\u621012\u5b57\u79cd\u5b50","generate-24-seed":"\u751f\u621024\u5b57\u79cd\u5b50",encrypt:"\u52a0\u5bc6\u94b1\u5305","encrypt-warning":"\u6211\u4eec\u5efa\u8bae\u4f60\u4e3a\u6bcf\u4e2a\u94b1\u5305\u8bbe\u7f6e\u4e00\u4e2a\u72ec\u7acb\u7684\u5bc6\u7801\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u5bc6\u7801\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u79cd\u5b50\u91cd\u7f6e\u94b1\u5305\u3002\u5728\u52a0\u5bc6\u4f60\u7684\u94b1\u5305\u4e4b\u524d\uff0c\u786e\u4fdd\u4f60\u7684\u79cd\u5b50\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002","unconventional-seed-title":"\u53ef\u80fd\u9519\u8bef","unconventional-seed-text":"\u4f60\u5f15\u8fdb\u4e86\u4e00\u79cd\u975e\u4f20\u7edf\u7684\u79cd\u5b50\u3002\u5982\u679c\u4f60\u51fa\u4e8e\u4efb\u4f55\u7279\u6b8a\u539f\u56e0\u8fd9\u6837\u505a\uff0c\u4f60\u53ef\u4ee5\u7ee7\u7eed(\u53ea\u63a8\u8350\u9ad8\u7ea7\u7528\u6237)\u3002\u4f46\u662f\uff0c\u5982\u679c\u4f60\u6253\u7b97\u4f7f\u7528\u666e\u901a\u7684\u7cfb\u7edf\u79cd\u5b50\uff0c\u5219\u5fc5\u987b\u5220\u9664\u6240\u6709\u9644\u52a0\u6587\u672c\u548c\u7279\u6b8a\u5b57\u7b26\u3002","unconventional-seed-check":"\u7ee7\u7eed\u4f7f\u7528\u975e\u4f20\u7edf\u79cd\u5b50\u3002"},rename:{title:"\u91cd\u547d\u540d\u94b1\u5305","name-label":"\u547d\u540d","cancel-button":"\u53d6\u6d88","rename-button":"\u91cd\u547d\u540d"},"add-addresses":{title:"\u9009\u62e9\u6570\u91cf","name-quantity":"\u521b\u5efa\u591a\u5c11\u5730\u5740","cancel-button":"\u53d6\u6d88","create-button":"\u521b\u5efa"},address:{show:"\u70b9\u51fb\u663e\u793a",copy:"\u590d\u5236","copy-address":"\u590d\u5236\u5730\u5740",copied:"\u5df2\u590d\u5236!",confirm:"\u786e\u8ba4\u5730\u5740",outputs:"\u672a\u4ea4\u6613\u8f93\u51fa",history:"\u5386\u53f2"}},send:{"synchronizing-warning":"\u94b1\u5305\u4ecd\u5728\u540c\u6b65\u6570\u636e\uff0c\u6240\u4ee5\u663e\u793a\u7684\u4f59\u989d\u53ef\u80fd\u4e0d\u6b63\u786e\u3002\u4f60\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f","from-label":"\u53d1\u9001\u81ea","to-label":"\u53d1\u9001\u81f3","amount-label":"\u603b\u989d","notes-label":"\u6807\u6ce8","wallet-label":"\u94b1\u5305","addresses-label":"\u5730\u5740","invalid-amount":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u6570\u503c","addresses-help":"\u9650\u5b9a\u6e90\u53d1\u9001\u5730\u5740","all-addresses":"\u6240\u6709\u5730\u5740(\u6240\u9009\u94b1\u5305\u7684)","outputs-label":"\u672a\u4ea4\u6613\u8f93\u51fa","outputs-help":"\u9650\u5b9a\u672a\u4ea4\u6613\u8f93\u51fa","all-outputs":"\u6240\u6709\u672a\u4ea4\u6613\u8f93\u51fa(\u6240\u9009\u5730\u5740\u7684)","available-msg-part1":"\u6839\u636e\u4f60\u5f53\u524d\u7684\u9009\u62e9\uff0c\u4f60\u6700\u591a\u53ef\u4ee5\u53d1\u9001","available-msg-part2":"\u548c","available-msg-part3":"(\u81f3\u5c11","available-msg-part4":"\u5c06\u4f5c\u4e3a\u5fc5\u987b\u7684\u4ea4\u6613\u624b\u7eed\u8d39)\u3002","change-address-label":"\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740","change-address-select":"\u9009\u62e9","change-address-help":'\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740\u3002\u5982\u679c\u4e0d\u63d0\u4f9b\uff0c\u94b1\u5305\u5c06\u4f1a\u81ea\u52a8\u9009\u62e9\u3002\u70b9\u51fb"\u9009\u62e9" \u6765\u9009\u62e9\u4e00\u4e2a\u5730\u5740',"destinations-label":"\u76ee\u6807\u5730\u5740","destinations-help1":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01","destinations-help2":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01\u4ee5\u53ca\u5e01\u65f6","hours-allocation-label":"\u81ea\u52a8\u5206\u914d\u5e01\u65f6","options-label":"\u9009\u9879","value-label":"\u5e01\u65f6\u5206\u53d1\u56e0\u5b50","value-help":"\u5206\u53d1\u56e0\u5b50\u503c\u8d8a\u9ad8\uff0c\u8d8a\u591a\u5e01\u65f6\u5c06\u88ab\u53d1\u9001","preview-button":"\u9884\u89c8","send-button":"\u53d1\u9001","back-button":"\u540e\u9000",simple:"\u7b80\u6613",advanced:"\u9ad8\u7ea7\u7684","select-wallet":"\u9009\u62e9\u94b1\u5305"},reset:{"wallet-label":"\u94b1\u5305","seed-label":"\u94b1\u5305\u79cd\u5b50","password-label":"\u65b0\u5bc6\u7801 (\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u94b1\u5305\u52a0\u5bc6\uff0c\u8bf7\u5c06\u5bc6\u7801\u7559\u7a7a)","confirm-label":"\u786e\u8ba4\u65b0\u5bc6\u7801","reset-button":"\u91cd\u7f6e"},tx:{transaction:"\u4ea4\u6613","confirm-transaction":"\u786e\u8ba4\u4ea4\u6613",from:"\u6765\u81ea",to:"\u5230",date:"\u65e5\u671f",status:"\u72b6\u6001",coins:"\u5e01",hours:"\u5e01\u65f6",id:"\u4ea4\u6613ID","show-more":"\u5c55\u793a\u66f4\u591a","hours-moved":"\u5df2\u8f6c\u79fb","hours-sent":"\u5df2\u53d1\u9001","hours-received":"\u5df2\u63a5\u6536","hours-burned":"\u5df2\u71c3\u70e7",inputs:"\u8f93\u5165",outputs:"\u8f93\u51fa",confirmed:"\u5df2\u786e\u8ba4",pending:"\u5f85\u5904\u7406","current-rate":"\u6309\u5f53\u524d\u6c47\u7387\u8ba1\u7b97"},backup:{"wallet-directory":"\u94b1\u5305\u76ee\u5f55:","seed-warning":"\u5728\u7eb8\u4e0a\u5907\u4efd\u4f60\u7684\u79cd\u5b50\uff0c\u5e76\u4fdd\u5b58\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u53ea\u8981\u6709\u79cd\u5b50\uff0c\u4f60\u5c31\u53ef\u4ee5\u627e\u56de\u4f60\u7684\u5e01\u3002",desc:"\u4f7f\u7528\u4e0b\u8868\u4ece\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u5f97\u5230\u79cd\u5b50\u3002
\u4e3a\u4e86\u4ece\u672a\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u83b7\u5f97\u79cd\u5b50\uff0c\u6253\u5f00\u4e0a\u9762\u7684\u6587\u4ef6\u5939,\u5728\u6587\u672c\u7f16\u8f91\u5668\u4e2d\u6253\u5f00.wlt\u6587\u4ef6\u5e76\u6062\u590d\u79cd\u5b50\u3002","close-button":"Close",wallet:"\u94b1\u5305",filename:"\u6587\u4ef6\u540d",seed:"\u79cd\u5b50","show-seed":"\u663e\u793a\u79cd\u5b50","no-wallets":"\u672a\u52a0\u5bc6\u94b1\u5305"},blockchain:{blocks:"\u533a\u5757\u6570\u91cf",time:"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u65f6\u95f4\u6233",hash:"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u54c8\u5e0c\u503c","current-supply":"\u76ee\u524dSKY\u4f9b\u5e94\u91cf","total-supply":"SKY\u7684\u603b\u4f9b\u5e94\u91cf","current-coinhour-supply":"\u76ee\u524d\u5e01\u65f6\u4f9b\u5e94\u91cf","total-coinhour-supply":"\u5e01\u65f6\u603b\u4f9b\u5e94\u91cf"},network:{peer:"\u8282\u70b9",source:"\u8282\u70b9\u6765\u6e90","block-height":"\u533a\u5757\u9ad8\u5ea6","block-height-short":"\u533a\u5757","last-seen":"\u4e0a\u4e00\u6b21\u51fa\u73b0","last-received":"\u4e0a\u4e00\u6b21\u63a5\u6536","last-sent":"\u4e0a\u4e00\u6b21\u53d1\u9001",in:"\u8fdb\u6765\u7684",out:"\u51fa\u53bb\u7684",sources:{default:"\u9ed8\u8ba4\u8282\u70b9",exchange:"\u4ea4\u6362\u8282\u70b9"}},"pending-txs":{timestamp:"\u65f6\u95f4\u6233",txid:"\u4ea4\u6613ID",none:"\u65e0\u5f85\u5904\u7406\u4ea4\u6613",my:"\u6211\u7684",all:"\u5168\u90e8"},history:{"tx-detail":"\u4ea4\u6613\u660e\u7ec6",moving:"\u5185\u90e8\u8f6c\u8d26\u4e2d",moved:"\u5df2\u5185\u90e8\u8f6c\u8d26",sending:"\u53d1\u9001\u4e2d",sent:"\u5df2\u53d1\u9001",received:"\u5df2\u63a5\u6536",receiving:"\u63a5\u6536\u4e2d",pending:"\u5f85\u5904\u7406","no-txs":"\u4f60\u6ca1\u6709\u5386\u53f2\u4ea4\u6613","no-txs-filter":"\u6ca1\u6709\u4e0e\u5f53\u524d\u7b5b\u9009\u6761\u4ef6\u5339\u914d\u7684\u4ea4\u6613","no-filter":"\u672a\u7ecf\u7b5b\u9009 (\u70b9\u51fb\u9009\u62e9\u94b1\u5305/\u5730\u5740)",filter:"\u5df2\u7b5b\u9009: ",filters:"\u5df2\u7b5b\u9009: ","all-addresses":"\u6240\u6709\u5730\u5740"},teller:{done:"\u5b8c\u6210","waiting-confirm":"\u7b49\u5f85\u786e\u8ba4","waiting-deposit":"\u7b49\u5f85\u6bd4\u7279\u5e01\u5145\u503c","waiting-send":"\u7b49\u5f85\u53d1\u9001Skycoin",unknown:"\u672a\u77e5"},confirmation:{"header-text":"\u786e\u8ba4","confirm-button":"\u662f","cancel-button":"\u5426",close:"\u5173\u95ed"},service:{api:{"server-error":"\u670d\u52a1\u5668\u9519\u8bef"},wallet:{"not-enough-hours":"\u6ca1\u6709\u8db3\u591f\u7684\u5e01\u65f6\u6765\u6267\u884c\u4ea4\u6613"}},"hardware-wallet":{general:{"default-wallet-name":"\u65b0\u786c\u4ef6\u94b1\u5305","error-disconnected":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786c\u4ef6\u94b1\u5305\u672a\u8fde\u63a5\u3002","simple-error":"\u9519\u8bef\uff0c\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002","generic-error":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786e\u4fdd\u4f60\u5df2\u7ecf\u8fde\u63a5\u4e86\u4e00\u4e2a\u6709\u6548\u7684\u786c\u4ef6\u94b1\u5305\uff0c\u5e76\u4e14\u5b83\u6ca1\u6709\u5728\u7b49\u5f85\u8f93\u5165\u3002","generic-error-internet":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786e\u4fdd\u4f60\u5df2\u7ecf\u8fde\u63a5\u4e86\u4e00\u4e2a\u6709\u6548\u7684\u786c\u4ef6\u94b1\u5305\uff0c\u5b83\u4e0d\u5728\u7b49\u5f85\u8f93\u5165\uff0c\u5e76\u4e14\u4f60\u5df2\u7ecf\u8fde\u63a5\u5230\u7f51\u7edc/\u8282\u70b9","error-incorrect-wallet":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u6240\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u4e0e\u9884\u671f\u4e0d\u540c\u3002","error-incorrect-pin":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684\u5bc6\u7801\u4e0d\u6b63\u786e\u3002",confirm:"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u3002","confirm-and-more":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u5e76\u6309\u9075\u5faa\u6307\u793a\u3002",close:"\u5173\u95ed",cancel:"\u53d6\u6d88",continue:"\u7ee7\u7eed",completed:"\u64cd\u4f5c\u5b8c\u6210\u3002",refused:"\u64cd\u4f5c\u5931\u8d25\u6216\u88ab\u53d6\u6d88\u3002"},errors:{"too-many-inputs":"\u6b64\u7b14\u4ea4\u6613\u6709\u592a\u591a\u7684\u8f93\u5165\uff0c\u65e0\u6cd5\u5904\u7406\u3002\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301\u3002","too-many-outputs":"\u6b64\u7b14\u4ea4\u6613\u6709\u592a\u591a\u7684\u8f93\u51fa\uff0c\u65e0\u6cd5\u5904\u7406\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301\u3002"},"security-warning":{title:"\u5b89\u5168\u8b66\u544a",text:'\u4e0a\u6b21\u8fde\u63a5\u6b64\u786c\u4ef6\u94b1\u5305\u65f6\uff0c\u53d1\u73b0\u4e00\u4e2a\u6216\u591a\u4e2a\u5b89\u5168\u8b66\u544a\u3002\u6211\u4eec\u5efa\u8bae\u4f60\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u9009\u9879(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684"\u786c\u4ef6\u94b1\u5305"\u6309\u94ae)\u5e76\u4fdd\u6301\u8bbe\u5907\u5df2\u8fde\u63a5\uff0c\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u89e3\u51b3\u5b89\u5168\u95ee\u9898',check:"\u6211\u660e\u767d\u5176\u4e2d\u7684\u98ce\u9669\uff0c\u5e76\u5e0c\u671b\u7ee7\u7eed\u4e0b\u53bb",continue:"\u7ee7\u7eed",cancel:"\u53d6\u6d88"},options:{connecting:"\u8fde\u63a5...",disconnected:"\u6ca1\u6709\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8bf7\u8fde\u63a5\u786c\u4ef6\u94b1\u5305\u540e\u4f7f\u7528\u6b64\u9009\u9879\u3002","unconfigured-detected-title":"\u672a\u914d\u7f6e\u7684\u786c\u4ef6\u94b1\u5305","unconfigured-detected":'\u68c0\u6d4b\u5230\u65e0\u79cd\u5b50\u7684\u786c\u4ef6\u94b1\u5305\u3002\u9009\u62e9"\u81ea\u52a8\u914d\u7f6e"\u5982\u679c\u4f60\u60f3\u5c06\u5176\u914d\u7f6e\u4e3a\u5168\u65b0\u7684\u94b1\u5305\u5e76\u7acb\u5373\u5f00\u59cb\u4f7f\u7528\u5b83\uff0c\u6216\u9009\u62e9"\u6062\u590d\u5907\u4efd"\u5982\u679c\u4f60\u60f3\u4f7f\u7528\u5148\u524d\u521b\u5efa\u7684\u5907\u4efd\u79cd\u5b50\u5bf9\u5176\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u80fd\u591f\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u4ea7\u3002',"configured-detected":"\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8be5\u8bbe\u5907\u5728\u94b1\u5305\u5217\u8868\u4e2d\u88ab\u8bc6\u522b\u4e3a:","security-warnings-title":"\u5b89\u5168\u8b66\u544a","security-warning-title":"\u5b89\u5168\u8b66\u544a","backup-warning":'\u4f60\u5e94\u8be5\u5907\u4efd\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\uff0c\u5426\u5219\u4e07\u4e00\u51fa\u73b0\u95ee\u9898\uff0c\u4f60\u53ef\u80fd\u5c06\u65e0\u6cd5\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\uff0c\u8981\u505a\u5230\u8fd9\u4e00\u70b9\u3002\u9009\u62e9"\u521b\u5efa\u4e00\u4e2a\u5907\u4efd"\u9009\u9879\u3002',"pin-warning":'\u5f53\u524d\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u672a\u8bbe\u7f6e\u5bc6\u7801\u3002\u5bc6\u7801\u53ef\u4fdd\u62a4\u786c\u4ef6\u94b1\u5305\uff0c\u4ee5\u9632\u4e22\u5931\u3001\u76d7\u7a83\u548c\u9ed1\u5ba2\u5165\u4fb5\u3002\u8981\u521b\u5efa\u4e00\u4e2a\u5bc6\u7801\uff0c\u9009\u62e9"\u521b\u5efaPIN\u7801"\u9009\u9879\u3002',options:"\u9009\u9879:","configure-automatically":"\u81ea\u52a8\u914d\u7f6e","restore-backup":"\u6062\u590d\u5907\u4efd","create-backup":"\u521b\u5efa\u5907\u4efd",wipe:"\u5220\u9664\u8bbe\u5907","confirm-seed":"\u786e\u8ba4\u79cd\u5b50","create-pin":"\u521b\u5efa\u5bc6\u7801","change-pin":"\u66f4\u6539\u5bc6\u7801","forgotten-pin1":"\u5982\u679c\u4f60\u56e0\u4e3a\u5fd8\u8bb0\u5bc6\u7801\u800c\u65e0\u6cd5\u8fdb\u5165\u94b1\u5305\uff0c\u4f60\u53ef\u4ee5\u5220\u9664\u786c\u4ef6\u94b1\u5305\uff0c\u7136\u540e\u901a\u8fc7\u79cd\u5b50","forgotten-pin2":"\u6062\u590d"},"generate-seed":{text:"\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u4f60\u53ef\u4ee5\u9009\u62e9\u751f\u6210\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002\u79cd\u5b50\u662f\u4e00\u4e2a\u5355\u8bcd\u5217\u8868\uff0c\u51fa\u73b0\u95ee\u9898\u540e\u53ef\u4ee5\u7528\u6765\u6062\u590d\u8bbf\u95ee\u4f60\u7684\u5e01\u3002\u6240\u6709\u9009\u9879\u90fd\u662f\u5b89\u5168\u7684\uff0c\u5982\u679c\u4f60\u6ca1\u6709\u7279\u6b8a\u539f\u56e0\u5fc5\u987b\u9009\u62e9\u67d0\u4e00\u9879\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u9ed8\u8ba4\u503c\u3002",configuring:"\u914d\u7f6e..."},"restore-seed":{text:"\u5728\u7ee7\u7eed\u524d\uff0c\u8bf7\u9009\u62e9\u4f60\u60f3\u8981\u6062\u590d\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u91cf\u3002","check-text":"\u4f60\u53ef\u4ee5\u4f7f\u7528\u6b64\u9009\u9879\u8f93\u5165\u79cd\u5b50\uff0c\u5e76\u68c0\u67e5\u5b83\u662f\u5426\u4e0e\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4e00\u81f4\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u9009\u62e9\u4f60\u60f3\u8981\u68c0\u67e5\u7684\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002",warning:"\u8b66\u544a: \u4e3a\u4e86\u907f\u514d\u53ef\u80fd\u51fa\u73b0\u7684\u95ee\u9898\uff0c\u8bf7\u4ec5\u4f7f\u7528\u540c\u4e00\u54c1\u724c/\u578b\u53f7\u7684\u786c\u4ef6\u94b1\u5305\u521b\u5efa\u79cd\u5b50\u3002","error-wrong-word":"\u9519\u8bef: \u91cd\u65b0\u952e\u5165\u7684\u5355\u8bcd\u4e0e\u786c\u4ef6\u94b1\u5305\u6240\u8bf7\u6c42\u7684\u4e0d\u5339\u914d\u3002","error-invalid-seed":"\u9519\u8bef: \u79cd\u5b50\u65e0\u6548\u3002\u8bf7\u52a1\u5fc5\u6309\u6b63\u786e\u7684\u987a\u5e8f\u8f93\u5165\u6b63\u786e\u7684\u5355\u8bcd\u3002","error-wrong-seed":"\u9519\u8bef: \u79cd\u5b50\u662f\u6709\u6548\u7684\uff0c\u4f46\u4e0e\u8bbe\u5907\u4e2d\u7684\u79cd\u5b50\u4e0d\u5339\u914d\u3002"},added:{title:"\u65b0\u786c\u4ef6\u94b1\u5305",configuring:"\u68c0\u6d4b\u5230\u65b0\u7684\u786c\u4ef6\u94b1\u5305\u3002\u914d\u7f6e...",done:"\u5df2\u5b8c\u6210",added1:"\u5df2\u8fde\u63a5\u7684\u786c\u4ef6\u7684\u94b1\u5305\u5df2\u7ecf\u7528\u5982\u4e0b\u540d\u5b57\u88ab\u6dfb\u52a0\u5230\u94b1\u5305\u5217\u8868:",added2:"\u73b0\u5728\u4f60\u53ef\u4ee5\u67e5\u770b\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4f59\u989d\u548c\u5730\u5740\u4e86\uff0c\u5373\u4f7f\u786c\u4ef6\u94b1\u5305\u5e76\u672a\u8fde\u63a5\u3002\u6b64\u5916\u5982\u679c\u4f60\u613f\u610f\uff0c\u4f60\u8fd8\u53ef\u4ee5\u66f4\u6539\u94b1\u5305\u540d\u79f0\u6216\u4ece\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u5220\u9664\u3002"},wipe:{warning:"\u8b66\u544a: \u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u6240\u6709\u6570\u636e\u5c06\u88ab\u5220\u9664\u3002\u5982\u679c\u6ca1\u6709\u5907\u4efd\uff0c\u4f60\u5c06\u65e0\u6cd5\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\u3002","confirm-delete":"\u8fd8\u662f\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u4e2d\u5220\u9664"},"create-backup":{warning:'\u8b66\u544a: \u4f60\u53ea\u80fd\u4f7f\u7528\u6b64\u9009\u9879\u5907\u4efd\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\u4e00\u6b21\u3002\u5982\u679c\u4f60\u51b3\u5b9a\u7ee7\u7eed\uff0c\u4f60\u5c06\u4e0d\u5f97\u4e0d\u5199\u4e0b\u4e00\u7ec4\u5355\u8bcd(\u5efa\u8bae\u5199\u5728\u7eb8\u4e0a\uff0c\u800c\u4e0d\u662f\u7535\u8111\u4e0a)\uff0c\u8fd9\u4e9b\u5355\u8bcd\u5c06\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u4efb\u4f55\u53ef\u4ee5\u8bbf\u95ee\u5355\u8bcd\u5217\u8868("\u79cd\u5b50")\u7684\u4eba\u90fd\u53ef\u4ee5\u8bbf\u95ee\u94b1\u5305\u4f59\u989d\uff0c\u56e0\u6b64\u5efa\u8bae\u8bf7\u683c\u5916\u8c28\u614e\u3002',instructions:"\u5199\u4e0b\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u7684\u5355\u8bcd\u5217\u8868\u3002\u4e00\u5b9a\u8981\u6309\u987a\u5e8f\u5e76\u628a\u6bcf\u4e2a\u5355\u8bcd\u90fd\u5199\u5bf9\u3002"},"seed-word":{title:"\u8f93\u5165\u5b57",info1:"\u8f93\u5165\u8bbe\u5907\u4e2d\u663e\u793a\u7684\u5b57",info2:"\u4f60\u5c06\u88ab\u8981\u6c42\u4ee5\u968f\u673a\u7684\u987a\u5e8f\u8f93\u5165\u4f60\u5907\u4efd\u7684\u79cd\u5b50\uff0c\u52a0\u4e0a\u4e00\u4e9b\u989d\u5916\u7684\u5b57\u3002",word:"\u8981\u6c42\u7684\u5b57","error-invalid-word":"\u8f93\u5165\u5b57\u65e0\u6548\u3002","error-loading-words":"\u6b63\u5728\u52a0\u8f7d\u5b57\u5217\u8868\u3002\u8bf7\u7a0d\u7b49\u3002"},"change-pin":{"pin-mismatch":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684\u4e24\u4e2a\u5bc6\u7801\u4e0d\u5339\u914d"},"enter-pin":{title:"\u8f93\u5165\u5bc6\u7801","title-change-current":"\u8f93\u5165\u5f53\u524d\u5bc6\u7801","title-change-new":"\u8f93\u5165\u65b0\u7684\u5bc6\u7801","title-change-confirm":"\u786e\u8ba4\u65b0\u7684\u5bc6\u7801",instructions:" \u5bc6\u7801\u5df2\u663e\u793a\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\u3002","instructions-tx":"\u8fdb\u5165\u5bc6\u7801\u4ee5\u786e\u8ba4\u5e76\u7b7e\u7f72\u4ea4\u6613\u3002","instructions-change":"\u8bf7\u8f93\u5165\u4e00\u4e2a4\u52308\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u96be\u4ee5\u88ab\u731c\u4e2d\u7684\u5bc6\u7801\u3002",help:"\u9700\u8981\u5e2e\u52a9\uff1f"},"pin-help":{title:"\u5e2e\u52a9",part1:"\u5f53\u9700\u8981\u8f93\u5165\u5bc6\u7801\u624d\u80fd\u7ee7\u7eed\u65f6\uff0c\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4f1a\u663e\u793a\u4e00\u4e2a\u77e9\u9635\uff0c\u77e9\u9635\u75319\u4e2a\u968f\u673a\u6392\u5217\u7684\u5757\u7ec4\u6210(\u6bcf\u6b21\u987a\u5e8f\u90fd\u4f1a\u6539\u53d8)\uff0c\u4f60\u5c06\u88ab\u8981\u6c42\u5728\u8f6f\u4ef6\u94b1\u5305\u4e2d\u8f93\u5165\u5bc6\u7801\uff0c\u4f7f\u7528\u4e00\u4e2a\u77e9\u9635\uff0c\u6b64\u77e9\u9635\u5305\u542b9\u4e2a\u6309\u94ae\uff0c\u53ea\u663e\u793a\u7b26\u53f7#\u3002",part2:'\u8981\u8f93\u5165\u5bc6\u7801\uff0c\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u4ee5\u6570\u5b57\u77e9\u9635\u67e5\u770b\u5bc6\u7801\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u76f8\u5e94\u6309\u94ae\u3002\u4f8b\u5982\uff0c\u5982\u679c\u5bc6\u7801\u4e3a"23"\u4e14\u6570\u5b572\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u5de6\u4e0a\u89d2\uff0c\u6570\u5b573\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u6b63\u4e2d\u95f4\uff0c\u5219\u6309\u987a\u5e8f\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u5de6\u4e0a\u89d2\u548c\u4e2d\u95f4\u6309\u94ae\u3002',part3:'\u5982\u679c\u4f60\u613f\u610f\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528\u952e\u76d8\u4e0a\u7684\u5c0f\u952e\u76d8\u8f93\u5165\u5bc6\u7801\u3002\u4f46\u662f\uff0c\u5982\u4e4b\u524d\u793a\u4f8b\u6240\u793a\uff0c\u5982\u679c\u5bc6\u7801\u662f"23"\uff0c\u4f60\u4e0d\u80fd\u7b80\u5355\u5730\u7528\u5c0f\u952e\u76d8\u952e\u5165"23"\uff0c\u800c\u662f\u5fc5\u987b\u9009\u62e9\u70b9\u51fb\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a2\u548c3\u5bf9\u5e94\u4f4d\u7f6e\u7684\u503c\u3002'},"create-tx":{title:"\u521b\u5efa\u4ea4\u6613"},"confirm-address":{title:"\u786e\u8ba4\u5730\u5740",instructions:"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u786e\u8ba4\uff0c\u5982\u679c\u5730\u5740\u4e3a:","short-confirmation":"\u5730\u5740\u5df2\u786e\u8ba4",confirmation:'\u5730\u5740\u5df2\u786e\u8ba4\u3002\u4e3a\u4e86\u5b89\u5168, \u9009\u62e9 "\u786e\u8ba4\u5730\u5740" \u9009\u9879\u53ef\u4ee5\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u518d\u6b21\u663e\u793a\u5730\u5740\uff0c\u5728\u83dc\u5355\u4e2d\u53ef\u70b9\u51fb\u5730\u5740\u4f59\u989d\u53f3\u4fa7\u7684\u6309\u94ae\u663e\u793a\u3002'}},"time-from-now":{"few-seconds":"\u51e0\u79d2\u949f\u4e4b\u524d",minute:"\u4e00\u5206\u949f\u4e4b\u524d",minutes:"{{time}} \u5206\u949f\u4e4b\u524d",hour:"\u4e00\u5c0f\u65f6\u4e4b\u524d",hours:"{{time}} \u5c0f\u65f6\u4e4b\u524d",day:"\u4e00\u5929\u4e4b\u524d",days:"{{time}} \u5929\u4e4b\u524d"},exchange:{"you-send":"\u4f60\u53d1\u9001","you-get":"\u4f60\u6536\u5230 (\u5927\u7ea6)","to-address":"\u5230 {{coin}} \u5730\u5740",price:"\u4ea4\u6613\u6c47\u7387","time-15":"\u4ea4\u6613\u65f6\u95f4","exchange-button":"\u4ea4\u6613","min-amount":"\u6700\u5c0f\u6570\u989d:","max-amount":"\u6700\u5927\u6570\u989d:","agree-1":"\u6211\u540c\u610f","agree-2":"\u4f7f\u7528\u6761\u6b3e","agree-3":"\u548c","agree-4":"\u9690\u79c1\u653f\u7b56","powered-by":"\u6280\u672f\u652f\u6301","need-help":"\u9700\u8981\u5e2e\u52a9?","support-portal":"\u5e2e\u52a9\u5165\u53e3",history:"\u8ba2\u5355\u5386\u53f2","order-not-found":"\u8ba2\u5355\u672a\u627e\u5230",status:"\u72b6\u6001",exchanging:"{{from}}\u4ea4\u6613{{to}}",select:"\u9009\u62e9",offline:"\u4ea4\u6613\u6682\u65f6\u4e0b\u7ebf","problem-connecting":"\u672a\u80fd\u8fde\u63a5\u5230\u670d\u52a1\u5668\u3002\u8bf7\u68c0\u67e5\u4f60\u7684\u7f51\u7edc\u8fde\u63a5\u5e76\u7a0d\u540e\u518d\u8bd5\u3002","invalid-address":"\u65e0\u6548\u5730\u5740\u3002",statuses:{"user-waiting":"\u7b49\u5f85\u5145\u503c\u3002\u8bf7\u5c06{{amount}} {{from}}\u53d1\u9001\u5230\u4e0b\u9762\u663e\u793a\u7684\u4ea4\u6613\u5730\u5740","user-waiting-info":"\u7cfb\u7edf\u6b63\u5728\u7b49\u5f85\u4f60\u5145\u503c\u5230\u4ea4\u6613\u5730\u5740\u3002\u4ea4\u6613\u5c06\u5728\u7cfb\u7edf\u68c0\u6d4b\u5230\u4f60\u7684\u5145\u503c\u5e76\u5728\u533a\u5757\u94fe\u4e2d\u786e\u8ba4\u540e\u5f00\u59cb\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u5145\u503c\uff0c\u5e94\u8be5\u5f88\u5feb\u5c31\u4f1a\u68c0\u6d4b\u5230\u3002","market-waiting-confirmations":"\u7b49\u5f85\u94fe\u4e0a\u4ea4\u6613\u786e\u8ba4","market-waiting-confirmations-info":"\u5df2\u7ecf\u68c0\u6d4b\u5230\u5145\u503c\uff0c\u7b49\u5f85\u533a\u5757\u94fe\u4e2d\u88ab\u786e\u8ba4\u3002","market-confirmed":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u63a5\u53d7","market-confirmed-info":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u7ecf\u5728\u533a\u5757\u94fe\u4e0a\u786e\u8ba4\u3002\u51c6\u5907\u9a6c\u4e0a\u6267\u884c\u5151\u6362\u3002","market-exchanged":"\u5b8c\u6210{{from}}\u5230{{to}}\u7684\u5151\u6362","market-exchanged-info":"\u5151\u6362\u5df2\u7ecf\u5b8c\u6210\u3002\u8d44\u91d1\u5c06\u5f88\u5feb\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740\u3002","market-withdraw-waiting":"\u6b63\u5728\u53d1\u9001{{to}}\u5230\u4f60\u7684\u5730\u5740","market-withdraw-waiting-info":"\u53d1\u9001{{to}}\u5230\u4f60\u5730\u5740\u7684\u8fdb\u7a0b\u5df2\u542f\u52a8",complete:"\u4ea4\u6613\u5df2\u5b8c\u6210!","complete-info":"\u8d44\u91d1\u5df2\u7ecf\u6210\u529f\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740\u3002",error:"\u53d1\u751f\u9519\u8bef","error-info":"\u8fd0\u8f6c\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u4f60\u53ef\u4ee5\u5728\u4e0b\u9762\u627e\u5230\u66f4\u591a\u4fe1\u606f\u3002\u5982\u679c\u4f60\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u4fdd\u5b58\u4e0b\u9762\u663e\u793a\u7684\u6240\u6709\u6570\u636e\u5e76\u4f7f\u7528\u9875\u9762\u53f3\u4e0b\u89d2\u7684\u5e2e\u52a9\u94fe\u63a5\u6765\u8054\u7cfb\u6280\u672f\u652f\u6301\u3002"},"history-window":{address:"\u5730\u5740",date:"\u65e5\u671f"},details:{"exchange-addr":"\u4ea4\u6613\u5730\u5740","exchange-addr-tag":"\u652f\u4ed8ID\u6216\u4ea4\u6613\u5fc5\u987b\u7528\u5230\u7684\u76ee\u6807\u6807\u7b7e","tx-id":"\u4ea4\u6613ID","order-id":"\u8ba2\u5355ID","initial-price":"\u521d\u59cb\u6c47\u7387","error-msg":"\u9519\u8bef\u4fe1\u606f ",details:"\u8be6\u60c5","start-date":"\u5f00\u59cb\u65e5\u671f",back:"\u8fd4\u56de","back-alert":'\u64cd\u4f5c\u6b63\u5728\u6267\u884c\u3002\u4f60\u771f\u7684\u60f3\u8981\u8fd4\u56de\u5230\u8868\u683c\u5417\uff1f\u4f60\u53ef\u4ee5\u901a\u8fc7\u70b9\u51fb"\u8ba2\u5355\u5386\u53f2"\u518d\u6b21\u770b\u5230\u6267\u884c\u8fc7\u7a0b'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js new file mode 100644 index 00000000..1c8cc19d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js @@ -0,0 +1 @@ +webpackJsonp([2],{"P+VX":function(e,n){e.exports={common:{"coin-id":"SKY","coin-hours":"CH",loading:"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...",new:"\u041d\u043e\u0432\u044b\u0439",load:"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c"},errors:{"fetch-version":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 Github","incorrect-password":"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c","api-disabled":"API \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d","no-wallet":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","no-outputs":"\u041d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432"},title:{wallets:"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u0438",send:"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c",history:"\u0418\u0441\u0442\u043e\u0440\u0438\u044f","buy-coin":"\u041a\u0443\u043f\u0438\u0442\u044c Skycoin",network:"\u0421\u0435\u0442\u044c",blockchain:"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d",outputs:"\u0412\u044b\u0445\u043e\u0434\u044b (Outputs)",transactions:"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","pending-txs":"\u041d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",backup:"\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435",explorer:"Skycoin \u044d\u043a\u0441\u043f\u043b\u043e\u0440\u0435\u0440",seed:"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f",qrcode:"QR-\u043a\u043e\u0434"},header:{"syncing-blocks":"\u0418\u0434\u0451\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432...",update1:"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430",update2:"\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.","pending-txs1":"\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","pending-txs2":"\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.","pending-txs3":"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0442\u044c\u044e.",errors:{"no-connections":"\u041d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0432\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0437\u043b\u0430\u043c!","no-backend1":"\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u0435\u044c \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435","no-backend2":"\u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c\u0435.","no-backend3":"",csrf:"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438: CSRF \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442."}},password:{title:"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c",label:"\u041f\u0430\u0440\u043e\u043b\u044c","confirm-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c",button:"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"},buy:{"deposit-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430:","select-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441",generate:"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c","deposit-location":"\u0410\u0434\u0440\u0435\u0441 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f","deposit-location-desc":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f Skycoin, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430.","make-choice":"\u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u044b\u0431\u043e\u0440","wallets-desc":"\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430. \u041e\u0434\u0438\u043d \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d \u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u043e\u0432.",send:"\u041f\u043e\u0448\u043b\u0438\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443","send-desc":"\u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0432\u0430\u043c\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u043d\u0438\u0436\u0435. \u041f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 {{ rate }} Skycoin/Selected Coin.","fraction-warning":"\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.",receive:"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Skycoin","receive-desc":"\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u0430\u0432\u0430\u043b\u044e\u0442\u044b, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u043d\u0435\u0439, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0438.","status-button":"\u0421\u0442\u0430\u0442\u0443\u0441:","check-status-button":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441","new-order-button":"\u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u043a\u0430\u0437",refresh:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c","available-now":"\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e:","choose-preference":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b. \u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b.",choose:"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u0443 ;)","send-coin":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","send-coin-text-1":"\u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0438\u0436\u0435. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0430 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0435, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u043f\u043e \u043a\u0443\u0440\u0441\u0443"},wizard:{"wallet-desc":'\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 Skycoin, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0444\u0440\u0430\u0437\u0430 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430" \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u0444\u0440\u0430\u0437\u0443.',"encrypt-desc":"\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0442\u0438, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0435\u0433\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435.","finish-button":"\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434",confirm:{title:"\u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u0444\u0440\u0430\u0437\u0443 \u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435!",desc:"\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0444\u0440\u0430\u0437\u0443 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0435\u0451 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u041f\u0440\u0438 \u0443\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0443 Skycoin!",checkbox:"\u041a\u043b\u044f\u043d\u0443\u0441\u044c. \u042f \u0437\u0430\u043f\u0438\u0441\u0430\u043b.",button:"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"}},wallet:{"new-address":"\u041d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441","show-empty":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435","hide-empty":"\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435",encrypt:"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a",decrypt:"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a",edit:"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0432\u043e\u0430\u0442\u044c",add:"\u041d\u043e\u0432\u044b\u0439 \u043a\u043e\u0448\u0435\u043b\u0451\u043a",load:"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","encryption-enabled":"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d","encryption-disabled":"\u0411\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f",wallet:"\u041a\u043e\u0448\u0435\u043b\u0451\u043a",new:{"create-title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","load-title":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","encrypt-title":"\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","name-label":"\u0418\u043c\u044f \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","seed-label":"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f","confirm-seed-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443","seed-warning":"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0430 \u0444\u0440\u0430\u0437\u0443 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0432 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0432 \u0434\u0430\u043b\u0438 \u043e\u0442 \u0447\u0443\u0436\u0438\u0445 \u0433\u043b\u0430\u0437. \u041f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Skycoin \u043a\u043e\u0448\u0435\u043b\u0451\u043a!","create-button":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c","load-button":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","12-words":"12 \u0441\u043b\u043e\u0432","24-words":"24 \u0441\u043b\u043e\u0432\u0430","generate-12-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 12 \u0441\u043b\u043e\u0432","generate-24-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 24 \u0441\u043b\u043e\u0432",encrypt:"\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435","encrypt-warning":"\u041c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u043a\u0430\u0448\u0435\u043b\u044c\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f. \u0422\u0430\u043a \u0436\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435."},rename:{title:"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","name-label":"\u0418\u043c\u044f","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","rename-button":"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c"},address:{copy:"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c","copy-address":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441",copied:"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e!",outputs:"\u041d\u0435\u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044b (Unspent Outputs)"}},send:{"from-label":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441","to-label":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430","amount-label":"\u0421\u0443\u043c\u043c\u0430","notes-label":"\u0417\u0430\u043c\u0435\u0442\u043a\u0438","wallet-label":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a","addresses-label":"\u0410\u0434\u0440\u0435\u0441","addresses-help":"\u0410\u0434\u0440\u0435\u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","change-address-label":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430","change-address-help":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u0434\u0430\u0447\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u043a\u0430\u0436\u0438\u0442\u0435, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438","destinations-label":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439","destinations-help1":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0441\u0443\u043c\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","destinations-help2":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0443\u043c\u043c\u0430 Skycoin & CH \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","hours-allocation-label":"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u044b (CH)","options-label":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","value-label":"\u0424\u0430\u043a\u0442\u043e\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0447\u0430\u0441\u043e\u0432 (CH)","value-help":"\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0430\u043a\u0442\u043e\u0440, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 CH \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439","preview-button":"\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440","send-button":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434",simple:"\u041e\u0431\u044b\u0447\u043d\u044b\u0439",advanced:"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439"},tx:{transaction:"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f","confirm-transaction":"\u041f\u043e\u0434\u0442\u0435\u0440\u0434\u0438\u0442\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e",from:"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c",to:"\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c",date:"\u0414\u0430\u0442\u0430",status:"\u0421\u0442\u0430\u0442\u0443\u0441",coins:"\u0421\u0443\u043c\u043c\u0430",hours:"\u0427\u0430\u0441\u044b",id:"TX ID","show-more":"\u0418\u043d\u0444\u043e","hours-sent":"\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c","hours-burned":"\u0441\u0436\u0438\u0433\u0430\u0435\u043c",inputs:"\u0412\u0445\u043e\u0434\u044b",outputs:"\u0412\u044b\u0445\u043e\u0434\u044b",confirmed:"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430",pending:"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435","current-rate":"\u041f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043a\u0443\u0440\u0441\u0443"},backup:{"wallet-directory":"\u041f\u0430\u043f\u043a\u0430 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430:","seed-warning":"\u0414\u0415\u0420\u0416\u0418\u0422\u0415 \u0424\u0420\u0410\u0417\u0423 \u0412\u041e\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d\u0418\u042f \u0412 \u041d\u0410\u0414\u0401\u0416\u041d\u041e\u041c \u041c\u0415\u0421\u0422\u0415. \u041d\u0410 \u0411\u0423\u041c\u0410\u0413\u0415. \u041e\u0424\u0424\u041b\u0410\u0419\u041d. \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u043c\u043e\u0433 \u0435\u0451 \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u0442\u044c - \u0432\u0430\u0448\u044b \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.",desc:"\u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432.
\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u0440\u0430\u0437 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\u0445 \u0431\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0438 \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043d\u0435\u0439 \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c .wlt. \u0424\u0440\u0430\u0437\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0438\u0445. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043b\u044e\u0431\u043e\u0433\u043e (\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e) \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430","close-button":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c",wallet:"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430",filename:"\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430",seed:"\u0424\u0440\u0430\u0437\u0430","show-seed":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443","no-wallets":"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432 \u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0442"},blockchain:{blocks:"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432",time:"\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430",hash:"\u0425\u044d\u0448 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430","current-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","current-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442"},network:{peer:"\u041f\u0438\u0440 (Peer)",source:"\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a","block-height":"\u0412\u044b\u0441\u043e\u0442\u0430 \u0431\u043b\u043e\u043a\u0430","last-seen":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a","last-received":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b\u0439","last-sent":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b\u0439",in:"\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435",out:"\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435",sources:{default:"\u041f\u0438\u0440 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",exchange:"\u041e\u0431\u043c\u0435\u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438"}},"pending-txs":{timestamp:"\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438",txid:"ID \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",none:"\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0442\u0440\u0430\u043d\u0430\u0437\u043a\u0446\u0438\u0439 \u0436\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439",my:"\u041c\u043e\u0439",all:"\u0412\u0441\u0435"},history:{"tx-detail":"\u0414\u0435\u0442\u0430\u043b\u0438 \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",sending:"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c",sent:"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e",received:"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e",receiving:"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c",pending:"\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f","no-txs":"\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439"},teller:{done:"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e","waiting-confirm":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439","waiting-deposit":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0434\u0435\u043f\u043e\u0437\u0438\u0442","waiting-send":"\u041f\u043e\u0441\u044b\u043b\u0430\u0435\u043c Skycoin",unknown:"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e"}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js new file mode 100644 index 00000000..73fef923 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js @@ -0,0 +1 @@ +webpackJsonp([3],{"0v8u":function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Loading...",new:"New",load:"Load"},errors:{error:"Error","fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","error-decrypting":"Error decrypting the wallet","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs","window-size":"The window is too narrow for the content"},title:{language:"Select Language",wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",qrcode:"QR Code",reset:"Reset Password",exchange:"Exchange","select-address":"Select Address","order-history":"Order history"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.",synchronizing:"The wallet is synchronizing. Data you see may not be updated.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed","reset-link":"I forgot my password"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a hardware wallet?","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","new-addresses":"New Addresses","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.",delete:"Delete Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled","hw-security-warning":'Possible security risk. Access the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected for more information.',wallet:"Wallet","hardware-wallet":"Hardware Wallet","delete-confirmation":'WARNING: The wallet "{{ name }}" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list). Do you want to continue?',"delete-confirmation-check":"Yeah, I want to delete the wallet.","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the hardware wallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","unconventional-seed-title":"Possible error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed."},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},"add-addresses":{title:"Select quantity","name-quantity":"How many addresses to create","cancel-button":"Cancel","create-button":"Create"},address:{show:"Press to show",copy:"Copy","copy-address":"Copy address",copied:"Copied!",confirm:"Confirm address",outputs:"Unspent outputs",history:"History"}},send:{"synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","notes-label":"Notes","wallet-label":"Wallet","addresses-label":"Addresses","invalid-amount":"Please enter a valid amount","addresses-help":"Limit the addresses from where the coins and hours could be sent","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown","all-outputs":"All the outputs of the selected addresses","available-msg-part1":"With your current selection you can send up to","available-msg-part2":"and","available-msg-part3":"(at least","available-msg-part4":"must be used for the transaction fee).","change-address-label":"Custom change address","change-address-select":"Select","change-address-help":'Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the "Select" link to choose an address from one of your wallets',"destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to outputs","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced","select-wallet":"Select Wallet"},reset:{"wallet-label":"Wallet","seed-label":"Wallet seed","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","reset-button":"Reset"},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID","show-more":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","block-height-short":"Block","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",moving:"Internally moving",moved:"Internally moved",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)",filter:"Active filter: ",filters:"Active filters: ","all-addresses":"All addresses"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"},confirmation:{"header-text":"Confirmation","confirm-button":"Yes","cancel-button":"No",close:"Close"},service:{api:{"server-error":"Server error"},wallet:{"not-enough-hours":"Not enough available Coin Hours to perform the transaction!"}},"hardware-wallet":{general:{"default-wallet-name":"New hardware wallet","error-disconnected":"Unable to perform the operation. The hardware wallet is not connected.","simple-error":"Error, Unable to perform the operation.","generic-error":"Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.","generic-error-internet":"Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.","error-incorrect-wallet":"Unable to perform the operation. The connected hardware wallet is different from the expected one.","error-incorrect-pin":"Unable to perform the operation. The PIN you have entered is not correct.",confirm:"Please, confirm the operation in the hardware wallet.","confirm-and-more":"Please, confirm the operation in the hardware wallet and follow the instructions.",close:"Close",cancel:"Cancel",continue:"Continue",completed:"Operation completed successfully.",refused:"The operation failed or was canceled."},errors:{"too-many-inputs":"The transaction has too many inputs and can not be processed. Please contact technical support.","too-many-outputs":"The transaction has too many outputs and can not be processed. Please contact technical support."},"security-warning":{title:"Security warning",text:'The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected and solve the security problems before continuing.',check:"I understand the risks and want to continue",continue:"Continue",cancel:"Cancel"},options:{connecting:"Connecting...",disconnected:"No hardware wallet detected. Please connect a hardware wallet to use this option.","unconfigured-detected-title":"Unconfigured hardware wallet","unconfigured-detected":'A seedless hardware wallet has been detected. Select "Configure automatically" if you want to configure it as a brand new wallet and start using it immediately, or select "Restore backup" if you want to configure it with a previously created seed backup and thus be able to access your funds again.',"configured-detected":"Hardware wallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security warnings","security-warning-title":"Security warning","backup-warning":'You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the "Create a backup" option.',"pin-warning":'The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the "Create PIN code" option.',options:"Options:","configure-automatically":"Configure automatically","restore-backup":"Restore backup","create-backup":"Create a backup",wipe:"Wipe the device","confirm-seed":"Confirm seed","create-pin":"Create PIN code","change-pin":"Change PIN code","forgotten-pin1":"If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking","forgotten-pin2":"here."},"generate-seed":{text:"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.",configuring:"Configuring..."},"restore-seed":{text:"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.",warning:"WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.","error-wrong-word":"Error: The retyped word does not match the one requested by the hardware wallet.","error-invalid-seed":"Error: The seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: The seed is valid but does not match the one in the device."},added:{title:"New Hardware Wallet",configuring:"New hardware wallet detected. Configuring...",done:"Done",added1:"The connected hardware wallet has been added to the wallets list with the following name:",added2:"Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish."},wipe:{warning:"WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete":"Also remove from the wallets list"},"create-backup":{warning:'WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the "seed") will be able access the wallet balance, so extreme caution is advised.',instructions:"Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly."},"seed-word":{title:"Enter word",info1:"Enter the word indicated in the device",info2:"You will be asked to enter the words of your backup seed in random order, plus a few additional words.",word:"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. Two PINs you have entered do not match."},"enter-pin":{title:"Enter PIN","title-change-current":"Enter the current PIN","title-change-new":"Enter the new PIN","title-change-confirm":"Confirm the new PIN",instructions:"The PIN layout is displayed on the hardware wallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction.","instructions-change":"Please enter a hard-to-guess PIN of between 4 and 8 numbers.",help:"Need help?"},"pin-help":{title:"Help",part1:"When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.",part2:'To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is "23" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.',part3:'If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is "23", you can not simply type "23" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet.'},"create-tx":{title:"Create transaction"},"confirm-address":{title:"Confirm address",instructions:"Please confirm on the hardware wallet if the address is:","short-confirmation":"Address confirmed.",confirmation:'Address confirmed. For security, you can re-show the address in the hardware wallet using the "Confirm address" option, in the menu that you can display by pressing the button at the right of the address balance.'}},"time-from-now":{"few-seconds":"a few seconds ago",minute:"one minute ago",minutes:"{{time}} minutes ago",hour:"one hour ago",hours:"{{time}} hours ago",day:"one day ago",days:"{{time}} days ago"},exchange:{"you-send":"You send","you-get":"You get (approx.)","to-address":"To {{coin}} address",price:"Exchange rate","time-15":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-1":"I agree with","agree-2":"Terms of Use","agree-3":"and","agree-4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal",history:"Order history","order-not-found":"Order not found",status:"Status",exchanging:"Exchanging {{from}} for {{to}}",select:"Select",offline:"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later.","invalid-address":"Invalid address.",statuses:{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.",complete:"Exchange completed!","complete-info":"The funds have been successfully sent to your address.",error:"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{address:"Address",date:"Date"},details:{"exchange-addr":"Exchange address","exchange-addr-tag":"Payment ID or Destination Tag which must be used for the transaction","tx-id":"Transaction ID","order-id":"Order ID","initial-price":"Initial exchange rate","error-msg":"Error message",details:"Details","start-date":"Start date",back:"Back","back-alert":'The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the "Order history" button'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3rdpartylicenses.txt b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3rdpartylicenses.txt new file mode 100644 index 00000000..4041b949 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3rdpartylicenses.txt @@ -0,0 +1,362 @@ +moment@2.21.0 +MIT +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +webpack@3.11.0 +MIT +Copyright JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +base64-js@1.2.3 +MIT +The MIT License (MIT) + +Copyright (c) 2014 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +buffer@4.9.1 +MIT +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh, and other contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +base-x@3.0.5 +MIT +The MIT License (MIT) + +Copyright (c) 2018 base-x contributors +Copyright (c) 2014-2018 The Bitcoin Core developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +@angular/core@5.2.0 +MIT +MIT + +safe-buffer@5.1.1 +MIT +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +@ngx-translate/core@9.1.1 +MIT +MIT + +hammerjs@2.0.8 +MIT +The MIT License (MIT) + +Copyright (C) 2011-2014 by Jorik Tangelder (Eight Media) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +isarray@1.0.0 +MIT +MIT + +ieee754@1.1.8 +BSD-3-Clause +Copyright (c) 2008, Fair Oaks Labs, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Fair Oaks Labs, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +bignumber.js@7.2.1 +MIT +MIT + +@angular/common@5.2.0 +MIT +MIT + +@angular/platform-browser@5.2.0 +MIT +MIT + +@angular/http@5.2.0 +MIT +MIT + +@angular/cdk@5.0.4 +MIT +The MIT License + +Copyright (c) 2017 Google LLC. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +@angular/material@5.0.4 +MIT +The MIT License + +Copyright (c) 2017 Google LLC. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +@angular/forms@5.2.0 +MIT +MIT + +@angular/animations@5.2.0 +MIT +MIT + +@angular/router@5.2.0 +MIT +MIT + +@angular/platform-browser-dynamic@5.2.0 +MIT +MIT + +core-js@2.5.3 +MIT +Copyright (c) 2014-2017 Denis Pushkarev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +zone.js@0.8.20 +MIT +The MIT License + +Copyright (c) 2016 Google, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +bootstrap@4.0.0-beta.3 +MIT +The MIT License (MIT) + +Copyright (c) 2011-2017 Twitter, Inc. +Copyright (c) 2011-2017 The Bootstrap Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js new file mode 100644 index 00000000..c6151504 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js @@ -0,0 +1 @@ +webpackJsonp([4],{"/YBz":function(e,a){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Cargando...",new:"Nueva",load:"Cargar"},errors:{error:"Error","fetch-version":"No ha sido posible verificar la \xfaltima versi\xf3n desde Github","incorrect-password":"Contrase\xf1a incorrecta","error-decrypting":"Error al desencriptar la billetera","api-disabled":"API desabilitada","no-wallet":"La billetera no existe","no-outputs":"No hay salidas no gastadas","window-size":"La ventana es demasiado estrecha para el contenido"},title:{language:"Seleccionar Lenguaje",wallets:"Billeteras",send:"Enviar",history:"Historial","buy-coin":"Comprar Skycoins",network:"Red",blockchain:"Blockchain",outputs:"Salidas",transactions:"Transacciones","pending-txs":"Transacciones Pendientes",backup:"Respaldar Billetera",explorer:"Explorador de Skycoin",seed:"Semilla de la Billetera",qrcode:"C\xf3digo QR",reset:"Restablecer contrase\xf1a",exchange:"Intercambiar","select-address":"Seleccionar Direcci\xf3n","order-history":"Historial de \xf3rdenes"},header:{"syncing-blocks":"Sincronizando bloques",update1:"La actualizaci\xf3n",update2:"est\xe1 disponible.",synchronizing:"El nodo est\xe1 sincronizando. Los datos mostrados pueden estar desactualizados.","pending-txs1":"Hay una o m\xe1s","pending-txs2":"transacciones pendientes.","pending-txs3":"Los datos mostrados pueden estar desactualizados.",errors:{"no-connections":"Sin conexiones activas, \xa1el cliente no est\xe1 conectado a otros nodos!","no-backend1":"Sin acceso al servidor. Por favor, reinicie la aplicaci\xf3n y/o cont\xe1ctenos v\xeda","no-backend2":"Telegram.","no-backend3":"",csrf:"Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato."}},password:{title:"Introduzca Su Contrase\xf1a",label:"Contrase\xf1a","confirm-label":"Confirmar contrase\xf1a",button:"Continuar","reset-link":"He olvidado mi contrase\xf1a"},buy:{"deposit-address":"Seleccione una direcci\xf3n para la cual generar un enlace de dep\xf3sito BTC:","select-address":"Seleccione una direcci\xf3n",generate:"Generar","deposit-location":"Localizaci\xf3n de Dep\xf3sito","deposit-location-desc":"Seleccione la billetera en la que desea que le depositemos sus Skycoins despu\xe9s de recibir los Bitcoins.","make-choice":"Realice una selecci\xf3n","wallets-desc":"Una nueva direcci\xf3n BTC es generada cada vez que se selecciona una nueva billetera y direcci\xf3n. Una \xfanica direcci\xf3n de Skycoin puede tener asignadas hasta 5 direcciones BTC.",send:"Enviar Bitcoins","send-desc":"Env\xede Bitcoins a la direcci\xf3n abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva direcci\xf3n en la billetera seleccionada m\xe1s arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.","fraction-warning":"\xa1Env\xede s\xf3lo m\xfaltiplos de la tasa SKY/BTC! Los Skycoins son enviados en n\xfameros enteros, \xa1no se env\xedan fracciones de SKY!",receive:"Recibir SKY","receive-desc":"Despu\xe9s de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.","status-button":"Estatus:","check-status-button":"Revisar Estatus","new-order-button":"Nueva Orden"},wizard:{"wallet-desc":'Si no tiene una billetera, use la semilla generada autom\xe1ticamente para crear una nueva. Si ya tiene una billetera, seleccione "Cargar" e introduzca su semilla.',"encrypt-desc":"Incremente la seguridad de su billetera encript\xe1ndola. Al introducir una contrase\xf1a m\xe1s abajo, su billetera ser\xe1 encriptada. S\xf3lo quien tenga la contrase\xf1a podr\xe1 acceder a la billetera y retirar fondos.","hardware-wallet-link":"\xbfUtilizando una billetera de hardware?","finish-button":"Finalizar","back-button":"Volver",confirm:{title:"\xa1Resguarde su semilla!",desc:"Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. \xa1Si olvida su semilla, NO podr\xe1 recuperar su billetera!",checkbox:"Est\xe1 segura, lo garantizo.",button:"Continuar"}},wallet:{"new-address":"Nueva Direcci\xf3n","new-addresses":"Nuevas Direcciones","show-empty":"Mostrar Vac\xedas","hide-empty":"Ocultar Vac\xedas",encrypt:"Encriptar Billetera",decrypt:"Desencriptar Billetera","decrypt-warning":"Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precauci\xf3n.",delete:"Borrar Billetera",edit:"Editar Billetera",add:"Agregar Billetera",load:"Cargar Billetera","encryption-enabled":"Encriptado habilitado","encryption-disabled":"Encriptado deshabilitado","hw-security-warning":'Posible riesgo de seguridad. Acceda a las opciones de la billetera de hardware (presionando el bot\xf3n "Billetera de Hardware" debajo de la lista de billeteras) mientras el dispositivo est\xe1 conectado, para m\xe1s informaci\xf3n.',wallet:"Billetera","hardware-wallet":"Billetera de Hardware","delete-confirmation":'ADVERTENCIA: la billetera "{{ name }}" ser\xe1 removida de la lista. Para agregarla nuevamente, deber\xe1 volver a conectar el dispositivo y abrir las opciones de la billetera del hardware (presionando el bot\xf3n "Billetera de hardware" debajo de la lista de las billeteras). \xbfDesea continuar?',"delete-confirmation-check":"S\xed, quiero borrar la billetera.","max-hardware-wallets-error":"Ya ha alcanzado el n\xfamero m\xe1ximo de direcciones que se puede agregar a la billetera de hardware.","add-many-confirmation":"ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las \xfaltimas y no las primeras, es posible que algunas direcciones no se recuperen autom\xe1ticamente si intenta restaurar la billetera con la semilla (tendr\xe1 que agregarlas manualmente). \xbfDesea continuar?",new:{"create-title":"Crear Billetera","load-title":"Cargar Billetera","encrypt-title":"Encriptar la billetera","name-label":"Nombre","seed-label":"Semilla","confirm-seed-label":"Confirmar semilla","seed-warning":"\xa1Recuerde esta semilla! Mant\xe9ngala en un lugar seguro. \xa1Si olvida su semilla, no podr\xe1 recuperar la billetera!","create-button":"Crear","load-button":"Cargar","cancel-button":"Cancelar","12-words":"12 palabras","24-words":"24 palabras","generate-12-seed":"Generar una semilla de 12 palabras","generate-24-seed":"Generar una semilla de 24 palabras",encrypt:"Encriptar billetera","encrypt-warning":"Le sugerimos que encripte con una contrase\xf1a cada una de sus billeteras. Si olvida su contrase\xf1a, puede restaurarla con la semilla. Aseg\xfarese de guardar su semilla en un lugar seguro antes de encriptar la billetera.","unconventional-seed-title":"Posible error","unconventional-seed-text":"Usted introdujo una semilla no convencional. Si lo hizo por alguna raz\xf3n en especial, puede continuar (s\xf3lo recomendable para usuarios avanzados). Sin embargo, si su intenci\xf3n es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.","unconventional-seed-check":"Continuar con la semilla no convencional."},rename:{title:"Renombrar Billetera","name-label":"Nombre","cancel-button":"Cancelar","rename-button":"Renombrar"},"add-addresses":{title:"Seleccionar cantidad","name-quantity":"Cantidad de direcciones a crear","cancel-button":"Cancelar","create-button":"Crear"},address:{show:"Presione para mostrar",copy:"Copiar","copy-address":"Copiar Direcci\xf3n",copied:"\xa1Copiado!",confirm:"Confirmar Direcci\xf3n",outputs:"Salidas No Gastadas",history:"Historial"}},send:{"synchronizing-warning":"La billetera todav\xeda est\xe1 sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. \xbfSeguro de que desea continuar?","from-label":"Enviar desde","to-label":"Enviar a","amount-label":"Cantidad","notes-label":"Notas","wallet-label":"Billetera","addresses-label":"Direcci\xf3n","invalid-amount":"Por favor introduzca una cantidad v\xe1lida","addresses-help":"Limite las direcciones desde donde se podr\xedan enviar las monedas y las horas","all-addresses":"Todas las direcciones de la billetera seleccionada","outputs-label":"Salidas no gastadas","outputs-help":"Limite las salidas no gastadas desde donde se podr\xedan enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.","all-outputs":"Todas las salidas no gastadas de las direcciones seleccionadas","available-msg-part1":"Con su selecci\xf3n actual puede enviar hasta","available-msg-part2":"y","available-msg-part3":"(al menos","available-msg-part4":"deben ser utilizadas para la tarifa de transacci\xf3n).","change-address-label":"Direcci\xf3n de retorno personalizada","change-address-select":"Seleccionar","change-address-help":'Direcci\xf3n para recibir el cambio. Si no se proporciona, ser\xe1 elegida autom\xe1ticamente. Haga clic en el enlace "Seleccionar" para elegir una direcci\xf3n de una de sus billeteras',"destinations-label":"Destinos","destinations-help1":"Direcciones de destino y sus monedas","destinations-help2":"Direcciones de destino, sus monedas y coin hours","hours-allocation-label":"Distribuci\xf3n autom\xe1tica de coin hours","options-label":"Opciones","value-label":"Factor de distribuci\xf3n de las coin hours","value-help":"Mientras mayor sea el valor, m\xe1s coin hours se enviar\xe1n a las salidas","preview-button":"Preview","send-button":"Enviar","back-button":"Volver",simple:"Simple",advanced:"Advanzado","select-wallet":"Seleccionar Billetera"},reset:{"wallet-label":"Billetera","seed-label":"Semilla de la billetera","password-label":"Nueva contrase\xf1a (deje en blanco si desea que la billetera no est\xe9 encriptada)","confirm-label":"Confirme la contrase\xf1a","reset-button":"Restaurar"},tx:{transaction:"Transacci\xf3n","confirm-transaction":"Confirmar Transacci\xf3n",from:"Desde",to:"A",date:"Fecha",status:"Estatus",coins:"Monedas",hours:"Horas",id:"Tx ID","show-more":"Mostrar m\xe1s","hours-moved":"movida(s)","hours-sent":"enviada(s)","hours-received":"recibida(s)","hours-burned":"quemada(s)",inputs:"Entradas",outputs:"Salidas",confirmed:"Confirmada",pending:"Pendiente","current-rate":"Calculado a la tasa actual"},backup:{"wallet-directory":"Directorio de la Billetera:","seed-warning":"RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podr\xe1 recuperar las monedas.",desc:"Use la tabla de m\xe1s abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de m\xe1s arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.","close-button":"Cerrar",wallet:"Nombre de la Billetera",filename:"Archivo",seed:"Semilla","show-seed":"Mostrar semilla","no-wallets":"No hay billeteras encriptadas"},blockchain:{blocks:"Cantidad de bloques",time:"Fecha del \xfaltimo bloque",hash:"Hash del \xfaltimo bloque","current-supply":"Suministro de SKY actual","total-supply":"Suministro de SKY total","current-coinhour-supply":"Suministro de Coin Hours actual","total-coinhour-supply":"Suministro de Coin Hours total"},network:{peer:"Par",source:"Fuente","block-height":"Altura del bloque","block-height-short":"Bloque","last-seen":"\xdaltima vez visto","last-received":"\xdaltima recepci\xf3n","last-sent":"\xdaltimo env\xedo",in:"Entrante",out:"Saliente",sources:{default:"Par por defecto",exchange:"Intercambio de pares"}},"pending-txs":{timestamp:"Fecha",txid:"ID de la transacci\xf3n",none:"Actualmente no hay transacciones pendientes",my:"M\xedas",all:"Todas"},history:{"tx-detail":"Detalles de la Transacci\xf3n",moving:"Moviendo internamente",moved:"Movida internamente",sending:"Enviando",sent:"Enviada",received:"Recibida",receiving:"Recibiendo",pending:"Pendiente","no-txs":"Usted no tiene historial de transacciones","no-txs-filter":"No hay transacciones que coincidan con los criterios de filtro actuales","no-filter":"Sin filtros activos (Presione para seleccionar billeteras/direcciones)",filter:"Filtro activo: ",filters:"Filtros activo: ","all-addresses":"Todas las direcciones"},teller:{done:"Completado","waiting-confirm":"Esperando confirmaci\xf3n","waiting-deposit":"Esperando dep\xf3sito de Bitcoins","waiting-send":"Esperando para env\xedar Skycoins",unknown:"Desconocido"},confirmation:{"header-text":"Confirmaci\xf3n","confirm-button":"S\xed","cancel-button":"No",close:"Cerrar"},service:{api:{"server-error":"Error de servidor"},wallet:{"not-enough-hours":"\xa1No cuenta con suficientes Coin Hours para realizar la operaci\xf3n!"}},"hardware-wallet":{general:{"default-wallet-name":"Nueva billetera de hardware","error-disconnected":"No se puede realizar la operaci\xf3n. La billetera de hardware no est\xe1 conectada.","simple-error":"Error, no se puede realizar la operaci\xf3n.","generic-error":"No se puede realizar la operaci\xf3n. Aseg\xfarese de haber conectado una billetera de hardware v\xe1lida y de que no est\xe9 esperando por alguna confirmaci\xf3n o respuesta.","generic-error-internet":"No se puede realizar la operaci\xf3n. Aseg\xfarese de haber conectado una billetera de hardware v\xe1lida que no est\xe9 esperando por alguna confirmaci\xf3n o respuesta y de que su equipo cuente con conexi\xf3n a internet y al nodo.","error-incorrect-wallet":"No se puede realizar la operaci\xf3n. La billetera de hardware conectada es diferente a la esperada.","error-incorrect-pin":"No se puede realizar la operaci\xf3n. El PIN que ha introducido no es correcto.",confirm:"Por favor, confirme la operaci\xf3n en la billetera de hardware.","confirm-and-more":"Por favor, confirme la operaci\xf3n en la billetera de hardware y siga las instrucciones.",close:"Cerrar",cancel:"Cancelar",continue:"Continuar",completed:"La operaci\xf3n se realiz\xf3 con \xe9xito.",refused:"La operaci\xf3n fall\xf3 o fue cancelada."},errors:{"too-many-inputs":"La transacci\xf3n tiene demasiadas entradas y no se puede procesar. Por favor, p\xf3ngase en contacto con el soporte t\xe9cnico.","too-many-outputs":"La transacci\xf3n tiene demasiadas salidas y no se puede procesar. Por favor, p\xf3ngase en contacto con el soporte t\xe9cnico."},"security-warning":{title:"Advertencia de seguridad",text:'La \xfaltima vez que se conect\xf3 esta billetera de hardware, se encontraron una o m\xe1s advertencias de seguridad. Le recomendamos que abra las opciones de billetera de hardware (presionando el bot\xf3n "Billetera de hardware" debajo de la lista de billeteras) mientras el dispositivo est\xe1 conectado y resuelva los problemas de seguridad antes de continuar.',check:"Entiendo los riesgos y deseo continuar.",continue:"Continuar",cancel:"Cancelar"},options:{connecting:"Conectando...",disconnected:"Billetera de hardware no detectada. Por favor, conecte una billetera de hardware para usar esta opci\xf3n.","unconfigured-detected-title":"Billetera de hardware no configurada","unconfigured-detected":'Se ha detectado una billetera de hardware sin semilla. Seleccione "Configurar autom\xe1ticamente" si desea configurarla como una billetera nueva y comenzar a usarla inmediatamente, o seleccione "Restaurar una copia de seguridad" si desea configurarla con la copia de seguridad de una semilla creada anteriormente y as\xed poder acceder a sus fondos de nuevo.',"configured-detected":"Billetera de hardware detectada. El dispositivo se identifica en la lista de billeteras como:","security-warnings-title":"Advertencias de seguridad","security-warning-title":"Advertencia de seguridad","backup-warning":'Debe hacer una copia de seguridad de la semilla de la billetera de hardware o podr\xeda perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opci\xf3n "Crear copia de seguridad".',"pin-warning":'La billetera de hardware conectada no tiene un PIN. El c\xf3digo PIN protege la billetera de hardware en caso de p\xe9rdida, robo y pirateo. Para crear un c\xf3digo PIN, seleccione la opci\xf3n "Crear c\xf3digo PIN".',options:"Opciones:","configure-automatically":"Configurar autom\xe1ticamente","restore-backup":"Restaurar una copia de seguridad","create-backup":"Crear copia de seguridad",wipe:"Borrar el dispositivo","confirm-seed":"Confirmar la semilla","create-pin":"Crear c\xf3digo PIN","change-pin":"Cambiar el c\xf3digo PIN","forgotten-pin1":"Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la billetera del hardware y luego restaurarla con la semilla haciendo clic","forgotten-pin2":"aqu\xed."},"generate-seed":{text:"Antes de continuar, puede seleccionar el n\xfamero de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una raz\xf3n especial para seleccionar uno u otro, puede dejar el valor predeterminado.",configuring:"Configurando..."},"restore-seed":{text:"Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.","check-text":"Puede usar esta opci\xf3n para ingresar una semilla y verificar si es igual a la de la billetera de hardware. Antes de comenzar, seleccione el n\xfamero de palabras de la semilla que desea verificar.",warning:"ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una billetera de hardware de la misma marca/modelo.","error-wrong-word":"Error: la palabra introducida no coincide con la solicitada por la billetera de hardware.","error-invalid-seed":"Error: La semilla no es v\xe1lida. Por favor, aseg\xfarese de ingresar las palabras correctas en el orden correcto.","error-wrong-seed":"Error: la semilla es v\xe1lida pero no coincide con la del dispositivo."},added:{title:"Nueva Billetera de Hardware",configuring:"Nueva billetera de hardware detectada. Configurando...",done:"Hecho",added1:"La billetera de hardware conectada se ha agregado a la lista de billeteras con el siguiente nombre:",added2:"Ahora puede consultar el saldo y las direcciones de la billetera de hardware incluso cuando no est\xe1 conectada. Adem\xe1s, puede cambiar el nombre de la billetera o eliminarla de la lista de billeteras, si lo desea."},wipe:{warning:"ADVERTENCIA: Todos los datos en la billetera de hardware ser\xe1n eliminados. Si no tiene una copia de seguridad, no podr\xe1 volver a acceder a sus fondos.","confirm-delete":"Quitar tambi\xe9n de la lista de billeteras."},"create-backup":{warning:'ADVERTENCIA: Solo puede usar esta opci\xf3n para hacer una copia de seguridad de la semilla de su billetera de hardware una vez. Si decide continuar, tendr\xe1 que escribir un grupo de palabras (se recomienda hacerlo en papel y no en una computadora) que aparecer\xe1n en la pantalla de la billetera de hardware y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la "semilla") podr\xe1 acceder a los fondos de la cartera, por lo que se recomienda extremar las precauciones.',instructions:"Escriba la lista de palabras que aparecen en la pantalla de la billetera de hardware. Aseg\xfarate de respetar el orden y escribir cada palabra correctamente."},"seed-word":{title:"Ingresar palabra",info1:"Introduzca la palabra indicada en el dispositivo",info2:"Se le pedir\xe1 que ingrese las palabras de su semilla de respaldo en orden aleatorio, m\xe1s algunas palabras adicionales.",word:"Palabra solicitada","error-invalid-word":"La palabra introducida no es v\xe1lida.","error-loading-words":"Cargando la lista de palabras. Por favor espere."},"change-pin":{"pin-mismatch":"No se puede realizar la operaci\xf3n. Los dos PIN que ha introducido no coinciden."},"enter-pin":{title:"Ingresar PIN","title-change-current":"Ingrese el PIN actual","title-change-new":"Ingrese el nuevo PIN","title-change-confirm":"Confirme el nuevo PIN",instructions:"El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la billetera de hardware.","instructions-tx":"Introduzca el PIN para confirmar y firmar la transacci\xf3n.","instructions-change":"Ingrese un PIN dif\xedcil de adivinar de entre 4 y 8 n\xfameros.",help:"\xbfNecesita ayuda?"},"pin-help":{title:"Ayuda",part1:"Cuando sea necesario ingresar el PIN para continuar, la pantalla de la billetera del hardware mostrar\xe1 una matriz de 9 casillas con n\xfameros en orden aleatorio (el orden cambia cada vez) y se le pedir\xe1 que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el s\xedmbolo #.",part2:'Para ingresar el PIN, mire la posici\xf3n de los n\xfameros del PIN en la matriz de n\xfameros en la pantalla de la billetera de hardware y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es "23", el n\xfamero 2 est\xe1 en la esquina superior izquierda y el n\xfamero 3 en el centro de la matriz de n\xfameros de billetera de hardware, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.',part3:'Si lo desea, tambi\xe9n puede usar el teclado num\xe9rico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es "23", no puede simplemente escribir "23" con el teclado num\xe9rico, sino que deber\xe1 presionar las teclas que est\xe1n en la posici\xf3n donde est\xe1n los n\xfameros 2 y 3 en la pantalla de la billetera de hardware.'},"create-tx":{title:"Crear transacci\xf3n"},"confirm-address":{title:"Confirmar direcci\xf3n",instructions:"Por favor confirme en la billetera de hardware si la direcci\xf3n es:","short-confirmation":"Direcci\xf3n confirmada.",confirmation:'Direcci\xf3n confirmada. Por seguridad, puede volver a mostrar la direcci\xf3n en la billetera de hardware usando la opci\xf3n "Confirmar direcci\xf3n", en el men\xfa que puede mostrar presionando el bot\xf3n a la derecha del balance de la direccion.'}},"time-from-now":{"few-seconds":"hace pocos segundos",minute:"hace un minuto",minutes:"hace {{time}} minutos",hour:"hace una hora",hours:"hace {{time}} horas",day:"hace un d\xeda",days:"hace {{time}} d\xedas"},exchange:{"you-send":"Usted env\xeda","you-get":"Usted recibe (aprox.)","to-address":"A la direcci\xf3n de {{coin}}",price:"Tasa de cambio","time-15":"Duraci\xf3n del intercambio","exchange-button":"Intercambiar","min-amount":"Monto minimo:","max-amount":"Monto maximo:","agree-1":"Acepto los","agree-2":"T\xe9rminos de Uso","agree-3":"y la ","agree-4":"Pol\xedtica de Privacidad","powered-by":"Manejado por","need-help":"\xbfNecesita ayuda?","support-portal":"Portal de soporte",history:"Historial de \xf3rdenes","order-not-found":"Orden no encontrada",status:"Estado",exchanging:"Intercambiando {{from}} por {{to}}",select:"Seleccionar",offline:"El servicio est\xe1 temporalmente offline","problem-connecting":"No se puede conectar con el servicio. Por favor, compruebe su conexi\xf3n a Internet y vuelva a intentarlo m\xe1s tarde.","invalid-address":"Direcci\xf3n inv\xe1lida.",statuses:{"user-waiting":"Esperando el deposito. Por favor, env\xede {{amount}} {{from}} a la direcci\xf3n de intercambio indicada m\xe1s abajo","user-waiting-info":"El sistema est\xe1 a la espera de que realice el dep\xf3sito en la direcci\xf3n de intercambio. El proceso de intercambio comenzar\xe1 despu\xe9s de que se detecte el dep\xf3sito y sea confirmado en la cadena de bloques. Si ya ha realizado el dep\xf3sito, deber\xeda ser detectado en breve.","market-waiting-confirmations":"Esperando las confirmaciones de la transacci\xf3n","market-waiting-confirmations-info":"El dep\xf3sito ya ha sido detectado y el sistema est\xe1 esperando que sea confirmado en la cadena de bloques.","market-confirmed":"Transacci\xf3n aceptada","market-confirmed-info":"La transacci\xf3n ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.","market-exchanged":"{{from}} intercambiado por {{to}}","market-exchanged-info":"El intercambio se ha realizado. Los fondos ser\xe1n transferidos a su direcci\xf3n en un momento.","market-withdraw-waiting":"Enviando {{to}} a su direcci\xf3n","market-withdraw-waiting-info":"Se ha iniciado el proceso para enviar las monedas a su direcci\xf3n.",complete:"\xa1Intercambio completado!","complete-info":"Los fondos han sido enviados con \xe9xito a su direcci\xf3n.",error:"Se produjo un error","error-info":"Hubo un error en la operaci\xf3n, puede encontrar m\xe1s informaci\xf3n m\xe1s abajo. Si necesita ayuda, por favor guarde todos los datos de operaci\xf3n que se muestran m\xe1s abajo y comun\xedquese con soporte t\xe9cnico utilizando el enlace que se encuentra en la parte inferior derecha de esta p\xe1gina."},"history-window":{address:"Direcci\xf3n",date:"Fecha"},details:{"exchange-addr":"Direcci\xf3n de intercambio","exchange-addr-tag":"Payment ID o Destination Tag que debe usarse para la transacci\xf3n","tx-id":"ID de la transacci\xf3n","order-id":"ID de la orden","initial-price":"Tasa de cambio inicial","error-msg":"Mensaje de error",details:"Detalles","start-date":"Fecha de inicio",back:"Volver","back-alert":'La operaci\xf3n a\xfan est\xe1 en progreso. \xbfRealmente desea volver al formulario? Puede ver el progreso de esta operaci\xf3n nuevamente presionando el bot\xf3n "Historial de pedidos"'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js new file mode 100644 index 00000000..ebd2ddab --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js @@ -0,0 +1 @@ +webpackJsonp([5],{TKku:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Loading...",new:"New",load:"Load",success:"Success",warning:"Warning","changes-made":"The changes have been made."},errors:{error:"Error","fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","error-decrypting":"Error decrypting the wallet","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs","window-size":"The window is too narrow for the content"},title:{language:"Select Language",wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",reset:"Reset Password",exchange:"Exchange","select-address":"Select Address","order-history":"Order history"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.",synchronizing:"The wallet is synchronizing. Data you see may not be updated.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed","reset-link":"I forgot my password"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a Skywallet?","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","new-addresses":"New Addresses","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.",delete:"Delete Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled","hw-security-warning":'Possible security risk. Access the Skywallet options (by pressing the "Skywallet" button below the wallets list) while the device is connected for more information.',wallet:"Wallet","hardware-wallet":"Skywallet","delete-confirmation":'WARNING: The wallet "{{ name }}" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the "Skywallet" button below the wallets list). Do you want to continue?',"delete-confirmation-check":"Yeah, I want to delete the wallet.","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","words-number":"How many word the seed has","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","unconventional-seed-title":"Possible error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed.","synchronizing-warning-title":"Warning","synchronizing-warning-text":"The wallet is still synchronizing and some addresses may not be restored. If some addresses are not restored, please wait for the wallet to be fully synchronized and add them again manually.","synchronizing-warning-continue":"Continue","synchronizing-warning-cancel":"Cancel","wallet-created":"The wallet has been added to the list.",seed:{"enter-seed":"Press here to enter your seed.","change-seed":"Press to change","confirm-seed":"Press here to confirm your seed.","confirmed-seed":"Seed confirmed.","use-custom-seed":"Press here if you want to enter the seed manually.","use-normal-seed":"Press here if you want to enter the seed using the recommended method.","custom-seed-warning-title":"Warning","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","custom-seed-warning-check":"I understand the risks and want to continue","custom-seed-warning-cancel":"Cancel","custom-seed-warning-continue":"Continue","incorrect-word":"The word you have entered does not match the requested one.","invalid-seed":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","new-seed-help":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-help":"Please be sure to enter the correct words in the correct order."}},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},"add-addresses":{title:"Select quantity","name-quantity":"How many addresses to create","cancel-button":"Cancel","create-button":"Create",error:"There was an unexpected error. Please try again."},address:{show:"Press to show",copy:"Copy","copy-address":"Copy address",copied:"Copied!",confirm:"Confirm address",outputs:"Unspent outputs",history:"History"}},qr:{title:"QR Code","title-read-only":"QR Code",data:"QR Data:",address:"Address:","request-link":"Request specific amount",amount:"Request amount:",hours:"Request hours:",message:"Message:",invalid:"(invalid value)",copied:"The text has been copied to the clipboard."},send:{"synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer","wallet-label":"Wallet","addresses-label":"Addresses","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins":"send all","no-wallet-selected":"You must select a wallet first.","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","no-coins-left":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown","all-outputs":"All the outputs of the selected addresses","available-msg-part1":"With your current selection you can send up to","available-msg-part2":"and","available-msg-part3":"(at least","available-msg-part4":"must be used for the transaction fee).","change-address-label":"Custom change address","change-address-select":"Select","change-address-help":'Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the "Select" link to choose an address from one of your wallets',"destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to the recipients and less will be retained","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced","select-wallet":"Select Wallet","error-saving-note":"The transaction was successfully sent, but it was not possible to save the note.",sent:"Transaction successfully sent.",total:"Total:","bulk-send":{title:"Bulk Send",indications:'To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the "xyz" address, type "xyz,10,5"; if you want the hours to be calculated automatically, type "xyz,10". Decimal values must be separated with a dot.',process:"Process","error-no-data":"There is no text to process.","error-inconsistent-data":"If you set how many hours you want to send to a destinations, you must do so for all destinations.","error-invalid-data":"The entered text has an invalid format."}},reset:{"wallet-label":"Wallet","seed-label":"Wallet seed","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","reset-button":"Reset",done:"Password successfully changed."},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID",note:"Note","without-note":"Without note","show-more":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},"edit-note":{title:"Edit note","cancel-button":"Cancel","change-button":"Change"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","block-height-short":"Block","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",moving:"Internally moving",moved:"Internally moved",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending",note:"Note","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)",filter:"Active filter: ",filters:"Active filters: ","all-addresses":"All addresses"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"},confirmation:{"header-text":"Confirmation","confirm-button":"Yes","cancel-button":"No",close:"Close"},service:{api:{"server-error":"Server error"},wallet:{"not-enough-hours":"Not enough available Coin Hours to perform the transaction!"}},"hardware-wallet":{general:{"default-wallet-name":"New Skywallet","error-disconnected":"Unable to perform the operation. The Skywallet is not connected.","simple-error":"Error. Unable to perform the operation.","generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","generic-error-internet":"Unable to perform the operation. Make sure you have connected a valid Skywallet that is not waiting for input and that you have a connection to the internet/node.","error-incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","error-incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.",confirm:"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.",follow:"Please follow the instructions displayed on the Skywallet.",close:"Close",cancel:"Cancel",continue:"Continue",completed:"Operation completed successfully.",refused:"The operation failed or was canceled.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},errors:{"too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet service.",timeout:"The operation was canceled due to inactivity. Please try again.","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{title:"Security warning",text:"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.",link:"Open the Skywallet options window.",check:"I understand the risks and want to continue",continue:"Continue",cancel:"Cancel"},options:{connecting:"Connecting...",disconnected:"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":'A seedless Skywallet has been detected. Select "Configure automatically" if you want to configure it as a brand new wallet and start using it. Select "Restore backup" if you want to configure the Skywallet with a previously created seed backup.',"configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security warnings","security-warning-title":"Security warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":'The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the "Update firmware" option.',"backup-warning":'You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the "Create a backup" option.',"pin-warning":'The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the "Create PIN code" option.',options:"Options:","update-firmware":"Update firmware","configure-automatically":"Configure automatically","restore-backup":"Restore backup","create-backup":"Create a backup",wipe:"Wipe the device","confirm-seed":"Confirm seed","create-pin":"Create PIN code","change-pin":"Change PIN code","delete-pin":"Delete PIN code","forgotten-pin1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{title:"Outdated Firmware",text:"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.",cancel:"Cancel",update:"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.",check:"I understand the risks and want to continue",follow:"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.",timeout:"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.",finished:"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{text:"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.",configuring:"Configuring..."},"restore-seed":{text:"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.",warning:"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: The retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: The seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: The seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},added:{title:"New Skywallet",configuring:"New Skywallet detected. Configuring...",done:"Done",added1:"The connected Skywallet has been added to the wallets list with the following name:",added2:"Now you can check the balance and the addresses of the Skywallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device.",ok:"Ok"},wipe:{warning:"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete":"Also remove from the wallets list"},"create-backup":{warning:'WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the "seed") will be able access the wallet funds, so extreme caution is advised.',instructions:"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{title:"Enter word",info1:"Enter the word shown on the device",info2:"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.",word:"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{warning:"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties in case of loss or theft.",check:"I understand the risks and want to continue"},"enter-pin":{title:"Enter PIN","title-change-current":"Enter the current PIN","title-change-new":"Enter the new PIN","title-change-confirm":"Confirm the new PIN",instructions:"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers.",help:"Need help?"},"pin-help":{title:"Help",part1:"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.",part2:'To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is "23" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.',part3:'If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is "23", you can not simply type "23" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the "7" and "5" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet.'},"create-tx":{title:"Create transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","send-p1":"and","send-p2":"to"},"confirm-address":{title:"Confirm address",instructions:"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.",confirmation:'Address confirmed. For security, you can re-show the address in the Skywallet using the "Confirm address" option, in the menu that you can display by pressing the button at the right of the address balance.'}},"time-from-now":{"few-seconds":"a few seconds ago",minute:"one minute ago",minutes:"{{time}} minutes ago",hour:"one hour ago",hours:"{{time}} hours ago",day:"one day ago",days:"{{time}} days ago"},exchange:{"you-send":"You send","you-get":"You get (approx.)","to-address":"To {{coin}} address",price:"Exchange rate","time-15":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-1":"I agree with","agree-2":"Terms of Use","agree-3":"and","agree-4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal",history:"Order history","order-not-found":"Order not found",status:"Status",exchanging:"Exchanging {{from}} for {{to}}",select:"Select",offline:"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later.","invalid-address":"Invalid address.",statuses:{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.",complete:"Exchange completed!","complete-info":"The funds have been successfully sent to your address.",error:"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{address:"Address",date:"Date"},details:{"exchange-addr":"Exchange address (valid for this exchange operation only)","exchange-addr-tag":"Payment ID or Destination Tag which must be used for the transaction","tx-id":"Transaction ID","order-id":"Order ID","initial-price":"Initial exchange rate","error-msg":"Error message",details:"Details","start-date":"Start date",back:"Back","back-alert":'The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the "Order history" button'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js new file mode 100644 index 00000000..cae7ef32 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js @@ -0,0 +1 @@ +webpackJsonp([6],{flj1:function(e,a){e.exports={list:["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"]}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff new file mode 100644 index 00000000..b648a3ee Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 new file mode 100644 index 00000000..9fa21125 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf new file mode 100644 index 00000000..7015564a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot new file mode 100644 index 00000000..70508eba Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff new file mode 100644 index 00000000..780de6d6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 new file mode 100644 index 00000000..72a32ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff new file mode 100644 index 00000000..20ec4ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 new file mode 100644 index 00000000..642a2d44 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff new file mode 100644 index 00000000..a9946092 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 new file mode 100644 index 00000000..b3238fa2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff new file mode 100644 index 00000000..7cc63b7e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 new file mode 100644 index 00000000..3f438f80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 new file mode 100644 index 00000000..46f89cfb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff new file mode 100644 index 00000000..40c056ea Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff new file mode 100644 index 00000000..ddc9c014 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 new file mode 100644 index 00000000..08d7a518 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/bip39-word-list.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/bip39-word-list.json new file mode 100644 index 00000000..c4956547 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/bip39-word-list.json @@ -0,0 +1,2049 @@ +{ "list": ["abandon", +"ability", +"able", +"about", +"above", +"absent", +"absorb", +"abstract", +"absurd", +"abuse", +"access", +"accident", +"account", +"accuse", +"achieve", +"acid", +"acoustic", +"acquire", +"across", +"act", +"action", +"actor", +"actress", +"actual", +"adapt", +"add", +"addict", +"address", +"adjust", +"admit", +"adult", +"advance", +"advice", +"aerobic", +"affair", +"afford", +"afraid", +"again", +"age", +"agent", +"agree", +"ahead", +"aim", +"air", +"airport", +"aisle", +"alarm", +"album", +"alcohol", +"alert", +"alien", +"all", +"alley", +"allow", +"almost", +"alone", +"alpha", +"already", +"also", +"alter", +"always", +"amateur", +"amazing", +"among", +"amount", +"amused", +"analyst", +"anchor", +"ancient", +"anger", +"angle", +"angry", +"animal", +"ankle", +"announce", +"annual", +"another", +"answer", +"antenna", +"antique", +"anxiety", +"any", +"apart", +"apology", +"appear", +"apple", +"approve", +"april", +"arch", +"arctic", +"area", +"arena", +"argue", +"arm", +"armed", +"armor", +"army", +"around", +"arrange", +"arrest", +"arrive", +"arrow", +"art", +"artefact", +"artist", +"artwork", +"ask", +"aspect", +"assault", +"asset", +"assist", +"assume", +"asthma", +"athlete", +"atom", +"attack", +"attend", +"attitude", +"attract", +"auction", +"audit", +"august", +"aunt", +"author", +"auto", +"autumn", +"average", +"avocado", +"avoid", +"awake", +"aware", +"away", +"awesome", +"awful", +"awkward", +"axis", +"baby", +"bachelor", +"bacon", +"badge", +"bag", +"balance", +"balcony", +"ball", +"bamboo", +"banana", +"banner", +"bar", +"barely", +"bargain", +"barrel", +"base", +"basic", +"basket", +"battle", +"beach", +"bean", +"beauty", +"because", +"become", +"beef", +"before", +"begin", +"behave", +"behind", +"believe", +"below", +"belt", +"bench", +"benefit", +"best", +"betray", +"better", +"between", +"beyond", +"bicycle", +"bid", +"bike", +"bind", +"biology", +"bird", +"birth", +"bitter", +"black", +"blade", +"blame", +"blanket", +"blast", +"bleak", +"bless", +"blind", +"blood", +"blossom", +"blouse", +"blue", +"blur", +"blush", +"board", +"boat", +"body", +"boil", +"bomb", +"bone", +"bonus", +"book", +"boost", +"border", +"boring", +"borrow", +"boss", +"bottom", +"bounce", +"box", +"boy", +"bracket", +"brain", +"brand", +"brass", +"brave", +"bread", +"breeze", +"brick", +"bridge", +"brief", +"bright", +"bring", +"brisk", +"broccoli", +"broken", +"bronze", +"broom", +"brother", +"brown", +"brush", +"bubble", +"buddy", +"budget", +"buffalo", +"build", +"bulb", +"bulk", +"bullet", +"bundle", +"bunker", +"burden", +"burger", +"burst", +"bus", +"business", +"busy", +"butter", +"buyer", +"buzz", +"cabbage", +"cabin", +"cable", +"cactus", +"cage", +"cake", +"call", +"calm", +"camera", +"camp", +"can", +"canal", +"cancel", +"candy", +"cannon", +"canoe", +"canvas", +"canyon", +"capable", +"capital", +"captain", +"car", +"carbon", +"card", +"cargo", +"carpet", +"carry", +"cart", +"case", +"cash", +"casino", +"castle", +"casual", +"cat", +"catalog", +"catch", +"category", +"cattle", +"caught", +"cause", +"caution", +"cave", +"ceiling", +"celery", +"cement", +"census", +"century", +"cereal", +"certain", +"chair", +"chalk", +"champion", +"change", +"chaos", +"chapter", +"charge", +"chase", +"chat", +"cheap", +"check", +"cheese", +"chef", +"cherry", +"chest", +"chicken", +"chief", +"child", +"chimney", +"choice", +"choose", +"chronic", +"chuckle", +"chunk", +"churn", +"cigar", +"cinnamon", +"circle", +"citizen", +"city", +"civil", +"claim", +"clap", +"clarify", +"claw", +"clay", +"clean", +"clerk", +"clever", +"click", +"client", +"cliff", +"climb", +"clinic", +"clip", +"clock", +"clog", +"close", +"cloth", +"cloud", +"clown", +"club", +"clump", +"cluster", +"clutch", +"coach", +"coast", +"coconut", +"code", +"coffee", +"coil", +"coin", +"collect", +"color", +"column", +"combine", +"come", +"comfort", +"comic", +"common", +"company", +"concert", +"conduct", +"confirm", +"congress", +"connect", +"consider", +"control", +"convince", +"cook", +"cool", +"copper", +"copy", +"coral", +"core", +"corn", +"correct", +"cost", +"cotton", +"couch", +"country", +"couple", +"course", +"cousin", +"cover", +"coyote", +"crack", +"cradle", +"craft", +"cram", +"crane", +"crash", +"crater", +"crawl", +"crazy", +"cream", +"credit", +"creek", +"crew", +"cricket", +"crime", +"crisp", +"critic", +"crop", +"cross", +"crouch", +"crowd", +"crucial", +"cruel", +"cruise", +"crumble", +"crunch", +"crush", +"cry", +"crystal", +"cube", +"culture", +"cup", +"cupboard", +"curious", +"current", +"curtain", +"curve", +"cushion", +"custom", +"cute", +"cycle", +"dad", +"damage", +"damp", +"dance", +"danger", +"daring", +"dash", +"daughter", +"dawn", +"day", +"deal", +"debate", +"debris", +"decade", +"december", +"decide", +"decline", +"decorate", +"decrease", +"deer", +"defense", +"define", +"defy", +"degree", +"delay", +"deliver", +"demand", +"demise", +"denial", +"dentist", +"deny", +"depart", +"depend", +"deposit", +"depth", +"deputy", +"derive", +"describe", +"desert", +"design", +"desk", +"despair", +"destroy", +"detail", +"detect", +"develop", +"device", +"devote", +"diagram", +"dial", +"diamond", +"diary", +"dice", +"diesel", +"diet", +"differ", +"digital", +"dignity", +"dilemma", +"dinner", +"dinosaur", +"direct", +"dirt", +"disagree", +"discover", +"disease", +"dish", +"dismiss", +"disorder", +"display", +"distance", +"divert", +"divide", +"divorce", +"dizzy", +"doctor", +"document", +"dog", +"doll", +"dolphin", +"domain", +"donate", +"donkey", +"donor", +"door", +"dose", +"double", +"dove", +"draft", +"dragon", +"drama", +"drastic", +"draw", +"dream", +"dress", +"drift", +"drill", +"drink", +"drip", +"drive", +"drop", +"drum", +"dry", +"duck", +"dumb", +"dune", +"during", +"dust", +"dutch", +"duty", +"dwarf", +"dynamic", +"eager", +"eagle", +"early", +"earn", +"earth", +"easily", +"east", +"easy", +"echo", +"ecology", +"economy", +"edge", +"edit", +"educate", +"effort", +"egg", +"eight", +"either", +"elbow", +"elder", +"electric", +"elegant", +"element", +"elephant", +"elevator", +"elite", +"else", +"embark", +"embody", +"embrace", +"emerge", +"emotion", +"employ", +"empower", +"empty", +"enable", +"enact", +"end", +"endless", +"endorse", +"enemy", +"energy", +"enforce", +"engage", +"engine", +"enhance", +"enjoy", +"enlist", +"enough", +"enrich", +"enroll", +"ensure", +"enter", +"entire", +"entry", +"envelope", +"episode", +"equal", +"equip", +"era", +"erase", +"erode", +"erosion", +"error", +"erupt", +"escape", +"essay", +"essence", +"estate", +"eternal", +"ethics", +"evidence", +"evil", +"evoke", +"evolve", +"exact", +"example", +"excess", +"exchange", +"excite", +"exclude", +"excuse", +"execute", +"exercise", +"exhaust", +"exhibit", +"exile", +"exist", +"exit", +"exotic", +"expand", +"expect", +"expire", +"explain", +"expose", +"express", +"extend", +"extra", +"eye", +"eyebrow", +"fabric", +"face", +"faculty", +"fade", +"faint", +"faith", +"fall", +"false", +"fame", +"family", +"famous", +"fan", +"fancy", +"fantasy", +"farm", +"fashion", +"fat", +"fatal", +"father", +"fatigue", +"fault", +"favorite", +"feature", +"february", +"federal", +"fee", +"feed", +"feel", +"female", +"fence", +"festival", +"fetch", +"fever", +"few", +"fiber", +"fiction", +"field", +"figure", +"file", +"film", +"filter", +"final", +"find", +"fine", +"finger", +"finish", +"fire", +"firm", +"first", +"fiscal", +"fish", +"fit", +"fitness", +"fix", +"flag", +"flame", +"flash", +"flat", +"flavor", +"flee", +"flight", +"flip", +"float", +"flock", +"floor", +"flower", +"fluid", +"flush", +"fly", +"foam", +"focus", +"fog", +"foil", +"fold", +"follow", +"food", +"foot", +"force", +"forest", +"forget", +"fork", +"fortune", +"forum", +"forward", +"fossil", +"foster", +"found", +"fox", +"fragile", +"frame", +"frequent", +"fresh", +"friend", +"fringe", +"frog", +"front", +"frost", +"frown", +"frozen", +"fruit", +"fuel", +"fun", +"funny", +"furnace", +"fury", +"future", +"gadget", +"gain", +"galaxy", +"gallery", +"game", +"gap", +"garage", +"garbage", +"garden", +"garlic", +"garment", +"gas", +"gasp", +"gate", +"gather", +"gauge", +"gaze", +"general", +"genius", +"genre", +"gentle", +"genuine", +"gesture", +"ghost", +"giant", +"gift", +"giggle", +"ginger", +"giraffe", +"girl", +"give", +"glad", +"glance", +"glare", +"glass", +"glide", +"glimpse", +"globe", +"gloom", +"glory", +"glove", +"glow", +"glue", +"goat", +"goddess", +"gold", +"good", +"goose", +"gorilla", +"gospel", +"gossip", +"govern", +"gown", +"grab", +"grace", +"grain", +"grant", +"grape", +"grass", +"gravity", +"great", +"green", +"grid", +"grief", +"grit", +"grocery", +"group", +"grow", +"grunt", +"guard", +"guess", +"guide", +"guilt", +"guitar", +"gun", +"gym", +"habit", +"hair", +"half", +"hammer", +"hamster", +"hand", +"happy", +"harbor", +"hard", +"harsh", +"harvest", +"hat", +"have", +"hawk", +"hazard", +"head", +"health", +"heart", +"heavy", +"hedgehog", +"height", +"hello", +"helmet", +"help", +"hen", +"hero", +"hidden", +"high", +"hill", +"hint", +"hip", +"hire", +"history", +"hobby", +"hockey", +"hold", +"hole", +"holiday", +"hollow", +"home", +"honey", +"hood", +"hope", +"horn", +"horror", +"horse", +"hospital", +"host", +"hotel", +"hour", +"hover", +"hub", +"huge", +"human", +"humble", +"humor", +"hundred", +"hungry", +"hunt", +"hurdle", +"hurry", +"hurt", +"husband", +"hybrid", +"ice", +"icon", +"idea", +"identify", +"idle", +"ignore", +"ill", +"illegal", +"illness", +"image", +"imitate", +"immense", +"immune", +"impact", +"impose", +"improve", +"impulse", +"inch", +"include", +"income", +"increase", +"index", +"indicate", +"indoor", +"industry", +"infant", +"inflict", +"inform", +"inhale", +"inherit", +"initial", +"inject", +"injury", +"inmate", +"inner", +"innocent", +"input", +"inquiry", +"insane", +"insect", +"inside", +"inspire", +"install", +"intact", +"interest", +"into", +"invest", +"invite", +"involve", +"iron", +"island", +"isolate", +"issue", +"item", +"ivory", +"jacket", +"jaguar", +"jar", +"jazz", +"jealous", +"jeans", +"jelly", +"jewel", +"job", +"join", +"joke", +"journey", +"joy", +"judge", +"juice", +"jump", +"jungle", +"junior", +"junk", +"just", +"kangaroo", +"keen", +"keep", +"ketchup", +"key", +"kick", +"kid", +"kidney", +"kind", +"kingdom", +"kiss", +"kit", +"kitchen", +"kite", +"kitten", +"kiwi", +"knee", +"knife", +"knock", +"know", +"lab", +"label", +"labor", +"ladder", +"lady", +"lake", +"lamp", +"language", +"laptop", +"large", +"later", +"latin", +"laugh", +"laundry", +"lava", +"law", +"lawn", +"lawsuit", +"layer", +"lazy", +"leader", +"leaf", +"learn", +"leave", +"lecture", +"left", +"leg", +"legal", +"legend", +"leisure", +"lemon", +"lend", +"length", +"lens", +"leopard", +"lesson", +"letter", +"level", +"liar", +"liberty", +"library", +"license", +"life", +"lift", +"light", +"like", +"limb", +"limit", +"link", +"lion", +"liquid", +"list", +"little", +"live", +"lizard", +"load", +"loan", +"lobster", +"local", +"lock", +"logic", +"lonely", +"long", +"loop", +"lottery", +"loud", +"lounge", +"love", +"loyal", +"lucky", +"luggage", +"lumber", +"lunar", +"lunch", +"luxury", +"lyrics", +"machine", +"mad", +"magic", +"magnet", +"maid", +"mail", +"main", +"major", +"make", +"mammal", +"man", +"manage", +"mandate", +"mango", +"mansion", +"manual", +"maple", +"marble", +"march", +"margin", +"marine", +"market", +"marriage", +"mask", +"mass", +"master", +"match", +"material", +"math", +"matrix", +"matter", +"maximum", +"maze", +"meadow", +"mean", +"measure", +"meat", +"mechanic", +"medal", +"media", +"melody", +"melt", +"member", +"memory", +"mention", +"menu", +"mercy", +"merge", +"merit", +"merry", +"mesh", +"message", +"metal", +"method", +"middle", +"midnight", +"milk", +"million", +"mimic", +"mind", +"minimum", +"minor", +"minute", +"miracle", +"mirror", +"misery", +"miss", +"mistake", +"mix", +"mixed", +"mixture", +"mobile", +"model", +"modify", +"mom", +"moment", +"monitor", +"monkey", +"monster", +"month", +"moon", +"moral", +"more", +"morning", +"mosquito", +"mother", +"motion", +"motor", +"mountain", +"mouse", +"move", +"movie", +"much", +"muffin", +"mule", +"multiply", +"muscle", +"museum", +"mushroom", +"music", +"must", +"mutual", +"myself", +"mystery", +"myth", +"naive", +"name", +"napkin", +"narrow", +"nasty", +"nation", +"nature", +"near", +"neck", +"need", +"negative", +"neglect", +"neither", +"nephew", +"nerve", +"nest", +"net", +"network", +"neutral", +"never", +"news", +"next", +"nice", +"night", +"noble", +"noise", +"nominee", +"noodle", +"normal", +"north", +"nose", +"notable", +"note", +"nothing", +"notice", +"novel", +"now", +"nuclear", +"number", +"nurse", +"nut", +"oak", +"obey", +"object", +"oblige", +"obscure", +"observe", +"obtain", +"obvious", +"occur", +"ocean", +"october", +"odor", +"off", +"offer", +"office", +"often", +"oil", +"okay", +"old", +"olive", +"olympic", +"omit", +"once", +"one", +"onion", +"online", +"only", +"open", +"opera", +"opinion", +"oppose", +"option", +"orange", +"orbit", +"orchard", +"order", +"ordinary", +"organ", +"orient", +"original", +"orphan", +"ostrich", +"other", +"outdoor", +"outer", +"output", +"outside", +"oval", +"oven", +"over", +"own", +"owner", +"oxygen", +"oyster", +"ozone", +"pact", +"paddle", +"page", +"pair", +"palace", +"palm", +"panda", +"panel", +"panic", +"panther", +"paper", +"parade", +"parent", +"park", +"parrot", +"party", +"pass", +"patch", +"path", +"patient", +"patrol", +"pattern", +"pause", +"pave", +"payment", +"peace", +"peanut", +"pear", +"peasant", +"pelican", +"pen", +"penalty", +"pencil", +"people", +"pepper", +"perfect", +"permit", +"person", +"pet", +"phone", +"photo", +"phrase", +"physical", +"piano", +"picnic", +"picture", +"piece", +"pig", +"pigeon", +"pill", +"pilot", +"pink", +"pioneer", +"pipe", +"pistol", +"pitch", +"pizza", +"place", +"planet", +"plastic", +"plate", +"play", +"please", +"pledge", +"pluck", +"plug", +"plunge", +"poem", +"poet", +"point", +"polar", +"pole", +"police", +"pond", +"pony", +"pool", +"popular", +"portion", +"position", +"possible", +"post", +"potato", +"pottery", +"poverty", +"powder", +"power", +"practice", +"praise", +"predict", +"prefer", +"prepare", +"present", +"pretty", +"prevent", +"price", +"pride", +"primary", +"print", +"priority", +"prison", +"private", +"prize", +"problem", +"process", +"produce", +"profit", +"program", +"project", +"promote", +"proof", +"property", +"prosper", +"protect", +"proud", +"provide", +"public", +"pudding", +"pull", +"pulp", +"pulse", +"pumpkin", +"punch", +"pupil", +"puppy", +"purchase", +"purity", +"purpose", +"purse", +"push", +"put", +"puzzle", +"pyramid", +"quality", +"quantum", +"quarter", +"question", +"quick", +"quit", +"quiz", +"quote", +"rabbit", +"raccoon", +"race", +"rack", +"radar", +"radio", +"rail", +"rain", +"raise", +"rally", +"ramp", +"ranch", +"random", +"range", +"rapid", +"rare", +"rate", +"rather", +"raven", +"raw", +"razor", +"ready", +"real", +"reason", +"rebel", +"rebuild", +"recall", +"receive", +"recipe", +"record", +"recycle", +"reduce", +"reflect", +"reform", +"refuse", +"region", +"regret", +"regular", +"reject", +"relax", +"release", +"relief", +"rely", +"remain", +"remember", +"remind", +"remove", +"render", +"renew", +"rent", +"reopen", +"repair", +"repeat", +"replace", +"report", +"require", +"rescue", +"resemble", +"resist", +"resource", +"response", +"result", +"retire", +"retreat", +"return", +"reunion", +"reveal", +"review", +"reward", +"rhythm", +"rib", +"ribbon", +"rice", +"rich", +"ride", +"ridge", +"rifle", +"right", +"rigid", +"ring", +"riot", +"ripple", +"risk", +"ritual", +"rival", +"river", +"road", +"roast", +"robot", +"robust", +"rocket", +"romance", +"roof", +"rookie", +"room", +"rose", +"rotate", +"rough", +"round", +"route", +"royal", +"rubber", +"rude", +"rug", +"rule", +"run", +"runway", +"rural", +"sad", +"saddle", +"sadness", +"safe", +"sail", +"salad", +"salmon", +"salon", +"salt", +"salute", +"same", +"sample", +"sand", +"satisfy", +"satoshi", +"sauce", +"sausage", +"save", +"say", +"scale", +"scan", +"scare", +"scatter", +"scene", +"scheme", +"school", +"science", +"scissors", +"scorpion", +"scout", +"scrap", +"screen", +"script", +"scrub", +"sea", +"search", +"season", +"seat", +"second", +"secret", +"section", +"security", +"seed", +"seek", +"segment", +"select", +"sell", +"seminar", +"senior", +"sense", +"sentence", +"series", +"service", +"session", +"settle", +"setup", +"seven", +"shadow", +"shaft", +"shallow", +"share", +"shed", +"shell", +"sheriff", +"shield", +"shift", +"shine", +"ship", +"shiver", +"shock", +"shoe", +"shoot", +"shop", +"short", +"shoulder", +"shove", +"shrimp", +"shrug", +"shuffle", +"shy", +"sibling", +"sick", +"side", +"siege", +"sight", +"sign", +"silent", +"silk", +"silly", +"silver", +"similar", +"simple", +"since", +"sing", +"siren", +"sister", +"situate", +"six", +"size", +"skate", +"sketch", +"ski", +"skill", +"skin", +"skirt", +"skull", +"slab", +"slam", +"sleep", +"slender", +"slice", +"slide", +"slight", +"slim", +"slogan", +"slot", +"slow", +"slush", +"small", +"smart", +"smile", +"smoke", +"smooth", +"snack", +"snake", +"snap", +"sniff", +"snow", +"soap", +"soccer", +"social", +"sock", +"soda", +"soft", +"solar", +"soldier", +"solid", +"solution", +"solve", +"someone", +"song", +"soon", +"sorry", +"sort", +"soul", +"sound", +"soup", +"source", +"south", +"space", +"spare", +"spatial", +"spawn", +"speak", +"special", +"speed", +"spell", +"spend", +"sphere", +"spice", +"spider", +"spike", +"spin", +"spirit", +"split", +"spoil", +"sponsor", +"spoon", +"sport", +"spot", +"spray", +"spread", +"spring", +"spy", +"square", +"squeeze", +"squirrel", +"stable", +"stadium", +"staff", +"stage", +"stairs", +"stamp", +"stand", +"start", +"state", +"stay", +"steak", +"steel", +"stem", +"step", +"stereo", +"stick", +"still", +"sting", +"stock", +"stomach", +"stone", +"stool", +"story", +"stove", +"strategy", +"street", +"strike", +"strong", +"struggle", +"student", +"stuff", +"stumble", +"style", +"subject", +"submit", +"subway", +"success", +"such", +"sudden", +"suffer", +"sugar", +"suggest", +"suit", +"summer", +"sun", +"sunny", +"sunset", +"super", +"supply", +"supreme", +"sure", +"surface", +"surge", +"surprise", +"surround", +"survey", +"suspect", +"sustain", +"swallow", +"swamp", +"swap", +"swarm", +"swear", +"sweet", +"swift", +"swim", +"swing", +"switch", +"sword", +"symbol", +"symptom", +"syrup", +"system", +"table", +"tackle", +"tag", +"tail", +"talent", +"talk", +"tank", +"tape", +"target", +"task", +"taste", +"tattoo", +"taxi", +"teach", +"team", +"tell", +"ten", +"tenant", +"tennis", +"tent", +"term", +"test", +"text", +"thank", +"that", +"theme", +"then", +"theory", +"there", +"they", +"thing", +"this", +"thought", +"three", +"thrive", +"throw", +"thumb", +"thunder", +"ticket", +"tide", +"tiger", +"tilt", +"timber", +"time", +"tiny", +"tip", +"tired", +"tissue", +"title", +"toast", +"tobacco", +"today", +"toddler", +"toe", +"together", +"toilet", +"token", +"tomato", +"tomorrow", +"tone", +"tongue", +"tonight", +"tool", +"tooth", +"top", +"topic", +"topple", +"torch", +"tornado", +"tortoise", +"toss", +"total", +"tourist", +"toward", +"tower", +"town", +"toy", +"track", +"trade", +"traffic", +"tragic", +"train", +"transfer", +"trap", +"trash", +"travel", +"tray", +"treat", +"tree", +"trend", +"trial", +"tribe", +"trick", +"trigger", +"trim", +"trip", +"trophy", +"trouble", +"truck", +"true", +"truly", +"trumpet", +"trust", +"truth", +"try", +"tube", +"tuition", +"tumble", +"tuna", +"tunnel", +"turkey", +"turn", +"turtle", +"twelve", +"twenty", +"twice", +"twin", +"twist", +"two", +"type", +"typical", +"ugly", +"umbrella", +"unable", +"unaware", +"uncle", +"uncover", +"under", +"undo", +"unfair", +"unfold", +"unhappy", +"uniform", +"unique", +"unit", +"universe", +"unknown", +"unlock", +"until", +"unusual", +"unveil", +"update", +"upgrade", +"uphold", +"upon", +"upper", +"upset", +"urban", +"urge", +"usage", +"use", +"used", +"useful", +"useless", +"usual", +"utility", +"vacant", +"vacuum", +"vague", +"valid", +"valley", +"valve", +"van", +"vanish", +"vapor", +"various", +"vast", +"vault", +"vehicle", +"velvet", +"vendor", +"venture", +"venue", +"verb", +"verify", +"version", +"very", +"vessel", +"veteran", +"viable", +"vibrant", +"vicious", +"victory", +"video", +"view", +"village", +"vintage", +"violin", +"virtual", +"virus", +"visa", +"visit", +"visual", +"vital", +"vivid", +"vocal", +"voice", +"void", +"volcano", +"volume", +"vote", +"voyage", +"wage", +"wagon", +"wait", +"walk", +"wall", +"walnut", +"want", +"warfare", +"warm", +"warrior", +"wash", +"wasp", +"waste", +"water", +"wave", +"way", +"wealth", +"weapon", +"wear", +"weasel", +"weather", +"web", +"wedding", +"weekend", +"weird", +"welcome", +"west", +"wet", +"whale", +"what", +"wheat", +"wheel", +"when", +"where", +"whip", +"whisper", +"wide", +"width", +"wife", +"wild", +"will", +"win", +"window", +"wine", +"wing", +"wink", +"winner", +"winter", +"wire", +"wisdom", +"wise", +"wish", +"witness", +"wolf", +"woman", +"wonder", +"wood", +"wool", +"word", +"work", +"world", +"worry", +"worth", +"wrap", +"wreck", +"wrestle", +"wrist", +"write", +"wrong", +"yard", +"year", +"yellow", +"you", +"young", +"youth", +"zebra", +"zero", +"zone", +"zoo"] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/big-error-icon.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/big-error-icon.png new file mode 100644 index 00000000..bcbda0c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/big-error-icon.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/index.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/index.html new file mode 100644 index 00000000..29d9dc9f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/index.html @@ -0,0 +1,89 @@ + + + + + + + + +
+
+ +
+
+
+
+ + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot new file mode 100644 index 00000000..70508eba Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap new file mode 100644 index 00000000..d9f1d259 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg new file mode 100644 index 00000000..a449327e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf new file mode 100644 index 00000000..7015564a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff new file mode 100644 index 00000000..b648a3ee Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 new file mode 100644 index 00000000..9fa21125 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css new file mode 100644 index 00000000..2270c09d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff new file mode 100644 index 00000000..780de6d6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 new file mode 100644 index 00000000..72a32ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff new file mode 100644 index 00000000..20ec4ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 new file mode 100644 index 00000000..642a2d44 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff new file mode 100644 index 00000000..a9946092 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 new file mode 100644 index 00000000..b3238fa2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff new file mode 100644 index 00000000..7cc63b7e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 new file mode 100644 index 00000000..3f438f80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff new file mode 100644 index 00000000..40c056ea Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 new file mode 100644 index 00000000..46f89cfb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff new file mode 100644 index 00000000..ddc9c014 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 new file mode 100644 index 00000000..08d7a518 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/header.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/header.png new file mode 100644 index 00000000..be1002a4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/header.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/README.md b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/README.md new file mode 100644 index 00000000..22bccbd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/README.md @@ -0,0 +1,273 @@ +This folder contains the GUI translation files. To maintain order and be able +to easily make any necessary updates to the translation files after updating +the main text file, please follow its instructions if you are working with +its contents. + +# Contents of this folder + +The contents of this folder are: + +- `README.md`: this file. + +- `check.js`: file with the script for detecting if a translation file has errors +or should be updated. + +- `en.json`: main file with all the texts of the application, in English. It should +only be modified when changing the texts of the application (add, modify and +delete). This means that the file must not be modified while creating a new +ranslation or modifying an existing one. + +- Various `xx.json` files: files with the translated versions of the texts of +`en.json`. + +- Various `xx_base.json` files: files with copies of `en.json` made the last time the +corresponding `xx.json` file was modified. + +Normally there is no need to modify the first two files. + +For more information about the `xx.json` and `xx_base.json`, please check the +[Add a new translation](#add-a-new-translation) and +[Update a translation](#update-a-translation) sections. + +# About the meaning of "xx" in this file + +Several parts of this file uses "xx" as part of file names or scripts, like +`xx.json` and `xx_base.json`. In fact, no file in this folder should be called +`xx.json` or `xx_base.json`, the "xx" part must be replaces with the two +characters code of the language. For example, if you are working with the Chinese +translation, the files will be `zh.json` and `zh_base.json`, instead of `xx.json` +and `xx_base.json`. The same if true for the scripts, if you are working with the +Chinese translation, instead of running `node check.js xx` you must run +`node check.js zh`. + +# Add a new translation + +First you must create in this folder two copies of the `en.json` file. The first +copy must be called `xx.json`, where the `xx` part must be the two characters code +of the new language. For example, for Chinese the name of the file should be +`zh.json`; for Spanish, `es.json`; for French, `fr.json`, etc. + +The second copy of `en.json` must be renamed to `xx_base.json`, where the `xx` part +must be the two characters code of the new language. This means that if the first +copy is named `zh.json`, the second one should be named `zh_base.json`. + +It is not necessary to follow a specific standard for the two characters code, but +it must be limited to two letters and be a recognizable code for the language. + +After creating the two files, simply translate the texts in `xx.json`. Please make +sure you do not modify the structure of `xx.json`, just modify the texts. + +The `xx_base.json` file must not be modified in any way, as it is used only as a way +to know what the state of `en.json` was the last time the `xx.json` file was +modified. This copy will be compared in the future with `en.json`, to verify if +there were modifications to `en.json` since the last time the translation file was +modified and if an update is needed. + +If the `xx.json` and `xx_base.json` files do not have the same elements, the +automatic tests could fail when uploading the changes to the repository, preventing +the changes from being accepted, so, again, it is important not to modify the +structure of `xx.json`, but only its contents. + +After doing all this, the translation will be ready, but will not be available in +the GUI until adding it to the code. + +# Verify the translation files + +This folder includes a script that is capable of automatically checking the +translation files, to detect problems and know what should be updated. + +For using it, your computer must have `Node.js` installed. + +## Checking for problems + +For detecting basic problems on the translation files, open a command line window +in this folder and run `node check.js`. This will check the following: + +- The `en.json` must exist, as it is the main language file for the app. + +- For every `xx.json` file (except `en.json`) an `xx_base.json` file must exist +and viceversa. + +- A `xx.json` file and its corresponding `xx_base.json` file must have the exact +same elements (only the content of that elements could be different), as the +`xx.json` is suposed to be the translation of the contents of `xx_base.json`. + +As you can see, this only checks for errors that could be made while creating or +modifying the `xx.json` and `xx_base.json` files, and does not check if any +translation needs to be updated. + +At the end of the script excecution, the console will display the list of all +errors found, if any. This check could be done automatically when making changes +to the repository, to reject updates with problems, so it is good idea to run it +manually before uploading changes. + +Note: at this time the script does not check if the elements of the files are +in the same order, but this could be added in the future, so it is recomended +not to change the order of the elements. + +## Checking if a language file needs to be updated + +To detect if an specific language needs updating, run `node check.js xx`, +where xx is the two characters code of the language you want to check. If you +want to check all languages, run `node check.js all`. + +By doing this, the script will perform all the checks described in the +[Checking for problems](#checking-for-problems) section, plus this: + +- The `en.json` and `xx_base.json` should have the same elements. If `en.json` +has elements that `xx_base.json` does not contain, it means that, since the +last time the translation file was updated, new texts have been added to the +application. If `xx_base.json` has elements that `en.json` does not contain, +it means that, since the last time the translation file was updated, some texts +have been removed from the application. Both cases mean that the translation +file should be updated. + +- The elements of `en.json` and `xx_base.json` should have the same content. +If any element have different content, it means that since the last time the +translation file was updated, some texts of the applications have been changed. +This means that the translation file should be updated. + +At the end of the script excecution, the console will display the list of all +errors found, if any. + +# Update a translation + +Before updating a translation file, you should follow the steps of the +[Checking if a language file needs to be updated](#Checking-if-a-language-file-needs-to-be-updated) +section. By doing so you will quikly know exactly what texts must be added, +deleted or edited. + +After doing that, make all the required modifications in the `xx.json` file, +this means adding, deleting and modifying all the elements indicated by the +script. Please be sure to modify only what is required and to add any new +element in the same position that it is in the `en.json` file. This process +is manual, so be sure check all the changes before finishing. + +After doing the modifications in `xx.json`, delete the `xx_base.json` file, +create a copy of `en.json` and rename it `xx_base.json`. The objetive is to +simply update the `xx_base.json` file to the current state of `en.json`. +this will make possible to check in the future if more updates are nedded, +due to new changes in `en.json`. + +Once all the changes are made, check again the language file as indicated +in the +[Checking if a language file needs to be updated](#Checking-if-a-language-file-needs-to-be-updated) +section. The script should not return errors. If the script returns errors, +please solve them before continuing. + +# How to edit the translation files + +The translation files are in json format (.json files). It is possible to +open these files in a text editor and edit them like normal text files. +However, the json files are used for coding and have a very strict format. +Because of this, **editing the files manually is not recommended** unless +you know exactly what you are doing. + +If you do not know the json format, this section includes useful +information to be able to edit the files easily. + +## Which application should be used for editing the files + +There are several application that allow editing json files, including +some text editors. However, it is recommended to use the Json Editor app +for Google Chrome. Among the advantages of this application are that it +is multiplatform, it allows editing the contents without having to +directly modify the json code and has a relatively simple interface. You +can add it to your Chrome browser from here: +https://chrome.google.com/webstore/detail/json-editor/lhkmoheomjbkfloacpgllgjcamhihfaj + +The app looks like this: + +![app](app1.png) + +As you can see, you can load/save files on the upper-right corner of +the app. The left part shows the source code and the right part shows +a tree view of the elements of the file and its contents. You can +ignore the source code and work with the tree view only. + +![app](app2.png) + +As you will not be editing the soutce code, you can hide it by presing +and draging the 3-dot button (1). While editing the file, you can use +the arrows (2) to expand/contract the different sections in which the +elements are organized. Once you find an item that you want to edit, +click on the content and modify the text (3). Please, do not make any +changes to the name of the element (4). + +You can use the 6-dot buttons (5) to move the elements to a different +location, but please avoid doing it, as that could alter the order of +the file in a way that would make it stop working. Also, as you will +not be working with the source code, avoid using the arrow +buttons (6). + +## Special codes + +Some texts in the language files have special codes that are not +shown in the user interface of the wallet, but serve special purposes. +The codes are: + +- **\\"**: due to how json files work, it is not possible to write +double quotes directly in the texts, the ccorrect way to add double +quotes to a json file is **\\"** (note that the 2 characters must not +be separated by a white space). If you use the Json Editor app for +Google Chrome, you can write double quotes normally and the app will +automatically add the **\\** character behind them, but that is just +a convenience for when you are writing, you could still find the +**\\"** code in files you are editing and have to work with it. + +- **{{ }}**: any text block similar to **{{ something }}** is a +special identifier that the code will replace with a different value +when the app is running. For example, if you find a text like "Your +balance is {{ value }} coins", the application will show something +like "Your balance is 21 coins". In that example the "21" is a value +that the app has to calculate, so it is not possible to add it directly +into the language file. If you find a **{{ }}** text block, please do +not translate it, just move the whole **{{ }}** text block to where the +value should be displayed. If you want to leave a while space before the +value, simply add a white space before the **{{ }}** text block, and do +the same after it if you want a white space after the value. + +- **\
**: this code means "new line". It is just a way to tell +the code that the text after it should be added in a new line. + +# Make a translation available in the application + +Although creating the translation files is the most important step, it is +necessary to make some additional changes before a translation is +available in the application. + +The first thing to do is to add a bitmap in +[src/gui/static/src/assets/img/lang](src/gui/static/src/assets/img/lang), +with the flag that will be used to identify the language. The bitmap +should be a .png file with transparent background and a size of 64x64 +pixels. However, the flag does not have to occupy all the space of the +bitmap, but it should be 64 pixels wide and only 42 pixels high, +centered. Please use as a reference the flags that are already in +the folder. + +After adding the flag, you must modify the +[src/gui/static/src/app/app.config.ts](src/gui/static/src/app/app.config.ts) +file. In particular, you must add a new entry to the `languages` array, +with the data about the language. The object you must add is similar +to this: + +``` +{ + code: 'en', + name: 'English', + iconName: 'en.png' +} +``` + +The properties are: + +- `code`: 2 letter code that was assigned to the language. It must match +the name given to the translation file. + +- `name`: Name of the language. + +- `iconName`: Name of the file with the flag, which was added in the +previous step. + +Please use as a reference the data of the languages that have already +been added to the `languages` array. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app1.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app1.png new file mode 100644 index 00000000..67c75016 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app1.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app2.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app2.png new file mode 100644 index 00000000..6cabfe68 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app2.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/check.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/check.js new file mode 100644 index 00000000..b70f022d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/check.js @@ -0,0 +1,230 @@ +'use strict' + +const fs = require('fs'); + +///////////////////////////////////////////// +// Initial configuration +///////////////////////////////////////////// + +console.log('Starting to check the language files.', '\n'); + +// Load the current English file. +if (!fs.existsSync('en.json')) { + exitWithError('Unable to find the English language file.'); +} +let currentData = JSON.parse(fs.readFileSync('en.json', 'utf8')); + +// 2 charaters code of the languages that will be checked. +const langs = []; +// If false, the code will only verify the differences in the elements (ignoring its contents) of the +// base files and the files with the translations. If not, the code will also verify the differences +// in the elements and contents of the base files and the current English file. +let checkFull = false; + +// If a param was send, it must be "all" or the 2 charaters code of the language that must be checked. +// If a param is provided, checkFull is set to true. +if (process.argv.length > 2) { + if (process.argv.length > 3) { + exitWithError('Invalid number of parameters.'); + } + + if (process.argv[2] != 'all') { + if (process.argv[2].length !== 2) { + exitWithError('You can only send as parameter to this script the 2-letter code of one of the language files in this folder, or "all".'); + } + langs.push(process.argv[2]); + } + + checkFull = true; +} + +// If no language code was send as param, the code will check all languages. +if (langs.length === 0) { + let localFiles = fs.readdirSync('./'); + + const langFiles = []; + const langFilesMap = new Map(); + const baseLangFilesMap = new Map(); + localFiles.forEach(file => { + if (file.length === 12 && file.endsWith('_base.json')) { + langs.push(file.substring(0, 2)); + baseLangFilesMap.set(file.substring(0, 2), true); + } + if (file !== 'en.json' && file.length === 7 && file.endsWith('.json')) { + langFiles.push(file.substring(0, 2)); + langFilesMap.set(file.substring(0, 2), true); + } + }); + + langs.forEach(lang => { + if (!langFilesMap.has(lang)) { + exitWithError('The \"' + lang + '_base.json\" base file does not have its corresponding language file.'); + } + }); + + langFiles.forEach(lang => { + if (!baseLangFilesMap.has(lang)) { + exitWithError('The \"' + lang + '.json\" file does not have its corresponding base file.'); + } + }); + + if (langs.length === 0) { + exitWithError('No language files to check.'); + } +} + +console.log('Checking the following languages:'); +langs.forEach(lang => { + console.log(lang); +}); +console.log(''); + +///////////////////////////////////////////// +// Verifications +///////////////////////////////////////////// + +// The following arrays will contain the list of elements with problems. Each element of the +// arrays contains a "lang" property with the language identifier and a "elements" array with +// the path of the problematic elements. + +// Elements that are present in a base file but not in its corresponding translation file. +const baseFileOnly = []; +// Elements that are present in a translation file but not in its corresponding base file. +const translatedFileOnly = []; +// Elements that are present in the English file but not in the currently checked base translation file. +const enOnly = []; +// Elements that are present in the currently checked base translation file but not in the English file. +const translatedOnly = []; +// Elements that have different values in the currently checked base translation file and the English file. +const different = []; + +function addNewLangToArray(array, lang) { + array.push({ + lang: lang, + elements: [] + }); +} + +langs.forEach(lang => { + addNewLangToArray(baseFileOnly, lang); + addNewLangToArray(translatedFileOnly, lang); + addNewLangToArray(enOnly, lang); + addNewLangToArray(translatedOnly, lang); + addNewLangToArray(different, lang); + + // Try to load the translation file and its corresponding base file. + if (!fs.existsSync(lang + '.json')) { + exitWithError('Unable to find the ' + lang + '.json file.'); + } + let translationData = JSON.parse(fs.readFileSync(lang + '.json', 'utf8')); + + if (!fs.existsSync(lang + '_base.json')) { + exitWithError('Unable to find the ' + lang + '_base.json language file.'); + } + let baseTranslationData = JSON.parse(fs.readFileSync(lang + '_base.json', 'utf8')); + + // Check the differences in the elements of the translation file and its base file. + checkElement('', '', baseTranslationData, translationData, baseFileOnly, true); + checkElement('', '', translationData, baseTranslationData, translatedFileOnly, true); + + // Check the differences in the elements and content of the base translation file the English file. + if (checkFull) { + checkElement('', '', currentData, baseTranslationData, enOnly, false); + checkElement('', '', baseTranslationData, currentData, translatedOnly, true); + } +}); + + +// Check recursively if the elements and content of two language objects are the same. +// +// path: path of the currently checked element. As this function works with nested elements, +// the path is the name of all the parents, separated by a dot. +// key: name of the current element. +// fist: first element for the comparation. +// second: second element for the comparation. +// arrayForMissingElements: array in which the list of "fist" elements that are not in "second" +// will be added. +// ignoreDifferences: if false, each time the content of an element in "fist" is different to the +// same element in "second" that element will be added to the "different" array. +function checkElement(path, key, fist, second, arrayForMissingElements, ignoreDifferences) { + let pathPrefix = ''; + if (path.length > 0) { + pathPrefix = '.'; + } + + // This means that, at some point, the code found an element in the "first" branch that is + // not in the "second" branch. + if (second === undefined || second === null) { + arrayForMissingElements[arrayForMissingElements.length - 1].elements.push(path + pathPrefix + key); + return; + } + + if (typeof fist !== 'object') { + // If the current element is a string, compare the contents, but ony if ignoreDifferences + // is true. + if (!ignoreDifferences && fist != second) { + different[different.length - 1].elements.push(path + pathPrefix + key); + } + } else { + // If the current element is an object, check the childs. + Object.keys(fist).forEach(currentKey => { + checkElement(path + pathPrefix + key, currentKey, fist[currentKey], second[currentKey], arrayForMissingElements, ignoreDifferences); + }); + } +} + +///////////////////////////////////////////// +// Results processing +///////////////////////////////////////////// + +// Becomes true if any of the verifications failed. +let failedValidation = false; + +// If "failedValidation" is false, writes to the console the header of the error list +// and updates the value of "failedValidation" to true. +function updateErrorSumary() { + if (!failedValidation) { + failedValidation = true; + console.log('The following problems were found:', '\n'); + } +} + +// Checks all arrays for errors. This loop is for the languages. +for (let i = 0; i < baseFileOnly.length; i++) { + + // This loop if for checking all the arrays. + [baseFileOnly, translatedFileOnly, enOnly, translatedOnly, different].forEach((array, idx) => { + // If the array has elements, it means that errors were found. + if (array[i].elements.length > 0) { + updateErrorSumary(); + + // Show the appropriate error text according to the current array. + if (idx === 0) { + console.log('The \"' + baseFileOnly[i].lang + '_base.json\" base file has elements that are not present in \"' + baseFileOnly[i].lang + '.json\":'); + } else if (idx === 1) { + console.log("\"" + translatedFileOnly[i].lang + '.json\" has elements that are not present in the \"' + baseFileOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 2) { + console.log('The \"en.json\" file has elements that are not present in the \"' + enOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 3) { + console.log('The \"' + translatedOnly[i].lang + '_base.json\" base file has elements that are not present in \"en.json\":'); + } else if (idx === 4) { + console.log('The \"' + different[i].lang + '_base.json\" base file has values that do not match the ones in \"en.json\":'); + } + // Show all the elements with errors. + array[i].elements.forEach(element => console.log(element)); + console.log(''); + } + }); +} + +// If no error was detected, show a success message on the console. If not, exit with an error code. +if (!failedValidation) { + console.log('The verification passed without problems.'); +} else { + process.exit(1); +} + +function exitWithError(errorMessage) { + console.log('Error: ' + errorMessage) + process.exit(1); +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/en.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/en.json new file mode 100644 index 00000000..2026efdb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/en.json @@ -0,0 +1,626 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load", + "success": "Success", + "warning": "Warning", + "changes-made": "The changes have been made." + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a Skywallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the Skywallet options (by pressing the \"Skywallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Skywallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \"Skywallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the Skywallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "words-number": "How many word the seed has", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed.", + "synchronizing-warning-title": "Warning", + "synchronizing-warning-text": "The wallet is still synchronizing and some addresses may not be restored. If some addresses are not restored, please wait for the wallet to be fully synchronized and add them again manually.", + "synchronizing-warning-continue": "Continue", + "synchronizing-warning-cancel": "Cancel", + "wallet-created": "The wallet has been added to the list.", + + "seed": { + "enter-seed": "Press here to enter your seed.", + "change-seed": "Press to change", + "confirm-seed": "Press here to confirm your seed.", + "confirmed-seed": "Seed confirmed.", + "use-custom-seed": "Press here if you want to enter the seed manually.", + "use-normal-seed": "Press here if you want to enter the seed using the recommended method.", + "custom-seed-warning-title": "Warning", + "custom-seed-warning-text": "This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.", + "custom-seed-warning-text-recovering": "To avoid possible problems, this option should only be used if you want to recover an unconventional seed.", + "custom-seed-warning-check": "I understand the risks and want to continue", + "custom-seed-warning-cancel": "Cancel", + "custom-seed-warning-continue": "Continue", + "incorrect-word": "The word you have entered does not match the requested one.", + "invalid-seed": "The seed you have entered is not valid. Please try again.", + "enter-word": "Enter the word #{{number}}", + "new-seed-help": "You must enter the words of the seed that was generated by the system, to confirm it.", + "recover-seed-help": "Please be sure to enter the correct words in the correct order." + } + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create", + "error": "There was an unexpected error. Please try again." + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "qr": { + "title": "QR Code", + "title-read-only": "QR Code", + "data": "QR Data:", + "address": "Address:", + "request-link": "Request specific amount", + "amount": "Request amount:", + "hours": "Request hours:", + "message": "Message:", + "invalid": "(invalid value)", + "copied": "The text has been copied to the clipboard." + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "personal-note-label": "Personal note", + "personal-note-help": "Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "convert-confirmation": "Do you also want the already introduced amount to be converted from {{from}} to {{to}}?", + "convert-confirmation-plural": "Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?", + "send-all-available-coins": "send all", + "no-wallet-selected": "You must select a wallet first.", + "precision-error-warning": "A precision error was detected during conversion. Please check the amount that will be sent.", + "invaid-amount-warning": "An invalid value was detected during conversion. Please check the amount that will be sent.", + "precision-errors-warning": "Precision errors were detected during conversion. Please check the amount that will be sent.", + "invaid-amounts-warning": "Invalid values were detected during conversion. Please check the amount that will be sent.", + "multiple-problems-warning": "Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.", + "no-coins-left": "There are no coins left to send.", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to the recipients and less will be retained", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet", + "error-saving-note": "The transaction was successfully sent, but it was not possible to save the note.", + "sent": "Transaction successfully sent.", + "total": "Total:", + + "bulk-send": { + "title": "Bulk Send", + "indications": "To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \"xyz\" address, type \"xyz,10,5\"; if you want the hours to be calculated automatically, type \"xyz,10\". Decimal values must be separated with a dot.", + "process": "Process", + "error-no-data": "There is no text to process.", + "error-inconsistent-data": "If you set how many hours you want to send to a destinations, you must do so for all destinations.", + "error-invalid-data": "The entered text has an invalid format." + } + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset", + "done": "Password successfully changed." + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "note": "Note", + "without-note": "Without note", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "edit-note": { + "title": "Edit note", + "cancel-button": "Cancel", + "change-button": "Change" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "note": "Note", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New Skywallet", + "error-disconnected": "Unable to perform the operation. The Skywallet is not connected.", + "simple-error": "Error. Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid Skywallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected Skywallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is incorrect.", + "confirm": "Please confirm the operation on the Skywallet.", + "confirm-and-more": "Please confirm the operation on the Skywallet and follow the instructions displayed.", + "follow": "Please follow the instructions displayed on the Skywallet.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled.", + "name-updated": "The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device." + }, + "errors": { + "too-many-inputs-outputs": "The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.", + "daemon-connection": "Problem connecting to the Skywallet service.", + "timeout": "The operation was canceled due to inactivity. Please try again.", + "invalid-address-generated": "There was a problem with the address generator and the operation had to be canceled.", + "invalid-address": "Invalid address.", + "not-in-bootloader-mode": "To use this option the Skywallet must be in bootloader mode." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.", + "link": "Open the Skywallet options window.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No Skywallet detected. Please connect a Skywallet to use this option.", + "unconfigured-detected-title": "Unconfigured Skywallet", + "unconfigured-detected": "A seedless Skywallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it. Select \"Restore backup\" if you want to configure the Skywallet with a previously created seed backup.", + "configured-detected": "Skywallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "unchecked-version-warning": "It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.", + "outdated-version-warning": "The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \"Update firmware\" option.", + "backup-warning": "You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "update-firmware": "Update firmware", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "delete-pin": "Delete PIN code", + "forgotten-pin1": "If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking", + "forgotten-pin2": "here.", + "firmware-version": "Device firmware version:" + }, + "update-firmware-warning" : { + "title": "Outdated Firmware", + "text": "WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.", + "cancel": "Cancel", + "update": "Update" + }, + "update-firmware" : { + "title-connecting": "Connecting...", + "title-update": "Update Firmware", + "title-install": "Install Firmware", + "text-downloading": "Checking device and downloading files...", + "text-bootloader": "WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-not-bootloader": "To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-no-firmware": "Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.", + "check": "I understand the risks and want to continue", + "follow": "The firmware update has been sent to the Skywallet. Please continue the process on the device.", + "connection-error": "It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.", + "timeout": "The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.", + "finished": "Your device has been configured correctly. Please unplug it before continuing." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a Skywallet.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the Skywallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device.", + "correct-seed": "The seed is valid and matches the one in the device." + }, + "added" : { + "title": "New Skywallet", + "configuring": "New Skywallet detected. Configuring...", + "done": "Done", + "added1": "The connected Skywallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the Skywallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish.", + "characters-warning": "If you use non-standard English characters, the name may not be displayed correctly on the device.", + "ok": "Ok" + }, + "wipe" : { + "warning": "WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet funds, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word shown on the device", + "info2": "You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. The PINs you have entered do not match." + }, + "remove-pin" : { + "warning": "WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties in case of loss or theft.", + "check": "I understand the risks and want to continue" + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the Skywallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a secure PIN consisting of 4 to 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol •.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \"7\" and \"5\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet." + }, + "create-tx" : { + "title": "Create transaction", + "upper-text": "Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:", + "lower-text": "If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.", + "send-p1": "and", + "send-p2": "to" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the Skywallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the Skywallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.", + "user-deposit-timeout": "Order canceled due to inactivity", + "user-deposit-timeout-info": "The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address (valid for this exchange operation only)", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es.json new file mode 100644 index 00000000..8f9f20f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Cargando...", + "new": "Nueva", + "load": "Cargar" + }, + + "errors": { + "error": "Error", + "fetch-version": "No ha sido posible verificar la última versión desde Github", + "incorrect-password": "Contraseña incorrecta", + "error-decrypting": "Error al desencriptar la billetera", + "api-disabled": "API desabilitada", + "no-wallet": "La billetera no existe", + "no-outputs": "No hay salidas no gastadas", + "window-size": "La ventana es demasiado estrecha para el contenido" + }, + + "title": { + "language": "Seleccionar Lenguaje", + "wallets": "Billeteras", + "send": "Enviar", + "history": "Historial", + "buy-coin": "Comprar Skycoins", + "network": "Red", + "blockchain": "Blockchain", + "outputs": "Salidas", + "transactions": "Transacciones", + "pending-txs": "Transacciones Pendientes", + "backup": "Respaldar Billetera", + "explorer": "Explorador de Skycoin", + "seed": "Semilla de la Billetera", + "qrcode": "Código QR", + "reset": "Restablecer contraseña", + "exchange": "Intercambiar", + "select-address": "Seleccionar Dirección", + "order-history": "Historial de órdenes" + }, + + "header": { + "syncing-blocks": "Sincronizando bloques", + "update1": "La actualización", + "update2": "está disponible.", + "synchronizing": "El nodo está sincronizando. Los datos mostrados pueden estar desactualizados.", + "pending-txs1": "Hay una o más", + "pending-txs2": "transacciones pendientes.", + "pending-txs3": "Los datos mostrados pueden estar desactualizados.", + + "errors": { + "no-connections": "Sin conexiones activas, ¡el cliente no está conectado a otros nodos!", + "no-backend1": "Sin acceso al servidor. Por favor, reinicie la aplicación y/o contáctenos vía", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato." + } + }, + + "password": { + "title": "Introduzca Su Contraseña", + "label": "Contraseña", + "confirm-label": "Confirmar contraseña", + "button": "Continuar", + "reset-link": "He olvidado mi contraseña" + }, + + "buy": { + "deposit-address": "Seleccione una dirección para la cual generar un enlace de depósito BTC:", + "select-address": "Seleccione una dirección", + "generate": "Generar", + "deposit-location": "Localización de Depósito", + "deposit-location-desc": "Seleccione la billetera en la que desea que le depositemos sus Skycoins después de recibir los Bitcoins.", + "make-choice": "Realice una selección", + "wallets-desc": "Una nueva dirección BTC es generada cada vez que se selecciona una nueva billetera y dirección. Una única dirección de Skycoin puede tener asignadas hasta 5 direcciones BTC.", + "send": "Enviar Bitcoins", + "send-desc": "Envíe Bitcoins a la dirección abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva dirección en la billetera seleccionada más arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.", + "fraction-warning": "¡Envíe sólo múltiplos de la tasa SKY/BTC! Los Skycoins son enviados en números enteros, ¡no se envían fracciones de SKY!", + "receive": "Recibir SKY", + "receive-desc": "Después de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.", + "status-button": "Estatus:", + "check-status-button": "Revisar Estatus", + "new-order-button": "Nueva Orden" + }, + + "wizard": { + "wallet-desc": "Si no tiene una billetera, use la semilla generada automáticamente para crear una nueva. Si ya tiene una billetera, seleccione \"Cargar\" e introduzca su semilla.", + "encrypt-desc": "Incremente la seguridad de su billetera encriptándola. Al introducir una contraseña más abajo, su billetera será encriptada. Sólo quien tenga la contraseña podrá acceder a la billetera y retirar fondos.", + "hardware-wallet-link": "¿Utilizando una billetera de hardware?", + "finish-button": "Finalizar", + "back-button": "Volver", + + "confirm": { + "title": "¡Resguarde su semilla!", + "desc": "Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. ¡Si olvida su semilla, NO podrá recuperar su billetera!", + "checkbox": "Está segura, lo garantizo.", + "button": "Continuar" + } + }, + + "wallet": { + "new-address": "Nueva Dirección", + "new-addresses": "Nuevas Direcciones", + "show-empty": "Mostrar Vacías", + "hide-empty": "Ocultar Vacías", + "encrypt": "Encriptar Billetera", + "decrypt": "Desencriptar Billetera", + "decrypt-warning": "Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precaución.", + "delete" : "Borrar Billetera", + "edit": "Editar Billetera", + "add": "Agregar Billetera", + "load": "Cargar Billetera", + "encryption-enabled": "Encriptado habilitado", + "encryption-disabled": "Encriptado deshabilitado", + "hw-security-warning": "Posible riesgo de seguridad. Acceda a las opciones de la billetera de hardware (presionando el botón \"Billetera de Hardware\" debajo de la lista de billeteras) mientras el dispositivo está conectado, para más información.", + "wallet": "Billetera", + "hardware-wallet": "Billetera de Hardware", + "delete-confirmation": "ADVERTENCIA: la billetera \"{{ name }}\" será removida de la lista. Para agregarla nuevamente, deberá volver a conectar el dispositivo y abrir las opciones de la billetera del hardware (presionando el botón \"Billetera de hardware\" debajo de la lista de las billeteras). ¿Desea continuar?", + "delete-confirmation-check": "Sí, quiero borrar la billetera.", + "max-hardware-wallets-error": "Ya ha alcanzado el número máximo de direcciones que se puede agregar a la billetera de hardware.", + "add-many-confirmation": "ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las últimas y no las primeras, es posible que algunas direcciones no se recuperen automáticamente si intenta restaurar la billetera con la semilla (tendrá que agregarlas manualmente). ¿Desea continuar?", + + "new": { + "create-title": "Crear Billetera", + "load-title": "Cargar Billetera", + "encrypt-title": "Encriptar la billetera", + "name-label": "Nombre", + "seed-label": "Semilla", + "confirm-seed-label": "Confirmar semilla", + "seed-warning": "¡Recuerde esta semilla! Manténgala en un lugar seguro. ¡Si olvida su semilla, no podrá recuperar la billetera!", + "create-button": "Crear", + "load-button": "Cargar", + "cancel-button": "Cancelar", + "12-words": "12 palabras", + "24-words": "24 palabras", + "generate-12-seed": "Generar una semilla de 12 palabras", + "generate-24-seed": "Generar una semilla de 24 palabras", + "encrypt": "Encriptar billetera", + "encrypt-warning": "Le sugerimos que encripte con una contraseña cada una de sus billeteras. Si olvida su contraseña, puede restaurarla con la semilla. Asegúrese de guardar su semilla en un lugar seguro antes de encriptar la billetera.", + "unconventional-seed-title": "Posible error", + "unconventional-seed-text": "Usted introdujo una semilla no convencional. Si lo hizo por alguna razón en especial, puede continuar (sólo recomendable para usuarios avanzados). Sin embargo, si su intención es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.", + "unconventional-seed-check": "Continuar con la semilla no convencional." + }, + + "rename": { + "title": "Renombrar Billetera", + "name-label": "Nombre", + "cancel-button": "Cancelar", + "rename-button": "Renombrar" + }, + + "add-addresses": { + "title": "Seleccionar cantidad", + "name-quantity": "Cantidad de direcciones a crear", + "cancel-button": "Cancelar", + "create-button": "Crear" + }, + + "address": { + "show": "Presione para mostrar", + "copy": "Copiar", + "copy-address": "Copiar Dirección", + "copied": "¡Copiado!", + "confirm": "Confirmar Dirección", + "outputs": "Salidas No Gastadas", + "history": "Historial" + } + }, + + "send": { + "synchronizing-warning": "La billetera todavía está sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. ¿Seguro de que desea continuar?", + "from-label": "Enviar desde", + "to-label": "Enviar a", + "amount-label": "Cantidad", + "notes-label": "Notas", + "wallet-label": "Billetera", + "addresses-label": "Dirección", + "invalid-amount": "Por favor introduzca una cantidad válida", + "addresses-help": "Limite las direcciones desde donde se podrían enviar las monedas y las horas", + "all-addresses": "Todas las direcciones de la billetera seleccionada", + "outputs-label": "Salidas no gastadas", + "outputs-help": "Limite las salidas no gastadas desde donde se podrían enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.", + "all-outputs": "Todas las salidas no gastadas de las direcciones seleccionadas", + "available-msg-part1": "Con su selección actual puede enviar hasta", + "available-msg-part2": "y", + "available-msg-part3": "(al menos", + "available-msg-part4": "deben ser utilizadas para la tarifa de transacción).", + "change-address-label": "Dirección de retorno personalizada", + "change-address-select": "Seleccionar", + "change-address-help": "Dirección para recibir el cambio. Si no se proporciona, será elegida automáticamente. Haga clic en el enlace \"Seleccionar\" para elegir una dirección de una de sus billeteras", + "destinations-label": "Destinos", + "destinations-help1": "Direcciones de destino y sus monedas", + "destinations-help2": "Direcciones de destino, sus monedas y coin hours", + "hours-allocation-label": "Distribución automática de coin hours", + "options-label": "Opciones", + "value-label": "Factor de distribución de las coin hours", + "value-help": "Mientras mayor sea el valor, más coin hours se enviarán a las salidas", + "preview-button": "Preview", + "send-button": "Enviar", + "back-button": "Volver", + "simple": "Simple", + "advanced": "Advanzado", + "select-wallet": "Seleccionar Billetera" + }, + + "reset": { + "wallet-label": "Billetera", + "seed-label": "Semilla de la billetera", + "password-label": "Nueva contraseña (deje en blanco si desea que la billetera no esté encriptada)", + "confirm-label": "Confirme la contraseña", + "reset-button": "Restaurar" + }, + + "tx": { + "transaction": "Transacción", + "confirm-transaction": "Confirmar Transacción", + "from": "Desde", + "to": "A", + "date": "Fecha", + "status": "Estatus", + "coins": "Monedas", + "hours": "Horas", + "id": "Tx ID", + "show-more": "Mostrar más", + "hours-moved": "movida(s)", + "hours-sent": "enviada(s)", + "hours-received": "recibida(s)", + "hours-burned": "quemada(s)", + "inputs": "Entradas", + "outputs": "Salidas", + "confirmed": "Confirmada", + "pending": "Pendiente", + "current-rate": "Calculado a la tasa actual" + }, + + "backup": { + "wallet-directory": "Directorio de la Billetera:", + "seed-warning": "RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podrá recuperar las monedas.", + "desc": "Use la tabla de más abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de más arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.", + "close-button": "Cerrar", + "wallet": "Nombre de la Billetera", + "filename": "Archivo", + "seed": "Semilla", + "show-seed": "Mostrar semilla", + "no-wallets": "No hay billeteras encriptadas" + }, + + "blockchain": { + "blocks": "Cantidad de bloques", + "time": "Fecha del último bloque", + "hash": "Hash del último bloque", + "current-supply": "Suministro de SKY actual", + "total-supply": "Suministro de SKY total", + "current-coinhour-supply": "Suministro de Coin Hours actual", + "total-coinhour-supply": "Suministro de Coin Hours total" + }, + + "network": { + "peer": "Par", + "source": "Fuente", + "block-height": "Altura del bloque", + "block-height-short": "Bloque", + "last-seen": "Última vez visto", + "last-received": "Última recepción", + "last-sent": "Último envío", + "in": "Entrante", + "out": "Saliente", + + "sources": { + "default": "Par por defecto", + "exchange": "Intercambio de pares" + } + }, + + "pending-txs": { + "timestamp": "Fecha", + "txid": "ID de la transacción", + "none": "Actualmente no hay transacciones pendientes", + "my": "Mías", + "all": "Todas" + }, + + "history": { + "tx-detail": "Detalles de la Transacción", + "moving": "Moviendo internamente", + "moved": "Movida internamente", + "sending": "Enviando", + "sent": "Enviada", + "received": "Recibida", + "receiving": "Recibiendo", + "pending": "Pendiente", + "no-txs": "Usted no tiene historial de transacciones", + "no-txs-filter": "No hay transacciones que coincidan con los criterios de filtro actuales", + "no-filter": "Sin filtros activos (Presione para seleccionar billeteras/direcciones)", + "filter": "Filtro activo: ", + "filters": "Filtros activo: ", + "all-addresses": "Todas las direcciones" + }, + + "teller": { + "done": "Completado", + "waiting-confirm": "Esperando confirmación", + "waiting-deposit": "Esperando depósito de Bitcoins", + "waiting-send": "Esperando para envíar Skycoins", + "unknown": "Desconocido" + }, + + "confirmation" : { + "header-text": "Confirmación", + "confirm-button": "Sí", + "cancel-button": "No", + "close": "Cerrar" + }, + + "service": { + "api" : { + "server-error": "Error de servidor" + }, + "wallet": { + "not-enough-hours": "¡No cuenta con suficientes Coin Hours para realizar la operación!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "Nueva billetera de hardware", + "error-disconnected": "No se puede realizar la operación. La billetera de hardware no está conectada.", + "simple-error": "Error, no se puede realizar la operación.", + "generic-error": "No se puede realizar la operación. Asegúrese de haber conectado una billetera de hardware válida y de que no esté esperando por alguna confirmación o respuesta.", + "generic-error-internet": "No se puede realizar la operación. Asegúrese de haber conectado una billetera de hardware válida que no esté esperando por alguna confirmación o respuesta y de que su equipo cuente con conexión a internet y al nodo.", + "error-incorrect-wallet": "No se puede realizar la operación. La billetera de hardware conectada es diferente a la esperada.", + "error-incorrect-pin": "No se puede realizar la operación. El PIN que ha introducido no es correcto.", + "confirm": "Por favor, confirme la operación en la billetera de hardware.", + "confirm-and-more": "Por favor, confirme la operación en la billetera de hardware y siga las instrucciones.", + "close": "Cerrar", + "cancel": "Cancelar", + "continue": "Continuar", + "completed": "La operación se realizó con éxito.", + "refused": "La operación falló o fue cancelada." + }, + "errors": { + "too-many-inputs": "La transacción tiene demasiadas entradas y no se puede procesar. Por favor, póngase en contacto con el soporte técnico.", + "too-many-outputs": "La transacción tiene demasiadas salidas y no se puede procesar. Por favor, póngase en contacto con el soporte técnico." + }, + "security-warning" : { + "title": "Advertencia de seguridad", + "text": "La última vez que se conectó esta billetera de hardware, se encontraron una o más advertencias de seguridad. Le recomendamos que abra las opciones de billetera de hardware (presionando el botón \"Billetera de hardware\" debajo de la lista de billeteras) mientras el dispositivo está conectado y resuelva los problemas de seguridad antes de continuar.", + "check": "Entiendo los riesgos y deseo continuar.", + "continue": "Continuar", + "cancel": "Cancelar" + }, + "options" : { + "connecting": "Conectando...", + "disconnected": "Billetera de hardware no detectada. Por favor, conecte una billetera de hardware para usar esta opción.", + "unconfigured-detected-title": "Billetera de hardware no configurada", + "unconfigured-detected": "Se ha detectado una billetera de hardware sin semilla. Seleccione \"Configurar automáticamente\" si desea configurarla como una billetera nueva y comenzar a usarla inmediatamente, o seleccione \"Restaurar una copia de seguridad\" si desea configurarla con la copia de seguridad de una semilla creada anteriormente y así poder acceder a sus fondos de nuevo.", + "configured-detected": "Billetera de hardware detectada. El dispositivo se identifica en la lista de billeteras como:", + "security-warnings-title": "Advertencias de seguridad", + "security-warning-title": "Advertencia de seguridad", + "backup-warning": "Debe hacer una copia de seguridad de la semilla de la billetera de hardware o podría perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opción \"Crear copia de seguridad\".", + "pin-warning": "La billetera de hardware conectada no tiene un PIN. El código PIN protege la billetera de hardware en caso de pérdida, robo y pirateo. Para crear un código PIN, seleccione la opción \"Crear código PIN\".", + "options": "Opciones:", + "configure-automatically": "Configurar automáticamente", + "restore-backup": "Restaurar una copia de seguridad", + "create-backup": "Crear copia de seguridad", + "wipe": "Borrar el dispositivo", + "confirm-seed": "Confirmar la semilla", + "create-pin": "Crear código PIN", + "change-pin": "Cambiar el código PIN", + "forgotten-pin1": "Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la billetera del hardware y luego restaurarla con la semilla haciendo clic", + "forgotten-pin2": "aquí." + }, + "generate-seed" : { + "text": "Antes de continuar, puede seleccionar el número de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una razón especial para seleccionar uno u otro, puede dejar el valor predeterminado.", + "configuring": "Configurando..." + }, + "restore-seed" : { + "text": "Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.", + "check-text": "Puede usar esta opción para ingresar una semilla y verificar si es igual a la de la billetera de hardware. Antes de comenzar, seleccione el número de palabras de la semilla que desea verificar.", + "warning" : "ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una billetera de hardware de la misma marca/modelo.", + "error-wrong-word": "Error: la palabra introducida no coincide con la solicitada por la billetera de hardware.", + "error-invalid-seed": "Error: La semilla no es válida. Por favor, asegúrese de ingresar las palabras correctas en el orden correcto.", + "error-wrong-seed": "Error: la semilla es válida pero no coincide con la del dispositivo." + }, + "added" : { + "title": "Nueva Billetera de Hardware", + "configuring": "Nueva billetera de hardware detectada. Configurando...", + "done": "Hecho", + "added1": "La billetera de hardware conectada se ha agregado a la lista de billeteras con el siguiente nombre:", + "added2": "Ahora puede consultar el saldo y las direcciones de la billetera de hardware incluso cuando no está conectada. Además, puede cambiar el nombre de la billetera o eliminarla de la lista de billeteras, si lo desea." + }, + "wipe" : { + "warning": "ADVERTENCIA: Todos los datos en la billetera de hardware serán eliminados. Si no tiene una copia de seguridad, no podrá volver a acceder a sus fondos.", + "confirm-delete": "Quitar también de la lista de billeteras." + }, + "create-backup" : { + "warning": "ADVERTENCIA: Solo puede usar esta opción para hacer una copia de seguridad de la semilla de su billetera de hardware una vez. Si decide continuar, tendrá que escribir un grupo de palabras (se recomienda hacerlo en papel y no en una computadora) que aparecerán en la pantalla de la billetera de hardware y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la \"semilla\") podrá acceder a los fondos de la cartera, por lo que se recomienda extremar las precauciones.", + "instructions": "Escriba la lista de palabras que aparecen en la pantalla de la billetera de hardware. Asegúrate de respetar el orden y escribir cada palabra correctamente." + }, + "seed-word" : { + "title": "Ingresar palabra", + "info1": "Introduzca la palabra indicada en el dispositivo", + "info2": "Se le pedirá que ingrese las palabras de su semilla de respaldo en orden aleatorio, más algunas palabras adicionales.", + "word": "Palabra solicitada", + "error-invalid-word": "La palabra introducida no es válida.", + "error-loading-words": "Cargando la lista de palabras. Por favor espere." + }, + "change-pin" : { + "pin-mismatch": "No se puede realizar la operación. Los dos PIN que ha introducido no coinciden." + }, + "enter-pin" : { + "title": "Ingresar PIN", + "title-change-current": "Ingrese el PIN actual", + "title-change-new": "Ingrese el nuevo PIN", + "title-change-confirm": "Confirme el nuevo PIN", + "instructions": "El patrón de números del PIN se muestra en la pantalla de la billetera de hardware.", + "instructions-tx": "Introduzca el PIN para confirmar y firmar la transacción.", + "instructions-change": "Ingrese un PIN difícil de adivinar de entre 4 y 8 números.", + "help": "¿Necesita ayuda?" + }, + "pin-help" : { + "title": "Ayuda", + "part1": "Cuando sea necesario ingresar el PIN para continuar, la pantalla de la billetera del hardware mostrará una matriz de 9 casillas con números en orden aleatorio (el orden cambia cada vez) y se le pedirá que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el símbolo #.", + "part2": "Para ingresar el PIN, mire la posición de los números del PIN en la matriz de números en la pantalla de la billetera de hardware y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es \"23\", el número 2 está en la esquina superior izquierda y el número 3 en el centro de la matriz de números de billetera de hardware, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.", + "part3": "Si lo desea, también puede usar el teclado numérico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es \"23\", no puede simplemente escribir \"23\" con el teclado numérico, sino que deberá presionar las teclas que están en la posición donde están los números 2 y 3 en la pantalla de la billetera de hardware." + }, + "create-tx" : { + "title": "Crear transacción" + }, + "confirm-address" : { + "title": "Confirmar dirección", + "instructions": "Por favor confirme en la billetera de hardware si la dirección es:", + "short-confirmation": "Dirección confirmada.", + "confirmation": "Dirección confirmada. Por seguridad, puede volver a mostrar la dirección en la billetera de hardware usando la opción \"Confirmar dirección\", en el menú que puede mostrar presionando el botón a la derecha del balance de la direccion." + } + }, + + "time-from-now": { + "few-seconds": "hace pocos segundos", + "minute": "hace un minuto", + "minutes": "hace {{time}} minutos", + "hour": "hace una hora", + "hours": "hace {{time}} horas", + "day": "hace un día", + "days": "hace {{time}} días" + }, + + "exchange": { + "you-send": "Usted envía", + "you-get": "Usted recibe (aprox.)", + "to-address": "A la dirección de {{coin}}", + "price": "Tasa de cambio", + "time-15": "Duración del intercambio", + "exchange-button": "Intercambiar", + "min-amount": "Monto minimo:", + "max-amount": "Monto maximo:", + "agree-1": "Acepto los", + "agree-2": "Términos de Uso", + "agree-3": "y la ", + "agree-4": "Política de Privacidad", + "powered-by": "Manejado por", + "need-help": "¿Necesita ayuda?", + "support-portal": "Portal de soporte", + "history": "Historial de órdenes", + "order-not-found": "Orden no encontrada", + "status": "Estado", + "exchanging": "Intercambiando {{from}} por {{to}}", + "select": "Seleccionar", + "offline": "El servicio está temporalmente offline", + "problem-connecting": "No se puede conectar con el servicio. Por favor, compruebe su conexión a Internet y vuelva a intentarlo más tarde.", + "invalid-address": "Dirección inválida.", + "statuses": { + "user-waiting": "Esperando el deposito. Por favor, envíe {{amount}} {{from}} a la dirección de intercambio indicada más abajo", + "user-waiting-info": "El sistema está a la espera de que realice el depósito en la dirección de intercambio. El proceso de intercambio comenzará después de que se detecte el depósito y sea confirmado en la cadena de bloques. Si ya ha realizado el depósito, debería ser detectado en breve.", + "market-waiting-confirmations": "Esperando las confirmaciones de la transacción", + "market-waiting-confirmations-info": "El depósito ya ha sido detectado y el sistema está esperando que sea confirmado en la cadena de bloques.", + "market-confirmed": "Transacción aceptada", + "market-confirmed-info": "La transacción ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.", + "market-exchanged": "{{from}} intercambiado por {{to}}", + "market-exchanged-info": "El intercambio se ha realizado. Los fondos serán transferidos a su dirección en un momento.", + "market-withdraw-waiting": "Enviando {{to}} a su dirección", + "market-withdraw-waiting-info": "Se ha iniciado el proceso para enviar las monedas a su dirección.", + "complete": "¡Intercambio completado!", + "complete-info": "Los fondos han sido enviados con éxito a su dirección.", + "error": "Se produjo un error", + "error-info": "Hubo un error en la operación, puede encontrar más información más abajo. Si necesita ayuda, por favor guarde todos los datos de operación que se muestran más abajo y comuníquese con soporte técnico utilizando el enlace que se encuentra en la parte inferior derecha de esta página." + }, + "history-window": { + "address": "Dirección", + "date": "Fecha" + }, + "details": { + "exchange-addr": "Dirección de intercambio", + "exchange-addr-tag": "Payment ID o Destination Tag que debe usarse para la transacción", + "tx-id": "ID de la transacción", + "order-id": "ID de la orden", + "initial-price": "Tasa de cambio inicial", + "error-msg": "Mensaje de error", + "details": "Detalles", + "start-date": "Fecha de inicio", + "back": "Volver", + "back-alert": "La operación aún está en progreso. ¿Realmente desea volver al formulario? Puede ver el progreso de esta operación nuevamente presionando el botón \"Historial de pedidos\"" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es_base.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es_base.json new file mode 100644 index 00000000..402d23ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es_base.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a hardware wallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Hardware Wallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the hardware wallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create" + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet" + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New hardware wallet", + "error-disconnected": "Unable to perform the operation. The hardware wallet is not connected.", + "simple-error": "Error, Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected hardware wallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is not correct.", + "confirm": "Please, confirm the operation in the hardware wallet.", + "confirm-and-more": "Please, confirm the operation in the hardware wallet and follow the instructions.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled." + }, + "errors": { + "too-many-inputs": "The transaction has too many inputs and can not be processed. Please contact technical support.", + "too-many-outputs": "The transaction has too many outputs and can not be processed. Please contact technical support." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected and solve the security problems before continuing.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No hardware wallet detected. Please connect a hardware wallet to use this option.", + "unconfigured-detected-title": "Unconfigured hardware wallet", + "unconfigured-detected": "A seedless hardware wallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it immediately, or select \"Restore backup\" if you want to configure it with a previously created seed backup and thus be able to access your funds again.", + "configured-detected": "Hardware wallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "backup-warning": "You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "forgotten-pin1": "If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking", + "forgotten-pin2": "here." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the hardware wallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device." + }, + "added" : { + "title": "New Hardware Wallet", + "configuring": "New hardware wallet detected. Configuring...", + "done": "Done", + "added1": "The connected hardware wallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish." + }, + "wipe" : { + "warning": "WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet balance, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word indicated in the device", + "info2": "You will be asked to enter the words of your backup seed in random order, plus a few additional words.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. Two PINs you have entered do not match." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the hardware wallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a hard-to-guess PIN of between 4 and 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet." + }, + "create-tx" : { + "title": "Create transaction" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the hardware wallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the hardware wallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/ru.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/ru.json new file mode 100644 index 00000000..69cd50e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/ru.json @@ -0,0 +1,250 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "CH", + "loading": "Загрузка...", + "new": "Ðовый", + "load": "Импортировать" + }, + + "errors": { + "fetch-version": "Ðе удалоÑÑŒ получить поÑледнюю верÑию Ñ Github", + "incorrect-password": "Ðеверный пароль", + "api-disabled": "API выключен", + "no-wallet": "Кошелёк не ÑущеÑтвует", + "no-outputs": "Ðе доÑтаточно ÑредÑтв" + }, + + "title": { + "wallets": "Кошельки", + "send": "Отправить", + "history": "ИÑториÑ", + "buy-coin": "Купить Skycoin", + "network": "Сеть", + "blockchain": "Блокчейн", + "outputs": "Выходы (Outputs)", + "transactions": "Транзакции", + "pending-txs": "Ðеподтверждённые транзакции", + "backup": "Резервное копирование", + "explorer": "Skycoin ÑкÑплорер", + "seed": "Фраза воÑтановлениÑ", + "qrcode": "QR-код" + }, + + "header": { + "syncing-blocks": "Идёт ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²...", + "update1": "Обновление кошелька", + "update2": "доÑтупно.", + "pending-txs1": "СущеÑтвует", + "pending-txs2": "транзакции, требующие подтверждениÑ.", + "pending-txs3": "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не актуальной. УбедитеÑÑŒ что у Ð²Ð°Ñ Ð¿Ñ€Ð¸ÑутÑтвует Ñоединение Ñ Ñетью.", + + "errors": { + "no-connections": "Ðет активных Ñоединений, ваш клиент не подключен к другим узлам!", + "no-backend1": "Ðет доÑтупа к ÑервиÑу. ПерезапуÑтите приложение или обратитÑеь за помощью в нашей группе", + "no-backend2": "в телеграмме.", + "no-backend3": "", + "csrf": "Возможные уÑзвимоÑти безопаÑноÑти: CSRF не работает." + } + }, + + "password": { + "title": "Введите пароль", + "label": "Пароль", + "confirm-label": "Подтвердите пароль", + "button": "Продолжить" + }, + + "buy": { + "deposit-address": "Выберите кошелёк Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ депозитного адреÑа:", + "select-address": "Выберите адреÑ", + "generate": "Сгенерировать", + "deposit-location": "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ", + "deposit-location-desc": "Выберите кошелёк Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Skycoin, поÑле уÑпешно отправленного депозита.", + "make-choice": "Сделайте выбор", + "wallets-desc": "При выборе адреÑа, каждый раз генерируетÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð´ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð°. Один Ð°Ð´Ñ€ÐµÑ Ð¼Ð¾Ð¶ÐµÑ‚ быть прикреплён к ограниченному количеÑтву адреÑов.", + "send": "Пошлите выбранную криптовалюту", + "send-desc": "Отправьте выбранную вами криптовалюту на Ð°Ð´Ñ€ÐµÑ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹Ð¹ ниже. По получению и поÑле доÑтаточного Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð², вы получите Skycoin на указаный Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾ курÑу {{ rate }} Skycoin/Selected Coin.", + "fraction-warning": "Рекомендовано поÑылать целые значениÑ.", + "receive": "Получить Skycoin", + "receive-desc": "ПоÑле Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ криптавалюты, вы получите Skycoin. Это может занÑÑ‚ÑŒ от неÑкольких Ñекунд до неÑкольких дней, в завиÑимоÑти от выбранного ÑпоÑоба оплаты и загруженноÑти Ñети.", + "status-button": "СтатуÑ:", + "check-status-button": "Проверить ÑтатуÑ", + "new-order-button": "Ðовый заказ", + "refresh": "Обновить", + "available-now": "ДоÑтупно:", + "choose-preference": "Выберите ÑпоÑоб оплаты. Имейте в виду, что некоторые ÑпоÑобы могут быть временно отключены.", + "choose": "Выберите вашу любимую крипту ;)", + "send-coin":"Отправить", + "send-coin-text-1": "на Ð°Ð´Ñ€ÐµÑ Ð½Ð¸Ð¶Ðµ. ПоÑле доÑтаточного количеÑтва подтверждений на блокчейне, вы получите Skycoin на выбранный вами кошелёк по курÑу" + }, + + "wizard": { + "wallet-desc": "ЕÑли у Ð²Ð°Ñ Ð½ÐµÑ‚ кошелька Skycoin, иÑпользуйте Ñгенерированную фразу Ð´Ð»Ñ ÐµÐ³Ð¾ ÑозданиÑ. ЕÑли фраза у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ, нажмите \"Импортирование кошелька\" и введите вашу фразу.", + "encrypt-desc": "Ð”Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ безопаÑти, рекомендуем добавить пароль Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. СредÑтва можно будет отправлÑÑ‚ÑŒ только при наличии паролÑ. УбедитеÑÑŒ, что вы его помните.", + "finish-button": "Закончить", + "back-button": "Ðазад", + + "confirm": { + "title": "Держите Ñвою фразу в Ñохраном меÑте!", + "desc": "УбедитеÑÑŒ, что вы запиÑали фразу воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ держите её в надёжном меÑте. При утере фразы вы потерÑете доÑтуп к вашему кошельку Skycoin!", + "checkbox": "КлÑнуÑÑŒ. Я запиÑал.", + "button": "Продолжить" + } + }, + + "wallet": { + "new-address": "Ðовый адреÑ", + "show-empty": "Показать пуÑтые", + "hide-empty": "Скрыть пуÑтые", + "encrypt": "Зашифровать кошелёк", + "decrypt": "РаÑшифровать кошелёк", + "edit": "Редактирвоать", + "add": "Ðовый кошелёк", + "load": "Импортировать", + "encryption-enabled": "Зашифрован", + "encryption-disabled": "Без шифрованиÑ", + "wallet": "Кошелёк", + + "new": { + "create-title": "Создать кошелёк", + "load-title": "Импортировать кошелёк", + "encrypt-title": "Шифровать кошелёк", + "name-label": "Ð˜Ð¼Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°", + "seed-label": "Фраза воÑтановлениÑ", + "confirm-seed-label": "Подтвердите фразу", + "seed-warning": "Запомните Ñта фразу или запишите и держите в надежном меÑте, в дали от чужих глаз. При потере фразы вы не Ñможете воÑтановить Skycoin кошелёк!", + "create-button": "Создать", + "load-button": "Импортировать", + "cancel-button": "Отмена", + "12-words": "12 Ñлов", + "24-words": "24 Ñлова", + "generate-12-seed": "Сгенирировать фразу из 12 Ñлов", + "generate-24-seed": "Сгенирировать фразу из 24 Ñлов", + "encrypt": "Включить шифрование", + "encrypt-warning": "Мы рекомендуем шифровать вÑе ваши кашельки при помощи надёжного паролÑ. Так же убедитеÑÑŒ, что фраза воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñана и хранитÑÑ Ð² надёжном меÑте." + }, + + "rename": { + "title": "Переименование кошелька", + "name-label": "ИмÑ", + "cancel-button": "Отмена", + "rename-button": "Переименовать" + }, + + "address": { + "copy": "Копировать", + "copy-address": "Копировать адреÑ", + "copied": "Скопировано!", + "outputs": "Ðепотраченые выходы (Unspent Outputs)" + } + }, + + "send": { + "from-label": "Отправить Ñ", + "to-label": "Получить на", + "amount-label": "Сумма", + "notes-label": "Заметки", + "wallet-label": "Кошелёк", + "addresses-label": "ÐдреÑ", + "addresses-help": "ÐÐ´Ñ€ÐµÑ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ° Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "change-address-label": "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñтатка", + "change-address-help": "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ñдачи. ЕÑли вы его не укажите, то он будет выбран автоматичеÑки", + "destinations-label": "ÐдреÑа получателей", + "destinations-help1": "ÐдреÑа получателей и Ñумма Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "destinations-help2": "ÐдреÑа получателей, Ñумма Skycoin & CH Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "hours-allocation-label": "ÐвтоматичеÑки подÑчитывать чаÑÑ‹ (CH)", + "options-label": "Дополнительно", + "value-label": "Фактор отправки чаÑов (CH)", + "value-help": "Чем больше фактор, тем больше CH будет отправлено вмеÑте Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÐµÐ¹", + "preview-button": "ПредпроÑмотр", + "send-button": "Отправить", + "back-button": "Ðазад", + "simple": "Обычный", + "advanced": "Продвинутый" + }, + + "tx": { + "transaction": "ТранзакциÑ", + "confirm-transaction": "Подтердите транзакцию", + "from": "Отправитель", + "to": "Получатель", + "date": "Дата", + "status": "СтатуÑ", + "coins": "Сумма", + "hours": "ЧаÑÑ‹", + "id": "TX ID", + "show-more": "Инфо", + "hours-sent": "отправлÑем", + "hours-burned": "Ñжигаем", + "inputs": "Входы", + "outputs": "Выходы", + "confirmed": "Подтверждена", + "pending": "Ожидание", + "current-rate": "По текущему курÑу" + }, + + "backup": { + "wallet-directory": "Папка кошелька:", + "seed-warning": "ДЕРЖИТЕ ФРÐЗУ ВОСТÐÐОВЛЕÐИЯ Ð’ ÐÐДÐЖÐОМ МЕСТЕ. ÐРБУМÐГЕ. ОФФЛÐЙÐ. ЕÑли вы держите фразу в надёжном меÑте, и никто не Ñмог её подглÑдеть - вашы токены в безопаÑноÑти.", + "desc": "Из таблицы ниже вы можете получить фразы Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… зашифрованных кошельков.
Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ„Ñ€Ð°Ð· воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² кошельках без шифрованиÑ, откройте папку указаную выше и найдите в ней файлы Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸ÐµÐ¼ .wlt. Фраза хранитÑÑ Ð² них. Откройте при помощи любого (надёжного) текÑтового редактора", + "close-button": "Закрыть", + "wallet": "Ðазвание кошелька", + "filename": "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°", + "seed": "Фраза", + "show-seed": "Показать фразу", + "no-wallets": "Кошельков Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ нет" + }, + + "blockchain": { + "blocks": "КоличеÑтво блоков", + "time": "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего блока", + "hash": "Ð¥Ñш поÑледнего блока", + "current-supply": "Ð’Ñего Skycoin в обращении", + "total-supply": "Ð’Ñего Skycoin ÑущеÑтвует", + "current-coinhour-supply": "Ð’Ñего CH в обращении", + "total-coinhour-supply": "Ð’Ñего CH ÑущеÑтвует" + }, + + "network": { + "peer": "Пир (Peer)", + "source": "ИÑточник", + "block-height": "Ð’Ñ‹Ñота блока", + "last-seen": "ПоÑледний блок", + "last-received": "ПоÑледний полученый", + "last-sent": "ПоÑледний отправленый", + "in": "ВходÑщие", + "out": "ИÑходÑщие", + + "sources": { + "default": "Пир по-умолчанию", + "exchange": "Обмена пирами" + } + }, + + "pending-txs": { + "timestamp": "Метка времени", + "txid": "ID транзакции", + "none": "Ðе найдено траназкций ждущих подтверждений", + "my": "Мой", + "all": "Ð’Ñе" + }, + + "history": { + "tx-detail": "Детали о транзакции", + "sending": "ОтправлÑем", + "sent": "Отправлено", + "received": "Получено", + "receiving": "Получаем", + "pending": "ОжидаетÑÑ", + "no-txs": "У Ð²Ð°Ñ Ð½ÐµÑ‚ иÑтории транзакций" + }, + + "teller": { + "done": "Завершено", + "waiting-confirm": "Ожидаем подтверждений", + "waiting-deposit": "Ожидаем депозит", + "waiting-send": "ПоÑылаем Skycoin", + "unknown": "ÐеизвеÑтно" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh.json new file mode 100644 index 00000000..9990b312 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "å¸æ—¶", + "usd": "美元", + "loading": "加载中...", + "new": "æ–°", + "load": "加载" + }, + + "errors": { + "error": "错误", + "fetch-version": "无法从Github获å–最新版本", + "incorrect-password": "密ç é”™è¯¯", + "error-decrypting": "解密钱包时出错", + "api-disabled": "APIç¦ç”¨", + "no-wallet": "æ— å¯æ”¯ä»˜é’±åŒ…", + "no-outputs": "无未交易输出", + "window-size": "窗å£å¤ªçª„,内容放ä¸ä¸‹" + }, + + "title": { + "language": "选择语言", + "wallets": "钱包", + "send": "å‘é€", + "history": "历å²", + "buy-coin": "ä¹° Skycoin", + "network": "网络", + "blockchain": "区å—链", + "outputs": "未交易输出", + "transactions": "交易", + "pending-txs": "待处ç†äº¤æ˜“", + "backup": "备份钱包", + "explorer": "Skycoin Explorer", + "seed": "钱包ç§å­", + "qrcode": "QR代ç ", + "reset": "é‡ç½®å¯†ç ", + "exchange": "交易", + "select-address": "选择地å€", + "order-history": "订å•åŽ†å²" + }, + + "header": { + "syncing-blocks": "区å—åŒæ­¥ä¸­", + "update1": "钱包更新", + "update2": "å¯èŽ·å–", + "synchronizing": "钱包正在åŒæ­¥ã€‚你看到的数æ®å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。", + "pending-txs1": "这里有一些", + "pending-txs2": "待处ç†äº¤æ˜“.", + "pending-txs3": "你看到的数æ®å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。", + + "errors": { + "no-connections": "没有连接,你的客户端没有连接到任何其他节点", + "no-backend1": "ä¸èƒ½åˆ°è¾¾åŽç«¯ã€‚请é‡æ–°å¯åŠ¨åº”用程åºæˆ–寻求我们的帮助", + "no-backend2": "Telegram", + "no-backend3": "", + "csrf": "安全æ¼æ´ž: CSRF未工作,请立å³é€€å‡ºã€‚" + } + }, + + "password": { + "title": "输入密ç ", + "label": "密ç ", + "confirm-label": "确认密ç ", + "button": "继续", + "reset-link": "我忘记了密ç " + }, + + "buy": { + "deposit-address": "选择一个地å€æ¥ç”ŸæˆBTC充值链接,用于:", + "select-address": "选择地å€", + "generate": "生æˆ", + "deposit-location": "充值ä½ç½®", + "deposit-location-desc": "选择一个钱包,以在我们收到你的比特å¸åŽå……值Skycoin到该钱包", + "make-choice": "åšé€‰æ‹©", + "wallets-desc": "æ¯å½“选择一个新的钱包和地å€ï¼Œä¸€ä¸ªæ–°çš„BTC地å€å°†ä¼šç”Ÿæˆã€‚一个独立的Skycoin地å€æœ€å¤šå¯ç»‘定5个BTC地å€ã€‚", + "send": "å‘é€Bitcoin", + "send-desc": "å‘é€Bitcoin至如下地å€ã€‚一旦收到,我们将会按当å‰æ±‡çŽ‡: {{ rate }} SKY/BTC充值Skycoin到选中钱包的一个新地å€ã€‚", + "fraction-warning": "请按SKY/BTC汇率的å€æ•°å‘é€BTC! Skycoin是以整数å‘é€; SKYçš„å°æ•°ä½å°†ä¸ä¼šå‘é€", + "receive": "接收Sky", + "receive-desc": "收到你的比特å¸åŽï¼Œæˆ‘们将å‘é€Skycoin给你。你å¯èƒ½éœ€è¦20分钟到一个å°æ—¶æ‰èƒ½æ”¶åˆ°è¿™äº›SKY。", + "status-button": "状æ€:", + "check-status-button": "查看状æ€", + "new-order-button": "新订å•" + }, + + "wizard": { + "wallet-desc": "如果你没有Skycoin钱包,请使用生æˆçš„ç§å­æ¥åˆ›å»ºä¸€ä¸ªæ–°é’±åŒ…。如果你已ç»æœ‰ä¸€ä¸ªé’±åŒ…,切æ¢åˆ°\"加载钱包\"并输入你的ç§å­ã€‚", + "encrypt-desc": "通过加密æ¥å¢žåŠ é’±åŒ…的安全性。输入密ç åŽï¼Œä½ çš„钱包会被加密。åªæœ‰è¾“入密ç æ‰å¯ä»¥è®¿é—®çš„钱包或移动资金。", + "hardware-wallet-link": "使用硬件钱包?", + "finish-button": "完æˆ", + "back-button": "åŽé€€", + + "confirm": { + "title": "ä¿æŠ¤ä½ çš„ç§å­!", + "desc": "请确ä¿ä½ å·²ç»å†™ä¸‹ä½ çš„ç§å­å¹¶å°†å®ƒå‚¨å­˜åœ¨äº†ä¸€ä¸ªå®‰å…¨çš„地方。如果你忘记了ç§å­ï¼Œä½ å°†æ— æ³•æ¢å¤ä½ çš„Skycoin钱包", + "checkbox": "它很安全,我å‘誓。", + "button": "继续" + } + }, + + "wallet": { + "new-address": "新地å€", + "new-addresses": "新地å€", + "show-empty": "展示空地å€", + "hide-empty": "éšè—空地å€", + "encrypt": "加密钱包", + "decrypt": "解密钱包", + "decrypt-warning": "警告: 出于安全考虑,建议将钱包加密。建议谨慎一点。", + "delete": "删除钱包", + "edit": "编辑钱包", + "add": "添加钱包", + "load": "加载钱包", + "encryption-enabled": "加密已å¯ç”¨", + "encryption-disabled": "加密已ç¦ç”¨", + "hw-security-warning": "å¯èƒ½çš„安全风险。当硬件设备已连接时(点击钱包列表下的\"硬件钱包\"按钮)访问硬件钱包选项以获å–更多信æ¯", + "wallet": "钱包", + "hardware-wallet": "硬件钱包", + "delete-confirmation": "警告: 钱包\"{{ name }}\"将从列表中删除。若想é‡æ–°æ·»åŠ ï¼Œéœ€é‡æ–°è¿žæŽ¥è®¾å¤‡å¹¶æ‰“开硬件钱包的选项列表(点击钱包列表下的\"硬件钱包\"按钮)。你想继续å—?", + "delete-confirmation-check": "是的,我想è¦åˆ é™¤é’±åŒ…。", + "max-hardware-wallets-error": "你的硬件钱包里的地å€å·²ç»è¾¾åˆ°å…许的最大值。", + "add-many-confirmation": "警告: 如果你在ä¸ä½¿ç”¨å‰ä¸€ä¸ªåœ°å€çš„情况下添加太多地å€ï¼Œæˆ–者如果你使用的是最åŽä¸€ä¸ªåœ°å€è€Œä¸æ˜¯ç¬¬ä¸€ä¸ªåœ°å€ï¼Œé‚£ä¹ˆå¦‚果你å°è¯•ä½¿ç”¨ç§å­æ¢å¤é’±åŒ…,有些地å€å°†å¯èƒ½æ— æ³•è‡ªåŠ¨æ¢å¤ï¼ˆä½ å¿…须手动添加它们)。 你想继续å—?", + + "new": { + "create-title": "创建钱包", + "load-title": "加载钱包", + "encrypt-title": "加密钱包", + "name-label": "å称", + "seed-label": "ç§å­", + "confirm-seed-label": "确认ç§å­", + "seed-warning": "è®°ä½ç§å­! 把它ä¿å­˜åœ¨å®‰å…¨çš„地方。 如果你忘记了你的ç§å­ï¼Œä½ å°†æ— æ³•æ‰¾å›žä½ çš„钱包!", + "create-button": "创建", + "load-button": "加载", + "cancel-button": "删除", + "12-words": "12å­—", + "24-words": "24å­—", + "generate-12-seed": "生æˆ12å­—ç§å­", + "generate-24-seed": "生æˆ24å­—ç§å­", + "encrypt": "加密钱包", + "encrypt-warning": "我们建议你为æ¯ä¸ªé’±åŒ…设置一个独立的密ç ã€‚如果你忘记密ç ï¼Œä½ å¯ä»¥é€šè¿‡ç§å­é‡ç½®é’±åŒ…。在加密你的钱包之å‰ï¼Œç¡®ä¿ä½ çš„ç§å­ä¿å­˜åœ¨å®‰å…¨çš„地方。", + "unconventional-seed-title": "å¯èƒ½é”™è¯¯", + "unconventional-seed-text": "你引进了一ç§éžä¼ ç»Ÿçš„ç§å­ã€‚如果你出于任何特殊原因这样åšï¼Œä½ å¯ä»¥ç»§ç»­(åªæŽ¨è高级用户)。但是,如果你打算使用普通的系统ç§å­ï¼Œåˆ™å¿…须删除所有附加文本和特殊字符。", + "unconventional-seed-check": "继续使用éžä¼ ç»Ÿç§å­ã€‚" + }, + + "rename": { + "title": "é‡å‘½å钱包", + "name-label": "命å", + "cancel-button": "å–消", + "rename-button": "é‡å‘½å" + }, + + "add-addresses": { + "title": "选择数é‡", + "name-quantity": "创建多少地å€", + "cancel-button": "å–消", + "create-button": "创建" + }, + + "address": { + "show": "点击显示", + "copy": "å¤åˆ¶", + "copy-address": "å¤åˆ¶åœ°å€", + "copied": "å·²å¤åˆ¶!", + "confirm": "确认地å€", + "outputs": "未交易输出", + "history": "历å²" + } + }, + + "send": { + "synchronizing-warning":"钱包ä»åœ¨åŒæ­¥æ•°æ®ï¼Œæ‰€ä»¥æ˜¾ç¤ºçš„ä½™é¢å¯èƒ½ä¸æ­£ç¡®ã€‚你确定è¦ç»§ç»­å—?", + "from-label": "å‘é€è‡ª", + "to-label": "å‘é€è‡³", + "amount-label": "总é¢", + "notes-label": "标注", + "wallet-label": "钱包", + "addresses-label": "地å€", + "invalid-amount": "请输入一个有效数值", + "addresses-help": "é™å®šæºå‘é€åœ°å€", + "all-addresses": "所有地å€(所选钱包的)", + "outputs-label": "未交易输出", + "outputs-help": "é™å®šæœªäº¤æ˜“输出", + "all-outputs": "所有未交易输出(所选地å€çš„)", + "available-msg-part1": "æ ¹æ®ä½ å½“å‰çš„选择,你最多å¯ä»¥å‘é€", + "available-msg-part2": "å’Œ", + "available-msg-part3": "(至少", + "available-msg-part4": "将作为必须的交易手续费)。", + "change-address-label": "自定义找零地å€", + "change-address-select": "选择", + "change-address-help": "自定义找零地å€ã€‚如果ä¸æ供,钱包将会自动选择。点击\"选择\" æ¥é€‰æ‹©ä¸€ä¸ªåœ°å€", + "destinations-label": "目标地å€", + "destinations-help1": "目标地å€å’Œå³å°†å‘é€çš„å¸", + "destinations-help2": "目标地å€å’Œå³å°†å‘é€çš„å¸ä»¥åŠå¸æ—¶", + "hours-allocation-label": "自动分é…å¸æ—¶", + "options-label": "选项", + "value-label": "å¸æ—¶åˆ†å‘å› å­", + "value-help": "分å‘å› å­å€¼è¶Šé«˜ï¼Œè¶Šå¤šå¸æ—¶å°†è¢«å‘é€", + "preview-button": "预览", + "send-button": "å‘é€", + "back-button": "åŽé€€", + "simple": "简易", + "advanced": "高级的", + "select-wallet": "选择钱包" + }, + + "reset": { + "wallet-label": "钱包", + "seed-label": "钱包ç§å­", + "password-label": "æ–°å¯†ç  (如果你ä¸å¸Œæœ›é’±åŒ…加密,请将密ç ç•™ç©º)", + "confirm-label": "确认新密ç ", + "reset-button": "é‡ç½®" + }, + + "tx": { + "transaction": "交易", + "confirm-transaction": "确认交易", + "from": "æ¥è‡ª", + "to": "到", + "date": "日期", + "status": "状æ€", + "coins": "å¸", + "hours": "å¸æ—¶", + "id": "交易ID", + "show-more": "展示更多", + "hours-moved": "已转移", + "hours-sent": "å·²å‘é€", + "hours-received": "已接收", + "hours-burned": "已燃烧", + "inputs": "输入", + "outputs": "输出", + "confirmed": "已确认", + "pending": "待处ç†", + "current-rate": "按当å‰æ±‡çŽ‡è®¡ç®—" + }, + + "backup": { + "wallet-directory": "钱包目录:", + "seed-warning": "在纸上备份你的ç§å­ï¼Œå¹¶ä¿å­˜åœ¨ä¸€ä¸ªå®‰å…¨çš„地方。åªè¦æœ‰ç§å­ï¼Œä½ å°±å¯ä»¥æ‰¾å›žä½ çš„å¸ã€‚", + "desc": "使用下表从加密的钱包中得到ç§å­ã€‚
为了从未加密的钱包中获得ç§å­ï¼Œæ‰“开上é¢çš„文件夹,在文本编辑器中打开.wlt文件并æ¢å¤ç§å­ã€‚", + "close-button": "Close", + "wallet": "钱包", + "filename": "文件å", + "seed": "ç§å­", + "show-seed": "显示ç§å­", + "no-wallets": "未加密钱包" + }, + + "blockchain": { + "blocks": "区å—æ•°é‡", + "time": "上一个区å—的时间戳", + "hash": "上一个区å—的哈希值", + "current-supply": "ç›®å‰SKY供应é‡", + "total-supply": "SKY的总供应é‡", + "current-coinhour-supply": "ç›®å‰å¸æ—¶ä¾›åº”é‡", + "total-coinhour-supply": "å¸æ—¶æ€»ä¾›åº”é‡" + }, + + "network": { + "peer": "节点", + "source": "节点æ¥æº", + "block-height": "区å—高度", + "block-height-short": "区å—", + "last-seen": "上一次出现", + "last-received": "上一次接收", + "last-sent": "上一次å‘é€", + "in": "è¿›æ¥çš„", + "out": "出去的", + + "sources": { + "default": "默认节点", + "exchange": "交æ¢èŠ‚点" + } + }, + + "pending-txs": { + "timestamp": "时间戳", + "txid": "交易ID", + "none": "无待处ç†äº¤æ˜“", + "my": "我的", + "all": "全部" + }, + + "history": { + "tx-detail": "交易明细", + "moving": "内部转账中", + "moved": "已内部转账", + "sending": "å‘é€ä¸­", + "sent": "å·²å‘é€", + "received": "已接收", + "receiving": "接收中", + "pending": "待处ç†", + "no-txs": "你没有历å²äº¤æ˜“", + "no-txs-filter": "没有与当å‰ç­›é€‰æ¡ä»¶åŒ¹é…的交易", + "no-filter": "未ç»ç­›é€‰ (点击选择钱包/地å€)", + "filter": "已筛选: ", + "filters": "已筛选: ", + "all-addresses": "所有地å€" + }, + + "teller": { + "done": "完æˆ", + "waiting-confirm": "等待确认", + "waiting-deposit": "等待比特å¸å……值", + "waiting-send": "等待å‘é€Skycoin", + "unknown": "未知" + }, + + "confirmation" : { + "header-text": "确认", + "confirm-button": "是", + "cancel-button": "å¦", + "close": "关闭" + }, + + "service": { + "api" : { + "server-error": "æœåŠ¡å™¨é”™è¯¯" + }, + "wallet": { + "not-enough-hours": "没有足够的å¸æ—¶æ¥æ‰§è¡Œäº¤æ˜“" + } + }, + + "hardware-wallet": { + "general": { + "default-wallet-name": "新硬件钱包", + "error-disconnected": "无法执行该æ“作。硬件钱包未连接。", + "simple-error": "错误,无法执行æ“作。", + "generic-error": "无法执行该æ“作。确ä¿ä½ å·²ç»è¿žæŽ¥äº†ä¸€ä¸ªæœ‰æ•ˆçš„硬件钱包,并且它没有在等待输入。", + "generic-error-internet": "无法执行该æ“作。确ä¿ä½ å·²ç»è¿žæŽ¥äº†ä¸€ä¸ªæœ‰æ•ˆçš„硬件钱包,它ä¸åœ¨ç­‰å¾…输入,并且你已ç»è¿žæŽ¥åˆ°ç½‘络/节点", + "error-incorrect-wallet": "无法执行该æ“作。所连接的硬件钱包与预期ä¸åŒã€‚", + "error-incorrect-pin": "无法执行该æ“作。你输入的密ç ä¸æ­£ç¡®ã€‚", + "confirm": "请在硬件钱包中确认æ“作。", + "confirm-and-more": "请在硬件钱包中确认æ“作并按éµå¾ªæŒ‡ç¤ºã€‚", + "close": "关闭", + "cancel": "å–消", + "continue": "继续", + "completed": "æ“作完æˆã€‚", + "refused": "æ“作失败或被å–消。" + }, + "errors": { + "too-many-inputs": "此笔交易有太多的输入,无法处ç†ã€‚请è”系技术支æŒã€‚", + "too-many-outputs": "此笔交易有太多的输出,无法处ç†ï¼Œè¯·è”系技术支æŒã€‚" + }, + "security-warning": { + "title": "安全警告", + "text": "上次连接此硬件钱包时,å‘现一个或多个安全警告。我们建议你打开硬件钱包选项(点击钱包列表下的\"硬件钱包\"按钮)并ä¿æŒè®¾å¤‡å·²è¿žæŽ¥ï¼Œåœ¨ç»§ç»­ä¹‹å‰ï¼Œè§£å†³å®‰å…¨é—®é¢˜", + "check": "我明白其中的风险,并希望继续下去", + "continue": "继续", + "cancel": "å–消" + }, + "options": { + "connecting": "连接...", + "disconnected": "没有检测到硬件钱包。请连接硬件钱包åŽä½¿ç”¨æ­¤é€‰é¡¹ã€‚", + "unconfigured-detected-title": "未é…置的硬件钱包", + "unconfigured-detected": "检测到无ç§å­çš„硬件钱包。选择\"自动é…ç½®\"如果你想将其é…置为全新的钱包并立å³å¼€å§‹ä½¿ç”¨å®ƒï¼Œæˆ–选择\"æ¢å¤å¤‡ä»½\"如果你想使用先å‰åˆ›å»ºçš„备份ç§å­å¯¹å…¶è¿›è¡Œé…置,从而能够å†æ¬¡è®¿é—®ä½ çš„资产。", + "configured-detected": "检测到硬件钱包。该设备在钱包列表中被识别为:", + "security-warnings-title": "安全警告", + "security-warning-title": "安全警告", + "backup-warning": "你应该备份硬件钱包ç§å­ï¼Œå¦åˆ™ä¸‡ä¸€å‡ºçŽ°é—®é¢˜ï¼Œä½ å¯èƒ½å°†æ— æ³•è®¿é—®ä½ çš„资金,è¦åšåˆ°è¿™ä¸€ç‚¹ã€‚选择\"创建一个备份\"选项。", + "pin-warning": "当å‰è¿žæŽ¥çš„硬件钱包未设置密ç ã€‚密ç å¯ä¿æŠ¤ç¡¬ä»¶é’±åŒ…,以防丢失ã€ç›—窃和黑客入侵。è¦åˆ›å»ºä¸€ä¸ªå¯†ç ï¼Œé€‰æ‹©\"创建PINç \"选项。", + "options": "选项:", + "configure-automatically": "自动é…ç½®", + "restore-backup": "æ¢å¤å¤‡ä»½", + "create-backup": "创建备份", + "wipe": "删除设备", + "confirm-seed": "确认ç§å­", + "create-pin": "创建密ç ", + "change-pin": "更改密ç ", + "forgotten-pin1": "如果你因为忘记密ç è€Œæ— æ³•è¿›å…¥é’±åŒ…,你å¯ä»¥åˆ é™¤ç¡¬ä»¶é’±åŒ…,然åŽé€šè¿‡ç§å­", + "forgotten-pin2": "æ¢å¤" + }, + "generate-seed" : { + "text": "在继续之å‰ï¼Œä½ å¯ä»¥é€‰æ‹©ç”Ÿæˆç§å­çš„å•è¯æ•°ã€‚ç§å­æ˜¯ä¸€ä¸ªå•è¯åˆ—表,出现问题åŽå¯ä»¥ç”¨æ¥æ¢å¤è®¿é—®ä½ çš„å¸ã€‚所有选项都是安全的,如果你没有特殊原因必须选择æŸä¸€é¡¹ï¼Œä½ å¯ä»¥ä½¿ç”¨é»˜è®¤å€¼ã€‚", + "configuring": "é…ç½®..." + }, + "restore-seed" : { + "text": "在继续å‰ï¼Œè¯·é€‰æ‹©ä½ æƒ³è¦æ¢å¤ç§å­çš„å•è¯æ•°é‡ã€‚", + "check-text": "ä½ å¯ä»¥ä½¿ç”¨æ­¤é€‰é¡¹è¾“å…¥ç§å­ï¼Œå¹¶æ£€æŸ¥å®ƒæ˜¯å¦ä¸Žç¡¬ä»¶é’±åŒ…中的一致。在开始之å‰ï¼Œé€‰æ‹©ä½ æƒ³è¦æ£€æŸ¥çš„ç§å­çš„å•è¯æ•°ã€‚", + "warning" : "警告: 为了é¿å…å¯èƒ½å‡ºçŽ°çš„问题,请仅使用åŒä¸€å“牌/åž‹å·çš„硬件钱包创建ç§å­ã€‚", + "error-wrong-word": "错误: é‡æ–°é”®å…¥çš„å•è¯ä¸Žç¡¬ä»¶é’±åŒ…所请求的ä¸åŒ¹é…。", + "error-invalid-seed": "错误: ç§å­æ— æ•ˆã€‚请务必按正确的顺åºè¾“入正确的å•è¯ã€‚", + "error-wrong-seed": "错误: ç§å­æ˜¯æœ‰æ•ˆçš„,但与设备中的ç§å­ä¸åŒ¹é…。" + }, + "added": { + "title": "新硬件钱包", + "configuring": "检测到新的硬件钱包。é…ç½®...", + "done": "已完æˆ", + "added1": "已连接的硬件的钱包已ç»ç”¨å¦‚下å字被添加到钱包列表:", + "added2": "现在你å¯ä»¥æŸ¥çœ‹ç¡¬ä»¶é’±åŒ…中的余é¢å’Œåœ°å€äº†ï¼Œå³ä½¿ç¡¬ä»¶é’±åŒ…并未连接。此外如果你愿æ„,你还å¯ä»¥æ›´æ”¹é’±åŒ…å称或从将其从钱包列表删除。" + }, + "wipe": { + "warning": "警告: 硬件钱包中的所有数æ®å°†è¢«åˆ é™¤ã€‚如果没有备份,你将无法å†æ¬¡è®¿é—®ä½ çš„资金。", + "confirm-delete": "还是将其从钱包列表中删除" + }, + "create-backup": { + "warning": "警告: ä½ åªèƒ½ä½¿ç”¨æ­¤é€‰é¡¹å¤‡ä»½ä½ çš„硬件钱包ç§å­ä¸€æ¬¡ã€‚如果你决定继续,你将ä¸å¾—ä¸å†™ä¸‹ä¸€ç»„å•è¯(建议写在纸上,而ä¸æ˜¯ç”µè„‘上),这些å•è¯å°†å‡ºçŽ°åœ¨ç¡¬ä»¶é’±åŒ…çš„å±å¹•ä¸Šï¼Œå¹¶å°†å…¶å­˜å‚¨åœ¨ä¸€ä¸ªå®‰å…¨çš„地方。任何å¯ä»¥è®¿é—®å•è¯åˆ—表(\"ç§å­\")的人都å¯ä»¥è®¿é—®é’±åŒ…ä½™é¢ï¼Œå› æ­¤å»ºè®®è¯·æ ¼å¤–谨慎。", + "instructions": "写下出现在硬件钱包å±å¹•ä¸Šçš„å•è¯åˆ—表。一定è¦æŒ‰é¡ºåºå¹¶æŠŠæ¯ä¸ªå•è¯éƒ½å†™å¯¹ã€‚" + }, + "seed-word": { + "title": "输入字", + "info1": "输入设备中显示的字", + "info2": "你将被è¦æ±‚以éšæœºçš„顺åºè¾“入你备份的ç§å­ï¼ŒåŠ ä¸Šä¸€äº›é¢å¤–的字。", + "word": "è¦æ±‚çš„å­—", + "error-invalid-word": "输入字无效。", + "error-loading-words": "正在加载字列表。请ç¨ç­‰ã€‚" + }, + "change-pin" : { + "pin-mismatch":"无法执行æ“作。你输入的两个密ç ä¸åŒ¹é…" + }, + "enter-pin" : { + "title": "输入密ç ", + "title-change-current": "输入当å‰å¯†ç ", + "title-change-new": "输入新的密ç ", + "title-change-confirm": "确认新的密ç ", + "instructions": " 密ç å·²æ˜¾ç¤ºåœ¨ç¡¬ä»¶é’±åŒ…çš„å±å¹•ä¸Šã€‚", + "instructions-tx": "进入密ç ä»¥ç¡®è®¤å¹¶ç­¾ç½²äº¤æ˜“。", + "instructions-change": "请输入一个4到8个数字之间的难以被猜中的密ç ã€‚", + "help": "需è¦å¸®åŠ©ï¼Ÿ" + }, + "pin-help" : { + "title": "帮助", + "part1": "当需è¦è¾“入密ç æ‰èƒ½ç»§ç»­æ—¶ï¼Œç¡¬ä»¶é’±åŒ…å±å¹•ä¼šæ˜¾ç¤ºä¸€ä¸ªçŸ©é˜µï¼ŒçŸ©é˜µç”±9个éšæœºæŽ’列的å—组æˆ(æ¯æ¬¡é¡ºåºéƒ½ä¼šæ”¹å˜),你将被è¦æ±‚在软件钱包中输入密ç ï¼Œä½¿ç”¨ä¸€ä¸ªçŸ©é˜µï¼Œæ­¤çŸ©é˜µåŒ…å«9个按钮,åªæ˜¾ç¤ºç¬¦å·#。", + "part2": "è¦è¾“入密ç ï¼Œè¯·åœ¨ç¡¬ä»¶é’±åŒ…å±å¹•ä¸Šä»¥æ•°å­—矩阵查看密ç çš„ä½ç½®ï¼Œç„¶åŽç‚¹å‡»è½¯ä»¶é’±åŒ…中的相应按钮。例如,如果密ç ä¸º\"23\"且数字2ä½äºŽç¡¬ä»¶é’±åŒ…数字矩阵的左上角,数字3ä½äºŽç¡¬ä»¶é’±åŒ…数字矩阵的正中间,则按顺åºç‚¹å‡»è½¯ä»¶é’±åŒ…中的左上角和中间按钮。", + "part3": "如果你愿æ„,还å¯ä»¥ä½¿ç”¨é”®ç›˜ä¸Šçš„å°é”®ç›˜è¾“入密ç ã€‚但是,如之å‰ç¤ºä¾‹æ‰€ç¤ºï¼Œå¦‚果密ç æ˜¯\"23\",你ä¸èƒ½ç®€å•åœ°ç”¨å°é”®ç›˜é”®å…¥\"23\",而是必须选择点击硬件钱包å±å¹•ä¸Š2å’Œ3对应ä½ç½®çš„值。" + }, + "create-tx" : { + "title": "创建交易" + }, + "confirm-address" : { + "title": "确认地å€", + "instructions": "请在硬件钱包上确认,如果地å€ä¸º:", + "short-confirmation": "地å€å·²ç¡®è®¤", + "confirmation": "地å€å·²ç¡®è®¤ã€‚为了安全, 选择 \"确认地å€\" 选项å¯ä»¥åœ¨ç¡¬ä»¶é’±åŒ…上å†æ¬¡æ˜¾ç¤ºåœ°å€ï¼Œåœ¨èœå•ä¸­å¯ç‚¹å‡»åœ°å€ä½™é¢å³ä¾§çš„按钮显示。" + } + }, + + "time-from-now": { + "few-seconds": "几秒钟之å‰", + "minute": "一分钟之å‰", + "minutes": "{{time}} 分钟之å‰", + "hour": "一å°æ—¶ä¹‹å‰", + "hours": "{{time}} å°æ—¶ä¹‹å‰", + "day": "一天之å‰", + "days": "{{time}} 天之å‰" + }, + + "exchange": { + "you-send": "ä½ å‘é€", + "you-get": "你收到 (大约)", + "to-address": "到 {{coin}} 地å€", + "price": "交易汇率", + "time-15": "交易时间", + "exchange-button": "交易", + "min-amount": "最å°æ•°é¢:", + "max-amount": "最大数é¢:", + "agree-1": "我åŒæ„", + "agree-2": "使用æ¡æ¬¾", + "agree-3": "å’Œ", + "agree-4": "éšç§æ”¿ç­–", + "powered-by": "技术支æŒ", + "need-help": "需è¦å¸®åŠ©?", + "support-portal": "帮助入å£", + "history": "订å•åŽ†å²", + "order-not-found": "订å•æœªæ‰¾åˆ°", + "status": "状æ€", + "exchanging": "{{from}}交易{{to}}", + "select": "选择", + "offline": "交易暂时下线", + "problem-connecting": "未能连接到æœåŠ¡å™¨ã€‚请检查你的网络连接并ç¨åŽå†è¯•ã€‚", + "invalid-address": "无效地å€ã€‚", + "statuses": { + "user-waiting": "等待充值。请将{{amount}} {{from}}å‘é€åˆ°ä¸‹é¢æ˜¾ç¤ºçš„交易地å€", + "user-waiting-info": "系统正在等待你充值到交易地å€ã€‚交易将在系统检测到你的充值并在区å—链中确认åŽå¼€å§‹ã€‚如果你已ç»å……值,应该很快就会检测到。", + "market-waiting-confirmations": "等待链上交易确认", + "market-waiting-confirmations-info": "å·²ç»æ£€æµ‹åˆ°å……值,等待区å—链中被确认。", + "market-confirmed": "链上交易已接å—", + "market-confirmed-info": "链上交易已ç»åœ¨åŒºå—链上确认。准备马上执行兑æ¢ã€‚", + "market-exchanged": "完æˆ{{from}}到{{to}}çš„å…‘æ¢", + "market-exchanged-info": "å…‘æ¢å·²ç»å®Œæˆã€‚资金将很快å‘é€åˆ°ä½ çš„地å€ã€‚", + "market-withdraw-waiting": "正在å‘é€{{to}}到你的地å€", + "market-withdraw-waiting-info": "å‘é€{{to}}到你地å€çš„进程已å¯åŠ¨", + "complete": "交易已完æˆ!", + "complete-info": "资金已ç»æˆåŠŸå‘é€åˆ°ä½ çš„地å€ã€‚", + "error": "å‘生错误", + "error-info": "è¿è½¬è¿‡ç¨‹ä¸­å‡ºçŽ°é”™è¯¯ï¼Œä½ å¯ä»¥åœ¨ä¸‹é¢æ‰¾åˆ°æ›´å¤šä¿¡æ¯ã€‚如果你需è¦å¸®åŠ©ï¼Œè¯·ä¿å­˜ä¸‹é¢æ˜¾ç¤ºçš„所有数æ®å¹¶ä½¿ç”¨é¡µé¢å³ä¸‹è§’的帮助链接æ¥è”系技术支æŒã€‚" + }, + "history-window": { + "address": "地å€", + "date": "日期" + }, + "details": { + "exchange-addr": "交易地å€", + "exchange-addr-tag": "支付ID或交易必须用到的目标标签", + "tx-id": "交易ID", + "order-id": "订å•ID", + "initial-price": "åˆå§‹æ±‡çŽ‡", + "error-msg": "é”™è¯¯ä¿¡æ¯ ", + "details": "详情", + "start-date": "开始日期", + "back": "返回", + "back-alert": "æ“作正在执行。你真的想è¦è¿”回到表格å—?你å¯ä»¥é€šè¿‡ç‚¹å‡»\"订å•åŽ†å²\"å†æ¬¡çœ‹åˆ°æ‰§è¡Œè¿‡ç¨‹" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh_base.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh_base.json new file mode 100644 index 00000000..402d23ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh_base.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a hardware wallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Hardware Wallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the hardware wallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create" + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet" + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New hardware wallet", + "error-disconnected": "Unable to perform the operation. The hardware wallet is not connected.", + "simple-error": "Error, Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected hardware wallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is not correct.", + "confirm": "Please, confirm the operation in the hardware wallet.", + "confirm-and-more": "Please, confirm the operation in the hardware wallet and follow the instructions.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled." + }, + "errors": { + "too-many-inputs": "The transaction has too many inputs and can not be processed. Please contact technical support.", + "too-many-outputs": "The transaction has too many outputs and can not be processed. Please contact technical support." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected and solve the security problems before continuing.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No hardware wallet detected. Please connect a hardware wallet to use this option.", + "unconfigured-detected-title": "Unconfigured hardware wallet", + "unconfigured-detected": "A seedless hardware wallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it immediately, or select \"Restore backup\" if you want to configure it with a previously created seed backup and thus be able to access your funds again.", + "configured-detected": "Hardware wallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "backup-warning": "You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "forgotten-pin1": "If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking", + "forgotten-pin2": "here." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the hardware wallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device." + }, + "added" : { + "title": "New Hardware Wallet", + "configuring": "New hardware wallet detected. Configuring...", + "done": "Done", + "added1": "The connected hardware wallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish." + }, + "wipe" : { + "warning": "WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet balance, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word indicated in the device", + "info2": "You will be asked to enter the words of your backup seed in random order, plus a few additional words.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. Two PINs you have entered do not match." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the hardware wallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a hard-to-guess PIN of between 4 and 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet." + }, + "create-tx" : { + "title": "Create transaction" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the hardware wallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the hardware wallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/alert-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/alert-red.png new file mode 100644 index 00000000..17118ad3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/alert-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/big-error-icon.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/big-error-icon.png new file mode 100644 index 00000000..bcbda0c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/big-error-icon.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png new file mode 100644 index 00000000..d0404586 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/close-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/close-grey.png new file mode 100644 index 00000000..2f0ec3b6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/close-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-grey.png new file mode 100644 index 00000000..42ea9346 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-red.png new file mode 100644 index 00000000..62175e3d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-blue.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-blue.png new file mode 100644 index 00000000..de88a9af Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-blue.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-grey.png new file mode 100644 index 00000000..a5cf11e2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/header.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/header.png new file mode 100644 index 00000000..d73c2734 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/header.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/hw-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/hw-gold.png new file mode 100644 index 00000000..af36aa93 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/hw-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/en.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/en.png new file mode 100644 index 00000000..bb03eaaa Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/en.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/es.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/es.png new file mode 100644 index 00000000..4590656a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/es.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/ru.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/ru.png new file mode 100644 index 00000000..61c27f9c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/ru.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/zh.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/zh.png new file mode 100644 index 00000000..ba5615b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/zh.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/load-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/load-gold.png new file mode 100644 index 00000000..4d1cbf7f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/load-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-gold.png new file mode 100644 index 00000000..fc53863c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-grey.png new file mode 100644 index 00000000..3f835e7d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/logo-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/logo-white.png new file mode 100644 index 00000000..8b714cf3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/logo-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-grey.png new file mode 100644 index 00000000..b81e568e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-red.png new file mode 100644 index 00000000..6686a98c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/money-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/money-gold.png new file mode 100644 index 00000000..649fc3b1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/money-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/otc-background.jpg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/otc-background.jpg new file mode 100644 index 00000000..03a84019 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/otc-background.jpg differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-gold.png new file mode 100644 index 00000000..854692e1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-green.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-green.png new file mode 100644 index 00000000..ab020791 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-green.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-grey.png new file mode 100644 index 00000000..35dbfff5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/qr-code-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/qr-code-black.png new file mode 100644 index 00000000..f9a2fabe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/qr-code-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-black.png new file mode 100644 index 00000000..9f277422 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-blue.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-blue.png new file mode 100644 index 00000000..4226468c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-blue.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-gold.png new file mode 100644 index 00000000..59645e7d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-white.png new file mode 100644 index 00000000..16261a2f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/size-alert.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/size-alert.png new file mode 100644 index 00000000..49b639c0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/size-alert.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/transactions-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/transactions-black.png new file mode 100644 index 00000000..413f2235 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/transactions-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-gold.png new file mode 100644 index 00000000..3ecf4ae4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-grey.png new file mode 100644 index 00000000..61a31772 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/wallet-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/wallet-black.png new file mode 100644 index 00000000..cdb2ec80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/wallet-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/logo-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/logo-white.png new file mode 100644 index 00000000..cd615cf8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/logo-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js new file mode 100644 index 00000000..993e88f3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/favicon.ico b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/favicon.ico new file mode 100644 index 00000000..cc325fd3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/favicon.ico differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png new file mode 100644 index 00000000..d73c2734 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png new file mode 100644 index 00000000..be1002a4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/index.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/index.html new file mode 100644 index 00000000..6f468ee8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/index.html @@ -0,0 +1,25 @@ +Skycoin
\ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js new file mode 100644 index 00000000..e28bc7c1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js @@ -0,0 +1 @@ +!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var f,u,i,d=0,l=[];d12?n:n+12:"sanje"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"rati":n<12?"sokalli":n<16?"donparam":n<20?"sanje":"rati"}})}(e("PJh5"))},"+3/4":function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(t){n.call(this),this.scheduler=t}return Object(l.__extends)(t,n),t.create=function(n){return new t(n)},t.dispatch=function(n){n.subscriber.complete()},t.prototype._subscribe=function(n){var e=this.scheduler;if(e)return e.schedule(t.dispatch,0,{subscriber:n});n.complete()},t}(e("YaPU").a)},"+7/x":function(n,t,e){!function(n){"use strict";var t={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},e={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};n.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(n){return n+"\u0bb5\u0ba4\u0bc1"},preparse:function(n){return n.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(n,t,e){return n<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":n<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":n<10?" \u0b95\u0bbe\u0bb2\u0bc8":n<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":n<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":n<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(n,t){return 12===n&&(n=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===t?n<2?n:n+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===t||"\u0b95\u0bbe\u0bb2\u0bc8"===t?n:"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===t&&n>=10?n:n+12},week:{dow:0,doy:6}})}(e("PJh5"))},"+CnV":function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=function(n){var t,l=e("AMGY").a.Symbol;return"function"==typeof l?l.observable?t=l.observable:(t=l("observable"),l.observable=t):t="@@observable",t}()},"/4Bh":function(n,t,e){"use strict";t.a=function(n,t){return arguments.length>=2?function(e){return Object(o.a)(Object(l.a)(n,t),Object(r.a)(1),Object(i.a)(t))(e)}:function(t){return Object(o.a)(Object(l.a)(function(t,e,l){return n(t,e,l+1)}),Object(r.a)(1))(t)}};var l=e("E5SG"),r=e("T1Dh"),i=e("2ESx"),o=e("f9aG")},"/6P1":function(n,t,e){!function(n){"use strict";var t={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function e(n,t,e,l){return t?r(e)[0]:l?r(e)[1]:r(e)[2]}function l(n){return n%10==0||n>10&&n<20}function r(n){return t[n].split("_")}function i(n,t,i,o){var s=n+" ";return 1===n?s+e(0,t,i[0],o):t?s+(l(n)?r(i)[1]:r(i)[0]):o?s+r(i)[1]:s+(l(n)?r(i)[1]:r(i)[2])}n.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(n,t,e,l){return t?"kelios sekund\u0117s":l?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:i,m:e,mm:i,h:e,hh:i,d:e,dd:i,M:e,MM:i,y:e,yy:i},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(n){return n+"-oji"},week:{dow:1,doy:4}})}(e("PJh5"))},"/bsm":function(n,t,e){!function(n){"use strict";n.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(e("PJh5"))},"/iUD":function(n,t,e){"use strict";t.a=function(n){return"function"==typeof n}},"/mhn":function(n,t,e){!function(n){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},e={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};n.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(n){return n.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0930\u093e\u0924\u093f"===t?n<4?n:n+12:"\u092c\u093f\u0939\u093e\u0928"===t?n:"\u0926\u093f\u0909\u0901\u0938\u094b"===t?n>=10?n:n+12:"\u0938\u093e\u0901\u091d"===t?n+12:void 0},meridiem:function(n,t,e){return n<3?"\u0930\u093e\u0924\u093f":n<12?"\u092c\u093f\u0939\u093e\u0928":n<16?"\u0926\u093f\u0909\u0901\u0938\u094b":n<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(e("PJh5"))},"/nXB":function(n,t,e){"use strict";t.a=function(){for(var n=[],t=0;t1&&"number"==typeof n[n.length-1]&&(e=n.pop())):"number"==typeof a&&(e=n.pop()),null===s&&1===n.length&&n[0]instanceof l.a?n[0]:Object(o.a)(e)(new r.a(n,s))};var l=e("YaPU"),r=e("Veqx"),i=e("1Q68"),o=e("8D5t")},0:function(n,t,e){n.exports=e("x35b")},"0P3J":function(n,t,e){"use strict";t.a=function(){return function(n){return n.lift(new i(n))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n){this.connectable=n}return n.prototype.call=function(n,t){var e=this.connectable;e._refCount++;var l=new o(n,e),r=t.subscribe(l);return l.closed||(l.connection=e.connect()),r},n}(),o=function(n){function t(t,e){n.call(this,t),this.connectable=e}return Object(l.__extends)(t,n),t.prototype._unsubscribe=function(){var n=this.connectable;if(n){this.connectable=null;var t=n._refCount;if(t<=0)this.connection=null;else if(n._refCount=t-1,t>1)this.connection=null;else{var e=this.connection,l=n._connection;this.connection=null,!l||e&&l!==e||l.unsubscribe()}}else this.connection=null},t}(r.a)},"0X8Q":function(n,t,e){!function(n){"use strict";n.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(n){return/^ch$/i.test(n)},meridiem:function(n,t,e){return n<12?e?"sa":"SA":e?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n r\u1ed3i l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(n){return n},week:{dow:1,doy:4}})}(e("PJh5"))},"1Bqh":function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(t,e){n.call(this),this.subject=t,this.subscriber=e,this.closed=!1}return Object(l.__extends)(t,n),t.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var n=this.subject,t=n.observers;if(this.subject=null,t&&0!==t.length&&!n.isStopped&&!n.closed){var e=t.indexOf(this.subscriber);-1!==e&&t.splice(e,1)}}},t}(e("VwZZ").a)},"1Q68":function(n,t,e){"use strict";t.a=function(n){return n&&"function"==typeof n.schedule}},"2ESx":function(n,t,e){"use strict";t.a=function(n){return void 0===n&&(n=null),function(t){return t.lift(new i(n))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n){this.defaultValue=n}return n.prototype.call=function(n,t){return t.subscribe(new o(n,this.defaultValue))},n}(),o=function(n){function t(t,e){n.call(this,t),this.defaultValue=e,this.isEmpty=!0}return Object(l.__extends)(t,n),t.prototype._next=function(n){this.isEmpty=!1,this.destination.next(n)},t.prototype._complete=function(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()},t}(r.a)},"2pmY":function(n,t,e){!function(n){"use strict";var t={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},e={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};n.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(n){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(n)},meridiem:function(n,t,e){return n<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"\u062b\u0627\u0646\u06cc\u0647 d%",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(n){return n.replace(/[\u06f0-\u06f9]/g,function(n){return e[n]}).replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(e("PJh5"))},"2s1U":function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r=n+" ";switch(e){case"s":return t||l?"nekaj sekund":"nekaj sekundami";case"ss":return r+(1===n?t?"sekundo":"sekundi":2===n?t||l?"sekundi":"sekundah":n<5?t||l?"sekunde":"sekundah":"sekund");case"m":return t?"ena minuta":"eno minuto";case"mm":return r+(1===n?t?"minuta":"minuto":2===n?t||l?"minuti":"minutama":n<5?t||l?"minute":"minutami":t||l?"minut":"minutami");case"h":return t?"ena ura":"eno uro";case"hh":return r+(1===n?t?"ura":"uro":2===n?t||l?"uri":"urama":n<5?t||l?"ure":"urami":t||l?"ur":"urami");case"d":return t||l?"en dan":"enim dnem";case"dd":return r+(1===n?t||l?"dan":"dnem":2===n?t||l?"dni":"dnevoma":t||l?"dni":"dnevi");case"M":return t||l?"en mesec":"enim mesecem";case"MM":return r+(1===n?t||l?"mesec":"mesecem":2===n?t||l?"meseca":"mesecema":n<5?t||l?"mesece":"meseci":t||l?"mesecev":"meseci");case"y":return t||l?"eno leto":"enim letom";case"yy":return r+(1===n?t||l?"leto":"letom":2===n?t||l?"leti":"letoma":n<5?t||l?"leta":"leti":t||l?"let":"leti")}}n.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},"3CJN":function(n,t,e){!function(n){"use strict";n.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(n){return/^nm$/i.test(n)},meridiem:function(n,t,e){return n<12?e?"vm":"VM":e?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(1===n||8===n||n>=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},"3IRH":function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},"3K28":function(n,t,e){!function(n){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),e="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),l=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;n.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(1===n||8===n||n>=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},"3LKG":function(n,t,e){!function(n){"use strict";n.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(n){return n},week:{dow:1,doy:4}})}(e("PJh5"))},"3MVc":function(n,t,e){!function(n){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},e={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},l=function(n){return 0===n?0:1===n?1:2===n?2:n%100>=3&&n%100<=10?3:n%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},i=function(n){return function(t,e,i,o){var s=l(t),a=r[n][l(t)];return 2===s&&(a=a[e?0:1]),a.replace(/%d/i,t)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];n.defineLocale("ar",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(n){return"\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:i("s"),ss:i("s"),m:i("m"),mm:i("m"),h:i("h"),hh:i("h"),d:i("d"),dd:i("d"),M:i("M"),MM:i("M"),y:i("y"),yy:i("y")},preparse:function(n){return n.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(n){return e[n]}).replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(e("PJh5"))},"3a3m":function(n,t,e){"use strict";t.a=function(){return function(n){return Object(r.a)()(Object(l.a)(o)(n))}};var l=e("Jwyl"),r=e("0P3J"),i=e("g5jc");function o(){return new i.a}},"3hfc":function(n,t,e){!function(n){"use strict";function t(n,t,e){var l,r;return"m"===e?t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===e?t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":n+" "+(l=+n,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[e].split("_"),l%10==1&&l%100!=11?r[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?r[1]:r[2])}n.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:t,mm:t,h:t,hh:t,d:"\u0434\u0437\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(n){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(n)},meridiem:function(n,t,e){return n<4?"\u043d\u043e\u0447\u044b":n<12?"\u0440\u0430\u043d\u0456\u0446\u044b":n<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(n,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return n%10!=2&&n%10!=3||n%100==12||n%100==13?n+"-\u044b":n+"-\u0456";case"D":return n+"-\u0433\u0430";default:return n}},week:{dow:1,doy:7}})}(e("PJh5"))},"5Omq":function(n,t,e){!function(n){"use strict";n.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"5SNd":function(n,t,e){!function(n){"use strict";var t={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};n.defineLocale("tg",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u041f\u0430\u0433\u043e\u04b3 \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0448\u0430\u0431"===t?n<4?n:n+12:"\u0441\u0443\u0431\u04b3"===t?n:"\u0440\u04ef\u0437"===t?n>=11?n:n+12:"\u0431\u0435\u0433\u043e\u04b3"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0448\u0430\u0431":n<11?"\u0441\u0443\u0431\u04b3":n<16?"\u0440\u04ef\u0437":n<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(n){return n+(t[n]||t[n%10]||t[n>=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},"5X6E":function(n,t,e){"use strict";t.a=function(n,t){return function(e){return e.lift(new o(n,t))}};var l=e("TToO"),r=e("tZ2B"),i=e("PIsA"),o=function(){function n(n,t){this.project=n,this.resultSelector=t}return n.prototype.call=function(n,t){return t.subscribe(new s(n,this.project,this.resultSelector))},n}(),s=function(n){function t(t,e,l){n.call(this,t),this.project=e,this.resultSelector=l,this.index=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t,e=this.index++;try{t=this.project(n,e)}catch(n){return void this.destination.error(n)}this._innerSub(t,n,e)},t.prototype._innerSub=function(n,t,e){var l=this.innerSubscription;l&&l.unsubscribe(),this.add(this.innerSubscription=Object(i.a)(this,n,t,e))},t.prototype._complete=function(){var t=this.innerSubscription;t&&!t.closed||n.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.innerSubscription=null},t.prototype.notifyComplete=function(t){this.remove(t),this.innerSubscription=null,this.isStopped&&n.prototype._complete.call(this)},t.prototype.notifyNext=function(n,t,e,l,r){this.resultSelector?this._tryNotifyNext(n,t,e,l):this.destination.next(t)},t.prototype._tryNotifyNext=function(n,t,e,l){var r;try{r=this.resultSelector(n,t,e,l)}catch(n){return void this.destination.error(n)}this.destination.next(r)},t}(r.a)},"5j66":function(n,t,e){!function(n){"use strict";n.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysMin:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},week:{dow:1,doy:4}})}(e("PJh5"))},"5vPg":function(n,t,e){!function(n){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},e={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function l(n,t,e,l){var r="";if(t)switch(e){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":r="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":r="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":r="%d \u0924\u093e\u0938";break;case"d":r="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":r="%d \u0926\u093f\u0935\u0938";break;case"M":r="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":r="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u0947"}else switch(e){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":r="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":r="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":r="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":r="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":r="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":r="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":r="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return r.replace(/%d/i,n)}n.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:l,ss:l,m:l,mm:l,h:l,hh:l,d:l,dd:l,M:l,MM:l,y:l,yy:l},preparse:function(n){return n.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0930\u093e\u0924\u094d\u0930\u0940|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0930\u093e\u0924\u094d\u0930\u0940"===t?n<4?n:n+12:"\u0938\u0915\u093e\u0933\u0940"===t?n:"\u0926\u0941\u092a\u093e\u0930\u0940"===t?n>=10?n:n+12:"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0930\u093e\u0924\u094d\u0930\u0940":n<10?"\u0938\u0915\u093e\u0933\u0940":n<17?"\u0926\u0941\u092a\u093e\u0930\u0940":n<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(e("PJh5"))},"6cf8":function(n,t,e){!function(n){"use strict";var t={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};n.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u0435 \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(n){return n+(t[n]||t[n%10]||t[n>=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},"7LV+":function(n,t,e){!function(n){"use strict";var t="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_");function l(n){return n%10<5&&n%10>1&&~~(n/10)%10!=1}function r(n,t,e){var r=n+" ";switch(e){case"ss":return r+(l(n)?"sekundy":"sekund");case"m":return t?"minuta":"minut\u0119";case"mm":return r+(l(n)?"minuty":"minut");case"h":return t?"godzina":"godzin\u0119";case"hh":return r+(l(n)?"godziny":"godzin");case"MM":return r+(l(n)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return r+(l(n)?"lata":"lat")}}n.defineLocale("pl",{months:function(n,l){return n?""===l?"("+e[n.month()]+"|"+t[n.month()]+")":/D MMMM/.test(l)?e[n.month()]:t[n.month()]:t},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:r,m:r,mm:r,h:r,hh:r,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:r,y:"rok",yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"7MHZ":function(n,t,e){!function(n){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),l=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;n.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},"7OnE":function(n,t,e){!function(n){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},e={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};n.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(n){return"\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(n){return n.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(n){return e[n]}).replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(e("PJh5"))},"7Q8x":function(n,t,e){!function(n){"use strict";n.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(n,t,e){return n<11?"ekuseni":n<15?"emini":n<19?"entsambama":"ebusuku"},meridiemHour:function(n,t){return 12===n&&(n=0),"ekuseni"===t?n:"emini"===t?n>=11?n:n+12:"entsambama"===t||"ebusuku"===t?0===n?0:n+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(e("PJh5"))},"8D5t":function(n,t,e){"use strict";t.a=function(n){return void 0===n&&(n=Number.POSITIVE_INFINITY),Object(l.a)(r.a,null,n)};var l=e("Qnch"),r=e("lAP5")},"8v14":function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[n+" Tage",n+" Tagen"],M:["ein Monat","einem Monat"],MM:[n+" Monate",n+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[n+" Jahre",n+" Jahren"]};return t?r[e][0]:r[e][1]}n.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"9Ocp":function(n,t,e){"use strict";t.a=function(n){return function(t){return 0===n?new o.a:t.lift(new s(n))}};var l=e("TToO"),r=e("OVmG"),i=e("pU/0"),o=e("+3/4"),s=function(){function n(n){if(this.total=n,this.total<0)throw new i.a}return n.prototype.call=function(n,t){return t.subscribe(new a(n,this.total))},n}(),a=function(n){function t(t,e){n.call(this,t),this.total=e,this.count=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t=this.total,e=++this.count;e<=t&&(this.destination.next(n),e===t&&(this.destination.complete(),this.unsubscribe()))},t}(r.a)},ALEw:function(n,t,e){!function(n){"use strict";n.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},AMGY:function(n,t,e){"use strict";(function(n){e.d(t,"a",function(){return i});var l="undefined"!=typeof window&&window,r="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,i=l||"undefined"!=typeof n&&n||r}).call(t,e("DuR2"))},Ab7C:function(n,t,e){!function(n){"use strict";n.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u043e\u0441\u043b\u0435 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(n){var t=n%10,e=n%100;return 0===n?n+"-\u0435\u0432":0===e?n+"-\u0435\u043d":e>10&&e<20?n+"-\u0442\u0438":1===t?n+"-\u0432\u0438":2===t?n+"-\u0440\u0438":7===t||8===t?n+"-\u043c\u0438":n+"-\u0442\u0438"},week:{dow:1,doy:7}})}(e("PJh5"))},AoDM:function(n,t,e){!function(n){"use strict";n.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba"})}(e("PJh5"))},BEem:function(n,t,e){!function(n){"use strict";n.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(e("PJh5"))},BX3T:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=Array.isArray||function(n){return n&&"number"==typeof n.length}},BbgG:function(n,t,e){!function(n){"use strict";n.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?n:"\u4e2d\u5348"===t?n>=11?n:n+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?n+12:void 0},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u51cc\u6668":l<900?"\u65e9\u4e0a":l<1130?"\u4e0a\u5348":l<1230?"\u4e2d\u5348":l<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";case"M":return n+"\u6708";case"w":case"W":return n+"\u9031";default:return n}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(e("PJh5"))},Bp2f:function(n,t,e){!function(n){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),e="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),l=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;n.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(1===n||8===n||n>=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},C7av:function(n,t,e){!function(n){"use strict";n.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_m\xe5n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},CFqe:function(n,t,e){!function(n){"use strict";n.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(n,t){return n?"string"==typeof t&&/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[n.month()]:this._monthsNominativeEl[n.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(n,t,e){return n>11?e?"\u03bc\u03bc":"\u039c\u039c":e?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(n){return"\u03bc"===(n+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(n,t){var e,l=this._calendarEl[n],r=t&&t.hours();return((e=l)instanceof Function||"[object Function]"===Object.prototype.toString.call(e))&&(l=l.apply(t)),l.replace("{}",r%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(e("PJh5"))},DDro:function(n,t,e){"use strict";t.a=function(){return Object(l.a)(r,[])};var l=e("/4Bh");function r(n,t,e){return n.push(t),n}},DOkx:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[n+" Tage",n+" Tagen"],M:["ein Monat","einem Monat"],MM:[n+" Monate",n+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[n+" Jahre",n+" Jahren"]};return t?r[e][0]:r[e][1]}n.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},DSXN:function(n,t,e){!function(n){"use strict";n.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(e("PJh5"))},DuR2:function(n,t){var e;e=function(){return this}();try{e=e||Function("return this")()||(0,eval)("this")}catch(n){"object"==typeof window&&(e=window)}n.exports=e},E5SG:function(n,t,e){"use strict";t.a=function(n,t){var e=!1;return arguments.length>=2&&(e=!0),function(l){return l.lift(new i(n,t,e))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n,t,e){void 0===e&&(e=!1),this.accumulator=n,this.seed=t,this.hasSeed=e}return n.prototype.call=function(n,t){return t.subscribe(new o(n,this.accumulator,this.seed,this.hasSeed))},n}(),o=function(n){function t(t,e,l,r){n.call(this,t),this.accumulator=e,this._seed=l,this.hasSeed=r,this.index=0}return Object(l.__extends)(t,n),Object.defineProperty(t.prototype,"seed",{get:function(){return this._seed},set:function(n){this.hasSeed=!0,this._seed=n},enumerable:!0,configurable:!0}),t.prototype._next=function(n){if(this.hasSeed)return this._tryNext(n);this.seed=n,this.destination.next(n)},t.prototype._tryNext=function(n){var t,e=this.index++;try{t=this.accumulator(this.seed,n,e)}catch(n){this.destination.error(n)}this.seed=t,this.destination.next(t)},t}(r.a)},EKta:function(n,t,e){"use strict";t.byteLength=function(n){return 3*n.length/4-u(n)},t.toByteArray=function(n){var t,e,l,o,s,a=n.length;o=u(n),s=new i(3*a/4-o),e=o>0?a-4:a;var c=0;for(t=0;t>16&255,s[c++]=l>>8&255,s[c++]=255&l;return 2===o?(l=r[n.charCodeAt(t)]<<2|r[n.charCodeAt(t+1)]>>4,s[c++]=255&l):1===o&&(l=r[n.charCodeAt(t)]<<10|r[n.charCodeAt(t+1)]<<4|r[n.charCodeAt(t+2)]>>2,s[c++]=l>>8&255,s[c++]=255&l),s},t.fromByteArray=function(n){for(var t,e=n.length,r=e%3,i="",o=[],s=0,a=e-r;sa?a:s+16383));return 1===r?(i+=l[(t=n[e-1])>>2],i+=l[t<<4&63],i+="=="):2===r&&(i+=l[(t=(n[e-2]<<8)+n[e-1])>>10],i+=l[t>>4&63],i+=l[t<<2&63],i+="="),o.push(i),o.join("")};for(var l=[],r=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,a=o.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===n[t-2]?2:"="===n[t-1]?1:0}function c(n,t,e){for(var r,i=[],o=t;o>18&63]+l[r>>12&63]+l[r>>6&63]+l[63&r]);return i.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},ETHv:function(n,t,e){!function(n){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},e={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};n.defineLocale("hi",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(n){return n.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0930\u093e\u0924"===t?n<4?n:n+12:"\u0938\u0941\u092c\u0939"===t?n:"\u0926\u094b\u092a\u0939\u0930"===t?n>=10?n:n+12:"\u0936\u093e\u092e"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0930\u093e\u0924":n<10?"\u0938\u0941\u092c\u0939":n<17?"\u0926\u094b\u092a\u0939\u0930":n<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(e("PJh5"))},EuP9:function(n,t,e){"use strict";(function(n){var l=e("EKta"),r=e("ujcs"),i=e("sOR5");function o(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(n,t){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|n}function f(n,t){if(a.isBuffer(n))return n.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(n)||n instanceof ArrayBuffer))return n.byteLength;"string"!=typeof n&&(n=""+n);var e=n.length;if(0===e)return 0;for(var l=!1;;)switch(t){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return N(n).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return F(n).length;default:if(l)return N(n).length;t=(""+t).toLowerCase(),l=!0}}function _(n,t,e){var l=n[t];n[t]=n[e],n[e]=l}function m(n,t,e,l,r){if(0===n.length)return-1;if("string"==typeof e?(l=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=r?0:n.length-1),e<0&&(e=n.length+e),e>=n.length){if(r)return-1;e=n.length-1}else if(e<0){if(!r)return-1;e=0}if("string"==typeof t&&(t=a.from(t,l)),a.isBuffer(t))return 0===t.length?-1:g(n,t,e,l,r);if("number"==typeof t)return t&=255,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(n,t,e):Uint8Array.prototype.lastIndexOf.call(n,t,e):g(n,[t],e,l,r);throw new TypeError("val must be string, number or Buffer")}function g(n,t,e,l,r){var i,o=1,s=n.length,a=t.length;if(void 0!==l&&("ucs2"===(l=String(l).toLowerCase())||"ucs-2"===l||"utf16le"===l||"utf-16le"===l)){if(n.length<2||t.length<2)return-1;o=2,s/=2,a/=2,e/=2}function u(n,t){return 1===o?n[t]:n.readUInt16BE(t*o)}if(r){var c=-1;for(i=e;is&&(e=s-a),i=e;i>=0;i--){for(var d=!0,h=0;hr&&(l=r):l=r;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");l>i/2&&(l=i/2);for(var o=0;o>8,r.push(e%256),r.push(l);return r}(t,n.length-e),n,e,l)}function k(n,t,e){return l.fromByteArray(0===t&&e===n.length?n:n.slice(t,e))}function C(n,t,e){e=Math.min(n.length,e);for(var l=[],r=t;r239?4:u>223?3:u>191?2:1;if(r+d<=e)switch(d){case 1:u<128&&(c=u);break;case 2:128==(192&(i=n[r+1]))&&(a=(31&u)<<6|63&i)>127&&(c=a);break;case 3:o=n[r+2],128==(192&(i=n[r+1]))&&128==(192&o)&&(a=(15&u)<<12|(63&i)<<6|63&o)>2047&&(a<55296||a>57343)&&(c=a);break;case 4:o=n[r+2],s=n[r+3],128==(192&(i=n[r+1]))&&128==(192&o)&&128==(192&s)&&(a=(15&u)<<18|(63&i)<<12|(63&o)<<6|63&s)>65535&&a<1114112&&(c=a)}null===c?(c=65533,d=1):c>65535&&(l.push((c-=65536)>>>10&1023|55296),c=56320|1023&c),l.push(c),r+=d}return function(n){var t=n.length;if(t<=S)return String.fromCharCode.apply(String,n);for(var e="",l=0;lthis.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(t>>>=0))return"";for(n||(n="utf8");;)switch(n){case"hex":return L(this,t,e);case"utf8":case"utf-8":return C(this,t,e);case"ascii":return O(this,t,e);case"latin1":case"binary":return T(this,t,e);case"base64":return k(this,t,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,e);default:if(l)throw new TypeError("Unknown encoding: "+n);n=(n+"").toLowerCase(),l=!0}}).apply(this,arguments)},a.prototype.equals=function(n){if(!a.isBuffer(n))throw new TypeError("Argument must be a Buffer");return this===n||0===a.compare(this,n)},a.prototype.inspect=function(){var n="",e=t.INSPECT_MAX_BYTES;return this.length>0&&(n=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(n+=" ... ")),""},a.prototype.compare=function(n,t,e,l,r){if(!a.isBuffer(n))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===e&&(e=n?n.length:0),void 0===l&&(l=0),void 0===r&&(r=this.length),t<0||e>n.length||l<0||r>this.length)throw new RangeError("out of range index");if(l>=r&&t>=e)return 0;if(l>=r)return-1;if(t>=e)return 1;if(t>>>=0,e>>>=0,l>>>=0,r>>>=0,this===n)return 0;for(var i=r-l,o=e-t,s=Math.min(i,o),u=this.slice(l,r),c=n.slice(t,e),d=0;dr)&&(e=r),n.length>0&&(e<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");l||(l="utf8");for(var i=!1;;)switch(l){case"hex":return y(this,n,t,e);case"utf8":case"utf-8":return b(this,n,t,e);case"ascii":return v(this,n,t,e);case"latin1":case"binary":return w(this,n,t,e);case"base64":return x(this,n,t,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return M(this,n,t,e);default:if(i)throw new TypeError("Unknown encoding: "+l);l=(""+l).toLowerCase(),i=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var S=4096;function O(n,t,e){var l="";e=Math.min(n.length,e);for(var r=t;rr)&&(e=r);for(var i="",o=t;oe)throw new RangeError("Trying to access beyond buffer length")}function A(n,t,e,l,r,i){if(!a.isBuffer(n))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||tn.length)throw new RangeError("Index out of range")}function E(n,t,e,l){t<0&&(t=65535+t+1);for(var r=0,i=Math.min(n.length-e,2);r>>8*(l?r:1-r)}function Y(n,t,e,l){t<0&&(t=4294967295+t+1);for(var r=0,i=Math.min(n.length-e,4);r>>8*(l?r:3-r)&255}function j(n,t,e,l,r,i){if(e+l>n.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function I(n,t,e,l,i){return i||j(n,0,e,4),r.write(n,t,e,l,23,4),e+4}function R(n,t,e,l,i){return i||j(n,0,e,8),r.write(n,t,e,l,52,8),e+8}a.prototype.slice=function(n,t){var e,l=this.length;if(n=~~n,t=void 0===t?l:~~t,n<0?(n+=l)<0&&(n=0):n>l&&(n=l),t<0?(t+=l)<0&&(t=0):t>l&&(t=l),t0&&(r*=256);)l+=this[n+--t]*r;return l},a.prototype.readUInt8=function(n,t){return t||D(n,1,this.length),this[n]},a.prototype.readUInt16LE=function(n,t){return t||D(n,2,this.length),this[n]|this[n+1]<<8},a.prototype.readUInt16BE=function(n,t){return t||D(n,2,this.length),this[n]<<8|this[n+1]},a.prototype.readUInt32LE=function(n,t){return t||D(n,4,this.length),(this[n]|this[n+1]<<8|this[n+2]<<16)+16777216*this[n+3]},a.prototype.readUInt32BE=function(n,t){return t||D(n,4,this.length),16777216*this[n]+(this[n+1]<<16|this[n+2]<<8|this[n+3])},a.prototype.readIntLE=function(n,t,e){n|=0,t|=0,e||D(n,t,this.length);for(var l=this[n],r=1,i=0;++i=(r*=128)&&(l-=Math.pow(2,8*t)),l},a.prototype.readIntBE=function(n,t,e){n|=0,t|=0,e||D(n,t,this.length);for(var l=t,r=1,i=this[n+--l];l>0&&(r*=256);)i+=this[n+--l]*r;return i>=(r*=128)&&(i-=Math.pow(2,8*t)),i},a.prototype.readInt8=function(n,t){return t||D(n,1,this.length),128&this[n]?-1*(255-this[n]+1):this[n]},a.prototype.readInt16LE=function(n,t){t||D(n,2,this.length);var e=this[n]|this[n+1]<<8;return 32768&e?4294901760|e:e},a.prototype.readInt16BE=function(n,t){t||D(n,2,this.length);var e=this[n+1]|this[n]<<8;return 32768&e?4294901760|e:e},a.prototype.readInt32LE=function(n,t){return t||D(n,4,this.length),this[n]|this[n+1]<<8|this[n+2]<<16|this[n+3]<<24},a.prototype.readInt32BE=function(n,t){return t||D(n,4,this.length),this[n]<<24|this[n+1]<<16|this[n+2]<<8|this[n+3]},a.prototype.readFloatLE=function(n,t){return t||D(n,4,this.length),r.read(this,n,!0,23,4)},a.prototype.readFloatBE=function(n,t){return t||D(n,4,this.length),r.read(this,n,!1,23,4)},a.prototype.readDoubleLE=function(n,t){return t||D(n,8,this.length),r.read(this,n,!0,52,8)},a.prototype.readDoubleBE=function(n,t){return t||D(n,8,this.length),r.read(this,n,!1,52,8)},a.prototype.writeUIntLE=function(n,t,e,l){n=+n,t|=0,e|=0,l||A(this,n,t,e,Math.pow(2,8*e)-1,0);var r=1,i=0;for(this[t]=255&n;++i=0&&(i*=256);)this[t+r]=n/i&255;return t+e},a.prototype.writeUInt8=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,1,255,0),a.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),this[t]=255&n,t+1},a.prototype.writeUInt16LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=255&n,this[t+1]=n>>>8):E(this,n,t,!0),t+2},a.prototype.writeUInt16BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>8,this[t+1]=255&n):E(this,n,t,!1),t+2},a.prototype.writeUInt32LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t+3]=n>>>24,this[t+2]=n>>>16,this[t+1]=n>>>8,this[t]=255&n):Y(this,n,t,!0),t+4},a.prototype.writeUInt32BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>24,this[t+1]=n>>>16,this[t+2]=n>>>8,this[t+3]=255&n):Y(this,n,t,!1),t+4},a.prototype.writeIntLE=function(n,t,e,l){if(n=+n,t|=0,!l){var r=Math.pow(2,8*e-1);A(this,n,t,e,r-1,-r)}var i=0,o=1,s=0;for(this[t]=255&n;++i>0)-s&255;return t+e},a.prototype.writeIntBE=function(n,t,e,l){if(n=+n,t|=0,!l){var r=Math.pow(2,8*e-1);A(this,n,t,e,r-1,-r)}var i=e-1,o=1,s=0;for(this[t+i]=255&n;--i>=0&&(o*=256);)n<0&&0===s&&0!==this[t+i+1]&&(s=1),this[t+i]=(n/o>>0)-s&255;return t+e},a.prototype.writeInt8=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,1,127,-128),a.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),n<0&&(n=255+n+1),this[t]=255&n,t+1},a.prototype.writeInt16LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=255&n,this[t+1]=n>>>8):E(this,n,t,!0),t+2},a.prototype.writeInt16BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>8,this[t+1]=255&n):E(this,n,t,!1),t+2},a.prototype.writeInt32LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[t]=255&n,this[t+1]=n>>>8,this[t+2]=n>>>16,this[t+3]=n>>>24):Y(this,n,t,!0),t+4},a.prototype.writeInt32BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,2147483647,-2147483648),n<0&&(n=4294967295+n+1),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>24,this[t+1]=n>>>16,this[t+2]=n>>>8,this[t+3]=255&n):Y(this,n,t,!1),t+4},a.prototype.writeFloatLE=function(n,t,e){return I(this,n,t,!0,e)},a.prototype.writeFloatBE=function(n,t,e){return I(this,n,t,!1,e)},a.prototype.writeDoubleLE=function(n,t,e){return R(this,n,t,!0,e)},a.prototype.writeDoubleBE=function(n,t,e){return R(this,n,t,!1,e)},a.prototype.copy=function(n,t,e,l){if(e||(e=0),l||0===l||(l=this.length),t>=n.length&&(t=n.length),t||(t=0),l>0&&l=this.length)throw new RangeError("sourceStart out of bounds");if(l<0)throw new RangeError("sourceEnd out of bounds");l>this.length&&(l=this.length),n.length-t=0;--r)n[r+t]=this[r+e];else if(i<1e3||!a.TYPED_ARRAY_SUPPORT)for(r=0;r>>=0,e=void 0===e?this.length:e>>>0,n||(n=0),"number"==typeof n)for(i=t;i55295&&e<57344){if(!r){if(e>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(o+1===l){(t-=3)>-1&&i.push(239,191,189);continue}r=e;continue}if(e<56320){(t-=3)>-1&&i.push(239,191,189),r=e;continue}e=65536+(r-55296<<10|e-56320)}else r&&(t-=3)>-1&&i.push(239,191,189);if(r=null,e<128){if((t-=1)<0)break;i.push(e)}else if(e<2048){if((t-=2)<0)break;i.push(e>>6|192,63&e|128)}else if(e<65536){if((t-=3)<0)break;i.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return i}function F(n){return l.toByteArray(function(n){if((n=function(n){return n.trim?n.trim():n.replace(/^\s+|\s+$/g,"")}(n).replace(H,"")).length<2)return"";for(;n.length%4!=0;)n+="=";return n}(n))}function B(n,t,e,l){for(var r=0;r=t.length||r>=n.length);++r)t[r+e]=n[r];return r}}).call(t,e("DuR2"))},"F+2e":function(n,t,e){!function(n){"use strict";var t={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},e={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};n.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(n){return n.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},week:{dow:1,doy:4}})}(e("PJh5"))},FKXc:function(n,t,e){!function(n){"use strict";n.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(n){return(/^[0-9].+$/.test(n)?"tra":"in")+" "+n},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},FRPF:function(n,t,e){!function(n){"use strict";n.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(e("PJh5"))},FlzV:function(n,t,e){!function(n){"use strict";n.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},Fpqq:function(n,t,e){!function(n){"use strict";n.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"e":1===t?"a":2===t?"a":"e")},week:{dow:1,doy:4}})}(e("PJh5"))},Frex:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[n+" Tage",n+" Tagen"],M:["ein Monat","einem Monat"],MM:[n+" Monate",n+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[n+" Jahre",n+" Jahren"]};return t?r[e][0]:r[e][1]}n.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},FuaP:function(n,t,e){!function(n){"use strict";n.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(n){return 0===n.indexOf("un")?"n"+n:"en "+n},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},"G++c":function(n,t,e){!function(n){"use strict";n.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(n,t){return 12===n&&(n=0),"pagi"===t?n:"tengahari"===t?n>=11?n:n+12:"petang"===t||"malam"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"pagi":n<15?"tengahari":n<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(e("PJh5"))},GK6M:function(n,t,e){"use strict";t.a=function(n){return l=n,i};var l,r=e("fKB6");function i(){try{return l.apply(this,arguments)}catch(n){return r.a.e=n,r.a}}},GrS7:function(n,t,e){!function(n){"use strict";n.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(n){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(n)},meridiem:function(n){return n<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":n<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":n<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(n,t){switch(t){case"DDD":case"w":case"W":case"DDDo":return 1===n?n+"-\u056b\u0576":n+"-\u0580\u0564";default:return n}},week:{dow:1,doy:7}})}(e("PJh5"))},HdCx:function(n,t,e){"use strict";t.a=function(n,t){return function(e){if("function"!=typeof n)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return e.lift(new i(n,t))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n,t){this.project=n,this.thisArg=t}return n.prototype.call=function(n,t){return t.subscribe(new o(n,this.project,this.thisArg))},n}(),o=function(n){function t(t,e,l){n.call(this,t),this.project=e,this.count=0,this.thisArg=l||this}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t;try{t=this.project.call(this.thisArg,n,this.count++)}catch(n){return void this.destination.error(n)}this.destination.next(t)},t}(r.a)},INcR:function(n,t,e){!function(n){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");n.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsParseExact:!0,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(e("PJh5"))},Jnfr:function(n,t){function e(n){return Promise.resolve().then(function(){throw new Error("Cannot find module '"+n+"'.")})}e.keys=function(){return[]},e.resolve=e,n.exports=e,e.id="Jnfr"},JwiF:function(n,t,e){!function(n){"use strict";n.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(n,t){return 12===n&&(n=0),"enjing"===t?n:"siyang"===t?n>=11?n:n+12:"sonten"===t||"ndalu"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"enjing":n<15?"siyang":n<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(e("PJh5"))},Jwyl:function(n,t,e){"use strict";var l=e("TToO"),r=e("g5jc"),i=e("YaPU"),o=(e("OVmG"),e("VwZZ")),s=e("0P3J"),a=function(n){function t(t,e){n.call(this),this.source=t,this.subjectFactory=e,this._refCount=0,this._isComplete=!1}return Object(l.__extends)(t,n),t.prototype._subscribe=function(n){return this.getSubject().subscribe(n)},t.prototype.getSubject=function(){var n=this._subject;return n&&!n.isStopped||(this._subject=this.subjectFactory()),this._subject},t.prototype.connect=function(){var n=this._connection;return n||(this._isComplete=!1,(n=this._connection=new o.a).add(this.source.subscribe(new c(this.getSubject(),this))),n.closed?(this._connection=null,n=o.a.EMPTY):this._connection=n),n},t.prototype.refCount=function(){return Object(s.a)()(this)},t}(i.a).prototype,u={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:a._subscribe},_isComplete:{value:a._isComplete,writable:!0},getSubject:{value:a.getSubject},connect:{value:a.connect},refCount:{value:a.refCount}},c=function(n){function t(t,e){n.call(this,t),this.connectable=e}return Object(l.__extends)(t,n),t.prototype._error=function(t){this._unsubscribe(),n.prototype._error.call(this,t)},t.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),n.prototype._complete.call(this)},t.prototype._unsubscribe=function(){var n=this.connectable;if(n){this.connectable=null;var t=n._connection;n._refCount=0,n._subject=null,n._connection=null,t&&t.unsubscribe()}},t}(r.b);t.a=function(n,t){return function(e){var l;if(l="function"==typeof n?n:function(){return n},"function"==typeof t)return e.lift(new d(l,t));var r=Object.create(e,u);return r.source=e,r.subjectFactory=l,r}};var d=function(){function n(n,t){this.subjectFactory=n,this.selector=t}return n.prototype.call=function(n,t){var e=this.selector,l=this.subjectFactory(),r=e(l).subscribe(n);return r.add(t.subscribe(l)),r},n}()},LT9G:function(n,t,e){!function(n){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),l=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;n.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},Lgqo:function(n,t,e){!function(n){"use strict";n.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(n){return n+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(n){return"\u0db4.\u0dc0."===n||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===n},meridiem:function(n,t,e){return n>11?e?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":e?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(e("PJh5"))},N3vo:function(n,t,e){!function(n){"use strict";n.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(n){return n+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(n)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(n)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(e("PJh5"))},N4j0:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=function(n){return n&&"number"==typeof n.length}},Nd3h:function(n,t,e){!function(n){"use strict";n.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_a\u016dg_sep_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(n){return"p"===n.charAt(0).toLowerCase()},meridiem:function(n,t,e){return n>11?e?"p.t.m.":"P.T.M.":e?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(e("PJh5"))},Nlnz:function(n,t,e){!function(n){"use strict";n.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===t?n<4?n:n+12:"\u0c09\u0c26\u0c2f\u0c02"===t?n:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===t?n>=10?n:n+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":n<10?"\u0c09\u0c26\u0c2f\u0c02":n<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":n<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(e("PJh5"))},Nzt2:function(n,t,e){!function(n){"use strict";n.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(n){return 2===n?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":n+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(n){return 2===n?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":n+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(n){return 2===n?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":n+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(n){return 2===n?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":n%10==0&&10!==n?n+" \u05e9\u05e0\u05d4":n+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(n){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(n)},meridiem:function(n,t,e){return n<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":n<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":n<12?e?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":n<18?e?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(e("PJh5"))},ORgI:function(n,t,e){!function(n){"use strict";n.defineLocale("ja",{months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(n){return"\u5348\u5f8c"===n},meridiem:function(n,t,e){return n<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:"[\u6765\u9031]dddd LT",lastDay:"[\u6628\u65e5] LT",lastWeek:"[\u524d\u9031]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";default:return n}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(e("PJh5"))},OSsP:function(n,t,e){!function(n){"use strict";function t(n,t,e){return n+" "+function(n,t){return 2===t?function(n){var t={m:"v",b:"v",d:"z"};return void 0===t[n.charAt(0)]?n:t[n.charAt(0)]+n.substring(1)}(n):n}({mm:"munutenn",MM:"miz",dd:"devezh"}[e],n)}n.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:t,h:"un eur",hh:"%d eur",d:"un devezh",dd:t,M:"ur miz",MM:t,y:"ur bloaz",yy:function(n){switch(function n(t){return t>9?n(t%10):t}(n)){case 1:case 3:case 4:case 5:case 9:return n+" bloaz";default:return n+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(n){return n+(1===n?"a\xf1":"vet")},week:{dow:1,doy:4}})}(e("PJh5"))},OUMt:function(n,t,e){!function(n){"use strict";var t="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),e="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function l(n){return n>1&&n<5}function r(n,t,e,r){var i=n+" ";switch(e){case"s":return t||r?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return t||r?i+(l(n)?"sekundy":"sek\xfand"):i+"sekundami";case"m":return t?"min\xfata":r?"min\xfatu":"min\xfatou";case"mm":return t||r?i+(l(n)?"min\xfaty":"min\xfat"):i+"min\xfatami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(l(n)?"hodiny":"hod\xedn"):i+"hodinami";case"d":return t||r?"de\u0148":"d\u0148om";case"dd":return t||r?i+(l(n)?"dni":"dn\xed"):i+"d\u0148ami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?i+(l(n)?"mesiace":"mesiacov"):i+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?i+(l(n)?"roky":"rokov"):i+"rokmi"}}n.defineLocale("sk",{months:t,monthsShort:e,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},OVPi:function(n,t,e){!function(n){"use strict";n.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minutt",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0i",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},OVmG:function(n,t,e){"use strict";e.d(t,"a",function(){return a});var l=e("TToO"),r=e("/iUD"),i=e("VwZZ"),o=e("t7NR"),s=e("tLDX"),a=function(n){function t(e,l,r){switch(n.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=o.a;break;case 1:if(!e){this.destination=o.a;break}if("object"==typeof e){e instanceof t?(this.syncErrorThrowable=e.syncErrorThrowable,this.destination=e,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new u(this,e));break}default:this.syncErrorThrowable=!0,this.destination=new u(this,e,l,r)}}return Object(l.__extends)(t,n),t.prototype[s.a]=function(){return this},t.create=function(n,e,l){var r=new t(n,e,l);return r.syncErrorThrowable=!1,r},t.prototype.next=function(n){this.isStopped||this._next(n)},t.prototype.error=function(n){this.isStopped||(this.isStopped=!0,this._error(n))},t.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,n.prototype.unsubscribe.call(this))},t.prototype._next=function(n){this.destination.next(n)},t.prototype._error=function(n){this.destination.error(n),this.unsubscribe()},t.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},t.prototype._unsubscribeAndRecycle=function(){var n=this._parent,t=this._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=n,this._parents=t,this},t}(i.a),u=function(n){function t(t,e,l,i){var s;n.call(this),this._parentSubscriber=t;var a=this;Object(r.a)(e)?s=e:e&&(s=e.next,l=e.error,i=e.complete,e!==o.a&&(a=Object.create(e),Object(r.a)(a.unsubscribe)&&this.add(a.unsubscribe.bind(a)),a.unsubscribe=this.unsubscribe.bind(this))),this._context=a,this._next=s,this._error=l,this._complete=i}return Object(l.__extends)(t,n),t.prototype.next=function(n){if(!this.isStopped&&this._next){var t=this._parentSubscriber;t.syncErrorThrowable?this.__tryOrSetError(t,this._next,n)&&this.unsubscribe():this.__tryOrUnsub(this._next,n)}},t.prototype.error=function(n){if(!this.isStopped){var t=this._parentSubscriber;if(this._error)t.syncErrorThrowable?(this.__tryOrSetError(t,this._error,n),this.unsubscribe()):(this.__tryOrUnsub(this._error,n),this.unsubscribe());else{if(!t.syncErrorThrowable)throw this.unsubscribe(),n;t.syncErrorValue=n,t.syncErrorThrown=!0,this.unsubscribe()}}},t.prototype.complete=function(){var n=this;if(!this.isStopped){var t=this._parentSubscriber;if(this._complete){var e=function(){return n._complete.call(n._context)};t.syncErrorThrowable?(this.__tryOrSetError(t,e),this.unsubscribe()):(this.__tryOrUnsub(e),this.unsubscribe())}else this.unsubscribe()}},t.prototype.__tryOrUnsub=function(n,t){try{n.call(this._context,t)}catch(n){throw this.unsubscribe(),n}},t.prototype.__tryOrSetError=function(n,t,e){try{t.call(this._context,e)}catch(t){return n.syncErrorValue=t,n.syncErrorThrown=!0,!0}return!1},t.prototype._unsubscribe=function(){var n=this._parentSubscriber;this._context=null,this._parentSubscriber=null,n.unsubscribe()},t}(a)},PIsA:function(n,t,e){"use strict";var l=e("AMGY"),r=e("N4j0"),i=e("cQXm"),o=e("dgOU"),s=e("YaPU"),a=e("etqZ"),u=e("TToO"),c=function(n){function t(t,e,l){n.call(this),this.parent=t,this.outerValue=e,this.outerIndex=l,this.index=0}return Object(u.__extends)(t,n),t.prototype._next=function(n){this.parent.notifyNext(this.outerValue,n,this.outerIndex,this.index++,this)},t.prototype._error=function(n){this.parent.notifyError(n,this),this.unsubscribe()},t.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},t}(e("OVmG").a),d=e("+CnV");t.a=function(n,t,e,u){var h=new c(n,e,u);if(h.closed)return null;if(t instanceof s.a)return t._isScalar?(h.next(t.value),h.complete(),null):(h.syncErrorThrowable=!0,t.subscribe(h));if(Object(r.a)(t)){for(var p=0,f=t.length;p>>0,l=0;l0)for(e=0;e=0?e?"+":"":"-")+Math.pow(10,Math.max(0,t-l.length)).toString().substr(1)+l}var F=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,B=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,V={},W={};function z(n,t,e,l){var r=l;"string"==typeof l&&(r=function(){return this[l]()}),n&&(W[n]=r),t&&(W[t[0]]=function(){return N(r.apply(this,arguments),t[1],t[2])}),e&&(W[e]=function(){return this.localeData().ordinal(r.apply(this,arguments),n)})}function U(n,t){return n.isValid()?(t=G(t,n.localeData()),V[t]=V[t]||function(n){var t,e,l,r=n.match(F);for(t=0,e=r.length;t=0&&B.test(n);)n=n.replace(B,l),B.lastIndex=0,e-=1;return n}var q=/\d/,J=/\d\d/,Q=/\d{3}/,K=/\d{4}/,X=/[+-]?\d{6}/,Z=/\d\d?/,$=/\d\d\d\d?/,nn=/\d\d\d\d\d\d?/,tn=/\d{1,3}/,en=/\d{1,4}/,ln=/[+-]?\d{1,6}/,rn=/\d+/,on=/[+-]?\d+/,sn=/Z|[+-]\d\d:?\d\d/gi,an=/Z|[+-]\d\d(?::?\d\d)?/gi,un=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,cn={};function dn(n,t,e){cn[n]=P(t)?t:function(n,l){return n&&e?e:t}}function hn(n,t){return d(cn,n)?cn[n](t._strict,t._locale):new RegExp(pn(n.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(n,t,e,l,r){return t||e||l||r})))}function pn(n){return n.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var fn={};function _n(n,t){var e,l=t;for("string"==typeof n&&(n=[n]),a(t)&&(l=function(n,e){e[t]=M(n)}),e=0;e68?1900:2e3)};var Ln,Pn=Dn("FullYear",!0);function Dn(n,t){return function(e){return null!=e?(En(this,n,e),r.updateOffset(this,t),this):An(this,n)}}function An(n,t){return n.isValid()?n._d["get"+(n._isUTC?"UTC":"")+t]():NaN}function En(n,t,e){n.isValid()&&!isNaN(e)&&("FullYear"===t&&Tn(n.year())&&1===n.month()&&29===n.date()?n._d["set"+(n._isUTC?"UTC":"")+t](e,n.month(),Yn(e,n.month())):n._d["set"+(n._isUTC?"UTC":"")+t](e))}function Yn(n,t){if(isNaN(n)||isNaN(t))return NaN;var e=(t%12+12)%12;return n+=(t-e)/12,1===e?Tn(n)?29:28:31-e%7%2}Ln=Array.prototype.indexOf?Array.prototype.indexOf:function(n){var t;for(t=0;t=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(n),t}function zn(n,t,e){var l=7+t-e;return-(7+Wn(n,0,l).getUTCDay()-t)%7+l-1}function Un(n,t,e,l,r){var i,o,s=1+7*(t-1)+(7+e-l)%7+zn(n,l,r);return s<=0?o=On(i=n-1)+s:s>On(n)?(i=n+1,o=s-On(n)):(i=n,o=s),{year:i,dayOfYear:o}}function Gn(n,t,e){var l,r,i=zn(n.year(),t,e),o=Math.floor((n.dayOfYear()-i-1)/7)+1;return o<1?l=o+qn(r=n.year()-1,t,e):o>qn(n.year(),t,e)?(l=o-qn(n.year(),t,e),r=n.year()+1):(r=n.year(),l=o),{week:l,year:r}}function qn(n,t,e){var l=zn(n,t,e),r=zn(n+1,t,e);return(On(n)-l+r)/7}z("w",["ww",2],"wo","week"),z("W",["WW",2],"Wo","isoWeek"),Y("week","w"),Y("isoWeek","W"),H("week",5),H("isoWeek",5),dn("w",Z),dn("ww",Z,J),dn("W",Z),dn("WW",Z,J),mn(["w","ww","W","WW"],function(n,t,e,l){t[l.substr(0,1)]=M(n)}),z("d",0,"do","day"),z("dd",0,0,function(n){return this.localeData().weekdaysMin(this,n)}),z("ddd",0,0,function(n){return this.localeData().weekdaysShort(this,n)}),z("dddd",0,0,function(n){return this.localeData().weekdays(this,n)}),z("e",0,0,"weekday"),z("E",0,0,"isoWeekday"),Y("day","d"),Y("weekday","e"),Y("isoWeekday","E"),H("day",11),H("weekday",11),H("isoWeekday",11),dn("d",Z),dn("e",Z),dn("E",Z),dn("dd",function(n,t){return t.weekdaysMinRegex(n)}),dn("ddd",function(n,t){return t.weekdaysShortRegex(n)}),dn("dddd",function(n,t){return t.weekdaysRegex(n)}),mn(["dd","ddd","dddd"],function(n,t,e,l){var r=e._locale.weekdaysParse(n,l,e._strict);null!=r?t.d=r:f(e).invalidWeekday=n}),mn(["d","e","E"],function(n,t,e,l){t[l]=M(n)});var Jn="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Qn="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Kn="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Xn=un,Zn=un,$n=un;function nt(){function n(n,t){return t.length-n.length}var t,e,l,r,i,o=[],s=[],a=[],u=[];for(t=0;t<7;t++)e=p([2e3,1]).day(t),l=this.weekdaysMin(e,""),r=this.weekdaysShort(e,""),i=this.weekdays(e,""),o.push(l),s.push(r),a.push(i),u.push(l),u.push(r),u.push(i);for(o.sort(n),s.sort(n),a.sort(n),u.sort(n),t=0;t<7;t++)s[t]=pn(s[t]),a[t]=pn(a[t]),u[t]=pn(u[t]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function tt(){return this.hours()%12||12}function et(n,t){z(n,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function lt(n,t){return t._meridiemParse}z("H",["HH",2],0,"hour"),z("h",["hh",2],0,tt),z("k",["kk",2],0,function(){return this.hours()||24}),z("hmm",0,0,function(){return""+tt.apply(this)+N(this.minutes(),2)}),z("hmmss",0,0,function(){return""+tt.apply(this)+N(this.minutes(),2)+N(this.seconds(),2)}),z("Hmm",0,0,function(){return""+this.hours()+N(this.minutes(),2)}),z("Hmmss",0,0,function(){return""+this.hours()+N(this.minutes(),2)+N(this.seconds(),2)}),et("a",!0),et("A",!1),Y("hour","h"),H("hour",13),dn("a",lt),dn("A",lt),dn("H",Z),dn("h",Z),dn("k",Z),dn("HH",Z,J),dn("hh",Z,J),dn("kk",Z,J),dn("hmm",$),dn("hmmss",nn),dn("Hmm",$),dn("Hmmss",nn),_n(["H","HH"],wn),_n(["k","kk"],function(n,t,e){var l=M(n);t[wn]=24===l?0:l}),_n(["a","A"],function(n,t,e){e._isPm=e._locale.isPM(n),e._meridiem=n}),_n(["h","hh"],function(n,t,e){t[wn]=M(n),f(e).bigHour=!0}),_n("hmm",function(n,t,e){var l=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l)),f(e).bigHour=!0}),_n("hmmss",function(n,t,e){var l=n.length-4,r=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l,2)),t[Mn]=M(n.substr(r)),f(e).bigHour=!0}),_n("Hmm",function(n,t,e){var l=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l))}),_n("Hmmss",function(n,t,e){var l=n.length-4,r=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l,2)),t[Mn]=M(n.substr(r))});var rt,it=Dn("Hours",!0),ot={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:In,monthsShort:Rn,week:{dow:0,doy:6},weekdays:Jn,weekdaysMin:Kn,weekdaysShort:Qn,meridiemParse:/[ap]\.?m?\.?/i},st={},at={};function ut(n){return n?n.toLowerCase().replace("_","-"):n}function ct(t){var l=null;if(!st[t]&&"undefined"!=typeof n&&n&&n.exports)try{l=rt._abbr,e("uslO")("./"+t),dt(l)}catch(n){}return st[t]}function dt(n,t){var e;return n&&((e=s(t)?pt(n):ht(n,t))?rt=e:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+n+" not found. Did you forget to load it?")),rt._abbr}function ht(n,t){if(null!==t){var e,l=ot;if(t.abbr=n,null!=st[n])L("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),l=st[n]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])l=st[t.parentLocale]._config;else{if(null==(e=ct(t.parentLocale)))return at[t.parentLocale]||(at[t.parentLocale]=[]),at[t.parentLocale].push({name:n,config:t}),null;l=e._config}return st[n]=new A(D(l,t)),at[n]&&at[n].forEach(function(n){ht(n.name,n.config)}),dt(n),st[n]}return delete st[n],null}function pt(n){var t;if(n&&n._locale&&n._locale._abbr&&(n=n._locale._abbr),!n)return rt;if(!i(n)){if(t=ct(n))return t;n=[n]}return function(n){for(var t,e,l,r,i=0;i0;){if(l=ct(r.slice(0,t).join("-")))return l;if(e&&e.length>=t&&k(r,e,!0)>=t-1)break;t--}i++}return rt}(n)}function ft(n){var t,e=n._a;return e&&-2===f(n).overflow&&(t=e[bn]<0||e[bn]>11?bn:e[vn]<1||e[vn]>Yn(e[yn],e[bn])?vn:e[wn]<0||e[wn]>24||24===e[wn]&&(0!==e[xn]||0!==e[Mn]||0!==e[kn])?wn:e[xn]<0||e[xn]>59?xn:e[Mn]<0||e[Mn]>59?Mn:e[kn]<0||e[kn]>999?kn:-1,f(n)._overflowDayOfYear&&(tvn)&&(t=vn),f(n)._overflowWeeks&&-1===t&&(t=Cn),f(n)._overflowWeekday&&-1===t&&(t=Sn),f(n).overflow=t),n}function _t(n,t,e){return null!=n?n:null!=t?t:e}function mt(n){var t,e,l,i,o,s=[];if(!n._d){for(l=function(n){var t=new Date(r.now());return n._useUTC?[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()]:[t.getFullYear(),t.getMonth(),t.getDate()]}(n),n._w&&null==n._a[vn]&&null==n._a[bn]&&function(n){var t,e,l,r,i,o,s,a;if(null!=(t=n._w).GG||null!=t.W||null!=t.E)i=1,o=4,e=_t(t.GG,n._a[yn],Gn(Pt(),1,4).year),l=_t(t.W,1),((r=_t(t.E,1))<1||r>7)&&(a=!0);else{i=n._locale._week.dow,o=n._locale._week.doy;var u=Gn(Pt(),i,o);e=_t(t.gg,n._a[yn],u.year),l=_t(t.w,u.week),null!=t.d?((r=t.d)<0||r>6)&&(a=!0):null!=t.e?(r=t.e+i,(t.e<0||t.e>6)&&(a=!0)):r=i}l<1||l>qn(e,i,o)?f(n)._overflowWeeks=!0:null!=a?f(n)._overflowWeekday=!0:(s=Un(e,l,r,i,o),n._a[yn]=s.year,n._dayOfYear=s.dayOfYear)}(n),null!=n._dayOfYear&&(o=_t(n._a[yn],l[yn]),(n._dayOfYear>On(o)||0===n._dayOfYear)&&(f(n)._overflowDayOfYear=!0),e=Wn(o,0,n._dayOfYear),n._a[bn]=e.getUTCMonth(),n._a[vn]=e.getUTCDate()),t=0;t<3&&null==n._a[t];++t)n._a[t]=s[t]=l[t];for(;t<7;t++)n._a[t]=s[t]=null==n._a[t]?2===t?1:0:n._a[t];24===n._a[wn]&&0===n._a[xn]&&0===n._a[Mn]&&0===n._a[kn]&&(n._nextDay=!0,n._a[wn]=0),n._d=(n._useUTC?Wn:function(n,t,e,l,r,i,o){var s=new Date(n,t,e,l,r,i,o);return n<100&&n>=0&&isFinite(s.getFullYear())&&s.setFullYear(n),s}).apply(null,s),i=n._useUTC?n._d.getUTCDay():n._d.getDay(),null!=n._tzm&&n._d.setUTCMinutes(n._d.getUTCMinutes()-n._tzm),n._nextDay&&(n._a[wn]=24),n._w&&"undefined"!=typeof n._w.d&&n._w.d!==i&&(f(n).weekdayMismatch=!0)}}var gt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,yt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,bt=/Z|[+-]\d\d(?::?\d\d)?/,vt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],wt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],xt=/^\/?Date\((\-?\d+)/i;function Mt(n){var t,e,l,r,i,o,s=n._i,a=gt.exec(s)||yt.exec(s);if(a){for(f(n).iso=!0,t=0,e=vt.length;t0&&f(n).unusedInput.push(o),s=s.slice(s.indexOf(e)+e.length),u+=e.length),W[i]?(e?f(n).empty=!1:f(n).unusedTokens.push(i),gn(i,e,n)):n._strict&&!e&&f(n).unusedTokens.push(i);f(n).charsLeftOver=a-u,s.length>0&&f(n).unusedInput.push(s),n._a[wn]<=12&&!0===f(n).bigHour&&n._a[wn]>0&&(f(n).bigHour=void 0),f(n).parsedDateParts=n._a.slice(0),f(n).meridiem=n._meridiem,n._a[wn]=(c=n._locale,d=n._a[wn],null==(h=n._meridiem)?d:null!=c.meridiemHour?c.meridiemHour(d,h):null!=c.isPM?((p=c.isPM(h))&&d<12&&(d+=12),p||12!==d||(d=0),d):d),mt(n),ft(n)}else St(n);else Mt(n);var c,d,h,p}function Tt(n){var t=n._i,e=n._f;return n._locale=n._locale||pt(n._l),null===t||void 0===e&&""===t?m({nullInput:!0}):("string"==typeof t&&(n._i=t=n._locale.preparse(t)),w(t)?new v(ft(t)):(u(t)?n._d=t:i(e)?function(n){var t,e,l,r,i;if(0===n._f.length)return f(n).invalidFormat=!0,void(n._d=new Date(NaN));for(r=0;rthis?this:n:m()});function Et(n,t){var e,l;if(1===t.length&&i(t[0])&&(t=t[0]),!t.length)return Pt();for(e=t[0],l=1;l(i=qn(n,l,r))&&(t=i),(function(n,t,e,l,r){var i=Un(n,t,e,l,r),o=Wn(i.year,0,i.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}).call(this,n,t,e,l,r))}z(0,["gg",2],0,function(){return this.weekYear()%100}),z(0,["GG",2],0,function(){return this.isoWeekYear()%100}),le("gggg","weekYear"),le("ggggg","weekYear"),le("GGGG","isoWeekYear"),le("GGGGG","isoWeekYear"),Y("weekYear","gg"),Y("isoWeekYear","GG"),H("weekYear",1),H("isoWeekYear",1),dn("G",on),dn("g",on),dn("GG",Z,J),dn("gg",Z,J),dn("GGGG",en,K),dn("gggg",en,K),dn("GGGGG",ln,X),dn("ggggg",ln,X),mn(["gggg","ggggg","GGGG","GGGGG"],function(n,t,e,l){t[l.substr(0,2)]=M(n)}),mn(["gg","GG"],function(n,t,e,l){t[l]=r.parseTwoDigitYear(n)}),z("Q",0,"Qo","quarter"),Y("quarter","Q"),H("quarter",7),dn("Q",q),_n("Q",function(n,t){t[bn]=3*(M(n)-1)}),z("D",["DD",2],"Do","date"),Y("date","D"),H("date",9),dn("D",Z),dn("DD",Z,J),dn("Do",function(n,t){return n?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),_n(["D","DD"],vn),_n("Do",function(n,t){t[vn]=M(n.match(Z)[0])});var ie=Dn("Date",!0);z("DDD",["DDDD",3],"DDDo","dayOfYear"),Y("dayOfYear","DDD"),H("dayOfYear",4),dn("DDD",tn),dn("DDDD",Q),_n(["DDD","DDDD"],function(n,t,e){e._dayOfYear=M(n)}),z("m",["mm",2],0,"minute"),Y("minute","m"),H("minute",14),dn("m",Z),dn("mm",Z,J),_n(["m","mm"],xn);var oe=Dn("Minutes",!1);z("s",["ss",2],0,"second"),Y("second","s"),H("second",15),dn("s",Z),dn("ss",Z,J),_n(["s","ss"],Mn);var se,ae=Dn("Seconds",!1);for(z("S",0,0,function(){return~~(this.millisecond()/100)}),z(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),z(0,["SSS",3],0,"millisecond"),z(0,["SSSS",4],0,function(){return 10*this.millisecond()}),z(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),z(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),z(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),z(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),z(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),Y("millisecond","ms"),H("millisecond",16),dn("S",tn,q),dn("SS",tn,J),dn("SSS",tn,Q),se="SSSS";se.length<=9;se+="S")dn(se,rn);function ue(n,t){t[kn]=M(1e3*("0."+n))}for(se="S";se.length<=9;se+="S")_n(se,ue);var ce=Dn("Milliseconds",!1);z("z",0,0,"zoneAbbr"),z("zz",0,0,"zoneName");var de=v.prototype;function he(n){return n}de.add=Xt,de.calendar=function(n,t){var e=n||Pt(),l=Bt(e,this).startOf("day"),i=r.calendarFormat(this,l)||"sameElse",o=t&&(P(t[i])?t[i].call(this,e):t[i]);return this.format(o||this.localeData().calendar(i,this,Pt(e)))},de.clone=function(){return new v(this)},de.diff=function(n,t,e){var l,r,i;if(!this.isValid())return NaN;if(!(l=Bt(n,this)).isValid())return NaN;switch(r=6e4*(l.utcOffset()-this.utcOffset()),t=j(t)){case"year":i=$t(this,l)/12;break;case"month":i=$t(this,l);break;case"quarter":i=$t(this,l)/3;break;case"second":i=(this-l)/1e3;break;case"minute":i=(this-l)/6e4;break;case"hour":i=(this-l)/36e5;break;case"day":i=(this-l-r)/864e5;break;case"week":i=(this-l-r)/6048e5;break;default:i=this-l}return e?i:x(i)},de.endOf=function(n){return void 0===(n=j(n))||"millisecond"===n?this:("date"===n&&(n="day"),this.startOf(n).add(1,"isoWeek"===n?"week":n).subtract(1,"ms"))},de.format=function(n){n||(n=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var t=U(this,n);return this.localeData().postformat(t)},de.from=function(n,t){return this.isValid()&&(w(n)&&n.isValid()||Pt(n).isValid())?Gt({to:this,from:n}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},de.fromNow=function(n){return this.from(Pt(),n)},de.to=function(n,t){return this.isValid()&&(w(n)&&n.isValid()||Pt(n).isValid())?Gt({from:this,to:n}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},de.toNow=function(n){return this.to(Pt(),n)},de.get=function(n){return P(this[n=j(n)])?this[n]():this},de.invalidAt=function(){return f(this).overflow},de.isAfter=function(n,t){var e=w(n)?n:Pt(n);return!(!this.isValid()||!e.isValid())&&("millisecond"===(t=j(s(t)?"millisecond":t))?this.valueOf()>e.valueOf():e.valueOf()9999?U(e,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):P(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(e,"Z")):U(e,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},de.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var n="moment",t="";this.isLocal()||(n=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var e="["+n+'("]',l=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";return this.format(e+l+"-MM-DD[T]HH:mm:ss.SSS"+t+'[")]')},de.toJSON=function(){return this.isValid()?this.toISOString():null},de.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},de.unix=function(){return Math.floor(this.valueOf()/1e3)},de.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},de.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},de.year=Pn,de.isLeapYear=function(){return Tn(this.year())},de.weekYear=function(n){return re.call(this,n,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},de.isoWeekYear=function(n){return re.call(this,n,this.isoWeek(),this.isoWeekday(),1,4)},de.quarter=de.quarters=function(n){return null==n?Math.ceil((this.month()+1)/3):this.month(3*(n-1)+this.month()%3)},de.month=Nn,de.daysInMonth=function(){return Yn(this.year(),this.month())},de.week=de.weeks=function(n){var t=this.localeData().week(this);return null==n?t:this.add(7*(n-t),"d")},de.isoWeek=de.isoWeeks=function(n){var t=Gn(this,1,4).week;return null==n?t:this.add(7*(n-t),"d")},de.weeksInYear=function(){var n=this.localeData()._week;return qn(this.year(),n.dow,n.doy)},de.isoWeeksInYear=function(){return qn(this.year(),1,4)},de.date=ie,de.day=de.days=function(n){if(!this.isValid())return null!=n?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=n?(n=function(n,t){return"string"!=typeof n?n:isNaN(n)?"number"==typeof(n=t.weekdaysParse(n))?n:null:parseInt(n,10)}(n,this.localeData()),this.add(n-t,"d")):t},de.weekday=function(n){if(!this.isValid())return null!=n?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==n?t:this.add(n-t,"d")},de.isoWeekday=function(n){if(!this.isValid())return null!=n?this:NaN;if(null!=n){var t=function(n,t){return"string"==typeof n?t.weekdaysParse(n)%7||7:isNaN(n)?null:n}(n,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7},de.dayOfYear=function(n){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==n?t:this.add(n-t,"d")},de.hour=de.hours=it,de.minute=de.minutes=oe,de.second=de.seconds=ae,de.millisecond=de.milliseconds=ce,de.utcOffset=function(n,t,e){var l,i=this._offset||0;if(!this.isValid())return null!=n?this:NaN;if(null!=n){if("string"==typeof n){if(null===(n=Ft(an,n)))return this}else Math.abs(n)<16&&!e&&(n*=60);return!this._isUTC&&t&&(l=Vt(this)),this._offset=n,this._isUTC=!0,null!=l&&this.add(l,"m"),i!==n&&(!t||this._changeInProgress?Kt(this,Gt(n-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,r.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?i:Vt(this)},de.utc=function(n){return this.utcOffset(0,n)},de.local=function(n){return this._isUTC&&(this.utcOffset(0,n),this._isUTC=!1,n&&this.subtract(Vt(this),"m")),this},de.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var n=Ft(sn,this._i);null!=n?this.utcOffset(n):this.utcOffset(0,!0)}return this},de.hasAlignedHourOffset=function(n){return!!this.isValid()&&(n=n?Pt(n).utcOffset():0,(this.utcOffset()-n)%60==0)},de.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},de.isLocal=function(){return!!this.isValid()&&!this._isUTC},de.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},de.isUtc=Wt,de.isUTC=Wt,de.zoneAbbr=function(){return this._isUTC?"UTC":""},de.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},de.dates=S("dates accessor is deprecated. Use date instead.",ie),de.months=S("months accessor is deprecated. Use month instead",Nn),de.years=S("years accessor is deprecated. Use year instead",Pn),de.zone=S("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(n,t){return null!=n?("string"!=typeof n&&(n=-n),this.utcOffset(n,t),this):-this.utcOffset()}),de.isDSTShifted=S("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var n={};if(y(n,this),(n=Tt(n))._a){var t=n._isUTC?p(n._a):Pt(n._a);this._isDSTShifted=this.isValid()&&k(n._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var pe=A.prototype;function fe(n,t,e,l){var r=pt(),i=p().set(l,t);return r[e](i,n)}function _e(n,t,e){if(a(n)&&(t=n,n=void 0),n=n||"",null!=t)return fe(n,t,e,"month");var l,r=[];for(l=0;l<12;l++)r[l]=fe(n,l,e,"month");return r}function me(n,t,e,l){"boolean"==typeof n?(a(t)&&(e=t,t=void 0),t=t||""):(e=t=n,n=!1,a(t)&&(e=t,t=void 0),t=t||"");var r,i=pt(),o=n?i._week.dow:0;if(null!=e)return fe(t,(e+o)%7,l,"day");var s=[];for(r=0;r<7;r++)s[r]=fe(t,(r+o)%7,l,"day");return s}pe.calendar=function(n,t,e){var l=this._calendar[n]||this._calendar.sameElse;return P(l)?l.call(t,e):l},pe.longDateFormat=function(n){var t=this._longDateFormat[n],e=this._longDateFormat[n.toUpperCase()];return t||!e?t:(this._longDateFormat[n]=e.replace(/MMMM|MM|DD|dddd/g,function(n){return n.slice(1)}),this._longDateFormat[n])},pe.invalidDate=function(){return this._invalidDate},pe.ordinal=function(n){return this._ordinal.replace("%d",n)},pe.preparse=he,pe.postformat=he,pe.relativeTime=function(n,t,e,l){var r=this._relativeTime[e];return P(r)?r(n,t,e,l):r.replace(/%d/i,n)},pe.pastFuture=function(n,t){var e=this._relativeTime[n>0?"future":"past"];return P(e)?e(t):e.replace(/%s/i,t)},pe.set=function(n){var t,e;for(e in n)P(t=n[e])?this[e]=t:this["_"+e]=t;this._config=n,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},pe.months=function(n,t){return n?i(this._months)?this._months[n.month()]:this._months[(this._months.isFormat||jn).test(t)?"format":"standalone"][n.month()]:i(this._months)?this._months:this._months.standalone},pe.monthsShort=function(n,t){return n?i(this._monthsShort)?this._monthsShort[n.month()]:this._monthsShort[jn.test(t)?"format":"standalone"][n.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},pe.monthsParse=function(n,t,e){var l,r,i;if(this._monthsParseExact)return(function(n,t,e){var l,r,i,o=n.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],l=0;l<12;++l)i=p([2e3,l]),this._shortMonthsParse[l]=this.monthsShort(i,"").toLocaleLowerCase(),this._longMonthsParse[l]=this.months(i,"").toLocaleLowerCase();return e?"MMM"===t?-1!==(r=Ln.call(this._shortMonthsParse,o))?r:null:-1!==(r=Ln.call(this._longMonthsParse,o))?r:null:"MMM"===t?-1!==(r=Ln.call(this._shortMonthsParse,o))?r:-1!==(r=Ln.call(this._longMonthsParse,o))?r:null:-1!==(r=Ln.call(this._longMonthsParse,o))?r:-1!==(r=Ln.call(this._shortMonthsParse,o))?r:null}).call(this,n,t,e);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),l=0;l<12;l++){if(r=p([2e3,l]),e&&!this._longMonthsParse[l]&&(this._longMonthsParse[l]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i"),this._shortMonthsParse[l]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")),e||this._monthsParse[l]||(i="^"+this.months(r,"")+"|^"+this.monthsShort(r,""),this._monthsParse[l]=new RegExp(i.replace(".",""),"i")),e&&"MMMM"===t&&this._longMonthsParse[l].test(n))return l;if(e&&"MMM"===t&&this._shortMonthsParse[l].test(n))return l;if(!e&&this._monthsParse[l].test(n))return l}},pe.monthsRegex=function(n){return this._monthsParseExact?(d(this,"_monthsRegex")||Vn.call(this),n?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Bn),this._monthsStrictRegex&&n?this._monthsStrictRegex:this._monthsRegex)},pe.monthsShortRegex=function(n){return this._monthsParseExact?(d(this,"_monthsRegex")||Vn.call(this),n?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Fn),this._monthsShortStrictRegex&&n?this._monthsShortStrictRegex:this._monthsShortRegex)},pe.week=function(n){return Gn(n,this._week.dow,this._week.doy).week},pe.firstDayOfYear=function(){return this._week.doy},pe.firstDayOfWeek=function(){return this._week.dow},pe.weekdays=function(n,t){return n?i(this._weekdays)?this._weekdays[n.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][n.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone},pe.weekdaysMin=function(n){return n?this._weekdaysMin[n.day()]:this._weekdaysMin},pe.weekdaysShort=function(n){return n?this._weekdaysShort[n.day()]:this._weekdaysShort},pe.weekdaysParse=function(n,t,e){var l,r,i;if(this._weekdaysParseExact)return(function(n,t,e){var l,r,i,o=n.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],l=0;l<7;++l)i=p([2e3,1]).day(l),this._minWeekdaysParse[l]=this.weekdaysMin(i,"").toLocaleLowerCase(),this._shortWeekdaysParse[l]=this.weekdaysShort(i,"").toLocaleLowerCase(),this._weekdaysParse[l]=this.weekdays(i,"").toLocaleLowerCase();return e?"dddd"===t?-1!==(r=Ln.call(this._weekdaysParse,o))?r:null:"ddd"===t?-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:null:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:null:"dddd"===t?-1!==(r=Ln.call(this._weekdaysParse,o))?r:-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:null:"ddd"===t?-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:-1!==(r=Ln.call(this._weekdaysParse,o))?r:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:null:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:-1!==(r=Ln.call(this._weekdaysParse,o))?r:-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:null}).call(this,n,t,e);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),l=0;l<7;l++){if(r=p([2e3,1]).day(l),e&&!this._fullWeekdaysParse[l]&&(this._fullWeekdaysParse[l]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[l]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[l]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[l]||(i="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[l]=new RegExp(i.replace(".",""),"i")),e&&"dddd"===t&&this._fullWeekdaysParse[l].test(n))return l;if(e&&"ddd"===t&&this._shortWeekdaysParse[l].test(n))return l;if(e&&"dd"===t&&this._minWeekdaysParse[l].test(n))return l;if(!e&&this._weekdaysParse[l].test(n))return l}},pe.weekdaysRegex=function(n){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||nt.call(this),n?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Xn),this._weekdaysStrictRegex&&n?this._weekdaysStrictRegex:this._weekdaysRegex)},pe.weekdaysShortRegex=function(n){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||nt.call(this),n?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Zn),this._weekdaysShortStrictRegex&&n?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},pe.weekdaysMinRegex=function(n){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||nt.call(this),n?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=$n),this._weekdaysMinStrictRegex&&n?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},pe.isPM=function(n){return"p"===(n+"").toLowerCase().charAt(0)},pe.meridiem=function(n,t,e){return n>11?e?"pm":"PM":e?"am":"AM"},dt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(n){var t=n%10;return n+(1===M(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),r.lang=S("moment.lang is deprecated. Use moment.locale instead.",dt),r.langData=S("moment.langData is deprecated. Use moment.localeData instead.",pt);var ge=Math.abs;function ye(n,t,e,l){var r=Gt(t,e);return n._milliseconds+=l*r._milliseconds,n._days+=l*r._days,n._months+=l*r._months,n._bubble()}function be(n){return n<0?Math.floor(n):Math.ceil(n)}function ve(n){return 4800*n/146097}function we(n){return 146097*n/4800}function xe(n){return function(){return this.as(n)}}var Me=xe("ms"),ke=xe("s"),Ce=xe("m"),Se=xe("h"),Oe=xe("d"),Te=xe("w"),Le=xe("M"),Pe=xe("y");function De(n){return function(){return this.isValid()?this._data[n]:NaN}}var Ae=De("milliseconds"),Ee=De("seconds"),Ye=De("minutes"),je=De("hours"),Ie=De("days"),Re=De("months"),He=De("years"),Ne=Math.round,Fe={ss:44,s:45,m:45,h:22,d:26,M:11},Be=Math.abs;function Ve(n){return(n>0)-(n<0)||+n}function We(){if(!this.isValid())return this.localeData().invalidDate();var n,t,e=Be(this._milliseconds)/1e3,l=Be(this._days),r=Be(this._months);t=x((n=x(e/60))/60),e%=60,n%=60;var i=x(r/12),o=r%=12,s=l,a=t,u=n,c=e?e.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var h=d<0?"-":"",p=Ve(this._months)!==Ve(d)?"-":"",f=Ve(this._days)!==Ve(d)?"-":"",_=Ve(this._milliseconds)!==Ve(d)?"-":"";return h+"P"+(i?p+i+"Y":"")+(o?p+o+"M":"")+(s?f+s+"D":"")+(a||u||c?"T":"")+(a?_+a+"H":"")+(u?_+u+"M":"")+(c?_+c+"S":"")}var ze=jt.prototype;return ze.isValid=function(){return this._isValid},ze.abs=function(){var n=this._data;return this._milliseconds=ge(this._milliseconds),this._days=ge(this._days),this._months=ge(this._months),n.milliseconds=ge(n.milliseconds),n.seconds=ge(n.seconds),n.minutes=ge(n.minutes),n.hours=ge(n.hours),n.months=ge(n.months),n.years=ge(n.years),this},ze.add=function(n,t){return ye(this,n,t,1)},ze.subtract=function(n,t){return ye(this,n,t,-1)},ze.as=function(n){if(!this.isValid())return NaN;var t,e,l=this._milliseconds;if("month"===(n=j(n))||"year"===n)return e=this._months+ve(t=this._days+l/864e5),"month"===n?e:e/12;switch(t=this._days+Math.round(we(this._months)),n){case"week":return t/7+l/6048e5;case"day":return t+l/864e5;case"hour":return 24*t+l/36e5;case"minute":return 1440*t+l/6e4;case"second":return 86400*t+l/1e3;case"millisecond":return Math.floor(864e5*t)+l;default:throw new Error("Unknown unit "+n)}},ze.asMilliseconds=Me,ze.asSeconds=ke,ze.asMinutes=Ce,ze.asHours=Se,ze.asDays=Oe,ze.asWeeks=Te,ze.asMonths=Le,ze.asYears=Pe,ze.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*M(this._months/12):NaN},ze._bubble=function(){var n,t,e,l,r,i=this._milliseconds,o=this._days,s=this._months,a=this._data;return i>=0&&o>=0&&s>=0||i<=0&&o<=0&&s<=0||(i+=864e5*be(we(s)+o),o=0,s=0),a.milliseconds=i%1e3,n=x(i/1e3),a.seconds=n%60,t=x(n/60),a.minutes=t%60,e=x(t/60),a.hours=e%24,s+=r=x(ve(o+=x(e/24))),o-=be(we(r)),l=x(s/12),s%=12,a.days=o,a.months=s,a.years=l,this},ze.clone=function(){return Gt(this)},ze.get=function(n){return n=j(n),this.isValid()?this[n+"s"]():NaN},ze.milliseconds=Ae,ze.seconds=Ee,ze.minutes=Ye,ze.hours=je,ze.days=Ie,ze.weeks=function(){return x(this.days()/7)},ze.months=Re,ze.years=He,ze.humanize=function(n){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),e=function(n,t,e){var l=Gt(n).abs(),r=Ne(l.as("s")),i=Ne(l.as("m")),o=Ne(l.as("h")),s=Ne(l.as("d")),a=Ne(l.as("M")),u=Ne(l.as("y")),c=r<=Fe.ss&&["s",r]||r0,c[4]=e,(function(n,t,e,l,r){return r.relativeTime(t||1,!!e,n,l)}).apply(null,c)}(this,!n,t);return n&&(e=t.pastFuture(+this,e)),t.postformat(e)},ze.toISOString=We,ze.toString=We,ze.toJSON=We,ze.locale=ne,ze.localeData=ee,ze.toIsoString=S("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",We),ze.lang=te,z("X",0,0,"unix"),z("x",0,0,"valueOf"),dn("x",on),dn("X",/[+-]?\d+(\.\d{1,3})?/),_n("X",function(n,t,e){e._d=new Date(1e3*parseFloat(n,10))}),_n("x",function(n,t,e){e._d=new Date(M(n))}),r.version="2.21.0",t=Pt,r.fn=de,r.min=function(){return Et("isBefore",[].slice.call(arguments,0))},r.max=function(){return Et("isAfter",[].slice.call(arguments,0))},r.now=function(){return Date.now?Date.now():+new Date},r.utc=p,r.unix=function(n){return Pt(1e3*n)},r.months=function(n,t){return _e(n,t,"months")},r.isDate=u,r.locale=dt,r.invalid=m,r.duration=Gt,r.isMoment=w,r.weekdays=function(n,t,e){return me(n,t,e,"weekdays")},r.parseZone=function(){return Pt.apply(null,arguments).parseZone()},r.localeData=pt,r.isDuration=It,r.monthsShort=function(n,t){return _e(n,t,"monthsShort")},r.weekdaysMin=function(n,t,e){return me(n,t,e,"weekdaysMin")},r.defineLocale=ht,r.updateLocale=function(n,t){if(null!=t){var e,l,r=ot;null!=(l=ct(n))&&(r=l._config),(e=new A(t=D(r,t))).parentLocale=st[n],st[n]=e,dt(n)}else null!=st[n]&&(null!=st[n].parentLocale?st[n]=st[n].parentLocale:null!=st[n]&&delete st[n]);return st[n]},r.locales=function(){return O(st)},r.weekdaysShort=function(n,t,e){return me(n,t,e,"weekdaysShort")},r.normalizeUnits=j,r.relativeTimeRounding=function(n){return void 0===n?Ne:"function"==typeof n&&(Ne=n,!0)},r.relativeTimeThreshold=function(n,t){return void 0!==Fe[n]&&(void 0===t?Fe[n]:(Fe[n]=t,"s"===n&&(Fe.ss=t-1),!0))},r.calendarFormat=function(n,t){var e=n.diff(t,"days",!0);return e<-6?"sameElse":e<-1?"lastWeek":e<0?"lastDay":e<1?"sameDay":e<2?"nextDay":e<7?"nextWeek":"sameElse"},r.prototype=de,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},r}()}).call(t,e("3IRH")(n))},QZk1:function(n,t,e){!function(n){"use strict";n.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(e("PJh5"))},Qnch:function(n,t,e){"use strict";t.a=function(n,t,e){return void 0===e&&(e=Number.POSITIVE_INFINITY),function(l){return"number"==typeof t&&(e=t,t=null),l.lift(new o(n,t,e))}};var l=e("TToO"),r=e("PIsA"),i=e("tZ2B"),o=function(){function n(n,t,e){void 0===e&&(e=Number.POSITIVE_INFINITY),this.project=n,this.resultSelector=t,this.concurrent=e}return n.prototype.call=function(n,t){return t.subscribe(new s(n,this.project,this.resultSelector,this.concurrent))},n}(),s=function(n){function t(t,e,l,r){void 0===r&&(r=Number.POSITIVE_INFINITY),n.call(this,t),this.project=e,this.resultSelector=l,this.concurrent=r,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){this.active0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(i.a)},RMhj:function(n,t,e){var l={"./en.json":["TKku",5],"./es.json":["/YBz",4],"./es_base.json":["0v8u",3],"./ru.json":["P+VX",2],"./zh.json":["ODm5",1],"./zh_base.json":["dXVM",0]};function r(n){var t=l[n];return t?e.e(t[1]).then(function(){return e(t[0])}):Promise.reject(new Error("Cannot find module '"+n+"'."))}r.keys=function(){return Object.keys(l)},r.id="RMhj",n.exports=r},Rf9G:function(n,t,e){"use strict";t.a=function(){return Object(l.a)()(this)};var l=e("3a3m")},RnJI:function(n,t,e){!function(n){"use strict";n.defineLocale("ka",{months:{standalone:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),format:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10e1_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10e1_\u10db\u10d0\u10e0\u10e2\u10e1_\u10d0\u10de\u10e0\u10d8\u10da\u10d8\u10e1_\u10db\u10d0\u10d8\u10e1\u10e1_\u10d8\u10d5\u10dc\u10d8\u10e1\u10e1_\u10d8\u10d5\u10da\u10d8\u10e1\u10e1_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10e1_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10e1_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10e1".split("_")},monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(n){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10ec\u10d4\u10da\u10d8)/.test(n)?n.replace(/\u10d8$/,"\u10e8\u10d8"):n+"\u10e8\u10d8"},past:function(n){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(n)?n.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(n)?n.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):void 0},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(n){return 0===n?n:1===n?n+"-\u10da\u10d8":n<20||n<=100&&n%20==0||n%100==0?"\u10db\u10d4-"+n:n+"-\u10d4"},week:{dow:1,doy:7}})}(e("PJh5"))},Sjoy:function(n,t,e){!function(n){"use strict";n.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},T1Dh:function(n,t,e){"use strict";t.a=function(n){return function(t){return 0===n?new o.a:t.lift(new s(n))}};var l=e("TToO"),r=e("OVmG"),i=e("pU/0"),o=e("+3/4"),s=function(){function n(n){if(this.total=n,this.total<0)throw new i.a}return n.prototype.call=function(n,t){return t.subscribe(new a(n,this.total))},n}(),a=function(n){function t(t,e){n.call(this,t),this.total=e,this.ring=new Array,this.count=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t=this.ring,e=this.total,l=this.count++;t.length0)for(var e=this.count>=this.total?this.total:this.count,l=this.ring,r=0;r=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},t.__param=function(n,t){return function(e,l){t(e,l,n)}},t.__metadata=function(n,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(n,t)},t.__awaiter=function(n,t,e,l){return new(e||(e=Promise))(function(r,i){function o(n){try{a(l.next(n))}catch(n){i(n)}}function s(n){try{a(l.throw(n))}catch(n){i(n)}}function a(n){n.done?r(n.value):new e(function(t){t(n.value)}).then(o,s)}a((l=l.apply(n,t||[])).next())})},t.__generator=function(n,t){var e,l,r,i,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(e)throw new TypeError("Generator is already executing.");for(;o;)try{if(e=1,l&&(r=l[2&i[0]?"return":i[0]?"throw":"next"])&&!(r=r.call(l,i[1])).done)return r;switch(l=0,r&&(i=[0,r.value]),i[0]){case 0:case 1:r=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,l=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(r=(r=o.trys).length>0&&r[r.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]1||a(n,t)})})}function a(n,t){try{(e=r[n](t)).value instanceof s?Promise.resolve(e.value.v).then(u,c):d(i[0][2],e)}catch(n){d(i[0][3],n)}var e}function u(n){a("next",n)}function c(n){a("throw",n)}function d(n,t){n(t),i.shift(),i.length&&a(i[0][0],i[0][1])}},t.__asyncDelegator=function(n){var t,e;return t={},l("next"),l("throw",function(n){throw n}),l("return"),t[Symbol.iterator]=function(){return this},t;function l(l,r){n[l]&&(t[l]=function(t){return(e=!e)?{value:s(n[l](t)),done:"return"===l}:r?r(t):t})}},t.__asyncValues=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=n[Symbol.asyncIterator];return t?t.call(n):"function"==typeof i?i(n):n[Symbol.iterator]()},t.__makeTemplateObject=function(n,t){return Object.defineProperty?Object.defineProperty(n,"raw",{value:t}):n.raw=t,n};var l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,t){n.__proto__=t}||function(n,t){for(var e in t)t.hasOwnProperty(e)&&(n[e]=t[e])},r=Object.assign||function(n){for(var t,e=1,l=arguments.length;e=n.length&&(n=void 0),{value:n&&n[e++],done:!n}}}}function o(n,t){var e="function"==typeof Symbol&&n[Symbol.iterator];if(!e)return n;var l,r,i=e.call(n),o=[];try{for(;(void 0===t||t-- >0)&&!(l=i.next()).done;)o.push(l.value)}catch(n){r={error:n}}finally{try{l&&!l.done&&(e=i.return)&&e.call(i)}finally{if(r)throw r.error}}return o}function s(n){return this instanceof s?(this.v=n,this):new s(n)}},To0v:function(n,t,e){!function(n){"use strict";n.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===t||"\u0633\u06d5\u06be\u06d5\u0631"===t||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===t?n:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===t||"\u0643\u06d5\u0686"===t?n+12:n>=11?n:n+12},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":l<900?"\u0633\u06d5\u06be\u06d5\u0631":l<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":l<1230?"\u0686\u06c8\u0634":l<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return n+"-\u06be\u06d5\u067e\u062a\u06d5";default:return n}},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(e("PJh5"))},Tqun:function(n,t,e){!function(n){"use strict";n.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(e("PJh5"))},Uter:function(n,t,e){const l=e("X3l8").Buffer;n.exports=function(n){if(n.length>=255)throw new TypeError("Alphabet too long");const t=new Uint8Array(256);t.fill(255);for(let l=0;l>>0,c=new Uint8Array(u);for(;n[o];){let l=t[n.charCodeAt(o)];if(255===l)return;let r=0;for(let n=u-1;(0!==l||r>>0)%256>>>0,l=l/256>>>0;if(0!==l)throw new Error("Non-zero carry");a=r,o++}if(" "===n[o])return;let d=u-a;for(;d!==u&&0===c[d];)d++;const h=l.allocUnsafe(s+(u-d));h.fill(0,0,s);let p=s;for(;d!==u;)h[p++]=c[d++];return h}return{encode:function(t){if(!l.isBuffer(t))throw new TypeError("Expected Buffer");if(0===t.length)return"";let i=0,s=0,a=0;const u=t.length;for(;a!==u&&0===t[a];)a++,i++;const c=(u-a)*o+1>>>0,d=new Uint8Array(c);for(;a!==u;){let n=t[a],l=0;for(let t=c-1;(0!==n||l>>0)%e>>>0,n=n/e>>>0;if(0!==n)throw new Error("Non-zero carry");s=l,a++}let h=c-s;for(;h!==c&&0===d[h];)h++;let p=r.repeat(i);for(;h1?new t(n,l):1===r?new i.a(n[0],l):new o.a(l)},t.dispatch=function(n){var t=n.array,e=n.index,l=n.subscriber;e>=n.count?l.complete():(l.next(t[e]),l.closed||(n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.array,l=e.length,r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{array:e,index:0,count:l,subscriber:n});for(var i=0;i=11?n:n+12},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u51cc\u6668":l<900?"\u65e9\u4e0a":l<1130?"\u4e0a\u5348":l<1230?"\u4e2d\u5348":l<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";case"M":return n+"\u6708";case"w":case"W":return n+"\u5468";default:return n}},relativeTime:{future:"%s\u5185",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(e("PJh5"))},WT6e:function(n,t,e){"use strict";(function(n){e.d(t,"g",function(){return ot}),e.d(t,"V",function(){return $n}),e.d(t,"Y",function(){return nt}),e.d(t,"U",function(){return et}),e.d(t,"A",function(){return tt}),e.d(t,"c",function(){return hn}),e.d(t,"E",function(){return _n}),e.d(t,"D",function(){return mn}),e.d(t,"b",function(){return gn}),e.d(t,"d",function(){return cn}),e.d(t,"e",function(){return dn}),e.d(t,"X",function(){return Ot}),e.d(t,"P",function(){return Un}),e.d(t,"_0",function(){return qn}),e.d(t,"w",function(){return Kt}),e.d(t,"f",function(){return ne}),e.d(t,"o",function(){return Rn}),e.d(t,"n",function(){return sn}),e.d(t,"J",function(){return ee}),e.d(t,"K",function(){return te}),e.d(t,"a",function(){return _}),e.d(t,"k",function(){return m}),e.d(t,"t",function(){return y}),e.d(t,"F",function(){return g}),e.d(t,"S",function(){return b}),e.d(t,"Q",function(){return v}),e.d(t,"W",function(){return j}),e.d(t,"s",function(){return F}),e.d(t,"r",function(){return a}),e.d(t,"p",function(){return x}),e.d(t,"C",function(){return M}),e.d(t,"q",function(){return k}),e.d(t,"L",function(){return S}),e.d(t,"B",function(){return Hn}),e.d(t,"G",function(){return ct}),e.d(t,"H",function(){return at}),e.d(t,"I",function(){return ut}),e.d(t,"i",function(){return vn}),e.d(t,"j",function(){return Tn}),e.d(t,"l",function(){return dt}),e.d(t,"x",function(){return An}),e.d(t,"z",function(){return Dn}),e.d(t,"y",function(){return ht}),e.d(t,"M",function(){return mt}),e.d(t,"N",function(){return ft}),e.d(t,"O",function(){return yt}),e.d(t,"R",function(){return bt}),e.d(t,"m",function(){return wt}),e.d(t,"h",function(){return vt}),e.d(t,"u",function(){return zt}),e.d(t,"v",function(){return Ut}),e.d(t,"T",function(){return Pt}),e.d(t,"Z",function(){return Qt}),e.d(t,"_13",function(){return At}),e.d(t,"_2",function(){return yn}),e.d(t,"_1",function(){return Ln}),e.d(t,"_10",function(){return L}),e.d(t,"_16",function(){return E}),e.d(t,"_30",function(){return Y}),e.d(t,"_14",function(){return un}),e.d(t,"_15",function(){return an}),e.d(t,"_3",function(){return Qe}),e.d(t,"_4",function(){return Ke}),e.d(t,"_5",function(){return _l}),e.d(t,"_6",function(){return wi}),e.d(t,"_7",function(){return ve}),e.d(t,"_8",function(){return Hl}),e.d(t,"_9",function(){return Xe}),e.d(t,"_12",function(){return qe}),e.d(t,"_18",function(){return ol}),e.d(t,"_19",function(){return il}),e.d(t,"_21",function(){return or}),e.d(t,"_22",function(){return Sl}),e.d(t,"_25",function(){return Nl}),e.d(t,"_28",function(){return Fl}),e.d(t,"_24",function(){return ur}),e.d(t,"_26",function(){return cr}),e.d(t,"_27",function(){return ar}),e.d(t,"_29",function(){return tr}),e.d(t,"_31",function(){return hr}),e.d(t,"_32",function(){return ge}),e.d(t,"_33",function(){return _r}),e.d(t,"_17",function(){return Xt}),e.d(t,"_20",function(){return Zt}),e.d(t,"_23",function(){return $t}),e.d(t,"_11",function(){return pn});var l=e("TToO"),r=e("YaPU"),i=e("/nXB"),o=e("Rf9G"),s=e("g5jc"),a=function(){function n(n){this._desc=n,this.ngMetadataName="InjectionToken"}return n.prototype.toString=function(){return"InjectionToken "+this._desc},n}(),u="__annotations__",c="__paramaters__",d="__prop__metadata__";function h(n,t,e,l){var r=p(t);function i(n){if(this instanceof i)return r.call(this,n),this;var t=new i(n),e=function(n){return(n.hasOwnProperty(u)?n[u]:Object.defineProperty(n,u,{value:[]})[u]).push(t),n};return l&&l(e),e}return e&&(i.prototype=Object.create(e.prototype)),i.prototype.ngMetadataName=n,i.annotationCls=i,i}function p(n){return function(){for(var t=[],e=0;e ");else if("object"==typeof t){var r=[];for(var i in t)if(t.hasOwnProperty(i)){var o=t[i];r.push(i+":"+("string"==typeof o?JSON.stringify(o):Y(o)))}l="{"+r.join(", ")+"}"}return"StaticInjectorError"+(e?"("+e+")":"")+"["+l+"]: "+n.replace(J,"\n ")}function $(n,t){return new Error(Z(n,t))}var nn="ngDebugContext",tn="ngOriginalError",en="ngErrorLogger";function ln(n){return n[nn]}function rn(n){return n[tn]}function on(n){for(var t=[],e=1;e0)n._bootstrapComponents.forEach(function(n){return t.bootstrap(n)});else{if(!n.instance.ngDoBootstrap)throw new Error("The module "+Y(n.instance.constructor)+' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.');n.instance.ngDoBootstrap(t)}this._modules.push(n)},n.prototype.onDestroy=function(n){this._destroyListeners.push(n)},Object.defineProperty(n.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),n.prototype.destroy=function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(n){return n.destroy()}),this._destroyListeners.forEach(function(n){return n()}),this._destroyed=!0},Object.defineProperty(n.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),n}();function it(n,t){return Array.isArray(t)?t.reduce(it,n):Object(l.__assign)({},n,t)}var ot=function(){function n(n,t,e,l,s,a){var u=this;this._zone=n,this._console=t,this._injector=e,this._exceptionHandler=l,this._componentFactoryResolver=s,this._initStatus=a,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=nt(),this._zone.onMicrotaskEmpty.subscribe({next:function(){u._zone.run(function(){u.tick()})}});var c=new r.a(function(n){u._stable=u._zone.isStable&&!u._zone.hasPendingMacrotasks&&!u._zone.hasPendingMicrotasks,u._zone.runOutsideAngular(function(){n.next(u._stable),n.complete()})}),d=new r.a(function(n){var t;u._zone.runOutsideAngular(function(){t=u._zone.onStable.subscribe(function(){Hn.assertNotInAngularZone(),A(function(){u._stable||u._zone.hasPendingMacrotasks||u._zone.hasPendingMicrotasks||(u._stable=!0,n.next(!0))})})});var e=u._zone.onUnstable.subscribe(function(){Hn.assertInAngularZone(),u._stable&&(u._stable=!1,u._zone.runOutsideAngular(function(){n.next(!1)}))});return function(){t.unsubscribe(),e.unsubscribe()}});this.isStable=Object(i.a)(c,o.a.call(d))}return n.prototype.bootstrap=function(n,t){var e,l=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");e=n instanceof xn?n:this._componentFactoryResolver.resolveComponentFactory(n),this.componentTypes.push(e.componentType);var r=e instanceof Pn?null:this._injector.get(Dn),i=e.create(F.NULL,[],t||e.selector,r);i.onDestroy(function(){l._unloadComponent(i)});var o=i.injector.get(Un,null);return o&&i.injector.get(Gn).registerApplication(i.location.nativeElement,o),this._loadComponent(i),nt()&&this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode."),i},n.prototype.tick=function(){var t=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");var e=n._tickScope();try{this._runningTick=!0,this._views.forEach(function(n){return n.detectChanges()}),this._enforceNoNewChanges&&this._views.forEach(function(n){return n.checkNoChanges()})}catch(n){this._zone.runOutsideAngular(function(){return t._exceptionHandler.handleError(n)})}finally{this._runningTick=!1,In(e)}},n.prototype.attachView=function(n){var t=n;this._views.push(t),t.attachToAppRef(this)},n.prototype.detachView=function(n){var t=n;st(this._views,t),t.detachFromAppRef()},n.prototype._loadComponent=function(n){this.attachView(n.hostView),this.tick(),this.components.push(n),this._injector.get(gn,[]).concat(this._bootstrapListeners).forEach(function(t){return t(n)})},n.prototype._unloadComponent=function(n){this.detachView(n.hostView),st(this.components,n)},n.prototype.ngOnDestroy=function(){this._views.slice().forEach(function(n){return n.destroy()})},Object.defineProperty(n.prototype,"viewCount",{get:function(){return this._views.length},enumerable:!0,configurable:!0}),n._tickScope=jn("ApplicationRef#tick()"),n}();function st(n,t){var e=n.indexOf(t);e>-1&&n.splice(e,1)}var at=function(){},ut=function(){var n={Important:1,DashCase:2};return n[n.Important]="Important",n[n.DashCase]="DashCase",n}(),ct=function(){},dt=function(n){this.nativeElement=n},ht=function(){},pt=function(){function n(){this.dirty=!0,this._results=[],this.changes=new Rn}return n.prototype.map=function(n){return this._results.map(n)},n.prototype.filter=function(n){return this._results.filter(n)},n.prototype.find=function(n){return this._results.find(n)},n.prototype.reduce=function(n,t){return this._results.reduce(n,t)},n.prototype.forEach=function(n){this._results.forEach(n)},n.prototype.some=function(n){return this._results.some(n)},n.prototype.toArray=function(){return this._results.slice()},n.prototype[D()]=function(){return this._results[D()]()},n.prototype.toString=function(){return this._results.toString()},n.prototype.reset=function(n){this._results=function n(t){return t.reduce(function(t,e){var l=Array.isArray(e)?n(e):e;return t.concat(l)},[])}(n),this.dirty=!1,this.length=this._results.length,this.last=this._results[this.length-1],this.first=this._results[0]},n.prototype.notifyOnChanges=function(){this.changes.emit(this)},n.prototype.setDirty=function(){this.dirty=!0},n.prototype.destroy=function(){this.changes.complete(),this.changes.unsubscribe()},n}(),ft=function(){},_t={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},mt=function(){function n(n,t){this._compiler=n,this._config=t||_t}return n.prototype.load=function(n){return this._compiler instanceof vn?this.loadFactory(n):this.loadAndCompile(n)},n.prototype.loadAndCompile=function(n){var t=this,l=n.split("#"),r=l[0],i=l[1];return void 0===i&&(i="default"),e("Jnfr")(r).then(function(n){return n[i]}).then(function(n){return gt(n,r,i)}).then(function(n){return t._compiler.compileModuleAsync(n)})},n.prototype.loadFactory=function(n){var t=n.split("#"),l=t[0],r=t[1],i="NgFactory";return void 0===r&&(r="default",i=""),e("Jnfr")(this._config.factoryPathPrefix+l+this._config.factoryPathSuffix).then(function(n){return n[r+i]}).then(function(n){return gt(n,l,r)})},n}();function gt(n,t,e){if(!n)throw new Error("Cannot find '"+e+"' in '"+t+"'");return n}var yt=function(){},bt=function(){},vt=function(){},wt=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(l.__extends)(t,n),t}(function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(l.__extends)(t,n),t}(vt)),xt=function(){function n(n,t,e){this._debugContext=e,this.nativeNode=n,t&&t instanceof Mt?t.addChild(this):this.parent=null,this.listeners=[]}return Object.defineProperty(n.prototype,"injector",{get:function(){return this._debugContext.injector},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"componentInstance",{get:function(){return this._debugContext.component},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"context",{get:function(){return this._debugContext.context},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"references",{get:function(){return this._debugContext.references},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"providerTokens",{get:function(){return this._debugContext.providerTokens},enumerable:!0,configurable:!0}),n}(),Mt=function(n){function t(t,e,l){var r=n.call(this,t,e,l)||this;return r.properties={},r.attributes={},r.classes={},r.styles={},r.childNodes=[],r.nativeElement=t,r}return Object(l.__extends)(t,n),t.prototype.addChild=function(n){n&&(this.childNodes.push(n),n.parent=this)},t.prototype.removeChild=function(n){var t=this.childNodes.indexOf(n);-1!==t&&(n.parent=null,this.childNodes.splice(t,1))},t.prototype.insertChildrenAfter=function(n,t){var e,l=this,r=this.childNodes.indexOf(n);-1!==r&&((e=this.childNodes).splice.apply(e,[r+1,0].concat(t)),t.forEach(function(n){n.parent&&n.parent.removeChild(n),n.parent=l}))},t.prototype.insertBefore=function(n,t){var e=this.childNodes.indexOf(n);-1===e?this.addChild(t):(t.parent&&t.parent.removeChild(t),t.parent=this,this.childNodes.splice(e,0,t))},t.prototype.query=function(n){return this.queryAll(n)[0]||null},t.prototype.queryAll=function(n){var t=[];return kt(this,n,t),t},t.prototype.queryAllNodes=function(n){var t=[];return Ct(this,n,t),t},Object.defineProperty(t.prototype,"children",{get:function(){return this.childNodes.filter(function(n){return n instanceof t})},enumerable:!0,configurable:!0}),t.prototype.triggerEventHandler=function(n,t){this.listeners.forEach(function(e){e.name==n&&e.callback(t)})},t}(xt);function kt(n,t,e){n.childNodes.forEach(function(n){n instanceof Mt&&(t(n)&&e.push(n),kt(n,t,e))})}function Ct(n,t,e){n instanceof Mt&&n.childNodes.forEach(function(n){t(n)&&e.push(n),n instanceof Mt&&Ct(n,t,e)})}var St=new Map;function Ot(n){return St.get(n)||null}function Tt(n){St.set(n.nativeNode,n)}function Lt(n,t){var e=At(n),l=At(t);return e&&l?function(n,t,e){for(var l=n[D()](),r=t[D()]();;){var i=l.next(),o=r.next();if(i.done&&o.done)return!0;if(i.done||o.done)return!1;if(!e(i.value,o.value))return!1}}(n,t,Lt):!(e||!n||"object"!=typeof n&&"function"!=typeof n||l||!t||"object"!=typeof t&&"function"!=typeof t)||E(n,t)}var Pt=function(){function n(n){this.wrapped=n}return n.wrap=function(t){return new n(t)},n}(),Dt=function(){function n(n,t,e){this.previousValue=n,this.currentValue=t,this.firstChange=e}return n.prototype.isFirstChange=function(){return this.firstChange},n}();function At(n){return!!Et(n)&&(Array.isArray(n)||!(n instanceof Map)&&D()in n)}function Et(n){return null!==n&&("function"==typeof n||"object"==typeof n)}var Yt=function(){function n(){}return n.prototype.supports=function(n){return At(n)},n.prototype.create=function(n){return new It(n)},n}(),jt=function(n,t){return t},It=function(){function n(n){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=n||jt}return n.prototype.forEachItem=function(n){var t;for(t=this._itHead;null!==t;t=t._next)n(t)},n.prototype.forEachOperation=function(n){for(var t=this._itHead,e=this._removalsHead,l=0,r=null;t||e;){var i=!e||t&&t.currentIndex=e.length)&&(t=e.length-1),t<0)return null;var l=e[t];return l.viewContainerParent=null,pl(e,t),ce.dirtyParentQueries(l),dl(l),l}function cl(n,t,e){var l=t?Pe(t,t.def.lastRenderRootNode):n.renderElement;Ne(e,2,e.renderer.parentNode(l),e.renderer.nextSibling(l),void 0)}function dl(n){Ne(n,3,null,null,void 0)}function hl(n,t,e){t>=n.length?n.push(e):n.splice(t,0,e)}function pl(n,t){t>=n.length-1?n.pop():n.splice(t,1)}var fl=new Object;function _l(n,t,e,l,r,i){return new ml(n,t,e,l,r,i)}var ml=function(n){function t(t,e,l,r,i,o){var s=n.call(this)||this;return s.selector=t,s.componentType=e,s._inputs=r,s._outputs=i,s.ngContentSelectors=o,s.viewDefFactory=l,s}return Object(l.__extends)(t,n),Object.defineProperty(t.prototype,"inputs",{get:function(){var n=[],t=this._inputs;for(var e in t)n.push({propName:e,templateName:t[e]});return n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"outputs",{get:function(){var n=[];for(var t in this._outputs)n.push({propName:t,templateName:this._outputs[t]});return n},enumerable:!0,configurable:!0}),t.prototype.create=function(n,t,e,l){if(!l)throw new Error("ngModule should be provided");var r=He(this.viewDefFactory),i=r.nodes[0].element.componentProvider.nodeIndex,o=ce.createRootView(n,t||[],e,r,l,fl),s=se(o,i).instance;return e&&o.renderer.setAttribute(oe(o,0).renderElement,"ng-version",w.full),new gl(o,new wl(o),s)},t}(xn),gl=function(n){function t(t,e,l){var r=n.call(this)||this;return r._view=t,r._viewRef=e,r._component=l,r._elDef=r._view.def.nodes[0],r.hostView=e,r.changeDetectorRef=e,r.instance=l,r}return Object(l.__extends)(t,n),Object.defineProperty(t.prototype,"location",{get:function(){return new dt(oe(this._view,this._elDef.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return new Cl(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentType",{get:function(){return this._component.constructor},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){this._viewRef.destroy()},t.prototype.onDestroy=function(n){this._viewRef.onDestroy(n)},t}(function(){});function yl(n,t,e){return new bl(n,t,e)}var bl=function(){function n(n,t,e){this._view=n,this._elDef=t,this._data=e,this._embeddedViews=[]}return Object.defineProperty(n.prototype,"element",{get:function(){return new dt(this._data.renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"injector",{get:function(){return new Cl(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"parentInjector",{get:function(){for(var n=this._view,t=this._elDef.parent;!t&&n;)t=Le(n),n=n.parent;return n?new Cl(n,t):new Cl(this._view,null)},enumerable:!0,configurable:!0}),n.prototype.clear=function(){for(var n=this._embeddedViews.length-1;n>=0;n--){var t=ul(this._data,n);ce.destroyView(t)}},n.prototype.get=function(n){var t=this._embeddedViews[n];if(t){var e=new wl(t);return e.attachToViewContainerRef(this),e}return null},Object.defineProperty(n.prototype,"length",{get:function(){return this._embeddedViews.length},enumerable:!0,configurable:!0}),n.prototype.createEmbeddedView=function(n,t,e){var l=n.createEmbeddedView(t||{});return this.insert(l,e),l},n.prototype.createComponent=function(n,t,e,l,r){var i=e||this.parentInjector;r||n instanceof Pn||(r=i.get(Dn));var o=n.create(i,l,void 0,r);return this.insert(o.hostView,t),o},n.prototype.insert=function(n,t){if(n.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");var e,l,r,i,o=n;return r=o._view,i=(e=this._data).viewContainer._embeddedViews,null!==(l=t)&&void 0!==l||(l=i.length),r.viewContainerParent=this._view,hl(i,l,r),function(n,t){var e=Te(t);if(e&&e!==n&&!(16&t.state)){t.state|=16;var l=e.template._projectedViews;l||(l=e.template._projectedViews=[]),l.push(t),function(n,e){if(!(4&e.flags)){t.parent.def.nodeFlags|=4,e.flags|=4;for(var l=e.parent;l;)l.childFlags|=4,l=l.parent}}(0,t.parentNodeDef)}}(e,r),ce.dirtyParentQueries(r),cl(e,l>0?i[l-1]:null,r),o.attachToViewContainerRef(this),n},n.prototype.move=function(n,t){if(n.destroyed)throw new Error("Cannot move a destroyed View in a ViewContainer!");var e,l,r,i,o,s=this._embeddedViews.indexOf(n._view);return r=t,o=(i=(e=this._data).viewContainer._embeddedViews)[l=s],pl(i,l),null==r&&(r=i.length),hl(i,r,o),ce.dirtyParentQueries(o),dl(o),cl(e,r>0?i[r-1]:null,o),n},n.prototype.indexOf=function(n){return this._embeddedViews.indexOf(n._view)},n.prototype.remove=function(n){var t=ul(this._data,n);t&&ce.destroyView(t)},n.prototype.detach=function(n){var t=ul(this._data,n);return t?new wl(t):null},n}();function vl(n){return new wl(n)}var wl=function(){function n(n){this._view=n,this._viewContainerRef=null,this._appRef=null}return Object.defineProperty(n.prototype,"rootNodes",{get:function(){return Ne(this._view,0,void 0,void 0,n=[]),n;var n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"context",{get:function(){return this._view.context},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"destroyed",{get:function(){return 0!=(128&this._view.state)},enumerable:!0,configurable:!0}),n.prototype.markForCheck=function(){Ce(this._view)},n.prototype.detach=function(){this._view.state&=-5},n.prototype.detectChanges=function(){var n=this._view.root.rendererFactory;n.begin&&n.begin();try{ce.checkAndUpdateView(this._view)}finally{n.end&&n.end()}},n.prototype.checkNoChanges=function(){ce.checkNoChangesView(this._view)},n.prototype.reattach=function(){this._view.state|=4},n.prototype.onDestroy=function(n){this._view.disposables||(this._view.disposables=[]),this._view.disposables.push(n)},n.prototype.destroy=function(){this._appRef?this._appRef.detachView(this):this._viewContainerRef&&this._viewContainerRef.detach(this._viewContainerRef.indexOf(this)),ce.destroyView(this._view)},n.prototype.detachFromAppRef=function(){this._appRef=null,dl(this._view),ce.dirtyParentQueries(this._view)},n.prototype.attachToAppRef=function(n){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=n},n.prototype.attachToViewContainerRef=function(n){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=n},n}();function xl(n,t){return new Ml(n,t)}var Ml=function(n){function t(t,e){var l=n.call(this)||this;return l._parentView=t,l._def=e,l}return Object(l.__extends)(t,n),t.prototype.createEmbeddedView=function(n){return new wl(ce.createEmbeddedView(this._parentView,this._def,this._def.element.template,n))},Object.defineProperty(t.prototype,"elementRef",{get:function(){return new dt(oe(this._parentView,this._def.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),t}(yt);function kl(n,t){return new Cl(n,t)}var Cl=function(){function n(n,t){this.view=n,this.elDef=t}return n.prototype.get=function(n,t){return void 0===t&&(t=F.THROW_IF_NOT_FOUND),ce.resolveDep(this.view,this.elDef,!!this.elDef&&0!=(33554432&this.elDef.flags),{flags:0,token:n,tokenKey:me(n)},t)},n}();function Sl(n,t){var e=n.def.nodes[t];if(1&e.flags){var l=oe(n,e.nodeIndex);return e.element.template?l.template:l.renderElement}if(2&e.flags)return ie(n,e.nodeIndex).renderText;if(20240&e.flags)return se(n,e.nodeIndex).instance;throw new Error("Illegal state: read nodeValue for node index "+t)}function Ol(n){return new Tl(n.renderer)}var Tl=function(){function n(n){this.delegate=n}return n.prototype.selectRootElement=function(n){return this.delegate.selectRootElement(n)},n.prototype.createElement=function(n,t){var e=Ue(t),l=this.delegate.createElement(e[1],e[0]);return n&&this.delegate.appendChild(n,l),l},n.prototype.createViewRoot=function(n){return n},n.prototype.createTemplateAnchor=function(n){var t=this.delegate.createComment("");return n&&this.delegate.appendChild(n,t),t},n.prototype.createText=function(n,t){var e=this.delegate.createText(t);return n&&this.delegate.appendChild(n,e),e},n.prototype.projectNodes=function(n,t){for(var e=0;e0,t.provider.value,t.provider.deps);if(t.outputs.length)for(var l=0;l0,l=t.provider;switch(201347067&t.flags){case 512:return ql(n,t.parent,e,l.value,l.deps);case 1024:return function(n,t,e,l,r){var i=r.length;switch(i){case 0:return l();case 1:return l(Ql(n,t,e,r[0]));case 2:return l(Ql(n,t,e,r[0]),Ql(n,t,e,r[1]));case 3:return l(Ql(n,t,e,r[0]),Ql(n,t,e,r[1]),Ql(n,t,e,r[2]));default:for(var o=Array(i),s=0;s0)u=_,mr(_)||(c=_);else for(;u&&f===u.nodeIndex+u.childCount;){var y=u.parent;y&&(y.childFlags|=u.childFlags,y.childMatchedQueries|=u.childMatchedQueries),c=(u=y)&&mr(u)?u.renderParent:u}}return{factory:null,nodeFlags:o,rootNodeFlags:s,nodeMatchedQueries:a,flags:n,nodes:t,updateDirectives:e||fe,updateRenderer:l||fe,handleEvent:function(n,e,l,r){return t[e].element.handleEvent(n,l,r)},bindingCount:r,outputCount:i,lastRenderRootNode:p}}function mr(n){return 0!=(1&n.flags)&&null===n.element.name}function gr(n,t,e){var l=t.element&&t.element.template;if(l){if(!l.lastRenderRootNode)throw new Error("Illegal State: Embedded templates without nodes are not allowed!");if(l.lastRenderRootNode&&16777216&l.lastRenderRootNode.flags)throw new Error("Illegal State: Last root node of a template can't have embedded views, at index "+t.nodeIndex+"!")}if(20224&t.flags&&0==(1&(n?n.flags:0)))throw new Error("Illegal State: StaticProvider/Directive nodes need to be children of elements or anchors, at index "+t.nodeIndex+"!");if(t.query){if(67108864&t.flags&&(!n||0==(16384&n.flags)))throw new Error("Illegal State: Content Query nodes need to be children of directives, at index "+t.nodeIndex+"!");if(134217728&t.flags&&n)throw new Error("Illegal State: View Query nodes have to be top level nodes, at index "+t.nodeIndex+"!")}if(t.childCount){var r=n?n.nodeIndex+n.childCount:e-1;if(t.nodeIndex<=r&&t.nodeIndex+t.childCount>r)throw new Error("Illegal State: childCount of node leads outside of parent, at index "+t.nodeIndex+"!")}}function yr(n,t,e,l){var r=wr(n.root,n.renderer,n,t,e);return xr(r,n.component,l),Mr(r),r}function br(n,t,e){var l=wr(n,n.renderer,null,null,t);return xr(l,e,e),Mr(l),l}function vr(n,t,e,l){var r,i=t.element.componentRendererType;return r=i?n.root.rendererFactory.createRenderer(l,i):n.root.renderer,wr(n.root,r,n,t.element.componentProvider,e)}function wr(n,t,e,l,r){var i=new Array(r.nodes.length),o=r.outputCount?new Array(r.outputCount):null;return{def:r,parent:e,viewContainerParent:null,parentNodeDef:l,context:null,component:null,nodes:i,state:13,root:n,renderer:t,oldValues:new Array(r.bindingCount),disposables:o,initIndex:-1}}function xr(n,t,e){n.component=t,n.context=e}function Mr(n){var t;De(n)&&(t=oe(n.parent,n.parentNodeDef.parent.nodeIndex).renderElement);for(var e=n.def,l=n.nodes,r=0;r0&&tl(n,t,0,e)&&(p=!0),h>1&&tl(n,t,1,l)&&(p=!0),h>2&&tl(n,t,2,r)&&(p=!0),h>3&&tl(n,t,3,i)&&(p=!0),h>4&&tl(n,t,4,o)&&(p=!0),h>5&&tl(n,t,5,s)&&(p=!0),h>6&&tl(n,t,6,a)&&(p=!0),h>7&&tl(n,t,7,u)&&(p=!0),h>8&&tl(n,t,8,c)&&(p=!0),h>9&&tl(n,t,9,d)&&(p=!0),p}(n,t,e,l,r,i,o,s,a,u,c,d);case 2:return function(n,t,e,l,r,i,o,s,a,u,c,d){var h=!1,p=t.bindings,f=p.length;if(f>0&&Me(n,t,0,e)&&(h=!0),f>1&&Me(n,t,1,l)&&(h=!0),f>2&&Me(n,t,2,r)&&(h=!0),f>3&&Me(n,t,3,i)&&(h=!0),f>4&&Me(n,t,4,o)&&(h=!0),f>5&&Me(n,t,5,s)&&(h=!0),f>6&&Me(n,t,6,a)&&(h=!0),f>7&&Me(n,t,7,u)&&(h=!0),f>8&&Me(n,t,8,c)&&(h=!0),f>9&&Me(n,t,9,d)&&(h=!0),h){var _=t.text.prefix;f>0&&(_+=fr(e,p[0])),f>1&&(_+=fr(l,p[1])),f>2&&(_+=fr(r,p[2])),f>3&&(_+=fr(i,p[3])),f>4&&(_+=fr(o,p[4])),f>5&&(_+=fr(s,p[5])),f>6&&(_+=fr(a,p[6])),f>7&&(_+=fr(u,p[7])),f>8&&(_+=fr(c,p[8])),f>9&&(_+=fr(d,p[9]));var m=ie(n,t.nodeIndex).renderText;n.renderer.setValue(m,_)}return h}(n,t,e,l,r,i,o,s,a,u,c,d);case 16384:return function(n,t,e,l,r,i,o,s,a,u,c,d){var h=se(n,t.nodeIndex),p=h.instance,f=!1,_=void 0,m=t.bindings.length;return m>0&&xe(n,t,0,e)&&(f=!0,_=Xl(n,h,t,0,e,_)),m>1&&xe(n,t,1,l)&&(f=!0,_=Xl(n,h,t,1,l,_)),m>2&&xe(n,t,2,r)&&(f=!0,_=Xl(n,h,t,2,r,_)),m>3&&xe(n,t,3,i)&&(f=!0,_=Xl(n,h,t,3,i,_)),m>4&&xe(n,t,4,o)&&(f=!0,_=Xl(n,h,t,4,o,_)),m>5&&xe(n,t,5,s)&&(f=!0,_=Xl(n,h,t,5,s,_)),m>6&&xe(n,t,6,a)&&(f=!0,_=Xl(n,h,t,6,a,_)),m>7&&xe(n,t,7,u)&&(f=!0,_=Xl(n,h,t,7,u,_)),m>8&&xe(n,t,8,c)&&(f=!0,_=Xl(n,h,t,8,c,_)),m>9&&xe(n,t,9,d)&&(f=!0,_=Xl(n,h,t,9,d,_)),_&&p.ngOnChanges(_),65536&t.flags&&re(n,256,t.nodeIndex)&&p.ngOnInit(),262144&t.flags&&p.ngDoCheck(),f}(n,t,e,l,r,i,o,s,a,u,c,d);case 32:case 64:case 128:return function(n,t,e,l,r,i,o,s,a,u,c,d){var h=t.bindings,p=!1,f=h.length;if(f>0&&Me(n,t,0,e)&&(p=!0),f>1&&Me(n,t,1,l)&&(p=!0),f>2&&Me(n,t,2,r)&&(p=!0),f>3&&Me(n,t,3,i)&&(p=!0),f>4&&Me(n,t,4,o)&&(p=!0),f>5&&Me(n,t,5,s)&&(p=!0),f>6&&Me(n,t,6,a)&&(p=!0),f>7&&Me(n,t,7,u)&&(p=!0),f>8&&Me(n,t,8,c)&&(p=!0),f>9&&Me(n,t,9,d)&&(p=!0),p){var _=ae(n,t.nodeIndex),m=void 0;switch(201347067&t.flags){case 32:m=new Array(h.length),f>0&&(m[0]=e),f>1&&(m[1]=l),f>2&&(m[2]=r),f>3&&(m[3]=i),f>4&&(m[4]=o),f>5&&(m[5]=s),f>6&&(m[6]=a),f>7&&(m[7]=u),f>8&&(m[8]=c),f>9&&(m[9]=d);break;case 64:m={},f>0&&(m[h[0].name]=e),f>1&&(m[h[1].name]=l),f>2&&(m[h[2].name]=r),f>3&&(m[h[3].name]=i),f>4&&(m[h[4].name]=o),f>5&&(m[h[5].name]=s),f>6&&(m[h[6].name]=a),f>7&&(m[h[7].name]=u),f>8&&(m[h[8].name]=c),f>9&&(m[h[9].name]=d);break;case 128:var g=e;switch(f){case 1:m=g.transform(e);break;case 2:m=g.transform(l);break;case 3:m=g.transform(l,r);break;case 4:m=g.transform(l,r,i);break;case 5:m=g.transform(l,r,i,o);break;case 6:m=g.transform(l,r,i,o,s);break;case 7:m=g.transform(l,r,i,o,s,a);break;case 8:m=g.transform(l,r,i,o,s,a,u);break;case 9:m=g.transform(l,r,i,o,s,a,u,c);break;case 10:m=g.transform(l,r,i,o,s,a,u,c,d)}}_.value=m}return p}(n,t,e,l,r,i,o,s,a,u,c,d);default:throw"unreachable"}}(n,t,l,r,i,o,s,a,u,c,d,h):function(n,t,e){switch(201347067&t.flags){case 1:return function(n,t,e){for(var l=!1,r=0;r0&&ke(n,t,0,e),h>1&&ke(n,t,1,l),h>2&&ke(n,t,2,r),h>3&&ke(n,t,3,i),h>4&&ke(n,t,4,o),h>5&&ke(n,t,5,s),h>6&&ke(n,t,6,a),h>7&&ke(n,t,7,u),h>8&&ke(n,t,8,c),h>9&&ke(n,t,9,d)}(n,t,l,r,i,o,s,a,u,c,d,h):function(n,t,e){for(var l=0;l=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},f=function(){},_=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return h(t,n),t.prototype.getTranslation=function(n){return Object(r.a)({})},t}(f);_=p([Object(l.q)()],_);var m=function(n){return n&&"function"==typeof n.schedule},g="undefined"!=typeof window?window:"undefined"!=typeof n?n:"undefined"!=typeof self?self:{};function y(n,t){return n(t={exports:{}},t.exports),t.exports}var b="undefined"!=typeof window&&window,v="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,w=b||"undefined"!=typeof g&&g||v,x=w;!function(){if(!w)throw new Error("RxJS could not find any global context (window, self, global)")}();var M,k={root:x},C={isFunction:function(n){return"function"==typeof n}},S={isArray:Array.isArray||function(n){return n&&"number"==typeof n.length}},O=function(n){return null!=n&&"object"==typeof n},T={errorObject:{e:{}}};function L(){try{return M.apply(this,arguments)}catch(n){return T.errorObject.e=n,T.errorObject}}var P=function(n){return M=n,L},D=g&&g.__extends||function(n,t){for(var e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);function l(){this.constructor=n}n.prototype=null===t?Object.create(t):(l.prototype=t.prototype,new l)},A={UnsubscriptionError:function(n){function t(t){n.call(this),this.errors=t;var e=Error.call(this,t?t.length+" errors occurred during unsubscription:\n "+t.map(function(n,t){return t+1+") "+n.toString()}).join("\n "):"");this.name=e.name="UnsubscriptionError",this.stack=e.stack,this.message=e.message}return D(t,n),t}(Error)};function E(n){return n.reduce(function(n,t){return n.concat(t instanceof A.UnsubscriptionError?t.errors:t)},[])}var Y={Subscription:function(){function n(n){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,n&&(this._unsubscribe=n)}var t;return n.prototype.unsubscribe=function(){var n,t=!1;if(!this.closed){var e=this._parent,l=this._parents,r=this._unsubscribe,i=this._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var o=-1,s=l?l.length:0;e;)e.remove(this),e=++o1?new t(n,l):1===r?new J.ScalarObservable(n[0],l):new K.EmptyObservable(l)},t.dispatch=function(n){var t=n.array,e=n.index,l=n.subscriber;e>=n.count?l.complete():(l.next(t[e]),l.closed||(n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.array,l=e.length,r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{array:e,index:0,count:l,subscriber:n});for(var i=0;idn?dn:r:r}()),this.arr=n,this.idx=t,this.len=e}return n.prototype[on.iterator]=function(){return this},n.prototype.next=function(){return this.idx=n.length?l.complete():(l.next(t[e]),n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.arrayLike,l=this.scheduler,r=e.length;if(l)return l.schedule(t.dispatch,0,{arrayLike:e,index:0,length:r,subscriber:n});for(var i=0;i0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(On.OuterSubscriber),Dn=function(n){return n},An=function(n){return void 0===n&&(n=Number.POSITIVE_INFINITY),function(n,t,e){return void 0===e&&(e=Number.POSITIVE_INFINITY),function(l){return"number"==typeof t&&(e=t,t=null),l.lift(new Ln(n,t,e))}}(Dn,null,n)},En={concat:function(){for(var n=[],t=0;t=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},jn=function(){},In=function(){function n(){}return n.prototype.handle=function(n){return n.key},n}();In=Yn([Object(l.q)()],In);var Rn=this&&this.__decorate||function(n,t,e,l){var r,i=arguments.length,o=i<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,e):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(n,t,e,l);else for(var s=n.length-1;s>=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},Hn=function(){},Nn=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return h(t,n),t.prototype.compile=function(n,t){return n},t.prototype.compileTranslations=function(n,t){return n},t}(Hn);function Fn(n,t){if(n===t)return!0;if(null===n||null===t)return!1;if(n!=n&&t!=t)return!0;var e,l,r,i=typeof n;if(i==typeof t&&"object"==i){if(!Array.isArray(n)){if(Array.isArray(t))return!1;for(l in r=Object.create(null),n){if(!Fn(n[l],t[l]))return!1;r[l]=!0}for(l in t)if(!(l in r)&&"undefined"!=typeof t[l])return!1;return!0}if(!Array.isArray(t))return!1;if((e=n.length)==t.length){for(l=0;l=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},zn=function(){},Un=function(n){function t(){var t=n.apply(this,arguments)||this;return t.templateMatcher=/{{\s?([^{}\s]*)\s?}}/g,t}return h(t,n),t.prototype.interpolate=function(n,t){return"string"==typeof n?this.interpolateString(n,t):"function"==typeof n?this.interpolateFunction(n,t):n},t.prototype.getValue=function(n,t){var e=t.split(".");t="";do{t+=e.shift(),!Bn(n)||!Bn(n[t])||"object"!=typeof n[t]&&e.length?e.length?t+=".":n=void 0:(n=n[t],t="")}while(e.length);return n},t.prototype.interpolateFunction=function(n,t){return n(t)},t.prototype.interpolateString=function(n,t){var e=this;return t?n.replace(this.templateMatcher,function(n,l){var r=e.getValue(t,l);return Bn(r)?r:n}):n},t}(zn);Un=Wn([Object(l.q)()],Un);var Gn=function(){return function(){this.currentLang=this.defaultLang,this.translations={},this.langs=[],this.onTranslationChange=new l.o,this.onLangChange=new l.o,this.onDefaultLangChange=new l.o}}(),qn=this&&this.__decorate||function(n,t,e,l){var r,i=arguments.length,o=i<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,e):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(n,t,e,l);else for(var s=n.length-1;s>=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},Jn=e("TToO").__metadata,Qn=e("TToO").__param,Kn=new l.r("USE_STORE"),Xn=new l.r("USE_DEFAULT_LANG"),Zn=function(){function n(n,t,e,r,i,o,s){void 0===o&&(o=!0),void 0===s&&(s=!1),this.store=n,this.currentLoader=t,this.compiler=e,this.parser=r,this.missingTranslationHandler=i,this.useDefaultLang=o,this.isolate=s,this.pending=!1,this._onTranslationChange=new l.o,this._onLangChange=new l.o,this._onDefaultLangChange=new l.o,this._langs=[],this._translations={},this._translationRequests={}}return Object.defineProperty(n.prototype,"onTranslationChange",{get:function(){return this.isolate?this._onTranslationChange:this.store.onTranslationChange},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"onLangChange",{get:function(){return this.isolate?this._onLangChange:this.store.onLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"onDefaultLangChange",{get:function(){return this.isolate?this._onDefaultLangChange:this.store.onDefaultLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"defaultLang",{get:function(){return this.isolate?this._defaultLang:this.store.defaultLang},set:function(n){this.isolate?this._defaultLang=n:this.store.defaultLang=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"currentLang",{get:function(){return this.isolate?this._currentLang:this.store.currentLang},set:function(n){this.isolate?this._currentLang=n:this.store.currentLang=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"langs",{get:function(){return this.isolate?this._langs:this.store.langs},set:function(n){this.isolate?this._langs=n:this.store.langs=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"translations",{get:function(){return this.isolate?this._translations:this.store.translations},set:function(n){this.isolate?this._translations=n:this.store.translations=n},enumerable:!0,configurable:!0}),n.prototype.setDefaultLang=function(n){var t=this;if(n!==this.defaultLang){var e=this.retrieveTranslations(n);"undefined"!=typeof e?(this.defaultLang||(this.defaultLang=n),e.pipe(Object(d.a)(1)).subscribe(function(e){t.changeDefaultLang(n)})):this.changeDefaultLang(n)}},n.prototype.getDefaultLang=function(){return this.defaultLang},n.prototype.use=function(n){var t=this;if(n===this.currentLang)return Object(r.a)(this.translations[n]);var e=this.retrieveTranslations(n);return"undefined"!=typeof e?(this.currentLang||(this.currentLang=n),e.pipe(Object(d.a)(1)).subscribe(function(e){t.changeLang(n)}),e):(this.changeLang(n),Object(r.a)(this.translations[n]))},n.prototype.retrieveTranslations=function(n){var t;return"undefined"==typeof this.translations[n]&&(this._translationRequests[n]=this._translationRequests[n]||this.getTranslation(n),t=this._translationRequests[n]),t},n.prototype.getTranslation=function(n){var t=this;return this.pending=!0,this.loadingTranslations=this.currentLoader.getTranslation(n).pipe(Object(o.a)()),this.loadingTranslations.pipe(Object(d.a)(1)).subscribe(function(e){t.translations[n]=t.compiler.compileTranslations(e,n),t.updateLangs(),t.pending=!1},function(n){t.pending=!1}),this.loadingTranslations},n.prototype.setTranslation=function(n,t,e){void 0===e&&(e=!1),t=this.compiler.compileTranslations(t,n),this.translations[n]=e&&this.translations[n]?function n(t,e){var l=Object.assign({},t);return Vn(t)&&Vn(e)&&Object.keys(e).forEach(function(r){var i,o;Vn(e[r])?r in t?l[r]=n(t[r],e[r]):Object.assign(l,((i={})[r]=e[r],i)):Object.assign(l,((o={})[r]=e[r],o))}),l}(this.translations[n],t):t,this.updateLangs(),this.onTranslationChange.emit({lang:n,translations:this.translations[n]})},n.prototype.getLangs=function(){return this.langs},n.prototype.addLangs=function(n){var t=this;n.forEach(function(n){-1===t.langs.indexOf(n)&&t.langs.push(n)})},n.prototype.updateLangs=function(){this.addLangs(Object.keys(this.translations))},n.prototype.getParsedResult=function(n,t,e){var l;if(t instanceof Array){for(var i={},o=!1,u=0,d=t;u=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},nt=this&&this.__metadata||function(n,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(n,t)},tt=function(){function n(n,t,e){var l=this;this.translateService=n,this.element=t,this._ref=e,this.onTranslationChangeSub||(this.onTranslationChangeSub=this.translateService.onTranslationChange.subscribe(function(n){n.lang===l.translateService.currentLang&&l.checkNodes(!0,n.translations)})),this.onLangChangeSub||(this.onLangChangeSub=this.translateService.onLangChange.subscribe(function(n){l.checkNodes(!0,n.translations)})),this.onDefaultLangChangeSub||(this.onDefaultLangChangeSub=this.translateService.onDefaultLangChange.subscribe(function(n){l.checkNodes(!0)}))}return Object.defineProperty(n.prototype,"translate",{set:function(n){n&&(this.key=n,this.checkNodes())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"translateParams",{set:function(n){Fn(this.currentParams,n)||(this.currentParams=n,this.checkNodes(!0))},enumerable:!0,configurable:!0}),n.prototype.ngAfterViewChecked=function(){this.checkNodes()},n.prototype.checkNodes=function(n,t){void 0===n&&(n=!1);var e=this.element.nativeElement.childNodes;e.length||(this.setContent(this.element.nativeElement,this.key),e=this.element.nativeElement.childNodes);for(var l=0;l=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},lt=this&&this.__metadata||function(n,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(n,t)},rt=function(){function n(n,t){this.translate=n,this._ref=t,this.value=""}return n.prototype.updateValue=function(n,t,e){var l=this,r=function(t){l.value=void 0!==t?t:n,l.lastKey=n,l._ref.markForCheck()};if(e){var i=this.translate.getParsedResult(e,n,t);"function"==typeof i.subscribe?i.subscribe(r):r(i)}this.translate.get(n,t).subscribe(r)},n.prototype.transform=function(n){for(var t,e=this,l=[],r=1;r20?t=40===n||50===n||60===n||80===n||100===n?"fed":"ain":n>0&&(t=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][n]),n+t},week:{dow:1,doy:4}})}(e("PJh5"))},ZUyn:function(n,t,e){!function(n){"use strict";n.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?n:"\u4e2d\u5348"===t?n>=11?n:n+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?n+12:void 0},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u51cc\u6668":l<900?"\u65e9\u4e0a":l<1130?"\u4e0a\u5348":l<1230?"\u4e2d\u5348":l<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";case"M":return n+"\u6708";case"w":case"W":return n+"\u9031";default:return n}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(e("PJh5"))},ZoSI:function(n,t,e){!function(n){"use strict";n.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},aM0x:function(n,t,e){!function(n){"use strict";var t={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},e={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};n.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2_\u0986\u0997_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u0983_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(n){return n.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u09b0\u09be\u09a4"===t&&n>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===t&&n<5||"\u09ac\u09bf\u0995\u09be\u09b2"===t?n+12:n},meridiem:function(n,t,e){return n<4?"\u09b0\u09be\u09a4":n<10?"\u09b8\u0995\u09be\u09b2":n<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":n<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(e("PJh5"))},aqvp:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l=n+" ";switch(e){case"ss":return l+(1===n?"sekunda":2===n||3===n||4===n?"sekunde":"sekundi");case"m":return t?"jedna minuta":"jedne minute";case"mm":return l+(1===n?"minuta":2===n||3===n||4===n?"minute":"minuta");case"h":return t?"jedan sat":"jednog sata";case"hh":return l+(1===n?"sat":2===n||3===n||4===n?"sata":"sati");case"dd":return l+(1===n?"dan":"dana");case"MM":return l+(1===n?"mjesec":2===n||3===n||4===n?"mjeseca":"mjeseci");case"yy":return l+(1===n?"godina":2===n||3===n||4===n?"godine":"godina")}}n.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},bXQP:function(n,t,e){!function(n){"use strict";n.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(n,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return n+(1===n?"er":"e");case"w":case"W":return n+(1===n?"re":"e")}}})}(e("PJh5"))},c1x4:function(n,t,e){!function(n){"use strict";var t={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(n,t){return 1===n?t[0]:n>=2&&n<=4?t[1]:t[2]},translate:function(n,e,l){var r=t.words[l];return 1===l.length?e?r[0]:r[1]:n+" "+t.correctGrammaticalCase(n,r)}};n.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"\u0434\u0430\u043d",dd:t.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:t.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},cQXm:function(n,t,e){"use strict";t.a=function(n){return n&&"function"!=typeof n.subscribe&&"function"==typeof n.then}},"ce/b":function(n,t,e){"use strict";t.a=function(){for(var n=[],t=0;t=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},etqZ:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=function(n){var t=n.Symbol;if("function"==typeof t)return t.iterator||(t.iterator=t("iterator polyfill")),t.iterator;var e=n.Set;if(e&&"function"==typeof(new e)["@@iterator"])return"@@iterator";var l=n.Map;if(l)for(var r=Object.getOwnPropertyNames(l.prototype),i=0;i=2&&n<=4?t[1]:t[2]},translate:function(n,e,l){var r=t.words[l];return 1===l.length?e?r[0]:r[1]:n+" "+t.correctGrammaticalCase(n,r)}};n.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},f9aG:function(n,t,e){"use strict";t.a=function(){for(var n=[],t=0;t=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},gEQe:function(n,t,e){!function(n){"use strict";var t={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},e={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};n.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(n){return n.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===t?n<4?n:n+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===t?n:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===t?n>=10?n:n+12:"\u0cb8\u0c82\u0c9c\u0cc6"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":n<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":n<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":n<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(n){return n+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(e("PJh5"))},gEU3:function(n,t,e){!function(n){"use strict";n.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},gIN1:function(n,t,e){"use strict";t.a=function(){}},gUgh:function(n,t,e){!function(n){"use strict";n.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},hPuz:function(n,t,e){!function(n){"use strict";n.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},hng5:function(n,t,e){!function(n){"use strict";n.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(e("PJh5"))},iNtv:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={s:["viensas secunds","'iensas secunds"],ss:[n+" secunds",n+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[n+" m\xeduts",n+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[n+" \xfeoras",n+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[n+" ziuas",n+" ziuas"],M:["'n mes","'iens mes"],MM:[n+" mesen",n+" mesen"],y:["'n ar","'iens ar"],yy:[n+" ars",n+" ars"]};return l?r[e][0]:t?r[e][0]:r[e][1]}n.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(n){return"d'o"===n.toLowerCase()},meridiem:function(n,t,e){return n>11?e?"d'o":"D'O":e?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"j+vx":function(n,t,e){!function(n){"use strict";var t={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};n.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(n){return n+(t[n]||t[n%10]||t[n>=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},j8cJ:function(n,t,e){!function(n){"use strict";n.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(e("PJh5"))},jxEH:function(n,t,e){!function(n){"use strict";var t={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function e(n,t,e){return e?t%10==1&&t%100!=11?n[2]:n[3]:t%10==1&&t%100!=11?n[0]:n[1]}function l(n,l,r){return n+" "+e(t[r],n,l)}function r(n,l,r){return e(t[r],n,l)}n.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(n,t){return t?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:l,m:r,mm:l,h:r,hh:l,d:r,dd:l,M:r,MM:l,y:r,yy:l},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"k+5o":function(n,t,e){!function(n){"use strict";var t={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};n.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(n,e){switch(e){case"d":case"D":case"Do":case"DD":return n;default:if(0===n)return n+"'\u0131nc\u0131";var l=n%10;return n+(t[l]||t[n%100-l]||t[n>=100?100:null])}},week:{dow:1,doy:7}})}(e("PJh5"))},krPU:function(n,t,e){!function(n){"use strict";n.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(e("PJh5"))},lAP5:function(n,t,e){"use strict";t.a=function(n){return n}},lOED:function(n,t,e){!function(n){"use strict";n.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0440_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u043d\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(n){var t=n%10,e=n%100;return 0===n?n+"-\u0435\u0432":0===e?n+"-\u0435\u043d":e>10&&e<20?n+"-\u0442\u0438":1===t?n+"-\u0432\u0438":2===t?n+"-\u0440\u0438":7===t||8===t?n+"-\u043c\u0438":n+"-\u0442\u0438"},week:{dow:1,doy:7}})}(e("PJh5"))},m7yE:function(n,t,e){!function(n){"use strict";var t="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function e(n,e,l,r){var i=function(n){var e=Math.floor(n%1e3/100),l=Math.floor(n%100/10),r=n%10,i="";return e>0&&(i+=t[e]+"vatlh"),l>0&&(i+=(""!==i?" ":"")+t[l]+"maH"),r>0&&(i+=(""!==i?" ":"")+t[r]),""===i?"pagh":i}(n);switch(l){case"ss":return i+" lup";case"mm":return i+" tup";case"hh":return i+" rep";case"dd":return i+" jaj";case"MM":return i+" jar";case"yy":return i+" DIS"}}n.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(n){var t=n;return-1!==n.indexOf("jaj")?t.slice(0,-3)+"leS":-1!==n.indexOf("jar")?t.slice(0,-3)+"waQ":-1!==n.indexOf("DIS")?t.slice(0,-3)+"nem":t+" pIq"},past:function(n){var t=n;return-1!==n.indexOf("jaj")?t.slice(0,-3)+"Hu\u2019":-1!==n.indexOf("jar")?t.slice(0,-3)+"wen":-1!==n.indexOf("DIS")?t.slice(0,-3)+"ben":t+" ret"},s:"puS lup",ss:e,m:"wa\u2019 tup",mm:e,h:"wa\u2019 rep",hh:e,d:"wa\u2019 jaj",dd:e,M:"wa\u2019 jar",MM:e,y:"wa\u2019 DIS",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},nE8X:function(n,t,e){!function(n){"use strict";n.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(n){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===n},meridiem:function(n,t,e){return n<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(n){return"\u0e97\u0eb5\u0ec8"+n}})}(e("PJh5"))},nLOz:function(n,t,e){!function(n){"use strict";n.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(n){return n+(1===n?"d":n%10==2?"na":"mh")},week:{dow:1,doy:4}})}(e("PJh5"))},nS2h:function(n,t,e){!function(n){"use strict";var t="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),e=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",t[7],t[8],t[9]];function l(n,l,r,i){var o="";switch(r){case"s":return i?"muutaman sekunnin":"muutama sekunti";case"ss":return i?"sekunnin":"sekuntia";case"m":return i?"minuutin":"minuutti";case"mm":o=i?"minuutin":"minuuttia";break;case"h":return i?"tunnin":"tunti";case"hh":o=i?"tunnin":"tuntia";break;case"d":return i?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":o=i?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return i?"kuukauden":"kuukausi";case"MM":o=i?"kuukauden":"kuukautta";break;case"y":return i?"vuoden":"vuosi";case"yy":o=i?"vuoden":"vuotta"}return function(n,l){return n<10?l?e[n]:t[n]:n}(n,i)+" "+o}n.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:l,ss:l,m:l,mm:l,h:l,hh:l,d:l,dd:l,M:l,MM:l,y:l,yy:l},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},ntHu:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l,r;return"m"===e?t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===e?t?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":n+" "+(l=+n,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:t?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[e].split("_"),l%10==1&&l%100!=11?r[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?r[1]:r[2])}function e(n){return function(){return n+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}n.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(n,t){var e={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return n?e[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(t)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(t)?"genitive":"nominative"][n.day()]:e.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:e("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:e("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:e("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:e("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:t,y:"\u0440\u0456\u043a",yy:t},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(n){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(n)},meridiem:function(n,t,e){return n<4?"\u043d\u043e\u0447\u0456":n<12?"\u0440\u0430\u043d\u043a\u0443":n<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(n,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return n+"-\u0439";case"D":return n+"-\u0433\u043e";default:return n}},week:{dow:1,doy:7}})}(e("PJh5"))},oCzW:function(n,t,e){!function(n){"use strict";n.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},oo1B:function(n,t,e){!function(n){"use strict";n.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===t&&n>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===t||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===t?n+12:n},meridiem:function(n,t,e){return n<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":n<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":n<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":n<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(e("PJh5"))},ooba:function(n,t,e){!function(n){"use strict";n.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(n,t){return 12===n&&(n=0),"pagi"===t?n:"tengahari"===t?n>=11?n:n+12:"petang"===t||"malam"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"pagi":n<15?"tengahari":n<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(e("PJh5"))},"pU/0":function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(){var t=n.call(this,"argument out of range");this.name=t.name="ArgumentOutOfRangeError",this.stack=t.stack,this.message=t.message}return Object(l.__extends)(t,n),t}(Error)},pfs9:function(n,t,e){!function(n){"use strict";var t={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},e={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};n.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(n){return n.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0a30\u0a3e\u0a24"===t?n<4?n:n+12:"\u0a38\u0a35\u0a47\u0a30"===t?n:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===t?n>=10?n:n+12:"\u0a38\u0a3c\u0a3e\u0a2e"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0a30\u0a3e\u0a24":n<10?"\u0a38\u0a35\u0a47\u0a30":n<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":n<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(e("PJh5"))},rIuo:function(n,t,e){!function(n){"use strict";var t=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],e=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];n.defineLocale("dv",{months:t,monthsShort:t,weekdays:e,weekdaysShort:e,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(n){return"\u0789\u078a"===n},meridiem:function(n,t,e){return n<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(e("PJh5"))},rtsW:function(n,t,e){!function(n){"use strict";var t={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},e={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};n.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ac7\u0ab9\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(n){return n.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0ab0\u0abe\u0aa4"===t?n<4?n:n+12:"\u0ab8\u0ab5\u0abe\u0ab0"===t?n:"\u0aac\u0aaa\u0acb\u0ab0"===t?n>=10?n:n+12:"\u0ab8\u0abe\u0a82\u0a9c"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0ab0\u0abe\u0aa4":n<10?"\u0ab8\u0ab5\u0abe\u0ab0":n<17?"\u0aac\u0aaa\u0acb\u0ab0":n<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(e("PJh5"))},rxKx:function(n,t,e){var l;!function(r,i,o,s){"use strict";var a,u=["","webkit","Moz","MS","ms","o"],c=i.createElement("div"),d="function",h=Math.round,p=Math.abs,f=Date.now;function _(n,t,e){return setTimeout(x(n,e),t)}function m(n,t,e){return!!Array.isArray(n)&&(g(n,e[t],e),!0)}function g(n,t,e){var l;if(n)if(n.forEach)n.forEach(t,e);else if(n.length!==s)for(l=0;l\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",i=r.console&&(r.console.warn||r.console.log);return i&&i.call(r.console,l,e),n.apply(this,arguments)}}a="function"!=typeof Object.assign?function(n){if(n===s||null===n)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(n),e=1;e-1}function L(n){return n.trim().split(/\s+/g)}function P(n,t,e){if(n.indexOf&&!e)return n.indexOf(t);for(var l=0;le[t]}):l.sort()),l}function E(n,t){for(var e,l,r=t[0].toUpperCase()+t.slice(1),i=0;i1&&!e.firstMultiple?e.firstMultiple=tn(t):1===r&&(e.firstMultiple=!1);var i=e.firstInput,o=e.firstMultiple,a=o?o.center:i.center,u=t.center=en(l);t.timeStamp=f(),t.deltaTime=t.timeStamp-i.timeStamp,t.angle=sn(a,u),t.distance=on(a,u),function(n,t){var e=t.center,l=n.offsetDelta||{},r=n.prevDelta||{},i=n.prevInput||{};t.eventType!==F&&i.eventType!==B||(r=n.prevDelta={x:i.deltaX||0,y:i.deltaY||0},l=n.offsetDelta={x:e.x,y:e.y}),t.deltaX=r.x+(e.x-l.x),t.deltaY=r.y+(e.y-l.y)}(e,t),t.offsetDirection=rn(t.deltaX,t.deltaY);var c,d,h=ln(t.deltaTime,t.deltaX,t.deltaY);t.overallVelocityX=h.x,t.overallVelocityY=h.y,t.overallVelocity=p(h.x)>p(h.y)?h.x:h.y,t.scale=o?(c=o.pointers,on((d=l)[0],d[1],Z)/on(c[0],c[1],Z)):1,t.rotation=o?function(n,t){return sn(l[1],l[0],Z)+sn(n[1],n[0],Z)}(o.pointers):0,t.maxPointers=e.prevInput?t.pointers.length>e.prevInput.maxPointers?t.pointers.length:e.prevInput.maxPointers:t.pointers.length,function(n,t){var e,l,r,i,o=n.lastInterval||t,a=t.timeStamp-o.timeStamp;if(t.eventType!=V&&(a>N||o.velocity===s)){var u=t.deltaX-o.deltaX,c=t.deltaY-o.deltaY,d=ln(a,u,c);l=d.x,r=d.y,e=p(d.x)>p(d.y)?d.x:d.y,i=rn(u,c),n.lastInterval=t}else e=o.velocity,l=o.velocityX,r=o.velocityY,i=o.direction;t.velocity=e,t.velocityX=l,t.velocityY=r,t.direction=i}(e,t);var _=n.element;O(t.srcEvent.target,_)&&(_=t.srcEvent.target),t.target=_}(n,e),n.emit("hammer.input",e),n.recognize(e),n.session.prevInput=e}function tn(n){for(var t=[],e=0;e=p(t)?n<0?z:U:t<0?G:q}function on(n,t,e){e||(e=X);var l=t[e[0]]-n[e[0]],r=t[e[1]]-n[e[1]];return Math.sqrt(l*l+r*r)}function sn(n,t,e){return e||(e=X),180*Math.atan2(t[e[1]]-n[e[1]],t[e[0]]-n[e[0]])/Math.PI}$.prototype={handler:function(){},init:function(){this.evEl&&C(this.element,this.evEl,this.domHandler),this.evTarget&&C(this.target,this.evTarget,this.domHandler),this.evWin&&C(j(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&S(this.element,this.evEl,this.domHandler),this.evTarget&&S(this.target,this.evTarget,this.domHandler),this.evWin&&S(j(this.element),this.evWin,this.domHandler)}};var an={mousedown:F,mousemove:2,mouseup:B},un="mousedown",cn="mousemove mouseup";function dn(){this.evEl=un,this.evWin=cn,this.pressed=!1,$.apply(this,arguments)}w(dn,$,{handler:function(n){var t=an[n.type];t&F&&0===n.button&&(this.pressed=!0),2&t&&1!==n.which&&(t=B),this.pressed&&(t&B&&(this.pressed=!1),this.callback(this.manager,t,{pointers:[n],changedPointers:[n],pointerType:"mouse",srcEvent:n}))}});var hn={pointerdown:F,pointermove:2,pointerup:B,pointercancel:V,pointerout:V},pn={2:"touch",3:"pen",4:"mouse",5:"kinect"},fn="pointerdown",_n="pointermove pointerup pointercancel";function mn(){this.evEl=fn,this.evWin=_n,$.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}r.MSPointerEvent&&!r.PointerEvent&&(fn="MSPointerDown",_n="MSPointerMove MSPointerUp MSPointerCancel"),w(mn,$,{handler:function(n){var t=this.store,e=!1,l=n.type.toLowerCase().replace("ms",""),r=hn[l],i=pn[n.pointerType]||n.pointerType,o="touch"==i,s=P(t,n.pointerId,"pointerId");r&F&&(0===n.button||o)?s<0&&(t.push(n),s=t.length-1):r&(B|V)&&(e=!0),s<0||(t[s]=n,this.callback(this.manager,r,{pointers:t,changedPointers:[n],pointerType:i,srcEvent:n}),e&&t.splice(s,1))}});var gn={touchstart:F,touchmove:2,touchend:B,touchcancel:V},yn="touchstart",bn="touchstart touchmove touchend touchcancel";function vn(){this.evTarget=yn,this.evWin=bn,this.started=!1,$.apply(this,arguments)}w(vn,$,{handler:function(n){var t=gn[n.type];if(t===F&&(this.started=!0),this.started){var e=(function(n,t){var e=D(n.touches),l=D(n.changedTouches);return t&(B|V)&&(e=A(e.concat(l),"identifier",!0)),[e,l]}).call(this,n,t);t&(B|V)&&e[0].length-e[1].length==0&&(this.started=!1),this.callback(this.manager,t,{pointers:e[0],changedPointers:e[1],pointerType:"touch",srcEvent:n})}}});var wn={touchstart:F,touchmove:2,touchend:B,touchcancel:V},xn="touchstart touchmove touchend touchcancel";function Mn(){this.evTarget=xn,this.targetIds={},$.apply(this,arguments)}w(Mn,$,{handler:function(n){var t=wn[n.type],e=(function(n,t){var e=D(n.touches),l=this.targetIds;if(t&(2|F)&&1===e.length)return l[e[0].identifier]=!0,[e,e];var r,i,o=D(n.changedTouches),s=[],a=this.target;if(i=e.filter(function(n){return O(n.target,a)}),t===F)for(r=0;r-1&&l.splice(n,1)},kn)}}w(Cn,$,{handler:function(n,t,e){var l="mouse"==e.pointerType;if(!(l&&e.sourceCapabilities&&e.sourceCapabilities.firesTouchEvents)){if("touch"==e.pointerType)(function(n,t){n&F?(this.primaryTouch=t.changedPointers[0].identifier,Sn.call(this,t)):n&(B|V)&&Sn.call(this,t)}).call(this,t,e);else if(l&&(function(n){for(var t=n.srcEvent.clientX,e=n.srcEvent.clientY,l=0;l-1&&this.requireFail.splice(t,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(n){return!!this.simultaneous[n.id]},emit:function(n){var t=this,e=this.state;function l(e){t.manager.emit(e,n)}e=Yn&&l(t.options.event+Hn(e))},tryEmit:function(n){if(this.canEmit())return this.emit(n);this.state=32},canEmit:function(){for(var n=0;nt.threshold&&r&t.direction},attrTest:function(n){return Bn.prototype.attrTest.call(this,n)&&(this.state&An||!(this.state&An)&&this.directionTest(n))},emit:function(n){this.pX=n.deltaX,this.pY=n.deltaY;var t=Nn(n.direction);t&&(n.additionalEvent=this.options.event+t),this._super.emit.call(this,n)}}),w(Wn,Bn,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(n){return this._super.attrTest.call(this,n)&&(Math.abs(n.scale-1)>this.options.threshold||this.state&An)},emit:function(n){1!==n.scale&&(n.additionalEvent=this.options.event+(n.scale<1?"in":"out")),this._super.emit.call(this,n)}}),w(zn,Rn,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return["auto"]},process:function(n){var t=this.options,e=n.pointers.length===t.pointers,l=n.distancet.time;if(this._input=n,!l||!e||n.eventType&(B|V)&&!r)this.reset();else if(n.eventType&F)this.reset(),this._timer=_(function(){this.state=jn,this.tryEmit()},t.time,this);else if(n.eventType&B)return jn;return 32},reset:function(){clearTimeout(this._timer)},emit:function(n){this.state===jn&&(n&&n.eventType&B?this.manager.emit(this.options.event+"up",n):(this._input.timeStamp=f(),this.manager.emit(this.options.event,this._input)))}}),w(Un,Bn,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(n){return this._super.attrTest.call(this,n)&&(Math.abs(n.rotation)>this.options.threshold||this.state&An)}}),w(Gn,Bn,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:J|Q,pointers:1},getTouchAction:function(){return Vn.prototype.getTouchAction.call(this)},attrTest:function(n){var t,e=this.options.direction;return e&(J|Q)?t=n.overallVelocity:e&J?t=n.overallVelocityX:e&Q&&(t=n.overallVelocityY),this._super.attrTest.call(this,n)&&e&n.offsetDirection&&n.distance>this.options.threshold&&n.maxPointers==this.options.pointers&&p(t)>this.options.velocity&&n.eventType&B},emit:function(n){var t=Nn(n.offsetDirection);t&&this.manager.emit(this.options.event+t,n),this.manager.emit(this.options.event,n)}}),w(qn,Rn,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return["manipulation"]},process:function(n){var t=this.options,e=n.pointers.length===t.pointers,l=n.distance1&&n<5&&1!=~~(n/10)}function r(n,t,e,r){var i=n+" ";switch(e){case"s":return t||r?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return t||r?i+(l(n)?"sekundy":"sekund"):i+"sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?i+(l(n)?"minuty":"minut"):i+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(l(n)?"hodiny":"hodin"):i+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?i+(l(n)?"dny":"dn\xed"):i+"dny";case"M":return t||r?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return t||r?i+(l(n)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):i+"m\u011bs\xedci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?i+(l(n)?"roky":"let"):i+"lety"}}n.defineLocale("cs",{months:t,monthsShort:e,monthsParse:function(n,t){var e,l=[];for(e=0;e<12;e++)l[e]=new RegExp("^"+n[e]+"$|^"+t[e]+"$","i");return l}(t,e),shortMonthsParse:function(n){var t,e=[];for(t=0;t<12;t++)e[t]=new RegExp("^"+n[t]+"$","i");return e}(e),longMonthsParse:function(n){var t,e=[];for(t=0;t<12;t++)e[t]=new RegExp("^"+n[t]+"$","i");return e}(t),weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},svD2:function(n,t,e){!function(n){"use strict";var t={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(n,t){return 1===n?t[0]:n>=2&&n<=4?t[1]:t[2]},translate:function(n,e,l){var r=t.words[l];return 1===l.length?e?r[0]:r[1]:n+" "+t.correctGrammaticalCase(n,r)}};n.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mjesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},t7NR:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l={closed:!0,next:function(n){},error:function(n){throw n},complete:function(){}}},tLDX:function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("AMGY").a.Symbol,r="function"==typeof l&&"function"==typeof l.for?l.for("rxSubscriber"):"@@rxSubscriber"},tZ2B:function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(){n.apply(this,arguments)}return Object(l.__extends)(t,n),t.prototype.notifyNext=function(n,t,e,l,r){this.destination.next(t)},t.prototype.notifyError=function(n,t){this.destination.error(n)},t.prototype.notifyComplete=function(n){this.destination.complete()},t}(e("OVmG").a)},tkWw:function(n,t,e){!function(n){"use strict";n.defineLocale("ar-dz",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u0623\u062d_\u0625\u062b_\u062b\u0644\u0627_\u0623\u0631_\u062e\u0645_\u062c\u0645_\u0633\u0628".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:4}})}(e("PJh5"))},tzHd:function(n,t,e){!function(n){"use strict";n.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(n,t){switch(t){case"D":return n+(1===n?"er":"");default:case"M":case"Q":case"DDD":case"d":return n+(1===n?"er":"e");case"w":case"W":return n+(1===n?"re":"e")}},week:{dow:1,doy:4}})}(e("PJh5"))},uSe8:function(n,t,e){!function(n){"use strict";var t=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],e=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];n.defineLocale("ur",{months:t,monthsShort:t,weekdays:e,weekdaysShort:e,weekdaysMin:e,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(n){return"\u0634\u0627\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(e("PJh5"))},ujcs:function(n,t){t.read=function(n,t,e,l,r){var i,o,s=8*r-l-1,a=(1<>1,c=-7,d=e?r-1:0,h=e?-1:1,p=n[t+d];for(d+=h,i=p&(1<<-c)-1,p>>=-c,c+=s;c>0;i=256*i+n[t+d],d+=h,c-=8);for(o=i&(1<<-c)-1,i>>=-c,c+=l;c>0;o=256*o+n[t+d],d+=h,c-=8);if(0===i)i=1-u;else{if(i===a)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,l),i-=u}return(p?-1:1)*o*Math.pow(2,i-l)},t.write=function(n,t,e,l,r,i){var o,s,a,u=8*i-r-1,c=(1<>1,h=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,p=l?0:i-1,f=l?1:-1,_=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,o=c):(o=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-o))<1&&(o--,a*=2),(t+=o+d>=1?h/a:h*Math.pow(2,1-d))*a>=2&&(o++,a/=2),o+d>=c?(s=0,o=c):o+d>=1?(s=(t*a-1)*Math.pow(2,r),o+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,r),o=0));r>=8;n[e+p]=255&s,p+=f,s/=256,r-=8);for(o=o<0;n[e+p]=255&o,p+=f,o/=256,u-=8);n[e+p-f]|=128*_}},ulq9:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l,r;return"m"===e?t?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":n+" "+(l=+n,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[e].split("_"),l%10==1&&l%100!=11?r[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?r[1]:r[2])}var e=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];n.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?\] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:e,longMonthsParse:e,shortMonthsParse:e,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430 \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",nextWeek:function(n){if(n.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd [\u0432] LT"}},lastWeek:function(n){if(n.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0447\u0430\u0441",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(n){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(n)},meridiem:function(n,t,e){return n<4?"\u043d\u043e\u0447\u0438":n<12?"\u0443\u0442\u0440\u0430":n<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(n,t){switch(t){case"M":case"d":case"DDD":return n+"-\u0439";case"D":return n+"-\u0433\u043e";case"w":case"W":return n+"-\u044f";default:return n}},week:{dow:1,doy:4}})}(e("PJh5"))},uotZ:function(n,t,e){var l;!function(r){"use strict";var i,o=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,s=Math.ceil,a=Math.floor,u="[BigNumber Error] ",c=u+"Number primitive has more than 15 significant digits: ",d=1e14,h=14,p=9007199254740991,f=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],_=1e7;function m(n){var t=0|n;return n>0||n===t?t:t-1}function g(n){for(var t,e,l=1,r=n.length,i=n[0]+"";lu^e?1:-1;for(s=(a=r.length)<(u=i.length)?a:u,o=0;oi[o]^e?1:-1;return a==u?0:a>u^e?1:-1}function b(n,t,e,l){if(ne||n!==(n<0?s(n):a(n)))throw Error(u+(l||"Argument")+("number"==typeof n?ne?" out of range: ":" not an integer: ":" not a primitive number: ")+n)}function v(n){return"[object Array]"==Object.prototype.toString.call(n)}function w(n){var t=n.c.length-1;return m(n.e/h)==t&&n.c[t]%2!=0}function x(n,t){return(n.length>1?n.charAt(0)+"."+n.slice(1):n)+(t<0?"e":"e+")+t}function M(n,t,e){var l,r;if(t<0){for(r=e+".";++t;r+=e);n=r+n}else if(++t>(l=n.length)){for(r=e,t-=l;--t;r+=e);n+=r}else t=10;d/=10,u++);return g.e=u,void(g.c=[n])}m=n+""}else{if(!o.test(m=n+""))return r(g,m,f);g.s=45==m.charCodeAt(0)?(m=m.slice(1),-1):1}(u=m.indexOf("."))>-1&&(m=m.replace(".","")),(d=m.search(/e/i))>0?(u<0&&(u=d),u+=+m.slice(d+1),m=m.substring(0,d)):u<0&&(u=m.length)}else{if(b(t,2,B.length,"Base"),m=n+"",10==t)return G(g=new V(n instanceof V?n:m),D+g.e+1,A);if(f="number"==typeof n){if(0*n!=0)return r(g,m,f,t);if(g.s=1/n<0?(m=m.slice(1),-1):1,V.DEBUG&&m.replace(/^0\.0*|\./,"").length>15)throw Error(c+n);f=!1}else g.s=45===m.charCodeAt(0)?(m=m.slice(1),-1):1;for(e=B.slice(0,t),u=d=0,_=m.length;d<_;d++)if(e.indexOf(i=m.charAt(d))<0){if("."==i){if(d>u){u=_;continue}}else if(!s&&(m==m.toUpperCase()&&(m=m.toLowerCase())||m==m.toLowerCase()&&(m=m.toUpperCase()))){s=!0,d=-1,u=0;continue}return r(g,n+"",f,t)}(u=(m=l(m,t,10,g.s)).indexOf("."))>-1?m=m.replace(".",""):u=m.length}for(d=0;48===m.charCodeAt(d);d++);for(_=m.length;48===m.charCodeAt(--_););if(m=m.slice(d,++_)){if(_-=d,f&&V.DEBUG&&_>15&&(n>p||n!==a(n)))throw Error(c+g.s*n);if((u=u-d-1)>I)g.c=g.e=null;else if(us){if(--t>0)for(a+=".";t--;a+="0");}else if((t+=i-s)>0)for(i+1==s&&(a+=".");t--;a+="0");return n.s<0&&r?"-"+a:a}function z(n,t){var e,l,r=0;for(v(n[0])&&(n=n[0]),e=new V(n[0]);++r=10;r/=10,l++);return(e=l+e*h-1)>I?n.c=n.e=null:e=10;u/=10,r++);if((i=t-r)<0)i+=h,_=(c=m[p=0])/g[r-(o=t)-1]%10|0;else if((p=s((i+1)/h))>=m.length){if(!l)break n;for(;m.length<=p;m.push(0));c=_=0,r=1,o=(i%=h)-h+1}else{for(c=u=m[p],r=1;u>=10;u/=10,r++);_=(o=(i%=h)-h+r)<0?0:c/g[r-o-1]%10|0}if(l=l||t<0||null!=m[p+1]||(o<0?c:c%g[r-o-1]),l=e<4?(_||l)&&(0==e||e==(n.s<0?3:2)):_>5||5==_&&(4==e||l||6==e&&(i>0?o>0?c/g[r-o]:0:m[p-1])%10&1||e==(n.s<0?8:7)),t<1||!m[0])return m.length=0,l?(m[0]=g[(h-(t-=n.e+1)%h)%h],n.e=-t||0):m[0]=n.e=0,n;if(0==i?(m.length=p,u=1,p--):(m.length=p+1,u=g[h-i],m[p]=o>0?a(c/g[r-o]%g[o])*u:0),l)for(;;){if(0==p){for(i=1,o=m[0];o>=10;o/=10,i++);for(o=m[0]+=u,u=1;o>=10;o/=10,u++);i!=u&&(n.e++,m[0]==d&&(m[0]=1));break}if(m[p]+=u,m[p]!=d)break;m[p--]=0,u=1}for(i=m.length;0===m[--i];m.pop());}n.e>I?n.c=n.e=null:n.e>>11))>=9e15?(e=crypto.getRandomValues(new Uint32Array(2)),t[c]=e[0],t[c+1]=e[1]):(d.push(o%1e14),c+=2);c=r/2}else{if(!crypto.randomBytes)throw R=!1,Error(u+"crypto unavailable");for(t=crypto.randomBytes(r*=7);c=9e15?crypto.randomBytes(7).copy(t,c):(d.push(o%1e14),c+=7);c=r/7}if(!R)for(;c=10;o/=10,c++);ce-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/e|0,o[r]%=e)}return o.reverse()}return function(t,l,r,i,o){var s,a,u,c,d,h,p,f,_=t.indexOf("."),m=D,y=A;for(_>=0&&(c=N,N=0,t=t.replace(".",""),h=(f=new V(l)).pow(t.length-_),N=c,f.c=n(M(g(h.c),h.e,"0"),10,r,"0123456789"),f.e=f.c.length),u=c=(p=n(t,l,r,o?(s=B,"0123456789"):(s="0123456789",B))).length;0==p[--c];p.pop());if(!p[0])return s.charAt(0);if(_<0?--u:(h.c=p,h.e=u,h.s=i,p=(h=e(h,f,m,y,r)).c,d=h.r,u=h.e),_=p[a=u+m+1],c=r/2,d=d||a<0||null!=p[a+1],d=y<4?(null!=_||d)&&(0==y||y==(h.s<0?3:2)):_>c||_==c&&(4==y||d||6==y&&1&p[a-1]||y==(h.s<0?8:7)),a<1||!p[0])t=d?M(s.charAt(1),-m,s.charAt(0)):s.charAt(0);else{if(p.length=a,d)for(--r;++p[--a]>r;)p[a]=0,a||(++u,p=[1].concat(p));for(c=p.length;!p[--c];);for(_=0,t="";_<=c;t+=s.charAt(p[_++]));t=M(t,u,s.charAt(0))}return t}}(),e=function(){function n(n,t,e){var l,r,i,o,s=0,a=n.length,u=t%_,c=t/_|0;for(n=n.slice();a--;)s=((r=u*(i=n[a]%_)+(l=c*i+(o=n[a]/_|0)*u)%_*_+s)/e|0)+(l/_|0)+c*o,n[a]=r%e;return s&&(n=[s].concat(n)),n}function t(n,t,e,l){var r,i;if(e!=l)i=e>l?1:-1;else for(r=i=0;rt[r]?1:-1;break}return i}function e(n,t,e,l){for(var r=0;e--;)n[e]-=r,n[e]=(r=n[e]1;n.splice(0,1));}return function(l,r,i,o,s){var u,c,p,f,_,g,y,b,v,w,x,M,k,C,S,O,T,L=l.s==r.s?1:-1,P=l.c,D=r.c;if(!(P&&P[0]&&D&&D[0]))return new V(l.s&&r.s&&(P?!D||P[0]!=D[0]:D)?P&&0==P[0]||!D?0*L:L/0:NaN);for(v=(b=new V(L)).c=[],L=i+(c=l.e-r.e)+1,s||(s=d,c=m(l.e/h)-m(r.e/h),L=L/h|0),p=0;D[p]==(P[p]||0);p++);if(D[p]>(P[p]||0)&&c--,L<0)v.push(1),f=!0;else{for(C=P.length,O=D.length,p=0,L+=2,(_=a(s/(D[0]+1)))>1&&(D=n(D,_,s),P=n(P,_,s),O=D.length,C=P.length),k=O,x=(w=P.slice(0,O)).length;x=s/2&&S++;do{if(_=0,(u=t(D,w,O,x))<0){if(M=w[0],O!=x&&(M=M*s+(w[1]||0)),(_=a(M/S))>1)for(_>=s&&(_=s-1),y=(g=n(D,_,s)).length,x=w.length;1==t(g,w,y,x);)_--,e(g,O=10;L/=10,p++);G(b,i+(b.e=p+c*h-1)+1,o,f)}else b.e=c,b.r=+f;return b}}(),k=/^(-?)0([xbo])(?=\w[\w.]*$)/i,C=/^([^.]+)\.$/,S=/^\.([^.]+)$/,O=/^-?(Infinity|NaN)$/,T=/^\s*\+(?=[\w.])|^\s+|\s+$/g,r=function(n,t,e,l){var r,i=e?t:t.replace(T,"");if(O.test(i))n.s=isNaN(i)?null:i<0?-1:1,n.c=n.e=null;else{if(!e&&(i=i.replace(k,function(n,t,e){return r="x"==(e=e.toLowerCase())?16:"b"==e?2:8,l&&l!=r?n:t}),l&&(r=l,i=i.replace(C,"$1").replace(S,"0.$1")),t!=i))return new V(i,r);if(V.DEBUG)throw Error(u+"Not a"+(l?" base "+l:"")+" number: "+t);n.c=n.e=n.s=null}},L.absoluteValue=L.abs=function(){var n=new V(this);return n.s<0&&(n.s=1),n},L.comparedTo=function(n,t){return y(this,new V(n,t))},L.decimalPlaces=L.dp=function(n,t){var e,l,r,i=this;if(null!=n)return b(n,0,1e9),null==t?t=A:b(t,0,8),G(new V(i),n+i.e+1,t);if(!(e=i.c))return null;if(l=((r=e.length-1)-m(this.e/h))*h,r=e[r])for(;r%10==0;r/=10,l--);return l<0&&(l=0),l},L.dividedBy=L.div=function(n,t){return e(this,new V(n,t),D,A)},L.dividedToIntegerBy=L.idiv=function(n,t){return e(this,new V(n,t),0,1)},L.exponentiatedBy=L.pow=function(n,t){var e,l,r,i,o,c,d,p=this;if((n=new V(n)).c&&!n.isInteger())throw Error(u+"Exponent not an integer: "+n);if(null!=t&&(t=new V(t)),i=n.e>14,!p.c||!p.c[0]||1==p.c[0]&&!p.e&&1==p.c.length||!n.c||!n.c[0])return d=new V(Math.pow(+p.valueOf(),i?2-w(n):+n)),t?d.mod(t):d;if(o=n.s<0,t){if(t.c?!t.c[0]:!t.s)return new V(NaN);(l=!o&&p.isInteger()&&t.isInteger())&&(p=p.mod(t))}else{if(n.e>9&&(p.e>0||p.e<-1||(0==p.e?p.c[0]>1||i&&p.c[1]>=24e7:p.c[0]<8e13||i&&p.c[0]<=9999975e7)))return r=p.s<0&&w(n)?-0:0,p.e>-1&&(r=1/r),new V(o?1/r:r);N&&(r=s(N/h+2))}for(i?(e=new V(.5),c=w(n)):c=n%2,o&&(n.s=1),d=new V(P);;){if(c){if(!(d=d.times(p)).c)break;r?d.c.length>r&&(d.c.length=r):l&&(d=d.mod(t))}if(i){if(G(n=n.times(e),n.e+1,1),!n.c[0])break;i=n.e>14,c=w(n)}else{if(!(n=a(n/2)))break;c=n%2}p=p.times(p),r?p.c&&p.c.length>r&&(p.c.length=r):l&&(p=p.mod(t))}return l?d:(o&&(d=P.div(d)),t?d.mod(t):r?G(d,N,A,void 0):d)},L.integerValue=function(n){var t=new V(this);return null==n?n=A:b(n,0,8),G(t,t.e+1,n)},L.isEqualTo=L.eq=function(n,t){return 0===y(this,new V(n,t))},L.isFinite=function(){return!!this.c},L.isGreaterThan=L.gt=function(n,t){return y(this,new V(n,t))>0},L.isGreaterThanOrEqualTo=L.gte=function(n,t){return 1===(t=y(this,new V(n,t)))||0===t},L.isInteger=function(){return!!this.c&&m(this.e/h)>this.c.length-2},L.isLessThan=L.lt=function(n,t){return y(this,new V(n,t))<0},L.isLessThanOrEqualTo=L.lte=function(n,t){return-1===(t=y(this,new V(n,t)))||0===t},L.isNaN=function(){return!this.s},L.isNegative=function(){return this.s<0},L.isPositive=function(){return this.s>0},L.isZero=function(){return!!this.c&&0==this.c[0]},L.minus=function(n,t){var e,l,r,i,o=this,s=o.s;if(t=(n=new V(n,t)).s,!s||!t)return new V(NaN);if(s!=t)return n.s=-t,o.plus(n);var a=o.e/h,u=n.e/h,c=o.c,p=n.c;if(!a||!u){if(!c||!p)return c?(n.s=-t,n):new V(p?o:NaN);if(!c[0]||!p[0])return p[0]?(n.s=-t,n):new V(c[0]?o:3==A?-0:0)}if(a=m(a),u=m(u),c=c.slice(),s=a-u){for((i=s<0)?(s=-s,r=c):(u=a,r=p),r.reverse(),t=s;t--;r.push(0));r.reverse()}else for(l=(i=(s=c.length)<(t=p.length))?s:t,s=t=0;t0)for(;t--;c[e++]=0);for(t=d-1;l>s;){if(c[--l]=0;){for(e=0,f=M[r]%v,g=M[r]/v|0,i=r+(o=a);i>r;)e=((u=f*(u=x[--o]%v)+(s=g*u+(c=x[o]/v|0)*f)%v*v+y[i]+e)/b|0)+(s/v|0)+g*c,y[i--]=u%b;y[i]=e}return e?++l:y.splice(0,1),U(n,y,l)},L.negated=function(){var n=new V(this);return n.s=-n.s||null,n},L.plus=function(n,t){var e,l=this,r=l.s;if(t=(n=new V(n,t)).s,!r||!t)return new V(NaN);if(r!=t)return n.s=-t,l.minus(n);var i=l.e/h,o=n.e/h,s=l.c,a=n.c;if(!i||!o){if(!s||!a)return new V(r/0);if(!s[0]||!a[0])return a[0]?n:new V(s[0]?l:0*r)}if(i=m(i),o=m(o),s=s.slice(),r=i-o){for(r>0?(o=i,e=a):(r=-r,e=s),e.reverse();r--;e.push(0));e.reverse()}for((r=s.length)-(t=a.length)<0&&(e=a,a=s,s=e,t=r),r=0;t;)r=(s[--t]=s[t]+a[t]+r)/d|0,s[t]=d===s[t]?0:s[t]%d;return r&&(s=[r].concat(s),++o),U(n,s,o)},L.precision=L.sd=function(n,t){var e,l,r,i=this;if(null!=n&&n!==!!n)return b(n,1,1e9),null==t?t=A:b(t,0,8),G(new V(i),n,t);if(!(e=i.c))return null;if(l=(r=e.length-1)*h+1,r=e[r]){for(;r%10==0;r/=10,l--);for(r=e[0];r>=10;r/=10,l++);}return n&&i.e+1>l&&(l=i.e+1),l},L.shiftedBy=function(n){return b(n,-p,p),this.times("1e"+n)},L.squareRoot=L.sqrt=function(){var n,t,l,r,i,o=this,s=o.c,a=o.s,u=o.e,c=D+4,d=new V("0.5");if(1!==a||!s||!s[0])return new V(!a||a<0&&(!s||s[0])?NaN:s?o:1/0);if(0==(a=Math.sqrt(+o))||a==1/0?(((t=g(s)).length+u)%2==0&&(t+="0"),a=Math.sqrt(t),u=m((u+1)/2)-(u<0||u%2),l=new V(t=a==1/0?"1e"+u:(t=a.toExponential()).slice(0,t.indexOf("e")+1)+u)):l=new V(a+""),l.c[0])for((a=(u=l.e)+c)<3&&(a=0);;)if(l=d.times((i=l).plus(e(o,i,c,1))),g(i.c).slice(0,a)===(t=g(l.c)).slice(0,a)){if(l.e0&&h>0){for(a=d.substr(0,l=h%i||i);l0&&(a+=s+d.slice(l)),c&&(a="-"+a)}e=u?a+F.decimalSeparator+((o=+F.fractionGroupSize)?u.replace(new RegExp("\\d{"+o+"}\\B","g"),"$&"+F.fractionGroupSeparator):u):a}return e},L.toFraction=function(n){var t,l,r,i,o,s,a,c,d,p,_,m,y=this,b=y.c;if(null!=n&&(!(c=new V(n)).isInteger()&&(c.c||1!==c.s)||c.lt(P)))throw Error(u+"Argument "+(c.isInteger()?"out of range: ":"not an integer: ")+n);if(!b)return y.toString();for(l=new V(P),p=r=new V(P),i=d=new V(P),m=g(b),s=l.e=m.length-y.e-1,l.c[0]=f[(a=s%h)<0?h+a:a],n=!n||c.comparedTo(l)>0?s>0?l:p:c,a=I,I=1/0,c=new V(m),d.c[0]=0;_=e(c,l,0,1),1!=(o=r.plus(_.times(i))).comparedTo(n);)r=i,i=o,p=d.plus(_.times(o=p)),d=o,l=c.minus(_.times(o=l)),c=o;return o=e(n.minus(r),i,0,1),d=d.plus(o.times(p)),r=r.plus(o.times(i)),d.s=p.s=y.s,t=e(p,i,s*=2,A).minus(y).abs().comparedTo(e(d,r,s,A).minus(y).abs())<1?[p.toString(),i.toString()]:[d.toString(),r.toString()],I=a,t},L.toNumber=function(){return+this},L.toPrecision=function(n,t){return null!=n&&b(n,1,1e9),W(this,n,t,2)},L.toString=function(n){var t,e=this,r=e.s,i=e.e;return null===i?r?(t="Infinity",r<0&&(t="-"+t)):t="NaN":(t=g(e.c),null==n?t=i<=E||i>=Y?x(t,i):M(t,i,"0"):(b(n,2,B.length,"Base"),t=l(M(t,i,"0"),10,n,r,!0)),r<0&&e.c[0]&&(t="-"+t)),t},L.valueOf=L.toJSON=function(){var n,t=this,e=t.e;return null===e?t.toString():(n=g(t.c),n=e<=E||e>=Y?x(n,e):M(n,e,"0"),t.s<0?"-"+n:n)},L._isBigNumber=!0,null!=t&&V.set(t),V}()).default=i.BigNumber=i,void 0===(l=(function(){return i}).call(t,e,t,n))||(n.exports=l)}()},upln:function(n,t,e){!function(n){"use strict";function t(n){return n%100==11||n%10!=1}function e(n,e,l,r){var i=n+" ";switch(l){case"s":return e||r?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return t(n)?i+(e||r?"sek\xfandur":"sek\xfandum"):i+"sek\xfanda";case"m":return e?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return t(n)?i+(e||r?"m\xedn\xfatur":"m\xedn\xfatum"):e?i+"m\xedn\xfata":i+"m\xedn\xfatu";case"hh":return t(n)?i+(e||r?"klukkustundir":"klukkustundum"):i+"klukkustund";case"d":return e?"dagur":r?"dag":"degi";case"dd":return t(n)?e?i+"dagar":i+(r?"daga":"d\xf6gum"):e?i+"dagur":i+(r?"dag":"degi");case"M":return e?"m\xe1nu\xf0ur":r?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return t(n)?e?i+"m\xe1nu\xf0ir":i+(r?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):e?i+"m\xe1nu\xf0ur":i+(r?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return e||r?"\xe1r":"\xe1ri";case"yy":return t(n)?i+(e||r?"\xe1r":"\xe1rum"):i+(e||r?"\xe1r":"\xe1ri")}}n.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:e,ss:e,m:e,mm:e,h:"klukkustund",hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},uslO:function(n,t,e){var l={"./af":"3CJN","./af.js":"3CJN","./ar":"3MVc","./ar-dz":"tkWw","./ar-dz.js":"tkWw","./ar-kw":"j8cJ","./ar-kw.js":"j8cJ","./ar-ly":"wPpW","./ar-ly.js":"wPpW","./ar-ma":"dURR","./ar-ma.js":"dURR","./ar-sa":"7OnE","./ar-sa.js":"7OnE","./ar-tn":"BEem","./ar-tn.js":"BEem","./ar.js":"3MVc","./az":"eHwN","./az.js":"eHwN","./be":"3hfc","./be.js":"3hfc","./bg":"lOED","./bg.js":"lOED","./bm":"hng5","./bm.js":"hng5","./bn":"aM0x","./bn.js":"aM0x","./bo":"w2Hs","./bo.js":"w2Hs","./br":"OSsP","./br.js":"OSsP","./bs":"aqvp","./bs.js":"aqvp","./ca":"wIgY","./ca.js":"wIgY","./cs":"ssxj","./cs.js":"ssxj","./cv":"N3vo","./cv.js":"N3vo","./cy":"ZFGz","./cy.js":"ZFGz","./da":"YBA/","./da.js":"YBA/","./de":"DOkx","./de-at":"8v14","./de-at.js":"8v14","./de-ch":"Frex","./de-ch.js":"Frex","./de.js":"DOkx","./dv":"rIuo","./dv.js":"rIuo","./el":"CFqe","./el.js":"CFqe","./en-au":"Sjoy","./en-au.js":"Sjoy","./en-ca":"Tqun","./en-ca.js":"Tqun","./en-gb":"hPuz","./en-gb.js":"hPuz","./en-ie":"ALEw","./en-ie.js":"ALEw","./en-il":"QZk1","./en-il.js":"QZk1","./en-nz":"dyB6","./en-nz.js":"dyB6","./eo":"Nd3h","./eo.js":"Nd3h","./es":"LT9G","./es-do":"7MHZ","./es-do.js":"7MHZ","./es-us":"INcR","./es-us.js":"INcR","./es.js":"LT9G","./et":"XlWM","./et.js":"XlWM","./eu":"sqLM","./eu.js":"sqLM","./fa":"2pmY","./fa.js":"2pmY","./fi":"nS2h","./fi.js":"nS2h","./fo":"OVPi","./fo.js":"OVPi","./fr":"tzHd","./fr-ca":"bXQP","./fr-ca.js":"bXQP","./fr-ch":"VK9h","./fr-ch.js":"VK9h","./fr.js":"tzHd","./fy":"g7KF","./fy.js":"g7KF","./gd":"nLOz","./gd.js":"nLOz","./gl":"FuaP","./gl.js":"FuaP","./gom-latn":"+27R","./gom-latn.js":"+27R","./gu":"rtsW","./gu.js":"rtsW","./he":"Nzt2","./he.js":"Nzt2","./hi":"ETHv","./hi.js":"ETHv","./hr":"V4qH","./hr.js":"V4qH","./hu":"xne+","./hu.js":"xne+","./hy-am":"GrS7","./hy-am.js":"GrS7","./id":"yRTJ","./id.js":"yRTJ","./is":"upln","./is.js":"upln","./it":"FKXc","./it.js":"FKXc","./ja":"ORgI","./ja.js":"ORgI","./jv":"JwiF","./jv.js":"JwiF","./ka":"RnJI","./ka.js":"RnJI","./kk":"j+vx","./kk.js":"j+vx","./km":"5j66","./km.js":"5j66","./kn":"gEQe","./kn.js":"gEQe","./ko":"eBB/","./ko.js":"eBB/","./ky":"6cf8","./ky.js":"6cf8","./lb":"z3hR","./lb.js":"z3hR","./lo":"nE8X","./lo.js":"nE8X","./lt":"/6P1","./lt.js":"/6P1","./lv":"jxEH","./lv.js":"jxEH","./me":"svD2","./me.js":"svD2","./mi":"gEU3","./mi.js":"gEU3","./mk":"Ab7C","./mk.js":"Ab7C","./ml":"oo1B","./ml.js":"oo1B","./mr":"5vPg","./mr.js":"5vPg","./ms":"ooba","./ms-my":"G++c","./ms-my.js":"G++c","./ms.js":"ooba","./mt":"oCzW","./mt.js":"oCzW","./my":"F+2e","./my.js":"F+2e","./nb":"FlzV","./nb.js":"FlzV","./ne":"/mhn","./ne.js":"/mhn","./nl":"3K28","./nl-be":"Bp2f","./nl-be.js":"Bp2f","./nl.js":"3K28","./nn":"C7av","./nn.js":"C7av","./pa-in":"pfs9","./pa-in.js":"pfs9","./pl":"7LV+","./pl.js":"7LV+","./pt":"ZoSI","./pt-br":"AoDM","./pt-br.js":"AoDM","./pt.js":"ZoSI","./ro":"wT5f","./ro.js":"wT5f","./ru":"ulq9","./ru.js":"ulq9","./sd":"fW1y","./sd.js":"fW1y","./se":"5Omq","./se.js":"5Omq","./si":"Lgqo","./si.js":"Lgqo","./sk":"OUMt","./sk.js":"OUMt","./sl":"2s1U","./sl.js":"2s1U","./sq":"V0td","./sq.js":"V0td","./sr":"f4W3","./sr-cyrl":"c1x4","./sr-cyrl.js":"c1x4","./sr.js":"f4W3","./ss":"7Q8x","./ss.js":"7Q8x","./sv":"Fpqq","./sv.js":"Fpqq","./sw":"DSXN","./sw.js":"DSXN","./ta":"+7/x","./ta.js":"+7/x","./te":"Nlnz","./te.js":"Nlnz","./tet":"gUgh","./tet.js":"gUgh","./tg":"5SNd","./tg.js":"5SNd","./th":"XzD+","./th.js":"XzD+","./tl-ph":"3LKG","./tl-ph.js":"3LKG","./tlh":"m7yE","./tlh.js":"m7yE","./tr":"k+5o","./tr.js":"k+5o","./tzl":"iNtv","./tzl.js":"iNtv","./tzm":"FRPF","./tzm-latn":"krPU","./tzm-latn.js":"krPU","./tzm.js":"FRPF","./ug-cn":"To0v","./ug-cn.js":"To0v","./uk":"ntHu","./uk.js":"ntHu","./ur":"uSe8","./ur.js":"uSe8","./uz":"XU1s","./uz-latn":"/bsm","./uz-latn.js":"/bsm","./uz.js":"XU1s","./vi":"0X8Q","./vi.js":"0X8Q","./x-pseudo":"e/KL","./x-pseudo.js":"e/KL","./yo":"YXlc","./yo.js":"YXlc","./zh-cn":"Vz2w","./zh-cn.js":"Vz2w","./zh-hk":"ZUyn","./zh-hk.js":"ZUyn","./zh-tw":"BbgG","./zh-tw.js":"BbgG"};function r(n){return e(i(n))}function i(n){var t=l[n];if(!(t+1))throw new Error("Cannot find module '"+n+"'.");return t}r.keys=function(){return Object.keys(l)},r.resolve=i,n.exports=r,r.id="uslO"},w2Hs:function(n,t,e){!function(n){"use strict";var t={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},e={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};n.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(n){return n.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===t&&n>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===t&&n<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===t?n+12:n},meridiem:function(n,t,e){return n<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":n<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":n<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":n<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(e("PJh5"))},wIgY:function(n,t,e){!function(n){"use strict";n.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(n,t){var e=1===n?"r":2===n?"n":3===n?"r":4===n?"t":"\xe8";return"w"!==t&&"W"!==t||(e="a"),n+e},week:{dow:1,doy:4}})}(e("PJh5"))},wPpW:function(n,t,e){!function(n){"use strict";var t={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},e=function(n){return 0===n?0:1===n?1:2===n?2:n%100>=3&&n%100<=10?3:n%100>=11?4:5},l={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},r=function(n){return function(t,r,i,o){var s=e(t),a=l[n][e(t)];return 2===s&&(a=a[r?0:1]),a.replace(/%d/i,t)}},i=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];n.defineLocale("ar-ly",{months:i,monthsShort:i,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(n){return"\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(e("PJh5"))},wT5f:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l=" ";return(n%100>=20||n>=100&&n%100==0)&&(l=" de "),n+l+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[e]}n.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:t,m:"un minut",mm:t,h:"o or\u0103",hh:t,d:"o zi",dd:t,M:"o lun\u0103",MM:t,y:"un an",yy:t},week:{dow:1,doy:7}})}(e("PJh5"))},x35b:function(n,t,e){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l=e("WT6e"),r={nodeUrl:"/api/",production:!0,tellerUrl:"https://event.skycoin.com/api/",swaplab:{apiKey:"w4bxe2tbf9beb72r",activateTestMode:!1,endStatusInError:!1}},i=(e("rxKx"),e("TToO")),o=e("YaPU"),s=function(){},a=new l.r("Location Initialized"),u=function(){},c=new l.r("appBaseHref"),d=function(){function n(t){var e=this;this._subject=new l.o,this._platformStrategy=t;var r=this._platformStrategy.getBaseHref();this._baseHref=n.stripTrailingSlash(h(r)),this._platformStrategy.onPopState(function(n){e._subject.emit({url:e.path(!0),pop:!0,type:n.type})})}return n.prototype.path=function(n){return void 0===n&&(n=!1),this.normalize(this._platformStrategy.path(n))},n.prototype.isCurrentPathEqualTo=function(t,e){return void 0===e&&(e=""),this.path()==this.normalize(t+n.normalizeQueryParams(e))},n.prototype.normalize=function(t){return n.stripTrailingSlash(function(n,t){return n&&t.startsWith(n)?t.substring(n.length):t}(this._baseHref,h(t)))},n.prototype.prepareExternalUrl=function(n){return n&&"/"!==n[0]&&(n="/"+n),this._platformStrategy.prepareExternalUrl(n)},n.prototype.go=function(n,t){void 0===t&&(t=""),this._platformStrategy.pushState(null,"",n,t)},n.prototype.replaceState=function(n,t){void 0===t&&(t=""),this._platformStrategy.replaceState(null,"",n,t)},n.prototype.forward=function(){this._platformStrategy.forward()},n.prototype.back=function(){this._platformStrategy.back()},n.prototype.subscribe=function(n,t,e){return this._subject.subscribe({next:n,error:t,complete:e})},n.normalizeQueryParams=function(n){return n&&"?"!==n[0]?"?"+n:n},n.joinWithSlash=function(n,t){if(0==n.length)return t;if(0==t.length)return n;var e=0;return n.endsWith("/")&&e++,t.startsWith("/")&&e++,2==e?n+t.substring(1):1==e?n+t:n+"/"+t},n.stripTrailingSlash=function(n){var t=n.match(/#|\?|$/),e=t&&t.index||n.length;return n.slice(0,e-("/"===n[e-1]?1:0))+n.slice(e)},n}();function h(n){return n.replace(/\/index.html$/,"")}var p=function(n){function t(t,e){var l=n.call(this)||this;return l._platformLocation=t,l._baseHref="",null!=e&&(l._baseHref=e),l}return Object(i.__extends)(t,n),t.prototype.onPopState=function(n){this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.path=function(n){void 0===n&&(n=!1);var t=this._platformLocation.hash;return null==t&&(t="#"),t.length>0?t.substring(1):t},t.prototype.prepareExternalUrl=function(n){var t=d.joinWithSlash(this._baseHref,n);return t.length>0?"#"+t:t},t.prototype.pushState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.pushState(n,t,r)},t.prototype.replaceState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.replaceState(n,t,r)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(u),f=function(n){function t(t,e){var l=n.call(this)||this;if(l._platformLocation=t,null==e&&(e=l._platformLocation.getBaseHrefFromDOM()),null==e)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return l._baseHref=e,l}return Object(i.__extends)(t,n),t.prototype.onPopState=function(n){this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.prepareExternalUrl=function(n){return d.joinWithSlash(this._baseHref,n)},t.prototype.path=function(n){void 0===n&&(n=!1);var t=this._platformLocation.pathname+d.normalizeQueryParams(this._platformLocation.search),e=this._platformLocation.hash;return e&&n?""+t+e:t},t.prototype.pushState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));this._platformLocation.pushState(n,t,r)},t.prototype.replaceState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));this._platformLocation.replaceState(n,t,r)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(u),_={AOA:[,"Kz"],ARS:[,"$"],AUD:["A$","$"],BAM:[,"KM"],BBD:[,"$"],BDT:[,"\u09f3"],BMD:[,"$"],BND:[,"$"],BOB:[,"Bs"],BRL:["R$"],BSD:[,"$"],BWP:[,"P"],BYN:[,"\u0440."],BZD:[,"$"],CAD:["CA$","$"],CLP:[,"$"],CNY:["CN\xa5","\xa5"],COP:[,"$"],CRC:[,"\u20a1"],CUC:[,"$"],CUP:[,"$"],CZK:[,"K\u010d"],DKK:[,"kr"],DOP:[,"$"],EGP:[,"E\xa3"],ESP:[,"\u20a7"],EUR:["\u20ac"],FJD:[,"$"],FKP:[,"\xa3"],GBP:["\xa3"],GEL:[,"\u20be"],GIP:[,"\xa3"],GNF:[,"FG"],GTQ:[,"Q"],GYD:[,"$"],HKD:["HK$","$"],HNL:[,"L"],HRK:[,"kn"],HUF:[,"Ft"],IDR:[,"Rp"],ILS:["\u20aa"],INR:["\u20b9"],ISK:[,"kr"],JMD:[,"$"],JPY:["\xa5"],KHR:[,"\u17db"],KMF:[,"CF"],KPW:[,"\u20a9"],KRW:["\u20a9"],KYD:[,"$"],KZT:[,"\u20b8"],LAK:[,"\u20ad"],LBP:[,"L\xa3"],LKR:[,"Rs"],LRD:[,"$"],LTL:[,"Lt"],LVL:[,"Ls"],MGA:[,"Ar"],MMK:[,"K"],MNT:[,"\u20ae"],MUR:[,"Rs"],MXN:["MX$","$"],MYR:[,"RM"],NAD:[,"$"],NGN:[,"\u20a6"],NIO:[,"C$"],NOK:[,"kr"],NPR:[,"Rs"],NZD:["NZ$","$"],PHP:[,"\u20b1"],PKR:[,"Rs"],PLN:[,"z\u0142"],PYG:[,"\u20b2"],RON:[,"lei"],RUB:[,"\u20bd"],RUR:[,"\u0440."],RWF:[,"RF"],SBD:[,"$"],SEK:[,"kr"],SGD:[,"$"],SHP:[,"\xa3"],SRD:[,"$"],SSP:[,"\xa3"],STD:[,"Db"],SYP:[,"\xa3"],THB:[,"\u0e3f"],TOP:[,"T$"],TRY:[,"\u20ba"],TTD:[,"$"],TWD:["NT$","$"],UAH:[,"\u20b4"],USD:["$"],UYU:[,"$"],VEF:[,"Bs"],VND:["\u20ab"],XAF:["FCFA"],XCD:["EC$","$"],XOF:["CFA"],XPF:["CFPF"],ZAR:[,"R"],ZMW:[,"ZK"]},m=["en",[["a","p"],["AM","PM"]],[["AM","PM"],,],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",,"{1} 'at' {0}"],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"$","US Dollar",function(n){var t=Math.floor(Math.abs(n)),e=n.toString().replace(/^[^.]*\.?/,"").length;return 1===t&&0===e?1:5}],g={},y=function(){var n={Decimal:0,Percent:1,Currency:2,Scientific:3};return n[n.Decimal]="Decimal",n[n.Percent]="Percent",n[n.Currency]="Currency",n[n.Scientific]="Scientific",n}(),b=function(){var n={Zero:0,One:1,Two:2,Few:3,Many:4,Other:5};return n[n.Zero]="Zero",n[n.One]="One",n[n.Two]="Two",n[n.Few]="Few",n[n.Many]="Many",n[n.Other]="Other",n}(),v=function(){var n={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};return n[n.Decimal]="Decimal",n[n.Group]="Group",n[n.List]="List",n[n.PercentSign]="PercentSign",n[n.PlusSign]="PlusSign",n[n.MinusSign]="MinusSign",n[n.Exponential]="Exponential",n[n.SuperscriptingExponent]="SuperscriptingExponent",n[n.PerMille]="PerMille",n[n.Infinity]="Infinity",n[n.NaN]="NaN",n[n.TimeSeparator]="TimeSeparator",n[n.CurrencyDecimal]="CurrencyDecimal",n[n.CurrencyGroup]="CurrencyGroup",n}();function w(n,t){var e=x(n),l=e[13][t];if("undefined"==typeof l){if(t===v.CurrencyDecimal)return e[13][v.Decimal];if(t===v.CurrencyGroup)return e[13][v.Group]}return l}function x(n){var t=n.toLowerCase().replace(/_/g,"-"),e=g[t];if(e)return e;var l=t.split("-")[0];if(e=g[l])return e;if("en"===l)return m;throw new Error('Missing locale data for the locale "'+n+'".')}var M=new l.r("UseV4Plurals"),k=function(){},C=function(n){function t(t,e){var l=n.call(this)||this;return l.locale=t,l.deprecatedPluralFn=e,l}return Object(i.__extends)(t,n),t.prototype.getPluralCategory=function(n,t){switch(this.deprecatedPluralFn?this.deprecatedPluralFn(t||this.locale,n):function(n){return x(n)[17]}(t||this.locale)(n)){case b.Zero:return"zero";case b.One:return"one";case b.Two:return"two";case b.Few:return"few";case b.Many:return"many";default:return"other"}},t}(k);function S(n,t){t=encodeURIComponent(t);for(var e=0,l=n.split(";");e-1&&(o=o.replace(V,"")),(l=o.search(/e/i))>0?(e<0&&(e=l),e+=+o.slice(l+1),o=o.substring(0,l)):e<0&&(e=o.length),l=0;o.charAt(l)===W;l++);if(l===(i=o.length))t=[0],e=1;else{for(i--;o.charAt(i)===W;)i--;for(e-=l,t=[],r=0;l<=i;l++,r++)t[r]=+o.charAt(l)}return e>B&&(t=t.splice(0,B-1),s=e-1,e=1),{digits:t,exponent:s,integerLen:e}}(i);e===y.Percent&&(d=function(n){if(0===n.digits[0])return n;var t=n.digits.length-n.integerLen;return n.exponent?n.exponent+=2:(0===t?n.digits.push(0,0):1===t&&n.digits.push(0),n.integerLen+=2),n}(d));var h=a.minInt,p=a.minFrac,f=a.maxFrac;if(l){var _=l.match(F);if(null===_)return o.error=l+" is not a valid digit info",o;var m=_[1],g=_[3],b=_[5];null!=m&&(h=K(m)),null!=g&&(p=K(g)),null!=b?f=K(b):null!=g&&p>f&&(f=p)}!function(n,t,e){if(t>e)throw new Error("The minimum number of digits after fraction ("+t+") is higher than the maximum ("+e+").");var l=n.digits,r=l.length-n.integerLen,i=Math.min(Math.max(t,r),e),o=i+n.integerLen,s=l[o];if(o>0){l.splice(Math.max(n.integerLen,o));for(var a=o;a=5)if(o-1<0){for(var c=0;c>o;c--)l.unshift(0),n.integerLen++;l.unshift(1),n.integerLen++}else l[o-1]++;for(;r=h?l.pop():d=!1),t>=10?1:0},0);p&&(l.unshift(p),n.integerLen++)}(d,p,f);var M=d.digits,k=d.integerLen,C=d.exponent,S=[];for(c=M.every(function(n){return!n});k0?S=M.splice(k,M.length):(S=M,M=[0]);var O=[];for(M.length>=a.lgSize&&O.unshift(M.splice(-a.lgSize,M.length).join(""));M.length>a.gSize;)O.unshift(M.splice(-a.gSize,M.length).join(""));M.length&&O.unshift(M.join("")),u=O.join(w(t,r?v.CurrencyGroup:v.Group)),S.length&&(u+=w(t,r?v.CurrencyDecimal:v.Decimal)+S.join("")),C&&(u+=w(t,v.Exponential)+"+"+C)}else u=w(t,v.Infinity);return u=i<0&&!c?a.negPre+u+a.negSuf:a.posPre+u+a.posSuf,e===y.Currency&&null!==r?(o.str=u.replace(q,r).replace(q,""),o):e===y.Percent?(o.str=u.replace(new RegExp(J,"g"),w(t,v.PercentSign)),o):(o.str=u,o)}function K(n){var t=parseInt(n);if(isNaN(t))throw new Error("Invalid integer literal when parsing "+n);return t}var X=function(){function n(){}return n.prototype.createSubscription=function(n,t){return n.subscribe({next:t,error:function(n){throw n}})},n.prototype.dispose=function(n){n.unsubscribe()},n.prototype.onDestroy=function(n){n.unsubscribe()},n}(),Z=new(function(){function n(){}return n.prototype.createSubscription=function(n,t){return n.then(t,function(n){throw n})},n.prototype.dispose=function(n){},n.prototype.onDestroy=function(n){},n}()),$=new X,nn=function(){function n(n){this._ref=n,this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null,this._strategy=null}return n.prototype.ngOnDestroy=function(){this._subscription&&this._dispose()},n.prototype.transform=function(n){return this._obj?n!==this._obj?(this._dispose(),this.transform(n)):this._latestValue===this._latestReturnedValue?this._latestReturnedValue:(this._latestReturnedValue=this._latestValue,l.T.wrap(this._latestValue)):(n&&this._subscribe(n),this._latestReturnedValue=this._latestValue,this._latestValue)},n.prototype._subscribe=function(n){var t=this;this._obj=n,this._strategy=this._selectStrategy(n),this._subscription=this._strategy.createSubscription(n,function(e){return t._updateLatestValue(n,e)})},n.prototype._selectStrategy=function(t){if(Object(l._15)(t))return Z;if(Object(l._14)(t))return $;throw N(n,t)},n.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null},n.prototype._updateLatestValue=function(n,t){n===this._obj&&(this._latestValue=t,this._ref.markForCheck())},n}(),tn=function(){function n(n){this._locale=n}return n.prototype.transform=function(t,e,l){if(rn(t))return null;var r=Q(t,l=l||this._locale,y.Decimal,e),i=r.str,o=r.error;if(o)throw N(n,o);return i},n}(),en=function(){function n(n){this._locale=n}return n.prototype.transform=function(t,e,l){if(rn(t))return null;var r=Q(t,l=l||this._locale,y.Percent,e),i=r.str,o=r.error;if(o)throw N(n,o);return i},n}(),ln=function(){function n(n){this._locale=n}return n.prototype.transform=function(t,e,l,r,i){if(void 0===l&&(l="symbol"),rn(t))return null;i=i||this._locale,"boolean"==typeof l&&(console&&console.warn&&console.warn('Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are "code", "symbol" or "symbol-narrow".'),l=l?"symbol":"code");var o=e||"USD";"code"!==l&&(o=function(n,t){var e=_[n]||[],r=e[1];return"narrow"==("symbol"===l?"wide":"narrow")&&"string"==typeof r?r:e[0]||n}(o));var s=Q(t,i,y.Currency,r,o),a=s.str,u=s.error;if(u)throw N(n,u);return a},n}();function rn(n){return null==n||""===n||n!=n}var on=function(){},sn=new l.r("DocumentToken"),an=null;function un(){return an}var cn,dn={class:"className",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},hn={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},pn={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"};l._10.Node&&(cn=l._10.Node.prototype.contains||function(n){return!!(16&this.compareDocumentPosition(n))});var fn,_n=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.parse=function(n){throw new Error("parse not implemented")},t.makeCurrent=function(){var n;n=new t,an||(an=n)},t.prototype.hasProperty=function(n,t){return t in n},t.prototype.setProperty=function(n,t,e){n[t]=e},t.prototype.getProperty=function(n,t){return n[t]},t.prototype.invoke=function(n,t,e){var l;(l=n)[t].apply(l,e)},t.prototype.logError=function(n){window.console&&(console.error?console.error(n):console.log(n))},t.prototype.log=function(n){window.console&&window.console.log&&window.console.log(n)},t.prototype.logGroup=function(n){window.console&&window.console.group&&window.console.group(n)},t.prototype.logGroupEnd=function(){window.console&&window.console.groupEnd&&window.console.groupEnd()},Object.defineProperty(t.prototype,"attrToPropMap",{get:function(){return dn},enumerable:!0,configurable:!0}),t.prototype.contains=function(n,t){return cn.call(n,t)},t.prototype.querySelector=function(n,t){return n.querySelector(t)},t.prototype.querySelectorAll=function(n,t){return n.querySelectorAll(t)},t.prototype.on=function(n,t,e){n.addEventListener(t,e,!1)},t.prototype.onAndCancel=function(n,t,e){return n.addEventListener(t,e,!1),function(){n.removeEventListener(t,e,!1)}},t.prototype.dispatchEvent=function(n,t){n.dispatchEvent(t)},t.prototype.createMouseEvent=function(n){var t=this.getDefaultDocument().createEvent("MouseEvent");return t.initEvent(n,!0,!0),t},t.prototype.createEvent=function(n){var t=this.getDefaultDocument().createEvent("Event");return t.initEvent(n,!0,!0),t},t.prototype.preventDefault=function(n){n.preventDefault(),n.returnValue=!1},t.prototype.isPrevented=function(n){return n.defaultPrevented||null!=n.returnValue&&!n.returnValue},t.prototype.getInnerHTML=function(n){return n.innerHTML},t.prototype.getTemplateContent=function(n){return"content"in n&&this.isTemplateElement(n)?n.content:null},t.prototype.getOuterHTML=function(n){return n.outerHTML},t.prototype.nodeName=function(n){return n.nodeName},t.prototype.nodeValue=function(n){return n.nodeValue},t.prototype.type=function(n){return n.type},t.prototype.content=function(n){return this.hasProperty(n,"content")?n.content:n},t.prototype.firstChild=function(n){return n.firstChild},t.prototype.nextSibling=function(n){return n.nextSibling},t.prototype.parentElement=function(n){return n.parentNode},t.prototype.childNodes=function(n){return n.childNodes},t.prototype.childNodesAsList=function(n){for(var t=n.childNodes,e=new Array(t.length),l=0;l0},t.prototype.tagName=function(n){return n.tagName},t.prototype.attributeMap=function(n){for(var t=new Map,e=n.attributes,l=0;l0;s||(s=n[o]=[]);var u=Xn(t)?Zone.root:Zone.current;if(0===s.length)s.push({zone:u,handler:i});else{for(var c=!1,d=0;d-1},t}(Pn),rt=["alt","control","meta","shift"],it={alt:function(n){return n.altKey},control:function(n){return n.ctrlKey},meta:function(n){return n.metaKey},shift:function(n){return n.shiftKey}},ot=function(n){function t(t){return n.call(this,t)||this}return Object(i.__extends)(t,n),t.prototype.supports=function(n){return null!=t.parseEventName(n)},t.prototype.addEventListener=function(n,e,l){var r=t.parseEventName(e),i=t.eventCallback(r.fullKey,l,this.manager.getZone());return this.manager.getZone().runOutsideAngular(function(){return un().onAndCancel(n,r.domEventName,i)})},t.parseEventName=function(n){var e=n.toLowerCase().split("."),l=e.shift();if(0===e.length||"keydown"!==l&&"keyup"!==l)return null;var r=t._normalizeKey(e.pop()),i="";if(rt.forEach(function(n){var t=e.indexOf(n);t>-1&&(e.splice(t,1),i+=n+".")}),i+=r,0!=e.length||0===r.length)return null;var o={};return o.domEventName=l,o.fullKey=i,o},t.getEventFullKey=function(n){var t="",e=un().getEventKey(n);return" "===(e=e.toLowerCase())?e="space":"."===e&&(e="dot"),rt.forEach(function(l){l!=e&&(0,it[l])(n)&&(t+=l+".")}),t+=e},t.eventCallback=function(n,e,l){return function(r){t.getEventFullKey(r)===n&&l.runGuarded(function(){return e(r)})}},t._normalizeKey=function(n){switch(n){case"esc":return"escape";default:return n}},t}(Pn),st=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,at=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i;function ut(n){return(n=String(n)).match(st)||n.match(at)?n:(Object(l.Y)()&&un().log("WARNING: sanitizing unsafe URL value "+n+" (see http://g.co/ng/security#xss)"),"unsafe:"+n)}var ct=null,dt=null;function ht(n){for(var t={},e=0,l=n.split(",");e")):this.sanitizedSomething=!0},n.prototype.endElement=function(n){var t=dt.nodeName(n).toLowerCase();yt.hasOwnProperty(t)&&!ft.hasOwnProperty(t)&&(this.buf.push(""))},n.prototype.chars=function(n){this.buf.push(St(n))},n}();function Mt(n,t){if(t&&dt.contains(n,t))throw new Error("Failed to sanitize html because the element is clobbered: "+dt.getOuterHTML(n));return t}var kt=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Ct=/([^\#-~ |!])/g;function St(n){return n.replace(/&/g,"&").replace(kt,function(n){return"&#"+(1024*(n.charCodeAt(0)-55296)+(n.charCodeAt(1)-56320)+65536)+";"}).replace(Ct,function(n){return"&#"+n.charCodeAt(0)+";"}).replace(//g,">")}function Ot(n){dt.attributeMap(n).forEach(function(t,e){"xmlns:ns1"!==e&&0!==e.indexOf("ns1:")||dt.removeAttribute(n,e)});for(var t=0,e=dt.childNodesAsList(n);t0){var l=n.slice(0,t),r=n.slice(t+1).trim();e.set(l,r)}}),e},n.prototype.append=function(n,t){var e=this.getAll(n);null===e?this.set(n,t):e.push(t)},n.prototype.delete=function(n){var t=n.toLowerCase();this._normalizedNames.delete(t),this._headers.delete(t)},n.prototype.forEach=function(n){var t=this;this._headers.forEach(function(e,l){return n(e,t._normalizedNames.get(l),t._headers)})},n.prototype.get=function(n){var t=this.getAll(n);return null===t?null:t.length>0?t[0]:null},n.prototype.has=function(n){return this._headers.has(n.toLowerCase())},n.prototype.keys=function(){return Array.from(this._normalizedNames.values())},n.prototype.set=function(n,t){Array.isArray(t)?t.length&&this._headers.set(n.toLowerCase(),[t.join(",")]):this._headers.set(n.toLowerCase(),[t]),this.mayBeSetNormalizedName(n)},n.prototype.values=function(){return Array.from(this._headers.values())},n.prototype.toJSON=function(){var n=this,t={};return this._headers.forEach(function(e,l){var r=[];e.forEach(function(n){return r.push.apply(r,n.split(","))}),t[n._normalizedNames.get(l)]=r}),t},n.prototype.getAll=function(n){return this.has(n)&&this._headers.get(n.toLowerCase())||null},n.prototype.entries=function(){throw new Error('"entries" method is not implemented on Headers class')},n.prototype.mayBeSetNormalizedName=function(n){var t=n.toLowerCase();this._normalizedNames.has(t)||this._normalizedNames.set(t,n)},n}(),Jt=function(){function n(n){void 0===n&&(n={});var t=n.body,e=n.status,l=n.headers,r=n.statusText,i=n.type,o=n.url;this.body=null!=t?t:null,this.status=null!=e?e:null,this.headers=null!=l?l:null,this.statusText=null!=r?r:null,this.type=null!=i?i:null,this.url=null!=o?o:null}return n.prototype.merge=function(t){return new n({body:t&&null!=t.body?t.body:this.body,status:t&&null!=t.status?t.status:this.status,headers:t&&null!=t.headers?t.headers:this.headers,statusText:t&&null!=t.statusText?t.statusText:this.statusText,type:t&&null!=t.type?t.type:this.type,url:t&&null!=t.url?t.url:this.url})},n}(),Qt=function(n){function t(){return n.call(this,{status:200,statusText:"Ok",type:zt.Default,headers:new qt})||this}return Object(i.__extends)(t,n),t}(Jt),Kt=function(){};function Xt(n){if("string"!=typeof n)return n;switch(n.toUpperCase()){case"GET":return Wt.Get;case"POST":return Wt.Post;case"PUT":return Wt.Put;case"DELETE":return Wt.Delete;case"OPTIONS":return Wt.Options;case"HEAD":return Wt.Head;case"PATCH":return Wt.Patch}throw new Error('Invalid request method. The method "'+n+'" is not supported.')}var Zt=function(n){return n>=200&&n<300},$t=function(){function n(){}return n.prototype.encodeKey=function(n){return ne(n)},n.prototype.encodeValue=function(n){return ne(n)},n}();function ne(n){return encodeURIComponent(n).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var te=function(){function n(n,t){void 0===n&&(n=""),void 0===t&&(t=new $t),this.rawParams=n,this.queryEncoder=t,this.paramsMap=function(n){void 0===n&&(n="");var t=new Map;return n.length>0&&n.split("&").forEach(function(n){var e=n.indexOf("="),l=-1==e?[n,""]:[n.slice(0,e),n.slice(e+1)],r=l[0],i=l[1],o=t.get(r)||[];o.push(i),t.set(r,o)}),t}(n)}return n.prototype.clone=function(){var t=new n("",this.queryEncoder);return t.appendAll(this),t},n.prototype.has=function(n){return this.paramsMap.has(n)},n.prototype.get=function(n){var t=this.paramsMap.get(n);return Array.isArray(t)?t[0]:null},n.prototype.getAll=function(n){return this.paramsMap.get(n)||[]},n.prototype.set=function(n,t){if(void 0!==t&&null!==t){var e=this.paramsMap.get(n)||[];e.length=0,e.push(t),this.paramsMap.set(n,e)}else this.delete(n)},n.prototype.setAll=function(n){var t=this;n.paramsMap.forEach(function(n,e){var l=t.paramsMap.get(e)||[];l.length=0,l.push(n[0]),t.paramsMap.set(e,l)})},n.prototype.append=function(n,t){if(void 0!==t&&null!==t){var e=this.paramsMap.get(n)||[];e.push(t),this.paramsMap.set(n,e)}},n.prototype.appendAll=function(n){var t=this;n.paramsMap.forEach(function(n,e){for(var l=t.paramsMap.get(e)||[],r=0;r=200&&e.status<=299,e.statusText=t.statusText,e.headers=t.headers,e.type=t.type,e.url=t.url,e}return Object(i.__extends)(t,n),t.prototype.toString=function(){return"Response with status: "+this.status+" "+this.statusText+" for URL: "+this.url},t}(ee),re=/^\)\]\}',?\n/,ie=function(){function n(n,t,e){var l=this;this.request=n,this.response=new o.a(function(r){var i=t.build();i.open(Wt[n.method].toUpperCase(),n.url),null!=n.withCredentials&&(i.withCredentials=n.withCredentials);var o=function(){var t=1223===i.status?204:i.status,l=null;204!==t&&"string"==typeof(l="undefined"==typeof i.response?i.responseText:i.response)&&(l=l.replace(re,"")),0===t&&(t=l?200:0);var o,s=qt.fromResponseHeaderString(i.getAllResponseHeaders()),a=("responseURL"in(o=i)?o.responseURL:/^X-Request-URL:/m.test(o.getAllResponseHeaders())?o.getResponseHeader("X-Request-URL"):null)||n.url,u=new Jt({body:l,status:t,headers:s,statusText:i.statusText||"OK",url:a});null!=e&&(u=e.merge(u));var c=new le(u);if(c.ok=Zt(t),c.ok)return r.next(c),void r.complete();r.error(c)},s=function(n){var t=new Jt({body:n,type:zt.Error,status:i.status,statusText:i.statusText});null!=e&&(t=e.merge(t)),r.error(new le(t))};if(l.setDetectedContentType(n,i),null==n.headers&&(n.headers=new qt),n.headers.has("Accept")||n.headers.append("Accept","application/json, text/plain, */*"),n.headers.forEach(function(n,t){return i.setRequestHeader(t,n.join(","))}),null!=n.responseType&&null!=i.responseType)switch(n.responseType){case Gt.ArrayBuffer:i.responseType="arraybuffer";break;case Gt.Json:i.responseType="json";break;case Gt.Text:i.responseType="text";break;case Gt.Blob:i.responseType="blob";break;default:throw new Error("The selected responseType is not supported")}return i.addEventListener("load",o),i.addEventListener("error",s),i.send(l.request.getBody()),function(){i.removeEventListener("load",o),i.removeEventListener("error",s),i.abort()}})}return n.prototype.setDetectedContentType=function(n,t){if(null==n.headers||null==n.headers.get("Content-Type"))switch(n.contentType){case Ut.NONE:break;case Ut.JSON:t.setRequestHeader("content-type","application/json");break;case Ut.FORM:t.setRequestHeader("content-type","application/x-www-form-urlencoded;charset=UTF-8");break;case Ut.TEXT:t.setRequestHeader("content-type","text/plain");break;case Ut.BLOB:var e=n.blob();e.type&&t.setRequestHeader("content-type",e.type)}},n}(),oe=function(){function n(n,t){void 0===n&&(n="XSRF-TOKEN"),void 0===t&&(t="X-XSRF-TOKEN"),this._cookieName=n,this._headerName=t}return n.prototype.configureRequest=function(n){var t=un().getCookie(this._cookieName);t&&n.headers.set(this._headerName,t)},n}(),se=function(){function n(n,t,e){this._browserXHR=n,this._baseResponseOptions=t,this._xsrfStrategy=e}return n.prototype.createConnection=function(n){return this._xsrfStrategy.configureRequest(n),new ie(n,this._browserXHR,this._baseResponseOptions)},n}(),ae=function(){function n(n){void 0===n&&(n={});var t=n.method,e=n.headers,l=n.body,r=n.url,i=n.search,o=n.params,s=n.withCredentials,a=n.responseType;this.method=null!=t?Xt(t):null,this.headers=null!=e?e:null,this.body=null!=l?l:null,this.url=null!=r?r:null,this.params=this._mergeSearchParams(o||i),this.withCredentials=null!=s?s:null,this.responseType=null!=a?a:null}return Object.defineProperty(n.prototype,"search",{get:function(){return this.params},set:function(n){this.params=n},enumerable:!0,configurable:!0}),n.prototype.merge=function(t){return new n({method:t&&null!=t.method?t.method:this.method,headers:t&&null!=t.headers?t.headers:new qt(this.headers),body:t&&null!=t.body?t.body:this.body,url:t&&null!=t.url?t.url:this.url,params:t&&this._mergeSearchParams(t.params||t.search),withCredentials:t&&null!=t.withCredentials?t.withCredentials:this.withCredentials,responseType:t&&null!=t.responseType?t.responseType:this.responseType})},n.prototype._mergeSearchParams=function(n){return n?n instanceof te?n.clone():"string"==typeof n?new te(n):this._parseParams(n):this.params},n.prototype._parseParams=function(n){var t=this;void 0===n&&(n={});var e=new te;return Object.keys(n).forEach(function(l){var r=n[l];Array.isArray(r)?r.forEach(function(n){return t._appendParam(l,n,e)}):t._appendParam(l,r,e)}),e},n.prototype._appendParam=function(n,t,e){"string"!=typeof t&&(t=JSON.stringify(t)),e.append(n,t)},n}(),ue=function(n){function t(){return n.call(this,{method:Wt.Get,headers:new qt})||this}return Object(i.__extends)(t,n),t}(ae),ce=function(n){function t(t){var e=n.call(this)||this,l=t.url;e.url=t.url;var r,i=t.params||t.search;if(i&&(r="object"!=typeof i||i instanceof te?i.toString():function(n){var t=new te;return Object.keys(n).forEach(function(e){var l=n[e];l&&Array.isArray(l)?l.forEach(function(n){return t.append(e,n.toString())}):t.append(e,l.toString())}),t}(i).toString()).length>0){var o="?";-1!=e.url.indexOf("?")&&(o="&"==e.url[e.url.length-1]?"":"&"),e.url=l+o+r}return e._body=t.body,e.method=Xt(t.method),e.headers=new qt(t.headers),e.contentType=e.detectContentType(),e.withCredentials=t.withCredentials,e.responseType=t.responseType,e}return Object(i.__extends)(t,n),t.prototype.detectContentType=function(){switch(this.headers.get("content-type")){case"application/json":return Ut.JSON;case"application/x-www-form-urlencoded":return Ut.FORM;case"multipart/form-data":return Ut.FORM_DATA;case"text/plain":case"text/html":return Ut.TEXT;case"application/octet-stream":return this._body instanceof _e?Ut.ARRAY_BUFFER:Ut.BLOB;default:return this.detectContentTypeFromBody()}},t.prototype.detectContentTypeFromBody=function(){return null==this._body?Ut.NONE:this._body instanceof te?Ut.FORM:this._body instanceof pe?Ut.FORM_DATA:this._body instanceof fe?Ut.BLOB:this._body instanceof _e?Ut.ARRAY_BUFFER:this._body&&"object"==typeof this._body?Ut.JSON:Ut.TEXT},t.prototype.getBody=function(){switch(this.contentType){case Ut.JSON:case Ut.FORM:return this.text();case Ut.FORM_DATA:return this._body;case Ut.TEXT:return this.text();case Ut.BLOB:return this.blob();case Ut.ARRAY_BUFFER:return this.arrayBuffer();default:return null}},t}(ee),de=function(){},he="object"==typeof window?window:de,pe=he.FormData||de,fe=he.Blob||de,_e=he.ArrayBuffer||de;function me(n,t){return n.createConnection(t).response}function ge(n,t,e,l){return n.merge(new ae(t?{method:t.method||e,url:t.url||l,search:t.search,params:t.params,headers:t.headers,body:t.body,withCredentials:t.withCredentials,responseType:t.responseType}:{method:e,url:l}))}var ye=function(){function n(n,t){this._backend=n,this._defaultOptions=t}return n.prototype.request=function(n,t){var e;if("string"==typeof n)e=me(this._backend,new ce(ge(this._defaultOptions,t,Wt.Get,n)));else{if(!(n instanceof ce))throw new Error("First argument must be a url string or Request instance.");e=me(this._backend,n)}return e},n.prototype.get=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Get,n)))},n.prototype.post=function(n,t,e){return this.request(new ce(ge(this._defaultOptions.merge(new ae({body:t})),e,Wt.Post,n)))},n.prototype.put=function(n,t,e){return this.request(new ce(ge(this._defaultOptions.merge(new ae({body:t})),e,Wt.Put,n)))},n.prototype.delete=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Delete,n)))},n.prototype.patch=function(n,t,e){return this.request(new ce(ge(this._defaultOptions.merge(new ae({body:t})),e,Wt.Patch,n)))},n.prototype.head=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Head,n)))},n.prototype.options=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Options,n)))},n}();function be(){return new oe}function ve(n,t){return new ye(n,t)}var we=function(){},xe=function(n){function t(t,e){n.call(this),this.error=t,this.scheduler=e}return Object(i.__extends)(t,n),t.create=function(n,e){return new t(n,e)},t.dispatch=function(n){n.subscriber.error(n.error)},t.prototype._subscribe=function(n){var e=this.error,l=this.scheduler;if(n.syncErrorThrowable=!0,l)return l.schedule(t.dispatch,0,{error:e,subscriber:n});n.error(e)},t}(o.a).create;o.a.throw=xe;var Me=e("tZ2B"),ke=e("PIsA");function Ce(n){return function(t){var e=new Se(n),l=t.lift(e);return e.caught=l}}var Se=function(){function n(n){this.selector=n}return n.prototype.call=function(n,t){return t.subscribe(new Oe(n,this.selector,this.caught))},n}(),Oe=function(n){function t(t,e,l){n.call(this,t),this.selector=e,this.caught=l}return Object(i.__extends)(t,n),t.prototype.error=function(t){if(!this.isStopped){var e=void 0;try{e=this.selector(t,this.caught)}catch(t){return void n.prototype.error.call(this,t)}this._unsubscribeAndRecycle(),this.add(Object(ke.a)(this,e))}},t}(Me.a);function Te(n){return Ce(n)(this)}o.a.prototype.catch=Te,o.a.prototype._catch=Te;var Le=e("HdCx");function Pe(n,t){return Object(Le.a)(n,t)(this)}o.a.prototype.map=Pe;var De=e("YKDW"),Ae=e("uotZ"),Ee=e.n(Ae),Ye=function(){function n(n,t){this.http=n,this.translate=t,this.url=r.nodeUrl}return n.prototype.getTransactions=function(n){var t=n.map(function(n){return n.address}).join(",");return this.post("transactions",{addrs:t,verbose:!0}).map(function(n){return n.map(function(n){return{addresses:[],balance:new Ae.BigNumber(0),block:n.status.block_seq,confirmed:n.status.confirmed,timestamp:n.txn.timestamp,txid:n.txn.txid,inputs:n.txn.inputs,outputs:n.txn.outputs}})})},n.prototype.getVersion=function(){return this.get("version")},n.prototype.generateSeed=function(n){return void 0===n&&(n=128),this.get("wallet/newSeed",{entropy:n}).map(function(n){return n.seed})},n.prototype.getHealth=function(){return this.get("health")},n.prototype.getWallets=function(){return this.get("wallets").map(function(n){var t=[];return n.forEach(function(n){var e={label:n.meta.label,filename:n.meta.filename,coins:null,hours:null,addresses:[],encrypted:n.meta.encrypted};n.entries&&(e.addresses=n.entries.map(function(n){return{address:n.address,coins:null,hours:null,confirmed:!0}})),t.push(e)}),t})},n.prototype.getWalletSeed=function(n,t){return this.post("wallet/seed",{id:n.filename,password:t}).map(function(n){return n.seed})},n.prototype.postWalletCreate=function(n,t,e,l,r){var i={label:n,seed:t,scan:e,type:r};return l&&(i.password=l,i.encrypt=!0),this.post("wallet/create",i).map(function(n){return{label:n.meta.label,filename:n.meta.filename,coins:null,hours:null,addresses:n.entries.map(function(n){return{address:n.address,coins:null,hours:null,confirmed:!0}}),encrypted:n.meta.encrypted}})},n.prototype.postWalletNewAddress=function(n,t,e){var l=new Object;return l.id=n.filename,l.num=t,e&&(l.password=e),this.post("wallet/newAddress",l).map(function(n){var t=[];return n.addresses.forEach(function(n){t.push({address:n,coins:null,hours:null})}),t})},n.prototype.postWalletToggleEncryption=function(n,t){return this.post("wallet/"+(n.encrypted?"decrypt":"encrypt"),{id:n.filename,password:t})},n.prototype.get=function(n,t,e,l){var r=this;return void 0===t&&(t=null),void 0===e&&(e={}),void 0===l&&(l=!1),this.http.get(this.getUrl(n,t,l),this.returnRequestOptions(e)).map(function(n){return n.json()}).catch(function(n){return r.processConnectionError(n)})},n.prototype.getCsrf=function(){return this.get("csrf").map(function(n){return n.csrf_token})},n.prototype.post=function(n,t,e,l){var r=this;return void 0===t&&(t={}),void 0===e&&(e={}),void 0===l&&(l=!1),this.getCsrf().first().flatMap(function(i){return e.csrf=i,l&&(e.json=!0),r.http.post(r.getUrl(n,null,l),e.json||l?JSON.stringify(t):r.getQueryString(t),r.returnRequestOptions(e)).map(function(n){return n.json()}).catch(function(n){return r.processConnectionError(n)})})},n.prototype.returnRequestOptions=function(n){var t=new ae;return t.headers=this.getHeaders(n),n.csrf&&t.headers.append("X-CSRF-Token",n.csrf),t},n.prototype.getHeaders=function(n){var t=new qt;return t.append("Content-Type",n.json?"application/json":"application/x-www-form-urlencoded"),t},n.prototype.getQueryString=function(n){return void 0===n&&(n=null),n?Object.keys(n).reduce(function(t,e){return t.push(e+"="+encodeURIComponent(n[e])),t},[]).join("&"):""},n.prototype.getUrl=function(n,t,e){return void 0===t&&(t=null),void 0===e&&(e=!1),n.startsWith("/")&&(n=n.substr(1,n.length-1)),this.url+(e?"v2/":"v1/")+n+"?"+this.getQueryString(t)},n.prototype.processConnectionError=function(n,t){if(void 0===t&&(t=!1),n){if("string"==typeof n._body)return o.a.throw(n);if(n.error&&"string"==typeof n.error)return n._body=n.error,o.a.throw(n);if(n.message)return n._body=n.message,o.a.throw(n)}var e=Error(this.translate.instant(t?"hardware-wallet.errors.daemon-connection":"service.api.server-error"));return e._body=e.message,o.a.throw(e)},n}(),je=e("+3/4"),Ie=e("BX3T"),Re=function(n){function t(t,e){n.call(this),this.sources=t,this.resultSelector=e}return Object(i.__extends)(t,n),t.create=function(){for(var n=[],e=0;e=0}o.a.prototype.mergeMap=tl,o.a.prototype.flatMap=tl;var ll=e("AMGY"),rl=e("VwZZ"),il=function(n){function t(t,e){n.call(this,t,e),this.scheduler=t,this.work=e,this.pending=!1}return Object(i.__extends)(t,n),t.prototype.schedule=function(n,t){if(void 0===t&&(t=0),this.closed)return this;this.state=n,this.pending=!0;var e=this.id,l=this.scheduler;return null!=e&&(this.id=this.recycleAsyncId(l,e,t)),this.delay=t,this.id=this.id||this.requestAsyncId(l,this.id,t),this},t.prototype.requestAsyncId=function(n,t,e){return void 0===e&&(e=0),ll.a.setInterval(n.flush.bind(n,this),e)},t.prototype.recycleAsyncId=function(n,t,e){if(void 0===e&&(e=0),null!==e&&this.delay===e&&!1===this.pending)return t;ll.a.clearInterval(t)},t.prototype.execute=function(n,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var e=this._execute(n,t);if(e)return e;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(n,t){var e=!1,l=void 0;try{this.work(n)}catch(n){e=!0,l=!!n&&n||new Error(n)}if(e)return this.unsubscribe(),l},t.prototype._unsubscribe=function(){var n=this.id,t=this.scheduler,e=t.actions,l=e.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==l&&e.splice(l,1),null!=n&&(this.id=this.recycleAsyncId(t,n,null)),this.delay=null},t}(function(n){function t(t,e){n.call(this)}return Object(i.__extends)(t,n),t.prototype.schedule=function(n,t){return void 0===t&&(t=0),this},t}(rl.a)),ol=function(n){function t(){n.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return Object(i.__extends)(t,n),t.prototype.flush=function(n){var t=this.actions;if(this.active)t.push(n);else{var e;this.active=!0;do{if(e=n.execute(n.state,n.delay))break}while(n=t.shift());if(this.active=!1,e){for(;n=t.shift();)n.unsubscribe();throw e}}},t}(function(){function n(t,e){void 0===e&&(e=n.now),this.SchedulerAction=t,this.now=e}return n.prototype.schedule=function(n,t,e){return void 0===t&&(t=0),new this.SchedulerAction(this,n).schedule(e,t)},n.now=Date.now?Date.now:function(){return+new Date},n}()),sl=new ol(il),al=e("1Q68");function ul(n){return n instanceof Date&&!isNaN(+n)}var cl=function(n){function t(t,e,l){void 0===t&&(t=0),n.call(this),this.period=-1,this.dueTime=0,el(e)?this.period=Number(e)<1?1:Number(e):Object(al.a)(e)&&(l=e),Object(al.a)(l)||(l=sl),this.scheduler=l,this.dueTime=ul(t)?+t-this.scheduler.now():t}return Object(i.__extends)(t,n),t.create=function(n,e,l){return void 0===n&&(n=0),new t(n,e,l)},t.dispatch=function(n){var t=n.index,e=n.period,l=n.subscriber;if(l.next(t),!l.closed){if(-1===e)return l.complete();n.index=t+1,this.schedule(n,e)}},t.prototype._subscribe=function(n){return this.scheduler.schedule(t.dispatch,this.dueTime,{index:0,period:this.period,subscriber:n})},t}(o.a).create;o.a.timer=cl;var dl=e("Veqx"),hl=e("etqZ"),pl=function(){function n(n){this.project=n}return n.prototype.call=function(n,t){return t.subscribe(new fl(n,this.project))},n}(),fl=function(n){function t(t,e,l){void 0===l&&(l=Object.create(null)),n.call(this,t),this.iterators=[],this.active=0,this.project="function"==typeof e?e:null,this.values=l}return Object(i.__extends)(t,n),t.prototype._next=function(n){var t=this.iterators;Object(Ie.a)(n)?t.push(new ml(n)):t.push("function"==typeof n[hl.a]?new _l(n[hl.a]()):new gl(this.destination,this,n))},t.prototype._complete=function(){var n=this.iterators,t=n.length;if(0!==t){this.active=t;for(var e=0;ethis.index},n.prototype.hasCompleted=function(){return this.array.length===this.index},n}(),gl=function(n){function t(t,e,l){n.call(this,t),this.parent=e,this.observable=l,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}return Object(i.__extends)(t,n),t.prototype[hl.a]=function(){return this},t.prototype.next=function(){var n=this.buffer;return 0===n.length&&this.isComplete?{value:null,done:!0}:{value:n.shift(),done:!1}},t.prototype.hasValue=function(){return this.buffer.length>0},t.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},t.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},t.prototype.notifyNext=function(n,t,e,l,r){this.buffer.push(t),this.parent.checkIterators()},t.prototype.subscribe=function(n,t){return Object(ke.a)(this,this.observable,this,t)},t}(Me.a);o.a.zip=function(){for(var n=[],t=0;t0?n.prototype.schedule.call(this,t,e):(this.delay=e,this.state=t,this.scheduler.flush(this),this)},t.prototype.execute=function(t,e){return e>0||this.closed?n.prototype.execute.call(this,t,e):this._execute(t,e)},t.prototype.requestAsyncId=function(t,e,l){return void 0===l&&(l=0),null!==l&&l>0||null===l&&this.delay>0?n.prototype.requestAsyncId.call(this,t,e,l):t.flush(this)},t}(il),vl=new(function(n){function t(){n.apply(this,arguments)}return Object(i.__extends)(t,n),t}(ol))(bl),wl=function(){function n(n,t,e){this.kind=n,this.value=t,this.error=e,this.hasValue="N"===n}return n.prototype.observe=function(n){switch(this.kind){case"N":return n.next&&n.next(this.value);case"E":return n.error&&n.error(this.error);case"C":return n.complete&&n.complete()}},n.prototype.do=function(n,t,e){switch(this.kind){case"N":return n&&n(this.value);case"E":return t&&t(this.error);case"C":return e&&e()}},n.prototype.accept=function(n,t,e){return n&&"function"==typeof n.next?this.observe(n):this.do(n,t,e)},n.prototype.toObservable=function(){switch(this.kind){case"N":return o.a.of(this.value);case"E":return o.a.throw(this.error);case"C":return o.a.empty()}throw new Error("unexpected notification kind value")},n.createNext=function(t){return"undefined"!=typeof t?new n("N",t):n.undefinedValueNotification},n.createError=function(t){return new n("E",void 0,t)},n.createComplete=function(){return n.completeNotification},n.completeNotification=new n("C"),n.undefinedValueNotification=new n("N",void 0),n}(),xl=function(n){function t(t,e,l){void 0===l&&(l=0),n.call(this,t),this.scheduler=e,this.delay=l}return Object(i.__extends)(t,n),t.dispatch=function(n){n.notification.observe(n.destination),this.unsubscribe()},t.prototype.scheduleMessage=function(n){this.add(this.scheduler.schedule(t.dispatch,this.delay,new Ml(n,this.destination)))},t.prototype._next=function(n){this.scheduleMessage(wl.createNext(n))},t.prototype._error=function(n){this.scheduleMessage(wl.createError(n))},t.prototype._complete=function(){this.scheduleMessage(wl.createComplete())},t}(Be.a),Ml=function(n,t){this.notification=n,this.destination=t},kl=e("x6VL"),Cl=e("1Bqh"),Sl=function(n){function t(t,e,l){void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===e&&(e=Number.POSITIVE_INFINITY),n.call(this),this.scheduler=l,this._events=[],this._bufferSize=t<1?1:t,this._windowTime=e<1?1:e}return Object(i.__extends)(t,n),t.prototype.next=function(t){var e=this._getNow();this._events.push(new Ol(e,t)),this._trimBufferThenGetEvents(),n.prototype.next.call(this,t)},t.prototype._subscribe=function(n){var t,e=this._trimBufferThenGetEvents(),l=this.scheduler;if(this.closed)throw new kl.a;this.hasError?t=rl.a.EMPTY:this.isStopped?t=rl.a.EMPTY:(this.observers.push(n),t=new Cl.a(this,n)),l&&n.add(n=new xl(n,l));for(var r=e.length,i=0;it&&(i=Math.max(i,r-t)),i>0&&l.splice(0,i),l},t}(yl.a),Ol=function(n,t){this.time=n,this.value=t},Tl=function(n){function t(t){n.call(this),this._value=t}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),t.prototype._subscribe=function(t){var e=n.prototype._subscribe.call(this,t);return e&&!e.closed&&t.next(this._value),e},t.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new kl.a;return this._value},t.prototype.next=function(t){n.prototype.next.call(this,this._value=t)},t}(yl.a),Ll={otcEnabled:!1,maxHardwareWalletAddresses:1,useHwWalletDaemon:!0,urlForHwWalletVersionChecking:"https://version.skycoin.com/skywallet/version.txt",hwWalletDownloadUrlAndPrefix:"https://downloads.skycoin.com/skywallet/skywallet-firmware-v",urlForVersionChecking:"https://version.skycoin.com/skycoin/version.txt",walletDownloadUrl:"https://www.skycoin.com/downloads/",uriSpecificatioPrefix:"skycoin",languages:[{code:"en",name:"English",iconName:"en.png"},{code:"zh",name:"\u4e2d\u6587",iconName:"zh.png"},{code:"es",name:"Espa\xf1ol",iconName:"es.png"}],defaultLanguage:"en"},Pl=new l.r("cdk-dir-doc"),Dl=function(){return function(n){this.value="ltr",this.change=new l.o,n&&(this.value=(n.body?n.body.dir:null)||(n.documentElement?n.documentElement.dir:null)||"ltr")}}(),Al=function(){};function El(n){return null!=n&&""+n!="false"}function Yl(n,t){return void 0===t&&(t=0),isNaN(parseFloat(n))||isNaN(Number(n))?t:Number(n)}var jl,Il,Rl="undefined"!=typeof Intl&&Intl.v8BreakIterator,Hl=function(){return function(){this.isBrowser="object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!Rl)&&!!CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT}}();function Nl(){if(null==jl&&"undefined"!=typeof window)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return jl=!0}}))}finally{jl=jl||!1}return jl}var Fl=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function Bl(){if(Il)return Il;if("object"!=typeof document||!document)return Il=new Set(Fl);var n=document.createElement("input");return Il=new Set(Fl.filter(function(t){return n.setAttribute("type",t),n.type===t}))}var Vl=function(){},Wl=new l.r("mat-sanity-checks"),zl=function(){function n(n){this._sanityChecksEnabled=n,this._hasDoneGlobalChecks=!1,this._hasCheckedHammer=!1,this._document="object"==typeof document&&document?document:null,this._window="object"==typeof window&&window?window:null,this._areChecksEnabled()&&!this._hasDoneGlobalChecks&&(this._checkDoctypeIsDefined(),this._checkThemeIsPresent(),this._hasDoneGlobalChecks=!0)}return n.prototype._areChecksEnabled=function(){return this._sanityChecksEnabled&&Object(l.Y)()&&!this._isTestEnv()},n.prototype._isTestEnv=function(){return this._window&&(this._window.__karma__||this._window.jasmine)},n.prototype._checkDoctypeIsDefined=function(){this._document&&!this._document.doctype&&console.warn("Current document does not have a doctype. This may cause some Angular Material components not to behave as expected.")},n.prototype._checkThemeIsPresent=function(){if(this._document&&"function"==typeof getComputedStyle){var n=this._document.createElement("div");n.classList.add("mat-theme-loaded-marker"),this._document.body.appendChild(n);var t=getComputedStyle(n);t&&"none"!==t.display&&console.warn("Could not find Angular Material core theme. Most Material components may not work as expected. For more info refer to the theming guide: https://material.angular.io/guide/theming"),this._document.body.removeChild(n)}},n.prototype._checkHammerIsAvailable=function(){!this._hasCheckedHammer&&this._window&&(this._areChecksEnabled()&&!this._window.Hammer&&console.warn("Could not find HammerJS. Certain Angular Material components may not work correctly."),this._hasCheckedHammer=!0)},n}();function Ul(n){return function(n){function t(){for(var t=[],e=0;e=0},n.prototype.isFocusable=function(n){return function(n){return!function(n){return function(n){return"input"==n.nodeName.toLowerCase()}(n)&&"hidden"==n.type}(n)&&(function(n){var t=n.nodeName.toLowerCase();return"input"===t||"select"===t||"button"===t||"textarea"===t}(n)||function(n){return function(n){return"a"==n.nodeName.toLowerCase()}(n)&&n.hasAttribute("href")}(n)||n.hasAttribute("contenteditable")||wr(n))}(n)&&!this.isDisabled(n)&&this.isVisible(n)},n}();function wr(n){if(!n.hasAttribute("tabindex")||void 0===n.tabIndex)return!1;var t=n.getAttribute("tabindex");return"-32768"!=t&&!(!t||isNaN(parseInt(t,10)))}function xr(n){if(!wr(n))return null;var t=parseInt(n.getAttribute("tabindex")||"",10);return isNaN(t)?-1:t}var Mr=function(){function n(n,t,e,l,r){void 0===r&&(r=!1),this._element=n,this._checker=t,this._ngZone=e,this._document=l,this._enabled=!0,r||this.attachAnchors()}return Object.defineProperty(n.prototype,"enabled",{get:function(){return this._enabled},set:function(n){this._enabled=n,this._startAnchor&&this._endAnchor&&(this._startAnchor.tabIndex=this._endAnchor.tabIndex=this._enabled?0:-1)},enumerable:!0,configurable:!0}),n.prototype.destroy=function(){this._startAnchor&&this._startAnchor.parentNode&&this._startAnchor.parentNode.removeChild(this._startAnchor),this._endAnchor&&this._endAnchor.parentNode&&this._endAnchor.parentNode.removeChild(this._endAnchor),this._startAnchor=this._endAnchor=null},n.prototype.attachAnchors=function(){var n=this;this._startAnchor||(this._startAnchor=this._createAnchor()),this._endAnchor||(this._endAnchor=this._createAnchor()),this._ngZone.runOutsideAngular(function(){n._startAnchor.addEventListener("focus",function(){n.focusLastTabbableElement()}),n._endAnchor.addEventListener("focus",function(){n.focusFirstTabbableElement()}),n._element.parentNode&&(n._element.parentNode.insertBefore(n._startAnchor,n._element),n._element.parentNode.insertBefore(n._endAnchor,n._element.nextSibling))})},n.prototype.focusInitialElementWhenReady=function(){var n=this;return new Promise(function(t){n._executeOnStable(function(){return t(n.focusInitialElement())})})},n.prototype.focusFirstTabbableElementWhenReady=function(){var n=this;return new Promise(function(t){n._executeOnStable(function(){return t(n.focusFirstTabbableElement())})})},n.prototype.focusLastTabbableElementWhenReady=function(){var n=this;return new Promise(function(t){n._executeOnStable(function(){return t(n.focusLastTabbableElement())})})},n.prototype._getRegionBoundary=function(n){for(var t=this._element.querySelectorAll("[cdk-focus-region-"+n+"], [cdkFocusRegion"+n+"], [cdk-focus-"+n+"]"),e=0;e=0;e--){var l=1===t[e].nodeType?this._getLastTabbableElement(t[e]):null;if(l)return l}return null},n.prototype._createAnchor=function(){var n=this._document.createElement("div");return n.tabIndex=this._enabled?0:-1,n.classList.add("cdk-visually-hidden"),n.classList.add("cdk-focus-trap-anchor"),n},n.prototype._executeOnStable=function(n){this._ngZone.isStable?n():this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1)).subscribe(n)},n}(),kr=function(){function n(n,t,e){this._checker=n,this._ngZone=t,this._document=e}return n.prototype.create=function(n,t){return void 0===t&&(t=!1),new Mr(n,this._checker,this._ngZone,this._document,t)},n}(),Cr=function(){function n(n){this._items=n,this._activeItemIndex=-1,this._wrap=!1,this._letterKeyStream=new yl.a,this._typeaheadSubscription=rl.a.EMPTY,this._pressedLetters=[],this.tabOut=new yl.a,this.change=new yl.a}return n.prototype.withWrap=function(){return this._wrap=!0,this},n.prototype.withTypeAhead=function(n){var t=this;if(void 0===n&&(n=200),this._items.length&&this._items.some(function(n){return"function"!=typeof n.getLabel}))throw Error("ListKeyManager items in typeahead mode must implement the `getLabel` method.");return this._typeaheadSubscription.unsubscribe(),this._typeaheadSubscription=this._letterKeyStream.pipe(Ve(function(n){return t._pressedLetters.push(n)}),mr(n),Ge(function(){return t._pressedLetters.length>0}),Object(Le.a)(function(){return t._pressedLetters.join("")})).subscribe(function(n){for(var e=t._items.toArray(),l=1;l=65&&t<=90||t>=48&&t<=91)&&this._letterKeyStream.next(String.fromCharCode(t)))}this._pressedLetters=[],n.preventDefault()},Object.defineProperty(n.prototype,"activeItemIndex",{get:function(){return this._activeItemIndex},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"activeItem",{get:function(){return this._activeItem},enumerable:!0,configurable:!0}),n.prototype.setFirstItemActive=function(){this._setActiveItemByIndex(0,1)},n.prototype.setLastItemActive=function(){this._setActiveItemByIndex(this._items.length-1,-1)},n.prototype.setNextItemActive=function(){this._activeItemIndex<0?this.setFirstItemActive():this._setActiveItemByDelta(1)},n.prototype.setPreviousItemActive=function(){this._activeItemIndex<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)},n.prototype.updateActiveItemIndex=function(n){this._activeItemIndex=n},n.prototype._setActiveItemByDelta=function(n,t){void 0===t&&(t=this._items.toArray()),this._wrap?this._setActiveInWrapMode(n,t):this._setActiveInDefaultMode(n,t)},n.prototype._setActiveInWrapMode=function(n,t){this._activeItemIndex=(this._activeItemIndex+n+t.length)%t.length,t[this._activeItemIndex].disabled?this._setActiveInWrapMode(n,t):this.setActiveItem(this._activeItemIndex)},n.prototype._setActiveInDefaultMode=function(n,t){this._setActiveItemByIndex(this._activeItemIndex+n,n,t)},n.prototype._setActiveItemByIndex=function(n,t,e){if(void 0===e&&(e=this._items.toArray()),e[n]){for(;e[n].disabled;)if(!e[n+=t])return;this.setActiveItem(n)}},n}(),Sr=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.setActiveItem=function(t){this.activeItem&&this.activeItem.setInactiveStyles(),n.prototype.setActiveItem.call(this,t),this.activeItem&&this.activeItem.setActiveStyles()},t}(Cr);function Or(n,t){return(n.getAttribute(t)||"").match(/\S+/g)||[]}var Tr=0,Lr=new Map,Pr=null,Dr=function(){function n(n){this._document=n}return n.prototype.describe=function(n,t){t.trim()&&(Lr.has(t)||this._createMessageElement(t),this._isElementDescribedByMessage(n,t)||this._addMessageReference(n,t))},n.prototype.removeDescription=function(n,t){if(t.trim()){this._isElementDescribedByMessage(n,t)&&this._removeMessageReference(n,t);var e=Lr.get(t);e&&0===e.referenceCount&&this._deleteMessageElement(t),Pr&&0===Pr.childNodes.length&&this._deleteMessagesContainer()}},n.prototype.ngOnDestroy=function(){for(var n=this._document.querySelectorAll("[cdk-describedby-host]"),t=0;t0?t._scrolled.pipe(qr(n)).subscribe(e):t._scrolled.subscribe(e);return t._scrolledCount++,function(){l.unsubscribe(),t._scrolledCount--,t._globalSubscription&&!t._scrolledCount&&(t._globalSubscription.unsubscribe(),t._globalSubscription=null)}}):Object(Fe.a)()},n.prototype.ancestorScrolled=function(n,t){var e=this.getAncestorScrollContainers(n);return this.scrolled(t).pipe(Ge(function(n){return!n||e.indexOf(n)>-1}))},n.prototype.getAncestorScrollContainers=function(n){var t=this,e=[];return this.scrollContainers.forEach(function(l,r){t._scrollableContainsElement(r,n)&&e.push(r)}),e},n.prototype._scrollableContainsElement=function(n,t){var e=t.nativeElement,l=n.getElementRef().nativeElement;do{if(e==l)return!0}while(e=e.parentElement);return!1},n.prototype._addGlobalListener=function(){var n=this;this._globalSubscription=this._ngZone.runOutsideAngular(function(){return zr(window.document,"scroll").subscribe(function(){return n._scrolled.next()})})},n}();function Kr(n,t,e){return n||new Qr(t,e)}var Xr=function(){function n(n,t){var e=this;this._change=n.isBrowser?t.runOutsideAngular(function(){return Object(Jr.a)(zr(window,"resize"),zr(window,"orientationchange"))}):Object(Fe.a)(),this._invalidateCache=this.change().subscribe(function(){return e._updateViewportSize()})}return n.prototype.ngOnDestroy=function(){this._invalidateCache.unsubscribe()},n.prototype.getViewportSize=function(){return this._viewportSize||this._updateViewportSize(),{width:this._viewportSize.width,height:this._viewportSize.height}},n.prototype.getViewportRect=function(){var n=this.getViewportScrollPosition(),t=this.getViewportSize(),e=t.width,l=t.height;return{top:n.top,left:n.left,bottom:n.top+l,right:n.left+e,height:l,width:e}},n.prototype.getViewportScrollPosition=function(){var n=document.documentElement.getBoundingClientRect();return{top:-n.top||document.body.scrollTop||window.scrollY||document.documentElement.scrollTop||0,left:-n.left||document.body.scrollLeft||window.scrollX||document.documentElement.scrollLeft||0}},n.prototype.change=function(n){return void 0===n&&(n=20),n>0?this._change.pipe(qr(n)):this._change},n.prototype._updateViewportSize=function(){this._viewportSize={width:window.innerWidth,height:window.innerHeight}},n}();function Zr(n,t,e){return n||new Xr(t,e)}var $r=function(){};function ni(){throw Error("Host already has a portal attached")}var ti=function(){function n(){}return n.prototype.attach=function(n){return null==n&&function(){throw Error("Attempting to attach a portal to a null PortalOutlet")}(),n.hasAttached()&&ni(),this._attachedHost=n,n.attach(this)},n.prototype.detach=function(){var n=this._attachedHost;null==n?function(){throw Error("Attempting to detach a portal that is not attached to a host")}():(this._attachedHost=null,n.detach())},Object.defineProperty(n.prototype,"isAttached",{get:function(){return null!=this._attachedHost},enumerable:!0,configurable:!0}),n.prototype.setAttachedHost=function(n){this._attachedHost=n},n}(),ei=function(n){function t(t,e,l){var r=n.call(this)||this;return r.component=t,r.viewContainerRef=e,r.injector=l,r}return Object(i.__extends)(t,n),t}(ti),li=function(n){function t(t,e,l){var r=n.call(this)||this;return r.templateRef=t,r.viewContainerRef=e,l&&(r.context=l),r}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"origin",{get:function(){return this.templateRef.elementRef},enumerable:!0,configurable:!0}),t.prototype.attach=function(t,e){return void 0===e&&(e=this.context),this.context=e,n.prototype.attach.call(this,t)},t.prototype.detach=function(){return this.context=void 0,n.prototype.detach.call(this)},t}(ti),ri=function(){function n(){this._isDisposed=!1}return n.prototype.hasAttached=function(){return!!this._attachedPortal},n.prototype.attach=function(n){return n||function(){throw Error("Must provide a portal to attach")}(),this.hasAttached()&&ni(),this._isDisposed&&function(){throw Error("This PortalOutlet has already been disposed")}(),n instanceof ei?(this._attachedPortal=n,this.attachComponentPortal(n)):n instanceof li?(this._attachedPortal=n,this.attachTemplatePortal(n)):void function(){throw Error("Attempting to attach an unknown Portal type. BasePortalOutlet accepts either a ComponentPortal or a TemplatePortal.")}()},n.prototype.detach=function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()},n.prototype.dispose=function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0},n.prototype.setDisposeFn=function(n){this._disposeFn=n},n.prototype._invokeDisposeFn=function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)},n}(),ii=function(n){function t(t,e,l,r){var i=n.call(this)||this;return i._hostDomElement=t,i._componentFactoryResolver=e,i._appRef=l,i._defaultInjector=r,i}return Object(i.__extends)(t,n),t.prototype.attachComponentPortal=function(n){var t,e=this,l=this._componentFactoryResolver.resolveComponentFactory(n.component);return n.viewContainerRef?(t=n.viewContainerRef.createComponent(l,n.viewContainerRef.length,n.injector||n.viewContainerRef.parentInjector),this.setDisposeFn(function(){return t.destroy()})):(t=l.create(n.injector||this._defaultInjector),this._appRef.attachView(t.hostView),this.setDisposeFn(function(){e._appRef.detachView(t.hostView),t.destroy()})),this._hostDomElement.appendChild(this._getComponentRootNode(t)),t},t.prototype.attachTemplatePortal=function(n){var t=this,e=n.viewContainerRef,l=e.createEmbeddedView(n.templateRef,n.context);return l.detectChanges(),l.rootNodes.forEach(function(n){return t._hostDomElement.appendChild(n)}),this.setDisposeFn(function(){var n=e.indexOf(l);-1!==n&&e.remove(n)}),l},t.prototype.dispose=function(){n.prototype.dispose.call(this),null!=this._hostDomElement.parentNode&&this._hostDomElement.parentNode.removeChild(this._hostDomElement)},t.prototype._getComponentRootNode=function(n){return n.hostView.rootNodes[0]},t}(ri),oi=function(n){function t(t,e){var l=n.call(this)||this;return l._componentFactoryResolver=t,l._viewContainerRef=e,l._isInitialized=!1,l}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"_deprecatedPortal",{get:function(){return this.portal},set:function(n){this.portal=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedPortalHost",{get:function(){return this.portal},set:function(n){this.portal=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"portal",{get:function(){return this._attachedPortal},set:function(t){(!this.hasAttached()||t||this._isInitialized)&&(this.hasAttached()&&n.prototype.detach.call(this),t&&n.prototype.attach.call(this,t),this._attachedPortal=t)},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){this._isInitialized=!0},t.prototype.ngOnDestroy=function(){n.prototype.dispose.call(this),this._attachedPortal=null},t.prototype.attachComponentPortal=function(t){t.setAttachedHost(this);var e=null!=t.viewContainerRef?t.viewContainerRef:this._viewContainerRef,l=this._componentFactoryResolver.resolveComponentFactory(t.component),r=e.createComponent(l,e.length,t.injector||e.parentInjector);return n.prototype.setDisposeFn.call(this,function(){return r.destroy()}),this._attachedPortal=t,r},t.prototype.attachTemplatePortal=function(t){var e=this;t.setAttachedHost(this);var l=this._viewContainerRef.createEmbeddedView(t.templateRef,t.context);return n.prototype.setDisposeFn.call(this,function(){return e._viewContainerRef.clear()}),this._attachedPortal=t,l},t}(ri),si=function(){},ai=function(){function n(n,t){this._parentInjector=n,this._customTokens=t}return n.prototype.get=function(n,t){var e=this._customTokens.get(n);return"undefined"!=typeof e?e:this._parentInjector.get(n,t)},n}(),ui=function(){function n(){}return n.prototype.enable=function(){},n.prototype.disable=function(){},n.prototype.attach=function(){},n}(),ci=function(){return function(n){var t=this;this.scrollStrategy=new ui,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.direction="ltr",n&&Object.keys(n).forEach(function(e){return t[e]=n[e]})}}(),di=function(n,t,e,l){this.offsetX=e,this.offsetY=l,this.originX=n.originX,this.originY=n.originY,this.overlayX=t.overlayX,this.overlayY=t.overlayY};function hi(){return Error("Scroll strategy has already been attached.")}var pi=function(){function n(n,t){this._scrollDispatcher=n,this._ngZone=t,this._scrollSubscription=null}return n.prototype.attach=function(n){if(this._overlayRef)throw hi();this._overlayRef=n},n.prototype.enable=function(){var n=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(0).subscribe(function(){n._ngZone.run(function(){n.disable(),n._overlayRef.hasAttached()&&n._overlayRef.detach()})}))},n.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},n}(),fi=function(){function n(n){this._viewportRuler=n,this._previousHTMLStyles={top:"",left:""},this._isEnabled=!1}return n.prototype.attach=function(){},n.prototype.enable=function(){if(this._canBeEnabled()){var n=document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=n.style.left||"",this._previousHTMLStyles.top=n.style.top||"",n.style.left=-this._previousScrollPosition.left+"px",n.style.top=-this._previousScrollPosition.top+"px",n.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}},n.prototype.disable=function(){if(this._isEnabled){var n=document.documentElement,t=document.body,e=n.style.scrollBehavior||"",l=t.style.scrollBehavior||"";this._isEnabled=!1,n.style.left=this._previousHTMLStyles.left,n.style.top=this._previousHTMLStyles.top,n.classList.remove("cdk-global-scrollblock"),n.style.scrollBehavior=t.style.scrollBehavior="auto",window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),n.style.scrollBehavior=e,t.style.scrollBehavior=l}},n.prototype._canBeEnabled=function(){if(document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;var n=document.body,t=this._viewportRuler.getViewportSize();return n.scrollHeight>t.height||n.scrollWidth>t.width},n}();function _i(n,t){return t.some(function(t){return n.bottomt.bottom||n.rightt.right})}function mi(n,t){return t.some(function(t){return n.topt.bottom||n.leftt.right})}var gi=function(){function n(n,t,e,l){this._scrollDispatcher=n,this._viewportRuler=t,this._ngZone=e,this._config=l,this._scrollSubscription=null}return n.prototype.attach=function(n){if(this._overlayRef)throw hi();this._overlayRef=n},n.prototype.enable=function(){var n=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe(function(){if(n._overlayRef.updatePosition(),n._config&&n._config.autoClose){var t=n._overlayRef.overlayElement.getBoundingClientRect(),e=n._viewportRuler.getViewportSize(),l=e.width,r=e.height;_i(t,[{width:l,height:r,bottom:r,right:l,top:0,left:0}])&&(n.disable(),n._ngZone.run(function(){return n._overlayRef.detach()}))}}))},n.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},n}(),yi=function(){return function(n,t,e){var l=this;this._scrollDispatcher=n,this._viewportRuler=t,this._ngZone=e,this.noop=function(){return new ui},this.close=function(){return new pi(l._scrollDispatcher,l._ngZone)},this.block=function(){return new fi(l._viewportRuler)},this.reposition=function(n){return new gi(l._scrollDispatcher,l._viewportRuler,l._ngZone,n)}}}(),bi=function(){function n(n,t,e,l,r){this._portalOutlet=n,this._pane=t,this._config=e,this._ngZone=l,this._keyboardDispatcher=r,this._backdropElement=null,this._backdropClick=new yl.a,this._attachments=new yl.a,this._detachments=new yl.a,this._keydownEvents=new yl.a,e.scrollStrategy&&e.scrollStrategy.attach(this)}return Object.defineProperty(n.prototype,"overlayElement",{get:function(){return this._pane},enumerable:!0,configurable:!0}),n.prototype.attach=function(n){var t=this,e=this._portalOutlet.attach(n);return this._config.positionStrategy&&this._config.positionStrategy.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._config.scrollStrategy&&this._config.scrollStrategy.enable(),this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1)).subscribe(function(){t.updatePosition()}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&(Array.isArray(this._config.panelClass)?this._config.panelClass.forEach(function(n){return t._pane.classList.add(n)}):this._pane.classList.add(this._config.panelClass)),this._attachments.next(),this._keyboardDispatcher.add(this),e},n.prototype.detach=function(){if(this.hasAttached()){this.detachBackdrop(),this._togglePointerEvents(!1),this._config.positionStrategy&&this._config.positionStrategy.detach&&this._config.positionStrategy.detach(),this._config.scrollStrategy&&this._config.scrollStrategy.disable();var n=this._portalOutlet.detach();return this._detachments.next(),this._keyboardDispatcher.remove(this),n}},n.prototype.dispose=function(){var n=this.hasAttached();this._config.positionStrategy&&this._config.positionStrategy.dispose(),this._config.scrollStrategy&&this._config.scrollStrategy.disable(),this.detachBackdrop(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),n&&this._detachments.next(),this._detachments.complete()},n.prototype.hasAttached=function(){return this._portalOutlet.hasAttached()},n.prototype.backdropClick=function(){return this._backdropClick.asObservable()},n.prototype.attachments=function(){return this._attachments.asObservable()},n.prototype.detachments=function(){return this._detachments.asObservable()},n.prototype.keydownEvents=function(){return this._keydownEvents.asObservable()},n.prototype.getConfig=function(){return this._config},n.prototype.updatePosition=function(){this._config.positionStrategy&&this._config.positionStrategy.apply()},n.prototype.updateSize=function(n){this._config=Object(i.__assign)({},this._config,n),this._updateElementSize()},n.prototype.setDirection=function(n){this._config=Object(i.__assign)({},this._config,{direction:n}),this._updateElementDirection()},n.prototype._updateElementDirection=function(){this._pane.setAttribute("dir",this._config.direction)},n.prototype._updateElementSize=function(){(this._config.width||0===this._config.width)&&(this._pane.style.width=vi(this._config.width)),(this._config.height||0===this._config.height)&&(this._pane.style.height=vi(this._config.height)),(this._config.minWidth||0===this._config.minWidth)&&(this._pane.style.minWidth=vi(this._config.minWidth)),(this._config.minHeight||0===this._config.minHeight)&&(this._pane.style.minHeight=vi(this._config.minHeight)),(this._config.maxWidth||0===this._config.maxWidth)&&(this._pane.style.maxWidth=vi(this._config.maxWidth)),(this._config.maxHeight||0===this._config.maxHeight)&&(this._pane.style.maxHeight=vi(this._config.maxHeight))},n.prototype._togglePointerEvents=function(n){this._pane.style.pointerEvents=n?"auto":"none"},n.prototype._attachBackdrop=function(){var n=this;this._backdropElement=document.createElement("div"),this._backdropElement.classList.add("cdk-overlay-backdrop"),this._config.backdropClass&&this._backdropElement.classList.add(this._config.backdropClass),this._pane.parentElement.insertBefore(this._backdropElement,this._pane),this._backdropElement.addEventListener("click",function(){return n._backdropClick.next(null)}),this._ngZone.runOutsideAngular(function(){requestAnimationFrame(function(){n._backdropElement&&n._backdropElement.classList.add("cdk-overlay-backdrop-showing")})})},n.prototype._updateStackingOrder=function(){this._pane.nextSibling&&this._pane.parentNode.appendChild(this._pane)},n.prototype.detachBackdrop=function(){var n=this,t=this._backdropElement;if(t){var e=function(){t&&t.parentNode&&t.parentNode.removeChild(t),n._backdropElement==t&&(n._backdropElement=null)};t.classList.remove("cdk-overlay-backdrop-showing"),this._config.backdropClass&&t.classList.remove(this._config.backdropClass),t.addEventListener("transitionend",e),t.style.pointerEvents="none",this._ngZone.runOutsideAngular(function(){setTimeout(e,500)})}},n}();function vi(n){return"string"==typeof n?n:n+"px"}var wi=function(){function n(n,t,e,l,r){this._connectedTo=e,this._viewportRuler=l,this._document=r,this._dir="ltr",this._offsetX=0,this._offsetY=0,this.scrollables=[],this._resizeSubscription=rl.a.EMPTY,this._preferredPositions=[],this._applied=!1,this._positionLocked=!1,this._onPositionChange=new yl.a,this._origin=this._connectedTo.nativeElement,this.withFallbackPosition(n,t)}return Object.defineProperty(n.prototype,"_isRtl",{get:function(){return"rtl"===this._dir},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"onPositionChange",{get:function(){return this._onPositionChange.asObservable()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"positions",{get:function(){return this._preferredPositions},enumerable:!0,configurable:!0}),n.prototype.attach=function(n){var t=this;this._overlayRef=n,this._pane=n.overlayElement,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(function(){return t.apply()})},n.prototype.dispose=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},n.prototype.detach=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},n.prototype.apply=function(){if(this._applied&&this._positionLocked&&this._lastConnectedPosition)this.recalculateLastPosition();else{this._applied=!0;for(var n,t,e=this._pane,l=this._origin.getBoundingClientRect(),r=e.getBoundingClientRect(),i=this._viewportRuler.getViewportSize(),o=0,s=this._preferredPositions;o-1&&this._attachedOverlays.splice(t,1),0===this._attachedOverlays.length&&this._unsubscribeFromKeydownEvents()},n.prototype._subscribeToKeydownEvents=function(){var n=this,t=zr(this._document.body,"keydown");this._keydownEventSubscription=t.pipe(Ge(function(){return!!n._attachedOverlays.length})).subscribe(function(t){n._selectOverlayFromEvent(t)._keydownEvents.next(t)})},n.prototype._unsubscribeFromKeydownEvents=function(){this._keydownEventSubscription&&(this._keydownEventSubscription.unsubscribe(),this._keydownEventSubscription=null)},n.prototype._selectOverlayFromEvent=function(n){return this._attachedOverlays.find(function(t){return t.overlayElement===n.target||t.overlayElement.contains(n.target)})||this._attachedOverlays[this._attachedOverlays.length-1]},n}();function Ci(n,t){return n||new ki(t)}var Si=function(){function n(n){this._document=n}return n.prototype.ngOnDestroy=function(){this._containerElement&&this._containerElement.parentNode&&this._containerElement.parentNode.removeChild(this._containerElement)},n.prototype.getContainerElement=function(){return this._containerElement||this._createContainer(),this._containerElement},n.prototype._createContainer=function(){var n=this._document.createElement("div");n.classList.add("cdk-overlay-container"),this._document.body.appendChild(n),this._containerElement=n},n}();function Oi(n,t){return n||new Si(t)}var Ti=0,Li=new ci,Pi=function(){function n(n,t,e,l,r,i,o,s,a){this.scrollStrategies=n,this._overlayContainer=t,this._componentFactoryResolver=e,this._positionBuilder=l,this._keyboardDispatcher=r,this._appRef=i,this._injector=o,this._ngZone=s,this._document=a}return n.prototype.create=function(n){void 0===n&&(n=Li);var t=this._createPaneElement(),e=this._createPortalOutlet(t);return new bi(e,t,n,this._ngZone,this._keyboardDispatcher)},n.prototype.position=function(){return this._positionBuilder},n.prototype._createPaneElement=function(){var n=this._document.createElement("div");return n.id="cdk-overlay-"+Ti++,n.classList.add("cdk-overlay-pane"),this._overlayContainer.getContainerElement().appendChild(n),n},n.prototype._createPortalOutlet=function(n){return new ii(n,this._componentFactoryResolver,this._appRef,this._injector)},n}(),Di=[new di({originX:"start",originY:"bottom"},{overlayX:"start",overlayY:"top"}),new di({originX:"start",originY:"top"},{overlayX:"start",overlayY:"bottom"}),new di({originX:"end",originY:"top"},{overlayX:"end",overlayY:"bottom"}),new di({originX:"end",originY:"bottom"},{overlayX:"end",overlayY:"top"})],Ai=new l.r("cdk-connected-overlay-scroll-strategy");function Ei(n){return function(){return n.scrollStrategies.reposition()}}var Yi=function(n){this.elementRef=n},ji=function(){function n(n,t,e,r,i){this._overlay=n,this._scrollStrategy=r,this._dir=i,this._hasBackdrop=!1,this._backdropSubscription=rl.a.EMPTY,this._positionSubscription=rl.a.EMPTY,this._offsetX=0,this._offsetY=0,this.scrollStrategy=this._scrollStrategy(),this.open=!1,this.backdropClick=new l.o,this.positionChange=new l.o,this.attach=new l.o,this.detach=new l.o,this._templatePortal=new li(t,e)}return Object.defineProperty(n.prototype,"offsetX",{get:function(){return this._offsetX},set:function(n){this._offsetX=n,this._position&&this._position.withOffsetX(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"offsetY",{get:function(){return this._offsetY},set:function(n){this._offsetY=n,this._position&&this._position.withOffsetY(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hasBackdrop",{get:function(){return this._hasBackdrop},set:function(n){this._hasBackdrop=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOrigin",{get:function(){return this.origin},set:function(n){this.origin=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedPositions",{get:function(){return this.positions},set:function(n){this.positions=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOffsetX",{get:function(){return this.offsetX},set:function(n){this.offsetX=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOffsetY",{get:function(){return this.offsetY},set:function(n){this.offsetY=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedWidth",{get:function(){return this.width},set:function(n){this.width=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedHeight",{get:function(){return this.height},set:function(n){this.height=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedMinWidth",{get:function(){return this.minWidth},set:function(n){this.minWidth=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedMinHeight",{get:function(){return this.minHeight},set:function(n){this.minHeight=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedBackdropClass",{get:function(){return this.backdropClass},set:function(n){this.backdropClass=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedScrollStrategy",{get:function(){return this.scrollStrategy},set:function(n){this.scrollStrategy=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOpen",{get:function(){return this.open},set:function(n){this.open=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedHasBackdrop",{get:function(){return this.hasBackdrop},set:function(n){this.hasBackdrop=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"overlayRef",{get:function(){return this._overlayRef},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dir",{get:function(){return this._dir?this._dir.value:"ltr"},enumerable:!0,configurable:!0}),n.prototype.ngOnDestroy=function(){this._destroyOverlay()},n.prototype.ngOnChanges=function(n){(n.open||n._deprecatedOpen)&&(this.open?this._attachOverlay():this._detachOverlay())},n.prototype._createOverlay=function(){this.positions&&this.positions.length||(this.positions=Di),this._overlayRef=this._overlay.create(this._buildConfig())},n.prototype._buildConfig=function(){var n=this._position=this._createPositionStrategy(),t=new ci({positionStrategy:n,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop});return(this.width||0===this.width)&&(t.width=this.width),(this.height||0===this.height)&&(t.height=this.height),(this.minWidth||0===this.minWidth)&&(t.minWidth=this.minWidth),(this.minHeight||0===this.minHeight)&&(t.minHeight=this.minHeight),this.backdropClass&&(t.backdropClass=this.backdropClass),t},n.prototype._createPositionStrategy=function(){var n=this.positions[0],t={originX:n.originX,originY:n.originY},e={overlayX:n.overlayX,overlayY:n.overlayY},l=this._overlay.position().connectedTo(this.origin.elementRef,t,e).withOffsetX(this.offsetX).withOffsetY(this.offsetY);return this._handlePositionChanges(l),l},n.prototype._handlePositionChanges=function(n){for(var t=this,e=1;e0&&e[0].time-l.now()<=0;)e.shift().notification.observe(r);if(e.length>0){var i=Math.max(0,e[0].time-l.now());this.schedule(n,i)}else t.active=!1},t.prototype._schedule=function(n){this.active=!0,this.add(n.schedule(t.dispatch,this.delay,{source:this,destination:this.destination,scheduler:n}))},t.prototype.scheduleNotification=function(n){if(!0!==this.errored){var t=this.scheduler,e=new Bi(t.now()+this.delay,n);this.queue.push(e),!1===this.active&&this._schedule(t)}},t.prototype._next=function(n){this.scheduleNotification(wl.createNext(n))},t.prototype._error=function(n){this.errored=!0,this.queue=[],this.destination.error(n)},t.prototype._complete=function(){this.scheduleNotification(wl.createComplete())},t}(Be.a),Bi=function(n,t){this.time=n,this.notification=t},Vi=function(n){function t(t,e){n.call(this),this.promise=t,this.scheduler=e}return Object(i.__extends)(t,n),t.create=function(n,e){return new t(n,e)},t.prototype._subscribe=function(n){var t=this,e=this.promise,l=this.scheduler;if(null==l)this._isScalar?n.closed||(n.next(this.value),n.complete()):e.then(function(e){t.value=e,t._isScalar=!0,n.closed||(n.next(e),n.complete())},function(t){n.closed||n.error(t)}).then(null,function(n){ll.a.setTimeout(function(){throw n})});else if(this._isScalar){if(!n.closed)return l.schedule(Wi,0,{value:this.value,subscriber:n})}else e.then(function(e){t.value=e,t._isScalar=!0,n.closed||n.add(l.schedule(Wi,0,{value:e,subscriber:n}))},function(t){n.closed||n.add(l.schedule(zi,0,{err:t,subscriber:n}))}).then(null,function(n){ll.a.setTimeout(function(){throw n})})},t}(o.a);function Wi(n){var t=n.subscriber;t.closed||(t.next(n.value),t.complete())}function zi(n){var t=n.subscriber;t.closed||t.error(n.err)}var Ui=Vi.create,Gi=function(){function n(){}return Object.defineProperty(n.prototype,"value",{get:function(){return this.control?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"valid",{get:function(){return this.control?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"invalid",{get:function(){return this.control?this.control.invalid:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pending",{get:function(){return this.control?this.control.pending:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"disabled",{get:function(){return this.control?this.control.disabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"enabled",{get:function(){return this.control?this.control.enabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"errors",{get:function(){return this.control?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pristine",{get:function(){return this.control?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dirty",{get:function(){return this.control?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"touched",{get:function(){return this.control?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"status",{get:function(){return this.control?this.control.status:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"untouched",{get:function(){return this.control?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"statusChanges",{get:function(){return this.control?this.control.statusChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"valueChanges",{get:function(){return this.control?this.control.valueChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),n.prototype.reset=function(n){void 0===n&&(n=void 0),this.control&&this.control.reset(n)},n.prototype.hasError=function(n,t){return!!this.control&&this.control.hasError(n,t)},n.prototype.getError=function(n,t){return this.control?this.control.getError(n,t):null},n}(),qi=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),t}(Gi);function Ji(n){return null==n||0===n.length}var Qi=new l.r("NgValidators"),Ki=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Xi=function(){function n(){}return n.min=function(n){return function(t){if(Ji(t.value)||Ji(n))return null;var e=parseFloat(t.value);return!isNaN(e)&&en?{max:{max:n,actual:t.value}}:null}},n.required=function(n){return Ji(n.value)?{required:!0}:null},n.requiredTrue=function(n){return!0===n.value?null:{required:!0}},n.email=function(n){return Ki.test(n.value)?null:{email:!0}},n.minLength=function(n){return function(t){if(Ji(t.value))return null;var e=t.value?t.value.length:0;return en?{maxlength:{requiredLength:n,actualLength:e}}:null}},n.pattern=function(t){return t?("string"==typeof t?(l="^"+t+"$",e=new RegExp(l)):(l=t.toString(),e=t),function(n){if(Ji(n.value))return null;var t=n.value;return e.test(t)?null:{pattern:{requiredPattern:l,actualValue:t}}}):n.nullValidator;var e,l},n.nullValidator=function(n){return null},n.compose=function(n){if(!n)return null;var t=n.filter(Zi);return 0==t.length?null:function(n){return no(function(n,e){return t.map(function(t){return t(n)})}(n))}},n.composeAsync=function(n){if(!n)return null;var t=n.filter(Zi);return 0==t.length?null:function(n){var e=function(n,e){return t.map(function(t){return t(n)})}(n).map($i);return Pe.call(Ne(e),no)}},n}();function Zi(n){return null!=n}function $i(n){var t=Object(l._15)(n)?Ui(n):n;if(!Object(l._14)(t))throw new Error("Expected validator to return Promise or Observable.");return t}function no(n){var t=n.reduce(function(n,t){return null!=t?Object(i.__assign)({},n,t):n},{});return 0===Object.keys(t).length?null:t}var to=new l.r("NgValueAccessor"),eo=function(){function n(n,t){this._renderer=n,this._elementRef=t,this.onChange=function(n){},this.onTouched=function(){}}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"checked",n)},n.prototype.registerOnChange=function(n){this.onChange=n},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n}(),lo=new l.r("CompositionEventMode"),ro=function(){function n(n,t,e){var l;this._renderer=n,this._elementRef=t,this._compositionMode=e,this.onChange=function(n){},this.onTouched=function(){},this._composing=!1,null==this._compositionMode&&(this._compositionMode=(l=un()?un().getUserAgent():"",!/android (\d+)/.test(l.toLowerCase())))}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==n?"":n)},n.prototype.registerOnChange=function(n){this.onChange=n},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n.prototype._handleInput=function(n){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(n)},n.prototype._compositionStart=function(){this._composing=!0},n.prototype._compositionEnd=function(n){this._composing=!1,this._compositionMode&&this.onChange(n)},n}();function io(n){return n.validate?function(t){return n.validate(t)}:n}function oo(n){return n.validate?function(t){return n.validate(t)}:n}var so=function(){function n(n,t){this._renderer=n,this._elementRef=t,this.onChange=function(n){},this.onTouched=function(){}}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==n?"":n)},n.prototype.registerOnChange=function(n){this.onChange=function(t){n(""==t?null:parseFloat(t))}},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n}();function ao(){throw new Error("unimplemented")}var uo=function(n){function t(){var t=null!==n&&n.apply(this,arguments)||this;return t._parent=null,t.name=null,t.valueAccessor=null,t._rawValidators=[],t._rawAsyncValidators=[],t}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"validator",{get:function(){return ao()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return ao()},enumerable:!0,configurable:!0}),t}(Gi),co=function(){function n(){this._accessors=[]}return n.prototype.add=function(n,t){this._accessors.push([n,t])},n.prototype.remove=function(n){for(var t=this._accessors.length-1;t>=0;--t)if(this._accessors[t][1]===n)return void this._accessors.splice(t,1)},n.prototype.select=function(n){var t=this;this._accessors.forEach(function(e){t._isSameGroup(e,n)&&e[1]!==n&&e[1].fireUncheck(n.value)})},n.prototype._isSameGroup=function(n,t){return!!n[0].control&&n[0]._parent===t._control._parent&&n[1].name===t.name},n}(),ho=function(){function n(n,t,e,l){this._renderer=n,this._elementRef=t,this._registry=e,this._injector=l,this.onChange=function(){},this.onTouched=function(){}}return n.prototype.ngOnInit=function(){this._control=this._injector.get(uo),this._checkName(),this._registry.add(this._control,this)},n.prototype.ngOnDestroy=function(){this._registry.remove(this)},n.prototype.writeValue=function(n){this._state=n===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)},n.prototype.registerOnChange=function(n){var t=this;this._fn=n,this.onChange=function(){n(t.value),t._registry.select(t)}},n.prototype.fireUncheck=function(n){this.writeValue(n)},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n.prototype._checkName=function(){this.name&&this.formControlName&&this.name!==this.formControlName&&this._throwNameError(),!this.name&&this.formControlName&&(this.name=this.formControlName)},n.prototype._throwNameError=function(){throw new Error('\n If you define both a name and a formControlName attribute on your radio button, their values\n must match. Ex: \n ')},n}(),po=function(){function n(n,t){this._renderer=n,this._elementRef=t,this.onChange=function(n){},this.onTouched=function(){}}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(n))},n.prototype.registerOnChange=function(n){this.onChange=function(t){n(""==t?null:parseFloat(t))}},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n}();function fo(n,t){return null==n?""+t:(t&&"object"==typeof t&&(t="Object"),(n+": "+t).slice(0,50))}var _o=function(){function n(n,t){this._renderer=n,this._elementRef=t,this._optionMap=new Map,this._idCounter=0,this.onChange=function(n){},this.onTouched=function(){},this._compareWith=l._16}return Object.defineProperty(n.prototype,"compareWith",{set:function(n){if("function"!=typeof n)throw new Error("compareWith must be a function, but received "+JSON.stringify(n));this._compareWith=n},enumerable:!0,configurable:!0}),n.prototype.writeValue=function(n){this.value=n;var t=this._getOptionId(n);null==t&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var e=fo(t,n);this._renderer.setProperty(this._elementRef.nativeElement,"value",e)},n.prototype.registerOnChange=function(n){var t=this;this.onChange=function(e){t.value=t._getOptionValue(e),n(t.value)}},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n.prototype._registerOption=function(){return(this._idCounter++).toString()},n.prototype._getOptionId=function(n){for(var t=0,e=Array.from(this._optionMap.keys());t-1)}}else t=function(n,t){n._setSelected(!1)};this._optionMap.forEach(t)},n.prototype.registerOnChange=function(n){var t=this;this.onChange=function(e){var l=[];if(e.hasOwnProperty("selectedOptions"))for(var r=e.selectedOptions,i=0;i1?"path: '"+n.path.join(" -> ")+"'":n.path[0]?"name: '"+n.path+"'":"unspecified name attribute",new Error(t+" "+e)}function So(n){return null!=n?Xi.compose(n.map(io)):null}function Oo(n){return null!=n?Xi.composeAsync(n.map(oo)):null}var To=[eo,po,so,_o,yo,ho];function Lo(n,t){n._syncPendingControls(),t.forEach(function(n){var t=n.control;"submit"===t.updateOn&&t._pendingChange&&(n.viewToModelUpdate(t._pendingValue),t._pendingChange=!1)})}function Po(n,t){var e=n.indexOf(t);e>-1&&n.splice(e,1)}var Do=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormGroup(this)},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormGroup(this)},Object.defineProperty(t.prototype,"control",{get:function(){return this.formDirective.getFormGroup(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return vo(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return So(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return Oo(this._asyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){},t}(qi),Ao=function(){function n(n){this._cd=n}return Object.defineProperty(n.prototype,"ngClassUntouched",{get:function(){return!!this._cd.control&&this._cd.control.untouched},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassTouched",{get:function(){return!!this._cd.control&&this._cd.control.touched},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassPristine",{get:function(){return!!this._cd.control&&this._cd.control.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassDirty",{get:function(){return!!this._cd.control&&this._cd.control.dirty},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassValid",{get:function(){return!!this._cd.control&&this._cd.control.valid},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassInvalid",{get:function(){return!!this._cd.control&&this._cd.control.invalid},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassPending",{get:function(){return!!this._cd.control&&this._cd.control.pending},enumerable:!0,configurable:!0}),n}(),Eo=function(n){function t(t){return n.call(this,t)||this}return Object(i.__extends)(t,n),t}(Ao),Yo=function(n){function t(t){return n.call(this,t)||this}return Object(i.__extends)(t,n),t}(Ao);function jo(n){var t=Ro(n)?n.validators:n;return Array.isArray(t)?So(t):t||null}function Io(n,t){var e=Ro(t)?t.asyncValidators:n;return Array.isArray(e)?Oo(e):e||null}function Ro(n){return null!=n&&!Array.isArray(n)&&"object"==typeof n}var Ho=function(){function n(n,t){this.validator=n,this.asyncValidator=t,this._onCollectionChange=function(){},this.pristine=!0,this.touched=!1,this._onDisabledChange=[]}return Object.defineProperty(n.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"valid",{get:function(){return"VALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"invalid",{get:function(){return"INVALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pending",{get:function(){return"PENDING"==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"disabled",{get:function(){return"DISABLED"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"enabled",{get:function(){return"DISABLED"!==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dirty",{get:function(){return!this.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"untouched",{get:function(){return!this.touched},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"updateOn",{get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"},enumerable:!0,configurable:!0}),n.prototype.setValidators=function(n){this.validator=jo(n)},n.prototype.setAsyncValidators=function(n){this.asyncValidator=Io(n)},n.prototype.clearValidators=function(){this.validator=null},n.prototype.clearAsyncValidators=function(){this.asyncValidator=null},n.prototype.markAsTouched=function(n){void 0===n&&(n={}),this.touched=!0,this._parent&&!n.onlySelf&&this._parent.markAsTouched(n)},n.prototype.markAsUntouched=function(n){void 0===n&&(n={}),this.touched=!1,this._pendingTouched=!1,this._forEachChild(function(n){n.markAsUntouched({onlySelf:!0})}),this._parent&&!n.onlySelf&&this._parent._updateTouched(n)},n.prototype.markAsDirty=function(n){void 0===n&&(n={}),this.pristine=!1,this._parent&&!n.onlySelf&&this._parent.markAsDirty(n)},n.prototype.markAsPristine=function(n){void 0===n&&(n={}),this.pristine=!0,this._pendingDirty=!1,this._forEachChild(function(n){n.markAsPristine({onlySelf:!0})}),this._parent&&!n.onlySelf&&this._parent._updatePristine(n)},n.prototype.markAsPending=function(n){void 0===n&&(n={}),this.status="PENDING",this._parent&&!n.onlySelf&&this._parent.markAsPending(n)},n.prototype.disable=function(n){void 0===n&&(n={}),this.status="DISABLED",this.errors=null,this._forEachChild(function(n){n.disable({onlySelf:!0})}),this._updateValue(),!1!==n.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(!!n.onlySelf),this._onDisabledChange.forEach(function(n){return n(!0)})},n.prototype.enable=function(n){void 0===n&&(n={}),this.status="VALID",this._forEachChild(function(n){n.enable({onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:n.emitEvent}),this._updateAncestors(!!n.onlySelf),this._onDisabledChange.forEach(function(n){return n(!1)})},n.prototype._updateAncestors=function(n){this._parent&&!n&&(this._parent.updateValueAndValidity(),this._parent._updatePristine(),this._parent._updateTouched())},n.prototype.setParent=function(n){this._parent=n},n.prototype.updateValueAndValidity=function(n){void 0===n&&(n={}),this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),"VALID"!==this.status&&"PENDING"!==this.status||this._runAsyncValidator(n.emitEvent)),!1!==n.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!n.onlySelf&&this._parent.updateValueAndValidity(n)},n.prototype._updateTreeValidity=function(n){void 0===n&&(n={emitEvent:!0}),this._forEachChild(function(t){return t._updateTreeValidity(n)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:n.emitEvent})},n.prototype._setInitialStatus=function(){this.status=this._allControlsDisabled()?"DISABLED":"VALID"},n.prototype._runValidator=function(){return this.validator?this.validator(this):null},n.prototype._runAsyncValidator=function(n){var t=this;if(this.asyncValidator){this.status="PENDING";var e=$i(this.asyncValidator(this));this._asyncValidationSubscription=e.subscribe(function(e){return t.setErrors(e,{emitEvent:n})})}},n.prototype._cancelExistingSubscription=function(){this._asyncValidationSubscription&&this._asyncValidationSubscription.unsubscribe()},n.prototype.setErrors=function(n,t){void 0===t&&(t={}),this.errors=n,this._updateControlsErrors(!1!==t.emitEvent)},n.prototype.get=function(n){return function(n,t,e){return null==t?null:(t instanceof Array||(t=t.split(".")),t instanceof Array&&0===t.length?null:t.reduce(function(n,t){return n instanceof Fo?n.controls[t]||null:n instanceof Bo&&n.at(t)||null},n))}(this,n)},n.prototype.getError=function(n,t){var e=t?this.get(t):this;return e&&e.errors?e.errors[n]:null},n.prototype.hasError=function(n,t){return!!this.getError(n,t)},Object.defineProperty(n.prototype,"root",{get:function(){for(var n=this;n._parent;)n=n._parent;return n},enumerable:!0,configurable:!0}),n.prototype._updateControlsErrors=function(n){this.status=this._calculateStatus(),n&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(n)},n.prototype._initObservables=function(){this.valueChanges=new l.o,this.statusChanges=new l.o},n.prototype._calculateStatus=function(){return this._allControlsDisabled()?"DISABLED":this.errors?"INVALID":this._anyControlsHaveStatus("PENDING")?"PENDING":this._anyControlsHaveStatus("INVALID")?"INVALID":"VALID"},n.prototype._anyControlsHaveStatus=function(n){return this._anyControls(function(t){return t.status===n})},n.prototype._anyControlsDirty=function(){return this._anyControls(function(n){return n.dirty})},n.prototype._anyControlsTouched=function(){return this._anyControls(function(n){return n.touched})},n.prototype._updatePristine=function(n){void 0===n&&(n={}),this.pristine=!this._anyControlsDirty(),this._parent&&!n.onlySelf&&this._parent._updatePristine(n)},n.prototype._updateTouched=function(n){void 0===n&&(n={}),this.touched=this._anyControlsTouched(),this._parent&&!n.onlySelf&&this._parent._updateTouched(n)},n.prototype._isBoxedValue=function(n){return"object"==typeof n&&null!==n&&2===Object.keys(n).length&&"value"in n&&"disabled"in n},n.prototype._registerOnCollectionChange=function(n){this._onCollectionChange=n},n.prototype._setUpdateStrategy=function(n){Ro(n)&&null!=n.updateOn&&(this._updateOn=n.updateOn)},n}(),No=function(n){function t(t,e,l){void 0===t&&(t=null);var r=n.call(this,jo(e),Io(l,e))||this;return r._onChange=[],r._applyFormState(t),r._setUpdateStrategy(e),r.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),r._initObservables(),r}return Object(i.__extends)(t,n),t.prototype.setValue=function(n,t){var e=this;void 0===t&&(t={}),this.value=this._pendingValue=n,this._onChange.length&&!1!==t.emitModelToViewChange&&this._onChange.forEach(function(n){return n(e.value,!1!==t.emitViewToModelChange)}),this.updateValueAndValidity(t)},t.prototype.patchValue=function(n,t){void 0===t&&(t={}),this.setValue(n,t)},t.prototype.reset=function(n,t){void 0===n&&(n=null),void 0===t&&(t={}),this._applyFormState(n),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1},t.prototype._updateValue=function(){},t.prototype._anyControls=function(n){return!1},t.prototype._allControlsDisabled=function(){return this.disabled},t.prototype.registerOnChange=function(n){this._onChange.push(n)},t.prototype._clearChangeFns=function(){this._onChange=[],this._onDisabledChange=[],this._onCollectionChange=function(){}},t.prototype.registerOnDisabledChange=function(n){this._onDisabledChange.push(n)},t.prototype._forEachChild=function(n){},t.prototype._syncPendingControls=function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))},t.prototype._applyFormState=function(n){this._isBoxedValue(n)?(this.value=this._pendingValue=n.value,n.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=n},t}(Ho),Fo=function(n){function t(t,e,l){var r=n.call(this,jo(e),Io(l,e))||this;return r.controls=t,r._initObservables(),r._setUpdateStrategy(e),r._setUpControls(),r.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),r}return Object(i.__extends)(t,n),t.prototype.registerControl=function(n,t){return this.controls[n]?this.controls[n]:(this.controls[n]=t,t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange),t)},t.prototype.addControl=function(n,t){this.registerControl(n,t),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.removeControl=function(n){this.controls[n]&&this.controls[n]._registerOnCollectionChange(function(){}),delete this.controls[n],this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.setControl=function(n,t){this.controls[n]&&this.controls[n]._registerOnCollectionChange(function(){}),delete this.controls[n],t&&this.registerControl(n,t),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.contains=function(n){return this.controls.hasOwnProperty(n)&&this.controls[n].enabled},t.prototype.setValue=function(n,t){var e=this;void 0===t&&(t={}),this._checkAllValuesPresent(n),Object.keys(n).forEach(function(l){e._throwIfControlMissing(l),e.controls[l].setValue(n[l],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.patchValue=function(n,t){var e=this;void 0===t&&(t={}),Object.keys(n).forEach(function(l){e.controls[l]&&e.controls[l].patchValue(n[l],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.reset=function(n,t){void 0===n&&(n={}),void 0===t&&(t={}),this._forEachChild(function(e,l){e.reset(n[l],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t),this._updatePristine(t),this._updateTouched(t)},t.prototype.getRawValue=function(){return this._reduceChildren({},function(n,t,e){return n[e]=t instanceof No?t.value:t.getRawValue(),n})},t.prototype._syncPendingControls=function(){var n=this._reduceChildren(!1,function(n,t){return!!t._syncPendingControls()||n});return n&&this.updateValueAndValidity({onlySelf:!0}),n},t.prototype._throwIfControlMissing=function(n){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[n])throw new Error("Cannot find form control with name: "+n+".")},t.prototype._forEachChild=function(n){var t=this;Object.keys(this.controls).forEach(function(e){return n(t.controls[e],e)})},t.prototype._setUpControls=function(){var n=this;this._forEachChild(function(t){t.setParent(n),t._registerOnCollectionChange(n._onCollectionChange)})},t.prototype._updateValue=function(){this.value=this._reduceValue()},t.prototype._anyControls=function(n){var t=this,e=!1;return this._forEachChild(function(l,r){e=e||t.contains(r)&&n(l)}),e},t.prototype._reduceValue=function(){var n=this;return this._reduceChildren({},function(t,e,l){return(e.enabled||n.disabled)&&(t[l]=e.value),t})},t.prototype._reduceChildren=function(n,t){var e=n;return this._forEachChild(function(n,l){e=t(e,n,l)}),e},t.prototype._allControlsDisabled=function(){for(var n=0,t=Object.keys(this.controls);n0||this.disabled},t.prototype._checkAllValuesPresent=function(n){this._forEachChild(function(t,e){if(void 0===n[e])throw new Error("Must supply a value for form control with name: '"+e+"'.")})},t}(Ho),Bo=function(n){function t(t,e,l){var r=n.call(this,jo(e),Io(l,e))||this;return r.controls=t,r._initObservables(),r._setUpdateStrategy(e),r._setUpControls(),r.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),r}return Object(i.__extends)(t,n),t.prototype.at=function(n){return this.controls[n]},t.prototype.push=function(n){this.controls.push(n),this._registerControl(n),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.insert=function(n,t){this.controls.splice(n,0,t),this._registerControl(t),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.removeAt=function(n){this.controls[n]&&this.controls[n]._registerOnCollectionChange(function(){}),this.controls.splice(n,1),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.setControl=function(n,t){this.controls[n]&&this.controls[n]._registerOnCollectionChange(function(){}),this.controls.splice(n,1),t&&(this.controls.splice(n,0,t),this._registerControl(t)),this.updateValueAndValidity(),this._onCollectionChange()},Object.defineProperty(t.prototype,"length",{get:function(){return this.controls.length},enumerable:!0,configurable:!0}),t.prototype.setValue=function(n,t){var e=this;void 0===t&&(t={}),this._checkAllValuesPresent(n),n.forEach(function(n,l){e._throwIfControlMissing(l),e.at(l).setValue(n,{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.patchValue=function(n,t){var e=this;void 0===t&&(t={}),n.forEach(function(n,l){e.at(l)&&e.at(l).patchValue(n,{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.reset=function(n,t){void 0===n&&(n=[]),void 0===t&&(t={}),this._forEachChild(function(e,l){e.reset(n[l],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t),this._updatePristine(t),this._updateTouched(t)},t.prototype.getRawValue=function(){return this.controls.map(function(n){return n instanceof No?n.value:n.getRawValue()})},t.prototype._syncPendingControls=function(){var n=this.controls.reduce(function(n,t){return!!t._syncPendingControls()||n},!1);return n&&this.updateValueAndValidity({onlySelf:!0}),n},t.prototype._throwIfControlMissing=function(n){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(n))throw new Error("Cannot find form control at index "+n)},t.prototype._forEachChild=function(n){this.controls.forEach(function(t,e){n(t,e)})},t.prototype._updateValue=function(){var n=this;this.value=this.controls.filter(function(t){return t.enabled||n.disabled}).map(function(n){return n.value})},t.prototype._anyControls=function(n){return this.controls.some(function(t){return t.enabled&&n(t)})},t.prototype._setUpControls=function(){var n=this;this._forEachChild(function(t){return n._registerControl(t)})},t.prototype._checkAllValuesPresent=function(n){this._forEachChild(function(t,e){if(void 0===n[e])throw new Error("Must supply a value for form control at index: "+e+".")})},t.prototype._allControlsDisabled=function(){for(var n=0,t=this.controls;n0||this.disabled},t.prototype._registerControl=function(n){n.setParent(this),n._registerOnCollectionChange(this._onCollectionChange)},t}(Ho),Vo=Promise.resolve(null),Wo=function(n){function t(t,e){var r=n.call(this)||this;return r.submitted=!1,r._directives=[],r.ngSubmit=new l.o,r.form=new Fo({},So(t),Oo(e)),r}return Object(i.__extends)(t,n),t.prototype.ngAfterViewInit=function(){this._setUpdateStrategy()},Object.defineProperty(t.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"controls",{get:function(){return this.form.controls},enumerable:!0,configurable:!0}),t.prototype.addControl=function(n){var t=this;Vo.then(function(){var e=t._findContainer(n.path);n.control=e.registerControl(n.name,n.control),wo(n.control,n),n.control.updateValueAndValidity({emitEvent:!1}),t._directives.push(n)})},t.prototype.getControl=function(n){return this.form.get(n.path)},t.prototype.removeControl=function(n){var t=this;Vo.then(function(){var e=t._findContainer(n.path);e&&e.removeControl(n.name),Po(t._directives,n)})},t.prototype.addFormGroup=function(n){var t=this;Vo.then(function(){var e=t._findContainer(n.path),l=new Fo({});Mo(l,n),e.registerControl(n.name,l),l.updateValueAndValidity({emitEvent:!1})})},t.prototype.removeFormGroup=function(n){var t=this;Vo.then(function(){var e=t._findContainer(n.path);e&&e.removeControl(n.name)})},t.prototype.getFormGroup=function(n){return this.form.get(n.path)},t.prototype.updateModel=function(n,t){var e=this;Vo.then(function(){e.form.get(n.path).setValue(t)})},t.prototype.setValue=function(n){this.control.setValue(n)},t.prototype.onSubmit=function(n){return this.submitted=!0,Lo(this.form,this._directives),this.ngSubmit.emit(n),!1},t.prototype.onReset=function(){this.resetForm()},t.prototype.resetForm=function(n){void 0===n&&(n=void 0),this.form.reset(n),this.submitted=!1},t.prototype._setUpdateStrategy=function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)},t.prototype._findContainer=function(n){return n.pop(),n.length?this.form.get(n):this.form},t}(qi),zo='\n
\n \n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n firstName: new FormControl()\n });',Uo='\n
\n
\n \n
\n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n person: new FormGroup({ firstName: new FormControl() })\n });',Go=function(){function n(){}return n.controlParentException=function(){throw new Error("formControlName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+zo)},n.ngModelGroupException=function(){throw new Error('formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n that also have a "form" prefix: formGroupName, formArrayName, or formGroup.\n\n Option 1: Update the parent to be formGroupName (reactive form strategy)\n\n '+Uo+'\n\n Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n \n
\n
\n \n
\n
')},n.missingFormException=function(){throw new Error("formGroup expects a FormGroup instance. Please pass one in.\n\n Example:\n\n "+zo)},n.groupParentException=function(){throw new Error("formGroupName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Uo)},n.arrayParentException=function(){throw new Error('formArrayName must be used with a parent formGroup directive. You\'ll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n \n
\n
\n
\n \n
\n
\n
\n\n In your class:\n\n this.cityArray = new FormArray([new FormControl(\'SF\')]);\n this.myGroup = new FormGroup({\n cities: this.cityArray\n });')},n.disabledAttrWarning=function(){console.warn("\n It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n you. We recommend using this approach to avoid 'changed after checked' errors.\n \n Example: \n form = new FormGroup({\n first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n last: new FormControl('Drew', Validators.required)\n });\n ")},n}(),qo=function(n){function t(t,e){var r=n.call(this)||this;return r._validators=t,r._asyncValidators=e,r.submitted=!1,r.directives=[],r.form=null,r.ngSubmit=new l.o,r}return Object(i.__extends)(t,n),t.prototype.ngOnChanges=function(n){this._checkFormPresent(),n.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())},Object.defineProperty(t.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),t.prototype.addControl=function(n){var t=this.form.get(n.path);return wo(t,n),t.updateValueAndValidity({emitEvent:!1}),this.directives.push(n),t},t.prototype.getControl=function(n){return this.form.get(n.path)},t.prototype.removeControl=function(n){Po(this.directives,n)},t.prototype.addFormGroup=function(n){var t=this.form.get(n.path);Mo(t,n),t.updateValueAndValidity({emitEvent:!1})},t.prototype.removeFormGroup=function(n){},t.prototype.getFormGroup=function(n){return this.form.get(n.path)},t.prototype.addFormArray=function(n){var t=this.form.get(n.path);Mo(t,n),t.updateValueAndValidity({emitEvent:!1})},t.prototype.removeFormArray=function(n){},t.prototype.getFormArray=function(n){return this.form.get(n.path)},t.prototype.updateModel=function(n,t){this.form.get(n.path).setValue(t)},t.prototype.onSubmit=function(n){return this.submitted=!0,Lo(this.form,this.directives),this.ngSubmit.emit(n),!1},t.prototype.onReset=function(){this.resetForm()},t.prototype.resetForm=function(n){void 0===n&&(n=void 0),this.form.reset(n),this.submitted=!1},t.prototype._updateDomValue=function(){var n=this;this.directives.forEach(function(t){var e=n.form.get(t.path);t.control!==e&&(function(n,t){t.valueAccessor.registerOnChange(function(){return ko(t)}),t.valueAccessor.registerOnTouched(function(){return ko(t)}),t._rawValidators.forEach(function(n){n.registerOnValidatorChange&&n.registerOnValidatorChange(null)}),t._rawAsyncValidators.forEach(function(n){n.registerOnValidatorChange&&n.registerOnValidatorChange(null)}),n&&n._clearChangeFns()}(t.control,t),e&&wo(e,t),t.control=e)}),this.form._updateTreeValidity({emitEvent:!1})},t.prototype._updateRegistrations=function(){var n=this;this.form._registerOnCollectionChange(function(){return n._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){}),this._oldForm=this.form},t.prototype._updateValidators=function(){var n=So(this._validators);this.form.validator=Xi.compose([this.form.validator,n]);var t=Oo(this._asyncValidators);this.form.asyncValidator=Xi.composeAsync([this.form.asyncValidator,t])},t.prototype._checkFormPresent=function(){this.form||Go.missingFormException()},t}(qi),Jo=function(n){function t(t,e,l){var r=n.call(this)||this;return r._parent=t,r._validators=e,r._asyncValidators=l,r}return Object(i.__extends)(t,n),t.prototype._checkParentType=function(){Ko(this._parent)&&Go.groupParentException()},t}(Do),Qo=function(n){function t(t,e,l){var r=n.call(this)||this;return r._parent=t,r._validators=e,r._asyncValidators=l,r}return Object(i.__extends)(t,n),t.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormArray(this)},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormArray(this)},Object.defineProperty(t.prototype,"control",{get:function(){return this.formDirective.getFormArray(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return vo(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return So(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return Oo(this._asyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){Ko(this._parent)&&Go.arrayParentException()},t}(qi);function Ko(n){return!(n instanceof Jo||n instanceof qo||n instanceof Qo)}var Xo=function(n){function t(t,e,r,i){var o=n.call(this)||this;return o._added=!1,o.update=new l.o,o._parent=t,o._rawValidators=e||[],o._rawAsyncValidators=r||[],o.valueAccessor=function(n,t){if(!t)return null;var e=void 0,l=void 0,r=void 0;return t.forEach(function(t){var i;t.constructor===ro?e=t:(i=t,To.some(function(n){return i.constructor===n})?(l&&Co(n,"More than one built-in value accessor matches form control with"),l=t):(r&&Co(n,"More than one custom value accessor matches form control with"),r=t))}),r||l||e||(Co(n,"No valid value accessor for form control with"),null)}(o,i),o}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"isDisabled",{set:function(n){Go.disabledAttrWarning()},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(n){this._added||this._setUpControl(),function(n,t){if(!n.hasOwnProperty("model"))return!1;var e=n.model;return!!e.isFirstChange()||!Object(l._16)(t,e.currentValue)}(n,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},t.prototype.viewToModelUpdate=function(n){this.viewModel=n,this.update.emit(n)},Object.defineProperty(t.prototype,"path",{get:function(){return vo(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return So(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return Oo(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){!(this._parent instanceof Jo)&&this._parent instanceof Do?Go.ngModelGroupException():this._parent instanceof Jo||this._parent instanceof qo||this._parent instanceof Qo||Go.controlParentException()},t.prototype._setUpControl=function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0},t}(uo),Zo=function(){function n(){}return Object.defineProperty(n.prototype,"required",{get:function(){return this._required},set:function(n){this._required=null!=n&&!1!==n&&""+n!="false",this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),n.prototype.validate=function(n){return this.required?Xi.required(n):null},n.prototype.registerOnValidatorChange=function(n){this._onChange=n},n}(),$o=function(){function n(){}return n.prototype.ngOnChanges=function(n){"maxlength"in n&&(this._createValidator(),this._onChange&&this._onChange())},n.prototype.validate=function(n){return null!=this.maxlength?this._validator(n):null},n.prototype.registerOnValidatorChange=function(n){this._onChange=n},n.prototype._createValidator=function(){this._validator=Xi.maxLength(parseInt(this.maxlength,10))},n}(),ns=function(){function n(){}return n.prototype.group=function(n,t){void 0===t&&(t=null);var e=this._reduceControls(n);return new Fo(e,null!=t?t.validator:null,null!=t?t.asyncValidator:null)},n.prototype.control=function(n,t,e){return new No(n,t,e)},n.prototype.array=function(n,t,e){var l=this,r=n.map(function(n){return l._createControl(n)});return new Bo(r,t,e)},n.prototype._reduceControls=function(n){var t=this,e={};return Object.keys(n).forEach(function(l){e[l]=t._createControl(n[l])}),e},n.prototype._createControl=function(n){return n instanceof No||n instanceof Fo||n instanceof Bo?n:Array.isArray(n)?this.control(n[0],n.length>1?n[1]:null,n.length>2?n[2]:null):this.control(n)},n}(),ts=function(){},es=function(){},ls=function(){},rs=function(){},is="*";function os(n,t){return void 0===t&&(t=null),{type:2,steps:n,options:t}}function ss(n){return{type:6,styles:n,offset:null}}function as(n){Promise.resolve(null).then(n)}var us=function(){function n(){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this.parentPlayer=null,this.totalTime=0}return n.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(n){return n()}),this._onDoneFns=[])},n.prototype.onStart=function(n){this._onStartFns.push(n)},n.prototype.onDone=function(n){this._onDoneFns.push(n)},n.prototype.onDestroy=function(n){this._onDestroyFns.push(n)},n.prototype.hasStarted=function(){return this._started},n.prototype.init=function(){},n.prototype.play=function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0},n.prototype.triggerMicrotask=function(){var n=this;as(function(){return n._onFinish()})},n.prototype._onStart=function(){this._onStartFns.forEach(function(n){return n()}),this._onStartFns=[]},n.prototype.pause=function(){},n.prototype.restart=function(){},n.prototype.finish=function(){this._onFinish()},n.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(n){return n()}),this._onDestroyFns=[])},n.prototype.reset=function(){},n.prototype.setPosition=function(n){},n.prototype.getPosition=function(){return 0},n.prototype.triggerCallback=function(n){var t="start"==n?this._onStartFns:this._onDoneFns;t.forEach(function(n){return n()}),t.length=0},n}(),cs=function(){function n(n){var t=this;this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=n;var e=0,l=0,r=0,i=this.players.length;0==i?as(function(){return t._onFinish()}):this.players.forEach(function(n){n.onDone(function(){++e==i&&t._onFinish()}),n.onDestroy(function(){++l==i&&t._onDestroy()}),n.onStart(function(){++r==i&&t._onStart()})}),this.totalTime=this.players.reduce(function(n,t){return Math.max(n,t.totalTime)},0)}return n.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(n){return n()}),this._onDoneFns=[])},n.prototype.init=function(){this.players.forEach(function(n){return n.init()})},n.prototype.onStart=function(n){this._onStartFns.push(n)},n.prototype._onStart=function(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(function(n){return n()}),this._onStartFns=[])},n.prototype.onDone=function(n){this._onDoneFns.push(n)},n.prototype.onDestroy=function(n){this._onDestroyFns.push(n)},n.prototype.hasStarted=function(){return this._started},n.prototype.play=function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(function(n){return n.play()})},n.prototype.pause=function(){this.players.forEach(function(n){return n.pause()})},n.prototype.restart=function(){this.players.forEach(function(n){return n.restart()})},n.prototype.finish=function(){this._onFinish(),this.players.forEach(function(n){return n.finish()})},n.prototype.destroy=function(){this._onDestroy()},n.prototype._onDestroy=function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(function(n){return n.destroy()}),this._onDestroyFns.forEach(function(n){return n()}),this._onDestroyFns=[])},n.prototype.reset=function(){this.players.forEach(function(n){return n.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1},n.prototype.setPosition=function(n){var t=n*this.totalTime;this.players.forEach(function(n){var e=n.totalTime?Math.min(1,t/n.totalTime):1;n.setPosition(e)})},n.prototype.getPosition=function(){var n=0;return this.players.forEach(function(t){var e=t.getPosition();n=Math.min(e,n)}),n},n.prototype.beforeDestroy=function(){this.players.forEach(function(n){n.beforeDestroy&&n.beforeDestroy()})},n.prototype.triggerCallback=function(n){var t="start"==n?this._onStartFns:this._onDoneFns;t.forEach(function(n){return n()}),t.length=0},n}(),ds="!",hs=e("TILf"),ps=e("N4j0"),fs=e("cQXm"),_s=function(n){function t(t,e){if(n.call(this),this.scheduler=e,null==t)throw new Error("iterator cannot be null.");this.iterator=ys(t)}return Object(i.__extends)(t,n),t.create=function(n,e){return new t(n,e)},t.dispatch=function(n){var t=n.index,e=n.iterator,l=n.subscriber;if(n.hasError)l.error(n.error);else{var r=e.next();r.done?l.complete():(l.next(r.value),n.index=t+1,l.closed?"function"==typeof e.return&&e.return():this.schedule(n))}},t.prototype._subscribe=function(n){var e=this.iterator,l=this.scheduler;if(l)return l.schedule(t.dispatch,0,{index:0,iterator:e,subscriber:n});for(;;){var r=e.next();if(r.done){n.complete();break}if(n.next(r.value),n.closed){"function"==typeof e.return&&e.return();break}}},t}(o.a),ms=function(){function n(n,t,e){void 0===t&&(t=0),void 0===e&&(e=n.length),this.str=n,this.idx=t,this.len=e}return n.prototype[hl.a]=function(){return this},n.prototype.next=function(){return this.idxbs?bs:r:r}()),this.arr=n,this.idx=t,this.len=e}return n.prototype[hl.a]=function(){return this},n.prototype.next=function(){return this.idx=n.length?l.complete():(l.next(t[e]),n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.arrayLike,l=this.scheduler,r=e.length;if(l)return l.schedule(t.dispatch,0,{arrayLike:e,index:0,length:r,subscriber:n});for(var i=0;i1?new dl.a(n,e):new je.a(e),t)}}var Os=function(){};function Ts(n){return Error("A hint was already declared for 'align=\""+n+"\"'.")}var Ls=0,Ps=function(){function n(n,t,e){this._elementRef=n,this._changeDetectorRef=t,this.color="primary",this._showAlwaysAnimate=!1,this._subscriptAnimationState="",this._hintLabel="",this._hintLabelId="mat-hint-"+Ls++,this._labelOptions=e||{},this.floatLabel=this._labelOptions.float||"auto"}return Object.defineProperty(n.prototype,"dividerColor",{get:function(){return this.color},set:function(n){this.color=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hideRequiredMarker",{get:function(){return this._hideRequiredMarker},set:function(n){this._hideRequiredMarker=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_shouldAlwaysFloat",{get:function(){return"always"===this._floatLabel&&!this._showAlwaysAnimate},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_canLabelFloat",{get:function(){return"never"!==this._floatLabel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hintLabel",{get:function(){return this._hintLabel},set:function(n){this._hintLabel=n,this._processHints()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"floatPlaceholder",{get:function(){return this._floatLabel},set:function(n){this.floatLabel=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"floatLabel",{get:function(){return this._floatLabel},set:function(n){n!==this._floatLabel&&(this._floatLabel=n||this._labelOptions.float||"auto",this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){var n=this;this._validateControlChild(),this._control.controlType&&this._elementRef.nativeElement.classList.add("mat-form-field-type-"+this._control.controlType),this._control.stateChanges.pipe(Ss(null)).subscribe(function(){n._validatePlaceholders(),n._syncDescribedByIds(),n._changeDetectorRef.markForCheck()});var t=this._control.ngControl;t&&t.valueChanges&&t.valueChanges.subscribe(function(){n._changeDetectorRef.markForCheck()}),this._hintChildren.changes.pipe(Ss(null)).subscribe(function(){n._processHints(),n._changeDetectorRef.markForCheck()}),this._errorChildren.changes.pipe(Ss(null)).subscribe(function(){n._syncDescribedByIds(),n._changeDetectorRef.markForCheck()})},n.prototype.ngAfterContentChecked=function(){this._validateControlChild()},n.prototype.ngAfterViewInit=function(){this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()},n.prototype._shouldForward=function(n){var t=this._control?this._control.ngControl:null;return t&&t[n]},n.prototype._hasPlaceholder=function(){return!(!this._control.placeholder&&!this._placeholderChild)},n.prototype._hasLabel=function(){return!!this._labelChild},n.prototype._shouldLabelFloat=function(){return this._canLabelFloat&&(this._control.shouldLabelFloat||this._control.shouldPlaceholderFloat||this._shouldAlwaysFloat)},n.prototype._hideControlPlaceholder=function(){return!this._hasLabel()||!this._shouldLabelFloat()},n.prototype._hasFloatingLabel=function(){return this._hasLabel()||this._hasPlaceholder()},n.prototype._getDisplayedMessages=function(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"},n.prototype._animateAndLockLabel=function(){var n=this;this._hasFloatingLabel()&&this._canLabelFloat&&(this._showAlwaysAnimate=!0,this._floatLabel="always",zr(this._label.nativeElement,"transitionend").pipe(Object(_r.a)(1)).subscribe(function(){n._showAlwaysAnimate=!1}),this._changeDetectorRef.markForCheck())},n.prototype._validatePlaceholders=function(){if(this._control.placeholder&&this._placeholderChild)throw Error("Placeholder attribute and child element were both specified.")},n.prototype._processHints=function(){this._validateHints(),this._syncDescribedByIds()},n.prototype._validateHints=function(){var n,t,e=this;this._hintChildren&&this._hintChildren.forEach(function(l){if("start"==l.align){if(n||e.hintLabel)throw Ts("start");n=l}else if("end"==l.align){if(t)throw Ts("end");t=l}})},n.prototype._syncDescribedByIds=function(){if(this._control){var n=[];if("hint"===this._getDisplayedMessages()){var t=this._hintChildren?this._hintChildren.find(function(n){return"start"===n.align}):null,e=this._hintChildren?this._hintChildren.find(function(n){return"end"===n.align}):null;t?n.push(t.id):this._hintLabel&&n.push(this._hintLabelId),e&&n.push(e.id)}else this._errorChildren&&(n=this._errorChildren.map(function(n){return n.id}));this._control.setDescribedByIds(n)}},n.prototype._validateControlChild=function(){if(!this._control)throw Error("mat-form-field must contain a MatFormFieldControl.")},n}(),Ds=function(){},As=0,Es=function(){function n(n,t){this._changeDetectorRef=n,this._elementRef=t,this.showPanel=!1,this._isOpen=!1,this.displayWith=null,this.optionSelected=new l.o,this._classList={},this.id="mat-autocomplete-"+As++}return Object.defineProperty(n.prototype,"isOpen",{get:function(){return this._isOpen&&this.showPanel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"classList",{set:function(n){var t=this;n&&n.length&&(n.split(" ").forEach(function(n){return t._classList[n.trim()]=!0}),this._elementRef.nativeElement.className="")},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){this._keyManager=new Sr(this.options).withWrap(),this._setVisibility()},n.prototype._setScrollTop=function(n){this.panel&&(this.panel.nativeElement.scrollTop=n)},n.prototype._getScrollTop=function(){return this.panel?this.panel.nativeElement.scrollTop:0},n.prototype._setVisibility=function(){this.showPanel=!!this.options.length,this._classList["mat-autocomplete-visible"]=this.showPanel,this._classList["mat-autocomplete-hidden"]=!this.showPanel,this._changeDetectorRef.markForCheck()},n.prototype._emitSelectEvent=function(n){var t=new function(n,t){this.source=n,this.option=t}(this,n);this.optionSelected.emit(t)},n}(),Ys=new l.r("mat-autocomplete-scroll-strategy");function js(n){return function(){return n.scrollStrategies.reposition()}}var Is=function(){function n(n,t,e,l,r,i,o,s,a){this._element=n,this._overlay=t,this._viewContainerRef=e,this._zone=l,this._changeDetectorRef=r,this._scrollStrategy=i,this._dir=o,this._formField=s,this._document=a,this._panelOpen=!1,this._manuallyFloatingLabel=!1,this._escapeEventStream=new yl.a,this._onChange=function(){},this._onTouched=function(){}}return n.prototype.ngOnDestroy=function(){this._destroyPanel(),this._escapeEventStream.complete()},Object.defineProperty(n.prototype,"panelOpen",{get:function(){return this._panelOpen&&this.autocomplete.showPanel},enumerable:!0,configurable:!0}),n.prototype.openPanel=function(){this._attachOverlay(),this._floatLabel()},n.prototype.closePanel=function(){this._resetLabel(),this._panelOpen&&(this.autocomplete._isOpen=this._panelOpen=!1,this._overlayRef&&this._overlayRef.hasAttached()&&(this._overlayRef.detach(),this._closingActionsSubscription.unsubscribe()),this._changeDetectorRef.detectChanges())},Object.defineProperty(n.prototype,"panelClosingActions",{get:function(){var n=this;return Object(Jr.a)(this.optionSelections,this.autocomplete._keyManager.tabOut.pipe(Ge(function(){return n._panelOpen})),this._escapeEventStream,this._outsideClickStream,this._overlayRef?this._overlayRef.detachments().pipe(Ge(function(){return n._panelOpen})):Object(Fe.a)())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"optionSelections",{get:function(){return Jr.a.apply(void 0,this.autocomplete.options.map(function(n){return n.onSelectionChange}))},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"activeOption",{get:function(){return this.autocomplete&&this.autocomplete._keyManager?this.autocomplete._keyManager.activeItem:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_outsideClickStream",{get:function(){var n=this;return this._document?Object(Jr.a)(zr(this._document,"click"),zr(this._document,"touchend")).pipe(Ge(function(t){var e=t.target,l=n._formField?n._formField._elementRef.nativeElement:null;return n._panelOpen&&e!==n._element.nativeElement&&(!l||!l.contains(e))&&!!n._overlayRef&&!n._overlayRef.overlayElement.contains(e)})):Object(Fe.a)(null)},enumerable:!0,configurable:!0}),n.prototype.writeValue=function(n){var t=this;Promise.resolve(null).then(function(){return t._setTriggerValue(n)})},n.prototype.registerOnChange=function(n){this._onChange=n},n.prototype.registerOnTouched=function(n){this._onTouched=n},n.prototype.setDisabledState=function(n){this._element.nativeElement.disabled=n},n.prototype._handleKeydown=function(n){var t=n.keyCode;if(27===t&&this.panelOpen)this._resetActiveItem(),this._escapeEventStream.next(),n.stopPropagation();else if(this.activeOption&&13===t&&this.panelOpen)this.activeOption._selectViaInteraction(),this._resetActiveItem(),n.preventDefault();else{var e=this.autocomplete._keyManager.activeItem,l=38===t||40===t;this.panelOpen||9===t?this.autocomplete._keyManager.onKeydown(n):l&&this.openPanel(),(l||this.autocomplete._keyManager.activeItem!==e)&&this._scrollToOption()}},n.prototype._handleInput=function(n){document.activeElement===n.target&&(this._onChange(n.target.value),this.openPanel())},n.prototype._handleFocus=function(){this._element.nativeElement.readOnly||(this._attachOverlay(),this._floatLabel(!0))},n.prototype._floatLabel=function(n){void 0===n&&(n=!1),this._formField&&"auto"===this._formField.floatLabel&&(n?this._formField._animateAndLockLabel():this._formField.floatLabel="always",this._manuallyFloatingLabel=!0)},n.prototype._resetLabel=function(){this._manuallyFloatingLabel&&(this._formField.floatLabel="auto",this._manuallyFloatingLabel=!1)},n.prototype._scrollToOption=function(){var n=this.autocomplete._keyManager.activeItemIndex||0,t=48*(n+pr.countGroupLabelsBeforeOption(n,this.autocomplete.options,this.autocomplete.optionGroups)),e=this.autocomplete._getScrollTop();te+256&&this.autocomplete._setScrollTop(Math.max(0,t-256+48))},n.prototype._subscribeToClosingActions=function(){var n=this,t=this._zone.onStable.asObservable().pipe(Object(_r.a)(1)),e=this.autocomplete.options.changes.pipe(Ve(function(){return n._positionStrategy.recalculateLastPosition()}),Hi(0));return Object(Jr.a)(t,e).pipe(Object(Ri.a)(function(){return n._resetActiveItem(),n.autocomplete._setVisibility(),n.panelClosingActions}),Object(_r.a)(1)).subscribe(function(t){return n._setValueAndClose(t)})},n.prototype._destroyPanel=function(){this._overlayRef&&(this.closePanel(),this._overlayRef.dispose(),this._overlayRef=null)},n.prototype._setTriggerValue=function(n){var t=this.autocomplete&&this.autocomplete.displayWith?this.autocomplete.displayWith(n):n,e=null!=t?t:"";this._formField?this._formField._control.value=e:this._element.nativeElement.value=e},n.prototype._setValueAndClose=function(n){n&&n.source&&(this._clearPreviousSelectedOption(n.source),this._setTriggerValue(n.source.value),this._onChange(n.source.value),this._element.nativeElement.focus(),this.autocomplete._emitSelectEvent(n.source)),this.closePanel()},n.prototype._clearPreviousSelectedOption=function(n){this.autocomplete.options.forEach(function(t){t!=n&&t.selected&&t.deselect()})},n.prototype._attachOverlay=function(){if(!this.autocomplete)throw Error("Attempting to open an undefined instance of `mat-autocomplete`. Make sure that the id passed to the `matAutocomplete` is correct and that you're attempting to open it after the ngAfterContentInit hook.");this._overlayRef?this._overlayRef.updateSize({width:this._getHostWidth()}):(this._portal=new li(this.autocomplete.template,this._viewContainerRef),this._overlayRef=this._overlay.create(this._getOverlayConfig())),this._overlayRef&&!this._overlayRef.hasAttached()&&(this._overlayRef.attach(this._portal),this._closingActionsSubscription=this._subscribeToClosingActions()),this.autocomplete._setVisibility(),this.autocomplete._isOpen=this._panelOpen=!0},n.prototype._getOverlayConfig=function(){return new ci({positionStrategy:this._getOverlayPosition(),scrollStrategy:this._scrollStrategy(),width:this._getHostWidth(),direction:this._dir?this._dir.value:"ltr"})},n.prototype._getOverlayPosition=function(){return this._positionStrategy=this._overlay.position().connectedTo(this._getConnectedElement(),{originX:"start",originY:"bottom"},{overlayX:"start",overlayY:"top"}).withFallbackPosition({originX:"start",originY:"top"},{overlayX:"start",overlayY:"bottom"}),this._positionStrategy},n.prototype._getConnectedElement=function(){return this._formField?this._formField._connectionContainerRef:this._element},n.prototype._getHostWidth=function(){return this._getConnectedElement().nativeElement.getBoundingClientRect().width},n.prototype._resetActiveItem=function(){this.autocomplete._keyManager.setActiveItem(-1)},n}(),Rs=function(){},Hs=function(){},Ns=function(){},Fs=function(){},Bs=function(n){function t(t,e,l){var r=n.call(this,t)||this;return r._platform=e,r._focusMonitor=l,r._isRoundButton=r._hasHostAttributes("mat-fab","mat-mini-fab"),r._isIconButton=r._hasHostAttributes("mat-icon-button"),r._focusMonitor.monitor(r._elementRef.nativeElement,!0),r}return Object(i.__extends)(t,n),t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement)},t.prototype.focus=function(){this._getHostElement().focus()},t.prototype._getHostElement=function(){return this._elementRef.nativeElement},t.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},t.prototype._hasHostAttributes=function(){for(var n=this,t=[],e=0;e1&&!this._isMulti)throw Error("Cannot pass multiple values into SelectionModel with single-value mode.")},n}(),Us=function(n,t){this.added=n,this.removed=t},Gs=function(){function n(){this._listeners=[]}return n.prototype.notify=function(n,t){for(var e=0,l=this._listeners;e0?this._ngZone.runOutsideAngular(function(){n._debouncer.pipe(mr(n.debounce)).subscribe(function(t){return n.event.emit(t)})}):this._debouncer.subscribe(function(t){return n.event.emit(t)}),this._observer=this._ngZone.runOutsideAngular(function(){return n._mutationObserverFactory.create(function(t){n._debouncer.next(t)})}),this._observer&&this._observer.observe(this._elementRef.nativeElement,{characterData:!0,childList:!0,subtree:!0})},n.prototype.ngOnDestroy=function(){this._observer&&this._observer.disconnect(),this._debouncer.complete()},n}(),Xs=function(){},Zs=new l.r("mat-checkbox-click-action"),$s=0,na=function(){var n={Init:0,Checked:1,Unchecked:2,Indeterminate:3};return n[n.Init]="Init",n[n.Checked]="Checked",n[n.Unchecked]="Unchecked",n[n.Indeterminate]="Indeterminate",n}(),ta=function(n){function t(t,e,r,i,o){var s=n.call(this,t)||this;return s._changeDetectorRef=e,s._focusMonitor=r,s._clickAction=o,s.ariaLabel="",s.ariaLabelledby=null,s._uniqueId="mat-checkbox-"+ ++$s,s.id=s._uniqueId,s.labelPosition="after",s.name=null,s.change=new l.o,s.indeterminateChange=new l.o,s._rippleConfig={centered:!0,radius:25,speedFactor:1.5},s.onTouched=function(){},s._currentAnimationClass="",s._currentCheckState=na.Init,s._checked=!1,s._indeterminate=!1,s._controlValueAccessorChangeFn=function(){},s.tabIndex=parseInt(i)||0,s}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"inputId",{get:function(){return(this.id||this._uniqueId)+"-input"},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(n){this._required=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"align",{get:function(){return"after"==this.labelPosition?"start":"end"},set:function(n){this.labelPosition="start"==n?"after":"before"},enumerable:!0,configurable:!0}),t.prototype.ngAfterViewInit=function(){var n=this;this._focusMonitor.monitor(this._inputElement.nativeElement,!1).subscribe(function(t){return n._onInputFocusChange(t)})},t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._inputElement.nativeElement)},Object.defineProperty(t.prototype,"checked",{get:function(){return this._checked},set:function(n){n!=this.checked&&(this._checked=n,this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"indeterminate",{get:function(){return this._indeterminate},set:function(n){var t=n!=this._indeterminate;this._indeterminate=n,t&&(this._transitionCheckState(this._indeterminate?na.Indeterminate:this.checked?na.Checked:na.Unchecked),this.indeterminateChange.emit(this._indeterminate))},enumerable:!0,configurable:!0}),t.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},t.prototype._onLabelTextChange=function(){this._changeDetectorRef.markForCheck()},t.prototype.writeValue=function(n){this.checked=!!n},t.prototype.registerOnChange=function(n){this._controlValueAccessorChangeFn=n},t.prototype.registerOnTouched=function(n){this.onTouched=n},t.prototype.setDisabledState=function(n){this.disabled=n,this._changeDetectorRef.markForCheck()},t.prototype._getAriaChecked=function(){return this.checked?"true":this.indeterminate?"mixed":"false"},t.prototype._transitionCheckState=function(n){var t=this._currentCheckState,e=this._elementRef.nativeElement;t!==n&&(this._currentAnimationClass.length>0&&e.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(t,n),this._currentCheckState=n,this._currentAnimationClass.length>0&&e.classList.add(this._currentAnimationClass))},t.prototype._emitChangeEvent=function(){var n=new function(){};n.source=this,n.checked=this.checked,this._controlValueAccessorChangeFn(this.checked),this.change.emit(n)},t.prototype._onInputFocusChange=function(n){this._focusRipple||"keyboard"!==n?n||(this._removeFocusRipple(),this.onTouched()):this._focusRipple=this._ripple.launch(0,0,Object(i.__assign)({persistent:!0},this._rippleConfig))},t.prototype.toggle=function(){this.checked=!this.checked},t.prototype._onInputClick=function(n){var t=this;n.stopPropagation(),this.disabled||"noop"===this._clickAction?this.disabled||"noop"!==this._clickAction||(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate):(this.indeterminate&&"check"!==this._clickAction&&Promise.resolve().then(function(){t._indeterminate=!1,t.indeterminateChange.emit(t._indeterminate)}),this.toggle(),this._transitionCheckState(this._checked?na.Checked:na.Unchecked),this._emitChangeEvent())},t.prototype.focus=function(){this._focusMonitor.focusVia(this._inputElement.nativeElement,"keyboard")},t.prototype._onInteractionEvent=function(n){n.stopPropagation()},t.prototype._getAnimationClassForCheckStateTransition=function(n,t){var e="";switch(n){case na.Init:if(t===na.Checked)e="unchecked-checked";else{if(t!=na.Indeterminate)return"";e="unchecked-indeterminate"}break;case na.Unchecked:e=t===na.Checked?"unchecked-checked":"unchecked-indeterminate";break;case na.Checked:e=t===na.Unchecked?"checked-unchecked":"checked-indeterminate";break;case na.Indeterminate:e=t===na.Checked?"indeterminate-checked":"indeterminate-unchecked"}return"mat-checkbox-anim-"+e},t.prototype._removeFocusRipple=function(){this._focusRipple&&(this._focusRipple.fadeOut(),this._focusRipple=null)},t}(Jl(Gl(ql(Ul(function(n){this._elementRef=n})),"accent"))),ea=function(){},la=function(n){function t(t){n.call(this),this.observableFactory=t}return Object(i.__extends)(t,n),t.create=function(n){return new t(n)},t.prototype._subscribe=function(n){return new ra(n,this.observableFactory)},t}(o.a),ra=function(n){function t(t,e){n.call(this,t),this.factory=e,this.tryDefer()}return Object(i.__extends)(t,n),t.prototype.tryDefer=function(){try{this._callFactory()}catch(n){this._error(n)}},t.prototype._callFactory=function(){var n=this.factory();n&&this.add(Object(ke.a)(this,n))},t}(Me.a),ia=la.create,oa=function(){this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.direction="ltr",this.ariaDescribedBy=null,this.ariaLabel=null,this.autoFocus=!0};function sa(){throw Error("Attempting to attach dialog content after content is already attached")}var aa=function(n){function t(t,e,r,i){var o=n.call(this)||this;return o._elementRef=t,o._focusTrapFactory=e,o._changeDetectorRef=r,o._document=i,o._elementFocusedBeforeDialogWasOpened=null,o._state="enter",o._animationStateChanged=new l.o,o._ariaLabelledBy=null,o}return Object(i.__extends)(t,n),t.prototype.attachComponentPortal=function(n){return this._portalOutlet.hasAttached()&&sa(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachComponentPortal(n)},t.prototype.attachTemplatePortal=function(n){return this._portalOutlet.hasAttached()&&sa(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachTemplatePortal(n)},t.prototype._trapFocus=function(){this._focusTrap||(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)),this._config.autoFocus&&this._focusTrap.focusInitialElementWhenReady()},t.prototype._restoreFocus=function(){var n=this._elementFocusedBeforeDialogWasOpened;n&&"function"==typeof n.focus&&n.focus(),this._focusTrap&&this._focusTrap.destroy()},t.prototype._savePreviouslyFocusedElement=function(){var n=this;this._document&&(this._elementFocusedBeforeDialogWasOpened=this._document.activeElement,Promise.resolve().then(function(){return n._elementRef.nativeElement.focus()}))},t.prototype._onAnimationDone=function(n){"enter"===n.toState?this._trapFocus():"exit"===n.toState&&this._restoreFocus(),this._animationStateChanged.emit(n)},t.prototype._onAnimationStart=function(n){this._animationStateChanged.emit(n)},t.prototype._startExitAnimation=function(){this._state="exit",this._changeDetectorRef.markForCheck()},t}(ri),ua=0,ca=function(){function n(n,t,e){void 0===e&&(e="mat-dialog-"+ua++);var l=this;this._overlayRef=n,this._containerInstance=t,this.id=e,this.disableClose=this._containerInstance._config.disableClose,this._afterOpen=new yl.a,this._afterClosed=new yl.a,this._beforeClose=new yl.a,t._animationStateChanged.pipe(Ge(function(n){return"done"===n.phaseName&&"enter"===n.toState}),Object(_r.a)(1)).subscribe(function(){l._afterOpen.next(),l._afterOpen.complete()}),t._animationStateChanged.pipe(Ge(function(n){return"done"===n.phaseName&&"exit"===n.toState}),Object(_r.a)(1)).subscribe(function(){l._overlayRef.dispose(),l._afterClosed.next(l._result),l._afterClosed.complete(),l.componentInstance=null})}return n.prototype.close=function(n){var t=this;this._result=n,this._containerInstance._animationStateChanged.pipe(Ge(function(n){return"start"===n.phaseName}),Object(_r.a)(1)).subscribe(function(){t._beforeClose.next(n),t._beforeClose.complete(),t._overlayRef.detachBackdrop()}),this._containerInstance._startExitAnimation()},n.prototype.afterOpen=function(){return this._afterOpen.asObservable()},n.prototype.afterClosed=function(){return this._afterClosed.asObservable()},n.prototype.beforeClose=function(){return this._beforeClose.asObservable()},n.prototype.backdropClick=function(){return this._overlayRef.backdropClick()},n.prototype.keydownEvents=function(){return this._overlayRef.keydownEvents()},n.prototype.updatePosition=function(n){var t=this._getPositionStrategy();return n&&(n.left||n.right)?n.left?t.left(n.left):t.right(n.right):t.centerHorizontally(),n&&(n.top||n.bottom)?n.top?t.top(n.top):t.bottom(n.bottom):t.centerVertically(),this._overlayRef.updatePosition(),this},n.prototype.updateSize=function(n,t){return void 0===n&&(n="auto"),void 0===t&&(t="auto"),this._getPositionStrategy().width(n).height(t),this._overlayRef.updatePosition(),this},n.prototype._getPositionStrategy=function(){return this._overlayRef.getConfig().positionStrategy},n}(),da=new l.r("MatDialogData"),ha=new l.r("mat-dialog-scroll-strategy");function pa(n){return function(){return n.scrollStrategies.block()}}var fa=function(){function n(n,t,e,l,r,i){var o=this;this._overlay=n,this._injector=t,this._scrollStrategy=l,this._parentDialog=r,this._overlayContainer=i,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new yl.a,this._afterOpenAtThisLevel=new yl.a,this._ariaHiddenElements=new Map,this.afterAllClosed=ia(function(){return o.openDialogs.length?o._afterAllClosed:o._afterAllClosed.pipe(Ss(void 0))}),!r&&e&&e.subscribe(function(){return o.closeAll()})}return Object.defineProperty(n.prototype,"openDialogs",{get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"afterOpen",{get:function(){return this._parentDialog?this._parentDialog.afterOpen:this._afterOpenAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_afterAllClosed",{get:function(){var n=this._parentDialog;return n?n._afterAllClosed:this._afterAllClosedAtThisLevel},enumerable:!0,configurable:!0}),n.prototype.open=function(n,t){var e=this;if((t=function(n){return Object(i.__assign)({},new oa,n)}(t)).id&&this.getDialogById(t.id))throw Error('Dialog with id "'+t.id+'" exists already. The dialog id must be unique.');var l=this._createOverlay(t),r=this._attachDialogContainer(l,t),o=this._attachDialogContent(n,r,l,t);return this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(o),o.afterClosed().subscribe(function(){return e._removeOpenDialog(o)}),this.afterOpen.next(o),o},n.prototype.closeAll=function(){for(var n=this.openDialogs.length;n--;)this.openDialogs[n].close()},n.prototype.getDialogById=function(n){return this.openDialogs.find(function(t){return t.id===n})},n.prototype._createOverlay=function(n){var t=this._getOverlayConfig(n);return this._overlay.create(t)},n.prototype._getOverlayConfig=function(n){var t=new ci({positionStrategy:this._overlay.position().global(),scrollStrategy:this._scrollStrategy(),panelClass:n.panelClass,hasBackdrop:n.hasBackdrop,direction:n.direction,minWidth:n.minWidth,minHeight:n.minHeight,maxWidth:n.maxWidth,maxHeight:n.maxHeight});return n.backdropClass&&(t.backdropClass=n.backdropClass),t},n.prototype._attachDialogContainer=function(n,t){var e=new ei(aa,t.viewContainerRef),l=n.attach(e);return l.instance._config=t,l.instance},n.prototype._attachDialogContent=function(n,t,e,r){var i=new ca(e,t,r.id);if(r.hasBackdrop&&e.backdropClick().subscribe(function(){i.disableClose||i.close()}),e.keydownEvents().pipe(Ge(function(n){return 27===n.keyCode&&!i.disableClose})).subscribe(function(){return i.close()}),n instanceof l.O)t.attachTemplatePortal(new li(n,null,{$implicit:r.data,dialogRef:i}));else{var o=this._createInjector(r,i,t),s=t.attachComponentPortal(new ei(n,void 0,o));i.componentInstance=s.instance}return i.updateSize(r.width,r.height).updatePosition(r.position),i},n.prototype._createInjector=function(n,t,e){var l=n&&n.viewContainerRef&&n.viewContainerRef.injector,r=new WeakMap;return r.set(ca,t),r.set(aa,e),r.set(da,n.data),r.set(Dl,{value:n.direction,change:Object(Fe.a)()}),new ai(l||this._injector,r)},n.prototype._removeOpenDialog=function(n){var t=this.openDialogs.indexOf(n);t>-1&&(this.openDialogs.splice(t,1),this.openDialogs.length||(this._ariaHiddenElements.forEach(function(n,t){n?t.setAttribute("aria-hidden",n):t.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),this._afterAllClosed.next()))},n.prototype._hideNonDialogContentFromAssistiveTechnology=function(){var n=this._overlayContainer.getContainerElement();if(n.parentElement)for(var t=n.parentElement.children,e=t.length-1;e>-1;e--){var l=t[e];l===n||"SCRIPT"===l.nodeName||"STYLE"===l.nodeName||l.hasAttribute("aria-live")||(this._ariaHiddenElements.set(l,l.getAttribute("aria-hidden")),l.setAttribute("aria-hidden","true"))}},n}(),_a=function(){},ma=function(){},ga=function(){function n(n){this.callback=n}return n.prototype.call=function(n,t){return t.subscribe(new ya(n,this.callback))},n}(),ya=function(n){function t(t,e){n.call(this,t),this.add(new rl.a(e))}return Object(i.__extends)(t,n),t}(Be.a),ba=e("3a3m");function va(n,t){return function(n,t){return Object(nl.a)(n,t,1)}(n,t)(this)}var wa=function(){},xa=function(){},Ma=function(){function n(n){var t=this;this.normalizedNames=new Map,this.lazyUpdate=null,n?this.lazyInit="string"==typeof n?function(){t.headers=new Map,n.split("\n").forEach(function(n){var e=n.indexOf(":");if(e>0){var l=n.slice(0,e),r=l.toLowerCase(),i=n.slice(e+1).trim();t.maybeSetNormalizedName(l,r),t.headers.has(r)?t.headers.get(r).push(i):t.headers.set(r,[i])}})}:function(){t.headers=new Map,Object.keys(n).forEach(function(e){var l=n[e],r=e.toLowerCase();"string"==typeof l&&(l=[l]),l.length>0&&(t.headers.set(r,l),t.maybeSetNormalizedName(e,r))})}:this.headers=new Map}return n.prototype.has=function(n){return this.init(),this.headers.has(n.toLowerCase())},n.prototype.get=function(n){this.init();var t=this.headers.get(n.toLowerCase());return t&&t.length>0?t[0]:null},n.prototype.keys=function(){return this.init(),Array.from(this.normalizedNames.values())},n.prototype.getAll=function(n){return this.init(),this.headers.get(n.toLowerCase())||null},n.prototype.append=function(n,t){return this.clone({name:n,value:t,op:"a"})},n.prototype.set=function(n,t){return this.clone({name:n,value:t,op:"s"})},n.prototype.delete=function(n,t){return this.clone({name:n,value:t,op:"d"})},n.prototype.maybeSetNormalizedName=function(n,t){this.normalizedNames.has(t)||this.normalizedNames.set(t,n)},n.prototype.init=function(){var t=this;this.lazyInit&&(this.lazyInit instanceof n?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(n){return t.applyUpdate(n)}),this.lazyUpdate=null))},n.prototype.copyFrom=function(n){var t=this;n.init(),Array.from(n.headers.keys()).forEach(function(e){t.headers.set(e,n.headers.get(e)),t.normalizedNames.set(e,n.normalizedNames.get(e))})},n.prototype.clone=function(t){var e=new n;return e.lazyInit=this.lazyInit&&this.lazyInit instanceof n?this.lazyInit:this,e.lazyUpdate=(this.lazyUpdate||[]).concat([t]),e},n.prototype.applyUpdate=function(n){var t=n.name.toLowerCase();switch(n.op){case"a":case"s":var e=n.value;if("string"==typeof e&&(e=[e]),0===e.length)return;this.maybeSetNormalizedName(n.name,t);var l=("a"===n.op?this.headers.get(t):void 0)||[];l.push.apply(l,e),this.headers.set(t,l);break;case"d":var r=n.value;if(r){var i=this.headers.get(t);if(!i)return;0===(i=i.filter(function(n){return-1===r.indexOf(n)})).length?(this.headers.delete(t),this.normalizedNames.delete(t)):this.headers.set(t,i)}else this.headers.delete(t),this.normalizedNames.delete(t)}},n.prototype.forEach=function(n){var t=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(e){return n(t.normalizedNames.get(e),t.headers.get(e))})},n}(),ka=function(){function n(){}return n.prototype.encodeKey=function(n){return Ca(n)},n.prototype.encodeValue=function(n){return Ca(n)},n.prototype.decodeKey=function(n){return decodeURIComponent(n)},n.prototype.decodeValue=function(n){return decodeURIComponent(n)},n}();function Ca(n){return encodeURIComponent(n).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var Sa=function(){function n(n){void 0===n&&(n={});var t,e,l,r=this;if(this.updates=null,this.cloneFrom=null,this.encoder=n.encoder||new ka,n.fromString){if(n.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=(t=n.fromString,e=this.encoder,l=new Map,t.length>0&&t.split("&").forEach(function(n){var t=n.indexOf("="),r=-1==t?[e.decodeKey(n),""]:[e.decodeKey(n.slice(0,t)),e.decodeValue(n.slice(t+1))],i=r[0],o=r[1],s=l.get(i)||[];s.push(o),l.set(i,s)}),l)}else n.fromObject?(this.map=new Map,Object.keys(n.fromObject).forEach(function(t){var e=n.fromObject[t];r.map.set(t,Array.isArray(e)?e:[e])})):this.map=null}return n.prototype.has=function(n){return this.init(),this.map.has(n)},n.prototype.get=function(n){this.init();var t=this.map.get(n);return t?t[0]:null},n.prototype.getAll=function(n){return this.init(),this.map.get(n)||null},n.prototype.keys=function(){return this.init(),Array.from(this.map.keys())},n.prototype.append=function(n,t){return this.clone({param:n,value:t,op:"a"})},n.prototype.set=function(n,t){return this.clone({param:n,value:t,op:"s"})},n.prototype.delete=function(n,t){return this.clone({param:n,value:t,op:"d"})},n.prototype.toString=function(){var n=this;return this.init(),this.keys().map(function(t){var e=n.encoder.encodeKey(t);return n.map.get(t).map(function(t){return e+"="+n.encoder.encodeValue(t)}).join("&")}).join("&")},n.prototype.clone=function(t){var e=new n({encoder:this.encoder});return e.cloneFrom=this.cloneFrom||this,e.updates=(this.updates||[]).concat([t]),e},n.prototype.init=function(){var n=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(t){return n.map.set(t,n.cloneFrom.map.get(t))}),this.updates.forEach(function(t){switch(t.op){case"a":case"s":var e=("a"===t.op?n.map.get(t.param):void 0)||[];e.push(t.value),n.map.set(t.param,e);break;case"d":if(void 0===t.value){n.map.delete(t.param);break}var l=n.map.get(t.param)||[],r=l.indexOf(t.value);-1!==r&&l.splice(r,1),l.length>0?n.map.set(t.param,l):n.map.delete(t.param)}}),this.cloneFrom=null)},n}();function Oa(n){return"undefined"!=typeof ArrayBuffer&&n instanceof ArrayBuffer}function Ta(n){return"undefined"!=typeof Blob&&n instanceof Blob}function La(n){return"undefined"!=typeof FormData&&n instanceof FormData}var Pa=function(){function n(n,t,e,l){var r;if(this.url=t,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=n.toUpperCase(),function(n){switch(n){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||l?(this.body=void 0!==e?e:null,r=l):r=e,r&&(this.reportProgress=!!r.reportProgress,this.withCredentials=!!r.withCredentials,r.responseType&&(this.responseType=r.responseType),r.headers&&(this.headers=r.headers),r.params&&(this.params=r.params)),this.headers||(this.headers=new Ma),this.params){var i=this.params.toString();if(0===i.length)this.urlWithParams=t;else{var o=t.indexOf("?");this.urlWithParams=t+(-1===o?"?":o=200&&this.status<300}}(),Ea=function(n){function t(t){void 0===t&&(t={});var e=n.call(this,t)||this;return e.type=Da.ResponseHeader,e}return Object(i.__extends)(t,n),t.prototype.clone=function(n){return void 0===n&&(n={}),new t({headers:n.headers||this.headers,status:void 0!==n.status?n.status:this.status,statusText:n.statusText||this.statusText,url:n.url||this.url||void 0})},t}(Aa),Ya=function(n){function t(t){void 0===t&&(t={});var e=n.call(this,t)||this;return e.type=Da.Response,e.body=void 0!==t.body?t.body:null,e}return Object(i.__extends)(t,n),t.prototype.clone=function(n){return void 0===n&&(n={}),new t({body:void 0!==n.body?n.body:this.body,headers:n.headers||this.headers,status:void 0!==n.status?n.status:this.status,statusText:n.statusText||this.statusText,url:n.url||this.url||void 0})},t}(Aa),ja=function(n){function t(t){var e=n.call(this,t,0,"Unknown Error")||this;return e.name="HttpErrorResponse",e.ok=!1,e.message=e.status>=200&&e.status<300?"Http failure during parsing for "+(t.url||"(unknown url)"):"Http failure response for "+(t.url||"(unknown url)")+": "+t.status+" "+t.statusText,e.error=t.error||null,e}return Object(i.__extends)(t,n),t}(Aa);function Ia(n,t){return{body:t,headers:n.headers,observe:n.observe,params:n.params,reportProgress:n.reportProgress,responseType:n.responseType,withCredentials:n.withCredentials}}var Ra=function(){function n(n){this.handler=n}return n.prototype.request=function(n,t,e){var l,r=this;if(void 0===e&&(e={}),n instanceof Pa)l=n;else{var i;i=e.headers instanceof Ma?e.headers:new Ma(e.headers);var o=void 0;e.params&&(o=e.params instanceof Sa?e.params:new Sa({fromObject:e.params})),l=new Pa(n,t,void 0!==e.body?e.body:null,{headers:i,params:o,reportProgress:e.reportProgress,responseType:e.responseType||"json",withCredentials:e.withCredentials})}var s=va.call(Object(Fe.a)(l),function(n){return r.handler.handle(n)});if(n instanceof Pa||"events"===e.observe)return s;var a=Qe.call(s,function(n){return n instanceof Ya});switch(e.observe||"body"){case"body":switch(l.responseType){case"arraybuffer":return Pe.call(a,function(n){if(null!==n.body&&!(n.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return n.body});case"blob":return Pe.call(a,function(n){if(null!==n.body&&!(n.body instanceof Blob))throw new Error("Response is not a Blob.");return n.body});case"text":return Pe.call(a,function(n){if(null!==n.body&&"string"!=typeof n.body)throw new Error("Response is not a string.");return n.body});case"json":default:return Pe.call(a,function(n){return n.body})}case"response":return a;default:throw new Error("Unreachable: unhandled observe type "+e.observe+"}")}},n.prototype.delete=function(n,t){return void 0===t&&(t={}),this.request("DELETE",n,t)},n.prototype.get=function(n,t){return void 0===t&&(t={}),this.request("GET",n,t)},n.prototype.head=function(n,t){return void 0===t&&(t={}),this.request("HEAD",n,t)},n.prototype.jsonp=function(n,t){return this.request("JSONP",n,{params:(new Sa).append(t,"JSONP_CALLBACK"),observe:"body",responseType:"json"})},n.prototype.options=function(n,t){return void 0===t&&(t={}),this.request("OPTIONS",n,t)},n.prototype.patch=function(n,t,e){return void 0===e&&(e={}),this.request("PATCH",n,Ia(e,t))},n.prototype.post=function(n,t,e){return void 0===e&&(e={}),this.request("POST",n,Ia(e,t))},n.prototype.put=function(n,t,e){return void 0===e&&(e={}),this.request("PUT",n,Ia(e,t))},n}(),Ha=function(){function n(n,t){this.next=n,this.interceptor=t}return n.prototype.handle=function(n){return this.interceptor.intercept(n,this.next)},n}(),Na=new l.r("HTTP_INTERCEPTORS"),Fa=function(){function n(){}return n.prototype.intercept=function(n,t){return t.handle(n)},n}(),Ba=/^\)\]\}',?\n/,Va=function(){},Wa=function(){function n(){}return n.prototype.build=function(){return new XMLHttpRequest},n}(),za=function(){function n(n){this.xhrFactory=n}return n.prototype.handle=function(n){var t=this;if("JSONP"===n.method)throw new Error("Attempted to construct Jsonp request without JsonpClientModule installed.");return new o.a(function(e){var l=t.xhrFactory.build();if(l.open(n.method,n.urlWithParams),n.withCredentials&&(l.withCredentials=!0),n.headers.forEach(function(n,t){return l.setRequestHeader(n,t.join(","))}),n.headers.has("Accept")||l.setRequestHeader("Accept","application/json, text/plain, */*"),!n.headers.has("Content-Type")){var r=n.detectContentTypeHeader();null!==r&&l.setRequestHeader("Content-Type",r)}if(n.responseType){var i=n.responseType.toLowerCase();l.responseType="json"!==i?i:"text"}var o=n.serializeBody(),s=null,a=function(){if(null!==s)return s;var t=1223===l.status?204:l.status,e=l.statusText||"OK",r=new Ma(l.getAllResponseHeaders()),i=function(n){return"responseURL"in n&&n.responseURL?n.responseURL:/^X-Request-URL:/m.test(n.getAllResponseHeaders())?n.getResponseHeader("X-Request-URL"):null}(l)||n.url;return s=new Ea({headers:r,status:t,statusText:e,url:i})},u=function(){var t=a(),r=t.headers,i=t.status,o=t.statusText,s=t.url,u=null;204!==i&&(u="undefined"==typeof l.response?l.responseText:l.response),0===i&&(i=u?200:0);var c=i>=200&&i<300;if("json"===n.responseType&&"string"==typeof u){var d=u;u=u.replace(Ba,"");try{u=""!==u?JSON.parse(u):null}catch(n){u=d,c&&(c=!1,u={error:n,text:u})}}c?(e.next(new Ya({body:u,headers:r,status:i,statusText:o,url:s||void 0})),e.complete()):e.error(new ja({error:u,headers:r,status:i,statusText:o,url:s||void 0}))},c=function(n){var t=new ja({error:n,status:l.status||0,statusText:l.statusText||"Unknown Error"});e.error(t)},d=!1,h=function(t){d||(e.next(a()),d=!0);var r={type:Da.DownloadProgress,loaded:t.loaded};t.lengthComputable&&(r.total=t.total),"text"===n.responseType&&l.responseText&&(r.partialText=l.responseText),e.next(r)},p=function(n){var t={type:Da.UploadProgress,loaded:n.loaded};n.lengthComputable&&(t.total=n.total),e.next(t)};return l.addEventListener("load",u),l.addEventListener("error",c),n.reportProgress&&(l.addEventListener("progress",h),null!==o&&l.upload&&l.upload.addEventListener("progress",p)),l.send(o),e.next({type:Da.Sent}),function(){l.removeEventListener("error",c),l.removeEventListener("load",u),n.reportProgress&&(l.removeEventListener("progress",h),null!==o&&l.upload&&l.upload.removeEventListener("progress",p)),l.abort()}})},n}(),Ua=new l.r("XSRF_COOKIE_NAME"),Ga=new l.r("XSRF_HEADER_NAME"),qa=function(){},Ja=function(){function n(n,t,e){this.doc=n,this.platform=t,this.cookieName=e,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return n.prototype.getToken=function(){if("server"===this.platform)return null;var n=this.doc.cookie||"";return n!==this.lastCookieString&&(this.parseCount++,this.lastToken=S(n,this.cookieName),this.lastCookieString=n),this.lastToken},n}(),Qa=function(){function n(n,t){this.tokenService=n,this.headerName=t}return n.prototype.intercept=function(n,t){var e=n.url.toLowerCase();if("GET"===n.method||"HEAD"===n.method||e.startsWith("http://")||e.startsWith("https://"))return t.handle(n);var l=this.tokenService.getToken();return null===l||n.headers.has(this.headerName)||(n=n.clone({headers:n.headers.set(this.headerName,l)})),t.handle(n)},n}();function Ka(n,t){return void 0===t&&(t=[]),t?t.reduceRight(function(n,t){return new Ha(n,t)},n):n}var Xa=function(){function n(){}return n.disable=function(){return{ngModule:n,providers:[{provide:Qa,useClass:Fa}]}},n.withOptions=function(t){return void 0===t&&(t={}),{ngModule:n,providers:[t.cookieName?{provide:Ua,useValue:t.cookieName}:[],t.headerName?{provide:Ga,useValue:t.headerName}:[]]}},n}(),Za=function(){};function $a(n){return Error('Unable to find icon with the name "'+n+'"')}function nu(n){return Error("The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was \""+n+'".')}var tu=function(n){this.url=n,this.svgElement=null},eu=function(){function n(n,t,e){this._httpClient=n,this._sanitizer=t,this._document=e,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._defaultFontSetClass="material-icons"}return n.prototype.addSvgIcon=function(n,t){return this.addSvgIconInNamespace("",n,t)},n.prototype.addSvgIconInNamespace=function(n,t,e){var l=iu(n,t);return this._svgIconConfigs.set(l,new tu(e)),this},n.prototype.addSvgIconSet=function(n){return this.addSvgIconSetInNamespace("",n)},n.prototype.addSvgIconSetInNamespace=function(n,t){var e=new tu(t),l=this._iconSetConfigs.get(n);return l?l.push(e):this._iconSetConfigs.set(n,[e]),this},n.prototype.registerFontClassAlias=function(n,t){return void 0===t&&(t=n),this._fontCssClassesByAlias.set(n,t),this},n.prototype.classNameForFontAlias=function(n){return this._fontCssClassesByAlias.get(n)||n},n.prototype.setDefaultFontSetClass=function(n){return this._defaultFontSetClass=n,this},n.prototype.getDefaultFontSetClass=function(){return this._defaultFontSetClass},n.prototype.getSvgIconFromUrl=function(n){var t=this,e=this._sanitizer.sanitize(l.K.RESOURCE_URL,n);if(!e)throw nu(n);var r=this._cachedIconsByUrl.get(e);return r?Object(Fe.a)(ru(r)):this._loadSvgIconFromConfig(new tu(n)).pipe(Ve(function(n){return t._cachedIconsByUrl.set(e,n)}),Object(Le.a)(function(n){return ru(n)}))},n.prototype.getNamedSvgIcon=function(n,t){void 0===t&&(t="");var e=iu(t,n),l=this._svgIconConfigs.get(e);if(l)return this._getSvgFromConfig(l);var r=this._iconSetConfigs.get(t);return r?this._getSvgFromIconSetConfigs(n,r):xe($a(e))},n.prototype._getSvgFromConfig=function(n){return n.svgElement?Object(Fe.a)(ru(n.svgElement)):this._loadSvgIconFromConfig(n).pipe(Ve(function(t){return n.svgElement=t}),Object(Le.a)(function(n){return ru(n)}))},n.prototype._getSvgFromIconSetConfigs=function(n,t){var e=this,r=this._extractIconWithNameFromAnySet(n,t);if(r)return Object(Fe.a)(r);var i=t.filter(function(n){return!n.svgElement}).map(function(n){return e._loadSvgIconSetFromConfig(n).pipe(Ce(function(t){var r=e._sanitizer.sanitize(l.K.RESOURCE_URL,n.url);return console.log("Loading icon set URL: "+r+" failed: "+t),Object(Fe.a)(null)}),Ve(function(t){t&&(n.svgElement=t)}))});return Ne(i).pipe(Object(Le.a)(function(){var l=e._extractIconWithNameFromAnySet(n,t);if(!l)throw $a(n);return l}))},n.prototype._extractIconWithNameFromAnySet=function(n,t){for(var e=t.length-1;e>=0;e--){var l=t[e];if(l.svgElement){var r=this._extractSvgIconFromSet(l.svgElement,n);if(r)return r}}return null},n.prototype._loadSvgIconFromConfig=function(n){var t=this;return this._fetchUrl(n.url).pipe(Object(Le.a)(function(n){return t._createSvgElementForSingleIcon(n)}))},n.prototype._loadSvgIconSetFromConfig=function(n){var t=this;return this._fetchUrl(n.url).pipe(Object(Le.a)(function(n){return t._svgElementFromString(n)}))},n.prototype._createSvgElementForSingleIcon=function(n){var t=this._svgElementFromString(n);return this._setSvgAttributes(t),t},n.prototype._extractSvgIconFromSet=function(n,t){var e=n.querySelector("#"+t);if(!e)return null;var l=e.cloneNode(!0);if(l.id="","svg"===l.nodeName.toLowerCase())return this._setSvgAttributes(l);if("symbol"===l.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(l));var r=this._svgElementFromString("");return r.appendChild(l),this._setSvgAttributes(r)},n.prototype._svgElementFromString=function(n){if(this._document||"undefined"!=typeof document){var t=(this._document||document).createElement("DIV");t.innerHTML=n;var e=t.querySelector("svg");if(!e)throw Error(" tag not found");return e}throw new Error("MatIconRegistry could not resolve document.")},n.prototype._toSvgElement=function(n){for(var t=this._svgElementFromString(""),e=0;e-1)throw Error('Input type "'+this._type+"\" isn't supported by matInput.")},t.prototype._isNeverEmpty=function(){return this._neverEmptyInputTypes.indexOf(this._type)>-1},t.prototype._isBadInput=function(){var n=this._elementRef.nativeElement.validity;return n&&n.badInput},t.prototype._isTextarea=function(){var n=this._elementRef.nativeElement,t=this._platform.isBrowser?n.nodeName:n.name;return!!t&&"textarea"===t.toLowerCase()},Object.defineProperty(t.prototype,"empty",{get:function(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"shouldLabelFloat",{get:function(){return this.focused||!this.empty},enumerable:!0,configurable:!0}),t.prototype.setDescribedByIds=function(n){this._ariaDescribedby=n.join(" ")},t.prototype.onContainerClick=function(){this.focus()},t}(Ql(function(n,t,e,l){this._defaultErrorStateMatcher=n,this._parentForm=t,this._parentFormGroup=e,this.ngControl=l})),fu=function(){},_u=function(){},mu=function(){},gu=function(){},yu=function(){},bu=function(n){function t(t){var e=n.call(this)||this;return e._elementRef=t,e._hovered=new yl.a,e._highlighted=!1,e._triggersSubmenu=!1,e}return Object(i.__extends)(t,n),t.prototype.focus=function(){this._getHostElement().focus()},t.prototype.ngOnDestroy=function(){this._hovered.complete()},t.prototype._getTabIndex=function(){return this.disabled?"-1":"0"},t.prototype._getHostElement=function(){return this._elementRef.nativeElement},t.prototype._checkDisabled=function(n){this.disabled&&(n.preventDefault(),n.stopPropagation())},t.prototype._emitHoverEvent=function(){this.disabled||this._hovered.next(this)},t.prototype.getLabel=function(){var n=this._elementRef.nativeElement,t="";if(n.childNodes)for(var e=n.childNodes.length,l=0;l')}(),this._xPosition=n,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"yPosition",{get:function(){return this._yPosition},set:function(n){"above"!==n&&"below"!==n&&function(){throw Error('y-position value must be either \'above\' or below\'.\n Example: ')}(),this._yPosition=n,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"overlapTrigger",{get:function(){return this._overlapTrigger},set:function(n){this._overlapTrigger=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"panelClass",{set:function(n){n&&n.length&&(this._classList=n.split(" ").reduce(function(n,t){return n[t]=!0,n},{}),this._elementRef.nativeElement.className="",this.setPositionClasses())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"classList",{get:function(){return this.panelClass},set:function(n){this.panelClass=n},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){var n=this;this._keyManager=new Er(this.items).withWrap().withTypeAhead(),this._tabSubscription=this._keyManager.tabOut.subscribe(function(){return n.close.emit("keydown")})},n.prototype.ngOnDestroy=function(){this._tabSubscription.unsubscribe(),this.closed.complete()},n.prototype._hovered=function(){var n=this;return this.items?this.items.changes.pipe(Ss(this.items),Object(Ri.a)(function(n){return Jr.a.apply(void 0,n.map(function(n){return n._hovered}))})):this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1),Object(Ri.a)(function(){return n._hovered()}))},n.prototype._handleKeydown=function(n){switch(n.keyCode){case 27:this.closed.emit("keydown"),n.stopPropagation();break;case 37:this.parentMenu&&"ltr"===this.direction&&this.closed.emit("keydown");break;case 39:this.parentMenu&&"rtl"===this.direction&&this.closed.emit("keydown");break;default:this._keyManager.onKeydown(n)}},n.prototype.focusFirstItem=function(){this._keyManager.setFirstItemActive()},n.prototype.resetActiveItem=function(){this._keyManager.setActiveItem(-1)},n.prototype.setPositionClasses=function(n,t){void 0===n&&(n=this.xPosition),void 0===t&&(t=this.yPosition),this._classList["mat-menu-before"]="before"===n,this._classList["mat-menu-after"]="after"===n,this._classList["mat-menu-above"]="above"===t,this._classList["mat-menu-below"]="below"===t},n.prototype.setElevation=function(n){var t="mat-elevation-z"+(2+n),e=Object.keys(this._classList).find(function(n){return n.startsWith("mat-elevation-z")});e&&e!==this._previousElevation||(this._previousElevation&&(this._classList[this._previousElevation]=!1),this._classList[t]=!0,this._previousElevation=t)},n.prototype._startAnimation=function(){this._panelAnimationState="enter-start"},n.prototype._resetAnimation=function(){this._panelAnimationState="void"},n.prototype._onAnimationDone=function(n){"enter-start"===n.toState&&(this._panelAnimationState="enter")},n}(),xu=new l.r("mat-menu-scroll-strategy");function Mu(n){return function(){return n.scrollStrategies.reposition()}}var ku=function(){function n(n,t,e,r,i,o,s){this._overlay=n,this._element=t,this._viewContainerRef=e,this._scrollStrategy=r,this._parentMenu=i,this._menuItemInstance=o,this._dir=s,this._overlayRef=null,this._menuOpen=!1,this._closeSubscription=rl.a.EMPTY,this._positionSubscription=rl.a.EMPTY,this._hoverSubscription=rl.a.EMPTY,this._openedByMouse=!1,this.menuOpened=new l.o,this.onMenuOpen=this.menuOpened,this.menuClosed=new l.o,this.onMenuClose=this.menuClosed,o&&(o._triggersSubmenu=this.triggersSubmenu())}return Object.defineProperty(n.prototype,"_deprecatedMatMenuTriggerFor",{get:function(){return this.menu},set:function(n){this.menu=n},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){var n=this;this._checkMenu(),this.menu.close.subscribe(function(t){n._destroyMenu(),"click"===t&&n._parentMenu&&n._parentMenu.closed.emit(t)}),this.triggersSubmenu()&&(this._hoverSubscription=this._parentMenu._hovered().pipe(Ge(function(t){return t===n._menuItemInstance})).subscribe(function(){n._openedByMouse=!0,n.openMenu()}))},n.prototype.ngOnDestroy=function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._cleanUpSubscriptions()},Object.defineProperty(n.prototype,"menuOpen",{get:function(){return this._menuOpen},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dir",{get:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"},enumerable:!0,configurable:!0}),n.prototype.triggersSubmenu=function(){return!(!this._menuItemInstance||!this._parentMenu)},n.prototype.toggleMenu=function(){return this._menuOpen?this.closeMenu():this.openMenu()},n.prototype.openMenu=function(){var n=this;this._menuOpen||(this._createOverlay().attach(this._portal),this._closeSubscription=this._menuClosingActions().subscribe(function(){return n.closeMenu()}),this._initMenu(),this.menu instanceof wu&&this.menu._startAnimation())},n.prototype.closeMenu=function(){this.menu.close.emit()},n.prototype.focus=function(){this._element.nativeElement.focus()},n.prototype._destroyMenu=function(){this._overlayRef&&this.menuOpen&&(this._resetMenu(),this._closeSubscription.unsubscribe(),this._overlayRef.detach(),this.menu instanceof wu&&this.menu._resetAnimation())},n.prototype._initMenu=function(){if(this.menu.parentMenu=this.triggersSubmenu()?this._parentMenu:void 0,this.menu.direction=this.dir,this._setMenuElevation(),this._setIsMenuOpen(!0),this._openedByMouse){var n=this._overlayRef.overlayElement.firstElementChild;n&&(this.menu.resetActiveItem(),n.focus())}else this.menu.focusFirstItem()},n.prototype._setMenuElevation=function(){if(this.menu.setElevation){for(var n=0,t=this.menu.parentMenu;t;)n++,t=t.parentMenu;this.menu.setElevation(n)}},n.prototype._resetMenu=function(){this._setIsMenuOpen(!1),this._openedByMouse&&this.triggersSubmenu()||this.focus(),this._openedByMouse=!1},n.prototype._setIsMenuOpen=function(n){this._menuOpen=n,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&(this._menuItemInstance._highlighted=n)},n.prototype._checkMenu=function(){this.menu||function(){throw Error('mat-menu-trigger: must pass in an mat-menu instance.\n\n Example:\n \n ')}()},n.prototype._createOverlay=function(){if(!this._overlayRef){this._portal=new li(this.menu.templateRef,this._viewContainerRef);var n=this._getOverlayConfig();this._subscribeToPositions(n.positionStrategy),this._overlayRef=this._overlay.create(n)}return this._overlayRef},n.prototype._getOverlayConfig=function(){return new ci({positionStrategy:this._getPosition(),hasBackdrop:!this.triggersSubmenu(),backdropClass:"cdk-overlay-transparent-backdrop",direction:this.dir,scrollStrategy:this._scrollStrategy()})},n.prototype._subscribeToPositions=function(n){var t=this;this._positionSubscription=n.onPositionChange.subscribe(function(n){t.menu.setPositionClasses("start"===n.connectionPair.overlayX?"after":"before","top"===n.connectionPair.overlayY?"below":"above")})},n.prototype._getPosition=function(){var n="before"===this.menu.xPosition?["end","start"]:["start","end"],t=n[0],e=n[1],l="above"===this.menu.yPosition?["bottom","top"]:["top","bottom"],r=l[0],i=l[1],o=[r,i],s=o[0],a=o[1],u=[t,e],c=u[0],d=u[1],h=0;return this.triggersSubmenu()?(d=t="before"===this.menu.xPosition?"start":"end",e=c="end"===t?"start":"end",h="bottom"===r?8:-8):this.menu.overlapTrigger||(s="top"===r?"bottom":"top",a="top"===i?"bottom":"top"),this._overlay.position().connectedTo(this._element,{originX:t,originY:s},{overlayX:c,overlayY:r}).withDirection(this.dir).withOffsetY(h).withFallbackPosition({originX:e,originY:s},{overlayX:d,overlayY:r}).withFallbackPosition({originX:t,originY:a},{overlayX:c,overlayY:i},void 0,-h).withFallbackPosition({originX:e,originY:a},{overlayX:d,overlayY:i},void 0,-h)},n.prototype._cleanUpSubscriptions=function(){this._closeSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._hoverSubscription.unsubscribe()},n.prototype._menuClosingActions=function(){var n=this,t=this._overlayRef.backdropClick(),e=this._overlayRef.detachments(),l=this._parentMenu?this._parentMenu.close:Object(Fe.a)(),r=this._parentMenu?this._parentMenu._hovered().pipe(Ge(function(t){return t!==n._menuItemInstance}),Ge(function(){return n._menuOpen})):Object(Fe.a)();return Object(Jr.a)(t,l,r,e)},n.prototype._handleMousedown=function(n){(function(n){return 0===n.buttons})(n)||(this._openedByMouse=!0,this.triggersSubmenu()&&n.preventDefault())},n.prototype._handleKeydown=function(n){var t=n.keyCode;this.triggersSubmenu()&&(39===t&&"ltr"===this.dir||37===t&&"rtl"===this.dir)&&this.openMenu()},n.prototype._handleClick=function(n){this.triggersSubmenu()?(n.stopPropagation(),this.openMenu()):this.toggleMenu()},n}(),Cu=function(){},Su=0,Ou=new l.r("mat-select-scroll-strategy");function Tu(n){return function(){return n.scrollStrategies.reposition()}}var Lu=function(){},Pu=function(n){function t(t,e,r,i,o,s,a,u,c,d,h,p){var f=n.call(this,o,i,a,u,d)||this;return f._viewportRuler=t,f._changeDetectorRef=e,f._ngZone=r,f._dir=s,f._parentFormField=c,f.ngControl=d,f._scrollStrategyFactory=p,f._panelOpen=!1,f._required=!1,f._scrollTop=0,f._multiple=!1,f._compareWith=function(n,t){return n===t},f._uid="mat-select-"+Su++,f._destroy=new yl.a,f._triggerFontSize=0,f._onChange=function(){},f._onTouched=function(){},f._optionIds="",f._transformOrigin="top",f._panelDoneAnimating=!1,f._scrollStrategy=f._scrollStrategyFactory(),f._offsetY=0,f._positions=[{originX:"start",originY:"top",overlayX:"start",overlayY:"top"},{originX:"start",originY:"bottom",overlayX:"start",overlayY:"bottom"}],f.focused=!1,f.controlType="mat-select",f.ariaLabel="",f.optionSelectionChanges=ia(function(){return f.options?Jr.a.apply(void 0,f.options.map(function(n){return n.onSelectionChange})):f._ngZone.onStable.asObservable().pipe(Object(_r.a)(1),Object(Ri.a)(function(){return f.optionSelectionChanges}))}),f.openedChange=new l.o,f.onOpen=f._openedStream,f.onClose=f._closedStream,f.selectionChange=new l.o,f.change=f.selectionChange,f.valueChange=new l.o,f.ngControl&&(f.ngControl.valueAccessor=f),f.tabIndex=parseInt(h)||0,f.id=f.id,f}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"placeholder",{get:function(){return this._placeholder},set:function(n){this._placeholder=n,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(n){this._required=El(n),this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"multiple",{get:function(){return this._multiple},set:function(n){if(this._selectionModel)throw Error("Cannot change `multiple` mode of select after initialization.");this._multiple=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"compareWith",{get:function(){return this._compareWith},set:function(n){if("function"!=typeof n)throw Error("`compareWith` must be a function.");this._compareWith=n,this._selectionModel&&this._initializeSelection()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return this._value},set:function(n){n!==this._value&&(this.writeValue(n),this._value=n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this._id},set:function(n){this._id=n||this._uid,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_openedStream",{get:function(){return this.openedChange.pipe(Ge(function(n){return n}),Object(Le.a)(function(){}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_closedStream",{get:function(){return this.openedChange.pipe(Ge(function(n){return!n}),Object(Le.a)(function(){}))},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){this._selectionModel=new zs(this.multiple,void 0,!1),this.stateChanges.next()},t.prototype.ngAfterContentInit=function(){var n=this;this._initKeyManager(),this.options.changes.pipe(Ss(null),au(this._destroy)).subscribe(function(){n._resetOptions(),n._initializeSelection()})},t.prototype.ngDoCheck=function(){this.ngControl&&this.updateErrorState()},t.prototype.ngOnChanges=function(n){n.disabled&&this.stateChanges.next()},t.prototype.ngOnDestroy=function(){this._destroy.next(),this._destroy.complete(),this.stateChanges.complete()},t.prototype.toggle=function(){this.panelOpen?this.close():this.open()},t.prototype.open=function(){var n=this;!this.disabled&&this.options&&this.options.length&&(this._triggerRect=this.trigger.nativeElement.getBoundingClientRect(),this._triggerFontSize=parseInt(getComputedStyle(this.trigger.nativeElement)["font-size"]),this._panelOpen=!0,this._calculateOverlayPosition(),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1)).subscribe(function(){n._triggerFontSize&&n.overlayDir.overlayRef&&n.overlayDir.overlayRef.overlayElement&&(n.overlayDir.overlayRef.overlayElement.style.fontSize=n._triggerFontSize+"px")}))},t.prototype.close=function(){this._panelOpen&&(this._panelOpen=!1,this._changeDetectorRef.markForCheck(),this._onTouched(),this.focus())},t.prototype.writeValue=function(n){this.options&&this._setSelectionByValue(n)},t.prototype.registerOnChange=function(n){this._onChange=n},t.prototype.registerOnTouched=function(n){this._onTouched=n},t.prototype.setDisabledState=function(n){this.disabled=n,this._changeDetectorRef.markForCheck(),this.stateChanges.next()},Object.defineProperty(t.prototype,"panelOpen",{get:function(){return this._panelOpen},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"selected",{get:function(){return this.multiple?this._selectionModel.selected:this._selectionModel.selected[0]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"triggerValue",{get:function(){if(this.empty)return"";if(this._multiple){var n=this._selectionModel.selected.map(function(n){return n.viewValue});return this._isRtl()&&n.reverse(),n.join(", ")}return this._selectionModel.selected[0].viewValue},enumerable:!0,configurable:!0}),t.prototype._isRtl=function(){return!!this._dir&&"rtl"===this._dir.value},t.prototype._handleKeydown=function(n){this.disabled||(this.panelOpen?this._handleOpenKeydown(n):this._handleClosedKeydown(n))},t.prototype._handleClosedKeydown=function(n){var t=n.keyCode;13===t||32===t||(this.multiple||n.altKey)&&(40===t||38===t)?(n.preventDefault(),this.open()):this.multiple||this._keyManager.onKeydown(n)},t.prototype._handleOpenKeydown=function(n){var t=n.keyCode;if(36===t||35===t)n.preventDefault(),36===t?this._keyManager.setFirstItemActive():this._keyManager.setLastItemActive();else if(13!==t&&32!==t||!this._keyManager.activeItem){var e=40===t||38===t,l=this._keyManager.activeItemIndex;this._keyManager.onKeydown(n),this._multiple&&e&&n.shiftKey&&this._keyManager.activeItem&&this._keyManager.activeItemIndex!==l&&this._keyManager.activeItem._selectViaInteraction()}else n.preventDefault(),this._keyManager.activeItem._selectViaInteraction()},t.prototype._onPanelDone=function(){this.panelOpen?(this._scrollTop=0,this.openedChange.emit(!0)):(this.openedChange.emit(!1),this._panelDoneAnimating=!1,this.overlayDir.offsetX=0,this._changeDetectorRef.markForCheck())},t.prototype._onFadeInDone=function(){this._panelDoneAnimating=this.panelOpen,this._changeDetectorRef.markForCheck()},t.prototype._onFocus=function(){this.disabled||(this.focused=!0,this.stateChanges.next())},t.prototype._onBlur=function(){this.disabled||this.panelOpen||(this.focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())},t.prototype._onAttached=function(){var n=this;this.overlayDir.positionChange.pipe(Object(_r.a)(1)).subscribe(function(){n._changeDetectorRef.detectChanges(),n._calculateOverlayOffsetX(),n.panel.nativeElement.scrollTop=n._scrollTop})},t.prototype._getPanelTheme=function(){return this._parentFormField?"mat-"+this._parentFormField.color:""},Object.defineProperty(t.prototype,"empty",{get:function(){return!this._selectionModel||this._selectionModel.isEmpty()},enumerable:!0,configurable:!0}),t.prototype._initializeSelection=function(){var n=this;Promise.resolve().then(function(){n._setSelectionByValue(n.ngControl?n.ngControl.value:n._value)})},t.prototype._setSelectionByValue=function(n,t){var e=this;if(void 0===t&&(t=!1),this.multiple&&n){if(!Array.isArray(n))throw Error("Value must be an array in multiple-selection mode.");this._clearSelection(),n.forEach(function(n){return e._selectValue(n,t)}),this._sortValues()}else{this._clearSelection();var l=this._selectValue(n,t);l&&this._keyManager.setActiveItem(this.options.toArray().indexOf(l))}this._changeDetectorRef.markForCheck()},t.prototype._selectValue=function(n,t){var e=this;void 0===t&&(t=!1);var r=this.options.find(function(t){try{return null!=t.value&&e._compareWith(t.value,n)}catch(n){return Object(l.Y)()&&console.warn(n),!1}});return r&&(t?r._selectViaInteraction():r.select(),this._selectionModel.select(r),this.stateChanges.next()),r},t.prototype._clearSelection=function(n){this._selectionModel.clear(),this.options.forEach(function(t){t!==n&&t.deselect()}),this.stateChanges.next()},t.prototype._initKeyManager=function(){var n=this;this._keyManager=new Sr(this.options).withTypeAhead(),this._keyManager.tabOut.pipe(au(this._destroy)).subscribe(function(){return n.close()}),this._keyManager.change.pipe(au(this._destroy)).subscribe(function(){n._panelOpen&&n.panel?n._scrollActiveOptionIntoView():n._panelOpen||n.multiple||!n._keyManager.activeItem||n._keyManager.activeItem._selectViaInteraction()})},t.prototype._resetOptions=function(){var n=this;this.optionSelectionChanges.pipe(au(Object(Jr.a)(this._destroy,this.options.changes)),Ge(function(n){return n.isUserInput})).subscribe(function(t){n._onSelect(t.source),n.multiple||n.close()}),this._setOptionIds()},t.prototype._onSelect=function(n){var t=this._selectionModel.isSelected(n);this.multiple?(this._selectionModel.toggle(n),this.stateChanges.next(),t?n.deselect():n.select(),this._keyManager.setActiveItem(this._getOptionIndex(n)),this._sortValues()):(this._clearSelection(null==n.value?void 0:n),null==n.value?this._propagateChanges(n.value):(this._selectionModel.select(n),this.stateChanges.next())),t!==this._selectionModel.isSelected(n)&&this._propagateChanges()},t.prototype._sortValues=function(){var n=this;this._multiple&&(this._selectionModel.clear(),this.options.forEach(function(t){t.selected&&n._selectionModel.select(t)}),this.stateChanges.next())},t.prototype._propagateChanges=function(n){var t;t=this.multiple?this.selected.map(function(n){return n.value}):this.selected?this.selected.value:n,this._value=t,this.valueChange.emit(t),this._onChange(t),this.selectionChange.emit(new function(n,t){this.source=n,this.value=t}(this,t)),this._changeDetectorRef.markForCheck()},t.prototype._setOptionIds=function(){this._optionIds=this.options.map(function(n){return n.id}).join(" ")},t.prototype._highlightCorrectOption=function(){this._keyManager&&(this.empty?this._keyManager.setFirstItemActive():this._keyManager.setActiveItem(this._getOptionIndex(this._selectionModel.selected[0])))},t.prototype._scrollActiveOptionIntoView=function(){var n=this._getItemHeight(),t=this._keyManager.activeItemIndex||0,e=(t+pr.countGroupLabelsBeforeOption(t,this.options,this.optionGroups))*n,l=this.panel.nativeElement.scrollTop;el+256&&(this.panel.nativeElement.scrollTop=Math.max(0,e-256+n))},t.prototype.focus=function(){this._elementRef.nativeElement.focus()},t.prototype._getOptionIndex=function(n){return this.options.reduce(function(t,e,l){return void 0===t?n===e?l:void 0:t},void 0)},t.prototype._calculateOverlayPosition=function(){var n=this._getItemHeight(),t=this._getItemCount(),e=Math.min(t*n,256),l=t*n-e,r=this.empty?0:this._getOptionIndex(this._selectionModel.selected[0]);r+=pr.countGroupLabelsBeforeOption(r,this.options,this.optionGroups);var i=e/2;this._scrollTop=this._calculateOverlayScroll(r,i,l),this._offsetY=this._calculateOverlayOffsetY(r,i,l),this._checkOverlayWithinViewport(l)},t.prototype._calculateOverlayScroll=function(n,t,e){var l=this._getItemHeight();return Math.min(Math.max(0,l*n-t+l/2),e)},Object.defineProperty(t.prototype,"_ariaLabel",{get:function(){return this.ariaLabelledby?null:this.ariaLabel||this.placeholder},enumerable:!0,configurable:!0}),t.prototype._getAriaActiveDescendant=function(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null},t.prototype._calculateOverlayOffsetX=function(){var n,t=this.overlayDir.overlayRef.overlayElement.getBoundingClientRect(),e=this._viewportRuler.getViewportSize(),l=this._isRtl(),r=this.multiple?60:32;if(this.multiple)n=44;else{var i=this._selectionModel.selected[0]||this.options.first;n=i&&i.group?32:16}l||(n*=-1);var o=0-(t.left+n-(l?r:0)),s=t.right+n-e.width+(l?0:r);o>0?n+=o+8:s>0&&(n-=s+8),this.overlayDir.offsetX=n,this.overlayDir.overlayRef.updatePosition()},t.prototype._calculateOverlayOffsetY=function(n,t,e){var l=this._getItemHeight(),r=(l-this._triggerRect.height)/2,i=Math.floor(256/l);return-1*(0===this._scrollTop?n*l:this._scrollTop===e?(n-(this._getItemCount()-i))*l+(l-(this._getItemCount()*l-256)%l):t-l/2)-r},t.prototype._checkOverlayWithinViewport=function(n){var t=this._getItemHeight(),e=this._viewportRuler.getViewportSize(),l=this._triggerRect.top-8,r=e.height-this._triggerRect.bottom-8,i=Math.abs(this._offsetY),o=Math.min(this._getItemCount()*t,256)-i-this._triggerRect.height;o>r?this._adjustPanelUp(o,r):i>l?this._adjustPanelDown(i,l,n):this._transformOrigin=this._getOriginBasedOnOption()},t.prototype._adjustPanelUp=function(n,t){var e=Math.round(n-t);this._scrollTop-=e,this._offsetY-=e,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop<=0&&(this._scrollTop=0,this._offsetY=0,this._transformOrigin="50% bottom 0px")},t.prototype._adjustPanelDown=function(n,t,e){var l=Math.round(n-t);if(this._scrollTop+=l,this._offsetY+=l,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop>=e)return this._scrollTop=e,this._offsetY=0,void(this._transformOrigin="50% top 0px")},t.prototype._getOriginBasedOnOption=function(){var n=this._getItemHeight(),t=(n-this._triggerRect.height)/2;return"50% "+(Math.abs(this._offsetY)-t+n/2)+"px 0px"},t.prototype._getItemCount=function(){return this.options.length+this.optionGroups.length},t.prototype._getItemHeight=function(){return 3*this._triggerFontSize},t.prototype.setDescribedByIds=function(n){this._ariaDescribedby=n.join(" ")},t.prototype.onContainerClick=function(){this.focus(),this.open()},Object.defineProperty(t.prototype,"shouldLabelFloat",{get:function(){return this._panelOpen||!this.empty},enumerable:!0,configurable:!0}),t}(ql(Jl(Ul(Ql(function(n,t,e,l,r){this._elementRef=n,this._defaultErrorStateMatcher=t,this._parentForm=e,this._parentFormGroup=l,this.ngControl=r}))))),Du=function(){},Au=20;function Eu(n){return Error('Tooltip position "'+n+'" is invalid.')}var Yu=new l.r("mat-tooltip-scroll-strategy");function ju(n){return function(){return n.scrollStrategies.reposition({scrollThrottle:Au})}}var Iu=function(){function n(n,t,e,l,r,i,o,s,a,u){var c=this;this._overlay=n,this._elementRef=t,this._scrollDispatcher=e,this._viewContainerRef=l,this._ngZone=r,this._platform=i,this._ariaDescriber=o,this._focusMonitor=s,this._scrollStrategy=a,this._dir=u,this._position="below",this._disabled=!1,this.showDelay=0,this.hideDelay=0,this._message="",this._manualListeners=new Map;var d=t.nativeElement;i.IOS?"INPUT"!==d.nodeName&&"TEXTAREA"!==d.nodeName||(d.style.webkitUserSelect=d.style.userSelect=""):(this._manualListeners.set("mouseenter",function(){return c.show()}),this._manualListeners.set("mouseleave",function(){return c.hide()}),this._manualListeners.forEach(function(n,e){return t.nativeElement.addEventListener(e,n)})),s.monitor(d,!1).subscribe(function(n){n?"program"!==n&&r.run(function(){return c.show()}):r.run(function(){return c.hide(0)})})}return Object.defineProperty(n.prototype,"position",{get:function(){return this._position},set:function(n){n!==this._position&&(this._position=n,this._tooltipInstance&&this._disposeTooltip())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"disabled",{get:function(){return this._disabled},set:function(n){this._disabled=El(n),this._disabled&&this.hide(0)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_positionDeprecated",{get:function(){return this._position},set:function(n){this._position=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"message",{get:function(){return this._message},set:function(n){this._ariaDescriber.removeDescription(this._elementRef.nativeElement,this._message),this._message=null!=n?(""+n).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._updateTooltipMessage(),this._ariaDescriber.describe(this._elementRef.nativeElement,this.message))},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"tooltipClass",{get:function(){return this._tooltipClass},set:function(n){this._tooltipClass=n,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)},enumerable:!0,configurable:!0}),n.prototype.ngOnDestroy=function(){var n=this;this._tooltipInstance&&this._disposeTooltip(),this._platform.IOS||(this._manualListeners.forEach(function(t,e){n._elementRef.nativeElement.removeEventListener(e,t)}),this._manualListeners.clear()),this._ariaDescriber.removeDescription(this._elementRef.nativeElement,this.message),this._focusMonitor.stopMonitoring(this._elementRef.nativeElement)},n.prototype.show=function(n){void 0===n&&(n=this.showDelay),!this.disabled&&this.message&&(this._tooltipInstance||this._createTooltip(),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),this._tooltipInstance.show(this._position,n))},n.prototype.hide=function(n){void 0===n&&(n=this.hideDelay),this._tooltipInstance&&this._tooltipInstance.hide(n)},n.prototype.toggle=function(){this._isTooltipVisible()?this.hide():this.show()},n.prototype._isTooltipVisible=function(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()},n.prototype._handleKeydown=function(n){this._isTooltipVisible()&&27===n.keyCode&&(n.stopPropagation(),this.hide(0))},n.prototype._createTooltip=function(){var n=this,t=this._createOverlay(),e=new ei(Ru,this._viewContainerRef);this._tooltipInstance=t.attach(e).instance,Object(Jr.a)(this._tooltipInstance.afterHidden(),t.detachments()).subscribe(function(){n._tooltipInstance&&n._disposeTooltip()})},n.prototype._createOverlay=function(){var n=this,t=this._getOrigin(),e=this._getOverlayPosition(),l=this._overlay.position().connectedTo(this._elementRef,t.main,e.main).withFallbackPosition(t.fallback,e.fallback),r=this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);l.withScrollableContainers(r),l.onPositionChange.subscribe(function(t){n._tooltipInstance&&(t.scrollableViewProperties.isOverlayClipped&&n._tooltipInstance.isVisible()?n._ngZone.run(function(){return n.hide(0)}):n._tooltipInstance._setTransformOrigin(t.connectionPair))});var i=new ci({direction:this._dir?this._dir.value:"ltr",positionStrategy:l,panelClass:"mat-tooltip-panel",scrollStrategy:this._scrollStrategy()});return this._overlayRef=this._overlay.create(i),this._overlayRef},n.prototype._disposeTooltip=function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._tooltipInstance=null},n.prototype._getOrigin=function(){var n,t=!this._dir||"ltr"==this._dir.value;if("above"==this.position||"below"==this.position)n={originX:"center",originY:"above"==this.position?"top":"bottom"};else if("left"==this.position||"before"==this.position&&t||"after"==this.position&&!t)n={originX:"start",originY:"center"};else{if(!("right"==this.position||"after"==this.position&&t||"before"==this.position&&!t))throw Eu(this.position);n={originX:"end",originY:"center"}}var e=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:e.x,originY:e.y}}},n.prototype._getOverlayPosition=function(){var n,t=!this._dir||"ltr"==this._dir.value;if("above"==this.position)n={overlayX:"center",overlayY:"bottom"};else if("below"==this.position)n={overlayX:"center",overlayY:"top"};else if("left"==this.position||"before"==this.position&&t||"after"==this.position&&!t)n={overlayX:"end",overlayY:"center"};else{if(!("right"==this.position||"after"==this.position&&t||"before"==this.position&&!t))throw Eu(this.position);n={overlayX:"start",overlayY:"center"}}var e=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:e.x,overlayY:e.y}}},n.prototype._updateTooltipMessage=function(){var n=this;this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),this._ngZone.onMicrotaskEmpty.asObservable().pipe(Object(_r.a)(1)).subscribe(function(){n._tooltipInstance&&n._overlayRef.updatePosition()}))},n.prototype._setTooltipClass=function(n){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=n,this._tooltipInstance._markForCheck())},n.prototype._invertPosition=function(n,t){return"above"===this.position||"below"===this.position?"top"===t?t="bottom":"bottom"===t&&(t="top"):"end"===n?n="start":"start"===n&&(n="end"),{x:n,y:t}},n}(),Ru=function(){function n(n){this._changeDetectorRef=n,this._visibility="initial",this._closeOnInteraction=!1,this._transformOrigin="bottom",this._onHide=new yl.a}return n.prototype.show=function(n,t){var e=this;this._hideTimeoutId&&clearTimeout(this._hideTimeoutId),this._closeOnInteraction=!0,this._position=n,this._showTimeoutId=setTimeout(function(){e._visibility="visible",e._markForCheck()},t)},n.prototype.hide=function(n){var t=this;this._showTimeoutId&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(function(){t._visibility="hidden",t._markForCheck()},n)},n.prototype.afterHidden=function(){return this._onHide.asObservable()},n.prototype.isVisible=function(){return"visible"===this._visibility},n.prototype._setTransformOrigin=function(n){var t="X"==("above"===this._position||"below"===this._position?"Y":"X")?n.overlayX:n.overlayY;if("top"===t||"bottom"===t)this._transformOrigin=t;else if("start"===t)this._transformOrigin="left";else{if("end"!==t)throw Eu(this._position);this._transformOrigin="right"}},n.prototype._animationStart=function(){this._closeOnInteraction=!1},n.prototype._animationDone=function(n){var t=this,e=n.toState;"hidden"!==e||this.isVisible()||this._onHide.next(),"visible"!==e&&"hidden"!==e||Promise.resolve().then(function(){return t._closeOnInteraction=!0})},n.prototype._handleBodyInteraction=function(){this._closeOnInteraction&&this.hide(0)},n.prototype._markForCheck=function(){this._changeDetectorRef.markForCheck()},n}(),Hu=function(){},Nu=function(){function n(){this.color="primary",this._value=0,this._bufferValue=0,this.mode="determinate"}return Object.defineProperty(n.prototype,"value",{get:function(){return this._value},set:function(n){this._value=Fu(n||0)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"bufferValue",{get:function(){return this._bufferValue},set:function(n){this._bufferValue=Fu(n||0)},enumerable:!0,configurable:!0}),n.prototype._primaryTransform=function(){return{transform:"scaleX("+this.value/100+")"}},n.prototype._bufferTransform=function(){if("buffer"==this.mode)return{transform:"scaleX("+this.bufferValue/100+")"}},n}();function Fu(n,t,e){return void 0===t&&(t=0),void 0===e&&(e=100),Math.max(t,Math.min(e,n))}var Bu=function(){},Vu=100,Wu=function(n){function t(t,e,l){var r=n.call(this,t,e,l)||this;return r.mode="indeterminate",r}return Object(i.__extends)(t,n),t}(function(n){function t(t,e,l){var r=n.call(this,t)||this;return r._elementRef=t,r._document=l,r._value=0,r._fallbackAnimation=!1,r._elementSize=Vu,r._diameter=Vu,r.mode="determinate",r._fallbackAnimation=e.EDGE||e.TRIDENT,t.nativeElement.classList.add("mat-progress-spinner-indeterminate"+(r._fallbackAnimation?"-fallback":"")+"-animation"),r}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"diameter",{get:function(){return this._diameter},set:function(n){this._diameter=Yl(n),this._fallbackAnimation||t.diameters.has(this._diameter)||this._attachStyleNode()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"strokeWidth",{get:function(){return this._strokeWidth||this.diameter/10},set:function(n){this._strokeWidth=Yl(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return"determinate"===this.mode?this._value:0},set:function(n){this._value=Math.max(0,Math.min(100,Yl(n)))},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(n){(n.strokeWidth||n.diameter)&&(this._elementSize=this._diameter+Math.max(this.strokeWidth-10,0))},Object.defineProperty(t.prototype,"_circleRadius",{get:function(){return(this.diameter-10)/2},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_viewBox",{get:function(){var n=2*this._circleRadius+this.strokeWidth;return"0 0 "+n+" "+n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_strokeCircumference",{get:function(){return 2*Math.PI*this._circleRadius},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_strokeDashOffset",{get:function(){return"determinate"===this.mode?this._strokeCircumference*(100-this._value)/100:this._fallbackAnimation&&"indeterminate"===this.mode?.2*this._strokeCircumference:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_circleStrokeWidth",{get:function(){return this.strokeWidth/this._elementSize*100},enumerable:!0,configurable:!0}),t.prototype._attachStyleNode=function(){var n=t.styleTag;n||(n=this._document.createElement("style"),this._document.head.appendChild(n),t.styleTag=n),n&&n.sheet&&n.sheet.insertRule(this._getAnimationText(),0),t.diameters.add(this.diameter)},t.prototype._getAnimationText=function(){return"\n @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n\n 25.1% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n\n 50.01% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n\n 75.01% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n".replace(/START_VALUE/g,""+.95*this._strokeCircumference).replace(/END_VALUE/g,""+.2*this._strokeCircumference).replace(/DIAMETER/g,""+this.diameter)},t.diameters=new Set([Vu]),t.styleTag=null,t}(Gl(function(n){this._elementRef=n},"primary"))),zu=function(){},Uu=function(n){function t(t,e,r,i,o){var s=n.call(this,t)||this;return s._focusMonitor=e,s._changeDetectorRef=r,s._dir=i,s._invert=!1,s._max=100,s._min=0,s._step=1,s._thumbLabel=!1,s._tickInterval=0,s._value=null,s._vertical=!1,s.change=new l.o,s.input=new l.o,s.onTouched=function(){},s._percent=0,s._isSliding=!1,s._isActive=!1,s._tickIntervalPercent=0,s._sliderDimensions=null,s._controlValueAccessorChangeFn=function(){},s._dirChangeSubscription=rl.a.EMPTY,s.tabIndex=parseInt(o)||0,s}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"invert",{get:function(){return this._invert},set:function(n){this._invert=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"max",{get:function(){return this._max},set:function(n){this._max=Yl(n,this._max),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"min",{get:function(){return this._min},set:function(n){this._min=Yl(n,this._min),null===this._value&&(this.value=this._min),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"step",{get:function(){return this._step},set:function(n){this._step=Yl(n,this._step),this._step%1!=0&&(this._roundLabelTo=this._step.toString().split(".").pop().length),this._changeDetectorRef.markForCheck()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"thumbLabel",{get:function(){return this._thumbLabel},set:function(n){this._thumbLabel=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_thumbLabelDeprecated",{get:function(){return this._thumbLabel},set:function(n){this._thumbLabel=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"tickInterval",{get:function(){return this._tickInterval},set:function(n){this._tickInterval="auto"===n?"auto":"number"==typeof n||"string"==typeof n?Yl(n,this._tickInterval):0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_tickIntervalDeprecated",{get:function(){return this.tickInterval},set:function(n){this.tickInterval=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return null===this._value&&(this.value=this._min),this._value},set:function(n){n!==this._value&&(this._value=Yl(n,this._value||0),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"vertical",{get:function(){return this._vertical},set:function(n){this._vertical=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"displayValue",{get:function(){return this._roundLabelTo&&this.value&&this.value%1!=0?this.value.toFixed(this._roundLabelTo):this.value||0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"percent",{get:function(){return this._clamp(this._percent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_invertAxis",{get:function(){return this.vertical?!this.invert:this.invert},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_isMinValue",{get:function(){return 0===this.percent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_thumbGap",{get:function(){return this.disabled?7:this._isMinValue&&!this.thumbLabel?this._isActive?10:7:0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_trackBackgroundStyles",{get:function(){var n=this.vertical?"Y":"X";return{transform:"translate"+n+"("+(this._invertMouseCoords?"-":"")+this._thumbGap+"px) scale"+n+"("+(1-this.percent)+")"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_trackFillStyles",{get:function(){var n=this.vertical?"Y":"X";return{transform:"translate"+n+"("+(this._invertMouseCoords?"":"-")+this._thumbGap+"px) scale"+n+"("+this.percent+")"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_ticksContainerStyles",{get:function(){return{transform:"translate"+(this.vertical?"Y":"X")+"("+(this.vertical||"rtl"!=this._direction?"-":"")+this._tickIntervalPercent/2*100+"%)"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_ticksStyles",{get:function(){var n=100*this._tickIntervalPercent,t={backgroundSize:this.vertical?"2px "+n+"%":n+"% 2px",transform:"translateZ(0) translate"+(this.vertical?"Y":"X")+"("+(this.vertical||"rtl"!=this._direction?"":"-")+n/2+"%)"+(this.vertical||"rtl"!=this._direction?"":" rotate(180deg)")};return this._isMinValue&&this._thumbGap&&(t["padding"+(this.vertical?this._invertAxis?"Bottom":"Top":this._invertAxis?"Right":"Left")]=this._thumbGap+"px"),t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_thumbContainerStyles",{get:function(){return{transform:"translate"+(this.vertical?"Y":"X")+"(-"+100*(("rtl"!=this._direction||this.vertical?this._invertAxis:!this._invertAxis)?this.percent:1-this.percent)+"%)"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_invertMouseCoords",{get:function(){return"rtl"!=this._direction||this.vertical?this._invertAxis:!this._invertAxis},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_direction",{get:function(){return this._dir&&"rtl"==this._dir.value?"rtl":"ltr"},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){var n=this;this._focusMonitor.monitor(this._elementRef.nativeElement,!0).subscribe(function(t){n._isActive=!!t&&"keyboard"!==t,n._changeDetectorRef.detectChanges()}),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(function(){n._changeDetectorRef.markForCheck()}))},t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement),this._dirChangeSubscription.unsubscribe()},t.prototype._onMouseenter=function(){this.disabled||(this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent())},t.prototype._onClick=function(n){if(!this.disabled){var t=this.value;this._isSliding=!1,this._focusHostElement(),this._updateValueFromPosition({x:n.clientX,y:n.clientY}),t!=this.value&&(this._emitInputEvent(),this._emitChangeEvent())}},t.prototype._onSlide=function(n){if(!this.disabled){this._isSliding||this._onSlideStart(null),n.preventDefault();var t=this.value;this._updateValueFromPosition({x:n.center.x,y:n.center.y}),t!=this.value&&this._emitInputEvent()}},t.prototype._onSlideStart=function(n){this.disabled||this._isSliding||(this._onMouseenter(),this._isSliding=!0,this._focusHostElement(),this._valueOnSlideStart=this.value,n&&(this._updateValueFromPosition({x:n.center.x,y:n.center.y}),n.preventDefault()))},t.prototype._onSlideEnd=function(){this._isSliding=!1,this._valueOnSlideStart!=this.value&&this._emitChangeEvent(),this._valueOnSlideStart=null},t.prototype._onFocus=function(){this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent()},t.prototype._onBlur=function(){this.onTouched()},t.prototype._onKeydown=function(n){if(!this.disabled){var t=this.value;switch(n.keyCode){case 33:this._increment(10);break;case 34:this._increment(-10);break;case 35:this.value=this.max;break;case 36:this.value=this.min;break;case 37:this._increment("rtl"==this._direction?1:-1);break;case 38:this._increment(1);break;case 39:this._increment("rtl"==this._direction?-1:1);break;case 40:this._increment(-1);break;default:return}t!=this.value&&(this._emitInputEvent(),this._emitChangeEvent()),this._isSliding=!0,n.preventDefault()}},t.prototype._onKeyup=function(){this._isSliding=!1},t.prototype._increment=function(n){this.value=this._clamp((this.value||0)+this.step*n,this.min,this.max)},t.prototype._updateValueFromPosition=function(n){if(this._sliderDimensions){var t=this._clamp(((this.vertical?n.y:n.x)-(this.vertical?this._sliderDimensions.top:this._sliderDimensions.left))/(this.vertical?this._sliderDimensions.height:this._sliderDimensions.width));this._invertMouseCoords&&(t=1-t);var e=this._calculateValue(t),l=Math.round((e-this.min)/this.step)*this.step+this.min;this.value=this._clamp(l,this.min,this.max)}},t.prototype._emitChangeEvent=function(){this._controlValueAccessorChangeFn(this.value),this.change.emit(this._createChangeEvent())},t.prototype._emitInputEvent=function(){this.input.emit(this._createChangeEvent())},t.prototype._updateTickIntervalPercent=function(){if(this.tickInterval&&this._sliderDimensions)if("auto"==this.tickInterval){var n=this.vertical?this._sliderDimensions.height:this._sliderDimensions.width,t=Math.ceil(30/(n*this.step/(this.max-this.min)));this._tickIntervalPercent=t*this.step/n}else this._tickIntervalPercent=this.tickInterval*this.step/(this.max-this.min)},t.prototype._createChangeEvent=function(n){void 0===n&&(n=this.value);var t=new function(){};return t.source=this,t.value=n,t},t.prototype._calculatePercentage=function(n){return((n||0)-this.min)/(this.max-this.min)},t.prototype._calculateValue=function(n){return this.min+n*(this.max-this.min)},t.prototype._clamp=function(n,t,e){return void 0===t&&(t=0),void 0===e&&(e=1),Math.max(t,Math.min(n,e))},t.prototype._getSliderDimensions=function(){return this._sliderWrapper?this._sliderWrapper.nativeElement.getBoundingClientRect():null},t.prototype._focusHostElement=function(){this._elementRef.nativeElement.focus()},t.prototype.writeValue=function(n){this.value=n},t.prototype.registerOnChange=function(n){this._controlValueAccessorChangeFn=n},t.prototype.registerOnTouched=function(n){this.onTouched=n},t.prototype.setDisabledState=function(n){this.disabled=n},t}(Jl(Gl(Ul(function(n){this._elementRef=n}),"accent"))),Gu=function(){},qu=function(){},Ju=function(n){function t(t,e){var l=n.call(this,t)||this;return l._platform=e,l}return Object(i.__extends)(t,n),t.prototype.ngAfterViewInit=function(){var n=this;Object(l.Y)()&&this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(function(){return n._checkToolbarMixedModes()}))},t.prototype._checkToolbarMixedModes=function(){this._toolbarRows.length&&[].slice.call(this._elementRef.nativeElement.childNodes).filter(function(n){return!(n.classList&&n.classList.contains("mat-toolbar-row"))}).filter(function(n){return n.nodeType!==Node.COMMENT_NODE}).some(function(n){return n.textContent.trim()})&&function(){throw Error("MatToolbar: Attempting to combine different toolbar modes. Either specify multiple `` elements explicitly or just place content inside of a `` for a single row.")}()},t}(Gl(function(n){this._elementRef=n})),Qu=function(){},Ku=function(n){return n[n.RequestingCurrentPin=0]="RequestingCurrentPin",n[n.RequestingNewPin=1]="RequestingNewPin",n[n.ConfirmingNewPin=2]="ConfirmingNewPin",n}({}),Xu=function(){function n(n){this.dialog=n}return Object.defineProperty(n.prototype,"requestPinComponent",{set:function(n){this.requestPinComponentInternal=n},enumerable:!0,configurable:!0}),n.prototype.resetValues=function(){this.changingPin=!1,this.signingTx=!1},n.prototype.requestPin=function(){var n=this;return this.dialog.open(this.requestPinComponentInternal,{width:"350px",autoFocus:!1,data:{changingPin:this.changingPin,changePinState:this.changePinState,signingTx:this.signingTx}}).afterClosed().map(function(t){return n.changingPin&&(n.changePinState===Ku.RequestingCurrentPin?n.changePinState=Ku.RequestingNewPin:n.changePinState===Ku.RequestingNewPin&&(n.changePinState=Ku.ConfirmingNewPin)),t})},n}(),Zu=function(){function n(n){this.dialog=n}return Object.defineProperty(n.prototype,"requestWordComponent",{set:function(n){this.requestWordComponentInternal=n},enumerable:!0,configurable:!0}),n.prototype.requestWord=function(){return this.dialog.open(this.requestWordComponentInternal,{width:"350px",data:{isForHwWallet:!0,wordNumber:0,restoringSoftwareWallet:!1}}).afterClosed().map(function(n){return n})},n}(),$u=function(n){function t(){var t=n.call(this,"Timeout has occurred");this.name=t.name="TimeoutError",this.stack=t.stack,this.message=t.message}return Object(i.__extends)(t,n),t}(Error),nc=function(){function n(n,t,e,l){this.waitFor=n,this.absoluteTimeout=t,this.scheduler=e,this.errorInstance=l}return n.prototype.call=function(n,t){return t.subscribe(new tc(n,this.absoluteTimeout,this.waitFor,this.scheduler,this.errorInstance))},n}(),tc=function(n){function t(t,e,l,r,i){n.call(this,t),this.absoluteTimeout=e,this.waitFor=l,this.scheduler=r,this.errorInstance=i,this.action=null,this.scheduleTimeout()}return Object(i.__extends)(t,n),t.dispatchTimeout=function(n){n.error(n.errorInstance)},t.prototype.scheduleTimeout=function(){var n=this.action;n?this.action=n.schedule(this,this.waitFor):this.add(this.action=this.scheduler.schedule(t.dispatchTimeout,this.waitFor,this))},t.prototype._next=function(t){this.absoluteTimeout||this.scheduleTimeout(),n.prototype._next.call(this,t)},t.prototype._unsubscribe=function(){this.action=null,this.scheduler=null,this.errorInstance=null},t}(Be.a);o.a.prototype.timeout=function(n,t){return void 0===t&&(t=sl),function(n,t){void 0===t&&(t=sl);var e=ul(n),l=e?+n-t.now():Math.abs(n);return function(n){return n.lift(new nc(l,e,t,new $u))}}(n,t)(this)};var ec,lc=function(){function n(n,t,e,l,r){this.http=n,this.apiService=t,this.hwWalletPinService=e,this.hwWalletSeedWordService=l,this.ngZone=r,this.url="http://127.0.0.1:9510/api/v1",this.hwConnected=!1,this.connectionEventSubject=new Tl(!1),this.disconnectedChecks=0,this.maxFastDisconnectedChecks=32}return Object.defineProperty(n.prototype,"connectionEvent",{get:function(){return this.connectionEventSubject.asObservable()},enumerable:!0,configurable:!0}),n.prototype.get=function(n){return this.checkResponse(this.http.get(this.url+n,this.returnRequestOptions()),n.includes("/available"))},n.prototype.post=function(n,t){return void 0===t&&(t={}),this.checkResponse(this.http.post(this.url+n,JSON.stringify(t),this.returnRequestOptions()))},n.prototype.put=function(n,t,e,l){return void 0===t&&(t=null),void 0===e&&(e=!1),void 0===l&&(l=!1),this.checkResponse(this.http.put(this.url+n,t,this.returnRequestOptions(e)),!1,l)},n.prototype.delete=function(n){return this.checkResponse(this.http.delete(this.url+n,this.returnRequestOptions()))},n.prototype.checkResponse=function(t,e,l){var r=this;return void 0===e&&(e=!1),void 0===l&&(l=!1),t.timeout(l?3e4:55e3).flatMap(function(t){var l=t.json();return l.data&&l.data.length&&(l.data=1===l.data.length?l.data[0]:l.data),e?r.ngZone.run(function(){return r.updateHwConnected(!!l.data)}):r.updateHwConnected(!0),"string"==typeof l.data&&-1!==l.data.indexOf("PinMatrixRequest")?r.hwWalletPinService.requestPin().flatMap(function(t){return t?r.post("/intermediate/pin_matrix",{pin:t}):r.put("/cancel").map(function(){return n.errorCancelled})}):"string"==typeof l.data&&-1!==l.data.indexOf("WordRequest")?r.hwWalletSeedWordService.requestWord().flatMap(function(t){return t?r.post("/intermediate/word",{word:t}):r.put("/cancel").map(function(){return n.errorCancelled})}):"string"==typeof l.data&&-1!==l.data.indexOf("ButtonRequest")?r.post("/intermediate/button"):o.a.of(l)}).catch(function(t){if(t&&t.name&&"TimeoutError"===t.name)return r.put("/cancel").subscribe(),o.a.throw({_body:n.errorTimeout});if(t&&t._body){var e=void 0;if("string"==typeof t._body)e=t._body;else if(t._body.error)e=t._body.error;else try{e=JSON.parse(t._body).error}catch(n){}if(e)return r.apiService.processConnectionError({_body:e},!0)}return o.a.throw({_body:n.errorConnectingWithTheDaemon})})},n.prototype.returnRequestOptions=function(n){void 0===n&&(n=!1);var t=new ae;return t.headers=new qt,n||t.headers.append("Content-Type","application/json"),t},n.prototype.checkHw=function(n){var t=this;this.checkHwSubscription&&this.checkHwSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.checkHwSubscription=o.a.of(1).delay(n?t.hwConnected||t.disconnectedChecksthis.total&&this.destination.next(n)},t}(Be.a);e("lAP5"),e("T1Dh");var vc=function(){function n(n){this.predicate=n}return n.prototype.call=function(n,t){return t.subscribe(new wc(n,this.predicate))},n}(),wc=function(n){function t(t,e){n.call(this,t),this.predicate=e,this.index=0}return Object(i.__extends)(t,n),t.prototype._next=function(n){var t,e=this.destination;try{t=this.predicate(n,this.index++)}catch(n){return void e.error(n)}this.nextOrComplete(n,t)},t.prototype.nextOrComplete=function(n,t){var e=this.destination;Boolean(t)?e.next(n):e.complete()},t}(Be.a);e("DDro");var xc=e("Uter"),Mc=function(){function n(){}return n.encode=function(n,t,e,l,r){var i=this;if(void 0===r&&(r=0),n.length!==e.length)throw new Error("Invalid number of signatures.");var o=this.encodeSizeTransaction(n,t,e).toNumber(),s=new ArrayBuffer(o),a=new DataView(s),u=0;if(a.setUint32(u,o,!0),a.setUint8(u+=4,r),u+=1,this.convertToBytes(l).forEach(function(n){a.setUint8(u,n),u+=1}),e.length>65535)throw new Error("Too many signatures.");if(a.setUint32(u,e.length,!0),u+=4,e.forEach(function(n){i.convertToBytes(n).forEach(function(n){a.setUint8(u,n),u+=1})}),n.length>65535)throw new Error("Too many inputs.");if(a.setUint32(u,n.length,!0),u+=4,n.forEach(function(n){i.convertToBytes(n.hashIn).forEach(function(n){a.setUint8(u,n),u+=1})}),t.length>65535)throw new Error("Too many outputs.");a.setUint32(u,t.length,!0),u+=4;var c=xc("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");return t.forEach(function(n){var t=c.decode(n.address);a.setUint8(u,t[20]),u+=1;for(var e=0;e<20;e++)a.setUint8(u,t[e]),u+=1;u=i.setUint64(a,u,new Ee.a(n.coin)),u=i.setUint64(a,u,new Ee.a(n.hour))}),this.convertToHex(s)},n.encodeSizeTransaction=function(n,t,e){var l=new Ee.a(0);return(l=(l=(l=(l=(l=(l=(l=(l=l.plus(4)).plus(1)).plus(32)).plus(4)).plus(new Ee.a(65).multipliedBy(e.length))).plus(4)).plus(new Ee.a(32).multipliedBy(n.length))).plus(4)).plus(new Ee.a(37).multipliedBy(t.length))},n.setUint64=function(n,t,e){var l=e.toString(16);l.length%2!=0&&(l="0"+l);for(var r=this.convertToBytes(l),i=r.length-1;i>=0;i--)n.setUint8(t,r[i]),t+=1;for(i=0;i<8-r.length;i++)n.setUint8(t,0),t+=1;return t},n.convertToBytes=function(n){if(n.length%2!=0)throw new Error("Invalid hex string.");for(var t=[],e=0;es[0]?i=!0:a===s[0]&&(u>s[1]?i=!0:u===s[1]&&(Ll.useHwWalletDaemon?l.rawResponse.fw_patch:l.rawResponse.patchVersion)>=s[2]&&(i=!0))}}var c=[],d=!1;Ll.useHwWalletDaemon?(l.rawResponse.needs_backup&&(c.push(Cc.NeedsBackup),d=!0),l.rawResponse.pin_protection||(c.push(Cc.NeedsPin),d=!0)):(l.rawResponse.needsBackup&&(c.push(Cc.NeedsBackup),d=!0),l.rawResponse.pinProtection||(c.push(Cc.NeedsPin),d=!0)),r?i||(c.push(Cc.OutdatedFirmware),d=!0):c.push(Cc.FirmwareVersionNotVerified);var h=!1;if(n){var p=l.rawResponse.label?l.rawResponse.label:l.rawResponse.deviceId?l.rawResponse.deviceId:l.rawResponse.device_id;n.label!==p&&(n.label=p,h=!0),n.hasHwSecurityWarnings=d,e.saveHardwareWallets()}return{features:l.rawResponse,securityWarnings:c,walletNameUpdated:h}}):null},n.prototype.deleteHardwareWallet=function(n){var t=this;return n.isHardware?this.wallets.first().map(function(e){var l=e.indexOf(n);return-1!==l&&(e.splice(l,1),t.saveHardwareWallets(),t.refreshBalances(),!0)}):null},n.prototype.folder=function(){return this.apiService.get("wallets/folderName").map(function(n){return n.address})},n.prototype.outputs=function(){var n=this;return this.addressesAsString().first().filter(function(n){return!!n}).flatMap(function(t){return n.apiService.post("outputs",{addrs:t})})},n.prototype.outputsWithWallets=function(){return o.a.zip(this.all(),this.outputs(),function(n,t){return n.map(function(n){return n.addresses=n.addresses.map(function(n){return n.outputs=t.head_outputs.filter(function(t){return t.address===n.address}),n}),n})})},n.prototype.pendingTransactions=function(){return this.pendingTxs.asObservable()},n.prototype.refreshBalances=function(){var n=this;this.wallets.first().subscribe(function(t){o.a.forkJoin(t.map(function(t){return n.retrieveWalletBalance(t).map(function(n){return t.coins=n.coins,t.hours=n.hours,t.addresses.map(function(t){var e=n.addresses.find(function(n){return n.address===t.address});t.coins=e.coins,t.hours=e.hours}),t})})).subscribe(function(t){return n.wallets.next(t)})})},n.prototype.renameWallet=function(n,t){var e=this;return this.apiService.post("wallet/update",{id:n.filename,label:t}).do(function(){n.label=t,e.updateWallet(n)})},n.prototype.toggleEncryption=function(n,t){var e=this;return this.apiService.postWalletToggleEncryption(n,t).do(function(t){n.encrypted=t.meta.encrypted,e.updateWallet(t)})},n.prototype.resetPassword=function(n,t,e){var l=this,r=new Object;return r.id=n.filename,r.seed=t,e&&(r.password=e),this.apiService.post("wallet/recover",r,{},!0).do(function(t){n.encrypted=t.data.meta.encrypted,l.updateWallet(t.data)})},n.prototype.getWalletSeed=function(n,t){return this.apiService.getWalletSeed(n,t)},n.prototype.createTransaction=function(n,t,e,l,r,i,o,s){var a=this;e&&(t=null),n.isHardware&&!i&&(i=n.addresses[0].address);var u=!!n.isHardware,c={hours_selection:r,wallet_id:n?n.filename:null,password:o,addresses:t,unspents:e,to:l,change_address:i};u||(c.unsigned=s);var d,h=this.apiService.post(u?"transaction":"wallet/transaction",c,{json:!0},u).map(function(t){var e=u?t.data:t;if(n.isHardware){if(e.transaction.inputs.length>8)throw new Error(a.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"));if(e.transaction.outputs.length>8)throw new Error(a.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"))}return kc({},e.transaction,{hoursBurned:new Ae.BigNumber(e.transaction.fee),encoded:e.encoded_transaction,innerHash:e.transaction.inner_hash})});return n.isHardware&&!s&&(h=h.flatMap(function(t){return d=t,a.signTransaction(n,null,t)}).map(function(n){return d.encoded=n.encoded,d})),h},n.prototype.signTransaction=function(n,t,e){if(n.isHardware){var l=[],r=[],i=[],s=[];if(e.outputs.forEach(function(n){l.push({address:n.address,coins:parseInt(new Ae.BigNumber(n.coins).multipliedBy(1e6).toFixed(0),10),hours:parseInt(n.hours,10)}),i.push({address:n.address,coin:parseInt(new Ae.BigNumber(n.coins).multipliedBy(1e6).toFixed(0),10),hour:parseInt(n.hours,10)})}),i.length>1)for(var a=l.length-1;a>=0;a--)if(i[a].address===n.addresses[0].address){i[a].address_index=0;break}var u=new Map;return n.addresses.forEach(function(n,t){return u.set(n.address,t)}),e.inputs.forEach(function(n){r.push({hash:n.uxid,secret:"",address:n.address,address_index:u.get(n.address),calculated_hours:parseInt(n.calculated_hours,10),coins:parseInt(n.coins,10)}),s.push({hashIn:n.uxid,index:u.get(n.address)})}),this.hwWalletService.signTransaction(s,i).flatMap(function(n){var t=Mc.encode(s,i,n.rawResponse,e.innerHash);return o.a.of(kc({},e,{encoded:t}))})}return this.apiService.post("wallet/transaction/sign",{wallet_id:n?n.filename:null,password:t,encoded_transaction:e.encoded},{json:!0},!0).map(function(n){return kc({},n.data.transaction,{hoursBurned:new Ae.BigNumber(n.data.transaction.fee),encoded:n.data.encoded_transaction})})},n.prototype.injectTransaction=function(n,t){var e=this;return this.apiService.post("injectTransaction",{rawtx:n},{json:!0}).flatMap(function(n){return setTimeout(function(){return e.startDataRefreshSubscription()},32),t?e.storageService.store(ec.NOTES,n,t).retryWhen(function(n){return n.delay(1e3).take(3).concat(o.a.throw(-1))}).catch(function(n){return-1===n?o.a.of(-1):n}).map(function(n){return-1!==n}):o.a.of(!1)})},n.prototype.transaction=function(n){var t=this;return this.apiService.get("transaction",{txid:n}).flatMap(function(n){return n.txn.inputs&&!n.txn.inputs.length?o.a.of(n):o.a.forkJoin(n.txn.inputs.map(function(n){return t.retrieveInputAddress(n).map(function(n){return n.owner_address})})).map(function(t){return n.txn.inputs=t,n})})},n.prototype.transactions=function(){var n,t,e=this,l=new Map;return this.wallets.first().flatMap(function(t){return n=t,e.allAddresses().first()}).flatMap(function(n){return e.addresses=n,n.map(function(n){return l.set(n.address,!0)}),e.apiService.getTransactions(n)}).flatMap(function(n){return t=n,e.storageService.get(ec.NOTES,null)}).map(function(e){var r=new Map;return Object.keys(e.data).forEach(function(n){r.set(n,e.data[n])}),t.sort(function(n,t){return t.timestamp-n.timestamp}).map(function(t){var e=t.inputs.some(function(n){return l.has(n.owner)}),i=new Map;if(t.balance=new Ae.BigNumber("0"),t.hoursSent=new Ae.BigNumber("0"),e){var o=new Map;if(t.inputs.map(function(t){l.has(t.owner)&&(i.set(t.owner,!0),n.map(function(n){n.addresses.some(function(n){return n.address===t.owner})&&n.addresses.map(function(n){return o.set(n.address,!0)})}))}),t.outputs.map(function(n){o.has(n.dst)||(t.balance=t.balance.minus(n.coins),t.hoursSent=t.hoursSent.plus(n.hours))}),t.balance.isEqualTo(0)){t.coinsMovedInternally=!0;var s=new Map;t.inputs.map(function(n){s.set(n.owner,!0)}),t.outputs.map(function(n){s.has(n.dst)||(i.set(n.dst,!0),t.balance=t.balance.plus(n.coins),t.hoursSent=t.hoursSent.plus(n.hours))})}}else t.outputs.map(function(n){l.has(n.dst)&&(i.set(n.dst,!0),t.balance=t.balance.plus(n.coins),t.hoursSent=t.hoursSent.plus(n.hours))});i.forEach(function(n,e){t.addresses.push(e)});var a=new Ae.BigNumber("0");t.inputs.map(function(n){return a=a.plus(new Ae.BigNumber(n.calculated_hours))});var u=new Ae.BigNumber("0");t.outputs.map(function(n){return u=u.plus(new Ae.BigNumber(n.hours))}),t.hoursBurned=a.minus(u);var c=r.get(t.txid);return c&&(t.note=c),t})})},n.prototype.startDataRefreshSubscription=function(){var n=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){n.dataRefreshSubscription=o.a.timer(0,1e4).subscribe(function(){return n.ngZone.run(function(){n.refreshBalances(),n.refreshPendingTransactions()})})})},n.prototype.saveHardwareWallets=function(){var n=this;this.wallets.first().subscribe(function(t){var e=[];t.map(function(t){t.isHardware&&e.push(n.createHardwareWalletData(t.label,t.addresses.map(function(n){return{address:n.address,confirmed:n.confirmed}}),t.hasHwSecurityWarnings,t.stopShowingHwSecurityPopup))}),n.hwWalletService.saveWalletsData(JSON.stringify(e)),n.wallets.next(t)})},n.prototype.verifyAddress=function(n){return this.apiService.post("address/verify",{address:n},{},!0).pipe(Object(Le.a)(function(){return!0}),Ce(function(){return o.a.of(!1)}))},n.prototype.getWalletUnspentOutputs=function(n){var t=n.addresses.map(function(n){return n.address}).join(",");return this.getOutputs(t)},n.prototype.createHardwareWalletData=function(n,t,e,l){return{label:n,filename:"",hasHwSecurityWarnings:e,stopShowingHwSecurityPopup:l,coins:null,hours:null,addresses:t.map(function(n){return{address:n.address,coins:null,hours:null,confirmed:n.confirmed}}),encrypted:!1,isHardware:!0}},n.prototype.loadData=function(){var n=this,t=[],e=[];this.apiService.getWallets().first().flatMap(function(l){return e=l,n.hwWalletService.hwWalletCompatibilityActivated?n.loadHardwareWallets(t):o.a.of(null)}).subscribe(function(){t=t.concat(e),n.wallets.next(t)},function(){return n.initialLoadFailed.next(!0)})},n.prototype.loadHardwareWallets=function(n){return this.hwWalletService.getSavedWalletsData().map(function(t){return t&&JSON.parse(t).map(function(t){return n.push(t)}),null})},n.prototype.retrieveInputAddress=function(n){return this.apiService.get("uxout",{uxid:n})},n.prototype.retrieveWalletBalance=function(n){var t;if(n.isHardware){var e=n.addresses.map(function(n){return n.address}).join(",");t=this.apiService.post("balance",{addrs:e})}else t=this.apiService.get("wallet/balance",{id:n.filename});return t.map(function(n){return{coins:new Ae.BigNumber(n.confirmed.coins).dividedBy(1e6),hours:new Ae.BigNumber(n.confirmed.hours),addresses:Object.keys(n.addresses).map(function(t){return{address:t,coins:new Ae.BigNumber(n.addresses[t].confirmed.coins).dividedBy(1e6),hours:new Ae.BigNumber(n.addresses[t].confirmed.hours)}})}})},n.prototype.updateWallet=function(n){var t=this;this.wallets.first().subscribe(function(e){e[e.findIndex(function(t){return t.filename===n.filename})]=n,t.wallets.next(e)})},n.prototype.refreshPendingTransactions=function(){var n=this;this.apiService.get("pendingTxs",{verbose:!0}).flatMap(function(t){return 0===t.length?o.a.of({user:[],all:[]}):n.wallets.first().map(function(n){var e=new Set;return n.forEach(function(n){n.addresses.forEach(function(n){return e.add(n.address)})}),{user:t.filter(function(n){return n.transaction.inputs.some(function(n){return e.has(n.owner)})||n.transaction.outputs.some(function(n){return e.has(n.dst)})}),all:t}})}).subscribe(function(t){return n.pendingTxs.next(t)})},n.prototype.getOutputs=function(n){return n?this.apiService.post("outputs",{addrs:n}).map(function(n){var t=[];return n.head_outputs.forEach(function(n){return t.push({address:n.address,coins:new Ae.BigNumber(n.coins),hash:n.hash,calculated_hours:new Ae.BigNumber(n.calculated_hours)})}),t}):o.a.of([])},n.prototype.sortOutputs=function(n,t){n.sort(function(n,e){return e.coins.isGreaterThan(n.coins)?t?1:-1:e.coins.isLessThan(n.coins)?t?-1:1:e.calculated_hours.isGreaterThan(n.calculated_hours)?-1:e.calculated_hours.isLessThan(n.calculated_hours)?1:0})},n.prototype.getMinRequiredOutputs=function(n,t){var e=[],l=[];if(t.forEach(function(n){n.calculated_hours.isGreaterThan(0)?e.push(n):l.push(n)}),0===e.length)return[];this.sortOutputs(e,!0);var r=[e[0]],i=new Ae.BigNumber(e[0].coins);return i.isGreaterThanOrEqualTo(n)?r:(this.sortOutputs(l,!1),l.forEach(function(t){i.isLessThan(n)&&(r.push(t),i=i.plus(t.coins))}),i.isGreaterThanOrEqualTo(n)?r:(e.splice(0,1),this.sortOutputs(e,!1),e.forEach(function(t){i.isLessThan(n)&&(r.push(t),i=i.plus(t.coins))}),r))},n}();function Oc(n){if("object"==typeof n&&(n._body?n=n._body:n+=""),-1!==n.indexOf('"error":')&&(n=JSON.parse(n).error.message),n.startsWith("400")||n.startsWith("403")){var t=n.split(" - ",2);return 2===t.length?t[1].charAt(0).toUpperCase()+t[1].slice(1):n}return n}function Tc(n,t,e){return void 0===e&&(e=null),Ll.useHwWalletDaemon||window.ipcRenderer.sendSync("hwGetDeviceConnectedSync")?(l=t.result?t.result===rc.FailedOrRefused?"hardware-wallet.general.refused":t.result===rc.WrongPin?"hardware-wallet.general.error-incorrect-pin":t.result===rc.IncorrectHardwareWallet?"hardware-wallet.general.error-incorrect-wallet":t.result===rc.DaemonError?"hardware-wallet.errors.daemon-connection":t.result===rc.InvalidAddress?"hardware-wallet.errors.invalid-address":t.result===rc.Timeout?"hardware-wallet.errors.timeout":t.result===rc.Disconnected?"hardware-wallet.general.error-disconnected":t.result===rc.NotInBootloaderMode?"hardware-wallet.errors.not-in-bootloader-mode":t.result===rc.PinMismatch?"hardware-wallet.change-pin.pin-mismatch":t.result===rc.WrongWord?"hardware-wallet.restore-seed.error-wrong-word":t.result===rc.InvalidSeed?"hardware-wallet.restore-seed.error-invalid-seed":t.result===rc.WrongSeed?"hardware-wallet.restore-seed.error-wrong-seed":e||"hardware-wallet.general.generic-error":e||"hardware-wallet.general.generic-error",n?n.instant(l):l):n?n.instant("hardware-wallet.general.error-disconnected"):"hardware-wallet.general.error-disconnected";var l}var Lc=function(){function n(){this.forceEmitEvents=!1,this.action=new l.o,this.mouseOver=!1}return n.prototype.onClick=function(){this.disabled&&!this.forceEmitEvents||(this.error="",this.action.emit())},n.prototype.focus=function(){this.button.focus()},n.prototype.setLoading=function(){this.state=0},n.prototype.setSuccess=function(){var n=this;this.state=1,setTimeout(function(){return n.state=null},3e3)},n.prototype.setError=function(n){var t=this;this.error="string"==typeof n?n:Oc(n._body),this.state=2,this.mouseOver&&setTimeout(function(){return t.tooltip.show()},50)},n.prototype.setDisabled=function(){this.disabled=!0},n.prototype.setEnabled=function(){this.disabled=!1},n.prototype.isLoading=function(){return 0===this.state},n.prototype.resetState=function(){return this.state=null,this.error="",this},n}();o.a.prototype.switchMap=function(n,t){return Object(Ri.a)(n,t)(this)},o.a.prototype.debounceTime=function(n,t){return void 0===t&&(t=sl),mr(n,t)(this)};var Pc,Dc,Ac=function(){function n(){var n=this;this.lastSearchTerm="",this.searchResultsSubject=new yl.a,this.wordList=[],this.wordMap=new Map,e.e(6).then(e.bind(null,"flj1")).then(function(t){n.wordList=t.list,n.wordList.forEach(function(t){n.wordMap.set(t,!0)}),n.searchResultsSubject.next(n.lastSearchTerm)})}return Object.defineProperty(n.prototype,"searchResults",{get:function(){var n=this;return this.searchResultsSubject.asObservable().debounceTime(100).map(function(t){return t.length>1?n.wordList.filter(function(n){return n.startsWith(t)}):[]})},enumerable:!0,configurable:!0}),n.prototype.setSearchTerm=function(n){this.lastSearchTerm=n,this.searchResultsSubject.next(n)},n.prototype.validateWord=function(n){return this.wordList.length>0?!!this.wordMap.has(n):null},n}();!function(n){n.Error="error",n.Done="done",n.Warning="warning"}(Pc||(Pc={})),function(n){n.Red="red-background",n.Green="green-background",n.Yellow="yellow-background"}(Dc||(Dc={}));var Ec=function(){},Yc=function(){function n(){this.config=new Ec,this.visible=!1}return n.prototype.show=function(){var n=this;this.visible?(this.visible=!1,setTimeout(function(){return n.visible=!0},32)):this.visible=!0},n.prototype.hide=function(){this.visible=!1},n}(),jc=function(){function n(){}return Object.defineProperty(n.prototype,"msgBarComponent",{set:function(n){this.msgBarComponentInternal=n},enumerable:!0,configurable:!0}),n.prototype.show=function(n){this.msgBarComponentInternal&&(this.msgBarComponentInternal.config=n,this.msgBarComponentInternal.show())},n.prototype.hide=function(){this.msgBarComponentInternal&&this.msgBarComponentInternal.hide()},n.prototype.showError=function(n,t){void 0===t&&(t=2e4);var e=new Ec;e.text=Oc(n),e.title="errors.error",e.icon=Pc.Error,e.color=Dc.Red,this.show(e),this.setTimer(t)},n.prototype.showWarning=function(n,t){void 0===t&&(t=2e4);var e=new Ec;e.text=Oc(n),e.title="common.warning",e.icon=Pc.Warning,e.color=Dc.Yellow,this.show(e),this.setTimer(t)},n.prototype.showDone=function(n,t){void 0===t&&(t=1e4);var e=new Ec;e.text=n,e.title="common.success",e.icon=Pc.Done,e.color=Dc.Green,this.show(e),this.setTimer(t)},n.prototype.setTimer=function(n){var t=this;void 0===n&&(n=1e4),this.timeSubscription&&this.timeSubscription.unsubscribe(),this.timeSubscription=o.a.of(1).delay(n).subscribe(function(){return t.hide()})},n}(),Ic=function(n){return n[n.None=0]="None",n[n.Spinner=1]="Spinner",n[n.Success=2]="Success",n[n.Error=3]="Error",n[n.Usb=4]="Usb",n[n.HardwareWallet=5]="HardwareWallet",n[n.Warning=6]="Warning",n[n.Confirm=7]="Confirm",n}({}),Rc=function(){function n(){this.icon=Ic.HardwareWallet,this.linkClicked=new l.o,this.icons=Ic}return n.prototype.activateLink=function(){this.linkClicked.emit()},n}(),Hc=function(){function n(n,t,e,l,r,i,o){var s=this;this.data=n,this.dialogRef=t,this.formBuilder=e,this.bip38WordList=l,this.msgBarService=r,this.translateService=i,this.msgIcons=Ic,this.sendingWord=!1,n.isForHwWallet&&(this.hwConnectionSubscription=o.walletConnectedAsyncEvent.subscribe(function(n){n||s.dialogRef.close()}))}return n.prototype.ngOnInit=function(){var n=this;this.form=this.formBuilder.group({word:["",Xi.required]}),this.valueChangeSubscription=this.form.controls.word.valueChanges.subscribe(function(t){n.bip38WordList.setSearchTerm(t.trim().toLowerCase())}),this.filteredOptions=this.bip38WordList.searchResults.map(function(n){return n})},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.valueChangeSubscription.unsubscribe(),this.hwConnectionSubscription&&this.hwConnectionSubscription.unsubscribe()},n.prototype.sendWord=function(){var n=this;this.sendingWord||(this.sendingWord=!0,this.msgBarService.hide(),setTimeout(function(){if(n.form.valid){var t=n.bip38WordList.validateWord(n.form.value.word.trim().toLowerCase());t?n.dialogRef.close(n.form.value.word.trim().toLowerCase()):n.msgBarService.showError(n.translateService.instant(null===t?"hardware-wallet.seed-word.error-loading-words":"hardware-wallet.seed-word.error-invalid-word"))}n.sendingWord=!1},32))},n}(),Nc=function(){function n(n,t){this.dialogRef=n,this.data=t,this.accepted=!1,this.disableDismiss=!1,this.disableDismiss=!!t.disableDismiss}return n.prototype.closeModal=function(n){this.dialogRef.close(n)},n.prototype.setAccept=function(n){this.accepted=!!n.checked},n}(),Fc=function(){return function(n){Object.assign(this,n)}}(),Bc=function(){function n(n,t){this.translate=n,this.storageService=t,this.currentLanguage=new Sl(1),this.selectedLanguageLoaded=new Sl(1),this.storageKey="lang",this.languagesInternal=[]}return Object.defineProperty(n.prototype,"languages",{get:function(){return this.languagesInternal},enumerable:!0,configurable:!0}),n.prototype.loadLanguageSettings=function(){var n=this,t=[];Ll.languages.forEach(function(e){var l=new Fc(e);n.languagesInternal.push(l),t.push(l.code)}),this.translate.addLangs(t),this.translate.setDefaultLang(Ll.defaultLanguage),this.translate.onLangChange.subscribe(function(t){return n.onLanguageChanged(t)}),this.loadCurrentLanguage()},n.prototype.changeLanguage=function(n){this.translate.use(n)},n.prototype.onLanguageChanged=function(n){this.currentLanguage.next(this.languages.find(function(t){return t.code===n.lang})),this.subscription&&this.subscription.unsubscribe(),this.subscription=this.storageService.store(ec.CLIENT,this.storageKey,n.lang).subscribe()},n.prototype.loadCurrentLanguage=function(){var n=this;this.storageService.get(ec.CLIENT,this.storageKey).subscribe(function(t){t.data&&-1!==n.translate.getLangs().indexOf(t.data)?(setTimeout(function(){n.translate.use(t.data)},16),n.selectedLanguageLoaded.next(!0)):n.selectedLanguageLoaded.next(!1)},function(){n.selectedLanguageLoaded.next(!1)})},n}(),Vc=function(){function n(n,t){this.dialogRef=n,this.languageService=t}return n.prototype.ngOnInit=function(){this.disableDismiss=this.dialogRef.disableClose,this.languages=this.languageService.languages},n.prototype.closePopup=function(n){void 0===n&&(n=null),this.dialogRef.close(n?n.code:void 0)},n}();function Wc(n,t){return n.open(Nc,{width:"450px",data:t,autoFocus:!1})}function zc(n,t){void 0===t&&(t=!1);var e=new oa;return e.width="600px",e.disableClose=t,e.autoFocus=!1,n.open(Vc,e).afterClosed()}function Uc(n){var t=document.createElement("textarea");t.style.position="fixed",t.style.left="0",t.style.top="0",t.style.opacity="0",t.value=n,document.body.appendChild(t),t.focus(),t.select(),document.execCommand("copy"),document.body.removeChild(t)}var Gc=function(){function n(n,t,e){this.apiService=n,this.dialog=t,this.msgBarService=e,this.customSeedIsNormal=!0,this.customSeedAccepted=!1,this.encrypt=!0,this.enterSeedWithAssistance=!0,this.assistedSeedConfirmed=!1,this.lastAssistedSeed="",this.numberOfAutogeneratedWords=0,this.seed=new yl.a}return n.prototype.ngOnInit=function(){this.onboarding?this.initForm(!1,null):this.initForm()},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.statusSubscription.unsubscribe(),this.seedValiditySubscription.unsubscribe()},Object.defineProperty(n.prototype,"isValid",{get:function(){return this.form.valid&&(!this.enterSeedWithAssistance&&(this.customSeedIsNormal||this.customSeedAccepted)||this.create&&this.enterSeedWithAssistance&&this.assistedSeedConfirmed||!this.create&&this.enterSeedWithAssistance&&this.lastAssistedSeed.length>2)},enumerable:!0,configurable:!0}),n.prototype.onCustomSeedAcceptance=function(n){this.customSeedAccepted=n.checked},n.prototype.setEncrypt=function(n){this.encrypt=n.checked,this.form.updateValueAndValidity()},n.prototype.getData=function(){return{creatingNewWallet:this.create,label:this.form.value.label,seed:this.enterSeedWithAssistance?this.lastAssistedSeed:this.form.value.seed,password:!this.onboarding&&this.encrypt?this.form.value.password:null,enterSeedWithAssistance:this.enterSeedWithAssistance,lastAssistedSeed:this.lastAssistedSeed,lastCustomSeed:this.form.value.seed,numberOfWords:this.create?this.numberOfAutogeneratedWords:this.form.value.number_of_words}},n.prototype.changeSeedType=function(){var n=this;this.msgBarService.hide(),this.enterSeedWithAssistance?Wc(this.dialog,{text:this.create?"wallet.new.seed.custom-seed-warning-text":"wallet.new.seed.custom-seed-warning-text-recovering",headerText:"wallet.new.seed.custom-seed-warning-title",checkboxText:this.create?"wallet.new.seed.custom-seed-warning-check":null,confirmButtonText:"wallet.new.seed.custom-seed-warning-continue",cancelButtonText:"wallet.new.seed.custom-seed-warning-cancel"}).afterClosed().subscribe(function(t){t&&(n.enterSeedWithAssistance=!1,n.removeConfirmations())}):(this.enterSeedWithAssistance=!0,this.removeConfirmations())},n.prototype.enterSeed=function(){this.create||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},n.prototype.confirmNormalSeed=function(){this.assistedSeedConfirmed||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},n.prototype.askForWord=function(n){var t=this;this.dialog.open(Hc,{width:"350px",data:{isForHwWallet:!1,wordNumber:n+1,restoringSoftwareWallet:!this.create}}).afterClosed().subscribe(function(e){if(e){if(t.create&&e!==t.lastAssistedSeed.split(" ")[n])return void t.msgBarService.showError("wallet.new.seed.incorrect-word");if(t.partialSeed[n]=e,n+=1,t.create&&nn.length)return null;if("full"===e.pathMatch&&(t.hasChildren()||l.length0?n[n.length-1]:null}function Bd(n,t){for(var e in n)n.hasOwnProperty(e)&&t(n[e],e)}function Vd(n){var t=pd.call(n);return dd.call(t,function(n){return!0===n})}function Wd(n){return Object(l._14)(n)?n:Object(l._15)(n)?Ui(Promise.resolve(n)):Object(Fe.a)(n)}function zd(n,t,e){return e?function(n,t){return Hd(n,t)}(n.queryParams,t.queryParams)&&function n(t,e){if(!Jd(t.segments,e.segments))return!1;if(t.numberOfChildren!==e.numberOfChildren)return!1;for(var l in e.children){if(!t.children[l])return!1;if(!n(t.children[l],e.children[l]))return!1}return!0}(n.root,t.root):function(n,t){return Object.keys(t).length<=Object.keys(n).length&&Object.keys(t).every(function(e){return t[e]===n[e]})}(n.queryParams,t.queryParams)&&function n(t,e){return function t(e,l,r){if(e.segments.length>r.length)return!!Jd(o=e.segments.slice(0,r.length),r)&&!l.hasChildren();if(e.segments.length===r.length){if(!Jd(e.segments,r))return!1;for(var i in l.children){if(!e.children[i])return!1;if(!n(e.children[i],l.children[i]))return!1}return!0}var o=r.slice(0,e.segments.length),s=r.slice(e.segments.length);return!!Jd(e.segments,o)&&!!e.children[Pd]&&t(e.children[Pd],l,s)}(t,e,e.segments)}(n.root,t.root)}var Ud=function(){function n(n,t,e){this.root=n,this.queryParams=t,this.fragment=e}return Object.defineProperty(n.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=Ad(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return Zd.serialize(this)},n}(),Gd=function(){function n(n,t){var e=this;this.segments=n,this.children=t,this.parent=null,Bd(t,function(n,t){return n.parent=e})}return n.prototype.hasChildren=function(){return this.numberOfChildren>0},Object.defineProperty(n.prototype,"numberOfChildren",{get:function(){return Object.keys(this.children).length},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return $d(this)},n}(),qd=function(){function n(n,t){this.path=n,this.parameters=t}return Object.defineProperty(n.prototype,"parameterMap",{get:function(){return this._parameterMap||(this._parameterMap=Ad(this.parameters)),this._parameterMap},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return eh(this)},n}();function Jd(n,t){return n.length===t.length&&n.every(function(n,e){return n.path===t[e].path})}function Qd(n,t){var e=[];return Bd(n.children,function(n,l){l===Pd&&(e=e.concat(t(n,l)))}),Bd(n.children,function(n,l){l!==Pd&&(e=e.concat(t(n,l)))}),e}var Kd=function(){},Xd=function(){function n(){}return n.prototype.parse=function(n){var t=new sh(n);return new Ud(t.parseRootSegment(),t.parseQueryParams(),t.parseFragment())},n.prototype.serialize=function(n){var t,e;return"/"+function n(t,e){if(!t.hasChildren())return $d(t);if(e){var l=t.children[Pd]?n(t.children[Pd],!1):"",r=[];return Bd(t.children,function(t,e){e!==Pd&&r.push(e+":"+n(t,!1))}),r.length>0?l+"("+r.join("//")+")":l}var i=Qd(t,function(e,l){return l===Pd?[n(t.children[Pd],!1)]:[l+":"+n(e,!1)]});return $d(t)+"/("+i.join("//")+")"}(n.root,!0)+(t=n.queryParams,(e=Object.keys(t).map(function(n){var e=t[n];return Array.isArray(e)?e.map(function(t){return nh(n)+"="+nh(t)}).join("&"):nh(n)+"="+nh(e)})).length?"?"+e.join("&"):"")+("string"==typeof n.fragment?"#"+encodeURI(n.fragment):"")},n}(),Zd=new Xd;function $d(n){return n.segments.map(function(n){return eh(n)}).join("/")}function nh(n){return encodeURIComponent(n).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";")}function th(n){return decodeURIComponent(n)}function eh(n){return""+nh(n.path)+(t=n.parameters,Object.keys(t).map(function(n){return";"+nh(n)+"="+nh(t[n])}).join(""));var t}var lh=/^[^\/()?;=&#]+/;function rh(n){var t=n.match(lh);return t?t[0]:""}var ih=/^[^=?&#]+/,oh=/^[^?&#]+/,sh=function(){function n(n){this.url=n,this.remaining=n}return n.prototype.parseRootSegment=function(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new Gd([],{}):new Gd([],this.parseChildren())},n.prototype.parseQueryParams=function(){var n={};if(this.consumeOptional("?"))do{this.parseQueryParam(n)}while(this.consumeOptional("&"));return n},n.prototype.parseFragment=function(){return this.consumeOptional("#")?decodeURI(this.remaining):null},n.prototype.parseChildren=function(){if(""===this.remaining)return{};this.consumeOptional("/");var n=[];for(this.peekStartsWith("(")||n.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),n.push(this.parseSegment());var t={};this.peekStartsWith("/(")&&(this.capture("/"),t=this.parseParens(!0));var e={};return this.peekStartsWith("(")&&(e=this.parseParens(!1)),(n.length>0||Object.keys(t).length>0)&&(e[Pd]=new Gd(n,t)),e},n.prototype.parseSegment=function(){var n=rh(this.remaining);if(""===n&&this.peekStartsWith(";"))throw new Error("Empty path url segment cannot have parameters: '"+this.remaining+"'.");return this.capture(n),new qd(th(n),this.parseMatrixParams())},n.prototype.parseMatrixParams=function(){for(var n={};this.consumeOptional(";");)this.parseParam(n);return n},n.prototype.parseParam=function(n){var t=rh(this.remaining);if(t){this.capture(t);var e="";if(this.consumeOptional("=")){var l=rh(this.remaining);l&&this.capture(e=l)}n[th(t)]=th(e)}},n.prototype.parseQueryParam=function(n){var t,e=(t=this.remaining.match(ih))?t[0]:"";if(e){this.capture(e);var l="";if(this.consumeOptional("=")){var r=function(n){var t=n.match(oh);return t?t[0]:""}(this.remaining);r&&this.capture(l=r)}var i=th(e),o=th(l);if(n.hasOwnProperty(i)){var s=n[i];Array.isArray(s)||(n[i]=s=[s]),s.push(o)}else n[i]=o}},n.prototype.parseParens=function(n){var t={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){var e=rh(this.remaining),l=this.remaining[e.length];if("/"!==l&&")"!==l&&";"!==l)throw new Error("Cannot parse url '"+this.url+"'");var r=void 0;e.indexOf(":")>-1?(r=e.substr(0,e.indexOf(":")),this.capture(r),this.capture(":")):n&&(r=Pd);var i=this.parseChildren();t[r]=1===Object.keys(i).length?i[Pd]:new Gd([],i),this.consumeOptional("//")}return t},n.prototype.peekStartsWith=function(n){return this.remaining.startsWith(n)},n.prototype.consumeOptional=function(n){return!!this.peekStartsWith(n)&&(this.remaining=this.remaining.substring(n.length),!0)},n.prototype.capture=function(n){if(!this.consumeOptional(n))throw new Error('Expected "'+n+'".')},n}(),ah=function(n){this.segmentGroup=n||null},uh=function(n){this.urlTree=n};function ch(n){return new o.a(function(t){return t.error(new ah(n))})}function dh(n){return new o.a(function(t){return t.error(new uh(n))})}function hh(n){return new o.a(function(t){return t.error(new Error("Only absolute redirects can have named outlets. redirectTo: '"+n+"'"))})}var ph=function(){function n(n,t,e,r,i){this.configLoader=t,this.urlSerializer=e,this.urlTree=r,this.config=i,this.allowRedirects=!0,this.ngModule=n.get(l.z)}return n.prototype.apply=function(){var n=this,t=this.expandSegmentGroup(this.ngModule,this.config,this.urlTree.root,Pd),e=Pe.call(t,function(t){return n.createUrlTree(t,n.urlTree.queryParams,n.urlTree.fragment)});return Te.call(e,function(t){if(t instanceof uh)return n.allowRedirects=!1,n.match(t.urlTree);if(t instanceof ah)throw n.noMatchError(t);throw t})},n.prototype.match=function(n){var t=this,e=this.expandSegmentGroup(this.ngModule,this.config,n.root,Pd),l=Pe.call(e,function(e){return t.createUrlTree(e,n.queryParams,n.fragment)});return Te.call(l,function(n){if(n instanceof ah)throw t.noMatchError(n);throw n})},n.prototype.noMatchError=function(n){return new Error("Cannot match any routes. URL Segment: '"+n.segmentGroup+"'")},n.prototype.createUrlTree=function(n,t,e){var l,r=n.segments.length>0?new Gd([],((l={})[Pd]=n,l)):n;return new Ud(r,t,e)},n.prototype.expandSegmentGroup=function(n,t,e,l){return 0===e.segments.length&&e.hasChildren()?Pe.call(this.expandChildren(n,t,e),function(n){return new Gd([],n)}):this.expandSegment(n,e,t,e.segments,l,!0)},n.prototype.expandChildren=function(n,t,e){var l=this;return function(e,r){if(0===Object.keys(e).length)return Object(Fe.a)({});var i=[],o=[],s={};Bd(e,function(e,r){var a=Pe.call(l.expandSegmentGroup(n,t,e,r),function(n){return s[r]=n});r===Pd?i.push(a):o.push(a)});var a=cd.call(Fe.a.apply(void 0,i.concat(o))),u=hd.call(a);return Pe.call(u,function(){return s})}(e.children)},n.prototype.expandSegment=function(n,t,e,l,r,i){var o=this,s=Fe.a.apply(void 0,e),a=Pe.call(s,function(s){var a=o.expandSegmentAgainstRoute(n,t,e,s,l,r,i);return Te.call(a,function(n){if(n instanceof ah)return Object(Fe.a)(null);throw n})}),u=cd.call(a),c=$e.call(u,function(n){return!!n});return Te.call(c,function(n,e){if(n instanceof Ke||"EmptyError"===n.name){if(o.noLeftoversInUrl(t,l,r))return Object(Fe.a)(new Gd([],{}));throw new ah(t)}throw n})},n.prototype.noLeftoversInUrl=function(n,t,e){return 0===t.length&&!n.children[e]},n.prototype.expandSegmentAgainstRoute=function(n,t,e,l,r,i,o){return gh(l)!==i?ch(t):void 0===l.redirectTo?this.matchSegmentAgainstRoute(n,t,l,r):o&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(n,t,e,l,r,i):ch(t)},n.prototype.expandSegmentAgainstRouteUsingRedirect=function(n,t,e,l,r,i){return"**"===l.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(n,e,l,i):this.expandRegularSegmentAgainstRouteUsingRedirect(n,t,e,l,r,i)},n.prototype.expandWildCardWithParamsAgainstRouteUsingRedirect=function(n,t,e,l){var r=this,i=this.applyRedirectCommands([],e.redirectTo,{});return e.redirectTo.startsWith("/")?dh(i):tl.call(this.lineralizeSegments(e,i),function(e){var i=new Gd(e,{});return r.expandSegment(n,i,t,e,l,!1)})},n.prototype.expandRegularSegmentAgainstRouteUsingRedirect=function(n,t,e,l,r,i){var o=this,s=fh(t,l,r),a=s.consumedSegments,u=s.lastChild,c=s.positionalParamSegments;if(!s.matched)return ch(t);var d=this.applyRedirectCommands(a,l.redirectTo,c);return l.redirectTo.startsWith("/")?dh(d):tl.call(this.lineralizeSegments(l,d),function(l){return o.expandSegment(n,t,e,l.concat(r.slice(u)),i,!1)})},n.prototype.matchSegmentAgainstRoute=function(n,t,e,l){var r=this;if("**"===e.path)return e.loadChildren?Pe.call(this.configLoader.load(n.injector,e),function(n){return e._loadedConfig=n,new Gd(l,{})}):Object(Fe.a)(new Gd(l,{}));var o=fh(t,e,l),s=o.consumedSegments,a=o.lastChild;if(!o.matched)return ch(t);var u=l.slice(a),c=this.getChildConfig(n,e);return tl.call(c,function(n){var e=n.module,l=n.routes,o=function(n,t,e,l){return e.length>0&&function(n,t,e){return l.some(function(e){return mh(n,t,e)&&gh(e)!==Pd})}(n,e)?{segmentGroup:_h(new Gd(t,function(n,t){var e={};e[Pd]=t;for(var l=0,r=n;l1||!l.children[Pd])return hh(n.redirectTo);l=l.children[Pd]}},n.prototype.applyRedirectCommands=function(n,t,e){return this.applyRedirectCreatreUrlTree(t,this.urlSerializer.parse(t),n,e)},n.prototype.applyRedirectCreatreUrlTree=function(n,t,e,l){var r=this.createSegmentGroup(n,t.root,e,l);return new Ud(r,this.createQueryParams(t.queryParams,this.urlTree.queryParams),t.fragment)},n.prototype.createQueryParams=function(n,t){var e={};return Bd(n,function(n,l){if("string"==typeof n&&n.startsWith(":")){var r=n.substring(1);e[l]=t[r]}else e[l]=n}),e},n.prototype.createSegmentGroup=function(n,t,e,l){var r=this,i=this.createSegments(n,t.segments,e,l),o={};return Bd(t.children,function(t,i){o[i]=r.createSegmentGroup(n,t,e,l)}),new Gd(i,o)},n.prototype.createSegments=function(n,t,e,l){var r=this;return t.map(function(t){return t.path.startsWith(":")?r.findPosParam(n,t,l):r.findOrReturn(t,e)})},n.prototype.findPosParam=function(n,t,e){var l=e[t.path.substring(1)];if(!l)throw new Error("Cannot redirect to '"+n+"'. Cannot find '"+t.path+"'.");return l},n.prototype.findOrReturn=function(n,t){for(var e=0,l=0,r=t;l0)?{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}:{matched:!0,consumedSegments:[],lastChild:0,positionalParamSegments:{}};var l=(t.matcher||Ed)(e,n,t);return l?{matched:!0,consumedSegments:l.consumed,lastChild:l.consumed.length,positionalParamSegments:l.posParams}:{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}}function _h(n){if(1===n.numberOfChildren&&n.children[Pd]){var t=n.children[Pd];return new Gd(n.segments.concat(t.segments),t.children)}return n}function mh(n,t,e){return(!(n.hasChildren()||t.length>0)||"full"!==e.pathMatch)&&""===e.path&&void 0!==e.redirectTo}function gh(n){return n.outlet||Pd}var yh=function(){function n(n){this._root=n}return Object.defineProperty(n.prototype,"root",{get:function(){return this._root.value},enumerable:!0,configurable:!0}),n.prototype.parent=function(n){var t=this.pathFromRoot(n);return t.length>1?t[t.length-2]:null},n.prototype.children=function(n){var t=bh(n,this._root);return t?t.children.map(function(n){return n.value}):[]},n.prototype.firstChild=function(n){var t=bh(n,this._root);return t&&t.children.length>0?t.children[0].value:null},n.prototype.siblings=function(n){var t=vh(n,this._root);return t.length<2?[]:t[t.length-2].children.map(function(n){return n.value}).filter(function(t){return t!==n})},n.prototype.pathFromRoot=function(n){return vh(n,this._root).map(function(n){return n.value})},n}();function bh(n,t){if(n===t.value)return t;for(var e=0,l=t.children;e=1;){var r=e[l],o=e[l-1];if(r.routeConfig&&""===r.routeConfig.path)l--;else{if(o.component)break;l--}}return function(n){return n.reduce(function(n,t){return{params:Object(i.__assign)({},n.params,t.params),data:Object(i.__assign)({},n.data,t.data),resolve:Object(i.__assign)({},n.resolve,t._resolvedData)}},{params:{},data:{},resolve:{}})}(e.slice(l))}var Oh=function(){function n(n,t,e,l,r,i,o,s,a,u,c){this.url=n,this.params=t,this.queryParams=e,this.fragment=l,this.data=r,this.outlet=i,this.component=o,this.routeConfig=s,this._urlSegment=a,this._lastPathIndex=u,this._resolve=c}return Object.defineProperty(n.prototype,"root",{get:function(){return this._routerState.root},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"parent",{get:function(){return this._routerState.parent(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"firstChild",{get:function(){return this._routerState.firstChild(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"children",{get:function(){return this._routerState.children(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pathFromRoot",{get:function(){return this._routerState.pathFromRoot(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"paramMap",{get:function(){return this._paramMap||(this._paramMap=Ad(this.params)),this._paramMap},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=Ad(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return"Route(url:'"+this.url.map(function(n){return n.toString()}).join("/")+"', path:'"+(this.routeConfig?this.routeConfig.path:"")+"')"},n}(),Th=function(n){function t(t,e){var l=n.call(this,e)||this;return l.url=t,Lh(l,e),l}return Object(i.__extends)(t,n),t.prototype.toString=function(){return Ph(this._root)},t}(yh);function Lh(n,t){t.value._routerState=n,t.children.forEach(function(t){return Lh(n,t)})}function Ph(n){var t=n.children.length>0?" { "+n.children.map(Ph).join(", ")+" } ":"";return""+n.value+t}function Dh(n){if(n.snapshot){var t=n.snapshot,e=n._futureSnapshot;n.snapshot=e,Hd(t.queryParams,e.queryParams)||n.queryParams.next(e.queryParams),t.fragment!==e.fragment&&n.fragment.next(e.fragment),Hd(t.params,e.params)||n.params.next(e.params),function(n,t){if(n.length!==t.length)return!1;for(var e=0;e0&&Eh(e[0]))throw new Error("Root segment cannot have matrix parameters");var l=e.find(function(n){return"object"==typeof n&&null!=n&&n.outlets});if(l&&l!==Fd(e))throw new Error("{outlets:{}} has to be the last command")}return n.prototype.toRoot=function(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]},n}(),Ih=function(n,t,e){this.segmentGroup=n,this.processChildren=t,this.index=e};function Rh(n){return"object"==typeof n&&null!=n&&n.outlets?n.outlets[Pd]:""+n}function Hh(n,t,e){if(n||(n=new Gd([],{})),0===n.segments.length&&n.hasChildren())return Nh(n,t,e);var l=function(n,t,e){for(var l=0,r=t,i={match:!1,pathIndex:0,commandIndex:0};r=e.length)return i;var o=n.segments[r],s=Rh(e[l]),a=l0&&void 0===s)break;if(s&&a&&"object"==typeof a&&void 0===a.outlets){if(!Wh(s,a,o))return i;l+=2}else{if(!Wh(s,{},o))return i;l++}r++}return{match:!0,pathIndex:r,commandIndex:l}}(n,t,e),r=e.slice(l.commandIndex);if(l.match&&l.pathIndex=2?Object(pc.a)(n,t)(this):Object(pc.a)(n)(this)}).call(l,function(n,t){return n})},n.prototype.isDeactivating=function(){return 0!==this.canDeactivateChecks.length},n.prototype.isActivating=function(){return 0!==this.canActivateChecks.length},n.prototype.setupChildRouteGuards=function(n,t,e,l){var r=this,i=xh(t);n.children.forEach(function(n){r.setupRouteGuards(n,i[n.value.outlet],e,l.concat([n.value])),delete i[n.value.outlet]}),Bd(i,function(n,t){return r.deactivateRouteAndItsChildren(n,e.getContext(t))})},n.prototype.setupRouteGuards=function(n,t,e,l){var r=n.value,i=t?t.value:null,o=e?e.getContext(n.value.outlet):null;if(i&&r.routeConfig===i.routeConfig){var s=this.shouldRunGuardsAndResolvers(i,r,r.routeConfig.runGuardsAndResolvers);s?this.canActivateChecks.push(new zh(l)):(r.data=i.data,r._resolvedData=i._resolvedData),this.setupChildRouteGuards(n,t,r.component?o?o.children:null:e,l),s&&this.canDeactivateChecks.push(new Uh(o.outlet.component,i))}else i&&this.deactivateRouteAndItsChildren(t,o),this.canActivateChecks.push(new zh(l)),this.setupChildRouteGuards(n,null,r.component?o?o.children:null:e,l)},n.prototype.shouldRunGuardsAndResolvers=function(n,t,e){switch(e){case"always":return!0;case"paramsOrQueryParamsChange":return!Ah(n,t)||!Hd(n.queryParams,t.queryParams);case"paramsChange":default:return!Ah(n,t)}},n.prototype.deactivateRouteAndItsChildren=function(n,t){var e=this,l=xh(n),r=n.value;Bd(l,function(n,l){e.deactivateRouteAndItsChildren(n,r.component?t?t.children.getContext(l):null:t)}),this.canDeactivateChecks.push(new Uh(r.component&&t&&t.outlet&&t.outlet.isActivated?t.outlet.component:null,r))},n.prototype.runCanDeactivateChecks=function(){var n=this,t=xs(this.canDeactivateChecks),e=tl.call(t,function(t){return n.runCanDeactivate(t.component,t.route)});return dd.call(e,function(n){return!0===n})},n.prototype.runCanActivateChecks=function(){var n=this,t=xs(this.canActivateChecks),e=va.call(t,function(t){return Vd(xs([n.fireChildActivationStart(t.route.parent),n.fireActivationStart(t.route),n.runCanActivateChild(t.path),n.runCanActivate(t.route)]))});return dd.call(e,function(n){return!0===n})},n.prototype.fireActivationStart=function(n){return null!==n&&this.forwardEvent&&this.forwardEvent(new Td(n)),Object(Fe.a)(!0)},n.prototype.fireChildActivationStart=function(n){return null!==n&&this.forwardEvent&&this.forwardEvent(new Sd(n)),Object(Fe.a)(!0)},n.prototype.runCanActivate=function(n){var t=this,e=n.routeConfig?n.routeConfig.canActivate:null;return e&&0!==e.length?Vd(Pe.call(xs(e),function(e){var l,r=t.getToken(e,n);return l=Wd(r.canActivate?r.canActivate(n,t.future):r(n,t.future)),$e.call(l)})):Object(Fe.a)(!0)},n.prototype.runCanActivateChild=function(n){var t=this,e=n[n.length-1],l=n.slice(0,n.length-1).reverse().map(function(n){return t.extractCanActivateChild(n)}).filter(function(n){return null!==n});return Vd(Pe.call(xs(l),function(n){return Vd(Pe.call(xs(n.guards),function(l){var r,i=t.getToken(l,n.node);return r=Wd(i.canActivateChild?i.canActivateChild(e,t.future):i(e,t.future)),$e.call(r)}))}))},n.prototype.extractCanActivateChild=function(n){var t=n.routeConfig?n.routeConfig.canActivateChild:null;return t&&0!==t.length?{node:n,guards:t}:null},n.prototype.runCanDeactivate=function(n,t){var e=this,l=t&&t.routeConfig?t.routeConfig.canDeactivate:null;if(!l||0===l.length)return Object(Fe.a)(!0);var r=tl.call(xs(l),function(l){var r,i=e.getToken(l,t);return r=Wd(i.canDeactivate?i.canDeactivate(n,t,e.curr,e.future):i(n,t,e.curr,e.future)),$e.call(r)});return dd.call(r,function(n){return!0===n})},n.prototype.runResolve=function(n,t){return Pe.call(this.resolveNode(n._resolve,n),function(e){return n._resolvedData=e,n.data=Object(i.__assign)({},n.data,Sh(n,t).resolve),null})},n.prototype.resolveNode=function(n,t){var e=this,l=Object.keys(n);if(0===l.length)return Object(Fe.a)({});if(1===l.length){var r=l[0];return Pe.call(this.getResolver(n[r],t),function(n){return(t={})[r]=n,t;var t})}var i={},o=tl.call(xs(l),function(l){return Pe.call(e.getResolver(n[l],t),function(n){return i[l]=n,n})});return Pe.call(hd.call(o),function(){return i})},n.prototype.getResolver=function(n,t){var e=this.getToken(n,t);return Wd(e.resolve?e.resolve(t,this.future):e(t,this.future))},n.prototype.getToken=function(n,t){var e=function(n){if(!n)return null;for(var t=n.parent;t;t=t.parent){var e=t.routeConfig;if(e&&e._loadedConfig)return e._loadedConfig}return null}(t);return(e?e.module.injector:this.moduleInjector).get(n)},n}(),qh=function(){},Jh=function(){function n(n,t,e,l,r){this.rootComponentType=n,this.config=t,this.urlTree=e,this.url=l,this.paramsInheritanceStrategy=r}return n.prototype.recognize=function(){try{var n=Xh(this.urlTree.root,[],[],this.config).segmentGroup,t=this.processSegmentGroup(this.config,n,Pd),e=new Oh([],Object.freeze({}),Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,{},Pd,this.rootComponentType,null,this.urlTree.root,-1,{}),l=new wh(e,t),r=new Th(this.url,l);return this.inheritParamsAndData(r._root),Object(Fe.a)(r)}catch(n){return new o.a(function(t){return t.error(n)})}},n.prototype.inheritParamsAndData=function(n){var t=this,e=n.value,l=Sh(e,this.paramsInheritanceStrategy);e.params=Object.freeze(l.params),e.data=Object.freeze(l.data),n.children.forEach(function(n){return t.inheritParamsAndData(n)})},n.prototype.processSegmentGroup=function(n,t,e){return 0===t.segments.length&&t.hasChildren()?this.processChildren(n,t):this.processSegment(n,t,t.segments,e)},n.prototype.processChildren=function(n,t){var e,l=this,r=Qd(t,function(t,e){return l.processSegmentGroup(n,t,e)});return e={},r.forEach(function(n){var t=e[n.value.outlet];if(t){var l=t.url.map(function(n){return n.toString()}).join("/"),r=n.value.url.map(function(n){return n.toString()}).join("/");throw new Error("Two segments cannot have the same outlet name: '"+l+"' and '"+r+"'.")}e[n.value.outlet]=n.value}),r.sort(function(n,t){return n.value.outlet===Pd?-1:t.value.outlet===Pd?1:n.value.outlet.localeCompare(t.value.outlet)}),r},n.prototype.processSegment=function(n,t,e,l){for(var r=0,i=n;r0?Fd(e).parameters:{};r=new Oh(e,a,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,np(n),l,n.component,n,Qh(t),Kh(t)+e.length,tp(n))}else{var u=function(n,t,e){if(""===t.path){if("full"===t.pathMatch&&(n.hasChildren()||e.length>0))throw new qh;return{consumedSegments:[],lastChild:0,parameters:{}}}var l=(t.matcher||Ed)(e,n,t);if(!l)throw new qh;var r={};Bd(l.posParams,function(n,t){r[t]=n.path});var o=l.consumed.length>0?Object(i.__assign)({},r,l.consumed[l.consumed.length-1].parameters):r;return{consumedSegments:l.consumed,lastChild:l.consumed.length,parameters:o}}(t,n,e);o=u.consumedSegments,s=e.slice(u.lastChild),r=new Oh(o,u.parameters,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,np(n),l,n.component,n,Qh(t),Kh(t)+o.length,tp(n))}var c=function(n){return n.children?n.children:n.loadChildren?n._loadedConfig.routes:[]}(n),d=Xh(t,o,s,c),h=d.segmentGroup,p=d.slicedSegments;if(0===p.length&&h.hasChildren()){var f=this.processChildren(c,h);return[new wh(r,f)]}if(0===c.length&&0===p.length)return[new wh(r,[])];var _=this.processSegment(c,h,p,Pd);return[new wh(r,_)]},n}();function Qh(n){for(var t=n;t._sourceSegment;)t=t._sourceSegment;return t}function Kh(n){for(var t=n,e=t._segmentIndexShift?t._segmentIndexShift:0;t._sourceSegment;)e+=(t=t._sourceSegment)._segmentIndexShift?t._segmentIndexShift:0;return e-1}function Xh(n,t,e,l){if(e.length>0&&function(n,t,e){return l.some(function(e){return Zh(n,t,e)&&$h(e)!==Pd})}(n,e)){var r=new Gd(t,function(n,t,e,l){var r={};r[Pd]=l,l._sourceSegment=n,l._segmentIndexShift=t.length;for(var i=0,o=e;i0)||"full"!==e.pathMatch)&&""===e.path&&void 0===e.redirectTo}function $h(n){return n.outlet||Pd}function np(n){return n.data||{}}function tp(n){return n.resolve||{}}var ep=function(){},lp=function(){function n(){}return n.prototype.shouldDetach=function(n){return!1},n.prototype.store=function(n,t){},n.prototype.shouldAttach=function(n){return!1},n.prototype.retrieve=function(n){return null},n.prototype.shouldReuseRoute=function(n,t){return n.routeConfig===t.routeConfig},n}(),rp=new l.r("ROUTES"),ip=function(){function n(n,t,e,l){this.loader=n,this.compiler=t,this.onLoadStartListener=e,this.onLoadEndListener=l}return n.prototype.load=function(n,t){var e=this;this.onLoadStartListener&&this.onLoadStartListener(t);var l=this.loadModuleFactory(t.loadChildren);return Pe.call(l,function(l){e.onLoadEndListener&&e.onLoadEndListener(t);var r=l.create(n);return new Yd(Nd(r.injector.get(rp)),r)})},n.prototype.loadModuleFactory=function(n){var t=this;return"string"==typeof n?Ui(this.loader.load(n)):tl.call(Wd(n()),function(n){return n instanceof l.x?Object(Fe.a)(n):Ui(t.compiler.compileModuleAsync(n))})},n}(),op=function(){},sp=function(){function n(){}return n.prototype.shouldProcessUrl=function(n){return!0},n.prototype.extract=function(n){return n},n.prototype.merge=function(n,t){return n},n}();function ap(n){throw n}function up(n){return Object(Fe.a)(null)}var cp=function(){function n(n,t,e,r,i,o,s,a){var u=this;this.rootComponentType=n,this.urlSerializer=t,this.rootContexts=e,this.location=r,this.config=a,this.navigations=new Tl(null),this.navigationId=0,this.events=new yl.a,this.errorHandler=ap,this.navigated=!1,this.hooks={beforePreactivation:up,afterPreactivation:up},this.urlHandlingStrategy=new sp,this.routeReuseStrategy=new lp,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.ngModule=i.get(l.z),this.resetConfig(a),this.currentUrlTree=new Ud(new Gd([],{}),{},null),this.rawUrlTree=this.currentUrlTree,this.configLoader=new ip(o,s,function(n){return u.triggerEvent(new kd(n))},function(n){return u.triggerEvent(new Cd(n))}),this.routerState=kh(this.currentUrlTree,this.rootComponentType),this.processNavigations()}return n.prototype.resetRootComponentType=function(n){this.rootComponentType=n,this.routerState.root.component=this.rootComponentType},n.prototype.initialNavigation=function(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})},n.prototype.setUpLocationChangeListener=function(){var n=this;this.locationSubscription||(this.locationSubscription=this.location.subscribe(Zone.current.wrap(function(t){var e=n.urlSerializer.parse(t.url),l="popstate"===t.type?"popstate":"hashchange";setTimeout(function(){n.scheduleNavigation(e,l,{replaceUrl:!0})},0)})))},Object.defineProperty(n.prototype,"url",{get:function(){return this.serializeUrl(this.currentUrlTree)},enumerable:!0,configurable:!0}),n.prototype.triggerEvent=function(n){this.events.next(n)},n.prototype.resetConfig=function(n){jd(n),this.config=n,this.navigated=!1},n.prototype.ngOnDestroy=function(){this.dispose()},n.prototype.dispose=function(){this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=null)},n.prototype.createUrlTree=function(n,t){void 0===t&&(t={});var e=t.relativeTo,r=t.queryParams,o=t.fragment,s=t.preserveQueryParams,a=t.queryParamsHandling,u=t.preserveFragment;Object(l.Y)()&&s&&console&&console.warn&&console.warn("preserveQueryParams is deprecated, use queryParamsHandling instead.");var c=e||this.routerState.root,d=u?this.currentUrlTree.fragment:o,h=null;if(a)switch(a){case"merge":h=Object(i.__assign)({},this.currentUrlTree.queryParams,r);break;case"preserve":h=this.currentUrlTree.queryParams;break;default:h=r||null}else h=s?this.currentUrlTree.queryParams:r||null;return null!==h&&(h=this.removeEmptyProps(h)),function(n,t,e,l,r){if(0===e.length)return Yh(t.root,t.root,t,l,r);var i=function(n){if("string"==typeof n[0]&&1===n.length&&"/"===n[0])return new jh(!0,0,n);var t=0,e=!1,l=n.reduce(function(n,l,r){if("object"==typeof l&&null!=l){if(l.outlets){var i={};return Bd(l.outlets,function(n,t){i[t]="string"==typeof n?n.split("/"):n}),n.concat([{outlets:i}])}if(l.segmentPath)return n.concat([l.segmentPath])}return"string"!=typeof l?n.concat([l]):0===r?(l.split("/").forEach(function(l,r){0==r&&"."===l||(0==r&&""===l?e=!0:".."===l?t++:""!=l&&n.push(l))}),n):n.concat([l])},[]);return new jh(e,t,l)}(e);if(i.toRoot())return Yh(t.root,new Gd([],{}),t,l,r);var o=function(n,e,l){if(n.isAbsolute)return new Ih(t.root,!0,0);if(-1===l.snapshot._lastPathIndex)return new Ih(l.snapshot._urlSegment,!0,0);var r=Eh(n.commands[0])?0:1;return function(t,e,i){for(var o=l.snapshot._urlSegment,s=l.snapshot._lastPathIndex+r,a=n.numberOfDoubleDots;a>s;){if(a-=s,!(o=o.parent))throw new Error("Invalid number of '../'");s=o.segments.length}return new Ih(o,!1,s-a)}()}(i,0,n),s=o.processChildren?Nh(o.segmentGroup,o.index,i.commands):Hh(o.segmentGroup,o.index,i.commands);return Yh(o.segmentGroup,s,t,l,r)}(c,this.currentUrlTree,n,h,d)},n.prototype.navigateByUrl=function(n,t){void 0===t&&(t={skipLocationChange:!1});var e=n instanceof Ud?n:this.parseUrl(n),l=this.urlHandlingStrategy.merge(e,this.rawUrlTree);return this.scheduleNavigation(l,"imperative",t)},n.prototype.navigate=function(n,t){return void 0===t&&(t={skipLocationChange:!1}),function(n){for(var t=0;t0?(this.currentQrContent+=n+"amount="+this.form.get("coins").value,n="&"):this.invalidCoins=!0);var e=this.form.get("hours").value;e&&(Number.parseInt(e).toString()===e&&Number.parseInt(e)>0?(this.currentQrContent+=n+"hours="+this.form.get("hours").value,n="&"):this.invalidHours=!0);var l=this.form.get("note").value;l&&(this.currentQrContent+=n+"message="+encodeURIComponent(l)),this.updateQrCode()},n.prototype.updateQrCode=function(){this.qr.nativeElement.innerHTML="",new QRCode(this.qr.nativeElement,{text:this.currentQrContent,width:this.defaultQrConfig.size,height:this.defaultQrConfig.size,colorDark:this.defaultQrConfig.colordark,colorLight:this.defaultQrConfig.colorlight,useSVG:this.defaultQrConfig.usesvg,correctLevel:QRCode.CorrectLevel[this.defaultQrConfig.level]})},n}(),Jp=function(){function n(n,t,e){var l=this;this.walletService=n,this.route=t,this.dialog=e,t.queryParams.subscribe(function(n){l.wallets=null,l.lastRouteParams=n,l.walletService.startDataRefreshSubscription()}),n.all().subscribe(function(){return l.loadData()})}return n.prototype.ngOnDestroy=function(){this.outputsSubscription.unsubscribe()},n.prototype.loadData=function(){var n=this,t=this.lastRouteParams.addr;this.outputsSubscription=this.walletService.outputsWithWallets().subscribe(function(e){n.wallets=e.map(function(n){return Object.assign({},n)}).map(function(n){return n.addresses=n.addresses.filter(function(n){if(n.outputs.length>0)return!t||n.address===t}),n}).filter(function(n){return n.addresses.length>0})})},n.prototype.showQrCode=function(n,t){n.stopPropagation(),qp.openDialog(this.dialog,{address:t})},n}(),Qp=function(n){function t(t,e){void 0===t&&(t=0),void 0===e&&(e=sl),n.call(this),this.period=t,this.scheduler=e,(!el(t)||t<0)&&(this.period=0),e&&"function"==typeof e.schedule||(this.scheduler=sl)}return Object(i.__extends)(t,n),t.create=function(n,e){return void 0===n&&(n=0),void 0===e&&(e=sl),new t(n,e)},t.dispatch=function(n){var t=n.subscriber,e=n.period;t.next(n.index),t.closed||(n.index+=1,this.schedule(n,e))},t.prototype._subscribe=function(n){var e=this.period;n.add(this.scheduler.schedule(t.dispatch,e,{index:0,subscriber:n,period:e}))},t}(o.a),Kp=function(){function n(n){this.blockchainService=n,this.subscriptionsGroup=[]}return n.prototype.ngOnInit=function(){var n=this;this.subscriptionsGroup.push(Qp.create(5e3).switchMap(function(){return n.blockchainService.lastBlock()}).subscribe(function(t){return n.block=t})),this.subscriptionsGroup.push(Qp.create(5e3).switchMap(function(){return n.blockchainService.coinSupply()}).subscribe(function(t){return n.coinSupply=t}))},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()})},n}(),Xp=function(){function n(n,t){this.data=n,this.dialogRef=t}return n.prototype.ngOnDestroy=function(){this.data.seed=null},n}(),Zp=function(){function n(n,t,e,l){var r=this;this.data=n,this.dialogRef=t,this.msgBarService=e,this.translateService=l,this.passwordSubmit=new yl.a,this.working=!1,this.subscriptions=[],this.data=Object.assign({confirm:!1,description:null,warning:!1,title:null,wallet:null},n||{}),this.translateService.get(["errors.incorrect-password","errors.api-disabled","errors.no-wallet"]).subscribe(function(n){r.errors=n})}return n.prototype.ngOnInit=function(){var n=this;this.form=new Fo({},this.validateForm.bind(this)),this.form.addControl("password",new No("")),this.form.addControl("confirm_password",new No("")),["password","confirm_password"].forEach(function(t){n.subscriptions.push(n.form.get(t).valueChanges.subscribe(function(){2===n.button.state&&n.button.resetState()}))}),this.data.confirm?this.form.get("confirm_password").enable():this.form.get("confirm_password").disable(),this.data.description&&this.dialogRef.updateSize("400px")},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.form.get("password").setValue(""),this.form.get("confirm_password").setValue(""),this.passwordSubmit.complete(),this.subscriptions.forEach(function(n){return n.unsubscribe()})},n.prototype.proceed=function(){this.form.valid&&!this.button.isLoading()&&(this.msgBarService.hide(),this.button.setLoading(),this.working=!0,this.passwordSubmit.next({password:this.form.get("password").value,close:this.close.bind(this),error:this.error.bind(this)}))},n.prototype.validateForm=function(){if(this.form&&this.form.get("password")&&this.form.get("confirm_password")){if(0===this.form.get("password").value.length)return{Required:!0};if(this.data.confirm&&this.form.get("password").value!==this.form.get("confirm_password").value)return{NotEqual:!0}}return null},n.prototype.close=function(){this.dialogRef.close()},n.prototype.error=function(n){if("object"==typeof n)if(n.status)switch(n.status){case 400:n=Oc(n._body);break;case 401:n=this.errors["errors.incorrect-password"];break;case 403:n=this.errors["errors.api-disabled"];break;case 404:n=this.errors["errors.no-wallet"];break;default:n=this.errors["errors.error-decrypting"]}else n=this.errors["errors.error-decrypting"];this.msgBarService.showError(n=n||this.errors["errors.error-decrypting"]),this.button.resetState(),this.working=!1},n}(),$p=function(){function n(n,t){this.walletService=n,this.dialog=t,this.wallets=[]}return n.prototype.ngOnInit=function(){var n=this;this.walletService.folder().subscribe(function(t){return n.folder=t}),this.walletSubscription=this.walletService.all().subscribe(function(t){n.wallets=t})},n.prototype.ngOnDestroy=function(){this.walletSubscription.unsubscribe()},Object.defineProperty(n.prototype,"onlyEncrypted",{get:function(){return this.wallets.filter(function(n){return n.encrypted})},enumerable:!0,configurable:!0}),n.prototype.showSeed=function(n){var t=this,e=new oa;e.data={wallet:n},this.dialog.open(Zp,e).componentInstance.passwordSubmit.subscribe(function(e){t.walletService.getWalletSeed(n,e.password).subscribe(function(n){e.close();var l=new oa;l.width="566px",l.data={seed:n},t.dialog.open(Xp,l)},function(n){return e.error(n)})})},n}(),nf=function(){function n(n,t){this.apiService=n,this.ngZone=t,this.noConnections=!1,this.automaticPeers=new Tl([]),this.loadData()}return n.prototype.automatic=function(){return this.automaticPeers.asObservable()},n.prototype.retrieveDefaultConnections=function(){return this.apiService.get("network/defaultConnections").map(function(n){return n.map(function(n,t){return{id:t+1,address:n,listen_port:6e3}})})},n.prototype.loadData=function(){var n=this;this.retrieveConnections().subscribe(function(t){return n.automaticPeers.next(t)}),this.ngZone.runOutsideAngular(function(){Qp.create(5e3).flatMap(function(){return n.retrieveConnections()}).subscribe(function(t){return n.ngZone.run(function(){n.automaticPeers.next(t)})})})},n.prototype.retrieveConnections=function(){var n=this;return this.apiService.get("network/connections").map(function(t){return null===t.connections||0===t.connections.length?(n.noConnections=!0,[]):(n.noConnections=!1,t.connections.sort(function(n,t){return n.id-t.id}))})},n}(),tf=function(){function n(n){this.networkService=n}return n.prototype.ngOnInit=function(){var n=this;this.subscription=this.networkService.retrieveDefaultConnections().subscribe(function(t){n.subscription=n.networkService.automatic().subscribe(function(e){n.peers=e.map(function(n){return n.source=t.find(function(t){return t.address===n.address})?"default":"exchange",n}).sort(function(n,t){return n.address.localeCompare(t.address)})})})},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n}(),ef=function(){function n(n,t){this.httpClient=n,this.walletService=t,this.configSubject=new Tl(null),this.purchaseOrders=new Tl([]),this.purchaseUrl=r.tellerUrl,this.getConfig()}return n.prototype.all=function(){return this.purchaseOrders.asObservable()},n.prototype.config=function(){return this.configSubject.asObservable()},n.prototype.getConfig=function(){var n=this;return this.get("config").map(function(n){return{enabled:!0,sky_btc_exchange_rate:parseFloat(n.sky_btc_exchange_rate)}}).subscribe(function(t){return n.configSubject.next(t)})},n.prototype.generate=function(n){var t=this;return this.walletService.addAddress(n,1).flatMap(function(e){return t.post("bind",{skyaddr:e[0].address,coin_type:"BTC"}).map(function(t){return{coin_type:t.coin_type,deposit_address:t.deposit_address,filename:n.filename,recipient_address:e[0].address,status:"waiting_deposit"}})})},n.prototype.scan=function(n){return this.get("status?skyaddr="+n).map(function(n){if(!n.statuses||n.statuses.length>1)throw new Error("too many purchase orders found");return n.statuses[0]})},n.prototype.get=function(n){return this.httpClient.get(this.purchaseUrl+n)},n.prototype.post=function(n,t){return void 0===t&&(t={}),this.httpClient.post(this.purchaseUrl+n,t)},n}(),lf=function(){function n(n,t,e,l){this.formBuilder=n,this.purchaseService=t,this.msgBarService=e,this.walletService=l,this.subscriptionsGroup=[]}return n.prototype.ngOnInit=function(){this.initForm(),this.loadData()},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()})},n.prototype.checkStatus=function(){var n=this;this.button.setLoading(),this.purchaseService.scan(this.order.recipient_address).subscribe(function(t){n.button.setSuccess(),n.order.status=t.status},function(t){return n.button.setError(t)})},n.prototype.removeOrder=function(){window.localStorage.removeItem("purchaseOrder"),this.order=null},n.prototype.initForm=function(){var n=this;this.form=this.formBuilder.group({wallet:["",Xi.required]}),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){var e=n.wallets.find(function(n){return n.filename===t});console.log("changing wallet value",t),n.purchaseService.generate(e).subscribe(function(t){return n.saveData(t)},function(t){return n.msgBarService.showError(t.toString())})}))},n.prototype.loadConfig=function(){var n=this;this.purchaseService.config().filter(function(n){return!!n&&!!n.sky_btc_exchange_rate}).first().subscribe(function(t){return n.config=t})},n.prototype.loadData=function(){var n=this;this.loadConfig(),this.loadOrder(),this.subscriptionsGroup.push(this.walletService.all().subscribe(function(t){n.wallets=t,n.order&&n.form.get("wallet").setValue(n.order.filename,{emitEvent:!1})}))},n.prototype.loadOrder=function(){var n=JSON.parse(window.localStorage.getItem("purchaseOrder"));n&&(this.order=n,this.updateOrder())},n.prototype.saveData=function(n){this.order=n,window.localStorage.setItem("purchaseOrder",JSON.stringify(n))},n.prototype.updateOrder=function(){var n=this;this.purchaseService.scan(this.order.recipient_address).first().subscribe(function(t){return n.order.status=t.status},function(n){return console.log(n)})},n}(),rf=function(){function n(n,t){this.http=n,this.ngZone=t,this.PRICE_API_ID="sky-skycoin",this.price=new Tl(null),this.updatePeriod=6e5,this.startTimer()}return n.prototype.startTimer=function(n){var t=this;void 0===n&&(n=0),this.timerSubscriptions&&this.timerSubscriptions.forEach(function(n){return n.unsubscribe()}),this.timerSubscriptions=[],this.ngZone.runOutsideAngular(function(){t.timerSubscriptions.push(o.a.timer(t.updatePeriod,t.updatePeriod).subscribe(function(){t.ngZone.run(function(){return t.lastPriceSubscription?null:t.loadPrice()})}))}),this.timerSubscriptions.push(o.a.of(1).delay(n).subscribe(function(){t.ngZone.run(function(){return t.loadPrice()})}))},n.prototype.loadPrice=function(){var n=this;this.PRICE_API_ID&&(this.lastPriceSubscription&&this.lastPriceSubscription.unsubscribe(),this.lastPriceSubscription=this.http.get("https://api.coinpaprika.com/v1/tickers/"+this.PRICE_API_ID+"?quotes=USD").subscribe(function(t){n.lastPriceSubscription=null,n.price.next(t.quotes.USD.price)},function(){return n.startTimer(3e4)}))},n}(),of=function(){function n(n,t){this.transaction=n,this.dialogRef=t}return n.prototype.closePopup=function(){this.dialogRef.close()},n}(),sf=function(){function n(n,t,e,l,r){var i=this;this.dialog=n,this.priceService=t,this.walletService=e,this.formBuilder=l,this.transactionsLoaded=!1,this.form=this.formBuilder.group({filter:[[]]}),this.routeSubscription=r.queryParams.subscribe(function(n){i.requestedAddress=n.addr?n.addr:"",i.showRequestedAddress()}),this.walletsSubscription=e.all().delay(1).flatMap(function(n){if(i.wallets)return i.walletService.transactions().first();i.wallets=[];var t=!1;return n.forEach(function(n){n.coins&&n.hours&&!t?(i.wallets.push({label:n.label,coins:n.coins.decimalPlaces(6).toString(),hours:n.hours.decimalPlaces(0).toString(),addresses:[],allAddressesSelected:!1}),n.addresses.forEach(function(n){n.coins&&n.hours&&!t?i.wallets[i.wallets.length-1].addresses.push({address:n.address,coins:n.coins.decimalPlaces(6).toString(),hours:n.hours.decimalPlaces(0).toString(),showingWholeWallet:!1}):t=!0})):t=!0}),t?(i.wallets=null,o.a.of(null)):i.walletService.transactions().first()}).subscribe(function(n){n&&(i.allTransactions=n,i.transactionsLoaded=!0,i.showRequestedAddress(),i.filterTransactions())})}return n.prototype.ngOnInit=function(){var n=this;this.priceSubscription=this.priceService.price.subscribe(function(t){return n.price=t}),this.filterSubscription=this.form.get("filter").valueChanges.subscribe(function(){return n.filterTransactions()})},n.prototype.ngOnDestroy=function(){this.priceSubscription.unsubscribe(),this.filterSubscription.unsubscribe(),this.walletsSubscription.unsubscribe(),this.routeSubscription.unsubscribe()},n.prototype.showTransaction=function(n){var t=new oa;t.width="800px",t.data=n,this.dialog.open(of,t)},n.prototype.showQrCode=function(n,t){n.stopPropagation(),qp.openDialog(this.dialog,{address:t})},n.prototype.removeFilters=function(){this.form.get("filter").setValue([])},n.prototype.filterTransactions=function(){var n=this.form.get("filter").value;if(this.wallets.forEach(function(n){n.allAddressesSelected=!1,n.addresses.forEach(function(n){return n.showingWholeWallet=!1})}),0===n.length)this.transactions=this.allTransactions;else{var t=new Map;n.forEach(function(n){n.addresses?(n.addresses.forEach(function(n){return t.set(n.address,!0)}),n.allAddressesSelected=!0,n.addresses.forEach(function(n){return n.showingWholeWallet=!0})):t.set(n.address,!0)}),this.transactions=this.allTransactions.filter(function(n){return n.inputs.some(function(n){return t.has(n.owner)})||n.outputs.some(function(n){return t.has(n.dst)})})}},n.prototype.showRequestedAddress=function(){var n,t=this;this.transactionsLoaded&&this.wallets&&0!==this.wallets.length&&null!==this.requestedAddress&&void 0!==this.requestedAddress&&(""!==this.requestedAddress?(this.wallets.forEach(function(e){var l=e.addresses.find(function(n){return n.address===t.requestedAddress});l&&(n=l)}),n&&this.form.get("filter").setValue([n])):this.form.get("filter").setValue([]),this.requestedAddress=null)},n}(),af=function(){function n(n,t){this.walletService=n,this.router=t}return n.prototype.canActivate=function(n,t){var e=this;return new Promise(function(n){e.walletService.all().first().subscribe(function(t){return 0===t.length?(e.router.navigate(["/wizard"]),n(!1)):n(!0)})})},n}(),uf=function(){function n(n){this.formBuilder=n,this.onPasswordCreated=new l.o,this.onBack=new l.o}return n.prototype.ngOnInit=function(){this.initEncryptForm()},n.prototype.initEncryptForm=function(){this.form=this.formBuilder.group({password:new No("",Xi.compose([Xi.required,Xi.minLength(2)])),confirm:new No("",Xi.compose([Xi.required,Xi.minLength(2)]))},{validator:this.passwordMatchValidator.bind(this)})},n.prototype.setEncrypt=function(n){n.checked?this.form.enable():this.form.disable()},n.prototype.emitCreatedPassword=function(){this.form.enabled&&!this.form.valid||this.button.isLoading()||(this.button.setLoading(),this.onPasswordCreated.emit(this.form.enabled?this.form.get("password").value:null))},n.prototype.emitBack=function(){this.onBack.emit()},n.prototype.resetButton=function(){this.button.resetState()},Object.defineProperty(n.prototype,"isWorking",{get:function(){return this.button.isLoading()},enumerable:!0,configurable:!0}),n.prototype.passwordMatchValidator=function(n){return n.get("password").value===n.get("confirm").value?null:{mismatch:!0}},n}(),cf=function(){function n(n,t,e,l,r){this.router=n,this.walletService=t,this.languageService=e,this.dialog=l,this.msgBarService=r,this.step=1}return n.prototype.ngOnInit=function(){var n=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return n.language=t})},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n.prototype.onLabelAndSeedCreated=function(n){this.formData=n,this.step=2},n.prototype.onPasswordCreated=function(n){this.password=n,this.createWallet()},n.prototype.onBack=function(){this.step=1},n.prototype.changelanguage=function(){var n=this;zc(this.dialog).subscribe(function(t){t&&n.languageService.changeLanguage(t)})},Object.defineProperty(n.prototype,"fill",{get:function(){return this.formData},enumerable:!0,configurable:!0}),n.prototype.createWallet=function(){var n=this;this.walletService.create(this.formData.label,this.formData.seed,100,this.password).subscribe(function(){n.router.navigate(["/wallets"])},function(t){n.msgBarService.showError(t),n.encryptForm.resetButton()})},n}(),df=function(){function n(n,t,e,l,r){var i=this;this.formBuilder=n,this.route=t,this.router=e,this.walletService=l,this.msgBarService=r,this.done=!1,this.hideBarWhenClosing=!0,this.initForm(""),this.subscription=o.a.zip(this.route.params,this.walletService.all(),function(n,t){var e=t.find(function(t){return t.filename===n.id});e?(i.wallet=e,i.initForm(e.label)):setTimeout(function(){return i.router.navigate([""],{skipLocationChange:!0})})}).subscribe()}return n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),this.hideBarWhenClosing&&this.msgBarService.hide()},n.prototype.initForm=function(n){var t=[];t.push(this.passwordMatchValidator.bind(this)),this.form=new Fo({},t),this.form.addControl("wallet",new No(n)),this.form.addControl("seed",new No("",[Xi.required])),this.form.addControl("password",new No),this.form.addControl("confirm",new No)},n.prototype.reset=function(){var n=this;!this.form.valid||this.resetButton.isLoading()||this.done||(this.msgBarService.hide(),this.resetButton.setLoading(),this.walletService.resetPassword(this.wallet,this.form.value.seed,""!==this.form.value.password?this.form.value.password:null).subscribe(function(){n.resetButton.setSuccess(),n.resetButton.setDisabled(),n.done=!0,n.hideBarWhenClosing=!1,n.msgBarService.showDone("reset.done"),setTimeout(function(){n.router.navigate([""])},2e3)},function(t){n.resetButton.resetState(),n.msgBarService.showError(t)}))},n.prototype.passwordMatchValidator=function(){return this.form&&this.form.get("password")&&this.form.get("confirm")&&this.form.get("password").value===this.form.get("confirm").value?null:{NotEqual:!0}},n}();o.a.prototype.repeatWhen=function(n){return function(n){return function(t){return t.lift(new fc(n))}}(n)(this)};var hf=this&&this.__assign||Object.assign||function(n){for(var t,e=1,l=arguments.length;e-1},n.prototype.post=function(n,t,e){var l=this;return this.http.post(this.buildUrl(n),t,{responseType:"json",headers:new Ma(hf({"api-key":this.API_KEY,Accept:"application/json"},e))}).catch(function(n){return l.apiService.processConnectionError(n)})},n.prototype.buildUrl=function(n){return this.TEST_MODE&&"trading_pairs"!==n?this.API_ENDPOINT+"sandbox/"+n:this.API_ENDPOINT+"/"+n},n.prototype.storeOrder=function(n,t){var e=this;return this.history().catch(function(n){try{if(n._body){var t=JSON.parse(n._body);if(t&&t.error&&404===t.error.code)return o.a.of([])}}catch(n){}return o.a.throw(n)}).flatMap(function(l){return e.storeOrderEntry(l,n,t)})},n.prototype.storeOrderEntry=function(n,t,e){var l={id:t.id,pair:t.pair,fromAmount:t.fromAmount,toAmount:t.toAmount,address:t.toAddress,timestamp:zp().unix(),price:e};n.push(l);var r=JSON.stringify(n);return n.pop(),this.storageService.store(ec.CLIENT,this.STORAGE_KEY,r).do(function(){return n.push(l)})},n}(),ff=function(){function n(n,t,e){this.dialogRef=n,this.blockchainService=t,this.exchangeService=e}return n.prototype.ngOnInit=function(){var n=this;this.exchangeService.history().subscribe(function(t){return n.orders=t.reverse()},function(){return n.orders=[]})},n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.select=function(n){this.dialogRef.close(n)},n.prototype.getFromCoin=function(n){return n.split("/")[0].toUpperCase()},n.prototype.getToCoin=function(n){return n.split("/")[1].toUpperCase()},n}(),_f=function(){function n(n,t){this.exchangeService=n,this.dialog=t,this.hasHistory=!1,this.loading=!0}return n.prototype.ngOnInit=function(){var n=this;this.lastViewedSubscription=this.exchangeService.lastViewedOrderLoaded.subscribe(function(t){if(t){var e=n.exchangeService.lastViewedOrder;e&&(n.currentOrderDetails=e),setTimeout(function(){return n.lastViewedSubscription.unsubscribe()}),n.loading=!1}}),this.historySubscription=this.exchangeService.history().subscribe(function(){return n.hasHistory=!0})},n.prototype.ngOnDestroy=function(){this.lastViewedSubscription.unsubscribe(),this.historySubscription.unsubscribe()},n.prototype.showStatus=function(n){this.currentOrderDetails=n,this.hasHistory=!0},n.prototype.showHistory=function(n){var t=this;n.preventDefault();var e=new oa;e.width="566px",e.autoFocus=!1,this.dialog.open(ff,e).afterClosed().subscribe(function(n){n&&(t.currentOrderDetails=n)})},n.prototype.goBack=function(){this.currentOrderDetails=null,this.exchangeService.lastViewedOrder=null},n}(),mf=function(){};o.a.prototype.takeWhile=function(n){return function(n){return function(t){return t.lift(new vc(n))}}(n)(this)};var gf=function(){function n(n,t){this.apiService=n,this.http=t,this.fullCoinName=" ",this.coinName=" ",this.hoursName=" ",this.hoursNameSingular=" ",this.explorerUrl=" ",this.burnRateInternal=new Ee.a(.5),this.updateAvailableInternal=!1,this.lastestVersionInternal=""}return Object.defineProperty(n.prototype,"burnRate",{get:function(){return this.burnRateInternal},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"updateAvailable",{get:function(){return this.updateAvailableInternal},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"lastestVersion",{get:function(){return this.lastestVersionInternal},enumerable:!0,configurable:!0}),n.prototype.testBackend=function(){var n=this;this.apiService.get("health").subscribe(function(t){n.version=t.version,n.detectUpdateAvailable(),n.burnRateInternal=new Ee.a(t.user_verify_transaction.burn_factor),n.fullCoinName=t.fiber.display_name,n.coinName=t.fiber.ticker,n.hoursName=t.fiber.coin_hours_display_name,n.hoursNameSingular=t.fiber.coin_hours_display_name_singular,n.explorerUrl=t.fiber.explorer_url,n.explorerUrl.endsWith("/")&&(n.explorerUrl=n.explorerUrl.substr(0,n.explorerUrl.length-1)),t.csrf_enabled||(n.error=3)},function(){return n.error=2})},n.prototype.detectUpdateAvailable=function(){var n=this;Ll.urlForVersionChecking&&this.http.get(Ll.urlForVersionChecking).retryWhen(function(n){return n.delay(3e4)}).subscribe(function(t){n.lastestVersionInternal=t.text().trim(),n.lastestVersionInternal.startsWith("v")&&(n.lastestVersionInternal=n.lastestVersionInternal.substr(1)),n.updateAvailableInternal=function(t,e){for(var l=n.lastestVersionInternal.split("."),r=t.split("-"),i=r[0].split("."),o=0;o<3;o++){var s=Number(l[o]),a=Number(i[o]);if(s>a)return!0;if(s0&&t<10?this.addNumber(t.toString()):8===n.keyCode?this.removeNumber():13===n.keyCode&&this.sendPin()},t.prototype.addNumber=function(n){var t=this.form.value.pin;t.length<8&&this.form.get("pin").setValue(t+n)},t.prototype.removeNumber=function(){var n=this.form.value.pin;this.form.get("pin").setValue(n.substring(0,n.length-1))},t.prototype.sendPin=function(){this.form.valid&&this.dialogRef.close(this.form.value.pin)},t}(Kc),vf=function(n){function t(t,e,l){var r=n.call(this,l,e)||this;return r.data=t,r.dialogRef=e,r}return Object(i.__extends)(t,n),t}(Kc),wf=function(){function n(n,t,e,l,r,i,o,s,a){this.appService=n,this.languageService=t,this.bip38WordList=o,this.dialog=s,this.msgBarService=a,r.requestPinComponent=bf,i.requestWordComponent=Hc,l.signTransactionConfirmationComponent=vf,e.initialLoadFailed.subscribe(function(n){n&&window.location.assign("assets/error-alert/index.html?2")})}return n.prototype.ngOnInit=function(){var n=this;this.appService.testBackend(),this.languageService.loadLanguageSettings();var t=this.languageService.selectedLanguageLoaded.subscribe(function(e){e||zc(n.dialog,!0).subscribe(function(t){t&&n.languageService.changeLanguage(t)}),t.unsubscribe(),n.msgBarService.msgBarComponent=n.msgBar})},n}(),xf=l._7({encapsulation:2,styles:[".mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);display:block;padding:24px;border-radius:2px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%}@media screen and (-ms-high-contrast:active){.mat-dialog-container{outline:solid 1px}}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch;-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:12px 0;display:flex;flex-wrap:wrap}.mat-dialog-actions:last-child{margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button+.mat-button,.mat-dialog-actions .mat-button+.mat-raised-button,.mat-dialog-actions .mat-raised-button+.mat-button,.mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-button+.mat-raised-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:0;margin-right:8px}"],data:{animation:[{type:7,name:"slideDialog",definitions:[{type:0,name:"enter",styles:{type:6,styles:{transform:"none",opacity:1},offset:null},options:void 0},{type:0,name:"void",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0) scale(0.9)",opacity:0},offset:null},options:void 0},{type:0,name:"exit",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0)",opacity:0},offset:null},options:void 0},{type:1,expr:"* => *",animation:{type:4,styles:null,timings:"400ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null}],options:{}}]}});function Mf(n){return l._33(0,[(n()(),l._4(0,null,null,0))],null,null)}function kf(n){return l._33(0,[l._29(402653184,1,{_portalOutlet:0}),(n()(),l._4(16777216,null,null,1,null,Mf)),l._8(2,212992,[[1,4]],0,oi,[l.j,l.R],{portal:[0,"portal"]},null)],function(n,t){n(t,2,0,"")},null)}var Cf=l._5("mat-dialog-container",aa,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-dialog-container",[["class","mat-dialog-container"],["tabindex","-1"]],[[1,"role",0],[1,"aria-labelledby",0],[1,"aria-label",0],[1,"aria-describedby",0],[40,"@slideDialog",0]],[["component","@slideDialog.start"],["component","@slideDialog.done"]],function(n,t,e){var r=!0;return"component:@slideDialog.start"===t&&(r=!1!==l._22(n,1)._onAnimationStart(e)&&r),"component:@slideDialog.done"===t&&(r=!1!==l._22(n,1)._onAnimationDone(e)&&r),r},kf,xf)),l._8(1,49152,null,0,aa,[l.l,kr,l.h,[2,sn]],null,null)],null,function(n,t){n(t,0,0,null==l._22(t,1)._config?null:l._22(t,1)._config.role,null!=l._22(t,1)._config&&l._22(t,1)._config.ariaLabel?null:l._22(t,1)._ariaLabelledBy,null==l._22(t,1)._config?null:l._22(t,1)._config.ariaLabel,(null==l._22(t,1)._config?null:l._22(t,1)._config.ariaDescribedBy)||null,l._22(t,1)._state)})},{},{},[]),Sf=l._7({encapsulation:2,styles:[".mat-tooltip-panel{pointer-events:none!important}.mat-tooltip{color:#fff;border-radius:2px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px}@media screen and (-ms-high-contrast:active){.mat-tooltip{outline:solid 1px}}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"initial, void, hidden",styles:{type:6,styles:{transform:"scale(0)"},offset:null},options:void 0},{type:0,name:"visible",styles:{type:6,styles:{transform:"scale(1)"},offset:null},options:void 0},{type:1,expr:"* => visible",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.0, 0.0, 0.2, 1)"},options:null},{type:1,expr:"* => hidden",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.4, 0.0, 1, 1)"},options:null}],options:{}}]}});function Of(n){return l._33(2,[(n()(),l._9(0,0,null,null,2,"div",[["class","mat-tooltip"]],[[4,"transform-origin",null],[24,"@state",0]],[[null,"@state.start"],[null,"@state.done"]],function(n,t,e){var l=!0,r=n.component;return"@state.start"===t&&(l=!1!==r._animationStart()&&l),"@state.done"===t&&(l=!1!==r._animationDone(e)&&l),l},null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(n()(),l._31(2,null,["",""]))],function(n,t){n(t,1,0,"mat-tooltip",t.component.tooltipClass)},function(n,t){var e=t.component;n(t,0,0,e._transformOrigin,e._visibility),n(t,2,0,e.message)})}var Tf=l._5("mat-tooltip-component",Ru,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-tooltip-component",[["aria-hidden","true"]],[[4,"zoom",null]],[["body","click"]],function(n,t,e){var r=!0;return"body:click"===t&&(r=!1!==l._22(n,1)._handleBodyInteraction()&&r),r},Of,Sf)),l._8(1,49152,null,0,Ru,[l.h],null,null)],null,function(n,t){n(t,0,0,"visible"===l._22(t,1)._visibility?1:null)})},{},{},[]),Lf=l._7({encapsulation:2,styles:[".mat-progress-spinner{display:block;position:relative}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate]{animation:mat-progress-spinner-linear-rotate 2s linear infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4s;animation-timing-function:cubic-bezier(.35,0,.25,1);animation-iteration-count:infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate]{animation:mat-progress-spinner-stroke-rotate-fallback 10s cubic-bezier(.87,.03,.33,1) infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.60617px;transform:rotate(0)}12.5%{stroke-dashoffset:56.54867px;transform:rotate(0)}12.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(72.5deg)}25.1%{stroke-dashoffset:268.60617px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.54867px;transform:rotate(270deg)}37.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(161.5deg)}50.01%{stroke-dashoffset:268.60617px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.54867px;transform:rotate(180deg)}62.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(251.5deg)}75.01%{stroke-dashoffset:268.60617px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.54867px;transform:rotate(90deg)}87.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}"],data:{}});function Pf(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,":svg:svg",[["focusable","false"],["preserveAspectRatio","xMidYMid meet"]],[[4,"width","px"],[4,"height","px"],[1,"viewBox",0]],null,null,null,null)),(n()(),l._9(1,0,null,null,0,":svg:circle",[["cx","50%"],["cy","50%"]],[[1,"r",0],[4,"animation-name",null],[4,"stroke-dashoffset","px"],[4,"stroke-dasharray","px"],[4,"stroke-width","%"]],null,null,null,null))],null,function(n,t){var e=t.component;n(t,0,0,e._elementSize,e._elementSize,e._viewBox),n(t,1,0,e._circleRadius,"mat-progress-spinner-stroke-rotate-"+e.diameter,e._strokeDashOffset,e._strokeCircumference,e._circleStrokeWidth)})}var Df=l._7({encapsulation:2,styles:[".mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:2px;outline:0}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:left top}.mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:right top}.mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:right top}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:left top}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.ng-animating{pointer-events:none}@media screen and (-ms-high-contrast:active){.mat-menu-panel{outline:solid 1px}}.mat-menu-content{padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item .mat-icon{vertical-align:middle}.mat-menu-item-submenu-trigger{padding-right:32px}.mat-menu-item-submenu-trigger::after{width:0;height:0;border-style:solid;border-width:5px 0 5px 5px;border-color:transparent transparent transparent currentColor;content:'';display:inline-block;position:absolute;top:50%;right:16px;transform:translateY(-50%)}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:8px;padding-left:32px}[dir=rtl] .mat-menu-item-submenu-trigger::after{right:auto;left:16px;transform:rotateY(180deg) translateY(-50%)}button.mat-menu-item{width:100%}.mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}"],data:{animation:[{type:7,name:"transformMenu",definitions:[{type:0,name:"void",styles:{type:6,styles:{opacity:0,transform:"scale(0.01, 0.01)"},offset:null},options:void 0},{type:0,name:"enter-start",styles:{type:6,styles:{opacity:1,transform:"scale(1, 0.5)"},offset:null},options:void 0},{type:0,name:"enter",styles:{type:6,styles:{transform:"scale(1, 1)"},offset:null},options:void 0},{type:1,expr:"void => enter-start",animation:{type:4,styles:null,timings:"100ms linear"},options:null},{type:1,expr:"enter-start => enter",animation:{type:4,styles:null,timings:"300ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null},{type:1,expr:"* => void",animation:{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"150ms 50ms linear"},options:null}],options:{}},{type:7,name:"fadeInItems",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function Af(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[["class","mat-menu-panel"],["role","menu"],["tabindex","-1"]],[[24,"@transformMenu",0]],[[null,"keydown"],[null,"click"],[null,"@transformMenu.done"]],function(n,t,e){var l=!0,r=n.component;return"keydown"===t&&(l=!1!==r._handleKeydown(e)&&l),"click"===t&&(l=!1!==r.closed.emit("click")&&l),"@transformMenu.done"===t&&(l=!1!==r._onAnimationDone(e)&&l),l},null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-menu-content"]],[[24,"@fadeInItems",0]],null,null,null,null)),l._21(null,0)],function(n,t){n(t,1,0,"mat-menu-panel",t.component._classList)},function(n,t){n(t,0,0,t.component._panelAnimationState),n(t,2,0,"showing")})}function Ef(n){return l._33(2,[l._29(402653184,1,{templateRef:0}),(n()(),l._4(0,[[1,2]],null,0,null,Af))],null,null)}var Yf=l._7({encapsulation:2,styles:[],data:{}});function jf(n){return l._33(2,[l._21(null,0),(n()(),l._9(1,0,null,null,1,"div",[["class","mat-menu-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(2,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(n,t){var e=t.component;n(t,2,0,e.disableRipple||e.disabled,e._getHostElement())},function(n,t){n(t,1,0,l._22(t,2).unbounded)})}var If=function(){function n(n,t,e){this.decimalPipe=n,this.blockchainService=t,this.appService=e}return n.prototype.transform=function(n,t,e){void 0===t&&(t=!0),void 0===e&&(e="");var l="";return"last"!==e&&(l=this.decimalPipe.transform(n,t?"1.0-"+this.blockchainService.currentMaxDecimals:"1.0-0"),"first"!==e&&(l+=" ")),"first"!==e&&(l+=t?this.appService.coinName:1===Number(n)||-1===Number(n)?this.appService.hoursNameSingular:this.appService.hoursName),l},n}(),Rf=l._7({encapsulation:2,styles:[".mat-icon{background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}"],data:{}});function Hf(n){return l._33(2,[l._21(null,0)],null,null)}var Nf=function(){function n(n,t,e){this.data=n,this.dialogRef=t,this.msgBarService=e}return n.prototype.ngOnInit=function(){this.form=new Fo({}),this.form.addControl("quantity",new No(1,[this.validateQuantity]))},n.prototype.ngOnDestroy=function(){this.msgBarService.hide()},n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.continue=function(){var n=this;this.button.isLoading()||(this.msgBarService.hide(),this.button.setLoading(),this.data(this.form.value.quantity,function(t,e){void 0===e&&(e=!1),n.button.resetState(),e?n.msgBarService.showError("wallet.add-addresses.error"):t&&n.closePopup()}))},n.prototype.validateQuantity=function(n){return n.value<1||n.value>100||Number(n.value)!==Math.round(Number(n.value))?{invalid:!0}:null},n}(),Ff=function(n){function t(t,e,l,r){var i=n.call(this,l,e)||this;return i.data=t,i.dialogRef=e,i.hwWalletService=l,i.walletService=r,i.operationSubscription=i.hwWalletService.confirmAddress(t.addressIndex).subscribe(function(){i.showResult({text:t.showCompleteConfirmation?"hardware-wallet.confirm-address.confirmation":"hardware-wallet.confirm-address.short-confirmation",icon:i.msgIcons.Success}),i.data.address.confirmed=!0,i.walletService.saveHardwareWallets()},function(n){return i.processResult(n.result)}),i}return Object(i.__extends)(t,n),t}(Kc),Bf=function(){function n(n,t,e,l,r,i,o){this.dialog=n,this.walletService=t,this.msgBarService=e,this.hwWalletService=l,this.translateService=r,this.router=i,this.apiService=o,this.confirmingIndex=null,this.creatingAddress=!1,this.preparingToEdit=!1}return n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.editSubscription&&this.editSubscription.unsubscribe(),this.confirmSubscription&&this.confirmSubscription.unsubscribe(),this.txHistorySubscription&&this.txHistorySubscription.unsubscribe()},n.prototype.editWallet=function(){var n=this;if(this.msgBarService.hide(),this.wallet.isHardware){if(this.preparingToEdit)return;this.preparingToEdit=!0,this.editSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).flatMap(function(){return n.walletService.getHwFeaturesAndUpdateData(n.wallet)}).subscribe(function(t){n.continueEditWallet(),n.preparingToEdit=!1,t.walletNameUpdated&&n.msgBarService.showWarning("hardware-wallet.general.name-updated")},function(t){n.msgBarService.showError(Tc(n.translateService,t)),n.preparingToEdit=!1})}else this.continueEditWallet()},n.prototype.newAddress=function(){var n=this;if(!this.creatingAddress)if(this.wallet.isHardware&&this.wallet.addresses.length>=Ll.maxHardwareWalletAddresses)Wc(this.dialog,{text:"wallet.max-hardware-wallets-error",headerText:"errors.error",confirmButtonText:"confirmation.close"});else if(this.msgBarService.hide(),this.wallet.isHardware)this.howManyAddresses=1,this.continueNewAddress();else{var t=new oa;t.width="566px",t.data=function(t,e){n.howManyAddresses=t;var l=0;n.wallet.addresses.forEach(function(n,t){n.coins.isGreaterThan(0)&&(l=t)}),n.wallet.addresses.length-(l+1)+t<20?(e(!0),n.continueNewAddress()):n.txHistorySubscription=n.apiService.getTransactions(n.wallet.addresses).first().subscribe(function(l){var r=new Map;l.forEach(function(n){n.outputs.forEach(function(n){r.has(n.dst)||r.set(n.dst,!0)})});var i=0;n.wallet.addresses.forEach(function(n,t){r.has(n.address)&&(i=t)}),n.wallet.addresses.length-(i+1)+t<20?(e(!0),n.continueNewAddress()):Wc(n.dialog,{text:"wallet.add-many-confirmation",headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"}).afterClosed().subscribe(function(t){t?(e(!0),n.continueNewAddress()):e(!1)})},function(){return e(!1,!0)})},this.dialog.open(Nf,t)}},n.prototype.toggleEmpty=function(){this.wallet.hideEmpty=!this.wallet.hideEmpty},n.prototype.deleteWallet=function(){var n=this;this.msgBarService.hide();var t={text:this.translateService.instant("wallet.delete-confirmation",{name:this.wallet.label}),headerText:"confirmation.header-text",checkboxText:"wallet.delete-confirmation-check",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"};Wc(this.dialog,t).afterClosed().subscribe(function(t){t&&n.walletService.deleteHardwareWallet(n.wallet).subscribe(function(t){t&&n.walletService.all().first().subscribe(function(t){0===t.length&&setTimeout(function(){return n.router.navigate(["/wizard"])},500)})})})},n.prototype.toggleEncryption=function(){var n=this,t=new oa;t.data={confirm:!this.wallet.encrypted,title:this.wallet.encrypted?"wallet.decrypt":"wallet.encrypt"},this.wallet.encrypted?(t.data.description="wallet.decrypt-warning",t.data.warning=!0,t.data.wallet=this.wallet):t.data.description="wallet.new.encrypt-warning",this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.walletService.toggleEncryption(n.wallet,t.password).subscribe(function(){t.close(),setTimeout(function(){return n.msgBarService.showDone("common.changes-made")})},function(n){return t.error(n)})})},n.prototype.confirmAddress=function(n,t,e){var l=this;null===this.confirmingIndex&&(this.confirmingIndex=t,this.msgBarService.hide(),this.confirmSubscription&&this.confirmSubscription.unsubscribe(),this.confirmSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).subscribe(function(r){var i=new function(){};i.address=n,i.addressIndex=t,i.showCompleteConfirmation=e;var o=new oa;o.width="566px",o.autoFocus=!1,o.data=i,l.dialog.open(Ff,o),l.confirmingIndex=null},function(n){l.msgBarService.showError(Tc(l.translateService,n)),l.confirmingIndex=null}))},n.prototype.copyAddress=function(n,t,e){void 0===e&&(e=500),n.stopPropagation(),t.copying||(Uc(t.address),t.copying=!0,setTimeout(function(){t.copying=!1},e))},n.prototype.showQrCode=function(n,t){n.stopPropagation(),qp.openDialog(this.dialog,{address:t})},n.prototype.continueNewAddress=function(){var n=this;if(this.creatingAddress=!0,!this.wallet.isHardware&&this.wallet.encrypted){var t=new oa;t.data={wallet:this.wallet};var e=this.dialog.open(Zp,t);e.afterClosed().subscribe(function(){return n.creatingAddress=!1}),e.componentInstance.passwordSubmit.subscribe(function(t){n.walletService.addAddress(n.wallet,n.howManyAddresses,t.password).subscribe(function(){return t.close()},function(n){return t.error(n)})})}else(this.wallet.isHardware?this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).flatMap(function(){return n.walletService.addAddress(n.wallet,n.howManyAddresses)}):this.walletService.addAddress(this.wallet,this.howManyAddresses)).subscribe(function(){return n.creatingAddress=!1},function(t){n.msgBarService.showError(n.wallet.isHardware?Tc(n.translateService,t):t),n.creatingAddress=!1})},n.prototype.continueEditWallet=function(){var n=new oa;n.width="566px",n.data=new $c,n.data.wallet=this.wallet,this.dialog.open(nd,n)},n}(),Vf=l._7({encapsulation:0,styles:[[".-record[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px;padding:21px 20px 16px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-record[_ngcontent-%COMP%]:not(:last-of-type){border-bottom:1px solid rgba(30,34,39,.05)}.-record[_ngcontent-%COMP%] .id-column[_ngcontent-%COMP%]{width:50px;color:rgba(30,34,39,.5);-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px;margin-right:10px;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{display:inline-block;margin:0;vertical-align:middle;word-break:break-all}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:hover .copy-label[_ngcontent-%COMP%]{opacity:.999!important}.-record[_ngcontent-%COMP%] .truncated-address[_ngcontent-%COMP%]{max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:middle}.-record[_ngcontent-%COMP%] .hours-column[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);width:130px;text-align:right;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .coins-column[_ngcontent-%COMP%]{color:#1e2227;width:130px;text-align:right;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%]{width:80px;text-align:right;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{cursor:pointer;color:rgba(97,109,125,.5)}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{color:#0072ff}.-record[_ngcontent-%COMP%] > img[_ngcontent-%COMP%]{display:inline-block;margin-left:0;height:32px;width:32px}.click-to-copy[_ngcontent-%COMP%]{cursor:pointer}.-actions[_ngcontent-%COMP%]{background-color:#fefefe;border-bottom:1px solid #eff0f0;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;-webkit-box-shadow:0 4px 10px rgba(0,0,0,.03)!important;box-shadow:0 4px 10px rgba(0,0,0,.03)!important;border-top-left-radius:0!important;border-top-right-radius:0!important;z-index:100;position:relative;padding:0!important}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{padding-right:20px;padding-left:0}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:first-child{padding-left:5px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] .-enabled-span[_ngcontent-%COMP%]{cursor:pointer}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] .-enabled-span[_ngcontent-%COMP%]:hover{color:rgba(30,34,39,.5)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#cecfd0;font-size:12px;height:60px;margin:0 5px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-img[_ngcontent-%COMP%]::before{content:'';display:inline-block;height:32px;width:32px;margin-right:5px;background-repeat:no-repeat;background-size:32px 32px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-new-address[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-hide-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANISURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdIKmE8TewJkg6QStJ6j72p6PzgTlBvUAsVhAohqK1jm2CPkuF3x3uphyDJIgCIAggCAIgiAIgiAIgiAIzw0FB8IYM8Q/Z9jliQMY4eccn6H/eoWPxcEs8fs5QDHTWq/gAPSuAJx4XhRwqTJ1Dg8TfhQc2C2Am6AiLPRIbwqoVjy7cuAuIQEFaooWMenLInpRAK26A/UDKjPnALeHe9+HNWTAzC9jRlsmv0KLmKxxMjihl6/0SNGDn1/QO1e4a/wf2/K7UqEkG5hhtYAtK29xgp/eaj3fUc4Fyrlqk8NtCWwKoD2PgzYQDRpX/BrNbLzvHiZ56DzH6Dw/R1+REjSXTzgCNjJcMZeHb8jcX2s9hg74CV4ujFmpyhpq8qov+AIMsFiAN/0/4TtaeZx8UgSoWSzMNLYE8iEcW4HFCToH4+iVJbMHJrKslGXDd5RbAAPJFuD3/t+mUHWh9fFXYOS3MaeDysHWrLwVJPkCDgs4i9qWe/KEjyDhZIfr9Ubfe5OsADT/00a7cDPoCZ8n/GcwUCeQSLoFKHUcNosMvkNPoOx52PaHqiQ4wmAeCVyGbWPuzjEiYD6/+0HIg/FejcPthLKt29J3Fzh8QGNisVPCyY9h/8kTuVdcKNvClr67wH4WaCFlkL3XBDgU0BgkJUVhuwBHGZuFDnLxt5NI9nBb313g8AEWAmd0X+1LW7ffaH0LZXGDhVFL30mkW4Bzdw2BRTMscoLZXyPuq8jhdiFZAXiYnzfam6c3NlD2h+jNHBLh8AEU9xsZGqWtwAzVCGAj7BXJSVeyAijsYYbWSH0xZ79pcVid8eeN8EhcFk05agIsYRBPa9PoVe7P7ExkLdWhZoToLBkYoAQlztOpGoxZYLISSEZcWaZaA1dZrPeSWNey9payOmtJ7GBF0Tivf0TOKcq5gadUFK2h0vURqG/QflChrTLLqhPjsl5Fnz3ik534FW9zoPYe3Md3WifH/hC5GIEeoIHSPo0dYxfI4fk9b6EHDnI5WhZNVXk5uitlbkHh9clejsbU1+NlCa2qIuXQcj2ON0g/B5hdHup6XBAEQRAEQRAEQRCE58c/90hmWzuzaIoAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-show-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-enable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKbSURBVHgB7ZnRbdswEIZ/MhkgI7gTxKzdhz41mSAdIZ2gyQS1J0g8QdIJ6kzQvMcu1QmiEfzYAonYO1stZNaIDfdOcOH7AMMSIRK644n87wgYhmEYhmEYhmEY+4dDi8QYj6oK5967d3TbTUCnfomC/sqqSne9XrhFi7TmgEmM7z3cDV0erXm0TFUatuUIjxaI8fsVGf8F641nOs67G+rzCS2gHgFsSEIaYAsc3HUIx5dQRDUCpjGerzB+Rm3DZ6TT16Hr+PeEFID0Oe9Pz13wpwNFVCPgWyweUS90NeVPMvxtCOWq52mR7CS4r1mfmUN6FUKYQQG1CODZx7IheMl4howsydhTumwaO985oISaA7xzZ817CrXbl4z/DTuBdoHRUl+HEyihtwYkdLOGETak8rhfanDuGEqoOSBl4U8zW2za900I91lTB0q0ogN2mb13wCFagrbEhB1EXAdwwkOBxervAoKwKqTlcSitB0QdwMbXQqYLHQrWCZJOEF4DPCcwWsZjMbYXTZLEIqCWsY9Zc0ma/wMtNMU2s1an0FfItkHOI1ZslVshFwHO5TPDsjbwi24bsv0Qxm6eKKFstvsKYgmSmANSpvyq53Qp8a3yGBxFzTaqF5xBCMk1YMkB/X4YQ4jDRcmsSQdC/BdCSCsVZkwKY88xB2DPMQdAiUVStPuIOcBlau1JMCeYTP4qjW9cXVqHmAP4XK95fwA+3fn3KOAx/ME8H/iD20kHeOTKj5OjuGL2NoINf3iIJzwGMuX3gw5WIIRoPWA6jdek0z9CESq0jHohiBVbRBdB7zGAYHiuoKAXHkAQUQewZueKTX6wIQHPvHQ1iFE7G1wUSHi25oca2+4IJRl+VwFjqQKIYRiGYRiGYRiGYRjGL/wq6dJf5iBxAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-disable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN+SURBVHgB7dlvT9pAGADw566tgAhUFJ0ijgSXidnM5t5s2YtlcS/2BfyUfoglvt5csmwMXFjYhij/W0H+lPZurQmmEKeId2SG+727o1T79Gm55zkAQRAEQRAEYTohmKS9PWn54HBhJoACQBUfAuq5+Cew3CK0Y5C2rB0fp6swQRMLQDz+TO3BeVyyXXccoWDQLhQmFQgJJiC6sbGGEIlh203HIgQSlkFVgxHQ9UoTOOMegIfJ5Aqy8ArcFoaA3xeSG436GXDENQDR6OaCfUdj7jmLEBMpUGxjODn5kcnp9crJrFfRFezFFMOs+1isSP750Fpb0047wAnXAIQiixtOSvfHFFA36JUy2XRaa1WrRn++2Wz2NK2iRVeWql0LVPvFJPc/Q3I3pO3uliGVosDBjc/kuJy7jxHMuOcCHnSUSqWMf33H+cw5xrL15wiRpMTh4QJwwi0A2CerA2MLqtddfJ9zjOyTi+45A9k/m5xwCwAl5sDzbJrN4qjfPSekOXgueRY44ZcBQ+mfz+fbI34VKplM47pzscQtAPeFDP+p39n0J5iAqc8AEQCYclMfAG7l8Hpi8wXckdMn6PbM9uksLsAIi6hxsK8F7KZH1DCiGPAc3BUlimQXSCGLLl9Uhu/fnbOuCdgGwL749c/fHmOKVGDMqQzVYi2o776pswwC0wBc3HkOF3/Jzgj/z2PMskfA7h2wtTWz3iVP3VNO+duWya+329ut/f19C25JjcfVgORb6/cO+1o6PapUBpfL42KWAQ/8CzHJ1dBwLv7lzpPvHw8OOqkxU7ajaZ2zeqUaDEfm3T0C7POYjVqRSRYw+xlE1PK5xw2rnR/nrl/BcrJo4G8RYx4YYRYARZYGSlYtl9OAEbs6bLnHLKvD+7IQYpFJVxJLYZhyIgAw5UQAgBe7LoB7gFkAnF1d93jxwxdmrWxnSewe90yrBYwwCwDFZt099gZRnEkW2OeYw96B/UUPkkZusd+EWZp6IhGqEHS5heXsCQYKpXA4tGaMtblpX/hiyZoL10qPhld+fh/OlstlJosjph2h1UQiJoOyBByZIJcK2a9/gBGmL8FCNltg+XwOc1pkr3eSBWCI9ZuaNvVa3R8OYQySHxhy7vyr58kcowrzErem6JbdIGm1yGrXLpOHK8VROT2FGZB0Xe5pw/uFgiAIgiAIgiAIgiAI4/oLaQBI2smc1O8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-edit-wallet[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMiSURBVHgB7ZnbcdNAFIbPSvYzpgJEBfaSgdeYDkwFhA5CBXFKoIIkHdABziszILkCnArwc8bSco4jT1aypGgvkjzD+R680lq3/9fZsxcBMAzDMAzDMAzzPyLghIjjeILFAh/rXAFEVIflNgDxHSC7l1JuwDMnYwCKXygQN7g5qTtGgFhKOb0Gj5yEAXG8vlKglm2OxYi4PZOzL+CJwQ0wEX/ApwmDGlAjfot131BkQu1/BMEU9y8hzwkHfJkwmAF14negPn6QMikeG0eYH35AByYMYoCJ+OdzujEhgJ6pa/OY4S/rxBPUBQo0CDc3xfPg4lec3IAlvUbACwmvMQKer1EdCSme+17KFRjSWwQ0hL3EQL7D7ckIhf2M41nTdeoiIQRxBRb0EgFt2vzvOL7Fx/kMZpHwR69DY96ajhY7j4C2Ce+dlBemkYDFSq8Lw3AKhnRqgGm2NzUBlHrQdx8f09dgSGcG2HR1hJEJQrzRd1VYzAtt6MQAW/EH2phAOQCLuV43ghMwwFX8gSYTtK5QZ2UzXfbaC1RlZrAQr1PuHcb7ucLxOIC6U5t7eI0ApWBZqnIST5QjoXo4rK5t7+G3CYj9m9LZ0hsDR3QToEL8mZRLsMSbARj+84rqfVvNE5bLtSNaJivXu4onvBmQZVDM1Erd4y+FpZMJ9bNAd/GEzyYQ6TuYD1b5mN3ahK7FE94MEIEoDEPH4zDGbmlra0If4gmfEVBoAmmarqm0MaEv8YQXA/JBir6cvdUHJSYm9Cme8GJAkBYfFp6EFmhjQt/iCS8GCFEMf5WpddVxTSYMIZ7wkwNKCRAT4nn+meuIGhPmQ4gn/EQAHDWBWS6syYRP8DR7i4YSTzhPhkgkCvhb83eSv21ijn7j/F2hOftpbFR3zb7EEyNwp2nVZlY0R8FL9CmecG4CR0Nge+iT2Nc+xRPOEVDuAQzZ0DfAAMQKrbzDWZ/zzNEUZwOUEK9aJBIShuv5lPlFsoNsjTdO5ACCy7gbgPN0/Ky10KowlHG5OlMPKoAktFyq6gsvS2I0iNlhVj+Vt8owDMMwDMMwDMMwDNPEPw5aH3llqGexAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-btn-delete[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkZGMEIyRDk3NzBFMDExRTg4QjAwOEEwQTk4MTI2NjcwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkZGMEIyRDk4NzBFMDExRTg4QjAwOEEwQTk4MTI2NjcwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RkYwQjJEOTU3MEUwMTFFODhCMDA4QTBBOTgxMjY2NzAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RkYwQjJEOTY3MEUwMTFFODhCMDA4QTBBOTgxMjY2NzAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5XdpwRAAACxElEQVR42uyZPWsUURSGd9dYCakisdDKQomI2dJOSCoVQRSsFBE7Y6siSCJYqE1A4gcG0ySiBkVtBFHjxw/QjabQTlGI4AeYIFGIOz4Hz8IwbMaZ2ZnJneRceLhk5nLnvO+euXPPTdnzvNJybpXSMm9mgBlgBpgBZoAZYAaYAWaAGWAGmAFmgBlgBpgBqbVXtcn10JHCPJ3at2cRZzmLIzGCPUDXBdvhEtyodm/5kVD8BNyFaea46LwBBL2H7jZ8gdXwEw4R/HhC8V16aQ5uwUnmmnbSAE3597DKd7kOkzAADwh+PoF4f9sP15nHc3ENWBcQ33hGFe7D4RbFi5lbXV4Ev8KbkPt9COxNKL4R70Rav34WBsh7PxhyfxOMIrQvuKpHEC/tPOLvOJsBBPeL7ibsgxo0+6XWwCnYFlP8OeY/XojPoIraRXcNmu0F5KFTIgoeRxR/omg7wWfQD5+aGQ+bYWwxxWeaAb5M6KG78B+RiyI+l1oAAU/UAOfE51kMDcMOeBRx/EAe4nN5BQKvw9EI2fAN8R15xVTJUbx86o5FGDrL2L15xZVLBkT8zjfavNYO/Vo7eIU2IKb4YDsCl7M0oeKA+FpY7QC9hcyAqNtbeAcjIWM+6rhRMmGmEBkQY28vn7pxrfFfh5TYp6GnEBkQU3ywdrgKnQvUDrIwnpVzBS263MsARKzUGiDJ3v4pnIHPC9QO3VppHuQ5ZVdfAan3NybZ3nJ9Fob0dZgKmWODGuKkAXJw+baVvT1jpDweChnykjF1Vw34AA99f9cTFjZyjrBbxMIf3/UXpX8nzqm1tpQN+A1XYAXsBFkTxuIWNnpyfE/XlEEVvlZM4d5cUfYBchJcJeCRFuZo10x4DjPM9b3Q1WALRrRF+X/CkjVgSZTDZoAZYAaYAWaAGWAGmAFmgBlgBpgBZoAZYAaYAa60vwIMACj3FKsCfgkuAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover{color:rgba(30,34,39,.5)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-new-address::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-hide-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI5QTAxQTVDNzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI5QTAxQTVENzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjlBMDFBNUE3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjlBMDFBNUI3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5A1duRAAACq0lEQVR42uyb3W3CMBCATdUBzAZhAmACYIKm75WgE0AHqAjqAJQJmkp9L0xQOgF0ArJBPUAlakuHhKwzzo+tGOVOugcMcXyfz5e7i2gdj0fWZLlhDRcCQAAIAAEgAASAABAAAkAACAABIABNlNuqE/w9f+T9KZcaSx1I7UmNYEyJkJpJ3UvdSt3AmN2Al4d6AeQQZehM6vjMYAxOD3QCY6nUBYC5yiOgjFpKPUidXjDeJBO4dlni2toBqF3fwc5XlRnMFV0LAOXGX4YFC3DrkdSO1BZoG8ZWBpePYM5e6ADUQj8R4zMwUBmaQKDLNDBb2G0F5hEBYZo7GADcsPNqV/tgYF5J4ZqVwRN4iADmiPEL2FVRYj4B1y4QCPPQAERIwFuBu1eVBPGEmauj4ApAgpz5xKF3JUhMmIUCgEOSoy9YOAQgIDCey9hFLHABIEZ2/93D43WrQeXIvWsBMNQ+bzxml3osGIQAoKt9XnsEsEWSrtoB6NF4j5zVX6nHgnpAYktmuXdtQVAPWHpA5CXBvloABBEEiwIqGv29igsAwuKWTyVreoFkgdw1IBcAbOcy1Sq/vNqGay8FvSwEAD+Wx6JLiS0BtxYA+qNp6hHAneXetQBYIxmaDy+YIMdrEwIAgaS+b8xtH48jJXAaShBkyPPaac1+odcQTDmcGWr2uSPjsV5DFhIAU82uxsq2tU9tda+9BpcA1HkcGRoXOySvt1WYWFs9g3uIEAGcFnhvSI5SKHBewUCufT8Ed1eFE9ZcNc1dSXy8GtvDLmFGRJAnTEuAHTEPr8l8FUNqoVhbu2wTpM88vSP0WQ2e2todVrxFJsDwDivfVq/tCGDeMAFDYjjrXWZ+Pf6NZJfepEX/F2i4EAACQAAIAAEgAASAABAAAkAACAABaKL8CzAAuPuelr6IAx8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-show-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-enable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKESURBVHgB7ZnRbdswEIb/o+33jKAiddG3Ogsk1gTpBk0nqDtBnQkaT5B0groTKG0HqB6LukE0Qt6d6ELSChIqhm0IR8GB7wMEmLR00h2P1P0UoCiKoiiKoiiKouwehBbhLNmD6X0A0RDMA9uVVH/ltq8AY0pH/76hRVoLAGf772HMuf25t+bUwj7WuK1AGLQA/+p/tc5/x3rnHYm94oJ/v/mCFoieAd6RksdoAuGMDmefEZGoGcBZ/2SJ8ze279QeKR3NyB0ocWCP5ynPGPmpE5GoGcA/+9d4XOgcBcp5SmlRLD0/e5vA3GW1a2zA5q/sNTeIQLQM8KMfOoJVzjso/WsD1EnhnH7ErhvdE0Qi3hTo8HHQZlyscv6BRRB4EvaaISIRLwBMg7CNCTbnMmgZfodIxFwEk6cNSmc5NoTS/5erbEnSSh2wzex8ALpoCftKZGwh4hngBI8vfaXtWpteTAkjWghVas8VMgPEIa9qCbGiSDYDOj0nYGI5D297cQ8xxDKgKmOva92uqPkI3OZNRq2S0G46JcEfTkc8f1U2Qi4DzN241uPq/gP3oE1TltKrqbPhbQWwmEASnAK1ao3KkcRc9TZ8Fj3BmGMIIRiAsPSlw6sfEOO2XkUmEOJFFEKxpLBDS2HsOBoA7DgaAEQihnCJgWQAirDZFdMES7bGN95dWodcAMoyLHwMnUtkwUJhmlBe8zYGADStdVhx1PvT9MOG31fIXg+dDdQrP56fQgjh/YD9MztanxCTspxYkTSCEMKLoFeEYum5hLy6hxiiAVgot3nqRgnSOJvCu0GOaN8G/QaJGy2yMpmo2RuB7ZuF3eJKU6kNEEVRFEVRFEVRFEVRlHvYheXBAEeGBAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-disable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKZSURBVHgB7ZlRbtpAEIb/NfCeI1ClVH0ruUATnyA9QnqCNidIOEHCCUhP0OQETtsDlMdKtApHyDuxpzNrV8EGAXJnLSLPJ1liF1h7/p3dnRkDhmEYhmEYRjtxaBBK+gdA9wyd6BhEQ+7qF19N4dwcKd25eHaDBmlMAEoOPyCKJvzxYMtP58gwakqICA1A3wdXbPxXbDde6PNTTejHmws0QHAP8IZkdIk6OFy797NzBCSoB1AyOFtj/CP3jfiK3fHMycUuf8TXl9UB8NkvnYAE9QD6NnjA80Yn8PpexC6ez9f+PnnL7p8mlf+wYItX/J9HBCCYB/jZLxuCTcYLLv7FAnViiNHP5CdHIMItgQ6dltqEm03G/yMXgcbl3ugEgQgnALlhuY0xdue+1IroHQIRchPsLzf4XJ9iR1z8+37TWJo0EgfsM13sKf54bIDWe4AJgJbTegGCbTQcBhP+H64T8JUuRrsEUXVQF8AXPTq9C0lkoAlnhoUQqjmBqgDe+KgnycwQYZgW+YSaCLp7gMx8OOPhx87voYaaBxSp7EOlWxKbj8DTtM6sFWW0K6xklVxLWA2Xa6HnAZ20OjOS+x/Jg9Z1WRf/uZUx/FglSK1IoicAVVw/y8411qofw3vRElF0CiU094CSAH721HiqZpJ9KPEiAqFQ5TDBQmG0HBMALccEQCDyN8H7j6YA83Kzq5YTrHk9tnOFeRt6AmTZXXlkN9HwgjzD9PnAUuc+CgBXjfw4Oer9rPtyUwyn5PWJjIFq5EeLEZRQrgccXvNsfUJIsmzMYbZasUV5E0wvobg+1zAt7qGGqgB55raIZZagjYypXA0SwhVFpUAis+X4xaZz9U4E4pOFZHN1t1oFEMMwDMMwDMMwDMMwjL+78e87Hb4jwAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-edit-wallet::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMSSURBVHgB7ZrRcdpAEIb/w/BOB1EHIY8Z4gQ6oIM4FWRSgU0HSQXGJaQCMCTPIRUEVxA9Z4DLrrBmJCFpdNLqxIz3mzE6nWWs/7+93TsBoCiKoiiKoijKS8TgkljaIa4wQw8fYBE894bU/o4DVpiaHYS5HAPWdkZ3c0+tYclVd7g2cwhyGQZs7C1YXBUMFnhnPkGI7g1wER8jaEK3BuSJtzTnDb7RcUtHnv8j6v1M7SB1nZAJ3RlQJP6AKSW7bap/aQNKjss2TOjGABfxMS2Z0INviuf8l0LxDJdANshil+q3uMEPe4+a+I2A8oQX0nBMMS4xgSmKBLKISuQKjviLgKKw3+MNHR/A9f9Iwn7aUen7FEUCcIsa+ImAKnN+bRd0Nx/hEgl9/En19SgqxuYJDrQfAVUT3ntz4xwJoOVxkgNFkyPtGuCa7V1NsMiO9hCOtGdAnVLHuJhg8CpzvoMj7RhQV3xMFRM4BwCTVN/+EgxoKj6mzAQWP6C+NLW2y7JVIC8z1xGfJFsd/tGRxdvMOqBHCXDs/j/6kGRAtdgmzpuKZzgS1haRCRwJg2iDFGSumtcRz8hOAV6Wpt89BKKfZiSnQ574a3OHmsgZsLGTsz6+WQ7XU8KqD/89PyY7p5F4Rs6A7MhYPNLrtrEJccITHvkYSQNGmfMVlaUpmpjQsnhGzoAeXqfODQmfmrC2CR7EM5JJMB0BB5yych0TPIlnZAxYRouU5Do8TC1KXEzwKJ6RMeDq7GbPa3IVEzyLZ2QMyCbAI37nXldmQgfiGRkDsgmQazZ/zJVHngm8huhAPCOzF9jYX8gmQRa4j5bB+SvB4hGPaV0809wAHuk+/hb8dvs82pwnJvQaRNFypLYpFM54Ec803wz1UfbUZnRmDm+Wym33Jp5pbgAnQImJZKPt7pw+5PgKjzQ3gEPaoh78aNtEyfCRFk4L2vU13zk6IhEBwwrXhNHzOhbLJdJEuWFbmCA9ImHAAwmaJc5Z7IpaT9EnvANqv5X/ZocUMmXw9CgsuJRRVRRFURRFURRFURRFKeM/oxaTpik5gaYAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-btn-delete::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYwRTIyQTZCNzBFMDExRTg4ODM5RUYyOTE4Q0I1M0FGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYwRTIyQTZDNzBFMDExRTg4ODM5RUYyOTE4Q0I1M0FGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjBFMjJBNjk3MEUwMTFFODg4MzlFRjI5MThDQjUzQUYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjBFMjJBNkE3MEUwMTFFODg4MzlFRjI5MThDQjUzQUYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4w5yWGAAACxElEQVR42uyZTUgVURiG773ZSmxl2CJXLQzbZLtaBboqCcTATUVEu2zbH0QKLcqNEP5R6MYikyLdBFHZz6KlWEnUrmihYAkpYYLd6fnwXBiG2zQzd2Y8o9+Bh8G5h7nnfe6ZmfMd847j5LZyK+S2eFMBKkAFqAAVoAJUgApQASpABagAFaACVIAKiK0tHzi0B2pjuE6dOe5IYpz5JLbEGOwpDo1wBAbgfs30258Rw0/BY5jjGv3WC2DQ7RwewgLshF9whsGPRwzfaE6twAO4wrXmrBRgpvwXqHadLsI76IInDH4tQnh3Own3uI5j4zOg3hO+9B1NMAlnKwwvMg/a/BD8Dh98Pu8kYEvE8KXxTsX16ychQO77Xp/P98EoQTu9T/UA4aX1EP6RtTOAwf3mMAYdMAPlfqldcBUOhwx/k+tfzMRr0IQ6xmEYyq0F5EtnJRQ8Dxj+UmbWAa6Fywm4DLt9un7cqPCJCnCJaOZw6z8hNyR8KrUAAV4YAdaFT7MYugNH4VnA/l1phE/lFvDcDucDzIYfhK9Na0yFFMPLq+5CkK70PZ7WuFKZAQHf86W2ZmqHa6Z2cDItIGR4bzsHg0lKKFgQfsavdoCWTM6AoMtb+AwjPn2+mX6jzISlTMyAEGt7edWNmxr/vU+J3Q3NmZgBIcN7a4fbUPeP2kEejDdkX8EUXfbNAEJs5/Aq4tr+JVyH+XI/FOw3leZpvidv6y0g9f7eKMtbzi9Dn7kdZn2u0WCEWClANi4/VbK2p4+Ux30+XabpU7RVwFd46vq7GLGwkX2ENgkLf1zn3+TWd5xja1UxC1iFIdgGrSDPhLthCxuzczxhnim9JrjsKbTx2UpW1gGyE9zEgEcq3FSRmfAalrjWYqarwQpEVAX5f8KmFbApymEVoAJUgApQASpABagAFaACVIAKUAEqQAWoAFvaXwEGAEeBGUrXm8wHAAAAAElFTkSuQmCC)}@-webkit-keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}@keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}.copy-label[_ngcontent-%COMP%]{color:#0072ff;opacity:0;font-size:12px;position:relative;padding-left:10px}.copy-label[_ngcontent-%COMP%]::after{content:attr(data-label);position:absolute;white-space:nowrap;top:0;left:4px;opacity:0;line-height:1}.unconfirmed-label[_ngcontent-%COMP%]{opacity:.5!important}.copying[_ngcontent-%COMP%] .copy-label[_ngcontent-%COMP%]::after{-webkit-animation:.5s ease-in-out floatup;animation:.5s ease-in-out floatup}mat-spinner[_ngcontent-%COMP%]{margin-left:7px;margin-right:12px}mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}"]],data:{}});function Wf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-button small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function zf(n){return l._33(0,[(n()(),l._9(0,0,null,null,24,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,12,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.newAddress()&&l),l},null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(4,{"mouse-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,7,"span",[],null,null,null,null,null)),l._8(7,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(8,{"-img -new-address":0,"-disabled-span":1,"-enabled-span":2}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Wf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(12,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleEmpty()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,4,"span",[],null,null,null,null,null)),l._8(19,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(20,{"-img":0,"-show-empty":1,"-hide-empty":2}),(n()(),l._31(21,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,"-button",n(t,4,0,e.creatingAddress)),n(t,7,0,n(t,8,0,!e.creatingAddress,e.creatingAddress,!e.creatingAddress)),n(t,11,0,e.creatingAddress),n(t,19,0,n(t,20,0,!0,e.wallet.hideEmpty,!e.wallet.hideEmpty))},function(n,t){var e=t.component;n(t,12,0,l._32(t,12,0,l._22(t,13).transform(e.wallet.isHardware?"wallet.new-address":"wallet.new-addresses"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("wallet."+(e.wallet.hideEmpty?"show":"hide")+"-empty")))})}function Uf(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"div",[["class","-button btn-delete-wallet"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.deleteWallet()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[["class","-img -btn-delete -enabled-span"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.delete")))})}function Gf(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleEncryption()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"span",[],null,null,null,null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(4,{"-img":0,"-enable-encryption":1,"-disable-encryption":2}),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,n(t,4,0,!0,!e.wallet.encrypted,e.wallet.encrypted))},function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("wallet."+(e.wallet.encrypted?"decrypt":"encrypt"))))})}function qf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-button small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Jf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-text small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Qf(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showQrCode(e,n.parent.parent.context.$implicit.address)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,11,"p",[["class","click-to-copy"]],null,[[null,"click"],[null,"mouseleave"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.copyAddress(e,n.parent.parent.context.$implicit)&&l),"mouseleave"===t&&(l=0!=(n.parent.parent.context.$implicit.copying=!1)&&l),l},null,null)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(6,{copying:0}),(n()(),l._31(7,null,["\n ","\n "])),(n()(),l._4(16777216,null,null,1,null,Jf)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"span",[["class","copy-label"]],[[1,"data-label",0]],null,null,null,null)),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(13,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,5,0,"click-to-copy",n(t,6,0,t.parent.parent.context.$implicit.copying)),n(t,9,0,e.confirmingIndex===t.parent.parent.context.index)},function(n,t){n(t,7,0,t.parent.parent.context.$implicit.address),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("wallet.address.copied"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.address.copy")))})}function Kf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-text small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Xf(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,11,"p",[["class","click-to-copy"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.confirmAddress(n.parent.parent.context.$implicit,n.parent.parent.context.index,!0)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[["class","truncated-address"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"span",[["class","copy-label unconfirmed-label"]],null,null,null,null,null)),(n()(),l._31(8,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,Kf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,t.component.confirmingIndex===t.parent.parent.context.index)},function(n,t){n(t,5,0,t.parent.parent.context.$implicit.address),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.address.show")))})}function Zf(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),"click"===t&&(r=!1!==i.copyAddress(e,n.parent.parent.context.$implicit,1e3)&&r),r},jf,Yf)),l._8(1,180224,[[1,4]],0,bu,[l.l],null,null),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,2,0,l._32(t,2,0,l._22(t,3).transform("wallet.address."+(t.parent.parent.context.$implicit.copying?"copied":"copy-address"))))})}function $f(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),"click"===t&&(r=!1!==i.confirmAddress(n.parent.parent.context.$implicit,n.parent.parent.context.index,!n.parent.parent.context.$implicit.confirmed)&&r),r},jf,Yf)),l._8(1,180224,[[1,4]],0,bu,[l.l],null,null),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,2,0,l._32(t,2,0,l._22(t,3).transform("wallet.address.confirm")))})}function n_(n){return l._33(0,[(n()(),l._9(0,0,null,null,54,"div",[["class","-record"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","id-column"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,7,"div",[["class","address-column"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Qf)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Xf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","coins-column"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,2,"div",[["class","hours-column"]],null,null,null,null,null)),(n()(),l._31(19,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,31,"div",[["class","options-column"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,16777216,null,null,3,"mat-icon",[["aria-haspopup","true"],["class","mat-icon"],["role","img"]],null,[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(n,t,e){var r=!0;return"mousedown"===t&&(r=!1!==l._22(n,26)._handleMousedown(e)&&r),"keydown"===t&&(r=!1!==l._22(n,26)._handleKeydown(e)&&r),"click"===t&&(r=!1!==l._22(n,26)._handleClick(e)&&r),r},Hf,Rf)),l._8(25,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(26,1196032,null,0,ku,[Pi,l.l,l.R,xu,[2,wu],[8,null],[2,Dl]],{menu:[0,"menu"]},null),(n()(),l._31(-1,0,["more_vert"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,23,"mat-menu",[["class","compact"]],null,null,null,Ef,Df)),l._8(30,1228800,[["optionsMenu",4]],1,wu,[l.l,l.B,vu],{overlapTrigger:[0,"overlapTrigger"],panelClass:[1,"panelClass"]},null),l._29(603979776,1,{items:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Zf)),l._8(34,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,$f)),l._8(37,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(39,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"],["routerLink","/settings/outputs"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,40)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,40)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,41).onClick()&&r),r},jf,Yf)),l._8(40,180224,[[1,4]],0,bu,[l.l],null,null),l._8(41,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{queryParams:[0,"queryParams"],routerLink:[1,"routerLink"]},null),l._26(42,{addr:0}),(n()(),l._31(43,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(46,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"],["routerLink","/transactions"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,47)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,47)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,48).onClick()&&r),r},jf,Yf)),l._8(47,180224,[[1,4]],0,bu,[l.l],null,null),l._8(48,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{queryParams:[0,"queryParams"],routerLink:[1,"routerLink"]},null),l._26(49,{addr:0}),(n()(),l._31(50,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,8,0,!e.wallet.isHardware||t.parent.context.$implicit.confirmed),n(t,11,0,e.wallet.isHardware&&!t.parent.context.$implicit.confirmed),n(t,25,0),n(t,26,0,l._22(t,30)),n(t,30,0,!1,"compact"),n(t,34,0,!e.wallet.isHardware||t.parent.context.$implicit.confirmed),n(t,37,0,e.wallet.isHardware),n(t,41,0,n(t,42,0,t.parent.context.$implicit.address),"/settings/outputs"),n(t,48,0,n(t,49,0,t.parent.context.$implicit.address),"/transactions")},function(n,t){n(t,3,0,t.parent.context.index+1),n(t,15,0,l._32(t,15,0,l._22(t,16).transform(t.parent.context.$implicit.coins?t.parent.context.$implicit.coins.toString():0,!0,"first"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform(t.parent.context.$implicit.hours?t.parent.context.$implicit.hours.toString():0,!1,"first"))),n(t,39,0,l._22(t,40)._highlighted,l._22(t,40)._triggersSubmenu,l._22(t,40)._getTabIndex(),l._22(t,40).disabled.toString(),l._22(t,40).disabled||null),n(t,43,0,l._32(t,43,0,l._22(t,44).transform("wallet.address.outputs"))),n(t,46,0,l._22(t,47)._highlighted,l._22(t,47)._triggersSubmenu,l._22(t,47)._getTabIndex(),l._22(t,47).disabled.toString(),l._22(t,47).disabled||null),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("wallet.address.history")))})}function t_(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,n_)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,!t.component.wallet.hideEmpty||t.context.$implicit.coins.isGreaterThan(0))},null)}function e_(n){return l._33(0,[(n()(),l._9(0,0,null,null,24,"div",[["class","-row -actions"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zf)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Uf)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Gf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,10,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.editWallet()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,7,"span",[],null,null,null,null,null)),l._8(16,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(17,{"-img -edit-wallet":0,"-disabled-span":1,"-enabled-span":2}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qf)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(21,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(26,0,null,null,4,"div",[["class","-records"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,t_)),l._8(29,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,!e.wallet.isHardware),n(t,6,0,e.wallet.isHardware),n(t,11,0,!e.wallet.isHardware),n(t,16,0,n(t,17,0,!e.preparingToEdit,e.preparingToEdit,!e.preparingToEdit)),n(t,20,0,e.preparingToEdit),n(t,29,0,e.wallet?e.wallet.addresses:l._3)},function(n,t){n(t,21,0,l._32(t,21,0,l._22(t,22).transform("wallet.edit")))})}var l_=function(){function n(n){this.appService=n}return n.prototype.transform=function(n){return"hours"===n?this.appService.hoursName:"coin"===n?this.appService.coinName:"coinFull"===n?this.appService.fullCoinName:""},n}(),r_=l._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function i_(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),l._21(null,0),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(3,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(n()(),l._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(n,t){var e=t.component;n(t,3,0,e._isIconButton,e._isRippleDisabled(),e._getHostElement())},function(n,t){var e=t.component;n(t,2,0,e._isRoundButton||e._isIconButton,l._22(t,3).unbounded)})}var o_=l._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function s_(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),l._21(null,0),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(3,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(n()(),l._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(n,t){var e=t.component;n(t,3,0,e._isIconButton,e._isRippleDisabled(),e._getHostElement())},function(n,t){var e=t.component;n(t,2,0,e._isRoundButton||e._isIconButton,l._22(t,3).unbounded)})}var a_=l._7({encapsulation:2,styles:[".mat-progress-bar{display:block;height:5px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{background-repeat:repeat-x;background-size:10px 4px;display:none}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:'';display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2s infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2s infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear;display:block}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(.5,0,.70173,.49582);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(.30244,.38135,.55,.95635);transform:translateX(83.67142%)}100%{transform:translateX(200.61106%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(.08)}36.65%{animation-timing-function:cubic-bezier(.33473,.12482,.78584,1);transform:scaleX(.08)}69.15%{animation-timing-function:cubic-bezier(.06,.11,.6,1);transform:scaleX(.66148)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:translateX(37.65191%)}48.35%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:translateX(84.38617%)}100%{transform:translateX(160.27778%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:scaleX(.08)}19.15%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:scaleX(.4571)}44.15%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:scaleX(.72796)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-10px)}}"],data:{}});function u_(n){return l._33(2,[(n()(),l._9(0,0,null,null,0,"div",[["class","mat-progress-bar-background mat-progress-bar-element"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,1,"div",[["class","mat-progress-bar-buffer mat-progress-bar-element"]],null,null,null,null,null)),l._8(2,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(3,0,null,null,1,"div",[["class","mat-progress-bar-primary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null)),l._8(4,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(5,0,null,null,0,"div",[["class","mat-progress-bar-secondary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null))],function(n,t){var e=t.component;n(t,2,0,e._bufferTransform()),n(t,4,0,e._primaryTransform())},null)}var c_=l._7({encapsulation:2,styles:[".mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:600px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}"],data:{}});function d_(n){return l._33(2,[l._21(null,0),l._21(null,1)],null,null)}var h_=function(){function n(n,t,e){this.appService=n,this.languageService=t,this.dialog=e}return n.prototype.ngOnInit=function(){var n=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return n.language=t})},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n.prototype.changelanguage=function(){var n=this;zc(this.dialog).subscribe(function(t){t&&n.languageService.changeLanguage(t)})},n}(),p_=l._7({encapsulation:0,styles:[["[_nghost-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;color:#fafafa;width:100%}.buttons-left[_ngcontent-%COMP%]{display:inline-block;padding:0 10px;width:120px}.title[_ngcontent-%COMP%]{font-size:13px;font-weight:700;display:inline;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;letter-spacing:1px;line-height:50px;text-align:center}.buttons-right[_ngcontent-%COMP%]{display:inline-block;text-align:right;width:120px}.buttons-right[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{height:50px;width:50px}.color-primary[_ngcontent-%COMP%]{color:#0072ff}.separator[_ngcontent-%COMP%]{width:100%;height:2px;background-color:rgba(30,34,39,.05);margin:8px 0}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:3px}"]],data:{}});function f_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),r},jf,Yf)),l._8(1,180224,[[1,4]],0,bu,[l.l],{disabled:[0,"disabled"]},null),(n()(),l._31(2,0,[" v"," "]))],function(n,t){n(t,1,0,!0)},function(n,t){var e=t.component;n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,2,0,e.appService.version.version)})}function __(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),"click"===t&&(r=!1!==i.changelanguage()&&r),r},jf,Yf)),l._8(1,180224,[[2,4]],0,bu,[l.l],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(3,0,null,0,0,"img",[["class","flag"]],[[8,"src",4]],null,null,null,null)),(n()(),l._31(4,0,["\n ","\n "]))],null,function(n,t){var e=t.component;n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,3,0,"assets/img/lang/"+e.language.iconName),n(t,4,0,e.language.name)})}function m_(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"div",[["class","buttons-left"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(2,0,null,null,1,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(3,null,["\n ","\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(5,0,null,null,79,"div",[["class","buttons-right"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,34,"mat-menu",[],null,null,null,Ef,Df)),l._8(8,1228800,[["settingsMenu",4]],1,wu,[l.l,l.B,vu],{overlapTrigger:[0,"overlapTrigger"]},null),l._29(603979776,1,{items:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(11,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,12)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,12)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,13).onClick()&&r),r},jf,Yf)),l._8(12,180224,[[1,4]],0,bu,[l.l],null,null),l._8(13,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(14,1),(n()(),l._31(15,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(18,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,19)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,19)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,20).onClick()&&r),r},jf,Yf)),l._8(19,180224,[[1,4]],0,bu,[l.l],null,null),l._8(20,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(21,1),(n()(),l._31(22,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(25,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,26)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,26)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,27).onClick()&&r),r},jf,Yf)),l._8(26,180224,[[1,4]],0,bu,[l.l],null,null),l._8(27,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(28,1),(n()(),l._31(29,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(32,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,33)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,33)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,34).onClick()&&r),r},jf,Yf)),l._8(33,180224,[[1,4]],0,bu,[l.l],null,null),l._8(34,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(35,1),(n()(),l._31(36,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,f_)),l._8(40,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,20,"mat-menu",[],null,null,null,Ef,Df)),l._8(44,1228800,[["menuMenu",4]],1,wu,[l.l,l.B,vu],{overlapTrigger:[0,"overlapTrigger"]},null),l._29(603979776,2,{items:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(47,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,48)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,48)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,49).onClick()&&r),r},jf,Yf)),l._8(48,180224,[[2,4]],0,bu,[l.l],null,null),l._8(49,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(50,1),(n()(),l._31(51,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(54,0,null,0,3,"a",[["class","color-primary mat-menu-item"],["mat-menu-item",""],["rel","noreferrer nofollow"],["role","menuitem"],["target","_blank"]],[[8,"href",4],[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,55)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,55)._emitHoverEvent()&&r),r},jf,Yf)),l._8(55,180224,[[2,4]],0,bu,[l.l],null,null),(n()(),l._31(56,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(59,0,null,0,0,"div",[["class","separator"]],null,null,null,null,null)),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,__)),l._8(62,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(65,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(n,t,e){var r=!0;return"mousedown"===t&&(r=!1!==l._22(n,68)._handleMousedown(e)&&r),"keydown"===t&&(r=!1!==l._22(n,68)._handleKeydown(e)&&r),"click"===t&&(r=!1!==l._22(n,68)._handleClick(e)&&r),r},i_,r_)),l._8(66,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(67,16384,null,0,Fs,[],null,null),l._8(68,1196032,null,0,ku,[Pi,l.l,l.R,xu,[2,wu],[8,null],[2,Dl]],{menu:[0,"menu"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(70,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(71,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["settings"])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(n,t,e){var r=!0;return"mousedown"===t&&(r=!1!==l._22(n,78)._handleMousedown(e)&&r),"keydown"===t&&(r=!1!==l._22(n,78)._handleKeydown(e)&&r),"click"===t&&(r=!1!==l._22(n,78)._handleClick(e)&&r),r},i_,r_)),l._8(76,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(77,16384,null,0,Fs,[],null,null),l._8(78,1196032,null,0,ku,[Pi,l.l,l.R,xu,[2,wu],[8,null],[2,Dl]],{menu:[0,"menu"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(80,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(81,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["menu"])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,8,0,!1),n(t,13,0,n(t,14,0,"/settings/network")),n(t,20,0,n(t,21,0,"/settings/blockchain")),n(t,27,0,n(t,28,0,"/settings/outputs")),n(t,34,0,n(t,35,0,"/settings/pending-transactions")),n(t,40,0,e.appService.version),n(t,44,0,!1),n(t,49,0,n(t,50,0,"/settings/backup")),n(t,62,0,e.language),n(t,68,0,l._22(t,8)),n(t,71,0),n(t,78,0,l._22(t,44)),n(t,81,0)},function(n,t){var e=t.component;n(t,3,0,e.headline),n(t,11,0,l._22(t,12)._highlighted,l._22(t,12)._triggersSubmenu,l._22(t,12)._getTabIndex(),l._22(t,12).disabled.toString(),l._22(t,12).disabled||null),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("title.network"))),n(t,18,0,l._22(t,19)._highlighted,l._22(t,19)._triggersSubmenu,l._22(t,19)._getTabIndex(),l._22(t,19).disabled.toString(),l._22(t,19).disabled||null),n(t,22,0,l._32(t,22,0,l._22(t,23).transform("title.blockchain"))),n(t,25,0,l._22(t,26)._highlighted,l._22(t,26)._triggersSubmenu,l._22(t,26)._getTabIndex(),l._22(t,26).disabled.toString(),l._22(t,26).disabled||null),n(t,29,0,l._32(t,29,0,l._22(t,30).transform("title.outputs"))),n(t,32,0,l._22(t,33)._highlighted,l._22(t,33)._triggersSubmenu,l._22(t,33)._getTabIndex(),l._22(t,33).disabled.toString(),l._22(t,33).disabled||null),n(t,36,0,l._32(t,36,0,l._22(t,37).transform("title.pending-txs"))),n(t,47,0,l._22(t,48)._highlighted,l._22(t,48)._triggersSubmenu,l._22(t,48)._getTabIndex(),l._22(t,48).disabled.toString(),l._22(t,48).disabled||null),n(t,51,0,l._32(t,51,0,l._22(t,52).transform("title.backup"))),n(t,54,0,e.appService.explorerUrl,l._22(t,55)._highlighted,l._22(t,55)._triggersSubmenu,l._22(t,55)._getTabIndex(),l._22(t,55).disabled.toString(),l._22(t,55).disabled||null),n(t,56,0,l._32(t,56,0,l._22(t,57).transform("title.explorer"))),n(t,65,0,l._22(t,66).disabled||null),n(t,75,0,l._22(t,76).disabled||null)})}var g_=l._7({encapsulation:0,styles:[[".button-container[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{border-radius:25px;height:50px;margin:20px 10px 0;width:160px;overflow:hidden}button.enabled[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);-webkit-box-shadow:none;box-shadow:none;color:#1e2227}mat-icon[_ngcontent-%COMP%]{margin-left:10px;opacity:.3;line-height:20px}mat-spinner[_ngcontent-%COMP%]{display:inline-block;height:24px!important;width:24px!important;margin-left:10px;position:relative;top:-2px}"]],data:{}});function y_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(1,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["done"]))],function(n,t){n(t,1,0)},null)}function b_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(1,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["error"]))],function(n,t){n(t,1,0)},null)}function v_(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-button mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function w_(n){return l._33(0,[l._29(402653184,1,{tooltip:0}),l._29(402653184,2,{button:0}),(n()(),l._9(2,0,null,null,21,"div",[["class","button-container"]],null,[[null,"mouseenter"],[null,"mouseleave"]],function(n,t,e){var l=!0,r=n.component;return"mouseenter"===t&&(l=0!=(r.mouseOver=!0)&&l),"mouseleave"===t&&(l=0!=(r.mouseOver=!1)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,16777216,null,null,18,"button",[["class","mat-button mat-raised-button"],["color","primary"],["mat-button",""],["mat-raised-button",""],["type","submit"]],[[8,"disabled",0]],[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0,i=n.component;return"longpress"===t&&(r=!1!==l._22(n,10).show()&&r),"keydown"===t&&(r=!1!==l._22(n,10)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,10).hide(1500)&&r),"click"===t&&(r=!1!==(0!==i.state?i.onClick():null)&&r),r},i_,r_)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(6,{enabled:0}),l._8(7,180224,[[2,4],["button",4]],0,Bs,[l.l,Hl,Rr],{disabled:[0,"disabled"],color:[1,"color"]},null),l._8(8,16384,null,0,Hs,[],null,null),l._8(9,16384,null,0,Ns,[],null,null),l._8(10,147456,[[1,4],["tooltip",4]],0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),(n()(),l._31(-1,0,["\n "])),l._21(0,0),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,y_)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,b_)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,v_)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,n(t,6,0,!e.disabled)),n(t,7,0,e.disabled&&!e.forceEmitEvents,"primary"),n(t,10,0,e.error?e.error:null),n(t,15,0,1===e.state),n(t,18,0,2===e.state),n(t,21,0,0===e.state)},function(n,t){n(t,4,0,l._22(t,7).disabled||null)})}var x_=l._7({encapsulation:0,styles:[[".-small-button[_ngcontent-%COMP%] button{width:unset;height:unset;padding:0 10px;min-width:100px;margin:unset;font-size:13px}.-toggle[_ngcontent-%COMP%] button{-webkit-box-shadow:unset;box-shadow:unset;background-color:rgba(0,0,0,0)!important;line-height:unset!important;min-height:26px}.-toggle[_ngcontent-%COMP%] button span{color:#171a1d;line-height:unset!important}.-toggle[_ngcontent-%COMP%] button.enabled{background-color:#171a1d!important}.-toggle[_ngcontent-%COMP%] button.enabled span{color:#fafafa}.-buttons-container[_ngcontent-%COMP%]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:5px;background:rgba(255,255,255,.1);border-radius:100px;margin:0 auto;text-align:center}.light.-buttons-container[_ngcontent-%COMP%]{background:#f1f1f1}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled{background-color:#fff!important}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled span{color:#1e2227}@media (min-width:768px) and (max-width:991px){.-buttons-container.navbar.light[_ngcontent-%COMP%]{border-radius:20px}.-buttons-container.navbar.light[_ngcontent-%COMP%] app-button[_ngcontent-%COMP%] .button-container{display:block}}.small.-buttons-container[_ngcontent-%COMP%]{padding:2px;line-height:0}.small[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button{padding:0 10px;min-width:70px;font-size:9px;min-height:16px}"]],data:{}});function M_(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[],[[8,"className",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.onLeftClick()&&l),l},w_,g_)),l._8(3,49152,null,0,Lc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(n()(),l._31(4,0,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.onRightClick()&&l),l},w_,g_)),l._8(7,49152,null,0,Lc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(n()(),l._31(8,0,["",""])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.activeButton!==e.ButtonState.LeftButton,!0),n(t,7,0,e.activeButton!==e.ButtonState.RightButton,!0)},function(n,t){var e=t.component;n(t,0,0,l._12(1,"-buttons-container ",e.className,"")),n(t,4,0,e.leftButtonText),n(t,8,0,e.rightButtonText)})}var k_=function(){function n(n){this.navbarService=n,this.otcEnabled=Ll.otcEnabled,this.exchangeEnabled=!!r.swaplab.apiKey}return n.prototype.changeActiveComponent=function(n){this.navbarService.setActiveComponent(n)},n}(),C_=l._7({encapsulation:0,styles:[["[_nghost-%COMP%]{background-color:#fbfbfb;min-height:66px}.-buttons[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;float:left;height:66px;padding:17px 0;width:32px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-block;font-size:14px;height:66px;line-height:66px;margin:0 5px}.-buttons[_ngcontent-%COMP%] .-low-opacity[_ngcontent-%COMP%]{opacity:.2}.-buttons[_ngcontent-%COMP%] .-switch[_ngcontent-%COMP%]{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;padding:0 20px}"]],data:{}});function S_(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/exchange"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1).onClick()&&r),r},null,null)),l._8(1,16384,[[7,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(2,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,7,{links:1}),l._29(603979776,8,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,0,"img",[["src","../../../../../assets/img/money-gold.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,"/exchange"),n(t,2,0,"no-opacity")},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("title.buy-coin")))})}function O_(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-button"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["src","../../../../../assets/img/money-gold.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[["class","secondary-color"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("title.buy-coin")))})}function T_(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"app-double-button",[["class","-switch"],["className","light navbar"]],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeActiveComponent(e)&&l),l},M_,x_)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"-switch":0,"element-disabled":1}),l._8(3,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,nn,[l.h])],function(n,t){var e=t.component;n(t,1,0,"-switch",n(t,2,0,!0,e.navbarService.switchDiabled)),n(t,3,0,l._32(t,3,0,l._22(t,4).transform(e.navbarService.rightText)),l._32(t,3,1,l._22(t,5).transform(e.navbarService.leftText)),l._32(t,3,2,l._22(t,6).transform(e.navbarService.activeComponent)),"light navbar")},null)}function L_(n){return l._33(0,[(n()(),l._9(0,0,null,null,54,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,51,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/wallets"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,5).onClick()&&r),r},null,null)),l._8(5,16384,[[1,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(6,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,1,{links:1}),l._29(603979776,2,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,0,"img",[["src","../../../../../assets/img/wallet-black.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/send"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,18).onClick()&&r),r},null,null)),l._8(18,16384,[[3,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(19,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,3,{links:1}),l._29(603979776,4,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,0,"img",[["src","../../../../../assets/img/send-black.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(26,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/transactions"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,31).onClick()&&r),r},null,null)),l._8(31,16384,[[5,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(32,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,5,{links:1}),l._29(603979776,6,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,0,"img",[["src","../../../../../assets/img/transactions-black.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(39,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,S_)),l._8(46,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,O_)),l._8(49,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,T_)),l._8(52,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,"/wallets"),n(t,6,0,"no-opacity"),n(t,18,0,"/send"),n(t,19,0,"no-opacity"),n(t,31,0,"/transactions"),n(t,32,0,"no-opacity"),n(t,46,0,e.exchangeEnabled),n(t,49,0,e.otcEnabled),n(t,52,0,e.navbarService.switchVisible)},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("title.wallets"))),n(t,26,0,l._32(t,26,0,l._22(t,27).transform("title.send"))),n(t,39,0,l._32(t,39,0,l._22(t,40).transform("title.history")))})}o.a.prototype.skip=function(n){return function(n){return function(t){return t.lift(new yc(n))}}(n)(this)},o.a.prototype.take=function(n){return Object(_r.a)(n)(this)};var P_=function(){function n(n,t,e,l,r){this.appService=n,this.networkService=t,this.blockchainService=e,this.priceService=l,this.walletService=r,this.addresses=[],this.querying=!0,this.synchronized=!0,this.walletDownloadUrl=Ll.walletDownloadUrl,this.subscriptionsGroup=[]}return Object.defineProperty(n.prototype,"loading",{get:function(){return!(this.current&&this.highest&&this.current===this.highest&&this.coins&&"NaN"!==this.coins&&this.hours&&"NaN"!==this.hours)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"coins",{get:function(){var n=new Ae.BigNumber("0");return this.addresses.map(function(t){return n=n.plus(t.coins)}),n.decimalPlaces(6).toString()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hours",{get:function(){var n=new Ae.BigNumber("0");return this.addresses.map(function(t){return n=n.plus(t.hours)}),n.decimalPlaces(0).toString()},enumerable:!0,configurable:!0}),n.prototype.ngOnInit=function(){var n=this;this.subscriptionsGroup.push(this.blockchainService.progress.filter(function(n){return!!n}).subscribe(function(t){n.querying=!1,n.highest=t.highest,n.current=t.current,n.percentage=n.current&&n.highest?n.current/n.highest:0,n.synchronizedSubscription||(n.synchronizedSubscription=n.blockchainService.synchronized.subscribe(function(t){return n.synchronized=t}))})),this.subscriptionsGroup.push(this.priceService.price.subscribe(function(t){return n.price=t})),this.subscriptionsGroup.push(this.walletService.allAddresses().subscribe(function(t){n.addresses=t.reduce(function(n,t){return n.find(function(n){return n.address===t.address})||n.push(t),n},[])})),this.subscriptionsGroup.push(this.walletService.pendingTransactions().subscribe(function(t){n.hasPendingTxs=t.user.length>0}))},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.synchronizedSubscription&&this.synchronizedSubscription.unsubscribe()},n}(),D_=l._7({encapsulation:0,styles:[[".-container[_ngcontent-%COMP%]{background-color:#fbfbfb;border-bottom:2px solid rgba(30,34,39,.05)}.large-header[_ngcontent-%COMP%]{background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(rgba(0,114,255,.7)),to(rgba(0,195,255,.7))),url(header.03fb33b04c982a1a804d.png) center center no-repeat;background:linear-gradient(to bottom right,rgba(0,114,255,.7),rgba(0,195,255,.7)),url(header.03fb33b04c982a1a804d.png) center center no-repeat;background-size:100% auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;min-height:190px}.balance-container[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#fafafa;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;font-size:12px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%]{line-height:1;margin:0 0 .5em}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:4em}.balance-container[_ngcontent-%COMP%] .dollars[_ngcontent-%COMP%]{margin:0}.hour-balance[_ngcontent-%COMP%]{text-align:center}.hour-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{background-color:rgba(255,255,255,.3);border-radius:15px;color:#171a1d;display:inline-block;font-size:12px;line-height:22px;margin:1em 0 2em;padding:0 30px}.notification-bar[_ngcontent-%COMP%]{background-color:#f44a4d;color:#fbfbfb}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{margin:auto}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{text-decoration:none;color:#ffebee}"]],data:{}});function A_(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"p",[["class","coins"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(2,null,["",""])),l._27(3,2)],null,function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,n(t,3,0,l._22(t.parent,0),e.percentage,"1.2-2")))})}function E_(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"p",[["class","coins"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(2,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(4,null,[" ",""])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,l._22(t,3).transform(e.coins,!0,"first"))),n(t,4,0,l._32(t,4,0,l._22(t,5).transform(e.coins,!0,"last")))})}function Y_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[["class","coins"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\xa0"]))],null,null)}function j_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._27(2,4)],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,n(t,2,0,l._22(t.parent.parent,1),e.coins*e.price,"USD","symbol","1.2-2")))})}function I_(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["-"]))],null,null)}function R_(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,j_)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,I_)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(7,null,["\n (",")\n "])),l._27(8,4)],function(n,t){var e=t.component;n(t,3,0,!e.loading),n(t,6,0,e.loading)},function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,n(t,8,0,l._22(t.parent,1),e.price,"USD","symbol","1.2-2")))})}function H_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("common.loading")))})}function N_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.syncing-blocks")),e.current&&e.highest?"("+e.current+"/"+e.highest+")":"...")})}function F_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.hours,!1)))})}function B_(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-progress-bar",[["aria-valuemax","100"],["aria-valuemin","0"],["class","example-margin mat-progress-bar"],["color","primary"],["role","progressbar"]],[[1,"aria-valuenow",0],[1,"mode",0],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null]],null,null,u_,a_)),l._8(1,49152,null,0,Nu,[],{color:[0,"color"],value:[1,"value"],mode:[2,"mode"]},null)],function(n,t){var e=t.component;n(t,1,0,"primary",100*e.percentage,e.querying?"query":"determinate")},function(n,t){n(t,0,0,l._22(t,1).value,l._22(t,1).mode,"primary"==l._22(t,1).color,"accent"==l._22(t,1).color,"warn"==l._22(t,1).color)})}function V_(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,1,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,6,"div",[],null,null,null,null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(7,0,null,null,1,"a",[["rel","noreferrer nofollow"],["target","_blank"]],[[8,"href",4]],null,null,null,null)),(n()(),l._31(8,null,["v",""])),(n()(),l._31(9,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],null,function(n,t){var e=t.component;n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("header.update1"))),n(t,7,0,e.walletDownloadUrl),n(t,8,0,e.appService.lastestVersion),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("header.update2")))})}function W_(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,2,"a",[["href","https://web.telegram.org/#/im?p=@skycoinsupport"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(4,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(6,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.errors.no-backend1"))),n(t,4,0,l._32(t,4,0,l._22(t,5).transform("header.errors.no-backend2"))),n(t,6,0,l._32(t,6,0,l._22(t,7).transform("header.errors.no-backend3")))})}function z_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.errors.csrf")))})}function U_(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,2,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,W_)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,z_)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "]))],function(n,t){var e=t.component;n(t,5,0,2===e.appService.error),n(t,8,0,3===e.appService.error)},function(n,t){n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length)})}function G_(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,3,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],null,function(n,t){n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("header.errors.no-connections")))})}function q_(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,3,"a",[["routerLink","/settings/pending-transactions"]],[[1,"target",0],[8,"href",4]],[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,4).onClick(e.button,e.ctrlKey,e.metaKey,e.shiftKey)&&r),r},null,null)),l._8(4,671744,null,0,fp,[cp,Ch,u],{routerLink:[0,"routerLink"]},null),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(7,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,4,0,"/settings/pending-transactions")},function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.pending-txs1"))),n(t,3,0,l._22(t,4).target,l._22(t,4).href),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("header.pending-txs2"))),n(t,7,0,l._32(t,7,0,l._22(t,8).transform("header.pending-txs3")))})}function J_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.synchronizing")))})}function Q_(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,4,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,q_)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,J_)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "]))],function(n,t){var e=t.component;n(t,5,0,e.hasPendingTxs),n(t,8,0,!e.synchronized&&!e.hasPendingTxs)},function(n,t){n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length)})}function K_(n){return l._33(0,[l._25(0,en,[l.w]),l._25(0,ln,[l.w]),(n()(),l._9(2,0,null,null,58,"div",[["class","-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,37,"div",[["class","large-header"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,1,"app-top-bar",[],null,null,null,m_,p_)),l._8(7,245760,null,0,h_,[gf,Bc,fa],{headline:[0,"headline"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,22,"div",[["class","balance-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,19,"div",[["class","balance"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,A_)),l._8(14,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,E_)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Y_)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,7,"p",[["class","dollars"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,R_)),l._8(25,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,H_)),l._8(28,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,7,"div",[["class","hour-balance"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,N_)),l._8(36,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,F_)),l._8(39,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,1,"app-nav-bar",[],null,null,null,L_,C_)),l._8(44,49152,null,0,k_,[Vp],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,B_)),l._8(47,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,V_)),l._8(50,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,U_)),l._8(53,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,G_)),l._8(56,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Q_)),l._8(59,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,7,0,e.headline),n(t,14,0,e.highest&&e.loading),n(t,17,0,!e.loading),n(t,20,0,!e.highest&&e.loading),n(t,25,0,e.price),n(t,28,0,!e.price),n(t,36,0,e.loading),n(t,39,0,!e.loading),n(t,47,0,e.loading),n(t,50,0,e.appService.updateAvailable),n(t,53,0,e.appService.error),n(t,56,0,!e.appService.error&&e.networkService.noConnections),n(t,59,0,e.hasPendingTxs||!e.synchronized)},null)}var X_=l._7({encapsulation:0,styles:[[".-width-130[_ngcontent-%COMP%]{width:130px;-ms-flex-negative:0;flex-shrink:0}.-width-250[_ngcontent-%COMP%]{width:250px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;padding-right:20px}.-headers[_ngcontent-%COMP%]{color:rgba(30,34,39,.2);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;padding:0 130px 0 50px}.-wallets[_ngcontent-%COMP%]{margin:0 30px}.-body[_ngcontent-%COMP%]{border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:0 0 10px}.-wallet[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid rgba(30,34,39,.05);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px;line-height:60px;height:60px;padding-left:20px;cursor:pointer}.-wallet[_ngcontent-%COMP%]:first-child{border-top-left-radius:10px;border-top-right-radius:10px}.-wallet[_ngcontent-%COMP%]:last-child{border-bottom-left-radius:10px;border-bottom-right-radius:10px}.-wallet[_ngcontent-%COMP%] .-label[_ngcontent-%COMP%]{color:#1e2227}.-wallet[_ngcontent-%COMP%] .-hours[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);text-align:right}.-wallet[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#1e2227;text-align:right}.-wallet[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%]{padding-left:20px}.-wallet[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{border-radius:50%;background-color:#f7f7f7;display:inline-block;height:38px;margin:11px 0;padding:3px;width:38px;cursor:pointer}.-wallet[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:85px;margin-right:15px;-ms-flex-negative:0;flex-shrink:0}.-wallet[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;height:32px}.-text-right[_ngcontent-%COMP%]{text-align:right}.action-buttons[_ngcontent-%COMP%]{margin-bottom:74px;padding:40px 0;text-align:center}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{background-color:#f7f7f7;border:none;-webkit-box-shadow:none;box-shadow:none;color:rgba(30,34,39,.5);font-size:13px;margin:0 5px;min-width:140px}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:28px;margin-left:-4px;width:28px}"]],data:{}});function Z_(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,2,"img",[["src","../../../../assets/img/lock-gold.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("wallet.encryption-enabled")))},null)}function $_(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,2,"img",[["src","../../../../assets/img/unlock-grey.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("wallet.encryption-disabled")))},null)}function nm(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,2,"img",[["src","../../../../assets/img/alert-red.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("wallet.hw-security-warning")))},null)}function tm(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-wallet-detail",[],null,null,null,e_,Vf)),l._8(1,180224,null,0,Bf,[fa,Sc,jc,oc,De.j,cp,Ye],{wallet:[0,"wallet"]},null)],function(n,t){n(t,1,0,t.parent.context.$implicit)},null)}function em(n){return l._33(0,[(n()(),l._9(0,0,null,null,40,"div",[["class","-wallets"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,37,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,31,"div",[["class","-wallet"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleWallet(n.context.$implicit)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,1,"div",[["class","-width-250 -label"]],[[1,"title",0]],null,null,null,null)),(n()(),l._31(7,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,10,"div",[["class","-flex-fill -encryption"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Z_)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,$_)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,nm)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,2,"div",[["class","-width-130 -coins"]],null,null,null,null,null)),(n()(),l._31(22,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,2,"div",[["class","-width-130 -hours"]],null,null,null,null,null)),(n()(),l._31(26,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,5,"div",[["class","-expand"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(31,0,null,null,2,"img",[["src","../../../../assets/img/chevron-right-grey.png"]],null,null,null,null,null)),l._8(32,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(33,{"rotate-270":0,"rotate-90":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,tm)),l._8(38,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,12,0,t.context.$implicit.encrypted&&!t.context.$implicit.isHardware),n(t,15,0,!t.context.$implicit.encrypted&&!t.context.$implicit.isHardware),n(t,18,0,t.context.$implicit.hasHwSecurityWarnings&&t.context.$implicit.isHardware),n(t,32,0,n(t,33,0,t.context.$implicit.opened,!t.context.$implicit.opened)),n(t,38,0,t.context.$implicit.opened)},function(n,t){n(t,6,0,t.context.$implicit.label),n(t,7,0,t.context.$implicit.label),n(t,22,0,l._32(t,22,0,l._22(t,23).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0,!0,"first"))),n(t,26,0,l._32(t,26,0,l._22(t,27).transform(t.context.$implicit.hours?t.context.$implicit.hours.toString():0,!1,"first")))})}function lm(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,15,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"div",[["class","-width-250"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,0,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"div",[["class","-width-130 -text-right"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-width-130 -text-right"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,em)),l._8(20,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,20,0,0===t.parent.context.$implicit?e.hardwareWallets:e.wallets)},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform(0===t.parent.context.$implicit?"wallet.hardware-wallet":"wallet.wallet"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("coin"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("hours")))})}function rm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,lm)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,0===t.context.$implicit&&e.hardwareWallets.length>0||1===t.context.$implicit&&e.wallets.length>0)},null)}function im(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"button",[["class","mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.adminHwWallet()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,0,"img",[["src","../../../../assets/img/hw-gold.png"]],null,null,null,null,null)),(n()(),l._31(5,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("wallet.hardware-wallet")))})}function om(n){return l._33(0,[(n()(),l._9(0,0,null,null,34,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,27,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,2,null,rm)),l._8(9,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),l._24(10,2),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(12,0,null,null,20,"div",[["class","action-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,6,"button",[["class","mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addWallet(!0)&&l),l},i_,r_)),l._8(15,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(16,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(18,0,null,0,0,"img",[["src","../../../../assets/img/plus-gold.png"]],null,null,null,null,null)),(n()(),l._31(19,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,6,"button",[["class","mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addWallet(!1)&&l),l},i_,r_)),l._8(23,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(24,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(26,0,null,0,0,"img",[["src","../../../../assets/img/load-gold.png"]],null,null,null,null,null)),(n()(),l._31(27,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,im)),l._8(31,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.wallets"))),n(t,9,0,n(t,10,0,0,1)),n(t,31,0,e.hwCompatibilityActivated)},function(n,t){n(t,14,0,l._22(t,15).disabled||null),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("wallet.add"))),n(t,22,0,l._22(t,23).disabled||null),n(t,27,0,l._32(t,27,0,l._22(t,28).transform("wallet.load")))})}var sm=l._5("app-wallets",Np,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-wallets",[],null,null,null,om,X_)),l._8(1,245760,null,0,Np,[Sc,oc,fa,cp],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]);o.a.prototype.delay=function(n,t){return void 0===t&&(t=sl),Hi(n,t)(this)};var am=function(){function n(t,e,l,r,i){this.dialogRef=t,this.data=e,this.formBuilder=l,this.msgBarService=r,this.storageService=i,this.maxNoteChars=n.MAX_NOTE_CHARS}return n.prototype.ngOnInit=function(){this.originalNote=this.data.note?this.data.note:"",this.form=this.formBuilder.group({note:[this.data.note]})},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.OperationSubscription&&this.OperationSubscription.unsubscribe()},n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.changeNote=function(){var n=this;if(!this.button.isLoading()){var t=this.form.value.note?this.form.value.note.trim():"";this.originalNote!==t?(this.msgBarService.hide(),this.button.setLoading(),this.OperationSubscription=this.storageService.store(ec.NOTES,this.data.txid,t).subscribe(function(){n.dialogRef.close(t)},function(t){n.msgBarService.showError(t),n.button.resetState().setEnabled()})):this.closePopup()}},n.MAX_NOTE_CHARS=64,n}(),um=function(){function n(n,t,e,r,i,o,s,a,u,c,d){var h=this;this.formBuilder=n,this.blockchainService=t,this.walletService=e,this.dialog=r,this.msgBarService=i,this.navbarService=o,this.hwWalletService=s,this.translate=a,this.changeDetector=u,this.appService=c,this.onFormSubmitted=new l.o,this.maxNoteChars=am.MAX_NOTE_CHARS,this.transactions=[],this.busy=!1,this.doubleButtonActive=Fp,this.selectedCurrency=Fp.LeftButton,this.valueGreaterThanBalance=!1,this.subscriptionsGroup=[],this.subscriptionsGroup.push(d.price.subscribe(function(n){h.price=n,h.updateValue()}))}return n.prototype.ngOnInit=function(){var n=this;this.navbarService.showSwitch("send.simple","send.advanced"),this.initForm(),this.subscriptionsGroup.push(this.walletService.all().first().subscribe(function(t){n.wallets=t,1===t.length&&n.form.get("wallet").setValue(t[0])}))},n.prototype.ngOnDestroy=function(){this.processingSubscription&&!this.processingSubscription.closed&&this.processingSubscription.unsubscribe(),this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.closeSyncCheckSubscription(),this.navbarService.hideSwitch(),this.msgBarService.hide()},n.prototype.preview=function(){this.previewTx=!0,this.checkBeforeSending(),this.changeDetector.detectChanges()},n.prototype.send=function(){this.previewTx=!1,this.checkBeforeSending()},n.prototype.changeActiveCurrency=function(n){n!==this.selectedCurrency&&(this.selectedCurrency=n,this.askIfConvertAmount(),this.updateValue(),this.form.get("amount").updateValueAndValidity())},n.prototype.askIfConvertAmount=function(){var n=this;if(this.form.get("amount").value){var t=this.form.get("amount").value.trim(),e=new Ae.BigNumber(this.form.get("amount").value.trim());if(t&&!e.isNaN()){var l,r,i=this.translate.instant("common.usd"),o=this.appService.coinName;this.selectedCurrency===Fp.LeftButton?(l=i,r=o):(l=o,r=i);var s={text:this.translate.instant("send.convert-confirmation",{from:l,to:r}),headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"};Wc(this.dialog,s).afterClosed().subscribe(function(t){t&&n.convertAmount()})}}},n.prototype.convertAmount=function(){if(this.msgBarService.hide(),this.form.get("amount").value){var t,e=this.form.get("amount").value.trim(),l=new Ae.BigNumber(e);if(!e||l.isNaN())return void this.msgBarService.showWarning(this.translate.instant("send.invaid-amount-warning"));this.selectedCurrency===Fp.LeftButton?((t=l.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals)).multipliedBy(this.price).decimalPlaces(n.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR).isEqualTo(l)||this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")),this.form.get("amount").setValue(t.toString())):((t=l.multipliedBy(this.price).decimalPlaces(n.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)).dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals).isEqualTo(l)||this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")),this.form.get("amount").setValue(t.toString()))}},n.prototype.assignAll=function(){this.msgBarService.hide();var t=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:new Ae.BigNumber(-1);t.isEqualTo(-1)?this.msgBarService.showError(this.translate.instant("send.no-wallet-selected")):(this.selectedCurrency===Fp.RightButton&&(t=t.multipliedBy(this.price).decimalPlaces(n.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)),this.form.get("amount").setValue(t.toString()))},n.prototype.updateValue=function(){if(this.price)if(this.form&&null===this.validateAmount(this.form.get("amount"))){var n=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:-1;this.valueGreaterThanBalance=!1,this.selectedCurrency===Fp.LeftButton?(this.value=new Ae.BigNumber(this.form.get("amount").value).multipliedBy(this.price).decimalPlaces(2).toNumber(),n>0&&parseFloat(this.form.get("amount").value)>n&&(this.valueGreaterThanBalance=!0)):(this.value=new Ae.BigNumber(this.form.get("amount").value).dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals).toNumber(),n>0&&this.value>n&&(this.valueGreaterThanBalance=!0))}else this.value=-1;else this.value=null},n.prototype.checkBeforeSending=function(){var n=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.closeSyncCheckSubscription(),this.syncCheckSubscription=this.blockchainService.synchronized.first().subscribe(function(t){t?n.prepareTransaction():n.showSynchronizingWarning()}))},n.prototype.showSynchronizingWarning=function(){var n=this;Wc(this.dialog,{text:"send.synchronizing-warning",headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"}).afterClosed().subscribe(function(t){t&&n.prepareTransaction()})},n.prototype.prepareTransaction=function(){var n=this;if(this.msgBarService.hide(),this.previewButton.resetState(),this.sendButton.resetState(),!this.form.value.wallet.encrypted||this.form.value.wallet.isHardware||this.previewTx)!this.form.value.wallet.isHardware||this.previewTx?this.createTransaction():(this.showBusy(),this.processingSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.form.value.wallet.addresses[0].address).subscribe(function(){return n.createTransaction()},function(t){return n.showError(Tc(n.translate,t))}));else{var t=new oa;t.data={wallet:this.form.value.wallet},this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.createTransaction(t)})}},n.prototype.showBusy=function(){this.previewTx?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.busy=!0,this.navbarService.disableSwitch()},n.prototype.createTransaction=function(n){var t=this;this.showBusy(),this.processingSubscription=this.walletService.createTransaction(this.form.value.wallet,this.form.value.wallet.addresses.map(function(n){return n.address}),null,[{address:this.form.value.address.trim(),coins:(this.selectedCurrency===Fp.LeftButton?this.form.value.amount:this.value.toString()).trim()}],{type:"auto",mode:"share",share_factor:"0.5"},null,n?n.password:null,this.previewTx).subscribe(function(e){n&&n.close();var l=t.form.value.note.trim();t.previewTx?(t.onFormSubmitted.emit({form:{wallet:t.form.value.wallet,address:t.form.value.address.trim(),amount:t.form.value.amount,currency:t.selectedCurrency,note:l},amount:new Ae.BigNumber(t.form.value.amount),to:[t.form.value.address.trim()],transaction:e}),t.busy=!1,t.navbarService.enableSwitch()):t.processingSubscription=t.walletService.injectTransaction(e.encoded,l).subscribe(function(n){var e=!0;l&&!n&&(t.msgBarService.showWarning(t.translate.instant("send.error-saving-note")),e=!1),t.showSuccess(e)},function(n){return t.showError(n)})},function(e){n&&n.error(e),t.showError(e&&e.result?Tc(t.translate,e):e)})},n.prototype.showSuccess=function(n){var t=this;this.busy=!1,this.navbarService.enableSwitch(),this.resetForm(),n?(this.msgBarService.showDone("send.sent"),this.sendButton.resetState()):(this.sendButton.setSuccess(),setTimeout(function(){t.sendButton.resetState()},3e3))},n.prototype.showError=function(n){this.busy=!1,this.msgBarService.showError(n),this.navbarService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},n.prototype.initForm=function(){var n=this;this.form=this.formBuilder.group({wallet:["",Xi.required],address:[""],amount:["",Xi.required],note:[""]}),this.form.get("address").setValidators([this.validateAddress.bind(this)]),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){n.form.get("amount").setValidators([Xi.required,n.validateAmountWithValue.bind(n)]),n.form.get("amount").updateValueAndValidity()})),this.subscriptionsGroup.push(this.form.get("amount").valueChanges.subscribe(function(t){n.updateValue()})),this.formData&&Object.keys(this.form.controls).forEach(function(t){n.form.get(t)&&n.form.get(t).setValue(n.formData.form[t]),n.selectedCurrency=n.formData.form.currency})},n.prototype.validateAddress=function(n){if(!n.value||0===n.value.trim().length)return{Required:!0}},n.prototype.validateAmount=function(t){var e=t.value;e=e?e.trim():e;var l=new Ae.BigNumber(e);if(!e||l.isNaN()||l.isLessThanOrEqualTo(0))return{Invalid:!0};var r=e.split(".");if(this.selectedCurrency===Fp.LeftButton){if(2===r.length&&r[1].length>this.blockchainService.currentMaxDecimals)return{Invalid:!0}}else if(2===r.length&&r[1].length>n.MaxUsdDecimals)return{Invalid:!0};return null},n.prototype.validateAmountWithValue=function(n){var t=this.validateAmount(n);if(t)return t;var e=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:0;if(this.selectedCurrency===Fp.LeftButton){if(parseFloat(n.value)>e)return{Invalid:!0}}else if(this.updateValue(),this.value>e)return{Invalid:!0};return null},n.prototype.resetForm=function(){this.form.get("wallet").setValue(""),this.form.get("address").setValue(""),this.form.get("amount").setValue(""),this.form.get("note").setValue(""),this.selectedCurrency=Fp.LeftButton},n.prototype.closeSyncCheckSubscription=function(){this.syncCheckSubscription&&this.syncCheckSubscription.unsubscribe()},n.MaxUsdDecimals=6,n}(),cm=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.amount-label[_ngcontent-%COMP%]{display:inline-block}label[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}"]],data:{}});function dm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform(t.parent.context.$implicit.coins?t.parent.context.$implicit.coins.toString():0)),l._32(t,1,1,l._22(t,3).transform(t.parent.context.$implicit.hours.toString(),!1)))})}function hm(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"option",[],[[8,"disabled",0]],null,null,null,null)),l._8(1,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(2,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(3,null,["\n "," -\n "])),(n()(),l._4(16777216,null,null,1,null,dm)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,t.context.$implicit),n(t,2,0,t.context.$implicit),n(t,5,0,t.context.$implicit.coins&&t.context.$implicit.hours)},function(n,t){n(t,0,0,!t.context.$implicit.coins||t.context.$implicit.coins.isLessThanOrEqualTo(0)),n(t,3,0,t.context.$implicit.label)})}function pm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,hm)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.wallets)},null)}function fm(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[["class","coin-selector-container"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,3,"app-double-button",[["className","light small"]],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeActiveCurrency(e)&&l),l},M_,x_)),l._8(5,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,"coin-selector-container",n(t,2,0,e.busy)),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("common.usd")),l._32(t,5,1,l._22(t,7).transform("coin")),e.selectedCurrency,"light small")},null)}function _m(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("send.invalid-amount")))})}function mm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ "," ","\n "])),l._27(2,2),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,n(t,2,0,l._22(t.parent,0),e.value,"1.0-2")),l._32(t,1,1,l._22(t,3).transform("common.usd")))})}function gm(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ ","\n "])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.value)))})}function ym(n){return l._33(0,[l._25(0,tn,[l.w]),l._29(402653184,1,{previewButton:0}),l._29(402653184,2,{sendButton:0}),(n()(),l._9(3,0,null,null,127,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,4).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,4).onReset()&&r),r},null,null)),l._8(4,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(6,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,27,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"label",[["for","wallet"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,17,"select",[["formControlName","wallet"],["id","wallet"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,19).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,19).onTouched()&&r),r},null,null)),l._8(17,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(18,{"element-disabled":0}),l._8(19,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(21,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,4,"option",[["disabled",""],["hidden",""]],null,null,null,null,null)),l._8(26,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(27,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(28,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,pm)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,2,"label",[["for","address"]],null,null,null,null,null)),(n()(),l._31(40,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,5,"input",[["formControlName","address"],["id","address"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,44)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,44).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,44)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,44)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(44,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(46,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(48,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(51,0,null,null,43,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(53,0,null,null,2,"label",[["class","amount-label"],["for","amount"]],null,null,null,null,null)),(n()(),l._31(54,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,fm)),l._8(58,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(60,0,null,null,13,"div",[["class","-input-addon"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(62,0,null,null,5,"input",[["formControlName","amount"],["id","amount"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,63)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,63).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,63)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,63)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(63,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(69,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(70,null,["",""])),l._25(0,l_,[gf]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,0,null,null,18,"div",[["class","coins-value-label"]],null,null,null,null,null)),l._8(76,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(77,{red:0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,_m)),l._8(80,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,mm)),l._8(83,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gm)),l._8(86,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(88,0,null,null,4,"div",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.assignAll()&&l),l},null,null)),l._8(89,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(90,{"centerd-link":0}),(n()(),l._31(91,null,["(",")"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(96,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(98,0,null,null,8,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(99,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(101,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,103).show()&&r),"keydown"===t&&(r=!1!==l._22(n,103)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,103).hide(1500)&&r),r},Hf,Rf)),l._8(102,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(103,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(108,0,null,null,7,"input",[["formControlName","note"],["id","note"]],[[1,"disabled",0],[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,109)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,109).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,109)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,109)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.preview()&&r),r},null,null)),l._8(109,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(110,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(113,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(115,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(118,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(120,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.preview()&&l),l},w_,g_)),l._8(121,49152,[[1,4],["previewButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(122,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(125,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.send()&&l),l},w_,g_)),l._8(126,49152,[[2,4],["sendButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(127,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,e.form),n(t,17,0,n(t,18,0,e.busy)),n(t,21,0,"wallet"),n(t,26,0,""),n(t,27,0,""),n(t,32,0,e.wallets),n(t,46,0,"address"),n(t,58,0,e.price),n(t,65,0,"amount"),n(t,76,0,"coins-value-label",n(t,77,0,e.value>=0&&e.valueGreaterThanBalance)),n(t,80,0,e.price&&e.value<0),n(t,83,0,e.price&&e.value>=0&&e.selectedCurrency===e.doubleButtonActive.LeftButton),n(t,86,0,e.price&&e.value>=0&&e.selectedCurrency===e.doubleButtonActive.RightButton),n(t,89,0,"link",n(t,90,0,!e.price)),n(t,102,0),n(t,103,0,l._32(t,103,0,l._22(t,104).transform("send.personal-note-help"))),n(t,110,0,e.maxNoteChars),n(t,113,0,"note"),n(t,121,0,!e.form.valid),n(t,126,0,!e.form.valid)},function(n,t){var e=t.component;n(t,3,0,l._22(t,6).ngClassUntouched,l._22(t,6).ngClassTouched,l._22(t,6).ngClassPristine,l._22(t,6).ngClassDirty,l._22(t,6).ngClassValid,l._22(t,6).ngClassInvalid,l._22(t,6).ngClassPending),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("send.from-label"))),n(t,16,0,e.busy?"true":null,l._22(t,23).ngClassUntouched,l._22(t,23).ngClassTouched,l._22(t,23).ngClassPristine,l._22(t,23).ngClassDirty,l._22(t,23).ngClassValid,l._22(t,23).ngClassInvalid,l._22(t,23).ngClassPending),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("send.select-wallet"))),n(t,40,0,l._32(t,40,0,l._22(t,41).transform("send.to-label"))),n(t,43,0,e.busy?"true":null,l._22(t,48).ngClassUntouched,l._22(t,48).ngClassTouched,l._22(t,48).ngClassPristine,l._22(t,48).ngClassDirty,l._22(t,48).ngClassValid,l._22(t,48).ngClassInvalid,l._22(t,48).ngClassPending),n(t,54,0,l._32(t,54,0,l._22(t,55).transform("send.amount-label"))),n(t,62,0,e.busy?"true":null,l._22(t,67).ngClassUntouched,l._22(t,67).ngClassTouched,l._22(t,67).ngClassPristine,l._22(t,67).ngClassDirty,l._22(t,67).ngClassValid,l._22(t,67).ngClassInvalid,l._22(t,67).ngClassPending),n(t,70,0,l._32(t,70,0,e.selectedCurrency===e.doubleButtonActive.LeftButton?l._22(t,71).transform("coin"):l._22(t,72).transform("common.usd"))),n(t,91,0,l._32(t,91,0,l._22(t,92).transform("send.send-all-available-coins"))),n(t,99,0,l._32(t,99,0,l._22(t,100).transform("send.personal-note-label"))),n(t,108,0,e.busy?"true":null,l._22(t,110).maxlength?l._22(t,110).maxlength:null,l._22(t,115).ngClassUntouched,l._22(t,115).ngClassTouched,l._22(t,115).ngClassPristine,l._22(t,115).ngClassDirty,l._22(t,115).ngClassValid,l._22(t,115).ngClassInvalid,l._22(t,115).ngClassPending),n(t,122,0,l._32(t,122,0,l._22(t,123).transform("send.preview-button"))),n(t,127,0,l._32(t,127,0,l._22(t,128).transform("send.send-button")))})}var bm=l._7({encapsulation:2,styles:[],data:{}});function vm(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-pseudo-checkbox",[["class","mat-option-pseudo-checkbox mat-pseudo-checkbox"]],[[2,"mat-pseudo-checkbox-indeterminate",null],[2,"mat-pseudo-checkbox-checked",null],[2,"mat-pseudo-checkbox-disabled",null]],null,null,Cm,km)),l._8(1,49152,null,0,sr,[],{state:[0,"state"],disabled:[1,"disabled"]},null)],function(n,t){var e=t.component;n(t,1,0,e.selected?"checked":"",e.disabled)},function(n,t){n(t,0,0,"indeterminate"===l._22(t,1).state,"checked"===l._22(t,1).state,l._22(t,1).disabled)})}function wm(n){return l._33(2,[(n()(),l._4(16777216,null,null,1,null,vm)),l._8(1,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._9(2,0,null,null,1,"span",[["class","mat-option-text"]],null,null,null,null,null)),l._21(null,0),(n()(),l._9(4,0,null,null,1,"div",[["class","mat-option-ripple mat-ripple"],["mat-ripple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(5,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(n,t){var e=t.component;n(t,1,0,e.multiple),n(t,5,0,e.disabled||e.disableRipple,e._getHostElement())},function(n,t){n(t,4,0,l._22(t,5).unbounded)})}var xm=l._7({encapsulation:2,styles:[],data:{}});function Mm(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,"label",[["class","mat-optgroup-label"]],[[8,"id",0]],null,null,null,null)),(n()(),l._31(1,null,["",""])),l._21(null,0)],null,function(n,t){var e=t.component;n(t,0,0,e._labelId),n(t,1,0,e.label)})}var km=l._7({encapsulation:2,styles:[".mat-pseudo-checkbox{width:20px;height:20px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:'';border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:9px;left:2px;width:16px;opacity:1}.mat-pseudo-checkbox-checked::after{top:5px;left:3px;width:12px;height:5px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1}"],data:{}});function Cm(n){return l._33(2,[],null,null)}var Sm=l._7({encapsulation:2,styles:[".mat-select{display:inline-block;width:100%;outline:0}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}@media screen and (-ms-high-contrast:active){.mat-select-panel{outline:solid 1px}}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;transition:none}"],data:{animation:[{type:7,name:"transformPanel",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 32px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:0,name:"showing-multiple",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 64px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0,minWidth:"100%",transform:"scaleY(0)"},offset:null},{type:4,styles:null,timings:"150ms cubic-bezier(0.25, 0.8, 0.25, 1)"}],options:null},{type:1,expr:"* => void",animation:[{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"250ms 100ms linear"}],options:null}],options:{}},{type:7,name:"fadeInContent",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => showing",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"150ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function Om(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[["class","mat-select-placeholder"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.placeholder||"\xa0")})}function Tm(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.triggerValue)})}function Lm(n){return l._33(0,[l._21(null,0),(n()(),l._4(0,null,null,0))],null,null)}function Pm(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"span",[["class","mat-select-value-text"]],null,null,null,null,null)),l._8(1,16384,null,0,Y,[],{ngSwitch:[0,"ngSwitch"]},null),(n()(),l._4(16777216,null,null,1,null,Tm)),l._8(3,16384,null,0,I,[l.R,l.O,Y],null,null),(n()(),l._4(16777216,null,null,1,null,Lm)),l._8(5,278528,null,0,j,[l.R,l.O,Y],{ngSwitchCase:[0,"ngSwitchCase"]},null)],function(n,t){n(t,1,0,!!t.component.customTrigger),n(t,5,0,!0)},null)}function Dm(n){return l._33(0,[(n()(),l._9(0,0,[[2,0],["panel",1]],null,3,"div",[],[[24,"@transformPanel",0],[4,"transformOrigin",null],[2,"mat-select-panel-done-animating",null],[4,"font-size","px"]],[[null,"@transformPanel.done"]],function(n,t,e){var l=!0;return"@transformPanel.done"===t&&(l=!1!==n.component._onPanelDone()&&l),l},null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-select-content"]],[[24,"@fadeInContent",0]],[[null,"@fadeInContent.done"]],function(n,t,e){var l=!0;return"@fadeInContent.done"===t&&(l=!1!==n.component._onFadeInDone()&&l),l},null,null)),l._21(null,1)],function(n,t){var e=t.component;n(t,1,0,l._12(1,"mat-select-panel ",e._getPanelTheme(),""),e.panelClass)},function(n,t){var e=t.component;n(t,0,0,e.multiple?"showing-multiple":"showing",e._transformOrigin,e._panelDoneAnimating,e._triggerFontSize),n(t,2,0,"showing")})}function Am(n){return l._33(2,[l._29(402653184,1,{trigger:0}),l._29(671088640,2,{panel:0}),l._29(402653184,3,{overlayDir:0}),(n()(),l._9(3,0,[[1,0],["trigger",1]],null,9,"div",[["aria-hidden","true"],["cdk-overlay-origin",""],["class","mat-select-trigger"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggle()&&l),l},null,null)),l._8(4,16384,[["origin",4]],0,Yi,[l.l],null,null),(n()(),l._9(5,0,null,null,5,"div",[["class","mat-select-value"]],null,null,null,null,null)),l._8(6,16384,null,0,Y,[],{ngSwitch:[0,"ngSwitch"]},null),(n()(),l._4(16777216,null,null,1,null,Om)),l._8(8,278528,null,0,j,[l.R,l.O,Y],{ngSwitchCase:[0,"ngSwitchCase"]},null),(n()(),l._4(16777216,null,null,1,null,Pm)),l._8(10,278528,null,0,j,[l.R,l.O,Y],{ngSwitchCase:[0,"ngSwitchCase"]},null),(n()(),l._9(11,0,null,null,1,"div",[["class","mat-select-arrow-wrapper"]],null,null,null,null,null)),(n()(),l._9(12,0,null,null,0,"div",[["class","mat-select-arrow"]],null,null,null,null,null)),(n()(),l._4(16777216,null,null,1,function(n,t,e){var l=!0,r=n.component;return"backdropClick"===t&&(l=!1!==r.close()&&l),"attach"===t&&(l=!1!==r._onAttached()&&l),"detach"===t&&(l=!1!==r.close()&&l),l},Dm)),l._8(14,671744,[[3,4]],0,ji,[Pi,l.O,l.R,Ai,[2,Dl]],{_deprecatedOrigin:[0,"_deprecatedOrigin"],_deprecatedPositions:[1,"_deprecatedPositions"],_deprecatedOffsetY:[2,"_deprecatedOffsetY"],_deprecatedMinWidth:[3,"_deprecatedMinWidth"],_deprecatedBackdropClass:[4,"_deprecatedBackdropClass"],_deprecatedScrollStrategy:[5,"_deprecatedScrollStrategy"],_deprecatedOpen:[6,"_deprecatedOpen"],_deprecatedHasBackdrop:[7,"_deprecatedHasBackdrop"]},{backdropClick:"backdropClick",attach:"attach",detach:"detach"})],function(n,t){var e=t.component;n(t,6,0,e.empty),n(t,8,0,!0),n(t,10,0,!1),n(t,14,0,l._22(t,4),e._positions,e._offsetY,null==e._triggerRect?null:e._triggerRect.width,"cdk-overlay-transparent-backdrop",e._scrollStrategy,e.panelOpen,"")},null)}var Em=l._7({encapsulation:2,styles:["@keyframes mat-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes mat-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes mat-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.91026}50%{animation-timing-function:cubic-bezier(0,0,.2,.1)}100%{stroke-dashoffset:0}}@keyframes mat-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0,0,0,1)}100%{transform:scaleX(1)}}@keyframes mat-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(.4,0,1,1);stroke-dashoffset:0}to{stroke-dashoffset:-22.91026}}@keyframes mat-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(45deg)}}@keyframes mat-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes mat-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0)}}@keyframes mat-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(315deg)}}@keyframes mat-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}100%,32.8%{opacity:0;transform:scaleX(0)}}.mat-checkbox-checkmark,.mat-checkbox-mixedmark{width:calc(100% - 4px)}.mat-checkbox-background,.mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:2px;box-sizing:border-box;pointer-events:none}.mat-checkbox{transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);cursor:pointer}.mat-checkbox-layout{cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex;white-space:nowrap}.mat-checkbox-inner-container{display:inline-block;height:20px;line-height:0;margin:auto;margin-right:8px;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:20px;flex-shrink:0}[dir=rtl] .mat-checkbox-inner-container{margin-left:8px;margin-right:auto}.mat-checkbox-inner-container-no-side-margin{margin-left:0;margin-right:0}.mat-checkbox-frame{background-color:transparent;transition:border-color 90ms cubic-bezier(0,0,.2,.1);border-width:2px;border-style:solid}.mat-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0,0,.2,.1),opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-checkbox-checkmark{top:0;left:0;right:0;bottom:0;position:absolute;width:100%}.mat-checkbox-checkmark-path{stroke-dashoffset:22.91026;stroke-dasharray:22.91026;stroke-width:2.66667px}.mat-checkbox-mixedmark{height:2px;opacity:0;transform:scaleX(0) rotate(0)}.mat-checkbox-label-before .mat-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .mat-checkbox-label-before .mat-checkbox-inner-container{margin-left:auto;margin-right:8px}.mat-checkbox-checked .mat-checkbox-checkmark{opacity:1}.mat-checkbox-checked .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-checked .mat-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-indeterminate .mat-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0)}.mat-checkbox-unchecked .mat-checkbox-background{background-color:transparent}.mat-checkbox-disabled{cursor:default}.mat-checkbox-anim-unchecked-checked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path{animation:180ms linear 0s mat-checkbox-unchecked-checked-checkmark-path}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-unchecked-indeterminate-mixedmark}.mat-checkbox-anim-checked-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-checked-unchecked .mat-checkbox-checkmark-path{animation:90ms linear 0s mat-checkbox-checked-unchecked-checkmark-path}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-checkmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-checkmark}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-mixedmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-checkmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-checkmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-mixedmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-mixedmark}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-mixedmark{animation:.3s linear 0s mat-checkbox-indeterminate-unchecked-mixedmark}.mat-checkbox-input{bottom:0;left:50%}.mat-checkbox-ripple{position:absolute;left:-15px;top:-15px;height:50px;width:50px;z-index:1;pointer-events:none}"],data:{}});function Ym(n){return l._33(2,[l._29(402653184,1,{_inputElement:0}),l._29(402653184,2,{_ripple:0}),(n()(),l._9(2,0,[["label",1]],null,14,"label",[["class","mat-checkbox-layout"]],[[1,"for",0]],null,null,null,null)),(n()(),l._9(3,0,null,null,8,"div",[["class","mat-checkbox-inner-container"]],[[2,"mat-checkbox-inner-container-no-side-margin",null]],null,null,null,null)),(n()(),l._9(4,0,[[1,0],["input",1]],null,0,"input",[["class","mat-checkbox-input cdk-visually-hidden"],["type","checkbox"]],[[8,"id",0],[8,"required",0],[8,"checked",0],[1,"value",0],[8,"disabled",0],[1,"name",0],[8,"tabIndex",0],[8,"indeterminate",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-checked",0]],[[null,"change"],[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"change"===t&&(l=!1!==r._onInteractionEvent(e)&&l),"click"===t&&(l=!1!==r._onInputClick(e)&&l),l},null,null)),(n()(),l._9(5,0,null,null,1,"div",[["class","mat-checkbox-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(6,212992,[[2,4]],0,ir,[l.l,l.B,Hl,[2,rr]],{centered:[0,"centered"],radius:[1,"radius"],speedFactor:[2,"speedFactor"],disabled:[3,"disabled"],trigger:[4,"trigger"]},null),(n()(),l._9(7,0,null,null,0,"div",[["class","mat-checkbox-frame"]],null,null,null,null,null)),(n()(),l._9(8,0,null,null,3,"div",[["class","mat-checkbox-background"]],null,null,null,null,null)),(n()(),l._9(9,0,null,null,1,":svg:svg",[[":xml:space","preserve"],["class","mat-checkbox-checkmark"],["focusable","false"],["version","1.1"],["viewBox","0 0 24 24"]],null,null,null,null,null)),(n()(),l._9(10,0,null,null,0,":svg:path",[["class","mat-checkbox-checkmark-path"],["d","M4.1,12.7 9,17.6 20.3,6.3"],["fill","none"],["stroke","white"]],null,null,null,null,null)),(n()(),l._9(11,0,null,null,0,"div",[["class","mat-checkbox-mixedmark"]],null,null,null,null,null)),(n()(),l._9(12,0,[["checkboxLabel",1]],null,4,"span",[["class","mat-checkbox-label"]],null,[[null,"cdkObserveContent"]],function(n,t,e){var l=!0;return"cdkObserveContent"===t&&(l=!1!==n.component._onLabelTextChange()&&l),l},null,null)),l._8(13,1196032,null,0,Ks,[Qs,l.l,l.B],null,{event:"cdkObserveContent"}),(n()(),l._9(14,0,null,null,1,"span",[["style","display:none"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\xa0"])),l._21(null,0)],function(n,t){var e=t.component;n(t,6,0,e._rippleConfig.centered,e._rippleConfig.radius,e._rippleConfig.speedFactor,e._isRippleDisabled(),l._22(t,2))},function(n,t){var e=t.component;n(t,2,0,e.inputId),n(t,3,0,!l._22(t,12).textContent||!l._22(t,12).textContent.trim()),n(t,4,1,[e.inputId,e.required,e.checked,e.value,e.disabled,e.name,e.tabIndex,e.indeterminate,e.ariaLabel,e.ariaLabelledby,e._getAriaChecked()]),n(t,5,0,l._22(t,6).unbounded)})}var jm=l._7({encapsulation:2,styles:[".mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:0;vertical-align:middle}.mat-slider-wrapper{position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),opacity .4s cubic-bezier(.25,.8,.25,1)}.cdk-keyboard-focused .mat-slider-focus-ring,.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label{cursor:-webkit-grab;cursor:grab}.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label:active,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb:active{cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(.7);transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),border-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform .4s cubic-bezier(.25,.8,.25,1),border-radius .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-sliding .mat-slider-thumb-container,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-track-fill{transition-duration:0s}.mat-slider-has-ticks .mat-slider-wrapper::after{content:'';position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}"],data:{}});function Im(n){return l._33(2,[l._29(402653184,1,{_sliderWrapper:0}),(n()(),l._9(1,0,[[1,0],["sliderWrapper",1]],null,16,"div",[["class","mat-slider-wrapper"]],null,null,null,null,null)),(n()(),l._9(2,0,null,null,4,"div",[["class","mat-slider-track-wrapper"]],null,null,null,null,null)),(n()(),l._9(3,0,null,null,1,"div",[["class","mat-slider-track-background"]],null,null,null,null,null)),l._8(4,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(5,0,null,null,1,"div",[["class","mat-slider-track-fill"]],null,null,null,null,null)),l._8(6,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(7,0,null,null,3,"div",[["class","mat-slider-ticks-container"]],null,null,null,null,null)),l._8(8,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(9,0,null,null,1,"div",[["class","mat-slider-ticks"]],null,null,null,null,null)),l._8(10,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(11,0,null,null,6,"div",[["class","mat-slider-thumb-container"]],null,null,null,null,null)),l._8(12,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(13,0,null,null,0,"div",[["class","mat-slider-focus-ring"]],null,null,null,null,null)),(n()(),l._9(14,0,null,null,0,"div",[["class","mat-slider-thumb"]],null,null,null,null,null)),(n()(),l._9(15,0,null,null,2,"div",[["class","mat-slider-thumb-label"]],null,null,null,null,null)),(n()(),l._9(16,0,null,null,1,"span",[["class","mat-slider-thumb-label-text"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""]))],function(n,t){var e=t.component;n(t,4,0,e._trackBackgroundStyles),n(t,6,0,e._trackFillStyles),n(t,8,0,e._ticksContainerStyles),n(t,10,0,e._ticksStyles),n(t,12,0,e._thumbContainerStyles)},function(n,t){n(t,17,0,t.component.displayValue)})}var Rm=function(){function n(n,t){var e=this;this.dialogRef=n,this.walletService=t,this.wallets=[],this.walletService.all().first().subscribe(function(n){return e.wallets=n})}return n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.select=function(n){this.dialogRef.close(n)},n}(),Hm=function(){function n(n,t,e,l){this.dialogRef=n,this.data=t,this.formBuilder=e,this.msgBarService=l}return n.prototype.ngOnInit=function(){this.form=this.formBuilder.group({data:[this.data]})},n.prototype.ngOnDestroy=function(){this.msgBarService.hide()},n.prototype.processData=function(){try{if(0===this.form.value.data.trim().length)return void this.msgBarService.showError("send.bulk-send.error-no-data");var n=this.form.value.data.split(/\r?\n/);if(!n||0===n.length)return void this.msgBarService.showError("send.bulk-send.error-no-data");var t=(n=n.filter(function(n){return n.trim().length>0}))[0].split(",").length;if(2!==t&&3!==t)return void this.msgBarService.showError("send.bulk-send.error-invalid-data");var e=[],l=!0;if(n.forEach(function(n,r){e[r]=n.split(","),e[r].length!==t&&(l=!1)}),!l)return void this.msgBarService.showError("send.bulk-send.error-inconsistent-data");var r=[];e.forEach(function(n,t){r[t]=[],n.forEach(function(n,e){r[t][e]=n.trim()})}),this.dialogRef.close(r)}catch(n){this.msgBarService.showError("send.bulk-send.error-invalid-data")}},n}(),Nm=function(){function n(n,t,e,r,i,o,s,a,u,c,d){this.blockchainService=n,this.walletService=t,this.appService=e,this.formBuilder=r,this.dialog=i,this.msgBarService=o,this.navbarService=s,this.hwWalletService=a,this.translate=u,this.priceService=c,this.changeDetector=d,this.onFormSubmitted=new l.o,this.maxNoteChars=am.MAX_NOTE_CHARS,this.addresses=[],this.allUnspentOutputs=[],this.unspentOutputs=[],this.loadingUnspentOutputs=!1,this.availableCoins=new Ae.BigNumber(0),this.availableHours=new Ae.BigNumber(0),this.minimumFee=new Ae.BigNumber(0),this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5",this.busy=!1,this.doubleButtonActive=Fp,this.selectedCurrency=Fp.LeftButton,this.totalCoins=new Ae.BigNumber(0),this.totalConvertedCoins=new Ae.BigNumber(0),this.totalHours=new Ae.BigNumber(0),this.subscriptionsGroup=[],this.destinationSubscriptions=[],this.destinationHoursSubscriptions=[]}return n.prototype.ngOnInit=function(){var n=this;this.navbarService.showSwitch("send.simple","send.advanced",Fp.RightButton),this.form=this.formBuilder.group({wallet:["",Xi.required],addresses:[null],outputs:[null],changeAddress:[""],destinations:this.formBuilder.array([this.createDestinationFormGroup()],this.validateDestinations.bind(this)),note:[""]}),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){n.wallet=t,n.closeGetOutputsSubscriptions(),n.allUnspentOutputs=[],n.unspentOutputs=[],n.loadingUnspentOutputs=!0,n.getOutputsSubscriptions=n.walletService.getWalletUnspentOutputs(t).retryWhen(function(n){return n.delay(1e3).take(10).concat(o.a.throw(""))}).subscribe(function(t){n.loadingUnspentOutputs=!1,n.allUnspentOutputs=t,n.unspentOutputs=n.filterUnspentOutputs()},function(){return n.loadingUnspentOutputs=!1}),n.addresses=t.addresses.filter(function(n){return n.coins>0}),n.form.get("addresses").setValue(null),n.form.get("outputs").setValue(null),n.updateAvailableBalance(),n.form.get("destinations").updateValueAndValidity()})),this.subscriptionsGroup.push(this.form.get("addresses").valueChanges.subscribe(function(){n.form.get("outputs").setValue(null),n.unspentOutputs=n.filterUnspentOutputs(),n.updateAvailableBalance(),n.form.get("destinations").updateValueAndValidity()})),this.subscriptionsGroup.push(this.form.get("outputs").valueChanges.subscribe(function(){n.updateAvailableBalance(),n.form.get("destinations").updateValueAndValidity()})),this.subscriptionsGroup.push(this.priceService.price.subscribe(function(t){n.price=t,n.updateValues()})),this.formData&&this.fillForm(),this.subscriptionsGroup.push(this.walletService.all().first().subscribe(function(t){n.wallets=t,1===t.length&&n.form.get("wallet").setValue(t[0])}))},n.prototype.ngOnDestroy=function(){this.processingSubscription&&!this.processingSubscription.closed&&this.processingSubscription.unsubscribe(),this.closeGetOutputsSubscriptions(),this.closeSyncCheckSubscription(),this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.navbarService.hideSwitch(),this.msgBarService.hide(),this.destinationSubscriptions.forEach(function(n){return n.unsubscribe()}),this.destinationHoursSubscriptions.forEach(function(n){return n.unsubscribe()})},n.prototype.preview=function(){this.previewTx=!0,this.checkBeforeSending(),this.changeDetector.detectChanges()},n.prototype.send=function(){this.previewTx=!1,this.checkBeforeSending()},n.prototype.changeActiveCurrency=function(n){n!==this.selectedCurrency&&(this.selectedCurrency=n,this.askIfConvertAmount(),this.updateValues(),this.form.get("destinations").updateValueAndValidity())},n.prototype.askIfConvertAmount=function(){var n=this,t=0;if(this.destControls.forEach(function(n,e){var l=n.get("coins").value;l=l?l.trim():l;var r=new Ae.BigNumber(l);l&&!r.isNaN()&&(t+=1)}),0!==t){var e,l,r=this.translate.instant("common.usd"),i=this.appService.coinName;this.selectedCurrency===Fp.LeftButton?(e=r,l=i):(e=i,l=r);var o={text:this.translate.instant(1===t?"send.convert-confirmation":"send.convert-confirmation-plural",{from:e,to:l}),headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"};Wc(this.dialog,o).afterClosed().subscribe(function(t){t&&n.convertAmounts()})}},n.prototype.convertAmounts=function(){var n=this;this.msgBarService.hide();var t=0,e=0;this.destControls.forEach(function(l,r){var i=l.get("coins").value;i=i?i.trim():i;var o=new Ae.BigNumber(i);if(i){if(!i||o.isNaN())return void(t+=1);var s;n.selectedCurrency===Fp.LeftButton?((s=o.dividedBy(n.price).decimalPlaces(n.blockchainService.currentMaxDecimals)).multipliedBy(n.price).decimalPlaces(um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR).isEqualTo(o)||(e+=1),l.get("coins").setValue(s.toString())):((s=o.multipliedBy(n.price).decimalPlaces(um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)).dividedBy(n.price).decimalPlaces(n.blockchainService.currentMaxDecimals).isEqualTo(o)||(e+=1),l.get("coins").setValue(s.toString()))}}),t>0&&e>0?this.msgBarService.showWarning(this.translate.instant("send.multiple-problems-warning")):1===t?this.msgBarService.showWarning(this.translate.instant("send.invaid-amount-warning")):t>1?this.msgBarService.showWarning(this.translate.instant("send.invaid-amounts-warning")):1===e?this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")):e>1&&this.msgBarService.showWarning(this.translate.instant("send.precision-errors-warning"))},n.prototype.assignAll=function(n){this.msgBarService.hide();var t=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:new Ae.BigNumber(-1);t.isEqualTo(-1)?this.msgBarService.showError(this.translate.instant("send.no-wallet-selected")):(this.selectedCurrency===Fp.RightButton&&(t=t.multipliedBy(this.price).decimalPlaces(um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)),this.destControls.forEach(function(e,l){if(l!==n){var r=Number.parseFloat(e.get("coins").value.trim());if(!r||isNaN(r))return;t=t.minus(r)}}),(t=t.decimalPlaces(this.selectedCurrency===Fp.LeftButton?this.blockchainService.currentMaxDecimals:um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)).isLessThan(0)?this.msgBarService.showError(this.translate.instant("send.no-coins-left")):this.destControls[n].get("coins").setValue(t.toString()))},n.prototype.updateValues=function(){var n=this;this.price?(this.values=[],this.totalCoins=new Ae.BigNumber(0),this.totalConvertedCoins=new Ae.BigNumber(0),this.totalHours=new Ae.BigNumber(0),this.destControls.forEach(function(t,e){var l=t.get("coins").value,r=n.getAmount(l,!0);if(r)if(n.selectedCurrency===Fp.LeftButton){var i=r.multipliedBy(n.price).decimalPlaces(2);n.totalCoins=n.totalCoins.plus(r),n.totalConvertedCoins=n.totalConvertedCoins.plus(i),n.values[e]=i.toNumber()}else i=r.dividedBy(n.price).decimalPlaces(n.blockchainService.currentMaxDecimals),n.totalCoins=n.totalCoins.plus(i),n.totalConvertedCoins=n.totalConvertedCoins.plus(r),n.values[e]=i.toNumber();else n.values[e]=-1}),this.autoHours||this.destControls.forEach(function(t,e){var l=t.get("hours").value,r=n.getAmount(l,!1);r&&(n.totalHours=n.totalHours.plus(r))})):this.values=null},n.prototype.checkBeforeSending=function(){var n=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.closeSyncCheckSubscription(),this.syncCheckSubscription=this.blockchainService.synchronized.first().subscribe(function(t){t?n.prepareTransaction():n.showSynchronizingWarning()}))},n.prototype.showSynchronizingWarning=function(){var n=this;Wc(this.dialog,{text:"send.synchronizing-warning",headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"}).afterClosed().subscribe(function(t){t&&n.prepareTransaction()})},n.prototype.prepareTransaction=function(){var n=this;if(this.msgBarService.hide(),this.previewButton.resetState(),this.sendButton.resetState(),!this.form.value.wallet.encrypted||this.form.value.wallet.isHardware||this.previewTx)!this.form.value.wallet.isHardware||this.previewTx?this.createTransaction():(this.showBusy(),this.processingSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.form.value.wallet.addresses[0].address).subscribe(function(){return n.createTransaction()},function(t){return n.showError(Tc(n.translate,t))}));else{var t=new oa;t.data={wallet:this.form.value.wallet},this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.createTransaction(t)})}},n.prototype.addDestination=function(){this.form.get("destinations").push(this.createDestinationFormGroup()),this.updateValues()},n.prototype.removeDestination=function(n){this.form.get("destinations").removeAt(n),this.destinationSubscriptions[n].unsubscribe(),this.destinationSubscriptions.splice(n,1),this.destinationHoursSubscriptions[n].unsubscribe(),this.destinationHoursSubscriptions.splice(n,1),this.updateValues()},n.prototype.setShareValue=function(n){this.autoShareValue=parseFloat(n.value).toFixed(2)},n.prototype.selectChangeAddress=function(n){var t=this,e=new oa;e.width="566px",e.autoFocus=!1,this.dialog.open(Rm,e).afterClosed().subscribe(function(n){n&&t.form.get("changeAddress").setValue(n)})},n.prototype.openMultipleDestinationsPopup=function(){var n=this,t="";this.destControls.map(function(e,l){(e.get("address").value.trim().length>0||e.get("coins").value.trim().length>0||!n.autoHours&&e.get("hours").value.trim().length>0)&&(t+=e.get("address").value.replace(",",""),t+=", "+e.get("coins").value.replace(",",""),n.autoHours||(t+=", "+e.get("hours").value.replace(",","")),t+="\r\n")}),t.length>0&&(t=t.substr(0,t.length-1));var e=new oa;e.width="566px",e.data=t,this.dialog.open(Hm,e).afterClosed().subscribe(function(t){if(t){for(;n.destControls.length>0;)n.form.get("destinations").removeAt(0);t.length>0?(n.autoHours=2===t[0].length,t.forEach(function(t,e){n.addDestination(),n.destControls[e].get("address").setValue(t[0]),n.destControls[e].get("coins").setValue(t[1]),n.autoHours||n.destControls[e].get("hours").setValue(t[2])})):n.addDestination()}}),this.updateValues()},n.prototype.toggleOptions=function(n){n.stopPropagation(),n.preventDefault(),this.autoOptions=!this.autoOptions},n.prototype.setAutoHours=function(n){this.autoHours=n.checked,this.form.get("destinations").updateValueAndValidity(),this.updateValues(),this.autoHours||(this.autoOptions=!1)},n.prototype.fillForm=function(){var n=this;this.addresses=this.formData.form.wallet.addresses,["wallet","addresses","changeAddress","note"].forEach(function(t){n.form.get(t).setValue(n.formData.form[t])});for(var t=0;tthis.blockchainService.currentMaxDecimals)return null}else if(2===l.length&&l[1].length>um.MaxUsdDecimals)return null}else if("hours"===name&&!e.isEqualTo(e.decimalPlaces(0)))return null;return e},n.prototype.createDestinationFormGroup=function(){var n=this,t=this.formBuilder.group({address:"",coins:"",hours:""});return this.destinationSubscriptions.push(t.get("coins").valueChanges.subscribe(function(t){n.updateValues()})),this.destinationHoursSubscriptions.push(t.get("hours").valueChanges.subscribe(function(t){n.updateValues()})),t},n.prototype.showBusy=function(){this.previewTx?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.busy=!0,this.navbarService.disableSwitch()},n.prototype.createTransaction=function(n){var t=this;this.showBusy();var e=this.form.get("addresses").value&&this.form.get("addresses").value.length>0?this.form.get("addresses").value.map(function(n){return n.address}):null,l=this.form.get("outputs").value&&this.form.get("outputs").value.length>0?this.form.get("outputs").value.map(function(n){return n.hash}):null;this.processingSubscription=this.walletService.createTransaction(this.form.value.wallet,e||this.form.value.wallet.addresses.map(function(n){return n.address}),l,this.destinations,this.hoursSelection,this.form.get("changeAddress").value?this.form.get("changeAddress").value:null,n?n.password:null,this.previewTx).subscribe(function(e){n&&n.close();var l=t.form.value.note.trim();if(t.previewTx){var r=new Ae.BigNumber("0");t.destinations.map(function(n){return r=r.plus(n.coins)}),t.onFormSubmitted.emit({form:{wallet:t.form.get("wallet").value,addresses:t.form.get("addresses").value,changeAddress:t.form.get("changeAddress").value,destinations:t.destinations,hoursSelection:t.hoursSelection,autoOptions:t.autoOptions,allUnspentOutputs:t.loadingUnspentOutputs?null:t.allUnspentOutputs,outputs:t.form.get("outputs").value,currency:t.selectedCurrency,note:l},amount:r,to:t.destinations.map(function(n){return n.address}),transaction:e}),t.busy=!1,t.navbarService.enableSwitch()}else t.processingSubscription=t.walletService.injectTransaction(e.encoded,l).subscribe(function(n){var e=!0;l&&!n&&(t.msgBarService.showWarning(t.translate.instant("send.error-saving-note")),e=!1),t.showSuccess(e)},function(n){return t.showError(n)})},function(e){n&&n.error(e),t.showError(e&&e.result?Tc(t.translate,e):e)})},n.prototype.resetForm=function(){for(this.form.get("wallet").setValue("",{emitEvent:!1}),this.form.get("addresses").setValue(null),this.form.get("outputs").setValue(null),this.form.get("changeAddress").setValue(""),this.form.get("note").setValue(""),this.wallet=null;this.destControls.length>0;)this.form.get("destinations").removeAt(0);this.addDestination(),this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5",this.updateValues()},Object.defineProperty(n.prototype,"destinations",{get:function(){var n=this;return this.destControls.map(function(t,e){var l={address:t.get("address").value.trim(),coins:(n.selectedCurrency===Fp.LeftButton?t.get("coins").value:n.values[e].toString()).trim(),originalAmount:t.get("coins").value};return n.autoHours||(l.hours=t.get("hours").value),l})},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hoursSelection",{get:function(){var n={type:"manual"};return this.autoHours&&(n={type:"auto",mode:"share",share_factor:this.autoShareValue}),n},enumerable:!0,configurable:!0}),n.prototype.updateAvailableBalance=function(){var n=this;if(this.form.get("wallet").value){this.availableCoins=new Ae.BigNumber(0),this.availableHours=new Ae.BigNumber(0);var t=this.form.get("outputs").value,e=this.form.get("addresses").value;if(t&&t.length>0)t.map(function(t){n.availableCoins=n.availableCoins.plus(t.coins),n.availableHours=n.availableHours.plus(t.calculated_hours)});else if(e&&e.length>0)e.map(function(t){n.availableCoins=n.availableCoins.plus(t.coins),n.availableHours=n.availableHours.plus(t.hours)});else if(this.form.get("wallet").value){var l=this.form.get("wallet").value;this.availableCoins=l.coins,this.availableHours=l.hours}if(this.availableCoins.isGreaterThan(0)){var r=new Ae.BigNumber(1).minus(new Ae.BigNumber(1).dividedBy(this.appService.burnRate)),i=this.availableHours.multipliedBy(r).decimalPlaces(0,Ae.BigNumber.ROUND_FLOOR);this.minimumFee=this.availableHours.minus(i),this.availableHours=i}else this.minimumFee=new Ae.BigNumber(0),this.availableHours=new Ae.BigNumber(0)}},n.prototype.filterUnspentOutputs=function(){var n=this;return 0===this.allUnspentOutputs.length?[]:this.form.get("addresses").value&&0!==this.form.get("addresses").value.length?this.allUnspentOutputs.filter(function(t){return n.form.get("addresses").value.some(function(n){return n.address===t.address})}):this.allUnspentOutputs},n.prototype.closeGetOutputsSubscriptions=function(){this.loadingUnspentOutputs=!1,this.getOutputsSubscriptions&&this.getOutputsSubscriptions.unsubscribe()},n.prototype.closeSyncCheckSubscription=function(){this.syncCheckSubscription&&this.syncCheckSubscription.unsubscribe()},n.prototype.showSuccess=function(n){var t=this;this.busy=!1,this.navbarService.enableSwitch(),this.resetForm(),n?(this.msgBarService.showDone("send.sent"),this.sendButton.resetState()):(this.sendButton.setSuccess(),setTimeout(function(){t.sendButton.resetState()},3e3))},n.prototype.showError=function(n){this.busy=!1,this.msgBarService.showError(n),this.navbarService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},n}(),Fm=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{height:12px!important;width:12px!important;opacity:.5;margin:0!important;display:inline-block;position:relative;top:2px}.form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:12px!important;width:12px!important}.-destination[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%]{text-align:right;padding-top:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;cursor:pointer}mat-checkbox[_ngcontent-%COMP%]{font-size:12px}mat-select[_ngcontent-%COMP%]{background:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px}mat-select[_ngcontent-%COMP%] .mat-select-trigger{padding:10px 30px 10px 10px;display:block;font-size:11px;height:100%;line-height:20px}mat-select[_ngcontent-%COMP%] .mat-select-arrow{border:none}mat-select[_ngcontent-%COMP%] .mat-select-placeholder{color:unset!important;-webkit-transition:unset!important;transition:unset!important}mat-option[_ngcontent-%COMP%] .mat-pseudo-checkbox-checked{background:#0072ff}.-autohours[_ngcontent-%COMP%]{margin:40px 0 20px}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{stroke:#0072ff!important}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-background, .-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-frame{width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-label{line-height:20px;font-size:13px;color:#1e2227;-webkit-box-flex:1;-ms-flex:1;flex:1}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-layout{display:-webkit-box;display:-ms-flexbox;display:flex}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%]{margin-top:20px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%]{width:100%;padding:0;height:40px;border:2px solid rgba(0,0,0,.05);border-radius:6px;background:#fff}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb-label{background-color:#0072ff!important;-webkit-transform:scale(1)!important;transform:scale(1)!important;border-width:0!important}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb{right:-6px;width:12px;height:32px;border-radius:3px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-background, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-fill{background-color:#fff!important}.-options[_ngcontent-%COMP%]{padding-left:5px;color:#0072ff;cursor:pointer;font-size:13px}.-options[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#0072ff;padding:0;display:inline;vertical-align:middle;font-size:13px}.-buttons[_ngcontent-%COMP%]{text-align:center}.-hidden[_ngcontent-%COMP%]{display:none}.-space-between[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}label[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}.-available-msg[_ngcontent-%COMP%]{background-color:#f7f7f7;border:1px dotted rgba(30,34,39,.2);border-radius:6px;padding:10px;font-size:11px;text-align:center}.-available-msg[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{opacity:.7}.-available-msg[_ngcontent-%COMP%] .value[_ngcontent-%COMP%]{opacity:1!important;font-weight:700;font-size:13px}.destinations-label[_ngcontent-%COMP%]{display:inline-block}"]],data:{}});function Bm(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,5,"option",[],[[8,"disabled",0]],null,null,null,null)),l._8(3,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(4,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(5,null,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.context.$implicit),n(t,4,0,t.context.$implicit)},function(n,t){n(t,2,0,!t.context.$implicit.coins||t.context.$implicit.coins.isLessThanOrEqualTo(0)),n(t,5,0,t.context.$implicit.label,l._32(t,5,1,l._22(t,6).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,5,2,l._22(t,7).transform(t.context.$implicit.hours.toString(),!1)))})}function Vm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Bm)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.wallets)},null)}function Wm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[3,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,1,0,t.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.address,l._32(t,2,1,l._22(t,3).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,2,2,l._22(t,4).transform(t.context.$implicit.hours.toString(),!1)))})}function zm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],null,function(n,t){n(t,1,0,t.context.$implicit.address,l._32(t,1,1,l._22(t,2).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,1,2,l._22(t,3).transform(t.context.$implicit.hours.toString(),!1)))})}function Um(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Gm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[6,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,1,0,t.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.hash,l._32(t,2,1,l._22(t,3).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,2,2,l._22(t,4).transform(t.context.$implicit.calculated_hours.toString(),!1)))})}function qm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],null,function(n,t){n(t,1,0,t.context.$implicit.hash,l._32(t,1,1,l._22(t,2).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,1,2,l._22(t,3).transform(t.context.$implicit.calculated_hours.toString(),!1)))})}function Jm(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"mat-select-trigger",[],null,null,null,null,null)),l._8(1,16384,[[8,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qm)),l._8(4,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,t.component.form.get("outputs").value)},null)}function Qm(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"mat-select-trigger",[],null,null,null,null,null)),l._8(1,16384,[[8,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(4,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("send.all-outputs")))})}function Km(n){return l._33(0,[(n()(),l._9(0,0,null,null,116,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,39,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,8,"label",[],[[8,"htmlFor",0]],[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==(n.component.busy?null:l._22(n,23).open())&&r),r},null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(7,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,9).show()&&r),"keydown"===t&&(r=!1!==l._22(n,9)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,9).hide(1500)&&r),r},Hf,Rf)),l._8(8,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(9,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,26,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,23,"mat-select",[["class","mat-select"],["formControlName","addresses"],["id","addresses"],["multiple",""],["role","listbox"]],[[1,"disabled",0],[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,23)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,23)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,23)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(19,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(20,{"element-disabled":0}),l._8(21,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,2080768,[["selectAddresses",4]],3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"],multiple:[1,"multiple"],compareWith:[2,"compareWith"],id:[3,"id"]},null),l._29(603979776,3,{options:1}),l._29(603979776,4,{optionGroups:1}),l._29(335544320,5,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(28,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,1,null,Wm)),l._8(31,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._9(33,0,null,0,5,"mat-select-trigger",[],null,null,null,null,null)),l._8(34,16384,[[5,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zm)),l._8(37,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,41,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,11,"label",[],[[8,"htmlFor",0]],[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==(n.component.busy?null:l._22(n,67).open())&&r),r},null,null)),(n()(),l._31(46,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(48,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,50).show()&&r),"keydown"===t&&(r=!1!==l._22(n,50)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,50).hide(1500)&&r),r},Hf,Rf)),l._8(49,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(50,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Um)),l._8(55,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,25,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(60,0,null,null,22,"mat-select",[["class","mat-select"],["formControlName","outputs"],["id","outputs"],["multiple",""],["role","listbox"]],[[1,"disabled",0],[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,67)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,67)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,67)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(63,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(64,{"element-disabled":0}),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,2080768,[["selectOutputs",4]],3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"],multiple:[1,"multiple"],compareWith:[2,"compareWith"],id:[3,"id"]},null),l._29(603979776,6,{options:1}),l._29(603979776,7,{optionGroups:1}),l._29(603979776,8,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(72,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,1,null,Gm)),l._8(75,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,0,1,null,Jm)),l._8(78,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,0,1,null,Qm)),l._8(81,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(86,0,null,null,29,"div",[["class","form-field -available-msg"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(88,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(89,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(92,0,null,null,2,"span",[["class","value"]],null,null,null,null,null)),(n()(),l._31(93,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(96,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(97,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(100,0,null,null,2,"span",[["class","value"]],null,null,null,null,null)),(n()(),l._31(101,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(104,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(105,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(108,0,null,null,2,"span",[["class","value"]],null,null,null,null,null)),(n()(),l._31(109,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(112,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(113,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,8,0),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("send.addresses-help"))),n(t,19,0,n(t,20,0,e.busy)),n(t,21,0,"addresses"),n(t,23,0,l._32(t,23,0,l._22(t,27).transform("send.all-addresses")),"",e.addressCompare,"addresses"),n(t,31,0,e.addresses),n(t,37,0,e.form.get("addresses").value),n(t,49,0),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("send.outputs-help"))),n(t,55,0,e.loadingUnspentOutputs),n(t,63,0,n(t,64,0,e.busy)),n(t,65,0,"outputs"),n(t,67,0,l._32(t,67,0,l._22(t,71).transform("send.all-outputs")),"",e.outputCompare,"outputs"),n(t,75,0,e.unspentOutputs),n(t,78,0,e.form.get("outputs").value&&e.form.get("outputs").value.length>0),n(t,81,0,!e.form.get("outputs").value||0===e.form.get("outputs").value.length)},function(n,t){var e=t.component;n(t,4,0,e.busy?"":"addresses"),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("send.addresses-label"))),n(t,16,1,[e.busy?"true":null,l._22(t,23).id,l._22(t,23).tabIndex,l._22(t,23)._ariaLabel,l._22(t,23).ariaLabelledby,l._22(t,23).required.toString(),l._22(t,23).disabled.toString(),l._22(t,23).errorState,l._22(t,23).panelOpen?l._22(t,23)._optionIds:null,l._22(t,23).multiple,l._22(t,23)._ariaDescribedby||null,l._22(t,23)._getAriaActiveDescendant(),l._22(t,23).disabled,l._22(t,23).errorState,l._22(t,23).required,l._22(t,28).ngClassUntouched,l._22(t,28).ngClassTouched,l._22(t,28).ngClassPristine,l._22(t,28).ngClassDirty,l._22(t,28).ngClassValid,l._22(t,28).ngClassInvalid,l._22(t,28).ngClassPending]),n(t,45,0,e.busy?null:"outputs"),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("send.outputs-label"))),n(t,60,1,[e.busy?"true":null,l._22(t,67).id,l._22(t,67).tabIndex,l._22(t,67)._ariaLabel,l._22(t,67).ariaLabelledby,l._22(t,67).required.toString(),l._22(t,67).disabled.toString(),l._22(t,67).errorState,l._22(t,67).panelOpen?l._22(t,67)._optionIds:null,l._22(t,67).multiple,l._22(t,67)._ariaDescribedby||null,l._22(t,67)._getAriaActiveDescendant(),l._22(t,67).disabled,l._22(t,67).errorState,l._22(t,67).required,l._22(t,72).ngClassUntouched,l._22(t,72).ngClassTouched,l._22(t,72).ngClassPristine,l._22(t,72).ngClassDirty,l._22(t,72).ngClassValid,l._22(t,72).ngClassInvalid,l._22(t,72).ngClassPending]),n(t,89,0,l._32(t,89,0,l._22(t,90).transform("send.available-msg-part1"))),n(t,93,0,l._32(t,93,0,l._22(t,94).transform(e.availableCoins.toString()))),n(t,97,0,l._32(t,97,0,l._22(t,98).transform("send.available-msg-part2"))),n(t,101,0,l._32(t,101,0,l._22(t,102).transform(e.availableHours.toString(),!1))),n(t,105,0,l._32(t,105,0,l._22(t,106).transform("send.available-msg-part3"))),n(t,109,0,l._32(t,109,0,l._22(t,110).transform(e.minimumFee.toString(),!1))),n(t,113,0,l._32(t,113,0,l._22(t,114).transform("send.available-msg-part4")))})}function Xm(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[["class","coin-selector-container"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,3,"app-double-button",[["className","light small"]],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeActiveCurrency(e)&&l),l},M_,x_)),l._8(5,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,"coin-selector-container",n(t,2,0,e.busy)),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("common.usd")),l._32(t,5,1,l._22(t,7).transform("coin")),e.selectedCurrency,"light small")},null)}function Zm(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("send.invalid-amount")))})}function $m(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ "," ","\n "])),l._27(2,2),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,n(t,2,0,l._22(t.parent.parent,0),e.values[t.parent.context.index],"1.0-2")),l._32(t,1,1,l._22(t,3).transform("common.usd")))})}function ng(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ ","\n "])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.values[t.parent.context.index])))})}function tg(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["alt","plus"],["src","../../../../../assets/img/plus-green.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addDestination()&&l),l},null,null))],null,null)}function eg(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["alt","minus"],["src","../../../../../assets/img/minus-grey.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removeDestination(n.parent.context.index)&&l),l},null,null))],null,null)}function lg(n){return l._33(0,[(n()(),l._9(0,0,null,null,86,"div",[["class","-destination"],["formArrayName","destinations"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),l._8(1,212992,null,0,Qo,[[3,qi],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,qi,null,[Qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,80,"div",[["class","row"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),l._8(6,212992,null,0,Jo,[[3,qi],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,qi,null,[Jo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,8,"div",[["class","col-lg-5 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,5,"input",[["formControlName","address"]],[[8,"id",0],[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,13)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,13).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,13)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,13)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(13,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(15,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(17,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,34,"div",[["class","col-md-3"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,13,"div",[["class","-input-addon"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,5,"input",[["formControlName","coins"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,25)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,25).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,25)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,25)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(25,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(27,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(29,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(31,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(32,null,["",""])),l._25(0,l_,[gf]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,16,"div",[["class","coins-value-label"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Zm)),l._8(40,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,$m)),l._8(43,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ng)),l._8(46,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,4,"div",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.assignAll(n.context.index)&&l),l},null,null)),l._8(49,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(50,{"centerd-link":0}),(n()(),l._31(51,null,["(",")"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,17,"div",[["class","col-lg-3 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,14,"div",[],null,null,null,null,null)),l._8(59,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(60,{"-input-addon":0,"-hidden":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(62,0,null,null,5,"input",[["formControlName","hours"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,63)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,63).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,63)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,63)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(63,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(69,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(70,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,0,null,null,9,"div",[["class","col-md-1 -icons"]],null,null,null,null,null)),l._8(76,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(77,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,tg)),l._8(80,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,eg)),l._8(83,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,"destinations"),n(t,6,0,t.context.index),n(t,15,0,"address"),n(t,27,0,"coins"),n(t,40,0,e.price&&e.values[t.context.index]<0),n(t,43,0,e.price&&e.values[t.context.index]>=0&&e.selectedCurrency===e.doubleButtonActive.LeftButton),n(t,46,0,e.price&&e.values[t.context.index]>=0&&e.selectedCurrency===e.doubleButtonActive.RightButton),n(t,49,0,"link",n(t,50,0,!e.price)),n(t,59,0,n(t,60,0,!0,e.autoHours)),n(t,65,0,"hours"),n(t,76,0,"col-md-1 -icons",n(t,77,0,e.busy)),n(t,80,0,0===t.context.index),n(t,83,0,0!==t.context.index)},function(n,t){var e=t.component;n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,12,0,0===t.context.index?"destination":"",e.busy?"true":null,l._22(t,17).ngClassUntouched,l._22(t,17).ngClassTouched,l._22(t,17).ngClassPristine,l._22(t,17).ngClassDirty,l._22(t,17).ngClassValid,l._22(t,17).ngClassInvalid,l._22(t,17).ngClassPending),n(t,24,0,e.busy?"true":null,l._22(t,29).ngClassUntouched,l._22(t,29).ngClassTouched,l._22(t,29).ngClassPristine,l._22(t,29).ngClassDirty,l._22(t,29).ngClassValid,l._22(t,29).ngClassInvalid,l._22(t,29).ngClassPending),n(t,32,0,l._32(t,32,0,e.selectedCurrency===e.doubleButtonActive.LeftButton?l._22(t,33).transform("coin"):l._22(t,34).transform("common.usd"))),n(t,51,0,l._32(t,51,0,l._22(t,52).transform("send.send-all-available-coins"))),n(t,62,0,e.busy?"true":null,l._22(t,67).ngClassUntouched,l._22(t,67).ngClassTouched,l._22(t,67).ngClassPristine,l._22(t,67).ngClassDirty,l._22(t,67).ngClassValid,l._22(t,67).ngClassInvalid,l._22(t,67).ngClassPending),n(t,70,0,l._32(t,70,0,l._22(t,71).transform("hours")))})}function rg(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[["class","col-lg-3 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,6,"div",[["class","coins-value-label"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(7,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("send.total"))),n(t,7,0,l._32(t,7,0,l._22(t,8).transform(e.totalHours.toString(),!1)))})}function ig(n){return l._33(0,[(n()(),l._9(0,0,null,null,19,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"div",[["class","col-lg-5 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,11,"div",[["class","col-md-3"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,8,"div",[["class","coins-value-label"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(11,null,[" "," / "," ","\n "])),l._25(0,If,[tn,qc,gf]),l._27(13,2),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,rg)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,18,0,!t.component.autoHours)},function(n,t){var e=t.component;n(t,9,0,l._32(t,9,0,l._22(t,10).transform("send.total"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform(e.totalCoins.toString())),l._32(t,11,1,n(t,13,0,l._22(t.parent,0),e.totalConvertedCoins.toString(),"1.0-2")),l._32(t,11,2,l._22(t,14).transform("common.usd")))})}function og(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"span",[["class","-options"]],null,[[null,"mousedown"],[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"mousedown"===t&&(l=!1!==e.stopPropagation()&&l),"click"===t&&(l=!1!==r.toggleOptions(e)&&l),l},null,null)),(n()(),l._31(1,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(4,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(5,0,["",""])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0)},function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("send.options-label"))),n(t,5,0,e.autoOptions?"keyboard_arrow_up":"keyboard_arrow_down")})}function sg(n){return l._33(0,[l._25(0,tn,[l.w]),l._29(402653184,1,{previewButton:0}),l._29(402653184,2,{sendButton:0}),(n()(),l._9(3,0,null,null,178,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,4).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,4).onReset()&&r),r},null,null)),l._8(4,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(6,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,27,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"label",[["for","wallets"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,17,"select",[["formControlName","wallet"],["id","wallets"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,19).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,19).onTouched()&&r),r},null,null)),l._8(17,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(18,{"element-disabled":0}),l._8(19,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(21,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,4,"option",[["disabled",""],["hidden",""]],null,null,null,null,null)),l._8(26,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(27,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(28,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Vm)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Km)),l._8(38,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(40,0,null,null,30,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,8,"label",[["class","destinations-label"],["for","destination"]],null,null,null,null,null)),(n()(),l._31(43,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(45,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,47).show()&&r),"keydown"===t&&(r=!1!==l._22(n,47)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,47).hide(1500)&&r),r},Hf,Rf)),l._8(46,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(47,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Xm)),l._8(53,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(55,0,null,null,8,"span",[["class","-options"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.openMultipleDestinationsPopup()&&l),l},null,null)),l._8(56,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(57,{"element-disabled":0}),(n()(),l._31(58,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(60,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(61,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,lg)),l._8(66,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ig)),l._8(69,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(72,0,null,null,28,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(74,0,null,null,18,"label",[["for","change-address"]],null,null,null,null,null)),(n()(),l._31(75,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(77,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,79).show()&&r),"keydown"===t&&(r=!1!==l._22(n,79)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,79).hide(1500)&&r),r},Hf,Rf)),l._8(78,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(79,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(83,0,null,null,8,"span",[["class","-options"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.selectChangeAddress(e)&&l),l},null,null)),l._8(84,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(85,{"element-disabled":0}),(n()(),l._31(86,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(88,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(89,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(94,0,null,null,5,"input",[["formControlName","changeAddress"],["id","change-address"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,95)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,95).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,95)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,95)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(95,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(97,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(99,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(102,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(104,0,null,null,8,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(105,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(107,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,109).show()&&r),"keydown"===t&&(r=!1!==l._22(n,109)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,109).hide(1500)&&r),r},Hf,Rf)),l._8(108,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(109,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(114,0,null,null,7,"input",[["formControlName","note"],["id","note"]],[[1,"disabled",0],[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,115)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,115).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,115)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,115)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.preview()&&r),r},null,null)),l._8(115,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(116,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(119,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(121,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(124,0,null,null,56,"div",[["class","-autohours"]],null,null,null,null,null)),l._8(125,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(126,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(128,0,null,null,19,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(130,0,null,null,16,"div",[["class","col-xl-4 col-lg-5 col-md-7"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(132,0,null,null,13,"mat-checkbox",[["class","-check mat-checkbox"]],[[1,"disabled",0],[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAutoHours(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(134,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(136,0,null,0,8,"div",[["class","-space-between"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(138,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(139,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,og)),l._8(143,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(149,0,null,null,30,"div",[],null,null,null,null,null)),l._8(150,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(151,{"row -options-wrapper":0,"-hidden":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(153,0,null,null,25,"div",[["class","col-md-5"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(155,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(157,0,null,null,15,"label",[["class","-space-between"],["for","value"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(159,0,null,null,8,"span",[],null,null,null,null,null)),(n()(),l._31(160,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(162,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,164).show()&&r),"keydown"===t&&(r=!1!==l._22(n,164)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,164).hide(1500)&&r),r},Hf,Rf)),l._8(163,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(164,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(169,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(170,null,["",""])),l._27(171,2),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(174,0,null,null,2,"mat-slider",[["class","-slider mat-slider"],["id","value"],["max","1"],["min","0.1"],["role","slider"],["step","0.01"]],[[1,"disabled",0],[8,"tabIndex",0],[1,"aria-disabled",0],[1,"aria-valuemax",0],[1,"aria-valuemin",0],[1,"aria-valuenow",0],[1,"aria-orientation",0],[2,"mat-slider-disabled",null],[2,"mat-slider-has-ticks",null],[2,"mat-slider-horizontal",null],[2,"mat-slider-axis-inverted",null],[2,"mat-slider-sliding",null],[2,"mat-slider-thumb-label-showing",null],[2,"mat-slider-vertical",null],[2,"mat-slider-min-value",null],[2,"mat-slider-hide-last-tick",null]],[[null,"input"],[null,"focus"],[null,"blur"],[null,"click"],[null,"keydown"],[null,"keyup"],[null,"mouseenter"],[null,"slide"],[null,"slideend"],[null,"slidestart"]],function(n,t,e){var r=!0,i=n.component;return"focus"===t&&(r=!1!==l._22(n,176)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,176)._onBlur()&&r),"click"===t&&(r=!1!==l._22(n,176)._onClick(e)&&r),"keydown"===t&&(r=!1!==l._22(n,176)._onKeydown(e)&&r),"keyup"===t&&(r=!1!==l._22(n,176)._onKeyup()&&r),"mouseenter"===t&&(r=!1!==l._22(n,176)._onMouseenter()&&r),"slide"===t&&(r=!1!==l._22(n,176)._onSlide(e)&&r),"slideend"===t&&(r=!1!==l._22(n,176)._onSlideEnd()&&r),"slidestart"===t&&(r=!1!==l._22(n,176)._onSlideStart(e)&&r),"input"===t&&(r=!1!==i.setShareValue(e)&&r),r},Im,jm)),l._28(5120,null,to,function(n){return[n]},[Uu]),l._8(176,245760,null,0,Uu,[l.l,Rr,l.h,[2,Dl],[8,null]],{max:[0,"max"],min:[1,"min"],step:[2,"step"],value:[3,"value"]},{input:"input"}),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(183,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(185,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.preview()&&l),l},w_,g_)),l._8(186,49152,[[1,4],["previewButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(187,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(190,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.send()&&l),l},w_,g_)),l._8(191,49152,[[2,4],["sendButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(192,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,e.form),n(t,17,0,n(t,18,0,e.busy)),n(t,21,0,"wallet"),n(t,26,0,""),n(t,27,0,""),n(t,32,0,e.wallets),n(t,38,0,e.wallet),n(t,46,0),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("send.destinations-help"+(e.autoHours?"1":"2")))),n(t,53,0,e.price),n(t,56,0,"-options",n(t,57,0,e.busy)),n(t,61,0),n(t,66,0,e.destControls),n(t,69,0,e.destControls.length>1),n(t,78,0),n(t,79,0,l._32(t,79,0,l._22(t,80).transform("send.change-address-help"))),n(t,84,0,"-options",n(t,85,0,e.busy)),n(t,89,0),n(t,97,0,"changeAddress"),n(t,108,0),n(t,109,0,l._32(t,109,0,l._22(t,110).transform("send.personal-note-help"))),n(t,116,0,e.maxNoteChars),n(t,119,0,"note"),n(t,125,0,"-autohours",n(t,126,0,e.busy)),n(t,134,0,e.autoHours),n(t,143,0,e.autoHours),n(t,150,0,n(t,151,0,!0,!e.autoOptions)),n(t,163,0),n(t,164,0,l._32(t,164,0,l._22(t,165).transform("send.value-help"))),n(t,176,0,"1","0.1","0.01",e.autoShareValue),n(t,186,0,!e.form.valid),n(t,191,0,!e.form.valid)},function(n,t){var e=t.component;n(t,3,0,l._22(t,6).ngClassUntouched,l._22(t,6).ngClassTouched,l._22(t,6).ngClassPristine,l._22(t,6).ngClassDirty,l._22(t,6).ngClassValid,l._22(t,6).ngClassInvalid,l._22(t,6).ngClassPending),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("send.wallet-label"))),n(t,16,0,e.busy?"true":null,l._22(t,23).ngClassUntouched,l._22(t,23).ngClassTouched,l._22(t,23).ngClassPristine,l._22(t,23).ngClassDirty,l._22(t,23).ngClassValid,l._22(t,23).ngClassInvalid,l._22(t,23).ngClassPending),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("send.select-wallet"))),n(t,43,0,l._32(t,43,0,l._22(t,44).transform("send.destinations-label"))),n(t,58,0,l._32(t,58,0,l._22(t,59).transform("send.bulk-send.title"))),n(t,75,0,l._32(t,75,0,l._22(t,76).transform("send.change-address-label"))),n(t,86,0,l._32(t,86,0,l._22(t,87).transform("send.change-address-select"))),n(t,94,0,e.busy?"true":null,l._22(t,99).ngClassUntouched,l._22(t,99).ngClassTouched,l._22(t,99).ngClassPristine,l._22(t,99).ngClassDirty,l._22(t,99).ngClassValid,l._22(t,99).ngClassInvalid,l._22(t,99).ngClassPending),n(t,105,0,l._32(t,105,0,l._22(t,106).transform("send.personal-note-label"))),n(t,114,0,e.busy?"true":null,l._22(t,116).maxlength?l._22(t,116).maxlength:null,l._22(t,121).ngClassUntouched,l._22(t,121).ngClassTouched,l._22(t,121).ngClassPristine,l._22(t,121).ngClassDirty,l._22(t,121).ngClassValid,l._22(t,121).ngClassInvalid,l._22(t,121).ngClassPending),n(t,132,0,e.busy?"true":null,l._22(t,134).id,l._22(t,134).indeterminate,l._22(t,134).checked,l._22(t,134).disabled,"before"==l._22(t,134).labelPosition),n(t,139,0,l._32(t,139,0,l._22(t,140).transform("send.hours-allocation-label"))),n(t,160,0,l._32(t,160,0,l._22(t,161).transform("send.value-label"))),n(t,170,0,l._32(t,170,0,n(t,171,0,l._22(t,0),e.autoShareValue,"1.0-2"))),n(t,174,1,[e.busy?"true":null,l._22(t,176).tabIndex,l._22(t,176).disabled,l._22(t,176).max,l._22(t,176).min,l._22(t,176).value,l._22(t,176).vertical?"vertical":"horizontal",l._22(t,176).disabled,l._22(t,176).tickInterval,!l._22(t,176).vertical,l._22(t,176)._invertAxis,l._22(t,176)._isSliding,l._22(t,176).thumbLabel,l._22(t,176).vertical,l._22(t,176)._isMinValue,l._22(t,176).disabled||l._22(t,176)._isMinValue&&l._22(t,176)._thumbGap&&l._22(t,176)._invertAxis]),n(t,187,0,l._32(t,187,0,l._22(t,188).transform("send.preview-button"))),n(t,192,0,l._32(t,192,0,l._22(t,193).transform("send.send-button")))})}var ag=function(){function n(){}return n.prototype.transform=function(n){return zp.unix(n).format("YYYY-MM-DD HH:mm")},n}(),ug=function(){function n(n,t){var e=this;this.priceService=n,this.dialog=t,this.showInputsOutputs=!1,this.subscription=this.priceService.price.subscribe(function(n){return e.price=n})}return Object.defineProperty(n.prototype,"hoursText",{get:function(){if(!this.transaction)return"";if(!this.isPreview){if(this.transaction.coinsMovedInternally)return"tx.hours-moved";if(this.transaction.balance.isGreaterThan(0))return"tx.hours-received"}return"tx.hours-sent"},enumerable:!0,configurable:!0}),n.prototype.ngOnInit=function(){var n=this;this.isPreview&&(this.transaction.hoursSent=new Ae.BigNumber("0"),this.transaction.outputs.filter(function(t){return n.transaction.to.find(function(n){return n===t.address})}).map(function(t){return n.transaction.hoursSent=n.transaction.hoursSent.plus(new Ae.BigNumber(t.hours))}))},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n.prototype.toggleInputsOutputs=function(n){n.preventDefault(),this.showInputsOutputs=!this.showInputsOutputs},n.prototype.editNote=function(){var n=this,t=new oa;t.width="566px",t.data=this.transaction,this.dialog.open(am,t).afterClosed().subscribe(function(t){(t||""===t)&&(n.transaction.note=t)})},n}(),cg=l._7({encapsulation:0,styles:[["h4[_ngcontent-%COMP%]{font-size:14px;margin:0 0 30px}.-item[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-item[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{padding:10px;background:#f7f7f7;-ms-flex-item-align:start;align-self:flex-start;border-radius:10px}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin-left:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{word-break:break-all}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{padding:10px 0;margin-bottom:5px}.-data[_ngcontent-%COMP%]{font-size:12px;display:-webkit-box;display:-ms-flexbox;display:flex}.-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child{color:rgba(30,34,39,.5);display:inline-block;width:60px;-ms-flex-negative:0;flex-shrink:0}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2){word-break:break-word}.-data[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;padding-left:5px;color:#0072ff;cursor:pointer}.-data[_ngcontent-%COMP%] .-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-data.-more[_ngcontent-%COMP%]{margin-bottom:0!important}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{width:auto!important;margin-top:20px;color:#0072ff;cursor:pointer}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;vertical-align:middle;font-size:13px}.-tx-meta[_ngcontent-%COMP%] .-data[_ngcontent-%COMP%]{margin-bottom:10px}.-tx-price[_ngcontent-%COMP%]{text-align:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.-tx-price[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.-tx-price[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:30px}.-tx-price[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:10px 0 5px}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:12px;margin:0}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}.-margin-top[_ngcontent-%COMP%]{margin-top:30px}"]],data:{}});function dg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.confirm-transaction")))})}function hg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.transaction")))})}function pg(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,8,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(8,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,8,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(15,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(18,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(19,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("tx.from"))),n(t,9,0,e.transaction.from),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("tx.to"))),n(t,19,0,e.transaction.to.join(", "))})}function fg(n){return l._33(0,[(n()(),l._9(0,0,null,null,23,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,9,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._27(10,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,9,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(16,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(19,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(20,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("tx.date"))),n(t,9,0,l._32(t,9,0,n(t,10,0,l._22(t.parent,0),e.transaction.timestamp))),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("tx.status"))),n(t,20,0,l._32(t,20,0,l._22(t,21).transform(e.transaction.confirmed?"tx.confirmed":"tx.pending")))})}function _g(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(6,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("tx.id"))),n(t,7,0,e.transaction.txid)})}function mg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.transaction.note)})}function gg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","-grey"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.without-note")))})}function yg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.editNote()&&l),l},Hf,Rf)),l._8(1,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["edit"]))],function(n,t){n(t,1,0)},null)}function bg(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,mg)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gg)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,yg)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,7,0,e.transaction.note),n(t,10,0,!e.transaction.note),n(t,13,0,!e.isPreview)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("tx.note")))})}function vg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["*"]))],null,null)}function wg(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,7,"p",[],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(3,null,["\n ",""])),l._27(4,4),(n()(),l._4(16777216,null,null,1,null,vg)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(0,null,null,0))],function(n,t){var e=t.component;n(t,1,0,e.isPreview?"":l._32(t,1,0,l._22(t,2).transform("tx.current-rate"))),n(t,6,0,!e.isPreview)},function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,n(t,4,0,l._22(t.parent,1),e.transaction.balance*e.price,"USD","symbol","1.2-2")))})}function xg(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[["class","-data -more"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,6,"span",[],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleInputsOutputs(e)&&l),l},null,null)),(n()(),l._31(3,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(5,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(6,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,6,0)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("tx.show-more")))})}function Mg(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,20,"div",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(13,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(15,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(21,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(23,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,t.context.index+1),n(t,8,0,e.isPreview?t.context.$implicit.address:t.context.$implicit.owner),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("tx.coins"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform(t.context.$implicit.coins,!0,"first"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("tx.hours"))),n(t,23,0,l._32(t,23,0,l._22(t,24).transform(t.context.$implicit.calculated_hours,!1,"first")))})}function kg(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,20,"div",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(13,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(15,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(21,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(23,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,t.context.index+1),n(t,8,0,e.isPreview?t.context.$implicit.address:t.context.$implicit.dst),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("tx.coins"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform(t.context.$implicit.coins,!0,"first"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("tx.hours"))),n(t,23,0,l._32(t,23,0,l._22(t,24).transform(t.context.$implicit.hours,!1,"first")))})}function Cg(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Mg)),l._8(9,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,kg)),l._8(19,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,9,0,e.transaction.inputs),n(t,19,0,e.transaction.outputs)},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("tx.inputs"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("tx.outputs")))})}function Sg(n){return l._33(0,[l._25(0,ag,[]),l._25(0,ln,[l.w]),(n()(),l._9(2,0,null,null,65,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,59,"div",[["class","col-md-12"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,dg)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,hg)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,47,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,27,"div",[["class","col-md-9 -tx-meta"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,pg)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,fg)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,12,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(25,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,5,"span",[],null,null,null,null,null)),(n()(),l._31(29,null,["\n "," ","\n |\n "," ","\n "])),l._25(0,If,[tn,qc,gf]),l._25(131072,De.i,[De.j,l.h]),l._25(0,If,[tn,qc,gf]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,_g)),l._8(37,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,bg)),l._8(40,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,15,"div",[["class","col-md-3 -tx-price"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),l._8(46,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(47,{"-incoming":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(52,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(53,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,wg)),l._8(57,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,xg)),l._8(62,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Cg)),l._8(66,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,7,0,e.isPreview),n(t,10,0,!e.isPreview),n(t,17,0,e.isPreview),n(t,20,0,!e.isPreview),n(t,37,0,!e.isPreview),n(t,40,0,e.transaction.note||!e.isPreview),n(t,46,0,"-icon",n(t,47,0,!e.isPreview&&e.transaction.balance.isGreaterThan(0)&&!e.transaction.coinsMovedInternally)),n(t,57,0,e.price),n(t,62,0,!e.showInputsOutputs),n(t,66,0,e.showInputsOutputs)},function(n,t){var e=t.component;n(t,25,0,l._32(t,25,0,l._22(t,26).transform("tx.hours"))),n(t,29,0,l._32(t,29,0,l._22(t,30).transform(e.transaction.hoursSent.toString(),!1,"first")),l._32(t,29,1,l._22(t,31).transform(e.hoursText)),l._32(t,29,2,l._22(t,32).transform(e.transaction.hoursBurned.toString(),!1,"first")),l._32(t,29,3,l._22(t,33).transform("tx.hours-burned"))),n(t,53,0,l._32(t,53,0,l._22(t,54).transform(e.transaction.balance.toString())))})}var Og=function(){function n(n,t,e,r,i){this.walletService=n,this.msgBarService=t,this.dialog=e,this.hwWalletService=r,this.translate=i,this.onBack=new l.o}return n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.sendSubscription&&this.sendSubscription.unsubscribe()},n.prototype.back=function(){this.onBack.emit(!1)},n.prototype.send=function(){var n=this;if(!this.sendButton.isLoading())if(this.msgBarService.hide(),this.sendButton.resetState(),this.transaction.wallet.encrypted&&!this.transaction.wallet.isHardware){var t=new oa;t.data={wallet:this.transaction.wallet},this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.finishSending(t)})}else this.transaction.wallet.isHardware?(this.showBusy(),this.sendSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.transaction.wallet.addresses[0].address).subscribe(function(){return n.finishSending()},function(t){return n.showError(Tc(n.translate,t))})):this.finishSending()},n.prototype.showBusy=function(){this.sendButton.setLoading(),this.backButton.setDisabled()},n.prototype.finishSending=function(n){var t=this;this.showBusy();var e=this.transaction.note.trim();this.sendSubscription=this.walletService.signTransaction(this.transaction.wallet,n?n.password:null,this.transaction).flatMap(function(l){return n&&n.close(),t.walletService.injectTransaction(l.encoded,e)}).subscribe(function(n){e&&!n?setTimeout(function(){return t.msgBarService.showWarning(t.translate.instant("send.error-saving-note"))}):setTimeout(function(){return t.msgBarService.showDone("send.sent")}),t.walletService.startDataRefreshSubscription(),t.onBack.emit(!0)},function(e){n&&n.error(e),t.showError(e&&e.result?Tc(t.translate,e):e)})},n.prototype.showError=function(n){this.msgBarService.showError(n),this.sendButton.resetState(),this.backButton.resetState().setEnabled()},n}(),Tg=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{margin-top:10px;text-align:center}"]],data:{}});function Lg(n){return l._33(0,[l._29(402653184,1,{sendButton:0}),l._29(402653184,2,{backButton:0}),(n()(),l._9(2,0,null,null,1,"app-transaction-info",[],null,null,null,Sg,cg)),l._8(3,245760,null,0,ug,[rf,fa],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(5,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.back()&&l),l},w_,g_)),l._8(8,49152,[[2,4],["backButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(9,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.send()&&l),l},w_,g_)),l._8(13,49152,[[1,4],["sendButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(14,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,3,0,t.component.transaction,!0)},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("send.back-button"))),n(t,14,0,l._32(t,14,0,l._22(t,15).transform("send.send-button")))})}var Pg=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px}"]],data:{}});function Dg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-form",[],null,[[null,"onFormSubmitted"]],function(n,t,e){var l=!0;return"onFormSubmitted"===t&&(l=!1!==n.component.onFormSubmitted(e)&&l),l},ym,cm)),l._8(1,245760,null,0,um,[ns,qc,Sc,fa,jc,Vp,oc,De.j,l.h,gf,rf],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(n,t){n(t,1,0,t.component.formData)},null)}function Ag(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-form-advanced",[],null,[[null,"onFormSubmitted"]],function(n,t,e){var l=!0;return"onFormSubmitted"===t&&(l=!1!==n.component.onFormSubmitted(e)&&l),l},sg,Fm)),l._8(1,245760,null,0,Nm,[qc,Sc,gf,ns,fa,jc,Vp,oc,De.j,rf,l.h],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(n,t){n(t,1,0,t.component.formData)},null)}function Eg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-preview",[],null,[[null,"onBack"]],function(n,t,e){var l=!0;return"onBack"===t&&(l=!1!==n.component.onBack(e)&&l),l},Lg,Tg)),l._8(1,180224,null,0,Og,[Sc,jc,fa,oc,De.j],{transaction:[0,"transaction"]},{onBack:"onBack"})],function(n,t){n(t,1,0,t.component.transaction)},null)}function Yg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(1,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(4,0,null,null,13,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,10,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Dg)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ag)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Eg)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("title.wallets"))),n(t,9,0,e.showForm&&e.activeForm===e.activeForms.LeftButton),n(t,12,0,e.showForm&&e.activeForm===e.activeForms.RightButton),n(t,15,0,!e.showForm)},null)}var jg=l._5("app-send-skycoin",Wp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-skycoin",[],null,null,null,Yg,Pg)),l._8(1,180224,null,0,Wp,[Vp,l.h],null,null)],null,null)},{},{},[]),Ig=function(){this.isLoading=!0},Rg=l._7({encapsulation:0,styles:[[".-content[_ngcontent-%COMP%]{text-align:center;margin:50px 0;color:rgba(30,34,39,.5);font-size:13px}.-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:15px}.-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:rgba(30,34,39,.2);font-size:40px}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}"]],data:{}});function Hg(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(3,573440,null,0,Wu,[l.l,Hl,[2,sn]],{diameter:[0,"diameter"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,40)},function(n,t){n(t,2,0,l._22(t,3)._elementSize,l._22(t,3)._elementSize),n(t,6,0,l._32(t,6,0,l._22(t,7).transform("common.loading")))})}function Ng(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"i",[["class","material-icons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["announcement"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,6,0,l._32(t,6,0,l._22(t,7).transform(e.noDataText)))})}function Fg(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-content"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hg)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ng)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.isLoading),n(t,6,0,!e.isLoading)},null)}var Bg=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%]{margin:10px 40px -20px;display:-webkit-box;display:-ms-flexbox;display:flex}.form-field[_ngcontent-%COMP%] .x-button[_ngcontent-%COMP%]{width:24px;height:24px;margin-top:10px;cursor:pointer}.bottom-line[_ngcontent-%COMP%]{border-bottom:2px solid rgba(0,0,0,.02)}mat-select[_ngcontent-%COMP%] .mat-select-trigger{padding:10px 30px 10px 10px;display:block;font-size:11px;height:100%;line-height:20px}mat-select[_ngcontent-%COMP%] .mat-select-value{font-size:13px;line-height:22px}mat-select[_ngcontent-%COMP%] .mat-select-arrow{border:none}mat-select[_ngcontent-%COMP%] .mat-select-placeholder{-webkit-transition:unset!important;transition:unset!important;color:rgba(30,34,39,.5)}mat-select[_ngcontent-%COMP%] .mat-select-placeholder::before{content:'filter_list';font-family:'Material Icons';font-weight:400;font-style:normal;font-size:13px;margin-right:10px}mat-select[_ngcontent-%COMP%] mat-select-trigger[_ngcontent-%COMP%]::before{content:'filter_list';font-family:'Material Icons';font-weight:400;font-style:normal;font-size:13px;margin-right:10px}mat-select[_ngcontent-%COMP%] .filter[_ngcontent-%COMP%]{font-size:13px;margin-left:28px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:rgba(30,34,39,.5)}mat-option[_ngcontent-%COMP%] .mat-pseudo-checkbox-checked{background:#0072ff}.mat-option-disabled[_ngcontent-%COMP%] .mat-pseudo-checkbox-disabled{opacity:.5}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:30px}.-transaction[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid #eff0f0;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;padding:20px 12px}.-transaction[_ngcontent-%COMP%]:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-transaction[_ngcontent-%COMP%]:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-transaction[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0 8px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%]{margin-top:5px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-transaction[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-filter:FlipH;filter:FlipH;-ms-filter:FlipH}.-transaction[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1;flex:1}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:10px;line-height:12px;padding-left:5px;font-weight:300}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-pending[_ngcontent-%COMP%]{color:#fdb51e}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px;margin-right:4px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] .note[_ngcontent-%COMP%]{color:#1e2227;word-break:break-word;display:inline}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{width:200px;text-align:right}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}"]],data:{}});function Vg(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.parent.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,l._32(t,2,0,l._22(t,3).transform("history.all-addresses")))})}function Wg(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"],disabled:[1,"disabled"]},null),(n()(),l._31(2,0,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,1,0,t.context.$implicit,t.parent.context.$implicit.allAddressesSelected)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.address,l._32(t,2,1,l._22(t,3).transform(t.context.$implicit.coins)),l._32(t,2,2,l._22(t,4).transform(t.context.$implicit.hours,!1)))})}function zg(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"mat-optgroup",[["class","mat-optgroup"],["role","group"]],[[2,"mat-optgroup-disabled",null],[1,"aria-disabled",0],[1,"aria-labelledby",0]],null,null,Mm,xm)),l._8(1,49152,[[2,4]],0,cr,[],{label:[0,"label"]},null),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,0,1,null,Vg)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,0,1,null,Wg)),l._8(9,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,l._12(3,"\n ",t.context.$implicit.label," - ",l._32(t,1,0,l._22(t,2).transform(t.context.$implicit.coins)),"\n (",l._32(t,1,0,l._22(t,3).transform(t.context.$implicit.hours,!1)),")\n ")),n(t,6,0,t.context.$implicit.addresses.length>1),n(t,9,0,t.context.$implicit.addresses)},function(n,t){n(t,0,0,l._22(t,1).disabled,l._22(t,1).disabled.toString(),l._22(t,1)._labelId)})}function Ug(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.filter")))})}function Gg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.filters")))})}function qg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.parent.parent.context.$implicit.label)})}function Jg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.parent.parent.context.$implicit.address)})}function Qg(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[["class","filter"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qg)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Jg)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(7,null,["\n - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,3,0,t.parent.context.$implicit.label),n(t,6,0,!t.parent.context.$implicit.label)},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform(t.parent.context.$implicit.coins)),l._32(t,7,1,l._22(t,9).transform(t.parent.context.$implicit.hours,!1)))})}function Kg(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Qg)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.context.$implicit.label||!t.context.$implicit.showingWholeWallet)},null)}function Xg(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["class","x-button"],["src","assets/img/close-grey.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removeFilters()&&l),l},null,null))],null,null)}function Zg(n){return l._33(0,[(n()(),l._9(0,0,null,null,38,"div",[["class","form-field"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,29,"mat-select",[["class","mat-select"],["formControlName","filter"],["id","filter"],["multiple",""],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,12)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,12)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,12)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(8,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(9,{"bottom-line":0}),l._8(10,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(12,2080768,null,3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"],multiple:[1,"multiple"],id:[2,"id"]},null),l._29(603979776,1,{options:1}),l._29(603979776,2,{optionGroups:1}),l._29(335544320,3,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(17,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,1,null,zg)),l._8(20,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._9(22,0,null,0,11,"mat-select-trigger",[],null,null,null,null,null)),l._8(23,16384,[[3,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ug)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Gg)),l._8(29,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Kg)),l._8(32,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Xg)),l._8(37,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,8,0,n(t,9,0,!e.transactions||0===e.transactions.length)),n(t,10,0,"filter"),n(t,12,0,l._32(t,12,0,l._22(t,16).transform("history.no-filter")),"","filter"),n(t,20,0,e.wallets),n(t,26,0,1===e.form.get("filter").value.length),n(t,29,0,e.form.get("filter").value.length>1),n(t,32,0,e.form.get("filter").value),n(t,37,0,e.form.get("filter").value.length>0)},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,5,1,[l._22(t,12).id,l._22(t,12).tabIndex,l._22(t,12)._ariaLabel,l._22(t,12).ariaLabelledby,l._22(t,12).required.toString(),l._22(t,12).disabled.toString(),l._22(t,12).errorState,l._22(t,12).panelOpen?l._22(t,12)._optionIds:null,l._22(t,12).multiple,l._22(t,12)._ariaDescribedby||null,l._22(t,12)._getAriaActiveDescendant(),l._22(t,12).disabled,l._22(t,12).errorState,l._22(t,12).required,l._22(t,17).ngClassUntouched,l._22(t,17).ngClassTouched,l._22(t,17).ngClassPristine,l._22(t,17).ngClassDirty,l._22(t,17).ngClassValid,l._22(t,17).ngClassInvalid,l._22(t,17).ngClassPending])})}function $g(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){var e=t.component;n(t,1,0,!e.allTransactions,e.allTransactions&&0!==e.allTransactions.length?"history.no-txs-filter":"history.no-txs")},null)}function ny(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._27(6,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.sent")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,n(t,6,0,l._22(t.parent.parent.parent.parent,0),t.parent.parent.context.$implicit.timestamp)))})}function ty(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.sending")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("history.pending")))})}function ey(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._27(6,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.received")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,n(t,6,0,l._22(t.parent.parent.parent.parent,0),t.parent.parent.context.$implicit.timestamp)))})}function ly(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.receiving")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("history.pending")))})}function ry(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ny)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ty)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ey)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ly)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.parent.context.$implicit.balance.isLessThan(0)&&t.parent.context.$implicit.confirmed),n(t,6,0,t.parent.context.$implicit.balance.isLessThan(0)&&!t.parent.context.$implicit.confirmed),n(t,9,0,t.parent.context.$implicit.balance.isGreaterThan(0)&&t.parent.context.$implicit.confirmed),n(t,12,0,t.parent.context.$implicit.balance.isGreaterThan(0)&&!t.parent.context.$implicit.confirmed)},null)}function iy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._27(6,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.moved")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,n(t,6,0,l._22(t.parent.parent.parent.parent,0),t.parent.parent.context.$implicit.timestamp)))})}function oy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.moving")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("history.pending")))})}function sy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,iy)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,oy)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.parent.context.$implicit.confirmed),n(t,6,0,!t.parent.context.$implicit.confirmed)},null)}function ay(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showQrCode(e,n.context.$implicit)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,5,0,t.context.$implicit)})}function uy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["",": "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(5,0,null,null,1,"span",[["class","note"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("history.note"))),n(t,6,0,t.parent.context.$implicit.note)})}function cy(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,7,"p",[],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(3,null,["\n ",""])),l._27(4,4),(n()(),l._9(5,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["*"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.current-rate")))},function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,n(t,4,0,l._22(t.parent.parent.parent,1),t.parent.context.$implicit.balance*e.price,"USD","symbol","1.2-2")))})}function dy(n){return l._33(0,[(n()(),l._9(0,0,null,null,36,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,33,"div",[["class","-transaction"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showTransaction(n.context.$implicit)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(6,{"-incoming":0,"-pending":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,13,"div",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ry)),l._8(14,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,sy)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ay)),l._8(20,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,uy)),l._8(23,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,8,"div",[["class","-balance"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(29,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,cy)),l._8(33,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,5,0,"-icon",n(t,6,0,t.context.$implicit.balance.isGreaterThan(0)&&!t.context.$implicit.coinsMovedInternally,!t.context.$implicit.confirmed)),n(t,14,0,!t.context.$implicit.coinsMovedInternally),n(t,17,0,t.context.$implicit.coinsMovedInternally),n(t,20,0,t.context.$implicit.addresses),n(t,23,0,t.context.$implicit.note),n(t,33,0,e.price)},function(n,t){n(t,29,0,l._32(t,29,0,l._22(t,30).transform(t.context.$implicit.balance.toString())))})}function hy(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,dy)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.transactions)},null)}function py(n){return l._33(0,[l._25(0,ag,[]),l._25(0,ln,[l.w]),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(6,0,null,null,10,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Zg)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,$g)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,hy)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.transactions"))),n(t,9,0,e.allTransactions),n(t,12,0,!e.transactions||0===e.transactions.length),n(t,15,0,e.transactions&&e.transactions.length>0)},null)}var fy=l._5("app-transaction-list",sf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-transaction-list",[],null,null,null,py,Bg)),l._8(1,245760,null,0,sf,[fa,rf,Sc,ns,Ch],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),_y=function(){function n(){this.statuses=["done","waiting_confirm","waiting_deposit","waiting_send"]}return n.prototype.transform=function(n){return this.statuses.find(function(t){return t===n})?"teller."+n.replace("_","-"):"teller.unknown"},n}(),my=l._7({encapsulation:0,styles:[[".-background-container[_ngcontent-%COMP%]{background-color:#fbfbfb;padding-top:30px;max-width:100%;min-height:calc(100% - 190px);overflow:hidden;position:relative}.-background-image[_ngcontent-%COMP%]{display:none}@media (min-width:768px){.-background-image[_ngcontent-%COMP%]{display:block;left:50%;width:80%;position:absolute;top:0}}@media (min-width:992px){.-background-image[_ngcontent-%COMP%]{left:40%;width:90%;max-width:850px}}@media (min-width:1200px){.-background-image[_ngcontent-%COMP%]{left:40%;width:80%;max-width:850px}}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;position:relative;margin-top:30px;max-width:540px;z-index:5}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:30px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{width:60px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border-radius:50%;color:#fff;display:inline-block;font-size:16px;font-weight:700;height:40px;line-height:46px;text-align:center;width:40px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1;flex:1 1}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] button{margin-left:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:0;line-height:46px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px;font-weight:300;line-height:20px;margin-top:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%], .-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;color:rgba(30,34,39,.8);display:block;font-size:14px;line-height:20px;margin-bottom:15px;padding:10px;width:100%}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#0072ff}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .form-field[_ngcontent-%COMP%]{margin-bottom:15px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-subtitle[_ngcontent-%COMP%]{color:#8c8e90;font-size:12px;line-height:18px;font-weight:300;opacity:.8}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-wallet[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px}"]],data:{}});function gy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"option",[],null,null,null,null,null)),l._8(1,147456,null,0,mo,[l.l,l.G,[2,_o]],{value:[0,"value"]},null),l._8(2,147456,null,0,bo,[l.l,l.G,[8,null]],{value:[0,"value"]},null),(n()(),l._31(3,null,["\n "," - "])),(n()(),l._9(4,0,null,null,2,"span",[["class","-coins"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,t.context.$implicit.filename),n(t,2,0,t.context.$implicit.filename)},function(n,t){n(t,3,0,t.context.$implicit.label),n(t,5,0,l._32(t,5,0,l._22(t,6).transform(t.context.$implicit.coins)))})}function yy(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","-step"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(n()(),l._31(-1,null,["2"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,17,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,3,"p",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._26(16,{rate:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,1,"span",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(20,null,["\n ","\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(n()(),l._31(23,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("buy.send"))),n(t,15,0,l._32(t,15,0,l._22(t,17).transform("buy.send-desc",n(t,16,0,e.config.sky_btc_exchange_rate)))),n(t,20,0,e.order.deposit_address),n(t,23,0,l._32(t,23,0,l._22(t,24).transform("buy.fraction-warning")))})}function by(n){return l._33(0,[(n()(),l._9(0,0,null,null,34,"div",[["class","-step"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(n()(),l._31(-1,null,["3"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,25,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,4,"span",[["class","-status"]],null,null,null,null,null)),(n()(),l._31(19,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._27(21,1),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.checkStatus()&&l),l},w_,g_)),l._8(25,49152,[[1,4],["button",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(26,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.removeOrder()&&l),l},w_,g_)),l._8(30,49152,[[1,4],["button",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(31,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("buy.receive"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("buy.receive-desc"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("buy.status-button")),l._32(t,19,1,l._22(t,22).transform(l._32(t,19,1,n(t,21,0,l._22(t.parent.parent,0),e.order.status))))),n(t,26,0,l._32(t,26,0,l._22(t,27).transform("buy.check-status-button"))),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("buy.new-order-button")))})}function vy(n){return l._33(0,[(n()(),l._9(0,0,null,null,59,"div",[["class","-paper"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,47,"div",[["class","-step"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(n()(),l._31(-1,null,["1"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,38,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,2,"h3",[],null,null,null,null,null)),(n()(),l._31(16,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(20,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,23,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,17,"select",[["class","-wallet"],["formControlName","wallet"],["id","wallet"],["required",""]],[[1,"required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,28).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,28).onTouched()&&r),r},null,null)),l._8(28,16384,null,0,_o,[l.G,l.l],null,null),l._8(29,16384,null,0,Zo,[],{required:[0,"required"]},null),l._28(1024,null,Qi,function(n){return[n]},[Zo]),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(32,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(34,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,4,"option",[["disabled",""],["selected",""]],null,null,null,null,null)),l._8(37,147456,null,0,mo,[l.l,l.G,[2,_o]],null,null),l._8(38,147456,null,0,bo,[l.l,l.G,[8,null]],null,null),(n()(),l._31(39,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gy)),l._8(43,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(n()(),l._31(49,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,yy)),l._8(55,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,by)),l._8(58,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,29,0,""),n(t,32,0,"wallet"),n(t,43,0,e.wallets),n(t,55,0,e.order),n(t,58,0,e.order)},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("buy.deposit-location"))),n(t,20,0,l._32(t,20,0,l._22(t,21).transform("buy.deposit-location-desc"))),n(t,27,0,l._22(t,29).required?"":null,l._22(t,34).ngClassUntouched,l._22(t,34).ngClassTouched,l._22(t,34).ngClassPristine,l._22(t,34).ngClassDirty,l._22(t,34).ngClassValid,l._22(t,34).ngClassInvalid,l._22(t,34).ngClassPending),n(t,39,0,l._32(t,39,0,l._22(t,40).transform("buy.make-choice"))),n(t,49,0,l._32(t,49,0,l._22(t,50).transform("buy.wallets-desc")))})}function wy(n){return l._33(0,[l._25(0,_y,[]),l._29(671088640,1,{button:0}),(n()(),l._9(2,0,null,null,1,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],null,null),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(5,0,null,null,9,"div",[["class","-background-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,6,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,vy)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,0,"img",[["class","-background-image"],["src","../../../../assets/img/otc-background.jpg"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0),n(t,10,0,e.config)},null)}var xy=l._5("app-buy",lf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-buy",[],null,null,null,wy,my)),l._8(1,245760,null,0,lf,[ns,ef,jc,Sc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]);o.a.merge=Jr.a;var My=function(){function n(n,t,e,r,i,o,s){this.exchangeService=n,this.walletService=t,this.formBuilder=e,this.msgBarService=r,this.dialog=i,this.blockchainService=o,this.translateService=s,this.defaultFromCoin="BTC",this.defaultFromAmount="0.1",this.toCoin="SKY",this.submitted=new l.o,this.problemGettingPairs=!1,this.agreement=!1,this.subscriptionsGroup=[]}return Object.defineProperty(n.prototype,"toAmount",{get:function(){if(!this.activeTradingPair)return 0;var n=this.form.get("fromAmount").value;return isNaN(n)?0:(this.form.get("fromAmount").value*this.activeTradingPair.price).toFixed(this.blockchainService.currentMaxDecimals)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"sendAmount",{get:function(){var n=this.form.get("fromAmount").value;return isNaN(parseFloat(n))?0:n},enumerable:!0,configurable:!0}),n.prototype.ngOnInit=function(){this.createForm(),this.loadData()},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.removeExchangeSubscription(),this.msgBarService.hide(),this.priceUpdateSubscription&&this.priceUpdateSubscription.unsubscribe()},n.prototype.setAgreement=function(n){this.agreement=n.checked,this.form.updateValueAndValidity()},n.prototype.selectAddress=function(){var n=this,t=new oa;t.width="566px",t.autoFocus=!1,this.dialog.open(Rm,t).afterClosed().subscribe(function(t){t&&n.form.get("toAddress").setValue(t)})},n.prototype.exchange=function(){var n=this;if(this.form.valid&&!this.exchangeButton.isLoading()){this.msgBarService.hide(),this.exchangeButton.resetState(),this.exchangeButton.setLoading(),this.exchangeButton.setDisabled();var t=parseFloat(this.form.get("fromAmount").value),e=this.form.get("toAddress").value.trim();this.removeExchangeSubscription(),this.exchangeSubscription=this.walletService.verifyAddress(e).subscribe(function(l){l?n.exchangeSubscription=n.exchangeService.exchange(n.activeTradingPair.pair,t,e,n.activeTradingPair.price).subscribe(function(t){n.submitted.emit({id:t.id,pair:t.pair,fromAmount:t.fromAmount,toAmount:t.toAmount,address:t.toAddress,timestamp:zp().unix(),price:n.activeTradingPair.price})},function(t){n.exchangeButton.resetState(),n.exchangeButton.setEnabled(),n.msgBarService.showError(t)}):n.showInvalidAddress()},function(){n.showInvalidAddress()})}},n.prototype.showInvalidAddress=function(){this.exchangeButton.resetState(),this.exchangeButton.setEnabled();var n=this.translateService.instant("exchange.invalid-address");this.msgBarService.showError(n)},n.prototype.createForm=function(){var n=this;this.form=this.formBuilder.group({fromCoin:[this.defaultFromCoin,Xi.required],fromAmount:[this.defaultFromAmount,Xi.required],toAddress:["",Xi.required]},{validator:this.validate.bind(this)}),this.subscriptionsGroup.push(this.form.get("fromCoin").valueChanges.subscribe(function(){n.updateActiveTradingPair()}))},n.prototype.loadData=function(){var n=this;this.subscriptionsGroup.push(this.exchangeService.tradingPairs().retryWhen(function(n){return n.delay(2e3).take(10).concat(o.a.throw(""))}).subscribe(function(t){n.tradingPairs=[],t.forEach(function(t){t.to===n.toCoin&&n.tradingPairs.push(t)}),n.updateActiveTradingPair(),n.updatePrices()},function(){n.problemGettingPairs=!0}))},n.prototype.updatePrices=function(){var n=this;this.priceUpdateSubscription=o.a.of(1).delay(6e4).flatMap(function(){return n.exchangeService.tradingPairs()}).retryWhen(function(n){return n.delay(6e4)}).subscribe(function(t){t.forEach(function(t){if(t.to===n.toCoin){var e=n.tradingPairs.find(function(n){return n.from===t.from});e&&(e.price=t.price)}}),n.updatePrices()})},n.prototype.updateActiveTradingPair=function(){var n=this;this.activeTradingPair=this.tradingPairs.find(function(t){return t.from===n.form.get("fromCoin").value}),!this.activeTradingPair&&this.tradingPairs.length>0&&(this.activeTradingPair=this.tradingPairs[0],this.form.get("fromCoin").setValue(this.activeTradingPair.from))},n.prototype.validate=function(n){if(!n||!this.activeTradingPair)return null;var t=n.get("fromAmount").value;if(isNaN(t))return{invalid:!0};if(tthis.activeTradingPair.max)return{max:this.activeTradingPair.max};var e=t.split(".");return e.length>1&&e[1].length>6?{decimals:!0}:this.agreement?null:{agreement:!0}},n.prototype.removeExchangeSubscription=function(){this.exchangeSubscription&&this.exchangeSubscription.unsubscribe()},n}(),ky=l._7({encapsulation:0,styles:[[".-create[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.-create[_ngcontent-%COMP%] .-form[_ngcontent-%COMP%]{-webkit-box-flex:.6;-ms-flex:.6;flex:.6}.-create[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{-webkit-box-flex:.4;-ms-flex:.4;flex:.4;margin-left:40px;margin-top:5px}.form-field[_ngcontent-%COMP%]{width:100%}.form-field[_ngcontent-%COMP%] .-error[_ngcontent-%COMP%]{color:#ff004e;margin-left:20px}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{-webkit-box-flex:.7;-ms-flex:.7;flex:.7;border-top-right-radius:0;border-bottom-right-radius:0}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%]{-webkit-box-flex:.3;-ms-flex:.3;flex:.3}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%] select[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%] select[_ngcontent-%COMP%]{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.form-field[_ngcontent-%COMP%] .-not-allowed[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{cursor:not-allowed}.-item[_ngcontent-%COMP%]{font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}.-buttons[_ngcontent-%COMP%]{text-align:center}.-buttons[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{margin-right:20px}.-check[_ngcontent-%COMP%] .mat-checkbox-layout{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:13px;color:#1e2227}.-check[_ngcontent-%COMP%] span a{color:#0072ff;text-decoration:none}.-select-address[_ngcontent-%COMP%]{padding-left:5px;color:#0072ff;cursor:pointer}.-select-address[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#0072ff;padding:0;display:inline;vertical-align:middle;font-size:13px}"]],data:{}});function Cy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){var e=t.component;n(t,1,0,!e.tradingPairs&&!e.problemGettingPairs,e.problemGettingPairs?"exchange.problem-connecting":"exchange.offline")},null)}function Sy(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","-error"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("exchange.min-amount")),e.form.getError("min"))})}function Oy(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","-error"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("exchange.max-amount")),e.form.getError("max"))})}function Ty(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"option",[],null,null,null,null,null)),l._8(1,147456,null,0,mo,[l.l,l.G,[2,_o]],{value:[0,"value"]},null),l._8(2,147456,null,0,bo,[l.l,l.G,[8,null]],{value:[0,"value"]},null),(n()(),l._31(3,null,["",""]))],function(n,t){n(t,1,0,t.context.$implicit.from),n(t,2,0,t.context.$implicit.from)},function(n,t){n(t,3,0,t.context.$implicit.from)})}function Ly(n){return l._33(0,[(n()(),l._9(0,0,null,null,52,"div",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(9,null,[""," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(12,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(19,null,["\u2248 "," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(22,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,3,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(25,null,["",""])),l._26(26,{coin:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(30,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(33,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(35,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(36,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(40,null,["1 "," \u2248 "," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(46,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\u2248 15 minutes"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("exchange.you-send"))),n(t,9,0,e.sendAmount,e.form.get("fromCoin").value),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("exchange.you-get"))),n(t,19,0,e.toAmount,e.toCoin),n(t,25,0,l._32(t,25,0,l._22(t,27).transform("exchange.to-address",n(t,26,0,e.toCoin)))),n(t,30,0,e.form.get("toAddress").value||"-"),n(t,36,0,l._32(t,36,0,l._22(t,37).transform("exchange.price"))),n(t,40,0,e.form.get("fromCoin").value,e.activeTradingPair.price.toFixed(6),e.toCoin),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("exchange.time-15")))})}function Py(n){return l._33(0,[(n()(),l._9(0,0,null,null,113,"div",[["class","-create"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,107,"div",[["class","-form"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,3).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,3).onReset()&&r),r},null,null)),l._8(3,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(5,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,35,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,8,"label",[["for","fromAmount"]],null,null,null,null,null)),(n()(),l._31(10,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,Sy)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Oy)),l._8(16,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,22,"div",[["class","-inputs"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,5,"input",[["formControlName","fromAmount"],["id","fromAmount"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,22)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,22).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,22)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,22)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(22,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(24,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(26,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,12,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,9,"select",[["formControlName","fromCoin"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,31).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,31).onTouched()&&r),r},null,null)),l._8(31,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(33,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(35,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ty)),l._8(38,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,15,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,2,"label",[["for","toAmount"]],null,null,null,null,null)),(n()(),l._31(47,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(50,0,null,null,8,"div",[["class","-inputs -not-allowed"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(52,0,null,null,0,"input",[["id","toAmount"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(54,0,null,null,3,"div",[["class","-input"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,0,"input",[["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(61,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,14,"label",[["for","toAddress"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(65,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(66,null,["",""])),l._26(67,{coin:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(70,0,null,null,6,"span",[["class","-select-address"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.selectAddress()&&l),l},null,null)),(n()(),l._31(71,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(73,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(74,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(79,0,null,null,5,"input",[["formControlName","toAddress"],["id","toAddress"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,80)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,80).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,80)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,80)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(80,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(82,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(84,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(87,0,null,null,21,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(89,0,null,null,13,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAgreement(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(91,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],null,{change:"change"}),(n()(),l._31(92,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(94,0,null,0,2,"a",[["href","https://swaplab.cc/terms"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(95,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(97,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(99,0,null,0,2,"a",[["href","https://swaplab.cc/privacy"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(100,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(104,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.exchange()&&l),l},w_,g_)),l._8(105,49152,[[1,4],["exchangeButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(106,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Ly)),l._8(112,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.form),n(t,13,0,e.form.hasError("min")),n(t,16,0,e.form.hasError("max")),n(t,24,0,"fromAmount"),n(t,33,0,"fromCoin"),n(t,38,0,e.tradingPairs),n(t,74,0),n(t,82,0,"toAddress"),n(t,105,0,!e.form.valid),n(t,112,0,e.activeTradingPair)},function(n,t){var e=t.component;n(t,2,0,l._22(t,5).ngClassUntouched,l._22(t,5).ngClassTouched,l._22(t,5).ngClassPristine,l._22(t,5).ngClassDirty,l._22(t,5).ngClassValid,l._22(t,5).ngClassInvalid,l._22(t,5).ngClassPending),n(t,10,0,l._32(t,10,0,l._22(t,11).transform("exchange.you-send"))),n(t,21,0,l._22(t,26).ngClassUntouched,l._22(t,26).ngClassTouched,l._22(t,26).ngClassPristine,l._22(t,26).ngClassDirty,l._22(t,26).ngClassValid,l._22(t,26).ngClassInvalid,l._22(t,26).ngClassPending),n(t,30,0,l._22(t,35).ngClassUntouched,l._22(t,35).ngClassTouched,l._22(t,35).ngClassPristine,l._22(t,35).ngClassDirty,l._22(t,35).ngClassValid,l._22(t,35).ngClassInvalid,l._22(t,35).ngClassPending),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("exchange.you-get"))),n(t,52,0,e.toAmount),n(t,56,0,e.toCoin),n(t,66,0,l._32(t,66,0,l._22(t,68).transform("exchange.to-address",n(t,67,0,e.toCoin)))),n(t,71,0,l._32(t,71,0,l._22(t,72).transform("exchange.select"))),n(t,79,0,l._22(t,84).ngClassUntouched,l._22(t,84).ngClassTouched,l._22(t,84).ngClassPristine,l._22(t,84).ngClassDirty,l._22(t,84).ngClassValid,l._22(t,84).ngClassInvalid,l._22(t,84).ngClassPending),n(t,89,0,l._22(t,91).id,l._22(t,91).indeterminate,l._22(t,91).checked,l._22(t,91).disabled,"before"==l._22(t,91).labelPosition),n(t,92,0,l._32(t,92,0,l._22(t,93).transform("exchange.agree-1"))),n(t,95,0,l._32(t,95,0,l._22(t,96).transform("exchange.agree-2"))),n(t,97,0,l._32(t,97,0,l._22(t,98).transform("exchange.agree-3"))),n(t,100,0,l._32(t,100,0,l._22(t,101).transform("exchange.agree-4"))),n(t,106,0,l._32(t,106,0,l._22(t,107).transform("exchange.exchange-button")))})}function Dy(n){return l._33(0,[l._29(671088640,1,{exchangeButton:0}),(n()(),l._4(16777216,null,null,1,null,Cy)),l._8(2,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,Py)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,!e.activeTradingPair),n(t,5,0,e.activeTradingPair)},null)}var Ay=this&&this.__assign||Object.assign||function(n){for(var t,e=1,l=arguments.length;e .-img[_ngcontent-%COMP%]{width:17px;margin-right:15px}.-item[_ngcontent-%COMP%]{font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%] .info-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.-external[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{line-height:13px;height:13px;width:13px;font-size:16px;vertical-align:middle;color:#0072ff;margin-left:10px}.expand[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer;font-size:13px}.expand[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#0072ff;padding:0;display:inline;vertical-align:middle;font-size:13px}.buttons[_ngcontent-%COMP%]{width:100%;text-align:center;margin-top:10px}"]],data:{}});function jy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","exchange.order-not-found"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!t.component.showError,"exchange.order-not-found")},null)}function Iy(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["class","qr-code-button -img"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.showQrCode(r.order.exchangeTag)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("exchange.details.exchange-addr-tag"))),n(t,11,0,e.order.exchangeTag)})}function Ry(n){return l._33(0,[(n()(),l._31(-1,null,["\n "])),(n()(),l._9(1,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(12,null,[""," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(16,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,0,"img",[["class","qr-code-button -img"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.showQrCode(r.order.exchangeAddress)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(23,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(27,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Iy)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,32,0,t.component.order.exchangeTag)},function(n,t){var e=t.component;n(t,8,0,l._32(t,8,0,l._22(t,9).transform("exchange.you-send"))),n(t,12,0,e.order.fromAmount,e.fromCoin),n(t,23,0,l._32(t,23,0,l._22(t,24).transform("exchange.details.exchange-addr"))),n(t,27,0,e.order.exchangeAddress)})}function Hy(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,null,null,null,null,null,null,null))],null,null)}function Ny(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hy)),l._8(3,540672,null,0,H,[l.R],{ngTemplateOutlet:[0,"ngTemplateOutlet"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,l._22(t.parent,55))},null)}function Fy(n){return l._33(0,[(n()(),l._9(0,0,null,null,20,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,15,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,8,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(11,null,["\n ","\n "])),(n()(),l._9(12,0,null,null,5,"a",[["class","-external"],["rel","noreferrer nofollow"],["target","_blank"]],[[8,"href",4]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(15,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["launch"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,15,0)},function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("exchange.details.tx-id"))),n(t,11,0,e.order.toTx),n(t,12,0,e.appService.explorerUrl+"/transaction/"+e.order.toTx)})}function By(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("exchange.details.error-msg"))),n(t,11,0,e.order.message)})}function Vy(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,null,null,null,null,null,null,null))],null,null)}function Wy(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Vy)),l._8(3,540672,null,0,H,[l.R],{ngTemplateOutlet:[0,"ngTemplateOutlet"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,l._22(t.parent.parent,55))},null)}function zy(n){return l._33(0,[(n()(),l._9(0,0,null,null,67,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,14,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._27(14,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Wy)),l._8(19,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(21,0,null,null,14,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(28,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(31,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(32,null,[""," ",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(37,0,null,null,14,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(41,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,3,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(44,null,["",""])),l._26(45,{coin:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(49,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(53,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(55,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(57,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(59,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(60,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(64,null,["1 "," \u2248 "," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,19,0,e.order.status!==e.statuses[0])},function(n,t){var e=t.component;n(t,9,0,l._32(t,9,0,l._22(t,10).transform("exchange.details.start-date"))),n(t,13,0,l._32(t,13,0,n(t,14,0,l._22(t.parent.parent,0),e._orderDetails.timestamp))),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("exchange.you-get"))),n(t,32,0,l._32(t,32,0,l._22(t,33).transform(e.order.toAmount,!0,"first")),e.toCoin),n(t,44,0,l._32(t,44,0,l._22(t,46).transform("exchange.to-address",n(t,45,0,e.toCoin)))),n(t,49,0,e.order.toAddress),n(t,60,0,l._32(t,60,0,l._22(t,61).transform("exchange.details.initial-price"))),n(t,64,0,e.fromCoin,e._orderDetails.price,e.toCoin)})}function Uy(n){return l._33(0,[(n()(),l._9(0,0,null,null,82,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,31,"div",[["class","-wrapper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,23,"div",[["class","-status"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(7,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(8,{"-spin":0}),l._8(9,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(10,0,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,14,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,7,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(19,null,[""," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(21,16777216,null,null,4,"mat-icon",[["class","info-icon mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,23).show()&&r),"keydown"===t&&(r=!1!==l._22(n,23)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,23).hide(1500)&&r),r},Hf,Rf)),l._8(22,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(23,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(30,null,["",""])),l._26(31,{from:0,to:1}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(35,0,null,null,1,"mat-progress-bar",[["aria-valuemax","100"],["aria-valuemin","0"],["class","mat-progress-bar"],["role","progressbar"]],[[1,"aria-valuenow",0],[1,"mode",0],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null]],null,null,u_,a_)),l._8(36,49152,null,0,Nu,[],{value:[0,"value"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(38,0,null,null,43,"div",[["class","-details"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(40,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(47,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(50,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(51,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(0,[["fromInfo",2]],null,0,null,Ry)),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Ny)),l._8(58,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Fy)),l._8(61,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,By)),l._8(64,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(66,0,null,null,11,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(68,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(70,0,null,null,6,"span",[["class","expand"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleDetails()&&l),l},null,null)),(n()(),l._31(71,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(73,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(74,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(75,0,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,zy)),l._8(80,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,7,0,n(t,8,0,"refresh"===e.statusIcon)),n(t,9,0),n(t,22,0),n(t,23,0,l._32(t,23,0,l._22(t,24).transform(e.translatedStatus.info))),n(t,36,0,e.progress),n(t,58,0,e.order.status===e.statuses[0]),n(t,61,0,e.order.status===e.statuses[5]),n(t,64,0,e.order.status===e.statuses[6]),n(t,74,0),n(t,80,0,e.expanded)},function(n,t){var e=t.component;n(t,10,0,e.statusIcon),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("exchange.status"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform(e.translatedStatus.text,e.translatedStatus.params))),n(t,30,0,l._32(t,30,0,l._22(t,32).transform("exchange.exchanging",n(t,31,0,e.fromCoin,e.toCoin)))),n(t,35,0,l._22(t,36).value,l._22(t,36).mode,"primary"==l._22(t,36).color,"accent"==l._22(t,36).color,"warn"==l._22(t,36).color),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("exchange.details.order-id"))),n(t,51,0,e.order.id),n(t,71,0,l._32(t,71,0,l._22(t,72).transform("exchange.details.details"))),n(t,75,0,e.expanded?"keyboard_arrow_up":"keyboard_arrow_down")})}function Gy(n){return l._33(0,[l._25(0,ag,[]),(n()(),l._4(16777216,null,null,1,null,jy)),l._8(2,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,Uy)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(7,0,null,null,6,"div",[["class","buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.close()&&l),l},w_,g_)),l._8(10,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(11,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.loading),n(t,5,0,!e.loading)},function(n,t){n(t,11,0,l._32(t,11,0,l._22(t,12).transform("exchange.details.back")))})}var qy=l._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px 30px 10px}.-contact[_ngcontent-%COMP%]{margin:15px 30px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.-contact[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;margin:0 5px;opacity:.5;display:inline-block;vertical-align:middle}.-contact[_ngcontent-%COMP%] span[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{text-decoration:none;color:#0072ff}.-contact[_ngcontent-%COMP%] .history[_ngcontent-%COMP%]{opacity:1}.-contact[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;vertical-align:middle}.-contact[_ngcontent-%COMP%] .history-text[_ngcontent-%COMP%]{font-size:14px;opacity:1}"]],data:{}});function Jy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange-create",[],null,[[null,"submitted"]],function(n,t,e){var l=!0;return"submitted"===t&&(l=!1!==n.component.showStatus(e)&&l),l},Dy,ky)),l._8(1,245760,null,0,My,[pf,Sc,ns,jc,fa,qc,De.j],null,{submitted:"submitted"})],function(n,t){n(t,1,0)},null)}function Qy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange-status",[],null,[[null,"goBack"]],function(n,t,e){var l=!0;return"goBack"===t&&(l=!1!==n.component.goBack()&&l),l},Gy,Yy)),l._8(1,180224,null,0,Ey,[pf,fa,qc,gf],{orderDetails:[0,"orderDetails"]},{goBack:"goBack"})],function(n,t){n(t,1,0,t.component.currentOrderDetails)},null)}function Ky(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"span",[["class","history"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,7,"a",[["href","#"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showHistory(e)&&l),l},null,null)),(n()(),l._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(4,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["history"])),(n()(),l._31(-1,null,[" "])),(n()(),l._9(7,0,null,null,2,"span",[["class","history-text"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0)},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("exchange.history")))})}function Xy(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(1,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(4,0,null,null,40,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,7,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Jy)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Qy)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,28,"div",[["class","-contact"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ky)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,19,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,6,"span",[],null,null,null,null,null)),(n()(),l._31(26,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(28,0,null,null,2,"a",[["href","https://swaplabcc.freshdesk.com/support/home"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(29,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["|"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,5,"span",[],null,null,null,null,null)),(n()(),l._31(37,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(39,0,null,null,1,"a",[["href","https://swaplab.cc"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(-1,null,["SWAPLAB.CC"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("title.exchange"))),n(t,9,0,!e.currentOrderDetails&&!e.loading),n(t,12,0,e.currentOrderDetails&&!e.loading),n(t,20,0,e.hasHistory)},function(n,t){n(t,26,0,l._32(t,26,0,l._22(t,27).transform("exchange.need-help"))),n(t,29,0,l._32(t,29,0,l._22(t,30).transform("exchange.support-portal"))),n(t,37,0,l._32(t,37,0,l._22(t,38).transform("exchange.powered-by")))})}var Zy=l._5("app-exchange",_f,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange",[],null,null,null,Xy,qy)),l._8(1,245760,null,0,_f,[pf,fa],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),$y=l._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px;margin:30px 30px 0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:first-child{margin-top:0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:last-child{margin-bottom:0}.-text-muted[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-text-right[_ngcontent-%COMP%]{text-align:right}.-link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function nb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","backup.no-wallets"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!1,"backup.no-wallets")},null)}function tb(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-width-250 -label"]],[[1,"title",0]],null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,1,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,5,"div",[["class","-flex-fill -text-right"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"span",[["class","-link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showSeed(n.context.$implicit)&&l),l},null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,2,0,t.context.$implicit.label),n(t,3,0,t.context.$implicit.label),n(t,6,0,t.context.$implicit.filename),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("backup.show-seed")))})}function eb(n){return l._33(0,[(n()(),l._9(0,0,null,null,20,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,11,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"div",[["class","-width-250"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,0,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,tb)),l._8(18,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,18,0,t.component.onlyEncrypted)},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("backup.wallet"))),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("backup.filename")))})}function lb(n){return l._33(0,[(n()(),l._9(0,0,null,null,31,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,24,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,15,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(11,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,4,"p",[["class","-text-muted"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,1,"small",[],[[8,"innerHTML",1]],null,null,null,null)),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,nb)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,eb)),l._8(29,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.backup"))),n(t,26,0,0===e.onlyEncrypted.length),n(t,29,0,e.onlyEncrypted.length>0)},function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("backup.wallet-directory")),e.folder),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("backup.seed-warning"))),n(t,20,0,l._32(t,20,0,l._22(t,21).transform("backup.desc")))})}var rb=l._5("app-backup",$p,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-backup",[],null,null,null,lb,$y)),l._8(1,245760,null,0,$p,[Sc,fa],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),ib=l._7({encapsulation:0,styles:[[".-wrapper[_ngcontent-%COMP%]{margin:30px}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}"]],data:{}});function ob(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],null,null)],null,null)}function sb(n){return l._33(0,[(n()(),l._9(0,0,null,null,101,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,98,"div",[["class","row -wrapper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,36,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,33,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._27(16,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(22,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(26,null,["",""])),l._27(27,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(32,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(33,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(37,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,57,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,54,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,51,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(50,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(52,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(53,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(57,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(61,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(64,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(67,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(68,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(73,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(77,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(78,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(81,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(82,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(86,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(88,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(89,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(92,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(93,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("blockchain.blocks"))),n(t,15,0,l._32(t,15,0,n(t,16,0,l._22(t.parent,0),e.block.header.seq))),n(t,22,0,l._32(t,22,0,l._22(t,23).transform("blockchain.time"))),n(t,26,0,l._32(t,26,0,n(t,27,0,l._22(t.parent,1),e.block.header.timestamp))),n(t,33,0,l._32(t,33,0,l._22(t,34).transform("blockchain.hash"))),n(t,37,0,e.block.header.block_hash),n(t,53,0,l._32(t,53,0,l._22(t,54).transform("blockchain.current-supply"))),n(t,57,0,l._32(t,57,0,l._22(t,58).transform(e.coinSupply.current_supply,!0,"first"))),n(t,64,0,l._32(t,64,0,l._22(t,65).transform("blockchain.total-supply"))),n(t,68,0,l._32(t,68,0,l._22(t,69).transform(e.coinSupply.total_supply,!0,"first"))),n(t,78,0,l._32(t,78,0,l._22(t,79).transform("blockchain.current-coinhour-supply"))),n(t,82,0,l._32(t,82,0,l._22(t,83).transform(e.coinSupply.current_coinhour_supply,!1,"first"))),n(t,89,0,l._32(t,89,0,l._22(t,90).transform("blockchain.total-coinhour-supply"))),n(t,93,0,l._32(t,93,0,l._22(t,94).transform(e.coinSupply.total_coinhour_supply,!1,"first")))})}function ab(n){return l._33(0,[l._25(0,tn,[l.w]),l._25(0,ag,[]),(n()(),l._9(2,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(5,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,ob)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,sb)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("title.blockchain"))),n(t,9,0,!(e.block&&e.block.header&&e.coinSupply)),n(t,12,0,e.block&&e.block.header&&e.coinSupply)},null)}var ub=l._5("app-blockchain",Kp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-blockchain",[],null,null,null,ab,ib)),l._8(1,245760,null,0,Kp,[qc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),cb=function(){function n(n){this.translateService=n}return n.prototype.transform=function(n){var t=zp().unix()-n;return t<60?this.translateService.instant("time-from-now.few-seconds"):t<120?this.translateService.instant("time-from-now.minute"):t<3600?this.translateService.instant("time-from-now.minutes",{time:Math.floor(t/60)}):t<7200?this.translateService.instant("time-from-now.hour"):t<86400?this.translateService.instant("time-from-now.hours",{time:Math.floor(t/3600)}):t<172800?this.translateService.instant("time-from-now.day"):this.translateService.instant("time-from-now.days",{time:Math.floor(t/86400)})},n}(),db=l._7({encapsulation:0,styles:[[".-last-seen[_ngcontent-%COMP%], .-port[_ngcontent-%COMP%], .-source[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-direction[_ngcontent-%COMP%]{width:72px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-negative:0;flex-shrink:0}.-direction[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-direction[_ngcontent-%COMP%] img.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.-last-seen[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:12px;line-height:1;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.-last-seen[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:12px;display:inline;vertical-align:middle;padding-right:5px}.-trusted[_ngcontent-%COMP%]{display:inline;color:#0072ff;font-size:13px;vertical-align:middle}.-text-right[_ngcontent-%COMP%]{text-align:right}.-pl-0[_ngcontent-%COMP%]{padding-left:0!important}.-block-row[_ngcontent-%COMP%]{width:150px;-ms-flex-negative:0;flex-shrink:0}.-invisible[_ngcontent-%COMP%]{display:none}@media (max-width:991px){.-pl-0[_ngcontent-%COMP%]{width:160px!important}.-block-row[_ngcontent-%COMP%]{width:90px;-ms-flex-negative:0;flex-shrink:0}}"]],data:{}});function hb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],null,null)],null,null)}function pb(n){return l._33(0,[(n()(),l._9(0,0,null,null,46,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,7,"div",[["class","-direction"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,16777216,null,null,4,"img",[["src","/assets/img/send-blue.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,7).show()&&r),"keydown"===t&&(r=!1!==l._22(n,7)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,7).hide(1500)&&r),r},null,null)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(6,{"-incoming":0}),l._8(7,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,4,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(n()(),l._31(12,null,["\n ",""])),(n()(),l._9(13,0,null,null,1,"span",[["class","-port"]],null,null,null,null,null)),(n()(),l._31(14,null,[":",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,2,"div",[["class","-flex-fill -source"]],null,null,null,null,null)),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,1,"div",[["class","-block-row -text-right"]],null,null,null,null,null)),(n()(),l._31(22,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,21,"div",[["class","-width-200 -last-seen"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,30).show()&&r),"keydown"===t&&(r=!1!==l._22(n,30)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,30).hide(1500)&&r),r},Hf,Rf)),l._8(29,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(30,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["keyboard_arrow_up"])),(n()(),l._31(33,null,["\n ","\n "])),l._25(0,cb,[De.j]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,40).show()&&r),"keydown"===t&&(r=!1!==l._22(n,40)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,40).hide(1500)&&r),r},Hf,Rf)),l._8(39,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(40,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(43,null,["\n ","\n "])),l._25(0,cb,[De.j]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,5,0,n(t,6,0,!t.context.$implicit.outgoing)),n(t,7,0,l._32(t,7,0,l._22(t,8).transform(t.context.$implicit.outgoing?"network.out":"network.in"))),n(t,29,0),n(t,30,0,l._32(t,30,0,l._22(t,31).transform("network.last-sent"))),n(t,39,0),n(t,40,0,l._32(t,40,0,l._22(t,41).transform("network.last-received")))},function(n,t){n(t,12,0,t.context.$implicit.address.split(":")[0]),n(t,14,0,t.context.$implicit.listen_port),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("network.sources."+t.context.$implicit.source))),n(t,22,0,t.context.$implicit.height),n(t,33,0,l._32(t,33,0,l._22(t,34).transform(t.context.$implicit.last_sent))),n(t,43,0,l._32(t,43,0,l._22(t,44).transform(t.context.$implicit.last_received)))})}function fb(n){return l._33(0,[(n()(),l._9(0,0,null,null,35,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,32,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,23,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,0,"div",[["class","-direction"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"div",[["class","d-lg-block -invisible -block-row -text-right"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,2,"div",[["class","d-lg-none -block-row -text-right"]],null,null,null,null,null)),(n()(),l._31(21,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,2,"div",[["class","-width-200"]],null,null,null,null,null)),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,pb)),l._8(32,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,32,0,t.component.peers)},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("network.peer"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("network.source"))),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("network.block-height"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("network.block-height-short"))),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("network.last-seen")))})}function _b(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,hb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,fb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.network"))),n(t,7,0,!e.peers),n(t,10,0,e.peers)},null)}var mb=l._5("app-network",tf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-network",[],null,null,null,_b,db)),l._8(1,245760,null,0,tf,[nf],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),gb=l._7({encapsulation:0,styles:[[".-text-right[_ngcontent-%COMP%]{text-align:right}.-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-hash[_ngcontent-%COMP%]{margin-left:27px;word-break:break-all}.-address[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-address[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:17px;vertical-align:middle;margin-right:10px}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function yb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","errors.no-outputs"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!t.component.wallets,"errors.no-outputs")},null)}function bb(n){return l._33(0,[(n()(),l._9(0,0,null,null,12,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-flex-fill -hash"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"div",[["class","-width-150 -text-right -grey"]],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.context.$implicit.hash),n(t,6,0,l._32(t,6,0,l._22(t,7).transform(t.context.$implicit.coins,!0,"first"))),n(t,10,0,l._32(t,10,0,l._22(t,11).transform(t.context.$implicit.calculated_hours,!1,"first")))})}function vb(n){return l._33(0,[(n()(),l._9(0,0,null,null,12,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,6,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,3,"div",[["class","-flex-fill -address"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showQrCode(e,n.context.$implicit.address)&&l),l},null,null)),(n()(),l._31(7,null,["\n ","\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,bb)),l._8(11,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,t.context.$implicit.outputs)},function(n,t){n(t,7,0,t.context.$implicit.address)})}function wb(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,12,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"div",[["class","-flex-fill -label"]],[[1,"title",0]],null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(n()(),l._31(12,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,vb)),l._8(19,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,19,0,t.context.$implicit.addresses)},function(n,t){n(t,4,0,t.context.$implicit.label),n(t,5,0,t.context.$implicit.label),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("coin"))),n(t,12,0,l._32(t,12,0,l._22(t,13).transform("hours")))})}function xb(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,wb)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.wallets)},null)}function Mb(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,yb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,xb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.outputs"))),n(t,7,0,!e.wallets||0===e.wallets.length||0===e.wallets[0].addresses[0].outputs.length),n(t,10,0,e.wallets&&e.wallets.length>0)},null)}var kb=l._5("app-outputs",Jp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-outputs",[],null,null,null,Mb,gb)),l._8(1,180224,null,0,Jp,[Sc,Ch,fa],null,null)],null,null)},{},{},[]),Cb=l._7({encapsulation:0,styles:[[".-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-txid[_ngcontent-%COMP%]{word-break:break-all}"]],data:{}});function Sb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","pending-txs.none"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!t.component.transactions,"pending-txs.none")},null)}function Ob(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-flex-fill -txid"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,2,"div",[["class","-width-150 -timestamp"]],null,null,null,null,null)),(n()(),l._31(14,null,["",""])),l._27(15,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.context.$implicit.txid),n(t,6,0,l._32(t,6,0,l._22(t,7).transform(t.context.$implicit.amount,!0,"first"))),n(t,10,0,l._32(t,10,0,l._22(t,11).transform(t.context.$implicit.hours,!1,"first"))),n(t,14,0,l._32(t,14,0,n(t,15,0,l._22(t.parent.parent,0),t.context.$implicit.timestamp)))})}function Tb(n){return l._33(0,[(n()(),l._9(0,0,null,null,29,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,26,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,17,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(19,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ob)),l._8(26,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,26,0,t.component.transactions)},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("pending-txs.txid"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("coin"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("hours"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("pending-txs.timestamp")))})}function Lb(n){return l._33(0,[l._25(0,ag,[]),(n()(),l._9(1,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(4,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Sb)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Tb)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,l._32(t,4,0,l._22(t,5).transform("title.pending-txs"))),n(t,8,0,!e.transactions||0===e.transactions.length),n(t,11,0,e.transactions&&e.transactions.length>0)},null)}var Pb=l._5("app-pending-transactions",Up,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-pending-transactions",[],null,null,null,Lb,Cb)),l._8(1,245760,null,0,Up,[Sc,Vp],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),Db=function(){function n(n){this.el=n,n.nativeElement.autocomplete="new-password",n.nativeElement.readOnly=!0}return n.prototype.onFocus=function(){this.el.nativeElement.readOnly=!1},n}(),Ab=l._7({encapsulation:0,styles:[[".dashed-border[_ngcontent-%COMP%]{border:1px dashed rgba(0,0,0,.25)}.show-pointer[_ngcontent-%COMP%]{cursor:pointer}.non-editable-field[_ngcontent-%COMP%]{font-size:12px;text-align:center;padding:15px;border-radius:6px;color:#171a1d}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%]{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:5px;opacity:1}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] .green[_ngcontent-%COMP%]{color:#00df80}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] .yellow[_ngcontent-%COMP%]{color:#ffc125}.normal-seed-field[_ngcontent-%COMP%]{font-size:14px}.seed-type-button[_ngcontent-%COMP%]{width:100%;height:10px;text-align:right}.seed-type-button[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:inline-block;width:32px;height:32px;position:relative;left:16px;top:-10px;background-color:#fff;border-radius:100px;cursor:pointer}.seed-type-button[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] > img[_ngcontent-%COMP%]{width:32px;height:32px}.onboarding-version[_ngcontent-%COMP%]{border:1px dashed rgba(255,255,255,.5);color:#fff}.transparent-text[_ngcontent-%COMP%]{opacity:.75}.red-disclaimer-box[_ngcontent-%COMP%]{color:#ff004e;font-size:12px;padding:0 10px;line-height:1.5}.white-disclaimer-box[_ngcontent-%COMP%]{color:#fafafa;font-size:12px;padding:0 10px;line-height:1.5}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer;color:#0072ff}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px;color:#1e2227}label[for=seed][_ngcontent-%COMP%] .-white-text[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fff!important}.-passwords[_ngcontent-%COMP%]{margin-left:24px}.-passwords[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin:5px 0 15px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}"]],data:{}});function Eb(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"label",[["for","number_of_words"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,21,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,18,"select",[["formControlName","number_of_words"],["id","number_of_words"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,9).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,9).onTouched()&&r),r},null,null)),l._8(9,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(11,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(13,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,4,"option",[],null,null,null,null,null)),l._8(16,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(17,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,4,"option",[],null,null,null,null,null)),l._8(22,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(23,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(24,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,"number_of_words"),n(t,16,0,12),n(t,17,0,12),n(t,22,0,24),n(t,23,0,24)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.words-number"))),n(t,8,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("wallet.new.12-words"))),n(t,24,0,l._32(t,24,0,l._22(t,25).transform("wallet.new.24-words")))})}function Yb(n){return l._33(0,[(n()(),l._9(0,0,null,null,18,"span",[["class","generators"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"-white-text":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0,i=n.component;return"longpress"===t&&(r=!1!==l._22(n,5).show()&&r),"keydown"===t&&(r=!1!==l._22(n,5)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,5).hide(1500)&&r),"click"===t&&(r=!1!==i.generateSeed(128)&&r),r},null,null)),l._8(5,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(7,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"span",[["class","divider"]],null,null,null,null,null)),(n()(),l._31(-1,null,["|"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0,i=n.component;return"longpress"===t&&(r=!1!==l._22(n,14).show()&&r),"keydown"===t&&(r=!1!==l._22(n,14)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,14).hide(1500)&&r),"click"===t&&(r=!1!==i.generateSeed(256)&&r),r},null,null)),l._8(14,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(16,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,"generators",n(t,2,0,t.component.onboarding)),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("wallet.new.generate-12-seed"))),n(t,14,0,l._32(t,14,0,l._22(t,15).transform("wallet.new.generate-24-seed")))},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("wallet.new.12-words"))),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("wallet.new.24-words")))})}function jb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[["class","normal-seed-field"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.lastAssistedSeed)})}function Ib(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(2,{"transparent-text":0}),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,n(t,2,0,t.component.onboarding))},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.seed.change-seed")))})}function Rb(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[["class","text-with-icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","yellow mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["touch_app"])),(n()(),l._9(5,0,null,null,4,"span",[],null,null,null,null,null)),l._8(6,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(7,{"transparent-text":0}),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,6,0,n(t,7,0,e.onboarding))},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.new.seed.enter-seed")))})}function Hb(n){return l._33(0,[(n()(),l._9(0,0,null,null,27,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,12,"div",[["class","dashed-border non-editable-field"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.enterSeed()&&l),l},null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(4,{"onboarding-version":0,"show-pointer":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,jb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ib)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Rb)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,10,"div",[["class","seed-type-button"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,7,"div",[],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changeSeedType()&&l),l},null,null)),l._8(19,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(20,{"dashed-border":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,16777216,null,null,2,"img",[["src","../../../../assets/img/lock-gold.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,23).show()&&r),"keydown"===t&&(r=!1!==l._22(n,23)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,23).hide(1500)&&r),r},null,null)),l._8(23,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,"dashed-border non-editable-field",n(t,4,0,e.onboarding,!e.create)),n(t,7,0,e.create||e.lastAssistedSeed),n(t,10,0,!e.create&&e.lastAssistedSeed),n(t,13,0,!e.create&&!e.lastAssistedSeed),n(t,19,0,n(t,20,0,!e.onboarding)),n(t,23,0,l._32(t,23,0,l._22(t,24).transform("wallet.new.seed.use-custom-seed")))},null)}function Nb(n){return l._33(0,[(n()(),l._9(0,0,null,null,20,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,5,"textarea",[["formControlName","seed"],["id","seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,3)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,3).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,3)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,3)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(3,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(5,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(7,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,10,"div",[["class","seed-type-button"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,7,"div",[],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changeSeedType()&&l),l},null,null)),l._8(12,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(13,{"dashed-border":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,16777216,null,null,2,"img",[["src","../../../../assets/img/unlock-grey.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,16).show()&&r),"keydown"===t&&(r=!1!==l._22(n,16)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,16).hide(1500)&&r),r},null,null)),l._8(16,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,5,0,"seed"),n(t,12,0,n(t,13,0,!e.onboarding)),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("wallet.new.seed.use-normal-seed")))},function(n,t){n(t,2,0,l._22(t,7).ngClassUntouched,l._22(t,7).ngClassTouched,l._22(t,7).ngClassPristine,l._22(t,7).ngClassDirty,l._22(t,7).ngClassValid,l._22(t,7).ngClassInvalid,l._22(t,7).ngClassPending)})}function Fb(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"p",[],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(2,{"red-disclaimer-box":0,"white-disclaimer-box transparent-text":1}),(n()(),l._31(3,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,n(t,2,0,!e.onboarding,e.onboarding))},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.seed-warning")))})}function Bb(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[["class","text-with-icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","yellow mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["touch_app"])),(n()(),l._9(5,0,null,null,4,"span",[],null,null,null,null,null)),l._8(6,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(7,{"transparent-text":0}),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,6,0,n(t,7,0,e.onboarding))},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.new.seed.confirm-seed")))})}function Vb(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","text-with-icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","green mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["done"])),(n()(),l._31(-1,null,[" "])),(n()(),l._9(6,0,null,null,4,"span",[],null,null,null,null,null)),l._8(7,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(8,{"transparent-text":0}),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,7,0,n(t,8,0,e.onboarding))},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("wallet.new.seed.confirmed-seed")))})}function Wb(n){return l._33(0,[(n()(),l._9(0,0,null,null,12,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,9,"div",[["class","dashed-border non-editable-field"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.confirmNormalSeed()&&l),l},null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(4,{"onboarding-version":0,"show-pointer":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Bb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Vb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,"dashed-border non-editable-field",n(t,4,0,e.onboarding,!e.assistedSeedConfirmed)),n(t,7,0,!e.assistedSeedConfirmed),n(t,10,0,e.assistedSeedConfirmed)},null)}function zb(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,5,"textarea",[["formControlName","confirm_seed"],["id","confirm_seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,3)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,3).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,3)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,3)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(3,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(5,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(7,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,5,0,"confirm_seed")},function(n,t){n(t,2,0,l._22(t,7).ngClassUntouched,l._22(t,7).ngClassTouched,l._22(t,7).ngClassPristine,l._22(t,7).ngClassDirty,l._22(t,7).ngClassValid,l._22(t,7).ngClassInvalid,l._22(t,7).ngClassPending)})}function Ub(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"label",[["for","confirm_seed"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Wb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,zb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,7,0,e.enterSeedWithAssistance),n(t,10,0,!e.enterSeedWithAssistance)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.confirm-seed-label")))})}function Gb(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,9)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,9).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,9)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,9)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,14).onFocus()&&r),r},null,null)),l._8(9,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(11,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(13,16384,null,0,Eo,[uo],null,null),l._8(14,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,"password")},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("password.label"))),n(t,8,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending)})}function qb(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,9)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,9).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,9)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,9)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,14).onFocus()&&r),"keydown.enter"===t&&(r=!1!==i.createWallet()&&r),r},null,null)),l._8(9,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(11,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(13,16384,null,0,Eo,[uo],null,null),l._8(14,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,"confirm_password")},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("password.confirm-label"))),n(t,8,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending)})}function Jb(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,9,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setEncrypt(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(6,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(8,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(n()(),l._31(9,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,14,"div",[["class","row -passwords"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,5,"div",[["class","col-md-12"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,2,"p",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Gb)),l._8(23,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qb)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,6,0,"encrypt",!0),n(t,23,0,e.encrypt),n(t,26,0,e.encrypt)},function(n,t){n(t,4,0,l._22(t,6).id,l._22(t,6).indeterminate,l._22(t,6).checked,l._22(t,6).disabled,"before"==l._22(t,6).labelPosition),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("wallet.new.encrypt"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("wallet.new.encrypt-warning")))})}function Qb(n){return l._33(0,[(n()(),l._9(0,0,null,null,22,"div",[["class","alert-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["error"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,15,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.onCustomSeedAcceptance(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(18,4374528,[["seedCheck",4]],0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(19,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0),n(t,18,0,e.customSeedAccepted)},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("wallet.new.unconventional-seed-title"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.new.unconventional-seed-text"))),n(t,16,0,l._22(t,18).id,l._22(t,18).indeterminate,l._22(t,18).checked,l._22(t,18).disabled,"before"==l._22(t,18).labelPosition),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("wallet.new.unconventional-seed-check")))})}function Kb(n){return l._33(0,[(n()(),l._9(0,0,null,null,49,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,12)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,12).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,12)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,12)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(12,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(14,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(16,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Eb)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,8,"label",[["for","seed"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(27,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Yb)),l._8(31,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Hb)),l._8(35,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Nb)),l._8(38,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Fb)),l._8(41,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ub)),l._8(45,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Jb)),l._8(48,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._4(16777216,null,null,1,null,Qb)),l._8(52,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,14,0,"label"),n(t,20,0,!e.create&&e.enterSeedWithAssistance),n(t,31,0,e.create),n(t,35,0,e.enterSeedWithAssistance),n(t,38,0,!e.enterSeedWithAssistance),n(t,41,0,e.create),n(t,45,0,e.create),n(t,48,0,!e.onboarding),n(t,52,0,e.form.valid&&!e.customSeedIsNormal)},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.new.name-label"))),n(t,11,0,l._22(t,16).ngClassUntouched,l._22(t,16).ngClassTouched,l._22(t,16).ngClassPristine,l._22(t,16).ngClassDirty,l._22(t,16).ngClassValid,l._22(t,16).ngClassInvalid,l._22(t,16).ngClassPending),n(t,27,0,l._32(t,27,0,l._22(t,28).transform("wallet.new.seed-label")))})}var Xb=function(){function n(n){this.dialogRef=n,this.acceptSafe=!1}return n.prototype.closePopup=function(){this.dialogRef.close(this.acceptSafe)},n.prototype.setAccept=function(n){this.acceptSafe=n.checked},n}(),Zb=function(){function n(n,t,e,r){var i=this;this.dialog=n,this.router=t,this.fill=null,this.onLabelAndSeedCreated=new l.o,this.showNewForm=!0,this.doubleButtonActive=Fp.LeftButton,this.hwCompatibilityActivated=!1,this.synchronized=!0,this.hwCompatibilityActivated=e.hwWalletCompatibilityActivated,this.synchronizedSubscription=r.synchronized.subscribe(function(n){return i.synchronized=n})}return n.prototype.ngOnInit=function(){var n=this;setTimeout(function(){n.formControl.initForm(null,n.fill)}),this.fill&&(this.doubleButtonActive=this.fill.creatingNewWallet?Fp.LeftButton:Fp.RightButton,this.showNewForm=this.fill.creatingNewWallet)},n.prototype.ngOnDestroy=function(){this.synchronizedSubscription.unsubscribe()},n.prototype.changeForm=function(n){this.showNewForm=n!==Fp.RightButton,this.doubleButtonActive=n,this.fill=null,this.formControl.initForm(this.showNewForm,this.fill)},n.prototype.createWallet=function(){var n=this;this.showSafe().afterClosed().subscribe(function(t){t&&n.emitCreatedData()})},n.prototype.loadWallet=function(){var n=this;this.synchronized?this.emitCreatedData():Wc(this.dialog,{headerText:"wallet.new.synchronizing-warning-title",text:"wallet.new.synchronizing-warning-text",confirmButtonText:"wallet.new.synchronizing-warning-continue",cancelButtonText:"wallet.new.synchronizing-warning-cancel"}).afterClosed().subscribe(function(t){t&&n.emitCreatedData()})},n.prototype.useHardwareWallet=function(){var n=this,t=new oa;t.width="566px",t.autoFocus=!1,t.data=!0,this.dialog.open(ud,t).afterClosed().subscribe(function(t){t&&n.router.navigate(["/wallets"])})},n.prototype.emitCreatedData=function(){this.onLabelAndSeedCreated.emit(this.formControl.getData())},n.prototype.showSafe=function(){var n=new oa;return n.width="450px",this.dialog.open(Xb,n)},n}(),$b=l._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.hw-link[_ngcontent-%COMP%]{cursor:pointer;color:#fff;font-size:13px;line-height:20px;margin-bottom:20px}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-toggle-container[_ngcontent-%COMP%]{margin:10px auto}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px}"]],data:{}});function nv(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[["class","hw-link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.useHardwareWallet()&&l),l},null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wizard.hardware-wallet-link")))})}function tv(n){return l._33(0,[l._29(402653184,1,{formControl:0}),(n()(),l._9(1,0,null,null,52,"div",[["class","onboarding-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,15,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,9,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,6,"div",[["class","row-container -toggle-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,3,"app-double-button",[],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeForm(e)&&l),l},M_,x_)),l._8(28,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(34,0,null,null,7,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,4,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,0,null,null,1,"app-create-wallet-form",[],null,null,null,Kb,Ab)),l._8(39,245760,[[1,4],["formControl",4]],0,Gc,[Ye,fa,jc],{create:[0,"create"],onboarding:[1,"onboarding"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,nv)),l._8(44,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,6,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0,r=n.component;return"action"===t&&(l=!1!==(r.showNewForm?r.createWallet():r.loadWallet())&&l),l},w_,g_)),l._8(49,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(50,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,28,0,l._32(t,28,0,l._22(t,29).transform("common.load")),l._32(t,28,1,l._22(t,30).transform("common.new")),e.doubleButtonActive),n(t,39,0,e.showNewForm,!0),n(t,44,0,e.hwCompatibilityActivated),n(t,49,0,!l._22(t,39).isValid)},function(n,t){n(t,10,0,l._32(t,10,0,l._22(t,11).transform("wallet.new.create-title"))),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("wizard.wallet-desc"))),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("wallet.new.create-button")))})}var ev=l._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-check-container[_ngcontent-%COMP%]{margin:10px auto;text-align:center}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#fafafa!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#fbfbfb}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}.-input.disable[_ngcontent-%COMP%]{background:rgba(255,255,255,.1)}.-hidden[_ngcontent-%COMP%]{display:none}"]],data:{}});function lv(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,95,"div",[["class","onboarding-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,15,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,12,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,9,"div",[["class","row-container -check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setEncrypt(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(29,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(31,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(n()(),l._31(32,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,43,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,40,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(41,0,null,null,37,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,43).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,43).onReset()&&r),r},null,null)),l._8(42,16384,null,0,ts,[],null,null),l._8(43,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(45,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(47,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(50,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(53,0,null,null,7,"input",[["class","-input"],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,56)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,56).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,56)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,56)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(54,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(55,{disable:0}),l._8(56,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(58,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(60,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(65,0,null,null,2,"label",[["for","confirm"]],null,null,null,null,null)),(n()(),l._31(66,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(69,0,null,null,7,"input",[["class","-input"],["formControlName","confirm"],["id","confirm"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,72)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,72).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,72)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,72)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.emitCreatedPassword()&&r),r},null,null)),l._8(70,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(71,{disable:0}),l._8(72,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(74,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(76,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(82,0,null,null,13,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(84,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.emitCreatedPassword()&&l),l},w_,g_)),l._8(85,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(86,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(89,0,null,null,5,"app-button",[["class","ghost -button-min-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.emitBack()&&l),l},w_,g_)),l._8(90,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(91,{"-hidden":0}),l._8(92,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(93,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,29,0,"encrypt",!0),n(t,43,0,e.form),n(t,54,0,"-input",n(t,55,0,e.form.disabled)),n(t,58,0,"password"),n(t,70,0,"-input",n(t,71,0,e.form.disabled)),n(t,74,0,"confirm"),n(t,85,0,e.form.enabled&&!e.form.valid),n(t,90,0,"ghost -button-min-margin",n(t,91,0,e.isWorking))},function(n,t){n(t,10,0,l._32(t,10,0,l._22(t,11).transform("wallet.new.encrypt-title"))),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("wizard.encrypt-desc"))),n(t,27,0,l._22(t,29).id,l._22(t,29).indeterminate,l._22(t,29).checked,l._22(t,29).disabled,"before"==l._22(t,29).labelPosition),n(t,32,0,l._32(t,32,0,l._22(t,33).transform("wallet.new.encrypt"))),n(t,41,0,l._22(t,45).ngClassUntouched,l._22(t,45).ngClassTouched,l._22(t,45).ngClassPristine,l._22(t,45).ngClassDirty,l._22(t,45).ngClassValid,l._22(t,45).ngClassInvalid,l._22(t,45).ngClassPending),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("password.label"))),n(t,53,0,l._22(t,60).ngClassUntouched,l._22(t,60).ngClassTouched,l._22(t,60).ngClassPristine,l._22(t,60).ngClassDirty,l._22(t,60).ngClassValid,l._22(t,60).ngClassInvalid,l._22(t,60).ngClassPending),n(t,66,0,l._32(t,66,0,l._22(t,67).transform("password.confirm-label"))),n(t,69,0,l._22(t,76).ngClassUntouched,l._22(t,76).ngClassTouched,l._22(t,76).ngClassPristine,l._22(t,76).ngClassDirty,l._22(t,76).ngClassValid,l._22(t,76).ngClassInvalid,l._22(t,76).ngClassPending),n(t,86,0,l._32(t,86,0,l._22(t,87).transform("wizard.finish-button"))),n(t,93,0,l._32(t,93,0,l._22(t,94).transform("wizard.back-button")))})}var rv=l._7({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{position:fixed;right:30px;top:10px}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:-3px}"]],data:{}});function iv(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"button",[["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changelanguage()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(2,16384,null,0,Fs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,0,"img",[["class","flag"]],[[8,"src",4]],null,null,null,null)),(n()(),l._31(-1,0,["\n"]))],null,function(n,t){var e=t.component;n(t,0,0,l._22(t,1).disabled||null),n(t,4,0,"assets/img/lang/"+e.language.iconName)})}function ov(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding-create-wallet",[],null,[[null,"onLabelAndSeedCreated"]],function(n,t,e){var l=!0;return"onLabelAndSeedCreated"===t&&(l=!1!==n.component.onLabelAndSeedCreated(e)&&l),l},tv,$b)),l._8(1,245760,null,0,Zb,[fa,cp,oc,qc],{fill:[0,"fill"]},{onLabelAndSeedCreated:"onLabelAndSeedCreated"})],function(n,t){n(t,1,0,t.component.fill)},null)}function sv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding-encrypt-wallet",[],null,[[null,"onPasswordCreated"],[null,"onBack"]],function(n,t,e){var l=!0,r=n.component;return"onPasswordCreated"===t&&(l=!1!==r.onPasswordCreated(e)&&l),"onBack"===t&&(l=!1!==r.onBack()&&l),l},lv,ev)),l._8(1,114688,[[1,4],["encryptForm",4]],0,uf,[ns],null,{onPasswordCreated:"onPasswordCreated",onBack:"onBack"})],function(n,t){n(t,1,0)},null)}function av(n){return l._33(0,[l._29(671088640,1,{encryptForm:0}),(n()(),l._4(16777216,null,null,1,null,iv)),l._8(2,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,ov)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,sv)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.language),n(t,5,0,1===e.step),n(t,8,0,2===e.step)},null)}var uv=l._5("app-onboarding",cf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding",[],null,null,null,av,rv)),l._8(1,245760,null,0,cf,[cp,Sc,Bc,fa,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),cv=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px}.-disabled[_ngcontent-%COMP%]{opacity:.5}"]],data:{}});function dv(n){return l._33(0,[l._29(402653184,1,{resetButton:0}),(n()(),l._9(1,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(2,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(5,0,null,null,74,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,71,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,68,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,10).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,10).onReset()&&r),r},null,null)),l._8(10,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(12,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"label",[["for","wallet"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,5,"input",[["class","-disabled"],["formControlName","wallet"],["id","wallet"],["readonly",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,21)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,21).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,21)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,21)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(21,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(23,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(25,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,2,"label",[["for","seed"]],null,null,null,null,null)),(n()(),l._31(31,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(34,0,null,null,5,"textarea",[["formControlName","seed"],["id","seed"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,35)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,35).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,35)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,35)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(35,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(37,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(39,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(45,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,5,"input",[["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,49)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,49).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,49)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,49)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(49,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(51,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(53,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,2,"label",[["for","confirm"]],null,null,null,null,null)),(n()(),l._31(59,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(62,0,null,null,5,"input",[["formControlName","confirm"],["id","confirm"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,63)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,63).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,63)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,63)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.reset()&&r),r},null,null)),l._8(63,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(70,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(72,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.reset()&&l),l},w_,g_)),l._8(73,49152,[[1,4],["resetButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(74,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,l._22(t,3).transform("title.reset"))),n(t,10,0,e.form),n(t,23,0,"wallet"),n(t,37,0,"seed"),n(t,51,0,"password"),n(t,65,0,"confirm"),n(t,73,0,!e.form.valid)},function(n,t){n(t,9,0,l._22(t,12).ngClassUntouched,l._22(t,12).ngClassTouched,l._22(t,12).ngClassPristine,l._22(t,12).ngClassDirty,l._22(t,12).ngClassValid,l._22(t,12).ngClassInvalid,l._22(t,12).ngClassPending),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("reset.wallet-label"))),n(t,20,0,l._22(t,25).ngClassUntouched,l._22(t,25).ngClassTouched,l._22(t,25).ngClassPristine,l._22(t,25).ngClassDirty,l._22(t,25).ngClassValid,l._22(t,25).ngClassInvalid,l._22(t,25).ngClassPending),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("reset.seed-label"))),n(t,34,0,l._22(t,39).ngClassUntouched,l._22(t,39).ngClassTouched,l._22(t,39).ngClassPristine,l._22(t,39).ngClassDirty,l._22(t,39).ngClassValid,l._22(t,39).ngClassInvalid,l._22(t,39).ngClassPending),n(t,45,0,l._32(t,45,0,l._22(t,46).transform("reset.password-label"))),n(t,48,0,l._22(t,53).ngClassUntouched,l._22(t,53).ngClassTouched,l._22(t,53).ngClassPristine,l._22(t,53).ngClassDirty,l._22(t,53).ngClassValid,l._22(t,53).ngClassInvalid,l._22(t,53).ngClassPending),n(t,59,0,l._32(t,59,0,l._22(t,60).transform("reset.confirm-label"))),n(t,62,0,l._22(t,67).ngClassUntouched,l._22(t,67).ngClassTouched,l._22(t,67).ngClassPristine,l._22(t,67).ngClassDirty,l._22(t,67).ngClassValid,l._22(t,67).ngClassInvalid,l._22(t,67).ngClassPending),n(t,74,0,l._32(t,74,0,l._22(t,75).transform("reset.reset-button")))})}var hv=l._5("app-reset-password",df,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-reset-password",[],null,null,null,dv,cv)),l._8(1,180224,null,0,df,[ns,Ch,cp,Sc,jc],null,null)],null,null)},{},{},[]),pv=function(){function n(n,t,e,l){this.walletService=n,this.dialogRef=t,this.formBuilder=e,this.purchaseService=l}return n.prototype.ngOnInit=function(){this.initForm()},n.prototype.generate=function(){var n=this;this.purchaseService.generate(this.form.value.address).subscribe(function(){return n.dialogRef.close()})},n.prototype.initForm=function(){this.form=this.formBuilder.group({address:["",Xi.required]})},n}(),fv=l._7({encapsulation:0,styles:[["mat-select[_ngcontent-%COMP%]{width:100%;padding:40px 0 20px}"]],data:{}});function _v(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n ","\n "]))],function(n,t){n(t,1,0,t.context.$implicit.address)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.address)})}function mv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(4,0,null,null,21,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,5).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,5).onReset()&&r),r},null,null)),l._8(5,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(7,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,15,"mat-select",[["class","input-field mat-select"],["formControlName","address"],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,14)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,14)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,14)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(12,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(14,2080768,null,3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"]},null),l._29(603979776,1,{options:1}),l._29(603979776,2,{optionGroups:1}),l._29(335544320,3,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(19,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,2,null,_v)),l._8(22,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),l._25(131072,nn,[l.h]),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(27,0,null,null,7,"div",[["class","button-line"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,4,"a",[["class","mat-raised-button"],["mat-raised-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,30)._haltDisabledEvents(e)&&r),"click"===t&&(r=!1!==i.generate()&&r),r},s_,o_)),l._8(30,180224,null,0,Vs,[Hl,Rr,l.l],null,null),l._8(31,16384,null,0,Ns,[],null,null),(n()(),l._31(32,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,e.form),n(t,12,0,"address"),n(t,14,0,l._32(t,14,0,l._22(t,18).transform("buy.select-address"))),n(t,22,0,l._32(t,22,0,l._22(t,23).transform(e.walletService.allAddresses())))},function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("buy.deposit-address"))),n(t,4,0,l._22(t,7).ngClassUntouched,l._22(t,7).ngClassTouched,l._22(t,7).ngClassPristine,l._22(t,7).ngClassDirty,l._22(t,7).ngClassValid,l._22(t,7).ngClassInvalid,l._22(t,7).ngClassPending),n(t,9,1,[l._22(t,14).id,l._22(t,14).tabIndex,l._22(t,14)._ariaLabel,l._22(t,14).ariaLabelledby,l._22(t,14).required.toString(),l._22(t,14).disabled.toString(),l._22(t,14).errorState,l._22(t,14).panelOpen?l._22(t,14)._optionIds:null,l._22(t,14).multiple,l._22(t,14)._ariaDescribedby||null,l._22(t,14)._getAriaActiveDescendant(),l._22(t,14).disabled,l._22(t,14).errorState,l._22(t,14).required,l._22(t,19).ngClassUntouched,l._22(t,19).ngClassTouched,l._22(t,19).ngClassPristine,l._22(t,19).ngClassDirty,l._22(t,19).ngClassValid,l._22(t,19).ngClassInvalid,l._22(t,19).ngClassPending]),n(t,29,0,l._22(t,30).disabled?-1:0,l._22(t,30).disabled||null,l._22(t,30).disabled.toString()),n(t,32,0,l._32(t,32,0,l._22(t,33).transform("buy.generate")))})}var gv=l._5("app-add-deposit-address",pv,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-add-deposit-address",[],null,null,null,mv,fv)),l._8(1,114688,null,0,pv,[Sc,ca,ns,ef],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),yv=function(){function n(){}return n.prototype.closePopup=function(){this.disableDismiss||this.dialog.close()},n.prototype.ngOnChanges=function(n){n.disableDismiss&&(this.dialog.disableClose=n.disableDismiss.currentValue)},n}(),bv=l._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{background-color:#f7f7f7;border-top-left-radius:5px;border-top-right-radius:5px;line-height:50px;position:relative;text-align:center}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{cursor:pointer;height:32px;position:absolute;right:9px;top:9px}.-body[_ngcontent-%COMP%]{background-color:#fbfbfb;padding:0 24px}mat-dialog-content[_ngcontent-%COMP%]::after, mat-dialog-content[_ngcontent-%COMP%]::before{content:'';padding-top:24px;height:0;display:block}"]],data:{}});function vv(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["src","../../../../../assets/img/close-grey.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.closePopup()&&l),l},null,null))],null,null)}function wv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),(n()(),l._4(16777216,null,null,1,null,vv)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(6,0,null,null,7,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,4,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),l._8(9,16384,null,0,_a,[],null,null),(n()(),l._31(-1,null,["\n "])),l._21(null,0),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,3,0,!t.component.disableDismiss)},function(n,t){n(t,1,0,t.component.headline)})}var xv=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function Mv(n){return l._33(0,[l._29(402653184,1,{formControl:0}),l._29(402653184,2,{createButton:0}),l._29(402653184,3,{cancelButton:0}),(n()(),l._9(3,0,null,null,19,"app-modal",[],null,null,null,wv,bv)),l._8(4,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(7,0,null,0,1,"app-create-wallet-form",[],null,null,null,Kb,Ab)),l._8(8,245760,[[1,4],["formControl",4]],0,Gc,[Ye,fa,jc],{create:[0,"create"],onboarding:[1,"onboarding"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(10,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(13,49152,[[3,4],["cancelButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(14,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.createWallet()&&l),l},w_,g_)),l._8(18,49152,[[2,4],["createButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(19,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,e.dialogRef,l._32(t,4,1,l._22(t,5).transform("wallet.new."+(e.data.create?"create":"load")+"-title")),e.disableDismiss),n(t,8,0,e.data.create,!1),n(t,18,0,!l._22(t,8).isValid)},function(n,t){var e=t.component;n(t,14,0,l._32(t,14,0,l._22(t,15).transform("wallet.new.cancel-button"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("wallet.new."+(e.data.create?"create":"load")+"-button")))})}var kv=l._5("app-create-wallet",Jc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-create-wallet",[],null,null,null,Mv,xv)),l._8(1,180224,null,0,Jc,[da,ca,Sc,fa,jc,qc],null,null)],null,null)},{},{},[]),Cv=l._7({encapsulation:0,styles:[[".content[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%]{margin-right:20px}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block;height:36px!important;width:36px!important}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:36px!important;width:36px!important}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{font-size:40px}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%]{padding:10px 0}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%] .list-element[_ngcontent-%COMP%]{margin:10px 0;font-size:12px;color:#000;font-weight:700}.content[_ngcontent-%COMP%] .-red[_ngcontent-%COMP%]{color:#ff004e}.content[_ngcontent-%COMP%] .-yellow[_ngcontent-%COMP%]{color:#ffc125}.content[_ngcontent-%COMP%] .-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.2)}.content[_ngcontent-%COMP%] .-green[_ngcontent-%COMP%]{color:#00df80}.content[_ngcontent-%COMP%] .-blinking[_ngcontent-%COMP%]{-webkit-animation:1s linear infinite alert-blinking;animation:1s linear infinite alert-blinking}"]],data:{}});function Sv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Ov(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -green"]],null,null,null,null,null)),(n()(),l._31(-1,null,["done"]))],null,null)}function Tv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -red"]],null,null,null,null,null)),(n()(),l._31(-1,null,["error_outline"]))],null,null)}function Lv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["usb"]))],null,null)}function Pv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -yellow"]],null,null,null,null,null)),(n()(),l._31(-1,null,["memory"]))],null,null)}function Dv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -red -blinking"]],null,null,null,null,null)),(n()(),l._31(-1,null,["error"]))],null,null)}function Av(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -yellow"]],null,null,null,null,null)),(n()(),l._31(-1,null,["touch_app"]))],null,null)}function Ev(n){return l._33(0,[(n()(),l._9(0,0,null,null,22,"div",[["class","icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Sv)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ov)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Tv)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Lv)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Pv)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Dv)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Av)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.icon==e.icons.Spinner),n(t,6,0,e.icon==e.icons.Success),n(t,9,0,e.icon==e.icons.Error),n(t,12,0,e.icon==e.icons.Usb),n(t,15,0,e.icon==e.icons.HardwareWallet),n(t,18,0,e.icon==e.icons.Warning),n(t,21,0,e.icon==e.icons.Confirm)},null)}function Yv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"span",[["class","big-text"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.component.upperBigText)})}function jv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.text)})}function Iv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.activateLink()&&l),l},null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.linkText)})}function Rv(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,"div",[["class","list-element"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["\u2022 ",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(7,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(12,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform(t.context.$implicit.coins.toString()))),n(t,7,0,l._32(t,7,0,l._22(t,8).transform("hardware-wallet.create-tx.send-p1")),l._32(t,7,1,l._22(t,9).transform(t.context.$implicit.hours.toString(),!1))),n(t,12,0,l._32(t,12,0,l._22(t,13).transform("hardware-wallet.create-tx.send-p2")),t.context.$implicit.address)})}function Hv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","list"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Rv)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.outputsList)},null)}function Nv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.lowerText)})}function Fv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"span",[["class","big-text"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.component.lowerBigText)})}function Bv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"span",[["class","-grey"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.component.lowerLightText)})}function Vv(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[["class","content"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ev)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,22,"div",[["class","text-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Yv)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,jv)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Iv)),l._8(14,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hv)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Nv)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Fv)),l._8(23,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Bv)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.icon!==e.icons.None),n(t,8,0,e.upperBigText),n(t,11,0,e.text),n(t,14,0,e.linkText),n(t,17,0,e.outputsList),n(t,20,0,e.lowerText),n(t,23,0,e.lowerBigText),n(t,26,0,e.lowerLightText)},null)}var Wv=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}.info[_ngcontent-%COMP%]{margin:5px 0 25px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}"]],data:{}});function zv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[["class","info"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.added.characters-warning")))})}function Uv(n){return l._33(0,[(n()(),l._9(0,0,null,null,39,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zv)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,20,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,7,"input",[["formControlName","label"],["id","label"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,17)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,17).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,17)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,17)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.rename()&&r),r},null,null)),l._8(17,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(18,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(21,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(30,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(31,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(34,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.rename()&&l),l},w_,g_)),l._8(35,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(36,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.showCharactersWarning),n(t,6,0,e.form),n(t,18,0,e.data.wallet.isHardware?e.maxHwWalletLabelLength:null),n(t,21,0,"label"),n(t,30,0,l._22(t,35)&&l._22(t,35).isLoading()),n(t,35,0,!e.form.valid)},function(n,t){n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.rename.name-label"))),n(t,16,0,l._22(t,18).maxlength?l._22(t,18).maxlength:null,l._22(t,23).ngClassUntouched,l._22(t,23).ngClassTouched,l._22(t,23).ngClassPristine,l._22(t,23).ngClassDirty,l._22(t,23).ngClassValid,l._22(t,23).ngClassInvalid,l._22(t,23).ngClassPending),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("wallet.rename.cancel-button"))),n(t,36,0,l._32(t,36,0,l._22(t,37).transform("wallet.rename.rename-button")))})}function Gv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function qv(n){return l._33(0,[l._29(671088640,1,{button:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Uv)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Gv)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("wallet.rename.title")),e.button&&e.button.isLoading()||e.currentState===e.states.WaitingForConfirmation),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.WaitingForConfirmation)},null)}var Jv=l._5("app-change-name",nd,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-change-name",[],null,null,null,qv,Wv)),l._8(1,245760,null,0,nd,[ca,da,ns,Sc,oc,De.j,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),Qv=l._7({encapsulation:0,styles:[[".qr-container[_ngcontent-%COMP%]{text-align:center;margin-bottom:24px}.qr-container[_ngcontent-%COMP%] .qr[_ngcontent-%COMP%]{height:180px;width:180px;display:inline-block}.separator[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.2);height:1px;width:100%}.data-container[_ngcontent-%COMP%]{margin:14px 0}.data-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:#171a1d}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]{color:rgba(30,34,39,.75);cursor:pointer}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{margin-right:5px}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%] .copy[_ngcontent-%COMP%]{color:rgba(30,34,39,.75);opacity:.25}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]:hover .copy[_ngcontent-%COMP%]{opacity:.75}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]:active .copy[_ngcontent-%COMP%]{opacity:1}.link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{padding:0;display:inline;vertical-align:middle;font-size:13px}.invalid[_ngcontent-%COMP%]{color:#ff004e}"]],data:{}});function Kv(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","data-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,4,"div",[["class","data"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.copyText(r.currentQrContent)&&l),l},null,null)),(n()(),l._9(7,0,null,null,1,"span",[["class","text"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),(n()(),l._9(9,0,null,null,1,"span",[["class","fa copy"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\uf0c5"])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("qr.data"))),n(t,8,0,e.currentQrContent)})}function Xv(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"div",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.startShowingForm()&&l),l},null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(4,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"]))],function(n,t){n(t,4,0)},function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("qr.request-link")))})}function Zv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","invalid"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("qr.invalid")))})}function $v(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","invalid"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("qr.invalid")))})}function nw(n){return l._33(0,[(n()(),l._9(0,0,null,null,58,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,17,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"label",[["for","coins"]],null,null,null,null,null)),(n()(),l._31(8,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,Zv)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,7,"input",[["formControlName","coins"],["id","coins"],["maxlength","20"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,15)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,15).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,15)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,15)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(15,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(16,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(19,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(21,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,17,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,5,"label",[["for","hours"]],null,null,null,null,null)),(n()(),l._31(27,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,$v)),l._8(30,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,7,"input",[["formControlName","hours"],["id","hours"],["maxlength","20"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,34)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,34).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,34)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,34)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(34,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(35,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(38,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(40,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,2,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(46,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,7,"input",[["formControlName","note"],["id","note"],["maxlength","100"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,50)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,50).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,50)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,50)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(50,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(51,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(54,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(56,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,11,0,e.invalidCoins),n(t,16,0,"20"),n(t,19,0,"coins"),n(t,30,0,e.invalidHours),n(t,35,0,"20"),n(t,38,0,"hours"),n(t,51,0,"100"),n(t,54,0,"note")},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("qr.amount"))),n(t,14,0,l._22(t,16).maxlength?l._22(t,16).maxlength:null,l._22(t,21).ngClassUntouched,l._22(t,21).ngClassTouched,l._22(t,21).ngClassPristine,l._22(t,21).ngClassDirty,l._22(t,21).ngClassValid,l._22(t,21).ngClassInvalid,l._22(t,21).ngClassPending),n(t,27,0,l._32(t,27,0,l._22(t,28).transform("qr.hours"))),n(t,33,0,l._22(t,35).maxlength?l._22(t,35).maxlength:null,l._22(t,40).ngClassUntouched,l._22(t,40).ngClassTouched,l._22(t,40).ngClassPristine,l._22(t,40).ngClassDirty,l._22(t,40).ngClassValid,l._22(t,40).ngClassInvalid,l._22(t,40).ngClassPending),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("qr.message"))),n(t,49,0,l._22(t,51).maxlength?l._22(t,51).maxlength:null,l._22(t,56).ngClassUntouched,l._22(t,56).ngClassTouched,l._22(t,56).ngClassPristine,l._22(t,56).ngClassDirty,l._22(t,56).ngClassValid,l._22(t,56).ngClassInvalid,l._22(t,56).ngClassPending)})}function tw(n){return l._33(0,[l._29(402653184,1,{qr:0}),(n()(),l._9(1,0,null,null,32,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,3,"div",[["class","qr-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,[[1,0],["qr",1]],null,0,"div",[["class","qr"],["id","qr"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(10,0,null,0,0,"div",[["class","separator"]],null,null,null,null,null)),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Kv)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(15,0,null,0,11,"div",[["class","data-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,4,"div",[["class","data"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.copyText(r.data.address)&&l),l},null,null)),(n()(),l._9(22,0,null,null,1,"span",[["class","text"]],null,null,null,null,null)),(n()(),l._31(23,null,["",""])),(n()(),l._9(24,0,null,null,1,"span",[["class","fa copy"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\uf0c5"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Xv)),l._8(29,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,nw)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.data.hideCoinRequestForm?"qr.title-read-only":"qr.title"))),n(t,13,0,!e.data.ignoreCoinPrefix||!e.data.hideCoinRequestForm),n(t,29,0,!e.showForm&&!e.data.hideCoinRequestForm),n(t,32,0,e.showForm)},function(n,t){var e=t.component;n(t,18,0,l._32(t,18,0,l._22(t,19).transform("qr.address"))),n(t,23,0,e.data.address)})}var ew=l._5("app-qr-code",qp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-qr-code",[],null,null,null,tw,Qv)),l._8(1,245760,null,0,qp,[da,ca,ns,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),lw=l._7({encapsulation:0,styles:[[""]],data:{}});function rw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"app-modal",[],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"app-transaction-info",[],null,null,null,Sg,cg)),l._8(5,245760,null,0,ug,[rf,fa],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("history.tx-detail"))),n(t,5,0,e.transaction,!1)},null)}var iw=l._5("app-transaction-detail",of,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-transaction-detail",[],null,null,null,rw,lw)),l._8(1,49152,null,0,of,[da,ca],null,null)],null,null)},{},{},[]),ow=l._7({encapsulation:0,styles:[[".-safe-description[_ngcontent-%COMP%]{font-family:Skycoin;line-height:20px;font-size:12px;color:#1e2227;mix-blend-mode:normal;opacity:.8}.-check-container[_ngcontent-%COMP%]{text-align:center;margin-top:50px}.-safe-check-text[_ngcontent-%COMP%]{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-text-center[_ngcontent-%COMP%]{text-align:center}.-no-bottom-margin[_ngcontent-%COMP%] button{margin:28px 10px 0!important}.-title[_ngcontent-%COMP%]{font-family:Skycoin;line-height:30px;font-size:14px;text-align:center;letter-spacing:.0769231em;color:#ff004e}"]],data:{}});function sw(n){return l._33(0,[(n()(),l._9(0,0,null,null,27,"app-modal",[["class","-title"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,14,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"span",[["class","-safe-description"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,4,"mat-checkbox",[["class","-safe-check-text -check mat-checkbox"],["id","terms"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAccept(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(14,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(15,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(20,0,null,0,6,"div",[["class","-text-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,3,"app-button",[["class","primary -no-bottom-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(23,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(24,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("wizard.confirm.title"))),n(t,14,0,"terms",e.acceptSafe),n(t,23,0,!e.acceptSafe)},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("wizard.confirm.desc"))),n(t,12,0,l._22(t,14).id,l._22(t,14).indeterminate,l._22(t,14).checked,l._22(t,14).disabled,"before"==l._22(t,14).labelPosition),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("wizard.confirm.checkbox"))),n(t,24,0,l._32(t,24,0,l._22(t,25).transform("wizard.confirm.button")))})}var aw=l._5("app-onboarding-safeguard",Xb,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding-safeguard",[],null,null,null,sw,ow)),l._8(1,49152,null,0,Xb,[ca],null,null)],null,null)},{},{},[]),uw=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-info[_ngcontent-%COMP%]{margin:5px 0 25px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}.-warning[_ngcontent-%COMP%]{color:#ff004e}.link[_ngcontent-%COMP%]{font-size:13px;width:100%;display:inline-block;text-align:center;text-decoration:none;color:#0072ff}"]],data:{}});function cw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"p",[["class","-info"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"-warning":0}),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,"-info",n(t,2,0,t.component.data.warning))},function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform(e.data.description)))})}function dw(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,7)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,7).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,7)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,7)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,12).onFocus()&&r),"keydown.enter"===t&&(r=!1!==i.proceed()&&r),r},null,null)),l._8(7,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(9,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(11,16384,null,0,Eo,[uo],null,null),l._8(12,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,9,0,"confirm_password")},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("password.confirm-label"))),n(t,6,0,l._22(t,11).ngClassUntouched,l._22(t,11).ngClassTouched,l._22(t,11).ngClassPristine,l._22(t,11).ngClassDirty,l._22(t,11).ngClassValid,l._22(t,11).ngClassInvalid,l._22(t,11).ngClassPending)})}function hw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"a",[["class","link"]],[[8,"href",4]],null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"element-disabled":0}),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,"link",n(t,2,0,t.component.working))},function(n,t){n(t,0,0,"#/reset/"+t.component.data.wallet.filename),n(t,3,0,l._32(t,3,0,l._22(t,4).transform("password.reset-link")))})}function pw(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,42,"app-modal",[],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,cw)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(9,0,null,0,22,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,10).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,10).onReset()&&r),r},null,null)),l._8(10,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(12,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,21)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,21).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,21)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,21)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,26).onFocus()&&r),"keydown.enter"===t&&(r=!1!==i.proceed()&&r),r},null,null)),l._8(21,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(23,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(25,16384,null,0,Eo,[uo],null,null),l._8(26,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,dw)),l._8(30,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,hw)),l._8(34,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(36,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.proceed()&&l),l},w_,g_)),l._8(39,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(40,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,e.data.title?l._22(t,3).transform(e.data.title):l._22(t,4).transform("password.title")),e.working),n(t,7,0,e.data.description),n(t,10,0,e.form),n(t,23,0,"password"),n(t,30,0,e.data.confirm),n(t,34,0,e.data.wallet),n(t,39,0,!e.form.valid)},function(n,t){n(t,9,0,l._22(t,12).ngClassUntouched,l._22(t,12).ngClassTouched,l._22(t,12).ngClassPristine,l._22(t,12).ngClassDirty,l._22(t,12).ngClassValid,l._22(t,12).ngClassInvalid,l._22(t,12).ngClassPending),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("password.label"))),n(t,20,0,l._22(t,25).ngClassUntouched,l._22(t,25).ngClassTouched,l._22(t,25).ngClassPristine,l._22(t,25).ngClassDirty,l._22(t,25).ngClassValid,l._22(t,25).ngClassInvalid,l._22(t,25).ngClassPending),n(t,40,0,l._32(t,40,0,l._22(t,41).transform("password.button")))})}var fw=l._5("app-password-dialog",Zp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-password-dialog",[],null,null,null,pw,uw)),l._8(1,245760,null,0,Zp,[da,ca,jc,De.j],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),_w=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function mw(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"app-modal",[],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,8,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"label",[["for","seed"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"textarea",[["id","seed"],["readonly",""]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(14,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.dialogRef.close()&&l),l},w_,g_)),l._8(17,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,1,0,t.component.dialogRef,l._32(t,1,1,l._22(t,2).transform("title.seed")))},function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("backup.seed"))),n(t,11,0,e.data.seed),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("backup.close-button")))})}var gw=l._5("app-seed-modal",Xp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-seed-modal",[],null,null,null,mw,_w)),l._8(1,180224,null,0,Xp,[da,ca],null,null)],null,null)},{},{},[]),yw=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function bw(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,37,"app-modal",[],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,19,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"label",[["for","quantity"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,6,"input",[["formControlName","quantity"],["id","quantity"],["max","100"],["min","1"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,17)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,17).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,17)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,17)._compositionEnd(e.target.value)&&r),"change"===t&&(r=!1!==l._22(n,18).onChange(e.target.value)&&r),"input"===t&&(r=!1!==l._22(n,18).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,18).onTouched()&&r),"keydown.enter"===t&&(r=!1!==i.continue()&&r),r},null,null)),l._8(17,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(18,16384,null,0,so,[l.G,l.l],null,null),l._28(1024,null,to,function(n,t){return[n,t]},[ro,so]),l._8(20,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(22,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(26,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(29,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(30,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.continue()&&l),l},w_,g_)),l._8(34,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(35,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("wallet.add-addresses.title")),l._22(t,34).isLoading()),n(t,6,0,e.form),n(t,20,0,"quantity"),n(t,29,0,l._22(t,34)&&l._22(t,34).isLoading()),n(t,34,0,!e.form.valid)},function(n,t){n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.add-addresses.name-quantity"))),n(t,16,0,l._22(t,22).ngClassUntouched,l._22(t,22).ngClassTouched,l._22(t,22).ngClassPristine,l._22(t,22).ngClassDirty,l._22(t,22).ngClassValid,l._22(t,22).ngClassInvalid,l._22(t,22).ngClassPending),n(t,30,0,l._32(t,30,0,l._22(t,31).transform("wallet.add-addresses.cancel-button"))),n(t,35,0,l._32(t,35,0,l._22(t,36).transform("wallet.add-addresses.create-button")))})}var vw=l._5("app-number-of-addresses",Nf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-number-of-addresses",[],null,null,null,bw,yw)),l._8(1,245760,null,0,Nf,[da,ca,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),ww=l._7({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid #eff0f0}.wallet-container[_ngcontent-%COMP%]{padding-top:30px;margin:0 -10px}.wallet-container[_ngcontent-%COMP%]:first-child{padding-top:0}.wallet-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:#171a1d;border-bottom:1px solid #eff0f0;padding:0 10px;font-size:18px;line-height:32px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.wallet-container[_ngcontent-%COMP%] .address[_ngcontent-%COMP%]{font-size:13px;line-height:22px;color:#171a1d}.wallet-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%]{font-size:12px;line-height:18px;color:#171a1d}.wallet-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}"]],data:{}});function xw(n){return l._33(0,[(n()(),l._9(0,0,null,null,19,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.select(n.context.$implicit.address)&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,1,"div",[["class","address"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(7,0,null,0,11,"div",[["class","balance"]],null,null,null,null,null)),(n()(),l._31(8,null,["","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._9(10,0,null,null,2,"span",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(11,null,[""," | "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(13,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._9(15,0,null,null,2,"span",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(16,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,t.context.$implicit.address),n(t,8,0,l._32(t,8,0,l._22(t,9).transform(t.context.$implicit.coins.toString(),!0,"first"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform(t.context.$implicit.coins.toString(),!0,"last"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(t.context.$implicit.hours.toString(),!1,"first"))),n(t,16,0,l._32(t,16,0,l._22(t,17).transform(t.context.$implicit.hours.toString(),!1,"last")))})}function Mw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","wallet-container select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","title"]],[[8,"title",0]],null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,xw)),l._8(6,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,6,0,t.context.$implicit.addresses)},function(n,t){n(t,2,0,l._12(1,"",t.context.$implicit.label,"")),n(t,3,0,t.context.$implicit.label)})}function kw(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"app-modal",[],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Mw)),l._8(5,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("title.select-address"))),n(t,5,0,e.wallets)},null)}var Cw=l._5("app-select-address",Rm,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-select-address",[],null,null,null,kw,ww)),l._8(1,49152,null,0,Rm,[ca,Sc],null,null)],null,null)},{},{},[]),Sw=l._7({encapsulation:0,styles:[[".alert-box[_ngcontent-%COMP%]{margin-top:25px}.options-label[_ngcontent-%COMP%]{color:#171a1d;margin-top:25px;margin-bottom:10px;font-weight:700}.option-buttons-container[_ngcontent-%COMP%]{margin:0 -10px}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid #eff0f0}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:first-child{border-top:1px solid #eff0f0}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{font-size:13px;line-height:22px;color:#171a1d}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .-red[_ngcontent-%COMP%]{color:#ff004e}.-blinking[_ngcontent-%COMP%]{-webkit-animation:1s linear infinite alert-blinking;animation:1s linear infinite alert-blinking}"]],data:{}});function Ow(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Tw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,[[null,"linkClicked"]],function(n,t,e){var l=!0;return"linkClicked"===t&&(l=!1!==n.component.wipe()&&l),l},Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],linkText:[2,"linkText"]},{linkClicked:"linkClicked"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Error,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.refused"))+" "+l._32(t,1,1,l._22(t,3).transform("hardware-wallet.options.forgotten-pin1")),l._32(t,1,2,l._22(t,4).transform("hardware-wallet.options.forgotten-pin2")))},null)}function Lw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,[[null,"linkClicked"]],function(n,t,e){var l=!0;return"linkClicked"===t&&(l=!1!==n.component.wipe()&&l),l},Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],linkText:[2,"linkText"]},{linkClicked:"linkClicked"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Error,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.error-incorrect-pin"))+" "+l._32(t,1,1,l._22(t,3).transform("hardware-wallet.options.forgotten-pin1")),l._32(t,1,2,l._22(t,4).transform("hardware-wallet.options.forgotten-pin2")))},null)}function Pw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],upperBigText:[2,"upperBigText"],lowerLightText:[3,"lowerLightText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.HardwareWallet,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.options.unconfigured-detected")),l._32(t,1,2,l._22(t,3).transform("hardware-wallet.options.unconfigured-detected-title")),l._32(t,1,3,l._22(t,4).transform("hardware-wallet.options.firmware-version"))+" "+e.firmwareVersion)},null)}function Dw(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],lowerBigText:[2,"lowerBigText"],lowerLightText:[3,"lowerLightText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.HardwareWallet,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.options.configured-detected")),e.walletName,l._32(t,1,3,l._22(t,3).transform("hardware-wallet.options.firmware-version"))+" "+e.firmwareVersion)},null)}function Aw(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"br",[],null,null,null,null,null))],null,null)}function Ew(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(3,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Aw)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,7,0,t.context.index1?t.context.index+1+")":"",l._32(t,3,1,l._22(t,4).transform(t.context.$implicit)))})}function Yw(n){return l._33(0,[(n()(),l._9(0,0,null,null,15,"div",[["class","alert-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["error"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ew)),l._8(13,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,13,0,e.securityWarnings)},function(n,t){var e=t.component;n(t,9,0,l._32(t,9,0,l._22(t,10).transform(e.securityWarnings.length>1?"hardware-wallet.options.security-warnings-title":"hardware-wallet.options.security-warning-title")))})}function jw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.update()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label -blinking"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.update-firmware")))})}function Iw(n){return l._33(0,[(n()(),l._9(0,0,null,null,19,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.generateMnemonic()&&l),l},i_,r_)),l._8(3,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(4,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(6,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.restoreMnemonic()&&l),l},i_,r_)),l._8(12,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(13,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(15,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(16,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,"primary"),n(t,12,0,"primary")},function(n,t){n(t,2,0,l._22(t,3).disabled||null),n(t,7,0,l._32(t,7,0,l._22(t,8).transform("hardware-wallet.options.configure-automatically"))),n(t,11,0,l._22(t,12).disabled||null),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("hardware-wallet.options.restore-backup")))})}function Rw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.backup()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.create-backup")))})}function Hw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.confirmSeed()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.confirm-seed")))})}function Nw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removePin()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label -red"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.delete-pin")))})}function Fw(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Rw)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changePin()&&l),l},i_,r_)),l._8(9,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(10,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(12,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Nw)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.wipe()&&l),l},i_,r_)),l._8(21,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(22,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(24,0,null,0,2,"div",[["class","label -red"]],null,null,null,null,null)),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.needsBackup),n(t,6,0,!e.needsBackup),n(t,9,0,"primary"),n(t,18,0,!e.needsPin),n(t,21,0,"primary")},function(n,t){var e=t.component;n(t,8,0,l._22(t,9).disabled||null),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(e.needsPin?"hardware-wallet.options.create-pin":"hardware-wallet.options.change-pin"))),n(t,20,0,l._22(t,21).disabled||null),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("hardware-wallet.options.wipe")))})}function Bw(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Pw)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Dw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Yw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(11,0,null,null,2,"div",[["class","options-label"]],null,null,null,null,null)),(n()(),l._31(12,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,10,"div",[["class","option-buttons-container select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,jw)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Iw)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Fw)),l._8(24,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.newWalletConnected),n(t,6,0,!e.newWalletConnected),n(t,9,0,e.securityWarnings.length>0),n(t,18,0,e.outdatedFirmware),n(t,21,0,e.newWalletConnected),n(t,24,0,!e.newWalletConnected)},function(n,t){n(t,12,0,l._32(t,12,0,l._22(t,13).transform("hardware-wallet.options.options")))})}function Vw(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Ww(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function zw(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,21,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Ow)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Tw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Lw)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Bw)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Vw)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Ww)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("wallet.hardware-wallet"))),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState===e.states.Other&&!e.otherStateBecauseWrongPin),n(t,12,0,e.currentState===e.states.Other&&e.otherStateBecauseWrongPin),n(t,15,0,e.currentState===e.states.Finished),n(t,18,0,e.currentState===e.states.Finished),n(t,21,0,e.currentState!==e.states.Finished)},null)}var Uw=l._5("app-hw-options-dialog",ud,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-options-dialog",[],null,null,null,zw,Sw)),l._8(1,180224,null,0,ud,[da,ca,oc,fa,Sc,jc],null,null)],null,null)},{},{},[]),Gw=l._7({encapsulation:0,styles:[[""]],data:{}});function qw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setDeleteFromList(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(4,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(5,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,t.component.deleteFromList)},function(n,t){n(t,2,0,l._22(t,4).id,l._22(t,4).indeterminate,l._22(t,4).checked,l._22(t,4).disabled,"before"==l._22(t,4).labelPosition),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.wipe.confirm-delete")))})}function Jw(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,qw)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(9,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(12,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(13,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.requestWipe()&&l),l},w_,g_)),l._8(17,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.Warning,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.wipe.warning"))),n(t,7,0,e.showDeleteFromList)},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.general.cancel"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("hardware-wallet.general.continue")))})}function Qw(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function Kw(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Xw(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Zw(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Qw)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Kw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Xw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState!==e.states.Processing)},null)}function $w(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Jw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Zw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.wipe")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState!==e.states.Initial)},null)}var nx=l._5("app-hw-wipe-dialog",Xc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-wipe-dialog",[],null,null,null,$w,Gw)),l._8(1,180224,null,0,Xc,[da,ca,oc,Sc],null,null)],null,null)},{},{},[]),tx=l._7({encapsulation:0,styles:[[".upper-text[_ngcontent-%COMP%]{margin-top:10px;margin-bottom:10px}.warning[_ngcontent-%COMP%]{margin:-20px 0 20px;color:rgba(30,34,39,.5)}"]],data:{}});function ex(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Spinner,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.added.configuring")))},null)}function lx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function rx(n){return l._33(0,[(n()(),l._9(0,0,null,null,35,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],upperBigText:[1,"upperBigText"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","upper-text"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,16,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,11).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,11).onReset()&&r),r},null,null)),l._8(11,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(13,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,10,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,[[2,0],["input",1]],null,7,"input",[["formControlName","label"],["id","label"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,18)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,18).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,18)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,18)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.saveNameAndCloseModal()&&r),r},null,null)),l._8(18,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(19,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(22,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(24,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,2,"div",[["class","warning"]],null,null,null,null,null)),(n()(),l._31(29,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n \n "])),(n()(),l._9(32,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(33,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.Success,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.added.done"))),n(t,11,0,e.form),n(t,19,0,e.maxHwWalletLabelLength),n(t,22,0,"label")},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("hardware-wallet.added.added1"))),n(t,10,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending),n(t,17,0,l._22(t,19).maxlength?l._22(t,19).maxlength:null,l._22(t,24).ngClassUntouched,l._22(t,24).ngClassTouched,l._22(t,24).ngClassPristine,l._22(t,24).ngClassDirty,l._22(t,24).ngClassValid,l._22(t,24).ngClassInvalid,l._22(t,24).ngClassPending),n(t,29,0,l._32(t,29,0,l._22(t,30).transform("hardware-wallet.added.characters-warning"))),n(t,33,0,l._32(t,33,0,l._22(t,34).transform("hardware-wallet.added.added2")))})}function ix(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0,r=n.component;return"action"===t&&(l=!1!==(r.currentState===r.states.Finished?r.saveNameAndCloseModal():r.closeModal())&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Finished&&!e.form.valid)},function(n,t){var e=t.component;n(t,4,0,l._32(t,4,0,l._22(t,5).transform(e.currentState===e.states.Finished?"hardware-wallet.added.ok":"hardware-wallet.general.close")))})}function ox(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),l._29(671088640,2,{input:0}),(n()(),l._9(2,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(3,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,ex)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,lx)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,rx)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,ix)),l._8(16,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.dialogRef,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.added.title")),e.currentState===e.states.Initial||e.currentState===e.states.Finished),n(t,7,0,e.currentState===e.states.Initial),n(t,10,0,e.currentState===e.states.ShowingResult),n(t,13,0,e.currentState===e.states.Finished),n(t,16,0,e.currentState===e.states.Finished||e.currentState===e.states.ShowingResult)},null)}var sx=l._5("app-hw-added-dialog",td,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-added-dialog",[],null,null,null,ox,tx)),l._8(1,180224,null,0,td,[da,ca,Sc,oc,ns,fa,jc],null,null)],null,null)},{},{},[]),ax=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%]{margin-bottom:0;margin-top:15px}"]],data:{}});function ux(n){return l._33(0,[(n()(),l._9(0,0,null,null,50,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,30,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,7).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,7).onReset()&&r),r},null,null)),l._8(7,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(9,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,21,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,18,"select",[["formControlName","words"],["id","words"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,16).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,16).onTouched()&&r),r},null,null)),l._8(16,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(18,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(20,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,4,"option",[],null,null,null,null,null)),l._8(23,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(24,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,4,"option",[],null,null,null,null,null)),l._8(29,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(30,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(31,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(38,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(40,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(41,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(42,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.startOperation()&&l),l},w_,g_)),l._8(46,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(47,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.None,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.generate-seed.text"))),n(t,7,0,e.form),n(t,18,0,"words"),n(t,23,0,12),n(t,24,0,12),n(t,29,0,24),n(t,30,0,24)},function(n,t){n(t,6,0,l._22(t,9).ngClassUntouched,l._22(t,9).ngClassTouched,l._22(t,9).ngClassPristine,l._22(t,9).ngClassDirty,l._22(t,9).ngClassValid,l._22(t,9).ngClassInvalid,l._22(t,9).ngClassPending),n(t,15,0,l._22(t,20).ngClassUntouched,l._22(t,20).ngClassTouched,l._22(t,20).ngClassPristine,l._22(t,20).ngClassDirty,l._22(t,20).ngClassValid,l._22(t,20).ngClassInvalid,l._22(t,20).ngClassPending),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("wallet.new.12-words"))),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("wallet.new.24-words"))),n(t,42,0,l._32(t,42,0,l._22(t,43).transform("hardware-wallet.general.cancel"))),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("hardware-wallet.general.continue")))})}function cx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Spinner,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.generate-seed.configuring")))},null)}function dx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function hx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function px(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,ux)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,cx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,dx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,hx)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.configure-automatically")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.Processing),n(t,12,0,e.currentState===e.states.ShowingResult),n(t,15,0,e.currentState!==e.states.Initial&&e.currentState!==e.states.Processing)},null)}var fx=l._5("app-hw-generate-seed-dialog",ed,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-generate-seed-dialog",[],null,null,null,px,ax)),l._8(1,180224,null,0,ed,[da,ca,oc,ns],null,null)],null,null)},{},{},[]),_x=l._7({encapsulation:0,styles:[[""]],data:{}});function mx(n){return l._33(0,[(n()(),l._9(0,0,null,null,18,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(9,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(10,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.requestBackup()&&l),l},w_,g_)),l._8(14,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(15,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.msgIcons.Warning,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.create-backup.warning")))},function(n,t){n(t,10,0,l._32(t,10,0,l._22(t,11).transform("hardware-wallet.general.cancel"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("hardware-wallet.general.continue")))})}function gx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.create-backup.instructions")))},null)}function yx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function bx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function vx(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gx)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,yx)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,bx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState!==e.states.Processing)},null)}function wx(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,mx)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,vx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.create-backup")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState!==e.states.Initial)},null)}var xx=l._5("app-hw-backup-dialog",ld,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-backup-dialog",[],null,null,null,wx,_x)),l._8(1,180224,null,0,ld,[da,ca,oc],null,null)],null,null)},{},{},[]),Mx=l._7({encapsulation:0,styles:[[".red-title[_ngcontent-%COMP%]{font-family:Skycoin;line-height:30px;font-size:14px;text-align:center;letter-spacing:.0769231em;color:#ff004e}.link[_ngcontent-%COMP%]{cursor:pointer;color:#0072ff}"]],data:{}});function kx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(r.data.linkFunction(),l=!1!==r.closeModal(!1)&&l),l},null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.data.linkText)))})}function Cx(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"mat-checkbox",[["class","-check e2e-confirm-checkbox mat-checkbox"],["id","terms"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAccept(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(4,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(5,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,"terms",t.component.accepted)},function(n,t){var e=t.component;n(t,2,0,l._22(t,4).id,l._22(t,4).indeterminate,l._22(t,4).checked,l._22(t,4).disabled,"before"==l._22(t,4).labelPosition),n(t,5,0,l._32(t,5,0,l._22(t,6).transform(e.data.checkboxText)))})}function Sx(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal(!1)&&l),l},w_,g_)),l._8(1,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,l._22(t,3).transform(e.data.cancelButtonText)))})}function Ox(n){return l._33(0,[(n()(),l._9(0,0,null,null,24,"app-modal",[["class","modal"]],[[2,"red-title",null]],null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,5,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,kx)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Cx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._9(14,0,null,0,9,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Sx)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal(!0)&&l),l},w_,g_)),l._8(20,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(21,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform(e.data.headerText)),e.disableDismiss),n(t,8,0,e.data.linkText&&e.data.linkFunction),n(t,12,0,e.data.checkboxText),n(t,17,0,e.data.cancelButtonText),n(t,20,0,e.data.checkboxText&&!e.accepted)},function(n,t){var e=t.component;n(t,0,0,e.data.redTitle),n(t,5,0,l._32(t,5,0,l._22(t,6).transform(e.data.text))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform(e.data.confirmButtonText)))})}var Tx=l._5("app-confirmation",Nc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-confirmation",[],null,null,null,Ox,Mx)),l._8(1,49152,null,0,Nc,[ca,da],null,null)],null,null)},{},{},[]),Lx=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{font-size:25px;letter-spacing:15px;text-align:center}.form-field[_ngcontent-%COMP%] .info[_ngcontent-%COMP%]{text-align:center}.form-field[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.num-pad-row[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:50px;border:1px solid #eff0f0;margin:2px}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#171a1d}"]],data:{}});function Px(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.enter-pin.instructions-tx")))})}function Dx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.enter-pin.instructions-change")))})}function Ax(n){return l._33(0,[l._29(402653184,1,{closeButton:0}),(n()(),l._9(1,0,null,null,116,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,28,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,12,"div",[["class","info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Px)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Dx)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(19,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(21,0,null,null,2,"span",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.openHelp()&&l),l},null,null)),(n()(),l._31(22,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,5,"input",[["formControlName","pin"],["id","pin"],["readonly",""],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,27)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,27).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,27)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,27)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(27,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(29,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(31,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(35,0,null,0,73,"div",[["class","select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,19,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("7")&&l),l},i_,r_)),l._8(40,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(41,16384,null,0,Hs,[],null,null),(n()(),l._9(42,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(43,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("8")&&l),l},i_,r_)),l._8(46,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(47,16384,null,0,Hs,[],null,null),(n()(),l._9(48,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(49,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(51,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("9")&&l),l},i_,r_)),l._8(52,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(53,16384,null,0,Hs,[],null,null),(n()(),l._9(54,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(55,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,19,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(60,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("4")&&l),l},i_,r_)),l._8(61,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(62,16384,null,0,Hs,[],null,null),(n()(),l._9(63,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(64,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(66,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("5")&&l),l},i_,r_)),l._8(67,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(68,16384,null,0,Hs,[],null,null),(n()(),l._9(69,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(70,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(72,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("6")&&l),l},i_,r_)),l._8(73,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(74,16384,null,0,Hs,[],null,null),(n()(),l._9(75,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(76,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(79,0,null,null,19,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(81,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("1")&&l),l},i_,r_)),l._8(82,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(83,16384,null,0,Hs,[],null,null),(n()(),l._9(84,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(85,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(87,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("2")&&l),l},i_,r_)),l._8(88,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(89,16384,null,0,Hs,[],null,null),(n()(),l._9(90,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(91,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(93,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("3")&&l),l},i_,r_)),l._8(94,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(95,16384,null,0,Hs,[],null,null),(n()(),l._9(96,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(97,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(100,0,null,null,7,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(102,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removeNumber()&&l),l},i_,r_)),l._8(103,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(104,16384,null,0,Hs,[],null,null),(n()(),l._9(105,0,null,0,1,"span",[["class","material-icons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["backspace"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(110,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(112,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.sendPin()&&l),l},w_,g_)),l._8(113,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(114,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.title))),n(t,6,0,e.form),n(t,15,0,e.data.signingTx),n(t,18,0,e.data.changingPin&&e.data.changePinState===e.changePinStates.RequestingNewPin),n(t,29,0,"pin"),n(t,40,0,"primary"),n(t,46,0,"primary"),n(t,52,0,"primary"),n(t,61,0,"primary"),n(t,67,0,"primary"),n(t,73,0,"primary"),n(t,82,0,"primary"),n(t,88,0,"primary"),n(t,94,0,"primary"),n(t,103,0,"primary"),n(t,113,0,!e.form.valid)},function(n,t){var e=t.component;n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("hardware-wallet.enter-pin.instructions"))),n(t,22,0,l._32(t,22,0,l._22(t,23).transform("hardware-wallet.enter-pin.help"))),n(t,26,0,l._22(t,31).ngClassUntouched,l._22(t,31).ngClassTouched,l._22(t,31).ngClassPristine,l._22(t,31).ngClassDirty,l._22(t,31).ngClassValid,l._22(t,31).ngClassInvalid,l._22(t,31).ngClassPending),n(t,39,0,l._22(t,40).disabled||null),n(t,43,0,e.buttonsContent),n(t,45,0,l._22(t,46).disabled||null),n(t,49,0,e.buttonsContent),n(t,51,0,l._22(t,52).disabled||null),n(t,55,0,e.buttonsContent),n(t,60,0,l._22(t,61).disabled||null),n(t,64,0,e.buttonsContent),n(t,66,0,l._22(t,67).disabled||null),n(t,70,0,e.buttonsContent),n(t,72,0,l._22(t,73).disabled||null),n(t,76,0,e.buttonsContent),n(t,81,0,l._22(t,82).disabled||null),n(t,85,0,e.buttonsContent),n(t,87,0,l._22(t,88).disabled||null),n(t,91,0,e.buttonsContent),n(t,93,0,l._22(t,94).disabled||null),n(t,97,0,e.buttonsContent),n(t,102,0,l._22(t,103).disabled||null),n(t,114,0,l._32(t,114,0,l._22(t,115).transform("hardware-wallet.general.continue")))})}var Ex=l._5("app-hw-pin-dialog",bf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-pin-dialog",[],null,[["window","keyup"]],function(n,t,e){var r=!0;return"window:keyup"===t&&(r=!1!==l._22(n,1).keyEvent(e)&&r),r},Ax,Lx)),l._8(1,245760,null,0,bf,[da,ca,ns,fa,oc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),Yx=l._7({encapsulation:0,styles:[[""]],data:{}});function jx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function Ix(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Rx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Hx(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,12,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,jx)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Ix)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Rx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.changingExistingPin?"hardware-wallet.options.change-pin":"hardware-wallet.options.create-pin")),e.currentState===e.states.Initial),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.ShowingResult),n(t,12,0,e.currentState!==e.states.Initial)},null)}var Nx=l._5("app-hw-change-pin-dialog",rd,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-change-pin-dialog",[],null,null,null,Hx,Yx)),l._8(1,180224,null,0,rd,[da,ca,oc],null,null)],null,null)},{},{},[]),Fx=l._7({encapsulation:0,styles:[[""]],data:{}});function Bx(n){return l._33(0,[(n()(),l._9(0,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"p",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(8,0,null,0,2,"p",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(12,0,null,0,2,"p",[],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,1,0,t.component.dialogRef,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.pin-help.title")))},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.pin-help.part1"))),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("hardware-wallet.pin-help.part2"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.pin-help.part3")))})}var Vx=l._5("app-hw-added-dialog",yf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-added-dialog",[],null,null,null,Bx,Fx)),l._8(1,49152,null,0,yf,[ca],null,null)],null,null)},{},{},[]),Wx=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%]{margin-bottom:0;margin-top:15px}.warning[_ngcontent-%COMP%]{margin-top:15px;color:#ff004e;text-align:center}"]],data:{}});function zx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[["class","warning"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.restore-seed.warning")))})}function Ux(n){return l._33(0,[(n()(),l._9(0,0,null,null,53,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,30,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,7).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,7).onReset()&&r),r},null,null)),l._8(7,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(9,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,21,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,18,"select",[["formControlName","words"],["id","words"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,16).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,16).onTouched()&&r),r},null,null)),l._8(16,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(18,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(20,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,4,"option",[],null,null,null,null,null)),l._8(23,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(24,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,4,"option",[],null,null,null,null,null)),l._8(29,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(30,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(31,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,zx)),l._8(39,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(41,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(44,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(45,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.startOperation()&&l),l},w_,g_)),l._8(49,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(50,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.None,l._32(t,3,1,l._22(t,4).transform(e.justCheckingSeed?"hardware-wallet.restore-seed.check-text":"hardware-wallet.restore-seed.text"))),n(t,7,0,e.form),n(t,18,0,"words"),n(t,23,0,12),n(t,24,0,12),n(t,29,0,24),n(t,30,0,24),n(t,39,0,!e.justCheckingSeed)},function(n,t){n(t,6,0,l._22(t,9).ngClassUntouched,l._22(t,9).ngClassTouched,l._22(t,9).ngClassPristine,l._22(t,9).ngClassDirty,l._22(t,9).ngClassValid,l._22(t,9).ngClassInvalid,l._22(t,9).ngClassPending),n(t,15,0,l._22(t,20).ngClassUntouched,l._22(t,20).ngClassTouched,l._22(t,20).ngClassPristine,l._22(t,20).ngClassDirty,l._22(t,20).ngClassValid,l._22(t,20).ngClassInvalid,l._22(t,20).ngClassPending),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("wallet.new.12-words"))),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("wallet.new.24-words"))),n(t,45,0,l._32(t,45,0,l._22(t,46).transform("hardware-wallet.general.cancel"))),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("hardware-wallet.general.continue")))})}function Gx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform(e.justCheckingSeed?"hardware-wallet.general.follow":"hardware-wallet.general.confirm-and-more")))},null)}function qx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Jx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Qx(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Ux)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Gx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,qx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Jx)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.justCheckingSeed?"hardware-wallet.options.confirm-seed":"hardware-wallet.options.restore-backup")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.Processing),n(t,12,0,e.currentState===e.states.ShowingResult),n(t,15,0,e.currentState!==e.states.Initial&&e.currentState!==e.states.Processing)},null)}var Kx=l._5("app-hw-restore-seed-dialog",id,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-restore-seed-dialog",[],null,null,null,Qx,Wx)),l._8(1,180224,null,0,id,[da,ca,oc,ns],null,null)],null,null)},{},{},[]),Xx=l._7({encapsulation:0,styles:[[""]],data:{}});function Zx(n){return l._33(0,[l._29(402653184,1,{closeButton:0}),(n()(),l._9(1,0,null,null,8,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,3,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(6,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],outputsList:[2,"outputsList"],lowerText:[3,"lowerText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.create-tx.title")),!0),n(t,6,0,e.msgIcons.Confirm,l._32(t,6,1,l._22(t,7).transform("hardware-wallet.create-tx.upper-text")),e.data,l._32(t,6,3,l._22(t,8).transform("hardware-wallet.create-tx.lower-text")))},null)}var $x=l._5("app-hw-confirm-tx-dialog",vf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-confirm-tx-dialog",[],null,null,null,Zx,Xx)),l._8(1,180224,null,0,vf,[da,ca,oc],null,null)],null,null)},{},{},[]),nM=l._7({encapsulation:0,styles:[[""]],data:{}});function tM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],lowerBigText:[2,"lowerBigText"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.confirm-address.instructions")),e.data.address.address)},null)}function eM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function lM(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function rM(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,12,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,tM)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,eM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,lM)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.confirm-address.title")),e.currentState===e.states.Initial),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.ShowingResult),n(t,12,0,e.currentState!==e.states.Initial)},null)}var iM=l._5("app-hw-confirm-address-dialog",Ff,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-confirm-address-dialog",[],null,null,null,rM,nM)),l._8(1,180224,null,0,Ff,[da,ca,oc,Sc],null,null)],null,null)},{},{},[]),oM=l._7({encapsulation:0,styles:[[".options-container[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%]{width:118px;margin:20px;font-size:12px;line-height:unset;padding:0;color:unset;min-width:0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:64px;height:64px;margin:10px 0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);padding:4px 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}"]],data:{}});function sM(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"button",[["class","button mat-button"],["color","accent"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.closePopup(n.context.$implicit)&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,0,"img",[],[[8,"src",4]],null,null,null,null)),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(6,0,null,0,1,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"accent")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,4,0,"assets/img/lang/"+t.context.$implicit.iconName),n(t,7,0,t.context.$implicit.name)})}function aM(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"app-modal",[["class","e2e-language-modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,4,"div",[["class","options-container subtle-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,sM)),l._8(7,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("title.language")),e.disableDismiss),n(t,7,0,e.languages)},null)}var uM=l._5("app-select-language",Vc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-select-language",[],null,null,null,aM,oM)),l._8(1,114688,null,0,Vc,[ca,Bc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),cM=l._7({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid #eff0f0;cursor:pointer}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%]{font-size:13px;line-height:22px;color:#171a1d}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] div[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;position:relative;top:3px;margin:0 5px}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] .grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}button[_ngcontent-%COMP%] .action[_ngcontent-%COMP%]{color:#0072ff}"]],data:{}});function dM(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,23,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.select(n.context.$implicit)&&l),l},i_,r_)),l._8(3,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(4,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(6,0,null,0,18,"div",[["class","info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,6,"div",[],null,null,null,null,null)),(n()(),l._31(9,null,[""," "," "])),(n()(),l._9(10,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(11,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["play_arrow"])),(n()(),l._31(13,null,[" \u2248"," ",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"div",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(17,null,["",": ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,3,"div",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(21,null,["",": ",""])),l._25(131072,De.i,[De.j,l.h]),l._27(23,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,"primary"),n(t,11,0)},function(n,t){var e=t.component;n(t,2,0,l._22(t,3).disabled||null),n(t,9,0,t.context.$implicit.fromAmount,e.getFromCoin(t.context.$implicit.pair)),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(t.context.$implicit.toAmount,!0,"first")),e.getToCoin(t.context.$implicit.pair)),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("exchange.history-window.address")),t.context.$implicit.address),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("exchange.history-window.date")),l._32(t,21,1,n(t,23,0,l._22(t.parent,0),t.context.$implicit.timestamp)))})}function hM(n){return l._33(0,[l._25(0,ag,[]),(n()(),l._9(1,0,null,null,6,"app-modal",[],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,dM)),l._8(6,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("title.order-history"))),n(t,6,0,e.orders)},null)}var pM=l._5("app-exchange-history",ff,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange-history",[],null,null,null,hM,cM)),l._8(1,114688,null,0,ff,[ca,qc,pf],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),fM=l._7({encapsulation:0,styles:[[""]],data:{}});function _M(n){return l._33(0,[(n()(),l._9(0,0,null,null,27,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setConfirmed(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(10,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(11,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(15,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(18,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(19,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.requestRemoval()&&l),l},w_,g_)),l._8(23,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(24,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.Warning,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.remove-pin.warning"))),n(t,10,0,e.confirmed),n(t,23,0,!e.confirmed)},function(n,t){n(t,8,0,l._22(t,10).id,l._22(t,10).indeterminate,l._22(t,10).checked,l._22(t,10).disabled,"before"==l._22(t,10).labelPosition),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("hardware-wallet.remove-pin.check"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("hardware-wallet.general.cancel"))),n(t,24,0,l._32(t,24,0,l._22(t,25).transform("hardware-wallet.general.continue")))})}function mM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function gM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function yM(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function bM(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,mM)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gM)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,yM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState!==e.states.Processing)},null)}function vM(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,_M)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,bM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.delete-pin")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState!==e.states.Initial)},null)}var wM=l._5("app-hw-remove-pin-dialog",od,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-remove-pin-dialog",[],null,null,null,vM,fM)),l._8(1,180224,null,0,od,[da,ca,oc],null,null)],null,null)},{},{},[]),xM=l._7({encapsulation:0,styles:[[""]],data:{}});function MM(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setConfirmed(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(4,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(5,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,t.component.confirmed)},function(n,t){n(t,2,0,l._22(t,4).id,l._22(t,4).indeterminate,l._22(t,4).checked,l._22(t,4).disabled,"before"==l._22(t,4).labelPosition),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.update-firmware.check")))})}function kM(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,MM)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(9,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(12,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(13,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.startUpdating()&&l),l},w_,g_)),l._8(17,49152,[[2,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.deviceHasFirmware?e.msgIcons.Warning:e.msgIcons.HardwareWallet,l._32(t,3,1,l._22(t,4).transform(e.text))),n(t,7,0,e.deviceHasFirmware),n(t,17,0,e.deviceHasFirmware&&!e.confirmed)},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.general.cancel"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("hardware-wallet.general.continue")))})}function CM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Spinner,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.update-firmware.title-connecting")))},null)}function SM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.update-firmware.follow")))},null)}function OM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function TM(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function LM(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,CM)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,SM)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,OM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,TM)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Connecting),n(t,6,0,e.currentState===e.states.Processing),n(t,9,0,e.currentState===e.states.ShowingResult),n(t,12,0,e.currentState!==e.states.Processing)},null)}function PM(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),l._29(671088640,2,{button:0}),(n()(),l._9(2,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(3,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,kM)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,LM)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.dialogRef,l._32(t,3,1,l._22(t,4).transform(e.title)),e.currentState===e.states.Processing),n(t,7,0,e.currentState===e.states.Initial),n(t,10,0,e.currentState!==e.states.Initial)},null)}var DM=l._5("app-hw-update-firmware-dialog",sd,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-update-firmware-dialog",[],null,null,null,PM,xM)),l._8(1,180224,null,0,sd,[ca,oc,jc,De.j],null,null)],null,null)},{},{},[]),AM=l._7({encapsulation:0,styles:[[""]],data:{}});function EM(n){return l._33(0,[l._29(402653184,1,{closeButton:0}),(n()(),l._9(1,0,null,null,20,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(6,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._9(9,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(12,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(13,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.update()&&l),l},w_,g_)),l._8(17,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.update-firmware-warning.title"))),n(t,6,0,e.msgIcons.Warning,l._32(t,6,1,l._22(t,7).transform("hardware-wallet.update-firmware-warning.text")))},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.update-firmware-warning.cancel"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("hardware-wallet.update-firmware-warning.update")))})}var YM=l._5("app-hw-update-alert-dialog",ad,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-update-alert-dialog",[],null,null,null,EM,AM)),l._8(1,180224,null,0,ad,[ca,oc],null,null)],null,null)},{},{},[]),jM=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}"]],data:{}});function IM(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,44,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,26,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,8,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(13,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(15,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,17).show()&&r),"keydown"===t&&(r=!1!==l._22(n,17)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,17).hide(1500)&&r),r},Hf,Rf)),l._8(16,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(17,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,7,"input",[["formControlName","note"],["id","note"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,23)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,23).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,23)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,23)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.changeNote()&&r),r},null,null)),l._8(23,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(24,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(27,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(29,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(33,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(35,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(36,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(37,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(40,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.changeNote()&&l),l},w_,g_)),l._8(41,49152,[[1,4],["button",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(42,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("edit-note.title")),l._22(t,41)&&l._22(t,41).isLoading()),n(t,6,0,e.form),n(t,16,0),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("send.personal-note-help"))),n(t,24,0,e.maxNoteChars),n(t,27,0,"note")},function(n,t){n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("send.personal-note-label"))),n(t,22,0,l._22(t,24).maxlength?l._22(t,24).maxlength:null,l._22(t,29).ngClassUntouched,l._22(t,29).ngClassTouched,l._22(t,29).ngClassPristine,l._22(t,29).ngClassDirty,l._22(t,29).ngClassValid,l._22(t,29).ngClassInvalid,l._22(t,29).ngClassPending),n(t,37,0,l._32(t,37,0,l._22(t,38).transform("edit-note.cancel-button"))),n(t,42,0,l._32(t,42,0,l._22(t,43).transform("edit-note.change-button")))})}var RM=l._5("app-change-note",am,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-change-note",[],null,null,null,IM,jM)),l._8(1,245760,null,0,am,[ca,da,ns,jc,ic],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),HM=l._7({encapsulation:2,styles:[".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative}.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}"],data:{}});function NM(n){return l._33(0,[(n()(),l._9(0,0,[[2,0],["panel",1]],null,2,"div",[["class","mat-autocomplete-panel"],["role","listbox"]],[[8,"id",0]],null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._21(null,0)],function(n,t){n(t,1,0,"mat-autocomplete-panel",t.component._classList)},function(n,t){n(t,0,0,t.component.id)})}function FM(n){return l._33(2,[l._29(402653184,1,{template:0}),l._29(671088640,2,{panel:0}),(n()(),l._4(0,[[1,2]],null,0,null,NM))],null,null)}var BM=l._7({encapsulation:0,styles:[[".form-container[_ngcontent-%COMP%]{margin-top:20px}.option[_ngcontent-%COMP%]{font-size:13px;height:42px}"]],data:{}});function VM(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],upperBigText:[2,"upperBigText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.None,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.seed-word.info2")),l._32(t,1,2,l._22(t,3).transform("hardware-wallet.seed-word.info1")))},null)}function WM(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],upperBigText:[2,"upperBigText"]},null),l._25(131072,De.i,[De.j,l.h]),l._26(3,{number:0}),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.None,l._32(t,1,1,l._22(t,2).transform(e.data.restoringSoftwareWallet?"wallet.new.seed.recover-seed-help":"wallet.new.seed.new-seed-help")),l._32(t,1,2,l._22(t,4).transform("wallet.new.seed.enter-word",n(t,3,0,e.data.wordNumber))))},null)}function zM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"label",[["for","word"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.seed-word.word")))})}function UM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-option",[["class","option mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"click"===t&&(r=!1!==i.sendWord()&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["",""]))],function(n,t){n(t,1,0,t.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit)})}function GM(n){return l._33(0,[(n()(),l._9(0,0,null,null,49,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,VM)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,WM)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(10,0,null,0,30,"div",[["class","form-container"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,11).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,11).onReset()&&r),r},null,null)),l._8(11,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(13,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zM)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,16777216,null,null,8,"input",[["aria-autocomplete","list"],["autocomplete","off"],["class","mat-input-element mat-form-field-autofill-control"],["formControlName","word"],["id","word"],["matInput",""],["role","combobox"]],[[1,"aria-activedescendant",0],[1,"aria-expanded",0],[1,"aria-owns",0],[2,"mat-input-server",null],[1,"id",0],[8,"placeholder",0],[8,"disabled",0],[8,"required",0],[8,"readOnly",0],[1,"aria-describedby",0],[1,"aria-invalid",0],[1,"aria-required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"focusin"],[null,"blur"],[null,"input"],[null,"keydown"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"focusin"===t&&(r=!1!==l._22(n,22)._handleFocus()&&r),"blur"===t&&(r=!1!==l._22(n,22)._onTouched()&&r),"input"===t&&(r=!1!==l._22(n,22)._handleInput(e)&&r),"keydown"===t&&(r=!1!==l._22(n,22)._handleKeydown(e)&&r),"input"===t&&(r=!1!==l._22(n,23)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,23).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,23)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,23)._compositionEnd(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,27)._focusChanged(!1)&&r),"focus"===t&&(r=!1!==l._22(n,27)._focusChanged(!0)&&r),"input"===t&&(r=!1!==l._22(n,27)._onInput()&&r),"keydown.enter"===t&&(r=!1!==i.sendWord()&&r),r},null,null)),l._28(6144,null,Os,null,[pu]),l._8(22,147456,null,0,Is,[l.l,Pi,l.R,l.B,l.h,Ys,[2,Dl],[8,null],[2,sn]],{autocomplete:[0,"autocomplete"]},null),l._8(23,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n,t){return[n,t]},[Is,ro]),l._8(25,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(27,933888,null,0,pu,[l.l,Hl,[2,uo],[2,Wo],[2,qo],Kl,[8,null]],{id:[0,"id"]},null),l._8(28,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,8,"mat-autocomplete",[["class","mat-autocomplete"]],null,null,null,FM,HM)),l._8(31,1097728,[["auto",4]],2,Es,[l.h,l.l],null,null),l._29(603979776,1,{options:1}),l._29(603979776,2,{optionGroups:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,2,null,UM)),l._8(36,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),l._25(131072,nn,[l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(42,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.sendWord()&&l),l},w_,g_)),l._8(45,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(46,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform(e.data.isForHwWallet?"hardware-wallet.seed-word.title":"wallet.new.seed-label"))),n(t,5,0,e.data.isForHwWallet),n(t,8,0,!e.data.isForHwWallet),n(t,11,0,e.form),n(t,18,0,e.data.isForHwWallet),n(t,22,0,l._22(t,31)),n(t,25,0,"word"),n(t,27,0,"word"),n(t,36,0,l._32(t,36,0,l._22(t,37).transform(e.filteredOptions))),n(t,45,0,!e.form.valid)},function(n,t){n(t,10,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending),n(t,20,1,[null==l._22(t,22).activeOption?null:l._22(t,22).activeOption.id,l._22(t,22).panelOpen.toString(),null==l._22(t,22).autocomplete?null:l._22(t,22).autocomplete.id,l._22(t,27)._isServer,l._22(t,27).id,l._22(t,27).placeholder,l._22(t,27).disabled,l._22(t,27).required,l._22(t,27).readonly,l._22(t,27)._ariaDescribedby||null,l._22(t,27).errorState,l._22(t,27).required.toString(),l._22(t,28).ngClassUntouched,l._22(t,28).ngClassTouched,l._22(t,28).ngClassPristine,l._22(t,28).ngClassDirty,l._22(t,28).ngClassValid,l._22(t,28).ngClassInvalid,l._22(t,28).ngClassPending]),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("hardware-wallet.general.continue")))})}var qM=l._5("app-seed-word-dialog",Hc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-seed-word-dialog",[],null,null,null,GM,BM)),l._8(1,245760,null,0,Hc,[da,ca,ns,Ac,jc,De.j,oc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),JM=l._7({encapsulation:0,styles:[[".form-container[_ngcontent-%COMP%]{margin-top:20px}"]],data:{}});function QM(n){return l._33(0,[(n()(),l._9(0,0,null,null,31,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(8,0,null,0,14,"div",[["class","form-container"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,9).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,9).onReset()&&r),r},null,null)),l._8(9,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(11,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,8,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,5,"textarea",[["formControlName","data"],["id","data"],["rows","5"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,16)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,16).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,16)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,16)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(16,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(18,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(20,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(24,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.processData()&&l),l},w_,g_)),l._8(27,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(28,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("send.bulk-send.title"))),n(t,9,0,e.form),n(t,18,0,"data")},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("send.bulk-send.indications"))),n(t,8,0,l._22(t,11).ngClassUntouched,l._22(t,11).ngClassTouched,l._22(t,11).ngClassPristine,l._22(t,11).ngClassDirty,l._22(t,11).ngClassValid,l._22(t,11).ngClassInvalid,l._22(t,11).ngClassPending),n(t,15,0,l._22(t,20).ngClassUntouched,l._22(t,20).ngClassTouched,l._22(t,20).ngClassPristine,l._22(t,20).ngClassDirty,l._22(t,20).ngClassValid,l._22(t,20).ngClassInvalid,l._22(t,20).ngClassPending),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("send.bulk-send.process")))})}var KM=l._5("app-multiple-destinations-dialog",Hm,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-multiple-destinations-dialog",[],null,null,null,QM,JM)),l._8(1,245760,null,0,Hm,[ca,da,ns,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),XM=l._7({encapsulation:0,styles:[[".main-container[_ngcontent-%COMP%]{position:fixed;bottom:0;width:100%;z-index:1000000;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.internal-container[_ngcontent-%COMP%]{color:#fff;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;min-width:40%;max-width:90%;display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px;border-top-left-radius:5px;border-top-right-radius:5px}.red-background[_ngcontent-%COMP%]{background-color:rgba(255,0,0,.7)}.green-background[_ngcontent-%COMP%]{background-color:rgba(31,177,31,.7)}.yellow-background[_ngcontent-%COMP%]{background-color:rgba(255,94,0,.7)}.icon-container[_ngcontent-%COMP%]{margin-right:10px}.text-container[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-right:10px}.text-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:15px;margin-top:-1px}.text-container[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{font-size:13px;margin-top:2px}.close-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{cursor:pointer}"]],data:{}});function ZM(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[["class","icon-container"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(2,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(3,0,["",""]))],function(n,t){n(t,2,0)},function(n,t){n(t,3,0,t.component.config.icon)})}function $M(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.config.title)))})}function nk(n){return l._33(0,[(n()(),l._9(0,0,null,null,22,"div",[["class","main-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,19,"div",[],[[8,"className",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ZM)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,8,"div",[["class","text-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,$M)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[["class","text"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,3,"div",[["class","close-container"]],null,null,null,null,null)),(n()(),l._9(18,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.hide()&&l),l},Hf,Rf)),l._8(19,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["close"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,e.config.icon),n(t,10,0,e.config.title),n(t,19,0)},function(n,t){var e=t.component;n(t,2,0,"internal-container "+(e.config.color?e.config.color:"red-background")),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(e.config.text)))})}function tk(n){return l._33(0,[(n()(),l._4(16777216,null,null,1,null,nk)),l._8(1,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,1,0,t.component.visible)},null)}var ek=l._7({encapsulation:0,styles:[[".size-alert[_ngcontent-%COMP%]{background-color:rgba(0,0,0,.85);position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;color:#fff}.size-alert[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{margin:0 40px;max-width:400px}mat-card[_ngcontent-%COMP%]{max-width:1000px;margin-top:80px;margin-right:auto;margin-left:auto}.logo[_ngcontent-%COMP%]{max-height:100%}.fill-remaining-space[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.sky-container[_ngcontent-%COMP%]{max-width:1000px;margin-top:20px;margin-right:auto;margin-left:auto}mat-toolbar[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{margin:0 20px}.search-field[_ngcontent-%COMP%]{border-radius:8px;border:none;background-color:#fff;padding:8px}.syncing[_ngcontent-%COMP%]{font-size:14px}.main-menu[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-right:20px}#top-menu[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fbfbfb}#top-menu[_ngcontent-%COMP%] span#version[_ngcontent-%COMP%]{padding-top:12px}"]],data:{}});function lk(n){return l._33(0,[l._29(402653184,1,{msgBar:0}),(n()(),l._9(1,0,null,null,10,"div",[["class","size-alert d-md-none"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,7,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,0,"img",[["src","assets/img/size-alert.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(13,16777216,null,null,1,"router-outlet",[],null,null,null,null,null)),l._8(14,212992,null,0,bp,[yp,l.R,l.j,[8,null],l.h],null,null),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(16,0,null,null,1,"app-msg-bar",[],null,null,null,tk,XM)),l._8(17,49152,[[1,4],["msgBar",4]],0,Yc,[],null,null)],function(n,t){n(t,14,0)},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("errors.window-size")))})}var rk=l._5("app-root",wf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-root",[],null,null,null,lk,ek)),l._8(1,114688,null,0,wf,[gf,Bc,Sc,oc,Xu,Zu,Ac,fa,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]);function ik(n){switch(n.length){case 0:return new us;case 1:return n[0];default:return new cs(n)}}function ok(n,t,e,l,r,i){void 0===r&&(r={}),void 0===i&&(i={});var o=[],s=[],a=-1,u=null;if(l.forEach(function(n){var e=n.offset,l=e==a,c=l&&u||{};Object.keys(n).forEach(function(e){var l=e,s=n[e];if("offset"!==e)switch(l=t.normalizePropertyName(l,o),s){case ds:s=r[e];break;case is:s=i[e];break;default:s=t.normalizeStyleValue(e,l,s,o)}c[l]=s}),l||s.push(c),u=c,a=e}),o.length)throw new Error("Unable to animate due to the following errors:\n - "+o.join("\n - "));return s}function sk(n,t,e,l){switch(t){case"start":n.onStart(function(){return l(e&&ak(e,"start",n.totalTime))});break;case"done":n.onDone(function(){return l(e&&ak(e,"done",n.totalTime))});break;case"destroy":n.onDestroy(function(){return l(e&&ak(e,"destroy",n.totalTime))})}}function ak(n,t,e){var l=uk(n.element,n.triggerName,n.fromState,n.toState,t||n.phaseName,void 0==e?n.totalTime:e),r=n._data;return null!=r&&(l._data=r),l}function uk(n,t,e,l,r,i){return void 0===r&&(r=""),void 0===i&&(i=0),{element:n,triggerName:t,fromState:e,toState:l,phaseName:r,totalTime:i}}function ck(n,t,e){var l;return n instanceof Map?(l=n.get(t))||n.set(t,l=e):(l=n[t])||(l=n[t]=e),l}function dk(n){var t=n.indexOf(":");return[n.substring(1,t),n.substr(t+1)]}var hk=function(n,t){return!1},pk=function(n,t){return!1},fk=function(n,t,e){return[]};if("undefined"!=typeof Element){if(hk=function(n,t){return n.contains(t)},Element.prototype.matches)pk=function(n,t){return n.matches(t)};else{var _k=Element.prototype,mk=_k.matchesSelector||_k.mozMatchesSelector||_k.msMatchesSelector||_k.oMatchesSelector||_k.webkitMatchesSelector;mk&&(pk=function(n,t){return mk.apply(n,[t])})}fk=function(n,t,e){var l=[];if(e)l.push.apply(l,n.querySelectorAll(t));else{var r=n.querySelector(t);r&&l.push(r)}return l}}var gk=null,yk=!1;function bk(){return"undefined"!=typeof document?document.body:null}var vk=pk,wk=hk,xk=fk,Mk=function(){function n(){}return n.prototype.validateStyleProperty=function(n){return function(n){gk||(gk=bk()||{},yk=!!gk.style&&"WebkitAppearance"in gk.style);var t=!0;return gk.style&&!function(n){return"ebkit"==n.substring(1,6)}(n)&&!(t=n in gk.style)&&yk&&(t="Webkit"+n.charAt(0).toUpperCase()+n.substr(1)in gk.style),t}(n)},n.prototype.matchesElement=function(n,t){return vk(n,t)},n.prototype.containsElement=function(n,t){return wk(n,t)},n.prototype.query=function(n,t,e){return xk(n,t,e)},n.prototype.computeStyle=function(n,t,e){return e||""},n.prototype.animate=function(n,t,e,l,r,i){return void 0===i&&(i=[]),new us},n}(),kk=function(){function n(){}return n.NOOP=new Mk,n}(),Ck=1e3;function Sk(n){if("number"==typeof n)return n;var t=n.match(/^(-?[\.\d]+)(m?s)/);return!t||t.length<2?0:Ok(parseFloat(t[1]),t[2])}function Ok(n,t){switch(t){case"s":return n*Ck;default:return n}}function Tk(n,t,e){return n.hasOwnProperty("duration")?n:function(n,t,e){var l,r=0,i="";if("string"==typeof n){var o=n.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===o)return t.push('The provided timing value "'+n+'" is invalid.'),{duration:0,delay:0,easing:""};l=Ok(parseFloat(o[1]),o[2]);var s=o[3];null!=s&&(r=Ok(Math.floor(parseFloat(s)),o[4]));var a=o[5];a&&(i=a)}else l=n;if(!e){var u=!1,c=t.length;l<0&&(t.push("Duration values below 0 are not allowed for this animation step."),u=!0),r<0&&(t.push("Delay values below 0 are not allowed for this animation step."),u=!0),u&&t.splice(c,0,'The provided timing value "'+n+'" is invalid.')}return{duration:l,delay:r,easing:i}}(n,t,e)}function Lk(n,t){return void 0===t&&(t={}),Object.keys(n).forEach(function(e){t[e]=n[e]}),t}function Pk(n,t,e){if(void 0===e&&(e={}),t)for(var l in n)e[l]=n[l];else Lk(n,e);return e}function Dk(n,t){n.style&&Object.keys(t).forEach(function(e){var l=Nk(e);n.style[l]=t[e]})}function Ak(n,t){n.style&&Object.keys(t).forEach(function(t){var e=Nk(t);n.style[e]=""})}function Ek(n){return Array.isArray(n)?1==n.length?n[0]:os(n):n}var Yk=new RegExp("{{\\s*(.+?)\\s*}}","g");function jk(n){var t=[];if("string"==typeof n){for(var e=n.toString(),l=void 0;l=Yk.exec(e);)t.push(l[1]);Yk.lastIndex=0}return t}function Ik(n,t,e){var l=n.toString(),r=l.replace(Yk,function(n,l){var r=t[l];return t.hasOwnProperty(l)||(e.push("Please provide a value for the animation param "+l),r=""),r.toString()});return r==l?n:r}function Rk(n){for(var t=[],e=n.next();!e.done;)t.push(e.value),e=n.next();return t}var Hk=/-+([a-z0-9])/g;function Nk(n){return n.replace(Hk,function(){for(var n=[],t=0;t *";case":leave":return"* => void";case":increment":return function(n,t){return parseFloat(t)>parseFloat(n)};case":decrement":return function(n,t){return parseFloat(t) *"}}(n,e);if("function"==typeof l)return void t.push(l);n=l}var r=n.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==r||r.length<4)return e.push('The provided transition expression "'+n+'" is not supported'),t;var i=r[1],o=r[2],s=r[3];t.push(zk(i,s)),"<"!=o[0]||i==Bk&&s==Bk||t.push(zk(s,i))}(n,r,l)}):r.push(e),r),animation:i,queryCount:t.queryCount,depCount:t.depCount,options:Kk(n.options)}},n.prototype.visitSequence=function(n,t){var e=this;return{type:2,steps:n.steps.map(function(n){return Fk(e,n,t)}),options:Kk(n.options)}},n.prototype.visitGroup=function(n,t){var e=this,l=t.currentTime,r=0,i=n.steps.map(function(n){t.currentTime=l;var i=Fk(e,n,t);return r=Math.max(r,t.currentTime),i});return t.currentTime=r,{type:3,steps:i,options:Kk(n.options)}},n.prototype.visitAnimate=function(n,t){var e,l=function(n,t){var e=null;if(n.hasOwnProperty("duration"))e=n;else if("number"==typeof n)return Xk(Tk(n,t).duration,0,"");var l=n;if(l.split(/\s+/).some(function(n){return"{"==n.charAt(0)&&"{"==n.charAt(1)})){var r=Xk(0,0,"");return r.dynamic=!0,r.strValue=l,r}return Xk((e=e||Tk(l,t)).duration,e.delay,e.easing)}(n.timings,t.errors);t.currentAnimateTimings=l;var r=n.styles?n.styles:ss({});if(5==r.type)e=this.visitKeyframes(r,t);else{var i=n.styles,o=!1;if(!i){o=!0;var s={};l.easing&&(s.easing=l.easing),i=ss(s)}t.currentTime+=l.duration+l.delay;var a=this.visitStyle(i,t);a.isEmptyStep=o,e=a}return t.currentAnimateTimings=null,{type:4,timings:l,style:e,options:null}},n.prototype.visitStyle=function(n,t){var e=this._makeStyleAst(n,t);return this._validateStyleAst(e,t),e},n.prototype._makeStyleAst=function(n,t){var e=[];Array.isArray(n.styles)?n.styles.forEach(function(n){"string"==typeof n?n==is?e.push(n):t.errors.push("The provided style string value "+n+" is not allowed."):e.push(n)}):e.push(n.styles);var l=!1,r=null;return e.forEach(function(n){if(Qk(n)){var t=n,e=t.easing;if(e&&(r=e,delete t.easing),!l)for(var i in t)if(t[i].toString().indexOf("{{")>=0){l=!0;break}}}),{type:6,styles:e,easing:r,offset:n.offset,containsDynamicStyles:l,options:null}},n.prototype._validateStyleAst=function(n,t){var e=this,l=t.currentAnimateTimings,r=t.currentTime,i=t.currentTime;l&&i>0&&(i-=l.duration+l.delay),n.styles.forEach(function(n){"string"!=typeof n&&Object.keys(n).forEach(function(l){if(e._driver.validateStyleProperty(l)){var o,s,a,u=t.collectedStyles[t.currentQuerySelector],c=u[l],d=!0;c&&(i!=r&&i>=c.startTime&&r<=c.endTime&&(t.errors.push('The CSS property "'+l+'" that exists between the times of "'+c.startTime+'ms" and "'+c.endTime+'ms" is also being animated in a parallel animation between the times of "'+i+'ms" and "'+r+'ms"'),d=!1),i=c.startTime),d&&(u[l]={startTime:i,endTime:r}),t.options&&(o=t.errors,s=t.options.params||{},(a=jk(n[l])).length&&a.forEach(function(n){s.hasOwnProperty(n)||o.push("Unable to resolve the local animation param "+n+" in the given list of values")}))}else t.errors.push('The provided animation property "'+l+'" is not a supported CSS property for animations')})})},n.prototype.visitKeyframes=function(n,t){var e=this,l={type:5,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push("keyframes() must be placed inside of a call to animate()"),l;var r=0,i=[],o=!1,s=!1,a=0,u=n.steps.map(function(n){var l=e._makeStyleAst(n,t),u=null!=l.offset?l.offset:function(n){if("string"==typeof n)return null;var t=null;if(Array.isArray(n))n.forEach(function(n){if(Qk(n)&&n.hasOwnProperty("offset")){var e=n;t=parseFloat(e.offset),delete e.offset}});else if(Qk(n)&&n.hasOwnProperty("offset")){var e=n;t=parseFloat(e.offset),delete e.offset}return t}(l.styles),c=0;return null!=u&&(r++,c=l.offset=u),s=s||c<0||c>1,o=o||c0&&r0?r==h?1:d*r:i[r],s=o*_;t.currentTime=p+f.delay+s,f.duration=s,e._validateStyleAst(n,t),n.offset=o,l.styles.push(n)}),l},n.prototype.visitReference=function(n,t){return{type:8,animation:Fk(this,Ek(n.animation),t),options:Kk(n.options)}},n.prototype.visitAnimateChild=function(n,t){return t.depCount++,{type:9,options:Kk(n.options)}},n.prototype.visitAnimateRef=function(n,t){return{type:10,animation:this.visitReference(n.animation,t),options:Kk(n.options)}},n.prototype.visitQuery=function(n,t){var e=t.currentQuerySelector,l=n.options||{};t.queryCount++,t.currentQuery=n;var r=function(n){var t=!!n.split(/\s*,\s*/).find(function(n){return":self"==n});return t&&(n=n.replace(Uk,"")),[n=n.replace(/@\*/g,".ng-trigger").replace(/@\w+/g,function(n){return".ng-trigger-"+n.substr(1)}).replace(/:animating/g,".ng-animating"),t]}(n.selector),i=r[0],o=r[1];t.currentQuerySelector=e.length?e+" "+i:i,ck(t.collectedStyles,t.currentQuerySelector,{});var s=Fk(this,Ek(n.animation),t);return t.currentQuery=null,t.currentQuerySelector=e,{type:11,selector:i,limit:l.limit||0,optional:!!l.optional,includeSelf:o,animation:s,originalSelector:n.selector,options:Kk(n.options)}},n.prototype.visitStagger=function(n,t){t.currentQuery||t.errors.push("stagger() can only be used inside of query()");var e="full"===n.timings?{duration:0,delay:0,easing:"full"}:Tk(n.timings,t.errors,!0);return{type:12,animation:Fk(this,Ek(n.animation),t),timings:e,options:null}},n}(),Jk=function(n){this.errors=n,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null};function Qk(n){return!Array.isArray(n)&&"object"==typeof n}function Kk(n){var t;return n?(n=Lk(n)).params&&(n.params=(t=n.params)?Lk(t):null):n={},n}function Xk(n,t,e){return{duration:n,delay:t,easing:e}}function Zk(n,t,e,l,r,i,o,s){return void 0===o&&(o=null),void 0===s&&(s=!1),{type:1,element:n,keyframes:t,preStyleProps:e,postStyleProps:l,duration:r,delay:i,totalTime:r+i,easing:o,subTimeline:s}}var $k=function(){function n(){this._map=new Map}return n.prototype.consume=function(n){var t=this._map.get(n);return t?this._map.delete(n):t=[],t},n.prototype.append=function(n,t){var e=this._map.get(n);e||this._map.set(n,e=[]),e.push.apply(e,t)},n.prototype.has=function(n){return this._map.has(n)},n.prototype.clear=function(){this._map.clear()},n}(),nC=new RegExp(":enter","g"),tC=new RegExp(":leave","g");function eC(n,t,e,l,r,i,o,s,a,u){return void 0===i&&(i={}),void 0===o&&(o={}),void 0===u&&(u=[]),(new lC).buildKeyframes(n,t,e,l,r,i,o,s,a,u)}var lC=function(){function n(){}return n.prototype.buildKeyframes=function(n,t,e,l,r,i,o,s,a,u){void 0===u&&(u=[]),a=a||new $k;var c=new iC(n,t,a,l,r,u,[]);c.options=s,c.currentTimeline.setStyles([i],null,c.errors,s),Fk(this,e,c);var d=c.timelines.filter(function(n){return n.containsAnimation()});if(d.length&&Object.keys(o).length){var h=d[d.length-1];h.allowOnlyTimelineStyles()||h.setStyles([o],null,c.errors,s)}return d.length?d.map(function(n){return n.buildKeyframes()}):[Zk(t,[],[],[],0,0,"",!1)]},n.prototype.visitTrigger=function(n,t){},n.prototype.visitState=function(n,t){},n.prototype.visitTransition=function(n,t){},n.prototype.visitAnimateChild=function(n,t){var e=t.subInstructions.consume(t.element);if(e){var l=t.createSubContext(n.options),r=t.currentTimeline.currentTime,i=this._visitSubInstructions(e,l,l.options);r!=i&&t.transformIntoNewTimeline(i)}t.previousNode=n},n.prototype.visitAnimateRef=function(n,t){var e=t.createSubContext(n.options);e.transformIntoNewTimeline(),this.visitReference(n.animation,e),t.transformIntoNewTimeline(e.currentTimeline.currentTime),t.previousNode=n},n.prototype._visitSubInstructions=function(n,t,e){var l=t.currentTimeline.currentTime,r=null!=e.duration?Sk(e.duration):null,i=null!=e.delay?Sk(e.delay):null;return 0!==r&&n.forEach(function(n){var e=t.appendInstructionToTimeline(n,r,i);l=Math.max(l,e.duration+e.delay)}),l},n.prototype.visitReference=function(n,t){t.updateOptions(n.options,!0),Fk(this,n.animation,t),t.previousNode=n},n.prototype.visitSequence=function(n,t){var e=this,l=t.subContextCount,r=t,i=n.options;if(i&&(i.params||i.delay)&&((r=t.createSubContext(i)).transformIntoNewTimeline(),null!=i.delay)){6==r.previousNode.type&&(r.currentTimeline.snapshotCurrentStyles(),r.previousNode=rC);var o=Sk(i.delay);r.delayNextStep(o)}n.steps.length&&(n.steps.forEach(function(n){return Fk(e,n,r)}),r.currentTimeline.applyStylesToKeyframe(),r.subContextCount>l&&r.transformIntoNewTimeline()),t.previousNode=n},n.prototype.visitGroup=function(n,t){var e=this,l=[],r=t.currentTimeline.currentTime,i=n.options&&n.options.delay?Sk(n.options.delay):0;n.steps.forEach(function(o){var s=t.createSubContext(n.options);i&&s.delayNextStep(i),Fk(e,o,s),r=Math.max(r,s.currentTimeline.currentTime),l.push(s.currentTimeline)}),l.forEach(function(n){return t.currentTimeline.mergeTimelineCollectedStyles(n)}),t.transformIntoNewTimeline(r),t.previousNode=n},n.prototype._visitTiming=function(n,t){if(n.dynamic){var e=n.strValue;return Tk(t.params?Ik(e,t.params,t.errors):e,t.errors)}return{duration:n.duration,delay:n.delay,easing:n.easing}},n.prototype.visitAnimate=function(n,t){var e=t.currentAnimateTimings=this._visitTiming(n.timings,t),l=t.currentTimeline;e.delay&&(t.incrementTime(e.delay),l.snapshotCurrentStyles());var r=n.style;5==r.type?this.visitKeyframes(r,t):(t.incrementTime(e.duration),this.visitStyle(r,t),l.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=n},n.prototype.visitStyle=function(n,t){var e=t.currentTimeline,l=t.currentAnimateTimings;!l&&e.getCurrentStyleProperties().length&&e.forwardFrame();var r=l&&l.easing||n.easing;n.isEmptyStep?e.applyEmptyStep(r):e.setStyles(n.styles,r,t.errors,t.options),t.previousNode=n},n.prototype.visitKeyframes=function(n,t){var e=t.currentAnimateTimings,l=t.currentTimeline.duration,r=e.duration,i=t.createSubContext().currentTimeline;i.easing=e.easing,n.styles.forEach(function(n){i.forwardTime((n.offset||0)*r),i.setStyles(n.styles,n.easing,t.errors,t.options),i.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(i),t.transformIntoNewTimeline(l+r),t.previousNode=n},n.prototype.visitQuery=function(n,t){var e=this,l=t.currentTimeline.currentTime,r=n.options||{},i=r.delay?Sk(r.delay):0;i&&(6===t.previousNode.type||0==l&&t.currentTimeline.getCurrentStyleProperties().length)&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=rC);var o=l,s=t.invokeQuery(n.selector,n.originalSelector,n.limit,n.includeSelf,!!r.optional,t.errors);t.currentQueryTotal=s.length;var a=null;s.forEach(function(l,r){t.currentQueryIndex=r;var s=t.createSubContext(n.options,l);i&&s.delayNextStep(i),l===t.element&&(a=s.currentTimeline),Fk(e,n.animation,s),s.currentTimeline.applyStylesToKeyframe(),o=Math.max(o,s.currentTimeline.currentTime)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(o),a&&(t.currentTimeline.mergeTimelineCollectedStyles(a),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=n},n.prototype.visitStagger=function(n,t){var e=t.parentContext,l=t.currentTimeline,r=n.timings,i=Math.abs(r.duration),o=i*(t.currentQueryTotal-1),s=i*t.currentQueryIndex;switch(r.duration<0?"reverse":r.easing){case"reverse":s=o-s;break;case"full":s=e.currentStaggerTime}var a=t.currentTimeline;s&&a.delayNextStep(s);var u=a.currentTime;Fk(this,n.animation,t),t.previousNode=n,e.currentStaggerTime=l.currentTime-u+(l.startTime-e.currentTimeline.startTime)},n}(),rC={},iC=function(){function n(n,t,e,l,r,i,o,s){this._driver=n,this.element=t,this.subInstructions=e,this._enterClassName=l,this._leaveClassName=r,this.errors=i,this.timelines=o,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=rC,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=s||new oC(this._driver,t,0),o.push(this.currentTimeline)}return Object.defineProperty(n.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),n.prototype.updateOptions=function(n,t){var e=this;if(n){var l=n,r=this.options;null!=l.duration&&(r.duration=Sk(l.duration)),null!=l.delay&&(r.delay=Sk(l.delay));var i=l.params;if(i){var o=r.params;o||(o=this.options.params={}),Object.keys(i).forEach(function(n){t&&o.hasOwnProperty(n)||(o[n]=Ik(i[n],o,e.errors))})}}},n.prototype._copyOptions=function(){var n={};if(this.options){var t=this.options.params;if(t){var e=n.params={};Object.keys(t).forEach(function(n){e[n]=t[n]})}}return n},n.prototype.createSubContext=function(t,e,l){void 0===t&&(t=null);var r=e||this.element,i=new n(this._driver,r,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(r,l||0));return i.previousNode=this.previousNode,i.currentAnimateTimings=this.currentAnimateTimings,i.options=this._copyOptions(),i.updateOptions(t),i.currentQueryIndex=this.currentQueryIndex,i.currentQueryTotal=this.currentQueryTotal,i.parentContext=this,this.subContextCount++,i},n.prototype.transformIntoNewTimeline=function(n){return this.previousNode=rC,this.currentTimeline=this.currentTimeline.fork(this.element,n),this.timelines.push(this.currentTimeline),this.currentTimeline},n.prototype.appendInstructionToTimeline=function(n,t,e){var l={duration:null!=t?t:n.duration,delay:this.currentTimeline.currentTime+(null!=e?e:0)+n.delay,easing:""},r=new sC(this._driver,n.element,n.keyframes,n.preStyleProps,n.postStyleProps,l,n.stretchStartingKeyframe);return this.timelines.push(r),l},n.prototype.incrementTime=function(n){this.currentTimeline.forwardTime(this.currentTimeline.duration+n)},n.prototype.delayNextStep=function(n){n>0&&this.currentTimeline.delayNextStep(n)},n.prototype.invokeQuery=function(n,t,e,l,r,i){var o=[];if(l&&o.push(this.element),n.length>0){n=(n=n.replace(nC,"."+this._enterClassName)).replace(tC,"."+this._leaveClassName);var s=this._driver.query(this.element,n,1!=e);0!==e&&(s=e<0?s.slice(s.length+e,s.length):s.slice(0,e)),o.push.apply(o,s)}return r||0!=o.length||i.push('`query("'+t+'")` returned zero elements. (Use `query("'+t+'", { optional: true })` if you wish to allow this.)'),o},n}(),oC=function(){function n(n,t,e,l){this._driver=n,this.element=t,this.startTime=e,this._elementTimelineStylesLookup=l,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(t),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(t,this._localTimelineStyles)),this._loadKeyframe()}return n.prototype.containsAnimation=function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}},n.prototype.getCurrentStyleProperties=function(){return Object.keys(this._currentKeyframe)},Object.defineProperty(n.prototype,"currentTime",{get:function(){return this.startTime+this.duration},enumerable:!0,configurable:!0}),n.prototype.delayNextStep=function(n){var t=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||t?(this.forwardTime(this.currentTime+n),t&&this.snapshotCurrentStyles()):this.startTime+=n},n.prototype.fork=function(t,e){return this.applyStylesToKeyframe(),new n(this._driver,t,e||this.currentTime,this._elementTimelineStylesLookup)},n.prototype._loadKeyframe=function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))},n.prototype.forwardFrame=function(){this.duration+=1,this._loadKeyframe()},n.prototype.forwardTime=function(n){this.applyStylesToKeyframe(),this.duration=n,this._loadKeyframe()},n.prototype._updateStyle=function(n,t){this._localTimelineStyles[n]=t,this._globalTimelineStyles[n]=t,this._styleSummary[n]={time:this.currentTime,value:t}},n.prototype.allowOnlyTimelineStyles=function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe},n.prototype.applyEmptyStep=function(n){var t=this;n&&(this._previousKeyframe.easing=n),Object.keys(this._globalTimelineStyles).forEach(function(n){t._backFill[n]=t._globalTimelineStyles[n]||is,t._currentKeyframe[n]=is}),this._currentEmptyStepKeyframe=this._currentKeyframe},n.prototype.setStyles=function(n,t,e,l){var r=this;t&&(this._previousKeyframe.easing=t);var i=l&&l.params||{},o=function(n,t){var e,l={};return n.forEach(function(n){"*"===n?(e=e||Object.keys(t)).forEach(function(n){l[n]=is}):Pk(n,!1,l)}),l}(n,this._globalTimelineStyles);Object.keys(o).forEach(function(n){var t=Ik(o[n],i,e);r._pendingStyles[n]=t,r._localTimelineStyles.hasOwnProperty(n)||(r._backFill[n]=r._globalTimelineStyles.hasOwnProperty(n)?r._globalTimelineStyles[n]:is),r._updateStyle(n,t)})},n.prototype.applyStylesToKeyframe=function(){var n=this,t=this._pendingStyles,e=Object.keys(t);0!=e.length&&(this._pendingStyles={},e.forEach(function(e){n._currentKeyframe[e]=t[e]}),Object.keys(this._localTimelineStyles).forEach(function(t){n._currentKeyframe.hasOwnProperty(t)||(n._currentKeyframe[t]=n._localTimelineStyles[t])}))},n.prototype.snapshotCurrentStyles=function(){var n=this;Object.keys(this._localTimelineStyles).forEach(function(t){var e=n._localTimelineStyles[t];n._pendingStyles[t]=e,n._updateStyle(t,e)})},n.prototype.getFinalKeyframe=function(){return this._keyframes.get(this.duration)},Object.defineProperty(n.prototype,"properties",{get:function(){var n=[];for(var t in this._currentKeyframe)n.push(t);return n},enumerable:!0,configurable:!0}),n.prototype.mergeTimelineCollectedStyles=function(n){var t=this;Object.keys(n._styleSummary).forEach(function(e){var l=t._styleSummary[e],r=n._styleSummary[e];(!l||r.time>l.time)&&t._updateStyle(e,r.value)})},n.prototype.buildKeyframes=function(){var n=this;this.applyStylesToKeyframe();var t=new Set,e=new Set,l=1===this._keyframes.size&&0===this.duration,r=[];this._keyframes.forEach(function(i,o){var s=Pk(i,!0);Object.keys(s).forEach(function(n){var l=s[n];l==ds?t.add(n):l==is&&e.add(n)}),l||(s.offset=o/n.duration),r.push(s)});var i=t.size?Rk(t.values()):[],o=e.size?Rk(e.values()):[];if(l){var s=r[0],a=Lk(s);s.offset=0,a.offset=1,r=[s,a]}return Zk(this.element,r,i,o,this.duration,this.startTime,this.easing,!1)},n}(),sC=function(n){function t(t,e,l,r,i,o,s){void 0===s&&(s=!1);var a=n.call(this,t,e,o.delay)||this;return a.element=e,a.keyframes=l,a.preStyleProps=r,a.postStyleProps=i,a._stretchStartingKeyframe=s,a.timings={duration:o.duration,delay:o.delay,easing:o.easing},a}return Object(i.__extends)(t,n),t.prototype.containsAnimation=function(){return this.keyframes.length>1},t.prototype.buildKeyframes=function(){var n=this.keyframes,t=this.timings,e=t.delay,l=t.duration,r=t.easing;if(this._stretchStartingKeyframe&&e){var i=[],o=l+e,s=e/o,a=Pk(n[0],!1);a.offset=0,i.push(a);var u=Pk(n[0],!1);u.offset=aC(s),i.push(u);for(var c=n.length-1,d=1;d<=c;d++){var h=Pk(n[d],!1);h.offset=aC((e+h.offset*l)/o),i.push(h)}l=o,e=0,r="",n=i}return Zk(this.element,n,this.preStyleProps,this.postStyleProps,l,e,r,!0)},t}(oC);function aC(n,t){void 0===t&&(t=3);var e=Math.pow(10,t-1);return Math.round(n*e)/e}var uC=function(){},cC=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.normalizePropertyName=function(n,t){return Nk(n)},t.prototype.normalizeStyleValue=function(n,t,e,l){var r="",i=e.toString().trim();if(dC[t]&&0!==e&&"0"!==e)if("number"==typeof e)r="px";else{var o=e.match(/^[+-]?[\d\.]+([a-z]*)$/);o&&0==o[1].length&&l.push("Please provide a CSS unit value for "+n+":"+e)}return i+r},t}(uC),dC=function(n){var t={};return"width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(",").forEach(function(n){return t[n]=!0}),t}();function hC(n,t,e,l,r,i,o,s,a,u,c,d){return{type:0,element:n,triggerName:t,isRemovalTransition:r,fromState:e,fromStyles:i,toState:l,toStyles:o,timelines:s,queriedElements:a,preStyleProps:u,postStyleProps:c,errors:d}}var pC={},fC=function(){function n(n,t,e){this._triggerName=n,this.ast=t,this._stateStyles=e}return n.prototype.match=function(n,t){return function(n,t,e){return n.some(function(n){return n(t,e)})}(this.ast.matchers,n,t)},n.prototype.buildStyles=function(n,t,e){var l=this._stateStyles["*"],r=this._stateStyles[n],i=l?l.buildStyles(t,e):{};return r?r.buildStyles(t,e):i},n.prototype.build=function(n,t,e,l,r,o,s,a,u){var c=[],d=this.ast.options&&this.ast.options.params||pC,h=this.buildStyles(e,s&&s.params||pC,c),p=a&&a.params||pC,f=this.buildStyles(l,p,c),_=new Set,m=new Map,g=new Map,y="void"===l,b={params:Object(i.__assign)({},d,p)},v=eC(n,t,this.ast.animation,r,o,h,f,b,u,c);if(c.length)return hC(t,this._triggerName,e,l,y,h,f,[],[],m,g,c);v.forEach(function(n){var e=n.element,l=ck(m,e,{});n.preStyleProps.forEach(function(n){return l[n]=!0});var r=ck(g,e,{});n.postStyleProps.forEach(function(n){return r[n]=!0}),e!==t&&_.add(e)});var w=Rk(_.values());return hC(t,this._triggerName,e,l,y,h,f,v,w,m,g)},n}(),_C=function(){function n(n,t){this.styles=n,this.defaultParams=t}return n.prototype.buildStyles=function(n,t){var e={},l=Lk(this.defaultParams);return Object.keys(n).forEach(function(t){var e=n[t];null!=e&&(l[t]=e)}),this.styles.styles.forEach(function(n){if("string"!=typeof n){var r=n;Object.keys(r).forEach(function(n){var i=r[n];i.length>1&&(i=Ik(i,l,t)),e[n]=i})}}),e},n}(),mC=function(){function n(n,t){var e=this;this.name=n,this.ast=t,this.transitionFactories=[],this.states={},t.states.forEach(function(n){e.states[n.name]=new _C(n.style,n.options&&n.options.params||{})}),gC(this.states,"true","1"),gC(this.states,"false","0"),t.transitions.forEach(function(t){e.transitionFactories.push(new fC(n,t,e.states))}),this.fallbackTransition=new fC(n,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(n,t){return!0}],options:null,queryCount:0,depCount:0},this.states)}return Object.defineProperty(n.prototype,"containsQueries",{get:function(){return this.ast.queryCount>0},enumerable:!0,configurable:!0}),n.prototype.matchTransition=function(n,t){return this.transitionFactories.find(function(e){return e.match(n,t)})||null},n.prototype.matchStyles=function(n,t,e){return this.fallbackTransition.buildStyles(n,t,e)},n}();function gC(n,t,e){n.hasOwnProperty(t)?n.hasOwnProperty(e)||(n[e]=n[t]):n.hasOwnProperty(e)&&(n[t]=n[e])}var yC=new $k,bC=function(){function n(n,t){this._driver=n,this._normalizer=t,this._animations={},this._playersById={},this.players=[]}return n.prototype.register=function(n,t){var e=[],l=Gk(this._driver,t,e);if(e.length)throw new Error("Unable to build the animation due to the following errors: "+e.join("\n"));this._animations[n]=l},n.prototype._buildPlayer=function(n,t,e){var l=n.element,r=ok(0,this._normalizer,0,n.keyframes,t,e);return this._driver.animate(l,r,n.duration,n.delay,n.easing,[])},n.prototype.create=function(n,t,e){var l=this;void 0===e&&(e={});var r,i=[],o=this._animations[n],s=new Map;if(o?(r=eC(this._driver,t,o,"ng-enter","ng-leave",{},{},e,yC,i)).forEach(function(n){var t=ck(s,n.element,{});n.postStyleProps.forEach(function(n){return t[n]=null})}):(i.push("The requested animation doesn't exist or has already been destroyed"),r=[]),i.length)throw new Error("Unable to create the animation due to the following errors: "+i.join("\n"));s.forEach(function(n,t){Object.keys(n).forEach(function(e){n[e]=l._driver.computeStyle(t,e,is)})});var a=ik(r.map(function(n){var t=s.get(n.element);return l._buildPlayer(n,{},t)}));return this._playersById[n]=a,a.onDestroy(function(){return l.destroy(n)}),this.players.push(a),a},n.prototype.destroy=function(n){var t=this._getPlayer(n);t.destroy(),delete this._playersById[n];var e=this.players.indexOf(t);e>=0&&this.players.splice(e,1)},n.prototype._getPlayer=function(n){var t=this._playersById[n];if(!t)throw new Error("Unable to find the timeline player referenced by "+n);return t},n.prototype.listen=function(n,t,e,l){var r=uk(t,"","","");return sk(this._getPlayer(n),e,r,l),function(){}},n.prototype.command=function(n,t,e,l){if("register"!=e)if("create"!=e){var r=this._getPlayer(n);switch(e){case"play":r.play();break;case"pause":r.pause();break;case"reset":r.reset();break;case"restart":r.restart();break;case"finish":r.finish();break;case"init":r.init();break;case"setPosition":r.setPosition(parseFloat(l[0]));break;case"destroy":this.destroy(n)}}else this.create(n,t,l[0]||{});else this.register(n,l[0])},n}(),vC=[],wC={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!1},xC={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!0},MC="__ng_removed",kC=function(){function n(n,t){void 0===t&&(t=""),this.namespaceId=t;var e=n&&n.hasOwnProperty("value");if(this.value=function(n){return null!=n?n:null}(e?n.value:n),e){var l=Lk(n);delete l.value,this.options=l}else this.options={};this.options.params||(this.options.params={})}return Object.defineProperty(n.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),n.prototype.absorbOptions=function(n){var t=n.params;if(t){var e=this.options.params;Object.keys(t).forEach(function(n){null==e[n]&&(e[n]=t[n])})}},n}(),CC=new kC("void"),SC=new kC("DELETED"),OC=function(){function n(n,t,e){this.id=n,this.hostElement=t,this._engine=e,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+n,jC(t,this._hostClassName)}return n.prototype.listen=function(n,t,e,l){var r,i=this;if(!this._triggers.hasOwnProperty(t))throw new Error('Unable to listen on the animation trigger event "'+e+'" because the animation trigger "'+t+"\" doesn't exist!");if(null==e||0==e.length)throw new Error('Unable to listen on the animation trigger "'+t+'" because the provided event is undefined!');if("start"!=(r=e)&&"done"!=r)throw new Error('The provided animation trigger event "'+e+'" for the animation trigger "'+t+'" is not supported!');var o=ck(this._elementListeners,n,[]),s={name:t,phase:e,callback:l};o.push(s);var a=ck(this._engine.statesByElement,n,{});return a.hasOwnProperty(t)||(jC(n,"ng-trigger"),jC(n,"ng-trigger-"+t),a[t]=CC),function(){i._engine.afterFlush(function(){var n=o.indexOf(s);n>=0&&o.splice(n,1),i._triggers[t]||delete a[t]})}},n.prototype.register=function(n,t){return!this._triggers[n]&&(this._triggers[n]=t,!0)},n.prototype._getTrigger=function(n){var t=this._triggers[n];if(!t)throw new Error('The provided animation trigger "'+n+'" has not been registered!');return t},n.prototype.trigger=function(n,t,e,l){var r=this;void 0===l&&(l=!0);var i=this._getTrigger(t),o=new LC(this.id,t,n),s=this._engine.statesByElement.get(n);s||(jC(n,"ng-trigger"),jC(n,"ng-trigger-"+t),this._engine.statesByElement.set(n,s={}));var a=s[t],u=new kC(e,this.id);if(!(e&&e.hasOwnProperty("value"))&&a&&u.absorbOptions(a.options),s[t]=u,a){if(a===SC)return o}else a=CC;if("void"===u.value||a.value!==u.value){var c=ck(this._engine.playersByElement,n,[]);c.forEach(function(n){n.namespaceId==r.id&&n.triggerName==t&&n.queued&&n.destroy()});var d=i.matchTransition(a.value,u.value),h=!1;if(!d){if(!l)return;d=i.fallbackTransition,h=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:n,triggerName:t,transition:d,fromState:a,toState:u,player:o,isFallbackTransition:h}),h||(jC(n,"ng-animate-queued"),o.onStart(function(){IC(n,"ng-animate-queued")})),o.onDone(function(){var t=r.players.indexOf(o);t>=0&&r.players.splice(t,1);var e=r._engine.playersByElement.get(n);if(e){var l=e.indexOf(o);l>=0&&e.splice(l,1)}}),this.players.push(o),c.push(o),o}if(!function(n,t){var e=Object.keys(n),l=Object.keys(t);if(e.length!=l.length)return!1;for(var r=0;r=0){for(var l=!1,r=e;r>=0;r--)if(this.driver.containsElement(this._namespaceList[r].hostElement,t)){this._namespaceList.splice(r+1,0,n),l=!0;break}l||this._namespaceList.splice(0,0,n)}else this._namespaceList.push(n);return this.namespacesByHostElement.set(t,n),n},n.prototype.register=function(n,t){var e=this._namespaceLookup[n];return e||(e=this.createNamespace(n,t)),e},n.prototype.registerTrigger=function(n,t,e){var l=this._namespaceLookup[n];l&&l.register(t,e)&&this.totalAnimations++},n.prototype.destroy=function(n,t){var e=this;if(n){var l=this._fetchNamespace(n);this.afterFlush(function(){e.namespacesByHostElement.delete(l.hostElement),delete e._namespaceLookup[n];var t=e._namespaceList.indexOf(l);t>=0&&e._namespaceList.splice(t,1)}),this.afterFlushAnimationsDone(function(){return l.destroy(t)})}},n.prototype._fetchNamespace=function(n){return this._namespaceLookup[n]},n.prototype.fetchNamespacesByElement=function(n){var t=new Set,e=this.statesByElement.get(n);if(e)for(var l=Object.keys(e),r=0;r=0;C--)this._namespaceList[C].drainQueuedTransitions(t).forEach(function(n){var t=n.player;M.push(t);var i=n.element;if(h&&e.driver.containsElement(h,i)){var o=w.get(i),d=_.get(i),p=e._buildInstruction(n,l,d,o);if(p.errors&&p.errors.length)k.push(p);else{if(n.isFallbackTransition)return t.onStart(function(){return Ak(i,p.fromStyles)}),t.onDestroy(function(){return Dk(i,p.toStyles)}),void r.push(t);p.timelines.forEach(function(n){return n.stretchStartingKeyframe=!0}),l.append(i,p.timelines),s.push({instruction:p,player:t,element:i}),p.queriedElements.forEach(function(n){return ck(a,n,[]).push(t)}),p.preStyleProps.forEach(function(n,t){var e=Object.keys(n);if(e.length){var l=u.get(t);l||u.set(t,l=new Set),e.forEach(function(n){return l.add(n)})}}),p.postStyleProps.forEach(function(n,t){var e=Object.keys(n),l=c.get(t);l||c.set(t,l=new Set),e.forEach(function(n){return l.add(n)})})}}else t.destroy()});if(k.length){var S=[];k.forEach(function(n){S.push("@"+n.triggerName+" has failed due to:\n"),n.errors.forEach(function(n){return S.push("- "+n+"\n")})}),M.forEach(function(n){return n.destroy()}),this.reportError(S)}var O=new Map,T=new Map;s.forEach(function(n){var t=n.element;l.has(t)&&(T.set(t,t),e._beforeAnimationBuild(n.player.namespaceId,n.instruction,O))}),r.forEach(function(n){var t=n.element;e._getPreviousPlayers(t,!1,n.namespaceId,n.triggerName,null).forEach(function(n){ck(O,t,[]).push(n),n.destroy()})});var L=g.filter(function(n){return HC(n,u,c)}),P=new Map;AC(P,this.driver,b,c,is).forEach(function(n){HC(n,u,c)&&L.push(n)});var D=new Map;f.forEach(function(n,t){AC(D,e.driver,new Set(n),u,ds)}),L.forEach(function(n){var t=P.get(n),e=D.get(n);P.set(n,Object(i.__assign)({},t,e))});var A=[],E=[],Y={};s.forEach(function(n){var t=n.element,i=n.player,s=n.instruction;if(l.has(t)){if(d.has(t))return i.onDestroy(function(){return Dk(t,s.toStyles)}),void r.push(i);var a=Y;if(T.size>1){for(var u=t,c=[];u=u.parentNode;){var h=T.get(u);if(h){a=h;break}c.push(u)}c.forEach(function(n){return T.set(n,a)})}var p=e._buildAnimation(i.namespaceId,s,O,o,D,P);if(i.setRealPlayer(p),a===Y)A.push(i);else{var f=e.playersByElement.get(a);f&&f.length&&(i.parentPlayer=ik(f)),r.push(i)}}else Ak(t,s.fromStyles),i.onDestroy(function(){return Dk(t,s.toStyles)}),E.push(i),d.has(t)&&r.push(i)}),E.forEach(function(n){var t=o.get(n.element);if(t&&t.length){var e=ik(t);n.setRealPlayer(e)}}),r.forEach(function(n){n.parentPlayer?n.syncPlayerEvents(n.parentPlayer):n.destroy()});for(var j=0;j0?this.driver.animate(n.element,t,n.duration,n.delay,n.easing,e):new us},n}(),LC=function(){function n(n,t,e){this.namespaceId=n,this.triggerName=t,this.element=e,this._player=new us,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.queued=!0}return n.prototype.setRealPlayer=function(n){var t=this;this._containsRealPlayer||(this._player=n,Object.keys(this._queuedCallbacks).forEach(function(e){t._queuedCallbacks[e].forEach(function(t){return sk(n,e,void 0,t)})}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.queued=!1)},n.prototype.getRealPlayer=function(){return this._player},n.prototype.syncPlayerEvents=function(n){var t=this,e=this._player;e.triggerCallback&&n.onStart(function(){return e.triggerCallback("start")}),n.onDone(function(){return t.finish()}),n.onDestroy(function(){return t.destroy()})},n.prototype._queueEvent=function(n,t){ck(this._queuedCallbacks,n,[]).push(t)},n.prototype.onDone=function(n){this.queued&&this._queueEvent("done",n),this._player.onDone(n)},n.prototype.onStart=function(n){this.queued&&this._queueEvent("start",n),this._player.onStart(n)},n.prototype.onDestroy=function(n){this.queued&&this._queueEvent("destroy",n),this._player.onDestroy(n)},n.prototype.init=function(){this._player.init()},n.prototype.hasStarted=function(){return!this.queued&&this._player.hasStarted()},n.prototype.play=function(){!this.queued&&this._player.play()},n.prototype.pause=function(){!this.queued&&this._player.pause()},n.prototype.restart=function(){!this.queued&&this._player.restart()},n.prototype.finish=function(){this._player.finish()},n.prototype.destroy=function(){this.destroyed=!0,this._player.destroy()},n.prototype.reset=function(){!this.queued&&this._player.reset()},n.prototype.setPosition=function(n){this.queued||this._player.setPosition(n)},n.prototype.getPosition=function(){return this.queued?0:this._player.getPosition()},Object.defineProperty(n.prototype,"totalTime",{get:function(){return this._player.totalTime},enumerable:!0,configurable:!0}),n.prototype.triggerCallback=function(n){var t=this._player;t.triggerCallback&&t.triggerCallback(n)},n}();function PC(n){return n&&1===n.nodeType}function DC(n,t){var e=n.style.display;return n.style.display=null!=t?t:"none",e}function AC(n,t,e,l,r){var i=[];e.forEach(function(n){return i.push(DC(n))});var o=[];l.forEach(function(e,l){var i={};e.forEach(function(n){var e=i[n]=t.computeStyle(l,n,r);e&&0!=e.length||(l[MC]=xC,o.push(l))}),n.set(l,i)});var s=0;return e.forEach(function(n){return DC(n,i[s++])}),o}function EC(n,t){var e=new Map;if(n.forEach(function(n){return e.set(n,[])}),0==t.length)return e;var l=new Set(t),r=new Map;return t.forEach(function(n){var t=function n(t){if(!t)return 1;var i=r.get(t);if(i)return i;var o=t.parentNode;return i=e.has(o)?o:l.has(o)?1:n(o),r.set(t,i),i}(n);1!==t&&e.get(t).push(n)}),e}var YC="$$classes";function jC(n,t){if(n.classList)n.classList.add(t);else{var e=n[YC];e||(e=n[YC]={}),e[t]=!0}}function IC(n,t){if(n.classList)n.classList.remove(t);else{var e=n[YC];e&&delete e[t]}}function RC(n,t,e){ik(e).onDone(function(){return n.processLeaveNode(t)})}function HC(n,t,e){var l=e.get(n);if(!l)return!1;var r=t.get(n);return r?l.forEach(function(n){return r.add(n)}):t.set(n,l),e.delete(n),!0}var NC=function(){function n(n,t){var e=this;this._driver=n,this._triggerCache={},this.onRemovalComplete=function(n,t){},this._transitionEngine=new TC(n,t),this._timelineEngine=new bC(n,t),this._transitionEngine.onRemovalComplete=function(n,t){return e.onRemovalComplete(n,t)}}return n.prototype.registerTrigger=function(n,t,e,l,r){var i=n+"-"+l,o=this._triggerCache[i];if(!o){var s=[],a=Gk(this._driver,r,s);if(s.length)throw new Error('The animation trigger "'+l+'" has failed to build due to the following errors:\n - '+s.join("\n - "));o=function(n,t){return new mC(n,t)}(l,a),this._triggerCache[i]=o}this._transitionEngine.registerTrigger(t,l,o)},n.prototype.register=function(n,t){this._transitionEngine.register(n,t)},n.prototype.destroy=function(n,t){this._transitionEngine.destroy(n,t)},n.prototype.onInsert=function(n,t,e,l){this._transitionEngine.insertNode(n,t,e,l)},n.prototype.onRemove=function(n,t,e){this._transitionEngine.removeNode(n,t,e)},n.prototype.disableAnimations=function(n,t){this._transitionEngine.markElementAsDisabled(n,t)},n.prototype.process=function(n,t,e,l){if("@"==e.charAt(0)){var r=dk(e);this._timelineEngine.command(r[0],t,r[1],l)}else this._transitionEngine.trigger(n,t,e,l)},n.prototype.listen=function(n,t,e,l,r){if("@"==e.charAt(0)){var i=dk(e);return this._timelineEngine.listen(i[0],t,i[1],r)}return this._transitionEngine.listen(n,t,e,l,r)},n.prototype.flush=function(n){void 0===n&&(n=-1),this._transitionEngine.flush(n)},Object.defineProperty(n.prototype,"players",{get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)},enumerable:!0,configurable:!0}),n.prototype.whenRenderingDone=function(){return this._transitionEngine.whenRenderingDone()},n}(),FC=function(n){function t(t,e){var r=n.call(this)||this;return r._nextAnimationId=0,r._renderer=t.createRenderer(e.body,{id:"0",encapsulation:l.S.None,styles:[],data:{animation:[]}}),r}return Object(i.__extends)(t,n),t.prototype.build=function(n){var t=this._nextAnimationId.toString();this._nextAnimationId++;var e=Array.isArray(n)?os(n):n;return WC(this._renderer,null,t,"register",[e]),new BC(t,this._renderer)},t}(rs),BC=function(n){function t(t,e){var l=n.call(this)||this;return l._id=t,l._renderer=e,l}return Object(i.__extends)(t,n),t.prototype.create=function(n,t){return new VC(this._id,n,t||{},this._renderer)},t}(function(){}),VC=function(){function n(n,t,e,l){this.id=n,this.element=t,this._renderer=l,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",e)}return n.prototype._listen=function(n,t){return this._renderer.listen(this.element,"@@"+this.id+":"+n,t)},n.prototype._command=function(n){for(var t=[],e=1;e=0&&n=11?n:n+12:"sore"===t||"malam"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"pagi":n<15?"siang":n<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(e("PJh5"))},z3hR:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return t?r[e][0]:r[e][1]}function e(n){if(n=parseInt(n,10),isNaN(n))return!1;if(n<0)return!0;if(n<10)return 4<=n&&n<=7;if(n<100){var t=n%10;return e(0===t?n/10:t)}if(n<1e4){for(;n>=10;)n/=10;return e(n)}return e(n/=1e3)}n.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(n){return e(n.substr(0,n.indexOf(" ")))?"a "+n:"an "+n},past:function(n){return e(n.substr(0,n.indexOf(" ")))?"viru "+n:"virun "+n},s:"e puer Sekonnen",ss:"%d Sekonnen",m:t,mm:"%d Minutten",h:t,hh:"%d Stonnen",d:t,dd:"%d Deeg",M:t,MM:"%d M\xe9int",y:t,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))}},[0]); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/polyfills.44742ea60435cec4c09d.bundle.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/polyfills.44742ea60435cec4c09d.bundle.js new file mode 100644 index 00000000..876852c8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/polyfills.44742ea60435cec4c09d.bundle.js @@ -0,0 +1 @@ +webpackJsonp([8],{"/whu":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"0Rih":function(t,e,n){"use strict";var r=n("OzIq"),o=n("Ds5P"),i=n("R3AP"),a=n("A16L"),c=n("1aA0"),u=n("vmSO"),s=n("9GpA"),f=n("UKM+"),l=n("zgIt"),p=n("qkyc"),h=n("yYvK"),v=n("kic5");t.exports=function(t,e,n,d,y,g){var _=r[t],k=_,m=y?"set":"add",b=k&&k.prototype,w={},T=function(t){var e=b[t];i(b,t,"delete"==t?function(t){return!(g&&!f(t))&&e.call(this,0===t?0:t)}:"has"==t?function(t){return!(g&&!f(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return g&&!f(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof k&&(g||b.forEach&&!l(function(){(new k).entries().next()}))){var O=new k,D=O[m](g?{}:-0,1)!=O,E=l(function(){O.has(1)}),S=p(function(t){new k(t)}),P=!g&&l(function(){for(var t=new k,e=5;e--;)t[m](e,e);return!t.has(-0)});S||((k=e(function(e,n){s(e,k,t);var r=v(new _,e,k);return void 0!=n&&u(n,y,r[m],r),r})).prototype=b,b.constructor=k),(E||P)&&(T("delete"),T("has"),y&&T("get")),(P||D)&&T(m),g&&b.clear&&delete b.clear}else k=d.getConstructor(e,t,y,m),a(k.prototype,n),c.NEED=!0;return h(k,t),w[t]=k,o(o.G+o.W+o.F*(k!=_),w),g||d.setStrong(k,t,y),k}},1:function(t,e,n){t.exports=n("XS25")},"1aA0":function(t,e,n){var r=n("ulTY")("meta"),o=n("UKM+"),i=n("WBcL"),a=n("lDLk").f,c=0,u=Object.isExtensible||function(){return!0},s=!n("zgIt")(function(){return u(Object.preventExtensions({}))}),f=function(t){a(t,r,{value:{i:"O"+ ++c,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!u(t))return"F";if(!e)return"E";f(t)}return t[r].i},getWeak:function(t,e){if(!i(t,r)){if(!u(t))return!0;if(!e)return!1;f(t)}return t[r].w},onFreeze:function(t){return s&&l.NEED&&u(t)&&!i(t,r)&&f(t),t}}},"2p1q":function(t,e,n){var r=n("lDLk"),o=n("fU25");t.exports=n("bUqO")?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},"2tFN":function(t,e,n){n("CVR+"),n("vmSu"),n("4ZU1"),n("yx1U"),n("X7aK"),n("SPtU"),n("A52B"),n("PuTd"),n("dm+7"),n("JG34"),n("Rw4K"),n("9mGU"),n("bUY0"),n("mTp7"),t.exports=n("7gX0").Reflect},"3q4u":function(t,e,n){var r=n("wCso"),o=n("DIVP"),i=r.key,a=r.map,c=r.store;r.exp({deleteMetadata:function(t,e){var n=arguments.length<3?void 0:i(arguments[2]),r=a(o(e),n,!1);if(void 0===r||!r.delete(t))return!1;if(r.size)return!0;var u=c.get(e);return u.delete(n),!!u.size||c.delete(e)}})},"4ZU1":function(t,e,n){var r=n("lDLk"),o=n("Ds5P"),i=n("DIVP"),a=n("s4j0");o(o.S+o.F*n("zgIt")(function(){Reflect.defineProperty(r.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t),e=a(e,!0),i(n);try{return r.f(t,e,n),!0}catch(t){return!1}}})},"7gX0":function(t,e){var n=t.exports={version:"2.5.3"};"number"==typeof __e&&(__e=n)},"7ylX":function(t,e,n){var r=n("DIVP"),o=n("twxM"),i=n("QKXm"),a=n("mZON")("IE_PROTO"),c=function(){},u=function(){var t,e=n("jhxf")("iframe"),r=i.length;for(e.style.display="none",n("d075").appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("'],s=0;o>s;s++){a.push("");for(var h=0;o>h;h++)a.push('');a.push("")}a.push("
"),r.innerHTML=a.join("");var u=r.childNodes[0],l=(e.width-u.offsetWidth)/2,f=(e.height-u.offsetHeight)/2;l>0&&f>0&&(u.style.margin=f+"px "+l+"px")},t.prototype.clear=function(){this._el.innerHTML=""},t}();(QRCode=function(t,e){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:s.H},"string"==typeof e&&(e={text:e}),e)for(var r in e)this._htOption[r]=e[r];"string"==typeof t&&(t=document.getElementById(t)),this._android=n(),this._el=t,this._oQRCode=null,this._oDrawing=new c(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)}).prototype.makeCode=function(t){this._oQRCode=new e(function(t,e){for(var r=1,o=function(t){var e=encodeURI(t).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return e.length+(e.length!=t?3:0)}(t),i=0,n=g.length;n>=i;i++){var a=0;switch(e){case s.L:a=g[i][0];break;case s.M:a=g[i][1];break;case s.Q:a=g[i][2];break;case s.H:a=g[i][3]}if(a>=o)break;r++}if(r>g.length)throw new Error("Too long data");return r}(t,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(t),this._oQRCode.make(),this._el.title=t,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=s}(); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css new file mode 100644 index 00000000..d0539769 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.674f50d287a8c48dc19b.eot?v=4.7.0);src:url(fontawesome-webfont.674f50d287a8c48dc19b.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fontawesome-webfont.af7ae505a9eed503f8b8.woff2?v=4.7.0) format('woff2'),url(fontawesome-webfont.fee66e712a8a08eef580.woff?v=4.7.0) format('woff'),url(fontawesome-webfont.b06871f281fee6b241d6.ttf?v=4.7.0) format('truetype'),url(fontawesome-webfont.912ec66d7572ff821749.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:2s linear infinite fa-spin;animation:2s linear infinite fa-spin}.fa-pulse{-webkit-animation:1s steps(8) infinite fa-spin;animation:1s steps(8) infinite fa-spin}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.e79bfd88537def476913.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(MaterialIcons-Regular.570eb83859dc23dd0eec.woff2) format('woff2'),url(MaterialIcons-Regular.012cf6a10129e2275d79.woff) format('woff'),url(MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf) format('truetype')}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;-webkit-font-feature-settings:'liga';font-feature-settings:'liga'}.-table:last-of-type{margin-bottom:30px}.-table .-headers{color:rgba(30,34,39,.2);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;margin:0 30px}.-table .-headers>div{padding:0 20px}.-table .-body{border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:0 30px}.-table .-body .-row{font-size:13px;padding:15px 0;background:#fafafa;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-table .-body .-row:not(:last-child){border-bottom:1px solid #eff0f0}.-table .-body .-row:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-table .-body .-row:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-table .-body .-row>div{padding:0 20px}.-table .-width-70{width:70px;-ms-flex-negative:0;flex-shrink:0}.-table .-width-150{width:150px;-ms-flex-negative:0;flex-shrink:0}.-table .-width-200{width:200px;-ms-flex-negative:0;flex-shrink:0}.-table .-width-250{width:250px;-ms-flex-negative:0;flex-shrink:0}.modal .-body{line-height:20px;font-size:13px;color:#1e2227;opacity:.8}.modal .big-text{color:#000;font-weight:700;font-size:15px}.modal .-check-container{text-align:center;margin-top:25px}.modal .-check-container .-check label{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.modal .-check-container .-check .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.modal .-check-container .-check .mat-checkbox-background,.modal .-check-container .-check .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.modal .-buttons{text-align:center}.modal app-button button{margin-top:28px}/*! + * Bootstrap Grid v4.0.0-beta.3 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */@-ms-viewport{width:device-width}html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar;height:100%}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}.d-print-none{display:none!important}}.mat-elevation-z0{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{-webkit-box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12);box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{-webkit-box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12);box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{-webkit-box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12);box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{-webkit-box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12);box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{-webkit-box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12);box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{-webkit-box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12);box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{-webkit-box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12);box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{-webkit-box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12);box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{-webkit-box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12);box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{-webkit-box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12);box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{-webkit-box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12);box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{-webkit-box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12);box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.mat-elevation-z24{-webkit-box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font-size:11.62px;font-weight:400;font-family:Roboto,"Helvetica Neue",sans-serif;line-height:20px;margin:0 0 12px}.mat-h6,.mat-typography h6{font-size:9.38px;font-weight:400;font-family:Roboto,"Helvetica Neue",sans-serif;line-height:20px;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}.mat-caption,.mat-small{font:400 12px/20px Roboto,"Helvetica Neue",sans-serif}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,"Helvetica Neue",sans-serif;margin:0 0 56px;letter-spacing:-.05em}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px;letter-spacing:-.02em}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px;letter-spacing:-.005em}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500}.mat-button-toggle,.mat-card{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-card-title{font-size:24px;font-weight:400}.mat-card-content,.mat-card-header .mat-card-title,.mat-card-subtitle{font-size:14px}.mat-checkbox{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:13px;line-height:18px}.mat-chip .mat-chip-remove.mat-icon{font-size:18px}.mat-table{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell{font-size:14px}.mat-calendar{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif}.mat-expansion-panel-header{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-form-field{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:inherit;font-weight:400;line-height:1.125}.mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.4375em 0;border-top:.84375em solid transparent}.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333333%}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335333%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.28125em}.mat-form-field-underline{bottom:1.25em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.54166667em;top:calc(100% - 1.66666667em)}.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px}.mat-radio-button,.mat-select{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-slider-thumb-label-text{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px;font-weight:500}.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-tab-label,.mat-tab-link{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0}.mat-tooltip{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-list-item,.mat-list-option{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-list .mat-list-item,.mat-nav-list .mat-list-item,.mat-selection-list .mat-list-item{font-size:16px}.mat-list .mat-list-item .mat-line,.mat-nav-list .mat-list-item .mat-line,.mat-selection-list .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list .mat-list-option,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-option{font-size:16px}.mat-list .mat-list-option .mat-line,.mat-nav-list .mat-list-option .mat-line,.mat-selection-list .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list[dense] .mat-list-item,.mat-nav-list[dense] .mat-list-item,.mat-selection-list[dense] .mat-list-item{font-size:12px}.mat-list[dense] .mat-list-item .mat-line,.mat-nav-list[dense] .mat-list-item .mat-line,.mat-selection-list[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-list[dense] .mat-list-option,.mat-nav-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option,.mat-selection-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option{font-size:12px}.mat-list[dense] .mat-list-option .mat-line,.mat-nav-list[dense] .mat-list-option .mat-line,.mat-selection-list[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list[dense] .mat-subheader,.mat-nav-list[dense] .mat-subheader,.mat-selection-list[dense] .mat-subheader{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-simple-snackbar{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-ripple{overflow:hidden}@media screen and (-ms-high-contrast:active){.mat-ripple{display:none}.mat-option-ripple{opacity:.5}}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;-webkit-transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1),-webkit-transform 0s cubic-bezier(0,0,.2,1);-webkit-transform:scale(0);transform:scale(0)}.mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative;cursor:pointer;outline:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;max-width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:rgba(0,0,0,.87)}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.mat-option-text{display:inline-block;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}.mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:rgba(0,0,0,.54)}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;-webkit-transition:opacity .4s cubic-bezier(.25,.8,.25,1);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.6)}.cdk-overlay-transparent-backdrop{background:0 0}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#0072ff}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox::after{color:#fafafa}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ffc125}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#0072ff}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa}.mat-theme-loaded-marker{display:none}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.mat-button,.mat-icon-button{background:0 0}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(0,114,255,.12)}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(255,193,37,.12)}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.mat-button[disabled] .mat-button-focus-overlay,.mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary{color:#0072ff}.mat-button.mat-accent,.mat-icon-button.mat-accent{color:#ffc125}.mat-button.mat-warn,.mat-icon-button.mat-warn{color:#f44336}.mat-button.mat-accent[disabled],.mat-button.mat-primary[disabled],.mat-button.mat-warn[disabled],.mat-button[disabled][disabled],.mat-icon-button.mat-accent[disabled],.mat-icon-button.mat-primary[disabled],.mat-icon-button.mat-warn[disabled],.mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.mat-fab,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.mat-fab.mat-accent,.mat-fab.mat-primary,.mat-fab.mat-warn,.mat-mini-fab.mat-accent,.mat-mini-fab.mat-primary,.mat-mini-fab.mat-warn,.mat-raised-button.mat-accent,.mat-raised-button.mat-primary,.mat-raised-button.mat-warn{color:#fff}.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.mat-fab.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#0072ff}.mat-fab.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ffc125}.mat-fab.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}.mat-fab.mat-accent .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.mat-button.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.1)}.mat-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.1)}.mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.2)}.mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.2)}.mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.mat-button-toggle{color:rgba(0,0,0,.38)}.mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-card{background:#fff;color:rgba(0,0,0,.87)}.mat-card-subtitle{color:rgba(0,0,0,.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa!important}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#0072ff}.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(0,114,255,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-primary{background-color:#0072ff;color:#fff}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.mat-table{background:#fff}.mat-header-row,.mat-row{border-bottom-color:rgba(0,0,0,.12)}.mat-header-cell{color:rgba(0,0,0,.54)}.mat-cell{color:rgba(0,0,0,.87)}.mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.mat-calendar-next-button,.mat-calendar-previous-button{color:rgba(0,0,0,.54)}.mat-calendar-table-header{color:rgba(0,0,0,.38)}.mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.mat-calendar-body-label{color:rgba(0,0,0,.54)}.mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.mat-calendar-body-selected{background-color:#0072ff;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(0,114,255,.4)}.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.mat-dialog-container,.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-action-row{border-top-color:rgba(0,0,0,.12)}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.mat-expansion-indicator::after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.mat-form-field-label,.mat-hint{color:rgba(0,0,0,.54)}.mat-focused .mat-form-field-label{color:#0072ff}.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.mat-focused .mat-form-field-required-marker{color:#ffc125}.mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.mat-form-field-ripple{background-color:#0072ff}.mat-form-field-ripple.mat-accent{background-color:#ffc125}.mat-form-field-ripple.mat-warn{background-color:#f44336}.mat-form-field-invalid .mat-form-field-label,.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.mat-error{color:#f44336}.mat-icon.mat-primary{color:#0072ff}.mat-icon.mat-accent{color:#ffc125}.mat-icon.mat-warn{color:#f44336}.mat-input-element:disabled{color:rgba(0,0,0,.38)}.mat-input-element{caret-color:#0072ff}.mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-accent .mat-input-element{caret-color:#ffc125}.mat-form-field-invalid .mat-input-element,.mat-warn .mat-input-element{caret-color:#f44336}.mat-list .mat-list-item,.mat-list .mat-list-option,.mat-nav-list .mat-list-item,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-item,.mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.mat-list .mat-subheader,.mat-nav-list .mat-subheader,.mat-selection-list .mat-subheader{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500;color:rgba(0,0,0,.54)}.mat-list-item-disabled{background-color:#eee}.mat-divider{border-top-color:rgba(0,0,0,.12)}.mat-nav-list .mat-list-item{outline:0}.mat-nav-list .mat-list-item.mat-list-item-focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.mat-list-option{outline:0}.mat-list-option.mat-list-item-focus,.mat-list-option:hover{background:rgba(0,0,0,.04)}.mat-menu-panel{background:#fff}.mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.mat-menu-item .mat-icon:not([color]),.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.mat-menu-item-highlighted:not([disabled]),.mat-menu-item:focus:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%2300c3ff%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar-buffer{background-color:#00c3ff}.mat-progress-bar-fill::after{background-color:#0072ff}.mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffc125%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-accent .mat-progress-bar-buffer,.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ffc125}.mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.mat-progress-spinner circle,.mat-spinner circle{stroke:#0072ff}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ffc125}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#0072ff}.mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#0072ff}.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,114,255,.26)}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ffc125}.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-select-content,.mat-select-panel-done-animating{background:#fff}.mat-select-value{color:rgba(0,0,0,.87)}.mat-select-placeholder{color:rgba(0,0,0,.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.mat-select-arrow{color:rgba(0,0,0,.54)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#0072ff}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ffc125}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,193,37,.5)}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle .mat-ripple-element{background-color:rgba(255,193,37,.12)}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#0072ff}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(0,114,255,.5)}.mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.12)}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.mat-slide-toggle-thumb{background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#0072ff}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ffc125}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.mat-step-header .mat-step-icon{background-color:#0072ff;color:#fff}.mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#fff}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label:focus,.mat-tab-group.mat-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#0072ff}.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label:focus,.mat-tab-group.mat-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label:focus,.mat-tab-group.mat-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label:focus,.mat-tab-group.mat-background-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#0072ff}.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-accent .mat-tab-label:focus,.mat-tab-group.mat-background-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-warn .mat-tab-label:focus,.mat-tab-group.mat-background-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.mat-toolbar.mat-primary{background:#0072ff;color:#fff}.mat-toolbar.mat-accent{background:#ffc125;color:#fff}.mat-toolbar.mat-warn{background:#f44336;color:#fff}.mat-tooltip{background:rgba(97,97,97,.9)}.mat-snack-bar-container{background:#323232;color:#fff}.mat-simple-snackbar-action{color:#ffc125}.select-address-theme .mat-ripple-element{background-color:rgba(0,0,0,.1)}.select-address-theme .mat-option{color:rgba(0,0,0,.87)}.select-address-theme .mat-option:focus:not(.mat-option-disabled),.select-address-theme .mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .select-address-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#ddd}.mat-accent .select-address-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .select-address-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.select-address-theme .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.select-address-theme .mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.select-address-theme .mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.select-address-theme .mat-optgroup-label{color:rgba(0,0,0,.54)}.select-address-theme .mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.select-address-theme .mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.select-address-theme .mat-pseudo-checkbox::after{color:#fafafa}.select-address-theme .mat-accent .mat-pseudo-checkbox-checked,.select-address-theme .mat-accent .mat-pseudo-checkbox-indeterminate,.select-address-theme .mat-pseudo-checkbox-checked,.select-address-theme .mat-pseudo-checkbox-indeterminate{background:#ffc125}.select-address-theme .mat-primary .mat-pseudo-checkbox-checked,.select-address-theme .mat-primary .mat-pseudo-checkbox-indeterminate{background:#ddd}.select-address-theme .mat-warn .mat-pseudo-checkbox-checked,.select-address-theme .mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.select-address-theme .mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.select-address-theme .mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.select-address-theme .mat-app-background{background-color:#fafafa}.select-address-theme .mat-theme-loaded-marker{display:none}.select-address-theme .mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.select-address-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.select-address-theme .mat-button,.select-address-theme .mat-icon-button{background:0 0}.select-address-theme .mat-button.mat-primary .mat-button-focus-overlay,.select-address-theme .mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(221,221,221,.12)}.select-address-theme .mat-button.mat-accent .mat-button-focus-overlay,.select-address-theme .mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(255,193,37,.12)}.select-address-theme .mat-button.mat-warn .mat-button-focus-overlay,.select-address-theme .mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.select-address-theme .mat-button[disabled] .mat-button-focus-overlay,.select-address-theme .mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.select-address-theme .mat-button.mat-primary,.select-address-theme .mat-icon-button.mat-primary{color:#ddd}.select-address-theme .mat-button.mat-accent,.select-address-theme .mat-icon-button.mat-accent{color:#ffc125}.select-address-theme .mat-button.mat-warn,.select-address-theme .mat-icon-button.mat-warn{color:#f44336}.select-address-theme .mat-button.mat-accent[disabled],.select-address-theme .mat-button.mat-primary[disabled],.select-address-theme .mat-button.mat-warn[disabled],.select-address-theme .mat-button[disabled][disabled],.select-address-theme .mat-icon-button.mat-accent[disabled],.select-address-theme .mat-icon-button.mat-primary[disabled],.select-address-theme .mat-icon-button.mat-warn[disabled],.select-address-theme .mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.select-address-theme .mat-fab,.select-address-theme .mat-mini-fab,.select-address-theme .mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.select-address-theme .mat-fab.mat-primary,.select-address-theme .mat-mini-fab.mat-primary,.select-address-theme .mat-raised-button.mat-primary{color:#ddd;background-color:#ddd}.select-address-theme .mat-fab.mat-accent,.select-address-theme .mat-fab.mat-warn,.select-address-theme .mat-mini-fab.mat-accent,.select-address-theme .mat-mini-fab.mat-warn,.select-address-theme .mat-raised-button.mat-accent,.select-address-theme .mat-raised-button.mat-warn{color:#fff}.select-address-theme .mat-fab.mat-accent[disabled],.select-address-theme .mat-fab.mat-primary[disabled],.select-address-theme .mat-fab.mat-warn[disabled],.select-address-theme .mat-fab[disabled][disabled],.select-address-theme .mat-mini-fab.mat-accent[disabled],.select-address-theme .mat-mini-fab.mat-primary[disabled],.select-address-theme .mat-mini-fab.mat-warn[disabled],.select-address-theme .mat-mini-fab[disabled][disabled],.select-address-theme .mat-raised-button.mat-accent[disabled],.select-address-theme .mat-raised-button.mat-primary[disabled],.select-address-theme .mat-raised-button.mat-warn[disabled],.select-address-theme .mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.select-address-theme .mat-fab.mat-accent,.select-address-theme .mat-mini-fab.mat-accent,.select-address-theme .mat-raised-button.mat-accent{background-color:#ffc125}.select-address-theme .mat-fab.mat-warn,.select-address-theme .mat-mini-fab.mat-warn,.select-address-theme .mat-raised-button.mat-warn{background-color:#f44336}.select-address-theme .mat-fab.mat-primary .mat-ripple-element,.select-address-theme .mat-mini-fab.mat-primary .mat-ripple-element,.select-address-theme .mat-raised-button.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.2)}.select-address-theme .mat-fab.mat-accent .mat-ripple-element,.select-address-theme .mat-fab.mat-warn .mat-ripple-element,.select-address-theme .mat-mini-fab.mat-accent .mat-ripple-element,.select-address-theme .mat-mini-fab.mat-warn .mat-ripple-element,.select-address-theme .mat-raised-button.mat-accent .mat-ripple-element,.select-address-theme .mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.select-address-theme .mat-button.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.1)}.select-address-theme .mat-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.1)}.select-address-theme .mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.select-address-theme .mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.2)}.select-address-theme .mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.2)}.select-address-theme .mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.select-address-theme .mat-button-toggle{color:rgba(0,0,0,.38)}.select-address-theme .mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.select-address-theme .mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.select-address-theme .mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.select-address-theme .mat-card{background:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-card-subtitle{color:rgba(0,0,0,.54)}.select-address-theme .mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.select-address-theme .mat-checkbox-checkmark{fill:#fafafa}.select-address-theme .mat-checkbox-checkmark-path{stroke:#fafafa!important}.select-address-theme .mat-checkbox-mixedmark{background-color:#fafafa}.select-address-theme .mat-checkbox-checked.mat-primary .mat-checkbox-background,.select-address-theme .mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#ddd}.select-address-theme .mat-checkbox-checked.mat-accent .mat-checkbox-background,.select-address-theme .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.select-address-theme .mat-checkbox-checked.mat-warn .mat-checkbox-background,.select-address-theme .mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.select-address-theme .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.select-address-theme .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.select-address-theme .mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.select-address-theme .mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.select-address-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(221,221,221,.26)}.select-address-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.select-address-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.select-address-theme .mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.select-address-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.select-address-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-chip.mat-chip-selected.mat-primary{background-color:#ddd;color:#ddd}.select-address-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#ddd;opacity:.4}.select-address-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.select-address-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.select-address-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.select-address-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.select-address-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-table{background:#fff}.select-address-theme .mat-header-row,.select-address-theme .mat-row{border-bottom-color:rgba(0,0,0,.12)}.select-address-theme .mat-header-cell{color:rgba(0,0,0,.54)}.select-address-theme .mat-cell{color:rgba(0,0,0,.87)}.select-address-theme .mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.select-address-theme .mat-calendar-next-button,.select-address-theme .mat-calendar-previous-button{color:rgba(0,0,0,.54)}.select-address-theme .mat-calendar-table-header{color:rgba(0,0,0,.38)}.select-address-theme .mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.select-address-theme .mat-calendar-body-label{color:rgba(0,0,0,.54)}.select-address-theme .mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.select-address-theme .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.select-address-theme .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.select-address-theme .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.select-address-theme :not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.select-address-theme .mat-calendar-body-selected{background-color:#ddd;color:#ddd}.select-address-theme .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(221,221,221,.4)}.select-address-theme .mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.select-address-theme .mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #ddd;box-shadow:inset 0 0 0 1px #ddd}.select-address-theme .mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.select-address-theme .mat-dialog-container,.select-address-theme .mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-action-row{border-top-color:rgba(0,0,0,.12)}.select-address-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.select-address-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.select-address-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.select-address-theme .mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.select-address-theme .mat-expansion-indicator::after,.select-address-theme .mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.select-address-theme .mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.select-address-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.select-address-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.select-address-theme .mat-form-field-label,.select-address-theme .mat-hint{color:rgba(0,0,0,.54)}.select-address-theme .mat-focused .mat-form-field-label{color:#ddd}.select-address-theme .mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.select-address-theme .mat-focused .mat-form-field-label.mat-warn{color:#f44336}.select-address-theme .mat-focused .mat-form-field-required-marker{color:#ffc125}.select-address-theme .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.select-address-theme .mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.select-address-theme .mat-form-field-ripple{background-color:#ddd}.select-address-theme .mat-form-field-ripple.mat-accent{background-color:#ffc125}.select-address-theme .mat-form-field-ripple.mat-warn{background-color:#f44336}.select-address-theme .mat-form-field-invalid .mat-form-field-label,.select-address-theme .mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.select-address-theme .mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.select-address-theme .mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.select-address-theme .mat-error{color:#f44336}.select-address-theme .mat-icon.mat-primary{color:#ddd}.select-address-theme .mat-icon.mat-accent{color:#ffc125}.select-address-theme .mat-icon.mat-warn{color:#f44336}.select-address-theme .mat-input-element:disabled{color:rgba(0,0,0,.38)}.select-address-theme .mat-input-element{caret-color:#ddd}.select-address-theme .mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element::placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-accent .mat-input-element{caret-color:#ffc125}.select-address-theme .mat-form-field-invalid .mat-input-element,.select-address-theme .mat-warn .mat-input-element{caret-color:#f44336}.select-address-theme .mat-list .mat-list-item,.select-address-theme .mat-list .mat-list-option,.select-address-theme .mat-nav-list .mat-list-item,.select-address-theme .mat-nav-list .mat-list-option,.select-address-theme .mat-selection-list .mat-list-item,.select-address-theme .mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.select-address-theme .mat-list .mat-subheader,.select-address-theme .mat-nav-list .mat-subheader,.select-address-theme .mat-selection-list .mat-subheader{color:rgba(0,0,0,.54)}.select-address-theme .mat-list-item-disabled{background-color:#eee}.select-address-theme .mat-divider{border-top-color:rgba(0,0,0,.12)}.select-address-theme .mat-nav-list .mat-list-item{outline:0}.select-address-theme .mat-nav-list .mat-list-item.mat-list-item-focus,.select-address-theme .mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.select-address-theme .mat-list-option{outline:0}.select-address-theme .mat-list-option.mat-list-item-focus,.select-address-theme .mat-list-option:hover{background:rgba(0,0,0,.04)}.select-address-theme .mat-menu-panel{background:#fff}.select-address-theme .mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.select-address-theme .mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.select-address-theme .mat-menu-item .mat-icon:not([color]),.select-address-theme .mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.select-address-theme .mat-menu-item-highlighted:not([disabled]),.select-address-theme .mat-menu-item:focus:not([disabled]),.select-address-theme .mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.select-address-theme .mat-paginator{background:#fff}.select-address-theme .mat-paginator,.select-address-theme .mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.select-address-theme .mat-paginator-decrement,.select-address-theme .mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.select-address-theme .mat-icon-button[disabled] .mat-paginator-decrement,.select-address-theme .mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23dddddd%27%2F%3E%3C%2Fsvg%3E")}.select-address-theme .mat-progress-bar-buffer,.select-address-theme .mat-progress-bar-fill::after{background-color:#ddd}.select-address-theme .mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffc125%27%2F%3E%3C%2Fsvg%3E")}.select-address-theme .mat-progress-bar.mat-accent .mat-progress-bar-buffer,.select-address-theme .mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ffc125}.select-address-theme .mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.select-address-theme .mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.select-address-theme .mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.select-address-theme .mat-progress-spinner circle,.select-address-theme .mat-spinner circle{stroke:#ddd}.select-address-theme .mat-progress-spinner.mat-accent circle,.select-address-theme .mat-spinner.mat-accent circle{stroke:#ffc125}.select-address-theme .mat-progress-spinner.mat-warn circle,.select-address-theme .mat-spinner.mat-warn circle{stroke:#f44336}.select-address-theme .mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.select-address-theme .mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-radio-disabled .mat-radio-inner-circle,.select-address-theme .mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.select-address-theme .mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.select-address-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#ddd}.select-address-theme .mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#ddd}.select-address-theme .mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(221,221,221,.26)}.select-address-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.select-address-theme .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ffc125}.select-address-theme .mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.select-address-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.select-address-theme .mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.select-address-theme .mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.select-address-theme .mat-select-content,.select-address-theme .mat-select-panel-done-animating{background:#fff}.select-address-theme .mat-select-value{color:rgba(0,0,0,.87)}.select-address-theme .mat-select-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.select-address-theme .mat-select-arrow{color:rgba(0,0,0,.54)}.select-address-theme .mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.select-address-theme .mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#ddd}.select-address-theme .mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.select-address-theme .mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.select-address-theme .mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.select-address-theme .mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.select-address-theme .mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.select-address-theme .mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-drawer.mat-drawer-push{background-color:#fff}.select-address-theme .mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.select-address-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ffc125}.select-address-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,193,37,.5)}.select-address-theme .mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-slide-toggle .mat-ripple-element{background-color:rgba(255,193,37,.12)}.select-address-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ddd}.select-address-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(221,221,221,.5)}.select-address-theme .mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.12)}.select-address-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.select-address-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.select-address-theme .mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.select-address-theme .mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.select-address-theme .mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.select-address-theme .mat-slide-toggle-thumb{background-color:#fafafa}.select-address-theme .mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.select-address-theme .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.select-address-theme .mat-primary .mat-slider-thumb,.select-address-theme .mat-primary .mat-slider-thumb-label,.select-address-theme .mat-primary .mat-slider-track-fill{background-color:#ddd}.select-address-theme .mat-primary .mat-slider-thumb-label-text{color:#ddd}.select-address-theme .mat-accent .mat-slider-thumb,.select-address-theme .mat-accent .mat-slider-thumb-label,.select-address-theme .mat-accent .mat-slider-track-fill{background-color:#ffc125}.select-address-theme .mat-accent .mat-slider-thumb-label-text{color:#fff}.select-address-theme .mat-warn .mat-slider-thumb,.select-address-theme .mat-warn .mat-slider-thumb-label,.select-address-theme .mat-warn .mat-slider-track-fill{background-color:#f44336}.select-address-theme .mat-warn .mat-slider-thumb-label-text{color:#fff}.select-address-theme .mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.select-address-theme .cdk-focused .mat-slider-track-background,.select-address-theme .mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.select-address-theme .mat-slider-disabled .mat-slider-thumb,.select-address-theme .mat-slider-disabled .mat-slider-track-background,.select-address-theme .mat-slider-disabled .mat-slider-track-fill,.select-address-theme .mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.select-address-theme .mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.select-address-theme .mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.select-address-theme .mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.select-address-theme .mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.select-address-theme .mat-step-header.cdk-keyboard-focused,.select-address-theme .mat-step-header.cdk-program-focused,.select-address-theme .mat-step-header:hover{background-color:rgba(0,0,0,.04)}.select-address-theme .mat-step-header .mat-step-label,.select-address-theme .mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.select-address-theme .mat-step-header .mat-step-icon{background-color:#ddd;color:#ddd}.select-address-theme .mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#ddd}.select-address-theme .mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.select-address-theme .mat-stepper-horizontal,.select-address-theme .mat-stepper-vertical{background-color:#fff}.select-address-theme .mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.select-address-theme .mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.select-address-theme .mat-tab-header,.select-address-theme .mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.select-address-theme .mat-tab-group-inverted-header .mat-tab-header,.select-address-theme .mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.select-address-theme .mat-tab-label,.select-address-theme .mat-tab-link{color:rgba(0,0,0,.87)}.select-address-theme .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.select-address-theme .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.select-address-theme .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-tab-group[class*=mat-background-] .mat-tab-header,.select-address-theme .mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.select-address-theme .mat-tab-group.mat-primary .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-primary .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(221,221,221,.3)}.select-address-theme .mat-tab-group.mat-primary .mat-ink-bar,.select-address-theme .mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-primary .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#ddd}.select-address-theme .mat-tab-group.mat-accent .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-accent .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.select-address-theme .mat-tab-group.mat-accent .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.select-address-theme .mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.select-address-theme .mat-tab-group.mat-warn .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-warn .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.select-address-theme .mat-tab-group.mat-warn .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.select-address-theme .mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(221,221,221,.3)}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-header,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-links,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#ddd}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-label,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-link,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#ddd}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(221,221,221,.4)}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#ddd}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(221,221,221,.4)}.select-address-theme .mat-tab-group.mat-background-primary .mat-ripple-element,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(221,221,221,.12)}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-header,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-links,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-label,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-link,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-accent .mat-ripple-element,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,.12)}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-header,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-links,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-label,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-link,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-warn .mat-ripple-element,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.select-address-theme .mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.select-address-theme .mat-toolbar.mat-primary{background:#ddd;color:#ddd}.select-address-theme .mat-toolbar.mat-accent{background:#ffc125;color:#fff}.select-address-theme .mat-toolbar.mat-warn{background:#f44336;color:#fff}.select-address-theme .mat-tooltip{background:rgba(97,97,97,.9)}.select-address-theme .mat-snack-bar-container{background:#323232;color:#fff}.select-address-theme .mat-simple-snackbar-action{color:#ffc125}.subtle-theme .mat-ripple-element{background-color:rgba(0,0,0,.1)}.subtle-theme .mat-option{color:rgba(0,0,0,.87)}.subtle-theme .mat-option:focus:not(.mat-option-disabled),.subtle-theme .mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .subtle-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#fff}.mat-accent .subtle-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#ccc}.mat-warn .subtle-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.subtle-theme .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.subtle-theme .mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.subtle-theme .mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.subtle-theme .mat-optgroup-label{color:rgba(0,0,0,.54)}.subtle-theme .mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.subtle-theme .mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.subtle-theme .mat-pseudo-checkbox::after{color:#fafafa}.subtle-theme .mat-accent .mat-pseudo-checkbox-checked,.subtle-theme .mat-accent .mat-pseudo-checkbox-indeterminate,.subtle-theme .mat-pseudo-checkbox-checked,.subtle-theme .mat-pseudo-checkbox-indeterminate{background:#ccc}.subtle-theme .mat-primary .mat-pseudo-checkbox-checked,.subtle-theme .mat-primary .mat-pseudo-checkbox-indeterminate{background:#fff}.subtle-theme .mat-warn .mat-pseudo-checkbox-checked,.subtle-theme .mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.subtle-theme .mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.subtle-theme .mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.subtle-theme .mat-app-background{background-color:#fafafa}.subtle-theme .mat-theme-loaded-marker{display:none}.subtle-theme .mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.subtle-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.subtle-theme .mat-button,.subtle-theme .mat-icon-button{background:0 0}.subtle-theme .mat-button.mat-primary .mat-button-focus-overlay,.subtle-theme .mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-button.mat-accent .mat-button-focus-overlay,.subtle-theme .mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(204,204,204,.12)}.subtle-theme .mat-button.mat-warn .mat-button-focus-overlay,.subtle-theme .mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.subtle-theme .mat-button[disabled] .mat-button-focus-overlay,.subtle-theme .mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.subtle-theme .mat-button.mat-primary,.subtle-theme .mat-icon-button.mat-primary{color:#fff}.subtle-theme .mat-button.mat-accent,.subtle-theme .mat-icon-button.mat-accent{color:#ccc}.subtle-theme .mat-button.mat-warn,.subtle-theme .mat-icon-button.mat-warn{color:#f44336}.subtle-theme .mat-button.mat-accent[disabled],.subtle-theme .mat-button.mat-primary[disabled],.subtle-theme .mat-button.mat-warn[disabled],.subtle-theme .mat-button[disabled][disabled],.subtle-theme .mat-icon-button.mat-accent[disabled],.subtle-theme .mat-icon-button.mat-primary[disabled],.subtle-theme .mat-icon-button.mat-warn[disabled],.subtle-theme .mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.subtle-theme .mat-fab,.subtle-theme .mat-mini-fab,.subtle-theme .mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.subtle-theme .mat-fab.mat-primary,.subtle-theme .mat-mini-fab.mat-primary,.subtle-theme .mat-raised-button.mat-primary{color:#fff;background-color:#fff}.subtle-theme .mat-fab.mat-accent,.subtle-theme .mat-mini-fab.mat-accent,.subtle-theme .mat-raised-button.mat-accent{color:#ccc;background-color:#ccc}.subtle-theme .mat-fab.mat-warn,.subtle-theme .mat-mini-fab.mat-warn,.subtle-theme .mat-raised-button.mat-warn{color:#fff;background-color:#f44336}.subtle-theme .mat-fab.mat-accent[disabled],.subtle-theme .mat-fab.mat-primary[disabled],.subtle-theme .mat-fab.mat-warn[disabled],.subtle-theme .mat-fab[disabled][disabled],.subtle-theme .mat-mini-fab.mat-accent[disabled],.subtle-theme .mat-mini-fab.mat-primary[disabled],.subtle-theme .mat-mini-fab.mat-warn[disabled],.subtle-theme .mat-mini-fab[disabled][disabled],.subtle-theme .mat-raised-button.mat-accent[disabled],.subtle-theme .mat-raised-button.mat-primary[disabled],.subtle-theme .mat-raised-button.mat-warn[disabled],.subtle-theme .mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.subtle-theme .mat-fab.mat-primary .mat-ripple-element,.subtle-theme .mat-mini-fab.mat-primary .mat-ripple-element,.subtle-theme .mat-raised-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.2)}.subtle-theme .mat-fab.mat-accent .mat-ripple-element,.subtle-theme .mat-mini-fab.mat-accent .mat-ripple-element,.subtle-theme .mat-raised-button.mat-accent .mat-ripple-element{background-color:rgba(204,204,204,.2)}.subtle-theme .mat-fab.mat-warn .mat-ripple-element,.subtle-theme .mat-mini-fab.mat-warn .mat-ripple-element,.subtle-theme .mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.subtle-theme .mat-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.1)}.subtle-theme .mat-button.mat-accent .mat-ripple-element{background-color:rgba(204,204,204,.1)}.subtle-theme .mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.subtle-theme .mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.2)}.subtle-theme .mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(204,204,204,.2)}.subtle-theme .mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.subtle-theme .mat-button-toggle{color:rgba(0,0,0,.38)}.subtle-theme .mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.subtle-theme .mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.subtle-theme .mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.subtle-theme .mat-card{background:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-card-subtitle{color:rgba(0,0,0,.54)}.subtle-theme .mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.subtle-theme .mat-checkbox-checkmark{fill:#fafafa}.subtle-theme .mat-checkbox-checkmark-path{stroke:#fafafa!important}.subtle-theme .mat-checkbox-mixedmark{background-color:#fafafa}.subtle-theme .mat-checkbox-checked.mat-primary .mat-checkbox-background,.subtle-theme .mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#fff}.subtle-theme .mat-checkbox-checked.mat-accent .mat-checkbox-background,.subtle-theme .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ccc}.subtle-theme .mat-checkbox-checked.mat-warn .mat-checkbox-background,.subtle-theme .mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.subtle-theme .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.subtle-theme .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.subtle-theme .mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.subtle-theme .mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.subtle-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,255,255,.26)}.subtle-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(204,204,204,.26)}.subtle-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.subtle-theme .mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.subtle-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.subtle-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-chip.mat-chip-selected.mat-primary{background-color:#fff;color:#fff}.subtle-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.subtle-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.subtle-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.subtle-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-chip.mat-chip-selected.mat-accent{background-color:#ccc;color:#ccc}.subtle-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#ccc;opacity:.4}.subtle-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-table{background:#fff}.subtle-theme .mat-header-row,.subtle-theme .mat-row{border-bottom-color:rgba(0,0,0,.12)}.subtle-theme .mat-header-cell{color:rgba(0,0,0,.54)}.subtle-theme .mat-cell{color:rgba(0,0,0,.87)}.subtle-theme .mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.subtle-theme .mat-calendar-next-button,.subtle-theme .mat-calendar-previous-button{color:rgba(0,0,0,.54)}.subtle-theme .mat-calendar-table-header{color:rgba(0,0,0,.38)}.subtle-theme .mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.subtle-theme .mat-calendar-body-label{color:rgba(0,0,0,.54)}.subtle-theme .mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.subtle-theme .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.subtle-theme .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.subtle-theme .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.subtle-theme :not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.subtle-theme .mat-calendar-body-selected{background-color:#fff;color:#fff}.subtle-theme .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,255,255,.4)}.subtle-theme .mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.subtle-theme .mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.subtle-theme .mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.subtle-theme .mat-dialog-container,.subtle-theme .mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-action-row{border-top-color:rgba(0,0,0,.12)}.subtle-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.subtle-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.subtle-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.subtle-theme .mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.subtle-theme .mat-expansion-indicator::after,.subtle-theme .mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.subtle-theme .mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.subtle-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.subtle-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.subtle-theme .mat-form-field-label,.subtle-theme .mat-hint{color:rgba(0,0,0,.54)}.subtle-theme .mat-focused .mat-form-field-label{color:#fff}.subtle-theme .mat-focused .mat-form-field-label.mat-accent{color:#ccc}.subtle-theme .mat-focused .mat-form-field-label.mat-warn{color:#f44336}.subtle-theme .mat-focused .mat-form-field-required-marker{color:#ccc}.subtle-theme .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.subtle-theme .mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.subtle-theme .mat-form-field-ripple{background-color:#fff}.subtle-theme .mat-form-field-ripple.mat-accent{background-color:#ccc}.subtle-theme .mat-form-field-ripple.mat-warn{background-color:#f44336}.subtle-theme .mat-form-field-invalid .mat-form-field-label,.subtle-theme .mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.subtle-theme .mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.subtle-theme .mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.subtle-theme .mat-error{color:#f44336}.subtle-theme .mat-icon.mat-primary{color:#fff}.subtle-theme .mat-icon.mat-accent{color:#ccc}.subtle-theme .mat-icon.mat-warn{color:#f44336}.subtle-theme .mat-input-element:disabled{color:rgba(0,0,0,.38)}.subtle-theme .mat-input-element{caret-color:#fff}.subtle-theme .mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element::placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-accent .mat-input-element{caret-color:#ccc}.subtle-theme .mat-form-field-invalid .mat-input-element,.subtle-theme .mat-warn .mat-input-element{caret-color:#f44336}.subtle-theme .mat-list .mat-list-item,.subtle-theme .mat-list .mat-list-option,.subtle-theme .mat-nav-list .mat-list-item,.subtle-theme .mat-nav-list .mat-list-option,.subtle-theme .mat-selection-list .mat-list-item,.subtle-theme .mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.subtle-theme .mat-list .mat-subheader,.subtle-theme .mat-nav-list .mat-subheader,.subtle-theme .mat-selection-list .mat-subheader{color:rgba(0,0,0,.54)}.subtle-theme .mat-list-item-disabled{background-color:#eee}.subtle-theme .mat-divider{border-top-color:rgba(0,0,0,.12)}.subtle-theme .mat-nav-list .mat-list-item{outline:0}.subtle-theme .mat-nav-list .mat-list-item.mat-list-item-focus,.subtle-theme .mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.subtle-theme .mat-list-option{outline:0}.subtle-theme .mat-list-option.mat-list-item-focus,.subtle-theme .mat-list-option:hover{background:rgba(0,0,0,.04)}.subtle-theme .mat-menu-panel{background:#fff}.subtle-theme .mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.subtle-theme .mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.subtle-theme .mat-menu-item .mat-icon:not([color]),.subtle-theme .mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.subtle-theme .mat-menu-item-highlighted:not([disabled]),.subtle-theme .mat-menu-item:focus:not([disabled]),.subtle-theme .mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.subtle-theme .mat-paginator{background:#fff}.subtle-theme .mat-paginator,.subtle-theme .mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.subtle-theme .mat-paginator-decrement,.subtle-theme .mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.subtle-theme .mat-icon-button[disabled] .mat-paginator-decrement,.subtle-theme .mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27white%27%2F%3E%3C%2Fsvg%3E")}.subtle-theme .mat-progress-bar-buffer,.subtle-theme .mat-progress-bar-fill::after{background-color:#fff}.subtle-theme .mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23cccccc%27%2F%3E%3C%2Fsvg%3E")}.subtle-theme .mat-progress-bar.mat-accent .mat-progress-bar-buffer,.subtle-theme .mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ccc}.subtle-theme .mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.subtle-theme .mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.subtle-theme .mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.subtle-theme .mat-progress-spinner circle,.subtle-theme .mat-spinner circle{stroke:#fff}.subtle-theme .mat-progress-spinner.mat-accent circle,.subtle-theme .mat-spinner.mat-accent circle{stroke:#ccc}.subtle-theme .mat-progress-spinner.mat-warn circle,.subtle-theme .mat-spinner.mat-warn circle{stroke:#f44336}.subtle-theme .mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.subtle-theme .mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-radio-disabled .mat-radio-inner-circle,.subtle-theme .mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.subtle-theme .mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.subtle-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#fff}.subtle-theme .mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#fff}.subtle-theme .mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,255,255,.26)}.subtle-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ccc}.subtle-theme .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ccc}.subtle-theme .mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(204,204,204,.26)}.subtle-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.subtle-theme .mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.subtle-theme .mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.subtle-theme .mat-select-content,.subtle-theme .mat-select-panel-done-animating{background:#fff}.subtle-theme .mat-select-value{color:rgba(0,0,0,.87)}.subtle-theme .mat-select-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.subtle-theme .mat-select-arrow{color:rgba(0,0,0,.54)}.subtle-theme .mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.subtle-theme .mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#fff}.subtle-theme .mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ccc}.subtle-theme .mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.subtle-theme .mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.subtle-theme .mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.subtle-theme .mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.subtle-theme .mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-drawer.mat-drawer-push{background-color:#fff}.subtle-theme .mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.subtle-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ccc}.subtle-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(204,204,204,.5)}.subtle-theme .mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-slide-toggle .mat-ripple-element{background-color:rgba(204,204,204,.12)}.subtle-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#fff}.subtle-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,255,255,.5)}.subtle-theme .mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.subtle-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.subtle-theme .mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.subtle-theme .mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.subtle-theme .mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.subtle-theme .mat-slide-toggle-thumb{background-color:#fafafa}.subtle-theme .mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.subtle-theme .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.subtle-theme .mat-primary .mat-slider-thumb,.subtle-theme .mat-primary .mat-slider-thumb-label,.subtle-theme .mat-primary .mat-slider-track-fill{background-color:#fff}.subtle-theme .mat-primary .mat-slider-thumb-label-text{color:#fff}.subtle-theme .mat-accent .mat-slider-thumb,.subtle-theme .mat-accent .mat-slider-thumb-label,.subtle-theme .mat-accent .mat-slider-track-fill{background-color:#ccc}.subtle-theme .mat-accent .mat-slider-thumb-label-text{color:#ccc}.subtle-theme .mat-warn .mat-slider-thumb,.subtle-theme .mat-warn .mat-slider-thumb-label,.subtle-theme .mat-warn .mat-slider-track-fill{background-color:#f44336}.subtle-theme .mat-warn .mat-slider-thumb-label-text{color:#fff}.subtle-theme .mat-slider-focus-ring{background-color:rgba(204,204,204,.2)}.subtle-theme .cdk-focused .mat-slider-track-background,.subtle-theme .mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.subtle-theme .mat-slider-disabled .mat-slider-thumb,.subtle-theme .mat-slider-disabled .mat-slider-track-background,.subtle-theme .mat-slider-disabled .mat-slider-track-fill,.subtle-theme .mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.subtle-theme .mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.subtle-theme .mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.subtle-theme .mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.subtle-theme .mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.subtle-theme .mat-step-header.cdk-keyboard-focused,.subtle-theme .mat-step-header.cdk-program-focused,.subtle-theme .mat-step-header:hover{background-color:rgba(0,0,0,.04)}.subtle-theme .mat-step-header .mat-step-label,.subtle-theme .mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.subtle-theme .mat-step-header .mat-step-icon{background-color:#fff;color:#fff}.subtle-theme .mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#fff}.subtle-theme .mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.subtle-theme .mat-stepper-horizontal,.subtle-theme .mat-stepper-vertical{background-color:#fff}.subtle-theme .mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.subtle-theme .mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.subtle-theme .mat-tab-header,.subtle-theme .mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.subtle-theme .mat-tab-group-inverted-header .mat-tab-header,.subtle-theme .mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.subtle-theme .mat-tab-label,.subtle-theme .mat-tab-link{color:rgba(0,0,0,.87)}.subtle-theme .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.subtle-theme .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.subtle-theme .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-tab-group[class*=mat-background-] .mat-tab-header,.subtle-theme .mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.subtle-theme .mat-tab-group.mat-primary .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-primary .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(255,255,255,.3)}.subtle-theme .mat-tab-group.mat-primary .mat-ink-bar,.subtle-theme .mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-primary .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.subtle-theme .mat-tab-group.mat-accent .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-accent .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(204,204,204,.3)}.subtle-theme .mat-tab-group.mat-accent .mat-ink-bar,.subtle-theme .mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-accent .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#ccc}.subtle-theme .mat-tab-group.mat-warn .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-warn .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.subtle-theme .mat-tab-group.mat-warn .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.subtle-theme .mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(255,255,255,.3)}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-header,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-links,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-label,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-link,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-primary .mat-ripple-element,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(204,204,204,.3)}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-header,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-links,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ccc}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-label,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-link,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#ccc}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(204,204,204,.4)}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#ccc}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(204,204,204,.4)}.subtle-theme .mat-tab-group.mat-background-accent .mat-ripple-element,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(204,204,204,.12)}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-header,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-links,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-label,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-link,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-warn .mat-ripple-element,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.subtle-theme .mat-toolbar.mat-primary{background:#fff;color:#fff}.subtle-theme .mat-toolbar.mat-accent{background:#ccc;color:#ccc}.subtle-theme .mat-toolbar.mat-warn{background:#f44336;color:#fff}.subtle-theme .mat-tooltip{background:rgba(97,97,97,.9)}.subtle-theme .mat-snack-bar-container{background:#323232;color:#fff}.subtle-theme .mat-simple-snackbar-action{color:#ccc}@font-face{font-family:Skycoin;font-style:normal;font-weight:300;src:url(Skycoin-Light.770b27ec05c2f97a1a27.woff2) format("woff2"),url(Skycoin-Light.4be01e4a68be8bf590da.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:300;src:url(Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2) format("woff2"),url(Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:400;src:url(Skycoin-Regular.21b4caaaedc00594e7bd.woff2) format("woff2"),url(Skycoin-Regular.98d953e74f174cf013b4.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:400;src:url(Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2) format("woff2"),url(Skycoin-RegularItalic.9947360f79b09132fd21.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:700;src:url(Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2) format("woff2"),url(Skycoin-Bold.42363955889f2f20c527.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:700;src:url(Skycoin-BoldItalic.c414dad20c4e3020221c.woff2) format("woff2"),url(Skycoin-BoldItalic.923dce74069362d168fe.woff) format("woff")}a,body,button,div,h1,h2,h3,h4,h5,h6,mat-option.mat-option,mat-panel-description,mat-panel-title,option,p,select,span{font-family:Skycoin,sans-serif}body{background-color:#f7f7f7;margin:0;padding:0;height:100%}header{background:url(header.e11f7c6852766b9319d6.png) center center/cover,linear-gradient(-155deg,#686e96 0,#373b5c 100%);width:100%;height:300px}mat-dialog-container{border-radius:5px!important}.mat-dialog-container{padding:0!important}.header-container{max-width:848px;text-align:center;padding-top:40px;margin-right:auto;margin-left:auto}.header-container h1{font-size:3em;color:#fff}.button-line{margin-top:40px;text-align:right}.datatable-row-group{cursor:pointer}button.active{background-color:rgba(0,0,0,.12)}mat-spinner.in-button .mat-spinner path{stroke:#000;opacity:.3}mat-spinner.in-button{display:inline-block;margin-left:10px}mat-spinner.in-button.small,mat-spinner.in-button.small svg{height:18px!important;width:18px!important}mat-spinner.in-text{display:inline-block;height:12px!important;width:12px!important;margin:0 0 0 7px!important}mat-spinner.in-text svg{height:12px!important;width:12px!important}mat-spinner.in-text svg circle{stroke:#0072ff}snack-bar-container{background-color:rgba(255,0,0,.8)!important}mat-panel-title{width:60%;display:block;-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.sky-container{min-width:100%;min-height:100%}.sky-container.sky-container-grey{background-color:#f7f7f7}.-flex-fill,.flex-fill{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.form-field{margin-bottom:20px}.form-field label{color:#1e2227;display:block;font-size:13px;line-height:20px;margin-bottom:2px}.form-field input{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.form-field .-input-addon{display:-webkit-box;display:-ms-flexbox;display:flex}.form-field .-input-addon input{border-top-right-radius:0;border-bottom-right-radius:0}.form-field .-input-addon span{border:2px;border-radius:0 6px 6px 0;background:#f1f1f1;padding:0 10px;line-height:44px;color:rgba(30,34,39,.5);font-size:14px;-ms-flex-negative:0;flex-shrink:0}.form-field select{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-field textarea{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.primary button.enabled,.primary-gradient-background{background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(#0072ff),to(#00c3ff));background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.primary button.enabled span,.primary-gradient-background span{color:#fff}.primary-color{color:#0072ff}.secondary-color{color:#ffc125}.no-opacity{opacity:1!important}.light-opacity{opacity:.2}.rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}mat-spinner.in-button svg{height:24px!important;width:24px!important}.empty-row{padding:0 1.2rem!important;line-height:50px!important}.alert-box{color:#ff004e;font-size:12px;padding:15px;line-height:1.5;background-color:#ffdede;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:20px}.alert-box .title{font-size:20px}.alert-box mat-icon{margin-top:5px;margin-right:10px;-webkit-animation:1s linear infinite alert-blinking;animation:1s linear infinite alert-blinking}.alert-box mat-checkbox{margin-top:10px;display:inline-block}@-webkit-keyframes alert-blinking{50%{opacity:.2}}@keyframes alert-blinking{50%{opacity:.2}}.onboarding-container{width:100%;height:100%;overflow-x:hidden;background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(#0072ff),to(#00c3ff));background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.onboarding-container .row-container{max-width:450px;width:80%;margin:0 auto}.onboarding-container label{color:#fff}.onboarding-container input{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.onboarding-container select{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%;-webkit-appearance:none}.onboarding-container textarea{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.dark button.enabled{background-color:#171a1d!important}.dark button.enabled span{color:#fff}.ghost button.enabled{background-color:rgba(0,0,0,0)!important}.ghost button.enabled span{color:#000}.-select{position:relative}.-select::after{content:'';display:block;position:absolute;top:0;right:0;background:url(/assets/img/chevron-right-grey.png) 0 0/32px 32px no-repeat;width:32px;height:32px;margin:6px;pointer-events:none;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.mat-menu-panel{border-radius:5px!important;background-color:#fefefe}.mat-menu-panel .mat-menu-item{font-family:Skycoin;line-height:50px}.mat-menu-panel.compact .mat-menu-item{font-size:13px;height:35px;line-height:35px}.qr-code-button{opacity:.6;cursor:pointer}.qr-code-button:hover{opacity:1}.mat-dialog-content{max-height:90vh!important}@media (max-height:600px){.mat-dialog-content{max-height:80vh!important}}.mouse-disabled{pointer-events:none}.coin-selector-container{display:inline-block;margin-left:5px;margin-bottom:5px}.coins-value-label{font-size:10px;margin-top:1px;padding:3px 10px;background-color:#f7f7f7;border-radius:4px}.coins-value-label span{opacity:.5}.coins-value-label .link{color:#0072ff;cursor:pointer;display:inline-block;font-size:11px;margin-bottom:3px;margin-top:-5px}.coins-value-label .centerd-link{width:100%;text-align:center}.red{color:#ff004e}.element-disabled{pointer-events:none;opacity:.5} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e-proxy.config.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e-proxy.config.js new file mode 100644 index 00000000..2c7ad44c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e-proxy.config.js @@ -0,0 +1,14 @@ +const PROXY_CONFIG = { + "/api/*": { + "target": "http://127.0.0.1:46420", + "secure": false, + "logLevel": "debug", + "bypass": function (req) { + req.headers["host"] = '127.0.0.1:46420'; + req.headers["referer"] = 'http://127.0.0.1:46420'; + req.headers["origin"] = 'http://127.0.0.1:46420'; + } + } +}; + +module.exports = PROXY_CONFIG; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.e2e-spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.e2e-spec.ts new file mode 100644 index 00000000..b8d63089 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.e2e-spec.ts @@ -0,0 +1,48 @@ +import { OnboardingCreatePage } from './onboarding.po'; + +describe('Onboarding', () => { + const page = new OnboardingCreatePage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Create Wallet'); + }); + + it('should select language', () => { + expect(page.selectLanguage()).toEqual(true); + }); + + it('should load wallet', () => { + expect(page.loadWallet()).toEqual(true); + }); + + it('should create wallet', () => { + expect(page.createWallet()).toEqual(true); + }); + + it('should show safeguard', () => { + expect(page.getSafeguardIsShown()).toEqual(true); + }); + + it('should hide accepted safeguard', () => { + expect(page.acceptSafeguard()).toEqual(false); + }); + + it('should be able to go back from wallet encryption', () => { + expect(page.goBack()).toEqual('Create Wallet'); + page.createWallet(false); + page.acceptSafeguard(); + }); + + it('should encrypt wallet by default', () => { + expect(page.getEncryptWalletCheckbox().isSelected()).toBeTruthy(); + }); + + it('should be able to continue without encryption', () => { + expect(page.canContinueWithoutEncryption()).toEqual(true); + }); + + it('should encrypt wallet', () => { + expect(page.encryptWallet()).toEqual(true); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.po.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.po.ts new file mode 100644 index 00000000..016a208c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.po.ts @@ -0,0 +1,126 @@ +import { browser, by, element, protractor } from 'protractor'; + +export class OnboardingCreatePage { + navigateTo() { + return browser.get('/#/wizard'); + } + + getHeaderText() { + return element(by.css('.-header span')).getText(); + } + + selectLanguage() { + browser.sleep(1000); + + return element(by.css('.e2e-language-modal')).isPresent().then(languageSelectionIsShown => { + if (!languageSelectionIsShown) { + return true; + } + + return element.all(by.css('.e2e-language-modal .button')).first().click().then(() => { + const el = element(by.css('.e2e-language-modal')); + + return browser.wait(protractor.ExpectedConditions.invisibilityOf(el), 5000).then(() => true); + }); + }); + } + + getSafeguardIsShown() { + return element(by.css('app-onboarding-safeguard')).isPresent(); + } + + acceptSafeguard() { + return element.all(by.css('app-modal .mat-checkbox-label')).first().click().then(() => { + return element(by.buttonText('Continue')).click().then(() => { + return this.getSafeguardIsShown(); + }); + }); + } + + createWallet(goToManualSeedMode = true) { + element(by.buttonText('New')).click(); + + if (goToManualSeedMode) { + element(by.css('.seed-type-button >div')).click(); + element(by.css('.e2e-confirm-checkbox')).click(); + element(by.buttonText('Continue')).click(); + } + + const label = element(by.css('[formcontrolname="label"]')); + const seed = element(by.css('[formcontrolname="seed"]')); + const confirm = element(by.css('[formcontrolname="confirm_seed"]')); + const btnCreate = element(by.buttonText('Create')); + + label.clear(); + label.sendKeys('Test onboarding wallet'); + seed.clear(); + seed.sendKeys('test test'); + confirm.clear(); + confirm.sendKeys('test test'); + + browser.sleep(1000); + const seedValidationCheckBox = element(by.css('.-check')); + seedValidationCheckBox.click(); + + return btnCreate.isEnabled().then(status => { + if (status) { + btnCreate.click(); + } + + return status; + }); + } + + loadWallet() { + element(by.buttonText('Load')).click(); + + element(by.css('.seed-type-button >div')).click(); + element(by.buttonText('Continue')).click(); + + const label = element(by.css('[formcontrolname="label"]')); + const seed = element(by.css('[formcontrolname="seed"]')); + const btnLoad = element(by.buttonText('Create')); + + label.clear(); + label.sendKeys('Test wallet'); + seed.clear(); + seed.sendKeys('test test'); + + browser.sleep(1000); + const seedValidationCheckBox = element(by.css('.-check')); + seedValidationCheckBox.click(); + + return btnLoad.isEnabled(); + } + + goBack() { + return element(by.buttonText('Back')).click().then(() => { + return this.getHeaderText(); + }); + } + + getEncryptWalletCheckbox() { + return element(by.css('.mat-checkbox-input')); + } + + canContinueWithoutEncryption() { + return element(by.css('.mat-checkbox-label')).click().then(() => { + return element(by.buttonText('Finish')).isEnabled(); + }); + } + + encryptWallet() { + const password = element(by.css('[formcontrolname="password"]')); + const confirm = element(by.css('[formcontrolname="confirm"]')); + const button = element(by.buttonText('Finish')); + + return element(by.css('.mat-checkbox-label')).click().then(() => { + password.clear(); + password.sendKeys('password'); + confirm.clear(); + confirm.sendKeys('password'); + + return button.isEnabled(); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.e2e-spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.e2e-spec.ts new file mode 100644 index 00000000..63f70282 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.e2e-spec.ts @@ -0,0 +1,38 @@ +import { SendPage } from './send.po'; + +describe('Send', () => { + const page = new SendPage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Wallets'); + }); + + it('should have wallets', () => { + expect(page.getWalletsCount()).toBeGreaterThan(0); + }); + + it('should have coins in wallets', () => { + expect(page.getWalletsWithCoins().then(w => w.length)).toBeGreaterThan(0); + }); + + it('should have wallets enabled', () => { + expect(page.getValidWallets().then(w => w.length)).toBeGreaterThan(0); + }); + + it('should select valid wallet', () => { + expect(page.selectValidWallet()).toBeTruthy(); + }); + + it('should not be able to send with wrong amount', () => { + expect(page.fillFormWithCoins('615701')).toBeFalsy(); + expect(page.fillFormWithCoins('0')).toBeFalsy(); + expect(page.fillFormWithCoins('-1')).toBeFalsy(); + expect(page.fillFormWithCoins('a')).toBeFalsy(); + }); + + it('should be able to send with correct amount', () => { + expect(page.fillFormWithCoins('615700')).toBeTruthy(); + expect(page.fillFormWithCoins('1')).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.po.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.po.ts new file mode 100644 index 00000000..e1b136df --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.po.ts @@ -0,0 +1,68 @@ +import { browser, by, element } from 'protractor'; + +export class SendPage { + navigateTo() { + return browser.get('/#/send'); + } + + getHeaderText() { + return element(by.css('.title')).getText(); + } + + getWalletsCount() { + return element.all(by.css('#wallet option')).count(); + } + + getWalletsWithCoins() { + return element.all(by.tagName('#wallet option')) + .filter((opt) => { + return opt.getText().then((v) => { + return this.getCoinsFromOptionString(v) > 0; + }); + }); + } + + getValidWallets() { + return element.all(by.tagName('#wallet option')) + .filter((opt) => { + return opt.getText().then((v) => { + return opt.getAttribute('disabled').then(status => { + return status === null && this.getCoinsFromOptionString(v) > 0; + }); + }); + }); + } + + selectValidWallet() { + return this.getValidWallets().then(wallets => { + return wallets[0].click().then(() => { + return true; + }); + }); + } + + fillFormWithCoins(coins: string) { + const dest = element(by.css('[formcontrolname="address"]')); + const amount = element(by.css('[formcontrolname="amount"]')); + const btnSend = element(by.buttonText('Send')); + + dest.clear(); + amount.clear(); + + return dest.sendKeys('2e1erPpaxNVC37PkEv3n8PESNw2DNr5aJNy').then(() => { + return this.getValidWallets().then(wallets => { + return wallets[0].click().then(() => { + return amount.sendKeys(coins).then(() => { + return btnSend.isEnabled(); + }); + }); + }); + }); + } + + private getCoinsFromOptionString(option: string) { + const value = option.slice(option.indexOf('-') + 1, option.indexOf(' SKY')); + + return parseFloat(value); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.e2e-spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.e2e-spec.ts new file mode 100644 index 00000000..0d146955 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.e2e-spec.ts @@ -0,0 +1,22 @@ +import { TransactionsPage } from './transactions.po'; + +describe('Transactions', () => { + const page = new TransactionsPage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Transactions'); + }); + + it('should contain transactions', () => { + expect(page.getTransactionsCount()).toBeGreaterThan(0); + }); + + it('should show transaction detail modal', () => { + expect(page.showTransactionsModal()).toBeTruthy(); + }); + + it('should hide transaction detail modal', () => { + expect(page.hideTransactionModal()).toBeFalsy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.po.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.po.ts new file mode 100644 index 00000000..c0faa277 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.po.ts @@ -0,0 +1,37 @@ +import { browser, by, element, protractor } from 'protractor'; + +export class TransactionsPage { + navigateTo() { + return browser.get('/#/transactions'); + } + + getHeaderText() { + return element(by.css('.title')).getText(); + } + + getTransactions() { + return element.all(by.css('.-transaction')); + } + + getTransactionsCount() { + return this.getTransactions().count(); + } + + getTransactionDetailIsShow() { + return element(by.css('app-transaction-detail')).isPresent(); + } + + showTransactionsModal() { + return this.getTransactions().first().click().then(() => { + return this.getTransactionDetailIsShow(); + }); + } + + hideTransactionModal() { + const el = element(by.css('app-transaction-detail .-header img')); + + return browser.wait(protractor.ExpectedConditions.visibilityOf(el), 5000).then(() => el.click().then(() => { + return this.getTransactionDetailIsShow(); + })); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/tsconfig.e2e.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/tsconfig.e2e.json new file mode 100644 index 00000000..1d9e5edf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/tsconfig.e2e.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.e2e-spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.e2e-spec.ts new file mode 100644 index 00000000..57e84be3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.e2e-spec.ts @@ -0,0 +1,90 @@ +import { WalletsPage } from './wallets.po'; + +describe('Wallets', () => { + const page = new WalletsPage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Wallets'); + }); + + it('should show create wallet', () => { + expect(page.showAddWallet()).toEqual(true); + expect(page.getWalletModalTitle()).toEqual('Create Wallet'); + }); + + it('should validate create wallet, seed mismatch', () => { + expect(page.fillWalletForm('Test', 'seed', 'seed2')).toEqual(false); + }); + + it('should validate create wallet, empty label', () => { + expect(page.fillWalletForm('', 'seed', 'seed', false)).toEqual(false); + }); + + it('should create wallet', () => { + expect(page.fillWalletForm('Test create wallet', 'test create wallet', 'test create wallet', false)).toEqual(true); + page.waitForWalletToBeCreated(); + }); + + it('should show load wallet', () => { + expect(page.showLoadWallet()).toEqual(true); + expect(page.getWalletModalTitle()).toEqual('Load Wallet'); + }); + + it('should validate load wallet, seed', () => { + expect(page.fillWalletForm('Test', '', null)).toEqual(false); + }); + + it('should validate load wallet, empty label', () => { + expect(page.fillWalletForm('', 'seed', null, false)).toEqual(false); + }); + + it('should load wallet', () => { + expect(page.fillWalletForm('Test load wallet', 'test load wallet', null, false)).toEqual(true); + page.waitForWalletToBeCreated(); + }); + + it('should expand wallet', () => { + expect(page.expandWallet()).toEqual(true); + }); + + it('should show wallet QR modal', () => { + expect(page.showQrDialog()).toEqual(true); + }); + + it('should hide wallet QR modal', () => { + expect(page.hideQrDialog()).toEqual(false); + }); + + it('should add address to wallet', () => { + expect(page.addAddress()).toEqual(true); + }); + + it('should hide empty address', () => { + expect(page.getCountOfEmptyAddresses('.-hide-empty')).toEqual(0); + }); + + it('should show empty address', () => { + expect(page.getCountOfEmptyAddresses('.-show-empty')).toBeGreaterThan(0); + }); + + it('should show change wallet name modal', () => { + expect(page.showChangeWalletName()).toEqual(true); + }); + + it('should change wallet name', () => { + expect(page.changeWalletName()).toEqual(true); + }); + + it('should encrypt wallet', () => { + expect(page.canEncrypt()).toEqual(true); + }); + + it('should decrypt wallet', () => { + expect(page.canDecrypt()).toEqual(true); + }); + + it('should display price information', () => { + expect(page.showPriceInformation()).toEqual(true); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.po.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.po.ts new file mode 100644 index 00000000..5d2454cc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.po.ts @@ -0,0 +1,205 @@ +import { browser, by, element, protractor } from 'protractor'; + +export class WalletsPage { + navigateTo() { + return browser.get('/#/wallets'); + } + + getHeaderText() { + return element(by.css('.title')).getText(); + } + + showAddWallet() { + const btnAdd = element(by.buttonText('Add Wallet')); + + return btnAdd.click().then(() => { + return element(by.css('app-create-wallet')).isPresent(); + }); + } + + showLoadWallet() { + const btnLoad = element(by.buttonText('Load Wallet')); + + return btnLoad.click().then(() => { + return element(by.css('app-create-wallet')).isPresent(); + }); + } + + getWalletModalTitle() { + return element(by.css('app-create-wallet .-header')).getText(); + } + + fillWalletForm(label: string, seed: string, confirm: string|null, goToManualSeedMode = true) { + + if (goToManualSeedMode) { + element(by.css('.seed-type-button >div')).click(); + if (confirm !== null) { + element(by.css('.e2e-confirm-checkbox')).click(); + } + element(by.buttonText('Continue')).click(); + } + + const labelEl = element(by.css('[formcontrolname="label"]')); + const seedEl = element(by.css('[formcontrolname="seed"]')); + const btn = element(by.buttonText(confirm ? 'Create' : 'Load')); + const encrypt = element(by.css('.mat-checkbox-label')); + + encrypt.click(); + labelEl.clear(); + seedEl.clear(); + labelEl.sendKeys(label); + seedEl.sendKeys(seed); + + if (confirm) { + const confirmEl = element(by.css('[formcontrolname="confirm_seed"]')); + confirmEl.clear(); + confirmEl.sendKeys(confirm); + } + + if (label !== '' && (seed === confirm || (!confirm && seed !== ''))) { + browser.sleep(1000); + const seedValidationCheckBox = element(by.css('.alert-box .mat-checkbox-inner-container')); + seedValidationCheckBox.click(); + } + + return btn.isEnabled().then(status => { + if (status) { + btn.click(); + } + + return status; + }); + } + + expandWallet() { + return this.getWalletWithName('Test create wallet').click().then(() => { + return element(by.css('app-wallet-detail')).isPresent(); + }); + } + + showQrDialog() { + return browser.sleep(1000).then(() => element(by.css('.qr-code-button')).click().then(() => { + return element(by.css('app-qr-code')).isPresent(); + })); + } + + hideQrDialog() { + return browser.sleep(1000).then(() => element(by.css('app-modal .-header img')).click().then(() => { + return element(by.css('app-qr-code')).isPresent(); + })); + } + + addAddress() { + return element.all(by.css('.-record')).count().then(originalCount => { + return element(by.css('.-new-address')).click().then(() => { + return browser.sleep(2000).then(() => { + return element(by.buttonText('Create')).click().then(() => { + return browser.sleep(2000).then(() => { + return element.all(by.css('.-record')).count().then(newCount => { + return newCount > originalCount; + }); + }); + }); + }); + }); + }); + } + + getCountOfEmptyAddresses(clickSelector: string) { + return element(by.css(clickSelector)).click().then(() => { + return element.all(by.css('.-record > div:nth-child(3)')).filter((address) => { + return address.getText().then(value => { + return value === '0'; + }); + }).count(); + }); + } + + showChangeWalletName() { + return element(by.css('.-edit-wallet')).click().then(() => { + return element(by.css('app-change-name')).isPresent(); + }); + } + + changeWalletName() { + const label = element(by.css('[formcontrolname="label"]')); + const btn = element(by.buttonText('Rename')); + + return label.clear().then(() => { + return label.sendKeys('New Wallet Name').then(() => { + return btn.click().then(() => { + return browser.sleep(1000).then(() => { + return this.getWalletWithName('New Wallet Name').isPresent(); + }); + }); + }); + }); + } + + canEncrypt() { + return element(by.css('.-enable-encryption')).click().then(() => { + const p1 = element(by.css('[formcontrolname="password"]')); + const p2 = element(by.css('[formcontrolname="confirm_password"]')); + const btn = element(by.buttonText('Proceed')); + + p1.sendKeys('password'); + p2.sendKeys('password'); + + return btn.click().then(() => { + return browser.wait( + protractor.ExpectedConditions.stalenessOf(element(by.css('app-password-dialog'))), + 30000, + 'Can not encrypt wallet', + ).then(() => { + return element(by.css('.-disable-encryption')).isPresent(); + }); + }); + }); + } + + canDecrypt() { + return element(by.css('.-disable-encryption')).click().then(() => { + const p1 = element(by.css('[formcontrolname="password"]')); + const btn = element(by.buttonText('Proceed')); + + p1.clear(); + p1.sendKeys('password'); + + return btn.click().then(() => { + return browser.wait( + protractor.ExpectedConditions.stalenessOf(element(by.css('app-password-dialog'))), + 30000, + 'Can not decrypt wallet', + ).then(() => { + return element(by.css('.-enable-encryption')).isPresent(); + }); + }); + }); + } + + showPriceInformation() { + return element(by.css('.balance p.dollars')).getText().then(text => { + return this.checkHeaderPriceFormat(text); + }); + } + + waitForWalletToBeCreated() { + browser.wait( + protractor.ExpectedConditions.stalenessOf(element(by.css('app-create-wallet'))), + 10000, + 'Wallet was not created', + ); + } + + private getWalletWithName(name: string) { + return element.all(by.css('.-wallets.ng-star-inserted')) + .filter(wallet => wallet.element(by.css('.-label')).getText().then(text => text === name)) + .first(); + } + + private checkHeaderPriceFormat(price: string) { + const reg = /^\$[0-9,]+.[0-9]{2}\s\(\$[0-9,]+.[0-9]{2}\)$/; + + return !!price.match(reg); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/karma.conf.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/karma.conf.js new file mode 100644 index 00000000..52084afd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/karma.conf.js @@ -0,0 +1,36 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/0.13/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular/cli'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular/cli/plugins/karma') + ], + files: [ + { pattern: 'test-fixtures/*.json', included: false } + ], + client:{ + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package-lock.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package-lock.json new file mode 100644 index 00000000..f8418edd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package-lock.json @@ -0,0 +1,11535 @@ +{ + "name": "desktopwallet", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/build-optimizer": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz", + "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "source-map": "^0.5.6", + "typescript": "~2.6.2", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@angular-devkit/core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz", + "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==", + "dev": true, + "requires": { + "ajv": "~5.5.1", + "chokidar": "^1.7.0", + "rxjs": "^5.5.6", + "source-map": "^0.5.6" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz", + "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==", + "dev": true, + "requires": { + "@ngtools/json-schema": "^1.1.0", + "rxjs": "^5.5.6" + } + }, + "@angular/animations": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.0.tgz", + "integrity": "sha512-JLR42YHiJppO4ruAkFxgbzghUDtHkXHkKPM8udd2qyt16T7e1OX7EEOrrmldUu59CC56tZnJ/32p4SrYmxyBSA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/cdk": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.2.5.tgz", + "integrity": "sha512-GN8m1d+VcCE9+Bgwv06Y8YJKyZ0i9ZIq2ZPBcJYt+KVgnVVRg4JkyUNxud07LNsvzOX22DquHqmIZiC4hAG7Ag==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/cli": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.3.tgz", + "integrity": "sha512-19sh0SbjneG7/R/FvZBfHsHqfIqyj4LQuXdddJKMCDM97UoHQTjfgrpRvBf3a3lR79wdLXchWJBD9Yc6ifosEA==", + "dev": true, + "requires": { + "@angular-devkit/build-optimizer": "0.3.2", + "@angular-devkit/core": "0.3.2", + "@angular-devkit/schematics": "0.3.2", + "@ngtools/json-schema": "1.2.0", + "@ngtools/webpack": "1.10.2", + "@schematics/angular": "0.3.2", + "@schematics/package-update": "0.3.2", + "ajv": "^6.1.1", + "autoprefixer": "^7.2.3", + "cache-loader": "^1.2.0", + "chalk": "~2.2.0", + "circular-dependency-plugin": "^4.2.1", + "clean-css": "^4.1.11", + "common-tags": "^1.3.1", + "copy-webpack-plugin": "~4.4.1", + "core-object": "^3.1.0", + "denodeify": "^1.2.1", + "ember-cli-string-utils": "^1.0.0", + "extract-text-webpack-plugin": "^3.0.2", + "file-loader": "^1.1.5", + "fs-extra": "^4.0.0", + "glob": "^7.0.3", + "html-webpack-plugin": "^2.29.0", + "istanbul-instrumenter-loader": "^3.0.0", + "karma-source-map-support": "^1.2.0", + "less": "^2.7.2", + "less-loader": "^4.0.5", + "license-webpack-plugin": "^1.0.0", + "loader-utils": "1.1.0", + "lodash": "^4.11.1", + "memory-fs": "^0.4.1", + "minimatch": "^3.0.4", + "node-modules-path": "^1.0.0", + "node-sass": "^4.7.2", + "nopt": "^4.0.1", + "opn": "~5.1.0", + "portfinder": "~1.0.12", + "postcss": "^6.0.16", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.10", + "postcss-url": "^7.1.2", + "raw-loader": "^0.5.1", + "resolve": "^1.1.7", + "rxjs": "^5.5.6", + "sass-loader": "^6.0.6", + "semver": "^5.1.0", + "silent-error": "^1.0.0", + "source-map-support": "^0.4.1", + "style-loader": "^0.19.1", + "stylus": "^0.54.5", + "stylus-loader": "^3.0.1", + "uglifyjs-webpack-plugin": "^1.1.8", + "url-loader": "^0.6.2", + "webpack": "~3.11.0", + "webpack-dev-middleware": "~1.12.0", + "webpack-dev-server": "~2.11.0", + "webpack-merge": "^4.1.0", + "webpack-sources": "^1.0.0", + "webpack-subresource-integrity": "^1.0.1" + } + }, + "@angular/common": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.0.tgz", + "integrity": "sha512-yMFn2isC7/XOs56/2Kzzbb1AASHiwipAPOVFtKe7TdZQClO8fJXwCnk326rzr615+CG0eSBNQWeiFGyWN2riBA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/compiler": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.0.tgz", + "integrity": "sha512-RfYa4ESgjGX0T0ob/Xz00IF7nd2xZkoyRy6oKgL82q42uzB3xZUDMrFNgeGxAUs3H22IkL46/5SSPOMOTMZ0NA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/compiler-cli": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.0.tgz", + "integrity": "sha512-+Kef4NjuHwLj2hRPdVo4yAtPmv+kn0Nu/ShmKfaEK4mt9aaQMFxKNt6beUuDK5iUPMB5nuTCZ4bqEFpqd+EtxQ==", + "dev": true, + "requires": { + "chokidar": "^1.4.2", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "tsickle": "^0.26.0" + } + }, + "@angular/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.0.tgz", + "integrity": "sha512-s2ne45DguNUubhC1YgybGECC4Tyx3G4EZCntUiRMDWWkmKXSK+6dgHMesyDo8R5Oat8VfN4Anf8l3JHS1He8kg==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/forms": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.0.tgz", + "integrity": "sha512-g1/SF9lY0ZwzJ0w4NXbFsTGGEuUdgtaZny8DmkaqtmA7idby3FW398X0tv25KQfVYKtL+p9Jp1Y8EI0CvrIsvw==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/http": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.0.tgz", + "integrity": "sha512-V5Cl24dP3rCXTTQvDc0TIKoWqBRAa0DWAQbtr7iuDAt5a1vPGdKz5K1sEiiV6ziwX6gzjiwHjUvL+B+WbIUrQA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/language-service": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.0.tgz", + "integrity": "sha512-Yj/y5XrBBXbtwnZ6HJOBl/0XS/JBvVlHb1UWw5MIrsc81k7/eFiRAIKzmGpAba+Sw0G0dO22ABZ4yJjAMsML6A==", + "dev": true + }, + "@angular/material": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.2.5.tgz", + "integrity": "sha512-IltfBeTJWnmZehOQNQ7KoFs7MGWuZTe0g21hIitGkusVNt1cIoTD24xKH5jwztjH19c04IgiwonpurMKM6pBCQ==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.0.tgz", + "integrity": "sha512-c6cR15MfopPwGZ097HdRuAi9+R9BhA3bRRFpP2HmrSSB/BW4ZNovUYwB2QUMSYbd9s0lYTtnavqGm6DKcyF2QA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser-dynamic": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.0.tgz", + "integrity": "sha512-xG1eNoi8sm4Jcly2y98r5mqYVe3XV8sUJCtOhvGBYtvt4dKEQ5tOns6fWQ0nUbl6Vv3Y0xgGUS1JCtfut3DuaQ==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.0.tgz", + "integrity": "sha512-VXDXtp2A1GQEUEhXg0ZzqHdTUERLgDSo3/Mmpzt+dgLMKlXDSCykcm4gINwE5VQLGD1zQvDFCCRv3seGRNfrqA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@ngtools/json-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", + "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==", + "dev": true + }, + "@ngtools/webpack": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", + "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", + "dev": true, + "requires": { + "chalk": "~2.2.0", + "enhanced-resolve": "^3.1.0", + "loader-utils": "^1.0.2", + "magic-string": "^0.22.3", + "semver": "^5.3.0", + "source-map": "^0.5.6", + "tree-kill": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "@ngx-translate/core": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-9.1.1.tgz", + "integrity": "sha1-rhA5KINrip4Gn9Li52+iGYzH5ig=" + }, + "@schematics/angular": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", + "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==", + "dev": true, + "requires": { + "typescript": "~2.6.2" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@schematics/package-update": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz", + "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==", + "dev": true, + "requires": { + "rxjs": "^5.5.6", + "semver": "^5.3.0", + "semver-intersect": "^1.1.2" + } + }, + "@types/jasmine": { + "version": "2.5.54", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", + "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", + "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/node": { + "version": "6.0.96", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz", + "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "~1.33.0" + } + } + } + }, + "acorn": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.1.tgz", + "integrity": "sha512-D/KGiCpM/VOtTMDS+wfjywEth926WUrArrzYov4N4SI7t+3y8747dPpCmmAvrm/Z3ygqMHnyPxvYYO0yTdn/nQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "adm-zip": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.1.tgz", + "integrity": "sha1-KKarxJOiq+D7TIUHrK7bQ/pVBnE=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "app-root-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", + "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "requires": { + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" + } + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "base-x": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.5.tgz", + "integrity": "sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", + "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "bootstrap": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-beta.3.tgz", + "integrity": "sha512-/Qe1Q2d1muLEZRX2iCteMQHZBBAm6ZIjJ9FcBYK/xLr05+HvDtBOVBN+Cz7mCNZuy0zr+y5artZHM05W7mIz6g==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + }, + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cache-loader": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", + "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mkdirp": "^0.5.1", + "neo-async": "^2.5.0", + "schema-utils": "^0.4.2" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000813", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000813.tgz", + "integrity": "sha512-A8ITSmH5SFdMFdC704ggjg+x2z5PzQmVlG8tavwnfvbC33Q1UYrj0+G+Xm0SNAnd4He36fwUE/KEWytOEchw+A==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + } + } + }, + "chalk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz", + "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "dev": true, + "requires": { + "source-map": "0.5.x" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codelyzer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.0.2.tgz", + "integrity": "sha512-nYwOr49+IV09e7C4aXkVALRz0+XpHqZiUUcxHuDZH4xP1FBcHINyr3qvVhv5Gfm7XRmoLx32tsIhrQhW/gBcog==", + "dev": true, + "requires": { + "app-root-path": "^2.0.1", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.6", + "sprintf-js": "^1.0.3" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", + "dev": true + }, + "common-tags": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.7.2.tgz", + "integrity": "sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "dev": true, + "requires": { + "mime-db": ">= 1.33.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + } + } + }, + "compression": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "bytes": "3.0.0", + "compressible": "~2.0.13", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.1", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", + "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.0.6", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + } + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz", + "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==", + "dev": true, + "requires": { + "cacache": "^10.0.1", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-object": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", + "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", + "dev": true, + "requires": { + "chalk": "^2.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "~0.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.36.tgz", + "integrity": "sha1-Dqv3Gp6+qQE/scw1o5DgaGJPJ+g=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "ember-cli-string-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", + "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "~2.1.11", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es5-ext": { + "version": "0.10.39", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz", + "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": ">=0.0.5" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.1", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.2", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "~1.3.1", + "type-is": "~1.6.15", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "dev": true, + "requires": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "~1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "hawk": "3.1.3", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + } + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "^1.0.2" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "^2.0.1" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.10.tgz", + "integrity": "sha512-5c8iAyeIGAiuFhVjJ0qy1lgvyQxxuZgjeOuMnoK/wjEyy8DF3xKUnE9pO+6H7VMir976K6SGlZV8ZEmIOea/Zg==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.14.x", + "he": "1.1.x", + "ncname": "1.0.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.3.x" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^3.1.0", + "lodash": "^4.17.2", + "micromatch": "^2.3.11" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "^3.3.0" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", + "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-hook": "^1.1.0", + "istanbul-lib-instrument": "^1.9.1", + "istanbul-lib-report": "^1.1.2", + "istanbul-lib-source-maps": "^1.2.2", + "istanbul-reports": "^1.1.3", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.0.tgz", + "integrity": "sha512-alLSEFX06ApU75sm5oWcaVNaiss/bgMRiWTct3g0P0ZZTKjR+6QiCcuVOKDI1kWJgwHEnIXsv/dWm783kPpmtw==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.1.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", + "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", + "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", + "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", + "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", + "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "karma": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", + "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^1.4.1", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^3.8.0", + "log4js": "^0.6.31", + "mime": "^1.3.4", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "1.7.3", + "source-map": "^0.5.3", + "tmp": "0.0.31", + "useragent": "^2.1.12" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", + "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.3.3.tgz", + "integrity": "sha512-MFkB6bh11J8nKygUdqyHb9sMz17XoBRYR4tiNxnSpi/UtDk0wk8eRGa0jRSJaILgCl4xyq1TL6Jidww1OWly/Q==", + "dev": true, + "requires": { + "istanbul-api": "^1.1.14", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz", + "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true, + "requires": { + "karma-jasmine": "^1.0.2" + } + }, + "karma-read-json": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/karma-read-json/-/karma-read-json-1.1.0.tgz", + "integrity": "sha1-4M40XFrmOKNqWgXcGmoELczaseQ=", + "dev": true + }, + "karma-source-map-support": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", + "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", + "dev": true, + "requires": { + "source-map-support": "^0.4.1" + } + }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "less": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "2.81.0", + "source-map": "^0.5.3" + } + }, + "less-loader": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.0.6.tgz", + "integrity": "sha512-WPFY3NMJGJna8kIxtgSu6AVG7K6uRPdfE2J7vpQqFWMN/RkOosV09rOVUt3wghNClWH2Pg7YumD1dHiv1Thfug==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + } + }, + "license-webpack-plugin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-+sie46vNe5L48N94LEzEvreJqAdi+N3x3mXUx+iujuAmftWdJUh68RSDPgWK3DRJuu50dwiyH7MdVAx95zfKQA==", + "dev": true, + "requires": { + "ejs": "^2.5.7" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "~1.0.2", + "semver": "~4.3.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "magic-string": { + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", + "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", + "dev": true, + "requires": { + "vlq": "^0.2.1" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.2.tgz", + "integrity": "sha512-l9ra35l5VWLF24y75Tg8XgfGLX0ueRhph118WKM6H5denx4bB5QF59+4UAm9oJ2qsPQZas/CQUDdtDdfvYHBdQ==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "~1.30.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", + "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "^1.0.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", + "integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", + "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + } + }, + "node-modules-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", + "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", + "dev": true + }, + "node-sass": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", + "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.11", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.x" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.x", + "requires-port": "1.0.x" + } + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.19.tgz", + "integrity": "sha512-f13HRz0HtVwVaEuW6J6cOUCBLFtymhgyLPV7t4QEk2UD3twRI9IluDcQNdzQdBpiixkXj2OmzejhhTbSbDxNTg==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "source-map": "^0.6.1", + "supports-color": "^5.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", + "dev": true, + "requires": { + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0", + "postcss-load-options": "^1.2.0", + "postcss-load-plugins": "^2.3.0" + } + }, + "postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0" + } + }, + "postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.1", + "object-assign": "^4.1.0" + } + }, + "postcss-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.1.tgz", + "integrity": "sha512-f0J/DWE/hyO9/LH0WHpXkny/ZZ238sSaG3p1SRBtVZnFWUtD7GXIEgHoBg8cnAeRbmEvUxHQptY46zWfwNYj/w==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^1.2.0", + "schema-utils": "^0.4.0" + } + }, + "postcss-url": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.1.tgz", + "integrity": "sha512-Ya5KIjGptgz0OtrVYfi2UbLxVAZ6Emc4Of+Grx4Sf1deWlRpFwLr8FrtkUxfqh+XiZIVkXbjQrddE10ESpNmdA==", + "dev": true, + "requires": { + "mime": "^1.4.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^6.0.1", + "xxhashjs": "^0.2.1" + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "protractor": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "dev": true, + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", + "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", + "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=", + "dev": true + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + } + }, + "sass-loader": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", + "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0" + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", + "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=", + "dev": true, + "requires": { + "node-forge": "0.7.1" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz", + "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.1", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.1" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "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": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, + "requires": { + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", + "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "silent-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", + "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^2.0.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "socket.io": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.3", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.3", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" + } + }, + "spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "ssri": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.2.4.tgz", + "integrity": "sha512-UnEAgMZa15973iH7cUi0AHjJn1ACDIkaMyZILoqwN6yzt+4P81I8tBc5Hl+qwi5auMplZtPQsHrPBR5vJLcQtQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", + "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", + "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "ts-node": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", + "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "chalk": "^2.0.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.0", + "tsconfig": "^6.0.0", + "v8flags": "^3.0.0", + "yn": "^2.0.0" + } + }, + "tsconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", + "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tsickle": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.26.0.tgz", + "integrity": "sha512-eWJ2CUfttGK0LqF9iJ/Avnxbj4M+fCyJ50Zag3wm73Fut1hsasPRHKxKdrMWVj4BMHnQNx7TO+DdNmLmJTSuNw==", + "dev": true, + "requires": { + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.5.6", + "source-map-support": "^0.4.2" + } + }, + "tslib": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", + "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" + }, + "tslint": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", + "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "diff": "^3.2.0", + "glob": "^7.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.7.1", + "tsutils": "^2.8.1" + } + }, + "tsutils": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.18.0.tgz", + "integrity": "sha512-y0CUDPPb0ygkUkmK8kAeLibag7OEAO0dxbtqAhzP+5w/VY5JdGnPiafhYxzRzWzkAGQGPJV99xrxngJYVLtrMg==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.15" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", + "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "dev": true + }, + "uglify-js": { + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.13.tgz", + "integrity": "sha512-7rdn/bDOG1ElSTPdh7AI5TCjLv63ZD4k8BBadN3ssIkhlaQL2c0yRxmXCyOYhZK0wZTgGgUSnYQ4CGu+Jos5cA==", + "dev": true, + "requires": { + "commander": "~2.14.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz", + "integrity": "sha512-CG/NvzXfemUAm5Y4Guh5eEaJYHtkG7kKNpXEJHp9QpxsFVB5/qKvYWoMaq4sa99ccZ0hM3MK8vQV9XPZB4357A==", + "dev": true, + "requires": { + "cacache": "^10.0.1", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.2", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "mime": "^1.4.1", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "dev": true, + "requires": { + "querystringify": "~1.0.0", + "requires-port": "~1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, + "use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.0.tgz", + "integrity": "sha512-qC0vMFX6q6ee8JaoTF2Om1uL8KAV1ATUjVaHRxLiPJkIsp8JZl6ZjG0MIB+twZFLbi1vXj30rqj4zlqYiOS9xg==", + "dev": true + }, + "v8flags": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", + "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", + "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "kind-of": "^6.0.2", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", + "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.0.0", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + } + } + }, + "wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", + "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.17.4", + "import-local": "^1.0.0", + "internal-ip": "1.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.1.4", + "spdy": "^3.4.1", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "kind-of": "^6.0.2", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chokidar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", + "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.0.0", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "webpack-merge": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", + "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz", + "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.4.tgz", + "integrity": "sha512-ITyClEvcfv0ozqJl1vmWFWhvI+OIrkbInYqkEPE50wFPXj8J9Gd3FYf8+CkZJXJJsQBYe+2DvmoK9Zhx5w8W+w==", + "dev": true, + "requires": { + "errno": "~0.1.7", + "xtend": "~4.0.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xml2js": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", + "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "util.promisify": "~1.0.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.20.tgz", + "integrity": "sha512-FXlA37ErSXCMy5RNBcGFgCI/Zivqzr0D19GuvDxhcYIJc7xkFp6c29DKyODJu0Zo+EMyur/WPPgcBh1EHjB9jA==" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package.json new file mode 100644 index 00000000..d3d16282 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package.json @@ -0,0 +1,62 @@ +{ + "name": "desktopwallet", + "version": "0.0.0", + "license": "MIT", + "scripts": { + "ng": "ng", + "start": "ng serve --proxy-config proxy.config.js --delete-output-path false", + "build": "ng build --prod", + "build-travis": "ng build --prod --output-path=$BUILD_UI_TRAVIS_DIR", + "test": "ng test --watch=false", + "lint": "ng lint", + "e2e": "ng e2e --proxy-config proxy.config.js --delete-output-path false", + "e2e-choose-config": "ng e2e --proxy-config $E2E_PROXY_CONFIG --delete-output-path false" + }, + "private": true, + "dependencies": { + "@angular/animations": "^5.2.0", + "@angular/cdk": "^5.2.0", + "@angular/common": "^5.2.0", + "@angular/compiler": "^5.2.0", + "@angular/core": "^5.2.0", + "@angular/forms": "^5.2.0", + "@angular/http": "^5.2.0", + "@angular/material": "^5.2.0", + "@angular/platform-browser": "^5.2.0", + "@angular/platform-browser-dynamic": "^5.2.0", + "@angular/router": "^5.2.0", + "@ngx-translate/core": "^9.1.1", + "bootstrap": "^4.0.0-beta.2", + "core-js": "^2.4.1", + "font-awesome": "^4.7.0", + "hammerjs": "^2.0.8", + "moment": "^2.21.0", + "rxjs": "^5.5.2", + "zone.js": "^0.8.14", + "bignumber.js": "^7.2.1", + "base-x": "3.0.5", + "node-sass": "4.12.0" + }, + "devDependencies": { + "@angular/cli": "^1.7.3", + "@angular/compiler-cli": "^5.2.0", + "@angular/language-service": "^5.2.0", + "@types/jasmine": "~2.5.53", + "@types/jasminewd2": "~2.0.2", + "@types/node": "~6.0.60", + "codelyzer": "~4.0.1", + "jasmine-core": "~2.6.2", + "jasmine-spec-reporter": "~4.1.0", + "karma": "~1.7.0", + "karma-chrome-launcher": "~2.1.1", + "karma-cli": "~1.0.1", + "karma-coverage-istanbul-reporter": "^1.2.1", + "karma-jasmine": "~1.1.0", + "karma-jasmine-html-reporter": "^0.2.2", + "karma-read-json": "^1.1.0", + "protractor": "~5.4.2", + "ts-node": "~3.2.0", + "tslint": "~5.7.0", + "typescript": "~2.4.2" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/protractor.conf.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/protractor.conf.js new file mode 100644 index 00000000..98b71523 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/protractor.conf.js @@ -0,0 +1,31 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 60000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome', + chromeOptions: { + args: ['--no-sandbox', '--headless', '--disable-gpu', 'window-size=1920,1080'] + } + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 60000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/proxy.config.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/proxy.config.js new file mode 100644 index 00000000..5728e827 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/proxy.config.js @@ -0,0 +1,22 @@ +const PROXY_CONFIG = { + "/api/*": { + "target": "http://127.0.0.1:6420", + "secure": false, + "logLevel": "debug", + "bypass": function (req) { + req.headers["host"] = '127.0.0.1:6420'; + req.headers["referer"] = 'http://127.0.0.1:6420'; + req.headers["origin"] = 'http://127.0.0.1:6420'; + } +}, + "/teller/*": { + "target": "http://127.0.0.1:7071", + "pathRewrite": { + "^/teller" : "api/" + }, + "secure": true, + "logLevel": "debug" + } +}; + +module.exports = PROXY_CONFIG; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.html new file mode 100644 index 00000000..4d1109aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.html @@ -0,0 +1,8 @@ +
+
+ +
{{ 'errors.window-size' | translate }}
+
+
+ + \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.scss new file mode 100644 index 00000000..17e9b186 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.scss @@ -0,0 +1,72 @@ +$white: #FBFBFB; + +.size-alert { + background-color: rgba(0, 0, 0, 0.85); + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 10000; + display: inline-flex; + align-items: center; + justify-content: center; + text-align: center; + color: white; + + > div { + margin: 0px 40px; + max-width: 400px; + } +} + +mat-card { + max-width: 1000px; + margin-top: 80px; + margin-right: auto; + margin-left: auto; +} + +.logo { + max-height: 100%; +} + +.fill-remaining-space { + flex: 1 1 auto; +} + +.sky-container { + max-width: 1000px; + margin-top: 20px; + margin-right: auto; + margin-left: auto; +} + +mat-toolbar span { + margin: 0 20px; +} + +.search-field { + border-radius: 8px; + border: none; + background-color: #fff; + padding: 8px; +} + +.syncing { + font-size: 14px; +} + +.main-menu button { + margin-right: 20px; +} + +#top-menu { + span { + color: $white; + + &#version { + padding-top: 12px; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.spec.ts new file mode 100644 index 00000000..cd85da1c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.spec.ts @@ -0,0 +1,32 @@ +import { TestBed, async } from '@angular/core/testing'; + +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent, + ], + }).compileComponents(); + })); + + it('should create the app', async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + + it(`should have as title 'app'`, async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('app'); + })); + + it('should render title in a h1 tag', async(() => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!'); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.ts new file mode 100644 index 00000000..1c021a87 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.ts @@ -0,0 +1,68 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import 'rxjs/add/operator/takeWhile'; +import { MatDialog } from '@angular/material'; + +import { AppService } from './services/app.service'; +import { WalletService } from './services/wallet.service'; +import { HwWalletService } from './services/hw-wallet.service'; +import { HwPinDialogComponent } from './components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component'; +import { Bip39WordListService } from './services/bip39-word-list.service'; +import { HwConfirmTxDialogComponent } from './components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component'; +import { HwWalletPinService } from './services/hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './services/hw-wallet-seed-word.service'; +import { LanguageService } from './services/language.service'; +import { openChangeLanguageModal } from './utils'; +import { MsgBarComponent } from './components/layout/msg-bar/msg-bar.component'; +import { MsgBarService } from './services/msg-bar.service'; +import { SeedWordDialogComponent } from './components/layout/seed-word-dialog/seed-word-dialog.component'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'], +}) +export class AppComponent implements OnInit { + @ViewChild('msgBar') msgBar: MsgBarComponent; + + constructor( + private appService: AppService, + private languageService: LanguageService, + walletService: WalletService, + hwWalletService: HwWalletService, + hwWalletPinService: HwWalletPinService, + hwWalletSeedWordService: HwWalletSeedWordService, + private bip38WordList: Bip39WordListService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + ) { + hwWalletPinService.requestPinComponent = HwPinDialogComponent; + hwWalletSeedWordService.requestWordComponent = SeedWordDialogComponent; + hwWalletService.signTransactionConfirmationComponent = HwConfirmTxDialogComponent; + + walletService.initialLoadFailed.subscribe(failed => { + if (failed) { + // The "?2" part indicates that error number 2 should be displayed. + window.location.assign('assets/error-alert/index.html?2'); + } + }); + } + + ngOnInit() { + this.appService.testBackend(); + this.languageService.loadLanguageSettings(); + + const subscription = this.languageService.selectedLanguageLoaded.subscribe(selectedLanguageLoaded => { + if (!selectedLanguageLoaded) { + openChangeLanguageModal(this.dialog, true).subscribe(response => { + if (response) { + this.languageService.changeLanguage(response); + } + }); + } + + subscription.unsubscribe(); + + this.msgBarService.msgBarComponent = this.msgBar; + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.config.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.config.ts new file mode 100644 index 00000000..e19fa0dc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.config.ts @@ -0,0 +1,35 @@ +export const AppConfig = { + otcEnabled: false, + maxHardwareWalletAddresses: 1, + useHwWalletDaemon: true, + urlForHwWalletVersionChecking: 'https://version.skycoin.com/skywallet/version.txt', + hwWalletDownloadUrlAndPrefix: 'https://downloads.skycoin.com/skywallet/skywallet-firmware-v', + + urlForVersionChecking: 'https://version.skycoin.com/skycoin/version.txt', + walletDownloadUrl: 'https://www.skycoin.com/downloads/', + + /** + * This wallet uses the Skycoin URI Specification (based on BIP-21) when creating QR codes and + * requesting coins. This variable defines the prefix that will be used for creating QR codes + * and URLs. IT MUST BE UNIQUE FOR EACH COIN. + */ + uriSpecificatioPrefix: 'skycoin', + + languages: [{ + code: 'en', + name: 'English', + iconName: 'en.png', + }, + { + code: 'zh', + name: '中文', + iconName: 'zh.png', + }, + { + code: 'es', + name: 'Español', + iconName: 'es.png', + }, + ], + defaultLanguage: 'en', +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.datatypes.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.datatypes.ts new file mode 100644 index 00000000..c61c3b58 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.datatypes.ts @@ -0,0 +1,158 @@ +import { BigNumber } from 'bignumber.js'; +/** + * Internal Objects + */ + +export class Address { + address: string; + coins: BigNumber = new BigNumber('0'); + hours: BigNumber = new BigNumber('0'); + copying?: boolean; // Optional parameter indicating whether the address is being copied to clipboard + outputs?: any; + confirmed?: boolean; // Optional parameter for hardware wallets only +} + +export class PurchaseOrder { + coin_type: string; + filename: string; + deposit_address: string; + recipient_address: string; + status?: string; +} + +export class TellerConfig { + enabled: boolean; + sky_btc_exchange_rate: number; +} + +export class Transaction { + balance: BigNumber = new BigNumber('0'); + inputs: any[]; + outputs: any[]; + txid: string; + hoursSent?: BigNumber; + hoursBurned?: BigNumber; + coinsMovedInternally?: boolean; + note?: string; +} + +export class PreviewTransaction extends Transaction { + from: string; + to: string[]; + encoded: string; + innerHash: string; + wallet?: Wallet; +} + +export class NormalTransaction extends Transaction { + addresses: string[]; + timestamp: number; + block: number; + confirmed: boolean; +} + +export class Version { + version: string; +} + +export class Wallet { + label: string; + filename: string; + coins: BigNumber = new BigNumber('0'); + hours: BigNumber = new BigNumber('0'); + addresses: Address[]; + encrypted: boolean; + hideEmpty?: boolean; + opened?: boolean; + isHardware?: boolean; + hasHwSecurityWarnings?: boolean; + stopShowingHwSecurityPopup?: boolean; +} + +export class Connection { + id: number; + address: string; + listen_port: number; + source?: string; +} + +export class TradingPair { + from: string; + to: string; + price: number; + pair: string; + min: number; + max: number; +} + +export class ExchangeOrder { + pair: string; + fromAmount: number|null; + toAmount: number; + toAddress: string; + toTag: string|null; + refundAddress: string|null; + refundTag: string|null; + id: string; + exchangeAddress: string; + exchangeTag: string|null; + toTx?: string|null; + status: string; + message?: string; +} + +export class StoredExchangeOrder { + id: string; + pair: string; + fromAmount: number; + toAmount: number; + address: string; + timestamp: number; + price: number; +} + +export interface Output { + address: string; + coins: BigNumber; + hash: string; + calculated_hours: BigNumber; +} + +export interface ConfirmationData { + text: string; + headerText: string; + checkboxText?: string; + confirmButtonText: string; + cancelButtonText?: string; + redTitle?: boolean; + disableDismiss?: boolean; + linkText?: string; + linkFunction?(): void; +} + +/** + * Response Objects + */ + +export class GetWalletsResponseWallet { + meta: GetWalletsResponseMeta; + entries: GetWalletsResponseEntry[]; +} + +export class PostWalletNewAddressResponse { + addresses: string[]; +} + +/** + * Response Embedded Objects + */ + +export class GetWalletsResponseMeta { + label: string; + filename: string; + encrypted: boolean; +} + +export class GetWalletsResponseEntry { + address: string; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.module.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.module.ts new file mode 100644 index 00000000..7b959544 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.module.ts @@ -0,0 +1,344 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { AppComponent } from './app.component'; +import { HttpModule } from '@angular/http'; +import { ApiService } from './services/api.service'; +import { WalletService } from './services/wallet.service'; +import { WalletsComponent } from './components/pages/wallets/wallets.component'; +import { CreateWalletComponent } from './components/pages/wallets/create-wallet/create-wallet.component'; +import { ReactiveFormsModule } from '@angular/forms'; +import { SendSkycoinComponent } from './components/pages/send-skycoin/send-skycoin.component'; +import { DateFromNowPipe } from './pipes/date-from-now.pipe'; +import { RouterModule } from '@angular/router'; +import { BlockchainService } from './services/blockchain.service'; +import { DateTimePipe } from './pipes/date-time.pipe'; +import { PendingTransactionsComponent } from './components/pages/settings/pending-transactions/pending-transactions.component'; +import { OutputsComponent } from './components/pages/settings/outputs/outputs.component'; +import { BlockchainComponent } from './components/pages/settings/blockchain/blockchain.component'; +import { BackupComponent } from './components/pages/settings/backup/backup.component'; +import { NetworkComponent } from './components/pages/settings/network/network.component'; +import { NetworkService } from './services/network.service'; +import { ChangeNameComponent } from './components/pages/wallets/change-name/change-name.component'; +import { ButtonComponent } from './components/layout/button/button.component'; +import { QrCodeComponent } from './components/layout/qr-code/qr-code.component'; +import { BuyComponent } from './components/pages/buy/buy.component'; +import { AddDepositAddressComponent } from './components/pages/buy/add-deposit-address/add-deposit-address.component'; +import { PurchaseService } from './services/purchase.service'; +import { TellerStatusPipe } from './pipes/teller-status.pipe'; +import { HeaderComponent } from './components/layout/header/header.component'; +import { TopBarComponent } from './components/layout/header/top-bar/top-bar.component'; +import { PriceService } from './services/price.service'; +import { TransactionListComponent } from './components/pages/transaction-list/transaction-list.component'; +import { TransactionDetailComponent } from './components/pages/transaction-list/transaction-detail/transaction-detail.component'; +import { NavBarComponent } from './components/layout/header/nav-bar/nav-bar.component'; +import { WalletDetailComponent } from './components/pages/wallets/wallet-detail/wallet-detail.component'; +import { ModalComponent } from './components/layout/modal/modal.component'; +import { PasswordDialogComponent } from './components/layout/password-dialog/password-dialog.component'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatSliderModule, MatAutocompleteModule } from '@angular/material'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { HttpClientModule } from '@angular/common/http'; +import { AppService } from './services/app.service'; +import { WizardGuardService } from './services/wizard-guard.service'; +import { OnboardingCreateWalletComponent } from './components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component'; +import { OnboardingEncryptWalletComponent } from './components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component'; +import { OnboardingSafeguardComponent } from './components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component'; +import { DoubleButtonComponent } from './components/layout/double-button/double-button.component'; +import { SeedModalComponent } from './components/pages/settings/backup/seed-modal/seed-modal.component'; +import { OnboardingComponent } from './components/pages/onboarding/onboarding.component'; +import { DontsavepasswordDirective } from './directives/dontsavepassword.directive'; +import { SendFormComponent } from './components/pages/send-skycoin/send-form/send-form.component'; +import { SendVerifyComponent } from './components/pages/send-skycoin/send-preview/send-preview.component'; +import { TransactionInfoComponent } from './components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component'; +import { SendFormAdvancedComponent } from './components/pages/send-skycoin/send-form-advanced/send-form-advanced.component'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { AppTranslateLoader } from './app.translate-loader'; +import { NavBarService } from './services/nav-bar.service'; +import { LoadingContentComponent } from './components/layout/loading-content/loading-content.component'; +import { NumberOfAddressesComponent } from './components/pages/wallets/number-of-addresses/number-of-addresses'; +import { SelectAddressComponent } from './components/pages/send-skycoin/send-form-advanced/select-address/select-address'; +import { CreateWalletFormComponent } from './components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component'; +import { ResetPasswordComponent } from './components/pages/reset-password/reset-password.component'; +import { ExchangeComponent } from './components/pages/exchange/exchange.component'; +import { ExchangeService } from './services/exchange.service'; +import { ExchangeCreateComponent } from './components/pages/exchange/exchange-create/exchange-create.component'; +import { ExchangeStatusComponent } from './components/pages/exchange/exchange-status/exchange-status.component'; +import { HwWalletService } from './services/hw-wallet.service'; +import { HwOptionsDialogComponent } from './components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component'; +import { HwWipeDialogComponent } from './components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component'; +import { HwAddedDialogComponent } from './components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component'; +import { HwGenerateSeedDialogComponent } from './components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component'; +import { HwBackupDialogComponent } from './components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component'; +import { ConfirmationComponent } from './components/layout/confirmation/confirmation.component'; +import { HwMessageComponent } from './components/layout/hardware-wallet/hw-message/hw-message.component'; +import { HwPinDialogComponent } from './components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component'; +import { HwChangePinDialogComponent } from './components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component'; +import { HwPinHelpDialogComponent } from './components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component'; +import { HwRestoreSeedDialogComponent } from './components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component'; +import { Bip39WordListService } from './services/bip39-word-list.service'; +import { HwDialogBaseComponent } from './components/layout/hardware-wallet/hw-dialog-base.component'; +import { HwConfirmTxDialogComponent } from './components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component'; +import { HwConfirmAddressDialogComponent } from './components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component'; +import { HwWalletDaemonService } from './services/hw-wallet-daemon.service'; +import { HwWalletPinService } from './services/hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './services/hw-wallet-seed-word.service'; +import { LanguageService } from './services/language.service'; +import { SelectLanguageComponent } from './components/layout/select-language/select-language.component'; +import { ExchangeHistoryComponent } from './components/pages/exchange/exchange-history/exchange-history.component'; +import { StorageService } from './services/storage.service'; +import { CommonTextPipe } from './pipes/common-text.pipe'; +import { AmountPipe } from './pipes/amount.pipe'; +import { DecimalPipe } from '@angular/common'; +import { HwRemovePinDialogComponent } from './components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component'; +import { HwUpdateFirmwareDialogComponent } from './components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component'; +import { HwUpdateAlertDialogComponent } from './components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component'; +import { ChangeNoteComponent } from './components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component'; +import { MsgBarComponent } from './components/layout/msg-bar/msg-bar.component'; +import { MsgBarService } from './services/msg-bar.service'; +import { SeedWordDialogComponent } from './components/layout/seed-word-dialog/seed-word-dialog.component'; +import { MultipleDestinationsDialogComponent } from './components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component'; + + +const ROUTES = [ + { + path: '', + redirectTo: 'wallets', + pathMatch: 'full', + }, + { + path: 'wallets', + component: WalletsComponent, + canActivate: [WizardGuardService], + }, + { + path: 'send', + component: SendSkycoinComponent, + canActivate: [WizardGuardService], + }, + { + path: 'transactions', + component: TransactionListComponent, + canActivate: [WizardGuardService], + }, + { + path: 'buy', + component: BuyComponent, + canActivate: [WizardGuardService], + }, + { + path: 'exchange', + component: ExchangeComponent, + canActivate: [WizardGuardService], + }, + { + path: 'settings', + children: [ + { + path: 'backup', + component: BackupComponent, + }, + { + path: 'blockchain', + component: BlockchainComponent, + }, + { + path: 'network', + component: NetworkComponent, + }, + { + path: 'outputs', + component: OutputsComponent, + }, + { + path: 'pending-transactions', + component: PendingTransactionsComponent, + }, + ], + canActivate: [WizardGuardService], + }, + { + path: 'wizard', + component: OnboardingComponent, + }, + { + path: 'reset/:id', + component: ResetPasswordComponent, + }, +]; + +@NgModule({ + declarations: [ + AddDepositAddressComponent, + AppComponent, + BackupComponent, + BlockchainComponent, + BuyComponent, + ButtonComponent, + ChangeNameComponent, + CreateWalletComponent, + DateFromNowPipe, + DateTimePipe, + HeaderComponent, + NetworkComponent, + OutputsComponent, + PendingTransactionsComponent, + QrCodeComponent, + SendSkycoinComponent, + TellerStatusPipe, + TopBarComponent, + TransactionDetailComponent, + TransactionListComponent, + WalletsComponent, + NavBarComponent, + WalletDetailComponent, + ModalComponent, + OnboardingCreateWalletComponent, + OnboardingEncryptWalletComponent, + OnboardingSafeguardComponent, + DoubleButtonComponent, + PasswordDialogComponent, + SeedModalComponent, + OnboardingComponent, + DontsavepasswordDirective, + SendFormComponent, + SendVerifyComponent, + TransactionInfoComponent, + SendFormAdvancedComponent, + LoadingContentComponent, + NumberOfAddressesComponent, + SelectAddressComponent, + CreateWalletFormComponent, + ResetPasswordComponent, + ExchangeComponent, + ExchangeCreateComponent, + ExchangeStatusComponent, + HwOptionsDialogComponent, + HwWipeDialogComponent, + HwAddedDialogComponent, + HwGenerateSeedDialogComponent, + HwBackupDialogComponent, + ConfirmationComponent, + HwMessageComponent, + HwPinDialogComponent, + HwChangePinDialogComponent, + HwPinHelpDialogComponent, + HwRestoreSeedDialogComponent, + HwDialogBaseComponent, + HwConfirmTxDialogComponent, + HwConfirmAddressDialogComponent, + SelectLanguageComponent, + ExchangeHistoryComponent, + CommonTextPipe, + AmountPipe, + HwRemovePinDialogComponent, + HwUpdateFirmwareDialogComponent, + HwUpdateAlertDialogComponent, + ChangeNoteComponent, + MsgBarComponent, + SeedWordDialogComponent, + MultipleDestinationsDialogComponent, + ], + entryComponents: [ + AddDepositAddressComponent, + CreateWalletComponent, + ChangeNameComponent, + QrCodeComponent, + SendSkycoinComponent, + TransactionDetailComponent, + OnboardingSafeguardComponent, + PasswordDialogComponent, + SeedModalComponent, + NumberOfAddressesComponent, + SelectAddressComponent, + HwOptionsDialogComponent, + HwWipeDialogComponent, + HwAddedDialogComponent, + HwGenerateSeedDialogComponent, + HwBackupDialogComponent, + ConfirmationComponent, + HwPinDialogComponent, + HwChangePinDialogComponent, + HwPinHelpDialogComponent, + HwRestoreSeedDialogComponent, + HwConfirmTxDialogComponent, + HwConfirmAddressDialogComponent, + SelectLanguageComponent, + ExchangeHistoryComponent, + HwRemovePinDialogComponent, + HwUpdateFirmwareDialogComponent, + HwUpdateAlertDialogComponent, + ChangeNoteComponent, + SeedWordDialogComponent, + MultipleDestinationsDialogComponent, + ], + imports: [ + BrowserModule, + HttpModule, + HttpClientModule, + MatButtonModule, + MatCardModule, + MatDialogModule, + MatExpansionModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatSelectModule, + MatTabsModule, + MatToolbarModule, + MatTooltipModule, + MatCheckboxModule, + MatSliderModule, + MatAutocompleteModule, + NoopAnimationsModule, + ReactiveFormsModule, + RouterModule.forRoot(ROUTES, { useHash: true }), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: AppTranslateLoader, + }, + }), + ], + providers: [ + ApiService, + AppService, + BlockchainService, + ExchangeService, + NavBarService, + NetworkService, + PriceService, + PurchaseService, + WalletService, + WizardGuardService, + HwWalletService, + Bip39WordListService, + HwWalletDaemonService, + HwWalletPinService, + HwWalletSeedWordService, + LanguageService, + StorageService, + MsgBarService, + DecimalPipe, + ], + bootstrap: [AppComponent], +}) +export class AppModule { } diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.theme.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.theme.scss new file mode 100644 index 00000000..77b57e36 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.theme.scss @@ -0,0 +1,83 @@ +@import '~@angular/material/theming'; +// Plus imports for other components in your app. + +// Include the common styles for Angular Material. We include this here so that you only +// have to load a single css file for Angular Material in your app. +// Be sure that you only ever include this mixin once! +@include mat-core(); + +// Define the palettes for your theme using the Material Design palettes available in palette.scss +// (imported above). For each palette, you can optionally specify a default, lighter, and darker +// hue. + +$mat-skycoin-primary: ( + 100: #00C3FF, + 500: #0072FF, + contrast: ( + 100: white, + 500: white, + ) +); + +$mat-skycoin-accent: ( + 500: #FFC125, + contrast: ( + 500: white + ) +); + +$candy-app-primary: mat-palette($mat-skycoin-primary, 500, 100, 500); +$candy-app-accent: mat-palette($mat-skycoin-accent, 500, 500, 500); + +// The warn palette is optional (defaults to red). +$candy-app-warn: mat-palette($mat-red); + +// Create the theme object (a Sass map containing all of the palettes). +$candy-app-theme: mat-light-theme($candy-app-primary, $candy-app-accent, $candy-app-warn); + +// Include theme styles for core and each component used in your app. +// Alternatively, you can import and @include the theme mixins for each component +// that you are using. +@include angular-material-theme($candy-app-theme); + +$mat-select-address-primary: ( + 100: #ddd, + 500: #ddd, + contrast: ( + 100: #ddd, + 500: #ddd, + ) +); + +$select-address-primary: mat-palette($mat-select-address-primary); +$select-address-theme: mat-light-theme($select-address-primary, $candy-app-accent); + +.select-address-theme { + @include angular-material-theme($select-address-theme); +} + +$mat-subtle-primary: ( + 100: white, + 500: white, + contrast: ( + 100: white, + 500: white, + ) +); + +$mat-subtle-accent: ( + 100: #cccccc, + 500: #cccccc, + contrast: ( + 100: #cccccc, + 500: #cccccc, + ) +); + +$subtle-primary: mat-palette($mat-subtle-primary); +$subtle-accent: mat-palette($mat-subtle-accent); +$subtle-theme: mat-light-theme($subtle-primary, $subtle-accent); + +.subtle-theme { + @include angular-material-theme($subtle-theme); +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.translate-loader.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.translate-loader.ts new file mode 100644 index 00000000..ac8cc67f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.translate-loader.ts @@ -0,0 +1,9 @@ +import { TranslateLoader } from '@ngx-translate/core'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/fromPromise'; + +export class AppTranslateLoader implements TranslateLoader { + getTranslation(lang: string): Observable { + return Observable.fromPromise(System.import(`../assets/i18n/${lang}.json`)); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.html new file mode 100644 index 00000000..b18bae86 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.html @@ -0,0 +1,22 @@ +
+ +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.scss new file mode 100644 index 00000000..c5a6c82e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.scss @@ -0,0 +1,34 @@ +@import '../../../../theme/variables'; + +.button-container { + display: inline-block; +} + +button { + border-radius: 25px; + height: 50px; + margin: 20px 10px 0; + width: 160px; + overflow: hidden; +} + +button.enabled { + background-color: rgba(30, 34, 39, 0.05); + box-shadow: none; + color: #1e2227; +} + +mat-icon { + margin-left: 10px; + opacity: 0.3; + line-height: 20px; +} + +mat-spinner { + display: inline-block; + height: 24px !important; + width: 24px !important; + margin-left: 10px; + position: relative; + top: -2px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.spec.ts new file mode 100644 index 00000000..061a0d29 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ButtonComponent } from './button.component'; + +describe('ButtonComponent', () => { + let component: ButtonComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ButtonComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.ts new file mode 100644 index 00000000..5d8e2a3b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.ts @@ -0,0 +1,68 @@ +import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { parseResponseMessage } from '../../../utils/errors'; +import { MatTooltip } from '@angular/material'; + +@Component({ + selector: 'app-button', + templateUrl: 'button.component.html', + styleUrls: ['button.component.scss'], +}) +export class ButtonComponent { + @Input() disabled: any; + @Input() forceEmitEvents = false; + @Output() action = new EventEmitter(); + @ViewChild('tooltip') tooltip: MatTooltip; + @ViewChild('button') button: HTMLButtonElement; + + error: string; + state: number; + mouseOver = false; + + onClick() { + if (!this.disabled || this.forceEmitEvents) { + this.error = ''; + this.action.emit(); + } + } + + focus() { + this.button.focus(); + } + + setLoading() { + this.state = 0; + } + + setSuccess() { + this.state = 1; + setTimeout(() => this.state = null, 3000); + } + + setError(error: any) { + this.error = typeof error === 'string' ? error : parseResponseMessage(error['_body']); + this.state = 2; + + if (this.mouseOver) { + setTimeout(() => this.tooltip.show(), 50); + } + } + + setDisabled() { + this.disabled = true; + } + + setEnabled() { + this.disabled = false; + } + + isLoading() { + return this.state === 0; + } + + resetState() { + this.state = null; + this.error = ''; + + return this; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.html new file mode 100644 index 00000000..1b02cce4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.html @@ -0,0 +1,24 @@ + +
+ {{ data.text | translate }} + {{ data.linkText | translate }} +
+ +
+ {{ data.checkboxText | translate }} + +
+ +
+ + {{ data.cancelButtonText | translate }} + + + {{ data.confirmButtonText | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.scss new file mode 100644 index 00000000..75367122 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.scss @@ -0,0 +1,15 @@ +@import '../../../../theme/variables'; + +.red-title { + font-family: Skycoin; + line-height: 30px; + font-size: 14px; + text-align: center; + letter-spacing: 0.0769231em; + color: $red; +} + +.link { + cursor: pointer; + color: $gradient-blue-dark; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.spec.ts new file mode 100644 index 00000000..ff17ec2f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfirmationComponent } from './confirmation.component'; + +describe('ConfirmationComponent', () => { + let component: ConfirmationComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ConfirmationComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConfirmationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.ts new file mode 100644 index 00000000..7abb6964 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.ts @@ -0,0 +1,28 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; +import { ConfirmationData } from '../../../app.datatypes'; + +@Component({ + selector: 'app-confirmation', + templateUrl: './confirmation.component.html', + styleUrls: ['./confirmation.component.scss'], +}) +export class ConfirmationComponent { + accepted = false; + disableDismiss = false; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: ConfirmationData, + ) { + this.disableDismiss = !!data.disableDismiss; + } + + closeModal(isConfirmed: boolean) { + this.dialogRef.close(isConfirmed); + } + + setAccept(event) { + this.accepted = event.checked ? true : false; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.html new file mode 100644 index 00000000..6a4591a1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.html @@ -0,0 +1,14 @@ +
+ {{ leftButtonText }} + {{ rightButtonText }} +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.scss new file mode 100644 index 00000000..c0335bf6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.scss @@ -0,0 +1,75 @@ +@import '../../../../theme/variables'; + +.-small-button ::ng-deep button { + width: unset; + height: unset; + padding: 0 10px 0 10px; + min-width: 100px; + margin: unset; + font-size: 13px; +} + +.-toggle ::ng-deep button { + box-shadow: unset; + background-color: $transparent !important; + line-height: unset !important; + min-height: 26px; + span { + color: $black; + line-height: unset !important; + } +} + +.-toggle ::ng-deep button.enabled { + background-color: $black !important; + span { + color: $white; + } +} + +.-buttons-container { + width: fit-content; + padding: 5px; + background: rgba(255, 255, 255, 0.1); + border-radius: 100px; + margin: 0px auto; + text-align: center; +} + +.light { + &.-buttons-container { + background: #f1f1f1; + } + + .-toggle ::ng-deep button.enabled { + background-color: #fff !important; + + span { + color: $grey-dark; + } + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .-buttons-container.navbar.light { + border-radius: 20px; + + app-button ::ng-deep .button-container { + display: block; + } + } +} + +.small { + &.-buttons-container { + padding: 2px; + line-height: 0px; + } + + .-small-button ::ng-deep button { + padding: 0 10px 0 10px; + min-width: 70px; + font-size: 9px; + min-height: 16px; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.spec.ts new file mode 100644 index 00000000..7718bbcb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DoubleButtonComponent } from './double-button.component'; + +describe('DoubleButtonComponent', () => { + let component: DoubleButtonComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DoubleButtonComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DoubleButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.ts new file mode 100644 index 00000000..1f9cffe5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.ts @@ -0,0 +1,32 @@ +import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; + +export enum DoubleButtonActive { RightButton, LeftButton } + +@Component({ + selector: 'app-double-button', + templateUrl: './double-button.component.html', + styleUrls: ['./double-button.component.scss'], + encapsulation: ViewEncapsulation.Emulated, +}) +export class DoubleButtonComponent { + @Input() rightButtonText: any; + @Input() leftButtonText: any; + @Input() activeButton: DoubleButtonActive; + @Input() className = ''; + @Output() onStateChange = new EventEmitter(); + ButtonState = DoubleButtonActive; + + onRightClick() { + if (this.activeButton === DoubleButtonActive.LeftButton) { + this.activeButton = DoubleButtonActive.RightButton; + this.onStateChange.emit(DoubleButtonActive.RightButton); + } + } + + onLeftClick() { + if (this.activeButton === DoubleButtonActive.RightButton) { + this.activeButton = DoubleButtonActive.LeftButton; + this.onStateChange.emit(DoubleButtonActive.LeftButton); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.html new file mode 100644 index 00000000..65c509f8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.html @@ -0,0 +1,37 @@ + + + + + +
+ +
{{ 'hardware-wallet.added.added1' | translate }}
+
+
+ +
+
+
{{ 'hardware-wallet.added.characters-warning' | translate }}
+ +
{{ 'hardware-wallet.added.added2' | translate }}
+
+ +
+ + {{ (currentState === states.Finished ? 'hardware-wallet.added.ok' : 'hardware-wallet.general.close') | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.scss new file mode 100644 index 00000000..62b0af06 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.scss @@ -0,0 +1,11 @@ +@import '../../../../../theme/_variables.scss'; + +.upper-text { + margin-top: 10px; + margin-bottom: 10px; +} + +.warning { + margin: -20px 0 20px; + color: $grey; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.spec.ts new file mode 100644 index 00000000..b5718ae4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwAddedDialogComponent } from './hw-added-dialog.component'; + +describe('HwAddedDialogComponent', () => { + let component: HwAddedDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwAddedDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwAddedDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.ts new file mode 100644 index 00000000..0e1e34b1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.ts @@ -0,0 +1,97 @@ +import { Component, Inject, OnDestroy, ViewChild, ElementRef } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA, MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { WalletService } from '../../../../services/wallet.service'; +import { HwWalletService, OperationResults } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { Wallet } from '../../../../app.datatypes'; +import { ChangeNameComponent, ChangeNameData } from '../../../pages/wallets/change-name/change-name.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-hw-added-dialog', + templateUrl: './hw-added-dialog.component.html', + styleUrls: ['./hw-added-dialog.component.scss'], +}) +export class HwAddedDialogComponent extends HwDialogBaseComponent implements OnDestroy { + @ViewChild('input') input: ElementRef; + wallet: Wallet; + form: FormGroup; + maxHwWalletLabelLength = HwWalletService.maxLabelLength; + + private initialLabel: string; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private walletService: WalletService, + hwWalletService: HwWalletService, + private formBuilder: FormBuilder, + private dialog: MatDialog, + private msgBarService: MsgBarService, + ) { + super(hwWalletService, dialogRef); + this.operationSubscription = this.walletService.createHardwareWallet().subscribe(wallet => { + this.operationSubscription = this.walletService.getHwFeaturesAndUpdateData(wallet).subscribe(() => { + this.wallet = wallet; + this.initialLabel = wallet.label; + + this.form = this.formBuilder.group({ + label: [wallet.label, Validators.required], + }); + + this.closeIfHwDisconnected = false; + this.currentState = this.states.Finished; + this.data.requestOptionsComponentRefresh(); + + setTimeout(() => this.input.nativeElement.focus()); + }, err => this.processError(err)); + }, err => this.processError(err)); + } + + private processError(err: any) { + if (err.result && err.result === OperationResults.Disconnected) { + this.closeModal(); + + return; + } + + let errorMsg = 'hardware-wallet.general.generic-error-internet'; + + if (err['_body']) { + errorMsg = err['_body']; + } + this.showResult({ + text: errorMsg, + icon: this.msgIcons.Error, + }); + this.data.requestOptionsComponentRefresh(errorMsg); + } + + ngOnDestroy() { + super.ngOnDestroy(); + this.msgBarService.hide(); + } + + saveNameAndCloseModal() { + if (this.form.value.label === this.initialLabel) { + this.closeModal(); + } else { + this.msgBarService.hide(); + + const config = new MatDialogConfig(); + config.width = '400px'; + config.data = new ChangeNameData(); + (config.data as ChangeNameData).wallet = this.wallet; + (config.data as ChangeNameData).newName = this.form.value.label; + this.dialog.open(ChangeNameComponent, config).afterClosed().subscribe(result => { + if (result && !result.errorMsg) { + this.closeModal(); + } else if (result.errorMsg) { + this.msgBarService.showError(result.errorMsg); + } + }); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.html new file mode 100644 index 00000000..d690d9eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.html @@ -0,0 +1,35 @@ + +
+ + +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ +
+ + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.spec.ts new file mode 100644 index 00000000..10473f02 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwBackupDialogComponent } from './hw-backup-dialog.component'; + +describe('HwBackupDialogComponent', () => { + let component: HwBackupDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwBackupDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwBackupDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.ts new file mode 100644 index 00000000..8d56af66 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.ts @@ -0,0 +1,35 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-backup-dialog', + templateUrl: './hw-backup-dialog.component.html', + styleUrls: ['./hw-backup-dialog.component.scss'], +}) +export class HwBackupDialogComponent extends HwDialogBaseComponent { + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } + + requestBackup() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.backup().subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.general.completed', + icon: this.msgIcons.Success, + }); + this.data.requestOptionsComponentRefresh(null, true); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.html new file mode 100644 index 00000000..2bcf68ee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.html @@ -0,0 +1,20 @@ + + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.spec.ts new file mode 100644 index 00000000..c27ded44 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwChangePinDialogComponent } from './hw-change-pin-dialog.component'; + +describe('HwChangePinDialogComponent', () => { + let component: HwChangePinDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwChangePinDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwChangePinDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.ts new file mode 100644 index 00000000..456dd85e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.ts @@ -0,0 +1,42 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { AppConfig } from '../../../../app.config'; + +@Component({ + selector: 'app-hw-change-pin-dialog', + templateUrl: './hw-change-pin-dialog.component.html', + styleUrls: ['./hw-change-pin-dialog.component.scss'], +}) +export class HwChangePinDialogComponent extends HwDialogBaseComponent { + changingExistingPin: boolean; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + + this.changingExistingPin = data.walletHasPin; + + this.operationSubscription = this.hwWalletService.getFeatures().flatMap(features => { + if (!AppConfig.useHwWalletDaemon) { + return this.hwWalletService.changePin(features.rawResponse.pinProtection); + } else { + return this.hwWalletService.changePin(features.rawResponse.pin_protection); + } + }).subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.general.completed', + icon: this.msgIcons.Success, + }); + this.data.requestOptionsComponentRefresh(null, true); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.html new file mode 100644 index 00000000..7f018a20 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.html @@ -0,0 +1,18 @@ + + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.spec.ts new file mode 100644 index 00000000..4ec1fa3e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwConfirmAddressDialogComponent } from './hw-confirm-address-dialog.component'; + +describe('HwConfirmAddressDialogComponent', () => { + let component: HwConfirmAddressDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwConfirmAddressDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwConfirmAddressDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.ts new file mode 100644 index 00000000..be7ff353 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.ts @@ -0,0 +1,39 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { Address } from '../../../../app.datatypes'; +import { WalletService } from '../../../../services/wallet.service'; + +export class AddressConfirmationParams { + address: Address; + addressIndex: number; + showCompleteConfirmation: boolean; +} + +@Component({ + selector: 'app-hw-confirm-address-dialog', + templateUrl: './hw-confirm-address-dialog.component.html', + styleUrls: ['./hw-confirm-address-dialog.component.scss'], +}) +export class HwConfirmAddressDialogComponent extends HwDialogBaseComponent { + constructor( + @Inject(MAT_DIALOG_DATA) public data: AddressConfirmationParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + private walletService: WalletService, + ) { + super(hwWalletService, dialogRef); + this.operationSubscription = this.hwWalletService.confirmAddress(data.addressIndex).subscribe( + () => { + this.showResult({ + text: data.showCompleteConfirmation ? 'hardware-wallet.confirm-address.confirmation' : 'hardware-wallet.confirm-address.short-confirmation', + icon: this.msgIcons.Success, + }); + this.data.address.confirmed = true; + this.walletService.saveHardwareWallets(); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.html new file mode 100644 index 00000000..278f33f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.html @@ -0,0 +1,8 @@ + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.spec.ts new file mode 100644 index 00000000..340205d9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwConfirmTxDialogComponent } from './hw-confirm-tx-dialog.component'; + +describe('HwConfirmTxDialogComponent', () => { + let component: HwConfirmTxDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwConfirmTxDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwConfirmTxDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.ts new file mode 100644 index 00000000..6b373b32 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.ts @@ -0,0 +1,20 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService, TxData } from '../../../../services/hw-wallet.service'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-confirm-tx-dialog', + templateUrl: './hw-confirm-tx-dialog.component.html', + styleUrls: ['./hw-confirm-tx-dialog.component.scss'], +}) +export class HwConfirmTxDialogComponent extends HwDialogBaseComponent { + + constructor( + @Inject(MAT_DIALOG_DATA) public data: TxData[], + public dialogRef: MatDialogRef, + hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-dialog-base.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-dialog-base.component.ts new file mode 100644 index 00000000..a0876604 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-dialog-base.component.ts @@ -0,0 +1,89 @@ +import { Component, OnDestroy, ViewChild } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { ISubscription } from 'rxjs/Subscription'; +import { MessageIcons } from './hw-message/hw-message.component'; +import { HwWalletService, OperationResults } from '../../../services/hw-wallet.service'; +import { ButtonComponent } from '../button/button.component'; +import { getHardwareWalletErrorMsg } from '../../../utils/errors'; + +export class ResultProcessingResponse { + text: String; + icon: MessageIcons; +} + +export enum States { + Connecting, + Initial, + Processing, + ShowingResult, + Finished, + Other, +} + +@Component({ + template: '', +}) +export class HwDialogBaseComponent implements OnDestroy { + @ViewChild('closeButton') closeButton: ButtonComponent; + + closeIfHwDisconnected = true; + + msgIcons = MessageIcons; + currentState: States = States.Initial; + states = States; + result: ResultProcessingResponse; + + protected operationSubscription: ISubscription; + private hwConnectionSubscription: ISubscription; + + constructor( + private _hwWalletService: HwWalletService, + public _dialogRef: MatDialogRef, + ) { + this.hwConnectionSubscription = this._hwWalletService.walletConnectedAsyncEvent.subscribe(connected => { + this.hwConnectionChanged(connected); + if (!connected && this.closeIfHwDisconnected) { + this.closeModal(); + } + }); + } + + ngOnDestroy() { + if (this.operationSubscription && !this.operationSubscription.closed) { + this.operationSubscription.unsubscribe(); + } + this.hwConnectionSubscription.unsubscribe(); + } + + closeModal() { + this._dialogRef.close(); + } + + hwConnectionChanged(connected: boolean) { + + } + + protected processResult(result: OperationResults, genericError: string = null) { + if (result && result === OperationResults.Disconnected && this.closeIfHwDisconnected) { + this.closeModal(); + } else if (result) { + this.showResult({ + text: getHardwareWalletErrorMsg(null, {result: result}, genericError), + icon: MessageIcons.Error, + }); + } + } + + protected showResult(result: ResultProcessingResponse, focusButton = true) { + if (result) { + this.currentState = States.ShowingResult; + this.result = result; + + setTimeout(() => { + if (this.closeButton && focusButton) { + this.closeButton.focus(); + } + }); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.html new file mode 100644 index 00000000..519c8379 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.html @@ -0,0 +1,44 @@ + +
+ + +
+
+
+ +
+
+
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.scss new file mode 100644 index 00000000..71c4849e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.scss @@ -0,0 +1,4 @@ +.form-field { + margin-bottom: 0px; + margin-top: 15px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.spec.ts new file mode 100644 index 00000000..60d2b856 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwGenerateSeedDialogComponent } from './hw-generate-seed-dialog.component'; + +describe('HwGenerateSeedDialogComponent', () => { + let component: HwGenerateSeedDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwGenerateSeedDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwGenerateSeedDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.ts new file mode 100644 index 00000000..1e89a3b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.ts @@ -0,0 +1,40 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; + +@Component({ + selector: 'app-hw-generate-seed-dialog', + templateUrl: './hw-generate-seed-dialog.component.html', + styleUrls: ['./hw-generate-seed-dialog.component.scss'], +}) +export class HwGenerateSeedDialogComponent extends HwDialogBaseComponent { + form: FormGroup; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + formBuilder: FormBuilder, + ) { + super(hwWalletService, dialogRef); + + this.form = formBuilder.group({ + words: [24, Validators.required], + }); + } + + startOperation() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.generateMnemonic(this.form.controls['words'].value).subscribe( + () => { + this.data.requestOptionsComponentRefresh(); + this.closeModal(); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.html new file mode 100644 index 00000000..66aefaa2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.html @@ -0,0 +1,32 @@ +
+
+ + done + error_outline + usb + memory + error + touch_app +
+
+
+ {{ upperBigText }} +
+ {{ text }} + {{ linkText }} +
+
+ • {{ output.coins.toString() | amount }} + {{ 'hardware-wallet.create-tx.send-p1' | translate }} {{ output.hours.toString() | amount:false }} + {{ 'hardware-wallet.create-tx.send-p2' | translate }} {{ output.address }} +
+
+ {{ lowerText }} +
+ {{ lowerBigText }} +
+
+ {{ lowerLightText }} +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.scss new file mode 100644 index 00000000..56bd874e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.scss @@ -0,0 +1,70 @@ +@import '../../../../../theme/variables'; + +.content { + display: flex; + + .icon-container { + margin-right: 20px; + + mat-spinner { + display: inline-block; + + height: 36px !important; + width: 36px !important; + + ::ng-deep svg { + height: 36px !important; + width: 36px !important; + } + + ::ng-deep circle { + stroke: $grey-light; + } + } + + i { + font-size: 40px; + } + } + + .text-container { + flex-grow: 1; + align-self: center; + + .link { + color: $blue; + cursor: pointer; + } + + .list { + padding: 10px 0; + + .list-element { + margin: 10px 0; + font-size: 12px; + color: #000000; + font-weight: bold; + } + } + } + + .-red { + color: $red; + } + + .-yellow { + color: $yellow; + } + + .-grey { + color: $grey-light; + } + + .-green { + color: $green; + } + + .-blinking { + animation: alert-blinking 1s linear infinite; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.spec.ts new file mode 100644 index 00000000..3d58fe8e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwMessageComponent } from './hw-message.component'; + +describe('HwMessageComponent', () => { + let component: HwMessageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwMessageComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwMessageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.ts new file mode 100644 index 00000000..7ba234c8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.ts @@ -0,0 +1,36 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { TxData } from '../../../../services/hw-wallet.service'; + +export enum MessageIcons { + None, + Spinner, + Success, + Error, + Usb, + HardwareWallet, + Warning, + Confirm, +} + +@Component({ + selector: 'app-hw-message', + templateUrl: './hw-message.component.html', + styleUrls: ['./hw-message.component.scss'], +}) +export class HwMessageComponent { + @Input() icon: MessageIcons = MessageIcons.HardwareWallet; + @Input() text: string; + @Input() outputsList: TxData[]; + @Input() lowerText: string; + @Input() linkText: string; + @Input() upperBigText: string; + @Input() lowerBigText: string; + @Input() lowerLightText: string; + @Output() linkClicked = new EventEmitter(); + + icons = MessageIcons; + + activateLink() { + this.linkClicked.emit(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.html new file mode 100644 index 00000000..c9a98c64 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.html @@ -0,0 +1,91 @@ + + + + + + + +
+ + + + +
+ error +
+
{{ (securityWarnings.length > 1 ? 'hardware-wallet.options.security-warnings-title' : 'hardware-wallet.options.security-warning-title') | translate}}
+ +
{{ securityWarnings.length > 1 ? ((i + 1) + ')') : '' }} {{ warning | translate}}
+
+
+
+
+ +
{{ 'hardware-wallet.options.options' | translate }}
+
+ +
+ + +
+
+ + + + + +
+
+
+ +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+ +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.scss new file mode 100644 index 00000000..96dab871 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.scss @@ -0,0 +1,41 @@ +@import '../../../../../theme/variables'; + +.alert-box { + margin-top: 25px; +} + +.options-label { + color: $black; + margin-top: 25px; + margin-bottom: 10px; + font-weight: bold; +} + +.option-buttons-container { + margin: 0 -10px; + + button { + width: 100%; + text-align: left; + padding: 10px 10px; + border-bottom: 1px solid #eff0f0; + + &:first-child { + border-top: 1px solid #eff0f0; + } + + .label { + font-size: 13px; + line-height: 22px; + color: $black; + } + + .-red { + color: $red; + } + } +} + +.-blinking { + animation: alert-blinking 1s linear infinite; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.spec.ts new file mode 100644 index 00000000..90b95d7c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwOptionsDialogComponent } from './hw-options-dialog.component'; + +describe('HwOptionsDialogComponent', () => { + let component: HwOptionsDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwOptionsDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwOptionsDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.ts new file mode 100644 index 00000000..e2d5f4ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.ts @@ -0,0 +1,343 @@ +import { Component, OnDestroy, Inject } from '@angular/core'; +import { MatDialogRef, MatDialogConfig, MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService, OperationResults } from '../../../../services/hw-wallet.service'; +import { HwWipeDialogComponent } from '../hw-wipe-dialog/hw-wipe-dialog.component'; +import { ISubscription } from 'rxjs/Subscription'; +import { WalletService, HwSecurityWarnings, HwFeaturesResponse } from '../../../../services/wallet.service'; +import { HwAddedDialogComponent } from '../hw-added-dialog/hw-added-dialog.component'; +import { HwGenerateSeedDialogComponent } from '../hw-generate-seed-dialog/hw-generate-seed-dialog.component'; +import { HwBackupDialogComponent } from '../hw-backup-dialog/hw-backup-dialog.component'; +import { Wallet } from '../../../../app.datatypes'; +import { HwChangePinDialogComponent } from '../hw-change-pin-dialog/hw-change-pin-dialog.component'; +import { HwRestoreSeedDialogComponent } from '../hw-restore-seed-dialog/hw-restore-seed-dialog.component'; +import { Observable } from 'rxjs/Observable'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { HwWalletDaemonService } from '../../../../services/hw-wallet-daemon.service'; +import { HwRemovePinDialogComponent } from '../hw-remove-pin-dialog/hw-remove-pin-dialog.component'; +import { HwUpdateFirmwareDialogComponent } from '../hw-update-firmware-dialog/hw-update-firmware-dialog.component'; +import { HwUpdateAlertDialogComponent } from '../hw-update-alert-dialog/hw-update-alert-dialog.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +export interface ChildHwDialogParams { + wallet: Wallet; + walletHasPin: boolean; + requestOptionsComponentRefresh: any; +} + +@Component({ + selector: 'app-hw-options-dialog', + templateUrl: './hw-options-dialog.component.html', + styleUrls: ['./hw-options-dialog.component.scss'], +}) +export class HwOptionsDialogComponent extends HwDialogBaseComponent implements OnDestroy { + + closeIfHwDisconnected = false; + + newWalletConnected = false; + otherStateBecauseWrongPin = false; + walletName = ''; + customErrorMsg = ''; + firmwareVersion = ''; + + securityWarnings: string[] = []; + firmwareVersionNotVerified: boolean; + outdatedFirmware: boolean; + needsBackup: boolean; + needsPin: boolean; + + private dialogSubscription: ISubscription; + + private completeRecheckRequested = false; + private recheckSecurityOnlyRequested = false; + private showErrorRequested = false; + private wallet: Wallet; + + constructor( + @Inject(MAT_DIALOG_DATA) private onboarding: boolean, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + private dialog: MatDialog, + private walletService: WalletService, + private msgBarService: MsgBarService, + ) { + super(hwWalletService, dialogRef); + + this.checkWallet(true); + } + + ngOnDestroy() { + super.ngOnDestroy(); + this.removeDialogSubscription(); + this.removeOperationSubscription(); + this.msgBarService.hide(); + } + + hwConnectionChanged(connected: boolean) { + this.checkWallet(true); + } + + update() { + this.openUpdateDialog(); + } + + generateMnemonic() { + this.openDialog(HwGenerateSeedDialogComponent); + } + + restoreMnemonic() { + this.openDialog(HwRestoreSeedDialogComponent); + } + + changePin() { + this.openDialog(HwChangePinDialogComponent); + } + + removePin() { + this.openDialog(HwRemovePinDialogComponent); + } + + backup() { + this.openDialog(HwBackupDialogComponent); + } + + wipe() { + this.openDialog(HwWipeDialogComponent); + } + + confirmSeed() { + this.openDialog(HwRestoreSeedDialogComponent); + } + + private openDialog(dialogType) { + this.customErrorMsg = ''; + + this.removeDialogSubscription(); + const config = new MatDialogConfig(); + config.width = '450px'; + config.autoFocus = false; + + config.data = { + wallet: this.wallet, + walletHasPin: !this.needsPin, + requestOptionsComponentRefresh: ((error: string = null, recheckSecurityOnly: boolean = false) => { + if (!error) { + if (!recheckSecurityOnly) { + this.completeRecheckRequested = true; + } else { + this.recheckSecurityOnlyRequested = true; + } + } else { + this.showErrorRequested = true; + this.customErrorMsg = error; + } + }), + }; + + this.dialogSubscription = this.dialog.open(dialogType, config) + .afterClosed().subscribe(() => { + if (this.completeRecheckRequested) { + this.checkWallet(); + } else if (this.recheckSecurityOnlyRequested) { + this.updateSecurityWarningsAndData(false, true).subscribe(); + } else if (this.showErrorRequested) { + this.showError(); + } + this.completeRecheckRequested = false; + this.recheckSecurityOnlyRequested = false; + this.showErrorRequested = false; + }); + } + + private removeDialogSubscription() { + if (this.dialogSubscription) { + this.dialogSubscription.unsubscribe(); + } + } + + private updateSecurityWarningsAndData(dontUpdateWallet = false, waitForResetingCurrentWarnings = false): Observable { + if (!waitForResetingCurrentWarnings) { + this.securityWarnings = []; + } + + return this.walletService.getHwFeaturesAndUpdateData(!dontUpdateWallet ? this.wallet : null).map(response => { + if (waitForResetingCurrentWarnings) { + this.securityWarnings = []; + } + + if (response.securityWarnings.includes(HwSecurityWarnings.FirmwareVersionNotVerified)) { + this.firmwareVersionNotVerified = true; + this.securityWarnings.push('hardware-wallet.options.unchecked-version-warning'); + } else { + this.firmwareVersionNotVerified = false; + } + + if (response.securityWarnings.includes(HwSecurityWarnings.OutdatedFirmware)) { + this.outdatedFirmware = true; + this.securityWarnings.push('hardware-wallet.options.outdated-version-warning'); + } else { + this.outdatedFirmware = false; + } + + if (!dontUpdateWallet && response.securityWarnings.includes(HwSecurityWarnings.NeedsBackup)) { + this.needsBackup = true; + this.securityWarnings.push('hardware-wallet.options.backup-warning'); + } else { + this.needsBackup = false; + } + + if (!dontUpdateWallet && response.securityWarnings.includes(HwSecurityWarnings.NeedsPin)) { + this.needsPin = true; + this.securityWarnings.push('hardware-wallet.options.pin-warning'); + } else { + this.needsPin = false; + } + + if (!dontUpdateWallet) { + this.walletName = this.wallet.label; + } + + if (response.walletNameUpdated) { + this.msgBarService.showWarning('hardware-wallet.general.name-updated'); + } + + this.firmwareVersion = response.features.fw_major + '.' + response.features.fw_minor + '.' + response.features.fw_patch; + + return response; + }); + } + + private checkWallet(suggestToUpdate = false) { + this.wallet = null; + this.showResult({ + text: 'hardware-wallet.options.connecting', + icon: this.msgIcons.Spinner, + }, false); + + this.removeOperationSubscription(); + + this.operationSubscription = this.hwWalletService.getDeviceConnected().subscribe(connected => { + if (!connected) { + this.showResult({ + text: 'hardware-wallet.options.disconnected', + icon: this.msgIcons.Usb, + }); + } else { + this.operationSubscription = this.hwWalletService.getFeatures(false).subscribe(result => { + if (result.rawResponse.bootloader_mode) { + this.openUpdateDialog(); + } else { + this.continueCheckingWallet(suggestToUpdate); + } + }, () => this.continueCheckingWallet(suggestToUpdate)); + } + }, err => { + if (err['_body'] && err['_body'] === HwWalletDaemonService.errorConnectingWithTheDaemon) { + this.showResult({ + text: 'hardware-wallet.errors.daemon-connection', + icon: this.msgIcons.Error, + }); + } else { + this.showError(); + } + }); + } + + private continueCheckingWallet(suggestToUpdate) { + this.operationSubscription = this.hwWalletService.getAddresses(1, 0).subscribe( + response => { + this.operationSubscription = this.walletService.wallets.first().subscribe(wallets => { + const alreadySaved = wallets.some(wallet => { + const found = wallet.addresses[0].address === response.rawResponse[0] && wallet.isHardware; + if (found) { + this.wallet = wallet; + this.walletName = wallet.label; + } + + return found; + }); + if (alreadySaved) { + this.operationSubscription = this.updateSecurityWarningsAndData().subscribe(result => { + if (suggestToUpdate && result.securityWarnings.find(warning => warning === HwSecurityWarnings.OutdatedFirmware)) { + this.openUpdateWarning(); + } + + if (!this.onboarding) { + this.currentState = this.states.Finished; + this.newWalletConnected = false; + } else { + this.hwWalletService.showOptionsWhenPossible = true; + this.dialogRef.close(true); + } + }); + } else { + this.openDialog(HwAddedDialogComponent); + } + }); + }, + err => { + if (err.result && err.result === OperationResults.Timeout) { + this.operationSubscription = this.hwWalletService.getFeatures(false).subscribe(result => { + if (result.rawResponse.bootloader_mode) { + this.openUpdateDialog(); + } else { + this.showError(); + } + }, () => this.showError()); + } else if (err.result && err.result === OperationResults.WithoutSeed) { + this.currentState = this.states.Finished; + this.newWalletConnected = true; + + this.operationSubscription = this.updateSecurityWarningsAndData(true).subscribe(result => { + if (suggestToUpdate && result.securityWarnings.find(warning => warning === HwSecurityWarnings.OutdatedFirmware)) { + this.openUpdateWarning(); + } + }); + } else if (err.result && err.result === OperationResults.FailedOrRefused) { + this.currentState = this.states.Other; + this.otherStateBecauseWrongPin = false; + } else if (err.result && err.result === OperationResults.WrongPin) { + this.currentState = this.states.Other; + this.otherStateBecauseWrongPin = true; + } else { + this.processResult(err.result); + } + }, + ); + } + + private removeOperationSubscription() { + if (this.operationSubscription) { + this.operationSubscription.unsubscribe(); + } + } + + private openUpdateWarning() { + const config = new MatDialogConfig(); + config.width = '450px'; + config.autoFocus = false; + + this.dialog.open(HwUpdateAlertDialogComponent, config).afterClosed().subscribe(update => { + if (update) { + this.openUpdateDialog(); + } + }); + } + + private openUpdateDialog() { + const config = new MatDialogConfig(); + config.width = '450px'; + config.autoFocus = false; + + this.dialog.open(HwUpdateFirmwareDialogComponent, config); + + this.closeModal(); + } + + private showError() { + this.showResult({ + text: this.customErrorMsg ? this.customErrorMsg : 'hardware-wallet.general.generic-error', + icon: this.msgIcons.Error, + }); + this.customErrorMsg = ''; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.html new file mode 100644 index 00000000..b7fcacca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.html @@ -0,0 +1,45 @@ + +
+
+
+ + {{ 'hardware-wallet.enter-pin.instructions-tx' | translate }} + + + {{ 'hardware-wallet.enter-pin.instructions-change' | translate }} + + {{ 'hardware-wallet.enter-pin.instructions' | translate }} + {{ 'hardware-wallet.enter-pin.help' | translate }} +
+ +
+
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ +
+
+
+ + {{ 'hardware-wallet.general.continue' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.scss new file mode 100644 index 00000000..304cbb1e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.scss @@ -0,0 +1,37 @@ +@import '../../../../../theme/variables'; + +mat-input-container { + width: 100%; +} + +.form-field { + input { + font-size: 25px; + letter-spacing: 15px; + text-align: center; + } + + .info { + text-align: center; + + .link { + color: $blue; + cursor: pointer; + } + } +} + +.num-pad-row { + display: flex; + + button { + flex-grow: 1; + height: 50px; + border: #eff0f0 solid 1px; + margin: 2px; + + span { + color: $black; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.spec.ts new file mode 100644 index 00000000..35b64252 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwPinDialogComponent } from './hw-pin-dialog.component'; + +describe('HwPinDialogComponent', () => { + let component: HwPinDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwPinDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwPinDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.ts new file mode 100644 index 00000000..671bab9a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, HostListener, Inject } from '@angular/core'; +import { FormBuilder, Validators, FormGroup } from '@angular/forms'; +import { MatDialogRef, MatDialog, MatDialogConfig, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { HwPinHelpDialogComponent } from '../hw-pin-help-dialog/hw-pin-help-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { ChangePinStates } from '../../../../services/hw-wallet-pin.service'; + +export interface HwPinDialogParams { + signingTx: boolean; + changingPin: boolean; + changePinState: ChangePinStates; +} + +@Component({ + selector: 'app-hw-pin-dialog', + templateUrl: './hw-pin-dialog.component.html', + styleUrls: ['./hw-pin-dialog.component.scss'], +}) +export class HwPinDialogComponent extends HwDialogBaseComponent implements OnInit { + form: FormGroup; + changePinStates = ChangePinStates; + buttonsContent = '•'; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: HwPinDialogParams, + public dialogRef: MatDialogRef, + private formBuilder: FormBuilder, + private dialog: MatDialog, + hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } + + ngOnInit() { + this.form = this.formBuilder.group({ + pin: ['', Validators.compose([Validators.required, Validators.minLength(4)])], + }); + } + + get title(): string { + if (!this.data.changingPin) { + return 'hardware-wallet.enter-pin.title'; + } else if (this.data.changePinState === ChangePinStates.RequestingNewPin) { + return 'hardware-wallet.enter-pin.title-change-new'; + } else if (this.data.changePinState === ChangePinStates.ConfirmingNewPin) { + return 'hardware-wallet.enter-pin.title-change-confirm'; + } else { + return 'hardware-wallet.enter-pin.title-change-current'; + } + } + + openHelp() { + this.dialog.open(HwPinHelpDialogComponent, { + width: '450px', + }); + } + + @HostListener('window:keyup', ['$event']) + keyEvent(event: KeyboardEvent) { + const key = parseInt(event.key, 10); + if (key > 0 && key < 10) { + this.addNumber(key.toString()); + } else if (event.keyCode === 8) { + this.removeNumber(); + } else if (event.keyCode === 13) { + this.sendPin(); + } + } + + addNumber(number: string) { + const currentValue: string = this.form.value.pin; + if (currentValue.length < 8) { + this.form.get('pin').setValue(currentValue + number); + } + } + + removeNumber() { + const currentValue: string = this.form.value.pin; + this.form.get('pin').setValue(currentValue.substring(0, currentValue.length - 1)); + } + + sendPin() { + if (this.form.valid) { + this.dialogRef.close(this.form.value.pin); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.html new file mode 100644 index 00000000..d3a014f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.html @@ -0,0 +1,5 @@ + +

{{ 'hardware-wallet.pin-help.part1' | translate }}

+

{{ 'hardware-wallet.pin-help.part2' | translate }}

+

{{ 'hardware-wallet.pin-help.part3' | translate }}

+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.spec.ts new file mode 100644 index 00000000..f5ade55b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwPinHelpDialogComponent } from './hw-pin-help-dialog.component'; + +describe('HwPinHelpDialogComponent', () => { + let component: HwPinHelpDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwPinHelpDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwPinHelpDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.ts new file mode 100644 index 00000000..76730c76 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-hw-added-dialog', + templateUrl: './hw-pin-help-dialog.component.html', + styleUrls: ['./hw-pin-help-dialog.component.scss'], +}) +export class HwPinHelpDialogComponent { + + constructor( + public dialogRef: MatDialogRef, + ) { } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.html new file mode 100644 index 00000000..0876141f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.html @@ -0,0 +1,42 @@ + +
+ + +
+ {{ 'hardware-wallet.remove-pin.check' | translate }} + +
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ +
+ + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
+
\ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.spec.ts new file mode 100644 index 00000000..eb316b55 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwRemovePinDialogComponent } from './hw-remove-pin-dialog.component'; + +describe('HwRemovePinDialogComponent', () => { + let component: HwRemovePinDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwRemovePinDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwRemovePinDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.ts new file mode 100644 index 00000000..dd8298e8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.ts @@ -0,0 +1,41 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-remove-pin-dialog', + templateUrl: './hw-remove-pin-dialog.component.html', + styleUrls: ['./hw-remove-pin-dialog.component.scss'], +}) +export class HwRemovePinDialogComponent extends HwDialogBaseComponent { + confirmed = false; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } + + setConfirmed(event) { + this.confirmed = event.checked; + } + + requestRemoval() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.removePin().subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.general.completed', + icon: this.msgIcons.Success, + }); + this.data.requestOptionsComponentRefresh(null, true); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.html new file mode 100644 index 00000000..0ce4ede2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.html @@ -0,0 +1,51 @@ + + +
+ + +
+
+
+ +
+
+
+ +
{{ 'hardware-wallet.restore-seed.warning' | translate }}
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.scss new file mode 100644 index 00000000..0f3a026e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.scss @@ -0,0 +1,11 @@ +@import '../../../../../theme/variables'; +.form-field { + margin-bottom: 0px; + margin-top: 15px; +} + +.warning { + margin-top: 15px; + color: $red; + text-align: center; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.spec.ts new file mode 100644 index 00000000..4a116aee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwRestoreSeedDialogComponent } from './hw-restore-seed-dialog.component'; + +describe('HwRestoreSeedDialogComponent', () => { + let component: HwRestoreSeedDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwRestoreSeedDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwRestoreSeedDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.ts new file mode 100644 index 00000000..4c408dcd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.ts @@ -0,0 +1,50 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; + +@Component({ + selector: 'app-hw-restore-seed-dialog', + templateUrl: './hw-restore-seed-dialog.component.html', + styleUrls: ['./hw-restore-seed-dialog.component.scss'], +}) +export class HwRestoreSeedDialogComponent extends HwDialogBaseComponent { + form: FormGroup; + justCheckingSeed: boolean; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + formBuilder: FormBuilder, + ) { + super(hwWalletService, dialogRef); + + this.form = formBuilder.group({ + words: [24, Validators.required], + }); + + this.justCheckingSeed = !!this.data.wallet; + } + + startOperation() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.recoverMnemonic(this.form.controls['words'].value, this.justCheckingSeed).subscribe( + () => { + if (!this.justCheckingSeed) { + this.data.requestOptionsComponentRefresh(); + this.closeModal(); + } else { + this.showResult({ + text: 'hardware-wallet.restore-seed.correct-seed', + icon: this.msgIcons.Success, + }); + } + }, + err => this.processResult(err.result, 'hardware-wallet.general.simple-error'), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.html new file mode 100644 index 00000000..609d6a63 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.html @@ -0,0 +1,15 @@ + + + +
+ + {{ 'hardware-wallet.update-firmware-warning.cancel' | translate }} + + + {{ 'hardware-wallet.update-firmware-warning.update' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.spec.ts new file mode 100644 index 00000000..924da47b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwUpdateAlertDialogComponent } from './hw-update-alert-dialog.component'; + +describe('HwUpdateAlertDialogComponent', () => { + let component: HwUpdateAlertDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwUpdateAlertDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwUpdateAlertDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.ts new file mode 100644 index 00000000..621cfbc8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-update-alert-dialog', + templateUrl: './hw-update-alert-dialog.component.html', + styleUrls: ['./hw-update-alert-dialog.component.scss'], +}) +export class HwUpdateAlertDialogComponent extends HwDialogBaseComponent { + + constructor( + public dialogRef: MatDialogRef, + hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } + + update() { + this._dialogRef.close(true); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.html new file mode 100644 index 00000000..cfc8b1f5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.html @@ -0,0 +1,48 @@ + +
+ + +
+ {{ 'hardware-wallet.update-firmware.check' | translate }} + +
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ +
+ + + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
+
\ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.spec.ts new file mode 100644 index 00000000..163e1cf6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwUpdateFirmwareDialogComponent } from './hw-update-firmware-dialog.component'; + +describe('HwUpdateFirmwareDialogComponent', () => { + let component: HwUpdateFirmwareDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwUpdateFirmwareDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwUpdateFirmwareDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.ts new file mode 100644 index 00000000..b19dbc62 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.ts @@ -0,0 +1,153 @@ +import { Component, ViewChild, OnDestroy } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { HwWalletService, OperationResults } from '../../../../services/hw-wallet.service'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { ButtonComponent } from '../../button/button.component'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { TranslateService } from '@ngx-translate/core'; +import { MsgBarService } from '../../../../services/msg-bar.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { Observable } from 'rxjs/Observable'; + +@Component({ + selector: 'app-hw-update-firmware-dialog', + templateUrl: './hw-update-firmware-dialog.component.html', + styleUrls: ['./hw-update-firmware-dialog.component.scss'], +}) +export class HwUpdateFirmwareDialogComponent extends HwDialogBaseComponent implements OnDestroy { + + closeIfHwDisconnected = false; + + @ViewChild('button') button: ButtonComponent; + + currentState = this.states.Connecting; + confirmed = false; + + deviceInBootloaderMode = false; + deviceHasFirmware = true; + + private checkDeviceSubscription: ISubscription; + + get title(): string { + if (this.currentState === this.states.Connecting) { + return 'hardware-wallet.update-firmware.title-connecting'; + } else if (this.deviceHasFirmware) { + return 'hardware-wallet.update-firmware.title-update'; + } + + return 'hardware-wallet.update-firmware.title-install'; + } + + get text(): string { + if (!this.deviceHasFirmware) { + return 'hardware-wallet.update-firmware.text-no-firmware'; + } + + if (this.deviceInBootloaderMode) { + return 'hardware-wallet.update-firmware.text-bootloader'; + } + + return 'hardware-wallet.update-firmware.text-not-bootloader'; + } + + constructor( + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + private msgBarService: MsgBarService, + private translateService: TranslateService, + ) { + super(hwWalletService, dialogRef); + this.checkDevice(false); + } + + ngOnDestroy() { + super.ngOnDestroy(); + this.msgBarService.hide(); + this.closeCheckDeviceSubscription(); + } + + setConfirmed(event) { + this.confirmed = event.checked; + } + + startUpdating() { + this.msgBarService.hide(); + this.showResult({ + text: 'hardware-wallet.update-firmware.text-downloading', + icon: this.msgIcons.Spinner, + }); + + this.closeCheckDeviceSubscription(); + + this.operationSubscription = this.hwWalletService.updateFirmware(() => this.currentState = this.states.Processing).subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.update-firmware.finished', + icon: this.msgIcons.Success, + }); + }, + err => { + if (err.result !== null && err.result !== undefined && err.result === OperationResults.Success) { + this.showResult({ + text: 'hardware-wallet.update-firmware.finished', + icon: this.msgIcons.Success, + }); + } else if (err.result && err.result === OperationResults.Timeout) { + this.showResult({ + text: 'hardware-wallet.update-firmware.timeout', + icon: this.msgIcons.Error, + }); + } else { + if (err.result) { + const errorMsg = getHardwareWalletErrorMsg(this.translateService, err); + setTimeout(() => { + this.msgBarService.showError(errorMsg); + }); + } else { + setTimeout(() => { + this.msgBarService.showError(err); + }); + } + + this.checkDevice(false); + + this.currentState = this.states.Initial; + } + }, + ); + } + + private checkDevice(delay = true) { + this.closeCheckDeviceSubscription(); + + this.checkDeviceSubscription = Observable.of(0).delay(delay ? 1000 : 0).flatMap(() => this.hwWalletService.getFeatures(false)).subscribe(response => { + this.deviceInBootloaderMode = response.rawResponse.bootloader_mode; + if (this.deviceInBootloaderMode) { + this.deviceHasFirmware = response.rawResponse.firmware_present; + } else { + this.deviceHasFirmware = true; + } + + if (this.currentState === this.states.Connecting) { + this.currentState = this.states.Initial; + } + + this.checkDevice(); + }, () => { + this.deviceInBootloaderMode = false; + this.deviceHasFirmware = true; + + if (this.currentState === this.states.Connecting) { + this.currentState = this.states.Initial; + } + + this.checkDevice(); + }); + } + + private closeCheckDeviceSubscription() { + if (this.checkDeviceSubscription) { + this.checkDeviceSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.html new file mode 100644 index 00000000..9d4a5834 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.html @@ -0,0 +1,43 @@ + +
+ + +
+ {{ 'hardware-wallet.wipe.confirm-delete' | translate }} + +
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ +
+ + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.spec.ts new file mode 100644 index 00000000..b2ee2076 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwWipeDialogComponent } from './hw-wipe-dialog.component'; + +describe('HwWipeDialogComponent', () => { + let component: HwWipeDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwWipeDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwWipeDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.ts new file mode 100644 index 00000000..31942cf7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.ts @@ -0,0 +1,52 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { WalletService } from '../../../../services/wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-wipe-dialog', + templateUrl: './hw-wipe-dialog.component.html', + styleUrls: ['./hw-wipe-dialog.component.scss'], +}) +export class HwWipeDialogComponent extends HwDialogBaseComponent { + showDeleteFromList = true; + deleteFromList = true; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + private walletService: WalletService, + ) { + super(hwWalletService, dialogRef); + + if (!data.wallet) { + this.showDeleteFromList = false; + this.deleteFromList = false; + } + } + + setDeleteFromList(event) { + this.deleteFromList = event.checked; + } + + requestWipe() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.wipe().subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.general.completed', + icon: this.msgIcons.Success, + }); + this.data.requestOptionsComponentRefresh(); + if (this.deleteFromList) { + this.walletService.deleteHardwareWallet(this.data.wallet).subscribe(); + } + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.html new file mode 100644 index 00000000..55f2ef24 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.html @@ -0,0 +1,62 @@ +
+
+ +
+
+

{{ percentage | percent:'1.2-2' }}

+

{{ coins | amount:true:'first' }} {{ coins | amount:true:'last' }}

+

 

+

+ + {{ (coins * price) | currency:'USD':'symbol':'1.2-2' }} + - + ({{ price | currency:'USD':'symbol':'1.2-2' }}) + + {{ 'common.loading' | translate }} +

+
+
+
+

+ {{ 'header.syncing-blocks' | translate }} + {{ current && highest ? '(' + current + '/' + highest + ')' : '...' }} +

+

{{ hours | amount:false }}

+
+
+ + + +
+ {{ 'header.update1' | translate }} + v{{ appService.lastestVersion }} + {{ 'header.update2' | translate }} +
+
+ +
+ {{ 'header.errors.no-backend1' | translate }} + {{ 'header.errors.no-backend2' | translate }} + {{ 'header.errors.no-backend3' | translate }} +
+
{{ 'header.errors.csrf' | translate }}
+
+ +
{{ 'header.errors.no-connections' | translate }}
+
+ +
+ {{ 'header.pending-txs1' | translate }} + {{ 'header.pending-txs2' | translate }} + {{ 'header.pending-txs3' | translate }} +
+
+ {{ 'header.synchronizing' | translate }} +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.scss new file mode 100644 index 00000000..a07d3d1d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.scss @@ -0,0 +1,73 @@ +@import '../../../../theme/variables'; + +.-container { + background-color: #fbfbfb; + border-bottom: 2px solid rgba(30, 34, 39, 0.05); +} + +.large-header { + background: $gradient-blue-dark; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(left top, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* Standard syntax */ + background-size: 100% auto; + display: flex; + flex-flow: column; + align-items: stretch; + min-height: 190px; +} + +.balance-container { + align-items: center; + color: $white; + display: flex; + flex: 1 1 auto; + font-size: 12px; + justify-content: center; + text-align: center; + + .balance { + .coins { + line-height: 1; + margin: 0 0 0.5em; + + span { + font-size: 4em; + } + } + } + + .dollars { + margin: 0; + } +} + +.hour-balance { + text-align: center; + + p { + background-color: rgba(255, 255, 255, 0.3); + border-radius: 15px; + color: $black; + display: inline-block; + font-size: 12px; + line-height: 22px; + margin: 1em 0 2em; + padding: 0 30px; + } +} + +.notification-bar { + background-color: #F44A4D; + color:#FBFBFB; + + div { + margin: auto; + + a { + text-decoration: none; + color: #FFEBEE; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.spec.ts new file mode 100644 index 00000000..89380b40 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HeaderComponent } from './header.component'; + +describe('HeaderComponent', () => { + let component: HeaderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HeaderComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.ts new file mode 100644 index 00000000..cccb8605 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.ts @@ -0,0 +1,101 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { PriceService } from '../../../services/price.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { WalletService } from '../../../services/wallet.service'; +import { BlockchainService } from '../../../services/blockchain.service'; +import { AppService } from '../../../services/app.service'; +import 'rxjs/add/operator/skip'; +import 'rxjs/add/operator/take'; +import { BigNumber } from 'bignumber.js'; +import { NetworkService } from '../../../services/network.service'; +import { AppConfig } from '../../../app.config'; + +@Component({ + selector: 'app-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.scss'], +}) +export class HeaderComponent implements OnInit, OnDestroy { + @Input() headline: string; + + addresses = []; + current: number; + highest: number; + percentage: number; + querying = true; + hasPendingTxs: boolean; + price: number; + synchronized = true; + walletDownloadUrl = AppConfig.walletDownloadUrl; + + private subscriptionsGroup: ISubscription[] = []; + private synchronizedSubscription: ISubscription; + // This should be deleted. View the comment in the constructor. + // private fetchVersionError: string; + + get loading() { + return !this.current || !this.highest || this.current !== this.highest || !this.coins || this.coins === 'NaN' || !this.hours || this.hours === 'NaN'; + } + + get coins() { + let coins = new BigNumber('0'); + this.addresses.map(addr => coins = coins.plus(addr.coins)); + + return coins.decimalPlaces(6).toString(); + } + + get hours() { + let hours = new BigNumber('0'); + this.addresses.map(addr => hours = hours.plus(addr.hours)); + + return hours.decimalPlaces(0).toString(); + } + + constructor( + public appService: AppService, + public networkService: NetworkService, + private blockchainService: BlockchainService, + private priceService: PriceService, + private walletService: WalletService, + ) { } + + ngOnInit() { + this.subscriptionsGroup.push(this.blockchainService.progress + .filter(response => !!response) + .subscribe(response => { + this.querying = false; + this.highest = response.highest; + this.current = response.current; + this.percentage = this.current && this.highest ? (this.current / this.highest) : 0; + + // Adding the code here prevents the warning from flashing if the wallet is synchronized. Also, adding the + // subscription to this.subscription causes problems. + if (!this.synchronizedSubscription) { + this.synchronizedSubscription = this.blockchainService.synchronized.subscribe(value => this.synchronized = value); + } + })); + + this.subscriptionsGroup.push(this.priceService.price.subscribe(price => this.price = price)); + + this.subscriptionsGroup.push(this.walletService.allAddresses().subscribe(addresses => { + this.addresses = addresses.reduce((array, item) => { + if (!array.find(addr => addr.address === item.address)) { + array.push(item); + } + + return array; + }, []); + })); + + this.subscriptionsGroup.push(this.walletService.pendingTransactions().subscribe(txs => { + this.hasPendingTxs = txs.user.length > 0; + })); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + if (this.synchronizedSubscription) { + this.synchronizedSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html new file mode 100644 index 00000000..2a06b306 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html @@ -0,0 +1,35 @@ +
+
+
+ + {{ 'title.wallets' | translate }} +
+
+ + {{ 'title.send' | translate }} +
+
+ + {{ 'title.history' | translate }} +
+
+
+ + {{ 'title.buy-coin' | translate }} +
+
+ + {{ 'title.buy-coin' | translate }} +
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss new file mode 100644 index 00000000..ebd1b58d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss @@ -0,0 +1,41 @@ +@import '../../../../../theme/variables'; + +:host { + background-color: #fbfbfb; + min-height: 66px; +} + +.-buttons { + display: flex; + width: 100%; + + .-button { + cursor: pointer; + padding: 0 20px; + + img { + display: inline-block; + float: left; + height: 66px; + padding: 17px 0; + width: 32px; + } + + span { + display: inline-block; + font-size: 14px; + height: 66px; + line-height: 66px; + margin: 0 5px; + } + } + + .-low-opacity { + opacity: 0.2; + } + + .-switch { + align-self: center; + padding: 0 20px; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts new file mode 100644 index 00000000..98bcd493 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NavBarComponent } from './nav-bar.component'; + +describe('NavBarComponent', () => { + let component: NavBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NavBarComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts new file mode 100644 index 00000000..1cdee46e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts @@ -0,0 +1,22 @@ +import { Component } from '@angular/core'; +import { AppConfig } from '../../../../app.config'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { environment } from '../../../../../environments/environment'; + +@Component({ + selector: 'app-nav-bar', + templateUrl: './nav-bar.component.html', + styleUrls: ['./nav-bar.component.scss'], +}) +export class NavBarComponent { + otcEnabled = AppConfig.otcEnabled; + exchangeEnabled = !!environment.swaplab.apiKey; + + constructor( + public navbarService: NavBarService, + ) { } + + changeActiveComponent(value) { + this.navbarService.setActiveComponent(value); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html new file mode 100644 index 00000000..e50c4e6c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html @@ -0,0 +1,30 @@ +
+
+ {{ headline }} +
+
+ + + + + + + + + + + {{ 'title.explorer' | translate }} +
+
+ + {{ language.name }} +
+
+ + + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.scss new file mode 100644 index 00000000..5f21efb2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.scss @@ -0,0 +1,56 @@ +@import '../../../../../theme/variables'; + +:host { + display: flex; + color: $white; + width: 100%; +} + +.buttons-left { + display: inline-block; + padding: 0 10px; + width: 120px; +} + +.title { + font-size: $font-size-standard; + font-weight: 700; + display: inline; + flex: 1 1 auto; + letter-spacing: $letter-spacing-wide; + line-height: 50px; + text-align: center; +} + +.buttons-right { + display: inline-block; + text-align: right; + width: 120px; + + button { + display: inline-block; + } +} + +button { + height: 50px; + width: 50px; +} + +.color-primary { + color: #0072FF; +} + +.separator { + width: 100%; + height: 2px; + background-color: $grey-very-light; + margin: 8px 0px; +} + +.flag { + width: 16px; + height: 16px; + position: relative; + top: 3px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.spec.ts new file mode 100644 index 00000000..2028774e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TopBarComponent } from './top-bar.component'; + +describe('TopBarComponent', () => { + let component: TopBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TopBarComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TopBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.ts new file mode 100644 index 00000000..7874a8e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.ts @@ -0,0 +1,43 @@ +import { Component, Input, OnInit, OnDestroy } from '@angular/core'; +import { Subscription } from 'rxjs/Subscription'; +import { AppService } from '../../../../services/app.service'; +import { LanguageData, LanguageService } from '../../../../services/language.service'; +import { openChangeLanguageModal } from '../../../../utils'; +import { MatDialog } from '@angular/material'; + +@Component({ + selector: 'app-top-bar', + templateUrl: './top-bar.component.html', + styleUrls: ['./top-bar.component.scss'], +}) +export class TopBarComponent implements OnInit, OnDestroy { + @Input() headline: string; + + language: LanguageData; + + private subscription: Subscription; + + constructor( + public appService: AppService, + private languageService: LanguageService, + private dialog: MatDialog, + ) {} + + ngOnInit() { + this.subscription = this.languageService.currentLanguage + .subscribe(lang => this.language = lang); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + changelanguage() { + openChangeLanguageModal(this.dialog) + .subscribe(response => { + if (response) { + this.languageService.changeLanguage(response); + } + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.html new file mode 100644 index 00000000..0c170845 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.html @@ -0,0 +1,10 @@ +
+
+ +

{{ 'common.loading' | translate }}

+
+
+ announcement +

{{ noDataText | translate }}

+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.scss new file mode 100644 index 00000000..796f89ab --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.scss @@ -0,0 +1,25 @@ +@import '../../../../theme/variables'; + +.-content { + text-align: center; + margin: 50px 0; + color: $grey; + font-size: 13px; + + p { + margin-top: 15px; + } + + i { + color: $grey-light; + font-size: 40px; + } + + mat-spinner { + display: inline-block; + + ::ng-deep circle { + stroke: $grey-light; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.spec.ts new file mode 100644 index 00000000..b845f362 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoadingContentComponent } from './loading-content.component'; + +describe('LoadingContentComponent', () => { + let component: LoadingContentComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoadingContentComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoadingContentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.ts new file mode 100644 index 00000000..7416bb98 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + +@Component({ + selector: 'app-loading-content', + templateUrl: './loading-content.component.html', + styleUrls: ['./loading-content.component.scss'], +}) +export class LoadingContentComponent { + @Input() isLoading = true; + @Input() noDataText: string; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.html new file mode 100644 index 00000000..8b71cbfe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.html @@ -0,0 +1,9 @@ +
+ {{ headline }} + +
+
+ + + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.scss new file mode 100644 index 00000000..dec47c92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.scss @@ -0,0 +1,35 @@ +.-header { + background-color: #f7f7f7; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + line-height: 50px; + position: relative; + text-align: center; + + img { + cursor: pointer; + height: 32px; + position: absolute; + right: 9px; + top: 9px; + } +} + +.-body { + background-color: #fbfbfb; + padding: 0px 24px; +} + +mat-dialog-content::before { + content: ''; + padding-top: 24px; + height: 0px; + display: block; +} + +mat-dialog-content::after { + content: ''; + padding-top: 24px; + height: 0px; + display: block; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.spec.ts new file mode 100644 index 00000000..e5724549 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ModalComponent } from './modal.component'; + +describe('ModalComponent', () => { + let component: ModalComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ModalComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.ts new file mode 100644 index 00000000..e5f2b4c1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.ts @@ -0,0 +1,25 @@ +import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-modal', + templateUrl: './modal.component.html', + styleUrls: ['./modal.component.scss'], +}) +export class ModalComponent implements OnChanges { + @Input() dialog: MatDialogRef; + @Input() headline: string; + @Input() disableDismiss: boolean; + + closePopup() { + if (!this.disableDismiss) { + this.dialog.close(); + } + } + + ngOnChanges(changes: SimpleChanges) { + if (changes.disableDismiss) { + this.dialog.disableClose = changes.disableDismiss.currentValue; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.html new file mode 100644 index 00000000..652ac1e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.html @@ -0,0 +1,10 @@ +
+
+
{{ config.icon }}
+
+
{{ config.title | translate }}
+
{{ config.text | translate }}
+
+
close
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.scss new file mode 100644 index 00000000..26933342 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.scss @@ -0,0 +1,59 @@ +@import '../../../../theme/variables'; + +.main-container { + position: fixed; + bottom: 0px; + width: 100%; + z-index: 1000000; + display: flex; + flex-direction: row; + justify-content: center; +} + +.internal-container { + color: white; + width: fit-content; + min-width: 40%; + max-width: 90%; + display: flex; + padding: 10px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.red-background { + background-color: rgba(255, 0, 0, 0.7); +} + +.green-background { + background-color: rgba(31, 177, 31, 0.7); +} + +.yellow-background { + background-color: rgba(255, 94, 0, 0.7); +} + +.icon-container { + margin-right: 10px; +} + +.text-container { + flex-grow: 1; + margin-right: 10px; + + .title { + font-size: 15px; + margin-top: -1px; + } + + .text { + font-size: 13px; + margin-top: 2px; + } +} + +.close-container { + mat-icon { + cursor: pointer; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.spec.ts new file mode 100644 index 00000000..bfe072b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MsgBarComponent } from './msg-bar.component'; + +describe('MsgBarComponent', () => { + let component: MsgBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MsgBarComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MsgBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.ts new file mode 100644 index 00000000..aa94f505 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.ts @@ -0,0 +1,45 @@ +import { Component } from '@angular/core'; + +export enum MsgBarIcons { + Error = 'error', + Done = 'done', + Warning = 'warning', +} + +export enum MsgBarColors { + Red = 'red-background', + Green = 'green-background', + Yellow = 'yellow-background', +} + +export class MsgBarConfig { + title?: string; + text: string; + icon?: MsgBarIcons; + color?: MsgBarColors; +} + +@Component({ + selector: 'app-msg-bar', + templateUrl: './msg-bar.component.html', + styleUrls: ['./msg-bar.component.scss'], +}) +export class MsgBarComponent { + config = new MsgBarConfig(); + visible = false; + + constructor() { } + + show() { + if (this.visible) { + this.visible = false; + setTimeout(() => this.visible = true, 32); + } else { + this.visible = true; + } + } + + hide() { + this.visible = false; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.html new file mode 100644 index 00000000..cd12de95 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.html @@ -0,0 +1,15 @@ + +
+ {{ 'send.bulk-send.indications' | translate }} +
+
+
+ +
+
+
+ + {{ 'send.bulk-send.process' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.scss new file mode 100644 index 00000000..f8e227cd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.scss @@ -0,0 +1,3 @@ +.form-container { + margin-top: 20px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.spec.ts new file mode 100644 index 00000000..85ad3e28 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MultipleDestinationsDialogComponent } from './multiple-destinations-dialog.component'; + +describe('MultipleDestinationsDialogComponent', () => { + let component: MultipleDestinationsDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MultipleDestinationsDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MultipleDestinationsDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.ts new file mode 100644 index 00000000..4b0b74ff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.ts @@ -0,0 +1,83 @@ +import { Component, OnInit, OnDestroy, Inject } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +@Component({ + selector: 'app-multiple-destinations-dialog', + templateUrl: './multiple-destinations-dialog.component.html', + styleUrls: ['./multiple-destinations-dialog.component.scss'], +}) +export class MultipleDestinationsDialogComponent implements OnInit, OnDestroy { + form: FormGroup; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private data: string, + private formBuilder: FormBuilder, + private msgBarService: MsgBarService, + ) { } + + ngOnInit() { + this.form = this.formBuilder.group({ + data: [this.data], + }); + } + + ngOnDestroy() { + this.msgBarService.hide(); + } + + processData() { + try { + if ((this.form.value.data as string).trim().length === 0) { + this.msgBarService.showError('send.bulk-send.error-no-data'); + + return; + } + + let entries = (this.form.value.data as string).split(/\r?\n/); + if (!entries || entries.length === 0) { + this.msgBarService.showError('send.bulk-send.error-no-data'); + + return; + } + + entries = entries.filter(entry => entry.trim().length > 0); + + const firstElementParts = entries[0].split(',').length; + if (firstElementParts !== 2 && firstElementParts !== 3) { + this.msgBarService.showError('send.bulk-send.error-invalid-data'); + + return; + } + + const splitedEntries = []; + let consistentNumberOfParts = true; + entries.forEach((entry: string, i: number) => { + splitedEntries[i] = entry.split(','); + if (splitedEntries[i].length !== firstElementParts) { + consistentNumberOfParts = false; + } + }); + + if (!consistentNumberOfParts) { + this.msgBarService.showError('send.bulk-send.error-inconsistent-data'); + + return; + } + + const response = []; + splitedEntries.forEach((entry, i) => { + response[i] = []; + (entry as string[]).forEach((part, j) => { + response[i][j] = part.trim(); + }); + }); + + this.dialogRef.close(response); + } catch (e) { + this.msgBarService.showError('send.bulk-send.error-invalid-data'); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.html new file mode 100644 index 00000000..8f9ac685 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.html @@ -0,0 +1,19 @@ + +

{{ data.description | translate }}

+
+
+ + +
+
+ + +
+
+ {{ 'password.reset-link' | translate }} +
+ + {{ 'password.button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.scss new file mode 100644 index 00000000..ec05c939 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.scss @@ -0,0 +1,25 @@ +@import '../../../../theme/variables'; + +.-buttons { + text-align: center; +} + +.-info { + margin: 5px 0 25px; + color: $grey; + font-size: 12px; + line-height: 1.5; +} + +.-warning { + color: $red; +} + +.link { + font-size: 13px; + width: 100%; + display: inline-block; + text-align: center; + text-decoration: none; + color: $gradient-blue-dark; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.spec.ts new file mode 100644 index 00000000..a8d40a1a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PasswordDialogComponent } from './password-dialog.component'; + +describe('PasswordDialogComponent', () => { + let component: PasswordDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PasswordDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.ts new file mode 100644 index 00000000..05c65d3c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.ts @@ -0,0 +1,145 @@ +import { Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatDialogRef } from '@angular/material'; +import { FormControl, FormGroup } from '@angular/forms'; +import { ButtonComponent } from '../button/button.component'; +import { parseResponseMessage } from '../../../utils/errors'; +import { Subject } from 'rxjs/Subject'; +import { ISubscription } from 'rxjs/Subscription'; +import { TranslateService } from '@ngx-translate/core'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +@Component({ + selector: 'app-password-dialog', + templateUrl: './password-dialog.component.html', + styleUrls: ['./password-dialog.component.scss'], +}) +export class PasswordDialogComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + passwordSubmit = new Subject(); + working = false; + + private subscriptions: ISubscription[] = []; + private errors: any; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + private msgBarService: MsgBarService, + private translateService: TranslateService, + ) { + this.data = Object.assign({ + confirm: false, + description: null, + warning: false, + title: null, + wallet: null, + }, data || {}); + + this.translateService.get(['errors.incorrect-password', 'errors.api-disabled', 'errors.no-wallet']).subscribe(res => { + this.errors = res; + }); + } + + ngOnInit() { + this.form = new FormGroup({}, this.validateForm.bind(this)); + this.form.addControl('password', new FormControl('')); + this.form.addControl('confirm_password', new FormControl('')); + + ['password', 'confirm_password'].forEach(control => { + this.subscriptions.push(this.form.get(control).valueChanges.subscribe(() => { + if (this.button.state === 2) { + this.button.resetState(); + } + })); + }); + + if (this.data.confirm) { + this.form.get('confirm_password').enable(); + } else { + this.form.get('confirm_password').disable(); + } + + if (this.data.description) { + this.dialogRef.updateSize('400px'); + } + } + + ngOnDestroy() { + this.msgBarService.hide(); + + this.form.get('password').setValue(''); + this.form.get('confirm_password').setValue(''); + + this.passwordSubmit.complete(); + + this.subscriptions.forEach(sub => sub.unsubscribe()); + } + + proceed() { + if (!this.form.valid || this.button.isLoading()) { + return; + } + + this.msgBarService.hide(); + + this.button.setLoading(); + this.working = true; + + this.passwordSubmit.next({ + password: this.form.get('password').value, + close: this.close.bind(this), + error: this.error.bind(this), + }); + } + + private validateForm() { + if (this.form && this.form.get('password') && this.form.get('confirm_password')) { + if (this.form.get('password').value.length === 0) { + return { Required: true }; + } + + if (this.data.confirm && this.form.get('password').value !== this.form.get('confirm_password').value) { + return { NotEqual: true }; + } + } + + return null; + } + + private close() { + this.dialogRef.close(); + } + + private error(error: any) { + if (typeof error === 'object') { + if (error.status) { + switch (error.status) { + case 400: + error = parseResponseMessage(error['_body']); + break; + case 401: + error = this.errors['errors.incorrect-password']; + break; + case 403: + error = this.errors['errors.api-disabled']; + break; + case 404: + error = this.errors['errors.no-wallet']; + break; + default: + error = this.errors['errors.error-decrypting']; + } + } else { + error = this.errors['errors.error-decrypting']; + } + } + + error = error ? error : this.errors['errors.error-decrypting']; + + this.msgBarService.showError(error); + this.button.resetState(); + this.working = false; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.html new file mode 100644 index 00000000..a6b48dd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.html @@ -0,0 +1,36 @@ + +
+
+
+
+
+
{{ 'qr.data' | translate }}
+
{{ currentQrContent }}
+
+
+
{{ 'qr.address' | translate }}
+
{{ data.address }}
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.scss new file mode 100644 index 00000000..8706bf28 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.scss @@ -0,0 +1,68 @@ +@import '../../../../theme/variables'; + +.qr-container { + text-align: center; + margin-bottom: 24px; + + .qr { + height: 180px; + width: 180px; + display: inline-block; + } +} + +.separator { + background-color: $grey-light; + height: 1px; + width: 100%; +} + +.data-container { + margin: 14px 0; + + .title { + color: $black; + } + + .data { + color: $grey-semi-dark; + cursor: pointer; + + .text { + margin-right: 5px; + } + + .copy { + color: $grey-semi-dark; + opacity: 0.25; + } + } + + .data:hover { + .copy { + opacity: 0.75; + } + } + + .data:active { + .copy { + opacity: 1; + } + } +} + +.link { + color: $gradient-blue-dark; + cursor: pointer; + + mat-icon { + padding: 0; + display: inline; + vertical-align: middle; + font-size: 13px; + } +} + +.invalid { + color: $red; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.spec.ts new file mode 100644 index 00000000..2943ac08 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { QrCodeComponent } from './qr-code.component'; + +describe('QrCodeComponent', () => { + let component: QrCodeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ QrCodeComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QrCodeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.ts new file mode 100644 index 00000000..8f569e5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.ts @@ -0,0 +1,147 @@ +import { Component, Inject, OnInit, ViewChild, OnDestroy, ElementRef } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { MatDialogRef } from '@angular/material'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { ISubscription } from 'rxjs/Subscription'; +import { Subject } from 'rxjs/Subject'; +import { copyTextToClipboard } from '../../../utils'; +import { AppConfig } from '../../../app.config'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +declare const QRCode: any; + +class DefaultQrConfig { + readonly size = 180; + readonly level = 'M'; + readonly colordark = '#000000'; + readonly colorlight = '#ffffff'; + readonly usesvg = false; +} + +export interface QrDialogConfig { + address: string; + ignoreCoinPrefix?: boolean; + hideCoinRequestForm?: boolean; +} + +@Component({ + selector: 'app-qr-code', + templateUrl: './qr-code.component.html', + styleUrls: ['./qr-code.component.scss'], +}) +export class QrCodeComponent implements OnInit, OnDestroy { + @ViewChild('qr') qr: ElementRef; + + form: FormGroup; + currentQrContent: string; + showForm = false; + invalidCoins = false; + invalidHours = false; + + private defaultQrConfig = new DefaultQrConfig(); + private subscriptionsGroup: ISubscription[] = []; + private updateQrEvent: Subject = new Subject(); + + static openDialog(dialog: MatDialog, config: QrDialogConfig) { + const dialogConfig = new MatDialogConfig(); + dialogConfig.data = config; + dialogConfig.width = '390px'; + dialog.open(QrCodeComponent, dialogConfig); + } + + constructor( + @Inject(MAT_DIALOG_DATA) public data: QrDialogConfig, + public dialogRef: MatDialogRef, + public formBuilder: FormBuilder, + private msgBarService: MsgBarService, + ) { } + + ngOnInit() { + this.initForm(); + this.updateQrContent(); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + this.msgBarService.hide(); + } + + startShowingForm() { + this.showForm = true; + } + + copyText(text) { + copyTextToClipboard(text); + this.msgBarService.showDone('qr.copied', 4000); + } + + private initForm() { + this.form = this.formBuilder.group({ + coins: [''], + hours: [''], + note: [''], + }); + + this.subscriptionsGroup.push(this.form.get('coins').valueChanges.subscribe(this.reportValueChanged.bind(this))); + this.subscriptionsGroup.push(this.form.get('hours').valueChanges.subscribe(this.reportValueChanged.bind(this))); + this.subscriptionsGroup.push(this.form.get('note').valueChanges.subscribe(this.reportValueChanged.bind(this))); + + this.subscriptionsGroup.push(this.updateQrEvent.debounceTime(500).subscribe(() => { + this.updateQrContent(); + })); + } + + private reportValueChanged() { + this.updateQrEvent.next(true); + } + + private updateQrContent() { + this.currentQrContent = (!this.data.ignoreCoinPrefix ? (AppConfig.uriSpecificatioPrefix.toLowerCase() + ':') : '') + this.data.address; + + this.invalidCoins = false; + this.invalidHours = false; + + let nextSeparator = '?'; + + const coins = this.form.get('coins').value; + if (coins) { + if (Number.parseFloat(coins).toString() === coins && Number.parseFloat(coins) > 0) { + this.currentQrContent += nextSeparator + 'amount=' + this.form.get('coins').value; + nextSeparator = '&'; + } else { + this.invalidCoins = true; + } + } + + const hours = this.form.get('hours').value; + if (hours) { + if (Number.parseInt(hours).toString() === hours && Number.parseInt(hours) > 0) { + this.currentQrContent += nextSeparator + 'hours=' + this.form.get('hours').value; + nextSeparator = '&'; + } else { + this.invalidHours = true; + } + } + + const note = this.form.get('note').value; + if (note) { + this.currentQrContent += nextSeparator + 'message=' + encodeURIComponent(note); + } + + this.updateQrCode(); + } + + private updateQrCode() { + (this.qr.nativeElement as HTMLDivElement).innerHTML = ''; + + const qrcode = new QRCode(this.qr.nativeElement, { + text: this.currentQrContent, + width: this.defaultQrConfig.size, + height: this.defaultQrConfig.size, + colorDark: this.defaultQrConfig.colordark, + colorLight: this.defaultQrConfig.colorlight, + useSVG: this.defaultQrConfig.usesvg, + correctLevel: QRCode.CorrectLevel[this.defaultQrConfig.level], + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.html new file mode 100644 index 00000000..2c76d07c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.html @@ -0,0 +1,28 @@ + + + +
+
+ + + + {{option}} + +
+
+
+ + {{ 'hardware-wallet.general.continue' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.scss new file mode 100644 index 00000000..cc2cde49 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.scss @@ -0,0 +1,8 @@ +.form-container { + margin-top: 20px; +} + +.option { + font-size: 13px; + height: 42px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.spec.ts new file mode 100644 index 00000000..cc7cb0a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SeedWordDialogComponent } from './seed-word-dialog.component'; + +describe('SeedWordDialogComponent', () => { + let component: SeedWordDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SeedWordDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SeedWordDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.ts new file mode 100644 index 00000000..3e6e0341 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.ts @@ -0,0 +1,92 @@ +import { Component, OnInit, OnDestroy, Inject } from '@angular/core'; +import { FormBuilder, Validators, FormGroup } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { Observable } from 'rxjs/Observable'; +import { TranslateService } from '@ngx-translate/core'; +import { ISubscription } from 'rxjs/Subscription'; +import { Bip39WordListService } from '../../../services/bip39-word-list.service'; +import { MsgBarService } from '../../../services/msg-bar.service'; +import { HwWalletService } from '../../../services/hw-wallet.service'; +import { MessageIcons } from '../hardware-wallet/hw-message/hw-message.component'; + +export class SeedWordDialogParams { + isForHwWallet: boolean; + wordNumber: number; + restoringSoftwareWallet: false; +} + +@Component({ + selector: 'app-seed-word-dialog', + templateUrl: './seed-word-dialog.component.html', + styleUrls: ['./seed-word-dialog.component.scss'], +}) +export class SeedWordDialogComponent implements OnInit, OnDestroy { + form: FormGroup; + filteredOptions: Observable; + msgIcons = MessageIcons; + + private sendingWord = false; + private valueChangeSubscription: ISubscription; + private hwConnectionSubscription: ISubscription; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: SeedWordDialogParams, + public dialogRef: MatDialogRef, + private formBuilder: FormBuilder, + private bip38WordList: Bip39WordListService, + private msgBarService: MsgBarService, + private translateService: TranslateService, + hwWalletService: HwWalletService, + ) { + if (data.isForHwWallet) { + this.hwConnectionSubscription = hwWalletService.walletConnectedAsyncEvent.subscribe(connected => { + if (!connected) { + this.dialogRef.close(); + } + }); + } + } + + ngOnInit() { + this.form = this.formBuilder.group({ + word: ['', Validators.required], + }); + + this.valueChangeSubscription = this.form.controls.word.valueChanges.subscribe(value => { + this.bip38WordList.setSearchTerm(value.trim().toLowerCase()); + }); + + this.filteredOptions = this.bip38WordList.searchResults.map(value => value); + } + + ngOnDestroy() { + this.msgBarService.hide(); + this.valueChangeSubscription.unsubscribe(); + if (this.hwConnectionSubscription) { + this.hwConnectionSubscription.unsubscribe(); + } + } + + sendWord() { + if (!this.sendingWord) { + this.sendingWord = true; + this.msgBarService.hide(); + + setTimeout(() => { + if (this.form.valid) { + const validation = this.bip38WordList.validateWord(this.form.value.word.trim().toLowerCase()); + if (validation) { + this.dialogRef.close((this.form.value.word as string).trim().toLowerCase()); + } else { + if (validation === null) { + this.msgBarService.showError(this.translateService.instant('hardware-wallet.seed-word.error-loading-words')); + } else { + this.msgBarService.showError(this.translateService.instant('hardware-wallet.seed-word.error-invalid-word')); + } + } + } + this.sendingWord = false; + }, 32); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.html new file mode 100644 index 00000000..5e827cad --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.html @@ -0,0 +1,8 @@ + +
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.scss new file mode 100644 index 00000000..ffb243cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.scss @@ -0,0 +1,32 @@ +@import '../../../../theme/_variables'; + +.options-container { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + + .button { + width: 118px; + margin: 20px; + font-size: 12px; + line-height: unset; + padding: 0; + color: unset; + min-width: 0px; + + img { + width: 64px; + height: 64px; + margin: 10px 0px; + } + + .label { + background-color: $grey-very-light; + padding: 4px 10px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.spec.ts new file mode 100644 index 00000000..a84635e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SelectLanguageComponent } from './select-language.component'; + +describe('SelectLanguageComponent', () => { + let component: SelectLanguageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SelectLanguageComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SelectLanguageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.ts new file mode 100644 index 00000000..efe31b37 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.ts @@ -0,0 +1,29 @@ +import { Component, OnInit } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +import { LanguageData, LanguageService } from '../../../services/language.service'; + +@Component({ + selector: 'app-select-language', + templateUrl: './select-language.component.html', + styleUrls: ['./select-language.component.scss'], +}) +export class SelectLanguageComponent implements OnInit { + + languages: LanguageData[]; + disableDismiss: boolean; + + constructor( + public dialogRef: MatDialogRef, + private languageService: LanguageService, + ) { } + + ngOnInit() { + this.disableDismiss = this.dialogRef.disableClose; + this.languages = this.languageService.languages; + } + + closePopup(language: LanguageData = null) { + this.dialogRef.close(language ? language.code : undefined); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.css new file mode 100644 index 00000000..91222aaf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.css @@ -0,0 +1,4 @@ +mat-select { + width: 100%; + padding: 40px 0 20px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.html new file mode 100644 index 00000000..11ad098b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.html @@ -0,0 +1,11 @@ +

{{ 'buy.deposit-address' | translate }}

+
+ + + {{ address.address }} + + +
+ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.spec.ts new file mode 100644 index 00000000..be225b44 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AddDepositAddressComponent } from './add-deposit-address.component'; + +describe('AddDepositAddressComponent', () => { + let component: AddDepositAddressComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AddDepositAddressComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AddDepositAddressComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.ts new file mode 100644 index 00000000..8283d405 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { WalletService } from '../../../../services/wallet.service'; +import { PurchaseService } from '../../../../services/purchase.service'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-add-deposit-address', + templateUrl: './add-deposit-address.component.html', + styleUrls: ['./add-deposit-address.component.css'], +}) +export class AddDepositAddressComponent implements OnInit { + + form: FormGroup; + + constructor( + public walletService: WalletService, + private dialogRef: MatDialogRef, + private formBuilder: FormBuilder, + private purchaseService: PurchaseService, + ) {} + + ngOnInit() { + this.initForm(); + } + + generate() { + this.purchaseService.generate(this.form.value.address).subscribe(() => this.dialogRef.close()); + } + + private initForm() { + this.form = this.formBuilder.group({ + address: ['', Validators.required], + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.html new file mode 100644 index 00000000..97bfaa5d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.html @@ -0,0 +1,59 @@ + +
+
+
+
+
+ 1 +
+
+

{{ 'buy.deposit-location' | translate }}

+

{{ 'buy.deposit-location-desc' | translate }}

+
+
+ +
+
+ {{ 'buy.wallets-desc' | translate }} +
+
+
+
+ 2 +
+
+

{{ 'buy.send' | translate }}

+

{{ 'buy.send-desc' | translate:{rate: config.sky_btc_exchange_rate} }}

+ + {{ order.deposit_address }} + + {{ 'buy.fraction-warning' | translate }} +
+
+
+
+ 3 +
+
+

{{ 'buy.receive' | translate }}

+

{{ 'buy.receive-desc' | translate }}

+ + {{ 'buy.status-button' | translate }} {{ order.status | tellerStatus | translate }} + + + {{ 'buy.check-status-button' | translate }} + + + {{ 'buy.new-order-button' | translate }} + +
+
+
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.scss new file mode 100644 index 00000000..82020723 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.scss @@ -0,0 +1,129 @@ +.-background-container { + background-color: #fbfbfb; + padding-top: 30px; + max-width: 100%; + min-height: calc(100% - 190px); + overflow: hidden; + position: relative; +} + +.-background-image { + display: none; +} + +@media (min-width: 768px) { + .-background-image { + display: block; + left: 50%; + width: 80%; + position: absolute; + top: 0; + } +} + +@media (min-width: 992px) { + .-background-image { + left: 40%; + width: 90%; + max-width: 850px; + } +} + +@media (min-width: 1200px) { + .-background-image { + left: 40%; + width: 80%; + max-width: 850px; + } +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + position: relative; + margin-top: 30px; + max-width: 540px; + z-index: 5; + + .-step { + display: flex; + margin-bottom: 30px; + + .-number { + width: 60px; + + span { + border-radius: 50%; + color: white; + display: inline-block; + font-size: 16px; + font-weight: 700; + height: 40px; + line-height: 46px; + text-align: center; + width: 40px; + } + } + + .-instructions { + flex: 1 1; + + ::ng-deep button { + margin-left: 0; + } + + h3 { + color: #1E2227; + font-size: 16px; + font-weight: 700; + margin: 0; + line-height: 46px; + } + + p { + color: rgba(30, 34, 39, 0.8); + font-size: 14px; + font-weight: 300; + line-height: 20px; + margin-top: 0; + } + + .-address, .-status { + background-color: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + color: rgba(30, 34, 39, 0.8); + display: block; + font-size: 14px; + line-height: 20px; + margin-bottom: 15px; + padding: 10px 10px; + width: 100%; + } + + .-coins { + color: #0072FF; + } + + .form-field { + margin-bottom: 15px; + } + + .-subtitle { + color: #8C8E90; + font-size: 12px; + line-height: 18px; + font-weight: 300; + opacity: 0.8; + } + + .-wallet { + color: rgba(30, 34, 39, 0.8); + font-size: 14px; + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts new file mode 100644 index 00000000..1d0cca4c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BuyComponent } from './buy.component'; + +describe('BuyComponent', () => { + let component: BuyComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BuyComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BuyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.ts new file mode 100644 index 00000000..f22a5e85 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.ts @@ -0,0 +1,112 @@ +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { PurchaseService } from '../../../services/purchase.service'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { WalletService } from '../../../services/wallet.service'; +import { Address, PurchaseOrder, Wallet } from '../../../app.datatypes'; +import { ButtonComponent } from '../../layout/button/button.component'; +import { ISubscription } from 'rxjs/Subscription'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +@Component({ + selector: 'app-buy', + templateUrl: './buy.component.html', + styleUrls: ['./buy.component.scss'], +}) +export class BuyComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + + address: Address; + config: any; + form: FormGroup; + order: PurchaseOrder; + wallets: Wallet[]; + + private subscriptionsGroup: ISubscription[] = []; + + constructor( + private formBuilder: FormBuilder, + private purchaseService: PurchaseService, + private msgBarService: MsgBarService, + private walletService: WalletService, + ) {} + + ngOnInit() { + this.initForm(); + this.loadData(); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + } + + checkStatus() { + this.button.setLoading(); + this.purchaseService.scan(this.order.recipient_address).subscribe( + response => { + this.button.setSuccess(); + this.order.status = response.status; + }, + error => this.button.setError(error), + ); + } + + removeOrder() { + window.localStorage.removeItem('purchaseOrder'); + this.order = null; + } + + private initForm() { + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + }); + + this.subscriptionsGroup.push(this.form.get('wallet').valueChanges.subscribe(filename => { + const wallet = this.wallets.find(wlt => wlt.filename === filename); + console.log('changing wallet value', filename); + this.purchaseService.generate(wallet).subscribe( + order => this.saveData(order), + error => this.msgBarService.showError(error.toString()), + ); + })); + } + + private loadConfig() { + this.purchaseService.config() + .filter(config => !!config && !!config.sky_btc_exchange_rate) + .first() + .subscribe(config => this.config = config); + } + + private loadData() { + this.loadConfig(); + this.loadOrder(); + + this.subscriptionsGroup.push(this.walletService.all().subscribe(wallets => { + this.wallets = wallets; + + if (this.order) { + this.form.get('wallet').setValue(this.order.filename, { emitEvent: false }); + } + })); + } + + private loadOrder() { + const order: PurchaseOrder = JSON.parse(window.localStorage.getItem('purchaseOrder')); + if (order) { + this.order = order; + this.updateOrder(); + } + } + + private saveData(order: PurchaseOrder) { + this.order = order; + window.localStorage.setItem('purchaseOrder', JSON.stringify(order)); + } + + private updateOrder() { + this.purchaseService.scan(this.order.recipient_address).first().subscribe( + response => this.order.status = response.status, + error => console.log(error), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.html new file mode 100644 index 00000000..b0adc425 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.html @@ -0,0 +1,91 @@ + + +
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ + +
+ +
+ + {{ 'exchange.agree-1' | translate }} + + {{ 'exchange.agree-2' | translate }} + + {{ 'exchange.agree-3' | translate }} + + {{ 'exchange.agree-4' | translate }} + + + + + {{ 'exchange.exchange-button' | translate }} + +
+
+ +
+
+
{{ 'exchange.you-send' | translate }}
+
{{ sendAmount }} {{ form.get('fromCoin').value }}
+
+ +
+
{{ 'exchange.you-get' | translate }}
+
≈ {{ toAmount }} {{ toCoin }}
+
+ +
+
{{ 'exchange.to-address' | translate:{coin: toCoin} }}
+
{{ form.get('toAddress').value || '-' }}
+
+ +
+
{{ 'exchange.price' | translate }}
+
1 {{ form.get('fromCoin').value }} ≈ {{ activeTradingPair.price.toFixed(6) }} {{ toCoin }}
+
+ +
+
{{ 'exchange.time-15' | translate }}
+
≈ 15 minutes
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.scss new file mode 100644 index 00000000..4328a6e6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.scss @@ -0,0 +1,131 @@ +@import '../../../../../theme/variables'; + +.-create { + display: flex; + + .-form { + flex: .6; + } + + .-info { + flex: .4; + margin-left: 40px; + margin-top: 5px; + } +} + +.form-field { + width: 100%; + + .-error { + color: $red; + margin-left: 20px; + } + + .-inputs { + display: flex; + + input { + flex: .7; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + .-select, .-input { + flex: .3; + + select, input { + border-left: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + } + + .-not-allowed { + input { + cursor: not-allowed; + } + } +} + +.-item { + font-size: 13px; + + &:not(:last-child) { + margin-bottom: 20px; + } + + .-key { + color: $grey; + margin-bottom: 5px; + } + + .-value { + word-break: break-all; + } +} + +.-buttons { + text-align: center; + + mat-checkbox { + margin-right: 20px; + } +} + +.-check ::ng-deep { + .mat-checkbox-layout { + align-items: center; + } + + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + + span { + font-family: Skycoin; + line-height: normal; + font-size: 13px; + color: $grey-dark; + + a { + color: $blue; + text-decoration: none; + } + } +} + +.-select-address { + padding-left: 5px; + color: $blue; + cursor: pointer; + + mat-icon { + color: $blue; + padding: 0; + display: inline; + vertical-align: middle; + font-size: 13px; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.spec.ts new file mode 100644 index 00000000..c1f9d924 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExchangeCreateComponent } from './exchange-create.component'; + +describe('ExchangeCreateComponent', () => { + let component: ExchangeCreateComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ExchangeCreateComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExchangeCreateComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.ts new file mode 100644 index 00000000..f2710a5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.ts @@ -0,0 +1,260 @@ +import { + Component, + EventEmitter, + OnDestroy, + OnInit, + Output, + ViewChild, +} from '@angular/core'; +import * as moment from 'moment'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ExchangeService } from '../../../../services/exchange.service'; +import { ExchangeOrder, TradingPair, StoredExchangeOrder } from '../../../../app.datatypes'; +import { ISubscription } from 'rxjs/Subscription'; +import 'rxjs/add/observable/merge'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { SelectAddressComponent } from '../../send-skycoin/send-form-advanced/select-address/select-address'; +import { WalletService } from '../../../../services/wallet.service'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/switchMap'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { TranslateService } from '@ngx-translate/core'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-exchange-create', + templateUrl: './exchange-create.component.html', + styleUrls: ['./exchange-create.component.scss'], +}) +export class ExchangeCreateComponent implements OnInit, OnDestroy { + readonly defaultFromCoin = 'BTC'; + readonly defaultFromAmount = '0.1'; + readonly toCoin = 'SKY'; + + @ViewChild('exchangeButton') exchangeButton: ButtonComponent; + @Output() submitted = new EventEmitter(); + form: FormGroup; + tradingPairs: TradingPair[]; + activeTradingPair: TradingPair; + problemGettingPairs = false; + + private agreement = false; + private subscriptionsGroup: ISubscription[] = []; + private exchangeSubscription: ISubscription; + private priceUpdateSubscription: ISubscription; + + get toAmount() { + if (!this.activeTradingPair) { + return 0; + } + + const fromAmount = this.form.get('fromAmount').value; + if (isNaN(fromAmount)) { + return 0; + } else { + return (this.form.get('fromAmount').value * this.activeTradingPair.price).toFixed(this.blockchainService.currentMaxDecimals); + } + } + + get sendAmount() { + const val = this.form.get('fromAmount').value; + + return isNaN(parseFloat(val)) ? 0 : val; + } + + constructor( + private exchangeService: ExchangeService, + private walletService: WalletService, + private formBuilder: FormBuilder, + private msgBarService: MsgBarService, + private dialog: MatDialog, + private blockchainService: BlockchainService, + private translateService: TranslateService, + ) { } + + ngOnInit() { + this.createForm(); + this.loadData(); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + this.removeExchangeSubscription(); + this.msgBarService.hide(); + + if (this.priceUpdateSubscription) { + this.priceUpdateSubscription.unsubscribe(); + } + } + + setAgreement(event) { + this.agreement = event.checked; + this.form.updateValueAndValidity(); + } + + selectAddress() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + + this.dialog.open(SelectAddressComponent, config).afterClosed().subscribe(address => { + if (address) { + this.form.get('toAddress').setValue(address); + } + }); + } + + exchange() { + if (!this.form.valid || this.exchangeButton.isLoading()) { + return; + } + + this.msgBarService.hide(); + + this.exchangeButton.resetState(); + this.exchangeButton.setLoading(); + this.exchangeButton.setDisabled(); + + const amount = parseFloat(this.form.get('fromAmount').value); + + const toAddress = (this.form.get('toAddress').value as string).trim(); + + this.removeExchangeSubscription(); + this.exchangeSubscription = this.walletService.verifyAddress(toAddress).subscribe(addressIsValid => { + if (addressIsValid) { + this.exchangeSubscription = this.exchangeService.exchange( + this.activeTradingPair.pair, + amount, + toAddress, + this.activeTradingPair.price, + ).subscribe((order: ExchangeOrder) => { + this.submitted.emit({ + id: order.id, + pair: order.pair, + fromAmount: order.fromAmount, + toAmount: order.toAmount, + address: order.toAddress, + timestamp: moment().unix(), + price: this.activeTradingPair.price, + }); + }, err => { + this.exchangeButton.resetState(); + this.exchangeButton.setEnabled(); + this.msgBarService.showError(err); + }); + } else { + this.showInvalidAddress(); + } + }, () => { + this.showInvalidAddress(); + }); + } + + private showInvalidAddress() { + this.exchangeButton.resetState(); + this.exchangeButton.setEnabled(); + + const errMsg = this.translateService.instant('exchange.invalid-address'); + this.msgBarService.showError(errMsg); + } + + private createForm() { + this.form = this.formBuilder.group({ + fromCoin: [this.defaultFromCoin, Validators.required], + fromAmount: [this.defaultFromAmount, Validators.required], + toAddress: ['', Validators.required], + }, { + validator: this.validate.bind(this), + }); + + this.subscriptionsGroup.push(this.form.get('fromCoin').valueChanges.subscribe(() => { + this.updateActiveTradingPair(); + })); + } + + private loadData() { + this.subscriptionsGroup.push(this.exchangeService.tradingPairs() + .retryWhen(errors => errors.delay(2000).take(10).concat(Observable.throw(''))) + .subscribe(pairs => { + this.tradingPairs = []; + + pairs.forEach(pair => { + if (pair.to === this.toCoin) { + this.tradingPairs.push(pair); + } + }); + + this.updateActiveTradingPair(); + this.updatePrices(); + }, () => { + this.problemGettingPairs = true; + }), + ); + } + + private updatePrices() { + this.priceUpdateSubscription = Observable.of(1).delay(60000).flatMap(() => this.exchangeService.tradingPairs()) + .retryWhen(errors => errors.delay(60000)) + .subscribe(pairs => { + pairs.forEach(pair => { + if (pair.to === this.toCoin) { + const alreadySavedPair = this.tradingPairs.find(oldPair => oldPair.from === pair.from); + if (alreadySavedPair) { + alreadySavedPair.price = pair.price; + } + } + }); + this.updatePrices(); + }); + } + + private updateActiveTradingPair() { + this.activeTradingPair = this.tradingPairs.find(p => { + return p.from === this.form.get('fromCoin').value; + }); + + if (!this.activeTradingPair && this.tradingPairs.length > 0) { + this.activeTradingPair = this.tradingPairs[0]; + this.form.get('fromCoin').setValue(this.activeTradingPair.from); + } + } + + private validate(group: FormGroup) { + if (!group || !this.activeTradingPair) { + return null; + } + + const fromAmount = group.get('fromAmount').value; + + if (isNaN(fromAmount)) { + return { invalid: true }; + } + + if (fromAmount < this.activeTradingPair.min || fromAmount === '') { + return { min: this.activeTradingPair.min }; + } + + if (fromAmount > this.activeTradingPair.max) { + return { max: this.activeTradingPair.max }; + } + + const parts = (fromAmount as string).split('.'); + + if (parts.length > 1 && parts[1].length > 6) { + return { decimals: true }; + } + + if (!this.agreement) { + return { agreement: true }; + } + + return null; + } + + private removeExchangeSubscription() { + if (this.exchangeSubscription) { + this.exchangeSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.html new file mode 100644 index 00000000..1578fe45 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.html @@ -0,0 +1,11 @@ + +
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.scss new file mode 100644 index 00000000..c4c38072 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.scss @@ -0,0 +1,38 @@ +@import '../../../../../theme/variables'; + +button { + width: 100%; + text-align: left; + padding: 10px 10px; + border-bottom: 1px solid #eff0f0; + cursor: pointer; + + .info { + font-size: 13px; + line-height: 22px; + color: $black; + + div { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + + mat-icon { + font-size: 16px; + width: 16px; + height: 16px; + position: relative; + top: 3px; + margin: 0px 5px; + } + } + + .grey { + color: $grey; + } + } + + .action { + color: $blue; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.spec.ts new file mode 100644 index 00000000..18304bfd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExchangeHistoryComponent } from './exchange-history.component'; + +describe('ExchangeHistoryComponent', () => { + let component: ExchangeHistoryComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ExchangeHistoryComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExchangeHistoryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.ts new file mode 100644 index 00000000..f01f6078 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.ts @@ -0,0 +1,43 @@ +import { Component, OnInit } from '@angular/core'; +import { StoredExchangeOrder, Wallet } from '../../../../app.datatypes'; +import { MatDialogRef } from '@angular/material'; +import { ExchangeService } from '../../../../services/exchange.service'; +import { BlockchainService } from '../../../../services/blockchain.service'; + +@Component({ + selector: 'app-exchange-history', + templateUrl: './exchange-history.component.html', + styleUrls: ['./exchange-history.component.scss'], +}) +export class ExchangeHistoryComponent implements OnInit { + orders: StoredExchangeOrder[]; + + constructor( + public dialogRef: MatDialogRef, + public blockchainService: BlockchainService, + private exchangeService: ExchangeService, + ) { } + + ngOnInit() { + this.exchangeService.history().subscribe( + (orders: StoredExchangeOrder[]) => this.orders = orders.reverse(), + () => this.orders = [], + ); + } + + closePopup() { + this.dialogRef.close(); + } + + select(value) { + this.dialogRef.close(value); + } + + getFromCoin(pair: string) { + return pair.split('/')[0].toUpperCase(); + } + + getToCoin(pair: string) { + return pair.split('/')[1].toUpperCase(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.html new file mode 100644 index 00000000..c3ae2c8e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.html @@ -0,0 +1,132 @@ + + + +
+
+ {{ statusIcon }} +
+
{{ 'exchange.status' | translate }}
+
{{ translatedStatus.text | translate:translatedStatus.params }} help
+
+
+ {{ 'exchange.exchanging' | translate:{from: fromCoin, to: toCoin} }} +
+ + + +
+
+
+
+
{{ 'exchange.details.order-id' | translate }}
+
{{ order.id }}
+
+
+ + +
+
+
+
{{ 'exchange.you-send' | translate }}
+
{{ order.fromAmount }} {{ fromCoin }}
+
+
+ +
+ +
+
{{ 'exchange.details.exchange-addr' | translate }}
+
{{ order.exchangeAddress }}
+
+
+ +
+ +
+
{{ 'exchange.details.exchange-addr-tag' | translate }}
+
{{ order.exchangeTag }}
+
+
+
+ + + + + +
+
+
+
{{ 'exchange.details.tx-id' | translate }}
+
+ {{ order.toTx }} + + launch + +
+
+
+ +
+
+
+
{{ 'exchange.details.error-msg' | translate }}
+
{{ order.message }}
+
+
+ +
+
+ + {{ 'exchange.details.details' | translate }} {{ expanded ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }} + +
+ + +
+
+
+
{{ 'exchange.details.start-date' | translate }}
+
{{ _orderDetails.timestamp | dateTime }}
+
+
+ + + + + +
+
+
+
{{ 'exchange.you-get' | translate }}
+
{{ order.toAmount | amount:true:'first' }} {{ toCoin }}
+
+
+ +
+
+
+
{{ 'exchange.to-address' | translate:{coin: toCoin} }}
+
{{ order.toAddress }}
+
+
+ +
+
+
+
{{ 'exchange.details.initial-price' | translate }}
+
1 {{ fromCoin }} ≈ {{ _orderDetails.price }} {{ toCoin }}
+
+
+
+
+
+ +
+ + {{ 'exchange.details.back' | translate }} + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.scss new file mode 100644 index 00000000..139fe9a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.scss @@ -0,0 +1,119 @@ +@import '../../../../../theme/variables'; + +.-wrapper { + font-size: 13px; + display: flex; + justify-content: space-between; + align-items: center; + + .-status { + display: flex; + align-items: center; + + mat-icon { + margin-right: 15px; + width: 18px; + height: 18px; + font-size: 18px; + + &.-spin { + animation: spin 1s infinite linear; + } + } + + .-value { + padding-right: 30px; + word-break: normal; + } + } +} + +mat-progress-bar { + margin: 30px -30px; + width: calc(100% + 60px); + + ::ng-deep .mat-progress-bar-buffer { + background-color: $blue; + opacity: .3; + } +} + +.-details { + .-box { + display: flex; + align-items: center; + + &:not(:last-child) { + margin-bottom: 20px; + } + + > .-img { + width: 17px; + margin-right: 15px; + } + } +} + +.-item { + font-size: 13px; + + &:not(:last-child) { + margin-bottom: 20px; + } + + .-key { + color: $grey; + margin-bottom: 5px; + } + + .-value { + word-break: break-all; + + .info-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + } + } +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(359deg); + } +} + +.-external mat-icon { + line-height: 13px; + height: 13px; + width: 13px; + font-size: 16px; + vertical-align: middle; + color: $blue; + margin-left: 10px; +} + +.expand { + color: $blue; + cursor: pointer; + font-size: 13px; + + mat-icon { + color: $blue; + padding: 0; + display: inline; + vertical-align: middle; + font-size: 13px; + } +} + +.buttons { + width: 100%; + text-align: center; + margin-top: 10px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.spec.ts new file mode 100644 index 00000000..88e8eee4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExchangeStatusComponent } from './exchange-status.component'; + +describe('ExchangeStatusComponent', () => { + let component: ExchangeStatusComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ExchangeStatusComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExchangeStatusComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.ts new file mode 100644 index 00000000..2c97e210 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.ts @@ -0,0 +1,171 @@ +import { Component, Input, OnDestroy, Output, EventEmitter } from '@angular/core'; +import { ExchangeOrder, StoredExchangeOrder, ConfirmationData } from '../../../../app.datatypes'; +import { ExchangeService } from '../../../../services/exchange.service'; +import { QrCodeComponent, QrDialogConfig } from '../../../layout/qr-code/qr-code.component'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { ISubscription } from 'rxjs/Subscription'; +import { Observable } from 'rxjs/Observable'; +import { showConfirmationModal } from '../../../../utils'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { environment } from '../../../../../environments/environment'; +import { AppService } from '../../../../services/app.service'; + +@Component({ + selector: 'app-exchange-status', + templateUrl: './exchange-status.component.html', + styleUrls: ['./exchange-status.component.scss'], +}) +export class ExchangeStatusComponent implements OnDestroy { + private readonly TEST_MODE = environment.swaplab.activateTestMode; + private readonly TEST_ERROR = environment.swaplab.endStatusInError; + readonly statuses = [ + 'user_waiting', + 'market_waiting_confirmations', + 'market_confirmed', + 'market_exchanged', + 'market_withdraw_waiting', + 'complete', + 'error', + 'user_deposit_timeout', + ]; + + loading = true; + showError = false; + expanded = false; + + private subscription: ISubscription; + private testStatusIndex = 0; + private order: ExchangeOrder; + + _orderDetails: StoredExchangeOrder; + @Input() set orderDetails(val: StoredExchangeOrder) { + const oldOrderDetails = this._orderDetails; + this._orderDetails = val; + + if (val !== null && (!oldOrderDetails || oldOrderDetails.id !== val.id)) { + this.exchangeService.lastViewedOrder = this._orderDetails; + this.testStatusIndex = 0; + this.loading = true; + this.getStatus(); + } + } + + @Output() goBack = new EventEmitter(); + + get fromCoin() { + return this.order.pair.split('/')[0].toUpperCase(); + } + + get toCoin() { + return this.order.pair.split('/')[1].toUpperCase(); + } + + get translatedStatus() { + const status = this.order.status.replace(/_/g, '-'); + const params = { + from: this.fromCoin, + amount: this.order.fromAmount, + to: this.toCoin, + }; + + return { + text: `exchange.statuses.${status}`, + info: `exchange.statuses.${status}-info`, + params, + }; + } + + get statusIcon() { + if (this.order.status === this.statuses[5]) { + return 'done'; + } + + if (this.order.status === this.statuses[6] || this.order.status === this.statuses[7]) { + return 'close'; + } + + return 'refresh'; + } + + get progress() { + let index = this.statuses.indexOf(this.order.status); + + index = Math.min(index, 5) + 1; + + return Math.ceil((100 / 6) * index); + } + + constructor( + private exchangeService: ExchangeService, + private dialog: MatDialog, + public blockchainService: BlockchainService, + public appService: AppService, + ) { } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + showQrCode(address) { + const config: QrDialogConfig = { + address: address, + hideCoinRequestForm: true, + ignoreCoinPrefix: true, + }; + QrCodeComponent.openDialog(this.dialog, config); + } + + toggleDetails() { + this.expanded = !this.expanded; + } + + close() { + if (this.loading || this.exchangeService.isOrderFinished(this.order)) { + this.goBack.emit(); + } else { + const confirmationData: ConfirmationData = { + text: 'exchange.details.back-alert', + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.goBack.emit(); + } + }); + } + } + + private getStatus(delay = 0) { + if (this.subscription) { + this.subscription.unsubscribe(); + } + + const fromAmount = this._orderDetails.fromAmount; + + if (this.TEST_MODE && this.TEST_ERROR && this.testStatusIndex === this.statuses.length - 2) { + this.testStatusIndex = this.statuses.length - 1; + } + + this.subscription = Observable.of(0).delay(delay).flatMap(() => { + return this.exchangeService.status( + !this.TEST_MODE ? this._orderDetails.id : '4729821d-390d-4ef8-a31e-2465d82a142f', + !this.TEST_MODE ? null : this.statuses[this.testStatusIndex++], + ); + }).subscribe(order => { + this.order = { ...order, fromAmount }; + this._orderDetails.id = order.id; + this.exchangeService.lastViewedOrder = this._orderDetails; + + if (!this.exchangeService.isOrderFinished(order)) { + this.getStatus(this.TEST_MODE ? 3000 : 30000); + } else { + this.exchangeService.lastViewedOrder = null; + } + + this.loading = false; + }, () => this.showError = true); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.html new file mode 100644 index 00000000..e7003ce1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.html @@ -0,0 +1,35 @@ + +
+
+ + + +
+
+ +
+ + {{ 'exchange.need-help' | translate }} + + {{ 'exchange.support-portal' | translate }} + + + | + + {{ 'exchange.powered-by' | translate }} + SWAPLAB.CC + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.scss new file mode 100644 index 00000000..e73682ae --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.scss @@ -0,0 +1,44 @@ +@import '../../../../theme/variables'; + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + margin: 30px 30px 10px; +} + +.-contact { + margin: 15px 30px; + display: flex; + justify-content: space-between; + + span { + font-size: 13px; + margin: 0 5px; + opacity: .5; + display: inline-block; + vertical-align: middle; + + a { + text-decoration: none; + color: $blue; + } + } + + .history { + opacity: 1; + } + + mat-icon { + font-size: 18px; + width: 18px; + height: 18px; + vertical-align: middle; + } + + .history-text { + font-size: 14px; + opacity: 1; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.spec.ts new file mode 100644 index 00000000..cb854be8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExchangeComponent } from './exchange.component'; + +describe('ExchangeComponent', () => { + let component: ExchangeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ExchangeComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExchangeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.ts new file mode 100644 index 00000000..79247a5e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.ts @@ -0,0 +1,70 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { StoredExchangeOrder } from '../../../app.datatypes'; +import { ExchangeService } from '../../../services/exchange.service'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { ExchangeHistoryComponent } from './exchange-history/exchange-history.component'; +import { ISubscription } from 'rxjs/Subscription'; + +@Component({ + selector: 'app-exchange', + templateUrl: './exchange.component.html', + styleUrls: ['./exchange.component.scss'], +}) +export class ExchangeComponent implements OnInit, OnDestroy { + currentOrderDetails: StoredExchangeOrder; + hasHistory = false; + loading = true; + + private lastViewedSubscription: ISubscription; + private historySubscription: ISubscription; + + constructor( + private exchangeService: ExchangeService, + private dialog: MatDialog, + ) { } + + ngOnInit() { + this.lastViewedSubscription = this.exchangeService.lastViewedOrderLoaded.subscribe(response => { + if (response) { + const lastViewedOrder = this.exchangeService.lastViewedOrder; + if (lastViewedOrder) { + this.currentOrderDetails = lastViewedOrder; + } + + setTimeout(() => this.lastViewedSubscription.unsubscribe()); + this.loading = false; + } + }); + + this.historySubscription = this.exchangeService.history().subscribe(() => this.hasHistory = true); + } + + ngOnDestroy() { + this.lastViewedSubscription.unsubscribe(); + this.historySubscription.unsubscribe(); + } + + showStatus(order) { + this.currentOrderDetails = order; + this.hasHistory = true; + } + + showHistory(event) { + event.preventDefault(); + + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + + this.dialog.open(ExchangeHistoryComponent, config).afterClosed().subscribe((oldOrder: StoredExchangeOrder) => { + if (oldOrder) { + this.currentOrderDetails = oldOrder; + } + }); + } + + goBack() { + this.currentOrderDetails = null; + this.exchangeService.lastViewedOrder = null; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html new file mode 100644 index 00000000..c3d2a45c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html @@ -0,0 +1,36 @@ +
+
+
+
+ {{ 'wallet.new.create-title' | translate }} +
+
+

{{ 'wizard.wallet-desc' | translate }}

+
+
+
+
+
+ +
+
+
+
+ +
+
+
+ {{ 'wizard.hardware-wallet-link' | translate }} +
+ +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss new file mode 100644 index 00000000..dd9c17cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss @@ -0,0 +1,75 @@ +@import '../../../../../theme/variables'; + +.-header { + color: $white; + position: relative; + margin-top: 20px; + margin-bottom: 10px; + line-height: 30px; + font-size: 20px; + text-align: center; +} + +.-description { + line-height: 25px; + font-size: 14px; + text-align: center; + + color: $white; + mix-blend-mode: normal; + opacity: 0.5; +} + +.hw-link { + cursor: pointer; + color: white; + font-size: 13px; + line-height: 20px; + margin-bottom: 20px; +} + +.-buttons-footer { + align-items: center; + flex-flow: column; + margin-bottom: 20px; +} + +.-toggle-container{ + margin: 10px auto; +} + +:host ::ng-deep .-buttons-footer button{ + margin: 2px 10px !important; +} + +.-text-align-center{ + text-align: center; +} + +label[for=seed] { + display: flex; + + > span:last-child { + flex: 1; + } + + .generators { + text-align: right; + + span { + cursor: pointer; + } + + mat-icon { + width: 13px; + height: 10px; + font-size: 13px; + position: relative; + top: 2px; + } + + .divider { + padding: 0 5px; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts new file mode 100644 index 00000000..e93dc61a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingCreateWalletComponent } from './onboarding-create-wallet.component'; + +describe('OnboardingCreateWalletComponent', () => { + let component: OnboardingCreateWalletComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingCreateWalletComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingCreateWalletComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts new file mode 100644 index 00000000..c3b1aa0e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts @@ -0,0 +1,111 @@ +import { Component, EventEmitter, Input, OnInit, Output, ViewChild, OnDestroy } from '@angular/core'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; +import { OnboardingSafeguardComponent } from './onboarding-safeguard/onboarding-safeguard.component'; +import { MatDialogRef } from '@angular/material'; +import { CreateWalletFormComponent, WalletFormData } from '../../wallets/create-wallet/create-wallet-form/create-wallet-form.component'; +import { HwOptionsDialogComponent } from '../../../layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component'; +import { Router } from '@angular/router'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { ConfirmationData } from '../../../../app.datatypes'; +import { showConfirmationModal } from '../../../../utils'; + +@Component({ + selector: 'app-onboarding-create-wallet', + templateUrl: './onboarding-create-wallet.component.html', + styleUrls: ['./onboarding-create-wallet.component.scss'], +}) +export class OnboardingCreateWalletComponent implements OnInit, OnDestroy { + @ViewChild('formControl') formControl: CreateWalletFormComponent; + @Input() fill: WalletFormData = null; + @Output() onLabelAndSeedCreated = new EventEmitter(); + + showNewForm = true; + doubleButtonActive = DoubleButtonActive.LeftButton; + hwCompatibilityActivated = false; + + private synchronized = true; + private synchronizedSubscription: ISubscription; + + constructor( + private dialog: MatDialog, + private router: Router, + hwWalletService: HwWalletService, + blockchainService: BlockchainService, + ) { + this.hwCompatibilityActivated = hwWalletService.hwWalletCompatibilityActivated; + this.synchronizedSubscription = blockchainService.synchronized.subscribe(value => this.synchronized = value); + } + + ngOnInit() { + setTimeout(() => { this.formControl.initForm(null, this.fill); }); + if (this.fill) { + this.doubleButtonActive = this.fill.creatingNewWallet ? DoubleButtonActive.LeftButton : DoubleButtonActive.RightButton; + this.showNewForm = this.fill.creatingNewWallet; + } + } + + ngOnDestroy() { + this.synchronizedSubscription.unsubscribe(); + } + + changeForm(newState) { + newState === DoubleButtonActive.RightButton ? this.showNewForm = false : this.showNewForm = true; + + this.doubleButtonActive = newState; + this.fill = null; + this.formControl.initForm(this.showNewForm, this.fill); + } + + createWallet() { + this.showSafe().afterClosed().subscribe(result => { + if (result) { + this.emitCreatedData(); + } + }); + } + + loadWallet() { + if (this.synchronized) { + this.emitCreatedData(); + } else { + const confirmationData: ConfirmationData = { + headerText: 'wallet.new.synchronizing-warning-title', + text: 'wallet.new.synchronizing-warning-text', + confirmButtonText: 'wallet.new.synchronizing-warning-continue', + cancelButtonText: 'wallet.new.synchronizing-warning-cancel', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.emitCreatedData(); + } + }); + } + } + + useHardwareWallet() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + config.data = true; + this.dialog.open(HwOptionsDialogComponent, config).afterClosed().subscribe(result => { + if (result) { + this.router.navigate(['/wallets']); + } + }); + } + + private emitCreatedData() { + this.onLabelAndSeedCreated.emit(this.formControl.getData()); + } + + private showSafe(): MatDialogRef { + const config = new MatDialogConfig(); + config.width = '450px'; + + return this.dialog.open(OnboardingSafeguardComponent, config); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html new file mode 100644 index 00000000..980e9081 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html @@ -0,0 +1,15 @@ + +
+ {{ 'wizard.confirm.desc' | translate }} +
+ {{ 'wizard.confirm.checkbox' | translate }} + +
+
+
+ + {{ 'wizard.confirm.button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.scss new file mode 100644 index 00000000..555a015d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.scss @@ -0,0 +1,65 @@ +.-safe-description { + font-family: Skycoin; + line-height: 20px; + font-size: 12px; + + color: #1E2227; + mix-blend-mode: normal; + opacity: 0.8; +} + +.-check-container { + text-align: center; + margin-top: 50px; +} + +.-safe-check-text { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: #1E2227; +} + +.-check ::ng-deep { + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: #0072FF !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } +} + +.-text-center { + text-align: center; +} + +.-no-bottom-margin ::ng-deep button { + margin: 28px 10px 0 10px !important; +} + +.-title { + font-family: Skycoin; + line-height: 30px; + font-size: 14px; + text-align: center; + letter-spacing: 0.0769231em; + color: #FF004E; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts new file mode 100644 index 00000000..39e10978 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingSafeguardComponent } from './onboarding-safeguard.component'; + +describe('OnboardingSafeguardComponent', () => { + let component: OnboardingSafeguardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingSafeguardComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingSafeguardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts new file mode 100644 index 00000000..d4c7049a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-onboarding-safeguard', + templateUrl: './onboarding-safeguard.component.html', + styleUrls: ['./onboarding-safeguard.component.scss'], +}) +export class OnboardingSafeguardComponent { + public acceptSafe = false; + + constructor( + public dialogRef: MatDialogRef, + ) { } + + closePopup() { + this.dialogRef.close(this.acceptSafe); + } + + setAccept(event) { + this.acceptSafe = event.checked; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html new file mode 100644 index 00000000..1ddda637 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html @@ -0,0 +1,43 @@ +
+
+
+
+ {{ 'wallet.new.encrypt-title' | translate }} +
+
+

{{ 'wizard.encrypt-desc' | translate }}

+
+
+
+
+
+ + + {{ 'wallet.new.encrypt' | translate }} + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss new file mode 100644 index 00000000..1536dcfc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss @@ -0,0 +1,87 @@ +@import '../../../../../theme/variables'; + +.-header { + color: $white; + position: relative; + margin-top: 20px; + margin-bottom: 10px; + line-height: 30px; + font-size: 20px; + text-align: center; +} + +.-description { + line-height: 25px; + font-size: 14px; + text-align: center; + + color: $white; + mix-blend-mode: normal; + opacity: 0.5; +} + +.-buttons-footer { + align-items: center; + flex-flow: column; + margin-bottom: 20px; +} + +.-check-container { + margin: 10px auto; + text-align: center; +} + +:host ::ng-deep .-buttons-footer button { + margin: 2px 10px !important; +} + +.-text-align-center { + text-align: center; +} + +.-check ::ng-deep { + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $white !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + span { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: #FBFBFB; + + img { + width: 38px; + height: 38px; + vertical-align: middle; + } + } +} + +.-input.disable{ + background: rgba(255, 255, 255, 0.1); +} + +.-hidden { + display: none; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts new file mode 100644 index 00000000..ae851bb1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingEncryptWalletComponent } from './onboarding-encrypt-wallet.component'; + +describe('OnboardingEncryptWalletComponent', () => { + let component: OnboardingEncryptWalletComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingEncryptWalletComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingEncryptWalletComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts new file mode 100644 index 00000000..5a42b8bd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts @@ -0,0 +1,69 @@ +import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { ButtonComponent } from '../../../layout/button/button.component'; + +@Component({ + selector: 'app-onboarding-encrypt-wallet', + templateUrl: './onboarding-encrypt-wallet.component.html', + styleUrls: ['./onboarding-encrypt-wallet.component.scss'], +}) +export class OnboardingEncryptWalletComponent implements OnInit { + @ViewChild('button') button: ButtonComponent; + @Output() onPasswordCreated = new EventEmitter(); + @Output() onBack = new EventEmitter(); + form: FormGroup; + + constructor( + private formBuilder: FormBuilder, + ) { } + + ngOnInit() { + this.initEncryptForm(); + } + + initEncryptForm() { + this.form = this.formBuilder.group({ + password: new FormControl('', Validators.compose([Validators.required, Validators.minLength(2)])), + confirm: new FormControl('', + Validators.compose([ + Validators.required, + Validators.minLength(2), + ]), + ), + }, + { + validator: this.passwordMatchValidator.bind(this), + }); + } + + setEncrypt(event) { + event.checked ? this.form.enable() : this.form.disable(); + } + + emitCreatedPassword() { + if ((this.form.enabled && !this.form.valid) || this.button.isLoading()) { + return; + } + + this.button.setLoading(); + + this.onPasswordCreated.emit(this.form.enabled ? this.form.get('password').value : null); + } + + emitBack() { + this.onBack.emit(); + } + + resetButton() { + this.button.resetState(); + } + + get isWorking() { + return this.button.isLoading(); + } + + private passwordMatchValidator(g: FormGroup) { + return g.get('password').value === g.get('confirm').value + ? null : { mismatch: true }; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.html new file mode 100644 index 00000000..e23d1aad --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.html @@ -0,0 +1,16 @@ + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.scss new file mode 100644 index 00000000..4459db3d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.scss @@ -0,0 +1,12 @@ +button { + position: fixed; + right: 30px; + top: 10px; +} + +.flag { + width: 16px; + height: 16px; + position: relative; + top: -3px; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts new file mode 100644 index 00000000..b41b460f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingComponent } from './onboarding.component'; + +describe('OnboardingComponent', () => { + let component: OnboardingComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts new file mode 100644 index 00000000..38c46c90 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts @@ -0,0 +1,80 @@ +import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { WalletService } from '../../../services/wallet.service'; +import { LanguageData, LanguageService } from '../../../services/language.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { openChangeLanguageModal } from '../../../utils'; +import { MatDialog } from '@angular/material'; +import { WalletFormData } from '../wallets/create-wallet/create-wallet-form/create-wallet-form.component'; +import { MsgBarService } from '../../../services/msg-bar.service'; +import { OnboardingEncryptWalletComponent } from './onboarding-encrypt-wallet/onboarding-encrypt-wallet.component'; + +@Component({ + selector: 'app-onboarding', + templateUrl: './onboarding.component.html', + styleUrls: ['./onboarding.component.scss'], +}) +export class OnboardingComponent implements OnInit, OnDestroy { + @ViewChild('encryptForm') encryptForm: OnboardingEncryptWalletComponent; + + step = 1; + formData: WalletFormData; + password: string|null; + language: LanguageData; + + private subscription: ISubscription; + + constructor( + private router: Router, + private walletService: WalletService, + private languageService: LanguageService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + ) { } + + ngOnInit() { + this.subscription = this.languageService.currentLanguage + .subscribe(lang => this.language = lang); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + onLabelAndSeedCreated(data: WalletFormData) { + this.formData = data, + this.step = 2; + } + + onPasswordCreated(password: string|null) { + this.password = password; + + this.createWallet(); + } + + onBack() { + this.step = 1; + } + + changelanguage() { + openChangeLanguageModal(this.dialog) + .subscribe(response => { + if (response) { + this.languageService.changeLanguage(response); + } + }); + } + + get fill() { + return this.formData; + } + + private createWallet() { + this.walletService.create(this.formData.label, this.formData.seed, 100, this.password).subscribe(() => { + this.router.navigate(['/wallets']); + }, e => { + this.msgBarService.showError(e); + this.encryptForm.resetButton(); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.html new file mode 100644 index 00000000..73828752 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.html @@ -0,0 +1,28 @@ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + {{ 'reset.reset-button' | translate }} + +
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.scss new file mode 100644 index 00000000..0823d4ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.scss @@ -0,0 +1,15 @@ +.-buttons { + text-align: center; +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + margin: 30px; +} + +.-disabled { + opacity: 0.5; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.spec.ts new file mode 100644 index 00000000..a5d70a21 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResetPasswordComponent } from './reset-password.component'; + +describe('ResetPasswordComponent', () => { + let component: ResetPasswordComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ResetPasswordComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ResetPasswordComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.ts new file mode 100644 index 00000000..11cb7072 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, ViewChild } from '@angular/core'; +import { ISubscription } from 'rxjs/Subscription'; +import { ButtonComponent } from '../../layout/button/button.component'; +import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { Observable } from 'rxjs/Observable'; +import { WalletService } from '../../../services/wallet.service'; +import { Wallet } from '../../../app.datatypes'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +@Component({ + selector: 'app-reset-password', + templateUrl: './reset-password.component.html', + styleUrls: ['./reset-password.component.scss'], +}) +export class ResetPasswordComponent implements OnDestroy { + @ViewChild('resetButton') resetButton: ButtonComponent; + + form: FormGroup; + + private subscription: ISubscription; + private wallet: Wallet; + private done = false; + private hideBarWhenClosing = true; + + constructor( + public formBuilder: FormBuilder, + private route: ActivatedRoute, + private router: Router, + private walletService: WalletService, + private msgBarService: MsgBarService, + ) { + this.initForm(''); + this.subscription = Observable.zip(this.route.params, this.walletService.all(), (params: Params, wallets: Wallet[]) => { + const wallet = wallets.find(w => w.filename === params['id']); + if (!wallet) { + setTimeout(() => this.router.navigate([''], {skipLocationChange: true})); + + return; + } + + this.wallet = wallet; + this.initForm(wallet.label); + }).subscribe(); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + if (this.hideBarWhenClosing) { + this.msgBarService.hide(); + } + } + + initForm(walletName: string) { + const validators = []; + validators.push(this.passwordMatchValidator.bind(this)); + + this.form = new FormGroup({}, validators); + this.form.addControl('wallet', new FormControl(walletName)); + this.form.addControl('seed', new FormControl('', [Validators.required])); + this.form.addControl('password', new FormControl()); + this.form.addControl('confirm', new FormControl()); + } + + reset() { + if (!this.form.valid || this.resetButton.isLoading() || this.done) { + return; + } + + this.msgBarService.hide(); + this.resetButton.setLoading(); + + this.walletService.resetPassword(this.wallet, this.form.value.seed, this.form.value.password !== '' ? this.form.value.password : null) + .subscribe(() => { + this.resetButton.setSuccess(); + this.resetButton.setDisabled(); + this.done = true; + + this.hideBarWhenClosing = false; + this.msgBarService.showDone('reset.done'); + + setTimeout(() => { + this.router.navigate(['']); + }, 2000); + }, error => { + this.resetButton.resetState(); + this.msgBarService.showError(error); + }); + } + + private passwordMatchValidator() { + if (this.form && this.form.get('password') && this.form.get('confirm')) { + return this.form.get('password').value === this.form.get('confirm').value ? null : { NotEqual: true }; + } else { + return { NotEqual: true }; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.html new file mode 100644 index 00000000..6f745d35 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.html @@ -0,0 +1,13 @@ + +
+
{{ wallet.label }}
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.scss new file mode 100644 index 00000000..e0e52038 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.scss @@ -0,0 +1,44 @@ +@import '../../../../../../theme/variables'; + +button { + width: 100%; + text-align: left; + padding: 10px 10px; + border-bottom: 1px solid #eff0f0; +} + +.wallet-container { + padding-top: 30px; + margin: 0px -10px; + + &:first-child { + padding-top: 0px; + } + + .title { + color: $black; + border-bottom: 1px solid #eff0f0; + padding: 0px 10px; + font-size: 18px; + line-height: 32px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + + .address { + font-size: 13px; + line-height: 22px; + color: $black; + } + + .balance { + font-size: 12px; + line-height: 18px; + color: $black; + + .grey { + color: $grey; + } + } +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.spec.ts new file mode 100644 index 00000000..64ab6118 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SelectAddressComponent } from './select-address'; + +describe('SelectAddressComponent', () => { + let component: SelectAddressComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SelectAddressComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SelectAddressComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.ts new file mode 100644 index 00000000..37ca511a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.ts @@ -0,0 +1,29 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { WalletService } from '../../../../../services/wallet.service'; +import { Wallet } from '../../../../../app.datatypes'; + +@Component({ + selector: 'app-select-address', + templateUrl: './select-address.html', + styleUrls: ['./select-address.scss'], +}) +export class SelectAddressComponent { + + wallets: Wallet[] = []; + + constructor( + public dialogRef: MatDialogRef, + public walletService: WalletService, + ) { + this.walletService.all().first().subscribe(wallets => this.wallets = wallets); + } + + closePopup() { + this.dialogRef.close(); + } + + select(value: string) { + this.dialogRef.close(value); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html new file mode 100644 index 00000000..f6697066 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html @@ -0,0 +1,222 @@ +
+
+ +
+ +
+
+ + +
+ +
+ + + {{ addr.address }} - {{ (addr.coins ? addr.coins.toString() : 0) | amount }} + ({{ addr.hours.toString() | amount:false }}) + + +
+ {{ address.address }} - {{ (address.coins ? address.coins.toString() : 0) | amount }} + ({{ address.hours.toString() | amount:false }}) +
+
+
+
+
+ +
+ +
+ + + {{ out.hash }} - {{ (out.coins ? out.coins.toString() : 0) | amount }} + ({{ out.calculated_hours.toString() | amount:false }}) + + +
+ {{ out.hash }} - {{ (out.coins ? out.coins.toString() : 0) | amount }} + ({{ out.calculated_hours.toString() | amount:false }}) +
+
+ +
{{ 'send.all-outputs' | translate }}
+
+
+
+
+
+ {{ 'send.available-msg-part1' | translate }} + + {{ availableCoins.toString() | amount }} + + {{ 'send.available-msg-part2' | translate }} + + {{ availableHours.toString() | amount:false }} + + {{ 'send.available-msg-part3' | translate }} + + {{ minimumFee.toString() | amount:false }} + + {{ 'send.available-msg-part4' | translate }} +
+
+ +
+ +
+ +
+ + {{ 'send.bulk-send.title' | translate }} keyboard_arrow_down + + +
+
+
+ +
+
+
+ + {{ selectedCurrency === doubleButtonActive.LeftButton ? ('coin' | commonText) : ('common.usd' | translate) }} +
+
+ {{ 'send.invalid-amount' | translate }} + + ~ {{ values[i] | number:'1.0-2' }} {{ 'common.usd' | translate }} + + + ~ {{ values[i] | amount }} + + +
+
+
+
+ + {{ 'hours' | commonText }} +
+
+
+ plus + minus +
+
+
+
+
+
+
+ {{ 'send.total' | translate }} {{ totalCoins.toString() | amount }} / {{ totalConvertedCoins.toString() | number:'1.0-2' }} {{ 'common.usd' | translate }} +
+
+
+
+ {{ 'send.total' | translate }} {{ totalHours.toString() | amount:false }} +
+
+
+
+ +
+ + +
+ +
+ + +
+ +
+
+
+ +
+ {{ 'send.hours-allocation-label' | translate }} + + {{ 'send.options-label' | translate }} {{ autoOptions ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }} + +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+ + {{ 'send.preview-button' | translate }} + + + {{ 'send.send-button' | translate }} + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss new file mode 100644 index 00000000..fc62598d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss @@ -0,0 +1,186 @@ +@import '../../../../../theme/variables'; + +.form-field { + mat-spinner { + height: 12px !important; + width: 12px !important; + opacity: 0.5; + margin: 0 !important; + display: inline-block; + position: relative; + top: 2px; + margin-left: 8px; + + ::ng-deep svg { + height: 12px !important; + width: 12px !important; + } + } +} + +.-destination { + &:not(:last-child) { + margin-bottom: 5px; + } + + .-icons { + text-align: right; + padding-top: 5px; + + img { + width: 32px; + cursor: pointer; + } + } +} + +mat-checkbox { + font-size: 12px; +} + +mat-select { + background: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + + ::ng-deep .mat-select-trigger { + padding: 10px 30px 10px 10px; + display: block; + font-size: 11px; + height: 100%; + line-height: 20px; + } + + ::ng-deep .mat-select-arrow { + border: none; + } + + ::ng-deep .mat-select-placeholder { + color: unset !important; + transition: unset !important; + } +} + +mat-option ::ng-deep .mat-pseudo-checkbox-checked { + background: $gradient-blue-dark; +} + +.-autohours { + margin: 40px 0 20px; + + .-check ::ng-deep { + .mat-checkbox-checkmark-path { + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + + .mat-checkbox-label { + line-height: 20px; + font-size: 13px; + color: $grey-dark; + flex: 1; + } + + .mat-checkbox-layout { + display: flex; + } + } + + .-options-wrapper { + margin-top: 20px; + + mat-slider { + width: 100%; + padding: 0; + height: 40px; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + background: white; + + ::ng-deep { + .mat-slider-thumb, .mat-slider-thumb-label { + background-color: $gradient-blue-dark !important; + transform: scale(1) !important; + border-width: 0 !important; + } + + .mat-slider-thumb { + right: -6px; + width: 12px; + height: 32px; + border-radius: 3px; + } + + .mat-slider-track-fill, .mat-slider-track-background { + background-color: white !important; + } + } + } + } +} + +.-options { + padding-left: 5px; + color: $gradient-blue-dark; + cursor: pointer; + font-size: 13px; + + mat-icon { + color: $gradient-blue-dark; + padding: 0; + display: inline; + vertical-align: middle; + font-size: 13px; + } +} + +.-buttons { + text-align: center; +} + +.-hidden { + display: none; +} + +.-space-between { + display: flex; + justify-content: space-between; +} + +label mat-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + padding-left: 5px; +} + +.-available-msg { + background-color: $grey-lightest; + border: 1px dotted $grey-light; + border-radius: 6px; + padding: 10px; + font-size: 11px; + text-align: center; + + span { + opacity: 0.7; + } + + .value { + opacity: 1 !important; + font-weight: bold; + font-size: 13px; + } +} + +.destinations-label { + display: inline-block; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts new file mode 100644 index 00000000..057bc477 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendFormAdvancedComponent } from './send-form-advanced.component'; + +describe('SendFormAdvancedComponent', () => { + let component: SendFormAdvancedComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendFormAdvancedComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendFormAdvancedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts new file mode 100644 index 00000000..66990561 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts @@ -0,0 +1,895 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, ChangeDetectorRef } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { SelectAddressComponent } from './select-address/select-address'; +import { BigNumber } from 'bignumber.js'; +import { Output as UnspentOutput, Wallet, Address, ConfirmationData } from '../../../../app.datatypes'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/retryWhen'; +import 'rxjs/add/operator/concat'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { showConfirmationModal } from '../../../../utils'; +import { AppService } from '../../../../services/app.service'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; +import { PriceService } from '../../../../services/price.service'; +import { SendFormComponent } from '../send-form/send-form.component'; +import { ChangeNoteComponent } from '../send-preview/transaction-info/change-note/change-note.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; +import { MultipleDestinationsDialogComponent } from '../../../layout/multiple-destinations-dialog/multiple-destinations-dialog.component'; + +@Component({ + selector: 'app-send-form-advanced', + templateUrl: './send-form-advanced.component.html', + styleUrls: ['./send-form-advanced.component.scss'], +}) +export class SendFormAdvancedComponent implements OnInit, OnDestroy { + @ViewChild('previewButton') previewButton: ButtonComponent; + @ViewChild('sendButton') sendButton: ButtonComponent; + @Input() formData: any; + @Output() onFormSubmitted = new EventEmitter(); + + maxNoteChars = ChangeNoteComponent.MAX_NOTE_CHARS; + form: FormGroup; + wallet: Wallet; + addresses = []; + allUnspentOutputs: UnspentOutput[] = []; + unspentOutputs: UnspentOutput[] = []; + loadingUnspentOutputs = false; + availableCoins = new BigNumber(0); + availableHours = new BigNumber(0); + minimumFee = new BigNumber(0); + autoHours = true; + autoOptions = false; + autoShareValue = '0.5'; + previewTx: boolean; + busy = false; + doubleButtonActive = DoubleButtonActive; + selectedCurrency = DoubleButtonActive.LeftButton; + values: number[]; + price: number; + wallets: Wallet[]; + totalCoins = new BigNumber(0); + totalConvertedCoins = new BigNumber(0); + totalHours = new BigNumber(0); + + private subscriptionsGroup: ISubscription[] = []; + private getOutputsSubscriptions: ISubscription; + private destinationSubscriptions: ISubscription[] = []; + private destinationHoursSubscriptions: ISubscription[] = []; + private syncCheckSubscription: ISubscription; + private processingSubscription: ISubscription; + + constructor( + public blockchainService: BlockchainService, + public walletService: WalletService, + private appService: AppService, + private formBuilder: FormBuilder, + private dialog: MatDialog, + private msgBarService: MsgBarService, + private navbarService: NavBarService, + private hwWalletService: HwWalletService, + private translate: TranslateService, + private priceService: PriceService, + private changeDetector: ChangeDetectorRef, + ) { } + + ngOnInit() { + this.navbarService.showSwitch('send.simple', 'send.advanced', DoubleButtonActive.RightButton); + + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + addresses: [null], + outputs: [null], + changeAddress: [''], + destinations: this.formBuilder.array( + [this.createDestinationFormGroup()], + this.validateDestinations.bind(this), + ), + note: [''], + }); + + this.subscriptionsGroup.push(this.form.get('wallet').valueChanges.subscribe(wallet => { + this.wallet = wallet; + + this.closeGetOutputsSubscriptions(); + this.allUnspentOutputs = []; + this.unspentOutputs = []; + this.loadingUnspentOutputs = true; + + this.getOutputsSubscriptions = this.walletService.getWalletUnspentOutputs(wallet) + .retryWhen(errors => errors.delay(1000).take(10).concat(Observable.throw(''))) + .subscribe( + result => { + this.loadingUnspentOutputs = false; + this.allUnspentOutputs = result; + this.unspentOutputs = this.filterUnspentOutputs(); + }, + () => this.loadingUnspentOutputs = false, + ); + + this.addresses = wallet.addresses.filter(addr => addr.coins > 0); + this.form.get('addresses').setValue(null); + this.form.get('outputs').setValue(null); + + this.updateAvailableBalance(); + this.form.get('destinations').updateValueAndValidity(); + })); + + this.subscriptionsGroup.push(this.form.get('addresses').valueChanges.subscribe(() => { + this.form.get('outputs').setValue(null); + this.unspentOutputs = this.filterUnspentOutputs(); + + this.updateAvailableBalance(); + this.form.get('destinations').updateValueAndValidity(); + })); + + this.subscriptionsGroup.push(this.form.get('outputs').valueChanges.subscribe(() => { + this.updateAvailableBalance(); + this.form.get('destinations').updateValueAndValidity(); + })); + + this.subscriptionsGroup.push(this.priceService.price.subscribe(price => { + this.price = price; + this.updateValues(); + })); + + if (this.formData) { + this.fillForm(); + } + + this.subscriptionsGroup.push(this.walletService.all().first().subscribe(wallets => { + this.wallets = wallets; + if (wallets.length === 1) { + this.form.get('wallet').setValue(wallets[0]); + } + })); + } + + ngOnDestroy() { + if (this.processingSubscription && !this.processingSubscription.closed) { + this.processingSubscription.unsubscribe(); + } + this.closeGetOutputsSubscriptions(); + this.closeSyncCheckSubscription(); + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + this.navbarService.hideSwitch(); + this.msgBarService.hide(); + this.destinationSubscriptions.forEach(s => s.unsubscribe()); + this.destinationHoursSubscriptions.forEach(s => s.unsubscribe()); + } + + preview() { + this.previewTx = true; + this.checkBeforeSending(); + this.changeDetector.detectChanges(); + } + + send() { + this.previewTx = false; + this.checkBeforeSending(); + } + + changeActiveCurrency(value) { + if (value !== this.selectedCurrency) { + this.selectedCurrency = value; + this.askIfConvertAmount(); + this.updateValues(); + (this.form.get('destinations') as FormArray).updateValueAndValidity(); + } + } + + private askIfConvertAmount() { + let validAmounts = 0; + this.destControls.forEach((dest, i) => { + let value: string = dest.get('coins').value; + value = value ? value.trim() : value; + const currentValue = new BigNumber(value); + + if (!value || currentValue.isNaN()) { + return; + } + + validAmounts += 1; + }); + if (validAmounts === 0) { + return; + } + + const usd = this.translate.instant('common.usd'); + const currentCoin = this.appService.coinName; + let fromText: string; + let toText: string; + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + fromText = usd; + toText = currentCoin; + } else { + fromText = currentCoin; + toText = usd; + } + + const confirmationData: ConfirmationData = { + text: this.translate.instant(validAmounts === 1 ? 'send.convert-confirmation' : 'send.convert-confirmation-plural', {from: fromText, to: toText}), + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.convertAmounts(); + } + }); + } + + private convertAmounts() { + this.msgBarService.hide(); + + let invalidValues = 0; + let valuesWithPrecisionErrors = 0; + this.destControls.forEach((dest, i) => { + let value: string = dest.get('coins').value; + value = value ? value.trim() : value; + const currentValue = new BigNumber(value); + + if (value) { + if (!value || currentValue.isNaN()) { + invalidValues += 1; + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + const newValue = currentValue.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + const recoveredValue = newValue.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + if (!recoveredValue.isEqualTo(currentValue)) { + valuesWithPrecisionErrors += 1; + } + + dest.get('coins').setValue(newValue.toString()); + } else { + const newValue = currentValue.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + const recoveredValue = newValue.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + if (!recoveredValue.isEqualTo(currentValue)) { + valuesWithPrecisionErrors += 1; + } + + dest.get('coins').setValue(newValue.toString()); + } + } + }); + + if (invalidValues > 0 && valuesWithPrecisionErrors > 0) { + this.msgBarService.showWarning(this.translate.instant('send.multiple-problems-warning')); + } else if (invalidValues === 1) { + this.msgBarService.showWarning(this.translate.instant('send.invaid-amount-warning')); + } else if (invalidValues > 1) { + this.msgBarService.showWarning(this.translate.instant('send.invaid-amounts-warning')); + } else if (valuesWithPrecisionErrors === 1) { + this.msgBarService.showWarning(this.translate.instant('send.precision-error-warning')); + } else if (valuesWithPrecisionErrors > 1) { + this.msgBarService.showWarning(this.translate.instant('send.precision-errors-warning')); + } + } + + assignAll(index: number) { + this.msgBarService.hide(); + + let availableCoins: BigNumber = this.form.get('wallet').value && this.form.get('wallet').value.coins ? this.form.get('wallet').value.coins : new BigNumber(-1); + if ((availableCoins as BigNumber).isEqualTo(-1)) { + this.msgBarService.showError(this.translate.instant('send.no-wallet-selected')); + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.RightButton) { + availableCoins = availableCoins.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + } + + this.destControls.forEach((dest, i) => { + if (i !== index) { + const value = Number.parseFloat((dest.get('coins').value as string).trim()); + if (!value || isNaN(value)) { + return; + } else { + availableCoins = availableCoins.minus(value); + } + } + }); + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + availableCoins = availableCoins.decimalPlaces(this.blockchainService.currentMaxDecimals, BigNumber.ROUND_FLOOR); + } else { + availableCoins = availableCoins.decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + } + + if (availableCoins.isLessThan(0)) { + this.msgBarService.showError(this.translate.instant('send.no-coins-left')); + } else { + this.destControls[index].get('coins').setValue(availableCoins.toString()); + } + } + + private updateValues() { + if (!this.price) { + this.values = null; + + return; + } + + this.values = []; + this.totalCoins = new BigNumber(0); + this.totalConvertedCoins = new BigNumber(0); + this.totalHours = new BigNumber(0); + + this.destControls.forEach((dest, i) => { + const stringValue: string = dest.get('coins').value; + const value = this.getAmount(stringValue, true); + if (!value) { + this.values[i] = -1; + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + const convertedValue = value.multipliedBy(this.price).decimalPlaces(2); + + this.totalCoins = this.totalCoins.plus(value); + this.totalConvertedCoins = this.totalConvertedCoins.plus(convertedValue); + + this.values[i] = convertedValue.toNumber(); + } else { + const convertedValue = value.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + + this.totalCoins = this.totalCoins.plus(convertedValue); + this.totalConvertedCoins = this.totalConvertedCoins.plus(value); + + this.values[i] = convertedValue.toNumber(); + } + }); + + if (!this.autoHours) { + this.destControls.forEach((dest, i) => { + const stringValue: string = dest.get('hours').value; + const value = this.getAmount(stringValue, false); + if (!value) { + return; + } + + this.totalHours = this.totalHours.plus(value); + }); + } + } + + private checkBeforeSending() { + if (!this.form.valid || this.previewButton.isLoading() || this.sendButton.isLoading()) { + return; + } + + this.closeSyncCheckSubscription(); + this.syncCheckSubscription = this.blockchainService.synchronized.first().subscribe(synchronized => { + if (synchronized) { + this.prepareTransaction(); + } else { + this.showSynchronizingWarning(); + } + }); + } + + private showSynchronizingWarning() { + const confirmationData: ConfirmationData = { + text: 'send.synchronizing-warning', + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.prepareTransaction(); + } + }); + } + + private prepareTransaction() { + this.msgBarService.hide(); + this.previewButton.resetState(); + this.sendButton.resetState(); + + if (this.form.value.wallet.encrypted && !this.form.value.wallet.isHardware && !this.previewTx) { + const config = new MatDialogConfig(); + config.data = { + wallet: this.form.value.wallet, + }; + + this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.createTransaction(passwordDialog); + }); + } else { + if (!this.form.value.wallet.isHardware || this.previewTx) { + this.createTransaction(); + } else { + this.showBusy(); + this.processingSubscription = this.hwWalletService.checkIfCorrectHwConnected((this.form.value.wallet as Wallet).addresses[0].address).subscribe( + () => this.createTransaction(), + err => this.showError(getHardwareWalletErrorMsg(this.translate, err)), + ); + } + } + } + + addDestination() { + const destinations = this.form.get('destinations') as FormArray; + destinations.push(this.createDestinationFormGroup()); + this.updateValues(); + } + + removeDestination(index) { + const destinations = this.form.get('destinations') as FormArray; + destinations.removeAt(index); + + this.destinationSubscriptions[index].unsubscribe(); + this.destinationSubscriptions.splice(index, 1); + this.destinationHoursSubscriptions[index].unsubscribe(); + this.destinationHoursSubscriptions.splice(index, 1); + this.updateValues(); + } + + setShareValue(event) { + this.autoShareValue = parseFloat(event.value).toFixed(2); + } + + selectChangeAddress(event) { + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + this.dialog.open(SelectAddressComponent, config).afterClosed().subscribe(response => { + if (response) { + this.form.get('changeAddress').setValue(response); + } + }); + } + + openMultipleDestinationsPopup() { + + let currentString = ''; + this.destControls.map((destControl, i) => { + if ((destControl.get('address').value as string).trim().length > 0 || + (destControl.get('coins').value as string).trim().length > 0 || + (!this.autoHours && (destControl.get('hours').value as string).trim().length > 0)) { + + currentString += (destControl.get('address').value as string).replace(',', ''); + currentString += ', ' + (destControl.get('coins').value as string).replace(',', ''); + if (!this.autoHours) { + currentString += ', ' + (destControl.get('hours').value as string).replace(',', ''); + } + currentString += '\r\n'; + } + }); + if (currentString.length > 0) { + currentString = currentString.substr(0, currentString.length - 1); + } + + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = currentString; + this.dialog.open(MultipleDestinationsDialogComponent, config).afterClosed().subscribe((response: string[][]) => { + if (response) { + while (this.destControls.length > 0) { + (this.form.get('destinations') as FormArray).removeAt(0); + } + + if (response.length > 0) { + this.autoHours = response[0].length === 2; + + response.forEach((entry, i) => { + this.addDestination(); + this.destControls[i].get('address').setValue(entry[0]); + this.destControls[i].get('coins').setValue(entry[1]); + if (!this.autoHours) { + this.destControls[i].get('hours').setValue(entry[2]); + } + }); + } else { + this.addDestination(); + } + } + }); + + this.updateValues(); + } + + toggleOptions(event) { + event.stopPropagation(); + event.preventDefault(); + + this.autoOptions = !this.autoOptions; + } + + setAutoHours(event) { + this.autoHours = event.checked; + this.form.get('destinations').updateValueAndValidity(); + this.updateValues(); + + if (!this.autoHours) { + this.autoOptions = false; + } + } + + private fillForm() { + this.addresses = this.formData.form.wallet.addresses; + + ['wallet', 'addresses', 'changeAddress', 'note'].forEach(name => { + this.form.get(name).setValue(this.formData.form[name]); + }); + + for (let i = 0; i < this.formData.form.destinations.length - 1; i++) { + this.addDestination(); + } + + this.destControls.forEach((destControl, i) => { + ['address', 'hours'].forEach(name => { + destControl.get(name).setValue(this.formData.form.destinations[i][name]); + }); + destControl.get('coins').setValue(this.formData.form.destinations[i].originalAmount); + }); + + if (this.formData.form.hoursSelection.type === 'auto') { + this.autoShareValue = this.formData.form.hoursSelection.share_factor; + this.autoHours = true; + } else { + this.autoHours = false; + } + + this.autoOptions = this.formData.form.autoOptions; + + if (this.formData.form.allUnspentOutputs) { + this.closeGetOutputsSubscriptions(); + + this.allUnspentOutputs = this.formData.form.allUnspentOutputs; + this.unspentOutputs = this.filterUnspentOutputs(); + + this.form.get('outputs').setValue(this.formData.form.outputs); + } + + this.selectedCurrency = this.formData.form.currency; + + this.updateValues(); + } + + addressCompare(a, b) { + return a && b && a.address === b.address; + } + + outputCompare(a, b) { + return a && b && a.hash === b.hash; + } + + get destControls() { + return (this.form.get('destinations') as FormArray).controls; + } + + private validateDestinations() { + if (!this.form) { + return { Required: true }; + } + + const invalidInput = this.destControls.find(control => { + if (!control.get('address').value || (control.get('address').value as string).trim().length === 0) { + return true; + } + + const checkControls = ['coins']; + + if (!this.autoHours) { + checkControls.push('hours'); + } + + return checkControls.map(name => { + const stringValue: string = control.get(name).value; + + return this.getAmount(stringValue, name === 'coins') === null; + }).find(e => e === true); + }); + + if (invalidInput) { + return { Invalid: true }; + } + + this.updateAvailableBalance(); + + let destinationsCoins = new BigNumber(0); + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + this.destControls.map(control => destinationsCoins = destinationsCoins.plus(control.value.coins)); + } else { + this.updateValues(); + this.values.map(value => destinationsCoins = destinationsCoins.plus(value)); + } + let destinationsHours = new BigNumber(0); + if (!this.autoHours) { + this.destControls.map(control => destinationsHours = destinationsHours.plus(control.value.hours)); + } + + if (destinationsCoins.isGreaterThan(this.availableCoins) || destinationsHours.isGreaterThan(this.availableHours)) { + return { Invalid: true }; + } + + return null; + } + + private getAmount(stringValue: string, checkingCoins: boolean): BigNumber { + stringValue = stringValue ? stringValue.trim() : stringValue; + const value = new BigNumber(stringValue); + + if (!stringValue || value.isNaN() || value.isLessThanOrEqualTo(0)) { + return null; + } + + if (checkingCoins) { + const parts = stringValue.split('.'); + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + if (parts.length === 2 && parts[1].length > this.blockchainService.currentMaxDecimals) { + return null; + } + } else { + if (parts.length === 2 && parts[1].length > SendFormComponent.MaxUsdDecimals) { + return null; + } + } + } else if (name === 'hours') { + if (!value.isEqualTo(value.decimalPlaces(0))) { + return null; + } + } + + return value; + } + + private createDestinationFormGroup() { + const group = this.formBuilder.group({ + address: '', + coins: '', + hours: '', + }); + + this.destinationSubscriptions.push(group.get('coins').valueChanges.subscribe(value => { + this.updateValues(); + })); + + this.destinationHoursSubscriptions.push(group.get('hours').valueChanges.subscribe(value => { + this.updateValues(); + })); + + return group; + } + + private showBusy() { + if (this.previewTx) { + this.previewButton.setLoading(); + this.sendButton.setDisabled(); + } else { + this.sendButton.setLoading(); + this.previewButton.setDisabled(); + } + this.busy = true; + this.navbarService.disableSwitch(); + } + + private createTransaction(passwordDialog?: any) { + this.showBusy(); + + const selectedAddresses = this.form.get('addresses').value && (this.form.get('addresses').value as Address[]).length > 0 ? + this.form.get('addresses').value.map(addr => addr.address) : null; + + const selectedOutputs = this.form.get('outputs').value && (this.form.get('outputs').value as UnspentOutput[]).length > 0 ? + this.form.get('outputs').value.map(addr => addr.hash) : null; + + this.processingSubscription = this.walletService.createTransaction( + this.form.value.wallet, + selectedAddresses ? selectedAddresses : (this.form.value.wallet as Wallet).addresses.map(address => address.address), + selectedOutputs, + this.destinations, + this.hoursSelection, + this.form.get('changeAddress').value ? this.form.get('changeAddress').value : null, + passwordDialog ? passwordDialog.password : null, + this.previewTx, + ).subscribe(transaction => { + if (passwordDialog) { + passwordDialog.close(); + } + + const note = this.form.value.note.trim(); + if (!this.previewTx) { + this.processingSubscription = this.walletService.injectTransaction(transaction.encoded, note) + .subscribe(noteSaved => { + let showDone = true; + if (note && !noteSaved) { + this.msgBarService.showWarning(this.translate.instant('send.error-saving-note')); + showDone = false; + } + + this.showSuccess(showDone); + }, error => this.showError(error)); + } else { + let amount = new BigNumber('0'); + this.destinations.map(destination => amount = amount.plus(destination.coins)); + + this.onFormSubmitted.emit({ + form: { + wallet: this.form.get('wallet').value, + addresses: this.form.get('addresses').value, + changeAddress: this.form.get('changeAddress').value, + destinations: this.destinations, + hoursSelection: this.hoursSelection, + autoOptions: this.autoOptions, + allUnspentOutputs: this.loadingUnspentOutputs ? null : this.allUnspentOutputs, + outputs: this.form.get('outputs').value, + currency: this.selectedCurrency, + note: note, + }, + amount: amount, + to: this.destinations.map(d => d.address), + transaction, + }); + this.busy = false; + this.navbarService.enableSwitch(); + } + }, error => { + if (passwordDialog) { + passwordDialog.error(error); + } + + if (error && error.result) { + this.showError(getHardwareWalletErrorMsg(this.translate, error)); + } else { + this.showError(error); + } + }); + } + + private resetForm() { + this.form.get('wallet').setValue('', { emitEvent: false }); + this.form.get('addresses').setValue(null); + this.form.get('outputs').setValue(null); + this.form.get('changeAddress').setValue(''); + this.form.get('note').setValue(''); + + this.wallet = null; + + while (this.destControls.length > 0) { + (this.form.get('destinations') as FormArray).removeAt(0); + } + + this.addDestination(); + + this.autoHours = true; + this.autoOptions = false; + this.autoShareValue = '0.5'; + this.updateValues(); + } + + private get destinations() { + return this.destControls.map((destControl, i) => { + const destination = { + address: ((destControl.get('address').value) as string).trim(), + coins: ((this.selectedCurrency === DoubleButtonActive.LeftButton ? destControl.get('coins').value : this.values[i].toString()) as string).trim(), + originalAmount: destControl.get('coins').value, + }; + + if (!this.autoHours) { + destination['hours'] = destControl.get('hours').value; + } + + return destination; + }); + } + + private get hoursSelection() { + let hoursSelection = { + type: 'manual', + }; + + if (this.autoHours) { + hoursSelection = { + type: 'auto', + mode: 'share', + share_factor: this.autoShareValue, + }; + } + + return hoursSelection; + } + + private updateAvailableBalance() { + if (this.form.get('wallet').value) { + this.availableCoins = new BigNumber(0); + this.availableHours = new BigNumber(0); + + const outputs: UnspentOutput[] = this.form.get('outputs').value; + const addresses: Address[] = this.form.get('addresses').value; + + if (outputs && outputs.length > 0) { + outputs.map(control => { + this.availableCoins = this.availableCoins.plus(control.coins); + this.availableHours = this.availableHours.plus(control.calculated_hours); + }); + } else if (addresses && addresses.length > 0) { + addresses.map(control => { + this.availableCoins = this.availableCoins.plus(control.coins); + this.availableHours = this.availableHours.plus(control.hours); + }); + } else if (this.form.get('wallet').value) { + const wallet: Wallet = this.form.get('wallet').value; + this.availableCoins = wallet.coins; + this.availableHours = wallet.hours; + } + + if (this.availableCoins.isGreaterThan(0)) { + const unburnedHoursRatio = new BigNumber(1).minus(new BigNumber(1).dividedBy(this.appService.burnRate)); + const sendableHours = this.availableHours.multipliedBy(unburnedHoursRatio).decimalPlaces(0, BigNumber.ROUND_FLOOR); + this.minimumFee = this.availableHours.minus(sendableHours); + this.availableHours = sendableHours; + } else { + this.minimumFee = new BigNumber(0); + this.availableHours = new BigNumber(0); + } + } + } + + private filterUnspentOutputs(): UnspentOutput[] { + if (this.allUnspentOutputs.length === 0) { + return []; + } else if (!this.form.get('addresses').value || (this.form.get('addresses').value as Address[]).length === 0) { + return this.allUnspentOutputs; + } else { + return this.allUnspentOutputs.filter(out => (this.form.get('addresses').value as Address[]).some(addr => addr.address === out.address)); + } + } + + private closeGetOutputsSubscriptions() { + this.loadingUnspentOutputs = false; + + if (this.getOutputsSubscriptions) { + this.getOutputsSubscriptions.unsubscribe(); + } + } + + private closeSyncCheckSubscription() { + if (this.syncCheckSubscription) { + this.syncCheckSubscription.unsubscribe(); + } + } + + private showSuccess(showDone: boolean) { + this.busy = false; + this.navbarService.enableSwitch(); + this.resetForm(); + + if (showDone) { + this.msgBarService.showDone('send.sent'); + this.sendButton.resetState(); + } else { + this.sendButton.setSuccess(); + setTimeout(() => { + this.sendButton.resetState(); + }, 3000); + } + } + + private showError(error) { + this.busy = false; + this.msgBarService.showError(error); + this.navbarService.enableSwitch(); + this.previewButton.resetState().setEnabled(); + this.sendButton.resetState().setEnabled(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html new file mode 100644 index 00000000..10527b1d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html @@ -0,0 +1,64 @@ +
+
+ +
+ +
+
+
+ + +
+
+ +
+ +
+
+ + {{ selectedCurrency === doubleButtonActive.LeftButton ? ('coin' | commonText) : ('common.usd' | translate) }} +
+
+ {{ 'send.invalid-amount' | translate }} + + ~ {{ value | number:'1.0-2' }} {{ 'common.usd' | translate }} + + + ~ {{ value | amount }} + + +
+
+
+ + +
+
+ + {{ 'send.preview-button' | translate }} + + + {{ 'send.send-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss new file mode 100644 index 00000000..7f865104 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss @@ -0,0 +1,17 @@ +@import '../../../../../theme/variables'; + +.-buttons { + text-align: center; +} + +.amount-label { + display: inline-block; +} + +label mat-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + padding-left: 5px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts new file mode 100644 index 00000000..40e927e0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendFormComponent } from './send-form.component'; + +describe('SendFormComponent', () => { + let component: SendFormComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendFormComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts new file mode 100644 index 00000000..eb5c9b6c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts @@ -0,0 +1,491 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, ChangeDetectorRef } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import 'rxjs/add/operator/delay'; +import 'rxjs/add/operator/filter'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { BigNumber } from 'bignumber.js'; +import { Wallet, ConfirmationData } from '../../../../app.datatypes'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { showConfirmationModal } from '../../../../utils'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; +import { PriceService } from '../../../../services/price.service'; +import { ChangeNoteComponent } from '../send-preview/transaction-info/change-note/change-note.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; +import { AppService } from '../../../../services/app.service'; + +@Component({ + selector: 'app-send-form', + templateUrl: './send-form.component.html', + styleUrls: ['./send-form.component.scss'], +}) +export class SendFormComponent implements OnInit, OnDestroy { + + public static readonly MaxUsdDecimals = 6; + + @ViewChild('previewButton') previewButton: ButtonComponent; + @ViewChild('sendButton') sendButton: ButtonComponent; + @Input() formData: any; + @Output() onFormSubmitted = new EventEmitter(); + + maxNoteChars = ChangeNoteComponent.MAX_NOTE_CHARS; + form: FormGroup; + transactions = []; + previewTx: boolean; + busy = false; + doubleButtonActive = DoubleButtonActive; + selectedCurrency = DoubleButtonActive.LeftButton; + value: number; + valueGreaterThanBalance = false; + price: number; + wallets: Wallet[]; + + private subscriptionsGroup: ISubscription[] = []; + private processingSubscription: ISubscription; + private syncCheckSubscription: ISubscription; + + constructor( + public formBuilder: FormBuilder, + public blockchainService: BlockchainService, + private walletService: WalletService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + private navbarService: NavBarService, + private hwWalletService: HwWalletService, + private translate: TranslateService, + private changeDetector: ChangeDetectorRef, + private appService: AppService, + priceService: PriceService, + ) { + this.subscriptionsGroup.push(priceService.price.subscribe(price => { + this.price = price; + this.updateValue(); + })); + } + + ngOnInit() { + this.navbarService.showSwitch('send.simple', 'send.advanced'); + this.initForm(); + this.subscriptionsGroup.push(this.walletService.all().first().subscribe(wallets => { + this.wallets = wallets; + + if (wallets.length === 1) { + this.form.get('wallet').setValue(wallets[0]); + } + })); + } + + ngOnDestroy() { + if (this.processingSubscription && !this.processingSubscription.closed) { + this.processingSubscription.unsubscribe(); + } + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + this.closeSyncCheckSubscription(); + this.navbarService.hideSwitch(); + this.msgBarService.hide(); + } + + preview() { + this.previewTx = true; + this.checkBeforeSending(); + this.changeDetector.detectChanges(); + } + + send() { + this.previewTx = false; + this.checkBeforeSending(); + } + + changeActiveCurrency(value) { + if (value !== this.selectedCurrency) { + this.selectedCurrency = value; + this.askIfConvertAmount(); + this.updateValue(); + this.form.get('amount').updateValueAndValidity(); + } + } + + private askIfConvertAmount() { + + if (!this.form.get('amount').value) { + return; + } + const value = (this.form.get('amount').value as string).trim(); + const currentValue = new BigNumber((this.form.get('amount').value as string).trim()); + if (!value || currentValue.isNaN()) { + return; + } + + const usd = this.translate.instant('common.usd'); + const currentCoin = this.appService.coinName; + let fromText: string; + let toText: string; + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + fromText = usd; + toText = currentCoin; + } else { + fromText = currentCoin; + toText = usd; + } + + const confirmationData: ConfirmationData = { + text: this.translate.instant('send.convert-confirmation', {from: fromText, to: toText}), + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.convertAmount(); + } + }); + } + + private convertAmount() { + this.msgBarService.hide(); + + if (this.form.get('amount').value) { + const value = (this.form.get('amount').value as string).trim(); + const currentValue = new BigNumber(value); + + if (!value || currentValue.isNaN()) { + this.msgBarService.showWarning(this.translate.instant('send.invaid-amount-warning')); + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + const newValue = currentValue.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + const recoveredValue = newValue.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + if (!recoveredValue.isEqualTo(currentValue)) { + this.msgBarService.showWarning(this.translate.instant('send.precision-error-warning')); + } + + this.form.get('amount').setValue(newValue.toString()); + } else { + const newValue = currentValue.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + const recoveredValue = newValue.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + if (!recoveredValue.isEqualTo(currentValue)) { + this.msgBarService.showWarning(this.translate.instant('send.precision-error-warning')); + } + + this.form.get('amount').setValue(newValue.toString()); + } + } + } + + assignAll() { + this.msgBarService.hide(); + + let availableCoins: BigNumber = this.form.get('wallet').value && this.form.get('wallet').value.coins ? this.form.get('wallet').value.coins : new BigNumber(-1); + if ((availableCoins as BigNumber).isEqualTo(-1)) { + this.msgBarService.showError(this.translate.instant('send.no-wallet-selected')); + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.RightButton) { + availableCoins = availableCoins.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + } + + this.form.get('amount').setValue(availableCoins.toString()); + } + + private updateValue() { + if (!this.price) { + this.value = null; + + return; + } + if (!this.form || this.validateAmount(this.form.get('amount') as FormControl) !== null) { + this.value = -1; + + return; + } + + const coinsInWallet = this.form.get('wallet').value && this.form.get('wallet').value.coins ? this.form.get('wallet').value.coins : -1; + + this.valueGreaterThanBalance = false; + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + this.value = new BigNumber(this.form.get('amount').value).multipliedBy(this.price).decimalPlaces(2).toNumber(); + if (coinsInWallet > 0 && parseFloat(this.form.get('amount').value) > coinsInWallet) { + this.valueGreaterThanBalance = true; + } + } else { + this.value = new BigNumber(this.form.get('amount').value).dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals).toNumber(); + if (coinsInWallet > 0 && this.value > coinsInWallet) { + this.valueGreaterThanBalance = true; + } + } + } + + private checkBeforeSending() { + if (!this.form.valid || this.previewButton.isLoading() || this.sendButton.isLoading()) { + return; + } + + this.closeSyncCheckSubscription(); + this.syncCheckSubscription = this.blockchainService.synchronized.first().subscribe(synchronized => { + if (synchronized) { + this.prepareTransaction(); + } else { + this.showSynchronizingWarning(); + } + }); + } + + private showSynchronizingWarning() { + const confirmationData: ConfirmationData = { + text: 'send.synchronizing-warning', + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.prepareTransaction(); + } + }); + } + + private prepareTransaction() { + this.msgBarService.hide(); + this.previewButton.resetState(); + this.sendButton.resetState(); + + if (this.form.value.wallet.encrypted && !this.form.value.wallet.isHardware && !this.previewTx) { + const config = new MatDialogConfig(); + config.data = { + wallet: this.form.value.wallet, + }; + + this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.createTransaction(passwordDialog); + }); + } else { + if (!this.form.value.wallet.isHardware || this.previewTx) { + this.createTransaction(); + } else { + this.showBusy(); + this.processingSubscription = this.hwWalletService.checkIfCorrectHwConnected((this.form.value.wallet as Wallet).addresses[0].address).subscribe( + () => this.createTransaction(), + err => this.showError(getHardwareWalletErrorMsg(this.translate, err)), + ); + } + } + } + + private showBusy() { + if (this.previewTx) { + this.previewButton.setLoading(); + this.sendButton.setDisabled(); + } else { + this.sendButton.setLoading(); + this.previewButton.setDisabled(); + } + this.busy = true; + this.navbarService.disableSwitch(); + } + + private createTransaction(passwordDialog?: any) { + this.showBusy(); + + this.processingSubscription = this.walletService.createTransaction( + this.form.value.wallet, + (this.form.value.wallet as Wallet).addresses.map(address => address.address), + null, + [{ + address: (this.form.value.address as string).trim(), + coins: ((this.selectedCurrency === DoubleButtonActive.LeftButton ? this.form.value.amount : this.value.toString()) as string).trim(), + }], + { + type: 'auto', + mode: 'share', + share_factor: '0.5', + }, + null, + passwordDialog ? passwordDialog.password : null, + this.previewTx, + ).subscribe(transaction => { + if (passwordDialog) { + passwordDialog.close(); + } + + const note = this.form.value.note.trim(); + if (!this.previewTx) { + this.processingSubscription = this.walletService.injectTransaction(transaction.encoded, note) + .subscribe(noteSaved => { + let showDone = true; + if (note && !noteSaved) { + this.msgBarService.showWarning(this.translate.instant('send.error-saving-note')); + showDone = false; + } + + this.showSuccess(showDone); + }, error => this.showError(error)); + } else { + this.onFormSubmitted.emit({ + form: { + wallet: this.form.value.wallet, + address: (this.form.value.address as string).trim(), + amount: this.form.value.amount, + currency: this.selectedCurrency, + note: note, + }, + amount: new BigNumber(this.form.value.amount), + to: [(this.form.value.address as string).trim()], + transaction, + }); + this.busy = false; + this.navbarService.enableSwitch(); + } + }, + error => { + if (passwordDialog) { + passwordDialog.error(error); + } + + if (error && error.result) { + this.showError(getHardwareWalletErrorMsg(this.translate, error)); + } else { + this.showError(error); + } + }, + ); + } + + private showSuccess(showDone: boolean) { + this.busy = false; + this.navbarService.enableSwitch(); + this.resetForm(); + + if (showDone) { + this.msgBarService.showDone('send.sent'); + this.sendButton.resetState(); + } else { + this.sendButton.setSuccess(); + setTimeout(() => { + this.sendButton.resetState(); + }, 3000); + } + } + + private showError(error) { + this.busy = false; + this.msgBarService.showError(error); + this.navbarService.enableSwitch(); + this.previewButton.resetState().setEnabled(); + this.sendButton.resetState().setEnabled(); + } + + private initForm() { + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + address: [''], + amount: ['', Validators.required], + note: [''], + }); + + this.form.get('address').setValidators([ + this.validateAddress.bind(this), + ]); + + this.subscriptionsGroup.push(this.form.get('wallet').valueChanges.subscribe(value => { + this.form.get('amount').setValidators([ + Validators.required, + this.validateAmountWithValue.bind(this), + ]); + + this.form.get('amount').updateValueAndValidity(); + })); + + this.subscriptionsGroup.push(this.form.get('amount').valueChanges.subscribe(value => { + this.updateValue(); + })); + + if (this.formData) { + Object.keys(this.form.controls).forEach(control => { + if (this.form.get(control)) { + this.form.get(control).setValue(this.formData.form[control]); + } + + this.selectedCurrency = this.formData.form.currency; + }); + } + } + + private validateAddress(addressControl: FormControl) { + if (!addressControl.value || (addressControl.value as string).trim().length === 0) { + return { Required: true }; + } + } + + private validateAmount(amountControl: FormControl) { + let stringValue: string = amountControl.value; + stringValue = stringValue ? stringValue.trim() : stringValue; + const value = new BigNumber(stringValue); + + if (!stringValue || value.isNaN() || value.isLessThanOrEqualTo(0)) { + return { Invalid: true }; + } + + const parts = stringValue.split('.'); + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + if (parts.length === 2 && parts[1].length > this.blockchainService.currentMaxDecimals) { + return { Invalid: true }; + } + } else { + if (parts.length === 2 && parts[1].length > SendFormComponent.MaxUsdDecimals) { + return { Invalid: true }; + } + } + + return null; + } + + private validateAmountWithValue(amountControl: FormControl) { + const firstValidation = this.validateAmount(amountControl); + if (firstValidation) { + return firstValidation; + } + + const coinsInWallet = this.form.get('wallet').value && this.form.get('wallet').value.coins ? this.form.get('wallet').value.coins : 0; + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + if (parseFloat(amountControl.value) > coinsInWallet) { + return { Invalid: true }; + } + } else { + this.updateValue(); + if (this.value > coinsInWallet) { + return { Invalid: true }; + } + } + + return null; + } + + private resetForm() { + this.form.get('wallet').setValue(''); + this.form.get('address').setValue(''); + this.form.get('amount').setValue(''); + this.form.get('note').setValue(''); + this.selectedCurrency = DoubleButtonActive.LeftButton; + } + + private closeSyncCheckSubscription() { + if (this.syncCheckSubscription) { + this.syncCheckSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html new file mode 100644 index 00000000..0ba12a6d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html @@ -0,0 +1,9 @@ + + +
+ {{ 'send.back-button' | translate }} + {{ 'send.send-button' | translate }} +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss new file mode 100644 index 00000000..4bf1cca6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss @@ -0,0 +1,4 @@ +.-buttons { + margin-top: 10px; + text-align: center; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts new file mode 100644 index 00000000..63db5082 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendVerifyComponent } from './send-preview.component'; + +describe('SendVerifyComponent', () => { + let component: SendVerifyComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendVerifyComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendVerifyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts new file mode 100644 index 00000000..643883a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts @@ -0,0 +1,125 @@ +import { Component, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MatDialogConfig, MatDialog } from '@angular/material'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { PreviewTransaction, Wallet } from '../../../../app.datatypes'; +import { ISubscription } from 'rxjs/Subscription'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-send-preview', + templateUrl: './send-preview.component.html', + styleUrls: ['./send-preview.component.scss'], +}) +export class SendVerifyComponent implements OnDestroy { + @ViewChild('sendButton') sendButton: ButtonComponent; + @ViewChild('backButton') backButton: ButtonComponent; + @Input() transaction: PreviewTransaction; + @Output() onBack = new EventEmitter(); + + private sendSubscription: ISubscription; + + constructor( + private walletService: WalletService, + private msgBarService: MsgBarService, + private dialog: MatDialog, + private hwWalletService: HwWalletService, + private translate: TranslateService, + ) {} + + ngOnDestroy() { + this.msgBarService.hide(); + + if (this.sendSubscription) { + this.sendSubscription.unsubscribe(); + } + } + + back() { + this.onBack.emit(false); + } + + send() { + if (this.sendButton.isLoading()) { + return; + } + + this.msgBarService.hide(); + this.sendButton.resetState(); + + if (this.transaction.wallet.encrypted && !this.transaction.wallet.isHardware) { + const config = new MatDialogConfig(); + config.data = { + wallet: this.transaction.wallet, + }; + + this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.finishSending(passwordDialog); + }); + } else { + if (!this.transaction.wallet.isHardware) { + this.finishSending(); + } else { + this.showBusy(); + this.sendSubscription = this.hwWalletService.checkIfCorrectHwConnected(this.transaction.wallet.addresses[0].address).subscribe( + () => this.finishSending(), + err => this.showError(getHardwareWalletErrorMsg(this.translate, err)), + ); + } + } + } + + private showBusy() { + this.sendButton.setLoading(); + this.backButton.setDisabled(); + } + + private finishSending(passwordDialog?: any) { + this.showBusy(); + + const note = this.transaction.note.trim(); + + this.sendSubscription = this.walletService.signTransaction( + this.transaction.wallet, + passwordDialog ? passwordDialog.password : null, + this.transaction, + ).flatMap(result => { + if (passwordDialog) { + passwordDialog.close(); + } + + return this.walletService.injectTransaction(result.encoded, note); + }).subscribe(noteSaved => { + if (note && !noteSaved) { + setTimeout(() => this.msgBarService.showWarning(this.translate.instant('send.error-saving-note'))); + } else { + setTimeout(() => this.msgBarService.showDone('send.sent')); + } + + this.walletService.startDataRefreshSubscription(); + + this.onBack.emit(true); + }, error => { + if (passwordDialog) { + passwordDialog.error(error); + } + + if (error && error.result) { + this.showError(getHardwareWalletErrorMsg(this.translate, error)); + } else { + this.showError(error); + } + }); + } + + private showError(error) { + this.msgBarService.showError(error); + this.sendButton.resetState(); + this.backButton.resetState().setEnabled(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.html new file mode 100644 index 00000000..cd31574c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.html @@ -0,0 +1,19 @@ + +
+
+ + +
+
+
+ + {{ 'edit-note.cancel-button' | translate }} + + + {{ 'edit-note.change-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.scss new file mode 100644 index 00000000..1d1c0825 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.scss @@ -0,0 +1,17 @@ +@import '../../../../../../../theme/variables'; + +mat-input-container { + width: 100%; +} + +.-buttons { + text-align: center; +} + +mat-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + padding-left: 5px; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.spec.ts new file mode 100644 index 00000000..d4ed704f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChangeNoteComponent } from './change-note.component'; + +describe('ChangeNoteComponent', () => { + let component: ChangeNoteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChangeNoteComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChangeNoteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.ts new file mode 100644 index 00000000..88c48c22 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.ts @@ -0,0 +1,76 @@ +import { Component, OnInit, Inject, ViewChild, OnDestroy } from '@angular/core'; +import { FormBuilder, Validators, FormGroup } from '@angular/forms'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { ISubscription } from 'rxjs/Subscription'; +import { ButtonComponent } from '../../../../../layout/button/button.component'; +import { Transaction } from '../../../../../../app.datatypes'; +import { StorageService, StorageType } from '../../../../../../services/storage.service'; +import { MsgBarService } from '../../../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-change-note', + templateUrl: './change-note.component.html', + styleUrls: ['./change-note.component.scss'], +}) +export class ChangeNoteComponent implements OnInit, OnDestroy { + + public static readonly MAX_NOTE_CHARS = 64; + + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + maxNoteChars = ChangeNoteComponent.MAX_NOTE_CHARS; + + private OperationSubscription: ISubscription; + private originalNote: string; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private data: Transaction, + private formBuilder: FormBuilder, + private msgBarService: MsgBarService, + private storageService: StorageService, + ) {} + + ngOnInit() { + this.originalNote = this.data.note ? this.data.note : ''; + + this.form = this.formBuilder.group({ + note: [this.data.note], + }); + } + + ngOnDestroy() { + this.msgBarService.hide(); + if (this.OperationSubscription) { + this.OperationSubscription.unsubscribe(); + } + } + + closePopup() { + this.dialogRef.close(); + } + + changeNote() { + if (this.button.isLoading()) { + return; + } + + const newNote = this.form.value.note ? this.form.value.note.trim() : ''; + + if (this.originalNote === newNote) { + this.closePopup(); + + return; + } + + this.msgBarService.hide(); + this.button.setLoading(); + + this.OperationSubscription = this.storageService.store(StorageType.NOTES, this.data.txid, newNote).subscribe(() => { + this.dialogRef.close(newNote); + }, error => { + this.msgBarService.showError(error); + this.button.resetState().setEnabled(); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html new file mode 100644 index 00000000..85b7ec50 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html @@ -0,0 +1,92 @@ +
+
+

{{ 'tx.confirm-transaction' | translate }}

+

{{ 'tx.transaction' | translate }}

+
+
+ +
+ {{ 'tx.from' | translate }}: {{ transaction.from }} +
+
+ {{ 'tx.to' | translate }}: {{ transaction.to.join(', ') }} +
+
+ +
+ {{ 'tx.date' | translate }}: {{ transaction.timestamp | dateTime }} +
+
+ {{ 'tx.status' | translate }}: {{ (transaction.confirmed ? 'tx.confirmed' : 'tx.pending') | translate }} +
+
+
+ {{ 'tx.hours' | translate }}: + + {{ transaction.hoursSent.toString() | amount:false:'first' }} {{ hoursText | translate }} + | + {{ transaction.hoursBurned.toString() | amount:false:'first' }} {{ 'tx.hours-burned' | translate }} + +
+
+ {{ 'tx.id' | translate }}: {{ transaction.txid }} +
+
+ {{ 'tx.note' | translate }}: + {{ transaction.note }} + {{ 'tx.without-note' | translate }} + edit +
+
+ +
+
+ +
+

{{ transaction.balance.toString() | amount }}

+

+ {{ transaction.balance * price | currency:'USD':'symbol':'1.2-2' }}* +

+
+
+
+ + {{ 'tx.show-more' | translate }} keyboard_arrow_down + +
+
+ +
+

{{ 'tx.inputs' | translate }}

+ +
+
{{ i + 1 }}
+
+
{{ isPreview ? input.address : input.owner }}
+
+ {{ 'tx.coins' | translate }}: {{ input.coins | amount:true:'first' }} +
+
+ {{ 'tx.hours' | translate }}: {{ input.calculated_hours | amount:false:'first' }} +
+
+
+
+
+

{{ 'tx.outputs' | translate }}

+ +
+
{{ i + 1 }}
+
+
{{ isPreview ? output.address : output.dst }}
+
+ {{ 'tx.coins' | translate }}: {{ output.coins | amount:true:'first' }} +
+
+ {{ 'tx.hours' | translate }}: {{ output.hours | amount:false:'first' }} +
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss new file mode 100644 index 00000000..48f09427 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss @@ -0,0 +1,128 @@ +@import '../../../../../../theme/variables'; + +h4 { + font-size: 14px; + margin: 0 0 30px; +} + +.-item { + display: flex; + font-size: 13px; + + &:not(:last-child) { + margin-bottom: 10px; + } + + .-number { + padding: 10px; + background: $grey-lightest; + align-self: flex-start; + border-radius: 10px; + } + + .-info { + margin-left: 10px; + display: flex; + flex-direction: column; + + div { + word-break: break-all; + } + + .-address { + padding: 10px 0; + margin-bottom: 5px; + } + } +} + +.-data { + font-size: 12px; + display: flex; + + &:not(:last-child) { + margin-bottom: 5px; + } + + span:first-child { + color: $grey; + display: inline-block; + width: 60px; + flex-shrink: 0; + } + span:nth-child(2) { + word-break: break-word; + } + + mat-icon { + font-size: 20px; + padding-left: 5px; + color: $gradient-blue-dark; + cursor: pointer; + } + + .-grey { + color: $grey; + } + + &.-more { + margin-bottom: 0 !important; + + span { + width: auto !important; + margin-top: 20px; + color: $gradient-blue-dark; + cursor: pointer; + + mat-icon { + display: inline; + vertical-align: middle; + font-size: 13px; + } + } + } +} + +.-tx-meta { + .-data { + margin-bottom: 10px; + } +} + +.-tx-price { + text-align: center; + display: flex; + flex-direction: column; + justify-content: center; + + .-icon { + &.-incoming { + transform: rotate(180deg); + } + + img { + width: 30px; + } + } + + h4 { + color: $grey-dark; + font-size: 16px; + font-weight: 700; + margin: 10px 0 5px; + } + + p { + color: $grey; + font-size: 12px; + margin: 0; + + span { + color: lighten($grey, 40%); + } + } +} + +.-margin-top { + margin-top: 30px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts new file mode 100644 index 00000000..1637b8ca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionInfoComponent } from './transaction-info.component'; + +describe('TransactionInfoComponent', () => { + let component: TransactionInfoComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionInfoComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionInfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts new file mode 100644 index 00000000..ccddb660 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts @@ -0,0 +1,71 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { PreviewTransaction, Transaction } from '../../../../../app.datatypes'; +import { PriceService } from '../../../../../services/price.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { BigNumber } from 'bignumber.js'; +import { MatDialogConfig, MatDialog } from '@angular/material'; +import { ChangeNoteComponent } from './change-note/change-note.component'; + +@Component({ + selector: 'app-transaction-info', + templateUrl: './transaction-info.component.html', + styleUrls: ['./transaction-info.component.scss'], +}) +export class TransactionInfoComponent implements OnInit, OnDestroy { + @Input() transaction: Transaction; + @Input() isPreview: boolean; + price: number; + showInputsOutputs = false; + + private subscription: ISubscription; + + constructor(private priceService: PriceService, private dialog: MatDialog) { + this.subscription = this.priceService.price.subscribe(price => this.price = price); + } + + get hoursText(): string { + if (!this.transaction) { + return ''; + } + + if (!this.isPreview) { + if ((this.transaction as any).coinsMovedInternally) { + return 'tx.hours-moved'; + } else if (this.transaction.balance.isGreaterThan(0)) { + return 'tx.hours-received'; + } + } + + return 'tx.hours-sent'; + } + + ngOnInit() { + if (this.isPreview) { + this.transaction.hoursSent = new BigNumber('0'); + this.transaction.outputs + .filter(o => ( this.transaction).to.find(addr => addr === o.address)) + .map(o => this.transaction.hoursSent = this.transaction.hoursSent.plus(new BigNumber(o.hours))); + } + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + toggleInputsOutputs(event) { + event.preventDefault(); + + this.showInputsOutputs = !this.showInputsOutputs; + } + + editNote() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = this.transaction; + this.dialog.open(ChangeNoteComponent, config).afterClosed().subscribe(newNote => { + if (newNote || newNote === '') { + this.transaction.note = newNote; + } + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html new file mode 100644 index 00000000..1acadd88 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html @@ -0,0 +1,20 @@ + +
+
+ + + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.scss new file mode 100644 index 00000000..c253bbfa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.scss @@ -0,0 +1,11 @@ +.-buttons { + text-align: center; +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + margin: 30px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts new file mode 100644 index 00000000..97248ad1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendSkycoinComponent } from './send-skycoin.component'; + +describe('SendSkycoinComponent', () => { + let component: SendSkycoinComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendSkycoinComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendSkycoinComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts new file mode 100644 index 00000000..fa2b0841 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts @@ -0,0 +1,59 @@ +import { Component, OnDestroy, ChangeDetectorRef } from '@angular/core'; +import { NavBarService } from '../../../services/nav-bar.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { DoubleButtonActive } from '../../layout/double-button/double-button.component'; + +@Component({ + selector: 'app-send-skycoin', + templateUrl: './send-skycoin.component.html', + styleUrls: ['./send-skycoin.component.scss'], +}) +export class SendSkycoinComponent implements OnDestroy { + showForm = true; + formData: any; + activeForm: DoubleButtonActive; + activeForms = DoubleButtonActive; + + private subscription: ISubscription; + + constructor( + navbarService: NavBarService, + private changeDetector: ChangeDetectorRef, + ) { + navbarService.setActiveComponent(DoubleButtonActive.LeftButton); + this.subscription = navbarService.activeComponent.subscribe(value => { + this.activeForm = value; + this.formData = null; + }); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + onFormSubmitted(data) { + this.formData = data; + this.showForm = false; + } + + onBack(deleteFormData) { + if (deleteFormData) { + this.formData = null; + } + + this.showForm = true; + this.changeDetector.detectChanges(); + } + + get transaction() { + const transaction = this.formData.transaction; + + transaction.wallet = this.formData.form.wallet; + transaction.from = this.formData.form.wallet.label; + transaction.to = this.formData.to; + transaction.balance = this.formData.amount; + transaction.note = this.formData.form.note; + + return transaction; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.html new file mode 100644 index 00000000..2af4b72e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.html @@ -0,0 +1,36 @@ +
+ + +
+
+

{{ 'backup.wallet-directory' | translate }} {{ folder }}

+

{{ 'backup.seed-warning' | translate }}

+

+ +

+
+ + + +
+
+
{{ 'backup.wallet' | translate }}
+
{{ 'backup.filename' | translate }}
+
+
+
+
+
{{ wallet.label }}
+
{{ wallet.filename }}
+
+ {{ 'backup.show-seed' | translate }} +
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss new file mode 100644 index 00000000..99c14b94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss @@ -0,0 +1,39 @@ +@import '../../../../../theme/variables'; + +.-paper { + background-color: #fbfbfb; + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 20px; + font-size: $font-size-standard; + margin: 30px 30px 0; + + p { + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } +} + +.-text-muted { + color: $grey; +} + +.-text-right { + text-align: right; +} + +.-link { + color: $blue; + cursor: pointer; +} + +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts new file mode 100644 index 00000000..e7e4b77c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BackupComponent } from './backup.component'; + +describe('BackupComponent', () => { + let component: BackupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BackupComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BackupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts new file mode 100644 index 00000000..a6b845c9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts @@ -0,0 +1,58 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { Wallet } from '../../../../app.datatypes'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { SeedModalComponent } from './seed-modal/seed-modal.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; + +@Component({ + selector: 'app-backup', + templateUrl: './backup.component.html', + styleUrls: ['./backup.component.scss'], +}) +export class BackupComponent implements OnInit, OnDestroy { + folder: string; + wallets: Wallet[] = []; + + private walletSubscription; + + constructor( + public walletService: WalletService, + private dialog: MatDialog, + ) {} + + ngOnInit() { + this.walletService.folder().subscribe(folder => this.folder = folder); + + this.walletSubscription = this.walletService.all().subscribe(wallets => { + this.wallets = wallets; + }); + } + + ngOnDestroy() { + this.walletSubscription.unsubscribe(); + } + + get onlyEncrypted() { + return this.wallets.filter(wallet => wallet.encrypted); + } + + showSeed(wallet: Wallet) { + const initialConfig = new MatDialogConfig(); + initialConfig.data = { + wallet: wallet, + }; + + this.dialog.open(PasswordDialogComponent, initialConfig).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.walletService.getWalletSeed(wallet, passwordDialog.password).subscribe(seed => { + passwordDialog.close(); + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = { seed }; + + this.dialog.open(SeedModalComponent, config); + }, err => passwordDialog.error(err)); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.css new file mode 100644 index 00000000..079dcb65 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.css @@ -0,0 +1,3 @@ +.-buttons { + text-align: center; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html new file mode 100644 index 00000000..12e41214 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html @@ -0,0 +1,11 @@ + +
+ + +
+
+ + {{ 'backup.close-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts new file mode 100644 index 00000000..e269ec54 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SeedModalComponent } from './seed-modal.component'; + +describe('SeedModalComponent', () => { + let component: SeedModalComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SeedModalComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SeedModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts new file mode 100644 index 00000000..749726e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts @@ -0,0 +1,18 @@ +import { Component, Inject, OnDestroy } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; + +@Component({ + selector: 'app-seed-modal', + templateUrl: './seed-modal.component.html', + styleUrls: ['./seed-modal.component.css'], +}) +export class SeedModalComponent implements OnDestroy { + constructor( + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + ) {} + + ngOnDestroy() { + this.data.seed = null; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html new file mode 100644 index 00000000..58d3c1ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html @@ -0,0 +1,52 @@ +
+ + + + +
+
+
+
+
+
{{ 'blockchain.blocks' | translate }}
+
{{ block.header.seq | number }}
+
+
+
{{ 'blockchain.time' | translate }}
+
{{ block.header.timestamp | dateTime }}
+
+
+
{{ 'blockchain.hash' | translate }}
+
{{ block.header.block_hash }}
+
+
+
+
+
+
+
+
+
{{ 'blockchain.current-supply' | translate }}
+
{{ coinSupply.current_supply | amount:true:'first' }}
+
+
+
{{ 'blockchain.total-supply' | translate }}
+
{{ coinSupply.total_supply | amount:true:'first' }}
+
+
+
+
+
{{ 'blockchain.current-coinhour-supply' | translate }}
+
{{ coinSupply.current_coinhour_supply | amount:false:'first' }}
+
+
+
{{ 'blockchain.total-coinhour-supply' | translate }}
+
{{ coinSupply.total_coinhour_supply | amount:false:'first' }}
+
+
+
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss new file mode 100644 index 00000000..eeb33169 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss @@ -0,0 +1,28 @@ +@import '../../../../../theme/variables'; + +.-wrapper { + margin: 30px; +} + +.-paper { + background-color: #fbfbfb; + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 20px; + font-size: $font-size-standard; +} + +.-item { + &:not(:last-child) { + margin-bottom: 20px; + } + + .-key { + color: $grey; + margin-bottom: 5px; + } + + .-value { + word-break: break-all; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts new file mode 100644 index 00000000..e868709a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BlockchainComponent } from './blockchain.component'; + +describe('BlockchainComponent', () => { + let component: BlockchainComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BlockchainComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BlockchainComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts new file mode 100644 index 00000000..9d7ac7a7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts @@ -0,0 +1,38 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import 'rxjs/add/operator/switchMap'; +import { IntervalObservable } from 'rxjs/observable/IntervalObservable'; +import { ISubscription } from 'rxjs/Subscription'; +import { BlockchainService } from '../../../../services/blockchain.service'; + +@Component({ + selector: 'app-blockchain', + templateUrl: './blockchain.component.html', + styleUrls: ['./blockchain.component.scss'], +}) +export class BlockchainComponent implements OnInit, OnDestroy { + block: any; + coinSupply: any; + + private subscriptionsGroup: ISubscription[] = []; + + constructor( + private blockchainService: BlockchainService, + ) { } + + ngOnInit() { + this.subscriptionsGroup.push(IntervalObservable + .create(5000) + .switchMap(() => this.blockchainService.lastBlock()) + .subscribe(block => this.block = block)); + + this.subscriptionsGroup.push(IntervalObservable + .create(5000) + .switchMap(() => this.blockchainService.coinSupply()) + .subscribe(coinSupply => this.coinSupply = coinSupply), + ); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.html new file mode 100644 index 00000000..821ec877 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.html @@ -0,0 +1,41 @@ +
+ + + + +
+
+
+
+
{{ 'network.peer' | translate }}
+
{{ 'network.source' | translate }}
+
{{ 'network.block-height' | translate }}
+
{{ 'network.block-height-short' | translate }}
+
{{ 'network.last-seen' | translate }}
+
+
+
+
+ +
+
+ {{ peer.address.split(':')[0] }}:{{ peer.listen_port }} +
+
{{ ('network.sources.' + peer.source) | translate }}
+
{{ peer.height }}
+
+
+ keyboard_arrow_up + {{ peer.last_sent | dateFromNow }} +
+
+ keyboard_arrow_down + {{ peer.last_received | dateFromNow }} +
+
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.scss new file mode 100644 index 00000000..1b409027 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.scss @@ -0,0 +1,71 @@ +@import '../../../../../theme/variables'; + +.-port, .-last-seen, .-source { + color: $grey; +} + +.-direction { + width: 72px; + display: flex; + justify-content: center; + align-items: center; + flex-shrink: 0; + + img { + width: 32px; + + &.-incoming { + transform: scaleX(-1); + } + } +} + +.-last-seen { + display: flex; + flex-direction: column; + font-size: 12px; + line-height: 1; + justify-content: center; + + mat-icon { + font-size: 12px; + display: inline; + vertical-align: middle; + padding-right: 5px; + } +} + +.-trusted { + display: inline; + color: $blue; + font-size: 13px; + vertical-align: middle; +} + +.-text-right { + text-align: right; +} + +.-pl-0 { + padding-left: 0 !important; +} + +.-block-row { + width: 150px; + flex-shrink: 0; +} + +.-invisible { + display: none; +} + +@media (max-width: $max-sm-width) { + .-pl-0 { + width: 160px !important; + } + + .-block-row { + width: 90px; + flex-shrink: 0; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts new file mode 100644 index 00000000..c1175d10 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NetworkComponent } from './network.component'; + +describe('NetworkComponent', () => { + let component: NetworkComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NetworkComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NetworkComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.ts new file mode 100644 index 00000000..00469f9a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.ts @@ -0,0 +1,34 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { NetworkService } from '../../../../services/network.service'; +import { ISubscription } from 'rxjs/Subscription'; + +@Component({ + selector: 'app-network', + templateUrl: './network.component.html', + styleUrls: ['./network.component.scss'], +}) +export class NetworkComponent implements OnInit, OnDestroy { + peers: any; + + private subscription: ISubscription; + + constructor( + public networkService: NetworkService, + ) { } + + ngOnInit() { + this.subscription = this.networkService.retrieveDefaultConnections().subscribe(trusted => { + this.subscription = this.networkService.automatic().subscribe(peers => { + this.peers = peers.map(peer => { + peer.source = trusted.find(p => p.address === peer.address) ? 'default' : 'exchange'; + + return peer; + }).sort((a, b) => a.address.localeCompare(b.address)); + }); + }); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html new file mode 100644 index 00000000..ebb061a2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html @@ -0,0 +1,34 @@ +
+ + + + +
+
+
+
{{ wallet.label }}
+
{{ 'coin' | commonText }}
+
{{ 'hours' | commonText }}
+
+
+ +
+
+ + {{ address.address }} +
+
+
+
{{ output.hash }}
+
{{ output.coins | amount:true:'first' }}
+
{{ output.calculated_hours | amount:false:'first' }}
+
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss new file mode 100644 index 00000000..6280660c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss @@ -0,0 +1,30 @@ +@import '../../../../../theme/variables'; + +.-text-right { + text-align: right; +} + +.-grey { + color: $grey; +} + +.-hash { + margin-left: 27px; + word-break: break-all; +} + +.-address { + color: $grey; + + img { + width: 17px; + vertical-align: middle; + margin-right: 10px; + } +} + +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts new file mode 100644 index 00000000..6f43161b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OutputsComponent } from './outputs.component'; + +describe('OutputsComponent', () => { + let component: OutputsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OutputsComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OutputsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts new file mode 100644 index 00000000..b7c41ac6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { ActivatedRoute } from '@angular/router'; +import { ISubscription } from 'rxjs/Subscription'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { QrCodeComponent, QrDialogConfig } from '../../../layout/qr-code/qr-code.component'; + +@Component({ + selector: 'app-outputs', + templateUrl: './outputs.component.html', + styleUrls: ['./outputs.component.scss'], +}) +export class OutputsComponent implements OnDestroy { + wallets: any[]|null; + + private outputsSubscription: ISubscription; + private lastRouteParams: any; + + constructor( + public walletService: WalletService, + private route: ActivatedRoute, + private dialog: MatDialog, + ) { + route.queryParams.subscribe(params => { + this.wallets = null; + this.lastRouteParams = params; + this.walletService.startDataRefreshSubscription(); + }); + walletService.all().subscribe(() => this.loadData()); + } + + ngOnDestroy() { + this.outputsSubscription.unsubscribe(); + } + + loadData() { + const addr = this.lastRouteParams['addr']; + + this.outputsSubscription = this.walletService.outputsWithWallets().subscribe(wallets => { + this.wallets = wallets + .map(wallet => Object.assign({}, wallet)) + .map(wallet => { + wallet.addresses = wallet.addresses.filter(address => { + if (address.outputs.length > 0) { + return addr ? address.address === addr : true; + } + }); + + return wallet; + }) + .filter(wallet => wallet.addresses.length > 0); + }); + } + + showQrCode(event: any, address: string) { + event.stopPropagation(); + + const config: QrDialogConfig = { address }; + QrCodeComponent.openDialog(this.dialog, config); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html new file mode 100644 index 00000000..ff49d255 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html @@ -0,0 +1,28 @@ +
+ + + + +
+
+
+
{{ 'pending-txs.txid' | translate }}
+
{{ 'coin' | commonText }}
+
{{ 'hours' | commonText }}
+
{{ 'pending-txs.timestamp' | translate }}
+
+
+
+
{{ tx.txid }}
+
{{ tx.amount | amount:true:'first' }}
+
{{ tx.hours | amount:false:'first' }}
+
{{ tx.timestamp | dateTime }}
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss new file mode 100644 index 00000000..49ea86a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss @@ -0,0 +1,9 @@ +@import '../../../../../theme/variables'; + +.-timestamp { + color: $grey; +} + +.-txid { + word-break: break-all; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts new file mode 100644 index 00000000..9b19aaac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PendingTransactionsComponent } from './pending-transactions.component'; + +describe('PendingTransactionsComponent', () => { + let component: PendingTransactionsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PendingTransactionsComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PendingTransactionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts new file mode 100644 index 00000000..acee2c40 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts @@ -0,0 +1,75 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import * as moment from 'moment'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; +import { BigNumber } from 'bignumber.js'; + +@Component({ + selector: 'app-pending-transactions', + templateUrl: './pending-transactions.component.html', + styleUrls: ['./pending-transactions.component.scss'], +}) +export class PendingTransactionsComponent implements OnInit, OnDestroy { + transactions = null; + + private transactionsSubscription: ISubscription; + private navbarSubscription: ISubscription; + + constructor( + public walletService: WalletService, + private navbarService: NavBarService, + ) { + this.navbarSubscription = this.navbarService.activeComponent.subscribe(value => { + this.startCheckingTransactions(value); + }); + } + + ngOnInit() { + this.navbarService.showSwitch('pending-txs.my', 'pending-txs.all'); + } + + ngOnDestroy() { + this.removeTransactionsSubscription(); + this.navbarSubscription.unsubscribe(); + this.navbarService.hideSwitch(); + } + + private startCheckingTransactions(value) { + this.transactions = null; + + this.removeTransactionsSubscription(); + + this.transactionsSubscription = this.walletService.pendingTransactions().subscribe(transactions => { + this.transactions = this.mapTransactions(value === DoubleButtonActive.LeftButton ? transactions.user : transactions.all); + }); + + this.walletService.startDataRefreshSubscription(); + } + + private mapTransactions(transactions) { + return transactions.map(transaction => { + transaction.transaction.timestamp = moment(transaction.received).unix(); + + return transaction.transaction; + }) + .map(transaction => { + let amount = new BigNumber('0'); + transaction.outputs.map(output => amount = amount.plus(output.coins)); + transaction.amount = amount.decimalPlaces(6).toString(); + + let hours = new BigNumber('0'); + transaction.outputs.map(output => hours = hours.plus(output.hours)); + transaction.hours = hours.decimalPlaces(0).toString(); + + return transaction; + }); + } + + private removeTransactionsSubscription() { + if (this.transactionsSubscription) { + this.transactionsSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html new file mode 100644 index 00000000..d2c9377a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts new file mode 100644 index 00000000..45138c8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionDetailComponent } from './transaction-detail.component'; + +describe('TransactionDetailComponent', () => { + let component: TransactionDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionDetailComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts new file mode 100644 index 00000000..60591d83 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts @@ -0,0 +1,19 @@ +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { NormalTransaction } from '../../../../app.datatypes'; + +@Component({ + selector: 'app-transaction-detail', + templateUrl: './transaction-detail.component.html', + styleUrls: ['./transaction-detail.component.scss'], +}) +export class TransactionDetailComponent { + constructor( + @Inject(MAT_DIALOG_DATA) public transaction: NormalTransaction, + public dialogRef: MatDialogRef, + ) {} + + closePopup() { + this.dialogRef.close(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html new file mode 100644 index 00000000..3bcfb1d0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html @@ -0,0 +1,97 @@ + +
+
+ + + + {{ 'history.all-addresses' | translate }} + + + {{ address.address }} - {{ address.coins | amount }} + ({{ address.hours | amount:false }}) + + + + {{ 'history.filter' | translate }} + {{ 'history.filters' | translate }} + +
+ {{ filter.label }} + {{ filter.address }} + - {{ filter.coins | amount }} + ({{ filter.hours | amount:false }}) +
+
+
+
+ +
+ + + +
+ +
+
+ +
+
+ +

+ {{ 'history.sent' | translate }} {{ 'coin' | commonText }} + {{ transaction.timestamp | dateTime }} +

+

+ {{ 'history.sending' | translate }} {{ 'coin' | commonText }} + {{ 'history.pending' | translate }} +

+

+ {{ 'history.received' | translate }} {{ 'coin' | commonText }} + {{ transaction.timestamp | dateTime }} +

+

+ {{ 'history.receiving' | translate }} {{ 'coin' | commonText }} + {{ 'history.pending' | translate }} +

+
+ +

+ {{ 'history.moved' | translate }} {{ 'coin' | commonText }} + {{ transaction.timestamp | dateTime }} +

+

+ {{ 'history.moving' | translate }} {{ 'coin' | commonText }} + {{ 'history.pending' | translate }} +

+
+
+ + {{ address }} +
+
+ {{ 'history.note' | translate }}: {{ transaction.note }} +
+
+
+

{{ transaction.balance.toString() | amount }}

+

+ {{ transaction.balance * price | currency:'USD':'symbol':'1.2-2' }}* +

+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss new file mode 100644 index 00000000..b98301c8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss @@ -0,0 +1,209 @@ +@import '../../../../theme/variables'; + +.form-field { + margin: 10px 40px; + margin-bottom: -20px; + display: flex; + + .x-button { + width: 24px; + height: 24px; + margin-top: 10px; + cursor: pointer; + } +} + +.bottom-line { + border-bottom: 2px solid rgba(0, 0, 0, 0.02); +} + +mat-select { + ::ng-deep .mat-select-trigger { + padding: 10px 30px 10px 10px; + display: block; + font-size: 11px; + height: 100%; + line-height: 20px; + } + + ::ng-deep .mat-select-value { + font-size: 13px; + line-height: 22px; + } + + ::ng-deep .mat-select-arrow { + border: none; + } + + ::ng-deep .mat-select-placeholder { + transition: unset !important; + color: $grey; + + &::before { + content: 'filter_list'; + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 13px; + margin-right: 10px; + } + } + + mat-select-trigger::before { + content: 'filter_list'; + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 13px; + margin-right: 10px; + } + + .filter { + font-size: 13px; + margin-left: 28px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + color: $grey; + } +} + +mat-option ::ng-deep .mat-pseudo-checkbox-checked { + background: $gradient-blue-dark; +} + +.mat-option-disabled { + ::ng-deep .mat-pseudo-checkbox-disabled { + opacity: 0.5; + } +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + margin: 30px; +} + +.-transaction { + background-color: $white; + border-bottom: 1px solid #eff0f0; + cursor: pointer; + display: flex; + padding: 20px 12px; + + &:first-child { + border-top-left-radius: 15px; + border-top-right-radius: 15px; + } + + &:last-child { + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + } + + > div { + padding: 0 8px; + } + + .-icon { + margin-top: 5px; + + img { + width: 32px; + } + + &.-incoming { + -moz-transform: scaleX(-1); + -o-transform: scaleX(-1); + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + filter: FlipH; + -ms-filter: "FlipH"; + } + + &.-pending { + opacity: 0.5; + } + } + + .-address { + flex: 1; + + h4 { + color: #1e2227; + font-size: 13px; + font-weight: 700; + line-height: 15px; + margin: 0 0 8px 0; + + span { + font-size: 10px; + line-height: 12px; + padding-left: 5px; + font-weight: 300; + } + + .-pending { + color: #FDB51E; + } + + .-timestamp { + color: $grey; + } + } + + .-item { + &:not(:last-child) { + margin-bottom: 5px; + } + + img { + display: inline-block; + height: 17px; + vertical-align: middle; + width: 17px; + margin-right: 4px; + } + + span { + color: rgba(30, 34, 39, 0.5); + display: inline-block; + font-size: 13px; + line-height: 15px; + margin: 0; + } + + .note { + color: #1e2227; + word-break: break-word; + display: inline; + } + } + } + + .-balance { + width: 200px; + text-align: right; + + h4 { + color: #1e2227; + font-size: 13px; + font-weight: 700; + line-height: 15px; + margin: 0 0 8px 0; + } + + p { + color: rgba(30, 34, 39, 0.5); + display: inline-block; + font-size: 13px; + line-height: 15px; + margin: 0; + + span { + color: lighten($grey, 40%); + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts new file mode 100644 index 00000000..2b4a9a0a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionListComponent } from './transaction-list.component'; + +describe('TransactionListComponent', () => { + let component: TransactionListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionListComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts new file mode 100644 index 00000000..2c5686e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts @@ -0,0 +1,204 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../services/wallet.service'; +import { PriceService } from '../../../services/price.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { TransactionDetailComponent } from './transaction-detail/transaction-detail.component'; +import { NormalTransaction } from '../../../app.datatypes'; +import { QrCodeComponent, QrDialogConfig } from '../../layout/qr-code/qr-code.component'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs/Observable'; + +export class Wallet { + label: string; + coins: string; + hours: string; + addresses: Address[]; + allAddressesSelected: boolean; +} + +export class Address { + address: string; + coins: string; + hours: string; + showingWholeWallet: boolean; +} + +@Component({ + selector: 'app-transaction-list', + templateUrl: './transaction-list.component.html', + styleUrls: ['./transaction-list.component.scss'], +}) +export class TransactionListComponent implements OnInit, OnDestroy { + allTransactions: NormalTransaction[]; + transactions: NormalTransaction[]; + wallets: Wallet[]; + form: FormGroup; + + private price: number; + private requestedAddress: string; + private transactionsLoaded = false; + private priceSubscription: ISubscription; + private filterSubscription: ISubscription; + private walletsSubscription: ISubscription; + private routeSubscription: ISubscription; + + constructor( + private dialog: MatDialog, + private priceService: PriceService, + private walletService: WalletService, + private formBuilder: FormBuilder, + route: ActivatedRoute, + ) { + + this.form = this.formBuilder.group({ + filter: [[]], + }); + + this.routeSubscription = route.queryParams.subscribe(params => { + this.requestedAddress = params['addr'] ? params['addr'] : ''; + this.showRequestedAddress(); + }); + + this.walletsSubscription = walletService.all().delay(1).flatMap(wallets => { + if (!this.wallets) { + this.wallets = []; + let incompleteData = false; + + // A local copy of the data is created to avoid problems after updating the + // wallet addresses while updating the balance. + wallets.forEach(wallet => { + if (!wallet.coins || !wallet.hours || incompleteData) { + incompleteData = true; + + return; + } + + this.wallets.push({ + label: wallet.label, + coins: wallet.coins.decimalPlaces(6).toString(), + hours: wallet.hours.decimalPlaces(0).toString(), + addresses: [], + allAddressesSelected: false, + }); + + wallet.addresses.forEach(address => { + if (!address.coins || !address.hours || incompleteData) { + incompleteData = true; + + return; + } + + this.wallets[this.wallets.length - 1].addresses.push({ + address: address.address, + coins: address.coins.decimalPlaces(6).toString(), + hours: address.hours.decimalPlaces(0).toString(), + showingWholeWallet: false, + }); + }); + }); + + if (incompleteData) { + this.wallets = null; + + return Observable.of(null); + } else { + return this.walletService.transactions().first(); + } + } else { + return this.walletService.transactions().first(); + } + }).subscribe(transactions => { + if (transactions) { + this.allTransactions = transactions; + + this.transactionsLoaded = true; + this.showRequestedAddress(); + + this.filterTransactions(); + } + }); + } + + ngOnInit() { + this.priceSubscription = this.priceService.price.subscribe(price => this.price = price); + this.filterSubscription = this.form.get('filter').valueChanges.subscribe(() => this.filterTransactions()); + } + + ngOnDestroy() { + this.priceSubscription.unsubscribe(); + this.filterSubscription.unsubscribe(); + this.walletsSubscription.unsubscribe(); + this.routeSubscription.unsubscribe(); + } + + showTransaction(transaction: NormalTransaction) { + const config = new MatDialogConfig(); + config.width = '800px'; + config.data = transaction; + this.dialog.open(TransactionDetailComponent, config); + } + + showQrCode(event: any, address: string) { + event.stopPropagation(); + + const config: QrDialogConfig = { address }; + QrCodeComponent.openDialog(this.dialog, config); + } + + removeFilters() { + this.form.get('filter').setValue([]); + } + + private filterTransactions() { + const selectedfilters: (Wallet|Address)[] = this.form.get('filter').value; + this.wallets.forEach(wallet => { + wallet.allAddressesSelected = false; + wallet.addresses.forEach(address => address.showingWholeWallet = false); + }); + + if (selectedfilters.length === 0) { + this.transactions = this.allTransactions; + } else { + const selectedAddresses: Map = new Map(); + selectedfilters.forEach(filter => { + if ((filter as Wallet).addresses) { + (filter as Wallet).addresses.forEach(address => selectedAddresses.set(address.address, true)); + (filter as Wallet).allAddressesSelected = true; + (filter as Wallet).addresses.forEach(address => address.showingWholeWallet = true); + } else { + selectedAddresses.set((filter as Address).address, true); + } + }); + + this.transactions = this.allTransactions.filter(tx => + tx.inputs.some(input => selectedAddresses.has(input.owner)) || tx.outputs.some(output => selectedAddresses.has(output.dst)), + ); + } + } + + private showRequestedAddress() { + if (!this.transactionsLoaded || !this.wallets || this.wallets.length === 0 || this.requestedAddress === null || this.requestedAddress === undefined) { + return; + } + + if (this.requestedAddress !== '') { + let addressFound: Address; + this.wallets.forEach(wallet => { + const found = wallet.addresses.find(address => address.address === this.requestedAddress); + if (found) { + addressFound = found; + } + }); + + if (addressFound) { + this.form.get('filter').setValue([addressFound]); + } + } else { + this.form.get('filter').setValue([]); + } + + this.requestedAddress = null; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html new file mode 100644 index 00000000..5d342076 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html @@ -0,0 +1,26 @@ + + +
+ {{ 'hardware-wallet.added.characters-warning' | translate }} +
+
+
+ + +
+
+
+ + {{ 'wallet.rename.cancel-button' | translate }} + + + {{ 'wallet.rename.rename-button' | translate }} + +
+
+ + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.scss new file mode 100644 index 00000000..f1214bdc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.scss @@ -0,0 +1,16 @@ +@import '../../../../../theme/variables'; + +mat-input-container { + width: 100%; +} + +.-buttons { + text-align: center; +} + +.info { + margin: 5px 0 25px; + color: $grey; + font-size: 12px; + line-height: 1.5; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts new file mode 100644 index 00000000..fae378f6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChangeNameComponent } from './change-name.component'; + +describe('ChangeNameComponent', () => { + let component: ChangeNameComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChangeNameComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChangeNameComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts new file mode 100644 index 00000000..0e4d59b6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts @@ -0,0 +1,152 @@ +import { Component, OnInit, Inject, ViewChild, OnDestroy } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormBuilder, Validators, FormGroup } from '@angular/forms'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { Wallet } from '../../../../app.datatypes'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MessageIcons } from '../../../layout/hardware-wallet/hw-message/hw-message.component'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +enum States { + Initial, + WaitingForConfirmation, +} + +export class ChangeNameData { + wallet: Wallet; + newName: string; +} + +export class ChangeNameErrorResponse { + errorMsg: string; +} + +@Component({ + selector: 'app-change-name', + templateUrl: './change-name.component.html', + styleUrls: ['./change-name.component.scss'], +}) +export class ChangeNameComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + currentState: States = States.Initial; + states = States; + msgIcons = MessageIcons; + maxHwWalletLabelLength = HwWalletService.maxLabelLength; + showCharactersWarning = false; + + private newLabel: string; + private hwConnectionSubscription: ISubscription; + private operationSubscription: ISubscription; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private data: ChangeNameData, + private formBuilder: FormBuilder, + private walletService: WalletService, + private hwWalletService: HwWalletService, + private translateService: TranslateService, + private msgBarService: MsgBarService, + ) {} + + ngOnInit() { + if (!this.data.newName) { + this.form = this.formBuilder.group({ + label: [this.data.wallet.label, Validators.required], + }); + } else { + this.finishRenaming(this.data.newName); + } + + if (this.data.wallet.isHardware) { + this.showCharactersWarning = true; + + this.hwConnectionSubscription = this.hwWalletService.walletConnectedAsyncEvent.subscribe(connected => { + if (!connected) { + this.closePopup(); + } + }); + } + } + + ngOnDestroy() { + this.msgBarService.hide(); + if (this.hwConnectionSubscription) { + this.hwConnectionSubscription.unsubscribe(); + } + if (this.operationSubscription) { + this.operationSubscription.unsubscribe(); + } + } + + closePopup() { + this.dialogRef.close(); + } + + rename() { + if (!this.form.valid || this.button.isLoading()) { + return; + } + + this.msgBarService.hide(); + this.button.setLoading(); + + this.finishRenaming(this.form.value.label); + } + + private finishRenaming(newLabel) { + this.newLabel = newLabel; + + if (!this.data.wallet.isHardware) { + this.operationSubscription = this.walletService.renameWallet(this.data.wallet, this.newLabel) + .subscribe(() => { + this.dialogRef.close(this.newLabel); + setTimeout(() => this.msgBarService.showDone('common.changes-made')); + }, e => { + this.msgBarService.showError(e); + if (this.button) { + this.button.resetState(); + } + }); + } else { + if (this.data.newName) { + this.currentState = States.WaitingForConfirmation; + } + + this.operationSubscription = this.hwWalletService.checkIfCorrectHwConnected(this.data.wallet.addresses[0].address) + .flatMap(() => { + this.currentState = States.WaitingForConfirmation; + + return this.hwWalletService.changeLabel(this.newLabel); + }) + .subscribe( + () => { + this.data.wallet.label = this.newLabel; + this.walletService.saveHardwareWallets(); + this.dialogRef.close(this.newLabel); + + if (!this.data.newName) { + setTimeout(() => this.msgBarService.showDone('common.changes-made')); + } + }, + err => { + if (this.data.newName) { + const response = new ChangeNameErrorResponse(); + response.errorMsg = getHardwareWalletErrorMsg(this.translateService, err); + this.dialogRef.close(response); + } else { + this.msgBarService.showError(getHardwareWalletErrorMsg(this.translateService, err)); + this.currentState = States.Initial; + if (this.button) { + this.button.resetState(); + } + } + }, + ); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.html new file mode 100644 index 00000000..9808a5fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.html @@ -0,0 +1,110 @@ +
+
+ + +
+
+ +
+ +
+
+
+ + + +
+ {{ lastAssistedSeed }} +
{{ 'wallet.new.seed.change-seed' | translate }}
+
+ touch_app{{ 'wallet.new.seed.enter-seed' | translate }} +
+
+
+
+ +
+
+
+ + + +
+
+ +
+
+
+ +

+ {{ 'wallet.new.seed-warning' | translate}} +

+
+
+ + +
+
+ touch_app{{ 'wallet.new.seed.confirm-seed' | translate }} +
+
+ done {{ 'wallet.new.seed.confirmed-seed' | translate }} +
+
+
+ + + + +
+
+
+ + {{ 'wallet.new.encrypt' | translate }} + +
+
+
+

{{ 'wallet.new.encrypt-warning' | translate }}

+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ error +
+
{{ 'wallet.new.unconventional-seed-title' | translate}}
+
{{ 'wallet.new.unconventional-seed-text' | translate}}
+ + {{ 'wallet.new.unconventional-seed-check' | translate}} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.scss new file mode 100644 index 00000000..6d887fa8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.scss @@ -0,0 +1,171 @@ +@import '../../../../../../theme/_variables.scss'; + +.dashed-border { + border: rgba(0, 0, 0, 0.25) dashed 1px; +} + +.show-pointer { + cursor: pointer; +} + +.non-editable-field { + font-size: 12px; + text-align: center; + padding: 15px; + border-radius: 6px; + color: $black; + + .text-with-icon-container { + display: inline-flex; + align-items: center; + + mat-icon { + margin-right: 5px; + opacity: 1; + } + + .green { + color: $green; + } + + .yellow { + color: $yellow; + } + } +} + +.normal-seed-field { + font-size: 14px; +} + +.seed-type-button { + width: 100%; + height: 10px; + text-align: right; + + > div { + display: inline-block; + width: 32px; + height: 32px; + position: relative; + left: 16px; + top: -10px; + background-color: white; + border-radius: 100px; + cursor: pointer; + + > img { + width: 32px; + height: 32px; + } + } +} + +.onboarding-version { + border: rgba(255, 255, 255, 0.5) dashed 1px; + color: #fff; +} + +.transparent-text { + opacity: 0.75; +} + +.red-disclaimer-box { + color: $red; + font-size: 12px; + padding: 0 10px; + line-height: 1.5; +} + +.white-disclaimer-box { + color: $white; + font-size: 12px; + padding: 0 10px; + line-height: 1.5; +} + +label[for=seed] { + display: flex; + + > span:last-child { + flex: 1; + } + + .generators { + text-align: right; + + span { + cursor: pointer; + color: $blue; + } + + mat-icon { + width: 13px; + height: 10px; + font-size: 13px; + position: relative; + top: 2px; + } + + .divider { + padding: 0 5px; + color: $grey-dark; + } + } + + .-white-text { + span { + color: white !important; + } + } +} + +.-passwords { + margin-left: 24px; + + .-info { + margin: 5px 0 15px; + color: $grey; + font-size: 12px; + line-height: 1.5; + } +} + +.-check ::ng-deep { + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + span { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: $grey-dark; + + img { + width: 38px; + height: 38px; + vertical-align: middle; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.spec.ts new file mode 100644 index 00000000..591a9c50 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CreateWalletFormComponent } from './create-wallet-form.component'; + +describe('CreateWalletFormComponent', () => { + let component: CreateWalletFormComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CreateWalletFormComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateWalletFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.ts new file mode 100644 index 00000000..cf5e89ba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.ts @@ -0,0 +1,317 @@ +import { Component, OnInit, OnDestroy, Input } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { ISubscription } from 'rxjs/Subscription'; +import { ApiService } from '../../../../../services/api.service'; +import { Subject } from 'rxjs/Subject'; +import 'rxjs/add/operator/switchMap'; +import { Observable } from 'rxjs/Observable'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { SeedWordDialogComponent } from '../../../../layout/seed-word-dialog/seed-word-dialog.component'; +import { ConfirmationData } from '../../../../../app.datatypes'; +import { showConfirmationModal } from '../../../../../utils'; +import { MsgBarService } from '../../../../../services/msg-bar.service'; + +export class WalletFormData { + creatingNewWallet: boolean; + label: string; + seed: string; + password: string; + enterSeedWithAssistance: boolean; + lastAssistedSeed: string; + lastCustomSeed: string; + numberOfWords: number; +} + +@Component({ + selector: 'app-create-wallet-form', + templateUrl: './create-wallet-form.component.html', + styleUrls: ['./create-wallet-form.component.scss'], +}) +export class CreateWalletFormComponent implements OnInit, OnDestroy { + @Input() create: boolean; + @Input() onboarding: boolean; + + form: FormGroup; + customSeedIsNormal = true; + customSeedAccepted = false; + encrypt = true; + enterSeedWithAssistance = true; + assistedSeedConfirmed = false; + lastAssistedSeed = ''; + numberOfAutogeneratedWords = 0; + + private seed: Subject = new Subject(); + private statusSubscription: ISubscription; + private seedValiditySubscription: ISubscription; + + private partialSeed: string[]; + + constructor( + private apiService: ApiService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + ) { } + + ngOnInit() { + if (!this.onboarding) { + this.initForm(); + } else { + this.initForm(false, null); + } + } + + ngOnDestroy() { + this.msgBarService.hide(); + this.statusSubscription.unsubscribe(); + this.seedValiditySubscription.unsubscribe(); + } + + get isValid(): boolean { + return this.form.valid && + ( + (!this.enterSeedWithAssistance && (this.customSeedIsNormal || this.customSeedAccepted)) || + (this.create && this.enterSeedWithAssistance && this.assistedSeedConfirmed) || + (!this.create && this.enterSeedWithAssistance && this.lastAssistedSeed.length > 2) + ); + } + + onCustomSeedAcceptance(event) { + this.customSeedAccepted = event.checked; + } + + setEncrypt(event) { + this.encrypt = event.checked; + this.form.updateValueAndValidity(); + } + + getData(): WalletFormData { + return { + creatingNewWallet: this.create, + label: this.form.value.label, + seed: this.enterSeedWithAssistance ? this.lastAssistedSeed : this.form.value.seed, + password: !this.onboarding && this.encrypt ? this.form.value.password : null, + enterSeedWithAssistance: this.enterSeedWithAssistance, + lastAssistedSeed: this.lastAssistedSeed, + lastCustomSeed: this.form.value.seed, + numberOfWords: !this.create ? this.form.value.number_of_words : this.numberOfAutogeneratedWords, + }; + } + + changeSeedType() { + this.msgBarService.hide(); + + if (!this.enterSeedWithAssistance) { + this.enterSeedWithAssistance = true; + this.removeConfirmations(); + } else { + const confirmationData: ConfirmationData = { + text: this.create ? 'wallet.new.seed.custom-seed-warning-text' : 'wallet.new.seed.custom-seed-warning-text-recovering', + headerText: 'wallet.new.seed.custom-seed-warning-title', + checkboxText: this.create ? 'wallet.new.seed.custom-seed-warning-check' : null, + confirmButtonText: 'wallet.new.seed.custom-seed-warning-continue', + cancelButtonText: 'wallet.new.seed.custom-seed-warning-cancel', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.enterSeedWithAssistance = false; + this.removeConfirmations(); + } + }); + } + } + + enterSeed() { + if (!this.create) { + this.partialSeed = []; + this.askForWord(0); + this.msgBarService.hide(); + } + } + + confirmNormalSeed() { + if (!this.assistedSeedConfirmed) { + this.partialSeed = []; + this.askForWord(0); + this.msgBarService.hide(); + } + } + + private askForWord(wordIndex: number) { + this.dialog.open(SeedWordDialogComponent, { + width: '350px', + data: { + isForHwWallet: false, + wordNumber: wordIndex + 1, + restoringSoftwareWallet: !this.create, + }, + }).afterClosed().subscribe(word => { + if (word) { + if (this.create) { + const lastSeedWords = this.lastAssistedSeed.split(' '); + if (word !== lastSeedWords[wordIndex]) { + this.msgBarService.showError('wallet.new.seed.incorrect-word'); + + return; + } + } + + this.partialSeed[wordIndex] = word; + wordIndex += 1; + + if ((this.create && wordIndex < this.numberOfAutogeneratedWords) || (!this.create && wordIndex < this.form.controls['number_of_words'].value)) { + this.askForWord(wordIndex); + } else { + if (this.create) { + this.assistedSeedConfirmed = true; + } else { + let enteredSeed = ''; + this.partialSeed.forEach(currentWord => enteredSeed += currentWord + ' '); + enteredSeed = enteredSeed.substr(0, enteredSeed.length - 1); + + this.apiService.post('wallet/seed/verify', {seed: enteredSeed}, {}, true) + .subscribe(() => this.lastAssistedSeed = enteredSeed, () => this.msgBarService.showError('wallet.new.seed.invalid-seed')); + } + } + } + }); + } + + initForm(create: boolean = null, data: WalletFormData = null) { + this.msgBarService.hide(); + + create = create !== null ? create : this.create; + + this.lastAssistedSeed = ''; + this.enterSeedWithAssistance = true; + + const validators = []; + if (create) { + validators.push(this.seedMatchValidator.bind(this)); + } + if (!this.onboarding) { + validators.push(this.validatePasswords.bind(this)); + } + validators.push(this.mustHaveSeed.bind(this)); + + this.form = new FormGroup({}, validators); + this.form.addControl('label', new FormControl(data ? data.label : '', [Validators.required])); + this.form.addControl('seed', new FormControl(data ? data.lastCustomSeed : '')); + this.form.addControl('confirm_seed', new FormControl(data ? data.lastCustomSeed : '')); + this.form.addControl('password', new FormControl()); + this.form.addControl('confirm_password', new FormControl()); + this.form.addControl('number_of_words', new FormControl(!this.create && data && data.numberOfWords ? data.numberOfWords : 12)); + + this.removeConfirmations(false); + + if (create && !data) { + this.generateSeed(128); + } + + if (data) { + setTimeout(() => { this.seed.next(data['seed']); }); + this.customSeedAccepted = true; + this.enterSeedWithAssistance = data.enterSeedWithAssistance; + this.lastAssistedSeed = data.lastAssistedSeed; + this.assistedSeedConfirmed = true; + + if (this.create) { + this.numberOfAutogeneratedWords = data.numberOfWords; + } + } + + if (this.statusSubscription && !this.statusSubscription.closed) { + this.statusSubscription.unsubscribe(); + } + this.statusSubscription = this.form.statusChanges.subscribe(() => { + this.customSeedAccepted = false; + this.seed.next(this.form.get('seed').value); + }); + + this.subscribeToSeedValidation(); + } + + generateSeed(entropy: number) { + if (entropy === 128) { + this.numberOfAutogeneratedWords = 12; + } else { + this.numberOfAutogeneratedWords = 24; + } + + this.apiService.generateSeed(entropy).subscribe(seed => { + this.lastAssistedSeed = seed; + this.form.get('seed').setValue(seed); + this.removeConfirmations(); + }); + } + + private removeConfirmations(cleanSecondSeedField = true) { + this.customSeedAccepted = false; + this.assistedSeedConfirmed = false; + if (cleanSecondSeedField) { + this.form.get('confirm_seed').setValue(''); + } + this.form.updateValueAndValidity(); + } + + private subscribeToSeedValidation() { + if (this.seedValiditySubscription) { + this.seedValiditySubscription.unsubscribe(); + } + + this.seedValiditySubscription = this.seed.asObservable().switchMap(seed => { + if ((!this.seedMatchValidator() || !this.create) && !this.enterSeedWithAssistance) { + return this.apiService.post('wallet/seed/verify', {seed}, {}, true); + } else { + return Observable.of(0); + } + }).subscribe(() => { + this.customSeedIsNormal = true; + }, error => { + if (error.status && error.status === 422) { + this.customSeedIsNormal = false; + } else { + this.customSeedIsNormal = true; + } + this.subscribeToSeedValidation(); + }); + } + + private validatePasswords() { + if (this.encrypt && this.form && this.form.get('password') && this.form.get('confirm_password')) { + if (this.form.get('password').value) { + if (this.form.get('password').value !== this.form.get('confirm_password').value) { + return { NotEqual: true }; + } + } else { + return { Required: true }; + } + } + + return null; + } + + private mustHaveSeed() { + if (!this.enterSeedWithAssistance) { + if ((this.form.get('seed').value as string) === '') { + return { Required: true }; + } else { + return null; + } + } + } + + private seedMatchValidator() { + if (this.enterSeedWithAssistance) { + return null; + } + + if (this.form && this.form.get('seed') && this.form.get('confirm_seed')) { + return this.form.get('seed').value === this.form.get('confirm_seed').value ? null : { NotEqual: true }; + } else { + this.customSeedIsNormal = true; + + return { NotEqual: true }; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html new file mode 100644 index 00000000..90cbcf64 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html @@ -0,0 +1,11 @@ + + +
+ + {{ 'wallet.new.cancel-button' | translate }} + + + {{ 'wallet.new.' + (data.create ? 'create' : 'load') + '-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss new file mode 100644 index 00000000..1f8d001c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss @@ -0,0 +1,5 @@ +@import '../../../../../theme/variables'; + +.-buttons { + text-align: center; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts new file mode 100644 index 00000000..4ccb5dba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CreateWalletComponent } from './create-wallet.component'; + +describe('CreateWalletComponent', () => { + let component: CreateWalletComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CreateWalletComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateWalletComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts new file mode 100644 index 00000000..45dd4dd0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts @@ -0,0 +1,93 @@ +import { Component, Inject, ViewChild, OnDestroy } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { MatDialogRef, MatDialog } from '@angular/material/dialog'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MAT_DIALOG_DATA } from '@angular/material'; +import { CreateWalletFormComponent } from './create-wallet-form/create-wallet-form.component'; +import { ISubscription } from 'rxjs/Subscription'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { ConfirmationData } from '../../../../app.datatypes'; +import { showConfirmationModal } from '../../../../utils'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-create-wallet', + templateUrl: './create-wallet.component.html', + styleUrls: ['./create-wallet.component.scss'], +}) +export class CreateWalletComponent implements OnDestroy { + @ViewChild('formControl') formControl: CreateWalletFormComponent; + @ViewChild('createButton') createButton: ButtonComponent; + @ViewChild('cancelButton') cancelButton: ButtonComponent; + + scan: Number; + disableDismiss = false; + + private synchronized = true; + private synchronizedSubscription: ISubscription; + + constructor( + @Inject(MAT_DIALOG_DATA) public data, + public dialogRef: MatDialogRef, + private walletService: WalletService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + blockchainService: BlockchainService, + ) { + this.synchronizedSubscription = blockchainService.synchronized.subscribe(value => this.synchronized = value); + } + + ngOnDestroy() { + this.synchronizedSubscription.unsubscribe(); + this.msgBarService.hide(); + } + + closePopup() { + this.dialogRef.close(); + } + + createWallet() { + if (!this.formControl.isValid || this.createButton.isLoading()) { + return; + } + + this.msgBarService.hide(); + + if (this.synchronized || this.data.create) { + this.continueCreating(); + } else { + const confirmationData: ConfirmationData = { + headerText: 'wallet.new.synchronizing-warning-title', + text: 'wallet.new.synchronizing-warning-text', + confirmButtonText: 'wallet.new.synchronizing-warning-continue', + cancelButtonText: 'wallet.new.synchronizing-warning-cancel', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.continueCreating(); + } + }); + } + } + + private continueCreating() { + const data = this.formControl.getData(); + + this.createButton.resetState(); + this.createButton.setLoading(); + this.cancelButton.setDisabled(); + this.disableDismiss = true; + + this.walletService.create(data.label, data.seed, this.scan, data.password) + .subscribe(() => { + setTimeout(() => this.msgBarService.showDone('wallet.new.wallet-created')); + this.dialogRef.close(); + }, e => { + this.msgBarService.showError(e); + this.createButton.resetState(); + this.cancelButton.disabled = false; + this.disableDismiss = false; + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.css new file mode 100644 index 00000000..6be7dae0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.css @@ -0,0 +1,7 @@ +mat-input-container { + width: 100%; +} + +.-buttons { + text-align: center; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.html new file mode 100644 index 00000000..04f56458 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.html @@ -0,0 +1,16 @@ + +
+
+ + +
+
+
+ + {{ 'wallet.add-addresses.cancel-button' | translate }} + + + {{ 'wallet.add-addresses.create-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.spec.ts new file mode 100644 index 00000000..b89ac343 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NumberOfAddressesComponent } from './number-of-addresses'; + +describe('NumberOfAddressesComponent', () => { + let component: NumberOfAddressesComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NumberOfAddressesComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NumberOfAddressesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.ts new file mode 100644 index 00000000..6e939612 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.ts @@ -0,0 +1,62 @@ +import { Component, OnInit, Inject, ViewChild, OnDestroy } from '@angular/core'; +import { FormBuilder, FormGroup, FormControl } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-number-of-addresses', + templateUrl: './number-of-addresses.html', + styleUrls: ['./number-of-addresses.css'], +}) +export class NumberOfAddressesComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + + constructor( + @Inject(MAT_DIALOG_DATA) private data: any, + public dialogRef: MatDialogRef, + private msgBarService: MsgBarService, + ) {} + + ngOnInit() { + this.form = new FormGroup({}); + this.form.addControl('quantity', new FormControl(1, [this.validateQuantity])); + } + + ngOnDestroy() { + this.msgBarService.hide(); + } + + closePopup() { + this.dialogRef.close(); + } + + continue() { + if (this.button.isLoading()) { + return; + } + + this.msgBarService.hide(); + this.button.setLoading(); + + this.data(this.form.value.quantity, (close, endedWithError = false) => { + this.button.resetState(); + if (!endedWithError) { + if (close) { + this.closePopup(); + } + } else { + this.msgBarService.showError('wallet.add-addresses.error'); + } + }); + } + + private validateQuantity(control: FormControl) { + if (control.value < 1 || control.value > 100 || Number(control.value) !== Math.round(Number(control.value))) { + return { invalid: true }; + } + + return null; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html new file mode 100644 index 00000000..c20b7c4c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html @@ -0,0 +1,78 @@ +
+ +
+ + + {{ (wallet.isHardware ? 'wallet.new-address' : 'wallet.new-addresses') | translate }} + +
+
+ + {{ 'wallet.' + (wallet.hideEmpty ? 'show' : 'hide') + '-empty' | translate }} + +
+
+
+ {{ 'wallet.delete' | translate }} +
+
+
+ + {{ 'wallet.' + (wallet.encrypted ? 'decrypt' : 'encrypt') | translate }} + +
+
+ + + {{ 'wallet.edit' | translate }} + +
+
+ +
+ +
+
{{ i + 1 }}
+
+ + +

+ {{ address.address }} + + + {{ 'wallet.address.copy' | translate }} + +

+
+ +

+ {{ address.address }} + + {{ 'wallet.address.show' | translate }} + + +

+
+
+
{{ (address.coins ? address.coins.toString() : 0) | amount:true:'first' }}
+
{{ (address.hours ? address.hours.toString() : 0) | amount:false:'first' }}
+
+ more_vert + + + + + + +
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss new file mode 100644 index 00000000..52287c2e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss @@ -0,0 +1,252 @@ +@import '../../../../../theme/variables'; + +.-record { + display: flex; + font-size: $font-size-standard; + padding: 21px 20px 16px 20px; + align-items: center; + + &:not(:last-of-type) { + border-bottom: 1px solid rgba(30, 34, 39, 0.05); + } + + .id-column { + width: 50px; + color: $grey; + flex-shrink: 0; + } + + .address-column { + color: $grey; + flex: 1 1 auto; + display: flex; + align-items: center; + + img { + display: inline-block; + height: 17px; + vertical-align: middle; + width: 17px; + margin-right: 10px; + flex-shrink: 0; + } + + p { + display: inline-block; + margin: 0; + vertical-align: middle; + word-break: break-all; + + &:hover .copy-label { + opacity: .999 !important; + } + } + } + + .truncated-address { + max-width: 60px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; + vertical-align: middle; + } + + .hours-column { + color: $grey; + width: 130px; + text-align: right; + flex-shrink: 0; + } + + .coins-column { + color: $grey-dark; + width: 130px; + text-align: right; + flex-shrink: 0; + } + + .options-column { + width: 80px; + text-align: right; + display: flex; + justify-content: flex-end; + flex-shrink: 0; + + mat-icon { + cursor: pointer; + color: lighten($grey, 30%); + + &:hover { + color: $blue; + } + } + } + + > img { + display: inline-block; + margin-left: 0; + height: $row-detail-size; + width: $row-detail-size; + } +} + +.click-to-copy { + cursor: pointer; +} + +.-actions { + background-color: #fefefe; + border-bottom: 1px solid #eff0f0; + display: flex; + width: 100%; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.03) !important; + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + z-index: 100; + position: relative; + padding: 0px !important; + + .-button { + padding-right: 20px; + padding-left: 0px; + + &:first-child { + padding-left: 5px; + } + + .-enabled-span { + cursor: pointer; + + &:hover { + color: $grey; + } + } + + span { + color: #CECFD0; + font-size: 12px; + height: 60px; + margin: 0 5px; + cursor: pointer; + display: flex; + align-items: center; + + &.-img::before { + content: ''; + display: inline-block; + height: 32px; + width: 32px; + margin-right: 5px; + background-repeat: no-repeat; + background-size: 32px 32px; + } + + &.-new-address::before { + background-image: url(../../../../../assets/img/plus-grey.png); + } + + &.-hide-empty::before { + background-image: url(../../../../../assets/img/minus-grey.png); + } + + &.-show-empty::before { + background-image: url(../../../../../assets/img/plus-grey.png); + } + + &.-enable-encryption::before { + background-image: url(../../../../../assets/img/lock-grey.png); + } + + &.-disable-encryption::before { + background-image: url(../../../../../assets/img/unlock-grey.png); + } + + &.-edit-wallet::before { + background-image: url(../../../../../assets/img/edit-grey.png); + } + + &.-btn-delete::before { + background-image: url(../../../../../assets/img/delete-grey.png); + } + + &:hover { + color: $grey; + + &.-new-address::before { + background-image: url(../../../../../assets/img/plus-green.png); + } + + &.-hide-empty::before { + background-image: url(../../../../../assets/img/minus-red.png); + } + + &.-show-empty::before { + background-image: url(../../../../../assets/img/plus-green.png); + } + + &.-enable-encryption::before { + background-image: url(../../../../../assets/img/lock-gold.png); + } + + &.-disable-encryption::before { + background-image: url(../../../../../assets/img/unlock-gold.png); + } + + &.-edit-wallet::before { + background-image: url(../../../../../assets/img/edit-blue.png); + } + + &.-btn-delete::before { + background-image: url(../../../../../assets/img/delete-red.png); + } + } + } + } +} + +@keyframes floatup { + 50% { + opacity: 1; + } + + 100% { + transform: translateY(-20px); + opacity: 0; + } +} + +.copy-label { + color: $blue; + opacity: 0; + font-size: 12px; + position: relative; + padding-left: 10px; + + &::after { + content: attr(data-label); + position: absolute; + white-space: nowrap; + top: 0; + left: 4px; + opacity: 0; + line-height: 1; + } +} + +.unconfirmed-label { + opacity: 0.5 !important; +} + +.copying .copy-label::after { + animation: floatup .5s ease-in-out; +} + +mat-spinner { + margin-left: 7px; + margin-right: 12px; + + ::ng-deep circle { + stroke: $grey-light; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts new file mode 100644 index 00000000..32c805e4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WalletDetailComponent } from './wallet-detail.component'; + +describe('WalletDetailComponent', () => { + let component: WalletDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WalletDetailComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WalletDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts new file mode 100644 index 00000000..410b51bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts @@ -0,0 +1,332 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { Wallet, ConfirmationData } from '../../../../app.datatypes'; +import { WalletService } from '../../../../services/wallet.service'; +import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog'; +import { ChangeNameComponent, ChangeNameData } from '../change-name/change-name.component'; +import { QrCodeComponent, QrDialogConfig } from '../../../layout/qr-code/qr-code.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { NumberOfAddressesComponent } from '../number-of-addresses/number-of-addresses'; +import { TranslateService } from '@ngx-translate/core'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { Observable } from 'rxjs/Observable'; +import { showConfirmationModal, copyTextToClipboard } from '../../../../utils'; +import { AppConfig } from '../../../../app.config'; +import { Router } from '@angular/router'; +import { HwConfirmAddressDialogComponent, AddressConfirmationParams } from '../../../layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { ApiService } from '../../../../services/api.service'; + +@Component({ + selector: 'app-wallet-detail', + templateUrl: './wallet-detail.component.html', + styleUrls: ['./wallet-detail.component.scss'], +}) +export class WalletDetailComponent implements OnDestroy { + @Input() wallet: Wallet; + + confirmingIndex = null; + creatingAddress = false; + preparingToEdit = false; + + private howManyAddresses: number; + private editSubscription: ISubscription; + private confirmSubscription: ISubscription; + private txHistorySubscription: ISubscription; + + constructor( + private dialog: MatDialog, + private walletService: WalletService, + private msgBarService: MsgBarService, + private hwWalletService: HwWalletService, + private translateService: TranslateService, + private router: Router, + private apiService: ApiService, + ) { } + + ngOnDestroy() { + this.msgBarService.hide(); + if (this.editSubscription) { + this.editSubscription.unsubscribe(); + } + if (this.confirmSubscription) { + this.confirmSubscription.unsubscribe(); + } + if (this.txHistorySubscription) { + this.txHistorySubscription.unsubscribe(); + } + } + + editWallet() { + this.msgBarService.hide(); + + if (this.wallet.isHardware) { + if (this.preparingToEdit) { + return; + } + + this.preparingToEdit = true; + this.editSubscription = this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address) + .flatMap(() => this.walletService.getHwFeaturesAndUpdateData(this.wallet)) + .subscribe( + response => { + this.continueEditWallet(); + this.preparingToEdit = false; + + if (response.walletNameUpdated) { + this.msgBarService.showWarning('hardware-wallet.general.name-updated'); + } + }, + err => { + this.msgBarService.showError(getHardwareWalletErrorMsg(this.translateService, err)); + this.preparingToEdit = false; + }, + ); + } else { + this.continueEditWallet(); + } + } + + newAddress() { + if (this.creatingAddress) { + return; + } + + if (this.wallet.isHardware && this.wallet.addresses.length >= AppConfig.maxHardwareWalletAddresses) { + const confirmationData: ConfirmationData = { + text: 'wallet.max-hardware-wallets-error', + headerText: 'errors.error', + confirmButtonText: 'confirmation.close', + }; + showConfirmationModal(this.dialog, confirmationData); + + return; + } + + this.msgBarService.hide(); + + if (!this.wallet.isHardware) { + const maxAddressesGap = 20; + + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = (howManyAddresses, callback) => { + this.howManyAddresses = howManyAddresses; + + let lastWithBalance = 0; + this.wallet.addresses.forEach((address, i) => { + if (address.coins.isGreaterThan(0)) { + lastWithBalance = i; + } + }); + + if ((this.wallet.addresses.length - (lastWithBalance + 1)) + howManyAddresses < maxAddressesGap) { + callback(true); + this.continueNewAddress(); + } else { + this.txHistorySubscription = this.apiService.getTransactions(this.wallet.addresses).first().subscribe(transactions => { + const AddressesWithTxs = new Map(); + + transactions.forEach(transaction => { + transaction.outputs.forEach(output => { + if (!AddressesWithTxs.has(output.dst)) { + AddressesWithTxs.set(output.dst, true); + } + }); + }); + + let lastWithTxs = 0; + this.wallet.addresses.forEach((address, i) => { + if (AddressesWithTxs.has(address.address)) { + lastWithTxs = i; + } + }); + + if ((this.wallet.addresses.length - (lastWithTxs + 1)) + howManyAddresses < maxAddressesGap) { + callback(true); + this.continueNewAddress(); + } else { + const confirmationData: ConfirmationData = { + text: 'wallet.add-many-confirmation', + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + callback(true); + this.continueNewAddress(); + } else { + callback(false); + } + }); + } + }, () => callback(false, true)); + } + }; + + this.dialog.open(NumberOfAddressesComponent, config); + } else { + this.howManyAddresses = 1; + this.continueNewAddress(); + } + } + + toggleEmpty() { + this.wallet.hideEmpty = !this.wallet.hideEmpty; + } + + deleteWallet() { + this.msgBarService.hide(); + + const confirmationData: ConfirmationData = { + text: this.translateService.instant('wallet.delete-confirmation', {name: this.wallet.label}), + headerText: 'confirmation.header-text', + checkboxText: 'wallet.delete-confirmation-check', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.walletService.deleteHardwareWallet(this.wallet).subscribe(result => { + if (result) { + this.walletService.all().first().subscribe(wallets => { + if (wallets.length === 0) { + setTimeout(() => this.router.navigate(['/wizard']), 500); + } + }); + } + }); + } + }); + } + + toggleEncryption() { + const config = new MatDialogConfig(); + config.data = { + confirm: !this.wallet.encrypted, + title: this.wallet.encrypted ? 'wallet.decrypt' : 'wallet.encrypt', + }; + + if (!this.wallet.encrypted) { + config.data['description'] = 'wallet.new.encrypt-warning'; + } else { + config.data['description'] = 'wallet.decrypt-warning'; + config.data['warning'] = true; + config.data['wallet'] = this.wallet; + } + + this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.walletService.toggleEncryption(this.wallet, passwordDialog.password).subscribe(() => { + passwordDialog.close(); + setTimeout(() => this.msgBarService.showDone('common.changes-made')); + }, e => passwordDialog.error(e)); + }); + } + + confirmAddress(address, addressIndex, showCompleteConfirmation) { + if (this.confirmingIndex !== null) { + return; + } + + this.confirmingIndex = addressIndex; + this.msgBarService.hide(); + + if (this.confirmSubscription) { + this.confirmSubscription.unsubscribe(); + } + + this.confirmSubscription = this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).subscribe(response => { + const data = new AddressConfirmationParams(); + data.address = address; + data.addressIndex = addressIndex; + data.showCompleteConfirmation = showCompleteConfirmation; + + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + config.data = data; + this.dialog.open(HwConfirmAddressDialogComponent, config); + + this.confirmingIndex = null; + }, err => { + this.msgBarService.showError(getHardwareWalletErrorMsg(this.translateService, err)); + this.confirmingIndex = null; + }); + } + + copyAddress(event, address, duration = 500) { + event.stopPropagation(); + + if (address.copying) { + return; + } + + copyTextToClipboard(address.address); + address.copying = true; + + setTimeout(function() { + address.copying = false; + }, duration); + } + + showQrCode(event, address: string) { + event.stopPropagation(); + + const config: QrDialogConfig = { address }; + QrCodeComponent.openDialog(this.dialog, config); + } + + private continueNewAddress() { + this.creatingAddress = true; + + if (!this.wallet.isHardware && this.wallet.encrypted) { + const config = new MatDialogConfig(); + config.data = { + wallet: this.wallet, + }; + + const dialogRef = this.dialog.open(PasswordDialogComponent, config); + dialogRef.afterClosed().subscribe(() => this.creatingAddress = false); + dialogRef.componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.walletService.addAddress(this.wallet, this.howManyAddresses, passwordDialog.password) + .subscribe(() => passwordDialog.close(), error => passwordDialog.error(error)); + }); + } else { + + let procedure: Observable; + + if (this.wallet.isHardware ) { + procedure = this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).flatMap( + () => this.walletService.addAddress(this.wallet, this.howManyAddresses), + ); + } else { + procedure = this.walletService.addAddress(this.wallet, this.howManyAddresses); + } + + procedure.subscribe(() => this.creatingAddress = false, + err => { + if (!this.wallet.isHardware ) { + this.msgBarService.showError(err); + } else { + this.msgBarService.showError(getHardwareWalletErrorMsg(this.translateService, err)); + } + this.creatingAddress = false; + }, + ); + } + } + + private continueEditWallet() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = new ChangeNameData(); + (config.data as ChangeNameData).wallet = this.wallet; + this.dialog.open(ChangeNameComponent, config); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.html new file mode 100644 index 00000000..97277956 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.html @@ -0,0 +1,54 @@ +
+ + +
+
+ +
+
{{ (i === 0 ? 'wallet.hardware-wallet' : 'wallet.wallet') | translate }}
+
+
{{ 'coin' | commonText }}
+
{{ 'hours' | commonText }}
+
+ +
+
+
+
{{ wallet.label }}
+
+ + + +
+
{{ (wallet.coins ? wallet.coins.toString() : 0) | amount:true:'first' }}
+
{{ (wallet.hours ? wallet.hours.toString() : 0) | amount:false:'first' }}
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.scss new file mode 100644 index 00000000..c0474d37 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.scss @@ -0,0 +1,125 @@ +@import '../../../../theme/variables'; + +.-width-130 { + width: 130px; + flex-shrink: 0; +} + +.-width-250 { + width: 250px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + padding-right: 20px; +} + +.-headers { + color: $grey-light; + display: flex; + font-size: 12px; + font-weight: 700; + height: 50px; + line-height: 50px; + padding: 0 130px 0 50px; +} + +.-wallets { + margin: 0 30px; +} + +.-body { + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + margin: 0; + margin-bottom: 10px; +} + +.-wallet { + background-color: $white; + border-bottom: 1px solid rgba(30, 34, 39, 0.05); + display: flex; + font-size: $font-size-standard; + line-height: 60px; + height: 60px; + padding-left: 20px; + cursor: pointer; + + &:first-child { + border-top-left-radius: 10px; + border-top-right-radius: 10px; + } + + &:last-child { + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + } + + .-label { + color: $grey-dark; + } + + .-hours { + color: $grey; + text-align: right; + } + + .-coins { + color: $grey-dark; + text-align: right; + } + + .-encryption { + padding-left: 20px; + + img { + border-radius: 50%; + background-color: $grey-lightest; + display: inline-block; + height: 38px; + margin: 11px 0; + padding: 3px; + width: 38px; + cursor: pointer; + } + } + + .-expand { + display: flex; + justify-content: flex-end; + align-items: center; + width: 85px; + margin-right: 15px; + flex-shrink: 0; + + img { + width: $row-detail-size; + height: $row-detail-size; + } + } +} + +.-text-right { + text-align: right; +} + +.action-buttons { + margin-bottom: 74px; + padding: 40px 0 40px; + text-align: center; + + button { + background-color: $grey-lightest; + border: none; + box-shadow: none; + color: $grey; + font-size: 13px; + margin: 0 5px; + min-width: 140px; + + img { + height: 28px; + margin-left: -4px; + width: 28px; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts new file mode 100644 index 00000000..07abc901 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WalletsComponent } from './wallets.component'; + +describe('WalletsComponent', () => { + let component: WalletsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WalletsComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WalletsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.ts new file mode 100644 index 00000000..de2b831a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.ts @@ -0,0 +1,103 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../services/wallet.service'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { CreateWalletComponent } from './create-wallet/create-wallet.component'; +import { Wallet, ConfirmationData } from '../../../app.datatypes'; +import { HwOptionsDialogComponent } from '../../layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component'; +import { ISubscription } from 'rxjs/Subscription'; +import { Router } from '@angular/router'; +import { HwWalletService } from '../../../services/hw-wallet.service'; +import { showConfirmationModal } from '../../../utils'; + +@Component({ + selector: 'app-wallets', + templateUrl: './wallets.component.html', + styleUrls: ['./wallets.component.scss'], +}) +export class WalletsComponent implements OnInit, OnDestroy { + + hwCompatibilityActivated = false; + + wallets: Wallet[] = []; + hardwareWallets: Wallet[] = []; + + private subscription: ISubscription; + + constructor( + private walletService: WalletService, + private hwWalletService: HwWalletService, + private dialog: MatDialog, + private router: Router, + ) { + this.hwCompatibilityActivated = this.hwWalletService.hwWalletCompatibilityActivated; + + this.subscription = this.walletService.all().subscribe(wallets => { + this.wallets = []; + this.hardwareWallets = []; + wallets.forEach(value => { + if (!value.isHardware) { + this.wallets.push(value); + } else { + this.hardwareWallets.push(value); + } + }); + }); + } + + ngOnInit(): void { + if (this.hwWalletService.showOptionsWhenPossible) { + setTimeout(() => { + this.hwWalletService.showOptionsWhenPossible = false; + this.adminHwWallet(); + }); + } + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + addWallet(create) { + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = { create }; + this.dialog.open(CreateWalletComponent, config); + } + + adminHwWallet() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + this.dialog.open(HwOptionsDialogComponent, config).afterClosed().subscribe(() => { + this.walletService.all().first().subscribe(wallets => { + if (wallets.length === 0) { + setTimeout(() => this.router.navigate(['/wizard']), 500); + } + }); + }); + } + + toggleWallet(wallet: Wallet) { + if (wallet.isHardware && wallet.hasHwSecurityWarnings && !wallet.stopShowingHwSecurityPopup && !wallet.opened) { + const confirmationData: ConfirmationData = { + headerText: 'hardware-wallet.security-warning.title', + text: 'hardware-wallet.security-warning.text', + checkboxText: 'hardware-wallet.security-warning.check', + confirmButtonText: 'hardware-wallet.security-warning.continue', + cancelButtonText: 'hardware-wallet.security-warning.cancel', + linkText: 'hardware-wallet.security-warning.link', + linkFunction: this.adminHwWallet.bind(this), + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + wallet.stopShowingHwSecurityPopup = true; + this.walletService.saveHardwareWallets(); + wallet.opened = true; + } + }); + } else { + wallet.opened = !wallet.opened; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.spec.ts new file mode 100644 index 00000000..e79cd8ae --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.spec.ts @@ -0,0 +1,8 @@ +import { DontsavepasswordDirective } from './dontsavepassword.directive'; + +describe('DontsavepasswordDirective', () => { + it('should create an instance', () => { + const directive = new DontsavepasswordDirective(null); + expect(directive).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.ts new file mode 100644 index 00000000..3fc58807 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.ts @@ -0,0 +1,17 @@ +import { Directive, ElementRef, HostListener } from '@angular/core'; + +@Directive({ + selector: '[appDontSavePassword]', +}) +export class DontsavepasswordDirective { + constructor( + private el: ElementRef, + ) { + el.nativeElement.autocomplete = 'new-password'; + el.nativeElement.readOnly = true; + } + + @HostListener('focus') onFocus() { + this.el.nativeElement.readOnly = false; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.spec.ts new file mode 100644 index 00000000..c03aa55c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.spec.ts @@ -0,0 +1,8 @@ +import { AmountPipe } from './amount.pipe'; + +describe('AmountPipe', () => { + it('create an instance', () => { + const pipe = new AmountPipe(null, null, null); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.ts new file mode 100644 index 00000000..89d8ae2d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.ts @@ -0,0 +1,35 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DecimalPipe } from '@angular/common'; +import { BlockchainService } from '../services/blockchain.service'; +import { AppService } from '../services/app.service'; + +@Pipe({ + name: 'amount', + pure: false, +}) +export class AmountPipe implements PipeTransform { + + constructor( + private decimalPipe: DecimalPipe, + private blockchainService: BlockchainService, + private appService: AppService, + ) { } + + transform(value: any, showingCoins = true, partToReturn = '') { + let firstPart: string; + let response = ''; + + if (partToReturn !== 'last') { + firstPart = this.decimalPipe.transform(value, showingCoins ? ('1.0-' + this.blockchainService.currentMaxDecimals) : '1.0-0'); + response = firstPart; + if (partToReturn !== 'first') { + response += ' '; + } + } + if (partToReturn !== 'first') { + response += showingCoins ? this.appService.coinName : (Number(value) === 1 || Number(value) === -1 ? this.appService.hoursNameSingular : this.appService.hoursName); + } + + return response; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.spec.ts new file mode 100644 index 00000000..e4ee5fa7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.spec.ts @@ -0,0 +1,8 @@ +import { CommonTextPipe } from './common-text.pipe'; + +describe('CommonTextPipe', () => { + it('create an instance', () => { + const pipe = new CommonTextPipe(null); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.ts new file mode 100644 index 00000000..8ac5f195 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.ts @@ -0,0 +1,25 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { AppService } from '../services/app.service'; + +@Pipe({ + name: 'commonText', + pure: false, +}) +export class CommonTextPipe implements PipeTransform { + + constructor( + private appService: AppService, + ) { } + + transform(value: any) { + if (value === 'hours') { + return this.appService.hoursName; + } else if (value === 'coin') { + return this.appService.coinName; + } else if (value === 'coinFull') { + return this.appService.fullCoinName; + } + + return ''; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.spec.ts new file mode 100644 index 00000000..39de2012 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.spec.ts @@ -0,0 +1,8 @@ +import { DateFromNowPipe } from './date-from-now.pipe'; + +describe('DateFromNowPipe', () => { + it('create an instance', () => { + const pipe = new DateFromNowPipe(null); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.ts new file mode 100644 index 00000000..bc7ac503 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.ts @@ -0,0 +1,33 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import * as moment from 'moment'; +import { TranslateService } from '@ngx-translate/core'; + +@Pipe({ + name: 'dateFromNow', + pure: false, +}) +export class DateFromNowPipe implements PipeTransform { + constructor( + public translateService: TranslateService, + ) { } + + transform(value: any) { + const diff: number = moment().unix() - value; + + if (diff < 60) { + return this.translateService.instant('time-from-now.few-seconds'); + } else if (diff < 120) { + return this.translateService.instant('time-from-now.minute'); + } else if (diff < 3600) { + return this.translateService.instant('time-from-now.minutes', { time: Math.floor(diff / 60) }); + } else if (diff < 7200) { + return this.translateService.instant('time-from-now.hour'); + } else if (diff < 86400) { + return this.translateService.instant('time-from-now.hours', { time: Math.floor(diff / 3600) }); + } else if (diff < 172800) { + return this.translateService.instant('time-from-now.day'); + } + + return this.translateService.instant('time-from-now.days', { time: Math.floor(diff / 86400) }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.spec.ts new file mode 100644 index 00000000..f43d9e8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.spec.ts @@ -0,0 +1,8 @@ +import { DateTimePipe } from './date-time.pipe'; + +describe('DateTimePipe', () => { + it('create an instance', () => { + const pipe = new DateTimePipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.ts new file mode 100644 index 00000000..2c2b355a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.ts @@ -0,0 +1,11 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import * as moment from 'moment'; + +@Pipe({ + name: 'dateTime', +}) +export class DateTimePipe implements PipeTransform { + transform(value: any) { + return moment.unix(value).format('YYYY-MM-DD HH:mm'); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.spec.ts new file mode 100644 index 00000000..081e158c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.spec.ts @@ -0,0 +1,8 @@ +import { TellerStatusPipe } from './teller-status.pipe'; + +describe('TellerStatusPipe', () => { + it('create an instance', () => { + const pipe = new TellerStatusPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.ts new file mode 100644 index 00000000..27bcfdb8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'tellerStatus', +}) +export class TellerStatusPipe implements PipeTransform { + private statuses = ['done', 'waiting_confirm', 'waiting_deposit', 'waiting_send']; + + transform(value: any): any { + return this.statuses.find(status => status === value) + ? 'teller.' + value.replace('_', '-') + : 'teller.unknown'; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.spec.ts new file mode 100644 index 00000000..9d17c0fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { ApiService } from './api.service'; + +describe('ApiService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ApiService], + }); + }); + + it('should be created', inject([ApiService], (service: ApiService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.ts new file mode 100644 index 00000000..59928d9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.ts @@ -0,0 +1,221 @@ +import { Injectable } from '@angular/core'; +import { Http, RequestOptions, Headers } from '@angular/http'; +import { Observable } from 'rxjs/Observable'; +import { environment } from '../../environments/environment'; +import 'rxjs/add/observable/throw'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/map'; +import { TranslateService } from '@ngx-translate/core'; +import { BigNumber } from 'bignumber.js'; + +import { + Address, GetWalletsResponseEntry, GetWalletsResponseWallet, NormalTransaction, + PostWalletNewAddressResponse, Version, Wallet, +} from '../app.datatypes'; + +@Injectable() +export class ApiService { + private url = environment.nodeUrl; + + constructor( + private http: Http, + private translate: TranslateService, + ) { } + + getTransactions(addresses: Address[]): Observable { + const formattedAddresses = addresses.map(a => a.address).join(','); + + return this.post('transactions', {addrs: formattedAddresses, verbose: true}) + .map(transactions => transactions.map(transaction => ({ + addresses: [], + balance: new BigNumber(0), + block: transaction.status.block_seq, + confirmed: transaction.status.confirmed, + timestamp: transaction.txn.timestamp, + txid: transaction.txn.txid, + inputs: transaction.txn.inputs, + outputs: transaction.txn.outputs, + }))); + } + + getVersion(): Observable { + return this.get('version'); + } + + generateSeed(entropy: number = 128): Observable { + return this.get('wallet/newSeed', { entropy }).map(response => response.seed); + } + + getHealth() { + return this.get('health'); + } + + getWallets(): Observable { + return this.get('wallets') + .map((response: GetWalletsResponseWallet[]) => { + const wallets: Wallet[] = []; + response.forEach(wallet => { + const processedWallet: Wallet = { + label: wallet.meta.label, + filename: wallet.meta.filename, + coins: null, + hours: null, + addresses: [], + encrypted: wallet.meta.encrypted, + }; + + if (wallet.entries) { + processedWallet.addresses = wallet.entries.map((entry: GetWalletsResponseEntry) => { + return { + address: entry.address, + coins: null, + hours: null, + confirmed: true, + }; + }); + } + + wallets.push(processedWallet); + }); + + return wallets; + }); + } + + getWalletSeed(wallet: Wallet, password: string): Observable { + return this.post('wallet/seed', { id: wallet.filename, password }) + .map(response => response.seed); + } + + postWalletCreate(label: string, seed: string, scan: number, password: string, type: string): Observable { + const params = { label, seed, scan, type }; + + if (password) { + params['password'] = password; + params['encrypt'] = true; + } + + return this.post('wallet/create', params) + .map(response => ({ + label: response.meta.label, + filename: response.meta.filename, + coins: null, + hours: null, + addresses: response.entries.map(entry => ({ address: entry.address, coins: null, hours: null, confirmed: true })), + encrypted: response.meta.encrypted, + })); + } + + postWalletNewAddress(wallet: Wallet, num: number, password?: string): Observable { + const params = new Object(); + params['id'] = wallet.filename; + params['num'] = num; + if (password) { + params['password'] = password; + } + + return this.post('wallet/newAddress', params) + .map((response: PostWalletNewAddressResponse) => { + const result: Address[] = []; + response.addresses.forEach(value => { + result.push({ address: value, coins: null, hours: null }); + }); + + return result; + }); + } + + postWalletToggleEncryption(wallet: Wallet, password: string) { + return this.post('wallet/' + (wallet.encrypted ? 'decrypt' : 'encrypt'), { id: wallet.filename, password }); + } + + get(url, params = null, options: any = {}, useV2 = false) { + return this.http.get(this.getUrl(url, params, useV2), this.returnRequestOptions(options)) + .map((res: any) => res.json()) + .catch((error: any) => this.processConnectionError(error)); + } + + getCsrf() { + return this.get('csrf').map(response => response.csrf_token); + } + + post(url, params = {}, options: any = {}, useV2 = false) { + return this.getCsrf().first().flatMap(csrf => { + options.csrf = csrf; + + if (useV2) { + options.json = true; + } + + return this.http.post( + this.getUrl(url, null, useV2), + options.json || useV2 ? JSON.stringify(params) : this.getQueryString(params), + this.returnRequestOptions(options), + ) + .map((res: any) => res.json()) + .catch((error: any) => this.processConnectionError(error)); + }); + } + + returnRequestOptions(additionalOptions) { + const options = new RequestOptions(); + + options.headers = this.getHeaders(additionalOptions); + + if (additionalOptions.csrf) { + options.headers.append('X-CSRF-Token', additionalOptions.csrf); + } + + return options; + } + + private getHeaders(options) { + const headers = new Headers(); + headers.append('Content-Type', options.json ? 'application/json' : 'application/x-www-form-urlencoded'); + + return headers; + } + + private getQueryString(parameters = null) { + if (!parameters) { + return ''; + } + + return Object.keys(parameters).reduce((array, key) => { + array.push(key + '=' + encodeURIComponent(parameters[key])); + + return array; + }, []).join('&'); + } + + private getUrl(url, options = null, useV2 = false) { + if ((url as string).startsWith('/')) { + url = (url as string).substr(1, (url as string).length - 1); + } + + return this.url + (useV2 ? 'v2/' : 'v1/') + url + '?' + this.getQueryString(options); + } + + processConnectionError(error: any, connectingToHwWalletDaemon = false): Observable { + if (error) { + if (typeof error['_body'] === 'string') { + + return Observable.throw(error); + } + + if (error.error && typeof error.error === 'string') { + error['_body'] = error.error; + + return Observable.throw(error); + } else if (error.message) { + error['_body'] = error.message; + + return Observable.throw(error); + } + } + const err = Error(this.translate.instant(connectingToHwWalletDaemon ? 'hardware-wallet.errors.daemon-connection' : 'service.api.server-error')); + err['_body'] = err.message; + + return Observable.throw(err); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.spec.ts new file mode 100644 index 00000000..a7ce783a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { AppService } from './app.service'; +import { Http } from '@angular/http'; + +describe('AppService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [AppService, Http], + }); + }); + + it('should be created', inject([AppService], (service: AppService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.ts new file mode 100644 index 00000000..7eb5ca00 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.ts @@ -0,0 +1,76 @@ +import { Injectable } from '@angular/core'; +import { ApiService } from './api.service'; +import { Version } from '../app.datatypes'; +import BigNumber from 'bignumber.js'; +import { Http, Response } from '@angular/http'; +import { shouldUpgradeVersion } from '../utils/semver'; +import { AppConfig } from '../app.config'; + +@Injectable() +export class AppService { + error: number; + version: Version; + fullCoinName = ' '; + coinName = ' '; + hoursName = ' '; + hoursNameSingular = ' '; + explorerUrl = ' '; + + get burnRate() { + return this.burnRateInternal; + } + private burnRateInternal = new BigNumber(0.5); + + get updateAvailable(): boolean { + return this.updateAvailableInternal; + } + private updateAvailableInternal = false; + + get lastestVersion(): string { + return this.lastestVersionInternal; + } + private lastestVersionInternal = ''; + + constructor( + private apiService: ApiService, + private http: Http, + ) {} + + testBackend() { + this.apiService.get('health').subscribe(response => { + this.version = response.version; + this.detectUpdateAvailable(); + this.burnRateInternal = new BigNumber(response.user_verify_transaction.burn_factor); + + this.fullCoinName = response.fiber.display_name; + this.coinName = response.fiber.ticker; + this.hoursName = response.fiber.coin_hours_display_name; + this.hoursNameSingular = response.fiber.coin_hours_display_name_singular; + this.explorerUrl = response.fiber.explorer_url; + + if (this.explorerUrl.endsWith('/')) { + this.explorerUrl = this.explorerUrl.substr(0, this.explorerUrl.length - 1); + } + + if (!response.csrf_enabled) { + this.error = 3; + } + }, + () => this.error = 2, + ); + } + + private detectUpdateAvailable() { + if (AppConfig.urlForVersionChecking) { + this.http.get(AppConfig.urlForVersionChecking) + .retryWhen(errors => errors.delay(30000)) + .subscribe((response: Response) => { + this.lastestVersionInternal = response.text().trim(); + if (this.lastestVersionInternal.startsWith('v')) { + this.lastestVersionInternal = this.lastestVersionInternal.substr(1); + } + this.updateAvailableInternal = shouldUpgradeVersion(this.version.version, this.lastestVersionInternal); + }); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/bip39-word-list.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/bip39-word-list.service.ts new file mode 100644 index 00000000..f677861c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/bip39-word-list.service.ts @@ -0,0 +1,48 @@ +import { Subject } from 'rxjs/Subject'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/debounceTime'; + +export class Bip39WordListService { + + get searchResults(): Observable { + return this.searchResultsSubject.asObservable().debounceTime(100).map(searchTerm => { + if (searchTerm.length > 1) { + return this.wordList.filter(option => option.startsWith(searchTerm)); + } else { + return []; + } + }); + } + + private lastSearchTerm = ''; + private searchResultsSubject: Subject = new Subject(); + private wordList: string[] = []; + private wordMap: Map = new Map(); + + constructor() { + System.import(`../../assets/bip39-word-list.json`).then (result => { + this.wordList = result.list; + this.wordList.forEach(word => { + this.wordMap.set(word, true); + }); + this.searchResultsSubject.next(this.lastSearchTerm); + }); + } + + setSearchTerm(value: string) { + this.lastSearchTerm = value; + this.searchResultsSubject.next(value); + } + + validateWord(word: string): boolean | null { + if (this.wordList.length > 0) { + if (!this.wordMap.has(word)) { + return false; + } + + return true; + } else { + return null; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.spec.ts new file mode 100644 index 00000000..12065ef9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { BlockchainService } from './blockchain.service'; + +describe('BlockchainService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [BlockchainService], + }); + }); + + it('should be created', inject([BlockchainService], (service: BlockchainService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.ts new file mode 100644 index 00000000..c176b96e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.ts @@ -0,0 +1,83 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Observable } from 'rxjs/Observable'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { WalletService } from './wallet.service'; +import 'rxjs/add/observable/timer'; +import 'rxjs/add/operator/retryWhen'; +import 'rxjs/add/operator/concat'; +import 'rxjs/add/operator/exhaustMap'; + +@Injectable() +export class BlockchainService { + private progressSubject: BehaviorSubject = new BehaviorSubject(null); + private synchronizedSubject: BehaviorSubject = new BehaviorSubject(false); + private refreshedBalance = false; + private lastCurrentBlock = 0; + private lastHighestBlock = 0; + private maxDecimals = 6; + + get progress() { + return this.progressSubject.asObservable(); + } + + get currentMaxDecimals(): number { + return this.maxDecimals; + } + + get synchronized() { + return this.synchronizedSubject.asObservable(); + } + + constructor( + private apiService: ApiService, + private walletService: WalletService, + private ngZone: NgZone, + ) { + this.apiService.get('health').retryWhen(errors => errors.delay(1000).take(10).concat(Observable.throw(''))) + .subscribe ((response: any) => this.maxDecimals = response.user_verify_transaction.max_decimals); + + this.ngZone.runOutsideAngular(() => { + Observable.timer(0, 2000) + .exhaustMap(() => this.getBlockchainProgress()) + .retryWhen(errors => errors.delay(2000)) + .subscribe( + response => this.ngZone.run(() => { + if (!response.current || !response.highest || response.current < this.lastCurrentBlock || response.highest < this.lastHighestBlock) { + return; + } + + this.lastCurrentBlock = response.current; + this.lastHighestBlock = response.highest; + + this.progressSubject.next(response); + + if (!this.refreshedBalance) { + this.walletService.refreshBalances(); + this.refreshedBalance = true; + } + + if (response.current === response.highest && !this.synchronizedSubject.value) { + this.synchronizedSubject.next(true); + this.walletService.refreshBalances(); + } else if (response.current !== response.highest && this.synchronizedSubject.value) { + this.synchronizedSubject.next(false); + } + }), + error => console.log(error), + ); + }); + } + + lastBlock() { + return this.apiService.get('last_blocks', { num: 1 }).map(blocks => blocks.blocks[0]); + } + + getBlockchainProgress() { + return this.apiService.get('blockchain/progress'); + } + + coinSupply() { + return this.apiService.get('coinSupply'); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.spec.ts new file mode 100644 index 00000000..1ecf3b76 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { ExchangeService } from './exchange.service'; + +describe('SwaplabService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ExchangeService], + }); + }); + + it('should be created', inject([ExchangeService], (service: ExchangeService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.ts new file mode 100644 index 00000000..8a5cfa27 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.ts @@ -0,0 +1,151 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; +import { Observable } from 'rxjs/Observable'; +import { + ExchangeOrder, + StoredExchangeOrder, + TradingPair, +} from '../app.datatypes'; +import { StorageService, StorageType } from './storage.service'; +import * as moment from 'moment'; +import 'rxjs/add/operator/repeatWhen'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { ISubscription } from 'rxjs/Subscription'; +import { ApiService } from './api.service'; +import { environment } from '../../environments/environment'; + +@Injectable() +export class ExchangeService { + private readonly API_ENDPOINT = 'https://swaplab.cc/api/v3'; + private readonly STORAGE_KEY = 'exchange-orders'; + private readonly LAST_VIEWED_STORAGE_KEY = 'last-viewed-order'; + private readonly API_KEY = environment.swaplab.apiKey; + private readonly TEST_MODE = environment.swaplab.activateTestMode; + + lastViewedOrderLoaded: BehaviorSubject = new BehaviorSubject(false); + + private saveLastViewedSubscription: ISubscription; + private _lastViewedOrder: StoredExchangeOrder; + + set lastViewedOrder(order) { + this._lastViewedOrder = order; + + if (this.saveLastViewedSubscription) { + this.saveLastViewedSubscription.unsubscribe(); + } + this.saveLastViewedSubscription = this.storageService.store(StorageType.CLIENT, this.LAST_VIEWED_STORAGE_KEY, JSON.stringify(order)).subscribe(); + } + + get lastViewedOrder() { + return this._lastViewedOrder; + } + + constructor( + private http: HttpClient, + private storageService: StorageService, + private apiService: ApiService, + ) { + storageService.get(StorageType.CLIENT, this.LAST_VIEWED_STORAGE_KEY).subscribe(result => { + this.lastViewedOrder = JSON.parse(result.data); + this.lastViewedOrderLoaded.next(true); + }, () => { + this.lastViewedOrderLoaded.next(true); + }); + } + + tradingPairs(): Observable { + return this.post('trading_pairs').map(data => data.result); + } + + exchange(pair: string, fromAmount: number, toAddress: string, price: number): Observable { + let response: ExchangeOrder; + + return this.post('orders', { pair, fromAmount, toAddress }) + .flatMap(data => { + response = data.result; + + return this.storeOrder(response, price); + }).map(() => response); + } + + status(id: string, devForceState?: string): Observable { + if (this.TEST_MODE && !devForceState) { + devForceState = 'user_waiting'; + } + + return this.post('orders/status', { id }, this.TEST_MODE ? { status: devForceState } : null) + .retryWhen((err) => { + return err.flatMap(response => { + if (response instanceof HttpErrorResponse && response.status === 404) { + return Observable.throw(response); + } + + return Observable.of(response); + }).delay(3000); + }).map(data => data.result); + } + + history() { + return this.storageService.get(StorageType.CLIENT, this.STORAGE_KEY) + .map((res) => JSON.parse(res.data)); + } + + isOrderFinished(order: ExchangeOrder) { + return ['complete', 'error', 'user_deposit_timeout'].indexOf(order.status) > -1; + } + + private post(url: string, body?: any, headers?: any): Observable { + return this.http.post(this.buildUrl(url), body, { + responseType: 'json', + headers: new HttpHeaders({ + 'api-key': this.API_KEY, + 'Accept': 'application/json', + ...headers, + }), + }).catch((error: any) => this.apiService.processConnectionError(error)); + } + + private buildUrl(url: string) { + if (!this.TEST_MODE || url === 'trading_pairs') { + return `${this.API_ENDPOINT}/${url}`; + } + + return `${this.API_ENDPOINT}sandbox/${url}`; + } + + private storeOrder(order: ExchangeOrder, price: number) { + return this.history() + .catch(err => { + try { + if (err['_body']) { + const errorBody = JSON.parse(err['_body']); + if (errorBody && errorBody.error && errorBody.error.code === 404) { + return Observable.of([]); + } + } + } catch (e) {} + + return Observable.throw(err); + }) + .flatMap((oldOrders: StoredExchangeOrder[]) => this.storeOrderEntry(oldOrders, order, price)); + } + + private storeOrderEntry(orders: StoredExchangeOrder[], order: ExchangeOrder, price: number): Observable { + const newOrder = { + id: order.id, + pair: order.pair, + fromAmount: order.fromAmount, + toAmount: order.toAmount, + address: order.toAddress, + timestamp: moment().unix(), + price: price, + }; + + orders.push(newOrder); + const data = JSON.stringify(orders); + orders.pop(); + + return this.storageService.store(StorageType.CLIENT, this.STORAGE_KEY, data) + .do(() => orders.push(newOrder)); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon-tests.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon-tests.service.ts new file mode 100644 index 00000000..e5c320b3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon-tests.service.ts @@ -0,0 +1,254 @@ +// This is a version of HwWalletDaemonService that uses a queue to ensure that +// only one operation is carried out at a time. It may be good for testing in +// some circunstances as it allow to see the exact request order without having +// to worry about racing conditions, but to use it in production it needs more +// testing, to be sure that to be sure that the queue is not going to get stuck +// because of some error. This testing has to be done after solving the problems +// that make the firmware respond extremely slow after some calls. + +/* +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Http, RequestOptions, Headers } from '@angular/http'; +import { Observable } from 'rxjs/Observable'; +import { HwWalletPinService } from './hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './hw-wallet-seed-word.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import 'rxjs/add/operator/timeout'; +import { Subject } from 'rxjs/Subject'; + +@Injectable() +export class HwWalletDaemonService { + + public static readonly errorCancelled = 'Cancelled'; + public static readonly errorConnectingWithTheDaemon = 'Error connecting with the hw wallet service'; + public static readonly errorTimeout = 'The operation was canceled due to inactivity'; + private readonly url = 'http://127.0.0.1:9510/api/v1'; + + private checkHwSubscription: ISubscription; + private hwConnected = false; + private connectionEventSubject = new BehaviorSubject(false); + private waiting = false; + private busy = false; + private queueDelay = 32; + private requestQueue: { + operation: Observable + subject: Subject; + }[] = []; + + get connectionEvent() { + return this.connectionEventSubject.asObservable(); + } + + constructor( + private http: Http, + private apiService: ApiService, + private hwWalletPinService: HwWalletPinService, + private hwWalletSeedWordService: HwWalletSeedWordService, + private ngZone: NgZone, + ) { } + + get(route: string) { + const trigger = new Subject(); + this.requestQueue.push({ + subject: trigger, + operation: trigger.flatMap(() => this.checkResponse(this.http.get( + this.url + route, + this.returnRequestOptions(), + ), route.includes('/available'))), + }); + + setTimeout(() => this.tryToRunNextRequest(), this.queueDelay); + + return this.requestQueue[this.requestQueue.length - 1].operation; + } + + post(route: string, params = {}) { + const trigger = new Subject(); + this.requestQueue.push({ + subject: trigger, + operation: trigger.flatMap(() => this.checkResponse(this.http.post( + this.url + route, + JSON.stringify(params), + this.returnRequestOptions(), + ))), + }); + + setTimeout(() => this.tryToRunNextRequest(), this.queueDelay); + + return this.requestQueue[this.requestQueue.length - 1].operation; + } + + put(route: string, params: any = null, sendMultipartFormData = false, smallTimeout = false) { + const trigger = new Subject(); + this.requestQueue.push({ + subject: trigger, + operation: trigger.flatMap(() => this.checkResponse(this.http.put( + this.url + route, + params, + this.returnRequestOptions(sendMultipartFormData), + ), false, smallTimeout)), + }); + + setTimeout(() => this.tryToRunNextRequest(), this.queueDelay); + + return this.requestQueue[this.requestQueue.length - 1].operation; + } + + delete(route: string) { + const trigger = new Subject(); + this.requestQueue.push({ + subject: trigger, + operation: trigger.flatMap(() => this.checkResponse(this.http.delete( + this.url + route, + this.returnRequestOptions(), + ))), + }); + + setTimeout(() => this.tryToRunNextRequest(), this.queueDelay); + + return this.requestQueue[this.requestQueue.length - 1].operation; + } + + private tryToRunNextRequest() { + if (!this.busy) { + if (this.requestQueue.length > 0) { + this.runNextRequest(); + } + } + } + + private runNextRequest() { + this.prepareToStart(); + this.requestQueue[0].subject.next(1); + this.requestQueue[0].subject.complete(); + } + + private prepareToStart() { + if (this.busy) { + throw new Error('The service is busy.'); + } + this.busy = true; + } + + private checkResponse(response: Observable, checkingConnected = false, smallTimeout = false) { + return response + .timeout(smallTimeout ? 30000 : 50000) + .flatMap((res: any) => { + if (!this.waiting) { + this.waiting = true; + setTimeout(() => { + this.waiting = false; + this.busy = false; + this.requestQueue.shift(); + this.tryToRunNextRequest(); + }, this.queueDelay); + } + + const finalResponse = res.json(); + + if (checkingConnected) { + this.ngZone.run(() => this.updateHwConnected(!!finalResponse.data)); + } else { + this.updateHwConnected(true); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('PinMatrixRequest') !== -1) { + return this.hwWalletPinService.requestPin().flatMap(pin => { + if (!pin) { + return this.put('/cancel').map(() => HwWalletDaemonService.errorCancelled); + } + + return this.post('/intermediate/pin_matrix', {pin: pin}); + }); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('WordRequest') !== -1) { + return this.hwWalletSeedWordService.requestWord().flatMap(word => { + if (!word) { + return this.put('/cancel').map(() => HwWalletDaemonService.errorCancelled); + } + + return this.post('/intermediate/word', {word: word}); + }); + } + + return Observable.of(finalResponse); + }) + .catch((error: any) => { + if (!this.waiting) { + this.waiting = true; + setTimeout(() => { + this.waiting = false; + this.busy = false; + this.requestQueue.shift(); + this.tryToRunNextRequest(); + }, this.queueDelay); + } + + if (error && error.name && error.name === 'TimeoutError') { + this.put('/cancel').subscribe(); + + return Observable.throw({_body: HwWalletDaemonService.errorTimeout }); + } + + if (error && error._body) { + let errorContent: string; + + if (error._body.error) { + errorContent = error._body.error; + } else { + try { + errorContent = JSON.parse(error._body).error; + } catch (e) {} + } + + if (errorContent) { + return this.apiService.processConnectionError(error, true); + } + } + + return Observable.throw({_body: HwWalletDaemonService.errorConnectingWithTheDaemon }); + }); + } + + private returnRequestOptions(sendMultipartFormData = false) { + const options = new RequestOptions(); + options.headers = new Headers(); + if (!sendMultipartFormData) { + options.headers.append('Content-Type', 'application/json'); + } + + return options; + } + + checkHw(wait: boolean) { + if (this.checkHwSubscription) { + this.checkHwSubscription.unsubscribe(); + } + + this.ngZone.runOutsideAngular(() => { + this.checkHwSubscription = Observable.of(1) + .delay(wait ? (this.hwConnected ? 2000 : 10000) : 0) + .flatMap(() => this.get('/available')) + .subscribe( + null, + () => this.ngZone.run(() => this.updateHwConnected(false)), + ); + }); + } + + private updateHwConnected(connected: boolean) { + if (connected && !this.hwConnected) { + this.hwConnected = true; + this.connectionEventSubject.next(this.hwConnected); + } else if (!connected && this.hwConnected) { + this.hwConnected = false; + this.connectionEventSubject.next(this.hwConnected); + } + this.checkHw(true); + } + +} +*/ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.spec.ts new file mode 100644 index 00000000..899e9f48 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { HwWalletDaemonService } from './hw-wallet-daemon.service'; + +describe('HwWalletDaemonService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [HwWalletDaemonService], + }); + }); + + it('should be created', inject([HwWalletDaemonService], (service: HwWalletDaemonService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.ts new file mode 100644 index 00000000..bd29b324 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.ts @@ -0,0 +1,186 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Http, RequestOptions, Headers } from '@angular/http'; +import { Observable } from 'rxjs/Observable'; +import { HwWalletPinService } from './hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './hw-wallet-seed-word.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import 'rxjs/add/operator/timeout'; + +@Injectable() +export class HwWalletDaemonService { + + public static readonly errorCancelled = 'Cancelled'; + public static readonly errorConnectingWithTheDaemon = 'Error connecting with the hw wallet service'; + public static readonly errorTimeout = 'The operation was canceled due to inactivity'; + private readonly url = 'http://127.0.0.1:9510/api/v1'; + + private checkHwSubscription: ISubscription; + private hwConnected = false; + private connectionEventSubject = new BehaviorSubject(false); + private disconnectedChecks = 0; + + private readonly maxFastDisconnectedChecks = 32; + + get connectionEvent() { + return this.connectionEventSubject.asObservable(); + } + + constructor( + private http: Http, + private apiService: ApiService, + private hwWalletPinService: HwWalletPinService, + private hwWalletSeedWordService: HwWalletSeedWordService, + private ngZone: NgZone, + ) { } + + get(route: string) { + return this.checkResponse(this.http.get( + this.url + route, + this.returnRequestOptions(), + ), route.includes('/available')); + } + + post(route: string, params = {}) { + return this.checkResponse(this.http.post( + this.url + route, + JSON.stringify(params), + this.returnRequestOptions(), + )); + } + + put(route: string, params: any = null, sendMultipartFormData = false, smallTimeout = false) { + return this.checkResponse(this.http.put( + this.url + route, + params, + this.returnRequestOptions(sendMultipartFormData), + ), false, smallTimeout); + } + + delete(route: string) { + return this.checkResponse(this.http.delete( + this.url + route, + this.returnRequestOptions(), + )); + } + + private checkResponse(response: Observable, checkingConnected = false, smallTimeout = false) { + return response + .timeout(smallTimeout ? 30000 : 55000) + .flatMap((res: any) => { + const finalResponse = res.json(); + + if (finalResponse.data && finalResponse.data.length) { + if (finalResponse.data.length === 1) { + finalResponse.data = finalResponse.data[0]; + } else { + finalResponse.data = finalResponse.data; + } + } + + if (checkingConnected) { + this.ngZone.run(() => this.updateHwConnected(!!finalResponse.data)); + } else { + this.updateHwConnected(true); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('PinMatrixRequest') !== -1) { + return this.hwWalletPinService.requestPin().flatMap(pin => { + if (!pin) { + return this.put('/cancel').map(() => HwWalletDaemonService.errorCancelled); + } + + return this.post('/intermediate/pin_matrix', {pin: pin}); + }); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('WordRequest') !== -1) { + return this.hwWalletSeedWordService.requestWord().flatMap(word => { + if (!word) { + return this.put('/cancel').map(() => HwWalletDaemonService.errorCancelled); + } + + return this.post('/intermediate/word', {word: word}); + }); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('ButtonRequest') !== -1) { + return this.post('/intermediate/button'); + } + + return Observable.of(finalResponse); + }) + .catch((error: any) => { + if (error && error.name && error.name === 'TimeoutError') { + this.put('/cancel').subscribe(); + + return Observable.throw({_body: HwWalletDaemonService.errorTimeout }); + } + + if (error && error._body) { + let errorContent: string; + + if (typeof error._body === 'string') { + errorContent = error._body; + } else if (error._body.error) { + errorContent = error._body.error; + } else { + try { + errorContent = JSON.parse(error._body).error; + } catch (e) {} + } + + if (errorContent) { + return this.apiService.processConnectionError({_body: errorContent}, true); + } + } + + return Observable.throw({_body: HwWalletDaemonService.errorConnectingWithTheDaemon }); + }); + } + + private returnRequestOptions(sendMultipartFormData = false) { + const options = new RequestOptions(); + options.headers = new Headers(); + if (!sendMultipartFormData) { + options.headers.append('Content-Type', 'application/json'); + } + + return options; + } + + checkHw(wait: boolean) { + if (this.checkHwSubscription) { + this.checkHwSubscription.unsubscribe(); + } + + this.ngZone.runOutsideAngular(() => { + this.checkHwSubscription = Observable.of(1) + .delay(wait ? (this.hwConnected || this.disconnectedChecks < this.maxFastDisconnectedChecks ? 2000 : 10000) : 0) + .flatMap(() => this.get('/available')) + .subscribe( + null, + () => this.ngZone.run(() => this.updateHwConnected(false)), + ); + }); + } + + private updateHwConnected(connected: boolean) { + if (connected) { + this.disconnectedChecks = 0; + } else { + this.disconnectedChecks += 1; + } + + if (connected && !this.hwConnected) { + this.hwConnected = true; + this.connectionEventSubject.next(this.hwConnected); + } else if (!connected && this.hwConnected) { + this.hwConnected = false; + this.connectionEventSubject.next(this.hwConnected); + } + this.checkHw(true); + } + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.spec.ts new file mode 100644 index 00000000..fe16df94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { HwWalletPinService } from './hw-wallet-pin.service'; + +describe('HwWalletPinService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [HwWalletPinService], + }); + }); + + it('should be created', inject([HwWalletPinService], (service: HwWalletPinService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.ts new file mode 100644 index 00000000..03417c42 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.ts @@ -0,0 +1,56 @@ +import { Injectable } from '@angular/core'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { HwPinDialogParams } from '../components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component'; +import { Observable } from 'rxjs/Observable'; + +export enum ChangePinStates { + RequestingCurrentPin, + RequestingNewPin, + ConfirmingNewPin, +} + +@Injectable() +export class HwWalletPinService { + + // Set on AppComponent to avoid a circular reference. + private requestPinComponentInternal; + set requestPinComponent(value) { + this.requestPinComponentInternal = value; + } + + // Values to be sent to HwPinDialogComponent + changingPin: boolean; + signingTx: boolean; + changePinState: ChangePinStates; + + constructor( + private dialog: MatDialog, + ) {} + + resetValues() { + this.changingPin = false; + this.signingTx = false; + } + + requestPin(): Observable { + return this.dialog.open(this.requestPinComponentInternal, { + width: '350px', + autoFocus: false, + data : { + changingPin: this.changingPin, + changePinState: this.changePinState, + signingTx: this.signingTx, + }, + }).afterClosed().map(pin => { + if (this.changingPin) { + if (this.changePinState === ChangePinStates.RequestingCurrentPin) { + this.changePinState = ChangePinStates.RequestingNewPin; + } else if (this.changePinState === ChangePinStates.RequestingNewPin) { + this.changePinState = ChangePinStates.ConfirmingNewPin; + } + } + + return pin; + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-seed-word.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-seed-word.service.ts new file mode 100644 index 00000000..2ccb5d9f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-seed-word.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { Observable } from 'rxjs/Observable'; + +@Injectable() +export class HwWalletSeedWordService { + + // Set on AppComponent to avoid a circular reference. + private requestWordComponentInternal; + set requestWordComponent(value) { + this.requestWordComponentInternal = value; + } + + constructor( + private dialog: MatDialog, + ) {} + + requestWord(): Observable { + return this.dialog.open(this.requestWordComponentInternal, { + width: '350px', + data: { + isForHwWallet: true, + wordNumber: 0, + restoringSoftwareWallet: false, + }, + }).afterClosed().map(word => { + return word; + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.spec.ts new file mode 100644 index 00000000..ebf58f6c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { HwWalletService } from './hw-wallet.service'; + +describe('HwWalletService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [HwWalletService], + }); + }); + + it('should be created', inject([HwWalletService], (service: HwWalletService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.ts new file mode 100644 index 00000000..755b2f1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.ts @@ -0,0 +1,768 @@ +// NOTE: some code for using the hw wallet js library was left here only for precaution and should be deleted soon. + +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import { Subscriber } from 'rxjs/Subscriber'; +import { Subject } from 'rxjs/Subject'; +import { TranslateService } from '@ngx-translate/core'; +import { AppConfig } from '../app.config'; +import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material'; +import { HwWalletDaemonService } from './hw-wallet-daemon.service'; +import { HwWalletPinService, ChangePinStates } from './hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './hw-wallet-seed-word.service'; +import BigNumber from 'bignumber.js'; +import { StorageService, StorageType } from './storage.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { Http, ResponseContentType } from '@angular/http'; +import { ApiService } from './api.service'; + +export enum OperationResults { + Success, + FailedOrRefused, + PinMismatch, + WithoutSeed, + WrongPin, + IncorrectHardwareWallet, + WrongWord, + InvalidSeed, + WrongSeed, + UndefinedError, + Disconnected, + DaemonError, + InvalidAddress, + Timeout, + NotInBootloaderMode, +} + +export class TxData { + address: string; + coins: BigNumber; + hours: BigNumber; +} + +export class OperationResult { + result: OperationResults; + rawResponse: any; +} + +export interface Input { + hashIn: string; + index: number; +} + +export interface Output { + address: string; + coin: number; + hour: number; + address_index?: number; +} + +interface EventData { + event: string; + successTexts?: string[]; +} + +@Injectable() +export class HwWalletService { + + public static readonly maxLabelLength = 32; + + private readonly storageKey = 'hw-wallets'; + + showOptionsWhenPossible = false; + + private requestSequence = 0; + + private eventsObservers = new Map>(); + private walletConnectedSubject: Subject = new Subject(); + + private savingDataSubscription: ISubscription; + + private signTransactionDialog: MatDialogRef<{}, any>; + + // Set on AppComponent to avoid a circular reference. + private signTransactionConfirmationComponentInternal; + set signTransactionConfirmationComponent(value) { + this.signTransactionConfirmationComponentInternal = value; + } + + constructor( + private translate: TranslateService, + private dialog: MatDialog, + private hwWalletDaemonService: HwWalletDaemonService, + private hwWalletPinService: HwWalletPinService, + private hwWalletSeedWordService: HwWalletSeedWordService, + private storageService: StorageService, + private apiService: ApiService, + private http: Http) { + + if (this.hwWalletCompatibilityActivated) { + if (!AppConfig.useHwWalletDaemon) { + window['ipcRenderer'].on('hwConnectionEvent', (event, connected) => { + if (!connected) { + this.eventsObservers.forEach((value, key) => { + this.dispatchError(key, OperationResults.Disconnected, this.translate.instant('hardware-wallet.general.error-disconnected')); + }); + } + this.walletConnectedSubject.next(connected); + }); + } else { + hwWalletDaemonService.connectionEvent.subscribe(connected => { + this.walletConnectedSubject.next(connected); + }); + } + + if (!AppConfig.useHwWalletDaemon) { + window['ipcRenderer'].on('hwPinRequested', (event) => { + this.hwWalletPinService.requestPin().subscribe(pin => { + if (!pin) { + this.cancelAllOperations(); + window['ipcRenderer'].send('hwCancelPin'); + } else { + window['ipcRenderer'].send('hwSendPin', pin); + } + }); + }); + window['ipcRenderer'].on('hwSeedWordRequested', (event) => { + this.hwWalletSeedWordService.requestWord().subscribe(word => { + if (!word) { + this.cancelAllOperations(); + window['ipcRenderer'].send('hwCancelLastAction'); + } + window['ipcRenderer'].send('hwSendSeedWord', word); + }); + }); + + window['ipcRenderer'].on('hwSignTransactionResponse', (event, requestId, result) => { + this.closeTransactionDialog(); + this.dispatchEvent(requestId, result, true); + }); + + const data: EventData[] = [ + { event: 'hwChangePinResponse', successTexts: ['PIN changed'] }, + { event: 'hwGenerateMnemonicResponse', successTexts: ['operation completed'] }, + { event: 'hwRecoverMnemonicResponse', successTexts: ['Device recovered', 'The seed is valid and matches the one in the device'] }, + { event: 'hwBackupDeviceResponse', successTexts: ['operation completed'] }, + { event: 'hwWipeResponse', successTexts: ['operation completed'] }, + { event: 'hwChangeLabelResponse', successTexts: ['Settings applied'] }, + { event: 'hwCancelLastActionResponse' }, + { event: 'hwGetAddressesResponse' }, + { event: 'hwGetFeaturesResponse' }, + { event: 'hwSignMessageResponse' }, + ]; + + data.forEach(item => { + window['ipcRenderer'].on(item.event, (event, requestId, result) => { + const success = item.successTexts + ? typeof result === 'string' && item.successTexts.some(text => (result as string).includes(text)) + : true; + + this.dispatchEvent(requestId, result, success); + }); + }); + } + } + } + + get hwWalletCompatibilityActivated(): boolean { + if (!AppConfig.useHwWalletDaemon) { + return window['isElectron'] && window['ipcRenderer'].sendSync('hwCompatibilityActivated'); + } else { + return true; + } + } + + get walletConnectedAsyncEvent(): Observable { + return this.walletConnectedSubject.asObservable(); + } + + getDeviceConnected(): Observable { + if (!AppConfig.useHwWalletDaemon) { + return Observable.of(window['ipcRenderer'].sendSync('hwGetDeviceConnectedSync')); + } else { + return this.hwWalletDaemonService.get('/available').map(response => { + return response.data; + }); + } + } + + getSavedWalletsData(): Observable { + return this.storageService.get(StorageType.CLIENT, this.storageKey) + .map(result => result.data) + .catch(err => { + try { + if (err['_body']) { + const errorBody = JSON.parse(err['_body']); + if (errorBody && errorBody.error && errorBody.error.code === 404) { + return Observable.of(null); + } + } + } catch (e) {} + + return Observable.throw(err); + }); + } + + saveWalletsData(walletsData: string) { + if (this.savingDataSubscription) { + this.savingDataSubscription.unsubscribe(); + } + + this.savingDataSubscription = this.storageService.store(StorageType.CLIENT, this.storageKey, walletsData).subscribe(); + } + + cancelLastAction(): Observable { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwCancelLastAction', requestId); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.put('/cancel', null, false, true), + ); + } + } + + getAddresses(addressN: number, startIndex: number): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwGetAddresses', requestId, addressN, startIndex, false); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = { + address_n: addressN, + start_index: startIndex, + confirm_address: false, + }; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/generate_addresses', + params, + ), null, true, + ); + } + }).flatMap(response => { + return this.verifyAddresses(response.rawResponse, 0) + .catch(() => Observable.throw({ _body: this.translate.instant('hardware-wallet.errors.invalid-address-generated') })) + .map(() => response); + }); + } + + private verifyAddresses(addresses: string[], currentIndex: number): Observable { + const params = { + address: addresses[currentIndex], + }; + + return this.apiService.post('address/verify', params, {}, true).flatMap(() => { + if (currentIndex !== addresses.length - 1) { + return this.verifyAddresses(addresses, currentIndex + 1); + } else { + return Observable.of(0); + } + }); + } + + confirmAddress(index: number): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwGetAddresses', requestId, 1, index, true); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = { + address_n: 1, + start_index: index, + confirm_address: true, + }; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/generate_addresses', + params, + ), null, true, + ); + } + }); + } + + getFeatures(cancelPreviousOperation = true): Observable { + + let cancel: Observable; + if (cancelPreviousOperation) { + cancel = this.cancelLastAction(); + } else { + cancel = Observable.of(0); + } + + return cancel.flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwGetFeatures', requestId); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.get('/features'), + ); + } + }); + } + + updateFirmware(downloadCompleteCallback: () => any): Observable { + if (!AppConfig.useHwWalletDaemon) { + // Unimplemented. + return null; + } else { + this.prepare(); + + return this.getFeatures(false).flatMap(result => { + if (!result.rawResponse.bootloader_mode) { + const response: OperationResult = { + result: OperationResults.NotInBootloaderMode, + rawResponse: null, + }; + + return Observable.throw(response); + } + + return this.http.get(AppConfig.urlForHwWalletVersionChecking) + .catch(() => Observable.throw({ _body: this.translate.instant('hardware-wallet.update-firmware.connection-error') })) + .map((res: any) => res.text()) + .flatMap((res: any) => { + let lastestFirmwareVersion: string = res.trim(); + if (lastestFirmwareVersion.toLowerCase().startsWith('v')) { + lastestFirmwareVersion = lastestFirmwareVersion.substr(1, lastestFirmwareVersion.length - 1); + } + + return this.http.get(AppConfig.hwWalletDownloadUrlAndPrefix + lastestFirmwareVersion + '.bin', { responseType: ResponseContentType.Blob }) + .map(firmwareResponse => firmwareResponse.blob()) + .catch(() => Observable.throw({ _body: this.translate.instant('hardware-wallet.update-firmware.connection-error') })) + .flatMap(firmware => { + downloadCompleteCallback(); + const data = new FormData(); + data.set('file', (firmware as Blob)); + + return this.processDaemonResponse( + this.hwWalletDaemonService.put('/firmware_update', data, true), + ); + }); + }); + }); + } + } + + changePin(changingCurrentPin: boolean): Observable { + return this.cancelLastAction().flatMap(() => { + let requestId = 0; + if (!AppConfig.useHwWalletDaemon) { + requestId = this.createRandomIdAndPrepare(); + } else { + this.prepare(); + } + + this.hwWalletPinService.changingPin = true; + if (changingCurrentPin) { + this.hwWalletPinService.changePinState = ChangePinStates.RequestingCurrentPin; + } else { + this.hwWalletPinService.changePinState = ChangePinStates.RequestingNewPin; + } + + if (!AppConfig.useHwWalletDaemon) { + window['ipcRenderer'].send('hwChangePin', requestId); + + return this.createRequestResponse(requestId); + } else { + return this.processDaemonResponse( + this.hwWalletDaemonService.post('/configure_pin_code'), + ['PIN changed'], + ); + } + }); + } + + removePin(): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + // Unimplemented. + return null; + } else { + this.prepare(); + + const params = {}; + params['remove_pin'] = true; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/configure_pin_code', + params, + ), + ['PIN removed'], + ); + } + }); + } + + generateMnemonic(wordCount: number): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwGenerateMnemonic', requestId, wordCount); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = {}; + params['word_count'] = wordCount; + params['use_passphrase'] = false; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/generate_mnemonic', + params, + ), + ['Mnemonic successfully configured'], + ); + } + }); + } + + recoverMnemonic(wordCount: number, dryRun: boolean): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwRecoverMnemonic', requestId, wordCount, dryRun); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = {}; + params['word_count'] = wordCount; + params['use_passphrase'] = false; + params['dry_run'] = dryRun; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/recovery', + params, + ), + ['Device recovered', 'The seed is valid and matches the one in the device'], + ); + } + }); + } + + backup(): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwBackupDevice', requestId); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/backup', + ), + ['Device backed up!'], + ); + } + }); + } + + wipe(): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwWipe', requestId); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.delete('/wipe'), + ['Device wiped'], + ); + } + }); + } + + changeLabel(label: string): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwChangeLabel', requestId, label); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.post('/apply_settings', {label: label}), + ['Settings applied'], + ); + } + }); + } + + signTransaction(inputs: Input[], outputs: Output[]): Observable { + const previewData: TxData[] = []; + outputs.forEach(output => { + if (output.address_index === undefined || output.address_index === null) { + const currentOutput = new TxData(); + currentOutput.address = output.address; + currentOutput.coins = new BigNumber(output.coin).dividedBy(1000000); + currentOutput.hours = new BigNumber(output.hour); + + previewData.push(currentOutput); + } + }); + + this.signTransactionDialog = this.dialog.open(this.signTransactionConfirmationComponentInternal, { + width: '560px', + data: previewData, + }); + + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + this.hwWalletPinService.signingTx = true; + window['ipcRenderer'].send('hwSignTransaction', requestId, inputs, outputs); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = { + transaction_inputs: (inputs as any[]).map(val => { + return { + index: val.index, + hash: val.hashIn, + }; + }), + transaction_outputs : (outputs as any[]).map(val => { + return { + address_index: val.address_index, + address: val.address, + coins: new BigNumber(val.coin).dividedBy(1000000).toFixed(6), + hours: val.hour.toString(), + }; + }), + }; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/transaction_sign', + params, + ), null, true, + ).map(response => { + this.closeTransactionDialog(); + + return response; + }).catch(error => { + this.closeTransactionDialog(); + + return Observable.throw(error); + }); + } + }); + } + + checkIfCorrectHwConnected(firstAddress: string): Observable { + return this.getAddresses(1, 0).flatMap( + response => { + if (response.rawResponse[0] !== firstAddress) { + return Observable.throw({ + result: OperationResults.IncorrectHardwareWallet, + rawResponse: '', + }); + } + + return Observable.of(true); + }, + ).catch(error => { + if (error.result && error.result === OperationResults.WithoutSeed) { + return Observable.throw({ + result: OperationResults.IncorrectHardwareWallet, + rawResponse: '', + }); + } + + return Observable.throw(error); + }); + } + + private closeTransactionDialog() { + if (this.signTransactionDialog) { + this.signTransactionDialog.close(); + this.signTransactionDialog = null; + } + } + + private processDaemonResponse(daemonResponse: Observable, successTexts: string[] = null, responseShouldBeArray = false) { + return daemonResponse.catch((error: any) => { + return Observable.throw(this.dispatchEvent(0, error['_body'], false, true)); + }).flatMap(result => { + if (result !== HwWalletDaemonService.errorCancelled) { + if (responseShouldBeArray && result.data && typeof result.data === 'string') { + result.data = [result.data]; + } + + const response = this.dispatchEvent(0, + result.data ? result.data : null, + !successTexts ? true : typeof result.data === 'string' && successTexts.some(text => (result.data as string).includes(text)), + true); + + if (response.result === OperationResults.Success) { + return Observable.of(response); + } else { + return Observable.throw(response); + } + } else { + return Observable.throw(this.dispatchEvent(0, 'canceled by user', false, true)); + } + }); + } + + private createRequestResponse(requestId: number): Observable { + return new Observable(observer => { + this.eventsObservers.set(requestId, observer); + }); + } + + private createRandomIdAndPrepare(): number { + this.prepare(); + + return this.requestSequence++; + } + + private prepare() { + this.hwWalletPinService.changingPin = false; + this.hwWalletPinService.signingTx = false; + } + + private dispatchEvent(requestId: number, rawResponse: any, success: boolean, justReturnTheEvent = false) { + if (this.eventsObservers.has(requestId) || justReturnTheEvent) { + if ((!rawResponse || !rawResponse.error) && success) { + const response: OperationResult = { + result: OperationResults.Success, + rawResponse: rawResponse, + }; + + if (justReturnTheEvent) { + return response; + } else { + this.eventsObservers.get(requestId).next(response); + } + } else { + let responseContent: string = rawResponse.error ? rawResponse.error : rawResponse; + if (typeof responseContent !== 'string') { + responseContent = ''; + } + let result: OperationResults; + + if (responseContent.includes('failed or refused')) { + result = OperationResults.FailedOrRefused; + } else if (responseContent.includes('PIN invalid')) { + result = OperationResults.WrongPin; + } else if (responseContent.includes('canceled by user')) { + result = OperationResults.FailedOrRefused; + } else if (responseContent.includes('cancelled by user')) { + result = OperationResults.FailedOrRefused; + } else if (responseContent.includes('Expected WordAck after Button')) { + result = OperationResults.FailedOrRefused; + } else if (responseContent.includes('Wrong word retyped')) { + result = OperationResults.WrongWord; + } else if (responseContent.includes('PIN mismatch')) { + result = OperationResults.PinMismatch; + } else if (responseContent.includes('Mnemonic not set')) { + result = OperationResults.WithoutSeed; + } else if (responseContent.includes('Mnemonic required')) { + result = OperationResults.WithoutSeed; + } else if (responseContent.includes('Invalid seed, are words in correct order?')) { + result = OperationResults.InvalidSeed; + } else if (responseContent.includes('The seed is valid but does not match the one in the device')) { + result = OperationResults.WrongSeed; + } else if (responseContent.includes('Invalid base58 character')) { + result = OperationResults.InvalidAddress; + } else if (responseContent.includes('Invalid address length')) { + result = OperationResults.InvalidAddress; + } else if (responseContent.toLocaleLowerCase().includes('LIBUSB'.toLocaleLowerCase())) { + result = OperationResults.DaemonError; + } else if (responseContent.toLocaleLowerCase().includes('hidapi'.toLocaleLowerCase())) { + result = OperationResults.Disconnected; + if (AppConfig.useHwWalletDaemon) { + setTimeout(() => this.hwWalletDaemonService.checkHw(false)); + } + } else if (responseContent.toLocaleLowerCase().includes('device disconnected'.toLocaleLowerCase())) { + result = OperationResults.Disconnected; + if (AppConfig.useHwWalletDaemon) { + setTimeout(() => this.hwWalletDaemonService.checkHw(false)); + } + } else if (responseContent.toLocaleLowerCase().includes('no device connected'.toLocaleLowerCase())) { + result = OperationResults.Disconnected; + if (AppConfig.useHwWalletDaemon) { + setTimeout(() => this.hwWalletDaemonService.checkHw(false)); + } + } else if (responseContent.includes(HwWalletDaemonService.errorConnectingWithTheDaemon)) { + result = OperationResults.DaemonError; + } else if (responseContent.includes(HwWalletDaemonService.errorTimeout)) { + result = OperationResults.Timeout; + } else if (responseContent.includes('MessageType_Success')) { + result = OperationResults.Success; + } else { + result = OperationResults.UndefinedError; + } + + const response: OperationResult = { + result: result, + rawResponse: responseContent, + }; + + if (justReturnTheEvent) { + return response; + } else { + this.eventsObservers.get(requestId).error(response); + } + } + if (!justReturnTheEvent) { + this.eventsObservers.get(requestId).complete(); + this.eventsObservers.delete(requestId); + } + } + } + + private dispatchError(requestId: number, result: OperationResults, error: String) { + if (this.eventsObservers.has(requestId)) { + this.eventsObservers.get(requestId).error({ + result: result, + rawResponse: error, + }); + this.eventsObservers.delete(requestId); + } + } + + private cancelAllOperations() { + this.eventsObservers.forEach((value, key) => { + this.dispatchEvent(key, 'failed or refused', false); + }); + } + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.spec.ts new file mode 100644 index 00000000..44ad56c1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { LanguageService } from './language.service'; + +describe('LanguageService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [LanguageService], + }); + }); + + it('should be created', inject([LanguageService], (service: LanguageService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.ts new file mode 100644 index 00000000..6f5fc82c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.ts @@ -0,0 +1,80 @@ +import { Injectable } from '@angular/core'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; +import { ReplaySubject } from 'rxjs/ReplaySubject'; + +import { AppConfig } from '../app.config'; +import { ISubscription } from 'rxjs/Subscription'; +import { StorageService, StorageType } from './storage.service'; + +export class LanguageData { + code: string; + name: string; + iconName: string; + + constructor(langObj) { + Object.assign(this, langObj); + } +} + +@Injectable() +export class LanguageService { + currentLanguage = new ReplaySubject(1); + selectedLanguageLoaded = new ReplaySubject(1); + + private readonly storageKey = 'lang'; + private subscription: ISubscription; + private languagesInternal: LanguageData[] = []; + + get languages(): LanguageData[] { + return this.languagesInternal; + } + + constructor( + private translate: TranslateService, + private storageService: StorageService, + ) { } + + loadLanguageSettings() { + + const langs: string[] = []; + AppConfig.languages.forEach(lang => { + const LangObj = new LanguageData(lang); + this.languagesInternal.push(LangObj); + langs.push(LangObj.code); + }); + + this.translate.addLangs(langs); + this.translate.setDefaultLang(AppConfig.defaultLanguage); + + this.translate.onLangChange + .subscribe((event: LangChangeEvent) => this.onLanguageChanged(event)); + + this.loadCurrentLanguage(); + } + + changeLanguage(langCode: string) { + this.translate.use(langCode); + } + + private onLanguageChanged(event: LangChangeEvent) { + this.currentLanguage.next(this.languages.find(val => val.code === event.lang)); + + if (this.subscription) { + this.subscription.unsubscribe(); + } + this.subscription = this.storageService.store(StorageType.CLIENT, this.storageKey, event.lang).subscribe(); + } + + private loadCurrentLanguage() { + this.storageService.get(StorageType.CLIENT, this.storageKey).subscribe(response => { + if (response.data && this.translate.getLangs().indexOf(response.data) !== -1) { + setTimeout(() => { this.translate.use(response.data); }, 16); + this.selectedLanguageLoaded.next(true); + } else { + this.selectedLanguageLoaded.next(false); + } + }, () => { + this.selectedLanguageLoaded.next(false); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.spec.ts new file mode 100644 index 00000000..f610035b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { MsgBarService } from './msg-bar.service'; + +describe('MsgBarService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [MsgBarService], + }); + }); + + it('should be created', inject([MsgBarService], (service: MsgBarService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.ts new file mode 100644 index 00000000..e8d23d02 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.ts @@ -0,0 +1,70 @@ +import { Injectable } from '@angular/core'; +import { MsgBarConfig, MsgBarComponent, MsgBarIcons, MsgBarColors } from '../components/layout/msg-bar/msg-bar.component'; +import { parseResponseMessage } from '../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { Observable } from 'rxjs/Observable'; + +@Injectable() +export class MsgBarService { + + private timeSubscription: ISubscription; + + private msgBarComponentInternal: MsgBarComponent; + set msgBarComponent(value: MsgBarComponent) { + this.msgBarComponentInternal = value; + } + + show(config: MsgBarConfig) { + if (this.msgBarComponentInternal) { + this.msgBarComponentInternal.config = config; + this.msgBarComponentInternal.show(); + } + } + + hide() { + if (this.msgBarComponentInternal) { + this.msgBarComponentInternal.hide(); + } + } + + showError(body: string, duration = 20000) { + const config = new MsgBarConfig(); + config.text = parseResponseMessage(body); + config.title = 'errors.error'; + config.icon = MsgBarIcons.Error; + config.color = MsgBarColors.Red; + + this.show(config); + this.setTimer(duration); + } + + showWarning(body: string, duration = 20000) { + const config = new MsgBarConfig(); + config.text = parseResponseMessage(body); + config.title = 'common.warning'; + config.icon = MsgBarIcons.Warning; + config.color = MsgBarColors.Yellow; + + this.show(config); + this.setTimer(duration); + } + + showDone(body: string, duration = 10000) { + const config = new MsgBarConfig(); + config.text = body; + config.title = 'common.success'; + config.icon = MsgBarIcons.Done; + config.color = MsgBarColors.Green; + + this.show(config); + this.setTimer(duration); + } + + private setTimer(duration = 10000) { + if (this.timeSubscription) { + this.timeSubscription.unsubscribe(); + } + + this.timeSubscription = Observable.of(1).delay(duration).subscribe(() => this.hide()); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.spec.ts new file mode 100644 index 00000000..f7c58619 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { NavBarService } from './nav-bar.service'; + +describe('NavBarService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [NavBarService], + }); + }); + + it('should be created', inject([NavBarService], (service: NavBarService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.ts new file mode 100644 index 00000000..8d3edfc1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { DoubleButtonActive } from '../components/layout/double-button/double-button.component'; + +@Injectable() +export class NavBarService { + switchVisible = false; + activeComponent = new BehaviorSubject(1); + leftText: string; + rightText: string; + switchDiabled = false; + + setActiveComponent(value) { + this.activeComponent.next(value); + } + + showSwitch(leftText, rightText, selectedButton = DoubleButtonActive.LeftButton) { + this.setActiveComponent(selectedButton); + this.switchDiabled = false; + this.switchVisible = true; + this.leftText = leftText; + this.rightText = rightText; + } + + hideSwitch() { + this.switchVisible = false; + } + + enableSwitch() { + this.switchDiabled = false; + } + + disableSwitch() { + this.switchDiabled = true; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.spec.ts new file mode 100644 index 00000000..dc00e8ac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { NetworkService } from './network.service'; + +describe('NetworkService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [NetworkService], + }); + }); + + it('should be created', inject([NetworkService], (service: NetworkService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.ts new file mode 100644 index 00000000..833b212b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.ts @@ -0,0 +1,63 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { Observable } from 'rxjs/Observable'; +import { IntervalObservable } from 'rxjs/observable/IntervalObservable'; +import 'rxjs/add/operator/mergeMap'; +import { Connection } from '../app.datatypes'; + +@Injectable() +export class NetworkService { + noConnections = false; + + private automaticPeers: Subject = new BehaviorSubject([]); + + constructor( + private apiService: ApiService, + private ngZone: NgZone, + ) { + this.loadData(); + } + + automatic(): Observable { + return this.automaticPeers.asObservable(); + } + + retrieveDefaultConnections(): Observable { + return this.apiService.get('network/defaultConnections') + .map(output => output.map((address, index) => ({ + id: index + 1, + address: address, + listen_port: 6000, + }))); + } + + private loadData(): void { + this.retrieveConnections().subscribe(connections => this.automaticPeers.next(connections)); + + this.ngZone.runOutsideAngular(() => { + IntervalObservable + .create(5000) + .flatMap(() => this.retrieveConnections()) + .subscribe(connections => this.ngZone.run(() => { + this.automaticPeers.next(connections); + })); + }); + } + + private retrieveConnections(): Observable { + return this.apiService.get('network/connections') + .map(response => { + if (response.connections === null || response.connections.length === 0) { + this.noConnections = true; + + return []; + } + + this.noConnections = false; + + return response.connections.sort((a, b) => a.id - b.id); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.spec.ts new file mode 100644 index 00000000..88103507 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { PriceService } from './price.service'; + +describe('PriceService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PriceService], + }); + }); + + it('should be created', inject([PriceService], (service: PriceService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.ts new file mode 100644 index 00000000..b850fc9a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.ts @@ -0,0 +1,61 @@ +import { Injectable, NgZone } from '@angular/core'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { Observable } from 'rxjs/Observable'; +import { HttpClient } from '@angular/common/http'; +import { ISubscription } from 'rxjs/Subscription'; + +@Injectable() +export class PriceService { + readonly PRICE_API_ID = 'sky-skycoin'; + + price: Subject = new BehaviorSubject(null); + + private readonly updatePeriod = 10 * 60 * 1000; + private lastPriceSubscription: ISubscription; + private timerSubscriptions: ISubscription[]; + + constructor( + private http: HttpClient, + private ngZone: NgZone, + ) { + this.startTimer(); + } + + private startTimer(firstConnectionDelay = 0) { + if (this.timerSubscriptions) { + this.timerSubscriptions.forEach(sub => sub.unsubscribe()); + } + + this.timerSubscriptions = []; + + this.ngZone.runOutsideAngular(() => { + this.timerSubscriptions.push(Observable.timer(this.updatePeriod, this.updatePeriod) + .subscribe(() => { + this.ngZone.run(() => !this.lastPriceSubscription ? this.loadPrice() : null ); + })); + }); + + this.timerSubscriptions.push( + Observable.of(1).delay(firstConnectionDelay).subscribe(() => { + this.ngZone.run(() => this.loadPrice()); + })); + } + + private loadPrice() { + if (!this.PRICE_API_ID) { + return; + } + + if (this.lastPriceSubscription) { + this.lastPriceSubscription.unsubscribe(); + } + + this.lastPriceSubscription = this.http.get(`https://api.coinpaprika.com/v1/tickers/${this.PRICE_API_ID}?quotes=USD`) + .subscribe((response: any) => { + this.lastPriceSubscription = null; + this.price.next(response.quotes.USD.price); + }, + () => this.startTimer(30000)); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.spec.ts new file mode 100644 index 00000000..b69d48a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { PurchaseService } from './purchase.service'; + +describe('PurchaseService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PurchaseService], + }); + }); + + it('should be created', inject([PurchaseService], (service: PurchaseService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.ts new file mode 100644 index 00000000..f8d52d75 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.ts @@ -0,0 +1,71 @@ +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { PurchaseOrder, TellerConfig, Wallet } from '../app.datatypes'; +import { WalletService } from './wallet.service'; +import { HttpClient } from '@angular/common/http'; +import { environment } from '../../environments/environment'; +import { Observable } from 'rxjs/Observable'; + +@Injectable() +export class PurchaseService { + private configSubject: Subject = new BehaviorSubject(null); + private purchaseOrders: Subject = new BehaviorSubject([]); + private purchaseUrl = environment.tellerUrl; + + constructor( + private httpClient: HttpClient, + private walletService: WalletService, + ) { + this.getConfig(); + } + + all() { + return this.purchaseOrders.asObservable(); + } + + config(): Observable { + return this.configSubject.asObservable(); + } + + getConfig() { + return this.get('config') + .map((response: any) => ({ + enabled: true, + sky_btc_exchange_rate: parseFloat(response.sky_btc_exchange_rate), + })) + .subscribe(response => this.configSubject.next(response)); + } + + generate(wallet: Wallet): Observable { + return this.walletService.addAddress(wallet, 1).flatMap(address => { + return this.post('bind', { skyaddr: address[0].address, coin_type: 'BTC' }) + .map(response => ({ + coin_type: response.coin_type, + deposit_address: response.deposit_address, + filename: wallet.filename, + recipient_address: address[0].address, + status: 'waiting_deposit', + })); + }); + } + + scan(address: string) { + return this.get('status?skyaddr=' + address) + .map((response: any) => { + if (!response.statuses || response.statuses.length > 1) { + throw new Error('too many purchase orders found'); + } + + return response.statuses[0]; + }); + } + + private get(url): any { + return this.httpClient.get(this.purchaseUrl + url); + } + + private post(url, parameters = {}): any { + return this.httpClient.post(this.purchaseUrl + url, parameters); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.spec.ts new file mode 100644 index 00000000..a7d2fefe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { StorageService } from './storage.service'; + +describe('StorageService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [StorageService], + }); + }); + + it('should be created', inject([StorageService], (service: StorageService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.ts new file mode 100644 index 00000000..3acb5b87 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { ApiService } from './api.service'; + +export enum StorageType { + CLIENT = 'client', + NOTES = 'txid', +} + +@Injectable() +export class StorageService { + + constructor( + private apiService: ApiService, + ) { } + + get(type: StorageType, key: string) { + const params = { type }; + + if (key) { + params.key = key; + } + + return this.apiService.get('data', params, { }, true); + } + + store(type: StorageType, key: string, value: string) { + return this.apiService.post('data', { + type: type, + key: key, + val: value, + }, {}, true); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.spec.ts new file mode 100644 index 00000000..d111e258 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { WalletService } from './wallet.service'; + +describe('WalletService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [WalletService], + }); + }); + + it('should be created', inject([WalletService], (service: WalletService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.ts new file mode 100644 index 00000000..0ab90a91 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.ts @@ -0,0 +1,935 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Subject } from 'rxjs/Subject'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/forkJoin'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/filter'; +import 'rxjs/add/operator/first'; +import 'rxjs/add/operator/mergeMap'; +import 'rxjs/add/observable/timer'; +import 'rxjs/add/observable/zip'; +import { Address, NormalTransaction, PreviewTransaction, Wallet, Output } from '../app.datatypes'; +import { ReplaySubject } from 'rxjs/ReplaySubject'; +import { Subscription } from 'rxjs/Subscription'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { BigNumber } from 'bignumber.js'; +import { HwWalletService } from './hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { catchError, map } from 'rxjs/operators'; +import { AppConfig } from '../app.config'; +import { Http } from '@angular/http'; +import { StorageService, StorageType } from './storage.service'; +import { shouldUpgradeVersion } from '../utils/semver'; +import { TxEncoder } from '../utils/tx-encoder'; + +export enum HwSecurityWarnings { + NeedsBackup, + NeedsPin, + FirmwareVersionNotVerified, + OutdatedFirmware, +} + +export interface HwFeaturesResponse { + features: any; + securityWarnings: HwSecurityWarnings[]; + walletNameUpdated: boolean; +} + +export interface PendingTransactions { + user: any[]; + all: any[]; +} + +@Injectable() +export class WalletService { + + addresses: Address[]; + wallets: Subject = new ReplaySubject(1); + pendingTxs: Subject = new ReplaySubject(1); + dataRefreshSubscription: Subscription; + + initialLoadFailed: BehaviorSubject = new BehaviorSubject(false); + + constructor( + private apiService: ApiService, + private hwWalletService: HwWalletService, + private translate: TranslateService, + private ngZone: NgZone, + private http: Http, + private storageService: StorageService, + ) { + this.loadData(); + this.startDataRefreshSubscription(); + } + + addressesAsString(): Observable { + return this.allAddresses().map(addrs => addrs.map(addr => addr.address)).map(addrs => addrs.join(',')); + } + + addAddress(wallet: Wallet, num: number, password?: string) { + if (!wallet.isHardware) { + return this.apiService.postWalletNewAddress(wallet, num, password) + .do(addresses => { + addresses.forEach(value => wallet.addresses.push(value)); + this.refreshBalances(); + }); + } else { + return this.hwWalletService.getAddresses(num, wallet.addresses.length).flatMap(response => { + (response.rawResponse as any[]).forEach(value => wallet.addresses.push({ + address: value, + coins: null, + hours: null, + })); + this.saveHardwareWallets(); + this.refreshBalances(); + + return Observable.of(response.rawResponse); + }); + } + } + + all(): Observable { + return this.wallets.asObservable(); + } + + allAddresses(): Observable { + return this.all().map(wallets => wallets.reduce((array, wallet) => array.concat(wallet.addresses), [])); + } + + create(label, seed, scan, password) { + seed = seed.replace(/(\n|\r\n)$/, ''); + + return this.apiService.postWalletCreate(label ? label : 'undefined', seed, scan ? scan : 100, password, 'deterministic') + .do(wallet => { + console.log(wallet); + this.wallets.first().subscribe(wallets => { + wallets.push(wallet); + this.wallets.next(wallets); + this.refreshBalances(); + }); + }); + } + + createHardwareWallet(): Observable { + let addresses: string[]; + let lastAddressWithTx = 0; + const addressesMap: Map = new Map(); + const addressesWithTxMap: Map = new Map(); + + return this.hwWalletService.getAddresses(AppConfig.maxHardwareWalletAddresses, 0).flatMap(response => { + addresses = response.rawResponse; + addresses.forEach(address => { + addressesMap.set(address, true); + }); + + const addressesString = addresses.join(','); + + return this.apiService.post('transactions', { addrs: addressesString }); + }).flatMap(response => { + response.forEach(tx => { + tx.txn.outputs.forEach(output => { + if (addressesMap.has(output.dst)) { + addressesWithTxMap.set(output.dst, true); + } + }); + }); + + addresses.forEach((address, i) => { + if (addressesWithTxMap.has(address)) { + lastAddressWithTx = i; + } + }); + + return this.wallets.first().map(wallets => { + const newWallet = this.createHardwareWalletData( + this.translate.instant('hardware-wallet.general.default-wallet-name'), + addresses.slice(0, lastAddressWithTx + 1).map(add => { + return { address: add, confirmed: false }; + }), true, false, + ); + + let lastHardwareWalletIndex = wallets.length - 1; + for (let i = 0; i < wallets.length; i++) { + if (!wallets[i].isHardware) { + lastHardwareWalletIndex = i - 1; + break; + } + } + wallets.splice(lastHardwareWalletIndex + 1, 0, newWallet); + this.saveHardwareWallets(); + this.refreshBalances(); + + return newWallet; + }); + }); + } + + getHwFeaturesAndUpdateData(wallet: Wallet): Observable { + if (!wallet || wallet.isHardware) { + + let lastestFirmwareVersion: string; + + return this.http.get(AppConfig.urlForHwWalletVersionChecking) + .catch(() => Observable.of(null)) + .flatMap((res: any) => { + if (res) { + lastestFirmwareVersion = res.text(); + } else { + lastestFirmwareVersion = null; + } + + return this.hwWalletService.getFeatures(); + }) + .map(result => { + let lastestFirmwareVersionReaded = false; + let firmwareUpdated = false; + + if (lastestFirmwareVersion) { + lastestFirmwareVersion = lastestFirmwareVersion.trim(); + const versionParts = lastestFirmwareVersion.split('.'); + + if (versionParts.length === 3) { + lastestFirmwareVersionReaded = true; + + const numVersionParts = versionParts.map(value => Number.parseInt(value.replace(/\D/g, ''))); + + const devMajorVersion = !AppConfig.useHwWalletDaemon ? result.rawResponse.majorVersion : result.rawResponse.fw_major; + const devMinorVersion = !AppConfig.useHwWalletDaemon ? result.rawResponse.minorVersion : result.rawResponse.fw_minor; + const devPatchVersion = !AppConfig.useHwWalletDaemon ? result.rawResponse.patchVersion : result.rawResponse.fw_patch; + + if (devMajorVersion > numVersionParts[0]) { + firmwareUpdated = true; + } else { + if (devMajorVersion === numVersionParts[0]) { + if (devMinorVersion > numVersionParts[1]) { + firmwareUpdated = true; + } else { + if (devMinorVersion === numVersionParts[1] && devPatchVersion >= numVersionParts[2]) { + firmwareUpdated = true; + } + } + } + } + } + } + + const warnings: HwSecurityWarnings[] = []; + let hasHwSecurityWarnings = false; + + if (!AppConfig.useHwWalletDaemon) { + if (result.rawResponse.needsBackup) { + warnings.push(HwSecurityWarnings.NeedsBackup); + hasHwSecurityWarnings = true; + } + if (!result.rawResponse.pinProtection) { + warnings.push(HwSecurityWarnings.NeedsPin); + hasHwSecurityWarnings = true; + } + } else { + if (result.rawResponse.needs_backup) { + warnings.push(HwSecurityWarnings.NeedsBackup); + hasHwSecurityWarnings = true; + } + if (!result.rawResponse.pin_protection) { + warnings.push(HwSecurityWarnings.NeedsPin); + hasHwSecurityWarnings = true; + } + } + + if (!lastestFirmwareVersionReaded) { + warnings.push(HwSecurityWarnings.FirmwareVersionNotVerified); + } else { + if (!firmwareUpdated) { + warnings.push(HwSecurityWarnings.OutdatedFirmware); + hasHwSecurityWarnings = true; + } + } + + let walletNameUpdated = false; + + if (wallet) { + const deviceLabel = result.rawResponse.label ? result.rawResponse.label : (result.rawResponse.deviceId ? result.rawResponse.deviceId : result.rawResponse.device_id); + if (wallet.label !== deviceLabel) { + wallet.label = deviceLabel; + walletNameUpdated = true; + } + wallet.hasHwSecurityWarnings = hasHwSecurityWarnings; + this.saveHardwareWallets(); + } + + const response = { + features: result.rawResponse, + securityWarnings: warnings, + walletNameUpdated: walletNameUpdated, + }; + + return response; + }); + } else { + return null; + } + } + + deleteHardwareWallet(wallet: Wallet): Observable { + if (wallet.isHardware) { + return this.wallets.first().map(wallets => { + const index = wallets.indexOf(wallet); + if (index !== -1) { + wallets.splice(index, 1); + + this.saveHardwareWallets(); + this.refreshBalances(); + + return true; + } + + return false; + }); + } + + return null; + } + + folder(): Observable { + return this.apiService.get('wallets/folderName').map(response => response.address); + } + + outputs(): Observable { + return this.addressesAsString() + .first() + .filter(addresses => !!addresses) + .flatMap(addresses => this.apiService.post('outputs', {addrs: addresses})); + } + + outputsWithWallets(): Observable { + return Observable.zip(this.all(), this.outputs(), (wallets, outputs) => { + return wallets.map(wallet => { + wallet.addresses = wallet.addresses.map(address => { + address.outputs = outputs.head_outputs.filter(output => output.address === address.address); + + return address; + }); + + return wallet; + }); + }); + } + + pendingTransactions(): Observable { + return this.pendingTxs.asObservable(); + } + + refreshBalances() { + this.wallets.first().subscribe(wallets => { + Observable.forkJoin(wallets.map(wallet => this.retrieveWalletBalance(wallet).map(response => { + wallet.coins = response.coins; + wallet.hours = response.hours; + wallet.addresses.map(address => { + const balance = response.addresses.find(addr => addr.address === address.address); + address.coins = balance.coins; + address.hours = balance.hours; + }); + + return wallet; + }))) + .subscribe(newWallets => this.wallets.next(newWallets)); + }); + } + + renameWallet(wallet: Wallet, label: string): Observable { + return this.apiService.post('wallet/update', { id: wallet.filename, label: label }) + .do(() => { + wallet.label = label; + this.updateWallet(wallet); + }); + } + + toggleEncryption(wallet: Wallet, password: string): Observable { + return this.apiService.postWalletToggleEncryption(wallet, password) + .do(w => { + wallet.encrypted = w.meta.encrypted; + this.updateWallet(w); + }); + } + + resetPassword(wallet: Wallet, seed: string, password: string): Observable { + const params = new Object(); + params['id'] = wallet.filename; + params['seed'] = seed; + if (password) { + params['password'] = password; + } + + return this.apiService.post('wallet/recover', params, {}, true).do(w => { + wallet.encrypted = w.data.meta.encrypted; + this.updateWallet(w.data); + }); + } + + getWalletSeed(wallet: Wallet, password: string): Observable { + return this.apiService.getWalletSeed(wallet, password); + } + + createTransaction( + wallet: Wallet|null, + addresses: string[]|null, + unspents: string[]|null, + destinations: any[], + hoursSelection: any, + changeAddress: string|null, + password: string|null, + unsigned: boolean): Observable { + + if (unspents) { + addresses = null; + } + + if (wallet.isHardware && !changeAddress) { + changeAddress = wallet.addresses[0].address; + } + + const useV2Endpoint = !!wallet.isHardware; + + const params = { + hours_selection: hoursSelection, + wallet_id: wallet ? wallet.filename : null, + password: password, + addresses: addresses, + unspents: unspents, + to: destinations, + change_address: changeAddress, + }; + + if (!useV2Endpoint) { + params['unsigned'] = unsigned; + } + + let response: Observable = this.apiService.post( + useV2Endpoint ? 'transaction' : 'wallet/transaction', + params, + { + json: true, + }, + useV2Endpoint, + ).map(transaction => { + const data = useV2Endpoint ? transaction.data : transaction; + + if (wallet.isHardware) { + if (data.transaction.inputs.length > 8) { + throw new Error(this.translate.instant('hardware-wallet.errors.too-many-inputs-outputs')); + } + if (data.transaction.outputs.length > 8) { + throw new Error(this.translate.instant('hardware-wallet.errors.too-many-inputs-outputs')); + } + } + + return { + ...data.transaction, + hoursBurned: new BigNumber(data.transaction.fee), + encoded: data.encoded_transaction, + innerHash: data.transaction.inner_hash, + }; + }); + + if (wallet.isHardware && !unsigned) { + let unsignedTx: PreviewTransaction; + + response = response.flatMap(transaction => { + unsignedTx = transaction; + + return this.signTransaction(wallet, null, transaction); + }).map(signedTx => { + unsignedTx.encoded = signedTx.encoded; + + return unsignedTx; + }); + } + + return response; + } + + signTransaction( + wallet: Wallet, + password: string|null, + transaction: PreviewTransaction): Observable { + + if (!wallet.isHardware) { + return this.apiService.post( + 'wallet/transaction/sign', + { + wallet_id: wallet ? wallet.filename : null, + password: password, + encoded_transaction: transaction.encoded, + }, + { + json: true, + }, + true, + ).map(response => { + return { + ...response.data.transaction, + hoursBurned: new BigNumber(response.data.transaction.fee), + encoded: response.data.encoded_transaction, + }; + }); + + } else { + + const txOutputs = []; + const txInputs = []; + const hwOutputs = []; + const hwInputs = []; + + transaction.outputs.forEach(output => { + txOutputs.push({ + address: output.address, + coins: parseInt(new BigNumber(output.coins).multipliedBy(1000000).toFixed(0), 10), + hours: parseInt(output.hours, 10), + }); + + hwOutputs.push({ + address: output.address, + coin: parseInt(new BigNumber(output.coins).multipliedBy(1000000).toFixed(0), 10), + hour: parseInt(output.hours, 10), + }); + }); + + if (hwOutputs.length > 1) { + for (let i = txOutputs.length - 1; i >= 0; i--) { + if (hwOutputs[i].address === wallet.addresses[0].address) { + hwOutputs[i].address_index = 0; + break; + } + } + } + + const addressesMap: Map = new Map(); + wallet.addresses.forEach((address, i) => addressesMap.set(address.address, i)); + + transaction.inputs.forEach(input => { + txInputs.push({ + hash: input.uxid, + secret: '', + address: input.address, + address_index: addressesMap.get(input.address), + calculated_hours: parseInt(input.calculated_hours, 10), + coins: parseInt(input.coins, 10), + }); + + hwInputs.push({ + hashIn: input.uxid, + index: addressesMap.get(input.address), + }); + }); + + return this.hwWalletService.signTransaction(hwInputs, hwOutputs).flatMap(signatures => { + const rawTransaction = TxEncoder.encode( + hwInputs, + hwOutputs, + signatures.rawResponse, + transaction.innerHash, + ); + + return Observable.of( { + ...transaction, + encoded: rawTransaction, + }); + }); + } + } + + injectTransaction(encodedTx: string, note: string): Observable { + return this.apiService.post('injectTransaction', { rawtx: encodedTx }, { json: true }) + .flatMap(txId => { + setTimeout(() => this.startDataRefreshSubscription(), 32); + + if (!note) { + return Observable.of(false); + } else { + return this.storageService.store(StorageType.NOTES, txId, note) + .retryWhen(errors => errors.delay(1000).take(3).concat(Observable.throw(-1))) + .catch(err => err === -1 ? Observable.of(-1) : err) + .map(result => result === -1 ? false : true); + } + }); + } + + transaction(txid: string): Observable { + return this.apiService.get('transaction', {txid: txid}).flatMap(transaction => { + if (transaction.txn.inputs && !transaction.txn.inputs.length) { + return Observable.of(transaction); + } + + return Observable.forkJoin(transaction.txn.inputs.map(input => this.retrieveInputAddress(input).map(response => { + return response.owner_address; + }))).map(inputs => { + transaction.txn.inputs = inputs; + + return transaction; + }); + }); + } + + transactions(): Observable { + let wallets: Wallet[]; + let transactions: NormalTransaction[]; + const addressesMap: Map = new Map(); + + + return this.wallets.first().flatMap(w => { + wallets = w; + + return this.allAddresses().first(); + }).flatMap(addresses => { + this.addresses = addresses; + addresses.map(add => addressesMap.set(add.address, true)); + + return this.apiService.getTransactions(addresses); + }).flatMap(recoveredTransactions => { + transactions = recoveredTransactions; + + return this.storageService.get(StorageType.NOTES, null); + }).map(notes => { + const notesMap: Map = new Map(); + Object.keys(notes.data).forEach(key => { + notesMap.set(key, notes.data[key]); + }); + + return transactions + .sort((a, b) => b.timestamp - a.timestamp) + .map(transaction => { + const outgoing = transaction.inputs.some(input => addressesMap.has(input.owner)); + + const relevantAddresses: Map = new Map(); + transaction.balance = new BigNumber('0'); + transaction.hoursSent = new BigNumber('0'); + + if (!outgoing) { + transaction.outputs.map(output => { + if (addressesMap.has(output.dst)) { + relevantAddresses.set(output.dst, true); + transaction.balance = transaction.balance.plus(output.coins); + transaction.hoursSent = transaction.hoursSent.plus(output.hours); + } + }); + } else { + const possibleReturnAddressesMap: Map = new Map(); + transaction.inputs.map(input => { + if (addressesMap.has(input.owner)) { + relevantAddresses.set(input.owner, true); + wallets.map(wallet => { + if (wallet.addresses.some(add => add.address === input.owner)) { + wallet.addresses.map(add => possibleReturnAddressesMap.set(add.address, true)); + } + }); + } + }); + + transaction.outputs.map(output => { + if (!possibleReturnAddressesMap.has(output.dst)) { + transaction.balance = transaction.balance.minus(output.coins); + transaction.hoursSent = transaction.hoursSent.plus(output.hours); + } + }); + + if (transaction.balance.isEqualTo(0)) { + transaction.coinsMovedInternally = true; + const inputAddressesMap: Map = new Map(); + + transaction.inputs.map(input => { + inputAddressesMap.set(input.owner, true); + }); + + transaction.outputs.map(output => { + if (!inputAddressesMap.has(output.dst)) { + relevantAddresses.set(output.dst, true); + transaction.balance = transaction.balance.plus(output.coins); + transaction.hoursSent = transaction.hoursSent.plus(output.hours); + } + }); + } + } + + relevantAddresses.forEach((value, key) => { + transaction.addresses.push(key); + }); + + let inputsHours = new BigNumber('0'); + transaction.inputs.map(input => inputsHours = inputsHours.plus(new BigNumber(input.calculated_hours))); + let outputsHours = new BigNumber('0'); + transaction.outputs.map(output => outputsHours = outputsHours.plus(new BigNumber(output.hours))); + transaction.hoursBurned = inputsHours.minus(outputsHours); + + const txNote = notesMap.get(transaction.txid); + if (txNote) { + transaction.note = txNote; + } + + return transaction; + }); + }); + } + + startDataRefreshSubscription() { + if (this.dataRefreshSubscription) { + this.dataRefreshSubscription.unsubscribe(); + } + + this.ngZone.runOutsideAngular(() => { + this.dataRefreshSubscription = Observable.timer(0, 10000) + .subscribe(() => this.ngZone.run(() => { + this.refreshBalances(); + this.refreshPendingTransactions(); + })); + }); + } + + saveHardwareWallets() { + this.wallets.first().subscribe(wallets => { + const hardwareWallets: Wallet[] = []; + + wallets.map(wallet => { + if (wallet.isHardware) { + hardwareWallets.push(this.createHardwareWalletData( + wallet.label, + wallet.addresses.map(address => { + return { address: address.address, confirmed: address.confirmed }; + }), + wallet.hasHwSecurityWarnings, + wallet.stopShowingHwSecurityPopup, + )); + } + }); + + this.hwWalletService.saveWalletsData(JSON.stringify(hardwareWallets)); + + this.wallets.next(wallets); + }); + } + + verifyAddress(address: string) { + return this.apiService.post('address/verify', { address }, {}, true) + .pipe(map(() => true), catchError(() => Observable.of(false))); + } + + getWalletUnspentOutputs(wallet: Wallet): Observable { + const addresses = wallet.addresses.map(a => a.address).join(','); + + return this.getOutputs(addresses); + } + + private createHardwareWalletData(label: string, addresses: {address: string, confirmed: boolean}[], hasHwSecurityWarnings: boolean, stopShowingHwSecurityPopup: boolean): Wallet { + return { + label: label, + filename: '', + hasHwSecurityWarnings: hasHwSecurityWarnings, + stopShowingHwSecurityPopup: stopShowingHwSecurityPopup, + coins: null, + hours: null, + addresses: addresses.map(address => { + return { + address: address.address, + coins: null, + hours: null, + confirmed: address.confirmed, + }; + }), + encrypted: false, + isHardware: true, + }; + } + + private loadData(): void { + let wallets: Wallet[] = []; + let softwareWallets: Wallet[] = []; + + this.apiService.getWallets().first().flatMap(recoveredWallets => { + softwareWallets = recoveredWallets; + + if (this.hwWalletService.hwWalletCompatibilityActivated) { + return this.loadHardwareWallets(wallets); + } + + return Observable.of(null); + + }).subscribe(() => { + wallets = wallets.concat(softwareWallets); + this.wallets.next(wallets); + }, () => this.initialLoadFailed.next(true)); + } + + private loadHardwareWallets(wallets: Wallet[]): Observable { + return this.hwWalletService.getSavedWalletsData().map(storedWallets => { + if (storedWallets) { + const loadedWallets: Wallet[] = JSON.parse(storedWallets); + loadedWallets.map(wallet => wallets.push(wallet)); + } + + return null; + }); + } + + private retrieveInputAddress(input: string) { + return this.apiService.get('uxout', {uxid: input}); + } + + private retrieveWalletBalance(wallet: Wallet): Observable { + let query: Observable; + if (!wallet.isHardware) { + query = this.apiService.get('wallet/balance', { id: wallet.filename }); + } else { + const formattedAddresses = wallet.addresses.map(a => a.address).join(','); + query = this.apiService.post('balance', { addrs: formattedAddresses }); + } + + return query.map(balance => { + return { + coins: new BigNumber(balance.confirmed.coins).dividedBy(1000000), + hours: new BigNumber(balance.confirmed.hours), + addresses: Object.keys(balance.addresses).map(address => ({ + address, + coins: new BigNumber(balance.addresses[address].confirmed.coins).dividedBy(1000000), + hours: new BigNumber(balance.addresses[address].confirmed.hours), + })), + }; + }); + } + + private updateWallet(wallet: Wallet) { + this.wallets.first().subscribe(wallets => { + const index = wallets.findIndex(w => w.filename === wallet.filename); + wallets[index] = wallet; + this.wallets.next(wallets); + }); + } + + private refreshPendingTransactions() { + this.apiService.get('pendingTxs', { verbose: true }) + .flatMap((transactions: any) => { + if (transactions.length === 0) { + return Observable.of({ + user: [], + all: [], + }); + } + + return this.wallets.first().map((wallets: Wallet[]) => { + const walletAddresses = new Set(); + wallets.forEach(wallet => { + wallet.addresses.forEach(address => walletAddresses.add(address.address)); + }); + + const userTransactions = transactions.filter(tran => { + return tran.transaction.inputs.some(input => walletAddresses.has(input.owner)) || + tran.transaction.outputs.some(output => walletAddresses.has(output.dst)); + }); + + return { + user: userTransactions, + all: transactions, + }; + }); + }) + .subscribe(transactions => this.pendingTxs.next(transactions)); + } + + private getOutputs(addresses): Observable { + if (!addresses) { + return Observable.of([]); + } else { + return this.apiService.post('outputs', { addrs: addresses }).map((response) => { + const outputs = []; + response.head_outputs.forEach(output => outputs.push({ + address: output.address, + coins: new BigNumber(output.coins), + hash: output.hash, + calculated_hours: new BigNumber(output.calculated_hours), + })); + + return outputs; + }); + } + } + + private sortOutputs(outputs: Output[], highestToLowest: boolean) { + outputs.sort((a, b) => { + if (b.coins.isGreaterThan(a.coins)) { + return highestToLowest ? 1 : -1; + } else if (b.coins.isLessThan(a.coins)) { + return highestToLowest ? -1 : 1; + } else { + if (b.calculated_hours.isGreaterThan(a.calculated_hours)) { + return -1; + } else if (b.calculated_hours.isLessThan(a.calculated_hours)) { + return 1; + } else { + return 0; + } + } + }); + } + + private getMinRequiredOutputs(transactionAmount: BigNumber, outputs: Output[]): Output[] { + + // Split the outputs into those with and without hours + const outputsWithHours: Output[] = []; + const outputsWitouthHours: Output[] = []; + outputs.forEach(output => { + if (output.calculated_hours.isGreaterThan(0)) { + outputsWithHours.push(output); + } else { + outputsWitouthHours.push(output); + } + }); + + // Abort if there are no outputs with non-zero coinhours. + if (outputsWithHours.length === 0) { + return []; + } + + // Sort the outputs with hours by coins, from highest to lowest. If two items have the same amount of + // coins, the one with the least hours is placed first. + this.sortOutputs(outputsWithHours, true); + + // Use the first nonzero output. + const minRequiredOutputs: Output[] = [outputsWithHours[0]]; + let sumCoins: BigNumber = new BigNumber(outputsWithHours[0].coins); + + // If it's enough, finish. + if (sumCoins.isGreaterThanOrEqualTo(transactionAmount)) { + return minRequiredOutputs; + } + + // Sort the outputs without hours by coins, from lowest to highest. + this.sortOutputs(outputsWitouthHours, false); + + // Add the outputs without hours, until having the necessary amount of coins. + outputsWitouthHours.forEach(output => { + if (sumCoins.isLessThan(transactionAmount)) { + minRequiredOutputs.push(output); + sumCoins = sumCoins.plus(output.coins); + } + }); + + // If it's enough, finish. + if (sumCoins.isGreaterThanOrEqualTo(transactionAmount)) { + return minRequiredOutputs; + } + + outputsWithHours.splice(0, 1); + // Sort the outputs with hours by coins, from lowest to highest. + this.sortOutputs(outputsWithHours, false); + + // Add the outputs with hours, until having the necessary amount of coins. + outputsWithHours.forEach((output) => { + if (sumCoins.isLessThan(transactionAmount)) { + minRequiredOutputs.push(output); + sumCoins = sumCoins.plus(output.coins); + } + }); + + return minRequiredOutputs; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.spec.ts new file mode 100644 index 00000000..ce4788b2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { WizardGuardService } from './wizard-guard.service'; + +describe('WizardGuardService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [WizardGuardService], + }); + }); + + it('should be created', inject([WizardGuardService], (service: WizardGuardService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.ts new file mode 100644 index 00000000..dafdcb61 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { WalletService } from './wallet.service'; + +@Injectable() +export class WizardGuardService implements CanActivate { + constructor( + private walletService: WalletService, + private router: Router, + ) { } + + canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { + return new Promise(resolve => { + this.walletService.all().first().subscribe(wallets => { + if (wallets.length === 0) { + this.router.navigate(['/wizard']); + + return resolve(false); + } + + return resolve(true); + }); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.spec.ts new file mode 100644 index 00000000..ec0f2149 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.spec.ts @@ -0,0 +1,16 @@ +import { parseResponseMessage } from './errors'; + +fdescribe('errors', () => { + const message1 = '400 Bad Request - error description'; + const message2 = '403 Forbidden - error description'; + const message3 = '500 Internal Server Error - error description'; + + it('parses message from 400 and 403 responses', () => { + expect(parseResponseMessage(message1)).toEqual('Error description'); + expect(parseResponseMessage(message2)).toEqual('Error description'); + }); + + it('does not parse message from other responses', () => { + expect(parseResponseMessage(message3)).toEqual(message3); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.ts new file mode 100644 index 00000000..4a4d8b40 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.ts @@ -0,0 +1,76 @@ +import { HwWalletService, OperationResults } from '../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { AppConfig } from '../app.config'; + +export function parseResponseMessage(body: string): string { + if (typeof body === 'object') { + if (body['_body']) { + body = body['_body']; + } else { + body = body + ''; + } + } + + if (body.indexOf('"error":') !== -1) { + body = JSON.parse(body).error.message; + } + + if (body.startsWith('400') || body.startsWith('403')) { + const parts = body.split(' - ', 2); + + return parts.length === 2 + ? parts[1].charAt(0).toUpperCase() + parts[1].slice(1) + : body; + } + + return body; +} + +export function getHardwareWalletErrorMsg(translateService: TranslateService, error: any, genericError: string = null): string { + if (!AppConfig.useHwWalletDaemon && !window['ipcRenderer'].sendSync('hwGetDeviceConnectedSync')) { + if (translateService) { + return translateService.instant('hardware-wallet.general.error-disconnected'); + } else { + return 'hardware-wallet.general.error-disconnected'; + } + } + + let response: string; + if (error.result) { + if (error.result === OperationResults.FailedOrRefused) { + response = 'hardware-wallet.general.refused'; + } else if (error.result === OperationResults.WrongPin) { + response = 'hardware-wallet.general.error-incorrect-pin'; + } else if (error.result === OperationResults.IncorrectHardwareWallet) { + response = 'hardware-wallet.general.error-incorrect-wallet'; + } else if (error.result === OperationResults.DaemonError) { + response = 'hardware-wallet.errors.daemon-connection'; + } else if (error.result === OperationResults.InvalidAddress) { + response = 'hardware-wallet.errors.invalid-address'; + } else if (error.result === OperationResults.Timeout) { + response = 'hardware-wallet.errors.timeout'; + } else if (error.result === OperationResults.Disconnected) { + response = 'hardware-wallet.general.error-disconnected'; + } else if (error.result === OperationResults.NotInBootloaderMode) { + response = 'hardware-wallet.errors.not-in-bootloader-mode'; + } else if (error.result === OperationResults.PinMismatch) { + response = 'hardware-wallet.change-pin.pin-mismatch'; + } else if (error.result === OperationResults.WrongWord) { + response = 'hardware-wallet.restore-seed.error-wrong-word'; + } else if (error.result === OperationResults.InvalidSeed) { + response = 'hardware-wallet.restore-seed.error-invalid-seed'; + } else if (error.result === OperationResults.WrongSeed) { + response = 'hardware-wallet.restore-seed.error-wrong-seed'; + } else { + response = genericError ? genericError : 'hardware-wallet.general.generic-error'; + } + } else { + response = genericError ? genericError : 'hardware-wallet.general.generic-error'; + } + + if (translateService) { + return translateService.instant(response); + } else { + return response; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/index.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/index.ts new file mode 100644 index 00000000..d3074666 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/index.ts @@ -0,0 +1,40 @@ +import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material'; +import { Observable } from 'rxjs/Observable'; + +import { ConfirmationData } from '../app.datatypes'; +import { ConfirmationComponent } from '../components/layout/confirmation/confirmation.component'; +import { SelectLanguageComponent } from '../components/layout/select-language/select-language.component'; + +export function showConfirmationModal(dialog: MatDialog, confirmationData: ConfirmationData): MatDialogRef { + return dialog.open(ConfirmationComponent, { + width: '450px', + data: confirmationData, + autoFocus: false, + }); +} + +export function openChangeLanguageModal(dialog: MatDialog, disableClose = false): Observable { + const config = new MatDialogConfig(); + config.width = '600px'; + config.disableClose = disableClose; + config.autoFocus = false; + + return dialog.open(SelectLanguageComponent, config).afterClosed(); +} + +export function copyTextToClipboard(text: string) { + const selBox = document.createElement('textarea'); + + selBox.style.position = 'fixed'; + selBox.style.left = '0'; + selBox.style.top = '0'; + selBox.style.opacity = '0'; + selBox.value = text; + + document.body.appendChild(selBox); + selBox.focus(); + selBox.select(); + + document.execCommand('copy'); + document.body.removeChild(selBox); +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.spec.ts new file mode 100644 index 00000000..df9974e3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.spec.ts @@ -0,0 +1,17 @@ +import { shouldUpgradeVersion } from './semver'; + +fdescribe('semver', () => { + it('correctly compares versions', () => { + expect(shouldUpgradeVersion('0.23.0', '0.22.0')).toBeFalsy(); + expect(shouldUpgradeVersion('0.23.0', '0.23.0')).toBeFalsy(); + expect(shouldUpgradeVersion('0.23.0', '0.23.1')).toBeTruthy(); + expect(shouldUpgradeVersion('0.23.1', '0.24.0')).toBeTruthy(); + expect(shouldUpgradeVersion('0.24.0', '1.0.0')).toBeTruthy(); + }); + + it('correctly handles rc versions', () => { + expect(shouldUpgradeVersion('0.23.1-rc.1', '0.23.0')).toBeFalsy(); + expect(shouldUpgradeVersion('0.23.1-rc.1', '0.23.1')).toBeTruthy(); + expect(shouldUpgradeVersion('0.23.1-rc.1', '0.23.2')).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.ts new file mode 100644 index 00000000..4c13ea1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.ts @@ -0,0 +1,28 @@ +/** + * Compares two SemVer versions, returns true if 'from' is smaller than 'to'. + * Special cases with 'rc' suffix are described in spec file. + * + * @returns {boolean} + * @param from + * @param to + */ +export function shouldUpgradeVersion(from: string, to: string): boolean { + const toParts = to.split('.'); + const fromSplit = from.split('-'); + const fromParts = fromSplit[0].split('.'); + + for (let i = 0; i < 3; i++) { + const toNumber = Number(toParts[i]); + const fromNumber = Number(fromParts[i]); + + if (toNumber > fromNumber) { + return true; + } + + if (toNumber < fromNumber) { + return false; + } + } + + return fromSplit.length === 2 && fromSplit[1].indexOf('rc') !== -1; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.spec.ts new file mode 100644 index 00000000..c2d88e82 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.spec.ts @@ -0,0 +1,15 @@ +import { readJSON } from 'karma-read-json'; +import { TxEncoder } from './tx-encoder'; + +fdescribe('TxEncoder', () => { + + describe('check encoding', () => { + const txs = readJSON('test-fixtures/encoded-txs.json').txs; + + for (let i = 0; i < txs.length; i++) { + it('encode tx ' + i, () => { + expect(TxEncoder.encode(txs[i].inputs, txs[i].outputs, txs[i].signatures, txs[i].innerHash)).toBe(txs[i].raw); + }); + } + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.ts new file mode 100644 index 00000000..c5a113dd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.ts @@ -0,0 +1,182 @@ +import * as Base58 from 'base-x'; +import BigNumber from 'bignumber.js'; +import { Input, Output } from '../services/hw-wallet.service'; + +export class TxEncoder { + static encode(inputs: Input[], outputs: Output[], signatures: string[], innerHash: string, transactionType = 0) { + if (inputs.length !== signatures.length) { + throw new Error('Invalid number of signatures.'); + } + + const transactionSize = this.encodeSizeTransaction(inputs, outputs, signatures).toNumber(); + const buffer = new ArrayBuffer(transactionSize); + const dataView = new DataView(buffer); + let currentPos = 0; + + // Tx length + dataView.setUint32(currentPos, transactionSize, true); + currentPos += 4; + + // Tx type + dataView.setUint8(currentPos, transactionType); + currentPos += 1; + + // Tx innerHash + const innerHashBytes = this.convertToBytes(innerHash); + innerHashBytes.forEach(number => { + dataView.setUint8(currentPos, number); + currentPos += 1; + }); + + // Tx sigs maxlen check + if (signatures.length > 65535) { + throw new Error('Too many signatures.'); + } + + // Tx sigs length + dataView.setUint32(currentPos, signatures.length, true); + currentPos += 4; + + // Tx sigs + (signatures as string[]).forEach(sig => { + // Copy all bytes + const binarySig = this.convertToBytes(sig); + binarySig.forEach(number => { + dataView.setUint8(currentPos, number); + currentPos += 1; + }); + }); + + // Tx inputs maxlen check + if (inputs.length > 65535) { + throw new Error('Too many inputs.'); + } + + // Tx inputs length + dataView.setUint32(currentPos, inputs.length, true); + currentPos += 4; + + // Tx inputs + inputs.forEach(input => { + // Copy all bytes + const binaryInput = this.convertToBytes(input.hashIn); + binaryInput.forEach(number => { + dataView.setUint8(currentPos, number); + currentPos += 1; + }); + }); + + // Tx outputs maxlen check + if (outputs.length > 65535) { + throw new Error('Too many outputs.'); + } + + // Tx outputs length + dataView.setUint32(currentPos, outputs.length, true); + currentPos += 4; + + const decoder = Base58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'); + + // Tx outputs + outputs.forEach(output => { + // Decode the address + const decodedAddress = decoder.decode(output.address); + + // Address version + dataView.setUint8(currentPos, decodedAddress[20]); + currentPos += 1; + + // Address Key + for (let i = 0; i < 20; i++) { + dataView.setUint8(currentPos, decodedAddress[i]); + currentPos += 1; + } + + // Coins + currentPos = this.setUint64(dataView, currentPos, new BigNumber(output.coin)); + // Hours + currentPos = this.setUint64(dataView, currentPos, new BigNumber(output.hour)); + }); + + // + + return this.convertToHex(buffer); + } + + private static encodeSizeTransaction(inputs: Input[], outputs: Output[], signatures: string[]): BigNumber { + let size = new BigNumber(0); + + // Tx length + size = size.plus(4); + + // Tx type + size = size.plus(1); + + // Tx innerHash + size = size.plus(32); + + // Tx sigs + size = size.plus(4); + size = size.plus((new BigNumber(65).multipliedBy(signatures.length))); + + // Tx inputs + size = size.plus(4); + size = size.plus((new BigNumber(32).multipliedBy(inputs.length))); + + // Tx outputs + size = size.plus(4); + size = size.plus((new BigNumber(37).multipliedBy(outputs.length))); + + return size; + } + + private static setUint64(dataView: DataView, currentPos: number, value: BigNumber): number { + let hex = value.toString(16); + if (hex.length % 2 !== 0) { + hex = '0' + hex; + } + + const bytes = this.convertToBytes(hex); + for (let i = bytes.length - 1; i >= 0; i--) { + dataView.setUint8(currentPos, bytes[i]); + currentPos += 1; + } + + for (let i = 0; i < 8 - bytes.length; i++) { + dataView.setUint8(currentPos, 0); + currentPos += 1; + } + + return currentPos; + } + + private static convertToBytes(hexString: string): number[] { + if (hexString.length % 2 !== 0) { + throw new Error('Invalid hex string.'); + } + + const result: number[] = []; + + for (let i = 0; i < hexString.length; i += 2) { + result.push(parseInt(hexString.substr(i, 2), 16)); + } + + return result; + } + + private static convertToHex(buffer: ArrayBuffer) { + let result = ''; + + (new Uint8Array(buffer)).forEach((v) => { + let val = v.toString(16); + if (val.length === 0) { + val = '00'; + } else if (val.length === 1) { + val = '0' + val; + } + result += val; + }); + + return result; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/.gitkeep b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/bip39-word-list.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/bip39-word-list.json new file mode 100644 index 00000000..c4956547 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/bip39-word-list.json @@ -0,0 +1,2049 @@ +{ "list": ["abandon", +"ability", +"able", +"about", +"above", +"absent", +"absorb", +"abstract", +"absurd", +"abuse", +"access", +"accident", +"account", +"accuse", +"achieve", +"acid", +"acoustic", +"acquire", +"across", +"act", +"action", +"actor", +"actress", +"actual", +"adapt", +"add", +"addict", +"address", +"adjust", +"admit", +"adult", +"advance", +"advice", +"aerobic", +"affair", +"afford", +"afraid", +"again", +"age", +"agent", +"agree", +"ahead", +"aim", +"air", +"airport", +"aisle", +"alarm", +"album", +"alcohol", +"alert", +"alien", +"all", +"alley", +"allow", +"almost", +"alone", +"alpha", +"already", +"also", +"alter", +"always", +"amateur", +"amazing", +"among", +"amount", +"amused", +"analyst", +"anchor", +"ancient", +"anger", +"angle", +"angry", +"animal", +"ankle", +"announce", +"annual", +"another", +"answer", +"antenna", +"antique", +"anxiety", +"any", +"apart", +"apology", +"appear", +"apple", +"approve", +"april", +"arch", +"arctic", +"area", +"arena", +"argue", +"arm", +"armed", +"armor", +"army", +"around", +"arrange", +"arrest", +"arrive", +"arrow", +"art", +"artefact", +"artist", +"artwork", +"ask", +"aspect", +"assault", +"asset", +"assist", +"assume", +"asthma", +"athlete", +"atom", +"attack", +"attend", +"attitude", +"attract", +"auction", +"audit", +"august", +"aunt", +"author", +"auto", +"autumn", +"average", +"avocado", +"avoid", +"awake", +"aware", +"away", +"awesome", +"awful", +"awkward", +"axis", +"baby", +"bachelor", +"bacon", +"badge", +"bag", +"balance", +"balcony", +"ball", +"bamboo", +"banana", +"banner", +"bar", +"barely", +"bargain", +"barrel", +"base", +"basic", +"basket", +"battle", +"beach", +"bean", +"beauty", +"because", +"become", +"beef", +"before", +"begin", +"behave", +"behind", +"believe", +"below", +"belt", +"bench", +"benefit", +"best", +"betray", +"better", +"between", +"beyond", +"bicycle", +"bid", +"bike", +"bind", +"biology", +"bird", +"birth", +"bitter", +"black", +"blade", +"blame", +"blanket", +"blast", +"bleak", +"bless", +"blind", +"blood", +"blossom", +"blouse", +"blue", +"blur", +"blush", +"board", +"boat", +"body", +"boil", +"bomb", +"bone", +"bonus", +"book", +"boost", +"border", +"boring", +"borrow", +"boss", +"bottom", +"bounce", +"box", +"boy", +"bracket", +"brain", +"brand", +"brass", +"brave", +"bread", +"breeze", +"brick", +"bridge", +"brief", +"bright", +"bring", +"brisk", +"broccoli", +"broken", +"bronze", +"broom", +"brother", +"brown", +"brush", +"bubble", +"buddy", +"budget", +"buffalo", +"build", +"bulb", +"bulk", +"bullet", +"bundle", +"bunker", +"burden", +"burger", +"burst", +"bus", +"business", +"busy", +"butter", +"buyer", +"buzz", +"cabbage", +"cabin", +"cable", +"cactus", +"cage", +"cake", +"call", +"calm", +"camera", +"camp", +"can", +"canal", +"cancel", +"candy", +"cannon", +"canoe", +"canvas", +"canyon", +"capable", +"capital", +"captain", +"car", +"carbon", +"card", +"cargo", +"carpet", +"carry", +"cart", +"case", +"cash", +"casino", +"castle", +"casual", +"cat", +"catalog", +"catch", +"category", +"cattle", +"caught", +"cause", +"caution", +"cave", +"ceiling", +"celery", +"cement", +"census", +"century", +"cereal", +"certain", +"chair", +"chalk", +"champion", +"change", +"chaos", +"chapter", +"charge", +"chase", +"chat", +"cheap", +"check", +"cheese", +"chef", +"cherry", +"chest", +"chicken", +"chief", +"child", +"chimney", +"choice", +"choose", +"chronic", +"chuckle", +"chunk", +"churn", +"cigar", +"cinnamon", +"circle", +"citizen", +"city", +"civil", +"claim", +"clap", +"clarify", +"claw", +"clay", +"clean", +"clerk", +"clever", +"click", +"client", +"cliff", +"climb", +"clinic", +"clip", +"clock", +"clog", +"close", +"cloth", +"cloud", +"clown", +"club", +"clump", +"cluster", +"clutch", +"coach", +"coast", +"coconut", +"code", +"coffee", +"coil", +"coin", +"collect", +"color", +"column", +"combine", +"come", +"comfort", +"comic", +"common", +"company", +"concert", +"conduct", +"confirm", +"congress", +"connect", +"consider", +"control", +"convince", +"cook", +"cool", +"copper", +"copy", +"coral", +"core", +"corn", +"correct", +"cost", +"cotton", +"couch", +"country", +"couple", +"course", +"cousin", +"cover", +"coyote", +"crack", +"cradle", +"craft", +"cram", +"crane", +"crash", +"crater", +"crawl", +"crazy", +"cream", +"credit", +"creek", +"crew", +"cricket", +"crime", +"crisp", +"critic", +"crop", +"cross", +"crouch", +"crowd", +"crucial", +"cruel", +"cruise", +"crumble", +"crunch", +"crush", +"cry", +"crystal", +"cube", +"culture", +"cup", +"cupboard", +"curious", +"current", +"curtain", +"curve", +"cushion", +"custom", +"cute", +"cycle", +"dad", +"damage", +"damp", +"dance", +"danger", +"daring", +"dash", +"daughter", +"dawn", +"day", +"deal", +"debate", +"debris", +"decade", +"december", +"decide", +"decline", +"decorate", +"decrease", +"deer", +"defense", +"define", +"defy", +"degree", +"delay", +"deliver", +"demand", +"demise", +"denial", +"dentist", +"deny", +"depart", +"depend", +"deposit", +"depth", +"deputy", +"derive", +"describe", +"desert", +"design", +"desk", +"despair", +"destroy", +"detail", +"detect", +"develop", +"device", +"devote", +"diagram", +"dial", +"diamond", +"diary", +"dice", +"diesel", +"diet", +"differ", +"digital", +"dignity", +"dilemma", +"dinner", +"dinosaur", +"direct", +"dirt", +"disagree", +"discover", +"disease", +"dish", +"dismiss", +"disorder", +"display", +"distance", +"divert", +"divide", +"divorce", +"dizzy", +"doctor", +"document", +"dog", +"doll", +"dolphin", +"domain", +"donate", +"donkey", +"donor", +"door", +"dose", +"double", +"dove", +"draft", +"dragon", +"drama", +"drastic", +"draw", +"dream", +"dress", +"drift", +"drill", +"drink", +"drip", +"drive", +"drop", +"drum", +"dry", +"duck", +"dumb", +"dune", +"during", +"dust", +"dutch", +"duty", +"dwarf", +"dynamic", +"eager", +"eagle", +"early", +"earn", +"earth", +"easily", +"east", +"easy", +"echo", +"ecology", +"economy", +"edge", +"edit", +"educate", +"effort", +"egg", +"eight", +"either", +"elbow", +"elder", +"electric", +"elegant", +"element", +"elephant", +"elevator", +"elite", +"else", +"embark", +"embody", +"embrace", +"emerge", +"emotion", +"employ", +"empower", +"empty", +"enable", +"enact", +"end", +"endless", +"endorse", +"enemy", +"energy", +"enforce", +"engage", +"engine", +"enhance", +"enjoy", +"enlist", +"enough", +"enrich", +"enroll", +"ensure", +"enter", +"entire", +"entry", +"envelope", +"episode", +"equal", +"equip", +"era", +"erase", +"erode", +"erosion", +"error", +"erupt", +"escape", +"essay", +"essence", +"estate", +"eternal", +"ethics", +"evidence", +"evil", +"evoke", +"evolve", +"exact", +"example", +"excess", +"exchange", +"excite", +"exclude", +"excuse", +"execute", +"exercise", +"exhaust", +"exhibit", +"exile", +"exist", +"exit", +"exotic", +"expand", +"expect", +"expire", +"explain", +"expose", +"express", +"extend", +"extra", +"eye", +"eyebrow", +"fabric", +"face", +"faculty", +"fade", +"faint", +"faith", +"fall", +"false", +"fame", +"family", +"famous", +"fan", +"fancy", +"fantasy", +"farm", +"fashion", +"fat", +"fatal", +"father", +"fatigue", +"fault", +"favorite", +"feature", +"february", +"federal", +"fee", +"feed", +"feel", +"female", +"fence", +"festival", +"fetch", +"fever", +"few", +"fiber", +"fiction", +"field", +"figure", +"file", +"film", +"filter", +"final", +"find", +"fine", +"finger", +"finish", +"fire", +"firm", +"first", +"fiscal", +"fish", +"fit", +"fitness", +"fix", +"flag", +"flame", +"flash", +"flat", +"flavor", +"flee", +"flight", +"flip", +"float", +"flock", +"floor", +"flower", +"fluid", +"flush", +"fly", +"foam", +"focus", +"fog", +"foil", +"fold", +"follow", +"food", +"foot", +"force", +"forest", +"forget", +"fork", +"fortune", +"forum", +"forward", +"fossil", +"foster", +"found", +"fox", +"fragile", +"frame", +"frequent", +"fresh", +"friend", +"fringe", +"frog", +"front", +"frost", +"frown", +"frozen", +"fruit", +"fuel", +"fun", +"funny", +"furnace", +"fury", +"future", +"gadget", +"gain", +"galaxy", +"gallery", +"game", +"gap", +"garage", +"garbage", +"garden", +"garlic", +"garment", +"gas", +"gasp", +"gate", +"gather", +"gauge", +"gaze", +"general", +"genius", +"genre", +"gentle", +"genuine", +"gesture", +"ghost", +"giant", +"gift", +"giggle", +"ginger", +"giraffe", +"girl", +"give", +"glad", +"glance", +"glare", +"glass", +"glide", +"glimpse", +"globe", +"gloom", +"glory", +"glove", +"glow", +"glue", +"goat", +"goddess", +"gold", +"good", +"goose", +"gorilla", +"gospel", +"gossip", +"govern", +"gown", +"grab", +"grace", +"grain", +"grant", +"grape", +"grass", +"gravity", +"great", +"green", +"grid", +"grief", +"grit", +"grocery", +"group", +"grow", +"grunt", +"guard", +"guess", +"guide", +"guilt", +"guitar", +"gun", +"gym", +"habit", +"hair", +"half", +"hammer", +"hamster", +"hand", +"happy", +"harbor", +"hard", +"harsh", +"harvest", +"hat", +"have", +"hawk", +"hazard", +"head", +"health", +"heart", +"heavy", +"hedgehog", +"height", +"hello", +"helmet", +"help", +"hen", +"hero", +"hidden", +"high", +"hill", +"hint", +"hip", +"hire", +"history", +"hobby", +"hockey", +"hold", +"hole", +"holiday", +"hollow", +"home", +"honey", +"hood", +"hope", +"horn", +"horror", +"horse", +"hospital", +"host", +"hotel", +"hour", +"hover", +"hub", +"huge", +"human", +"humble", +"humor", +"hundred", +"hungry", +"hunt", +"hurdle", +"hurry", +"hurt", +"husband", +"hybrid", +"ice", +"icon", +"idea", +"identify", +"idle", +"ignore", +"ill", +"illegal", +"illness", +"image", +"imitate", +"immense", +"immune", +"impact", +"impose", +"improve", +"impulse", +"inch", +"include", +"income", +"increase", +"index", +"indicate", +"indoor", +"industry", +"infant", +"inflict", +"inform", +"inhale", +"inherit", +"initial", +"inject", +"injury", +"inmate", +"inner", +"innocent", +"input", +"inquiry", +"insane", +"insect", +"inside", +"inspire", +"install", +"intact", +"interest", +"into", +"invest", +"invite", +"involve", +"iron", +"island", +"isolate", +"issue", +"item", +"ivory", +"jacket", +"jaguar", +"jar", +"jazz", +"jealous", +"jeans", +"jelly", +"jewel", +"job", +"join", +"joke", +"journey", +"joy", +"judge", +"juice", +"jump", +"jungle", +"junior", +"junk", +"just", +"kangaroo", +"keen", +"keep", +"ketchup", +"key", +"kick", +"kid", +"kidney", +"kind", +"kingdom", +"kiss", +"kit", +"kitchen", +"kite", +"kitten", +"kiwi", +"knee", +"knife", +"knock", +"know", +"lab", +"label", +"labor", +"ladder", +"lady", +"lake", +"lamp", +"language", +"laptop", +"large", +"later", +"latin", +"laugh", +"laundry", +"lava", +"law", +"lawn", +"lawsuit", +"layer", +"lazy", +"leader", +"leaf", +"learn", +"leave", +"lecture", +"left", +"leg", +"legal", +"legend", +"leisure", +"lemon", +"lend", +"length", +"lens", +"leopard", +"lesson", +"letter", +"level", +"liar", +"liberty", +"library", +"license", +"life", +"lift", +"light", +"like", +"limb", +"limit", +"link", +"lion", +"liquid", +"list", +"little", +"live", +"lizard", +"load", +"loan", +"lobster", +"local", +"lock", +"logic", +"lonely", +"long", +"loop", +"lottery", +"loud", +"lounge", +"love", +"loyal", +"lucky", +"luggage", +"lumber", +"lunar", +"lunch", +"luxury", +"lyrics", +"machine", +"mad", +"magic", +"magnet", +"maid", +"mail", +"main", +"major", +"make", +"mammal", +"man", +"manage", +"mandate", +"mango", +"mansion", +"manual", +"maple", +"marble", +"march", +"margin", +"marine", +"market", +"marriage", +"mask", +"mass", +"master", +"match", +"material", +"math", +"matrix", +"matter", +"maximum", +"maze", +"meadow", +"mean", +"measure", +"meat", +"mechanic", +"medal", +"media", +"melody", +"melt", +"member", +"memory", +"mention", +"menu", +"mercy", +"merge", +"merit", +"merry", +"mesh", +"message", +"metal", +"method", +"middle", +"midnight", +"milk", +"million", +"mimic", +"mind", +"minimum", +"minor", +"minute", +"miracle", +"mirror", +"misery", +"miss", +"mistake", +"mix", +"mixed", +"mixture", +"mobile", +"model", +"modify", +"mom", +"moment", +"monitor", +"monkey", +"monster", +"month", +"moon", +"moral", +"more", +"morning", +"mosquito", +"mother", +"motion", +"motor", +"mountain", +"mouse", +"move", +"movie", +"much", +"muffin", +"mule", +"multiply", +"muscle", +"museum", +"mushroom", +"music", +"must", +"mutual", +"myself", +"mystery", +"myth", +"naive", +"name", +"napkin", +"narrow", +"nasty", +"nation", +"nature", +"near", +"neck", +"need", +"negative", +"neglect", +"neither", +"nephew", +"nerve", +"nest", +"net", +"network", +"neutral", +"never", +"news", +"next", +"nice", +"night", +"noble", +"noise", +"nominee", +"noodle", +"normal", +"north", +"nose", +"notable", +"note", +"nothing", +"notice", +"novel", +"now", +"nuclear", +"number", +"nurse", +"nut", +"oak", +"obey", +"object", +"oblige", +"obscure", +"observe", +"obtain", +"obvious", +"occur", +"ocean", +"october", +"odor", +"off", +"offer", +"office", +"often", +"oil", +"okay", +"old", +"olive", +"olympic", +"omit", +"once", +"one", +"onion", +"online", +"only", +"open", +"opera", +"opinion", +"oppose", +"option", +"orange", +"orbit", +"orchard", +"order", +"ordinary", +"organ", +"orient", +"original", +"orphan", +"ostrich", +"other", +"outdoor", +"outer", +"output", +"outside", +"oval", +"oven", +"over", +"own", +"owner", +"oxygen", +"oyster", +"ozone", +"pact", +"paddle", +"page", +"pair", +"palace", +"palm", +"panda", +"panel", +"panic", +"panther", +"paper", +"parade", +"parent", +"park", +"parrot", +"party", +"pass", +"patch", +"path", +"patient", +"patrol", +"pattern", +"pause", +"pave", +"payment", +"peace", +"peanut", +"pear", +"peasant", +"pelican", +"pen", +"penalty", +"pencil", +"people", +"pepper", +"perfect", +"permit", +"person", +"pet", +"phone", +"photo", +"phrase", +"physical", +"piano", +"picnic", +"picture", +"piece", +"pig", +"pigeon", +"pill", +"pilot", +"pink", +"pioneer", +"pipe", +"pistol", +"pitch", +"pizza", +"place", +"planet", +"plastic", +"plate", +"play", +"please", +"pledge", +"pluck", +"plug", +"plunge", +"poem", +"poet", +"point", +"polar", +"pole", +"police", +"pond", +"pony", +"pool", +"popular", +"portion", +"position", +"possible", +"post", +"potato", +"pottery", +"poverty", +"powder", +"power", +"practice", +"praise", +"predict", +"prefer", +"prepare", +"present", +"pretty", +"prevent", +"price", +"pride", +"primary", +"print", +"priority", +"prison", +"private", +"prize", +"problem", +"process", +"produce", +"profit", +"program", +"project", +"promote", +"proof", +"property", +"prosper", +"protect", +"proud", +"provide", +"public", +"pudding", +"pull", +"pulp", +"pulse", +"pumpkin", +"punch", +"pupil", +"puppy", +"purchase", +"purity", +"purpose", +"purse", +"push", +"put", +"puzzle", +"pyramid", +"quality", +"quantum", +"quarter", +"question", +"quick", +"quit", +"quiz", +"quote", +"rabbit", +"raccoon", +"race", +"rack", +"radar", +"radio", +"rail", +"rain", +"raise", +"rally", +"ramp", +"ranch", +"random", +"range", +"rapid", +"rare", +"rate", +"rather", +"raven", +"raw", +"razor", +"ready", +"real", +"reason", +"rebel", +"rebuild", +"recall", +"receive", +"recipe", +"record", +"recycle", +"reduce", +"reflect", +"reform", +"refuse", +"region", +"regret", +"regular", +"reject", +"relax", +"release", +"relief", +"rely", +"remain", +"remember", +"remind", +"remove", +"render", +"renew", +"rent", +"reopen", +"repair", +"repeat", +"replace", +"report", +"require", +"rescue", +"resemble", +"resist", +"resource", +"response", +"result", +"retire", +"retreat", +"return", +"reunion", +"reveal", +"review", +"reward", +"rhythm", +"rib", +"ribbon", +"rice", +"rich", +"ride", +"ridge", +"rifle", +"right", +"rigid", +"ring", +"riot", +"ripple", +"risk", +"ritual", +"rival", +"river", +"road", +"roast", +"robot", +"robust", +"rocket", +"romance", +"roof", +"rookie", +"room", +"rose", +"rotate", +"rough", +"round", +"route", +"royal", +"rubber", +"rude", +"rug", +"rule", +"run", +"runway", +"rural", +"sad", +"saddle", +"sadness", +"safe", +"sail", +"salad", +"salmon", +"salon", +"salt", +"salute", +"same", +"sample", +"sand", +"satisfy", +"satoshi", +"sauce", +"sausage", +"save", +"say", +"scale", +"scan", +"scare", +"scatter", +"scene", +"scheme", +"school", +"science", +"scissors", +"scorpion", +"scout", +"scrap", +"screen", +"script", +"scrub", +"sea", +"search", +"season", +"seat", +"second", +"secret", +"section", +"security", +"seed", +"seek", +"segment", +"select", +"sell", +"seminar", +"senior", +"sense", +"sentence", +"series", +"service", +"session", +"settle", +"setup", +"seven", +"shadow", +"shaft", +"shallow", +"share", +"shed", +"shell", +"sheriff", +"shield", +"shift", +"shine", +"ship", +"shiver", +"shock", +"shoe", +"shoot", +"shop", +"short", +"shoulder", +"shove", +"shrimp", +"shrug", +"shuffle", +"shy", +"sibling", +"sick", +"side", +"siege", +"sight", +"sign", +"silent", +"silk", +"silly", +"silver", +"similar", +"simple", +"since", +"sing", +"siren", +"sister", +"situate", +"six", +"size", +"skate", +"sketch", +"ski", +"skill", +"skin", +"skirt", +"skull", +"slab", +"slam", +"sleep", +"slender", +"slice", +"slide", +"slight", +"slim", +"slogan", +"slot", +"slow", +"slush", +"small", +"smart", +"smile", +"smoke", +"smooth", +"snack", +"snake", +"snap", +"sniff", +"snow", +"soap", +"soccer", +"social", +"sock", +"soda", +"soft", +"solar", +"soldier", +"solid", +"solution", +"solve", +"someone", +"song", +"soon", +"sorry", +"sort", +"soul", +"sound", +"soup", +"source", +"south", +"space", +"spare", +"spatial", +"spawn", +"speak", +"special", +"speed", +"spell", +"spend", +"sphere", +"spice", +"spider", +"spike", +"spin", +"spirit", +"split", +"spoil", +"sponsor", +"spoon", +"sport", +"spot", +"spray", +"spread", +"spring", +"spy", +"square", +"squeeze", +"squirrel", +"stable", +"stadium", +"staff", +"stage", +"stairs", +"stamp", +"stand", +"start", +"state", +"stay", +"steak", +"steel", +"stem", +"step", +"stereo", +"stick", +"still", +"sting", +"stock", +"stomach", +"stone", +"stool", +"story", +"stove", +"strategy", +"street", +"strike", +"strong", +"struggle", +"student", +"stuff", +"stumble", +"style", +"subject", +"submit", +"subway", +"success", +"such", +"sudden", +"suffer", +"sugar", +"suggest", +"suit", +"summer", +"sun", +"sunny", +"sunset", +"super", +"supply", +"supreme", +"sure", +"surface", +"surge", +"surprise", +"surround", +"survey", +"suspect", +"sustain", +"swallow", +"swamp", +"swap", +"swarm", +"swear", +"sweet", +"swift", +"swim", +"swing", +"switch", +"sword", +"symbol", +"symptom", +"syrup", +"system", +"table", +"tackle", +"tag", +"tail", +"talent", +"talk", +"tank", +"tape", +"target", +"task", +"taste", +"tattoo", +"taxi", +"teach", +"team", +"tell", +"ten", +"tenant", +"tennis", +"tent", +"term", +"test", +"text", +"thank", +"that", +"theme", +"then", +"theory", +"there", +"they", +"thing", +"this", +"thought", +"three", +"thrive", +"throw", +"thumb", +"thunder", +"ticket", +"tide", +"tiger", +"tilt", +"timber", +"time", +"tiny", +"tip", +"tired", +"tissue", +"title", +"toast", +"tobacco", +"today", +"toddler", +"toe", +"together", +"toilet", +"token", +"tomato", +"tomorrow", +"tone", +"tongue", +"tonight", +"tool", +"tooth", +"top", +"topic", +"topple", +"torch", +"tornado", +"tortoise", +"toss", +"total", +"tourist", +"toward", +"tower", +"town", +"toy", +"track", +"trade", +"traffic", +"tragic", +"train", +"transfer", +"trap", +"trash", +"travel", +"tray", +"treat", +"tree", +"trend", +"trial", +"tribe", +"trick", +"trigger", +"trim", +"trip", +"trophy", +"trouble", +"truck", +"true", +"truly", +"trumpet", +"trust", +"truth", +"try", +"tube", +"tuition", +"tumble", +"tuna", +"tunnel", +"turkey", +"turn", +"turtle", +"twelve", +"twenty", +"twice", +"twin", +"twist", +"two", +"type", +"typical", +"ugly", +"umbrella", +"unable", +"unaware", +"uncle", +"uncover", +"under", +"undo", +"unfair", +"unfold", +"unhappy", +"uniform", +"unique", +"unit", +"universe", +"unknown", +"unlock", +"until", +"unusual", +"unveil", +"update", +"upgrade", +"uphold", +"upon", +"upper", +"upset", +"urban", +"urge", +"usage", +"use", +"used", +"useful", +"useless", +"usual", +"utility", +"vacant", +"vacuum", +"vague", +"valid", +"valley", +"valve", +"van", +"vanish", +"vapor", +"various", +"vast", +"vault", +"vehicle", +"velvet", +"vendor", +"venture", +"venue", +"verb", +"verify", +"version", +"very", +"vessel", +"veteran", +"viable", +"vibrant", +"vicious", +"victory", +"video", +"view", +"village", +"vintage", +"violin", +"virtual", +"virus", +"visa", +"visit", +"visual", +"vital", +"vivid", +"vocal", +"voice", +"void", +"volcano", +"volume", +"vote", +"voyage", +"wage", +"wagon", +"wait", +"walk", +"wall", +"walnut", +"want", +"warfare", +"warm", +"warrior", +"wash", +"wasp", +"waste", +"water", +"wave", +"way", +"wealth", +"weapon", +"wear", +"weasel", +"weather", +"web", +"wedding", +"weekend", +"weird", +"welcome", +"west", +"wet", +"whale", +"what", +"wheat", +"wheel", +"when", +"where", +"whip", +"whisper", +"wide", +"width", +"wife", +"wild", +"will", +"win", +"window", +"wine", +"wing", +"wink", +"winner", +"winter", +"wire", +"wisdom", +"wise", +"wish", +"witness", +"wolf", +"woman", +"wonder", +"wood", +"wool", +"word", +"work", +"world", +"worry", +"worth", +"wrap", +"wreck", +"wrestle", +"wrist", +"write", +"wrong", +"yard", +"year", +"yellow", +"you", +"young", +"youth", +"zebra", +"zero", +"zone", +"zoo"] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/big-error-icon.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/big-error-icon.png new file mode 100644 index 00000000..bcbda0c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/big-error-icon.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/index.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/index.html new file mode 100644 index 00000000..29d9dc9f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/index.html @@ -0,0 +1,89 @@ + + + + + + + + +
+
+ +
+
+
+
+ + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.eot b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.eot new file mode 100644 index 00000000..70508eba Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.eot differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ijmap b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ijmap new file mode 100644 index 00000000..d9f1d259 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.svg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.svg new file mode 100644 index 00000000..a449327e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf new file mode 100644 index 00000000..7015564a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff new file mode 100644 index 00000000..b648a3ee Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 new file mode 100644 index 00000000..9fa21125 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/material-icons.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/material-icons.css new file mode 100644 index 00000000..2270c09d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff new file mode 100644 index 00000000..780de6d6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff2 new file mode 100644 index 00000000..72a32ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff new file mode 100644 index 00000000..20ec4ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 new file mode 100644 index 00000000..642a2d44 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff new file mode 100644 index 00000000..a9946092 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff2 new file mode 100644 index 00000000..b3238fa2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff new file mode 100644 index 00000000..7cc63b7e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff2 new file mode 100644 index 00000000..3f438f80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff new file mode 100644 index 00000000..40c056ea Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff2 new file mode 100644 index 00000000..46f89cfb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff new file mode 100644 index 00000000..ddc9c014 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 new file mode 100644 index 00000000..08d7a518 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/header.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/header.png new file mode 100644 index 00000000..be1002a4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/header.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/README.md b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/README.md new file mode 100644 index 00000000..22bccbd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/README.md @@ -0,0 +1,273 @@ +This folder contains the GUI translation files. To maintain order and be able +to easily make any necessary updates to the translation files after updating +the main text file, please follow its instructions if you are working with +its contents. + +# Contents of this folder + +The contents of this folder are: + +- `README.md`: this file. + +- `check.js`: file with the script for detecting if a translation file has errors +or should be updated. + +- `en.json`: main file with all the texts of the application, in English. It should +only be modified when changing the texts of the application (add, modify and +delete). This means that the file must not be modified while creating a new +ranslation or modifying an existing one. + +- Various `xx.json` files: files with the translated versions of the texts of +`en.json`. + +- Various `xx_base.json` files: files with copies of `en.json` made the last time the +corresponding `xx.json` file was modified. + +Normally there is no need to modify the first two files. + +For more information about the `xx.json` and `xx_base.json`, please check the +[Add a new translation](#add-a-new-translation) and +[Update a translation](#update-a-translation) sections. + +# About the meaning of "xx" in this file + +Several parts of this file uses "xx" as part of file names or scripts, like +`xx.json` and `xx_base.json`. In fact, no file in this folder should be called +`xx.json` or `xx_base.json`, the "xx" part must be replaces with the two +characters code of the language. For example, if you are working with the Chinese +translation, the files will be `zh.json` and `zh_base.json`, instead of `xx.json` +and `xx_base.json`. The same if true for the scripts, if you are working with the +Chinese translation, instead of running `node check.js xx` you must run +`node check.js zh`. + +# Add a new translation + +First you must create in this folder two copies of the `en.json` file. The first +copy must be called `xx.json`, where the `xx` part must be the two characters code +of the new language. For example, for Chinese the name of the file should be +`zh.json`; for Spanish, `es.json`; for French, `fr.json`, etc. + +The second copy of `en.json` must be renamed to `xx_base.json`, where the `xx` part +must be the two characters code of the new language. This means that if the first +copy is named `zh.json`, the second one should be named `zh_base.json`. + +It is not necessary to follow a specific standard for the two characters code, but +it must be limited to two letters and be a recognizable code for the language. + +After creating the two files, simply translate the texts in `xx.json`. Please make +sure you do not modify the structure of `xx.json`, just modify the texts. + +The `xx_base.json` file must not be modified in any way, as it is used only as a way +to know what the state of `en.json` was the last time the `xx.json` file was +modified. This copy will be compared in the future with `en.json`, to verify if +there were modifications to `en.json` since the last time the translation file was +modified and if an update is needed. + +If the `xx.json` and `xx_base.json` files do not have the same elements, the +automatic tests could fail when uploading the changes to the repository, preventing +the changes from being accepted, so, again, it is important not to modify the +structure of `xx.json`, but only its contents. + +After doing all this, the translation will be ready, but will not be available in +the GUI until adding it to the code. + +# Verify the translation files + +This folder includes a script that is capable of automatically checking the +translation files, to detect problems and know what should be updated. + +For using it, your computer must have `Node.js` installed. + +## Checking for problems + +For detecting basic problems on the translation files, open a command line window +in this folder and run `node check.js`. This will check the following: + +- The `en.json` must exist, as it is the main language file for the app. + +- For every `xx.json` file (except `en.json`) an `xx_base.json` file must exist +and viceversa. + +- A `xx.json` file and its corresponding `xx_base.json` file must have the exact +same elements (only the content of that elements could be different), as the +`xx.json` is suposed to be the translation of the contents of `xx_base.json`. + +As you can see, this only checks for errors that could be made while creating or +modifying the `xx.json` and `xx_base.json` files, and does not check if any +translation needs to be updated. + +At the end of the script excecution, the console will display the list of all +errors found, if any. This check could be done automatically when making changes +to the repository, to reject updates with problems, so it is good idea to run it +manually before uploading changes. + +Note: at this time the script does not check if the elements of the files are +in the same order, but this could be added in the future, so it is recomended +not to change the order of the elements. + +## Checking if a language file needs to be updated + +To detect if an specific language needs updating, run `node check.js xx`, +where xx is the two characters code of the language you want to check. If you +want to check all languages, run `node check.js all`. + +By doing this, the script will perform all the checks described in the +[Checking for problems](#checking-for-problems) section, plus this: + +- The `en.json` and `xx_base.json` should have the same elements. If `en.json` +has elements that `xx_base.json` does not contain, it means that, since the +last time the translation file was updated, new texts have been added to the +application. If `xx_base.json` has elements that `en.json` does not contain, +it means that, since the last time the translation file was updated, some texts +have been removed from the application. Both cases mean that the translation +file should be updated. + +- The elements of `en.json` and `xx_base.json` should have the same content. +If any element have different content, it means that since the last time the +translation file was updated, some texts of the applications have been changed. +This means that the translation file should be updated. + +At the end of the script excecution, the console will display the list of all +errors found, if any. + +# Update a translation + +Before updating a translation file, you should follow the steps of the +[Checking if a language file needs to be updated](#Checking-if-a-language-file-needs-to-be-updated) +section. By doing so you will quikly know exactly what texts must be added, +deleted or edited. + +After doing that, make all the required modifications in the `xx.json` file, +this means adding, deleting and modifying all the elements indicated by the +script. Please be sure to modify only what is required and to add any new +element in the same position that it is in the `en.json` file. This process +is manual, so be sure check all the changes before finishing. + +After doing the modifications in `xx.json`, delete the `xx_base.json` file, +create a copy of `en.json` and rename it `xx_base.json`. The objetive is to +simply update the `xx_base.json` file to the current state of `en.json`. +this will make possible to check in the future if more updates are nedded, +due to new changes in `en.json`. + +Once all the changes are made, check again the language file as indicated +in the +[Checking if a language file needs to be updated](#Checking-if-a-language-file-needs-to-be-updated) +section. The script should not return errors. If the script returns errors, +please solve them before continuing. + +# How to edit the translation files + +The translation files are in json format (.json files). It is possible to +open these files in a text editor and edit them like normal text files. +However, the json files are used for coding and have a very strict format. +Because of this, **editing the files manually is not recommended** unless +you know exactly what you are doing. + +If you do not know the json format, this section includes useful +information to be able to edit the files easily. + +## Which application should be used for editing the files + +There are several application that allow editing json files, including +some text editors. However, it is recommended to use the Json Editor app +for Google Chrome. Among the advantages of this application are that it +is multiplatform, it allows editing the contents without having to +directly modify the json code and has a relatively simple interface. You +can add it to your Chrome browser from here: +https://chrome.google.com/webstore/detail/json-editor/lhkmoheomjbkfloacpgllgjcamhihfaj + +The app looks like this: + +![app](app1.png) + +As you can see, you can load/save files on the upper-right corner of +the app. The left part shows the source code and the right part shows +a tree view of the elements of the file and its contents. You can +ignore the source code and work with the tree view only. + +![app](app2.png) + +As you will not be editing the soutce code, you can hide it by presing +and draging the 3-dot button (1). While editing the file, you can use +the arrows (2) to expand/contract the different sections in which the +elements are organized. Once you find an item that you want to edit, +click on the content and modify the text (3). Please, do not make any +changes to the name of the element (4). + +You can use the 6-dot buttons (5) to move the elements to a different +location, but please avoid doing it, as that could alter the order of +the file in a way that would make it stop working. Also, as you will +not be working with the source code, avoid using the arrow +buttons (6). + +## Special codes + +Some texts in the language files have special codes that are not +shown in the user interface of the wallet, but serve special purposes. +The codes are: + +- **\\"**: due to how json files work, it is not possible to write +double quotes directly in the texts, the ccorrect way to add double +quotes to a json file is **\\"** (note that the 2 characters must not +be separated by a white space). If you use the Json Editor app for +Google Chrome, you can write double quotes normally and the app will +automatically add the **\\** character behind them, but that is just +a convenience for when you are writing, you could still find the +**\\"** code in files you are editing and have to work with it. + +- **{{ }}**: any text block similar to **{{ something }}** is a +special identifier that the code will replace with a different value +when the app is running. For example, if you find a text like "Your +balance is {{ value }} coins", the application will show something +like "Your balance is 21 coins". In that example the "21" is a value +that the app has to calculate, so it is not possible to add it directly +into the language file. If you find a **{{ }}** text block, please do +not translate it, just move the whole **{{ }}** text block to where the +value should be displayed. If you want to leave a while space before the +value, simply add a white space before the **{{ }}** text block, and do +the same after it if you want a white space after the value. + +- **\
**: this code means "new line". It is just a way to tell +the code that the text after it should be added in a new line. + +# Make a translation available in the application + +Although creating the translation files is the most important step, it is +necessary to make some additional changes before a translation is +available in the application. + +The first thing to do is to add a bitmap in +[src/gui/static/src/assets/img/lang](src/gui/static/src/assets/img/lang), +with the flag that will be used to identify the language. The bitmap +should be a .png file with transparent background and a size of 64x64 +pixels. However, the flag does not have to occupy all the space of the +bitmap, but it should be 64 pixels wide and only 42 pixels high, +centered. Please use as a reference the flags that are already in +the folder. + +After adding the flag, you must modify the +[src/gui/static/src/app/app.config.ts](src/gui/static/src/app/app.config.ts) +file. In particular, you must add a new entry to the `languages` array, +with the data about the language. The object you must add is similar +to this: + +``` +{ + code: 'en', + name: 'English', + iconName: 'en.png' +} +``` + +The properties are: + +- `code`: 2 letter code that was assigned to the language. It must match +the name given to the translation file. + +- `name`: Name of the language. + +- `iconName`: Name of the file with the flag, which was added in the +previous step. + +Please use as a reference the data of the languages that have already +been added to the `languages` array. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app1.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app1.png new file mode 100644 index 00000000..67c75016 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app1.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app2.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app2.png new file mode 100644 index 00000000..6cabfe68 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app2.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/check.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/check.js new file mode 100644 index 00000000..b70f022d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/check.js @@ -0,0 +1,230 @@ +'use strict' + +const fs = require('fs'); + +///////////////////////////////////////////// +// Initial configuration +///////////////////////////////////////////// + +console.log('Starting to check the language files.', '\n'); + +// Load the current English file. +if (!fs.existsSync('en.json')) { + exitWithError('Unable to find the English language file.'); +} +let currentData = JSON.parse(fs.readFileSync('en.json', 'utf8')); + +// 2 charaters code of the languages that will be checked. +const langs = []; +// If false, the code will only verify the differences in the elements (ignoring its contents) of the +// base files and the files with the translations. If not, the code will also verify the differences +// in the elements and contents of the base files and the current English file. +let checkFull = false; + +// If a param was send, it must be "all" or the 2 charaters code of the language that must be checked. +// If a param is provided, checkFull is set to true. +if (process.argv.length > 2) { + if (process.argv.length > 3) { + exitWithError('Invalid number of parameters.'); + } + + if (process.argv[2] != 'all') { + if (process.argv[2].length !== 2) { + exitWithError('You can only send as parameter to this script the 2-letter code of one of the language files in this folder, or "all".'); + } + langs.push(process.argv[2]); + } + + checkFull = true; +} + +// If no language code was send as param, the code will check all languages. +if (langs.length === 0) { + let localFiles = fs.readdirSync('./'); + + const langFiles = []; + const langFilesMap = new Map(); + const baseLangFilesMap = new Map(); + localFiles.forEach(file => { + if (file.length === 12 && file.endsWith('_base.json')) { + langs.push(file.substring(0, 2)); + baseLangFilesMap.set(file.substring(0, 2), true); + } + if (file !== 'en.json' && file.length === 7 && file.endsWith('.json')) { + langFiles.push(file.substring(0, 2)); + langFilesMap.set(file.substring(0, 2), true); + } + }); + + langs.forEach(lang => { + if (!langFilesMap.has(lang)) { + exitWithError('The \"' + lang + '_base.json\" base file does not have its corresponding language file.'); + } + }); + + langFiles.forEach(lang => { + if (!baseLangFilesMap.has(lang)) { + exitWithError('The \"' + lang + '.json\" file does not have its corresponding base file.'); + } + }); + + if (langs.length === 0) { + exitWithError('No language files to check.'); + } +} + +console.log('Checking the following languages:'); +langs.forEach(lang => { + console.log(lang); +}); +console.log(''); + +///////////////////////////////////////////// +// Verifications +///////////////////////////////////////////// + +// The following arrays will contain the list of elements with problems. Each element of the +// arrays contains a "lang" property with the language identifier and a "elements" array with +// the path of the problematic elements. + +// Elements that are present in a base file but not in its corresponding translation file. +const baseFileOnly = []; +// Elements that are present in a translation file but not in its corresponding base file. +const translatedFileOnly = []; +// Elements that are present in the English file but not in the currently checked base translation file. +const enOnly = []; +// Elements that are present in the currently checked base translation file but not in the English file. +const translatedOnly = []; +// Elements that have different values in the currently checked base translation file and the English file. +const different = []; + +function addNewLangToArray(array, lang) { + array.push({ + lang: lang, + elements: [] + }); +} + +langs.forEach(lang => { + addNewLangToArray(baseFileOnly, lang); + addNewLangToArray(translatedFileOnly, lang); + addNewLangToArray(enOnly, lang); + addNewLangToArray(translatedOnly, lang); + addNewLangToArray(different, lang); + + // Try to load the translation file and its corresponding base file. + if (!fs.existsSync(lang + '.json')) { + exitWithError('Unable to find the ' + lang + '.json file.'); + } + let translationData = JSON.parse(fs.readFileSync(lang + '.json', 'utf8')); + + if (!fs.existsSync(lang + '_base.json')) { + exitWithError('Unable to find the ' + lang + '_base.json language file.'); + } + let baseTranslationData = JSON.parse(fs.readFileSync(lang + '_base.json', 'utf8')); + + // Check the differences in the elements of the translation file and its base file. + checkElement('', '', baseTranslationData, translationData, baseFileOnly, true); + checkElement('', '', translationData, baseTranslationData, translatedFileOnly, true); + + // Check the differences in the elements and content of the base translation file the English file. + if (checkFull) { + checkElement('', '', currentData, baseTranslationData, enOnly, false); + checkElement('', '', baseTranslationData, currentData, translatedOnly, true); + } +}); + + +// Check recursively if the elements and content of two language objects are the same. +// +// path: path of the currently checked element. As this function works with nested elements, +// the path is the name of all the parents, separated by a dot. +// key: name of the current element. +// fist: first element for the comparation. +// second: second element for the comparation. +// arrayForMissingElements: array in which the list of "fist" elements that are not in "second" +// will be added. +// ignoreDifferences: if false, each time the content of an element in "fist" is different to the +// same element in "second" that element will be added to the "different" array. +function checkElement(path, key, fist, second, arrayForMissingElements, ignoreDifferences) { + let pathPrefix = ''; + if (path.length > 0) { + pathPrefix = '.'; + } + + // This means that, at some point, the code found an element in the "first" branch that is + // not in the "second" branch. + if (second === undefined || second === null) { + arrayForMissingElements[arrayForMissingElements.length - 1].elements.push(path + pathPrefix + key); + return; + } + + if (typeof fist !== 'object') { + // If the current element is a string, compare the contents, but ony if ignoreDifferences + // is true. + if (!ignoreDifferences && fist != second) { + different[different.length - 1].elements.push(path + pathPrefix + key); + } + } else { + // If the current element is an object, check the childs. + Object.keys(fist).forEach(currentKey => { + checkElement(path + pathPrefix + key, currentKey, fist[currentKey], second[currentKey], arrayForMissingElements, ignoreDifferences); + }); + } +} + +///////////////////////////////////////////// +// Results processing +///////////////////////////////////////////// + +// Becomes true if any of the verifications failed. +let failedValidation = false; + +// If "failedValidation" is false, writes to the console the header of the error list +// and updates the value of "failedValidation" to true. +function updateErrorSumary() { + if (!failedValidation) { + failedValidation = true; + console.log('The following problems were found:', '\n'); + } +} + +// Checks all arrays for errors. This loop is for the languages. +for (let i = 0; i < baseFileOnly.length; i++) { + + // This loop if for checking all the arrays. + [baseFileOnly, translatedFileOnly, enOnly, translatedOnly, different].forEach((array, idx) => { + // If the array has elements, it means that errors were found. + if (array[i].elements.length > 0) { + updateErrorSumary(); + + // Show the appropriate error text according to the current array. + if (idx === 0) { + console.log('The \"' + baseFileOnly[i].lang + '_base.json\" base file has elements that are not present in \"' + baseFileOnly[i].lang + '.json\":'); + } else if (idx === 1) { + console.log("\"" + translatedFileOnly[i].lang + '.json\" has elements that are not present in the \"' + baseFileOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 2) { + console.log('The \"en.json\" file has elements that are not present in the \"' + enOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 3) { + console.log('The \"' + translatedOnly[i].lang + '_base.json\" base file has elements that are not present in \"en.json\":'); + } else if (idx === 4) { + console.log('The \"' + different[i].lang + '_base.json\" base file has values that do not match the ones in \"en.json\":'); + } + // Show all the elements with errors. + array[i].elements.forEach(element => console.log(element)); + console.log(''); + } + }); +} + +// If no error was detected, show a success message on the console. If not, exit with an error code. +if (!failedValidation) { + console.log('The verification passed without problems.'); +} else { + process.exit(1); +} + +function exitWithError(errorMessage) { + console.log('Error: ' + errorMessage) + process.exit(1); +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/en.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/en.json new file mode 100644 index 00000000..2026efdb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/en.json @@ -0,0 +1,626 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load", + "success": "Success", + "warning": "Warning", + "changes-made": "The changes have been made." + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a Skywallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the Skywallet options (by pressing the \"Skywallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Skywallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \"Skywallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the Skywallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "words-number": "How many word the seed has", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed.", + "synchronizing-warning-title": "Warning", + "synchronizing-warning-text": "The wallet is still synchronizing and some addresses may not be restored. If some addresses are not restored, please wait for the wallet to be fully synchronized and add them again manually.", + "synchronizing-warning-continue": "Continue", + "synchronizing-warning-cancel": "Cancel", + "wallet-created": "The wallet has been added to the list.", + + "seed": { + "enter-seed": "Press here to enter your seed.", + "change-seed": "Press to change", + "confirm-seed": "Press here to confirm your seed.", + "confirmed-seed": "Seed confirmed.", + "use-custom-seed": "Press here if you want to enter the seed manually.", + "use-normal-seed": "Press here if you want to enter the seed using the recommended method.", + "custom-seed-warning-title": "Warning", + "custom-seed-warning-text": "This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.", + "custom-seed-warning-text-recovering": "To avoid possible problems, this option should only be used if you want to recover an unconventional seed.", + "custom-seed-warning-check": "I understand the risks and want to continue", + "custom-seed-warning-cancel": "Cancel", + "custom-seed-warning-continue": "Continue", + "incorrect-word": "The word you have entered does not match the requested one.", + "invalid-seed": "The seed you have entered is not valid. Please try again.", + "enter-word": "Enter the word #{{number}}", + "new-seed-help": "You must enter the words of the seed that was generated by the system, to confirm it.", + "recover-seed-help": "Please be sure to enter the correct words in the correct order." + } + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create", + "error": "There was an unexpected error. Please try again." + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "qr": { + "title": "QR Code", + "title-read-only": "QR Code", + "data": "QR Data:", + "address": "Address:", + "request-link": "Request specific amount", + "amount": "Request amount:", + "hours": "Request hours:", + "message": "Message:", + "invalid": "(invalid value)", + "copied": "The text has been copied to the clipboard." + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "personal-note-label": "Personal note", + "personal-note-help": "Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "convert-confirmation": "Do you also want the already introduced amount to be converted from {{from}} to {{to}}?", + "convert-confirmation-plural": "Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?", + "send-all-available-coins": "send all", + "no-wallet-selected": "You must select a wallet first.", + "precision-error-warning": "A precision error was detected during conversion. Please check the amount that will be sent.", + "invaid-amount-warning": "An invalid value was detected during conversion. Please check the amount that will be sent.", + "precision-errors-warning": "Precision errors were detected during conversion. Please check the amount that will be sent.", + "invaid-amounts-warning": "Invalid values were detected during conversion. Please check the amount that will be sent.", + "multiple-problems-warning": "Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.", + "no-coins-left": "There are no coins left to send.", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to the recipients and less will be retained", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet", + "error-saving-note": "The transaction was successfully sent, but it was not possible to save the note.", + "sent": "Transaction successfully sent.", + "total": "Total:", + + "bulk-send": { + "title": "Bulk Send", + "indications": "To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \"xyz\" address, type \"xyz,10,5\"; if you want the hours to be calculated automatically, type \"xyz,10\". Decimal values must be separated with a dot.", + "process": "Process", + "error-no-data": "There is no text to process.", + "error-inconsistent-data": "If you set how many hours you want to send to a destinations, you must do so for all destinations.", + "error-invalid-data": "The entered text has an invalid format." + } + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset", + "done": "Password successfully changed." + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "note": "Note", + "without-note": "Without note", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "edit-note": { + "title": "Edit note", + "cancel-button": "Cancel", + "change-button": "Change" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "note": "Note", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New Skywallet", + "error-disconnected": "Unable to perform the operation. The Skywallet is not connected.", + "simple-error": "Error. Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid Skywallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected Skywallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is incorrect.", + "confirm": "Please confirm the operation on the Skywallet.", + "confirm-and-more": "Please confirm the operation on the Skywallet and follow the instructions displayed.", + "follow": "Please follow the instructions displayed on the Skywallet.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled.", + "name-updated": "The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device." + }, + "errors": { + "too-many-inputs-outputs": "The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.", + "daemon-connection": "Problem connecting to the Skywallet service.", + "timeout": "The operation was canceled due to inactivity. Please try again.", + "invalid-address-generated": "There was a problem with the address generator and the operation had to be canceled.", + "invalid-address": "Invalid address.", + "not-in-bootloader-mode": "To use this option the Skywallet must be in bootloader mode." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.", + "link": "Open the Skywallet options window.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No Skywallet detected. Please connect a Skywallet to use this option.", + "unconfigured-detected-title": "Unconfigured Skywallet", + "unconfigured-detected": "A seedless Skywallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it. Select \"Restore backup\" if you want to configure the Skywallet with a previously created seed backup.", + "configured-detected": "Skywallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "unchecked-version-warning": "It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.", + "outdated-version-warning": "The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \"Update firmware\" option.", + "backup-warning": "You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "update-firmware": "Update firmware", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "delete-pin": "Delete PIN code", + "forgotten-pin1": "If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking", + "forgotten-pin2": "here.", + "firmware-version": "Device firmware version:" + }, + "update-firmware-warning" : { + "title": "Outdated Firmware", + "text": "WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.", + "cancel": "Cancel", + "update": "Update" + }, + "update-firmware" : { + "title-connecting": "Connecting...", + "title-update": "Update Firmware", + "title-install": "Install Firmware", + "text-downloading": "Checking device and downloading files...", + "text-bootloader": "WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-not-bootloader": "To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-no-firmware": "Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.", + "check": "I understand the risks and want to continue", + "follow": "The firmware update has been sent to the Skywallet. Please continue the process on the device.", + "connection-error": "It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.", + "timeout": "The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.", + "finished": "Your device has been configured correctly. Please unplug it before continuing." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a Skywallet.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the Skywallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device.", + "correct-seed": "The seed is valid and matches the one in the device." + }, + "added" : { + "title": "New Skywallet", + "configuring": "New Skywallet detected. Configuring...", + "done": "Done", + "added1": "The connected Skywallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the Skywallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish.", + "characters-warning": "If you use non-standard English characters, the name may not be displayed correctly on the device.", + "ok": "Ok" + }, + "wipe" : { + "warning": "WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet funds, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word shown on the device", + "info2": "You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. The PINs you have entered do not match." + }, + "remove-pin" : { + "warning": "WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties in case of loss or theft.", + "check": "I understand the risks and want to continue" + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the Skywallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a secure PIN consisting of 4 to 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol •.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \"7\" and \"5\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet." + }, + "create-tx" : { + "title": "Create transaction", + "upper-text": "Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:", + "lower-text": "If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.", + "send-p1": "and", + "send-p2": "to" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the Skywallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the Skywallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.", + "user-deposit-timeout": "Order canceled due to inactivity", + "user-deposit-timeout-info": "The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address (valid for this exchange operation only)", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es.json new file mode 100644 index 00000000..8f9f20f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Cargando...", + "new": "Nueva", + "load": "Cargar" + }, + + "errors": { + "error": "Error", + "fetch-version": "No ha sido posible verificar la última versión desde Github", + "incorrect-password": "Contraseña incorrecta", + "error-decrypting": "Error al desencriptar la billetera", + "api-disabled": "API desabilitada", + "no-wallet": "La billetera no existe", + "no-outputs": "No hay salidas no gastadas", + "window-size": "La ventana es demasiado estrecha para el contenido" + }, + + "title": { + "language": "Seleccionar Lenguaje", + "wallets": "Billeteras", + "send": "Enviar", + "history": "Historial", + "buy-coin": "Comprar Skycoins", + "network": "Red", + "blockchain": "Blockchain", + "outputs": "Salidas", + "transactions": "Transacciones", + "pending-txs": "Transacciones Pendientes", + "backup": "Respaldar Billetera", + "explorer": "Explorador de Skycoin", + "seed": "Semilla de la Billetera", + "qrcode": "Código QR", + "reset": "Restablecer contraseña", + "exchange": "Intercambiar", + "select-address": "Seleccionar Dirección", + "order-history": "Historial de órdenes" + }, + + "header": { + "syncing-blocks": "Sincronizando bloques", + "update1": "La actualización", + "update2": "está disponible.", + "synchronizing": "El nodo está sincronizando. Los datos mostrados pueden estar desactualizados.", + "pending-txs1": "Hay una o más", + "pending-txs2": "transacciones pendientes.", + "pending-txs3": "Los datos mostrados pueden estar desactualizados.", + + "errors": { + "no-connections": "Sin conexiones activas, ¡el cliente no está conectado a otros nodos!", + "no-backend1": "Sin acceso al servidor. Por favor, reinicie la aplicación y/o contáctenos vía", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato." + } + }, + + "password": { + "title": "Introduzca Su Contraseña", + "label": "Contraseña", + "confirm-label": "Confirmar contraseña", + "button": "Continuar", + "reset-link": "He olvidado mi contraseña" + }, + + "buy": { + "deposit-address": "Seleccione una dirección para la cual generar un enlace de depósito BTC:", + "select-address": "Seleccione una dirección", + "generate": "Generar", + "deposit-location": "Localización de Depósito", + "deposit-location-desc": "Seleccione la billetera en la que desea que le depositemos sus Skycoins después de recibir los Bitcoins.", + "make-choice": "Realice una selección", + "wallets-desc": "Una nueva dirección BTC es generada cada vez que se selecciona una nueva billetera y dirección. Una única dirección de Skycoin puede tener asignadas hasta 5 direcciones BTC.", + "send": "Enviar Bitcoins", + "send-desc": "Envíe Bitcoins a la dirección abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva dirección en la billetera seleccionada más arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.", + "fraction-warning": "¡Envíe sólo múltiplos de la tasa SKY/BTC! Los Skycoins son enviados en números enteros, ¡no se envían fracciones de SKY!", + "receive": "Recibir SKY", + "receive-desc": "Después de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.", + "status-button": "Estatus:", + "check-status-button": "Revisar Estatus", + "new-order-button": "Nueva Orden" + }, + + "wizard": { + "wallet-desc": "Si no tiene una billetera, use la semilla generada automáticamente para crear una nueva. Si ya tiene una billetera, seleccione \"Cargar\" e introduzca su semilla.", + "encrypt-desc": "Incremente la seguridad de su billetera encriptándola. Al introducir una contraseña más abajo, su billetera será encriptada. Sólo quien tenga la contraseña podrá acceder a la billetera y retirar fondos.", + "hardware-wallet-link": "¿Utilizando una billetera de hardware?", + "finish-button": "Finalizar", + "back-button": "Volver", + + "confirm": { + "title": "¡Resguarde su semilla!", + "desc": "Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. ¡Si olvida su semilla, NO podrá recuperar su billetera!", + "checkbox": "Está segura, lo garantizo.", + "button": "Continuar" + } + }, + + "wallet": { + "new-address": "Nueva Dirección", + "new-addresses": "Nuevas Direcciones", + "show-empty": "Mostrar Vacías", + "hide-empty": "Ocultar Vacías", + "encrypt": "Encriptar Billetera", + "decrypt": "Desencriptar Billetera", + "decrypt-warning": "Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precaución.", + "delete" : "Borrar Billetera", + "edit": "Editar Billetera", + "add": "Agregar Billetera", + "load": "Cargar Billetera", + "encryption-enabled": "Encriptado habilitado", + "encryption-disabled": "Encriptado deshabilitado", + "hw-security-warning": "Posible riesgo de seguridad. Acceda a las opciones de la billetera de hardware (presionando el botón \"Billetera de Hardware\" debajo de la lista de billeteras) mientras el dispositivo está conectado, para más información.", + "wallet": "Billetera", + "hardware-wallet": "Billetera de Hardware", + "delete-confirmation": "ADVERTENCIA: la billetera \"{{ name }}\" será removida de la lista. Para agregarla nuevamente, deberá volver a conectar el dispositivo y abrir las opciones de la billetera del hardware (presionando el botón \"Billetera de hardware\" debajo de la lista de las billeteras). ¿Desea continuar?", + "delete-confirmation-check": "Sí, quiero borrar la billetera.", + "max-hardware-wallets-error": "Ya ha alcanzado el número máximo de direcciones que se puede agregar a la billetera de hardware.", + "add-many-confirmation": "ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las últimas y no las primeras, es posible que algunas direcciones no se recuperen automáticamente si intenta restaurar la billetera con la semilla (tendrá que agregarlas manualmente). ¿Desea continuar?", + + "new": { + "create-title": "Crear Billetera", + "load-title": "Cargar Billetera", + "encrypt-title": "Encriptar la billetera", + "name-label": "Nombre", + "seed-label": "Semilla", + "confirm-seed-label": "Confirmar semilla", + "seed-warning": "¡Recuerde esta semilla! Manténgala en un lugar seguro. ¡Si olvida su semilla, no podrá recuperar la billetera!", + "create-button": "Crear", + "load-button": "Cargar", + "cancel-button": "Cancelar", + "12-words": "12 palabras", + "24-words": "24 palabras", + "generate-12-seed": "Generar una semilla de 12 palabras", + "generate-24-seed": "Generar una semilla de 24 palabras", + "encrypt": "Encriptar billetera", + "encrypt-warning": "Le sugerimos que encripte con una contraseña cada una de sus billeteras. Si olvida su contraseña, puede restaurarla con la semilla. Asegúrese de guardar su semilla en un lugar seguro antes de encriptar la billetera.", + "unconventional-seed-title": "Posible error", + "unconventional-seed-text": "Usted introdujo una semilla no convencional. Si lo hizo por alguna razón en especial, puede continuar (sólo recomendable para usuarios avanzados). Sin embargo, si su intención es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.", + "unconventional-seed-check": "Continuar con la semilla no convencional." + }, + + "rename": { + "title": "Renombrar Billetera", + "name-label": "Nombre", + "cancel-button": "Cancelar", + "rename-button": "Renombrar" + }, + + "add-addresses": { + "title": "Seleccionar cantidad", + "name-quantity": "Cantidad de direcciones a crear", + "cancel-button": "Cancelar", + "create-button": "Crear" + }, + + "address": { + "show": "Presione para mostrar", + "copy": "Copiar", + "copy-address": "Copiar Dirección", + "copied": "¡Copiado!", + "confirm": "Confirmar Dirección", + "outputs": "Salidas No Gastadas", + "history": "Historial" + } + }, + + "send": { + "synchronizing-warning": "La billetera todavía está sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. ¿Seguro de que desea continuar?", + "from-label": "Enviar desde", + "to-label": "Enviar a", + "amount-label": "Cantidad", + "notes-label": "Notas", + "wallet-label": "Billetera", + "addresses-label": "Dirección", + "invalid-amount": "Por favor introduzca una cantidad válida", + "addresses-help": "Limite las direcciones desde donde se podrían enviar las monedas y las horas", + "all-addresses": "Todas las direcciones de la billetera seleccionada", + "outputs-label": "Salidas no gastadas", + "outputs-help": "Limite las salidas no gastadas desde donde se podrían enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.", + "all-outputs": "Todas las salidas no gastadas de las direcciones seleccionadas", + "available-msg-part1": "Con su selección actual puede enviar hasta", + "available-msg-part2": "y", + "available-msg-part3": "(al menos", + "available-msg-part4": "deben ser utilizadas para la tarifa de transacción).", + "change-address-label": "Dirección de retorno personalizada", + "change-address-select": "Seleccionar", + "change-address-help": "Dirección para recibir el cambio. Si no se proporciona, será elegida automáticamente. Haga clic en el enlace \"Seleccionar\" para elegir una dirección de una de sus billeteras", + "destinations-label": "Destinos", + "destinations-help1": "Direcciones de destino y sus monedas", + "destinations-help2": "Direcciones de destino, sus monedas y coin hours", + "hours-allocation-label": "Distribución automática de coin hours", + "options-label": "Opciones", + "value-label": "Factor de distribución de las coin hours", + "value-help": "Mientras mayor sea el valor, más coin hours se enviarán a las salidas", + "preview-button": "Preview", + "send-button": "Enviar", + "back-button": "Volver", + "simple": "Simple", + "advanced": "Advanzado", + "select-wallet": "Seleccionar Billetera" + }, + + "reset": { + "wallet-label": "Billetera", + "seed-label": "Semilla de la billetera", + "password-label": "Nueva contraseña (deje en blanco si desea que la billetera no esté encriptada)", + "confirm-label": "Confirme la contraseña", + "reset-button": "Restaurar" + }, + + "tx": { + "transaction": "Transacción", + "confirm-transaction": "Confirmar Transacción", + "from": "Desde", + "to": "A", + "date": "Fecha", + "status": "Estatus", + "coins": "Monedas", + "hours": "Horas", + "id": "Tx ID", + "show-more": "Mostrar más", + "hours-moved": "movida(s)", + "hours-sent": "enviada(s)", + "hours-received": "recibida(s)", + "hours-burned": "quemada(s)", + "inputs": "Entradas", + "outputs": "Salidas", + "confirmed": "Confirmada", + "pending": "Pendiente", + "current-rate": "Calculado a la tasa actual" + }, + + "backup": { + "wallet-directory": "Directorio de la Billetera:", + "seed-warning": "RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podrá recuperar las monedas.", + "desc": "Use la tabla de más abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de más arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.", + "close-button": "Cerrar", + "wallet": "Nombre de la Billetera", + "filename": "Archivo", + "seed": "Semilla", + "show-seed": "Mostrar semilla", + "no-wallets": "No hay billeteras encriptadas" + }, + + "blockchain": { + "blocks": "Cantidad de bloques", + "time": "Fecha del último bloque", + "hash": "Hash del último bloque", + "current-supply": "Suministro de SKY actual", + "total-supply": "Suministro de SKY total", + "current-coinhour-supply": "Suministro de Coin Hours actual", + "total-coinhour-supply": "Suministro de Coin Hours total" + }, + + "network": { + "peer": "Par", + "source": "Fuente", + "block-height": "Altura del bloque", + "block-height-short": "Bloque", + "last-seen": "Última vez visto", + "last-received": "Última recepción", + "last-sent": "Último envío", + "in": "Entrante", + "out": "Saliente", + + "sources": { + "default": "Par por defecto", + "exchange": "Intercambio de pares" + } + }, + + "pending-txs": { + "timestamp": "Fecha", + "txid": "ID de la transacción", + "none": "Actualmente no hay transacciones pendientes", + "my": "Mías", + "all": "Todas" + }, + + "history": { + "tx-detail": "Detalles de la Transacción", + "moving": "Moviendo internamente", + "moved": "Movida internamente", + "sending": "Enviando", + "sent": "Enviada", + "received": "Recibida", + "receiving": "Recibiendo", + "pending": "Pendiente", + "no-txs": "Usted no tiene historial de transacciones", + "no-txs-filter": "No hay transacciones que coincidan con los criterios de filtro actuales", + "no-filter": "Sin filtros activos (Presione para seleccionar billeteras/direcciones)", + "filter": "Filtro activo: ", + "filters": "Filtros activo: ", + "all-addresses": "Todas las direcciones" + }, + + "teller": { + "done": "Completado", + "waiting-confirm": "Esperando confirmación", + "waiting-deposit": "Esperando depósito de Bitcoins", + "waiting-send": "Esperando para envíar Skycoins", + "unknown": "Desconocido" + }, + + "confirmation" : { + "header-text": "Confirmación", + "confirm-button": "Sí", + "cancel-button": "No", + "close": "Cerrar" + }, + + "service": { + "api" : { + "server-error": "Error de servidor" + }, + "wallet": { + "not-enough-hours": "¡No cuenta con suficientes Coin Hours para realizar la operación!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "Nueva billetera de hardware", + "error-disconnected": "No se puede realizar la operación. La billetera de hardware no está conectada.", + "simple-error": "Error, no se puede realizar la operación.", + "generic-error": "No se puede realizar la operación. Asegúrese de haber conectado una billetera de hardware válida y de que no esté esperando por alguna confirmación o respuesta.", + "generic-error-internet": "No se puede realizar la operación. Asegúrese de haber conectado una billetera de hardware válida que no esté esperando por alguna confirmación o respuesta y de que su equipo cuente con conexión a internet y al nodo.", + "error-incorrect-wallet": "No se puede realizar la operación. La billetera de hardware conectada es diferente a la esperada.", + "error-incorrect-pin": "No se puede realizar la operación. El PIN que ha introducido no es correcto.", + "confirm": "Por favor, confirme la operación en la billetera de hardware.", + "confirm-and-more": "Por favor, confirme la operación en la billetera de hardware y siga las instrucciones.", + "close": "Cerrar", + "cancel": "Cancelar", + "continue": "Continuar", + "completed": "La operación se realizó con éxito.", + "refused": "La operación falló o fue cancelada." + }, + "errors": { + "too-many-inputs": "La transacción tiene demasiadas entradas y no se puede procesar. Por favor, póngase en contacto con el soporte técnico.", + "too-many-outputs": "La transacción tiene demasiadas salidas y no se puede procesar. Por favor, póngase en contacto con el soporte técnico." + }, + "security-warning" : { + "title": "Advertencia de seguridad", + "text": "La última vez que se conectó esta billetera de hardware, se encontraron una o más advertencias de seguridad. Le recomendamos que abra las opciones de billetera de hardware (presionando el botón \"Billetera de hardware\" debajo de la lista de billeteras) mientras el dispositivo está conectado y resuelva los problemas de seguridad antes de continuar.", + "check": "Entiendo los riesgos y deseo continuar.", + "continue": "Continuar", + "cancel": "Cancelar" + }, + "options" : { + "connecting": "Conectando...", + "disconnected": "Billetera de hardware no detectada. Por favor, conecte una billetera de hardware para usar esta opción.", + "unconfigured-detected-title": "Billetera de hardware no configurada", + "unconfigured-detected": "Se ha detectado una billetera de hardware sin semilla. Seleccione \"Configurar automáticamente\" si desea configurarla como una billetera nueva y comenzar a usarla inmediatamente, o seleccione \"Restaurar una copia de seguridad\" si desea configurarla con la copia de seguridad de una semilla creada anteriormente y así poder acceder a sus fondos de nuevo.", + "configured-detected": "Billetera de hardware detectada. El dispositivo se identifica en la lista de billeteras como:", + "security-warnings-title": "Advertencias de seguridad", + "security-warning-title": "Advertencia de seguridad", + "backup-warning": "Debe hacer una copia de seguridad de la semilla de la billetera de hardware o podría perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opción \"Crear copia de seguridad\".", + "pin-warning": "La billetera de hardware conectada no tiene un PIN. El código PIN protege la billetera de hardware en caso de pérdida, robo y pirateo. Para crear un código PIN, seleccione la opción \"Crear código PIN\".", + "options": "Opciones:", + "configure-automatically": "Configurar automáticamente", + "restore-backup": "Restaurar una copia de seguridad", + "create-backup": "Crear copia de seguridad", + "wipe": "Borrar el dispositivo", + "confirm-seed": "Confirmar la semilla", + "create-pin": "Crear código PIN", + "change-pin": "Cambiar el código PIN", + "forgotten-pin1": "Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la billetera del hardware y luego restaurarla con la semilla haciendo clic", + "forgotten-pin2": "aquí." + }, + "generate-seed" : { + "text": "Antes de continuar, puede seleccionar el número de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una razón especial para seleccionar uno u otro, puede dejar el valor predeterminado.", + "configuring": "Configurando..." + }, + "restore-seed" : { + "text": "Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.", + "check-text": "Puede usar esta opción para ingresar una semilla y verificar si es igual a la de la billetera de hardware. Antes de comenzar, seleccione el número de palabras de la semilla que desea verificar.", + "warning" : "ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una billetera de hardware de la misma marca/modelo.", + "error-wrong-word": "Error: la palabra introducida no coincide con la solicitada por la billetera de hardware.", + "error-invalid-seed": "Error: La semilla no es válida. Por favor, asegúrese de ingresar las palabras correctas en el orden correcto.", + "error-wrong-seed": "Error: la semilla es válida pero no coincide con la del dispositivo." + }, + "added" : { + "title": "Nueva Billetera de Hardware", + "configuring": "Nueva billetera de hardware detectada. Configurando...", + "done": "Hecho", + "added1": "La billetera de hardware conectada se ha agregado a la lista de billeteras con el siguiente nombre:", + "added2": "Ahora puede consultar el saldo y las direcciones de la billetera de hardware incluso cuando no está conectada. Además, puede cambiar el nombre de la billetera o eliminarla de la lista de billeteras, si lo desea." + }, + "wipe" : { + "warning": "ADVERTENCIA: Todos los datos en la billetera de hardware serán eliminados. Si no tiene una copia de seguridad, no podrá volver a acceder a sus fondos.", + "confirm-delete": "Quitar también de la lista de billeteras." + }, + "create-backup" : { + "warning": "ADVERTENCIA: Solo puede usar esta opción para hacer una copia de seguridad de la semilla de su billetera de hardware una vez. Si decide continuar, tendrá que escribir un grupo de palabras (se recomienda hacerlo en papel y no en una computadora) que aparecerán en la pantalla de la billetera de hardware y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la \"semilla\") podrá acceder a los fondos de la cartera, por lo que se recomienda extremar las precauciones.", + "instructions": "Escriba la lista de palabras que aparecen en la pantalla de la billetera de hardware. Asegúrate de respetar el orden y escribir cada palabra correctamente." + }, + "seed-word" : { + "title": "Ingresar palabra", + "info1": "Introduzca la palabra indicada en el dispositivo", + "info2": "Se le pedirá que ingrese las palabras de su semilla de respaldo en orden aleatorio, más algunas palabras adicionales.", + "word": "Palabra solicitada", + "error-invalid-word": "La palabra introducida no es válida.", + "error-loading-words": "Cargando la lista de palabras. Por favor espere." + }, + "change-pin" : { + "pin-mismatch": "No se puede realizar la operación. Los dos PIN que ha introducido no coinciden." + }, + "enter-pin" : { + "title": "Ingresar PIN", + "title-change-current": "Ingrese el PIN actual", + "title-change-new": "Ingrese el nuevo PIN", + "title-change-confirm": "Confirme el nuevo PIN", + "instructions": "El patrón de números del PIN se muestra en la pantalla de la billetera de hardware.", + "instructions-tx": "Introduzca el PIN para confirmar y firmar la transacción.", + "instructions-change": "Ingrese un PIN difícil de adivinar de entre 4 y 8 números.", + "help": "¿Necesita ayuda?" + }, + "pin-help" : { + "title": "Ayuda", + "part1": "Cuando sea necesario ingresar el PIN para continuar, la pantalla de la billetera del hardware mostrará una matriz de 9 casillas con números en orden aleatorio (el orden cambia cada vez) y se le pedirá que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el símbolo #.", + "part2": "Para ingresar el PIN, mire la posición de los números del PIN en la matriz de números en la pantalla de la billetera de hardware y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es \"23\", el número 2 está en la esquina superior izquierda y el número 3 en el centro de la matriz de números de billetera de hardware, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.", + "part3": "Si lo desea, también puede usar el teclado numérico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es \"23\", no puede simplemente escribir \"23\" con el teclado numérico, sino que deberá presionar las teclas que están en la posición donde están los números 2 y 3 en la pantalla de la billetera de hardware." + }, + "create-tx" : { + "title": "Crear transacción" + }, + "confirm-address" : { + "title": "Confirmar dirección", + "instructions": "Por favor confirme en la billetera de hardware si la dirección es:", + "short-confirmation": "Dirección confirmada.", + "confirmation": "Dirección confirmada. Por seguridad, puede volver a mostrar la dirección en la billetera de hardware usando la opción \"Confirmar dirección\", en el menú que puede mostrar presionando el botón a la derecha del balance de la direccion." + } + }, + + "time-from-now": { + "few-seconds": "hace pocos segundos", + "minute": "hace un minuto", + "minutes": "hace {{time}} minutos", + "hour": "hace una hora", + "hours": "hace {{time}} horas", + "day": "hace un día", + "days": "hace {{time}} días" + }, + + "exchange": { + "you-send": "Usted envía", + "you-get": "Usted recibe (aprox.)", + "to-address": "A la dirección de {{coin}}", + "price": "Tasa de cambio", + "time-15": "Duración del intercambio", + "exchange-button": "Intercambiar", + "min-amount": "Monto minimo:", + "max-amount": "Monto maximo:", + "agree-1": "Acepto los", + "agree-2": "Términos de Uso", + "agree-3": "y la ", + "agree-4": "Política de Privacidad", + "powered-by": "Manejado por", + "need-help": "¿Necesita ayuda?", + "support-portal": "Portal de soporte", + "history": "Historial de órdenes", + "order-not-found": "Orden no encontrada", + "status": "Estado", + "exchanging": "Intercambiando {{from}} por {{to}}", + "select": "Seleccionar", + "offline": "El servicio está temporalmente offline", + "problem-connecting": "No se puede conectar con el servicio. Por favor, compruebe su conexión a Internet y vuelva a intentarlo más tarde.", + "invalid-address": "Dirección inválida.", + "statuses": { + "user-waiting": "Esperando el deposito. Por favor, envíe {{amount}} {{from}} a la dirección de intercambio indicada más abajo", + "user-waiting-info": "El sistema está a la espera de que realice el depósito en la dirección de intercambio. El proceso de intercambio comenzará después de que se detecte el depósito y sea confirmado en la cadena de bloques. Si ya ha realizado el depósito, debería ser detectado en breve.", + "market-waiting-confirmations": "Esperando las confirmaciones de la transacción", + "market-waiting-confirmations-info": "El depósito ya ha sido detectado y el sistema está esperando que sea confirmado en la cadena de bloques.", + "market-confirmed": "Transacción aceptada", + "market-confirmed-info": "La transacción ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.", + "market-exchanged": "{{from}} intercambiado por {{to}}", + "market-exchanged-info": "El intercambio se ha realizado. Los fondos serán transferidos a su dirección en un momento.", + "market-withdraw-waiting": "Enviando {{to}} a su dirección", + "market-withdraw-waiting-info": "Se ha iniciado el proceso para enviar las monedas a su dirección.", + "complete": "¡Intercambio completado!", + "complete-info": "Los fondos han sido enviados con éxito a su dirección.", + "error": "Se produjo un error", + "error-info": "Hubo un error en la operación, puede encontrar más información más abajo. Si necesita ayuda, por favor guarde todos los datos de operación que se muestran más abajo y comuníquese con soporte técnico utilizando el enlace que se encuentra en la parte inferior derecha de esta página." + }, + "history-window": { + "address": "Dirección", + "date": "Fecha" + }, + "details": { + "exchange-addr": "Dirección de intercambio", + "exchange-addr-tag": "Payment ID o Destination Tag que debe usarse para la transacción", + "tx-id": "ID de la transacción", + "order-id": "ID de la orden", + "initial-price": "Tasa de cambio inicial", + "error-msg": "Mensaje de error", + "details": "Detalles", + "start-date": "Fecha de inicio", + "back": "Volver", + "back-alert": "La operación aún está en progreso. ¿Realmente desea volver al formulario? Puede ver el progreso de esta operación nuevamente presionando el botón \"Historial de pedidos\"" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es_base.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es_base.json new file mode 100644 index 00000000..402d23ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es_base.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a hardware wallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Hardware Wallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the hardware wallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create" + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet" + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New hardware wallet", + "error-disconnected": "Unable to perform the operation. The hardware wallet is not connected.", + "simple-error": "Error, Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected hardware wallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is not correct.", + "confirm": "Please, confirm the operation in the hardware wallet.", + "confirm-and-more": "Please, confirm the operation in the hardware wallet and follow the instructions.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled." + }, + "errors": { + "too-many-inputs": "The transaction has too many inputs and can not be processed. Please contact technical support.", + "too-many-outputs": "The transaction has too many outputs and can not be processed. Please contact technical support." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected and solve the security problems before continuing.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No hardware wallet detected. Please connect a hardware wallet to use this option.", + "unconfigured-detected-title": "Unconfigured hardware wallet", + "unconfigured-detected": "A seedless hardware wallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it immediately, or select \"Restore backup\" if you want to configure it with a previously created seed backup and thus be able to access your funds again.", + "configured-detected": "Hardware wallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "backup-warning": "You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "forgotten-pin1": "If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking", + "forgotten-pin2": "here." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the hardware wallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device." + }, + "added" : { + "title": "New Hardware Wallet", + "configuring": "New hardware wallet detected. Configuring...", + "done": "Done", + "added1": "The connected hardware wallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish." + }, + "wipe" : { + "warning": "WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet balance, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word indicated in the device", + "info2": "You will be asked to enter the words of your backup seed in random order, plus a few additional words.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. Two PINs you have entered do not match." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the hardware wallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a hard-to-guess PIN of between 4 and 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet." + }, + "create-tx" : { + "title": "Create transaction" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the hardware wallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the hardware wallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/ru.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/ru.json new file mode 100644 index 00000000..69cd50e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/ru.json @@ -0,0 +1,250 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "CH", + "loading": "Загрузка...", + "new": "Ðовый", + "load": "Импортировать" + }, + + "errors": { + "fetch-version": "Ðе удалоÑÑŒ получить поÑледнюю верÑию Ñ Github", + "incorrect-password": "Ðеверный пароль", + "api-disabled": "API выключен", + "no-wallet": "Кошелёк не ÑущеÑтвует", + "no-outputs": "Ðе доÑтаточно ÑредÑтв" + }, + + "title": { + "wallets": "Кошельки", + "send": "Отправить", + "history": "ИÑториÑ", + "buy-coin": "Купить Skycoin", + "network": "Сеть", + "blockchain": "Блокчейн", + "outputs": "Выходы (Outputs)", + "transactions": "Транзакции", + "pending-txs": "Ðеподтверждённые транзакции", + "backup": "Резервное копирование", + "explorer": "Skycoin ÑкÑплорер", + "seed": "Фраза воÑтановлениÑ", + "qrcode": "QR-код" + }, + + "header": { + "syncing-blocks": "Идёт ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²...", + "update1": "Обновление кошелька", + "update2": "доÑтупно.", + "pending-txs1": "СущеÑтвует", + "pending-txs2": "транзакции, требующие подтверждениÑ.", + "pending-txs3": "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не актуальной. УбедитеÑÑŒ что у Ð²Ð°Ñ Ð¿Ñ€Ð¸ÑутÑтвует Ñоединение Ñ Ñетью.", + + "errors": { + "no-connections": "Ðет активных Ñоединений, ваш клиент не подключен к другим узлам!", + "no-backend1": "Ðет доÑтупа к ÑервиÑу. ПерезапуÑтите приложение или обратитÑеь за помощью в нашей группе", + "no-backend2": "в телеграмме.", + "no-backend3": "", + "csrf": "Возможные уÑзвимоÑти безопаÑноÑти: CSRF не работает." + } + }, + + "password": { + "title": "Введите пароль", + "label": "Пароль", + "confirm-label": "Подтвердите пароль", + "button": "Продолжить" + }, + + "buy": { + "deposit-address": "Выберите кошелёк Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ депозитного адреÑа:", + "select-address": "Выберите адреÑ", + "generate": "Сгенерировать", + "deposit-location": "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ", + "deposit-location-desc": "Выберите кошелёк Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Skycoin, поÑле уÑпешно отправленного депозита.", + "make-choice": "Сделайте выбор", + "wallets-desc": "При выборе адреÑа, каждый раз генерируетÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð´ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð°. Один Ð°Ð´Ñ€ÐµÑ Ð¼Ð¾Ð¶ÐµÑ‚ быть прикреплён к ограниченному количеÑтву адреÑов.", + "send": "Пошлите выбранную криптовалюту", + "send-desc": "Отправьте выбранную вами криптовалюту на Ð°Ð´Ñ€ÐµÑ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹Ð¹ ниже. По получению и поÑле доÑтаточного Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð², вы получите Skycoin на указаный Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾ курÑу {{ rate }} Skycoin/Selected Coin.", + "fraction-warning": "Рекомендовано поÑылать целые значениÑ.", + "receive": "Получить Skycoin", + "receive-desc": "ПоÑле Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ криптавалюты, вы получите Skycoin. Это может занÑÑ‚ÑŒ от неÑкольких Ñекунд до неÑкольких дней, в завиÑимоÑти от выбранного ÑпоÑоба оплаты и загруженноÑти Ñети.", + "status-button": "СтатуÑ:", + "check-status-button": "Проверить ÑтатуÑ", + "new-order-button": "Ðовый заказ", + "refresh": "Обновить", + "available-now": "ДоÑтупно:", + "choose-preference": "Выберите ÑпоÑоб оплаты. Имейте в виду, что некоторые ÑпоÑобы могут быть временно отключены.", + "choose": "Выберите вашу любимую крипту ;)", + "send-coin":"Отправить", + "send-coin-text-1": "на Ð°Ð´Ñ€ÐµÑ Ð½Ð¸Ð¶Ðµ. ПоÑле доÑтаточного количеÑтва подтверждений на блокчейне, вы получите Skycoin на выбранный вами кошелёк по курÑу" + }, + + "wizard": { + "wallet-desc": "ЕÑли у Ð²Ð°Ñ Ð½ÐµÑ‚ кошелька Skycoin, иÑпользуйте Ñгенерированную фразу Ð´Ð»Ñ ÐµÐ³Ð¾ ÑозданиÑ. ЕÑли фраза у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ, нажмите \"Импортирование кошелька\" и введите вашу фразу.", + "encrypt-desc": "Ð”Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ безопаÑти, рекомендуем добавить пароль Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. СредÑтва можно будет отправлÑÑ‚ÑŒ только при наличии паролÑ. УбедитеÑÑŒ, что вы его помните.", + "finish-button": "Закончить", + "back-button": "Ðазад", + + "confirm": { + "title": "Держите Ñвою фразу в Ñохраном меÑте!", + "desc": "УбедитеÑÑŒ, что вы запиÑали фразу воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ держите её в надёжном меÑте. При утере фразы вы потерÑете доÑтуп к вашему кошельку Skycoin!", + "checkbox": "КлÑнуÑÑŒ. Я запиÑал.", + "button": "Продолжить" + } + }, + + "wallet": { + "new-address": "Ðовый адреÑ", + "show-empty": "Показать пуÑтые", + "hide-empty": "Скрыть пуÑтые", + "encrypt": "Зашифровать кошелёк", + "decrypt": "РаÑшифровать кошелёк", + "edit": "Редактирвоать", + "add": "Ðовый кошелёк", + "load": "Импортировать", + "encryption-enabled": "Зашифрован", + "encryption-disabled": "Без шифрованиÑ", + "wallet": "Кошелёк", + + "new": { + "create-title": "Создать кошелёк", + "load-title": "Импортировать кошелёк", + "encrypt-title": "Шифровать кошелёк", + "name-label": "Ð˜Ð¼Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°", + "seed-label": "Фраза воÑтановлениÑ", + "confirm-seed-label": "Подтвердите фразу", + "seed-warning": "Запомните Ñта фразу или запишите и держите в надежном меÑте, в дали от чужих глаз. При потере фразы вы не Ñможете воÑтановить Skycoin кошелёк!", + "create-button": "Создать", + "load-button": "Импортировать", + "cancel-button": "Отмена", + "12-words": "12 Ñлов", + "24-words": "24 Ñлова", + "generate-12-seed": "Сгенирировать фразу из 12 Ñлов", + "generate-24-seed": "Сгенирировать фразу из 24 Ñлов", + "encrypt": "Включить шифрование", + "encrypt-warning": "Мы рекомендуем шифровать вÑе ваши кашельки при помощи надёжного паролÑ. Так же убедитеÑÑŒ, что фраза воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñана и хранитÑÑ Ð² надёжном меÑте." + }, + + "rename": { + "title": "Переименование кошелька", + "name-label": "ИмÑ", + "cancel-button": "Отмена", + "rename-button": "Переименовать" + }, + + "address": { + "copy": "Копировать", + "copy-address": "Копировать адреÑ", + "copied": "Скопировано!", + "outputs": "Ðепотраченые выходы (Unspent Outputs)" + } + }, + + "send": { + "from-label": "Отправить Ñ", + "to-label": "Получить на", + "amount-label": "Сумма", + "notes-label": "Заметки", + "wallet-label": "Кошелёк", + "addresses-label": "ÐдреÑ", + "addresses-help": "ÐÐ´Ñ€ÐµÑ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ° Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "change-address-label": "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñтатка", + "change-address-help": "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ñдачи. ЕÑли вы его не укажите, то он будет выбран автоматичеÑки", + "destinations-label": "ÐдреÑа получателей", + "destinations-help1": "ÐдреÑа получателей и Ñумма Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "destinations-help2": "ÐдреÑа получателей, Ñумма Skycoin & CH Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "hours-allocation-label": "ÐвтоматичеÑки подÑчитывать чаÑÑ‹ (CH)", + "options-label": "Дополнительно", + "value-label": "Фактор отправки чаÑов (CH)", + "value-help": "Чем больше фактор, тем больше CH будет отправлено вмеÑте Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÐµÐ¹", + "preview-button": "ПредпроÑмотр", + "send-button": "Отправить", + "back-button": "Ðазад", + "simple": "Обычный", + "advanced": "Продвинутый" + }, + + "tx": { + "transaction": "ТранзакциÑ", + "confirm-transaction": "Подтердите транзакцию", + "from": "Отправитель", + "to": "Получатель", + "date": "Дата", + "status": "СтатуÑ", + "coins": "Сумма", + "hours": "ЧаÑÑ‹", + "id": "TX ID", + "show-more": "Инфо", + "hours-sent": "отправлÑем", + "hours-burned": "Ñжигаем", + "inputs": "Входы", + "outputs": "Выходы", + "confirmed": "Подтверждена", + "pending": "Ожидание", + "current-rate": "По текущему курÑу" + }, + + "backup": { + "wallet-directory": "Папка кошелька:", + "seed-warning": "ДЕРЖИТЕ ФРÐЗУ ВОСТÐÐОВЛЕÐИЯ Ð’ ÐÐДÐЖÐОМ МЕСТЕ. ÐРБУМÐГЕ. ОФФЛÐЙÐ. ЕÑли вы держите фразу в надёжном меÑте, и никто не Ñмог её подглÑдеть - вашы токены в безопаÑноÑти.", + "desc": "Из таблицы ниже вы можете получить фразы Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… зашифрованных кошельков.
Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ„Ñ€Ð°Ð· воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² кошельках без шифрованиÑ, откройте папку указаную выше и найдите в ней файлы Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸ÐµÐ¼ .wlt. Фраза хранитÑÑ Ð² них. Откройте при помощи любого (надёжного) текÑтового редактора", + "close-button": "Закрыть", + "wallet": "Ðазвание кошелька", + "filename": "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°", + "seed": "Фраза", + "show-seed": "Показать фразу", + "no-wallets": "Кошельков Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ нет" + }, + + "blockchain": { + "blocks": "КоличеÑтво блоков", + "time": "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего блока", + "hash": "Ð¥Ñш поÑледнего блока", + "current-supply": "Ð’Ñего Skycoin в обращении", + "total-supply": "Ð’Ñего Skycoin ÑущеÑтвует", + "current-coinhour-supply": "Ð’Ñего CH в обращении", + "total-coinhour-supply": "Ð’Ñего CH ÑущеÑтвует" + }, + + "network": { + "peer": "Пир (Peer)", + "source": "ИÑточник", + "block-height": "Ð’Ñ‹Ñота блока", + "last-seen": "ПоÑледний блок", + "last-received": "ПоÑледний полученый", + "last-sent": "ПоÑледний отправленый", + "in": "ВходÑщие", + "out": "ИÑходÑщие", + + "sources": { + "default": "Пир по-умолчанию", + "exchange": "Обмена пирами" + } + }, + + "pending-txs": { + "timestamp": "Метка времени", + "txid": "ID транзакции", + "none": "Ðе найдено траназкций ждущих подтверждений", + "my": "Мой", + "all": "Ð’Ñе" + }, + + "history": { + "tx-detail": "Детали о транзакции", + "sending": "ОтправлÑем", + "sent": "Отправлено", + "received": "Получено", + "receiving": "Получаем", + "pending": "ОжидаетÑÑ", + "no-txs": "У Ð²Ð°Ñ Ð½ÐµÑ‚ иÑтории транзакций" + }, + + "teller": { + "done": "Завершено", + "waiting-confirm": "Ожидаем подтверждений", + "waiting-deposit": "Ожидаем депозит", + "waiting-send": "ПоÑылаем Skycoin", + "unknown": "ÐеизвеÑтно" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh.json new file mode 100644 index 00000000..9990b312 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "å¸æ—¶", + "usd": "美元", + "loading": "加载中...", + "new": "æ–°", + "load": "加载" + }, + + "errors": { + "error": "错误", + "fetch-version": "无法从Github获å–最新版本", + "incorrect-password": "密ç é”™è¯¯", + "error-decrypting": "解密钱包时出错", + "api-disabled": "APIç¦ç”¨", + "no-wallet": "æ— å¯æ”¯ä»˜é’±åŒ…", + "no-outputs": "无未交易输出", + "window-size": "窗å£å¤ªçª„,内容放ä¸ä¸‹" + }, + + "title": { + "language": "选择语言", + "wallets": "钱包", + "send": "å‘é€", + "history": "历å²", + "buy-coin": "ä¹° Skycoin", + "network": "网络", + "blockchain": "区å—链", + "outputs": "未交易输出", + "transactions": "交易", + "pending-txs": "待处ç†äº¤æ˜“", + "backup": "备份钱包", + "explorer": "Skycoin Explorer", + "seed": "钱包ç§å­", + "qrcode": "QR代ç ", + "reset": "é‡ç½®å¯†ç ", + "exchange": "交易", + "select-address": "选择地å€", + "order-history": "订å•åŽ†å²" + }, + + "header": { + "syncing-blocks": "区å—åŒæ­¥ä¸­", + "update1": "钱包更新", + "update2": "å¯èŽ·å–", + "synchronizing": "钱包正在åŒæ­¥ã€‚你看到的数æ®å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。", + "pending-txs1": "这里有一些", + "pending-txs2": "待处ç†äº¤æ˜“.", + "pending-txs3": "你看到的数æ®å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。", + + "errors": { + "no-connections": "没有连接,你的客户端没有连接到任何其他节点", + "no-backend1": "ä¸èƒ½åˆ°è¾¾åŽç«¯ã€‚请é‡æ–°å¯åŠ¨åº”用程åºæˆ–寻求我们的帮助", + "no-backend2": "Telegram", + "no-backend3": "", + "csrf": "安全æ¼æ´ž: CSRF未工作,请立å³é€€å‡ºã€‚" + } + }, + + "password": { + "title": "输入密ç ", + "label": "密ç ", + "confirm-label": "确认密ç ", + "button": "继续", + "reset-link": "我忘记了密ç " + }, + + "buy": { + "deposit-address": "选择一个地å€æ¥ç”ŸæˆBTC充值链接,用于:", + "select-address": "选择地å€", + "generate": "生æˆ", + "deposit-location": "充值ä½ç½®", + "deposit-location-desc": "选择一个钱包,以在我们收到你的比特å¸åŽå……值Skycoin到该钱包", + "make-choice": "åšé€‰æ‹©", + "wallets-desc": "æ¯å½“选择一个新的钱包和地å€ï¼Œä¸€ä¸ªæ–°çš„BTC地å€å°†ä¼šç”Ÿæˆã€‚一个独立的Skycoin地å€æœ€å¤šå¯ç»‘定5个BTC地å€ã€‚", + "send": "å‘é€Bitcoin", + "send-desc": "å‘é€Bitcoin至如下地å€ã€‚一旦收到,我们将会按当å‰æ±‡çŽ‡: {{ rate }} SKY/BTC充值Skycoin到选中钱包的一个新地å€ã€‚", + "fraction-warning": "请按SKY/BTC汇率的å€æ•°å‘é€BTC! Skycoin是以整数å‘é€; SKYçš„å°æ•°ä½å°†ä¸ä¼šå‘é€", + "receive": "接收Sky", + "receive-desc": "收到你的比特å¸åŽï¼Œæˆ‘们将å‘é€Skycoin给你。你å¯èƒ½éœ€è¦20分钟到一个å°æ—¶æ‰èƒ½æ”¶åˆ°è¿™äº›SKY。", + "status-button": "状æ€:", + "check-status-button": "查看状æ€", + "new-order-button": "新订å•" + }, + + "wizard": { + "wallet-desc": "如果你没有Skycoin钱包,请使用生æˆçš„ç§å­æ¥åˆ›å»ºä¸€ä¸ªæ–°é’±åŒ…。如果你已ç»æœ‰ä¸€ä¸ªé’±åŒ…,切æ¢åˆ°\"加载钱包\"并输入你的ç§å­ã€‚", + "encrypt-desc": "通过加密æ¥å¢žåŠ é’±åŒ…的安全性。输入密ç åŽï¼Œä½ çš„钱包会被加密。åªæœ‰è¾“入密ç æ‰å¯ä»¥è®¿é—®çš„钱包或移动资金。", + "hardware-wallet-link": "使用硬件钱包?", + "finish-button": "完æˆ", + "back-button": "åŽé€€", + + "confirm": { + "title": "ä¿æŠ¤ä½ çš„ç§å­!", + "desc": "请确ä¿ä½ å·²ç»å†™ä¸‹ä½ çš„ç§å­å¹¶å°†å®ƒå‚¨å­˜åœ¨äº†ä¸€ä¸ªå®‰å…¨çš„地方。如果你忘记了ç§å­ï¼Œä½ å°†æ— æ³•æ¢å¤ä½ çš„Skycoin钱包", + "checkbox": "它很安全,我å‘誓。", + "button": "继续" + } + }, + + "wallet": { + "new-address": "新地å€", + "new-addresses": "新地å€", + "show-empty": "展示空地å€", + "hide-empty": "éšè—空地å€", + "encrypt": "加密钱包", + "decrypt": "解密钱包", + "decrypt-warning": "警告: 出于安全考虑,建议将钱包加密。建议谨慎一点。", + "delete": "删除钱包", + "edit": "编辑钱包", + "add": "添加钱包", + "load": "加载钱包", + "encryption-enabled": "加密已å¯ç”¨", + "encryption-disabled": "加密已ç¦ç”¨", + "hw-security-warning": "å¯èƒ½çš„安全风险。当硬件设备已连接时(点击钱包列表下的\"硬件钱包\"按钮)访问硬件钱包选项以获å–更多信æ¯", + "wallet": "钱包", + "hardware-wallet": "硬件钱包", + "delete-confirmation": "警告: 钱包\"{{ name }}\"将从列表中删除。若想é‡æ–°æ·»åŠ ï¼Œéœ€é‡æ–°è¿žæŽ¥è®¾å¤‡å¹¶æ‰“开硬件钱包的选项列表(点击钱包列表下的\"硬件钱包\"按钮)。你想继续å—?", + "delete-confirmation-check": "是的,我想è¦åˆ é™¤é’±åŒ…。", + "max-hardware-wallets-error": "你的硬件钱包里的地å€å·²ç»è¾¾åˆ°å…许的最大值。", + "add-many-confirmation": "警告: 如果你在ä¸ä½¿ç”¨å‰ä¸€ä¸ªåœ°å€çš„情况下添加太多地å€ï¼Œæˆ–者如果你使用的是最åŽä¸€ä¸ªåœ°å€è€Œä¸æ˜¯ç¬¬ä¸€ä¸ªåœ°å€ï¼Œé‚£ä¹ˆå¦‚果你å°è¯•ä½¿ç”¨ç§å­æ¢å¤é’±åŒ…,有些地å€å°†å¯èƒ½æ— æ³•è‡ªåŠ¨æ¢å¤ï¼ˆä½ å¿…须手动添加它们)。 你想继续å—?", + + "new": { + "create-title": "创建钱包", + "load-title": "加载钱包", + "encrypt-title": "加密钱包", + "name-label": "å称", + "seed-label": "ç§å­", + "confirm-seed-label": "确认ç§å­", + "seed-warning": "è®°ä½ç§å­! 把它ä¿å­˜åœ¨å®‰å…¨çš„地方。 如果你忘记了你的ç§å­ï¼Œä½ å°†æ— æ³•æ‰¾å›žä½ çš„钱包!", + "create-button": "创建", + "load-button": "加载", + "cancel-button": "删除", + "12-words": "12å­—", + "24-words": "24å­—", + "generate-12-seed": "生æˆ12å­—ç§å­", + "generate-24-seed": "生æˆ24å­—ç§å­", + "encrypt": "加密钱包", + "encrypt-warning": "我们建议你为æ¯ä¸ªé’±åŒ…设置一个独立的密ç ã€‚如果你忘记密ç ï¼Œä½ å¯ä»¥é€šè¿‡ç§å­é‡ç½®é’±åŒ…。在加密你的钱包之å‰ï¼Œç¡®ä¿ä½ çš„ç§å­ä¿å­˜åœ¨å®‰å…¨çš„地方。", + "unconventional-seed-title": "å¯èƒ½é”™è¯¯", + "unconventional-seed-text": "你引进了一ç§éžä¼ ç»Ÿçš„ç§å­ã€‚如果你出于任何特殊原因这样åšï¼Œä½ å¯ä»¥ç»§ç»­(åªæŽ¨è高级用户)。但是,如果你打算使用普通的系统ç§å­ï¼Œåˆ™å¿…须删除所有附加文本和特殊字符。", + "unconventional-seed-check": "继续使用éžä¼ ç»Ÿç§å­ã€‚" + }, + + "rename": { + "title": "é‡å‘½å钱包", + "name-label": "命å", + "cancel-button": "å–消", + "rename-button": "é‡å‘½å" + }, + + "add-addresses": { + "title": "选择数é‡", + "name-quantity": "创建多少地å€", + "cancel-button": "å–消", + "create-button": "创建" + }, + + "address": { + "show": "点击显示", + "copy": "å¤åˆ¶", + "copy-address": "å¤åˆ¶åœ°å€", + "copied": "å·²å¤åˆ¶!", + "confirm": "确认地å€", + "outputs": "未交易输出", + "history": "历å²" + } + }, + + "send": { + "synchronizing-warning":"钱包ä»åœ¨åŒæ­¥æ•°æ®ï¼Œæ‰€ä»¥æ˜¾ç¤ºçš„ä½™é¢å¯èƒ½ä¸æ­£ç¡®ã€‚你确定è¦ç»§ç»­å—?", + "from-label": "å‘é€è‡ª", + "to-label": "å‘é€è‡³", + "amount-label": "总é¢", + "notes-label": "标注", + "wallet-label": "钱包", + "addresses-label": "地å€", + "invalid-amount": "请输入一个有效数值", + "addresses-help": "é™å®šæºå‘é€åœ°å€", + "all-addresses": "所有地å€(所选钱包的)", + "outputs-label": "未交易输出", + "outputs-help": "é™å®šæœªäº¤æ˜“输出", + "all-outputs": "所有未交易输出(所选地å€çš„)", + "available-msg-part1": "æ ¹æ®ä½ å½“å‰çš„选择,你最多å¯ä»¥å‘é€", + "available-msg-part2": "å’Œ", + "available-msg-part3": "(至少", + "available-msg-part4": "将作为必须的交易手续费)。", + "change-address-label": "自定义找零地å€", + "change-address-select": "选择", + "change-address-help": "自定义找零地å€ã€‚如果ä¸æ供,钱包将会自动选择。点击\"选择\" æ¥é€‰æ‹©ä¸€ä¸ªåœ°å€", + "destinations-label": "目标地å€", + "destinations-help1": "目标地å€å’Œå³å°†å‘é€çš„å¸", + "destinations-help2": "目标地å€å’Œå³å°†å‘é€çš„å¸ä»¥åŠå¸æ—¶", + "hours-allocation-label": "自动分é…å¸æ—¶", + "options-label": "选项", + "value-label": "å¸æ—¶åˆ†å‘å› å­", + "value-help": "分å‘å› å­å€¼è¶Šé«˜ï¼Œè¶Šå¤šå¸æ—¶å°†è¢«å‘é€", + "preview-button": "预览", + "send-button": "å‘é€", + "back-button": "åŽé€€", + "simple": "简易", + "advanced": "高级的", + "select-wallet": "选择钱包" + }, + + "reset": { + "wallet-label": "钱包", + "seed-label": "钱包ç§å­", + "password-label": "æ–°å¯†ç  (如果你ä¸å¸Œæœ›é’±åŒ…加密,请将密ç ç•™ç©º)", + "confirm-label": "确认新密ç ", + "reset-button": "é‡ç½®" + }, + + "tx": { + "transaction": "交易", + "confirm-transaction": "确认交易", + "from": "æ¥è‡ª", + "to": "到", + "date": "日期", + "status": "状æ€", + "coins": "å¸", + "hours": "å¸æ—¶", + "id": "交易ID", + "show-more": "展示更多", + "hours-moved": "已转移", + "hours-sent": "å·²å‘é€", + "hours-received": "已接收", + "hours-burned": "已燃烧", + "inputs": "输入", + "outputs": "输出", + "confirmed": "已确认", + "pending": "待处ç†", + "current-rate": "按当å‰æ±‡çŽ‡è®¡ç®—" + }, + + "backup": { + "wallet-directory": "钱包目录:", + "seed-warning": "在纸上备份你的ç§å­ï¼Œå¹¶ä¿å­˜åœ¨ä¸€ä¸ªå®‰å…¨çš„地方。åªè¦æœ‰ç§å­ï¼Œä½ å°±å¯ä»¥æ‰¾å›žä½ çš„å¸ã€‚", + "desc": "使用下表从加密的钱包中得到ç§å­ã€‚
为了从未加密的钱包中获得ç§å­ï¼Œæ‰“开上é¢çš„文件夹,在文本编辑器中打开.wlt文件并æ¢å¤ç§å­ã€‚", + "close-button": "Close", + "wallet": "钱包", + "filename": "文件å", + "seed": "ç§å­", + "show-seed": "显示ç§å­", + "no-wallets": "未加密钱包" + }, + + "blockchain": { + "blocks": "区å—æ•°é‡", + "time": "上一个区å—的时间戳", + "hash": "上一个区å—的哈希值", + "current-supply": "ç›®å‰SKY供应é‡", + "total-supply": "SKY的总供应é‡", + "current-coinhour-supply": "ç›®å‰å¸æ—¶ä¾›åº”é‡", + "total-coinhour-supply": "å¸æ—¶æ€»ä¾›åº”é‡" + }, + + "network": { + "peer": "节点", + "source": "节点æ¥æº", + "block-height": "区å—高度", + "block-height-short": "区å—", + "last-seen": "上一次出现", + "last-received": "上一次接收", + "last-sent": "上一次å‘é€", + "in": "è¿›æ¥çš„", + "out": "出去的", + + "sources": { + "default": "默认节点", + "exchange": "交æ¢èŠ‚点" + } + }, + + "pending-txs": { + "timestamp": "时间戳", + "txid": "交易ID", + "none": "无待处ç†äº¤æ˜“", + "my": "我的", + "all": "全部" + }, + + "history": { + "tx-detail": "交易明细", + "moving": "内部转账中", + "moved": "已内部转账", + "sending": "å‘é€ä¸­", + "sent": "å·²å‘é€", + "received": "已接收", + "receiving": "接收中", + "pending": "待处ç†", + "no-txs": "你没有历å²äº¤æ˜“", + "no-txs-filter": "没有与当å‰ç­›é€‰æ¡ä»¶åŒ¹é…的交易", + "no-filter": "未ç»ç­›é€‰ (点击选择钱包/地å€)", + "filter": "已筛选: ", + "filters": "已筛选: ", + "all-addresses": "所有地å€" + }, + + "teller": { + "done": "完æˆ", + "waiting-confirm": "等待确认", + "waiting-deposit": "等待比特å¸å……值", + "waiting-send": "等待å‘é€Skycoin", + "unknown": "未知" + }, + + "confirmation" : { + "header-text": "确认", + "confirm-button": "是", + "cancel-button": "å¦", + "close": "关闭" + }, + + "service": { + "api" : { + "server-error": "æœåŠ¡å™¨é”™è¯¯" + }, + "wallet": { + "not-enough-hours": "没有足够的å¸æ—¶æ¥æ‰§è¡Œäº¤æ˜“" + } + }, + + "hardware-wallet": { + "general": { + "default-wallet-name": "新硬件钱包", + "error-disconnected": "无法执行该æ“作。硬件钱包未连接。", + "simple-error": "错误,无法执行æ“作。", + "generic-error": "无法执行该æ“作。确ä¿ä½ å·²ç»è¿žæŽ¥äº†ä¸€ä¸ªæœ‰æ•ˆçš„硬件钱包,并且它没有在等待输入。", + "generic-error-internet": "无法执行该æ“作。确ä¿ä½ å·²ç»è¿žæŽ¥äº†ä¸€ä¸ªæœ‰æ•ˆçš„硬件钱包,它ä¸åœ¨ç­‰å¾…输入,并且你已ç»è¿žæŽ¥åˆ°ç½‘络/节点", + "error-incorrect-wallet": "无法执行该æ“作。所连接的硬件钱包与预期ä¸åŒã€‚", + "error-incorrect-pin": "无法执行该æ“作。你输入的密ç ä¸æ­£ç¡®ã€‚", + "confirm": "请在硬件钱包中确认æ“作。", + "confirm-and-more": "请在硬件钱包中确认æ“作并按éµå¾ªæŒ‡ç¤ºã€‚", + "close": "关闭", + "cancel": "å–消", + "continue": "继续", + "completed": "æ“作完æˆã€‚", + "refused": "æ“作失败或被å–消。" + }, + "errors": { + "too-many-inputs": "此笔交易有太多的输入,无法处ç†ã€‚请è”系技术支æŒã€‚", + "too-many-outputs": "此笔交易有太多的输出,无法处ç†ï¼Œè¯·è”系技术支æŒã€‚" + }, + "security-warning": { + "title": "安全警告", + "text": "上次连接此硬件钱包时,å‘现一个或多个安全警告。我们建议你打开硬件钱包选项(点击钱包列表下的\"硬件钱包\"按钮)并ä¿æŒè®¾å¤‡å·²è¿žæŽ¥ï¼Œåœ¨ç»§ç»­ä¹‹å‰ï¼Œè§£å†³å®‰å…¨é—®é¢˜", + "check": "我明白其中的风险,并希望继续下去", + "continue": "继续", + "cancel": "å–消" + }, + "options": { + "connecting": "连接...", + "disconnected": "没有检测到硬件钱包。请连接硬件钱包åŽä½¿ç”¨æ­¤é€‰é¡¹ã€‚", + "unconfigured-detected-title": "未é…置的硬件钱包", + "unconfigured-detected": "检测到无ç§å­çš„硬件钱包。选择\"自动é…ç½®\"如果你想将其é…置为全新的钱包并立å³å¼€å§‹ä½¿ç”¨å®ƒï¼Œæˆ–选择\"æ¢å¤å¤‡ä»½\"如果你想使用先å‰åˆ›å»ºçš„备份ç§å­å¯¹å…¶è¿›è¡Œé…置,从而能够å†æ¬¡è®¿é—®ä½ çš„资产。", + "configured-detected": "检测到硬件钱包。该设备在钱包列表中被识别为:", + "security-warnings-title": "安全警告", + "security-warning-title": "安全警告", + "backup-warning": "你应该备份硬件钱包ç§å­ï¼Œå¦åˆ™ä¸‡ä¸€å‡ºçŽ°é—®é¢˜ï¼Œä½ å¯èƒ½å°†æ— æ³•è®¿é—®ä½ çš„资金,è¦åšåˆ°è¿™ä¸€ç‚¹ã€‚选择\"创建一个备份\"选项。", + "pin-warning": "当å‰è¿žæŽ¥çš„硬件钱包未设置密ç ã€‚密ç å¯ä¿æŠ¤ç¡¬ä»¶é’±åŒ…,以防丢失ã€ç›—窃和黑客入侵。è¦åˆ›å»ºä¸€ä¸ªå¯†ç ï¼Œé€‰æ‹©\"创建PINç \"选项。", + "options": "选项:", + "configure-automatically": "自动é…ç½®", + "restore-backup": "æ¢å¤å¤‡ä»½", + "create-backup": "创建备份", + "wipe": "删除设备", + "confirm-seed": "确认ç§å­", + "create-pin": "创建密ç ", + "change-pin": "更改密ç ", + "forgotten-pin1": "如果你因为忘记密ç è€Œæ— æ³•è¿›å…¥é’±åŒ…,你å¯ä»¥åˆ é™¤ç¡¬ä»¶é’±åŒ…,然åŽé€šè¿‡ç§å­", + "forgotten-pin2": "æ¢å¤" + }, + "generate-seed" : { + "text": "在继续之å‰ï¼Œä½ å¯ä»¥é€‰æ‹©ç”Ÿæˆç§å­çš„å•è¯æ•°ã€‚ç§å­æ˜¯ä¸€ä¸ªå•è¯åˆ—表,出现问题åŽå¯ä»¥ç”¨æ¥æ¢å¤è®¿é—®ä½ çš„å¸ã€‚所有选项都是安全的,如果你没有特殊原因必须选择æŸä¸€é¡¹ï¼Œä½ å¯ä»¥ä½¿ç”¨é»˜è®¤å€¼ã€‚", + "configuring": "é…ç½®..." + }, + "restore-seed" : { + "text": "在继续å‰ï¼Œè¯·é€‰æ‹©ä½ æƒ³è¦æ¢å¤ç§å­çš„å•è¯æ•°é‡ã€‚", + "check-text": "ä½ å¯ä»¥ä½¿ç”¨æ­¤é€‰é¡¹è¾“å…¥ç§å­ï¼Œå¹¶æ£€æŸ¥å®ƒæ˜¯å¦ä¸Žç¡¬ä»¶é’±åŒ…中的一致。在开始之å‰ï¼Œé€‰æ‹©ä½ æƒ³è¦æ£€æŸ¥çš„ç§å­çš„å•è¯æ•°ã€‚", + "warning" : "警告: 为了é¿å…å¯èƒ½å‡ºçŽ°çš„问题,请仅使用åŒä¸€å“牌/åž‹å·çš„硬件钱包创建ç§å­ã€‚", + "error-wrong-word": "错误: é‡æ–°é”®å…¥çš„å•è¯ä¸Žç¡¬ä»¶é’±åŒ…所请求的ä¸åŒ¹é…。", + "error-invalid-seed": "错误: ç§å­æ— æ•ˆã€‚请务必按正确的顺åºè¾“入正确的å•è¯ã€‚", + "error-wrong-seed": "错误: ç§å­æ˜¯æœ‰æ•ˆçš„,但与设备中的ç§å­ä¸åŒ¹é…。" + }, + "added": { + "title": "新硬件钱包", + "configuring": "检测到新的硬件钱包。é…ç½®...", + "done": "已完æˆ", + "added1": "已连接的硬件的钱包已ç»ç”¨å¦‚下å字被添加到钱包列表:", + "added2": "现在你å¯ä»¥æŸ¥çœ‹ç¡¬ä»¶é’±åŒ…中的余é¢å’Œåœ°å€äº†ï¼Œå³ä½¿ç¡¬ä»¶é’±åŒ…并未连接。此外如果你愿æ„,你还å¯ä»¥æ›´æ”¹é’±åŒ…å称或从将其从钱包列表删除。" + }, + "wipe": { + "warning": "警告: 硬件钱包中的所有数æ®å°†è¢«åˆ é™¤ã€‚如果没有备份,你将无法å†æ¬¡è®¿é—®ä½ çš„资金。", + "confirm-delete": "还是将其从钱包列表中删除" + }, + "create-backup": { + "warning": "警告: ä½ åªèƒ½ä½¿ç”¨æ­¤é€‰é¡¹å¤‡ä»½ä½ çš„硬件钱包ç§å­ä¸€æ¬¡ã€‚如果你决定继续,你将ä¸å¾—ä¸å†™ä¸‹ä¸€ç»„å•è¯(建议写在纸上,而ä¸æ˜¯ç”µè„‘上),这些å•è¯å°†å‡ºçŽ°åœ¨ç¡¬ä»¶é’±åŒ…çš„å±å¹•ä¸Šï¼Œå¹¶å°†å…¶å­˜å‚¨åœ¨ä¸€ä¸ªå®‰å…¨çš„地方。任何å¯ä»¥è®¿é—®å•è¯åˆ—表(\"ç§å­\")的人都å¯ä»¥è®¿é—®é’±åŒ…ä½™é¢ï¼Œå› æ­¤å»ºè®®è¯·æ ¼å¤–谨慎。", + "instructions": "写下出现在硬件钱包å±å¹•ä¸Šçš„å•è¯åˆ—表。一定è¦æŒ‰é¡ºåºå¹¶æŠŠæ¯ä¸ªå•è¯éƒ½å†™å¯¹ã€‚" + }, + "seed-word": { + "title": "输入字", + "info1": "输入设备中显示的字", + "info2": "你将被è¦æ±‚以éšæœºçš„顺åºè¾“入你备份的ç§å­ï¼ŒåŠ ä¸Šä¸€äº›é¢å¤–的字。", + "word": "è¦æ±‚çš„å­—", + "error-invalid-word": "输入字无效。", + "error-loading-words": "正在加载字列表。请ç¨ç­‰ã€‚" + }, + "change-pin" : { + "pin-mismatch":"无法执行æ“作。你输入的两个密ç ä¸åŒ¹é…" + }, + "enter-pin" : { + "title": "输入密ç ", + "title-change-current": "输入当å‰å¯†ç ", + "title-change-new": "输入新的密ç ", + "title-change-confirm": "确认新的密ç ", + "instructions": " 密ç å·²æ˜¾ç¤ºåœ¨ç¡¬ä»¶é’±åŒ…çš„å±å¹•ä¸Šã€‚", + "instructions-tx": "进入密ç ä»¥ç¡®è®¤å¹¶ç­¾ç½²äº¤æ˜“。", + "instructions-change": "请输入一个4到8个数字之间的难以被猜中的密ç ã€‚", + "help": "需è¦å¸®åŠ©ï¼Ÿ" + }, + "pin-help" : { + "title": "帮助", + "part1": "当需è¦è¾“入密ç æ‰èƒ½ç»§ç»­æ—¶ï¼Œç¡¬ä»¶é’±åŒ…å±å¹•ä¼šæ˜¾ç¤ºä¸€ä¸ªçŸ©é˜µï¼ŒçŸ©é˜µç”±9个éšæœºæŽ’列的å—组æˆ(æ¯æ¬¡é¡ºåºéƒ½ä¼šæ”¹å˜),你将被è¦æ±‚在软件钱包中输入密ç ï¼Œä½¿ç”¨ä¸€ä¸ªçŸ©é˜µï¼Œæ­¤çŸ©é˜µåŒ…å«9个按钮,åªæ˜¾ç¤ºç¬¦å·#。", + "part2": "è¦è¾“入密ç ï¼Œè¯·åœ¨ç¡¬ä»¶é’±åŒ…å±å¹•ä¸Šä»¥æ•°å­—矩阵查看密ç çš„ä½ç½®ï¼Œç„¶åŽç‚¹å‡»è½¯ä»¶é’±åŒ…中的相应按钮。例如,如果密ç ä¸º\"23\"且数字2ä½äºŽç¡¬ä»¶é’±åŒ…数字矩阵的左上角,数字3ä½äºŽç¡¬ä»¶é’±åŒ…数字矩阵的正中间,则按顺åºç‚¹å‡»è½¯ä»¶é’±åŒ…中的左上角和中间按钮。", + "part3": "如果你愿æ„,还å¯ä»¥ä½¿ç”¨é”®ç›˜ä¸Šçš„å°é”®ç›˜è¾“入密ç ã€‚但是,如之å‰ç¤ºä¾‹æ‰€ç¤ºï¼Œå¦‚果密ç æ˜¯\"23\",你ä¸èƒ½ç®€å•åœ°ç”¨å°é”®ç›˜é”®å…¥\"23\",而是必须选择点击硬件钱包å±å¹•ä¸Š2å’Œ3对应ä½ç½®çš„值。" + }, + "create-tx" : { + "title": "创建交易" + }, + "confirm-address" : { + "title": "确认地å€", + "instructions": "请在硬件钱包上确认,如果地å€ä¸º:", + "short-confirmation": "地å€å·²ç¡®è®¤", + "confirmation": "地å€å·²ç¡®è®¤ã€‚为了安全, 选择 \"确认地å€\" 选项å¯ä»¥åœ¨ç¡¬ä»¶é’±åŒ…上å†æ¬¡æ˜¾ç¤ºåœ°å€ï¼Œåœ¨èœå•ä¸­å¯ç‚¹å‡»åœ°å€ä½™é¢å³ä¾§çš„按钮显示。" + } + }, + + "time-from-now": { + "few-seconds": "几秒钟之å‰", + "minute": "一分钟之å‰", + "minutes": "{{time}} 分钟之å‰", + "hour": "一å°æ—¶ä¹‹å‰", + "hours": "{{time}} å°æ—¶ä¹‹å‰", + "day": "一天之å‰", + "days": "{{time}} 天之å‰" + }, + + "exchange": { + "you-send": "ä½ å‘é€", + "you-get": "你收到 (大约)", + "to-address": "到 {{coin}} 地å€", + "price": "交易汇率", + "time-15": "交易时间", + "exchange-button": "交易", + "min-amount": "最å°æ•°é¢:", + "max-amount": "最大数é¢:", + "agree-1": "我åŒæ„", + "agree-2": "使用æ¡æ¬¾", + "agree-3": "å’Œ", + "agree-4": "éšç§æ”¿ç­–", + "powered-by": "技术支æŒ", + "need-help": "需è¦å¸®åŠ©?", + "support-portal": "帮助入å£", + "history": "订å•åŽ†å²", + "order-not-found": "订å•æœªæ‰¾åˆ°", + "status": "状æ€", + "exchanging": "{{from}}交易{{to}}", + "select": "选择", + "offline": "交易暂时下线", + "problem-connecting": "未能连接到æœåŠ¡å™¨ã€‚请检查你的网络连接并ç¨åŽå†è¯•ã€‚", + "invalid-address": "无效地å€ã€‚", + "statuses": { + "user-waiting": "等待充值。请将{{amount}} {{from}}å‘é€åˆ°ä¸‹é¢æ˜¾ç¤ºçš„交易地å€", + "user-waiting-info": "系统正在等待你充值到交易地å€ã€‚交易将在系统检测到你的充值并在区å—链中确认åŽå¼€å§‹ã€‚如果你已ç»å……值,应该很快就会检测到。", + "market-waiting-confirmations": "等待链上交易确认", + "market-waiting-confirmations-info": "å·²ç»æ£€æµ‹åˆ°å……值,等待区å—链中被确认。", + "market-confirmed": "链上交易已接å—", + "market-confirmed-info": "链上交易已ç»åœ¨åŒºå—链上确认。准备马上执行兑æ¢ã€‚", + "market-exchanged": "完æˆ{{from}}到{{to}}çš„å…‘æ¢", + "market-exchanged-info": "å…‘æ¢å·²ç»å®Œæˆã€‚资金将很快å‘é€åˆ°ä½ çš„地å€ã€‚", + "market-withdraw-waiting": "正在å‘é€{{to}}到你的地å€", + "market-withdraw-waiting-info": "å‘é€{{to}}到你地å€çš„进程已å¯åŠ¨", + "complete": "交易已完æˆ!", + "complete-info": "资金已ç»æˆåŠŸå‘é€åˆ°ä½ çš„地å€ã€‚", + "error": "å‘生错误", + "error-info": "è¿è½¬è¿‡ç¨‹ä¸­å‡ºçŽ°é”™è¯¯ï¼Œä½ å¯ä»¥åœ¨ä¸‹é¢æ‰¾åˆ°æ›´å¤šä¿¡æ¯ã€‚如果你需è¦å¸®åŠ©ï¼Œè¯·ä¿å­˜ä¸‹é¢æ˜¾ç¤ºçš„所有数æ®å¹¶ä½¿ç”¨é¡µé¢å³ä¸‹è§’的帮助链接æ¥è”系技术支æŒã€‚" + }, + "history-window": { + "address": "地å€", + "date": "日期" + }, + "details": { + "exchange-addr": "交易地å€", + "exchange-addr-tag": "支付ID或交易必须用到的目标标签", + "tx-id": "交易ID", + "order-id": "订å•ID", + "initial-price": "åˆå§‹æ±‡çŽ‡", + "error-msg": "é”™è¯¯ä¿¡æ¯ ", + "details": "详情", + "start-date": "开始日期", + "back": "返回", + "back-alert": "æ“作正在执行。你真的想è¦è¿”回到表格å—?你å¯ä»¥é€šè¿‡ç‚¹å‡»\"订å•åŽ†å²\"å†æ¬¡çœ‹åˆ°æ‰§è¡Œè¿‡ç¨‹" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh_base.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh_base.json new file mode 100644 index 00000000..402d23ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh_base.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a hardware wallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Hardware Wallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the hardware wallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create" + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet" + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New hardware wallet", + "error-disconnected": "Unable to perform the operation. The hardware wallet is not connected.", + "simple-error": "Error, Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected hardware wallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is not correct.", + "confirm": "Please, confirm the operation in the hardware wallet.", + "confirm-and-more": "Please, confirm the operation in the hardware wallet and follow the instructions.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled." + }, + "errors": { + "too-many-inputs": "The transaction has too many inputs and can not be processed. Please contact technical support.", + "too-many-outputs": "The transaction has too many outputs and can not be processed. Please contact technical support." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected and solve the security problems before continuing.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No hardware wallet detected. Please connect a hardware wallet to use this option.", + "unconfigured-detected-title": "Unconfigured hardware wallet", + "unconfigured-detected": "A seedless hardware wallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it immediately, or select \"Restore backup\" if you want to configure it with a previously created seed backup and thus be able to access your funds again.", + "configured-detected": "Hardware wallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "backup-warning": "You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "forgotten-pin1": "If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking", + "forgotten-pin2": "here." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the hardware wallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device." + }, + "added" : { + "title": "New Hardware Wallet", + "configuring": "New hardware wallet detected. Configuring...", + "done": "Done", + "added1": "The connected hardware wallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish." + }, + "wipe" : { + "warning": "WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet balance, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word indicated in the device", + "info2": "You will be asked to enter the words of your backup seed in random order, plus a few additional words.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. Two PINs you have entered do not match." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the hardware wallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a hard-to-guess PIN of between 4 and 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet." + }, + "create-tx" : { + "title": "Create transaction" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the hardware wallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the hardware wallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/alert-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/alert-red.png new file mode 100644 index 00000000..17118ad3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/alert-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/big-error-icon.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/big-error-icon.png new file mode 100644 index 00000000..bcbda0c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/big-error-icon.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/chevron-right-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/chevron-right-grey.png new file mode 100644 index 00000000..d0404586 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/chevron-right-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/close-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/close-grey.png new file mode 100644 index 00000000..2f0ec3b6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/close-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-grey.png new file mode 100644 index 00000000..42ea9346 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-red.png new file mode 100644 index 00000000..62175e3d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-blue.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-blue.png new file mode 100755 index 00000000..de88a9af Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-blue.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-grey.png new file mode 100644 index 00000000..a5cf11e2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/header.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/header.png new file mode 100644 index 00000000..d73c2734 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/header.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/hw-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/hw-gold.png new file mode 100644 index 00000000..af36aa93 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/hw-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/en.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/en.png new file mode 100644 index 00000000..bb03eaaa Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/en.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/es.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/es.png new file mode 100644 index 00000000..4590656a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/es.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/ru.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/ru.png new file mode 100644 index 00000000..61c27f9c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/ru.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/zh.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/zh.png new file mode 100644 index 00000000..ba5615b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/zh.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/load-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/load-gold.png new file mode 100644 index 00000000..4d1cbf7f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/load-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-gold.png new file mode 100644 index 00000000..fc53863c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-grey.png new file mode 100755 index 00000000..3f835e7d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/logo-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/logo-white.png new file mode 100644 index 00000000..8b714cf3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/logo-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-grey.png new file mode 100644 index 00000000..b81e568e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-red.png new file mode 100644 index 00000000..6686a98c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/money-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/money-gold.png new file mode 100644 index 00000000..649fc3b1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/money-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/otc-background.jpg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/otc-background.jpg new file mode 100644 index 00000000..03a84019 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/otc-background.jpg differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-gold.png new file mode 100644 index 00000000..854692e1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-green.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-green.png new file mode 100755 index 00000000..ab020791 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-green.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-grey.png new file mode 100644 index 00000000..35dbfff5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/qr-code-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/qr-code-black.png new file mode 100644 index 00000000..f9a2fabe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/qr-code-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-black.png new file mode 100644 index 00000000..9f277422 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-blue.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-blue.png new file mode 100644 index 00000000..4226468c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-blue.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-gold.png new file mode 100644 index 00000000..59645e7d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-white.png new file mode 100644 index 00000000..16261a2f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/size-alert.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/size-alert.png new file mode 100644 index 00000000..49b639c0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/size-alert.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/transactions-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/transactions-black.png new file mode 100644 index 00000000..413f2235 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/transactions-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-gold.png new file mode 100755 index 00000000..3ecf4ae4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-grey.png new file mode 100644 index 00000000..61a31772 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/wallet-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/wallet-black.png new file mode 100644 index 00000000..cdb2ec80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/wallet-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/logo-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/logo-white.png new file mode 100644 index 00000000..cd615cf8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/logo-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/scripts/qrcode.min.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/scripts/qrcode.min.js new file mode 100644 index 00000000..993e88f3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/scripts/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/current-skycoin.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/current-skycoin.json new file mode 100644 index 00000000..e771960e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/current-skycoin.json @@ -0,0 +1 @@ +versionData='{ "version": "0.25.0" }'; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.prod.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.prod.ts new file mode 100644 index 00000000..9ecd49cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.prod.ts @@ -0,0 +1,11 @@ +export const environment = { + nodeUrl: '/api/', + production: true, + tellerUrl: 'https://event.skycoin.com/api/', + + swaplab: { + apiKey: 'w4bxe2tbf9beb72r', // if set to null, integration will be disabled + activateTestMode: false, + endStatusInError: false, + }, +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.ts new file mode 100644 index 00000000..0fac1b06 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.ts @@ -0,0 +1,16 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + nodeUrl: '/api/', + production: false, + tellerUrl: '/teller/', + + swaplab: { + apiKey: 'w4bxe2tbf9beb72r', // if set to null, integration will be disabled + activateTestMode: true, + endStatusInError: false, + }, +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/favicon.ico b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/favicon.ico new file mode 100644 index 00000000..cc325fd3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/favicon.ico differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/index.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/index.html new file mode 100755 index 00000000..3113303e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/index.html @@ -0,0 +1,49 @@ + + + + + Skycoin + + + + + + + +
+
+ +
+ +
+
+
+
+ + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/main.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/main.ts new file mode 100644 index 00000000..6b163a15 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/main.ts @@ -0,0 +1,13 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +import 'hammerjs'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/polyfills.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/polyfills.ts new file mode 100644 index 00000000..7831e97b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/polyfills.ts @@ -0,0 +1,72 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** Evergreen browsers require these. **/ +import 'core-js/es6/reflect'; +import 'core-js/es7/reflect'; + + +/** + * Required to support Web Animations `@angular/animation`. + * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + + +/*************************************************************************************************** + * Zone JS is required by Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ + +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. +/** + * Need to import at least one locale-data with intl. + */ +// import 'intl/locale-data/jsonp/en'; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/styles.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/styles.scss new file mode 100644 index 00000000..d2b3b828 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/styles.scss @@ -0,0 +1,501 @@ +@import 'theme/variables'; +@import 'theme/tables'; +@import 'theme/_modals'; +@import '~bootstrap/scss/bootstrap-grid.scss'; +@import '~bootstrap/scss/utilities/_display.scss'; + +/* You can add global styles to this file, and also import other style files */ +//@import '~@angular/material/prebuilt-themes/indigo-pink.css'; +@import 'app/app.theme.scss'; + +@font-face { + font-family: 'Skycoin'; + font-style: normal; + font-weight: 300; + src: url('assets/fonts/skycoin/Skycoin-Light.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-Light.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: italic; + font-weight: 300; + src: url('assets/fonts/skycoin/Skycoin-LightItalic.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-LightItalic.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: normal; + font-weight: 400; + src: url('assets/fonts/skycoin/Skycoin-Regular.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-Regular.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: italic; + font-weight: 400; + src: url('assets/fonts/skycoin/Skycoin-RegularItalic.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-RegularItalic.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: normal; + font-weight: 700; + src: url('assets/fonts/skycoin/Skycoin-Bold.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-Bold.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: italic; + font-weight: 700; + src: url('assets/fonts/skycoin/Skycoin-BoldItalic.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-BoldItalic.woff') format('woff'); +} + +$mat-font-family: Skycoin, sans-serif; +$white: #FBFBFB; + +$primary-color: #0072ff; +$secondary-color: #ffc125; + +body, div, h1, h2, h3, h4, h5, h6, p, span, a, button, option, select, +mat-panel-description, mat-panel-title, mat-option.mat-option { + font-family: $mat-font-family; +} + +html { + height: 100%; +} + +body { + background-color: #f7f7f7; + margin: 0; + padding: 0; + height: 100%; +} + +header { + background: url("assets/header.png") center center / cover, linear-gradient(-155deg, #686e96 0%, #373b5c 100%); + width: 100%; + height: 300px; +} + +mat-dialog-container { + border-radius: 5px !important; +} + +.mat-dialog-container { + padding: 0 !important; +} + +.header-container { + max-width: 848px; + text-align: center; + padding-top: 40px; + margin-right: auto; + margin-left: auto; +} + +.header-container h1 { + font-size: 3em; + color: white; +} + +.button-line { + margin-top: 40px; + text-align: right; +} + +.datatable-row-group { + cursor: pointer; +} + +button.active { + background-color: rgba(0,0,0,.12); +} + +mat-spinner.in-button .mat-spinner path { + stroke: #000; + opacity: 0.3; +} + +mat-spinner.in-button { + display: inline-block; + margin-left: 10px; + + &.small { + height: 18px !important; + width: 18px !important; + + svg { + height: 18px !important; + width: 18px !important; + } + } +} + +mat-spinner.in-text { + display: inline-block; + height: 12px !important; + width: 12px !important; + margin: 0 !important; + margin-left: 7px !important; + + svg { + height: 12px !important; + width: 12px !important; + + circle { + stroke: $gradient-blue-dark; + } + } +} + +snack-bar-container { + background-color: rgba(255, 0, 0, 0.8) !important; +} + +mat-panel-title { + width: 60%; + display: block; + flex-grow: 0 !important; +} + +.sky-container { + min-width: 100%; + min-height: 100%; + + &.sky-container-grey { + background-color: $grey-lightest; + } +} + +.flex-fill, .-flex-fill { + flex: 1 1 auto; +} + +.form-field { + margin-bottom: 20px; + + label { + color: #1e2227; + display: block; + font-size: 13px; + line-height: 20px; + margin-bottom: 2px; + } + + input { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } + + .-input-addon { + display: flex; + + input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + span { + border: 2px; + border-radius: 0 6px 6px 0; + background: #f1f1f1; + padding: 0 10px; + line-height: 44px; + color: $grey; + font-size: 14px; + flex-shrink: 0; + } + } + + select { + background-color: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + appearance: none; + } + + textarea { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } +} + +.primary button.enabled, .primary-gradient-background { + background: $gradient-blue-dark; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(left top, $gradient-blue-dark, $gradient-blue-light); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, $gradient-blue-dark, $gradient-blue-light); /* Standard syntax */ + + span { + color: white; + } +} + +/** +General Helpers + */ + +.primary-color { + color: $primary-color; +} + +.secondary-color { + color: $secondary-color; +} + +.no-opacity { + opacity: 1 !important; +} + +.light-opacity { + opacity: 0.2 +} + +.rotate-90 { + transform: rotate(90deg); +} + +.rotate-180 { + transform: rotate(180deg); +} + +.rotate-270 { + transform: rotate(270deg); +} + +mat-spinner.in-button svg { + height: 24px !important; + width: 24px !important; +} + +.empty-row { + padding: 0 1.2rem !important; + line-height: 50px !important; +} + +/** +Alerts + */ + +.alert-box { + color: $red; + font-size: 12px; + padding: 0 10px; + line-height: 1.5; + background-color: #ffdede; + padding: 15px; + display: flex; + margin-bottom: 20px; + + .title { + font-size: 20px; + } + + mat-icon { + margin-top: 5px; + margin-right: 10px; + animation: alert-blinking 1s linear infinite; + } + + mat-checkbox { + margin-top: 10px; + display: inline-block; + } +} + +@keyframes alert-blinking { + 50% { + opacity: 0.2; + } +} + +/** +On-boarding components + */ + +.onboarding-container { + width: 100%; + height: 100%; + overflow-x: hidden; + background: $gradient-blue-dark; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(left top, $gradient-blue-dark, $gradient-blue-light); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, $gradient-blue-dark, $gradient-blue-light); /* Standard syntax */ + + .row-container { + max-width: 450px; + width: 80%; + margin: 0px auto; + } + + label { + color: white; + } + + input { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } + + select { + background-color: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + -webkit-appearance:none; + } + + textarea { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } +} + +.dark button.enabled { + background-color: $black !important; + span { + color: white; + } +} + +.ghost button.enabled { + background-color: $transparent !important; + span { + color: black; + } +} + + +.-select { + position: relative; + + &::after { + content: ''; + display: block; + position: absolute; + top: 0; + right: 0; + background: url('/assets/img/chevron-right-grey.png') no-repeat; + background-size: 32px 32px; + width: 32px; + height: 32px; + margin: 6px; + pointer-events: none; + transform: rotate(90deg); + } +} + +.mat-menu-panel { + border-radius: 5px !important; + background-color: #fefefe; + + .mat-menu-item { + font-family: Skycoin; + line-height: 50px; + } + + &.compact { + .mat-menu-item { + font-size: 13px; + height: 35px; + line-height: 35px; + } + } +} + +.qr-code-button { + opacity: 0.6; + cursor: pointer; + + &:hover { + opacity: 1; + } +} + +.mat-dialog-content { + max-height: 90vh !important; +} + +@media (max-height: 600px) { + .mat-dialog-content { + max-height: 80vh !important; + } +} + +.mouse-disabled { + pointer-events: none; +} + +.coin-selector-container { + display: inline-block; + margin-left: 5px; + margin-bottom: 5px; +} + +.coins-value-label { + font-size: 10px; + margin-top: 1px; + padding: 3px 10px; + background-color: $grey-lightest; + border-radius: 4px; + + span { + opacity: 0.5; + } + + .link { + color: $gradient-blue-dark; + cursor: pointer; + display: inline-block; + font-size: 11px; + margin-bottom: 3px; + margin-top: -5px; + } + + .centerd-link { + width: 100%; + text-align: center; + } +} + +.red { + color: $red; +} + +.element-disabled { + pointer-events: none; + opacity: 0.5; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/test.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/test.ts new file mode 100644 index 00000000..0c45c2ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/test.ts @@ -0,0 +1,32 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare const __karma__: any; +declare const require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function() {}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_modals.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_modals.scss new file mode 100644 index 00000000..d406b085 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_modals.scss @@ -0,0 +1,65 @@ +@import 'variables'; + +.modal { + .-body { + line-height: 20px; + font-size: 13px; + color: $grey-dark; + opacity: 0.8; + } + + .big-text { + color: black; + font-weight: bold; + font-size: 15px; + } + + .-check-container{ + text-align: center; + margin-top: 25px; + + .-check { + label { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: $grey-dark; + } + + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + } + } + + .-buttons { + text-align: center; + } + + app-button { + button { + margin-top: 28px; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_tables.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_tables.scss new file mode 100644 index 00000000..b18b29bf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_tables.scss @@ -0,0 +1,73 @@ +@import 'variables'; + +.-table { + &:last-of-type { + margin-bottom: 30px; + } + + .-headers { + color: $grey-light; + display: flex; + font-size: 12px; + font-weight: 700; + height: 50px; + line-height: 50px; + margin: 0 30px; + + > div { + padding: 0 20px; + } + } + + .-body { + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + margin: 0 30px; + + .-row { + font-size: $font-size-standard; + padding: 15px 0; + background: $white; + display: flex; + align-items: center; + + &:not(:last-child) { + border-bottom: 1px solid #eff0f0; + } + + &:first-child { + border-top-left-radius: 15px; + border-top-right-radius: 15px; + } + + &:last-child { + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + } + + > div { + padding: 0 20px; + } + } + } + + .-width-70 { + width: 70px; + flex-shrink: 0; + } + + .-width-150 { + width: 150px; + flex-shrink: 0; + } + + .-width-200 { + width: 200px; + flex-shrink: 0; + } + + .-width-250 { + width: 250px; + flex-shrink: 0; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_variables.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_variables.scss new file mode 100644 index 00000000..85c8f237 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_variables.scss @@ -0,0 +1,35 @@ +// Backgrounds +$gradient-blue-dark: #0072ff; +$gradient-blue-dark-transparent: rgba(0, 114, 255, 0.7); +$gradient-blue-light: #00C3ff; +$gradient-blue-light-transparent: rgba(0, 195, 255, 0.7); + +// Colors +$black: #171a1d; + +$grey-lightest: #f7f7f7; +$grey-very-light: rgba(30, 34, 39, 0.05); +$grey-light: rgba(30, 34, 39, 0.2); +$grey: rgba(30, 34, 39, 0.5); +$grey-semi-dark: rgba(30, 34, 39, 0.75); +$grey-dark: #1e2227; + +$white: #fafafa; +$transparent: rgba(0,0,0,0); + +$red: #ff004e; +$blue: #0072ff; +$green: #00df80; +$yellow: #ffc125; + +// Grid +$row-height: 60px; +$row-detail-size: 32px; + +// Texts +$font-size-standard: 13px; +$letter-spacing-wide: 1px; + +// Responsive sizes +$max-xs-width: 767px; +$max-sm-width: 991px; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.app.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.app.json new file mode 100644 index 00000000..39ba8dba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.app.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "./", + "module": "es2015", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.spec.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.spec.json new file mode 100644 index 00000000..63d89ff2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/typings.d.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/typings.d.ts new file mode 100644 index 00000000..bcc7cff2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/typings.d.ts @@ -0,0 +1,10 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +} + +declare var System: System; +interface System { + import(request: string): Promise; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/test-fixtures/encoded-txs.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/test-fixtures/encoded-txs.json new file mode 100644 index 00000000..50fefdb1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/test-fixtures/encoded-txs.json @@ -0,0 +1,665 @@ +{ + "txs": [ + { + "inputs": [ + { + "hashIn": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coin": 1000000000000, + "hour": 1 + } + ], + "signatures": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "innerHash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "block": 1, + "raw": "060f0000000f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a01000000be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb60001000000043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a064000000003be2537f8c0893fddcddc878518f38ea493d949e0010a5d4e8000000010000000000000000b1cb2d1f0f4cae81aaba5b7bac6cd0825d836d860010a5d4e80000000100000000000000009b82664a2791ff0b713c054f0c8297b5d4b85a300010a5d4e80000000100000000000000006840be5c4574ebd2964d3b8480d9e68c9c04e4010010a5d4e800000001000000000000000017b74f4f9d84f265b849247786397241b31b435f0010a5d4e8000000010000000000000000c69047802c2eee1d3209fdc7a1f00387fb5ea1450010a5d4e8000000010000000000000000d17417e9ba3a0ab4c41b06dcba12fe1b7ad1cef50010a5d4e800000001000000000000000080032d0848e465ffb34336656390f4a781cc02310010a5d4e80000000100000000000000006d6c91562619265ff1b6ae7ae308511cfe3fcf3b0010a5d4e800000001000000000000000013d30014b79aee9b709eb17d202ad74cc6fdb8d80010a5d4e80000000100000000000000007df08027c2c47e2df1ed3fd93746c0f9d7a5fcd60010a5d4e8000000010000000000000000d496adb8bd0af7187b844243cfb436ba6d1ee18d0010a5d4e800000001000000000000000088a08c6fdd118b1a4bade4079b832d6415b4cb420010a5d4e80000000100000000000000002bb86985bfef99483e6d53c85febdf147472ff030010a5d4e8000000010000000000000000edc2beafb906a7362037c7b8d7c68bbcd50b5d250010a5d4e800000001000000000000000040929a5c060aa1665a78f68e687b2fc8e23aa8340010a5d4e8000000010000000000000000f129d1542ced1edd34800d5c2b781c8975aa37270010a5d4e80000000100000000000000001df18d79bd317911b14337ccc9caa7d0e26365b30010a5d4e800000001000000000000000062f93858c3201e2098bf5bfb8ffe35be1e0ef70e0010a5d4e8000000010000000000000000b19e29169074d369b6a61e718c70379737e4cccc0010a5d4e800000001000000000000000042cedc2e80c7ee2ca2855a06fd3ba0159bbff0d70010a5d4e8000000010000000000000000ef7101839457ea9bc50790171fd852bc006896390010a5d4e800000001000000000000000068409c9234c735fb2483d50bfcae0c62a3be08b10010a5d4e8000000010000000000000000cda5b71ce21c6a82bd7c24c63ce2f0ac69a400770010a5d4e80000000100000000000000001835c74c2fc92121d7435290bc14b272c7ea13b30010a5d4e8000000010000000000000000ed7d7b5c69cbcbd9932da5fb4c1ac95a535fef480010a5d4e80000000100000000000000002db48e3fe7f2050154bb72fcd8a810569c837c040010a5d4e80000000100000000000000000a60181b51e57912c8a7c9043cd7766fff2c8ddf0010a5d4e8000000010000000000000000f76e064dad995a22c9589c2ac78a0e21ae032cca0010a5d4e80000000100000000000000004bb99ae026d8ce7ced17cd314dcb392db209329d0010a5d4e8000000010000000000000000647ef87e6bf1c89c422134c6d36d8f96b17f03ce0010a5d4e8000000010000000000000000af9067e7b6c3691892bb7b8de7050dbdcbe355900010a5d4e80000000100000000000000007474ba61b2a67955667becc2de0f18ed2209fca90010a5d4e80000000100000000000000000809cd6f137e6a187a636fa7e369403511972aa50010a5d4e80000000100000000000000001018ab1c3cfa510be3fe6e2e29542771b3a6186f0010a5d4e800000001000000000000000074c3ef7e006a15baf6a33af6a1bf6e9434dc4efe0010a5d4e8000000010000000000000000ee74b074b2f5e6ffcce85da4a7e172cc911b90170010a5d4e80000000100000000000000004945b3bb36d9dc89df6f88e155d82503ee5feb9c0010a5d4e800000001000000000000000058d5676ed8fc30fa344ff9bfe224a4f94c098d750010a5d4e80000000100000000000000003300cac841a4acf1fd7527f4e76a173e8bc9ad550010a5d4e8000000010000000000000000889e62956a764db1143a4b588b4e4e886f79ef430010a5d4e8000000010000000000000000e8a1b38eb944d4501eb2ab60588a00d3a9c739a20010a5d4e8000000010000000000000000a5df92d314b2e133286a7cc0036bb836bc384df00010a5d4e8000000010000000000000000dba81d12c864e678c0a910f49d1e9d100f765ac30010a5d4e800000001000000000000000066958a5798c6f07a75ecc259866972c7db30fe930010a5d4e80000000100000000000000003c6aa14df1ceb2d3d90a72993124c4aee438dcf20010a5d4e8000000010000000000000000d8486eba19a2ec0a76bc7b5a6e729c28989c02dd0010a5d4e80000000100000000000000001731aacce97b0fcae9b3915d798a31e0bcdbecd20010a5d4e80000000100000000000000007f331280a851eab18e40a4f2e01e0423a61c88d20010a5d4e8000000010000000000000000f51d276fd69c55c5ae75617455bba63576eb55380010a5d4e8000000010000000000000000166261d8e0f4d7199137547f9d983093b8a83e010010a5d4e800000001000000000000000077a6cd82676ea569c2e29637bf021440f83c1b590010a5d4e8000000010000000000000000dd00b7bedd4b2c17e33c9f759c817751e5a03bac0010a5d4e800000001000000000000000007f2cc54dd0a7f9f9f8990765a160056e34cfe5c0010a5d4e8000000010000000000000000982aa1d396453abf15c827ef803d3d1fa42780750010a5d4e80000000100000000000000002e6f4e09ebf69c38051e82d47ff4f30ecb01636d0010a5d4e8000000010000000000000000da3771a1702dd6bd74e27ff495635e9fd5cfc8b90010a5d4e8000000010000000000000000ab270f3d713326ea04bbb76a40567ec9b68a0fdc0010a5d4e80000000100000000000000006ba2cf38a2e4e4490ef2aa6a13d334afe08e274b0010a5d4e8000000010000000000000000a2453b1d2c51e7e46576809e432e1d0f796c17cc0010a5d4e800000001000000000000000061f2ded3c11aa8cbff5428071deaaddd122b3d420010a5d4e800000001000000000000000006bcde3dcddf5eddbf36699de5edee76ae5381080010a5d4e800000001000000000000000034cf985956e53c3642ff24204510c09d2ec1f4160010a5d4e8000000010000000000000000c2d87e5ad2284c4b20b0630278b1b2afa51c8e4d0010a5d4e8000000010000000000000000cb1ed1ca9a81c76c138b733c1dba907cf2f6226f0010a5d4e80000000100000000000000004432ff17249de4f481203271f2433d0ff15963c20010a5d4e8000000010000000000000000575ee0f1bc6da3e3f5e1fdb2c30fe19289706b380010a5d4e800000001000000000000000078b7a73acfb87248b4a9b0313b4a258fc02568780010a5d4e800000001000000000000000094af09440255b4fe091e6087b18ebb3cd0b51d950010a5d4e80000000100000000000000009433ea55cb302024be8bde7bdff6ee614250899f0010a5d4e80000000100000000000000008de14bb4e87c177c14dfdd24d02c20e374bf05980010a5d4e800000001000000000000000025d7d3adff155dbfe0a8bb14a0efce72f82c8f530010a5d4e800000001000000000000000073659ddc6abd6d650ea735217e270f2cdf8f8e130010a5d4e80000000100000000000000007acbcc273b744075aeda6d93eeaa0ca3254b9dc30010a5d4e80000000100000000000000000d5837faf1dfab11e677852f1a004d5d2baa42fa0010a5d4e800000001000000000000000059380ebef923f2ec486888b0c6995655674e040d0010a5d4e800000001000000000000000056d06de791cface3fd12b262d4d1423eb11c1e6a0010a5d4e80000000100000000000000002a1045c8658b31d4be807a3734392d6f57cde1240010a5d4e80000000100000000000000003f98366594201e7641d404f2b5ae39ccb0e8840f0010a5d4e8000000010000000000000000d4f20c5eecf2159b66f9f3589cbb867a4979379e0010a5d4e8000000010000000000000000910b34a9fc34d4e9e4bdcd6b74017b376594b5a90010a5d4e80000000100000000000000001501051031afb8c1d978f8a6321dad9da114eee80010a5d4e8000000010000000000000000735927d116e5525d7f838a80cfaf4e41bbb5ce800010a5d4e8000000010000000000000000b5eb6ababe63206afefe9d69fe992162fa153a640010a5d4e8000000010000000000000000c55f1829761cd09dcbc117773fba906d3725eb1e0010a5d4e80000000100000000000000009b1fa3b8c4384fdae6ebf8adea1e327e74e649500010a5d4e80000000100000000000000009ece1f4291d35085f591333e497c1cec1183fc180010a5d4e800000001000000000000000049f419e3b8f22decc8ee51028016eb55e985f7540010a5d4e8000000010000000000000000a1c88901f123e1db30e01f632751d399d65371230010a5d4e8000000010000000000000000235ca41ff24d9ff52eda3dd948d976f167a868e80010a5d4e8000000010000000000000000637ff1cbb8c3989e4b5db6d687d5ebebb1eaeb440010a5d4e8000000010000000000000000e725485a2470e78c1ce948fcb475b6e58776b1b10010a5d4e8000000010000000000000000e55ebb425ff92f8f7d58f9bd4aa0a0df525c43fa0010a5d4e8000000010000000000000000f057f31ba7e6637669ed7039890d1cf3f07cd9c80010a5d4e800000001000000000000000041655ba68f745889e3ef649da6a26a3aae9169890010a5d4e80000000100000000000000008e8626e13f0393501cb2d25d4bbf4ae0afa4313f0010a5d4e80000000100000000000000009b02543dfce6942233a949eef327456039a145b40010a5d4e8000000010000000000000000e4900ea254300601620bda6af3a6cfe75b9ae1640010a5d4e80000000100000000000000003c858662d8b1f9460e6ddb5c30d368570a66c9390010a5d4e80000000100000000000000005dc40df06b99f88042a9d03999e10c17c86fc5db0010a5d4e80000000100000000000000" + }, + { + "inputs": [ + { + "hashIn": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 999990000000, + "hour": 1 + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coin": 10000000, + "hour": 0 + } + ], + "signatures": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "innerHash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "block": 2, + "raw": "dc000000004daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca3184901000000f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de0101000000e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f7602000000003be2537f8c0893fddcddc878518f38ea493d949e80790cd4e800000001000000000000000079ae1e8799c65b4c01e18b3b4135410c5b711f3680969800000000000000000000000000" + }, + { + "inputs": [ + { + "hashIn": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 10000000, + "hour": 0 + } + ], + "signatures": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "innerHash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "block": 3, + "raw": "b700000000ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa101000000ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af0101000000af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a01000000003be2537f8c0893fddcddc878518f38ea493d949e80969800000000000000000000000000" + }, + { + "inputs": [ + { + "hashIn": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "index": 0 + }, + { + "hashIn": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 999890000000, + "hour": 4073 + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coin": 100000000, + "hour": 0 + } + ], + "signatures": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "innerHash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "block": 5, + "raw": "3d01000000fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e02000000056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c614168008aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601020000009eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf7002000000003be2537f8c0893fddcddc878518f38ea493d949e809816cee8000000e90f00000000000000ef3b60779f014b3c7acf27c16c9acc3ff3bea61600e1f505000000000000000000000000" + }, + { + "inputs": [ + { + "hashIn": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "index": 0 + }, + { + "hashIn": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "index": 0 + } + ], + "outputs": [ + { + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coin": 2000000, + "hour": 0 + } + ], + "signatures": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "innerHash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "block": 24, + "raw": "180100000002b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d02000000fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d96210023530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf0102000000182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c220900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c01000000002e32707e91eb71a2dc7517c70a877fed9faf7a6080841e00000000000000000000000000" + }, + { + "inputs": [ + { + "hashIn": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "index": 0 + }, + { + "hashIn": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "index": 0 + }, + { + "hashIn": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "index": 0 + }, + { + "hashIn": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "index": 0 + }, + { + "hashIn": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 50000000, + "hour": 7510 + } + ], + "signatures": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "innerHash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "block": 99, + "raw": "3b0200000002e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c405000000efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f30000d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301050000002987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193ddc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059dbe4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb01000000003be2537f8c0893fddcddc878518f38ea493d949e80f0fa0200000000561d000000000000" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tsconfig.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tsconfig.json new file mode 100644 index 00000000..1f9b5585 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2016", + "dom" + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tslint.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tslint.json new file mode 100644 index 00000000..cd6c2c00 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tslint.json @@ -0,0 +1,159 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 200 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" + } + ], + "typeof-compare": true, + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-module", + "check-separator", + "check-type", + "check-typecast", + "check-preblock" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "trailing-comma": [ + true, + { + "multiline": "always", + "esSpecCompliant": true + } + ], + "newline-before-return": true, + "space-before-function-paren": [true, "never"], + "prefer-method-signature": true + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/empty.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/empty.go new file mode 100644 index 00000000..d93f2e3f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/empty.go @@ -0,0 +1,5 @@ +// Package kvstorage contains the implementation for a +// key-value storage of arbitrary data. `Manager` is used to +// access the storage contents. Each storage is presented by its own `KVStorageType` +// and each type has its own associated file to persist data +package kvstorage diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/error.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/error.go new file mode 100644 index 00000000..ef634dba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/error.go @@ -0,0 +1,16 @@ +package kvstorage + +// Error wraps key-value storage related errors. +// It wraps errors caused by user input, but not errors caused by +// programmer input or internal issues. +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage.go new file mode 100644 index 00000000..dd9caa0a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage.go @@ -0,0 +1,162 @@ +package kvstorage + +import ( + "crypto/sha256" + "encoding/base64" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "sync" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +var ( + // ErrNoSuchKey is returned when the specified key does not exist + // in the storage instance + ErrNoSuchKey = NewError(errors.New("no such key exists in the storage")) +) + +// kvStorage is a key-value storage for storing arbitrary data +type kvStorage struct { + fn string + data map[string]string + sync.RWMutex +} + +// newKVStorage constructs new storage instance using the file with the filename +// to persist data +func newKVStorage(fn string) (*kvStorage, error) { + storage := kvStorage{ + fn: fn, + } + + if err := file.LoadJSON(fn, &storage.data); err != nil { + logger.Warningf("newKVStorage LoadJSON(%s) failed: %v", fn, err) + cfp, err := makeCorruptFilePath(fn) + if err != nil { + return nil, fmt.Errorf("Failed to make corrupt file path: %v", err) + } + if err := os.Rename(fn, cfp); err != nil { + return nil, fmt.Errorf("Rename %s to %s failed: %v", fn, cfp, err) + } + logger.Infof("Backup the corrupted file from: %s to %s", fn, cfp) + if err := initEmptyStorage(fn); err != nil { + return nil, err + } + storage.data = make(map[string]string) + } + + return &storage, nil +} + +// makeCorruptFilePath creates a $FILE.corrupt.$HASH string based on file path, +// where $HASH is truncated SHA1 of $FILE. +func makeCorruptFilePath(path string) (string, error) { + fileHash, err := shaFileID(path) + if err != nil { + return "", err + } + + dir, file := filepath.Split(path) + newFile := fmt.Sprintf("%s.corrupt.%s", file, fileHash) + newPath := filepath.Join(dir, newFile) + + return newPath, nil +} + +// shaFileID return the first 8 bytes of the SHA1 hash of the file, +// hex-encoded +func shaFileID(path string) (string, error) { + fi, err := os.Open(path) + if err != nil { + return "", err + } + defer fi.Close() + + h := sha256.New() + if _, err := io.Copy(h, fi); err != nil { + return "", err + } + + sum := h.Sum(nil) + encodedSum := base64.RawURLEncoding.EncodeToString(sum[:8]) + return encodedSum, nil +} + +// get gets the value associated with the `key`. Returns `ErrNoSuchKey` +func (s *kvStorage) get(key string) (string, error) { + s.RLock() + defer s.RUnlock() + + val, ok := s.data[key] + if !ok { + return "", ErrNoSuchKey + } + + return val, nil +} + +// getAll gets the snapshot of the current storage contents +func (s *kvStorage) getAll() map[string]string { + s.RLock() + defer s.RUnlock() + + return copyMap(s.data) +} + +// add adds the `val` value to the storage with the specified `key`. Replaces the +// original value if `key` already exists +func (s *kvStorage) add(key, val string) error { + s.Lock() + defer s.Unlock() + + // save original data + oldVal, oldOk := s.data[key] + + s.data[key] = val + + // try to persist data, fall back to original data on error + if err := s.flush(); err != nil { + if !oldOk { + delete(s.data, key) + } else { + s.data[key] = oldVal + } + + return err + } + + return nil +} + +// remove removes the value associated with the `key`. Returns `ErrNoSuchKey` +func (s *kvStorage) remove(key string) error { + s.Lock() + defer s.Unlock() + + if _, ok := s.data[key]; !ok { + return ErrNoSuchKey + } + + // save original data + oldVal := s.data[key] + + delete(s.data, key) + + // try to persist data, fall back to original data on error + if err := s.flush(); err != nil { + s.data[key] = oldVal + + return err + } + + return nil +} + +// flush persists data to file +func (s *kvStorage) flush() error { + return file.SaveJSON(s.fn, s.data, 0600) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage_test.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage_test.go new file mode 100644 index 00000000..57be749a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage_test.go @@ -0,0 +1,390 @@ +package kvstorage + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +const ( + testDataFilename = "data" + storageFileExtension + testEmptyFilename = "empty" + storageFileExtension + testCorruptFilename = "corrupt" + storageFileExtension +) + +func setupTmpDir(t *testing.T) (string, func()) { + tmpDir, err := ioutil.TempDir("", "kvstoragetest") + require.NoError(t, err) + + if err != nil { + return "", func() {} + } + + return tmpDir, func() { + _ = os.RemoveAll(tmpDir) //nolint:errcheck + } +} + +func setupTestFile(t *testing.T, fn string) { + data := map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + } + + err := file.SaveJSON(fn, data, 0600) + require.NoError(t, err) +} + +func setupEmptyTestFile(t *testing.T, fn string) { + data := make(map[string]string) + + err := file.SaveJSON(fn, data, 0600) + require.NoError(t, err) +} + +func setupCorruptedTestFile(t *testing.T, fn string) { + f, err := os.Create(fn) + require.NoError(t, err) + defer f.Close() + _, err = f.Write([]byte("corrupt json file")) + require.NoError(t, err) +} + +func TestNewKVStorage(t *testing.T) { + type expect struct { + storage *kvStorage + expectError bool + expectCorruptFile string + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + // Setup test data + dataFilename := filepath.Join(tmpDir, testDataFilename) + setupTestFile(t, dataFilename) + // Setup corrupt data file + corruptDataFilename := filepath.Join(tmpDir, testCorruptFilename) + setupCorruptedTestFile(t, corruptDataFilename) + + tt := []struct { + name string + fn string + expect expect + }{ + { + name: "no such file", + fn: "nofile.json", + expect: expect{ + storage: nil, + expectError: true, + }, + }, + { + name: "file exists", + fn: dataFilename, + expect: expect{ + storage: &kvStorage{ + fn: dataFilename, + data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + }, + { + name: "corrupted file", + fn: corruptDataFilename, + expect: expect{ + storage: &kvStorage{ + fn: corruptDataFilename, + data: map[string]string{}, // an empty file will be when a corrupted file is detected + }, + expectCorruptFile: corruptDataFilename + ".corrupt.9NGyOAcMBB4", + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + storage, err := newKVStorage(tc.fn) + if tc.expect.expectError { + require.Error(t, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + require.Equal(t, tc.expect.storage, storage) + + if tc.expect.expectCorruptFile != "" { + // Check if the file does exist + _, err := os.Stat(tc.expect.expectCorruptFile) + require.False(t, os.IsNotExist(err)) + } + }) + } +} + +func TestKVStorageGet(t *testing.T) { + type expect struct { + val string + err error + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + dataFilename := filepath.Join(tmpDir, testDataFilename) + setupTestFile(t, dataFilename) + + storage, err := newKVStorage(dataFilename) + require.NoError(t, err) + + tt := []struct { + name string + storage *kvStorage + key string + expect expect + }{ + { + name: "no such key", + storage: storage, + key: "key", + expect: expect{ + err: ErrNoSuchKey, + }, + }, + { + name: "simple string value", + storage: storage, + key: "test1", + expect: expect{ + val: "some value", + err: nil, + }, + }, + { + name: "complex marshaled data", + storage: storage, + key: "test2", + expect: expect{ + val: "{\"key\":\"val\",\"key2\":2}", + err: nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + val, err := tc.storage.get(tc.key) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Equal(t, tc.expect.val, val) + }) + } +} + +func TestKVStorageGetAll(t *testing.T) { + type expect struct { + data map[string]string + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + dataFilename := filepath.Join(tmpDir, testDataFilename) + emptyFilename := filepath.Join(tmpDir, testEmptyFilename) + + setupTestFile(t, dataFilename) + setupEmptyTestFile(t, emptyFilename) + + filledStorage, err := newKVStorage(dataFilename) + require.NoError(t, err) + emptyStorage, err := newKVStorage(emptyFilename) + require.NoError(t, err) + + tt := []struct { + name string + storage *kvStorage + expect expect + }{ + { + name: "filled storage", + storage: filledStorage, + expect: expect{ + data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + { + name: "empty storage", + storage: emptyStorage, + expect: expect{ + data: map[string]string{}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + data := tc.storage.getAll() + require.Equal(t, tc.expect.data, data) + }) + } +} + +func TestKVStorageAdd(t *testing.T) { + type expect struct { + newData map[string]string + expectError bool + } + + tt := []struct { + name string + key string + val string + expect expect + }{ + { + name: "add new value", + key: "new key", + val: "new value", + expect: expect{ + newData: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + "new key": "new value", + }, + }, + }, + { + name: "replace old value", + key: "test1", + val: "oiuy", + expect: expect{ + newData: map[string]string{ + "test1": "oiuy", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + dataFilename := filepath.Join(tmpDir, testDataFilename) + setupTestFile(t, dataFilename) + + storage, err := newKVStorage(dataFilename) + require.NoError(t, err) + + // acquire the original data + originalData := storage.getAll() + + err = storage.add(tc.key, tc.val) + if tc.expect.expectError { + require.Error(t, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + modifiedData := storage.getAll() + + // resave the original data back to file + err = file.SaveJSON(storage.fn, originalData, 0600) + require.NoError(t, err) + + require.Equal(t, tc.expect.newData, modifiedData) + }) + } +} + +func TestKVStorageRemove(t *testing.T) { + type expect struct { + newData map[string]string + expectError bool + err error + } + + tt := []struct { + name string + key string + expect expect + }{ + { + name: "no such key", + key: "no key", + expect: expect{ + newData: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + expectError: true, + err: ErrNoSuchKey, + }, + }, + { + name: "removed", + key: "test1", + expect: expect{ + newData: map[string]string{ + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + dataFilename := filepath.Join(tmpDir, testDataFilename) + setupTestFile(t, dataFilename) + + storage, err := newKVStorage(dataFilename) + require.NoError(t, err) + + // acquire the original data + originalData := storage.getAll() + + err = storage.remove(tc.key) + if tc.expect.expectError { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + newData := storage.getAll() + + // resave the original data back to file + err = file.SaveJSON(storage.fn, originalData, 0600) + require.NoError(t, err) + + require.Equal(t, tc.expect.newData, newData) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager.go new file mode 100644 index 00000000..f673259a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager.go @@ -0,0 +1,252 @@ +package kvstorage + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// Type is a type of a key-value storage +type Type string + +const ( + // TypeTxIDNotes is a type of storage containing transaction notes + TypeTxIDNotes Type = "txid" + // TypeGeneral is a type of storage for general user data + TypeGeneral Type = "client" +) + +const storageFileExtension = ".json" + +var ( + // ErrStorageAPIDisabled is returned while trying to do storage actions while + // the EnableStorageAPI option is false + ErrStorageAPIDisabled = NewError(errors.New("Storage API is disabled")) + // ErrNoSuchStorage is returned if no storage with the specified storage type loaded + ErrNoSuchStorage = NewError(errors.New("Storage with such type is not loaded")) + // ErrStorageAlreadyLoaded is returned while trying to load already loaded storage + ErrStorageAlreadyLoaded = NewError(errors.New("Storage with such type is already loaded")) + // ErrUnknownKVStorageType is returned while trying to access the storage of the unknown type + ErrUnknownKVStorageType = NewError(errors.New("Unknown storage type")) + + logger = logging.MustGetLogger("kvstorage") +) + +// Manager is a manager for key-value storage instances +type Manager struct { + config Config + storages map[Type]*kvStorage + sync.Mutex +} + +// NewManager constructs new manager according to the config +func NewManager(c Config) (*Manager, error) { + logger.Info("Creating new KVStorage manager") + + m := &Manager{ + config: c, + storages: make(map[Type]*kvStorage), + } + + if !strings.HasSuffix(m.config.StorageDir, "/") { + m.config.StorageDir += "/" + } + + if !m.config.EnableStorageAPI { + logger.Info("KVStorage is disabled") + return m, nil + } + + if err := os.MkdirAll(m.config.StorageDir, os.FileMode(0700)); err != nil { + return nil, fmt.Errorf("failed to create kvstorage directory %s: %v", m.config.StorageDir, err) + } + + for _, t := range m.config.EnabledStorages { + if err := m.LoadStorage(t); err != nil { + return nil, err + } + } + + return m, nil +} + +// LoadStorage loads a new storage instance for the `storageType` +// into the manager. Returns `ErrStorageAlreadyLoaded`, `ErrStorageAPIDisabled`, +// `ErrUnknownKVStorageType` +func (m *Manager) LoadStorage(storageType Type) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if m.storageExists(storageType) { + return ErrStorageAlreadyLoaded + } + + fn := m.getStorageFilePath(storageType) + + exists, err := file.Exists(fn) + if err != nil { + return fmt.Errorf("Manager.LoadStorage file.Exists failed: %v", err) + } + if !exists { + if err := initEmptyStorage(fn); err != nil { + return fmt.Errorf("Manager.LoadStorage initEmptyStorage failed: %v", err) + } + } + + storage, err := newKVStorage(fn) + if err != nil { + return err + } + + m.storages[storageType] = storage + + return nil +} + +// UnloadStorage unloads the storage instance for the given `storageType` from the manager. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) UnloadStorage(storageType Type) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return ErrNoSuchStorage + } + + delete(m.storages, storageType) + + return nil +} + +// GetStorageValue gets the value associated with the `key` from the storage of `storageType. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) GetStorageValue(storageType Type, key string) (string, error) { + if !isStorageTypeValid(storageType) { + return "", ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return "", ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return "", ErrNoSuchStorage + } + + return m.storages[storageType].get(key) +} + +// GetAllStorageValues gets the snapshot of the current contents from storage of `storageType`. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) GetAllStorageValues(storageType Type) (map[string]string, error) { + if !isStorageTypeValid(storageType) { + return nil, ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return nil, ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return nil, ErrNoSuchStorage + } + + return m.storages[storageType].getAll(), nil +} + +// AddStorageValue adds the `val` with the associated `key` to the storage of `storageType`. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) AddStorageValue(storageType Type, key, val string) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return ErrNoSuchStorage + } + + return m.storages[storageType].add(key, val) +} + +// RemoveStorageValue removes the value with the associated `key` from the storage of `storageType`. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) RemoveStorageValue(storageType Type, key string) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return ErrNoSuchStorage + } + + return m.storages[storageType].remove(key) +} + +// storageExists checks whether the storage of `storageType` exists in the manager +func (m *Manager) storageExists(storageType Type) bool { + _, ok := m.storages[storageType] + + return ok +} + +// getStorageFilePath creates the path to the storage of `storageType` in file system +func (m *Manager) getStorageFilePath(storageType Type) string { + return filepath.Join(m.config.StorageDir, fmt.Sprintf("%s%s", storageType, storageFileExtension)) +} + +// isStorageTypeValid validates the given `storageType` against the predefined available types +func isStorageTypeValid(storageType Type) bool { + switch storageType { + case TypeTxIDNotes, TypeGeneral: + return true + } + + return false +} + +// initEmptyStorage creates a file to persist data +func initEmptyStorage(fn string) error { + return file.SaveJSON(fn, map[string]string{}, 0600) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_config.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_config.go new file mode 100644 index 00000000..82c68a9f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_config.go @@ -0,0 +1,15 @@ +package kvstorage + +// Config is a configuration for storage manager +type Config struct { + StorageDir string + EnabledStorages []Type + EnableStorageAPI bool +} + +// NewConfig creates a default config. +func NewConfig() Config { + return Config{ + StorageDir: "./data/", + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_test.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_test.go new file mode 100644 index 00000000..dc0f5bc1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_test.go @@ -0,0 +1,574 @@ +package kvstorage + +import ( + "fmt" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/file" +) + +func TestLoadStorage(t *testing.T) { + type expect struct { + expectError bool + err error + } + + tt := []struct { + name string + manager *Manager + storageType Type + expect expect + }{ + { + name: "API disabled", + manager: &Manager{ + storages: make(map[Type]*kvStorage), + }, + storageType: TypeTxIDNotes, + expect: expect{ + expectError: true, + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + }, + storageType: "unknown", + expect: expect{ + expectError: true, + err: ErrUnknownKVStorageType, + }, + }, + { + name: "storage already loaded", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: map[Type]*kvStorage{ + TypeTxIDNotes: nil, + }, + }, + storageType: TypeTxIDNotes, + expect: expect{ + expectError: true, + err: ErrStorageAlreadyLoaded, + }, + }, + { + name: "OK", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + }, + storageType: TypeTxIDNotes, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + tc.manager.config.StorageDir = tmpDir + + err := tc.manager.LoadStorage(tc.storageType) + if tc.expect.expectError { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + testutil.RequireFileExists(t, tc.manager.getStorageFilePath(tc.storageType)) + }) + } +} + +func TestUnloadStorage(t *testing.T) { + type expect struct { + expectError bool + err error + } + + tt := []struct { + name string + manager *Manager + storageType Type + expect expect + }{ + { + name: "API disabled", + manager: &Manager{}, + storageType: TypeGeneral, + expect: expect{ + expectError: true, + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + }, + storageType: "unknown", + expect: expect{ + expectError: true, + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + }, + storageType: TypeGeneral, + expect: expect{ + expectError: true, + err: ErrNoSuchStorage, + }, + }, + { + name: "OK", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: map[Type]*kvStorage{ + TypeTxIDNotes: nil, + }, + }, + storageType: TypeTxIDNotes, + }, + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + // init file for tests + manager := &Manager{ + config: Config{ + StorageDir: tmpDir, + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + } + err := manager.LoadStorage(TypeTxIDNotes) + require.NoError(t, err) + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + tc.manager.config.StorageDir = tmpDir + err := tc.manager.UnloadStorage(tc.storageType) + if tc.expect.expectError { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + testutil.RequireFileExists(t, tc.manager.getStorageFilePath(tc.storageType)) + }) + } +} + +func TestManagerGetStorageValue(t *testing.T) { + type expect struct { + val string + err error + } + + tt := []struct { + name string + enableAPI bool + storageDataDir string + loadStorage bool + storageTypeToLoad Type + storageType Type + key string + expect expect + }{ + { + name: "API disabled", + storageDataDir: "./testdata/", + storageType: TypeTxIDNotes, + key: "key", + expect: expect{ + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + enableAPI: true, + storageDataDir: "./testdata/", + storageType: "unknown", + expect: expect{ + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + enableAPI: true, + storageDataDir: "./testdata/", + storageType: TypeTxIDNotes, + expect: expect{ + err: ErrNoSuchStorage, + }, + }, + { + name: "no such key", + enableAPI: true, + storageDataDir: "./testdata/", + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "unknown", + expect: expect{ + err: ErrNoSuchKey, + }, + }, + { + name: "OK - simple string", + enableAPI: true, + storageDataDir: "./testdata/", + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "test1", + expect: expect{ + val: "some value", + }, + }, + { + name: "OK - complex marshaled data", + enableAPI: true, + storageDataDir: "./testdata/", + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "test2", + expect: expect{ + val: "{\"key\":\"val\",\"key2\":2}", + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + c := NewConfig() + c.EnableStorageAPI = tc.enableAPI + c.StorageDir = "./testdata/" + m, err := NewManager(c) + require.NoError(t, err) + + if tc.loadStorage { + err := m.LoadStorage(tc.storageTypeToLoad) + require.NoError(t, err) + } + + val, err := m.GetStorageValue(tc.storageType, tc.key) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Equal(t, tc.expect.val, val) + }) + } +} + +func TestManagerGetAllStorageValues(t *testing.T) { + type expect struct { + data map[string]string + err error + } + + tt := []struct { + name string + storageDataDir string + enableAPI bool + loadStorage bool + storageTypeToLoad Type + storageType Type + expect expect + }{ + { + name: "API disabled", + storageDataDir: "./testdata/", + storageType: TypeTxIDNotes, + expect: expect{ + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + enableAPI: true, + storageDataDir: "./testdata/", + storageType: "unknown", + expect: expect{ + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + enableAPI: true, + storageDataDir: "./testdata/", + storageType: TypeTxIDNotes, + expect: expect{ + err: ErrNoSuchStorage, + }, + }, + { + name: "OK", + enableAPI: true, + storageDataDir: "./testdata/", + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + expect: expect{ + data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + c := NewConfig() + c.EnableStorageAPI = tc.enableAPI + c.StorageDir = "./testdata/" + m, err := NewManager(c) + require.NoError(t, err) + + if tc.loadStorage { + err := m.LoadStorage(tc.storageTypeToLoad) + require.NoError(t, err) + } + + data, err := m.GetAllStorageValues(tc.storageType) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Equal(t, tc.expect.data, data) + }) + } +} + +func TestManagerAddStorageValue(t *testing.T) { + type expect struct { + expectErr bool + err error + } + + tt := []struct { + name string + enableAPI bool + loadStorage bool + storageTypeToLoad Type + storageType Type + key string + val string + expect expect + }{ + { + name: "API disabled", + storageType: TypeTxIDNotes, + key: "key", + val: "val", + expect: expect{ + expectErr: true, + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + enableAPI: true, + storageType: "unknown", + key: "key", + val: "val", + expect: expect{ + expectErr: true, + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + enableAPI: true, + storageType: TypeTxIDNotes, + key: "key", + val: "val", + expect: expect{ + expectErr: true, + err: ErrNoSuchStorage, + }, + }, + { + name: "add new value", + enableAPI: true, + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "key", + val: "val", + }, + { + name: "replace old value", + enableAPI: true, + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "test1", + val: "oiuy", + }, + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + setupTestFile(t, filepath.Join(tmpDir, fmt.Sprintf("%s%s", TypeTxIDNotes, storageFileExtension))) + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + m, err := NewManager(NewConfig()) + require.NoError(t, err) + m.config.EnableStorageAPI = tc.enableAPI + m.config.StorageDir = tmpDir + + if tc.loadStorage { + err := m.LoadStorage(tc.storageTypeToLoad) + require.NoError(t, err) + } + + err = m.AddStorageValue(tc.storageType, tc.key, tc.val) + if tc.expect.expectErr { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestManagerRemoveStorageValue(t *testing.T) { + type expect struct { + expectErr bool + err error + } + + tt := []struct { + name string + enableAPI bool + loadStorage bool + storageTypeToLoad Type + storageType Type + key string + expect expect + }{ + { + name: "API disabled", + storageType: TypeTxIDNotes, + key: "key", + expect: expect{ + expectErr: true, + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + enableAPI: true, + storageType: "unknown", + key: "key", + expect: expect{ + expectErr: true, + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + enableAPI: true, + storageType: TypeTxIDNotes, + key: "key", + expect: expect{ + expectErr: true, + err: ErrNoSuchStorage, + }, + }, + { + name: "no such key", + enableAPI: true, + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "key", + expect: expect{ + expectErr: true, + err: ErrNoSuchKey, + }, + }, + { + name: "OK", + enableAPI: true, + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "test1", + }, + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + // Copy the testdata/txid.json file to a tmp dir, so it can be operated on + filename := fmt.Sprintf("%s%s", TypeTxIDNotes, storageFileExtension) + srcFilename := filepath.Join("./testdata/", filename) + dstFilename := filepath.Join(tmpDir, filename) + err := file.Copy(dstFilename, srcFilename) + require.NoError(t, err) + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + c := NewConfig() + c.EnableStorageAPI = tc.enableAPI + c.StorageDir = tmpDir + m, err := NewManager(c) + require.NoError(t, err) + + if tc.loadStorage { + err := m.LoadStorage(tc.storageTypeToLoad) + require.NoError(t, err) + } + + err = m.RemoveStorageValue(tc.storageType, tc.key) + if tc.expect.expectErr { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/map.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/map.go new file mode 100644 index 00000000..3df52771 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/map.go @@ -0,0 +1,12 @@ +package kvstorage + +// Copy copies the map contents to the new map +func copyMap(data map[string]string) map[string]string { + copied := make(map[string]string, len(data)) + + for k, v := range data { + copied[k] = v + } + + return copied +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/data.json b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/data.json new file mode 100644 index 00000000..e57c0482 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/data.json @@ -0,0 +1,4 @@ +{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}" +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/empty.json b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/empty.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/empty.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/txid.json b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/txid.json new file mode 100644 index 00000000..e57c0482 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/txid.json @@ -0,0 +1,4 @@ +{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}" +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/distribution.go b/vendor/github.com/SkycoinProject/skycoin/src/params/distribution.go new file mode 100644 index 00000000..b1fe2d1c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/distribution.go @@ -0,0 +1,153 @@ +package params + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +// Distribution parameters define the initial coin distribution and unlocking schedule +type Distribution struct { + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds + // Once the InitialUnlockedCount is exhausted, + // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 + + // Addresses are the distribution addresses that received coins in the + // first block after the genesis block + Addresses []string + addressesDecoded []cipher.Address +} + +// MustValidate validates Distribution parameters, panics on error +func (d *Distribution) MustValidate() { + if err := d.Validate(); err != nil { + panic(err) + } +} + +// Validate validates Distribution parameters +func (d *Distribution) Validate() error { + if d.InitialUnlockedCount > uint64(len(d.Addresses)) { + return errors.New("unlocked addresses > total distribution addresses") + } + + if d.MaxCoinSupply%uint64(len(d.Addresses)) != 0 { + return errors.New("MaxCoinSupply should be perfectly divisible by len(addresses)") + } + + if err := d.decodeAddresses(); err != nil { + return err + } + + return nil +} + +// AddressInitialBalance is the initial balance of each distribution address +func (d *Distribution) AddressInitialBalance() uint64 { + return d.MaxCoinSupply / uint64(len(d.Addresses)) +} + +// UnlockedAddresses returns distribution addresses that are unlocked, i.e. they have spendable outputs +func (d *Distribution) UnlockedAddresses() []string { + // The first InitialUnlockedCount (25) addresses are unlocked by default. + // Subsequent addresses will be unlocked at a rate of UnlockAddressRate (5) per year, + // after the InitialUnlockedCount (25) addresses have no remaining balance. + // The unlock timer will be enabled manually once the + // InitialUnlockedCount (25) addresses are distributed. + + // NOTE: To have automatic unlocking, transaction verification would have + // to be handled in visor rather than in coin.Transactions.Visor(), because + // the coin package is agnostic to the state of the blockchain and cannot reference it. + // Instead of automatic unlocking, we can hardcode the timestamp at which the first 30% + // is distributed, then compute the unlocked addresses easily here. + + addrs := make([]string, d.InitialUnlockedCount) + copy(addrs[:], d.Addresses[:d.InitialUnlockedCount]) + return addrs +} + +// LockedAddresses returns distribution addresses that are locked, i.e. they have unspendable outputs +func (d *Distribution) LockedAddresses() []string { + // TODO -- once we reach 30% distribution, we can hardcode the + // initial timestamp for releasing more coins + addrs := make([]string, d.numLocked()) + copy(addrs, d.Addresses[d.InitialUnlockedCount:]) + return addrs +} + +// AddressesDecoded returns a copy of the hardcoded distribution addresses array. +// Each address has 1,000,000 coins. There are 100 addresses. +func (d *Distribution) AddressesDecoded() []cipher.Address { + d.mustDecodeAddresses() + addrs := make([]cipher.Address, len(d.addressesDecoded)) + copy(addrs, d.addressesDecoded) + return addrs +} + +// UnlockedAddressesDecoded returns distribution addresses that are unlocked, i.e. they have spendable outputs +func (d *Distribution) UnlockedAddressesDecoded() []cipher.Address { + // The first d.InitialUnlockedCount (25) addresses are unlocked by default. + // Subsequent addresses will be unlocked at a rate of UnlockAddressRate (5) per year, + // after the d.InitialUnlockedCount (25) addresses have no remaining balance. + // The unlock timer will be enabled manually once the + // d.InitialUnlockedCount (25) addresses are distributed. + + // NOTE: To have automatic unlocking, transaction verification would have + // to be handled in visor rather than in coin.Transactions.Visor(), because + // the coin package is agnostic to the state of the blockchain and cannot reference it. + // Instead of automatic unlocking, we can hardcode the timestamp at which the first 30% + // is distributed, then compute the unlocked addresses easily here. + d.mustDecodeAddresses() + addrs := make([]cipher.Address, d.InitialUnlockedCount) + copy(addrs[:], d.addressesDecoded[:d.InitialUnlockedCount]) + return addrs +} + +// LockedAddressesDecoded returns distribution addresses that are locked, i.e. they have unspendable outputs +func (d *Distribution) LockedAddressesDecoded() []cipher.Address { + // TODO -- once we reach 30% distribution, we can hardcode the + // initial timestamp for releasing more coins + d.mustDecodeAddresses() + addrs := make([]cipher.Address, d.numLocked()) + copy(addrs, d.addressesDecoded[d.InitialUnlockedCount:]) + return addrs +} + +func (d *Distribution) numLocked() uint64 { + n := uint64(len(d.Addresses)) + if n < d.InitialUnlockedCount { + panic("number of distribution addresses is less than InitialUnlockedCount") + } + return n - d.InitialUnlockedCount +} + +func (d *Distribution) decodeAddresses() error { + if len(d.addressesDecoded) == len(d.Addresses) { + return nil + } + + decodedAddrs := make([]cipher.Address, len(d.Addresses)) + for i, a := range d.Addresses { + var err error + decodedAddrs[i], err = cipher.DecodeBase58Address(a) + if err != nil { + return err + } + } + + d.addressesDecoded = decodedAddrs + return nil +} + +func (d *Distribution) mustDecodeAddresses() { + if err := d.decodeAddresses(); err != nil { + panic(err) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/distribution_test.go b/vendor/github.com/SkycoinProject/skycoin/src/params/distribution_test.go new file mode 100644 index 00000000..129f241f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/distribution_test.go @@ -0,0 +1,56 @@ +package params + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestDistributionAddressArrays(t *testing.T) { + require.Len(t, MainNetDistribution.Addresses, 100) + + // At the time of this writing, there should be 25 addresses in the + // unlocked pool and 75 in the locked pool. + require.Len(t, MainNetDistribution.UnlockedAddresses(), 25) + require.Len(t, MainNetDistribution.LockedAddresses(), 75) + + addrsMap := make(map[string]struct{}) + for _, a := range MainNetDistribution.Addresses { + // Check no duplicate address in distribution addresses + _, ok := addrsMap[a] + require.False(t, ok) + addrsMap[a] = struct{}{} + } + + unlocked := MainNetDistribution.UnlockedAddresses() + unlockedMap := make(map[string]struct{}) + for _, a := range unlocked { + // Check no duplicate address in unlocked addresses + _, ok := unlockedMap[a] + require.False(t, ok) + + // Check unlocked address in set of all addresses + _, ok = addrsMap[a] + require.True(t, ok) + + unlockedMap[a] = struct{}{} + } + + locked := MainNetDistribution.LockedAddresses() + lockedMap := make(map[string]struct{}) + for _, a := range locked { + // Check no duplicate address in locked addresses + _, ok := lockedMap[a] + require.False(t, ok) + + // Check locked address in set of all addresses + _, ok = addrsMap[a] + require.True(t, ok) + + // Check locked address not in unlocked addresses + _, ok = unlockedMap[a] + require.False(t, ok) + + lockedMap[a] = struct{}{} + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/droplet.go b/vendor/github.com/SkycoinProject/skycoin/src/params/droplet.go new file mode 100644 index 00000000..fb0c57aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/droplet.go @@ -0,0 +1,34 @@ +package params + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/util/droplet" +) + +var ( + // ErrInvalidDecimals is returned by DropletPrecisionCheck if a coin amount has an invalid number of decimal places + ErrInvalidDecimals = errors.New("invalid amount, too many decimal places") +) + +// DropletPrecisionToDivisor converts number of allowed decimal places to the modulus divisor used when checking droplet precision rules +func DropletPrecisionToDivisor(precision uint8) uint64 { + if precision > droplet.Exponent { + panic("precision must be <= droplet.Exponent") + } + + n := droplet.Exponent - precision + var i uint64 = 1 + for k := uint8(0); k < n; k++ { + i = i * 10 + } + return i +} + +// DropletPrecisionCheck checks if an amount of coins is valid given decimal place restrictions +func DropletPrecisionCheck(precision uint8, amount uint64) error { + if amount%DropletPrecisionToDivisor(precision) != 0 { + return ErrInvalidDecimals + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/droplet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/params/droplet_test.go new file mode 100644 index 00000000..80ef82a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/droplet_test.go @@ -0,0 +1,37 @@ +package params + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + _require "github.com/SkycoinProject/skycoin/src/testutil/require" +) + +func TestDropletPrecisionToDivisor(t *testing.T) { + cases := []struct { + precision uint8 + divisor uint64 + }{ + {0, 1e6}, + {1, 1e5}, + {2, 1e4}, + {3, 1e3}, + {4, 1e2}, + {5, 1e1}, + {6, 1}, + } + + for _, tc := range cases { + name := fmt.Sprintf("DropletPrecisionToDivisor(%d)=%d", tc.precision, tc.divisor) + t.Run(name, func(t *testing.T) { + divisor := DropletPrecisionToDivisor(tc.precision) + require.Equal(t, tc.divisor, divisor, "%d != %d", tc.divisor, divisor) + }) + } + + _require.PanicsWithLogMessage(t, "precision must be <= droplet.Exponent", func() { + DropletPrecisionToDivisor(7) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/init.go b/vendor/github.com/SkycoinProject/skycoin/src/params/init.go new file mode 100644 index 00000000..a6a64229 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/init.go @@ -0,0 +1,78 @@ +package params + +import ( + "fmt" + "os" + "strconv" + + "github.com/SkycoinProject/skycoin/src/util/droplet" +) + +func init() { + loadUserBurnFactor() + loadUserMaxTransactionSize() + loadUserMaxDecimals() + sanityCheck() +} + +func sanityCheck() { + if err := UserVerifyTxn.Validate(); err != nil { + panic(err) + } + + MainNetDistribution.MustValidate() +} + +func loadUserBurnFactor() { + xs := os.Getenv("USER_BURN_FACTOR") + if xs == "" { + return + } + + x, err := strconv.ParseUint(xs, 10, 32) + if err != nil { + panic(fmt.Sprintf("Invalid USER_BURN_FACTOR %q: %v", xs, err)) + } + + if x < uint64(MinBurnFactor) { + panic(fmt.Sprintf("USER_BURN_FACTOR must be >= %d", MinBurnFactor)) + } + + UserVerifyTxn.BurnFactor = uint32(x) +} + +func loadUserMaxTransactionSize() { + xs := os.Getenv("USER_MAX_TXN_SIZE") + if xs == "" { + return + } + + x, err := strconv.ParseUint(xs, 10, 32) + if err != nil { + panic(fmt.Sprintf("Invalid USER_MAX_TXN_SIZE %q: %v", xs, err)) + } + + if x < uint64(MinTransactionSize) { + panic(fmt.Sprintf("USER_MAX_TXN_SIZE must be >= %d", MinTransactionSize)) + } + + UserVerifyTxn.MaxTransactionSize = uint32(x) +} + +func loadUserMaxDecimals() { + xs := os.Getenv("USER_MAX_DECIMALS") + if xs == "" { + return + } + + x, err := strconv.ParseUint(xs, 10, 8) + if err != nil { + panic(fmt.Sprintf("Invalid USER_MAX_DECIMALS %q: %v", xs, err)) + } + + if x > uint64(droplet.Exponent) { + panic(fmt.Sprintf("USER_MAX_DECIMALS must be <= %d", droplet.Exponent)) + } + + UserVerifyTxn.MaxDropletPrecision = uint8(x) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/params.go b/vendor/github.com/SkycoinProject/skycoin/src/params/params.go new file mode 100644 index 00000000..7ae26c12 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/params.go @@ -0,0 +1,128 @@ +package params + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +var ( + // MainNetDistribution Skycoin mainnet coin distribution parameters + MainNetDistribution = Distribution{ + MaxCoinSupply: 100000000, + InitialUnlockedCount: 25, + UnlockAddressRate: 5, + UnlockTimeInterval: 31536000, + Addresses: []string{ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + }, + } + + // UserVerifyTxn transaction verification parameters for user-created transactions + UserVerifyTxn = VerifyTxn{ + // BurnFactor can be overriden with `USER_BURN_FACTOR` env var + BurnFactor: 10, + // MaxTransactionSize can be overriden with `USER_MAX_TXN_SIZE` env var + MaxTransactionSize: 32768, // in bytes + // MaxDropletPrecision can be overriden with `USER_MAX_DECIMALS` env var + MaxDropletPrecision: 3, + } +) diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/verify_txn.go b/vendor/github.com/SkycoinProject/skycoin/src/params/verify_txn.go new file mode 100644 index 00000000..0296c1f0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/verify_txn.go @@ -0,0 +1,55 @@ +package params + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/util/droplet" +) + +const ( + // MinBurnFactor minimum value for BurnFactor + MinBurnFactor uint32 = 2 + // MinTransactionSize minimum value for MaxTransactionSize + MinTransactionSize uint32 = 1024 +) + +var ( + // ErrInvalidBurnFactor BurnFactor value is out of range + ErrInvalidBurnFactor = errors.New("BurnFactor value is out of range") + // ErrInvalidMaxTransactionSize MaxTransactionSize value is out of range + ErrInvalidMaxTransactionSize = errors.New("MaxTransactionSize value is out of range") + // ErrInvalidMaxDropletPrecision MaxDropletPrecision value is out of range + ErrInvalidMaxDropletPrecision = errors.New("MaxDropletPrecision value is out of range") +) + +// VerifyTxn are parameters for verifying a transaction +type VerifyTxn struct { + // BurnFactor inverse fraction of coinhours that must be burned + BurnFactor uint32 + // MaxTransactionSize maximum size of a transaction in bytes + MaxTransactionSize uint32 + // MaxDropletPrecision maximum decimal precision of droplets + MaxDropletPrecision uint8 +} + +// MaxDropletDivisor return the modulus divisor used when checking droplet precision rules +func (v VerifyTxn) MaxDropletDivisor() uint64 { + return DropletPrecisionToDivisor(v.MaxDropletPrecision) +} + +// Validate validates the configured parameters +func (v VerifyTxn) Validate() error { + if v.BurnFactor < MinBurnFactor { + return ErrInvalidBurnFactor + } + + if v.MaxTransactionSize < MinTransactionSize { + return ErrInvalidMaxTransactionSize + } + + if v.MaxDropletPrecision > droplet.Exponent { + return ErrInvalidMaxDropletPrecision + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/block.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/block.go new file mode 100644 index 00000000..211d625e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/block.go @@ -0,0 +1,145 @@ +/* +Package readable defines JSON-tagged struct representations of internal binary data structures, +for use by the API and CLI. +*/ +package readable + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// BlockHeader represents the readable block header +type BlockHeader struct { + BkSeq uint64 `json:"seq"` + Hash string `json:"block_hash"` + PreviousHash string `json:"previous_block_hash"` + Time uint64 `json:"timestamp"` + Fee uint64 `json:"fee"` + Version uint32 `json:"version"` + BodyHash string `json:"tx_body_hash"` + UxHash string `json:"ux_hash"` +} + +// NewBlockHeader creates a readable block header +func NewBlockHeader(b coin.BlockHeader) BlockHeader { + return BlockHeader{ + BkSeq: b.BkSeq, + Hash: b.Hash().Hex(), + PreviousHash: b.PrevHash.Hex(), + Time: b.Time, + Fee: b.Fee, + Version: b.Version, + BodyHash: b.BodyHash.Hex(), + UxHash: b.UxHash.Hex(), + } +} + +// ToCoinBlockHeader converts BlockHeader back to coin.BlockHeader +func (bh BlockHeader) ToCoinBlockHeader() (coin.BlockHeader, error) { + prevHash, err := cipher.SHA256FromHex(bh.PreviousHash) + if err != nil { + return coin.BlockHeader{}, err + } + + bodyHash, err := cipher.SHA256FromHex(bh.BodyHash) + if err != nil { + return coin.BlockHeader{}, err + } + + uxHash, err := cipher.SHA256FromHex(bh.UxHash) + if err != nil { + return coin.BlockHeader{}, err + } + + headHash, err := cipher.SHA256FromHex(bh.Hash) + if err != nil { + return coin.BlockHeader{}, err + } + + cbh := coin.BlockHeader{ + Version: bh.Version, + Time: bh.Time, + BkSeq: bh.BkSeq, + Fee: bh.Fee, + PrevHash: prevHash, + BodyHash: bodyHash, + UxHash: uxHash, + } + + if cbh.Hash() != headHash { + return coin.BlockHeader{}, errors.New("readable.BlockHeader.Hash != recovered coin.BlockHeader.Hash()") + } + + return cbh, nil +} + +// BlockBody represents a readable block body +type BlockBody struct { + Transactions []Transaction `json:"txns"` +} + +// NewBlockBody creates a readable block body +func NewBlockBody(b coin.Block) (*BlockBody, error) { + txns := make([]Transaction, len(b.Body.Transactions)) + isGenesis := b.Head.BkSeq == 0 + for i := range b.Body.Transactions { + txn, err := NewTransaction(b.Body.Transactions[i], isGenesis) + if err != nil { + return nil, err + } + txns[i] = *txn + } + + return &BlockBody{ + Transactions: txns, + }, nil +} + +// Block represents a readable block +type Block struct { + Head BlockHeader `json:"header"` + Body BlockBody `json:"body"` + Size uint32 `json:"size"` +} + +// NewBlock creates a readable block +func NewBlock(b coin.Block) (*Block, error) { + body, err := NewBlockBody(b) + if err != nil { + return nil, err + } + + size, err := b.Size() + if err != nil { + return nil, err + } + + return &Block{ + Head: NewBlockHeader(b.Head), + Body: *body, + Size: size, + }, nil +} + +// Blocks an array of readable blocks. +type Blocks struct { + Blocks []Block `json:"blocks"` +} + +// NewBlocks converts []coin.SignedBlock to Blocks +func NewBlocks(blocks []coin.SignedBlock) (*Blocks, error) { + rbs := make([]Block, 0, len(blocks)) + for _, b := range blocks { + rb, err := NewBlock(b.Block) + if err != nil { + return nil, err + } + rbs = append(rbs, *rb) + } + return &Blocks{ + Blocks: rbs, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/blockchain.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/blockchain.go new file mode 100644 index 00000000..cd55ccd9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/blockchain.go @@ -0,0 +1,58 @@ +package readable + +import ( + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// BlockchainMetadata encapsulates useful information from the coin.Blockchain +type BlockchainMetadata struct { + // Most recent block's header + Head BlockHeader `json:"head"` + // Number of unspent outputs in the coin.Blockchain + Unspents uint64 `json:"unspents"` + // Number of known unconfirmed txns + Unconfirmed uint64 `json:"unconfirmed"` +} + +// NewBlockchainMetadata creates blockchain metadata +func NewBlockchainMetadata(bm visor.BlockchainMetadata) BlockchainMetadata { + return BlockchainMetadata{ + Head: NewBlockHeader(bm.HeadBlock.Head), + Unspents: bm.Unspents, + Unconfirmed: bm.Unconfirmed, + } +} + +// BlockchainProgress is the current blockchain syncing status +type BlockchainProgress struct { + // Our current blockchain length + Current uint64 `json:"current"` + // Our best guess at true blockchain length + Highest uint64 `json:"highest"` + // Individual blockchain length reports from peers + Peers []PeerBlockchainHeight `json:"peers"` +} + +// PeerBlockchainHeight is a peer's IP address with their reported blockchain height +type PeerBlockchainHeight struct { + Address string `json:"address"` + Height uint64 `json:"height"` +} + +// NewBlockchainProgress copies daemon.BlockchainProgress to a struct with json tags +func NewBlockchainProgress(bp *daemon.BlockchainProgress) BlockchainProgress { + peers := make([]PeerBlockchainHeight, len(bp.Peers)) + for i, p := range bp.Peers { + peers[i] = PeerBlockchainHeight{ + Address: p.Address, + Height: p.Height, + } + } + + return BlockchainProgress{ + Current: bp.Current, + Highest: bp.Highest, + Peers: peers, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/fiber.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/fiber.go new file mode 100644 index 00000000..3c5bc921 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/fiber.go @@ -0,0 +1,16 @@ +package readable + +import "github.com/SkycoinProject/skycoin/src/cipher/bip44" + +// FiberConfig is fiber configuration parameters +type FiberConfig struct { + Name string `json:"name"` + DisplayName string `json:"display_name"` + Ticker string `json:"ticker"` + CoinHoursName string `json:"coin_hours_display_name"` + CoinHoursNameSingular string `json:"coin_hours_display_name_singular"` + CoinHoursTicker string `json:"coin_hours_ticker"` + ExplorerURL string `json:"explorer_url"` + VersionURL string `json:"version_url"` + Bip44Coin bip44.CoinType `json:"bip44_coin"` +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/network.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/network.go new file mode 100644 index 00000000..777730b2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/network.go @@ -0,0 +1,73 @@ +package readable + +import ( + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +// Connection a connection's state within the daemon +type Connection struct { + GnetID uint64 `json:"id"` + Addr string `json:"address"` + LastSent int64 `json:"last_sent"` + LastReceived int64 `json:"last_received"` + ConnectedAt int64 `json:"connected_at"` + Outgoing bool `json:"outgoing"` + State daemon.ConnectionState `json:"state"` + Mirror uint32 `json:"mirror"` + ListenPort uint16 `json:"listen_port"` + Height uint64 `json:"height"` + UserAgent useragent.Data `json:"user_agent"` + IsTrustedPeer bool `json:"is_trusted_peer"` + UnconfirmedVerifyTxn VerifyTxn `json:"unconfirmed_verify_transaction"` +} + +// NewConnection copies daemon.Connection to a struct with json tags +func NewConnection(c *daemon.Connection) Connection { + var lastSent int64 + var lastReceived int64 + var connectedAt int64 + + if !c.Gnet.LastSent.IsZero() { + lastSent = c.Gnet.LastSent.Unix() + } + if !c.Gnet.LastReceived.IsZero() { + lastReceived = c.Gnet.LastReceived.Unix() + } + if !c.ConnectedAt.IsZero() { + connectedAt = c.ConnectedAt.Unix() + } + + return Connection{ + GnetID: c.Gnet.ID, + Addr: c.Addr, + LastSent: lastSent, + LastReceived: lastReceived, + ConnectedAt: connectedAt, + Outgoing: c.Outgoing, + State: c.State, + Mirror: c.Mirror, + ListenPort: c.ListenPort, + Height: c.Height, + UserAgent: c.UserAgent, + IsTrustedPeer: c.Pex.Trusted, + UnconfirmedVerifyTxn: NewVerifyTxn(c.UnconfirmedVerifyTxn), + } +} + +// VerifyTxn transaction verification parameters +type VerifyTxn struct { + BurnFactor uint32 `json:"burn_factor"` + MaxTransactionSize uint32 `json:"max_transaction_size"` + MaxDropletPrecision uint8 `json:"max_decimals"` +} + +// NewVerifyTxn converts params.VerifyTxn to VerifyTxn +func NewVerifyTxn(p params.VerifyTxn) VerifyTxn { + return VerifyTxn{ + BurnFactor: p.BurnFactor, + MaxTransactionSize: p.MaxTransactionSize, + MaxDropletPrecision: p.MaxDropletPrecision, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/output.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/output.go new file mode 100644 index 00000000..a06fc0c2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/output.go @@ -0,0 +1,276 @@ +package readable + +import ( + "errors" + "fmt" + "sort" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/historydb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// UnspentOutput represents a readable output +type UnspentOutput struct { + Hash string `json:"hash"` + Time uint64 `json:"time"` + BkSeq uint64 `json:"block_seq"` + SourceTransaction string `json:"src_tx"` + Address string `json:"address"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` +} + +// NewUnspentOutput creates a readable output +func NewUnspentOutput(uxOut visor.UnspentOutput) (UnspentOutput, error) { + coinStr, err := droplet.ToString(uxOut.Body.Coins) + if err != nil { + return UnspentOutput{}, err + } + + return UnspentOutput{ + Hash: uxOut.Hash().Hex(), + Time: uxOut.Head.Time, + BkSeq: uxOut.Head.BkSeq, + SourceTransaction: uxOut.Body.SrcTransaction.Hex(), + Address: uxOut.Body.Address.String(), + Coins: coinStr, + Hours: uxOut.Body.Hours, + CalculatedHours: uxOut.CalculatedHours, + }, nil +} + +// UnspentOutputs slice of UnspentOutput +type UnspentOutputs []UnspentOutput + +// NewUnspentOutputs converts unspent outputs to a readable output +func NewUnspentOutputs(uxs []visor.UnspentOutput) (UnspentOutputs, error) { + rxReadables := make(UnspentOutputs, len(uxs)) + for i, ux := range uxs { + out, err := NewUnspentOutput(ux) + if err != nil { + return UnspentOutputs{}, err + } + + rxReadables[i] = out + } + + // Sort UnspentOutputs newest to oldest, using hash to break ties + sort.Slice(rxReadables, func(i, j int) bool { + if rxReadables[i].Time == rxReadables[j].Time { + return strings.Compare(rxReadables[i].Hash, rxReadables[j].Hash) < 0 + } + return rxReadables[i].Time > rxReadables[j].Time + }) + + return rxReadables, nil +} + +// Balance returns the balance in droplets +func (ros UnspentOutputs) Balance() (wallet.Balance, error) { + var bal wallet.Balance + for _, out := range ros { + coins, err := droplet.FromString(out.Coins) + if err != nil { + return wallet.Balance{}, err + } + + bal.Coins, err = mathutil.AddUint64(bal.Coins, coins) + if err != nil { + return wallet.Balance{}, err + } + + bal.Hours, err = mathutil.AddUint64(bal.Hours, out.CalculatedHours) + if err != nil { + return wallet.Balance{}, err + } + } + + return bal, nil +} + +// ToUxArray converts UnspentOutputs to coin.UxArray +func (ros UnspentOutputs) ToUxArray() (coin.UxArray, error) { + var uxs coin.UxArray + for _, o := range ros { + coins, err := droplet.FromString(o.Coins) + if err != nil { + return nil, err + } + + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return nil, err + } + + srcTx, err := cipher.SHA256FromHex(o.SourceTransaction) + if err != nil { + return nil, err + } + + uxs = append(uxs, coin.UxOut{ + Head: coin.UxHead{ + Time: o.Time, + BkSeq: o.BkSeq, + }, + Body: coin.UxBody{ + SrcTransaction: srcTx, + Address: addr, + Coins: coins, + Hours: o.Hours, + }, + }) + } + + return uxs, nil +} + +// OutputsToUxBalances converts UnspentOutputs to []transaction.UxBalance +func OutputsToUxBalances(ros UnspentOutputs) ([]transaction.UxBalance, error) { + uxb := make([]transaction.UxBalance, len(ros)) + for i, ro := range ros { + if ro.Hash == "" { + return nil, errors.New("UnspentOutput missing hash") + } + + hash, err := cipher.SHA256FromHex(ro.Hash) + if err != nil { + return nil, fmt.Errorf("UnspentOutput hash is invalid: %v", err) + } + + coins, err := droplet.FromString(ro.Coins) + if err != nil { + return nil, fmt.Errorf("UnspentOutput coins is invalid: %v", err) + } + + addr, err := cipher.DecodeBase58Address(ro.Address) + if err != nil { + return nil, fmt.Errorf("UnspentOutput address is invalid: %v", err) + } + + srcTx, err := cipher.SHA256FromHex(ro.SourceTransaction) + if err != nil { + return nil, fmt.Errorf("UnspentOutput src_tx is invalid: %v", err) + } + + b := transaction.UxBalance{ + Hash: hash, + Time: ro.Time, + BkSeq: ro.BkSeq, + SrcTransaction: srcTx, + Address: addr, + Coins: coins, + Hours: ro.CalculatedHours, + InitialHours: ro.Hours, + } + + uxb[i] = b + } + + return uxb, nil +} + +// UnspentOutputsSummary records unspent outputs in different status. +type UnspentOutputsSummary struct { + Head BlockHeader `json:"head"` + // HeadOutputs are unspent outputs confirmed in the blockchain + HeadOutputs UnspentOutputs `json:"head_outputs"` + // OutgoingOutputs are unspent outputs being spent in unconfirmed transactions + OutgoingOutputs UnspentOutputs `json:"outgoing_outputs"` + // IncomingOutputs are unspent outputs being created by unconfirmed transactions + IncomingOutputs UnspentOutputs `json:"incoming_outputs"` +} + +// NewUnspentOutputsSummary creates an UnspentOutputsSummary from visor.UnspentOutputsSummary +func NewUnspentOutputsSummary(summary *visor.UnspentOutputsSummary) (*UnspentOutputsSummary, error) { + headOutputs, err := NewUnspentOutputs(summary.Confirmed) + if err != nil { + return nil, err + } + + outgoingOutputs, err := NewUnspentOutputs(summary.Outgoing) + if err != nil { + return nil, err + } + + incomingOutputs, err := NewUnspentOutputs(summary.Incoming) + if err != nil { + return nil, err + } + + return &UnspentOutputsSummary{ + Head: NewBlockHeader(summary.HeadBlock.Head), + HeadOutputs: headOutputs, + OutgoingOutputs: outgoingOutputs, + IncomingOutputs: incomingOutputs, + }, nil +} + +// SpendableOutputs subtracts OutgoingOutputs from HeadOutputs +func (os UnspentOutputsSummary) SpendableOutputs() UnspentOutputs { + if len(os.OutgoingOutputs) == 0 { + return os.HeadOutputs + } + + spending := make(map[string]struct{}, len(os.OutgoingOutputs)) + for _, u := range os.OutgoingOutputs { + spending[u.Hash] = struct{}{} + } + + var outs UnspentOutputs + for i := range os.HeadOutputs { + if _, ok := spending[os.HeadOutputs[i].Hash]; !ok { + outs = append(outs, os.HeadOutputs[i]) + } + } + return outs +} + +// ExpectedOutputs adds IncomingOutputs to SpendableOutputs +func (os UnspentOutputsSummary) ExpectedOutputs() UnspentOutputs { + return append(os.SpendableOutputs(), os.IncomingOutputs...) +} + +// SpentOutput is an unspent output that was spent +type SpentOutput struct { + Uxid string `json:"uxid"` + Time uint64 `json:"time"` + SrcBkSeq uint64 `json:"src_block_seq"` + SrcTx string `json:"src_tx"` + OwnerAddress string `json:"owner_address"` + Coins uint64 `json:"coins"` + Hours uint64 `json:"hours"` + SpentBlockSeq uint64 `json:"spent_block_seq"` // block seq that spent the output. + SpentTxnID string `json:"spent_tx"` // id of tx which spent this output. +} + +// NewSpentOutput creates a SpentOutput from historydb.UxOut +func NewSpentOutput(out *historydb.UxOut) SpentOutput { + return SpentOutput{ + Uxid: out.Hash().Hex(), + Time: out.Out.Head.Time, + SrcBkSeq: out.Out.Head.BkSeq, + SrcTx: out.Out.Body.SrcTransaction.Hex(), + OwnerAddress: out.Out.Body.Address.String(), + Coins: out.Out.Body.Coins, + Hours: out.Out.Body.Hours, + SpentBlockSeq: out.SpentBlockSeq, + SpentTxnID: out.SpentTxnID.Hex(), + } +} + +// NewSpentOutputs creates []SpentOutput from []historydb.UxOut +func NewSpentOutputs(outs []historydb.UxOut) []SpentOutput { + spents := make([]SpentOutput, len(outs)) + for i, o := range outs { + spents[i] = NewSpentOutput(&o) + } + return spents +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/richlist.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/richlist.go new file mode 100644 index 00000000..87aa061b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/richlist.go @@ -0,0 +1,32 @@ +package readable + +import ( + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// RichlistBalance holds info an address balance holder +type RichlistBalance struct { + Address string `json:"address"` + Coins string `json:"coins"` + Locked bool `json:"locked"` +} + +// NewRichlistBalances copies from visor.Richlist +func NewRichlistBalances(visorRichlist visor.Richlist) ([]RichlistBalance, error) { + richlist := make([]RichlistBalance, len(visorRichlist)) + for i, v := range visorRichlist { + coins, err := droplet.ToString(v.Coins) + if err != nil { + return nil, err + } + + richlist[i] = RichlistBalance{ + Address: v.Address.String(), + Coins: coins, + Locked: v.Locked, + } + } + + return richlist, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/transaction.go new file mode 100644 index 00000000..29326714 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/transaction.go @@ -0,0 +1,252 @@ +package readable + +import ( + "errors" + "fmt" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/timeutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +var logger = logging.MustGetLogger("readable") + +// TransactionStatus represents the transaction status +type TransactionStatus struct { + Confirmed bool `json:"confirmed"` + Unconfirmed bool `json:"unconfirmed"` + // If confirmed, how many blocks deep in the chain it is. Will be at least 1 if confirmed + Height uint64 `json:"height"` + // If confirmed, the sequence of the block in which the transaction was executed + BlockSeq uint64 `json:"block_seq"` +} + +// NewTransactionStatus creates TransactionStatus from visor.TransactionStatus +func NewTransactionStatus(status visor.TransactionStatus) TransactionStatus { + return TransactionStatus{ + Unconfirmed: !status.Confirmed, + Confirmed: status.Confirmed, + Height: status.Height, + BlockSeq: status.BlockSeq, + } +} + +// TransactionOutput readable transaction output +type TransactionOutput struct { + Hash string `json:"uxid"` + Address string `json:"dst"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` +} + +// TransactionInput readable transaction input +type TransactionInput struct { + Hash string `json:"uxid"` + Address string `json:"owner"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` +} + +// NewTransactionOutput creates a TransactionOutput +func NewTransactionOutput(txn *coin.TransactionOutput, txid cipher.SHA256) (*TransactionOutput, error) { + coinStr, err := droplet.ToString(txn.Coins) + if err != nil { + return nil, err + } + + return &TransactionOutput{ + Hash: txn.UxID(txid).Hex(), + Address: txn.Address.String(), + Coins: coinStr, + Hours: txn.Hours, + }, nil +} + +// NewTransactionInput creates a TransactionInput from a visor.TransactionInput +func NewTransactionInput(input visor.TransactionInput) (TransactionInput, error) { + coinStr, err := droplet.ToString(input.UxOut.Body.Coins) + if err != nil { + logger.Errorf("Failed to convert coins to string: %v", err) + return TransactionInput{}, err + } + + return TransactionInput{ + Hash: input.UxOut.Hash().Hex(), + Address: input.UxOut.Body.Address.String(), + Coins: coinStr, + Hours: input.UxOut.Body.Hours, + CalculatedHours: input.CalculatedHours, + }, nil +} + +// Transaction represents a readable transaction +type Transaction struct { + Timestamp uint64 `json:"timestamp,omitempty"` + Length uint32 `json:"length"` + Type uint8 `json:"type"` + Hash string `json:"txid"` + InnerHash string `json:"inner_hash"` + + Sigs []string `json:"sigs"` + In []string `json:"inputs"` + Out []TransactionOutput `json:"outputs"` +} + +// NewTransaction creates a readable transaction +func NewTransaction(txn coin.Transaction, isGenesis bool) (*Transaction, error) { + if isGenesis && len(txn.In) != 0 { + return nil, errors.New("NewTransaction: isGenesis=true but Transaction.In is not empty") + } + if !isGenesis && len(txn.In) == 0 { + return nil, errors.New("NewTransaction: isGenesis=false but Transaction.In is empty") + } + + // Genesis transaction uses empty SHA256 as the txid for its outputs [FIXME: requires hardfork] + txID := txn.Hash() + txnOutputTxID := cipher.SHA256{} + if !isGenesis { + txnOutputTxID = txID + } + + sigs := make([]string, len(txn.Sigs)) + for i := range txn.Sigs { + sigs[i] = txn.Sigs[i].Hex() + } + + in := make([]string, len(txn.In)) + for i := range txn.In { + in[i] = txn.In[i].Hex() + } + + out := make([]TransactionOutput, len(txn.Out)) + for i := range txn.Out { + o, err := NewTransactionOutput(&txn.Out[i], txnOutputTxID) + if err != nil { + return nil, err + } + + out[i] = *o + } + + return &Transaction{ + Length: txn.Length, + Type: txn.Type, + Hash: txID.Hex(), + InnerHash: txn.InnerHash.Hex(), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} + +// NewTransactionWithTimestamp creates a readable transaction with its timestamp set +func NewTransactionWithTimestamp(txn coin.Transaction, isGenesis bool, timestamp uint64) (*Transaction, error) { + newTxn, err := NewTransaction(txn, isGenesis) + if err != nil { + return nil, err + } + newTxn.Timestamp = timestamp + return newTxn, nil +} + +// UnconfirmedTransactions represents a readable unconfirmed transaction +type UnconfirmedTransactions struct { + Transaction Transaction `json:"transaction"` + Received time.Time `json:"received"` + Checked time.Time `json:"checked"` + Announced time.Time `json:"announced"` + IsValid bool `json:"is_valid"` +} + +// NewUnconfirmedTransaction creates a readable unconfirmed transaction +func NewUnconfirmedTransaction(unconfirmed *visor.UnconfirmedTransaction) (*UnconfirmedTransactions, error) { + isGenesis := false // unconfirmed transactions are never the genesis transaction + txn, err := NewTransaction(unconfirmed.Transaction, isGenesis) + if err != nil { + return nil, err + } + return &UnconfirmedTransactions{ + Transaction: *txn, + Received: timeutil.NanoToTime(unconfirmed.Received), + Checked: timeutil.NanoToTime(unconfirmed.Checked), + Announced: timeutil.NanoToTime(unconfirmed.Announced), + IsValid: unconfirmed.IsValid == 1, + }, nil +} + +// NewUnconfirmedTransactions converts []visor.UnconfirmedTransaction to []UnconfirmedTransactions +func NewUnconfirmedTransactions(txns []visor.UnconfirmedTransaction) ([]UnconfirmedTransactions, error) { + rut := make([]UnconfirmedTransactions, len(txns)) + for i := range txns { + txn, err := NewUnconfirmedTransaction(&txns[i]) + if err != nil { + return []UnconfirmedTransactions{}, err + } + rut[i] = *txn + } + return rut, nil +} + +// TransactionWithStatus represents transaction result +type TransactionWithStatus struct { + Status TransactionStatus `json:"status"` + Time uint64 `json:"time"` + Transaction Transaction `json:"txn"` +} + +// NewTransactionWithStatus converts visor.Transaction to TransactionWithStatus +func NewTransactionWithStatus(txn *visor.Transaction) (*TransactionWithStatus, error) { + if txn == nil { + return nil, nil + } + + isGenesis := txn.Status.BlockSeq == 0 && txn.Status.Confirmed + rbTxn, err := NewTransactionWithTimestamp(txn.Transaction, isGenesis, txn.Time) + if err != nil { + return nil, err + } + + return &TransactionWithStatus{ + Transaction: *rbTxn, + Status: NewTransactionStatus(txn.Status), + Time: txn.Time, + }, nil +} + +// TransactionWithStatusVerbose represents verbose transaction result +type TransactionWithStatusVerbose struct { + Status TransactionStatus `json:"status"` + Time uint64 `json:"time"` + Transaction TransactionVerbose `json:"txn"` +} + +// NewTransactionWithStatusVerbose converts visor.Transaction to TransactionWithStatusVerbose +func NewTransactionWithStatusVerbose(txn *visor.Transaction, inputs []visor.TransactionInput) (*TransactionWithStatusVerbose, error) { + if txn == nil { + return nil, nil + } + + if len(txn.Transaction.In) != len(inputs) { + return nil, fmt.Errorf("NewTransactionWithStatusVerbose: len(txn.In) != len(inputs) [%d != %d]", len(txn.Transaction.In), len(inputs)) + } + + rbTxn, err := NewTransactionVerbose(*txn, inputs) + if err != nil { + return nil, err + } + + // Force the Status field to be hidden on the inner transaction, to maintain API compatibility + rbTxn.Status = nil + + return &TransactionWithStatusVerbose{ + Transaction: rbTxn, + Status: NewTransactionStatus(txn.Status), + Time: txn.Time, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/verbose.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/verbose.go new file mode 100644 index 00000000..1ad82791 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/verbose.go @@ -0,0 +1,258 @@ +package readable + +import ( + "errors" + "fmt" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/util/timeutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// BlockBodyVerbose represents a verbose readable block body +type BlockBodyVerbose struct { + Transactions []BlockTransactionVerbose `json:"txns"` +} + +// BlockVerbose represents a readable block with verbose data +type BlockVerbose struct { + Head BlockHeader `json:"header"` + Body BlockBodyVerbose `json:"body"` + Size uint32 `json:"size"` +} + +// NewBlockBodyVerbose creates a verbose readable block body +func NewBlockBodyVerbose(b coin.Block, inputs [][]visor.TransactionInput) (*BlockBodyVerbose, error) { + if len(inputs) != len(b.Body.Transactions) { + return nil, fmt.Errorf("NewBlockBodyVerbose: len(inputs) != len(b.Body.Transactions) (seq=%d)", b.Head.BkSeq) + } + + txns := make([]BlockTransactionVerbose, len(b.Body.Transactions)) + for i := range b.Body.Transactions { + t := b.Body.Transactions[i] + + txn, err := NewBlockTransactionVerbose(t, inputs[i], b.Head.BkSeq == 0) + if err != nil { + return nil, err + } + txns[i] = txn + } + + return &BlockBodyVerbose{ + Transactions: txns, + }, nil +} + +// NewBlockVerbose creates a verbose readable block +func NewBlockVerbose(b coin.Block, inputs [][]visor.TransactionInput) (*BlockVerbose, error) { + body, err := NewBlockBodyVerbose(b, inputs) + if err != nil { + return nil, err + } + + size, err := b.Size() + if err != nil { + return nil, err + } + + return &BlockVerbose{ + Head: NewBlockHeader(b.Head), + Body: *body, + Size: size, + }, nil +} + +// BlocksVerbose an array of verbose readable blocks. +type BlocksVerbose struct { + Blocks []BlockVerbose `json:"blocks"` +} + +// NewBlocksVerbose creates BlocksVerbose from []BlockVerbose +func NewBlocksVerbose(blocks []coin.SignedBlock, inputs [][][]visor.TransactionInput) (*BlocksVerbose, error) { + bs := make([]BlockVerbose, len(blocks)) + for i := range blocks { + if i >= len(inputs) { + return nil, errors.New("NewBlocksVerbose: not enough inputs for blocks") + } + + b, err := NewBlockVerbose(blocks[i].Block, inputs[i]) + if err != nil { + return nil, err + } + + bs[i] = *b + } + + return &BlocksVerbose{ + Blocks: bs, + }, nil +} + +// BlockTransactionVerbose has readable transaction data for transactions inside a block. It differs from Transaction +// in that it includes metadata for transaction inputs and the calculated coinhour fee spent by the block +type BlockTransactionVerbose struct { + Length uint32 `json:"length"` + Type uint8 `json:"type"` + Hash string `json:"txid"` + InnerHash string `json:"inner_hash"` + Fee uint64 `json:"fee"` + + Sigs []string `json:"sigs"` + In []TransactionInput `json:"inputs"` + Out []TransactionOutput `json:"outputs"` +} + +// NewBlockTransactionVerbose creates BlockTransactionVerbose +func NewBlockTransactionVerbose(txn coin.Transaction, inputs []visor.TransactionInput, isGenesis bool) (BlockTransactionVerbose, error) { + if len(inputs) != len(txn.In) { + return BlockTransactionVerbose{}, errors.New("NewBlockTransactionVerbose: len(inputs) != len(txn.In)") + } + + // Genesis transaction uses empty SHA256 as txid + // FIXME: If/when the blockchain is regenerated, use a real hash as the txID for the genesis block. The bkSeq argument can be removed then. + txID := cipher.SHA256{} + if !isGenesis { + txID = txn.Hash() + } + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + out := make([]TransactionOutput, len(txn.Out)) + for i := range txn.Out { + o, err := NewTransactionOutput(&txn.Out[i], txID) + if err != nil { + return BlockTransactionVerbose{}, err + } + + out[i] = *o + } + + var hoursIn uint64 + for _, i := range inputs { + if _, err := mathutil.AddUint64(hoursIn, i.CalculatedHours); err != nil { + logger.Critical().Warningf("Ignoring NewBlockTransactionVerbose summing txn %s input hours error: %v", txID.Hex(), err) + } + hoursIn += i.CalculatedHours + } + + var hoursOut uint64 + for _, o := range txn.Out { + if _, err := mathutil.AddUint64(hoursOut, o.Hours); err != nil { + logger.Critical().Warningf("Ignoring NewBlockTransactionVerbose summing txn %s outputs hours error: %v", txID.Hex(), err) + } + + hoursOut += o.Hours + } + + var fee uint64 + if isGenesis { + if hoursIn != 0 { + err := errors.New("NewBlockTransactionVerbose genesis block should have 0 input hours") + return BlockTransactionVerbose{}, err + } + + fee = 0 + } else { + if hoursIn < hoursOut { + err := fmt.Errorf("NewBlockTransactionVerbose input hours is less than output hours, txid=%s", txID.Hex()) + return BlockTransactionVerbose{}, err + } + + fee = hoursIn - hoursOut + } + + txnInputs := make([]TransactionInput, len(inputs)) + for i, input := range inputs { + var err error + txnInputs[i], err = NewTransactionInput(input) + if err != nil { + return BlockTransactionVerbose{}, err + } + } + + return BlockTransactionVerbose{ + Length: txn.Length, + Type: txn.Type, + Hash: txn.Hash().Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fee, + + Sigs: sigs, + In: txnInputs, + Out: out, + }, nil +} + +// TransactionVerbose has readable transaction data. It adds TransactionStatus to a BlockTransactionVerbose +type TransactionVerbose struct { + Status *TransactionStatus `json:"status,omitempty"` + Timestamp uint64 `json:"timestamp,omitempty"` + BlockTransactionVerbose +} + +// NewTransactionVerbose creates TransactionVerbose +func NewTransactionVerbose(txn visor.Transaction, inputs []visor.TransactionInput) (TransactionVerbose, error) { + rb, err := NewBlockTransactionVerbose(txn.Transaction, inputs, txn.Status.BlockSeq == 0 && txn.Status.Confirmed) + if err != nil { + return TransactionVerbose{}, err + } + + status := NewTransactionStatus(txn.Status) + + return TransactionVerbose{ + Status: &status, + Timestamp: txn.Time, + BlockTransactionVerbose: rb, + }, nil +} + +// UnconfirmedTransactionVerbose represents a verbose readable unconfirmed transaction +type UnconfirmedTransactionVerbose struct { + Transaction BlockTransactionVerbose `json:"transaction"` + Received time.Time `json:"received"` + Checked time.Time `json:"checked"` + Announced time.Time `json:"announced"` + IsValid bool `json:"is_valid"` +} + +// NewUnconfirmedTransactionVerbose creates a verbose readable unconfirmed transaction +func NewUnconfirmedTransactionVerbose(unconfirmed *visor.UnconfirmedTransaction, inputs []visor.TransactionInput) (*UnconfirmedTransactionVerbose, error) { + isGenesis := false // The genesis transaction is never unconfirmed + txn, err := NewBlockTransactionVerbose(unconfirmed.Transaction, inputs, isGenesis) + if err != nil { + return nil, err + } + + return &UnconfirmedTransactionVerbose{ + Transaction: txn, + Received: timeutil.NanoToTime(unconfirmed.Received), + Checked: timeutil.NanoToTime(unconfirmed.Checked), + Announced: timeutil.NanoToTime(unconfirmed.Announced), + IsValid: unconfirmed.IsValid == 1, + }, nil +} + +// NewUnconfirmedTransactionsVerbose creates []UnconfirmedTransactions from []UnconfirmedTransaction and their readable transaction inputs +func NewUnconfirmedTransactionsVerbose(txns []visor.UnconfirmedTransaction, inputs [][]visor.TransactionInput) ([]UnconfirmedTransactionVerbose, error) { + if len(inputs) != len(txns) { + return nil, fmt.Errorf("NewUnconfirmedTransactionsVerbose: len(inputs) != len(txns)") + } + + rTxns := make([]UnconfirmedTransactionVerbose, len(txns)) + for i, txn := range txns { + rTxn, err := NewUnconfirmedTransactionVerbose(&txn, inputs[i]) + if err != nil { + return nil, err + } + + rTxns[i] = *rTxn + } + + return rTxns, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/version.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/version.go new file mode 100644 index 00000000..d85b1976 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/version.go @@ -0,0 +1,20 @@ +package readable + +import "github.com/blang/semver" + +// BuildInfo represents the build info +type BuildInfo struct { + Version string `json:"version"` // version number + Commit string `json:"commit"` // git commit id + Branch string `json:"branch"` // git branch name +} + +// Semver returns the parsed semver.Version of the configured Version string +func (b BuildInfo) Semver() (*semver.Version, error) { + sv, err := semver.Make(b.Version) + if err != nil { + return nil, err + } + + return &sv, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/wallet.go new file mode 100644 index 00000000..174c6580 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/wallet.go @@ -0,0 +1,68 @@ +package readable + +import ( + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// Balance has coins and hours +type Balance struct { + Coins uint64 `json:"coins"` + Hours uint64 `json:"hours"` +} + +// NewBalance copies from wallet.Balance +func NewBalance(b wallet.Balance) Balance { + return Balance{ + Coins: b.Coins, + Hours: b.Hours, + } +} + +// BalancePair records the confirmed and predicted balance of an address +type BalancePair struct { + Confirmed Balance `json:"confirmed"` + Predicted Balance `json:"predicted"` // TODO rename "pending" +} + +// NewBalancePair copies from wallet.BalancePair +func NewBalancePair(bp wallet.BalancePair) BalancePair { + return BalancePair{ + Confirmed: NewBalance(bp.Confirmed), + Predicted: NewBalance(bp.Predicted), + } +} + +// AddressBalances represents a map of address balances +type AddressBalances map[string]BalancePair + +// NewAddressBalances copies from wallet.AddressBalances +func NewAddressBalances(wab wallet.AddressBalances) AddressBalances { + ab := make(AddressBalances, len(wab)) + for k, v := range wab { + ab[k] = NewBalancePair(v) + } + return ab +} + +// WalletEntry the wallet entry struct +type WalletEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` + ChildNumber *uint32 `json:"child_number,omitempty"` // For bip32/44 + Change *uint32 `json:"change,omitempty"` // For bip44 +} + +// WalletMeta the wallet meta struct +type WalletMeta struct { + Coin wallet.CoinType `json:"coin"` + Filename string `json:"filename"` + Label string `json:"label"` + Type string `json:"type"` + Version string `json:"version"` + CryptoType wallet.CryptoType `json:"crypto_type"` + Timestamp int64 `json:"timestamp"` + Encrypted bool `json:"encrypted"` + Bip44Coin *bip44.CoinType `json:"bip44_coin,omitempty"` // For bip44 + XPub string `json:"xpub,omitempty"` // For xpub +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/config.go b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/config.go new file mode 100644 index 00000000..8943b16a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/config.go @@ -0,0 +1,758 @@ +package skycoin + +import ( + "errors" + "flag" + "fmt" + "math" + "os" + "path/filepath" + "runtime" + "strings" + "time" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/fiber" + "github.com/SkycoinProject/skycoin/src/kvstorage" + + "log" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var ( + help = false +) + +// Config records skycoin node and build config +type Config struct { + Node NodeConfig + Build readable.BuildInfo +} + +// NodeConfig records the node's configuration +type NodeConfig struct { + // Name of the coin + CoinName string + + // Disable peer exchange + DisablePEX bool + // Download peer list + DownloadPeerList bool + // Download the peers list from this URL + PeerListURL string + // Don't make any outgoing connections + DisableOutgoingConnections bool + // Don't allowing incoming connections + DisableIncomingConnections bool + // Disables networking altogether + DisableNetworking bool + // Enable GUI + EnableGUI bool + // Disable CSRF check in the wallet API + DisableCSRF bool + // Disable Host, Origin and Referer header check in the wallet API + DisableHeaderCheck bool + // Disable CSP disable content-security-policy in http response + DisableCSP bool + // Comma separated list of API sets enabled on the remote web interface + EnabledAPISets string + // Comma separated list of API sets disabled on the remote web interface + DisabledAPISets string + // Enable all of API sets. Applies before disabling individual sets + EnableAllAPISets bool + + enabledAPISets map[string]struct{} + // Comma separate list of hostnames to accept in the Host header, used to bypass the Host header check which only applies to localhost addresses + HostWhitelist string + hostWhitelist []string + + // Only run on localhost and only connect to others on localhost + LocalhostOnly bool + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address string + // gnet uses this for TCP incoming and outgoing + Port int + // MaxConnections is the maximum number of total connections allowed + MaxConnections int + // Maximum outgoing connections to maintain + MaxOutgoingConnections int + // Maximum default outgoing connections + MaxDefaultPeerOutgoingConnections int + // How often to make outgoing connections + OutgoingConnectionsRate time.Duration + // MaxOutgoingMessageLength maximum size of outgoing messages + MaxOutgoingMessageLength int + // MaxIncomingMessageLength maximum size of incoming messages + MaxIncomingMessageLength int + // PeerlistSize represents the maximum number of peers that the pex would maintain + PeerlistSize int + // Wallet Address Version + // AddressVersion string + // Remote web interface + WebInterface bool + // Remote web interface port + WebInterfacePort int + // Remote web interface address + WebInterfaceAddr string + // Remote web interface certificate + WebInterfaceCert string + // Remote web interface key + WebInterfaceKey string + // Remote web interface HTTPS support + WebInterfaceHTTPS bool + // Remote web interface username and password + WebInterfaceUsername string + WebInterfacePassword string + // Allow web interface auth without HTTPS + WebInterfacePlaintextAuth bool + + // Launch System Default Browser after client startup + LaunchBrowser bool + + // Data directory holds app data -- defaults to ~/.skycoin + DataDirectory string + // GUI directory contains assets for the HTML interface + GUIDirectory string + + // Timeouts for the HTTP listener + HTTPReadTimeout time.Duration + HTTPWriteTimeout time.Duration + HTTPIdleTimeout time.Duration + + // Remark to include in user agent sent in the wire protocol introduction + UserAgentRemark string + userAgent useragent.Data + + // Logging + ColorLog bool + // This is the value registered with flag, it is converted to LogLevel after parsing + LogLevel string + // Disable "Reply to ping", "Received pong" log messages + DisablePingPong bool + + // Verify the database integrity after loading + VerifyDB bool + // Reset the database if integrity checks fail, and continue running + ResetCorruptDB bool + + // Transaction verification parameters for unconfirmed transactions + UnconfirmedVerifyTxn params.VerifyTxn + // Transaction verification parameters for transactions when creating blocks + CreateBlockVerifyTxn params.VerifyTxn + // Maximum total size of transactions in a block + MaxBlockTransactionsSize uint32 + + unconfirmedBurnFactor uint64 + maxUnconfirmedTransactionSize uint64 + unconfirmedMaxDropletPrecision uint64 + createBlockBurnFactor uint64 + createBlockMaxTransactionSize uint64 + createBlockMaxDropletPrecision uint64 + maxBlockSize uint64 + + // Wallets + // Defaults to ${DataDirectory}/wallets/ + WalletDirectory string + // Wallet crypto type + WalletCryptoType string + + // Key-value storage + // Default to ${DataDirectory}/data + KVStorageDirectory string + EnabledStorageTypes []kvstorage.Type + + // Disable the hardcoded default peers + DisableDefaultPeers bool + // Load custom peers from disk + CustomPeersFile string + + RunBlockPublisher bool + + /* Developer options */ + + // Enable cpu profiling + ProfileCPU bool + // Where the file is written to + ProfileCPUFile string + // Enable HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf bool + // Expose HTTP profiling on this interface + HTTPProfHost string + + DBPath string + DBReadOnly bool + LogToFile bool + Version bool // show node version + + GenesisSignatureStr string + GenesisAddressStr string + BlockchainPubkeyStr string + BlockchainSeckeyStr string + GenesisTimestamp uint64 + GenesisCoinVolume uint64 + DefaultConnections []string + + genesisSignature cipher.Sig + genesisAddress cipher.Address + genesisHash cipher.SHA256 + + blockchainPubkey cipher.PubKey + blockchainSeckey cipher.SecKey + + Fiber readable.FiberConfig +} + +// NewNodeConfig returns a new node config instance +func NewNodeConfig(mode string, node fiber.NodeConfig) NodeConfig { + nodeConfig := NodeConfig{ + CoinName: node.CoinName, + GenesisSignatureStr: node.GenesisSignatureStr, + GenesisAddressStr: node.GenesisAddressStr, + GenesisCoinVolume: node.GenesisCoinVolume, + GenesisTimestamp: node.GenesisTimestamp, + BlockchainPubkeyStr: node.BlockchainPubkeyStr, + BlockchainSeckeyStr: node.BlockchainSeckeyStr, + DefaultConnections: node.DefaultConnections, + // Disable peer exchange + DisablePEX: false, + // Don't make any outgoing connections + DisableOutgoingConnections: false, + // Don't allowing incoming connections + DisableIncomingConnections: false, + // Disables networking altogether + DisableNetworking: false, + // Enable GUI + EnableGUI: false, + // Disable CSRF check in the wallet API + DisableCSRF: false, + // Disable Host, Origin and Referer header check in the wallet API + DisableHeaderCheck: false, + // DisableCSP disable content-security-policy in http response + DisableCSP: false, + // Only run on localhost and only connect to others on localhost + LocalhostOnly: false, + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address: "", + // gnet uses this for TCP incoming and outgoing + Port: node.Port, + // MaxConnections is the maximum number of total connections allowed + MaxConnections: 128, + // MaxOutgoingConnections is the maximum outgoing connections allowed + MaxOutgoingConnections: 8, + // MaxDefaultOutgoingConnections is the maximum default outgoing connections allowed + MaxDefaultPeerOutgoingConnections: 1, + DownloadPeerList: true, + PeerListURL: node.PeerListURL, + // How often to make outgoing connections, in seconds + OutgoingConnectionsRate: time.Second * 5, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + PeerlistSize: 65535, + // Wallet Address Version + // AddressVersion: "test", + // Remote web interface + WebInterface: true, + WebInterfacePort: node.WebInterfacePort, + WebInterfaceAddr: "127.0.0.1", + WebInterfaceCert: "", + WebInterfaceKey: "", + WebInterfaceHTTPS: false, + EnabledAPISets: strings.Join([]string{ + api.EndpointsRead, + api.EndpointsTransaction, + }, ","), + DisabledAPISets: "", + EnableAllAPISets: false, + + LaunchBrowser: false, + // Data directory holds app data + DataDirectory: node.DataDirectory, + // Web GUI static resources + GUIDirectory: "./src/gui/static/", + // Logging + ColorLog: true, + LogLevel: "INFO", + LogToFile: false, + DisablePingPong: false, + + VerifyDB: false, + ResetCorruptDB: false, + + // Blockchain/transaction validation + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: node.UnconfirmedBurnFactor, + MaxTransactionSize: node.UnconfirmedMaxTransactionSize, + MaxDropletPrecision: node.UnconfirmedMaxDropletPrecision, + }, + CreateBlockVerifyTxn: params.VerifyTxn{ + BurnFactor: node.CreateBlockBurnFactor, + MaxTransactionSize: node.CreateBlockMaxTransactionSize, + MaxDropletPrecision: node.CreateBlockMaxDropletPrecision, + }, + MaxBlockTransactionsSize: node.MaxBlockTransactionsSize, + + // Wallets + WalletDirectory: "", + WalletCryptoType: string(wallet.DefaultCryptoType), + + // Key-value storage + KVStorageDirectory: "", + EnabledStorageTypes: []kvstorage.Type{ + kvstorage.TypeTxIDNotes, + kvstorage.TypeGeneral, + }, + + // Timeout settings for http.Server + // https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/ + HTTPReadTimeout: time.Second * 10, + HTTPWriteTimeout: time.Second * 60, + HTTPIdleTimeout: time.Second * 120, + + RunBlockPublisher: false, + + // Enable cpu profiling + ProfileCPU: false, + // Where the file is written to + ProfileCPUFile: "cpu.prof", + // HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf: false, + HTTPProfHost: "localhost:6060", + + Fiber: readable.FiberConfig{ + Name: node.CoinName, + DisplayName: node.DisplayName, + Ticker: node.Ticker, + CoinHoursName: node.CoinHoursName, + CoinHoursNameSingular: node.CoinHoursNameSingular, + CoinHoursTicker: node.CoinHoursTicker, + ExplorerURL: node.ExplorerURL, + VersionURL: node.VersionURL, + Bip44Coin: node.Bip44Coin, + }, + } + + nodeConfig.applyConfigMode(mode) + + return nodeConfig +} + +func (c *Config) postProcess() error { + if help { + flag.Usage() + os.Exit(0) + } + + var err error + if c.Node.GenesisSignatureStr != "" { + c.Node.genesisSignature, err = cipher.SigFromHex(c.Node.GenesisSignatureStr) + panicIfError(err, "Invalid Signature") + } + + if c.Node.GenesisAddressStr != "" { + c.Node.genesisAddress, err = cipher.DecodeBase58Address(c.Node.GenesisAddressStr) + panicIfError(err, "Invalid Address") + } + + // Compute genesis block hash + gb, err := coin.NewGenesisBlock(c.Node.genesisAddress, c.Node.GenesisCoinVolume, c.Node.GenesisTimestamp) + if err != nil { + panicIfError(err, "Create genesis hash failed") + } + c.Node.genesisHash = gb.HashHeader() + + if c.Node.BlockchainPubkeyStr != "" { + c.Node.blockchainPubkey, err = cipher.PubKeyFromHex(c.Node.BlockchainPubkeyStr) + panicIfError(err, "Invalid Pubkey") + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey, err = cipher.SecKeyFromHex(c.Node.BlockchainSeckeyStr) + panicIfError(err, "Invalid Seckey") + c.Node.BlockchainSeckeyStr = "" + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey = cipher.SecKey{} + } + + home := file.UserHome() + c.Node.DataDirectory, err = file.InitDataDir(replaceHome(c.Node.DataDirectory, home)) + panicIfError(err, "Invalid DataDirectory") + + if c.Node.WebInterfaceCert == "" { + c.Node.WebInterfaceCert = filepath.Join(c.Node.DataDirectory, "skycoind.cert") + } else { + c.Node.WebInterfaceCert = replaceHome(c.Node.WebInterfaceCert, home) + } + + if c.Node.WebInterfaceKey == "" { + c.Node.WebInterfaceKey = filepath.Join(c.Node.DataDirectory, "skycoind.key") + } else { + c.Node.WebInterfaceKey = replaceHome(c.Node.WebInterfaceKey, home) + } + + if c.Node.WalletDirectory == "" { + c.Node.WalletDirectory = filepath.Join(c.Node.DataDirectory, "wallets") + } else { + c.Node.WalletDirectory = replaceHome(c.Node.WalletDirectory, home) + } + + if c.Node.KVStorageDirectory == "" { + c.Node.KVStorageDirectory = filepath.Join(c.Node.DataDirectory, "data") + } else { + c.Node.KVStorageDirectory = replaceHome(c.Node.KVStorageDirectory, home) + } + if len(c.Node.EnabledStorageTypes) == 0 { + c.Node.EnabledStorageTypes = []kvstorage.Type{ + kvstorage.TypeGeneral, + kvstorage.TypeTxIDNotes, + } + } + + if c.Node.DBPath == "" { + c.Node.DBPath = filepath.Join(c.Node.DataDirectory, "data.db") + } else { + c.Node.DBPath = replaceHome(c.Node.DBPath, home) + } + + userAgentData := useragent.Data{ + Coin: c.Node.CoinName, + Version: c.Build.Version, + Remark: c.Node.UserAgentRemark, + } + + if _, err := userAgentData.Build(); err != nil { + return err + } + + c.Node.userAgent = userAgentData + + apiSets, err := buildAPISets(c.Node) + if err != nil { + return err + } + + // Don't open browser to load wallets if wallet apis are disabled. + c.Node.enabledAPISets = apiSets + if _, ok := c.Node.enabledAPISets[api.EndpointsWallet]; !ok { + c.Node.EnableGUI = false + c.Node.LaunchBrowser = false + } + + if c.Node.EnableGUI { + c.Node.GUIDirectory = file.ResolveResourceDirectory(c.Node.GUIDirectory) + } + + if c.Node.DisableDefaultPeers { + c.Node.DefaultConnections = nil + } + + if c.Node.HostWhitelist != "" { + if c.Node.DisableHeaderCheck { + return errors.New("host whitelist should be empty when header check is disabled") + } + c.Node.hostWhitelist = strings.Split(c.Node.HostWhitelist, ",") + } + + httpAuthEnabled := c.Node.WebInterfaceUsername != "" || c.Node.WebInterfacePassword != "" + if httpAuthEnabled && !c.Node.WebInterfaceHTTPS && !c.Node.WebInterfacePlaintextAuth { + return errors.New("Web interface auth enabled but HTTPS is not enabled. Use -web-interface-plaintext-auth=true if this is desired") + } + + if c.Node.MaxConnections < c.Node.MaxOutgoingConnections+c.Node.MaxDefaultPeerOutgoingConnections { + return errors.New("-max-connections must be >= -max-outgoing-connections + -max-default-peer-outgoing-connections") + } + + if c.Node.MaxOutgoingConnections > c.Node.MaxConnections { + return errors.New("-max-outgoing-connections cannot be higher than -max-connections") + } + + if c.Node.maxBlockSize > math.MaxUint32 { + return errors.New("-max-block-size exceeds MaxUint32") + } + if c.Node.maxUnconfirmedTransactionSize > math.MaxUint32 { + return errors.New("-max-txn-size-unconfirmed exceeds MaxUint32") + } + if c.Node.unconfirmedBurnFactor > math.MaxUint32 { + return errors.New("-burn-factor-unconfirmed exceeds MaxUint32") + } + if c.Node.createBlockBurnFactor > math.MaxUint32 { + return errors.New("-burn-factor-create-block exceeds MaxUint32") + } + + if c.Node.unconfirmedMaxDropletPrecision > math.MaxUint8 { + return errors.New("-max-decimals-unconfirmed exceeds MaxUint8") + } + if c.Node.createBlockMaxDropletPrecision > math.MaxUint8 { + return errors.New("-max-decimals-create-block exceeds MaxUint8") + } + + c.Node.UnconfirmedVerifyTxn.BurnFactor = uint32(c.Node.unconfirmedBurnFactor) + c.Node.UnconfirmedVerifyTxn.MaxTransactionSize = uint32(c.Node.maxUnconfirmedTransactionSize) + c.Node.UnconfirmedVerifyTxn.MaxDropletPrecision = uint8(c.Node.unconfirmedMaxDropletPrecision) + c.Node.CreateBlockVerifyTxn.BurnFactor = uint32(c.Node.createBlockBurnFactor) + c.Node.CreateBlockVerifyTxn.MaxTransactionSize = uint32(c.Node.createBlockMaxTransactionSize) + c.Node.CreateBlockVerifyTxn.MaxDropletPrecision = uint8(c.Node.createBlockMaxDropletPrecision) + c.Node.MaxBlockTransactionsSize = uint32(c.Node.maxBlockSize) + + if c.Node.UnconfirmedVerifyTxn.MaxTransactionSize < params.MinTransactionSize { + return fmt.Errorf("-max-txn-size-unconfirmed must be >= params.MinTransactionSize (%d)", params.MinTransactionSize) + } + if c.Node.UnconfirmedVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("-max-txn-size-unconfirmed must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + if c.Node.CreateBlockVerifyTxn.MaxTransactionSize < params.MinTransactionSize { + return fmt.Errorf("-max-txn-size-create-block must be >= params.MinTransactionSize (%d)", params.MinTransactionSize) + } + if c.Node.CreateBlockVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("-max-txn-size-create-block must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + + if c.Node.MaxBlockTransactionsSize < params.MinTransactionSize { + return fmt.Errorf("-max-block-size must be >= params.MinTransactionSize (%d)", params.MinTransactionSize) + } + if c.Node.MaxBlockTransactionsSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("-max-block-size must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + if c.Node.MaxBlockTransactionsSize < c.Node.UnconfirmedVerifyTxn.MaxTransactionSize { + return errors.New("-max-block-size must be >= -max-txn-size-unconfirmed") + } + if c.Node.MaxBlockTransactionsSize < c.Node.CreateBlockVerifyTxn.MaxTransactionSize { + return errors.New("-max-block-size must be >= -max-txn-size-create-block") + } + + if c.Node.UnconfirmedVerifyTxn.BurnFactor < params.MinBurnFactor { + return fmt.Errorf("-burn-factor-unconfirmed must be >= params.MinBurnFactor (%d)", params.MinBurnFactor) + } + if c.Node.UnconfirmedVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("-burn-factor-unconfirmed must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.Node.CreateBlockVerifyTxn.BurnFactor < params.MinBurnFactor { + return fmt.Errorf("-burn-factor-create-block must be >= params.MinBurnFactor (%d)", params.MinBurnFactor) + } + if c.Node.CreateBlockVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("-burn-factor-create-block must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.Node.UnconfirmedVerifyTxn.MaxDropletPrecision > droplet.Exponent { + return fmt.Errorf("-max-decimals-unconfirmed must be <= droplet.Exponent (%d)", droplet.Exponent) + } + if c.Node.UnconfirmedVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("-max-decimals-unconfirmed must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + if c.Node.CreateBlockVerifyTxn.MaxDropletPrecision > droplet.Exponent { + return fmt.Errorf("-max-decimals-create-block must be <= droplet.Exponent (%d)", droplet.Exponent) + } + if c.Node.CreateBlockVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("-max-decimals-create-block must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + return nil +} + +// buildAPISets builds the set of enable APIs by the following rules: +// * If EnableAll, all API sets are added +// * For each api set in EnabledAPISets, add +// * For each api set in DisabledAPISets, remove +func buildAPISets(c NodeConfig) (map[string]struct{}, error) { + enabledAPISets := strings.Split(c.EnabledAPISets, ",") + if err := validateAPISets("-enable-api-sets", enabledAPISets); err != nil { + return nil, err + } + + disabledAPISets := strings.Split(c.DisabledAPISets, ",") + if err := validateAPISets("-disable-api-sets", disabledAPISets); err != nil { + return nil, err + } + + apiSets := make(map[string]struct{}) + + allAPISets := []string{ + api.EndpointsRead, + api.EndpointsStatus, + api.EndpointsWallet, + api.EndpointsTransaction, + api.EndpointsPrometheus, + api.EndpointsNetCtrl, + api.EndpointsStorage, + // Do not include insecure or deprecated API sets, they must always + // be explicitly enabled through -enable-api-sets + } + + if c.EnableAllAPISets { + for _, s := range allAPISets { + apiSets[s] = struct{}{} + } + } + + // Add the enabled API sets + for _, k := range enabledAPISets { + apiSets[k] = struct{}{} + } + + // Remove the disabled API sets + for _, k := range disabledAPISets { + delete(apiSets, k) + } + + return apiSets, nil +} + +func validateAPISets(opt string, apiSets []string) error { + for _, k := range apiSets { + k = strings.ToUpper(strings.TrimSpace(k)) + switch k { + case api.EndpointsRead, + api.EndpointsStatus, + api.EndpointsTransaction, + api.EndpointsWallet, + api.EndpointsInsecureWalletSeed, + api.EndpointsPrometheus, + api.EndpointsNetCtrl, + api.EndpointsStorage: + case "": + continue + default: + return fmt.Errorf("Invalid value in %s: %q", opt, k) + } + } + return nil +} + +// RegisterFlags binds CLI flags to config values +func (c *NodeConfig) RegisterFlags() { + flag.BoolVar(&help, "help", false, "Show help") + flag.BoolVar(&c.DisablePEX, "disable-pex", c.DisablePEX, "disable PEX peer discovery") + flag.BoolVar(&c.DownloadPeerList, "download-peerlist", c.DownloadPeerList, "download a peers.txt from -peerlist-url") + flag.StringVar(&c.PeerListURL, "peerlist-url", c.PeerListURL, "with -download-peerlist=true, download a peers.txt file from this url") + flag.BoolVar(&c.DisableOutgoingConnections, "disable-outgoing", c.DisableOutgoingConnections, "Don't make outgoing connections") + flag.BoolVar(&c.DisableIncomingConnections, "disable-incoming", c.DisableIncomingConnections, "Don't allow incoming connections") + flag.BoolVar(&c.DisableNetworking, "disable-networking", c.DisableNetworking, "Disable all network activity") + flag.BoolVar(&c.EnableGUI, "enable-gui", c.EnableGUI, "Enable GUI") + flag.BoolVar(&c.DisableCSRF, "disable-csrf", c.DisableCSRF, "disable CSRF check") + flag.BoolVar(&c.DisableHeaderCheck, "disable-header-check", c.DisableHeaderCheck, "disables the host, origin and referer header checks.") + flag.BoolVar(&c.DisableCSP, "disable-csp", c.DisableCSP, "disable content-security-policy in http response") + flag.StringVar(&c.Address, "address", c.Address, "IP Address to run application on. Leave empty to default to a public interface") + flag.IntVar(&c.Port, "port", c.Port, "Port to run application on") + + flag.BoolVar(&c.WebInterface, "web-interface", c.WebInterface, "enable the web interface") + flag.IntVar(&c.WebInterfacePort, "web-interface-port", c.WebInterfacePort, "port to serve web interface on") + flag.StringVar(&c.WebInterfaceAddr, "web-interface-addr", c.WebInterfaceAddr, "addr to serve web interface on") + flag.StringVar(&c.WebInterfaceCert, "web-interface-cert", c.WebInterfaceCert, "skycoind.cert file for web interface HTTPS. If not provided, will autogenerate or use skycoind.cert in --data-dir") + flag.StringVar(&c.WebInterfaceKey, "web-interface-key", c.WebInterfaceKey, "skycoind.key file for web interface HTTPS. If not provided, will autogenerate or use skycoind.key in --data-dir") + flag.BoolVar(&c.WebInterfaceHTTPS, "web-interface-https", c.WebInterfaceHTTPS, "enable HTTPS for web interface") + flag.StringVar(&c.HostWhitelist, "host-whitelist", c.HostWhitelist, "Hostnames to whitelist in the Host header check. Only applies when the web interface is bound to localhost.") + + allAPISets := []string{ + api.EndpointsRead, + api.EndpointsStatus, + api.EndpointsWallet, + api.EndpointsTransaction, + api.EndpointsPrometheus, + api.EndpointsNetCtrl, + api.EndpointsInsecureWalletSeed, + api.EndpointsStorage, + } + flag.StringVar(&c.EnabledAPISets, "enable-api-sets", c.EnabledAPISets, fmt.Sprintf("enable API set. Options are %s. Multiple values should be separated by comma", strings.Join(allAPISets, ", "))) + flag.StringVar(&c.DisabledAPISets, "disable-api-sets", c.DisabledAPISets, fmt.Sprintf("disable API set. Options are %s. Multiple values should be separated by comma", strings.Join(allAPISets, ", "))) + flag.BoolVar(&c.EnableAllAPISets, "enable-all-api-sets", c.EnableAllAPISets, "enable all API sets, except for deprecated or insecure sets. This option is applied before -disable-api-sets.") + + flag.StringVar(&c.WebInterfaceUsername, "web-interface-username", c.WebInterfaceUsername, "username for the web interface") + flag.StringVar(&c.WebInterfacePassword, "web-interface-password", c.WebInterfacePassword, "password for the web interface") + flag.BoolVar(&c.WebInterfacePlaintextAuth, "web-interface-plaintext-auth", c.WebInterfacePlaintextAuth, "allow web interface auth without https") + + flag.BoolVar(&c.LaunchBrowser, "launch-browser", c.LaunchBrowser, "launch system default webbrowser at client startup") + flag.StringVar(&c.DataDirectory, "data-dir", c.DataDirectory, "directory to store app data (defaults to ~/.skycoin)") + flag.StringVar(&c.DBPath, "db-path", c.DBPath, "path of database file (defaults to ~/.skycoin/data.db)") + flag.BoolVar(&c.DBReadOnly, "db-read-only", c.DBReadOnly, "open bolt db read-only") + flag.BoolVar(&c.ProfileCPU, "profile-cpu", c.ProfileCPU, "enable cpu profiling") + flag.StringVar(&c.ProfileCPUFile, "profile-cpu-file", c.ProfileCPUFile, "where to write the cpu profile file") + flag.BoolVar(&c.HTTPProf, "http-prof", c.HTTPProf, "run the HTTP profiling interface") + flag.StringVar(&c.HTTPProfHost, "http-prof-host", c.HTTPProfHost, "hostname to bind the HTTP profiling interface to") + flag.StringVar(&c.LogLevel, "log-level", c.LogLevel, "Choices are: debug, info, warn, error, fatal, panic") + flag.BoolVar(&c.ColorLog, "color-log", c.ColorLog, "Add terminal colors to log output") + flag.BoolVar(&c.DisablePingPong, "no-ping-log", c.DisablePingPong, `disable "reply to ping" and "received pong" debug log messages`) + flag.BoolVar(&c.LogToFile, "logtofile", c.LogToFile, "log to file") + flag.StringVar(&c.GUIDirectory, "gui-dir", c.GUIDirectory, "static content directory for the HTML interface") + + flag.BoolVar(&c.VerifyDB, "verify-db", c.VerifyDB, "check the database for corruption") + flag.BoolVar(&c.ResetCorruptDB, "reset-corrupt-db", c.ResetCorruptDB, "reset the database if corrupted, and continue running instead of exiting") + + flag.BoolVar(&c.DisableDefaultPeers, "disable-default-peers", c.DisableDefaultPeers, "disable the hardcoded default peers") + flag.StringVar(&c.CustomPeersFile, "custom-peers-file", c.CustomPeersFile, "load custom peers from a newline separate list of ip:port in a file. Note that this is different from the peers.json file in the data directory") + + flag.StringVar(&c.UserAgentRemark, "user-agent-remark", c.UserAgentRemark, "additional remark to include in the user agent sent over the wire protocol") + + flag.Uint64Var(&c.maxUnconfirmedTransactionSize, "max-txn-size-unconfirmed", uint64(c.UnconfirmedVerifyTxn.MaxTransactionSize), "maximum size of an unconfirmed transaction") + flag.Uint64Var(&c.unconfirmedBurnFactor, "burn-factor-unconfirmed", uint64(c.UnconfirmedVerifyTxn.BurnFactor), "coinhour burn factor applied to unconfirmed transactions") + flag.Uint64Var(&c.unconfirmedMaxDropletPrecision, "max-decimals-unconfirmed", uint64(c.UnconfirmedVerifyTxn.MaxDropletPrecision), "max number of decimal places applied to unconfirmed transactions") + flag.Uint64Var(&c.createBlockBurnFactor, "burn-factor-create-block", uint64(c.CreateBlockVerifyTxn.BurnFactor), "coinhour burn factor applied when creating blocks") + flag.Uint64Var(&c.createBlockMaxTransactionSize, "max-txn-size-create-block", uint64(c.CreateBlockVerifyTxn.MaxTransactionSize), "maximum size of a transaction applied when creating blocks") + flag.Uint64Var(&c.createBlockMaxDropletPrecision, "max-decimals-create-block", uint64(c.CreateBlockVerifyTxn.MaxDropletPrecision), "max number of decimal places applied when creating blocks") + flag.Uint64Var(&c.maxBlockSize, "max-block-size", uint64(c.MaxBlockTransactionsSize), "maximum total size of transactions in a block") + + flag.BoolVar(&c.RunBlockPublisher, "block-publisher", c.RunBlockPublisher, "run the daemon as a block publisher") + flag.StringVar(&c.BlockchainPubkeyStr, "blockchain-public-key", c.BlockchainPubkeyStr, "public key of the blockchain") + flag.StringVar(&c.BlockchainSeckeyStr, "blockchain-secret-key", c.BlockchainSeckeyStr, "secret key of the blockchain") + + flag.StringVar(&c.GenesisAddressStr, "genesis-address", c.GenesisAddressStr, "genesis address") + flag.StringVar(&c.GenesisSignatureStr, "genesis-signature", c.GenesisSignatureStr, "genesis block signature") + flag.Uint64Var(&c.GenesisTimestamp, "genesis-timestamp", c.GenesisTimestamp, "genesis block timestamp") + + flag.StringVar(&c.WalletDirectory, "wallet-dir", c.WalletDirectory, "location of the wallet files. Defaults to ~/.skycoin/wallet/") + flag.StringVar(&c.KVStorageDirectory, "storage-dir", c.KVStorageDirectory, "location of the storage data files. Defaults to ~/.skycoin/data/") + flag.IntVar(&c.MaxConnections, "max-connections", c.MaxConnections, "Maximum number of total connections allowed") + flag.IntVar(&c.MaxOutgoingConnections, "max-outgoing-connections", c.MaxOutgoingConnections, "Maximum number of outgoing connections allowed") + flag.IntVar(&c.MaxDefaultPeerOutgoingConnections, "max-default-peer-outgoing-connections", c.MaxDefaultPeerOutgoingConnections, "The maximum default peer outgoing connections allowed") + flag.IntVar(&c.PeerlistSize, "peerlist-size", c.PeerlistSize, "Max number of peers to track in peerlist") + flag.DurationVar(&c.OutgoingConnectionsRate, "connection-rate", c.OutgoingConnectionsRate, "How often to make an outgoing connection") + flag.IntVar(&c.MaxOutgoingMessageLength, "max-out-msg-len", c.MaxOutgoingMessageLength, "Maximum length of outgoing wire messages") + flag.IntVar(&c.MaxIncomingMessageLength, "max-in-msg-len", c.MaxIncomingMessageLength, "Maximum length of incoming wire messages") + flag.BoolVar(&c.LocalhostOnly, "localhost-only", c.LocalhostOnly, "Run on localhost and only connect to localhost peers") + flag.StringVar(&c.WalletCryptoType, "wallet-crypto-type", c.WalletCryptoType, "wallet crypto type. Can be sha256-xor or scrypt-chacha20poly1305") + flag.BoolVar(&c.Version, "version", false, "show node version") +} + +func (c *NodeConfig) applyConfigMode(configMode string) { + if runtime.GOOS == "windows" { + c.ColorLog = false + } + switch configMode { + case "": + case "STANDALONE_CLIENT": + c.EnableAllAPISets = true + c.EnabledAPISets = api.EndpointsInsecureWalletSeed + c.EnableGUI = true + c.LaunchBrowser = true + c.DisableCSRF = false + c.DisableHeaderCheck = false + c.DisableCSP = false + c.DownloadPeerList = true + c.WebInterface = true + c.LogToFile = false + c.ResetCorruptDB = true + c.WebInterfacePort = 0 // randomize web interface port + default: + panic("Invalid ConfigMode") + } +} + +func panicIfError(err error, msg string, args ...interface{}) { //nolint:unparam + if err != nil { + log.Panicf(msg+": %v", append(args, err)...) + } +} + +func replaceHome(path, home string) string { + return strings.Replace(path, "$HOME", home, 1) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin.go b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin.go new file mode 100644 index 00000000..8731e36c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin.go @@ -0,0 +1,675 @@ +/* +Package skycoin implements the main daemon cmd's configuration and setup +*/ +package skycoin + +import ( + "errors" + "fmt" + "io/ioutil" + "log" + "net/http" + "os" + "path/filepath" + "runtime" + "runtime/pprof" + "sync" + "time" + + "github.com/blang/semver" + "github.com/toqueteos/webbrowser" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/kvstorage" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/apputil" + "github.com/SkycoinProject/skycoin/src/util/certutil" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var ( + // DBVerifyCheckpointVersion is a checkpoint for determining if DB verification should be run. + // Any DB upgrading from less than this version to equal or higher than this version will be forced to verify. + // Update this version checkpoint if a newer version requires a new verification run. + DBVerifyCheckpointVersion = "0.25.0" + dbVerifyCheckpointVersionParsed semver.Version +) + +// Coin represents a fiber coin instance +type Coin struct { + config Config + logger *logging.Logger +} + +// Run starts the node +func (c *Coin) Run() error { + var db *dbutil.DB + var w *wallet.Service + var v *visor.Visor + var d *daemon.Daemon + var s *kvstorage.Manager + var gw *api.Gateway + var webInterface *api.Server + var retErr error + errC := make(chan error, 10) + + if c.config.Node.Version { + fmt.Println(c.config.Build.Version) + return nil + } + + logLevel, err := logging.LevelFromString(c.config.Node.LogLevel) + if err != nil { + err = fmt.Errorf("Invalid -log-level: %v", err) + c.logger.Error(err) + return err + } + + logging.SetLevel(logLevel) + + if c.config.Node.ColorLog { + logging.EnableColors() + } else { + logging.DisableColors() + } + + var logFile *os.File + if c.config.Node.LogToFile { + var err error + logFile, err = c.initLogFile() + if err != nil { + c.logger.Error(err) + return err + } + } + + var fullAddress string + scheme := "http" + if c.config.Node.WebInterfaceHTTPS { + scheme = "https" + } + host := fmt.Sprintf("%s:%d", c.config.Node.WebInterfaceAddr, c.config.Node.WebInterfacePort) + + if c.config.Node.ProfileCPU { + f, err := os.Create(c.config.Node.ProfileCPUFile) + if err != nil { + c.logger.Error(err) + return err + } + + if err := pprof.StartCPUProfile(f); err != nil { + c.logger.Error(err) + return err + } + defer pprof.StopCPUProfile() + } + + if c.config.Node.HTTPProf { + go func() { + if err := http.ListenAndServe(c.config.Node.HTTPProfHost, nil); err != nil { + c.logger.WithError(err).Errorf("Listen on HTTP profiling interface %s failed", c.config.Node.HTTPProfHost) + } + }() + } + + var wg sync.WaitGroup + + quit := make(chan struct{}) + + // Catch SIGINT (CTRL-C) (closes the quit channel) + go apputil.CatchInterrupt(quit) + + // Catch SIGUSR1 (prints runtime stack to stdout) + go apputil.CatchDebug() + + // Parse the current app version + appVersion, err := c.config.Build.Semver() + if err != nil { + c.logger.WithError(err).Errorf("Version %s is not a valid semver", c.config.Build.Version) + return err + } + + c.logger.Infof("App version: %s", appVersion) + c.logger.Infof("OS: %s", runtime.GOOS) + c.logger.Infof("Arch: %s", runtime.GOARCH) + + wconf := c.ConfigureWallet() + dconf := c.ConfigureDaemon() + vconf := c.ConfigureVisor() + sconf := c.ConfigureStorage() + + // Open the database + c.logger.Infof("Opening database %s", c.config.Node.DBPath) + db, err = visor.OpenDB(c.config.Node.DBPath, c.config.Node.DBReadOnly) + if err != nil { + c.logger.Errorf("Database failed to open: %v. Is another skycoin instance running?", err) + return err + } + + // Look for saved app version + dbVersion, err := visor.GetDBVersion(db) + if err != nil { + c.logger.WithError(err).Error("visor.GetDBVersion failed") + retErr = err + goto earlyShutdown + } + + if dbVersion == nil { + c.logger.Info("DB version not found in DB") + } else { + c.logger.Infof("DB version: %s", dbVersion) + } + + c.logger.Infof("DB verify checkpoint version: %s", DBVerifyCheckpointVersion) + + // If the saved DB version is higher than the app version, abort. + // Otherwise DB corruption could occur. + if dbVersion != nil && dbVersion.GT(*appVersion) { + err = fmt.Errorf("Cannot use newer DB version=%v with older software version=%v", dbVersion, appVersion) + c.logger.WithError(err).Error() + retErr = err + goto earlyShutdown + } + + // Verify the DB if the version detection says to, or if it was requested on the command line + if shouldVerifyDB(appVersion, dbVersion) || c.config.Node.VerifyDB { + if c.config.Node.ResetCorruptDB { + // Check the database integrity and recreate it if necessary + c.logger.Info("Checking database and resetting if corrupted") + if newDB, err := visor.ResetCorruptDB(db, c.config.Node.blockchainPubkey, quit); err != nil { + if err != visor.ErrVerifyStopped { + c.logger.WithError(err).Error("visor.ResetCorruptDB failed") + retErr = err + } + goto earlyShutdown + } else { + db = newDB + } + } else { + c.logger.Info("Checking database") + if err := visor.CheckDatabase(db, c.config.Node.blockchainPubkey, quit); err != nil { + if err != visor.ErrVerifyStopped { + c.logger.WithError(err).Error("visor.CheckDatabase failed") + retErr = err + } + goto earlyShutdown + } + } + } + + // Update the DB version + if !db.IsReadOnly() { + if err := visor.SetDBVersion(db, *appVersion); err != nil { + c.logger.WithError(err).Error("visor.SetDBVersion failed") + retErr = err + goto earlyShutdown + } + } + + c.logger.Infof("Coinhour burn factor for user transactions is %d", params.UserVerifyTxn.BurnFactor) + c.logger.Infof("Max transaction size for user transactions is %d", params.UserVerifyTxn.MaxTransactionSize) + c.logger.Infof("Max decimals for user transactions is %d", params.UserVerifyTxn.MaxDropletPrecision) + + c.logger.Info("wallet.NewService") + w, err = wallet.NewService(wconf) + if err != nil { + c.logger.WithError(err).Error("wallet.NewService failed") + retErr = err + goto earlyShutdown + } + + c.logger.Info("visor.New") + v, err = visor.New(vconf, db, w) + if err != nil { + c.logger.WithError(err).Error("visor.New failed") + retErr = err + goto earlyShutdown + } + + c.logger.Info("daemon.New") + d, err = daemon.New(dconf, v) + if err != nil { + c.logger.WithError(err).Error("daemon.New failed") + retErr = err + goto earlyShutdown + } + + c.logger.Info("kvstorage.NewManager") + s, err = kvstorage.NewManager(sconf) + if err != nil { + c.logger.WithError(err).Error("kvstorage.NewManager failed") + retErr = err + goto earlyShutdown + } + + c.logger.Info("api.NewGateway") + gw = api.NewGateway(d, v, w, s) + + if c.config.Node.WebInterface { + webInterface, err = c.createGUI(gw, host) + if err != nil { + c.logger.WithError(err).Error("c.createGUI failed") + retErr = err + goto earlyShutdown + } + + fullAddress = fmt.Sprintf("%s://%s", scheme, webInterface.Addr()) + c.logger.Critical().Infof("Full address: %s", fullAddress) + } + + c.logger.Info("visor.Init") + if err := v.Init(); err != nil { + c.logger.WithError(err).Error("visor.Init failed") + retErr = err + goto earlyShutdown + } + + wg.Add(1) + go func() { + defer wg.Done() + + c.logger.Info("daemon.Run") + if err := d.Run(); err != nil { + c.logger.WithError(err).Error("daemon.Run failed") + errC <- err + } + }() + + if c.config.Node.WebInterface { + cancelLaunchBrowser := make(chan struct{}) + + wg.Add(1) + go func() { + defer wg.Done() + + c.logger.Info("webInterface.Serve") + if err := webInterface.Serve(); err != nil { + close(cancelLaunchBrowser) + c.logger.WithError(err).Error("webInterface.Serve failed") + errC <- err + } + }() + + if c.config.Node.LaunchBrowser { + go func() { + select { + case <-cancelLaunchBrowser: + c.logger.Warning("Browser launching canceled") + + // Wait a moment just to make sure the http interface is up + case <-time.After(time.Millisecond * 100): + c.logger.Infof("Launching System Browser with %s", fullAddress) + if err := webbrowser.Open(fullAddress); err != nil { + c.logger.WithError(err).Error("webbrowser.Open failed") + } + } + }() + } + } + + select { + case <-quit: + case retErr = <-errC: + c.logger.WithError(err).Error("Received error from errC (something prior has failed)") + } + + c.logger.Info("Shutting down...") + + if webInterface != nil { + c.logger.Info("Closing web interface") + webInterface.Shutdown() + } + + c.logger.Info("Closing daemon") + d.Shutdown() + + c.logger.Info("Waiting for goroutines to finish") + wg.Wait() + +earlyShutdown: + if db != nil { + c.logger.Info("Closing database") + if err := db.Close(); err != nil { + c.logger.WithError(err).Error("Failed to close DB") + } + } + + c.logger.Info("Goodbye") + + if logFile != nil { + if err := logFile.Close(); err != nil { + fmt.Println("Failed to close log file") + } + } + + return retErr +} + +// NewCoin returns a new fiber coin instance +func NewCoin(config Config, logger *logging.Logger) *Coin { + return &Coin{ + config: config, + logger: logger, + } +} + +func (c *Coin) initLogFile() (*os.File, error) { + logDir := filepath.Join(c.config.Node.DataDirectory, "logs") + if err := createDirIfNotExist(logDir); err != nil { + c.logger.WithError(err).Errorf("createDirIfNotExist(%s) failed", logDir) + return nil, fmt.Errorf("createDirIfNotExist(%s) failed: %v", logDir, err) + } + + // open log file + tf := "2006-01-02-030405" + logfile := filepath.Join(logDir, fmt.Sprintf("%s-v%s.log", time.Now().Format(tf), c.config.Build.Version)) + + f, err := os.OpenFile(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600) + if err != nil { + c.logger.WithError(err).Errorf("os.OpenFile(%s) failed", logfile) + return nil, err + } + + hook := logging.NewWriteHook(f) + logging.AddHook(hook) + + return f, nil +} + +// ConfigureVisor sets the visor config values +func (c *Coin) ConfigureVisor() visor.Config { + vc := visor.NewConfig() + + vc.Distribution = params.MainNetDistribution + + vc.IsBlockPublisher = c.config.Node.RunBlockPublisher + vc.Arbitrating = c.config.Node.RunBlockPublisher + + vc.BlockchainPubkey = c.config.Node.blockchainPubkey + vc.BlockchainSeckey = c.config.Node.blockchainSeckey + + vc.UnconfirmedVerifyTxn = c.config.Node.UnconfirmedVerifyTxn + vc.CreateBlockVerifyTxn = c.config.Node.CreateBlockVerifyTxn + vc.MaxBlockTransactionsSize = c.config.Node.MaxBlockTransactionsSize + + vc.GenesisAddress = c.config.Node.genesisAddress + vc.GenesisSignature = c.config.Node.genesisSignature + vc.GenesisTimestamp = c.config.Node.GenesisTimestamp + vc.GenesisCoinVolume = c.config.Node.GenesisCoinVolume + + return vc +} + +// ConfigureWallet sets the wallet config values +func (c *Coin) ConfigureWallet() wallet.Config { + wc := wallet.NewConfig() + + wc.WalletDir = c.config.Node.WalletDirectory + _, wc.EnableWalletAPI = c.config.Node.enabledAPISets[api.EndpointsWallet] + _, wc.EnableSeedAPI = c.config.Node.enabledAPISets[api.EndpointsInsecureWalletSeed] + + // Initialize wallet default crypto type + cryptoType, err := wallet.CryptoTypeFromString(c.config.Node.WalletCryptoType) + if err != nil { + log.Panic(err) + } + + wc.CryptoType = cryptoType + + bc := c.config.Node.Fiber.Bip44Coin + wc.Bip44Coin = &bc + + return wc +} + +// ConfigureStorage sets the key-value storage config values +func (c *Coin) ConfigureStorage() kvstorage.Config { + sc := kvstorage.NewConfig() + + sc.StorageDir = c.config.Node.KVStorageDirectory + _, sc.EnableStorageAPI = c.config.Node.enabledAPISets[api.EndpointsStorage] + sc.EnabledStorages = c.config.Node.EnabledStorageTypes + + return sc +} + +// ConfigureDaemon sets the daemon config values +func (c *Coin) ConfigureDaemon() daemon.Config { + dc := daemon.NewConfig() + + dc.Pool.DefaultConnections = c.config.Node.DefaultConnections + dc.Pool.MaxDefaultPeerOutgoingConnections = c.config.Node.MaxDefaultPeerOutgoingConnections + dc.Pool.MaxIncomingMessageLength = c.config.Node.MaxIncomingMessageLength + dc.Pool.MaxOutgoingMessageLength = c.config.Node.MaxOutgoingMessageLength + + dc.Pex.DataDirectory = c.config.Node.DataDirectory + dc.Pex.Disabled = c.config.Node.DisablePEX + dc.Pex.NetworkDisabled = c.config.Node.DisableNetworking + dc.Pex.Max = c.config.Node.PeerlistSize + dc.Pex.DownloadPeerList = c.config.Node.DownloadPeerList + dc.Pex.PeerListURL = c.config.Node.PeerListURL + dc.Pex.DisableTrustedPeers = c.config.Node.DisableDefaultPeers + dc.Pex.CustomPeersFile = c.config.Node.CustomPeersFile + dc.Pex.DefaultConnections = c.config.Node.DefaultConnections + + dc.Daemon.MaxOutgoingMessageLength = uint64(c.config.Node.MaxOutgoingMessageLength) + dc.Daemon.MaxIncomingMessageLength = uint64(c.config.Node.MaxIncomingMessageLength) + dc.Daemon.MaxBlockTransactionsSize = c.config.Node.MaxBlockTransactionsSize + dc.Daemon.DefaultConnections = c.config.Node.DefaultConnections + dc.Daemon.DisableOutgoingConnections = c.config.Node.DisableOutgoingConnections + dc.Daemon.DisableIncomingConnections = c.config.Node.DisableIncomingConnections + dc.Daemon.DisableNetworking = c.config.Node.DisableNetworking + dc.Daemon.Port = c.config.Node.Port + dc.Daemon.Address = c.config.Node.Address + dc.Daemon.LocalhostOnly = c.config.Node.LocalhostOnly + dc.Daemon.MaxConnections = c.config.Node.MaxConnections + dc.Daemon.MaxOutgoingConnections = c.config.Node.MaxOutgoingConnections + dc.Daemon.DataDirectory = c.config.Node.DataDirectory + dc.Daemon.LogPings = !c.config.Node.DisablePingPong + dc.Daemon.BlockchainPubkey = c.config.Node.blockchainPubkey + dc.Daemon.GenesisHash = c.config.Node.genesisHash + dc.Daemon.UserAgent = c.config.Node.userAgent + dc.Daemon.UnconfirmedVerifyTxn = c.config.Node.UnconfirmedVerifyTxn + + if c.config.Node.OutgoingConnectionsRate == 0 { + c.config.Node.OutgoingConnectionsRate = time.Millisecond + } + dc.Daemon.OutgoingRate = c.config.Node.OutgoingConnectionsRate + + return dc +} + +func (c *Coin) createGUI(gw *api.Gateway, host string) (*api.Server, error) { + config := api.Config{ + StaticDir: c.config.Node.GUIDirectory, + DisableCSRF: c.config.Node.DisableCSRF, + DisableHeaderCheck: c.config.Node.DisableHeaderCheck, + DisableCSP: c.config.Node.DisableCSP, + EnableGUI: c.config.Node.EnableGUI, + ReadTimeout: c.config.Node.HTTPReadTimeout, + WriteTimeout: c.config.Node.HTTPWriteTimeout, + IdleTimeout: c.config.Node.HTTPIdleTimeout, + EnabledAPISets: c.config.Node.enabledAPISets, + HostWhitelist: c.config.Node.hostWhitelist, + Health: api.HealthConfig{ + BuildInfo: readable.BuildInfo{ + Version: c.config.Build.Version, + Commit: c.config.Build.Commit, + Branch: c.config.Build.Branch, + }, + Fiber: c.config.Node.Fiber, + DaemonUserAgent: c.config.Node.userAgent, + BlockPublisher: c.config.Node.RunBlockPublisher, + }, + Username: c.config.Node.WebInterfaceUsername, + Password: c.config.Node.WebInterfacePassword, + } + + var s *api.Server + if c.config.Node.WebInterfaceHTTPS { + // Verify cert/key parameters, and if neither exist, create them + exists, err := checkCertFiles(c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + if err != nil { + c.logger.WithError(err).Error("checkCertFiles failed") + return nil, err + } + + if !exists { + c.logger.Infof("Autogenerating HTTP certificate and key files %s, %s", c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + if err := createCertFiles(c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey); err != nil { + c.logger.WithError(err).Error("createCertFiles failed") + return nil, err + } + + c.logger.Infof("Created cert file %s", c.config.Node.WebInterfaceCert) + c.logger.Infof("Created key file %s", c.config.Node.WebInterfaceKey) + } + + s, err = api.CreateHTTPS(host, config, gw, c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + if err != nil { + c.logger.WithError(err).Error("Failed to start web failed") + return nil, err + } + } else { + var err error + s, err = api.Create(host, config, gw) + if err != nil { + c.logger.WithError(err).Error("Failed to start web failed") + return nil, err + } + } + + return s, nil +} + +// checkCertFiles returns true if both cert and key files exist, false if neither exist, +// or returns an error if only one does not exist +func checkCertFiles(cert, key string) (bool, error) { + doesFileExist := func(f string) (bool, error) { + if _, err := os.Stat(f); err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + return true, nil + } + + certExists, err := doesFileExist(cert) + if err != nil { + return false, err + } + + keyExists, err := doesFileExist(key) + if err != nil { + return false, err + } + + switch { + case certExists && keyExists: + return true, nil + case !certExists && !keyExists: + return false, nil + case certExists && !keyExists: + return false, fmt.Errorf("certfile %s exists but keyfile %s does not", cert, key) + case !certExists && keyExists: + return false, fmt.Errorf("keyfile %s exists but certfile %s does not", key, cert) + default: + log.Panic("unreachable code") + return false, errors.New("unreachable code") + } +} + +func createCertFiles(certFile, keyFile string) error { + org := "skycoin daemon autogenerated cert" + validUntil := time.Now().Add(10 * 365 * 24 * time.Hour) + cert, key, err := certutil.NewTLSCertPair(org, validUntil, nil) + if err != nil { + return err + } + + if err := ioutil.WriteFile(certFile, cert, 0600); err != nil { + return err + } + if err := ioutil.WriteFile(keyFile, key, 0600); err != nil { + os.Remove(certFile) + return err + } + + return nil +} + +// ParseConfig prepare the config +func (c *Coin) ParseConfig() error { + return c.config.postProcess() +} + +// InitTransaction creates the genesis transaction +func InitTransaction(uxID string, genesisSecKey cipher.SecKey, dist params.Distribution) coin.Transaction { + dist.MustValidate() + + var txn coin.Transaction + + output := cipher.MustSHA256FromHex(uxID) + if err := txn.PushInput(output); err != nil { + log.Panic(err) + } + + for _, addr := range dist.AddressesDecoded() { + if err := txn.PushOutput(addr, dist.AddressInitialBalance()*droplet.Multiplier, 1); err != nil { + log.Panic(err) + } + } + + seckeys := make([]cipher.SecKey, 1) + seckey := genesisSecKey.Hex() + seckeys[0] = cipher.MustSecKeyFromHex(seckey) + txn.SignInputs(seckeys) + + if err := txn.UpdateHeader(); err != nil { + log.Panic(err) + } + + if err := txn.Verify(); err != nil { + log.Panic(err) + } + + log.Printf("signature= %s", txn.Sigs[0].Hex()) + return txn +} + +func createDirIfNotExist(dir string) error { + if _, err := os.Stat(dir); !os.IsNotExist(err) { + return nil + } + + return os.Mkdir(dir, 0750) +} + +func shouldVerifyDB(appVersion, dbVersion *semver.Version) bool { + // If the dbVersion is not set, verify + if dbVersion == nil { + return true + } + + // If the dbVersion is less than the verification checkpoint version + // and the appVersion is greater than or equal to the checkpoint version, + // verify + if dbVersion.LT(dbVerifyCheckpointVersionParsed) && appVersion.GTE(dbVerifyCheckpointVersionParsed) { + return true + } + + return false +} + +func init() { + dbVerifyCheckpointVersionParsed = semver.MustParse(DBVerifyCheckpointVersion) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin_test.go b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin_test.go new file mode 100644 index 00000000..1c17f8d9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin_test.go @@ -0,0 +1,333 @@ +// package skycoin implements skycoin main integration tests +package skycoin + +import ( + "bufio" + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "sync" + "testing" + "time" + + "github.com/blang/semver" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/visor" +) + +const ( + testFixturesDir = "testdata" + checkpointVersion = "0.25.0" +) + +var ( + // import path for github.com/SkycoinProject/skycoin/cmd/skycoin + ldflagsNameCmd string + + // import path for github.com/SkycoinProject/skycoin/src/skycoin + ldflagsNameSkyLib string +) + +func TestMain(m *testing.M) { + coin := getCoinName() + output, err := exec.Command("go", "list", fmt.Sprintf("../../cmd/%s", coin)).CombinedOutput() //nolint:gosec + if err != nil { + fmt.Fprintf(os.Stderr, "go list failed: %s", output) + os.Exit(1) + } + + ldflagsNameCmd = strings.TrimSpace(string(output)) + + output, err = exec.Command("go", "list", ".").CombinedOutput() //nolint:gosec + if err != nil { + fmt.Fprintf(os.Stderr, "go list failed: %s", output) + os.Exit(1) + } + + ldflagsNameSkyLib = strings.TrimSpace(string(output)) + + ret := m.Run() + os.Exit(ret) +} + +func getCoinName() string { + coin := os.Getenv("COIN") + if coin == "" { + coin = "skycoin" + } + return coin +} + +func versionUpgradeWaitTimeout(t *testing.T) time.Duration { + x := os.Getenv("VERSION_UPGRADE_TEST_WAIT_TIMEOUT") + if x == "" { + return time.Second * 5 + } + + d, err := time.ParseDuration(x) + require.NoError(t, err) + return d +} + +func buildBinary(t *testing.T, version string) (string, func()) { + coin := getCoinName() + + binaryName := fmt.Sprintf("%s-skycoin-pkg-%s.test", coin, version) + binaryPath, err := filepath.Abs(binaryName) + require.NoError(t, err) + + // coverpkgName will be like github.com/SkycoinProject/skycoin + coverpkgName := filepath.Dir(filepath.Dir(ldflagsNameCmd)) + + // Build binary file with specific app version and db checkpoint version + args := []string{ + "test", "-c", + "-ldflags", fmt.Sprintf("-X %s.Version=%s -X %s.DBVerifyCheckpointVersion=%s", ldflagsNameCmd, version, ldflagsNameSkyLib, checkpointVersion), + "-tags", "testrunmain", + "-o", binaryPath, + fmt.Sprintf("-coverpkg=%s/...", coverpkgName), + fmt.Sprintf("../../cmd/%s/", coin), + } + cmd := exec.Command("go", args...) + + stdout, err := cmd.StdoutPipe() + require.NoError(t, err) + + err = cmd.Start() + require.NoError(t, err) + + output, err := ioutil.ReadAll(stdout) + require.NoError(t, err) + + err = cmd.Wait() + require.NoError(t, err, "Output: %s", string(output)) + + return binaryPath, func() { + if err := os.Remove(binaryPath); err != nil { + t.Logf("Failed to remove %s: %v", binaryPath, err) + } + } +} + +func TestDBVerifyLogic(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Windows doesn't support SIGINT") + return + } + + cases := []struct { + name string + dbFile string + dbVersion string + appVersion string + shouldVerify bool + args []string + err string + }{ + { + name: "db no version, app version 0.25.0", + dbFile: "no-version.db", + dbVersion: "", + appVersion: "0.25.0", + shouldVerify: true, + }, + { + name: "db version 0.24.1, app version 0.24.1", + dbFile: "version-0.24.1.db", + dbVersion: "0.24.1", + appVersion: "0.24.1", + shouldVerify: false, + }, + { + name: "db version 0.25.0, app version 0.25.0", + dbFile: "version-0.25.0.db", + dbVersion: "0.25.0", + appVersion: "0.25.0", + shouldVerify: false, + }, + { + name: "db version 0.25.0, app version 0.26.0", + dbFile: "version-0.25.0.db", + dbVersion: "0.25.0", + appVersion: "0.26.0", + shouldVerify: false, + }, + { + name: "db version 0.25.0, app version 0.26.0, force verify", + dbFile: "version-0.25.0.db", + dbVersion: "0.25.0", + appVersion: "0.26.0", + args: []string{"-verify-db=true"}, + shouldVerify: true, + }, + { + name: "db version 0.24.1, app version 0.26.0", + dbFile: "version-0.24.1.db", + dbVersion: "0.24.1", + appVersion: "0.26.0", + shouldVerify: true, + }, + { + name: "db version 0.25.0, app version 0.24.1", + dbFile: "version-0.25.0.db", + dbVersion: "0.25.0", + appVersion: "0.24.1", + err: "Cannot use newer DB version=0.25.0 with older software version=0.24.1", + }, + } + + copyDBFile := func(t *testing.T, dbFile string) string { + // Copy the database file to a temp file since it will be modified by the application + dbf, err := os.Open(filepath.Join(testFixturesDir, dbFile)) + require.NoError(t, err) + defer dbf.Close() + + f, err := ioutil.TempFile("", fmt.Sprintf("%s.*", dbFile)) + require.NoError(t, err) + defer f.Close() + + _, err = io.Copy(f, dbf) + require.NoError(t, err) + + return f.Name() + } + + err := os.MkdirAll("../../coverage", 0750) + require.NoError(t, err) + + // Cache for prebuilt binaries (reduces test time by not recompiling needlessly) + appCache := make(map[string]string) + var appCacheLock sync.Mutex + var cleanups []func() + defer func() { + for _, f := range cleanups { + f() + } + }() + + for i, tc := range cases { + coverageFile := fmt.Sprintf("../../coverage/db-verify-logic-%d.coverage.out", i) + t.Run(tc.name, func(t *testing.T) { + // Build the binary with a specific version + binaryPath := func() string { + appCacheLock.Lock() + defer appCacheLock.Unlock() + binaryPath := appCache[tc.appVersion] + if binaryPath == "" { + var cleanup func() + binaryPath, cleanup = buildBinary(t, tc.appVersion) + appCache[tc.appVersion] = binaryPath + cleanups = append(cleanups, cleanup) + } + return binaryPath + }() + + tmpFile := copyDBFile(t, tc.dbFile) + defer os.Remove(tmpFile) + + // Run the binary with networking disabled + args := append([]string{ + "-disable-networking=true", + "-web-interface=false", + "-download-peerlist=false", + fmt.Sprintf("-db-path=%s", tmpFile), + "-test.run", "^TestRunMain$", + fmt.Sprintf("-test.coverprofile=%s", coverageFile), + }, tc.args...) + + cmd := exec.Command(binaryPath, args...) + + stdout, err := cmd.StdoutPipe() + require.NoError(t, err) + + scanner := bufio.NewScanner(stdout) + + err = cmd.Start() + require.NoError(t, err) + + // Kill the process if it hasn't had an error or checked the database within a timeout, + // so that the tests that test that the database is not checked can complete + go time.AfterFunc(versionUpgradeWaitTimeout(t), func() { + if tc.shouldVerify { + cmd.Process.Kill() //nolint:errcheck + } else { + cmd.Process.Signal(os.Interrupt) //nolint:errcheck + } + }) + + // Scan for an error message or for the database check marker + didVerify := false + foundErrMsg := false + for scanner.Scan() { + x := scanner.Bytes() + + if tc.err != "" && bytes.Contains(x, []byte(tc.err)) { + foundErrMsg = true + break + } + + verifyMsg := "Checking database" + if bytes.Contains(x, []byte(verifyMsg)) { + didVerify = true + cmd.Process.Signal(os.Interrupt) //nolint:errcheck + break + } + } + + err = cmd.Wait() + if err != nil { + require.EqualError(t, err, "exit status 1", err.Error()) + require.NotEmpty(t, tc.err, "unexpected error: %v", err.Error()) + require.True(t, foundErrMsg) + + // Re-open the database to check that the version was not modified + db, err := visor.OpenDB(tmpFile, false) + require.NoError(t, err) + defer db.Close() + + v, err := visor.GetDBVersion(db) + require.NoError(t, err) + require.NotNil(t, v) + + expectVersion := semver.MustParse(tc.dbVersion) + require.Equal(t, expectVersion, *v) + + return + } + + require.NoError(t, err) + require.Empty(t, tc.err) + require.False(t, foundErrMsg) + require.Equal(t, tc.shouldVerify, didVerify) + + // Re-open the database to check that the version was added + db, err := visor.OpenDB(tmpFile, false) + require.NoError(t, err) + defer db.Close() + + v, err := visor.GetDBVersion(db) + require.NoError(t, err) + require.NotNil(t, v) + + appVersion := semver.MustParse(tc.appVersion) + + expectVersion := appVersion + + if tc.dbVersion != "" { + dbVersion := semver.MustParse(tc.dbVersion) + if appVersion.LT(dbVersion) { + expectVersion = dbVersion + } + } + + require.Equal(t, expectVersion, *v) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/no-version.db b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/no-version.db new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.24.1.db b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.24.1.db new file mode 100644 index 00000000..673730d8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.24.1.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.25.0.db b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.25.0.db new file mode 100644 index 00000000..ef7b2ed3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.25.0.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/testutil/assert/assertions.go b/vendor/github.com/SkycoinProject/skycoin/src/testutil/assert/assertions.go new file mode 100644 index 00000000..53bcc851 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/testutil/assert/assertions.go @@ -0,0 +1,73 @@ +package testutil + +import ( + "fmt" + + logrus "github.com/sirupsen/logrus" + assert "github.com/stretchr/testify/assert" +) + +// didPanic returns true if the function passed to it panics. Otherwise, it returns false. +func didPanic(f assert.PanicTestFunc) (bool, interface{}) { + + didPanic := false + var message interface{} + func() { + + defer func() { + if message = recover(); message != nil { + didPanic = true + } + }() + + // call the target function + f() + + }() + + return didPanic, message +} + +// TestValuePredicate checks that a value meets certain condition +// This function type may be seen as a continuation of a test scenario. +// Assertions executed inside of it may be recorded to the calling context +// by accessing free-vars in function closure. +type TestValuePredicate func(value interface{}) (success bool) + +// PanicsWithCondition asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value meets a given condition. +// +// assert.PanicsWithCondition(t, func(value){ return assert.True(t, isCrazy(value)) }, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithCondition(t assert.TestingT, condition TestValuePredicate, f assert.PanicTestFunc, msgAndArgs ...interface{}) bool { + + funcDidPanic, panicValue := didPanic(f) + if !funcDidPanic { + return assert.Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + return condition(panicValue) +} + +// PanicsWithLogMessage asserts that the code inside the specified PanicTestFunc panics, and that +// an expected string is included in log message. +// +// assert.PanicsWithLogMessage(t, "Log msg", func(){ log.Panic("Log msg for X") }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithLogMessage(t assert.TestingT, expectedMessage string, f assert.PanicTestFunc, msgAndArgs ...interface{}) bool { + return PanicsWithCondition(t, func(logValue interface{}) bool { + gotMessage, gotIt := "", false + if entry, isEntry := logValue.(*logrus.Entry); isEntry { + gotMessage, gotIt = entry.Message, true + } else { + if msg, isString := logValue.(string); isString { + gotMessage, gotIt = msg, true + } + } + if gotIt { + return assert.Contains(t, gotMessage, expectedMessage) + } + return assert.Fail(t, "expected string or log entry but got %T", logValue) + }, f, msgAndArgs) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/testutil/require/require.go b/vendor/github.com/SkycoinProject/skycoin/src/testutil/require/require.go new file mode 100644 index 00000000..04ac7fe7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/testutil/require/require.go @@ -0,0 +1,32 @@ +package require + +import ( + assert "github.com/stretchr/testify/assert" + require "github.com/stretchr/testify/require" + + _assert "github.com/SkycoinProject/skycoin/src/testutil/assert" +) + +// PanicsWithCondition asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value meets a given condition. +// +// assert.PanicsWithCondition(t, func(value){ return assert.True(t, isCrazy(value)) }, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithCondition(t require.TestingT, condition _assert.TestValuePredicate, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !_assert.PanicsWithCondition(t, condition, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithLogMessage asserts that the code inside the specified PanicTestFunc panics, and that +// an expected string is included in log message. +// +// assert.PanicsWithLogMessage(t, "Log msg", func(){ log.Panic("Log msg for X") }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithLogMessage(t require.TestingT, expectedMessage string, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !_assert.PanicsWithLogMessage(t, expectedMessage, f, msgAndArgs) { + t.FailNow() + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/testutil/testutil.go b/vendor/github.com/SkycoinProject/skycoin/src/testutil/testutil.go new file mode 100644 index 00000000..586be5b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/testutil/testutil.go @@ -0,0 +1,120 @@ +/* +Package testutil provides utility methods for testing +*/ +package testutil + +import ( + "crypto/rand" + "io/ioutil" + "os" + "testing" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +// PrepareDB creates and opens a temporary test DB and returns it with a cleanup callback +func PrepareDB(t *testing.T) (*dbutil.DB, func()) { + f, err := ioutil.TempFile("", "testdb") + require.NoError(t, err) + + db, err := bolt.Open(f.Name(), 0700, nil) + require.NoError(t, err) + + return dbutil.WrapDB(db), func() { + err := db.Close() + if err != nil { + t.Logf("Failed to close database: %v", err) + } + + err = f.Close() + if err != nil { + t.Logf("Failed to close file: %v", err) + } + + err = os.Remove(f.Name()) + if err != nil { + t.Logf("Failed to remove temp file %s: %v", f.Name(), err) + } + } +} + +// RequireError requires that an error is not nil and that its message matches +func RequireError(t *testing.T, err error, msg string) { + t.Helper() + require.Error(t, err) + require.NotNil(t, err) + require.Equal(t, msg, err.Error()) +} + +// MakeAddress creates a cipher.Address +func MakeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +// MakePubKey creates a cipher.PubKey +func MakePubKey() cipher.PubKey { + p, _ := cipher.GenerateKeyPair() + return p +} + +// RandBytes returns n random bytes +func RandBytes(t *testing.T, n int) []byte { + b := make([]byte, n) + _, err := rand.Read(b) + require.NoError(t, err) + return b +} + +// RandSHA256 returns a random SHA256 hash +func RandSHA256(t *testing.T) cipher.SHA256 { + return cipher.SumSHA256(RandBytes(t, 128)) +} + +// SHA256FromHex converts an SHA256 hex string to a cipher.SHA256 +func SHA256FromHex(t *testing.T, hex string) cipher.SHA256 { + sha, err := cipher.SHA256FromHex(hex) + require.NoError(t, err) + return sha +} + +// RandSig returns a random cipher.Sig +func RandSig(t *testing.T) cipher.Sig { + s, err := cipher.NewSig(RandBytes(t, 65)) + require.NoError(t, err) + return s +} + +// RequireFileExists requires that a file exists +func RequireFileExists(t *testing.T, fn string) os.FileInfo { + stat, err := os.Stat(fn) + require.NoError(t, err) + return stat +} + +// RequireFileNotExists requires that a file doesn't exist +func RequireFileNotExists(t *testing.T, fn string) { + _, err := os.Stat(fn) + require.True(t, os.IsNotExist(err)) +} + +// RandXPub creates a random xpub key +func RandXPub(t *testing.T) *bip32.PublicKey { + m := bip39.MustNewDefaultMnemonic() + s, err := bip39.NewSeed(m, "") + require.NoError(t, err) + c, err := bip44.NewCoin(s, bip44.CoinTypeSkycoin) + require.NoError(t, err) + x, err := c.Account(0) + require.NoError(t, err) + e, err := x.External() + require.NoError(t, err) + return e.PublicKey() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose.go new file mode 100644 index 00000000..f090d0b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose.go @@ -0,0 +1,278 @@ +package transaction + +import ( + "bytes" + "errors" + "sort" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +var ( + // ErrInsufficientBalance is returned if a wallet does not have enough balance for a spend + ErrInsufficientBalance = NewError(errors.New("balance is not sufficient")) + // ErrInsufficientHours is returned if a wallet does not have enough hours for a spend with requested hours + ErrInsufficientHours = NewError(errors.New("hours are not sufficient")) + // ErrZeroSpend is returned if a transaction is trying to spend 0 coins + ErrZeroSpend = NewError(errors.New("zero spend amount")) + // ErrNoUnspents is returned if a Create is called with no unspent outputs + ErrNoUnspents = NewError(errors.New("no unspents to spend")) +) + +// UxBalance is an intermediate representation of a UxOut for sorting and spend choosing +type UxBalance struct { + Hash cipher.SHA256 + BkSeq uint64 + Time uint64 + Address cipher.Address + Coins uint64 + InitialHours uint64 + Hours uint64 + SrcTransaction cipher.SHA256 +} + +// NewUxBalances converts coin.UxArray to []UxBalance. headTime is required to calculate coin hours. +func NewUxBalances(uxa coin.UxArray, headTime uint64) ([]UxBalance, error) { + uxb := make([]UxBalance, len(uxa)) + for i, ux := range uxa { + b, err := NewUxBalance(headTime, ux) + if err != nil { + return nil, err + } + uxb[i] = b + } + + return uxb, nil +} + +// NewUxBalance converts coin.UxOut to UxBalance. headTime is required to calculate coin hours. +func NewUxBalance(headTime uint64, ux coin.UxOut) (UxBalance, error) { + hours, err := ux.CoinHours(headTime) + if err != nil { + return UxBalance{}, err + } + + return UxBalance{ + Hash: ux.Hash(), + BkSeq: ux.Head.BkSeq, + Time: ux.Head.Time, + Address: ux.Body.Address, + Coins: ux.Body.Coins, + InitialHours: ux.Body.Hours, + Hours: hours, + SrcTransaction: ux.Body.SrcTransaction, + }, nil +} + +func uxBalancesSub(a, b []UxBalance) []UxBalance { + var x []UxBalance + + bMap := make(map[cipher.SHA256]struct{}, len(b)) + for _, i := range b { + bMap[i.Hash] = struct{}{} + } + + for _, i := range a { + if _, ok := bMap[i.Hash]; !ok { + x = append(x, i) + } + } + + return x +} + +// ChooseSpendsMinimizeUxOuts chooses uxout spends to satisfy an amount, using the least number of uxouts +// -- PRO: Allows more frequent spending, less waiting for confirmations, useful for exchanges. +// -- PRO: When transaction is volume is higher, transactions are prioritized by fee/size. Minimizing uxouts minimizes size. +// -- CON: Would make the unconfirmed pool grow larger. +// Users with high transaction frequency will want to use this so that they will not need to wait as frequently +// for unconfirmed spends to complete before sending more. +// Alternatively, or in addition to this, they should batch sends into single transactions. +func ChooseSpendsMinimizeUxOuts(uxa []UxBalance, coins, hours uint64) ([]UxBalance, error) { + return ChooseSpends(uxa, coins, hours, sortSpendsCoinsHighToLow) +} + +// sortSpendsCoinsHighToLow sorts uxout spends with highest balance to lowest +func sortSpendsCoinsHighToLow(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByCoins(uxa, func(a, b uint64) bool { + return a > b + })) +} + +// ChooseSpendsMaximizeUxOuts chooses uxout spends to satisfy an amount, using the most number of uxouts +// See the pros and cons of ChooseSpendsMinimizeUxOuts. +// This should be the default mode, because this keeps the unconfirmed pool smaller which will allow +// the network to scale better. +func ChooseSpendsMaximizeUxOuts(uxa []UxBalance, coins, hours uint64) ([]UxBalance, error) { + return ChooseSpends(uxa, coins, hours, sortSpendsCoinsLowToHigh) +} + +// sortSpendsCoinsLowToHigh sorts uxout spends with lowest balance to highest +func sortSpendsCoinsLowToHigh(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByCoins(uxa, func(a, b uint64) bool { + return a < b + })) +} + +// sortSpendsHoursLowToHigh sorts uxout spends with lowest hours to highest +func sortSpendsHoursLowToHigh(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByHours(uxa, func(a, b uint64) bool { + return a < b + })) +} + +func makeCmpUxOutByCoins(uxa []UxBalance, coinsCmp func(a, b uint64) bool) func(i, j int) bool { + // Sort by: + // coins highest or lowest depending on coinsCmp + // hours lowest + // oldest first + // tie break with hash comparison + return func(i, j int) bool { + a := uxa[i] + b := uxa[j] + + if a.Coins == b.Coins { + if a.Hours == b.Hours { + if a.BkSeq == b.BkSeq { + return cmpUxBalanceByUxID(a, b) + } + return a.BkSeq < b.BkSeq + } + return a.Hours < b.Hours + } + return coinsCmp(a.Coins, b.Coins) + } +} + +func makeCmpUxOutByHours(uxa []UxBalance, hoursCmp func(a, b uint64) bool) func(i, j int) bool { + // Sort by: + // hours highest or lowest depending on hoursCmp + // coins lowest + // oldest first + // tie break with hash comparison + return func(i, j int) bool { + a := uxa[i] + b := uxa[j] + + if a.Hours == b.Hours { + if a.Coins == b.Coins { + if a.BkSeq == b.BkSeq { + return cmpUxBalanceByUxID(a, b) + } + return a.BkSeq < b.BkSeq + } + return a.Coins < b.Coins + } + return hoursCmp(a.Hours, b.Hours) + } +} + +func cmpUxBalanceByUxID(a, b UxBalance) bool { + cmp := bytes.Compare(a.Hash[:], b.Hash[:]) + if cmp == 0 { + logger.Panic("Duplicate UxOut when sorting") + } + return cmp < 0 +} + +// ChooseSpends chooses uxouts from a list of uxouts. +// It first chooses the uxout with the most number of coins that has nonzero coinhours. +// It then chooses uxouts with zero coinhours, ordered by sortStrategy +// It then chooses remaining uxouts with nonzero coinhours, ordered by sortStrategy +func ChooseSpends(uxa []UxBalance, coins, hours uint64, sortStrategy func([]UxBalance)) ([]UxBalance, error) { + if coins == 0 { + return nil, ErrZeroSpend + } + + if len(uxa) == 0 { + return nil, ErrNoUnspents + } + + for _, ux := range uxa { + if ux.Coins == 0 { + logger.Panic("UxOut coins are 0, can't spend") + return nil, errors.New("UxOut coins are 0, can't spend") + } + } + + // Split UxBalances into those with and without hours + var nonzero, zero []UxBalance + for _, ux := range uxa { + if ux.Hours == 0 { + zero = append(zero, ux) + } else { + nonzero = append(nonzero, ux) + } + } + + // Abort if there are no uxouts with non-zero coinhours, they can't be spent yet + if len(nonzero) == 0 { + return nil, fee.ErrTxnNoFee + } + + // Sort uxouts with hours lowest to highest and coins highest to lowest + sortSpendsCoinsHighToLow(nonzero) + + var haveCoins uint64 + var haveHours uint64 + var spending []UxBalance + + // Use the first nonzero output. This output will have the least hours possible + firstNonzero := nonzero[0] + if firstNonzero.Hours == 0 { + logger.Panic("balance has zero hours unexpectedly") + return nil, errors.New("balance has zero hours unexpectedly") + } + + nonzero = nonzero[1:] + + spending = append(spending, firstNonzero) + + haveCoins += firstNonzero.Coins + haveHours += firstNonzero.Hours + + if haveCoins >= coins && fee.RemainingHours(haveHours, params.UserVerifyTxn.BurnFactor) >= hours { + return spending, nil + } + + // Sort uxouts without hours according to the sorting strategy + sortStrategy(zero) + + for _, ux := range zero { + spending = append(spending, ux) + + haveCoins += ux.Coins + haveHours += ux.Hours + + if haveCoins >= coins { + break + } + } + + if haveCoins >= coins && fee.RemainingHours(haveHours, params.UserVerifyTxn.BurnFactor) >= hours { + return spending, nil + } + + // Sort remaining uxouts with hours according to the sorting strategy + sortStrategy(nonzero) + + for _, ux := range nonzero { + spending = append(spending, ux) + + haveCoins += ux.Coins + haveHours += ux.Hours + + if haveCoins >= coins && fee.RemainingHours(haveHours, params.UserVerifyTxn.BurnFactor) >= hours { + return spending, nil + } + } + + if haveCoins < coins { + return nil, ErrInsufficientBalance + } + + return nil, ErrInsufficientHours +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose_test.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose_test.go new file mode 100644 index 00000000..9b62cb92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose_test.go @@ -0,0 +1,534 @@ +package transaction + +import ( + "bytes" + "math" + "math/rand" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +func TestSortSpendsCoinsLowToHigh(t *testing.T) { + // UxBalances are sorted with Coins lowest, then following other order rules + orderedUxb := []UxBalance{ + { + Hash: testutil.RandSHA256(t), + BkSeq: 5, + Coins: 1, + Hours: 0, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 3, + Coins: 10, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 1, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 100, + Hours: 100, + }, + } + + shuffleWorked := false + nShuffle := 20 + for i := 0; i < nShuffle; i++ { + // Shuffle the list + uxb := make([]UxBalance, len(orderedUxb)) + copy(uxb, orderedUxb) + + for i := range uxb { + j := rand.Intn(i + 1) + uxb[i], uxb[j] = uxb[j], uxb[i] + } + + // Sanity check that shuffling produces a new result + if !reflect.DeepEqual(uxb, orderedUxb) { + shuffleWorked = true + } + + sortSpendsCoinsLowToHigh(uxb) + + for i, ux := range uxb { + require.Equal(t, orderedUxb[i], ux, "index %d", i) + } + + verifySortedCoinsLowToHigh(t, uxb) + } + + require.True(t, shuffleWorked) + + nRand := 1000 + for i := 0; i < nRand; i++ { + uxb := makeRandomUxBalances(t) + + sortSpendsCoinsLowToHigh(uxb) + verifySortedCoinsLowToHigh(t, uxb) + } +} + +func TestSortSpendsCoinsHighToLow(t *testing.T) { + // UxBalances are sorted with Coins highest, then following other order rules + orderedUxb := []UxBalance{ + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 10000, + Hours: 0, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 10, + Coins: 1000, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 100, + Hours: 100, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 3, + Coins: 10, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 1, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + } + + shuffleWorked := false + nShuffle := 20 + for i := 0; i < nShuffle; i++ { + // Shuffle the list + uxb := make([]UxBalance, len(orderedUxb)) + copy(uxb, orderedUxb) + + rand.Shuffle(len(uxb), func(i, j int) { + uxb[i], uxb[j] = uxb[j], uxb[i] + }) + + if !reflect.DeepEqual(uxb, orderedUxb) { + shuffleWorked = true + } + + sortSpendsCoinsHighToLow(uxb) + + for i, ux := range uxb { + require.Equal(t, orderedUxb[i], ux, "index %d", i) + } + + verifySortedCoinsHighToLow(t, uxb) + } + + require.True(t, shuffleWorked) + + nRand := 1000 + for i := 0; i < nRand; i++ { + uxb := makeRandomUxBalances(t) + + sortSpendsCoinsHighToLow(uxb) + verifySortedCoinsHighToLow(t, uxb) + } +} + +func TestSortSpendsHoursLowToHigh(t *testing.T) { + // UxBalances are sorted with Coins lowest, then following other order rules + orderedUxb := []UxBalance{ + { + Hash: testutil.RandSHA256(t), + BkSeq: 5, + Coins: 1, + Hours: 0, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 3, + Coins: 10, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 1, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 100, + Hours: 100, + }, + } + + shuffleWorked := false + nShuffle := 20 + for i := 0; i < nShuffle; i++ { + // Shuffle the list + uxb := make([]UxBalance, len(orderedUxb)) + copy(uxb, orderedUxb) + + for i := range uxb { + j := rand.Intn(i + 1) + uxb[i], uxb[j] = uxb[j], uxb[i] + } + + // Sanity check that shuffling produces a new result + if !reflect.DeepEqual(uxb, orderedUxb) { + shuffleWorked = true + } + + sortSpendsHoursLowToHigh(uxb) + + for i, ux := range uxb { + require.Equal(t, orderedUxb[i], ux, "index %d", i) + } + + verifySortedHoursLowToHigh(t, uxb) + } + + require.True(t, shuffleWorked) + + nRand := 1000 + for i := 0; i < nRand; i++ { + uxb := makeRandomUxBalances(t) + + sortSpendsHoursLowToHigh(uxb) + verifySortedHoursLowToHigh(t, uxb) + } +} + +func TestChooseSpendsMaximizeUxOuts(t *testing.T) { + nRand := 10000 + for i := 0; i < nRand; i++ { + coins := uint64((rand.Intn(3)+1)*10 + rand.Intn(3)) // 10,20,30 + 0,1,2 + uxb := makeRandomUxBalances(t) + + verifyChosenCoins(t, uxb, coins, ChooseSpendsMaximizeUxOuts, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) + } + + // 0 coins (error) + uxb := makeRandomUxBalances(t) + verifyChosenCoins(t, uxb, 0, ChooseSpendsMaximizeUxOuts, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) + + // 0 coins in a UxBalance (panic) + uxb[1].Coins = 0 + require.Panics(t, func() { + verifyChosenCoins(t, uxb, 10, ChooseSpendsMaximizeUxOuts, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) + }) + + // MaxUint64 coins (error) + uxb = makeRandomUxBalances(t) + verifyChosenCoins(t, uxb, math.MaxUint64, ChooseSpendsMinimizeUxOuts, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) +} + +func TestChooseSpendsMinimizeUxOutsRandom(t *testing.T) { + nRand := 10000 + for i := 0; i < nRand; i++ { + coins := uint64((rand.Intn(3)+1)*10 + rand.Intn(3)) // 10,20,30 + 0,1,2 + uxb := makeRandomUxBalances(t) + + verifyChosenCoins(t, uxb, coins, ChooseSpendsMinimizeUxOuts, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) + } + + // 0 coins (error) + uxb := makeRandomUxBalances(t) + verifyChosenCoins(t, uxb, 0, ChooseSpendsMinimizeUxOuts, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) + + // 0 coins in a UxBalance (panic) + uxb[1].Coins = 0 + require.Panics(t, func() { + verifyChosenCoins(t, uxb, 10, ChooseSpendsMaximizeUxOuts, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) + }) + + // MaxUint64 coins (error) + uxb = makeRandomUxBalances(t) + verifyChosenCoins(t, uxb, math.MaxUint64, ChooseSpendsMinimizeUxOuts, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) +} + +func makeRandomUxBalances(t *testing.T) []UxBalance { + // Generate random 0-100 UxBalances + // Coins 1-10 (must be >0) + // Hours 0-10 + // BkSeq 0-10 + // Hash random + // Small ranges are used for Coins, Hours, BkSeq to increase likelihood + // that they collide and test deeper sorting comparisons + + n := rand.Intn(101) + uxb := make([]UxBalance, n) + + // Use a random max range for the hours' rand range to ensure enough + // balances have zero hours + hasZeroHoursRange := rand.Intn(3) + 1 + + for i := 0; i < n; i++ { + ux := UxBalance{ + Coins: uint64(rand.Intn(10) + 1), // 1-10 + Hours: uint64(rand.Intn(hasZeroHoursRange)), + BkSeq: uint64(rand.Intn(11)), // 0-10 + Hash: testutil.RandSHA256(t), + } + + uxb[i] = ux + } + + return uxb +} + +func verifyChosenCoins(t *testing.T, uxb []UxBalance, coins uint64, chooseSpends func([]UxBalance, uint64, uint64) ([]UxBalance, error), cmpCoins func(i, j UxBalance) bool) { + var haveZero, haveNonzero int + for _, ux := range uxb { + if ux.Hours == 0 { + haveZero++ + } else { + haveNonzero++ + } + } + + var totalCoins, totalHours uint64 + for _, ux := range uxb { + totalCoins += ux.Coins + totalHours += ux.Hours + } + + chosen, err := chooseSpends(uxb, coins, 0) + + if coins == 0 { + testutil.RequireError(t, err, ErrZeroSpend.Error()) + return + } + + if len(uxb) == 0 { + testutil.RequireError(t, err, ErrNoUnspents.Error()) + return + } + + if totalHours == 0 { + testutil.RequireError(t, err, fee.ErrTxnNoFee.Error()) + return + } + + if coins > totalCoins { + testutil.RequireError(t, err, ErrInsufficientBalance.Error()) + return + } + + require.NoError(t, err) + require.NotEqual(t, 0, len(chosen)) + + // Check that there are no duplicated spends chosen + uxMap := make(map[UxBalance]struct{}, len(chosen)) + for _, ux := range chosen { + _, ok := uxMap[ux] + require.False(t, ok) + uxMap[ux] = struct{}{} + } + + // The first chosen spend should have non-zero coin hours + require.NotEqual(t, uint64(0), chosen[0].Hours) + + // Outputs with zero hours should come before any outputs with non-zero hours, + // except for the first output + for i := range chosen { + if i <= 1 { + continue + } + + a := chosen[i-1] + b := chosen[i] + + if b.Hours == 0 { + require.Equal(t, uint64(0), a.Hours) + } + } + + // The initial UxBalance with hours should have more or equal coins than any other UxBalance with hours + // If it has equal coins, it should have less hours + for _, ux := range chosen[1:] { + if ux.Hours != 0 { + require.True(t, chosen[0].Coins >= ux.Coins) + + if chosen[0].Coins == ux.Coins { + require.True(t, chosen[0].Hours <= ux.Hours) + } + } + } + + var zeroBalances, nonzeroBalances []UxBalance + for _, ux := range chosen[1:] { + if ux.Hours == 0 { + zeroBalances = append(zeroBalances, ux) + } else { + nonzeroBalances = append(nonzeroBalances, ux) + } + } + + // Amongst the UxBalances with zero hours, they should be sorted as specified + verifySortedCoins(t, zeroBalances, cmpCoins) + + // Amongst the UxBalances with non-zero hours, they should be sorted as specified + verifySortedCoins(t, nonzeroBalances, cmpCoins) + + // If there are any extra UxBalances with non-zero hours, all of the zeros should have been chosen + if len(nonzeroBalances) > 0 { + require.Equal(t, haveZero, len(zeroBalances)) + } + + // Excessive UxBalances to satisfy the amount requested should not be included + var haveCoins uint64 + for i, ux := range chosen { + haveCoins += ux.Coins + if haveCoins >= coins { + require.Equal(t, len(chosen)-1, i) + } + } +} + +func verifySortedCoins(t *testing.T, uxb []UxBalance, cmpCoins func(a, b UxBalance) bool) { + if len(uxb) <= 1 { + return + } + + for i := range uxb { + if i == 0 { + continue + } + + a := uxb[i-1] + b := uxb[i] + + require.True(t, cmpCoins(a, b)) + + if a.Coins == b.Coins { + require.True(t, a.Hours <= b.Hours) + + if a.Hours == b.Hours { + require.True(t, a.BkSeq <= b.BkSeq) + + if a.BkSeq == b.BkSeq { + cmp := bytes.Compare(a.Hash[:], b.Hash[:]) + require.True(t, cmp < 0) + } + } + } + } +} + +func verifySortedCoinsLowToHigh(t *testing.T, uxb []UxBalance) { + verifySortedCoins(t, uxb, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) +} + +func verifySortedCoinsHighToLow(t *testing.T, uxb []UxBalance) { + verifySortedCoins(t, uxb, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) +} + +func verifySortedHours(t *testing.T, uxb []UxBalance, cmpHours func(a, b UxBalance) bool) { + if len(uxb) <= 1 { + return + } + + for i := range uxb { + if i == 0 { + continue + } + + a := uxb[i-1] + b := uxb[i] + + require.True(t, cmpHours(a, b)) + + if a.Hours == b.Hours { + require.True(t, a.Coins <= b.Coins) + + if a.Coins == b.Coins { + require.True(t, a.BkSeq <= b.BkSeq) + + if a.BkSeq == b.BkSeq { + cmp := bytes.Compare(a.Hash[:], b.Hash[:]) + require.True(t, cmp < 0) + } + } + } + } +} + +func verifySortedHoursLowToHigh(t *testing.T, uxb []UxBalance) { + verifySortedHours(t, uxb, func(a, b UxBalance) bool { + return a.Hours <= b.Hours + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/create.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/create.go new file mode 100644 index 00000000..795bb679 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/create.go @@ -0,0 +1,504 @@ +/* +Package transaction provides methods for creating transactions + +See package coin for the Transaction object itself +*/ +package transaction + +import ( + "bytes" + "errors" + "fmt" + "sort" + + "github.com/shopspring/decimal" + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +var ( + logger = logging.MustGetLogger("txn") +) + +// Create creates an unsigned transaction based upon Params. +// NOTE: Caller must ensure that auxs correspond to params.UxOuts options +// Outputs to spend are chosen from the pool of outputs provided. +// The outputs are chosen by the following procedure: +// - All outputs are merged into one list and are sorted coins highest, hours lowest, with the hash as a tiebreaker +// - Outputs are chosen from the beginning of this list, until the requested amount of coins is met. +// If hours are also specified, selection continues until the requested amount of hours are met. +// - If the total amount of coins in the chosen outputs is exactly equal to the requested amount of coins, +// such that there would be no change output but hours remain as change, another output will be chosen to create change, +// if the coinhour cost of adding that output is less than the coinhours that would be lost as change +// If receiving hours are not explicitly specified, hours are allocated amongst the receiving outputs proportional to the number of coins being sent to them. +// If the change address is not specified, the address whose bytes are lexically sorted first is chosen from the owners of the outputs being spent. +func Create(p Params, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []UxBalance, error) { + return create(p, auxs, headTime, 0) +} + +func create(p Params, auxs coin.AddressUxOuts, headTime uint64, callCount int) (*coin.Transaction, []UxBalance, error) { + logger.WithFields(logrus.Fields{ + "params": p, + "nAuxs": len(auxs), + "headTime": headTime, + "callCount": callCount, + }).Info("create requested") + + if err := p.Validate(); err != nil { + return nil, nil, err + } + + txn := &coin.Transaction{} + + // Determine which unspents to spend + uxa := auxs.Flatten() + + uxb, err := NewUxBalances(uxa, headTime) + if err != nil { + return nil, nil, err + } + + // Reverse lookup set to recover the inputs + uxbMap := make(map[cipher.SHA256]UxBalance, len(uxb)) + for _, u := range uxb { + if _, ok := uxbMap[u.Hash]; ok { + return nil, nil, errors.New("Duplicate UxBalance in array") + } + uxbMap[u.Hash] = u + } + + // Calculate total coins and minimum hours to send + var totalOutCoins uint64 + var requestedHours uint64 + for _, to := range p.To { + totalOutCoins, err = mathutil.AddUint64(totalOutCoins, to.Coins) + if err != nil { + return nil, nil, NewError(fmt.Errorf("total output coins error: %v", err)) + } + + requestedHours, err = mathutil.AddUint64(requestedHours, to.Hours) + if err != nil { + return nil, nil, NewError(fmt.Errorf("total output hours error: %v", err)) + } + } + + // Use the MinimizeUxOuts strategy, to use least possible uxouts + // this will allow more frequent spending + // we don't need to check whether we have sufficient balance beforehand as ChooseSpends already checks that + spends, err := ChooseSpendsMinimizeUxOuts(uxb, totalOutCoins, requestedHours) + if err != nil { + return nil, nil, err + } + + // Calculate total coins and hours in spends + var totalInputCoins uint64 + var totalInputHours uint64 + for _, spend := range spends { + totalInputCoins, err = mathutil.AddUint64(totalInputCoins, spend.Coins) + if err != nil { + return nil, nil, err + } + + totalInputHours, err = mathutil.AddUint64(totalInputHours, spend.Hours) + if err != nil { + return nil, nil, err + } + + if err := txn.PushInput(spend.Hash); err != nil { + logger.Critical().WithError(err).Error("PushInput failed") + return nil, nil, err + } + } + + feeHours := fee.RequiredFee(totalInputHours, params.UserVerifyTxn.BurnFactor) + if feeHours == 0 { + // feeHours can only be 0 if totalInputHours is 0, and if totalInputHours was 0 + // then ChooseSpendsMinimizeUxOuts should have already returned an error + err := errors.New("Chosen spends have no coin hours, unexpectedly") + logger.Critical().WithError(err).WithField("totalInputHours", totalInputHours).Error() + return nil, nil, err + } + remainingHours := totalInputHours - feeHours + + switch p.HoursSelection.Type { + case HoursSelectionTypeManual: + for _, o := range p.To { + if err := txn.PushOutput(o.Address, o.Coins, o.Hours); err != nil { + logger.Critical().WithError(err).WithField("selectionType", HoursSelectionTypeManual).Error("PushOutput failed") + return nil, nil, err + } + } + + case HoursSelectionTypeAuto: + var addrHours []uint64 + + switch p.HoursSelection.Mode { + case HoursSelectionModeShare: + // multiply remaining hours after fee burn with share factor + hours, err := mathutil.Uint64ToInt64(remainingHours) + if err != nil { + return nil, nil, err + } + + allocatedHoursInt := p.HoursSelection.ShareFactor.Mul(decimal.New(hours, 0)).IntPart() + allocatedHours, err := mathutil.Int64ToUint64(allocatedHoursInt) + if err != nil { + return nil, nil, err + } + + toCoins := make([]uint64, len(p.To)) + for i, to := range p.To { + toCoins[i] = to.Coins + } + + addrHours, err = DistributeCoinHoursProportional(toCoins, allocatedHours) + if err != nil { + return nil, nil, err + } + default: + // This should have been caught by params.Validate() + logger.Panic("Invalid HoursSelection.Mode") + return nil, nil, errors.New("Invalid HoursSelection.Type") + } + + for i, out := range p.To { + out.Hours = addrHours[i] + if err := txn.PushOutput(out.Address, out.Coins, addrHours[i]); err != nil { + logger.Critical().WithError(err).WithField("selectionType", HoursSelectionTypeAuto).Error("PushOutput failed") + return nil, nil, err + } + } + + default: + // This should have been caught by params.Validate() + logger.Panic("Invalid HoursSelection.Type") + return nil, nil, errors.New("Invalid HoursSelection.Type") + } + + totalOutHours, err := txn.OutputHours() + if err != nil { + return nil, nil, err + } + + // Make sure we have enough coins and coin hours + // If we don't, and we called ChooseSpends, then ChooseSpends has a bug, as it should have returned this error already + if totalOutCoins > totalInputCoins { + logger.Critical().WithError(ErrInsufficientBalance).Error("Insufficient coins after choosing spends, this should not occur") + return nil, nil, ErrInsufficientBalance + } + + if totalOutHours > remainingHours { + logger.Critical().WithError(fee.ErrTxnInsufficientCoinHours).Error("Insufficient hours after choosing spends or distributing hours, this should not occur") + return nil, nil, fee.ErrTxnInsufficientCoinHours + } + + // Create change output + changeCoins := totalInputCoins - totalOutCoins + changeHours := remainingHours - totalOutHours + + logger.WithFields(logrus.Fields{ + "totalOutCoins": totalOutCoins, + "totalOutHours": totalOutHours, + "requestedHours": requestedHours, + "nUnspents": len(uxb), + "totalInputCoins": totalInputCoins, + "totalInputHours": totalInputHours, + "feeHours": feeHours, + "remainingHours": remainingHours, + "changeCoins": changeCoins, + "changeHours": changeHours, + "nSpends": len(spends), + "nInputs": len(txn.In), + }).Info("Calculated spend parameters") + + // If there are no change coins but there are change hours, try to add another + // input to save the change hours. + // This chooses an available input with the least number of coin hours; + // if the extra coin hour fee incurred by this additional input is less than + // the remaining coin hours, the input is added. + if changeCoins == 0 && changeHours > 0 { + logger.Info("Trying to recover change hours by forcing an extra input") + // Find the output with the least coin hours + // If size of the fee for this output is less than the changeHours, add it + // Update changeCoins and changeHours + z := uxBalancesSub(uxb, spends) + sortSpendsHoursLowToHigh(z) + if len(z) > 0 { + logger.Info("Extra input found, evaluating if it can recover change hours") + extra := z[0] + + // Calculate the new hours being spent + newTotalHours, err := mathutil.AddUint64(totalInputHours, extra.Hours) + if err != nil { + return nil, nil, err + } + + // Calculate the new fee for this new amount of hours + newFee := fee.RequiredFee(newTotalHours, params.UserVerifyTxn.BurnFactor) + if newFee < feeHours { + err := errors.New("updated fee after adding extra input for change is unexpectedly less than it was initially") + logger.WithError(err).Error() + return nil, nil, err + } + + // If the cost of adding this extra input is less than the amount of change hours we + // can save, use the input + additionalFee := newFee - feeHours + if additionalFee < changeHours { + logger.Info("Change hours can be recovered by forcing an extra input") + changeCoins = extra.Coins + + if extra.Hours < additionalFee { + err := errors.New("calculated additional fee is unexpectedly higher than the extra input's hours") + logger.WithError(err).Error() + return nil, nil, err + } + + additionalHours := extra.Hours - additionalFee + changeHours, err = mathutil.AddUint64(changeHours, additionalHours) + if err != nil { + return nil, nil, err + } + + spends = append(spends, extra) + + if err := txn.PushInput(extra.Hash); err != nil { + logger.Critical().WithError(err).Error("PushInput failed") + return nil, nil, err + } + + logger.WithFields(logrus.Fields{ + "changeCoins": changeCoins, + "changeHours": changeHours, + "nSpends": len(spends), + "nInputs": len(txn.In), + "newTotalHours": newTotalHours, + "newFee": "newFee", + "additionalFee": additionalFee, + "additionalHours": additionalHours, + }).Info("Recalculated spend parameters after forcing a change output") + } else { + logger.Info("Unable to recover change hours by forcing an extra input") + } + } else { + logger.Info("No more inputs left to use to recover change hours") + } + } + + // With auto share mode, if there are leftover hours and change couldn't be force-added, + // recalculate that share ratio at 100% + if changeCoins == 0 && changeHours > 0 && p.HoursSelection.Type == HoursSelectionTypeAuto && p.HoursSelection.Mode == HoursSelectionModeShare { + logger.Info("Recalculating share factor at 1.0 to avoid burning change hours") + oneDecimal := decimal.New(1, 0) + + if p.HoursSelection.ShareFactor.Equal(oneDecimal) { + err := errors.New("share factor is 1.0 but changeHours > 0 unexpectedly") + logger.Critical().WithError(err).Error() + return nil, nil, err + } + + // Double-check that we haven't already called create() once already - + // if for some reason the previous check fails, we'll end up in an infinite loop + if callCount > 0 { + err := errors.New("transaction.Create already fell back to share ratio 1.0") + logger.Critical().WithError(err).Error() + return nil, nil, err + } + + p.HoursSelection.ShareFactor = &oneDecimal + return create(p, auxs, headTime, 1) + } + + if changeCoins > 0 { + var changeAddress cipher.Address + if p.ChangeAddress != nil { + changeAddress = *p.ChangeAddress + } else { + // Choose a change address from the unspent outputs + // Sort spends by address, comparing bytes, and use the first + // This provides deterministic change address selection from a set of unspent outputs + if len(spends) == 0 { + return nil, nil, errors.New("spends is unexpectedly empty when choosing an automatic change address") + } + + addressBytes := make([][]byte, len(spends)) + for i, s := range spends { + addressBytes[i] = s.Address.Bytes() + } + + sort.Slice(addressBytes, func(i, j int) bool { + return bytes.Compare(addressBytes[i], addressBytes[j]) < 0 + }) + + var err error + changeAddress, err = cipher.AddressFromBytes(addressBytes[0]) + if err != nil { + logger.Critical().WithError(err).Error("cipher.AddressFromBytes failed for change address converted to bytes") + return nil, nil, err + } + + logger.WithField("addr", changeAddress).Info("Automatically selected a change address") + } + + logger.WithFields(logrus.Fields{ + "changeAddress": changeAddress, + "changeCoins": changeCoins, + "changeHours": changeHours, + }).Info("Adding a change output") + + if err := txn.PushOutput(changeAddress, changeCoins, changeHours); err != nil { + logger.Critical().WithError(err).Error("PushOutput failed") + return nil, nil, err + } + } + + // Initialize unsigned transaction + txn.Sigs = make([]cipher.Sig, len(txn.In)) + + if err := txn.UpdateHeader(); err != nil { + logger.Critical().WithError(err).Error("txn.UpdateHeader failed") + return nil, nil, err + } + + inputs := make([]UxBalance, len(txn.In)) + for i, h := range txn.In { + uxBalance, ok := uxbMap[h] + if !ok { + err := errors.New("Created transaction's input is not in the UxBalanceSet, this should not occur") + logger.Critical().WithError(err).Error() + return nil, nil, err + } + inputs[i] = uxBalance + } + + if err := verifyCreatedUnignedInvariants(p, txn, inputs); err != nil { + logger.Critical().WithError(err).Error("CreateTransaction created transaction that violates invariants, aborting") + return nil, nil, fmt.Errorf("Created transaction that violates invariants, this is a bug: %v", err) + } + + return txn, inputs, nil +} + +func verifyCreatedUnignedInvariants(p Params, txn *coin.Transaction, inputs []UxBalance) error { + if !txn.IsFullyUnsigned() { + return errors.New("Transaction is not fully unsigned") + } + + if err := VerifyCreatedInvariants(p, txn, inputs); err != nil { + return err + } + + return nil +} + +// VerifyCreatedInvariants checks that the transaction that was created matches expectations. +// Does not call visor verification methods because that causes import cycle due to the wallet package. +// daemon.Gateway checks that the transaction passes additional visor verification methods. +// TODO -- could fix the import cycle by having visor create the transaction, passing it to the wallet for verifying params and signing +// This method still compares some values of Params against the created txn and doesn't only verify that the txn is well formed +func VerifyCreatedInvariants(p Params, txn *coin.Transaction, inputs []UxBalance) error { + for _, o := range txn.Out { + // No outputs should be sent to the null address + if o.Address.Null() { + return errors.New("Output address is null") + } + + if o.Coins == 0 { + return errors.New("Output coins is 0") + } + } + + if len(txn.Out) != len(p.To) && len(txn.Out) != len(p.To)+1 { + return errors.New("Transaction has unexpected number of outputs") + } + + for i, o := range txn.Out[:len(p.To)] { + if o.Address != p.To[i].Address { + return errors.New("Output address does not match requested address") + } + + if o.Coins != p.To[i].Coins { + return errors.New("Output coins does not match requested coins") + } + + if p.To[i].Hours != 0 && o.Hours != p.To[i].Hours { + return errors.New("Output hours does not match requested hours") + } + } + + if len(txn.Sigs) != len(txn.In) { + return errors.New("Number of signatures does not match number of inputs") + } + + if len(txn.In) != len(inputs) { + return errors.New("Number of UxOut inputs does not match number of transaction inputs") + } + + for i, h := range txn.In { + if inputs[i].Hash != h { + return errors.New("Transaction input hash does not match UxOut inputs hash") + } + } + + inputsMap := make(map[cipher.SHA256]struct{}, len(inputs)) + + for _, i := range inputs { + if i.Hours < i.InitialHours { + return errors.New("Calculated input hours are unexpectedly less than the initial hours") + } + + if i.BkSeq == 0 { + if !i.SrcTransaction.Null() { + return errors.New("Input is the genesis UTXO but its source transaction hash is not null") + } + } else { + if i.SrcTransaction.Null() { + return errors.New("Input's source transaction hash is null") + } + } + + if i.Hash.Null() { + return errors.New("Input's hash is null") + } + + if _, ok := inputsMap[i.Hash]; ok { + return errors.New("Duplicate input in array") + } + + inputsMap[i.Hash] = struct{}{} + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = mathutil.AddUint64(inputHours, i.Hours) + if err != nil { + return err + } + } + + var outputHours uint64 + for _, i := range txn.Out { + var err error + outputHours, err = mathutil.AddUint64(outputHours, i.Hours) + if err != nil { + return err + } + } + + if inputHours < outputHours { + return errors.New("Total input hours is less than the output hours") + } + + if inputHours-outputHours < fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor) { + return errors.New("Transaction will not satisfy required fee") + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/create_test.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/create_test.go new file mode 100644 index 00000000..c62a9051 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/create_test.go @@ -0,0 +1,796 @@ +package transaction + +import ( + "bytes" + "errors" + "math" + "math/rand" + "sort" + "testing" + "time" + + "github.com/shopspring/decimal" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +func TestCreate(t *testing.T) { + headTime := uint64(time.Now().UTC().Unix()) + seed := []byte("seed") + + // Generate first keys + _, secKeys := cipher.MustGenerateDeterministicKeyPairsSeed(seed, 11) + secKey := secKeys[0] + addr := cipher.MustAddressFromSecKey(secKey) + + var extraWalletAddrs []cipher.Address + for _, s := range secKeys[1:] { + extraWalletAddrs = append(extraWalletAddrs, cipher.MustAddressFromSecKey(s)) + } + + // Create unspent outputs + var uxouts []coin.UxOut + var originalUxouts []coin.UxOut + addrs := []cipher.Address{} + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + originalUxouts = append(originalUxouts, uxout) + + a := testutil.MakeAddress() + addrs = append(addrs, a) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxouts), func(i, j int) { + uxouts[i], uxouts[j] = uxouts[j], uxouts[i] + }) + + // Create extra unspent outputs. These have the same value as uxouts, but are spendable by + // keys held in extraWalletAddrs + extraUxouts := make([][]coin.UxOut, len(extraWalletAddrs)) + for j := range extraWalletAddrs { + s := secKeys[j+1] + + var uxouts []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, s, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + } + + extraUxouts[j] = uxouts + } + + // Create unspent outputs with no hours + var uxoutsNoHours []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, 0) + uxout.Head.Time = headTime + uxoutsNoHours = append(uxoutsNoHours, uxout) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxoutsNoHours), func(i, j int) { + uxoutsNoHours[i], uxoutsNoHours[j] = uxoutsNoHours[j], uxoutsNoHours[i] + }) + + changeAddress := testutil.MakeAddress() + + validParams := Params{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + } + + newShareFactor := func(a string) *decimal.Decimal { + d, err := decimal.NewFromString(a) + require.NoError(t, err) + return &d + } + + firstAddress := func(uxa coin.UxArray) cipher.Address { + require.NotEmpty(t, uxa) + + addresses := make([]cipher.Address, len(uxa)) + for i, a := range uxa { + addresses[i] = a.Body.Address + } + + sort.Slice(addresses, func(i, j int) bool { + x := addresses[i].Bytes() + y := addresses[j].Bytes() + return bytes.Compare(x, y) < 0 + }) + + return addresses[0] + } + + cases := []struct { + name string + err error + params Params + unspents []coin.UxOut + addressUnspents coin.AddressUxOuts + chosenUnspents []coin.UxOut + headTime uint64 + changeOutput *coin.TransactionOutput + toExpectedHours []uint64 + }{ + { + name: "params invalid", + params: Params{}, + err: NewError(errors.New("To is required")), + }, + + { + name: "overflowing coin hours in params", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: math.MaxUint64, + Coins: 1e6, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1e6, + }, + }, + }, + err: NewError(errors.New("total output hours error: uint64 addition overflow")), + }, + + { + name: "overflowing coins in params", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: math.MaxUint64, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1, + }, + }, + }, + err: NewError(errors.New("total output coins error: uint64 addition overflow")), + }, + + { + name: "no unspents", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: ErrNoUnspents, + }, + + { + name: "insufficient coins", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 100e6, + }, + }, + }, + unspents: uxouts[:1], + err: ErrInsufficientBalance, + }, + + { + name: "insufficient hours", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 100e6, + Coins: 1e6, + }, + }, + }, + unspents: uxouts[:1], + err: ErrInsufficientHours, + }, + + { + name: "manual, 1 output, no change", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 90, + Coins: 2e6, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0]}, + }, + + // TODO -- belongs in visor_wallet_test.go + // { + // name: "manual, 1 output, no change, unknown address in auxs", + // params: Params{ + // ChangeAddress: &changeAddress, + // HoursSelection: HoursSelection{ + // Type: HoursSelectionTypeManual, + // }, + // Wallet: CreateTransactionWalletParams{}, + // To: []coin.TransactionOutput{ + // { + // Address: addrs[0], + // Hours: 50, + // Coins: 2e6, + // }, + // }, + // }, + // addressUnspents: coin.AddressUxOuts{ + // testutil.MakeAddress(): []coin.UxOut{extraUxouts[0][0]}, + // }, + // err: ErrUnknownAddress, + // }, + + { + name: "manual, 1 output, change", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 130, + Coins: 2e6 + 1, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 50, + Coins: 2e6 - 1, + }, + }, + + { + name: "manual, 1 output, change, unspecified change address", + params: Params{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 2e6 + 1, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: &coin.TransactionOutput{ + Address: firstAddress([]coin.UxOut{originalUxouts[0], originalUxouts[1]}), + Hours: 130, + Coins: 2e6 - 1, + }, + }, + + { + // there are leftover coin hours and an additional input is added + // to force change to save the leftover coin hours + name: "manual, 1 output, forced change", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 0, + Coins: 2e6 * 2, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 272, + Coins: 2e6, + }, + }, + + { + // there are leftover coin hours and no coins change, + // but there are no more unspents to use to force a change output + name: "manual, 1 output, forced change rejected no more unspents", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 80, + Coins: 2e6 * 2, + }, + }, + }, + unspents: originalUxouts[:2], + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: nil, + }, + + { + // there are leftover coin hours and no coins change, + // but the hours cost of saving them with an additional input is less than is leftover + name: "manual, 1 output, forced change rejected", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 175, + Coins: 2e6 * 2, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: nil, + }, + + { + name: "manual, multiple outputs", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 1e6, + }, + { + Address: addrs[0], + Hours: 50, + Coins: 1e6 + 1, + }, + { + Address: addrs[1], + Hours: 70, + Coins: 2e6, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 102, + Coins: 2e6 - 1, + }, + }, + + { + name: "manual, multiple outputs, varied addressUnspents", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 1e6, + }, + { + Address: addrs[0], + Hours: 50, + Coins: 1e6 + 1, + }, + { + Address: addrs[1], + Hours: 70, + Coins: 2e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0]}, + extraWalletAddrs[3]: []coin.UxOut{extraUxouts[3][1], extraUxouts[3][2]}, + extraWalletAddrs[5]: []coin.UxOut{extraUxouts[5][6]}, + }, + chosenUnspents: []coin.UxOut{extraUxouts[0][0], extraUxouts[3][1], extraUxouts[3][2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 102, + Coins: 2e6 - 1, + }, + }, + + { + name: "auto, multiple outputs, share factor 0.5", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0.5"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 136, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{27, 54, 54, 1}, + }, + + { + name: "auto, multiple outputs, share factor 0.5, switch to 1.0 because no change could be made", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0.5"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e6 - 1e3, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + toExpectedHours: []uint64{46, 90, 90, 45, 1}, + }, + + { + name: "auto, multiple outputs, share factor 0", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 272, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{0, 0, 0, 0}, + }, + + { + name: "auto, multiple outputs, share factor 1", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("1"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 0, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{55, 108, 108, 1}, + }, + + { + name: "no coin hours in inputs", + unspents: uxoutsNoHours[:], + params: Params{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: fee.ErrTxnNoFee, + }, + + { + name: "duplicate unspent output", + unspents: append(uxouts, uxouts[:2]...), + params: validParams, + err: errors.New("Duplicate UxBalance in array"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.headTime == 0 { + tc.headTime = headTime + } + + addrUxOuts := coin.AddressUxOuts{ + addr: tc.unspents, + } + + if tc.addressUnspents != nil { + addrUxOuts = tc.addressUnspents + } + + unspents := make(map[cipher.SHA256]coin.UxOut) + for _, uxs := range addrUxOuts { + for _, ux := range uxs { + unspents[ux.Hash()] = ux + } + } + + t.Log("len of addrUxOuts:", len(addrUxOuts.Flatten())) + txn, inputs, err := Create(tc.params, addrUxOuts, tc.headTime) + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + if tc.err != nil { + return + } + + err = txn.VerifyUnsigned() + require.NoError(t, err) + + t.Log("len of txn.In:", len(txn.In)) + require.Equal(t, len(inputs), len(txn.In)) + + // Checks duplicate inputs in array + inputsMap := make(map[cipher.SHA256]struct{}) + for _, i := range inputs { + _, ok := inputsMap[i.Hash] + require.False(t, ok) + inputsMap[i.Hash] = struct{}{} + } + + for i, inUxid := range txn.In { + _, ok := unspents[inUxid] + require.True(t, ok) + + require.Equal(t, inUxid, inputs[i].Hash) + } + + // Compare the transaction inputs + chosenUnspents := make([]coin.UxOut, len(tc.chosenUnspents)) + chosenUnspentHashes := make([]cipher.SHA256, len(tc.chosenUnspents)) + for i, u := range tc.chosenUnspents { + chosenUnspents[i] = u + chosenUnspentHashes[i] = u.Hash() + t.Log(u.Hash()) + } + + sort.Slice(chosenUnspentHashes, func(i, j int) bool { + return bytes.Compare(chosenUnspentHashes[i][:], chosenUnspentHashes[j][:]) < 0 + }) + sort.Slice(chosenUnspents, func(i, j int) bool { + h1 := chosenUnspents[i].Hash() + h2 := chosenUnspents[j].Hash() + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + sortedTxnIn := make([]cipher.SHA256, len(txn.In)) + copy(sortedTxnIn[:], txn.In[:]) + + sort.Slice(sortedTxnIn, func(i, j int) bool { + return bytes.Compare(sortedTxnIn[i][:], sortedTxnIn[j][:]) < 0 + }) + + t.Log(len(chosenUnspentHashes)) + t.Log(len(sortedTxnIn)) + t.Log(len(txn.In)) + require.Equal(t, chosenUnspentHashes, sortedTxnIn) + + sort.Slice(inputs, func(i, j int) bool { + h1 := inputs[i].Hash + h2 := inputs[j].Hash + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + chosenUnspentsUxBalances := make([]UxBalance, len(chosenUnspents)) + for i, o := range chosenUnspents { + b, err := NewUxBalance(tc.headTime, o) + require.NoError(t, err) + chosenUnspentsUxBalances[i] = b + } + + require.Equal(t, chosenUnspentsUxBalances, inputs) + + // Assign expected hours for comparison + var to []coin.TransactionOutput + to = append(to, tc.params.To...) + + if len(tc.toExpectedHours) != 0 { + require.Equal(t, len(tc.toExpectedHours), len(to)) + for i, h := range tc.toExpectedHours { + to[i].Hours = h + } + } + + // Add the change output if specified + if tc.changeOutput != nil { + to = append(to, *tc.changeOutput) + } + + // Compare transaction outputs + require.Equal(t, to, txn.Out) + }) + } +} + +func makeUxOut(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxOut { //nolint:unparam + body := makeUxBody(t, s, coins, hours) + tm := rand.Int31n(1000) + seq := rand.Int31n(100) + return coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(tm), + BkSeq: uint64(seq), + }, + Body: body, + } +} + +func makeUxBody(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxBody { + p := cipher.MustPubKeyFromSecKey(s) + return coin.UxBody{ + SrcTransaction: cipher.SumSHA256(testutil.RandBytes(t, 128)), + Address: cipher.AddressFromPubKey(p), + Coins: coins, + Hours: hours, + } +} + +func TestDecimalPtrEqual(t *testing.T) { + // Sanity check for decimal comparison after converting to a pointer; + // if this test fails then the Create method can go into an infinite loop + oneDecimal := decimal.New(1, 0) + oneDecimalPtr := &oneDecimal + oneDecimal2 := decimal.New(1, 0) + require.True(t, oneDecimalPtr.Equal(oneDecimal2)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours.go new file mode 100644 index 00000000..93997ca1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours.go @@ -0,0 +1,165 @@ +package transaction + +import ( + "errors" + "math/big" + + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +// DistributeSpendHours calculates how many coin hours to transfer to the change address and how +// many to transfer to each of the other destination addresses. +// Input hours are split by BurnFactor (rounded down) to meet the fee requirement. +// The remaining hours are split in half, one half goes to the change address +// and the other half goes to the destination addresses. +// If the remaining hours are an odd number, the change address gets the extra hour. +// If the amount assigned to the destination addresses is not perfectly divisible by the +// number of destination addresses, the extra hours are distributed to some of these addresses. +// Returns the number of hours to send to the change address, +// an array of length nAddrs with the hours to give to each destination address, +// and a sum of these values. +func DistributeSpendHours(inputHours, nAddrs uint64, haveChange bool) (uint64, []uint64, uint64) { + feeHours := fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor) + remainingHours := inputHours - feeHours + + var changeHours uint64 + if haveChange { + // Split the remaining hours between the change output and the other outputs + changeHours = remainingHours / 2 + + // If remainingHours is an odd number, give the extra hour to the change output + if remainingHours%2 == 1 { + changeHours++ + } + } + + // Distribute the remaining hours equally amongst the destination outputs + remainingAddrHours := remainingHours - changeHours + addrHoursShare := remainingAddrHours / nAddrs + + // Due to integer division, extra coin hours might remain after dividing by len(toAddrs) + // Allocate these extra hours to the toAddrs + addrHours := make([]uint64, nAddrs) + for i := range addrHours { + addrHours[i] = addrHoursShare + } + + extraHours := remainingAddrHours - (addrHoursShare * nAddrs) + i := 0 + for extraHours > 0 { + addrHours[i] = addrHours[i] + 1 + i++ + extraHours-- + } + + // Assert that the hour calculation is correct + var spendHours uint64 + for _, h := range addrHours { + spendHours += h + } + spendHours += changeHours + if spendHours != remainingHours { + logger.Panicf("spendHours != remainingHours (%d != %d), calculation error", spendHours, remainingHours) + } + + return changeHours, addrHours, spendHours +} + +// DistributeCoinHoursProportional distributes hours amongst coins proportional to the coins amount +func DistributeCoinHoursProportional(coins []uint64, hours uint64) ([]uint64, error) { + if len(coins) == 0 { + return nil, errors.New("DistributeCoinHoursProportional coins array must not be empty") + } + + coinsInt := make([]*big.Int, len(coins)) + + var total uint64 + for i, c := range coins { + if c == 0 { + return nil, errors.New("DistributeCoinHoursProportional coins array has a zero value") + } + + var err error + total, err = mathutil.AddUint64(total, c) + if err != nil { + return nil, err + } + + cInt64, err := mathutil.Uint64ToInt64(c) + if err != nil { + return nil, err + } + + coinsInt[i] = big.NewInt(cInt64) + } + + totalInt64, err := mathutil.Uint64ToInt64(total) + if err != nil { + return nil, err + } + totalInt := big.NewInt(totalInt64) + + hoursInt64, err := mathutil.Uint64ToInt64(hours) + if err != nil { + return nil, err + } + hoursInt := big.NewInt(hoursInt64) + + var assignedHours uint64 + addrHours := make([]uint64, len(coins)) + for i, c := range coinsInt { + // Scale the ratio of coins to total coins proportionally by calculating + // (coins * totalHours) / totalCoins + // The remainder is truncated, remaining hours are appended after this + num := &big.Int{} + num.Mul(c, hoursInt) + + fracInt := big.Int{} + fracInt.Div(num, totalInt) + + if !fracInt.IsUint64() { + return nil, errors.New("DistributeCoinHoursProportional calculated fractional hours is not representable as a uint64") + } + + fracHours := fracInt.Uint64() + + addrHours[i] = fracHours + assignedHours, err = mathutil.AddUint64(assignedHours, fracHours) + if err != nil { + return nil, err + } + } + + if hours < assignedHours { + return nil, errors.New("DistributeCoinHoursProportional assigned hours exceeding input hours, this is a bug") + } + + remainingHours := hours - assignedHours + + if remainingHours > uint64(len(coins)) { + return nil, errors.New("DistributeCoinHoursProportional remaining hours exceed len(coins), this is a bug") + } + + // For remaining hours lost due to fractional cutoff when scaling, + // first provide at least 1 coin hour to coins that were assigned 0. + i := 0 + for remainingHours > 0 && i < len(coins) { + if addrHours[i] == 0 { + addrHours[i] = 1 + remainingHours-- + } + i++ + } + + // Then, assign the extra coin hours + i = 0 + for remainingHours > 0 { + addrHours[i] = addrHours[i] + 1 + remainingHours-- + i++ + } + + return addrHours, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours_test.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours_test.go new file mode 100644 index 00000000..d56a8ed2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours_test.go @@ -0,0 +1,665 @@ +package transaction + +import ( + "errors" + "fmt" + "math" + "math/rand" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +func TestDistributeCoinHoursProportional(t *testing.T) { + cases := []struct { + name string + coins []uint64 + hours uint64 + output []uint64 + err error + }{ + { + name: "no coins", + hours: 1, + err: errors.New("DistributeCoinHoursProportional coins array must not be empty"), + }, + { + name: "coins have 0 in them", + coins: []uint64{1, 2, 0, 3}, + hours: 1, + err: errors.New("DistributeCoinHoursProportional coins array has a zero value"), + }, + { + name: "total coins too large while adding", + coins: []uint64{10, math.MaxUint64 - 9}, + hours: 1, + err: mathutil.ErrUint64AddOverflow, + }, + { + name: "total coins too large after adding", + coins: []uint64{10, math.MaxInt64}, + hours: 1, + err: mathutil.ErrUint64OverflowsInt64, + }, + { + name: "single coin too large", + coins: []uint64{10, math.MaxInt64 + 1}, + hours: 1, + err: mathutil.ErrUint64OverflowsInt64, + }, + { + name: "hours too large", + coins: []uint64{10}, + hours: math.MaxInt64 + 1, + err: mathutil.ErrUint64OverflowsInt64, + }, + + { + name: "valid, one input", + coins: []uint64{1}, + hours: 1, + output: []uint64{1}, + }, + + { + name: "zero hours", + coins: []uint64{1}, + hours: 0, + output: []uint64{0}, + }, + + { + name: "valid, multiple inputs, all equal", + coins: []uint64{2, 4, 8, 16}, + hours: 30, + output: []uint64{2, 4, 8, 16}, + }, + + { + name: "valid, multiple inputs, rational division in coins and hours", + coins: []uint64{2, 4, 8, 16}, + hours: 30, + output: []uint64{2, 4, 8, 16}, + }, + + { + name: "valid, multiple inputs, rational division in coins, irrational in hours", + coins: []uint64{2, 4, 8, 16}, + hours: 31, + output: []uint64{3, 4, 8, 16}, + }, + + { + name: "valid, multiple inputs, irrational division in coins, rational in hours", + coins: []uint64{2, 3, 5, 7, 11, 13}, + hours: 41, + output: []uint64{2, 3, 5, 7, 11, 13}, + }, + + { + name: "valid, multiple inputs, irrational division in coins and hours", + coins: []uint64{2, 3, 5, 7, 11, 13}, + hours: 50, + output: []uint64{3, 4, 7, 8, 13, 15}, + }, + + { + name: "valid, multiple inputs that would receive 0 hours but get compensated from remainder as priority", + coins: []uint64{16, 8, 4, 2, 1, 1}, + hours: 14, + output: []uint64{7, 3, 1, 1, 1, 1}, + }, + + { + name: "not enough hours for everyone", + coins: []uint64{1, 1, 1, 1, 1}, + hours: 1, + output: []uint64{1, 0, 0, 0, 0}, + }, + + { + name: "not enough hours for everyone 2", + coins: []uint64{1, 1, 1, 1, 1}, + hours: 3, + output: []uint64{1, 1, 1, 0, 0}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + hours, err := DistributeCoinHoursProportional(tc.coins, tc.hours) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.NoError(t, err) + require.Equal(t, tc.output, hours) + } + }) + } + + // Randomized tests + iterations := 10000 + maxCoinsLen := 300 + maxMaxCoins := 100000 + maxHours := 15000000 + coins := make([]uint64, maxCoinsLen) + for i := 0; i < iterations; i++ { + coinsLen := rand.Intn(maxCoinsLen) + 1 + + maxCoins := rand.Intn(maxMaxCoins) + 1 + + var totalCoins uint64 + for i := 0; i < coinsLen; i++ { + coins[i] = uint64(rand.Intn(maxCoins) + 1) + + var err error + totalCoins, err = mathutil.AddUint64(totalCoins, coins[i]) + require.NoError(t, err) + } + + hours := uint64(rand.Intn(maxHours)) + + output, err := DistributeCoinHoursProportional(coins[:coinsLen], hours) + require.NoError(t, err) + + require.Equal(t, coinsLen, len(output)) + + var totalHours uint64 + for _, h := range output { + if hours >= totalCoins { + require.NotEqual(t, uint64(0), h) + } + + var err error + totalHours, err = mathutil.AddUint64(totalHours, h) + require.NoError(t, err) + } + + require.Equal(t, hours, totalHours) + } +} + +func TestDistributeSpendHours(t *testing.T) { + originalBurnFactor := params.UserVerifyTxn.BurnFactor + + cases := []struct { + burnFactor uint32 + cases []distributeSpendHoursTestCase + }{ + {2, burnFactor2TestCases}, + {3, burnFactor3TestCases}, + {10, burnFactor10TestCases}, + } + + tested := false + for _, tcc := range cases { + if tcc.burnFactor == params.UserVerifyTxn.BurnFactor { + tested = true + } + + for _, tc := range tcc.cases { + t.Run(tc.name, func(t *testing.T) { + params.UserVerifyTxn.BurnFactor = tcc.burnFactor + defer func() { + params.UserVerifyTxn.BurnFactor = originalBurnFactor + }() + + changeHours, addrHours, totalHours := DistributeSpendHours(tc.inputHours, tc.nAddrs, tc.haveChange) + require.Equal(t, tc.expectChangeHours, changeHours) + require.Equal(t, tc.expectAddrHours, addrHours) + require.Equal(t, tc.nAddrs, uint64(len(addrHours))) + + outputHours := changeHours + for _, h := range addrHours { + outputHours += h + } + require.True(t, tc.inputHours >= outputHours) + require.Equal(t, outputHours, totalHours) + + if tc.inputHours != 0 { + err := fee.VerifyTransactionFeeForHours(outputHours, tc.inputHours-outputHours, params.UserVerifyTxn.BurnFactor) + require.NoError(t, err) + } + }) + } + + t.Run(fmt.Sprintf("burn-factor-%d-range", tcc.burnFactor), func(t *testing.T) { + params.UserVerifyTxn.BurnFactor = tcc.burnFactor + defer func() { + params.UserVerifyTxn.BurnFactor = originalBurnFactor + }() + + // Tests over range of values + for inputHours := uint64(0); inputHours <= 1e3; inputHours++ { + for nAddrs := uint64(1); nAddrs < 16; nAddrs++ { + for _, haveChange := range []bool{true, false} { + name := fmt.Sprintf("inputHours=%d nAddrs=%d haveChange=%v", inputHours, nAddrs, haveChange) + t.Run(name, func(t *testing.T) { + changeHours, addrHours, totalHours := DistributeSpendHours(inputHours, nAddrs, haveChange) + require.Equal(t, nAddrs, uint64(len(addrHours))) + + var sumAddrHours uint64 + for _, h := range addrHours { + sumAddrHours += h + } + + if haveChange { + remainingHours := (inputHours - fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor)) + splitRemainingHours := remainingHours / 2 + require.True(t, changeHours == splitRemainingHours || changeHours == splitRemainingHours+1) + require.Equal(t, splitRemainingHours, sumAddrHours) + } else { + require.Equal(t, uint64(0), changeHours) + require.Equal(t, inputHours-fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor), sumAddrHours) + } + + outputHours := sumAddrHours + changeHours + require.True(t, inputHours >= outputHours) + require.Equal(t, outputHours, totalHours) + + if inputHours != 0 { + err := fee.VerifyTransactionFeeForHours(outputHours, inputHours-outputHours, params.UserVerifyTxn.BurnFactor) + require.NoError(t, err) + } + + // addrHours at the beginning and end of the array should not differ by more than one + max := addrHours[0] + min := addrHours[len(addrHours)-1] + require.True(t, max-min <= 1) + }) + } + } + } + }) + } + + require.True(t, tested, "configured BurnFactor=%d has not been tested", params.UserVerifyTxn.BurnFactor) +} + +type distributeSpendHoursTestCase struct { + name string + inputHours uint64 + nAddrs uint64 + haveChange bool + expectChangeHours uint64 + expectAddrHours []uint64 +} + +var burnFactor2TestCases = []distributeSpendHoursTestCase{ + { + name: "no input hours, one addr, no change", + inputHours: 0, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "no input hours, two addrs, no change", + inputHours: 0, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{0, 0}, + }, + { + name: "no input hours, one addr, change", + inputHours: 0, + nAddrs: 1, + haveChange: true, + expectAddrHours: []uint64{0}, + }, + { + name: "one input hour, one addr, no change", + inputHours: 1, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "two input hours, one addr, no change", + inputHours: 2, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "two input hours, one addr, change", + inputHours: 2, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, change", + inputHours: 3, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, no change", + inputHours: 3, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "three input hours, two addrs, no change", + inputHours: 3, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{1, 0}, + }, + { + name: "four input hours, one addr, no change", + inputHours: 4, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "four input hours, one addr, change", + inputHours: 4, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, two addr, change", + inputHours: 4, + nAddrs: 2, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1, 0}, + }, + { + name: "30 (divided by 2, odd number) input hours, two addr, change", + inputHours: 30, + nAddrs: 2, + haveChange: true, + expectChangeHours: 8, + expectAddrHours: []uint64{4, 3}, + }, + { + name: "33 (odd number) input hours, two addr, change", + inputHours: 33, + nAddrs: 2, + haveChange: true, + expectChangeHours: 8, + expectAddrHours: []uint64{4, 4}, + }, + { + name: "33 (odd number) input hours, three addr, change", + inputHours: 33, + nAddrs: 3, + haveChange: true, + expectChangeHours: 8, + expectAddrHours: []uint64{3, 3, 2}, + }, +} + +var burnFactor3TestCases = []distributeSpendHoursTestCase{ + { + name: "no input hours, one addr, no change", + inputHours: 0, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "no input hours, two addrs, no change", + inputHours: 0, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{0, 0}, + }, + { + name: "no input hours, one addr, change", + inputHours: 0, + nAddrs: 1, + haveChange: true, + expectAddrHours: []uint64{0}, + }, + { + name: "one input hour, one addr, no change", + inputHours: 1, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "two input hours, one addr, no change", + inputHours: 2, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "three input hours, one addr, no change", + inputHours: 3, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "two input hours, one addr, change", + inputHours: 2, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, change", + inputHours: 3, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, change", + inputHours: 4, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, no change", + inputHours: 4, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "four input hours, two addrs, no change", + inputHours: 4, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{1, 1}, + }, + { + name: "five input hours, one addr, no change", + inputHours: 5, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{3}, + }, + { + name: "five input hours, one addr, change", + inputHours: 5, + nAddrs: 1, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1}, + }, + { + name: "five input hours, two addr, change", + inputHours: 5, + nAddrs: 2, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1, 0}, + }, + { + name: "32 input hours, two addr, change", + inputHours: 32, + nAddrs: 2, + haveChange: true, + expectChangeHours: 11, + expectAddrHours: []uint64{5, 5}, + }, + { + name: "35 input hours, two addr, change", + inputHours: 35, + nAddrs: 2, + haveChange: true, + expectChangeHours: 12, + expectAddrHours: []uint64{6, 5}, + }, + { + name: "32 input hours, three addr, change", + inputHours: 32, + nAddrs: 3, + haveChange: true, + expectChangeHours: 11, + expectAddrHours: []uint64{4, 3, 3}, + }, +} + +var burnFactor10TestCases = []distributeSpendHoursTestCase{ + { + name: "no input hours, one addr, no change", + inputHours: 0, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "no input hours, two addrs, no change", + inputHours: 0, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{0, 0}, + }, + { + name: "no input hours, one addr, change", + inputHours: 0, + nAddrs: 1, + haveChange: true, + expectAddrHours: []uint64{0}, + }, + { + name: "one input hour, one addr, no change", + inputHours: 1, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "two input hours, one addr, no change", + inputHours: 2, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "three input hours, one addr, no change", + inputHours: 3, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "two input hours, one addr, change", + inputHours: 2, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, change", + inputHours: 3, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, change", + inputHours: 4, + nAddrs: 1, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, no change", + inputHours: 4, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{3}, + }, + { + name: "four input hours, two addrs, no change", + inputHours: 4, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{2, 1}, + }, + { + name: "five input hours, one addr, no change", + inputHours: 5, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{4}, + }, + { + name: "five input hours, one addr, change", + inputHours: 5, + nAddrs: 1, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{2}, + }, + { + name: "five input hours, two addr, change", + inputHours: 5, + nAddrs: 2, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1, 1}, + }, + { + name: "32 input hours, two addr, change", + inputHours: 32, + nAddrs: 2, + haveChange: true, + expectChangeHours: 14, + expectAddrHours: []uint64{7, 7}, + }, + { + name: "35 input hours, two addr, change", + inputHours: 35, + nAddrs: 2, + haveChange: true, + expectChangeHours: 16, + expectAddrHours: []uint64{8, 7}, + }, + { + name: "32 input hours, three addr, change", + inputHours: 32, + nAddrs: 3, + haveChange: true, + expectChangeHours: 14, + expectAddrHours: []uint64{5, 5, 4}, + }, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/params.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/params.go new file mode 100644 index 00000000..4285e6b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/params.go @@ -0,0 +1,155 @@ +package transaction + +import ( + "errors" + + "github.com/shopspring/decimal" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// Error wraps transaction creation-related errors. +// It wraps errors caused by user input, but not errors caused by programmer input or internal issues. +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} + +const ( + // HoursSelectionTypeManual is used to specify manual hours selection in advanced spend + HoursSelectionTypeManual = "manual" + // HoursSelectionTypeAuto is used to specify automatic hours selection in advanced spend + HoursSelectionTypeAuto = "auto" + + // HoursSelectionModeShare will distribute coin hours equally amongst destinations + HoursSelectionModeShare = "share" +) + +var ( + // ErrNullChangeAddress ChangeAddress must not be the null address + ErrNullChangeAddress = NewError(errors.New("ChangeAddress must not be the null address")) + // ErrMissingReceivers To is required + ErrMissingReceivers = NewError(errors.New("To is required")) + // ErrZeroCoinsReceiver To.Coins must not be zero + ErrZeroCoinsReceiver = NewError(errors.New("To.Coins must not be zero")) + // ErrNullAddressReceiver To.Address must not be the null address + ErrNullAddressReceiver = NewError(errors.New("To.Address must not be the null address")) + // ErrDuplicateReceiver To contains duplicate values + ErrDuplicateReceiver = NewError(errors.New("To contains duplicate values")) + // ErrReceiverZeroHoursAuto To.Hours must be zero for auto type hours selection + ErrReceiverZeroHoursAuto = NewError(errors.New("To.Hours must be zero for auto type hours selection")) + // ErrMissingHoursSelectionModeAuto HoursSelection.Mode is required for auto type hours selection + ErrMissingHoursSelectionModeAuto = NewError(errors.New("HoursSelection.Mode is required for auto type hours selection")) + // ErrInvalidHoursSelelectionMode Invalid HoursSelection.Mode + ErrInvalidHoursSelelectionMode = NewError(errors.New("Invalid HoursSelection.Mode")) + // ErrInvalidHoursSelectionModeManual HoursSelection.Mode cannot be used for manual type hours selection + ErrInvalidHoursSelectionModeManual = NewError(errors.New("HoursSelection.Mode cannot be used for manual type hours selection")) + // ErrInvalidHoursSelectionType Invalid HoursSelection.Type + ErrInvalidHoursSelectionType = NewError(errors.New("Invalid HoursSelection.Type")) + // ErrMissingShareFactor HoursSelection.ShareFactor must be set for share mode + ErrMissingShareFactor = NewError(errors.New("HoursSelection.ShareFactor must be set for share mode")) + // ErrInvalidShareFactor HoursSelection.ShareFactor can only be used for share mode + ErrInvalidShareFactor = NewError(errors.New("HoursSelection.ShareFactor can only be used for share mode")) + // ErrShareFactorOutOfRange HoursSelection.ShareFactor must be >= 0 and <= 1 + ErrShareFactorOutOfRange = NewError(errors.New("HoursSelection.ShareFactor must be >= 0 and <= 1")) +) + +// HoursSelection defines options for hours distribution +type HoursSelection struct { + Type string + Mode string + ShareFactor *decimal.Decimal +} + +// Params defines control parameters for transaction construction +type Params struct { + HoursSelection HoursSelection + To []coin.TransactionOutput + ChangeAddress *cipher.Address +} + +// Validate validates Params +func (c Params) Validate() error { + if c.ChangeAddress != nil && c.ChangeAddress.Null() { + return ErrNullChangeAddress + } + + if len(c.To) == 0 { + return ErrMissingReceivers + } + + for _, to := range c.To { + if to.Coins == 0 { + return ErrZeroCoinsReceiver + } + + if to.Address.Null() { + return ErrNullAddressReceiver + } + } + + // Check for duplicate outputs, a transaction can't have outputs with + // the same (address, coins, hours) + // Auto mode would distribute hours to the outputs and could hypothetically + // avoid assigning duplicate hours in many cases, but the complexity for doing + // so is very high, so also reject duplicate (address, coins) for auto mode. + outputs := make(map[coin.TransactionOutput]struct{}, len(c.To)) + for _, to := range c.To { + outputs[to] = struct{}{} + } + + if len(outputs) != len(c.To) { + return ErrDuplicateReceiver + } + + switch c.HoursSelection.Type { + case HoursSelectionTypeAuto: + for _, to := range c.To { + if to.Hours != 0 { + return ErrReceiverZeroHoursAuto + } + } + + switch c.HoursSelection.Mode { + case HoursSelectionModeShare: + case "": + return ErrMissingHoursSelectionModeAuto + default: + return ErrInvalidHoursSelelectionMode + } + + case HoursSelectionTypeManual: + if c.HoursSelection.Mode != "" { + return ErrInvalidHoursSelectionModeManual + } + + default: + return ErrInvalidHoursSelectionType + } + + if c.HoursSelection.ShareFactor == nil { + if c.HoursSelection.Mode == HoursSelectionModeShare { + return ErrMissingShareFactor + } + } else { + if c.HoursSelection.Mode != HoursSelectionModeShare { + return ErrInvalidShareFactor + } + + zero := decimal.New(0, 0) + one := decimal.New(1, 0) + if c.HoursSelection.ShareFactor.LessThan(zero) || c.HoursSelection.ShareFactor.GreaterThan(one) { + return ErrShareFactorOutOfRange + } + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/params_test.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/params_test.go new file mode 100644 index 00000000..bf5d7f56 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/params_test.go @@ -0,0 +1,285 @@ +package transaction + +import ( + "errors" + "testing" + + "github.com/shopspring/decimal" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestCreateWalletParamsVerify(t *testing.T) { + changeAddress := testutil.MakeAddress() + + toManual := []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 1, + }, + { + Address: testutil.MakeAddress(), + Coins: 5e6, + Hours: 0, + }, + } + + toAuto := []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + }, + { + Address: testutil.MakeAddress(), + Coins: 5e6, + }, + } + + one := decimal.New(1, 0) + negativeOne := decimal.New(-1, 0) + onePointOne := decimal.New(11, -1) + pointOneOne := decimal.New(11, -2) + + cases := []struct { + name string + params Params + err string + }{ + { + name: "null change address", + params: Params{ + ChangeAddress: &cipher.Address{}, + }, + err: "ChangeAddress must not be the null address", + }, + + { + name: "no to destinations", + params: Params{ + ChangeAddress: &changeAddress, + }, + err: "To is required", + }, + + { + name: "missing to coins", + params: Params{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Hours: 1, + }, + }, + }, + err: "To.Coins must not be zero", + }, + + { + name: "missing to address", + params: Params{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Coins: 5, + Hours: 1, + }, + }, + }, + err: "To.Address must not be the null address", + }, + + { + name: "nonzero to hours for auto selection", + params: Params{ + ChangeAddress: &changeAddress, + To: toManual, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + }, + }, + err: "To.Hours must be zero for auto type hours selection", + }, + + { + name: "mode missing for auto selection", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + }, + }, + err: "HoursSelection.Mode is required for auto type hours selection", + }, + + { + name: "mode set for manual selection", + params: Params{ + ChangeAddress: &changeAddress, + To: toManual, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + Mode: HoursSelectionModeShare, + }, + }, + err: "HoursSelection.Mode cannot be used for manual type hours selection", + }, + + { + name: "missing hours selection type", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: "", + }, + }, + err: "Invalid HoursSelection.Type", + }, + + { + name: "invalid hours selection type", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: "invalid", + }, + }, + err: "Invalid HoursSelection.Type", + }, + + { + name: "invalid hours selection mode", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: "invalid", + }, + }, + err: "Invalid HoursSelection.Mode", + }, + + { + name: "share factor not set for split even mode", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + }, + }, + err: "HoursSelection.ShareFactor must be set for share mode", + }, + + { + name: "share factor set but not split even mode", + params: Params{ + ChangeAddress: &changeAddress, + To: toManual, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + ShareFactor: &one, + }, + }, + err: "HoursSelection.ShareFactor can only be used for share mode", + }, + + { + name: "share factor less than 0", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &negativeOne, + }, + }, + err: "HoursSelection.ShareFactor must be >= 0 and <= 1", + }, + + { + name: "share factor greater than 1", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &onePointOne, + }, + }, + err: "HoursSelection.ShareFactor must be >= 0 and <= 1", + }, + + { + name: "duplicate output when manual", + params: Params{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{toManual[0], toManual[0]}, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + err: "To contains duplicate values", + }, + + { + name: "duplicate output when auto", + params: Params{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{toAuto[0], toAuto[0]}, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &pointOneOne, + }, + }, + err: "To contains duplicate values", + }, + + { + name: "valid auto split even share factor", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &pointOneOne, + }, + }, + }, + + { + name: "valid manual", + params: Params{ + ChangeAddress: &changeAddress, + To: toManual, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := tc.params.Validate() + if tc.err != "" { + require.Equal(t, NewError(errors.New(tc.err)), err, err.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/apputil/apputil.go b/vendor/github.com/SkycoinProject/skycoin/src/util/apputil/apputil.go new file mode 100644 index 00000000..caf088dd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/apputil/apputil.go @@ -0,0 +1,56 @@ +/* +Package apputil provides utility methods for cmd applications +*/ +package apputil + +import ( + "fmt" + "os" + "os/signal" + "runtime/pprof" + "syscall" +) + +// CatchInterrupt catches CTRL-C and closes the quit channel if it occurs. +// If CTRL-C is called again, the program stack is dumped and the process panics, +// so that shutdown hangs can be diagnosed. +func CatchInterrupt(quit chan<- struct{}) { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + close(quit) + + // If ctrl-c is called again, panic so that the program state can be examined. + // Ctrl-c would be called again if program shutdown was stuck. + go CatchInterruptPanic() +} + +// CatchInterruptPanic catches os.Interrupt and panics +func CatchInterruptPanic() { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + PrintProgramStatus() + panic("SIGINT") +} + +// CatchDebug catches SIGUSR1 and prints internal program state +func CatchDebug() { + sigchan := make(chan os.Signal, 1) + //signal.Notify(sigchan, syscall.SIGUSR1) + signal.Notify(sigchan, syscall.Signal(0xa)) // SIGUSR1 = Signal(0xa) + for range sigchan { + PrintProgramStatus() + } +} + +// PrintProgramStatus prints all goroutine data to stdout +func PrintProgramStatus() { + p := pprof.Lookup("goroutine") + if err := p.WriteTo(os.Stdout, 2); err != nil { + fmt.Println("ERROR:", err) + return + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/LICENSE b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/LICENSE new file mode 100644 index 00000000..a7b7560c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2013-2015 The btcsuite developers + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert.go b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert.go new file mode 100644 index 00000000..b1e7cb23 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert.go @@ -0,0 +1,150 @@ +// Copyright (c) 2013-2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. +// Any modifications (c) 2018 Skycoin developers + +package certutil + +import ( + "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + _ "crypto/sha512" // Needed for RegisterHash in init + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "errors" + "fmt" + "math/big" + "net" + "os" + "time" + + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var logger = logging.MustGetLogger("certutil") + +// NewTLSCertPair returns a new PEM-encoded x.509 certificate pair +// based on a 521-bit ECDSA private key. The machine's local interface +// addresses and all variants of IPv4 and IPv6 localhost are included as +// valid IP addresses. +func NewTLSCertPair(organization string, validUntil time.Time, extraHosts []string) (cert, key []byte, err error) { + now := time.Now() + if validUntil.Before(now) { + return nil, nil, errors.New("validUntil would create an already-expired certificate") + } + + priv, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader) + if err != nil { + return nil, nil, err + } + + // end of ASN.1 time + endOfTime := time.Date(2049, 12, 31, 23, 59, 59, 0, time.UTC) + if validUntil.After(endOfTime) { + validUntil = endOfTime + } + + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + return nil, nil, fmt.Errorf("failed to generate serial number: %s", err) + } + + host, err := os.Hostname() + if err != nil { + return nil, nil, err + } + + ipAddresses := []net.IP{net.ParseIP("127.0.0.1"), net.ParseIP("::1")} + dnsNames := []string{host} + if host != "localhost" { + dnsNames = append(dnsNames, "localhost") + } + + addIP := func(ipAddr net.IP) { + for _, ip := range ipAddresses { + if net.IP.Equal(ip, ipAddr) { + return + } + } + ipAddresses = append(ipAddresses, ipAddr) + } + addHost := func(host string) { + for _, dnsName := range dnsNames { + if host == dnsName { + return + } + } + dnsNames = append(dnsNames, host) + } + + addrs, err := net.InterfaceAddrs() + if err != nil { + // net.InterfaceAddrs will fail on some systems - ignore if this happens + logger.WithError(err).Error("NewTLSCertPair: net.InterfaceAddrs failed") + } + for _, a := range addrs { + ipAddr, _, err := net.ParseCIDR(a.String()) + if err == nil { + addIP(ipAddr) + } + } + + for _, hostStr := range extraHosts { + host, _, err := net.SplitHostPort(hostStr) + if err != nil { + host = hostStr + } + if ip := net.ParseIP(host); ip != nil { + addIP(ip) + } else { + addHost(host) + } + } + + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{ + Organization: []string{organization}, + CommonName: host, + }, + NotBefore: now.Add(-time.Hour * 24), + NotAfter: validUntil, + + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | + x509.KeyUsageCertSign, + IsCA: true, // so can sign self. + BasicConstraintsValid: true, + + DNSNames: dnsNames, + IPAddresses: ipAddresses, + } + + derBytes, err := x509.CreateCertificate(rand.Reader, &template, + &template, &priv.PublicKey, priv) + if err != nil { + return nil, nil, fmt.Errorf("failed to create certificate: %v", err) + } + + certBuf := &bytes.Buffer{} + err = pem.Encode(certBuf, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) + if err != nil { + return nil, nil, fmt.Errorf("failed to encode certificate: %v", err) + } + + keybytes, err := x509.MarshalECPrivateKey(priv) + if err != nil { + return nil, nil, fmt.Errorf("failed to marshal private key: %v", err) + } + + keyBuf := &bytes.Buffer{} + err = pem.Encode(keyBuf, &pem.Block{Type: "EC PRIVATE KEY", Bytes: keybytes}) + if err != nil { + return nil, nil, fmt.Errorf("failed to encode private key: %v", err) + } + + return certBuf.Bytes(), keyBuf.Bytes(), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert_test.go new file mode 100644 index 00000000..9a7a715e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert_test.go @@ -0,0 +1,121 @@ +// Copyright (c) 2013-2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. +// Any modifications (c) 2018 Skycoin developers + +package certutil + +import ( + "crypto/x509" + "encoding/pem" + "net" + "testing" + "time" +) + +// TestNewTLSCertPair ensures the NewTLSCertPair function works as expected. +func TestNewTLSCertPair(t *testing.T) { + // Certs don't support sub-second precision, so truncate it now to + // ensure the checks later don't fail due to nanosecond precision + // differences. + validUntil := time.Unix(time.Now().Add(10*365*24*time.Hour).Unix(), 0) + org := "test autogenerated cert" + extraHosts := []string{"testtlscert.bogus", "localhost", "127.0.0.1"} + cert, key, err := NewTLSCertPair(org, validUntil, extraHosts) + if err != nil { + t.Fatalf("failed with unexpected error: %v", err) + } + + // Ensure the PEM-encoded cert that is returned can be decoded. + pemCert, _ := pem.Decode(cert) + if pemCert == nil { + t.Fatalf("pem.Decode was unable to decode the certificate") + } + + // Ensure the PEM-encoded key that is returned can be decoded. + pemKey, _ := pem.Decode(key) + if pemCert == nil { + t.Fatalf("pem.Decode was unable to decode the key") + } + + // Ensure the DER-encoded key bytes can be successfully parsed. + _, err = x509.ParseECPrivateKey(pemKey.Bytes) + if err != nil { + t.Fatalf("failed with unexpected error: %v", err) + } + + // Ensure the DER-encoded cert bytes can be successfully into an X.509 + // certificate. + x509Cert, err := x509.ParseCertificate(pemCert.Bytes) + if err != nil { + t.Fatalf("failed with unexpected error: %v", err) + } + + // Ensure the specified organization is correct. + x509Orgs := x509Cert.Subject.Organization + if len(x509Orgs) == 0 || x509Orgs[0] != org { + x509Org := "" + if len(x509Orgs) > 0 { + x509Org = x509Orgs[0] + } + t.Fatalf("generated cert organization field mismatch, got "+ + "'%v', want '%v'", x509Org, org) + } + + // Ensure the specified valid until value is correct. + if !x509Cert.NotAfter.Equal(validUntil) { + t.Fatalf("generated cert valid until field mismatch, got %v, "+ + "want %v", x509Cert.NotAfter, validUntil) + } + + // Ensure the specified extra hosts are present. + for _, host := range extraHosts { + if err := x509Cert.VerifyHostname(host); err != nil { + t.Fatalf("failed to verify extra host '%s'", host) + } + } + + // Ensure that the Common Name is also the first SAN DNS name. + cn := x509Cert.Subject.CommonName + san0 := x509Cert.DNSNames[0] + if cn != san0 { + t.Errorf("common name %s does not match first SAN %s", cn, san0) + } + + // Ensure there are no duplicate hosts or IPs. + hostCounts := make(map[string]int) + for _, host := range x509Cert.DNSNames { + hostCounts[host]++ + } + ipCounts := make(map[string]int) + for _, ip := range x509Cert.IPAddresses { + ipCounts[string(ip)]++ + } + for host, count := range hostCounts { + if count != 1 { + t.Errorf("host %s appears %d times in certificate", host, count) + } + } + for ipStr, count := range ipCounts { + if count != 1 { + t.Errorf("ip %s appears %d times in certificate", net.IP(ipStr), count) + } + } + + // Ensure the cert can be use for the intended purposes. + if !x509Cert.IsCA { + t.Fatal("generated cert is not a certificate authority") + } + if x509Cert.KeyUsage&x509.KeyUsageKeyEncipherment == 0 { + t.Fatal("generated cert can't be used for key encipherment") + } + if x509Cert.KeyUsage&x509.KeyUsageDigitalSignature == 0 { + t.Fatal("generated cert can't be used for digital signatures") + } + if x509Cert.KeyUsage&x509.KeyUsageCertSign == 0 { + t.Fatal("generated cert can't be used for signing other certs") + } + if !x509Cert.BasicConstraintsValid { + t.Fatal("generated cert does not have valid basic constraints") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet.go b/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet.go new file mode 100644 index 00000000..f690d144 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet.go @@ -0,0 +1,95 @@ +/* +Package droplet provides methods for handling droplet integers and string. + +A droplet is the smallest possible coin amount in Skycoin, equal to 1/1000000 of a whole skycoin. +*/ +package droplet + +import ( + "errors" + "math" + + "github.com/shopspring/decimal" + + logging "github.com/SkycoinProject/skycoin/src/util/logging" +) + +const ( + // Exponent is the number of decimal places held by droplets + Exponent = 6 + // Multiplier is how much to multiply coins by to get droplets + Multiplier = 1e6 +) + +var ( + // ErrNegativeValue is returned if a balance string is a negative number + ErrNegativeValue = errors.New("Droplet string conversion failed: Negative balance") + // ErrTooManyDecimals is returned if a balance string has more than 6 decimal places + ErrTooManyDecimals = errors.New("Droplet string conversion failed: Too many decimal places") + // ErrTooLarge is returned if a balance string is greater than math.MaxInt64 + ErrTooLarge = errors.New("Droplet string conversion failed: Value is too large") + + logger = logging.MustGetLogger("convert") + maxDecimal decimal.Decimal +) + +func init() { + maxInt64 := "9223372036854775807" + max, err := decimal.NewFromString(maxInt64) + if err != nil { + panic(err) + } + + maxDecimal = max +} + +// FromString converts a skycoin balance string with decimal places to uint64 droplets. +// For example, "123.000456" becomes 123000456 +func FromString(b string) (uint64, error) { + d, err := decimal.NewFromString(b) + if err != nil { + return 0, err + } + + // Values must be zero or positive + if d.Sign() == -1 { + return 0, ErrNegativeValue + } + + // Skycoins have a maximum of 6 decimal places + if d.Exponent() < -Exponent { + return 0, ErrTooManyDecimals + } + + // Multiply the coin balance by 1e6 to obtain droplets amount + e := d.Shift(Exponent) + + // Check that there are no decimal places remaining. This error should not + // occur, because of the earlier check of Exponent() + if e.Exponent() < 0 { + logger.Critical().Errorf("Balance still has decimals after converting to droplets: %s", b) + return 0, ErrTooManyDecimals + } + + // Values greater than math.MaxInt64 will overflow after conversion to int64 + // using decimal.IntPart() + if e.GreaterThan(maxDecimal) { + return 0, ErrTooLarge + } + + return uint64(e.IntPart()), nil +} + +// ToString converts droplets to a skycoin balance fixed-point decimal string. +// String will always have a decimal precision of droplet.Exponent (6). +// For example, 123000456 becomes "123.000456" and +// 123000000 becomes "123.000000". +func ToString(n uint64) (string, error) { + if n > math.MaxInt64 { + return "", ErrTooLarge + } + + d := decimal.New(int64(n), -Exponent) + + return d.StringFixed(Exponent), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet_test.go new file mode 100644 index 00000000..332f72f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet_test.go @@ -0,0 +1,298 @@ +package droplet + +import ( + "errors" + "fmt" + "math/rand" + "regexp" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +func TestFromString(t *testing.T) { + t.Parallel() + + cases := []struct { + s string + n uint64 + e error + }{ + { + s: "100000000.000000", + n: 1e8 * 1e6, + }, + { + s: "0", + n: 0, + }, + { + s: "0.", + n: 0, + }, + { + s: "0.0", + n: 0, + }, + { + s: "0.000000", + n: 0, + }, + { + s: "0.0000000", + n: 0, + }, + { + s: "0.0000001", + e: ErrTooManyDecimals, + }, + { + s: "0.000001", + n: 1, + }, + { + s: "0.0000010", + n: 1, + }, + { + s: "1", + n: 1e6, + }, + { + s: "1.000001", + n: 1e6 + 1, + }, + { + s: "-1", + e: ErrNegativeValue, + }, + { + s: "10000", + n: 1e4 * 1e6, + }, + { + s: "123456789.123456", + n: 123456789123456, + }, + { + s: "123.000456", + n: 123000456, + }, + { + s: "100SKY", + e: errors.New("can't convert 100SKY to decimal"), + }, + { + s: "", + e: errors.New("can't convert to decimal"), + }, + { + s: "999999999999999999999999999999999999999999", + e: ErrTooLarge, + }, + { + s: "9223372036854.775807", + n: 9223372036854775807, + }, + { + s: "-9223372036854.775807", + e: ErrNegativeValue, + }, + { + s: "9223372036854775808", + e: ErrTooLarge, + }, + { + s: "9223372036854775807.000001", + e: ErrTooLarge, + }, + { + s: "9223372036854775807", + e: ErrTooLarge, + }, + { + s: "9223372036854775806.000001", + e: ErrTooLarge, + }, + { + s: "1.1", + n: 1e6 + 1e5, + }, + { + s: "1.01", + n: 1e6 + 1e4, + }, + { + s: "1.001", + n: 1e6 + 1e3, + }, + { + s: "1.0001", + n: 1e6 + 1e2, + }, + { + s: "1.00001", + n: 1e6 + 1e1, + }, + { + s: "1.000001", + n: 1e6 + 1e0, + }, + { + s: "1.0000001", + e: ErrTooManyDecimals, + }, + { + s: "1.0000000", // 7 decimal places, but they are 0s + n: 1e6, + }, + { + s: "1.000001000", + n: 1e6 + 1e0, + }, + } + + for _, tcc := range cases { + tc := tcc + t.Run(tc.s, func(t *testing.T) { + t.Parallel() + + n, err := FromString(tc.s) + + if tc.e == nil { + require.NoError(t, err) + require.Equal(t, tc.n, n, "result: %d", n) + } else { + require.Error(t, err) + require.Equal(t, tc.e, err) + require.Equal(t, uint64(0), n, "result: %d", n) + } + }) + } +} + +func TestToString(t *testing.T) { + t.Parallel() + + cases := []struct { + n uint64 + s string + e error + }{ + { + n: 0, + s: "0.000000", + }, + { + n: 1, + s: "0.000001", + }, + { + n: 1e6, + s: "1.000000", + }, + { + n: 100100, + s: "0.100100", + }, + { + n: 1001000, + s: "1.001000", + }, + { + n: 999, + s: "0.000999", + }, + { + n: 999000000, + s: "999.000000", + }, + { + n: 123000456, + s: "123.000456", + }, + { + n: 1e8 * 1e6, + s: "100000000.000000", + }, + { + n: 9223372036854775808, + e: ErrTooLarge, + }, + } + + for _, tcc := range cases { + tc := tcc + t.Run(tc.s, func(t *testing.T) { + t.Parallel() + + s, err := ToString(tc.n) + + if tc.e == nil { + require.NoError(t, err) + require.Equal(t, tc.s, s) + } else { + require.Error(t, err) + require.Equal(t, tc.e, err) + require.Equal(t, "", s) + } + }) + } +} + +func TestToFromStringFuzz(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode") + } + + t.Parallel() + + verify := func(t *testing.T, x uint64, exp *regexp.Regexp) { + s, err := ToString(x) + require.NoError(t, err) + + n, err := FromString(s) + require.NoError(t, err) + + require.Equal(t, x, n) + + require.True(t, exp.MatchString(s), "%d -> %q", x, s) + } + + decRe := regexp.MustCompile(`^0\.[0-9]{6}$`) + // Check every possible value <1 whole coin + for i := uint64(0); i < uint64(1e6); i++ { + j := i + t.Run(fmt.Sprint(j), func(t *testing.T) { + verify(t, j, decRe) + }) + } + + // Check random values >=1 + nRand := int(1e5) + fullRe := regexp.MustCompile(`^[1-9][0-9]{0,8}\.[0-9]{6}$`) + for i := 0; i < nRand; i++ { + x := (rand.Uint64() % ((1e8 * 1e6) - 1e6 + 1)) + 1e6 // [1e6, 1e8*1e6] + t.Run(fmt.Sprint(x), func(t *testing.T) { + verify(t, x, fullRe) + }) + } + + // Check random values >=1 and with no droplets + wholeRe := regexp.MustCompile(`^[1-9][0-9]{0,8}\.0{6}$`) + for i := 0; i < nRand; i++ { + x := (rand.Uint64() % 1e8) + 1 // [1, 1e8] + x = x * 1e6 + t.Run(fmt.Sprint(x), func(t *testing.T) { + verify(t, x, wholeRe) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/elapse/elapser.go b/vendor/github.com/SkycoinProject/skycoin/src/util/elapse/elapser.go new file mode 100644 index 00000000..2f692f35 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/elapse/elapser.go @@ -0,0 +1,72 @@ +/* +Package elapse provides time measuring instruments +*/ +package elapse + +import ( + "time" + + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// Elapser measures time elapsed for an operation. It is not thread-safe, use a different elapser per thread. +type Elapser struct { + name *string + startTime time.Time + elapsedThreshold time.Duration + Done chan bool + logger *logging.Logger +} + +// NewElapser creates an Elapser +func NewElapser(elapsedThreshold time.Duration, logger *logging.Logger) *Elapser { + elapser := &Elapser{ + elapsedThreshold: elapsedThreshold, + Done: make(chan bool, 100), + logger: logger, + } + return elapser +} + +// CheckForDone checks if the elapser has triggered and records the elapsed time +func (e *Elapser) CheckForDone() { + select { + case <-e.Done: + e.Elapsed() + default: + } +} + +// Register begins an operation to measure +func (e *Elapser) Register(name string) { + e.CheckForDone() + e.name = &name + e.startTime = time.Now() + e.Done <- true +} + +// ShowCurrentTime logs the elapsed time so far +func (e *Elapser) ShowCurrentTime(step string) { + stopTime := time.Now() + if e.name == nil { + e.logger.Warning("no registered events for elapsing, but found Elapser.ShowCurrentTime calling") + return + } + elapsed := stopTime.Sub(e.startTime) + e.logger.Infof("%s[%s] elapsed %s", *e.name, step, elapsed) + +} + +// Elapsed stops measuring an operation and logs the elapsed time if it exceeds the configured threshold +func (e *Elapser) Elapsed() { + stopTime := time.Now() + if e.name == nil { + e.logger.Warning("no registered events for elapsing, but found Elapser.Elapsed calling") + return + } + elapsed := stopTime.Sub(e.startTime) + if elapsed >= e.elapsedThreshold { + e.logger.Warningf("%s elapsed %s", *e.name, elapsed) + } + e.name = nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee.go b/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee.go new file mode 100644 index 00000000..3d268739 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee.go @@ -0,0 +1,99 @@ +/* +Package fee provides methods to calculate and verify transaction fees +*/ +package fee + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +var ( + // ErrTxnNoFee is returned if a transaction has no coinhour fee + ErrTxnNoFee = errors.New("Transaction has zero coinhour fee") + + // ErrTxnInsufficientFee is returned if a transaction's coinhour burn fee is not enough + ErrTxnInsufficientFee = errors.New("Transaction coinhour fee minimum not met") + + // ErrTxnInsufficientCoinHours is returned if a transaction has more coinhours in its outputs than its inputs + ErrTxnInsufficientCoinHours = errors.New("Insufficient coinhours for transaction outputs") +) + +// VerifyTransactionFee performs additional transaction verification at the unconfirmed pool level. +// This checks tunable params that should prevent the transaction from +// entering the blockchain, but cannot be done at the blockchain level because +// they may be changed. +func VerifyTransactionFee(t *coin.Transaction, fee uint64, burnFactor uint32) error { + hours, err := t.OutputHours() + if err != nil { + return err + } + return VerifyTransactionFeeForHours(hours, fee, burnFactor) +} + +// VerifyTransactionFeeForHours verifies the fee given fee and hours, +// where hours is the number of hours in a transaction's outputs, +// and hours+fee is the number of hours in a transaction's inputs +func VerifyTransactionFeeForHours(hours, fee uint64, burnFactor uint32) error { + // Require non-zero coinhour fee + if fee == 0 { + return ErrTxnNoFee + } + + // Calculate total number of coinhours + total, err := mathutil.AddUint64(hours, fee) + if err != nil { + return errors.New("Hours and fee overflow") + } + + // Calculate the required fee + requiredFee := RequiredFee(total, burnFactor) + + // Ensure that the required fee is met + if fee < requiredFee { + return ErrTxnInsufficientFee + } + + return nil +} + +// RequiredFee returns the coinhours fee required for an amount of hours +// The required fee is calculated as hours/burnFactor, rounded up. +func RequiredFee(hours uint64, burnFactor uint32) uint64 { + feeHours := hours / uint64(burnFactor) + if hours%uint64(burnFactor) != 0 { + feeHours++ + } + + return feeHours +} + +// RemainingHours returns the amount of coinhours leftover after paying the fee for the input. +func RemainingHours(hours uint64, burnFactor uint32) uint64 { + fee := RequiredFee(hours, burnFactor) + return hours - fee +} + +// TransactionFee calculates the current transaction fee in coinhours of a Transaction. +// Returns ErrTxnInsufficientCoinHours if input hours is less than output hours. +func TransactionFee(tx *coin.Transaction, headTime uint64, inUxs coin.UxArray) (uint64, error) { + // Compute input hours + inHours, err := inUxs.CoinHours(headTime) + if err != nil { + return 0, err + } + + // Compute output hours + outHours, err := tx.OutputHours() + if err != nil { + return 0, err + } + + if inHours < outHours { + return 0, ErrTxnInsufficientCoinHours + } + + return inHours - outHours, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee_test.go new file mode 100644 index 00000000..0e08697e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee_test.go @@ -0,0 +1,390 @@ +package fee + +import ( + "errors" + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +type verifyTxnFeeTestCase struct { + inputHours uint64 + outputHours uint64 + err error +} + +var burnFactor2VerifyTxnFeeTestCases = []verifyTxnFeeTestCase{ + {0, 0, ErrTxnNoFee}, + {1, 0, nil}, + {1, 1, ErrTxnNoFee}, + {2, 0, nil}, + {2, 1, nil}, + {2, 2, ErrTxnNoFee}, + {3, 0, nil}, + {3, 1, nil}, + {3, 2, ErrTxnInsufficientFee}, + {3, 3, ErrTxnNoFee}, + {4, 0, nil}, + {4, 1, nil}, + {4, 2, nil}, + {4, 3, ErrTxnInsufficientFee}, + {4, 4, ErrTxnNoFee}, +} + +var burnFactor3VerifyTxnFeeTestCases = []verifyTxnFeeTestCase{ + {0, 0, ErrTxnNoFee}, + {1, 0, nil}, + {1, 1, ErrTxnNoFee}, + {2, 0, nil}, + {2, 1, nil}, + {2, 2, ErrTxnNoFee}, + {3, 0, nil}, + {3, 1, nil}, + {3, 2, nil}, + {3, 3, ErrTxnNoFee}, + {4, 0, nil}, + {4, 1, nil}, + {4, 2, nil}, + {4, 3, ErrTxnInsufficientFee}, + {4, 4, ErrTxnNoFee}, + {5, 0, nil}, + {5, 1, nil}, + {5, 2, nil}, + {5, 3, nil}, + {5, 4, ErrTxnInsufficientFee}, + {5, 5, ErrTxnNoFee}, +} + +var burnFactor10VerifyTxnFeeTestCases = []verifyTxnFeeTestCase{ + {0, 0, ErrTxnNoFee}, + {1, 0, nil}, + {1, 1, ErrTxnNoFee}, + {2, 0, nil}, + {2, 1, nil}, + {2, 2, ErrTxnNoFee}, + {3, 0, nil}, + {3, 1, nil}, + {3, 2, nil}, + {3, 3, ErrTxnNoFee}, + {4, 0, nil}, + {4, 1, nil}, + {4, 2, nil}, + {4, 3, nil}, + {4, 4, ErrTxnNoFee}, + {5, 0, nil}, + {5, 1, nil}, + {5, 2, nil}, + {5, 3, nil}, + {5, 4, nil}, + {5, 5, ErrTxnNoFee}, + {9, 8, nil}, + {9, 9, ErrTxnNoFee}, + {10, 5, nil}, + {10, 9, nil}, + {10, 10, ErrTxnNoFee}, + {11, 9, nil}, + {11, 10, ErrTxnInsufficientFee}, + {11, 11, ErrTxnNoFee}, + {19, 17, nil}, + {19, 18, ErrTxnInsufficientFee}, + {19, 19, ErrTxnNoFee}, + {20, 18, nil}, + {20, 19, ErrTxnInsufficientFee}, + {20, 20, ErrTxnNoFee}, +} + +func TestVerifyTransactionFee(t *testing.T) { + emptyTxn := &coin.Transaction{} + hours, err := emptyTxn.OutputHours() + require.NoError(t, err) + require.Equal(t, uint64(0), hours) + + // A txn with no outputs hours and no coinhours burn fee is valid + err = VerifyTransactionFee(emptyTxn, 0, 2) + testutil.RequireError(t, err, ErrTxnNoFee.Error()) + + // A txn with no outputs hours but with a coinhours burn fee is valid + err = VerifyTransactionFee(emptyTxn, 100, 2) + require.NoError(t, err) + + txn := &coin.Transaction{} + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: 1e6, + }) + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: 3e6, + }) + + hours, err = txn.OutputHours() + require.NoError(t, err) + require.Equal(t, uint64(4e6), hours) + + // A txn with insufficient net coinhours burn fee is invalid + err = VerifyTransactionFee(txn, 0, 2) + testutil.RequireError(t, err, ErrTxnNoFee.Error()) + + err = VerifyTransactionFee(txn, 1, 2) + testutil.RequireError(t, err, ErrTxnInsufficientFee.Error()) + + // A txn with sufficient net coinhours burn fee is valid + hours, err = txn.OutputHours() + require.NoError(t, err) + err = VerifyTransactionFee(txn, hours, 2) + require.NoError(t, err) + hours, err = txn.OutputHours() + require.NoError(t, err) + err = VerifyTransactionFee(txn, hours*10, 2) + require.NoError(t, err) + + // fee + hours overflows + err = VerifyTransactionFee(txn, math.MaxUint64-3e6, 2) + testutil.RequireError(t, err, "Hours and fee overflow") + + // txn has overflowing output hours + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: math.MaxUint64 - 1e6 - 3e6 + 1, + }) + err = VerifyTransactionFee(txn, 10, 2) + testutil.RequireError(t, err, "Transaction output hours overflow") + + cases := []struct { + burnFactor uint32 + cases []verifyTxnFeeTestCase + }{ + {2, burnFactor2VerifyTxnFeeTestCases}, + {3, burnFactor3VerifyTxnFeeTestCases}, + {10, burnFactor10VerifyTxnFeeTestCases}, + } + + tested := false + for _, tcc := range cases { + if tcc.burnFactor == params.UserVerifyTxn.BurnFactor { + tested = true + } + + for _, tc := range tcc.cases { + name := fmt.Sprintf("burnFactor=%d input=%d output=%d", tcc.burnFactor, tc.inputHours, tc.outputHours) + t.Run(name, func(t *testing.T) { + txn := &coin.Transaction{} + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: tc.outputHours, + }) + + require.True(t, tc.inputHours >= tc.outputHours) + err := VerifyTransactionFee(txn, tc.inputHours-tc.outputHours, tcc.burnFactor) + require.Equal(t, tc.err, err) + }) + } + } + + require.True(t, tested, "configured params.UserVerifyTxn.BurnFactor=%d has not been tested", params.UserVerifyTxn.BurnFactor) +} + +type requiredFeeTestCase struct { + hours uint64 + fee uint64 +} + +var burnFactor2RequiredFeeTestCases = []requiredFeeTestCase{ + {0, 0}, + {1, 1}, + {2, 1}, + {3, 2}, + {4, 2}, + {5, 3}, + {6, 3}, + {7, 4}, + {998, 499}, + {999, 500}, + {1000, 500}, + {1001, 501}, +} + +var burnFactor3RequiredFeeTestCases = []requiredFeeTestCase{ + {0, 0}, + {1, 1}, + {2, 1}, + {3, 1}, + {4, 2}, + {5, 2}, + {6, 2}, + {7, 3}, + {999, 333}, + {1000, 334}, + {1001, 334}, + {1002, 334}, + {1003, 335}, +} + +var burnFactor10RequiredFeeTestCases = []requiredFeeTestCase{ + {0, 0}, + {1, 1}, + {2, 1}, + {3, 1}, + {4, 1}, + {5, 1}, + {6, 1}, + {7, 1}, + {8, 1}, + {9, 1}, + {10, 1}, + {11, 2}, + {19, 2}, + {20, 2}, + {21, 3}, + {999, 100}, + {1000, 100}, + {1001, 101}, + {1002, 101}, + {1003, 101}, +} + +func TestRequiredFee(t *testing.T) { + cases := []struct { + burnFactor uint32 + cases []requiredFeeTestCase + }{ + {2, burnFactor2RequiredFeeTestCases}, + {3, burnFactor3RequiredFeeTestCases}, + {10, burnFactor10RequiredFeeTestCases}, + } + + tested := false + for _, tcc := range cases { + if tcc.burnFactor == params.UserVerifyTxn.BurnFactor { + tested = true + } + + for _, tc := range tcc.cases { + name := fmt.Sprintf("burnFactor=%d hours=%d fee=%d", tcc.burnFactor, tc.hours, tc.fee) + t.Run(name, func(t *testing.T) { + fee := RequiredFee(tc.hours, tcc.burnFactor) + require.Equal(t, tc.fee, fee) + + remainingHours := RemainingHours(tc.hours, tcc.burnFactor) + require.Equal(t, tc.hours-fee, remainingHours) + }) + } + } + + require.True(t, tested, "configured params.UserVerifyTxn.BurnFactor=%d has not been tested", params.UserVerifyTxn.BurnFactor) +} + +func TestTransactionFee(t *testing.T) { + var headTime uint64 = 1000 + nextTime := headTime + 3600 // 1 hour later + + type uxInput struct { + time uint64 + coins uint64 + hours uint64 + } + + cases := []struct { + out []uint64 + in []uxInput + headTime uint64 + fee uint64 + err error + }{ + // Test case with one output, one input + { + fee: 5, + out: []uint64{5}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + }, + headTime: headTime, + }, + + // Test case with multiple outputs, multiple inputs + { + fee: 0, + out: []uint64{5, 7, 3}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 10e6, hours: 5}, + }, + headTime: headTime, + }, + + // Test case with multiple outputs, multiple inputs, and some inputs have more CoinHours once adjusted for HeadTime + { + fee: 8, + out: []uint64{5, 10}, + in: []uxInput{ + {time: nextTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 8e6, hours: 5}, + }, + headTime: nextTime, + }, + + // Test case with insufficient coin hours + { + err: ErrTxnInsufficientCoinHours, + out: []uint64{5, 10, 1}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 8e6, hours: 5}, + }, + headTime: headTime, + }, + + // Test case with overflowing input hours + { + err: errors.New("UxArray.CoinHours addition overflow"), + out: []uint64{0}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 10e6, hours: math.MaxUint64 - 9}, + }, + headTime: headTime, + }, + + // Test case with overflowing output hours + { + err: errors.New("Transaction output hours overflow"), + out: []uint64{0, 10, math.MaxUint64 - 9}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 10e6, hours: 100}, + }, + headTime: headTime, + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("fee=%d headTime=%d", tc.fee, tc.headTime) + t.Run(name, func(t *testing.T) { + tx := &coin.Transaction{} + for _, h := range tc.out { + tx.Out = append(tx.Out, coin.TransactionOutput{ + Hours: h, + }) + } + + inUxs := make(coin.UxArray, len(tc.in)) + for i, b := range tc.in { + inUxs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: b.time, + }, + Body: coin.UxBody{ + Coins: b.coins, + Hours: b.hours, + }, + } + } + + fee, err := TransactionFee(tx, tc.headTime, inUxs) + require.Equal(t, tc.err, err) + require.Equal(t, tc.fee, fee) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/file/file.go b/vendor/github.com/SkycoinProject/skycoin/src/util/file/file.go new file mode 100644 index 00000000..3975fb6e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/file/file.go @@ -0,0 +1,321 @@ +// Package file provides filesystem related utilities +package file + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + // ErrEmptyDirectoryName is returned by constructing the full path + // of data directory if the passed argument is empty + ErrEmptyDirectoryName = errors.New("data directory must not be empty") + // ErrDotDirectoryName is returned by constructing the full path of + // data directory if the passed argument is "." + ErrDotDirectoryName = errors.New("data directory must not be equal to \".\"") + + logger = logging.MustGetLogger("file") +) + +// InitDataDir Joins dir with the user's $HOME directory. +// If $HOME cannot be determined, uses the current working directory. +// dir must not be the empty string +func InitDataDir(dir string) (string, error) { + dir, err := buildDataDir(dir) + if err != nil { + return "", err + } + + // check if dir already exists + st, err := os.Stat(dir) + if !os.IsNotExist(err) { + if !st.IsDir() { + return "", fmt.Errorf("%s is not a directory", dir) + } + // dir already exists + return dir, nil + } + + if err := os.MkdirAll(dir, os.FileMode(0700)); err != nil { + logger.Errorf("Failed to create directory %s: %v", dir, err) + return "", err + } + + logger.Infof("Created data directory %s", dir) + return dir, nil +} + +// Construct the full data directory by adding to $HOME or ./ +func buildDataDir(dir string) (string, error) { + if dir == "" { + logger.Error("data directory is empty") + return "", ErrEmptyDirectoryName + } + + home := filepath.Clean(UserHome()) + wd, err := os.Getwd() + if err != nil { + return "", err + } + wd = filepath.Clean(wd) + + fullDir, err := filepath.Abs(dir) + + if err != nil { + return "", err + } + + // The joined directory must not be equal to $HOME or a parent path of $HOME + // The joined directory must not be equal to `pwd` or a parent path of `pwd` + if strings.HasPrefix(home, fullDir) || strings.HasPrefix(wd, fullDir) { + logger.Errorf("join(%[1]s, %[2]s) == %[1]s", home, dir) + return "", ErrDotDirectoryName + } + + return fullDir, nil +} + +// UserHome returns the current user home path +func UserHome() string { + // os/user relies on cgo which is disabled when cross compiling + // use fallbacks for various OSes instead + // usr, err := user.Current() + // if err == nil { + // return usr.HomeDir + // } + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + + return os.Getenv("HOME") +} + +// LoadJSON load json file +func LoadJSON(filename string, thing interface{}) error { + file, err := os.Open(filename) + if err != nil { + return err + } + defer file.Close() + + dec := json.NewDecoder(file) + dec.UseNumber() + return dec.Decode(thing) +} + +// SaveJSON write value into json file +func SaveJSON(filename string, thing interface{}, mode os.FileMode) error { + data, err := json.MarshalIndent(thing, "", " ") + if err != nil { + return err + } + return SaveBinary(filename, data, mode) +} + +// SaveJSONSafe saves json to disk, but refuses if file already exists +func SaveJSONSafe(filename string, thing interface{}, mode os.FileMode) error { + b, err := json.MarshalIndent(thing, "", " ") + if err != nil { + return err + } + flags := os.O_WRONLY | os.O_CREATE | os.O_EXCL + f, err := os.OpenFile(filename, flags, mode) + if err != nil { + return err + } + defer f.Close() + n, err := f.Write(b) + if n != len(b) && err != nil { + err = errors.New("Failed to save complete file") + } + if err != nil { + if removeErr := os.Remove(filename); removeErr != nil { + logger.WithError(removeErr).Warningf("os.Remove(%s) failed", filename) + } + } + return err +} + +// SaveBinary persists data into given file in binary, +// backup the data to `tmp` wallet file and then write data +// to target wallet file. Remove the tmp file in the end of +// this function. In this way, the wallet data would not be lost +func SaveBinary(filename string, data []byte, mode os.FileMode) error { + // Write the new file to a temporary + dataHash := cipher.SumSHA256(data) + tmpname := filename + ".tmp." + dataHash.Hex()[:8] + if err := ioutil.WriteFile(tmpname, data, mode); err != nil { + return err + } + + if err := ioutil.WriteFile(filename, data, mode); err != nil { + return err + } + + return os.Remove(tmpname) +} + +//TODO: require file named after application and then hashcode, in static directory + +// ResolveResourceDirectory searches locations for a research directory and returns absolute path +func ResolveResourceDirectory(path string) string { + workDir, err := filepath.Abs(filepath.Dir(os.Args[0])) + if err != nil { + logger.Panic(err) + } + + _, rtFilename, _, _ := runtime.Caller(1) + rtDirectory := filepath.Dir(rtFilename) + + pathAbs, err := filepath.Abs(path) + if err != nil { + logger.Panic(err) + } + fmt.Println("abs path:", pathAbs) + + fmt.Printf("runtime.Caller= %s \n", rtFilename) + //fmt.Printf("Filepath Raw= %s \n") + fmt.Printf("Filepath Directory= %s \n", filepath.Dir(path)) + fmt.Printf("Filepath Absolute Directory= %s \n", pathAbs) + + fmt.Printf("Working Directory= %s \n", workDir) + fmt.Printf("Runtime Filename= %s \n", rtFilename) + fmt.Printf("Runtime Directory= %s \n", rtDirectory) + + //dir1 := filepath.Join(workDir, filepath.Dir(path)) + //fmt.Printf("Dir1= %s \n", dir1) + + dirs := []string{ + pathAbs, //try direct path first + filepath.Join(workDir, filepath.Dir(path)), //default + //filepath.Join(rt_directory, "./", filepath.Dir(path)), + filepath.Join(rtDirectory, "./", filepath.Dir(path)), + filepath.Join(rtDirectory, "../", filepath.Dir(path)), + filepath.Join(rtDirectory, "../../", filepath.Dir(path)), + filepath.Join(rtDirectory, "../../../", filepath.Dir(path)), + } + + //for i, dir := range dirs { + // fmt.Printf("Dir[%d]= %s \n", i, dir) + //} + + //must be an absolute path + //error and problem and crash if not absolute path + for i := range dirs { + absPath, err := filepath.Abs(dirs[i]) + if err != nil { + logger.WithError(err).Errorf("filepath.Abs(%s) failed", dirs[i]) + continue + } + dirs[i] = absPath + } + + for _, dir := range dirs { + if _, err := os.Stat(dir); !os.IsNotExist(err) { + fmt.Printf("ResolveResourceDirectory: static resource dir= %s \n", dir) + return dir + } + } + logger.Panic("GUI directory not found") + return "" +} + +// DetermineResourcePath DEPRECATE +func DetermineResourcePath(staticDir string, resourceDir string, devDir string) (string, error) { + //check "dev" directory first + appLoc := filepath.Join(staticDir, devDir) + // if !strings.HasPrefix(appLoc, "/") { + // // Prepend the binary's directory path if appLoc is relative + // dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + // if err != nil { + // return "", err + // } + + // appLoc = filepath.Join(dir, appLoc) + // } + if _, err := os.Stat(appLoc); os.IsNotExist(err) { + //check dist directory + appLoc = filepath.Join(staticDir, resourceDir) + // if !strings.HasPrefix(appLoc, "/") { + // // Prepend the binary's directory path if appLoc is relative + // dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + // if err != nil { + // return "", err + // } + + // appLoc = filepath.Join(dir, appLoc) + // } + + if _, err := os.Stat(appLoc); os.IsNotExist(err) { + return "", err + } + } + + return appLoc, nil +} + +// Copy copies file. Will overwrite dst if dst exists. +func Copy(dst, src string) (err error) { + f, err := os.Open(src) + if err != nil { + return err + } + + defer func() { + cerr := f.Close() + if err == nil { + err = cerr + } + }() + + out, err := os.Create(dst) + if err != nil { + return err + } + + defer func() { + cerr := out.Close() + if err == nil { + err = cerr + } + }() + + _, err = io.Copy(out, f) + return +} + +// Exists checks whether the file exists in the file system +func Exists(fn string) (bool, error) { + _, err := os.Stat(fn) + if os.IsNotExist(err) { + return false, nil + } + if err != nil { + return false, err + } + return true, nil +} + +// IsWritable checks if the file is writable +func IsWritable(name string) bool { + f, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil && os.IsPermission(err) { + return false + } + f.Close() + return true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/file/file_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/file/file_test.go new file mode 100644 index 00000000..49f893d9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/file/file_test.go @@ -0,0 +1,267 @@ +package file + +import ( + "bytes" + "crypto/rand" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" + + "encoding/json" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func requireFileMode(t *testing.T, filename string, mode os.FileMode) { + stat, err := os.Stat(filename) + require.NoError(t, err) + require.Equal(t, stat.Mode(), mode) +} + +func requireFileContentsBinary(t *testing.T, filename string, contents []byte) { + f, err := os.Open(filename) + require.NoError(t, err) + defer f.Close() + b := make([]byte, len(contents)*16) + n, err := f.Read(b) + require.NoError(t, err) + + require.Equal(t, n, len(contents)) + require.True(t, bytes.Equal(b[:n], contents)) +} + +func requireFileContents(t *testing.T, filename, contents string) { //nolint:unparam + requireFileContentsBinary(t, filename, []byte(contents)) +} + +func requireIsRegularFile(t *testing.T, filename string) { + stat := testutil.RequireFileExists(t, filename) + require.True(t, stat.Mode().IsRegular()) +} + +func cleanup(t *testing.T, fn string) { + paths := []string{fn} + err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { + if err != nil { + panic(err) + } + if strings.Contains(info.Name(), fn+".tmp") { + paths = append(paths, info.Name()) + return nil + } + + if strings.Contains(info.Name(), fn+".bak") { + paths = append(paths, info.Name()) + return nil + } + + return nil + }) + require.NoError(t, err) + + for _, f := range paths { + os.Remove(f) + } +} + +func TestCleanup(t *testing.T) { + fn := "test.bin" + defer cleanup(t, fn) + b := make([]byte, 128) + _, err := rand.Read(b) + require.NoError(t, err) + require.NoError(t, ioutil.WriteFile(fn, b, 0600)) + require.NoError(t, ioutil.WriteFile(fn+".tmp.abc", b, 0600)) + require.NoError(t, ioutil.WriteFile(fn+".bak.abc", b, 0600)) +} + +func TestBuildDataDirDotOk(t *testing.T) { + dir := "./.test-skycoin/test" + builtDir, err := buildDataDir(dir) + require.NoError(t, err) + + cleanDir := filepath.Clean(dir) + require.True(t, strings.HasSuffix(builtDir, cleanDir)) + + gopath := os.Getenv("GOPATH") + // by default go uses GOPATH=$HOME/go if it is not set + if gopath == "" { + home := filepath.Clean(UserHome()) + gopath = filepath.Join(home, "go") + } + + require.True(t, strings.HasPrefix(builtDir, gopath)) + require.NotEqual(t, builtDir, filepath.Clean(gopath)) +} + +func TestBuildDataDirEmptyError(t *testing.T) { + dir, err := buildDataDir("") + require.Empty(t, dir) + require.Error(t, err) + require.Equal(t, ErrEmptyDirectoryName, err) +} + +func TestBuildDataDirDotError(t *testing.T) { + bad := []string{".", "./", "./.", "././", "./../"} + for _, b := range bad { + dir, err := buildDataDir(b) + require.Empty(t, dir) + require.Error(t, err) + require.Equal(t, ErrDotDirectoryName, err) + } +} + +func TestUserHome(t *testing.T) { + home := UserHome() + require.NotEqual(t, home, "") +} + +func TestBuildDataDirDefault(t *testing.T) { + home := UserHome() + defaultDir := filepath.Join(home, ".skycoin") + dir, err := buildDataDir(defaultDir) + require.NoError(t, err) + expectedPath := filepath.Join(home, ".skycoin") + require.Equal(t, dir, expectedPath) +} + +func TestBuildDataDirAbsolute(t *testing.T) { + abspath := "/opt/.skycoin" + dir, err := buildDataDir(abspath) + require.NoError(t, err) + require.Equal(t, abspath, dir) +} + +func TestLoadJSON(t *testing.T) { + obj := struct{ Key string }{} + fn := "test.json" + defer cleanup(t, fn) + + // Loading nonexistant file + testutil.RequireFileNotExists(t, fn) + err := LoadJSON(fn, &obj) + require.Error(t, err) + require.True(t, os.IsNotExist(err)) + + f, err := os.Create(fn) + require.NoError(t, err) + _, err = f.WriteString("{\"key\":\"value\"}") + require.NoError(t, err) + f.Close() + + err = LoadJSON(fn, &obj) + require.NoError(t, err) + require.Equal(t, obj.Key, "value") +} + +func TestSaveJSON(t *testing.T) { + fn := "test.json" + defer cleanup(t, fn) + obj := struct { + Key string `json:"key"` + }{Key: "value"} + + b, err := json.MarshalIndent(obj, "", " ") + require.NoError(t, err) + + err = SaveJSON(fn, obj, 0644) + require.NoError(t, err) + + objHash := cipher.SumSHA256(b).Hex()[:8] + + requireIsRegularFile(t, fn) + testutil.RequireFileNotExists(t, fn+".bak."+objHash) + requireFileMode(t, fn, 0644) + requireFileContents(t, fn, string(b)) + + // Saving again should result in a .bak file same as original + obj.Key = "value2" + err = SaveJSON(fn, obj, 0644) + require.NoError(t, err) + b2, err := json.MarshalIndent(obj, "", " ") + require.NoError(t, err) + + requireFileMode(t, fn, 0644) + requireIsRegularFile(t, fn) + requireFileContents(t, fn, string(b2)) + objHash = cipher.SumSHA256(b2).Hex()[:8] + testutil.RequireFileNotExists(t, fn+".tmp."+objHash) +} + +func TestSaveJSONSafe(t *testing.T) { + fn := "test.json" + defer cleanup(t, fn) + obj := struct { + Key string `json:"key"` + }{Key: "value"} + err := SaveJSONSafe(fn, obj, 0600) + require.NoError(t, err) + b, err := json.MarshalIndent(obj, "", " ") + require.NoError(t, err) + + requireIsRegularFile(t, fn) + requireFileMode(t, fn, 0600) + requireFileContents(t, fn, string(b)) + + // Saving again should result in error, and original file not changed + obj.Key = "value2" + err = SaveJSONSafe(fn, obj, 0600) + require.Error(t, err) + + requireIsRegularFile(t, fn) + requireFileContents(t, fn, string(b)) + objHash := cipher.SumSHA256(b).Hex()[:8] + testutil.RequireFileNotExists(t, fn+".bak."+objHash) + testutil.RequireFileNotExists(t, fn+".tmp."+objHash) +} + +func TestSaveBinary(t *testing.T) { + fn := "test.bin" + defer cleanup(t, fn) + b := make([]byte, 128) + _, err := rand.Read(b) + require.NoError(t, err) + err = SaveBinary(fn, b, 0644) + require.NoError(t, err) + objHash := cipher.SumSHA256(b).Hex()[:8] + testutil.RequireFileNotExists(t, fn+".tmp."+objHash) + testutil.RequireFileNotExists(t, fn+".bak."+objHash) + requireIsRegularFile(t, fn) + requireFileContentsBinary(t, fn, b) + requireFileMode(t, fn, 0644) + + b2 := make([]byte, 128) + _, err = rand.Read(b2) + require.NoError(t, err) + require.False(t, bytes.Equal(b, b2)) + + err = SaveBinary(fn, b2, 0644) + require.NoError(t, err) + requireIsRegularFile(t, fn) + objHash = cipher.SumSHA256(b2).Hex()[:8] + testutil.RequireFileNotExists(t, fn+".tmp."+objHash) + requireFileContentsBinary(t, fn, b2) + // requireFileContentsBinary(t, fn+".bak", b) + requireFileMode(t, fn, 0644) + // requireFileMode(t, fn+".bak", 0644) +} + +func TestIsWritable(t *testing.T) { + fn := "test.bin" + defer cleanup(t, fn) + b := make([]byte, 32) + _, err := rand.Read(b) + require.NoError(t, err) + err = SaveBinary(fn, b, 0400) + require.NoError(t, err) + require.False(t, IsWritable(fn)) + + err = os.Chmod(fn, 0600) + require.NoError(t, err) + require.True(t, IsWritable(fn)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/http/error.go b/vendor/github.com/SkycoinProject/skycoin/src/util/http/error.go new file mode 100644 index 00000000..f9e15762 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/http/error.go @@ -0,0 +1,68 @@ +// Package httphelper provides HTTP related utility methods +package httphelper + +import ( + "fmt" + "net/http" +) + +// ErrorXXX writes an error message with status code +func ErrorXXX(w http.ResponseWriter, status int, msg string) { + httpMsg := fmt.Sprintf("%d %s", status, http.StatusText(status)) + if msg != "" { + httpMsg = fmt.Sprintf("%s - %s", httpMsg, msg) + } + + http.Error(w, httpMsg, status) +} + +// Error400 respond with a 400 error and include a message +func Error400(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusBadRequest, msg) +} + +// Error401 respond with a 401 error +func Error401(w http.ResponseWriter, auth, msg string) { + w.Header().Set("WWW-Authenticate", auth) + ErrorXXX(w, http.StatusUnauthorized, msg) +} + +// Error403 respond with a 403 error and include a message +func Error403(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusForbidden, msg) +} + +// Error404 respond with a 404 error and include a message +func Error404(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusNotFound, msg) +} + +// Error405 respond with a 405 error +func Error405(w http.ResponseWriter) { + ErrorXXX(w, http.StatusMethodNotAllowed, "") +} + +// Error415 respond with a 415 error +func Error415(w http.ResponseWriter) { + ErrorXXX(w, http.StatusUnsupportedMediaType, "") +} + +// Error422 response with a 422 error and include a message +func Error422(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusUnprocessableEntity, msg) +} + +// Error500 respond with a 500 error and include a message +func Error500(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusInternalServerError, msg) +} + +// Error501 respond with a 501 error +func Error501(w http.ResponseWriter) { + ErrorXXX(w, http.StatusNotImplemented, "") +} + +// Error503 respond with a 503 error and include a message +func Error503(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusServiceUnavailable, msg) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/http/json.go b/vendor/github.com/SkycoinProject/skycoin/src/util/http/json.go new file mode 100644 index 00000000..ffdc38bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/http/json.go @@ -0,0 +1,190 @@ +package httphelper + +// Utilities for sending JSON + +import ( + "encoding/json" + "fmt" + "net/http" + "strconv" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// SendJSONOr500 writes an object as JSON, writing a 500 error if it fails +func SendJSONOr500(log *logging.Logger, w http.ResponseWriter, m interface{}) { + out, err := json.MarshalIndent(m, "", " ") + if err != nil { + Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", "application/json") + + if _, err := w.Write(out); err != nil { + log.WithError(err).Error("http Write failed") + } +} + +// Duration JSON type copied from https://github.com/vrischmann/jsonutil, MIT License + +// Duration is a wrapper around time.Duration which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the duration as a string in the format accepted by time.ParseDuration and returned by time.Duration.String. +type Duration struct { + time.Duration +} + +// FromDuration is a convenience factory to create a Duration instance from the +// given time.Duration value. +func FromDuration(d time.Duration) Duration { + return Duration{d} +} + +// MarshalJSON implements the json.Marshaler interface. The duration is a quoted-string in the format accepted by time.ParseDuration and returned by time.Duration.String. +func (d Duration) MarshalJSON() ([]byte, error) { + return []byte(`"` + d.String() + `"`), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. The duration is expected to be a quoted-string of a duration in the format accepted by time.ParseDuration. +func (d *Duration) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + + tmp, err := time.ParseDuration(s) + if err != nil { + return err + } + + d.Duration = tmp + + return nil +} + +// Address is a wrapper around cipher.Address which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the address as a string +type Address struct { + cipher.Address +} + +// UnmarshalJSON unmarshals a string address to a cipher.Address +func (a *Address) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := cipher.DecodeBase58Address(s) + if err != nil { + return fmt.Errorf("invalid address: %v", err) + } + + a.Address = tmp + + return nil +} + +// MarshalJSON marshals a cipher.Address in its string representation +func (a Address) MarshalJSON() ([]byte, error) { + return []byte(`"` + a.Address.String() + `"`), nil +} + +// SHA256 is a wrapper around cipher.SHA256 which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the address as a string +type SHA256 struct { + cipher.SHA256 +} + +// UnmarshalJSON unmarshals a string address to a cipher.SHA256 +func (a *SHA256) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := cipher.SHA256FromHex(s) + if err != nil { + return fmt.Errorf("invalid SHA256 hash: %v", err) + } + + a.SHA256 = tmp + + return nil +} + +// MarshalJSON marshals a cipher.SHA256 in its string representation +func (a SHA256) MarshalJSON() ([]byte, error) { + return []byte(`"` + a.SHA256.Hex() + `"`), nil +} + +// Coins is a wrapper around uint64 which implements json.Unmarshaler and json.Marshaler. +// It unmarshals a fixed-point decimal string to droplets and vice versa +type Coins uint64 + +// UnmarshalJSON unmarshals a fixed-point decimal string to droplets +func (c *Coins) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := droplet.FromString(s) + if err != nil { + return err + } + + *c = Coins(tmp) + + return nil +} + +// MarshalJSON marshals droplets to a fixed-point decimal string +func (c Coins) MarshalJSON() ([]byte, error) { + s, err := droplet.ToString(uint64(c)) + if err != nil { + return nil, err + } + + return []byte(`"` + s + `"`), nil +} + +// Value returns the underlying uint64 value +func (c Coins) Value() uint64 { + return uint64(c) +} + +// Hours is a wrapper around uint64 which implements json.Unmarshaler and json.Marshaler. +// It unmarshals a fixed-point decimal string to droplets and vice versa +type Hours uint64 + +// UnmarshalJSON unmarshals a fixed-point decimal string to droplets +func (h *Hours) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return fmt.Errorf("invalid hours value: %v", err) + } + + *h = Hours(tmp) + + return nil +} + +// MarshalJSON marshals droplets to a fixed-point decimal string +func (h Hours) MarshalJSON() ([]byte, error) { + s := fmt.Sprint(h) + return []byte(`"` + s + `"`), nil +} + +// Value returns the underlying uint64 value +func (h Hours) Value() uint64 { + return uint64(h) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/http/json_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/http/json_test.go new file mode 100644 index 00000000..ce9df8a3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/http/json_test.go @@ -0,0 +1,319 @@ +package httphelper + +import ( + "errors" + "fmt" + "math" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestFromDuration(t *testing.T) { + dur := 10 * time.Second + require.Equal(t, FromDuration(dur).Duration, dur) +} + +func TestDurationMarshalJSON(t *testing.T) { + d := Duration{time.Second * 10} + data, err := d.MarshalJSON() + + require.NoError(t, err) + require.Equal(t, `"10s"`, string(data)) +} + +func TestDurationUnmarshalJSON(t *testing.T) { + cases := []struct { + name string + s string + expected time.Duration + err string + }{ + { + name: "valid duration", + s: "1m", + expected: time.Minute, + }, + { + name: "invalid duration", + s: "foo", + err: "time: invalid duration foo", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var d Duration + err := d.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.s))) + + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, d.Duration) + } + + }) + } + + var d Duration + err := d.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestAddressMarshalJSON(t *testing.T) { + addrStr := "2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy" + addrInner, err := cipher.DecodeBase58Address(addrStr) + require.NoError(t, err) + + addr := Address{addrInner} + + data, err := addr.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy"`, string(data)) +} + +func TestAddressUnmarshalJSON(t *testing.T) { + cases := []struct { + name string + addr string + err string + }{ + { + name: "empty address", + addr: "", + err: "invalid address: Invalid base58 string", + }, + { + name: "short address", + addr: "xxx", + err: "invalid address: Invalid address length", + }, + { + name: "invalid base58 address", + addr: "2blYafFtdkCRNcCyuDvsATV66GvBR9xfvjy", + err: "invalid address: Invalid base58 character", + }, + { + name: "valid address", + addr: "2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var a Address + err := a.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.addr))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + addr, err := cipher.DecodeBase58Address(tc.addr) + require.NoError(t, err) + + require.Equal(t, addr, a.Address) + } + }) + } + + var a Address + err := a.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestCoinsMarshalJSON(t *testing.T) { + c := Coins(111) + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"0.000111"`, string(data)) + + c = Coins(math.MaxUint64) + _, err = c.MarshalJSON() + testutil.RequireError(t, err, "Droplet string conversion failed: Value is too large") +} + +func TestCoinsUnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected uint64 + err string + }{ + { + c: "-1", + err: "Droplet string conversion failed: Negative balance", + }, + { + c: "0", + expected: 0, + }, + { + c: "0.1234567", + err: "Droplet string conversion failed: Too many decimal places", + }, + { + c: "1.001", + expected: 1001e3, + }, + { + c: "1.234567", + expected: 1234567, + }, + { + c: "9", + expected: 9e6, + }, + { + c: ".", + err: "can't convert . to decimal", + }, + { + c: "inf", + err: "can't convert inf to decimal", + }, + { + c: "9223372036854.775807", + expected: uint64(math.MaxInt64), + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.c), func(t *testing.T) { + var c Coins + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.Value()) + } + }) + } + + var c Coins + err := c.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestHoursMarshalJSON(t *testing.T) { + c := Hours(111) + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"111"`, string(data)) +} + +func TestHoursUnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected uint64 + err string + }{ + { + c: "-1", + err: "invalid hours value: strconv.ParseUint: parsing \"-1\": invalid syntax", + }, + { + c: "0", + expected: 0, + }, + { + c: "0.1", + err: "invalid hours value: strconv.ParseUint: parsing \"0.1\": invalid syntax", + }, + { + c: "9", + expected: 9, + }, + { + c: ".", + err: "invalid hours value: strconv.ParseUint: parsing \".\": invalid syntax", + }, + { + c: "inf", + err: "invalid hours value: strconv.ParseUint: parsing \"inf\": invalid syntax", + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.c), func(t *testing.T) { + var c Hours + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.Value()) + } + }) + } + + var c Hours + err := c.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestSHA256MarshalJSON(t *testing.T) { + hash := "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d" + + c := SHA256{cipher.MustSHA256FromHex(hash)} + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d"`, string(data)) +} + +func TestSHA256UnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected cipher.SHA256 + err string + }{ + { + c: "", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "foo", + err: "invalid SHA256 hash: encoding/hex: invalid byte: U+006F 'o'", + }, + + { + c: "97dd0628", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d97", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11Q", + err: "invalid SHA256 hash: encoding/hex: invalid byte: U+0051 'Q'", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + expected: cipher.MustSHA256FromHex("97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d"), + }, + } + + for _, tc := range cases { + t.Run(tc.c, func(t *testing.T) { + var c SHA256 + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.SHA256) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/http/log.go b/vendor/github.com/SkycoinProject/skycoin/src/util/http/log.go new file mode 100644 index 00000000..84f4bee7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/http/log.go @@ -0,0 +1,53 @@ +package httphelper + +import ( + "bytes" + "net/http" + "strings" + "time" + + "github.com/sirupsen/logrus" +) + +// ElapsedHandler records and logs an HTTP request with the elapsed time and status code +func ElapsedHandler(logger logrus.FieldLogger, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lrw := newWrappedResponseWriter(w) + start := time.Now() + handler.ServeHTTP(lrw, r) + logMethod := logger.Infof + if lrw.statusCode >= 400 { + logMethod = logger.WithFields(logrus.Fields{ + "body": strings.TrimSpace(lrw.response.String()), + }).Errorf + } + logMethod("%d %s %s %s", lrw.statusCode, r.Method, r.URL.Path, time.Since(start)) + }) +} + +type wrappedResponseWriter struct { + http.ResponseWriter + statusCode int + response bytes.Buffer +} + +func newWrappedResponseWriter(w http.ResponseWriter) *wrappedResponseWriter { + return &wrappedResponseWriter{ + ResponseWriter: w, + statusCode: http.StatusOK, + response: bytes.Buffer{}, + } +} + +func (lrw *wrappedResponseWriter) WriteHeader(code int) { + lrw.statusCode = code + lrw.ResponseWriter.WriteHeader(code) +} + +func (lrw *wrappedResponseWriter) Write(buff []byte) (int, error) { + retVal, err := lrw.ResponseWriter.Write(buff) + if lrw.statusCode >= 400 { + lrw.response.Write(buff) + } + return retVal, err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil.go b/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil.go new file mode 100644 index 00000000..1dccbd9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil.go @@ -0,0 +1,66 @@ +/* +Package iputil provides IP address related utility methods +*/ +package iputil + +import ( + "errors" + "net" + "strconv" +) + +var ( + // ErrMissingIP IP missing from ip:port string + ErrMissingIP = errors.New("IP missing from ip:port address") + // ErrInvalidPort port invalid in ip:port string + ErrInvalidPort = errors.New("Port invalid in ip:port address") + // ErrNoLocalIP no localhost IP found in system net interfaces + ErrNoLocalIP = errors.New("No local IP found") +) + +// LocalhostIP returns the address for localhost on the machine +func LocalhostIP() (string, error) { + tt, err := net.Interfaces() + if err != nil { + return "", err + } + for _, t := range tt { + aa, err := t.Addrs() + if err != nil { + return "", err + } + for _, a := range aa { + if ipnet, ok := a.(*net.IPNet); ok && ipnet.IP.IsLoopback() { + return ipnet.IP.String(), nil + } + } + } + return "", ErrNoLocalIP +} + +// IsLocalhost returns true if addr is a localhost address +// Works for both ipv4 and ipv6 addresses. +func IsLocalhost(addr string) bool { + return net.ParseIP(addr).IsLoopback() || addr == "localhost" +} + +// SplitAddr splits an ip:port string to ip, port. +// Works for both ipv4 and ipv6 addresses. +// If the IP is not specified, returns an error. +func SplitAddr(addr string) (string, uint16, error) { + ip, port, err := net.SplitHostPort(addr) + if err != nil { + return "", 0, err + } + + if ip == "" { + return "", 0, ErrMissingIP + } + + port64, err := strconv.ParseUint(port, 10, 16) + if err != nil { + return "", 0, ErrInvalidPort + } + + return ip, uint16(port64), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil_test.go new file mode 100644 index 00000000..cc437c72 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil_test.go @@ -0,0 +1,123 @@ +package iputil + +import ( + "net" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestIsLocalhost(t *testing.T) { + testData := []struct { + host string + expected bool + }{ + { + host: "0:0:0:0:0:0:0:1", + expected: true, + }, + { + host: "localhost", + expected: true, + }, + { + host: "127.0.0.1", + expected: true, + }, + { + host: "localhost", + expected: true, + }, + { + host: "85.56.12.34", + expected: false, + }, + { + host: "::1", + expected: true, + }, + { + host: "::", + expected: false, + }, + { + host: "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + expected: false, + }, + { + host: "", + expected: false, + }, + } + + for _, tc := range testData { + t.Run(tc.host, func(t *testing.T) { + actual := IsLocalhost(tc.host) + require.Equal(t, tc.expected, actual) + }) + } +} + +func TestSplitAddr(t *testing.T) { + testData := []struct { + input string + host string + port uint16 + err error + }{ + { + input: "0.0.0.0:8888", + host: "0.0.0.0", + port: 8888, + }, + { + input: "0.0.0.0:", + err: ErrInvalidPort, + }, + { + input: "0.0.0.0:x", + err: ErrInvalidPort, + }, + { + input: ":9999", + err: ErrMissingIP, + }, + { + input: "127.0.0.1", + err: &net.AddrError{ + Err: "missing port in address", + Addr: "127.0.0.1", + }, + }, + { + input: "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:1234", + host: "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + port: 1234, + }, + { + input: "[::]:1234", + host: "::", + port: 1234, + }, + { + input: "[::]:x", + err: ErrInvalidPort, + }, + } + + for _, tc := range testData { + t.Run(tc.input, func(t *testing.T) { + addr, port, err := SplitAddr(tc.input) + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.host, addr) + require.Equal(t, tc.port, port) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/logging/formatter.go b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/formatter.go new file mode 100644 index 00000000..e9066f4c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/formatter.go @@ -0,0 +1,441 @@ +package logging + +import ( + "bytes" + "fmt" + "io" + "os" + "sort" + "strings" + "sync" + "time" + + "github.com/mgutz/ansi" + "github.com/sirupsen/logrus" + "golang.org/x/crypto/ssh/terminal" +) + +const defaultTimestampFormat = time.RFC3339 + +var ( + baseTimestamp = time.Now() + defaultColorScheme = &ColorScheme{ + InfoLevelStyle: "green", + WarnLevelStyle: "yellow", + ErrorLevelStyle: "red", + FatalLevelStyle: "red", + PanicLevelStyle: "red", + DebugLevelStyle: "blue", + PrefixStyle: "cyan", + TimestampStyle: "black+h", + CallContextStyle: "black+h", + CriticalStyle: "magenta+h", + } + noColorsColorScheme = &compiledColorScheme{ + InfoLevelColor: ansi.ColorFunc(""), + WarnLevelColor: ansi.ColorFunc(""), + ErrorLevelColor: ansi.ColorFunc(""), + FatalLevelColor: ansi.ColorFunc(""), + PanicLevelColor: ansi.ColorFunc(""), + DebugLevelColor: ansi.ColorFunc(""), + PrefixColor: ansi.ColorFunc(""), + TimestampColor: ansi.ColorFunc(""), + CallContextColor: ansi.ColorFunc(""), + CriticalColor: ansi.ColorFunc(""), + } + defaultCompiledColorScheme = compileColorScheme(defaultColorScheme) +) + +func miniTS() int { + return int(time.Since(baseTimestamp) / time.Second) +} + +// ColorScheme configures the logging output colors +type ColorScheme struct { + InfoLevelStyle string + WarnLevelStyle string + ErrorLevelStyle string + FatalLevelStyle string + PanicLevelStyle string + DebugLevelStyle string + PrefixStyle string + TimestampStyle string + CallContextStyle string + CriticalStyle string +} + +type compiledColorScheme struct { + InfoLevelColor func(string) string + WarnLevelColor func(string) string + ErrorLevelColor func(string) string + FatalLevelColor func(string) string + PanicLevelColor func(string) string + DebugLevelColor func(string) string + PrefixColor func(string) string + TimestampColor func(string) string + CallContextColor func(string) string + CriticalColor func(string) string +} + +// TextFormatter formats log output +type TextFormatter struct { + // Set to true to bypass checking for a TTY before outputting colors. + ForceColors bool + + // Force disabling colors. For a TTY colors are enabled by default. + DisableColors bool + + // Force formatted layout, even for non-TTY output. + ForceFormatting bool + + // Disable timestamp logging. useful when output is redirected to logging + // system that already adds timestamps. + DisableTimestamp bool + + // Disable the conversion of the log levels to uppercase + DisableUppercase bool + + // Enable logging the full timestamp when a TTY is attached instead of just + // the time passed since beginning of execution. + FullTimestamp bool + + // Timestamp format to use for display when a full timestamp is printed. + TimestampFormat string + + // The fields are sorted by default for a consistent output. For applications + // that log extremely frequently and don't use the JSON formatter this may not + // be desired. + DisableSorting bool + + // Wrap empty fields in quotes if true. + QuoteEmptyFields bool + + // Can be set to the override the default quoting character " + // with something else. For example: ', or `. + QuoteCharacter string + + // Pad msg field with spaces on the right for display. + // The value for this parameter will be the size of padding. + // Its default value is zero, which means no padding will be applied for msg. + SpacePadding int + + // Always use quotes for string values (except for empty fields) + AlwaysQuoteStrings bool + + // Color scheme to use. + colorScheme *compiledColorScheme + + // Whether the logger's out is to a terminal. + isTerminal bool + + sync.Once +} + +func getCompiledColor(main string, fallback string) func(string) string { + var style string + if main != "" { + style = main + } else { + style = fallback + } + return ansi.ColorFunc(style) +} + +func compileColorScheme(s *ColorScheme) *compiledColorScheme { + return &compiledColorScheme{ + InfoLevelColor: getCompiledColor(s.InfoLevelStyle, defaultColorScheme.InfoLevelStyle), + WarnLevelColor: getCompiledColor(s.WarnLevelStyle, defaultColorScheme.WarnLevelStyle), + ErrorLevelColor: getCompiledColor(s.ErrorLevelStyle, defaultColorScheme.ErrorLevelStyle), + FatalLevelColor: getCompiledColor(s.FatalLevelStyle, defaultColorScheme.FatalLevelStyle), + PanicLevelColor: getCompiledColor(s.PanicLevelStyle, defaultColorScheme.PanicLevelStyle), + DebugLevelColor: getCompiledColor(s.DebugLevelStyle, defaultColorScheme.DebugLevelStyle), + PrefixColor: getCompiledColor(s.PrefixStyle, defaultColorScheme.PrefixStyle), + TimestampColor: getCompiledColor(s.TimestampStyle, defaultColorScheme.TimestampStyle), + CallContextColor: getCompiledColor(s.CallContextStyle, defaultColorScheme.CallContextStyle), + CriticalColor: getCompiledColor(s.CriticalStyle, defaultColorScheme.CriticalStyle), + } +} + +func (f *TextFormatter) init(entry *logrus.Entry) { + if len(f.QuoteCharacter) == 0 { + f.QuoteCharacter = "\"" + } + if entry.Logger != nil { + f.isTerminal = f.checkIfTerminal(entry.Logger.Out) + } +} + +func (f *TextFormatter) checkIfTerminal(w io.Writer) bool { + switch v := w.(type) { + case *os.File: + return terminal.IsTerminal(int(v.Fd())) + default: + return false + } +} + +// SetColorScheme sets the TextFormatter's color scheme configuration +func (f *TextFormatter) SetColorScheme(colorScheme *ColorScheme) { + f.colorScheme = compileColorScheme(colorScheme) +} + +// Format formats a logrus.Entry +func (f *TextFormatter) Format(entry *logrus.Entry) ([]byte, error) { + var b *bytes.Buffer + keys := make([]string, 0, len(entry.Data)) + for k := range entry.Data { + keys = append(keys, k) + } + lastKeyIdx := len(keys) - 1 + + if !f.DisableSorting { + sort.Strings(keys) + } + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + f.Do(func() { f.init(entry) }) + + isFormatted := f.ForceFormatting || f.isTerminal + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + if isFormatted { + isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors + var colorScheme *compiledColorScheme + if isColored { + if f.colorScheme == nil { + colorScheme = defaultCompiledColorScheme + } else { + colorScheme = f.colorScheme + } + } else { + colorScheme = noColorsColorScheme + } + f.printColored(b, entry, keys, timestampFormat, colorScheme) + } else { + if !f.DisableTimestamp { + f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat), true) + } + f.appendKeyValue(b, "level", entry.Level.String(), true) + if entry.Message != "" { + f.appendKeyValue(b, "msg", entry.Message, lastKeyIdx >= 0) + } + for i, key := range keys { + f.appendKeyValue(b, key, entry.Data[key], lastKeyIdx != i) + } + } + + b.WriteByte('\n') //nolint:gosec + return b.Bytes(), nil +} + +func (f *TextFormatter) printColored(b *bytes.Buffer, entry *logrus.Entry, keys []string, timestampFormat string, colorScheme *compiledColorScheme) { + var levelColor func(string) string + var levelText string + switch entry.Level { + case logrus.InfoLevel: + levelColor = colorScheme.InfoLevelColor + case logrus.WarnLevel: + levelColor = colorScheme.WarnLevelColor + case logrus.ErrorLevel: + levelColor = colorScheme.ErrorLevelColor + case logrus.FatalLevel: + levelColor = colorScheme.FatalLevelColor + case logrus.PanicLevel: + levelColor = colorScheme.PanicLevelColor + default: + levelColor = colorScheme.DebugLevelColor + } + + priority, ok := entry.Data[logPriorityKey] + hasPriority := ok && priority == logPriorityCritical + + if entry.Level != logrus.WarnLevel { + levelText = entry.Level.String() + } else { + levelText = "warn" + } + + if !f.DisableUppercase { + levelText = strings.ToUpper(levelText) + } + + level := levelColor(levelText) + message := entry.Message + prefix := "" + + prefixText := extractPrefix(entry) + if prefixText != "" { + prefixText = " " + prefixText + ":" + prefix = colorScheme.PrefixColor(prefixText) + } + + messageFormat := "%s" + if f.SpacePadding != 0 { + messageFormat = fmt.Sprintf("%%-%ds", f.SpacePadding) + } + if message != "" { + messageFormat = " " + messageFormat + } + + callContextParts := []string{} + if ifile, ok := entry.Data["file"]; ok { + if sfile, ok := ifile.(string); ok && sfile != "" { + callContextParts = append(callContextParts, sfile) + } + } + if ifunc, ok := entry.Data["func"]; ok { + if sfunc, ok := ifunc.(string); ok && sfunc != "" { + callContextParts = append(callContextParts, sfunc) + } + } + if iline, ok := entry.Data["line"]; ok { + sline := "" + switch iline := iline.(type) { + case string: + sline = iline + case int, uint, int32, int64, uint32, uint64: + sline = fmt.Sprint(iline) + } + if sline != "" { + callContextParts = append(callContextParts, fmt.Sprint(sline)) + } + } + callContextText := strings.Join(callContextParts, ":") + callContext := colorScheme.CallContextColor(callContextText) + if callContext != "" { + callContext = " " + callContext + } + + if f.DisableTimestamp { + if hasPriority { + str := fmt.Sprintf("%s%s%s"+messageFormat, levelText, callContextText, prefixText, message) + fmt.Fprint(b, colorScheme.CriticalColor(str)) + } else { + fmt.Fprintf(b, "%s%s%s"+messageFormat, level, callContext, prefix, message) + } + } else { + var timestamp string + if !f.FullTimestamp { + timestamp = fmt.Sprintf("[%04d]", miniTS()) + } else { + timestamp = fmt.Sprintf("[%s]", entry.Time.Format(timestampFormat)) + } + + coloredTimestamp := colorScheme.TimestampColor(timestamp) + + if hasPriority { + str := fmt.Sprintf("%s %s%s%s"+messageFormat, timestamp, levelText, callContextText, prefixText, message) + fmt.Fprint(b, colorScheme.CriticalColor(str)) + } else { + fmt.Fprintf(b, "%s %s%s%s"+messageFormat, coloredTimestamp, level, callContext, prefix, message) + } + } + + for _, k := range keys { + if k != "prefix" && k != "file" && k != "func" && k != "line" && k != logPriorityKey && k != logModuleKey { + v := entry.Data[k] + fmt.Fprintf(b, " %s", f.formatKeyValue(levelColor(k), v)) + } + } +} + +func (f *TextFormatter) needsQuoting(text string) bool { + if len(text) == 0 { + return f.QuoteEmptyFields + } + + if f.AlwaysQuoteStrings { + return true + } + + for _, ch := range text { + if !((ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9') || + ch == '-' || ch == '.') { + return true + } + } + + return false +} + +func extractPrefix(e *logrus.Entry) string { + var module string + if iModule, ok := e.Data[logModuleKey]; ok { + module, _ = iModule.(string) + } + + var priority string + if iPriority, ok := e.Data[logPriorityKey]; ok { + priority, _ = iPriority.(string) + } + + switch { + case priority == "": + return fmt.Sprintf("[%s]", module) + case module == "": + return fmt.Sprintf("[%s]", priority) + default: + return fmt.Sprintf("[%s:%s]", module, priority) + } +} + +func (f *TextFormatter) formatKeyValue(key string, value interface{}) string { + return fmt.Sprintf("%s=%s", key, f.formatValue(value)) +} + +func (f *TextFormatter) formatValue(value interface{}) string { + switch value := value.(type) { + case string: + if f.needsQuoting(value) { + return fmt.Sprintf("%s%+v%s", f.QuoteCharacter, value, f.QuoteCharacter) + } + return value + case error: + errmsg := value.Error() + if f.needsQuoting(errmsg) { + return fmt.Sprintf("%s%+v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter) + } + return errmsg + default: + return fmt.Sprintf("%+v", value) + } +} + +func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}, appendSpace bool) { + b.WriteString(key) //nolint:gosec + b.WriteByte('=') //nolint:gosec + f.appendValue(b, value) //nolint:gosec + + if appendSpace { + b.WriteByte(' ') //nolint:gosec + } +} + +func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) { + switch value := value.(type) { + case string: + if f.needsQuoting(value) { + fmt.Fprintf(b, "%s%+v%s", f.QuoteCharacter, value, f.QuoteCharacter) + } else { + b.WriteString(value) //nolint:gosec + } + case error: + errmsg := value.Error() + if f.needsQuoting(errmsg) { + fmt.Fprintf(b, "%s%+v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter) + } else { + b.WriteString(errmsg) //nolint:gosec + } + default: + fmt.Fprint(b, value) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/logging/hooks.go b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/hooks.go new file mode 100644 index 00000000..d8d0cc61 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/hooks.go @@ -0,0 +1,44 @@ +package logging + +import ( + "io" + + "github.com/sirupsen/logrus" +) + +// WriteHook is a logrus.Hook that logs to an io.Writer +type WriteHook struct { + w io.Writer + formatter logrus.Formatter +} + +// NewWriteHook returns a new WriteHook +func NewWriteHook(w io.Writer) *WriteHook { + return &WriteHook{ + w: w, + formatter: &TextFormatter{ + DisableColors: true, + FullTimestamp: true, + AlwaysQuoteStrings: true, + QuoteEmptyFields: true, + ForceFormatting: true, + }, + } +} + +// Levels returns Levels accepted by the WriteHook. +// All logrus.Levels are returned. +func (f *WriteHook) Levels() []logrus.Level { + return logrus.AllLevels +} + +// Fire writes a logrus.Entry to the file +func (f *WriteHook) Fire(e *logrus.Entry) error { + b, err := f.formatter.Format(e) + if err != nil { + return err + } + + _, err = f.w.Write(b) + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logger.go b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logger.go new file mode 100644 index 00000000..7b7e3359 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logger.go @@ -0,0 +1,77 @@ +package logging + +import ( + "os" + "time" + + "github.com/sirupsen/logrus" +) + +// Logger wraps logrus.FieldLogger +type Logger struct { + logrus.FieldLogger +} + +// Critical adds special critical-level fields for specially highlighted logging, +// since logrus lacks a distinct critical field and does not have configurable log levels +func (logger *Logger) Critical() logrus.FieldLogger { + return logger.WithField(logPriorityKey, logPriorityCritical) +} + +// WithTime overrides time, used by logger. +func (logger *Logger) WithTime(t time.Time) *logrus.Entry { + return logger.WithFields(logrus.Fields{}).WithTime(t) +} + +// MasterLogger wraps logrus.Logger and is able to create new package-aware loggers +type MasterLogger struct { + *logrus.Logger +} + +// NewMasterLogger creates a new package-aware logger with formatting string +func NewMasterLogger() *MasterLogger { + hooks := make(logrus.LevelHooks) + + return &MasterLogger{ + Logger: &logrus.Logger{ + Out: os.Stdout, + Formatter: &TextFormatter{ + FullTimestamp: true, + AlwaysQuoteStrings: true, + QuoteEmptyFields: true, + ForceFormatting: true, + DisableColors: false, + ForceColors: false, + }, + Hooks: hooks, + Level: logrus.DebugLevel, + }, + } +} + +// PackageLogger instantiates a package-aware logger +func (logger *MasterLogger) PackageLogger(moduleName string) *Logger { + return &Logger{ + FieldLogger: logger.WithField(logModuleKey, moduleName), + } +} + +// AddHook adds a logrus.Hook to the logger and its module loggers +func (logger *MasterLogger) AddHook(hook logrus.Hook) { + logger.Hooks.Add(hook) +} + +// SetLevel sets the log level for the logger and its module loggers +func (logger *MasterLogger) SetLevel(level logrus.Level) { + logger.Level = level +} + +// EnableColors enables colored logging +func (logger *MasterLogger) EnableColors() { + logger.Formatter.(*TextFormatter).DisableColors = false +} + +// DisableColors disables colored logging +func (logger *MasterLogger) DisableColors() { + logger.Formatter.(*TextFormatter).DisableColors = true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logging.go b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logging.go new file mode 100644 index 00000000..f7b86ffc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logging.go @@ -0,0 +1,79 @@ +/* +Package logging provides application logging utilities +*/ +package logging + +import ( + "errors" + "io" + "io/ioutil" + "strings" + + "github.com/sirupsen/logrus" +) + +var log = NewMasterLogger() + +const ( + // logModuleKey is the key used for the module name data entry + logModuleKey = "_module" + // logPriorityKey is the log entry key for priority log statements + logPriorityKey = "_priority" + // logPriorityCritical is the log entry value for priority log statements + logPriorityCritical = "CRITICAL" +) + +// LevelFromString returns a logrus.Level from a string identifier +func LevelFromString(s string) (logrus.Level, error) { + switch strings.ToLower(s) { + case "debug": + return logrus.DebugLevel, nil + case "info", "notice": + return logrus.InfoLevel, nil + case "warn", "warning": + return logrus.WarnLevel, nil + case "error": + return logrus.ErrorLevel, nil + case "fatal", "critical": + return logrus.FatalLevel, nil + case "panic": + return logrus.PanicLevel, nil + default: + return logrus.DebugLevel, errors.New("could not convert string to log level") + } +} + +// MustGetLogger returns a package-aware logger from the master logger +func MustGetLogger(module string) *Logger { + return log.PackageLogger(module) +} + +// AddHook adds a hook to the global logger +func AddHook(hook logrus.Hook) { + log.AddHook(hook) +} + +// EnableColors enables colored logging +func EnableColors() { + log.EnableColors() +} + +// DisableColors disables colored logging +func DisableColors() { + log.DisableColors() +} + +// SetLevel sets the logger's minimum log level +func SetLevel(level logrus.Level) { + log.SetLevel(level) +} + +// SetOutputTo sets the logger's output to an io.Writer +func SetOutputTo(w io.Writer) { + log.Out = w +} + +// Disable disables the logger completely +func Disable() { + log.Out = ioutil.Discard +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil.go b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil.go new file mode 100644 index 00000000..d1b7a191 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil.go @@ -0,0 +1,81 @@ +// Package mathutil provides math utilities +package mathutil + +import ( + "errors" + "math" +) + +var ( + // ErrUint64MultOverflow is returned if when multiplying uint64 values would overflow uint64 + ErrUint64MultOverflow = errors.New("uint64 multiplication overflow") + // ErrUint64AddOverflow is returned if when adding uint64 values would overflow uint64 + ErrUint64AddOverflow = errors.New("uint64 addition overflow") + // ErrUint32AddOverflow is returned if when adding uint32 values would overflow uint32 + ErrUint32AddOverflow = errors.New("uint32 addition overflow") + // ErrUint64OverflowsInt64 is returned if when converting a uint64 to an int64 would overflow int64 + ErrUint64OverflowsInt64 = errors.New("uint64 overflows int64") + // ErrInt64UnderflowsUint64 is returned if when converting an int64 to a uint64 would underflow uint64 + ErrInt64UnderflowsUint64 = errors.New("int64 underflows uint64") + // ErrIntUnderflowsUint32 is returned if when converting an int to a uint32 would underflow uint32 + ErrIntUnderflowsUint32 = errors.New("int underflows uint32") + // ErrIntOverflowsUint32 is returned if when converting an int to a uint32 would overflow uint32 + ErrIntOverflowsUint32 = errors.New("int overflows uint32") +) + +// MultUint64 multiplies a by b, returning an error if the values would overflow +func MultUint64(a, b uint64) (uint64, error) { + c := a * b + if a != 0 && c/a != b { + return 0, ErrUint64MultOverflow + } + return c, nil +} + +// AddUint64 adds a and b, returning an error if the values would overflow +func AddUint64(a, b uint64) (uint64, error) { + c := a + b + if c < a || c < b { + return 0, ErrUint64AddOverflow + } + return c, nil +} + +// AddUint32 adds a and b, returning an error if the values would overflow +func AddUint32(a, b uint32) (uint32, error) { + c := a + b + if c < a || c < b { + return 0, ErrUint32AddOverflow + } + return c, nil +} + +// Uint64ToInt64 converts a uint64 to an int64, returning an error if the uint64 value overflows int64 +func Uint64ToInt64(a uint64) (int64, error) { + b := int64(a) + if b < 0 { + return 0, ErrUint64OverflowsInt64 + } + return b, nil +} + +// Int64ToUint64 converts an int64 to a uint64, returning an error if the int64 value underflows uint64 +func Int64ToUint64(a int64) (uint64, error) { + if a < 0 { + return 0, ErrInt64UnderflowsUint64 + } + return uint64(a), nil +} + +// IntToUint32 converts int to uint32, returning an error if the int value is negative or overflows uint32 +func IntToUint32(a int) (uint32, error) { + if a < 0 { + return 0, ErrIntUnderflowsUint32 + } + + if uint64(a) > math.MaxUint32 { + return 0, ErrIntOverflowsUint32 + } + + return uint32(a), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_64bit_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_64bit_test.go new file mode 100644 index 00000000..8afabad9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_64bit_test.go @@ -0,0 +1,40 @@ +// +build !386,!amd64p32,!arm,!armbe,!mips,!mipsle,!mips64p32,!mips64p32le,!ppc,!s390,!sparc + +package mathutil + +import ( + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" +) + +func Test64BitIntToUint32(t *testing.T) { + // Remaining tests defined in TestIntToUint32 + cases := []struct { + a int + b uint32 + err error + }{ + { + a: math.MaxUint32 + 1, + err: ErrIntOverflowsUint32, + }, + { + a: math.MaxUint32, + b: math.MaxUint32, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := IntToUint32(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_test.go new file mode 100644 index 00000000..6d3e8f0f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_test.go @@ -0,0 +1,153 @@ +package mathutil + +import ( + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAddUint64(t *testing.T) { + n, err := AddUint64(10, 11) + require.NoError(t, err) + require.Equal(t, uint64(21), n) + + _, err = AddUint64(math.MaxUint64, 1) + require.Error(t, err) +} + +func TestAddUint32(t *testing.T) { + n, err := AddUint32(10, 11) + require.NoError(t, err) + require.Equal(t, uint32(21), n) + + _, err = AddUint32(math.MaxUint32, 1) + require.Error(t, err) +} + +func TestMultUint64(t *testing.T) { + n, err := MultUint64(10, 11) + require.NoError(t, err) + require.Equal(t, uint64(110), n) + + _, err = MultUint64(math.MaxUint64/2, 3) + require.Error(t, err) +} + +func TestUint64ToInt64(t *testing.T) { + cases := []struct { + a uint64 + b int64 + err error + }{ + { + a: 0, + b: 0, + }, + { + a: 1, + b: 1, + }, + { + a: math.MaxInt64, + b: math.MaxInt64, + }, + { + a: math.MaxUint64, + err: ErrUint64OverflowsInt64, + }, + { + a: math.MaxInt64 + 1, + err: ErrUint64OverflowsInt64, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := Uint64ToInt64(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} + +func TestInt64ToUint64(t *testing.T) { + cases := []struct { + a int64 + b uint64 + err error + }{ + { + a: 0, + b: 0, + }, + { + a: 1, + b: 1, + }, + { + a: math.MaxInt64, + b: math.MaxInt64, + }, + { + a: -math.MaxInt64, + err: ErrInt64UnderflowsUint64, + }, + { + a: -1, + err: ErrInt64UnderflowsUint64, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := Int64ToUint64(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} + +func TestIntToUint32(t *testing.T) { + cases := []struct { + a int + b uint32 + err error + }{ + { + a: 0, + b: 0, + }, + { + a: -1, + err: ErrIntUnderflowsUint32, + }, + { + a: math.MaxInt32, + b: math.MaxInt32, + }, + { + a: 999, + b: 999, + }, + // 64bit test defined in Test64BitIntToUint32 + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := IntToUint32(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/timeutil/timeutil.go b/vendor/github.com/SkycoinProject/skycoin/src/util/timeutil/timeutil.go new file mode 100644 index 00000000..75486840 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/timeutil/timeutil.go @@ -0,0 +1,15 @@ +/* +Package timeutil provides time related utility methods +*/ +package timeutil + +import "time" + +// NanoToTime converts nanoseconds to time.Time +func NanoToTime(n int64) time.Time { + zeroTime := time.Time{} + if n == zeroTime.UnixNano() { + return zeroTime + } + return time.Unix(n/int64(time.Second), n%int64(time.Second)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent.go b/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent.go new file mode 100644 index 00000000..b338aed3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent.go @@ -0,0 +1,222 @@ +// Package useragent implements methods for managing Skycoin user agents. +// +// A skycoin user agent has the following format: +// +// `$NAME:$VERSION[$GIT_HASH]($REMARK)` +// +// `$NAME` and `$VERSION` are required. +// +// * `$NAME` is the coin or application's name, e.g. `Skycoin`. It can contain the following characters: `A-Za-z0-9\-_+`. +// * `$VERSION` must be a valid [semver](http://semver.org/) version, e.g. `1.2.3` or `1.2.3-rc1`. +// Semver has the option of including build metadata such as the git commit hash, but this is not included by the default client. +// * `$REMARK` is optional. If not present, the enclosing brackets `()` should be omitted. +// It can contain the following characters: `A-Za-z0-9\-_+;:!$%,.=?~ ` (includes the space character). +package useragent + +import ( + "encoding/json" + "errors" + "fmt" + "regexp" + "strings" + + "github.com/blang/semver" +) + +const ( + // IllegalChars are printable ascii characters forbidden from a user agent string. All other ascii or bytes are also forbidden. + IllegalChars = `<>&"'#@|{}` + "`" + // MaxLen the maximum length of a user agent + MaxLen = 256 + + // NamePattern is the regex pattern for the name portion of the user agent + NamePattern = `[A-Za-z0-9\-_+]+` + // VersionPattern is the regex pattern for the version portion of the user agent + VersionPattern = `[0-9]+\.[0-9]+\.[0-9][A-Za-z0-9\-.+]*` + // RemarkPattern is the regex pattern for the remark portion of the user agent + RemarkPattern = `[A-Za-z0-9\-_+;:!$%,.=?~ ]+` + + // Pattern is the regex pattern for the user agent in entirety + Pattern = `^(` + NamePattern + `):(` + VersionPattern + `)(\(` + RemarkPattern + `\))?$` +) + +var ( + illegalCharsSanitizeRe *regexp.Regexp + illegalCharsCheckRe *regexp.Regexp + re *regexp.Regexp + + // ErrIllegalChars user agent contains illegal characters + ErrIllegalChars = errors.New("User agent has invalid character(s)") + // ErrTooLong user agent exceeds a certain max length + ErrTooLong = errors.New("User agent is too long") + // ErrMalformed user agent does not match the user agent pattern + ErrMalformed = errors.New("User agent is malformed") + // ErrEmpty user agent is an empty string + ErrEmpty = errors.New("User agent is an empty string") +) + +func init() { + illegalCharsSanitizeRe = regexp.MustCompile(fmt.Sprintf("([^[:print:]]|[%s])+", IllegalChars)) + illegalCharsCheckRe = regexp.MustCompile(fmt.Sprintf("[^[:print:]]|[%s]", IllegalChars)) + re = regexp.MustCompile(Pattern) +} + +// Data holds parsed user agent data +type Data struct { + Coin string + Version string + Remark string +} + +// Empty returns true if the Data is empty +func (d Data) Empty() bool { + return d == (Data{}) +} + +// Build builds a user agent string. Returns an error if the user agent would be invalid. +func (d Data) Build() (string, error) { + if d.Coin == "" { + return "", errors.New("missing coin name") + } + if d.Version == "" { + return "", errors.New("missing version") + } + + _, err := semver.Parse(d.Version) + if err != nil { + return "", err + } + + s := d.build() + + if err := validate(s); err != nil { + return "", err + } + + d2, err := Parse(s) + if err != nil { + return "", fmt.Errorf("Built a user agent that fails to parse: %q %v", s, err) + } + + if d2 != d { + return "", errors.New("Built a user agent that does not parse to the original format") + } + + return s, nil +} + +// MustBuild calls Build and panics on error +func (d Data) MustBuild() string { + s, err := d.Build() + if err != nil { + panic(err) + } + return s +} + +func (d Data) build() string { + if d.Coin == "" || d.Version == "" { + return "" + } + + remark := d.Remark + if remark != "" { + remark = fmt.Sprintf("(%s)", remark) + } + + return fmt.Sprintf("%s:%s%s", d.Coin, d.Version, remark) +} + +// MarshalJSON marshals Data as JSON +func (d Data) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, d.build())), nil +} + +// UnmarshalJSON unmarshals []byte to Data +func (d *Data) UnmarshalJSON(v []byte) error { + var s string + if err := json.Unmarshal(v, &s); err != nil { + return err + } + + if s == "" { + return nil + } + + parsed, err := Parse(s) + if err != nil { + return err + } + + *d = parsed + return nil +} + +// Parse parses a user agent string to Data +func Parse(userAgent string) (Data, error) { + if len(userAgent) == 0 { + return Data{}, ErrEmpty + } + + if err := validate(userAgent); err != nil { + return Data{}, err + } + + subs := re.FindAllStringSubmatch(userAgent, -1) + + if len(subs) == 0 { + return Data{}, ErrMalformed + } + + m := subs[0] + + if m[0] != userAgent { + // This should not occur since the pattern has ^$ boundaries applied, but just in case + return Data{}, errors.New("User agent did not match pattern completely") + } + + coin := m[1] + version := m[2] + remark := m[3] + + if _, err := semver.Parse(version); err != nil { + return Data{}, fmt.Errorf("User agent version is not a valid semver: %v", err) + } + + remark = strings.TrimPrefix(remark, "(") + remark = strings.TrimSuffix(remark, ")") + + return Data{ + Coin: coin, + Version: version, + Remark: remark, + }, nil +} + +// MustParse parses and panics on error +func MustParse(userAgent string) Data { + d, err := Parse(userAgent) + if err != nil { + panic(err) + } + + return d +} + +// validate validates a user agent string. The user agent must not contain illegal characters. +func validate(userAgent string) error { + if len(userAgent) > MaxLen { + return ErrTooLong + } + + if illegalCharsCheckRe.MatchString(userAgent) { + return ErrIllegalChars + } + + return nil +} + +// Sanitize removes illegal characters from a user agent string +func Sanitize(userAgent string) string { + return illegalCharsSanitizeRe.ReplaceAllLiteralString(userAgent, "") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent_test.go new file mode 100644 index 00000000..b3f71351 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent_test.go @@ -0,0 +1,270 @@ +package useragent + +import ( + "encoding/json" + "errors" + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestDataBuild(t *testing.T) { + cases := []struct { + name string + data Data + userAgent string + err error + }{ + { + name: "without remark", + userAgent: "Skycoin:0.24.1", + data: Data{ + Coin: "Skycoin", + Version: "0.24.1", + }, + }, + { + name: "with remark", + userAgent: "Skycoin:0.24.1(remark; foo)", + data: Data{ + Coin: "Skycoin", + Version: "0.24.1", + Remark: "remark; foo", + }, + }, + { + name: "invalid characters in coin", + data: Data{ + Coin: "foo<>", + Version: "0.24.1", + }, + err: ErrIllegalChars, + }, + { + name: "invalid characters in version", + data: Data{ + Coin: "foo", + Version: "<0.24.1", + }, + err: errors.New(`Invalid character(s) found in major number "<0"`), + }, + { + name: "invalid characters in remark", + data: Data{ + Coin: "foo", + Version: "0.24.1", + Remark: "<>", + }, + err: ErrIllegalChars, + }, + { + name: "missing coin", + data: Data{ + Version: "0.24.1", + }, + err: errors.New("missing coin name"), + }, + { + name: "missing version", + data: Data{ + Coin: "Skycoin", + }, + err: errors.New("missing version"), + }, + { + name: "version is not valid semver", + data: Data{ + Coin: "Skycoin", + Version: "0.24", + }, + err: errors.New("No Major.Minor.Patch elements found"), + }, + { + name: "invalid remark", + data: Data{ + Coin: "skycoin", + Version: "0.24.1", + Remark: "\t", + }, + err: ErrIllegalChars, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + userAgent, err := tc.data.Build() + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + require.Equal(t, tc.userAgent, userAgent) + }) + } +} + +func TestParse(t *testing.T) { + cases := []struct { + name string + userAgent string + data Data + err error + }{ + { + name: "too long", + userAgent: fmt.Sprintf("skycoin:0.24.1[abcdefg](%s)", strings.Repeat("a", 245)), + err: ErrTooLong, + }, + { + name: "no tab chars allowed", + userAgent: "skycoin:0.24.1(\t)", + err: ErrIllegalChars, + }, + { + name: "no newlines allowed", + userAgent: "skycoin:0.24.1(\n)", + err: ErrIllegalChars, + }, + { + name: "valid", + userAgent: "skycoin:0.25.0", + data: Data{ + Coin: "skycoin", + Version: "0.25.0", + }, + }, + { + name: "valid, version has suffix", + userAgent: "skycoin:0.25.1", + data: Data{ + Coin: "skycoin", + Version: "0.25.1", + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + d, err := Parse(tc.userAgent) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + require.Equal(t, tc.data, d) + }) + } +} + +func TestDataJSON(t *testing.T) { + d := Data{} + + x, err := json.Marshal(d) + require.NoError(t, err) + require.Equal(t, `""`, string(x)) + + d.Coin = "skycoin" + d.Version = "0.25.0" + + x, err = json.Marshal(d) + require.NoError(t, err) + require.Equal(t, `"skycoin:0.25.0"`, string(x)) + + var e Data + err = json.Unmarshal([]byte(x), &e) + require.NoError(t, err) + require.Equal(t, d, e) + + d.Remark = "foo; bar" + + x, err = json.Marshal(d) + require.NoError(t, err) + require.Equal(t, `"skycoin:0.25.0(foo; bar)"`, string(x)) + + e = Data{} + err = json.Unmarshal([]byte(x), &e) + require.NoError(t, err) + require.Equal(t, d, e) + + // Fails, does not parse to a string + err = json.Unmarshal([]byte("{}"), &e) + require.Error(t, err) + + // OK, empty string + e = Data{} + err = json.Unmarshal([]byte(`""`), &e) + require.NoError(t, err) + require.Equal(t, Data{}, e) + + // Fails, does not parse + err = json.Unmarshal([]byte(`"skycoin:0.25.0(<>)"`), &e) + require.Equal(t, ErrIllegalChars, err) +} + +func TestSanitize(t *testing.T) { + for i := 0; i < len(IllegalChars); i++ { + x := "t" + IllegalChars[i:i+1] + t.Run(x, func(t *testing.T) { + require.Equal(t, "t", Sanitize(x)) + }) + } + + for i := 0; i < 256; i++ { + j := byte(i) + if j >= ' ' || j <= '~' { + continue + } + + v := []byte{'t', j} + + t.Run(fmt.Sprintf("%q", j), func(t *testing.T) { + require.Equal(t, "t", Sanitize(string(v))) + }) + } + + z := "dog\t\t\t\ncat\x01t\xE3\xE4t" + require.Equal(t, "dogcattt", Sanitize(z)) + + // Should not have anything stripped + x := "Skycoin:0.25.0(foo; bar)" + require.Equal(t, x, Sanitize(x)) + + // Should not have anything stripped + x = "Skycoin:0.25.1(foo; bar)" + require.Equal(t, x, Sanitize(x)) +} + +func TestEmpty(t *testing.T) { + var d Data + require.True(t, d.Empty()) + + d.Coin = "skycoin" + d.Version = "0.25.0" + require.False(t, d.Empty()) +} + +func TestMustParse(t *testing.T) { + d := MustParse("skycoin:0.25.0") + require.Equal(t, Data{ + Coin: "skycoin", + Version: "0.25.0", + }, d) + + require.Panics(t, func() { + MustParse("foo") //nolint:errcheck + }) +} + +func TestMustBuild(t *testing.T) { + d := Data{ + Version: "0", + } + require.Panics(t, func() { + d.MustBuild() //nolint:errcheck + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain.go new file mode 100644 index 00000000..0d251b8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain.go @@ -0,0 +1,852 @@ +package visor + +import ( + "bytes" + "errors" + "fmt" + "sync" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +const ( + // DebugLevel1 checks for extremely unlikely conditions (10e-40) + DebugLevel1 = true + // DebugLevel2 enable checks for impossible conditions + DebugLevel2 = true +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +// ErrBlockNotExist may be returned if a block is not found +type ErrBlockNotExist struct { + Seq uint64 +} + +// NewErrBlockNotExist creates an ErrBlockNotExist based on an unknown block sequence +func NewErrBlockNotExist(seq uint64) ErrBlockNotExist { + return ErrBlockNotExist{ + Seq: seq, + } +} + +func (e ErrBlockNotExist) Error() string { + return fmt.Sprintf("block does not exist seq=%d", e.Seq) +} + +//Warning: 10e6 is 10 million, 1e6 is 1 million + +// Note: DebugLevel1 adds additional checks for hash collisions that +// are unlikely to occur. DebugLevel2 adds checks for conditions that +// can only occur through programmer error and malice. + +// Note: a droplet is the base coin unit. Each Skycoin is one million droplets + +//Termonology: +// UXTO - unspent transaction outputs +// UX - outputs10 +// TX - transactions + +//Notes: +// transactions (TX) consume outputs (UX) and produce new outputs (UX) +// Tx.Uxi() - set of outputs consumed by transaction +// Tx.Uxo() - set of outputs created by transaction + +// chainStore +type chainStore interface { + Head(*dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(*dbutil.Tx) (uint64, bool, error) + Len(*dbutil.Tx) (uint64, error) + AddBlock(*dbutil.Tx, *coin.SignedBlock) error + GetBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetSignedBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(*dbutil.Tx, uint64) (*coin.SignedBlock, error) + UnspentPool() blockdb.UnspentPooler + GetGenesisBlock(*dbutil.Tx) (*coin.SignedBlock, error) + GetBlockSignature(*dbutil.Tx, *coin.Block) (cipher.Sig, bool, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error +} + +// DefaultWalker default blockchain walker +func DefaultWalker(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + if len(hps) == 0 { + return cipher.SHA256{}, false + } + return hps[0].Hash, true +} + +// CreateBuckets creates the buckets used by the blockdb +func CreateBuckets(db *dbutil.DB) error { + return db.Update("CreateBuckets", func(tx *dbutil.Tx) error { + if err := historydb.CreateBuckets(tx); err != nil { + return err + } + + if err := blockdb.CreateBuckets(tx); err != nil { + return err + } + + return dbutil.CreateBuckets(tx, [][]byte{ + UnconfirmedTxnsBkt, + UnconfirmedUnspentsBkt, + }) + }) +} + +// BlockchainConfig configures Blockchain options +type BlockchainConfig struct { + // Arbitrating mode: if in arbitrating mode, when block publishing node execute blocks, + // the invalid transaction will be skipped and continue the next; otherwise, + // node will throw the error and return. + Arbitrating bool + Pubkey cipher.PubKey +} + +// Blockchain maintains blockchain and provides apis for accessing the chain. +type Blockchain struct { + db *dbutil.DB + cfg BlockchainConfig + store chainStore +} + +// NewBlockchain creates a Blockchain +func NewBlockchain(db *dbutil.DB, cfg BlockchainConfig) (*Blockchain, error) { + chainstore, err := blockdb.NewBlockchain(db, DefaultWalker) + if err != nil { + return nil, err + } + + return &Blockchain{ + cfg: cfg, + db: db, + store: chainstore, + }, nil +} + +// GetGenesisBlock returns genesis block +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.GetGenesisBlock(tx) +} + +// GetSignedBlockByHash returns block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockByHash(tx, hash) +} + +// GetSignedBlockBySeq returns block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockBySeq(tx, seq) +} + +// Head returns the most recent confirmed block +func (bc Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.Head(tx) +} + +// Unspent returns the unspent outputs pool +func (bc *Blockchain) Unspent() blockdb.UnspentPooler { + return bc.store.UnspentPool() +} + +// Len returns the length of current blockchain. +func (bc Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + return bc.store.Len(tx) +} + +// HeadSeq returns the sequence of head block +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.store.HeadSeq(tx) +} + +// Time returns time of last block +// used as system clock indepedent clock for coin hour calculations +// TODO: Deprecate +func (bc *Blockchain) Time(tx *dbutil.Tx) (uint64, error) { + b, err := bc.Head(tx) + if err != nil { + if err == blockdb.ErrNoHeadBlock { + return 0, nil + } + return 0, err + } + + return b.Time(), nil +} + +// NewBlock creates a Block given an array of Transactions. +// Only hard constraints are applied to transactions in the block. +// The caller of this function should apply any additional soft constraints, +// and choose which transactions to place into the block. +func (bc Blockchain) NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) { + if len(txns) == 0 { + return nil, errors.New("No transactions") + } + + head, err := bc.store.Head(tx) + if err != nil { + return nil, err + } + + if currentTime <= head.Time() { + return nil, errors.New("Time can only move forward") + } + + txns, err = bc.processTransactions(tx, txns) + if err != nil { + return nil, err + } + + uxHash, err := bc.Unspent().GetUxHash(tx) + if err != nil { + return nil, err + } + + feeCalc := bc.TransactionFee(tx, head.Time()) + + b, err := coin.NewBlock(head.Block, currentTime, uxHash, txns, feeCalc) + if err != nil { + return nil, err + } + + // make sure block is valid + if DebugLevel2 { + if err := bc.verifyBlockHeader(tx, *b); err != nil { + return nil, err + } + txns, err := bc.processTransactions(tx, b.Body.Transactions) + if err != nil { + logger.Panicf("bc.processTransactions second verification call failed: %v", err) + } + b.Body.Transactions = txns + } + return b, nil +} + +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b coin.SignedBlock) (coin.SignedBlock, error) { + length, err := bc.Len(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + if length > 0 { + if isGenesis, err := bc.isGenesisBlock(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } else if isGenesis { + err := errors.New("Attempted to process genesis block after blockchain has genesis block") + logger.Warning(err.Error()) + return coin.SignedBlock{}, err + } else { + if err := bc.verifyBlockHeader(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + txns, err := bc.processTransactions(tx, b.Body.Transactions) + if err != nil { + return coin.SignedBlock{}, err + } + b.Body.Transactions = txns + + if err := bc.verifyUxHash(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + } + } + + return b, nil +} + +// ExecuteBlock attempts to append block to blockchain with *dbutil.Tx +func (bc *Blockchain) ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + length, err := bc.Len(tx) + if err != nil { + return err + } + + if length > 0 { + head, err := bc.Head(tx) + if err != nil { + return err + } + + // TODO -- why do we modify the block here? + sb.Head.PrevHash = head.HashHeader() + } + + nb, err := bc.processBlock(tx, *sb) + if err != nil { + return err + } + + if err := bc.store.AddBlock(tx, &nb); err != nil { + return err + } + + return nil +} + +// VerifyBlock verifies specified block against current state of blockchain. +func (bc *Blockchain) VerifyBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + _, err := bc.processBlock(tx, *sb) + + return err +} + +// isGenesisBlock checks if the block is genesis block +func (bc Blockchain) isGenesisBlock(tx *dbutil.Tx, b coin.Block) (bool, error) { + gb, err := bc.store.GetGenesisBlock(tx) + if err != nil { + return false, err + } + if gb == nil { + return false, nil + } + + return gb.HashHeader() == b.HashHeader(), nil +} + +// Compares the state of the current UxHash hash to state of unspent +// output pool. +func (bc Blockchain) verifyUxHash(tx *dbutil.Tx, b coin.Block) error { + uxHash, err := bc.Unspent().GetUxHash(tx) + if err != nil { + return err + } + + if !bytes.Equal(b.Head.UxHash[:], uxHash[:]) { + return errors.New("UxHash does not match") + } + + return nil +} + +// VerifyBlockTxnConstraints checks that the transaction does not violate hard constraints, +// for transactions that are already included in a block. +func (bc Blockchain) VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + switch err.(type) { + case blockdb.ErrUnspentNotExist: + return NewErrTxnViolatesHardConstraint(err) + default: + return err + } + } + + head, err := bc.Head(tx) + if err != nil { + return err + } + + return bc.verifyBlockTxnHardConstraints(tx, txn, head, uxIn) +} + +func (bc Blockchain) verifyBlockTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + if err := VerifyBlockTxnConstraints(txn, head.Head, uxIn); err != nil { + return err + } + + if DebugLevel1 { + // Check that new unspents don't collide with existing. + // This should not occur but is a sanity check. + // NOTE: this is not in the top-level VerifyBlockTxnConstraints + // because it relies on the unspent pool to check for existence. + // For remote callers such as the CLI, they'd need to download the whole + // unspent pool or make a separate API call to check for duplicate unspents. + uxOuts := coin.CreateUnspents(head.Head, txn) + for i := range uxOuts { + if contains, err := bc.Unspent().Contains(tx, uxOuts[i].Hash()); err != nil { + return err + } else if contains { + err := errors.New("New unspent collides with existing unspent") + return NewErrTxnViolatesHardConstraint(err) + } + } + } + + return nil +} + +// VerifySingleTxnHardConstraints checks that the transaction does not violate hard constraints. +// for transactions that are not included in a block. +func (bc Blockchain) VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, signed TxnSignedFlag) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + switch err.(type) { + case blockdb.ErrUnspentNotExist: + return NewErrTxnViolatesHardConstraint(err) + default: + return err + } + } + + head, err := bc.Head(tx) + if err != nil { + return err + } + + return bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn, signed) +} + +// VerifySingleTxnSoftHardConstraints checks that the transaction does not violate hard or soft constraints, +// for transactions that are not included in a block. +// Hard constraints are checked before soft constraints. +func (bc Blockchain) VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn, signed TxnSignedFlag) (*coin.SignedBlock, coin.UxArray, error) { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + return nil, nil, NewErrTxnViolatesHardConstraint(err) + } + + head, err := bc.Head(tx) + if err != nil { + return nil, nil, err + } + + // Hard constraints must be checked before soft constraints + if err := bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn, signed); err != nil { + return nil, nil, err + } + + if err := VerifySingleTxnSoftConstraints(txn, head.Time(), uxIn, distParams, verifyParams); err != nil { + return nil, nil, err + } + + return head, uxIn, nil +} + +func (bc Blockchain) verifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray, signed TxnSignedFlag) error { + if err := VerifySingleTxnHardConstraints(txn, head.Head, uxIn, signed); err != nil { + return err + } + + if DebugLevel1 { + // Check that new unspents don't collide with existing. + // This should not occur but is a sanity check. + // NOTE: this is not in the top-level VerifySingleTxnHardConstraints + // because it relies on the unspent pool to check for existence. + // For remote callers such as the CLI, they'd need to download the whole + // unspent pool or make a separate API call to check for duplicate unspents. + uxOuts := coin.CreateUnspents(head.Head, txn) + for i := range uxOuts { + if contains, err := bc.Unspent().Contains(tx, uxOuts[i].Hash()); err != nil { + return err + } else if contains { + err := errors.New("New unspent collides with existing unspent") + return NewErrTxnViolatesHardConstraint(err) + } + } + } + + return nil +} + +// GetBlocks returns blocks matching seqs. If any block is not found, returns an error. +func (bc Blockchain) GetBlocks(tx *dbutil.Tx, seqs []uint64) ([]coin.SignedBlock, error) { + blocks := make([]coin.SignedBlock, len(seqs)) + + for i, s := range seqs { + b, err := bc.store.GetSignedBlockBySeq(tx, s) + if err != nil { + return nil, err + } + + if b == nil { + return nil, NewErrBlockNotExist(s) + } + + blocks[i] = *b + } + + return blocks, nil +} + +// GetBlocksInRange return blocks whose seq are in the range of start and end. +func (bc Blockchain) GetBlocksInRange(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) { + if start > end { + return nil, nil + } + + var blocks []coin.SignedBlock + for i := start; i <= end; i++ { + b, err := bc.store.GetSignedBlockBySeq(tx, i) + if err != nil { + logger.WithError(err).Error("bc.store.GetSignedBlockBySeq failed") + return nil, err + } + + if b == nil { + break + } + + blocks = append(blocks, *b) + } + + return blocks, nil +} + +// GetLastBlocks return the latest N blocks. +func (bc Blockchain) GetLastBlocks(tx *dbutil.Tx, num uint64) ([]coin.SignedBlock, error) { + if num == 0 { + return nil, nil + } + + end, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } + if !ok { + return nil, nil + } + + start := int(end-num) + 1 + if start < 0 { + start = 0 + } + + return bc.GetBlocksInRange(tx, uint64(start), end) +} + +/* Private */ + +// Validates a set of Transactions, individually, against each other and +// against the Blockchain. If firstFail is true, it will return an error +// as soon as it encounters one. Else, it will return an array of +// Transactions that are valid as a whole. It may return an error if +// firstFalse is false, if there is no way to filter the txns into a valid +// array, i.e. processTransactions(processTransactions(txn, false), true) +// should not result in an error, unless all txns are invalid. +// TODO: +// - move arbitration to visor +// - blockchain should have strict checking +func (bc Blockchain) processTransactions(tx *dbutil.Tx, txs coin.Transactions) (coin.Transactions, error) { + // copy txs so that the following code won't modify the original txns + txns := make(coin.Transactions, len(txs)) + copy(txns, txs) + + head, err := bc.store.Head(tx) + if err != nil { + return nil, err + } + + // Transactions need to be sorted by fee and hash before arbitrating + if bc.cfg.Arbitrating { + txns, err = coin.SortTransactions(txns, bc.TransactionFee(tx, head.Time())) + if err != nil { + logger.Critical().WithError(err).Error("processTransactions: coin.SortTransactions failed") + return nil, err + } + } + + //TODO: audit + if len(txns) == 0 { + if bc.cfg.Arbitrating { + return txns, nil + } + + // If there are no transactions, a block should not be made + return nil, errors.New("No transactions") + } + + skip := make(map[int]struct{}) + uxHashes := make(coin.UxHashSet, len(txns)) + for i, txn := range txns { + // Check the transaction against itself. This covers the hash, + // signature indices and duplicate spends within itself + if err := bc.VerifyBlockTxnConstraints(tx, txn); err != nil { + switch err.(type) { + case ErrTxnViolatesSoftConstraint: + logger.Critical().WithError(err).Panic("bc.VerifyBlockTxnConstraints should not return a ErrTxnViolatesSoftConstraint error") + case ErrTxnViolatesHardConstraint: + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } + } + + return nil, err + } + + // Check that each pending unspent will be unique + uxb := coin.UxBody{ + SrcTransaction: txn.Hash(), + } + + for _, to := range txn.Out { + uxb.Coins = to.Coins + uxb.Hours = to.Hours + uxb.Address = to.Address + + h := uxb.Hash() + _, exists := uxHashes[h] + if exists { + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } else { + return nil, errors.New("Duplicate unspent output across transactions") + } + } + + if DebugLevel1 { + // Check that the expected unspent is not already in the pool. + // This should never happen because its a hash collision + if contains, err := bc.Unspent().Contains(tx, h); err != nil { + return nil, err + } else if contains { + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } else { + return nil, errors.New("Output hash is in the UnspentPool") + } + } + } + + uxHashes[h] = struct{}{} + } + } + + // Filter invalid transactions before arbitrating between colliding ones + if len(skip) > 0 { + newtxns := make(coin.Transactions, len(txns)-len(skip)) + j := 0 + for i := range txns { + if _, shouldSkip := skip[i]; !shouldSkip { + newtxns[j] = txns[i] + j++ + } + } + txns = newtxns + skip = make(map[int]struct{}) + } + + // Check to ensure that there are no duplicate spends in the entire block, + // and that we aren't creating duplicate outputs. Duplicate outputs + // within a single Transaction are already checked by VerifyBlockTxnConstraints + hashes := txns.Hashes() + for i := 0; i < len(txns)-1; i++ { + s := txns[i] + for j := i + 1; j < len(txns); j++ { + t := txns[j] + if DebugLevel1 { + if hashes[i] == hashes[j] { + // This is a non-recoverable error for filtering, and + // should never occur. It indicates a hash collision + // amongst different txns. Duplicate transactions are + // caught earlier, when duplicate expected outputs are + // checked for, and will not trigger this. + return nil, errors.New("Unexpected duplicate transaction") + } + } + for a := range s.In { + for b := range t.In { + if s.In[a] == t.In[b] { + if bc.cfg.Arbitrating { + // The txn with the highest fee and lowest hash + // is chosen when attempting a double spend. + // Since the txns are sorted, we skip the 2nd + // iterable + skip[j] = struct{}{} + } else { + return nil, errors.New("Cannot spend output twice in the same block") + } + } + } + } + } + } + + // Filter the final results, if necessary + if len(skip) > 0 { + newtxns := make(coin.Transactions, 0, len(txns)-len(skip)) + for i := range txns { + if _, shouldSkip := skip[i]; !shouldSkip { + newtxns = append(newtxns, txns[i]) + } + } + return newtxns, nil + } + + return txns, nil +} + +// TransactionFee calculates the current transaction fee in coinhours of a Transaction +func (bc Blockchain) TransactionFee(tx *dbutil.Tx, headTime uint64) coin.FeeCalculator { + return func(txn *coin.Transaction) (uint64, error) { + inUxs, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + return 0, err + } + + return fee.TransactionFee(txn, headTime, inUxs) + } +} + +// VerifySignature checks that BlockSigs state correspond with coin.Blockchain state +// and that all signatures are valid. +func (bc *Blockchain) VerifySignature(block *coin.SignedBlock) error { + err := block.VerifySignature(bc.cfg.Pubkey) + if err != nil { + logger.Errorf("Blockchain signature verification failed for block %d: %v", block.Head.BkSeq, err) + } + return err +} + +// WalkChain walk through the blockchain concurrently +// The quit channel is optional and if closed, this method still stop. +func (bc *Blockchain) WalkChain(workers int, f func(*dbutil.Tx, *coin.SignedBlock) error, quit chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + signedBlockC := make(chan *coin.SignedBlock, 100) + errC := make(chan error, 100) + interrupt := make(chan struct{}) + verifyDone := make(chan struct{}) + + // Verify block signatures in a worker pool + var workerWg sync.WaitGroup + workerWg.Add(workers) + for i := 0; i < workers; i++ { + go func() { + defer workerWg.Done() + if err := bc.db.View("WalkChain verify blocks", func(tx *dbutil.Tx) error { + for b := range signedBlockC { + if err := f(tx, b); err != nil { + // if err := cipher.VerifyPubKeySignedHash(bc.cfg.Pubkey, sh.sig, sh.hash); err != nil { + // logger.Errorf("Signature verification failed: %v", err) + select { + case errC <- err: + default: + } + } + } + return nil + }); err != nil { + logger.WithError(err).Error("WalkChain verify blocks db transaction failed") + } + }() + } + + // Wait for verification worker goroutines to finish + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + workerWg.Wait() + close(verifyDone) + }() + + // Iterate all blocks stored in the "blocks" bucket + // * Detect if a corresponding signature is missing from the signatures bucket + // * Verify the signature for the block + wg.Add(1) + go func() { + if err := bc.db.View("WalkChain get blocks", func(tx *dbutil.Tx) error { + if length, err := bc.Len(tx); err != nil { + return err + } else if length == 0 { + return nil + } + defer wg.Done() + defer close(signedBlockC) + + errInterrupted := errors.New("goroutine was stopped") + + if err := bc.store.ForEachBlock(tx, func(block *coin.Block) error { + sig, ok, err := bc.store.GetBlockSignature(tx, block) + if err != nil { + return err + } + if !ok { + return blockdb.NewErrMissingSignature(block) + } + + signedBlock := &coin.SignedBlock{ + Sig: sig, + Block: *block, + } + + select { + case signedBlockC <- signedBlock: + return nil + case <-quit: + return errInterrupted + case <-interrupt: + return errInterrupted + } + }); err != nil && err != errInterrupted { + switch err.(type) { + case blockdb.ErrMissingSignature: + default: + logger.Errorf("bc.store.ForEachBlock failed: %v", err) + } + select { + case errC <- err: + default: + } + } + return nil + }); err != nil { + logger.WithError(err).Error("WalkChain get blocks db transaction failed") + } + }() + + var err error + select { + case err = <-errC: + if err != nil { + break + } + case <-quit: + err = ErrVerifyStopped + break + case <-verifyDone: + break + } + + close(interrupt) + wg.Wait() + return err +} + +// VerifyBlockHeader Returns error if the BlockHeader is not valid +func (bc Blockchain) verifyBlockHeader(tx *dbutil.Tx, b coin.Block) error { + head, err := bc.Head(tx) + if err != nil { + return err + } + + //check BkSeq + if b.Head.BkSeq != head.Head.BkSeq+1 { + return errors.New("BkSeq invalid") + } + //check Time, only requirement is that its monotonely increasing + if b.Head.Time <= head.Head.Time { + return errors.New("Block time must be > head time") + } + // Check block hash against previous head + if b.Head.PrevHash != head.HashHeader() { + return errors.New("PrevHash does not match current head") + } + + if b.Body.Hash() != b.Head.BodyHash { + return errors.New("Computed body hash does not match") + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_test.go new file mode 100644 index 00000000..d5b96796 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_test.go @@ -0,0 +1,864 @@ +package visor + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) +) + +var genTime uint64 = 1000 +var genCoins uint64 = 1000e6 + +func feeCalc(t *coin.Transaction) (uint64, error) { + return 0, nil +} + +func addGenesisBlockToBlockchain(t *testing.T, bc *Blockchain) *coin.SignedBlock { + // create genesis block + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + gbSig := cipher.MustSignHash(gb.HashHeader(), genSecret) + + // add genesis block to blockchain + err = bc.db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, &coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + }) + }) + require.NoError(t, err) + + return &coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + } +} + +func makeSpendTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + require.True(t, coins <= totalCoins) + + hours := totalHours / 4 + + err := spendTxn.PushOutput(toAddr, coins, hours) + require.NoError(t, err) + if totalCoins-coins != 0 { + err := spendTxn.PushOutput(uxs[0].Body.Address, totalCoins-coins, totalHours/4) + require.NoError(t, err) + } + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +/* Helpers */ +type fakeChainStore struct { + blocks []coin.SignedBlock +} + +func (fcs *fakeChainStore) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + l := len(fcs.blocks) + if l == 0 { + return nil, blockdb.ErrNoHeadBlock + } + + return &fcs.blocks[l-1], nil +} + +func (fcs *fakeChainStore) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + h, err := fcs.Head(tx) + if err != nil { + if err == blockdb.ErrNoHeadBlock { + return 0, false, nil + } + return 0, false, err + } + return h.Seq(), true, nil +} + +func (fcs *fakeChainStore) Len(tx *dbutil.Tx) (uint64, error) { + return uint64(len(fcs.blocks)), nil +} + +func (fcs *fakeChainStore) AddBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + return nil +} + +func (fcs *fakeChainStore) GetBlockSignature(tx *dbutil.Tx, b *coin.Block) (cipher.Sig, bool, error) { + return cipher.Sig{}, false, nil +} + +func (fcs *fakeChainStore) GetBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + return nil, nil +} + +func (fcs *fakeChainStore) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + return nil, nil +} + +func (fcs *fakeChainStore) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + l := len(fcs.blocks) + if seq >= uint64(l) { + return nil, nil + } + + return &fcs.blocks[seq], nil +} + +func (fcs *fakeChainStore) UnspentPool() blockdb.UnspentPooler { + return nil +} + +func (fcs *fakeChainStore) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + if len(fcs.blocks) > 0 { + return &fcs.blocks[0], nil + } + return nil, nil +} + +func (fcs *fakeChainStore) ForEachBlock(tx *dbutil.Tx, f func(*coin.Block) error) error { + return nil +} + +func makeBlock(t *testing.T, preBlock coin.Block, tm uint64) *coin.Block { + uxHash := testutil.RandSHA256(t) + tx := coin.Transaction{} + b, err := coin.NewBlock(preBlock, tm, uxHash, coin.Transactions{tx}, feeCalc) + require.NoError(t, err) + return b +} + +func makeBlocks(t *testing.T, n int) []coin.SignedBlock { + var bs []coin.SignedBlock + preBlock, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + bs = append(bs, coin.SignedBlock{Block: *preBlock}) + + now := genTime + 100 + for i := 1; i < n; i++ { + b := makeBlock(t, *preBlock, now+uint64(i)*100) + sb := coin.SignedBlock{ + Block: *b, + } + bs = append(bs, sb) + preBlock = b + } + + return bs +} + +func TestBlockchainTime(t *testing.T) { + bs := makeBlocks(t, 1) + tt := []struct { + name string + store chainStore + time uint64 + }{ + { + "ok", + &fakeChainStore{ + blocks: bs[:], + }, + bs[0].Time(), + }, + { + "no head", + &fakeChainStore{}, + uint64(0), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + tm, err := bc.Time(tx) + require.NoError(t, err) + require.Equal(t, tc.time, tm) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestIsGenesisBlock(t *testing.T) { + bs := makeBlocks(t, 2) + tt := []struct { + name string + store chainStore + b *coin.Block + isGenesis bool + }{ + { + "genesis block", + &fakeChainStore{ + blocks: bs[:1], + }, + &bs[0].Block, + true, + }, + { + "not genesis block", + &fakeChainStore{ + blocks: bs[:1], + }, + &bs[1].Block, + false, + }, + { + "empty chain", + &fakeChainStore{}, + &bs[0].Block, + false, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + bc := Blockchain{ + store: tc.store, + } + + isGenesis, err := bc.isGenesisBlock(nil, *tc.b) + require.NoError(t, err) + require.Equal(t, tc.isGenesis, isGenesis) + }) + } +} + +func TestVerifyBlockHeader(t *testing.T) { + bs := makeBlocks(t, 5) + tt := []struct { + name string + store chainStore + b coin.Block + err error + }{ + { + "ok", + &fakeChainStore{ + blocks: bs[:1], + }, + bs[1].Block, + nil, + }, + { + "invalid block seq", + &fakeChainStore{ + blocks: bs[:1], + }, + bs[2].Block, + errors.New("BkSeq invalid"), + }, + { + "invalid time", + &fakeChainStore{ + blocks: bs[:1], + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: 0, + }, + }, + + errors.New("Block time must be > head time"), + }, + { + "invalid prehash", + &fakeChainStore{ + blocks: bs[:1], + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: bs[1].Time(), + }, + }, + + errors.New("PrevHash does not match current head"), + }, + { + "empty blockchain", + &fakeChainStore{}, + coin.Block{}, + blockdb.ErrNoHeadBlock, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := &Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + err := bc.verifyBlockHeader(tx, tc.b) + require.Equal(t, tc.err, err) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestGetBlocks(t *testing.T) { + blocks := makeBlocks(t, 5) + tt := []struct { + name string + store chainStore + req struct { + st uint64 + ed uint64 + } + expect []coin.SignedBlock + }{ + { + "ok", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 0, + 1, + }, + blocks[:2], + }, + { + "start > end", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 1, + 0, + }, + nil, + }, + { + "start overflow", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 6, + 7, + }, + nil, + }, + { + "start == end", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 0, + 0, + }, + blocks[:1], + }, + { + "end overflow", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 0, + 8, + }, + blocks[:], + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + bs, err := bc.GetBlocksInRange(tx, tc.req.st, tc.req.ed) + require.NoError(t, err) + require.Equal(t, len(tc.expect), len(bs)) + require.Equal(t, tc.expect, bs) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestGetLastBlocks(t *testing.T) { + blocks := makeBlocks(t, 5) + tt := []struct { + name string + store chainStore + n uint64 + expect []coin.SignedBlock + }{ + { + "get last block", + &fakeChainStore{ + blocks: blocks[:], + }, + 1, + blocks[4:5], + }, + { + "get last two block", + &fakeChainStore{ + blocks: blocks[:], + }, + 2, + blocks[3:5], + }, + { + "get all block", + &fakeChainStore{ + blocks: blocks[:], + }, + 5, + blocks[0:5], + }, + { + "get block from empty chain", + &fakeChainStore{}, + 1, + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + bs, err := bc.GetLastBlocks(tx, tc.n) + require.NoError(t, err) + require.Equal(t, tc.expect, bs) + return nil + }) + require.NoError(t, err) + }) + } + +} + +// newBlock calls bc.NewBlock in a dbutil.Tx +func newBlock(t *testing.T, bc *Blockchain, txn coin.Transaction, timestamp uint64) *coin.Block { + var b *coin.Block + err := bc.db.View("", func(tx *dbutil.Tx) error { + var err error + b, err = bc.NewBlock(tx, coin.Transactions{txn}, timestamp) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + return b +} + +type spending struct { + TxIndex int + UxIndex int + Keys []cipher.SecKey + ToAddr cipher.Address + Coins uint64 +} + +func TestProcessTransactions(t *testing.T) { + toAddrs := make([]cipher.Address, 10) + keys := make([]cipher.SecKey, 10) + for i := 0; i < 10; i++ { + p, s := cipher.GenerateKeyPair() + toAddrs[i] = cipher.AddressFromPubKey(p) + keys[i] = s + } + + tt := []struct { + name string + arbitrating bool + initChain []spending + spends []spending + err error + }{ + { + "ok", + false, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + nil, + }, + { + "no transactions", + false, + []spending{}, + []spending{}, + errors.New("No transactions"), + }, + { + "invalid signature", + false, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{keys[0]}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + NewErrTxnViolatesHardConstraint(errors.New("Signature not valid for output being spent")), + }, + { + "dup spending", + false, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + errors.New("Cannot spend output twice in the same block"), + }, + { + "arbitrating no transactions", + true, + []spending{}, + []spending{}, + nil, + }, + { + "invalid signature", + true, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{keys[0]}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + nil, + }, + { + "including invalid signature", + true, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{keys[0]}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create test db + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + // create chain store + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + // create Blockchain + bc := &Blockchain{ + cfg: BlockchainConfig{ + Arbitrating: tc.arbitrating, + }, + db: db, + store: store, + } + + // init chain + head := addGenesisBlockToBlockchain(t, bc) + tm := head.Time() + for i, spend := range tc.initChain { + uxs := coin.CreateUnspents(head.Head, head.Body.Transactions[spend.TxIndex]) + txn := makeSpendTxn(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) + + b := newBlock(t, bc, txn, tm+uint64(i*100)) + + sb := &coin.SignedBlock{ + Block: *b, + Sig: cipher.MustSignHash(b.HashHeader(), genSecret), + } + err = db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, sb) + }) + require.NoError(t, err) + head = sb + } + + // create spending transactions + txns := make([]coin.Transaction, len(tc.spends)) + for i, spend := range tc.spends { + uxs := coin.CreateUnspents(head.Head, head.Body.Transactions[spend.TxIndex]) + txn := makeSpendTxn(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) + txns[i] = txn + } + + err = db.View("", func(tx *dbutil.Tx) error { + _, err := bc.processTransactions(tx, txns) + require.EqualValues(t, tc.err, err) + return nil + }) + require.NoError(t, err) + }) + } + +} + +func getUxHash(t *testing.T, db *dbutil.DB, bc *Blockchain) cipher.SHA256 { + var uxHash cipher.SHA256 + err := db.View("", func(tx *dbutil.Tx) error { + var err error + uxHash, err = bc.Unspent().GetUxHash(tx) + return err + }) + require.NoError(t, err) + return uxHash +} + +func TestVerifyUxHash(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb := addGenesisBlockToBlockchain(t, bc) + uxHash := getUxHash(t, db, bc) + txn := coin.Transaction{} + b, err := coin.NewBlock(gb.Block, genTime+100, uxHash, coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + err = bc.verifyUxHash(tx, *b) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + b2, err := coin.NewBlock(gb.Block, genTime+10, testutil.RandSHA256(t), coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + err = bc.verifyUxHash(tx, *b2) + require.Equal(t, errors.New("UxHash does not match"), err) + return nil + }) + require.NoError(t, err) +} + +func TestProcessBlock(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + + sb := coin.SignedBlock{ + Block: *gb, + Sig: cipher.MustSignHash(gb.HashHeader(), genSecret), + } + + // Test with empty blockchain + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := bc.processBlock(tx, sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // Add genesis block to chain store + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.store.AddBlock(tx, &sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // Create new block + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + toAddr := testutil.MakeAddress() + tx := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, 10e6) + uxHash := getUxHash(t, db, bc) + b, err := coin.NewBlock(*gb, genTime+100, uxHash, coin.Transactions{tx}, feeCalc) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := bc.processBlock(tx, coin.SignedBlock{ + Block: *b, + Sig: cipher.MustSignHash(b.HashHeader(), genSecret), + }) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) +} + +func TestExecuteBlock(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + + sb := coin.SignedBlock{ + Block: *gb, + Sig: cipher.MustSignHash(gb.HashHeader(), genSecret), + } + + // test with empty chain + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.ExecuteBlock(tx, &sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // new block + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + toAddr := testutil.MakeAddress() + tx := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, 10e6) + uxHash := getUxHash(t, db, bc) + b, err := coin.NewBlock(*gb, genTime+100, uxHash, coin.Transactions{tx}, feeCalc) + require.NoError(t, err) + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.ExecuteBlock(tx, &coin.SignedBlock{ + Block: *b, + Sig: cipher.MustSignHash(b.HashHeader(), genSecret), + }) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_verify_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_verify_test.go new file mode 100644 index 00000000..44587bb5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_verify_test.go @@ -0,0 +1,665 @@ +package visor + +import ( + "errors" + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +const ( + // GenesisTime is the time of the genesis block created in MakeBlockchain + GenesisTime uint64 = 1000 + // GenesisCoins is the amount of coins in the genesis block created in MakeBlockchain + GenesisCoins uint64 = 1000e6 + // GenesisCoinHours is the amount of coin hours in the genesis block created in MakeBlockchain + GenesisCoinHours uint64 = 1000 * 1000 + // TimeIncrement is the default time increment used when creating a block with CreateGenesisSpendTransaction + TimeIncrement uint64 = 3600 * 1000 +) + +var ( + // GenesisPublic is the public key used in the genesis block created in MakeBlockchain + GenesisPublic cipher.PubKey + // GenesisSecret is the secret key used in the genesis block created in MakeBlockchain + GenesisSecret cipher.SecKey + // GenesisAddress is the address used in the genesis block created in MakeBlockchain + GenesisAddress cipher.Address +) + +func init() { + GenesisPublic, GenesisSecret = cipher.GenerateKeyPair() + GenesisAddress = cipher.AddressFromPubKey(GenesisPublic) +} + +// MakeBlockchain creates a new blockchain with a genesis block +func MakeBlockchain(t *testing.T, db *dbutil.DB, seckey cipher.SecKey) *Blockchain { + pubkey := cipher.MustPubKeyFromSecKey(seckey) + b, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + }) + require.NoError(t, err) + gb, err := coin.NewGenesisBlock(GenesisAddress, GenesisCoins, GenesisTime) + if err != nil { + panic(fmt.Errorf("create genesis block failed: %v", err)) + } + + sig := cipher.MustSignHash(gb.HashHeader(), seckey) + err = db.Update("", func(tx *dbutil.Tx) error { + return b.ExecuteBlock(tx, &coin.SignedBlock{ + Block: *gb, + Sig: sig, + }) + }) + require.NoError(t, err) + return b +} + +// CreateGenesisSpendTransaction creates the initial post-genesis transaction that moves genesis coins to another address +func CreateGenesisSpendTransaction(t *testing.T, db *dbutil.DB, bc *Blockchain, toAddr cipher.Address, coins, hours, fee uint64) coin.Transaction { + var txn coin.Transaction + err := db.View("", func(tx *dbutil.Tx) error { + uxOuts, err := bc.Unspent().GetAll(tx) + require.NoError(t, err) + require.Len(t, uxOuts, 1) + + txn = makeTransactionForChain(t, tx, bc, uxOuts[0], GenesisSecret, toAddr, coins, hours, fee) + require.Equal(t, txn.Out[0].Address.String(), toAddr.String()) + + if coins == GenesisCoins { + // No change output + require.Len(t, txn.Out, 1) + } else { + require.Len(t, txn.Out, 2) + require.Equal(t, txn.Out[1].Address.String(), GenesisAddress.String()) + } + + return nil + }) + require.NoError(t, err) + return txn +} + +// ExecuteGenesisSpendTransaction executes a genesis block created with CreateGenesisSpendTransaction against a blockchain +// created with MakeBlockchain +func ExecuteGenesisSpendTransaction(t *testing.T, db *dbutil.DB, bc *Blockchain, txn coin.Transaction) coin.UxOut { + var block *coin.Block + err := db.View("", func(tx *dbutil.Tx) error { + var err error + block, err = bc.NewBlock(tx, coin.Transactions{txn}, GenesisTime+TimeIncrement) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + require.NotNil(t, block) + + sig := cipher.MustSignHash(block.HashHeader(), GenesisSecret) + sb := coin.SignedBlock{ + Block: *block, + Sig: sig, + } + + err = db.Update("", func(tx *dbutil.Tx) error { + err = bc.ExecuteBlock(tx, &sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + uxOut, err := coin.CreateUnspent(block.Head, txn, 0) + require.NoError(t, err) + + return uxOut +} + +func makeTransactionForChain(t *testing.T, tx *dbutil.Tx, bc *Blockchain, ux coin.UxOut, sec cipher.SecKey, toAddr cipher.Address, amt, hours, fee uint64) coin.Transaction { + tim, err := bc.Time(tx) + require.NoError(t, err) + + chrs, err := ux.CoinHours(tim) + require.NoError(t, err) + + require.Equal(t, cipher.AddressFromPubKey(cipher.MustPubKeyFromSecKey(sec)), ux.Body.Address) + + knownUx, err := bc.Unspent().Get(tx, ux.Hash()) + require.NoError(t, err) + require.NotNil(t, knownUx) + require.Equal(t, knownUx, &ux) + + txn := coin.Transaction{} + err = txn.PushInput(ux.Hash()) + require.NoError(t, err) + + err = txn.PushOutput(toAddr, amt, hours) + require.NoError(t, err) + + // Change output + coinsOut := ux.Body.Coins - amt + if coinsOut > 0 { + err := txn.PushOutput(GenesisAddress, coinsOut, chrs-hours-fee) + require.NoError(t, err) + } + + txn.SignInputs([]cipher.SecKey{sec}) + + require.Equal(t, len(txn.Sigs), 1) + + txnInnerHash := txn.HashInner() + err = cipher.VerifyAddressSignedHash(ux.Body.Address, txn.Sigs[0], cipher.AddSHA256(txnInnerHash, txn.In[0])) + require.NoError(t, err) + + err = txn.UpdateHeader() + require.NoError(t, err) + + err = txn.Verify() + require.NoError(t, err) + + err = bc.VerifySingleTxnHardConstraints(tx, txn, TxnSigned) + require.NoError(t, err) + + return txn +} + +func makeLostCoinTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { //nolint:unparam + txn := coin.Transaction{} + var totalCoins uint64 + var totalHours uint64 + + for _, ux := range uxs { + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + totalCoins += ux.Body.Coins + totalHours += ux.Body.Hours + } + + err := txn.PushOutput(toAddr, coins, totalHours/4) + require.NoError(t, err) + changeCoins := totalCoins - coins + if changeCoins > 0 { + err := txn.PushOutput(uxs[0].Body.Address, changeCoins-1, totalHours/4) + require.NoError(t, err) + } + + txn.SignInputs(keys) + err = txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +func makeDuplicateUxOutTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { //nolint:unparam + txn := coin.Transaction{} + var totalCoins uint64 + var totalHours uint64 + + for _, ux := range uxs { + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + totalCoins += ux.Body.Coins + totalHours += ux.Body.Hours + } + + err := txn.PushOutput(toAddr, coins, totalHours/8) + require.NoError(t, err) + err = txn.PushOutput(toAddr, coins, totalHours/8) + require.NoError(t, err) + changeCoins := totalCoins - coins + if changeCoins > 0 { + err := txn.PushOutput(uxs[0].Body.Address, changeCoins, totalHours/4) + require.NoError(t, err) + } + + txn.SignInputs(keys) + err = txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +// makeUnspentsTxn creates a transaction that has a configurable number of outputs sent to the same address. +// The genesis block has only one unspent output, so only one transaction can be made from it. +// This is useful for when multiple test transactions need to be made from the same block. +// Coins and hours are distributed equally amongst all new outputs. +func makeUnspentsTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, nUnspents int, maxDroplets uint8) coin.Transaction { //nolint:unparam + // Add inputs to the transaction + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + + totalHours, err = mathutil.AddUint64(totalHours, ux.Body.Hours) + require.NoError(t, err) + + totalCoins, err = mathutil.AddUint64(totalCoins, ux.Body.Coins) + require.NoError(t, err) + } + + maxDivisor := params.DropletPrecisionToDivisor(maxDroplets) + + // Distribute coins and hours equally to all of the new outputs + coins := totalCoins / uint64(nUnspents) + coins = (coins / maxDivisor) * maxDivisor + t.Logf("Assigning %d coins to each of %d outputs", coins, nUnspents) + changeCoins := totalCoins - (coins * uint64(nUnspents)) + t.Logf("Change coins: %d", changeCoins) + + hours := (totalHours / 2) / uint64(nUnspents) + changeHours := (totalHours / 2) - (hours * uint64(nUnspents)) + + // Create the new outputs + require.True(t, uint64(nUnspents) < hours) + for i := 0; i < nUnspents; i++ { + // Subtract index from hours so that the outputs are not all the same, + // otherwise the output hashes will be duplicated and the transaction + // will be invalid + spendHours := hours - uint64(i) + err := spendTxn.PushOutput(toAddr, coins, spendHours) + require.NoError(t, err) + } + + // Add change output, if necessary + if changeCoins != 0 { + err := spendTxn.PushOutput(uxs[0].Body.Address, changeCoins, changeHours) + require.NoError(t, err) + } + + // Sign the transaction + spendTxn.SignInputs(keys) + err := spendTxn.UpdateHeader() + require.NoError(t, err) + + return spendTxn +} + +// makeSpendTxWithFee creates a txn specified with the extra number of hours to burn in addition to the minimum required burn +func makeSpendTxWithFee(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins, fee uint64) coin.Transaction { + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + require.True(t, coins <= totalCoins) + require.True(t, fee <= totalHours/2, "Fee must be <= half of total hours") + + spendHours := totalHours/2 - fee + + err := spendTxn.PushOutput(toAddr, coins, spendHours) + require.NoError(t, err) + if totalCoins != coins { + err := spendTxn.PushOutput(uxs[0].Body.Address, totalCoins-coins, 0) + require.NoError(t, err) + } + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +// makeSpendTxWithHoursBurned creates a txn specified with the total number of hours to burn +func makeSpendTxWithHoursBurned(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins, hoursBurned uint64) coin.Transaction { //nolint:unparam + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + require.True(t, coins <= totalCoins) + require.True(t, hoursBurned <= totalHours, "hoursBurned must be <= totalHours") + + spendHours := totalHours - hoursBurned + + err := spendTxn.PushOutput(toAddr, coins, spendHours) + require.NoError(t, err) + if totalCoins != coins { + err := spendTxn.PushOutput(uxs[0].Body.Address, totalCoins-coins, 0) + require.NoError(t, err) + } + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +func requireSoftViolation(t *testing.T, msg string, err error) { + expected := NewErrTxnViolatesSoftConstraint(errors.New(msg)) + require.Equal(t, expected, err, "Expected: %s\nHave: %v", expected, err) +} + +func requireHardViolation(t *testing.T, msg string, err error) { + expected := NewErrTxnViolatesHardConstraint(errors.New(msg)) + require.Equal(t, expected, err, "Expected: %s\nHave: %v", expected, err) +} + +func TestVerifySignedTransactionSoftHardConstraints(t *testing.T) { + testVerifyTransactionSoftHardConstraints(t, TxnSigned) +} + +func TestVerifyUnsignedTransactionSoftHardConstraints(t *testing.T) { + testVerifyTransactionSoftHardConstraints(t, TxnUnsigned) +} + +func testVerifyTransactionSoftHardConstraints(t *testing.T, signed TxnSignedFlag) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb := addGenesisBlockToBlockchain(t, bc) + + toAddr := testutil.MakeAddress() + coins := uint64(10e6) + + verifySingleTxnSoftHardConstraints := func(txn coin.Transaction, verifyParams params.VerifyTxn) error { + return db.View("", func(tx *dbutil.Tx) error { + _, _, err := bc.VerifySingleTxnSoftHardConstraints(tx, txn, params.MainNetDistribution, verifyParams, signed) + return err + }) + } + + // create normal spending txn + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + if signed == TxnSigned { + require.NoError(t, err) + } else { + requireHardViolation(t, "Unsigned transaction must contain a null signature", err) + } + + if signed == TxnUnsigned { + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + err := txn.UpdateHeader() + require.NoError(t, err) + } + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + require.NoError(t, err) + + // Transaction size exceeds maxSize + txnSize, err := txn.Size() + require.NoError(t, err) + err = verifySingleTxnSoftHardConstraints(txn, params.VerifyTxn{ + BurnFactor: params.UserVerifyTxn.BurnFactor, + MaxTransactionSize: txnSize - 1, + MaxDropletPrecision: params.UserVerifyTxn.MaxDropletPrecision, + }) + requireSoftViolation(t, "Transaction size bigger than max block size", err) + + // Invalid transaction fee + uxs = coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + hours := uint64(0) + for _, ux := range uxs { + hours += ux.Body.Hours + } + txn = makeSpendTxWithHoursBurned(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins, 0) + if signed == TxnUnsigned { + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + err := txn.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + requireSoftViolation(t, "Transaction has zero coinhour fee", err) + + // Invalid transaction fee, part 2 + txn = makeSpendTxWithHoursBurned(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins, 1) + originalSigs := txn.Sigs + if signed == TxnUnsigned { + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + err := txn.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + requireSoftViolation(t, "Transaction coinhour fee minimum not met", err) + + // Transaction locking is tested by TestVerifyTransactionIsLocked + + // Test invalid header hash + if signed == TxnUnsigned { + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + err := txn.UpdateHeader() + require.NoError(t, err) + } + originalInnerHash := txn.InnerHash + txn.InnerHash = cipher.SHA256{} + + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + requireHardViolation(t, "InnerHash does not match computed hash", err) + + txn.Sigs = originalSigs + err = txn.UpdateHeader() + require.NoError(t, err) + require.Equal(t, originalInnerHash, txn.InnerHash) + + // Create new block to spend the coins + var b *coin.Block + err = db.View("", func(tx *dbutil.Tx) error { + var err error + b, err = bc.NewBlock(tx, coin.Transactions{txn}, genTime+100) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + require.NotNil(t, b) + + // Add the block to blockchain + err = bc.db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, &coin.SignedBlock{ + Block: *b, + Sig: cipher.MustSignHash(b.HashHeader(), genSecret), + }) + }) + require.NoError(t, err) + + // A UxOut does not exist, it was already spent + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + expectedErr := NewErrTxnViolatesHardConstraint(blockdb.NewErrUnspentNotExist(txn.In[0].Hex())) + require.Equal(t, expectedErr, err) + + // Check invalid sig + uxs = coin.CreateUnspents(b.Head, txn) + _, key := cipher.GenerateKeyPair() + toAddr2 := testutil.MakeAddress() + txn2 := makeSpendTxn(t, uxs, []cipher.SecKey{key, key}, toAddr2, 5e6) + if signed == TxnUnsigned { + txn2.Sigs = make([]cipher.Sig, len(txn2.Sigs)) + err := txn2.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(txn2, params.UserVerifyTxn) + + if signed == TxnSigned { + requireHardViolation(t, "Signature not valid for output being spent", err) + } else { + // unsigned transactions ignore the sigs + require.NoError(t, err) + } + + // Create lost coin transaction + uxs2 := coin.CreateUnspents(b.Head, txn) + toAddr3 := testutil.MakeAddress() + lostCoinTxn := makeLostCoinTxn(t, coin.UxArray{uxs2[1]}, []cipher.SecKey{genSecret}, toAddr3, 10e5) + if signed == TxnUnsigned { + lostCoinTxn.Sigs = make([]cipher.Sig, len(lostCoinTxn.Sigs)) + err := lostCoinTxn.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(lostCoinTxn, params.UserVerifyTxn) + requireHardViolation(t, "Transactions may not destroy coins", err) + + // Create transaction with duplicate UxOuts + uxs = coin.CreateUnspents(b.Head, txn) + toAddr4 := testutil.MakeAddress() + dupUxOutTxn := makeDuplicateUxOutTxn(t, coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr4, 1e6) + if signed == TxnUnsigned { + dupUxOutTxn.Sigs = make([]cipher.Sig, len(lostCoinTxn.Sigs)) + err := dupUxOutTxn.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(dupUxOutTxn, params.UserVerifyTxn) + requireHardViolation(t, "Duplicate output in transaction", err) +} + +func TestVerifyTxnFeeCoinHoursAdditionFails(t *testing.T) { + // Test that VerifySingleTxnSoftConstraints fails if a uxIn.CoinHours() call fails. + // This is a separate test on its own, because it's not possible to reach the line + // that is being tested through the blockchain verify API wrappers + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb := addGenesisBlockToBlockchain(t, bc) + + toAddr := testutil.MakeAddress() + coins := uint64(10e6) + + // create normal spending txn + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + + var uxIn coin.UxArray + var head *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + uxIn, err = bc.Unspent().GetArray(tx, txn.In) + require.NoError(t, err) + require.NotEmpty(t, uxIn) + + head, err = bc.Head(tx) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // Set the uxIn's hours high, so that uxIn.CoinHours() returns an error + uxIn[0].Body.Hours = math.MaxUint64 + _, coinHoursErr := uxIn[0].CoinHours(head.Time() + 1e6) + testutil.RequireError(t, coinHoursErr, "UxOut.CoinHours addition of earned coin hours overflow") + + // VerifySingleTxnSoftConstraints should fail on this, when trying to calculate the TransactionFee + err = VerifySingleTxnSoftConstraints(txn, head.Time()+1e6, uxIn, params.MainNetDistribution, params.UserVerifyTxn) + testutil.RequireError(t, err, NewErrTxnViolatesSoftConstraint(coinHoursErr).Error()) + + // VerifySingleTxnHardConstraints should fail on this, when performing the extra check of + // uxIn.CoinHours() errors, which is ignored by VerifyTransactionHoursSpending if the error + // is because of the earned hours addition overflow + head.Block.Head.Time += 1e6 + err = VerifySingleTxnHardConstraints(txn, head.Head, uxIn, TxnSigned) + testutil.RequireError(t, err, NewErrTxnViolatesHardConstraint(coinHoursErr).Error()) +} + +func TestVerifyTransactionIsLocked(t *testing.T) { + for _, addr := range params.MainNetDistribution.LockedAddresses() { + t.Run(fmt.Sprintf("IsLocked: %s", addr), func(t *testing.T) { + testVerifyTransactionAddressLocking(t, addr, errors.New("Transaction has locked address inputs")) + }) + } +} + +func TestVerifyTransactionIsUnlocked(t *testing.T) { + for _, addr := range params.MainNetDistribution.UnlockedAddresses() { + t.Run(fmt.Sprintf("IsUnlocked: %s", addr), func(t *testing.T) { + testVerifyTransactionAddressLocking(t, addr, nil) + }) + } +} + +func testVerifyTransactionAddressLocking(t *testing.T, toAddr string, expectedErr error) { + addr, err := cipher.DecodeBase58Address(toAddr) + require.NoError(t, err) + + db, close := prepareDB(t) + defer close() + + _, s := cipher.GenerateKeyPair() + + // Setup blockchain + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address + var coins = GenesisCoins + var hours uint64 = 1e6 + var fee uint64 = 5e8 + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + uxOut := ExecuteGenesisSpendTransaction(t, db, bc, txn) + + // Create a transaction that spends from the locked address + // The secret key for the locked address is obviously unavailable here, + // instead, forge an invalid transaction. + // Transaction.Verify() is called after TransactionIsLocked(), + // so for this test it doesn't matter if transaction signature is wrong + randomAddress := testutil.MakeAddress() + txn = coin.Transaction{ + In: []cipher.SHA256{uxOut.Hash()}, + Out: []coin.TransactionOutput{ + { + Address: randomAddress, + Coins: uxOut.Body.Coins, + Hours: uxOut.Body.Hours / 2, + }, + }, + } + + var uxIn coin.UxArray + var head *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + uxIn, err = bc.Unspent().GetArray(tx, txn.In) + require.NoError(t, err) + require.NotEmpty(t, uxIn) + + head, err = bc.Head(tx) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + err = VerifySingleTxnSoftConstraints(txn, head.Time(), uxIn, params.MainNetDistribution, params.UserVerifyTxn) + if expectedErr == nil { + require.NoError(t, err) + } else { + requireSoftViolation(t, expectedErr.Error(), err) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder.go new file mode 100644 index 00000000..313dbff0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder.go @@ -0,0 +1,513 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeBlock computes the size of an encoded object of type Block +func encodeSizeBlock(obj *coin.Block) uint64 { + i0 := uint64(0) + + // obj.Head.Version + i0 += 4 + + // obj.Head.Time + i0 += 8 + + // obj.Head.BkSeq + i0 += 8 + + // obj.Head.Fee + i0 += 8 + + // obj.Head.PrevHash + i0 += 32 + + // obj.Head.BodyHash + i0 += 32 + + // obj.Head.UxHash + i0 += 32 + + // obj.Body.Transactions + i0 += 4 + for _, x1 := range obj.Body.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + return i0 +} + +// encodeBlock encodes an object of type Block to a buffer allocated to the exact size +// required to encode the object. +func encodeBlock(obj *coin.Block) ([]byte, error) { + n := encodeSizeBlock(obj) + buf := make([]byte, n) + + if err := encodeBlockToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeBlockToBuffer encodes an object of type Block to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeBlockToBuffer(buf []byte, obj *coin.Block) error { + if uint64(len(buf)) < encodeSizeBlock(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Head.Version + e.Uint32(obj.Head.Version) + + // obj.Head.Time + e.Uint64(obj.Head.Time) + + // obj.Head.BkSeq + e.Uint64(obj.Head.BkSeq) + + // obj.Head.Fee + e.Uint64(obj.Head.Fee) + + // obj.Head.PrevHash + e.CopyBytes(obj.Head.PrevHash[:]) + + // obj.Head.BodyHash + e.CopyBytes(obj.Head.BodyHash[:]) + + // obj.Head.UxHash + e.CopyBytes(obj.Head.UxHash[:]) + + // obj.Body.Transactions maxlen check + if len(obj.Body.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Body.Transactions length check + if uint64(len(obj.Body.Transactions)) > math.MaxUint32 { + return errors.New("obj.Body.Transactions length exceeds math.MaxUint32") + } + + // obj.Body.Transactions length + e.Uint32(uint32(len(obj.Body.Transactions))) + + // obj.Body.Transactions + for _, x := range obj.Body.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + return nil +} + +// decodeBlock decodes an object of type Block from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeBlock(buf []byte, obj *coin.Block) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Head.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Head.Version = i + } + + { + // obj.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.Time = i + } + + { + // obj.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.BkSeq = i + } + + { + // obj.Head.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.Fee = i + } + + { + // obj.Head.PrevHash + if len(d.Buffer) < len(obj.Head.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Head.PrevHash[:], d.Buffer[:len(obj.Head.PrevHash)]) + d.Buffer = d.Buffer[len(obj.Head.PrevHash):] + } + + { + // obj.Head.BodyHash + if len(d.Buffer) < len(obj.Head.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Head.BodyHash[:], d.Buffer[:len(obj.Head.BodyHash)]) + d.Buffer = d.Buffer[len(obj.Head.BodyHash):] + } + + { + // obj.Head.UxHash + if len(d.Buffer) < len(obj.Head.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Head.UxHash[:], d.Buffer[:len(obj.Head.UxHash)]) + d.Buffer = d.Buffer[len(obj.Head.UxHash):] + } + + { + // obj.Body.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions = make([]coin.Transaction, length) + + for z2 := range obj.Body.Transactions { + { + // obj.Body.Transactions[z2].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Length = i + } + + { + // obj.Body.Transactions[z2].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Type = i + } + + { + // obj.Body.Transactions[z2].InnerHash + if len(d.Buffer) < len(obj.Body.Transactions[z2].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].InnerHash[:], d.Buffer[:len(obj.Body.Transactions[z2].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].InnerHash):] + } + + { + // obj.Body.Transactions[z2].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions[z2].Sigs = make([]cipher.Sig, length) + + for z4 := range obj.Body.Transactions[z2].Sigs { + { + // obj.Body.Transactions[z2].Sigs[z4] + if len(d.Buffer) < len(obj.Body.Transactions[z2].Sigs[z4]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].Sigs[z4][:], d.Buffer[:len(obj.Body.Transactions[z2].Sigs[z4])]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].Sigs[z4]):] + } + + } + } + } + + { + // obj.Body.Transactions[z2].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions[z2].In = make([]cipher.SHA256, length) + + for z4 := range obj.Body.Transactions[z2].In { + { + // obj.Body.Transactions[z2].In[z4] + if len(d.Buffer) < len(obj.Body.Transactions[z2].In[z4]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].In[z4][:], d.Buffer[:len(obj.Body.Transactions[z2].In[z4])]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].In[z4]):] + } + + } + } + } + + { + // obj.Body.Transactions[z2].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions[z2].Out = make([]coin.TransactionOutput, length) + + for z4 := range obj.Body.Transactions[z2].Out { + { + // obj.Body.Transactions[z2].Out[z4].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Out[z4].Address.Version = i + } + + { + // obj.Body.Transactions[z2].Out[z4].Address.Key + if len(d.Buffer) < len(obj.Body.Transactions[z2].Out[z4].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].Out[z4].Address.Key[:], d.Buffer[:len(obj.Body.Transactions[z2].Out[z4].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].Out[z4].Address.Key):] + } + + { + // obj.Body.Transactions[z2].Out[z4].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Out[z4].Coins = i + } + + { + // obj.Body.Transactions[z2].Out[z4].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Out[z4].Hours = i + } + + } + } + } + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeBlockExact decodes an object of type Block from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeBlockExact(buf []byte, obj *coin.Block) error { + if n, err := decodeBlock(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder_test.go new file mode 100644 index 00000000..102838ac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder_test.go @@ -0,0 +1,422 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +func newEmptyBlockForEncodeTest() *coin.Block { + var obj coin.Block + return &obj +} + +func newRandomBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Block { + var obj coin.Block + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Block { + var obj coin.Block + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Block { + var obj coin.Block + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderBlock(t *testing.T, obj *coin.Block) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeBlock(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeBlock() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeBlock(obj) + if err != nil { + t.Fatalf("encodeBlock failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeBlock produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeBlock()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeBlockToBuffer(data3, obj); err != nil { + t.Fatalf("encodeBlockToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 coin.Block + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 coin.Block + if n, err := decodeBlock(data2, &obj3); err != nil { + t.Fatalf("decodeBlock failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlock bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlock()") + } + + // Decode, excess buffer + var obj4 coin.Block + n, err := decodeBlock(data3, &obj4) + if err != nil { + t.Fatalf("decodeBlock failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeBlock bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeBlock bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlock()") + } + + // DecodeExact + var obj5 coin.Block + if err := decodeBlockExact(data2, &obj5); err != nil { + t.Fatalf("decodeBlock failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlock()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeBlock(data4, &obj3); err != nil { + t.Fatalf("decodeBlock failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlock bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderBlock(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *coin.Block + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyBlockForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomBlockForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenBlockForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilBlockForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderBlock(t, tc.obj) + }) + } +} + +func decodeBlockExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.Block + if _, err := decodeBlock(buf, &obj); err == nil { + t.Fatal("decodeBlock: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlock: expected error %q, got %q", expectedErr, err) + } +} + +func decodeBlockExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.Block + if err := decodeBlockExact(buf, &obj); err == nil { + t.Fatal("decodeBlockExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderBlockDecodeErrors(t *testing.T, k int, tag string, obj *coin.Block) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeBlock(obj) + buf, err := encodeBlock(obj) + if err != nil { + t.Fatalf("encodeBlock failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeBlockExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderBlockDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyBlockForEncodeTest() + fullObj := newRandomBlockForEncodeTest(t, rand) + testSkyencoderBlockDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderBlockDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree.go new file mode 100644 index 00000000..e9cd246b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree.go @@ -0,0 +1,269 @@ +package blockdb + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + errBlockExist = errors.New("block already exists") + errNoParent = errors.New("block is not genesis and has no parent") + errWrongParent = errors.New("wrong parent") + errHasChild = errors.New("remove block failed, it has children") + + // BlocksBkt holds coin.Blocks + BlocksBkt = []byte("blocks") + // TreeBkt maps block height to a (prev, hash) pair for a block + TreeBkt = []byte("block_tree") +) + +// Walker function for go through blockchain +type Walker func(*dbutil.Tx, []coin.HashPair) (cipher.SHA256, bool) + +// blockTree use the blockdb store all blocks and maintains the block tree struct. +type blockTree struct{} + +// AddBlock adds block with *dbutil.Tx +func (bt *blockTree) AddBlock(tx *dbutil.Tx, b *coin.Block) error { + // can't store block if it's not genesis block and has no parent. + if b.Seq() > 0 && b.Head.PrevHash.Null() { + return errNoParent + } + + // check if the block already exists. + hash := b.HashHeader() + if ok, err := dbutil.BucketHasKey(tx, BlocksBkt, hash[:]); err != nil { + return err + } else if ok { + return errBlockExist + } + + // write block into blocks bucket. + buf, err := encodeBlock(b) + if err != nil { + return err + } + + if err := dbutil.PutBucketValue(tx, BlocksBkt, hash[:], buf); err != nil { + return err + } + + // the pre hash must be in depth - 1. + if b.Seq() > 0 { + parentHashPair, err := getHashPairInDepth(tx, b.Seq()-1, func(hp coin.HashPair) bool { + return hp.Hash == b.Head.PrevHash + }) + if err != nil { + return err + } + if len(parentHashPair) == 0 { + return errWrongParent + } + } + + hp := coin.HashPair{ + Hash: hash, + PrevHash: b.Head.PrevHash, + } + + // get block pairs in the depth + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) + if err != nil { + return err + } + + if len(hashPairs) == 0 { + // no hash pair exist in the depth. + // write the hash pair into tree. + return setHashPairInDepth(tx, b.Seq(), []coin.HashPair{hp}) + } + + // check dup block + if containHash(hashPairs, hp) { + return errBlockExist + } + + hashPairs = append(hashPairs, hp) + return setHashPairInDepth(tx, b.Seq(), hashPairs) +} + +// RemoveBlock remove block from blocks bucket and tree bucket. +// can't remove block if it has children. +func (bt *blockTree) RemoveBlock(tx *dbutil.Tx, b *coin.Block) error { + // delete block in blocks bucket. + hash := b.HashHeader() + if err := dbutil.Delete(tx, BlocksBkt, hash[:]); err != nil { + return err + } + + // check if this block has children + if has, err := hasChild(tx, *b); err != nil { + return err + } else if has { + return errHasChild + } + + // get block hash pairs in depth + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) + if err != nil { + return err + } + + // remove block hash pair in tree. + ps := removePairs(hashPairs, coin.HashPair{ + Hash: hash, + PrevHash: b.Head.PrevHash, + }) + + if len(ps) == 0 { + return dbutil.Delete(tx, TreeBkt, dbutil.Itob(b.Seq())) + } + + // update the hash pairs in tree. + return setHashPairInDepth(tx, b.Seq(), ps) +} + +// GetBlock get block by hash, return nil on not found +func (bt *blockTree) GetBlock(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + var b coin.Block + + v, err := dbutil.GetBucketValueNoCopy(tx, BlocksBkt, hash[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeBlockExact(v, &b); err != nil { + return nil, err + } + + if hash != b.HashHeader() { + return nil, fmt.Errorf("DB key %s does not match block hash header %s", hash, b.HashHeader()) + } + + return &b, nil +} + +// GetBlockInDepth get block in depth, return nil on not found, +// the filter is used to choose the appropriate block. +func (bt *blockTree) GetBlockInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (*coin.Block, error) { + hash, ok, err := bt.getHashInDepth(tx, depth, filter) + if err != nil { + return nil, fmt.Errorf("BlockTree.getHashInDepth failed: %v", err) + } else if !ok { + return nil, nil + } + + return bt.GetBlock(tx, hash) +} + +// ForEachBlock iterates all blocks and calls f on them +func (bt *blockTree) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return dbutil.ForEach(tx, BlocksBkt, func(_, v []byte) error { + var b coin.Block + if err := decodeBlockExact(v, &b); err != nil { + return err + } + + return f(&b) + }) +} + +func (bt *blockTree) getHashInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (cipher.SHA256, bool, error) { + var pairs hashPairsWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, TreeBkt, dbutil.Itob(depth)) + if err != nil { + return cipher.SHA256{}, false, err + } else if v == nil { + return cipher.SHA256{}, false, nil + } + + if err := decodeHashPairsWrapperExact(v, &pairs); err != nil { + return cipher.SHA256{}, false, err + } + + hash, ok := filter(tx, pairs.HashPairs) + if !ok { + return cipher.SHA256{}, false, errors.New("No hash found in depth") + } + + return hash, true, nil +} + +func containHash(hashPairs []coin.HashPair, pair coin.HashPair) bool { + for _, p := range hashPairs { + if p.Hash == pair.Hash { + return true + } + } + return false +} + +func removePairs(hps []coin.HashPair, pair coin.HashPair) []coin.HashPair { + pairs := []coin.HashPair{} + for _, p := range hps { + if p.Hash == pair.Hash && p.PrevHash == pair.PrevHash { + continue + } + pairs = append(pairs, p) + } + return pairs +} + +func getHashPairInDepth(tx *dbutil.Tx, depth uint64, fn func(hp coin.HashPair) bool) ([]coin.HashPair, error) { + var hps hashPairsWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, TreeBkt, dbutil.Itob(depth)) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashPairsWrapperExact(v, &hps); err != nil { + return nil, err + } + + var pairs []coin.HashPair + for _, ps := range hps.HashPairs { + if fn(ps) { + pairs = append(pairs, ps) + } + } + return pairs, nil +} + +// check if this block has children +func hasChild(tx *dbutil.Tx, b coin.Block) (bool, error) { + // get the child block hash pair, whose pre hash point to current block. + childHashPair, err := getHashPairInDepth(tx, b.Head.BkSeq+1, func(hp coin.HashPair) bool { + return hp.PrevHash == b.HashHeader() + }) + + if err != nil { + return false, err + } + + return len(childHashPair) > 0, nil +} + +func setHashPairInDepth(tx *dbutil.Tx, depth uint64, hps []coin.HashPair) error { + buf, err := encodeHashPairsWrapper(&hashPairsWrapper{ + HashPairs: hps, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, TreeBkt, dbutil.Itob(depth), buf) +} + +func allPairs(hp coin.HashPair) bool { + return true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree_test.go new file mode 100644 index 00000000..ce0ad02b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree_test.go @@ -0,0 +1,228 @@ +package blockdb + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +type blockInfo struct { + Seq uint64 + Time uint64 + Fee uint64 + Pre int +} + +type blockCase struct { + BInfo blockInfo + Err error + Action string +} + +func testCase(t *testing.T, cases []blockCase) { + db, close := prepareDB(t) + defer close() + + btree := &blockTree{} + blocks := make([]coin.Block, len(cases)) + for i, d := range cases { + var preHash cipher.SHA256 + if d.BInfo.Pre != -1 { + preHash = blocks[d.BInfo.Pre].HashHeader() + } + + b := coin.Block{ + Head: coin.BlockHeader{ + BkSeq: d.BInfo.Seq, + Time: d.BInfo.Time, + Fee: d.BInfo.Fee, + PrevHash: preHash, + }, + } + blocks[i] = b + + err := db.Update("", func(tx *dbutil.Tx) error { + switch d.Action { + case "add": + err := btree.AddBlock(tx, &b) + require.Equal(t, d.Err, err, "expect err:%v, but get err:%v", d.Err, err) + + if err == nil { + b1, err := btree.GetBlock(tx, b.HashHeader()) + require.NoError(t, err) + require.Equal(t, b, *b1) + } + case "remove": + err := btree.RemoveBlock(tx, &b) + require.Equal(t, d.Err, err, "expect err:%v, but get err:%v", d.Err, err) + if err == nil { + b1, err := btree.GetBlock(tx, b.HashHeader()) + require.NoError(t, err) + require.Nil(t, b1) + } + } + + return nil + }) + + require.NoError(t, err) + } +} + +func TestAddBlock(t *testing.T) { + testData := []blockCase{ + blockCase{ + BInfo: blockInfo{Seq: 0, Time: 0, Fee: 0, Pre: -1}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 0, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 1, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 2, Time: 2, Fee: 0, Pre: 1}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 2, Time: 2, Fee: 0, Pre: 1}, + Err: errBlockExist, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 2, Time: 2, Fee: 0, Pre: 0}, + Err: errWrongParent, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 4, Time: 2, Fee: 0, Pre: 3}, + Err: errWrongParent, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 3, Time: 2, Fee: 0, Pre: -1}, + Err: errNoParent, + Action: "add", + }, + } + + testCase(t, testData) +} + +func TestRemoveBlock(t *testing.T) { + testData := []blockCase{ + blockCase{ + BInfo: blockInfo{Seq: 0, Time: 0, Fee: 0, Pre: -1}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 1, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 2, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + // remove block normally. + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 2, Fee: 0, Pre: 0}, + Err: nil, + Action: "remove", + }, + // remove genesis block, which has children. + blockCase{ + BInfo: blockInfo{Seq: 0, Time: 0, Fee: 0, Pre: -1}, + Err: errHasChild, + Action: "remove", + }, + // remove the last block in depth 1. + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 1, Fee: 0, Pre: 0}, + Err: nil, + Action: "remove", + }, + } + + testCase(t, testData) +} + +func TestGetBlockInDepth(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + bc := &blockTree{} + blocks := []coin.Block{ + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 0, + Time: 0, + Fee: 0, + }, + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: 1, + }, + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: 2, + }, + }, + } + + err := db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &blocks[0]) + require.NoError(t, err) + + blocks[1].Head.PrevHash = blocks[0].HashHeader() + err = bc.AddBlock(tx, &blocks[1]) + require.NoError(t, err) + + blocks[2].Head.PrevHash = blocks[0].HashHeader() + err = bc.AddBlock(tx, &blocks[2]) + require.NoError(t, err) + + return nil + }) + + require.NoError(t, err) + + var block *coin.Block + err = db.View("", func(tx *dbutil.Tx) error { + var err error + block, err = bc.GetBlockInDepth(tx, 1, func(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + for _, hp := range hps { + b, err := bc.GetBlock(tx, hp.Hash) + require.NoError(t, err) + if b.Time() == 2 { + return b.HashHeader(), true + } + } + return cipher.SHA256{}, false + }) + require.NoError(t, err) + return err + }) + + require.NoError(t, err) + + require.NotNil(t, block) + require.Equal(t, blocks[2], *block) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain.go new file mode 100644 index 00000000..c111080e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain.go @@ -0,0 +1,285 @@ +/* +Package blockdb is the core blockchain database wrapper +*/ +package blockdb + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + logger = logging.MustGetLogger("blockdb") + + // ErrNoHeadBlock is returned when calling Blockchain.Head() when no head block exists + ErrNoHeadBlock = fmt.Errorf("found no head block") +) + +//go:generate skyencoder -unexported -struct Block -output-path . -package blockdb github.com/SkycoinProject/skycoin/src/coin +//go:generate skyencoder -unexported -struct UxOut -output-path . -package blockdb github.com/SkycoinProject/skycoin/src/coin +//go:generate skyencoder -unexported -struct hashPairsWrapper +//go:generate skyencoder -unexported -struct hashesWrapper +//go:generate skyencoder -unexported -struct sigWrapper + +// hashesWrapper wraps []cipher.SHA256 so it can be used by skyencoder +type hashesWrapper struct { + Hashes []cipher.SHA256 +} + +// sigWrapper wraps cipher.Sig in struct so it can be used by skyencoder +type sigWrapper struct { + Sig cipher.Sig +} + +// hashPairsWrapper wraps []coin.HashPair so it can be used by skyencoder +type hashPairsWrapper struct { + HashPairs []coin.HashPair +} + +// ErrMissingSignature is returned if a block in the db does not have a corresponding signature in the db +type ErrMissingSignature struct { + b *coin.Block +} + +// NewErrMissingSignature creates ErrMissingSignature from *coin.Block +func NewErrMissingSignature(b *coin.Block) error { + return ErrMissingSignature{ + b: b, + } +} + +func (e ErrMissingSignature) Error() string { + return fmt.Sprintf("Signature not found for block seq=%d hash=%s", e.b.Head.BkSeq, e.b.HashHeader().Hex()) +} + +// CreateBuckets creates bolt.DB buckets used by the blockdb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + BlockSigsBkt, + BlocksBkt, + TreeBkt, + BlockchainMetaBkt, + UnspentPoolBkt, + UnspentPoolAddrIndexBkt, + UnspentMetaBkt, + }) +} + +// BlockTree block storage +type BlockTree interface { + AddBlock(*dbutil.Tx, *coin.Block) error + GetBlock(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetBlockInDepth(*dbutil.Tx, uint64, Walker) (*coin.Block, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error +} + +// BlockSigs block signature storage +type BlockSigs interface { + Add(*dbutil.Tx, cipher.SHA256, cipher.Sig) error + Get(*dbutil.Tx, cipher.SHA256) (cipher.Sig, bool, error) + ForEach(*dbutil.Tx, func(cipher.SHA256, cipher.Sig) error) error +} + +//go:generate mockery -name UnspentPooler -case underscore -testonly -inpkg + +// UnspentPooler unspent outputs pool +type UnspentPooler interface { + MaybeBuildIndexes(*dbutil.Tx, uint64) error + Len(*dbutil.Tx) (uint64, error) + Contains(*dbutil.Tx, cipher.SHA256) (bool, error) + Get(*dbutil.Tx, cipher.SHA256) (*coin.UxOut, error) + GetAll(*dbutil.Tx) (coin.UxArray, error) + GetArray(*dbutil.Tx, []cipher.SHA256) (coin.UxArray, error) + GetUxHash(*dbutil.Tx) (cipher.SHA256, error) + GetUnspentsOfAddrs(*dbutil.Tx, []cipher.Address) (coin.AddressUxOuts, error) + GetUnspentHashesOfAddrs(*dbutil.Tx, []cipher.Address) (AddressHashes, error) + ProcessBlock(*dbutil.Tx, *coin.SignedBlock) error + AddressCount(*dbutil.Tx) (uint64, error) +} + +// ChainMeta blockchain metadata +type ChainMeta interface { + GetHeadSeq(*dbutil.Tx) (uint64, bool, error) + SetHeadSeq(*dbutil.Tx, uint64) error +} + +// Blockchain maintain the buckets for blockchain +type Blockchain struct { + db *dbutil.DB + meta ChainMeta + unspent UnspentPooler + tree BlockTree + sigs BlockSigs + walker Walker +} + +// NewBlockchain creates a new blockchain instance +func NewBlockchain(db *dbutil.DB, walker Walker) (*Blockchain, error) { + if db == nil { + return nil, errors.New("db is nil") + } + + if walker == nil { + return nil, errors.New("blockchain walker is nil") + } + + return &Blockchain{ + db: db, + unspent: NewUnspentPool(), + meta: &chainMeta{}, + tree: &blockTree{}, + sigs: &blockSigs{}, + walker: walker, + }, nil +} + +// UnspentPool returns the unspent pool +func (bc *Blockchain) UnspentPool() UnspentPooler { + return bc.unspent +} + +// AddBlock adds signed block +func (bc *Blockchain) AddBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + if err := bc.sigs.Add(tx, sb.HashHeader(), sb.Sig); err != nil { + return fmt.Errorf("save signature failed: %v", err) + } + + if err := bc.tree.AddBlock(tx, &sb.Block); err != nil { + return fmt.Errorf("save block failed: %v", err) + } + + // update block head seq and unspent pool + if err := bc.processBlock(tx, sb); err != nil { + return err + } + + return nil +} + +// processBlock processes a block and updates the db +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + if err := bc.unspent.ProcessBlock(tx, b); err != nil { + return err + } + + return bc.meta.SetHeadSeq(tx, b.Seq()) +} + +// Head returns head block, returns error if no head block exists +func (bc *Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + seq, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } else if !ok { + return nil, ErrNoHeadBlock + } + + b, err := bc.GetSignedBlockBySeq(tx, seq) + if err != nil { + return nil, err + } + + if b == nil { + return nil, ErrNoHeadBlock + } + + return b, nil +} + +// HeadSeq returns the head block sequence +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.meta.GetHeadSeq(tx) +} + +// Len returns blockchain length +func (bc *Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + seq, ok, err := bc.meta.GetHeadSeq(tx) + if err != nil { + return 0, err + } else if !ok { + return 0, nil + } + + return seq + 1, nil +} + +// GetBlockSignature returns the signature of a block +func (bc *Blockchain) GetBlockSignature(tx *dbutil.Tx, b *coin.Block) (cipher.Sig, bool, error) { + return bc.sigs.Get(tx, b.HashHeader()) +} + +// GetBlockByHash returns block of given hash +func (bc *Blockchain) GetBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err + } + + return b, nil +} + +// GetSignedBlockByHash returns signed block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err + } + if b == nil { + return nil, nil + } + + // get signature + sig, ok, err := bc.sigs.Get(tx, hash) + if err != nil { + return nil, fmt.Errorf("find signature of block: %v failed: %v", hash.Hex(), err) + } + + if !ok { + return nil, NewErrMissingSignature(b) + } + + return &coin.SignedBlock{ + Block: *b, + Sig: sig, + }, nil +} + +// GetSignedBlockBySeq returns signed block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlockInDepth(tx, seq, bc.walker) + if err != nil { + return nil, fmt.Errorf("bc.tree.GetBlockInDepth failed: %v", err) + } + if b == nil { + return nil, nil + } + + sig, ok, err := bc.sigs.Get(tx, b.HashHeader()) + if err != nil { + return nil, fmt.Errorf("find signature of block: %v failed: %v", seq, err) + } + + if !ok { + return nil, NewErrMissingSignature(b) + } + + return &coin.SignedBlock{ + Block: *b, + Sig: sig, + }, nil +} + +// GetGenesisBlock returns genesis block +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.GetSignedBlockBySeq(tx, 0) +} + +// ForEachBlock iterates all blocks and calls f on them +func (bc *Blockchain) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return bc.tree.ForEachBlock(tx, f) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain_test.go new file mode 100644 index 00000000..fc4f8669 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain_test.go @@ -0,0 +1,617 @@ +package blockdb + +import ( + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + return CreateBuckets(tx) + }) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) + + genTime uint64 = 1000 + genCoinHours uint64 = 1000 * 1000 +) + +func feeCalc(t *coin.Transaction) (uint64, error) { + return 0, nil +} + +type fakeStorage struct { + tree *fakeBlockTree + sigs *fakeSignatureStore + unspent *fakeUnspentPool + chainMeta *fakeChainMeta +} + +func newFakeStorage() *fakeStorage { + var failedWhenSaved bool + return &fakeStorage{ + tree: newFakeBlockTree(&failedWhenSaved), + sigs: newFakeSigStore(&failedWhenSaved), + unspent: newFakeUnspentPool(&failedWhenSaved), + chainMeta: newFakeChainMeta(), + } +} + +type fakeBlockTree struct { + blocks map[string]*coin.Block + saveFailed bool + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool +} + +func newFakeBlockTree(failedWhenSaved *bool) *fakeBlockTree { + return &fakeBlockTree{ + blocks: make(map[string]*coin.Block), + failedWhenSaved: failedWhenSaved, + } +} + +func (bt *fakeBlockTree) AddBlock(tx *dbutil.Tx, b *coin.Block) error { + if bt.saveFailed { + if bt.failedWhenSaved != nil { + *bt.failedWhenSaved = true + } + return errors.New("intentionally failed") + } + bt.blocks[b.HashHeader().Hex()] = b + return nil +} + +func (bt *fakeBlockTree) GetBlock(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + if bt.failedWhenSaved != nil && *bt.failedWhenSaved { + return nil, nil + } + return bt.blocks[hash.Hex()], nil +} + +func (bt *fakeBlockTree) GetBlockInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (*coin.Block, error) { + if bt.failedWhenSaved != nil && *bt.failedWhenSaved { + return nil, nil + } + + for _, b := range bt.blocks { + if b.Head.BkSeq == depth { + return b, nil + } + } + + return nil, nil +} + +func (bt *fakeBlockTree) ForEachBlock(tx *dbutil.Tx, f func(*coin.Block) error) error { + return nil +} + +type fakeSignatureStore struct { + sigs map[string]cipher.Sig + saveFailed bool + getSigErr error + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool +} + +func newFakeSigStore(failedWhenSaved *bool) *fakeSignatureStore { + return &fakeSignatureStore{ + sigs: make(map[string]cipher.Sig), + failedWhenSaved: failedWhenSaved, + } +} + +func (ss *fakeSignatureStore) Add(tx *dbutil.Tx, hash cipher.SHA256, sig cipher.Sig) error { + if ss.saveFailed { + if ss.failedWhenSaved != nil { + *ss.failedWhenSaved = true + } + return errors.New("intentionally failed") + } + + ss.sigs[hash.Hex()] = sig + return nil +} + +func (ss *fakeSignatureStore) Get(tx *dbutil.Tx, hash cipher.SHA256) (cipher.Sig, bool, error) { + if ss.failedWhenSaved != nil && *ss.failedWhenSaved { + return cipher.Sig{}, false, nil + } + + if ss.getSigErr != nil { + return cipher.Sig{}, false, ss.getSigErr + } + + sig, ok := ss.sigs[hash.Hex()] + return sig, ok, nil +} + +func (ss *fakeSignatureStore) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, cipher.Sig) error) error { + return nil +} + +type fakeUnspentPool struct { + outs map[cipher.SHA256]coin.UxOut + uxHash cipher.SHA256 + saveFailed bool + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool +} + +func newFakeUnspentPool(failedWhenSaved *bool) *fakeUnspentPool { + return &fakeUnspentPool{ + outs: make(map[cipher.SHA256]coin.UxOut), + failedWhenSaved: failedWhenSaved, + } +} + +func (fup *fakeUnspentPool) MaybeBuildIndexes(tx *dbutil.Tx, height uint64) error { + return nil +} + +func (fup *fakeUnspentPool) Len(tx *dbutil.Tx) (uint64, error) { + return uint64(len(fup.outs)), nil +} + +func (fup *fakeUnspentPool) Get(tx *dbutil.Tx, h cipher.SHA256) (*coin.UxOut, error) { + out, ok := fup.outs[h] + if !ok { + return nil, nil + } + return &out, nil +} + +func (fup *fakeUnspentPool) GetAll(tx *dbutil.Tx) (coin.UxArray, error) { + outs := make(coin.UxArray, 0, len(fup.outs)) + for _, out := range fup.outs { + outs = append(outs, out) + } + + return outs, nil +} + +func (fup *fakeUnspentPool) GetArray(tx *dbutil.Tx, hashes []cipher.SHA256) (coin.UxArray, error) { + outs := make(coin.UxArray, 0, len(hashes)) + for _, h := range hashes { + ux, ok := fup.outs[h] + if !ok { + return nil, fmt.Errorf("unspent output of %s does not exist", h.Hex()) + } + + outs = append(outs, ux) + } + return outs, nil +} + +func (fup *fakeUnspentPool) GetUxHash(tx *dbutil.Tx) (cipher.SHA256, error) { + return fup.uxHash, nil +} + +func (fup *fakeUnspentPool) GetUnspentHashesOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (AddressHashes, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, a := range addrs { + addrm[a] = struct{}{} + } + + addrOutMap := make(AddressHashes) + for _, out := range fup.outs { + addr := out.Body.Address + addrOutMap[addr] = append(addrOutMap[addr], out.Hash()) + } + + return addrOutMap, nil +} + +func (fup *fakeUnspentPool) GetUnspentsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, a := range addrs { + addrm[a] = struct{}{} + } + + addrOutMap := make(coin.AddressUxOuts) + for _, out := range fup.outs { + addr := out.Body.Address + addrOutMap[addr] = append(addrOutMap[addr], out) + } + + return addrOutMap, nil +} + +func (fup *fakeUnspentPool) ProcessBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + if fup.saveFailed { + if fup.failedWhenSaved != nil { + *fup.failedWhenSaved = true + } + return errors.New("intentionally failed") + } + return nil +} + +func (fup *fakeUnspentPool) Contains(tx *dbutil.Tx, h cipher.SHA256) (bool, error) { + _, ok := fup.outs[h] + return ok, nil +} + +func (fup *fakeUnspentPool) AddressCount(tx *dbutil.Tx) (uint64, error) { + addrs := make(map[cipher.Address]struct{}) + for _, out := range fup.outs { + addrs[out.Body.Address] = struct{}{} + } + + return uint64(len(addrs)), nil +} + +type fakeChainMeta struct { + headSeq uint64 + didSetSeq bool +} + +func newFakeChainMeta() *fakeChainMeta { + return &fakeChainMeta{} +} + +func (fcm *fakeChainMeta) GetHeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + if !fcm.didSetSeq { + return 0, false, nil + } + + return fcm.headSeq, true, nil +} + +func (fcm *fakeChainMeta) SetHeadSeq(tx *dbutil.Tx, seq uint64) error { + fcm.headSeq = seq + fcm.didSetSeq = true + return nil +} + +func DefaultWalker(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + return hps[0].Hash, true +} + +func makeGenesisBlock(t *testing.T) coin.SignedBlock { + gb, err := coin.NewGenesisBlock(genAddress, genCoinHours, genTime) + require.NoError(t, err) + + sig := cipher.MustSignHash(gb.HashHeader(), genSecret) + return coin.SignedBlock{ + Block: *gb, + Sig: sig, + } +} + +func TestBlockchainAddBlock(t *testing.T) { + type expect struct { + err error + sigSaved bool + blockSaved bool + headSeq uint64 + } + + type failedSaves struct { + tree bool + sigs bool + unspent bool + } + + tt := []struct { + name string + fakeStorage *fakeStorage + failedSaves failedSaves + expect expect + }{ + { + "ok", + newFakeStorage(), + failedSaves{}, + expect{ + nil, + true, + true, + uint64(0), + }, + }, + { + "save sig failed", + newFakeStorage(), + failedSaves{ + sigs: true, + }, + expect{ + errors.New("save signature failed: intentionally failed"), + false, + false, + uint64(0), + }, + }, + { + "save block failed", + newFakeStorage(), + failedSaves{ + tree: true, + }, + expect{ + errors.New("save block failed: intentionally failed"), + false, + false, + uint64(0), + }, + }, + { + "unspent process block failed", + newFakeStorage(), + failedSaves{ + unspent: true, + }, + expect{ + errors.New("intentionally failed"), + false, + false, + uint64(0), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + tc.fakeStorage.tree.saveFailed = tc.failedSaves.tree + tc.fakeStorage.sigs.saveFailed = tc.failedSaves.sigs + tc.fakeStorage.unspent.saveFailed = tc.failedSaves.unspent + + bc := &Blockchain{ + db: db, + unspent: tc.fakeStorage.unspent, + meta: tc.fakeStorage.chainMeta, + tree: tc.fakeStorage.tree, + sigs: tc.fakeStorage.sigs, + walker: DefaultWalker, + } + + gb := makeGenesisBlock(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &gb) + require.Equal(t, tc.expect.err, err) + return nil + }) + require.NoError(t, err) + + // check sig + err = db.View("", func(tx *dbutil.Tx) error { + _, ok, err := tc.fakeStorage.sigs.Get(tx, gb.HashHeader()) + require.NoError(t, err) + require.Equal(t, tc.expect.sigSaved, ok) + + // check block in tree + b, err := tc.fakeStorage.tree.GetBlock(tx, gb.HashHeader()) + require.NoError(t, err) + require.Equal(t, tc.expect.blockSaved, b != nil) + + // check head seq + headSeq, ok, err := bc.HeadSeq(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.True(t, ok) + require.Equal(t, tc.expect.headSeq, headSeq) + } else { + require.False(t, ok) + } + + // check len + length, err := bc.Len(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.Equal(t, uint64(1), length) + } else { + require.Equal(t, uint64(0), length) + } + + // check genesis block + genesisBlock, err := bc.GetGenesisBlock(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.NotNil(t, genesisBlock) + require.Equal(t, gb, *genesisBlock) + } else { + require.Nil(t, genesisBlock) + } + + return nil + }) + require.NoError(t, err) + }) + } + +} + +func TestBlockchainHead(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + _, err = bc.Head(tx) + require.Equal(t, err, ErrNoHeadBlock) + + gb := makeGenesisBlock(t) + + err := bc.AddBlock(tx, &gb) + require.NoError(t, err) + + b, err := bc.Head(tx) + require.NoError(t, err) + require.Equal(t, gb.HashHeader().Hex(), b.HashHeader().Hex()) + + return nil + }) + require.NoError(t, err) +} + +func TestBlockchainLen(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) + + gb := makeGenesisBlock(t) + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) +} + +func TestBlockchainGetBlockByHash(t *testing.T) { + gb := makeGenesisBlock(t) + + type expect struct { + err error + b *coin.SignedBlock + } + + tt := []struct { + name string + tree BlockTree + sigs BlockSigs + hash cipher.SHA256 + expect expect + }{ + { + "ok", + &fakeBlockTree{ + blocks: map[string]*coin.Block{ + gb.HashHeader().Hex(): &gb.Block, + }, + }, + &fakeSignatureStore{ + sigs: map[string]cipher.Sig{ + gb.HashHeader().Hex(): gb.Sig, + }, + }, + gb.HashHeader(), + expect{ + nil, + &gb, + }, + }, + { + "block not exist", + &fakeBlockTree{ + blocks: map[string]*coin.Block{}, + }, + &fakeSignatureStore{ + sigs: map[string]cipher.Sig{}, + }, + gb.HashHeader(), + expect{ + nil, + nil, + }, + }, + { + "signature not exist", + &fakeBlockTree{ + blocks: map[string]*coin.Block{ + gb.HashHeader().Hex(): &gb.Block, + }, + }, + &fakeSignatureStore{ + sigs: map[string]cipher.Sig{}, + }, + gb.HashHeader(), + expect{ + NewErrMissingSignature(&gb.Block), + nil, + }, + }, + { + "get signature error", + &fakeBlockTree{ + blocks: map[string]*coin.Block{ + gb.HashHeader().Hex(): &gb.Block, + }, + }, + &fakeSignatureStore{ + getSigErr: errors.New("intentional error"), + sigs: map[string]cipher.Sig{}, + }, + gb.HashHeader(), + expect{ + fmt.Errorf("find signature of block: %v failed: intentional error", gb.HashHeader().Hex()), + nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc.tree = tc.tree + bc.sigs = tc.sigs + + err = db.View("", func(tx *dbutil.Tx) error { + b, err := bc.GetSignedBlockByHash(tx, tc.hash) + require.Equal(t, tc.expect.err, err) + require.Equal(t, tc.expect.b, b) + return nil + }) + require.NoError(t, err) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs.go new file mode 100644 index 00000000..16b5cda4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs.go @@ -0,0 +1,69 @@ +package blockdb + +import ( + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // BlockSigsBkt holds block signatures + BlockSigsBkt = []byte("block_sigs") +) + +// blockSigs manages known blockSigs as received. +// TODO -- support out of order blocks. This requires a change to the +// message protocol to support ranges similar to bitcoin's locator hashes. +// We also need to keep track of whether a block has been executed so that +// as continuity is established we can execute chains of blocks. +// TODO -- Since we will need to hold blocks that cannot be verified +// immediately against the blockchain, we need to be able to hold multiple +// blockSigs per BkSeq, or use hashes as keys. For now, this is not a +// problem assuming the signed blocks created by a block publisher are valid blocks, +// because we can check the signature independently of the blockchain. +type blockSigs struct{} + +// Get returns the signature of a specific block +func (bs *blockSigs) Get(tx *dbutil.Tx, hash cipher.SHA256) (cipher.Sig, bool, error) { + var sig sigWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, BlockSigsBkt, hash[:]) + if err != nil { + return cipher.Sig{}, false, err + } else if v == nil { + return cipher.Sig{}, false, nil + } + + if err := decodeSigWrapperExact(v, &sig); err != nil { + return cipher.Sig{}, false, err + } + + return sig.Sig, true, nil +} + +// Add adds a signed block to the db +func (bs *blockSigs) Add(tx *dbutil.Tx, hash cipher.SHA256, sig cipher.Sig) error { + buf, err := encodeSigWrapper(&sigWrapper{ + Sig: sig, + }) + if err != nil { + return err + } + return dbutil.PutBucketValue(tx, BlockSigsBkt, hash[:], buf) +} + +// ForEach iterates all signatures and calls f on them +func (bs *blockSigs) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, cipher.Sig) error) error { + return dbutil.ForEach(tx, BlockSigsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var sig sigWrapper + if err := decodeSigWrapperExact(v, &sig); err != nil { + return err + } + + return f(hash, sig.Sig) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs_test.go new file mode 100644 index 00000000..cce08817 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs_test.go @@ -0,0 +1,127 @@ +package blockdb + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func TestBlockSigsGet(t *testing.T) { + type hashSig struct { + hash cipher.SHA256 + sig cipher.Sig + } + + type expect struct { + exist bool + sig cipher.Sig + err error + } + + hashSigs := []hashSig{} + for i := 0; i < 5; i++ { + _, s := cipher.GenerateKeyPair() + h := testutil.RandSHA256(t) + + sig := cipher.MustSignHash(h, s) + hashSigs = append(hashSigs, hashSig{ + hash: h, + sig: sig, + }) + } + + tt := []struct { + name string + init []hashSig + hash cipher.SHA256 + expect expect + }{ + { + "ok", + hashSigs[:], + hashSigs[0].hash, + expect{ + true, + hashSigs[0].sig, + nil, + }, + }, + { + "not exist", + hashSigs[1:], + hashSigs[0].hash, + expect{ + false, + cipher.Sig{}, + nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + // init db + err := db.Update("", func(tx *dbutil.Tx) error { + bkt, err := tx.CreateBucketIfNotExists(BlockSigsBkt) + require.NoError(t, err) + for _, hs := range tc.init { + err = bkt.Put(hs.hash[:], encoder.Serialize(hs.sig)) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + sigs := &blockSigs{} + + err = db.View("", func(tx *dbutil.Tx) error { + sg, ok, err := sigs.Get(tx, tc.hash) + require.Equal(t, tc.expect.err, err) + require.Equal(t, tc.expect.exist, ok) + if ok { + require.Equal(t, tc.expect.sig, sg) + } + + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestBlockSigsAdd(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + _, s := cipher.GenerateKeyPair() + h := testutil.RandSHA256(t) + sig := cipher.MustSignHash(h, s) + + sigs := &blockSigs{} + + err := db.Update("", func(tx *dbutil.Tx) error { + return sigs.Add(tx, h, sig) + }) + require.NoError(t, err) + + // check the db + err = db.View("", func(tx *dbutil.Tx) error { + bkt := tx.Bucket(BlockSigsBkt) + v := bkt.Get(h[:]) + require.NotNil(t, v) + var s cipher.Sig + err := encoder.DeserializeRawExact(v, &s) + require.NoError(t, err) + require.Equal(t, sig, s) + return nil + }) + require.NoError(t, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/chain_meta.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/chain_meta.go new file mode 100644 index 00000000..b1a9d355 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/chain_meta.go @@ -0,0 +1,29 @@ +package blockdb + +import ( + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // BlockchainMetaBkt holds blockchain metadata + BlockchainMetaBkt = []byte("blockchain_meta") + // blockchain head sequence number + headSeqKey = []byte("head_seq") +) + +type chainMeta struct{} + +func (m chainMeta) SetHeadSeq(tx *dbutil.Tx, seq uint64) error { + return dbutil.PutBucketValue(tx, BlockchainMetaBkt, headSeqKey, dbutil.Itob(seq)) +} + +func (m chainMeta) GetHeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, BlockchainMetaBkt, headSeqKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go new file mode 100644 index 00000000..9bc4b04c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go @@ -0,0 +1,141 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeHashPairsWrapper computes the size of an encoded object of type hashPairsWrapper +func encodeSizeHashPairsWrapper(obj *hashPairsWrapper) uint64 { + i0 := uint64(0) + + // obj.HashPairs + i0 += 4 + { + i1 := uint64(0) + + // x1.Hash + i1 += 32 + + // x1.PrevHash + i1 += 32 + + i0 += uint64(len(obj.HashPairs)) * i1 + } + + return i0 +} + +// encodeHashPairsWrapper encodes an object of type hashPairsWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeHashPairsWrapper(obj *hashPairsWrapper) ([]byte, error) { + n := encodeSizeHashPairsWrapper(obj) + buf := make([]byte, n) + + if err := encodeHashPairsWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeHashPairsWrapperToBuffer encodes an object of type hashPairsWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeHashPairsWrapperToBuffer(buf []byte, obj *hashPairsWrapper) error { + if uint64(len(buf)) < encodeSizeHashPairsWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.HashPairs length check + if uint64(len(obj.HashPairs)) > math.MaxUint32 { + return errors.New("obj.HashPairs length exceeds math.MaxUint32") + } + + // obj.HashPairs length + e.Uint32(uint32(len(obj.HashPairs))) + + // obj.HashPairs + for _, x := range obj.HashPairs { + + // x.Hash + e.CopyBytes(x.Hash[:]) + + // x.PrevHash + e.CopyBytes(x.PrevHash[:]) + + } + + return nil +} + +// decodeHashPairsWrapper decodes an object of type hashPairsWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeHashPairsWrapper(buf []byte, obj *hashPairsWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.HashPairs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.HashPairs = make([]coin.HashPair, length) + + for z1 := range obj.HashPairs { + { + // obj.HashPairs[z1].Hash + if len(d.Buffer) < len(obj.HashPairs[z1].Hash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.HashPairs[z1].Hash[:], d.Buffer[:len(obj.HashPairs[z1].Hash)]) + d.Buffer = d.Buffer[len(obj.HashPairs[z1].Hash):] + } + + { + // obj.HashPairs[z1].PrevHash + if len(d.Buffer) < len(obj.HashPairs[z1].PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.HashPairs[z1].PrevHash[:], d.Buffer[:len(obj.HashPairs[z1].PrevHash)]) + d.Buffer = d.Buffer[len(obj.HashPairs[z1].PrevHash):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeHashPairsWrapperExact decodes an object of type hashPairsWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeHashPairsWrapperExact(buf []byte, obj *hashPairsWrapper) error { + if n, err := decodeHashPairsWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder_test.go new file mode 100644 index 00000000..3285ed6d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyHashPairsWrapperForEncodeTest() *hashPairsWrapper { + var obj hashPairsWrapper + return &obj +} + +func newRandomHashPairsWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashPairsWrapper { + var obj hashPairsWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenHashPairsWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashPairsWrapper { + var obj hashPairsWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilHashPairsWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashPairsWrapper { + var obj hashPairsWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderHashPairsWrapper(t *testing.T, obj *hashPairsWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeHashPairsWrapper(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeHashPairsWrapper() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeHashPairsWrapper(obj) + if err != nil { + t.Fatalf("encodeHashPairsWrapper failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeHashPairsWrapper produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeHashPairsWrapper()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeHashPairsWrapperToBuffer(data3, obj); err != nil { + t.Fatalf("encodeHashPairsWrapperToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 hashPairsWrapper + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 hashPairsWrapper + if n, err := decodeHashPairsWrapper(data2, &obj3); err != nil { + t.Fatalf("decodeHashPairsWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashPairsWrapper bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashPairsWrapper()") + } + + // Decode, excess buffer + var obj4 hashPairsWrapper + n, err := decodeHashPairsWrapper(data3, &obj4) + if err != nil { + t.Fatalf("decodeHashPairsWrapper failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeHashPairsWrapper bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeHashPairsWrapper bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashPairsWrapper()") + } + + // DecodeExact + var obj5 hashPairsWrapper + if err := decodeHashPairsWrapperExact(data2, &obj5); err != nil { + t.Fatalf("decodeHashPairsWrapper failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashPairsWrapper()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeHashPairsWrapper(data4, &obj3); err != nil { + t.Fatalf("decodeHashPairsWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashPairsWrapper bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderHashPairsWrapper(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *hashPairsWrapper + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyHashPairsWrapperForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomHashPairsWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenHashPairsWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilHashPairsWrapperForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderHashPairsWrapper(t, tc.obj) + }) + } +} + +func decodeHashPairsWrapperExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashPairsWrapper + if _, err := decodeHashPairsWrapper(buf, &obj); err == nil { + t.Fatal("decodeHashPairsWrapper: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashPairsWrapper: expected error %q, got %q", expectedErr, err) + } +} + +func decodeHashPairsWrapperExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashPairsWrapper + if err := decodeHashPairsWrapperExact(buf, &obj); err == nil { + t.Fatal("decodeHashPairsWrapperExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashPairsWrapperExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderHashPairsWrapperDecodeErrors(t *testing.T, k int, tag string, obj *hashPairsWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeHashPairsWrapper(obj) + buf, err := encodeHashPairsWrapper(obj) + if err != nil { + t.Fatalf("encodeHashPairsWrapper failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashPairsWrapperExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashPairsWrapperExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashPairsWrapperExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashPairsWrapperExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeHashPairsWrapperExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderHashPairsWrapperDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyHashPairsWrapperForEncodeTest() + fullObj := newRandomHashPairsWrapperForEncodeTest(t, rand) + testSkyencoderHashPairsWrapperDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderHashPairsWrapperDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go new file mode 100644 index 00000000..f88f3085 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go @@ -0,0 +1,126 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeHashesWrapper computes the size of an encoded object of type hashesWrapper +func encodeSizeHashesWrapper(obj *hashesWrapper) uint64 { + i0 := uint64(0) + + // obj.Hashes + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Hashes)) * i1 + } + + return i0 +} + +// encodeHashesWrapper encodes an object of type hashesWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeHashesWrapper(obj *hashesWrapper) ([]byte, error) { + n := encodeSizeHashesWrapper(obj) + buf := make([]byte, n) + + if err := encodeHashesWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeHashesWrapperToBuffer encodes an object of type hashesWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeHashesWrapperToBuffer(buf []byte, obj *hashesWrapper) error { + if uint64(len(buf)) < encodeSizeHashesWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Hashes length check + if uint64(len(obj.Hashes)) > math.MaxUint32 { + return errors.New("obj.Hashes length exceeds math.MaxUint32") + } + + // obj.Hashes length + e.Uint32(uint32(len(obj.Hashes))) + + // obj.Hashes + for _, x := range obj.Hashes { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeHashesWrapper decodes an object of type hashesWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeHashesWrapper(buf []byte, obj *hashesWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Hashes + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Hashes = make([]cipher.SHA256, length) + + for z1 := range obj.Hashes { + { + // obj.Hashes[z1] + if len(d.Buffer) < len(obj.Hashes[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Hashes[z1][:], d.Buffer[:len(obj.Hashes[z1])]) + d.Buffer = d.Buffer[len(obj.Hashes[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeHashesWrapperExact decodes an object of type hashesWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeHashesWrapperExact(buf []byte, obj *hashesWrapper) error { + if n, err := decodeHashesWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder_test.go new file mode 100644 index 00000000..d2b894f0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyHashesWrapperForEncodeTest() *hashesWrapper { + var obj hashesWrapper + return &obj +} + +func newRandomHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderHashesWrapper(t *testing.T, obj *hashesWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeHashesWrapper(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeHashesWrapper() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeHashesWrapper(obj) + if err != nil { + t.Fatalf("encodeHashesWrapper failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeHashesWrapper produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeHashesWrapper()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeHashesWrapperToBuffer(data3, obj); err != nil { + t.Fatalf("encodeHashesWrapperToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 hashesWrapper + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 hashesWrapper + if n, err := decodeHashesWrapper(data2, &obj3); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // Decode, excess buffer + var obj4 hashesWrapper + n, err := decodeHashesWrapper(data3, &obj4) + if err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // DecodeExact + var obj5 hashesWrapper + if err := decodeHashesWrapperExact(data2, &obj5); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeHashesWrapper(data4, &obj3); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderHashesWrapper(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *hashesWrapper + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyHashesWrapperForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomHashesWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenHashesWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilHashesWrapperForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderHashesWrapper(t, tc.obj) + }) + } +} + +func decodeHashesWrapperExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashesWrapper + if _, err := decodeHashesWrapper(buf, &obj); err == nil { + t.Fatal("decodeHashesWrapper: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashesWrapper: expected error %q, got %q", expectedErr, err) + } +} + +func decodeHashesWrapperExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashesWrapper + if err := decodeHashesWrapperExact(buf, &obj); err == nil { + t.Fatal("decodeHashesWrapperExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashesWrapperExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderHashesWrapperDecodeErrors(t *testing.T, k int, tag string, obj *hashesWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeHashesWrapper(obj) + buf, err := encodeHashesWrapper(obj) + if err != nil { + t.Fatalf("encodeHashesWrapper failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashesWrapperExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashesWrapperExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderHashesWrapperDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyHashesWrapperForEncodeTest() + fullObj := newRandomHashesWrapperForEncodeTest(t, rand) + testSkyencoderHashesWrapperDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderHashesWrapperDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go new file mode 100644 index 00000000..87526f34 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go @@ -0,0 +1,78 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeSigWrapper computes the size of an encoded object of type sigWrapper +func encodeSizeSigWrapper(obj *sigWrapper) uint64 { + i0 := uint64(0) + + // obj.Sig + i0 += 65 + + return i0 +} + +// encodeSigWrapper encodes an object of type sigWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeSigWrapper(obj *sigWrapper) ([]byte, error) { + n := encodeSizeSigWrapper(obj) + buf := make([]byte, n) + + if err := encodeSigWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeSigWrapperToBuffer encodes an object of type sigWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeSigWrapperToBuffer(buf []byte, obj *sigWrapper) error { + if uint64(len(buf)) < encodeSizeSigWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Sig + e.CopyBytes(obj.Sig[:]) + + return nil +} + +// decodeSigWrapper decodes an object of type sigWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeSigWrapper(buf []byte, obj *sigWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Sig + if len(d.Buffer) < len(obj.Sig) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sig[:], d.Buffer[:len(obj.Sig)]) + d.Buffer = d.Buffer[len(obj.Sig):] + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeSigWrapperExact decodes an object of type sigWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeSigWrapperExact(buf []byte, obj *sigWrapper) error { + if n, err := decodeSigWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder_test.go new file mode 100644 index 00000000..5701a517 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptySigWrapperForEncodeTest() *sigWrapper { + var obj sigWrapper + return &obj +} + +func newRandomSigWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *sigWrapper { + var obj sigWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenSigWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *sigWrapper { + var obj sigWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilSigWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *sigWrapper { + var obj sigWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderSigWrapper(t *testing.T, obj *sigWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeSigWrapper(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeSigWrapper() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeSigWrapper(obj) + if err != nil { + t.Fatalf("encodeSigWrapper failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeSigWrapper produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeSigWrapper()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeSigWrapperToBuffer(data3, obj); err != nil { + t.Fatalf("encodeSigWrapperToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 sigWrapper + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 sigWrapper + if n, err := decodeSigWrapper(data2, &obj3); err != nil { + t.Fatalf("decodeSigWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeSigWrapper bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSigWrapper()") + } + + // Decode, excess buffer + var obj4 sigWrapper + n, err := decodeSigWrapper(data3, &obj4) + if err != nil { + t.Fatalf("decodeSigWrapper failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeSigWrapper bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeSigWrapper bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSigWrapper()") + } + + // DecodeExact + var obj5 sigWrapper + if err := decodeSigWrapperExact(data2, &obj5); err != nil { + t.Fatalf("decodeSigWrapper failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSigWrapper()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeSigWrapper(data4, &obj3); err != nil { + t.Fatalf("decodeSigWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeSigWrapper bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderSigWrapper(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *sigWrapper + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptySigWrapperForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomSigWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenSigWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilSigWrapperForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderSigWrapper(t, tc.obj) + }) + } +} + +func decodeSigWrapperExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj sigWrapper + if _, err := decodeSigWrapper(buf, &obj); err == nil { + t.Fatal("decodeSigWrapper: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeSigWrapper: expected error %q, got %q", expectedErr, err) + } +} + +func decodeSigWrapperExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj sigWrapper + if err := decodeSigWrapperExact(buf, &obj); err == nil { + t.Fatal("decodeSigWrapperExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeSigWrapperExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderSigWrapperDecodeErrors(t *testing.T, k int, tag string, obj *sigWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeSigWrapper(obj) + buf, err := encodeSigWrapper(obj) + if err != nil { + t.Fatalf("encodeSigWrapper failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeSigWrapperExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeSigWrapperExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeSigWrapperExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeSigWrapperExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeSigWrapperExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderSigWrapperDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptySigWrapperForEncodeTest() + fullObj := newRandomSigWrapperForEncodeTest(t, rand) + testSkyencoderSigWrapperDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderSigWrapperDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db new file mode 100644 index 00000000..dcd9ede3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent.go new file mode 100644 index 00000000..6e1c04d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent.go @@ -0,0 +1,541 @@ +package blockdb + +import ( + "bytes" + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + xorhashKey = []byte("xorhash") + addrIndexHeightKey = []byte("addr_index_height") + + // UnspentPoolBkt holds unspent outputs, indexed by unspent output hash + UnspentPoolBkt = []byte("unspent_pool") + // UnspentPoolAddrIndexBkt maps addresses to their unspent outputs + UnspentPoolAddrIndexBkt = []byte("unspent_pool_addr_index") + // UnspentMetaBkt holds unspent output metadata + UnspentMetaBkt = []byte("unspent_meta") +) + +// ErrUnspentNotExist is returned if an unspent is not found in the pool +type ErrUnspentNotExist struct { + UxID string +} + +// NewErrUnspentNotExist creates ErrUnspentNotExist from a UxID +func NewErrUnspentNotExist(uxID string) error { + return ErrUnspentNotExist{ + UxID: uxID, + } +} + +func (e ErrUnspentNotExist) Error() string { + return fmt.Sprintf("unspent output of %s does not exist", e.UxID) +} + +// AddressHashes maps addresses to a set of hashes +type AddressHashes map[cipher.Address][]cipher.SHA256 + +// Flatten flattens all hash sets from AddressHashes to one slice +func (a AddressHashes) Flatten() []cipher.SHA256 { + total := 0 + for _, h := range a { + total += len(h) + } + + hashes := make([]cipher.SHA256, total) + + i := 0 + for _, h := range a { + copy(hashes[i:], h) + i += len(h) + } + + return hashes +} + +type unspentMeta struct{} + +func (m unspentMeta) getXorHash(tx *dbutil.Tx) (cipher.SHA256, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, xorhashKey) + if err != nil { + return cipher.SHA256{}, err + } else if v == nil { + return cipher.SHA256{}, nil + } + + return cipher.SHA256FromBytes(v) +} + +func (m *unspentMeta) setXorHash(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, xorhashKey, hash[:]) +} + +func (m *unspentMeta) getAddrIndexHeight(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} + +func (m *unspentMeta) setAddrIndexHeight(tx *dbutil.Tx, height uint64) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey, dbutil.Itob(height)) +} + +type pool struct{} + +func (pl pool) get(tx *dbutil.Tx, hash cipher.SHA256) (*coin.UxOut, error) { + var out coin.UxOut + + v, err := dbutil.GetBucketValueNoCopy(tx, UnspentPoolBkt, hash[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeUxOutExact(v, &out); err != nil { + return nil, err + } + + return &out, nil +} + +func (pl pool) getAll(tx *dbutil.Tx) (coin.UxArray, error) { + var uxa coin.UxArray + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + var ux coin.UxOut + if err := decodeUxOutExact(v, &ux); err != nil { + return err + } + + uxa = append(uxa, ux) + return nil + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (pl pool) put(tx *dbutil.Tx, hash cipher.SHA256, ux coin.UxOut) error { + buf, err := encodeUxOut(&ux) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnspentPoolBkt, hash[:], buf) +} + +func (pl *pool) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnspentPoolBkt, hash[:]) +} + +type poolAddrIndex struct{} + +func (p poolAddrIndex) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var hashes hashesWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, UnspentPoolAddrIndexBkt, addr.Bytes()) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashesWrapperExact(v, &hashes); err != nil { + return nil, err + } + + return hashes.Hashes, nil +} + +func (p poolAddrIndex) put(tx *dbutil.Tx, addr cipher.Address, hashes []cipher.SHA256) error { + if len(hashes) == 0 { + return errors.New("poolAddrIndex.put cannot put empty hash array") + } + + hashesMap := make(map[cipher.SHA256]struct{}, len(hashes)) + for _, h := range hashes { + if _, ok := hashesMap[h]; ok { + return errors.New("poolAddrIndex.put: hashes array contains duplicate") + } + + hashesMap[h] = struct{}{} + } + + buf, err := encodeHashesWrapper(&hashesWrapper{ + Hashes: hashes, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnspentPoolAddrIndexBkt, addr.Bytes(), buf) +} + +// adjust adds and removes hashes from an address -> hashes index +// TODO -- if necessary, this can be optimized further to accept multiple addresses at once, +// so that all get queries can be performed before the set +func (p poolAddrIndex) adjust(tx *dbutil.Tx, addr cipher.Address, addHashes, rmHashes []cipher.SHA256) error { + if len(addHashes) == 0 && len(rmHashes) == 0 { + return nil + } + + existingHashes, err := p.get(tx, addr) + if err != nil { + return err + } + + rmHashesMap := make(map[cipher.SHA256]struct{}, len(rmHashes)) + for _, h := range rmHashes { + rmHashesMap[h] = struct{}{} + } + + if len(rmHashesMap) != len(rmHashes) { + return errors.New("poolAddrIndex.adjust: rmHashes contains duplicates") + } + + newHashesSize := len(existingHashes) - len(rmHashes) + if newHashesSize < 0 { + return errors.New("poolAddrIndex.adjust: rmHashes is longer than existingHashes") + } + + newHashes := make([]cipher.SHA256, 0, newHashesSize) + newHashesMap := make(map[cipher.SHA256]struct{}, newHashesSize) + + rmHashesCount := 0 + for _, h := range existingHashes { + if _, ok := rmHashesMap[h]; ok { + rmHashesCount++ + } else { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } + } + + if rmHashesCount != len(rmHashes) { + return fmt.Errorf("poolAddrIndex.adjust: rmHashes contains %d hashes not indexed for address %s", len(rmHashes)-rmHashesCount, addr.String()) + } + + for _, h := range addHashes { + if _, ok := rmHashesMap[h]; ok { + return errors.New("poolAddrIndex.adjust: hash appears in both addHashes and rmHashes") + } + + if _, ok := newHashesMap[h]; !ok { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } else { + return fmt.Errorf("poolAddrIndex.adjust: uxout hash %s is already indexed for address %s", h.Hex(), addr.String()) + } + } + + // Delete the row if hashes is empty, so that the length of the bucket can + // be used to determine the number of addresses with unspents + if len(newHashes) == 0 { + return dbutil.Delete(tx, UnspentPoolAddrIndexBkt, addr.Bytes()) + } + + return p.put(tx, addr, newHashes) +} + +// Unspents unspent outputs pool +type Unspents struct { + pool *pool + poolAddrIndex *poolAddrIndex + meta *unspentMeta +} + +// NewUnspentPool creates new unspent pool instance +func NewUnspentPool() *Unspents { + return &Unspents{ + pool: &pool{}, + poolAddrIndex: &poolAddrIndex{}, + meta: &unspentMeta{}, + } +} + +// MaybeBuildIndexes builds indexes if necessary +func (up *Unspents) MaybeBuildIndexes(tx *dbutil.Tx, headSeq uint64) error { + logger.Info("Unspents.MaybeBuildIndexes") + + // Compare the addrIndexHeight to the head block, + // if not equal, rebuild the address index + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + if err != nil { + return err + } + + if ok && addrIndexHeight == headSeq { + return nil + } + + if addrIndexHeight > headSeq { + logger.Critical().Warningf("addrIndexHeight > headSeq (%d > %d)", addrIndexHeight, headSeq) + } + + logger.Infof("Rebuilding unspent_pool_addr_index (addrHeightIndexExists=%v, addrIndexHeight=%d, headSeq=%d)", ok, addrIndexHeight, headSeq) + + return up.buildAddrIndex(tx) +} + +func (up *Unspents) buildAddrIndex(tx *dbutil.Tx) error { + logger.Info("Building unspent address index") + + if err := dbutil.Reset(tx, UnspentPoolAddrIndexBkt); err != nil { + return err + } + + addrHashes := make(map[cipher.Address][]cipher.SHA256) + + var maxBlockSeq uint64 + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + var ux coin.UxOut + if err := decodeUxOutExact(v, &ux); err != nil { + return err + } + + if ux.Head.BkSeq > maxBlockSeq { + maxBlockSeq = ux.Head.BkSeq + } + + h := ux.Hash() + + if !bytes.Equal(k[:], h[:]) { + return errors.New("Unspent pool uxout.Hash() does not match its key") + } + + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], h) + + return nil + }); err != nil { + return err + } + + if len(addrHashes) == 0 { + logger.Infof("No unspents to index") + return nil + } + + for addr, hashes := range addrHashes { + if err := up.poolAddrIndex.put(tx, addr, hashes); err != nil { + return err + } + } + + if err := up.meta.setAddrIndexHeight(tx, maxBlockSeq); err != nil { + return err + } + + logger.Infof("Indexed unspents for %d addresses", len(addrHashes)) + + return nil +} + +// ProcessBlock adds unspents from a block to the unspent pool +func (up *Unspents) ProcessBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Gather all transaction inputs + var inputs []cipher.SHA256 + var txnUxs coin.UxArray + for _, txn := range b.Body.Transactions { + inputs = append(inputs, txn.In...) + txnUxs = append(txnUxs, coin.CreateUnspents(b.Head, txn)...) + } + + uxs, err := up.GetArray(tx, inputs) + if err != nil { + return err + } + + xorHash, err := up.meta.getXorHash(tx) + if err != nil { + return err + } + + // Remove spent outputs + rmAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for _, ux := range uxs { + xorHash = xorHash.Xor(ux.SnapshotHash()) + + h := ux.Hash() + + if err := up.pool.delete(tx, h); err != nil { + return err + } + + rmAddrHashes[ux.Body.Address] = append(rmAddrHashes[ux.Body.Address], h) + } + + // Create new outputs + txnUxHashes := make([]cipher.SHA256, len(txnUxs)) + addAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for i, ux := range txnUxs { + h := ux.Hash() + txnUxHashes[i] = h + addAddrHashes[ux.Body.Address] = append(addAddrHashes[ux.Body.Address], h) + } + + // Check that the uxout exists in the pool already, otherwise xorHash will be calculated wrong + for _, h := range txnUxHashes { + if hasKey, err := up.Contains(tx, h); err != nil { + return err + } else if hasKey { + return fmt.Errorf("attempted to insert uxout:%v twice into the unspent pool", h.Hex()) + } + } + + for i, ux := range txnUxs { + // Add new outputs + if err := up.pool.put(tx, txnUxHashes[i], ux); err != nil { + return err + } + + // Recalculate xorHash + xorHash = xorHash.Xor(ux.SnapshotHash()) + } + + // Set xorHash + if err := up.meta.setXorHash(tx, xorHash); err != nil { + return err + } + + // Update indexes + for addr, rmHashes := range rmAddrHashes { + addHashes := addAddrHashes[addr] + + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, rmHashes); err != nil { + return err + } + + delete(addAddrHashes, addr) + } + + for addr, addHashes := range addAddrHashes { + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, nil); err != nil { + return err + } + } + + // Check that the addrIndexHeight is incremental + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + if err != nil { + return err + } + + if b.Block.Head.BkSeq == 0 { + if ok { + err := errors.New("addrIndexHeight is set but no block has been indexed yet") + logger.Critical().Error(err.Error()) + return err + } + } else if b.Block.Head.BkSeq != addrIndexHeight+1 { + err := errors.New("unspent pool processing blocks out of order") + logger.Critical().Error(err.Error()) + return err + } + + // Update the addrIndexHeight + return up.meta.setAddrIndexHeight(tx, b.Block.Head.BkSeq) +} + +// GetArray returns UxOut for a set of hashes, will return error if any of the hashes do not exist in the pool. +func (up *Unspents) GetArray(tx *dbutil.Tx, hashes []cipher.SHA256) (coin.UxArray, error) { + var uxa coin.UxArray + + for _, h := range hashes { + ux, err := up.pool.get(tx, h) + if err != nil { + return nil, err + } else if ux == nil { + return nil, NewErrUnspentNotExist(h.Hex()) + } + + uxa = append(uxa, *ux) + } + + return uxa, nil +} + +// Get returns the uxout value of given hash +func (up *Unspents) Get(tx *dbutil.Tx, h cipher.SHA256) (*coin.UxOut, error) { + return up.pool.get(tx, h) +} + +// GetAll returns Pool as an array. Note: they are not in any particular order. +func (up *Unspents) GetAll(tx *dbutil.Tx) (coin.UxArray, error) { + return up.pool.getAll(tx) +} + +// Len returns the unspent outputs num +func (up *Unspents) Len(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolBkt) +} + +// Contains check if the hash of uxout does exist in the pool +func (up *Unspents) Contains(tx *dbutil.Tx, h cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnspentPoolBkt, h[:]) +} + +// GetUnspentHashesOfAddrs returns a map of addresses to their unspent output hashes +func (up *Unspents) GetUnspentHashesOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (AddressHashes, error) { + addrHashes := make(AddressHashes, len(addrs)) + + for _, addr := range addrs { + hashes, err := up.poolAddrIndex.get(tx, addr) + if err != nil { + return nil, err + } + + addrHashes[addr] = hashes + } + + return addrHashes, nil +} + +// GetUnspentsOfAddrs returns a map of addresses to their unspent outputs +func (up *Unspents) GetUnspentsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrUxs := make(coin.AddressUxOuts, len(addrs)) + + for _, addr := range addrs { + hashes, err := up.poolAddrIndex.get(tx, addr) + if err != nil { + return nil, err + } + + uxa, err := up.GetArray(tx, hashes) + if err != nil { + switch e := err.(type) { + case ErrUnspentNotExist: + logger.Critical().Errorf("Unspent hash %s indexed under address %s does not exist in unspent pool", e.UxID, addr.String()) + } + return nil, err + } + + addrUxs[addr] = uxa + } + + return addrUxs, nil +} + +// GetUxHash returns unspent output checksum for the Block. +// Must be called after Block is fully initialized, +// and before its outputs are added to the unspent pool +func (up *Unspents) GetUxHash(tx *dbutil.Tx) (cipher.SHA256, error) { + return up.meta.getXorHash(tx) +} + +// AddressCount returns the total number of addresses with unspents +func (up *Unspents) AddressCount(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolAddrIndexBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent_test.go new file mode 100644 index 00000000..309205a5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent_test.go @@ -0,0 +1,1155 @@ +package blockdb + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "sort" + "testing" + "time" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func makeUxBody(t *testing.T) coin.UxBody { + p, _ := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + } +} + +func makeUxOut(t *testing.T) coin.UxOut { + body := makeUxBody(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + } +} + +func TestNewUnspentPool(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + + err := db.View("", func(tx *dbutil.Tx) error { + length, err := dbutil.Len(tx, UnspentPoolBkt) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + + h, err := up.meta.getXorHash(tx) + require.NoError(t, err) + require.Equal(t, cipher.SHA256{}, h) + return nil + + }) + require.NoError(t, err) +} + +func addUxOut(db *dbutil.DB, up *Unspents, ux coin.UxOut) error { + return db.Update("", func(tx *dbutil.Tx) error { + if err := up.pool.put(tx, ux.Hash(), ux); err != nil { + return err + } + + return up.poolAddrIndex.adjust(tx, ux.Body.Address, []cipher.SHA256{ux.Hash()}, nil) + }) +} + +func TestUnspentPoolGet(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + testCases := []struct { + name string + unspents coin.UxArray + hash cipher.SHA256 + ux *coin.UxOut + }{ + { + "not exist", + uxs[:2], + uxs[2].Hash(), + nil, + }, + { + "find one", + uxs[:2], + uxs[1].Hash(), + &uxs[1], + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + for _, ux := range tc.unspents { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + err := db.View("", func(tx *dbutil.Tx) error { + ux, err := up.Get(tx, tc.hash) + require.NoError(t, err) + require.Equal(t, tc.ux, ux) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolLen(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + db, closedb := prepareDB(t) + defer closedb() + + up := NewUnspentPool() + + for _, ux := range uxs { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + err := db.View("", func(tx *dbutil.Tx) error { + length, err := up.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(5), length) + return nil + }) + require.NoError(t, err) +} + +func TestUnspentPoolGetUxHash(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + db, closedb := prepareDB(t) + defer closedb() + + up := NewUnspentPool() + + for _, ux := range uxs { + err := addUxOut(db, up, ux) + require.NoError(t, err) + err = db.Update("", func(tx *dbutil.Tx) error { + uxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + + xorHash, err := up.meta.getXorHash(tx) + require.NoError(t, err) + require.Equal(t, xorHash.Hex(), uxHash.Hex()) + return nil + }) + require.NoError(t, err) + } +} + +func TestUnspentPoolGetArray(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + err := addUxOut(db, up, ux) + require.NoError(t, err) + uxs = append(uxs, ux) + } + + outsideUx := makeUxOut(t) + + testCases := []struct { + name string + hashes []cipher.SHA256 + err error + unspents coin.UxArray + }{ + { + "get first", + []cipher.SHA256{uxs[0].Hash()}, + nil, + uxs[:1], + }, + { + "get second", + []cipher.SHA256{uxs[1].Hash()}, + nil, + uxs[1:2], + }, + { + "get two", + []cipher.SHA256{uxs[0].Hash(), uxs[1].Hash()}, + nil, + uxs[0:2], + }, + { + "get not exist", + []cipher.SHA256{outsideUx.Hash()}, + NewErrUnspentNotExist(outsideUx.Hash().Hex()), + coin.UxArray{}, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := db.View("", func(tx *dbutil.Tx) error { + uxs, err := up.GetArray(tx, tc.hashes) + require.Equal(t, tc.err, err) + if err == nil { + require.Equal(t, tc.unspents, uxs) + } + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolGetAll(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + testCases := []struct { + name string + unspents coin.UxArray + expect coin.UxArray + }{ + { + "empty", + coin.UxArray{}, + coin.UxArray{}, + }, + { + "one unspent", + uxs[:1], + uxs[:1], + }, + { + "two unspent", + uxs[:2], + uxs[:2], + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + for _, ux := range tc.unspents { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + err := db.View("", func(tx *dbutil.Tx) error { + unspents, err := up.GetAll(tx) + require.NoError(t, err) + + uxm := make(map[cipher.SHA256]struct{}) + for _, ux := range unspents { + uxm[ux.Hash()] = struct{}{} + } + + for _, ux := range tc.expect { + _, ok := uxm[ux.Hash()] + require.True(t, ok) + } + + return nil + }) + require.NoError(t, err) + }) + } +} + +func BenchmarkUnspentPoolGetAll(b *testing.B) { + var t testing.T + db, teardown := prepareDB(&t) + defer teardown() + + up := NewUnspentPool() + + for i := 0; i < 1000; i++ { + ux := makeUxOut(&t) + if err := addUxOut(db, up, ux); err != nil { + b.Fatal(err) + } + } + + start := time.Now() + for i := 0; i < b.N; i++ { + err := db.View("", func(tx *dbutil.Tx) error { + _, err := up.GetAll(tx) + return err + }) + if err != nil { + b.Fatal(err) + } + } + fmt.Println(time.Since(start)) +} + +func TestGetUnspentOfAddrs(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + uxs[4].Body.Address = uxs[0].Body.Address + + testCases := []struct { + name string + unspents coin.UxArray + addrs []cipher.Address + expect coin.UxArray + }{ + { + name: "one one addr one unspent", + unspents: uxs[:], + addrs: []cipher.Address{uxs[1].Body.Address}, + expect: uxs[1:2], + }, + { + name: "one addr two unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[0].Body.Address}, + expect: []coin.UxOut{ + uxs[0], + uxs[4], + }, + }, + { + name: "two addrs three unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[0].Body.Address, uxs[1].Body.Address}, + expect: []coin.UxOut{ + uxs[0], + uxs[1], + uxs[4], + }, + }, + { + name: "two addrs two unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[2].Body.Address, uxs[1].Body.Address}, + expect: []coin.UxOut{ + uxs[1], + uxs[2], + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + for _, ux := range tc.unspents { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + var unspents coin.AddressUxOuts + err := db.View("", func(tx *dbutil.Tx) error { + var err error + unspents, err = up.GetUnspentsOfAddrs(tx, tc.addrs) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + uxm := make(map[cipher.SHA256]struct{}, len(unspents)) + for _, uxs := range unspents { + for _, ux := range uxs { + uxm[ux.Hash()] = struct{}{} + } + } + + require.Equal(t, len(uxm), len(tc.expect)) + + for _, ux := range tc.expect { + _, ok := uxm[ux.Hash()] + require.True(t, ok) + } + }) + } +} + +func TestUnspentProcessBlock(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + type testOutputs struct { + addr cipher.Address + coins uint64 + hours uint64 + } + + addr := testutil.MakeAddress() + + tt := []struct { + name string + init coin.UxArray + inputs coin.UxArray + outputs []testOutputs + nIndexedAddrs uint64 + }{ + { + name: "spend one create one", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: testutil.MakeAddress(), + coins: 1e6, + hours: uxs[0].Body.Hours / 2, + }, + }, + nIndexedAddrs: 5, + }, + + { + name: "spend one create two", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: testutil.MakeAddress(), + coins: 1e6 / 2, + hours: uxs[0].Body.Hours / 4, + }, + { + addr: testutil.MakeAddress(), + coins: 1e6 / 2, + hours: uxs[0].Body.Hours / 4, + }, + }, + nIndexedAddrs: 6, + }, + + { + name: "spend one create three - two to the same new address and one to the spending address ", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: addr, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 16, + }, + { + addr: addr, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 8, + }, + { + addr: uxs[0].Body.Address, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 8, + }, + }, + nIndexedAddrs: 6, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closedb := prepareDB(t) + defer closedb() + + up := NewUnspentPool() + + for _, ux := range tc.init { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + txn := coin.Transaction{} + for _, in := range tc.inputs { + err := txn.PushInput(in.Hash()) + require.NoError(t, err) + } + + for _, o := range tc.outputs { + err := txn.PushOutput(o.addr, o.coins, o.hours) + require.NoError(t, err) + } + + var block *coin.Block + var oldUxHash cipher.SHA256 + + err := db.Update("", func(tx *dbutil.Tx) error { + uxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + + block, err = coin.NewBlock(coin.Block{}, uint64(time.Now().Unix()), uxHash, coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + oldUxHash, err = up.GetUxHash(tx) + require.NoError(t, err) + + err = up.ProcessBlock(tx, &coin.SignedBlock{ + Block: *block, + }) + require.NoError(t, err) + + return nil + }) + require.NoError(t, err) + + txOuts := coin.CreateUnspents(block.Head, txn) + + err = db.View("", func(tx *dbutil.Tx) error { + // check that the inputs should already been deleted from unspent pool + for _, in := range tc.inputs { + v, err := up.Get(tx, in.Hash()) + require.NoError(t, err) + require.Nil(t, v) + } + + // check the new generate unspent + hasKey, err := up.Contains(tx, txOuts[0].Hash()) + require.NoError(t, err) + require.True(t, hasKey) + + // check uxHash + for _, in := range tc.inputs { + oldUxHash = oldUxHash.Xor(in.SnapshotHash()) + } + + uxHash := oldUxHash.Xor(txOuts[0].SnapshotHash()) + for _, o := range txOuts[1:] { + uxHash = uxHash.Xor(o.SnapshotHash()) + } + + newUxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + require.Equal(t, uxHash.Hex(), newUxHash.Hex()) + + // addr index height should equal the number of blocks added + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(1), addrIndexHeight) + + // addr index should have 5 rows (5 initial addrs, 1 removed as input, 1 added as output) + addrIndexLength, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, tc.nIndexedAddrs, addrIndexLength) + + // new outputs should be added to addr index cache + expectedAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for _, o := range txOuts { + expectedAddrHashes[o.Body.Address] = append(expectedAddrHashes[o.Body.Address], o.Hash()) + } + + for addr, hashes := range expectedAddrHashes { + addrUxHashes, err := up.poolAddrIndex.get(tx, addr) + require.NoError(t, err) + + require.Equal(t, len(hashes), len(addrUxHashes)) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + sort.Slice(addrUxHashes, func(i, j int) bool { + return bytes.Compare(addrUxHashes[i][:], addrUxHashes[j][:]) < 1 + }) + + require.Equal(t, hashes, addrUxHashes) + } + + // used up inputs should be removed from addr index cache + for _, o := range tc.inputs { + // input addresses that appear in outputs should not be removed + if _, ok := expectedAddrHashes[o.Body.Address]; ok { + continue + } + + addrUxHashes, err := up.poolAddrIndex.get(tx, o.Body.Address) + require.NoError(t, err) + require.Nil(t, addrUxHashes) + } + + // none of the rows in the addr index should have empty arrays of hashes + err = dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + _, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var uxHashes []cipher.SHA256 + err = encoder.DeserializeRawExact(v, &uxHashes) + require.NoError(t, err) + require.NotEmpty(t, uxHashes) + + return nil + }) + require.NoError(t, err) + + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolAddrIndex(t *testing.T) { + addrs := make([]cipher.Address, 10) + for i := range addrs { + addrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 30) + hashesMap := make(map[cipher.SHA256]struct{}) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + _, ok := hashesMap[hashes[i]] + require.False(t, ok) + hashesMap[hashes[i]] = struct{}{} + } + + type addrHashMap map[cipher.Address][]cipher.SHA256 + + copyHashMap := func(hm addrHashMap) addrHashMap { + out := make(addrHashMap, len(hm)) + + for addr, hashes := range hm { + copiedHashes := make([]cipher.SHA256, len(hashes)) + copy(copiedHashes[:], hashes[:]) + out[addr] = copiedHashes + } + + return out + } + + dup := func(h []cipher.SHA256) []cipher.SHA256 { + i := make([]cipher.SHA256, len(h)) + copy(i[:], h[:]) + return i + } + + cases := []struct { + name string + init addrHashMap + add addrHashMap + remove addrHashMap + expect addrHashMap + putErr error + adjustErr error + }{ + { + name: "no initial, add only", + add: addrHashMap{ + addrs[0]: dup(hashes[0:3]), + addrs[1]: dup(hashes[3:6]), + }, + expect: addrHashMap{ + addrs[0]: dup(hashes[0:3]), + addrs[1]: dup(hashes[3:6]), + }, + }, + + { + name: "initial, add and remove", + init: addrHashMap{ + addrs[0]: dup(hashes[0:3]), // add one to here + addrs[1]: dup(hashes[3:6]), // remove one from here + addrs[2]: dup(hashes[6:9]), // add and remove one from here + addrs[3]: dup(hashes[9:12]), // remove all from here + addrs[4]: dup(hashes[12:15]), // remove all from here and add one + }, + add: addrHashMap{ + addrs[0]: dup(hashes[16:17]), + addrs[2]: dup(hashes[17:18]), + addrs[4]: dup(hashes[18:19]), + }, + remove: addrHashMap{ + addrs[1]: dup(hashes[4:5]), + addrs[2]: dup(hashes[6:7]), + addrs[3]: dup(hashes[9:12]), + addrs[4]: dup(hashes[12:15]), + }, + expect: addrHashMap{ + addrs[0]: append(dup(hashes[0:3]), dup(hashes[16:17])...), + addrs[1]: append(dup(hashes[3:4]), dup(hashes[5:6])...), + addrs[2]: append(dup(hashes[7:9]), dup(hashes[17:18])...), + addrs[4]: dup(hashes[18:19]), + }, + }, + + { + name: "put error duplicate", + init: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[0]}, + }, + putErr: errors.New("poolAddrIndex.put: hashes array contains duplicate"), + }, + + { + name: "put error empty array", + init: addrHashMap{ + addrs[0]: []cipher.SHA256{}, + }, + putErr: errors.New("poolAddrIndex.put cannot put empty hash array"), + }, + + { + name: "adjust error removes have duplicates", + init: addrHashMap{ + addrs[0]: dup(hashes[0:1]), + }, + remove: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[0]}, + }, + adjustErr: errors.New("poolAddrIndex.adjust: rmHashes contains duplicates"), + }, + + { + name: "adjust error removing more than exists", + init: addrHashMap{ + addrs[0]: dup(hashes[0:1]), + }, + remove: addrHashMap{ + addrs[0]: dup(hashes[0:2]), + }, + adjustErr: errors.New("poolAddrIndex.adjust: rmHashes is longer than existingHashes"), + }, + + { + name: "adjust error removing hash that does not exist", + init: addrHashMap{ + addrs[0]: dup(hashes[0:2]), + }, + remove: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[11]}, + }, + adjustErr: fmt.Errorf("poolAddrIndex.adjust: rmHashes contains 1 hashes not indexed for address %s", addrs[0].String()), + }, + + { + name: "adjust error hash in both add and remove", + init: addrHashMap{ + addrs[0]: dup(hashes[0:10]), + }, + add: addrHashMap{ + addrs[0]: dup(hashes[4:5]), + }, + remove: addrHashMap{ + addrs[0]: dup(hashes[1:5]), + }, + adjustErr: errors.New("poolAddrIndex.adjust: hash appears in both addHashes and rmHashes"), + }, + + { + name: "adjust error adding hash already indexed", + init: addrHashMap{ + addrs[0]: dup(hashes[0:10]), + }, + add: addrHashMap{ + addrs[0]: dup(hashes[4:5]), + }, + adjustErr: fmt.Errorf("poolAddrIndex.adjust: uxout hash %s is already indexed for address %s", hashes[4].Hex(), addrs[0].String()), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + tc.init = copyHashMap(tc.init) + tc.add = copyHashMap(tc.add) + tc.remove = copyHashMap(tc.remove) + tc.expect = copyHashMap(tc.expect) + + p := &poolAddrIndex{} + m := &unspentMeta{} + + // Initialize the data, test that put() works + err := db.Update("", func(tx *dbutil.Tx) error { + for addr, hashes := range tc.init { + if err := p.put(tx, addr, hashes); err != nil { + return err + } + } + + return m.setAddrIndexHeight(tx, uint64(len(tc.init))) + }) + + if tc.putErr == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.putErr, err) + return + } + + // Check the initialized data, test that get() works + err = db.View("", func(tx *dbutil.Tx) error { + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, uint64(len(tc.init)), length) + + height, ok, err := m.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, length, height) + + for addr, expectHashes := range tc.init { + hashes, err := p.get(tx, addr) + require.NoError(t, err) + require.Equal(t, expectHashes, hashes) + } + return nil + }) + require.NoError(t, err) + + // Adjust the data, test that adjust() works + err = db.Update("", func(tx *dbutil.Tx) error { + for addr, addHashes := range tc.add { + rmHashes := tc.remove[addr] + delete(tc.remove, addr) + + err := p.adjust(tx, addr, addHashes, rmHashes) + if err != nil { + return err + } + } + + for addr, rmHashes := range tc.remove { + err := p.adjust(tx, addr, nil, rmHashes) + if err != nil { + return err + } + } + + return nil + }) + + if tc.adjustErr == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.adjustErr, err) + return + } + + addrHashes := make(addrHashMap) + err = db.View("", func(tx *dbutil.Tx) error { + return dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + addr, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var hashes []cipher.SHA256 + err = encoder.DeserializeRawExact(v, &hashes) + require.NoError(t, err) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + addrHashes[addr] = hashes + + return nil + }) + }) + require.NoError(t, err) + + for addr, hashes := range tc.expect { + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + tc.expect[addr] = hashes + } + + require.Equal(t, len(tc.expect), len(addrHashes)) + require.Equal(t, tc.expect, addrHashes) + }) + } +} + +func TestUnspentMaybeBuildIndexesNoIndexNoHead(t *testing.T) { + // Test with a database that has no unspent addr index + testUnspentMaybeBuildIndexes(t, 0, nil) +} + +func TestUnspentMaybeBuildIndexesNoIndexHaveHead(t *testing.T) { + // Test with a database that has no unspent addr index + testUnspentMaybeBuildIndexes(t, 10, nil) +} + +func TestUnspentMaybeBuildIndexesPartialIndex(t *testing.T) { + // Test with a database that has an unspent addr index but the height is wrong + headHeight := uint64(3) + testUnspentMaybeBuildIndexes(t, headHeight+1, func(db *dbutil.DB) { + up := NewUnspentPool() + + // Index the first few blocks + err := db.Update("", func(tx *dbutil.Tx) error { + if err := dbutil.CreateBuckets(tx, [][]byte{UnspentPoolAddrIndexBkt}); err != nil { + return err + } + + addrHashes := make(map[cipher.Address][]cipher.SHA256) + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + var ux coin.UxOut + if err := encoder.DeserializeRawExact(v, &ux); err != nil { + return err + } + + if ux.Head.BkSeq > headHeight { + return nil + } + + h := ux.Hash() + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], h) + + return nil + }); err != nil { + return err + } + + for addr, hashes := range addrHashes { + if err := up.poolAddrIndex.put(tx, addr, hashes); err != nil { + return err + } + } + + return up.meta.setAddrIndexHeight(tx, headHeight) + }) + require.NoError(t, err) + }) +} + +func testUnspentMaybeBuildIndexes(t *testing.T, headIndex uint64, setupDB func(*dbutil.DB)) { + db, shutdown := setupNoUnspentAddrIndexDB(t) + defer shutdown() + + if setupDB != nil { + setupDB(db) + } + + u := NewUnspentPool() + + // Create the indexes + err := db.Update("", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(UnspentPoolAddrIndexBkt); err != nil { + return err + } + + return u.MaybeBuildIndexes(tx, headIndex) + }) + require.NoError(t, err) + + // Check the address->hashes index + addrHashes := make(map[cipher.Address][]cipher.SHA256) + err = db.View("", func(tx *dbutil.Tx) error { + // Perform the unspent lookup the slow way, to confirm it matches the hashed data + err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + require.NoError(t, err) + + var ux coin.UxOut + err = encoder.DeserializeRawExact(v, &ux) + require.NoError(t, err) + + require.Equal(t, hash, ux.Hash()) + + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], hash) + + return nil + }) + require.NoError(t, err) + + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + + require.Equal(t, uint64(len(addrHashes)), length) + + height, ok, err := u.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(180), height) + + err = dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + addr, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var hashes []cipher.SHA256 + err = encoder.DeserializeRawExact(v, &hashes) + require.NoError(t, err) + + expectedHashes, ok := addrHashes[addr] + require.True(t, ok) + + sort.Slice(expectedHashes, func(i, j int) bool { + return bytes.Compare(expectedHashes[i][:], expectedHashes[j][:]) < 1 + }) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + require.Equal(t, expectedHashes, hashes) + + delete(addrHashes, addr) + + return nil + }) + require.NoError(t, err) + + require.Empty(t, addrHashes) + + return nil + }) + require.NoError(t, err) +} + +func TestUnspentMaybeBuildIndexesNoRebuild(t *testing.T) { + // Set addrIndexHeight to head block height, but don't populate the addr index + // Check that the addr index was not populated, so we know that the index did not get rebuilt if the height matches + db, shutdown := setupNoUnspentAddrIndexDB(t) + defer shutdown() + + u := NewUnspentPool() + + // Create the bucket and artificially set the indexed height, without indexing + headSeq := uint64(180) + err := db.Update("", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(UnspentPoolAddrIndexBkt); err != nil { + return err + } + + return u.meta.setAddrIndexHeight(tx, headSeq) + }) + require.NoError(t, err) + + // Attempt to build index based upon the headSeq that we set + err = db.Update("", func(tx *dbutil.Tx) error { + return u.MaybeBuildIndexes(tx, headSeq) + }) + require.NoError(t, err) + + // Check that the addr index is still empty, because the height was the same + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := u.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, headSeq, height) + + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) +} + +func setupNoUnspentAddrIndexDB(t *testing.T) (*dbutil.DB, func()) { + // Open a test database file that lacks UnspentPoolAddrIndexBkt, + // copy it to a temp file and open a database around the temp file + dbFilename := "./testdata/blockchain-180.no-unspent-addr-index.db" + dbFile, err := os.Open(dbFilename) + require.NoError(t, err) + + tmpFile, err := ioutil.TempFile("", "testdb") + require.NoError(t, err) + + _, err = io.Copy(tmpFile, dbFile) + require.NoError(t, err) + + err = dbFile.Close() + require.NoError(t, err) + + err = tmpFile.Sync() + require.NoError(t, err) + + boltDB, err := bolt.Open(tmpFile.Name(), 0700, nil) + require.NoError(t, err) + + db := dbutil.WrapDB(boltDB) + + return db, func() { + db.Close() + tmpFile.Close() + os.Remove(tmpFile.Name()) + } +} + +func TestAddressHashesFlatten(t *testing.T) { + addrHashes := make(AddressHashes) + + require.Empty(t, addrHashes.Flatten()) + + hashes := make([]cipher.SHA256, 10) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + } + + addrHashes = AddressHashes{ + testutil.MakeAddress(): hashes[0:2], + } + require.Equal(t, hashes[0:2], addrHashes.Flatten()) + + addr1 := testutil.MakeAddress() + addr2 := testutil.MakeAddress() + addrHashes = AddressHashes{ + addr1: hashes[0:2], + addr2: hashes[4:6], + } + + expectedHashes := append(addrHashes[addr1], addrHashes[addr2]...) + flattenedHashes := addrHashes.Flatten() + + sort.Slice(expectedHashes, func(a, b int) bool { + return bytes.Compare(expectedHashes[a][:], expectedHashes[b][:]) < 0 + }) + sort.Slice(flattenedHashes, func(a, b int) bool { + return bytes.Compare(flattenedHashes[a][:], flattenedHashes[b][:]) < 0 + }) + + require.Equal(t, len(expectedHashes), len(flattenedHashes)) + require.Equal(t, expectedHashes, flattenedHashes) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder.go new file mode 100644 index 00000000..c18ddd69 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder.go @@ -0,0 +1,171 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeUxOut computes the size of an encoded object of type UxOut +func encodeSizeUxOut(obj *coin.UxOut) uint64 { + i0 := uint64(0) + + // obj.Head.Time + i0 += 8 + + // obj.Head.BkSeq + i0 += 8 + + // obj.Body.SrcTransaction + i0 += 32 + + // obj.Body.Address.Version + i0++ + + // obj.Body.Address.Key + i0 += 20 + + // obj.Body.Coins + i0 += 8 + + // obj.Body.Hours + i0 += 8 + + return i0 +} + +// encodeUxOut encodes an object of type UxOut to a buffer allocated to the exact size +// required to encode the object. +func encodeUxOut(obj *coin.UxOut) ([]byte, error) { + n := encodeSizeUxOut(obj) + buf := make([]byte, n) + + if err := encodeUxOutToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxOutToBuffer encodes an object of type UxOut to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxOutToBuffer(buf []byte, obj *coin.UxOut) error { + if uint64(len(buf)) < encodeSizeUxOut(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Head.Time + e.Uint64(obj.Head.Time) + + // obj.Head.BkSeq + e.Uint64(obj.Head.BkSeq) + + // obj.Body.SrcTransaction + e.CopyBytes(obj.Body.SrcTransaction[:]) + + // obj.Body.Address.Version + e.Uint8(obj.Body.Address.Version) + + // obj.Body.Address.Key + e.CopyBytes(obj.Body.Address.Key[:]) + + // obj.Body.Coins + e.Uint64(obj.Body.Coins) + + // obj.Body.Hours + e.Uint64(obj.Body.Hours) + + return nil +} + +// decodeUxOut decodes an object of type UxOut from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxOut(buf []byte, obj *coin.UxOut) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.Time = i + } + + { + // obj.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.BkSeq = i + } + + { + // obj.Body.SrcTransaction + if len(d.Buffer) < len(obj.Body.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.SrcTransaction[:], d.Buffer[:len(obj.Body.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.Body.SrcTransaction):] + } + + { + // obj.Body.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Body.Address.Version = i + } + + { + // obj.Body.Address.Key + if len(d.Buffer) < len(obj.Body.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Address.Key[:], d.Buffer[:len(obj.Body.Address.Key)]) + d.Buffer = d.Buffer[len(obj.Body.Address.Key):] + } + + { + // obj.Body.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Coins = i + } + + { + // obj.Body.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Hours = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxOutExact decodes an object of type UxOut from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxOutExact(buf []byte, obj *coin.UxOut) error { + if n, err := decodeUxOut(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder_test.go new file mode 100644 index 00000000..f62565bd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder_test.go @@ -0,0 +1,422 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +func newEmptyUxOutForEncodeTest() *coin.UxOut { + var obj coin.UxOut + return &obj +} + +func newRandomUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.UxOut { + var obj coin.UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.UxOut { + var obj coin.UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.UxOut { + var obj coin.UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxOut(t *testing.T, obj *coin.UxOut) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxOut(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxOut() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxOut(obj) + if err != nil { + t.Fatalf("encodeUxOut failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxOut produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxOut()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxOutToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxOutToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 coin.UxOut + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 coin.UxOut + if n, err := decodeUxOut(data2, &obj3); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // Decode, excess buffer + var obj4 coin.UxOut + n, err := decodeUxOut(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // DecodeExact + var obj5 coin.UxOut + if err := decodeUxOutExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxOut(data4, &obj3); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxOut(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *coin.UxOut + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxOutForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxOutForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxOutForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxOutForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxOut(t, tc.obj) + }) + } +} + +func decodeUxOutExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.UxOut + if _, err := decodeUxOut(buf, &obj); err == nil { + t.Fatal("decodeUxOut: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxOut: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxOutExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.UxOut + if err := decodeUxOutExact(buf, &obj); err == nil { + t.Fatal("decodeUxOutExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxOutExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxOutDecodeErrors(t *testing.T, k int, tag string, obj *coin.UxOut) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxOut(obj) + buf, err := encodeUxOut(obj) + if err != nil { + t.Fatalf("encodeUxOut failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxOutExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxOutExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxOutExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxOutExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxOutExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxOutDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxOutForEncodeTest() + fullObj := newRandomUxOutForEncodeTest(t, rand) + testSkyencoderUxOutDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxOutDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/verify.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/verify.go new file mode 100644 index 00000000..e130420a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/verify.go @@ -0,0 +1,156 @@ +package blockdb + +import ( + "errors" + "reflect" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +// VerifyDBSkyencoderSafe verifies that the skyencoder generated code has the same result as the encoder +// for all data in the blockchain +func VerifyDBSkyencoderSafe(tx *dbutil.Tx, quit <-chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + if err := dbutil.ForEach(tx, BlockSigsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var sig1 sigWrapper + if err := decodeSigWrapperExact(v, &sig1); err != nil { + return err + } + + var sig2 cipher.Sig + if err := encoder.DeserializeRawExact(v, &sig2); err != nil { + return err + } + + if sig1.Sig != sig2 { + return errors.New("BlockSigsBkt sig decode mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, BlocksBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 coin.Block + if err := decodeBlockExact(v, &b1); err != nil { + return err + } + + var b2 coin.Block + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("BlocksBkt block mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, TreeBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashPairsWrapper + if err := decodeHashPairsWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []coin.HashPair + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.HashPairs, b2) { + return errors.New("TreeBkt hash pairs mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 coin.UxOut + if err := decodeUxOutExact(v, &b1); err != nil { + return err + } + + var b2 coin.UxOut + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("UnspentPoolBkt ux out mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashesWrapper + if err := decodeHashesWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []cipher.SHA256 + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.Hashes, b2) { + return errors.New("UnspentPoolAddrIndexBkt sha256 hashes mismatch") + } + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/config.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/config.go new file mode 100644 index 00000000..f74a85a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/config.go @@ -0,0 +1,119 @@ +package visor + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/params" +) + +// Config configuration parameters for the Visor +type Config struct { + // Is this a block publishing node + IsBlockPublisher bool + + // Public key of the blockchain + BlockchainPubkey cipher.PubKey + + // Secret key of the blockchain (required if block publisher) + BlockchainSeckey cipher.SecKey + + // Transaction verification parameters used for unconfirmed transactions + UnconfirmedVerifyTxn params.VerifyTxn + // Transaction verification parameters used when creating a block + CreateBlockVerifyTxn params.VerifyTxn + // Maximum size of a block, in bytes for creating blocks + MaxBlockTransactionsSize uint32 + + // Coin distribution parameters (necessary for txn verification) + Distribution params.Distribution + + // Where the blockchain is saved + BlockchainFile string + // Where the block signatures are saved + BlockSigsFile string + + //address for genesis + GenesisAddress cipher.Address + // Genesis block sig + GenesisSignature cipher.Sig + // Genesis block timestamp + GenesisTimestamp uint64 + // Number of coins in genesis block + GenesisCoinVolume uint64 + // enable arbitrating mode + Arbitrating bool +} + +// NewConfig creates Config +func NewConfig() Config { + c := Config{ + IsBlockPublisher: false, + + BlockchainPubkey: cipher.PubKey{}, + BlockchainSeckey: cipher.SecKey{}, + + UnconfirmedVerifyTxn: params.UserVerifyTxn, + CreateBlockVerifyTxn: params.UserVerifyTxn, + MaxBlockTransactionsSize: params.UserVerifyTxn.MaxTransactionSize, + + GenesisAddress: cipher.Address{}, + GenesisSignature: cipher.Sig{}, + GenesisTimestamp: 0, + GenesisCoinVolume: 0, //100e12, 100e6 * 10e6 + } + + return c +} + +// Verify verifies the configuration +func (c Config) Verify() error { + if c.IsBlockPublisher { + if c.BlockchainPubkey != cipher.MustPubKeyFromSecKey(c.BlockchainSeckey) { + return errors.New("Cannot run as block publisher: invalid seckey for pubkey") + } + } + + if err := c.UnconfirmedVerifyTxn.Validate(); err != nil { + return err + } + + if err := c.CreateBlockVerifyTxn.Validate(); err != nil { + return err + } + + if c.UnconfirmedVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("UnconfirmedVerifyTxn.BurnFactor must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.CreateBlockVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("CreateBlockVerifyTxn.BurnFactor must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.UnconfirmedVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("UnconfirmedVerifyTxn.MaxTransactionSize must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + + if c.CreateBlockVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("CreateBlockVerifyTxn.MaxTransactionSize must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + + if c.UnconfirmedVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("UnconfirmedVerifyTxn.MaxDropletPrecision must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + if c.CreateBlockVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("CreateBlockVerifyTxn.MaxDropletPrecision must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + if c.MaxBlockTransactionsSize < c.CreateBlockVerifyTxn.MaxTransactionSize { + return errors.New("MaxBlockTransactionsSize must be >= CreateBlockVerifyTxn.MaxTransactionSize") + } + + if err := c.Distribution.Validate(); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/daemon_visor_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/daemon_visor_test.go new file mode 100644 index 00000000..aee9b07a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/daemon_visor_test.go @@ -0,0 +1,167 @@ +package visor + +/* +These are tests that used to be in daemon/visor_test.go, +but belong in package visor instead. + +They have been moved here without checking if they duplicate any +existing test in visor_test.go. + +It is assumed that these tests may provide coverage not present in visor_test.go + +They could be merged into visor_test.go, but for simplicity they were only moved here +*/ + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func setupSimpleVisor(t *testing.T, db *dbutil.DB, bc *Blockchain) *Visor { + cfg := NewConfig() + + pool, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + return &Visor{ + Config: cfg, + unconfirmed: pool, + blockchain: bc, + db: db, + } +} + +func TestVerifyTransactionInvalidFee(t *testing.T) { + // Test that a soft constraint is enforced + // Full verification tests are in visor/blockchain_verify_test.go + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours = GenesisCoinHours * 1e3 + var f uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, f) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + _, softErr, err := v.InjectForeignTransaction(txn) + require.NoError(t, err) + require.NotNil(t, softErr) + require.Equal(t, NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) +} + +func TestVerifyTransactionInvalidSignature(t *testing.T) { + // Test that a hard constraint is enforced + // Full verification tests are in visor/blockchain_verify_test.go + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours uint64 + var fee uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + + // Invalidate signatures + txn.Sigs = nil + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + _, softErr, err := v.InjectForeignTransaction(txn) + require.Nil(t, softErr) + testutil.RequireError(t, err, NewErrTxnViolatesHardConstraint(errors.New("Invalid number of signatures")).Error()) +} + +func TestInjectValidTransaction(t *testing.T) { + db, close := prepareDB(t) + defer close() + + _, s := cipher.GenerateKeyPair() + // Setup blockchain + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours uint64 + var fee uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + // The unconfirmed pool should be empty + txns, err := v.GetAllUnconfirmedTransactions() + require.NoError(t, err) + require.Len(t, txns, 0) + + // Call injectTransaction + _, softErr, err := v.InjectForeignTransaction(txn) + require.Nil(t, softErr) + require.NoError(t, err) + + // The transaction should appear in the unconfirmed pool + txns, err = v.GetAllUnconfirmedTransactions() + require.NoError(t, err) + require.Len(t, txns, 1) + require.Equal(t, txns[0].Transaction, txn) +} + +func TestInjectTransactionSoftViolationNoFee(t *testing.T) { + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours = GenesisCoinHours * 1e3 + var f uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, f) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + // The unconfirmed pool should be empty + txns, err := v.GetAllUnconfirmedTransactions() + require.NoError(t, err) + require.Len(t, txns, 0) + + // Call injectTransaction + _, softErr, err := v.InjectForeignTransaction(txn) + require.NoError(t, err) + require.NotNil(t, softErr) + require.Equal(t, NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) + + // The transaction should appear in the unconfirmed pool + txns, err = v.GetAllUnconfirmedTransactions() + require.NoError(t, err) + require.Len(t, txns, 1) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/db.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/db.go new file mode 100644 index 00000000..c4a9c513 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/db.go @@ -0,0 +1,401 @@ +package visor + +import ( + "crypto/sha256" + "encoding/base64" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "reflect" + "sync" + "time" + + "github.com/boltdb/bolt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/elapse" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +var ( + // BlockchainVerifyTheadNum number of goroutines to use for signature and historydb verification + BlockchainVerifyTheadNum = 4 +) + +// ErrCorruptDB is returned if the database is corrupted +// The original corruption error is embedded +type ErrCorruptDB struct { + error +} + +// CheckDatabase checks the database for corruption, rebuild history if corrupted +func CheckDatabase(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) error { + elapser := elapse.NewElapser(time.Second*30, logger) + elapser.Register("CheckDatabase") + defer elapser.CheckForDone() + + var blocksBktExist bool + if err := db.View("CheckDatabase", func(tx *dbutil.Tx) error { + blocksBktExist = dbutil.Exists(tx, blockdb.BlocksBkt) + return nil + }); err != nil { + return err + } + + // Don't verify the db if the blocks bucket does not exist + if !blocksBktExist { + return nil + } + + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) + if err != nil { + return err + } + + history := historydb.New() + indexesMap := historydb.NewIndexesMap() + + var historyVerifyErr error + var lock sync.Mutex + verifyFunc := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Verify signature + if err := bc.VerifySignature(b); err != nil { + return err + } + + // Verify historydb, we don't return the error of history.Verify here, + // as we have to check all signature, if we return error early here, the + // potential bad signature won't be detected. + lock.Lock() + defer lock.Unlock() + if historyVerifyErr == nil { + historyVerifyErr = history.Verify(tx, b, indexesMap) + } + return nil + } + + err = bc.WalkChain(BlockchainVerifyTheadNum, verifyFunc, quit) + switch err.(type) { + case nil: + lock.Lock() + err = historyVerifyErr + lock.Unlock() + return err + default: + return err + } +} + +// backup the corrypted db first, then rebuild the history DB. +func rebuildHistoryDB(db *dbutil.DB, history *historydb.HistoryDB, bc *Blockchain, quit chan struct{}) (*dbutil.DB, error) { //nolint:unused,megacheck + db, err := backupDB(db) + if err != nil { + return nil, err + } + + if err := db.Update("Rebuild history db", func(tx *dbutil.Tx) error { + if err := history.Erase(tx); err != nil { + return err + } + + headSeq, ok, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if !ok { + return errors.New("head block does not exist") + } + + for i := uint64(0); i <= headSeq; i++ { + select { + case <-quit: + return nil + default: + b, err := bc.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } + + if i%1000 == 0 { + logger.Critical().Infof("Parse block: %d", i) + } + } + } + return nil + }); err != nil { + return nil, err + } + return db, nil +} + +// backupDB makes a backup copy of the DB +func backupDB(db *dbutil.DB) (*dbutil.DB, error) { //nolint:unused,megacheck + // backup the corrupted database + dbReadOnly := db.IsReadOnly() + + dbPath := db.Path() + + if err := db.Close(); err != nil { + return nil, fmt.Errorf("Failed to close db: %v", err) + } + + corruptDBPath, err := copyCorruptDB(dbPath) + if err != nil { + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) + } + + logger.Critical().Infof("Copy corrupted db to %s", corruptDBPath) + + // Open the database again + return OpenDB(dbPath, dbReadOnly) +} + +// ResetCorruptDB checks the database for corruption and if one of the following +// error types is found, then the database is deemed to be corrupted: +// - blockdb.ErrMissingSignature, +// - historydb.ErrHistoryDBCorrupted +// - encoder.ErrBufferUnderflow +// - encoder.ErrMaxLenExceeded +// If the database is deemed to be corrupted then it is erased and the db starts over. +// A copy of the corrupted database is saved. +func ResetCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { + err := CheckDatabase(db, pubkey, quit) + + // Check if an encoder error has been reported. + // These are not types like the errors below so cannot be included in the + // .(type) switch evaluation. + if err == encoder.ErrBufferUnderflow || err == encoder.ErrMaxLenExceeded { + logger.Critical().Errorf("Database is corrupted (encoder error), recreating db: %v", err) + return resetCorruptDB(db) + } + + switch err.(type) { + case nil: + return db, nil + case blockdb.ErrMissingSignature, + historydb.ErrHistoryDBCorrupted: + logger.Critical().Errorf("Database is corrupted, recreating db: %v", err) + return resetCorruptDB(db) + default: + return nil, err + } +} + +func rebuildCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { //nolint:deadcode,unused,megacheck + history := historydb.New() + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) + if err != nil { + return nil, err + } + + return rebuildHistoryDB(db, history, bc, quit) +} + +// resetCorruptDB recreates the DB, making a backup copy marked as corrupted +func resetCorruptDB(db *dbutil.DB) (*dbutil.DB, error) { + dbReadOnly := db.IsReadOnly() + dbPath := db.Path() + + if err := db.Close(); err != nil { + return nil, fmt.Errorf("Failed to close db: %v", err) + } + + corruptDBPath, err := moveCorruptDB(dbPath) + if err != nil { + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) + } + + logger.Critical().Infof("Moved corrupted db to %s", corruptDBPath) + + return OpenDB(dbPath, dbReadOnly) +} + +// OpenDB opens the blockdb +func OpenDB(dbFile string, readOnly bool) (*dbutil.DB, error) { + db, err := bolt.Open(dbFile, 0600, &bolt.Options{ + Timeout: 5000 * time.Millisecond, + ReadOnly: readOnly, + }) + if err != nil { + return nil, fmt.Errorf("Open boltdb failed, %v", err) + } + + return dbutil.WrapDB(db), nil +} + +// moveCorruptDB moves a file to makeCorruptDBPath(dbPath) +func moveCorruptDB(dbPath string) (string, error) { + newDBPath, err := makeCorruptDBPath(dbPath) + if err != nil { + return "", err + } + + if err := os.Rename(dbPath, newDBPath); err != nil { + logger.Errorf("os.Rename(%s, %s) failed: %v", dbPath, newDBPath, err) + return "", err + } + + return newDBPath, nil +} + +// copyCorruptDB copy a file to makeCorruptDBPath(dbPath) +func copyCorruptDB(dbPath string) (string, error) { //nolint:unused,megacheck + newDBPath, err := makeCorruptDBPath(dbPath) + if err != nil { + return "", err + } + + in, err := os.Open(dbPath) + if err != nil { + return "", err + } + defer in.Close() + + out, err := os.Create(newDBPath) + if err != nil { + return "", err + } + defer out.Close() + logger.Critical().Info(out.Name()) + + _, err = io.Copy(in, out) + if err != nil { + return "", err + } + + if err := out.Close(); err != nil { + return "", err + } + + return newDBPath, nil +} + +// makeCorruptDBPath creates a $FILE.corrupt.$HASH string based on dbPath, +// where $HASH is truncated SHA1 of $FILE. +func makeCorruptDBPath(dbPath string) (string, error) { + dbFileHash, err := shaFileID(dbPath) + if err != nil { + return "", err + } + + dbDir, dbFile := filepath.Split(dbPath) + newDBFile := fmt.Sprintf("%s.corrupt.%s", dbFile, dbFileHash) + newDBPath := filepath.Join(dbDir, newDBFile) + + return newDBPath, nil +} + +// shaFileID return the first 8 bytes of the SHA1 hash of the file, +// hex-encoded +func shaFileID(dbPath string) (string, error) { + fi, err := os.Open(dbPath) + if err != nil { + return "", err + } + defer fi.Close() + + h := sha256.New() + if _, err := io.Copy(h, fi); err != nil { + return "", err + } + + sum := h.Sum(nil) + encodedSum := base64.RawURLEncoding.EncodeToString(sum[:8]) + return encodedSum, nil +} + +// VerifyDBSkyencoderSafe verifies that the skyencoder generated code has the same result as the encoder +// for all data in the blockchain +func VerifyDBSkyencoderSafe(db *dbutil.DB, quit <-chan struct{}) error { + return db.View("VerifyDBSkyencoderSafe", func(tx *dbutil.Tx) error { + return verifyDBSkyencoderSafe(tx, quit) + }) +} + +func verifyDBSkyencoderSafe(tx *dbutil.Tx, quit <-chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + // blockdb + if err := blockdb.VerifyDBSkyencoderSafe(tx, quit); err != nil { + if err == blockdb.ErrVerifyStopped { + return ErrVerifyStopped + } + return err + } + + // historydb + if err := historydb.VerifyDBSkyencoderSafe(tx, quit); err != nil { + if err == historydb.ErrVerifyStopped { + return ErrVerifyStopped + } + return err + } + + // visor + if err := dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(v, &b1); err != nil { + return err + } + + var b2 UnconfirmedTransaction + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("UnconfirmedTxnsBkt unconfirmed transaction mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 UxArray + if err := decodeUxArrayExact(v, &b1); err != nil { + return err + } + + var b2 coin.UxArray + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.UxArray, b2) { + return errors.New("UnconfirmedUnspentsBkt ux out slice mismatch") + } + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/dbutil/dbutil.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/dbutil/dbutil.go new file mode 100644 index 00000000..f3ec6339 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/dbutil/dbutil.go @@ -0,0 +1,360 @@ +/* +Package dbutil provides boltdb utility methods +*/ +package dbutil + +import ( + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "runtime/debug" + "sync" + "time" + + "github.com/boltdb/bolt" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + logger = logging.MustGetLogger("dbutil") + txViewLog = false + txViewTrace = false + txUpdateLog = false + txUpdateTrace = false + txDurationLog = true + txDurationReportingThreshold = time.Millisecond * 100 +) + +// Tx wraps a Tx +type Tx struct { + *bolt.Tx +} + +// String is implemented to prevent a panic when mocking methods with *Tx arguments. +// The mock library forces arguments to be printed with %s which causes Tx to panic. +// See https://github.com/stretchr/testify/pull/596 +func (tx *Tx) String() string { + return fmt.Sprintf("%v", tx.Tx) +} + +// DB wraps a bolt.DB to add logging +type DB struct { + ViewLog bool + ViewTrace bool + UpdateLog bool + UpdateTrace bool + DurationLog bool + DurationReportingThreshold time.Duration + + *bolt.DB + + // shutdownLock is added to prevent closing the database while a View transaction is in progress + // bolt.DB will block for Update transactions but not for View transactions, and if + // the database is closed while in a View transaction, it will panic + // This will be fixed in coreos's bbolt after this PR is merged: + // https://github.com/coreos/bbolt/pull/91 + // When coreos has this feature, we can switch to coreos's bbolt and remove this lock + shutdownLock sync.RWMutex +} + +// WrapDB returns WrapDB +func WrapDB(db *bolt.DB) *DB { + return &DB{ + ViewLog: txViewLog, + UpdateLog: txUpdateLog, + ViewTrace: txViewTrace, + UpdateTrace: txUpdateTrace, + DurationLog: txDurationLog, + DurationReportingThreshold: txDurationReportingThreshold, + DB: db, + } +} + +// View wraps *bolt.DB.View to add logging +func (db *DB) View(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.ViewLog { + logger.Debug("db.View [%s] starting", name) + defer logger.Debug("db.View [%s] done", name) + } + if db.ViewTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.View(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.View [%s] elapsed %s", name, delta) + } + + return err +} + +// Update wraps *bolt.DB.Update to add logging +func (db *DB) Update(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.UpdateLog { + logger.Debug("db.Update [%s] starting", name) + defer logger.Debug("db.Update [%s] done", name) + } + if db.UpdateTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.Update(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.Update [%s] elapsed %s", name, delta) + } + + return err +} + +// Close closes the underlying *bolt.DB +func (db *DB) Close() error { + db.shutdownLock.Lock() + defer db.shutdownLock.Unlock() + + return db.DB.Close() +} + +// ErrCreateBucketFailed is returned if creating a bolt.DB bucket fails +type ErrCreateBucketFailed struct { + Bucket string + Err error +} + +func (e ErrCreateBucketFailed) Error() string { + return fmt.Sprintf("Create bucket \"%s\" failed: %v", e.Bucket, e.Err) +} + +// NewErrCreateBucketFailed returns an ErrCreateBucketFailed +func NewErrCreateBucketFailed(bucket []byte, err error) error { + return ErrCreateBucketFailed{ + Bucket: string(bucket), + Err: err, + } +} + +// ErrBucketNotExist is returned if a bolt.DB bucket does not exist +type ErrBucketNotExist struct { + Bucket string +} + +func (e ErrBucketNotExist) Error() string { + return fmt.Sprintf("Bucket \"%s\" doesn't exist", e.Bucket) +} + +// NewErrBucketNotExist returns an ErrBucketNotExist +func NewErrBucketNotExist(bucket []byte) error { + return ErrBucketNotExist{ + Bucket: string(bucket), + } +} + +// CreateBuckets creates multiple buckets +func CreateBuckets(tx *Tx, buckets [][]byte) error { + for _, b := range buckets { + if _, err := tx.CreateBucketIfNotExists(b); err != nil { + return NewErrCreateBucketFailed(b, err) + } + } + + return nil +} + +// GetBucketObjectDecoded returns an encoder-serialized value from a bucket, decoded to an object +func GetBucketObjectDecoded(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := encoder.DeserializeRawExact(v, obj); err != nil { + return false, fmt.Errorf("encoder.DeserializeRawExact failed: %v", err) + } + + return true, nil +} + +// GetBucketObjectJSON returns a JSON value from a bucket, unmarshaled to an object +func GetBucketObjectJSON(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := json.Unmarshal(v, obj); err != nil { + return false, fmt.Errorf("json.Unmarshal failed: %v", err) + } + + return true, nil +} + +// GetBucketString returns a string value from a bucket +func GetBucketString(tx *Tx, bktName, key []byte) (string, bool, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return "", false, err + } else if v == nil { + return "", false, nil + } + + return string(v), true, nil +} + +// GetBucketValue returns a []byte value from a bucket. If the bucket does not exist, +// it returns an error of type ErrBucketNotExist +func GetBucketValue(tx *Tx, bktName, key []byte) ([]byte, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + // Bytes returned from boltdb are not valid outside of the transaction + // they are called in, make a copy + w := make([]byte, len(v)) + copy(w[:], v[:]) + + return w, nil +} + +// GetBucketValueNoCopy returns a value from a bucket. If the bucket does not exist, +// it returns an error of type ErrBucketNotExist. The byte value is not copied so is not valid +// outside of the database transaction +func GetBucketValueNoCopy(tx *Tx, bktName, key []byte) ([]byte, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return nil, NewErrBucketNotExist(bktName) + } + + return bkt.Get(key), nil +} + +// PutBucketValue puts a value into a bucket under key. +func PutBucketValue(tx *Tx, bktName, key, val []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Put(key, val) +} + +// BucketHasKey returns true if a bucket has a non-nil value for a key +func BucketHasKey(tx *Tx, bktName, key []byte) (bool, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return false, NewErrBucketNotExist(bktName) + } + + v := bkt.Get(key) + return v != nil, nil +} + +// NextSequence returns the NextSequence() from the bucket +func NextSequence(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + return bkt.NextSequence() +} + +// ForEach calls ForEach on the bucket +func ForEach(tx *Tx, bktName []byte, f func(k, v []byte) error) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.ForEach(f) +} + +// Delete deletes from a bucket +func Delete(tx *Tx, bktName, key []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Delete(key) +} + +// Len returns the number of keys in a bucket +func Len(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + bstats := bkt.Stats() + + if bstats.KeyN < 0 { + return 0, errors.New("Negative length queried from db stats") + } + + return uint64(bstats.KeyN), nil +} + +// IsEmpty returns true if the bucket is empty +func IsEmpty(tx *Tx, bktName []byte) (bool, error) { + length, err := Len(tx, bktName) + if err != nil { + return false, err + } + return length == 0, nil +} + +// Exists returns true if the bucket exists +func Exists(tx *Tx, bktName []byte) bool { + return tx.Bucket(bktName) != nil +} + +// Reset resets the bucket +func Reset(tx *Tx, bktName []byte) error { + if err := tx.DeleteBucket(bktName); err != nil { + return err + } + + _, err := tx.CreateBucket(bktName) + return err +} + +// Itob converts uint64 to bytes +func Itob(v uint64) []byte { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, v) + return b +} + +// Btoi converts bytes to uint64 +func Btoi(v []byte) uint64 { + return binary.BigEndian.Uint64(v) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution.go new file mode 100644 index 00000000..a373a826 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution.go @@ -0,0 +1,24 @@ +package visor + +import ( + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" +) + +// TransactionIsLocked returns true if the transaction spends locked outputs +func TransactionIsLocked(d params.Distribution, inUxs coin.UxArray) bool { + lockedAddrs := d.LockedAddresses() + lockedAddrsMap := make(map[string]struct{}) + for _, a := range lockedAddrs { + lockedAddrsMap[a] = struct{}{} + } + + for _, o := range inUxs { + uxAddr := o.Body.Address.String() + if _, ok := lockedAddrsMap[uxAddr]; ok { + return true + } + } + + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution_test.go new file mode 100644 index 00000000..33ef74e4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution_test.go @@ -0,0 +1,40 @@ +package visor + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" +) + +func TestTransactionIsLocked(t *testing.T) { + test := func(addrStr string, expectedIsLocked bool) { + addr := cipher.MustDecodeBase58Address(addrStr) + + uxOut := coin.UxOut{ + Body: coin.UxBody{ + Address: addr, + }, + } + uxArray := coin.UxArray{uxOut} + + isLocked := TransactionIsLocked(params.MainNetDistribution, uxArray) + require.Equal(t, expectedIsLocked, isLocked) + } + + for _, a := range params.MainNetDistribution.LockedAddresses() { + test(a, true) + } + + for _, a := range params.MainNetDistribution.UnlockedAddresses() { + test(a, false) + } + + // A random address should not be locked + pubKey, _ := cipher.GenerateKeyPair() + addr := cipher.AddressFromPubKey(pubKey) + test(addr.String(), false) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn.go new file mode 100644 index 00000000..cc9c96f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn.go @@ -0,0 +1,79 @@ +package historydb + +import ( + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +//go:generate skyencoder -unexported -struct hashesWrapper + +// hashesWrapper wraps []cipher.SHA256 +type hashesWrapper struct { + Hashes []cipher.SHA256 +} + +// AddressTxnsBkt maps addresses to transaction hashes +var AddressTxnsBkt = []byte("address_txns") + +// addressTxn buckets for storing address related transactions +// address as key, transaction id slice as value +type addressTxns struct{} + +// get returns the transaction hashes of given address +func (atx *addressTxns) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var txnHashes hashesWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, AddressTxnsBkt, addr.Bytes()) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashesWrapperExact(v, &txnHashes); err != nil { + return nil, err + } + + return txnHashes.Hashes, nil +} + +// add adds a hash to an address's hash list +func (atx *addressTxns) add(tx *dbutil.Tx, addr cipher.Address, hash cipher.SHA256) error { + hashes, err := atx.get(tx, addr) + if err != nil { + return err + } + + // check for duplicates + for _, u := range hashes { + if u == hash { + return nil + } + } + + hashes = append(hashes, hash) + + buf, err := encodeHashesWrapper(&hashesWrapper{ + Hashes: hashes, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, AddressTxnsBkt, addr.Bytes(), buf) +} + +// contains returns true if an address has transactions +func (atx *addressTxns) contains(tx *dbutil.Tx, addr cipher.Address) (bool, error) { + return dbutil.BucketHasKey(tx, AddressTxnsBkt, addr.Bytes()) +} + +// isEmpty checks if address transactions bucket is empty +func (atx *addressTxns) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressTxnsBkt) +} + +// reset resets the bucket +func (atx *addressTxns) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressTxnsBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn_test.go new file mode 100644 index 00000000..fdf32417 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn_test.go @@ -0,0 +1,254 @@ +package historydb + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func TestAddAddressTxns(t *testing.T) { + var preAddrs []cipher.Address + var preTxHashes []cipher.SHA256 + + type pair struct { + addr cipher.Address + txHash cipher.SHA256 + } + + type expectPair struct { + addr cipher.Address + txs []cipher.SHA256 + } + + for i := 0; i < 3; i++ { + preAddrs = append(preAddrs, makeAddress()) + preTxHashes = append(preTxHashes, cipher.SumSHA256([]byte(fmt.Sprintf("tx%d", i)))) + } + + var testCases = []struct { + name string + addPairs []pair + expect []expectPair + }{ + { + "address with single tx", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[1], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + { + preAddrs[1], + preTxHashes[1:2], + }, + }, + }, + { + "address with multiple transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:2], + }, + }, + }, + { + "add address with multiple same transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + + addrTxns := &addressTxns{} + + err := db.Update("", func(tx *dbutil.Tx) error { + for _, pr := range tc.addPairs { + err := addrTxns.add(tx, pr.addr, pr.txHash) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + for _, e := range tc.expect { + err := db.View("", func(tx *dbutil.Tx) error { + hashes, err := addrTxns.get(tx, e.addr) + require.NoError(t, err) + require.Equal(t, e.txs, hashes) + return nil + }) + require.NoError(t, err) + } + + }) + } +} + +func TestGetAddressTxns(t *testing.T) { + var preAddrs []cipher.Address + var preTxHashes []cipher.SHA256 + + type pair struct { + addr cipher.Address + txHash cipher.SHA256 + } + + type expectPair struct { + addr cipher.Address + txs []cipher.SHA256 + } + + for i := 0; i < 3; i++ { + preAddrs = append(preAddrs, makeAddress()) + preTxHashes = append(preTxHashes, cipher.SumSHA256([]byte(fmt.Sprintf("tx%d", i)))) + } + + var testCases = []struct { + name string + addPairs []pair + expect []expectPair + }{ + { + "address with single tx", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[1], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + { + preAddrs[1], + preTxHashes[1:2], + }, + }, + }, + { + "address with multiple transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:2], + }, + }, + }, + { + "add address with multiple same transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + + addrTxns := &addressTxns{} + + err := db.Update("", func(tx *dbutil.Tx) error { + for _, pr := range tc.addPairs { + err := addrTxns.add(tx, pr.addr, pr.txHash) + require.NoError(t, err) + } + + return nil + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + for _, e := range tc.expect { + hashes, err := addrTxns.get(tx, e.addr) + require.NoError(t, err) + require.Equal(t, e.txs, hashes) + } + return nil + }) + require.NoError(t, err) + + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_uxout.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_uxout.go new file mode 100644 index 00000000..f23185bc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_uxout.go @@ -0,0 +1,66 @@ +package historydb + +import ( + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +// AddressUxBkt maps addresses to unspent outputs +var AddressUxBkt = []byte("address_in") + +// bucket for storing address with UxOut, key as address, value as UxOut. +type addressUx struct{} + +// get return nil on not found. +func (au *addressUx) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var uxHashes hashesWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, AddressUxBkt, addr.Bytes()) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashesWrapperExact(v, &uxHashes); err != nil { + return nil, err + } + + return uxHashes.Hashes, nil +} + +// add adds a hash to an address's hash list +func (au *addressUx) add(tx *dbutil.Tx, address cipher.Address, uxHash cipher.SHA256) error { + hashes, err := au.get(tx, address) + if err != nil { + return err + } + + // check for duplicate hashes + for _, u := range hashes { + if u == uxHash { + return nil + } + } + + hashes = append(hashes, uxHash) + + buf, err := encodeHashesWrapper(&hashesWrapper{ + Hashes: hashes, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, AddressUxBkt, address.Bytes(), buf) +} + +// isEmpty checks if the addressUx bucket is empty +func (au *addressUx) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressUxBkt) +} + +// reset resets the bucket +func (au *addressUx) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressUxBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go new file mode 100644 index 00000000..36fc3090 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go @@ -0,0 +1,126 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeHashesWrapper computes the size of an encoded object of type hashesWrapper +func encodeSizeHashesWrapper(obj *hashesWrapper) uint64 { + i0 := uint64(0) + + // obj.Hashes + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Hashes)) * i1 + } + + return i0 +} + +// encodeHashesWrapper encodes an object of type hashesWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeHashesWrapper(obj *hashesWrapper) ([]byte, error) { + n := encodeSizeHashesWrapper(obj) + buf := make([]byte, n) + + if err := encodeHashesWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeHashesWrapperToBuffer encodes an object of type hashesWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeHashesWrapperToBuffer(buf []byte, obj *hashesWrapper) error { + if uint64(len(buf)) < encodeSizeHashesWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Hashes length check + if uint64(len(obj.Hashes)) > math.MaxUint32 { + return errors.New("obj.Hashes length exceeds math.MaxUint32") + } + + // obj.Hashes length + e.Uint32(uint32(len(obj.Hashes))) + + // obj.Hashes + for _, x := range obj.Hashes { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeHashesWrapper decodes an object of type hashesWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeHashesWrapper(buf []byte, obj *hashesWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Hashes + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Hashes = make([]cipher.SHA256, length) + + for z1 := range obj.Hashes { + { + // obj.Hashes[z1] + if len(d.Buffer) < len(obj.Hashes[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Hashes[z1][:], d.Buffer[:len(obj.Hashes[z1])]) + d.Buffer = d.Buffer[len(obj.Hashes[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeHashesWrapperExact decodes an object of type hashesWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeHashesWrapperExact(buf []byte, obj *hashesWrapper) error { + if n, err := decodeHashesWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder_test.go new file mode 100644 index 00000000..ca0cbfb1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyHashesWrapperForEncodeTest() *hashesWrapper { + var obj hashesWrapper + return &obj +} + +func newRandomHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderHashesWrapper(t *testing.T, obj *hashesWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeHashesWrapper(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeHashesWrapper() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeHashesWrapper(obj) + if err != nil { + t.Fatalf("encodeHashesWrapper failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeHashesWrapper produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeHashesWrapper()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeHashesWrapperToBuffer(data3, obj); err != nil { + t.Fatalf("encodeHashesWrapperToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 hashesWrapper + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 hashesWrapper + if n, err := decodeHashesWrapper(data2, &obj3); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // Decode, excess buffer + var obj4 hashesWrapper + n, err := decodeHashesWrapper(data3, &obj4) + if err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // DecodeExact + var obj5 hashesWrapper + if err := decodeHashesWrapperExact(data2, &obj5); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeHashesWrapper(data4, &obj3); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderHashesWrapper(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *hashesWrapper + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyHashesWrapperForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomHashesWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenHashesWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilHashesWrapperForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderHashesWrapper(t, tc.obj) + }) + } +} + +func decodeHashesWrapperExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashesWrapper + if _, err := decodeHashesWrapper(buf, &obj); err == nil { + t.Fatal("decodeHashesWrapper: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashesWrapper: expected error %q, got %q", expectedErr, err) + } +} + +func decodeHashesWrapperExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashesWrapper + if err := decodeHashesWrapperExact(buf, &obj); err == nil { + t.Fatal("decodeHashesWrapperExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashesWrapperExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderHashesWrapperDecodeErrors(t *testing.T, k int, tag string, obj *hashesWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeHashesWrapper(obj) + buf, err := encodeHashesWrapper(obj) + if err != nil { + t.Fatalf("encodeHashesWrapper failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashesWrapperExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashesWrapperExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderHashesWrapperDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyHashesWrapperForEncodeTest() + fullObj := newRandomHashesWrapperForEncodeTest(t, rand) + testSkyencoderHashesWrapperDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderHashesWrapperDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta.go new file mode 100644 index 00000000..17001850 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta.go @@ -0,0 +1,36 @@ +package historydb + +import ( + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // HistoryMetaBkt holds history metadata + HistoryMetaBkt = []byte("history_meta") + parsedHeightKey = []byte("parsed_height") +) + +// historyMeta bucket for storing block history meta info +type historyMeta struct{} + +// parsedBlockSeq returns history parsed block seq +func (hm *historyMeta) parsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, HistoryMetaBkt, parsedHeightKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} + +// setParsedBlockSeq updates history parsed block seq +func (hm *historyMeta) setParsedBlockSeq(tx *dbutil.Tx, h uint64) error { + return dbutil.PutBucketValue(tx, HistoryMetaBkt, parsedHeightKey, dbutil.Itob(h)) +} + +// reset resets the bucket +func (hm *historyMeta) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, HistoryMetaBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta_test.go new file mode 100644 index 00000000..e18de9af --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta_test.go @@ -0,0 +1,58 @@ +package historydb + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func TestHistoryMetaGetSetParsedHeight(t *testing.T) { + db, td := prepareDB(t) + defer td() + + hm := &historyMeta{} + + err := db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.parsedBlockSeq(tx) + require.NoError(t, err) + require.False(t, ok) + require.Equal(t, uint64(0), height) + return err + }) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + err := hm.setParsedBlockSeq(tx, 10) + require.NoError(t, err) + return err + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.parsedBlockSeq(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(10), height) + return err + }) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + err := hm.setParsedBlockSeq(tx, 0) + require.NoError(t, err) + return err + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.parsedBlockSeq(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(0), height) + return err + }) + require.NoError(t, err) + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb.go new file mode 100644 index 00000000..08b08182 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb.go @@ -0,0 +1,395 @@ +/* +Package historydb stores historical blockchain data. +*/ +package historydb + +import ( + "errors" + "fmt" + "sync" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var logger = logging.MustGetLogger("historydb") + +// CreateBuckets creates bolt.DB buckets used by the historydb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + AddressTxnsBkt, + AddressUxBkt, + HistoryMetaBkt, + UxOutsBkt, + TransactionsBkt, + }) +} + +// HistoryDB provides APIs for blockchain explorer +type HistoryDB struct { + outputs *uxOuts // outputs bucket + txns *transactions // transactions bucket + addrUx *addressUx // bucket which stores all UxOuts that address received + addrTxns *addressTxns // address related transaction bucket + meta *historyMeta // stores history meta info +} + +// New create HistoryDB instance +func New() *HistoryDB { + return &HistoryDB{ + outputs: &uxOuts{}, + txns: &transactions{}, + addrUx: &addressUx{}, + addrTxns: &addressTxns{}, + meta: &historyMeta{}, + } +} + +// NeedsReset checks if need to reset the parsed block history, +// If we have a new added bucket, we need to reset to parse +// blockchain again to get the new bucket filled. +func (hd *HistoryDB) NeedsReset(tx *dbutil.Tx) (bool, error) { + _, ok, err := hd.meta.parsedBlockSeq(tx) + if err != nil { + return false, err + } else if !ok { + return true, nil + } + + // if any of the following buckets are empty, need to reset + addrTxnsEmpty, err := hd.addrTxns.isEmpty(tx) + if err != nil { + return false, err + } + + addrUxEmpty, err := hd.addrUx.isEmpty(tx) + if err != nil { + return false, err + } + + txnsEmpty, err := hd.txns.isEmpty(tx) + if err != nil { + return false, err + } + + outputsEmpty, err := hd.outputs.isEmpty(tx) + if err != nil { + return false, err + } + + if addrTxnsEmpty || addrUxEmpty || txnsEmpty || outputsEmpty { + return true, nil + } + + return false, nil +} + +// Erase erases the entire HistoryDB +func (hd *HistoryDB) Erase(tx *dbutil.Tx) error { + logger.Debug("HistoryDB.reset") + if err := hd.addrTxns.reset(tx); err != nil { + return err + } + + if err := hd.addrUx.reset(tx); err != nil { + return err + } + + if err := hd.outputs.reset(tx); err != nil { + return err + } + + if err := hd.meta.reset(tx); err != nil { + return err + } + + return hd.txns.reset(tx) +} + +// ParsedBlockSeq returns the block seq up to which the HistoryDB is parsed +func (hd *HistoryDB) ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + return hd.meta.parsedBlockSeq(tx) +} + +// SetParsedBlockSeq sets the block seq up to which the HistoryDB is parsed +func (hd *HistoryDB) SetParsedBlockSeq(tx *dbutil.Tx, seq uint64) error { + return hd.meta.setParsedBlockSeq(tx, seq) +} + +// GetUxOuts get UxOut of specific uxIDs. +func (hd *HistoryDB) GetUxOuts(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]UxOut, error) { + return hd.outputs.getArray(tx, uxIDs) +} + +// ParseBlock builds indexes out of the block data +func (hd *HistoryDB) ParseBlock(tx *dbutil.Tx, b coin.Block) error { + for _, t := range b.Body.Transactions { + txn := Transaction{ + Txn: t, + BlockSeq: b.Seq(), + } + + spentTxnID := t.Hash() + + if err := hd.txns.put(tx, &txn); err != nil { + return err + } + + for _, in := range t.In { + o, err := hd.outputs.get(tx, in) + if err != nil { + return err + } + + if o == nil { + return errors.New("HistoryDB.ParseBlock: transaction input not found in outputs bucket") + } + + // update the output's spent block seq and txid + o.SpentBlockSeq = b.Seq() + o.SpentTxnID = spentTxnID + if err := hd.outputs.put(tx, *o); err != nil { + return err + } + + // store the IN address with txid + if err := hd.addrTxns.add(tx, o.Out.Body.Address, spentTxnID); err != nil { + return err + } + } + + // handle the tx out + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + if err := hd.outputs.put(tx, UxOut{ + Out: ux, + }); err != nil { + return err + } + + if err := hd.addrUx.add(tx, ux.Body.Address, ux.Hash()); err != nil { + return err + } + + if err := hd.addrTxns.add(tx, ux.Body.Address, spentTxnID); err != nil { + return err + } + } + } + + return hd.SetParsedBlockSeq(tx, b.Seq()) +} + +// GetTransaction get transaction by hash. +func (hd HistoryDB) GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + return hd.txns.get(tx, hash) +} + +// GetOutputsForAddress get all uxout that the address affected. +func (hd HistoryDB) GetOutputsForAddress(tx *dbutil.Tx, addr cipher.Address) ([]UxOut, error) { + hashes, err := hd.addrUx.get(tx, addr) + if err != nil { + return nil, err + } + + return hd.outputs.getArray(tx, hashes) +} + +// GetTransactionsForAddress returns all the address related transactions +func (hd HistoryDB) GetTransactionsForAddress(tx *dbutil.Tx, addr cipher.Address) ([]Transaction, error) { + hashes, err := hd.addrTxns.get(tx, addr) + if err != nil { + return nil, err + } + + return hd.txns.getArray(tx, hashes) +} + +// AddressSeen returns true if the address appears in the blockchain +func (hd HistoryDB) AddressSeen(tx *dbutil.Tx, addr cipher.Address) (bool, error) { + return hd.addrTxns.contains(tx, addr) +} + +// ForEachTxn traverses the transactions bucket +func (hd HistoryDB) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return hd.txns.forEach(tx, f) +} + +// IndexesMap is a goroutine safe address indexes map +type IndexesMap struct { + value map[cipher.Address]AddressIndexes + lock sync.RWMutex +} + +// NewIndexesMap creates a IndexesMap instance +func NewIndexesMap() *IndexesMap { + return &IndexesMap{ + value: make(map[cipher.Address]AddressIndexes), + } +} + +// Load returns value of given key +func (im *IndexesMap) Load(addr cipher.Address) (AddressIndexes, bool) { + im.lock.RLock() + defer im.lock.RUnlock() + v, ok := im.value[addr] + return v, ok +} + +// Store saves address with indexes +func (im *IndexesMap) Store(addr cipher.Address, indexes AddressIndexes) { + im.lock.Lock() + defer im.lock.Unlock() + im.value[addr] = indexes +} + +// AddressIndexes represents the address indexes struct +type AddressIndexes struct { + TxnHashes map[cipher.SHA256]struct{} + UxHashes map[cipher.SHA256]struct{} +} + +// Verify checks if the historydb is corrupted +func (hd HistoryDB) Verify(tx *dbutil.Tx, b *coin.SignedBlock, indexesMap *IndexesMap) error { + for _, t := range b.Body.Transactions { + txnHash := t.Hash() + txn, err := hd.txns.get(tx, txnHash) + if err != nil { + return err + } + + if txn == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction %v does not exist in historydb", txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + for _, in := range t.In { + // Checks the existence of transaction input + o, err := hd.outputs.get(tx, in) + if err != nil { + return err + } + + if o == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction input %v does not exist in historydb", in.Hex()) + return ErrHistoryDBCorrupted{err} + } + + // Checks the output's spend block seq + if o.SpentBlockSeq != b.Seq() { + err := fmt.Errorf("HistoryDB.Verify: spend block seq of transaction input %v is wrong, should be: %v, but is %v", + in.Hex(), b.Seq(), o.SpentBlockSeq) + return ErrHistoryDBCorrupted{err} + } + + addr := o.Out.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + uxHashesMap := map[cipher.SHA256]struct{}{} + + // Checks if the address indexes already loaded into memory + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + uxHashesMap = indexes.UxHashes + } else { + txnHashes, err := hd.addrTxns.get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.get(tx, addr) + if err != nil { + return err + } + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + if _, ok := uxHashesMap[in]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address uxout [%s:%s] does not exist in historydb", + addr, in.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + + // Checks the transaction outs + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + uxHash := ux.Hash() + out, err := hd.outputs.get(tx, uxHash) + if err != nil { + return err + } + + if out == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction output %s does not exist in historydb", uxHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + addr := ux.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + } else { + txnHashes, err := hd.addrTxns.get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.get(tx, addr) + if err != nil { + return err + } + + uxHashesMap := make(map[cipher.SHA256]struct{}, len(uxHashes)) + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + } + return nil +} + +// ErrHistoryDBCorrupted is returned when found the historydb is corrupted +type ErrHistoryDBCorrupted struct { + error +} + +// NewErrHistoryDBCorrupted is for user to be able to create ErrHistoryDBCorrupted instance +// outside of the package +func NewErrHistoryDBCorrupted(err error) ErrHistoryDBCorrupted { + return ErrHistoryDBCorrupted{err} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb_test.go new file mode 100644 index 00000000..543bdaca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb_test.go @@ -0,0 +1,484 @@ +package historydb + +import ( + "errors" + "fmt" + "log" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + return CreateBuckets(tx) + }) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) +) + +var genTime uint64 = 1000 +var incTime uint64 = 3600 * 1000 +var genCoins uint64 = 1000e6 + +func feeCalc(t *coin.Transaction) (uint64, error) { + return 0, nil +} + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +// Blockchainer interface for isolating the detail of blockchain. +type Blockchainer interface { + Head() *coin.Block + GetBlockInDepth(depth uint64) *coin.Block + ExecuteBlock(b *coin.Block) (coin.UxArray, error) + CreateGenesisBlock(genAddress cipher.Address, genCoins, timestamp uint64) coin.Block + VerifyTransaction(tx coin.Transaction) error + GetBlock(hash cipher.SHA256) *coin.Block +} + +type fakeBlockchain struct { + blocks []coin.Block + unspent map[string]coin.UxOut + uxhash cipher.SHA256 +} + +func newBlockchain() *fakeBlockchain { + return &fakeBlockchain{ + unspent: make(map[string]coin.UxOut), + } +} + +func (fbc fakeBlockchain) GetBlockInDepth(depth uint64) *coin.Block { + if depth >= uint64(len(fbc.blocks)) { + panic(fmt.Sprintf("block depth: %d overflow", depth)) + } + + return &fbc.blocks[depth] +} + +func (fbc fakeBlockchain) Head() *coin.Block { + l := len(fbc.blocks) + if l == 0 { + return nil + } + + return &fbc.blocks[l-1] +} + +func (fbc *fakeBlockchain) deleteUxOut(uxids []cipher.SHA256) { + for _, id := range uxids { + ux := fbc.unspent[id.Hex()] + fbc.uxhash = fbc.uxhash.Xor(ux.SnapshotHash()) + delete(fbc.unspent, id.Hex()) + } +} + +func (fbc *fakeBlockchain) addUxOut(ux coin.UxOut) { + fbc.uxhash = fbc.uxhash.Xor(ux.SnapshotHash()) + fbc.unspent[ux.Hash().Hex()] = ux +} + +func (fbc *fakeBlockchain) ExecuteBlock(b *coin.Block) (coin.UxArray, error) { + var uxs coin.UxArray + txns := b.Body.Transactions + for _, txn := range txns { + // Remove spent outputs + for _, id := range txn.In { + ux := fbc.unspent[id.Hex()] + fbc.uxhash = fbc.uxhash.Xor(ux.SnapshotHash()) + delete(fbc.unspent, id.Hex()) + + } + fbc.deleteUxOut(txn.In) + // Create new outputs + txnUxs := coin.CreateUnspents(b.Head, txn) + for i := range txnUxs { + fbc.addUxOut(txnUxs[i]) + } + uxs = append(uxs, txnUxs...) + } + + b.Head.PrevHash = fbc.Head().HashHeader() + fbc.blocks = append(fbc.blocks, *b) + + return uxs, nil +} + +func (fbc *fakeBlockchain) CreateGenesisBlock(genesisAddr cipher.Address, genesisCoins, timestamp uint64) coin.Block { + txn := coin.Transaction{} + err := txn.PushOutput(genesisAddr, genesisCoins, genesisCoins) + if err != nil { + panic(err) + } + body := coin.BlockBody{Transactions: coin.Transactions{txn}} + prevHash := cipher.SHA256{} + bodyHash := body.Hash() + head := coin.BlockHeader{ + Time: timestamp, + BodyHash: bodyHash, + PrevHash: prevHash, + BkSeq: 0, + Version: 0, + Fee: 0, + UxHash: cipher.SHA256{}, + } + b := coin.Block{ + Head: head, + Body: body, + } + // b.Body.Transactions[0].UpdateHeader() + fbc.blocks = append(fbc.blocks, b) + ux := coin.UxOut{ + Head: coin.UxHead{ + Time: timestamp, + BkSeq: 0, + }, + Body: coin.UxBody{ + SrcTransaction: txn.InnerHash, //user inner hash + Address: genesisAddr, + Coins: genesisCoins, + Hours: genesisCoins, // Allocate 1 coin hour per coin + }, + } + fbc.addUxOut(ux) + return b +} + +func (fbc fakeBlockchain) VerifyTransaction(tx coin.Transaction) error { + return nil +} + +func (fbc fakeBlockchain) GetBlock(hash cipher.SHA256) *coin.Block { + for _, b := range fbc.blocks { + if b.HashHeader() == hash { + return &b + } + } + return nil +} + +func TestProcessGenesisBlock(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + bc := newBlockchain() + gb := bc.CreateGenesisBlock(genAddress, genCoins, genTime) + hisDB := New() + + err := db.Update("", func(tx *dbutil.Tx) error { + err := hisDB.ParseBlock(tx, gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // check transactions bucket. + var txn Transaction + txnHash := gb.Body.Transactions[0].Hash() + mustGetBucketValue(t, db, TransactionsBkt, txnHash[:], &txn) + require.Equal(t, txn.Txn, gb.Body.Transactions[0]) + + // check address in + outID := []cipher.SHA256{} + mustGetBucketValue(t, db, AddressUxBkt, genAddress.Bytes(), &outID) + + ux, ok := bc.unspent[outID[0].Hex()] + require.True(t, ok) + require.Equal(t, outID[0], ux.Hash()) + + // check outputs + output := UxOut{} + mustGetBucketValue(t, db, UxOutsBkt, outID[0][:], &output) + + require.Equal(t, output.Out, ux) +} + +type testData struct { + PreBlockHash cipher.SHA256 + Vin txIn + Vouts []txOut + AddrInNum map[string]int + AddrOutNum map[string]int +} + +type txIn struct { + SigKey string + Addr string + TxID cipher.SHA256 + BlockSeq uint64 +} + +type txOut struct { + ToAddr string + Coins uint64 + Hours uint64 +} + +// findTxnInBlock looks up a coin.Transaction from a coin.Block. +// Returns the Transaction and whether it was found or not +func findTxnInBlock(b *coin.Block, txnHash cipher.SHA256) (coin.Transaction, bool) { + txns := b.Body.Transactions + for i := range txns { + if txns[i].Hash() == txnHash { + return txns[i], true + } + } + return coin.Transaction{}, false +} + +func getUx(bc Blockchainer, seq uint64, txID cipher.SHA256, addr string) (*coin.UxOut, error) { + b := bc.GetBlockInDepth(seq) + if b == nil { + return nil, fmt.Errorf("no block in depth:%v", seq) + } + + txn, ok := findTxnInBlock(b, txID) + if !ok { + return nil, errors.New("found transaction failed") + } + + uxs := coin.CreateUnspents(b.Head, txn) + for _, u := range uxs { + if u.Body.Address.String() == addr { + return &u, nil + } + } + return nil, nil +} + +func TestProcessBlock(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + bc := newBlockchain() + gb := bc.CreateGenesisBlock(genAddress, genCoins, genTime) + + // create + hisDB := New() + + err := db.Update("", func(tx *dbutil.Tx) error { + err := hisDB.ParseBlock(tx, gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + /* + + |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS + genesisAddr ==>| |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS + |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm ==>| + |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm + */ + + testData := []testData{ + { + PreBlockHash: gb.HashHeader(), + Vin: txIn{ + SigKey: genSecret.Hex(), + Addr: genAddress.String(), + TxID: gb.Body.Transactions[0].Hash(), + BlockSeq: 0, + }, + Vouts: []txOut{ + { + ToAddr: "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS", + Coins: 10e6, + Hours: 100, + }, + { + ToAddr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", + Coins: genCoins - 10e6, + Hours: 400, + }, + }, + AddrInNum: map[string]int{ + "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS": 1, + "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm": 1, + }, + AddrOutNum: map[string]int{ + genAddress.String(): 1, + }, + }, + { + Vin: txIn{ + Addr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", + SigKey: "62f4d675d991c41a2819d908a4fcf4ba44ff0c31564039e80508c9d68197f90c", + BlockSeq: 1, + }, + Vouts: []txOut{ + { + ToAddr: "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS", + Coins: 10e6, + Hours: 100, + }, + { + ToAddr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", + Coins: 1000e6 - 20e6, + Hours: 100, + }, + }, + AddrInNum: map[string]int{ + "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS": 2, + "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm": 2, + }, + AddrOutNum: map[string]int{ + "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm": 1, + }, + }, + } + + testEngine(t, testData, bc, hisDB, db) +} + +func testEngine(t *testing.T, tds []testData, bc *fakeBlockchain, hdb *HistoryDB, db *dbutil.DB) { + for i, td := range tds { + b, txn, err := addBlock(bc, td, incTime*(uint64(i)+1)) + require.NoError(t, err) + + // update the next block test data. + if i+1 < len(tds) { + // update UxOut of next test data. + tds[i+1].Vin.TxID = txn.Hash() + tds[i+1].PreBlockHash = b.HashHeader() + } + + err = db.Update("", func(tx *dbutil.Tx) error { + err := hdb.ParseBlock(tx, *b) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // check txn + txnInBkt := Transaction{} + k := txn.Hash() + mustGetBucketValue(t, db, TransactionsBkt, k[:], &txnInBkt) + require.Equal(t, &txnInBkt.Txn, txn) + + // check outputs + for _, o := range td.Vouts { + ux, err := getUx(bc, uint64(i+1), txn.Hash(), o.ToAddr) + require.NoError(t, err) + + uxInDB := UxOut{} + uxKey := ux.Hash() + mustGetBucketValue(t, db, UxOutsBkt, uxKey[:], &uxInDB) + require.Equal(t, &uxInDB.Out, ux) + } + + // check addr in + for _, o := range td.Vouts { + addr := cipher.MustDecodeBase58Address(o.ToAddr) + uxHashes := []cipher.SHA256{} + mustGetBucketValue(t, db, AddressUxBkt, addr.Bytes(), &uxHashes) + require.Equal(t, len(uxHashes), td.AddrInNum[o.ToAddr]) + } + } +} + +func addBlock(bc *fakeBlockchain, td testData, tm uint64) (*coin.Block, *coin.Transaction, error) { + txn := coin.Transaction{} + // get unspent output + ux, err := getUx(bc, td.Vin.BlockSeq, td.Vin.TxID, td.Vin.Addr) + if err != nil { + return nil, nil, err + } + if ux == nil { + return nil, nil, errors.New("no unspent output") + } + + if err := txn.PushInput(ux.Hash()); err != nil { + return nil, nil, err + } + + for _, o := range td.Vouts { + addr, err := cipher.DecodeBase58Address(o.ToAddr) + if err != nil { + return nil, nil, err + } + if err := txn.PushOutput(addr, o.Coins, o.Hours); err != nil { + return nil, nil, err + } + } + + sigKey := cipher.MustSecKeyFromHex(td.Vin.SigKey) + txn.SignInputs([]cipher.SecKey{sigKey}) + if err := txn.UpdateHeader(); err != nil { + return nil, nil, err + } + if err := bc.VerifyTransaction(txn); err != nil { + return nil, nil, err + } + preBlock := bc.GetBlock(td.PreBlockHash) + b := newBlock(*preBlock, tm, bc.uxhash, coin.Transactions{txn}, feeCalc) + + // uxs, err := bc.ExecuteBlock(&b) + _, err = bc.ExecuteBlock(&b) + if err != nil { + return nil, nil, err + } + return &b, &txn, nil +} + +func mustGetBucketValue(t *testing.T, db *dbutil.DB, name []byte, key []byte, value interface{}) { + err := db.View("", func(tx *dbutil.Tx) error { + ok, err := dbutil.GetBucketObjectDecoded(tx, name, key, value) + require.NoError(t, err) + require.True(t, ok) + return err + }) + require.NoError(t, err) +} + +func newBlock(prev coin.Block, currentTime uint64, uxHash cipher.SHA256, txns coin.Transactions, calc coin.FeeCalculator) coin.Block { + if len(txns) == 0 { + log.Panic("Refusing to create block with no transactions") + } + fee, err := txns.Fees(calc) + if err != nil { + // This should have been caught earlier + log.Panicf("Invalid transaction fees: %v", err) + } + body := coin.BlockBody{Transactions: txns} + return coin.Block{ + Head: newBlockHeader(prev.Head, uxHash, currentTime, fee, body), + Body: body, + } +} + +func newBlockHeader(prev coin.BlockHeader, uxHash cipher.SHA256, currentTime, fee uint64, body coin.BlockBody) coin.BlockHeader { + prevHash := prev.Hash() + bodyHash := body.Hash() + return coin.BlockHeader{ + BodyHash: bodyHash, + Version: prev.Version, + PrevHash: prevHash, + Time: currentTime, + BkSeq: prev.BkSeq + 1, + Fee: fee, + UxHash: uxHash, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/output.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/output.go new file mode 100644 index 00000000..efa3238c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/output.go @@ -0,0 +1,102 @@ +package historydb + +import ( + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +//go:generate skyencoder -unexported -struct UxOut + +// UxOutsBkt holds unspent outputs +var UxOutsBkt = []byte("uxouts") + +// UxOut expend coin.UxOut struct +type UxOut struct { + Out coin.UxOut + SpentTxnID cipher.SHA256 // id of tx which spent this output. + SpentBlockSeq uint64 // block seq that spent the output. +} + +// Hash returns outhash +func (o UxOut) Hash() cipher.SHA256 { + return o.Out.Hash() +} + +// ErrUxOutNotExist is returned if an uxout is not found in historydb +type ErrUxOutNotExist struct { + UxID string +} + +// NewErrUxOutNotExist creates ErrUxOutNotExist from a UxID +func NewErrUxOutNotExist(uxID string) error { + return ErrUxOutNotExist{ + UxID: uxID, + } +} + +func (e ErrUxOutNotExist) Error() string { + return fmt.Sprintf("uxout of %s does not exist", e.UxID) +} + +// uxOuts bucket stores outputs, UxOut hash as key and Output as value. +type uxOuts struct{} + +// put sets out value +func (ux *uxOuts) put(tx *dbutil.Tx, out UxOut) error { + hash := out.Hash() + + buf, err := encodeUxOut(&out) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UxOutsBkt, hash[:], buf) +} + +// get gets UxOut of given id +func (ux *uxOuts) get(tx *dbutil.Tx, uxID cipher.SHA256) (*UxOut, error) { + var out UxOut + + v, err := dbutil.GetBucketValueNoCopy(tx, UxOutsBkt, uxID[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeUxOutExact(v, &out); err != nil { + return nil, err + } + + return &out, nil +} + +// getArray returns uxOuts for a set of uxids, will return error if any of the uxids do not exist +func (ux *uxOuts) getArray(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]UxOut, error) { + var outs []UxOut + for _, uxID := range uxIDs { + out, err := ux.get(tx, uxID) + if err != nil { + return nil, err + } else if out == nil { + return nil, NewErrUxOutNotExist(uxID.Hex()) + } + + outs = append(outs, *out) + } + + return outs, nil +} + +// isEmpty checks if the uxout bucekt is empty +func (ux *uxOuts) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, UxOutsBkt) +} + +// reset resets the bucket +func (ux *uxOuts) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, UxOutsBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction.go new file mode 100644 index 00000000..2addd633 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction.go @@ -0,0 +1,107 @@ +package historydb + +// transaction.go mainly provides transaction corresponding buckets and apis, +// The transactions bucket, tx hash as key, and tx as value, it's the main bucket that stores the +// transaction value. All other buckets that index different field of transaction will only records the +// transaction hash, and get the tx value from transactions bucket. + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +//go:generate skyencoder -unexported -struct Transaction + +// Transaction contains transaction info and the seq of block which executed this block. +type Transaction struct { + Txn coin.Transaction + BlockSeq uint64 +} + +// Hash return the Txn hash. +func (txn *Transaction) Hash() cipher.SHA256 { + return txn.Txn.Hash() +} + +// TransactionsBkt holds Transactions +var TransactionsBkt = []byte("transactions") + +// Transactions transaction bucket instance. +type transactions struct{} + +// put transaction in the db +func (txs *transactions) put(tx *dbutil.Tx, txn *Transaction) error { + hash := txn.Hash() + buf, err := encodeTransaction(txn) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, TransactionsBkt, hash[:], buf) +} + +// get gets transaction by transaction hash, return nil on not found +func (txs *transactions) get(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + var txn Transaction + + v, err := dbutil.GetBucketValueNoCopy(tx, TransactionsBkt, hash[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeTransactionExact(v, &txn); err != nil { + return nil, err + } + + return &txn, nil +} + +// getArray returns transactions slice of given hashes +func (txs *transactions) getArray(tx *dbutil.Tx, hashes []cipher.SHA256) ([]Transaction, error) { + txns := make([]Transaction, 0, len(hashes)) + for _, h := range hashes { + txn, err := txs.get(tx, h) + if err != nil { + return nil, err + } + if txn == nil { + return nil, errors.New("Transaction not found") + } + + txns = append(txns, *txn) + } + + return txns, nil +} + +// isEmpty checks if transaction bucket is empty +func (txs *transactions) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, TransactionsBkt) +} + +// reset resets the bucket +func (txs *transactions) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, TransactionsBkt) +} + +// forEach traverses the transactions in db +func (txs *transactions) forEach(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return dbutil.ForEach(tx, TransactionsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var txn Transaction + if err := decodeTransactionExact(v, &txn); err != nil { + return err + } + + return f(hash, &txn) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder.go new file mode 100644 index 00000000..36f2d59b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder.go @@ -0,0 +1,373 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeTransaction computes the size of an encoded object of type Transaction +func encodeSizeTransaction(obj *Transaction) uint64 { + i0 := uint64(0) + + // obj.Txn.Length + i0 += 4 + + // obj.Txn.Type + i0++ + + // obj.Txn.InnerHash + i0 += 32 + + // obj.Txn.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Txn.Sigs)) * i1 + } + + // obj.Txn.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Txn.In)) * i1 + } + + // obj.Txn.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Txn.Out)) * i1 + } + + // obj.BlockSeq + i0 += 8 + + return i0 +} + +// encodeTransaction encodes an object of type Transaction to a buffer allocated to the exact size +// required to encode the object. +func encodeTransaction(obj *Transaction) ([]byte, error) { + n := encodeSizeTransaction(obj) + buf := make([]byte, n) + + if err := encodeTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionToBuffer encodes an object of type Transaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionToBuffer(buf []byte, obj *Transaction) error { + if uint64(len(buf)) < encodeSizeTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Txn.Length + e.Uint32(obj.Txn.Length) + + // obj.Txn.Type + e.Uint8(obj.Txn.Type) + + // obj.Txn.InnerHash + e.CopyBytes(obj.Txn.InnerHash[:]) + + // obj.Txn.Sigs maxlen check + if len(obj.Txn.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Txn.Sigs length check + if uint64(len(obj.Txn.Sigs)) > math.MaxUint32 { + return errors.New("obj.Txn.Sigs length exceeds math.MaxUint32") + } + + // obj.Txn.Sigs length + e.Uint32(uint32(len(obj.Txn.Sigs))) + + // obj.Txn.Sigs + for _, x := range obj.Txn.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Txn.In maxlen check + if len(obj.Txn.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Txn.In length check + if uint64(len(obj.Txn.In)) > math.MaxUint32 { + return errors.New("obj.Txn.In length exceeds math.MaxUint32") + } + + // obj.Txn.In length + e.Uint32(uint32(len(obj.Txn.In))) + + // obj.Txn.In + for _, x := range obj.Txn.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Txn.Out maxlen check + if len(obj.Txn.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Txn.Out length check + if uint64(len(obj.Txn.Out)) > math.MaxUint32 { + return errors.New("obj.Txn.Out length exceeds math.MaxUint32") + } + + // obj.Txn.Out length + e.Uint32(uint32(len(obj.Txn.Out))) + + // obj.Txn.Out + for _, x := range obj.Txn.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + // obj.BlockSeq + e.Uint64(obj.BlockSeq) + + return nil +} + +// decodeTransaction decodes an object of type Transaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransaction(buf []byte, obj *Transaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Txn.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Txn.Length = i + } + + { + // obj.Txn.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Txn.Type = i + } + + { + // obj.Txn.InnerHash + if len(d.Buffer) < len(obj.Txn.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.InnerHash[:], d.Buffer[:len(obj.Txn.InnerHash)]) + d.Buffer = d.Buffer[len(obj.Txn.InnerHash):] + } + + { + // obj.Txn.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Txn.Sigs = make([]cipher.Sig, length) + + for z2 := range obj.Txn.Sigs { + { + // obj.Txn.Sigs[z2] + if len(d.Buffer) < len(obj.Txn.Sigs[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.Sigs[z2][:], d.Buffer[:len(obj.Txn.Sigs[z2])]) + d.Buffer = d.Buffer[len(obj.Txn.Sigs[z2]):] + } + + } + } + } + + { + // obj.Txn.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Txn.In = make([]cipher.SHA256, length) + + for z2 := range obj.Txn.In { + { + // obj.Txn.In[z2] + if len(d.Buffer) < len(obj.Txn.In[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.In[z2][:], d.Buffer[:len(obj.Txn.In[z2])]) + d.Buffer = d.Buffer[len(obj.Txn.In[z2]):] + } + + } + } + } + + { + // obj.Txn.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Txn.Out = make([]coin.TransactionOutput, length) + + for z2 := range obj.Txn.Out { + { + // obj.Txn.Out[z2].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Txn.Out[z2].Address.Version = i + } + + { + // obj.Txn.Out[z2].Address.Key + if len(d.Buffer) < len(obj.Txn.Out[z2].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.Out[z2].Address.Key[:], d.Buffer[:len(obj.Txn.Out[z2].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Txn.Out[z2].Address.Key):] + } + + { + // obj.Txn.Out[z2].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Txn.Out[z2].Coins = i + } + + { + // obj.Txn.Out[z2].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Txn.Out[z2].Hours = i + } + + } + } + } + + { + // obj.BlockSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.BlockSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionExact decodes an object of type Transaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionExact(buf []byte, obj *Transaction) error { + if n, err := decodeTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder_test.go new file mode 100644 index 00000000..b2cb84aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyTransactionForEncodeTest() *Transaction { + var obj Transaction + return &obj +} + +func newRandomTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransaction(t *testing.T, obj *Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransaction(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransaction() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransaction produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransaction()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 Transaction + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 Transaction + if n, err := decodeTransaction(data2, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Decode, excess buffer + var obj4 Transaction + n, err := decodeTransaction(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // DecodeExact + var obj5 Transaction + if err := decodeTransactionExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransaction(data4, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransaction(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *Transaction + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransaction(t, tc.obj) + }) + } +} + +func decodeTransactionExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj Transaction + if _, err := decodeTransaction(buf, &obj); err == nil { + t.Fatal("decodeTransaction: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransaction: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj Transaction + if err := decodeTransactionExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionDecodeErrors(t *testing.T, k int, tag string, obj *Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransaction(obj) + buf, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionForEncodeTest() + fullObj := newRandomTransactionForEncodeTest(t, rand) + testSkyencoderTransactionDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_test.go new file mode 100644 index 00000000..b94867a9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_test.go @@ -0,0 +1,211 @@ +package historydb + +import ( + "errors" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +func TestTransactionGet(t *testing.T) { + txns := make([]Transaction, 0, 3) + for i := 0; i < 3; i++ { + txns = append(txns, makeTransaction(t)) + } + + txnHashes := make([]cipher.SHA256, len(txns)) + for i, x := range txns { + txnHashes[i] = x.Hash() + } + + testCases := []struct { + name string + hash cipher.SHA256 + expect *Transaction + }{ + { + name: "get first", + hash: txnHashes[0], + expect: &txns[0], + }, + { + name: "get second", + hash: txnHashes[1], + expect: &txns[1], + }, + { + name: "not exist", + hash: txnHashes[2], + expect: nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + + txsBkt := &transactions{} + + // init the bkt + err := db.Update("", func(tx *dbutil.Tx) error { + for _, txn := range txns[:2] { + err := txsBkt.put(tx, &txn) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + // get slice + err = db.View("", func(tx *dbutil.Tx) error { + ts, err := txsBkt.get(tx, tc.hash) + require.NoError(t, err) + require.Equal(t, tc.expect, ts) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestTransactionGetArray(t *testing.T) { + txns := make([]Transaction, 0, 4) + for i := 0; i < 4; i++ { + txns = append(txns, makeTransaction(t)) + } + + txnHashes := make([]cipher.SHA256, len(txns)) + for i, x := range txns { + txnHashes[i] = x.Hash() + } + + testCases := []struct { + name string + hashes []cipher.SHA256 + expect []Transaction + err error + }{ + { + name: "get one", + hashes: []cipher.SHA256{ + txnHashes[0], + }, + expect: txns[:1], + }, + + { + name: "get two", + hashes: []cipher.SHA256{ + txnHashes[0], + txnHashes[1], + }, + expect: txns[:2], + }, + + { + name: "get all", + hashes: []cipher.SHA256{ + txnHashes[0], + txnHashes[1], + txnHashes[2], + }, + expect: txns[:3], + }, + + { + name: "not exist", + hashes: []cipher.SHA256{ + txnHashes[3], + }, + err: errors.New("Transaction not found"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + txsBkt := &transactions{} + + // init the bkt + err := db.Update("", func(tx *dbutil.Tx) error { + for _, txn := range txns[:3] { + err := txsBkt.put(tx, &txn) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + // get slice + err = db.View("", func(tx *dbutil.Tx) error { + ts, err := txsBkt.getArray(tx, tc.hashes) + if tc.err != nil { + require.Equal(t, tc.err, err) + return nil + } + require.NoError(t, err) + require.Equal(t, tc.expect, ts) + return nil + }) + require.NoError(t, err) + }) + } +} + +func makeTransaction(t *testing.T) Transaction { + txn := Transaction{} + ux, s := makeUxOutWithSecret(t) + + err := txn.Txn.PushInput(ux.Hash()) + require.NoError(t, err) + err = txn.Txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.Txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + txn.Txn.SignInputs([]cipher.SecKey{s}) + err = txn.Txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder.go new file mode 100644 index 00000000..eae70069 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder.go @@ -0,0 +1,198 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeUxOut computes the size of an encoded object of type UxOut +func encodeSizeUxOut(obj *UxOut) uint64 { + i0 := uint64(0) + + // obj.Out.Head.Time + i0 += 8 + + // obj.Out.Head.BkSeq + i0 += 8 + + // obj.Out.Body.SrcTransaction + i0 += 32 + + // obj.Out.Body.Address.Version + i0++ + + // obj.Out.Body.Address.Key + i0 += 20 + + // obj.Out.Body.Coins + i0 += 8 + + // obj.Out.Body.Hours + i0 += 8 + + // obj.SpentTxnID + i0 += 32 + + // obj.SpentBlockSeq + i0 += 8 + + return i0 +} + +// encodeUxOut encodes an object of type UxOut to a buffer allocated to the exact size +// required to encode the object. +func encodeUxOut(obj *UxOut) ([]byte, error) { + n := encodeSizeUxOut(obj) + buf := make([]byte, n) + + if err := encodeUxOutToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxOutToBuffer encodes an object of type UxOut to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxOutToBuffer(buf []byte, obj *UxOut) error { + if uint64(len(buf)) < encodeSizeUxOut(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Out.Head.Time + e.Uint64(obj.Out.Head.Time) + + // obj.Out.Head.BkSeq + e.Uint64(obj.Out.Head.BkSeq) + + // obj.Out.Body.SrcTransaction + e.CopyBytes(obj.Out.Body.SrcTransaction[:]) + + // obj.Out.Body.Address.Version + e.Uint8(obj.Out.Body.Address.Version) + + // obj.Out.Body.Address.Key + e.CopyBytes(obj.Out.Body.Address.Key[:]) + + // obj.Out.Body.Coins + e.Uint64(obj.Out.Body.Coins) + + // obj.Out.Body.Hours + e.Uint64(obj.Out.Body.Hours) + + // obj.SpentTxnID + e.CopyBytes(obj.SpentTxnID[:]) + + // obj.SpentBlockSeq + e.Uint64(obj.SpentBlockSeq) + + return nil +} + +// decodeUxOut decodes an object of type UxOut from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxOut(buf []byte, obj *UxOut) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Out.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Head.Time = i + } + + { + // obj.Out.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Head.BkSeq = i + } + + { + // obj.Out.Body.SrcTransaction + if len(d.Buffer) < len(obj.Out.Body.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out.Body.SrcTransaction[:], d.Buffer[:len(obj.Out.Body.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.Out.Body.SrcTransaction):] + } + + { + // obj.Out.Body.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out.Body.Address.Version = i + } + + { + // obj.Out.Body.Address.Key + if len(d.Buffer) < len(obj.Out.Body.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out.Body.Address.Key[:], d.Buffer[:len(obj.Out.Body.Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out.Body.Address.Key):] + } + + { + // obj.Out.Body.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Body.Coins = i + } + + { + // obj.Out.Body.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Body.Hours = i + } + + { + // obj.SpentTxnID + if len(d.Buffer) < len(obj.SpentTxnID) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.SpentTxnID[:], d.Buffer[:len(obj.SpentTxnID)]) + d.Buffer = d.Buffer[len(obj.SpentTxnID):] + } + + { + // obj.SpentBlockSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.SpentBlockSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxOutExact decodes an object of type UxOut from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxOutExact(buf []byte, obj *UxOut) error { + if n, err := decodeUxOut(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder_test.go new file mode 100644 index 00000000..08212b90 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUxOutForEncodeTest() *UxOut { + var obj UxOut + return &obj +} + +func newRandomUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxOut { + var obj UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxOut { + var obj UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxOut { + var obj UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxOut(t *testing.T, obj *UxOut) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxOut(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxOut() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxOut(obj) + if err != nil { + t.Fatalf("encodeUxOut failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxOut produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxOut()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxOutToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxOutToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UxOut + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UxOut + if n, err := decodeUxOut(data2, &obj3); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // Decode, excess buffer + var obj4 UxOut + n, err := decodeUxOut(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // DecodeExact + var obj5 UxOut + if err := decodeUxOutExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxOut(data4, &obj3); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxOut(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UxOut + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxOutForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxOutForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxOutForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxOutForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxOut(t, tc.obj) + }) + } +} + +func decodeUxOutExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxOut + if _, err := decodeUxOut(buf, &obj); err == nil { + t.Fatal("decodeUxOut: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxOut: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxOutExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxOut + if err := decodeUxOutExact(buf, &obj); err == nil { + t.Fatal("decodeUxOutExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxOutExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxOutDecodeErrors(t *testing.T, k int, tag string, obj *UxOut) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxOut(obj) + buf, err := encodeUxOut(obj) + if err != nil { + t.Fatalf("encodeUxOut failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxOutExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxOutExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxOutExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxOutExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxOutExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxOutDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxOutForEncodeTest() + fullObj := newRandomUxOutForEncodeTest(t, rand) + testSkyencoderUxOutDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxOutDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/verify.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/verify.go new file mode 100644 index 00000000..04f81a59 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/verify.go @@ -0,0 +1,129 @@ +package historydb + +import ( + "errors" + "reflect" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +// VerifyDBSkyencoderSafe verifies that the skyencoder generated code has the same result as the encoder +// for all data in the blockchain +func VerifyDBSkyencoderSafe(tx *dbutil.Tx, quit <-chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + if err := dbutil.ForEach(tx, AddressTxnsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashesWrapper + if err := decodeHashesWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []cipher.SHA256 + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.Hashes, b2) { + return errors.New("AddressTxnsBkt sha256 hashes mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, AddressUxBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashesWrapper + if err := decodeHashesWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []cipher.SHA256 + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.Hashes, b2) { + return errors.New("AddressUxBkt sha256 hashes mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UxOutsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 UxOut + if err := decodeUxOutExact(v, &b1); err != nil { + return err + } + + var b2 UxOut + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("UxOutsBkt ux out mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, TransactionsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 Transaction + if err := decodeTransactionExact(v, &b1); err != nil { + return err + } + + var b2 Transaction + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("TransactionsBkt ux out mismatch") + } + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/interfaces.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/interfaces.go new file mode 100644 index 00000000..8db4dbd5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/interfaces.go @@ -0,0 +1,71 @@ +package visor + +import ( + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +//go:generate mockery -name Historyer -case underscore -inpkg -testonly +//go:generate mockery -name Blockchainer -case underscore -inpkg -testonly +//go:generate mockery -name UnconfirmedTransactionPooler -case underscore -inpkg -testonly + +// Historyer is the interface that provides methods for accessing history data that are parsed from blockchain. +type Historyer interface { + GetUxOuts(tx *dbutil.Tx, uxids []cipher.SHA256) ([]historydb.UxOut, error) + ParseBlock(tx *dbutil.Tx, b coin.Block) error + GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*historydb.Transaction, error) + GetOutputsForAddress(tx *dbutil.Tx, address cipher.Address) ([]historydb.UxOut, error) + GetTransactionsForAddress(tx *dbutil.Tx, address cipher.Address) ([]historydb.Transaction, error) + AddressSeen(tx *dbutil.Tx, address cipher.Address) (bool, error) + NeedsReset(tx *dbutil.Tx) (bool, error) + Erase(tx *dbutil.Tx) error + ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) + ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error +} + +// Blockchainer is the interface that provides methods for accessing the blockchain data +type Blockchainer interface { + GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) + GetBlocks(tx *dbutil.Tx, seqs []uint64) ([]coin.SignedBlock, error) + GetBlocksInRange(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) + GetLastBlocks(tx *dbutil.Tx, n uint64) ([]coin.SignedBlock, error) + GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) + Unspent() blockdb.UnspentPooler + Len(tx *dbutil.Tx) (uint64, error) + Head(tx *dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(tx *dbutil.Tx) (uint64, bool, error) + Time(tx *dbutil.Tx) (uint64, error) + NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) + ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error + VerifyBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error + VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error + VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, signed TxnSignedFlag) error + VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn, signed TxnSignedFlag) (*coin.SignedBlock, coin.UxArray, error) + TransactionFee(tx *dbutil.Tx, hours uint64) coin.FeeCalculator +} + +// UnconfirmedTransactionPooler is the interface that provides methods for +// accessing the unconfirmed transaction pool +type UnconfirmedTransactionPooler interface { + SetTransactionsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error + InjectTransaction(tx *dbutil.Tx, bc Blockchainer, t coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn) (bool, *ErrTxnViolatesSoftConstraint, error) + AllRawTransactions(tx *dbutil.Tx) (coin.Transactions, error) + RemoveTransactions(tx *dbutil.Tx, txns []cipher.SHA256) error + Refresh(tx *dbutil.Tx, bc Blockchainer, distParams params.Distribution, verifyParams params.VerifyTxn) ([]cipher.SHA256, error) + RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) + FilterKnown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) + GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) + RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) + GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) + Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) + GetFiltered(tx *dbutil.Tx, filter func(tx UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) + GetHashes(tx *dbutil.Tx, filter func(tx UnconfirmedTransaction) bool) ([]cipher.SHA256, error) + ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTransaction) error) error + GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) + Len(tx *dbutil.Tx) (uint64, error) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/meta.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/meta.go new file mode 100644 index 00000000..7beea7d9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/meta.go @@ -0,0 +1,71 @@ +package visor + +import ( + "fmt" + + "github.com/blang/semver" + + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // MetaBkt stores data about the application DB + MetaBkt = []byte("db_meta") + + versionKey = []byte("version") +) + +// GetDBVersion returns the saved DB version +func GetDBVersion(db *dbutil.DB) (*semver.Version, error) { + var v *semver.Version + if err := db.View("GetDBVersion", func(tx *dbutil.Tx) error { + var err error + v, err = getDBVersion(tx) + return err + }); err != nil { + return nil, err + } + + return v, nil +} + +func getDBVersion(tx *dbutil.Tx) (*semver.Version, error) { + v, err := dbutil.GetBucketValue(tx, MetaBkt, versionKey) + if err != nil { + switch err.(type) { + case dbutil.ErrBucketNotExist: + return nil, nil + default: + return nil, err + } + } else if v == nil { + return nil, nil + } + + sv, err := semver.Make(string(v)) + if err != nil { + return nil, err + } + + return &sv, nil +} + +// SetDBVersion sets the DB version +func SetDBVersion(db *dbutil.DB, version semver.Version) error { + return db.Update("SetDBVersion", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(MetaBkt); err != nil { + return err + } + + oldVersion, err := getDBVersion(tx) + if err != nil { + return err + } + + if oldVersion != nil && oldVersion.GT(version) { + return fmt.Errorf("SetDBVersion cannot regress version from %v to %v", oldVersion, version) + } + + return dbutil.PutBucketValue(tx, MetaBkt, versionKey, []byte(version.String())) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/meta_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/meta_test.go new file mode 100644 index 00000000..8851aa1e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/meta_test.go @@ -0,0 +1,45 @@ +package visor + +import ( + "testing" + + "github.com/blang/semver" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestGetSetDBVersion(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + // No version yet + v, err := GetDBVersion(db) + require.NoError(t, err) + require.Nil(t, v) + + // Bucket exists, but still no version + v, err = GetDBVersion(db) + require.NoError(t, err) + require.Nil(t, v) + + // Set the version + x := semver.MustParse("0.25.0") + err = SetDBVersion(db, x) + require.NoError(t, err) + + // Get the version + v, err = GetDBVersion(db) + require.NoError(t, err) + require.NotNil(t, v) + require.True(t, x.EQ(*v)) + require.Equal(t, "0.25.0", v.String()) + + // Set to a new version succeeds + err = SetDBVersion(db, semver.MustParse("0.26.0")) + require.NoError(t, err) + + // Set to an older version fails + err = SetDBVersion(db, x) + testutil.RequireError(t, err, "SetDBVersion cannot regress version from 0.26.0 to 0.25.0") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_blockchainer_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_blockchainer_test.go new file mode 100644 index 00000000..3fb4fe1a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_blockchainer_test.go @@ -0,0 +1,389 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package visor + +import blockdb "github.com/SkycoinProject/skycoin/src/visor/blockdb" +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import dbutil "github.com/SkycoinProject/skycoin/src/visor/dbutil" +import mock "github.com/stretchr/testify/mock" +import params "github.com/SkycoinProject/skycoin/src/params" + +// MockBlockchainer is an autogenerated mock type for the Blockchainer type +type MockBlockchainer struct { + mock.Mock +} + +// ExecuteBlock provides a mock function with given fields: tx, sb +func (_m *MockBlockchainer) ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + ret := _m.Called(tx, sb) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, *coin.SignedBlock) error); ok { + r0 = rf(tx, sb) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetBlocks provides a mock function with given fields: tx, seqs +func (_m *MockBlockchainer) GetBlocks(tx *dbutil.Tx, seqs []uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(tx, seqs) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []uint64) []coin.SignedBlock); ok { + r0 = rf(tx, seqs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []uint64) error); ok { + r1 = rf(tx, seqs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlocksInRange provides a mock function with given fields: tx, start, end +func (_m *MockBlockchainer) GetBlocksInRange(tx *dbutil.Tx, start uint64, end uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(tx, start, end) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64, uint64) []coin.SignedBlock); ok { + r0 = rf(tx, start, end) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, uint64, uint64) error); ok { + r1 = rf(tx, start, end) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetGenesisBlock provides a mock function with given fields: tx +func (_m *MockBlockchainer) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + ret := _m.Called(tx) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx) *coin.SignedBlock); ok { + r0 = rf(tx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBlocks provides a mock function with given fields: tx, n +func (_m *MockBlockchainer) GetLastBlocks(tx *dbutil.Tx, n uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(tx, n) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64) []coin.SignedBlock); ok { + r0 = rf(tx, n) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, uint64) error); ok { + r1 = rf(tx, n) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockByHash provides a mock function with given fields: tx, hash +func (_m *MockBlockchainer) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + ret := _m.Called(tx, hash) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) *coin.SignedBlock); ok { + r0 = rf(tx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(tx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockBySeq provides a mock function with given fields: tx, seq +func (_m *MockBlockchainer) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + ret := _m.Called(tx, seq) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64) *coin.SignedBlock); ok { + r0 = rf(tx, seq) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, uint64) error); ok { + r1 = rf(tx, seq) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Head provides a mock function with given fields: tx +func (_m *MockBlockchainer) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + ret := _m.Called(tx) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx) *coin.SignedBlock); ok { + r0 = rf(tx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// HeadSeq provides a mock function with given fields: tx +func (_m *MockBlockchainer) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 bool + if rf, ok := ret.Get(1).(func(*dbutil.Tx) bool); ok { + r1 = rf(tx) + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func(*dbutil.Tx) error); ok { + r2 = rf(tx) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// Len provides a mock function with given fields: tx +func (_m *MockBlockchainer) Len(tx *dbutil.Tx) (uint64, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewBlock provides a mock function with given fields: tx, txns, currentTime +func (_m *MockBlockchainer) NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) { + ret := _m.Called(tx, txns, currentTime) + + var r0 *coin.Block + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Transactions, uint64) *coin.Block); ok { + r0 = rf(tx, txns, currentTime) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Block) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, coin.Transactions, uint64) error); ok { + r1 = rf(tx, txns, currentTime) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Time provides a mock function with given fields: tx +func (_m *MockBlockchainer) Time(tx *dbutil.Tx) (uint64, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionFee provides a mock function with given fields: tx, hours +func (_m *MockBlockchainer) TransactionFee(tx *dbutil.Tx, hours uint64) coin.FeeCalculator { + ret := _m.Called(tx, hours) + + var r0 coin.FeeCalculator + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64) coin.FeeCalculator); ok { + r0 = rf(tx, hours) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.FeeCalculator) + } + } + + return r0 +} + +// Unspent provides a mock function with given fields: +func (_m *MockBlockchainer) Unspent() blockdb.UnspentPooler { + ret := _m.Called() + + var r0 blockdb.UnspentPooler + if rf, ok := ret.Get(0).(func() blockdb.UnspentPooler); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(blockdb.UnspentPooler) + } + } + + return r0 +} + +// VerifyBlock provides a mock function with given fields: tx, sb +func (_m *MockBlockchainer) VerifyBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + ret := _m.Called(tx, sb) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, *coin.SignedBlock) error); ok { + r0 = rf(tx, sb) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// VerifyBlockTxnConstraints provides a mock function with given fields: tx, txn +func (_m *MockBlockchainer) VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error { + ret := _m.Called(tx, txn) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Transaction) error); ok { + r0 = rf(tx, txn) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// VerifySingleTxnHardConstraints provides a mock function with given fields: tx, txn, signed +func (_m *MockBlockchainer) VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, signed TxnSignedFlag) error { + ret := _m.Called(tx, txn, signed) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Transaction, TxnSignedFlag) error); ok { + r0 = rf(tx, txn, signed) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// VerifySingleTxnSoftHardConstraints provides a mock function with given fields: tx, txn, distParams, verifyParams, signed +func (_m *MockBlockchainer) VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn, signed TxnSignedFlag) (*coin.SignedBlock, coin.UxArray, error) { + ret := _m.Called(tx, txn, distParams, verifyParams, signed) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Transaction, params.Distribution, params.VerifyTxn, TxnSignedFlag) *coin.SignedBlock); ok { + r0 = rf(tx, txn, distParams, verifyParams, signed) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 coin.UxArray + if rf, ok := ret.Get(1).(func(*dbutil.Tx, coin.Transaction, params.Distribution, params.VerifyTxn, TxnSignedFlag) coin.UxArray); ok { + r1 = rf(tx, txn, distParams, verifyParams, signed) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(coin.UxArray) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(*dbutil.Tx, coin.Transaction, params.Distribution, params.VerifyTxn, TxnSignedFlag) error); ok { + r2 = rf(tx, txn, distParams, verifyParams, signed) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_historyer_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_historyer_test.go new file mode 100644 index 00000000..a664a2f4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_historyer_test.go @@ -0,0 +1,218 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package visor + +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import dbutil "github.com/SkycoinProject/skycoin/src/visor/dbutil" +import historydb "github.com/SkycoinProject/skycoin/src/visor/historydb" +import mock "github.com/stretchr/testify/mock" + +// MockHistoryer is an autogenerated mock type for the Historyer type +type MockHistoryer struct { + mock.Mock +} + +// AddressSeen provides a mock function with given fields: tx, address +func (_m *MockHistoryer) AddressSeen(tx *dbutil.Tx, address cipher.Address) (bool, error) { + ret := _m.Called(tx, address) + + var r0 bool + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.Address) bool); ok { + r0 = rf(tx, address) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.Address) error); ok { + r1 = rf(tx, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Erase provides a mock function with given fields: tx +func (_m *MockHistoryer) Erase(tx *dbutil.Tx) error { + ret := _m.Called(tx) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx) error); ok { + r0 = rf(tx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ForEachTxn provides a mock function with given fields: tx, f +func (_m *MockHistoryer) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error { + ret := _m.Called(tx, f) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, func(cipher.SHA256, *historydb.Transaction) error) error); ok { + r0 = rf(tx, f) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetOutputsForAddress provides a mock function with given fields: tx, address +func (_m *MockHistoryer) GetOutputsForAddress(tx *dbutil.Tx, address cipher.Address) ([]historydb.UxOut, error) { + ret := _m.Called(tx, address) + + var r0 []historydb.UxOut + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.Address) []historydb.UxOut); ok { + r0 = rf(tx, address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]historydb.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.Address) error); ok { + r1 = rf(tx, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransaction provides a mock function with given fields: tx, hash +func (_m *MockHistoryer) GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*historydb.Transaction, error) { + ret := _m.Called(tx, hash) + + var r0 *historydb.Transaction + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) *historydb.Transaction); ok { + r0 = rf(tx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*historydb.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(tx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransactionsForAddress provides a mock function with given fields: tx, address +func (_m *MockHistoryer) GetTransactionsForAddress(tx *dbutil.Tx, address cipher.Address) ([]historydb.Transaction, error) { + ret := _m.Called(tx, address) + + var r0 []historydb.Transaction + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.Address) []historydb.Transaction); ok { + r0 = rf(tx, address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]historydb.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.Address) error); ok { + r1 = rf(tx, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUxOuts provides a mock function with given fields: tx, uxids +func (_m *MockHistoryer) GetUxOuts(tx *dbutil.Tx, uxids []cipher.SHA256) ([]historydb.UxOut, error) { + ret := _m.Called(tx, uxids) + + var r0 []historydb.UxOut + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) []historydb.UxOut); ok { + r0 = rf(tx, uxids) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]historydb.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r1 = rf(tx, uxids) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NeedsReset provides a mock function with given fields: tx +func (_m *MockHistoryer) NeedsReset(tx *dbutil.Tx) (bool, error) { + ret := _m.Called(tx) + + var r0 bool + if rf, ok := ret.Get(0).(func(*dbutil.Tx) bool); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ParseBlock provides a mock function with given fields: tx, b +func (_m *MockHistoryer) ParseBlock(tx *dbutil.Tx, b coin.Block) error { + ret := _m.Called(tx, b) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Block) error); ok { + r0 = rf(tx, b) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ParsedBlockSeq provides a mock function with given fields: tx +func (_m *MockHistoryer) ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 bool + if rf, ok := ret.Get(1).(func(*dbutil.Tx) bool); ok { + r1 = rf(tx) + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func(*dbutil.Tx) error); ok { + r2 = rf(tx) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unconfirmed_transaction_pooler_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unconfirmed_transaction_pooler_test.go new file mode 100644 index 00000000..7f610ea6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unconfirmed_transaction_pooler_test.go @@ -0,0 +1,360 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package visor + +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import dbutil "github.com/SkycoinProject/skycoin/src/visor/dbutil" +import mock "github.com/stretchr/testify/mock" +import params "github.com/SkycoinProject/skycoin/src/params" + +// MockUnconfirmedTransactionPooler is an autogenerated mock type for the UnconfirmedTransactionPooler type +type MockUnconfirmedTransactionPooler struct { + mock.Mock +} + +// AllRawTransactions provides a mock function with given fields: tx +func (_m *MockUnconfirmedTransactionPooler) AllRawTransactions(tx *dbutil.Tx) (coin.Transactions, error) { + ret := _m.Called(tx) + + var r0 coin.Transactions + if rf, ok := ret.Get(0).(func(*dbutil.Tx) coin.Transactions); ok { + r0 = rf(tx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.Transactions) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FilterKnown provides a mock function with given fields: tx, txns +func (_m *MockUnconfirmedTransactionPooler) FilterKnown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) { + ret := _m.Called(tx, txns) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) []cipher.SHA256); ok { + r0 = rf(tx, txns) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r1 = rf(tx, txns) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ForEach provides a mock function with given fields: tx, f +func (_m *MockUnconfirmedTransactionPooler) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTransaction) error) error { + ret := _m.Called(tx, f) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, func(cipher.SHA256, UnconfirmedTransaction) error) error); ok { + r0 = rf(tx, f) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Get provides a mock function with given fields: tx, hash +func (_m *MockUnconfirmedTransactionPooler) Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) { + ret := _m.Called(tx, hash) + + var r0 *UnconfirmedTransaction + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) *UnconfirmedTransaction); ok { + r0 = rf(tx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*UnconfirmedTransaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(tx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetFiltered provides a mock function with given fields: tx, filter +func (_m *MockUnconfirmedTransactionPooler) GetFiltered(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + ret := _m.Called(tx, filter) + + var r0 []UnconfirmedTransaction + if rf, ok := ret.Get(0).(func(*dbutil.Tx, func(UnconfirmedTransaction) bool) []UnconfirmedTransaction); ok { + r0 = rf(tx, filter) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]UnconfirmedTransaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, func(UnconfirmedTransaction) bool) error); ok { + r1 = rf(tx, filter) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetHashes provides a mock function with given fields: tx, filter +func (_m *MockUnconfirmedTransactionPooler) GetHashes(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]cipher.SHA256, error) { + ret := _m.Called(tx, filter) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx, func(UnconfirmedTransaction) bool) []cipher.SHA256); ok { + r0 = rf(tx, filter) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, func(UnconfirmedTransaction) bool) error); ok { + r1 = rf(tx, filter) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetIncomingOutputs provides a mock function with given fields: tx, bh +func (_m *MockUnconfirmedTransactionPooler) GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) { + ret := _m.Called(tx, bh) + + var r0 coin.UxArray + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.BlockHeader) coin.UxArray); ok { + r0 = rf(tx, bh) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.UxArray) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, coin.BlockHeader) error); ok { + r1 = rf(tx, bh) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetKnown provides a mock function with given fields: tx, txns +func (_m *MockUnconfirmedTransactionPooler) GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) { + ret := _m.Called(tx, txns) + + var r0 coin.Transactions + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) coin.Transactions); ok { + r0 = rf(tx, txns) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.Transactions) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r1 = rf(tx, txns) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUnspentsOfAddr provides a mock function with given fields: tx, addr +func (_m *MockUnconfirmedTransactionPooler) GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) { + ret := _m.Called(tx, addr) + + var r0 coin.UxArray + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.Address) coin.UxArray); ok { + r0 = rf(tx, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.UxArray) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.Address) error); ok { + r1 = rf(tx, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InjectTransaction provides a mock function with given fields: tx, bc, t, distParams, verifyParams +func (_m *MockUnconfirmedTransactionPooler) InjectTransaction(tx *dbutil.Tx, bc Blockchainer, t coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn) (bool, *ErrTxnViolatesSoftConstraint, error) { + ret := _m.Called(tx, bc, t, distParams, verifyParams) + + var r0 bool + if rf, ok := ret.Get(0).(func(*dbutil.Tx, Blockchainer, coin.Transaction, params.Distribution, params.VerifyTxn) bool); ok { + r0 = rf(tx, bc, t, distParams, verifyParams) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 *ErrTxnViolatesSoftConstraint + if rf, ok := ret.Get(1).(func(*dbutil.Tx, Blockchainer, coin.Transaction, params.Distribution, params.VerifyTxn) *ErrTxnViolatesSoftConstraint); ok { + r1 = rf(tx, bc, t, distParams, verifyParams) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*ErrTxnViolatesSoftConstraint) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(*dbutil.Tx, Blockchainer, coin.Transaction, params.Distribution, params.VerifyTxn) error); ok { + r2 = rf(tx, bc, t, distParams, verifyParams) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// Len provides a mock function with given fields: tx +func (_m *MockUnconfirmedTransactionPooler) Len(tx *dbutil.Tx) (uint64, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RecvOfAddresses provides a mock function with given fields: tx, bh, addrs +func (_m *MockUnconfirmedTransactionPooler) RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) { + ret := _m.Called(tx, bh, addrs) + + var r0 coin.AddressUxOuts + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.BlockHeader, []cipher.Address) coin.AddressUxOuts); ok { + r0 = rf(tx, bh, addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.AddressUxOuts) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, coin.BlockHeader, []cipher.Address) error); ok { + r1 = rf(tx, bh, addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Refresh provides a mock function with given fields: tx, bc, distParams, verifyParams +func (_m *MockUnconfirmedTransactionPooler) Refresh(tx *dbutil.Tx, bc Blockchainer, distParams params.Distribution, verifyParams params.VerifyTxn) ([]cipher.SHA256, error) { + ret := _m.Called(tx, bc, distParams, verifyParams) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx, Blockchainer, params.Distribution, params.VerifyTxn) []cipher.SHA256); ok { + r0 = rf(tx, bc, distParams, verifyParams) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, Blockchainer, params.Distribution, params.VerifyTxn) error); ok { + r1 = rf(tx, bc, distParams, verifyParams) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RemoveInvalid provides a mock function with given fields: tx, bc +func (_m *MockUnconfirmedTransactionPooler) RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) { + ret := _m.Called(tx, bc) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx, Blockchainer) []cipher.SHA256); ok { + r0 = rf(tx, bc) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, Blockchainer) error); ok { + r1 = rf(tx, bc) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RemoveTransactions provides a mock function with given fields: tx, txns +func (_m *MockUnconfirmedTransactionPooler) RemoveTransactions(tx *dbutil.Tx, txns []cipher.SHA256) error { + ret := _m.Called(tx, txns) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r0 = rf(tx, txns) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetTransactionsAnnounced provides a mock function with given fields: tx, hashes +func (_m *MockUnconfirmedTransactionPooler) SetTransactionsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error { + ret := _m.Called(tx, hashes) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, map[cipher.SHA256]int64) error); ok { + r0 = rf(tx, hashes) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unspent_pooler_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unspent_pooler_test.go new file mode 100644 index 00000000..c136123c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unspent_pooler_test.go @@ -0,0 +1,247 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package visor + +import ( + cipher "github.com/SkycoinProject/skycoin/src/cipher" + coin "github.com/SkycoinProject/skycoin/src/coin" + + mock "github.com/stretchr/testify/mock" + + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + dbutil "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +// MockUnspentPooler is an autogenerated mock type for the UnspentPooler type +type MockUnspentPooler struct { + mock.Mock +} + +// AddressCount provides a mock function with given fields: _a0 +func (_m *MockUnspentPooler) AddressCount(_a0 *dbutil.Tx) (uint64, error) { + ret := _m.Called(_a0) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Contains provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) Contains(_a0 *dbutil.Tx, _a1 cipher.SHA256) (bool, error) { + ret := _m.Called(_a0, _a1) + + var r0 bool + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) bool); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Get provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) Get(_a0 *dbutil.Tx, _a1 cipher.SHA256) (*coin.UxOut, error) { + ret := _m.Called(_a0, _a1) + + var r0 *coin.UxOut + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) *coin.UxOut); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetAll provides a mock function with given fields: _a0 +func (_m *MockUnspentPooler) GetAll(_a0 *dbutil.Tx) (coin.UxArray, error) { + ret := _m.Called(_a0) + + var r0 coin.UxArray + if rf, ok := ret.Get(0).(func(*dbutil.Tx) coin.UxArray); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.UxArray) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetArray provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) GetArray(_a0 *dbutil.Tx, _a1 []cipher.SHA256) (coin.UxArray, error) { + ret := _m.Called(_a0, _a1) + + var r0 coin.UxArray + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) coin.UxArray); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.UxArray) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUnspentHashesOfAddrs provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) GetUnspentHashesOfAddrs(_a0 *dbutil.Tx, _a1 []cipher.Address) (blockdb.AddressHashes, error) { + ret := _m.Called(_a0, _a1) + + var r0 blockdb.AddressHashes + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.Address) blockdb.AddressHashes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(blockdb.AddressHashes) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.Address) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUnspentsOfAddrs provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) GetUnspentsOfAddrs(_a0 *dbutil.Tx, _a1 []cipher.Address) (coin.AddressUxOuts, error) { + ret := _m.Called(_a0, _a1) + + var r0 coin.AddressUxOuts + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.Address) coin.AddressUxOuts); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.AddressUxOuts) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.Address) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUxHash provides a mock function with given fields: _a0 +func (_m *MockUnspentPooler) GetUxHash(_a0 *dbutil.Tx) (cipher.SHA256, error) { + ret := _m.Called(_a0) + + var r0 cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) cipher.SHA256); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Len provides a mock function with given fields: _a0 +func (_m *MockUnspentPooler) Len(_a0 *dbutil.Tx) (uint64, error) { + ret := _m.Called(_a0) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MaybeBuildIndexes provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) MaybeBuildIndexes(_a0 *dbutil.Tx, _a1 uint64) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ProcessBlock provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) ProcessBlock(_a0 *dbutil.Tx, _a1 *coin.SignedBlock) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, *coin.SignedBlock) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/objects.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/objects.go new file mode 100644 index 00000000..2bf1341e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/objects.go @@ -0,0 +1,213 @@ +package visor + +import ( + "time" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/transaction" +) + +// Transaction wraps around coin.Transaction, tagged with its status. This allows us +// to include unconfirmed txns +type Transaction struct { + Transaction coin.Transaction + Status TransactionStatus + Time uint64 +} + +// TransactionStatus represents the transaction status +type TransactionStatus struct { + Confirmed bool + // If confirmed, how many blocks deep in the chain it is. Will be at least 1 if confirmed. + Height uint64 + // If confirmed, the sequence of the block in which the transaction was executed + BlockSeq uint64 +} + +// NewUnconfirmedTransactionStatus creates unconfirmed transaction status +func NewUnconfirmedTransactionStatus() TransactionStatus { + return TransactionStatus{ + Confirmed: false, + Height: 0, + BlockSeq: 0, + } +} + +// NewConfirmedTransactionStatus creates confirmed transaction status +func NewConfirmedTransactionStatus(height, blockSeq uint64) TransactionStatus { + // Height starts at 1 + // TODO -- height should start at 0? + if height == 0 { + logger.Panic("Invalid confirmed transaction height") + } + return TransactionStatus{ + Confirmed: true, + Height: height, + BlockSeq: blockSeq, + } +} + +// TransactionInput includes the UxOut spent in a transaction and the calculated hours of the output at spending time +type TransactionInput struct { + UxOut coin.UxOut + CalculatedHours uint64 +} + +// NewTransactionInput creates a TransactionInput. +// calculateHoursTime is the time against which the CalculatedHours should be computed +func NewTransactionInput(ux coin.UxOut, calculateHoursTime uint64) (TransactionInput, error) { + // The overflow bug causes this to fail for some transactions, allow it to pass + calculatedHours, err := ux.CoinHours(calculateHoursTime) + if err != nil { + logger.Critical().Warningf("Ignoring NewTransactionInput ux.CoinHours failed: %v", err) + calculatedHours = 0 + } + + return TransactionInput{ + UxOut: ux, + CalculatedHours: calculatedHours, + }, nil +} + +// NewTransactionInputs creates []TransactionInput from []coin.UxOut. +// Assumes all coin.UxOuts have their coin hours calculated from the same reference time. +func NewTransactionInputs(uxa []coin.UxOut, calculateHoursTime uint64) ([]TransactionInput, error) { + if len(uxa) == 0 { + return nil, nil + } + + inputs := make([]TransactionInput, len(uxa)) + for i, x := range uxa { + var err error + inputs[i], err = NewTransactionInput(x, calculateHoursTime) + if err != nil { + return nil, err + } + } + + return inputs, nil +} + +// TransactionInputFromUxBalance converts transaction.UxBalance to TransactionInput +func TransactionInputFromUxBalance(x transaction.UxBalance) TransactionInput { + var t TransactionInput + t.CalculatedHours = x.Hours + t.UxOut.Head.BkSeq = x.BkSeq + t.UxOut.Head.Time = x.Time + t.UxOut.Body.Address = x.Address + t.UxOut.Body.Coins = x.Coins + t.UxOut.Body.Hours = x.InitialHours + t.UxOut.Body.SrcTransaction = x.SrcTransaction + + if t.UxOut.Hash() != x.Hash { + logger.Panic("Reconstructed coin.UxOut from transaction.UxBalance hash does not match") + } + + return t +} + +// NewTransactionInputsFromUxBalance converts []transaction.UxBalance to []TransactionInput +func NewTransactionInputsFromUxBalance(uxb []transaction.UxBalance) []TransactionInput { + if len(uxb) == 0 { + return nil + } + + inputs := make([]TransactionInput, len(uxb)) + for i, x := range uxb { + inputs[i] = TransactionInputFromUxBalance(x) + } + + return inputs +} + +// BlockchainMetadata encapsulates useful information from the coin.Blockchain +type BlockchainMetadata struct { + // Most recent block + HeadBlock coin.SignedBlock + // Number of unspent outputs in the coin.Blockchain + Unspents uint64 + // Number of known unconfirmed txns + Unconfirmed uint64 +} + +// NewBlockchainMetadata creates blockchain meta data +func NewBlockchainMetadata(head coin.SignedBlock, unconfirmedLen, unspentsLen uint64) (*BlockchainMetadata, error) { + return &BlockchainMetadata{ + HeadBlock: head, + Unspents: unspentsLen, + Unconfirmed: unconfirmedLen, + }, nil +} + +// UnconfirmedTransaction unconfirmed transaction +type UnconfirmedTransaction struct { + Transaction coin.Transaction + // Time the txn was last received + Received int64 + // Time the txn was last checked against the blockchain + Checked int64 + // Last time we announced this txn + Announced int64 + // If this txn is valid + IsValid int8 +} + +// NewUnconfirmedTransaction creates an UnconfirmedTransaction +func NewUnconfirmedTransaction(txn coin.Transaction) UnconfirmedTransaction { + now := time.Now().UTC() + return UnconfirmedTransaction{ + Transaction: txn, + Received: now.UnixNano(), + Checked: now.UnixNano(), + Announced: time.Time{}.UnixNano(), + IsValid: 0, + } +} + +// UnspentOutput includes coin.UxOut and adds CalculatedHours +type UnspentOutput struct { + coin.UxOut + CalculatedHours uint64 +} + +// NewUnspentOutput creates an UnspentOutput +func NewUnspentOutput(uxOut coin.UxOut, calculateHoursTime uint64) (UnspentOutput, error) { + calculatedHours, err := uxOut.CoinHours(calculateHoursTime) + + // Treat overflowing coin hours calculations as a non-error and force hours to 0 + // This affects one bad spent output which had overflowed hours, spent in block 13277. + switch err { + case nil: + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + calculatedHours = 0 + default: + return UnspentOutput{}, err + } + + return UnspentOutput{ + UxOut: uxOut, + CalculatedHours: calculatedHours, + }, nil +} + +// NewUnspentOutputs creates []UnspentOutput +func NewUnspentOutputs(uxOuts []coin.UxOut, calculateHoursTime uint64) ([]UnspentOutput, error) { + outs := make([]UnspentOutput, len(uxOuts)) + for i, ux := range uxOuts { + u, err := NewUnspentOutput(ux, calculateHoursTime) + if err != nil { + return nil, err + } + outs[i] = u + } + + return outs, nil +} + +// UnspentOutputsSummary includes current unspent outputs and incoming and outgoing unspent outputs +type UnspentOutputsSummary struct { + HeadBlock *coin.SignedBlock + Confirmed []UnspentOutput + Outgoing []UnspentOutput + Incoming []UnspentOutput +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/objects_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/objects_test.go new file mode 100644 index 00000000..5ae2072b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/objects_test.go @@ -0,0 +1,54 @@ +package visor + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" +) + +func TestNewTransactionInputsFromUxBalance(t *testing.T) { + headTime := uint64(time.Now().Unix()) + + uxa := []coin.UxOut{ + { + Head: coin.UxHead{ + Time: headTime / 2, + BkSeq: 60, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 11e6, + Hours: 12345, + }, + }, + { + Head: coin.UxHead{ + Time: headTime/2 + headTime/4, + BkSeq: 120, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 12345678, + Hours: 987654, + }, + }, + } + + uxb, err := transaction.NewUxBalances(uxa, headTime) + require.NoError(t, err) + + inputsFromUxa, err := NewTransactionInputs(uxa, headTime) + require.NoError(t, err) + + inputsFromUxb := NewTransactionInputsFromUxBalance(uxb) + require.Equal(t, inputsFromUxa, inputsFromUxb) + + require.Nil(t, NewTransactionInputsFromUxBalance([]transaction.UxBalance{})) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist.go new file mode 100644 index 00000000..28a4164a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist.go @@ -0,0 +1,64 @@ +package visor + +import ( + "bytes" + "sort" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +// RichlistBalance holds info an address balance holder +type RichlistBalance struct { + Address cipher.Address + Coins uint64 + Locked bool +} + +// Richlist contains RichlistBalances +type Richlist []RichlistBalance + +// NewRichlist create Richlist via unspent outputs map +func NewRichlist(allAccounts map[cipher.Address]uint64, lockedAddrs map[cipher.Address]struct{}) (Richlist, error) { + richlist := make(Richlist, 0, len(allAccounts)) + + for addr, coins := range allAccounts { + var islocked bool + if _, ok := lockedAddrs[addr]; ok { + islocked = true + } + + richlist = append(richlist, RichlistBalance{ + Address: addr, + Coins: coins, + Locked: islocked, + }) + } + + // Sort order: + // Higher coins + // Locked > unlocked + // Address bytes + sort.Slice(richlist, func(i, j int) bool { + if richlist[i].Coins == richlist[j].Coins { + if richlist[i].Locked == richlist[j].Locked { + return bytes.Compare(richlist[i].Address.Bytes(), richlist[j].Address.Bytes()) < 0 + } + return richlist[i].Locked + } + + return richlist[i].Coins > richlist[j].Coins + }) + + return richlist, nil +} + +// FilterAddresses returns the richlist without addresses from the map +func (r Richlist) FilterAddresses(addrs map[cipher.Address]struct{}) Richlist { + var s Richlist + for _, b := range r { + if _, ok := addrs[b.Address]; !ok { + s = append(s, b) + } + } + return s +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist_test.go new file mode 100644 index 00000000..d5573be6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist_test.go @@ -0,0 +1,124 @@ +package visor + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +func getLockedMap(distributionAddresses [4]cipher.Address) map[cipher.Address]struct{} { + // distributionAddresses := []cipher.Address{"a1", "b1", "c1", "d1"} + dmap := map[cipher.Address]struct{}{} + for _, addr := range distributionAddresses { + dmap[addr] = struct{}{} + } + return dmap +} + +func getAllAccounts(distributionAddresses, otherAddresses [4]cipher.Address) map[cipher.Address]uint64 { + accMap := map[cipher.Address]uint64{} + accMap[distributionAddresses[0]] = 1000000 + accMap[distributionAddresses[1]] = 1000000 + accMap[distributionAddresses[2]] = 2123456 + accMap[distributionAddresses[3]] = 1000000 + accMap[otherAddresses[0]] = 3010000 + accMap[otherAddresses[1]] = 2010000 + accMap[otherAddresses[2]] = 4010000 + accMap[otherAddresses[3]] = 1000000 + + return accMap +} + +func TestRichlist(t *testing.T) { + otherAddresses := [4]cipher.Address{ + cipher.MustDecodeBase58Address("2cmpPv9PJfKFStekrKZXBnAfLKE6cB7qMrS"), + cipher.MustDecodeBase58Address("jhLw4EXNn2E7zVjrmi8fGsATZfRnAXfqRj"), + cipher.MustDecodeBase58Address("R7zjFhmW3KqGz6r92VFpJTpRWCzaXSokYb"), + cipher.MustDecodeBase58Address("JFQRvKXBoTt6D8aiFVrGquemzbrQDGKTAR"), + } + + distributionAddresses := [4]cipher.Address{ + cipher.MustDecodeBase58Address("DniB7KqDRNx8CjM6vruaKwbQPgWj1GSj5t"), + cipher.MustDecodeBase58Address("FbJuRez3RKpYsTSYTVyAQt146vzcFNkqpU"), + cipher.MustDecodeBase58Address("2mxNdCnUd7vF1uSpRhSDMEhZHKAyL9r1Uys"), + cipher.MustDecodeBase58Address("uBcaMg2vGpy45K7NVsRGmuNXQdaB8kgHfM"), + } + + expectedRichlist := Richlist{ + RichlistBalance{Address: otherAddresses[2], Coins: 4010000, Locked: false}, + RichlistBalance{Address: otherAddresses[0], Coins: 3010000, Locked: false}, + RichlistBalance{Address: distributionAddresses[2], Coins: 2123456, Locked: true}, + RichlistBalance{Address: otherAddresses[1], Coins: 2010000, Locked: false}, + RichlistBalance{Address: distributionAddresses[0], Coins: 1000000, Locked: true}, + RichlistBalance{Address: distributionAddresses[1], Coins: 1000000, Locked: true}, + RichlistBalance{Address: distributionAddresses[3], Coins: 1000000, Locked: true}, + RichlistBalance{Address: otherAddresses[3], Coins: 1000000, Locked: false}, + } + + accMap := getAllAccounts(distributionAddresses, otherAddresses) + distributionMap := getLockedMap(distributionAddresses) + + richlist, err := NewRichlist(map[cipher.Address]uint64{}, map[cipher.Address]struct{}{}) + require.NoError(t, err) + require.Equal(t, Richlist{}, richlist) + + richlist, err = NewRichlist(accMap, distributionMap) + require.NoError(t, err) + require.Equal(t, expectedRichlist, richlist) + + cases := []struct { + name string + filterMap map[cipher.Address]struct{} + richlistLen int + result Richlist + }{ + { + name: "filterRichlist", + filterMap: map[cipher.Address]struct{}{ + otherAddresses[0]: struct{}{}, + otherAddresses[1]: struct{}{}, + otherAddresses[3]: struct{}{}, + }, + richlistLen: 5, + result: Richlist{ + RichlistBalance{Address: otherAddresses[2], Locked: false, Coins: 4010000}, + RichlistBalance{Address: distributionAddresses[2], Locked: true, Coins: 2123456}, + RichlistBalance{Address: distributionAddresses[0], Locked: true, Coins: 1000000}, + RichlistBalance{Address: distributionAddresses[1], Locked: true, Coins: 1000000}, + RichlistBalance{Address: distributionAddresses[3], Locked: true, Coins: 1000000}, + }, + }, + + { + name: "allRichlist", + filterMap: map[cipher.Address]struct{}{}, + richlistLen: 8, + result: expectedRichlist, + }, + { + name: "lockedRichlist", + filterMap: map[cipher.Address]struct{}{ + otherAddresses[0]: struct{}{}, + otherAddresses[1]: struct{}{}, + otherAddresses[2]: struct{}{}, + otherAddresses[3]: struct{}{}, + }, + result: Richlist{ + RichlistBalance{Address: distributionAddresses[2], Locked: true, Coins: 2123456}, + RichlistBalance{Address: distributionAddresses[0], Locked: true, Coins: 1000000}, + RichlistBalance{Address: distributionAddresses[1], Locked: true, Coins: 1000000}, + RichlistBalance{Address: distributionAddresses[3], Locked: true, Coins: 1000000}, + }, + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + result := richlist.FilterAddresses(tc.filterMap) + require.Equal(t, len(tc.result), len(result), "%d != %d", len(tc.result), len(result)) + + require.Equal(t, tc.result, result) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/skyencoder_test.go new file mode 100644 index 00000000..6f55c7ca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/skyencoder_test.go @@ -0,0 +1,17 @@ +package visor + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSkyencoderDBSafe(t *testing.T) { + dbFile := "../api/integration/testdata/blockchain-180.db" + + db, err := OpenDB(dbFile, true) + require.NoError(t, err) + + err = VerifyDBSkyencoderSafe(db, nil) + require.NoError(t, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.garbage b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.garbage new file mode 100644 index 00000000..e1e9666d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.garbage @@ -0,0 +1 @@ +....garbage file to cause bolt DB error.... diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-txn-index b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-txn-index new file mode 100644 index 00000000..11f547d0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-txn-index differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-uxout-index b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-uxout-index new file mode 100644 index 00000000..bf4ef82c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-uxout-index differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nosig b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nosig new file mode 100644 index 00000000..40c5b253 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nosig differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.notxn b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.notxn new file mode 100644 index 00000000..86fa6461 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.notxn differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nouxout b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nouxout new file mode 100644 index 00000000..21ebfa75 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nouxout differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.ok b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.ok new file mode 100644 index 00000000..47780f85 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.ok differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed.go new file mode 100644 index 00000000..510a1b05 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed.go @@ -0,0 +1,561 @@ +package visor + +import ( + "errors" + "fmt" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // UnconfirmedTxnsBkt holds unconfirmed transactions + UnconfirmedTxnsBkt = []byte("unconfirmed_txns") + // UnconfirmedUnspentsBkt holds unconfirmed unspent outputs + UnconfirmedUnspentsBkt = []byte("unconfirmed_unspents") + + errUpdateObjectDoesNotExist = errors.New("object does not exist in bucket") +) + +//go:generate skyencoder -unexported -struct UnconfirmedTransaction +//go:generate skyencoder -unexported -struct UxArray + +// UxArray wraps coin.UxArray +type UxArray struct { + UxArray coin.UxArray +} + +// unconfirmed transactions bucket +type unconfirmedTxns struct{} + +func (utb *unconfirmedTxns) get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) { + var txn UnconfirmedTransaction + + v, err := dbutil.GetBucketValueNoCopy(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeUnconfirmedTransactionExact(v, &txn); err != nil { + return nil, err + } + + txnHash := txn.Transaction.Hash() + if hash != txnHash { + return nil, fmt.Errorf("DB key %s does not match block hash header %s", hash, txnHash) + } + + return &txn, nil +} + +func (utb *unconfirmedTxns) put(tx *dbutil.Tx, v *UnconfirmedTransaction) error { + h := v.Transaction.Hash() + buf, err := encodeUnconfirmedTransaction(v) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnconfirmedTxnsBkt, []byte(h.Hex()), buf) +} + +func (utb *unconfirmedTxns) update(tx *dbutil.Tx, hash cipher.SHA256, f func(v *UnconfirmedTransaction) error) error { + txn, err := utb.get(tx, hash) + if err != nil { + return err + } + + if txn == nil { + return errUpdateObjectDoesNotExist + } + + if err := f(txn); err != nil { + return err + } + + return utb.put(tx, txn) +} + +func (utb *unconfirmedTxns) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) +} + +func (utb *unconfirmedTxns) getAll(tx *dbutil.Tx) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(_, v []byte) error { + var txn UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(v, &txn); err != nil { + return err + } + + txns = append(txns, txn) + return nil + }); err != nil { + return nil, err + } + + return txns, nil +} + +func (utb *unconfirmedTxns) hasKey(tx *dbutil.Tx, hash cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) +} + +func (utb *unconfirmedTxns) forEach(tx *dbutil.Tx, f func(hash cipher.SHA256, tx UnconfirmedTransaction) error) error { + return dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromHex(string(k)) + if err != nil { + return err + } + + var txn UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(v, &txn); err != nil { + return err + } + + return f(hash, txn) + }) +} + +func (utb *unconfirmedTxns) len(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnconfirmedTxnsBkt) +} + +type txnUnspents struct{} + +func (txus *txnUnspents) put(tx *dbutil.Tx, hash cipher.SHA256, uxs coin.UxArray) error { + buf, err := encodeUxArray(&UxArray{ + UxArray: uxs, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex()), buf) +} + +func (txus *txnUnspents) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex())) +} + +func (txus *txnUnspents) getByAddr(tx *dbutil.Tx, a cipher.Address) (coin.UxArray, error) { + var uxo coin.UxArray + + if err := dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(_, v []byte) error { + var uxa UxArray + if err := decodeUxArrayExact(v, &uxa); err != nil { + return err + } + + for i := range uxa.UxArray { + if uxa.UxArray[i].Body.Address == a { + uxo = append(uxo, uxa.UxArray[i]) + } + } + + return nil + }); err != nil { + return nil, err + } + + return uxo, nil +} + +// UnconfirmedTransactionPool manages unconfirmed transactions +type UnconfirmedTransactionPool struct { + db *dbutil.DB + txns *unconfirmedTxns + // Predicted unspents, assuming txns are valid. Needed to predict + // our future balance and avoid double spending our own coins + // Maps from Transaction.Hash() to UxArray. + unspent *txnUnspents +} + +// NewUnconfirmedTransactionPool creates an UnconfirmedTransactionPool instance +func NewUnconfirmedTransactionPool(db *dbutil.DB) (*UnconfirmedTransactionPool, error) { + if err := db.View("Check unconfirmed txn pool size", func(tx *dbutil.Tx) error { + n, err := dbutil.Len(tx, UnconfirmedTxnsBkt) + if err != nil { + return err + } + + logger.Infof("Unconfirmed transaction pool size: %d", n) + return nil + }); err != nil { + return nil, err + } + + return &UnconfirmedTransactionPool{ + db: db, + txns: &unconfirmedTxns{}, + unspent: &txnUnspents{}, + }, nil +} + +// SetTransactionsAnnounced updates announced time of specific tx +func (utp *UnconfirmedTransactionPool) SetTransactionsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error { + var txns []*UnconfirmedTransaction + for h, t := range hashes { + txn, err := utp.txns.get(tx, h) + if err != nil { + return err + } + + if txn == nil { + logger.Warningf("UnconfirmedTransactionPool.SetTransactionsAnnounced: UnconfirmedTransaction %s not found in DB", h.Hex()) + continue + } + + if t > txn.Announced { + txn.Announced = t + txns = append(txns, txn) + } + } + + for _, txn := range txns { + if err := utp.txns.put(tx, txn); err != nil { + return err + } + } + + return nil +} + +// InjectTransaction adds a coin.Transaction to the pool, or updates an existing one's timestamps +// Returns an error if txn is invalid, and whether the transaction already +// existed in the pool. +// If the transaction violates hard constraints, it is rejected. +// Soft constraints violations mark a txn as invalid, but the txn is inserted. The soft violation is returned. +func (utp *UnconfirmedTransactionPool) InjectTransaction(tx *dbutil.Tx, bc Blockchainer, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn) (bool, *ErrTxnViolatesSoftConstraint, error) { + var isValid int8 = 1 + var softErr *ErrTxnViolatesSoftConstraint + if _, _, err := bc.VerifySingleTxnSoftHardConstraints(tx, txn, distParams, verifyParams, TxnSigned); err != nil { + logger.Warningf("bc.VerifySingleTxnSoftHardConstraints failed for txn %s: %v", txn.Hash().Hex(), err) + switch e := err.(type) { + case ErrTxnViolatesSoftConstraint: + softErr = &e + isValid = 0 + case ErrTxnViolatesHardConstraint: + return false, nil, err + default: + return false, nil, err + } + } + + hash := txn.Hash() + known, err := utp.txns.hasKey(tx, hash) + if err != nil { + logger.Errorf("InjectTransaction check txn exists failed: %v", err) + return false, nil, err + } + + // Update if we already have this txn + if known { + if err := utp.txns.update(tx, hash, func(utxn *UnconfirmedTransaction) error { + now := time.Now().UTC().UnixNano() + utxn.Received = now + utxn.Checked = now + utxn.IsValid = isValid + return nil + }); err != nil { + logger.Errorf("InjectTransaction update known txn failed: %v", err) + return false, nil, err + } + + return true, softErr, nil + } + + utx := NewUnconfirmedTransaction(txn) + utx.IsValid = isValid + + // add txn to index + if err := utp.txns.put(tx, &utx); err != nil { + logger.Errorf("InjectTransaction put new unconfirmed txn failed: %v", err) + return false, nil, err + } + + head, err := bc.Head(tx) + if err != nil { + logger.Errorf("InjectTransaction bc.Head() failed: %v", err) + return false, nil, err + } + + // update unconfirmed unspent + createdUnspents := coin.CreateUnspents(head.Head, txn) + if err := utp.unspent.put(tx, hash, createdUnspents); err != nil { + logger.Errorf("InjectTransaction put new unspent outputs: %v", err) + return false, nil, err + } + + return false, softErr, nil +} + +// AllRawTransactions returns underlying coin.Transactions +func (utp *UnconfirmedTransactionPool) AllRawTransactions(tx *dbutil.Tx) (coin.Transactions, error) { + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + txns := make(coin.Transactions, len(utxns)) + for i := range utxns { + txns[i] = utxns[i].Transaction + } + return txns, nil +} + +// Remove a single txn by hash +func (utp *UnconfirmedTransactionPool) removeTransaction(tx *dbutil.Tx, txHash cipher.SHA256) error { + if err := utp.txns.delete(tx, txHash); err != nil { + return err + } + + return utp.unspent.delete(tx, txHash) +} + +// RemoveTransactions remove transactions with dbutil.Tx +func (utp *UnconfirmedTransactionPool) RemoveTransactions(tx *dbutil.Tx, txHashes []cipher.SHA256) error { + for i := range txHashes { + if err := utp.removeTransaction(tx, txHashes[i]); err != nil { + return err + } + } + + return nil +} + +// Refresh checks all unconfirmed txns against the blockchain. +// If the transaction becomes invalid it is marked invalid. +// If the transaction becomes valid it is marked valid and is returned to the caller. +func (utp *UnconfirmedTransactionPool) Refresh(tx *dbutil.Tx, bc Blockchainer, distParams params.Distribution, verifyParams params.VerifyTxn) ([]cipher.SHA256, error) { + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + now := time.Now().UTC() + var nowValid []cipher.SHA256 + + for _, utxn := range utxns { + utxn.Checked = now.UnixNano() + + _, _, err := bc.VerifySingleTxnSoftHardConstraints(tx, utxn.Transaction, distParams, verifyParams, TxnSigned) + + switch err.(type) { + case ErrTxnViolatesSoftConstraint, ErrTxnViolatesHardConstraint: + utxn.IsValid = 0 + case nil: + if utxn.IsValid == 0 { + nowValid = append(nowValid, utxn.Transaction.Hash()) + } + utxn.IsValid = 1 + default: + return nil, err + } + + if err := utp.txns.put(tx, &utxn); err != nil { + return nil, err + } + } + + return nowValid, nil +} + +// RemoveInvalid checks all unconfirmed txns against the blockchain. +// If a transaction violates hard constraints it is removed from the pool. +// The transactions that were removed are returned. +func (utp *UnconfirmedTransactionPool) RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) { + var removeUtxns []cipher.SHA256 + + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + for _, utxn := range utxns { + err := bc.VerifySingleTxnHardConstraints(tx, utxn.Transaction, TxnSigned) + if err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint: + removeUtxns = append(removeUtxns, utxn.Transaction.Hash()) + default: + return nil, err + } + } + } + + if err := utp.RemoveTransactions(tx, removeUtxns); err != nil { + return nil, err + } + + return removeUtxns, nil +} + +// FilterKnown returns txn hashes with known ones removed +func (utp *UnconfirmedTransactionPool) FilterKnown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) { + var unknown []cipher.SHA256 + + for _, h := range txns { + if hasKey, err := utp.txns.hasKey(tx, h); err != nil { + return nil, err + } else if !hasKey { + unknown = append(unknown, h) + } + } + + return unknown, nil +} + +// GetKnown returns all known transactions from the pool, given hashes to select +func (utp *UnconfirmedTransactionPool) GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) { + var known coin.Transactions + + for _, h := range txns { + if tx, err := utp.txns.get(tx, h); err != nil { + return nil, err + } else if tx != nil { + known = append(known, tx.Transaction) + } + } + + return known, nil +} + +// RecvOfAddresses returns unconfirmed receiving uxouts of addresses +func (utp *UnconfirmedTransactionPool) RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + for i, o := range txn.Transaction.Out { + if _, ok := addrm[o.Address]; ok { + uxout, err := coin.CreateUnspent(bh, txn.Transaction, i) + if err != nil { + return err + } + + auxs[o.Address] = append(auxs[o.Address], uxout) + } + } + return nil + }); err != nil { + return nil, err + } + + return auxs, nil +} + +// txnOutputsForAddrs returns unspent outputs assigned to addresses in addrs, created by a set of transactions +func txnOutputsForAddrs(bh coin.BlockHeader, addrs []cipher.Address, txns []coin.Transaction) (coin.AddressUxOuts, error) { + if len(txns) == 0 || len(addrs) == 0 { + return nil, nil + } + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + + for _, txn := range txns { + for i, o := range txn.Out { + if _, ok := addrm[o.Address]; ok { + uxout, err := coin.CreateUnspent(bh, txn, i) + if err != nil { + return nil, err + } + + auxs[o.Address] = append(auxs[o.Address], uxout) + } + } + } + + return auxs, nil +} + +// GetIncomingOutputs returns all predicted incoming outputs. +func (utp *UnconfirmedTransactionPool) GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) { + var outs coin.UxArray + + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + outs = append(outs, coin.CreateUnspents(bh, txn.Transaction)...) + return nil + }); err != nil { + return nil, err + } + + return outs, nil +} + +// Get returns the unconfirmed transaction of given tx hash. +func (utp *UnconfirmedTransactionPool) Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) { + return utp.txns.get(tx, hash) +} + +// GetFiltered returns all transactions that can pass the filter +func (utp *UnconfirmedTransactionPool) GetFiltered(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + if filter(txn) { + txns = append(txns, txn) + } + return nil + }); err != nil { + logger.Errorf("GetFiltered error: %v", err) + return nil, err + } + + return txns, nil +} + +// GetHashes returns transaction hashes that can pass the filter +func (utp *UnconfirmedTransactionPool) GetHashes(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := utp.txns.forEach(tx, func(hash cipher.SHA256, txn UnconfirmedTransaction) error { + if filter(txn) { + hashes = append(hashes, hash) + } + return nil + }); err != nil { + logger.Errorf("GetHashes error: %v", err) + return nil, err + } + + return hashes, nil +} + +// ForEach iterate the pool with given callback function +func (utp *UnconfirmedTransactionPool) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTransaction) error) error { + return utp.txns.forEach(tx, f) +} + +// GetUnspentsOfAddr returns unspent outputs of given address in unspent tx pool +func (utp *UnconfirmedTransactionPool) GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) { + return utp.unspent.getByAddr(tx, addr) +} + +// IsValid can be used as filter function +func IsValid(tx UnconfirmedTransaction) bool { + return tx.IsValid == 1 +} + +// All use as return all filter +func All(tx UnconfirmedTransaction) bool { + return true +} + +// Len returns the number of unconfirmed transactions +func (utp *UnconfirmedTransactionPool) Len(tx *dbutil.Tx) (uint64, error) { + return utp.txns.len(tx) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder.go new file mode 100644 index 00000000..37365a07 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder.go @@ -0,0 +1,418 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package visor + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeUnconfirmedTransaction computes the size of an encoded object of type UnconfirmedTransaction +func encodeSizeUnconfirmedTransaction(obj *UnconfirmedTransaction) uint64 { + i0 := uint64(0) + + // obj.Transaction.Length + i0 += 4 + + // obj.Transaction.Type + i0++ + + // obj.Transaction.InnerHash + i0 += 32 + + // obj.Transaction.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Transaction.Sigs)) * i1 + } + + // obj.Transaction.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Transaction.In)) * i1 + } + + // obj.Transaction.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Transaction.Out)) * i1 + } + + // obj.Received + i0 += 8 + + // obj.Checked + i0 += 8 + + // obj.Announced + i0 += 8 + + // obj.IsValid + i0++ + + return i0 +} + +// encodeUnconfirmedTransaction encodes an object of type UnconfirmedTransaction to a buffer allocated to the exact size +// required to encode the object. +func encodeUnconfirmedTransaction(obj *UnconfirmedTransaction) ([]byte, error) { + n := encodeSizeUnconfirmedTransaction(obj) + buf := make([]byte, n) + + if err := encodeUnconfirmedTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUnconfirmedTransactionToBuffer encodes an object of type UnconfirmedTransaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUnconfirmedTransactionToBuffer(buf []byte, obj *UnconfirmedTransaction) error { + if uint64(len(buf)) < encodeSizeUnconfirmedTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transaction.Length + e.Uint32(obj.Transaction.Length) + + // obj.Transaction.Type + e.Uint8(obj.Transaction.Type) + + // obj.Transaction.InnerHash + e.CopyBytes(obj.Transaction.InnerHash[:]) + + // obj.Transaction.Sigs maxlen check + if len(obj.Transaction.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transaction.Sigs length check + if uint64(len(obj.Transaction.Sigs)) > math.MaxUint32 { + return errors.New("obj.Transaction.Sigs length exceeds math.MaxUint32") + } + + // obj.Transaction.Sigs length + e.Uint32(uint32(len(obj.Transaction.Sigs))) + + // obj.Transaction.Sigs + for _, x := range obj.Transaction.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Transaction.In maxlen check + if len(obj.Transaction.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transaction.In length check + if uint64(len(obj.Transaction.In)) > math.MaxUint32 { + return errors.New("obj.Transaction.In length exceeds math.MaxUint32") + } + + // obj.Transaction.In length + e.Uint32(uint32(len(obj.Transaction.In))) + + // obj.Transaction.In + for _, x := range obj.Transaction.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Transaction.Out maxlen check + if len(obj.Transaction.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transaction.Out length check + if uint64(len(obj.Transaction.Out)) > math.MaxUint32 { + return errors.New("obj.Transaction.Out length exceeds math.MaxUint32") + } + + // obj.Transaction.Out length + e.Uint32(uint32(len(obj.Transaction.Out))) + + // obj.Transaction.Out + for _, x := range obj.Transaction.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + // obj.Received + e.Int64(obj.Received) + + // obj.Checked + e.Int64(obj.Checked) + + // obj.Announced + e.Int64(obj.Announced) + + // obj.IsValid + e.Int8(obj.IsValid) + + return nil +} + +// decodeUnconfirmedTransaction decodes an object of type UnconfirmedTransaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUnconfirmedTransaction(buf []byte, obj *UnconfirmedTransaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transaction.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Transaction.Length = i + } + + { + // obj.Transaction.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transaction.Type = i + } + + { + // obj.Transaction.InnerHash + if len(d.Buffer) < len(obj.Transaction.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.InnerHash[:], d.Buffer[:len(obj.Transaction.InnerHash)]) + d.Buffer = d.Buffer[len(obj.Transaction.InnerHash):] + } + + { + // obj.Transaction.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transaction.Sigs = make([]cipher.Sig, length) + + for z2 := range obj.Transaction.Sigs { + { + // obj.Transaction.Sigs[z2] + if len(d.Buffer) < len(obj.Transaction.Sigs[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.Sigs[z2][:], d.Buffer[:len(obj.Transaction.Sigs[z2])]) + d.Buffer = d.Buffer[len(obj.Transaction.Sigs[z2]):] + } + + } + } + } + + { + // obj.Transaction.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transaction.In = make([]cipher.SHA256, length) + + for z2 := range obj.Transaction.In { + { + // obj.Transaction.In[z2] + if len(d.Buffer) < len(obj.Transaction.In[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.In[z2][:], d.Buffer[:len(obj.Transaction.In[z2])]) + d.Buffer = d.Buffer[len(obj.Transaction.In[z2]):] + } + + } + } + } + + { + // obj.Transaction.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transaction.Out = make([]coin.TransactionOutput, length) + + for z2 := range obj.Transaction.Out { + { + // obj.Transaction.Out[z2].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transaction.Out[z2].Address.Version = i + } + + { + // obj.Transaction.Out[z2].Address.Key + if len(d.Buffer) < len(obj.Transaction.Out[z2].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.Out[z2].Address.Key[:], d.Buffer[:len(obj.Transaction.Out[z2].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Transaction.Out[z2].Address.Key):] + } + + { + // obj.Transaction.Out[z2].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transaction.Out[z2].Coins = i + } + + { + // obj.Transaction.Out[z2].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transaction.Out[z2].Hours = i + } + + } + } + } + + { + // obj.Received + i, err := d.Int64() + if err != nil { + return 0, err + } + obj.Received = i + } + + { + // obj.Checked + i, err := d.Int64() + if err != nil { + return 0, err + } + obj.Checked = i + } + + { + // obj.Announced + i, err := d.Int64() + if err != nil { + return 0, err + } + obj.Announced = i + } + + { + // obj.IsValid + i, err := d.Int8() + if err != nil { + return 0, err + } + obj.IsValid = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUnconfirmedTransactionExact decodes an object of type UnconfirmedTransaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUnconfirmedTransactionExact(buf []byte, obj *UnconfirmedTransaction) error { + if n, err := decodeUnconfirmedTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder_test.go new file mode 100644 index 00000000..777b61ff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package visor + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUnconfirmedTransactionForEncodeTest() *UnconfirmedTransaction { + var obj UnconfirmedTransaction + return &obj +} + +func newRandomUnconfirmedTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *UnconfirmedTransaction { + var obj UnconfirmedTransaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUnconfirmedTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *UnconfirmedTransaction { + var obj UnconfirmedTransaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUnconfirmedTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *UnconfirmedTransaction { + var obj UnconfirmedTransaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUnconfirmedTransaction(t *testing.T, obj *UnconfirmedTransaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUnconfirmedTransaction(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUnconfirmedTransaction() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUnconfirmedTransaction(obj) + if err != nil { + t.Fatalf("encodeUnconfirmedTransaction failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUnconfirmedTransaction produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUnconfirmedTransaction()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUnconfirmedTransactionToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUnconfirmedTransactionToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UnconfirmedTransaction + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UnconfirmedTransaction + if n, err := decodeUnconfirmedTransaction(data2, &obj3); err != nil { + t.Fatalf("decodeUnconfirmedTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUnconfirmedTransaction bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUnconfirmedTransaction()") + } + + // Decode, excess buffer + var obj4 UnconfirmedTransaction + n, err := decodeUnconfirmedTransaction(data3, &obj4) + if err != nil { + t.Fatalf("decodeUnconfirmedTransaction failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUnconfirmedTransaction bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUnconfirmedTransaction bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUnconfirmedTransaction()") + } + + // DecodeExact + var obj5 UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(data2, &obj5); err != nil { + t.Fatalf("decodeUnconfirmedTransaction failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUnconfirmedTransaction()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUnconfirmedTransaction(data4, &obj3); err != nil { + t.Fatalf("decodeUnconfirmedTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUnconfirmedTransaction bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUnconfirmedTransaction(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UnconfirmedTransaction + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUnconfirmedTransactionForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUnconfirmedTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUnconfirmedTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUnconfirmedTransactionForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUnconfirmedTransaction(t, tc.obj) + }) + } +} + +func decodeUnconfirmedTransactionExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UnconfirmedTransaction + if _, err := decodeUnconfirmedTransaction(buf, &obj); err == nil { + t.Fatal("decodeUnconfirmedTransaction: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUnconfirmedTransaction: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUnconfirmedTransactionExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(buf, &obj); err == nil { + t.Fatal("decodeUnconfirmedTransactionExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUnconfirmedTransactionExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUnconfirmedTransactionDecodeErrors(t *testing.T, k int, tag string, obj *UnconfirmedTransaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUnconfirmedTransaction(obj) + buf, err := encodeUnconfirmedTransaction(obj) + if err != nil { + t.Fatalf("encodeUnconfirmedTransaction failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUnconfirmedTransactionExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUnconfirmedTransactionExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUnconfirmedTransactionExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUnconfirmedTransactionExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUnconfirmedTransactionExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUnconfirmedTransactionDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUnconfirmedTransactionForEncodeTest() + fullObj := newRandomUnconfirmedTransactionForEncodeTest(t, rand) + testSkyencoderUnconfirmedTransactionDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUnconfirmedTransactionDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder.go new file mode 100644 index 00000000..84611051 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder.go @@ -0,0 +1,216 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package visor + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeUxArray computes the size of an encoded object of type UxArray +func encodeSizeUxArray(obj *UxArray) uint64 { + i0 := uint64(0) + + // obj.UxArray + i0 += 4 + { + i1 := uint64(0) + + // x1.Head.Time + i1 += 8 + + // x1.Head.BkSeq + i1 += 8 + + // x1.Body.SrcTransaction + i1 += 32 + + // x1.Body.Address.Version + i1++ + + // x1.Body.Address.Key + i1 += 20 + + // x1.Body.Coins + i1 += 8 + + // x1.Body.Hours + i1 += 8 + + i0 += uint64(len(obj.UxArray)) * i1 + } + + return i0 +} + +// encodeUxArray encodes an object of type UxArray to a buffer allocated to the exact size +// required to encode the object. +func encodeUxArray(obj *UxArray) ([]byte, error) { + n := encodeSizeUxArray(obj) + buf := make([]byte, n) + + if err := encodeUxArrayToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxArrayToBuffer encodes an object of type UxArray to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxArrayToBuffer(buf []byte, obj *UxArray) error { + if uint64(len(buf)) < encodeSizeUxArray(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.UxArray length check + if uint64(len(obj.UxArray)) > math.MaxUint32 { + return errors.New("obj.UxArray length exceeds math.MaxUint32") + } + + // obj.UxArray length + e.Uint32(uint32(len(obj.UxArray))) + + // obj.UxArray + for _, x := range obj.UxArray { + + // x.Head.Time + e.Uint64(x.Head.Time) + + // x.Head.BkSeq + e.Uint64(x.Head.BkSeq) + + // x.Body.SrcTransaction + e.CopyBytes(x.Body.SrcTransaction[:]) + + // x.Body.Address.Version + e.Uint8(x.Body.Address.Version) + + // x.Body.Address.Key + e.CopyBytes(x.Body.Address.Key[:]) + + // x.Body.Coins + e.Uint64(x.Body.Coins) + + // x.Body.Hours + e.Uint64(x.Body.Hours) + + } + + return nil +} + +// decodeUxArray decodes an object of type UxArray from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxArray(buf []byte, obj *UxArray) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.UxArray + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.UxArray = make([]coin.UxOut, length) + + for z1 := range obj.UxArray { + { + // obj.UxArray[z1].Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Head.Time = i + } + + { + // obj.UxArray[z1].Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Head.BkSeq = i + } + + { + // obj.UxArray[z1].Body.SrcTransaction + if len(d.Buffer) < len(obj.UxArray[z1].Body.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.UxArray[z1].Body.SrcTransaction[:], d.Buffer[:len(obj.UxArray[z1].Body.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.UxArray[z1].Body.SrcTransaction):] + } + + { + // obj.UxArray[z1].Body.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.UxArray[z1].Body.Address.Version = i + } + + { + // obj.UxArray[z1].Body.Address.Key + if len(d.Buffer) < len(obj.UxArray[z1].Body.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.UxArray[z1].Body.Address.Key[:], d.Buffer[:len(obj.UxArray[z1].Body.Address.Key)]) + d.Buffer = d.Buffer[len(obj.UxArray[z1].Body.Address.Key):] + } + + { + // obj.UxArray[z1].Body.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Body.Coins = i + } + + { + // obj.UxArray[z1].Body.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Body.Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxArrayExact decodes an object of type UxArray from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxArrayExact(buf []byte, obj *UxArray) error { + if n, err := decodeUxArray(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder_test.go new file mode 100644 index 00000000..42b649bd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package visor + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUxArrayForEncodeTest() *UxArray { + var obj UxArray + return &obj +} + +func newRandomUxArrayForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxArray { + var obj UxArray + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxArrayForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxArray { + var obj UxArray + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxArrayForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxArray { + var obj UxArray + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxArray(t *testing.T, obj *UxArray) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxArray(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxArray() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxArray(obj) + if err != nil { + t.Fatalf("encodeUxArray failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxArray produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxArray()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxArrayToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxArrayToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UxArray + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UxArray + if n, err := decodeUxArray(data2, &obj3); err != nil { + t.Fatalf("decodeUxArray failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxArray bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxArray()") + } + + // Decode, excess buffer + var obj4 UxArray + n, err := decodeUxArray(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxArray failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxArray bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxArray bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxArray()") + } + + // DecodeExact + var obj5 UxArray + if err := decodeUxArrayExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxArray failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxArray()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxArray(data4, &obj3); err != nil { + t.Fatalf("decodeUxArray failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxArray bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxArray(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UxArray + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxArrayForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxArrayForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxArrayForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxArrayForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxArray(t, tc.obj) + }) + } +} + +func decodeUxArrayExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxArray + if _, err := decodeUxArray(buf, &obj); err == nil { + t.Fatal("decodeUxArray: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxArray: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxArrayExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxArray + if err := decodeUxArrayExact(buf, &obj); err == nil { + t.Fatal("decodeUxArrayExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxArrayExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxArrayDecodeErrors(t *testing.T, k int, tag string, obj *UxArray) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxArray(obj) + buf, err := encodeUxArray(obj) + if err != nil { + t.Fatalf("encodeUxArray failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxArrayExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxArrayExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxArrayExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxArrayExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxArrayExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxArrayDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxArrayForEncodeTest() + fullObj := newRandomUxArrayForEncodeTest(t, rand) + testSkyencoderUxArrayDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxArrayDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/verify.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/verify.go new file mode 100644 index 00000000..f4c333f2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/verify.go @@ -0,0 +1,336 @@ +package visor + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +/* + +verify.go: Methods for handling transaction verification + +There are two levels of transaction constraint: HARD and SOFT +There are two situations in which transactions are verified: + * When included in a block + * When not in a block + +For transactions in a block, use VerifyBlockTxnConstraints. +For transactions outside of a block, use VerifySingleTxnHardConstraints and VerifySingleTxnSoftConstraints. + +VerifyBlockTxnConstraints only checks hard constraints. Soft constraints do not apply for transactions inside of a block. + +Soft and hard constraints have special handling for single transactions. + +When the transaction is received over the network, a transaction is not injected to the pool if it violates the HARD constraints. +If it violates soft constraints, it is still injected to the pool (TODO: with expiration) but is not rebroadcast to peers. +If it does not violate any constraints it is injected and rebroadcast to peers. + +When the transaction is created by the user (with create_rawtx or /spend), SOFT and HARD constraints apply, to prevent +the user from injecting a transaction to their local pool that cannot be confirmed. + +When creating a new block from transactions, SOFT and HARD constraints apply. + +Transactions in the unconfirmed pool are periodically checked for validity. (TODO: audit/implement this feature) +The transaction pool state transfer phases are as follows: + valid -> hard_invalid: remove + valid -> soft_invalid: mark as invalid + soft_invalid -> valid: mark as valid, broadcast + soft_invalid -> hard_invalid: remove + soft_invalid -> expired: remove + +HARD constraints can NEVER be violated. These include: + - Malformed transaction + - Double spends + - NOTE: Double spend verification must be done against the unspent output set, + the methods here do not operate on the unspent output set. + They accept a `uxIn coin.UxArray` argument, which are the unspents associated + with the transaction's inputs. The unspents must be queried from the unspent + output set first, thus if any unspent is not found for the input, it cannot be spent. + +SOFT constraints are based upon mutable parameters. These include: + - Max block size (transaction must not be larger than this value) + - Insufficient coin hour burn fee + - Timelocked distribution addresses + - Decimal place restrictions + +NOTE: Due to a bug which allowed overflowing output coin hours to be included in a block, + overflowing output coin hours are not checked when adding a signed block, so that the existing blocks can be processed. + When creating or receiving a single transaction from the network, it is treated as a HARD constraint. + +These methods should be called via the Blockchain object when possible, +using Blockchain.VerifyBlockTxnConstraints, Blockchain.VerifySingleTxnHardConstraints and Blockchain.VerifySingleTxnSoftHardConstraints +since data from the blockchain and unspent output set are required to fully validate a transaction. + +*/ + +var ( + // ErrTxnExceedsMaxBlockSize transaction size exceeds the max block size + ErrTxnExceedsMaxBlockSize = errors.New("Transaction size bigger than max block size") + // ErrTxnIsLocked transaction has locked address inputs + ErrTxnIsLocked = errors.New("Transaction has locked address inputs") +) + +// TxnSignedFlag indicates if the transaction is unsigned or not +type TxnSignedFlag int + +const ( + // TxnSigned is used for signed transactions + TxnSigned TxnSignedFlag = 1 + // TxnUnsigned is used for unsigned transactions + TxnUnsigned TxnSignedFlag = 2 +) + +// ErrTxnViolatesHardConstraint is returned when a transaction violates hard constraints +type ErrTxnViolatesHardConstraint struct { + Err error +} + +// NewErrTxnViolatesHardConstraint creates ErrTxnViolatesHardConstraint +func NewErrTxnViolatesHardConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesHardConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesHardConstraint) Error() string { + return fmt.Sprintf("Transaction violates hard constraint: %v", e.Err) +} + +// ErrTxnViolatesSoftConstraint is returned when a transaction violates soft constraints +type ErrTxnViolatesSoftConstraint struct { + Err error +} + +// NewErrTxnViolatesSoftConstraint creates ErrTxnViolatesSoftConstraint +func NewErrTxnViolatesSoftConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesSoftConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesSoftConstraint) Error() string { + return fmt.Sprintf("Transaction violates soft constraint: %v", e.Err) +} + +// ErrTxnViolatesUserConstraint is returned when a transaction violates user constraints +type ErrTxnViolatesUserConstraint struct { + Err error +} + +// NewErrTxnViolatesUserConstraint creates ErrTxnViolatesUserConstraint +func NewErrTxnViolatesUserConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesUserConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesUserConstraint) Error() string { + return fmt.Sprintf("Transaction violates user constraint: %v", e.Err) +} + +// VerifySingleTxnSoftConstraints returns an error if any "soft" constraint are violated. +// "soft" constraints are enforced at the network and block publication level, +// but are not enforced at the blockchain level. +// Clients will not accept blocks that violate hard constraints, but will +// accept blocks that violate soft constraints. +// Checks: +// * That the transaction size is not greater than the max block total transaction size +// * That the transaction burn enough coin hours (the fee) +// * That if that transaction does not spend from a locked distribution address +// * That the transaction does not create outputs with a higher decimal precision than is allowed +func VerifySingleTxnSoftConstraints(txn coin.Transaction, headTime uint64, uxIn coin.UxArray, distParams params.Distribution, verifyParams params.VerifyTxn) error { + if err := verifyTxnSoftConstraints(txn, headTime, uxIn, distParams, verifyParams); err != nil { + return NewErrTxnViolatesSoftConstraint(err) + } + + return nil +} + +func verifyTxnSoftConstraints(txn coin.Transaction, headTime uint64, uxIn coin.UxArray, distParams params.Distribution, verifyParams params.VerifyTxn) error { + txnSize, err := txn.Size() + if err != nil { + return ErrTxnExceedsMaxBlockSize + } + + if txnSize > verifyParams.MaxTransactionSize { + return ErrTxnExceedsMaxBlockSize + } + + f, err := fee.TransactionFee(&txn, headTime, uxIn) + if err != nil { + return err + } + + if err := fee.VerifyTransactionFee(&txn, f, verifyParams.BurnFactor); err != nil { + return err + } + + if TransactionIsLocked(distParams, uxIn) { + return ErrTxnIsLocked + } + + // Reject transactions that do not conform to decimal restrictions + for _, o := range txn.Out { + if err := params.DropletPrecisionCheck(verifyParams.MaxDropletPrecision, o.Coins); err != nil { + return err + } + } + + return nil +} + +// VerifySingleTxnHardConstraints returns an error if any "hard" constraints are violated. +// "hard" constraints are always enforced and if violated the transaction +// should not be included in any block and any block that includes such a transaction +// should be rejected. +// Checks: +// * That the inputs to the transaction exist +// * That the transaction does not create or destroy coins +// * That the signatures on the transaction are valid +// * That there are no duplicate ux inputs +// * That there are no duplicate outputs +// * That the transaction input and output coins do not overflow uint64 +// * That the transaction input and output hours do not overflow uint64 +// NOTE: Double spends are checked against the unspent output pool when querying for uxIn +func VerifySingleTxnHardConstraints(txn coin.Transaction, head coin.BlockHeader, uxIn coin.UxArray, signed TxnSignedFlag) error { + // Check for output hours overflow + // When verifying a single transaction, this is considered a hard constraint. + // For transactions inside of a block, it is a soft constraint. + // This is due to a bug which allowed some blocks to be published with overflowing hours, + // otherwise this would always be a hard constraint. + if _, err := txn.OutputHours(); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + // Check for input CoinHours calculation overflow, since it is ignored by + // VerifyTransactionHoursSpending + for _, ux := range uxIn { + if _, err := ux.CoinHours(head.Time); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + } + + if err := verifyTxnHardConstraints(txn, head, uxIn, signed); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + return nil +} + +// VerifyBlockTxnConstraints returns an error if any "hard" constraints are violated. +// "hard" constraints are always enforced and if violated the transaction +// should not be included in any block and any block that includes such a transaction +// should be rejected. +// Checks: +// * That the inputs to the transaction exist +// * That the transaction does not create or destroy coins +// * That the signatures on the transaction are valid +// * That there are no duplicate ux inputs +// * That there are no duplicate outputs +// * That the transaction input and output coins do not overflow uint64 +// * That the transaction input hours do not overflow uint64 +// NOTE: Double spends are checked against the unspent output pool when querying for uxIn +// NOTE: output hours overflow is treated as a soft constraint for transactions inside of a block, due to a bug +// which allowed some blocks to be published with overflowing output hours. +func VerifyBlockTxnConstraints(txn coin.Transaction, head coin.BlockHeader, uxIn coin.UxArray) error { + if err := verifyTxnHardConstraints(txn, head, uxIn, TxnSigned); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + return nil +} + +func verifyTxnHardConstraints(txn coin.Transaction, head coin.BlockHeader, uxIn coin.UxArray, signed TxnSignedFlag) error { + //CHECKLIST: DONE: check for duplicate ux inputs/double spending + // NOTE: Double spends are checked against the unspent output pool when querying for uxIn + + //CHECKLIST: DONE: check that inputs of transaction have not been spent + //CHECKLIST: DONE: check there are no duplicate outputs + + // Q: why are coin hours based on last block time and not + // current time? + // A: no two computers will agree on system time. Need system clock + // indepedent timing that everyone agrees on. fee values would depend on + // local clock + + // Check transaction type and length + // Check for duplicate outputs + // Check for duplicate inputs + // Check for invalid hash + // Check for no inputs + // Check for no outputs + // Check for zero coin outputs + // Check valid looking signatures + + switch signed { + case TxnSigned: + if err := txn.Verify(); err != nil { + return err + } + + // Check that signatures are allowed to spend inputs + if err := txn.VerifyInputSignatures(uxIn); err != nil { + return err + } + case TxnUnsigned: + if err := txn.VerifyUnsigned(); err != nil { + return err + } + + // Check that signatures are allowed to spend inputs for signatures that are not null + if err := txn.VerifyPartialInputSignatures(uxIn); err != nil { + return err + } + default: + logger.Panic("Invalid TxnSignedFlag") + } + + uxOut := coin.CreateUnspents(head, txn) + + // Check that there are any duplicates within this set + // NOTE: This should already be checked by txn.Verify() + if uxOut.HasDupes() { + return errors.New("Duplicate output in transaction") + } + + // Check that no coins are created or destroyed + if err := coin.VerifyTransactionCoinsSpending(uxIn, uxOut); err != nil { + return err + } + + // Check that no hours are created + // NOTE: this check doesn't catch overflow errors in the addition of hours + // Some blocks had their hours overflow, and if this rule was checked here, + // existing blocks would invalidate. + // The hours overflow check is handled as an extra step in the SingleTxnHard constraints, + // to allow existing blocks which violate the overflow rules to pass. + return coin.VerifyTransactionHoursSpending(head.Time, uxIn, uxOut) +} + +// VerifySingleTxnUserConstraints applies additional verification for a +// transaction created by the user. +// This is distinct from transactions created by other users (i.e. received over the network), +// and from transactions included in blocks. +func VerifySingleTxnUserConstraints(txn coin.Transaction) error { + for _, o := range txn.Out { + if o.Address.Null() { + err := errors.New("Transaction output is sent to the null address") + return NewErrTxnViolatesUserConstraint(err) + } + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/visor.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor.go new file mode 100644 index 00000000..9ab353ad --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor.go @@ -0,0 +1,2469 @@ +/* +Package visor manages the blockchain database and wallets + +All conceptual database operations must use a database transaction. +Callers of visor methods must ensure they do not make multiple calls without a transaction, +unless it is determined safe to do so. + +Wallet access is also gatewayed by visor, since the wallet data relates to the blockchain database. +Wallets are conceptually a second database. +*/ +package visor + +import ( + "errors" + "fmt" + "sort" + + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/util/timeutil" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var logger = logging.MustGetLogger("visor") + +// Visor manages the blockchain +type Visor struct { + Config Config + + startedAt time.Time + db *dbutil.DB + unconfirmed UnconfirmedTransactionPooler + blockchain Blockchainer + history Historyer + wallets *wallet.Service +} + +// New creates a Visor for managing the blockchain database +func New(c Config, db *dbutil.DB, wltServ *wallet.Service) (*Visor, error) { + logger.Info("Creating new visor") + if c.IsBlockPublisher { + logger.Info("Visor running in block publisher mode") + } + + if err := c.Verify(); err != nil { + return nil, err + } + + logger.Infof("Coinhour burn factor for unconfirmed transactions is %d", c.UnconfirmedVerifyTxn.BurnFactor) + logger.Infof("Max transaction size for unconfirmed transactions is %d", c.UnconfirmedVerifyTxn.MaxTransactionSize) + logger.Infof("Max decimals for unconfirmed transactions is %d", c.UnconfirmedVerifyTxn.MaxDropletPrecision) + logger.Infof("Coinhour burn factor for transactions when creating blocks is %d", c.CreateBlockVerifyTxn.BurnFactor) + logger.Infof("Max transaction size for transactions when creating blocks is %d", c.CreateBlockVerifyTxn.MaxTransactionSize) + logger.Infof("Max decimals for transactions when creating blocks is %d", c.CreateBlockVerifyTxn.MaxDropletPrecision) + logger.Infof("Max block size is %d", c.MaxBlockTransactionsSize) + + if !db.IsReadOnly() { + if err := CreateBuckets(db); err != nil { + logger.WithError(err).Error("CreateBuckets failed") + return nil, err + } + } + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: c.BlockchainPubkey, + Arbitrating: c.Arbitrating, + }) + if err != nil { + return nil, err + } + + history := historydb.New() + + if !db.IsReadOnly() { + if err := db.Update("build unspent indexes and init history", func(tx *dbutil.Tx) error { + headSeq, _, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if err := bc.Unspent().MaybeBuildIndexes(tx, headSeq); err != nil { + return err + } + + return initHistory(tx, bc, history) + }); err != nil { + return nil, err + } + } + + utp, err := NewUnconfirmedTransactionPool(db) + if err != nil { + return nil, err + } + + v := &Visor{ + Config: c, + startedAt: time.Now(), + db: db, + blockchain: bc, + unconfirmed: utp, + history: history, + wallets: wltServ, + } + + return v, nil +} + +// VisorConfig returns Config +func (vs *Visor) VisorConfig() Config { + return vs.Config +} + +// Init initializes starts the visor +func (vs *Visor) Init() error { + logger.Info("Visor init") + + if vs.db.IsReadOnly() { + return nil + } + + return vs.db.Update("visor init", func(tx *dbutil.Tx) error { + if err := vs.maybeCreateGenesisBlock(tx); err != nil { + return err + } + + removed, err := vs.unconfirmed.RemoveInvalid(tx, vs.blockchain) + if err != nil { + return err + } + logger.Infof("Removed %d invalid txns from pool", len(removed)) + + return nil + }) +} + +func initHistory(tx *dbutil.Tx, bc *Blockchain, history *historydb.HistoryDB) error { + logger.Info("Visor initHistory") + + shouldReset, err := history.NeedsReset(tx) + if err != nil { + return err + } + + if !shouldReset { + return nil + } + + logger.Info("Resetting historyDB") + + if err := history.Erase(tx); err != nil { + return err + } + + // Reparse the history up to the blockchain head + headSeq, _, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if err := parseHistoryTo(tx, history, bc, headSeq); err != nil { + logger.WithError(err).Error("parseHistoryTo failed") + return err + } + + return nil +} + +func parseHistoryTo(tx *dbutil.Tx, history *historydb.HistoryDB, bc *Blockchain, height uint64) error { + logger.Info("Visor parseHistoryTo") + + parsedBlockSeq, _, err := history.ParsedBlockSeq(tx) + if err != nil { + return err + } + + for i := uint64(0); i < height-parsedBlockSeq; i++ { + b, err := bc.GetSignedBlockBySeq(tx, parsedBlockSeq+i+1) + if err != nil { + return err + } + + if b == nil { + return fmt.Errorf("no block exists in depth: %d", parsedBlockSeq+i+1) + } + + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } + } + + return nil +} + +// maybeCreateGenesisBlock creates a genesis block if necessary +func (vs *Visor) maybeCreateGenesisBlock(tx *dbutil.Tx) error { + logger.Info("Visor maybeCreateGenesisBlock") + gb, err := vs.blockchain.GetGenesisBlock(tx) + if err != nil { + return err + } + if gb != nil { + return nil + } + + logger.Info("Create genesis block") + vs.GenesisPreconditions() + b, err := coin.NewGenesisBlock(vs.Config.GenesisAddress, vs.Config.GenesisCoinVolume, vs.Config.GenesisTimestamp) + if err != nil { + return err + } + + var sb coin.SignedBlock + // record the signature of genesis block + if vs.Config.IsBlockPublisher { + sb = vs.signBlock(*b) + logger.Infof("Genesis block signature=%s", sb.Sig.Hex()) + } else { + sb = coin.SignedBlock{ + Block: *b, + Sig: vs.Config.GenesisSignature, + } + } + + return vs.executeSignedBlock(tx, sb) +} + +// GenesisPreconditions panics if conditions for genesis block are not met +func (vs *Visor) GenesisPreconditions() { + if vs.Config.BlockchainSeckey != (cipher.SecKey{}) { + if vs.Config.BlockchainPubkey != cipher.MustPubKeyFromSecKey(vs.Config.BlockchainSeckey) { + logger.Panic("Cannot create genesis block. Invalid secret key for pubkey") + } + } +} + +// StartedAt returns the time that the visor was created +func (vs *Visor) StartedAt() time.Time { + return vs.startedAt +} + +// RefreshUnconfirmed checks unconfirmed txns against the blockchain and returns +// all transaction that turn to valid. +func (vs *Visor) RefreshUnconfirmed() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + if err := vs.db.Update("RefreshUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.Refresh(tx, vs.blockchain, vs.Config.Distribution, vs.Config.UnconfirmedVerifyTxn) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// RemoveInvalidUnconfirmed removes transactions that become permanently invalid +// (by violating hard constraints) from the pool. +// Returns the transaction hashes that were removed. +func (vs *Visor) RemoveInvalidUnconfirmed() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + if err := vs.db.Update("RemoveInvalidUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.RemoveInvalid(tx, vs.blockchain) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// createBlock creates a SignedBlock from pending transactions +func (vs *Visor) createBlock(tx *dbutil.Tx, when uint64) (coin.SignedBlock, error) { + if !vs.Config.IsBlockPublisher { + logger.Panic("Only a block publisher node can create blocks") + } + + // Gather all unconfirmed transactions + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + b, err := vs.createBlockFromTxns(tx, txns, when) + if err != nil { + return coin.SignedBlock{}, err + } + + return vs.signBlock(b), nil +} + +// createBlockFromTxns creates a Block from specified set of transactions according to set of determinstic rules. +func (vs *Visor) createBlockFromTxns(tx *dbutil.Tx, txns coin.Transactions, when uint64) (coin.Block, error) { + if len(txns) == 0 { + return coin.Block{}, errors.New("No transactions") + } + + logger.Infof("unconfirmed pool has %d transactions pending", len(txns)) + + // Filter transactions that violate all constraints + var filteredTxns coin.Transactions + for _, txn := range txns { + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.Distribution, vs.Config.CreateBlockVerifyTxn, TxnSigned); err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint, ErrTxnViolatesSoftConstraint: + logger.Warningf("Transaction %s violates constraints: %v", txn.Hash().Hex(), err) + default: + return coin.Block{}, err + } + } else { + filteredTxns = append(filteredTxns, txn) + } + } + + nRemoved := len(txns) - len(filteredTxns) + if nRemoved > 0 { + logger.Infof("CreateBlock ignored %d transactions violating constraints", nRemoved) + } + + txns = filteredTxns + + if len(txns) == 0 { + logger.Info("No transactions after filtering for constraint violations") + return coin.Block{}, errors.New("No transactions after filtering for constraint violations") + } + + head, err := vs.blockchain.Head(tx) + if err != nil { + return coin.Block{}, err + } + + // Sort them by highest fee per kilobyte + txns, err = coin.SortTransactions(txns, vs.blockchain.TransactionFee(tx, head.Time())) + if err != nil { + logger.Critical().WithError(err).Error("SortTransactions failed, no block can be made until the offending transaction is removed") + return coin.Block{}, err + } + + // Apply block size transaction limit + txns, err = txns.TruncateBytesTo(vs.Config.MaxBlockTransactionsSize) + if err != nil { + logger.Critical().WithError(err).Error("TruncateBytesTo failed, no block can be made until the offending transaction is removed") + return coin.Block{}, err + } + + if len(txns) > coin.MaxBlockTransactions { + txns = txns[:coin.MaxBlockTransactions] + } + + if len(txns) == 0 { + logger.Panic("TruncateBytesTo removed all transactions") + } + + logger.Infof("Creating new block with %d transactions, head time %d", len(txns), when) + + b, err := vs.blockchain.NewBlock(tx, txns, when) + if err != nil { + logger.Warningf("blockchain.NewBlock failed: %v", err) + return coin.Block{}, err + } + + return *b, nil +} + +// CreateAndExecuteBlock creates a SignedBlock from pending transactions and executes it +func (vs *Visor) CreateAndExecuteBlock() (coin.SignedBlock, error) { + var sb coin.SignedBlock + + err := vs.db.Update("CreateAndExecuteBlock", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.createBlock(tx, uint64(time.Now().UTC().Unix())) + if err != nil { + return err + } + + return vs.executeSignedBlock(tx, sb) + }) + + return sb, err +} + +// CreateBlockFromTxns creates a Block from specified set of transactions according to set of determinstic rules. +func (vs *Visor) CreateBlockFromTxns(txns coin.Transactions, when uint64) (coin.Block, error) { + var sb coin.Block + + err := vs.db.Update("CreateBlockFromTxns", func(tx *dbutil.Tx) error { + var err error + if sb, err = vs.createBlockFromTxns(tx, txns, when); err != nil { + return err + } + + return nil + }) + + return sb, err +} + +// VerifyBlock verifies specified block against local copy of blockchain. +// Signature is not verified. +func (vs *Visor) VerifyBlock(b coin.SignedBlock) error { + return vs.db.View("VerifyBlock", func(tx *dbutil.Tx) error { + return vs.blockchain.VerifyBlock(tx, &b) + }) +} + +// ExecuteSignedBlock adds a block to the blockchain, or returns error. +// Blocks must be executed in sequence, and be signed by a block publisher node. +func (vs *Visor) ExecuteSignedBlock(b coin.SignedBlock) error { + return vs.db.Update("ExecuteSignedBlock", func(tx *dbutil.Tx) error { + return vs.executeSignedBlock(tx, b) + }) +} + +// ExecuteSignedBlockUnsafe adds block to the blockchain, or returns error. +// Blocks must be executed in sequence. Block signature is not verified. +func (vs *Visor) ExecuteSignedBlockUnsafe(b coin.SignedBlock) error { + return vs.db.Update("ExecuteSignedBlockUnsafe", func(tx *dbutil.Tx) error { + return vs.executeSignedBlockUnsafe(tx, b) + }) +} + +// executeSignedBlock adds a block to the blockchain, or returns error. +// Blocks must be executed in sequence, and be signed by a block publisher node. +func (vs *Visor) executeSignedBlock(tx *dbutil.Tx, b coin.SignedBlock) error { + if err := b.VerifySignature(vs.Config.BlockchainPubkey); err != nil { + return err + } + + return vs.executeSignedBlockUnsafe(tx, b) +} + +// executeSignedBlockUnsafe add a block to the blockchain, or returns error. +// Blocks must be executed in sequence. Block signature is not verified. +func (vs *Visor) executeSignedBlockUnsafe(tx *dbutil.Tx, b coin.SignedBlock) error { + if err := vs.blockchain.ExecuteBlock(tx, &b); err != nil { + return err + } + + // Remove the transactions in the Block from the unconfirmed pool + txnHashes := make([]cipher.SHA256, 0, len(b.Block.Body.Transactions)) + for _, txn := range b.Block.Body.Transactions { + txnHashes = append(txnHashes, txn.Hash()) + } + + if err := vs.unconfirmed.RemoveTransactions(tx, txnHashes); err != nil { + return err + } + + // Update the HistoryDB + return vs.history.ParseBlock(tx, b.Block) +} + +// signBlock signs a block for a block publisher node. Will panic if anything is invalid +func (vs *Visor) signBlock(b coin.Block) coin.SignedBlock { + if !vs.Config.IsBlockPublisher { + logger.Panic("Only a block publisher node can sign blocks") + } + + sig := cipher.MustSignHash(b.HashHeader(), vs.Config.BlockchainSeckey) + + return coin.SignedBlock{ + Block: b, + Sig: sig, + } +} + +/* + Return Data +*/ + +// GetAllUnspentOutputs returns all unspent outputs +func (vs *Visor) GetAllUnspentOutputs() (coin.UxArray, error) { + var ux []coin.UxOut + if err := vs.db.View("GetAllUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + ux, err = vs.blockchain.Unspent().GetAll(tx) + return err + }); err != nil { + return nil, err + } + + return ux, nil +} + +// GetUnspentOutputs returns unspent outputs from the pool, queried by hashes. +// If any do not exist, ErrUnspentNotExist is returned +func (vs *Visor) GetUnspentOutputs(hashes []cipher.SHA256) (coin.UxArray, error) { + var outputs coin.UxArray + if err := vs.db.View("GetUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + outputs, err = vs.blockchain.Unspent().GetArray(tx, hashes) + return err + }); err != nil { + return nil, err + } + + return outputs, nil +} + +// UnconfirmedOutgoingOutputs returns all outputs that would be spent by unconfirmed transactions +func (vs *Visor) UnconfirmedOutgoingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.db.View("UnconfirmedOutgoingOutputs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.unconfirmedOutgoingOutputs(tx) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (vs *Visor) unconfirmedOutgoingOutputs(tx *dbutil.Tx) (coin.UxArray, error) { + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return nil, err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + return vs.blockchain.Unspent().GetArray(tx, inputs) +} + +// UnconfirmedIncomingOutputs returns all outputs that would be created by unconfirmed transactions +func (vs *Visor) UnconfirmedIncomingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.db.View("UnconfirmedIncomingOutputs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.unconfirmedIncomingOutputs(tx) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (vs *Visor) unconfirmedIncomingOutputs(tx *dbutil.Tx) (coin.UxArray, error) { + head, err := vs.blockchain.Head(tx) + if err != nil { + return nil, err + } + + return vs.unconfirmed.GetIncomingOutputs(tx, head.Head) +} + +// GetSignedBlocksSince returns N signed blocks more recent than Seq. Does not return nil. +func (vs *Visor) GetSignedBlocksSince(seq, ct uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetSignedBlocksSince", func(tx *dbutil.Tx) error { + avail := uint64(0) + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + headSeq := head.Seq() + if headSeq > seq { + avail = headSeq - seq + } + if avail < ct { + ct = avail + } + if ct == 0 { + return nil + } + + blocks = make([]coin.SignedBlock, 0, ct) + for j := uint64(0); j < ct; j++ { + i := seq + 1 + j + b, err := vs.blockchain.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + blocks = append(blocks, *b) + } + + return nil + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// HeadBkSeq returns the highest BkSeq we know, returns false in the 2nd return value +// if the blockchain is empty +func (vs *Visor) HeadBkSeq() (uint64, bool, error) { + var headSeq uint64 + var ok bool + + if err := vs.db.View("HeadBkSeq", func(tx *dbutil.Tx) error { + var err error + headSeq, ok, err = vs.blockchain.HeadSeq(tx) + return err + }); err != nil { + return 0, false, err + } + + return headSeq, ok, nil +} + +// GetBlockchainMetadata returns descriptive blockchain information +func (vs *Visor) GetBlockchainMetadata() (*BlockchainMetadata, error) { + var head *coin.SignedBlock + var unconfirmedLen, unspentsLen uint64 + + if err := vs.db.View("GetBlockchainMetadata", func(tx *dbutil.Tx) error { + var err error + head, err = vs.blockchain.Head(tx) + if err != nil { + return err + } + + unconfirmedLen, err = vs.unconfirmed.Len(tx) + if err != nil { + return err + } + + unspentsLen, err = vs.blockchain.Unspent().Len(tx) + return err + }); err != nil { + return nil, err + } + + return NewBlockchainMetadata(*head, unconfirmedLen, unspentsLen) +} + +// GetBlock returns a copy of the block at seq. Returns error if seq out of range +func (vs *Visor) GetBlock(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.db.View("GetBlock", func(tx *dbutil.Tx) error { + headSeq, ok, err := vs.blockchain.HeadSeq(tx) + if err != nil { + return err + } + + if !ok || seq > headSeq { + return errors.New("Block seq out of range") + } + + b, err = vs.blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetBlocks returns blocks matches seqs +func (vs *Visor) GetBlocks(seqs []uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.blockchain.GetBlocks(tx, seqs) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetBlocksVerbose returns blocks matches seqs along with verbose transaction input data +func (vs *Visor) GetBlocksVerbose(seqs []uint64) ([]coin.SignedBlock, [][][]TransactionInput, error) { + var blocks []coin.SignedBlock + var inputs [][][]TransactionInput + + if err := vs.db.View("GetBlocksVerbose", func(tx *dbutil.Tx) error { + var err error + blocks, inputs, err = vs.getBlocksVerbose(tx, func(tx *dbutil.Tx) ([]coin.SignedBlock, error) { + return vs.blockchain.GetBlocks(tx, seqs) + }) + return err + }); err != nil { + return nil, nil, err + } + + return blocks, inputs, nil +} + +// GetBlocksInRange returns multiple blocks between start and end, including both start and end. +// Returns the empty slice if unable to fulfill request. +func (vs *Visor) GetBlocksInRange(start, end uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetBlocksInRange", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.blockchain.GetBlocksInRange(tx, start, end) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetBlocksInRangeVerbose returns multiple blocks between start and end, including both start and end. +// Also returns the verbose transaction input data for transactions in these blocks. +// Returns the empty slice if unable to fulfill request. +func (vs *Visor) GetBlocksInRangeVerbose(start, end uint64) ([]coin.SignedBlock, [][][]TransactionInput, error) { + var blocks []coin.SignedBlock + var inputs [][][]TransactionInput + + if err := vs.db.View("GetBlocksInRangeVerbose", func(tx *dbutil.Tx) error { + var err error + blocks, inputs, err = vs.getBlocksVerbose(tx, func(tx *dbutil.Tx) ([]coin.SignedBlock, error) { + return vs.blockchain.GetBlocksInRange(tx, start, end) + }) + return err + }); err != nil { + return nil, nil, err + } + + return blocks, inputs, nil +} + +// GetLastBlocks returns last N blocks +func (vs *Visor) GetLastBlocks(num uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetLastBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.blockchain.GetLastBlocks(tx, num) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetLastBlocksVerbose returns last N blocks with verbose transaction input data +func (vs *Visor) GetLastBlocksVerbose(num uint64) ([]coin.SignedBlock, [][][]TransactionInput, error) { + var blocks []coin.SignedBlock + var inputs [][][]TransactionInput + + if err := vs.db.View("GetLastBlocksVerbose", func(tx *dbutil.Tx) error { + var err error + blocks, inputs, err = vs.getBlocksVerbose(tx, func(tx *dbutil.Tx) ([]coin.SignedBlock, error) { + return vs.blockchain.GetLastBlocks(tx, num) + }) + return err + }); err != nil { + return nil, nil, err + } + + return blocks, inputs, nil +} + +func (vs *Visor) getBlocksVerbose(tx *dbutil.Tx, getBlocks func(*dbutil.Tx) ([]coin.SignedBlock, error)) ([]coin.SignedBlock, [][][]TransactionInput, error) { + blocks, err := getBlocks(tx) + if err != nil { + return nil, nil, err + } + + if len(blocks) == 0 { + return nil, nil, nil + } + + inputs := make([][][]TransactionInput, len(blocks)) + for i, b := range blocks { + blockInputs, err := vs.getBlockInputs(tx, &b) + if err != nil { + return nil, nil, err + } + inputs[i] = blockInputs + } + + return blocks, inputs, nil +} + +// InjectForeignTransaction records a coin.Transaction to the UnconfirmedTransactionPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard constraints, it is rejected, and error will not be nil. +// If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. +// This method is intended for transactions received over the network. +func (vs *Visor) InjectForeignTransaction(txn coin.Transaction) (bool, *ErrTxnViolatesSoftConstraint, error) { + var known bool + var softErr *ErrTxnViolatesSoftConstraint + + if err := vs.db.Update("InjectForeignTransaction", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = vs.unconfirmed.InjectTransaction(tx, vs.blockchain, txn, vs.Config.Distribution, vs.Config.UnconfirmedVerifyTxn) + return err + }); err != nil { + return false, nil, err + } + + return known, softErr, nil +} + +// InjectUserTransaction records a coin.Transaction to the UnconfirmedTransactionPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard or soft constraints, it is rejected, and error will not be nil. +func (vs *Visor) InjectUserTransaction(txn coin.Transaction) (bool, *coin.SignedBlock, coin.UxArray, error) { + var known bool + var head *coin.SignedBlock + var inputs coin.UxArray + + if err := vs.db.Update("InjectUserTransaction", func(tx *dbutil.Tx) error { + var err error + known, head, inputs, err = vs.InjectUserTransactionTx(tx, txn) + return err + }); err != nil { + return false, nil, nil, err + } + + return known, head, inputs, nil +} + +// InjectUserTransactionTx records a coin.Transaction to the UnconfirmedTransactionPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard or soft constraints, it is rejected, and error will not be nil. +// This method is only exported for use by the daemon gateway's InjectBroadcastTransaction method. +func (vs *Visor) InjectUserTransactionTx(tx *dbutil.Tx, txn coin.Transaction) (bool, *coin.SignedBlock, coin.UxArray, error) { + if err := VerifySingleTxnUserConstraints(txn); err != nil { + return false, nil, nil, err + } + + head, inputs, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.Distribution, params.UserVerifyTxn, TxnSigned) + if err != nil { + return false, nil, nil, err + } + + known, softErr, err := vs.unconfirmed.InjectTransaction(tx, vs.blockchain, txn, vs.Config.Distribution, params.UserVerifyTxn) + if softErr != nil { + logger.WithError(softErr).Warning("InjectUserTransaction vs.unconfirmed.InjectTransaction returned a softErr unexpectedly") + } + + return known, head, inputs, err +} + +// GetTransactionsForAddress returns the Transactions whose unspents give coins to a cipher.Address. +// This includes both confirmed and unconfirmed transactions. +func (vs *Visor) GetTransactionsForAddress(a cipher.Address) ([]Transaction, error) { + var txns map[cipher.Address][]Transaction + + if err := vs.db.View("GetTransactionsForAddress", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.getTransactionsForAddresses(tx, []cipher.Address{a}) + return err + }); err != nil { + return nil, err + } + + return txns[a], nil +} + +// GetTransaction returns a Transaction by hash. +func (vs *Visor) GetTransaction(txnHash cipher.SHA256) (*Transaction, error) { + var txn *Transaction + + if err := vs.db.View("GetTransaction", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.getTransaction(tx, txnHash) + return err + }); err != nil { + return nil, err + } + + return txn, nil +} + +// GetTransactionWithInputs returns a Transaction by hash, along with the unspent outputs of its inputs +func (vs *Visor) GetTransactionWithInputs(txnHash cipher.SHA256) (*Transaction, []TransactionInput, error) { + var txn *Transaction + var inputs []TransactionInput + + if err := vs.db.View("GetTransactionWithInputs", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.getTransaction(tx, txnHash) + if err != nil { + return err + } + + if txn == nil { + return nil + } + + feeCalcTime, err := vs.getFeeCalcTimeForTransaction(tx, *txn) + if err != nil { + return err + } + if feeCalcTime == nil { + return nil + } + + inputs, err = vs.getTransactionInputs(tx, *feeCalcTime, txn.Transaction.In) + return err + }); err != nil { + return nil, nil, err + } + + return txn, inputs, nil +} + +func (vs *Visor) getTransaction(tx *dbutil.Tx, txnHash cipher.SHA256) (*Transaction, error) { + // Look in the unconfirmed pool + utxn, err := vs.unconfirmed.Get(tx, txnHash) + if err != nil { + return nil, err + } + + if utxn != nil { + return &Transaction{ + Transaction: utxn.Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(utxn.Received).Unix()), + }, nil + } + + htxn, err := vs.history.GetTransaction(tx, txnHash) + if err != nil { + return nil, err + } + + if htxn == nil { + return nil, nil + } + + headSeq, ok, err := vs.blockchain.HeadSeq(tx) + if err != nil { + return nil, err + } else if !ok { + return nil, errors.New("blockchain is empty but history has transactions") + } + + b, err := vs.blockchain.GetSignedBlockBySeq(tx, htxn.BlockSeq) + if err != nil { + return nil, err + } + + if b == nil { + return nil, fmt.Errorf("found no block in seq %v", htxn.BlockSeq) + } + + if headSeq < htxn.BlockSeq { + return nil, fmt.Errorf("blockchain head seq %d is earlier than history txn seq %d", headSeq, htxn.BlockSeq) + } + + confirms := headSeq - htxn.BlockSeq + 1 + return &Transaction{ + Transaction: htxn.Txn, + Status: NewConfirmedTransactionStatus(confirms, htxn.BlockSeq), + Time: b.Time(), + }, nil +} + +// TxFilter transaction filter type +type TxFilter interface { + // Returns whether the transaction is matched + Match(*Transaction) bool +} + +// BaseFilter is a helper struct for generating TxFilter. +type BaseFilter struct { + F func(tx *Transaction) bool +} + +// Match matches the filter based upon F +func (f BaseFilter) Match(tx *Transaction) bool { + return f.F(tx) +} + +// NewAddrsFilter collects all addresses related transactions. +func NewAddrsFilter(addrs []cipher.Address) TxFilter { + return AddrsFilter{Addrs: addrs} +} + +// AddrsFilter filters by addresses +type AddrsFilter struct { + Addrs []cipher.Address +} + +// Match implements the TxFilter interface, this actually won't be used, only the 'Addrs' member is used. +func (af AddrsFilter) Match(tx *Transaction) bool { return true } + +// NewConfirmedTxFilter collects the transaction whose 'Confirmed' status matchs the parameter passed in. +func NewConfirmedTxFilter(isConfirmed bool) TxFilter { + return BaseFilter{F: func(tx *Transaction) bool { + return tx.Status.Confirmed == isConfirmed + }} +} + +// GetTransactions returns transactions that can pass the filters. +// If no filters is provided, returns all transactions. +func (vs *Visor) GetTransactions(flts []TxFilter) ([]Transaction, error) { + var txns []Transaction + + if err := vs.db.View("GetTransactions", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.getTransactions(tx, flts) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetTransactionsWithInputs is the same as GetTransactions but also returns verbose transaction input data +func (vs *Visor) GetTransactionsWithInputs(flts []TxFilter) ([]Transaction, [][]TransactionInput, error) { + var txns []Transaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetTransactionsWithInputs", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.getTransactions(tx, flts) + if err != nil { + return err + } + + inputs = make([][]TransactionInput, len(txns)) + for i, txn := range txns { + feeCalcTime, err := vs.getFeeCalcTimeForTransaction(tx, txn) + if err != nil { + return err + } + if feeCalcTime == nil { + continue + } + + txnInputs, err := vs.getTransactionInputs(tx, *feeCalcTime, txn.Transaction.In) + if err != nil { + return err + } + + inputs[i] = txnInputs + } + + return nil + }); err != nil { + return nil, nil, err + } + + return txns, inputs, nil +} + +func (vs *Visor) getTransactions(tx *dbutil.Tx, flts []TxFilter) ([]Transaction, error) { + var addrFlts []AddrsFilter + var otherFlts []TxFilter + // Splits the filters into AddrsFilter and other filters + for _, f := range flts { + switch v := f.(type) { + case AddrsFilter: + addrFlts = append(addrFlts, v) + default: + otherFlts = append(otherFlts, f) + } + } + + // Accumulates all addresses in address filters + addrs := accumulateAddressInFilter(addrFlts) + + // Traverses all transactions to do collection if there's no address filter. + if len(addrs) == 0 { + return vs.traverseTxns(tx, otherFlts) + } + + // Gets addresses related transactions + addrTxns, err := vs.getTransactionsForAddresses(tx, addrs) + if err != nil { + return nil, err + } + + // Converts address transactions map into []Transaction, + // and remove duplicate txns + txnMap := make(map[cipher.SHA256]struct{}) + var txns []Transaction + for _, aTxns := range addrTxns { + for _, txn := range aTxns { + txnHash := txn.Transaction.Hash() + if _, exist := txnMap[txnHash]; exist { + continue + } + txnMap[txnHash] = struct{}{} + txns = append(txns, txn) + } + } + + // Checks other filters + f := func(txn *Transaction, flts []TxFilter) bool { + for _, flt := range flts { + if !flt.Match(txn) { + return false + } + } + + return true + } + + var retTxns []Transaction + for _, txn := range txns { + if f(&txn, otherFlts) { + retTxns = append(retTxns, txn) + } + } + + return retTxns, nil +} + +func accumulateAddressInFilter(afs []AddrsFilter) []cipher.Address { + // Accumulate all addresses in address filters + addrMap := make(map[cipher.Address]struct{}) + var addrs []cipher.Address + for _, af := range afs { + for _, a := range af.Addrs { + if _, exist := addrMap[a]; exist { + continue + } + addrMap[a] = struct{}{} + addrs = append(addrs, a) + } + } + return addrs +} + +// getTransactionsForAddresses returns all addresses related transactions. +// Including both confirmed and unconfirmed transactions. +func (vs *Visor) getTransactionsForAddresses(tx *dbutil.Tx, addrs []cipher.Address) (map[cipher.Address][]Transaction, error) { + // Get the head block seq, for calculating the txn status + headBkSeq, ok, err := vs.blockchain.HeadSeq(tx) + + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("No head block seq") + } + + ret := make(map[cipher.Address][]Transaction, len(addrs)) + for _, a := range addrs { + addrTxns, err := vs.history.GetTransactionsForAddress(tx, a) + if err != nil { + return nil, err + } + + txns := make([]Transaction, len(addrTxns), len(addrTxns)+4) + for i, txn := range addrTxns { + if headBkSeq < txn.BlockSeq { + err := errors.New("Transaction block sequence is greater than the head block sequence") + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "headBkSeq": headBkSeq, + "txnBlockSeq": txn.BlockSeq, + }).Error() + return nil, err + } + h := headBkSeq - txn.BlockSeq + 1 + + bk, err := vs.blockchain.GetSignedBlockBySeq(tx, txn.BlockSeq) + if err != nil { + return nil, err + } + + if bk == nil { + return nil, fmt.Errorf("block seq=%d doesn't exist", txn.BlockSeq) + } + + txns[i] = Transaction{ + Transaction: txn.Txn, + Status: NewConfirmedTransactionStatus(h, txn.BlockSeq), + Time: bk.Time(), + } + } + + // Look in the unconfirmed pool + uxs, err := vs.unconfirmed.GetUnspentsOfAddr(tx, a) + if err != nil { + return nil, err + } + + for _, ux := range uxs { + txn, err := vs.unconfirmed.Get(tx, ux.Body.SrcTransaction) + if err != nil { + return nil, err + } + + if txn == nil { + logger.Critical().Error("unconfirmed unspent missing unconfirmed txn") + continue + } + + txns = append(txns, Transaction{ + Transaction: txn.Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(txn.Received).Unix()), + }) + } + + ret[a] = txns + } + + return ret, nil +} + +// traverseTxns traverses transactions in historydb and unconfirmed tx pool in db, +// returns transactions that can pass the filters. +func (vs *Visor) traverseTxns(tx *dbutil.Tx, flts []TxFilter) ([]Transaction, error) { + // Get the head block seq, for calculating the tx status + headBkSeq, ok, err := vs.blockchain.HeadSeq(tx) + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("No head block seq") + } + + var txns []Transaction + + if err := vs.history.ForEachTxn(tx, func(_ cipher.SHA256, hTxn *historydb.Transaction) error { + if headBkSeq < hTxn.BlockSeq { + err := errors.New("Transaction block sequence is less than the head block sequence") + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "headBkSeq": headBkSeq, + "txBlockSeq": hTxn.BlockSeq, + }).Error() + return err + } + + h := headBkSeq - hTxn.BlockSeq + 1 + + bk, err := vs.blockchain.GetSignedBlockBySeq(tx, hTxn.BlockSeq) + if err != nil { + return fmt.Errorf("get block of seq: %v failed: %v", hTxn.BlockSeq, err) + } + + if bk == nil { + return fmt.Errorf("block of seq: %d doesn't exist", hTxn.BlockSeq) + } + + txn := Transaction{ + Transaction: hTxn.Txn, + Status: NewConfirmedTransactionStatus(h, hTxn.BlockSeq), + Time: bk.Time(), + } + + // Checks filters + for _, f := range flts { + if !f.Match(&txn) { + return nil + } + } + + txns = append(txns, txn) + return nil + }); err != nil { + return nil, err + } + + txns = sortTxns(txns) + + // Gets all unconfirmed transactions + unconfirmedTxns, err := vs.unconfirmed.GetFiltered(tx, func(txn UnconfirmedTransaction) bool { + return true + }) + if err != nil { + return nil, err + } + + for _, ux := range unconfirmedTxns { + txn := Transaction{ + Transaction: ux.Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(ux.Received).Unix()), + } + + // Checks filters + for _, f := range flts { + if !f.Match(&txn) { + continue + } + txns = append(txns, txn) + } + } + return txns, nil +} + +// Sort transactions by block seq, if equal then compare hash +func sortTxns(txns []Transaction) []Transaction { + sort.Slice(txns, func(i, j int) bool { + if txns[i].Status.BlockSeq < txns[j].Status.BlockSeq { + return true + } + + if txns[i].Status.BlockSeq > txns[j].Status.BlockSeq { + return false + } + + // If transactions in the same block, compare the hash string + return txns[i].Transaction.Hash().Hex() < txns[j].Transaction.Hash().Hex() + }) + return txns +} + +// AddressBalances computes the total balance for cipher.Addresses and their coin.UxOuts +func (vs *Visor) AddressBalances(head *coin.SignedBlock, auxs coin.AddressUxOuts) (uint64, uint64, error) { + prevTime := head.Time() + var coins uint64 + var hours uint64 + for _, uxs := range auxs { + for _, ux := range uxs { + uxHours, err := ux.CoinHours(prevTime) + if err != nil { + return 0, 0, err + } + + coins, err = mathutil.AddUint64(coins, ux.Body.Coins) + if err != nil { + return 0, 0, err + } + + hours, err = mathutil.AddUint64(hours, uxHours) + if err != nil { + return 0, 0, err + } + } + } + return coins, hours, nil +} + +// GetUnconfirmedTransactions gets all confirmed transactions of specific addresses +func (vs *Visor) GetUnconfirmedTransactions(filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := vs.db.View("GetUnconfirmedTransactions", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, filter) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetUnconfirmedTransactionsVerbose gets all confirmed transactions of specific addresses +func (vs *Visor) GetUnconfirmedTransactionsVerbose(filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, [][]TransactionInput, error) { + var txns []UnconfirmedTransaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetUnconfirmedTransactionsVerbose", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, filter) + if err != nil { + return err + } + + inputs, err = vs.getTransactionInputsForUnconfirmedTxns(tx, txns) + + return err + }); err != nil { + return nil, nil, err + } + + if len(txns) == 0 { + return nil, nil, nil + } + + return txns, inputs, nil +} + +// SendsToAddresses represents a filter that check if tx has output to the given addresses +func SendsToAddresses(addresses []cipher.Address) func(UnconfirmedTransaction) bool { + return func(tx UnconfirmedTransaction) (isRelated bool) { + for _, out := range tx.Transaction.Out { + for _, address := range addresses { + if out.Address == address { + isRelated = true + return + } + } + } + return + } +} + +// GetAllUnconfirmedTransactions returns all unconfirmed transactions +func (vs *Visor) GetAllUnconfirmedTransactions() ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := vs.db.View("GetAllUnconfirmedTransactions", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, All) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetAllUnconfirmedTransactionsVerbose returns all unconfirmed transactions with verbose transaction input data +func (vs *Visor) GetAllUnconfirmedTransactionsVerbose() ([]UnconfirmedTransaction, [][]TransactionInput, error) { + var txns []UnconfirmedTransaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetAllUnconfirmedTransactionsVerbose", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, All) + if err != nil { + return err + } + + inputs, err = vs.getTransactionInputsForUnconfirmedTxns(tx, txns) + + return err + }); err != nil { + return nil, nil, err + } + + if len(txns) == 0 { + return nil, nil, nil + } + + return txns, inputs, nil +} + +// getTransactionInputsForUnconfirmedTxns returns ReadableTransactionInputs for a set of UnconfirmedTransactions +func (vs *Visor) getTransactionInputsForUnconfirmedTxns(tx *dbutil.Tx, txns []UnconfirmedTransaction) ([][]TransactionInput, error) { + if len(txns) == 0 { + return nil, nil + } + + // Use the current head time to calculate estimated coin hours of unconfirmed transactions + headTime, err := vs.blockchain.Time(tx) + if err != nil { + return nil, err + } + + inputs := make([][]TransactionInput, len(txns)) + for i, txn := range txns { + if len(txn.Transaction.In) == 0 { + logger.Critical().WithField("txid", txn.Transaction.Hash().Hex()).Warning("unconfirmed transaction has no inputs") + continue + } + + txnInputs, err := vs.getTransactionInputs(tx, headTime, txn.Transaction.In) + if err != nil { + return nil, err + } + + inputs[i] = txnInputs + } + + return inputs, nil +} + +// getFeeCalcTimeForTransaction returns the time against which a transaction's fee should be calculated. +// The genesis block has no inputs and thus no fee to calculate, so it returns nil. +// A confirmed transaction's fee was calculated from the previous block's head time, when it was executed. +// An unconfirmed transaction's fee will be calculated from the current block head time, once executed. +func (vs *Visor) getFeeCalcTimeForTransaction(tx *dbutil.Tx, txn Transaction) (*uint64, error) { + // The genesis block has no inputs to calculate, otherwise calculate the inputs + if txn.Status.BlockSeq == 0 && txn.Status.Confirmed { + return nil, nil + } + + feeCalcTime := uint64(0) + if txn.Status.Confirmed { + // Use the previous block head to calculate the coin hours + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, txn.Status.BlockSeq-1) + if err != nil { + return nil, err + } + + if prevBlock == nil { + err := fmt.Errorf("getFeeCalcTimeForTransaction: prevBlock seq=%d not found", txn.Status.BlockSeq-1) + logger.Critical().WithError(err).Error("getFeeCalcTimeForTransaction") + return nil, err + } + + feeCalcTime = prevBlock.Block.Head.Time + } else { + // Use the current block head to calculate the coin hours + var err error + feeCalcTime, err = vs.blockchain.Time(tx) + if err != nil { + return nil, err + } + } + + return &feeCalcTime, nil +} + +// GetAllValidUnconfirmedTxHashes returns all valid unconfirmed transaction hashes +func (vs *Visor) GetAllValidUnconfirmedTxHashes() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.db.View("GetAllValidUnconfirmedTxHashes", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.GetHashes(tx, IsValid) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// GetConfirmedTransaction returns transaction, which has been already included in some block. +func (vs *Visor) GetConfirmedTransaction(txnHash cipher.SHA256) (*coin.Transaction, error) { + var histTxn *historydb.Transaction + + if err := vs.db.View("GetConfirmedTransaction", func(tx *dbutil.Tx) error { + var err error + histTxn, err = vs.history.GetTransaction(tx, txnHash) + return err + }); err != nil { + return nil, err + } + + // Transaction not found. + if histTxn == nil { + return nil, nil + } + + return &histTxn.Txn, nil +} + +// GetSignedBlockByHash get block of specific hash header, return nil on not found. +func (vs *Visor) GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { + var sb *coin.SignedBlock + + if err := vs.db.View("GetSignedBlockByHash", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.blockchain.GetSignedBlockByHash(tx, hash) + return err + }); err != nil { + return nil, err + } + + return sb, nil +} + +// GetSignedBlockBySeq get block of specific seq, return nil on not found. +func (vs *Visor) GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.db.View("GetSignedBlockBySeq", func(tx *dbutil.Tx) error { + var err error + b, err = vs.blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetSignedBlockByHashVerbose returns a coin.SignedBlock and its transactions' input data for a given block hash +func (vs *Visor) GetSignedBlockByHashVerbose(hash cipher.SHA256) (*coin.SignedBlock, [][]TransactionInput, error) { + var b *coin.SignedBlock + var inputs [][]TransactionInput + + if err := vs.db.View("GetSignedBlockByHashVerbose", func(tx *dbutil.Tx) error { + var err error + b, inputs, err = vs.getBlockVerbose(tx, func(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return vs.blockchain.GetSignedBlockByHash(tx, hash) + }) + return err + }); err != nil { + return nil, nil, err + } + + return b, inputs, nil +} + +// GetSignedBlockBySeqVerbose returns a coin.SignedBlock and its transactions' input data for a given block hash +func (vs *Visor) GetSignedBlockBySeqVerbose(seq uint64) (*coin.SignedBlock, [][]TransactionInput, error) { + var b *coin.SignedBlock + var inputs [][]TransactionInput + + if err := vs.db.View("GetSignedBlockBySeqVerbose", func(tx *dbutil.Tx) error { + var err error + b, inputs, err = vs.getBlockVerbose(tx, func(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return vs.blockchain.GetSignedBlockBySeq(tx, seq) + }) + return err + }); err != nil { + return nil, nil, err + } + + return b, inputs, nil +} + +func (vs *Visor) getBlockVerbose(tx *dbutil.Tx, getBlock func(*dbutil.Tx) (*coin.SignedBlock, error)) (*coin.SignedBlock, [][]TransactionInput, error) { + b, err := getBlock(tx) + if err != nil { + return nil, nil, err + } + + if b == nil { + return nil, nil, nil + } + + inputs, err := vs.getBlockInputs(tx, b) + if err != nil { + return nil, nil, err + } + + return b, inputs, nil +} + +func (vs *Visor) getBlockInputs(tx *dbutil.Tx, b *coin.SignedBlock) ([][]TransactionInput, error) { + if b == nil { + return nil, nil + } + + // The genesis block has no inputs to query or to calculate fees from + if b.Block.Head.BkSeq == 0 { + if len(b.Block.Body.Transactions) != 1 { + logger.Panicf("Genesis block should have only 1 transaction (has %d)", len(b.Block.Body.Transactions)) + } + + if len(b.Block.Body.Transactions[0].In) != 0 { + logger.Panic("Genesis block transaction should not have inputs") + } + + inputs := make([][]TransactionInput, 1) + + return inputs, nil + } + + // When a transaction was added to a block, its coinhour fee was + // calculated based upon the time of the head block. + // So we need to look at the previous block + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, b.Head.BkSeq-1) + if err != nil { + return nil, err + } + + if prevBlock == nil { + err := fmt.Errorf("getBlockInputs: prevBlock seq %d not found", b.Head.BkSeq-1) + logger.Critical().WithError(err).Error() + return nil, err + } + + var inputs [][]TransactionInput + for _, txn := range b.Block.Body.Transactions { + i, err := vs.getTransactionInputs(tx, prevBlock.Block.Head.Time, txn.In) + if err != nil { + return nil, err + } + + inputs = append(inputs, i) + } + + return inputs, nil +} + +// getTransactionInputs returns []TransactionInput for a given set of spent output hashes. +// feeCalcTime is the time against which to calculate the coinhours of the output +func (vs *Visor) getTransactionInputs(tx *dbutil.Tx, feeCalcTime uint64, inputs []cipher.SHA256) ([]TransactionInput, error) { + if len(inputs) == 0 { + err := errors.New("getTransactionInputs: inputs is empty only the genesis block transaction has no inputs, which shouldn't call this method") + logger.WithError(err).Error() + return nil, err + } + + uxOuts, err := vs.history.GetUxOuts(tx, inputs) + if err != nil { + logger.WithError(err).Error("getTransactionInputs GetUxOuts failed") + return nil, err + } + + ret := make([]TransactionInput, len(inputs)) + for i, o := range uxOuts { + r, err := NewTransactionInput(o.Out, feeCalcTime) + if err != nil { + logger.WithError(err).Error("getTransactionInputs NewTransactionInput failed") + return nil, err + } + ret[i] = r + } + + return ret, nil +} + +// GetHeadBlock gets head block. +func (vs Visor) GetHeadBlock() (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.db.View("GetHeadBlock", func(tx *dbutil.Tx) error { + var err error + b, err = vs.blockchain.Head(tx) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetHeadBlockTime returns the time of the head block. +func (vs Visor) GetHeadBlockTime() (uint64, error) { + var t uint64 + + if err := vs.db.View("GetHeadBlockTime", func(tx *dbutil.Tx) error { + var err error + t, err = vs.blockchain.Time(tx) + return err + }); err != nil { + return 0, err + } + + return t, nil +} + +// GetUxOutByID gets UxOut by hash id. +func (vs Visor) GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) { + var outs []historydb.UxOut + + if err := vs.db.View("GetUxOutByID", func(tx *dbutil.Tx) error { + var err error + outs, err = vs.history.GetUxOuts(tx, []cipher.SHA256{id}) + return err + }); err != nil { + return nil, err + } + + if len(outs) == 0 { + return nil, nil + } + + return &outs[0], nil +} + +// GetSpentOutputsForAddresses gets all the spent outputs of a set of addresses +func (vs Visor) GetSpentOutputsForAddresses(addresses []cipher.Address) ([][]historydb.UxOut, error) { + out := make([][]historydb.UxOut, len(addresses)) + + if err := vs.db.View("GetSpentOutputsForAddresses", func(tx *dbutil.Tx) error { + for i, addr := range addresses { + addrUxOuts, err := vs.history.GetOutputsForAddress(tx, addr) + if err != nil { + return err + } + + out[i] = addrUxOuts + } + + return nil + }); err != nil { + return nil, err + } + + return out, nil +} + +// RecvOfAddresses returns unconfirmed receiving uxouts of addresses +func (vs *Visor) RecvOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxouts coin.AddressUxOuts + + if err := vs.db.View("RecvOfAddresses", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + uxouts, err = vs.unconfirmed.RecvOfAddresses(tx, head.Head, addrs) + return err + }); err != nil { + return nil, err + } + + return uxouts, nil +} + +// GetIncomingOutputs returns all predicted outputs that are in pending tx pool +func (vs *Visor) GetIncomingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.db.View("GetIncomingOutputs", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.unconfirmed.GetIncomingOutputs(tx, head.Head) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// GetUnconfirmedTxn gets an unconfirmed transaction from the DB +func (vs *Visor) GetUnconfirmedTxn(hash cipher.SHA256) (*UnconfirmedTransaction, error) { + var txn *UnconfirmedTransaction + + if err := vs.db.View("GetUnconfirmedTxn", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.unconfirmed.Get(tx, hash) + return err + }); err != nil { + return nil, err + } + + return txn, nil +} + +// FilterKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (vs *Visor) FilterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.db.View("FilterKnownUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.FilterKnown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// GetKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (vs *Visor) GetKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) { + var hashes coin.Transactions + + if err := vs.db.View("GetKnownUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.GetKnown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// UnconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) UnconfirmedSpendsOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var outs coin.AddressUxOuts + + if err := vs.db.View("UnconfirmedSpendsOfAddresses", func(tx *dbutil.Tx) error { + var err error + outs, err = vs.unconfirmedSpendsOfAddresses(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return outs, nil +} + +// unconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) unconfirmedSpendsOfAddresses(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return nil, err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + uxa, err := vs.blockchain.Unspent().GetArray(tx, inputs) + if err != nil { + return nil, err + } + + outs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + outs[ux.Body.Address] = append(outs[ux.Body.Address], ux) + } + } + + return outs, nil +} + +// SetTransactionsAnnounced updates announced time of specific tx +func (vs *Visor) SetTransactionsAnnounced(hashes map[cipher.SHA256]int64) error { + if len(hashes) == 0 { + return nil + } + + return vs.db.Update("SetTransactionsAnnounced", func(tx *dbutil.Tx) error { + return vs.unconfirmed.SetTransactionsAnnounced(tx, hashes) + }) +} + +// GetBalanceOfAddresses returns balance pairs of given addreses +func (vs Visor) GetBalanceOfAddresses(addrs []cipher.Address) ([]wallet.BalancePair, error) { + if len(addrs) == 0 { + return nil, nil + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + recvUxs := make(coin.AddressUxOuts, len(addrs)) + var uxa coin.UxArray + var head *coin.SignedBlock + + if err := vs.db.View("GetBalanceOfAddresses", func(tx *dbutil.Tx) error { + var err error + head, err = vs.blockchain.Head(tx) + if err != nil { + return err + } + + // Get all transactions from the unconfirmed pool + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return err + } + + // Create predicted unspent outputs from the unconfirmed transactions + recvUxs, err = txnOutputsForAddrs(head.Head, addrs, txns) + if err != nil { + return err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + // Get unspents for the inputs being spent + uxa, err = vs.blockchain.Unspent().GetArray(tx, inputs) + if err != nil { + return fmt.Errorf("GetArray failed when checking addresses balance: %v", err) + } + + // Get unspents owned by the addresses + auxs, err = vs.blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + if err != nil { + return fmt.Errorf("GetUnspentsOfAddrs failed when checking addresses balance: %v", err) + } + + return nil + }); err != nil { + return nil, err + } + + // Build all unconfirmed transaction inputs that are associated with the addresses + spendUxs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + spendUxs[ux.Body.Address] = append(spendUxs[ux.Body.Address], ux) + } + } + + var bps []wallet.BalancePair + + headTime := head.Time() + for _, addr := range addrs { + uxs, ok := auxs[addr] + if !ok { + bps = append(bps, wallet.BalancePair{}) + continue + } + + outUxs := spendUxs[addr] + inUxs := recvUxs[addr] + predictedUxs := uxs.Sub(outUxs).Add(inUxs) + + coins, err := uxs.Coins() + if err != nil { + return nil, fmt.Errorf("uxs.Coins failed: %v", err) + } + + coinHours, err := uxs.CoinHours(headTime) + if err != nil { + switch err { + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + coinHours = 0 + default: + return nil, fmt.Errorf("uxs.CoinHours failed: %v", err) + } + } + + pcoins, err := predictedUxs.Coins() + if err != nil { + return nil, fmt.Errorf("predictedUxs.Coins failed: %v", err) + } + + pcoinHours, err := predictedUxs.CoinHours(headTime) + if err != nil { + switch err { + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + coinHours = 0 + default: + return nil, fmt.Errorf("predictedUxs.CoinHours failed: %v", err) + } + } + + bp := wallet.BalancePair{ + Confirmed: wallet.Balance{ + Coins: coins, + Hours: coinHours, + }, + Predicted: wallet.Balance{ + Coins: pcoins, + Hours: pcoinHours, + }, + } + + bps = append(bps, bp) + } + + return bps, nil +} + +// GetUnspentsOfAddrs returns unspent outputs of multiple addresses +func (vs *Visor) GetUnspentsOfAddrs(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxa coin.AddressUxOuts + + if err := vs.db.View("GetUnspentsOfAddrs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// VerifyTxnVerbose verifies a transaction, it returns transaction's input uxouts, whether the +// transaction is confirmed, and error if any +func (vs *Visor) VerifyTxnVerbose(txn *coin.Transaction, signed TxnSignedFlag) ([]TransactionInput, bool, error) { + var uxa coin.UxArray + var isTxnConfirmed bool + var feeCalcTime uint64 + + verifyErr := vs.db.View("VerifyTxnVerbose", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.blockchain.Unspent().GetArray(tx, txn.In) + switch e := err.(type) { + case nil: + // For unconfirmed transactions, use the blockchain head time to calculate hours + feeCalcTime = head.Time() + + case blockdb.ErrUnspentNotExist: + // Gets uxouts of txn.In from historydb + outs, err := vs.history.GetUxOuts(tx, txn.In) + if err != nil { + return err + } + + if len(outs) == 0 { + err = fmt.Errorf("transaction input of %s does not exist in either unspent pool or historydb", e.UxID) + return NewErrTxnViolatesHardConstraint(err) + } + + uxa = coin.UxArray{} + for _, out := range outs { + uxa = append(uxa, out.Out) + } + + // Checks if the transaction is confirmed + txnHash := txn.Hash() + historyTxn, err := vs.history.GetTransaction(tx, txnHash) + if err != nil { + return fmt.Errorf("get transaction of %v from historydb failed: %v", txnHash, err) + } + + if historyTxn != nil { + // Transaction is confirmed + isTxnConfirmed = true + } + + // For confirmed transactions, use the previous block time to calculate hours and fees, + // except for the genesis block which has no previous block and has no inputs nor fees. + feeCalcTime = 0 + if historyTxn.BlockSeq > 0 { + if isTxnConfirmed { + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, historyTxn.BlockSeq-1) + if err != nil { + return err + } + if prevBlock == nil { + return fmt.Errorf("VerifyTxnVerbose: previous block seq=%d not found", historyTxn.BlockSeq-1) + } + + feeCalcTime = prevBlock.Block.Head.Time + } + } + + return nil + default: + return err + } + + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + return err + } + + if err := VerifySingleTxnSoftConstraints(*txn, feeCalcTime, uxa, vs.Config.Distribution, params.UserVerifyTxn); err != nil { + return err + } + + return VerifySingleTxnHardConstraints(*txn, head.Head, uxa, signed) + }) + + // If we were able to query the inputs, return the verbose inputs to the caller + // even if the transaction failed validation + var inputs []TransactionInput + if len(uxa) != 0 && feeCalcTime != 0 { + var err error + inputs, err = NewTransactionInputs(uxa, feeCalcTime) + if err != nil { + return nil, isTxnConfirmed, err + } + } + + return inputs, isTxnConfirmed, verifyErr +} + +// AddressCount returns the total number of addresses with unspents +func (vs *Visor) AddressCount() (uint64, error) { + var count uint64 + if err := vs.db.View("AddressCount", func(tx *dbutil.Tx) error { + var err error + count, err = vs.blockchain.Unspent().AddressCount(tx) + return err + }); err != nil { + return 0, err + } + + return count, nil +} + +// GetVerboseTransactionsForAddress returns verbose transaction data for a given address +func (vs *Visor) GetVerboseTransactionsForAddress(a cipher.Address) ([]Transaction, [][]TransactionInput, error) { + var txns []Transaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetVerboseTransactionsForAddress", func(tx *dbutil.Tx) error { + addrTxns, err := vs.getTransactionsForAddresses(tx, []cipher.Address{a}) + if err != nil { + logger.Errorf("GetVerboseTransactionsForAddress: vs.GetTransactionsForAddress failed: %v", err) + return err + } + + txns = addrTxns[a] + if len(txns) == 0 { + return nil + } + + head, err := vs.blockchain.Head(tx) + if err != nil { + logger.Errorf("GetVerboseTransactionsForAddress: vs.blockchain.Head failed: %v", err) + return err + } + + inputs = make([][]TransactionInput, len(txns)) + + for i, txn := range txns { + // If the txn is confirmed, use the time of the block previous + // to the block in which the transaction was executed, + // else use the head time for unconfirmed blocks. + t := head.Time() + if txn.Status.Confirmed && txn.Status.BlockSeq > 0 { + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, txn.Status.BlockSeq-1) + if err != nil { + return err + } + + if prevBlock == nil { + return fmt.Errorf("GetVerboseTransactionsForAddress prevBlock seq=%d missing", txn.Status.BlockSeq-1) + } + + t = prevBlock.Block.Head.Time + } + + txnInputs := make([]TransactionInput, len(txn.Transaction.In)) + for j, inputID := range txn.Transaction.In { + uxOuts, err := vs.history.GetUxOuts(tx, []cipher.SHA256{inputID}) + if err != nil { + logger.Errorf("GetVerboseTransactionsForAddress: vs.history.GetUxOuts failed: %v", err) + return err + } + if len(uxOuts) == 0 { + err := fmt.Errorf("uxout of %v does not exist in history db", inputID.Hex()) + logger.Critical().Error(err) + return err + } + + input, err := NewTransactionInput(uxOuts[0].Out, t) + if err != nil { + logger.Errorf("GetVerboseTransactionsForAddress: NewTransactionInput failed: %v", err) + return err + } + + txnInputs[j] = input + } + + inputs[i] = txnInputs + } + + return nil + }); err != nil { + return nil, nil, err + } + + return txns, inputs, nil +} + +// OutputsFilter used as optional arguments in GetUnspentOutputs method +type OutputsFilter func(outputs coin.UxArray) coin.UxArray + +// FbyAddressesNotIncluded filters the unspent outputs that are not owned by the addresses +func FbyAddressesNotIncluded(addrs []cipher.Address) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + addrMatch := coin.UxArray{} + addrMap := newAddrSet(addrs) + + for _, u := range outputs { + if _, ok := addrMap[u.Body.Address]; !ok { + addrMatch = append(addrMatch, u) + } + } + return addrMatch + } +} + +// FbyAddresses filters the unspent outputs that owned by the addresses +func FbyAddresses(addrs []cipher.Address) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + addrMatch := coin.UxArray{} + addrMap := newAddrSet(addrs) + + for _, u := range outputs { + if _, ok := addrMap[u.Body.Address]; ok { + addrMatch = append(addrMatch, u) + } + } + return addrMatch + } +} + +// FbyHashes filters the unspent outputs that have hashes matched. +func FbyHashes(hashes []cipher.SHA256) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + hsMatch := coin.UxArray{} + hsMap := newSHA256Set(hashes) + + for _, u := range outputs { + if _, ok := hsMap[u.Hash()]; ok { + hsMatch = append(hsMatch, u) + } + } + return hsMatch + } +} + +func newAddrSet(keys []cipher.Address) map[cipher.Address]struct{} { + s := make(map[cipher.Address]struct{}, len(keys)) + for _, k := range keys { + s[k] = struct{}{} + } + return s +} + +// newSHA256Set returns a map-based set for string lookup +func newSHA256Set(keys []cipher.SHA256) map[cipher.SHA256]struct{} { + s := make(map[cipher.SHA256]struct{}, len(keys)) + for _, k := range keys { + s[k] = struct{}{} + } + return s +} + +// GetUnspentOutputsSummary gets unspent outputs and returns the filtered results, +// Note: all filters will be executed as the pending sequence in 'AND' mode. +func (vs *Visor) GetUnspentOutputsSummary(filters []OutputsFilter) (*UnspentOutputsSummary, error) { + var confirmedOutputs []coin.UxOut + var outgoingOutputs coin.UxArray + var incomingOutputs coin.UxArray + var head *coin.SignedBlock + + if err := vs.db.View("GetUnspentOutputsSummary", func(tx *dbutil.Tx) error { + var err error + head, err = vs.blockchain.Head(tx) + if err != nil { + return fmt.Errorf("vs.blockchain.Head failed: %v", err) + } + + confirmedOutputs, err = vs.blockchain.Unspent().GetAll(tx) + if err != nil { + return fmt.Errorf("vs.blockchain.Unspent().GetAll failed: %v", err) + } + + outgoingOutputs, err = vs.unconfirmedOutgoingOutputs(tx) + if err != nil { + return fmt.Errorf("vs.unconfirmedOutgoingOutputs failed: %v", err) + } + + incomingOutputs, err = vs.unconfirmedIncomingOutputs(tx) + if err != nil { + return fmt.Errorf("vs.unconfirmedIncomingOutputs failed: %v", err) + } + + return nil + }); err != nil { + return nil, err + } + + for _, flt := range filters { + confirmedOutputs = flt(confirmedOutputs) + outgoingOutputs = flt(outgoingOutputs) + incomingOutputs = flt(incomingOutputs) + } + + confirmed, err := NewUnspentOutputs(confirmedOutputs, head.Time()) + if err != nil { + return nil, err + } + + outgoing, err := NewUnspentOutputs(outgoingOutputs, head.Time()) + if err != nil { + return nil, err + } + + incoming, err := NewUnspentOutputs(incomingOutputs, head.Time()) + if err != nil { + return nil, err + } + + return &UnspentOutputsSummary{ + HeadBlock: head, + Confirmed: confirmed, + Outgoing: outgoing, + Incoming: incoming, + }, nil +} + +// GetRichlist returns a Richlist +func (vs *Visor) GetRichlist(includeDistribution bool) (Richlist, error) { + rbOuts, err := vs.GetUnspentOutputsSummary(nil) + if err != nil { + return nil, err + } + + // Build a map from addresses to total coins held + allAccounts := map[cipher.Address]uint64{} + for _, out := range rbOuts.Confirmed { + if _, ok := allAccounts[out.Body.Address]; ok { + var err error + allAccounts[out.Body.Address], err = mathutil.AddUint64(allAccounts[out.Body.Address], out.Body.Coins) + if err != nil { + return nil, err + } + } else { + allAccounts[out.Body.Address] = out.Body.Coins + } + } + + lockedAddrs := vs.Config.Distribution.LockedAddressesDecoded() + addrsMap := make(map[cipher.Address]struct{}, len(lockedAddrs)) + for _, a := range lockedAddrs { + addrsMap[a] = struct{}{} + } + + richlist, err := NewRichlist(allAccounts, addrsMap) + if err != nil { + return nil, err + } + + if !includeDistribution { + unlockedAddrs := vs.Config.Distribution.UnlockedAddressesDecoded() + for _, a := range unlockedAddrs { + addrsMap[a] = struct{}{} + } + richlist = richlist.FilterAddresses(addrsMap) + } + + return richlist, nil +} + +// WithUpdateTx executes a function inside of a db.Update transaction. +// This is exported for use by the daemon gateway's InjectBroadcastTransaction method. +// Do not use it for other purposes. +func (vs *Visor) WithUpdateTx(name string, f func(tx *dbutil.Tx) error) error { + return vs.db.Update(name, func(tx *dbutil.Tx) error { + return f(tx) + }) +} + +// AddressesActivity returns whether or not each address has any activity on blockchain +// or in the unconfirmed pool +func (vs *Visor) AddressesActivity(addrs []cipher.Address) ([]bool, error) { + active := make([]bool, len(addrs)) + addrsMap := make(map[cipher.Address]int, len(addrs)) + for i, a := range addrs { + addrsMap[a] = i + } + + if len(addrsMap) != len(addrs) { + return nil, errors.New("duplicates addresses not allowed") + } + + if err := vs.db.View("AddressActivity", func(tx *dbutil.Tx) error { + // Check if the addresses appear in the blockchain + for i, a := range addrs { + ok, err := vs.history.AddressSeen(tx, a) + if err != nil { + return err + } + + if ok { + active[i] = true + } + } + + // Check if the addresses appears in the unconfirmed pool + // NOTE: if this needs to be optimized, add an index to the unconfirmed pool + return vs.unconfirmed.ForEach(tx, func(h cipher.SHA256, ut UnconfirmedTransaction) error { + // Only transaction outputs need to be checked; if the address is associated + // with an input, it must have appeared in a transaction in the blockchain history + for _, o := range ut.Transaction.Out { + if i, ok := addrsMap[o.Address]; ok { + active[i] = true + } + } + return nil + }) + }); err != nil { + return nil, err + } + + return active, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_test.go new file mode 100644 index 00000000..e2e68576 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_test.go @@ -0,0 +1,2734 @@ +package visor + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "math" + "os" + "path/filepath" + "sort" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + _require "github.com/SkycoinProject/skycoin/src/testutil/require" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/timeutil" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +const ( + blockchainPubkeyStr = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +) + +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := CreateBuckets(db) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + +func readAll(t *testing.T, f string) []byte { + fi, err := os.Open(f) + require.NoError(t, err) + defer fi.Close() + + b, err := ioutil.ReadAll(fi) + require.NoError(t, err) + + return b +} + +func mustParsePubkey(t *testing.T) cipher.PubKey { + // Parse the blockchain pubkey associated with this corrupted test db + t.Helper() + pubkey, err := cipher.PubKeyFromHex(blockchainPubkeyStr) + require.NoError(t, err) + return pubkey +} + +func writeDBFile(t *testing.T, badDBFile string, badDBData []byte) { + t.Logf("Writing the original bad db file back to %s", badDBFile) + fi, err := os.OpenFile(badDBFile, os.O_WRONLY, 0600) + require.NoError(t, err) + defer fi.Close() + + _, err = io.Copy(fi, bytes.NewBuffer(badDBData)) + require.NoError(t, err) +} + +func findCorruptDBFiles(t *testing.T, badDBFile string) []string { + corruptFiles, err := filepath.Glob(badDBFile + ".corrupt.*") + require.NoError(t, err) + return corruptFiles +} + +func removeCorruptDBFiles(t *testing.T, badDBFile string) { + corruptFiles := findCorruptDBFiles(t, badDBFile) + for _, m := range corruptFiles { + err := os.Remove(m) + require.NoError(t, err) + } +} + +func addGenesisBlockToVisor(t *testing.T, vs *Visor) *coin.SignedBlock { + // create genesis block + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + gbSig := cipher.MustSignHash(gb.HashHeader(), genSecret) + vs.Config.GenesisSignature = gbSig + + sb := coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + } + + // add genesis block to blockchain + err = vs.db.Update("", func(tx *dbutil.Tx) error { + return vs.executeSignedBlock(tx, sb) + }) + require.NoError(t, err) + + return &sb +} + +func TestErrMissingSignatureRecreateDB(t *testing.T) { + badDBFile := "./testdata/data.db.nosig" // about 8MB size + badDBData := readAll(t, badDBFile) + + pubkey := mustParsePubkey(t) + + // Remove any existing corrupt db files from testdata + removeCorruptDBFiles(t, badDBFile) + corruptFiles := findCorruptDBFiles(t, badDBFile) + require.Len(t, corruptFiles, 0) + + // Cleanup + defer func() { + // Write the bad db data back to badDBFile + writeDBFile(t, badDBFile, badDBData) + // Remove leftover corrupt db copies + removeCorruptDBFiles(t, badDBFile) + }() + + // Make sure that the database file causes ErrMissingSignature error + t.Logf("Checking that %s is a corrupted database", badDBFile) + func() { + db, err := OpenDB(badDBFile, false) + require.NoError(t, err) + defer func() { + err := db.Close() + assert.NoError(t, err) + }() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + Arbitrating: false, + }) + require.NoError(t, err) + + // err = db.View("", func(tx *dbutil.Tx) error { + f := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + return bc.VerifySignature(b) + } + + err = bc.WalkChain(BlockchainVerifyTheadNum, f, nil) + + require.Error(t, err) + require.IsType(t, blockdb.ErrMissingSignature{}, err) + }() + + // Loading this invalid db should cause ResetCorruptDB() to recreate the db + t.Logf("Loading the corrupted db from %s", badDBFile) + badDB, err := OpenDB(badDBFile, false) + require.NoError(t, err) + require.NotNil(t, badDB) + require.NotEmpty(t, badDB.Path()) + t.Logf("badDB.Path() == %s", badDB.Path()) + + db, err := ResetCorruptDB(badDB, pubkey, nil) + require.NoError(t, err) + + err = db.Close() + require.NoError(t, err) + + require.NotNil(t, db) + + // A corrupted database file should exist + corruptFiles = findCorruptDBFiles(t, badDBFile) + require.Len(t, corruptFiles, 1) + + // A new db should be written in place of the old bad db, and not be corrupted + t.Logf("Checking that the new db file is valid") + func() { + db, err := OpenDB(badDBFile, false) + require.NoError(t, err) + defer func() { + err := db.Close() + assert.NoError(t, err) + }() + + // The new db is not corrupted and loads without error + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + Arbitrating: false, + }) + require.NoError(t, err) + require.NotNil(t, bc) + }() +} + +func TestHistorydbVerifier(t *testing.T) { + tt := []struct { + name string + dbPath string + expectErr error + }{ + { + name: "db is ok", + dbPath: "./testdata/data.db.ok", + }, + { + name: "missing transaction", + dbPath: "./testdata/data.db.notxn", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New("HistoryDB.Verify: transaction 98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb does not exist in historydb")), + }, + { + name: "missing uxout", + dbPath: "./testdata/data.db.nouxout", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New("HistoryDB.Verify: transaction (input|output) 2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0 does not exist in historydb")), + }, + { + name: "missing addr transaction index", + dbPath: "./testdata/data.db.no-addr-txn-index", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New(`HistoryDB.Verify: index of address transaction \[2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF:98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb\] does not exist in historydb`)), + }, + { + name: "missing addr uxout index", + dbPath: "./testdata/data.db.no-addr-uxout-index", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New(`HistoryDB.Verify: index of address uxout \[2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF:2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0\] does not exist in historydb`)), + }, + } + + pubKeyStr := "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" + pubkey := cipher.MustPubKeyFromHex(pubKeyStr) + history := historydb.New() + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, err := OpenDB(tc.dbPath, true) + require.NoError(t, err) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + }) + require.NoError(t, err) + + indexesMap := historydb.NewIndexesMap() + f := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + return history.Verify(tx, b, indexesMap) + } + + err = bc.WalkChain(2, f, nil) + if tc.expectErr == nil { + require.Nil(t, err) + return + } + + // Confirms that the error type is matched + require.IsType(t, tc.expectErr, err) + // Confirms the error message is matched + require.Regexp(t, tc.expectErr.Error(), err.Error()) + }) + } + +} + +func TestVisorCreateBlock(t *testing.T) { + when := uint64(time.Now().UTC().Unix()) + + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + + unconfirmed, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewConfig() + cfg.IsBlockPublisher = false + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + + v := &Visor{ + Config: cfg, + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + history: his, + } + + // CreateBlock panics if called when not a block publisher + _require.PanicsWithLogMessage(t, "Only a block publisher node can create blocks", func() { + err := db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + require.NoError(t, err) + }) + + v.Config.IsBlockPublisher = true + v.Config.BlockchainSeckey = genSecret + + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + // If no transactions in the unconfirmed pool, return an error + err = db.Update("", func(tx *dbutil.Tx) error { + _, err = v.createBlock(tx, when) + testutil.RequireError(t, err, "No transactions") + return nil + }) + require.NoError(t, err) + + // Create enough unspent outputs to create all of these transactions + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + nUnspents := 100 + txn := makeUnspentsTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, nUnspents, params.UserVerifyTxn.MaxDropletPrecision) + + var known bool + var softErr *ErrTxnViolatesSoftConstraint + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = unconfirmed.InjectTransaction(tx, bc, txn, params.MainNetDistribution, v.Config.UnconfirmedVerifyTxn) + return err + }) + require.NoError(t, err) + require.False(t, known) + require.Nil(t, softErr) + + v.Config.MaxBlockTransactionsSize, err = txn.Size() + require.NoError(t, err) + sb, err := v.CreateAndExecuteBlock() + require.NoError(t, err) + require.Equal(t, 1, len(sb.Body.Transactions)) + + var length uint64 + err = db.View("", func(tx *dbutil.Tx) error { + var err error + length, err = unconfirmed.Len(tx) + return err + }) + require.NoError(t, err) + + require.Equal(t, uint64(0), length) + v.Config.MaxBlockTransactionsSize = 1024 * 4 + + // Create various transactions and add them to unconfirmed pool + uxs = coin.CreateUnspents(sb.Head, sb.Body.Transactions[0]) + var coins uint64 = 9e6 + var f uint64 = 10 + toAddr := testutil.MakeAddress() + + // Add more transactions than is allowed in a block, to verify truncation + var txns coin.Transactions + var i int + truncatedTxns, err := txns.TruncateBytesTo(v.Config.MaxBlockTransactionsSize) + require.NoError(t, err) + for len(txns) == len(truncatedTxns) { + tx := makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins, f) + txns = append(txns, tx) + i++ + truncatedTxns, err = txns.TruncateBytesTo(v.Config.MaxBlockTransactionsSize) + require.NoError(t, err) + } + require.NotEqual(t, 0, len(txns)) + + // Use different f sizes to verify f ordering + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins, f*5)) + i++ + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins, f*10)) + i++ + + // Use invalid decimal places to verify decimal place filtering. + // The fs are set higher to ensure that they are not filtered due to truncating with a low f + // Spending 9.1 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e5, f*20)) + i++ + // Spending 9.01 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e4, f*30)) + i++ + // Spending 9.0001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e3, f*40)) + i++ + // Spending 9.0001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e2, f*50)) + i++ + // Spending 9.00001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e1, f*60)) + i++ + // Spending 9.000001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1, f*70)) + // i++ + + // Confirm that at least one transaction has an invalid decimal output + foundInvalidCoins := false + for _, txn := range txns { + for _, o := range txn.Out { + if err := params.DropletPrecisionCheck(v.Config.UnconfirmedVerifyTxn.MaxDropletPrecision, o.Coins); err != nil { + foundInvalidCoins = true + break + } + } + } + require.True(t, foundInvalidCoins) + + // Inject transactions into the unconfirmed pool + for i, txn := range txns { + var known bool + var softErr *ErrTxnViolatesSoftConstraint + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = unconfirmed.InjectTransaction(tx, bc, txn, params.MainNetDistribution, v.Config.UnconfirmedVerifyTxn) + return err + }) + require.False(t, known) + require.NoError(t, err) + + // The last 3 transactions will have a soft constraint violation for too many decimal places, + // but would still be injected into the pool + if i < len(txns)-3 { + require.Nil(t, softErr) + } else { + testutil.RequireError(t, softErr, "Transaction violates soft constraint: invalid amount, too many decimal places") + } + } + + // Make sure all transactions were injected + var allInjectedTxns []coin.Transaction + err = db.View("", func(tx *dbutil.Tx) error { + var err error + allInjectedTxns, err = unconfirmed.AllRawTransactions(tx) + return err + }) + require.NoError(t, err) + require.Equal(t, len(txns), len(allInjectedTxns)) + + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + sb, err = v.createBlock(tx, when+100) + return err + }) + require.NoError(t, err) + require.Equal(t, when+100, sb.Block.Head.Time) + + blockTxns := sb.Block.Body.Transactions + require.NotEqual(t, len(txns), len(blockTxns), "Transactions should be truncated") + require.Equal(t, 18, len(blockTxns)) + + // Check fee ordering + err = db.View("", func(tx *dbutil.Tx) error { + inUxs, err := v.blockchain.Unspent().GetArray(tx, blockTxns[0].In) + require.NoError(t, err) + prevFee, err := fee.TransactionFee(&blockTxns[0], sb.Head.Time, inUxs) + require.NoError(t, err) + + for i := 1; i < len(blockTxns); i++ { + inUxs, err := v.blockchain.Unspent().GetArray(tx, blockTxns[i].In) + require.NoError(t, err) + f, err := fee.TransactionFee(&blockTxns[i], sb.Head.Time, inUxs) + require.NoError(t, err) + require.True(t, f <= prevFee) + prevFee = f + } + + return nil + }) + + require.NoError(t, err) + + // Check that decimal rules are enforced + for i, txn := range blockTxns { + for j, o := range txn.Out { + err := params.DropletPrecisionCheck(v.Config.CreateBlockVerifyTxn.MaxDropletPrecision, o.Coins) + require.NoError(t, err, "txout %d.%d coins=%d", i, j, o.Coins) + } + } +} + +func TestVisorInjectTransaction(t *testing.T) { + when := uint64(time.Now().UTC().Unix()) + + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewConfig() + cfg.IsBlockPublisher = false + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + + v := &Visor{ + Config: cfg, + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + history: his, + } + + // CreateBlock panics if called when not a block publisher + _require.PanicsWithLogMessage(t, "Only a block publisher node can create blocks", func() { + err := db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + require.NoError(t, err) + }) + + v.Config.IsBlockPublisher = true + v.Config.BlockchainSeckey = genSecret + + addGenesisBlockToVisor(t, v) + + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + // If no transactions in the unconfirmed pool, return an error + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + testutil.RequireError(t, err, "No transactions") + + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + toAddr := testutil.MakeAddress() + var coins uint64 = 10e6 + + // Create a transaction with valid decimal places + txn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + known, softErr, err := v.InjectForeignTransaction(txn) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + // Execute a block to clear this transaction from the pool + sb, err := v.CreateAndExecuteBlock() + require.NoError(t, err) + require.Equal(t, 1, len(sb.Body.Transactions)) + require.Equal(t, 2, len(sb.Body.Transactions[0].Out)) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + + length, err = bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + + return nil + }) + require.NoError(t, err) + + uxs = coin.CreateUnspents(sb.Head, sb.Body.Transactions[0]) + + // Check transactions with overflowing output coins fail + txn = makeOverflowCoinsSpendTxn(t, coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) + _, softErr, err = v.InjectForeignTransaction(txn) + require.IsType(t, ErrTxnViolatesHardConstraint{}, err) + testutil.RequireError(t, err.(ErrTxnViolatesHardConstraint).Err, "Output coins overflow") + require.Nil(t, softErr) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) + + // Check transactions with overflowing output hours fail + // It should not be injected; when injecting a txn, the overflowing output hours is treated + // as a hard constraint. It is only a soft constraint when the txn is included in a signed block. + txn = makeOverflowHoursSpendTxn(t, coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) + _, softErr, err = v.InjectForeignTransaction(txn) + require.Nil(t, softErr) + require.IsType(t, ErrTxnViolatesHardConstraint{}, err) + testutil.RequireError(t, err.(ErrTxnViolatesHardConstraint).Err, "Transaction output hours overflow") + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with invalid decimal places + // It's still injected, because this is considered a soft error + invalidCoins := coins + (params.UserVerifyTxn.MaxDropletDivisor() / 10) + txn = makeSpendTxn(t, uxs, []cipher.SecKey{genSecret, genSecret}, toAddr, invalidCoins) + _, softErr, err = v.InjectForeignTransaction(txn) + require.NoError(t, err) + testutil.RequireError(t, softErr.Err, params.ErrInvalidDecimals.Error()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with null address output + uxs = coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn = makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + txn.Out[0].Address = cipher.Address{} + known, _, _, err = v.InjectUserTransaction(txn) + require.False(t, known) + require.IsType(t, ErrTxnViolatesUserConstraint{}, err) + testutil.RequireError(t, err, "Transaction violates user constraint: Transaction output is sent to the null address") +} + +func makeOverflowCoinsSpendTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + hours := totalHours / 12 + + // These two outputs' coins added up will overflow + err := spendTxn.PushOutput(toAddr, 18446744073709551000, hours) + require.NoError(t, err) + err = spendTxn.PushOutput(toAddr, totalCoins, hours) + require.NoError(t, err) + + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +func makeOverflowHoursSpendTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + hours := totalHours / 12 + + // These two outputs' hours added up will overflow + err := spendTxn.PushOutput(toAddr, totalCoins/2, 18446744073709551615) + require.NoError(t, err) + err = spendTxn.PushOutput(toAddr, totalCoins-totalCoins/2, hours) + require.NoError(t, err) + + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +func makeTestData(t *testing.T, n int) ([]historydb.Transaction, []coin.SignedBlock, []UnconfirmedTransaction, uint64) { //nolint:unparam + var txns []historydb.Transaction + var blocks []coin.SignedBlock + var uncfmTxns []UnconfirmedTransaction + for i := uint64(0); i < uint64(n); i++ { + tm := time.Now().UTC().Unix() + int64(i)*int64(time.Second) + txns = append(txns, historydb.Transaction{ + BlockSeq: i, + Txn: coin.Transaction{ + InnerHash: testutil.RandSHA256(t), + }, + }) + + blocks = append(blocks, coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + BkSeq: i, + Time: uint64(tm), + }, + }, + }) + + uncfmTxns = append(uncfmTxns, UnconfirmedTransaction{ + Transaction: coin.Transaction{ + InnerHash: testutil.RandSHA256(t), + }, + Received: time.Now().UTC().Unix() + int64(n)*int64(time.Second), + }) + } + + return txns, blocks, uncfmTxns, uint64(n) +} + +func makeUncfmUxs(txns []UnconfirmedTransaction) coin.UxArray { + var uxs coin.UxArray + for i := range txns { + uxs = append(uxs, coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(txns[i].Received), + }, + Body: coin.UxBody{ + SrcTransaction: txns[i].Transaction.Hash(), + }, + }) + } + return uxs +} + +type txnsAndUncfmTxns struct { + Txns []historydb.Transaction + UncfmTxns []UnconfirmedTransaction +} +type expectTxnResult struct { + txns []Transaction + uncfmTxns []Transaction + err error +} + +func TestGetTransactions(t *testing.T) { + // Generates test data + txns, blocks, uncfmTxns, headSeq := makeTestData(t, 10) + // Generates []Transaction + var lTxns []Transaction + for i := range txns { + height := headSeq - txns[i].BlockSeq + 1 + lTxns = append(lTxns, Transaction{ + Transaction: txns[i].Txn, + Status: NewConfirmedTransactionStatus(height, txns[i].BlockSeq), + Time: blocks[i].Time(), + }) + } + + // Generate unconfirmed []Transaction + var luncfmTxns []Transaction + for i, txn := range uncfmTxns { + luncfmTxns = append(luncfmTxns, Transaction{ + Transaction: uncfmTxns[i].Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(txn.Received).Unix()), + }) + } + + // Generates addresses + var addrs []cipher.Address + for i := 0; i < 10; i++ { + addrs = append(addrs, testutil.MakeAddress()) + } + + tt := []struct { + name string + addrTxns map[cipher.Address]txnsAndUncfmTxns + blocks []coin.SignedBlock + bcHeadSeq uint64 + filters []TxFilter + expect expectTxnResult + }{ + { + "addrFilter=1 addr=1 txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=0 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=0 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=2 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=0 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=0 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=1 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=2 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=2 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:3], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=3 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=3 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=3 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=3 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: luncfmTxns[:3], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmedTxFilter=1 confirmed=false addr=1 txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{}, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=1 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=1 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=1 txns=1 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=2 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:3], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2/1 txns=2 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2/2 txns=2 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[1:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[2:3], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=2/1 txns=3 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: uncfmTxns[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=2/2 txns=3 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: uncfmTxns[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[1:2]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[2:3], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=2 txns=3 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: uncfmTxns[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: nil, + err: nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + matchDBTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + + his := newHistoryerMock2() + uncfmTxnPool := NewUnconfirmedTransactionPoolerMock2() + for addr, txns := range tc.addrTxns { + his.On("GetTransactionsForAddress", matchDBTx, addr).Return(txns.Txns, nil) + his.txns = append(his.txns, txns.Txns...) + + uncfmTxnPool.On("GetUnspentsOfAddr", matchDBTx, addr).Return(makeUncfmUxs(txns.UncfmTxns), nil) + for i, uncfmTxn := range txns.UncfmTxns { + uncfmTxnPool.On("Get", matchDBTx, uncfmTxn.Transaction.Hash()).Return(&txns.UncfmTxns[i], nil) + } + uncfmTxnPool.txns = append(uncfmTxnPool.txns, txns.UncfmTxns...) + } + + bc := &MockBlockchainer{} + for i, b := range tc.blocks { + bc.On("GetSignedBlockBySeq", matchDBTx, b.Seq()).Return(&tc.blocks[i], nil) + } + + bc.On("HeadSeq", matchDBTx).Return(tc.bcHeadSeq, true, nil) + + db, shutdown := prepareDB(t) + defer shutdown() + + v := &Visor{ + db: db, + history: his, + unconfirmed: uncfmTxnPool, + blockchain: bc, + } + + retTxns, err := v.GetTransactions(tc.filters) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Len(t, retTxns, len(tc.expect.txns)+len(tc.expect.uncfmTxns)) + + // Splits confirmed and unconfirmed txns in returned transactions + uncfmTxnMap := make(map[cipher.SHA256]Transaction) + txnMap := make(map[cipher.SHA256]Transaction) + for i, txn := range retTxns { + h := txn.Transaction.Hash() + if retTxns[i].Status.Confirmed { + txnMap[h] = retTxns[i] + } else { + uncfmTxnMap[h] = retTxns[i] + } + } + + // Confirms that all expected confirmed transactions must be in the txnMap + for _, txn := range tc.expect.txns { + h := txn.Transaction.Hash() + retTxn, ok := txnMap[h] + require.True(t, ok) + require.Equal(t, txn, retTxn) + } + + // Confirms that all expected unconfirmed transactions must be in the uncfmTxnMap + for _, txn := range tc.expect.uncfmTxns { + h := txn.Transaction.Hash() + retTxn, ok := uncfmTxnMap[h] + require.True(t, ok) + require.Equal(t, txn, retTxn) + } + }) + } +} + +func TestRefreshUnconfirmed(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewConfig() + cfg.IsBlockPublisher = true + cfg.BlockchainSeckey = genSecret + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + + v := &Visor{ + Config: cfg, + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + history: his, + } + + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + toAddr := testutil.MakeAddress() + var coins uint64 = 10e6 + + // Create a valid transaction that will remain valid + validTxn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + known, softErr, err := v.InjectForeignTransaction(validTxn) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with invalid decimal places + // It's still injected, because this is considered a soft error + // This transaction will stay invalid on refresh + invalidCoins := coins + (params.UserVerifyTxn.MaxDropletDivisor() / 10) + alwaysInvalidTxn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, invalidCoins) + _, softErr, err = v.InjectForeignTransaction(alwaysInvalidTxn) + require.NoError(t, err) + testutil.RequireError(t, softErr.Err, params.ErrInvalidDecimals.Error()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction that exceeds UnconfirmedVerifyTxn.MaxTransactionSize + // It's still injected, because this is considered a soft error + // This transaction will become valid on refresh (by increasing UnconfirmedVerifyTxn.MaxTransactionSize) + originalMaxUnconfirmedTxnSize := v.Config.UnconfirmedVerifyTxn.MaxTransactionSize + v.Config.UnconfirmedVerifyTxn.MaxTransactionSize = 1 + sometimesInvalidTxn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + _, softErr, err = v.InjectForeignTransaction(sometimesInvalidTxn) + require.NoError(t, err) + require.NotNil(t, softErr) + testutil.RequireError(t, softErr.Err, ErrTxnExceedsMaxBlockSize.Error()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(3), length) + return nil + }) + require.NoError(t, err) + + // The first txn remains valid, + // the second txn remains invalid, + // the third txn becomes valid + v.Config.UnconfirmedVerifyTxn.MaxTransactionSize = originalMaxUnconfirmedTxnSize + hashes, err := v.RefreshUnconfirmed() + require.NoError(t, err) + require.Equal(t, []cipher.SHA256{sometimesInvalidTxn.Hash()}, hashes) + + // Reduce the max block size to affirm that the valid transaction becomes invalid + // The first txn becomes invalid, + // the second txn remains invalid, + // the third txn becomes invalid again + v.Config.UnconfirmedVerifyTxn.MaxTransactionSize = 1 + hashes, err = v.RefreshUnconfirmed() + require.NoError(t, err) + require.Nil(t, hashes) + + // Restore the max block size to affirm the expected transaction validity shifts + // The first txn was valid, became invalid, and is now valid again + // The second txn was always invalid + // The third txn was invalid, became valid, became invalid, and is now valid again + v.Config.UnconfirmedVerifyTxn.MaxTransactionSize = originalMaxUnconfirmedTxnSize + hashes, err = v.RefreshUnconfirmed() + require.NoError(t, err) + + // Sort hashes for deterministic comparison + expectedHashes := []cipher.SHA256{validTxn.Hash(), sometimesInvalidTxn.Hash()} + sort.Slice(expectedHashes, func(i, j int) bool { + return bytes.Compare(expectedHashes[i][:], expectedHashes[j][:]) < 0 + }) + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 0 + }) + require.Equal(t, expectedHashes, hashes) +} + +func TestRemoveInvalidUnconfirmedDoubleSpendArbitrating(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + Arbitrating: true, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewConfig() + cfg.IsBlockPublisher = true + cfg.Arbitrating = true + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + cfg.BlockchainSeckey = genSecret + + v := &Visor{ + Config: cfg, + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + history: his, + } + + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + // Create two valid transactions, both spending the same inputs, one with a higher fee + // Then, create a block from these transactions. + // The one with the higher fee should be included in the block, and the other should be ignored. + // A call to RemoveInvalidUnconfirmed will remove the other txn, because it would now be a double spend. + + var coins uint64 = 10e6 + txn1 := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + known, softErr, err := v.InjectForeignTransaction(txn1) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + var fee uint64 = 1 + txn2 := makeSpendTxWithFee(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins, fee) + known, softErr, err = v.InjectForeignTransaction(txn2) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + return nil + }) + require.NoError(t, err) + + // Execute a block, txn2 should be included because it has a higher fee + sb, err := v.CreateAndExecuteBlock() + require.NoError(t, err) + require.Equal(t, 1, len(sb.Body.Transactions)) + require.Equal(t, 2, len(sb.Body.Transactions[0].Out)) + require.Equal(t, txn2.Hash().Hex(), sb.Body.Transactions[0].Hash().Hex()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + + length, err = bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + + return nil + }) + require.NoError(t, err) + + // Call RemoveInvalidUnconfirmed, the first txn will be removed because it is now a double-spend txn + removed, err := v.RemoveInvalidUnconfirmed() + require.NoError(t, err) + require.Equal(t, []cipher.SHA256{txn1.Hash()}, removed) + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) +} + +func makeTxn(t *testing.T, headTime uint64, in, out []coin.UxOut, keys []cipher.SecKey) (coin.Transaction, []TransactionInput) { + inputs := make([]cipher.SHA256, len(in)) + for i, input := range in { + inputs[i] = input.Hash() + } + + outputs := make([]coin.TransactionOutput, len(out)) + for i, output := range out { + outputs[i] = coin.TransactionOutput{ + Address: output.Body.Address, + Coins: output.Body.Coins, + Hours: output.Body.Hours, + } + } + + txn := coin.Transaction{ + In: inputs, + Out: outputs, + } + + txn.SignInputs(keys) + err := txn.UpdateHeader() + require.NoError(t, err) + + txnInputs, err := NewTransactionInputs(in, headTime) + require.NoError(t, err) + return txn, txnInputs +} + +func TestVerifyTxnVerbose(t *testing.T) { + head := coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: uint64(time.Now().UTC().Unix()), + }, + }, + } + + hashes := make([]cipher.SHA256, 20) + for i := 0; i < 20; i++ { + hashes[i] = testutil.RandSHA256(t) + } + + keys := make([]cipher.SecKey, 5) + for i := 0; i < 5; i++ { + _, keys[i] = cipher.GenerateKeyPair() + } + + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = cipher.MustAddressFromSecKey(keys[i]) + } + + srcTxnHashes := make([]cipher.SHA256, 5) + inputs := make([]coin.UxOut, 5) + historyOutputs := make([]historydb.UxOut, 5) + + for i := 0; i < 5; i++ { + srcTxnHashes[i] = testutil.RandSHA256(t) + inputs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + SrcTransaction: srcTxnHashes[i], + Address: addrs[i], + Coins: 10e6, + Hours: 1000, + }, + } + + historyOutputs[i] = historydb.UxOut{ + Out: inputs[i], + } + } + + outputs := make([]coin.UxOut, 5) + for i := 0; i < 5; i++ { + outputs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 10e6, + Hours: 400 + uint64(i)*200, + }, + } + } + + // add uxout with math.MaxUint64 hours + outputs = append(outputs, coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 10e6, + Hours: math.MaxUint64, + }, + }) + + // add output which has 11e6 coins + outputs = append(outputs, coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 11e6, + Hours: 500, + }, + }) + + // create a transaction + txn, spentInputs := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[:1]) + + // create a transaction which sends coin to null address + toNullAddrTxn, toNullAddrSpentUxBalances := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[:1]) + toNullAddrTxn.Out[0].Address = cipher.Address{} + + // create a transaction with insufficient coin hours + inSufficientCoinHoursTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[4:5], keys[:1]) + + // create a transaction with zero fee + zeroFeeTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[3:4], keys[:1]) + + // create a transaction with output coin hours overflow + coinHourOverflowTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[4:], keys[:1]) + + // create a transaction with insufficient fee + insufficientFeeOuts := []coin.UxOut{ + coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 950, + }, + }, + } + insufficientFeeTxn, _ := makeTxn(t, head.Time(), inputs[:1], insufficientFeeOuts[:], keys[:1]) + + // create a transaction with insufficient coins + insufficientCoinsTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[6:], keys[:1]) + + // create a transaction with valid signature signed by key that doesn't own the input + badSigTxn, badSigTxnSpentInputs := makeTxn(t, head.Time(), inputs[:2], outputs[:2], keys[1:3]) + + // create a transaction with an empty signature + fullyUnsignedTxn, fullyUnsignedSpentInputs := makeTxn(t, head.Time(), inputs[:2], outputs[:2], keys[:2]) + fullyUnsignedTxn.Sigs[0] = cipher.Sig{} + fullyUnsignedTxn.Sigs[1] = cipher.Sig{} + err := fullyUnsignedTxn.UpdateHeader() + require.NoError(t, err) + + partiallyUnsignedTxn, partiallyUnsignedSpentInputs := makeTxn(t, head.Time(), inputs[:2], outputs[:2], keys[:2]) + partiallyUnsignedTxn.Sigs[0] = cipher.Sig{} + err = partiallyUnsignedTxn.UpdateHeader() + require.NoError(t, err) + + type testCase struct { + name string + txn coin.Transaction + isConfirmed bool + isUnsigned bool + signed TxnSignedFlag + inputs []TransactionInput + err error + + maxUserTransactionSize uint32 + + getArrayRet coin.UxArray + getArrayErr error + + getHistoryTxnRet *historydb.Transaction + getHistoryTxnErr error + + getHistoryUxOutsRet []historydb.UxOut + getHistoryUxOutsErr error + + getSignedBlocksBySeqRet *coin.SignedBlock + getSignedBlocksBySeqErr error + } + + baseCases := []testCase{ + { + name: "transaction has been spent", + txn: txn, + isConfirmed: true, + signed: TxnSigned, + inputs: spentInputs[:], + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + getHistoryTxnRet: &historydb.Transaction{ + Txn: txn, + BlockSeq: 10, + }, + getHistoryUxOutsRet: historyOutputs[:1], + getSignedBlocksBySeqRet: &coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: 10000000, + }, + }, + }, + }, + { + name: "transaction has been spent, get previous block error", + txn: txn, + isConfirmed: true, + signed: TxnSigned, + inputs: nil, + err: errors.New("GetSignedBlockBySeq failed"), + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + getHistoryTxnRet: &historydb.Transaction{ + Txn: txn, + BlockSeq: 10, + }, + getHistoryUxOutsRet: historyOutputs[:1], + getSignedBlocksBySeqErr: errors.New("GetSignedBlockBySeq failed"), + }, + { + name: "transaction has been spent, previous block not found", + txn: txn, + isConfirmed: true, + signed: TxnSigned, + inputs: nil, + err: fmt.Errorf("VerifyTxnVerbose: previous block seq=%d not found", 9), + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + getHistoryTxnRet: &historydb.Transaction{ + Txn: txn, + BlockSeq: 10, + }, + getHistoryUxOutsRet: historyOutputs[:1], + getSignedBlocksBySeqRet: nil, + getSignedBlocksBySeqErr: nil, + }, + { + name: "transaction does not exist in either unspents or historydb", + txn: txn, + isConfirmed: false, + signed: TxnSigned, + err: ErrTxnViolatesHardConstraint{fmt.Errorf("transaction input of %s does not exist in either unspent pool or historydb", inputs[0].Hash().Hex())}, + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + }, + { + name: "transaction violate user constratins, send to null address", + txn: toNullAddrTxn, + isConfirmed: false, + signed: TxnSigned, + err: ErrTxnViolatesUserConstraint{errors.New("Transaction output is sent to the null address")}, + inputs: toNullAddrSpentUxBalances[:], + + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, transaction size bigger than max block size", + signed: TxnSigned, + maxUserTransactionSize: 1, + txn: txn, + inputs: spentInputs[:], + err: ErrTxnViolatesSoftConstraint{errors.New("Transaction size bigger than max block size")}, + + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, Insufficient coinhours for transaction outputs", + signed: TxnSigned, + txn: inSufficientCoinHoursTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnInsufficientCoinHours}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, zero fee", + signed: TxnSigned, + txn: zeroFeeTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnNoFee}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, coin hour overflow", + signed: TxnSigned, + txn: coinHourOverflowTxn, + err: ErrTxnViolatesSoftConstraint{errors.New("Transaction output hours overflow")}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, insufficient fee", + signed: TxnSigned, + txn: insufficientFeeTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnInsufficientFee}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate hard constraints, insufficient coins", + signed: TxnSigned, + txn: insufficientCoinsTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Insufficient coins")}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate hard constraints, bad signature", + signed: TxnSigned, + txn: badSigTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Signature not valid for output being spent")}, + getArrayRet: inputs[:2], + inputs: badSigTxnSpentInputs[:], + }, + } + + signedOnlyCases := []testCase{ + { + name: "TxnSignedFlag=TxnSigned transaction violate hard constraints, fully unsigned", + signed: TxnSigned, + isUnsigned: true, + txn: fullyUnsignedTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Unsigned input in transaction")}, + inputs: fullyUnsignedSpentInputs[:], + getArrayRet: inputs[:2], + }, + { + name: "TxnSignedFlag=TxnSigned transaction violate hard constraints, partially unsigned", + signed: TxnSigned, + isUnsigned: true, + txn: partiallyUnsignedTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Unsigned input in transaction")}, + inputs: partiallyUnsignedSpentInputs[:], + getArrayRet: inputs[:2], + }, + { + name: "TxnSignedFlag=TxnSigned ok fully signed", + signed: TxnSigned, + txn: txn, + inputs: spentInputs, + getArrayRet: inputs[:1], + }, + } + + unsignedOnlyCases := []testCase{ + { + name: "TxnSignedFlag=TxnUnsigned ok, fully unsigned", + signed: TxnUnsigned, + isUnsigned: true, + txn: fullyUnsignedTxn, + inputs: fullyUnsignedSpentInputs, + getArrayRet: inputs[:2], + }, + { + name: "TxnSignedFlag=TxnUnsigned ok, partially unsigned", + signed: TxnUnsigned, + isUnsigned: true, + txn: partiallyUnsignedTxn, + inputs: partiallyUnsignedSpentInputs, + getArrayRet: inputs[:2], + }, + { + name: "TxnSignedFlag=TxnUnsigned transaction violate hard constraints: signed", + signed: TxnUnsigned, + txn: txn, + err: ErrTxnViolatesHardConstraint{errors.New("Unsigned transaction must contain a null signature")}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + } + + cases := []testCase{} + + for _, tc := range baseCases { + c := tc + c.name = fmt.Sprintf("TxnSignedFlag=TxnSigned %s", tc.name) + c.signed = TxnSigned + cases = append(cases, c) + + c = tc + c.name = fmt.Sprintf("TxnSignedFlag=TxnUnsigned %s", tc.name) + c.signed = TxnUnsigned + c.txn.Sigs = make([]cipher.Sig, len(c.txn.Sigs)) + copy(c.txn.Sigs, tc.txn.Sigs) + c.txn.Sigs[0] = cipher.Sig{} + c.isUnsigned = true + cases = append(cases, c) + } + + cases = append(cases, signedOnlyCases...) + cases = append(cases, unsignedOnlyCases...) + + matchDBTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + history := &MockHistoryer{} + bc := &MockBlockchainer{} + unspent := &MockUnspentPooler{} + + bc.On("Unspent").Return(unspent) + bc.On("Head", matchDBTx).Return(&head, nil) + if tc.getHistoryTxnRet != nil { + bc.On("GetSignedBlockBySeq", matchDBTx, tc.getHistoryTxnRet.BlockSeq-1).Return(tc.getSignedBlocksBySeqRet, tc.getSignedBlocksBySeqErr) + } + + unspent.On("GetArray", matchDBTx, tc.txn.In).Return(tc.getArrayRet, tc.getArrayErr) + + history.On("GetTransaction", matchDBTx, tc.txn.Hash()).Return(tc.getHistoryTxnRet, tc.getHistoryTxnErr) + history.On("GetUxOuts", matchDBTx, tc.txn.In).Return(tc.getHistoryUxOutsRet, tc.getHistoryUxOutsErr) + + v := &Visor{ + blockchain: bc, + db: db, + history: history, + Config: Config{}, + } + + originalMaxUnconfirmedTxnSize := params.UserVerifyTxn.MaxTransactionSize + defer func() { + params.UserVerifyTxn.MaxTransactionSize = originalMaxUnconfirmedTxnSize + }() + + if tc.maxUserTransactionSize != 0 { + params.UserVerifyTxn.MaxTransactionSize = tc.maxUserTransactionSize + } + + var isConfirmed bool + var inputs []TransactionInput + err := v.db.View("VerifyTxnVerbose", func(tx *dbutil.Tx) error { + var err error + inputs, isConfirmed, err = v.VerifyTxnVerbose(&tc.txn, tc.signed) + return err + }) + + require.Equal(t, tc.isConfirmed, isConfirmed) + require.Equal(t, tc.inputs, inputs) + + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + + if tc.isUnsigned && tc.signed == TxnSigned { + require.Error(t, err) + } + + if !tc.isUnsigned && tc.signed == TxnUnsigned { + require.Error(t, err) + } + }) + } +} + +// historyerMock2 embeds historyerMock, and rewrite the ForEach method +type historyerMock2 struct { + MockHistoryer + txns []historydb.Transaction +} + +func newHistoryerMock2() *historyerMock2 { + return &historyerMock2{} +} + +func (h *historyerMock2) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error { + for i := range h.txns { + if err := f(h.txns[i].Hash(), &h.txns[i]); err != nil { + return err + } + } + return nil +} + +// MockUnconfirmedTransactionPooler2 embeds UnconfirmedTxnPoolerMock, and rewrite the GetFiltered method +type MockUnconfirmedTransactionPooler2 struct { + MockUnconfirmedTransactionPooler + txns []UnconfirmedTransaction +} + +func NewUnconfirmedTransactionPoolerMock2() *MockUnconfirmedTransactionPooler2 { + return &MockUnconfirmedTransactionPooler2{} +} + +func (m *MockUnconfirmedTransactionPooler2) GetFiltered(tx *dbutil.Tx, f func(tx UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + for i := range m.txns { + if f(m.txns[i]) { + txns = append(txns, m.txns[i]) + } + } + return txns, nil +} + +func TestFbyAddresses(t *testing.T) { + uxs := make(coin.UxArray, 5) + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = testutil.MakeAddress() + uxs[i] = coin.UxOut{ + Body: coin.UxBody{ + Address: addrs[i], + }, + } + } + + tests := []struct { + name string + addrs []cipher.Address + outputs []coin.UxOut + want []coin.UxOut + }{ + { + "filter with one address", + []cipher.Address{addrs[0]}, + uxs[:2], + uxs[:1], + }, + { + "filter with multiple addresses", + []cipher.Address{addrs[0], addrs[1]}, + uxs[:3], + uxs[:2], + }, + } + for _, tt := range tests { + outs := FbyAddresses(tt.addrs)(tt.outputs) + require.Equal(t, outs, coin.UxArray(tt.want)) + } +} + +func TestFbyHashes(t *testing.T) { + uxs := make(coin.UxArray, 5) + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = testutil.MakeAddress() + uxs[i] = coin.UxOut{ + Body: coin.UxBody{ + Address: addrs[i], + }, + } + } + + tests := []struct { + name string + hashes []cipher.SHA256 + outputs coin.UxArray + want coin.UxArray + }{ + { + "filter with one hash", + []cipher.SHA256{uxs[0].Hash()}, + uxs[:2], + uxs[:1], + }, + { + "filter with multiple hash", + []cipher.SHA256{uxs[0].Hash(), uxs[1].Hash()}, + uxs[:3], + uxs[:2], + }, + } + for _, tt := range tests { + outs := FbyHashes(tt.hashes)(tt.outputs) + require.Equal(t, outs, tt.want) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet.go new file mode 100644 index 00000000..90394d35 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet.go @@ -0,0 +1,559 @@ +package visor + +// This file contains Visor method that require wallet access + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// UserError wraps user input-related errors. +// Errors caused by programmer input or internal issues should not use this wrapper. +// Some knowledge of the HTTP API layer may be necessary to decide when to use UserError or not. +type UserError struct { + error +} + +// NewUserError creates an Error +func NewUserError(err error) error { + if err == nil { + return nil + } + return UserError{err} +} + +var ( + // ErrSpendingUnconfirmed is returned if caller attempts to spend unconfirmed outputs + ErrSpendingUnconfirmed = NewUserError(errors.New("Please spend after your pending transaction is confirmed")) + // ErrDuplicateUxOuts UxOuts contains duplicate values + ErrDuplicateUxOuts = NewUserError(errors.New("UxOuts contains duplicate values")) + // ErrIncludesNullAddress Addresses must not contain the null address + ErrIncludesNullAddress = NewUserError(errors.New("Addresses must not contain the null address")) + // ErrDuplicateAddresses Addresses contains duplicate values + ErrDuplicateAddresses = NewUserError(errors.New("Addresses contains duplicate values")) + // ErrCreateTransactionParamsConflict UxOuts and Addresses cannot be combined + ErrCreateTransactionParamsConflict = NewUserError(errors.New("UxOuts and Addresses cannot be combined")) + // ErrTransactionAlreadySigned attempted to sign a transaction that is already fully signed + ErrTransactionAlreadySigned = NewUserError(errors.New("Transaction is already fully signed")) + // ErrUxOutsOrAddressesRequired Both Addresses and UxOuts are empty + ErrUxOutsOrAddressesRequired = NewUserError(errors.New("UxOuts or Addresses must not be empty")) + // ErrNoSpendableOutputs after filtering unconfirmed spend outputs, there are no remaining outputs available for transaction creation + ErrNoSpendableOutputs = NewUserError(errors.New("All selected outputs are unavailable for spending")) +) + +// GetWalletBalance returns balance pairs of specific wallet +func (vs *Visor) GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalances, error) { + var addressBalances wallet.AddressBalances + var walletBalance wallet.BalancePair + var addrsBalanceList []wallet.BalancePair + var addrs []cipher.Address + + if err := vs.wallets.View(wltID, func(w wallet.Wallet) error { + var err error + addrs, err = w.GetSkycoinAddresses() + if err != nil { + return err + } + + addrsBalanceList, err = vs.GetBalanceOfAddresses(addrs) + return err + }); err != nil { + return walletBalance, addressBalances, err + } + + // create map of address to balance + addressBalances = make(wallet.AddressBalances, len(addrs)) + for i, addr := range addrs { + addressBalances[addr.String()] = addrsBalanceList[i] + } + + // compute the sum of all addresses + for _, addrBalance := range addressBalances { + var err error + // compute confirmed balance + walletBalance.Confirmed.Coins, err = mathutil.AddUint64(walletBalance.Confirmed.Coins, addrBalance.Confirmed.Coins) + if err != nil { + return walletBalance, addressBalances, err + } + walletBalance.Confirmed.Hours, err = mathutil.AddUint64(walletBalance.Confirmed.Hours, addrBalance.Confirmed.Hours) + if err != nil { + return walletBalance, addressBalances, err + } + + // compute predicted balance + walletBalance.Predicted.Coins, err = mathutil.AddUint64(walletBalance.Predicted.Coins, addrBalance.Predicted.Coins) + if err != nil { + return walletBalance, addressBalances, err + } + walletBalance.Predicted.Hours, err = mathutil.AddUint64(walletBalance.Predicted.Hours, addrBalance.Predicted.Hours) + if err != nil { + return walletBalance, addressBalances, err + } + } + + return walletBalance, addressBalances, nil +} + +// GetWalletUnconfirmedTransactions returns all unconfirmed transactions in given wallet +func (vs *Visor) GetWalletUnconfirmedTransactions(wltID string) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := vs.wallets.View(wltID, func(w wallet.Wallet) error { + addrs, err := w.GetSkycoinAddresses() + if err != nil { + return err + } + + txns, err = vs.GetUnconfirmedTransactions(SendsToAddresses(addrs)) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetWalletUnconfirmedTransactionsVerbose returns all unconfirmed transactions in given wallet +func (vs *Visor) GetWalletUnconfirmedTransactionsVerbose(wltID string) ([]UnconfirmedTransaction, [][]TransactionInput, error) { + var txns []UnconfirmedTransaction + var inputs [][]TransactionInput + + if err := vs.wallets.View(wltID, func(w wallet.Wallet) error { + addrs, err := w.GetSkycoinAddresses() + if err != nil { + return err + } + + txns, inputs, err = vs.GetUnconfirmedTransactionsVerbose(SendsToAddresses(addrs)) + return err + }); err != nil { + return nil, nil, err + } + + return txns, inputs, nil +} + +// WalletSignTransaction signs a transaction. Specific inputs may be signed by specifying signIndexes. +// If signIndexes is empty, all inputs will be signed. The transaction must be fully valid and spendable. +func (vs *Visor) WalletSignTransaction(wltID string, password []byte, txn *coin.Transaction, signIndexes []int) (*coin.Transaction, []TransactionInput, error) { + var inputs []TransactionInput + var signedTxn *coin.Transaction + + if txn.IsFullySigned() { + return nil, nil, ErrTransactionAlreadySigned + } + + if err := vs.wallets.ViewSecrets(wltID, password, func(w wallet.Wallet) error { + return vs.db.View("WalletSignTransaction", func(tx *dbutil.Tx) error { + // Verify the transaction before signing + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + return err + } + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.Distribution, params.UserVerifyTxn, TxnUnsigned); err != nil { + return err + } + + headTime, err := vs.blockchain.Time(tx) + if err != nil { + logger.WithError(err).Error("blockchain.Time failed") + return err + } + + inputs, err = vs.getTransactionInputs(tx, headTime, txn.In) + if err != nil { + return err + } + + uxOuts := make([]coin.UxOut, len(inputs)) + for i, in := range inputs { + uxOuts[i] = in.UxOut + } + + signedTxn, err = wallet.SignTransaction(w, txn, signIndexes, uxOuts) + if err != nil { + logger.WithError(err).Error("wallet.SignTransaction failed") + return err + } + + signed := TxnSigned + if !signedTxn.IsFullySigned() { + signed = TxnUnsigned + } + + if err := VerifySingleTxnUserConstraints(*signedTxn); err != nil { + // This shouldn't happen since we verified in the beginning; if it does, then wallet.SignTransaction has a bug + logger.Critical().WithError(err).Error("Signed transaction violates transaction user constraints") + return err + } + + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *signedTxn, vs.Config.Distribution, params.UserVerifyTxn, signed); err != nil { + // This shouldn't happen since we verified in the beginning; if it does, then wallet.SignTransaction has a bug + logger.Critical().WithError(err).Error("Signed transaction violates transaction constraints") + return err + } + + return nil + }) + }); err != nil { + return nil, nil, err + } + + return signedTxn, inputs, nil +} + +// CreateTransactionParams parameters for transaction creation +type CreateTransactionParams struct { + UxOuts []cipher.SHA256 + Addresses []cipher.Address + // IgnoreUnconfirmed if true, outputs matching Addresses or UxOuts spent by + // an unconfirmed transactions will be ignored, otherwise an error will be returned + IgnoreUnconfirmed bool +} + +// Validate validates params +func (p CreateTransactionParams) Validate() error { + if len(p.UxOuts) != 0 && len(p.Addresses) != 0 { + return ErrCreateTransactionParamsConflict + } + + // Check for duplicate addresses + addressMap := make(map[cipher.Address]struct{}, len(p.Addresses)) + for _, a := range p.Addresses { + if a.Null() { + return ErrIncludesNullAddress + } + + if _, ok := addressMap[a]; ok { + return ErrDuplicateAddresses + } + + addressMap[a] = struct{}{} + } + + // Check for duplicate spending uxouts + uxOuts := make(map[cipher.SHA256]struct{}, len(p.UxOuts)) + for _, o := range p.UxOuts { + if _, ok := uxOuts[o]; ok { + return ErrDuplicateUxOuts + } + uxOuts[o] = struct{}{} + } + + return nil +} + +// WalletCreateTransactionSigned creates a signed transaction based upon the parameters in CreateTransactionParams +func (vs *Visor) WalletCreateTransactionSigned(wltID string, password []byte, p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []TransactionInput, error) { + // Validate params before unlocking wallet + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + + var txn *coin.Transaction + var inputs []TransactionInput + + if err := vs.wallets.UpdateSecrets(wltID, password, func(w wallet.Wallet) error { + var err error + txn, inputs, err = vs.walletCreateTransaction("WalletCreateTransactionSigned", w, p, wp, TxnSigned) + return err + }); err != nil { + return nil, nil, err + } + + return txn, inputs, nil +} + +// WalletCreateTransaction creates a transaction based upon the parameters in CreateTransactionParams +func (vs *Visor) WalletCreateTransaction(wltID string, p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []TransactionInput, error) { + // Validate params before opening wallet + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + + var txn *coin.Transaction + var inputs []TransactionInput + + if err := vs.wallets.Update(wltID, func(w wallet.Wallet) error { + var err error + txn, inputs, err = vs.walletCreateTransaction("WalletCreateTransaction", w, p, wp, TxnUnsigned) + return err + }); err != nil { + return nil, nil, err + } + + return txn, inputs, nil +} + +func (vs *Visor) walletCreateTransaction(methodName string, w wallet.Wallet, p transaction.Params, wp CreateTransactionParams, signed TxnSignedFlag) (*coin.Transaction, []TransactionInput, error) { + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + + // Get all addresses from the wallet for checking params against + walletAddresses, err := w.GetSkycoinAddresses() + if err != nil { + return nil, nil, err + } + + walletAddressesMap := make(map[cipher.Address]struct{}, len(walletAddresses)) + for _, a := range walletAddresses { + walletAddressesMap[a] = struct{}{} + } + + addrs := wp.Addresses + if len(addrs) == 0 { + // Use all wallet addresses if no addresses or uxouts specified + addrs = walletAddresses + } else { + // Check that requested addresses are in the wallet + for _, a := range addrs { + if _, ok := walletAddressesMap[a]; !ok { + return nil, nil, wallet.ErrUnknownAddress + } + } + } + + var txn *coin.Transaction + var uxb []transaction.UxBalance + + if err := vs.db.View(methodName, func(tx *dbutil.Tx) error { + var err error + txn, uxb, err = vs.walletCreateTransactionTx(tx, methodName, w, p, wp, signed, addrs, walletAddressesMap) + return err + }); err != nil { + return nil, nil, err + } + + inputs := NewTransactionInputsFromUxBalance(uxb) + + return txn, inputs, nil +} + +func (vs *Visor) walletCreateTransactionTx(tx *dbutil.Tx, methodName string, + w wallet.Wallet, p transaction.Params, wp CreateTransactionParams, signed TxnSignedFlag, + addrs []cipher.Address, walletAddressesMap map[cipher.Address]struct{}) (*coin.Transaction, []transaction.UxBalance, error) { + // Note: assumes inputs have already been validated by walletCreateTransaction + + head, err := vs.blockchain.Head(tx) + if err != nil { + logger.WithError(err).Error("blockchain.Head failed") + return nil, nil, err + } + + // Get mapping of addresses to uxOuts based upon CreateTransactionParams + var auxs coin.AddressUxOuts + if len(wp.UxOuts) != 0 { + var err error + auxs, err = vs.getCreateTransactionAuxsUxOut(tx, wp.UxOuts, wp.IgnoreUnconfirmed) + if err != nil { + return nil, nil, err + } + + // Check that UxOut addresses are in the wallet, + for a := range auxs { + if _, ok := walletAddressesMap[a]; !ok { + return nil, nil, wallet.ErrUnknownUxOut + } + } + } else { + var err error + auxs, err = vs.getCreateTransactionAuxsAddress(tx, addrs, wp.IgnoreUnconfirmed) + if err != nil { + return nil, nil, err + } + } + + // Create and sign transaction + var txn *coin.Transaction + var uxb []transaction.UxBalance + + switch signed { + case TxnSigned: + txn, uxb, err = wallet.CreateTransactionSigned(w, p, auxs, head.Time()) + case TxnUnsigned: + txn, uxb, err = wallet.CreateTransaction(w, p, auxs, head.Time()) + default: + logger.Panic("Invalid TxnSignedFlag") + } + if err != nil { + logger.Critical().WithError(err).Errorf("%s failed", methodName) + return nil, nil, err + } + + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction user constraints") + return nil, nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // TODO -- decimal restriction was moved to params/ package so the wallet can verify now. Move visor/verify to new package? + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.Distribution, params.UserVerifyTxn, signed); err != nil { + logger.WithError(err).Error("Created transaction violates transaction soft/hard constraints") + return nil, nil, err + } + + return txn, uxb, nil +} + +// CreateTransaction creates an unsigned transaction from requested coin.UxOut hashes +func (vs *Visor) CreateTransaction(p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []TransactionInput, error) { + // Validate parameters before starting database transaction + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + if len(wp.Addresses) == 0 && len(wp.UxOuts) == 0 { + return nil, nil, ErrUxOutsOrAddressesRequired + } + + var txn *coin.Transaction + var uxb []transaction.UxBalance + + if err := vs.db.View("CreateTransaction", func(tx *dbutil.Tx) error { + var err error + txn, uxb, err = vs.createTransactionTx(tx, p, wp) + return err + }); err != nil { + return nil, nil, err + } + + inputs := NewTransactionInputsFromUxBalance(uxb) + + return txn, inputs, nil +} + +func (vs *Visor) createTransactionTx(tx *dbutil.Tx, p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []transaction.UxBalance, error) { + // Note: assumes inputs have already been validated by walletCreateTransaction + head, err := vs.blockchain.Head(tx) + if err != nil { + logger.WithError(err).Error("blockchain.Head failed") + return nil, nil, err + } + + // Get mapping of addresses to uxOuts based upon CreateTransactionParams + var auxs coin.AddressUxOuts + if len(wp.UxOuts) != 0 { + auxs, err = vs.getCreateTransactionAuxsUxOut(tx, wp.UxOuts, wp.IgnoreUnconfirmed) + } else { + auxs, err = vs.getCreateTransactionAuxsAddress(tx, wp.Addresses, wp.IgnoreUnconfirmed) + } + if err != nil { + return nil, nil, err + } + + txn, uxb, err := transaction.Create(p, auxs, head.Time()) + if err != nil { + return nil, nil, err + } + + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction user constraints") + return nil, nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // TODO -- decimal restriction was moved to params/ package so the wallet can verify now. Move visor/verify to new package? + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.Distribution, params.UserVerifyTxn, TxnUnsigned); err != nil { + logger.WithError(err).Error("Created transaction violates transaction soft/hard constraints") + return nil, nil, err + } + + return txn, uxb, nil +} + +// getCreateTransactionAuxsUxOut returns a map of addresses to their unspent outputs, +// given a list of unspent output hashes. +// If ignoreUnconfirmed is true, outputs being spent by unconfirmed transactions are ignored and excluded from the return value. +// If ignoreUnconfirmed is false, an error is return if any of the specified unspent outputs are spent by an unconfirmed transaction. +func (vs *Visor) getCreateTransactionAuxsUxOut(tx *dbutil.Tx, uxOutHashes []cipher.SHA256, ignoreUnconfirmed bool) (coin.AddressUxOuts, error) { + hashesMap := make(map[cipher.SHA256]struct{}, len(uxOutHashes)) + for _, h := range uxOutHashes { + hashesMap[h] = struct{}{} + } + + // Check if any of the outputs are spent by an unconfirmed transaction + unconfirmedHashesMap := make(map[cipher.SHA256]struct{}) + if err := vs.unconfirmed.ForEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + for _, h := range txn.Transaction.In { + if _, ok := hashesMap[h]; ok { + if !ignoreUnconfirmed { + return ErrSpendingUnconfirmed + } + unconfirmedHashesMap[h] = struct{}{} + } + } + return nil + }); err != nil { + return nil, err + } + + if !ignoreUnconfirmed && len(unconfirmedHashesMap) != 0 { + logger.Panic("ignoreUnconfirmed is false but unconfirmedHashesMap is not empty") + } + + // Filter unconfirmed spends + if len(unconfirmedHashesMap) != 0 { + filteredUxOutHashes := uxOutHashes[:0] + for _, h := range uxOutHashes { + if _, ok := unconfirmedHashesMap[h]; ok { + delete(hashesMap, h) + } else { + filteredUxOutHashes = append(filteredUxOutHashes, h) + } + } + uxOutHashes = filteredUxOutHashes + } + + if len(uxOutHashes) == 0 { + return nil, ErrNoSpendableOutputs + } + + // Retrieve the uxouts from the pool. + // An error is returned if any do not exist + uxOuts, err := vs.blockchain.Unspent().GetArray(tx, uxOutHashes) + if err != nil { + return nil, err + } + + // Build coin.AddressUxOuts map + return coin.NewAddressUxOuts(coin.UxArray(uxOuts)), nil +} + +// getCreateTransactionAuxsAddress returns a map of the addresses to their unspent outputs, +// filtering or erroring on unconfirmed outputs depending on the value of ignoreUnconfirmed +func (vs *Visor) getCreateTransactionAuxsAddress(tx *dbutil.Tx, addrs []cipher.Address, ignoreUnconfirmed bool) (coin.AddressUxOuts, error) { + // Get all address unspent hashes + addrHashes, err := vs.blockchain.Unspent().GetUnspentHashesOfAddrs(tx, addrs) + if err != nil { + return nil, err + } + + hashes := addrHashes.Flatten() + if len(hashes) == 0 { + return nil, transaction.ErrNoUnspents + } + + return vs.getCreateTransactionAuxsUxOut(tx, hashes, ignoreUnconfirmed) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet_test.go new file mode 100644 index 00000000..59183326 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet_test.go @@ -0,0 +1,1626 @@ +package visor + +import ( + "bytes" + "errors" + "fmt" + "io/ioutil" + "reflect" + "sort" + "testing" + "time" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func TestCreateTransaction(t *testing.T) { + addrs := make([]cipher.Address, 3) + for i := range addrs { + addrs[i] = testutil.MakeAddress() + } + + uxOuts := make([]cipher.SHA256, 3) + for i := range uxOuts { + uxOuts[i] = testutil.RandSHA256(t) + } + + validCreateTxnParams := CreateTransactionParams{ + Addresses: addrs, + } + + validParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 7, + }, + }, + } + + insufficientBalanceParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 2e6, + Hours: 7, + }, + }, + } + + invalidParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: cipher.Address{}, // null address violates user constraints + Coins: 1e6, + Hours: 7, + }, + }, + } + + getArrayRet := coin.UxArray{ + { + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: addrs[1], + Coins: 1e6, + Hours: 100, + }, + }, + } + uxOuts[1] = getArrayRet[0].Hash() + + inputs := []TransactionInput{ + { + UxOut: getArrayRet[0], + CalculatedHours: getArrayRet[0].Body.Hours + 1, + }, + } + + txn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{getArrayRet[0].Hash()}, + Out: validParams.To, + } + err := txn.UpdateHeader() + require.NoError(t, err) + + invalidParamsTxn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{getArrayRet[0].Hash()}, + Out: invalidParams.To, + } + err = invalidParamsTxn.UpdateHeader() + require.NoError(t, err) + + headBlock := &coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: uint64(time.Now().Unix()), + }, + }, + } + + cases := []struct { + name string + txn *coin.Transaction + inputs []TransactionInput + p transaction.Params + wp CreateTransactionParams + err error + + blockchainHead *coin.SignedBlock + blockchainHeadErr error + + unconfirmedTxns []coin.Transaction + uxOuts []cipher.SHA256 + forEachErr error + + getArrayInputs []cipher.SHA256 + getArray coin.UxArray + getArrayErr error + + getUnspentHashesOfAddrs blockdb.AddressHashes + getUnspentHashesOfAddrsErr error + + verifyErr error + }{ + { + name: "Blockchain.Head failed", + p: validParams, + wp: validCreateTxnParams, + blockchainHeadErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "GetUnspentHashesOfAddrs failed", + p: validParams, + wp: validCreateTxnParams, + getUnspentHashesOfAddrsErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "no unspents found for addresses", + p: validParams, + wp: validCreateTxnParams, + getUnspentHashesOfAddrs: nil, + err: transaction.ErrNoUnspents, + }, + + { + name: "Unconfirmed.ForEach failed", + p: validParams, + wp: validCreateTxnParams, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + forEachErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "Unspent.GetArray failed", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + getArrayInputs: uxOuts, + getArrayErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "insufficient balance", + p: insufficientBalanceParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + err: transaction.ErrInsufficientBalance, + }, + + { + name: "invalid params for transaction.Create, uxouts", + p: invalidParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: invalidParamsTxn, + inputs: inputs, + err: transaction.ErrNullAddressReceiver, + }, + + { + name: "blockchain verify error, uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + verifyErr: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + err: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + }, + + { + name: "bad transaction.Params", + p: transaction.Params{}, + err: transaction.ErrMissingReceivers, + }, + + { + name: "bad CreateTransactionParams", + p: validParams, + wp: CreateTransactionParams{ + Addresses: []cipher.Address{testutil.MakeAddress()}, + UxOuts: []cipher.SHA256{testutil.RandSHA256(t)}, + }, + err: ErrCreateTransactionParamsConflict, + }, + + { + name: "Addresses and UxOuts both empty", + p: validParams, + err: ErrUxOutsOrAddressesRequired, + }, + + { + name: "ok, addresses", + p: validParams, + wp: CreateTransactionParams{ + Addresses: addrs, + }, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + + { + name: "ok, uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := &MockBlockchainer{} + ut := &MockUnconfirmedTransactionPooler{} + up := &MockUnspentPooler{} + + b.On("Head", matchDBTx).Return(tc.blockchainHead, tc.blockchainHeadErr) + up.On("GetUnspentHashesOfAddrs", matchDBTx, tc.wp.Addresses).Return(tc.getUnspentHashesOfAddrs, tc.getUnspentHashesOfAddrsErr) + + ut.On("ForEach", matchDBTx, mock.MatchedBy(func(f func(cipher.SHA256, UnconfirmedTransaction) error) bool { + return true + })).Return(tc.forEachErr).Run(unconfirmedForEachMockRun(t, tc.unconfirmedTxns, tc.uxOuts, tc.wp.IgnoreUnconfirmed)) + + up.On("GetArray", matchDBTx, mock.MatchedBy(matchUxOutsAnyOrder(tc.getArrayInputs))).Return(tc.getArray, tc.getArrayErr) + b.On("Unspent").Return(up) + + if tc.txn != nil { + b.On("VerifySingleTxnSoftHardConstraints", matchDBTx, *tc.txn, params.MainNetDistribution, params.UserVerifyTxn, TxnUnsigned).Return(nil, nil, tc.verifyErr) + } + + db, shutdown := prepareDB(t) + defer shutdown() + + v := &Visor{ + db: db, + blockchain: b, + unconfirmed: ut, + Config: Config{ + Distribution: params.MainNetDistribution, + }, + } + + txn, inputs, err := v.CreateTransaction(tc.p, tc.wp) + require.Equal(t, tc.err, err) + if tc.err != nil { + return + } + + require.Equal(t, tc.txn, txn) + require.Equal(t, tc.inputs, inputs) + }) + } +} + +func prepareWltDir() string { + dir, err := ioutil.TempDir("", "wallets") + if err != nil { + panic(err) + } + + return dir +} + +func makeEntries(n int) ([]wallet.Entry, []cipher.Address) { + addrs := make([]cipher.Address, n) + entries := make([]wallet.Entry, n) + for i := range addrs { + p, s := cipher.GenerateKeyPair() + a := cipher.AddressFromPubKey(p) + entries[i] = wallet.Entry{ + Address: a, + Public: p, + Secret: s, + } + addrs[i] = a + } + return entries, addrs +} + +func TestWalletCreateTransaction(t *testing.T) { + // Create arbitrary entries for a "collection" wallet + entries, addrs := makeEntries(3) + + // Load the 5th through 8th entries for a known bip44 wallet. + // These entries will be used for the test data. + bip44Seed := "voyage say extend find sheriff surge priority merit ignore maple cash argue" + w, err := wallet.NewWallet("bip44.wlt", wallet.Options{ + Type: wallet.WalletTypeBip44, + GenerateN: 8, + Seed: bip44Seed, + }) + require.NoError(t, err) + bip44Entries := w.GetEntries()[5:8] + require.Len(t, bip44Entries, 3) + bip44Addrs, err := w.GetSkycoinAddresses() + require.NoError(t, err) + bip44Addrs = bip44Addrs[5:8] + require.Len(t, bip44Addrs, 3) + + uxOuts := make([]cipher.SHA256, 3) + for i := range uxOuts { + uxOuts[i] = testutil.RandSHA256(t) + } + + bip44UxOuts := make([]cipher.SHA256, 3) + for i := range bip44UxOuts { + bip44UxOuts[i] = testutil.RandSHA256(t) + } + + validParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 7, + }, + }, + } + + insufficientBalanceParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 2e6, + Hours: 7, + }, + }, + } + + invalidParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: cipher.Address{}, // null address violates user constraints + Coins: 1e6, + Hours: 7, + }, + }, + } + + getArrayRet := coin.UxArray{ + { + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: addrs[1], + Coins: 1e6, + Hours: 100, + }, + }, + } + uxOuts[1] = getArrayRet[0].Hash() + + unknownUxOutGetArrayRet := append(getArrayRet, coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }) + + inputs := []TransactionInput{ + { + UxOut: getArrayRet[0], + CalculatedHours: getArrayRet[0].Body.Hours + 1, + }, + } + + txn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{getArrayRet[0].Hash()}, + Out: validParams.To, + } + err = txn.UpdateHeader() + require.NoError(t, err) + + invalidParamsTxn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{getArrayRet[0].Hash()}, + Out: invalidParams.To, + } + err = invalidParamsTxn.UpdateHeader() + require.NoError(t, err) + + bip44GetArrayRet := coin.UxArray{ + { + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: bip44Addrs[1], + Coins: 1e6, + Hours: 100, + }, + }, + } + bip44UxOuts[1] = bip44GetArrayRet[0].Hash() + + bip44UnknownUxOutGetArrayRet := append(bip44GetArrayRet, coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }) + + bip44Inputs := []TransactionInput{ + { + UxOut: bip44GetArrayRet[0], + CalculatedHours: bip44GetArrayRet[0].Body.Hours + 1, + }, + } + + bip44Txn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{bip44GetArrayRet[0].Hash()}, + Out: validParams.To, + } + err = bip44Txn.UpdateHeader() + require.NoError(t, err) + + bip44InvalidParamsTxn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{bip44GetArrayRet[0].Hash()}, + Out: invalidParams.To, + } + err = invalidParamsTxn.UpdateHeader() + require.NoError(t, err) + + headBlock := &coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: uint64(time.Now().Unix()), + }, + }, + } + + type testCase struct { + name string + txn *coin.Transaction + inputs []TransactionInput + p transaction.Params + wp CreateTransactionParams + signed TxnSignedFlag + walletID string + walletType string + seed string + password []byte + err error + + blockchainHead *coin.SignedBlock + blockchainHeadErr error + + unconfirmedTxns []coin.Transaction + uxOuts []cipher.SHA256 + forEachErr error + + getArrayInputs []cipher.SHA256 + getArray coin.UxArray + getArrayErr error + + getUnspentHashesOfAddrs blockdb.AddressHashes + getUnspentHashesOfAddrsErr error + + verifyErr error + } + + baseCases := []testCase{ + { + name: "all wallet addresses", + p: validParams, + wp: CreateTransactionParams{}, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + + { + name: "specific wallet addresses", + p: validParams, + wp: CreateTransactionParams{ + Addresses: addrs, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + + { + name: "specific uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + + { + name: "unknown wallet address", + p: validParams, + wp: CreateTransactionParams{ + Addresses: append(addrs, testutil.MakeAddress()), + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + getArrayInputs: uxOuts, + getArray: getArrayRet, + err: wallet.ErrUnknownAddress, + }, + + { + name: "unknown wallet uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: unknownUxOutGetArrayRet, + err: wallet.ErrUnknownUxOut, + }, + + { + name: "insufficient balance", + p: insufficientBalanceParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + err: transaction.ErrInsufficientBalance, + }, + + { + name: "invalid params for transaction.Create, uxouts", + p: invalidParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: invalidParamsTxn, + inputs: inputs, + err: transaction.ErrNullAddressReceiver, + }, + + { + name: "Blockchain.Head failed", + p: validParams, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHeadErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "blockchain verify error, uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + verifyErr: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + err: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + }, + + { + name: "all wallet addresses bip44 wallet", + p: validParams, + wp: CreateTransactionParams{}, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + bip44Addrs[1]: bip44UxOuts, + }, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44Txn, + inputs: bip44Inputs, + }, + + { + name: "specific wallet addresses bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + Addresses: bip44Addrs, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + bip44Addrs[1]: bip44UxOuts, + }, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44Txn, + inputs: bip44Inputs, + }, + + { + name: "specific uxouts bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44Txn, + inputs: bip44Inputs, + }, + + { + name: "unknown wallet address bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + Addresses: append(bip44Addrs, testutil.MakeAddress()), + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + bip44Addrs[1]: bip44UxOuts, + }, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + err: wallet.ErrUnknownAddress, + }, + + { + name: "unknown wallet uxouts bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44UnknownUxOutGetArrayRet, + err: wallet.ErrUnknownUxOut, + }, + + { + name: "insufficient balance bip44 wallet", + p: insufficientBalanceParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + err: transaction.ErrInsufficientBalance, + }, + + { + name: "invalid params for transaction.Create, uxouts bip44 wallet", + p: invalidParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44InvalidParamsTxn, + inputs: bip44Inputs, + err: transaction.ErrNullAddressReceiver, + }, + + { + name: "Blockchain.Head failed bip44 wallet", + p: validParams, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHeadErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "blockchain verify error, uxouts bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44Txn, + inputs: bip44Inputs, + verifyErr: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + err: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + }, + } + + cases := make([]testCase, len(baseCases)*2) + copy(cases, baseCases) + copy(cases[len(baseCases):], baseCases) + for i := range cases[:len(baseCases)] { + cases[i].signed = TxnUnsigned + cases[i].password = nil + } + for i := range cases[len(baseCases):] { + cases[i+len(baseCases)].signed = TxnSigned + cases[i+len(baseCases)].password = []byte("foo") + } + + for _, tc := range cases { + name := fmt.Sprintf("signed-flag=%d %s", tc.signed, tc.name) + t.Run(name, func(t *testing.T) { + require.NotEmpty(t, tc.walletID) + + ws, err := wallet.NewService(wallet.Config{ + EnableWalletAPI: true, + CryptoType: wallet.CryptoTypeScryptChacha20poly1305Insecure, + WalletDir: prepareWltDir(), + }) + require.NoError(t, err) + + generateN := uint64(0) + if tc.walletType == wallet.WalletTypeBip44 { + // Generate 8 addresses, the last 3 were used in the test data above + generateN = 8 + } + + _, err = ws.CreateWallet(tc.walletID, wallet.Options{ + Coin: wallet.CoinTypeSkycoin, + Encrypt: len(tc.password) != 0, + Password: tc.password, + CryptoType: wallet.CryptoTypeScryptChacha20poly1305Insecure, + Type: tc.walletType, + GenerateN: generateN, + Seed: tc.seed, + }, nil) + require.NoError(t, err) + + err = ws.UpdateSecrets(tc.walletID, tc.password, func(w wallet.Wallet) error { + switch w.Type() { + case wallet.WalletTypeCollection: + // Add 5 unused entries into the wallet, in addition to the 3 above + uniqueEntries, _ := makeEntries(5) + for _, e := range append(uniqueEntries, entries...) { + err := w.(*wallet.CollectionWallet).AddEntry(e) + require.NoError(t, err) + } + } + return nil + }) + require.NoError(t, err) + + walletAddrs, err := ws.GetSkycoinAddresses(tc.walletID) + require.NoError(t, err) + + b := &MockBlockchainer{} + ut := &MockUnconfirmedTransactionPooler{} + up := &MockUnspentPooler{} + + addrs := walletAddrs + if len(tc.wp.Addresses) != 0 { + addrs = tc.wp.Addresses + } + + b.On("Head", matchDBTx).Return(tc.blockchainHead, tc.blockchainHeadErr) + up.On("GetUnspentHashesOfAddrs", matchDBTx, addrs).Return(tc.getUnspentHashesOfAddrs, tc.getUnspentHashesOfAddrsErr) + + ut.On("ForEach", matchDBTx, mock.MatchedBy(func(f func(cipher.SHA256, UnconfirmedTransaction) error) bool { + return true + })).Return(tc.forEachErr).Run(unconfirmedForEachMockRun(t, tc.unconfirmedTxns, tc.uxOuts, tc.wp.IgnoreUnconfirmed)) + + up.On("GetArray", matchDBTx, mock.MatchedBy(matchUxOutsAnyOrder(tc.getArrayInputs))).Return(tc.getArray, tc.getArrayErr) + b.On("Unspent").Return(up) + + matchTxnIgnoreSigs := mock.MatchedBy(func(txn coin.Transaction) bool { + switch tc.signed { + case TxnSigned: + if !txn.IsFullySigned() { + return false + } + // Unset sigs for comparison to the unsigned txn + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + return reflect.DeepEqual(txn, *tc.txn) + case TxnUnsigned: + return reflect.DeepEqual(txn, *tc.txn) + default: + return false + } + }) + + if tc.txn != nil { + b.On("VerifySingleTxnSoftHardConstraints", matchDBTx, matchTxnIgnoreSigs, params.MainNetDistribution, params.UserVerifyTxn, tc.signed).Return(nil, nil, tc.verifyErr) + } + + db, shutdown := prepareDB(t) + defer shutdown() + + v := &Visor{ + db: db, + blockchain: b, + unconfirmed: ut, + wallets: ws, + Config: Config{ + Distribution: params.MainNetDistribution, + }, + } + + var txn *coin.Transaction + var inputs []TransactionInput + switch tc.signed { + case TxnSigned: + txn, inputs, err = v.WalletCreateTransactionSigned(tc.walletID, tc.password, tc.p, tc.wp) + case TxnUnsigned: + txn, inputs, err = v.WalletCreateTransaction(tc.walletID, tc.p, tc.wp) + default: + t.Fatal("invalid tc.signed value") + } + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + if tc.err != nil { + return + } + + if tc.signed == TxnSigned { + require.True(t, txn.IsFullySigned()) + // Unset sigs for comparison to the unsigned transaction + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + } + + require.Equal(t, tc.txn, txn) + require.Equal(t, tc.inputs, inputs) + }) + } +} + +func TestCreateTransactionParamsValidate(t *testing.T) { + var nullAddress cipher.Address + addr := testutil.MakeAddress() + hash := testutil.RandSHA256(t) + + cases := []struct { + name string + p CreateTransactionParams + err error + }{ + { + name: "both addrs and uxouts specified", + p: CreateTransactionParams{ + Addresses: []cipher.Address{addr}, + UxOuts: []cipher.SHA256{hash}, + }, + err: ErrCreateTransactionParamsConflict, + }, + + { + name: "null address in addrs", + p: CreateTransactionParams{ + Addresses: []cipher.Address{nullAddress}, + }, + err: ErrIncludesNullAddress, + }, + + { + name: "duplicate address in addrs", + p: CreateTransactionParams{ + Addresses: []cipher.Address{addr, addr}, + }, + err: ErrDuplicateAddresses, + }, + + { + name: "duplicate hash in uxouts", + p: CreateTransactionParams{ + UxOuts: []cipher.SHA256{hash, hash}, + }, + err: ErrDuplicateUxOuts, + }, + + { + name: "ok, addrs specified", + p: CreateTransactionParams{ + Addresses: []cipher.Address{addr}, + }, + }, + + { + name: "ok, uxouts specified", + p: CreateTransactionParams{ + UxOuts: []cipher.SHA256{hash}, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := tc.p.Validate() + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + }) + } +} + +func TestWalletCreateTransactionValidation(t *testing.T) { + // This only tests that WalletCreateTransaction and WalletCreateTransactionSigned fails on invalid inputs; + // success tests are performed by live integration tests + + validParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 10, + Hours: 10, + }, + }, + } + + cases := []struct { + name string + p transaction.Params + wp CreateTransactionParams + err error + }{ + { + name: "bad transaction.Params", + p: transaction.Params{}, + err: transaction.ErrMissingReceivers, + }, + { + name: "bad CreateTransactionParams", + p: validParams, + wp: CreateTransactionParams{ + Addresses: []cipher.Address{testutil.MakeAddress()}, + UxOuts: []cipher.SHA256{testutil.RandSHA256(t)}, + }, + err: ErrCreateTransactionParamsConflict, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // setup visor + v := &Visor{} + + _, _, err := v.WalletCreateTransaction("foo.wlt", tc.p, tc.wp) + require.Equal(t, tc.err, err) + + _, _, err = v.WalletCreateTransactionSigned("foo.wlt", nil, tc.p, tc.wp) + require.Equal(t, tc.err, err) + + if tc.err != nil { + return + } + + // Valid WalletCreateTransaction and WalletCreateTransactionSigned calls are tested in live integration tests + }) + } +} + +func TestGetCreateTransactionAuxsUxOut(t *testing.T) { + allAddrs := make([]cipher.Address, 10) + for i := range allAddrs { + allAddrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 20) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + } + + srcTxns := make([]cipher.SHA256, 20) + for i := range srcTxns { + srcTxns[i] = testutil.RandSHA256(t) + } + + cases := []struct { + name string + ignoreUnconfirmed bool + uxOuts []cipher.SHA256 + expectedAuxs coin.AddressUxOuts + err error + + forEachErr error + unconfirmedTxns coin.Transactions + getArrayInputs []cipher.SHA256 + getArray coin.UxArray + getArrayErr error + }{ + { + name: "uxouts specified, ok", + uxOuts: hashes[5:10], + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[5:10], + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "uxouts specified, unconfirmed spend", + uxOuts: hashes[0:4], + err: ErrSpendingUnconfirmed, + forEachErr: ErrSpendingUnconfirmed, + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[6:10], + }, + coin.Transaction{ + In: hashes[3:6], + }, + }, + }, + + { + name: "uxouts specified, unconfirmed spend ignored", + ignoreUnconfirmed: true, + uxOuts: hashes[5:10], + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + coin.Transaction{ + In: hashes[8:10], + }, + }, + getArrayInputs: hashes[5:8], // the 8th & 9th hash are filtered because it is an unconfirmed spend + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + }, + }, + + { + name: "uxouts specified, all uxouts are unconfirmed", + ignoreUnconfirmed: true, + uxOuts: hashes[5:10], + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + coin.Transaction{ + In: hashes[8:10], + }, + coin.Transaction{ + In: hashes[5:8], + }, + }, + err: ErrNoSpendableOutputs, + }, + + { + name: "uxouts specified, unknown uxout", + uxOuts: hashes[5:10], + err: blockdb.ErrUnspentNotExist{ + UxID: "foo", + }, + getArrayErr: blockdb.ErrUnspentNotExist{ + UxID: "foo", + }, + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[5:10], + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + unconfirmed := &MockUnconfirmedTransactionPooler{} + bc := &MockBlockchainer{} + unspent := &MockUnspentPooler{} + require.Implements(t, (*blockdb.UnspentPooler)(nil), unspent) + + v := &Visor{ + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + } + + unconfirmed.On("ForEach", matchDBTx, mock.MatchedBy(func(f func(cipher.SHA256, UnconfirmedTransaction) error) bool { + return true + })).Return(tc.forEachErr).Run(unconfirmedForEachMockRun(t, tc.unconfirmedTxns, tc.uxOuts, tc.ignoreUnconfirmed)) + + unspent.On("GetArray", matchDBTx, mock.MatchedBy(matchUxOutsAnyOrder(tc.getArrayInputs))).Return(tc.getArray, tc.getArrayErr) + + bc.On("Unspent").Return(unspent) + + var auxs coin.AddressUxOuts + err := v.db.View("", func(tx *dbutil.Tx) error { + var err error + auxs, err = v.getCreateTransactionAuxsUxOut(tx, tc.uxOuts, tc.ignoreUnconfirmed) + return err + }) + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.expectedAuxs, auxs) + }) + } +} + +func TestGetCreateTransactionAuxsAddress(t *testing.T) { + allAddrs := make([]cipher.Address, 10) + for i := range allAddrs { + allAddrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 20) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + } + + srcTxns := make([]cipher.SHA256, 20) + for i := range srcTxns { + srcTxns[i] = testutil.RandSHA256(t) + } + + cases := []struct { + name string + ignoreUnconfirmed bool + addrs []cipher.Address + expectedAuxs coin.AddressUxOuts + err error + + forEachErr error + unconfirmedTxns coin.Transactions + getArrayInputs []cipher.SHA256 + getArray coin.UxArray + getArrayErr error + getUnspentHashesOfAddrs blockdb.AddressHashes + }{ + { + name: "ok", + addrs: allAddrs, + getArrayInputs: hashes[0:4], + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + allAddrs[1]: hashes[0:2], + allAddrs[3]: hashes[2:4], + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "err, unconfirmed spends", + addrs: allAddrs, + err: ErrSpendingUnconfirmed, + forEachErr: ErrSpendingUnconfirmed, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + allAddrs[1]: hashes[0:2], + allAddrs[3]: hashes[2:4], + }, + }, + + { + name: "ignore unconfirmed", + ignoreUnconfirmed: true, + addrs: allAddrs, + unconfirmedTxns: coin.Transactions{ + { + In: []cipher.SHA256{hashes[1]}, + }, + { + In: []cipher.SHA256{hashes[2]}, + }, + }, + getArrayInputs: []cipher.SHA256{hashes[0], hashes[3]}, + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + allAddrs[1]: hashes[0:2], + allAddrs[3]: hashes[2:4], + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + unconfirmed := &MockUnconfirmedTransactionPooler{} + bc := &MockBlockchainer{} + unspent := &MockUnspentPooler{} + require.Implements(t, (*blockdb.UnspentPooler)(nil), unspent) + + v := &Visor{ + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + } + unspent.On("GetUnspentHashesOfAddrs", matchDBTx, tc.addrs).Return(tc.getUnspentHashesOfAddrs, nil) + + unconfirmed.On("ForEach", matchDBTx, mock.MatchedBy(func(f func(cipher.SHA256, UnconfirmedTransaction) error) bool { + return true + })).Return(tc.forEachErr).Run(unconfirmedForEachMockRun(t, tc.unconfirmedTxns, tc.getUnspentHashesOfAddrs.Flatten(), tc.ignoreUnconfirmed)) + + unspent.On("GetArray", matchDBTx, mock.MatchedBy(matchUxOutsAnyOrder(tc.getArrayInputs))).Return(tc.getArray, tc.getArrayErr) + + bc.On("Unspent").Return(unspent) + + var auxs coin.AddressUxOuts + err := v.db.View("", func(tx *dbutil.Tx) error { + var err error + auxs, err = v.getCreateTransactionAuxsAddress(tx, tc.addrs, tc.ignoreUnconfirmed) + return err + }) + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.expectedAuxs, auxs) + }) + } +} + +var matchDBTx = mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true +}) + +func matchUxOutsAnyOrder(inputs []cipher.SHA256) func(args []cipher.SHA256) bool { + return func(args []cipher.SHA256) bool { + // Compares two []coin.UxOuts for equality, ignoring the order of elements in the slice + if len(args) != len(inputs) { + return false + } + + x := make([]cipher.SHA256, len(inputs)) + copy(x, inputs) + y := make([]cipher.SHA256, len(args)) + copy(y, args) + + sort.Slice(x, func(a, b int) bool { + return bytes.Compare(x[a][:], x[b][:]) < 0 + }) + sort.Slice(y, func(a, b int) bool { + return bytes.Compare(y[a][:], y[b][:]) < 0 + }) + + return reflect.DeepEqual(x, y) + } +} + +// hashesIntersect returns true if there are any hashes common to x and y +func hashesIntersect(x, y []cipher.SHA256) bool { + for _, a := range x { + for _, b := range y { + if a == b { + return true + } + } + } + return false +} + +// unconfirmedForEachMockRun simulates the Unconfirmed.ForEach callback method +func unconfirmedForEachMockRun(t *testing.T, unconfirmedTxns []coin.Transaction, uxOuts []cipher.SHA256, ignoreUnconfirmed bool) func(args mock.Arguments) { + return func(args mock.Arguments) { + fn := args.Get(1).(func(cipher.SHA256, UnconfirmedTransaction) error) + for _, u := range unconfirmedTxns { + err := fn(u.Hash(), UnconfirmedTransaction{ + Transaction: u, + }) + + // If any of the input hashes are in an unconfirmed transaction, + // the callback handler should have returned ErrSpendingUnconfirmed + // unless IgnoreUnconfirmed is true + hasUnconfirmedHash := hashesIntersect(u.In, uxOuts) + + if hasUnconfirmedHash { + if ignoreUnconfirmed { + require.NoError(t, err) + } else { + require.Equal(t, ErrSpendingUnconfirmed, err) + } + } else { + require.NoError(t, err) + } + + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/balance.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/balance.go new file mode 100644 index 00000000..e9edbe1e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/balance.go @@ -0,0 +1,87 @@ +package wallet + +import ( + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +/* +Do not show balances or outputs that have not cleared yet +- should only allow spends against outputs that are on head +*/ + +// BalancePair records the confirmed and predicted balance of an address +type BalancePair struct { + Confirmed Balance + Predicted Balance +} + +// AddressBalances represents a map of address balances +type AddressBalances map[string]BalancePair + +// Balance has coins and hours +type Balance struct { + Coins uint64 + Hours uint64 +} + +// NewBalance creates balance +func NewBalance(coins, hours uint64) Balance { + return Balance{ + Coins: coins, + Hours: hours, + } +} + +// NewBalanceFromUxOut creates Balance from UxOut +func NewBalanceFromUxOut(headTime uint64, ux *coin.UxOut) (Balance, error) { + hours, err := ux.CoinHours(headTime) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: ux.Body.Coins, + Hours: hours, + }, nil +} + +// Add adds two Balances +func (bal Balance) Add(other Balance) (Balance, error) { + coins, err := mathutil.AddUint64(bal.Coins, other.Coins) + if err != nil { + return Balance{}, err + } + + hours, err := mathutil.AddUint64(bal.Hours, other.Hours) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: coins, + Hours: hours, + }, nil +} + +// Sub subtracts other from self and returns the new Balance. Will panic if +// other is greater than balance, because Coins and Hours are unsigned. +func (bal Balance) Sub(other Balance) Balance { + if other.Coins > bal.Coins || other.Hours > bal.Hours { + logger.Panic("Cannot subtract balances, second balance is too large") + } + return Balance{ + Coins: bal.Coins - other.Coins, + Hours: bal.Hours - other.Hours, + } +} + +// Equals compares two Balances +func (bal Balance) Equals(other Balance) bool { + return bal.Coins == other.Coins && bal.Hours == other.Hours +} + +// IsZero returns true if the Balance is empty (both coins and hours) +func (bal Balance) IsZero() bool { + return bal.Coins == 0 && bal.Hours == 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/bip44_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/bip44_wallet.go new file mode 100644 index 00000000..e30b052c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/bip44_wallet.go @@ -0,0 +1,535 @@ +package wallet + +import ( + "errors" + "fmt" + "math" + "sort" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +// Bip44Wallet manages keys using the original Skycoin deterministic +// keypair generator method. +// With this generator, a single chain of addresses is created, each one dependent +// on the previous. +type Bip44Wallet struct { + Meta + ExternalEntries Entries + ChangeEntries Entries +} + +// newBip44Wallet creates a Bip44Wallet +func newBip44Wallet(meta Meta) (*Bip44Wallet, error) { //nolint:unparam + return &Bip44Wallet{ + Meta: meta, + }, nil +} + +// PackSecrets copies data from decrypted wallets into the secrets container +func (w *Bip44Wallet) PackSecrets(ss Secrets) { + ss.set(secretSeed, w.Meta.Seed()) + ss.set(secretSeedPassphrase, w.Meta.SeedPassphrase()) + + // Saves entry secret keys in secrets + for _, e := range w.ExternalEntries { + ss.set(e.Address.String(), e.Secret.Hex()) + } + for _, e := range w.ChangeEntries { + ss.set(e.Address.String(), e.Secret.Hex()) + } +} + +// UnpackSecrets copies data from decrypted secrets into the wallet +func (w *Bip44Wallet) UnpackSecrets(ss Secrets) error { + seed, ok := ss.get(secretSeed) + if !ok { + return errors.New("seed doesn't exist in secrets") + } + w.Meta.setSeed(seed) + + passphrase, _ := ss.get(secretSeedPassphrase) + w.Meta.setSeedPassphrase(passphrase) + + if err := w.ExternalEntries.unpackSecretKeys(ss); err != nil { + return err + } + return w.ChangeEntries.unpackSecretKeys(ss) +} + +// Clone clones the wallet a new wallet object +func (w *Bip44Wallet) Clone() Wallet { + return &Bip44Wallet{ + Meta: w.Meta.clone(), + ExternalEntries: w.ExternalEntries.clone(), + ChangeEntries: w.ChangeEntries.clone(), + } +} + +// CopyFrom copies the src wallet to w +func (w *Bip44Wallet) CopyFrom(src Wallet) { + w.Meta = src.(*Bip44Wallet).Meta.clone() + w.ExternalEntries = src.(*Bip44Wallet).ExternalEntries.clone() + w.ChangeEntries = src.(*Bip44Wallet).ChangeEntries.clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *Bip44Wallet) CopyFromRef(src Wallet) { + *w = *(src.(*Bip44Wallet)) +} + +// Erase wipes secret fields in wallet +func (w *Bip44Wallet) Erase() { + w.Meta.eraseSeeds() + w.ExternalEntries.erase() + w.ChangeEntries.erase() +} + +// ToReadable converts the wallet to its readable (serializable) format +func (w *Bip44Wallet) ToReadable() Readable { + return NewReadableBip44Wallet(w) +} + +// Validate validates the wallet +func (w *Bip44Wallet) Validate() error { + return w.Meta.validate() +} + +// GetAddresses returns all addresses in wallet +func (w *Bip44Wallet) GetAddresses() []cipher.Addresser { + return append(w.ExternalEntries.getAddresses(), w.ChangeEntries.getAddresses()...) +} + +// GetSkycoinAddresses returns all Skycoin addresses in wallet. The wallet's coin type must be Skycoin. +func (w *Bip44Wallet) GetSkycoinAddresses() ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("Bip44Wallet coin type is not skycoin") + } + + return append(w.ExternalEntries.getSkycoinAddresses(), w.ChangeEntries.getSkycoinAddresses()...), nil +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *Bip44Wallet) GetEntries() Entries { + if w.EntriesLen() == 0 { + return nil + } + return append(w.ExternalEntries.clone(), w.ChangeEntries.clone()...) +} + +// EntriesLen returns the number of entries in the wallet +func (w *Bip44Wallet) EntriesLen() int { + return len(w.ExternalEntries) + len(w.ChangeEntries) +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *Bip44Wallet) GetEntryAt(i int) Entry { + if i >= len(w.ExternalEntries) { + return w.ChangeEntries[i-len(w.ExternalEntries)] + } + return w.ExternalEntries[i] +} + +// GetEntry returns entry of given address +func (w *Bip44Wallet) GetEntry(a cipher.Address) (Entry, bool) { + if e, ok := w.ExternalEntries.get(a); ok { + return e, true + } + + return w.ChangeEntries.get(a) +} + +// HasEntry returns true if the wallet has an Entry with a given cipher.Address. +func (w *Bip44Wallet) HasEntry(a cipher.Address) bool { + return w.ExternalEntries.has(a) || w.ChangeEntries.has(a) +} + +// CoinHDNode return the "coin" level bip44 HDNode +func (w *Bip44Wallet) CoinHDNode() (*bip44.Coin, error) { + // w.Meta.Seed() must return a valid bip39 mnemonic + seed, err := bip39.NewSeed(w.Meta.Seed(), w.Meta.SeedPassphrase()) + if err != nil { + return nil, err + } + + c, err := bip44.NewCoin(seed, w.Meta.Bip44Coin()) + if err != nil { + logger.Critical().WithError(err).Error("Failed to derive the bip44 purpose node") + if bip32.IsImpossibleChildError(err) { + logger.Critical().Error("ImpossibleChild: this seed cannot be used for bip44") + } + return nil, err + } + + return c, nil +} + +// nextChildIdx returns the next child index from a sequence of entries. +// This assumes that entries are sorted by child number ascending. +func nextChildIdx(e Entries) uint32 { + if len(e) == 0 { + return 0 + } + return e[len(e)-1].ChildNumber + 1 +} + +// generateEntries generates addresses for a change chain (should be 0 or 1) starting from an initial child number. +func (w *Bip44Wallet) generateEntries(num uint64, changeIdx, initialChildIdx uint32) (Entries, error) { + if w.Meta.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if num > math.MaxUint32 { + return nil, NewError(errors.New("Bip44Wallet.generateEntries num too large")) + } + + // Cap `num` in case it would exceed the maximum child index number + if math.MaxUint32-initialChildIdx < uint32(num) { + num = uint64(math.MaxUint32 - initialChildIdx) + } + + if num == 0 { + return nil, nil + } + + c, err := w.CoinHDNode() + if err != nil { + return nil, err + } + + // Generate the "account" HDNode. Multiple accounts are not supported; use 0. + account, err := c.Account(0) + if err != nil { + logger.Critical().WithError(err).Error("Failed to derive the bip44 account node") + if bip32.IsImpossibleChildError(err) { + logger.Critical().Error("ImpossibleChild: this seed cannot be used for bip44") + } + return nil, err + } + + // Generate the external chain parent node + chain, err := account.NewPrivateChildKey(changeIdx) + if err != nil { + logger.Critical().WithError(err).Error("Failed to derive the final bip44 chain node") + if bip32.IsImpossibleChildError(err) { + logger.Critical().Error("ImpossibleChild: this seed cannot be used for bip44") + } + return nil, err + } + + // Generate `num` secret keys from the external chain HDNode, skipping any children that + // are invalid (note that this has probability ~2^-128) + var seckeys []*bip32.PrivateKey + var addressIndices []uint32 + j := initialChildIdx + for i := uint32(0); i < uint32(num); i++ { + k, err := chain.NewPrivateChildKey(j) + + var addErr error + j, addErr = mathutil.AddUint32(j, 1) + if addErr != nil { + logger.Critical().WithError(addErr).WithFields(logrus.Fields{ + "num": num, + "initialChildIdx": initialChildIdx, + "accountIdx": 0, + "changeIdx": changeIdx, + "childIdx": j, + "i": i, + }).Error("childIdx can't be incremented any further") + return nil, errors.New("childIdx can't be incremented any further") + } + + if err != nil { + if bip32.IsImpossibleChildError(err) { + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "accountIdx": 0, + "changeIdx": changeIdx, + "childIdx": j, + }).Error("ImpossibleChild for chain node child element") + continue + } else { + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "accountIdx": 0, + "changeIdx": changeIdx, + "childIdx": j, + }).Error("NewPrivateChildKey failed unexpectedly") + return nil, err + } + } + + seckeys = append(seckeys, k) + addressIndices = append(addressIndices, j-1) + } + + entries := make(Entries, len(seckeys)) + makeAddress := w.Meta.AddressConstructor() + for i, xprv := range seckeys { + sk := cipher.MustNewSecKey(xprv.Key) + pk := cipher.MustPubKeyFromSecKey(sk) + entries[i] = Entry{ + Address: makeAddress(pk), + Secret: sk, + Public: pk, + ChildNumber: addressIndices[i], + Change: changeIdx, + } + } + + return entries, nil +} + +// PeekChangeEntry creates and returns an entry for the change chain. +// If used, the caller the append it with GenerateChangeEntry +func (w *Bip44Wallet) PeekChangeEntry() (Entry, error) { + entries, err := w.generateEntries(1, bip44.ChangeChainIndex, nextChildIdx(w.ChangeEntries)) + if err != nil { + return Entry{}, err + } + + if len(entries) == 0 { + return Entry{}, NewError(errors.New("PeekChangeEntry: no more change addresses")) + } + + return entries[0], nil +} + +// GenerateChangeEntry creates, appends and returns an entry for the change chain +func (w *Bip44Wallet) GenerateChangeEntry() (Entry, error) { + e, err := w.PeekChangeEntry() + if err != nil { + return Entry{}, err + } + + w.ChangeEntries = append(w.ChangeEntries, Entries{e}...) + + return w.ChangeEntries[len(w.ChangeEntries)-1], nil +} + +// GenerateAddresses generates addresses for the external chain, and appends them to the wallet's entries array +func (w *Bip44Wallet) GenerateAddresses(num uint64) ([]cipher.Addresser, error) { + entries, err := w.generateEntries(num, bip44.ExternalChainIndex, nextChildIdx(w.ExternalEntries)) + if err != nil { + return nil, err + } + + w.ExternalEntries = append(w.ExternalEntries, entries...) + + return entries.getAddresses(), nil +} + +// GenerateSkycoinAddresses generates Skycoin addresses for the external chain, and appends them to the wallet's entries array. +// If the wallet's coin type is not Skycoin, returns an error +func (w *Bip44Wallet) GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("GenerateSkycoinAddresses called for non-skycoin wallet") + } + + entries, err := w.generateEntries(num, bip44.ExternalChainIndex, nextChildIdx(w.ExternalEntries)) + if err != nil { + return nil, err + } + + w.ExternalEntries = append(w.ExternalEntries, entries...) + + return entries.getSkycoinAddresses(), nil +} + +// ScanAddresses scans ahead N addresses, truncating up to the highest address with any transaction history. +func (w *Bip44Wallet) ScanAddresses(scanN uint64, tf TransactionsFinder) error { + if w.Meta.IsEncrypted() { + return ErrWalletEncrypted + } + + if scanN == 0 { + return nil + } + + w2 := w.Clone().(*Bip44Wallet) + + externalEntries, err := scanAddressesBip32(func(num uint64, childIdx uint32) (Entries, error) { + return w.generateEntries(num, bip44.ExternalChainIndex, childIdx) + }, scanN, tf, nextChildIdx(w2.ExternalEntries)) + if err != nil { + return err + } + + changeEntries, err := scanAddressesBip32(func(num uint64, childIdx uint32) (Entries, error) { + return w.generateEntries(num, bip44.ChangeChainIndex, childIdx) + }, scanN, tf, nextChildIdx(w2.ChangeEntries)) + if err != nil { + return err + } + + // Add scanned entries + w2.ExternalEntries = append(w2.ExternalEntries, externalEntries...) + w2.ChangeEntries = append(w2.ChangeEntries, changeEntries...) + + *w = *w2 + + return nil +} + +// scanAddressesBip32 implements the address scanning algorithm for bip32 +// based (e.g. bip44, xpub) wallets +func scanAddressesBip32(generateEntries func(num uint64, childIdx uint32) (Entries, error), scanN uint64, tf TransactionsFinder, initialChildIdx uint32) (Entries, error) { + if scanN == 0 { + return nil, nil + } + + nAddAddrs := uint64(0) + n := scanN + extraScan := uint64(0) + childIdx := initialChildIdx + var newEntries Entries + + for { + // Generate the addresses to scan + entries, err := generateEntries(n, childIdx) + if err != nil { + return nil, err + } + + if len(entries) == 0 { + break + } + + // The bip32 child key sequence is finite and may be truncated at its limit + n = uint64(len(entries)) + if n == 0 { + break + } + + childIdx = nextChildIdx(entries) + + newEntries = append(newEntries, entries...) + + addrs := entries.getSkycoinAddresses() + + // Find if these addresses had any activity + active, err := tf.AddressesActivity(addrs) + if err != nil { + return nil, err + } + + // Check activity from the last one until we find the address that has activity + var keepNum uint64 + for i := len(active) - 1; i >= 0; i-- { + if active[i] { + keepNum = uint64(i + 1) + break + } + } + + if keepNum == 0 { + break + } + + nAddAddrs += keepNum + extraScan + + if n < keepNum { + logger.Panic("n should never be less than keepNum") + } + + // extraScan is the number of addresses with no activity beyond the + // last address with activity + extraScan = n - keepNum + + // n is the number of addresses to scan the next iteration + n = scanN - extraScan + } + + return newEntries[:nAddAddrs], nil +} + +// Fingerprint returns a unique ID fingerprint for this wallet, composed of its initial address +// and wallet type +func (w *Bip44Wallet) Fingerprint() string { + addr := "" + if len(w.ExternalEntries) == 0 { + if !w.IsEncrypted() { + entries, err := w.generateEntries(1, bip44.ExternalChainIndex, 0) + if err != nil { + logger.WithError(err).Panic("Fingerprint failed to generate initial entry for empty wallet") + } + addr = entries[0].Address.String() + } + } else { + addr = w.ExternalEntries[0].Address.String() + } + return fmt.Sprintf("%s-%s", w.Type(), addr) +} + +// ReadableBip44Wallet used for [de]serialization of a deterministic wallet +type ReadableBip44Wallet struct { + Meta `json:"meta"` + ReadableEntries `json:"entries"` +} + +// LoadReadableBip44Wallet loads a deterministic wallet from disk +func LoadReadableBip44Wallet(wltFile string) (*ReadableBip44Wallet, error) { + var rw ReadableBip44Wallet + if err := file.LoadJSON(wltFile, &rw); err != nil { + return nil, err + } + if rw.Type() != WalletTypeBip44 { + return nil, ErrInvalidWalletType + } + return &rw, nil +} + +// NewReadableBip44Wallet creates readable wallet +func NewReadableBip44Wallet(w *Bip44Wallet) *ReadableBip44Wallet { + return &ReadableBip44Wallet{ + Meta: w.Meta.clone(), + ReadableEntries: newReadableEntries(w.GetEntries(), w.Meta.Coin(), w.Meta.Type()), + } +} + +// ToWallet convert readable wallet to Wallet +func (rw *ReadableBip44Wallet) ToWallet() (Wallet, error) { + w := &Bip44Wallet{ + Meta: rw.Meta.clone(), + } + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + logger.WithError(err).Error("ReadableBip44Wallet.ToWallet Validate failed") + return nil, err + } + + ets, err := rw.ReadableEntries.toWalletEntries(w.Meta.Coin(), w.Meta.Type(), w.Meta.IsEncrypted()) + if err != nil { + logger.WithError(err).Error("ReadableBip44Wallet.ToWallet ReadableEntries.toWalletEntries failed") + return nil, err + } + + // Split the single array of entries into separate external and change chains, + // for easier internal management + for _, e := range ets { + switch e.Change { + case bip44.ExternalChainIndex: + w.ExternalEntries = append(w.ExternalEntries, e) + case bip44.ChangeChainIndex: + w.ChangeEntries = append(w.ChangeEntries, e) + default: + logger.Panicf("invalid change value %d", e.Change) + } + } + + // Sort childNumber low to high + sort.Slice(w.ExternalEntries, func(i, j int) bool { + return w.ExternalEntries[i].ChildNumber < w.ExternalEntries[j].ChildNumber + }) + sort.Slice(w.ChangeEntries, func(i, j int) bool { + return w.ChangeEntries[i].ChildNumber < w.ChangeEntries[j].ChildNumber + }) + + return w, err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/collection_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/collection_wallet.go new file mode 100644 index 00000000..ad0de070 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/collection_wallet.go @@ -0,0 +1,207 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/file" +) + +// CollectionWallet manages keys as an arbitrary collection. +// It has no defined keypair generator. The only way to add keys to the +// wallet is to explicitly add them. +// This wallet does not support address scanning or generation. +// This wallet does not use seeds. +type CollectionWallet struct { + Meta + Entries Entries +} + +// newCollectionWallet creates a CollectionWallet +func newCollectionWallet(meta Meta) (*CollectionWallet, error) { //nolint:unparam + return &CollectionWallet{ + Meta: meta, + }, nil +} + +// PackSecrets copies data from decrypted wallets into the secrets container +func (w *CollectionWallet) PackSecrets(ss Secrets) { + ss.set(secretSeed, w.Meta.Seed()) + ss.set(secretLastSeed, w.Meta.LastSeed()) + + // Saves entry secret keys in secrets + for _, e := range w.Entries { + ss.set(e.Address.String(), e.Secret.Hex()) + } +} + +// UnpackSecrets copies data from decrypted secrets into the wallet +func (w *CollectionWallet) UnpackSecrets(ss Secrets) error { + return w.Entries.unpackSecretKeys(ss) +} + +// Clone clones the wallet a new wallet object +func (w *CollectionWallet) Clone() Wallet { + return &CollectionWallet{ + Meta: w.Meta.clone(), + Entries: w.Entries.clone(), + } +} + +// CopyFrom copies the src wallet by reallocating +func (w *CollectionWallet) CopyFrom(src Wallet) { + w.Meta = src.(*CollectionWallet).Meta.clone() + w.Entries = src.(*CollectionWallet).Entries.clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *CollectionWallet) CopyFromRef(src Wallet) { + *w = *(src.(*CollectionWallet)) +} + +// Erase wipes secret fields in wallet +func (w *CollectionWallet) Erase() { + w.Meta.eraseSeeds() + w.Entries.erase() +} + +// ToReadable converts the wallet to its readable (serializable) format +func (w *CollectionWallet) ToReadable() Readable { + return NewReadableCollectionWallet(w) +} + +// Validate validates the wallet +func (w *CollectionWallet) Validate() error { + return w.Meta.validate() +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *CollectionWallet) GetEntries() Entries { + return w.Entries.clone() +} + +// EntriesLen returns the number of entries in the wallet +func (w *CollectionWallet) EntriesLen() int { + return len(w.Entries) +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *CollectionWallet) GetEntryAt(i int) Entry { + return w.Entries[i] +} + +// GetEntry returns entry of given address +func (w *CollectionWallet) GetEntry(a cipher.Address) (Entry, bool) { + return w.Entries.get(a) +} + +// HasEntry returns true if the wallet has an Entry with a given cipher.Address. +func (w *CollectionWallet) HasEntry(a cipher.Address) bool { + return w.Entries.has(a) +} + +// GenerateAddresses is a no-op for "collection" wallets +func (w *CollectionWallet) GenerateAddresses(num uint64) ([]cipher.Addresser, error) { + return nil, NewError(errors.New("A collection wallet does not implement GenerateAddresses")) +} + +// GenerateSkycoinAddresses is a no-op for "collection" wallets +func (w *CollectionWallet) GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) { + return nil, NewError(errors.New("A collection wallet does not implement GenerateSkycoinAddresses")) +} + +// ScanAddresses is a no-op for "collection" wallets +func (w *CollectionWallet) ScanAddresses(scanN uint64, tf TransactionsFinder) error { + return NewError(errors.New("A collection wallet does not implement ScanAddresses")) +} + +// GetAddresses returns all addresses in wallet +func (w *CollectionWallet) GetAddresses() []cipher.Addresser { + return w.Entries.getAddresses() +} + +// GetSkycoinAddresses returns all Skycoin addresses in wallet. The wallet's coin type must be Skycoin. +func (w *CollectionWallet) GetSkycoinAddresses() ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("CollectionWallet coin type is not skycoin") + } + + return w.Entries.getSkycoinAddresses(), nil +} + +// Fingerprint returns an empty string; fingerprints are only defined for +// wallets with a seed +func (w *CollectionWallet) Fingerprint() string { + return "" +} + +// AddEntry adds a new entry to the wallet. +func (w *CollectionWallet) AddEntry(e Entry) error { + if w.IsEncrypted() { + return ErrWalletEncrypted + } + + if err := e.Verify(); err != nil { + return err + } + + for _, entry := range w.Entries { + if e.SkycoinAddress() == entry.SkycoinAddress() { + return errors.New("wallet already contains entry with this address") + } + } + + w.Entries = append(w.Entries, e) + return nil +} + +// ReadableCollectionWallet used for [de]serialization of a collection wallet +type ReadableCollectionWallet struct { + Meta `json:"meta"` + ReadableEntries `json:"entries"` +} + +// NewReadableCollectionWallet creates readable wallet +func NewReadableCollectionWallet(w *CollectionWallet) *ReadableCollectionWallet { + return &ReadableCollectionWallet{ + Meta: w.Meta.clone(), + ReadableEntries: newReadableEntries(w.Entries, w.Meta.Coin(), w.Meta.Type()), + } +} + +// LoadReadableCollectionWallet loads a collection wallet from disk +func LoadReadableCollectionWallet(wltFile string) (*ReadableCollectionWallet, error) { + logger.WithField("filename", wltFile).Info("LoadReadableCollectionWallet") + var rw ReadableCollectionWallet + if err := file.LoadJSON(wltFile, &rw); err != nil { + return nil, err + } + if rw.Type() != WalletTypeCollection { + return nil, ErrInvalidWalletType + } + return &rw, nil +} + +// ToWallet convert readable wallet to Wallet +func (rw *ReadableCollectionWallet) ToWallet() (Wallet, error) { + w := &CollectionWallet{ + Meta: rw.Meta.clone(), + } + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + logger.WithError(err).Error("ReadableCollectionWallet.ToWallet Validate failed") + return nil, err + } + + ets, err := rw.ReadableEntries.toWalletEntries(w.Meta.Coin(), w.Meta.Type(), w.Meta.IsEncrypted()) + if err != nil { + logger.WithError(err).Error("ReadableCollectionWallet.ToWallet toWalletEntries failed") + return nil, err + } + + w.Entries = ets + + return w, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto.go new file mode 100644 index 00000000..49ec0b12 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto.go @@ -0,0 +1,66 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/encrypt" +) + +type cryptor interface { + Encrypt(data, password []byte) ([]byte, error) + Decrypt(data, password []byte) ([]byte, error) +} + +// CryptoType represents the type of crypto name +type CryptoType string + +// CryptoTypeFromString converts string to CryptoType +func CryptoTypeFromString(s string) (CryptoType, error) { + switch CryptoType(s) { + case CryptoTypeSha256Xor: + return CryptoTypeSha256Xor, nil + case CryptoTypeScryptChacha20poly1305: + return CryptoTypeScryptChacha20poly1305, nil + case CryptoTypeScryptChacha20poly1305Insecure: + return CryptoTypeScryptChacha20poly1305Insecure, nil + default: + return "", errors.New("unknown crypto type") + } +} + +// Crypto types +const ( + // CryptoTypeSha256Xor uses the SHA256-XOR encryption method (unsafe - no key derivation) + CryptoTypeSha256Xor = CryptoType("sha256-xor") + // CryptoTypeScryptChacha20poly1305 uses chacha20poly1305 + scrypt key derivation (use this) + CryptoTypeScryptChacha20poly1305 = CryptoType("scrypt-chacha20poly1305") + // CryptoTypeScryptChacha20poly1305Insecure uses chacha20poly1305 + scrypt key derivation with a weak work factor (unsafe) + CryptoTypeScryptChacha20poly1305Insecure = CryptoType("scrypt-chacha20poly1305-insecure") + + // DefaultCryptoType is the default CryptoType used + DefaultCryptoType = CryptoTypeScryptChacha20poly1305 +) + +// cryptoTable records all supported wallet crypto methods +// If want to support new crypto methods, register here. +var cryptoTable = map[CryptoType]cryptor{ + CryptoTypeSha256Xor: encrypt.DefaultSha256Xor, + CryptoTypeScryptChacha20poly1305: encrypt.DefaultScryptChacha20poly1305, + CryptoTypeScryptChacha20poly1305Insecure: encrypt.ScryptChacha20poly1305{ + N: 1 << 15, + R: encrypt.ScryptR, + P: encrypt.ScryptP, + KeyLen: encrypt.ScryptKeyLen, + }, +} + +// getCrypto gets crypto of given type +func getCrypto(cryptoType CryptoType) (cryptor, error) { + c, ok := cryptoTable[cryptoType] + if !ok { + return nil, fmt.Errorf("can not find crypto %v in crypto table", cryptoType) + } + + return c, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto_test.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto_test.go new file mode 100644 index 00000000..f36ef9f0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto_test.go @@ -0,0 +1,29 @@ +package wallet + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSecrets(t *testing.T) { + s := make(Secrets) + s.set("k1", "v1") + + v, ok := s.get("k1") + require.True(t, ok) + require.Equal(t, "v1", v) + + _, ok = s.get("k2") + require.False(t, ok) + + s.set("k2", "v2") + + b, err := s.serialize() + require.NoError(t, err) + + s1 := make(Secrets) + err = s1.deserialize(b) + require.NoError(t, err) + require.Equal(t, s, s1) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/deterministic_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/deterministic_wallet.go new file mode 100644 index 00000000..3464cacd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/deterministic_wallet.go @@ -0,0 +1,321 @@ +package wallet + +import ( + "encoding/hex" + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/file" +) + +// DeterministicWallet manages keys using the original Skycoin deterministic +// keypair generator method. +// With this generator, a single chain of addresses is created, each one dependent +// on the previous. +type DeterministicWallet struct { + Meta + Entries Entries +} + +// newDeterministicWallet creates a DeterministicWallet +func newDeterministicWallet(meta Meta) (*DeterministicWallet, error) { //nolint:unparam + return &DeterministicWallet{ + Meta: meta, + }, nil +} + +// PackSecrets copies data from decrypted wallets into the secrets container +func (w *DeterministicWallet) PackSecrets(ss Secrets) { + ss.set(secretSeed, w.Meta.Seed()) + ss.set(secretLastSeed, w.Meta.LastSeed()) + + // Saves entry secret keys in secrets + for _, e := range w.Entries { + ss.set(e.Address.String(), e.Secret.Hex()) + } +} + +// UnpackSecrets copies data from decrypted secrets into the wallet +func (w *DeterministicWallet) UnpackSecrets(ss Secrets) error { + seed, ok := ss.get(secretSeed) + if !ok { + return errors.New("seed doesn't exist in secrets") + } + w.Meta.setSeed(seed) + + lastSeed, ok := ss.get(secretLastSeed) + if !ok { + return errors.New("lastSeed doesn't exist in secrets") + } + w.Meta.setLastSeed(lastSeed) + + return w.Entries.unpackSecretKeys(ss) +} + +// Clone clones the wallet a new wallet object +func (w *DeterministicWallet) Clone() Wallet { + return &DeterministicWallet{ + Meta: w.Meta.clone(), + Entries: w.Entries.clone(), + } +} + +// CopyFrom copies the src wallet to w +func (w *DeterministicWallet) CopyFrom(src Wallet) { + w.Meta = src.(*DeterministicWallet).Meta.clone() + w.Entries = src.(*DeterministicWallet).Entries.clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *DeterministicWallet) CopyFromRef(src Wallet) { + *w = *(src.(*DeterministicWallet)) +} + +// Erase wipes secret fields in wallet +func (w *DeterministicWallet) Erase() { + w.Meta.eraseSeeds() + w.Entries.erase() +} + +// ToReadable converts the wallet to its readable (serializable) format +func (w *DeterministicWallet) ToReadable() Readable { + return NewReadableDeterministicWallet(w) +} + +// Validate validates the wallet +func (w *DeterministicWallet) Validate() error { + return w.Meta.validate() +} + +// GetAddresses returns all addresses in wallet +func (w *DeterministicWallet) GetAddresses() []cipher.Addresser { + return w.Entries.getAddresses() +} + +// GetSkycoinAddresses returns all Skycoin addresses in wallet. The wallet's coin type must be Skycoin. +func (w *DeterministicWallet) GetSkycoinAddresses() ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("DeterministicWallet coin type is not skycoin") + } + + return w.Entries.getSkycoinAddresses(), nil +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *DeterministicWallet) GetEntries() Entries { + return w.Entries.clone() +} + +// EntriesLen returns the number of entries in the wallet +func (w *DeterministicWallet) EntriesLen() int { + return len(w.Entries) +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *DeterministicWallet) GetEntryAt(i int) Entry { + return w.Entries[i] +} + +// GetEntry returns entry of given address +func (w *DeterministicWallet) GetEntry(a cipher.Address) (Entry, bool) { + return w.Entries.get(a) +} + +// HasEntry returns true if the wallet has an Entry with a given cipher.Address. +func (w *DeterministicWallet) HasEntry(a cipher.Address) bool { + return w.Entries.has(a) +} + +// GenerateAddresses generates addresses +func (w *DeterministicWallet) GenerateAddresses(num uint64) ([]cipher.Addresser, error) { + if w.Meta.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if num == 0 { + return nil, nil + } + + var seckeys []cipher.SecKey + var seed []byte + if len(w.Entries) == 0 { + seed, seckeys = cipher.MustGenerateDeterministicKeyPairsSeed([]byte(w.Meta.Seed()), int(num)) + } else { + sd, err := hex.DecodeString(w.Meta.LastSeed()) + if err != nil { + return nil, fmt.Errorf("decode hex seed failed: %v", err) + } + seed, seckeys = cipher.MustGenerateDeterministicKeyPairsSeed(sd, int(num)) + } + + w.Meta.setLastSeed(hex.EncodeToString(seed)) + + addrs := make([]cipher.Addresser, len(seckeys)) + makeAddress := w.Meta.AddressConstructor() + for i, s := range seckeys { + p := cipher.MustPubKeyFromSecKey(s) + a := makeAddress(p) + addrs[i] = a + w.Entries = append(w.Entries, Entry{ + Address: a, + Secret: s, + Public: p, + }) + } + return addrs, nil +} + +// GenerateSkycoinAddresses generates Skycoin addresses. If the wallet's coin type is not Skycoin, returns an error +func (w *DeterministicWallet) GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("GenerateSkycoinAddresses called for non-skycoin wallet") + } + + addrs, err := w.GenerateAddresses(num) + if err != nil { + return nil, err + } + + skyAddrs := make([]cipher.Address, len(addrs)) + for i, a := range addrs { + skyAddrs[i] = a.(cipher.Address) + } + + return skyAddrs, nil +} + +// reset resets the wallet entries and move the lastSeed to origin +func (w *DeterministicWallet) reset() { + w.Entries = Entries{} + w.Meta.setLastSeed(w.Meta.Seed()) +} + +// ScanAddresses scans ahead N addresses, truncating up to the highest address with any transaction history. +func (w *DeterministicWallet) ScanAddresses(scanN uint64, tf TransactionsFinder) error { + if w.Meta.IsEncrypted() { + return ErrWalletEncrypted + } + + if scanN == 0 { + return nil + } + + w2 := w.Clone().(*DeterministicWallet) + + nExistingAddrs := uint64(len(w2.Entries)) + nAddAddrs := uint64(0) + n := scanN + extraScan := uint64(0) + + for { + // Generate the addresses to scan + addrs, err := w2.GenerateSkycoinAddresses(n) + if err != nil { + return err + } + + // Find if these addresses had any activity + active, err := tf.AddressesActivity(addrs) + if err != nil { + return err + } + + // Check activity from the last one until we find the address that has activity + var keepNum uint64 + for i := len(active) - 1; i >= 0; i-- { + if active[i] { + keepNum = uint64(i + 1) + break + } + } + + if keepNum == 0 { + break + } + + nAddAddrs += keepNum + extraScan + + // extraScan is the number of addresses with no activity beyond the + // last address with activity + extraScan = n - keepNum + + // n is the number of addresses to scan the next iteration + n = scanN - extraScan + } + + // Regenerate addresses up to nExistingAddrs + nAddAddrs. + // This is necessary to keep the lastSeed updated. + w2.reset() + if _, err := w2.GenerateSkycoinAddresses(nExistingAddrs + nAddAddrs); err != nil { + return err + } + + *w = *w2 + + return nil +} + +// Fingerprint returns a unique ID fingerprint for this wallet, composed of its initial address +// and wallet type +func (w *DeterministicWallet) Fingerprint() string { + addr := "" + if len(w.Entries) == 0 { + if !w.IsEncrypted() { + _, pk, _ := cipher.MustDeterministicKeyPairIterator([]byte(w.Meta.Seed())) + addr = w.Meta.AddressConstructor()(pk).String() + } + } else { + addr = w.Entries[0].Address.String() + } + return fmt.Sprintf("%s-%s", w.Type(), addr) +} + +// ReadableDeterministicWallet used for [de]serialization of a deterministic wallet +type ReadableDeterministicWallet struct { + Meta `json:"meta"` + ReadableEntries `json:"entries"` +} + +// LoadReadableDeterministicWallet loads a deterministic wallet from disk +func LoadReadableDeterministicWallet(wltFile string) (*ReadableDeterministicWallet, error) { + var rw ReadableDeterministicWallet + if err := file.LoadJSON(wltFile, &rw); err != nil { + return nil, err + } + if rw.Type() != WalletTypeDeterministic { + return nil, ErrInvalidWalletType + } + return &rw, nil +} + +// NewReadableDeterministicWallet creates readable wallet +func NewReadableDeterministicWallet(w *DeterministicWallet) *ReadableDeterministicWallet { + return &ReadableDeterministicWallet{ + Meta: w.Meta.clone(), + ReadableEntries: newReadableEntries(w.Entries, w.Meta.Coin(), w.Meta.Type()), + } +} + +// ToWallet convert readable wallet to Wallet +func (rw *ReadableDeterministicWallet) ToWallet() (Wallet, error) { + w := &DeterministicWallet{ + Meta: rw.Meta.clone(), + } + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + logger.WithError(err).Error("ReadableDeterministicWallet.ToWallet Validate failed") + return nil, err + } + + ets, err := rw.ReadableEntries.toWalletEntries(w.Meta.Coin(), w.Meta.Type(), w.Meta.IsEncrypted()) + if err != nil { + logger.WithError(err).Error("ReadableDeterministicWallet.ToWallet toWalletEntries failed") + return nil, err + } + + w.Entries = ets + + return w, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/entry.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/entry.go new file mode 100644 index 00000000..a207f4fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/entry.go @@ -0,0 +1,126 @@ +package wallet + +import ( + "encoding/hex" + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +// Entry represents the wallet entry +type Entry struct { + Address cipher.Addresser + Public cipher.PubKey + Secret cipher.SecKey + ChildNumber uint32 // For bip32/bip44 + Change uint32 // For bip44 +} + +// SkycoinAddress returns the Skycoin address of an entry. Panics if Address is not a Skycoin address +func (we Entry) SkycoinAddress() cipher.Address { + return we.Address.(cipher.Address) +} + +// BitcoinAddress returns the Skycoin address of an entry. Panics if Address is not a Bitcoin address +func (we Entry) BitcoinAddress() cipher.BitcoinAddress { + return we.Address.(cipher.BitcoinAddress) +} + +// Verify checks that the public key is derivable from the secret key, +// and that the public key is associated with the address +func (we *Entry) Verify() error { + pk, err := cipher.PubKeyFromSecKey(we.Secret) + if err != nil { + return err + } + + if pk != we.Public { + return errors.New("invalid public key for secret key") + } + + return we.VerifyPublic() +} + +// VerifyPublic checks that the public key is associated with the address +func (we *Entry) VerifyPublic() error { + if err := we.Public.Verify(); err != nil { + return err + } + return we.Address.Verify(we.Public) +} + +// Entries are an array of wallet entries +type Entries []Entry + +func (entries Entries) clone() Entries { + if len(entries) == 0 { + return nil + } + return append(Entries{}, entries...) +} + +func (entries Entries) has(a cipher.Address) bool { + // This doesn't use getEntry() to avoid copying an Entry in the return value, + // which may contain a secret key + for _, e := range entries { + if e.SkycoinAddress() == a { + return true + } + } + return false +} + +func (entries Entries) get(a cipher.Address) (Entry, bool) { + for _, e := range entries { + if e.SkycoinAddress() == a { + return e, true + } + } + return Entry{}, false +} + +func (entries Entries) getSkycoinAddresses() []cipher.Address { + addrs := make([]cipher.Address, len(entries)) + for i, e := range entries { + addrs[i] = e.SkycoinAddress() + } + return addrs +} + +func (entries Entries) getAddresses() []cipher.Addresser { + addrs := make([]cipher.Addresser, len(entries)) + for i, e := range entries { + addrs[i] = e.Address + } + return addrs +} + +// eraseEntries wipes private keys in entries +func (entries Entries) erase() { + for i := range entries { + for j := range entries[i].Secret { + entries[i].Secret[j] = 0 + } + entries[i].Secret = cipher.SecKey{} + } +} + +// unpackSecretKeys for each entry, look for the secret key in the Secrets dict, keyed by address +func (entries Entries) unpackSecretKeys(ss Secrets) error { + for i, e := range entries { + sstr, ok := ss.get(e.Address.String()) + if !ok { + return fmt.Errorf("secret of address %s doesn't exist in secrets", e.Address) + } + + s, err := hex.DecodeString(sstr) + if err != nil { + return fmt.Errorf("decode secret hex string failed: %v", err) + } + + copy(entries[i].Secret[:], s[:]) + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/meta.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/meta.go new file mode 100644 index 00000000..10f878aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/meta.go @@ -0,0 +1,357 @@ +package wallet + +import ( + "errors" + "fmt" + "strconv" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" +) + +// wallet meta fields +const ( + metaVersion = "version" // wallet version + metaFilename = "filename" // wallet file name + metaLabel = "label" // wallet label + metaTimestamp = "tm" // the timestamp when creating the wallet + metaType = "type" // wallet type + metaCoin = "coin" // coin type + metaEncrypted = "encrypted" // whether the wallet is encrypted + metaCryptoType = "cryptoType" // encrytion/decryption type + metaSeed = "seed" // wallet seed + metaLastSeed = "lastSeed" // seed for generating next address [deterministic wallets] + metaSecrets = "secrets" // secrets which records the encrypted seeds and secrets of address entries + metaBip44Coin = "bip44Coin" // bip44 coin type + metaSeedPassphrase = "seedPassphrase" // seed passphrase [bip44 wallets] + metaXPub = "xpub" // xpub key [xpub wallets] +) + +// Meta holds wallet metadata +type Meta map[string]string + +func (m Meta) clone() Meta { + mm := make(Meta, len(m)) + for k, v := range m { + mm[k] = v + } + return mm +} + +// erase wipes the seed and last seed +func (m Meta) eraseSeeds() { + m.setSeed("") + m.setLastSeed("") + m.setSeedPassphrase("") +} + +// validate validates the wallet +func (m Meta) validate() error { + if fn := m[metaFilename]; fn == "" { + return errors.New("filename not set") + } + + if tm := m[metaTimestamp]; tm != "" { + _, err := strconv.ParseInt(tm, 10, 64) + if err != nil { + return errors.New("invalid timestamp") + } + } + + walletType, ok := m[metaType] + if !ok { + return errors.New("type field not set") + } + if !IsValidWalletType(walletType) { + return ErrInvalidWalletType + } + + if coinType := m[metaCoin]; coinType == "" { + return errors.New("coin field not set") + } + + var isEncrypted bool + if encStr, ok := m[metaEncrypted]; ok { + // validate the encrypted value + var err error + isEncrypted, err = strconv.ParseBool(encStr) + if err != nil { + return errors.New("encrypted field is not a valid bool") + } + } + + if isEncrypted { + cryptoType, ok := m[metaCryptoType] + if !ok { + return errors.New("crypto type field not set") + } + + if _, err := getCrypto(CryptoType(cryptoType)); err != nil { + return errors.New("unknown crypto type") + } + + if s := m[metaSecrets]; s == "" { + return errors.New("wallet is encrypted, but secrets field not set") + } + + if s := m[metaSeed]; s != "" { + return errors.New("seed should not be visible in encrypted wallets") + } + + if s := m[metaLastSeed]; s != "" { + return errors.New("lastSeed should not be visible in encrypted wallets") + } + } else { + if s := m[metaSecrets]; s != "" { + return errors.New("secrets should not be in unencrypted wallets") + } + } + + switch walletType { + case WalletTypeCollection: + if s := m[metaSeed]; s != "" { + return errors.New("seed should not be in collection wallets") + } + + if s := m[metaLastSeed]; s != "" { + return errors.New("lastSeed should not be in collection wallets") + } + case WalletTypeDeterministic: + if !isEncrypted { + if s := m[metaSeed]; s == "" { + return errors.New("seed missing in unencrypted deterministic wallet") + } + + if s := m[metaLastSeed]; s == "" { + return errors.New("lastSeed missing in unencrypted deterministic wallet") + } + } + case WalletTypeBip44: + if !isEncrypted { + // bip44 wallet seeds must be a valid bip39 mnemonic + if s := m[metaSeed]; s == "" { + return errors.New("seed missing in unencrypted bip44 wallet") + } else if err := bip39.ValidateMnemonic(s); err != nil { + return err + } + } + + if s := m[metaBip44Coin]; s == "" { + return errors.New("bip44Coin missing") + } else if _, err := strconv.ParseUint(s, 10, 32); err != nil { + return fmt.Errorf("bip44Coin invalid: %v", err) + } + + if s := m[metaLastSeed]; s != "" { + return errors.New("lastSeed should not be in bip44 wallets") + } + case WalletTypeXPub: + if s := m[metaSeed]; s != "" { + return errors.New("seed should not be in xpub wallets") + } + + if s := m[metaLastSeed]; s != "" { + return errors.New("lastSeed should not be in xpub wallets") + } + default: + return errors.New("unhandled wallet type") + } + + if m[metaXPub] != "" && walletType != WalletTypeXPub { + return errors.New("xpub is only used for xpub wallets") + } + + return nil +} + +// Find returns a key value from the metadata map +func (m Meta) Find(k string) string { + return m[k] +} + +// Type gets the wallet type +func (m Meta) Type() string { + return m[metaType] +} + +// Version gets the wallet version +func (m Meta) Version() string { + return m[metaVersion] +} + +// SetVersion sets the wallet version +func (m Meta) SetVersion(v string) { + m[metaVersion] = v +} + +// Filename gets the wallet filename +func (m Meta) Filename() string { + return m[metaFilename] +} + +// SetFilename sets the wallet filename +func (m Meta) SetFilename(fn string) { + m[metaFilename] = fn +} + +// Label gets the wallet label +func (m Meta) Label() string { + return m[metaLabel] +} + +// SetLabel sets the wallet label +func (m Meta) SetLabel(label string) { + m[metaLabel] = label +} + +// LastSeed returns the last seed +func (m Meta) LastSeed() string { + return m[metaLastSeed] +} + +func (m Meta) setLastSeed(lseed string) { + m[metaLastSeed] = lseed +} + +// Seed returns the seed +func (m Meta) Seed() string { + return m[metaSeed] +} + +func (m Meta) setSeed(seed string) { + m[metaSeed] = seed +} + +// SeedPassphrase returns the seed passphrase +func (m Meta) SeedPassphrase() string { + return m[metaSeedPassphrase] +} + +func (m Meta) setSeedPassphrase(p string) { + m[metaSeedPassphrase] = p +} + +// Coin returns the wallet's coin type +func (m Meta) Coin() CoinType { + return CoinType(m[metaCoin]) +} + +// SetCoin sets the wallet's coin type +func (m Meta) SetCoin(ct CoinType) { + m[metaCoin] = string(ct) +} + +// Bip44Coin returns the bip44 coin type +func (m Meta) Bip44Coin() bip44.CoinType { + c := m[metaBip44Coin] + if c == "" { + logger.Critical().Error("wallet.Meta.Bip44Coin() is empty") + return bip44.CoinType(0) + } + + x, err := strconv.ParseUint(c, 10, 32) + if err != nil { + logger.WithError(err).Panic() + } + + return bip44.CoinType(x) +} + +func (m Meta) setBip44Coin(ct bip44.CoinType) { + m[metaBip44Coin] = strconv.FormatUint(uint64(ct), 10) +} + +func (m Meta) setIsEncrypted(encrypt bool) { + m[metaEncrypted] = strconv.FormatBool(encrypt) +} + +// SetEncrypted sets encryption fields +func (m Meta) SetEncrypted(cryptoType CryptoType, encryptedSecrets string) { + m.setCryptoType(cryptoType) + m.setSecrets(encryptedSecrets) + m.setIsEncrypted(true) +} + +// SetDecrypted unsets encryption fields +func (m Meta) SetDecrypted() { + m.setIsEncrypted(false) + m.setSecrets("") + m.setCryptoType("") +} + +// IsEncrypted checks whether the wallet is encrypted. +func (m Meta) IsEncrypted() bool { + encStr, ok := m[metaEncrypted] + if !ok { + return false + } + + b, err := strconv.ParseBool(encStr) + if err != nil { + // This can't happen, the meta.encrypted value is either set by + // setEncrypted() method or converted in ReadableWallet.toWallet(). + // toWallet() method will throw error if the meta.encrypted string is invalid. + logger.Critical().WithError(err).Error("parse wallet.meta.encrypted string failed") + return false + } + return b +} + +func (m Meta) setCryptoType(tp CryptoType) { + m[metaCryptoType] = string(tp) +} + +// CryptoType returns the encryption type +func (m Meta) CryptoType() CryptoType { + return CryptoType(m[metaCryptoType]) +} + +// Secrets returns the encrypted wallet secrets +func (m Meta) Secrets() string { + return m[metaSecrets] +} + +func (m Meta) setSecrets(s string) { + m[metaSecrets] = s +} + +// Timestamp returns the timestamp +func (m Meta) Timestamp() int64 { + // Intentionally ignore the error when parsing the timestamp, + // if it isn't valid or is missing it will be set to 0. + // Also, this value is validated by wallet.validate() + x, _ := strconv.ParseInt(m[metaTimestamp], 10, 64) //nolint:errcheck + return x +} + +// SetTimestamp sets the timestamp +func (m Meta) SetTimestamp(t int64) { + m[metaTimestamp] = strconv.FormatInt(t, 10) +} + +// AddressConstructor returns a function to create a cipher.Addresser from a cipher.PubKey +func (m Meta) AddressConstructor() func(cipher.PubKey) cipher.Addresser { + switch m.Coin() { + case CoinTypeSkycoin: + return func(pk cipher.PubKey) cipher.Addresser { + return cipher.AddressFromPubKey(pk) + } + case CoinTypeBitcoin: + return func(pk cipher.PubKey) cipher.Addresser { + return cipher.BitcoinAddressFromPubKey(pk) + } + default: + logger.Panicf("Invalid wallet coin type %q", m.Coin()) + return nil + } +} + +func (m Meta) setXPub(xpub string) { + m[metaXPub] = xpub +} + +// XPub returns the wallet's configured XPub key +func (m Meta) XPub() string { + return m[metaXPub] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/readable.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/readable.go new file mode 100644 index 00000000..4ea78cd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/readable.go @@ -0,0 +1,200 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" +) + +// ReadableEntry wallet entry with json tags +type ReadableEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` + Secret string `json:"secret_key"` + ChildNumber *uint32 `json:"child_number,omitempty"` // For bip32/bip44 + Change *uint32 `json:"change,omitempty"` // For bip44 +} + +// NewReadableEntry creates readable wallet entry +func NewReadableEntry(coinType CoinType, walletType string, e Entry) ReadableEntry { + re := ReadableEntry{} + if !e.Address.Null() { + re.Address = e.Address.String() + } + + if !e.Public.Null() { + re.Public = e.Public.Hex() + } + + if !e.Secret.Null() { + switch coinType { + case CoinTypeSkycoin: + re.Secret = e.Secret.Hex() + case CoinTypeBitcoin: + re.Secret = cipher.BitcoinWalletImportFormatFromSeckey(e.Secret) + default: + logger.Panicf("Invalid coin type %q", coinType) + } + } + + switch walletType { + case WalletTypeBip44: + cn := e.ChildNumber + re.ChildNumber = &cn + change := e.Change + re.Change = &change + case WalletTypeXPub: + cn := e.ChildNumber + re.ChildNumber = &cn + if e.Change != 0 { + logger.Panicf("wallet.Entry.Change is not 0 but wallet type is %q", walletType) + } + default: + if e.ChildNumber != 0 { + logger.Panicf("wallet.Entry.ChildNumber is not 0 but wallet type is %q", walletType) + } + if e.Change != 0 { + logger.Panicf("wallet.Entry.Change is not 0 but wallet type is %q", walletType) + } + } + + return re +} + +// ReadableEntries array of ReadableEntry +type ReadableEntries []ReadableEntry + +func newReadableEntries(entries Entries, coinType CoinType, walletType string) ReadableEntries { + re := make(ReadableEntries, len(entries)) + for i, e := range entries { + re[i] = NewReadableEntry(coinType, walletType, e) + } + return re +} + +// GetEntries returns this array +func (res ReadableEntries) GetEntries() ReadableEntries { + return res +} + +// toWalletEntries convert readable entries to entries +// converts base on the wallet version. +func (res ReadableEntries) toWalletEntries(coinType CoinType, walletType string, isEncrypted bool) ([]Entry, error) { + entries := make([]Entry, len(res)) + for i, re := range res { + e, err := newEntryFromReadable(coinType, walletType, &re) + if err != nil { + return []Entry{}, err + } + + // Verify the wallet if it's not encrypted + if !isEncrypted && re.Secret != "" { + if err := e.Verify(); err != nil { + return nil, err + } + } + + entries[i] = *e + } + return entries, nil +} + +// newEntryFromReadable creates WalletEntry base one ReadableWalletEntry +func newEntryFromReadable(coinType CoinType, walletType string, re *ReadableEntry) (*Entry, error) { + var a cipher.Addresser + var err error + + switch coinType { + case CoinTypeSkycoin: + a, err = cipher.DecodeBase58Address(re.Address) + case CoinTypeBitcoin: + a, err = cipher.DecodeBase58BitcoinAddress(re.Address) + default: + logger.Panicf("Invalid coin type %q", coinType) + } + + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(re.Public) + if err != nil { + return nil, err + } + + // Decodes the secret hex string if any + var secret cipher.SecKey + if re.Secret != "" { + switch coinType { + case CoinTypeSkycoin: + secret, err = cipher.SecKeyFromHex(re.Secret) + case CoinTypeBitcoin: + secret, err = cipher.SecKeyFromBitcoinWalletImportFormat(re.Secret) + default: + logger.Panicf("Invalid coin type %q", coinType) + } + if err != nil { + return nil, err + } + } + + var childNumber uint32 + var change uint32 + switch walletType { + case WalletTypeBip44: + if re.ChildNumber == nil { + return nil, fmt.Errorf("child_number required for %q wallet type", walletType) + } + if re.Change == nil { + return nil, fmt.Errorf("change required for %q wallet type", walletType) + } + + childNumber = *re.ChildNumber + change = *re.Change + + switch change { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + default: + return nil, errors.New("change must be either 0 or 1") + } + + case WalletTypeXPub: + if re.ChildNumber == nil { + return nil, fmt.Errorf("child_number required for %q wallet type", walletType) + } + + childNumber = *re.ChildNumber + + if re.Change != nil { + return nil, fmt.Errorf("change should not be set for %q wallet type", walletType) + } + + default: + if re.ChildNumber != nil { + return nil, fmt.Errorf("child_number should not be set for %q wallet type", walletType) + } + if re.Change != nil { + return nil, fmt.Errorf("change should not be set for %q wallet type", walletType) + } + } + + return &Entry{ + Address: a, + Public: p, + Secret: secret, + ChildNumber: childNumber, + Change: change, + }, nil +} + +// Readable defines the readable wallet API. +// A readable wallet is the on-disk representation of a wallet. +type Readable interface { + ToWallet() (Wallet, error) + Timestamp() int64 + SetFilename(string) + Filename() string + GetEntries() ReadableEntries +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/secrets.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/secrets.go new file mode 100644 index 00000000..a1769eba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/secrets.go @@ -0,0 +1,36 @@ +package wallet + +import "encoding/json" + +const ( + secretSeed = "seed" + secretLastSeed = "lastSeed" + secretSeedPassphrase = "seedPassphrase" +) + +// Secrets hold secret data, to be encrypted +type Secrets map[string]string + +func (s Secrets) get(key string) (string, bool) { + v, ok := s[key] + return v, ok +} + +func (s Secrets) set(key, v string) { + s[key] = v +} + +func (s Secrets) serialize() ([]byte, error) { + return json.Marshal(s) +} + +func (s Secrets) deserialize(data []byte) error { + return json.Unmarshal(data, &s) +} + +func (s Secrets) erase() { + for k := range s { + s[k] = "" + delete(s, k) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/service.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/service.go new file mode 100644 index 00000000..3ad38bdd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/service.go @@ -0,0 +1,616 @@ +package wallet + +import ( + "fmt" + "os" + "path/filepath" + "sync" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/util/file" +) + +// TransactionsFinder interface for finding address related transaction hashes +type TransactionsFinder interface { + AddressesActivity(addrs []cipher.Address) ([]bool, error) +} + +// Service wallet service struct +type Service struct { + sync.RWMutex + wallets Wallets + config Config + // fingerprints is used to check for duplicate deterministic wallets + fingerprints map[string]string +} + +// Config wallet service config +type Config struct { + WalletDir string + CryptoType CryptoType + EnableWalletAPI bool + EnableSeedAPI bool + Bip44Coin *bip44.CoinType +} + +// NewConfig creates a default Config +func NewConfig() Config { + bc := bip44.CoinTypeSkycoin + return Config{ + WalletDir: "./", + CryptoType: DefaultCryptoType, + EnableWalletAPI: false, + EnableSeedAPI: false, + Bip44Coin: &bc, + } +} + +// NewService new wallet service +func NewService(c Config) (*Service, error) { + serv := &Service{ + config: c, + fingerprints: make(map[string]string), + } + + if !serv.config.EnableWalletAPI { + return serv, nil + } + + if err := os.MkdirAll(c.WalletDir, os.FileMode(0700)); err != nil { + return nil, fmt.Errorf("failed to create wallet directory %s: %v", c.WalletDir, err) + } + + // Removes .wlt.bak files before loading wallets + if err := removeBackupFiles(serv.config.WalletDir); err != nil { + return nil, fmt.Errorf("remove .wlt.bak files in %v failed: %v", serv.config.WalletDir, err) + } + + // Load all wallets from disk + w, err := loadWallets(serv.config.WalletDir) + if err != nil { + return nil, fmt.Errorf("failed to load all wallets: %v", err) + } + + // Abort if there are duplicate wallets (identified by fingerprint) on disk + if wltID, fp, hasDup := w.containsDuplicate(); hasDup { + return nil, fmt.Errorf("duplicate wallet found with fingerprint %s in file %q", fp, wltID) + } + + // Abort if there are empty deterministic wallets on disk + if wltID, hasEmpty := w.containsEmpty(); hasEmpty { + return nil, fmt.Errorf("empty wallet file found: %q", wltID) + } + + serv.setWallets(w) + + fields := logrus.Fields{ + "walletDir": serv.config.WalletDir, + } + if serv.config.Bip44Coin != nil { + fields["bip44Coin"] = *serv.config.Bip44Coin + } + logger.WithFields(fields).Debug("wallet.NewService complete") + + return serv, nil +} + +// WalletDir returns the configured wallet directory +func (serv *Service) WalletDir() (string, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return "", ErrWalletAPIDisabled + } + return serv.config.WalletDir, nil +} + +func (serv *Service) updateOptions(opts Options) Options { + // Apply service-configured default settings for wallet options + if opts.Encrypt && opts.CryptoType == "" { + opts.CryptoType = serv.config.CryptoType + } + if opts.Type == WalletTypeBip44 && opts.Bip44Coin == nil && serv.config.Bip44Coin != nil { + c := *serv.config.Bip44Coin + opts.Bip44Coin = &c + } + return opts +} + +// CreateWallet creates a wallet with the given wallet file name and options. +// A address will be automatically generated by default. +func (serv *Service) CreateWallet(wltName string, options Options, tf TransactionsFinder) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + if wltName == "" { + wltName = serv.generateUniqueWalletFilename() + } + + options = serv.updateOptions(options) + return serv.loadWallet(wltName, options, tf) +} + +// loadWallet loads wallet from seed and scan the first N addresses +func (serv *Service) loadWallet(wltName string, options Options, tf TransactionsFinder) (Wallet, error) { + options = serv.updateOptions(options) + w, err := NewWalletScanAhead(wltName, options, tf) + if err != nil { + return nil, err + } + + fingerprint := w.Fingerprint() + if fingerprint != "" { + if _, ok := serv.fingerprints[fingerprint]; ok { + // Note: collection wallets do not have fingerprints + switch w.Type() { + case WalletTypeDeterministic, WalletTypeBip44: + return nil, ErrSeedUsed + case WalletTypeXPub: + return nil, ErrXPubKeyUsed + default: + logger.WithFields(logrus.Fields{ + "walletType": w.Type(), + "fingerprint": fingerprint, + }).Panic("Unhandled wallet type after fingerprint conflict") + } + } + } + + if err := serv.wallets.add(w); err != nil { + return nil, err + } + + if err := Save(w, serv.config.WalletDir); err != nil { + // If save fails, remove the added wallet + serv.wallets.remove(w.Filename()) + return nil, err + } + + if fingerprint != "" { + serv.fingerprints[fingerprint] = w.Filename() + } + + return w.Clone(), nil +} + +func (serv *Service) generateUniqueWalletFilename() string { + wltName := NewWalletFilename() + for { + if w := serv.wallets.get(wltName); w == nil { + break + } + wltName = NewWalletFilename() + } + + return wltName +} + +// EncryptWallet encrypts wallet with password +func (serv *Service) EncryptWallet(wltID string, password []byte) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + if w.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if err := Lock(w, password, serv.config.CryptoType); err != nil { + return nil, err + } + + // Save to disk first + if err := Save(w, serv.config.WalletDir); err != nil { + return nil, err + } + + // Sets the encrypted wallet + serv.wallets.set(w) + return w, nil +} + +// DecryptWallet decrypts wallet with password +func (serv *Service) DecryptWallet(wltID string, password []byte) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + // Returns error if wallet is not encrypted + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + // Unlocks the wallet + unlockWlt, err := Unlock(w, password) + if err != nil { + return nil, err + } + + // Updates the wallet file + if err := Save(unlockWlt, serv.config.WalletDir); err != nil { + return nil, err + } + + // Sets the decrypted wallet in memory + serv.wallets.set(unlockWlt) + return unlockWlt, nil +} + +// NewAddresses generate address entries in given wallet, +// return nil if wallet does not exist. +// Set password as nil if the wallet is not encrypted, otherwise the password must be provided. +func (serv *Service) NewAddresses(wltID string, password []byte, num uint64) ([]cipher.Address, error) { + serv.Lock() + defer serv.Unlock() + + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + var addrs []cipher.Address + f := func(wlt Wallet) error { + var err error + addrs, err = wlt.GenerateSkycoinAddresses(num) + return err + } + + if w.IsEncrypted() { + if err := GuardUpdate(w, password, f); err != nil { + return nil, err + } + } else { + if len(password) != 0 { + return nil, ErrWalletNotEncrypted + } + + if err := f(w); err != nil { + return nil, err + } + } + + // Checks if the wallet file is writable + wf := filepath.Join(serv.config.WalletDir, w.Filename()) + if !file.IsWritable(wf) { + return nil, ErrWalletPermission + } + + // Save the wallet first + if err := Save(w, serv.config.WalletDir); err != nil { + return nil, err + } + + serv.wallets.set(w) + + return addrs, nil +} + +// GetSkycoinAddresses returns all addresses in given wallet +func (serv *Service) GetSkycoinAddresses(wltID string) ([]cipher.Address, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + return w.GetSkycoinAddresses() +} + +// GetWallet returns wallet by id +func (serv *Service) GetWallet(wltID string) (Wallet, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + return serv.getWallet(wltID) +} + +// returns the clone of the wallet of given id +func (serv *Service) getWallet(wltID string) (Wallet, error) { + w := serv.wallets.get(wltID) + if w == nil { + return nil, ErrWalletNotExist + } + return w.Clone(), nil +} + +// GetWallets returns all wallet clones +func (serv *Service) GetWallets() (Wallets, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + wlts := make(Wallets, len(serv.wallets)) + for k, w := range serv.wallets { + wlts[k] = w.Clone() + } + return wlts, nil +} + +// UpdateWalletLabel updates the wallet label +func (serv *Service) UpdateWalletLabel(wltID, label string) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + w.SetLabel(label) + + if err := Save(w, serv.config.WalletDir); err != nil { + return err + } + + serv.wallets.set(w) + return nil +} + +// UnloadWallet removes wallet of given wallet id from the service +func (serv *Service) UnloadWallet(wltID string) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + wlt := serv.wallets.get(wltID) + if wlt != nil { + if fp := wlt.Fingerprint(); fp != "" { + delete(serv.fingerprints, fp) + } + } + + serv.wallets.remove(wltID) + return nil +} + +func (serv *Service) setWallets(wlts Wallets) { + serv.wallets = wlts + + for wltID, wlt := range wlts { + if fp := wlt.Fingerprint(); fp != "" { + serv.fingerprints[fp] = wltID + } + } +} + +// GetWalletSeed returns seed and seed passphrase of encrypted wallet of given wallet id +// Returns ErrWalletNotEncrypted if it's not encrypted +func (serv *Service) GetWalletSeed(wltID string, password []byte) (string, string, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return "", "", ErrWalletAPIDisabled + } + + if !serv.config.EnableSeedAPI { + return "", "", ErrSeedAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return "", "", err + } + + if !w.IsEncrypted() { + return "", "", ErrWalletNotEncrypted + } + + var seed, seedPassphrase string + if err := GuardView(w, password, func(wlt Wallet) error { + seed = wlt.Seed() + seedPassphrase = wlt.SeedPassphrase() + return nil + }); err != nil { + return "", "", err + } + + return seed, seedPassphrase, nil +} + +// UpdateSecrets opens a wallet for modification of secret data and saves it safely +func (serv *Service) UpdateSecrets(wltID string, password []byte, f func(Wallet) error) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + if w.IsEncrypted() { + if err := GuardUpdate(w, password, f); err != nil { + return err + } + } else if len(password) != 0 { + return ErrWalletNotEncrypted + } else { + if err := f(w); err != nil { + return err + } + } + + // Save the wallet first + if err := Save(w, serv.config.WalletDir); err != nil { + return err + } + + serv.wallets.set(w) + + return nil +} + +// Update opens a wallet for modification of non-secret data and saves it safely +func (serv *Service) Update(wltID string, f func(Wallet) error) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + if err := f(w); err != nil { + return err + } + + // Save the wallet first + if err := Save(w, serv.config.WalletDir); err != nil { + return err + } + + serv.wallets.set(w) + + return nil +} + +// ViewSecrets opens a wallet for reading secret data +func (serv *Service) ViewSecrets(wltID string, password []byte, f func(Wallet) error) error { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + if w.IsEncrypted() { + return GuardView(w, password, f) + } else if len(password) != 0 { + return ErrWalletNotEncrypted + } else { + return f(w) + } +} + +// View opens a wallet for reading non-secret data +func (serv *Service) View(wltID string, f func(Wallet) error) error { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + return f(w) +} + +// RecoverWallet recovers an encrypted wallet from seed. +// The recovered wallet will be encrypted with the new password, if provided. +func (serv *Service) RecoverWallet(wltName, seed, seedPassphrase string, password []byte) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltName) + if err != nil { + return nil, err + } + + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + switch w.Type() { + case WalletTypeDeterministic, WalletTypeBip44: + default: + return nil, ErrWalletTypeNotRecoverable + } + + // Create a wallet from this seed and compare the fingerprint + w2, err := NewWallet(wltName, Options{ + Type: w.Type(), + Coin: w.Coin(), + Seed: seed, + SeedPassphrase: seedPassphrase, + GenerateN: 1, + }) + if err != nil { + err = NewError(fmt.Errorf("RecoverWallet failed to create temporary wallet for fingerprint comparison: %v", err)) + logger.Critical().WithError(err).Error() + return nil, err + } + if w.Fingerprint() != w2.Fingerprint() { + return nil, ErrWalletRecoverSeedWrong + } + + // Create a new wallet with the same number of addresses, encrypting if needed + w3, err := NewWallet(wltName, Options{ + Type: w.Type(), + Coin: w.Coin(), + Label: w.Label(), + Seed: seed, + SeedPassphrase: seedPassphrase, + Encrypt: len(password) != 0, + Password: password, + CryptoType: w.CryptoType(), + GenerateN: uint64(w.EntriesLen()), + }) + if err != nil { + return nil, err + } + + // Preserve the timestamp of the old wallet + w3.SetTimestamp(w.Timestamp()) + + // Save to disk + if err := Save(w3, serv.config.WalletDir); err != nil { + return nil, err + } + + serv.wallets.set(w3) + + return w3.Clone(), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/service_test.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/service_test.go new file mode 100644 index 00000000..e0cbb827 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/service_test.go @@ -0,0 +1,3780 @@ +package wallet + +import ( + "encoding/hex" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func prepareWltDir() string { + dir, err := ioutil.TempDir("", "wallets") + if err != nil { + panic(err) + } + + return dir +} + +func dirIsEmpty(t *testing.T, dir string) { + f, err := os.Open(dir) + require.NoError(t, err) + names, err := f.Readdirnames(1) + require.Equal(t, io.EOF, err) + require.Empty(t, names) +} + +func TestNewService(t *testing.T) { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + // check if the wallet dir is created + _, err = os.Stat(dir) + require.NoError(t, err) + + require.Equal(t, dir, s.config.WalletDir) + + require.Equal(t, 0, len(s.wallets)) + + // test load wallets + s, err = NewService(Config{ + WalletDir: "./testdata", + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + require.Equal(t, 11, len(s.wallets)) + + }) + } +} + +func TestNewServiceDupWallets(t *testing.T) { + _, err := NewService(Config{ + WalletDir: "./testdata/duplicate_wallets", + EnableWalletAPI: true, + }) + require.NotNil(t, err) + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "duplicate wallet found with fingerprint deterministic-2M755W9o7933roLASK9PZTmqRsjQUsVen9y in file"), err.Error()) +} + +func TestNewServiceEmptyWallet(t *testing.T) { + cases := []struct { + dir string + fn string + }{ + { + dir: "./testdata/empty_wallet", + fn: "empty.wlt", + }, + { + dir: "./testdata/empty_bip44_wallet", + fn: "empty.wlt", + }, + } + + for _, tc := range cases { + t.Run(filepath.Join(tc.dir, tc.fn), func(t *testing.T) { + _, err := NewService(Config{ + WalletDir: tc.dir, + EnableWalletAPI: true, + }) + testutil.RequireError(t, err, fmt.Sprintf("empty wallet file found: %q", tc.fn)) + }) + } +} + +func TestServiceCreateWallet(t *testing.T) { + tt := []struct { + name string + encrypt bool + password []byte + enableWalletAPI bool + walletType string + filename string + seed string + xpub string + err error + }{ + { + name: "type=xpub encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: true, + walletType: WalletTypeXPub, + filename: "t1.wlt", + xpub: "xpub6EFYYRQeAbWLdWQYbtQv8HnemieKNmYUE23RmwphgtMLjz4UaStKADSKNoSSXM5FDcq4gZec2q6n7kdNWfuMdScxK1cXm8tR37kaitHtvuJ", + }, + { + name: "type=collection encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: true, + walletType: WalletTypeCollection, + filename: "t1.wlt", + }, + { + name: "type=bip44 encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: true, + walletType: WalletTypeBip44, + filename: "t1.wlt", + seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + }, + { + name: "encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: true, + filename: "t1.wlt", + seed: "seed1", + walletType: WalletTypeDeterministic, + }, + { + name: "encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: false, + filename: "t1.wlt", + seed: "seed1", + err: ErrWalletAPIDisabled, + walletType: WalletTypeDeterministic, + }, + { + name: "encrypt=false", + encrypt: false, + enableWalletAPI: true, + filename: "t1.wlt", + seed: "seed1", + walletType: WalletTypeDeterministic, + }, + { + name: "encrypt=false", + encrypt: false, + enableWalletAPI: false, + filename: "t1.wlt", + seed: "seed1", + err: ErrWalletAPIDisabled, + walletType: WalletTypeDeterministic, + }, + } + for _, tc := range tt { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("%v crypto=%v", tc.name, ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: tc.enableWalletAPI, + }) + require.NoError(t, err) + + w, err := s.CreateWallet(tc.filename, Options{ + Seed: tc.seed, + Encrypt: tc.encrypt, + Password: tc.password, + Type: tc.walletType, + XPub: tc.xpub, + }, nil) + + if tc.err == nil { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Equal(t, tc.err, err, "%s != %s", tc.err.Error(), err.Error()) + return + } + + require.NoError(t, err) + require.Equal(t, w.IsEncrypted(), tc.encrypt) + if tc.encrypt { + require.NotEmpty(t, w.Secrets()) + checkNoSensitiveData(t, w) + + // Checks the wallet file doesn't contain sensitive data + lw, err := Load(filepath.Join(dir, w.Filename())) + require.NoError(t, err) + checkNoSensitiveData(t, lw) + } else { + require.NoError(t, w.Validate()) + } + + // create wallet with dup wallet name + var otherSeed string + var otherXPub string + var dupFingerprintErr error + switch tc.walletType { + case WalletTypeDeterministic, WalletTypeBip44: + otherSeed = bip39.MustNewDefaultMnemonic() + dupFingerprintErr = ErrSeedUsed + case WalletTypeXPub: + otherXPub = "xpub6Ea7Vm9yPWhgrpmH7oTTc8vFmfp5Hpaf4ZpcjNWWJmpqr68viqmndJGkq6UFZcM6MpSXpqxF93PgvC7PuqByk5Pkx1XmcKMqkZhQbg21JXA" + dupFingerprintErr = ErrXPubKeyUsed + } + + _, err = s.CreateWallet(tc.filename, Options{ + Seed: otherSeed, + Type: tc.walletType, + XPub: otherXPub, + }, nil) + require.Equal(t, err, ErrWalletNameConflict) + + switch tc.walletType { + case WalletTypeDeterministic, WalletTypeBip44, WalletTypeXPub: + // create wallet with dup seed or xpub key + dupWlt := "dup_wallet.wlt" + _, err = s.CreateWallet(dupWlt, Options{ + Seed: tc.seed, + XPub: tc.xpub, + Type: tc.walletType, + }, nil) + require.Equal(t, dupFingerprintErr, err) + + // check that the dup wallet is not created + _, ok := s.wallets[dupWlt] + require.False(t, ok) + + testutil.RequireFileNotExists(t, filepath.Join(dir, dupWlt)) + + case WalletTypeCollection: + // collection wallets never conflict with each other + + default: + t.Fatal("unhandled wallet type") + } + }) + } + } +} + +type mockTxnsFinder map[cipher.Address]bool + +func (mb mockTxnsFinder) AddressesActivity(addrs []cipher.Address) ([]bool, error) { + if len(addrs) == 0 { + return nil, nil + } + active := make([]bool, len(addrs)) + for i, addr := range addrs { + active[i] = mb[addr] + } + return active, nil +} + +func TestServiceLoadWallet(t *testing.T) { + // Prepare addresss + seed := "seed" + _, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 10) + var addrs []cipher.Address + for _, s := range seckeys { + addrs = append(addrs, cipher.MustAddressFromSecKey(s)) + } + + bip44Seed := "voyage say extend find sheriff surge priority merit ignore maple cash argue" + bip44AddrStrs := []string{ + "9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG", + "29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW", + "2ZUAv9MGSpDKR3dnKMUnrKqLenV22JXAxzP", + "fwNVThqdzH7JMsStoLrTpkVsemesbdGftm", + "eyr5KDLTnN6ZZeggeHqDcXnrwmNUi7sGk2", + "Aee3J9qoFPLoUEJes6YVzdKHdeuvCrMZeJ", + "29MZS8aiYUdEwcruwCPggVJG9YJLsm92FHa", + "2Hbm3bwKiEwqNAMAzVJmz5hL1dNTfaA3ju7", + "WCaSCwSZnVqtkYeiKryeHjR8LbzE3KbkzJ", + "baRjCy1yHfishGdZi3bVaPaL7VJM7FZCSd", + } + bip44Addrs := make([]cipher.Address, len(bip44AddrStrs)) + for i, a := range bip44AddrStrs { + bip44Addrs[i] = cipher.MustDecodeBase58Address(a) + } + + bip44SeedPassphrase := "foobar" + bip44SeedPassphraseAddrStrs := []string{ + "n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8", + "mGeG2PDoU4nc9qE1FSSreAjFeKG12zDvur", + "rhbE3thvA747E81KfaYCujur7GKXjdhvS4", + "BDEmcU8u4oTf9domk19Nzh65MXoWLLUvJN", + "cubnvXGENW3gTdcdJADp8XEJaBscpy7gpq", + "wv37cSiVhjgo6Qrrs994UJ52YU2zWNGJbu", + "7aEzdSrcm1s2pm5YhshsRmkFy4EuYEnJ49", + "nQJgxEE2eaggUeGaA73e4DaXq6KAvUiaS4", + "2G9bhZaJrTKo1LScgtdvVXpQD4P8tKvgkvL", + "4RqFK3qLz26XbPjgJsiJ3587P7p6DesDHd", + } + bip44SeedPassphraseAddrs := make([]cipher.Address, len(bip44SeedPassphraseAddrStrs)) + for i, a := range bip44SeedPassphraseAddrStrs { + bip44SeedPassphraseAddrs[i] = cipher.MustDecodeBase58Address(a) + } + + tt := []struct { + name string + opts Options + tf TransactionsFinder + err error + expectAddrNum int + expectAddrs []cipher.Address + }{ + { + name: "raw wallet address=1", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: seed, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + addrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: addrs[:1], + }, + { + name: "raw wallet address=2", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: seed, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + addrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: addrs[:2], + }, + { + name: "encrypted wallet address=1", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: seed, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + addrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: addrs[:1], + }, + { + name: "encrypted wallet address=2", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: seed, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + addrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: addrs[:2], + }, + + { + name: "bip44 raw wallet address=1", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44Addrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: bip44Addrs[:1], + }, + { + name: "bip44 raw wallet address=2", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44Addrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: bip44Addrs[:2], + }, + { + name: "bip44 encrypted wallet address=1", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44Addrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: bip44Addrs[:1], + }, + { + name: "bip44 encrypted wallet address=2", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44Addrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: bip44Addrs[:2], + }, + + { + name: "bip44 with seed passphrase raw wallet address=1", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + SeedPassphrase: bip44SeedPassphrase, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44SeedPassphraseAddrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: bip44SeedPassphraseAddrs[:1], + }, + { + name: "bip44 with seed passphrase raw wallet address=2", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + SeedPassphrase: bip44SeedPassphrase, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44SeedPassphraseAddrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: bip44SeedPassphraseAddrs[:2], + }, + { + name: "bip44 with seed passphrase encrypted wallet address=1", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + SeedPassphrase: bip44SeedPassphrase, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44SeedPassphraseAddrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: bip44SeedPassphraseAddrs[:1], + }, + { + name: "bip44 with seed passphrase encrypted wallet address=2", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + SeedPassphrase: bip44SeedPassphrase, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44SeedPassphraseAddrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: bip44SeedPassphraseAddrs[:2], + }, + } + + for _, tc := range tt { + for _, ct := range []CryptoType{CryptoTypeScryptChacha20poly1305Insecure} { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + wltName := NewWalletFilename() + + w, err := s.loadWallet(wltName, tc.opts, tc.tf) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.Equal(t, w.EntriesLen(), tc.expectAddrNum) + for i, a := range tc.expectAddrs { + require.Equal(t, a, w.GetEntryAt(i).Address) + } + + require.Equal(t, w.IsEncrypted(), tc.opts.Encrypt) + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + // Checks the wallet file doesn't contain sensitive data + wltPath := filepath.Join(dir, w.Filename()) + lw, err := Load(wltPath) + require.NoError(t, err) + checkNoSensitiveData(t, lw) + } + }) + } + } + +} + +func TestServiceNewAddresses(t *testing.T) { + seed := "seed" + // Generate adddresses from the seed + var addrs []cipher.Address + _, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 10) + for _, s := range seckeys { + addrs = append(addrs, cipher.MustAddressFromSecKey(s)) + } + + bip44Seed := "voyage say extend find sheriff surge priority merit ignore maple cash argue" + bip44AddrStrs := []string{ + "9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG", + "29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW", + "2ZUAv9MGSpDKR3dnKMUnrKqLenV22JXAxzP", + "fwNVThqdzH7JMsStoLrTpkVsemesbdGftm", + "eyr5KDLTnN6ZZeggeHqDcXnrwmNUi7sGk2", + "Aee3J9qoFPLoUEJes6YVzdKHdeuvCrMZeJ", + "29MZS8aiYUdEwcruwCPggVJG9YJLsm92FHa", + "2Hbm3bwKiEwqNAMAzVJmz5hL1dNTfaA3ju7", + "WCaSCwSZnVqtkYeiKryeHjR8LbzE3KbkzJ", + "baRjCy1yHfishGdZi3bVaPaL7VJM7FZCSd", + } + bip44Addrs := make([]cipher.Address, len(bip44AddrStrs)) + for i, a := range bip44AddrStrs { + bip44Addrs[i] = cipher.MustDecodeBase58Address(a) + } + + tt := []struct { + name string + opts Options + n uint64 + pwd []byte + walletAPIDisabled bool + postWalletHandle func(w string) + expectAddrNum int + expectAddrs []cipher.Address + expectErr error + }{ + { + name: "encrypted=false addresses=0", + opts: Options{ + Type: WalletTypeDeterministic, + Label: "label", + Seed: seed, + }, + n: 0, + expectAddrNum: 0, + }, + { + name: "encrypted=false addresses=1", + opts: Options{ + Label: "label", + Seed: seed, + Type: WalletTypeDeterministic, + }, + n: 2, + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: addrs[1:3], + }, + { + name: "encrypted=false addresses=2", + opts: Options{ + Label: "label", + Seed: seed, + Type: WalletTypeDeterministic, + }, + n: 2, + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: addrs[1:3], + }, + { + name: "encrypted=true addresses=1", + opts: Options{ + Label: "label", + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + n: 1, + pwd: []byte("pwd"), + expectAddrNum: 1, + // CreateWallet will generate a default address, so check from new address + expectAddrs: addrs[1:2], + }, + { + name: "encrypted=true addresses=2", + opts: Options{ + Label: "label", + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + n: 2, + pwd: []byte("pwd"), + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: addrs[1:3], + }, + + { + name: "bip44 encrypted=false addresses=0", + opts: Options{ + Type: WalletTypeBip44, + Label: "label", + Seed: bip44Seed, + }, + n: 0, + expectAddrNum: 0, + }, + { + name: "bip44 encrypted=false addresses=1", + opts: Options{ + Label: "label", + Seed: bip44Seed, + Type: WalletTypeBip44, + }, + n: 2, + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: bip44Addrs[1:3], + }, + { + name: "bip44 encrypted=false addresses=2", + opts: Options{ + Label: "label", + Seed: bip44Seed, + Type: WalletTypeBip44, + }, + n: 2, + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: bip44Addrs[1:3], + }, + { + name: "bip44 encrypted=true addresses=1", + opts: Options{ + Label: "label", + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + n: 1, + pwd: []byte("pwd"), + expectAddrNum: 1, + // CreateWallet will generate a default address, so check from new address + expectAddrs: bip44Addrs[1:2], + }, + { + name: "bip44 encrypted=true addresses=2", + opts: Options{ + Label: "label", + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + n: 2, + pwd: []byte("pwd"), + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: bip44Addrs[1:3], + }, + + { + name: "encrypted=true wrong password", + opts: Options{ + Label: "label", + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + n: 1, + pwd: []byte("wrong password"), + expectAddrNum: 1, + expectErr: ErrInvalidPassword, + }, + { + name: "wallet api disabled", + opts: Options{ + Seed: "seed", + Label: "label", + Type: WalletTypeDeterministic, + }, + walletAPIDisabled: true, + expectErr: ErrWalletAPIDisabled, + }, + { + name: "encrypted=false password provided", + opts: Options{ + Label: "label", + Seed: seed, + Type: WalletTypeDeterministic, + }, + n: 1, + pwd: []byte("foo"), + expectErr: ErrWalletNotEncrypted, + }, + { + name: "encrypted=false writable=false", + opts: Options{ + Label: "label", + Seed: seed, + Type: WalletTypeDeterministic, + }, + n: 1, + postWalletHandle: func(fn string) { + err := os.Chmod(fn, 0555) // no write permission to the wallet file + require.NoError(t, err) + }, + expectAddrNum: 1, + expectErr: ErrWalletPermission, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.walletAPIDisabled, + }) + require.NoError(t, err) + + wltName := NewWalletFilename() + + w, err := s.CreateWallet(wltName, tc.opts, nil) + if err != nil { + require.Equal(t, tc.expectErr, err) + return + } + + wltPath := filepath.Join(dir, w.Filename()) + if tc.postWalletHandle != nil { + tc.postWalletHandle(wltPath) + } + + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + } + + naddrs, err := s.NewAddresses(w.Filename(), tc.pwd, tc.n) + require.Equal(t, tc.expectErr, err) + + // Confirms that no intermediate tmp file exists + tmpWltPath := filepath.Join(dir, w.Filename()) + ".tmp" + _, existErr := os.Stat(tmpWltPath) + require.True(t, os.IsNotExist(existErr)) + + if err != nil { + return + } + + // Confirms that the wallet addresse number is correct + require.Len(t, naddrs, tc.expectAddrNum) + for i, a := range tc.expectAddrs { + require.Equal(t, a, naddrs[i]) + } + + // Check the wallet again + w, ok := s.wallets[wltName] + require.True(t, ok) + require.Equal(t, w.EntriesLen(), int(tc.n+1)) + + // Wallet has a default address, so need to start from the second address + for i, a := range tc.expectAddrs { + require.Equal(t, a, w.GetEntryAt(i+1).Address) + } + + // Load wallet from file and check + _, err = os.Stat(filepath.Join(dir, w.Filename())) + require.NoError(t, err) + + lw, err := Load(filepath.Join(dir, w.Filename())) + require.NoError(t, err) + require.Equal(t, lw, w) + if w.IsEncrypted() { + checkNoSensitiveData(t, lw) + } + + // Wallet doesn't exist + _, err = s.NewAddresses("wallet_not_exist.wlt", tc.pwd, 1) + require.Equal(t, ErrWalletNotExist, err) + }) + } + } +} + +func TestServiceGetAddress(t *testing.T) { + for _, enableWalletAPI := range []bool{true, false} { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("enable wallet api=%v crypto=%v", enableWalletAPI, ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: "./testdata", + CryptoType: ct, + EnableWalletAPI: enableWalletAPI, + }) + require.NoError(t, err) + + if !enableWalletAPI { + dirIsEmpty(t, dir) + + require.Empty(t, s.wallets) + addrs, err := s.GetSkycoinAddresses("") + require.Equal(t, ErrWalletAPIDisabled, err) + require.Equal(t, 0, len(addrs)) + return + } + + addrs, err := s.GetSkycoinAddresses("test1.wlt") + require.NoError(t, err) + require.Equal(t, 1, len(addrs)) + + // test none exist wallet + notExistID := "not_exist_id.wlt" + _, err = s.GetSkycoinAddresses(notExistID) + require.Equal(t, ErrWalletNotExist, err) + }) + } + + } +} + +func TestServiceGetWallet(t *testing.T) { + walletTypes := []string{ + WalletTypeDeterministic, + WalletTypeBip44, + WalletTypeCollection, + WalletTypeXPub, + } + + for _, walletType := range walletTypes { + for _, enableWalletAPI := range []bool{true, false} { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("enable wallet api=%v crypto=%v", enableWalletAPI, ct), func(t *testing.T) { + dir := prepareWltDir() + + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: enableWalletAPI, + }) + require.NoError(t, err) + + if !enableWalletAPI { + dirIsEmpty(t, dir) + + require.Empty(t, s.wallets) + w, err := s.GetWallet("") + require.Equal(t, ErrWalletAPIDisabled, err) + require.Nil(t, w) + return + } + + opts := Options{ + Label: "label", + Type: walletType, + } + switch walletType { + case WalletTypeBip44, WalletTypeDeterministic: + opts.Seed = bip39.MustNewDefaultMnemonic() + case WalletTypeCollection: + case WalletTypeXPub: + opts.XPub = "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v" + default: + t.Fatal("unhandled wallet type") + } + + // Create a wallet + w, err := s.CreateWallet("t.wlt", opts, nil) + require.NoError(t, err) + + w1, err := s.GetWallet(w.Filename()) + require.NoError(t, err) + + // Check if change original wallet would change the returned wallet + w.SetLabel("new_label") + + require.NotEqual(t, "new_label", w1.Label()) + + // Get wallet doesn't exist + wltName := "does_not_exist.wlt" + _, err = s.GetWallet(wltName) + require.Equal(t, ErrWalletNotExist, err) + }) + } + } + } +} + +func TestServiceGetWallets(t *testing.T) { + for _, enableWalletAPI := range []bool{true, false} { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("enable wallet=%v crypto=%v", enableWalletAPI, ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: enableWalletAPI, + }) + require.NoError(t, err) + + if !enableWalletAPI { + dirIsEmpty(t, dir) + + require.Empty(t, s.wallets) + w, err := s.GetWallets() + require.Equal(t, ErrWalletAPIDisabled, err) + var emptyW Wallets + require.Equal(t, w, emptyW) + return + } + + // Creates a wallet + w, err := s.CreateWallet("t.wlt", Options{ + Label: "label", + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, nil) + require.NoError(t, err) + + var wallets []Wallet + // Get the default wallet + wallets = append(wallets, w) + + // Create a new wallet + wltName := NewWalletFilename() + w1, err := s.CreateWallet(wltName, Options{ + Label: "label1", + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + }, nil) + require.NoError(t, err) + wallets = append(wallets, w1) + + ws, err := s.GetWallets() + require.NoError(t, err) + for _, w := range wallets { + ww, ok := ws[w.Filename()] + require.True(t, ok) + require.Equal(t, w, ww) + } + }) + } + } +} + +func TestServiceUpdateWalletLabel(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + updateWltName string + label string + disableWalletAPI bool + err error + }{ + { + name: "ok", + wltName: "t.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Label: "label", + Type: WalletTypeBip44, + }, + updateWltName: "t.wlt", + label: "new-label", + }, + { + name: "wallet doesn't exist", + wltName: "t.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Label: "label", + Type: WalletTypeBip44, + }, + updateWltName: "t1.wlt", + label: "new-label", + err: ErrWalletNotExist, + }, + { + name: "wallet api disabled", + wltName: "t.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Label: "label", + Type: WalletTypeBip44, + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + t.Run(tc.name, func(t *testing.T) { + // Create the wallet service + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + err = s.UpdateWalletLabel("", "new label") + require.Equal(t, tc.err, err) + return + } + + // Create a new wallet + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + err = s.UpdateWalletLabel(tc.updateWltName, tc.label) + require.Equal(t, tc.err, err) + + if err != nil { + return + } + + nw, err := s.GetWallet(w.Filename()) + require.NoError(t, err) + require.NotEqual(t, w.Label(), nw.Label()) + + require.Equal(t, tc.label, nw.Label()) + }) + } + } +} + +func TestServiceEncryptWallet(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + encWltName string + pwd []byte + disableWalletAPI bool + err error + }{ + { + name: "ok xpub wallet", + wltName: "t.wlt", + opts: Options{ + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + Type: WalletTypeXPub, + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + }, + { + name: "ok deterministic wallet", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + }, + { + name: "ok collection wallet", + wltName: "t.wlt", + opts: Options{ + Type: WalletTypeCollection, + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + }, + { + name: "ok bip44 wallet", + wltName: "t.wlt", + opts: Options{ + Type: WalletTypeBip44, + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + }, + { + name: "wallet doesn't exist", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + encWltName: "t2.wlt", + err: ErrWalletNotExist, + }, + { + name: "wallet already encrypted", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + Encrypt: true, + Password: []byte("pwd"), + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + err: ErrWalletEncrypted, + }, + { + name: "wallet api disabled", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + Encrypt: true, + Password: []byte("pwd"), + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + // Create the wallet service + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, err = s.EncryptWallet("", tc.pwd) + require.Equal(t, tc.err, err) + return + } + + // Create a new wallet + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + switch w.Type() { + // Add an entry to a collection wallet, to verify that secrets are hidden + case WalletTypeCollection: + err := s.Update(w.Filename(), func(w Wallet) error { + p, s := cipher.GenerateKeyPair() + return w.(*CollectionWallet).AddEntry(Entry{ + Public: p, + Secret: s, + Address: cipher.AddressFromPubKey(p), + }) + }) + require.NoError(t, err) + + // Add entries to the a bip44 wallet's change chain, to verify that those secrets are hidden + case WalletTypeBip44: + err := s.Update(w.Filename(), func(w Wallet) error { + _, err := w.(*Bip44Wallet).GenerateChangeEntry() + return err + }) + require.NoError(t, err) + } + + // Encrypt the wallet + encWlt, err := s.EncryptWallet(tc.encWltName, tc.pwd) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + encWlt1, err := s.getWallet(tc.encWltName) + require.NoError(t, err) + require.Equal(t, encWlt, encWlt1) + + // Check the encrypted wallet + require.True(t, encWlt.IsEncrypted()) + for i := 0; i < encWlt.EntriesLen(); i++ { + require.True(t, encWlt.GetEntryAt(i).Secret.Null()) + } + require.Empty(t, encWlt.Seed()) + require.Empty(t, encWlt.LastSeed()) + + // Check the decrypted seeds + decWlt, err := Unlock(encWlt, tc.pwd) + require.NoError(t, err) + for i := 0; i < decWlt.EntriesLen(); i++ { + switch decWlt.Type() { + case WalletTypeXPub: + // xpub wallets never have secret keys + require.True(t, decWlt.GetEntryAt(i).Secret.Null()) + default: + require.False(t, decWlt.GetEntryAt(i).Secret.Null()) + } + } + require.Equal(t, w.Seed(), decWlt.Seed()) + require.Equal(t, w.LastSeed(), decWlt.LastSeed()) + + // Check if the wallet file does exist + path := filepath.Join(dir, w.Filename()) + testutil.RequireFileExists(t, path) + + // Check that the temporary backup wallet file does not exist + bakPath := path + ".bak" + testutil.RequireFileNotExists(t, bakPath) + }) + } + } +} + +func TestServiceDecryptWallet(t *testing.T) { + type testCase struct { + name string + wltName string + opts Options + decryptWltName string + password []byte + disableWalletAPI bool + err error + } + + tt := []testCase{ + { + name: "ok xpub", + wltName: "test.wlt", + opts: Options{ + Type: WalletTypeXPub, + Encrypt: true, + Password: []byte("pwd"), + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + }, + { + name: "ok collection", + wltName: "test.wlt", + opts: Options{ + Type: WalletTypeCollection, + Encrypt: true, + Password: []byte("pwd"), + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + }, + { + name: "ok deterministic", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + }, + { + name: "ok bip44", + wltName: "test.wlt", + opts: Options{ + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + }, + { + name: "wallet not exist", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + decryptWltName: "t.wlt", + password: []byte("pwd"), + err: ErrWalletNotExist, + }, + { + name: "wallet not encrypted", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + err: ErrWalletNotEncrypted, + }, + { + name: "invalid password", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + decryptWltName: "test.wlt", + password: []byte("wrong password"), + err: ErrInvalidPassword, + }, + { + name: "wallet api disabled", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + verifyDecryptedXPubWlt := func(tc testCase, wlt Wallet) { + // XPub wlt doesn't have anything to encrypt or decrypt + require.Equal(t, tc.opts.XPub, wlt.XPub()) + require.Empty(t, wlt.Secrets()) + require.Empty(t, wlt.Seed()) + require.Empty(t, wlt.LastSeed()) + for _, e := range wlt.GetEntries() { + require.True(t, e.Secret.Null()) + } + } + + verifyDecryptedDeterministicWlt := func(tc testCase, wlt Wallet) { + // Checks the "encrypted" meta info + require.False(t, wlt.IsEncrypted()) + // Checks the seed + require.Equal(t, tc.opts.Seed, wlt.Seed()) + + // Checks the last seed + entryNum := wlt.EntriesLen() + lsd, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(wlt.Seed()), entryNum) + require.Equal(t, hex.EncodeToString(lsd), wlt.LastSeed()) + + // Checks the entries + for i := range seckeys { + a := cipher.MustAddressFromSecKey(seckeys[i]) + require.Equal(t, a, wlt.GetEntryAt(i).Address) + require.Equal(t, seckeys[i], wlt.GetEntryAt(i).Secret) + } + + require.Empty(t, wlt.Secrets()) + require.Empty(t, wlt.CryptoType()) + } + + verifyDecryptedCollectionWlt := func(_ testCase, wlt Wallet) { + // Checks the "encrypted" meta info + require.False(t, wlt.IsEncrypted()) + require.Empty(t, wlt.Seed()) + require.Empty(t, wlt.LastSeed()) + + // Checks the entries + for _, e := range wlt.GetEntries() { + require.False(t, e.Secret.Null()) + a := cipher.MustAddressFromSecKey(e.Secret) + require.Equal(t, a, e.Address) + p := cipher.MustPubKeyFromSecKey(e.Secret) + require.Equal(t, p, e.Public) + } + + require.Empty(t, wlt.Secrets()) + require.Empty(t, wlt.CryptoType()) + } + + verifyDecryptedBip44Wlt := func(tc testCase, wlt Wallet) { + // Checks the "encrypted" meta info + require.False(t, wlt.IsEncrypted()) + // Checks the seed + require.Equal(t, tc.opts.Seed, wlt.Seed()) + require.Empty(t, wlt.LastSeed()) + + // Checks the entries + for _, e := range wlt.GetEntries() { + require.False(t, e.Secret.Null()) + a := cipher.MustAddressFromSecKey(e.Secret) + require.Equal(t, a, e.Address) + p := cipher.MustPubKeyFromSecKey(e.Secret) + require.Equal(t, p, e.Public) + } + + require.Empty(t, wlt.Secrets()) + require.Empty(t, wlt.CryptoType()) + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, err = s.DecryptWallet(tc.decryptWltName, tc.password) + require.Equal(t, tc.err, err) + return + } + + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + _, err = s.DecryptWallet(tc.decryptWltName, tc.password) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + wltType := tc.opts.Type + if wltType == "" { + wltType = WalletTypeBip44 + } + + verify := verifyDecryptedCollectionWlt + switch wltType { + case WalletTypeCollection: + verify = verifyDecryptedCollectionWlt + case WalletTypeBip44: + verify = verifyDecryptedBip44Wlt + case WalletTypeDeterministic: + verify = verifyDecryptedDeterministicWlt + case WalletTypeXPub: + verify = verifyDecryptedXPubWlt + default: + t.Fatal("unhandled wallet type") + } + + // Checks the decrypted wallet in service + w, err := s.getWallet(tc.wltName) + require.NoError(t, err) + verify(tc, w) + + // Checks the existence of the wallet file + fn := filepath.Join(dir, tc.wltName) + testutil.RequireFileExists(t, fn) + + // Loads wallet from the file and check if it's decrypted + w1, err := Load(fn) + require.NoError(t, err) + verify(tc, w1) + }) + } + } +} + +func TestServiceCreateWalletWithScan(t *testing.T) { + seed := "seed1" + addrs := make([]cipher.Address, 20) + childSeeds := make([]string, 20) + lastSeed := []byte(seed) + for i := range addrs { + s, pk, _, err := cipher.DeterministicKeyPairIterator(lastSeed) + require.NoError(t, err) + addrs[i] = cipher.AddressFromPubKey(pk) + childSeeds[i] = hex.EncodeToString(s) + lastSeed = s + } + + bip44Seed := "voyage say extend find sheriff surge priority merit ignore maple cash argue" + bip44AddrStrs := []string{ + "9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG", + "29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW", + "2ZUAv9MGSpDKR3dnKMUnrKqLenV22JXAxzP", + "fwNVThqdzH7JMsStoLrTpkVsemesbdGftm", + "eyr5KDLTnN6ZZeggeHqDcXnrwmNUi7sGk2", + "Aee3J9qoFPLoUEJes6YVzdKHdeuvCrMZeJ", + "29MZS8aiYUdEwcruwCPggVJG9YJLsm92FHa", + "2Hbm3bwKiEwqNAMAzVJmz5hL1dNTfaA3ju7", + "WCaSCwSZnVqtkYeiKryeHjR8LbzE3KbkzJ", + "baRjCy1yHfishGdZi3bVaPaL7VJM7FZCSd", + "296oQmJJgx35NDApi7YYzj1AryM8fZcjwf3", + "cxxxRfy3RRy2YbFTcptRbVTQYcHY1ejRB5", + "omLGQm1Z2Y9Bga8v6NQ2hgrpRm1nATzGK9", + "2EpZP1E8gTJy799t5CVrZUcxjyFFHwshr6X", + "2hgaPG2oNVrkonPxjv4Sx9au6ruw1Y8pjUi", + "2bHfa8yjhWB5mTip8j1FjNhB1TGbSBkX3Xu", + "VYu5ePSB7ReKm2pysC5JRdCUiTBgDn5Tkw", + "2crRqwG3BaurEqNa7eiB5oUNKTQPETfKrFW", + "2LVTqqNSTBKE51UC7bZ39bZ6wwmR3sibHBX", + "2A8C3h1gsw92Q4Uhn4b385onKrhzuH8UTwE", + } + bip44Addrs := make([]cipher.Address, len(bip44AddrStrs)) + for i, a := range bip44AddrStrs { + bip44Addrs[i] = cipher.MustDecodeBase58Address(a) + } + + bip44ChangeAddrStrs := []string{ + "oHvj7oy8maES9HJiQHJTp4GvcUcpz3voDq", + "2SGMfTFV2zbQzGw7aJm1D5EeEPgych5ixuC", + "2ymjULRdbiFoUNJKNhWbQ3JqdE8TXnZkyU", + "muvdio7V8vkbUPPJsumVWEqScKHZho6Xmx", + "qyQuA2RW4H6NFqhRQmHDt2q28E654PoBsH", + "24UcBj42Q7GBx1rmeU5AE7JhcRbpDq9utCV", + "2TwjgBxKhK84Qa34HoNc5KbsYfp1NBZyPXk", + "fDYKWyDnDaQmpigGAJNK4ZoBZ4WTg5dtRN", + "rRMXXm8ufMcqqnLqRX5CoJ8wA6rdWPJEiW", + "2D6HN4fSHZqsGaPzCDUjddF6NS4hBsVGRag", + "2bXjTvatPW4Z3SaQBr96zJwwYcxp7iemeGC", + "tbmXTJWtqtuaAdVvFWS1rmL42omdD4Hkd3", + "27NT6t4xJoqcs6PsM2EgNNhx4MMw3ioFVER", + "Xym6pAVg2Xjp9sXvCUKrLgq6PSEt1izsRd", + "49EqkHPgWPS9W1jDiJXSKdKdNur3pJjADw", + "f52mwYtpVNhgMMmJZHQYVBQVHwHXCbP5yX", + "2ffeXAKtVUmxucs8mpM2EKMqzYCN3TB7DYx", + "2NJERX84xLHMidXtYDtT1rGzhf4HJmCkz47", + "wik4VEcja3pz2Wo6SwwfoDGzVzB7ZoosQB", + "2gj3qjYQ4MMkv7CdB3PvkbEEPhXikZBD4q6", + } + bip44ChangeAddrs := make([]cipher.Address, len(bip44ChangeAddrStrs)) + for i, a := range bip44ChangeAddrStrs { + bip44ChangeAddrs[i] = cipher.MustDecodeBase58Address(a) + } + + xpub := "xpub6E5WPk37XdM79dy6oJ7iH6NkCvVzxmrCo4zMFFHSZMc5ymZYhReQFWaDcGNZeYYe1ahY2e3RcRZDHLHC98FfzPRfNRcU6ecURpS4RCQRP2w" + xpubAddrStrs := []string{ + "2mhaS6SE2TPSmRRbJvngWQSNXCCVuTic5Zg", + "2bq2itwDKteqigxVS9eYJv4Ww9SEfuyGcib", + "B7eMXM6nLUqqzkFcosXR3HSVkQ6yUz53n4", + "niAy17kBb8vB2pFey8eZnE92e6x9bFGLHp", + "N8JbzcqWEPkn6CF3JdZDmEydzECyZ4NhRv", + "TcyY3F4xHPCtFFkdDBTC93y684Fmxg2rPd", + "kcVFbcrVqAVUHrirp7r3HYHUzrtdFuybez", + "bzA7UeUmkuFWn3waGh3z1eQ5xV3TAZpgX2", + "2K29ZX6vaqrTRZJbFKX7hzu646wL3pJfF6H", + "VKpFCpN4yp46uYbffaeCg7XEvQd6pHNSkV", + "2bGUCmS8BcFiX6VQbq6DVvjDsCdu5fgoSSr", + "2Yx8dzMgzU5Y2vrAomAtkajWNmUCJ31xNF", + "wd2NGBkCygq7cCP899gbiBciM7ZFqphRDM", + "2akitSsnetXoc3ejzY4pA8dGjWM76uzPxo3", + "WFTbYvNJGAq9wWG644sMvgt4EJ6CvkbvDK", + "2FReiyjcQuQBCvjKQzyrhc7QMwdbdBwLvCT", + "2RnSh4sZrxCEK5fUSCLR8JuwzGd6K5mzdrA", + "ujJHitcLhQZB393qrdJvdfM4AyEPMmDhcV", + "25jWWmrgU8Z9HYVCsAXYmCjF1jQqe5DDnqr", + "rsaKzohU5erbR6FX1whWu9Ke4q2jLkLBeJ", + } + xpubAddrs := make([]cipher.Address, len(xpubAddrStrs)) + for i, a := range xpubAddrStrs { + xpubAddrs[i] = cipher.MustDecodeBase58Address(a) + } + + tf := make(mockTxnsFinder, 20) + + type exp struct { + err error + seed string + lastSeed string + xpub string + entryNum int + addrs []cipher.Address + } + + tt := []struct { + name string + opts Options + balGetter TransactionsFinder + disableWalletAPI bool + expect exp + }{ + { + name: "no coins and scan 0, unencrypted", + opts: Options{ + Seed: seed, + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "no coins and scan 0, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "no coins and scan 1, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 1, + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "no coins and scan 1, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 1, + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "no coins and scan 10, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 10, + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "scan 5 get 6, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[5]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[5], + entryNum: 6, + addrs: addrs, + }, + }, + { + name: "scan 5 get 9, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[5]: true, + addrs[8]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[8], + entryNum: 9, + addrs: addrs, + }, + }, + { + name: "scan 5 get 11, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[4+1]: true, + addrs[10]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[10], + entryNum: 11, + addrs: addrs, + }, + }, + + { + name: "scan 5 get 6, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[5]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[5], + entryNum: 6, + addrs: addrs, + }, + }, + { + name: "scan 5 get 5, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[4], + entryNum: 5, + addrs: addrs, + }, + }, + { + name: "scan 5 get 5, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[4], + entryNum: 5, + addrs: addrs, + }, + }, + { + name: "scan 5 get 5 have 7, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + addrs[6]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[6], + entryNum: 7, + addrs: addrs, + }, + }, + { + name: "scan 5 get 3 have 8, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[2]: true, + addrs[7]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[7], + entryNum: 8, + addrs: addrs, + }, + }, + { + name: "scan 5 get 3 get 8 have 13, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[2]: true, + addrs[7]: true, + addrs[12]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[12], + entryNum: 13, + addrs: addrs, + }, + }, + { + name: "scan 5 get 3 get 8 have 14, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[2]: true, + addrs[7]: true, + addrs[13]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[7], + entryNum: 8, + addrs: addrs, + }, + }, + { + name: "scan 5 get 3 have 9, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[2]: true, + addrs[8]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[2], + entryNum: 3, + addrs: addrs, + }, + }, + { + name: "confirmed and predicted, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[4], + entryNum: 5, + addrs: addrs, + }, + }, + { + name: "confirmed and predicted, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[4], + entryNum: 5, + addrs: addrs, + }, + }, + + { + name: "bip44 no coins and scan 0, unencrypted", + opts: Options{ + Seed: bip44Seed, + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 no coins and scan 0, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 no coins and scan 1, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 1, + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 no coins and scan 1, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 1, + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 no coins and scan 10, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 10, + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 6, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[5]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 6, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 9, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[5]: true, + bip44Addrs[8]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 9, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 11, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[4+1]: true, + bip44Addrs[10]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 11, + addrs: bip44Addrs, + }, + }, + + { + name: "bip44 scan 5 get 6, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[5]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 6, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 5, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 5, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 5, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 5, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 5 have 7, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + bip44Addrs[6]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 7, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 3 have 8, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[2]: true, + bip44Addrs[7]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 8, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 3 get 8 have 13, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[2]: true, + bip44Addrs[7]: true, + bip44Addrs[12]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 13, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 3 get 8 have 14, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[2]: true, + bip44Addrs[7]: true, + bip44Addrs[13]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 8, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 3 get 8 have 14, change chain, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44ChangeAddrs[2]: true, + bip44ChangeAddrs[7]: true, + bip44ChangeAddrs[13]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 8 + 1, // 1 address is always generated in the external chain + addrs: append(bip44Addrs[:1], bip44ChangeAddrs...), + }, + }, { + name: "bip44 scan 5 get 3 have 9, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[2]: true, + bip44Addrs[8]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 3, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 confirmed and predicted, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 5, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 confirmed and predicted, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 5, + addrs: bip44Addrs, + }, + }, + + { + name: "xpub no coins and scan 0, unencrypted", + opts: Options{ + XPub: xpub, + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub no coins and scan 0, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub no coins and scan 1, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 1, + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub no coins and scan 1, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 1, + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub no coins and scan 10, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 10, + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 6, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[5]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 6, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 9, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[5]: true, + xpubAddrs[8]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 9, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 11, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[4+1]: true, + xpubAddrs[10]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 11, + addrs: xpubAddrs, + }, + }, + + { + name: "xpub scan 5 get 6, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[5]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 6, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 5, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 5, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 5, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 5, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 5 have 7, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + xpubAddrs[6]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 7, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 3 have 8, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[2]: true, + xpubAddrs[7]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 8, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 3 get 8 have 13, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[2]: true, + xpubAddrs[7]: true, + xpubAddrs[12]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 13, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 3 get 8 have 14, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[2]: true, + xpubAddrs[7]: true, + xpubAddrs[13]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 8, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 3 have 9, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[2]: true, + xpubAddrs[8]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 3, + addrs: xpubAddrs, + }, + }, + { + name: "xpub confirmed and predicted, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 5, + addrs: xpubAddrs, + }, + }, + { + name: "xpub confirmed and predicted, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 5, + addrs: xpubAddrs, + }, + }, + + { + name: "wallet api disabled", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{}, + disableWalletAPI: true, + expect: exp{ + err: ErrWalletAPIDisabled, + }, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + wltName := NewWalletFilename() + w, err := s.CreateWallet(wltName, tc.opts, tc.balGetter) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.NoError(t, w.Validate()) + + if !w.IsEncrypted() { + require.Equal(t, tc.expect.seed, w.Seed()) + require.Equal(t, tc.expect.lastSeed, w.LastSeed()) + } + require.Equal(t, tc.expect.xpub, w.XPub()) + require.Equal(t, tc.expect.entryNum, w.EntriesLen()) + for i, e := range w.GetEntries() { + require.Equal(t, tc.expect.addrs[i].String(), e.Address.String()) + } + }) + } + } +} + +func TestGetWalletSeed(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + id string + pwd []byte + disableWalletAPI bool + enableSeedAPI bool + expectErr error + }{ + { + name: "wallet is not encrypted", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Type: WalletTypeDeterministic, + }, + id: "wallet.wlt", + enableSeedAPI: true, + expectErr: ErrWalletNotEncrypted, + }, + { + name: "wallet api disabled", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Type: WalletTypeDeterministic, + }, + id: "wallet.wlt", + enableSeedAPI: true, + disableWalletAPI: true, + expectErr: ErrWalletAPIDisabled, + }, + { + name: "ok", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + enableSeedAPI: true, + id: "wallet.wlt", + pwd: []byte("pwd"), + }, + { + name: "ok seed passphrase", + wltName: "wallet.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + SeedPassphrase: "seed-passphrase", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + enableSeedAPI: true, + id: "wallet.wlt", + pwd: []byte("pwd"), + }, + { + name: "wallet does not exist", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + enableSeedAPI: true, + pwd: []byte("pwd"), + id: "none-exist.wlt", + expectErr: ErrWalletNotExist, + }, + { + name: "disable seed api", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + pwd: []byte("pwd"), + id: "wallet.wlt", + enableSeedAPI: false, + expectErr: ErrSeedAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + EnableSeedAPI: tc.enableSeedAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, _, err = s.GetWalletSeed("", tc.pwd) + require.Equal(t, tc.expectErr, err) + return + } + + // Create a wallet + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + seed, seedPassphrase, err := s.GetWalletSeed(tc.id, tc.pwd) + require.Equal(t, tc.expectErr, err) + if err != nil { + return + } + + require.Equal(t, tc.opts.Seed, seed) + require.Equal(t, tc.opts.SeedPassphrase, seedPassphrase) + }) + } + } +} + +func TestServiceView(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + viewWltName string + action func(*testing.T) func(Wallet) error + disableWalletAPI bool + err error + }{ + { + name: "ok, encrypted collection wallet", + wltName: "test-view-collection-encrypted.wlt", + viewWltName: "test-view-collection-encrypted.wlt", + opts: Options{ + Type: WalletTypeCollection, + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + checkNoSensitiveData(t, w) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted collection wallet", + wltName: "test-view-collection-unencrypted.wlt", + viewWltName: "test-view-collection-unencrypted.wlt", + opts: Options{ + Label: "foowlt", + Type: WalletTypeCollection, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + // Collection wallets don't have seeds + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, encrypted xpub wallet", + wltName: "test-view-xpub-encrypted.wlt", + viewWltName: "test-view-xpub-encrypted.wlt", + opts: Options{ + Type: WalletTypeXPub, + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + checkNoSensitiveData(t, w) + + require.Equal(t, "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", w.XPub()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted xpub wallet", + wltName: "test-view-xpub-unencrypted.wlt", + viewWltName: "test-view-xpub-unencrypted.wlt", + opts: Options{ + Label: "foowlt", + Type: WalletTypeXPub, + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + // xpub wallets don't have seeds + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + require.Equal(t, "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", w.XPub()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, encrypted bip44 wallet", + wltName: "test-view-bip44-encrypted.wlt", + viewWltName: "test-view-bip44-encrypted.wlt", + opts: Options{ + Type: WalletTypeBip44, + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + checkNoSensitiveData(t, w) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted bip44 wallet", + wltName: "test-view-bip44-unencrypted.wlt", + viewWltName: "test-view-bip44-unencrypted.wlt", + opts: Options{ + Label: "foowlt", + Type: WalletTypeBip44, + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + SeedPassphrase: "foo", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + require.Equal(t, "voyage say extend find sheriff surge priority merit ignore maple cash argue", w.Seed()) + require.Equal(t, "foo", w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, encrypted wallet", + wltName: "test-view-encrypted.wlt", + viewWltName: "test-view-encrypted.wlt", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + checkNoSensitiveData(t, w) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted wallet", + wltName: "test-view-unencrypted.wlt", + viewWltName: "test-view-unencrypted.wlt", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: "fooseed", + Label: "foowlt", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + // Seed is visible because its not encrypted + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "wallet doesn't exist", + wltName: "test-view-not-exist.wlt", + viewWltName: "foo-test-view-not-exist.wlt", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: "fooseed", + Label: "foowlt", + }, + err: ErrWalletNotExist, + }, + + { + name: "api disabled", + wltName: "test-view-api-disabled.wlt", + viewWltName: "test-view-api-disabled.wlt", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: "fooseed", + Label: "foowlt", + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: CryptoTypeSha256Xor, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + if w.Type() == WalletTypeCollection { + err := s.UpdateSecrets(w.Filename(), tc.opts.Password, func(w Wallet) error { + p, s := cipher.GenerateKeyPair() + return w.(*CollectionWallet).AddEntry(Entry{ + Public: p, + Secret: s, + Address: cipher.AddressFromPubKey(p), + }) + }) + require.NoError(t, err) + + w, err = s.GetWallet(tc.wltName) + require.NoError(t, err) + } + + s.config.EnableWalletAPI = !tc.disableWalletAPI + + var action func(Wallet) error + if tc.action != nil { + action = tc.action(t) + } + + err = s.View(tc.viewWltName, action) + + require.Equal(t, tc.err, err) + if err != nil { + return + } + + s.config.EnableWalletAPI = true + + // Check that the wallet is unmodified + w2, err := s.GetWallet(tc.wltName) + require.NoError(t, err) + require.Equal(t, w, w2) + }) + } +} + +func TestServiceViewSecrets(t *testing.T) { + mnemonicSeed := bip39.MustNewDefaultMnemonic() + + tt := []struct { + name string + wltName string + opts Options + viewWltName string + action func(*testing.T) func(Wallet) error + password []byte + disableWalletAPI bool + err error + }{ + { + name: "ok, encrypted wallet", + wltName: "test-view-secrets-encrypted.wlt", + viewWltName: "test-view-secrets-encrypted.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwd"), + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Should be able to see sensitive data + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted wallet", + wltName: "test-view-secrets-unencrypted.wlt", + viewWltName: "test-view-secrets-unencrypted.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, encrypted wallet bip44 seed passphrase", + wltName: "test-view-secrets-encrypted-bip44.wlt", + viewWltName: "test-view-secrets-encrypted-bip44.wlt", + opts: Options{ + Seed: mnemonicSeed, + SeedPassphrase: "foobar", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeBip44, + }, + password: []byte("pwd"), + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Should be able to see sensitive data + require.Equal(t, mnemonicSeed, w.Seed()) + require.Equal(t, "foobar", w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted wallet bip44", + wltName: "test-view-secrets-unencrypted-bip44.wlt", + viewWltName: "test-view-secrets-unencrypted-bip44.wlt", + opts: Options{ + Seed: mnemonicSeed, + Label: "foowlt", + Type: WalletTypeBip44, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, mnemonicSeed, w.Seed()) + require.Empty(t, w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted wallet bip44 seed passphrase", + wltName: "test-view-secrets-unencrypted-bip44.wlt", + viewWltName: "test-view-secrets-unencrypted-bip44.wlt", + opts: Options{ + Seed: mnemonicSeed, + SeedPassphrase: "foobar", + Label: "foowlt", + Type: WalletTypeBip44, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, mnemonicSeed, w.Seed()) + require.Equal(t, "foobar", w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "encrypted wallet but password not provided", + wltName: "test-view-secrets-encrypted-no-password.wlt", + viewWltName: "test-view-secrets-encrypted-no-password.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrMissingPassword, + }, + + { + name: "encrypted wallet but password invalid", + wltName: "test-view-secrets-encrypted-wrong-password.wlt", + viewWltName: "test-view-secrets-encrypted-wrong-password.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwdpwd"), + err: ErrInvalidPassword, + }, + + { + name: "unencrypted wallet but password provided", + wltName: "test-view-secrets-unencrypted-password.wlt", + viewWltName: "test-view-secrets-unencrypted-password.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwd"), + err: ErrWalletNotEncrypted, + }, + + { + name: "wallet doesn't exist", + wltName: "test-view-secrets-not-exist.wlt", + viewWltName: "foo-test-view-secrets-not-exist.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrWalletNotExist, + }, + + { + name: "api disabled", + wltName: "test-view-secrets-api-disabled.wlt", + viewWltName: "test-view-secrets-api-disabled.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: CryptoTypeSha256Xor, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + s.config.EnableWalletAPI = !tc.disableWalletAPI + + var action func(Wallet) error + if tc.action != nil { + action = tc.action(t) + } + + err = s.ViewSecrets(tc.viewWltName, tc.password, action) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + s.config.EnableWalletAPI = true + + // Check that the wallet is unmodified + w2, err := s.GetWallet(tc.wltName) + require.NoError(t, err) + require.Equal(t, w, w2) + }) + } +} + +func TestServiceUpdate(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + viewWltName string + action func(*testing.T) func(Wallet) error + checkWallet func(*testing.T, Wallet) + disableWalletAPI bool + err error + }{ + { + name: "ok, encrypted wallet", + wltName: "test-update-encrypted.wlt", + viewWltName: "test-update-encrypted.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Should not be able to see sensitive data + checkNoSensitiveData(t, w) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + + // The wallet is encrypted so it cannot generate more addresses + _, err := w.GenerateAddresses(1) + require.Equal(t, ErrWalletEncrypted, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltfoo", w.Label()) + require.Equal(t, 1, w.EntriesLen()) + checkNoSensitiveData(t, w) + }, + }, + + { + name: "ok, unencrypted wallet", + wltName: "test-update-unencrypted.wlt", + viewWltName: "test-update-unencrypted.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltfoo", w.Label()) + require.Equal(t, 1, w.EntriesLen()) + require.NotEmpty(t, w.GetEntryAt(0).Secret) + }, + }, + + { + name: "wallet doesn't exist", + wltName: "test-update-not-exist.wlt", + viewWltName: "foo-test-update-not-exist.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrWalletNotExist, + }, + + { + name: "api disabled", + wltName: "test-update-api-disabled.wlt", + viewWltName: "test-update-api-disabled.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: CryptoTypeSha256Xor, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + s.config.EnableWalletAPI = !tc.disableWalletAPI + + var action func(Wallet) error + if tc.action != nil { + action = tc.action(t) + } + + err = s.Update(tc.viewWltName, action) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + s.config.EnableWalletAPI = true + + // Check that the wallet was modified as expected + w, err := s.GetWallet(tc.wltName) + require.NoError(t, err) + tc.checkWallet(t, w) + + // Even if secrets were modified, wallet should still be encrypted + require.Equal(t, tc.opts.Encrypt, w.IsEncrypted()) + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + } + }) + } +} + +func TestServiceUpdateSecrets(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + viewWltName string + action func(*testing.T) func(Wallet) error + checkWallet func(*testing.T, Wallet) + password []byte + disableWalletAPI bool + err error + }{ + { + name: "ok, encrypted wallet", + wltName: "test-update-secrets-encrypted.wlt", + viewWltName: "test-update-secrets-encrypted.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwd"), + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Should be able to see sensitive data + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + _, err := w.GenerateAddresses(1) + require.NoError(t, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltfoo", w.Label()) + require.Equal(t, 2, w.EntriesLen()) + checkNoSensitiveData(t, w) + }, + }, + + { + name: "ok, unencrypted wallet", + wltName: "test-update-secrets-unencrypted.wlt", + viewWltName: "test-update-secrets-unencrypted.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + _, err := w.GenerateAddresses(1) + require.NoError(t, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltfoo", w.Label()) + require.Equal(t, 2, w.EntriesLen()) + require.NotEmpty(t, w.GetEntryAt(1).Secret) + }, + }, + + { + name: "ok, encrypted bip44 wallet", + wltName: "test-update-secrets-bip44-encrypted.wlt", + viewWltName: "test-update-secrets-bip44-encrypted.wlt", + opts: Options{ + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowltbip44", + Type: WalletTypeBip44, + }, + password: []byte("pwd"), + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowltbip44", w.Label()) + + // Should be able to see sensitive data + require.Equal(t, "voyage say extend find sheriff surge priority merit ignore maple cash argue", w.Seed()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + _, err := w.GenerateAddresses(1) + require.NoError(t, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltbip44foo", w.Label()) + require.Equal(t, 2, w.EntriesLen()) + checkNoSensitiveData(t, w) + }, + }, + + { + name: "ok, unencrypted bip44 wallet", + wltName: "test-update-secrets-bip44-unencrypted.wlt", + viewWltName: "test-update-secrets-bip44-unencrypted.wlt", + opts: Options{ + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + Label: "foowltbip44", + Type: WalletTypeBip44, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowltbip44", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, "voyage say extend find sheriff surge priority merit ignore maple cash argue", w.Seed()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + _, err := w.GenerateAddresses(1) + require.NoError(t, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltbip44foo", w.Label()) + require.Equal(t, 2, w.EntriesLen()) + require.NotEmpty(t, w.GetEntryAt(1).Secret) + }, + }, + + { + name: "encrypted wallet but password not provided", + wltName: "test-update-secrets-encrypted-no-password.wlt", + viewWltName: "test-update-secrets-encrypted-no-password.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrMissingPassword, + }, + + { + name: "encrypted wallet but password invalid", + wltName: "test-update-secrets-encrypted-wrong-password.wlt", + viewWltName: "test-update-secrets-encrypted-wrong-password.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwdpwd"), + err: ErrInvalidPassword, + }, + + { + name: "unencrypted wallet but password provided", + wltName: "test-update-secrets-unencrypted-password.wlt", + viewWltName: "test-update-secrets-unencrypted-password.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwd"), + err: ErrWalletNotEncrypted, + }, + + { + name: "wallet doesn't exist", + wltName: "test-update-secrets-not-exist.wlt", + viewWltName: "foo-test-update-secrets-not-exist.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrWalletNotExist, + }, + + { + name: "api disabled", + wltName: "test-update-secrets-api-disabled.wlt", + viewWltName: "test-update-secrets-api-disabled.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: CryptoTypeSha256Xor, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + s.config.EnableWalletAPI = !tc.disableWalletAPI + + var action func(Wallet) error + if tc.action != nil { + action = tc.action(t) + } + + err = s.UpdateSecrets(tc.viewWltName, tc.password, action) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + s.config.EnableWalletAPI = true + + // Check that the wallet was modified as expected + w, err := s.GetWallet(tc.wltName) + require.NoError(t, err) + tc.checkWallet(t, w) + + // Even if secrets were modified, wallet should still be encrypted + require.Equal(t, tc.opts.Encrypt, w.IsEncrypted()) + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + } + }) + } +} + +func checkNoSensitiveData(t *testing.T, w Wallet) { + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + require.Empty(t, w.SeedPassphrase()) + for _, e := range w.GetEntries() { + require.True(t, e.Secret.Null()) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.1.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.1.wlt new file mode 100644 index 00000000..bf15c60d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.1.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_5e7d.wlt", + "label": "test2", + "lastSeed": "f3a7942899ed2723999288ea83f4f20908bf9deabc05bc8216339da4d3e02c0b", + "seed": "acoustic test story tank thrive wine able frequent marriage use swim develop", + "tm": "1503458890", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2M755W9o7933roLASK9PZTmqRsjQUsVen9y", + "public_key": "03a179e412d9d27e14ba647177648a871a7311f15a5312064c7abac1d72764081c", + "secret_key": "7889f1d107dade4369bbb1ab6a55cf74a31d0524601398f03a57c5b0b1f5444b" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.wlt new file mode 100644 index 00000000..bf15c60d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_5e7d.wlt", + "label": "test2", + "lastSeed": "f3a7942899ed2723999288ea83f4f20908bf9deabc05bc8216339da4d3e02c0b", + "seed": "acoustic test story tank thrive wine able frequent marriage use swim develop", + "tm": "1503458890", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2M755W9o7933roLASK9PZTmqRsjQUsVen9y", + "public_key": "03a179e412d9d27e14ba647177648a871a7311f15a5312064c7abac1d72764081c", + "secret_key": "7889f1d107dade4369bbb1ab6a55cf74a31d0524601398f03a57c5b0b1f5444b" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_bip44_wallet/empty.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_bip44_wallet/empty.wlt new file mode 100644 index 00000000..c5b16186 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_bip44_wallet/empty.wlt @@ -0,0 +1,15 @@ +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "filename": "empty.wlt", + "label": "test3", + "lastSeed": "", + "secrets": "", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "bip44", + "version": "0.3" + }, + "entries": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_wallet/empty.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_wallet/empty.wlt new file mode 100644 index 00000000..afeca2dd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_wallet/empty.wlt @@ -0,0 +1,14 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [] +} + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/err_type.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/err_type.wlt new file mode 100644 index 00000000..9f62934b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/err_type.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "invalid_type", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_coin.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_coin.wlt new file mode 100644 index 00000000..aa22c318 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_coin.wlt @@ -0,0 +1,18 @@ +{ + "meta": { + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_seed.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_seed.wlt new file mode 100644 index 00000000..e6e26ed0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_seed.wlt @@ -0,0 +1,18 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_type.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_type.wlt new file mode 100644 index 00000000..1376dbd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_type.wlt @@ -0,0 +1,18 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/scrypt-chacha20poly1305-encrypted.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/scrypt-chacha20poly1305-encrypted.wlt new file mode 100644 index 00000000..c75f1726 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/scrypt-chacha20poly1305-encrypted.wlt @@ -0,0 +1,27 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "scrypt-chacha20poly1305-encrypted.wlt", + "label": "scrypt-chacha20poly1305", + "lastSeed": "", + "secrets": "dAB7Im4iOjMyNzY4LCJyIjo4LCJwIjoxLCJrZXlMZW4iOjMyLCJzYWx0IjoiT2kxTVd2cE1CVmRCYXVCZldhOGs0MVFhWFRrWnBVeTRkd1N3dTVsZjV5Zz0iLCJub25jZSI6Ik1aeFdvRGVza1N4OGdsd1gifXuy+kX89cwbM2pxsPYRcRg+lObHyQjlPDB/aO8nh/rRhs1KZp8/BZUZmluxgGlSVMT80A567kgc4Y+q4E5OA4GgdVlE3ca63oKHO/ujCzYSBdY28HkbxzYIRVlvJZYMEExA8Zd5LQFBnAjXcQpiSRTggT3mf3byewfCUHj3IgtDoN1gpOlTZx+1ecH8aUFtJTlxnO9l2xFRfUCPxoG6natG3yiVfK63J21FlRAJO/763u+YmRr9dpn89bA3Ol6Rpq9X+ghJjawK31kWWbxsmdEBIQfxf8fOwMJpn6q7ickU0wioHZ/dxxybvFO34enTTrXYSXxeJAAx00YCAmpWvXAwYQdqZt8RKVrp4m+U8lTR0AWlMeKiq9Vre+PdeaSPhHgMQCBslph8oB6eWGIbofKX3L5ypNbFWFCFA3FF2yf4c1r1NNTgeBvmceIpShlkgJnTXa++AQ==", + "seed": "", + "tm": "1549801137", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "LxcitUpWQZbPjgEPs6R1i3G4Xa31nPMoSG", + "public_key": "0300f6b15377b0917062199bb90bb5eb6bd4ec6408cf99b0f25ad39280628f276b", + "secret_key": "" + }, + { + "address": "2EJMjg7nV4DMrkshnvwg7tLdibeuu7DKvZh", + "public_key": "02f101936835d944aef21930bb078de22da7154fb9a0c66d9f2a07a380bbe8fafe", + "secret_key": "" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/sha256xor-encrypted.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/sha256xor-encrypted.wlt new file mode 100644 index 00000000..04138661 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/sha256xor-encrypted.wlt @@ -0,0 +1,22 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "sha256-xor", + "encrypted": "true", + "filename": "sha256xor-encrypted.wlt", + "label": "sha256xor", + "lastSeed": "", + "secrets": "gnuCNYiwuFN/eyAvOZYTYB+/ALRgkh5omR/7xyJIIsSrEQtMLkXrms05tYe0r5px1DHNASHz5jUg0T3RH4dS/fTusy2SORIq00f5rZLqLP9q+ySMKxhMBa1JPW64mSDRlVV9nS3LqTu06baSwDvN3wL8KtmbNVYxQ9PN8nk3plG2agiEW6/UpqUR1F2oWO58w9uwdy7rz2pS/QztlFoWVlQd9F9tNhDJEesCX5zTsxsd5O1glsKnagzy3216x4AQfC3LJZj3DiUTTXx0nMKzbLMsmwmYL0ZW/9ACtzU/1rWcVzQe95B8E4f7n8JoLLn4Mg1JATKHG7ISpunOVzLz6Yxyqh8azbaSemxR4lCgw1bbOZQryn3l5JX7ReZAW/JoJgNJ4aaaYZ/u0Tg94feOQgaJq6cKVNB8lHjU8zHfpbc=", + "seed": "", + "tm": "1549801106", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "kqc4S2EJNLMQ11hwo3Vg2ZvNc3CksDXnPy", + "public_key": "03c4aca54b68dda7eaf947d83c25d99b84becf8714b666d283b4f23b40d7e9e172", + "secret_key": "" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test1.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test1.wlt new file mode 100644 index 00000000..d2283fca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test1.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test2.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test2.wlt new file mode 100644 index 00000000..fa7020a3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test2.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_46d6.wlt", + "label": "test1", + "lastSeed": "67de80ac3ae025c8742bec541da7018d08fa351983557d2bc753e90e24337d13", + "seed": "sample assume enjoy museum behind horror mad reward forward reform valley planet", + "tm": "1503458877", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2ULfxDUuenUY5V4Pr8whmoAwFdUseXNyjXC", + "public_key": "03595cffa8e5906b08be0c6bf907c9b6ad70f422b7c875b1a0da2c11114145c71f", + "secret_key": "7154a28fc9939a759cd00067130507e118e8e068ed0df595d488c2562ce8c9f0" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test3.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test3.wlt new file mode 100644 index 00000000..bf15c60d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test3.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_5e7d.wlt", + "label": "test2", + "lastSeed": "f3a7942899ed2723999288ea83f4f20908bf9deabc05bc8216339da4d3e02c0b", + "seed": "acoustic test story tank thrive wine able frequent marriage use swim develop", + "tm": "1503458890", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2M755W9o7933roLASK9PZTmqRsjQUsVen9y", + "public_key": "03a179e412d9d27e14ba647177648a871a7311f15a5312064c7abac1d72764081c", + "secret_key": "7889f1d107dade4369bbb1ab6a55cf74a31d0524601398f03a57c5b0b1f5444b" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test4-collection.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test4-collection.wlt new file mode 100644 index 00000000..51ee6fd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test4-collection.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "2099_09_99_5a5a.wlt", + "label": "test3", + "lastSeed": "", + "seed": "", + "tm": "1503458909", + "type": "collection", + "version": "0.2" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test5-bip44.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test5-bip44.wlt new file mode 100644 index 00000000..f1ffc18f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test5-bip44.wlt @@ -0,0 +1,67 @@ +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "test5-bip44.wlt", + "label": "test5-bip44", + "lastSeed": "", + "secrets": "", + "seed": "voyage say extend find sheriff surge priority merit ignore maple cash argue", + "seedPassphrase": "", + "tm": "1562233771", + "type": "bip44", + "version": "0.3" + }, + "entries": [ + { + "address": "9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG", + "public_key": "02074cad04ddc61c355a2b0faf3099fb6261731eaa5d12fb5ce36cff5829583848", + "secret_key": "8e6d170ac29f26b3824428dcbd9849070739a02e6ec4d646a52fd9d48ddae67e", + "xprv": "xprvA43Cg6rd3Fv1Tcin9JPQLVhgYULdp8WnHDUUswZxEjXuQi9sMQ6gUEgFsUFhWV5e5eUZ3qhyMMEDrnZDrMjNKmFfV5mGA5rGBmLUABo4RFG", + "child_number": 0, + "change": 0 + }, + { + "address": "29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW", + "public_key": "03055c0e3af16ca8fa61a162a709984e5c7aaf0673f953a69954e039b28f39a076", + "secret_key": "99995e4fd3261ca5aa3baff8e686bc404f9c92ce5fb35cee403586699a661d70", + "xprv": "xprvA43Cg6rd3Fv1VgENQXHX3Gsu6gF9bUyMfhRhmU4SsJDrGb83VqmR7XV8DYeKYPoQG2A8jQU64Mo2jMq5hzPzsWpujhWj8L2D5VM4bgEnRCB", + "child_number": 1, + "change": 0 + }, + { + "address": "2ZUAv9MGSpDKR3dnKMUnrKqLenV22JXAxzP", + "public_key": "0297e32c9672586956fa26fca605a1ec4ff01b6922c190003cb50d00aacd12436d", + "secret_key": "580651e6ab86c93e895f187c0364564771d396d8e9884572abfffca0c7c766ef", + "xprv": "xprvA43Cg6rd3Fv1Y776WqJ9mHhU7htii6wVLmT3d395hxJwj6wQL9tGoboSyeJ9phJbd7BmnZgouUFXXKdWVnsH4g7EyycK34PzwSu3KhSx5Tc", + "child_number": 2, + "change": 0 + }, + { + "address": "oHvj7oy8maES9HJiQHJTp4GvcUcpz3voDq", + "public_key": "02ca3ee1a6092bb8bafc2a57c26412edc2b7de1dd0d8eb5b5b40819aee756dcced", + "secret_key": "2f293ac9d02bc119165d0f2226f045cb31f49b0ec03f53a7b792518e75f8ce6b", + "xprv": "xprvA2d34WiJh6wNHLFn4PfTEV5JosmypCXrmWW7ZM2cp4B5MdmwSWx7CRdfGgPRyjmCJmGdDg2VXaDDfWjetD58DpM8kXWArTtDi1chvpk1SPJ", + "child_number": 0, + "change": 1 + }, + { + "address": "2SGMfTFV2zbQzGw7aJm1D5EeEPgych5ixuC", + "public_key": "024360f9304b4a40496a1ea4653df912c7b3fa5123fce5db421f099b10d9d8941e", + "secret_key": "67486d242223e4d5f813d6b9087574c80ae47452047cd6cebaae77d5e8996544", + "xprv": "xprvA2d34WiJh6wNK4nyMBcFov4SrH6stzduRUY8HpVT2yx6A38ZeV9fqBGvT8oTUhnomaDmdkNpUM56Ud86gEuRgvtQQ3sRRHwR3UhdZmrnMiV", + "child_number": 1, + "change": 1 + }, + { + "address": "2ymjULRdbiFoUNJKNhWbQ3JqdE8TXnZkyU", + "public_key": "03e3344a7d378dbfe4f872ae831196937b673e8c15990dad817f9cbbf4beb22f3f", + "secret_key": "f16b5785fd48ef0583c1a5f7ca78a3acc9f7132f0742a3611912869e00d55c53", + "xprv": "xprvA2d34WiJh6wNNtD9MggscueaCHUAgQAszuTEZddfzsM6GZWy6DPLBsAaPoAGVjQuECFk5Tn2xEZ7ya33cZtR1K646kEceywkYqMmSgJeXgF", + "child_number": 2, + "change": 1 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-bip44.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-bip44.wlt new file mode 100644 index 00000000..4f558f20 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-bip44.wlt @@ -0,0 +1,40 @@ +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "test6-bip44.wlt", + "label": "test6-bip44", + "lastSeed": "", + "secrets": "", + "seed": "into raccoon purity buzz shock arch artefact stadium bless witness used odor", + "seedPassphrase": "", + "tm": "1562241393", + "type": "bip44", + "version": "0.3" + }, + "entries": [ + { + "address": "c4gUJP2XytywBbvrjni7hPDK7ZgmK3dGuH", + "public_key": "02a52d5d9399ef1925dded42f44b7a0c6124e5a1e30ad4a04a198b64f336bd7378", + "secret_key": "ddd235eebb2ee5aac6d17591aa04e35a3376fb4b6b6cab9492251d5ca1540a80", + "child_number": 0, + "change": 0 + }, + { + "address": "Qb5SE7ARrBvcbjYqHnAoenAKnd9NT6QUaR", + "public_key": "03958bade8945f30f8c226bf9238a03e7bc42821fc482a9c70153a3393b06a6c24", + "secret_key": "7af0bf10f7a3e6ed2bd916d05b8cd032e5e0343b153f84334dd7ec1b8e58e655", + "child_number": 1, + "change": 0 + }, + { + "address": "29uMZ7vhsv8tRqjocLPMjuUaJVLyu91iNwW", + "public_key": "02607723cc31fff50bc8ae7dfff86b2472f593350d0a45e034aa78082952466882", + "secret_key": "328da176b75dc6bad2a54c145aa25154779faa48520d868c37d391ac4611d133", + "child_number": 2, + "change": 0 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-passphrase-bip44.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-passphrase-bip44.wlt new file mode 100644 index 00000000..237ccce0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-passphrase-bip44.wlt @@ -0,0 +1,40 @@ +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "test6-passphrase-bip44.wlt", + "label": "test6-passphrase-bip44", + "lastSeed": "", + "secrets": "", + "seed": "voyage say extend find sheriff surge priority merit ignore maple cash argue", + "seedPassphrase": "foobar", + "tm": "1562414330", + "type": "bip44", + "version": "0.3" + }, + "entries": [ + { + "address": "n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8", + "public_key": "025570afef5ab8379f2b728297a7e579042d1f4cd17142129cea936dc869a01033", + "secret_key": "0c9764b340855567b48b498b96830b3afe9194b587345cf415d602e370b3ed34", + "child_number": 0, + "change": 0 + }, + { + "address": "mGeG2PDoU4nc9qE1FSSreAjFeKG12zDvur", + "public_key": "03968defd679e6f5c2af5fb3f07e3fa5e53fdf50e021db6052d237333356503813", + "secret_key": "7fc6d339eb453daae4e779bf4dec44124f28d9e0e2e76c03fc075420e2f2e8e5", + "child_number": 1, + "change": 0 + }, + { + "address": "rhbE3thvA747E81KfaYCujur7GKXjdhvS4", + "public_key": "02cd574b2c96b8d85d46d168fbf2bce6cd516e6d6b855904b56997772e189cab25", + "secret_key": "b017dcbb71dfa49a3cfbcb126147c2728ee8be17f1f93be4fc12f34ebdb5660b", + "child_number": 2, + "change": 0 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/v2_no_encrypt.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/v2_no_encrypt.wlt new file mode 100644 index 00000000..c8e06f4a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/v2_no_encrypt.wlt @@ -0,0 +1,22 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "false", + "filename": "v2_no_encrypt.wlt", + "label": "v2_no_encrypt", + "lastSeed": "c79454cf362b3f55e5effce09f664311650a44b9c189b3c8eed1ae9bd696cd9e", + "secrets": "", + "seed": "seed", + "tm": "1516497816", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2EVNa4CK9SKosT4j1GEn8SuuUUEAXaHAMbM", + "public_key": "02e5be89fa161bf6b0bc64ec9ec7fe27311fbb78949c3ef9739d4c73a84920d6e1", + "secret_key": "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/xpub-test.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/xpub-test.wlt new file mode 100644 index 00000000..7dcaad3b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/xpub-test.wlt @@ -0,0 +1,25 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "xpub-test.wlt", + "label": "xpub-test", + "lastSeed": "", + "secrets": "", + "seed": "", + "seedPassphrase": "", + "tm": "1563252269", + "type": "xpub", + "version": "0.4", + "xpub": "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5" + }, + "entries": [ + { + "address": "2DpeofcsamDfanrRz34qjYvskRzKqzNKMcj", + "public_key": "0243802bfee2c58101d5da81028f3480a923ae5af771e4055ede154482e96da1cd", + "secret_key": "", + "child_number": 0 + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction.go new file mode 100644 index 00000000..5b3b0ddc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction.go @@ -0,0 +1,286 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/transaction" +) + +var ( + // ErrUnknownAddress is returned if an address is not found in a wallet + ErrUnknownAddress = NewError(errors.New("address not found in wallet")) + // ErrUnknownUxOut is returned if a uxout is not owned by any address in a wallet + ErrUnknownUxOut = NewError(errors.New("uxout is not owned by any address in the wallet")) + // ErrWalletCantSign is returned is attempting to sign a transaction with a wallet + // that does not have the capability to sign transactions (e.g. an xpub or watch wallet) + ErrWalletCantSign = NewError(errors.New("wallet does not have the signing capability")) +) + +func validateSignIndexes(x []int, uxOuts []coin.UxOut) error { + if len(x) > len(uxOuts) { + return errors.New("Number of signature indexes exceeds number of inputs") + } + + for _, i := range x { + if i >= len(uxOuts) || i < 0 { + return errors.New("Signature index out of range") + } + } + + m := make(map[int]struct{}, len(x)) + for _, i := range x { + if _, ok := m[i]; ok { + return errors.New("Duplicate value in signature indexes") + } + m[i] = struct{}{} + } + + return nil +} + +func copyTransaction(txn *coin.Transaction) *coin.Transaction { + txnHash := txn.Hash() + txnInnerHash := txn.HashInner() + + txn2 := *txn + txn2.Sigs = make([]cipher.Sig, len(txn.Sigs)) + copy(txn2.Sigs, txn.Sigs) + txn2.In = make([]cipher.SHA256, len(txn.In)) + copy(txn2.In, txn.In) + txn2.Out = make([]coin.TransactionOutput, len(txn.Out)) + copy(txn2.Out, txn.Out) + + if txnInnerHash != txn2.HashInner() { + logger.Panic("copyTransaction copy broke InnerHash") + } + if txnHash != txn2.Hash() { + logger.Panic("copyTransaction copy broke Hash") + } + + return &txn2 +} + +// SignTransaction signs a transaction. Specific inputs may be signed by specifying signIndexes. +// If signIndexes is empty, all inputs will be signed. +// The transaction should already have a valid header. The transaction may be partially signed, +// but a valid existing signature cannot be overwritten. +// Clients should avoid signing the same transaction multiple times. +func SignTransaction(w Wallet, txn *coin.Transaction, signIndexes []int, uxOuts []coin.UxOut) (*coin.Transaction, error) { + switch w.Type() { + case WalletTypeXPub: + return nil, ErrWalletCantSign + } + + signedTxn := copyTransaction(txn) + txnInnerHash := signedTxn.HashInner() + + if w.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if txnInnerHash != signedTxn.InnerHash { + return nil, NewError(errors.New("Transaction inner hash does not match computed inner hash")) + } + + if len(signedTxn.Sigs) == 0 { + return nil, NewError(errors.New("Transaction signatures array is empty")) + } + if signedTxn.IsFullySigned() { + return nil, NewError(errors.New("Transaction is fully signed")) + } + + if len(signedTxn.In) == 0 { + return nil, NewError(errors.New("No transaction inputs to sign")) + } + if len(uxOuts) != len(signedTxn.In) { + return nil, errors.New("len(uxOuts) != len(txn.In)") + } + if err := validateSignIndexes(signIndexes, uxOuts); err != nil { + return nil, NewError(err) + } + + nMissingSigs := 0 + for _, s := range signedTxn.Sigs { + if s.Null() { + nMissingSigs++ + } + } + + // Build a mapping of addresses to the inputs that need to be signed + addrs := make(map[cipher.Address][]int) + if len(signIndexes) > 0 { + for _, in := range signIndexes { + if !signedTxn.Sigs[in].Null() { + return nil, NewError(fmt.Errorf("Transaction is already signed at index %d", in)) + } + addrs[uxOuts[in].Body.Address] = append(addrs[uxOuts[in].Body.Address], in) + } + } else { + for i, o := range uxOuts { + if !signedTxn.Sigs[i].Null() { + continue + } + addrs[o.Body.Address] = append(addrs[o.Body.Address], i) + } + } + + // Check that the wallet has all addresses needed for signing + toSign := make(map[int][]int) + for i, e := range w.GetEntries() { + if len(toSign) == len(addrs) { + break + } + addr := e.SkycoinAddress() + if x, ok := addrs[addr]; ok { + toSign[i] = x + } + } + + if len(toSign) != len(addrs) { + return nil, NewError(errors.New("Wallet cannot sign all requested inputs")) + } + + // Sign the selected inputs + for k, v := range toSign { + for _, x := range v { + if !signedTxn.Sigs[x].Null() { + return nil, NewError(fmt.Errorf("Transaction is already signed at index %d", x)) + } + + if err := signedTxn.SignInput(w.GetEntryAt(k).Secret, x); err != nil { + return nil, err + } + } + } + + if err := signedTxn.UpdateHeader(); err != nil { + return nil, err + } + + // Sanity check + if txnInnerHash != signedTxn.HashInner() { + err := errors.New("Transaction inner hash modified in the process of signing") + logger.Critical().WithError(err).Error() + return nil, err + } + + if len(signIndexes) == 0 || len(signIndexes) == nMissingSigs { + if !signedTxn.IsFullySigned() { + return nil, errors.New("Transaction is not fully signed, but should be") + } + } else { + if signedTxn.IsFullySigned() { + return nil, errors.New("Transaction is fully signed, but shouldn't be") + } + } + + return signedTxn, nil +} + +// CreateTransaction creates an unsigned transaction based upon transaction.Params. +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided. +// NOTE: Caller must ensure that auxs correspond to params.Wallet.Addresses and params.Wallet.UxOuts options +// Outputs to spend are chosen from the pool of outputs provided. +// The outputs are chosen by the following procedure: +// - All outputs are merged into one list and are sorted coins highest, hours lowest, with the hash as a tiebreaker +// - Outputs are chosen from the beginning of this list, until the requested amount of coins is met. +// If hours are also specified, selection continues until the requested amount of hours are met. +// - If the total amount of coins in the chosen outputs is exactly equal to the requested amount of coins, +// such that there would be no change output but hours remain as change, another output will be chosen to create change, +// if the coinhour cost of adding that output is less than the coinhours that would be lost as change +// If receiving hours are not explicitly specified, hours are allocated amongst the receiving outputs proportional to the number of coins being sent to them. +// If the change address is not specified, the address whose bytes are lexically sorted first is chosen from the owners of the outputs being spent. +// WARNING: This method is not concurrent-safe if operating on the same wallet. Use Service.View or Service.ViewSecrets to lock the wallet, or use your own lock. +func CreateTransaction(w Wallet, p transaction.Params, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []transaction.UxBalance, error) { + if err := p.Validate(); err != nil { + return nil, nil, err + } + + // Check that auxs does not contain addresses that are not known to this wallet + for a := range auxs { + if !w.HasEntry(a) { + return nil, nil, fmt.Errorf("Address %s from auxs not found in wallet", a) + } + } + + // Generate a new change address for bip44 wallets + var changeEntry *Entry + if p.ChangeAddress == nil && w.Type() == WalletTypeBip44 { + e, err := w.(*Bip44Wallet).PeekChangeEntry() + if err != nil { + logger.Critical().WithError(err).Error("PeekChangeEntry failed") + return nil, nil, fmt.Errorf("PeekChangeEntry failed: %v", err) + } + changeAddr := e.Address.(cipher.Address) + p.ChangeAddress = &changeAddr + changeEntry = &e + } + + txn, uxb, err := transaction.Create(p, auxs, headTime) + + if err == nil && changeEntry != nil && w.Type() == WalletTypeBip44 { + // Commit the change address to the bip44 wallet, assuming it will be used + if e, err := w.(*Bip44Wallet).GenerateChangeEntry(); err != nil { + logger.WithError(err).Panic("GenerateChangeEntry failed after a PeekChangeEntry") + } else if e != *changeEntry { + logger.Panicf("GenerateChangeEntry produced a different change entry than PeekChangeEntry: %s != %s", e.Address, changeEntry.Address) + } + } + + return txn, uxb, err +} + +// CreateTransactionSigned creates and signs a transaction based upon transaction.Params. +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided. +// Refer to CreateTransaction for information about transaction creation. +func CreateTransactionSigned(w Wallet, p transaction.Params, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []transaction.UxBalance, error) { + txn, uxb, err := CreateTransaction(w, p, auxs, headTime) + if err != nil { + return nil, nil, err + } + + logger.Infof("CreateTransactionSigned: signing %d inputs", len(uxb)) + + // Sign the transaction + entriesMap := make(map[cipher.Address]Entry) + for i, s := range uxb { + entry, ok := entriesMap[s.Address] + if !ok { + entry, ok = w.GetEntry(s.Address) + if !ok { + // This should not occur because CreateTransaction should have checked it already + err := fmt.Errorf("Chosen spend address %s not found in wallet", s.Address) + logger.Critical().WithError(err).Error() + return nil, nil, err + } + entriesMap[s.Address] = entry + } + + if err := txn.SignInput(entry.Secret, i); err != nil { + logger.Critical().WithError(err).Errorf("CreateTransaction SignInput(%d) failed", i) + return nil, nil, err + } + } + + // Sanity check the signed transaction + if err := verifyCreatedSignedInvariants(p, txn, uxb); err != nil { + return nil, nil, err + } + + return txn, uxb, nil +} + +func verifyCreatedSignedInvariants(p transaction.Params, txn *coin.Transaction, inputs []transaction.UxBalance) error { + if !txn.IsFullySigned() { + return errors.New("Transaction is not fully signed") + } + + if err := transaction.VerifyCreatedInvariants(p, txn, inputs); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction_test.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction_test.go new file mode 100644 index 00000000..91e111db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction_test.go @@ -0,0 +1,826 @@ +package wallet + +import ( + "bytes" + "errors" + "fmt" + "math" + "math/rand" + "reflect" + "sort" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +func TestWalletSignTransaction(t *testing.T) { + txnSigned, uxs, seckeys := makeTransaction(t, 4) + require.Equal(t, 4, len(uxs)) + require.Equal(t, 4, len(seckeys)) + txnUnsigned := txnSigned + txnUnsigned.Sigs = make([]cipher.Sig, len(txnSigned.Sigs)) + + w := &CollectionWallet{} + for _, x := range seckeys { + p := cipher.MustPubKeyFromSecKey(x) + a := cipher.AddressFromPubKey(p) + err := w.AddEntry(Entry{ + Address: a, + Public: p, + Secret: x, + }) + require.NoError(t, err) + + // Add unrelated entries + err = w.AddEntry(makeEntry()) + require.NoError(t, err) + } + + badTxnInnerHash, _, _ := makeTransaction(t, 2) + badTxnInnerHash.InnerHash = testutil.RandSHA256(t) + + badTxnNoInputs, _, _ := makeTransaction(t, 2) + badTxnNoInputs.Sigs = make([]cipher.Sig, len(badTxnNoInputs.Sigs)) + badTxnNoInputs.In = nil + err := badTxnNoInputs.UpdateHeader() + require.NoError(t, err) + + badTxnNoSigs, _, _ := makeTransaction(t, 2) + badTxnNoSigs.Sigs = nil + err = badTxnNoSigs.UpdateHeader() + require.NoError(t, err) + + txnOtherWallet, uxsOtherWallet, secKeysOtherWallet := makeTransaction(t, 4) + + txnPartiallySigned := txnOtherWallet + err = txnPartiallySigned.Verify() + require.NoError(t, err) + err = txnPartiallySigned.VerifyInputSignatures(uxsOtherWallet) + require.NoError(t, err) + + txnPartiallySigned.Sigs = make([]cipher.Sig, len(txnOtherWallet.Sigs)) + copy(txnPartiallySigned.Sigs, txnOtherWallet.Sigs) + txnPartiallySigned.Sigs[1] = cipher.Sig{} + txnPartiallySigned.Sigs[2] = cipher.Sig{} + err = txnPartiallySigned.UpdateHeader() + require.NoError(t, err) + + txnPartiallySigned2 := txnPartiallySigned + txnPartiallySigned2.Sigs = make([]cipher.Sig, len(txnPartiallySigned.Sigs)) + copy(txnPartiallySigned2.Sigs, txnPartiallySigned.Sigs) + err = txnPartiallySigned2.UpdateHeader() + require.NoError(t, err) + + txnOtherWallet.Sigs = make([]cipher.Sig, len(txnOtherWallet.Sigs)) + err = txnOtherWallet.UpdateHeader() + require.NoError(t, err) + + otherWallet := &CollectionWallet{} + for i := 1; i < 3; i++ { + p := cipher.MustPubKeyFromSecKey(secKeysOtherWallet[i]) + a := cipher.AddressFromPubKey(p) + err := otherWallet.AddEntry(Entry{ + Address: a, + Public: p, + Secret: secKeysOtherWallet[i], + }) + require.NoError(t, err) + } + + cases := []struct { + name string + w Wallet + txn coin.Transaction + signIndexes []int + uxOuts []coin.UxOut + err error + partial bool + complete bool + }{ + { + name: "signed txn", + w: w, + txn: txnSigned, + uxOuts: uxs, + err: NewError(errors.New("Transaction is fully signed")), + }, + + { + name: "partially signed txn signing with same index", + w: w, + txn: txnPartiallySigned, + uxOuts: uxs, + signIndexes: []int{3}, + err: NewError(errors.New("Transaction is already signed at index 3")), + }, + + { + name: "bad txn inner hash", + w: w, + txn: badTxnInnerHash, + err: NewError(errors.New("Transaction inner hash does not match computed inner hash")), + }, + + { + name: "txn no inputs", + w: w, + txn: badTxnNoInputs, + err: NewError(errors.New("No transaction inputs to sign")), + }, + + { + name: "txn no sigs", + w: w, + txn: badTxnNoSigs, + err: NewError(errors.New("Transaction signatures array is empty")), + }, + + { + name: "len uxouts does not match len inputs", + w: w, + txn: txnUnsigned, + uxOuts: uxs[:2], + err: errors.New("len(uxOuts) != len(txn.In)"), + }, + + { + name: "too many sign indexes", + w: w, + txn: txnUnsigned, + uxOuts: uxs, + signIndexes: []int{0, 1, 2, 3, 4, 5}, + err: NewError(errors.New("Number of signature indexes exceeds number of inputs")), + }, + + { + name: "sign index out of range", + w: w, + txn: txnUnsigned, + uxOuts: uxs, + signIndexes: []int{0, 1, 5, 2}, + err: NewError(errors.New("Signature index out of range")), + }, + + { + name: "duplicate value in sign indexes", + w: w, + txn: txnUnsigned, + uxOuts: uxs, + signIndexes: []int{0, 1, 1}, + err: NewError(errors.New("Duplicate value in signature indexes")), + }, + + { + name: "wallet cannot sign any input", + w: w, + txn: txnOtherWallet, + uxOuts: uxsOtherWallet, + err: NewError(errors.New("Wallet cannot sign all requested inputs")), + }, + + { + name: "wallet cannot sign some inputs", + w: otherWallet, + txn: txnOtherWallet, + uxOuts: uxsOtherWallet, + err: NewError(errors.New("Wallet cannot sign all requested inputs")), + }, + + { + name: "wallet cannot sign all specified inputs", + w: otherWallet, + txn: txnOtherWallet, + uxOuts: uxsOtherWallet, + signIndexes: []int{2, 0}, + err: NewError(errors.New("Wallet cannot sign all requested inputs")), + }, + + { + name: "valid unsigned txn, all sigs", + w: w, + txn: txnUnsigned, + uxOuts: uxs, + err: nil, + }, + + { + name: "valid unsigned txn, some sigs defined", + w: w, + txn: txnUnsigned, + signIndexes: []int{1, 2}, + uxOuts: uxs, + err: nil, + }, + + { + name: "valid unsigned txn, all sigs defined", + w: w, + txn: txnUnsigned, + signIndexes: []int{0, 1, 2, 3}, + uxOuts: uxs, + err: nil, + }, + + { + name: "valid unsigned txn, all sigs defined, unordered", + w: w, + txn: txnUnsigned, + signIndexes: []int{2, 1, 3, 0}, + uxOuts: uxs, + err: nil, + }, + + { + name: "valid, wallet can sign the specified inputs, but not others", + w: otherWallet, + txn: txnOtherWallet, + uxOuts: uxsOtherWallet, + signIndexes: []int{2}, + err: nil, + }, + + { + name: "valid, transaction partially signed, unfinished signing", + w: otherWallet, + txn: txnPartiallySigned, + uxOuts: uxsOtherWallet, + signIndexes: []int{2}, + err: nil, + partial: true, + complete: false, + }, + + { + name: "valid, transaction partially signed, finished signing", + w: otherWallet, + txn: txnPartiallySigned2, + uxOuts: uxsOtherWallet, + signIndexes: []int{1, 2}, + err: nil, + partial: true, + complete: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + signedTxn, err := SignTransaction(tc.w, &tc.txn, tc.signIndexes, tc.uxOuts) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + // The original txn should not be modified + require.False(t, reflect.DeepEqual(tc.txn, *signedTxn)) + + if len(tc.signIndexes) == 0 || len(tc.signIndexes) == len(tc.uxOuts) || tc.complete { + // Transaction should be fully signed + require.False(t, signedTxn.IsFullyUnsigned()) + err = signedTxn.Verify() + require.NoError(t, err) + err = signedTxn.VerifyInputSignatures(tc.uxOuts) + require.NoError(t, err) + } else { + // index of a valid signature should be found in the signIndexes + for _, x := range tc.signIndexes { + require.False(t, signedTxn.Sigs[x].Null()) + } + + if !tc.partial { + // Number of signatures should equal length of signIndexes + nSigned := 0 + for _, s := range signedTxn.Sigs { + if !s.Null() { + nSigned++ + } + } + + require.Equal(t, len(tc.signIndexes), nSigned) + } + } + }) + } +} + +func TestWalletCreateTransaction(t *testing.T) { + headTime := uint64(time.Now().UTC().Unix()) + seed := []byte("seed") + + // Generate first keys + _, secKeys := cipher.MustGenerateDeterministicKeyPairsSeed(seed, 11) + secKey := secKeys[0] + addr := cipher.MustAddressFromSecKey(secKey) + + var extraWalletAddrs []cipher.Address + for _, s := range secKeys[1:] { + extraWalletAddrs = append(extraWalletAddrs, cipher.MustAddressFromSecKey(s)) + } + + // Create unspent outputs + var uxouts []coin.UxOut + var originalUxouts []coin.UxOut + addrs := []cipher.Address{} + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + originalUxouts = append(originalUxouts, uxout) + + a := testutil.MakeAddress() + addrs = append(addrs, a) + } + + w := &CollectionWallet{} + for _, x := range secKeys { + p := cipher.MustPubKeyFromSecKey(x) + a := cipher.AddressFromPubKey(p) + err := w.AddEntry(Entry{ + Address: a, + Public: p, + Secret: x, + }) + require.NoError(t, err) + + // Add unrelated entries + err = w.AddEntry(makeEntry()) + require.NoError(t, err) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxouts), func(i, j int) { + uxouts[i], uxouts[j] = uxouts[j], uxouts[i] + }) + + // Create extra unspent outputs. These have the same value as uxouts, but are spendable by + // keys held in extraWalletAddrs + extraUxouts := make([][]coin.UxOut, len(extraWalletAddrs)) + for j := range extraWalletAddrs { + s := secKeys[j+1] + + var uxouts []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, s, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + } + + extraUxouts[j] = uxouts + } + + // Create unspent outputs with no hours + var uxoutsNoHours []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, 0) + uxout.Head.Time = headTime + uxoutsNoHours = append(uxoutsNoHours, uxout) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxoutsNoHours), func(i, j int) { + uxoutsNoHours[i], uxoutsNoHours[j] = uxoutsNoHours[j], uxoutsNoHours[i] + }) + + changeAddress := testutil.MakeAddress() + + validParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + } + + unknownAddress := testutil.MakeAddress() + + cases := []struct { + name string + err error + params transaction.Params + unspents []coin.UxOut + addressUnspents coin.AddressUxOuts + chosenUnspents []coin.UxOut + headTime uint64 + changeOutput *coin.TransactionOutput + toExpectedHours []uint64 + }{ + { + name: "params invalid", + params: transaction.Params{}, + err: transaction.NewError(errors.New("To is required")), + }, + + { + name: "unknown address in auxs", + params: validParams, + addressUnspents: coin.AddressUxOuts{ + unknownAddress: uxouts, + }, + err: fmt.Errorf("Address %s from auxs not found in wallet", unknownAddress), + }, + + { + name: "overflowing coin hours in params", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: math.MaxUint64, + Coins: 1e6, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1e6, + }, + }, + }, + err: transaction.NewError(errors.New("total output hours error: uint64 addition overflow")), + }, + + { + name: "overflowing coins in params", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: math.MaxUint64, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1, + }, + }, + }, + err: transaction.NewError(errors.New("total output coins error: uint64 addition overflow")), + }, + + { + name: "no unspents", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: transaction.ErrNoUnspents, + }, + + { + name: "insufficient coins", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 100e6, + }, + }, + }, + unspents: uxouts[:1], + err: transaction.ErrInsufficientBalance, + }, + + { + name: "insufficient hours", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 100e6, + Coins: 1e6, + }, + }, + }, + unspents: uxouts[:1], + err: transaction.ErrInsufficientHours, + }, + + { + name: "manual, 1 output, no change", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 90, + Coins: 2e6, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0]}, + }, + + { + name: "no coin hours in inputs", + unspents: uxoutsNoHours[:], + params: transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: fee.ErrTxnNoFee, + }, + } + + type TestResult struct { + Transaction *coin.Transaction + Inputs []transaction.UxBalance + Unsigned bool + } + + results := make(map[string]TestResult, len(cases)) + + compareResult := func(t *testing.T, a, b TestResult) { + require.True(t, reflect.DeepEqual(a.Inputs, b.Inputs)) + require.True(t, reflect.DeepEqual(a.Transaction.Out, b.Transaction.Out)) + require.Equal(t, a.Transaction.InnerHash, b.Transaction.InnerHash) + require.Equal(t, a.Transaction.Type, b.Transaction.Type) + require.Equal(t, a.Transaction.Length, b.Transaction.Length) + require.Equal(t, len(a.Transaction.Sigs), len(b.Transaction.Sigs)) + + if a.Unsigned == b.Unsigned { + require.Equal(t, a.Transaction.Hash(), b.Transaction.Hash()) + // Sigs have a nonce so will vary each run, unset them before comparing the whole transaction + require.Equal(t, len(a.Transaction.Sigs), len(b.Transaction.Sigs)) + at := *a.Transaction + bt := *b.Transaction + at.Sigs = nil + bt.Sigs = nil + require.True(t, reflect.DeepEqual(at, bt)) + } else { + require.NotEqual(t, a.Transaction.Hash(), b.Transaction.Hash()) + } + } + + bools := []bool{true, false} + for _, unsigned := range bools { + for _, tc := range cases { + name := fmt.Sprintf("unsigned=%v %s", unsigned, tc.name) + t.Run(name, func(t *testing.T) { + if tc.headTime == 0 { + tc.headTime = headTime + } + + addrUxOuts := coin.AddressUxOuts{ + addr: tc.unspents, + } + + if tc.addressUnspents != nil { + addrUxOuts = tc.addressUnspents + } + + unspents := make(map[cipher.SHA256]coin.UxOut) + for _, uxs := range addrUxOuts { + for _, ux := range uxs { + unspents[ux.Hash()] = ux + } + } + + var txn *coin.Transaction + var inputs []transaction.UxBalance + var err error + if unsigned { + txn, inputs, err = CreateTransaction(w, tc.params, addrUxOuts, tc.headTime) + } else { + txn, inputs, err = CreateTransactionSigned(w, tc.params, addrUxOuts, tc.headTime) + } + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + if tc.err != nil { + return + } + + if unsigned { + err := txn.VerifyUnsigned() + require.NoError(t, err) + } else { + err := txn.Verify() + require.NoError(t, err) + } + + require.Equal(t, len(inputs), len(txn.In)) + + // Checks duplicate inputs in array + inputsMap := make(map[cipher.SHA256]struct{}) + for _, i := range inputs { + _, ok := inputsMap[i.Hash] + require.False(t, ok) + inputsMap[i.Hash] = struct{}{} + } + + for i, inUxid := range txn.In { + _, ok := unspents[inUxid] + require.True(t, ok) + + require.Equal(t, inUxid, inputs[i].Hash) + } + + // Compare the transaction inputs + chosenUnspents := make([]coin.UxOut, len(tc.chosenUnspents)) + chosenUnspentHashes := make([]cipher.SHA256, len(tc.chosenUnspents)) + for i, u := range tc.chosenUnspents { + chosenUnspents[i] = u + chosenUnspentHashes[i] = u.Hash() + } + sort.Slice(chosenUnspentHashes, func(i, j int) bool { + return bytes.Compare(chosenUnspentHashes[i][:], chosenUnspentHashes[j][:]) < 0 + }) + sort.Slice(chosenUnspents, func(i, j int) bool { + h1 := chosenUnspents[i].Hash() + h2 := chosenUnspents[j].Hash() + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + sortedTxnIn := make([]cipher.SHA256, len(txn.In)) + copy(sortedTxnIn[:], txn.In[:]) + + sort.Slice(sortedTxnIn, func(i, j int) bool { + return bytes.Compare(sortedTxnIn[i][:], sortedTxnIn[j][:]) < 0 + }) + + require.Equal(t, chosenUnspentHashes, sortedTxnIn) + + sort.Slice(inputs, func(i, j int) bool { + h1 := inputs[i].Hash + h2 := inputs[j].Hash + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + chosenUnspentsUxBalances := make([]transaction.UxBalance, len(chosenUnspents)) + for i, o := range chosenUnspents { + b, err := transaction.NewUxBalance(tc.headTime, o) + require.NoError(t, err) + chosenUnspentsUxBalances[i] = b + } + + require.Equal(t, chosenUnspentsUxBalances, inputs) + + // Assign expected hours for comparison + var to []coin.TransactionOutput + to = append(to, tc.params.To...) + + if len(tc.toExpectedHours) != 0 { + require.Equal(t, len(tc.toExpectedHours), len(to)) + for i, h := range tc.toExpectedHours { + to[i].Hours = h + } + } + + // Add the change output if specified + if tc.changeOutput != nil { + to = append(to, *tc.changeOutput) + } + + // Compare transaction outputs + require.Equal(t, to, txn.Out) + + // compare to previous result for the same test case + // but either signed or unsigned (both should produce the same transactions, except for signatures) + result := TestResult{ + Transaction: txn, + Inputs: inputs, + Unsigned: unsigned, + } + if prevResult, ok := results[tc.name]; ok { + compareResult(t, prevResult, result) + } else { + results[tc.name] = result + } + }) + } + } +} + +func makeTransaction(t *testing.T, nInputs int) (coin.Transaction, []coin.UxOut, []cipher.SecKey) { + txn := coin.Transaction{} + + toSign := make([]cipher.SecKey, 0) + uxs := make([]coin.UxOut, 0) + for i := 0; i < nInputs; i++ { + ux, s := makeUxOutWithSecret(t) + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + toSign = append(toSign, s) + uxs = append(uxs, ux) + } + + err := txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + txn.SignInputs(toSign) + err = txn.UpdateHeader() + require.NoError(t, err) + + return txn, uxs, toSign +} + +func makeUxOut(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxOut { //nolint:unparam + body := makeUxBody(t, s, coins, hours) + tm := rand.Int31n(1000) + seq := rand.Int31n(100) + return coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(tm), + BkSeq: uint64(seq), + }, + Body: body, + } +} + +func makeUxBody(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxBody { + p := cipher.MustPubKeyFromSecKey(s) + return coin.UxBody{ + SrcTransaction: cipher.SumSHA256(testutil.RandBytes(t, 128)), + Address: cipher.AddressFromPubKey(p), + Coins: coins, + Hours: hours, + } +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeEntry() Entry { + p, s := cipher.GenerateKeyPair() + a := cipher.AddressFromPubKey(p) + return Entry{ + Secret: s, + Public: p, + Address: a, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet.go new file mode 100644 index 00000000..9546b9be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet.go @@ -0,0 +1,727 @@ +/* +Package wallet implements wallets and the wallet database service +*/ +package wallet + +import ( + "encoding/hex" + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// Error wraps wallet-related errors. +// It wraps errors caused by user input, but not errors caused by programmer input or internal issues. +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} + +var ( + // Version represents the current wallet version + Version = "0.4" + + logger = logging.MustGetLogger("wallet") + + // ErrInvalidEncryptedField is returned if a wallet's Meta.encrypted value is invalid. + ErrInvalidEncryptedField = NewError(errors.New(`encrypted field value is not valid, must be "true", "false" or ""`)) + // ErrWalletEncrypted is returned when trying to generate addresses or sign tx in encrypted wallet + ErrWalletEncrypted = NewError(errors.New("wallet is encrypted")) + // ErrWalletNotEncrypted is returned when trying to decrypt unencrypted wallet + ErrWalletNotEncrypted = NewError(errors.New("wallet is not encrypted")) + // ErrMissingPassword is returned when trying to create wallet with encryption, but password is not provided. + ErrMissingPassword = NewError(errors.New("missing password")) + // ErrMissingEncrypt is returned when trying to create wallet with password, but options.Encrypt is not set. + ErrMissingEncrypt = NewError(errors.New("missing encrypt")) + // ErrInvalidPassword is returned if decrypts secrets failed + ErrInvalidPassword = NewError(errors.New("invalid password")) + // ErrMissingSeed is returned when trying to create wallet without a seed + ErrMissingSeed = NewError(errors.New("missing seed")) + // ErrMissingAuthenticated is returned if try to decrypt a scrypt chacha20poly1305 encrypted wallet, and find no authenticated metadata. + ErrMissingAuthenticated = NewError(errors.New("missing authenticated metadata")) + // ErrWrongCryptoType is returned when decrypting wallet with wrong crypto method + ErrWrongCryptoType = NewError(errors.New("wrong crypto type")) + // ErrWalletNotExist is returned if a wallet does not exist + ErrWalletNotExist = NewError(errors.New("wallet doesn't exist")) + // ErrSeedUsed is returned if a wallet already exists with the same seed + ErrSeedUsed = NewError(errors.New("a wallet already exists with this seed")) + // ErrXPubKeyUsed is returned if a wallet already exists with the same xpub key + ErrXPubKeyUsed = NewError(errors.New("a wallet already exists with this xpub key")) + // ErrWalletAPIDisabled is returned when trying to do wallet actions while the EnableWalletAPI option is false + ErrWalletAPIDisabled = NewError(errors.New("wallet api is disabled")) + // ErrSeedAPIDisabled is returned when trying to get seed of wallet while the EnableWalletAPI or EnableSeedAPI is false + ErrSeedAPIDisabled = NewError(errors.New("wallet seed api is disabled")) + // ErrWalletNameConflict represents the wallet name conflict error + ErrWalletNameConflict = NewError(errors.New("wallet name would conflict with existing wallet, renaming")) + // ErrWalletRecoverSeedWrong is returned if the seed or seed passphrase does not match the specified wallet when recovering + ErrWalletRecoverSeedWrong = NewError(errors.New("wallet recovery seed or seed passphrase is wrong")) + // ErrNilTransactionsFinder is returned if Options.ScanN > 0 but a nil TransactionsFinder was provided + ErrNilTransactionsFinder = NewError(errors.New("scan ahead requested but balance getter is nil")) + // ErrInvalidCoinType is returned for invalid coin types + ErrInvalidCoinType = NewError(errors.New("invalid coin type")) + // ErrInvalidWalletType is returned for invalid wallet types + ErrInvalidWalletType = NewError(errors.New("invalid wallet type")) + // ErrWalletTypeNotRecoverable is returned by RecoverWallet is the wallet type does not support recovery + ErrWalletTypeNotRecoverable = NewError(errors.New("wallet type is not recoverable")) + // ErrWalletPermission is returned when updating a wallet without writing permission + ErrWalletPermission = NewError(errors.New("saving wallet permission denied")) +) + +const ( + // WalletExt wallet file extension + WalletExt = "wlt" + + // WalletTimestampFormat wallet timestamp layout + WalletTimestampFormat = "2006_01_02" + + // CoinTypeSkycoin skycoin type + CoinTypeSkycoin CoinType = "skycoin" + // CoinTypeBitcoin bitcoin type + CoinTypeBitcoin CoinType = "bitcoin" + + // WalletTypeDeterministic deterministic wallet type. + // Uses the original Skycoin deterministic key generator. + WalletTypeDeterministic = "deterministic" + // WalletTypeCollection collection wallet type. + // Does not use any key generator; keys must be added explicitly + WalletTypeCollection = "collection" + // WalletTypeBip44 bip44 HD wallet type. + // Follow the bip44 spec. + WalletTypeBip44 = "bip44" + // WalletTypeXPub xpub HD wallet type. + // Allows generating addresses without a secret key + WalletTypeXPub = "xpub" +) + +// ResolveCoinType normalizes a coin type string to a CoinType constant +func ResolveCoinType(s string) (CoinType, error) { + switch strings.ToLower(s) { + case "sky", "skycoin": + return CoinTypeSkycoin, nil + case "btc", "bitcoin": + return CoinTypeBitcoin, nil + default: + return CoinType(""), ErrInvalidCoinType + } +} + +// IsValidWalletType returns true if a wallet type is recognized +func IsValidWalletType(t string) bool { + switch t { + case WalletTypeDeterministic, + WalletTypeCollection, + WalletTypeBip44, + WalletTypeXPub: + return true + default: + return false + } +} + +// CoinType represents the wallet coin type, which refers to the pubkey2addr method used +type CoinType string + +// NewWalletFilename generates a filename from the current time and random bytes +func NewWalletFilename() string { + timestamp := time.Now().Format(WalletTimestampFormat) + // should read in wallet files and make sure does not exist + padding := hex.EncodeToString((cipher.RandByte(2))) + return fmt.Sprintf("%s_%s.%s", timestamp, padding, WalletExt) +} + +// Options options that could be used when creating a wallet +type Options struct { + Type string // wallet type: deterministic, collection. Refers to which key generation mechanism is used. + Coin CoinType // coin type: skycoin, bitcoin, etc. Refers to which pubkey2addr method is used. + Bip44Coin *bip44.CoinType // bip44 path coin type + Label string // wallet label + Seed string // wallet seed + SeedPassphrase string // wallet seed passphrase (bip44 wallets only) + Encrypt bool // whether the wallet need to be encrypted. + Password []byte // password that would be used for encryption, and would only be used when 'Encrypt' is true. + CryptoType CryptoType // wallet encryption type, scrypt-chacha20poly1305 or sha256-xor. + ScanN uint64 // number of addresses that're going to be scanned for a balance. The highest address with a balance will be used. + GenerateN uint64 // number of addresses to generate, regardless of balance + XPub string // xpub key (xpub wallets only) +} + +// newWallet creates a wallet instance with given name and options. +func newWallet(wltName string, opts Options, tf TransactionsFinder) (Wallet, error) { + wltType := opts.Type + if wltType == "" { + return nil, NewError(errors.New("wallet type is required")) + } + if !IsValidWalletType(wltType) { + return nil, ErrInvalidWalletType + } + + lastSeed := "" + if wltType == WalletTypeDeterministic { + lastSeed = opts.Seed + } + + var bip44Coin bip44.CoinType + if wltType == WalletTypeBip44 { + if opts.Bip44Coin == nil { + switch opts.Coin { + case CoinTypeBitcoin: + bip44Coin = bip44.CoinTypeBitcoin + case CoinTypeSkycoin: + bip44Coin = bip44.CoinTypeSkycoin + default: + bip44Coin = bip44.CoinTypeSkycoin + } + } else { + bip44Coin = *opts.Bip44Coin + } + } + + if opts.SeedPassphrase != "" && wltType != WalletTypeBip44 { + return nil, NewError(fmt.Errorf("seedPassphrase is only used for %q wallets", WalletTypeBip44)) + } + + if opts.XPub != "" && wltType != WalletTypeXPub { + return nil, NewError(fmt.Errorf("xpub is only used for %q wallets", WalletTypeXPub)) + } + + switch wltType { + case WalletTypeDeterministic, WalletTypeBip44: + if opts.Seed == "" { + return nil, ErrMissingSeed + } + + if opts.ScanN > 0 && tf == nil { + return nil, ErrNilTransactionsFinder + } + + case WalletTypeXPub: + if opts.Seed != "" { + return nil, NewError(fmt.Errorf("seed should not be provided for %q wallets", wltType)) + } + + if opts.ScanN > 0 && tf == nil { + return nil, ErrNilTransactionsFinder + } + + case WalletTypeCollection: + if opts.Seed != "" { + return nil, NewError(fmt.Errorf("seed should not be provided for %q wallets", wltType)) + } + + default: + return nil, ErrInvalidWalletType + } + + coin := opts.Coin + if coin == "" { + coin = CoinTypeSkycoin + } + coin, err := ResolveCoinType(string(coin)) + if err != nil { + return nil, err + } + + meta := Meta{ + metaFilename: wltName, + metaVersion: Version, + metaLabel: opts.Label, + metaSeed: opts.Seed, + metaLastSeed: lastSeed, + metaSeedPassphrase: opts.SeedPassphrase, + metaTimestamp: strconv.FormatInt(time.Now().Unix(), 10), + metaType: wltType, + metaCoin: string(coin), + metaEncrypted: "false", + metaCryptoType: "", + metaSecrets: "", + metaXPub: opts.XPub, + } + + // Create the wallet + var w Wallet + switch wltType { + case WalletTypeDeterministic: + w, err = newDeterministicWallet(meta) + case WalletTypeCollection: + w, err = newCollectionWallet(meta) + case WalletTypeBip44: + meta.setBip44Coin(bip44Coin) + w, err = newBip44Wallet(meta) + case WalletTypeXPub: + meta.setXPub(opts.XPub) + w, err = newXPubWallet(meta) + default: + logger.Panic("unhandled wltType") + } + + if err != nil { + logger.WithError(err).WithField("walletType", wltType).Error("newWallet failed") + return nil, err + } + + // Generate wallet addresses + switch wltType { + case WalletTypeDeterministic, WalletTypeBip44, WalletTypeXPub: + generateN := opts.GenerateN + if generateN == 0 { + generateN = 1 + } + + logger.WithFields(logrus.Fields{ + "generateN": generateN, + "walletType": wltType, + }).Infof("Generating addresses for wallet") + + if _, err := w.GenerateAddresses(generateN); err != nil { + return nil, err + } + + if opts.ScanN != 0 && coin != CoinTypeSkycoin { + return nil, errors.New("Wallet scanning is only supported for Skycoin address wallets") + } + + if opts.ScanN > generateN { + // Scan for addresses with balances + logger.WithFields(logrus.Fields{ + "scanN": opts.ScanN, + "walletType": wltType, + }).Info("Scanning addresses for wallet") + if err := w.ScanAddresses(opts.ScanN, tf); err != nil { + return nil, err + } + } + + case WalletTypeCollection: + if opts.GenerateN != 0 || opts.ScanN != 0 { + return nil, NewError(fmt.Errorf("wallet scanning is not defined for %q wallets", wltType)) + } + + default: + logger.Panic("unhandled wltType") + } + + // Validate the wallet, before encrypting + if err := w.Validate(); err != nil { + return nil, err + } + + // Check if the wallet should be encrypted + if !opts.Encrypt { + if len(opts.Password) != 0 { + return nil, ErrMissingEncrypt + } + return w, nil + } + + // Check if the password is provided + if len(opts.Password) == 0 { + return nil, ErrMissingPassword + } + + // Check crypto type + if opts.CryptoType == "" { + opts.CryptoType = DefaultCryptoType + } + + if _, err := getCrypto(opts.CryptoType); err != nil { + return nil, err + } + + // Encrypt the wallet + if err := Lock(w, opts.Password, opts.CryptoType); err != nil { + return nil, err + } + + // Validate the wallet again, after encrypting + if err := w.Validate(); err != nil { + return nil, err + } + + return w, nil +} + +// NewWallet creates wallet without scanning addresses +func NewWallet(wltName string, opts Options) (Wallet, error) { + return newWallet(wltName, opts, nil) +} + +// NewWalletScanAhead creates wallet and scan ahead N addresses +func NewWalletScanAhead(wltName string, opts Options, tf TransactionsFinder) (Wallet, error) { + return newWallet(wltName, opts, tf) +} + +// Lock encrypts the wallet with the given password and specific crypto type +func Lock(w Wallet, password []byte, cryptoType CryptoType) error { + if len(password) == 0 { + return ErrMissingPassword + } + + if w.IsEncrypted() { + return ErrWalletEncrypted + } + + wlt := w.Clone() + + // Records seeds in secrets + ss := make(Secrets) + defer func() { + // Wipes all unencrypted sensitive data + ss.erase() + wlt.Erase() + }() + + wlt.PackSecrets(ss) + + sb, err := ss.serialize() + if err != nil { + return err + } + + crypto, err := getCrypto(cryptoType) + if err != nil { + return err + } + + // Encrypts the secrets + encSecret, err := crypto.Encrypt(sb, password) + if err != nil { + return err + } + + // Sets wallet as encrypted + wlt.SetEncrypted(cryptoType, string(encSecret)) + + // Update the wallet to the latest version, which indicates encryption support + wlt.SetVersion(Version) + + // Wipes unencrypted sensitive data + wlt.Erase() + + // Wipes the secret fields in w + w.Erase() + + // Replace the original wallet with new encrypted wallet + w.CopyFrom(wlt) + return nil +} + +// Unlock decrypts the wallet into a temporary decrypted copy of the wallet +// Returns error if the decryption fails +// The temporary decrypted wallet should be erased from memory when done. +func Unlock(w Wallet, password []byte) (Wallet, error) { + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + if len(password) == 0 { + return nil, ErrMissingPassword + } + + wlt := w.Clone() + + // Gets the secrets string + sstr := w.Secrets() + if sstr == "" { + return nil, errors.New("secrets missing from wallet") + } + + ct := w.CryptoType() + if ct == "" { + return nil, errors.New("missing crypto type") + } + + // Gets the crypto module + crypto, err := getCrypto(ct) + if err != nil { + return nil, err + } + + // Decrypts the secrets + sb, err := crypto.Decrypt([]byte(sstr), password) + if err != nil { + return nil, ErrInvalidPassword + } + + defer func() { + // Wipe the data from the secrets bytes buffer + for i := range sb { + sb[i] = 0 + } + }() + + // Deserialize into secrets + ss := make(Secrets) + defer ss.erase() + if err := ss.deserialize(sb); err != nil { + return nil, err + } + + if err := wlt.UnpackSecrets(ss); err != nil { + return nil, err + } + + wlt.SetDecrypted() + + return wlt, nil +} + +// Wallet defines the wallet API +type Wallet interface { + Find(string) string + Seed() string + LastSeed() string + SeedPassphrase() string + Timestamp() int64 + SetTimestamp(int64) + Coin() CoinType + Bip44Coin() bip44.CoinType + Type() string + Label() string + SetLabel(string) + Filename() string + IsEncrypted() bool + SetEncrypted(cryptoType CryptoType, encryptedSecrets string) + SetDecrypted() + CryptoType() CryptoType + Version() string + SetVersion(string) + AddressConstructor() func(cipher.PubKey) cipher.Addresser + Secrets() string + XPub() string + + UnpackSecrets(ss Secrets) error + PackSecrets(ss Secrets) + + Erase() + Clone() Wallet + CopyFrom(src Wallet) + CopyFromRef(src Wallet) + + ToReadable() Readable + + Validate() error + + Fingerprint() string + GetAddresses() []cipher.Addresser + GetSkycoinAddresses() ([]cipher.Address, error) + GetEntryAt(i int) Entry + GetEntry(cipher.Address) (Entry, bool) + HasEntry(cipher.Address) bool + EntriesLen() int + GetEntries() Entries + + GenerateAddresses(num uint64) ([]cipher.Addresser, error) + GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) + ScanAddresses(scanN uint64, tf TransactionsFinder) error +} + +// GuardUpdate executes a function within the context of a read-write managed decrypted wallet. +// Returns ErrWalletNotEncrypted if wallet is not encrypted. +func GuardUpdate(w Wallet, password []byte, fn func(w Wallet) error) error { + if !w.IsEncrypted() { + return ErrWalletNotEncrypted + } + + if len(password) == 0 { + return ErrMissingPassword + } + + cryptoType := w.CryptoType() + wlt, err := Unlock(w, password) + if err != nil { + return err + } + + defer wlt.Erase() + + if err := fn(wlt); err != nil { + return err + } + + if err := Lock(wlt, password, cryptoType); err != nil { + return err + } + + w.CopyFromRef(wlt) + + // Wipes all sensitive data + w.Erase() + return nil +} + +// GuardView executes a function within the context of a read-only managed decrypted wallet. +// Returns ErrWalletNotEncrypted if wallet is not encrypted. +func GuardView(w Wallet, password []byte, f func(w Wallet) error) error { + if !w.IsEncrypted() { + return ErrWalletNotEncrypted + } + + if len(password) == 0 { + return ErrMissingPassword + } + + wlt, err := Unlock(w, password) + if err != nil { + return err + } + + defer wlt.Erase() + + return f(wlt) +} + +type walletLoadMeta struct { + Meta struct { + Type string `json:"type"` + } `json:"meta"` +} + +type walletLoader interface { + SetFilename(string) + SetCoin(CoinType) + Coin() CoinType + ToWallet() (Wallet, error) +} + +// Load loads wallet from a given file +func Load(filename string) (Wallet, error) { + if _, err := os.Stat(filename); os.IsNotExist(err) { + return nil, fmt.Errorf("wallet %q doesn't exist", filename) + } + + // Load the wallet meta type field from JSON + var m walletLoadMeta + if err := file.LoadJSON(filename, &m); err != nil { + logger.WithError(err).WithField("filename", filename).Error("Load: file.LoadJSON failed") + return nil, err + } + + if !IsValidWalletType(m.Meta.Type) { + logger.WithError(ErrInvalidWalletType).WithFields(logrus.Fields{ + "filename": filename, + "walletType": m.Meta.Type, + }).Error("wallet meta loaded from disk has invalid wallet type") + return nil, fmt.Errorf("invalid wallet %q: %v", filename, ErrInvalidWalletType) + } + + // Depending on the wallet type in the wallet metadata header, load the full wallet data + var rw walletLoader + var err error + switch m.Meta.Type { + case WalletTypeDeterministic: + logger.WithField("filename", filename).Info("LoadReadableDeterministicWallet") + rw, err = LoadReadableDeterministicWallet(filename) + case WalletTypeCollection: + logger.WithField("filename", filename).Info("LoadReadableCollectionWallet") + rw, err = LoadReadableCollectionWallet(filename) + case WalletTypeBip44: + logger.WithField("filename", filename).Info("LoadReadableBip44Wallet") + rw, err = LoadReadableBip44Wallet(filename) + case WalletTypeXPub: + logger.WithField("filename", filename).Info("LoadReadableXPubWallet") + rw, err = LoadReadableXPubWallet(filename) + default: + err := errors.New("unhandled wallet type") + logger.WithField("walletType", m.Meta.Type).WithError(err).Error("Load failed") + return nil, err + } + + if err != nil { + logger.WithError(err).WithFields(logrus.Fields{ + "filename": filename, + "walletType": m.Meta.Type, + }).Error("Load readable wallet failed") + return nil, err + } + + // Make sure "sky", "btc" normalize to "skycoin", "bitcoin" + ct, err := ResolveCoinType(string(rw.Coin())) + if err != nil { + logger.WithError(err).WithField("coinType", rw.Coin()).Error("Load: invalid coin type") + return nil, fmt.Errorf("invalid wallet %q: %v", filename, err) + } + rw.SetCoin(ct) + + rw.SetFilename(filepath.Base(filename)) + + return rw.ToWallet() +} + +// Save saves the wallet to a directory. The wallet's filename is read from its metadata. +func Save(w Wallet, dir string) error { + rw := w.ToReadable() + return file.SaveJSON(filepath.Join(dir, rw.Filename()), rw, 0600) +} + +// removeBackupFiles removes any *.wlt.bak files whom have version 0.1 and *.wlt matched in the given directory +func removeBackupFiles(dir string) error { + fs, err := filterDir(dir, ".wlt") + if err != nil { + return err + } + + // Creates the .wlt file map + fm := make(map[string]struct{}) + for _, f := range fs { + fm[f] = struct{}{} + } + + // Filters all .wlt.bak files in the directory + bakFs, err := filterDir(dir, ".wlt.bak") + if err != nil { + return err + } + + // Removes the .wlt.bak file that has .wlt matched. + for _, bf := range bakFs { + f := strings.TrimRight(bf, ".bak") + if _, ok := fm[f]; ok { + // Load and check the wallet version + w, err := Load(f) + if err != nil { + return err + } + + if w.Version() == "0.1" { + if err := os.Remove(bf); err != nil { + return err + } + } + } + } + + return nil +} + +func filterDir(dir string, suffix string) ([]string, error) { + files, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + res := []string{} + for _, f := range files { + if !f.IsDir() && strings.HasSuffix(f.Name(), suffix) { + res = append(res, filepath.Join(dir, f.Name())) + } + } + return res, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet_test.go new file mode 100644 index 00000000..9f09728d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet_test.go @@ -0,0 +1,1578 @@ +package wallet + +import ( + "encoding/hex" + "errors" + "flag" + "fmt" + "io/ioutil" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/cipher/encrypt" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + log = logging.MustGetLogger("wallet_test") +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +var u = flag.Bool("u", false, "update test wallet file in ./testdata") + +func init() { + flag.Parse() + + // Change the scrypt N value in cryptoTable to make test faster, otherwise + // it would take more than 200 seconds to finish. + cryptoTable[CryptoTypeScryptChacha20poly1305] = encrypt.ScryptChacha20poly1305{ + N: 1 << 15, + R: encrypt.ScryptR, + P: encrypt.ScryptP, + KeyLen: encrypt.ScryptKeyLen, + } + + // When -u flag is specified, update the following wallet files: + // - ./testdata/scrypt-chacha20poly1305-encrypted.wlt + // - ./testdata/sha256xor-encrypted.wlt + if *u { + // Update ./testdata/scrypt-chacha20poly1305-encrypted.wlt + // - Create an unencrypted wallet + // - Generate an address + // - Lock the wallet with scrypt-chacha20poly1305 crypto type and password of "pwd". + w, err := NewWallet("scrypt-chacha20poly1305-encrypted.wlt", Options{ + Seed: "seed-scrypt-chacha20poly1305", + Label: "scrypt-chacha20poly1305", + }) + if err != nil { + log.Panic(err) + } + + if _, err := w.GenerateAddresses(1); err != nil { + log.Panic(err) + } + + if err := Lock(w, []byte("pwd"), CryptoTypeScryptChacha20poly1305); err != nil { + log.Panic(err) + } + + if err := Save(w, "./testdata"); err != nil { + log.Panic(err) + } + + // Update ./testdata/sha256xor-encrypted.wlt + // - Create an sha256xor encrypted wallet with password: "pwd". + w1, err := NewWallet("sha256xor-encrypted.wlt", Options{ + Seed: "seed-sha256xor", + Label: "sha256xor", + Encrypt: true, + Password: []byte("pwd"), + CryptoType: CryptoTypeSha256Xor, + }) + if err != nil { + log.Panic(err) + } + + if err := Save(w1, "./testdata"); err != nil { + log.Panic(err) + } + } +} + +func TestNewWallet(t *testing.T) { + type expect struct { + meta map[string]string + err error + } + + tt := []struct { + name string + wltName string + opts Options + expect expect + }{ + { + name: "ok, empty collection wallet", + wltName: "test-collection.wlt", + opts: Options{ + Type: WalletTypeCollection, + }, + expect: expect{ + meta: map[string]string{ + "label": "", + "filename": "test-collection.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "version": Version, + }, + err: nil, + }, + }, + { + name: "ok, xpub wallet", + wltName: "test-xpub.wlt", + opts: Options{ + Type: WalletTypeXPub, + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + expect: expect{ + meta: map[string]string{ + "label": "", + "filename": "test-collection.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "version": Version, + "xpub": "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + err: nil, + }, + }, + { + name: "ok all defaults", + wltName: "test.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + expect: expect{ + meta: map[string]string{ + "label": "", + "filename": "test.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "seed": "testseed123", + "version": Version, + }, + err: nil, + }, + }, + { + name: "ok with seed set, deterministic", + wltName: "test.wlt", + opts: Options{ + Seed: "testseed123", + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "", + "filename": "test.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "seed": "testseed123", + "version": Version, + }, + err: nil, + }, + }, + { + name: "ok with label and seed set, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Seed: "testseed123", + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "filename": "test.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "seed": "testseed123", + "version": Version, + }, + err: nil, + }, + }, + { + name: "ok with label, seed and coin set, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeBitcoin, + Seed: "testseed123", + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "filename": "test.wlt", + "coin": string(CoinTypeBitcoin), + "type": WalletTypeDeterministic, + "seed": "testseed123", + }, + err: nil, + }, + }, + { + name: "ok default crypto type, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Seed: "testseed123", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "encrypted": "true", + }, + err: nil, + }, + }, + { + name: "encrypt without password, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Seed: "testseed123", + Encrypt: true, + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "encrypted": "true", + }, + err: ErrMissingPassword, + }, + }, + { + name: "create with no seed, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "encrypted": "true", + }, + err: ErrMissingSeed, + }, + }, + { + name: "password=pwd encrypt=false, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Encrypt: false, + Seed: "seed", + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + expect: expect{ + err: ErrMissingEncrypt, + }, + }, + { + name: "ok bip44", + wltName: "bip44.wlt", + opts: Options{ + Label: "bip44wallet1", + Type: WalletTypeBip44, + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + }, + expect: expect{ + meta: map[string]string{ + "label": "bip44wallet1", + "coin": string(CoinTypeSkycoin), + "type": string(WalletTypeBip44), + "version": Version, + "bip44Coin": "8000", + }, + }, + }, + { + name: "invalid xpub wallet", + wltName: "test-xpub.wlt", + opts: Options{ + Type: WalletTypeXPub, + XPub: "xpubbad", + }, + expect: expect{ + err: NewError(errors.New("invalid xpub key: Serialized keys should be exactly 82 bytes")), + }, + }, + { + name: "seed provided with xpub wallet", + wltName: "test-xpub.wlt", + opts: Options{ + Type: WalletTypeXPub, + Seed: "foobar", + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + expect: expect{ + err: NewError(errors.New("seed should not be provided for \"xpub\" wallets")), + }, + }, + } + + for _, tc := range tt { + // test all supported crypto types + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + t.Run(name, func(t *testing.T) { + w, err := NewWallet(tc.wltName, tc.opts) + + if tc.expect.err == nil { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Equal(t, tc.expect.err, err, "%s != %s", tc.expect.err.Error(), err.Error()) + return + } + + require.Equal(t, tc.opts.Encrypt, w.IsEncrypted()) + + if w.IsEncrypted() { + // Confirms the seeds and entry secrets are all empty + require.Equal(t, "", w.Seed()) + require.Equal(t, "", w.LastSeed()) + + for _, e := range w.GetEntries() { + require.True(t, e.Secret.Null()) + } + + // Confirms that secrets field is not empty + require.NotEmpty(t, w.Secrets()) + } + }) + } + } +} + +func TestWalletLock(t *testing.T) { + tt := []struct { + name string + opts Options + lockPwd []byte + err error + }{ + { + name: "ok deterministic", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + lockPwd: []byte("pwd"), + }, + { + name: "ok bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + lockPwd: []byte("pwd"), + }, + { + name: "password is nil", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + lockPwd: nil, + err: ErrMissingPassword, + }, + { + name: "wallet already encrypted", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + lockPwd: []byte("pwd"), + err: ErrWalletEncrypted, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + t.Run(name, func(t *testing.T) { + wltName := NewWalletFilename() + w, err := NewWallet(wltName, tc.opts) + require.NoError(t, err) + + if !w.IsEncrypted() { + // Generates 2 addresses + _, err = w.GenerateAddresses(2) + require.NoError(t, err) + } + + err = Lock(w, tc.lockPwd, ct) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.True(t, w.IsEncrypted()) + + // Checks if the seeds are wiped + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + // Checks if the entries are encrypted + for _, e := range w.GetEntries() { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }) + + } + } +} + +func TestWalletUnlock(t *testing.T) { + tt := []struct { + name string + opts Options + unlockPwd []byte + err error + }{ + { + name: "ok deterministic", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + unlockPwd: []byte("pwd"), + }, + { + name: "ok bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + unlockPwd: []byte("pwd"), + }, + { + name: "unlock with nil password", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + unlockPwd: nil, + err: ErrMissingPassword, + }, + { + name: "unlock undecrypted wallet", + opts: Options{ + Seed: "seed", + Encrypt: false, + Type: WalletTypeDeterministic, + }, + unlockPwd: []byte("pwd"), + err: ErrWalletNotEncrypted, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + t.Run(name, func(t *testing.T) { + w := makeWallet(t, tc.opts, 1) + // Tests the unlock method + wlt, err := Unlock(w, tc.unlockPwd) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.False(t, wlt.IsEncrypted()) + + // Checks the seeds + require.Equal(t, tc.opts.Seed, wlt.Seed()) + + // Checks the generated addresses + require.Equal(t, 1, wlt.EntriesLen()) + + switch tc.opts.Type { + case WalletTypeBip44: + require.Empty(t, wlt.LastSeed()) + keys := generateBip44Chain(t, wlt.Seed(), wlt.SeedPassphrase(), bip44.ExternalChainIndex, 1) + for i, e := range wlt.GetEntries() { + sk := cipher.MustNewSecKey(keys[i].Key) + addr := cipher.MustAddressFromSecKey(sk) + require.Equal(t, addr, e.Address) + } + + case WalletTypeDeterministic: + sd, sks := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(wlt.Seed()), 1) + require.Equal(t, hex.EncodeToString(sd), wlt.LastSeed()) + + for i, e := range wlt.GetEntries() { + addr := cipher.MustAddressFromSecKey(sks[i]) + require.Equal(t, addr, e.Address) + } + default: + t.Fatalf("unhandled wallet type %q", tc.opts.Type) + } + + // Checks the original seeds + require.NotEqual(t, tc.opts.Seed, w.Seed()) + + // Checks if the seckeys in entries of original wallet are empty + for _, e := range w.GetEntries() { + require.True(t, e.Secret.Null()) + } + + // Checks if the seed and lastSeed in original wallet are still empty + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + require.Empty(t, w.SeedPassphrase()) + }) + } + } +} + +func TestLockAndUnLock(t *testing.T) { + for _, walletType := range []string{ + WalletTypeBip44, + WalletTypeDeterministic, + } { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + w, err := NewWallet("wallet", Options{ + Label: "wallet", + Seed: bip39.MustNewDefaultMnemonic(), + Type: walletType, + }) + require.NoError(t, err) + _, err = w.GenerateAddresses(9) + require.NoError(t, err) + require.Equal(t, 10, w.EntriesLen()) + + if walletType == WalletTypeBip44 { + // Generate change entries, to verify that their secret keys + // are protected and revealed when locked and unlocked + for i := 0; i < 5; i++ { + e, err := w.(*Bip44Wallet).GenerateChangeEntry() + require.NoError(t, err) + require.Equal(t, bip44.ChangeChainIndex, e.Change) + } + + require.Equal(t, 15, w.EntriesLen()) + nExternal := 0 + nChange := 0 + for _, e := range w.GetEntries() { + switch e.Change { + case bip44.ExternalChainIndex: + nExternal++ + case bip44.ChangeChainIndex: + nChange++ + default: + t.Fatalf("invalid change chain index: %d", e.Change) + } + } + require.Equal(t, 10, nExternal) + require.Equal(t, 5, nChange) + } + + // clone the wallet + cw := w.Clone() + require.Equal(t, w, cw) + + // lock the cloned wallet + err = Lock(cw, []byte("pwd"), ct) + require.NoError(t, err) + + checkNoSensitiveData(t, cw) + + // unlock the cloned wallet + ucw, err := Unlock(cw, []byte("pwd")) + require.NoError(t, err) + + require.Equal(t, w, ucw) + }) + } + } +} + +func makeWallet(t *testing.T, opts Options, addrNum uint64) Wallet { //nolint:unparam + // Create an unlocked wallet, then generate addresses, lock if the options.Encrypt is true. + preOpts := opts + opts.Encrypt = false + opts.Password = nil + w, err := NewWallet("t.wlt", opts) + require.NoError(t, err) + + if addrNum > 1 { + _, err = w.GenerateAddresses(addrNum - 1) + require.NoError(t, err) + } + if preOpts.Encrypt { + err = Lock(w, preOpts.Password, preOpts.CryptoType) + require.NoError(t, err) + } + return w +} + +func TestLoadWallet(t *testing.T) { + type expect struct { + meta map[string]string + err error + } + + tt := []struct { + name string + filename string + expect expect + }{ + { + name: "ok", + filename: "./testdata/test1.wlt", + expect: expect{ + meta: map[string]string{ + "coin": string(CoinTypeSkycoin), + "filename": "test1.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": WalletTypeDeterministic, + "version": "0.1", + }, + err: nil, + }, + }, + { + name: "wallet file doesn't exist", + filename: "not_exist_file.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("wallet \"not_exist_file.wlt\" doesn't exist"), + }, + }, + { + name: "invalid wallet: no type", + filename: "./testdata/invalid_wallets/no_type.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet \"./testdata/invalid_wallets/no_type.wlt\": invalid wallet type"), + }, + }, + { + name: "invalid wallet: invalid type", + filename: "./testdata/invalid_wallets/err_type.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet \"./testdata/invalid_wallets/err_type.wlt\": invalid wallet type"), + }, + }, + { + name: "invalid wallet: no coin", + filename: "./testdata/invalid_wallets/no_coin.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet \"./testdata/invalid_wallets/no_coin.wlt\": invalid coin type"), + }, + }, + { + name: "invalid wallet: no seed", + filename: "./testdata/invalid_wallets/no_seed.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet \"no_seed.wlt\": seed missing in unencrypted deterministic wallet"), + }, + }, + { + name: "version=0.2 encrypted=true crypto=scrypt-chacha20poly1305", + filename: "./testdata/scrypt-chacha20poly1305-encrypted.wlt", + expect: expect{ + meta: map[string]string{ + "coin": string(CoinTypeSkycoin), + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "scrypt-chacha20poly1305-encrypted.wlt", + "label": "scrypt-chacha20poly1305", + "lastSeed": "", + "seed": "", + "type": WalletTypeDeterministic, + "version": "0.2", + }, + err: nil, + }, + }, + { + name: "version=0.2 encrypted=true crypto=sha256xor", + filename: "./testdata/sha256xor-encrypted.wlt", + expect: expect{ + meta: map[string]string{ + "coin": string(CoinTypeSkycoin), + "cryptoType": "sha256-xor", + "encrypted": "true", + "filename": "sha256xor-encrypted.wlt", + "label": "sha256xor", + "lastSeed": "", + "seed": "", + "type": WalletTypeDeterministic, + "version": "0.2", + }, + err: nil, + }, + }, + { + name: "version=0.2 encrypted=false", + filename: "./testdata/v2_no_encrypt.wlt", + expect: expect{ + meta: map[string]string{ + "coin": string(CoinTypeSkycoin), + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "false", + "filename": "v2_no_encrypt.wlt", + "label": "v2_no_encrypt", + "lastSeed": "c79454cf362b3f55e5effce09f664311650a44b9c189b3c8eed1ae9bd696cd9e", + "secrets": "", + "seed": "seed", + "type": WalletTypeDeterministic, + "version": "0.2", + }, + err: nil, + }, + }, + { + name: "version=0.3 encrypted=false type=bip44", + filename: "./testdata/test5-bip44.wlt", + expect: expect{ + meta: map[string]string{ + "bip44Coin": fmt.Sprint(bip44.CoinTypeSkycoin), + "coin": string(CoinTypeSkycoin), + "cryptoType": "", + "encrypted": "false", + "filename": "test5-bip44.wlt", + "label": "test5-bip44", + "lastSeed": "", + "secrets": "", + "seed": "voyage say extend find sheriff surge priority merit ignore maple cash argue", + "seedPassphrase": "", + "type": WalletTypeBip44, + "version": "0.3", + }, + err: nil, + }, + }, + { + name: "version=0.3 encrypted=false type=bip44 seed-passphrase=true", + filename: "./testdata/test6-passphrase-bip44.wlt", + expect: expect{ + meta: map[string]string{ + "bip44Coin": fmt.Sprint(bip44.CoinTypeSkycoin), + "coin": string(CoinTypeSkycoin), + "cryptoType": "", + "encrypted": "false", + "filename": "test6-passphrase-bip44.wlt", + "label": "test6-passphrase-bip44", + "lastSeed": "", + "secrets": "", + "seed": "voyage say extend find sheriff surge priority merit ignore maple cash argue", + "seedPassphrase": "foobar", + "type": WalletTypeBip44, + "version": "0.3", + }, + err: nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + w, err := Load(tc.filename) + if err != nil { + require.Equal(t, tc.expect.err.Error(), err.Error()) + } + if err != nil { + return + } + + for k, v := range tc.expect.meta { + vv := w.Find(k) + require.Equal(t, v, vv) + } + + if w.IsEncrypted() { + require.NotEmpty(t, w.Secrets()) + } + }) + } +} + +func TestWalletGenerateAddress(t *testing.T) { + tt := []struct { + name string + opts Options + num uint64 + oneAddressEachTime bool + err error + }{ + { + name: "ok with one address deterministic", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + }, + num: 1, + }, + { + name: "ok with two address deterministic", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + }, + num: 2, + }, + { + name: "ok with three address and generate one address each time deterministic", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + }, + num: 2, + oneAddressEachTime: true, + }, + { + name: "wallet is encrypted deterministic", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + Encrypt: true, + Password: []byte("pwd"), + }, + num: 2, + oneAddressEachTime: true, + err: ErrWalletEncrypted, + }, + + { + name: "ok with one address bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + num: 1, + }, + { + name: "ok with two address bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + num: 2, + }, + { + name: "ok with three address and generate one address each time bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + num: 2, + oneAddressEachTime: true, + }, + { + name: "wallet is encrypted bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + Encrypt: true, + Password: []byte("pwd"), + }, + num: 2, + oneAddressEachTime: true, + err: ErrWalletEncrypted, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + + t.Run(name, func(t *testing.T) { + // create wallet + w, err := NewWallet("test.wlt", tc.opts) + require.NoError(t, err) + + // generate addresses + if tc.oneAddressEachTime { + _, err = w.GenerateAddresses(tc.num - 1) + require.Equal(t, tc.err, err) + if err != nil { + return + } + } else { + for i := uint64(0); i < tc.num-1; i++ { + _, err := w.GenerateAddresses(1) + require.Equal(t, tc.err, err) + if err != nil { + return + } + } + } + + // check the entry number + require.Equal(t, w.EntriesLen(), int(tc.num)) + + addrs := w.GetAddresses() + + switch tc.opts.Type { + case WalletTypeDeterministic: + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(tc.opts.Seed), int(tc.num)) + for i, k := range keys { + a := cipher.MustAddressFromSecKey(k) + require.Equal(t, a.String(), addrs[i].String()) + } + case WalletTypeBip44: + keys := generateBip44Chain(t, tc.opts.Seed, tc.opts.SeedPassphrase, bip44.ExternalChainIndex, int(tc.num)) + for i, k := range keys { + sk := cipher.MustNewSecKey(k.Key) + a := cipher.MustAddressFromSecKey(sk) + require.Equal(t, a.String(), addrs[i].String()) + } + default: + t.Fatalf("unhandled wallet type %q", tc.opts.Type) + } + }) + } + } +} + +// generateBip44Chain generates N keys for the leaf change chain +func generateBip44Chain(t *testing.T, seed, seedPassphrase string, change uint32, num int) []*bip32.PrivateKey { + ss, err := bip39.NewSeed(seed, seedPassphrase) + require.NoError(t, err) + + cc, err := bip44.NewCoin(ss, bip44.CoinTypeSkycoin) + require.NoError(t, err) + + acct, err := cc.Account(0) + require.NoError(t, err) + + chain, err := acct.NewPrivateChildKey(change) + require.NoError(t, err) + + keys := make([]*bip32.PrivateKey, num) + for i := 0; i < num; i++ { + k, err := chain.NewPrivateChildKey(uint32(i)) + require.NoError(t, err) + keys[i] = k + } + + return keys +} + +func TestWalletGetEntry(t *testing.T) { + tt := []struct { + name string + wltFile string + address string + find bool + }{ + { + "ok", + "./testdata/test1.wlt", + "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + true, + }, + { + "entry not exist", + "./testdata/test1.wlt", + "2ULfxDUuenUY5V4Pr8whmoAwFdUseXNyjXC", + false, + }, + { + "scrypt-chacha20poly1305 encrypted wallet", + "./testdata/scrypt-chacha20poly1305-encrypted.wlt", + "LxcitUpWQZbPjgEPs6R1i3G4Xa31nPMoSG", + true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + w, err := Load(tc.wltFile) + require.NoError(t, err) + a, err := cipher.DecodeBase58Address(tc.address) + require.NoError(t, err) + e, ok := w.GetEntry(a) + require.Equal(t, tc.find, ok) + if ok { + require.Equal(t, tc.address, e.Address.String()) + } + }) + } +} + +func TestWalletCollectionAddEntry(t *testing.T) { + test1SecKey, err := cipher.SecKeyFromHex("1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e") + require.NoError(t, err) + + _, s := cipher.GenerateKeyPair() + + cases := []struct { + name string + wltFile string + secKey cipher.SecKey + err error + }{ + { + "ok", + "./testdata/test4-collection.wlt", + s, + nil, + }, + { + "dup entry", + "./testdata/test4-collection.wlt", + test1SecKey, + errors.New("wallet already contains entry with this address"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + w, err := Load(tc.wltFile) + require.NoError(t, err) + + a := cipher.MustAddressFromSecKey(tc.secKey) + p := cipher.MustPubKeyFromSecKey(tc.secKey) + require.Equal(t, tc.err, w.(*CollectionWallet).AddEntry(Entry{ + Address: a, + Public: p, + Secret: tc.secKey, + })) + }) + } +} + +func TestWalletGuard(t *testing.T) { + cases := []struct { + name string + walletType string + }{ + { + name: "deterministic", + walletType: WalletTypeDeterministic, + }, + { + name: "bip44", + walletType: WalletTypeBip44, + }, + } + + for ct := range cryptoTable { + for _, tc := range cases { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + validate := func(w Wallet) { + require.Equal(t, "", w.Seed()) + require.Equal(t, "", w.LastSeed()) + require.Equal(t, "", w.SeedPassphrase()) + for _, e := range w.GetEntries() { + require.True(t, e.Secret.Null()) + } + } + + seed := bip39.MustNewDefaultMnemonic() + w, err := NewWallet("t.wlt", Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + CryptoType: ct, + Type: tc.walletType, + }) + require.NoError(t, err) + + err = GuardUpdate(w, []byte("pwd"), func(w Wallet) error { + require.Equal(t, seed, w.Seed()) + w.SetLabel("label") + return nil + }) + require.NoError(t, err) + require.Equal(t, "label", w.Label()) + validate(w) + + err = GuardView(w, []byte("pwd"), func(w Wallet) error { + require.Equal(t, "label", w.Label()) + w.SetLabel("new label") + return nil + }) + require.NoError(t, err) + + require.Equal(t, "label", w.Label()) + validate(w) + }) + } + } +} + +func TestRemoveBackupFiles(t *testing.T) { + type wltInfo struct { + wltName string + version string + } + + tt := []struct { + name string + initFiles []wltInfo + expectedRemainingFiles map[string]struct{} + }{ + { + name: "no file", + initFiles: []wltInfo{}, + expectedRemainingFiles: map[string]struct{}{}, + }, + { + name: "wlt v0.1=1 bak v0.1=1 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=2 bak v0.1=1 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t2.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=3 bak v0.1=1 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t3.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=3 bak v0.1=2 delete 2 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t2.wlt.bak", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t3.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=3 bak v0.1=3 delete 3 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t2.wlt.bak", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t3.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=3 bak v0.1=1 no delete", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t4.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + "t4.wlt.bak": struct{}{}, + }, + }, + { + name: "wlt v0.2=3 bak v0.2=1 no delete", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.2", + }, + { + "t2.wlt", + "0.2", + }, + { + "t3.wlt", + "0.2", + }, + { + "t3.wlt.bak", + "0.2", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + "t3.wlt.bak": struct{}{}, + }, + }, + { + name: "wlt v0.1=1 bak v0.1=1 wlt v0.2=2 bak v0.2=2 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + { + "t2.wlt", + "0.2", + }, + { + "t2.wlt.bak", + "0.2", + }, + { + "t3.wlt", + "0.2", + }, + { + "t3.wlt.bak", + "0.2", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t2.wlt.bak": struct{}{}, + "t3.wlt": struct{}{}, + "t3.wlt.bak": struct{}{}, + }, + }, + { + name: "wlt v0.1=1 bak v0.1=2 wlt v0.2=2 bak v0.2=1 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + { + "t2.wlt", + "0.2", + }, + { + "t2.wlt.bak", + "0.1", + }, + { + "t3.wlt", + "0.2", + }, + { + "t3.wlt.bak", + "0.2", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t2.wlt.bak": struct{}{}, + "t3.wlt": struct{}{}, + "t3.wlt.bak": struct{}{}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + // Initialize files + for _, f := range tc.initFiles { + w, err := NewWallet(f.wltName, Options{ + Seed: "s1", + Type: WalletTypeDeterministic, + }) + require.NoError(t, err) + w.SetVersion(f.version) + + require.NoError(t, Save(w, dir)) + } + + require.NoError(t, removeBackupFiles(dir)) + + // Get all remaining files + fs, err := ioutil.ReadDir(dir) + require.NoError(t, err) + require.Len(t, fs, len(tc.expectedRemainingFiles)) + for _, f := range fs { + _, ok := tc.expectedRemainingFiles[f.Name()] + require.True(t, ok) + } + }) + } +} + +func TestWalletValidate(t *testing.T) { + goodMetaUnencrypted := map[string]string{ + "filename": "foo.wlt", + "type": WalletTypeDeterministic, + "coin": string(CoinTypeSkycoin), + "encrypted": "false", + "seed": "fooseed", + "lastSeed": "foolastseed", + } + + goodMetaEncrypted := map[string]string{ + "filename": "foo.wlt", + "type": WalletTypeDeterministic, + "coin": string(CoinTypeSkycoin), + "encrypted": "true", + "cryptoType": "scrypt-chacha20poly1305", + "seed": "", + "lastSeed": "", + "secrets": "xacsdasdasdasd", + } + + copyMap := func(m map[string]string) map[string]string { + n := make(map[string]string, len(m)) + for k, v := range m { + n[k] = v + } + return n + } + + delField := func(m map[string]string, f string) map[string]string { + n := copyMap(m) + delete(n, f) + return n + } + + setField := func(m map[string]string, f, g string) map[string]string { + n := copyMap(m) + n[f] = g + return n + } + + cases := []struct { + name string + meta map[string]string + err error + }{ + { + name: "missing filename", + meta: delField(goodMetaUnencrypted, metaFilename), + err: errors.New("filename not set"), + }, + { + name: "wallet type missing", + meta: delField(goodMetaUnencrypted, metaType), + err: errors.New("type field not set"), + }, + { + name: "invalid wallet type", + meta: setField(goodMetaUnencrypted, metaType, "footype"), + err: ErrInvalidWalletType, + }, + { + name: "coin field missing", + meta: delField(goodMetaUnencrypted, metaCoin), + err: errors.New("coin field not set"), + }, + { + name: "encrypted field invalid", + meta: setField(goodMetaUnencrypted, metaEncrypted, "foo"), + err: errors.New("encrypted field is not a valid bool"), + }, + { + name: "unencrypted missing seed", + meta: delField(goodMetaUnencrypted, metaSeed), + err: errors.New("seed missing in unencrypted deterministic wallet"), + }, + { + name: "unencrypted missing last seed", + meta: delField(goodMetaUnencrypted, metaLastSeed), + err: errors.New("lastSeed missing in unencrypted deterministic wallet"), + }, + { + name: "crypto type missing", + meta: delField(goodMetaEncrypted, metaCryptoType), + err: errors.New("crypto type field not set"), + }, + { + name: "crypto type invalid", + meta: setField(goodMetaEncrypted, metaCryptoType, "foocryptotype"), + err: errors.New("unknown crypto type"), + }, + { + name: "secrets missing", + meta: delField(goodMetaEncrypted, metaSecrets), + err: errors.New("wallet is encrypted, but secrets field not set"), + }, + { + name: "secrets empty", + meta: setField(goodMetaEncrypted, metaSecrets, ""), + err: errors.New("wallet is encrypted, but secrets field not set"), + }, + { + name: "valid unencrypted", + meta: goodMetaUnencrypted, + }, + { + name: "valid encrypted", + meta: goodMetaEncrypted, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + w := &DeterministicWallet{ + Meta: tc.meta, + } + err := w.Validate() + + if tc.err == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.err, err, "%s != %s", tc.err, err) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallets.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallets.go new file mode 100644 index 00000000..83f32cfb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallets.go @@ -0,0 +1,126 @@ +package wallet + +import ( + "fmt" + "io/ioutil" + "path/filepath" + "strings" +) + +// Wallets wallets map +type Wallets map[string]Wallet + +// loadWallets Loads all wallets contained in wallet dir. If any regular file in wallet +// dir fails to load, loading is aborted and error returned. Only files with +// extension WalletExt are considered. +func loadWallets(dir string) (Wallets, error) { + entries, err := ioutil.ReadDir(dir) + if err != nil { + logger.WithError(err).WithField("dir", dir).Error("loadWallets: ioutil.ReadDir failed") + return nil, err + } + + wallets := Wallets{} + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, WalletExt) { + logger.WithField("filename", name).Info("loadWallets: skipping file") + continue + } + + fullpath := filepath.Join(dir, name) + w, err := Load(fullpath) + if err != nil { + logger.WithError(err).WithField("filename", fullpath).Error("loadWallets: loadWallet failed") + return nil, err + } + + logger.WithField("filename", fullpath).Info("loadWallets: loaded wallet") + + wallets[name] = w + } + } + + for name, w := range wallets { + if err := w.Validate(); err != nil { + logger.WithError(err).WithField("name", name).Error("loadWallets: wallet.Validate failed") + return nil, err + } + + if w.Coin() != CoinTypeSkycoin { + err := fmt.Errorf("LoadWallets only support skycoin wallets, %s is a %s wallet", name, w.Coin()) + logger.WithError(err).WithField("name", name).Error() + return nil, err + } + } + + return wallets, nil +} + +// add add walet to current wallet +func (wlts Wallets) add(w Wallet) error { + if _, dup := wlts[w.Filename()]; dup { + return ErrWalletNameConflict + } + + wlts[w.Filename()] = w + return nil +} + +// remove wallet of specific id +func (wlts Wallets) remove(id string) { + delete(wlts, id) +} + +// get returns wallet by wallet id +func (wlts Wallets) get(id string) Wallet { + return wlts[id] +} + +// set sets a wallet into the map +func (wlts Wallets) set(w Wallet) { + wlts[w.Filename()] = w.Clone() +} + +// containsDuplicate returns true if there is a duplicate wallet identified by +// the wallet's fingerprint. This is to detect duplicate generative wallets; +// wallets with no defined generation method do not have a concept of being +// a duplicate of another wallet +func (wlts Wallets) containsDuplicate() (string, string, bool) { + m := make(map[string]struct{}, len(wlts)) + for wltID, wlt := range wlts { + fp := wlt.Fingerprint() + if fp == "" { + continue + } + + if _, ok := m[fp]; ok { + return wltID, fp, true + } + + m[fp] = struct{}{} + } + + return "", "", false +} + +// containsEmpty returns true there is an empty wallet and the ID of that wallet if true. +// Does not apply to collection wallets +func (wlts Wallets) containsEmpty() (string, bool) { + for wltID, wlt := range wlts { + switch wlt.Type() { + case WalletTypeCollection: + continue + case WalletTypeDeterministic: + if wlt.EntriesLen() == 0 { + return wltID, true + } + case WalletTypeBip44: + if len(wlt.(*Bip44Wallet).ExternalEntries) == 0 { + return wltID, true + } + } + } + return "", false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/xpub_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/xpub_wallet.go new file mode 100644 index 00000000..32f048c0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/xpub_wallet.go @@ -0,0 +1,348 @@ +package wallet + +import ( + "errors" + "fmt" + "math" + "sort" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +// XPubWallet holds a single xpub (extended public key) and derives child public keys from it. +// Refer to the bip32 spec to understand xpub keys. +// XPub wallets can generate new addresses and receive coins, but can't spend coins +// because the private keys are not available. +type XPubWallet struct { + Meta + Entries Entries + xpub *bip32.PublicKey +} + +// newXPubWallet creates a XPubWallet +func newXPubWallet(meta Meta) (*XPubWallet, error) { + xpub, err := parseXPub(meta.XPub()) + if err != nil { + return nil, err + } + + return &XPubWallet{ + Meta: meta, + xpub: xpub, + }, nil +} + +func parseXPub(xp string) (*bip32.PublicKey, error) { + xpub, err := bip32.DeserializeEncodedPublicKey(xp) + if err != nil { + logger.WithError(err).Error("bip32.DeserializeEncodedPublicKey failed") + return nil, NewError(fmt.Errorf("invalid xpub key: %v", err)) + } + + return xpub, nil +} + +// PackSecrets does nothing because XPubWallet has no secrets +func (w *XPubWallet) PackSecrets(ss Secrets) { +} + +// UnpackSecrets does nothing because XPubWallet has no secrets +func (w *XPubWallet) UnpackSecrets(ss Secrets) error { + return nil +} + +// Clone clones the wallet a new wallet object +func (w *XPubWallet) Clone() Wallet { + xpub, err := parseXPub(w.Meta.XPub()) + if err != nil { + logger.WithError(err).Panic("Clone parseXPub failed") + } + + return &XPubWallet{ + Meta: w.Meta.clone(), + Entries: w.Entries.clone(), + xpub: xpub, + } +} + +// CopyFrom copies the src wallet to w +func (w *XPubWallet) CopyFrom(src Wallet) { + xpub, err := parseXPub(src.XPub()) + if err != nil { + logger.WithError(err).Panic("CopyFrom parseXPub failed") + } + w.xpub = xpub + w.Meta = src.(*XPubWallet).Meta.clone() + w.Entries = src.(*XPubWallet).Entries.clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *XPubWallet) CopyFromRef(src Wallet) { + xpub, err := parseXPub(src.XPub()) + if err != nil { + logger.WithError(err).Panic("CopyFromRef parseXPub failed") + } + + *w = *(src.(*XPubWallet)) + w.xpub = xpub +} + +// Erase wipes secret fields in wallet +func (w *XPubWallet) Erase() { + w.Meta.eraseSeeds() + w.Entries.erase() +} + +// ToReadable converts the wallet to its readable (serializable) format +func (w *XPubWallet) ToReadable() Readable { + return NewReadableXPubWallet(w) +} + +// Validate validates the wallet +func (w *XPubWallet) Validate() error { + return w.Meta.validate() +} + +// GetAddresses returns all addresses in wallet +func (w *XPubWallet) GetAddresses() []cipher.Addresser { + return w.Entries.getAddresses() +} + +// GetSkycoinAddresses returns all Skycoin addresses in wallet. The wallet's coin type must be Skycoin. +func (w *XPubWallet) GetSkycoinAddresses() ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("XPubWallet coin type is not skycoin") + } + + return w.Entries.getSkycoinAddresses(), nil +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *XPubWallet) GetEntries() Entries { + return w.Entries.clone() +} + +// EntriesLen returns the number of entries in the wallet +func (w *XPubWallet) EntriesLen() int { + return len(w.Entries) +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *XPubWallet) GetEntryAt(i int) Entry { + return w.Entries[i] +} + +// GetEntry returns entry of given address +func (w *XPubWallet) GetEntry(a cipher.Address) (Entry, bool) { + return w.Entries.get(a) +} + +// HasEntry returns true if the wallet has an Entry with a given cipher.Address. +func (w *XPubWallet) HasEntry(a cipher.Address) bool { + return w.Entries.has(a) +} + +// generateEntries generates up to `num` addresses +func (w *XPubWallet) generateEntries(num uint64, initialChildIdx uint32) (Entries, error) { + if w.Meta.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if num > math.MaxUint32 { + return nil, NewError(errors.New("XPubWallet.generateEntries num too large")) + } + + // Cap `num` in case it would exceed the maximum child index number + if math.MaxUint32-initialChildIdx < uint32(num) { + num = uint64(math.MaxUint32 - initialChildIdx) + } + + if num == 0 { + return nil, nil + } + + // Generate `num` secret keys from the external chain HDNode, skipping any children that + // are invalid (note that this has probability ~2^-128) + var pubkeys []*bip32.PublicKey + var addressIndices []uint32 + j := initialChildIdx + for i := uint32(0); i < uint32(num); i++ { + k, err := w.xpub.NewPublicChildKey(j) + + var addErr error + j, addErr = mathutil.AddUint32(j, 1) + if addErr != nil { + logger.Critical().WithError(addErr).WithFields(logrus.Fields{ + "num": num, + "initialChildIdx": initialChildIdx, + "childIdx": j, + "i": i, + }).Error("childIdx can't be incremented any further") + return nil, errors.New("childIdx can't be incremented any further") + } + + if err != nil { + if bip32.IsImpossibleChildError(err) { + logger.Critical().WithError(err).WithField("childIdx", j).Error("ImpossibleChild for xpub child element") + continue + } else { + logger.Critical().WithError(err).WithField("childIdx", j).Error("NewPublicChildKey failed unexpectedly") + return nil, err + } + } + + pubkeys = append(pubkeys, k) + addressIndices = append(addressIndices, j-1) + } + + entries := make(Entries, len(pubkeys)) + makeAddress := w.Meta.AddressConstructor() + for i, xp := range pubkeys { + pk := cipher.MustNewPubKey(xp.Key) + entries[i] = Entry{ + Address: makeAddress(pk), + Public: pk, + ChildNumber: addressIndices[i], + } + } + + return entries, nil +} + +// GenerateAddresses generates addresses for the external chain, and appends them to the wallet's entries array +func (w *XPubWallet) GenerateAddresses(num uint64) ([]cipher.Addresser, error) { + entries, err := w.generateEntries(num, nextChildIdx(w.Entries)) + if err != nil { + return nil, err + } + + w.Entries = append(w.Entries, entries...) + + return entries.getAddresses(), nil +} + +// GenerateSkycoinAddresses generates Skycoin addresses for the external chain, and appends them to the wallet's entries array. +// If the wallet's coin type is not Skycoin, returns an error +func (w *XPubWallet) GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("GenerateSkycoinAddresses called for non-skycoin wallet") + } + + entries, err := w.generateEntries(num, nextChildIdx(w.Entries)) + if err != nil { + return nil, err + } + + w.Entries = append(w.Entries, entries...) + + return entries.getSkycoinAddresses(), nil +} + +// ScanAddresses scans ahead N addresses, +// truncating up to the highest address with any transaction history. +func (w *XPubWallet) ScanAddresses(scanN uint64, tf TransactionsFinder) error { + if w.Meta.IsEncrypted() { + return ErrWalletEncrypted + } + + if scanN == 0 { + return nil + } + + w2 := w.Clone().(*XPubWallet) + + entries, err := scanAddressesBip32(func(num uint64, childIdx uint32) (Entries, error) { + return w2.generateEntries(num, childIdx) + }, scanN, tf, nextChildIdx(w2.Entries)) + if err != nil { + return err + } + + w2.Entries = append(w2.Entries, entries...) + + *w = *w2 + + return nil +} + +// Fingerprint returns a unique ID fingerprint for this wallet, using the first +// child address of the xpub key +func (w *XPubWallet) Fingerprint() string { + // Note: the xpub key is not used as the fingerprint, because it is + // partially sensitive data + addr := "" + if len(w.Entries) == 0 { + if !w.IsEncrypted() { + entries, err := w.generateEntries(1, 0) + if err != nil { + logger.WithError(err).Panic("Fingerprint failed to generate initial entry for empty wallet") + } + addr = entries[0].Address.String() + } + } else { + addr = w.Entries[0].Address.String() + } + + return fmt.Sprintf("%s-%s", w.Type(), addr) +} + +// ReadableXPubWallet used for [de]serialization of an xpub wallet +type ReadableXPubWallet struct { + Meta `json:"meta"` + ReadableEntries `json:"entries"` +} + +// LoadReadableXPubWallet loads an xpub wallet from disk +func LoadReadableXPubWallet(wltFile string) (*ReadableXPubWallet, error) { + var rw ReadableXPubWallet + if err := file.LoadJSON(wltFile, &rw); err != nil { + return nil, err + } + if rw.Type() != WalletTypeXPub { + return nil, ErrInvalidWalletType + } + return &rw, nil +} + +// NewReadableXPubWallet creates readable wallet +func NewReadableXPubWallet(w *XPubWallet) *ReadableXPubWallet { + return &ReadableXPubWallet{ + Meta: w.Meta.clone(), + ReadableEntries: newReadableEntries(w.Entries, w.Meta.Coin(), w.Meta.Type()), + } +} + +// ToWallet convert readable wallet to Wallet +func (rw *ReadableXPubWallet) ToWallet() (Wallet, error) { + w := &XPubWallet{ + Meta: rw.Meta.clone(), + } + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + logger.WithError(err).Error("ReadableXPubWallet.ToWallet Validate failed") + return nil, err + } + + ets, err := rw.ReadableEntries.toWalletEntries(w.Meta.Coin(), w.Meta.Type(), w.Meta.IsEncrypted()) + if err != nil { + logger.WithError(err).Error("ReadableXPubWallet.ToWallet toWalletEntries failed") + return nil, err + } + + w.Entries = ets + + // Sort childNumber low to high + sort.Slice(w.Entries, func(i, j int) bool { + return w.Entries[i].ChildNumber < w.Entries[j].ChildNumber + }) + + w.Entries = ets + + return w, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/template/coin.template b/vendor/github.com/SkycoinProject/skycoin/template/coin.template new file mode 100755 index 00000000..aa8c8e68 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/template/coin.template @@ -0,0 +1,124 @@ +/* +skycoin daemon +*/ +package main + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +import ( + "flag" + _ "net/http/pprof" + "os" + + "github.com/SkycoinProject/skycoin/src/fiber" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/skycoin" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + // Version of the node. Can be set by -ldflags + Version = "0.27.0" + // Commit ID. Can be set by -ldflags + Commit = "" + // Branch name. Can be set by -ldflags + Branch = "" + // ConfigMode (possible values are "", "STANDALONE_CLIENT"). + // This is used to change the default configuration. + // Can be set by -ldflags + ConfigMode = "" + + logger = logging.MustGetLogger("main") + + // CoinName name of coin + CoinName = "{{.CoinName}}" + + // GenesisSignatureStr hex string of genesis signature + GenesisSignatureStr = "{{.GenesisSignatureStr}}" + // GenesisAddressStr genesis address string + GenesisAddressStr = "{{.GenesisAddressStr}}" + // BlockchainPubkeyStr pubic key string + BlockchainPubkeyStr = "{{.BlockchainPubkeyStr}}" + // BlockchainSeckeyStr empty private key string + BlockchainSeckeyStr = "{{.BlockchainSeckeyStr}}" + + // GenesisTimestamp genesis block create unix time + GenesisTimestamp uint64 = {{.GenesisTimestamp}} + // GenesisCoinVolume represents the coin capacity + GenesisCoinVolume uint64 = {{.GenesisCoinVolume}} + + // DefaultConnections the default trust node addresses + DefaultConnections = []string{ + {{- range $index, $address := .DefaultConnections}} + "{{$address -}}", + {{- end}} + } + + nodeConfig = skycoin.NewNodeConfig(ConfigMode, fiber.NodeConfig{ + CoinName: CoinName, + GenesisSignatureStr: GenesisSignatureStr, + GenesisAddressStr: GenesisAddressStr, + GenesisCoinVolume: GenesisCoinVolume, + GenesisTimestamp: GenesisTimestamp, + BlockchainPubkeyStr: BlockchainPubkeyStr, + BlockchainSeckeyStr: BlockchainSeckeyStr, + DefaultConnections: DefaultConnections, + PeerListURL: "{{.PeerListURL}}", + Port: {{.Port}}, + WebInterfacePort: {{.WebInterfacePort}}, + DataDirectory: "{{.DataDirectory}}", + + UnconfirmedBurnFactor: {{.UnconfirmedBurnFactor}}, + UnconfirmedMaxTransactionSize: {{.UnconfirmedMaxTransactionSize}}, + UnconfirmedMaxDropletPrecision: {{.UnconfirmedMaxDropletPrecision}}, + CreateBlockBurnFactor: {{.CreateBlockBurnFactor}}, + CreateBlockMaxTransactionSize: {{.CreateBlockMaxTransactionSize}}, + CreateBlockMaxDropletPrecision: {{.CreateBlockMaxDropletPrecision}}, + MaxBlockTransactionsSize: {{.MaxBlockTransactionsSize}}, + + DisplayName: "{{.DisplayName}}", + Ticker: "{{.Ticker}}", + CoinHoursName: "{{.CoinHoursName}}", + CoinHoursNameSingular: "{{.CoinHoursNameSingular}}", + CoinHoursTicker: "{{.CoinHoursTicker}}", + ExplorerURL: "{{.ExplorerURL}}", + VersionURL: "{{.VersionURL}}", + Bip44Coin: {{.Bip44Coin}}, + }) + + parseFlags = true +) + +func init() { + nodeConfig.RegisterFlags() +} + +func main() { + if parseFlags { + flag.Parse() + } + + // create a new fiber coin instance + coin := skycoin.NewCoin(skycoin.Config{ + Node: nodeConfig, + Build: readable.BuildInfo{ + Version: Version, + Commit: Commit, + Branch: Branch, + }, + }, logger) + + // parse config values + if err := coin.ParseConfig(); err != nil { + logger.Error(err) + os.Exit(1) + } + + // run fiber coin node + if err := coin.Run(); err != nil { + os.Exit(1) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/template/coin_test.template b/vendor/github.com/SkycoinProject/skycoin/template/coin_test.template new file mode 100644 index 00000000..7f3a2d17 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/template/coin_test.template @@ -0,0 +1,20 @@ +// +build testrunmain + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +// This file allows us to run the entire program with test coverage enabled, useful for integration tests +package main + +import "testing" + +func init() { + // Disable flag.Parse because go's test runner calls it instead + parseFlags = false +} + +func TestRunMain(t *testing.T) { + main() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/template/params.template b/vendor/github.com/SkycoinProject/skycoin/template/params.template new file mode 100644 index 00000000..2e843e98 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/template/params.template @@ -0,0 +1,31 @@ +package params + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +var ( + // MainNetDistribution Skycoin mainnet coin distribution parameters + MainNetDistribution = Distribution{ + MaxCoinSupply: {{.MaxCoinSupply}}, + InitialUnlockedCount: {{.InitialUnlockedCount}}, + UnlockAddressRate: {{.UnlockAddressRate}}, + UnlockTimeInterval: {{.UnlockTimeInterval}}, + Addresses: []string{ + {{- range $index, $address := .DistributionAddresses}} + "{{$address -}}", + {{- end}} + }, + } + + // UserVerifyTxn transaction verification parameters for user-created transactions + UserVerifyTxn = VerifyTxn{ + // BurnFactor can be overriden with `USER_BURN_FACTOR` env var + BurnFactor: {{.UserBurnFactor}}, + // MaxTransactionSize can be overriden with `USER_MAX_TXN_SIZE` env var + MaxTransactionSize: {{.UserMaxTransactionSize}}, // in bytes + // MaxDropletPrecision can be overriden with `USER_MAX_DECIMALS` env var + MaxDropletPrecision: {{.UserMaxDropletPrecision}}, + } +) diff --git a/vendor/github.com/beorn7/perks/quantile/exampledata.txt b/vendor/github.com/beorn7/perks/quantile/exampledata.txt deleted file mode 100644 index 1602287d..00000000 --- a/vendor/github.com/beorn7/perks/quantile/exampledata.txt +++ /dev/null @@ -1,2388 +0,0 @@ -8 -5 -26 -12 -5 -235 -13 -6 -28 -30 -3 -3 -3 -3 -5 -2 -33 -7 -2 -4 -7 -12 -14 -5 -8 -3 -10 -4 -5 -3 -6 -6 -209 -20 -3 -10 -14 -3 -4 -6 -8 -5 -11 -7 -3 -2 -3 -3 -212 -5 -222 -4 -10 -10 -5 -6 -3 -8 -3 -10 -254 -220 -2 -3 -5 -24 -5 -4 -222 -7 -3 -3 -223 -8 -15 -12 -14 -14 -3 -2 -2 -3 -13 -3 -11 -4 -4 -6 -5 -7 -13 -5 -3 -5 -2 -5 -3 -5 -2 -7 -15 -17 -14 -3 -6 -6 -3 -17 -5 -4 -7 -6 -4 -4 -8 -6 -8 -3 -9 -3 -6 -3 -4 -5 -3 -3 -660 -4 -6 -10 -3 -6 -3 -2 -5 -13 -2 -4 -4 -10 -4 -8 -4 -3 -7 -9 -9 -3 -10 -37 -3 -13 -4 -12 -3 -6 -10 -8 -5 -21 -2 -3 -8 -3 -2 -3 -3 -4 -12 -2 -4 -8 -8 -4 -3 -2 -20 -1 -6 -32 -2 -11 -6 -18 -3 -8 -11 -3 -212 -3 -4 -2 -6 -7 -12 -11 -3 -2 -16 -10 -6 -4 -6 -3 -2 -7 -3 -2 -2 -2 -2 -5 -6 -4 -3 -10 -3 -4 -6 -5 -3 -4 -4 -5 -6 -4 -3 -4 -4 -5 -7 -5 -5 -3 -2 -7 -2 -4 -12 -4 -5 -6 -2 -4 -4 -8 -4 -15 -13 -7 -16 -5 -3 -23 -5 -5 -7 -3 -2 -9 -8 -7 -5 -8 -11 -4 -10 -76 -4 -47 -4 -3 -2 -7 -4 -2 -3 -37 -10 -4 -2 -20 -5 -4 -4 -10 -10 -4 -3 -7 -23 -240 -7 -13 -5 -5 -3 -3 -2 -5 -4 -2 -8 -7 -19 -2 -23 -8 -7 -2 -5 -3 -8 -3 -8 -13 -5 -5 -5 -2 -3 -23 -4 -9 -8 -4 -3 -3 -5 -220 -2 -3 -4 -6 -14 -3 -53 -6 -2 -5 -18 -6 -3 -219 -6 -5 -2 -5 -3 -6 -5 -15 -4 -3 -17 -3 -2 -4 -7 -2 -3 -3 -4 -4 -3 -2 -664 -6 -3 -23 -5 -5 -16 -5 -8 -2 -4 -2 -24 -12 -3 -2 -3 -5 -8 -3 -5 -4 -3 -14 -3 -5 -8 -2 -3 -7 -9 -4 -2 -3 -6 -8 -4 -3 -4 -6 -5 -3 -3 -6 -3 -19 -4 -4 -6 -3 -6 -3 -5 -22 -5 -4 -4 -3 -8 -11 -4 -9 -7 -6 -13 -4 -4 -4 -6 -17 -9 -3 -3 -3 -4 -3 -221 -5 -11 -3 -4 -2 -12 -6 -3 -5 -7 -5 -7 -4 -9 -7 -14 -37 -19 -217 -16 -3 -5 -2 -2 -7 -19 -7 -6 -7 -4 -24 -5 -11 -4 -7 -7 -9 -13 -3 -4 -3 -6 -28 -4 -4 -5 -5 -2 -5 -6 -4 -4 -6 -10 -5 -4 -3 -2 -3 -3 -6 -5 -5 -4 -3 -2 -3 -7 -4 -6 -18 -16 -8 -16 -4 -5 -8 -6 -9 -13 -1545 -6 -215 -6 -5 -6 -3 -45 -31 -5 -2 -2 -4 -3 -3 -2 -5 -4 -3 -5 -7 -7 -4 -5 -8 -5 -4 -749 -2 -31 -9 -11 -2 -11 -5 -4 -4 -7 -9 -11 -4 -5 -4 -7 -3 -4 -6 -2 -15 -3 -4 -3 -4 -3 -5 -2 -13 -5 -5 -3 -3 -23 -4 -4 -5 -7 -4 -13 -2 -4 -3 -4 -2 -6 -2 -7 -3 -5 -5 -3 -29 -5 -4 -4 -3 -10 -2 -3 -79 -16 -6 -6 -7 -7 -3 -5 -5 -7 -4 -3 -7 -9 -5 -6 -5 -9 -6 -3 -6 -4 -17 -2 -10 -9 -3 -6 -2 -3 -21 -22 -5 -11 -4 -2 -17 -2 -224 -2 -14 -3 -4 -4 -2 -4 -4 -4 -4 -5 -3 -4 -4 -10 -2 -6 -3 -3 -5 -7 -2 -7 -5 -6 -3 -218 -2 -2 -5 -2 -6 -3 -5 -222 -14 -6 -33 -3 -2 -5 -3 -3 -3 -9 -5 -3 -3 -2 -7 -4 -3 -4 -3 -5 -6 -5 -26 -4 -13 -9 -7 -3 -221 -3 -3 -4 -4 -4 -4 -2 -18 -5 -3 -7 -9 -6 -8 -3 -10 -3 -11 -9 -5 -4 -17 -5 -5 -6 -6 -3 -2 -4 -12 -17 -6 -7 -218 -4 -2 -4 -10 -3 -5 -15 -3 -9 -4 -3 -3 -6 -29 -3 -3 -4 -5 -5 -3 -8 -5 -6 -6 -7 -5 -3 -5 -3 -29 -2 -31 -5 -15 -24 -16 -5 -207 -4 -3 -3 -2 -15 -4 -4 -13 -5 -5 -4 -6 -10 -2 -7 -8 -4 -6 -20 -5 -3 -4 -3 -12 -12 -5 -17 -7 -3 -3 -3 -6 -10 -3 -5 -25 -80 -4 -9 -3 -2 -11 -3 -3 -2 -3 -8 -7 -5 -5 -19 -5 -3 -3 -12 -11 -2 -6 -5 -5 -5 -3 -3 -3 -4 -209 -14 -3 -2 -5 -19 -4 -4 -3 -4 -14 -5 -6 -4 -13 -9 -7 -4 -7 -10 -2 -9 -5 -7 -2 -8 -4 -6 -5 -5 -222 -8 -7 -12 -5 -216 -3 -4 -4 -6 -3 -14 -8 -7 -13 -4 -3 -3 -3 -3 -17 -5 -4 -3 -33 -6 -6 -33 -7 -5 -3 -8 -7 -5 -2 -9 -4 -2 -233 -24 -7 -4 -8 -10 -3 -4 -15 -2 -16 -3 -3 -13 -12 -7 -5 -4 -207 -4 -2 -4 -27 -15 -2 -5 -2 -25 -6 -5 -5 -6 -13 -6 -18 -6 -4 -12 -225 -10 -7 -5 -2 -2 -11 -4 -14 -21 -8 -10 -3 -5 -4 -232 -2 -5 -5 -3 -7 -17 -11 -6 -6 -23 -4 -6 -3 -5 -4 -2 -17 -3 -6 -5 -8 -3 -2 -2 -14 -9 -4 -4 -2 -5 -5 -3 -7 -6 -12 -6 -10 -3 -6 -2 -2 -19 -5 -4 -4 -9 -2 -4 -13 -3 -5 -6 -3 -6 -5 -4 -9 -6 -3 -5 -7 -3 -6 -6 -4 -3 -10 -6 -3 -221 -3 -5 -3 -6 -4 -8 -5 -3 -6 -4 -4 -2 -54 -5 -6 -11 -3 -3 -4 -4 -4 -3 -7 -3 -11 -11 -7 -10 -6 -13 -223 -213 -15 -231 -7 -3 -7 -228 -2 -3 -4 -4 -5 -6 -7 -4 -13 -3 -4 -5 -3 -6 -4 -6 -7 -2 -4 -3 -4 -3 -3 -6 -3 -7 -3 -5 -18 -5 -6 -8 -10 -3 -3 -3 -2 -4 -2 -4 -4 -5 -6 -6 -4 -10 -13 -3 -12 -5 -12 -16 -8 -4 -19 -11 -2 -4 -5 -6 -8 -5 -6 -4 -18 -10 -4 -2 -216 -6 -6 -6 -2 -4 -12 -8 -3 -11 -5 -6 -14 -5 -3 -13 -4 -5 -4 -5 -3 -28 -6 -3 -7 -219 -3 -9 -7 -3 -10 -6 -3 -4 -19 -5 -7 -11 -6 -15 -19 -4 -13 -11 -3 -7 -5 -10 -2 -8 -11 -2 -6 -4 -6 -24 -6 -3 -3 -3 -3 -6 -18 -4 -11 -4 -2 -5 -10 -8 -3 -9 -5 -3 -4 -5 -6 -2 -5 -7 -4 -4 -14 -6 -4 -4 -5 -5 -7 -2 -4 -3 -7 -3 -3 -6 -4 -5 -4 -4 -4 -3 -3 -3 -3 -8 -14 -2 -3 -5 -3 -2 -4 -5 -3 -7 -3 -3 -18 -3 -4 -4 -5 -7 -3 -3 -3 -13 -5 -4 -8 -211 -5 -5 -3 -5 -2 -5 -4 -2 -655 -6 -3 -5 -11 -2 -5 -3 -12 -9 -15 -11 -5 -12 -217 -2 -6 -17 -3 -3 -207 -5 -5 -4 -5 -9 -3 -2 -8 -5 -4 -3 -2 -5 -12 -4 -14 -5 -4 -2 -13 -5 -8 -4 -225 -4 -3 -4 -5 -4 -3 -3 -6 -23 -9 -2 -6 -7 -233 -4 -4 -6 -18 -3 -4 -6 -3 -4 -4 -2 -3 -7 -4 -13 -227 -4 -3 -5 -4 -2 -12 -9 -17 -3 -7 -14 -6 -4 -5 -21 -4 -8 -9 -2 -9 -25 -16 -3 -6 -4 -7 -8 -5 -2 -3 -5 -4 -3 -3 -5 -3 -3 -3 -2 -3 -19 -2 -4 -3 -4 -2 -3 -4 -4 -2 -4 -3 -3 -3 -2 -6 -3 -17 -5 -6 -4 -3 -13 -5 -3 -3 -3 -4 -9 -4 -2 -14 -12 -4 -5 -24 -4 -3 -37 -12 -11 -21 -3 -4 -3 -13 -4 -2 -3 -15 -4 -11 -4 -4 -3 -8 -3 -4 -4 -12 -8 -5 -3 -3 -4 -2 -220 -3 -5 -223 -3 -3 -3 -10 -3 -15 -4 -241 -9 -7 -3 -6 -6 -23 -4 -13 -7 -3 -4 -7 -4 -9 -3 -3 -4 -10 -5 -5 -1 -5 -24 -2 -4 -5 -5 -6 -14 -3 -8 -2 -3 -5 -13 -13 -3 -5 -2 -3 -15 -3 -4 -2 -10 -4 -4 -4 -5 -5 -3 -5 -3 -4 -7 -4 -27 -3 -6 -4 -15 -3 -5 -6 -6 -5 -4 -8 -3 -9 -2 -6 -3 -4 -3 -7 -4 -18 -3 -11 -3 -3 -8 -9 -7 -24 -3 -219 -7 -10 -4 -5 -9 -12 -2 -5 -4 -4 -4 -3 -3 -19 -5 -8 -16 -8 -6 -22 -3 -23 -3 -242 -9 -4 -3 -3 -5 -7 -3 -3 -5 -8 -3 -7 -5 -14 -8 -10 -3 -4 -3 -7 -4 -6 -7 -4 -10 -4 -3 -11 -3 -7 -10 -3 -13 -6 -8 -12 -10 -5 -7 -9 -3 -4 -7 -7 -10 -8 -30 -9 -19 -4 -3 -19 -15 -4 -13 -3 -215 -223 -4 -7 -4 -8 -17 -16 -3 -7 -6 -5 -5 -4 -12 -3 -7 -4 -4 -13 -4 -5 -2 -5 -6 -5 -6 -6 -7 -10 -18 -23 -9 -3 -3 -6 -5 -2 -4 -2 -7 -3 -3 -2 -5 -5 -14 -10 -224 -6 -3 -4 -3 -7 -5 -9 -3 -6 -4 -2 -5 -11 -4 -3 -3 -2 -8 -4 -7 -4 -10 -7 -3 -3 -18 -18 -17 -3 -3 -3 -4 -5 -3 -3 -4 -12 -7 -3 -11 -13 -5 -4 -7 -13 -5 -4 -11 -3 -12 -3 -6 -4 -4 -21 -4 -6 -9 -5 -3 -10 -8 -4 -6 -4 -4 -6 -5 -4 -8 -6 -4 -6 -4 -4 -5 -9 -6 -3 -4 -2 -9 -3 -18 -2 -4 -3 -13 -3 -6 -6 -8 -7 -9 -3 -2 -16 -3 -4 -6 -3 -2 -33 -22 -14 -4 -9 -12 -4 -5 -6 -3 -23 -9 -4 -3 -5 -5 -3 -4 -5 -3 -5 -3 -10 -4 -5 -5 -8 -4 -4 -6 -8 -5 -4 -3 -4 -6 -3 -3 -3 -5 -9 -12 -6 -5 -9 -3 -5 -3 -2 -2 -2 -18 -3 -2 -21 -2 -5 -4 -6 -4 -5 -10 -3 -9 -3 -2 -10 -7 -3 -6 -6 -4 -4 -8 -12 -7 -3 -7 -3 -3 -9 -3 -4 -5 -4 -4 -5 -5 -10 -15 -4 -4 -14 -6 -227 -3 -14 -5 -216 -22 -5 -4 -2 -2 -6 -3 -4 -2 -9 -9 -4 -3 -28 -13 -11 -4 -5 -3 -3 -2 -3 -3 -5 -3 -4 -3 -5 -23 -26 -3 -4 -5 -6 -4 -6 -3 -5 -5 -3 -4 -3 -2 -2 -2 -7 -14 -3 -6 -7 -17 -2 -2 -15 -14 -16 -4 -6 -7 -13 -6 -4 -5 -6 -16 -3 -3 -28 -3 -6 -15 -3 -9 -2 -4 -6 -3 -3 -22 -4 -12 -6 -7 -2 -5 -4 -10 -3 -16 -6 -9 -2 -5 -12 -7 -5 -5 -5 -5 -2 -11 -9 -17 -4 -3 -11 -7 -3 -5 -15 -4 -3 -4 -211 -8 -7 -5 -4 -7 -6 -7 -6 -3 -6 -5 -6 -5 -3 -4 -4 -26 -4 -6 -10 -4 -4 -3 -2 -3 -3 -4 -5 -9 -3 -9 -4 -4 -5 -5 -8 -2 -4 -2 -3 -8 -4 -11 -19 -5 -8 -6 -3 -5 -6 -12 -3 -2 -4 -16 -12 -3 -4 -4 -8 -6 -5 -6 -6 -219 -8 -222 -6 -16 -3 -13 -19 -5 -4 -3 -11 -6 -10 -4 -7 -7 -12 -5 -3 -3 -5 -6 -10 -3 -8 -2 -5 -4 -7 -2 -4 -4 -2 -12 -9 -6 -4 -2 -40 -2 -4 -10 -4 -223 -4 -2 -20 -6 -7 -24 -5 -4 -5 -2 -20 -16 -6 -5 -13 -2 -3 -3 -19 -3 -2 -4 -5 -6 -7 -11 -12 -5 -6 -7 -7 -3 -5 -3 -5 -3 -14 -3 -4 -4 -2 -11 -1 -7 -3 -9 -6 -11 -12 -5 -8 -6 -221 -4 -2 -12 -4 -3 -15 -4 -5 -226 -7 -218 -7 -5 -4 -5 -18 -4 -5 -9 -4 -4 -2 -9 -18 -18 -9 -5 -6 -6 -3 -3 -7 -3 -5 -4 -4 -4 -12 -3 -6 -31 -5 -4 -7 -3 -6 -5 -6 -5 -11 -2 -2 -11 -11 -6 -7 -5 -8 -7 -10 -5 -23 -7 -4 -3 -5 -34 -2 -5 -23 -7 -3 -6 -8 -4 -4 -4 -2 -5 -3 -8 -5 -4 -8 -25 -2 -3 -17 -8 -3 -4 -8 -7 -3 -15 -6 -5 -7 -21 -9 -5 -6 -6 -5 -3 -2 -3 -10 -3 -6 -3 -14 -7 -4 -4 -8 -7 -8 -2 -6 -12 -4 -213 -6 -5 -21 -8 -2 -5 -23 -3 -11 -2 -3 -6 -25 -2 -3 -6 -7 -6 -6 -4 -4 -6 -3 -17 -9 -7 -6 -4 -3 -10 -7 -2 -3 -3 -3 -11 -8 -3 -7 -6 -4 -14 -36 -3 -4 -3 -3 -22 -13 -21 -4 -2 -7 -4 -4 -17 -15 -3 -7 -11 -2 -4 -7 -6 -209 -6 -3 -2 -2 -24 -4 -9 -4 -3 -3 -3 -29 -2 -2 -4 -3 -3 -5 -4 -6 -3 -3 -2 -4 diff --git a/vendor/github.com/blang/semver/.travis.yml b/vendor/github.com/blang/semver/.travis.yml deleted file mode 100644 index 7319bdea..00000000 --- a/vendor/github.com/blang/semver/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: go -matrix: - include: - - go: 1.4.x - - go: 1.5.x - - go: 1.6.x - - go: 1.7.x - - go: 1.8.x - - go: 1.9.x - - go: 1.10.x - - go: 1.11.x - - go: tip - allow_failures: - - go: tip -install: -- go get golang.org/x/tools/cmd/cover -- go get github.com/mattn/goveralls -script: -- echo "Test and track coverage" ; $HOME/gopath/bin/goveralls -package "." -service=travis-ci - -repotoken=$COVERALLS_TOKEN -- echo "Build examples" ; cd examples && go build -- echo "Check if gofmt'd" ; diff -u <(echo -n) <(gofmt -d -s .) -env: - global: - secure: HroGEAUQpVq9zX1b1VIkraLiywhGbzvNnTZq2TMxgK7JHP8xqNplAeF1izrR2i4QLL9nsY+9WtYss4QuPvEtZcVHUobw6XnL6radF7jS1LgfYZ9Y7oF+zogZ2I5QUMRLGA7rcxQ05s7mKq3XZQfeqaNts4bms/eZRefWuaFZbkw= diff --git a/vendor/github.com/blang/semver/README.md b/vendor/github.com/blang/semver/README.md deleted file mode 100644 index e05f9865..00000000 --- a/vendor/github.com/blang/semver/README.md +++ /dev/null @@ -1,194 +0,0 @@ -semver for golang [![Build Status](https://travis-ci.org/blang/semver.svg?branch=master)](https://travis-ci.org/blang/semver) [![GoDoc](https://godoc.org/github.com/blang/semver?status.svg)](https://godoc.org/github.com/blang/semver) [![Coverage Status](https://img.shields.io/coveralls/blang/semver.svg)](https://coveralls.io/r/blang/semver?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/blang/semver)](https://goreportcard.com/report/github.com/blang/semver) -====== - -semver is a [Semantic Versioning](http://semver.org/) library written in golang. It fully covers spec version `2.0.0`. - -Usage ------ -```bash -$ go get github.com/blang/semver -``` -Note: Always vendor your dependencies or fix on a specific version tag. - -```go -import github.com/blang/semver -v1, err := semver.Make("1.0.0-beta") -v2, err := semver.Make("2.0.0-beta") -v1.Compare(v2) -``` - -Also check the [GoDocs](http://godoc.org/github.com/blang/semver). - -Why should I use this lib? ------ - -- Fully spec compatible -- No reflection -- No regex -- Fully tested (Coverage >99%) -- Readable parsing/validation errors -- Fast (See [Benchmarks](#benchmarks)) -- Only Stdlib -- Uses values instead of pointers -- Many features, see below - - -Features ------ - -- Parsing and validation at all levels -- Comparator-like comparisons -- Compare Helper Methods -- InPlace manipulation -- Ranges `>=1.0.0 <2.0.0 || >=3.0.0 !3.0.1-beta.1` -- Wildcards `>=1.x`, `<=2.5.x` -- Sortable (implements sort.Interface) -- database/sql compatible (sql.Scanner/Valuer) -- encoding/json compatible (json.Marshaler/Unmarshaler) - -Ranges ------- - -A `Range` is a set of conditions which specify which versions satisfy the range. - -A condition is composed of an operator and a version. The supported operators are: - -- `<1.0.0` Less than `1.0.0` -- `<=1.0.0` Less than or equal to `1.0.0` -- `>1.0.0` Greater than `1.0.0` -- `>=1.0.0` Greater than or equal to `1.0.0` -- `1.0.0`, `=1.0.0`, `==1.0.0` Equal to `1.0.0` -- `!1.0.0`, `!=1.0.0` Not equal to `1.0.0`. Excludes version `1.0.0`. - -Note that spaces between the operator and the version will be gracefully tolerated. - -A `Range` can link multiple `Ranges` separated by space: - -Ranges can be linked by logical AND: - - - `>1.0.0 <2.0.0` would match between both ranges, so `1.1.1` and `1.8.7` but not `1.0.0` or `2.0.0` - - `>1.0.0 <3.0.0 !2.0.3-beta.2` would match every version between `1.0.0` and `3.0.0` except `2.0.3-beta.2` - -Ranges can also be linked by logical OR: - - - `<2.0.0 || >=3.0.0` would match `1.x.x` and `3.x.x` but not `2.x.x` - -AND has a higher precedence than OR. It's not possible to use brackets. - -Ranges can be combined by both AND and OR - - - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1` - -Range usage: - -``` -v, err := semver.Parse("1.2.3") -expectedRange, err := semver.ParseRange(">1.0.0 <2.0.0 || >=3.0.0") -if expectedRange(v) { - //valid -} - -``` - -Example ------ - -Have a look at full examples in [examples/main.go](examples/main.go) - -```go -import github.com/blang/semver - -v, err := semver.Make("0.0.1-alpha.preview+123.github") -fmt.Printf("Major: %d\n", v.Major) -fmt.Printf("Minor: %d\n", v.Minor) -fmt.Printf("Patch: %d\n", v.Patch) -fmt.Printf("Pre: %s\n", v.Pre) -fmt.Printf("Build: %s\n", v.Build) - -// Prerelease versions array -if len(v.Pre) > 0 { - fmt.Println("Prerelease versions:") - for i, pre := range v.Pre { - fmt.Printf("%d: %q\n", i, pre) - } -} - -// Build meta data array -if len(v.Build) > 0 { - fmt.Println("Build meta data:") - for i, build := range v.Build { - fmt.Printf("%d: %q\n", i, build) - } -} - -v001, err := semver.Make("0.0.1") -// Compare using helpers: v.GT(v2), v.LT, v.GTE, v.LTE -v001.GT(v) == true -v.LT(v001) == true -v.GTE(v) == true -v.LTE(v) == true - -// Or use v.Compare(v2) for comparisons (-1, 0, 1): -v001.Compare(v) == 1 -v.Compare(v001) == -1 -v.Compare(v) == 0 - -// Manipulate Version in place: -v.Pre[0], err = semver.NewPRVersion("beta") -if err != nil { - fmt.Printf("Error parsing pre release version: %q", err) -} - -fmt.Println("\nValidate versions:") -v.Build[0] = "?" - -err = v.Validate() -if err != nil { - fmt.Printf("Validation failed: %s\n", err) -} -``` - - -Benchmarks ------ - - BenchmarkParseSimple-4 5000000 390 ns/op 48 B/op 1 allocs/op - BenchmarkParseComplex-4 1000000 1813 ns/op 256 B/op 7 allocs/op - BenchmarkParseAverage-4 1000000 1171 ns/op 163 B/op 4 allocs/op - BenchmarkStringSimple-4 20000000 119 ns/op 16 B/op 1 allocs/op - BenchmarkStringLarger-4 10000000 206 ns/op 32 B/op 2 allocs/op - BenchmarkStringComplex-4 5000000 324 ns/op 80 B/op 3 allocs/op - BenchmarkStringAverage-4 5000000 273 ns/op 53 B/op 2 allocs/op - BenchmarkValidateSimple-4 200000000 9.33 ns/op 0 B/op 0 allocs/op - BenchmarkValidateComplex-4 3000000 469 ns/op 0 B/op 0 allocs/op - BenchmarkValidateAverage-4 5000000 256 ns/op 0 B/op 0 allocs/op - BenchmarkCompareSimple-4 100000000 11.8 ns/op 0 B/op 0 allocs/op - BenchmarkCompareComplex-4 50000000 30.8 ns/op 0 B/op 0 allocs/op - BenchmarkCompareAverage-4 30000000 41.5 ns/op 0 B/op 0 allocs/op - BenchmarkSort-4 3000000 419 ns/op 256 B/op 2 allocs/op - BenchmarkRangeParseSimple-4 2000000 850 ns/op 192 B/op 5 allocs/op - BenchmarkRangeParseAverage-4 1000000 1677 ns/op 400 B/op 10 allocs/op - BenchmarkRangeParseComplex-4 300000 5214 ns/op 1440 B/op 30 allocs/op - BenchmarkRangeMatchSimple-4 50000000 25.6 ns/op 0 B/op 0 allocs/op - BenchmarkRangeMatchAverage-4 30000000 56.4 ns/op 0 B/op 0 allocs/op - BenchmarkRangeMatchComplex-4 10000000 153 ns/op 0 B/op 0 allocs/op - -See benchmark cases at [semver_test.go](semver_test.go) - - -Motivation ------ - -I simply couldn't find any lib supporting the full spec. Others were just wrong or used reflection and regex which i don't like. - - -Contribution ------ - -Feel free to make a pull request. For bigger changes create a issue first to discuss about it. - - -License ------ - -See [LICENSE](LICENSE) file. diff --git a/vendor/github.com/blang/semver/go.mod b/vendor/github.com/blang/semver/go.mod deleted file mode 100644 index d0083058..00000000 --- a/vendor/github.com/blang/semver/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/blang/semver diff --git a/vendor/github.com/blang/semver/package.json b/vendor/github.com/blang/semver/package.json deleted file mode 100644 index 1cf8ebdd..00000000 --- a/vendor/github.com/blang/semver/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "author": "blang", - "bugs": { - "URL": "https://github.com/blang/semver/issues", - "url": "https://github.com/blang/semver/issues" - }, - "gx": { - "dvcsimport": "github.com/blang/semver" - }, - "gxVersion": "0.10.0", - "language": "go", - "license": "MIT", - "name": "semver", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "3.5.1" -} - diff --git a/vendor/github.com/boltdb/bolt/.gitignore b/vendor/github.com/boltdb/bolt/.gitignore deleted file mode 100644 index c7bd2b7a..00000000 --- a/vendor/github.com/boltdb/bolt/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.prof -*.test -*.swp -/bin/ diff --git a/vendor/github.com/boltdb/bolt/Makefile b/vendor/github.com/boltdb/bolt/Makefile deleted file mode 100644 index e035e63a..00000000 --- a/vendor/github.com/boltdb/bolt/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -BRANCH=`git rev-parse --abbrev-ref HEAD` -COMMIT=`git rev-parse --short HEAD` -GOLDFLAGS="-X main.branch $(BRANCH) -X main.commit $(COMMIT)" - -default: build - -race: - @go test -v -race -test.run="TestSimulate_(100op|1000op)" - -# go get github.com/kisielk/errcheck -errcheck: - @errcheck -ignorepkg=bytes -ignore=os:Remove github.com/boltdb/bolt - -test: - @go test -v -cover . - @go test -v ./cmd/bolt - -.PHONY: fmt test diff --git a/vendor/github.com/boltdb/bolt/README.md b/vendor/github.com/boltdb/bolt/README.md deleted file mode 100644 index 7d43a15b..00000000 --- a/vendor/github.com/boltdb/bolt/README.md +++ /dev/null @@ -1,916 +0,0 @@ -Bolt [![Coverage Status](https://coveralls.io/repos/boltdb/bolt/badge.svg?branch=master)](https://coveralls.io/r/boltdb/bolt?branch=master) [![GoDoc](https://godoc.org/github.com/boltdb/bolt?status.svg)](https://godoc.org/github.com/boltdb/bolt) ![Version](https://img.shields.io/badge/version-1.2.1-green.svg) -==== - -Bolt is a pure Go key/value store inspired by [Howard Chu's][hyc_symas] -[LMDB project][lmdb]. The goal of the project is to provide a simple, -fast, and reliable database for projects that don't require a full database -server such as Postgres or MySQL. - -Since Bolt is meant to be used as such a low-level piece of functionality, -simplicity is key. The API will be small and only focus on getting values -and setting values. That's it. - -[hyc_symas]: https://twitter.com/hyc_symas -[lmdb]: http://symas.com/mdb/ - -## Project Status - -Bolt is stable, the API is fixed, and the file format is fixed. Full unit -test coverage and randomized black box testing are used to ensure database -consistency and thread safety. Bolt is currently used in high-load production -environments serving databases as large as 1TB. Many companies such as -Shopify and Heroku use Bolt-backed services every day. - -## Table of Contents - -- [Getting Started](#getting-started) - - [Installing](#installing) - - [Opening a database](#opening-a-database) - - [Transactions](#transactions) - - [Read-write transactions](#read-write-transactions) - - [Read-only transactions](#read-only-transactions) - - [Batch read-write transactions](#batch-read-write-transactions) - - [Managing transactions manually](#managing-transactions-manually) - - [Using buckets](#using-buckets) - - [Using key/value pairs](#using-keyvalue-pairs) - - [Autoincrementing integer for the bucket](#autoincrementing-integer-for-the-bucket) - - [Iterating over keys](#iterating-over-keys) - - [Prefix scans](#prefix-scans) - - [Range scans](#range-scans) - - [ForEach()](#foreach) - - [Nested buckets](#nested-buckets) - - [Database backups](#database-backups) - - [Statistics](#statistics) - - [Read-Only Mode](#read-only-mode) - - [Mobile Use (iOS/Android)](#mobile-use-iosandroid) -- [Resources](#resources) -- [Comparison with other databases](#comparison-with-other-databases) - - [Postgres, MySQL, & other relational databases](#postgres-mysql--other-relational-databases) - - [LevelDB, RocksDB](#leveldb-rocksdb) - - [LMDB](#lmdb) -- [Caveats & Limitations](#caveats--limitations) -- [Reading the Source](#reading-the-source) -- [Other Projects Using Bolt](#other-projects-using-bolt) - -## Getting Started - -### Installing - -To start using Bolt, install Go and run `go get`: - -```sh -$ go get github.com/boltdb/bolt/... -``` - -This will retrieve the library and install the `bolt` command line utility into -your `$GOBIN` path. - - -### Opening a database - -The top-level object in Bolt is a `DB`. It is represented as a single file on -your disk and represents a consistent snapshot of your data. - -To open your database, simply use the `bolt.Open()` function: - -```go -package main - -import ( - "log" - - "github.com/boltdb/bolt" -) - -func main() { - // Open the my.db data file in your current directory. - // It will be created if it doesn't exist. - db, err := bolt.Open("my.db", 0600, nil) - if err != nil { - log.Fatal(err) - } - defer db.Close() - - ... -} -``` - -Please note that Bolt obtains a file lock on the data file so multiple processes -cannot open the same database at the same time. Opening an already open Bolt -database will cause it to hang until the other process closes it. To prevent -an indefinite wait you can pass a timeout option to the `Open()` function: - -```go -db, err := bolt.Open("my.db", 0600, &bolt.Options{Timeout: 1 * time.Second}) -``` - - -### Transactions - -Bolt allows only one read-write transaction at a time but allows as many -read-only transactions as you want at a time. Each transaction has a consistent -view of the data as it existed when the transaction started. - -Individual transactions and all objects created from them (e.g. buckets, keys) -are not thread safe. To work with data in multiple goroutines you must start -a transaction for each one or use locking to ensure only one goroutine accesses -a transaction at a time. Creating transaction from the `DB` is thread safe. - -Read-only transactions and read-write transactions should not depend on one -another and generally shouldn't be opened simultaneously in the same goroutine. -This can cause a deadlock as the read-write transaction needs to periodically -re-map the data file but it cannot do so while a read-only transaction is open. - - -#### Read-write transactions - -To start a read-write transaction, you can use the `DB.Update()` function: - -```go -err := db.Update(func(tx *bolt.Tx) error { - ... - return nil -}) -``` - -Inside the closure, you have a consistent view of the database. You commit the -transaction by returning `nil` at the end. You can also rollback the transaction -at any point by returning an error. All database operations are allowed inside -a read-write transaction. - -Always check the return error as it will report any disk failures that can cause -your transaction to not complete. If you return an error within your closure -it will be passed through. - - -#### Read-only transactions - -To start a read-only transaction, you can use the `DB.View()` function: - -```go -err := db.View(func(tx *bolt.Tx) error { - ... - return nil -}) -``` - -You also get a consistent view of the database within this closure, however, -no mutating operations are allowed within a read-only transaction. You can only -retrieve buckets, retrieve values, and copy the database within a read-only -transaction. - - -#### Batch read-write transactions - -Each `DB.Update()` waits for disk to commit the writes. This overhead -can be minimized by combining multiple updates with the `DB.Batch()` -function: - -```go -err := db.Batch(func(tx *bolt.Tx) error { - ... - return nil -}) -``` - -Concurrent Batch calls are opportunistically combined into larger -transactions. Batch is only useful when there are multiple goroutines -calling it. - -The trade-off is that `Batch` can call the given -function multiple times, if parts of the transaction fail. The -function must be idempotent and side effects must take effect only -after a successful return from `DB.Batch()`. - -For example: don't display messages from inside the function, instead -set variables in the enclosing scope: - -```go -var id uint64 -err := db.Batch(func(tx *bolt.Tx) error { - // Find last key in bucket, decode as bigendian uint64, increment - // by one, encode back to []byte, and add new key. - ... - id = newValue - return nil -}) -if err != nil { - return ... -} -fmt.Println("Allocated ID %d", id) -``` - - -#### Managing transactions manually - -The `DB.View()` and `DB.Update()` functions are wrappers around the `DB.Begin()` -function. These helper functions will start the transaction, execute a function, -and then safely close your transaction if an error is returned. This is the -recommended way to use Bolt transactions. - -However, sometimes you may want to manually start and end your transactions. -You can use the `DB.Begin()` function directly but **please** be sure to close -the transaction. - -```go -// Start a writable transaction. -tx, err := db.Begin(true) -if err != nil { - return err -} -defer tx.Rollback() - -// Use the transaction... -_, err := tx.CreateBucket([]byte("MyBucket")) -if err != nil { - return err -} - -// Commit the transaction and check for error. -if err := tx.Commit(); err != nil { - return err -} -``` - -The first argument to `DB.Begin()` is a boolean stating if the transaction -should be writable. - - -### Using buckets - -Buckets are collections of key/value pairs within the database. All keys in a -bucket must be unique. You can create a bucket using the `DB.CreateBucket()` -function: - -```go -db.Update(func(tx *bolt.Tx) error { - b, err := tx.CreateBucket([]byte("MyBucket")) - if err != nil { - return fmt.Errorf("create bucket: %s", err) - } - return nil -}) -``` - -You can also create a bucket only if it doesn't exist by using the -`Tx.CreateBucketIfNotExists()` function. It's a common pattern to call this -function for all your top-level buckets after you open your database so you can -guarantee that they exist for future transactions. - -To delete a bucket, simply call the `Tx.DeleteBucket()` function. - - -### Using key/value pairs - -To save a key/value pair to a bucket, use the `Bucket.Put()` function: - -```go -db.Update(func(tx *bolt.Tx) error { - b := tx.Bucket([]byte("MyBucket")) - err := b.Put([]byte("answer"), []byte("42")) - return err -}) -``` - -This will set the value of the `"answer"` key to `"42"` in the `MyBucket` -bucket. To retrieve this value, we can use the `Bucket.Get()` function: - -```go -db.View(func(tx *bolt.Tx) error { - b := tx.Bucket([]byte("MyBucket")) - v := b.Get([]byte("answer")) - fmt.Printf("The answer is: %s\n", v) - return nil -}) -``` - -The `Get()` function does not return an error because its operation is -guaranteed to work (unless there is some kind of system failure). If the key -exists then it will return its byte slice value. If it doesn't exist then it -will return `nil`. It's important to note that you can have a zero-length value -set to a key which is different than the key not existing. - -Use the `Bucket.Delete()` function to delete a key from the bucket. - -Please note that values returned from `Get()` are only valid while the -transaction is open. If you need to use a value outside of the transaction -then you must use `copy()` to copy it to another byte slice. - - -### Autoincrementing integer for the bucket -By using the `NextSequence()` function, you can let Bolt determine a sequence -which can be used as the unique identifier for your key/value pairs. See the -example below. - -```go -// CreateUser saves u to the store. The new user ID is set on u once the data is persisted. -func (s *Store) CreateUser(u *User) error { - return s.db.Update(func(tx *bolt.Tx) error { - // Retrieve the users bucket. - // This should be created when the DB is first opened. - b := tx.Bucket([]byte("users")) - - // Generate ID for the user. - // This returns an error only if the Tx is closed or not writeable. - // That can't happen in an Update() call so I ignore the error check. - id, _ := b.NextSequence() - u.ID = int(id) - - // Marshal user data into bytes. - buf, err := json.Marshal(u) - if err != nil { - return err - } - - // Persist bytes to users bucket. - return b.Put(itob(u.ID), buf) - }) -} - -// itob returns an 8-byte big endian representation of v. -func itob(v int) []byte { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(v)) - return b -} - -type User struct { - ID int - ... -} -``` - -### Iterating over keys - -Bolt stores its keys in byte-sorted order within a bucket. This makes sequential -iteration over these keys extremely fast. To iterate over keys we'll use a -`Cursor`: - -```go -db.View(func(tx *bolt.Tx) error { - // Assume bucket exists and has keys - b := tx.Bucket([]byte("MyBucket")) - - c := b.Cursor() - - for k, v := c.First(); k != nil; k, v = c.Next() { - fmt.Printf("key=%s, value=%s\n", k, v) - } - - return nil -}) -``` - -The cursor allows you to move to a specific point in the list of keys and move -forward or backward through the keys one at a time. - -The following functions are available on the cursor: - -``` -First() Move to the first key. -Last() Move to the last key. -Seek() Move to a specific key. -Next() Move to the next key. -Prev() Move to the previous key. -``` - -Each of those functions has a return signature of `(key []byte, value []byte)`. -When you have iterated to the end of the cursor then `Next()` will return a -`nil` key. You must seek to a position using `First()`, `Last()`, or `Seek()` -before calling `Next()` or `Prev()`. If you do not seek to a position then -these functions will return a `nil` key. - -During iteration, if the key is non-`nil` but the value is `nil`, that means -the key refers to a bucket rather than a value. Use `Bucket.Bucket()` to -access the sub-bucket. - - -#### Prefix scans - -To iterate over a key prefix, you can combine `Seek()` and `bytes.HasPrefix()`: - -```go -db.View(func(tx *bolt.Tx) error { - // Assume bucket exists and has keys - c := tx.Bucket([]byte("MyBucket")).Cursor() - - prefix := []byte("1234") - for k, v := c.Seek(prefix); k != nil && bytes.HasPrefix(k, prefix); k, v = c.Next() { - fmt.Printf("key=%s, value=%s\n", k, v) - } - - return nil -}) -``` - -#### Range scans - -Another common use case is scanning over a range such as a time range. If you -use a sortable time encoding such as RFC3339 then you can query a specific -date range like this: - -```go -db.View(func(tx *bolt.Tx) error { - // Assume our events bucket exists and has RFC3339 encoded time keys. - c := tx.Bucket([]byte("Events")).Cursor() - - // Our time range spans the 90's decade. - min := []byte("1990-01-01T00:00:00Z") - max := []byte("2000-01-01T00:00:00Z") - - // Iterate over the 90's. - for k, v := c.Seek(min); k != nil && bytes.Compare(k, max) <= 0; k, v = c.Next() { - fmt.Printf("%s: %s\n", k, v) - } - - return nil -}) -``` - -Note that, while RFC3339 is sortable, the Golang implementation of RFC3339Nano does not use a fixed number of digits after the decimal point and is therefore not sortable. - - -#### ForEach() - -You can also use the function `ForEach()` if you know you'll be iterating over -all the keys in a bucket: - -```go -db.View(func(tx *bolt.Tx) error { - // Assume bucket exists and has keys - b := tx.Bucket([]byte("MyBucket")) - - b.ForEach(func(k, v []byte) error { - fmt.Printf("key=%s, value=%s\n", k, v) - return nil - }) - return nil -}) -``` - -Please note that keys and values in `ForEach()` are only valid while -the transaction is open. If you need to use a key or value outside of -the transaction, you must use `copy()` to copy it to another byte -slice. - -### Nested buckets - -You can also store a bucket in a key to create nested buckets. The API is the -same as the bucket management API on the `DB` object: - -```go -func (*Bucket) CreateBucket(key []byte) (*Bucket, error) -func (*Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) -func (*Bucket) DeleteBucket(key []byte) error -``` - -Say you had a multi-tenant application where the root level bucket was the account bucket. Inside of this bucket was a sequence of accounts which themselves are buckets. And inside the sequence bucket you could have many buckets pertaining to the Account itself (Users, Notes, etc) isolating the information into logical groupings. - -```go - -// createUser creates a new user in the given account. -func createUser(accountID int, u *User) error { - // Start the transaction. - tx, err := db.Begin(true) - if err != nil { - return err - } - defer tx.Rollback() - - // Retrieve the root bucket for the account. - // Assume this has already been created when the account was set up. - root := tx.Bucket([]byte(strconv.FormatUint(accountID, 10))) - - // Setup the users bucket. - bkt, err := root.CreateBucketIfNotExists([]byte("USERS")) - if err != nil { - return err - } - - // Generate an ID for the new user. - userID, err := bkt.NextSequence() - if err != nil { - return err - } - u.ID = userID - - // Marshal and save the encoded user. - if buf, err := json.Marshal(u); err != nil { - return err - } else if err := bkt.Put([]byte(strconv.FormatUint(u.ID, 10)), buf); err != nil { - return err - } - - // Commit the transaction. - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -``` - - - - -### Database backups - -Bolt is a single file so it's easy to backup. You can use the `Tx.WriteTo()` -function to write a consistent view of the database to a writer. If you call -this from a read-only transaction, it will perform a hot backup and not block -your other database reads and writes. - -By default, it will use a regular file handle which will utilize the operating -system's page cache. See the [`Tx`](https://godoc.org/github.com/boltdb/bolt#Tx) -documentation for information about optimizing for larger-than-RAM datasets. - -One common use case is to backup over HTTP so you can use tools like `cURL` to -do database backups: - -```go -func BackupHandleFunc(w http.ResponseWriter, req *http.Request) { - err := db.View(func(tx *bolt.Tx) error { - w.Header().Set("Content-Type", "application/octet-stream") - w.Header().Set("Content-Disposition", `attachment; filename="my.db"`) - w.Header().Set("Content-Length", strconv.Itoa(int(tx.Size()))) - _, err := tx.WriteTo(w) - return err - }) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} -``` - -Then you can backup using this command: - -```sh -$ curl http://localhost/backup > my.db -``` - -Or you can open your browser to `http://localhost/backup` and it will download -automatically. - -If you want to backup to another file you can use the `Tx.CopyFile()` helper -function. - - -### Statistics - -The database keeps a running count of many of the internal operations it -performs so you can better understand what's going on. By grabbing a snapshot -of these stats at two points in time we can see what operations were performed -in that time range. - -For example, we could start a goroutine to log stats every 10 seconds: - -```go -go func() { - // Grab the initial stats. - prev := db.Stats() - - for { - // Wait for 10s. - time.Sleep(10 * time.Second) - - // Grab the current stats and diff them. - stats := db.Stats() - diff := stats.Sub(&prev) - - // Encode stats to JSON and print to STDERR. - json.NewEncoder(os.Stderr).Encode(diff) - - // Save stats for the next loop. - prev = stats - } -}() -``` - -It's also useful to pipe these stats to a service such as statsd for monitoring -or to provide an HTTP endpoint that will perform a fixed-length sample. - - -### Read-Only Mode - -Sometimes it is useful to create a shared, read-only Bolt database. To this, -set the `Options.ReadOnly` flag when opening your database. Read-only mode -uses a shared lock to allow multiple processes to read from the database but -it will block any processes from opening the database in read-write mode. - -```go -db, err := bolt.Open("my.db", 0666, &bolt.Options{ReadOnly: true}) -if err != nil { - log.Fatal(err) -} -``` - -### Mobile Use (iOS/Android) - -Bolt is able to run on mobile devices by leveraging the binding feature of the -[gomobile](https://github.com/golang/mobile) tool. Create a struct that will -contain your database logic and a reference to a `*bolt.DB` with a initializing -constructor that takes in a filepath where the database file will be stored. -Neither Android nor iOS require extra permissions or cleanup from using this method. - -```go -func NewBoltDB(filepath string) *BoltDB { - db, err := bolt.Open(filepath+"/demo.db", 0600, nil) - if err != nil { - log.Fatal(err) - } - - return &BoltDB{db} -} - -type BoltDB struct { - db *bolt.DB - ... -} - -func (b *BoltDB) Path() string { - return b.db.Path() -} - -func (b *BoltDB) Close() { - b.db.Close() -} -``` - -Database logic should be defined as methods on this wrapper struct. - -To initialize this struct from the native language (both platforms now sync -their local storage to the cloud. These snippets disable that functionality for the -database file): - -#### Android - -```java -String path; -if (android.os.Build.VERSION.SDK_INT >=android.os.Build.VERSION_CODES.LOLLIPOP){ - path = getNoBackupFilesDir().getAbsolutePath(); -} else{ - path = getFilesDir().getAbsolutePath(); -} -Boltmobiledemo.BoltDB boltDB = Boltmobiledemo.NewBoltDB(path) -``` - -#### iOS - -```objc -- (void)demo { - NSString* path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, - NSUserDomainMask, - YES) objectAtIndex:0]; - GoBoltmobiledemoBoltDB * demo = GoBoltmobiledemoNewBoltDB(path); - [self addSkipBackupAttributeToItemAtPath:demo.path]; - //Some DB Logic would go here - [demo close]; -} - -- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString -{ - NSURL* URL= [NSURL fileURLWithPath: filePathString]; - assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); - - NSError *error = nil; - BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES] - forKey: NSURLIsExcludedFromBackupKey error: &error]; - if(!success){ - NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); - } - return success; -} - -``` - -## Resources - -For more information on getting started with Bolt, check out the following articles: - -* [Intro to BoltDB: Painless Performant Persistence](http://npf.io/2014/07/intro-to-boltdb-painless-performant-persistence/) by [Nate Finch](https://github.com/natefinch). -* [Bolt -- an embedded key/value database for Go](https://www.progville.com/go/bolt-embedded-db-golang/) by Progville - - -## Comparison with other databases - -### Postgres, MySQL, & other relational databases - -Relational databases structure data into rows and are only accessible through -the use of SQL. This approach provides flexibility in how you store and query -your data but also incurs overhead in parsing and planning SQL statements. Bolt -accesses all data by a byte slice key. This makes Bolt fast to read and write -data by key but provides no built-in support for joining values together. - -Most relational databases (with the exception of SQLite) are standalone servers -that run separately from your application. This gives your systems -flexibility to connect multiple application servers to a single database -server but also adds overhead in serializing and transporting data over the -network. Bolt runs as a library included in your application so all data access -has to go through your application's process. This brings data closer to your -application but limits multi-process access to the data. - - -### LevelDB, RocksDB - -LevelDB and its derivatives (RocksDB, HyperLevelDB) are similar to Bolt in that -they are libraries bundled into the application, however, their underlying -structure is a log-structured merge-tree (LSM tree). An LSM tree optimizes -random writes by using a write ahead log and multi-tiered, sorted files called -SSTables. Bolt uses a B+tree internally and only a single file. Both approaches -have trade-offs. - -If you require a high random write throughput (>10,000 w/sec) or you need to use -spinning disks then LevelDB could be a good choice. If your application is -read-heavy or does a lot of range scans then Bolt could be a good choice. - -One other important consideration is that LevelDB does not have transactions. -It supports batch writing of key/values pairs and it supports read snapshots -but it will not give you the ability to do a compare-and-swap operation safely. -Bolt supports fully serializable ACID transactions. - - -### LMDB - -Bolt was originally a port of LMDB so it is architecturally similar. Both use -a B+tree, have ACID semantics with fully serializable transactions, and support -lock-free MVCC using a single writer and multiple readers. - -The two projects have somewhat diverged. LMDB heavily focuses on raw performance -while Bolt has focused on simplicity and ease of use. For example, LMDB allows -several unsafe actions such as direct writes for the sake of performance. Bolt -opts to disallow actions which can leave the database in a corrupted state. The -only exception to this in Bolt is `DB.NoSync`. - -There are also a few differences in API. LMDB requires a maximum mmap size when -opening an `mdb_env` whereas Bolt will handle incremental mmap resizing -automatically. LMDB overloads the getter and setter functions with multiple -flags whereas Bolt splits these specialized cases into their own functions. - - -## Caveats & Limitations - -It's important to pick the right tool for the job and Bolt is no exception. -Here are a few things to note when evaluating and using Bolt: - -* Bolt is good for read intensive workloads. Sequential write performance is - also fast but random writes can be slow. You can use `DB.Batch()` or add a - write-ahead log to help mitigate this issue. - -* Bolt uses a B+tree internally so there can be a lot of random page access. - SSDs provide a significant performance boost over spinning disks. - -* Try to avoid long running read transactions. Bolt uses copy-on-write so - old pages cannot be reclaimed while an old transaction is using them. - -* Byte slices returned from Bolt are only valid during a transaction. Once the - transaction has been committed or rolled back then the memory they point to - can be reused by a new page or can be unmapped from virtual memory and you'll - see an `unexpected fault address` panic when accessing it. - -* Bolt uses an exclusive write lock on the database file so it cannot be - shared by multiple processes. - -* Be careful when using `Bucket.FillPercent`. Setting a high fill percent for - buckets that have random inserts will cause your database to have very poor - page utilization. - -* Use larger buckets in general. Smaller buckets causes poor page utilization - once they become larger than the page size (typically 4KB). - -* Bulk loading a lot of random writes into a new bucket can be slow as the - page will not split until the transaction is committed. Randomly inserting - more than 100,000 key/value pairs into a single new bucket in a single - transaction is not advised. - -* Bolt uses a memory-mapped file so the underlying operating system handles the - caching of the data. Typically, the OS will cache as much of the file as it - can in memory and will release memory as needed to other processes. This means - that Bolt can show very high memory usage when working with large databases. - However, this is expected and the OS will release memory as needed. Bolt can - handle databases much larger than the available physical RAM, provided its - memory-map fits in the process virtual address space. It may be problematic - on 32-bits systems. - -* The data structures in the Bolt database are memory mapped so the data file - will be endian specific. This means that you cannot copy a Bolt file from a - little endian machine to a big endian machine and have it work. For most - users this is not a concern since most modern CPUs are little endian. - -* Because of the way pages are laid out on disk, Bolt cannot truncate data files - and return free pages back to the disk. Instead, Bolt maintains a free list - of unused pages within its data file. These free pages can be reused by later - transactions. This works well for many use cases as databases generally tend - to grow. However, it's important to note that deleting large chunks of data - will not allow you to reclaim that space on disk. - - For more information on page allocation, [see this comment][page-allocation]. - -[page-allocation]: https://github.com/boltdb/bolt/issues/308#issuecomment-74811638 - - -## Reading the Source - -Bolt is a relatively small code base (<3KLOC) for an embedded, serializable, -transactional key/value database so it can be a good starting point for people -interested in how databases work. - -The best places to start are the main entry points into Bolt: - -- `Open()` - Initializes the reference to the database. It's responsible for - creating the database if it doesn't exist, obtaining an exclusive lock on the - file, reading the meta pages, & memory-mapping the file. - -- `DB.Begin()` - Starts a read-only or read-write transaction depending on the - value of the `writable` argument. This requires briefly obtaining the "meta" - lock to keep track of open transactions. Only one read-write transaction can - exist at a time so the "rwlock" is acquired during the life of a read-write - transaction. - -- `Bucket.Put()` - Writes a key/value pair into a bucket. After validating the - arguments, a cursor is used to traverse the B+tree to the page and position - where they key & value will be written. Once the position is found, the bucket - materializes the underlying page and the page's parent pages into memory as - "nodes". These nodes are where mutations occur during read-write transactions. - These changes get flushed to disk during commit. - -- `Bucket.Get()` - Retrieves a key/value pair from a bucket. This uses a cursor - to move to the page & position of a key/value pair. During a read-only - transaction, the key and value data is returned as a direct reference to the - underlying mmap file so there's no allocation overhead. For read-write - transactions, this data may reference the mmap file or one of the in-memory - node values. - -- `Cursor` - This object is simply for traversing the B+tree of on-disk pages - or in-memory nodes. It can seek to a specific key, move to the first or last - value, or it can move forward or backward. The cursor handles the movement up - and down the B+tree transparently to the end user. - -- `Tx.Commit()` - Converts the in-memory dirty nodes and the list of free pages - into pages to be written to disk. Writing to disk then occurs in two phases. - First, the dirty pages are written to disk and an `fsync()` occurs. Second, a - new meta page with an incremented transaction ID is written and another - `fsync()` occurs. This two phase write ensures that partially written data - pages are ignored in the event of a crash since the meta page pointing to them - is never written. Partially written meta pages are invalidated because they - are written with a checksum. - -If you have additional notes that could be helpful for others, please submit -them via pull request. - - -## Other Projects Using Bolt - -Below is a list of public, open source projects that use Bolt: - -* [BoltDbWeb](https://github.com/evnix/boltdbweb) - A web based GUI for BoltDB files. -* [Operation Go: A Routine Mission](http://gocode.io) - An online programming game for Golang using Bolt for user accounts and a leaderboard. -* [Bazil](https://bazil.org/) - A file system that lets your data reside where it is most convenient for it to reside. -* [DVID](https://github.com/janelia-flyem/dvid) - Added Bolt as optional storage engine and testing it against Basho-tuned leveldb. -* [Skybox Analytics](https://github.com/skybox/skybox) - A standalone funnel analysis tool for web analytics. -* [Scuttlebutt](https://github.com/benbjohnson/scuttlebutt) - Uses Bolt to store and process all Twitter mentions of GitHub projects. -* [Wiki](https://github.com/peterhellberg/wiki) - A tiny wiki using Goji, BoltDB and Blackfriday. -* [ChainStore](https://github.com/pressly/chainstore) - Simple key-value interface to a variety of storage engines organized as a chain of operations. -* [MetricBase](https://github.com/msiebuhr/MetricBase) - Single-binary version of Graphite. -* [Gitchain](https://github.com/gitchain/gitchain) - Decentralized, peer-to-peer Git repositories aka "Git meets Bitcoin". -* [event-shuttle](https://github.com/sclasen/event-shuttle) - A Unix system service to collect and reliably deliver messages to Kafka. -* [ipxed](https://github.com/kelseyhightower/ipxed) - Web interface and api for ipxed. -* [BoltStore](https://github.com/yosssi/boltstore) - Session store using Bolt. -* [photosite/session](https://godoc.org/bitbucket.org/kardianos/photosite/session) - Sessions for a photo viewing site. -* [LedisDB](https://github.com/siddontang/ledisdb) - A high performance NoSQL, using Bolt as optional storage. -* [ipLocator](https://github.com/AndreasBriese/ipLocator) - A fast ip-geo-location-server using bolt with bloom filters. -* [cayley](https://github.com/google/cayley) - Cayley is an open-source graph database using Bolt as optional backend. -* [bleve](http://www.blevesearch.com/) - A pure Go search engine similar to ElasticSearch that uses Bolt as the default storage backend. -* [tentacool](https://github.com/optiflows/tentacool) - REST api server to manage system stuff (IP, DNS, Gateway...) on a linux server. -* [Seaweed File System](https://github.com/chrislusf/seaweedfs) - Highly scalable distributed key~file system with O(1) disk read. -* [InfluxDB](https://influxdata.com) - Scalable datastore for metrics, events, and real-time analytics. -* [Freehold](http://tshannon.bitbucket.org/freehold/) - An open, secure, and lightweight platform for your files and data. -* [Prometheus Annotation Server](https://github.com/oliver006/prom_annotation_server) - Annotation server for PromDash & Prometheus service monitoring system. -* [Consul](https://github.com/hashicorp/consul) - Consul is service discovery and configuration made easy. Distributed, highly available, and datacenter-aware. -* [Kala](https://github.com/ajvb/kala) - Kala is a modern job scheduler optimized to run on a single node. It is persistent, JSON over HTTP API, ISO 8601 duration notation, and dependent jobs. -* [drive](https://github.com/odeke-em/drive) - drive is an unofficial Google Drive command line client for \*NIX operating systems. -* [stow](https://github.com/djherbis/stow) - a persistence manager for objects - backed by boltdb. -* [buckets](https://github.com/joyrexus/buckets) - a bolt wrapper streamlining - simple tx and key scans. -* [mbuckets](https://github.com/abhigupta912/mbuckets) - A Bolt wrapper that allows easy operations on multi level (nested) buckets. -* [Request Baskets](https://github.com/darklynx/request-baskets) - A web service to collect arbitrary HTTP requests and inspect them via REST API or simple web UI, similar to [RequestBin](http://requestb.in/) service -* [Go Report Card](https://goreportcard.com/) - Go code quality report cards as a (free and open source) service. -* [Boltdb Boilerplate](https://github.com/bobintornado/boltdb-boilerplate) - Boilerplate wrapper around bolt aiming to make simple calls one-liners. -* [lru](https://github.com/crowdriff/lru) - Easy to use Bolt-backed Least-Recently-Used (LRU) read-through cache with chainable remote stores. -* [Storm](https://github.com/asdine/storm) - Simple and powerful ORM for BoltDB. -* [GoWebApp](https://github.com/josephspurrier/gowebapp) - A basic MVC web application in Go using BoltDB. -* [SimpleBolt](https://github.com/xyproto/simplebolt) - A simple way to use BoltDB. Deals mainly with strings. -* [Algernon](https://github.com/xyproto/algernon) - A HTTP/2 web server with built-in support for Lua. Uses BoltDB as the default database backend. -* [MuLiFS](https://github.com/dankomiocevic/mulifs) - Music Library Filesystem creates a filesystem to organise your music files. -* [GoShort](https://github.com/pankajkhairnar/goShort) - GoShort is a URL shortener written in Golang and BoltDB for persistent key/value storage and for routing it's using high performent HTTPRouter. -* [torrent](https://github.com/anacrolix/torrent) - Full-featured BitTorrent client package and utilities in Go. BoltDB is a storage backend in development. -* [gopherpit](https://github.com/gopherpit/gopherpit) - A web service to manage Go remote import paths with custom domains -* [bolter](https://github.com/hasit/bolter) - Command-line app for viewing BoltDB file in your terminal. -* [btcwallet](https://github.com/btcsuite/btcwallet) - A bitcoin wallet. -* [dcrwallet](https://github.com/decred/dcrwallet) - A wallet for the Decred cryptocurrency. -* [Ironsmith](https://github.com/timshannon/ironsmith) - A simple, script-driven continuous integration (build - > test -> release) tool, with no external dependencies -* [BoltHold](https://github.com/timshannon/bolthold) - An embeddable NoSQL store for Go types built on BoltDB -* [Ponzu CMS](https://ponzu-cms.org) - Headless CMS + automatic JSON API with auto-HTTPS, HTTP/2 Server Push, and flexible server framework. - -If you are using Bolt in a project please send a pull request to add it to the list. diff --git a/vendor/github.com/boltdb/bolt/appveyor.yml b/vendor/github.com/boltdb/bolt/appveyor.yml deleted file mode 100644 index 6e26e941..00000000 --- a/vendor/github.com/boltdb/bolt/appveyor.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: "{build}" - -os: Windows Server 2012 R2 - -clone_folder: c:\gopath\src\github.com\boltdb\bolt - -environment: - GOPATH: c:\gopath - -install: - - echo %PATH% - - echo %GOPATH% - - go version - - go env - - go get -v -t ./... - -build_script: - - go test -v ./... diff --git a/vendor/github.com/cenkalti/backoff/.gitignore b/vendor/github.com/cenkalti/backoff/.gitignore deleted file mode 100644 index 00268614..00000000 --- a/vendor/github.com/cenkalti/backoff/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe diff --git a/vendor/github.com/cenkalti/backoff/.travis.yml b/vendor/github.com/cenkalti/backoff/.travis.yml deleted file mode 100644 index 1040404b..00000000 --- a/vendor/github.com/cenkalti/backoff/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: go -go: - - 1.3.3 - - tip -before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover -script: - - $HOME/gopath/bin/goveralls -service=travis-ci diff --git a/vendor/github.com/cenkalti/backoff/README.md b/vendor/github.com/cenkalti/backoff/README.md deleted file mode 100644 index 13b347fb..00000000 --- a/vendor/github.com/cenkalti/backoff/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Exponential Backoff [![GoDoc][godoc image]][godoc] [![Build Status][travis image]][travis] [![Coverage Status][coveralls image]][coveralls] - -This is a Go port of the exponential backoff algorithm from [Google's HTTP Client Library for Java][google-http-java-client]. - -[Exponential backoff][exponential backoff wiki] -is an algorithm that uses feedback to multiplicatively decrease the rate of some process, -in order to gradually find an acceptable rate. -The retries exponentially increase and stop increasing when a certain threshold is met. - -## Usage - -See https://godoc.org/github.com/cenkalti/backoff#pkg-examples - -## Contributing - -* I would like to keep this library as small as possible. -* Please don't send a PR without opening an issue and discussing it first. -* If proposed change is not a common use case, I will probably not accept it. - -[godoc]: https://godoc.org/github.com/cenkalti/backoff -[godoc image]: https://godoc.org/github.com/cenkalti/backoff?status.png -[travis]: https://travis-ci.org/cenkalti/backoff -[travis image]: https://travis-ci.org/cenkalti/backoff.png?branch=master -[coveralls]: https://coveralls.io/github/cenkalti/backoff?branch=master -[coveralls image]: https://coveralls.io/repos/github/cenkalti/backoff/badge.svg?branch=master - -[google-http-java-client]: https://github.com/google/google-http-java-client -[exponential backoff wiki]: http://en.wikipedia.org/wiki/Exponential_backoff - -[advanced example]: https://godoc.org/github.com/cenkalti/backoff#example_ diff --git a/vendor/github.com/fibercrypto/skywallet-go/.github/ISSUE_TEMPLATE/blank.md b/vendor/github.com/fibercrypto/skywallet-go/.github/ISSUE_TEMPLATE/blank.md new file mode 100644 index 00000000..809cdec9 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/.github/ISSUE_TEMPLATE/blank.md @@ -0,0 +1,8 @@ +--- +name: Blank issue +about: Start writing your issue from scratch +title: '' +labels: '' +assignees: '' + +--- diff --git a/vendor/github.com/fibercrypto/skywallet-go/.github/ISSUE_TEMPLATE/bug_report.md b/vendor/github.com/fibercrypto/skywallet-go/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..a9c67003 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 'bug' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of the problem and bug effects. + +**Environment information:** + +- OS: e.g. Linux, Windows, Mac OS X +- Platform: the equivalent of `uname -smr` or `uname -smrv` e.g. Darwin 17.4.0 x86_64 +- Firmware Version: e.g. 0.5.18 + +**Steps to Reproduce** +Steps to reproduce the behavior: + +1. Go to '...' +2. Run '....' +3. Write data to '....' +4. See error + +**Actual behavior** +Explain the failure modes and effects, everything indicating the existence of the bug. +If applicable, add screenshots to help explain your problem. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Additional context** +Add any other context about the problem here. + +**Possible implementation** +Hints to fix the bug. diff --git a/vendor/github.com/fibercrypto/skywallet-go/.github/ISSUE_TEMPLATE/feature_request.md b/vendor/github.com/fibercrypto/skywallet-go/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..1693fa13 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,32 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'feature' +assignees: '' + +--- + +**Feature description** + +Describe the feature + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context about the problem here. + +**Possible implementation** +Preliminary ideas to get this done. +If you have all details in mind then provide a checklist + +- [ ] Start with ... +- [ ] When done do ... +- [ ] Finally ... diff --git a/vendor/github.com/fibercrypto/skywallet-go/.github/pull_request_template.md b/vendor/github.com/fibercrypto/skywallet-go/.github/pull_request_template.md new file mode 100644 index 00000000..16385934 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/.github/pull_request_template.md @@ -0,0 +1,17 @@ + +Fixes # + +Changes: +- + +Does this change need to mentioned in CHANGELOG.md? +yes | no + +Requires changes in protobuff specs? +no +related to PR skycoin/hardware-wallet-protob# for issue skycoin/hardware-wallet-protob# + +Requires testing +yes | no + +Comments about testing , should you have some diff --git a/vendor/github.com/fibercrypto/skywallet-go/.gitignore b/vendor/github.com/fibercrypto/skywallet-go/.gitignore new file mode 100644 index 00000000..701fe733 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/.gitignore @@ -0,0 +1,24 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Temporary files +*.swp +*.swo +*.swn +*.orig +DS_Store + +#IDE +.idea +.vscode + diff --git a/vendor/github.com/fibercrypto/skywallet-go/.golangci.yml b/vendor/github.com/fibercrypto/skywallet-go/.golangci.yml new file mode 100644 index 00000000..6ef62fa6 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/.golangci.yml @@ -0,0 +1,198 @@ +# This file contains all available configuration options +# Modified for linting cmd/ and src/ + +# options for analysis running +run: + # default concurrency is a available CPU number + concurrency: 4 + + # timeout for analysis, e.g. 30s, 5m, default is 1m + deadline: 3m + + # exit code when at least one issue was found, default is 1 + issues-exit-code: 1 + + # include test files or not, default is true + tests: true + + # list of build tags, all linters use it. Default is empty list. + build-tags: + + # which dirs to skip: they won't be analyzed; + # can use regexp here: generated.*, regexp is applied on full path; + # default value is empty list, but next dirs are always skipped independently + # from this option's value: + # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + skip-dirs: [src/usb, src/skywallet/usb, src/skywallet/wire] + + # which files to skip: they will be analyzed, but issues from them + # won't be reported. Default value is empty list, but there is + # no need to include all autogenerated files, we confidently recognize + # autogenerated files. If it's not please let us know. + skip-files: + + +# output configuration options +output: + # colored-line-number|line-number|json|tab|checkstyle, default is "colored-line-number" + format: colored-line-number + + # print lines of code with issue, default is true + print-issued-lines: true + + # print linter name in the end of issue text, default is true + print-linter-name: true + + +# all available settings of specific linters +linters-settings: + errcheck: + # report about not checking of errors in type assetions: `a := b.(MyStruct)`; + # default is false: such cases aren't reported by default. + check-type-assertions: false + + # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; + # default is false: such cases aren't reported by default. + check-blank: true + govet: + # report about shadowed variables + check-shadowing: true + + # Obtain type information from installed (to $GOPATH/pkg) package files: + # golangci-lint will execute `go install -i` and `go test -i` for analyzed packages + # before analyzing them. + # By default this option is disabled and govet gets type information by loader from source code. + # Loading from source code is slow, but it's done only once for all linters. + # Go-installing of packages first time is much slower than loading them from source code, + # therefore this option is disabled by default. + # But repeated installation is fast in go >= 1.10 because of build caching. + # Enable this option only if all conditions are met: + # 1. you use only "fast" linters (--fast e.g.): no program loading occurs + # 2. you use go >= 1.10 + # 3. you do repeated runs (false for CI) or cache $GOPATH/pkg or `go env GOCACHE` dir in CI. + use-installed-packages: false + golint: + # minimal confidence for issues, default is 0.8 + min-confidence: 0.8 + gofmt: + # simplify code: gofmt with `-s` option, true by default + simplify: true + gocyclo: + # minimal code complexity to report, 30 by default (but we recommend 10-20) + min-complexity: 10 + maligned: + # print struct with more effective memory layout or not, false by default + suggest-new: true + dupl: + # tokens count to trigger issue, 150 by default + threshold: 100 + goconst: + # minimal length of string constant, 3 by default + min-len: 3 + # minimal occurrences count to trigger, 3 by default + min-occurrences: 3 + depguard: + list-type: blacklist + include-go-root: false + packages: + - github.com/pkg/errors + misspell: + # Correct spellings using locale preferences for US or UK. + # Default is to use a neutral variety of English. + # Setting locale to US will correct the British spelling of 'colour' to 'color'. + locale: US + lll: + # max line length, lines longer will be reported. Default is 120. + # '\t' is counted as 1 character by default, and can be changed with the tab-width option + line-length: 120 + # tab width in spaces. Default to 1. + tab-width: 1 + unused: + # treat code as a program (not a library) and report unused exported identifiers; default is false. + # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find funcs usages. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + unparam: + # call graph construction algorithm (cha, rta). In general, use cha for libraries, + # and rta for programs with main packages. Default is cha. + algo: cha + + # Inspect exported functions, default is false. Set to true if no external program/library imports your code. + # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find external interfaces. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + nakedret: + # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 + max-func-lines: 30 + prealloc: + # XXX: we don't recommend using this linter before doing performance profiling. + # For most programs usage of prealloc will be a premature optimization. + + # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. + # True by default. + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + goimports: + local-prefixes: github.com/fibercrypto/skywallet-go + + +linters: + enable: + - golint + - varcheck + - unparam + - deadcode + - structcheck + - errcheck + - gosimple + - staticcheck + - unused + - ineffassign + - typecheck + - gosec + - megacheck + - misspell + - nakedret + - depguard + enable-all: false + disable: + disable-all: true + presets: + fast: false + + +issues: + # List of regexps of issue texts to exclude, empty list by default. + # But independently from this option we use default exclude patterns, + # it can be disabled by `exclude-use-default: false`. To list all + # excluded by default patterns execute `golangci-lint run --help` + exclude: + - "G304: Potential file inclusion via variable" + - "G204: Subprocess launched with variable" + - "G104: Errors unhandled" + - Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|.*Disconnect|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked + # unparam warns that return value is always nil for functions that have an obligatory error return value but cannot produce an error + - .*result 0 \(error\) is always nil + + # Independently from option `exclude` we use default exclude patterns, + # it can be disabled by this option. To list all + # excluded by default patterns execute `golangci-lint run --help`. + # Default value for this option is true. + exclude-use-default: false + + # Maximum issues count per one linter. Set to 0 to disable. Default is 50. + max-per-linter: 0 + + # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. + max-same: 0 + + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing + # large codebase. It's not practical to fix all existing issues at the moment + # of integration: much better don't allow issues in new code. + # Default is false. + new: false diff --git a/vendor/github.com/fibercrypto/skywallet-go/.travis.yml b/vendor/github.com/fibercrypto/skywallet-go/.travis.yml new file mode 100644 index 00000000..a3d62dc6 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/.travis.yml @@ -0,0 +1,93 @@ +language: go +dist: xenial +go: + - "1.12.x" +matrix: + include: + - os: linux + env: + - PIP='sudo pip' +env: + global: + - XARGS="-screen 0 1024x768x24" +before_install: + - source ./ci-scripts/install-$TRAVIS_OS_NAME.sh + +install: + - if [[ ! -d $GOPATH/src/github.com/fibercrypto/skywallet-go ]]; then mkdir -p $GOPATH/src/github.com/skycoin; ln -s $TRAVIS_BUILD_DIR $GOPATH/src/github.com/fibercrypto/skywallet-go; fi + - go get github.com/vektra/mockery/.../ + - cd $GOPATH/src/github.com/fibercrypto/skywallet-go + - make mocks + - make install-linters + - make lint + - go get -t ./... + +before_script: + # Install go dep + - curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + # Start Xvfb on osx + - if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then + ( sudo Xvfb :99 -ac ${XARGS}; echo "Xvfb ok" )& + fi + # Install hardware wallet for running tests against emulator + - mkdir -p tmp/hardware-wallet + - git clone --depth=1 --single-branch --branch develop https://github.com/skycoin/hardware-wallet.git tmp/hardware-wallet + - git -C tmp/hardware-wallet submodule update --init + # Install OS-specific test and build dependencies for hardware-wallet + - ( cd ./tmp/hardware-wallet && sh "ci-scripts/install-${TRAVIS_OS_NAME}.sh" ) + # Define env vars for Linux builds + - if [[ $TRAVIS_OS_NAME == 'linux' ]]; then + ls -l /usr/local/bin/protoc; + export PATH="/usr/local/bin:$(pwd)/tmp/hardware-wallet/protoc/bin:$PATH"; + fi + # Include paths for brew packages e.g. SDL2 + - if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + export SDL_INCLUDE="$(brew --prefix sdl2)/include/SDL2" ; + fi + - echo "PATH=$PATH"; + - echo "PIP=$PIP"; + +script: + - make check-version + - make -C tmp/hardware-wallet clean + - make -C tmp/hardware-wallet/tiny-firmware/protob install-protoc + - make -C tmp/hardware-wallet/tiny-firmware/protob/nanopb/vendor/nanopb/generator/proto + - make -C tmp/hardware-wallet emulator + # On GNU/Linux wrap emulator in xvfb graphics context + - if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then + xvfb-run --server-args="${XARGS}" make -C ./tmp/hardware-wallet run-emulator & true ; + fi + # On osx Xvfb started in before_script step + - if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then + make -C ./tmp/hardware-wallet run-emulator & true ; + fi + # Run self-tests + - ps aux | grep emulator + - make test_unit + - make test-integration-emulator + # Test that dependencies can be updated + - make clean + - make dep + +after_script: + - kill -s KILL $(pgrep emulator) + +notifications: + # https://github.com/kvld/travisci-telegram TravisCI Telegram Bot integration + webhooks: https://fathomless-fjord-24024.herokuapp.com/notify + +before_deploy: +- make release + +deploy: +- provider: releases + api_key: + secure: ee6xAJoQIXKy8w7DvSMWTpIVymJCzV4raj7MatahyEAtIuQZ0oGR35mxxTHC6/iEkVvOP8+i+g7LTnGgTc1OSJmSq9PwwG+3aNnBLtZbdEs/b+tKkA4xLoK3aRpWJ9dD2uusjI3z3gVqj3N6u3Y7idYPdMSC7+L0G72CdtL9bqjL2j2rStgv5Teb8i9P6uAPDl01uoN1mMBxfGoYES1i+MkRVKg+6In5V+eoar0h1o3zki33W5S0bGSJo3VbasCLoJIiTEDgcnM2rqfJeb07URbSLOBqhFOidVFi9QdfRVfMoRWYmCtiYKyXraCj6LgWbD+A90ZMfOJBBI6iTl2QRsNVge1Jz02MTofH2VGmOpvM7oKmkmvhHdNXnEH7zr1xSNpWDHobvY0Pl6aVoiwK3C+idk8SSfeohEJEuj5uTLRrf3qrafdcMx/YKCYHDyvhxG+zTy5I4+hwxIfT40juUqQkcUEZvsaf0aOKX25EO5aRTnQpkn9rWMytohmBSnm8D5SMlUgrhn3CVO8xysW+VlomAVPEDAVyqopiOJrsD5E8lnp0VuwA4NUC/Gp+ZrxYYgJhAX+utWtVYQ7I4egZ8lIzE3BMJRUxK4ZunlqHsiVqI7nrGEZHvxc2+ALp8mpsfWf6H4t1kfkHWt354cupSl8Z2UlwPW0fE2/XNjE6WSk= + file: + - skycoin-hw-cli-$(uname -s)-v$(VERSION_RAW) + skip_cleanup: true + draft: true + on: + repo: skycoin/hardware-wallet-go + tags: true + diff --git a/vendor/github.com/fibercrypto/skywallet-go/CHANGELOG.md b/vendor/github.com/fibercrypto/skywallet-go/CHANGELOG.md new file mode 100644 index 00000000..f05f8b79 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/CHANGELOG.md @@ -0,0 +1,63 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added + +### Fixed + +### Changed +- Change `protobuf` file definitions from http://github.com/skycoin/hardware-wallet-protob.git to http://github.com/fibercrypto/skywallet-go.git +- Be able to set the emulator ip as argument. + +### Removed + +### Security + +## v1.0.0 + +### Added + +- Add a new `Devicer` implementation (`Sequencer`) with atomics commands. +- Add flag `walletType` for `addressGen`, `signMessage` and `transactionSign`. +- Add travis CD instructions for github releases. +- Add BitEncodedFlags to encode/decode flags from/to a string. +- Add remove PIN code. +- Pretty(`json`) print features output. +- Add a progress bar, currently used in get entropy messages only. +- Add a `getRawEntropy` and `getMixedEntropy` to get entropy from the physical device. +- Use `protobuf` file definitions from a [`git submodule`](http://github.com/skycoin/hardware-wallet-protob.git). +- Mnemonic and recovery functions support `--wordCount` argument for seed sizes of `24` and `12` (default) . +- Add `-deviceType` flag and `DEVICE_TYPE` env var to set devicetype, options are `USB` or `EMULATOR`. +- Add autocomplete for cli +- Add `Devicer` and `DeviceDriver` interface for the hw wallet api to make it more testeable. +- Add mocks for `Devicer` and `DeviceDriver` interface. +- Add skycoin `v0.25.1` dependency. +- Support in apply settings command for configuring device label. +- Sign Skycoin transactions using `transactionSign` command. +- Add `SimulateButtonPress` function to simulate emulator button press. +- Define the device language through `-language` flag of `applySettings` command. Only `english` supported. +- Only connect to `USB` devices announcing Skycoin vendor and product through HID. +- Add `Available` function to check if a skycoin wallet is connected to the system. +- Added cli integration tests. + +### Fixed + +- Change protobuf messages for check signature to be consistent with [harware-wallet](https://github.com/skycoin/hardware-wallet/blob/2648cf384b5455c994ba54acf6a31cd1272c6f66/tiny-firmware/protob/messages.options#L21). +- CLI returns error during firmaware update if device is not in bootloader mode. + +### Changed + +- Change project structure to follow standard project layout. +- Replace `hardware-wallet-protob` submodule with a dep dependency. +- Updated usblib to fix issue on windows. +- Rename `device-wallet` package to `skywallet`. + +### Removed + +- Remove `protobuf` files from the project. +- Installation instructions for `protobuf` related tools, use this from `hardware-wallet-protob` submodule. diff --git a/vendor/github.com/fibercrypto/skywallet-go/Gopkg.lock b/vendor/github.com/fibercrypto/skywallet-go/Gopkg.lock new file mode 100644 index 00000000..3936fe47 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/Gopkg.lock @@ -0,0 +1,180 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + digest = "1:7cb4fdca4c251b3ef8027c90ea35f70c7b661a593b9eeae34753c65499098bb1" + name = "github.com/cpuguy83/go-md2man" + packages = ["md2man"] + pruneopts = "UT" + revision = "7762f7e404f8416dfa1d9bb6a8c192aa9acb4d19" + version = "v1.0.10" + +[[projects]] + digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" + name = "github.com/davecgh/go-spew" + packages = ["spew"] + pruneopts = "UT" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" + +[[projects]] + branch = "develop" + digest = "1:ec1a1f7bbfba1362708324d1b7aff4153086c837cdfe13eabd241a4cc9bac44d" + name = "github.com/fibercrypto/skywallet-protob" + packages = [ + "go", + "go/google/protobuf", + ] + pruneopts = "UT" + revision = "8ce918b0c1c3d7e3d315ee19e2d097ea4ee78838" + +[[projects]] + digest = "1:4caab6f14c6b9654ccb7d398791d1f71a2d4e693ea508d29659a173e1b2e644a" + name = "github.com/gogo/protobuf" + packages = ["proto"] + pruneopts = "UT" + revision = "5628607bb4c51c3157aacc3a50f0ab707582b805" + version = "v1.3.1" + +[[projects]] + digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" + name = "github.com/konsorten/go-windows-terminal-sequences" + packages = ["."] + pruneopts = "UT" + revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" + version = "v1.0.2" + +[[projects]] + digest = "1:4a29eeb25603debe8f2098a9902c4d3851034cf70d33be428826e86e8c30a1b0" + name = "github.com/mattn/go-colorable" + packages = ["."] + pruneopts = "UT" + revision = "98ec13f34aabf44cc914c65a1cfb7b9bc815aef1" + version = "v0.1.4" + +[[projects]] + digest = "1:d62282425ffb75047679d7e2c3b980eea7f82c05ef5fb9142ee617ebac6e7432" + name = "github.com/mattn/go-isatty" + packages = ["."] + pruneopts = "UT" + revision = "88ba11cfdc67c7588b30042edf244b2875f892b6" + version = "v0.0.10" + +[[projects]] + branch = "master" + digest = "1:2b32af4d2a529083275afc192d1067d8126b578c7a9613b26600e4df9c735155" + name = "github.com/mgutz/ansi" + packages = ["."] + pruneopts = "UT" + revision = "9520e82c474b0a04dd04f8a40959027271bab992" + +[[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + pruneopts = "UT" + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + digest = "1:b36a0ede02c4c2aef7df7f91cbbb7bb88a98b5d253509d4f997dda526e50c88c" + name = "github.com/russross/blackfriday" + packages = ["."] + pruneopts = "UT" + revision = "05f3235734ad95d0016f6a23902f06461fcf567a" + version = "v1.5.2" + +[[projects]] + digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" + name = "github.com/sirupsen/logrus" + packages = ["."] + pruneopts = "UT" + revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" + version = "v1.4.2" + +[[projects]] + branch = "develop" + digest = "1:738ae44a75f643024f215f9b5c3c79f46c72f4327dc2fbeaec7ed92d7443f207" + name = "github.com/skycoin/skycoin" + packages = [ + "src/cipher", + "src/cipher/base58", + "src/cipher/ripemd160", + "src/cipher/secp256k1-go", + "src/cipher/secp256k1-go/secp256k1-go2", + "src/util/logging", + ] + pruneopts = "UT" + revision = "d7e4b2f3e31ea96bdcaba595507fde42baa156b9" + +[[projects]] + digest = "1:ac83cf90d08b63ad5f7e020ef480d319ae890c208f8524622a2f3136e2686b02" + name = "github.com/stretchr/objx" + packages = ["."] + pruneopts = "UT" + revision = "477a77ecc69700c7cdeb1fa9e129548e1c1c393c" + version = "v0.1.1" + +[[projects]] + digest = "1:d88ba57c4e8f5db6ce9ab6605a89f4542ee751b576884ba5271c2ba3d4b6f2d2" + name = "github.com/stretchr/testify" + packages = [ + "assert", + "mock", + "require", + "suite", + ] + pruneopts = "UT" + revision = "221dbe5ed46703ee255b1da0dec05086f5035f62" + version = "v1.4.0" + +[[projects]] + digest = "1:1d3ef3dd057d2eb1819e945f88cc83835296c9b7fb13ad3194c937c4e2891fee" + name = "github.com/urfave/cli" + packages = ["."] + pruneopts = "UT" + revision = "bfe2e925cfb6d44b40ad3a779165ea7e8aff9212" + version = "v1.22.0" + +[[projects]] + branch = "master" + digest = "1:bbe51412d9915d64ffaa96b51d409e070665efc5194fcf145c4a27d4133107a4" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + pruneopts = "UT" + revision = "e1110fd1c708ef015366ea01799a23c459593c47" + +[[projects]] + branch = "master" + digest = "1:a8d09768b9b35851f498a4ba24ef08b7a72aa29bdb1673324394443e076bb440" + name = "golang.org/x/sys" + packages = [ + "unix", + "windows", + ] + pruneopts = "UT" + revision = "4c7a9d0fe056d9d1de37e1409ca8a5c17accb46a" + +[[projects]] + digest = "1:f26a5d382387e03a40d1471dddfba85dfff9bf05352d7e42d37612677c4d3c5c" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "UT" + revision = "f90ceb4f409096b60e2e9076b38b304b8246e5fa" + version = "v2.2.5" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "github.com/fibercrypto/skywallet-protob/go", + "github.com/gogo/protobuf/proto", + "github.com/skycoin/skycoin/src/cipher", + "github.com/skycoin/skycoin/src/util/logging", + "github.com/stretchr/testify/mock", + "github.com/stretchr/testify/require", + "github.com/stretchr/testify/suite", + "github.com/urfave/cli", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/fibercrypto/skywallet-go/Gopkg.toml b/vendor/github.com/fibercrypto/skywallet-go/Gopkg.toml new file mode 100644 index 00000000..0eb6396b --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/Gopkg.toml @@ -0,0 +1,42 @@ +# Gopkg.toml example +# +# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + +[prune] + go-tests = true + unused-packages = true + + +[[constraint]] + name = "github.com/skycoin/skycoin" + branch = "develop" + +[[constraint]] + name = "github.com/gogo/protobuf" + version = "1.2.1" + +[[constraint]] + branch = "develop" + name = "github.com/fibercrypto/skywallet-protob" diff --git a/vendor/github.com/fibercrypto/skywallet-go/Makefile b/vendor/github.com/fibercrypto/skywallet-go/Makefile new file mode 100644 index 00000000..ebb41c30 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/Makefile @@ -0,0 +1,62 @@ +.DEFAULT_GOAL := help +.PHONY: all build +.PHONY: test_unit test_integration test +.PHONY: dep mocks +.PHONY: clean lint check format + +GOPATH ?= $(HOME)/go +UNAME_S ?= $(shell uname -s) +VERSION_RAW =$(shell ./ci-scripts/version.sh) +VERSION_MAJOR=$(shell echo $(VERSION_RAW) | tr -d v | cut -d. -f1) +VERSION_MINOR=$(shell echo $(VERSION_RAW) | cut -d. -f2) +VERSION_PATCH=$(shell echo $(VERSION_RAW) | cut -d. -f3) +FULL_VERSION =$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH) + +all: build + +build: + cd cmd/cli && ./install.sh + +dep: ## Ensure package dependencies are up to date + dep ensure -v + +mocks: ## Create all mock files for unit tests + echo "Generating mock files" + mockery -name Devicer -dir ./src/skywallet -case underscore -inpkg -testonly + mockery -name DeviceDriver -dir ./src/skywallet -case underscore -inpkg -testonly + +test-unit: ## Run unit tests + go test -v github.com/fibercrypto/skywallet-go/src/skywallet + +test-integration-emulator: ## Run emulator integration tests + ./ci-scripts/integration-test.sh -a -m EMULATOR -n emulator-integration + +test-integration-wallet: ## Run usb integration tests + ./ci-scripts/integration-test.sh -m USB -n wallet-integration + +test: test_unit test-integration-emulator ## Run all tests + +install-linters: ## Install linters + go get -u github.com/FiloSottile/vendorcheck + # For some reason this install method is not recommended, see https://github.com/golangci/golangci-lint#install + # However, they suggest `curl ... | bash` which we should not do + go get -u github.com/golangci/golangci-lint/cmd/golangci-lint + +check-version: + test "$(shell cat ./VERSION)" = "$(shell ./ci-scripts/version.sh)" + +check: lint test ## Perform self-tests + +lint: ## Run linters. Use make install-linters first. + golangci-lint run -c .golangci.yml ./... + vendorcheck ./... + +format: ## Formats the code. Must have goimports installed (use make install-linters). + goimports -w -local github.com/fibercrypto/skywallet-go ./cmd + goimports -w -local github.com/fibercrypto/skywallet-go ./src + +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +release: build + cp $(GOPATH)/bin/skycoin-hw-cli skycoin-hw-cli-$(UNAME_S)-v$(VERSION_RAW) diff --git a/vendor/github.com/fibercrypto/skywallet-go/README.md b/vendor/github.com/fibercrypto/skywallet-go/README.md new file mode 100644 index 00000000..a62079d0 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/README.md @@ -0,0 +1,316 @@ +![hwgo-01](https://user-images.githubusercontent.com/8619106/57969063-e6255000-798f-11e9-973e-9fdf7a0bd5fc.png) + +# Go bindings and CLI tool for the Skycoin hardware wallet + +[![Build Status](https://travis-ci.com/skycoin/hardware-wallet-go.svg?branch=master)](https://travis-ci.com/skycoin/hardware-wallet-go) + +## Table of contents + + +- [Installation](#installation) +- [Usage](#usage) + - [Download source code](#download-source-code) + - [Dependancies management](#dependancies-management) + - [Run](#run) +- [Development guidelines](#development-guidelines) + - [Versioning policies](#versioning-policies) + - [Running tests](#running-tests) + - [Releases](#releases) + - [Update the version](#update-the-version) + - [Pre-release testing](#pre-release-testing) + - [Creating release builds](#creating-release-builds) +- [Wiki](#wiki) + + +## Installation + +### Install golang + +https://github.com/golang/go/wiki/Ubuntu + +## Usage + +### Download source code + +```bash +$ go get github.com/fibercrypto/skywallet-go +``` + +### Dependancies management + +This project uses dep [dependancy manager](https://github.com/golang/dep). + +Don't modify anything under vendor/ directory without using [dep commands](https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md). + +Download dependencies using command: + +```bash +$ make dep +``` + +### Run + +```bash +$ go run cmd/cli/cli.go +``` + +See also [CLI README](https://github.com/fibercrypto/skywallet-go/blob/master/cmd/cli/README.md) for information about the Command Line Interface. + +# Development guidelines + +Code added in this repository should comply to development guidelines documented in [Skycoin wiki](https://github.com/skycoin/skycoin/wiki). + +The project has two branches: `master` and `develop`. + +- `develop` is the default branch and will always have the latest code. +- `master` will always be equal to the current stable release on the website, and should correspond with the latest release tag. + +# Versioning policies + +This go client library follows the [versioning rules for SkyWallet client libraries](https://github.com/skycoin/hardware-wallet/tree/develop/README.md#versioning-libraries) . + +# Running tests + +Library test suite can be run by running the following command + +``` +make test +``` + +If a physical SkyWallet device is connected then the test suite will exchange test messages with it. Likewise, the emulator will reply to test messages if executed in advance as follows. + +``` +git clone https://github.com/skycoin/hardware-wallet /some/path/to/hardware-wallet +make clean -C /some/path/to/hardware-wallet && make -C /some/path/to/hardware-wallet run-emulator +``` + +If neither the emulator nor a physical device are connected then tests will be skipped silently. + +# Releases + +# Update the version + +0. If the `master` branch has commits that are not in `develop` (e.g. due to a hotfix applied to `master`), merge `master` into `develop` (and fix any build or test failures) +0. Switch to a new release branch named `release-X.Y.Z` for preparing the release. +0. Run `make build` to make sure that the code base is up to date +0. Update `CHANGELOG.md`: move the "unreleased" changes to the version and add the date. +0. Follow the steps in [pre-release testing](#pre-release-testing) +0. Make a PR merging the release branch into `master` +0. Review the PR and merge it +0. Tag the `master` branch with the version number. Version tags start with `v`, e.g. `v0.20.0`. Sign the tag. If you have your GPG key in github, creating a release on the Github website will automatically tag the release. It can be tagged from the command line with `git tag -as v0.20.0 $COMMIT_ID`, but Github will not recognize it as a "release". +0. Tag the changeset of the `protob` submodule checkout with the same version number as above. +0. Release builds are created and uploaded by travis. To do it manually, checkout the master branch and follow the [create release builds instructions](#creating-release-builds). +0. Checkout `develop` branch and bump `tiny-firmware/VERSION` and `tiny-firmware/bootloader/VERSION` to next [`dev` version number](https://www.python.org/dev/peps/pep-0440/#developmental-releases). + + +# Pre-release testing + +Pre-release testing procedure requires [skycoin-cli](https://github.com/skycoin/skycoin/tree/develop/cmd/cli) of version strictly greater than `0.26.0`. Please [install it](https://github.com/skycoin/skycoin/blob/develop/cmd/cli/README.md#install) if not available in your system. Some operations in the process require [running a Skycoin node](https://github.com/skycoin/skycoin/tree/master/INTEGRATION.md#running-the-skycoin-node). Also clone [Skywallet firmware repository](https://github.com/skycoin/hardware-wallet/) in advance. + +The instructions that follow are meant to be followed for Skywallet devices flashed without memory protection. If your device memory is protected then some values might be different e.g. `firmwareFeatures`. + +During the process beware of the fact that running an Skycoin node in the background can block the Skywallet from running. + +Some values need to be known during the process. They are represented by the following variables: + +- `WALLET1`, `WALLET2`, ... names of wallets created by `skycoin_cli` +- `ADDRESS1`, `ADDRESS2`, ... Skycoin addresses +- `TXN1_RAW`, `TXN2_RAW`, ... transactions data encoded in hex dump format +- `TXN1_JSON`, `TXN2_JSON`, ... transactions data encoded in JSON format, if numeric index value matches the one of another variable with `RAW` prefix then both refer to the same transaction +- `TXN1_ID`, `TXN2_ID`, ... Hash ID of transactions after broadcasting to the P2P network +- `AMOUNT` represents an arbitrary number of coins +- `ID1`, `ID2`, `ID3`, ... unique ID values , usually strings identifying hardware or software artifacts +- `AUTHTOKEN` is a CSRF token for the Skycoin REST API + +Perform these actions before releasing: + +**Note** : In all cases `skycoin-cli` would be equivalent to `go run cmd/cli/cli.go` if current working directory set to `$GOPATH/src/github.com/skycoin/skycoin`. + +##### Run project test suite + +- Open a terminal window and run Skywallet emulator. Wait for emulator UI to display. +- From a separate trminal window run the test suite as follows +```sh +npm run test +``` +- Close emulator and plug Skywallet device. Run the same command another time. + +##### Run transaction tests + +- Create new wallet e.g. with `skycoin-cli` (or reuse existing wallet for testing purposes) +```sh +skycoin-cli walletCreate -f $WALLET1.wlt -l $WALLET1 +``` +- From command output take note of the seed `SEED1` and address `ADDRESS1` +- List wallet addresses and confirm that `ADDRESS1` is the only value in the list. +```sh +skycoin-cli listAddresses $WALLET1.wlt +``` +- Transfer funds to `ADDRESS1` in new wallet in two transactions +- Check balance +```sh +skycoin-cli addressBalance $ADDRESS1 +``` +- List address for `WALLET1` and check that `head_outputs` in response includes to outputs with `address` set to `ADDRESS1` +``` +skycoin-cli walletOutputs $WALLET1.wlt +``` +- [Get device features](cmd/cli/README.md#device-features) and check that: + * `vendor` is set to `Skycoin Foundation` + * `deviceId` is a string of 24 chars, which we'll refer to as `ID1` + * write down the value of `bootloaderHash` i.e. `ID2` + * `model` is set to `'1'` + * `fwMajor` is set to expected firmware major version number + * `fwMinor` is set to expected firmware minor version number + * `fwPatch` is set to expected firmware patch version number + * `firmwareFeatures` is set to `0` +- Ensure device is seedless by [wiping it](cmd/cli/README.md#wipe-device). Check that device ends up in home screen with `NEEDS SEED!` message at the top. +- [Recover seed](cmd/cli/README.md#recovery-device) `SEED1` in Skywallet device (`dry-run=false`). +- [Get device features](cmd/cli/README.md#device-features) and check that: + * `vendor` is set to `Skycoin Foundation` + * `deviceId` is set to `ID1` + * `pinProtection` is seto to `false` + * `passphraseProtection` is set to `false` + * `label` is set to `ID1` + * `initialized` is set to `true` + * `bootloaderHash` is set to `ID2` + * `passphraseCached` is set to `false` + * `needsBackup` is set to `false` + * `model` is set to `'1'` + * `fwMajor` is set to expected firmware major version number + * `fwMinor` is set to expected firmware minor version number + * `fwPatch` is set to expected firmware patch version number + * `firmwareFeatures` is set to `0` +- [Set device label](cmd/cli/README.md#apply-settings) to a new value , say `ID3`. Specify `usePassphrase=false`. +- [Get device features](cmd/cli/README.md#device-features) and check that: + * `label` is set to `ID3` + * all other values did not change with respect to previous step, especially `deviceId` + * as a result device label is displayed on top of Skycoin logo in device home screen +- Ensure you know at least two addresses for test wallet, if not, [generate some](cmd/cli/README.md#ask-device-to-generate-addresses). Choose the second and third in order, hereinafter referred to as `ADDRESS2`, `ADDRESS3` respectively +- Check that address sequence generated by SkyWallet matches the values generated by `skycoin-cli` +```sh +skycoin-cli walletAddAddresses -f $WALLET1.wlt -n 5 +``` +- Check once again with desktop wallet +- Create new transaction from `ADDRESS1` to `ADDRESS2` in test wallet (say `TXN_RAW1`) for an spendable amount higher than individual output's coins +```sh +export TXN1_RAW="$(skycoin-cli createRawTransaction -a $ADDRESS1 -f $WALLET1.wlt $ADDRESS2 $AMOUNT)" +echo $TXN1_RAW +``` +- Display transaction details and confirm that it contains at least two inputs +```sh +export TXN1_JSON=$(skycoin-cli decodeRawTransaction $TXN1_RAW) +echo $TXN1_JSON +``` +- [Sign transaction](cmd/cli/README.md#transaction-sign) with Skywallet by putting together a message using values resulting from previous step as follows. + * For each hash in transaction `inputs` array and in same order there should be + - an instance of `--inputHash` command line argument set to the very same hash + - an instance of `--inputIndex` set to `0`. + * For each source item in transaction `outputs` array and in the same order there should be command-line arguments set as follows: + - `--outputAddress` : source item's `dst` + - `--coin` : source item's `coins * 1000000` + - `--hour` : source item's `hours` + - `--addressIndex` : set to `0` if source item `address` equals `ADDRESS1` or to `1` otherwise +- Check that `signatures` array returned by hardware wallet includes entries for each and every transaction input +- [Check signatures](cmd/cli/README.md#ask-device-to-check-signature) were signed by corresponding addresses +- Create transaction `TXN2_JSON` by replacing `TXN1_JSON` signatures with the array returned by SkyWallet +- Use `TXN2_JSON` to obtain encoded transaction `TXN2_RAW` +```sh +export $TXN2_RAW=$( echo "$TXN2_JSON" | skycoin-cli encodeJsonTransaction --fix - | grep '"rawtx"' | cut -d '"' -f4) +echo $TXN2_RAW +``` +- Broadcast transaction. Refer to its id as `TXN2_ID` +```sh +export TXN2_ID=$(skycoin-cli broadcastTransaction $TXN2_RAW) +``` +- After a a reasonable time check that balance changed. +```sh +skycoin-cli walletBalance $WALLET1.wlt +``` +- Create a second wallet i.e. `WALLET2` +```sh +skycoin-cli walletCreate -f $WALLET2.wlt -l $WALLET2 +``` +- From command output take note of the seed `SEED2` and address `ADDRESS4` +- List `WALLET2` addresses and confirm that `ADDRESS4` is the only value in the list. +```sh +skycoin-cli lisAddresses $WALLET2.wlt +``` +- Transfer funds to `WALLET2` (if not already done) and check balance +```sh +skycoin-cli addressBalance $ADDRESS4 +``` +- Request CSRF token (i.e. `AUTHTOKEN`) using Skycoin REST API. +```sh +curl http://127.0.0.1:6420/api/v1/csrf +``` +- Use Skycoin REST API to create one transaction grabbing all funds from `ADDRESS1` (i.e. first address in `WALLET1` previously recovered in Skywallet device), `ADDRESS2` (i.e. second address in `WALLET1` previously recovered in Skywallet device) and `ADDRESS4` (i.e. first address in `WALLET2`) so as to transfer to the third address of `WALLET1` (i.e. `ADDRESS3`). Change should be sent back to `ADDRESS1`. In server response transaction JSON object (a.k.a `TNX3_JSON`) would be the object at `data.transaction` JSON path. If Skycoin node was started with default parameters this can be achieved as follows: +```sh +curl -X POST http://127.0.0.1:6420/api/v2/transaction -H 'content-type: application/json' -H "X-CSRF-Token: $AUTHTOKEN" -d "{ + \"hours_selection\": { + \"type\": \"auto\", + \"mode\": \"share\", + \"share_factor\": \"0.5\" + }, + \"addresses\": [\"$ADDRESS1\", \"$ADDRESS2\", \"$ADDRESS4\"], + \"change_address\": \"$ADDRESS1\", + \"to\": [{ + \"address\": \"$ADDRESS3\", + \"coins\": \"$AMOUNT\" + }], + \"ignore_unconfirmed\": false +}" +``` +- [Sign transaction](cmd/cli/README.md#transaction-sign) represented by `TXN3_JSON` for inputs owned by Skywallet (i.e. `WALLET1`) + * For each object in transaction `inputs` array there should be: + - an instance of `--inputHash` command line argument set to the value bound to object's `uxid` key + - an instance of `--inputIndex` set as follows + * empty string if input `address` is `ADDRESS4` + * `0` if input `address` is `ADDRESS1` + * `1` if input `address` is `ADDRESS2` + * For each source item in transaction `outputs` array there should be command-line arguments set as follows: + - `--outputAddress` : source item's `address` + - `--coin` : source item's `coins * 1000000` + - `--hour` : source item's `hours` + - `--addressIndex` set to 2 (since destination address is `ADDRESS3`) +- Check that signatures array includes one entry for every input except the one associated to `ADDRESS4`, which should be an empty string +- [Recover seed](cmd/cli/README.md#recovery-device) `SEED2` in Skywallet device (`dry-run=false`). +- [Sign transaction](cmd/cli/README.md#transaction-sign) represented by `TXN3_JSON` for inputs owned by Skywallet (i.e. `WALLET2`) + * For each hash in transaction `inputs` array and in same order there should be: + - an instance of `--inputHash` command line argument set to the value bound to object's `uxid` key + - an instance of `--inputIndex` set to a value as follows + * not set if input `address` is `ADDRESS1` + * not set if input `address` is `ADDRESS2` + * `0` if input `address` is `ADDRESS4` + * For each source item in transaction `outputs` array and in the same order there should be command-line arguments set as follows: + - `--outputAddress` : source item's `dst` + - `--coin` : source item's `coins * 1000000` + - `--hour` : source item's `hours` + - `--addressIndex` empty (since destination address `ADDRESS3` not owned by this wallet) +- Create a new transaction JSON object (a.k.a `TXN4_JSON`) from `TXN3_JSON` and the previous signatures like this + * `type` same as in `TXN3_JSON` + * `inner_hash` should be an empty string + * `sigs` returned by SkyWallet in same order as corresponding input + * `inputs` is an array of strings. For each item in `TXN3_JSON` `inputs` include the value of its `uxid` field in `TXN4_JSON` `inputs` array. Respect original order. + * `outputs` is an array of objects constructed out of `TXN3_JSON` `outputs` items, in te same order, as follows + - `dst` : source item's `address` + - `coins` : source item's `coins * 1000000` + - `hours` : source item's `hours` as integer +- Use `TXN4_JSON` to obtain encoded transaction `TXN4_RAW` +```sh +export $TXN4_RAW=$( echo "$TXN4_JSON" | skycoin-cli encodeJsonTransaction --fix - | grep '"rawtx"' | cut -d '"' -f4) +echo $TXN4_RAW +``` +- Broadcast transaction. Refer to its id as `TXN4_ID` +```sh +export TXN4_ID=$(skycoin-cli broadcastTransaction $TXN4_RAW) +``` +- After a a reasonable time check that wallets balance changed. +```sh +skycoin-cli walletBalance $WALLET1.wlt +skycoin-cli walletBalance $WALLET2.wlt +``` + +## Wiki + +More information in [the wiki](https://github.com/fibercrypto/skywallet-go/wiki) diff --git a/vendor/github.com/fibercrypto/skywallet-go/VERSION b/vendor/github.com/fibercrypto/skywallet-go/VERSION new file mode 100644 index 00000000..46b105a3 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/VERSION @@ -0,0 +1 @@ +v2.0.0 diff --git a/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/install-linux.sh b/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/install-linux.sh new file mode 100644 index 00000000..e713b2a5 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/install-linux.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -x + +sudo apt-get update +# USB HID enumeration libraries +sudo apt install libudev-dev libusb-1.0-0-dev +# SDL for building hardware wallet emulator +sudo apt install libsdl2-dev libsdl2-image-dev libegl1-mesa-dev libgles2-mesa-dev +# OpenGL swrast driver for xvfb +sudo apt install mesa-utils and libgl1-mesa-glx diff --git a/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/install-osx.sh b/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/install-osx.sh new file mode 100644 index 00000000..27e7de35 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/install-osx.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +set -x + +brew update +# USB HID enumeration libraries +# SDL for building hardware wallet emulator +brew install sdl2_image sdl2 mesa mesalib-glw + +brew update +# USB HID enumeration libraries +brew install libusb +# SDL for building hardware wallet emulator +brew install sdl2_image sdl2 mesa mesalib-glw diff --git a/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/integration-test.sh b/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/integration-test.sh new file mode 100755 index 00000000..241549da --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/integration-test.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +#Set Script Name variabl +SCRIPT=`basename ${BASH_SOURCE[0]}` + +MODE="emulator" +WALLET_TYPE="deterministic" +TIMEOUT="60m" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +FAILFAST="" +NAME="" +AUTO_PRESS_BUTTONS="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-m -- Testmode to run, EMULATOR or USB;" + echo "-r -- Run test with -run flag" + echo "-n -- Specific name for this test, affects coverage output files" + echo "-v -- Run test with -v flag" + echo "-f -- Run test with -failfast flag" + echo "-a -- Auto press buttons in emulator mode" + exit 1 +} + +while getopts "h?m:r:n:vfaw" args; do +case $args in + h|\?) + usage; + exit;; + m ) MODE=${OPTARG};; + r ) RUN_TESTS="-run ${OPTARG}";; + n ) NAME="-${OPTARG}";; + v ) VERBOSE="-v";; + f ) FAILFAST="-failfast";; + a ) AUTO_PRESS_BUTTONS="1";; + w ) WALLET_TYPE=${OPTARG};; + esac +done + + +set +e + +HW_GO_INTEGRATION_TESTS=1 HW_GO_INTEGRATION_TEST_MODE=$MODE HW_GO_INTEGRATION_TEST_WALLET_TYPE=$WALLET_TYPE AUTO_PRESS_BUTTONS=$AUTO_PRESS_BUTTONS \ + go test -count=1 ./src/cli/integration/... $FAILFAST -timeout=$TIMEOUT $VERBOSE $RUN_TESTS + +TEST_FAIL=$? + +exit $TEST_FAIL diff --git a/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/version.sh b/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/version.sh new file mode 100755 index 00000000..abf9c82e --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/ci-scripts/version.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +version=$(git describe --tags --exact-match HEAD 2> /dev/null) +if [ $? -ne 0 ] +then + version=$(cat ./VERSION 2> /dev/null) + if [ $? -ne 0 ] + then + version='v0.0.0' + fi +fi +echo $version diff --git a/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/README.md b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/README.md new file mode 100644 index 00000000..787a8445 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/README.md @@ -0,0 +1,619 @@ +# CLI Documentation + +Skycoin Hardware wallet command line interface + + + +- [CLI Documentation](#cli-documentation) + - [Install](#install) + - [Usage](#usage) + - [Apply settings](#apply-settings) + - [Examples](#examples-apply-settings) + - [Text output](#text-output-apply settings) + - [Update firmware](#update-firmware) + - [Ask device to generate addresses](#ask-device-to-generate-addresses) + - [Examples](#examples-ask-device-to-generate-addresses) + - [Text output](#text-output-ask-device-to-generate-addresses) + - [Configure device mnemonic](#configure-device-mnemonic) + - [Examples](#examples-configure-device-mnemonic) + - [Text output](#text-output-configure-device-mnemonic) + - [Ask device to generate mnemonic](#generate-mnemonic) + - [Examples](#examples-ask-device to generate mnemonic) + - [Text output](#text-output-ask-device-to-generate-mnemonic) + - [Configure device PIN code](#configure-device-pin-code) + - [Examples](#examples-configure-device-pin-code) + - [Text output](#text-output-configure-device-pin-code) + - [Ask device to sign message](#ask-device-to-sign-message) + - [Examples](#examples-ask-device-to-sign-message) + - [Text output](#text-output-ask-device-to-sign-message) + - [Ask device to check signature](#ask-device-to-check-signature) + - [Examples](#examples-ask-device-to-check-signature) + - [Text output](#text-output-ask-device-to-check-signature) + - [Note](#note) + - [Wipe device](#wipe-device) + - [Examples](#examples-wipe-device) + - [Text output](#text-output-wipe-device) + - [Ask the device to perform the seed backup procedure](#backup-device) + - [Examples](#examples-ask-the-device-to-perform-the-seed-backup-procedure) + - [Text output](#text-output-ask-the-device-to-perform-the-seed-backup-procedure) + - [Ask the device to perform the seed recovery procedure](#recovery-device) + - [Examples](#examples-ask-the-device-to-perform-the-seed-recovery-procedure) + - [Text output](#text-output-ask-the-device-to-perform-the-seed-recovery-procedure) + - [Ask the device Features](#device-features) + - [Ask the device to cancel the ongoing procedure](#device-cancel) + - [Ask the device to sign a transaction using the provided information](#transaction-sign) + - [Ask the device to get internal raw entropy](#get-raw-entropy) + - [Examples](#examples-ask-the-device-to-get-internal-raw-entropy) + - [Text output](#text-output-ask-the-device-to-get-internal-raw-entropy) + - [Ask the device to get internal mixed entropy](#get-mixed-entropy) + - [Examples](#examples-ask-the-device-to-get-internal-mixed-entropy) + - [Text output](#text-output-ask-the-device-to-get-internal-mixed-entropy) + + + + +## Install + +```bash +$ cd $GOPATH/src/github.com/fibercrypto/skywallet-go/ +$ ./install.sh +``` + +## Usage + +After the installation, you can run `skycoin-hw-cli` to see the usage: + +``` +$ skycoin-hw-cli + +NAME: + skycoin-hw-cli - the skycoin hardware wallet command line interface + +USAGE: + skycoin-hw-cli [global options] command [command options] [arguments...] + +VERSION: + 1.7.0 + +COMMANDS: + applySettings Apply settings. + setMnemonic Configure the device with a mnemonic. + features Ask the device Features. + generateMnemonic Ask the device to generate a mnemonic and configure itself with it. + addressGen Generate skycoin addresses using the firmware + firmwareUpdate Update device's firmware. + signMessage Ask the device to sign a message using the secret key at given index. + checkMessageSignature Check a message signature matches the given address. + setPinCode Configure a PIN code on a device. + removePinCode Remove a PIN code on a device. + wipe Ask the device to wipe clean all the configuration it contains. + backup Ask the device to perform the seed backup procedure. + recovery Ask the device to perform the seed recovery procedure. + cancel Ask the device to cancel the ongoing procedure. + transactionSign Ask the device to sign a transaction using the provided information. + getRawEntropy Get device raw internal entropy and write it down to a file + getMixedEntropy Get device internal mixed entropy and write it down to a file + getUsbDetails Ask host usb about details for the hardware wallet + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS: + --help, -h show help + --version, -v print the version +``` + +All commands accept `--deviceType` option. Supported values are `USB` and `EMULATOR`. + +### Internal entropy + +There are two kinds of internal entropy, [`getRawEntropy`](#get-raw-entropy) and `getMixedEntropy`(#get-mixed-entropy). The difference between this two are that raw entropy comes from a random buffer function that uses a peripheral device under the hood, in the other hand the mixed entropy comes from a salted entropy source as described in [this FAQ](https://github.com/skycoin/hardware-wallet/blob/develop/FAQ.md#random-source). + + +### Apply settings + +Configure device with settings such as: using passphrase, configuring label, setting device language + + +``` +OPTIONS: + --usePassphrase bool Use this option if you want to activate passphrase on device + --language string Configure device language + --label string Configure label to identify the device +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli applySettings --usePassphrase +``` +
+ View Output + +``` +2018/12/21 16:14:25 language:"" label:"" use_passphrase:true +PinMatrixRequest response: 5959 +2018/12/21 16:14:34 Setting pin: 5959 +2018/12/21 16:14:34 Calling DecodeSuccessOrFailMsg on message kind 26 +2018/12/21 16:14:34 MessagePinMatrixAck Answer is: 26 / +Success with code: Settings applied +``` +
+ +Configure device with settings such as: change language + + +```bash +$ skycoin-hw-cli applySettings --language en +``` +
+ View Output + +``` +[2019-03-24T17:02:36-04:00] INFO [device-wallet]: language:"en" label:"" use_passphrase:false +Success with code: Settings applied +``` +
+ +### Update firmware + +To update firmware from a usb message, the device needs to be in "bootloader mode". To turn on on "bootloader mode" unplug your device, hold both buttons at the same time and plug it back on. + +The use this command: + + +```bash +$ skycoin-hw-cli firmwareUpdate --file=[your firmware .bin file] +``` + +``` +OPTIONS: + --file string Path to your firmware file +``` + +### Ask device to generate addresses + +Generate skycoin addresses using the firmware + +```bash +$ skycoin-hw-cli addressGen [number of addresses] [start index] +``` + +``` +OPTIONS: + --addressN value Number of addresses to generate. Assume 1 if not set. (default: 1) + --startIndex value Index where deterministic key generation will start from. Assume 0 if not set. (default: 0) + --confirmAddress If requesting one address it will be sent only if user confirms operation by pressing device's button. + --deviceType value Device type to send instructions to, hardware wallet (USB) or emulator. [$DEVICE_TYPE] + --walletType value Wallet type. Types are "deterministic" or "bip44" +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli addressGen --addressN=2 --startIndex=0 +``` +
+ View Output + +``` +MessageSkycoinAddress 117! array size is 2 +MessageSkycoinAddress 117! Answer is: 2EU3JbveHdkxW6z5tdhbbB2kRAWvXC2pLzw +MessageSkycoinAddress 117! Answer is: zC8GAQGQBfwk7vtTxVoRG7iMperHNuyYPs +``` +
+ +### Configure device mnemonic + +Configure the device with a mnemonic. + +```bash +$ skycoin-hw-cli setMnemonic [mnemonic] +``` + +``` +OPTIONS: + --mnemonic value Mnemonic that will be stored in the device to generate addresses. +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli setMnemonic --mnemonic="cloud flower upset remain green metal below cup stem infant art thank" +``` +
+ View Output + +``` +MessageButtonAck Answer is: 2 / +Ecloud flower upset remain green metal below cup stem infant art thank +``` +
+ +### Generate mnemonic + +Ask the device to generate a mnemonic and configure itself with it. + +```bash +$ skycoin-hw-cli generateMnemonic +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli generateMnemonic +``` +
+ View Output + +``` +2018/11/06 14:41:50 MessageButtonAck Answer is: 2 / + Mnemonic successfully configured +``` +
+ +### Configure device PIN code + +Configure the device with a pin code. + +```bash +$ skycoin-hw-cli setPinCode +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli setPinCode +``` +
+ View Output + +``` +MessageButtonAck Answer is: 18 / + +PinMatrixRequest response: 5757 +Setting pin: 5757 + +MessagePinMatrixAck Answer is: 18 / + +PinMatrixRequest response: 4343 +Setting pin: 4343 + +MessagePinMatrixAck Answer is: 18 / + +PinMatrixRequest response: 6262 +Setting pin: 6262 + +MessagePinMatrixAck Answer is: 2 / + +PIN changed +``` + +
+ +### Ask device to sign message + +Ask the device to sign a message using the secret key at given index. + +```bash +$ skycoin-hw-cli signMessage [address index] [message to sign] +``` + +``` +OPTIONS: + --addressIndex value Index of the address that will issue the signature. Assume 0 if not set. (default: 0) + --message value The message that the signature claims to be signing. + --deviceType value Device type to send instructions to, hardware wallet (USB) or emulator. [$DEVICE_TYPE] + --walletType value Wallet type. Types are "deterministic" or "bip44" +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli signMessage --addressN=2 --message="Hello World!" +``` +
+ View Output + +``` +Success 2! address that issued the signature is: DEK8o3Dnnp8UfTZrZCcCPCA6oRLqDeuKKy85YoTmCjfR2xDcZCz1j6tC4nmaAxHH15wgff88R2xPatT4MRvGHz9nf +``` +
+ +### Ask device to check signature + +Check a message signature matches the given address. + +```bash +$ skycoin-hw-cli checkMessageSignature [address] [signed message] [signature] +``` + +``` +OPTIONS: + --address value Address that issued the signature. + --message value The message that the signature claims to be signing. + --signature value Signature of the message. +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli checkMessageSignature --address=2EU3JbveHdkxW6z5tdhbbB2kRAWvXC2pLzw --message="Hello World!" --signature=GvKS4S3CA2YTpEPFA47yFdC5CP3y3qB18jwiX1URXqWQTvMjokd3A4upPz4wyeAyKJEtRdRDGUvUgoGASpsTTUeMn +``` +
+ View Output + +``` +Success 2! address that issued the signature is: +#2EU3JbveHdkxW6z5tdhbbB2kRAWvXC2pLzw + +``` +
+ +#### Note + +The `[option]` in subcommand must be set before the rest of the values, otherwise the `option` won't +be parsed. For example: + +If we want to specify a `change address` in `send` command, we can use `-c` option, if you run +the command in the following way: + +```bash +$ skycoin-cli send $RECIPIENT_ADDRESS $AMOUNT -c $CHANGE_ADDRESS +``` + +The change coins won't go to the address as you wish, it will go to the +default `change address`, which can be by `from` address or the wallet's +coinbase address. + +The right script should look like this: + +```bash +$ skycoin-hw-cli send -c $CHANGE_ADDRESS $RECIPIENT_ADDRESS $AMOUNT +``` + +### Wipe device + +Ask the device to generate a mnemonic and configure itself with it. + +```bash +$ skycoin-hw-cli wipe +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli wipe +``` +
+ View Output + +``` +2018/11/06 16:00:28 Wipe device 26! Answer is: 0806 +2018/11/06 16:00:31 MessageButtonAck Answer is: 2 / + +Device wiped +``` +
+ +### Backup device + +Ask the device to perform the seed backup procedure. + +```bash +$ skycoin-hw-cli backup +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli backup +``` +
+ View Output + +``` +2018/11/15 17:13:40 Backup device 26! Answer is: +2018/11/15 17:14:58 Success 2! Answer is: Seed successfully backed up +``` +
+ +### Recovery device + +Ask the device to perform the seed recovery procedure. + +```bash +$ skycoin-hw-cli recovery +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli recovery +``` +
+ View Output + +``` +2018/12/07 17:50:26 Recovery device 46! Answer is: +Word: market +Word: gaze +Word: crouch +Word: enforce +Word: green +Word: art +Word: stem +Word: infant +Word: host +Word: metal +Word: flower +Word: cup +Word: exit +Word: thank +Word: upset +Word: cloud +Word: below +Word: body +Word: remain +Word: vocal +Word: team +Word: discover +Word: core +Word: abuse +Failed with code: The seed is valid but does not match the one in the device +``` +
+ +### Device features + +Ask the device Features. + +```bash +$ skycoin-hw-cli features +``` + +
+ View Output + +``` +2018/12/07 17:54:20 Vendor: Skycoin Foundation +MajorVersion: 1 +MinorVersion: 6 +PatchVersion: 1 +BootloaderMode: false +DeviceId: 453543343446324545394145393446463443463634434445 +PinProtection: false +PassphraseProtection: false +Language: +Label: +Initialized: true +BootloaderHash: 765b3ec3a9c5b2f70326d0afce869cef5d1081124b91e1440b5b96a41436b723 +PinCached: false +PassphraseCached: false +FirmwarePresent: false +NeedsBackup: true +Model: 1 +FwMajor: 0 +FwMinor: 0 +FwPatch: 0 +FwVendor: +FwVendorKeys: +UnfinishedBackup: false +FirmwareFeatures: 0 +``` +
+ +- `FirmwareFeatures` is interpreted as a bits slice as follows + * bit `0` (i.e. mask `0x1`) is active if user confirmation required prior to returning internal entropy + * bit `1` (i.e. mask `0x2`) set if support for sending internal entropy back to the peer is enabled in firmware. + * bit `2` (i.e. mask `0x4`) set if device is the emulator. + +### Device cancel + +Ask the device to cancel the ongoing procedure. + +```bash +$ skycoin-hw-cli cancel +``` + +
+ View Output + +``` +2018/12/10 15:06:42 Action cancelled by user +``` +
+ +### Transaction sign + +Ask the device to sign a message using the secret key at given index. + +``` +OPTIONS: + --inputHash value Hash of the Input of the transaction we expect the device to sign + --inputIndex value Index of the input in the wallet + --outputAddress value Addresses of the output for the transaction + --coin value Amount of coins + --hour value Number of hours + --addressIndex value If the address is a return address tell its index in the wallet + --deviceType value Device type to send instructions to, hardware wallet (USB) or emulator. [$DEVICE_TYPE] + --walletType value Wallet type. Types are "deterministic" or "bip44" +``` + +```bash +$ skycoin-hw-cli transactionSign --inputHash a885343cc57aedaab56ad88d860f2bd436289b0248d1adc55bcfa0d9b9b807c3 --inputIndex=0 --outputAddress=zC8GAQGQBfwk7vtTxVoRG7iMperHNuyYPs --coin=1000000 --hour=1 +``` + +
+ View Output + +``` +[a885343cc57aedaab56ad88d860f2bd436289b0248d1adc55bcfa0d9b9b807c3] [0] +[zC8GAQGQBfwk7vtTxVoRG7iMperHNuyYPs] [1000000] [1] [] +``` +
+ +### Get raw entropy + +Ask the device to get internally generated [raw entropy](#internal-entropy). + +``` +OPTIONS: + --entropyBytes value Total number of how many bytes of raw entropy to read. (default: 1048576) + --outFile value File path to write out the raw entropy buffers, a "-" set the file to stdout. (default: "-") + --deviceType value Device type to send instructions to, hardware wallet (USB) or emulator. [$DEVICE_TYPE] +``` + +#### Examples +##### Text output +```bash +$ skycoin-hw-cli getRawEntropy --outFile - --entropyBytes 33 +``` + +
+ View Output + +``` +INFO [skycoin-hw-cli]: Getting raw entropy from device +[23 239 184 152 31 15 62 85 216 241 180 64 251 108 122 204 241 116 35 96 112 154 122 162 53 243 178 209 28 43 99 174 79] +``` +
+ +A real example about how to use this feature can be checked at the [TRNG validation](https://github.com/skycoin/hardware-wallet/tree/8edc2a28027875f464b68348c44fb188efb4dfbb#validate-the-trng) (please get noticed that the firmware should be build with this feature enabled trough `ENABLE_GETENTROPY`). The tool is use specifically [from here](https://github.com/skycoin/hardware-wallet/blob/8edc2a28027875f464b68348c44fb188efb4dfbb/trng-test/Makefile#L7-L8). + +### Get mixed entropy + +Ask the device to get internally generated [mixed entropy](#internal-entropy). + +``` +OPTIONS: + --entropyBytes value Total number of how many bytes of mixed entropy to read. (default: 1048576) + --outFile value File path to write out the mixed entropy buffers, a "-" set the file to stdout. (default: "-") + --deviceType value Device type to send instructions to, hardware wallet (USB) or emulator. [$DEVICE_TYPE] +``` + +#### Examples +##### Text output + +```bash +$ skycoin-hw-cli getMixedEntropy --outFile - --entropyBytes 33 +``` + +
+ View Output + +``` +INFO [skycoin-hw-cli]: Getting mixed entropy from device +[78 81 147 249 42 193 246 64 113 249 212 43 216 233 38 198 9 31 24 178 19 109 62 110 195 44 176 147 158 146 80 215 191] +``` +
+ +A real example about how to use this feature can be checked at the [TRNG validation](https://github.com/skycoin/hardware-wallet/tree/8edc2a28027875f464b68348c44fb188efb4dfbb#validate-the-trng) (please get noticed that the firmware should be build with this feature enabled trough `ENABLE_GETENTROPY`). The tool is use specifically [from here](https://github.com/skycoin/hardware-wallet/blob/8edc2a28027875f464b68348c44fb188efb4dfbb/trng-test/Makefile#L7-L8). \ No newline at end of file diff --git a/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/autocomplete/bash_autocomplete b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/autocomplete/bash_autocomplete new file mode 100644 index 00000000..b2b871d0 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/autocomplete/bash_autocomplete @@ -0,0 +1,14 @@ +#! /bin/bash + +: ${PROG:=$(basename ${BASH_SOURCE})} + +_cli_bash_autocomplete() { + local cur opts base + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion ) + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + return 0 + } + + complete -F _cli_bash_autocomplete $PROG diff --git a/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/autocomplete/zsh_autocomplete b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/autocomplete/zsh_autocomplete new file mode 100644 index 00000000..5430a18f --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/autocomplete/zsh_autocomplete @@ -0,0 +1,5 @@ +autoload -U compinit && compinit +autoload -U bashcompinit && bashcompinit + +script_dir=$(dirname $0) +source ${script_dir}/bash_autocomplete diff --git a/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/cli.go b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/cli.go new file mode 100644 index 00000000..05a9fe80 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/cli.go @@ -0,0 +1,21 @@ +package main + +import ( + "fmt" + "os" + + "github.com/fibercrypto/skywallet-go/src/cli" +) + +func main() { + app, err := cli.NewApp() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := app.Run(os.Args); err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/install.sh b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/install.sh new file mode 100755 index 00000000..982f89d5 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/cmd/cli/install.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +go build -o $GOPATH/bin/skycoin-hw-cli . diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/address_gen.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/address_gen.go new file mode 100644 index 00000000..868beeba --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/address_gen.go @@ -0,0 +1,55 @@ +package cli + +import ( + messages "github.com/fibercrypto/skywallet-protob/go" + + gcli "github.com/urfave/cli" +) + +func addressGenCmd() gcli.Command { + name := "addressGen" + return gcli.Command{ + Name: name, + Usage: "Generate skycoin addresses using the firmware", + Description: "", + Flags: []gcli.Flag{ + gcli.IntFlag{ + Name: "addressN", + Value: 1, + Usage: "Number of addresses to generate. Assume 1 if not set.", + }, + gcli.IntFlag{ + Name: "startIndex", + Value: 0, + Usage: "Index where deterministic key generation will start from. Assume 0 if not set.", + }, + gcli.BoolFlag{ + Name: "confirmAddress", + Usage: "If requesting one address it will be sent only if user confirms operation by pressing device's button.", + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + gcli.StringFlag{ + Name: "walletType", + Usage: "Wallet type. Types are \"deterministic\" or \"bip44\"", + Required: true, + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + walletType := c.String("walletType") + addressN := c.Int("addressN") + startIndex := c.Int("startIndex") + confirmAddress := c.Bool("confirmAddress") + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.AddressGen(uint32(addressN), uint32(startIndex), confirmAddress, walletType) + handleFinalResponse(msg, err, "unable to get address", messages.MessageType_MessageType_ResponseSkycoinAddress) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/apply_settings.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/apply_settings.go new file mode 100644 index 00000000..636f805e --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/apply_settings.go @@ -0,0 +1,53 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + messages "github.com/fibercrypto/skywallet-protob/go" +) + +func applySettingsCmd() gcli.Command { + name := "applySettings" + return gcli.Command{ + Name: name, + Usage: "Apply settings.", + Description: "", + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "usePassphrase", + Usage: "Configure a passphrase (true or false)", + }, + gcli.StringFlag{ + Name: "label", + Usage: "Configure a device label", + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + gcli.StringFlag{ + Name: "language", + Usage: "Configure a device language", + Value: "", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + passphrase := c.String("usePassphrase") + label := c.String("label") + language := c.String("language") + usePassphrase, _err := parseBool(passphrase) + if _err != nil { + log.Errorln("Valid values for usePassphrase are true or false") + return + } + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.ApplySettings(usePassphrase, label, language) + handleFinalResponse(msg, err, "unable to apply settings", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/backup.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/backup.go new file mode 100644 index 00000000..4419e6c2 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/backup.go @@ -0,0 +1,32 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + messages "github.com/fibercrypto/skywallet-protob/go" +) + +func backupCmd() gcli.Command { + name := "backup" + return gcli.Command{ + Name: name, + Usage: "Ask the device to perform the seed backup procedure.", + Description: "", + OnUsageError: onCommandUsageError(name), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + Action: func(c *gcli.Context) { + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.Backup() + handleFinalResponse(msg, err, "unable to create backup", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/cancel.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/cancel.go new file mode 100644 index 00000000..8f95af86 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/cancel.go @@ -0,0 +1,31 @@ +package cli + +import ( + messages "github.com/fibercrypto/skywallet-protob/go" + gcli "github.com/urfave/cli" +) + +func cancelCmd() gcli.Command { + name := "cancel" + return gcli.Command{ + Name: name, + Usage: "Ask the device to cancel the ongoing procedure.", + Description: "", + OnUsageError: onCommandUsageError(name), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + Action: func(c *gcli.Context) { + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.Cancel() + handleFinalResponse(msg, err, "unable to cancel", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/check_message_signature.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/check_message_signature.go new file mode 100644 index 00000000..923ec5ad --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/check_message_signature.go @@ -0,0 +1,46 @@ +package cli + +import ( + messages "github.com/fibercrypto/skywallet-protob/go" + gcli "github.com/urfave/cli" +) + +func checkMessageSignatureCmd() gcli.Command { + name := "checkMessageSignature" + return gcli.Command{ + Name: name, + Usage: "Check a message signature matches the given address.", + Description: "", + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "message", + Usage: "The message that the signature claims to be signing.", + }, + gcli.StringFlag{ + Name: "signature", + Usage: "Signature of the message.", + }, + gcli.StringFlag{ + Name: "address", + Usage: "Address that issued the signature.", + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + message := c.String("message") + signature := c.String("signature") + address := c.String("address") + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.CheckMessageSignature(message, signature, address) + handleFinalResponse(msg, err, "unable to check message signature", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/cli.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/cli.go new file mode 100644 index 00000000..828802d0 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/cli.go @@ -0,0 +1,130 @@ +/* +Package cli implements an interface for creating a CLI application. +*/ +package cli + +import ( + "fmt" + "github.com/skycoin/skycoin/src/util/logging" + gcli "github.com/urfave/cli" +) + +const ( + // Version is the CLI Version + Version = "1.7.0" +) + +var ( + commandHelpTemplate = fmt.Sprintf(`USAGE: + {{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Category}} + +CATEGORY: + {{.Category}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if .VisibleFlags}} + +OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}} +`) + + appHelpTemplate = fmt.Sprintf(`NAME: + {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} + +VERSION: + {{.Version}}{{end}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if len .Authors}} + +AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: + {{range $index, $author := .Authors}}{{if $index}} + {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} + +COMMANDS:{{range .VisibleCategories}}{{if .Name}} + {{.Name}}:{{end}}{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} + +GLOBAL OPTIONS: + {{range $index, $option := .VisibleFlags}}{{if $index}} + {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} + +COPYRIGHT: + {{.Copyright}}{{end}} +`) + + log = logging.MustGetLogger("skycoin-hw-cli") +) + +// App Wraps the app so that main package won't use the raw App directly, +// which will cause import issue +type App struct { + gcli.App +} + +// NewApp creates an app instance +func NewApp() (*App, error) { + gcli.AppHelpTemplate = appHelpTemplate + gcli.SubcommandHelpTemplate = commandHelpTemplate + gcli.CommandHelpTemplate = commandHelpTemplate + + gcliApp := gcli.NewApp() + + app := &App{ + App: *gcliApp, + } + + commands := []gcli.Command{ + applySettingsCmd(), + setMnemonicCmd(), + featuresCmd(), + generateMnemonicCmd(), + addressGenCmd(), + firmwareUpdate(), + signMessageCmd(), + checkMessageSignatureCmd(), + setPinCode(), + removePinCode(), + wipeCmd(), + backupCmd(), + recoveryCmd(), + cancelCmd(), + transactionSignCmd(), + getRawEntropyCmd(), + getMixedEntropyCmd(), + getUsbDetails(), + } + + app.Name = "skycoin-hw-cli" + app.Version = Version + app.Usage = "the skycoin hardware wallet command line interface" + app.Commands = commands + app.EnableBashCompletion = true + app.OnUsageError = func(context *gcli.Context, err error, _ bool) error { + fmt.Fprintf(context.App.Writer, "Error: %v\n\n", err) + return gcli.ShowAppHelp(context) + } + app.CommandNotFound = func(_ *gcli.Context, command string) { + tmp := fmt.Sprintf("{{.HelpName}}: '%s' is not a {{.HelpName}} command. See '{{.HelpName}} --help'.\n", command) + gcli.HelpPrinter(app.Writer, tmp, app) + gcli.OsExiter(1) + } + + return app, nil +} + +// Run starts the app +func (app *App) Run(args []string) error { + return app.App.Run(args) +} + +func onCommandUsageError(command string) gcli.OnUsageErrorFunc { + return func(c *gcli.Context, err error, _ bool) error { + fmt.Fprintf(c.App.Writer, "Error: %v\n\n", err) + return gcli.ShowCommandHelp(c, command) + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/features.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/features.go new file mode 100644 index 00000000..226deb02 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/features.go @@ -0,0 +1,31 @@ +package cli + +import ( + messages "github.com/fibercrypto/skywallet-protob/go" + gcli "github.com/urfave/cli" +) + +func featuresCmd() gcli.Command { + name := "features" + return gcli.Command{ + Name: name, + Usage: "Ask the device Features.", + Description: "", + OnUsageError: onCommandUsageError(name), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + Action: func(c *gcli.Context) { + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.GetFeatures() + handleFinalResponse(msg, err, "unable to get features", messages.MessageType_MessageType_Features) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/firmware_update.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/firmware_update.go new file mode 100644 index 00000000..a09c822a --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/firmware_update.go @@ -0,0 +1,43 @@ +package cli + +import ( + "crypto/sha256" + "fmt" + "io/ioutil" + + gcli "github.com/urfave/cli" +) + +func firmwareUpdate() gcli.Command { + name := "firmwareUpdate" + return gcli.Command{ + Name: name, + Usage: "Update device's firmware.", + Description: "", + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "f, file", + Usage: "path to the firmware .bin file", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + filePath := c.String("file") + fmt.Printf("File : %s\n", filePath) + firmware, err := ioutil.ReadFile(filePath) + if err != nil { + panic(err) + } + fmt.Printf("Hash: %x\n", sha256.Sum256(firmware[0x100:])) + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + err = sq.FirmwareUpload(firmware, sha256.Sum256(firmware[0x100:])) + if err != nil { + log.Error(err) + return + } + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/generate_mnemonic.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/generate_mnemonic.go new file mode 100644 index 00000000..26731d55 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/generate_mnemonic.go @@ -0,0 +1,43 @@ +package cli + +import ( + messages "github.com/fibercrypto/skywallet-protob/go" + + gcli "github.com/urfave/cli" +) + +func generateMnemonicCmd() gcli.Command { + name := "generateMnemonic" + return gcli.Command{ + Name: name, + Usage: "Ask the device to generate a mnemonic and configure itself with it.", + Description: "", + Flags: []gcli.Flag{ + gcli.BoolFlag{ + Name: "usePassphrase", + Usage: "Configure a passphrase", + }, + gcli.IntFlag{ + Name: "wordCount", + Usage: "Use a specific (12 | 24) number of words for the Mnemonic", + Value: 12, + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + usePassphrase := c.Bool("usePassphrase") + wordCount := uint32(c.Uint64("wordCount")) + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.GenerateMnemonic(wordCount, usePassphrase) + handleFinalResponse(msg, err, "unable to generate mnemonic", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/get_mixed_entropy.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/get_mixed_entropy.go new file mode 100644 index 00000000..9c766765 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/get_mixed_entropy.go @@ -0,0 +1,58 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" +) + +func getMixedEntropyCmd() gcli.Command { + name := "getMixedEntropy" + return gcli.Command{ + Name: name, + Usage: "Get device internal mixed entropy and write it down to a file", + Action: func(c *gcli.Context) { + entropyBytes := uint32(c.Int("entropyBytes")) + outFile := c.String("outFile") + if len(outFile) == 0 { + log.Error("outFile is mandatory") + return + } + + device := skyWallet.NewDevice(skyWallet.DeviceTypeFromString(c.String("deviceType"))) + if device == nil { + return + } + defer device.Close() + + log.Infoln("Getting mixed entropy from device") + if err := device.SaveDeviceEntropyInFile(outFile, entropyBytes, skyWallet.MessageDeviceGetMixedEntropy); err != nil { + log.Error(err) + return + } + }, + OnUsageError: onCommandUsageError(name), + Subcommands: nil, + Flags: []gcli.Flag{ + gcli.IntFlag{ + Name: "entropyBytes", + Value: 1048576, + Usage: "Total number of how many bytes of mixed entropy to read.", + }, + gcli.StringFlag{ + Name: "outFile", + Usage: `File path to write out the mixed entropy buffers, a "-" set the file to stdout.`, + Value: "-", + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + SkipFlagParsing: false, + SkipArgReorder: false, + HideHelp: false, + Hidden: false, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/get_raw_entropy.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/get_raw_entropy.go new file mode 100644 index 00000000..373e22ed --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/get_raw_entropy.go @@ -0,0 +1,58 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" +) + +func getRawEntropyCmd() gcli.Command { + name := "getRawEntropy" + return gcli.Command{ + Name: name, + Usage: "Get device raw internal entropy and write it down to a file", + Action: func(c *gcli.Context) { + entropyBytes := uint32(c.Int("entropyBytes")) + outFile := c.String("outFile") + if len(outFile) == 0 { + log.Error("outFile is mandatory") + return + } + + device := skyWallet.NewDevice(skyWallet.DeviceTypeFromString(c.String("deviceType"))) + if device == nil { + return + } + defer device.Close() + + log.Infoln("Getting raw entropy from device") + if err := device.SaveDeviceEntropyInFile(outFile, entropyBytes, skyWallet.MessageDeviceGetRawEntropy); err != nil { + log.Error(err) + return + } + }, + OnUsageError: onCommandUsageError(name), + Subcommands: nil, + Flags: []gcli.Flag{ + gcli.IntFlag{ + Name: "entropyBytes", + Value: 1048576, + Usage: "Total number of how many bytes of raw entropy to read.", + }, + gcli.StringFlag{ + Name: "outFile", + Usage: `File path to write out the raw entropy buffers, a "-" set the file to stdout.`, + Value: "-", + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + SkipFlagParsing: false, + SkipArgReorder: false, + HideHelp: false, + Hidden: false, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/integration/empty.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/integration/empty.go new file mode 100644 index 00000000..76ab1b72 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/integration/empty.go @@ -0,0 +1 @@ +package integration diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/recovery.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/recovery.go new file mode 100644 index 00000000..8cd83fe8 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/recovery.go @@ -0,0 +1,53 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + messages "github.com/fibercrypto/skywallet-protob/go" +) + +func recoveryCmd() gcli.Command { + name := "recovery" + return gcli.Command{ + Name: name, + Usage: "Ask the device to perform the seed recovery procedure.", + Description: "", + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "usePassphrase", + Usage: "Configure a passphrase", + }, + gcli.BoolFlag{ + Name: "dryRun", + Usage: "perform dry-run recovery workflow (for safe mnemonic validation)", + }, + gcli.IntFlag{ + Name: "wordCount", + Usage: "Use a specific (12 | 24) number of words for the Mnemonic recovery", + Value: 12, + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + passphrase := c.String("usePassphrase") + usePassphrase, _err := parseBool(passphrase) + if _err != nil { + log.Errorln("Valid values for usePassphrase are true or false") + return + } + dryRun := c.Bool("dryRun") + wordCount := uint32(c.Uint64("wordCount")) + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.Recovery(wordCount, usePassphrase, dryRun) + handleFinalResponse(msg, err, "unable to recovery device", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/remove_pin_code.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/remove_pin_code.go new file mode 100644 index 00000000..54e3e726 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/remove_pin_code.go @@ -0,0 +1,34 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + messages "github.com/fibercrypto/skywallet-protob/go" +) + +func removePinCode() gcli.Command { + name := "removePinCode" + return gcli.Command{ + Name: name, + Usage: "Remove a PIN code on a device.", + Description: "", + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + removePin := new(bool) + *removePin = true + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.ChangePin(removePin) + handleFinalResponse(msg, err, "unable to remove pin", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/set_mnemonic.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/set_mnemonic.go new file mode 100644 index 00000000..3c3129ac --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/set_mnemonic.go @@ -0,0 +1,37 @@ +package cli + +import ( + messages "github.com/fibercrypto/skywallet-protob/go" + + gcli "github.com/urfave/cli" +) + +func setMnemonicCmd() gcli.Command { + name := "setMnemonic" + return gcli.Command{ + Name: name, + Usage: "Configure the device with a mnemonic.", + Description: "", + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "mnemonic", + Usage: "Mnemonic that will be stored in the device to generate addresses.", + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + mnemonic := c.String("mnemonic") + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.SetMnemonic(mnemonic) + handleFinalResponse(msg, err, "unable to set mnemonic", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/set_pin_code.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/set_pin_code.go new file mode 100644 index 00000000..07227649 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/set_pin_code.go @@ -0,0 +1,32 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + messages "github.com/fibercrypto/skywallet-protob/go" +) + +func setPinCode() gcli.Command { + name := "setPinCode" + return gcli.Command{ + Name: name, + Usage: "Configure a PIN code on a device.", + Description: "", + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.ChangePin(new(bool)) + handleFinalResponse(msg, err, "unable to change pin", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/sign_message.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/sign_message.go new file mode 100644 index 00000000..860335bd --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/sign_message.go @@ -0,0 +1,48 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + messages "github.com/fibercrypto/skywallet-protob/go" +) + +func signMessageCmd() gcli.Command { + name := "signMessage" + return gcli.Command{ + Name: name, + Usage: "Ask the device to sign a message using the secret key at given index.", + Description: "", + Flags: []gcli.Flag{ + gcli.IntFlag{ + Name: "addressIndex", + Value: 0, + Usage: "Index of the address that will issue the signature. Assume 0 if not set.", + }, + gcli.StringFlag{ + Name: "message", + Usage: "The message that the signature claims to be signing.", + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + gcli.StringFlag{ + Name: "walletType", + Usage: "Wallet type. Types are \"deterministic\" or \"bip44\"", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + addressIndex := c.Int("addressIndex") + message := c.String("message") + walletType := c.String("walletType") + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.SignMessage(1, addressIndex, message, walletType) + handleFinalResponse(msg, err, "unable to sign message", messages.MessageType_MessageType_ResponseSkycoinSignMessage) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/transaction_sign.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/transaction_sign.go new file mode 100644 index 00000000..533bc376 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/transaction_sign.go @@ -0,0 +1,97 @@ +package cli + +import ( + "fmt" + "github.com/gogo/protobuf/proto" + + gcli "github.com/urfave/cli" + + messages "github.com/fibercrypto/skywallet-protob/go" +) + +func transactionSignCmd() gcli.Command { + name := "transactionSign" + return gcli.Command{ + Name: name, + Usage: "Ask the device to sign a transaction using the provided information.", + Description: "", + Flags: []gcli.Flag{ + gcli.StringSliceFlag{ + Name: "inputHash", + Usage: "Hash of the Input of the transaction we expect the device to sign", + }, + gcli.IntSliceFlag{ + Name: "inputIndex", + Usage: "Index of the input in the wallet", + }, + gcli.StringSliceFlag{ + Name: "outputAddress", + Usage: "Addresses of the output for the transaction", + }, + gcli.Int64SliceFlag{ + Name: "coin", + Usage: "Amount of coins", + }, + gcli.Int64SliceFlag{ + Name: "hour", + Usage: "Number of hours", + }, + gcli.IntSliceFlag{ + Name: "addressIndex", + Usage: "If the address is a return address tell its index in the wallet", + }, + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + gcli.StringFlag{ + Name: "walletType", + Usage: "Wallet type. Types are \"deterministic\" or \"bip44\"", + Required: true, + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) { + inputs := c.StringSlice("inputHash") + inputIndex := c.IntSlice("inputIndex") + outputs := c.StringSlice("outputAddress") + coins := c.Int64Slice("coin") + hours := c.Int64Slice("hour") + addressIndex := c.IntSlice("addressIndex") + walletType := c.String("walletType") + if len(inputs) != len(inputIndex) { + fmt.Println("Every given input hash should have the an inputIndex") + return + } + if len(outputs) != len(coins) || len(outputs) != len(hours) { + fmt.Println("Every given output should have a coin and hour value") + return + } + var transactionInputs []*messages.SkycoinTransactionInput + var transactionOutputs []*messages.SkycoinTransactionOutput + for i, input := range inputs { + var transactionInput messages.SkycoinTransactionInput + transactionInput.HashIn = proto.String(input) + transactionInput.Index = proto.Uint32(uint32(inputIndex[i])) + transactionInputs = append(transactionInputs, &transactionInput) + } + for i, output := range outputs { + var transactionOutput messages.SkycoinTransactionOutput + transactionOutput.Address = proto.String(output) + transactionOutput.Coin = proto.Uint64(uint64(coins[i])) + transactionOutput.Hour = proto.Uint64(uint64(hours[i])) + if i < len(addressIndex) { + transactionOutput.AddressIndex = proto.Uint32(uint32(addressIndex[i])) + } + transactionOutputs = append(transactionOutputs, &transactionOutput) + } + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.TransactionSign(transactionInputs, transactionOutputs, walletType) + handleFinalResponse(msg, err, "unable to sign transaction", messages.MessageType_MessageType_ResponseTransactionSign) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/usbhid.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/usbhid.go new file mode 100644 index 00000000..32ac64df --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/usbhid.go @@ -0,0 +1,46 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" +) + +func getUsbDetails() gcli.Command { + name := "getUsbDetails" + return gcli.Command{ + Name: name, + Usage: "Ask host usb about details for the hardware wallet", + Description: "", + OnUsageError: onCommandUsageError(name), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + Action: func(c *gcli.Context) { + device := skyWallet.NewDevice(skyWallet.DeviceTypeFromString(c.String("deviceType"))) + if device == nil { + return + } + defer device.Close() + + infos, err := device.GetUsbInfo() + if err != nil { + log.Errorln(err) + } + for infoIdx := range infos { + log.Infoln("-----------------------------------------") + if infos[infoIdx].VendorID == skyWallet.SkycoinVendorID { + log.Printf("%-13d%-5s%s", infos[infoIdx].VendorID, "==>", "Skycoin Foundation") + } + if infos[infoIdx].ProductID == skyWallet.SkycoinHwProductID { + log.Printf("%-13d%-5s%s", infos[infoIdx].ProductID, "==>", "Hardware Wallet") + } + log.Printf("%-13s%-5s%s", "Device path", "==>", infos[infoIdx].Path) + } + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/utils.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/utils.go new file mode 100644 index 00000000..e89602a4 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/utils.go @@ -0,0 +1,100 @@ +package cli + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/sirupsen/logrus" + "github.com/fibercrypto/skywallet-go/src/integration/proxy" + "github.com/fibercrypto/skywallet-go/src/skywallet" + "github.com/fibercrypto/skywallet-go/src/skywallet/wire" + messages "github.com/fibercrypto/skywallet-protob/go" + "github.com/gogo/protobuf/proto" + "os" + "runtime" +) + +func parseBool(s string) (*bool, error) { + var b bool + switch s { + case "true": + b = true + case "false": + b = false + case "": + return nil, nil + default: + return nil, errors.New("Invalid boolean argument") + } + return &b, nil +} + +func createDevice(devType string) (skywallet.Devicer, error) { + device := skywallet.NewDevice(skywallet.DeviceTypeFromString(devType)) + if device == nil { + return nil, errors.New("got null device") + } + if os.Getenv("AUTO_PRESS_BUTTONS") == "1" && device.Driver.DeviceType() == skywallet.DeviceTypeEmulator && runtime.GOOS == "linux" { + err := device.SetAutoPressButton(true, skywallet.ButtonRight) + if err != nil { + log.Error(err) + return nil, err + } + } + return proxy.NewSequencer(device, false, func() string{ + var line string + fmt.Scanln(&line) + return line + }), nil +} + +func handleFinalResponse(msg wire.Message, err error, errMsg string, expectedMsgKind messages.MessageType) { + if err != nil { + logrus.WithError(err).Errorln(errMsg) + } + if msg.Kind != uint16(expectedMsgKind) { + logrus.Errorln(errMsg + "invalid state") + } + switch messages.MessageType(msg.Kind) { + case messages.MessageType_MessageType_ResponseSkycoinAddress: + msgStr, err := skywallet.DecodeResponseSkycoinAddress(msg) + if err != nil { + logrus.WithError(err).Errorln("unable to decode response") + } + fmt.Println(msgStr) + case messages.MessageType_MessageType_Success: + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + logrus.WithError(err).Errorln("unable to decode response") + } + fmt.Println(msgStr) + case messages.MessageType_MessageType_ResponseSkycoinSignMessage: + msgStr, err := skywallet.DecodeResponseSkycoinSignMessage(msg) + if err != nil { + logrus.WithError(err).Errorln("unable to decode response") + } + fmt.Println(msgStr) + case messages.MessageType_MessageType_ResponseTransactionSign: + msgStr, err := skywallet.DecodeResponseTransactionSign(msg) + if err != nil { + logrus.WithError(err).Errorln("unable to decode response") + } + fmt.Println(msgStr) + case messages.MessageType_MessageType_Features: + features := &messages.Features{} + if err = proto.Unmarshal(msg.Data, features); err != nil { + log.Error(err) + } + enc := json.NewEncoder(os.Stdout) + if err = enc.Encode(features); err != nil { + log.Errorln(err) + } + ff := skywallet.NewFirmwareFeatures(uint64(*features.FirmwareFeatures)) + if err := ff.Unmarshal(); err != nil { + log.Errorln(err) + } + log.Printf("\n\nFirmware features:\n%s", ff) + default: + logrus.Errorln("invalid state") + } +} \ No newline at end of file diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/cli/wipe.go b/vendor/github.com/fibercrypto/skywallet-go/src/cli/wipe.go new file mode 100644 index 00000000..385145d7 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/cli/wipe.go @@ -0,0 +1,32 @@ +package cli + +import ( + messages "github.com/fibercrypto/skywallet-protob/go" + + gcli "github.com/urfave/cli" +) + +func wipeCmd() gcli.Command { + name := "wipe" + return gcli.Command{ + Name: name, + Usage: "Ask the device to wipe clean all the configuration it contains.", + Description: "", + OnUsageError: onCommandUsageError(name), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "deviceType", + Usage: "Device type to send instructions to, hardware wallet (USB) or emulator.", + EnvVar: "DEVICE_TYPE", + }, + }, + Action: func(c *gcli.Context) { + sq, err := createDevice(c.String("deviceType")) + if err != nil { + return + } + msg, err := sq.Wipe() + handleFinalResponse(msg, err, "unable to wipe device", messages.MessageType_MessageType_Success) + }, + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/integration/proxy/sequencer.go b/vendor/github.com/fibercrypto/skywallet-go/src/integration/proxy/sequencer.go new file mode 100644 index 00000000..2f522181 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/integration/proxy/sequencer.go @@ -0,0 +1,405 @@ +package proxy //nolint goimports + +import ( + "errors" + "fmt" + "github.com/gogo/protobuf/proto" + "io/ioutil" + "sync" + + "github.com/fibercrypto/skywallet-go/src/skywallet" + "github.com/fibercrypto/skywallet-go/src/skywallet/wire" + messages "github.com/fibercrypto/skywallet-protob/go" + "github.com/skycoin/skycoin/src/util/logging" +) + +// Sequencer implementation force all messages to be sequential and make the +// command atomic +type Sequencer struct { + sync.Mutex + log *logging.MasterLogger + logCli *logging.MasterLogger + dev skywallet.Devicer + scan func()string +} + +// NewSequencer create a new sequencer instance +func NewSequencer(dev skywallet.Devicer, cliSpeechless bool, scanner func()string) skywallet.Devicer { + sq := &Sequencer{ + log: logging.NewMasterLogger(), + logCli: logging.NewMasterLogger(), + dev: dev, + scan: scanner, + } + if cliSpeechless { + sq.logCli.Out = ioutil.Discard + } + return sq +} + +func (sq *Sequencer) handleInputInteraction(msg wire.Message) (wire.Message, error) { + var err error + handleResponse := func(scopedMsg wire.Message, err error) (string, error) { + if err != nil { + sq.log.WithError(err).Errorln("sending message failed" ) + return "", errors.New("sending message failed") + } else if scopedMsg.Kind == uint16(messages.MessageType_MessageType_Success) { + msgStr, err := skywallet.DecodeSuccessMsg(scopedMsg) + if err != nil { + sq.log.WithError(err).Errorln("unable to decode response") + return "", errors.New(msgStr) + } + return msgStr, nil + } else if scopedMsg.Kind == uint16(messages.MessageType_MessageType_Failure) { + msgStr, err := skywallet.DecodeFailMsg(scopedMsg) + if err != nil { + sq.log.WithError(err).Errorln("unable to decode response") + return "", errors.New("unable to decode response") + } + return msgStr, nil + } else { + return "", errors.New("invalid state") + } + } + if msg.Kind == uint16(messages.MessageType_MessageType_PinMatrixRequest) { + pmr := &messages.PinMatrixRequest{} + if err = proto.Unmarshal(msg.Data, pmr); err != nil { + sq.log.WithError(err).Errorln("unable to decode PinMatrixRequest") + return wire.Message{}, err + } + if pmr.Type == nil { + sq.log.Errorln("pmr.Type should not be null") + return wire.Message{}, errors.New("unexpected null object") + } + switch *pmr.Type { + case messages.PinMatrixRequestType_PinMatrixRequestType_Current: + sq.log.Infoln("enter current pin:") + case messages.PinMatrixRequestType_PinMatrixRequestType_NewFirst: + sq.log.Infoln("enter new pin:") + case messages.PinMatrixRequestType_PinMatrixRequestType_NewSecond: + sq.log.Infoln("confirm new pin:") + default: + errStr := "unexpected PinMatrixRequestType" + sq.log.WithField("type", *pmr.Type).Errorln(errStr) + return wire.Message{}, errors.New(errStr) + } + pinEnc := sq.scan() + if msg, err = sq.dev.PinMatrixAck(pinEnc); err != nil { + sq.log.WithError(err).Errorln("pin matrixAck ack: sending message failed") + return wire.Message{}, err + } + return sq.handleInputInteraction(msg) + } else if msg.Kind == uint16(messages.MessageType_MessageType_PassphraseRequest) { + sq.log.Println("PassphraseRequest request:") + passphrase := sq.scan() + msg, err = sq.dev.PassphraseAck(passphrase) + msgStr, err := handleResponse(msg, err) + if err != nil { + sq.log.WithError(err).Errorln("passphrase ack: sending message failed") + return msg, err + } + sq.logCli.Infof("PassphraseAck response:", msgStr) + } else if msg.Kind == uint16(messages.MessageType_MessageType_WordRequest) { + fmt.Printf("Word: ") + word := sq.scan() + if msg, err = sq.dev.WordAck(word); err != nil { + sq.log.WithError(err).Errorln("word ack: sending message failed") + return msg, err + } + } else if msg.Kind == uint16(messages.MessageType_MessageType_ButtonRequest) { + if msg, err = sq.dev.ButtonAck(); err != nil { + sq.log.WithError(err).Errorln("handling message failed") + return msg, err + } + } + return msg, nil +} + +func (sq *Sequencer) handleFirstCommandResponse(successMsgKind messages.MessageType, commandName string, err error, msg wire.Message) (wire.Message, error) { + if err != nil { + sq.log.WithError(err).Errorln(commandName + ": sending message failed") + return wire.Message{}, err + } + for msg.Kind != uint16(successMsgKind) && msg.Kind != uint16(messages.MessageType_MessageType_Failure) { + if msg.Kind == uint16(messages.MessageType_MessageType_PinMatrixRequest) || msg.Kind == uint16(messages.MessageType_MessageType_PassphraseRequest) || msg.Kind == uint16(messages.MessageType_MessageType_ButtonRequest) { + if msg, err = sq.handleInputInteraction(msg); err != nil { + sq.log.WithError(err).Errorln("error handling interaction") + return wire.Message{}, err + } + } + } + return msg, err +} + +func (sq *Sequencer) handleFinalResponse(msg wire.Message, expectedMsgKind messages.MessageType) (wire.Message, error) { + if msg.Kind == uint16(expectedMsgKind) { + return msg, nil + } else if msg.Kind == uint16(messages.MessageType_MessageType_Failure) { + failMsg, err := skywallet.DecodeFailMsg(msg) + if err != nil { + sq.log.WithError(err).Errorln("unable to decode response") + return wire.Message{}, err + } + sq.log.Errorln(failMsg) + return wire.Message{}, errors.New(failMsg) + } + sq.log.Errorln("unexpected message") + return wire.Message{}, errors.New("unexpected message") +} + +// AddressGen forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) AddressGen(addressN, startIndex uint32, confirmAddress bool, walletType string) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.AddressGen(uint32(addressN), uint32(startIndex), confirmAddress, walletType) + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_ResponseSkycoinAddress, "address gen", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_ResponseSkycoinAddress) +} + +// ApplySettings forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) ApplySettings(usePassphrase *bool, label string, language string) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.ApplySettings(usePassphrase, label, language) + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_Success, "apply settings", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_Success) +} + +// Backup forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) Backup() (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.Backup() + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_Success, "backup", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_Success) +} + +// Cancel forward the call to Device +func (sq *Sequencer) Cancel() (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + return sq.dev.Cancel() +} + +// CheckMessageSignature forward the call to Device +func (sq *Sequencer) CheckMessageSignature(message, signature, address string) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + return sq.dev.CheckMessageSignature(message, signature, address) +} + +// ChangePin forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) ChangePin(removePin *bool) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.ChangePin(removePin) + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_Success, "change pin", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_Success) +} + +// Connected forward the call to Device +func (sq *Sequencer) Connected() bool { + sq.Lock() + defer sq.Unlock() + return sq.dev.Connected() +} + +// Available forward the call to Device +func (sq *Sequencer) Available() bool { + sq.Lock() + defer sq.Unlock() + return sq.dev.Available() +} + +// FirmwareUpload forward the call to Device +func (sq *Sequencer) FirmwareUpload(payload []byte, hash [32]byte) error { + sq.Lock() + defer sq.Unlock() + return sq.dev.FirmwareUpload(payload, hash) +} + +// GetFeatures forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) GetFeatures() (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.GetFeatures() + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_Features, "features", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_Features) +} + +// GenerateMnemonic forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) GenerateMnemonic(wordCount uint32, usePassphrase bool) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.GenerateMnemonic(wordCount, usePassphrase) + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_Success, "generate mnemonic", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_Success) +} + +// Recovery forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) Recovery(wordCount uint32, usePassphrase *bool, dryRun bool) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.Recovery(wordCount, usePassphrase, dryRun) + if err != nil { + sq.log.WithError(err).Errorln("recovery: sending message failed") + return wire.Message{}, err + } + if msg.Kind == uint16(messages.MessageType_MessageType_ButtonRequest) { + msg, err = sq.dev.ButtonAck() + if err != nil { + return wire.Message{}, err + } + } + for msg.Kind != uint16(messages.MessageType_MessageType_Success) && msg.Kind != uint16(messages.MessageType_MessageType_Failure) { + if msg.Kind == uint16(messages.MessageType_MessageType_PinMatrixRequest) || msg.Kind == uint16(messages.MessageType_MessageType_PassphraseRequest) || msg.Kind == uint16(messages.MessageType_MessageType_ButtonRequest) || msg.Kind == uint16(messages.MessageType_MessageType_WordRequest) { + if msg, err = sq.handleInputInteraction(msg); err != nil { + sq.log.WithError(err).Errorln("error handling interaction") + return wire.Message{}, err + } + } + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_Success) +} + +// SetMnemonic forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) SetMnemonic(mnemonic string) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.SetMnemonic(mnemonic) + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_Success, "set mnemonic", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_Success) +} + +// TransactionSign forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) TransactionSign(inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput, walletType string) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + // TODO interesting + //if len(inputs) != len(inputIndex) { + // fmt.Println("Every given input hash should have the an inputIndex") + // return + //} + //if len(outputs) != len(coins) || len(outputs) != len(hours) { + // fmt.Println("Every given output should have a coin and hour value") + // return + //} + msg, err := sq.dev.TransactionSign(inputs, outputs, walletType) + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_ResponseTransactionSign, "sign transaction", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_ResponseTransactionSign) +} + +// SignMessage forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) SignMessage(addressN, addressIndex int, message string, walletType string) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.SignMessage(1, addressIndex, message, walletType) + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_ResponseSkycoinSignMessage, "sign message", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_ResponseSkycoinSignMessage) +} + +// Wipe forward the call to Device and handle all the consecutive command as an +// atomic sequence +func (sq *Sequencer) Wipe() (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + msg, err := sq.dev.Wipe() + msg, err = sq.handleFirstCommandResponse(messages.MessageType_MessageType_Success, "wipe", err, msg) + if err != nil { + return wire.Message{}, err + } + return sq.handleFinalResponse(msg, messages.MessageType_MessageType_Success) +} + +// PinMatrixAck forward the call to Device +func (sq *Sequencer) PinMatrixAck(p string) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + return sq.dev.PinMatrixAck(p) +} + +// WordAck forward the call to Device +func (sq *Sequencer) WordAck(word string) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + return sq.dev.WordAck(word) +} + +// PassphraseAck forward the call to Device +func (sq *Sequencer) PassphraseAck(passphrase string) (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + return sq.dev.PassphraseAck(passphrase) +} + +// ButtonAck forward the call to Device +func (sq *Sequencer) ButtonAck() (wire.Message, error) { + sq.Lock() + defer sq.Unlock() + return sq.dev.ButtonAck() +} + +// SetAutoPressButton forward the call to Device +func (sq *Sequencer) SetAutoPressButton(simulateButtonPress bool, simulateButtonType skywallet.ButtonType) error { + sq.Lock() + defer sq.Unlock() + return sq.dev.SetAutoPressButton(simulateButtonPress, simulateButtonType) +} + +// Close forward the call to Device +func (sq *Sequencer) Close() { + sq.Lock() + defer sq.Unlock() + sq.dev.Close() +} + +// Connect forward the call to Device +func (sq *Sequencer) Connect() error { + sq.Lock() + defer sq.Unlock() + return sq.dev.Connect() +} + +// Disconnect forward the call to Device +func (sq *Sequencer) Disconnect() error { + sq.Lock() + defer sq.Unlock() + return sq.dev.Disconnect() +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/bit_encoded_flags.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/bit_encoded_flags.go new file mode 100644 index 00000000..4a0b6c75 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/bit_encoded_flags.go @@ -0,0 +1,85 @@ +package skywallet + +import ( + "encoding/binary" + "encoding/json" +) + +// BitEncodedFlags allow you to work with bit field encoded in integer in a high level +type BitEncodedFlags interface { + // Marshal encode the fields to a uint64 + Marshal() (uint64, error) + + // decode fields + Unmarshal() error + + // return tru if the RDP is enabled + HasRdpMemProtectEnabled() bool +} + +// FirmwareFeatures handle the features in firmware as a BitEncodedFlags implementation +type FirmwareFeatures struct { + flags uint64 + RequireGetEntropyConfirm bool + IsGetEntropyEnabled bool + IsEmulator bool + FirmwareFeaturesRdpLevel uint8 +} + +// NewFirmwareFeatures return a new BitEncodedFlags initialized with the internal fields +func NewFirmwareFeatures(flags uint64) BitEncodedFlags { + return &FirmwareFeatures{flags: flags} +} + +// Marshal encode the FirmwareFeatures internal field in a uint64 value +// return this number and keeps an internal copy +func (ff *FirmwareFeatures) Marshal() (uint64, error) { + ff.flags = 0 + bs := make([]byte, 8) + setBitInByte(&bs[7], ff.RequireGetEntropyConfirm, 0) + setBitInByte(&bs[7], ff.IsGetEntropyEnabled, 1) + setBitInByte(&bs[7], ff.IsEmulator, 2) + setBitInByte(&bs[7], ff.FirmwareFeaturesRdpLevel == 1 || ff.FirmwareFeaturesRdpLevel == 3, 3) + setBitInByte(&bs[7], ff.FirmwareFeaturesRdpLevel == 2 || ff.FirmwareFeaturesRdpLevel == 3, 4) + ff.flags = binary.BigEndian.Uint64(bs) + return ff.flags, nil +} + +// Unmarshal fill all the struct fields based on the encoded info in the flags field +func (ff *FirmwareFeatures) Unmarshal() error { + bs := make([]byte, 8) + binary.BigEndian.PutUint64(bs, ff.flags) + ff.RequireGetEntropyConfirm = bitStatusInByte(bs[7], 0) + ff.IsGetEntropyEnabled = bitStatusInByte(bs[7], 1) + ff.IsEmulator = bitStatusInByte(bs[7], 2) + setBitInByte(&ff.FirmwareFeaturesRdpLevel, bitStatusInByte(bs[7], 3), 0) + setBitInByte(&ff.FirmwareFeaturesRdpLevel, bitStatusInByte(bs[7], 4), 1) + return nil +} + +// HasRdpMemProtectEnabled return true if rdp == true +func (ff FirmwareFeatures) HasRdpMemProtectEnabled() bool { + return ff.FirmwareFeaturesRdpLevel == 2 +} + +// String allow pretty print in cli applications +func (ff FirmwareFeatures) String() string { + b, err := json.Marshal(ff) + if err != nil { + return "error rendering FirmwareFeatures " + err.Error() + } + return string(b) +} + +func bitStatusInByte(data, bitPos uint8) bool { + return (data & (uint8)(1< 0 { + log.WithField("emulatorAddress", emulatorAddress).Warningln("ip addresses ignored as this does not make sense for physical device") + } + return &Driver{ + deviceType: deviceType, + bus: usb.Init(initUsb()...), + }, nil + case DeviceTypeEmulator: + if len(emulatorAddress) == 0 { + emulatorAddress = []string{"127.0.0.1"} + } else if len(emulatorAddress) > 1 { + return nil, ErrInvalidArgCountForEmulatorIPAddress + } + udpBus, err := usb.InitUDP([]int{EmulatorPort}, emulatorAddress[0]) + if err != nil { + return nil, err + } + + return &Driver{ + deviceType: deviceType, + bus: usb.Init(udpBus), + }, nil + } + + return nil, fmt.Errorf("invalid device %s", deviceType) +} + +// Close closes the bus +func (drv *Driver) Close() { + drv.bus.Close() +} + +// DeviceType return driver device type +func (drv *Driver) DeviceType() DeviceType { + return drv.deviceType +} + +// SendToDeviceNoAnswer sends msg to device and doesnt return response +func (drv *Driver) SendToDeviceNoAnswer(dev usb.Device, chunks [][64]byte) error { + return sendToDeviceNoAnswer(dev, chunks) +} + +// SendToDevice sends msg to device and returns response +func (drv *Driver) SendToDevice(dev usb.Device, chunks [][64]byte) (wire.Message, error) { + return sendToDevice(dev, chunks) +} + +// GetDevice returns a device instance +func (drv *Driver) GetDevice() (usb.Device, error) { + var vendorID, productID uint16 + + if drv.deviceType == DeviceTypeUSB { + vendorID = SkycoinVendorID + productID = SkycoinHwProductID + } else if drv.deviceType != DeviceTypeEmulator { + return nil, fmt.Errorf("invalid device type: %s", drv.deviceType) + } + + infos, err := drv.bus.Enumerate(vendorID, productID) + if len(infos) <= 0 { + return nil, ErrNoDeviceConnected + } + + if err != nil { + return nil, err + } + + tries := 0 + for tries < 3 { + dev, err := drv.bus.Connect(infos[0].Path) + if err != nil { + log.Print(err.Error()) + tries++ + time.Sleep(100 * time.Millisecond) + } else { + return dev, err + } + } + return nil, err +} + +// GetDeviceInfos returns information from the attached usb +func (drv *Driver) GetDeviceInfos() ([]usb.Info, error) { + if drv.DeviceType() == DeviceTypeUSB { + infos, err := drv.bus.Enumerate(SkycoinVendorID, SkycoinHwProductID) + if err != nil { + return nil, err + } + + return infos, nil + } + return nil, errors.New("reading device info make sense for physical devices only") +} + +func sendToDeviceNoAnswer(dev usb.Device, chunks [][64]byte) error { + for _, element := range chunks { + _, err := dev.Write(element[:]) + if err != nil { + return err + } + } + return nil +} + +func sendToDevice(dev usb.Device, chunks [][64]byte) (wire.Message, error) { + var msg *wire.Message + var err error + for _, element := range chunks { + _, err := dev.Write(element[:]) + if err != nil { + return wire.Message{}, err + } + } + + msg, err = wire.ReadFrom(dev) + if err != nil { + return wire.Message{}, err + } + + for msg.Kind == uint16(messages.MessageType_MessageType_EntropyRequest) { + var wg sync.WaitGroup + wg.Add(1) + + go func() { + defer wg.Done() + entropyChunks, err := MessageEntropyAck(entropyBufferSize) + if err != nil { + log.Errorf("failed to create entropy ack msg: %v", err) + return + } + + for _, element := range entropyChunks { + _, err := dev.Write(element[:]) + if err != nil { + log.Errorf("entropy ack error: %v", err) + return + } + } + }() + + msg, err = wire.ReadFrom(dev) + if err != nil { + return wire.Message{}, err + } + wg.Wait() + } + for msg.Kind == uint16(messages.MessageType_MessageType_Success) { + success, err := decodeSuccessMsgStruct(*msg) + if err != nil { + return wire.Message{}, err + } + if success.MsgType != nil && *success.MsgType == messages.MessageType(messages.MessageType_MessageType_EntropyAck) { + msg, err = wire.ReadFrom(dev) + if err != nil { + return wire.Message{}, err + } + } else { + break + } + } + + return *msg, err +} + +func binaryWrite(message io.Writer, data interface{}) { + err := binary.Write(message, binary.BigEndian, data) + if err != nil { + log.Panic(err) + } +} + +func makeSkyWalletMessage(data []byte, msgID messages.MessageType) [][64]byte { + message := new(bytes.Buffer) + binaryWrite(message, []byte("##")) + binaryWrite(message, uint16(msgID)) + binaryWrite(message, uint32(len(data))) + binaryWrite(message, []byte("\n")) + if len(data) > 0 { + binaryWrite(message, data[1:]) + } + + messageLen := message.Len() + var chunks [][64]byte + i := 0 + for messageLen > 0 { + var chunk [64]byte + chunk[0] = '?' + copy(chunk[1:], message.Bytes()[63*i:63*(i+1)]) + chunks = append(chunks, chunk) + messageLen -= 63 + i = i + 1 + } + return chunks +} + +// Initialize send an init request to the device +func Initialize(dev usb.Device) error { + var chunks [][64]byte + + chunks, err := MessageInitialize() + if err != nil { + return err + } + _, err = sendToDevice(dev, chunks) + return err +} + +// DecodeSuccessOrFailMsg parses a success or failure msg +func DecodeSuccessOrFailMsg(msg wire.Message) (string, error) { + if msg.Kind == uint16(messages.MessageType_MessageType_Success) { + return DecodeSuccessMsg(msg) + } + if msg.Kind == uint16(messages.MessageType_MessageType_Failure) { + return DecodeFailMsg(msg) + } + + return "", fmt.Errorf("calling DecodeSuccessOrFailMsg on message kind %s", messages.MessageType(msg.Kind)) +} + +func decodeSuccessMsgStruct(msg wire.Message) (messages.Success, error) { + if msg.Kind == uint16(messages.MessageType_MessageType_Success) { + success := messages.Success{} + err := proto.Unmarshal(msg.Data, &success) + if err != nil { + return messages.Success{}, err + } + return success, nil + } + return messages.Success{}, fmt.Errorf("calling DecodeSuccessMsg with wrong message type: %s", messages.MessageType(msg.Kind)) +} + +// DecodeSuccessMsg convert byte data into string containing the success message returned by the device +func DecodeSuccessMsg(msg wire.Message) (string, error) { + success, err := decodeSuccessMsgStruct(msg) + if err != nil { + return "", err + } + return success.GetMessage(), nil +} + +// DecodeFailMsg convert byte data into string containing the failure returned by the device +func DecodeFailMsg(msg wire.Message) (string, error) { + if msg.Kind == uint16(messages.MessageType_MessageType_Failure) { + failure := &messages.Failure{} + err := proto.Unmarshal(msg.Data, failure) + if err != nil { + return "", err + } + return failure.GetMessage(), nil + } + return "", fmt.Errorf("calling DecodeFailMsg with wrong message type: %s", messages.MessageType(msg.Kind)) +} + +// DecodeResponseSkycoinAddress convert byte data into list of addresses, meant to be used after DevicePinMatrixAck +func DecodeResponseSkycoinAddress(msg wire.Message) ([]string, error) { + if msg.Kind == uint16(messages.MessageType_MessageType_ResponseSkycoinAddress) { + responseSkycoinAddress := &messages.ResponseSkycoinAddress{} + err := proto.Unmarshal(msg.Data, responseSkycoinAddress) + if err != nil { + return []string{}, err + } + return responseSkycoinAddress.GetAddresses(), nil + } + + return []string{}, fmt.Errorf("calling DecodeResponseSkycoinAddress with wrong message type: %s", messages.MessageType(msg.Kind)) +} + +// DecodeResponseTransactionSign convert byte data into list of signatures +func DecodeResponseTransactionSign(msg wire.Message) ([]string, error) { + if msg.Kind == uint16(messages.MessageType_MessageType_ResponseTransactionSign) { + responseSkycoinTransactionSign := &messages.ResponseTransactionSign{} + err := proto.Unmarshal(msg.Data, responseSkycoinTransactionSign) + if err != nil { + return make([]string, 0), err + } + return responseSkycoinTransactionSign.GetSignatures(), nil + } + + return []string{}, fmt.Errorf("calling DecodeResponseeSkycoinSignMessage with wrong message type: %s", messages.MessageType(msg.Kind)) +} + +// DecodeResponseSkycoinSignMessage convert byte data into signed message, meant to be used after DevicePinMatrixAck +func DecodeResponseSkycoinSignMessage(msg wire.Message) (string, error) { + if msg.Kind == uint16(messages.MessageType_MessageType_ResponseSkycoinSignMessage) { + responseSkycoinSignMessage := &messages.ResponseSkycoinSignMessage{} + err := proto.Unmarshal(msg.Data, responseSkycoinSignMessage) + if err != nil { + return "", err + } + return responseSkycoinSignMessage.GetSignedMessage(), nil + } + return "", fmt.Errorf("calling DecodeResponseeSkycoinSignMessage with wrong message type: %s", messages.MessageType(msg.Kind)) +} + +// DecodeResponseEntropyMessage convert byte data into entropy message, meant to be used after GetEntropy +func DecodeResponseEntropyMessage(msg wire.Message) (*messages.Entropy, error) { + if msg.Kind == uint16(messages.MessageType_MessageType_Entropy) { + responseEntropyMessage := &messages.Entropy{} + err := proto.Unmarshal(msg.Data, responseEntropyMessage) + if err != nil { + return nil, err + } + return responseEntropyMessage, nil + } + return nil, fmt.Errorf("calling DecodeResponseEntropyMessage with wrong message type: %s", messages.MessageType(msg.Kind)) +} + +// Does OS allow sync canceling via our custom libusb patches? +func allowCancel() bool { + return runtime.GOOS != "freebsd" +} + +// Does OS detach kernel driver in libusb? +func detachKernelDriver() bool { + return runtime.GOOS == "linux" +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/messages.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/messages.go new file mode 100644 index 00000000..e5dfbdb0 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/messages.go @@ -0,0 +1,457 @@ +package skywallet + +import ( + "bytes" + "fmt" + + "github.com/gogo/protobuf/proto" + "github.com/skycoin/skycoin/src/cipher" + + messages "github.com/fibercrypto/skywallet-protob/go" +) + +// MessageCancel prepare Cancel request +func MessageCancel() ([][64]byte, error) { + msg := &messages.Cancel{} + data, err := proto.Marshal(msg) + if err != nil { + return [][64]byte{}, err + } + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_Cancel) + return chunks, nil +} + +// MessageButtonAck send this message (before user action) when the device expects the user to push a button +func MessageButtonAck() ([][64]byte, error) { + buttonAck := &messages.ButtonAck{} + data, err := proto.Marshal(buttonAck) + if err != nil { + return [][64]byte{}, err + } + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_ButtonAck) + return chunks, nil +} + +// MessagePassphraseAck send this message when the device expects receiving a Passphrase +func MessagePassphraseAck(passphrase string) ([][64]byte, error) { + msg := &messages.PassphraseAck{ + Passphrase: proto.String(passphrase), + } + data, err := proto.Marshal(msg) + if err != nil { + return [][64]byte{}, err + } + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_PassphraseAck) + return chunks, nil +} + +// MessageWordAck send this message between each word of the seed (before user action) during device backup +func MessageWordAck(word string) ([][64]byte, error) { + wordAck := &messages.WordAck{ + Word: proto.String(word), + } + data, err := proto.Marshal(wordAck) + if err != nil { + return [][64]byte{}, err + } + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_WordAck) + return chunks, nil +} + +// MessageCheckMessageSignature prepare CheckMessageSignature request +func MessageCheckMessageSignature(message, signature, address string) ([][64]byte, error) { + msg := &messages.SkycoinCheckMessageSignature{ + Address: proto.String(address), + Message: proto.String(message), + Signature: proto.String(signature), + } + + data, err := proto.Marshal(msg) + if err != nil { + return [][64]byte{}, err + } + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_SkycoinCheckMessageSignature) + return chunks, nil +} + +// MessageAddressGen prepare MessageAddressGen request +func MessageAddressGen(addressN, startIndex uint32, confirmAddress bool) ([][64]byte, error) { + skycoinAddress := &messages.SkycoinAddress{ + AddressN: proto.Uint32(addressN), + ConfirmAddress: proto.Bool(confirmAddress), + StartIndex: proto.Uint32(startIndex), + } + + data, err := proto.Marshal(skycoinAddress) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_SkycoinAddress) + return chunks, nil +} + +// MessageAddressGenBip44 prepare MessageAddressGen request +func MessageAddressGenBip44(addressN, startIndex, coinType, account uint32, confirmAddress bool) ([][64]byte, error) { + skycoinAddress := &messages.SkycoinAddress{ + ConfirmAddress: proto.Bool(confirmAddress), + StartIndex: proto.Uint32(0), // TODO remove this field from here + AddressN: proto.Uint32(0), // TODO remove this field from here + Bip44Addr: &messages.Bip44AddrIndex{ + CoinType: proto.Uint32(firstHardenedChild + coinType), // coinType' + Account: proto.Uint32(firstHardenedChild + account), // account' + Change: proto.Uint32(0), + AddressStartIndex: proto.Uint32(startIndex), + AddressN: proto.Uint32(addressN), + }, + } + + data, err := proto.Marshal(skycoinAddress) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_SkycoinAddress) + return chunks, nil +} + +// MessageDeviceGetRawEntropy prepare GetEntropy request +func MessageDeviceGetRawEntropy(entropyBytes uint32) ([][64]byte, error) { + getEntropy := &messages.GetRawEntropy{ + Size_: &entropyBytes, + } + + data, err := proto.Marshal(getEntropy) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_GetRawEntropy) + return chunks, nil +} + +// MessageDeviceGetMixedEntropy prepare GetMixedEntropy request +func MessageDeviceGetMixedEntropy(entropyBytes uint32) ([][64]byte, error) { + getEntropy := &messages.GetMixedEntropy{ + Size_: &entropyBytes, + } + + data, err := proto.Marshal(getEntropy) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_GetMixedEntropy) + return chunks, nil +} + +// MessageApplySettings prepare MessageApplySettings request +func MessageApplySettings(usePassphrase *bool, label string, language string) ([][64]byte, error) { + applySettings := &messages.ApplySettings{ + Label: proto.String(label), + Language: proto.String(language), + } + if usePassphrase != nil { + applySettings.UsePassphrase = proto.Bool(*usePassphrase) + } + log.Println(applySettings) + data, err := proto.Marshal(applySettings) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_ApplySettings) + return chunks, nil +} + +// MessageBackup prepare MessageBackup request +func MessageBackup() ([][64]byte, error) { + backupDevice := &messages.BackupDevice{} + data, err := proto.Marshal(backupDevice) + if err != nil { + return [][64]byte{}, err + } + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_BackupDevice) + return chunks, nil +} + +// MessageChangePin prepare MessageChangePin request +func MessageChangePin(remove *bool) ([][64]byte, error) { + changePin := &messages.ChangePin{} + if remove != nil { + changePin.Remove = proto.Bool(*remove) + } + data, err := proto.Marshal(changePin) + if err != nil { + return [][64]byte{}, err + } + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_ChangePin) + return chunks, nil +} + +// MessageConnected prepare MessageConnected request +func MessageConnected() ([][64]byte, error) { + msgRaw := &messages.Ping{} + data, err := proto.Marshal(msgRaw) + if err != nil { + return [][64]byte{}, err + } + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_Ping) + return chunks, nil +} + +// MessageFirmwareErase prepare MessageFirmwareErase request +func MessageFirmwareErase(payload []byte) ([][64]byte, error) { + deviceFirmwareErase := &messages.FirmwareErase{ + Length: proto.Uint32(uint32(len(payload))), + } + + erasedata, err := proto.Marshal(deviceFirmwareErase) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(erasedata, messages.MessageType_MessageType_FirmwareErase) + return chunks, nil +} + +// MessageFirmwareUpload prepare MessageFirmwareUpload request +func MessageFirmwareUpload(payload []byte, hash [32]byte) ([][64]byte, error) { + deviceFirmwareUpload := &messages.FirmwareUpload{ + Payload: payload, + Hash: hash[:], + } + + uploaddata, err := proto.Marshal(deviceFirmwareUpload) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(uploaddata, messages.MessageType_MessageType_FirmwareUpload) + return chunks, nil +} + +// MessageGetFeatures prepare MessageGetFeatures request +func MessageGetFeatures() ([][64]byte, error) { + featureMsg := &messages.GetFeatures{} + data, err := proto.Marshal(featureMsg) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_GetFeatures) + return chunks, nil +} + +// MessageGenerateMnemonic prepare MessageGenerateMnemonic request +func MessageGenerateMnemonic(wordCount uint32, usePassphrase bool) ([][64]byte, error) { + skycoinGenerateMnemonic := &messages.GenerateMnemonic{ + PassphraseProtection: proto.Bool(usePassphrase), + WordCount: proto.Uint32(wordCount), + } + + data, err := proto.Marshal(skycoinGenerateMnemonic) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_GenerateMnemonic) + return chunks, nil +} + +// MessageRecovery prepare MessageRecovery request +func MessageRecovery(wordCount uint32, usePassphrase *bool, dryRun bool) ([][64]byte, error) { + recoveryDevice := &messages.RecoveryDevice{ + WordCount: proto.Uint32(wordCount), + DryRun: proto.Bool(dryRun), + } + if usePassphrase != nil { + recoveryDevice.PassphraseProtection = proto.Bool(*usePassphrase) + } + data, err := proto.Marshal(recoveryDevice) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_RecoveryDevice) + + return chunks, nil +} + +// MessageSetMnemonic prepare MessageSetMnemonic request +func MessageSetMnemonic(mnemonic string) ([][64]byte, error) { + skycoinSetMnemonic := &messages.SetMnemonic{ + Mnemonic: proto.String(mnemonic), + } + + data, err := proto.Marshal(skycoinSetMnemonic) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_SetMnemonic) + return chunks, nil +} + +// MessageSignMessage prepare MessageSignMessage request +func MessageSignMessage(addressIndex int, message string) ([][64]byte, error) { + skycoinSignMessage := &messages.SkycoinSignMessage{ + AddressN: proto.Uint32(uint32(addressIndex)), + Message: proto.String(message), + } + + data, err := proto.Marshal(skycoinSignMessage) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_SkycoinSignMessage) + return chunks, nil +} + +// MessageSignMessageBip44 prepare MessageSignMessage request +func MessageSignMessageBip44(startIndex, addressN, coinType, account uint32, message string) ([][64]byte, error) { + skycoinSignMessage := &messages.SkycoinSignMessage{ + AddressN: proto.Uint32(uint32(0)), // TODO remove this field + Message: proto.String(message), + Bip44Addr: &messages.Bip44AddrIndex{ + CoinType: proto.Uint32(firstHardenedChild + coinType), // coinType' + Account: proto.Uint32(firstHardenedChild + account), // account' + Change: proto.Uint32(0), + AddressStartIndex: proto.Uint32(startIndex), + AddressN: proto.Uint32(addressN), + }, + } + + data, err := proto.Marshal(skycoinSignMessage) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_SkycoinSignMessage) + return chunks, nil +} + +// MessageTransactionSign prepare MessageTransactionSign request +func MessageTransactionSign(inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput) ([][64]byte, error) { + skycoinTransactionSignMessage := &messages.TransactionSign{ + NbIn: proto.Uint32(uint32(len(inputs))), + NbOut: proto.Uint32(uint32(len(outputs))), + TransactionIn: inputs, + TransactionOut: outputs, + } + log.Println(skycoinTransactionSignMessage) + + data, err := proto.Marshal(skycoinTransactionSignMessage) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_TransactionSign) + return chunks, nil +} + +// MessageTransactionSignBip44 prepare MessageTransactionSign request +func MessageTransactionSignBip44(coinType, account uint32, inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput) ([][64]byte, error) { + for idxInput := range inputs { + inputs[idxInput].Bip44Addr = &messages.Bip44AddrIndex{ + CoinType: proto.Uint32(firstHardenedChild + coinType), // coinType' + Account: proto.Uint32(firstHardenedChild + account), // account' + Change: proto.Uint32(0), + AddressStartIndex: proto.Uint32(*inputs[idxInput].Index), + AddressN: proto.Uint32(1), + } + } + for idxOutput := range outputs { + outputs[idxOutput].Bip44Addr = &messages.Bip44AddrIndex{ + CoinType: proto.Uint32(firstHardenedChild + coinType), // coinType' + Account: proto.Uint32(firstHardenedChild + account), // account' + Change: proto.Uint32(0), + AddressStartIndex: proto.Uint32(*outputs[idxOutput].AddressIndex), + AddressN: proto.Uint32(1), + } + } + skycoinTransactionSignMessage := &messages.TransactionSign{ + NbIn: proto.Uint32(uint32(len(inputs))), + NbOut: proto.Uint32(uint32(len(outputs))), + TransactionIn: inputs, + TransactionOut: outputs, + } + + data, err := proto.Marshal(skycoinTransactionSignMessage) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_TransactionSign) + return chunks, nil +} + +// MessageWipe prepare MessageWipe request +func MessageWipe() ([][64]byte, error) { + wipeDevice := &messages.WipeDevice{} + data, err := proto.Marshal(wipeDevice) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_WipeDevice) + return chunks, nil +} + +// MessagePinMatrixAck prepare MessagePinMatrixAck request +func MessagePinMatrixAck(p string) ([][64]byte, error) { + pinAck := &messages.PinMatrixAck{ + Pin: proto.String(p), + } + data, err := proto.Marshal(pinAck) + if err != nil { + return [][64]byte{}, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_PinMatrixAck) + return chunks, nil +} + +// MessageEntropyAck prepare MessageEntropyAck request +func MessageEntropyAck(bufferSize int) ([][64]byte, error) { + buffer := cipher.RandByte(bufferSize) + if len(buffer) != bufferSize { + return nil, fmt.Errorf("required %d bytes but got %d", bufferSize, len(buffer)) + } + entropyAck := &messages.EntropyAck{ + Entropy: buffer, + } + data, err := proto.Marshal(entropyAck) + if err != nil { + return nil, err + } + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_EntropyAck) + return chunks, nil +} + +// MessageInitialize prepare MessageInitialize request +func MessageInitialize() ([][64]byte, error) { + initialize := &messages.Initialize{} + data, err := proto.Marshal(initialize) + if err != nil { + return nil, err + } + + chunks := makeSkyWalletMessage(data, messages.MessageType_MessageType_Initialize) + return chunks, nil +} + +// MessageSimulateButtonPress prespares a emulator button press simulation button +func MessageSimulateButtonPress(buttonType ButtonType) (*bytes.Buffer, error) { + switch buttonType { + case ButtonLeft, ButtonRight, ButtonBoth: + msg := new(bytes.Buffer) + msg.Write([]byte{0, 1, 2, 3, 4, byte(buttonType)}) + + return msg, nil + default: + return nil, fmt.Errorf("invalid button type: %d", buttonType) + } + +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/progress_bar.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/progress_bar.go new file mode 100644 index 00000000..925da7fc --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/progress_bar.go @@ -0,0 +1,41 @@ +package skywallet + +import "fmt" + +const ( + maxbars int = 100 +) + +// Progbar progress bar for cli command in the style: +type Progbar struct { + total int +} + +// PrintProg print the progress var for the portion value +func (p *Progbar) PrintProg(portion int) { + bars := p.calcBars(portion) + spaces := maxbars - bars - 1 + percent := 100 * (float32(portion) / float32(p.total)) + fmt.Print("\r[") + for i := 0; i < bars; i++ { + fmt.Print("=") + } + fmt.Print(">") + for i := 0; i <= spaces; i++ { + fmt.Print(" ") + } + fmt.Printf(" ] %3.2f%% (%d/%d)", percent, portion, p.total) +} + +// PrintComplete print the progress bar as completed +func (p *Progbar) PrintComplete() { + p.PrintProg(p.total) + fmt.Print("\n") +} + +func (p *Progbar) calcBars(portion int) int { + if portion == 0 { + return portion + } + return int(float32(maxbars) / (float32(p.total) / float32(portion))) +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/skywallet.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/skywallet.go new file mode 100644 index 00000000..e36ba8f5 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/skywallet.go @@ -0,0 +1,976 @@ +package skywallet + +import ( + "errors" + "fmt" + "os" + "sync" + "time" + + "github.com/fibercrypto/skywallet-go/src/skywallet/usb" + + "github.com/skycoin/skycoin/src/util/logging" + + messages "github.com/fibercrypto/skywallet-protob/go" + + "github.com/fibercrypto/skywallet-go/src/skywallet/wire" +) + +var ( + log = logging.MustGetLogger("skywallet") +) + +const ( + entropyBufferSize int = 32 +) + +// ButtonType is emulator button press simulation type +type ButtonType int32 + +const ( + // ButtonLeft press left button + ButtonLeft ButtonType = iota + + // ButtonRight press right button + ButtonRight + // ButtonBoth press both buttons + ButtonBoth +) + +var ( + // ErrAddressNZero is returned if addressN is 0 + ErrAddressNZero = errors.New("addresses to generate should be greater than 0") + // ErrRemovePinNil is returned if removePin is nil + ErrRemovePinNil = errors.New("removePin cannot be nil") + // ErrDeviceTypeEmulator is returned if device type is emulator + ErrDeviceTypeEmulator = errors.New("device type cannot be emulator") + // ErrInvalidWordCount is returned if word count is not valid mnemonic word length + ErrInvalidWordCount = errors.New("word count must be 12 or 24") + // ErrInvalidArgCountForEmulatorIPAddress emulator ip address is the only one expected argument for emulatorAddress + ErrInvalidArgCountForEmulatorIPAddress = errors.New("emulator ip address is the only one expected argument for emulatorAddress") + // ErrNoDeviceConnected is returned if no device is connected to the system + ErrNoDeviceConnected = errors.New("no device connected") + // ErrInvalidWalletType a valid wallet type should be specified + ErrInvalidWalletType = errors.New("invalid wallet type, options are: " + WalletTypeDeterministic + " or " + WalletTypeBip44) +) + +const ( + // WalletTypeDeterministic specify use deterministic derivation to get + // for example an address + WalletTypeDeterministic = "deterministic" + + // WalletTypeBip44 specify use BIP 44 derivation to get + // for example an address + WalletTypeBip44 = "bip44" + coinTypeSkycoin = 8000 + firstHardenedChild = uint32(0x80000000) +) + +//go:generate mockery -name Devicer -case underscore -inpkg -testonly + +// Devicer provides api for the hw wallet functions +type Devicer interface { + AddressGen(addressN, startIndex uint32, confirmAddress bool, walletType string) (wire.Message, error) + ApplySettings(usePassphrase *bool, label string, language string) (wire.Message, error) + Backup() (wire.Message, error) + Cancel() (wire.Message, error) + CheckMessageSignature(message, signature, address string) (wire.Message, error) + ChangePin(removePin *bool) (wire.Message, error) + Connected() bool + Available() bool + FirmwareUpload(payload []byte, hash [32]byte) error + GetFeatures() (wire.Message, error) + GenerateMnemonic(wordCount uint32, usePassphrase bool) (wire.Message, error) + Recovery(wordCount uint32, usePassphrase *bool, dryRun bool) (wire.Message, error) + SetMnemonic(mnemonic string) (wire.Message, error) + TransactionSign(inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput, walletType string) (wire.Message, error) + SignMessage(addressN, addressIndex int, message string, walletType string) (wire.Message, error) + Wipe() (wire.Message, error) + PinMatrixAck(p string) (wire.Message, error) + WordAck(word string) (wire.Message, error) + PassphraseAck(passphrase string) (wire.Message, error) + ButtonAck() (wire.Message, error) + SetAutoPressButton(simulateButtonPress bool, simulateButtonType ButtonType) error + Close() + Connect() error + Disconnect() error +} + +// Device provides hardware wallet functions +type Device struct { + Driver DeviceDriver + + // mutex to force connect requests to be sequential + sync.Mutex + dev usb.Device + connected bool + simulateButtonPress bool + simulateButtonType ButtonType +} + +// DeviceTypeFromString returns device type from string +func DeviceTypeFromString(deviceType string) DeviceType { + var dtRet DeviceType + switch deviceType { + case DeviceTypeUSB.String(): + dtRet = DeviceTypeUSB + case DeviceTypeEmulator.String(): + dtRet = DeviceTypeEmulator + default: + log.Errorf("device type not set, valid options are %s or %s", + DeviceTypeUSB, + DeviceTypeEmulator) + dtRet = DeviceTypeInvalid + } + return dtRet +} + +var devSingleCreator sync.Once +var devSingleInstance *Device + +func newDevice(deviceType DeviceType, emulatorAddress ...string) *Device { + driver, err := NewDriver(deviceType, emulatorAddress...) + if err != nil { + log.Fatalf("failed to create driver: %s", err) + } + + return &Device{ + driver, + sync.Mutex{}, + nil, + false, + false, + ButtonType(-1), + } +} + +// NewDevice returns a new device instance +func NewDevice(deviceType DeviceType, emulatorAddress ...string) *Device { + // TODO rename NewDevice to DeviceInstance as this is a singleton + // implementation. + devSingleCreator.Do(func() { + devSingleInstance = newDevice(deviceType, emulatorAddress...) + }) + return devSingleInstance +} + +// Close closes the usb bus +// Device should be closed before shutdown to avoid running out of open file descriptors +func (d *Device) Close() { + d.Driver.Close() +} + +// Connect makes a connection to the connected device +func (d *Device) Connect() error { + d.Lock() + defer d.Unlock() + if !d.connected { + dev, err := d.Driver.GetDevice() + if err == nil { + d.dev = dev + d.connected = true + } + return err + } + return nil +} + +// Disconnect the device +func (d *Device) Disconnect() error { + d.Lock() + defer d.Unlock() + if d.connected { + err := d.dev.Close(false) + if err == nil { + d.dev = nil + d.connected = false + } + return nil + } + return nil +} + +// GetUsbInfo returns information from the attached usb +func (d *Device) GetUsbInfo() ([]usb.Info, error) { + if d.Driver.DeviceType() == DeviceTypeUSB { + if err := d.Connect(); err != nil { + return nil, err + } + if err := d.Disconnect(); err != nil { + return nil, err + } + } + devInfos, err := d.Driver.GetDeviceInfos() + if err != nil { + return nil, err + } + return devInfos, nil +} + +// AddressGen Ask the device to generate an address +func (d *Device) AddressGen(addressN, startIndex uint32, confirmAddress bool, walletType string) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + if addressN == 0 { + return wire.Message{}, ErrAddressNZero + } + + var err error + var addressGenChunks [][64]byte + switch walletType { + case WalletTypeDeterministic: + addressGenChunks, err = MessageAddressGen(addressN, startIndex, confirmAddress) + case WalletTypeBip44: + addressGenChunks, err = MessageAddressGenBip44(addressN, startIndex, coinTypeSkycoin, 0, confirmAddress) + default: + return wire.Message{}, ErrInvalidWalletType + } + if err != nil { + return wire.Message{}, err + } + + return d.Driver.SendToDevice(d.dev, addressGenChunks) +} + +// SaveDeviceEntropyInFile Ask the device to generate entropy and save it in a file +// if `outFile` is the "-" string, the output file is considered stdout +func (d *Device) SaveDeviceEntropyInFile(outFile string, entropyBytes uint32, getEntropyMsgBuilder func(entropyBytes uint32) ([][64]byte, error)) error { + usingStdout := false + if outFile == "-" { + usingStdout = true + } + if !usingStdout { + log.Infoln("Saving entropy to", outFile) + } + var receivedEntropyBytes uint32 + var processBytes func(buf []byte) error + var err error + var processGetEntropyResponse func(msg wire.Message) (*messages.Entropy, error) + processGetEntropyResponse = func(msg wire.Message) (*messages.Entropy, error) { + if err != nil || msg.Kind != uint16(messages.MessageType_MessageType_Entropy) { + if err != nil { + return &messages.Entropy{}, err + } + + if msg.Kind == uint16(messages.MessageType_MessageType_ButtonRequest) { + // Send ButtonAck + chunks, err := MessageButtonAck() + if err != nil { + return &messages.Entropy{}, err + } + if err = sendToDeviceNoAnswer(d.dev, chunks); err != nil { + return &messages.Entropy{}, err + } + // simulate button press + if d.simulateButtonPress { + if err := d.SimulateButtonPress(); err != nil { + return &messages.Entropy{}, err + } + } + + msg, err := wire.ReadFrom(d.dev) + if err != nil { + return nil, err + } + return processGetEntropyResponse(*msg) + } + var msgStr string + msgStr, err = DecodeFailMsg(msg) + if err != nil { + log.Errorf("Error decoding device response as fails msg %s", err) + return &messages.Entropy{}, err + } + err = errors.New(msgStr) + log.Errorf("Error getting entropy from device %s", err) + return &messages.Entropy{}, err + } + entropy, err := DecodeResponseEntropyMessage(msg) + if err != nil { + log.Errorf("Error decoding device response %s", err) + return &messages.Entropy{}, err + } + return entropy, nil + } + + getEntropy := func(bytes uint32) (*messages.Entropy, error) { + chunks, err := getEntropyMsgBuilder(bytes) + if err != nil { + return &messages.Entropy{}, err + } + resp, err := d.Driver.SendToDevice(d.dev, chunks) + if err != nil { + return &messages.Entropy{}, err + } + return processGetEntropyResponse(resp) + } + + checkProducedFile := func() error { + if !usingStdout { + fileInfo, err := os.Stat(outFile) + if err != nil { + log.Error(err) + return err + } + if fileInfo.Size() != int64(entropyBytes) { + return fmt.Errorf( + "no engout bytes saved in the file %s\n current: %d\nrequired: %d", + outFile, fileInfo.Size(), entropyBytes) + } + } + return nil + } + + if usingStdout { + processBytes = func(buf []byte) error { + fmt.Print(buf) + return nil + } + } else { + pb := Progbar{total: int(entropyBytes)} + defer func() { + if checkProducedFile() == nil { + pb.PrintComplete() + } + }() + if _, err := os.Stat(outFile); err == nil { + // nolint: gosec + if err = os.Chmod(outFile, 0777); err != nil { + log.Errorf("error with %s %s", outFile, err) + } + } + file, err := os.Create(outFile) + if err != nil { + log.Errorf("error creating output file %s", err) + return err + } + defer func() { + if err := os.Chmod(outFile, 0444); err != nil { + log.Error(err) + } + }() + defer file.Close() + + processBytes = func(buf []byte) error { + var wroteBytes = 0 + for wroteBytes < len(buf) { + var res int + if res, err = file.Write(buf[wroteBytes:]); err != nil { + return err + } + wroteBytes += res + } + if wroteBytes != len(buf) { + return errors.New("invalid bytes amount wrote") + } + pb.PrintProg(int(receivedEntropyBytes)) + return nil + } + } + + if err := d.Connect(); err != nil { + return err + } + + defer func() { + if err := d.Disconnect(); err != nil { + log.Error(err) + } + }() + + entropy, err := getEntropy(entropyBytes) + if err != nil { + log.Error(err) + return err + } + + receivedEntropyBytes = uint32(len(entropy.GetEntropy())) + if err := processBytes(entropy.GetEntropy()); err != nil { + log.Errorf("error writing file %s.\n %s", outFile, err.Error()) + return err + } + + for receivedEntropyBytes < entropyBytes { + entropy, err := getEntropy(entropyBytes - receivedEntropyBytes) + if err != nil { + log.Error(err) + return err + } + receivedEntropyBytes += uint32(len(entropy.GetEntropy())) + if err := processBytes(entropy.GetEntropy()); err != nil { + log.Errorf("error writing file %s.\n %s", outFile, err.Error()) + return err + } + } + return checkProducedFile() +} + +// ApplySettings send ApplySettings request to the device +func (d *Device) ApplySettings(usePassphrase *bool, label string, language string) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + applySettingsChunks, err := MessageApplySettings(usePassphrase, label, language) + if err != nil { + return wire.Message{}, err + } + + return d.Driver.SendToDevice(d.dev, applySettingsChunks) +} + +// Backup ask the device to perform the seed backup +func (d *Device) Backup() (msg wire.Message, err error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + backupChunks, err := MessageBackup() + if err != nil { + return wire.Message{}, err + } + msg, err = d.Driver.SendToDevice(d.dev, backupChunks) + if err != nil { + return wire.Message{}, err + } + return msg, err +} + +// Cancel sends a Cancel request +func (d *Device) Cancel() (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + cancelChunks, err := MessageCancel() + if err != nil { + return wire.Message{}, err + } + + return d.Driver.SendToDevice(d.dev, cancelChunks) +} + +// CheckMessageSignature Check a message signature matches the given address. +func (d *Device) CheckMessageSignature(message, signature, address string) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + // Send CheckMessageSignature + checkMessageSignatureChunks, err := MessageCheckMessageSignature(message, signature, address) + if err != nil { + return wire.Message{}, err + } + + return d.Driver.SendToDevice(d.dev, checkMessageSignatureChunks) +} + +// ChangePin changes device's PIN code +// The message that is sent contains an encoded form of the PIN. +// The digits of the PIN are displayed in a 3x3 matrix on the Trezor, +// and the message that is sent back is a string containing the positions +// of the digits on that matrix. Below is the mapping between positions +// and characters to be sent: +// 7 8 9 +// 4 5 6 +// 1 2 3 +// For example, if the numbers are laid out in this way on the Trezor, +// 3 1 5 +// 7 8 4 +// 9 6 2 +// To set the PIN "12345", the positions are: +// top, bottom-right, top-left, right, top-right +// so you must send "83769". +func (d *Device) ChangePin(removePin *bool) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + if removePin == nil { + return wire.Message{}, ErrRemovePinNil + } + + changePinChunks, err := MessageChangePin(removePin) + if err != nil { + return wire.Message{}, err + } + + msg, err := d.Driver.SendToDevice(d.dev, changePinChunks) + if err != nil { + return wire.Message{}, err + } + + return msg, nil +} + +// Connected checks if we can communicate with a connected skycoin wallet +func (d *Device) Connected() bool { + var msg *wire.Message + var err error + if d.dev == nil { + return false + } + + chunks, err := MessageConnected() + if err != nil { + log.Error(err) + return false + } + + for _, element := range chunks { + _, err = d.dev.Write(element[:]) + if err != nil { + return false + } + } + + msg, err = wire.ReadFrom(d.dev) + if err != nil { + return false + } + + for msg.Kind == uint16(messages.MessageType_MessageType_EntropyRequest) { + var wg sync.WaitGroup + wg.Add(1) + + go func() { + defer wg.Done() + entropyChunks, err := MessageEntropyAck(entropyBufferSize) + if err != nil { + log.Errorf("failed to create entropy ack msg: %v", err) + return + } + + for _, element := range entropyChunks { + _, err := d.dev.Write(element[:]) + if err != nil { + log.Errorf("entropy ack error: %v", err) + return + } + } + }() + + msg, err = wire.ReadFrom(d.dev) + if err != nil { + return false + } + wg.Wait() + } + + return msg.Kind == uint16(messages.MessageType_MessageType_Success) +} + +// Available checks if a skycoin wallet is connected to the system +func (d *Device) Available() bool { + infos, err := d.Driver.GetDeviceInfos() + if err != nil { + log.Error(err) + return false + } + + if len(infos) <= 0 { + return false + } + + return true +} + +// FirmwareUpload Updates device's firmware +func (d *Device) FirmwareUpload(payload []byte, hash [32]byte) error { + if d.Driver.DeviceType() != DeviceTypeUSB { + return ErrDeviceTypeEmulator + } + + if err := d.Connect(); err != nil { + return err + } + defer d.Disconnect() + + if err := Initialize(d.dev); err != nil { + return err + } + + log.Printf("Length of firmware %d", uint32(len(payload))) + + chunks, err := MessageFirmwareErase(payload) + if err != nil { + return err + } + erasemsg, err := d.Driver.SendToDevice(d.dev, chunks) + if err != nil { + return err + } + + switch erasemsg.Kind { + case uint16(messages.MessageType_MessageType_Success): + log.Printf("Success %d! FirmwareErase %s\n", erasemsg.Kind, erasemsg.Data) + case uint16(messages.MessageType_MessageType_Failure): + msg, err := DecodeFailMsg(erasemsg) + if err != nil { + return err + } + + return errors.New(msg) + default: + return fmt.Errorf("received unexpected message type: %s", messages.MessageType(erasemsg.Kind)) + } + + log.Printf("Hash: %x\n", hash) + + chunks, err = MessageFirmwareUpload(payload, hash) + if err != nil { + return err + } + uploadmsg, err := d.Driver.SendToDevice(d.dev, chunks) + if err != nil { + return err + } + + switch uploadmsg.Kind { + case uint16(messages.MessageType_MessageType_ButtonRequest): + log.Println("Please confirm in the device if fingerprints match") + // Send ButtonAck + chunks, err = MessageButtonAck() + if err != nil { + return err + } + resp, err := d.Driver.SendToDevice(d.dev, chunks) + if err != nil { + return err + } + switch resp.Kind { + case uint16(messages.MessageType_MessageType_Success): + return nil + case uint16(messages.MessageType_MessageType_Failure): + var msgStr string + if msgStr, err = DecodeFailMsg(resp); err != nil { + return err + } + return errors.New(msgStr) + default: + return errors.New("unknown response") + } + case uint16(messages.MessageType_MessageType_Failure): + msg, err := DecodeFailMsg(erasemsg) + if err != nil { + return err + } + + return errors.New(msg) + default: + return fmt.Errorf("received unexpected message type: %s", messages.MessageType(erasemsg.Kind)) + } +} + +// GetFeatures send Features message to the device +func (d *Device) GetFeatures() (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + getFeaturesChunks, err := MessageGetFeatures() + if err != nil { + return wire.Message{}, err + } + + return d.Driver.SendToDevice(d.dev, getFeaturesChunks) +} + +// GenerateMnemonic Ask the device to generate a mnemonic and configure itself with it. +func (d *Device) GenerateMnemonic(wordCount uint32, usePassphrase bool) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + if wordCount != 12 && wordCount != 24 { + return wire.Message{}, ErrInvalidWordCount + } + + generateMnemonicChunks, err := MessageGenerateMnemonic(wordCount, usePassphrase) + if err != nil { + return wire.Message{}, err + } + + msg, err := d.Driver.SendToDevice(d.dev, generateMnemonicChunks) + if err != nil { + return msg, err + } + + return msg, err +} + +// Recovery ask the device to perform the seed backup +func (d *Device) Recovery(wordCount uint32, usePassphrase *bool, dryRun bool) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + if wordCount != 12 && wordCount != 24 { + return wire.Message{}, ErrInvalidWordCount + } + + log.Printf("Using passphrase %t\n", usePassphrase) + recoveryChunks, err := MessageRecovery(wordCount, usePassphrase, dryRun) + if err != nil { + return wire.Message{}, err + } + + msg, err := d.Driver.SendToDevice(d.dev, recoveryChunks) + if err != nil { + return wire.Message{}, err + } + log.Printf("Recovery device response kind is: %d\n", msg.Kind) + + return msg, nil +} + +// SetMnemonic Configure the device with a mnemonic. +func (d *Device) SetMnemonic(mnemonic string) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + // Send SetMnemonic + setMnemonicChunks, err := MessageSetMnemonic(mnemonic) + if err != nil { + return wire.Message{}, err + } + msg, err := d.Driver.SendToDevice(d.dev, setMnemonicChunks) + if err != nil { + return wire.Message{}, err + } + + return msg, err +} + +// SignMessage Ask the device to sign a message using the secret key at given index. +func (d *Device) SignMessage(addressN, addressIndex int, message, walletType string) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + var err error + var signMessageChunks [][64]byte + switch walletType { + case WalletTypeDeterministic: + signMessageChunks, err = MessageSignMessage(addressIndex, message) + case WalletTypeBip44: + signMessageChunks, err = MessageSignMessageBip44(uint32(addressIndex), uint32(addressN), coinTypeSkycoin, 0, message) + default: + return wire.Message{}, ErrInvalidWalletType + } + if err != nil { + return wire.Message{}, err + } + + msg, err := d.Driver.SendToDevice(d.dev, signMessageChunks) + if err != nil { + return wire.Message{}, err + } + + return msg, err +} + +// TransactionSign Ask the device to sign a transaction using the given information. +func (d *Device) TransactionSign(inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput, walletType string) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + var err error + var transactionSignChunks [][64]byte + switch walletType { + case WalletTypeDeterministic: + transactionSignChunks, err = MessageTransactionSign(inputs, outputs) + case WalletTypeBip44: + transactionSignChunks, err = MessageTransactionSignBip44(coinTypeSkycoin, 0, inputs, outputs) + default: + return wire.Message{}, ErrInvalidWalletType + } + if err != nil { + return wire.Message{}, err + } + + return d.Driver.SendToDevice(d.dev, transactionSignChunks) +} + +// Wipe wipes out device configuration +func (d *Device) Wipe() (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + wipeChunks, err := MessageWipe() + if err != nil { + return wire.Message{}, err + } + + msg, err := d.Driver.SendToDevice(d.dev, wipeChunks) + if err != nil { + return wire.Message{}, err + } + + return msg, err +} + +// ButtonAck when the device is waiting for the user to press a button +// the PC need to acknowledge, showing it knows we are waiting for a user action +func (d *Device) ButtonAck() (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + // Send ButtonAck + buttonChunks, err := MessageButtonAck() + if err != nil { + return wire.Message{}, err + } + + err = sendToDeviceNoAnswer(d.dev, buttonChunks) + if err != nil { + return wire.Message{}, err + } + + // simulate button press + if d.simulateButtonPress { + if err := d.SimulateButtonPress(); err != nil { + return wire.Message{}, err + } + } + + msg, err := wire.ReadFrom(d.dev) + if err != nil { + return wire.Message{}, err + } + for msg.Kind == uint16(messages.MessageType_MessageType_EntropyRequest) { + var wg sync.WaitGroup + wg.Add(1) + + go func() { + defer wg.Done() + entropyChunks, err := MessageEntropyAck(entropyBufferSize) + if err != nil { + log.Errorf("failed to create entropy ack msg: %v", err) + return + } + + for _, element := range entropyChunks { + _, err := d.dev.Write(element[:]) + if err != nil { + log.Errorf("entropy ack error: %v", err) + return + } + } + }() + + msg, err = wire.ReadFrom(d.dev) + if err != nil { + return wire.Message{}, err + } + wg.Wait() + } + + return *msg, err +} + +// PassphraseAck send this message when the device is waiting for the user to input a passphrase +func (d *Device) PassphraseAck(passphrase string) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + passphraseChunks, err := MessagePassphraseAck(passphrase) + if err != nil { + return wire.Message{}, err + } + + return d.Driver.SendToDevice(d.dev, passphraseChunks) +} + +// WordAck send a word to the device during device "recovery procedure" +func (d *Device) WordAck(word string) (wire.Message, error) { + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + wordAckChunks, err := MessageWordAck(word) + if err != nil { + return wire.Message{}, err + } + + return d.Driver.SendToDevice(d.dev, wordAckChunks) +} + +// PinMatrixAck during PIN code setting use this message to send user input to device +func (d *Device) PinMatrixAck(p string) (wire.Message, error) { + time.Sleep(1 * time.Second) + if err := d.Connect(); err != nil { + return wire.Message{}, err + } + defer d.Disconnect() + + log.Printf("Setting pin %s\n", p) + + pinMatrixChunks, err := MessagePinMatrixAck(p) + if err != nil { + return wire.Message{}, err + } + + return d.Driver.SendToDevice(d.dev, pinMatrixChunks) +} + +// SimulateButtonPress simulates a button press on emulator +func (d *Device) SimulateButtonPress() error { + if d.Driver.DeviceType() != DeviceTypeEmulator { + return fmt.Errorf("wrong device type: %s", d.Driver.DeviceType()) + } + + simulateMsg, err := MessageSimulateButtonPress(d.simulateButtonType) + if err != nil { + return err + } + + _, err = d.dev.Write(simulateMsg.Bytes()) + if err != nil { + return err + } + + return nil +} + +// SetAutoPressButton enables and sets button press type +func (d *Device) SetAutoPressButton(simulateButtonPress bool, simulateButtonType ButtonType) error { + if d.Driver.DeviceType() == DeviceTypeEmulator { + d.simulateButtonPress = simulateButtonPress + + if simulateButtonPress { + switch simulateButtonType { + case ButtonLeft, ButtonRight, ButtonBoth: + d.simulateButtonType = simulateButtonType + default: + return fmt.Errorf("invalid button type: %d", simulateButtonType) + } + } else { + // set invalid button press type + d.simulateButtonType = 3 + } + } + + return nil +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/bus.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/bus.go new file mode 100644 index 00000000..69231452 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/bus.go @@ -0,0 +1,108 @@ +package usb + +import ( + "errors" + "io" + + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + log = logging.MustGetLogger("walletusb") +) + +const ( + VendorT1 = 0x313a + ProductT1Bootloader = 0x0000 + ProductT1Firmware = 0x0001 + VendorT2 = 0x1209 + ProductT2Bootloader = 0x53C0 + ProductT2Firmware = 0x53C1 +) + +var ( + ErrNotFound = errors.New("device not found") + ErrDisconnect = errors.New("device disconnected during action") + ErrClosedDevice = errors.New("closed device") +) + +type DeviceType int + +const ( + TypeT1Hid DeviceType = 0 + TypeT1Webusb DeviceType = 1 + TypeT1WebusbBoot DeviceType = 2 + TypeT2 DeviceType = 3 + TypeT2Boot DeviceType = 4 + TypeEmulator DeviceType = 5 +) + +type Info struct { + Path string + VendorID int + ProductID int + Type DeviceType +} + +type Device interface { + io.ReadWriter + Close(disconnected bool) error +} + +type Bus interface { + // Enumerate returns a list of all the devices accessible in the the system + // - If the vendor id is set to 0 then any vendor matches. + // - If the product id is set to 0 then any product matches. + // - If the vendor and product id are both 0, all devices are returned. + Enumerate(vendorID, productID uint16) ([]Info, error) + Connect(path string) (Device, error) + Has(path string) bool + Close() // called on program exit +} + +type USB struct { + buses []Bus +} + +func Init(buses ...Bus) *USB { + return &USB{ + buses: buses, + } +} + +func (b *USB) Has(path string) bool { + for _, b := range b.buses { + if b.Has(path) { + return true + } + } + return false +} + +func (b *USB) Enumerate(vendorID, productID uint16) ([]Info, error) { + var infos []Info + + for _, b := range b.buses { + l, err := b.Enumerate(vendorID, productID) + if err != nil { + return nil, err + } + infos = append(infos, l...) + } + return infos, nil +} + +func (b *USB) Connect(path string) (Device, error) { + for _, b := range b.buses { + if b.Has(path) { + return b.Connect(path) + } + } + return nil, ErrNotFound +} + +func (b *USB) Close() { + for _, b := range b.buses { + b.Close() + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/hidapi.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/hidapi.go new file mode 100644 index 00000000..841148ca --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/hidapi.go @@ -0,0 +1,189 @@ +// +build darwin,!ios,cgo windows,cgo + +package usb + +import ( + "crypto/sha256" + "encoding/hex" + "errors" + "strings" + "sync" + "sync/atomic" + + lowlevel "github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi" +) + +const ( + hidapiPrefix = "hid" + hidUsagePage = 0xFF00 + hidTimeout = 50 + HIDUse = true +) + +type HIDAPI struct { +} + +func InitHIDAPI() (*HIDAPI, error) { + return &HIDAPI{}, nil +} + +func (b *HIDAPI) Enumerate(vendorID, productID uint16) ([]Info, error) { + var infos []Info + + devs := lowlevel.HidEnumerate(vendorID, productID) + + for _, dev := range devs { // enumerate all devices + if b.match(&dev) { + infos = append(infos, Info{ + Path: b.identify(&dev), + VendorID: int(dev.VendorID), + ProductID: int(dev.ProductID), + Type: TypeT1Hid, + }) + } + } + return infos, nil +} + +func (b *HIDAPI) Has(path string) bool { + return strings.HasPrefix(path, hidapiPrefix) +} + +func (b *HIDAPI) Connect(path string) (Device, error) { + devs := lowlevel.HidEnumerate(0, 0) + + for _, dev := range devs { // enumerate all devices + if b.match(&dev) && b.identify(&dev) == path { + d, err := dev.Open() + if err != nil { + return nil, err + } + prepend, err := b.detectPrepend(d) + if err != nil { + return nil, err + } + return &HID{ + dev: d, + prepend: prepend, + }, nil + } + } + return nil, ErrNotFound +} + +func (b *HIDAPI) match(d *lowlevel.HidDeviceInfo) bool { + vid := d.VendorID + pid := d.ProductID + wallet1 := vid == VendorT1 && (pid == ProductT1Firmware) + wallet2 := vid == VendorT2 && (pid == ProductT2Firmware || pid == ProductT2Bootloader) + return (wallet1 || wallet2) && (d.Interface == int(normalIface.number) || d.UsagePage == hidUsagePage) +} + +func (b *HIDAPI) identify(dev *lowlevel.HidDeviceInfo) string { + path := []byte(dev.Path) + digest := sha256.Sum256(path) + return hidapiPrefix + hex.EncodeToString(digest[:]) +} + +func (b *HIDAPI) Close() { + // nothing +} + +type HID struct { + dev *lowlevel.HidDevice + prepend bool // on windows, see detectPrepend + + closed int32 // atomic + transferMutex sync.Mutex + // closing cannot happen while read/write is hapenning, + // otherwise it segfaults on windows +} + +func (d *HID) Close(disconnected bool) error { + atomic.StoreInt32(&d.closed, 1) + + d.transferMutex.Lock() + err := d.dev.Close() + d.transferMutex.Unlock() + + return err +} + +var unknownErrorMessage = "hidapi: unknown failure" + +// This will write a useless buffer to trezor +// to test whether it is an older HID version on reportid 63 +// or a newer one that is on id 0. +// The older one does not need prepending, the newer one does +// This makes difference only on windows +func (b *HIDAPI) detectPrepend(dev *lowlevel.HidDevice) (bool, error) { + buf := []byte{63} + for i := 0; i < 63; i++ { + buf = append(buf, 0xff) + } + + // first test newer version + w, _ := dev.Write(buf, true) + if w == 65 { + return true, nil + } + + // then test older version + w, err := dev.Write(buf, false) + if err != nil { + return false, err + } + if w == 64 { + return false, nil + } + + return false, errors.New("unknown HID version") +} + +func (d *HID) readWrite(buf []byte, read bool) (int, error) { + for { + closed := (atomic.LoadInt32(&d.closed)) == 1 + if closed { + return 0, ErrClosedDevice + } + + d.transferMutex.Lock() + + var w int + var err error + + if read { + w, err = d.dev.Read(buf, hidTimeout) + } else { + w, err = d.dev.Write(buf, d.prepend) + } + + d.transferMutex.Unlock() + + if err == nil { + // sometimes, empty report is read, skip it + if w > 0 { + return w, err + } + if !read { + return 0, errors.New("HID - empty write") + } + + } else { + if err.Error() == unknownErrorMessage { + return 0, ErrDisconnect + } + return 0, err + } + + // continue the for cycle + } +} + +func (d *HID) Write(buf []byte) (int, error) { + return d.readWrite(buf, false) +} + +func (d *HID) Read(buf []byte) (int, error) { + return d.readWrite(buf, true) +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/hidapi_shim.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/hidapi_shim.go new file mode 100644 index 00000000..2113df32 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/hidapi_shim.go @@ -0,0 +1,45 @@ +// +build linux freebsd + +// shim for linux and freebsd so that daemon.go builds + +package usb + +const HIDUse = false + +type HIDAPI struct { +} + +func InitHIDAPI() (*HIDAPI, error) { + return &HIDAPI{}, nil +} + +func (b *HIDAPI) Enumerate(vendorID, productID uint16) ([]Info, error) { + panic("not implemented for linux and freebsd") +} + +func (b *HIDAPI) Has(path string) bool { + panic("not implemented for linux and freebsd") +} + +func (b *HIDAPI) Connect(path string) (Device, error) { + return &HID{}, nil +} + +type HID struct { +} + +func (d *HID) Close(disconnected bool) error { + panic("not implemented for linux and freebsd") +} + +func (d *HID) Write(buf []byte) (int, error) { + panic("not implemented for linux and freebsd") +} + +func (d *HID) Read(buf []byte) (int, error) { + panic("not implemented for linux and freebsd") +} + +func (b *HIDAPI) Close() { + panic("not implemented for linux and freebsd") +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/libusb.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/libusb.go new file mode 100644 index 00000000..07e29a11 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/libusb.go @@ -0,0 +1,485 @@ +package usb + +import ( + "encoding/hex" + "fmt" + "strings" + "sync" + "sync/atomic" + + lowlevel "github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb" +) + +const ( + libusbPrefix = "lib" + usbConfigNum = 1 + usbConfigIndex = 0 + transferTimeout = 250 +) + +type libusbIfaceData struct { + number uint8 + altSetting uint8 + epIn uint8 + epOut uint8 +} + +var normalIface = libusbIfaceData{ + number: 0, + altSetting: 0, + epIn: 0x81, + epOut: 0x01, +} + +// Old bootloader has different epOut +// We need it here, since on Linux, +// we use libusb instead of hidapi for old BL +var oldBLIface = libusbIfaceData{ + number: 0, + altSetting: 0, + epIn: 0x81, + epOut: 0x02, +} + +type LibUSB struct { + usb lowlevel.Context + only bool + cancel bool + detach bool +} + +func InitLibUSB(onlyLibusb, allowCancel, detach bool) (*LibUSB, error) { + var usb lowlevel.Context + err := lowlevel.Init(&usb) + if err != nil { + return nil, fmt.Errorf(`error when initializing LibUSB. +Are you running skywallet in an environment without USB (for example, docker or travis)'. +Original error: %v`, err) + } + + return &LibUSB{ + usb: usb, + only: onlyLibusb, + cancel: allowCancel, + detach: detach, + }, nil +} + +func (b *LibUSB) Close() { + lowlevel.Exit(b.usb) +} + +func hasIface(dev lowlevel.Device, dIface libusbIfaceData, dClass uint8) (bool, error) { + config, err := lowlevel.Get_Config_Descriptor(dev, usbConfigIndex) + if err != nil { + return false, err + } + + ifaces := config.Interface + for _, iface := range ifaces { + for _, alt := range iface.Altsetting { + if alt.BInterfaceNumber == dIface.number && + alt.BAlternateSetting == dIface.altSetting && + alt.BNumEndpoints == 2 && + alt.BInterfaceClass == dClass && + alt.Endpoint[0].BEndpointAddress == dIface.epIn && + alt.Endpoint[1].BEndpointAddress == dIface.epOut { + return true, nil + } + } + } + return false, nil +} + +func detectOldBL(dev lowlevel.Device) (bool, error) { + return hasIface(dev, oldBLIface, uint8(lowlevel.CLASS_HID)) +} + +func (b *LibUSB) Enumerate(vendorID, productID uint16) ([]Info, error) { + list, err := lowlevel.Get_Device_List(b.usb) + + if err != nil { + return nil, err + } + + defer func() { + lowlevel.Free_Device_List(list, 1) // unlink devices + }() + + var infos []Info + + // There is a bug in libusb that makes + // device appear twice with the same path. + // This is already fixed in libusb 2.0.12; + // however, 2.0.12 has other problems with windows, so we + // patchfix it here + paths := make(map[string]bool) + + for _, dev := range list { + m, t := b.match(dev) + if m { + dd, err := lowlevel.Get_Device_Descriptor(dev) + if err != nil { + continue + } + path := b.identify(dev) + inset := paths[path] + if !inset { + appendInfo := func() { + infos = append(infos, Info{ + Path: path, + VendorID: int(dd.IdVendor), + ProductID: int(dd.IdProduct), + Type: t, + }) + paths[path] = true + } + if vendorID != 0 && productID != 0 { + if dd.IdVendor == vendorID && dd.IdProduct == productID { + appendInfo() + } + } else if vendorID != 0 { + if dd.IdVendor == vendorID { + appendInfo() + } + } else if productID != 0 { + if dd.IdProduct == productID { + appendInfo() + } + } else { + appendInfo() + } + } + } + } + return infos, nil +} + +func (b *LibUSB) Has(path string) bool { + return strings.HasPrefix(path, libusbPrefix) +} + +func (b *LibUSB) Connect(path string) (Device, error) { + list, err := lowlevel.Get_Device_List(b.usb) + if err != nil { + return nil, err + } + + defer func() { + lowlevel.Free_Device_List(list, 1) // unlink devices + }() + + // There is a bug in libusb that makes + // device appear twice with the same path. + // This is already fixed in libusb 2.0.12; + // however, 2.0.12 has other problems with windows, so we + // patchfix it here + mydevs := make([]lowlevel.Device, 0) + for _, dev := range list { + m, _ := b.match(dev) + if m && b.identify(dev) == path { + mydevs = append(mydevs, dev) + } + } + + err = ErrNotFound + for _, dev := range mydevs { + res, errConn := b.connect(dev) + if errConn == nil { + return res, nil + } + err = errConn + } + return nil, err +} + +func (b *LibUSB) setConfiguration(d lowlevel.Device_Handle) { + currConf, err := lowlevel.Get_Configuration(d) + if err != nil { + log.Errorf("current configuration err %s", err.Error()) + } + + if currConf != usbConfigNum { + err = lowlevel.Set_Configuration(d, usbConfigNum) + if err != nil { + // don't abort if set configuration fails + // lowlevel.Close(d) + // return nil, err + log.Errorf("Warning: error at configuration set: %s", err) + } + + currConf, err = lowlevel.Get_Configuration(d) + if err != nil { + log.Errorf("current configuration err %s", err.Error()) + } + } +} + +func (b *LibUSB) claimInterface(d lowlevel.Device_Handle) (bool, error) { + attach := false + usbIfaceNum := int(normalIface.number) + + if b.detach { + kernel, errD := lowlevel.Kernel_Driver_Active(d, usbIfaceNum) + if errD != nil { + lowlevel.Close(d) + return false, errD + } + if kernel { + attach = true + errD = lowlevel.Detach_Kernel_Driver(d, usbIfaceNum) + if errD != nil { + lowlevel.Close(d) + return false, errD + } + } + } + err := lowlevel.Claim_Interface(d, usbIfaceNum) + if err != nil { + lowlevel.Close(d) + return false, err + } + + return attach, nil +} + +func (b *LibUSB) connect(dev lowlevel.Device) (*LibUSBDevice, error) { + oldBL, err := detectOldBL(dev) + if err != nil { + return nil, err + } + + d, err := lowlevel.Open(dev) + if err != nil { + return nil, err + } + + b.setConfiguration(d) + attach, err := b.claimInterface(d) + if err != nil { + return nil, err + } + return &LibUSBDevice{ + dev: d, + closed: 0, + cancel: b.cancel, + attach: attach, + oldBL: oldBL, + }, nil +} + +func matchType(dd *lowlevel.Device_Descriptor) DeviceType { + if dd.IdProduct == ProductT1Firmware { + // this is HID, in platforms where we don't use hidapi (linux, bsd) + return TypeT1Hid + } + + if dd.IdProduct == ProductT2Bootloader { + if int(dd.BcdDevice>>8) == 1 { + return TypeT1WebusbBoot + } + return TypeT2Boot + } + + if int(dd.BcdDevice>>8) == 1 { + return TypeT1Webusb + } + + return TypeT2 +} + +func (b *LibUSB) match(dev lowlevel.Device) (bool, DeviceType) { + dd, err := lowlevel.Get_Device_Descriptor(dev) + if err != nil { + log.Error("error getting descriptor -" + err.Error()) + return false, 0 + } + + vid := dd.IdVendor + pid := dd.IdProduct + if !b.matchVidPid(vid, pid) { + return false, 0 + } + + c, err := lowlevel.Get_Active_Config_Descriptor(dev) + if err != nil { + log.Error("error getting config descriptor " + err.Error()) + return false, 0 + } + + var is bool + usbIfaceNum := normalIface.number + usbAltSetting := normalIface.altSetting + if b.only { + + // if we don't use hidapi at all, keep HID devices + is = (c.BNumInterfaces > usbIfaceNum && + c.Interface[usbIfaceNum].Num_altsetting > int(usbAltSetting)) + + } else { + + is = (c.BNumInterfaces > usbIfaceNum && + c.Interface[usbIfaceNum].Num_altsetting > int(usbAltSetting) && + c.Interface[usbIfaceNum].Altsetting[usbAltSetting].BInterfaceClass == lowlevel.CLASS_VENDOR_SPEC) + } + + if !is { + return false, 0 + } + return true, matchType(dd) +} + +func (b *LibUSB) matchVidPid(vid uint16, pid uint16) bool { + // Note: Trezor1 libusb will actually have the T2 vid/pid + trezor2 := vid == VendorT2 && (pid == ProductT2Firmware || pid == ProductT2Bootloader) + + if b.only { + trezor1 := vid == VendorT1 && (pid == ProductT1Firmware) + return trezor1 || trezor2 + } + + return trezor2 +} + +func (b *LibUSB) identify(dev lowlevel.Device) string { + var ports [8]byte + p, err := lowlevel.Get_Port_Numbers(dev, ports[:]) + if err != nil { + log.Errorf("error getting port numbers %s", err.Error()) + return "" + } + return libusbPrefix + hex.EncodeToString(p) +} + +type LibUSBDevice struct { + dev lowlevel.Device_Handle + + closed int32 // atomic + normalTransferMutex sync.Mutex + debugTransferMutex sync.Mutex + // two interrupt_transfers should not happen at the same time + + cancel bool + attach bool + oldBL bool +} + +func (d *LibUSBDevice) Close(disconnected bool) error { + atomic.StoreInt32(&d.closed, 1) + + if d.cancel { + // libusb close does NOT cancel transfers on close + // => we are using our own function that we added to libusb/sync.c + // this "unblocks" Interrupt_Transfer in readWrite + + lowlevel.Cancel_Sync_Transfers_On_Device(d.dev) + + // reading recently disconnected device sometimes causes weird issues + // => if we *know* it is disconnected, don't finish read queue + // + // Finishing read queue is not necessary when we don't allow cancelling + // (since when we don't allow cancelling, we don't allow session stealing) + if !disconnected { + d.finishReadQueue() + } + } + + iface := int(normalIface.number) + err := lowlevel.Release_Interface(d.dev, iface) + if err != nil { + // do not throw error, it is just release anyway + log.Warnf("Warning: error at releasing interface: %s", err) + } + + if d.attach { + err = lowlevel.Attach_Kernel_Driver(d.dev, iface) + if err != nil { + // do not throw error, it is just re-attach anyway + log.Warnf("Warning: error at re-attaching driver: %s", err) + } + } + + lowlevel.Close(d.dev) + return nil +} + +func (d *LibUSBDevice) transferMutexLock() { + d.normalTransferMutex.Lock() +} + +func (d *LibUSBDevice) transferMutexUnlock() { + d.normalTransferMutex.Unlock() +} + +func (d *LibUSBDevice) finishReadQueue() { + usbEpIn := normalIface.epIn + d.transferMutexLock() + var err error + var buf [64]byte + + for err == nil { + // these transfers have timeouts => should not interfer with + // cancel_sync_transfers_on_device + _, err = lowlevel.Interrupt_Transfer(d.dev, usbEpIn, buf[:], 50) + } + d.transferMutexUnlock() +} + +func (d *LibUSBDevice) readWrite(buf []byte, endpoint uint8) (int, error) { + for { + closed := (atomic.LoadInt32(&d.closed)) == 1 + if closed { + return 0, ErrClosedDevice + } + + d.transferMutexLock() + p, err := lowlevel.Interrupt_Transfer(d.dev, endpoint, buf, transferTimeout) + d.transferMutexUnlock() + + if err != nil { + if isErrorDisconnect(err) { + return 0, ErrDisconnect + } + + return 0, err + } + + // sometimes, empty report is read, skip it + // TODO: is this still needed with 0 timeouts? + if len(p) > 0 { + return len(p), err + } + // continue the for cycle if empty transfer + } +} + +func isErrorDisconnect(err error) bool { + // according to libusb docs, disconnecting device should cause only + // LIBUSB_ERROR_NO_DEVICE error, but in real life, it causes also + // LIBUSB_ERROR_IO, LIBUSB_ERROR_PIPE, LIBUSB_ERROR_OTHER + + return (err.Error() == lowlevel.Error_Name(int(lowlevel.ERROR_IO)) || + err.Error() == lowlevel.Error_Name(int(lowlevel.ERROR_NO_DEVICE)) || + err.Error() == lowlevel.Error_Name(int(lowlevel.ERROR_OTHER)) || + err.Error() == lowlevel.Error_Name(int(lowlevel.ERROR_PIPE))) +} + +func (d *LibUSBDevice) Write(buf []byte) (int, error) { + usbEpOut := normalIface.epOut + if d.oldBL { + usbEpOut = oldBLIface.epOut + } + return d.readWrite(buf, usbEpOut) +} + +func (d *LibUSBDevice) Read(buf []byte) (c int, err error) { + usbEpIn := normalIface.epIn + for { + c, err = d.readWrite(buf, usbEpIn) + if err != nil && err.Error() == "LIBUSB_ERROR_TIMEOUT" { + continue + } + return c, err + } + return c, err +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/udp.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/udp.go new file mode 100644 index 00000000..a990aa8f --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/usb/udp.go @@ -0,0 +1,98 @@ +package usb + +import ( + "fmt" + "io" + "net" + "strconv" + "strings" + "sync/atomic" +) + +const ( + emulatorPrefix = "emulator" +) + +type UDP struct { + ports []int + emulatorAddress string +} + +func InitUDP(ports []int, emulatorAddress string) (*UDP, error) { + udp := UDP{ + ports: ports, + emulatorAddress: emulatorAddress, + } + + return &udp, nil +} + +func (udp *UDP) Enumerate(_, _ uint16) ([]Info, error) { + var infos []Info + + for _, port := range udp.ports { + info := Info{ + Path: emulatorPrefix + strconv.Itoa(port), + VendorID: 0, + ProductID: 0, + Type: TypeEmulator, + } + + infos = append(infos, info) + } + return infos, nil +} + +func (udp *UDP) Has(path string) bool { + return strings.HasPrefix(path, emulatorPrefix) +} + +func (udp *UDP) Connect(path string) (Device, error) { + port, err := strconv.Atoi(strings.TrimPrefix(path, emulatorPrefix)) + if err != nil { + return nil, err + } + + address := fmt.Sprintf("%s:%d", udp.emulatorAddress, port) + dev, err := net.Dial("udp", address) + if err != nil { + return nil, err + } + + d := &UDPDevice{ + dev: dev, + } + return d, nil +} + +func (udp *UDP) Close() { + // nothing +} + +type UDPDevice struct { + dev io.ReadWriteCloser + + closed int32 // atomic +} + +func (d *UDPDevice) Close(disconnected bool) error { + atomic.StoreInt32(&d.closed, 1) + return d.dev.Close() +} + +func (d *UDPDevice) Write(buf []byte) (int, error) { + closed := (atomic.LoadInt32(&d.closed)) == 1 + if closed { + return 0, ErrClosedDevice + } + return d.dev.Write(buf) +} + +func (d *UDPDevice) Read(buf []byte) (int, error) { + closed := (atomic.LoadInt32(&d.closed)) == 1 + if closed { + return 0, ErrClosedDevice + } + + return d.dev.Read(buf) +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/wire/protobuf.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/wire/protobuf.go new file mode 100644 index 00000000..b14dc26d --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/wire/protobuf.go @@ -0,0 +1,57 @@ +package wire + +import ( + "bytes" + "encoding/binary" + "errors" +) + +const ( + ioSeekCurrent = 1 // We define this constant (instead of using directly io.SeekCurrent) to be compatible with go1.6 +) + +var ( + ErrMalformedProtobuf = errors.New("malformed protobuf") +) + +func Validate(buf []byte) error { + const ( + wireVarint = 0 // int32, int64, uint32, uint64, sint32, sint64, bool, enum + wireData = 2 // string, bytes, embedded messages, packed repeated fields + maxFieldSize = 1024 * 1024 * 4 // 4mb field size + ) + + r := bytes.NewReader(buf) + + for r.Len() > 0 { + // read the field key (combination of tag and type) + key, err := binary.ReadUvarint(r) + if err != nil { + return err + } + + // validate the field type + typ := key & 7 + if typ != wireVarint && typ != wireData { + return ErrMalformedProtobuf + } + + // read the field value + val, err := binary.ReadUvarint(r) + if err != nil { + return err + } + if typ == wireData { + // field is length-delimited data, skip the data + if val > maxFieldSize || int64(val) < 0 { + return ErrMalformedProtobuf + } + _, err = r.Seek(int64(val), ioSeekCurrent) + if err != nil { + return err + } + } + } + + return nil +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/wire/v1.go b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/wire/v1.go new file mode 100644 index 00000000..291a7983 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/skywallet/wire/v1.go @@ -0,0 +1,111 @@ +package wire + +import ( + "encoding/binary" + "errors" + "io" +) + +const ( + repMarker = '?' + repMagic = '#' + packetLen = 64 +) + +type Message struct { + Kind uint16 + Data []byte +} + +func (m *Message) WriteTo(w io.Writer) (int64, error) { + var ( + rep [packetLen]byte + kind = m.Kind + size = uint32(len(m.Data)) + ) + // pack header + rep[0] = repMarker + rep[1] = repMagic + rep[2] = repMagic + binary.BigEndian.PutUint16(rep[3:], kind) + binary.BigEndian.PutUint32(rep[5:], size) + + var ( + written = 0 // number of written bytes + offset = 9 // just after the header + ) + for written < len(m.Data) { + n := copy(rep[offset:], m.Data[written:]) + written += n + offset += n + if offset >= len(rep) { + _, err := w.Write(rep[:]) + if err != nil { + return int64(written), err + } + offset = 1 // just after the marker + } + } + if offset != 1 { + for offset < len(rep) { + rep[offset] = 0x00 + offset++ + } + _, err := w.Write(rep[:]) + if err != nil { + return int64(written), err + } + } + + return int64(written), nil +} + +var ( + ErrMalformedMessage = errors.New("malformed wire format") +) + +func ReadFrom(r io.Reader) (*Message, error) { + var ( + rep [packetLen]byte + read = 0 // number of read bytes + ) + n, err := r.Read(rep[:]) + if err != nil { + return nil, err + } + + // skip all the previous messages in the bus + for rep[0] != repMarker || rep[1] != repMagic || rep[2] != repMagic { + n, err = r.Read(rep[:]) + if err != nil { + return nil, err + } + } + read += n + + // parse header + var ( + kind = binary.BigEndian.Uint16(rep[3:]) + size = binary.BigEndian.Uint32(rep[5:]) + data = make([]byte, 0, size) + ) + data = append(data, rep[9:]...) // read data after header + + for uint32(len(data)) < size { + n, err := r.Read(rep[:]) + if err != nil { + return nil, err + } + if rep[0] != repMarker { + return nil, ErrMalformedMessage + } + read += n + data = append(data, rep[1:]...) // read data after marker + } + data = data[:size] + + return &Message{ + Kind: kind, + Data: data, + }, nil +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/README.md b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/README.md new file mode 100644 index 00000000..1990d8e9 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/README.md @@ -0,0 +1,14 @@ +# hidapi go wrapper + +This is a go wrapper around hidapi. + +The code is mostly copied from https://github.com/karalabe/hid + +ALSO NOTE - there is a hardcoded device filter because of random windows errors. + +## License + +Code is under GNU LGPL 2.1. + +* (C) Karel Bilek 2017 +* (C) 2017 Péter Szilágyi (also see https://github.com/karalabe/hid for comprehensive list) diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/AUTHORS.txt b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/AUTHORS.txt new file mode 100644 index 00000000..7acafd78 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/AUTHORS.txt @@ -0,0 +1,16 @@ + +HIDAPI Authors: + +Alan Ott : + Original Author and Maintainer + Linux, Windows, and Mac implementations + +Ludovic Rousseau : + Formatting for Doxygen documentation + Bug fixes + Correctness fixes + + +For a comprehensive list of contributions, see the commit list at github: + http://github.com/signal11/hidapi/commits/master + diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE-bsd.txt b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE-bsd.txt new file mode 100644 index 00000000..538cdf95 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE-bsd.txt @@ -0,0 +1,26 @@ +Copyright (c) 2010, Alan Ott, Signal 11 Software +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Signal 11 Software nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE-gpl3.txt b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE-gpl3.txt new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE-gpl3.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE-orig.txt b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE-orig.txt new file mode 100644 index 00000000..e3f33808 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE-orig.txt @@ -0,0 +1,9 @@ + HIDAPI - Multi-Platform library for + communication with HID devices. + + Copyright 2009, Alan Ott, Signal 11 Software. + All Rights Reserved. + + This software may be used by anyone for any reason so + long as the copyright notice in the source files + remains intact. diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE.txt b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE.txt new file mode 100644 index 00000000..e1676d4c --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/LICENSE.txt @@ -0,0 +1,13 @@ +HIDAPI can be used under one of three licenses. + +1. The GNU General Public License, version 3.0, in LICENSE-gpl3.txt +2. A BSD-Style License, in LICENSE-bsd.txt. +3. The more liberal original HIDAPI license. LICENSE-orig.txt + +The license chosen is at the discretion of the user of HIDAPI. For example: +1. An author of GPL software would likely use HIDAPI under the terms of the +GPL. + +2. An author of commercial closed-source software would likely use HIDAPI +under the terms of the BSD-style license or the original HIDAPI license. + diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/README.txt b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/README.txt new file mode 100644 index 00000000..f19dae4a --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/README.txt @@ -0,0 +1,339 @@ + HIDAPI library for Windows, Linux, FreeBSD and Mac OS X + ========================================================= + +About +====== + +HIDAPI is a multi-platform library which allows an application to interface +with USB and Bluetooth HID-Class devices on Windows, Linux, FreeBSD, and Mac +OS X. HIDAPI can be either built as a shared library (.so or .dll) or +can be embedded directly into a target application by adding a single source +file (per platform) and a single header. + +HIDAPI has four back-ends: + * Windows (using hid.dll) + * Linux/hidraw (using the Kernel's hidraw driver) + * Linux/libusb (using libusb-1.0) + * FreeBSD (using libusb-1.0) + * Mac (using IOHidManager) + +On Linux, either the hidraw or the libusb back-end can be used. There are +tradeoffs, and the functionality supported is slightly different. + +Linux/hidraw (linux/hid.c): +This back-end uses the hidraw interface in the Linux kernel. While this +back-end will support both USB and Bluetooth, it has some limitations on +kernels prior to 2.6.39, including the inability to send or receive feature +reports. In addition, it will only communicate with devices which have +hidraw nodes associated with them. Keyboards, mice, and some other devices +which are blacklisted from having hidraw nodes will not work. Fortunately, +for nearly all the uses of hidraw, this is not a problem. + +Linux/FreeBSD/libusb (libusb/hid.c): +This back-end uses libusb-1.0 to communicate directly to a USB device. This +back-end will of course not work with Bluetooth devices. + +HIDAPI also comes with a Test GUI. The Test GUI is cross-platform and uses +Fox Toolkit (http://www.fox-toolkit.org). It will build on every platform +which HIDAPI supports. Since it relies on a 3rd party library, building it +is optional but recommended because it is so useful when debugging hardware. + +What Does the API Look Like? +============================= +The API provides the the most commonly used HID functions including sending +and receiving of input, output, and feature reports. The sample program, +which communicates with a heavily hacked up version of the Microchip USB +Generic HID sample looks like this (with error checking removed for +simplicity): + +#ifdef WIN32 +#include +#endif +#include +#include +#include "hidapi.h" + +#define MAX_STR 255 + +int main(int argc, char* argv[]) +{ + int res; + unsigned char buf[65]; + wchar_t wstr[MAX_STR]; + hid_device *handle; + int i; + + // Initialize the hidapi library + res = hid_init(); + + // Open the device using the VID, PID, + // and optionally the Serial number. + handle = hid_open(0x4d8, 0x3f, NULL); + + // Read the Manufacturer String + res = hid_get_manufacturer_string(handle, wstr, MAX_STR); + wprintf(L"Manufacturer String: %s\n", wstr); + + // Read the Product String + res = hid_get_product_string(handle, wstr, MAX_STR); + wprintf(L"Product String: %s\n", wstr); + + // Read the Serial Number String + res = hid_get_serial_number_string(handle, wstr, MAX_STR); + wprintf(L"Serial Number String: (%d) %s\n", wstr[0], wstr); + + // Read Indexed String 1 + res = hid_get_indexed_string(handle, 1, wstr, MAX_STR); + wprintf(L"Indexed String 1: %s\n", wstr); + + // Toggle LED (cmd 0x80). The first byte is the report number (0x0). + buf[0] = 0x0; + buf[1] = 0x80; + res = hid_write(handle, buf, 65); + + // Request state (cmd 0x81). The first byte is the report number (0x0). + buf[0] = 0x0; + buf[1] = 0x81; + res = hid_write(handle, buf, 65); + + // Read requested state + res = hid_read(handle, buf, 65); + + // Print out the returned buffer. + for (i = 0; i < 4; i++) + printf("buf[%d]: %d\n", i, buf[i]); + + // Finalize the hidapi library + res = hid_exit(); + + return 0; +} + +If you have your own simple test programs which communicate with standard +hardware development boards (such as those from Microchip, TI, Atmel, +FreeScale and others), please consider sending me something like the above +for inclusion into the HIDAPI source. This will help others who have the +same hardware as you do. + +License +======== +HIDAPI may be used by one of three licenses as outlined in LICENSE.txt. + +Download +========= +HIDAPI can be downloaded from github + git clone git://github.com/signal11/hidapi.git + +Build Instructions +=================== + +This section is long. Don't be put off by this. It's not long because it's +complicated to build HIDAPI; it's quite the opposite. This section is long +because of the flexibility of HIDAPI and the large number of ways in which +it can be built and used. You will likely pick a single build method. + +HIDAPI can be built in several different ways. If you elect to build a +shared library, you will need to build it from the HIDAPI source +distribution. If you choose instead to embed HIDAPI directly into your +application, you can skip the building and look at the provided platform +Makefiles for guidance. These platform Makefiles are located in linux/ +libusb/ mac/ and windows/ and are called Makefile-manual. In addition, +Visual Studio projects are provided. Even if you're going to embed HIDAPI +into your project, it is still beneficial to build the example programs. + + +Prerequisites: +--------------- + + Linux: + ------- + On Linux, you will need to install development packages for libudev, + libusb and optionally Fox-toolkit (for the test GUI). On + Debian/Ubuntu systems these can be installed by running: + sudo apt-get install libudev-dev libusb-1.0-0-dev libfox-1.6-dev + + If you downloaded the source directly from the git repository (using + git clone), you'll need Autotools: + sudo apt-get install autotools-dev autoconf automake libtool + + FreeBSD: + --------- + On FreeBSD you will need to install GNU make, libiconv, and + optionally Fox-Toolkit (for the test GUI). This is done by running + the following: + pkg_add -r gmake libiconv fox16 + + If you downloaded the source directly from the git repository (using + git clone), you'll need Autotools: + pkg_add -r autotools + + Mac: + ----- + On Mac, you will need to install Fox-Toolkit if you wish to build + the Test GUI. There are two ways to do this, and each has a slight + complication. Which method you use depends on your use case. + + If you wish to build the Test GUI just for your own testing on your + own computer, then the easiest method is to install Fox-Toolkit + using ports: + sudo port install fox + + If you wish to build the TestGUI app bundle to redistribute to + others, you will need to install Fox-toolkit from source. This is + because the version of fox that gets installed using ports uses the + ports X11 libraries which are not compatible with the Apple X11 + libraries. If you install Fox with ports and then try to distribute + your built app bundle, it will simply fail to run on other systems. + To install Fox-Toolkit manually, download the source package from + http://www.fox-toolkit.org, extract it, and run the following from + within the extracted source: + ./configure && make && make install + + Windows: + --------- + On Windows, if you want to build the test GUI, you will need to get + the hidapi-externals.zip package from the download site. This + contains pre-built binaries for Fox-toolkit. Extract + hidapi-externals.zip just outside of hidapi, so that + hidapi-externals and hidapi are on the same level, as shown: + + Parent_Folder + | + +hidapi + +hidapi-externals + + Again, this step is not required if you do not wish to build the + test GUI. + + +Building HIDAPI into a shared library on Unix Platforms: +--------------------------------------------------------- + +On Unix-like systems such as Linux, FreeBSD, Mac, and even Windows, using +Mingw or Cygwin, the easiest way to build a standard system-installed shared +library is to use the GNU Autotools build system. If you checked out the +source from the git repository, run the following: + + ./bootstrap + ./configure + make + make install <----- as root, or using sudo + +If you downloaded a source package (ie: if you did not run git clone), you +can skip the ./bootstrap step. + +./configure can take several arguments which control the build. The two most +likely to be used are: + --enable-testgui + Enable build of the Test GUI. This requires Fox toolkit to + be installed. Instructions for installing Fox-Toolkit on + each platform are in the Prerequisites section above. + + --prefix=/usr + Specify where you want the output headers and libraries to + be installed. The example above will put the headers in + /usr/include and the binaries in /usr/lib. The default is to + install into /usr/local which is fine on most systems. + +Building the manual way on Unix platforms: +------------------------------------------- + +Manual Makefiles are provided mostly to give the user and idea what it takes +to build a program which embeds HIDAPI directly inside of it. These should +really be used as examples only. If you want to build a system-wide shared +library, use the Autotools method described above. + + To build HIDAPI using the manual makefiles, change to the directory + of your platform and run make. For example, on Linux run: + cd linux/ + make -f Makefile-manual + + To build the Test GUI using the manual makefiles: + cd testgui/ + make -f Makefile-manual + +Building on Windows: +--------------------- + +To build the HIDAPI DLL on Windows using Visual Studio, build the .sln file +in the windows/ directory. + +To build the Test GUI on windows using Visual Studio, build the .sln file in +the testgui/ directory. + +To build HIDAPI using MinGW or Cygwin using Autotools, use the instructions +in the section titled "Building HIDAPI into a shared library on Unix +Platforms" above. Note that building the Test GUI with MinGW or Cygwin will +require the Windows procedure in the Prerequisites section above (ie: +hidapi-externals.zip). + +To build HIDAPI using MinGW using the Manual Makefiles, see the section +"Building the manual way on Unix platforms" above. + +HIDAPI can also be built using the Windows DDK (now also called the Windows +Driver Kit or WDK). This method was originally required for the HIDAPI build +but not anymore. However, some users still prefer this method. It is not as +well supported anymore but should still work. Patches are welcome if it does +not. To build using the DDK: + + 1. Install the Windows Driver Kit (WDK) from Microsoft. + 2. From the Start menu, in the Windows Driver Kits folder, select Build + Environments, then your operating system, then the x86 Free Build + Environment (or one that is appropriate for your system). + 3. From the console, change directory to the windows/ddk_build/ directory, + which is part of the HIDAPI distribution. + 4. Type build. + 5. You can find the output files (DLL and LIB) in a subdirectory created + by the build system which is appropriate for your environment. On + Windows XP, this directory is objfre_wxp_x86/i386. + +Cross Compiling +================ + +This section talks about cross compiling HIDAPI for Linux using autotools. +This is useful for using HIDAPI on embedded Linux targets. These +instructions assume the most raw kind of embedded Linux build, where all +prerequisites will need to be built first. This process will of course vary +based on your embedded Linux build system if you are using one, such as +OpenEmbedded or Buildroot. + +For the purpose of this section, it will be assumed that the following +environment variables are exported. + + $ export STAGING=$HOME/out + $ export HOST=arm-linux + +STAGING and HOST can be modified to suit your setup. + +Prerequisites +-------------- + +Note that the build of libudev is the very basic configuration. + +Build Libusb. From the libusb source directory, run: + ./configure --host=$HOST --prefix=$STAGING + make + make install + +Build libudev. From the libudev source directory, run: + ./configure --disable-gudev --disable-introspection --disable-hwdb \ + --host=$HOST --prefix=$STAGING + make + make install + +Building HIDAPI +---------------- + +Build HIDAPI: + + PKG_CONFIG_DIR= \ + PKG_CONFIG_LIBDIR=$STAGING/lib/pkgconfig:$STAGING/share/pkgconfig \ + PKG_CONFIG_SYSROOT_DIR=$STAGING \ + ./configure --host=$HOST --prefix=$STAGING + + +Signal 11 Software - 2010-04-11 + 2010-07-28 + 2011-09-10 + 2012-05-01 + 2012-07-03 diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/hidapi/hidapi.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/hidapi/hidapi.h new file mode 100644 index 00000000..b175f499 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/hidapi/hidapi.h @@ -0,0 +1,399 @@ +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/** @file + * @defgroup API hidapi API + */ + +#ifndef HIDAPI_H__ +#define HIDAPI_H__ + +#include +#include + +#ifdef _WIN32 + #define HID_API_EXPORT __declspec(dllexport) + #define HID_API_CALL +#else + #define HID_API_EXPORT /**< API export macro */ + #define HID_API_CALL /**< API call macro */ +#endif + +#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/ + +#ifdef __cplusplus +extern "C" { +#endif + struct hid_device_; + typedef struct hid_device_ hid_device; /**< opaque hidapi structure */ + + /** hidapi info structure */ + struct hid_device_info { + /** Platform-specific device path */ + char *path; + /** Device Vendor ID */ + unsigned short vendor_id; + /** Device Product ID */ + unsigned short product_id; + /** Serial Number */ + wchar_t *serial_number; + /** Device Release Number in binary-coded decimal, + also known as Device Version Number */ + unsigned short release_number; + /** Manufacturer String */ + wchar_t *manufacturer_string; + /** Product string */ + wchar_t *product_string; + /** Usage Page for this Device/Interface + (Windows/Mac only). */ + unsigned short usage_page; + /** Usage for this Device/Interface + (Windows/Mac only).*/ + unsigned short usage; + /** The USB interface which this logical device + represents. Valid on both Linux implementations + in all cases, and valid on the Windows implementation + only if the device contains more than one interface. */ + int interface_number; + + /** Pointer to the next device */ + struct hid_device_info *next; + }; + + + /** @brief Initialize the HIDAPI library. + + This function initializes the HIDAPI library. Calling it is not + strictly necessary, as it will be called automatically by + hid_enumerate() and any of the hid_open_*() functions if it is + needed. This function should be called at the beginning of + execution however, if there is a chance of HIDAPI handles + being opened by different threads simultaneously. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_init(void); + + /** @brief Finalize the HIDAPI library. + + This function frees all of the static data associated with + HIDAPI. It should be called at the end of execution to avoid + memory leaks. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_exit(void); + + /** @brief Enumerate the HID Devices. + + This function returns a linked list of all the HID devices + attached to the system which match vendor_id and product_id. + If @p vendor_id is set to 0 then any vendor matches. + If @p product_id is set to 0 then any product matches. + If @p vendor_id and @p product_id are both set to 0, then + all HID devices will be returned. + + @ingroup API + @param vendor_id The Vendor ID (VID) of the types of device + to open. + @param product_id The Product ID (PID) of the types of + device to open. + + @returns + This function returns a pointer to a linked list of type + struct #hid_device, containing information about the HID devices + attached to the system, or NULL in the case of failure. Free + this linked list by calling hid_free_enumeration(). + */ + struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id); + + /** @brief Free an enumeration Linked List + + This function frees a linked list created by hid_enumerate(). + + @ingroup API + @param devs Pointer to a list of struct_device returned from + hid_enumerate(). + */ + void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs); + + /** @brief Open a HID device using a Vendor ID (VID), Product ID + (PID) and optionally a serial number. + + If @p serial_number is NULL, the first device with the + specified VID and PID is opened. + + @ingroup API + @param vendor_id The Vendor ID (VID) of the device to open. + @param product_id The Product ID (PID) of the device to open. + @param serial_number The Serial Number of the device to open + (Optionally NULL). + + @returns + This function returns a pointer to a #hid_device object on + success or NULL on failure. + */ + HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); + + /** @brief Open a HID device by its path name. + + The path name be determined by calling hid_enumerate(), or a + platform-specific path name can be used (eg: /dev/hidraw0 on + Linux). + + @ingroup API + @param path The path name of the device to open + + @returns + This function returns a pointer to a #hid_device object on + success or NULL on failure. + */ + HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path); + + /** @brief Write an Output report to a HID device. + + The first byte of @p data[] must contain the Report ID. For + devices which only support a single report, this must be set + to 0x0. The remaining bytes contain the report data. Since + the Report ID is mandatory, calls to hid_write() will always + contain one more byte than the report contains. For example, + if a hid report is 16 bytes long, 17 bytes must be passed to + hid_write(), the Report ID (or 0x0, for devices with a + single report), followed by the report data (16 bytes). In + this example, the length passed in would be 17. + + hid_write() will send the data on the first OUT endpoint, if + one exists. If it does not, it will send the data through + the Control Endpoint (Endpoint 0). + + @ingroup API + @param device A device handle returned from hid_open(). + @param data The data to send, including the report number as + the first byte. + @param length The length in bytes of the data to send. + + @returns + This function returns the actual number of bytes written and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length); + + /** @brief Read an Input report from a HID device with timeout. + + Input reports are returned + to the host through the INTERRUPT IN endpoint. The first byte will + contain the Report number if the device uses numbered reports. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data A buffer to put the read data into. + @param length The number of bytes to read. For devices with + multiple reports, make sure to read an extra byte for + the report number. + @param milliseconds timeout in milliseconds or -1 for blocking wait. + + @returns + This function returns the actual number of bytes read and + -1 on error. If no packet was available to be read within + the timeout period, this function returns 0. + */ + int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds); + + /** @brief Read an Input report from a HID device. + + Input reports are returned + to the host through the INTERRUPT IN endpoint. The first byte will + contain the Report number if the device uses numbered reports. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data A buffer to put the read data into. + @param length The number of bytes to read. For devices with + multiple reports, make sure to read an extra byte for + the report number. + + @returns + This function returns the actual number of bytes read and + -1 on error. If no packet was available to be read and + the handle is in non-blocking mode, this function returns 0. + */ + int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length); + + /** @brief Set the device handle to be non-blocking. + + In non-blocking mode calls to hid_read() will return + immediately with a value of 0 if there is no data to be + read. In blocking mode, hid_read() will wait (block) until + there is data to read before returning. + + Nonblocking can be turned on and off at any time. + + @ingroup API + @param device A device handle returned from hid_open(). + @param nonblock enable or not the nonblocking reads + - 1 to enable nonblocking + - 0 to disable nonblocking. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock); + + /** @brief Send a Feature report to the device. + + Feature reports are sent over the Control endpoint as a + Set_Report transfer. The first byte of @p data[] must + contain the Report ID. For devices which only support a + single report, this must be set to 0x0. The remaining bytes + contain the report data. Since the Report ID is mandatory, + calls to hid_send_feature_report() will always contain one + more byte than the report contains. For example, if a hid + report is 16 bytes long, 17 bytes must be passed to + hid_send_feature_report(): the Report ID (or 0x0, for + devices which do not use numbered reports), followed by the + report data (16 bytes). In this example, the length passed + in would be 17. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data The data to send, including the report number as + the first byte. + @param length The length in bytes of the data to send, including + the report number. + + @returns + This function returns the actual number of bytes written and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length); + + /** @brief Get a feature report from a HID device. + + Set the first byte of @p data[] to the Report ID of the + report to be read. Make sure to allow space for this + extra byte in @p data[]. Upon return, the first byte will + still contain the Report ID, and the report data will + start in data[1]. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data A buffer to put the read data into, including + the Report ID. Set the first byte of @p data[] to the + Report ID of the report to be read, or set it to zero + if your device does not use numbered reports. + @param length The number of bytes to read, including an + extra byte for the report ID. The buffer can be longer + than the actual report. + + @returns + This function returns the number of bytes read plus + one for the report ID (which is still in the first + byte), or -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length); + + /** @brief Close a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + */ + void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device); + + /** @brief Get The Manufacturer String from a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen); + + /** @brief Get The Product String from a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen); + + /** @brief Get The Serial Number String from a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen); + + /** @brief Get a string from a HID device, based on its string index. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string_index The index of the string to get. + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen); + + /** @brief Get a string describing the last error which occurred. + + @ingroup API + @param device A device handle returned from hid_open(). + + @returns + This function returns a string containing the last error + which occurred or NULL if none has occurred. + */ + HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device); + +#ifdef __cplusplus +} +#endif + + +static void hid_log(const char * str) { + char nstr[1000]; + snprintf(nstr, 1000, "hidapi: %s\n", str); + goHidLog(nstr); +} + +#endif + diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/mac/hid.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/mac/hid.c new file mode 100644 index 00000000..3178182e --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/c/mac/hid.c @@ -0,0 +1,1110 @@ +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 2010-07-03 + + Copyright 2010, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/* See Apple Technical Note TN2187 for details on IOHidManager. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hidapi/hidapi.h" + +/* Barrier implementation because Mac OSX doesn't have pthread_barrier. + It also doesn't have clock_gettime(). So much for POSIX and SUSv2. + This implementation came from Brent Priddy and was posted on + StackOverflow. It is used with his permission. */ +typedef int pthread_barrierattr_t; +typedef struct pthread_barrier { + pthread_mutex_t mutex; + pthread_cond_t cond; + int count; + int trip_count; +} pthread_barrier_t; + +static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) +{ + if(count == 0) { + errno = EINVAL; + return -1; + } + + if(pthread_mutex_init(&barrier->mutex, 0) < 0) { + return -1; + } + if(pthread_cond_init(&barrier->cond, 0) < 0) { + pthread_mutex_destroy(&barrier->mutex); + return -1; + } + barrier->trip_count = count; + barrier->count = 0; + + return 0; +} + +static int pthread_barrier_destroy(pthread_barrier_t *barrier) +{ + pthread_cond_destroy(&barrier->cond); + pthread_mutex_destroy(&barrier->mutex); + return 0; +} + +static int pthread_barrier_wait(pthread_barrier_t *barrier) +{ + pthread_mutex_lock(&barrier->mutex); + ++(barrier->count); + if(barrier->count >= barrier->trip_count) + { + barrier->count = 0; + pthread_cond_broadcast(&barrier->cond); + pthread_mutex_unlock(&barrier->mutex); + return 1; + } + else + { + pthread_cond_wait(&barrier->cond, &(barrier->mutex)); + pthread_mutex_unlock(&barrier->mutex); + return 0; + } +} + +static int return_data(hid_device *dev, unsigned char *data, size_t length); + +/* Linked List of input reports received from the device. */ +struct input_report { + uint8_t *data; + size_t len; + struct input_report *next; +}; + +struct hid_device_ { + IOHIDDeviceRef device_handle; + int blocking; + int uses_numbered_reports; + int disconnected; + CFStringRef run_loop_mode; + CFRunLoopRef run_loop; + CFRunLoopSourceRef source; + uint8_t *input_report_buf; + CFIndex max_input_report_len; + struct input_report *input_reports; + + pthread_t thread; + pthread_mutex_t mutex; /* Protects input_reports */ + pthread_cond_t condition; + pthread_barrier_t barrier; /* Ensures correct startup sequence */ + pthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */ + int shutdown_thread; +}; + +static hid_device *new_hid_device(void) +{ + hid_device *dev = calloc(1, sizeof(hid_device)); + dev->device_handle = NULL; + dev->blocking = 1; + dev->uses_numbered_reports = 0; + dev->disconnected = 0; + dev->run_loop_mode = NULL; + dev->run_loop = NULL; + dev->source = NULL; + dev->input_report_buf = NULL; + dev->input_reports = NULL; + dev->shutdown_thread = 0; + + /* Thread objects */ + pthread_mutex_init(&dev->mutex, NULL); + pthread_cond_init(&dev->condition, NULL); + pthread_barrier_init(&dev->barrier, NULL, 2); + pthread_barrier_init(&dev->shutdown_barrier, NULL, 2); + + return dev; +} + +static void free_hid_device(hid_device *dev) +{ + if (!dev) + return; + + /* Delete any input reports still left over. */ + struct input_report *rpt = dev->input_reports; + while (rpt) { + struct input_report *next = rpt->next; + free(rpt->data); + free(rpt); + rpt = next; + } + + /* Free the string and the report buffer. The check for NULL + is necessary here as CFRelease() doesn't handle NULL like + free() and others do. */ + if (dev->run_loop_mode) + CFRelease(dev->run_loop_mode); + if (dev->source) + CFRelease(dev->source); + free(dev->input_report_buf); + + /* Clean up the thread objects */ + pthread_barrier_destroy(&dev->shutdown_barrier); + pthread_barrier_destroy(&dev->barrier); + pthread_cond_destroy(&dev->condition); + pthread_mutex_destroy(&dev->mutex); + + /* Free the structure itself. */ + free(dev); +} + +static IOHIDManagerRef hid_mgr = 0x0; + + +#if 0 +static void register_error(hid_device *device, const char *op) +{ + +} +#endif + + +static int32_t get_int_property(IOHIDDeviceRef device, CFStringRef key) +{ + CFTypeRef ref; + int32_t value; + + ref = IOHIDDeviceGetProperty(device, key); + if (ref) { + if (CFGetTypeID(ref) == CFNumberGetTypeID()) { + CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, &value); + return value; + } + } + return 0; +} + +static unsigned short get_vendor_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDVendorIDKey)); +} + +static unsigned short get_product_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDProductIDKey)); +} + +static int32_t get_max_report_length(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDMaxInputReportSizeKey)); +} + +static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t *buf, size_t len) +{ + CFStringRef str; + + if (!len) + return 0; + + str = IOHIDDeviceGetProperty(device, prop); + + buf[0] = 0; + + if (str) { + CFIndex str_len = CFStringGetLength(str); + CFRange range; + CFIndex used_buf_len; + CFIndex chars_copied; + + len --; + + range.location = 0; + range.length = ((size_t)str_len > len)? len: (size_t)str_len; + chars_copied = CFStringGetBytes(str, + range, + kCFStringEncodingUTF32LE, + (char)'?', + FALSE, + (UInt8*)buf, + len * sizeof(wchar_t), + &used_buf_len); + + if (chars_copied == len) + buf[len] = 0; /* len is decremented above */ + else + buf[chars_copied] = 0; + + return 0; + } + else + return -1; + +} + +static int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len); +} + +static int get_manufacturer_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDManufacturerKey), buf, len); +} + +static int get_product_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDProductKey), buf, len); +} + + +/* Implementation of wcsdup() for Mac. */ +static wchar_t *dup_wcs(const wchar_t *s) +{ + size_t len = wcslen(s); + wchar_t *ret = malloc((len+1)*sizeof(wchar_t)); + wcscpy(ret, s); + + return ret; +} + +/* hidapi_IOHIDDeviceGetService() + * + * Return the io_service_t corresponding to a given IOHIDDeviceRef, either by: + * - on OS X 10.6 and above, calling IOHIDDeviceGetService() + * - on OS X 10.5, extract it from the IOHIDDevice struct + */ +static io_service_t hidapi_IOHIDDeviceGetService(IOHIDDeviceRef device) +{ + static void *iokit_framework = NULL; + static io_service_t (*dynamic_IOHIDDeviceGetService)(IOHIDDeviceRef device) = NULL; + + /* Use dlopen()/dlsym() to get a pointer to IOHIDDeviceGetService() if it exists. + * If any of these steps fail, dynamic_IOHIDDeviceGetService will be left NULL + * and the fallback method will be used. + */ + if (iokit_framework == NULL) { + iokit_framework = dlopen("/System/Library/IOKit.framework/IOKit", RTLD_LAZY); + + if (iokit_framework != NULL) + dynamic_IOHIDDeviceGetService = dlsym(iokit_framework, "IOHIDDeviceGetService"); + } + + if (dynamic_IOHIDDeviceGetService != NULL) { + /* Running on OS X 10.6 and above: IOHIDDeviceGetService() exists */ + return dynamic_IOHIDDeviceGetService(device); + } + else + { + /* Running on OS X 10.5: IOHIDDeviceGetService() doesn't exist. + * + * Be naughty and pull the service out of the IOHIDDevice. + * IOHIDDevice is an opaque struct not exposed to applications, but its + * layout is stable through all available versions of OS X. + * Tested and working on OS X 10.5.8 i386, x86_64, and ppc. + */ + struct IOHIDDevice_internal { + /* The first field of the IOHIDDevice struct is a + * CFRuntimeBase (which is a private CF struct). + * + * a, b, and c are the 3 fields that make up a CFRuntimeBase. + * See http://opensource.apple.com/source/CF/CF-476.18/CFRuntime.h + * + * The second field of the IOHIDDevice is the io_service_t we're looking for. + */ + uintptr_t a; + uint8_t b[4]; +#if __LP64__ + uint32_t c; +#endif + io_service_t service; + }; + struct IOHIDDevice_internal *tmp = (struct IOHIDDevice_internal *)device; + + return tmp->service; + } +} + +/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */ +static int init_hid_manager(void) +{ + /* Initialize all the HID Manager Objects */ + hid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + if (hid_mgr) { + IOHIDManagerSetDeviceMatching(hid_mgr, NULL); + IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + return 0; + } + + return -1; +} + +/* Initialize the IOHIDManager if necessary. This is the public function, and + it is safe to call this function repeatedly. Return 0 for success and -1 + for failure. */ +int HID_API_EXPORT hid_init(void) +{ + if (!hid_mgr) { + return init_hid_manager(); + } + + /* Already initialized. */ + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ + if (hid_mgr) { + /* Close the HID manager. */ + IOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone); + CFRelease(hid_mgr); + hid_mgr = NULL; + } + + return 0; +} + +static void process_pending_events(void) { + SInt32 res; + do { + res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE); + } while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut); +} + +struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + CFIndex num_devices; + int i; + + /* Set up the HID Manager if it hasn't been done */ + if (hid_init() < 0) + return NULL; + + /* give the IOHIDManager a chance to update itself */ + process_pending_events(); + + /* Get a list of the Devices */ + IOHIDManagerSetDeviceMatching(hid_mgr, NULL); + CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); + + /* Convert the list into a C array so we can iterate easily. */ + num_devices = CFSetGetCount(device_set); + IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); + CFSetGetValues(device_set, (const void **) device_array); + + /* Iterate over each device, making an entry for it. */ + for (i = 0; i < num_devices; i++) { + unsigned short dev_vid; + unsigned short dev_pid; + #define BUF_LEN 256 + wchar_t buf[BUF_LEN]; + + IOHIDDeviceRef dev = device_array[i]; + + if (!dev) { + continue; + } + dev_vid = get_vendor_id(dev); + dev_pid = get_product_id(dev); + + /* Check the VID/PID against the arguments */ + if ((vendor_id == 0x0 || vendor_id == dev_vid) && + (product_id == 0x0 || product_id == dev_pid)) { + struct hid_device_info *tmp; + io_object_t iokit_dev; + kern_return_t res; + io_string_t path; + + /* VID/PID match. Create the record. */ + tmp = malloc(sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + cur_dev = tmp; + + /* Get the Usage Page and Usage for this device. */ + cur_dev->usage_page = get_int_property(dev, CFSTR(kIOHIDPrimaryUsagePageKey)); + cur_dev->usage = get_int_property(dev, CFSTR(kIOHIDPrimaryUsageKey)); + + /* Fill out the record */ + cur_dev->next = NULL; + + /* Fill in the path (IOService plane) */ + iokit_dev = hidapi_IOHIDDeviceGetService(dev); + res = IORegistryEntryGetPath(iokit_dev, kIOServicePlane, path); + if (res == KERN_SUCCESS) + cur_dev->path = strdup(path); + else + cur_dev->path = strdup(""); + + /* Serial Number */ + get_serial_number(dev, buf, BUF_LEN); + cur_dev->serial_number = dup_wcs(buf); + + /* Manufacturer and Product strings */ + get_manufacturer_string(dev, buf, BUF_LEN); + cur_dev->manufacturer_string = dup_wcs(buf); + get_product_string(dev, buf, BUF_LEN); + cur_dev->product_string = dup_wcs(buf); + + /* VID/PID */ + cur_dev->vendor_id = dev_vid; + cur_dev->product_id = dev_pid; + + /* Release Number */ + cur_dev->release_number = get_int_property(dev, CFSTR(kIOHIDVersionNumberKey)); + + /* Interface Number (Unsupported on Mac)*/ + cur_dev->interface_number = -1; + } + } + + free(device_array); + CFRelease(device_set); + + return root; +} + +void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) +{ + /* This function is identical to the Linux version. Platform independent. */ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + +hid_device * HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + /* This function is identical to the Linux version. Platform independent. */ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device * handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +static void hid_device_removal_callback(void *context, IOReturn result, + void *sender) +{ + /* Stop the Run Loop for this device. */ + hid_device *d = context; + + d->disconnected = 1; + CFRunLoopStop(d->run_loop); +} + +/* The Run Loop calls this function for each input report received. + This function puts the data into a linked list to be picked up by + hid_read(). */ +static void hid_report_callback(void *context, IOReturn result, void *sender, + IOHIDReportType report_type, uint32_t report_id, + uint8_t *report, CFIndex report_length) +{ + struct input_report *rpt; + hid_device *dev = context; + + /* Make a new Input Report object */ + rpt = calloc(1, sizeof(struct input_report)); + rpt->data = calloc(1, report_length); + memcpy(rpt->data, report, report_length); + rpt->len = report_length; + rpt->next = NULL; + + /* Lock this section */ + pthread_mutex_lock(&dev->mutex); + + /* Attach the new report object to the end of the list. */ + if (dev->input_reports == NULL) { + /* The list is empty. Put it at the root. */ + dev->input_reports = rpt; + } + else { + /* Find the end of the list and attach. */ + struct input_report *cur = dev->input_reports; + int num_queued = 0; + while (cur->next != NULL) { + cur = cur->next; + num_queued++; + } + cur->next = rpt; + + /* Pop one off if we've reached 30 in the queue. This + way we don't grow forever if the user never reads + anything from the device. */ + if (num_queued > 30) { + return_data(dev, NULL, 0); + } + } + + /* Signal a waiting thread that there is data. */ + pthread_cond_signal(&dev->condition); + + /* Unlock */ + pthread_mutex_unlock(&dev->mutex); + +} + +/* This gets called when the read_thread's run loop gets signaled by + hid_close(), and serves to stop the read_thread's run loop. */ +static void perform_signal_callback(void *context) +{ + hid_device *dev = context; + CFRunLoopStop(dev->run_loop); /*TODO: CFRunLoopGetCurrent()*/ +} + +static void *read_thread(void *param) +{ + hid_device *dev = param; + SInt32 code; + + /* Move the device's run loop to this thread. */ + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode); + + /* Create the RunLoopSource which is used to signal the + event loop to stop when hid_close() is called. */ + CFRunLoopSourceContext ctx; + memset(&ctx, 0, sizeof(ctx)); + ctx.version = 0; + ctx.info = dev; + ctx.perform = &perform_signal_callback; + dev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx); + CFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode); + + /* Store off the Run Loop so it can be stopped from hid_close() + and on device disconnection. */ + dev->run_loop = CFRunLoopGetCurrent(); + + /* Notify the main thread that the read thread is up and running. */ + pthread_barrier_wait(&dev->barrier); + + /* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input + reports into the hid_report_callback(). */ + while (!dev->shutdown_thread && !dev->disconnected) { + code = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE); + /* Return if the device has been disconnected */ + if (code == kCFRunLoopRunFinished) { + dev->disconnected = 1; + break; + } + + + /* Break if The Run Loop returns Finished or Stopped. */ + if (code != kCFRunLoopRunTimedOut && + code != kCFRunLoopRunHandledSource) { + /* There was some kind of error. Setting + shutdown seems to make sense, but + there may be something else more appropriate */ + dev->shutdown_thread = 1; + break; + } + } + + /* Now that the read thread is stopping, Wake any threads which are + waiting on data (in hid_read_timeout()). Do this under a mutex to + make sure that a thread which is about to go to sleep waiting on + the condition actually will go to sleep before the condition is + signaled. */ + pthread_mutex_lock(&dev->mutex); + pthread_cond_broadcast(&dev->condition); + pthread_mutex_unlock(&dev->mutex); + + /* Wait here until hid_close() is called and makes it past + the call to CFRunLoopWakeUp(). This thread still needs to + be valid when that function is called on the other thread. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + return NULL; +} + +/* hid_open_path() + * + * path must be a valid path to an IOHIDDevice in the IOService plane + * Example: "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/PLAYSTATION(R)3 Controller@fd120000/IOUSBInterface@0/IOUSBHIDDriver" + */ +hid_device * HID_API_EXPORT hid_open_path(const char *path) +{ + hid_device *dev = NULL; + io_registry_entry_t entry = MACH_PORT_NULL; + + dev = new_hid_device(); + + /* Set up the HID Manager if it hasn't been done */ + if (hid_init() < 0) + return NULL; + + /* Get the IORegistry entry for the given path */ + entry = IORegistryEntryFromPath(kIOMasterPortDefault, path); + if (entry == MACH_PORT_NULL) { + /* Path wasn't valid (maybe device was removed?) */ + goto return_error; + } + + /* Create an IOHIDDevice for the entry */ + dev->device_handle = IOHIDDeviceCreate(kCFAllocatorDefault, entry); + if (dev->device_handle == NULL) { + /* Error creating the HID device */ + goto return_error; + } + + /* Open the IOHIDDevice */ + IOReturn ret = IOHIDDeviceOpen(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); + if (ret == kIOReturnSuccess) { + char str[32]; + + /* Create the buffers for receiving data */ + dev->max_input_report_len = (CFIndex) get_max_report_length(dev->device_handle); + dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t)); + + /* Create the Run Loop Mode for this device. + printing the reference seems to work. */ + sprintf(str, "HIDAPI_%p", dev->device_handle); + dev->run_loop_mode = + CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); + + /* Attach the device to a Run Loop */ + IOHIDDeviceRegisterInputReportCallback( + dev->device_handle, dev->input_report_buf, dev->max_input_report_len, + &hid_report_callback, dev); + IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev); + + /* Start the read thread */ + pthread_create(&dev->thread, NULL, read_thread, dev); + + /* Wait here for the read thread to be initialized. */ + pthread_barrier_wait(&dev->barrier); + + IOObjectRelease(entry); + return dev; + } + else { + goto return_error; + } + +return_error: + if (dev->device_handle != NULL) + CFRelease(dev->device_handle); + + if (entry != MACH_PORT_NULL) + IOObjectRelease(entry); + + free_hid_device(dev); + return NULL; +} + +static int set_report(hid_device *dev, IOHIDReportType type, const unsigned char *data, size_t length) +{ + const unsigned char *data_to_send; + size_t length_to_send; + IOReturn res; + + /* Return if the device has been disconnected. */ + if (dev->disconnected) + return -1; + + if (data[0] == 0x0) { + /* Not using numbered Reports. + Don't send the report number. */ + data_to_send = data+1; + length_to_send = length-1; + } + else { + /* Using numbered Reports. + Send the Report Number */ + data_to_send = data; + length_to_send = length; + } + + if (!dev->disconnected) { + res = IOHIDDeviceSetReport(dev->device_handle, + type, + data[0], /* Report ID*/ + data_to_send, length_to_send); + + if (res == kIOReturnSuccess) { + return length; + } + else + return -1; + } + + return -1; +} + +int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + return set_report(dev, kIOHIDReportTypeOutput, data, length); +} + +/* Helper function, so that this isn't duplicated in hid_read(). */ +static int return_data(hid_device *dev, unsigned char *data, size_t length) +{ + /* Copy the data out of the linked list item (rpt) into the + return buffer (data), and delete the liked list item. */ + struct input_report *rpt = dev->input_reports; + size_t len = (length < rpt->len)? length: rpt->len; + memcpy(data, rpt->data, len); + dev->input_reports = rpt->next; + free(rpt->data); + free(rpt); + return len; +} + +static int cond_wait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + while (!dev->input_reports) { + int res = pthread_cond_wait(cond, mutex); + if (res != 0) + return res; + + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; +} + +static int cond_timedwait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) +{ + while (!dev->input_reports) { + int res = pthread_cond_timedwait(cond, mutex, abstime); + if (res != 0) + return res; + + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; + +} + +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + int bytes_read = -1; + + /* Lock the access to the report list. */ + pthread_mutex_lock(&dev->mutex); + + /* There's an input report queued up. Return it. */ + if (dev->input_reports) { + /* Return the first one */ + bytes_read = return_data(dev, data, length); + goto ret; + } + + /* Return if the device has been disconnected. */ + if (dev->disconnected) { + bytes_read = -1; + goto ret; + } + + if (dev->shutdown_thread) { + /* This means the device has been closed (or there + has been an error. An error code of -1 should + be returned. */ + bytes_read = -1; + goto ret; + } + + /* There is no data. Go to sleep and wait for data. */ + + if (milliseconds == -1) { + /* Blocking */ + int res; + res = cond_wait(dev, &dev->condition, &dev->mutex); + if (res == 0) + bytes_read = return_data(dev, data, length); + else { + /* There was an error, or a device disconnection. */ + bytes_read = -1; + } + } + else if (milliseconds > 0) { + /* Non-blocking, but called with timeout. */ + int res; + struct timespec ts; + struct timeval tv; + gettimeofday(&tv, NULL); + TIMEVAL_TO_TIMESPEC(&tv, &ts); + ts.tv_sec += milliseconds / 1000; + ts.tv_nsec += (milliseconds % 1000) * 1000000; + if (ts.tv_nsec >= 1000000000L) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000L; + } + + res = cond_timedwait(dev, &dev->condition, &dev->mutex, &ts); + if (res == 0) + bytes_read = return_data(dev, data, length); + else if (res == ETIMEDOUT) + bytes_read = 0; + else + bytes_read = -1; + } + else { + /* Purely non-blocking */ + bytes_read = 0; + } + +ret: + /* Unlock */ + pthread_mutex_unlock(&dev->mutex); + return bytes_read; +} + +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) +{ + /* All Nonblocking operation is handled by the library. */ + dev->blocking = !nonblock; + + return 0; +} + +int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + return set_report(dev, kIOHIDReportTypeFeature, data, length); +} + +int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + CFIndex len = length; + IOReturn res; + + /* Return if the device has been unplugged. */ + if (dev->disconnected) + return -1; + + res = IOHIDDeviceGetReport(dev->device_handle, + kIOHIDReportTypeFeature, + data[0], /* Report ID */ + data, &len); + if (res == kIOReturnSuccess) + return len; + else + return -1; +} + + +void HID_API_EXPORT hid_close(hid_device *dev) +{ + if (!dev) + return; + + /* Disconnect the report callback before close. */ + if (!dev->disconnected) { + IOHIDDeviceRegisterInputReportCallback( + dev->device_handle, dev->input_report_buf, dev->max_input_report_len, + NULL, dev); + IOHIDDeviceRegisterRemovalCallback(dev->device_handle, NULL, dev); + IOHIDDeviceUnscheduleFromRunLoop(dev->device_handle, dev->run_loop, dev->run_loop_mode); + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode); + } + + /* Cause read_thread() to stop. */ + dev->shutdown_thread = 1; + + /* Wake up the run thread's event loop so that the thread can exit. */ + CFRunLoopSourceSignal(dev->source); + CFRunLoopWakeUp(dev->run_loop); + + /* Notify the read thread that it can shut down now. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + /* Wait for read_thread() to end. */ + pthread_join(dev->thread, NULL); + + /* Close the OS handle to the device, but only if it's not + been unplugged. If it's been unplugged, then calling + IOHIDDeviceClose() will crash. */ + if (!dev->disconnected) { + IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); + } + + /* Clear out the queue of received reports. */ + pthread_mutex_lock(&dev->mutex); + while (dev->input_reports) { + return_data(dev, NULL, 0); + } + pthread_mutex_unlock(&dev->mutex); + CFRelease(dev->device_handle); + + free_hid_device(dev); +} + +int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_manufacturer_string(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_product_string(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_serial_number(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + /* TODO: */ + + return 0; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + /* TODO: */ + + return NULL; +} + + + + + + + +#if 0 +static int32_t get_location_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDLocationIDKey)); +} + +static int32_t get_usage(IOHIDDeviceRef device) +{ + int32_t res; + res = get_int_property(device, CFSTR(kIOHIDDeviceUsageKey)); + if (!res) + res = get_int_property(device, CFSTR(kIOHIDPrimaryUsageKey)); + return res; +} + +static int32_t get_usage_page(IOHIDDeviceRef device) +{ + int32_t res; + res = get_int_property(device, CFSTR(kIOHIDDeviceUsagePageKey)); + if (!res) + res = get_int_property(device, CFSTR(kIOHIDPrimaryUsagePageKey)); + return res; +} + +static int get_transport(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDTransportKey), buf, len); +} + + +int main(void) +{ + IOHIDManagerRef mgr; + int i; + + mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + IOHIDManagerSetDeviceMatching(mgr, NULL); + IOHIDManagerOpen(mgr, kIOHIDOptionsTypeNone); + + CFSetRef device_set = IOHIDManagerCopyDevices(mgr); + + CFIndex num_devices = CFSetGetCount(device_set); + IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); + CFSetGetValues(device_set, (const void **) device_array); + + for (i = 0; i < num_devices; i++) { + IOHIDDeviceRef dev = device_array[i]; + printf("Device: %p\n", dev); + printf(" %04hx %04hx\n", get_vendor_id(dev), get_product_id(dev)); + + wchar_t serial[256], buf[256]; + char cbuf[256]; + get_serial_number(dev, serial, 256); + + + printf(" Serial: %ls\n", serial); + printf(" Loc: %ld\n", get_location_id(dev)); + get_transport(dev, buf, 256); + printf(" Trans: %ls\n", buf); + make_path(dev, cbuf, 256); + printf(" Path: %s\n", cbuf); + + } + + return 0; +} +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/hid.go b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/hid.go new file mode 100644 index 00000000..372f0342 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/hid.go @@ -0,0 +1,237 @@ +// hid - Gopher Interface Devices (USB HID) +// Copyright (c) 2017 Péter Szilágyi. All rights reserved. +// +// This file is released under the 3-clause BSD license. Note however that Linux +// support depends on libusb, released under GNU LGPL 2.1 or later. + +// Package hid provides an interface for USB HID devices. + +// +build darwin,!ios,cgo windows,cgo + +package hidapi + +/* +extern void goHidLog(const char *s); + +#cgo CFLAGS: -I./c + +#cgo darwin CFLAGS: -DOS_DARWIN +#cgo darwin LDFLAGS: -framework CoreFoundation -framework IOKit +#cgo windows CFLAGS: -DOS_WINDOWS +#cgo windows LDFLAGS: -lsetupapi + +#ifdef OS_DARWIN + #include "mac/hid.c" +#elif OS_WINDOWS + #include "windows/hid.c" +#endif + +*/ +import "C" + +import ( + "errors" + "runtime" + "sync" + "unsafe" +) + +// ErrDeviceClosed is returned for operations where the device closed before or +// during the execution. +var ErrDeviceClosed = errors.New("hid: device closed") + +// ErrUnsupportedPlatform is returned for all operations where the underlying +// operating system is not supported by the library. +var ErrUnsupportedPlatform = errors.New("hid: unsupported platform") + +// HidDeviceInfo is a hidapi info structure. +type HidDeviceInfo struct { + Path string // Platform-specific device path + VendorID uint16 // Device Vendor ID + ProductID uint16 // Device Product ID + Release uint16 // Device Release Number in binary-coded decimal, also known as Device Version Number + Serial string // Serial Number + Manufacturer string // Manufacturer String + Product string // Product string + UsagePage uint16 // Usage Page for this Device/Interface (Windows/Mac only) + Usage uint16 // Usage for this Device/Interface (Windows/Mac only) + + // The USB interface which this logical device + // represents. Valid on both Linux implementations + // in all cases, and valid on the Windows implementation + // only if the device contains more than one interface. + Interface int +} + +// enumerateLock is a mutex serializing access to USB device enumeration needed +// by the macOS USB HID system calls, which require 2 consecutive method calls +// for enumeration, causing crashes if called concurrently. +// +// For more details, see: +// https://developer.apple.com/documentation/iokit/1438371-iohidmanagersetdevicematching +// > "subsequent calls will cause the hid manager to release previously enumerated devices" +var enumerateLock sync.Mutex + +func init() { + // Initialize the HIDAPI library + C.hid_init() +} + +// Enumerate returns a list of all the HID devices attached to the system which +// match the vendor and product id: +// - If the vendor id is set to 0 then any vendor matches. +// - If the product id is set to 0 then any product matches. +// - If the vendor and product id are both 0, all HID devices are returned. +func HidEnumerate(vendorID uint16, productID uint16) []HidDeviceInfo { + enumerateLock.Lock() + defer enumerateLock.Unlock() + + // Gather all device infos and ensure they are freed before returning + head := C.hid_enumerate(C.ushort(vendorID), C.ushort(productID)) + if head == nil { + return nil + } + defer C.hid_free_enumeration(head) + + // Iterate the list and retrieve the device details + var infos []HidDeviceInfo + for ; head != nil; head = head.next { + info := HidDeviceInfo{ + Path: C.GoString(head.path), + VendorID: uint16(head.vendor_id), + ProductID: uint16(head.product_id), + Release: uint16(head.release_number), + UsagePage: uint16(head.usage_page), + Usage: uint16(head.usage), + Interface: int(head.interface_number), + } + if head.serial_number != nil { + info.Serial, _ = wcharTToString(head.serial_number) + } + if head.product_string != nil { + info.Product, _ = wcharTToString(head.product_string) + } + if head.manufacturer_string != nil { + info.Manufacturer, _ = wcharTToString(head.manufacturer_string) + } + infos = append(infos, info) + } + return infos +} + +// Open connects to an HID device by its path name. +func (info HidDeviceInfo) Open() (*HidDevice, error) { + path := C.CString(info.Path) + defer C.free(unsafe.Pointer(path)) + + device := C.hid_open_path(path) + if device == nil { + return nil, errors.New("hidapi: failed to open device") + } + return &HidDevice{ + HidDeviceInfo: info, + device: device, + }, nil +} + +// Device is a live HID USB connected device handle. +type HidDevice struct { + HidDeviceInfo // Embed the infos for easier access + + device *C.hid_device // Low level HID device to communicate through + lock sync.Mutex +} + +// Close releases the HID USB device handle. +func (dev *HidDevice) Close() error { + dev.lock.Lock() + defer dev.lock.Unlock() + + if dev.device != nil { + C.hid_close(dev.device) + dev.device = nil + } + return nil +} + +// Write sends an output report to a HID device. +// +// Write will send the data on the first OUT endpoint, if one exists. If it does +// not, it will send the data through the Control Endpoint (Endpoint 0). +func (dev *HidDevice) Write(b []byte, prepend bool) (int, error) { + // Abort if nothing to write + if len(b) == 0 { + return 0, nil + } + // Abort if device closed in between + dev.lock.Lock() + device := dev.device + dev.lock.Unlock() + + if device == nil { + return 0, ErrDeviceClosed + } + // Prepend a HID report ID on Windows, other OSes don't need it + var report []byte + if prepend && runtime.GOOS == "windows" { + report = append([]byte{0x00}, b...) + } else { + report = b + } + // Execute the write operation + written := int(C.hid_write(device, (*C.uchar)(&report[0]), C.size_t(len(report)))) + if written == -1 { + // If the write failed, verify if closed or other error + dev.lock.Lock() + device = dev.device + dev.lock.Unlock() + + if device == nil { + return 0, ErrDeviceClosed + } + // Device not closed, some other error occurred + message := C.hid_error(device) + if message == nil { + return 0, errors.New("hidapi: unknown failure") + } + failure, _ := wcharTToString(message) + return 0, errors.New("hidapi: " + failure) + } + return written, nil +} + +// Read retrieves an input report from a HID device. +func (dev *HidDevice) Read(b []byte, milliseconds int) (int, error) { + // Aborth if nothing to read + if len(b) == 0 { + return 0, nil + } + // Abort if device closed in between + dev.lock.Lock() + device := dev.device + dev.lock.Unlock() + + if device == nil { + return 0, ErrDeviceClosed + } + // Execute the read operation + read := int(C.hid_read_timeout(device, (*C.uchar)(&b[0]), C.size_t(len(b)), C.int(milliseconds))) + if read == -1 { + // If the read failed, verify if closed or other error + dev.lock.Lock() + device = dev.device + dev.lock.Unlock() + + if device == nil { + return 0, ErrDeviceClosed + } + // Device not closed, some other error occurred + message := C.hid_error(device) + if message == nil { + return 0, errors.New("hidapi: unknown failure") + } + failure, _ := wcharTToString(message) + return 0, errors.New("hidapi: " + failure) + } + return read, nil +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/log.go b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/log.go new file mode 100644 index 00000000..c6c8b55f --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/log.go @@ -0,0 +1,20 @@ +package hidapi + +import ( + "io" +) + +import "C" + +var writer io.Writer + +func SetLogWriter(l io.Writer) { + writer = l +} + +//export goHidLog +func goHidLog(s *C.char) { + if writer != nil { + writer.Write([]byte(C.GoString(s))) + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/wchar.go b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/wchar.go new file mode 100644 index 00000000..2278c6b9 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/hidapi/wchar.go @@ -0,0 +1,227 @@ +// This file is https://github.com/orofarne/gowchar/blob/master/gowchar.go +// +// It was vendored inline to work around CGO limitations that don't allow C types +// to directly cross package API boundaries. +// +// The vendored file is licensed under the 3-clause BSD license, according to: +// https://github.com/orofarne/gowchar/blob/master/LICENSE + +// +build !ios +// +build linux freebsd darwin windows + +package hidapi + +/* +#include + +const size_t SIZEOF_WCHAR_T = sizeof(wchar_t); + +void gowchar_set (wchar_t *arr, int pos, wchar_t val) +{ + arr[pos] = val; +} + +wchar_t gowchar_get (wchar_t *arr, int pos) +{ + return arr[pos]; +} +*/ +import "C" + +import ( + "fmt" + "unicode/utf16" + "unicode/utf8" +) + +var sizeofWcharT C.size_t = C.size_t(C.SIZEOF_WCHAR_T) + +func stringToWcharT(s string) (*C.wchar_t, C.size_t) { + switch sizeofWcharT { + case 2: + return stringToWchar2(s) // Windows + case 4: + return stringToWchar4(s) // Unix + default: + panic(fmt.Sprintf("Invalid sizeof(wchar_t) = %v", sizeofWcharT)) + } +} + +func wcharTToString(s *C.wchar_t) (string, error) { + switch sizeofWcharT { + case 2: + return wchar2ToString(s) // Windows + case 4: + return wchar4ToString(s) // Unix + default: + panic(fmt.Sprintf("Invalid sizeof(wchar_t) = %v", sizeofWcharT)) + } +} + +func wcharTNToString(s *C.wchar_t, size C.size_t) (string, error) { + switch sizeofWcharT { + case 2: + return wchar2NToString(s, size) // Windows + case 4: + return wchar4NToString(s, size) // Unix + default: + panic(fmt.Sprintf("Invalid sizeof(wchar_t) = %v", sizeofWcharT)) + } +} + +// Windows +func stringToWchar2(s string) (*C.wchar_t, C.size_t) { + var slen int + s1 := s + for len(s1) > 0 { + r, size := utf8.DecodeRuneInString(s1) + if er, _ := utf16.EncodeRune(r); er == '\uFFFD' { + slen += 1 + } else { + slen += 2 + } + s1 = s1[size:] + } + slen++ // \0 + res := C.malloc(C.size_t(slen) * sizeofWcharT) + var i int + for len(s) > 0 { + r, size := utf8.DecodeRuneInString(s) + if r1, r2 := utf16.EncodeRune(r); r1 != '\uFFFD' { + C.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r1)) + i++ + C.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r2)) + i++ + } else { + C.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r)) + i++ + } + s = s[size:] + } + C.gowchar_set((*C.wchar_t)(res), C.int(slen-1), C.wchar_t(0)) // \0 + return (*C.wchar_t)(res), C.size_t(slen) +} + +// Unix +func stringToWchar4(s string) (*C.wchar_t, C.size_t) { + slen := utf8.RuneCountInString(s) + slen++ // \0 + res := C.malloc(C.size_t(slen) * sizeofWcharT) + var i int + for len(s) > 0 { + r, size := utf8.DecodeRuneInString(s) + C.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r)) + s = s[size:] + i++ + } + C.gowchar_set((*C.wchar_t)(res), C.int(slen-1), C.wchar_t(0)) // \0 + return (*C.wchar_t)(res), C.size_t(slen) +} + +// Windows +func wchar2ToString(s *C.wchar_t) (string, error) { + var i int + var res string + for { + ch := C.gowchar_get(s, C.int(i)) + if ch == 0 { + break + } + r := rune(ch) + i++ + if !utf16.IsSurrogate(r) { + if !utf8.ValidRune(r) { + err := fmt.Errorf("Invalid rune at position %v", i) + return "", err + } + res += string(r) + } else { + ch2 := C.gowchar_get(s, C.int(i)) + r2 := rune(ch2) + r12 := utf16.DecodeRune(r, r2) + if r12 == '\uFFFD' { + err := fmt.Errorf("Invalid surrogate pair at position %v", i-1) + return "", err + } + res += string(r12) + i++ + } + } + return res, nil +} + +// Unix +func wchar4ToString(s *C.wchar_t) (string, error) { + var i int + var res string + for { + ch := C.gowchar_get(s, C.int(i)) + if ch == 0 { + break + } + r := rune(ch) + if !utf8.ValidRune(r) { + err := fmt.Errorf("Invalid rune at position %v", i) + return "", err + } + res += string(r) + i++ + } + return res, nil +} + +// Windows +func wchar2NToString(s *C.wchar_t, size C.size_t) (string, error) { + var i int + var res string + N := int(size) + for i < N { + ch := C.gowchar_get(s, C.int(i)) + if ch == 0 { + break + } + r := rune(ch) + i++ + if !utf16.IsSurrogate(r) { + if !utf8.ValidRune(r) { + err := fmt.Errorf("Invalid rune at position %v", i) + return "", err + } + + res += string(r) + } else { + if i >= N { + err := fmt.Errorf("Invalid surrogate pair at position %v", i-1) + return "", err + } + ch2 := C.gowchar_get(s, C.int(i)) + r2 := rune(ch2) + r12 := utf16.DecodeRune(r, r2) + if r12 == '\uFFFD' { + err := fmt.Errorf("Invalid surrogate pair at position %v", i-1) + return "", err + } + res += string(r12) + i++ + } + } + return res, nil +} + +// Unix +func wchar4NToString(s *C.wchar_t, size C.size_t) (string, error) { + var i int + var res string + N := int(size) + for i < N { + ch := C.gowchar_get(s, C.int(i)) + r := rune(ch) + if !utf8.ValidRune(r) { + err := fmt.Errorf("Invalid rune at position %v", i) + return "", err + } + res += string(r) + i++ + } + return res, nil +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/README.md b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/README.md new file mode 100644 index 00000000..7f3d5865 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/README.md @@ -0,0 +1,14 @@ +# libusb go wrapper + +This is a go wrapper around libusb + +The code is mostly copied from https://github.com/deadsy/libusb + +ALSO NOTE - there is a hardcoded device filter because of random windows errors + +## License + +Code is under GNU LGPL 2.1. + +* (C) Karel Bilek 2017 +* (c) 2017 Jason T. Harris (also see https://github.com/deadsy/libusb for comprehensive list) diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/AUTHORS b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/AUTHORS new file mode 100644 index 00000000..70d407bd --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/AUTHORS @@ -0,0 +1,89 @@ +Copyright © 2001 Johannes Erdfelt +Copyright © 2007-2009 Daniel Drake +Copyright © 2010-2012 Peter Stuge +Copyright © 2008-2016 Nathan Hjelm +Copyright © 2009-2013 Pete Batard +Copyright © 2009-2013 Ludovic Rousseau +Copyright © 2010-2012 Michael Plante +Copyright © 2011-2013 Hans de Goede +Copyright © 2012-2013 Martin Pieuchot +Copyright © 2012-2013 Toby Gray +Copyright © 2013-2015 Chris Dickens + +Other contributors: +Akshay Jaggi +Alan Ott +Alan Stern +Alex Vatchenko +Andrew Fernandes +Anthony Clay +Antonio Ospite +Artem Egorkine +Aurelien Jarno +Bastien Nocera +Bei Zhang +Benjamin Dobell +Carl Karsten +Colin Walters +Dave Camarillo +David Engraf +David Moore +Davidlohr Bueso +Federico Manzan +Felipe Balbi +Florian Albrechtskirchinger +Francesco Montorsi +Francisco Facioni +Gaurav Gupta +Graeme Gill +Gustavo Zacarias +Hans Ulrich Niedermann +Hector Martin +Hoi-Ho Chan +Ilya Konstantinov +James Hanko +John Sheu +Joshua Blake +Justin Bischoff +Karsten Koenig +Konrad Rzepecki +Kuangye Guo +Lars Kanis +Lars Wirzenius +Luca Longinotti +Marcus Meissner +Markus Heidelberg +Martin Ettl +Martin Koegler +Matthias Bolte +Mike Frysinger +Mikhail Gusarov +Moritz Fischer +Ларионов Даниил +Nicholas Corgan +Omri Iluz +Orin Eman +Paul Fertser +Pekka Nikander +Rob Walker +Sean McBride +Sebastian Pipping +Simon Haggett +Simon Newton +Thomas Röfer +Tim Hutt +Tim Roberts +Tobias Klauser +Toby Peterson +Tormod Volden +Trygve Laugstøl +Uri Lublin +Vasily Khoruzhick +Vegard Storheil Eriksen +Venkatesh Shukla +Vitali Lovich +Xiaofan Chen +Zoltán Kovács +Роман Донченко +parafin +xantares diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/COPYING b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/COPYING new file mode 100644 index 00000000..5ab7695a --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/config.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/config.h new file mode 100644 index 00000000..e004f03c --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/config.h @@ -0,0 +1,3 @@ +#ifndef CONFIG_H +#define CONFIG_H +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/core.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/core.c new file mode 100644 index 00000000..4373d35f --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/core.c @@ -0,0 +1,2491 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * Core functions for libusb + * Copyright © 2012-2013 Nathan Hjelm + * Copyright © 2007-2008 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYSLOG_H +#include +#endif + +#ifdef __ANDROID__ +#include +#endif + +#include "libusbi.h" +#include "hotplug.h" + +#if defined(OS_LINUX) +const struct usbi_os_backend * const usbi_backend = &linux_usbfs_backend; +#elif defined(OS_DARWIN) +const struct usbi_os_backend * const usbi_backend = &darwin_backend; +#elif defined(OS_OPENBSD) +const struct usbi_os_backend * const usbi_backend = &openbsd_backend; +#elif defined(OS_NETBSD) +const struct usbi_os_backend * const usbi_backend = &netbsd_backend; +#elif defined(OS_WINDOWS) + +#if defined(USE_USBDK) +const struct usbi_os_backend * const usbi_backend = &usbdk_backend; +#else +const struct usbi_os_backend * const usbi_backend = &windows_backend; +#endif + +#elif defined(OS_WINCE) +const struct usbi_os_backend * const usbi_backend = &wince_backend; +#elif defined(OS_HAIKU) +const struct usbi_os_backend * const usbi_backend = &haiku_usb_raw_backend; +#elif defined (OS_SUNOS) +const struct usbi_os_backend * const usbi_backend = &sunos_backend; +#else +#error "Unsupported OS" +#endif + +struct libusb_context *usbi_default_context = NULL; +static const struct libusb_version libusb_version_internal = + { LIBUSB_MAJOR, LIBUSB_MINOR, LIBUSB_MICRO, LIBUSB_NANO, + LIBUSB_RC, "http://libusb.info" }; +static int default_context_refcnt = 0; +static usbi_mutex_static_t default_context_lock = USBI_MUTEX_INITIALIZER; +static struct timespec timestamp_origin = { 0, 0 }; + +usbi_mutex_static_t active_contexts_lock = USBI_MUTEX_INITIALIZER; +struct list_head active_contexts_list; + +/** + * \mainpage libusb-1.0 API Reference + * + * \section intro Introduction + * + * libusb is an open source library that allows you to communicate with USB + * devices from userspace. For more info, see the + * libusb homepage. + * + * This documentation is aimed at application developers wishing to + * communicate with USB peripherals from their own software. After reviewing + * this documentation, feedback and questions can be sent to the + * libusb-devel mailing list. + * + * This documentation assumes knowledge of how to operate USB devices from + * a software standpoint (descriptors, configurations, interfaces, endpoints, + * control/bulk/interrupt/isochronous transfers, etc). Full information + * can be found in the USB 3.0 + * Specification which is available for free download. You can probably + * find less verbose introductions by searching the web. + * + * \section API Application Programming Interface (API) + * + * See the \ref libusb_api page for a complete list of the libusb functions. + * + * \section features Library features + * + * - All transfer types supported (control/bulk/interrupt/isochronous) + * - 2 transfer interfaces: + * -# Synchronous (simple) + * -# Asynchronous (more complicated, but more powerful) + * - Thread safe (although the asynchronous interface means that you + * usually won't need to thread) + * - Lightweight with lean API + * - Compatible with libusb-0.1 through the libusb-compat-0.1 translation layer + * - Hotplug support (on some platforms). See \ref libusb_hotplug. + * + * \section gettingstarted Getting Started + * + * To begin reading the API documentation, start with the Modules page which + * links to the different categories of libusb's functionality. + * + * One decision you will have to make is whether to use the synchronous + * or the asynchronous data transfer interface. The \ref libusb_io documentation + * provides some insight into this topic. + * + * Some example programs can be found in the libusb source distribution under + * the "examples" subdirectory. The libusb homepage includes a list of + * real-life project examples which use libusb. + * + * \section errorhandling Error handling + * + * libusb functions typically return 0 on success or a negative error code + * on failure. These negative error codes relate to LIBUSB_ERROR constants + * which are listed on the \ref libusb_misc "miscellaneous" documentation page. + * + * \section msglog Debug message logging + * + * libusb uses stderr for all logging. By default, logging is set to NONE, + * which means that no output will be produced. However, unless the library + * has been compiled with logging disabled, then any application calls to + * libusb_set_debug(), or the setting of the environmental variable + * LIBUSB_DEBUG outside of the application, can result in logging being + * produced. Your application should therefore not close stderr, but instead + * direct it to the null device if its output is undesirable. + * + * The libusb_set_debug() function can be used to enable logging of certain + * messages. Under standard configuration, libusb doesn't really log much + * so you are advised to use this function to enable all error/warning/ + * informational messages. It will help debug problems with your software. + * + * The logged messages are unstructured. There is no one-to-one correspondence + * between messages being logged and success or failure return codes from + * libusb functions. There is no format to the messages, so you should not + * try to capture or parse them. They are not and will not be localized. + * These messages are not intended to being passed to your application user; + * instead, you should interpret the error codes returned from libusb functions + * and provide appropriate notification to the user. The messages are simply + * there to aid you as a programmer, and if you're confused because you're + * getting a strange error code from a libusb function, enabling message + * logging may give you a suitable explanation. + * + * The LIBUSB_DEBUG environment variable can be used to enable message logging + * at run-time. This environment variable should be set to a log level number, + * which is interpreted the same as the libusb_set_debug() parameter. When this + * environment variable is set, the message logging verbosity level is fixed + * and libusb_set_debug() effectively does nothing. + * + * libusb can be compiled without any logging functions, useful for embedded + * systems. In this case, libusb_set_debug() and the LIBUSB_DEBUG environment + * variable have no effects. + * + * libusb can also be compiled with verbose debugging messages always. When + * the library is compiled in this way, all messages of all verbosities are + * always logged. libusb_set_debug() and the LIBUSB_DEBUG environment variable + * have no effects. + * + * \section remarks Other remarks + * + * libusb does have imperfections. The \ref libusb_caveats "caveats" page attempts + * to document these. + */ + +/** + * \page libusb_caveats Caveats + * + * \section devresets Device resets + * + * The libusb_reset_device() function allows you to reset a device. If your + * program has to call such a function, it should obviously be aware that + * the reset will cause device state to change (e.g. register values may be + * reset). + * + * The problem is that any other program could reset the device your program + * is working with, at any time. libusb does not offer a mechanism to inform + * you when this has happened, so if someone else resets your device it will + * not be clear to your own program why the device state has changed. + * + * Ultimately, this is a limitation of writing drivers in userspace. + * Separation from the USB stack in the underlying kernel makes it difficult + * for the operating system to deliver such notifications to your program. + * The Linux kernel USB stack allows such reset notifications to be delivered + * to in-kernel USB drivers, but it is not clear how such notifications could + * be delivered to second-class drivers that live in userspace. + * + * \section blockonly Blocking-only functionality + * + * The functionality listed below is only available through synchronous, + * blocking functions. There are no asynchronous/non-blocking alternatives, + * and no clear ways of implementing these. + * + * - Configuration activation (libusb_set_configuration()) + * - Interface/alternate setting activation (libusb_set_interface_alt_setting()) + * - Releasing of interfaces (libusb_release_interface()) + * - Clearing of halt/stall condition (libusb_clear_halt()) + * - Device resets (libusb_reset_device()) + * + * \section configsel Configuration selection and handling + * + * When libusb presents a device handle to an application, there is a chance + * that the corresponding device may be in unconfigured state. For devices + * with multiple configurations, there is also a chance that the configuration + * currently selected is not the one that the application wants to use. + * + * The obvious solution is to add a call to libusb_set_configuration() early + * on during your device initialization routines, but there are caveats to + * be aware of: + * -# If the device is already in the desired configuration, calling + * libusb_set_configuration() using the same configuration value will cause + * a lightweight device reset. This may not be desirable behaviour. + * -# In the case where the desired configuration is already active, libusb + * may not even be able to perform a lightweight device reset. For example, + * take my USB keyboard with fingerprint reader: I'm interested in driving + * the fingerprint reader interface through libusb, but the kernel's + * USB-HID driver will almost always have claimed the keyboard interface. + * Because the kernel has claimed an interface, it is not even possible to + * perform the lightweight device reset, so libusb_set_configuration() will + * fail. (Luckily the device in question only has a single configuration.) + * -# libusb will be unable to set a configuration if other programs or + * drivers have claimed interfaces. In particular, this means that kernel + * drivers must be detached from all the interfaces before + * libusb_set_configuration() may succeed. + * + * One solution to some of the above problems is to consider the currently + * active configuration. If the configuration we want is already active, then + * we don't have to select any configuration: +\code +cfg = -1; +libusb_get_configuration(dev, &cfg); +if (cfg != desired) + libusb_set_configuration(dev, desired); +\endcode + * + * This is probably suitable for most scenarios, but is inherently racy: + * another application or driver may change the selected configuration + * after the libusb_get_configuration() call. + * + * Even in cases where libusb_set_configuration() succeeds, consider that other + * applications or drivers may change configuration after your application + * calls libusb_set_configuration(). + * + * One possible way to lock your device into a specific configuration is as + * follows: + * -# Set the desired configuration (or use the logic above to realise that + * it is already in the desired configuration) + * -# Claim the interface that you wish to use + * -# Check that the currently active configuration is the one that you want + * to use. + * + * The above method works because once an interface is claimed, no application + * or driver is able to select another configuration. + * + * \section earlycomp Early transfer completion + * + * NOTE: This section is currently Linux-centric. I am not sure if any of these + * considerations apply to Darwin or other platforms. + * + * When a transfer completes early (i.e. when less data is received/sent in + * any one packet than the transfer buffer allows for) then libusb is designed + * to terminate the transfer immediately, not transferring or receiving any + * more data unless other transfers have been queued by the user. + * + * On legacy platforms, libusb is unable to do this in all situations. After + * the incomplete packet occurs, "surplus" data may be transferred. For recent + * versions of libusb, this information is kept (the data length of the + * transfer is updated) and, for device-to-host transfers, any surplus data was + * added to the buffer. Still, this is not a nice solution because it loses the + * information about the end of the short packet, and the user probably wanted + * that surplus data to arrive in the next logical transfer. + * + * + * \section zlp Zero length packets + * + * - libusb is able to send a packet of zero length to an endpoint simply by + * submitting a transfer of zero length. + * - The \ref libusb_transfer_flags::LIBUSB_TRANSFER_ADD_ZERO_PACKET + * "LIBUSB_TRANSFER_ADD_ZERO_PACKET" flag is currently only supported on Linux. + */ + +/** + * \page libusb_contexts Contexts + * + * It is possible that libusb may be used simultaneously from two independent + * libraries linked into the same executable. For example, if your application + * has a plugin-like system which allows the user to dynamically load a range + * of modules into your program, it is feasible that two independently + * developed modules may both use libusb. + * + * libusb is written to allow for these multiple user scenarios. The two + * "instances" of libusb will not interfere: libusb_set_debug() calls + * from one user will not affect the same settings for other users, other + * users can continue using libusb after one of them calls libusb_exit(), etc. + * + * This is made possible through libusb's context concept. When you + * call libusb_init(), you are (optionally) given a context. You can then pass + * this context pointer back into future libusb functions. + * + * In order to keep things simple for more simplistic applications, it is + * legal to pass NULL to all functions requiring a context pointer (as long as + * you're sure no other code will attempt to use libusb from the same process). + * When you pass NULL, the default context will be used. The default context + * is created the first time a process calls libusb_init() when no other + * context is alive. Contexts are destroyed during libusb_exit(). + * + * The default context is reference-counted and can be shared. That means that + * if libusb_init(NULL) is called twice within the same process, the two + * users end up sharing the same context. The deinitialization and freeing of + * the default context will only happen when the last user calls libusb_exit(). + * In other words, the default context is created and initialized when its + * reference count goes from 0 to 1, and is deinitialized and destroyed when + * its reference count goes from 1 to 0. + * + * You may be wondering why only a subset of libusb functions require a + * context pointer in their function definition. Internally, libusb stores + * context pointers in other objects (e.g. libusb_device instances) and hence + * can infer the context from those objects. + */ + + /** + * \page libusb_api Application Programming Interface + * + * This is the complete list of libusb functions, structures and + * enumerations in alphabetical order. + * + * \section Functions + * - libusb_alloc_streams() + * - libusb_alloc_transfer() + * - libusb_attach_kernel_driver() + * - libusb_bulk_transfer() + * - libusb_cancel_transfer() + * - libusb_claim_interface() + * - libusb_clear_halt() + * - libusb_close() + * - libusb_control_transfer() + * - libusb_control_transfer_get_data() + * - libusb_control_transfer_get_setup() + * - libusb_cpu_to_le16() + * - libusb_detach_kernel_driver() + * - libusb_dev_mem_alloc() + * - libusb_dev_mem_free() + * - libusb_error_name() + * - libusb_event_handler_active() + * - libusb_event_handling_ok() + * - libusb_exit() + * - libusb_fill_bulk_stream_transfer() + * - libusb_fill_bulk_transfer() + * - libusb_fill_control_setup() + * - libusb_fill_control_transfer() + * - libusb_fill_interrupt_transfer() + * - libusb_fill_iso_transfer() + * - libusb_free_bos_descriptor() + * - libusb_free_config_descriptor() + * - libusb_free_container_id_descriptor() + * - libusb_free_device_list() + * - libusb_free_pollfds() + * - libusb_free_ss_endpoint_companion_descriptor() + * - libusb_free_ss_usb_device_capability_descriptor() + * - libusb_free_streams() + * - libusb_free_transfer() + * - libusb_free_usb_2_0_extension_descriptor() + * - libusb_get_active_config_descriptor() + * - libusb_get_bos_descriptor() + * - libusb_get_bus_number() + * - libusb_get_config_descriptor() + * - libusb_get_config_descriptor_by_value() + * - libusb_get_configuration() + * - libusb_get_container_id_descriptor() + * - libusb_get_descriptor() + * - libusb_get_device() + * - libusb_get_device_address() + * - libusb_get_device_descriptor() + * - libusb_get_device_list() + * - libusb_get_device_speed() + * - libusb_get_iso_packet_buffer() + * - libusb_get_iso_packet_buffer_simple() + * - libusb_get_max_iso_packet_size() + * - libusb_get_max_packet_size() + * - libusb_get_next_timeout() + * - libusb_get_parent() + * - libusb_get_pollfds() + * - libusb_get_port_number() + * - libusb_get_port_numbers() + * - libusb_get_port_path() + * - libusb_get_ss_endpoint_companion_descriptor() + * - libusb_get_ss_usb_device_capability_descriptor() + * - libusb_get_string_descriptor() + * - libusb_get_string_descriptor_ascii() + * - libusb_get_usb_2_0_extension_descriptor() + * - libusb_get_version() + * - libusb_handle_events() + * - libusb_handle_events_completed() + * - libusb_handle_events_locked() + * - libusb_handle_events_timeout() + * - libusb_handle_events_timeout_completed() + * - libusb_has_capability() + * - libusb_hotplug_deregister_callback() + * - libusb_hotplug_register_callback() + * - libusb_init() + * - libusb_interrupt_event_handler() + * - libusb_interrupt_transfer() + * - libusb_kernel_driver_active() + * - libusb_lock_events() + * - libusb_lock_event_waiters() + * - libusb_open() + * - libusb_open_device_with_vid_pid() + * - libusb_pollfds_handle_timeouts() + * - libusb_ref_device() + * - libusb_release_interface() + * - libusb_reset_device() + * - libusb_set_auto_detach_kernel_driver() + * - libusb_set_configuration() + * - libusb_set_debug() + * - libusb_set_interface_alt_setting() + * - libusb_set_iso_packet_lengths() + * - libusb_setlocale() + * - libusb_set_pollfd_notifiers() + * - libusb_strerror() + * - libusb_submit_transfer() + * - libusb_transfer_get_stream_id() + * - libusb_transfer_set_stream_id() + * - libusb_try_lock_events() + * - libusb_unlock_events() + * - libusb_unlock_event_waiters() + * - libusb_unref_device() + * - libusb_wait_for_event() + * + * \section Structures + * - libusb_bos_descriptor + * - libusb_bos_dev_capability_descriptor + * - libusb_config_descriptor + * - libusb_container_id_descriptor + * - \ref libusb_context + * - libusb_control_setup + * - \ref libusb_device + * - libusb_device_descriptor + * - \ref libusb_device_handle + * - libusb_endpoint_descriptor + * - libusb_interface + * - libusb_interface_descriptor + * - libusb_iso_packet_descriptor + * - libusb_pollfd + * - libusb_ss_endpoint_companion_descriptor + * - libusb_ss_usb_device_capability_descriptor + * - libusb_transfer + * - libusb_usb_2_0_extension_descriptor + * - libusb_version + * + * \section Enums + * - \ref libusb_bos_type + * - \ref libusb_capability + * - \ref libusb_class_code + * - \ref libusb_descriptor_type + * - \ref libusb_endpoint_direction + * - \ref libusb_error + * - \ref libusb_iso_sync_type + * - \ref libusb_iso_usage_type + * - \ref libusb_log_level + * - \ref libusb_request_recipient + * - \ref libusb_request_type + * - \ref libusb_speed + * - \ref libusb_ss_usb_device_capability_attributes + * - \ref libusb_standard_request + * - \ref libusb_supported_speed + * - \ref libusb_transfer_flags + * - \ref libusb_transfer_status + * - \ref libusb_transfer_type + * - \ref libusb_usb_2_0_extension_attributes + */ + +/** + * @defgroup libusb_lib Library initialization/deinitialization + * This page details how to initialize and deinitialize libusb. Initialization + * must be performed before using any libusb functionality, and similarly you + * must not call any libusb functions after deinitialization. + */ + +/** + * @defgroup libusb_dev Device handling and enumeration + * The functionality documented below is designed to help with the following + * operations: + * - Enumerating the USB devices currently attached to the system + * - Choosing a device to operate from your software + * - Opening and closing the chosen device + * + * \section nutshell In a nutshell... + * + * The description below really makes things sound more complicated than they + * actually are. The following sequence of function calls will be suitable + * for almost all scenarios and does not require you to have such a deep + * understanding of the resource management issues: + * \code +// discover devices +libusb_device **list; +libusb_device *found = NULL; +ssize_t cnt = libusb_get_device_list(NULL, &list); +ssize_t i = 0; +int err = 0; +if (cnt < 0) + error(); + +for (i = 0; i < cnt; i++) { + libusb_device *device = list[i]; + if (is_interesting(device)) { + found = device; + break; + } +} + +if (found) { + libusb_device_handle *handle; + + err = libusb_open(found, &handle); + if (err) + error(); + // etc +} + +libusb_free_device_list(list, 1); +\endcode + * + * The two important points: + * - You asked libusb_free_device_list() to unreference the devices (2nd + * parameter) + * - You opened the device before freeing the list and unreferencing the + * devices + * + * If you ended up with a handle, you can now proceed to perform I/O on the + * device. + * + * \section devshandles Devices and device handles + * libusb has a concept of a USB device, represented by the + * \ref libusb_device opaque type. A device represents a USB device that + * is currently or was previously connected to the system. Using a reference + * to a device, you can determine certain information about the device (e.g. + * you can read the descriptor data). + * + * The libusb_get_device_list() function can be used to obtain a list of + * devices currently connected to the system. This is known as device + * discovery. + * + * Just because you have a reference to a device does not mean it is + * necessarily usable. The device may have been unplugged, you may not have + * permission to operate such device, or another program or driver may be + * using the device. + * + * When you've found a device that you'd like to operate, you must ask + * libusb to open the device using the libusb_open() function. Assuming + * success, libusb then returns you a device handle + * (a \ref libusb_device_handle pointer). All "real" I/O operations then + * operate on the handle rather than the original device pointer. + * + * \section devref Device discovery and reference counting + * + * Device discovery (i.e. calling libusb_get_device_list()) returns a + * freshly-allocated list of devices. The list itself must be freed when + * you are done with it. libusb also needs to know when it is OK to free + * the contents of the list - the devices themselves. + * + * To handle these issues, libusb provides you with two separate items: + * - A function to free the list itself + * - A reference counting system for the devices inside + * + * New devices presented by the libusb_get_device_list() function all have a + * reference count of 1. You can increase and decrease reference count using + * libusb_ref_device() and libusb_unref_device(). A device is destroyed when + * its reference count reaches 0. + * + * With the above information in mind, the process of opening a device can + * be viewed as follows: + * -# Discover devices using libusb_get_device_list(). + * -# Choose the device that you want to operate, and call libusb_open(). + * -# Unref all devices in the discovered device list. + * -# Free the discovered device list. + * + * The order is important - you must not unreference the device before + * attempting to open it, because unreferencing it may destroy the device. + * + * For convenience, the libusb_free_device_list() function includes a + * parameter to optionally unreference all the devices in the list before + * freeing the list itself. This combines steps 3 and 4 above. + * + * As an implementation detail, libusb_open() actually adds a reference to + * the device in question. This is because the device remains available + * through the handle via libusb_get_device(). The reference is deleted during + * libusb_close(). + */ + +/** @defgroup libusb_misc Miscellaneous */ + +/* we traverse usbfs without knowing how many devices we are going to find. + * so we create this discovered_devs model which is similar to a linked-list + * which grows when required. it can be freed once discovery has completed, + * eliminating the need for a list node in the libusb_device structure + * itself. */ +#define DISCOVERED_DEVICES_SIZE_STEP 8 + +static struct discovered_devs *discovered_devs_alloc(void) +{ + struct discovered_devs *ret = + malloc(sizeof(*ret) + (sizeof(void *) * DISCOVERED_DEVICES_SIZE_STEP)); + + if (ret) { + ret->len = 0; + ret->capacity = DISCOVERED_DEVICES_SIZE_STEP; + } + return ret; +} + +static void discovered_devs_free(struct discovered_devs *discdevs) +{ + size_t i; + + for (i = 0; i < discdevs->len; i++) + libusb_unref_device(discdevs->devices[i]); + + free(discdevs); +} + +/* append a device to the discovered devices collection. may realloc itself, + * returning new discdevs. returns NULL on realloc failure. */ +struct discovered_devs *discovered_devs_append( + struct discovered_devs *discdevs, struct libusb_device *dev) +{ + size_t len = discdevs->len; + size_t capacity; + struct discovered_devs *new_discdevs; + + /* if there is space, just append the device */ + if (len < discdevs->capacity) { + discdevs->devices[len] = libusb_ref_device(dev); + discdevs->len++; + return discdevs; + } + + /* exceeded capacity, need to grow */ + usbi_dbg("need to increase capacity"); + capacity = discdevs->capacity + DISCOVERED_DEVICES_SIZE_STEP; + /* can't use usbi_reallocf here because in failure cases it would + * free the existing discdevs without unreferencing its devices. */ + new_discdevs = realloc(discdevs, + sizeof(*discdevs) + (sizeof(void *) * capacity)); + if (!new_discdevs) { + discovered_devs_free(discdevs); + return NULL; + } + + discdevs = new_discdevs; + discdevs->capacity = capacity; + discdevs->devices[len] = libusb_ref_device(dev); + discdevs->len++; + + return discdevs; +} + +/* Allocate a new device with a specific session ID. The returned device has + * a reference count of 1. */ +struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, + unsigned long session_id) +{ + size_t priv_size = usbi_backend->device_priv_size; + struct libusb_device *dev = calloc(1, sizeof(*dev) + priv_size); + int r; + + if (!dev) + return NULL; + + r = usbi_mutex_init(&dev->lock); + if (r) { + free(dev); + return NULL; + } + + dev->ctx = ctx; + dev->refcnt = 1; + dev->session_data = session_id; + dev->speed = LIBUSB_SPEED_UNKNOWN; + + if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + usbi_connect_device (dev); + } + + return dev; +} + +void usbi_connect_device(struct libusb_device *dev) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + + dev->attached = 1; + + usbi_mutex_lock(&dev->ctx->usb_devs_lock); + list_add(&dev->list, &dev->ctx->usb_devs); + usbi_mutex_unlock(&dev->ctx->usb_devs_lock); + + /* Signal that an event has occurred for this device if we support hotplug AND + * the hotplug message list is ready. This prevents an event from getting raised + * during initial enumeration. */ + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) { + usbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED); + } +} + +void usbi_disconnect_device(struct libusb_device *dev) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + + usbi_mutex_lock(&dev->lock); + dev->attached = 0; + usbi_mutex_unlock(&dev->lock); + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_del(&dev->list); + usbi_mutex_unlock(&ctx->usb_devs_lock); + + /* Signal that an event has occurred for this device if we support hotplug AND + * the hotplug message list is ready. This prevents an event from getting raised + * during initial enumeration. libusb_handle_events will take care of dereferencing + * the device. */ + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) { + usbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT); + } +} + +/* Perform some final sanity checks on a newly discovered device. If this + * function fails (negative return code), the device should not be added + * to the discovered device list. */ +int usbi_sanitize_device(struct libusb_device *dev) +{ + int r; + uint8_t num_configurations; + + r = usbi_device_cache_descriptor(dev); + if (r < 0) + return r; + + num_configurations = dev->device_descriptor.bNumConfigurations; + if (num_configurations > USB_MAXCONFIG) { + usbi_err(DEVICE_CTX(dev), "too many configurations"); + return LIBUSB_ERROR_IO; + } else if (0 == num_configurations) + usbi_dbg("zero configurations, maybe an unauthorized device"); + + dev->num_configurations = num_configurations; + return 0; +} + +/* Examine libusb's internal list of known devices, looking for one with + * a specific session ID. Returns the matching device if it was found, and + * NULL otherwise. */ +struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, + unsigned long session_id) +{ + struct libusb_device *dev; + struct libusb_device *ret = NULL; + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) + if (dev->session_data == session_id) { + ret = libusb_ref_device(dev); + break; + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + + return ret; +} + +/** @ingroup libusb_dev + * Returns a list of USB devices currently attached to the system. This is + * your entry point into finding a USB device to operate. + * + * You are expected to unreference all the devices when you are done with + * them, and then free the list with libusb_free_device_list(). Note that + * libusb_free_device_list() can unref all the devices for you. Be careful + * not to unreference a device you are about to open until after you have + * opened it. + * + * This return value of this function indicates the number of devices in + * the resultant list. The list is actually one element larger, as it is + * NULL-terminated. + * + * \param ctx the context to operate on, or NULL for the default context + * \param list output location for a list of devices. Must be later freed with + * libusb_free_device_list(). + * \returns the number of devices in the outputted list, or any + * \ref libusb_error according to errors encountered by the backend. + */ +ssize_t API_EXPORTED libusb_get_device_list(libusb_context *ctx, + libusb_device ***list) +{ + struct discovered_devs *discdevs = discovered_devs_alloc(); + struct libusb_device **ret; + int r = 0; + ssize_t i, len; + USBI_GET_CONTEXT(ctx); + usbi_dbg(""); + + if (!discdevs) + return LIBUSB_ERROR_NO_MEM; + + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + /* backend provides hotplug support */ + struct libusb_device *dev; + + if (usbi_backend->hotplug_poll) + usbi_backend->hotplug_poll(); + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) { + discdevs = discovered_devs_append(discdevs, dev); + + if (!discdevs) { + r = LIBUSB_ERROR_NO_MEM; + break; + } + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + } else { + /* backend does not provide hotplug support */ + r = usbi_backend->get_device_list(ctx, &discdevs); + } + + if (r < 0) { + len = r; + goto out; + } + + /* convert discovered_devs into a list */ + len = discdevs->len; + ret = calloc(len + 1, sizeof(struct libusb_device *)); + if (!ret) { + len = LIBUSB_ERROR_NO_MEM; + goto out; + } + + ret[len] = NULL; + for (i = 0; i < len; i++) { + struct libusb_device *dev = discdevs->devices[i]; + ret[i] = libusb_ref_device(dev); + } + *list = ret; + +out: + if (discdevs) + discovered_devs_free(discdevs); + return len; +} + +/** \ingroup libusb_dev + * Frees a list of devices previously discovered using + * libusb_get_device_list(). If the unref_devices parameter is set, the + * reference count of each device in the list is decremented by 1. + * \param list the list to free + * \param unref_devices whether to unref the devices in the list + */ +void API_EXPORTED libusb_free_device_list(libusb_device **list, + int unref_devices) +{ + if (!list) + return; + + if (unref_devices) { + int i = 0; + struct libusb_device *dev; + + while ((dev = list[i++]) != NULL) + libusb_unref_device(dev); + } + free(list); +} + +/** \ingroup libusb_dev + * Get the number of the bus that a device is connected to. + * \param dev a device + * \returns the bus number + */ +uint8_t API_EXPORTED libusb_get_bus_number(libusb_device *dev) +{ + return dev->bus_number; +} + +/** \ingroup libusb_dev + * Get the number of the port that a device is connected to. + * Unless the OS does something funky, or you are hot-plugging USB extension cards, + * the port number returned by this call is usually guaranteed to be uniquely tied + * to a physical port, meaning that different devices plugged on the same physical + * port should return the same port number. + * + * But outside of this, there is no guarantee that the port number returned by this + * call will remain the same, or even match the order in which ports have been + * numbered by the HUB/HCD manufacturer. + * + * \param dev a device + * \returns the port number (0 if not available) + */ +uint8_t API_EXPORTED libusb_get_port_number(libusb_device *dev) +{ + return dev->port_number; +} + +/** \ingroup libusb_dev + * Get the list of all port numbers from root for the specified device + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * \param dev a device + * \param port_numbers the array that should contain the port numbers + * \param port_numbers_len the maximum length of the array. As per the USB 3.0 + * specs, the current maximum limit for the depth is 7. + * \returns the number of elements filled + * \returns LIBUSB_ERROR_OVERFLOW if the array is too small + */ +int API_EXPORTED libusb_get_port_numbers(libusb_device *dev, + uint8_t* port_numbers, int port_numbers_len) +{ + int i = port_numbers_len; + struct libusb_context *ctx = DEVICE_CTX(dev); + + if (port_numbers_len <= 0) + return LIBUSB_ERROR_INVALID_PARAM; + + // HCDs can be listed as devices with port #0 + while((dev) && (dev->port_number != 0)) { + if (--i < 0) { + usbi_warn(ctx, "port numbers array is too small"); + return LIBUSB_ERROR_OVERFLOW; + } + port_numbers[i] = dev->port_number; + dev = dev->parent_dev; + } + if (i < port_numbers_len) + memmove(port_numbers, &port_numbers[i], port_numbers_len - i); + return port_numbers_len - i; +} + +/** \ingroup libusb_dev + * Deprecated please use libusb_get_port_numbers instead. + */ +int API_EXPORTED libusb_get_port_path(libusb_context *ctx, libusb_device *dev, + uint8_t* port_numbers, uint8_t port_numbers_len) +{ + UNUSED(ctx); + + return libusb_get_port_numbers(dev, port_numbers, port_numbers_len); +} + +/** \ingroup libusb_dev + * Get the the parent from the specified device. + * \param dev a device + * \returns the device parent or NULL if not available + * You should issue a \ref libusb_get_device_list() before calling this + * function and make sure that you only access the parent before issuing + * \ref libusb_free_device_list(). The reason is that libusb currently does + * not maintain a permanent list of device instances, and therefore can + * only guarantee that parents are fully instantiated within a + * libusb_get_device_list() - libusb_free_device_list() block. + */ +DEFAULT_VISIBILITY +libusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev) +{ + return dev->parent_dev; +} + +/** \ingroup libusb_dev + * Get the address of the device on the bus it is connected to. + * \param dev a device + * \returns the device address + */ +uint8_t API_EXPORTED libusb_get_device_address(libusb_device *dev) +{ + return dev->device_address; +} + +/** \ingroup libusb_dev + * Get the negotiated connection speed for a device. + * \param dev a device + * \returns a \ref libusb_speed code, where LIBUSB_SPEED_UNKNOWN means that + * the OS doesn't know or doesn't support returning the negotiated speed. + */ +int API_EXPORTED libusb_get_device_speed(libusb_device *dev) +{ + return dev->speed; +} + +static const struct libusb_endpoint_descriptor *find_endpoint( + struct libusb_config_descriptor *config, unsigned char endpoint) +{ + int iface_idx; + for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) { + const struct libusb_interface *iface = &config->interface[iface_idx]; + int altsetting_idx; + + for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting; + altsetting_idx++) { + const struct libusb_interface_descriptor *altsetting + = &iface->altsetting[altsetting_idx]; + int ep_idx; + + for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; ep_idx++) { + const struct libusb_endpoint_descriptor *ep = + &altsetting->endpoint[ep_idx]; + if (ep->bEndpointAddress == endpoint) + return ep; + } + } + } + return NULL; +} + +/** \ingroup libusb_dev + * Convenience function to retrieve the wMaxPacketSize value for a particular + * endpoint in the active device configuration. + * + * This function was originally intended to be of assistance when setting up + * isochronous transfers, but a design mistake resulted in this function + * instead. It simply returns the wMaxPacketSize value without considering + * its contents. If you're dealing with isochronous transfers, you probably + * want libusb_get_max_iso_packet_size() instead. + * + * \param dev a device + * \param endpoint address of the endpoint in question + * \returns the wMaxPacketSize value + * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * \returns LIBUSB_ERROR_OTHER on other failure + */ +int API_EXPORTED libusb_get_max_packet_size(libusb_device *dev, + unsigned char endpoint) +{ + struct libusb_config_descriptor *config; + const struct libusb_endpoint_descriptor *ep; + int r; + + r = libusb_get_active_config_descriptor(dev, &config); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "could not retrieve active config descriptor"); + return LIBUSB_ERROR_OTHER; + } + + ep = find_endpoint(config, endpoint); + if (!ep) { + r = LIBUSB_ERROR_NOT_FOUND; + goto out; + } + + r = ep->wMaxPacketSize; + +out: + libusb_free_config_descriptor(config); + return r; +} + +/** \ingroup libusb_dev + * Calculate the maximum packet size which a specific endpoint is capable is + * sending or receiving in the duration of 1 microframe + * + * Only the active configuration is examined. The calculation is based on the + * wMaxPacketSize field in the endpoint descriptor as described in section + * 9.6.6 in the USB 2.0 specifications. + * + * If acting on an isochronous or interrupt endpoint, this function will + * multiply the value found in bits 0:10 by the number of transactions per + * microframe (determined by bits 11:12). Otherwise, this function just + * returns the numeric value found in bits 0:10. + * + * This function is useful for setting up isochronous transfers, for example + * you might pass the return value from this function to + * libusb_set_iso_packet_lengths() in order to set the length field of every + * isochronous packet in a transfer. + * + * Since v1.0.3. + * + * \param dev a device + * \param endpoint address of the endpoint in question + * \returns the maximum packet size which can be sent/received on this endpoint + * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * \returns LIBUSB_ERROR_OTHER on other failure + */ +int API_EXPORTED libusb_get_max_iso_packet_size(libusb_device *dev, + unsigned char endpoint) +{ + struct libusb_config_descriptor *config; + const struct libusb_endpoint_descriptor *ep; + enum libusb_transfer_type ep_type; + uint16_t val; + int r; + + r = libusb_get_active_config_descriptor(dev, &config); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "could not retrieve active config descriptor"); + return LIBUSB_ERROR_OTHER; + } + + ep = find_endpoint(config, endpoint); + if (!ep) { + r = LIBUSB_ERROR_NOT_FOUND; + goto out; + } + + val = ep->wMaxPacketSize; + ep_type = (enum libusb_transfer_type) (ep->bmAttributes & 0x3); + + r = val & 0x07ff; + if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS + || ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) + r *= (1 + ((val >> 11) & 3)); + +out: + libusb_free_config_descriptor(config); + return r; +} + +/** \ingroup libusb_dev + * Increment the reference count of a device. + * \param dev the device to reference + * \returns the same device + */ +DEFAULT_VISIBILITY +libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev) +{ + usbi_mutex_lock(&dev->lock); + dev->refcnt++; + usbi_mutex_unlock(&dev->lock); + return dev; +} + +/** \ingroup libusb_dev + * Decrement the reference count of a device. If the decrement operation + * causes the reference count to reach zero, the device shall be destroyed. + * \param dev the device to unreference + */ +void API_EXPORTED libusb_unref_device(libusb_device *dev) +{ + int refcnt; + + if (!dev) + return; + + usbi_mutex_lock(&dev->lock); + refcnt = --dev->refcnt; + usbi_mutex_unlock(&dev->lock); + + if (refcnt == 0) { + usbi_dbg("destroy device %d.%d", dev->bus_number, dev->device_address); + + libusb_unref_device(dev->parent_dev); + + if (usbi_backend->destroy_device) + usbi_backend->destroy_device(dev); + + if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + /* backend does not support hotplug */ + usbi_disconnect_device(dev); + } + + usbi_mutex_destroy(&dev->lock); + free(dev); + } +} + +/* + * Signal the event pipe so that the event handling thread will be + * interrupted to process an internal event. + */ +int usbi_signal_event(struct libusb_context *ctx) +{ + unsigned char dummy = 1; + ssize_t r; + + /* write some data on event pipe to interrupt event handlers */ + r = usbi_write(ctx->event_pipe[1], &dummy, sizeof(dummy)); + if (r != sizeof(dummy)) { + usbi_warn(ctx, "internal signalling write failed"); + return LIBUSB_ERROR_IO; + } + + return 0; +} + +/* + * Clear the event pipe so that the event handling will no longer be + * interrupted. + */ +int usbi_clear_event(struct libusb_context *ctx) +{ + unsigned char dummy; + ssize_t r; + + /* read some data on event pipe to clear it */ + r = usbi_read(ctx->event_pipe[0], &dummy, sizeof(dummy)); + if (r != sizeof(dummy)) { + usbi_warn(ctx, "internal signalling read failed"); + return LIBUSB_ERROR_IO; + } + + return 0; +} + +/** \ingroup libusb_dev + * Open a device and obtain a device handle. A handle allows you to perform + * I/O on the device in question. + * + * Internally, this function adds a reference to the device and makes it + * available to you through libusb_get_device(). This reference is removed + * during libusb_close(). + * + * This is a non-blocking function; no requests are sent over the bus. + * + * \param dev the device to open + * \param dev_handle output location for the returned device handle pointer. Only + * populated when the return code is 0. + * \returns 0 on success + * \returns LIBUSB_ERROR_NO_MEM on memory allocation failure + * \returns LIBUSB_ERROR_ACCESS if the user has insufficient permissions + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_open(libusb_device *dev, + libusb_device_handle **dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + struct libusb_device_handle *_dev_handle; + size_t priv_size = usbi_backend->device_handle_priv_size; + int r; + usbi_dbg("open %d.%d", dev->bus_number, dev->device_address); + + if (!dev->attached) { + return LIBUSB_ERROR_NO_DEVICE; + } + + _dev_handle = malloc(sizeof(*_dev_handle) + priv_size); + if (!_dev_handle) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_mutex_init(&_dev_handle->lock); + if (r) { + free(_dev_handle); + return LIBUSB_ERROR_OTHER; + } + + _dev_handle->dev = libusb_ref_device(dev); + _dev_handle->auto_detach_kernel_driver = 0; + _dev_handle->claimed_interfaces = 0; + memset(&_dev_handle->os_priv, 0, priv_size); + + r = usbi_backend->open(_dev_handle); + if (r < 0) { + usbi_dbg("open %d.%d returns %d", dev->bus_number, dev->device_address, r); + libusb_unref_device(dev); + usbi_mutex_destroy(&_dev_handle->lock); + free(_dev_handle); + return r; + } + + usbi_mutex_lock(&ctx->open_devs_lock); + list_add(&_dev_handle->list, &ctx->open_devs); + usbi_mutex_unlock(&ctx->open_devs_lock); + *dev_handle = _dev_handle; + + return 0; +} + +/** \ingroup libusb_dev + * Convenience function for finding a device with a particular + * idVendor/idProduct combination. This function is intended + * for those scenarios where you are using libusb to knock up a quick test + * application - it allows you to avoid calling libusb_get_device_list() and + * worrying about traversing/freeing the list. + * + * This function has limitations and is hence not intended for use in real + * applications: if multiple devices have the same IDs it will only + * give you the first one, etc. + * + * \param ctx the context to operate on, or NULL for the default context + * \param vendor_id the idVendor value to search for + * \param product_id the idProduct value to search for + * \returns a device handle for the first found device, or NULL on error + * or if the device could not be found. */ +DEFAULT_VISIBILITY +libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( + libusb_context *ctx, uint16_t vendor_id, uint16_t product_id) +{ + struct libusb_device **devs; + struct libusb_device *found = NULL; + struct libusb_device *dev; + struct libusb_device_handle *dev_handle = NULL; + size_t i = 0; + int r; + + if (libusb_get_device_list(ctx, &devs) < 0) + return NULL; + + while ((dev = devs[i++]) != NULL) { + struct libusb_device_descriptor desc; + r = libusb_get_device_descriptor(dev, &desc); + if (r < 0) + goto out; + if (desc.idVendor == vendor_id && desc.idProduct == product_id) { + found = dev; + break; + } + } + + if (found) { + r = libusb_open(found, &dev_handle); + if (r < 0) + dev_handle = NULL; + } + +out: + libusb_free_device_list(devs, 1); + return dev_handle; +} + +static void do_close(struct libusb_context *ctx, + struct libusb_device_handle *dev_handle) +{ + struct usbi_transfer *itransfer; + struct usbi_transfer *tmp; + + /* remove any transfers in flight that are for this device */ + usbi_mutex_lock(&ctx->flying_transfers_lock); + + /* safe iteration because transfers may be being deleted */ + list_for_each_entry_safe(itransfer, tmp, &ctx->flying_transfers, list, struct usbi_transfer) { + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + if (transfer->dev_handle != dev_handle) + continue; + + usbi_mutex_lock(&itransfer->lock); + if (!(itransfer->state_flags & USBI_TRANSFER_DEVICE_DISAPPEARED)) { + usbi_err(ctx, "Device handle closed while transfer was still being processed, but the device is still connected as far as we know"); + + if (itransfer->state_flags & USBI_TRANSFER_CANCELLING) + usbi_warn(ctx, "A cancellation for an in-flight transfer hasn't completed but closing the device handle"); + else + usbi_err(ctx, "A cancellation hasn't even been scheduled on the transfer for which the device is closing"); + } + usbi_mutex_unlock(&itransfer->lock); + + /* remove from the list of in-flight transfers and make sure + * we don't accidentally use the device handle in the future + * (or that such accesses will be easily caught and identified as a crash) + */ + list_del(&itransfer->list); + transfer->dev_handle = NULL; + + /* it is up to the user to free up the actual transfer struct. this is + * just making sure that we don't attempt to process the transfer after + * the device handle is invalid + */ + usbi_dbg("Removed transfer %p from the in-flight list because device handle %p closed", + transfer, dev_handle); + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + usbi_mutex_lock(&ctx->open_devs_lock); + list_del(&dev_handle->list); + usbi_mutex_unlock(&ctx->open_devs_lock); + + usbi_backend->close(dev_handle); + libusb_unref_device(dev_handle->dev); + usbi_mutex_destroy(&dev_handle->lock); + free(dev_handle); +} + +/** \ingroup libusb_dev + * Close a device handle. Should be called on all open handles before your + * application exits. + * + * Internally, this function destroys the reference that was added by + * libusb_open() on the given device. + * + * This is a non-blocking function; no requests are sent over the bus. + * + * \param dev_handle the device handle to close + */ +void API_EXPORTED libusb_close(libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx; + int handling_events; + int pending_events; + + if (!dev_handle) + return; + usbi_dbg(""); + + ctx = HANDLE_CTX(dev_handle); + handling_events = usbi_handling_events(ctx); + + /* Similarly to libusb_open(), we want to interrupt all event handlers + * at this point. More importantly, we want to perform the actual close of + * the device while holding the event handling lock (preventing any other + * thread from doing event handling) because we will be removing a file + * descriptor from the polling loop. If this is being called by the current + * event handler, we can bypass the interruption code because we already + * hold the event handling lock. */ + + if (!handling_events) { + /* Record that we are closing a device. + * Only signal an event if there are no prior pending events. */ + usbi_mutex_lock(&ctx->event_data_lock); + pending_events = usbi_pending_events(ctx); + ctx->device_close++; + if (!pending_events) + usbi_signal_event(ctx); + usbi_mutex_unlock(&ctx->event_data_lock); + + /* take event handling lock */ + libusb_lock_events(ctx); + } + + /* Close the device */ + do_close(ctx, dev_handle); + + if (!handling_events) { + /* We're done with closing this device. + * Clear the event pipe if there are no further pending events. */ + usbi_mutex_lock(&ctx->event_data_lock); + ctx->device_close--; + pending_events = usbi_pending_events(ctx); + if (!pending_events) + usbi_clear_event(ctx); + usbi_mutex_unlock(&ctx->event_data_lock); + + /* Release event handling lock and wake up event waiters */ + libusb_unlock_events(ctx); + } +} + +/** \ingroup libusb_dev + * Get the underlying device for a device handle. This function does not modify + * the reference count of the returned device, so do not feel compelled to + * unreference it when you are done. + * \param dev_handle a device handle + * \returns the underlying device + */ +DEFAULT_VISIBILITY +libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle) +{ + return dev_handle->dev; +} + +/** \ingroup libusb_dev + * Determine the bConfigurationValue of the currently active configuration. + * + * You could formulate your own control request to obtain this information, + * but this function has the advantage that it may be able to retrieve the + * information from operating system caches (no I/O involved). + * + * If the OS does not cache this information, then this function will block + * while a control transfer is submitted to retrieve the information. + * + * This function will return a value of 0 in the config output + * parameter if the device is in unconfigured state. + * + * \param dev_handle a device handle + * \param config output location for the bConfigurationValue of the active + * configuration (only valid for return code 0) + * \returns 0 on success + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_get_configuration(libusb_device_handle *dev_handle, + int *config) +{ + int r = LIBUSB_ERROR_NOT_SUPPORTED; + + usbi_dbg(""); + if (usbi_backend->get_configuration) + r = usbi_backend->get_configuration(dev_handle, config); + + if (r == LIBUSB_ERROR_NOT_SUPPORTED) { + uint8_t tmp = 0; + usbi_dbg("falling back to control message"); + r = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_CONFIGURATION, 0, 0, &tmp, 1, 1000); + if (r == 0) { + usbi_err(HANDLE_CTX(dev_handle), "zero bytes returned in ctrl transfer?"); + r = LIBUSB_ERROR_IO; + } else if (r == 1) { + r = 0; + *config = tmp; + } else { + usbi_dbg("control failed, error %d", r); + } + } + + if (r == 0) + usbi_dbg("active config %d", *config); + + return r; +} + +/** \ingroup libusb_dev + * Set the active configuration for a device. + * + * The operating system may or may not have already set an active + * configuration on the device. It is up to your application to ensure the + * correct configuration is selected before you attempt to claim interfaces + * and perform other operations. + * + * If you call this function on a device already configured with the selected + * configuration, then this function will act as a lightweight device reset: + * it will issue a SET_CONFIGURATION request using the current configuration, + * causing most USB-related device state to be reset (altsetting reset to zero, + * endpoint halts cleared, toggles reset). + * + * You cannot change/reset configuration if your application has claimed + * interfaces. It is advised to set the desired configuration before claiming + * interfaces. + * + * Alternatively you can call libusb_release_interface() first. Note if you + * do things this way you must ensure that auto_detach_kernel_driver for + * dev is 0, otherwise the kernel driver will be re-attached when you + * release the interface(s). + * + * You cannot change/reset configuration if other applications or drivers have + * claimed interfaces. + * + * A configuration value of -1 will put the device in unconfigured state. + * The USB specifications state that a configuration value of 0 does this, + * however buggy devices exist which actually have a configuration 0. + * + * You should always use this function rather than formulating your own + * SET_CONFIGURATION control request. This is because the underlying operating + * system needs to know when such changes happen. + * + * This is a blocking function. + * + * \param dev_handle a device handle + * \param configuration the bConfigurationValue of the configuration you + * wish to activate, or -1 if you wish to put the device in an unconfigured + * state + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the requested configuration does not exist + * \returns LIBUSB_ERROR_BUSY if interfaces are currently claimed + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_set_auto_detach_kernel_driver() + */ +int API_EXPORTED libusb_set_configuration(libusb_device_handle *dev_handle, + int configuration) +{ + usbi_dbg("configuration %d", configuration); + return usbi_backend->set_configuration(dev_handle, configuration); +} + +/** \ingroup libusb_dev + * Claim an interface on a given device handle. You must claim the interface + * you wish to use before you can perform I/O on any of its endpoints. + * + * It is legal to attempt to claim an already-claimed interface, in which + * case libusb just returns 0 without doing anything. + * + * If auto_detach_kernel_driver is set to 1 for dev, the kernel driver + * will be detached if necessary, on failure the detach error is returned. + * + * Claiming of interfaces is a purely logical operation; it does not cause + * any requests to be sent over the bus. Interface claiming is used to + * instruct the underlying operating system that your application wishes + * to take ownership of the interface. + * + * This is a non-blocking function. + * + * \param dev_handle a device handle + * \param interface_number the bInterfaceNumber of the interface you + * wish to claim + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the requested interface does not exist + * \returns LIBUSB_ERROR_BUSY if another program or driver has claimed the + * interface + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns a LIBUSB_ERROR code on other failure + * \see libusb_set_auto_detach_kernel_driver() + */ +int API_EXPORTED libusb_claim_interface(libusb_device_handle *dev_handle, + int interface_number) +{ + int r = 0; + + usbi_dbg("interface %d", interface_number); + if (interface_number >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + if (!dev_handle->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_mutex_lock(&dev_handle->lock); + if (dev_handle->claimed_interfaces & (1 << interface_number)) + goto out; + + r = usbi_backend->claim_interface(dev_handle, interface_number); + if (r == 0) + dev_handle->claimed_interfaces |= 1 << interface_number; + +out: + usbi_mutex_unlock(&dev_handle->lock); + return r; +} + +/** \ingroup libusb_dev + * Release an interface previously claimed with libusb_claim_interface(). You + * should release all claimed interfaces before closing a device handle. + * + * This is a blocking function. A SET_INTERFACE control request will be sent + * to the device, resetting interface state to the first alternate setting. + * + * If auto_detach_kernel_driver is set to 1 for dev, the kernel + * driver will be re-attached after releasing the interface. + * + * \param dev_handle a device handle + * \param interface_number the bInterfaceNumber of the + * previously-claimed interface + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_set_auto_detach_kernel_driver() + */ +int API_EXPORTED libusb_release_interface(libusb_device_handle *dev_handle, + int interface_number) +{ + int r; + + usbi_dbg("interface %d", interface_number); + if (interface_number >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + usbi_mutex_lock(&dev_handle->lock); + if (!(dev_handle->claimed_interfaces & (1 << interface_number))) { + r = LIBUSB_ERROR_NOT_FOUND; + goto out; + } + + r = usbi_backend->release_interface(dev_handle, interface_number); + if (r == 0) + dev_handle->claimed_interfaces &= ~(1 << interface_number); + +out: + usbi_mutex_unlock(&dev_handle->lock); + return r; +} + +/** \ingroup libusb_dev + * Activate an alternate setting for an interface. The interface must have + * been previously claimed with libusb_claim_interface(). + * + * You should always use this function rather than formulating your own + * SET_INTERFACE control request. This is because the underlying operating + * system needs to know when such changes happen. + * + * This is a blocking function. + * + * \param dev_handle a device handle + * \param interface_number the bInterfaceNumber of the + * previously-claimed interface + * \param alternate_setting the bAlternateSetting of the alternate + * setting to activate + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed, or the + * requested alternate setting does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_set_interface_alt_setting(libusb_device_handle *dev_handle, + int interface_number, int alternate_setting) +{ + usbi_dbg("interface %d altsetting %d", + interface_number, alternate_setting); + if (interface_number >= USB_MAXINTERFACES) + return LIBUSB_ERROR_INVALID_PARAM; + + usbi_mutex_lock(&dev_handle->lock); + if (!dev_handle->dev->attached) { + usbi_mutex_unlock(&dev_handle->lock); + return LIBUSB_ERROR_NO_DEVICE; + } + + if (!(dev_handle->claimed_interfaces & (1 << interface_number))) { + usbi_mutex_unlock(&dev_handle->lock); + return LIBUSB_ERROR_NOT_FOUND; + } + usbi_mutex_unlock(&dev_handle->lock); + + return usbi_backend->set_interface_altsetting(dev_handle, interface_number, + alternate_setting); +} + +/** \ingroup libusb_dev + * Clear the halt/stall condition for an endpoint. Endpoints with halt status + * are unable to receive or transmit data until the halt condition is stalled. + * + * You should cancel all pending transfers before attempting to clear the halt + * condition. + * + * This is a blocking function. + * + * \param dev_handle a device handle + * \param endpoint the endpoint to clear halt status + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_clear_halt(libusb_device_handle *dev_handle, + unsigned char endpoint) +{ + usbi_dbg("endpoint %x", endpoint); + if (!dev_handle->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + return usbi_backend->clear_halt(dev_handle, endpoint); +} + +/** \ingroup libusb_dev + * Perform a USB port reset to reinitialize a device. The system will attempt + * to restore the previous configuration and alternate settings after the + * reset has completed. + * + * If the reset fails, the descriptors change, or the previous state cannot be + * restored, the device will appear to be disconnected and reconnected. This + * means that the device handle is no longer valid (you should close it) and + * rediscover the device. A return code of LIBUSB_ERROR_NOT_FOUND indicates + * when this is the case. + * + * This is a blocking function which usually incurs a noticeable delay. + * + * \param dev_handle a handle of the device to reset + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the + * device has been disconnected + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_reset_device(libusb_device_handle *dev_handle) +{ + usbi_dbg(""); + if (!dev_handle->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + return usbi_backend->reset_device(dev_handle); +} + +/** \ingroup libusb_asyncio + * Allocate up to num_streams usb bulk streams on the specified endpoints. This + * function takes an array of endpoints rather then a single endpoint because + * some protocols require that endpoints are setup with similar stream ids. + * All endpoints passed in must belong to the same interface. + * + * Note this function may return less streams then requested. Also note that the + * same number of streams are allocated for each endpoint in the endpoint array. + * + * Stream id 0 is reserved, and should not be used to communicate with devices. + * If libusb_alloc_streams() returns with a value of N, you may use stream ids + * 1 to N. + * + * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 + * + * \param dev_handle a device handle + * \param num_streams number of streams to try to allocate + * \param endpoints array of endpoints to allocate streams on + * \param num_endpoints length of the endpoints array + * \returns number of streams allocated, or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_alloc_streams(libusb_device_handle *dev_handle, + uint32_t num_streams, unsigned char *endpoints, int num_endpoints) +{ + usbi_dbg("streams %u eps %d", (unsigned) num_streams, num_endpoints); + + if (!dev_handle->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + if (usbi_backend->alloc_streams) + return usbi_backend->alloc_streams(dev_handle, num_streams, endpoints, + num_endpoints); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup libusb_asyncio + * Free usb bulk streams allocated with libusb_alloc_streams(). + * + * Note streams are automatically free-ed when releasing an interface. + * + * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 + * + * \param dev_handle a device handle + * \param endpoints array of endpoints to free streams on + * \param num_endpoints length of the endpoints array + * \returns LIBUSB_SUCCESS, or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_free_streams(libusb_device_handle *dev_handle, + unsigned char *endpoints, int num_endpoints) +{ + usbi_dbg("eps %d", num_endpoints); + + if (!dev_handle->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + if (usbi_backend->free_streams) + return usbi_backend->free_streams(dev_handle, endpoints, + num_endpoints); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup libusb_asyncio + * Attempts to allocate a block of persistent DMA memory suitable for transfers + * against the given device. If successful, will return a block of memory + * that is suitable for use as "buffer" in \ref libusb_transfer against this + * device. Using this memory instead of regular memory means that the host + * controller can use DMA directly into the buffer to increase performance, and + * also that transfers can no longer fail due to kernel memory fragmentation. + * + * Note that this means you should not modify this memory (or even data on + * the same cache lines) when a transfer is in progress, although it is legal + * to have several transfers going on within the same memory block. + * + * Will return NULL on failure. Many systems do not support such zerocopy + * and will always return NULL. Memory allocated with this function must be + * freed with \ref libusb_dev_mem_free. Specifically, this means that the + * flag \ref LIBUSB_TRANSFER_FREE_BUFFER cannot be used to free memory allocated + * with this function. + * + * Since version 1.0.21, \ref LIBUSB_API_VERSION >= 0x01000105 + * + * \param dev_handle a device handle + * \param length size of desired data buffer + * \returns a pointer to the newly allocated memory, or NULL on failure + */ +DEFAULT_VISIBILITY +unsigned char * LIBUSB_CALL libusb_dev_mem_alloc(libusb_device_handle *dev_handle, + size_t length) +{ + if (!dev_handle->dev->attached) + return NULL; + + if (usbi_backend->dev_mem_alloc) + return usbi_backend->dev_mem_alloc(dev_handle, length); + else + return NULL; +} + +/** \ingroup libusb_asyncio + * Free device memory allocated with libusb_dev_mem_alloc(). + * + * \param dev_handle a device handle + * \param buffer pointer to the previously allocated memory + * \param length size of previously allocated memory + * \returns LIBUSB_SUCCESS, or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_dev_mem_free(libusb_device_handle *dev_handle, + unsigned char *buffer, size_t length) +{ + if (usbi_backend->dev_mem_free) + return usbi_backend->dev_mem_free(dev_handle, buffer, length); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup libusb_dev + * Determine if a kernel driver is active on an interface. If a kernel driver + * is active, you cannot claim the interface, and libusb will be unable to + * perform I/O. + * + * This functionality is not available on Windows. + * + * \param dev_handle a device handle + * \param interface_number the interface to check + * \returns 0 if no kernel driver is active + * \returns 1 if a kernel driver is active + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_detach_kernel_driver() + */ +int API_EXPORTED libusb_kernel_driver_active(libusb_device_handle *dev_handle, + int interface_number) +{ + usbi_dbg("interface %d", interface_number); + + if (!dev_handle->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + if (usbi_backend->kernel_driver_active) + return usbi_backend->kernel_driver_active(dev_handle, interface_number); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup libusb_dev + * Detach a kernel driver from an interface. If successful, you will then be + * able to claim the interface and perform I/O. + * + * This functionality is not available on Darwin or Windows. + * + * Note that libusb itself also talks to the device through a special kernel + * driver, if this driver is already attached to the device, this call will + * not detach it and return LIBUSB_ERROR_NOT_FOUND. + * + * \param dev_handle a device handle + * \param interface_number the interface to detach the driver from + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * \returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_kernel_driver_active() + */ +int API_EXPORTED libusb_detach_kernel_driver(libusb_device_handle *dev_handle, + int interface_number) +{ + usbi_dbg("interface %d", interface_number); + + if (!dev_handle->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + if (usbi_backend->detach_kernel_driver) + return usbi_backend->detach_kernel_driver(dev_handle, interface_number); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup libusb_dev + * Re-attach an interface's kernel driver, which was previously detached + * using libusb_detach_kernel_driver(). This call is only effective on + * Linux and returns LIBUSB_ERROR_NOT_SUPPORTED on all other platforms. + * + * This functionality is not available on Darwin or Windows. + * + * \param dev_handle a device handle + * \param interface_number the interface to attach the driver from + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * \returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \returns LIBUSB_ERROR_BUSY if the driver cannot be attached because the + * interface is claimed by a program or driver + * \returns another LIBUSB_ERROR code on other failure + * \see libusb_kernel_driver_active() + */ +int API_EXPORTED libusb_attach_kernel_driver(libusb_device_handle *dev_handle, + int interface_number) +{ + usbi_dbg("interface %d", interface_number); + + if (!dev_handle->dev->attached) + return LIBUSB_ERROR_NO_DEVICE; + + if (usbi_backend->attach_kernel_driver) + return usbi_backend->attach_kernel_driver(dev_handle, interface_number); + else + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +/** \ingroup libusb_dev + * Enable/disable libusb's automatic kernel driver detachment. When this is + * enabled libusb will automatically detach the kernel driver on an interface + * when claiming the interface, and attach it when releasing the interface. + * + * Automatic kernel driver detachment is disabled on newly opened device + * handles by default. + * + * On platforms which do not have LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER + * this function will return LIBUSB_ERROR_NOT_SUPPORTED, and libusb will + * continue as if this function was never called. + * + * \param dev_handle a device handle + * \param enable whether to enable or disable auto kernel driver detachment + * + * \returns LIBUSB_SUCCESS on success + * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality + * is not available + * \see libusb_claim_interface() + * \see libusb_release_interface() + * \see libusb_set_configuration() + */ +int API_EXPORTED libusb_set_auto_detach_kernel_driver( + libusb_device_handle *dev_handle, int enable) +{ + if (!(usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER)) + return LIBUSB_ERROR_NOT_SUPPORTED; + + dev_handle->auto_detach_kernel_driver = enable; + return LIBUSB_SUCCESS; +} + +/** \ingroup libusb_lib + * Set log message verbosity. + * + * The default level is LIBUSB_LOG_LEVEL_NONE, which means no messages are ever + * printed. If you choose to increase the message verbosity level, ensure + * that your application does not close the stdout/stderr file descriptors. + * + * You are advised to use level LIBUSB_LOG_LEVEL_WARNING. libusb is conservative + * with its message logging and most of the time, will only log messages that + * explain error conditions and other oddities. This will help you debug + * your software. + * + * If the LIBUSB_DEBUG environment variable was set when libusb was + * initialized, this function does nothing: the message verbosity is fixed + * to the value in the environment variable. + * + * If libusb was compiled without any message logging, this function does + * nothing: you'll never get any messages. + * + * If libusb was compiled with verbose debug message logging, this function + * does nothing: you'll always get messages from all levels. + * + * \param ctx the context to operate on, or NULL for the default context + * \param level debug level to set + */ +void API_EXPORTED libusb_set_debug(libusb_context *ctx, int level) +{ + USBI_GET_CONTEXT(ctx); + if (!ctx->debug_fixed) + ctx->debug = level; +} + +/** \ingroup libusb_lib + * Initialize libusb. This function must be called before calling any other + * libusb function. + * + * If you do not provide an output location for a context pointer, a default + * context will be created. If there was already a default context, it will + * be reused (and nothing will be initialized/reinitialized). + * + * \param context Optional output location for context pointer. + * Only valid on return code 0. + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \see libusb_contexts + */ +int API_EXPORTED libusb_init(libusb_context **context) +{ + struct libusb_device *dev, *next; + char *dbg = getenv("LIBUSB_DEBUG"); + struct libusb_context *ctx; + static int first_init = 1; + int r = 0; + + usbi_mutex_static_lock(&default_context_lock); + + if (!timestamp_origin.tv_sec) { + usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, ×tamp_origin); + } + + if (!context && usbi_default_context) { + usbi_dbg("reusing default context"); + default_context_refcnt++; + usbi_mutex_static_unlock(&default_context_lock); + return 0; + } + + ctx = calloc(1, sizeof(*ctx)); + if (!ctx) { + r = LIBUSB_ERROR_NO_MEM; + goto err_unlock; + } + +#ifdef ENABLE_DEBUG_LOGGING + ctx->debug = LIBUSB_LOG_LEVEL_DEBUG; +#endif + + if (dbg) { + ctx->debug = atoi(dbg); + if (ctx->debug) + ctx->debug_fixed = 1; + } + + /* default context should be initialized before calling usbi_dbg */ + if (!usbi_default_context) { + usbi_default_context = ctx; + default_context_refcnt++; + usbi_dbg("created default context"); + } + + usbi_dbg("libusb v%u.%u.%u.%u%s", libusb_version_internal.major, libusb_version_internal.minor, + libusb_version_internal.micro, libusb_version_internal.nano, libusb_version_internal.rc); + + usbi_mutex_init(&ctx->usb_devs_lock); + usbi_mutex_init(&ctx->open_devs_lock); + usbi_mutex_init(&ctx->hotplug_cbs_lock); + list_init(&ctx->usb_devs); + list_init(&ctx->open_devs); + list_init(&ctx->hotplug_cbs); + + usbi_mutex_static_lock(&active_contexts_lock); + if (first_init) { + first_init = 0; + list_init (&active_contexts_list); + } + list_add (&ctx->list, &active_contexts_list); + usbi_mutex_static_unlock(&active_contexts_lock); + + if (usbi_backend->init) { + r = usbi_backend->init(ctx); + if (r) + goto err_free_ctx; + } + + r = usbi_io_init(ctx); + if (r < 0) + goto err_backend_exit; + + usbi_mutex_static_unlock(&default_context_lock); + + if (context) + *context = ctx; + + return 0; + +err_backend_exit: + if (usbi_backend->exit) + usbi_backend->exit(); +err_free_ctx: + if (ctx == usbi_default_context) { + usbi_default_context = NULL; + default_context_refcnt--; + } + + usbi_mutex_static_lock(&active_contexts_lock); + list_del (&ctx->list); + usbi_mutex_static_unlock(&active_contexts_lock); + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry_safe(dev, next, &ctx->usb_devs, list, struct libusb_device) { + list_del(&dev->list); + libusb_unref_device(dev); + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + + usbi_mutex_destroy(&ctx->open_devs_lock); + usbi_mutex_destroy(&ctx->usb_devs_lock); + usbi_mutex_destroy(&ctx->hotplug_cbs_lock); + + free(ctx); +err_unlock: + usbi_mutex_static_unlock(&default_context_lock); + return r; +} + +/** \ingroup libusb_lib + * Deinitialize libusb. Should be called after closing all open devices and + * before your application terminates. + * \param ctx the context to deinitialize, or NULL for the default context + */ +void API_EXPORTED libusb_exit(struct libusb_context *ctx) +{ + struct libusb_device *dev, *next; + struct timeval tv = { 0, 0 }; + + usbi_dbg(""); + USBI_GET_CONTEXT(ctx); + + /* if working with default context, only actually do the deinitialization + * if we're the last user */ + usbi_mutex_static_lock(&default_context_lock); + if (ctx == usbi_default_context) { + if (--default_context_refcnt > 0) { + usbi_dbg("not destroying default context"); + usbi_mutex_static_unlock(&default_context_lock); + return; + } + usbi_dbg("destroying default context"); + usbi_default_context = NULL; + } + usbi_mutex_static_unlock(&default_context_lock); + + usbi_mutex_static_lock(&active_contexts_lock); + list_del (&ctx->list); + usbi_mutex_static_unlock(&active_contexts_lock); + + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + usbi_hotplug_deregister_all(ctx); + + /* + * Ensure any pending unplug events are read from the hotplug + * pipe. The usb_device-s hold in the events are no longer part + * of usb_devs, but the events still hold a reference! + * + * Note we don't do this if the application has left devices + * open (which implies a buggy app) to avoid packet completion + * handlers running when the app does not expect them to run. + */ + if (list_empty(&ctx->open_devs)) + libusb_handle_events_timeout(ctx, &tv); + + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry_safe(dev, next, &ctx->usb_devs, list, struct libusb_device) { + list_del(&dev->list); + libusb_unref_device(dev); + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + } + + /* a few sanity checks. don't bother with locking because unless + * there is an application bug, nobody will be accessing these. */ + if (!list_empty(&ctx->usb_devs)) + usbi_warn(ctx, "some libusb_devices were leaked"); + if (!list_empty(&ctx->open_devs)) + usbi_warn(ctx, "application left some devices open"); + + usbi_io_exit(ctx); + if (usbi_backend->exit) + usbi_backend->exit(); + + usbi_mutex_destroy(&ctx->open_devs_lock); + usbi_mutex_destroy(&ctx->usb_devs_lock); + usbi_mutex_destroy(&ctx->hotplug_cbs_lock); + free(ctx); +} + +/** \ingroup libusb_misc + * Check at runtime if the loaded library has a given capability. + * This call should be performed after \ref libusb_init(), to ensure the + * backend has updated its capability set. + * + * \param capability the \ref libusb_capability to check for + * \returns nonzero if the running library has the capability, 0 otherwise + */ +int API_EXPORTED libusb_has_capability(uint32_t capability) +{ + switch (capability) { + case LIBUSB_CAP_HAS_CAPABILITY: + return 1; + case LIBUSB_CAP_HAS_HOTPLUG: + return !(usbi_backend->get_device_list); + case LIBUSB_CAP_HAS_HID_ACCESS: + return (usbi_backend->caps & USBI_CAP_HAS_HID_ACCESS); + case LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER: + return (usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER); + } + return 0; +} + +/* this is defined in libusbi.h if needed */ +#ifdef LIBUSB_PRINTF_WIN32 +/* + * Prior to VS2015, Microsoft did not provide the snprintf() function and + * provided a vsnprintf() that did not guarantee NULL-terminated output. + * Microsoft did provide a _snprintf() function, but again it did not + * guarantee NULL-terminated output. + * + * The below implementations guarantee NULL-terminated output and are + * C99 compliant. + */ + +int usbi_snprintf(char *str, size_t size, const char *format, ...) +{ + va_list ap; + int ret; + + va_start(ap, format); + ret = usbi_vsnprintf(str, size, format, ap); + va_end(ap); + + return ret; +} + +int usbi_vsnprintf(char *str, size_t size, const char *format, va_list ap) +{ + int ret; + + ret = _vsnprintf(str, size, format, ap); + if (ret < 0 || ret == (int)size) { + /* Output is truncated, ensure buffer is NULL-terminated and + * determine how many characters would have been written. */ + str[size - 1] = '\0'; + if (ret < 0) + ret = _vsnprintf(NULL, 0, format, ap); + } + + return ret; +} +#endif + +static void usbi_log_str(struct libusb_context *ctx, + enum libusb_log_level level, const char * str) +{ + UNUSED(ctx); + UNUSED(level); + goLibusbLog(str); +} + +void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, + const char *function, const char *format, va_list args) +{ + const char *prefix = ""; + char buf[USBI_MAX_LOG_LEN]; + struct timespec now; + int global_debug, header_len, text_len; + static int has_debug_header_been_displayed = 0; + +#ifdef ENABLE_DEBUG_LOGGING + global_debug = 1; + UNUSED(ctx); +#else + int ctx_level = 0; + + USBI_GET_CONTEXT(ctx); + if (ctx) { + ctx_level = ctx->debug; + } else { + char *dbg = getenv("LIBUSB_DEBUG"); + if (dbg) + ctx_level = atoi(dbg); + } + global_debug = (ctx_level == LIBUSB_LOG_LEVEL_DEBUG); + if (!ctx_level) + return; + if (level == LIBUSB_LOG_LEVEL_WARNING && ctx_level < LIBUSB_LOG_LEVEL_WARNING) + return; + if (level == LIBUSB_LOG_LEVEL_INFO && ctx_level < LIBUSB_LOG_LEVEL_INFO) + return; + if (level == LIBUSB_LOG_LEVEL_DEBUG && ctx_level < LIBUSB_LOG_LEVEL_DEBUG) + return; +#endif + + usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &now); + if ((global_debug) && (!has_debug_header_been_displayed)) { + has_debug_header_been_displayed = 1; + usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "[timestamp] [threadID] facility level [function call] " USBI_LOG_LINE_END); + usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "--------------------------------------------------------------------------------" USBI_LOG_LINE_END); + } + if (now.tv_nsec < timestamp_origin.tv_nsec) { + now.tv_sec--; + now.tv_nsec += 1000000000L; + } + now.tv_sec -= timestamp_origin.tv_sec; + now.tv_nsec -= timestamp_origin.tv_nsec; + + switch (level) { + case LIBUSB_LOG_LEVEL_INFO: + prefix = "info"; + break; + case LIBUSB_LOG_LEVEL_WARNING: + prefix = "warning"; + break; + case LIBUSB_LOG_LEVEL_ERROR: + prefix = "error"; + break; + case LIBUSB_LOG_LEVEL_DEBUG: + prefix = "debug"; + break; + case LIBUSB_LOG_LEVEL_NONE: + return; + default: + prefix = "unknown"; + break; + } + + if (global_debug) { + header_len = snprintf(buf, sizeof(buf), + "[%08x] libusb: %s [%s] ", + usbi_get_tid(), prefix, function); + } else { + header_len = snprintf(buf, sizeof(buf), + "libusb: %s [%s] ", prefix, function); + } + + if (header_len < 0 || header_len >= (int)sizeof(buf)) { + /* Somehow snprintf failed to write to the buffer, + * remove the header so something useful is output. */ + header_len = 0; + } + /* Make sure buffer is NUL terminated */ + buf[header_len] = '\0'; + text_len = vsnprintf(buf + header_len, sizeof(buf) - header_len, + format, args); + if (text_len < 0 || text_len + header_len >= (int)sizeof(buf)) { + /* Truncated log output. On some platforms a -1 return value means + * that the output was truncated. */ + text_len = sizeof(buf) - header_len; + } + if (header_len + text_len + sizeof(USBI_LOG_LINE_END) >= sizeof(buf)) { + /* Need to truncate the text slightly to fit on the terminator. */ + text_len -= (header_len + text_len + sizeof(USBI_LOG_LINE_END)) - sizeof(buf); + } + strcpy(buf + header_len + text_len, USBI_LOG_LINE_END); + + usbi_log_str(ctx, level, buf); +} + +void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, + const char *function, const char *format, ...) +{ + va_list args; + + va_start (args, format); + usbi_log_v(ctx, level, function, format, args); + va_end (args); +} + +/** \ingroup libusb_misc + * Returns a constant NULL-terminated string with the ASCII name of a libusb + * error or transfer status code. The caller must not free() the returned + * string. + * + * \param error_code The \ref libusb_error or libusb_transfer_status code to + * return the name of. + * \returns The error name, or the string **UNKNOWN** if the value of + * error_code is not a known error / status code. + */ +DEFAULT_VISIBILITY const char * LIBUSB_CALL libusb_error_name(int error_code) +{ + switch (error_code) { + case LIBUSB_ERROR_IO: + return "LIBUSB_ERROR_IO"; + case LIBUSB_ERROR_INVALID_PARAM: + return "LIBUSB_ERROR_INVALID_PARAM"; + case LIBUSB_ERROR_ACCESS: + return "LIBUSB_ERROR_ACCESS"; + case LIBUSB_ERROR_NO_DEVICE: + return "LIBUSB_ERROR_NO_DEVICE"; + case LIBUSB_ERROR_NOT_FOUND: + return "LIBUSB_ERROR_NOT_FOUND"; + case LIBUSB_ERROR_BUSY: + return "LIBUSB_ERROR_BUSY"; + case LIBUSB_ERROR_TIMEOUT: + return "LIBUSB_ERROR_TIMEOUT"; + case LIBUSB_ERROR_OVERFLOW: + return "LIBUSB_ERROR_OVERFLOW"; + case LIBUSB_ERROR_PIPE: + return "LIBUSB_ERROR_PIPE"; + case LIBUSB_ERROR_INTERRUPTED: + return "LIBUSB_ERROR_INTERRUPTED"; + case LIBUSB_ERROR_NO_MEM: + return "LIBUSB_ERROR_NO_MEM"; + case LIBUSB_ERROR_NOT_SUPPORTED: + return "LIBUSB_ERROR_NOT_SUPPORTED"; + case LIBUSB_ERROR_OTHER: + return "LIBUSB_ERROR_OTHER"; + + case LIBUSB_TRANSFER_ERROR: + return "LIBUSB_TRANSFER_ERROR"; + case LIBUSB_TRANSFER_TIMED_OUT: + return "LIBUSB_TRANSFER_TIMED_OUT"; + case LIBUSB_TRANSFER_CANCELLED: + return "LIBUSB_TRANSFER_CANCELLED"; + case LIBUSB_TRANSFER_STALL: + return "LIBUSB_TRANSFER_STALL"; + case LIBUSB_TRANSFER_NO_DEVICE: + return "LIBUSB_TRANSFER_NO_DEVICE"; + case LIBUSB_TRANSFER_OVERFLOW: + return "LIBUSB_TRANSFER_OVERFLOW"; + + case 0: + return "LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED"; + default: + return "**UNKNOWN**"; + } +} + +/** \ingroup libusb_misc + * Returns a pointer to const struct libusb_version with the version + * (major, minor, micro, nano and rc) of the running library. + */ +DEFAULT_VISIBILITY +const struct libusb_version * LIBUSB_CALL libusb_get_version(void) +{ + return &libusb_version_internal; +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/descriptor.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/descriptor.c new file mode 100644 index 00000000..7a5f67a0 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/descriptor.c @@ -0,0 +1,1215 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * USB descriptor handling functions for libusb + * Copyright © 2007 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include + +#include "libusbi.h" + +#define DESC_HEADER_LENGTH 2 +#define DEVICE_DESC_LENGTH 18 +#define CONFIG_DESC_LENGTH 9 +#define INTERFACE_DESC_LENGTH 9 +#define ENDPOINT_DESC_LENGTH 7 +#define ENDPOINT_AUDIO_DESC_LENGTH 9 + +/** @defgroup libusb_desc USB descriptors + * This page details how to examine the various standard USB descriptors + * for detected devices + */ + +/* set host_endian if the w values are already in host endian format, + * as opposed to bus endian. */ +int usbi_parse_descriptor(const unsigned char *source, const char *descriptor, + void *dest, int host_endian) +{ + const unsigned char *sp = source; + unsigned char *dp = dest; + uint16_t w; + const char *cp; + uint32_t d; + + for (cp = descriptor; *cp; cp++) { + switch (*cp) { + case 'b': /* 8-bit byte */ + *dp++ = *sp++; + break; + case 'w': /* 16-bit word, convert from little endian to CPU */ + dp += ((uintptr_t)dp & 1); /* Align to word boundary */ + + if (host_endian) { + memcpy(dp, sp, 2); + } else { + w = (sp[1] << 8) | sp[0]; + *((uint16_t *)dp) = w; + } + sp += 2; + dp += 2; + break; + case 'd': /* 32-bit word, convert from little endian to CPU */ + dp += ((uintptr_t)dp & 1); /* Align to word boundary */ + + if (host_endian) { + memcpy(dp, sp, 4); + } else { + d = (sp[3] << 24) | (sp[2] << 16) | + (sp[1] << 8) | sp[0]; + *((uint32_t *)dp) = d; + } + sp += 4; + dp += 4; + break; + case 'u': /* 16 byte UUID */ + memcpy(dp, sp, 16); + sp += 16; + dp += 16; + break; + } + } + + return (int) (sp - source); +} + +static void clear_endpoint(struct libusb_endpoint_descriptor *endpoint) +{ + free((void *) endpoint->extra); +} + +static int parse_endpoint(struct libusb_context *ctx, + struct libusb_endpoint_descriptor *endpoint, unsigned char *buffer, + int size, int host_endian) +{ + struct usb_descriptor_header header; + unsigned char *extra; + unsigned char *begin; + int parsed = 0; + int len; + + if (size < DESC_HEADER_LENGTH) { + usbi_err(ctx, "short endpoint descriptor read %d/%d", + size, DESC_HEADER_LENGTH); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(buffer, "bb", &header, 0); + if (header.bDescriptorType != LIBUSB_DT_ENDPOINT) { + usbi_err(ctx, "unexpected descriptor %x (expected %x)", + header.bDescriptorType, LIBUSB_DT_ENDPOINT); + return parsed; + } + if (header.bLength > size) { + usbi_warn(ctx, "short endpoint descriptor read %d/%d", + size, header.bLength); + return parsed; + } + if (header.bLength >= ENDPOINT_AUDIO_DESC_LENGTH) + usbi_parse_descriptor(buffer, "bbbbwbbb", endpoint, host_endian); + else if (header.bLength >= ENDPOINT_DESC_LENGTH) + usbi_parse_descriptor(buffer, "bbbbwb", endpoint, host_endian); + else { + usbi_err(ctx, "invalid endpoint bLength (%d)", header.bLength); + return LIBUSB_ERROR_IO; + } + + buffer += header.bLength; + size -= header.bLength; + parsed += header.bLength; + + /* Skip over the rest of the Class Specific or Vendor Specific */ + /* descriptors */ + begin = buffer; + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + if (header.bLength < DESC_HEADER_LENGTH) { + usbi_err(ctx, "invalid extra ep desc len (%d)", + header.bLength); + return LIBUSB_ERROR_IO; + } else if (header.bLength > size) { + usbi_warn(ctx, "short extra ep desc read %d/%d", + size, header.bLength); + return parsed; + } + + /* If we find another "proper" descriptor then we're done */ + if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || + (header.bDescriptorType == LIBUSB_DT_INTERFACE) || + (header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) + break; + + usbi_dbg("skipping descriptor %x", header.bDescriptorType); + buffer += header.bLength; + size -= header.bLength; + parsed += header.bLength; + } + + /* Copy any unknown descriptors into a storage area for drivers */ + /* to later parse */ + len = (int)(buffer - begin); + if (!len) { + endpoint->extra = NULL; + endpoint->extra_length = 0; + return parsed; + } + + extra = malloc(len); + endpoint->extra = extra; + if (!extra) { + endpoint->extra_length = 0; + return LIBUSB_ERROR_NO_MEM; + } + + memcpy(extra, begin, len); + endpoint->extra_length = len; + + return parsed; +} + +static void clear_interface(struct libusb_interface *usb_interface) +{ + int i; + int j; + + if (usb_interface->altsetting) { + for (i = 0; i < usb_interface->num_altsetting; i++) { + struct libusb_interface_descriptor *ifp = + (struct libusb_interface_descriptor *) + usb_interface->altsetting + i; + free((void *) ifp->extra); + if (ifp->endpoint) { + for (j = 0; j < ifp->bNumEndpoints; j++) + clear_endpoint((struct libusb_endpoint_descriptor *) + ifp->endpoint + j); + } + free((void *) ifp->endpoint); + } + } + free((void *) usb_interface->altsetting); + usb_interface->altsetting = NULL; +} + +static int parse_interface(libusb_context *ctx, + struct libusb_interface *usb_interface, unsigned char *buffer, int size, + int host_endian) +{ + int i; + int len; + int r; + int parsed = 0; + int interface_number = -1; + struct usb_descriptor_header header; + struct libusb_interface_descriptor *ifp; + unsigned char *begin; + + usb_interface->num_altsetting = 0; + + while (size >= INTERFACE_DESC_LENGTH) { + struct libusb_interface_descriptor *altsetting = + (struct libusb_interface_descriptor *) usb_interface->altsetting; + altsetting = usbi_reallocf(altsetting, + sizeof(struct libusb_interface_descriptor) * + (usb_interface->num_altsetting + 1)); + if (!altsetting) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + usb_interface->altsetting = altsetting; + + ifp = altsetting + usb_interface->num_altsetting; + usbi_parse_descriptor(buffer, "bbbbbbbbb", ifp, 0); + if (ifp->bDescriptorType != LIBUSB_DT_INTERFACE) { + usbi_err(ctx, "unexpected descriptor %x (expected %x)", + ifp->bDescriptorType, LIBUSB_DT_INTERFACE); + return parsed; + } + if (ifp->bLength < INTERFACE_DESC_LENGTH) { + usbi_err(ctx, "invalid interface bLength (%d)", + ifp->bLength); + r = LIBUSB_ERROR_IO; + goto err; + } + if (ifp->bLength > size) { + usbi_warn(ctx, "short intf descriptor read %d/%d", + size, ifp->bLength); + return parsed; + } + if (ifp->bNumEndpoints > USB_MAXENDPOINTS) { + usbi_err(ctx, "too many endpoints (%d)", ifp->bNumEndpoints); + r = LIBUSB_ERROR_IO; + goto err; + } + + usb_interface->num_altsetting++; + ifp->extra = NULL; + ifp->extra_length = 0; + ifp->endpoint = NULL; + + if (interface_number == -1) + interface_number = ifp->bInterfaceNumber; + + /* Skip over the interface */ + buffer += ifp->bLength; + parsed += ifp->bLength; + size -= ifp->bLength; + + begin = buffer; + + /* Skip over any interface, class or vendor descriptors */ + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + if (header.bLength < DESC_HEADER_LENGTH) { + usbi_err(ctx, + "invalid extra intf desc len (%d)", + header.bLength); + r = LIBUSB_ERROR_IO; + goto err; + } else if (header.bLength > size) { + usbi_warn(ctx, + "short extra intf desc read %d/%d", + size, header.bLength); + return parsed; + } + + /* If we find another "proper" descriptor then we're done */ + if ((header.bDescriptorType == LIBUSB_DT_INTERFACE) || + (header.bDescriptorType == LIBUSB_DT_ENDPOINT) || + (header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) + break; + + buffer += header.bLength; + parsed += header.bLength; + size -= header.bLength; + } + + /* Copy any unknown descriptors into a storage area for */ + /* drivers to later parse */ + len = (int)(buffer - begin); + if (len) { + ifp->extra = malloc(len); + if (!ifp->extra) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + memcpy((unsigned char *) ifp->extra, begin, len); + ifp->extra_length = len; + } + + if (ifp->bNumEndpoints > 0) { + struct libusb_endpoint_descriptor *endpoint; + endpoint = calloc(ifp->bNumEndpoints, sizeof(struct libusb_endpoint_descriptor)); + ifp->endpoint = endpoint; + if (!endpoint) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + + for (i = 0; i < ifp->bNumEndpoints; i++) { + r = parse_endpoint(ctx, endpoint + i, buffer, size, + host_endian); + if (r < 0) + goto err; + if (r == 0) { + ifp->bNumEndpoints = (uint8_t)i; + break;; + } + + buffer += r; + parsed += r; + size -= r; + } + } + + /* We check to see if it's an alternate to this one */ + ifp = (struct libusb_interface_descriptor *) buffer; + if (size < LIBUSB_DT_INTERFACE_SIZE || + ifp->bDescriptorType != LIBUSB_DT_INTERFACE || + ifp->bInterfaceNumber != interface_number) + return parsed; + } + + return parsed; +err: + clear_interface(usb_interface); + return r; +} + +static void clear_configuration(struct libusb_config_descriptor *config) +{ + int i; + if (config->interface) { + for (i = 0; i < config->bNumInterfaces; i++) + clear_interface((struct libusb_interface *) + config->interface + i); + } + free((void *) config->interface); + free((void *) config->extra); +} + +static int parse_configuration(struct libusb_context *ctx, + struct libusb_config_descriptor *config, unsigned char *buffer, + int size, int host_endian) +{ + int i; + int r; + struct usb_descriptor_header header; + struct libusb_interface *usb_interface; + + if (size < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(ctx, "short config descriptor read %d/%d", + size, LIBUSB_DT_CONFIG_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(buffer, "bbwbbbbb", config, host_endian); + if (config->bDescriptorType != LIBUSB_DT_CONFIG) { + usbi_err(ctx, "unexpected descriptor %x (expected %x)", + config->bDescriptorType, LIBUSB_DT_CONFIG); + return LIBUSB_ERROR_IO; + } + if (config->bLength < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(ctx, "invalid config bLength (%d)", config->bLength); + return LIBUSB_ERROR_IO; + } + if (config->bLength > size) { + usbi_err(ctx, "short config descriptor read %d/%d", + size, config->bLength); + return LIBUSB_ERROR_IO; + } + if (config->bNumInterfaces > USB_MAXINTERFACES) { + usbi_err(ctx, "too many interfaces (%d)", config->bNumInterfaces); + return LIBUSB_ERROR_IO; + } + + usb_interface = calloc(config->bNumInterfaces, sizeof(struct libusb_interface)); + config->interface = usb_interface; + if (!usb_interface) + return LIBUSB_ERROR_NO_MEM; + + buffer += config->bLength; + size -= config->bLength; + + config->extra = NULL; + config->extra_length = 0; + + for (i = 0; i < config->bNumInterfaces; i++) { + int len; + unsigned char *begin; + + /* Skip over the rest of the Class Specific or Vendor */ + /* Specific descriptors */ + begin = buffer; + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + + if (header.bLength < DESC_HEADER_LENGTH) { + usbi_err(ctx, + "invalid extra config desc len (%d)", + header.bLength); + r = LIBUSB_ERROR_IO; + goto err; + } else if (header.bLength > size) { + usbi_warn(ctx, + "short extra config desc read %d/%d", + size, header.bLength); + config->bNumInterfaces = (uint8_t)i; + return size; + } + + /* If we find another "proper" descriptor then we're done */ + if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || + (header.bDescriptorType == LIBUSB_DT_INTERFACE) || + (header.bDescriptorType == LIBUSB_DT_CONFIG) || + (header.bDescriptorType == LIBUSB_DT_DEVICE)) + break; + + usbi_dbg("skipping descriptor 0x%x", header.bDescriptorType); + buffer += header.bLength; + size -= header.bLength; + } + + /* Copy any unknown descriptors into a storage area for */ + /* drivers to later parse */ + len = (int)(buffer - begin); + if (len) { + /* FIXME: We should realloc and append here */ + if (!config->extra_length) { + config->extra = malloc(len); + if (!config->extra) { + r = LIBUSB_ERROR_NO_MEM; + goto err; + } + + memcpy((unsigned char *) config->extra, begin, len); + config->extra_length = len; + } + } + + r = parse_interface(ctx, usb_interface + i, buffer, size, host_endian); + if (r < 0) + goto err; + if (r == 0) { + config->bNumInterfaces = (uint8_t)i; + break; + } + + buffer += r; + size -= r; + } + + return size; + +err: + clear_configuration(config); + return r; +} + +static int raw_desc_to_config(struct libusb_context *ctx, + unsigned char *buf, int size, int host_endian, + struct libusb_config_descriptor **config) +{ + struct libusb_config_descriptor *_config = malloc(sizeof(*_config)); + int r; + + if (!_config) + return LIBUSB_ERROR_NO_MEM; + + r = parse_configuration(ctx, _config, buf, size, host_endian); + if (r < 0) { + usbi_err(ctx, "parse_configuration failed with error %d", r); + free(_config); + return r; + } else if (r > 0) { + usbi_warn(ctx, "still %d bytes of descriptor data left", r); + } + + *config = _config; + return LIBUSB_SUCCESS; +} + +int usbi_device_cache_descriptor(libusb_device *dev) +{ + int r, host_endian = 0; + + r = usbi_backend->get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor, + &host_endian); + if (r < 0) + return r; + + if (!host_endian) { + dev->device_descriptor.bcdUSB = libusb_le16_to_cpu(dev->device_descriptor.bcdUSB); + dev->device_descriptor.idVendor = libusb_le16_to_cpu(dev->device_descriptor.idVendor); + dev->device_descriptor.idProduct = libusb_le16_to_cpu(dev->device_descriptor.idProduct); + dev->device_descriptor.bcdDevice = libusb_le16_to_cpu(dev->device_descriptor.bcdDevice); + } + + return LIBUSB_SUCCESS; +} + +/** \ingroup libusb_desc + * Get the USB device descriptor for a given device. + * + * This is a non-blocking function; the device descriptor is cached in memory. + * + * Note since libusb-1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102, this + * function always succeeds. (Not true in trezord fork on windows.) + * + * \param dev the device + * \param desc output location for the descriptor data + * \returns 0 on success or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_get_device_descriptor(libusb_device *dev, + struct libusb_device_descriptor *desc) +{ + usbi_dbg("before memcpy"); + memcpy((unsigned char *) desc, (unsigned char *) &dev->device_descriptor, + sizeof (dev->device_descriptor)); + usbi_dbg("after memcpy"); + + #ifdef OS_WINDOWS + // hack for filtering out non-winusb devices in trezord + // (note that in trezord layer, throwing error here does NOT throw error up the chain, + // it just ignores the device) + usbi_dbg("windows -> ask driver"); + if (!dev->has_winusb_driver) { + usbi_dbg("winUSB not detected, return error"); + return LIBUSB_ERROR_OTHER; + } + #endif + usbi_dbg("return"); + return 0; +} + +/** \ingroup libusb_desc + * Get the USB configuration descriptor for the currently active configuration. + * This is a non-blocking function which does not involve any requests being + * sent to the device. + * + * \param dev a device + * \param config output location for the USB configuration descriptor. Only + * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() + * after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state + * \returns another LIBUSB_ERROR code on error + * \see libusb_get_config_descriptor + */ +int API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev, + struct libusb_config_descriptor **config) +{ + struct libusb_config_descriptor _config; + unsigned char tmp[LIBUSB_DT_CONFIG_SIZE]; + unsigned char *buf = NULL; + int host_endian = 0; + int r; + + usbi_dbg("start, call backend first"); + r = usbi_backend->get_active_config_descriptor(dev, tmp, + LIBUSB_DT_CONFIG_SIZE, &host_endian); + usbi_dbg("done"); + if (r < 0) { + usbi_err(dev->ctx, "error %d", r); + return r; + } + if (r < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(dev->ctx, "short config descriptor read %d/%d", + r, LIBUSB_DT_CONFIG_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_dbg("parse"); + usbi_parse_descriptor(tmp, "bbw", &_config, host_endian); + usbi_dbg("malloc"); + buf = malloc(_config.wTotalLength); + if (!buf) + return LIBUSB_ERROR_NO_MEM; + + usbi_dbg("call backend 2"); + r = usbi_backend->get_active_config_descriptor(dev, buf, + _config.wTotalLength, &host_endian); + if (r >= 0) { + usbi_dbg("raw_desc_to_config"); + r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); + } + + usbi_dbg("free"); + free(buf); + usbi_dbg("return"); + return r; +} + +/** \ingroup libusb_desc + * Get a USB configuration descriptor based on its index. + * This is a non-blocking function which does not involve any requests being + * sent to the device. + * + * \param dev a device + * \param config_index the index of the configuration you wish to retrieve + * \param config output location for the USB configuration descriptor. Only + * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() + * after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * \returns another LIBUSB_ERROR code on error + * \see libusb_get_active_config_descriptor() + * \see libusb_get_config_descriptor_by_value() + */ +int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev, + uint8_t config_index, struct libusb_config_descriptor **config) +{ + struct libusb_config_descriptor _config; + unsigned char tmp[LIBUSB_DT_CONFIG_SIZE]; + unsigned char *buf = NULL; + int host_endian = 0; + int r; + + usbi_dbg("index %d", config_index); + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_NOT_FOUND; + + r = usbi_backend->get_config_descriptor(dev, config_index, tmp, + LIBUSB_DT_CONFIG_SIZE, &host_endian); + if (r < 0) + return r; + if (r < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(dev->ctx, "short config descriptor read %d/%d", + r, LIBUSB_DT_CONFIG_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(tmp, "bbw", &_config, host_endian); + buf = malloc(_config.wTotalLength); + if (!buf) + return LIBUSB_ERROR_NO_MEM; + + r = usbi_backend->get_config_descriptor(dev, config_index, buf, + _config.wTotalLength, &host_endian); + if (r >= 0) + r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); + + free(buf); + return r; +} + +/* iterate through all configurations, returning the index of the configuration + * matching a specific bConfigurationValue in the idx output parameter, or -1 + * if the config was not found. + * returns 0 on success or a LIBUSB_ERROR code + */ +int usbi_get_config_index_by_value(struct libusb_device *dev, + uint8_t bConfigurationValue, int *idx) +{ + uint8_t i; + + usbi_dbg("value %d", bConfigurationValue); + for (i = 0; i < dev->num_configurations; i++) { + unsigned char tmp[6]; + int host_endian; + int r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp), + &host_endian); + if (r < 0) { + *idx = -1; + return r; + } + if (tmp[5] == bConfigurationValue) { + *idx = i; + return 0; + } + } + + *idx = -1; + return 0; +} + +/** \ingroup libusb_desc + * Get a USB configuration descriptor with a specific bConfigurationValue. + * This is a non-blocking function which does not involve any requests being + * sent to the device. + * + * \param dev a device + * \param bConfigurationValue the bConfigurationValue of the configuration you + * wish to retrieve + * \param config output location for the USB configuration descriptor. Only + * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() + * after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * \returns another LIBUSB_ERROR code on error + * \see libusb_get_active_config_descriptor() + * \see libusb_get_config_descriptor() + */ +int API_EXPORTED libusb_get_config_descriptor_by_value(libusb_device *dev, + uint8_t bConfigurationValue, struct libusb_config_descriptor **config) +{ + int r, idx, host_endian; + unsigned char *buf = NULL; + + if (usbi_backend->get_config_descriptor_by_value) { + r = usbi_backend->get_config_descriptor_by_value(dev, + bConfigurationValue, &buf, &host_endian); + if (r < 0) + return r; + return raw_desc_to_config(dev->ctx, buf, r, host_endian, config); + } + + r = usbi_get_config_index_by_value(dev, bConfigurationValue, &idx); + if (r < 0) + return r; + else if (idx == -1) + return LIBUSB_ERROR_NOT_FOUND; + else + return libusb_get_config_descriptor(dev, (uint8_t) idx, config); +} + +/** \ingroup libusb_desc + * Free a configuration descriptor obtained from + * libusb_get_active_config_descriptor() or libusb_get_config_descriptor(). + * It is safe to call this function with a NULL config parameter, in which + * case the function simply returns. + * + * \param config the configuration descriptor to free + */ +void API_EXPORTED libusb_free_config_descriptor( + struct libusb_config_descriptor *config) +{ + if (!config) + return; + + clear_configuration(config); + free(config); +} + +/** \ingroup libusb_desc + * Get an endpoints superspeed endpoint companion descriptor (if any) + * + * \param ctx the context to operate on, or NULL for the default context + * \param endpoint endpoint descriptor from which to get the superspeed + * endpoint companion descriptor + * \param ep_comp output location for the superspeed endpoint companion + * descriptor. Only valid if 0 was returned. Must be freed with + * libusb_free_ss_endpoint_companion_descriptor() after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * \returns another LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_ss_endpoint_companion_descriptor( + struct libusb_context *ctx, + const struct libusb_endpoint_descriptor *endpoint, + struct libusb_ss_endpoint_companion_descriptor **ep_comp) +{ + struct usb_descriptor_header header; + int size = endpoint->extra_length; + const unsigned char *buffer = endpoint->extra; + + *ep_comp = NULL; + + while (size >= DESC_HEADER_LENGTH) { + usbi_parse_descriptor(buffer, "bb", &header, 0); + if (header.bLength < 2 || header.bLength > size) { + usbi_err(ctx, "invalid descriptor length %d", + header.bLength); + return LIBUSB_ERROR_IO; + } + if (header.bDescriptorType != LIBUSB_DT_SS_ENDPOINT_COMPANION) { + buffer += header.bLength; + size -= header.bLength; + continue; + } + if (header.bLength < LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE) { + usbi_err(ctx, "invalid ss-ep-comp-desc length %d", + header.bLength); + return LIBUSB_ERROR_IO; + } + *ep_comp = malloc(sizeof(**ep_comp)); + if (*ep_comp == NULL) + return LIBUSB_ERROR_NO_MEM; + usbi_parse_descriptor(buffer, "bbbbw", *ep_comp, 0); + return LIBUSB_SUCCESS; + } + return LIBUSB_ERROR_NOT_FOUND; +} + +/** \ingroup libusb_desc + * Free a superspeed endpoint companion descriptor obtained from + * libusb_get_ss_endpoint_companion_descriptor(). + * It is safe to call this function with a NULL ep_comp parameter, in which + * case the function simply returns. + * + * \param ep_comp the superspeed endpoint companion descriptor to free + */ +void API_EXPORTED libusb_free_ss_endpoint_companion_descriptor( + struct libusb_ss_endpoint_companion_descriptor *ep_comp) +{ + free(ep_comp); +} + +static int parse_bos(struct libusb_context *ctx, + struct libusb_bos_descriptor **bos, + unsigned char *buffer, int size, int host_endian) +{ + struct libusb_bos_descriptor bos_header, *_bos; + struct libusb_bos_dev_capability_descriptor dev_cap; + int i; + + if (size < LIBUSB_DT_BOS_SIZE) { + usbi_err(ctx, "short bos descriptor read %d/%d", + size, LIBUSB_DT_BOS_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(buffer, "bbwb", &bos_header, host_endian); + if (bos_header.bDescriptorType != LIBUSB_DT_BOS) { + usbi_err(ctx, "unexpected descriptor %x (expected %x)", + bos_header.bDescriptorType, LIBUSB_DT_BOS); + return LIBUSB_ERROR_IO; + } + if (bos_header.bLength < LIBUSB_DT_BOS_SIZE) { + usbi_err(ctx, "invalid bos bLength (%d)", bos_header.bLength); + return LIBUSB_ERROR_IO; + } + if (bos_header.bLength > size) { + usbi_err(ctx, "short bos descriptor read %d/%d", + size, bos_header.bLength); + return LIBUSB_ERROR_IO; + } + + _bos = calloc (1, + sizeof(*_bos) + bos_header.bNumDeviceCaps * sizeof(void *)); + if (!_bos) + return LIBUSB_ERROR_NO_MEM; + + usbi_parse_descriptor(buffer, "bbwb", _bos, host_endian); + buffer += bos_header.bLength; + size -= bos_header.bLength; + + /* Get the device capability descriptors */ + for (i = 0; i < bos_header.bNumDeviceCaps; i++) { + if (size < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) { + usbi_warn(ctx, "short dev-cap descriptor read %d/%d", + size, LIBUSB_DT_DEVICE_CAPABILITY_SIZE); + break; + } + usbi_parse_descriptor(buffer, "bbb", &dev_cap, host_endian); + if (dev_cap.bDescriptorType != LIBUSB_DT_DEVICE_CAPABILITY) { + usbi_warn(ctx, "unexpected descriptor %x (expected %x)", + dev_cap.bDescriptorType, LIBUSB_DT_DEVICE_CAPABILITY); + break; + } + if (dev_cap.bLength < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) { + usbi_err(ctx, "invalid dev-cap bLength (%d)", + dev_cap.bLength); + libusb_free_bos_descriptor(_bos); + return LIBUSB_ERROR_IO; + } + if (dev_cap.bLength > size) { + usbi_warn(ctx, "short dev-cap descriptor read %d/%d", + size, dev_cap.bLength); + break; + } + + _bos->dev_capability[i] = malloc(dev_cap.bLength); + if (!_bos->dev_capability[i]) { + libusb_free_bos_descriptor(_bos); + return LIBUSB_ERROR_NO_MEM; + } + memcpy(_bos->dev_capability[i], buffer, dev_cap.bLength); + buffer += dev_cap.bLength; + size -= dev_cap.bLength; + } + _bos->bNumDeviceCaps = (uint8_t)i; + *bos = _bos; + + return LIBUSB_SUCCESS; +} + +/** \ingroup libusb_desc + * Get a Binary Object Store (BOS) descriptor + * This is a BLOCKING function, which will send requests to the device. + * + * \param dev_handle the handle of an open libusb device + * \param bos output location for the BOS descriptor. Only valid if 0 was returned. + * Must be freed with \ref libusb_free_bos_descriptor() after use. + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the device doesn't have a BOS descriptor + * \returns another LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_bos_descriptor(libusb_device_handle *dev_handle, + struct libusb_bos_descriptor **bos) +{ + struct libusb_bos_descriptor _bos; + uint8_t bos_header[LIBUSB_DT_BOS_SIZE] = {0}; + unsigned char *bos_data = NULL; + const int host_endian = 0; + int r; + + /* Read the BOS. This generates 2 requests on the bus, + * one for the header, and one for the full BOS */ + r = libusb_get_descriptor(dev_handle, LIBUSB_DT_BOS, 0, bos_header, + LIBUSB_DT_BOS_SIZE); + if (r < 0) { + if (r != LIBUSB_ERROR_PIPE) + usbi_err(HANDLE_CTX(dev_handle), "failed to read BOS (%d)", r); + return r; + } + if (r < LIBUSB_DT_BOS_SIZE) { + usbi_err(HANDLE_CTX(dev_handle), "short BOS read %d/%d", + r, LIBUSB_DT_BOS_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(bos_header, "bbwb", &_bos, host_endian); + usbi_dbg("found BOS descriptor: size %d bytes, %d capabilities", + _bos.wTotalLength, _bos.bNumDeviceCaps); + bos_data = calloc(_bos.wTotalLength, 1); + if (bos_data == NULL) + return LIBUSB_ERROR_NO_MEM; + + r = libusb_get_descriptor(dev_handle, LIBUSB_DT_BOS, 0, bos_data, + _bos.wTotalLength); + if (r >= 0) + r = parse_bos(HANDLE_CTX(dev_handle), bos, bos_data, r, host_endian); + else + usbi_err(HANDLE_CTX(dev_handle), "failed to read BOS (%d)", r); + + free(bos_data); + return r; +} + +/** \ingroup libusb_desc + * Free a BOS descriptor obtained from libusb_get_bos_descriptor(). + * It is safe to call this function with a NULL bos parameter, in which + * case the function simply returns. + * + * \param bos the BOS descriptor to free + */ +void API_EXPORTED libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos) +{ + int i; + + if (!bos) + return; + + for (i = 0; i < bos->bNumDeviceCaps; i++) + free(bos->dev_capability[i]); + free(bos); +} + +/** \ingroup libusb_desc + * Get an USB 2.0 Extension descriptor + * + * \param ctx the context to operate on, or NULL for the default context + * \param dev_cap Device Capability descriptor with a bDevCapabilityType of + * \ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION + * LIBUSB_BT_USB_2_0_EXTENSION + * \param usb_2_0_extension output location for the USB 2.0 Extension + * descriptor. Only valid if 0 was returned. Must be freed with + * libusb_free_usb_2_0_extension_descriptor() after use. + * \returns 0 on success + * \returns a LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_usb_2_0_extension_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_usb_2_0_extension_descriptor **usb_2_0_extension) +{ + struct libusb_usb_2_0_extension_descriptor *_usb_2_0_extension; + const int host_endian = 0; + + if (dev_cap->bDevCapabilityType != LIBUSB_BT_USB_2_0_EXTENSION) { + usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", + dev_cap->bDevCapabilityType, + LIBUSB_BT_USB_2_0_EXTENSION); + return LIBUSB_ERROR_INVALID_PARAM; + } + if (dev_cap->bLength < LIBUSB_BT_USB_2_0_EXTENSION_SIZE) { + usbi_err(ctx, "short dev-cap descriptor read %d/%d", + dev_cap->bLength, LIBUSB_BT_USB_2_0_EXTENSION_SIZE); + return LIBUSB_ERROR_IO; + } + + _usb_2_0_extension = malloc(sizeof(*_usb_2_0_extension)); + if (!_usb_2_0_extension) + return LIBUSB_ERROR_NO_MEM; + + usbi_parse_descriptor((unsigned char *)dev_cap, "bbbd", + _usb_2_0_extension, host_endian); + + *usb_2_0_extension = _usb_2_0_extension; + return LIBUSB_SUCCESS; +} + +/** \ingroup libusb_desc + * Free a USB 2.0 Extension descriptor obtained from + * libusb_get_usb_2_0_extension_descriptor(). + * It is safe to call this function with a NULL usb_2_0_extension parameter, + * in which case the function simply returns. + * + * \param usb_2_0_extension the USB 2.0 Extension descriptor to free + */ +void API_EXPORTED libusb_free_usb_2_0_extension_descriptor( + struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension) +{ + free(usb_2_0_extension); +} + +/** \ingroup libusb_desc + * Get a SuperSpeed USB Device Capability descriptor + * + * \param ctx the context to operate on, or NULL for the default context + * \param dev_cap Device Capability descriptor with a bDevCapabilityType of + * \ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY + * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY + * \param ss_usb_device_cap output location for the SuperSpeed USB Device + * Capability descriptor. Only valid if 0 was returned. Must be freed with + * libusb_free_ss_usb_device_capability_descriptor() after use. + * \returns 0 on success + * \returns a LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_ss_usb_device_capability_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap) +{ + struct libusb_ss_usb_device_capability_descriptor *_ss_usb_device_cap; + const int host_endian = 0; + + if (dev_cap->bDevCapabilityType != LIBUSB_BT_SS_USB_DEVICE_CAPABILITY) { + usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", + dev_cap->bDevCapabilityType, + LIBUSB_BT_SS_USB_DEVICE_CAPABILITY); + return LIBUSB_ERROR_INVALID_PARAM; + } + if (dev_cap->bLength < LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) { + usbi_err(ctx, "short dev-cap descriptor read %d/%d", + dev_cap->bLength, LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE); + return LIBUSB_ERROR_IO; + } + + _ss_usb_device_cap = malloc(sizeof(*_ss_usb_device_cap)); + if (!_ss_usb_device_cap) + return LIBUSB_ERROR_NO_MEM; + + usbi_parse_descriptor((unsigned char *)dev_cap, "bbbbwbbw", + _ss_usb_device_cap, host_endian); + + *ss_usb_device_cap = _ss_usb_device_cap; + return LIBUSB_SUCCESS; +} + +/** \ingroup libusb_desc + * Free a SuperSpeed USB Device Capability descriptor obtained from + * libusb_get_ss_usb_device_capability_descriptor(). + * It is safe to call this function with a NULL ss_usb_device_cap + * parameter, in which case the function simply returns. + * + * \param ss_usb_device_cap the USB 2.0 Extension descriptor to free + */ +void API_EXPORTED libusb_free_ss_usb_device_capability_descriptor( + struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap) +{ + free(ss_usb_device_cap); +} + +/** \ingroup libusb_desc + * Get a Container ID descriptor + * + * \param ctx the context to operate on, or NULL for the default context + * \param dev_cap Device Capability descriptor with a bDevCapabilityType of + * \ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID + * LIBUSB_BT_CONTAINER_ID + * \param container_id output location for the Container ID descriptor. + * Only valid if 0 was returned. Must be freed with + * libusb_free_container_id_descriptor() after use. + * \returns 0 on success + * \returns a LIBUSB_ERROR code on error + */ +int API_EXPORTED libusb_get_container_id_descriptor(struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_container_id_descriptor **container_id) +{ + struct libusb_container_id_descriptor *_container_id; + const int host_endian = 0; + + if (dev_cap->bDevCapabilityType != LIBUSB_BT_CONTAINER_ID) { + usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", + dev_cap->bDevCapabilityType, + LIBUSB_BT_CONTAINER_ID); + return LIBUSB_ERROR_INVALID_PARAM; + } + if (dev_cap->bLength < LIBUSB_BT_CONTAINER_ID_SIZE) { + usbi_err(ctx, "short dev-cap descriptor read %d/%d", + dev_cap->bLength, LIBUSB_BT_CONTAINER_ID_SIZE); + return LIBUSB_ERROR_IO; + } + + _container_id = malloc(sizeof(*_container_id)); + if (!_container_id) + return LIBUSB_ERROR_NO_MEM; + + usbi_parse_descriptor((unsigned char *)dev_cap, "bbbbu", + _container_id, host_endian); + + *container_id = _container_id; + return LIBUSB_SUCCESS; +} + +/** \ingroup libusb_desc + * Free a Container ID descriptor obtained from + * libusb_get_container_id_descriptor(). + * It is safe to call this function with a NULL container_id parameter, + * in which case the function simply returns. + * + * \param container_id the USB 2.0 Extension descriptor to free + */ +void API_EXPORTED libusb_free_container_id_descriptor( + struct libusb_container_id_descriptor *container_id) +{ + free(container_id); +} + +/** \ingroup libusb_desc + * Retrieve a string descriptor in C style ASCII. + * + * Wrapper around libusb_get_string_descriptor(). Uses the first language + * supported by the device. + * + * \param dev_handle a device handle + * \param desc_index the index of the descriptor to retrieve + * \param data output buffer for ASCII string descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_get_string_descriptor_ascii(libusb_device_handle *dev_handle, + uint8_t desc_index, unsigned char *data, int length) +{ + unsigned char tbuf[255]; /* Some devices choke on size > 255 */ + int r, si, di; + uint16_t langid; + + /* Asking for the zero'th index is special - it returns a string + * descriptor that contains all the language IDs supported by the + * device. Typically there aren't many - often only one. Language + * IDs are 16 bit numbers, and they start at the third byte in the + * descriptor. There's also no point in trying to read descriptor 0 + * with this function. See USB 2.0 specification section 9.6.7 for + * more information. + */ + + if (desc_index == 0) + return LIBUSB_ERROR_INVALID_PARAM; + + r = libusb_get_string_descriptor(dev_handle, 0, 0, tbuf, sizeof(tbuf)); + if (r < 0) + return r; + + if (r < 4) + return LIBUSB_ERROR_IO; + + langid = tbuf[2] | (tbuf[3] << 8); + + r = libusb_get_string_descriptor(dev_handle, desc_index, langid, tbuf, + sizeof(tbuf)); + if (r < 0) + return r; + + if (tbuf[1] != LIBUSB_DT_STRING) + return LIBUSB_ERROR_IO; + + if (tbuf[0] > r) + return LIBUSB_ERROR_IO; + + for (di = 0, si = 2; si < tbuf[0]; si += 2) { + if (di >= (length - 1)) + break; + + if ((tbuf[si] & 0x80) || (tbuf[si + 1])) /* non-ASCII */ + data[di++] = '?'; + else + data[di++] = tbuf[si]; + } + + data[di] = 0; + return di; +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/hotplug.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/hotplug.c new file mode 100644 index 00000000..bbfd6e79 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/hotplug.c @@ -0,0 +1,350 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * Hotplug functions for libusb + * Copyright © 2012-2013 Nathan Hjelm + * Copyright © 2012-2013 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include + +#include "libusbi.h" +#include "hotplug.h" + +/** + * @defgroup libusb_hotplug Device hotplug event notification + * This page details how to use the libusb hotplug interface, where available. + * + * Be mindful that not all platforms currently implement hotplug notification and + * that you should first call on \ref libusb_has_capability() with parameter + * \ref LIBUSB_CAP_HAS_HOTPLUG to confirm that hotplug support is available. + * + * \page libusb_hotplug Device hotplug event notification + * + * \section hotplug_intro Introduction + * + * Version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102, has added support + * for hotplug events on some platforms (you should test if your platform + * supports hotplug notification by calling \ref libusb_has_capability() with + * parameter \ref LIBUSB_CAP_HAS_HOTPLUG). + * + * This interface allows you to request notification for the arrival and departure + * of matching USB devices. + * + * To receive hotplug notification you register a callback by calling + * \ref libusb_hotplug_register_callback(). This function will optionally return + * a callback handle that can be passed to \ref libusb_hotplug_deregister_callback(). + * + * A callback function must return an int (0 or 1) indicating whether the callback is + * expecting additional events. Returning 0 will rearm the callback and 1 will cause + * the callback to be deregistered. Note that when callbacks are called from + * libusb_hotplug_register_callback() because of the \ref LIBUSB_HOTPLUG_ENUMERATE + * flag, the callback return value is ignored, iow you cannot cause a callback + * to be deregistered by returning 1 when it is called from + * libusb_hotplug_register_callback(). + * + * Callbacks for a particular context are automatically deregistered by libusb_exit(). + * + * As of 1.0.16 there are two supported hotplug events: + * - LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED: A device has arrived and is ready to use + * - LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: A device has left and is no longer available + * + * A hotplug event can listen for either or both of these events. + * + * Note: If you receive notification that a device has left and you have any + * a libusb_device_handles for the device it is up to you to call libusb_close() + * on each device handle to free up any remaining resources associated with the device. + * Once a device has left any libusb_device_handle associated with the device + * are invalid and will remain so even if the device comes back. + * + * When handling a LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED event it is considered + * safe to call any libusb function that takes a libusb_device. It also safe to + * open a device and submit asynchronous transfers. However, most other functions + * that take a libusb_device_handle are not safe to call. Examples of such + * functions are any of the \ref libusb_syncio "synchronous API" functions or the blocking + * functions that retrieve various \ref libusb_desc "USB descriptors". These functions must + * be used outside of the context of the hotplug callback. + * + * When handling a LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT event the only safe function + * is libusb_get_device_descriptor(). + * + * The following code provides an example of the usage of the hotplug interface: +\code +#include +#include +#include +#include + +static int count = 0; + +int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event, void *user_data) { + static libusb_device_handle *dev_handle = NULL; + struct libusb_device_descriptor desc; + int rc; + + (void)libusb_get_device_descriptor(dev, &desc); + + if (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED == event) { + rc = libusb_open(dev, &dev_handle); + if (LIBUSB_SUCCESS != rc) { + printf("Could not open USB device\n"); + } + } else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) { + if (dev_handle) { + libusb_close(dev_handle); + dev_handle = NULL; + } + } else { + printf("Unhandled event %d\n", event); + } + count++; + + return 0; +} + +int main (void) { + libusb_hotplug_callback_handle callback_handle; + int rc; + + libusb_init(NULL); + + rc = libusb_hotplug_register_callback(NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | + LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, 0x045a, 0x5005, + LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL, + &callback_handle); + if (LIBUSB_SUCCESS != rc) { + printf("Error creating a hotplug callback\n"); + libusb_exit(NULL); + return EXIT_FAILURE; + } + + while (count < 2) { + libusb_handle_events_completed(NULL, NULL); + nanosleep(&(struct timespec){0, 10000000UL}, NULL); + } + + libusb_hotplug_deregister_callback(NULL, callback_handle); + libusb_exit(NULL); + + return 0; +} +\endcode + */ + +static int usbi_hotplug_match_cb (struct libusb_context *ctx, + struct libusb_device *dev, libusb_hotplug_event event, + struct libusb_hotplug_callback *hotplug_cb) +{ + /* Handle lazy deregistration of callback */ + if (hotplug_cb->needs_free) { + /* Free callback */ + return 1; + } + + if (!(hotplug_cb->events & event)) { + return 0; + } + + if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->vendor_id && + hotplug_cb->vendor_id != dev->device_descriptor.idVendor) { + return 0; + } + + if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->product_id && + hotplug_cb->product_id != dev->device_descriptor.idProduct) { + return 0; + } + + if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->dev_class && + hotplug_cb->dev_class != dev->device_descriptor.bDeviceClass) { + return 0; + } + + return hotplug_cb->cb (ctx, dev, event, hotplug_cb->user_data); +} + +void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event) +{ + struct libusb_hotplug_callback *hotplug_cb, *next; + int ret; + + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + + list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) { + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); + ret = usbi_hotplug_match_cb (ctx, dev, event, hotplug_cb); + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + + if (ret) { + list_del(&hotplug_cb->list); + free(hotplug_cb); + } + } + + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); + + /* the backend is expected to call the callback for each active transfer */ +} + +void usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event) +{ + int pending_events; + libusb_hotplug_message *message = calloc(1, sizeof(*message)); + + if (!message) { + usbi_err(ctx, "error allocating hotplug message"); + return; + } + + message->event = event; + message->device = dev; + + /* Take the event data lock and add this message to the list. + * Only signal an event if there are no prior pending events. */ + usbi_mutex_lock(&ctx->event_data_lock); + pending_events = usbi_pending_events(ctx); + list_add_tail(&message->list, &ctx->hotplug_msgs); + if (!pending_events) + usbi_signal_event(ctx); + usbi_mutex_unlock(&ctx->event_data_lock); +} + +int API_EXPORTED libusb_hotplug_register_callback(libusb_context *ctx, + libusb_hotplug_event events, libusb_hotplug_flag flags, + int vendor_id, int product_id, int dev_class, + libusb_hotplug_callback_fn cb_fn, void *user_data, + libusb_hotplug_callback_handle *callback_handle) +{ + libusb_hotplug_callback *new_callback; + static int handle_id = 1; + + /* check for hotplug support */ + if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + return LIBUSB_ERROR_NOT_SUPPORTED; + } + + /* check for sane values */ + if ((LIBUSB_HOTPLUG_MATCH_ANY != vendor_id && (~0xffff & vendor_id)) || + (LIBUSB_HOTPLUG_MATCH_ANY != product_id && (~0xffff & product_id)) || + (LIBUSB_HOTPLUG_MATCH_ANY != dev_class && (~0xff & dev_class)) || + !cb_fn) { + return LIBUSB_ERROR_INVALID_PARAM; + } + + USBI_GET_CONTEXT(ctx); + + new_callback = (libusb_hotplug_callback *)calloc(1, sizeof (*new_callback)); + if (!new_callback) { + return LIBUSB_ERROR_NO_MEM; + } + + new_callback->ctx = ctx; + new_callback->vendor_id = vendor_id; + new_callback->product_id = product_id; + new_callback->dev_class = dev_class; + new_callback->flags = flags; + new_callback->events = events; + new_callback->cb = cb_fn; + new_callback->user_data = user_data; + new_callback->needs_free = 0; + + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + + /* protect the handle by the context hotplug lock. it doesn't matter if the same handle + * is used for different contexts only that the handle is unique for this context */ + new_callback->handle = handle_id++; + + list_add(&new_callback->list, &ctx->hotplug_cbs); + + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); + + + if (flags & LIBUSB_HOTPLUG_ENUMERATE) { + int i, len; + struct libusb_device **devs; + + len = (int) libusb_get_device_list(ctx, &devs); + if (len < 0) { + libusb_hotplug_deregister_callback(ctx, + new_callback->handle); + return len; + } + + for (i = 0; i < len; i++) { + usbi_hotplug_match_cb(ctx, devs[i], + LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, + new_callback); + } + + libusb_free_device_list(devs, 1); + } + + + if (callback_handle) + *callback_handle = new_callback->handle; + + return LIBUSB_SUCCESS; +} + +void API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx, + libusb_hotplug_callback_handle callback_handle) +{ + struct libusb_hotplug_callback *hotplug_cb; + + /* check for hotplug support */ + if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { + return; + } + + USBI_GET_CONTEXT(ctx); + + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + list_for_each_entry(hotplug_cb, &ctx->hotplug_cbs, list, + struct libusb_hotplug_callback) { + if (callback_handle == hotplug_cb->handle) { + /* Mark this callback for deregistration */ + hotplug_cb->needs_free = 1; + } + } + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); + + usbi_hotplug_notification(ctx, NULL, 0); +} + +void usbi_hotplug_deregister_all(struct libusb_context *ctx) { + struct libusb_hotplug_callback *hotplug_cb, *next; + + usbi_mutex_lock(&ctx->hotplug_cbs_lock); + list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, + struct libusb_hotplug_callback) { + list_del(&hotplug_cb->list); + free(hotplug_cb); + } + + usbi_mutex_unlock(&ctx->hotplug_cbs_lock); +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/hotplug.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/hotplug.h new file mode 100644 index 00000000..2bec81b0 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/hotplug.h @@ -0,0 +1,90 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * Hotplug support for libusb + * Copyright © 2012-2013 Nathan Hjelm + * Copyright © 2012-2013 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if !defined(USBI_HOTPLUG_H) +#define USBI_HOTPLUG_H + +#ifndef LIBUSBI_H +#include "libusbi.h" +#endif + +/** \ingroup hotplug + * The hotplug callback structure. The user populates this structure with + * libusb_hotplug_prepare_callback() and then calls libusb_hotplug_register_callback() + * to receive notification of hotplug events. + */ +struct libusb_hotplug_callback { + /** Context this callback is associated with */ + struct libusb_context *ctx; + + /** Vendor ID to match or LIBUSB_HOTPLUG_MATCH_ANY */ + int vendor_id; + + /** Product ID to match or LIBUSB_HOTPLUG_MATCH_ANY */ + int product_id; + + /** Device class to match or LIBUSB_HOTPLUG_MATCH_ANY */ + int dev_class; + + /** Hotplug callback flags */ + libusb_hotplug_flag flags; + + /** Event(s) that will trigger this callback */ + libusb_hotplug_event events; + + /** Callback function to invoke for matching event/device */ + libusb_hotplug_callback_fn cb; + + /** Handle for this callback (used to match on deregister) */ + libusb_hotplug_callback_handle handle; + + /** User data that will be passed to the callback function */ + void *user_data; + + /** Callback is marked for deletion */ + int needs_free; + + /** List this callback is registered in (ctx->hotplug_cbs) */ + struct list_head list; +}; + +typedef struct libusb_hotplug_callback libusb_hotplug_callback; + +struct libusb_hotplug_message { + /** The hotplug event that occurred */ + libusb_hotplug_event event; + + /** The device for which this hotplug event occurred */ + struct libusb_device *device; + + /** List this message is contained in (ctx->hotplug_msgs) */ + struct list_head list; +}; + +typedef struct libusb_hotplug_message libusb_hotplug_message; + +void usbi_hotplug_deregister_all(struct libusb_context *ctx); +void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event); +void usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev, + libusb_hotplug_event event); + +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/io.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/io.c new file mode 100644 index 00000000..d483eba1 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/io.c @@ -0,0 +1,2820 @@ +/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ +/* + * I/O functions for libusb + * Copyright © 2007-2009 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef USBI_TIMERFD_AVAILABLE +#include +#endif + +#include "libusbi.h" +#include "hotplug.h" + +/** + * \page libusb_io Synchronous and asynchronous device I/O + * + * \section io_intro Introduction + * + * If you're using libusb in your application, you're probably wanting to + * perform I/O with devices - you want to perform USB data transfers. + * + * libusb offers two separate interfaces for device I/O. This page aims to + * introduce the two in order to help you decide which one is more suitable + * for your application. You can also choose to use both interfaces in your + * application by considering each transfer on a case-by-case basis. + * + * Once you have read through the following discussion, you should consult the + * detailed API documentation pages for the details: + * - \ref libusb_syncio + * - \ref libusb_asyncio + * + * \section theory Transfers at a logical level + * + * At a logical level, USB transfers typically happen in two parts. For + * example, when reading data from a endpoint: + * -# A request for data is sent to the device + * -# Some time later, the incoming data is received by the host + * + * or when writing data to an endpoint: + * + * -# The data is sent to the device + * -# Some time later, the host receives acknowledgement from the device that + * the data has been transferred. + * + * There may be an indefinite delay between the two steps. Consider a + * fictional USB input device with a button that the user can press. In order + * to determine when the button is pressed, you would likely submit a request + * to read data on a bulk or interrupt endpoint and wait for data to arrive. + * Data will arrive when the button is pressed by the user, which is + * potentially hours later. + * + * libusb offers both a synchronous and an asynchronous interface to performing + * USB transfers. The main difference is that the synchronous interface + * combines both steps indicated above into a single function call, whereas + * the asynchronous interface separates them. + * + * \section sync The synchronous interface + * + * The synchronous I/O interface allows you to perform a USB transfer with + * a single function call. When the function call returns, the transfer has + * completed and you can parse the results. + * + * If you have used the libusb-0.1 before, this I/O style will seem familar to + * you. libusb-0.1 only offered a synchronous interface. + * + * In our input device example, to read button presses you might write code + * in the following style: +\code +unsigned char data[4]; +int actual_length; +int r = libusb_bulk_transfer(dev_handle, LIBUSB_ENDPOINT_IN, data, sizeof(data), &actual_length, 0); +if (r == 0 && actual_length == sizeof(data)) { + // results of the transaction can now be found in the data buffer + // parse them here and report button press +} else { + error(); +} +\endcode + * + * The main advantage of this model is simplicity: you did everything with + * a single simple function call. + * + * However, this interface has its limitations. Your application will sleep + * inside libusb_bulk_transfer() until the transaction has completed. If it + * takes the user 3 hours to press the button, your application will be + * sleeping for that long. Execution will be tied up inside the library - + * the entire thread will be useless for that duration. + * + * Another issue is that by tieing up the thread with that single transaction + * there is no possibility of performing I/O with multiple endpoints and/or + * multiple devices simultaneously, unless you resort to creating one thread + * per transaction. + * + * Additionally, there is no opportunity to cancel the transfer after the + * request has been submitted. + * + * For details on how to use the synchronous API, see the + * \ref libusb_syncio "synchronous I/O API documentation" pages. + * + * \section async The asynchronous interface + * + * Asynchronous I/O is the most significant new feature in libusb-1.0. + * Although it is a more complex interface, it solves all the issues detailed + * above. + * + * Instead of providing which functions that block until the I/O has complete, + * libusb's asynchronous interface presents non-blocking functions which + * begin a transfer and then return immediately. Your application passes a + * callback function pointer to this non-blocking function, which libusb will + * call with the results of the transaction when it has completed. + * + * Transfers which have been submitted through the non-blocking functions + * can be cancelled with a separate function call. + * + * The non-blocking nature of this interface allows you to be simultaneously + * performing I/O to multiple endpoints on multiple devices, without having + * to use threads. + * + * This added flexibility does come with some complications though: + * - In the interest of being a lightweight library, libusb does not create + * threads and can only operate when your application is calling into it. Your + * application must call into libusb from it's main loop when events are ready + * to be handled, or you must use some other scheme to allow libusb to + * undertake whatever work needs to be done. + * - libusb also needs to be called into at certain fixed points in time in + * order to accurately handle transfer timeouts. + * - Memory handling becomes more complex. You cannot use stack memory unless + * the function with that stack is guaranteed not to return until the transfer + * callback has finished executing. + * - You generally lose some linearity from your code flow because submitting + * the transfer request is done in a separate function from where the transfer + * results are handled. This becomes particularly obvious when you want to + * submit a second transfer based on the results of an earlier transfer. + * + * Internally, libusb's synchronous interface is expressed in terms of function + * calls to the asynchronous interface. + * + * For details on how to use the asynchronous API, see the + * \ref libusb_asyncio "asynchronous I/O API" documentation pages. + */ + + +/** + * \page libusb_packetoverflow Packets and overflows + * + * \section packets Packet abstraction + * + * The USB specifications describe how data is transmitted in packets, with + * constraints on packet size defined by endpoint descriptors. The host must + * not send data payloads larger than the endpoint's maximum packet size. + * + * libusb and the underlying OS abstract out the packet concept, allowing you + * to request transfers of any size. Internally, the request will be divided + * up into correctly-sized packets. You do not have to be concerned with + * packet sizes, but there is one exception when considering overflows. + * + * \section overflow Bulk/interrupt transfer overflows + * + * When requesting data on a bulk endpoint, libusb requires you to supply a + * buffer and the maximum number of bytes of data that libusb can put in that + * buffer. However, the size of the buffer is not communicated to the device - + * the device is just asked to send any amount of data. + * + * There is no problem if the device sends an amount of data that is less than + * or equal to the buffer size. libusb reports this condition to you through + * the \ref libusb_transfer::actual_length "libusb_transfer.actual_length" + * field. + * + * Problems may occur if the device attempts to send more data than can fit in + * the buffer. libusb reports LIBUSB_TRANSFER_OVERFLOW for this condition but + * other behaviour is largely undefined: actual_length may or may not be + * accurate, the chunk of data that can fit in the buffer (before overflow) + * may or may not have been transferred. + * + * Overflows are nasty, but can be avoided. Even though you were told to + * ignore packets above, think about the lower level details: each transfer is + * split into packets (typically small, with a maximum size of 512 bytes). + * Overflows can only happen if the final packet in an incoming data transfer + * is smaller than the actual packet that the device wants to transfer. + * Therefore, you will never see an overflow if your transfer buffer size is a + * multiple of the endpoint's packet size: the final packet will either + * fill up completely or will be only partially filled. + */ + +/** + * @defgroup libusb_asyncio Asynchronous device I/O + * + * This page details libusb's asynchronous (non-blocking) API for USB device + * I/O. This interface is very powerful but is also quite complex - you will + * need to read this page carefully to understand the necessary considerations + * and issues surrounding use of this interface. Simplistic applications + * may wish to consider the \ref libusb_syncio "synchronous I/O API" instead. + * + * The asynchronous interface is built around the idea of separating transfer + * submission and handling of transfer completion (the synchronous model + * combines both of these into one). There may be a long delay between + * submission and completion, however the asynchronous submission function + * is non-blocking so will return control to your application during that + * potentially long delay. + * + * \section asyncabstraction Transfer abstraction + * + * For the asynchronous I/O, libusb implements the concept of a generic + * transfer entity for all types of I/O (control, bulk, interrupt, + * isochronous). The generic transfer object must be treated slightly + * differently depending on which type of I/O you are performing with it. + * + * This is represented by the public libusb_transfer structure type. + * + * \section asynctrf Asynchronous transfers + * + * We can view asynchronous I/O as a 5 step process: + * -# Allocation: allocate a libusb_transfer + * -# Filling: populate the libusb_transfer instance with information + * about the transfer you wish to perform + * -# Submission: ask libusb to submit the transfer + * -# Completion handling: examine transfer results in the + * libusb_transfer structure + * -# Deallocation: clean up resources + * + * + * \subsection asyncalloc Allocation + * + * This step involves allocating memory for a USB transfer. This is the + * generic transfer object mentioned above. At this stage, the transfer + * is "blank" with no details about what type of I/O it will be used for. + * + * Allocation is done with the libusb_alloc_transfer() function. You must use + * this function rather than allocating your own transfers. + * + * \subsection asyncfill Filling + * + * This step is where you take a previously allocated transfer and fill it + * with information to determine the message type and direction, data buffer, + * callback function, etc. + * + * You can either fill the required fields yourself or you can use the + * helper functions: libusb_fill_control_transfer(), libusb_fill_bulk_transfer() + * and libusb_fill_interrupt_transfer(). + * + * \subsection asyncsubmit Submission + * + * When you have allocated a transfer and filled it, you can submit it using + * libusb_submit_transfer(). This function returns immediately but can be + * regarded as firing off the I/O request in the background. + * + * \subsection asynccomplete Completion handling + * + * After a transfer has been submitted, one of four things can happen to it: + * + * - The transfer completes (i.e. some data was transferred) + * - The transfer has a timeout and the timeout expires before all data is + * transferred + * - The transfer fails due to an error + * - The transfer is cancelled + * + * Each of these will cause the user-specified transfer callback function to + * be invoked. It is up to the callback function to determine which of the + * above actually happened and to act accordingly. + * + * The user-specified callback is passed a pointer to the libusb_transfer + * structure which was used to setup and submit the transfer. At completion + * time, libusb has populated this structure with results of the transfer: + * success or failure reason, number of bytes of data transferred, etc. See + * the libusb_transfer structure documentation for more information. + * + * Important Note: The user-specified callback is called from an event + * handling context. It is therefore important that no calls are made into + * libusb that will attempt to perform any event handling. Examples of such + * functions are any listed in the \ref libusb_syncio "synchronous API" and any of + * the blocking functions that retrieve \ref libusb_desc "USB descriptors". + * + * \subsection Deallocation + * + * When a transfer has completed (i.e. the callback function has been invoked), + * you are advised to free the transfer (unless you wish to resubmit it, see + * below). Transfers are deallocated with libusb_free_transfer(). + * + * It is undefined behaviour to free a transfer which has not completed. + * + * \section asyncresubmit Resubmission + * + * You may be wondering why allocation, filling, and submission are all + * separated above where they could reasonably be combined into a single + * operation. + * + * The reason for separation is to allow you to resubmit transfers without + * having to allocate new ones every time. This is especially useful for + * common situations dealing with interrupt endpoints - you allocate one + * transfer, fill and submit it, and when it returns with results you just + * resubmit it for the next interrupt. + * + * \section asynccancel Cancellation + * + * Another advantage of using the asynchronous interface is that you have + * the ability to cancel transfers which have not yet completed. This is + * done by calling the libusb_cancel_transfer() function. + * + * libusb_cancel_transfer() is asynchronous/non-blocking in itself. When the + * cancellation actually completes, the transfer's callback function will + * be invoked, and the callback function should check the transfer status to + * determine that it was cancelled. + * + * Freeing the transfer after it has been cancelled but before cancellation + * has completed will result in undefined behaviour. + * + * When a transfer is cancelled, some of the data may have been transferred. + * libusb will communicate this to you in the transfer callback. Do not assume + * that no data was transferred. + * + * \section bulk_overflows Overflows on device-to-host bulk/interrupt endpoints + * + * If your device does not have predictable transfer sizes (or it misbehaves), + * your application may submit a request for data on an IN endpoint which is + * smaller than the data that the device wishes to send. In some circumstances + * this will cause an overflow, which is a nasty condition to deal with. See + * the \ref libusb_packetoverflow page for discussion. + * + * \section asyncctrl Considerations for control transfers + * + * The libusb_transfer structure is generic and hence does not + * include specific fields for the control-specific setup packet structure. + * + * In order to perform a control transfer, you must place the 8-byte setup + * packet at the start of the data buffer. To simplify this, you could + * cast the buffer pointer to type struct libusb_control_setup, or you can + * use the helper function libusb_fill_control_setup(). + * + * The wLength field placed in the setup packet must be the length you would + * expect to be sent in the setup packet: the length of the payload that + * follows (or the expected maximum number of bytes to receive). However, + * the length field of the libusb_transfer object must be the length of + * the data buffer - i.e. it should be wLength plus the size of + * the setup packet (LIBUSB_CONTROL_SETUP_SIZE). + * + * If you use the helper functions, this is simplified for you: + * -# Allocate a buffer of size LIBUSB_CONTROL_SETUP_SIZE plus the size of the + * data you are sending/requesting. + * -# Call libusb_fill_control_setup() on the data buffer, using the transfer + * request size as the wLength value (i.e. do not include the extra space you + * allocated for the control setup). + * -# If this is a host-to-device transfer, place the data to be transferred + * in the data buffer, starting at offset LIBUSB_CONTROL_SETUP_SIZE. + * -# Call libusb_fill_control_transfer() to associate the data buffer with + * the transfer (and to set the remaining details such as callback and timeout). + * - Note that there is no parameter to set the length field of the transfer. + * The length is automatically inferred from the wLength field of the setup + * packet. + * -# Submit the transfer. + * + * The multi-byte control setup fields (wValue, wIndex and wLength) must + * be given in little-endian byte order (the endianness of the USB bus). + * Endianness conversion is transparently handled by + * libusb_fill_control_setup() which is documented to accept host-endian + * values. + * + * Further considerations are needed when handling transfer completion in + * your callback function: + * - As you might expect, the setup packet will still be sitting at the start + * of the data buffer. + * - If this was a device-to-host transfer, the received data will be sitting + * at offset LIBUSB_CONTROL_SETUP_SIZE into the buffer. + * - The actual_length field of the transfer structure is relative to the + * wLength of the setup packet, rather than the size of the data buffer. So, + * if your wLength was 4, your transfer's length was 12, then you + * should expect an actual_length of 4 to indicate that the data was + * transferred in entirity. + * + * To simplify parsing of setup packets and obtaining the data from the + * correct offset, you may wish to use the libusb_control_transfer_get_data() + * and libusb_control_transfer_get_setup() functions within your transfer + * callback. + * + * Even though control endpoints do not halt, a completed control transfer + * may have a LIBUSB_TRANSFER_STALL status code. This indicates the control + * request was not supported. + * + * \section asyncintr Considerations for interrupt transfers + * + * All interrupt transfers are performed using the polling interval presented + * by the bInterval value of the endpoint descriptor. + * + * \section asynciso Considerations for isochronous transfers + * + * Isochronous transfers are more complicated than transfers to + * non-isochronous endpoints. + * + * To perform I/O to an isochronous endpoint, allocate the transfer by calling + * libusb_alloc_transfer() with an appropriate number of isochronous packets. + * + * During filling, set \ref libusb_transfer::type "type" to + * \ref libusb_transfer_type::LIBUSB_TRANSFER_TYPE_ISOCHRONOUS + * "LIBUSB_TRANSFER_TYPE_ISOCHRONOUS", and set + * \ref libusb_transfer::num_iso_packets "num_iso_packets" to a value less than + * or equal to the number of packets you requested during allocation. + * libusb_alloc_transfer() does not set either of these fields for you, given + * that you might not even use the transfer on an isochronous endpoint. + * + * Next, populate the length field for the first num_iso_packets entries in + * the \ref libusb_transfer::iso_packet_desc "iso_packet_desc" array. Section + * 5.6.3 of the USB2 specifications describe how the maximum isochronous + * packet length is determined by the wMaxPacketSize field in the endpoint + * descriptor. + * Two functions can help you here: + * + * - libusb_get_max_iso_packet_size() is an easy way to determine the max + * packet size for an isochronous endpoint. Note that the maximum packet + * size is actually the maximum number of bytes that can be transmitted in + * a single microframe, therefore this function multiplies the maximum number + * of bytes per transaction by the number of transaction opportunities per + * microframe. + * - libusb_set_iso_packet_lengths() assigns the same length to all packets + * within a transfer, which is usually what you want. + * + * For outgoing transfers, you'll obviously fill the buffer and populate the + * packet descriptors in hope that all the data gets transferred. For incoming + * transfers, you must ensure the buffer has sufficient capacity for + * the situation where all packets transfer the full amount of requested data. + * + * Completion handling requires some extra consideration. The + * \ref libusb_transfer::actual_length "actual_length" field of the transfer + * is meaningless and should not be examined; instead you must refer to the + * \ref libusb_iso_packet_descriptor::actual_length "actual_length" field of + * each individual packet. + * + * The \ref libusb_transfer::status "status" field of the transfer is also a + * little misleading: + * - If the packets were submitted and the isochronous data microframes + * completed normally, status will have value + * \ref libusb_transfer_status::LIBUSB_TRANSFER_COMPLETED + * "LIBUSB_TRANSFER_COMPLETED". Note that bus errors and software-incurred + * delays are not counted as transfer errors; the transfer.status field may + * indicate COMPLETED even if some or all of the packets failed. Refer to + * the \ref libusb_iso_packet_descriptor::status "status" field of each + * individual packet to determine packet failures. + * - The status field will have value + * \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR + * "LIBUSB_TRANSFER_ERROR" only when serious errors were encountered. + * - Other transfer status codes occur with normal behaviour. + * + * The data for each packet will be found at an offset into the buffer that + * can be calculated as if each prior packet completed in full. The + * libusb_get_iso_packet_buffer() and libusb_get_iso_packet_buffer_simple() + * functions may help you here. + * + * Note: Some operating systems (e.g. Linux) may impose limits on the + * length of individual isochronous packets and/or the total length of the + * isochronous transfer. Such limits can be difficult for libusb to detect, + * so the library will simply try and submit the transfer as set up by you. + * If the transfer fails to submit because it is too large, + * libusb_submit_transfer() will return + * \ref libusb_error::LIBUSB_ERROR_INVALID_PARAM "LIBUSB_ERROR_INVALID_PARAM". + * + * \section asyncmem Memory caveats + * + * In most circumstances, it is not safe to use stack memory for transfer + * buffers. This is because the function that fired off the asynchronous + * transfer may return before libusb has finished using the buffer, and when + * the function returns it's stack gets destroyed. This is true for both + * host-to-device and device-to-host transfers. + * + * The only case in which it is safe to use stack memory is where you can + * guarantee that the function owning the stack space for the buffer does not + * return until after the transfer's callback function has completed. In every + * other case, you need to use heap memory instead. + * + * \section asyncflags Fine control + * + * Through using this asynchronous interface, you may find yourself repeating + * a few simple operations many times. You can apply a bitwise OR of certain + * flags to a transfer to simplify certain things: + * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_SHORT_NOT_OK + * "LIBUSB_TRANSFER_SHORT_NOT_OK" results in transfers which transferred + * less than the requested amount of data being marked with status + * \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR "LIBUSB_TRANSFER_ERROR" + * (they would normally be regarded as COMPLETED) + * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER + * "LIBUSB_TRANSFER_FREE_BUFFER" allows you to ask libusb to free the transfer + * buffer when freeing the transfer. + * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_TRANSFER + * "LIBUSB_TRANSFER_FREE_TRANSFER" causes libusb to automatically free the + * transfer after the transfer callback returns. + * + * \section asyncevent Event handling + * + * An asynchronous model requires that libusb perform work at various + * points in time - namely processing the results of previously-submitted + * transfers and invoking the user-supplied callback function. + * + * This gives rise to the libusb_handle_events() function which your + * application must call into when libusb has work do to. This gives libusb + * the opportunity to reap pending transfers, invoke callbacks, etc. + * + * There are 2 different approaches to dealing with libusb_handle_events: + * + * -# Repeatedly call libusb_handle_events() in blocking mode from a dedicated + * thread. + * -# Integrate libusb with your application's main event loop. libusb + * exposes a set of file descriptors which allow you to do this. + * + * The first approach has the big advantage that it will also work on Windows + * were libusb' poll API for select / poll integration is not available. So + * if you want to support Windows and use the async API, you must use this + * approach, see the \ref eventthread "Using an event handling thread" section + * below for details. + * + * If you prefer a single threaded approach with a single central event loop, + * see the \ref libusb_poll "polling and timing" section for how to integrate libusb + * into your application's main event loop. + * + * \section eventthread Using an event handling thread + * + * Lets begin with stating the obvious: If you're going to use a separate + * thread for libusb event handling, your callback functions MUST be + * threadsafe. + * + * Other then that doing event handling from a separate thread, is mostly + * simple. You can use an event thread function as follows: +\code +void *event_thread_func(void *ctx) +{ + while (event_thread_run) + libusb_handle_events(ctx); + + return NULL; +} +\endcode + * + * There is one caveat though, stopping this thread requires setting the + * event_thread_run variable to 0, and after that libusb_handle_events() needs + * to return control to event_thread_func. But unless some event happens, + * libusb_handle_events() will not return. + * + * There are 2 different ways of dealing with this, depending on if your + * application uses libusb' \ref libusb_hotplug "hotplug" support or not. + * + * Applications which do not use hotplug support, should not start the event + * thread until after their first call to libusb_open(), and should stop the + * thread when closing the last open device as follows: +\code +void my_close_handle(libusb_device_handle *dev_handle) +{ + if (open_devs == 1) + event_thread_run = 0; + + libusb_close(dev_handle); // This wakes up libusb_handle_events() + + if (open_devs == 1) + pthread_join(event_thread); + + open_devs--; +} +\endcode + * + * Applications using hotplug support should start the thread at program init, + * after having successfully called libusb_hotplug_register_callback(), and + * should stop the thread at program exit as follows: +\code +void my_libusb_exit(void) +{ + event_thread_run = 0; + libusb_hotplug_deregister_callback(ctx, hotplug_cb_handle); // This wakes up libusb_handle_events() + pthread_join(event_thread); + libusb_exit(ctx); +} +\endcode + */ + +/** + * @defgroup libusb_poll Polling and timing + * + * This page documents libusb's functions for polling events and timing. + * These functions are only necessary for users of the + * \ref libusb_asyncio "asynchronous API". If you are only using the simpler + * \ref libusb_syncio "synchronous API" then you do not need to ever call these + * functions. + * + * The justification for the functionality described here has already been + * discussed in the \ref asyncevent "event handling" section of the + * asynchronous API documentation. In summary, libusb does not create internal + * threads for event processing and hence relies on your application calling + * into libusb at certain points in time so that pending events can be handled. + * + * Your main loop is probably already calling poll() or select() or a + * variant on a set of file descriptors for other event sources (e.g. keyboard + * button presses, mouse movements, network sockets, etc). You then add + * libusb's file descriptors to your poll()/select() calls, and when activity + * is detected on such descriptors you know it is time to call + * libusb_handle_events(). + * + * There is one final event handling complication. libusb supports + * asynchronous transfers which time out after a specified time period. + * + * On some platforms a timerfd is used, so the timeout handling is just another + * fd, on other platforms this requires that libusb is called into at or after + * the timeout to handle it. So, in addition to considering libusb's file + * descriptors in your main event loop, you must also consider that libusb + * sometimes needs to be called into at fixed points in time even when there + * is no file descriptor activity, see \ref polltime details. + * + * In order to know precisely when libusb needs to be called into, libusb + * offers you a set of pollable file descriptors and information about when + * the next timeout expires. + * + * If you are using the asynchronous I/O API, you must take one of the two + * following options, otherwise your I/O will not complete. + * + * \section pollsimple The simple option + * + * If your application revolves solely around libusb and does not need to + * handle other event sources, you can have a program structure as follows: +\code +// initialize libusb +// find and open device +// maybe fire off some initial async I/O + +while (user_has_not_requested_exit) + libusb_handle_events(ctx); + +// clean up and exit +\endcode + * + * With such a simple main loop, you do not have to worry about managing + * sets of file descriptors or handling timeouts. libusb_handle_events() will + * handle those details internally. + * + * \section libusb_pollmain The more advanced option + * + * \note This functionality is currently only available on Unix-like platforms. + * On Windows, libusb_get_pollfds() simply returns NULL. Applications which + * want to support Windows are advised to use an \ref eventthread + * "event handling thread" instead. + * + * In more advanced applications, you will already have a main loop which + * is monitoring other event sources: network sockets, X11 events, mouse + * movements, etc. Through exposing a set of file descriptors, libusb is + * designed to cleanly integrate into such main loops. + * + * In addition to polling file descriptors for the other event sources, you + * take a set of file descriptors from libusb and monitor those too. When you + * detect activity on libusb's file descriptors, you call + * libusb_handle_events_timeout() in non-blocking mode. + * + * What's more, libusb may also need to handle events at specific moments in + * time. No file descriptor activity is generated at these times, so your + * own application needs to be continually aware of when the next one of these + * moments occurs (through calling libusb_get_next_timeout()), and then it + * needs to call libusb_handle_events_timeout() in non-blocking mode when + * these moments occur. This means that you need to adjust your + * poll()/select() timeout accordingly. + * + * libusb provides you with a set of file descriptors to poll and expects you + * to poll all of them, treating them as a single entity. The meaning of each + * file descriptor in the set is an internal implementation detail, + * platform-dependent and may vary from release to release. Don't try and + * interpret the meaning of the file descriptors, just do as libusb indicates, + * polling all of them at once. + * + * In pseudo-code, you want something that looks like: +\code +// initialise libusb + +libusb_get_pollfds(ctx) +while (user has not requested application exit) { + libusb_get_next_timeout(ctx); + poll(on libusb file descriptors plus any other event sources of interest, + using a timeout no larger than the value libusb just suggested) + if (poll() indicated activity on libusb file descriptors) + libusb_handle_events_timeout(ctx, &zero_tv); + if (time has elapsed to or beyond the libusb timeout) + libusb_handle_events_timeout(ctx, &zero_tv); + // handle events from other sources here +} + +// clean up and exit +\endcode + * + * \subsection polltime Notes on time-based events + * + * The above complication with having to track time and call into libusb at + * specific moments is a bit of a headache. For maximum compatibility, you do + * need to write your main loop as above, but you may decide that you can + * restrict the supported platforms of your application and get away with + * a more simplistic scheme. + * + * These time-based event complications are \b not required on the following + * platforms: + * - Darwin + * - Linux, provided that the following version requirements are satisfied: + * - Linux v2.6.27 or newer, compiled with timerfd support + * - glibc v2.9 or newer + * - libusb v1.0.5 or newer + * + * Under these configurations, libusb_get_next_timeout() will \em always return + * 0, so your main loop can be simplified to: +\code +// initialise libusb + +libusb_get_pollfds(ctx) +while (user has not requested application exit) { + poll(on libusb file descriptors plus any other event sources of interest, + using any timeout that you like) + if (poll() indicated activity on libusb file descriptors) + libusb_handle_events_timeout(ctx, &zero_tv); + // handle events from other sources here +} + +// clean up and exit +\endcode + * + * Do remember that if you simplify your main loop to the above, you will + * lose compatibility with some platforms (including legacy Linux platforms, + * and any future platforms supported by libusb which may have time-based + * event requirements). The resultant problems will likely appear as + * strange bugs in your application. + * + * You can use the libusb_pollfds_handle_timeouts() function to do a runtime + * check to see if it is safe to ignore the time-based event complications. + * If your application has taken the shortcut of ignoring libusb's next timeout + * in your main loop, then you are advised to check the return value of + * libusb_pollfds_handle_timeouts() during application startup, and to abort + * if the platform does suffer from these timing complications. + * + * \subsection fdsetchange Changes in the file descriptor set + * + * The set of file descriptors that libusb uses as event sources may change + * during the life of your application. Rather than having to repeatedly + * call libusb_get_pollfds(), you can set up notification functions for when + * the file descriptor set changes using libusb_set_pollfd_notifiers(). + * + * \subsection mtissues Multi-threaded considerations + * + * Unfortunately, the situation is complicated further when multiple threads + * come into play. If two threads are monitoring the same file descriptors, + * the fact that only one thread will be woken up when an event occurs causes + * some headaches. + * + * The events lock, event waiters lock, and libusb_handle_events_locked() + * entities are added to solve these problems. You do not need to be concerned + * with these entities otherwise. + * + * See the extra documentation: \ref libusb_mtasync + */ + +/** \page libusb_mtasync Multi-threaded applications and asynchronous I/O + * + * libusb is a thread-safe library, but extra considerations must be applied + * to applications which interact with libusb from multiple threads. + * + * The underlying issue that must be addressed is that all libusb I/O + * revolves around monitoring file descriptors through the poll()/select() + * system calls. This is directly exposed at the + * \ref libusb_asyncio "asynchronous interface" but it is important to note that the + * \ref libusb_syncio "synchronous interface" is implemented on top of the + * asynchonrous interface, therefore the same considerations apply. + * + * The issue is that if two or more threads are concurrently calling poll() + * or select() on libusb's file descriptors then only one of those threads + * will be woken up when an event arrives. The others will be completely + * oblivious that anything has happened. + * + * Consider the following pseudo-code, which submits an asynchronous transfer + * then waits for its completion. This style is one way you could implement a + * synchronous interface on top of the asynchronous interface (and libusb + * does something similar, albeit more advanced due to the complications + * explained on this page). + * +\code +void cb(struct libusb_transfer *transfer) +{ + int *completed = transfer->user_data; + *completed = 1; +} + +void myfunc() { + struct libusb_transfer *transfer; + unsigned char buffer[LIBUSB_CONTROL_SETUP_SIZE] __attribute__ ((aligned (2))); + int completed = 0; + + transfer = libusb_alloc_transfer(0); + libusb_fill_control_setup(buffer, + LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, 0x04, 0x01, 0, 0); + libusb_fill_control_transfer(transfer, dev, buffer, cb, &completed, 1000); + libusb_submit_transfer(transfer); + + while (!completed) { + poll(libusb file descriptors, 120*1000); + if (poll indicates activity) + libusb_handle_events_timeout(ctx, &zero_tv); + } + printf("completed!"); + // other code here +} +\endcode + * + * Here we are serializing completion of an asynchronous event + * against a condition - the condition being completion of a specific transfer. + * The poll() loop has a long timeout to minimize CPU usage during situations + * when nothing is happening (it could reasonably be unlimited). + * + * If this is the only thread that is polling libusb's file descriptors, there + * is no problem: there is no danger that another thread will swallow up the + * event that we are interested in. On the other hand, if there is another + * thread polling the same descriptors, there is a chance that it will receive + * the event that we were interested in. In this situation, myfunc() + * will only realise that the transfer has completed on the next iteration of + * the loop, up to 120 seconds later. Clearly a two-minute delay is + * undesirable, and don't even think about using short timeouts to circumvent + * this issue! + * + * The solution here is to ensure that no two threads are ever polling the + * file descriptors at the same time. A naive implementation of this would + * impact the capabilities of the library, so libusb offers the scheme + * documented below to ensure no loss of functionality. + * + * Before we go any further, it is worth mentioning that all libusb-wrapped + * event handling procedures fully adhere to the scheme documented below. + * This includes libusb_handle_events() and its variants, and all the + * synchronous I/O functions - libusb hides this headache from you. + * + * \section Using libusb_handle_events() from multiple threads + * + * Even when only using libusb_handle_events() and synchronous I/O functions, + * you can still have a race condition. You might be tempted to solve the + * above with libusb_handle_events() like so: + * +\code + libusb_submit_transfer(transfer); + + while (!completed) { + libusb_handle_events(ctx); + } + printf("completed!"); +\endcode + * + * This however has a race between the checking of completed and + * libusb_handle_events() acquiring the events lock, so another thread + * could have completed the transfer, resulting in this thread hanging + * until either a timeout or another event occurs. See also commit + * 6696512aade99bb15d6792af90ae329af270eba6 which fixes this in the + * synchronous API implementation of libusb. + * + * Fixing this race requires checking the variable completed only after + * taking the event lock, which defeats the concept of just calling + * libusb_handle_events() without worrying about locking. This is why + * libusb-1.0.9 introduces the new libusb_handle_events_timeout_completed() + * and libusb_handle_events_completed() functions, which handles doing the + * completion check for you after they have acquired the lock: + * +\code + libusb_submit_transfer(transfer); + + while (!completed) { + libusb_handle_events_completed(ctx, &completed); + } + printf("completed!"); +\endcode + * + * This nicely fixes the race in our example. Note that if all you want to + * do is submit a single transfer and wait for its completion, then using + * one of the synchronous I/O functions is much easier. + * + * \section eventlock The events lock + * + * The problem is when we consider the fact that libusb exposes file + * descriptors to allow for you to integrate asynchronous USB I/O into + * existing main loops, effectively allowing you to do some work behind + * libusb's back. If you do take libusb's file descriptors and pass them to + * poll()/select() yourself, you need to be aware of the associated issues. + * + * The first concept to be introduced is the events lock. The events lock + * is used to serialize threads that want to handle events, such that only + * one thread is handling events at any one time. + * + * You must take the events lock before polling libusb file descriptors, + * using libusb_lock_events(). You must release the lock as soon as you have + * aborted your poll()/select() loop, using libusb_unlock_events(). + * + * \section threadwait Letting other threads do the work for you + * + * Although the events lock is a critical part of the solution, it is not + * enough on it's own. You might wonder if the following is sufficient... +\code + libusb_lock_events(ctx); + while (!completed) { + poll(libusb file descriptors, 120*1000); + if (poll indicates activity) + libusb_handle_events_timeout(ctx, &zero_tv); + } + libusb_unlock_events(ctx); +\endcode + * ...and the answer is that it is not. This is because the transfer in the + * code shown above may take a long time (say 30 seconds) to complete, and + * the lock is not released until the transfer is completed. + * + * Another thread with similar code that wants to do event handling may be + * working with a transfer that completes after a few milliseconds. Despite + * having such a quick completion time, the other thread cannot check that + * status of its transfer until the code above has finished (30 seconds later) + * due to contention on the lock. + * + * To solve this, libusb offers you a mechanism to determine when another + * thread is handling events. It also offers a mechanism to block your thread + * until the event handling thread has completed an event (and this mechanism + * does not involve polling of file descriptors). + * + * After determining that another thread is currently handling events, you + * obtain the event waiters lock using libusb_lock_event_waiters(). + * You then re-check that some other thread is still handling events, and if + * so, you call libusb_wait_for_event(). + * + * libusb_wait_for_event() puts your application to sleep until an event + * occurs, or until a thread releases the events lock. When either of these + * things happen, your thread is woken up, and should re-check the condition + * it was waiting on. It should also re-check that another thread is handling + * events, and if not, it should start handling events itself. + * + * This looks like the following, as pseudo-code: +\code +retry: +if (libusb_try_lock_events(ctx) == 0) { + // we obtained the event lock: do our own event handling + while (!completed) { + if (!libusb_event_handling_ok(ctx)) { + libusb_unlock_events(ctx); + goto retry; + } + poll(libusb file descriptors, 120*1000); + if (poll indicates activity) + libusb_handle_events_locked(ctx, 0); + } + libusb_unlock_events(ctx); +} else { + // another thread is doing event handling. wait for it to signal us that + // an event has completed + libusb_lock_event_waiters(ctx); + + while (!completed) { + // now that we have the event waiters lock, double check that another + // thread is still handling events for us. (it may have ceased handling + // events in the time it took us to reach this point) + if (!libusb_event_handler_active(ctx)) { + // whoever was handling events is no longer doing so, try again + libusb_unlock_event_waiters(ctx); + goto retry; + } + + libusb_wait_for_event(ctx, NULL); + } + libusb_unlock_event_waiters(ctx); +} +printf("completed!\n"); +\endcode + * + * A naive look at the above code may suggest that this can only support + * one event waiter (hence a total of 2 competing threads, the other doing + * event handling), because the event waiter seems to have taken the event + * waiters lock while waiting for an event. However, the system does support + * multiple event waiters, because libusb_wait_for_event() actually drops + * the lock while waiting, and reaquires it before continuing. + * + * We have now implemented code which can dynamically handle situations where + * nobody is handling events (so we should do it ourselves), and it can also + * handle situations where another thread is doing event handling (so we can + * piggyback onto them). It is also equipped to handle a combination of + * the two, for example, another thread is doing event handling, but for + * whatever reason it stops doing so before our condition is met, so we take + * over the event handling. + * + * Four functions were introduced in the above pseudo-code. Their importance + * should be apparent from the code shown above. + * -# libusb_try_lock_events() is a non-blocking function which attempts + * to acquire the events lock but returns a failure code if it is contended. + * -# libusb_event_handling_ok() checks that libusb is still happy for your + * thread to be performing event handling. Sometimes, libusb needs to + * interrupt the event handler, and this is how you can check if you have + * been interrupted. If this function returns 0, the correct behaviour is + * for you to give up the event handling lock, and then to repeat the cycle. + * The following libusb_try_lock_events() will fail, so you will become an + * events waiter. For more information on this, read \ref fullstory below. + * -# libusb_handle_events_locked() is a variant of + * libusb_handle_events_timeout() that you can call while holding the + * events lock. libusb_handle_events_timeout() itself implements similar + * logic to the above, so be sure not to call it when you are + * "working behind libusb's back", as is the case here. + * -# libusb_event_handler_active() determines if someone is currently + * holding the events lock + * + * You might be wondering why there is no function to wake up all threads + * blocked on libusb_wait_for_event(). This is because libusb can do this + * internally: it will wake up all such threads when someone calls + * libusb_unlock_events() or when a transfer completes (at the point after its + * callback has returned). + * + * \subsection fullstory The full story + * + * The above explanation should be enough to get you going, but if you're + * really thinking through the issues then you may be left with some more + * questions regarding libusb's internals. If you're curious, read on, and if + * not, skip to the next section to avoid confusing yourself! + * + * The immediate question that may spring to mind is: what if one thread + * modifies the set of file descriptors that need to be polled while another + * thread is doing event handling? + * + * There are 2 situations in which this may happen. + * -# libusb_open() will add another file descriptor to the poll set, + * therefore it is desirable to interrupt the event handler so that it + * restarts, picking up the new descriptor. + * -# libusb_close() will remove a file descriptor from the poll set. There + * are all kinds of race conditions that could arise here, so it is + * important that nobody is doing event handling at this time. + * + * libusb handles these issues internally, so application developers do not + * have to stop their event handlers while opening/closing devices. Here's how + * it works, focusing on the libusb_close() situation first: + * + * -# During initialization, libusb opens an internal pipe, and it adds the read + * end of this pipe to the set of file descriptors to be polled. + * -# During libusb_close(), libusb writes some dummy data on this event pipe. + * This immediately interrupts the event handler. libusb also records + * internally that it is trying to interrupt event handlers for this + * high-priority event. + * -# At this point, some of the functions described above start behaving + * differently: + * - libusb_event_handling_ok() starts returning 1, indicating that it is NOT + * OK for event handling to continue. + * - libusb_try_lock_events() starts returning 1, indicating that another + * thread holds the event handling lock, even if the lock is uncontended. + * - libusb_event_handler_active() starts returning 1, indicating that + * another thread is doing event handling, even if that is not true. + * -# The above changes in behaviour result in the event handler stopping and + * giving up the events lock very quickly, giving the high-priority + * libusb_close() operation a "free ride" to acquire the events lock. All + * threads that are competing to do event handling become event waiters. + * -# With the events lock held inside libusb_close(), libusb can safely remove + * a file descriptor from the poll set, in the safety of knowledge that + * nobody is polling those descriptors or trying to access the poll set. + * -# After obtaining the events lock, the close operation completes very + * quickly (usually a matter of milliseconds) and then immediately releases + * the events lock. + * -# At the same time, the behaviour of libusb_event_handling_ok() and friends + * reverts to the original, documented behaviour. + * -# The release of the events lock causes the threads that are waiting for + * events to be woken up and to start competing to become event handlers + * again. One of them will succeed; it will then re-obtain the list of poll + * descriptors, and USB I/O will then continue as normal. + * + * libusb_open() is similar, and is actually a more simplistic case. Upon a + * call to libusb_open(): + * + * -# The device is opened and a file descriptor is added to the poll set. + * -# libusb sends some dummy data on the event pipe, and records that it + * is trying to modify the poll descriptor set. + * -# The event handler is interrupted, and the same behaviour change as for + * libusb_close() takes effect, causing all event handling threads to become + * event waiters. + * -# The libusb_open() implementation takes its free ride to the events lock. + * -# Happy that it has successfully paused the events handler, libusb_open() + * releases the events lock. + * -# The event waiter threads are all woken up and compete to become event + * handlers again. The one that succeeds will obtain the list of poll + * descriptors again, which will include the addition of the new device. + * + * \subsection concl Closing remarks + * + * The above may seem a little complicated, but hopefully I have made it clear + * why such complications are necessary. Also, do not forget that this only + * applies to applications that take libusb's file descriptors and integrate + * them into their own polling loops. + * + * You may decide that it is OK for your multi-threaded application to ignore + * some of the rules and locks detailed above, because you don't think that + * two threads can ever be polling the descriptors at the same time. If that + * is the case, then that's good news for you because you don't have to worry. + * But be careful here; remember that the synchronous I/O functions do event + * handling internally. If you have one thread doing event handling in a loop + * (without implementing the rules and locking semantics documented above) + * and another trying to send a synchronous USB transfer, you will end up with + * two threads monitoring the same descriptors, and the above-described + * undesirable behaviour occurring. The solution is for your polling thread to + * play by the rules; the synchronous I/O functions do so, and this will result + * in them getting along in perfect harmony. + * + * If you do have a dedicated thread doing event handling, it is perfectly + * legal for it to take the event handling lock for long periods of time. Any + * synchronous I/O functions you call from other threads will transparently + * fall back to the "event waiters" mechanism detailed above. The only + * consideration that your event handling thread must apply is the one related + * to libusb_event_handling_ok(): you must call this before every poll(), and + * give up the events lock if instructed. + */ + +int usbi_io_init(struct libusb_context *ctx) +{ + int r; + + usbi_mutex_init(&ctx->flying_transfers_lock); + usbi_mutex_init(&ctx->events_lock); + usbi_mutex_init(&ctx->event_waiters_lock); + usbi_cond_init(&ctx->event_waiters_cond); + usbi_mutex_init(&ctx->event_data_lock); + usbi_tls_key_create(&ctx->event_handling_key); + list_init(&ctx->flying_transfers); + list_init(&ctx->ipollfds); + list_init(&ctx->hotplug_msgs); + list_init(&ctx->completed_transfers); + + /* FIXME should use an eventfd on kernels that support it */ + r = usbi_pipe(ctx->event_pipe); + if (r < 0) { + r = LIBUSB_ERROR_OTHER; + goto err; + } + + r = usbi_add_pollfd(ctx, ctx->event_pipe[0], POLLIN); + if (r < 0) + goto err_close_pipe; + +#ifdef USBI_TIMERFD_AVAILABLE + ctx->timerfd = timerfd_create(usbi_backend->get_timerfd_clockid(), + TFD_NONBLOCK); + if (ctx->timerfd >= 0) { + usbi_dbg("using timerfd for timeouts"); + r = usbi_add_pollfd(ctx, ctx->timerfd, POLLIN); + if (r < 0) + goto err_close_timerfd; + } else { + usbi_dbg("timerfd not available (code %d error %d)", ctx->timerfd, errno); + ctx->timerfd = -1; + } +#endif + + return 0; + +#ifdef USBI_TIMERFD_AVAILABLE +err_close_timerfd: + close(ctx->timerfd); + usbi_remove_pollfd(ctx, ctx->event_pipe[0]); +#endif +err_close_pipe: + usbi_close(ctx->event_pipe[0]); + usbi_close(ctx->event_pipe[1]); +err: + usbi_mutex_destroy(&ctx->flying_transfers_lock); + usbi_mutex_destroy(&ctx->events_lock); + usbi_mutex_destroy(&ctx->event_waiters_lock); + usbi_cond_destroy(&ctx->event_waiters_cond); + usbi_mutex_destroy(&ctx->event_data_lock); + usbi_tls_key_delete(ctx->event_handling_key); + return r; +} + +void usbi_io_exit(struct libusb_context *ctx) +{ + usbi_remove_pollfd(ctx, ctx->event_pipe[0]); + usbi_close(ctx->event_pipe[0]); + usbi_close(ctx->event_pipe[1]); +#ifdef USBI_TIMERFD_AVAILABLE + if (usbi_using_timerfd(ctx)) { + usbi_remove_pollfd(ctx, ctx->timerfd); + close(ctx->timerfd); + } +#endif + usbi_mutex_destroy(&ctx->flying_transfers_lock); + usbi_mutex_destroy(&ctx->events_lock); + usbi_mutex_destroy(&ctx->event_waiters_lock); + usbi_cond_destroy(&ctx->event_waiters_cond); + usbi_mutex_destroy(&ctx->event_data_lock); + usbi_tls_key_delete(ctx->event_handling_key); + if (ctx->pollfds) + free(ctx->pollfds); +} + +static int calculate_timeout(struct usbi_transfer *transfer) +{ + int r; + struct timespec current_time; + unsigned int timeout = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout; + + if (!timeout) + return 0; + + r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, ¤t_time); + if (r < 0) { + usbi_err(ITRANSFER_CTX(transfer), + "failed to read monotonic clock, errno=%d", errno); + return r; + } + + current_time.tv_sec += timeout / 1000; + current_time.tv_nsec += (timeout % 1000) * 1000000; + + while (current_time.tv_nsec >= 1000000000) { + current_time.tv_nsec -= 1000000000; + current_time.tv_sec++; + } + + TIMESPEC_TO_TIMEVAL(&transfer->timeout, ¤t_time); + return 0; +} + +/** \ingroup libusb_asyncio + * Allocate a libusb transfer with a specified number of isochronous packet + * descriptors. The returned transfer is pre-initialized for you. When the new + * transfer is no longer needed, it should be freed with + * libusb_free_transfer(). + * + * Transfers intended for non-isochronous endpoints (e.g. control, bulk, + * interrupt) should specify an iso_packets count of zero. + * + * For transfers intended for isochronous endpoints, specify an appropriate + * number of packet descriptors to be allocated as part of the transfer. + * The returned transfer is not specially initialized for isochronous I/O; + * you are still required to set the + * \ref libusb_transfer::num_iso_packets "num_iso_packets" and + * \ref libusb_transfer::type "type" fields accordingly. + * + * It is safe to allocate a transfer with some isochronous packets and then + * use it on a non-isochronous endpoint. If you do this, ensure that at time + * of submission, num_iso_packets is 0 and that type is set appropriately. + * + * \param iso_packets number of isochronous packet descriptors to allocate + * \returns a newly allocated transfer, or NULL on error + */ +DEFAULT_VISIBILITY +struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer( + int iso_packets) +{ + struct libusb_transfer *transfer; + size_t os_alloc_size = usbi_backend->transfer_priv_size; + size_t alloc_size = sizeof(struct usbi_transfer) + + sizeof(struct libusb_transfer) + + (sizeof(struct libusb_iso_packet_descriptor) * iso_packets) + + os_alloc_size; + struct usbi_transfer *itransfer = calloc(1, alloc_size); + if (!itransfer) + return NULL; + + itransfer->num_iso_packets = iso_packets; + usbi_mutex_init(&itransfer->lock); + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + usbi_dbg("transfer %p", transfer); + return transfer; +} + +/** \ingroup libusb_asyncio + * Free a transfer structure. This should be called for all transfers + * allocated with libusb_alloc_transfer(). + * + * If the \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER + * "LIBUSB_TRANSFER_FREE_BUFFER" flag is set and the transfer buffer is + * non-NULL, this function will also free the transfer buffer using the + * standard system memory allocator (e.g. free()). + * + * It is legal to call this function with a NULL transfer. In this case, + * the function will simply return safely. + * + * It is not legal to free an active transfer (one which has been submitted + * and has not yet completed). + * + * \param transfer the transfer to free + */ +void API_EXPORTED libusb_free_transfer(struct libusb_transfer *transfer) +{ + struct usbi_transfer *itransfer; + if (!transfer) + return; + + usbi_dbg("transfer %p", transfer); + if (transfer->flags & LIBUSB_TRANSFER_FREE_BUFFER && transfer->buffer) + free(transfer->buffer); + + itransfer = LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + usbi_mutex_destroy(&itransfer->lock); + free(itransfer); +} + +#ifdef USBI_TIMERFD_AVAILABLE +static int disarm_timerfd(struct libusb_context *ctx) +{ + const struct itimerspec disarm_timer = { { 0, 0 }, { 0, 0 } }; + int r; + + usbi_dbg(""); + r = timerfd_settime(ctx->timerfd, 0, &disarm_timer, NULL); + if (r < 0) + return LIBUSB_ERROR_OTHER; + else + return 0; +} + +/* iterates through the flying transfers, and rearms the timerfd based on the + * next upcoming timeout. + * must be called with flying_list locked. + * returns 0 on success or a LIBUSB_ERROR code on failure. + */ +static int arm_timerfd_for_next_timeout(struct libusb_context *ctx) +{ + struct usbi_transfer *transfer; + + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + struct timeval *cur_tv = &transfer->timeout; + + /* if we've reached transfers of infinite timeout, then we have no + * arming to do */ + if (!timerisset(cur_tv)) + goto disarm; + + /* act on first transfer that has not already been handled */ + if (!(transfer->timeout_flags & (USBI_TRANSFER_TIMEOUT_HANDLED | USBI_TRANSFER_OS_HANDLES_TIMEOUT))) { + int r; + const struct itimerspec it = { {0, 0}, + { cur_tv->tv_sec, cur_tv->tv_usec * 1000 } }; + usbi_dbg("next timeout originally %dms", USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout); + r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL); + if (r < 0) + return LIBUSB_ERROR_OTHER; + return 0; + } + } + +disarm: + return disarm_timerfd(ctx); +} +#else +static int arm_timerfd_for_next_timeout(struct libusb_context *ctx) +{ + UNUSED(ctx); + return 0; +} +#endif + +/* add a transfer to the (timeout-sorted) active transfers list. + * This function will return non 0 if fails to update the timer, + * in which case the transfer is *not* on the flying_transfers list. */ +static int add_to_flying_list(struct usbi_transfer *transfer) +{ + struct usbi_transfer *cur; + struct timeval *timeout = &transfer->timeout; + struct libusb_context *ctx = ITRANSFER_CTX(transfer); + int r; + int first = 1; + + r = calculate_timeout(transfer); + if (r) + return r; + + /* if we have no other flying transfers, start the list with this one */ + if (list_empty(&ctx->flying_transfers)) { + list_add(&transfer->list, &ctx->flying_transfers); + goto out; + } + + /* if we have infinite timeout, append to end of list */ + if (!timerisset(timeout)) { + list_add_tail(&transfer->list, &ctx->flying_transfers); + /* first is irrelevant in this case */ + goto out; + } + + /* otherwise, find appropriate place in list */ + list_for_each_entry(cur, &ctx->flying_transfers, list, struct usbi_transfer) { + /* find first timeout that occurs after the transfer in question */ + struct timeval *cur_tv = &cur->timeout; + + if (!timerisset(cur_tv) || (cur_tv->tv_sec > timeout->tv_sec) || + (cur_tv->tv_sec == timeout->tv_sec && + cur_tv->tv_usec > timeout->tv_usec)) { + list_add_tail(&transfer->list, &cur->list); + goto out; + } + first = 0; + } + /* first is 0 at this stage (list not empty) */ + + /* otherwise we need to be inserted at the end */ + list_add_tail(&transfer->list, &ctx->flying_transfers); +out: +#ifdef USBI_TIMERFD_AVAILABLE + if (first && usbi_using_timerfd(ctx) && timerisset(timeout)) { + /* if this transfer has the lowest timeout of all active transfers, + * rearm the timerfd with this transfer's timeout */ + const struct itimerspec it = { {0, 0}, + { timeout->tv_sec, timeout->tv_usec * 1000 } }; + usbi_dbg("arm timerfd for timeout in %dms (first in line)", + USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout); + r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL); + if (r < 0) { + usbi_warn(ctx, "failed to arm first timerfd (errno %d)", errno); + r = LIBUSB_ERROR_OTHER; + } + } +#else + UNUSED(first); +#endif + + if (r) + list_del(&transfer->list); + + return r; +} + +/* remove a transfer from the active transfers list. + * This function will *always* remove the transfer from the + * flying_transfers list. It will return a LIBUSB_ERROR code + * if it fails to update the timer for the next timeout. */ +static int remove_from_flying_list(struct usbi_transfer *transfer) +{ + struct libusb_context *ctx = ITRANSFER_CTX(transfer); + int rearm_timerfd; + int r = 0; + + usbi_mutex_lock(&ctx->flying_transfers_lock); + rearm_timerfd = (timerisset(&transfer->timeout) && + list_first_entry(&ctx->flying_transfers, struct usbi_transfer, list) == transfer); + list_del(&transfer->list); + if (usbi_using_timerfd(ctx) && rearm_timerfd) + r = arm_timerfd_for_next_timeout(ctx); + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + return r; +} + +/** \ingroup libusb_asyncio + * Submit a transfer. This function will fire off the USB transfer and then + * return immediately. + * + * \param transfer the transfer to submit + * \returns 0 on success + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_BUSY if the transfer has already been submitted. + * \returns LIBUSB_ERROR_NOT_SUPPORTED if the transfer flags are not supported + * by the operating system. + * \returns LIBUSB_ERROR_INVALID_PARAM if the transfer size is larger than + * the operating system and/or hardware can support + * \returns another LIBUSB_ERROR code on other failure + */ +int API_EXPORTED libusb_submit_transfer(struct libusb_transfer *transfer) +{ + struct usbi_transfer *itransfer = + LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + struct libusb_context *ctx = TRANSFER_CTX(transfer); + int r; + + usbi_dbg("transfer %p", transfer); + + /* + * Important note on locking, this function takes / releases locks + * in the following order: + * take flying_transfers_lock + * take itransfer->lock + * clear transfer + * add to flying_transfers list + * release flying_transfers_lock + * submit transfer + * release itransfer->lock + * if submit failed: + * take flying_transfers_lock + * remove from flying_transfers list + * release flying_transfers_lock + * + * Note that it takes locks in the order a-b and then releases them + * in the same order a-b. This is somewhat unusual but not wrong, + * release order is not important as long as *all* locks are released + * before re-acquiring any locks. + * + * This means that the ordering of first releasing itransfer->lock + * and then re-acquiring the flying_transfers_list on error is + * important and must not be changed! + * + * This is done this way because when we take both locks we must always + * take flying_transfers_lock first to avoid ab-ba style deadlocks with + * the timeout handling and usbi_handle_disconnect paths. + * + * And we cannot release itransfer->lock before the submission is + * complete otherwise timeout handling for transfers with short + * timeouts may run before submission. + */ + usbi_mutex_lock(&ctx->flying_transfers_lock); + usbi_mutex_lock(&itransfer->lock); + if (itransfer->state_flags & USBI_TRANSFER_IN_FLIGHT) { + usbi_mutex_unlock(&ctx->flying_transfers_lock); + usbi_mutex_unlock(&itransfer->lock); + return LIBUSB_ERROR_BUSY; + } + itransfer->transferred = 0; + itransfer->state_flags = 0; + itransfer->timeout_flags = 0; + r = add_to_flying_list(itransfer); + if (r) { + usbi_mutex_unlock(&ctx->flying_transfers_lock); + usbi_mutex_unlock(&itransfer->lock); + return r; + } + /* + * We must release the flying transfers lock here, because with + * some backends the submit_transfer method is synchroneous. + */ + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + r = usbi_backend->submit_transfer(itransfer); + if (r == LIBUSB_SUCCESS) { + itransfer->state_flags |= USBI_TRANSFER_IN_FLIGHT; + /* keep a reference to this device */ + libusb_ref_device(transfer->dev_handle->dev); + } + usbi_mutex_unlock(&itransfer->lock); + + if (r != LIBUSB_SUCCESS) + remove_from_flying_list(itransfer); + + return r; +} + +/** \ingroup libusb_asyncio + * Asynchronously cancel a previously submitted transfer. + * This function returns immediately, but this does not indicate cancellation + * is complete. Your callback function will be invoked at some later time + * with a transfer status of + * \ref libusb_transfer_status::LIBUSB_TRANSFER_CANCELLED + * "LIBUSB_TRANSFER_CANCELLED." + * + * \param transfer the transfer to cancel + * \returns 0 on success + * \returns LIBUSB_ERROR_NOT_FOUND if the transfer is not in progress, + * already complete, or already cancelled. + * \returns a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_cancel_transfer(struct libusb_transfer *transfer) +{ + struct usbi_transfer *itransfer = + LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + int r; + + usbi_dbg("transfer %p", transfer ); + usbi_mutex_lock(&itransfer->lock); + if (!(itransfer->state_flags & USBI_TRANSFER_IN_FLIGHT) + || (itransfer->state_flags & USBI_TRANSFER_CANCELLING)) { + r = LIBUSB_ERROR_NOT_FOUND; + goto out; + } + r = usbi_backend->cancel_transfer(itransfer); + if (r < 0) { + if (r != LIBUSB_ERROR_NOT_FOUND && + r != LIBUSB_ERROR_NO_DEVICE) + usbi_err(TRANSFER_CTX(transfer), + "cancel transfer failed error %d", r); + else + usbi_dbg("cancel transfer failed error %d", r); + + if (r == LIBUSB_ERROR_NO_DEVICE) + itransfer->state_flags |= USBI_TRANSFER_DEVICE_DISAPPEARED; + } + + itransfer->state_flags |= USBI_TRANSFER_CANCELLING; + +out: + usbi_mutex_unlock(&itransfer->lock); + return r; +} + +/** \ingroup libusb_asyncio + * Set a transfers bulk stream id. Note users are advised to use + * libusb_fill_bulk_stream_transfer() instead of calling this function + * directly. + * + * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 + * + * \param transfer the transfer to set the stream id for + * \param stream_id the stream id to set + * \see libusb_alloc_streams() + */ +void API_EXPORTED libusb_transfer_set_stream_id( + struct libusb_transfer *transfer, uint32_t stream_id) +{ + struct usbi_transfer *itransfer = + LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + + itransfer->stream_id = stream_id; +} + +/** \ingroup libusb_asyncio + * Get a transfers bulk stream id. + * + * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 + * + * \param transfer the transfer to get the stream id for + * \returns the stream id for the transfer + */ +uint32_t API_EXPORTED libusb_transfer_get_stream_id( + struct libusb_transfer *transfer) +{ + struct usbi_transfer *itransfer = + LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); + + return itransfer->stream_id; +} + +/* Handle completion of a transfer (completion might be an error condition). + * This will invoke the user-supplied callback function, which may end up + * freeing the transfer. Therefore you cannot use the transfer structure + * after calling this function, and you should free all backend-specific + * data before calling it. + * Do not call this function with the usbi_transfer lock held. User-specified + * callback functions may attempt to directly resubmit the transfer, which + * will attempt to take the lock. */ +int usbi_handle_transfer_completion(struct usbi_transfer *itransfer, + enum libusb_transfer_status status) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_device_handle *dev_handle = transfer->dev_handle; + uint8_t flags; + int r; + + r = remove_from_flying_list(itransfer); + if (r < 0) + usbi_err(ITRANSFER_CTX(itransfer), "failed to set timer for next timeout, errno=%d", errno); + + usbi_mutex_lock(&itransfer->lock); + itransfer->state_flags &= ~USBI_TRANSFER_IN_FLIGHT; + usbi_mutex_unlock(&itransfer->lock); + + if (status == LIBUSB_TRANSFER_COMPLETED + && transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) { + int rqlen = transfer->length; + if (transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL) + rqlen -= LIBUSB_CONTROL_SETUP_SIZE; + if (rqlen != itransfer->transferred) { + usbi_dbg("interpreting short transfer as error"); + status = LIBUSB_TRANSFER_ERROR; + } + } + + flags = transfer->flags; + transfer->status = status; + transfer->actual_length = itransfer->transferred; + usbi_dbg("transfer %p has callback %p", transfer, transfer->callback); + if (transfer->callback) + transfer->callback(transfer); + /* transfer might have been freed by the above call, do not use from + * this point. */ + if (flags & LIBUSB_TRANSFER_FREE_TRANSFER) + libusb_free_transfer(transfer); + libusb_unref_device(dev_handle->dev); + return r; +} + +/* Similar to usbi_handle_transfer_completion() but exclusively for transfers + * that were asynchronously cancelled. The same concerns w.r.t. freeing of + * transfers exist here. + * Do not call this function with the usbi_transfer lock held. User-specified + * callback functions may attempt to directly resubmit the transfer, which + * will attempt to take the lock. */ +int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer) +{ + struct libusb_context *ctx = ITRANSFER_CTX(transfer); + uint8_t timed_out; + + usbi_mutex_lock(&ctx->flying_transfers_lock); + timed_out = transfer->timeout_flags & USBI_TRANSFER_TIMED_OUT; + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + /* if the URB was cancelled due to timeout, report timeout to the user */ + if (timed_out) { + usbi_dbg("detected timeout cancellation"); + return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_TIMED_OUT); + } + + /* otherwise its a normal async cancel */ + return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_CANCELLED); +} + +/* Add a completed transfer to the completed_transfers list of the + * context and signal the event. The backend's handle_transfer_completion() + * function will be called the next time an event handler runs. */ +void usbi_signal_transfer_completion(struct usbi_transfer *transfer) +{ + struct libusb_context *ctx = ITRANSFER_CTX(transfer); + int pending_events; + + usbi_mutex_lock(&ctx->event_data_lock); + pending_events = usbi_pending_events(ctx); + list_add_tail(&transfer->completed_list, &ctx->completed_transfers); + if (!pending_events) + usbi_signal_event(ctx); + usbi_mutex_unlock(&ctx->event_data_lock); +} + +/** \ingroup libusb_poll + * Attempt to acquire the event handling lock. This lock is used to ensure that + * only one thread is monitoring libusb event sources at any one time. + * + * You only need to use this lock if you are developing an application + * which calls poll() or select() on libusb's file descriptors directly. + * If you stick to libusb's event handling loop functions (e.g. + * libusb_handle_events()) then you do not need to be concerned with this + * locking. + * + * While holding this lock, you are trusted to actually be handling events. + * If you are no longer handling events, you must call libusb_unlock_events() + * as soon as possible. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 0 if the lock was obtained successfully + * \returns 1 if the lock was not obtained (i.e. another thread holds the lock) + * \ref libusb_mtasync + */ +int API_EXPORTED libusb_try_lock_events(libusb_context *ctx) +{ + int r; + unsigned int ru; + USBI_GET_CONTEXT(ctx); + + /* is someone else waiting to close a device? if so, don't let this thread + * start event handling */ + usbi_mutex_lock(&ctx->event_data_lock); + ru = ctx->device_close; + usbi_mutex_unlock(&ctx->event_data_lock); + if (ru) { + usbi_dbg("someone else is closing a device"); + return 1; + } + + r = usbi_mutex_trylock(&ctx->events_lock); + if (r) + return 1; + + ctx->event_handler_active = 1; + return 0; +} + +/** \ingroup libusb_poll + * Acquire the event handling lock, blocking until successful acquisition if + * it is contended. This lock is used to ensure that only one thread is + * monitoring libusb event sources at any one time. + * + * You only need to use this lock if you are developing an application + * which calls poll() or select() on libusb's file descriptors directly. + * If you stick to libusb's event handling loop functions (e.g. + * libusb_handle_events()) then you do not need to be concerned with this + * locking. + * + * While holding this lock, you are trusted to actually be handling events. + * If you are no longer handling events, you must call libusb_unlock_events() + * as soon as possible. + * + * \param ctx the context to operate on, or NULL for the default context + * \ref libusb_mtasync + */ +void API_EXPORTED libusb_lock_events(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + usbi_mutex_lock(&ctx->events_lock); + ctx->event_handler_active = 1; +} + +/** \ingroup libusb_poll + * Release the lock previously acquired with libusb_try_lock_events() or + * libusb_lock_events(). Releasing this lock will wake up any threads blocked + * on libusb_wait_for_event(). + * + * \param ctx the context to operate on, or NULL for the default context + * \ref libusb_mtasync + */ +void API_EXPORTED libusb_unlock_events(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + ctx->event_handler_active = 0; + usbi_mutex_unlock(&ctx->events_lock); + + /* FIXME: perhaps we should be a bit more efficient by not broadcasting + * the availability of the events lock when we are modifying pollfds + * (check ctx->device_close)? */ + usbi_mutex_lock(&ctx->event_waiters_lock); + usbi_cond_broadcast(&ctx->event_waiters_cond); + usbi_mutex_unlock(&ctx->event_waiters_lock); +} + +/** \ingroup libusb_poll + * Determine if it is still OK for this thread to be doing event handling. + * + * Sometimes, libusb needs to temporarily pause all event handlers, and this + * is the function you should use before polling file descriptors to see if + * this is the case. + * + * If this function instructs your thread to give up the events lock, you + * should just continue the usual logic that is documented in \ref libusb_mtasync. + * On the next iteration, your thread will fail to obtain the events lock, + * and will hence become an event waiter. + * + * This function should be called while the events lock is held: you don't + * need to worry about the results of this function if your thread is not + * the current event handler. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 1 if event handling can start or continue + * \returns 0 if this thread must give up the events lock + * \ref fullstory "Multi-threaded I/O: the full story" + */ +int API_EXPORTED libusb_event_handling_ok(libusb_context *ctx) +{ + unsigned int r; + USBI_GET_CONTEXT(ctx); + + /* is someone else waiting to close a device? if so, don't let this thread + * continue event handling */ + usbi_mutex_lock(&ctx->event_data_lock); + r = ctx->device_close; + usbi_mutex_unlock(&ctx->event_data_lock); + if (r) { + usbi_dbg("someone else is closing a device"); + return 0; + } + + return 1; +} + + +/** \ingroup libusb_poll + * Determine if an active thread is handling events (i.e. if anyone is holding + * the event handling lock). + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 1 if a thread is handling events + * \returns 0 if there are no threads currently handling events + * \ref libusb_mtasync + */ +int API_EXPORTED libusb_event_handler_active(libusb_context *ctx) +{ + unsigned int r; + USBI_GET_CONTEXT(ctx); + + /* is someone else waiting to close a device? if so, don't let this thread + * start event handling -- indicate that event handling is happening */ + usbi_mutex_lock(&ctx->event_data_lock); + r = ctx->device_close; + usbi_mutex_unlock(&ctx->event_data_lock); + if (r) { + usbi_dbg("someone else is closing a device"); + return 1; + } + + return ctx->event_handler_active; +} + +/** \ingroup libusb_poll + * Interrupt any active thread that is handling events. This is mainly useful + * for interrupting a dedicated event handling thread when an application + * wishes to call libusb_exit(). + * + * Since version 1.0.21, \ref LIBUSB_API_VERSION >= 0x01000105 + * + * \param ctx the context to operate on, or NULL for the default context + * \ref libusb_mtasync + */ +void API_EXPORTED libusb_interrupt_event_handler(libusb_context *ctx) +{ + int pending_events; + USBI_GET_CONTEXT(ctx); + + usbi_dbg(""); + usbi_mutex_lock(&ctx->event_data_lock); + + pending_events = usbi_pending_events(ctx); + ctx->event_flags |= USBI_EVENT_USER_INTERRUPT; + if (!pending_events) + usbi_signal_event(ctx); + + usbi_mutex_unlock(&ctx->event_data_lock); +} + +/** \ingroup libusb_poll + * Acquire the event waiters lock. This lock is designed to be obtained under + * the situation where you want to be aware when events are completed, but + * some other thread is event handling so calling libusb_handle_events() is not + * allowed. + * + * You then obtain this lock, re-check that another thread is still handling + * events, then call libusb_wait_for_event(). + * + * You only need to use this lock if you are developing an application + * which calls poll() or select() on libusb's file descriptors directly, + * and may potentially be handling events from 2 threads simultaenously. + * If you stick to libusb's event handling loop functions (e.g. + * libusb_handle_events()) then you do not need to be concerned with this + * locking. + * + * \param ctx the context to operate on, or NULL for the default context + * \ref libusb_mtasync + */ +void API_EXPORTED libusb_lock_event_waiters(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + usbi_mutex_lock(&ctx->event_waiters_lock); +} + +/** \ingroup libusb_poll + * Release the event waiters lock. + * \param ctx the context to operate on, or NULL for the default context + * \ref libusb_mtasync + */ +void API_EXPORTED libusb_unlock_event_waiters(libusb_context *ctx) +{ + USBI_GET_CONTEXT(ctx); + usbi_mutex_unlock(&ctx->event_waiters_lock); +} + +/** \ingroup libusb_poll + * Wait for another thread to signal completion of an event. Must be called + * with the event waiters lock held, see libusb_lock_event_waiters(). + * + * This function will block until any of the following conditions are met: + * -# The timeout expires + * -# A transfer completes + * -# A thread releases the event handling lock through libusb_unlock_events() + * + * Condition 1 is obvious. Condition 2 unblocks your thread after + * the callback for the transfer has completed. Condition 3 is important + * because it means that the thread that was previously handling events is no + * longer doing so, so if any events are to complete, another thread needs to + * step up and start event handling. + * + * This function releases the event waiters lock before putting your thread + * to sleep, and reacquires the lock as it is being woken up. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv maximum timeout for this blocking function. A NULL value + * indicates unlimited timeout. + * \returns 0 after a transfer completes or another thread stops event handling + * \returns 1 if the timeout expired + * \ref libusb_mtasync + */ +int API_EXPORTED libusb_wait_for_event(libusb_context *ctx, struct timeval *tv) +{ + int r; + + USBI_GET_CONTEXT(ctx); + if (tv == NULL) { + usbi_cond_wait(&ctx->event_waiters_cond, &ctx->event_waiters_lock); + return 0; + } + + r = usbi_cond_timedwait(&ctx->event_waiters_cond, + &ctx->event_waiters_lock, tv); + + if (r < 0) + return r; + else + return (r == ETIMEDOUT); +} + +static void handle_timeout(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + int r; + + itransfer->timeout_flags |= USBI_TRANSFER_TIMEOUT_HANDLED; + usbi_dbg("will cancel transfer"); + r = libusb_cancel_transfer(transfer); + if (r == LIBUSB_SUCCESS) + itransfer->timeout_flags |= USBI_TRANSFER_TIMED_OUT; + else + usbi_warn(TRANSFER_CTX(transfer), + "async cancel failed %d errno=%d", r, errno); +} + +static int handle_timeouts_locked(struct libusb_context *ctx) +{ + int r; + struct timespec systime_ts; + struct timeval systime; + struct usbi_transfer *transfer; + + if (list_empty(&ctx->flying_transfers)) + return 0; + + /* get current time */ + r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &systime_ts); + if (r < 0) + return r; + + TIMESPEC_TO_TIMEVAL(&systime, &systime_ts); + + /* iterate through flying transfers list, finding all transfers that + * have expired timeouts */ + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + struct timeval *cur_tv = &transfer->timeout; + + /* if we've reached transfers of infinite timeout, we're all done */ + if (!timerisset(cur_tv)) + return 0; + + /* ignore timeouts we've already handled */ + if (transfer->timeout_flags & (USBI_TRANSFER_TIMEOUT_HANDLED | USBI_TRANSFER_OS_HANDLES_TIMEOUT)) + continue; + + /* if transfer has non-expired timeout, nothing more to do */ + if ((cur_tv->tv_sec > systime.tv_sec) || + (cur_tv->tv_sec == systime.tv_sec && + cur_tv->tv_usec > systime.tv_usec)) + return 0; + + /* otherwise, we've got an expired timeout to handle */ + handle_timeout(transfer); + } + return 0; +} + +static int handle_timeouts(struct libusb_context *ctx) +{ + int r; + USBI_GET_CONTEXT(ctx); + usbi_mutex_lock(&ctx->flying_transfers_lock); + r = handle_timeouts_locked(ctx); + usbi_mutex_unlock(&ctx->flying_transfers_lock); + return r; +} + +#ifdef USBI_TIMERFD_AVAILABLE +static int handle_timerfd_trigger(struct libusb_context *ctx) +{ + int r; + + usbi_mutex_lock(&ctx->flying_transfers_lock); + + /* process the timeout that just happened */ + r = handle_timeouts_locked(ctx); + if (r < 0) + goto out; + + /* arm for next timeout*/ + r = arm_timerfd_for_next_timeout(ctx); + +out: + usbi_mutex_unlock(&ctx->flying_transfers_lock); + return r; +} +#endif + +/* do the actual event handling. assumes that no other thread is concurrently + * doing the same thing. */ +static int handle_events(struct libusb_context *ctx, struct timeval *tv) +{ + int r; + struct usbi_pollfd *ipollfd; + POLL_NFDS_TYPE nfds = 0; + POLL_NFDS_TYPE internal_nfds; + struct pollfd *fds = NULL; + int i = -1; + int timeout_ms; + int special_event; + + /* prevent attempts to recursively handle events (e.g. calling into + * libusb_handle_events() from within a hotplug or transfer callback) */ + if (usbi_handling_events(ctx)) + return LIBUSB_ERROR_BUSY; + usbi_start_event_handling(ctx); + + /* there are certain fds that libusb uses internally, currently: + * + * 1) event pipe + * 2) timerfd + * + * the backend will never need to attempt to handle events on these fds, so + * we determine how many fds are in use internally for this context and when + * handle_events() is called in the backend, the pollfd list and count will + * be adjusted to skip over these internal fds */ + if (usbi_using_timerfd(ctx)) + internal_nfds = 2; + else + internal_nfds = 1; + + /* only reallocate the poll fds when the list of poll fds has been modified + * since the last poll, otherwise reuse them to save the additional overhead */ + usbi_mutex_lock(&ctx->event_data_lock); + if (ctx->event_flags & USBI_EVENT_POLLFDS_MODIFIED) { + usbi_dbg("poll fds modified, reallocating"); + + if (ctx->pollfds) { + free(ctx->pollfds); + ctx->pollfds = NULL; + } + + /* sanity check - it is invalid for a context to have fewer than the + * required internal fds (memory corruption?) */ + assert(ctx->pollfds_cnt >= internal_nfds); + + ctx->pollfds = calloc(ctx->pollfds_cnt, sizeof(*ctx->pollfds)); + if (!ctx->pollfds) { + usbi_mutex_unlock(&ctx->event_data_lock); + r = LIBUSB_ERROR_NO_MEM; + goto done; + } + + list_for_each_entry(ipollfd, &ctx->ipollfds, list, struct usbi_pollfd) { + struct libusb_pollfd *pollfd = &ipollfd->pollfd; + i++; + ctx->pollfds[i].fd = pollfd->fd; + ctx->pollfds[i].events = pollfd->events; + } + + /* reset the flag now that we have the updated list */ + ctx->event_flags &= ~USBI_EVENT_POLLFDS_MODIFIED; + + /* if no further pending events, clear the event pipe so that we do + * not immediately return from poll */ + if (!usbi_pending_events(ctx)) + usbi_clear_event(ctx); + } + fds = ctx->pollfds; + nfds = ctx->pollfds_cnt; + usbi_mutex_unlock(&ctx->event_data_lock); + + timeout_ms = (int)(tv->tv_sec * 1000) + (tv->tv_usec / 1000); + + /* round up to next millisecond */ + if (tv->tv_usec % 1000) + timeout_ms++; + +redo_poll: + usbi_dbg("poll() %d fds with timeout in %dms", nfds, timeout_ms); + r = usbi_poll(fds, nfds, timeout_ms); + usbi_dbg("poll() returned %d", r); + if (r == 0) { + r = handle_timeouts(ctx); + goto done; + } + else if (r == -1 && errno == EINTR) { + r = LIBUSB_ERROR_INTERRUPTED; + goto done; + } + else if (r < 0) { + usbi_err(ctx, "poll failed %d err=%d", r, errno); + r = LIBUSB_ERROR_IO; + goto done; + } + + special_event = 0; + + /* fds[0] is always the event pipe */ + if (fds[0].revents) { + libusb_hotplug_message *message = NULL; + struct usbi_transfer *itransfer; + int ret = 0; + + usbi_dbg("caught a fish on the event pipe"); + + /* take the the event data lock while processing events */ + usbi_mutex_lock(&ctx->event_data_lock); + + /* check if someone added a new poll fd */ + if (ctx->event_flags & USBI_EVENT_POLLFDS_MODIFIED) + usbi_dbg("someone updated the poll fds"); + + if (ctx->event_flags & USBI_EVENT_USER_INTERRUPT) { + usbi_dbg("someone purposely interrupted"); + ctx->event_flags &= ~USBI_EVENT_USER_INTERRUPT; + } + + /* check if someone is closing a device */ + if (ctx->device_close) + usbi_dbg("someone is closing a device"); + + /* check for any pending hotplug messages */ + if (!list_empty(&ctx->hotplug_msgs)) { + usbi_dbg("hotplug message received"); + special_event = 1; + message = list_first_entry(&ctx->hotplug_msgs, libusb_hotplug_message, list); + list_del(&message->list); + } + + /* complete any pending transfers */ + while (ret == 0 && !list_empty(&ctx->completed_transfers)) { + itransfer = list_first_entry(&ctx->completed_transfers, struct usbi_transfer, completed_list); + list_del(&itransfer->completed_list); + usbi_mutex_unlock(&ctx->event_data_lock); + ret = usbi_backend->handle_transfer_completion(itransfer); + if (ret) + usbi_err(ctx, "backend handle_transfer_completion failed with error %d", ret); + usbi_mutex_lock(&ctx->event_data_lock); + } + + /* if no further pending events, clear the event pipe */ + if (!usbi_pending_events(ctx)) + usbi_clear_event(ctx); + + usbi_mutex_unlock(&ctx->event_data_lock); + + /* process the hotplug message, if any */ + if (message) { + usbi_hotplug_match(ctx, message->device, message->event); + + /* the device left, dereference the device */ + if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == message->event) + libusb_unref_device(message->device); + + free(message); + } + + if (ret) { + /* return error code */ + r = ret; + goto done; + } + + if (0 == --r) + goto handled; + } + +#ifdef USBI_TIMERFD_AVAILABLE + /* on timerfd configurations, fds[1] is the timerfd */ + if (usbi_using_timerfd(ctx) && fds[1].revents) { + /* timerfd indicates that a timeout has expired */ + int ret; + usbi_dbg("timerfd triggered"); + special_event = 1; + + ret = handle_timerfd_trigger(ctx); + if (ret < 0) { + /* return error code */ + r = ret; + goto done; + } + + if (0 == --r) + goto handled; + } +#endif + + r = usbi_backend->handle_events(ctx, fds + internal_nfds, nfds - internal_nfds, r); + if (r) + usbi_err(ctx, "backend handle_events failed with error %d", r); + +handled: + if (r == 0 && special_event) { + timeout_ms = 0; + goto redo_poll; + } + +done: + usbi_end_event_handling(ctx); + return r; +} + +/* returns the smallest of: + * 1. timeout of next URB + * 2. user-supplied timeout + * returns 1 if there is an already-expired timeout, otherwise returns 0 + * and populates out + */ +static int get_next_timeout(libusb_context *ctx, struct timeval *tv, + struct timeval *out) +{ + struct timeval timeout; + int r = libusb_get_next_timeout(ctx, &timeout); + if (r) { + /* timeout already expired? */ + if (!timerisset(&timeout)) + return 1; + + /* choose the smallest of next URB timeout or user specified timeout */ + if (timercmp(&timeout, tv, <)) + *out = timeout; + else + *out = *tv; + } else { + *out = *tv; + } + return 0; +} + +/** \ingroup libusb_poll + * Handle any pending events. + * + * libusb determines "pending events" by checking if any timeouts have expired + * and by checking the set of file descriptors for activity. + * + * If a zero timeval is passed, this function will handle any already-pending + * events and then immediately return in non-blocking style. + * + * If a non-zero timeval is passed and no events are currently pending, this + * function will block waiting for events to handle up until the specified + * timeout. If an event arrives or a signal is raised, this function will + * return early. + * + * If the parameter completed is not NULL then after obtaining the event + * handling lock this function will return immediately if the integer + * pointed to is not 0. This allows for race free waiting for the completion + * of a specific transfer. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv the maximum time to block waiting for events, or an all zero + * timeval struct for non-blocking mode + * \param completed pointer to completion integer to check, or NULL + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \ref libusb_mtasync + */ +int API_EXPORTED libusb_handle_events_timeout_completed(libusb_context *ctx, + struct timeval *tv, int *completed) +{ + int r; + struct timeval poll_timeout; + + USBI_GET_CONTEXT(ctx); + r = get_next_timeout(ctx, tv, &poll_timeout); + if (r) { + /* timeout already expired */ + return handle_timeouts(ctx); + } + +retry: + if (libusb_try_lock_events(ctx) == 0) { + if (completed == NULL || !*completed) { + /* we obtained the event lock: do our own event handling */ + usbi_dbg("doing our own event handling"); + r = handle_events(ctx, &poll_timeout); + } + libusb_unlock_events(ctx); + return r; + } + + /* another thread is doing event handling. wait for thread events that + * notify event completion. */ + libusb_lock_event_waiters(ctx); + + if (completed && *completed) + goto already_done; + + if (!libusb_event_handler_active(ctx)) { + /* we hit a race: whoever was event handling earlier finished in the + * time it took us to reach this point. try the cycle again. */ + libusb_unlock_event_waiters(ctx); + usbi_dbg("event handler was active but went away, retrying"); + goto retry; + } + + usbi_dbg("another thread is doing event handling"); + r = libusb_wait_for_event(ctx, &poll_timeout); + +already_done: + libusb_unlock_event_waiters(ctx); + + if (r < 0) + return r; + else if (r == 1) + return handle_timeouts(ctx); + else + return 0; +} + +/** \ingroup libusb_poll + * Handle any pending events + * + * Like libusb_handle_events_timeout_completed(), but without the completed + * parameter, calling this function is equivalent to calling + * libusb_handle_events_timeout_completed() with a NULL completed parameter. + * + * This function is kept primarily for backwards compatibility. + * All new code should call libusb_handle_events_completed() or + * libusb_handle_events_timeout_completed() to avoid race conditions. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv the maximum time to block waiting for events, or an all zero + * timeval struct for non-blocking mode + * \returns 0 on success, or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_handle_events_timeout(libusb_context *ctx, + struct timeval *tv) +{ + return libusb_handle_events_timeout_completed(ctx, tv, NULL); +} + +/** \ingroup libusb_poll + * Handle any pending events in blocking mode. There is currently a timeout + * hardcoded at 60 seconds but we plan to make it unlimited in future. For + * finer control over whether this function is blocking or non-blocking, or + * for control over the timeout, use libusb_handle_events_timeout_completed() + * instead. + * + * This function is kept primarily for backwards compatibility. + * All new code should call libusb_handle_events_completed() or + * libusb_handle_events_timeout_completed() to avoid race conditions. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 0 on success, or a LIBUSB_ERROR code on failure + */ +int API_EXPORTED libusb_handle_events(libusb_context *ctx) +{ + struct timeval tv; + tv.tv_sec = 60; + tv.tv_usec = 0; + return libusb_handle_events_timeout_completed(ctx, &tv, NULL); +} + +/** \ingroup libusb_poll + * Handle any pending events in blocking mode. + * + * Like libusb_handle_events(), with the addition of a completed parameter + * to allow for race free waiting for the completion of a specific transfer. + * + * See libusb_handle_events_timeout_completed() for details on the completed + * parameter. + * + * \param ctx the context to operate on, or NULL for the default context + * \param completed pointer to completion integer to check, or NULL + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \ref libusb_mtasync + */ +int API_EXPORTED libusb_handle_events_completed(libusb_context *ctx, + int *completed) +{ + struct timeval tv; + tv.tv_sec = 60; + tv.tv_usec = 0; + return libusb_handle_events_timeout_completed(ctx, &tv, completed); +} + +/** \ingroup libusb_poll + * Handle any pending events by polling file descriptors, without checking if + * any other threads are already doing so. Must be called with the event lock + * held, see libusb_lock_events(). + * + * This function is designed to be called under the situation where you have + * taken the event lock and are calling poll()/select() directly on libusb's + * file descriptors (as opposed to using libusb_handle_events() or similar). + * You detect events on libusb's descriptors, so you then call this function + * with a zero timeout value (while still holding the event lock). + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv the maximum time to block waiting for events, or zero for + * non-blocking mode + * \returns 0 on success, or a LIBUSB_ERROR code on failure + * \ref libusb_mtasync + */ +int API_EXPORTED libusb_handle_events_locked(libusb_context *ctx, + struct timeval *tv) +{ + int r; + struct timeval poll_timeout; + + USBI_GET_CONTEXT(ctx); + r = get_next_timeout(ctx, tv, &poll_timeout); + if (r) { + /* timeout already expired */ + return handle_timeouts(ctx); + } + + return handle_events(ctx, &poll_timeout); +} + +/** \ingroup libusb_poll + * Determines whether your application must apply special timing considerations + * when monitoring libusb's file descriptors. + * + * This function is only useful for applications which retrieve and poll + * libusb's file descriptors in their own main loop (\ref libusb_pollmain). + * + * Ordinarily, libusb's event handler needs to be called into at specific + * moments in time (in addition to times when there is activity on the file + * descriptor set). The usual approach is to use libusb_get_next_timeout() + * to learn about when the next timeout occurs, and to adjust your + * poll()/select() timeout accordingly so that you can make a call into the + * library at that time. + * + * Some platforms supported by libusb do not come with this baggage - any + * events relevant to timing will be represented by activity on the file + * descriptor set, and libusb_get_next_timeout() will always return 0. + * This function allows you to detect whether you are running on such a + * platform. + * + * Since v1.0.5. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns 0 if you must call into libusb at times determined by + * libusb_get_next_timeout(), or 1 if all timeout events are handled internally + * or through regular activity on the file descriptors. + * \ref libusb_pollmain "Polling libusb file descriptors for event handling" + */ +int API_EXPORTED libusb_pollfds_handle_timeouts(libusb_context *ctx) +{ +#if defined(USBI_TIMERFD_AVAILABLE) + USBI_GET_CONTEXT(ctx); + return usbi_using_timerfd(ctx); +#else + UNUSED(ctx); + return 0; +#endif +} + +/** \ingroup libusb_poll + * Determine the next internal timeout that libusb needs to handle. You only + * need to use this function if you are calling poll() or select() or similar + * on libusb's file descriptors yourself - you do not need to use it if you + * are calling libusb_handle_events() or a variant directly. + * + * You should call this function in your main loop in order to determine how + * long to wait for select() or poll() to return results. libusb needs to be + * called into at this timeout, so you should use it as an upper bound on + * your select() or poll() call. + * + * When the timeout has expired, call into libusb_handle_events_timeout() + * (perhaps in non-blocking mode) so that libusb can handle the timeout. + * + * This function may return 1 (success) and an all-zero timeval. If this is + * the case, it indicates that libusb has a timeout that has already expired + * so you should call libusb_handle_events_timeout() or similar immediately. + * A return code of 0 indicates that there are no pending timeouts. + * + * On some platforms, this function will always returns 0 (no pending + * timeouts). See \ref polltime. + * + * \param ctx the context to operate on, or NULL for the default context + * \param tv output location for a relative time against the current + * clock in which libusb must be called into in order to process timeout events + * \returns 0 if there are no pending timeouts, 1 if a timeout was returned, + * or LIBUSB_ERROR_OTHER on failure + */ +int API_EXPORTED libusb_get_next_timeout(libusb_context *ctx, + struct timeval *tv) +{ + struct usbi_transfer *transfer; + struct timespec cur_ts; + struct timeval cur_tv; + struct timeval next_timeout = { 0, 0 }; + int r; + + USBI_GET_CONTEXT(ctx); + if (usbi_using_timerfd(ctx)) + return 0; + + usbi_mutex_lock(&ctx->flying_transfers_lock); + if (list_empty(&ctx->flying_transfers)) { + usbi_mutex_unlock(&ctx->flying_transfers_lock); + usbi_dbg("no URBs, no timeout!"); + return 0; + } + + /* find next transfer which hasn't already been processed as timed out */ + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + if (transfer->timeout_flags & (USBI_TRANSFER_TIMEOUT_HANDLED | USBI_TRANSFER_OS_HANDLES_TIMEOUT)) + continue; + + /* if we've reached transfers of infinte timeout, we're done looking */ + if (!timerisset(&transfer->timeout)) + break; + + next_timeout = transfer->timeout; + break; + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (!timerisset(&next_timeout)) { + usbi_dbg("no URB with timeout or all handled by OS; no timeout!"); + return 0; + } + + r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &cur_ts); + if (r < 0) { + usbi_err(ctx, "failed to read monotonic clock, errno=%d", errno); + return 0; + } + TIMESPEC_TO_TIMEVAL(&cur_tv, &cur_ts); + + if (!timercmp(&cur_tv, &next_timeout, <)) { + usbi_dbg("first timeout already expired"); + timerclear(tv); + } else { + timersub(&next_timeout, &cur_tv, tv); + usbi_dbg("next timeout in %d.%06ds", tv->tv_sec, tv->tv_usec); + } + + return 1; +} + +/** \ingroup libusb_poll + * Register notification functions for file descriptor additions/removals. + * These functions will be invoked for every new or removed file descriptor + * that libusb uses as an event source. + * + * To remove notifiers, pass NULL values for the function pointers. + * + * Note that file descriptors may have been added even before you register + * these notifiers (e.g. at libusb_init() time). + * + * Additionally, note that the removal notifier may be called during + * libusb_exit() (e.g. when it is closing file descriptors that were opened + * and added to the poll set at libusb_init() time). If you don't want this, + * remove the notifiers immediately before calling libusb_exit(). + * + * \param ctx the context to operate on, or NULL for the default context + * \param added_cb pointer to function for addition notifications + * \param removed_cb pointer to function for removal notifications + * \param user_data User data to be passed back to callbacks (useful for + * passing context information) + */ +void API_EXPORTED libusb_set_pollfd_notifiers(libusb_context *ctx, + libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, + void *user_data) +{ + USBI_GET_CONTEXT(ctx); + ctx->fd_added_cb = added_cb; + ctx->fd_removed_cb = removed_cb; + ctx->fd_cb_user_data = user_data; +} + +/* + * Interrupt the iteration of the event handling thread, so that it picks + * up the fd change. Callers of this function must hold the event_data_lock. + */ +static void usbi_fd_notification(struct libusb_context *ctx) +{ + int pending_events; + + /* Record that there is a new poll fd. + * Only signal an event if there are no prior pending events. */ + pending_events = usbi_pending_events(ctx); + ctx->event_flags |= USBI_EVENT_POLLFDS_MODIFIED; + if (!pending_events) + usbi_signal_event(ctx); +} + +/* Add a file descriptor to the list of file descriptors to be monitored. + * events should be specified as a bitmask of events passed to poll(), e.g. + * POLLIN and/or POLLOUT. */ +int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events) +{ + struct usbi_pollfd *ipollfd = malloc(sizeof(*ipollfd)); + if (!ipollfd) + return LIBUSB_ERROR_NO_MEM; + + usbi_dbg("add fd %d events %d", fd, events); + ipollfd->pollfd.fd = fd; + ipollfd->pollfd.events = events; + usbi_mutex_lock(&ctx->event_data_lock); + list_add_tail(&ipollfd->list, &ctx->ipollfds); + ctx->pollfds_cnt++; + usbi_fd_notification(ctx); + usbi_mutex_unlock(&ctx->event_data_lock); + + if (ctx->fd_added_cb) + ctx->fd_added_cb(fd, events, ctx->fd_cb_user_data); + return 0; +} + +/* Remove a file descriptor from the list of file descriptors to be polled. */ +void usbi_remove_pollfd(struct libusb_context *ctx, int fd) +{ + struct usbi_pollfd *ipollfd; + int found = 0; + + usbi_dbg("remove fd %d", fd); + usbi_mutex_lock(&ctx->event_data_lock); + list_for_each_entry(ipollfd, &ctx->ipollfds, list, struct usbi_pollfd) + if (ipollfd->pollfd.fd == fd) { + found = 1; + break; + } + + if (!found) { + usbi_dbg("couldn't find fd %d to remove", fd); + usbi_mutex_unlock(&ctx->event_data_lock); + return; + } + + list_del(&ipollfd->list); + ctx->pollfds_cnt--; + usbi_fd_notification(ctx); + usbi_mutex_unlock(&ctx->event_data_lock); + free(ipollfd); + if (ctx->fd_removed_cb) + ctx->fd_removed_cb(fd, ctx->fd_cb_user_data); +} + +/** \ingroup libusb_poll + * Retrieve a list of file descriptors that should be polled by your main loop + * as libusb event sources. + * + * The returned list is NULL-terminated and should be freed with libusb_free_pollfds() + * when done. The actual list contents must not be touched. + * + * As file descriptors are a Unix-specific concept, this function is not + * available on Windows and will always return NULL. + * + * \param ctx the context to operate on, or NULL for the default context + * \returns a NULL-terminated list of libusb_pollfd structures + * \returns NULL on error + * \returns NULL on platforms where the functionality is not available + */ +DEFAULT_VISIBILITY +const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( + libusb_context *ctx) +{ +#ifndef OS_WINDOWS + struct libusb_pollfd **ret = NULL; + struct usbi_pollfd *ipollfd; + size_t i = 0; + USBI_GET_CONTEXT(ctx); + + usbi_mutex_lock(&ctx->event_data_lock); + + ret = calloc(ctx->pollfds_cnt + 1, sizeof(struct libusb_pollfd *)); + if (!ret) + goto out; + + list_for_each_entry(ipollfd, &ctx->ipollfds, list, struct usbi_pollfd) + ret[i++] = (struct libusb_pollfd *) ipollfd; + ret[ctx->pollfds_cnt] = NULL; + +out: + usbi_mutex_unlock(&ctx->event_data_lock); + return (const struct libusb_pollfd **) ret; +#else + usbi_err(ctx, "external polling of libusb's internal descriptors "\ + "is not yet supported on Windows platforms"); + return NULL; +#endif +} + +/** \ingroup libusb_poll + * Free a list of libusb_pollfd structures. This should be called for all + * pollfd lists allocated with libusb_get_pollfds(). + * + * Since version 1.0.20, \ref LIBUSB_API_VERSION >= 0x01000104 + * + * It is legal to call this function with a NULL pollfd list. In this case, + * the function will simply return safely. + * + * \param pollfds the list of libusb_pollfd structures to free + */ +void API_EXPORTED libusb_free_pollfds(const struct libusb_pollfd **pollfds) +{ + if (!pollfds) + return; + + free((void *)pollfds); +} + +/* Backends may call this from handle_events to report disconnection of a + * device. This function ensures transfers get cancelled appropriately. + * Callers of this function must hold the events_lock. + */ +void usbi_handle_disconnect(struct libusb_device_handle *dev_handle) +{ + struct usbi_transfer *cur; + struct usbi_transfer *to_cancel; + + usbi_dbg("device %d.%d", + dev_handle->dev->bus_number, dev_handle->dev->device_address); + + /* terminate all pending transfers with the LIBUSB_TRANSFER_NO_DEVICE + * status code. + * + * when we find a transfer for this device on the list, there are two + * possible scenarios: + * 1. the transfer is currently in-flight, in which case we terminate the + * transfer here + * 2. the transfer has been added to the flying transfer list by + * libusb_submit_transfer, has failed to submit and + * libusb_submit_transfer is waiting for us to release the + * flying_transfers_lock to remove it, so we ignore it + */ + + while (1) { + to_cancel = NULL; + usbi_mutex_lock(&HANDLE_CTX(dev_handle)->flying_transfers_lock); + list_for_each_entry(cur, &HANDLE_CTX(dev_handle)->flying_transfers, list, struct usbi_transfer) + if (USBI_TRANSFER_TO_LIBUSB_TRANSFER(cur)->dev_handle == dev_handle) { + usbi_mutex_lock(&cur->lock); + if (cur->state_flags & USBI_TRANSFER_IN_FLIGHT) + to_cancel = cur; + usbi_mutex_unlock(&cur->lock); + + if (to_cancel) + break; + } + usbi_mutex_unlock(&HANDLE_CTX(dev_handle)->flying_transfers_lock); + + if (!to_cancel) + break; + + usbi_dbg("cancelling transfer %p from disconnect", + USBI_TRANSFER_TO_LIBUSB_TRANSFER(to_cancel)); + + usbi_mutex_lock(&to_cancel->lock); + usbi_backend->clear_transfer_priv(to_cancel); + usbi_mutex_unlock(&to_cancel->lock); + usbi_handle_transfer_completion(to_cancel, LIBUSB_TRANSFER_NO_DEVICE); + } + +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/libusb.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/libusb.h new file mode 100644 index 00000000..30c86502 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/libusb.h @@ -0,0 +1,2011 @@ +/* + * Public libusb header file + * Copyright © 2001 Johannes Erdfelt + * Copyright © 2007-2008 Daniel Drake + * Copyright © 2012 Pete Batard + * Copyright © 2012 Nathan Hjelm + * For more information, please visit: http://libusb.info + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_H +#define LIBUSB_H + +#ifdef _MSC_VER +/* on MS environments, the inline keyword is available in C++ only */ +#if !defined(__cplusplus) +#define inline __inline +#endif +/* ssize_t is also not available (copy/paste from MinGW) */ +#ifndef _SSIZE_T_DEFINED +#define _SSIZE_T_DEFINED +#undef ssize_t +#ifdef _WIN64 + typedef __int64 ssize_t; +#else + typedef int ssize_t; +#endif /* _WIN64 */ +#endif /* _SSIZE_T_DEFINED */ +#endif /* _MSC_VER */ + +/* stdint.h is not available on older MSVC */ +#if defined(_MSC_VER) && (_MSC_VER < 1600) && (!defined(_STDINT)) && (!defined(_STDINT_H)) +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +#else +#include +#endif + +#if !defined(_WIN32_WCE) +#include +#endif + +#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) || defined(__HAIKU__) +#include +#endif + +#include +#include + +/* 'interface' might be defined as a macro on Windows, so we need to + * undefine it so as not to break the current libusb API, because + * libusb_config_descriptor has an 'interface' member + * As this can be problematic if you include windows.h after libusb.h + * in your sources, we force windows.h to be included first. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +#include +#if defined(interface) +#undef interface +#endif +#if !defined(__CYGWIN__) +#include +#endif +#endif + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#define LIBUSB_DEPRECATED_FOR(f) \ + __attribute__((deprecated("Use " #f " instead"))) +#else +#define LIBUSB_DEPRECATED_FOR(f) +#endif /* __GNUC__ */ + +/** \def LIBUSB_CALL + * \ingroup libusb_misc + * libusb's Windows calling convention. + * + * Under Windows, the selection of available compilers and configurations + * means that, unlike other platforms, there is not one true calling + * convention (calling convention: the manner in which parameters are + * passed to functions in the generated assembly code). + * + * Matching the Windows API itself, libusb uses the WINAPI convention (which + * translates to the stdcall convention) and guarantees that the + * library is compiled in this way. The public header file also includes + * appropriate annotations so that your own software will use the right + * convention, even if another convention is being used by default within + * your codebase. + * + * The one consideration that you must apply in your software is to mark + * all functions which you use as libusb callbacks with this LIBUSB_CALL + * annotation, so that they too get compiled for the correct calling + * convention. + * + * On non-Windows operating systems, this macro is defined as nothing. This + * means that you can apply it to your code without worrying about + * cross-platform compatibility. + */ +/* LIBUSB_CALL must be defined on both definition and declaration of libusb + * functions. You'd think that declaration would be enough, but cygwin will + * complain about conflicting types unless both are marked this way. + * The placement of this macro is important too; it must appear after the + * return type, before the function name. See internal documentation for + * API_EXPORTED. + */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +#define LIBUSB_CALL WINAPI +#else +#define LIBUSB_CALL +#endif + +/** \def LIBUSB_API_VERSION + * \ingroup libusb_misc + * libusb's API version. + * + * Since version 1.0.13, to help with feature detection, libusb defines + * a LIBUSB_API_VERSION macro that gets increased every time there is a + * significant change to the API, such as the introduction of a new call, + * the definition of a new macro/enum member, or any other element that + * libusb applications may want to detect at compilation time. + * + * The macro is typically used in an application as follows: + * \code + * #if defined(LIBUSB_API_VERSION) && (LIBUSB_API_VERSION >= 0x01001234) + * // Use one of the newer features from the libusb API + * #endif + * \endcode + * + * Internally, LIBUSB_API_VERSION is defined as follows: + * (libusb major << 24) | (libusb minor << 16) | (16 bit incremental) + */ +#define LIBUSB_API_VERSION 0x01000105 + +/* The following is kept for compatibility, but will be deprecated in the future */ +#define LIBUSBX_API_VERSION LIBUSB_API_VERSION + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup libusb_misc + * Convert a 16-bit value from host-endian to little-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the host-endian value to convert + * \returns the value in little-endian byte order + */ +static inline uint16_t libusb_cpu_to_le16(const uint16_t x) +{ + union { + uint8_t b8[2]; + uint16_t b16; + } _tmp; + _tmp.b8[1] = (uint8_t) (x >> 8); + _tmp.b8[0] = (uint8_t) (x & 0xff); + return _tmp.b16; +} + +/** \def libusb_le16_to_cpu + * \ingroup libusb_misc + * Convert a 16-bit value from little-endian to host-endian format. On + * little endian systems, this function does nothing. On big endian systems, + * the bytes are swapped. + * \param x the little-endian value to convert + * \returns the value in host-endian byte order + */ +#define libusb_le16_to_cpu libusb_cpu_to_le16 + +/* standard USB stuff */ + +/** \ingroup libusb_desc + * Device and/or Interface Class codes */ +enum libusb_class_code { + /** In the context of a \ref libusb_device_descriptor "device descriptor", + * this bDeviceClass value indicates that each interface specifies its + * own class information and all interfaces operate independently. + */ + LIBUSB_CLASS_PER_INTERFACE = 0, + + /** Audio class */ + LIBUSB_CLASS_AUDIO = 1, + + /** Communications class */ + LIBUSB_CLASS_COMM = 2, + + /** Human Interface Device class */ + LIBUSB_CLASS_HID = 3, + + /** Physical */ + LIBUSB_CLASS_PHYSICAL = 5, + + /** Printer class */ + LIBUSB_CLASS_PRINTER = 7, + + /** Image class */ + LIBUSB_CLASS_PTP = 6, /* legacy name from libusb-0.1 usb.h */ + LIBUSB_CLASS_IMAGE = 6, + + /** Mass storage class */ + LIBUSB_CLASS_MASS_STORAGE = 8, + + /** Hub class */ + LIBUSB_CLASS_HUB = 9, + + /** Data class */ + LIBUSB_CLASS_DATA = 10, + + /** Smart Card */ + LIBUSB_CLASS_SMART_CARD = 0x0b, + + /** Content Security */ + LIBUSB_CLASS_CONTENT_SECURITY = 0x0d, + + /** Video */ + LIBUSB_CLASS_VIDEO = 0x0e, + + /** Personal Healthcare */ + LIBUSB_CLASS_PERSONAL_HEALTHCARE = 0x0f, + + /** Diagnostic Device */ + LIBUSB_CLASS_DIAGNOSTIC_DEVICE = 0xdc, + + /** Wireless class */ + LIBUSB_CLASS_WIRELESS = 0xe0, + + /** Application class */ + LIBUSB_CLASS_APPLICATION = 0xfe, + + /** Class is vendor-specific */ + LIBUSB_CLASS_VENDOR_SPEC = 0xff +}; + +/** \ingroup libusb_desc + * Descriptor types as defined by the USB specification. */ +enum libusb_descriptor_type { + /** Device descriptor. See libusb_device_descriptor. */ + LIBUSB_DT_DEVICE = 0x01, + + /** Configuration descriptor. See libusb_config_descriptor. */ + LIBUSB_DT_CONFIG = 0x02, + + /** String descriptor */ + LIBUSB_DT_STRING = 0x03, + + /** Interface descriptor. See libusb_interface_descriptor. */ + LIBUSB_DT_INTERFACE = 0x04, + + /** Endpoint descriptor. See libusb_endpoint_descriptor. */ + LIBUSB_DT_ENDPOINT = 0x05, + + /** BOS descriptor */ + LIBUSB_DT_BOS = 0x0f, + + /** Device Capability descriptor */ + LIBUSB_DT_DEVICE_CAPABILITY = 0x10, + + /** HID descriptor */ + LIBUSB_DT_HID = 0x21, + + /** HID report descriptor */ + LIBUSB_DT_REPORT = 0x22, + + /** Physical descriptor */ + LIBUSB_DT_PHYSICAL = 0x23, + + /** Hub descriptor */ + LIBUSB_DT_HUB = 0x29, + + /** SuperSpeed Hub descriptor */ + LIBUSB_DT_SUPERSPEED_HUB = 0x2a, + + /** SuperSpeed Endpoint Companion descriptor */ + LIBUSB_DT_SS_ENDPOINT_COMPANION = 0x30 +}; + +/* Descriptor sizes per descriptor type */ +#define LIBUSB_DT_DEVICE_SIZE 18 +#define LIBUSB_DT_CONFIG_SIZE 9 +#define LIBUSB_DT_INTERFACE_SIZE 9 +#define LIBUSB_DT_ENDPOINT_SIZE 7 +#define LIBUSB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ +#define LIBUSB_DT_HUB_NONVAR_SIZE 7 +#define LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE 6 +#define LIBUSB_DT_BOS_SIZE 5 +#define LIBUSB_DT_DEVICE_CAPABILITY_SIZE 3 + +/* BOS descriptor sizes */ +#define LIBUSB_BT_USB_2_0_EXTENSION_SIZE 7 +#define LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE 10 +#define LIBUSB_BT_CONTAINER_ID_SIZE 20 + +/* We unwrap the BOS => define its max size */ +#define LIBUSB_DT_BOS_MAX_SIZE ((LIBUSB_DT_BOS_SIZE) +\ + (LIBUSB_BT_USB_2_0_EXTENSION_SIZE) +\ + (LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) +\ + (LIBUSB_BT_CONTAINER_ID_SIZE)) + +#define LIBUSB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ +#define LIBUSB_ENDPOINT_DIR_MASK 0x80 + +/** \ingroup libusb_desc + * Endpoint direction. Values for bit 7 of the + * \ref libusb_endpoint_descriptor::bEndpointAddress "endpoint address" scheme. + */ +enum libusb_endpoint_direction { + /** In: device-to-host */ + LIBUSB_ENDPOINT_IN = 0x80, + + /** Out: host-to-device */ + LIBUSB_ENDPOINT_OUT = 0x00 +}; + +#define LIBUSB_TRANSFER_TYPE_MASK 0x03 /* in bmAttributes */ + +/** \ingroup libusb_desc + * Endpoint transfer type. Values for bits 0:1 of the + * \ref libusb_endpoint_descriptor::bmAttributes "endpoint attributes" field. + */ +enum libusb_transfer_type { + /** Control endpoint */ + LIBUSB_TRANSFER_TYPE_CONTROL = 0, + + /** Isochronous endpoint */ + LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1, + + /** Bulk endpoint */ + LIBUSB_TRANSFER_TYPE_BULK = 2, + + /** Interrupt endpoint */ + LIBUSB_TRANSFER_TYPE_INTERRUPT = 3, + + /** Stream endpoint */ + LIBUSB_TRANSFER_TYPE_BULK_STREAM = 4, +}; + +/** \ingroup libusb_misc + * Standard requests, as defined in table 9-5 of the USB 3.0 specifications */ +enum libusb_standard_request { + /** Request status of the specific recipient */ + LIBUSB_REQUEST_GET_STATUS = 0x00, + + /** Clear or disable a specific feature */ + LIBUSB_REQUEST_CLEAR_FEATURE = 0x01, + + /* 0x02 is reserved */ + + /** Set or enable a specific feature */ + LIBUSB_REQUEST_SET_FEATURE = 0x03, + + /* 0x04 is reserved */ + + /** Set device address for all future accesses */ + LIBUSB_REQUEST_SET_ADDRESS = 0x05, + + /** Get the specified descriptor */ + LIBUSB_REQUEST_GET_DESCRIPTOR = 0x06, + + /** Used to update existing descriptors or add new descriptors */ + LIBUSB_REQUEST_SET_DESCRIPTOR = 0x07, + + /** Get the current device configuration value */ + LIBUSB_REQUEST_GET_CONFIGURATION = 0x08, + + /** Set device configuration */ + LIBUSB_REQUEST_SET_CONFIGURATION = 0x09, + + /** Return the selected alternate setting for the specified interface */ + LIBUSB_REQUEST_GET_INTERFACE = 0x0A, + + /** Select an alternate interface for the specified interface */ + LIBUSB_REQUEST_SET_INTERFACE = 0x0B, + + /** Set then report an endpoint's synchronization frame */ + LIBUSB_REQUEST_SYNCH_FRAME = 0x0C, + + /** Sets both the U1 and U2 Exit Latency */ + LIBUSB_REQUEST_SET_SEL = 0x30, + + /** Delay from the time a host transmits a packet to the time it is + * received by the device. */ + LIBUSB_SET_ISOCH_DELAY = 0x31, +}; + +/** \ingroup libusb_misc + * Request type bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. */ +enum libusb_request_type { + /** Standard */ + LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5), + + /** Class */ + LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5), + + /** Vendor */ + LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5), + + /** Reserved */ + LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5) +}; + +/** \ingroup libusb_misc + * Recipient bits of the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control + * transfers. Values 4 through 31 are reserved. */ +enum libusb_request_recipient { + /** Device */ + LIBUSB_RECIPIENT_DEVICE = 0x00, + + /** Interface */ + LIBUSB_RECIPIENT_INTERFACE = 0x01, + + /** Endpoint */ + LIBUSB_RECIPIENT_ENDPOINT = 0x02, + + /** Other */ + LIBUSB_RECIPIENT_OTHER = 0x03, +}; + +#define LIBUSB_ISO_SYNC_TYPE_MASK 0x0C + +/** \ingroup libusb_desc + * Synchronization type for isochronous endpoints. Values for bits 2:3 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_sync_type { + /** No synchronization */ + LIBUSB_ISO_SYNC_TYPE_NONE = 0, + + /** Asynchronous */ + LIBUSB_ISO_SYNC_TYPE_ASYNC = 1, + + /** Adaptive */ + LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2, + + /** Synchronous */ + LIBUSB_ISO_SYNC_TYPE_SYNC = 3 +}; + +#define LIBUSB_ISO_USAGE_TYPE_MASK 0x30 + +/** \ingroup libusb_desc + * Usage type for isochronous endpoints. Values for bits 4:5 of the + * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in + * libusb_endpoint_descriptor. + */ +enum libusb_iso_usage_type { + /** Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_DATA = 0, + + /** Feedback endpoint */ + LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1, + + /** Implicit feedback Data endpoint */ + LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2, +}; + +/** \ingroup libusb_desc + * A structure representing the standard USB device descriptor. This + * descriptor is documented in section 9.6.1 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_device_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE LIBUSB_DT_DEVICE in this + * context. */ + uint8_t bDescriptorType; + + /** USB specification release number in binary-coded decimal. A value of + * 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. */ + uint16_t bcdUSB; + + /** USB-IF class code for the device. See \ref libusb_class_code. */ + uint8_t bDeviceClass; + + /** USB-IF subclass code for the device, qualified by the bDeviceClass + * value */ + uint8_t bDeviceSubClass; + + /** USB-IF protocol code for the device, qualified by the bDeviceClass and + * bDeviceSubClass values */ + uint8_t bDeviceProtocol; + + /** Maximum packet size for endpoint 0 */ + uint8_t bMaxPacketSize0; + + /** USB-IF vendor ID */ + uint16_t idVendor; + + /** USB-IF product ID */ + uint16_t idProduct; + + /** Device release number in binary-coded decimal */ + uint16_t bcdDevice; + + /** Index of string descriptor describing manufacturer */ + uint8_t iManufacturer; + + /** Index of string descriptor describing product */ + uint8_t iProduct; + + /** Index of string descriptor containing device serial number */ + uint8_t iSerialNumber; + + /** Number of possible configurations */ + uint8_t bNumConfigurations; +}; + +/** \ingroup libusb_desc + * A structure representing the standard USB endpoint descriptor. This + * descriptor is documented in section 9.6.6 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_endpoint_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_ENDPOINT LIBUSB_DT_ENDPOINT in + * this context. */ + uint8_t bDescriptorType; + + /** The address of the endpoint described by this descriptor. Bits 0:3 are + * the endpoint number. Bits 4:6 are reserved. Bit 7 indicates direction, + * see \ref libusb_endpoint_direction. + */ + uint8_t bEndpointAddress; + + /** Attributes which apply to the endpoint when it is configured using + * the bConfigurationValue. Bits 0:1 determine the transfer type and + * correspond to \ref libusb_transfer_type. Bits 2:3 are only used for + * isochronous endpoints and correspond to \ref libusb_iso_sync_type. + * Bits 4:5 are also only used for isochronous endpoints and correspond to + * \ref libusb_iso_usage_type. Bits 6:7 are reserved. + */ + uint8_t bmAttributes; + + /** Maximum packet size this endpoint is capable of sending/receiving. */ + uint16_t wMaxPacketSize; + + /** Interval for polling endpoint for data transfers. */ + uint8_t bInterval; + + /** For audio devices only: the rate at which synchronization feedback + * is provided. */ + uint8_t bRefresh; + + /** For audio devices only: the address if the synch endpoint */ + uint8_t bSynchAddress; + + /** Extra descriptors. If libusb encounters unknown endpoint descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup libusb_desc + * A structure representing the standard USB interface descriptor. This + * descriptor is documented in section 9.6.5 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_interface_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_INTERFACE LIBUSB_DT_INTERFACE + * in this context. */ + uint8_t bDescriptorType; + + /** Number of this interface */ + uint8_t bInterfaceNumber; + + /** Value used to select this alternate setting for this interface */ + uint8_t bAlternateSetting; + + /** Number of endpoints used by this interface (excluding the control + * endpoint). */ + uint8_t bNumEndpoints; + + /** USB-IF class code for this interface. See \ref libusb_class_code. */ + uint8_t bInterfaceClass; + + /** USB-IF subclass code for this interface, qualified by the + * bInterfaceClass value */ + uint8_t bInterfaceSubClass; + + /** USB-IF protocol code for this interface, qualified by the + * bInterfaceClass and bInterfaceSubClass values */ + uint8_t bInterfaceProtocol; + + /** Index of string descriptor describing this interface */ + uint8_t iInterface; + + /** Array of endpoint descriptors. This length of this array is determined + * by the bNumEndpoints field. */ + const struct libusb_endpoint_descriptor *endpoint; + + /** Extra descriptors. If libusb encounters unknown interface descriptors, + * it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup libusb_desc + * A collection of alternate settings for a particular USB interface. + */ +struct libusb_interface { + /** Array of interface descriptors. The length of this array is determined + * by the num_altsetting field. */ + const struct libusb_interface_descriptor *altsetting; + + /** The number of alternate settings that belong to this interface */ + int num_altsetting; +}; + +/** \ingroup libusb_desc + * A structure representing the standard USB configuration descriptor. This + * descriptor is documented in section 9.6.3 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_config_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_CONFIG LIBUSB_DT_CONFIG + * in this context. */ + uint8_t bDescriptorType; + + /** Total length of data returned for this configuration */ + uint16_t wTotalLength; + + /** Number of interfaces supported by this configuration */ + uint8_t bNumInterfaces; + + /** Identifier value for this configuration */ + uint8_t bConfigurationValue; + + /** Index of string descriptor describing this configuration */ + uint8_t iConfiguration; + + /** Configuration characteristics */ + uint8_t bmAttributes; + + /** Maximum power consumption of the USB device from this bus in this + * configuration when the device is fully operation. Expressed in units + * of 2 mA when the device is operating in high-speed mode and in units + * of 8 mA when the device is operating in super-speed mode. */ + uint8_t MaxPower; + + /** Array of interfaces supported by this configuration. The length of + * this array is determined by the bNumInterfaces field. */ + const struct libusb_interface *interface; + + /** Extra descriptors. If libusb encounters unknown configuration + * descriptors, it will store them here, should you wish to parse them. */ + const unsigned char *extra; + + /** Length of the extra descriptors, in bytes. */ + int extra_length; +}; + +/** \ingroup libusb_desc + * A structure representing the superspeed endpoint companion + * descriptor. This descriptor is documented in section 9.6.7 of + * the USB 3.0 specification. All multiple-byte fields are represented in + * host-endian format. + */ +struct libusb_ss_endpoint_companion_descriptor { + + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_SS_ENDPOINT_COMPANION in + * this context. */ + uint8_t bDescriptorType; + + + /** The maximum number of packets the endpoint can send or + * receive as part of a burst. */ + uint8_t bMaxBurst; + + /** In bulk EP: bits 4:0 represents the maximum number of + * streams the EP supports. In isochronous EP: bits 1:0 + * represents the Mult - a zero based value that determines + * the maximum number of packets within a service interval */ + uint8_t bmAttributes; + + /** The total number of bytes this EP will transfer every + * service interval. valid only for periodic EPs. */ + uint16_t wBytesPerInterval; +}; + +/** \ingroup libusb_desc + * A generic representation of a BOS Device Capability descriptor. It is + * advised to check bDevCapabilityType and call the matching + * libusb_get_*_descriptor function to get a structure fully matching the type. + */ +struct libusb_bos_dev_capability_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + /** Device Capability type */ + uint8_t bDevCapabilityType; + /** Device Capability data (bLength - 3 bytes) */ + uint8_t dev_capability_data +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +/** \ingroup libusb_desc + * A structure representing the Binary Device Object Store (BOS) descriptor. + * This descriptor is documented in section 9.6.2 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_bos_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_BOS LIBUSB_DT_BOS + * in this context. */ + uint8_t bDescriptorType; + + /** Length of this descriptor and all of its sub descriptors */ + uint16_t wTotalLength; + + /** The number of separate device capability descriptors in + * the BOS */ + uint8_t bNumDeviceCaps; + + /** bNumDeviceCap Device Capability Descriptors */ + struct libusb_bos_dev_capability_descriptor *dev_capability +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +/** \ingroup libusb_desc + * A structure representing the USB 2.0 Extension descriptor + * This descriptor is documented in section 9.6.2.1 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_usb_2_0_extension_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + + /** Capability type. Will have value + * \ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION + * LIBUSB_BT_USB_2_0_EXTENSION in this context. */ + uint8_t bDevCapabilityType; + + /** Bitmap encoding of supported device level features. + * A value of one in a bit location indicates a feature is + * supported; a value of zero indicates it is not supported. + * See \ref libusb_usb_2_0_extension_attributes. */ + uint32_t bmAttributes; +}; + +/** \ingroup libusb_desc + * A structure representing the SuperSpeed USB Device Capability descriptor + * This descriptor is documented in section 9.6.2.2 of the USB 3.0 specification. + * All multiple-byte fields are represented in host-endian format. + */ +struct libusb_ss_usb_device_capability_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + + /** Capability type. Will have value + * \ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY + * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY in this context. */ + uint8_t bDevCapabilityType; + + /** Bitmap encoding of supported device level features. + * A value of one in a bit location indicates a feature is + * supported; a value of zero indicates it is not supported. + * See \ref libusb_ss_usb_device_capability_attributes. */ + uint8_t bmAttributes; + + /** Bitmap encoding of the speed supported by this device when + * operating in SuperSpeed mode. See \ref libusb_supported_speed. */ + uint16_t wSpeedSupported; + + /** The lowest speed at which all the functionality supported + * by the device is available to the user. For example if the + * device supports all its functionality when connected at + * full speed and above then it sets this value to 1. */ + uint8_t bFunctionalitySupport; + + /** U1 Device Exit Latency. */ + uint8_t bU1DevExitLat; + + /** U2 Device Exit Latency. */ + uint16_t bU2DevExitLat; +}; + +/** \ingroup libusb_desc + * A structure representing the Container ID descriptor. + * This descriptor is documented in section 9.6.2.3 of the USB 3.0 specification. + * All multiple-byte fields, except UUIDs, are represented in host-endian format. + */ +struct libusb_container_id_descriptor { + /** Size of this descriptor (in bytes) */ + uint8_t bLength; + + /** Descriptor type. Will have value + * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY + * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ + uint8_t bDescriptorType; + + /** Capability type. Will have value + * \ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID + * LIBUSB_BT_CONTAINER_ID in this context. */ + uint8_t bDevCapabilityType; + + /** Reserved field */ + uint8_t bReserved; + + /** 128 bit UUID */ + uint8_t ContainerID[16]; +}; + +/** \ingroup libusb_asyncio + * Setup packet for control transfers. */ +struct libusb_control_setup { + /** Request type. Bits 0:4 determine recipient, see + * \ref libusb_request_recipient. Bits 5:6 determine type, see + * \ref libusb_request_type. Bit 7 determines data transfer direction, see + * \ref libusb_endpoint_direction. + */ + uint8_t bmRequestType; + + /** Request. If the type bits of bmRequestType are equal to + * \ref libusb_request_type::LIBUSB_REQUEST_TYPE_STANDARD + * "LIBUSB_REQUEST_TYPE_STANDARD" then this field refers to + * \ref libusb_standard_request. For other cases, use of this field is + * application-specific. */ + uint8_t bRequest; + + /** Value. Varies according to request */ + uint16_t wValue; + + /** Index. Varies according to request, typically used to pass an index + * or offset */ + uint16_t wIndex; + + /** Number of bytes to transfer */ + uint16_t wLength; +}; + +#define LIBUSB_CONTROL_SETUP_SIZE (sizeof(struct libusb_control_setup)) + +/* libusb */ + +struct libusb_context; +struct libusb_device; +struct libusb_device_handle; + +/** \ingroup libusb_lib + * Structure providing the version of the libusb runtime + */ +struct libusb_version { + /** Library major version. */ + const uint16_t major; + + /** Library minor version. */ + const uint16_t minor; + + /** Library micro version. */ + const uint16_t micro; + + /** Library nano version. */ + const uint16_t nano; + + /** Library release candidate suffix string, e.g. "-rc4". */ + const char *rc; + + /** For ABI compatibility only. */ + const char* describe; +}; + +/** \ingroup libusb_lib + * Structure representing a libusb session. The concept of individual libusb + * sessions allows for your program to use two libraries (or dynamically + * load two modules) which both independently use libusb. This will prevent + * interference between the individual libusb users - for example + * libusb_set_debug() will not affect the other user of the library, and + * libusb_exit() will not destroy resources that the other user is still + * using. + * + * Sessions are created by libusb_init() and destroyed through libusb_exit(). + * If your application is guaranteed to only ever include a single libusb + * user (i.e. you), you do not have to worry about contexts: pass NULL in + * every function call where a context is required. The default context + * will be used. + * + * For more information, see \ref libusb_contexts. + */ +typedef struct libusb_context libusb_context; + +/** \ingroup libusb_dev + * Structure representing a USB device detected on the system. This is an + * opaque type for which you are only ever provided with a pointer, usually + * originating from libusb_get_device_list(). + * + * Certain operations can be performed on a device, but in order to do any + * I/O you will have to first obtain a device handle using libusb_open(). + * + * Devices are reference counted with libusb_ref_device() and + * libusb_unref_device(), and are freed when the reference count reaches 0. + * New devices presented by libusb_get_device_list() have a reference count of + * 1, and libusb_free_device_list() can optionally decrease the reference count + * on all devices in the list. libusb_open() adds another reference which is + * later destroyed by libusb_close(). + */ +typedef struct libusb_device libusb_device; + + +/** \ingroup libusb_dev + * Structure representing a handle on a USB device. This is an opaque type for + * which you are only ever provided with a pointer, usually originating from + * libusb_open(). + * + * A device handle is used to perform I/O and other operations. When finished + * with a device handle, you should call libusb_close(). + */ +typedef struct libusb_device_handle libusb_device_handle; + +/** \ingroup libusb_dev + * Speed codes. Indicates the speed at which the device is operating. + */ +enum libusb_speed { + /** The OS doesn't report or know the device speed. */ + LIBUSB_SPEED_UNKNOWN = 0, + + /** The device is operating at low speed (1.5MBit/s). */ + LIBUSB_SPEED_LOW = 1, + + /** The device is operating at full speed (12MBit/s). */ + LIBUSB_SPEED_FULL = 2, + + /** The device is operating at high speed (480MBit/s). */ + LIBUSB_SPEED_HIGH = 3, + + /** The device is operating at super speed (5000MBit/s). */ + LIBUSB_SPEED_SUPER = 4, +}; + +/** \ingroup libusb_dev + * Supported speeds (wSpeedSupported) bitfield. Indicates what + * speeds the device supports. + */ +enum libusb_supported_speed { + /** Low speed operation supported (1.5MBit/s). */ + LIBUSB_LOW_SPEED_OPERATION = 1, + + /** Full speed operation supported (12MBit/s). */ + LIBUSB_FULL_SPEED_OPERATION = 2, + + /** High speed operation supported (480MBit/s). */ + LIBUSB_HIGH_SPEED_OPERATION = 4, + + /** Superspeed operation supported (5000MBit/s). */ + LIBUSB_SUPER_SPEED_OPERATION = 8, +}; + +/** \ingroup libusb_dev + * Masks for the bits of the + * \ref libusb_usb_2_0_extension_descriptor::bmAttributes "bmAttributes" field + * of the USB 2.0 Extension descriptor. + */ +enum libusb_usb_2_0_extension_attributes { + /** Supports Link Power Management (LPM) */ + LIBUSB_BM_LPM_SUPPORT = 2, +}; + +/** \ingroup libusb_dev + * Masks for the bits of the + * \ref libusb_ss_usb_device_capability_descriptor::bmAttributes "bmAttributes" field + * field of the SuperSpeed USB Device Capability descriptor. + */ +enum libusb_ss_usb_device_capability_attributes { + /** Supports Latency Tolerance Messages (LTM) */ + LIBUSB_BM_LTM_SUPPORT = 2, +}; + +/** \ingroup libusb_dev + * USB capability types + */ +enum libusb_bos_type { + /** Wireless USB device capability */ + LIBUSB_BT_WIRELESS_USB_DEVICE_CAPABILITY = 1, + + /** USB 2.0 extensions */ + LIBUSB_BT_USB_2_0_EXTENSION = 2, + + /** SuperSpeed USB device capability */ + LIBUSB_BT_SS_USB_DEVICE_CAPABILITY = 3, + + /** Container ID type */ + LIBUSB_BT_CONTAINER_ID = 4, +}; + +/** \ingroup libusb_misc + * Error codes. Most libusb functions return 0 on success or one of these + * codes on failure. + * You can call libusb_error_name() to retrieve a string representation of an + * error code or libusb_strerror() to get an end-user suitable description of + * an error code. + */ +enum libusb_error { + /** Success (no error) */ + LIBUSB_SUCCESS = 0, + + /** Input/output error */ + LIBUSB_ERROR_IO = -1, + + /** Invalid parameter */ + LIBUSB_ERROR_INVALID_PARAM = -2, + + /** Access denied (insufficient permissions) */ + LIBUSB_ERROR_ACCESS = -3, + + /** No such device (it may have been disconnected) */ + LIBUSB_ERROR_NO_DEVICE = -4, + + /** Entity not found */ + LIBUSB_ERROR_NOT_FOUND = -5, + + /** Resource busy */ + LIBUSB_ERROR_BUSY = -6, + + /** Operation timed out */ + LIBUSB_ERROR_TIMEOUT = -7, + + /** Overflow */ + LIBUSB_ERROR_OVERFLOW = -8, + + /** Pipe error */ + LIBUSB_ERROR_PIPE = -9, + + /** System call interrupted (perhaps due to signal) */ + LIBUSB_ERROR_INTERRUPTED = -10, + + /** Insufficient memory */ + LIBUSB_ERROR_NO_MEM = -11, + + /** Operation not supported or unimplemented on this platform */ + LIBUSB_ERROR_NOT_SUPPORTED = -12, + + /* NB: Remember to update LIBUSB_ERROR_COUNT below as well as the + message strings in strerror.c when adding new error codes here. */ + + /** Other error */ + LIBUSB_ERROR_OTHER = -99, +}; + +/* Total number of error codes in enum libusb_error */ +#define LIBUSB_ERROR_COUNT 14 + +/** \ingroup libusb_asyncio + * Transfer status codes */ +enum libusb_transfer_status { + /** Transfer completed without error. Note that this does not indicate + * that the entire amount of requested data was transferred. */ + LIBUSB_TRANSFER_COMPLETED, + + /** Transfer failed */ + LIBUSB_TRANSFER_ERROR, + + /** Transfer timed out */ + LIBUSB_TRANSFER_TIMED_OUT, + + /** Transfer was cancelled */ + LIBUSB_TRANSFER_CANCELLED, + + /** For bulk/interrupt endpoints: halt condition detected (endpoint + * stalled). For control endpoints: control request not supported. */ + LIBUSB_TRANSFER_STALL, + + /** Device was disconnected */ + LIBUSB_TRANSFER_NO_DEVICE, + + /** Device sent more data than requested */ + LIBUSB_TRANSFER_OVERFLOW, + + /* NB! Remember to update libusb_error_name() + when adding new status codes here. */ +}; + +/** \ingroup libusb_asyncio + * libusb_transfer.flags values */ +enum libusb_transfer_flags { + /** Report short frames as errors */ + LIBUSB_TRANSFER_SHORT_NOT_OK = 1<<0, + + /** Automatically free() transfer buffer during libusb_free_transfer(). + * Note that buffers allocated with libusb_dev_mem_alloc() should not + * be attempted freed in this way, since free() is not an appropriate + * way to release such memory. */ + LIBUSB_TRANSFER_FREE_BUFFER = 1<<1, + + /** Automatically call libusb_free_transfer() after callback returns. + * If this flag is set, it is illegal to call libusb_free_transfer() + * from your transfer callback, as this will result in a double-free + * when this flag is acted upon. */ + LIBUSB_TRANSFER_FREE_TRANSFER = 1<<2, + + /** Terminate transfers that are a multiple of the endpoint's + * wMaxPacketSize with an extra zero length packet. This is useful + * when a device protocol mandates that each logical request is + * terminated by an incomplete packet (i.e. the logical requests are + * not separated by other means). + * + * This flag only affects host-to-device transfers to bulk and interrupt + * endpoints. In other situations, it is ignored. + * + * This flag only affects transfers with a length that is a multiple of + * the endpoint's wMaxPacketSize. On transfers of other lengths, this + * flag has no effect. Therefore, if you are working with a device that + * needs a ZLP whenever the end of the logical request falls on a packet + * boundary, then it is sensible to set this flag on every + * transfer (you do not have to worry about only setting it on transfers + * that end on the boundary). + * + * This flag is currently only supported on Linux. + * On other systems, libusb_submit_transfer() will return + * LIBUSB_ERROR_NOT_SUPPORTED for every transfer where this flag is set. + * + * Available since libusb-1.0.9. + */ + LIBUSB_TRANSFER_ADD_ZERO_PACKET = 1 << 3, +}; + +/** \ingroup libusb_asyncio + * Isochronous packet descriptor. */ +struct libusb_iso_packet_descriptor { + /** Length of data to request in this packet */ + unsigned int length; + + /** Amount of data that was actually transferred */ + unsigned int actual_length; + + /** Status code for this packet */ + enum libusb_transfer_status status; +}; + +struct libusb_transfer; + +/** \ingroup libusb_asyncio + * Asynchronous transfer callback function type. When submitting asynchronous + * transfers, you pass a pointer to a callback function of this type via the + * \ref libusb_transfer::callback "callback" member of the libusb_transfer + * structure. libusb will call this function later, when the transfer has + * completed or failed. See \ref libusb_asyncio for more information. + * \param transfer The libusb_transfer struct the callback function is being + * notified about. + */ +typedef void (LIBUSB_CALL *libusb_transfer_cb_fn)(struct libusb_transfer *transfer); + +/** \ingroup libusb_asyncio + * The generic USB transfer structure. The user populates this structure and + * then submits it in order to request a transfer. After the transfer has + * completed, the library populates the transfer with the results and passes + * it back to the user. + */ +struct libusb_transfer { + /** Handle of the device that this transfer will be submitted to */ + libusb_device_handle *dev_handle; + + /** A bitwise OR combination of \ref libusb_transfer_flags. */ + uint8_t flags; + + /** Address of the endpoint where this transfer will be sent. */ + unsigned char endpoint; + + /** Type of the endpoint from \ref libusb_transfer_type */ + unsigned char type; + + /** Timeout for this transfer in milliseconds. A value of 0 indicates no + * timeout. */ + unsigned int timeout; + + /** The status of the transfer. Read-only, and only for use within + * transfer callback function. + * + * If this is an isochronous transfer, this field may read COMPLETED even + * if there were errors in the frames. Use the + * \ref libusb_iso_packet_descriptor::status "status" field in each packet + * to determine if errors occurred. */ + enum libusb_transfer_status status; + + /** Length of the data buffer */ + int length; + + /** Actual length of data that was transferred. Read-only, and only for + * use within transfer callback function. Not valid for isochronous + * endpoint transfers. */ + int actual_length; + + /** Callback function. This will be invoked when the transfer completes, + * fails, or is cancelled. */ + libusb_transfer_cb_fn callback; + + /** User context data to pass to the callback function. */ + void *user_data; + + /** Data buffer */ + unsigned char *buffer; + + /** Number of isochronous packets. Only used for I/O with isochronous + * endpoints. */ + int num_iso_packets; + + /** Isochronous packet descriptors, for isochronous transfers only. */ + struct libusb_iso_packet_descriptor iso_packet_desc +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +/** \ingroup libusb_misc + * Capabilities supported by an instance of libusb on the current running + * platform. Test if the loaded library supports a given capability by calling + * \ref libusb_has_capability(). + */ +enum libusb_capability { + /** The libusb_has_capability() API is available. */ + LIBUSB_CAP_HAS_CAPABILITY = 0x0000, + /** Hotplug support is available on this platform. */ + LIBUSB_CAP_HAS_HOTPLUG = 0x0001, + /** The library can access HID devices without requiring user intervention. + * Note that before being able to actually access an HID device, you may + * still have to call additional libusb functions such as + * \ref libusb_detach_kernel_driver(). */ + LIBUSB_CAP_HAS_HID_ACCESS = 0x0100, + /** The library supports detaching of the default USB driver, using + * \ref libusb_detach_kernel_driver(), if one is set by the OS kernel */ + LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER = 0x0101 +}; + +/** \ingroup libusb_lib + * Log message levels. + * - LIBUSB_LOG_LEVEL_NONE (0) : no messages ever printed by the library (default) + * - LIBUSB_LOG_LEVEL_ERROR (1) : error messages are printed to stderr + * - LIBUSB_LOG_LEVEL_WARNING (2) : warning and error messages are printed to stderr + * - LIBUSB_LOG_LEVEL_INFO (3) : informational messages are printed to stdout, warning + * and error messages are printed to stderr + * - LIBUSB_LOG_LEVEL_DEBUG (4) : debug and informational messages are printed to stdout, + * warnings and errors to stderr + */ +enum libusb_log_level { + LIBUSB_LOG_LEVEL_NONE = 0, + LIBUSB_LOG_LEVEL_ERROR, + LIBUSB_LOG_LEVEL_WARNING, + LIBUSB_LOG_LEVEL_INFO, + LIBUSB_LOG_LEVEL_DEBUG, +}; + +int LIBUSB_CALL libusb_init(libusb_context **ctx); +void LIBUSB_CALL libusb_exit(libusb_context *ctx); +void LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level); +const struct libusb_version * LIBUSB_CALL libusb_get_version(void); +int LIBUSB_CALL libusb_has_capability(uint32_t capability); +const char * LIBUSB_CALL libusb_error_name(int errcode); +int LIBUSB_CALL libusb_setlocale(const char *locale); +const char * LIBUSB_CALL libusb_strerror(enum libusb_error errcode); + +ssize_t LIBUSB_CALL libusb_get_device_list(libusb_context *ctx, + libusb_device ***list); +void LIBUSB_CALL libusb_free_device_list(libusb_device **list, + int unref_devices); +libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev); +void LIBUSB_CALL libusb_unref_device(libusb_device *dev); + +int LIBUSB_CALL libusb_get_configuration(libusb_device_handle *dev, + int *config); +int LIBUSB_CALL libusb_get_device_descriptor(libusb_device *dev, + struct libusb_device_descriptor *desc); +int LIBUSB_CALL libusb_get_active_config_descriptor(libusb_device *dev, + struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor(libusb_device *dev, + uint8_t config_index, struct libusb_config_descriptor **config); +int LIBUSB_CALL libusb_get_config_descriptor_by_value(libusb_device *dev, + uint8_t bConfigurationValue, struct libusb_config_descriptor **config); +void LIBUSB_CALL libusb_free_config_descriptor( + struct libusb_config_descriptor *config); +int LIBUSB_CALL libusb_get_ss_endpoint_companion_descriptor( + struct libusb_context *ctx, + const struct libusb_endpoint_descriptor *endpoint, + struct libusb_ss_endpoint_companion_descriptor **ep_comp); +void LIBUSB_CALL libusb_free_ss_endpoint_companion_descriptor( + struct libusb_ss_endpoint_companion_descriptor *ep_comp); +int LIBUSB_CALL libusb_get_bos_descriptor(libusb_device_handle *dev_handle, + struct libusb_bos_descriptor **bos); +void LIBUSB_CALL libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos); +int LIBUSB_CALL libusb_get_usb_2_0_extension_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_usb_2_0_extension_descriptor **usb_2_0_extension); +void LIBUSB_CALL libusb_free_usb_2_0_extension_descriptor( + struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension); +int LIBUSB_CALL libusb_get_ss_usb_device_capability_descriptor( + struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap); +void LIBUSB_CALL libusb_free_ss_usb_device_capability_descriptor( + struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap); +int LIBUSB_CALL libusb_get_container_id_descriptor(struct libusb_context *ctx, + struct libusb_bos_dev_capability_descriptor *dev_cap, + struct libusb_container_id_descriptor **container_id); +void LIBUSB_CALL libusb_free_container_id_descriptor( + struct libusb_container_id_descriptor *container_id); +uint8_t LIBUSB_CALL libusb_get_bus_number(libusb_device *dev); +uint8_t LIBUSB_CALL libusb_get_port_number(libusb_device *dev); +int LIBUSB_CALL libusb_get_port_numbers(libusb_device *dev, uint8_t* port_numbers, int port_numbers_len); +LIBUSB_DEPRECATED_FOR(libusb_get_port_numbers) +int LIBUSB_CALL libusb_get_port_path(libusb_context *ctx, libusb_device *dev, uint8_t* path, uint8_t path_length); +libusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev); +uint8_t LIBUSB_CALL libusb_get_device_address(libusb_device *dev); +int LIBUSB_CALL libusb_get_device_speed(libusb_device *dev); +int LIBUSB_CALL libusb_get_max_packet_size(libusb_device *dev, + unsigned char endpoint); +int LIBUSB_CALL libusb_get_max_iso_packet_size(libusb_device *dev, + unsigned char endpoint); + +int LIBUSB_CALL libusb_open(libusb_device *dev, libusb_device_handle **dev_handle); +void LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle); +libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle); + +int LIBUSB_CALL libusb_set_configuration(libusb_device_handle *dev_handle, + int configuration); +int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev_handle, + int interface_number); +int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev_handle, + int interface_number); + +libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( + libusb_context *ctx, uint16_t vendor_id, uint16_t product_id); + +int LIBUSB_CALL libusb_set_interface_alt_setting(libusb_device_handle *dev_handle, + int interface_number, int alternate_setting); +int LIBUSB_CALL libusb_clear_halt(libusb_device_handle *dev_handle, + unsigned char endpoint); +int LIBUSB_CALL libusb_reset_device(libusb_device_handle *dev_handle); + +int LIBUSB_CALL libusb_alloc_streams(libusb_device_handle *dev_handle, + uint32_t num_streams, unsigned char *endpoints, int num_endpoints); +int LIBUSB_CALL libusb_free_streams(libusb_device_handle *dev_handle, + unsigned char *endpoints, int num_endpoints); + +unsigned char * LIBUSB_CALL libusb_dev_mem_alloc(libusb_device_handle *dev_handle, + size_t length); +int LIBUSB_CALL libusb_dev_mem_free(libusb_device_handle *dev_handle, + unsigned char *buffer, size_t length); + +int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev_handle, + int interface_number); +int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev_handle, + int interface_number); +int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev_handle, + int interface_number); +int LIBUSB_CALL libusb_set_auto_detach_kernel_driver( + libusb_device_handle *dev_handle, int enable); + +/* async I/O */ + +/** \ingroup libusb_asyncio + * Get the data section of a control transfer. This convenience function is here + * to remind you that the data does not start until 8 bytes into the actual + * buffer, as the setup packet comes first. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns pointer to the first byte of the data section + */ +static inline unsigned char *libusb_control_transfer_get_data( + struct libusb_transfer *transfer) +{ + return transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; +} + +/** \ingroup libusb_asyncio + * Get the control setup packet of a control transfer. This convenience + * function is here to remind you that the control setup occupies the first + * 8 bytes of the transfer data buffer. + * + * Calling this function only makes sense from a transfer callback function, + * or situations where you have already allocated a suitably sized buffer at + * transfer->buffer. + * + * \param transfer a transfer + * \returns a casted pointer to the start of the transfer data buffer + */ +static inline struct libusb_control_setup *libusb_control_transfer_get_setup( + struct libusb_transfer *transfer) +{ + return (struct libusb_control_setup *)(void *) transfer->buffer; +} + +/** \ingroup libusb_asyncio + * Helper function to populate the setup packet (first 8 bytes of the data + * buffer) for a control transfer. The wIndex, wValue and wLength values should + * be given in host-endian byte order. + * + * \param buffer buffer to output the setup packet into + * This pointer must be aligned to at least 2 bytes boundary. + * \param bmRequestType see the + * \ref libusb_control_setup::bmRequestType "bmRequestType" field of + * \ref libusb_control_setup + * \param bRequest see the + * \ref libusb_control_setup::bRequest "bRequest" field of + * \ref libusb_control_setup + * \param wValue see the + * \ref libusb_control_setup::wValue "wValue" field of + * \ref libusb_control_setup + * \param wIndex see the + * \ref libusb_control_setup::wIndex "wIndex" field of + * \ref libusb_control_setup + * \param wLength see the + * \ref libusb_control_setup::wLength "wLength" field of + * \ref libusb_control_setup + */ +static inline void libusb_fill_control_setup(unsigned char *buffer, + uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + uint16_t wLength) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *)(void *) buffer; + setup->bmRequestType = bmRequestType; + setup->bRequest = bRequest; + setup->wValue = libusb_cpu_to_le16(wValue); + setup->wIndex = libusb_cpu_to_le16(wIndex); + setup->wLength = libusb_cpu_to_le16(wLength); +} + +struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer(int iso_packets); +int LIBUSB_CALL libusb_submit_transfer(struct libusb_transfer *transfer); +int LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer *transfer); +void LIBUSB_CALL libusb_free_transfer(struct libusb_transfer *transfer); +void LIBUSB_CALL libusb_transfer_set_stream_id( + struct libusb_transfer *transfer, uint32_t stream_id); +uint32_t LIBUSB_CALL libusb_transfer_get_stream_id( + struct libusb_transfer *transfer); + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a control transfer. + * + * If you pass a transfer buffer to this function, the first 8 bytes will + * be interpreted as a control setup packet, and the wLength field will be + * used to automatically populate the \ref libusb_transfer::length "length" + * field of the transfer. Therefore the recommended approach is: + * -# Allocate a suitably sized data buffer (including space for control setup) + * -# Call libusb_fill_control_setup() + * -# If this is a host-to-device transfer with a data stage, put the data + * in place after the setup packet + * -# Call this function + * -# Call libusb_submit_transfer() + * + * It is also legal to pass a NULL buffer to this function, in which case this + * function will not attempt to populate the length field. Remember that you + * must then populate the buffer and length fields later. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param buffer data buffer. If provided, this function will interpret the + * first 8 bytes as a setup packet and infer the transfer length from that. + * This pointer must be aligned to at least 2 bytes boundary. + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_control_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data, + unsigned int timeout) +{ + struct libusb_control_setup *setup = (struct libusb_control_setup *)(void *) buffer; + transfer->dev_handle = dev_handle; + transfer->endpoint = 0; + transfer->type = LIBUSB_TRANSFER_TYPE_CONTROL; + transfer->timeout = timeout; + transfer->buffer = buffer; + if (setup) + transfer->length = (int) (LIBUSB_CONTROL_SETUP_SIZE + + libusb_le16_to_cpu(setup->wLength)); + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a bulk transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_bulk_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, libusb_transfer_cb_fn callback, + void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_BULK; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for a bulk transfer using bulk streams. + * + * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param stream_id bulk stream id for this transfer + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_bulk_stream_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char endpoint, uint32_t stream_id, + unsigned char *buffer, int length, libusb_transfer_cb_fn callback, + void *user_data, unsigned int timeout) +{ + libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer, + length, callback, user_data, timeout); + transfer->type = LIBUSB_TRANSFER_TYPE_BULK_STREAM; + libusb_transfer_set_stream_id(transfer, stream_id); +} + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an interrupt transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_interrupt_transfer( + struct libusb_transfer *transfer, libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *buffer, int length, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup libusb_asyncio + * Helper function to populate the required \ref libusb_transfer fields + * for an isochronous transfer. + * + * \param transfer the transfer to populate + * \param dev_handle handle of the device that will handle the transfer + * \param endpoint address of the endpoint where this transfer will be sent + * \param buffer data buffer + * \param length length of data buffer + * \param num_iso_packets the number of isochronous packets + * \param callback callback function to be invoked on transfer completion + * \param user_data user data to pass to callback function + * \param timeout timeout for the transfer in milliseconds + */ +static inline void libusb_fill_iso_transfer(struct libusb_transfer *transfer, + libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *buffer, int length, int num_iso_packets, + libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +{ + transfer->dev_handle = dev_handle; + transfer->endpoint = endpoint; + transfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS; + transfer->timeout = timeout; + transfer->buffer = buffer; + transfer->length = length; + transfer->num_iso_packets = num_iso_packets; + transfer->user_data = user_data; + transfer->callback = callback; +} + +/** \ingroup libusb_asyncio + * Convenience function to set the length of all packets in an isochronous + * transfer, based on the num_iso_packets field in the transfer structure. + * + * \param transfer a transfer + * \param length the length to set in each isochronous packet descriptor + * \see libusb_get_max_packet_size() + */ +static inline void libusb_set_iso_packet_lengths( + struct libusb_transfer *transfer, unsigned int length) +{ + int i; + for (i = 0; i < transfer->num_iso_packets; i++) + transfer->iso_packet_desc[i].length = length; +} + +/** \ingroup libusb_asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer. + * + * This is a thorough function which loops through all preceding packets, + * accumulating their lengths to find the position of the specified packet. + * Typically you will assign equal lengths to each packet in the transfer, + * and hence the above method is sub-optimal. You may wish to use + * libusb_get_iso_packet_buffer_simple() instead. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer_simple() + */ +static inline unsigned char *libusb_get_iso_packet_buffer( + struct libusb_transfer *transfer, unsigned int packet) +{ + int i; + size_t offset = 0; + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = (int) packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + for (i = 0; i < _packet; i++) + offset += transfer->iso_packet_desc[i].length; + + return transfer->buffer + offset; +} + +/** \ingroup libusb_asyncio + * Convenience function to locate the position of an isochronous packet + * within the buffer of an isochronous transfer, for transfers where each + * packet is of identical size. + * + * This function relies on the assumption that every packet within the transfer + * is of identical size to the first packet. Calculating the location of + * the packet buffer is then just a simple calculation: + * buffer + (packet_size * packet) + * + * Do not use this function on transfers other than those that have identical + * packet lengths for each packet. + * + * \param transfer a transfer + * \param packet the packet to return the address of + * \returns the base address of the packet buffer inside the transfer buffer, + * or NULL if the packet does not exist. + * \see libusb_get_iso_packet_buffer() + */ +static inline unsigned char *libusb_get_iso_packet_buffer_simple( + struct libusb_transfer *transfer, unsigned int packet) +{ + int _packet; + + /* oops..slight bug in the API. packet is an unsigned int, but we use + * signed integers almost everywhere else. range-check and convert to + * signed to avoid compiler warnings. FIXME for libusb-2. */ + if (packet > INT_MAX) + return NULL; + _packet = (int) packet; + + if (_packet >= transfer->num_iso_packets) + return NULL; + + return transfer->buffer + ((int) transfer->iso_packet_desc[0].length * _packet); +} + +/* sync I/O */ + + +void LIBUSB_CALL libusb_cancel_sync_transfers_on_device(struct libusb_device_handle *dev_handle); + +int LIBUSB_CALL libusb_control_transfer(libusb_device_handle *dev_handle, + uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + unsigned char *data, uint16_t wLength, unsigned int timeout); + +int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +int LIBUSB_CALL libusb_interrupt_transfer(libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, + int *actual_length, unsigned int timeout); + +/** \ingroup libusb_desc + * Retrieve a descriptor from the default control pipe. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. + * + * \param dev_handle a device handle + * \param desc_type the descriptor type, see \ref libusb_descriptor_type + * \param desc_index the index of the descriptor to retrieve + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + */ +static inline int libusb_get_descriptor(libusb_device_handle *dev_handle, + uint8_t desc_type, uint8_t desc_index, unsigned char *data, int length) +{ + return libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t) ((desc_type << 8) | desc_index), + 0, data, (uint16_t) length, 1000); +} + +/** \ingroup libusb_desc + * Retrieve a descriptor from a device. + * This is a convenience function which formulates the appropriate control + * message to retrieve the descriptor. The string returned is Unicode, as + * detailed in the USB specifications. + * + * \param dev_handle a device handle + * \param desc_index the index of the descriptor to retrieve + * \param langid the language ID for the string descriptor + * \param data output buffer for descriptor + * \param length size of data buffer + * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure + * \see libusb_get_string_descriptor_ascii() + */ +static inline int libusb_get_string_descriptor(libusb_device_handle *dev_handle, + uint8_t desc_index, uint16_t langid, unsigned char *data, int length) +{ + return libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN, + LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t)((LIBUSB_DT_STRING << 8) | desc_index), + langid, data, (uint16_t) length, 1000); +} + +int LIBUSB_CALL libusb_get_string_descriptor_ascii(libusb_device_handle *dev_handle, + uint8_t desc_index, unsigned char *data, int length); + +/* polling and timeouts */ + +int LIBUSB_CALL libusb_try_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_events(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_events(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handling_ok(libusb_context *ctx); +int LIBUSB_CALL libusb_event_handler_active(libusb_context *ctx); +void LIBUSB_CALL libusb_interrupt_event_handler(libusb_context *ctx); +void LIBUSB_CALL libusb_lock_event_waiters(libusb_context *ctx); +void LIBUSB_CALL libusb_unlock_event_waiters(libusb_context *ctx); +int LIBUSB_CALL libusb_wait_for_event(libusb_context *ctx, struct timeval *tv); + +int LIBUSB_CALL libusb_handle_events_timeout(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_handle_events_timeout_completed(libusb_context *ctx, + struct timeval *tv, int *completed); +int LIBUSB_CALL libusb_handle_events(libusb_context *ctx); +int LIBUSB_CALL libusb_handle_events_completed(libusb_context *ctx, int *completed); +int LIBUSB_CALL libusb_handle_events_locked(libusb_context *ctx, + struct timeval *tv); +int LIBUSB_CALL libusb_pollfds_handle_timeouts(libusb_context *ctx); +int LIBUSB_CALL libusb_get_next_timeout(libusb_context *ctx, + struct timeval *tv); + +/** \ingroup libusb_poll + * File descriptor for polling + */ +struct libusb_pollfd { + /** Numeric file descriptor */ + int fd; + + /** Event flags to poll for from . POLLIN indicates that you + * should monitor this file descriptor for becoming ready to read from, + * and POLLOUT indicates that you should monitor this file descriptor for + * nonblocking write readiness. */ + short events; +}; + +/** \ingroup libusb_poll + * Callback function, invoked when a new file descriptor should be added + * to the set of file descriptors monitored for events. + * \param fd the new file descriptor + * \param events events to monitor for, see \ref libusb_pollfd for a + * description + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_added_cb)(int fd, short events, + void *user_data); + +/** \ingroup libusb_poll + * Callback function, invoked when a file descriptor should be removed from + * the set of file descriptors being monitored for events. After returning + * from this callback, do not use that file descriptor again. + * \param fd the file descriptor to stop monitoring + * \param user_data User data pointer specified in + * libusb_set_pollfd_notifiers() call + * \see libusb_set_pollfd_notifiers() + */ +typedef void (LIBUSB_CALL *libusb_pollfd_removed_cb)(int fd, void *user_data); + +const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( + libusb_context *ctx); +void LIBUSB_CALL libusb_free_pollfds(const struct libusb_pollfd **pollfds); +void LIBUSB_CALL libusb_set_pollfd_notifiers(libusb_context *ctx, + libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, + void *user_data); + +/** \ingroup libusb_hotplug + * Callback handle. + * + * Callbacks handles are generated by libusb_hotplug_register_callback() + * and can be used to deregister callbacks. Callback handles are unique + * per libusb_context and it is safe to call libusb_hotplug_deregister_callback() + * on an already deregisted callback. + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * For more information, see \ref libusb_hotplug. + */ +typedef int libusb_hotplug_callback_handle; + +/** \ingroup libusb_hotplug + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * Flags for hotplug events */ +typedef enum { + /** Default value when not using any flags. */ + LIBUSB_HOTPLUG_NO_FLAGS = 0, + + /** Arm the callback and fire it for all matching currently attached devices. */ + LIBUSB_HOTPLUG_ENUMERATE = 1<<0, +} libusb_hotplug_flag; + +/** \ingroup libusb_hotplug + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * Hotplug events */ +typedef enum { + /** A device has been plugged in and is ready to use */ + LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED = 0x01, + + /** A device has left and is no longer available. + * It is the user's responsibility to call libusb_close on any handle associated with a disconnected device. + * It is safe to call libusb_get_device_descriptor on a device that has left */ + LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT = 0x02, +} libusb_hotplug_event; + +/** \ingroup libusb_hotplug + * Wildcard matching for hotplug events */ +#define LIBUSB_HOTPLUG_MATCH_ANY -1 + +/** \ingroup libusb_hotplug + * Hotplug callback function type. When requesting hotplug event notifications, + * you pass a pointer to a callback function of this type. + * + * This callback may be called by an internal event thread and as such it is + * recommended the callback do minimal processing before returning. + * + * libusb will call this function later, when a matching event had happened on + * a matching device. See \ref libusb_hotplug for more information. + * + * It is safe to call either libusb_hotplug_register_callback() or + * libusb_hotplug_deregister_callback() from within a callback function. + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * \param ctx context of this notification + * \param device libusb_device this event occurred on + * \param event event that occurred + * \param user_data user data provided when this callback was registered + * \returns bool whether this callback is finished processing events. + * returning 1 will cause this callback to be deregistered + */ +typedef int (LIBUSB_CALL *libusb_hotplug_callback_fn)(libusb_context *ctx, + libusb_device *device, + libusb_hotplug_event event, + void *user_data); + +/** \ingroup libusb_hotplug + * Register a hotplug callback function + * + * Register a callback with the libusb_context. The callback will fire + * when a matching event occurs on a matching device. The callback is + * armed until either it is deregistered with libusb_hotplug_deregister_callback() + * or the supplied callback returns 1 to indicate it is finished processing events. + * + * If the \ref LIBUSB_HOTPLUG_ENUMERATE is passed the callback will be + * called with a \ref LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED for all devices + * already plugged into the machine. Note that libusb modifies its internal + * device list from a separate thread, while calling hotplug callbacks from + * libusb_handle_events(), so it is possible for a device to already be present + * on, or removed from, its internal device list, while the hotplug callbacks + * still need to be dispatched. This means that when using \ref + * LIBUSB_HOTPLUG_ENUMERATE, your callback may be called twice for the arrival + * of the same device, once from libusb_hotplug_register_callback() and once + * from libusb_handle_events(); and/or your callback may be called for the + * removal of a device for which an arrived call was never made. + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * \param[in] ctx context to register this callback with + * \param[in] events bitwise or of events that will trigger this callback. See \ref + * libusb_hotplug_event + * \param[in] flags hotplug callback flags. See \ref libusb_hotplug_flag + * \param[in] vendor_id the vendor id to match or \ref LIBUSB_HOTPLUG_MATCH_ANY + * \param[in] product_id the product id to match or \ref LIBUSB_HOTPLUG_MATCH_ANY + * \param[in] dev_class the device class to match or \ref LIBUSB_HOTPLUG_MATCH_ANY + * \param[in] cb_fn the function to be invoked on a matching event/device + * \param[in] user_data user data to pass to the callback function + * \param[out] callback_handle pointer to store the handle of the allocated callback (can be NULL) + * \returns LIBUSB_SUCCESS on success LIBUSB_ERROR code on failure + */ +int LIBUSB_CALL libusb_hotplug_register_callback(libusb_context *ctx, + libusb_hotplug_event events, + libusb_hotplug_flag flags, + int vendor_id, int product_id, + int dev_class, + libusb_hotplug_callback_fn cb_fn, + void *user_data, + libusb_hotplug_callback_handle *callback_handle); + +/** \ingroup libusb_hotplug + * Deregisters a hotplug callback. + * + * Deregister a callback from a libusb_context. This function is safe to call from within + * a hotplug callback. + * + * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 + * + * \param[in] ctx context this callback is registered with + * \param[in] callback_handle the handle of the callback to deregister + */ +void LIBUSB_CALL libusb_hotplug_deregister_callback(libusb_context *ctx, + libusb_hotplug_callback_handle callback_handle); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/libusbi.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/libusbi.h new file mode 100644 index 00000000..b6496e75 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/libusbi.h @@ -0,0 +1,1153 @@ +/* + * Internal header for libusb + * Copyright © 2007-2009 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSBI_H +#define LIBUSBI_H + +#include + +#include + +#include +#include +#include +#include +#ifdef HAVE_POLL_H +#include +#endif +#ifdef HAVE_MISSING_H +#include +#endif + +#include "libusb.h" +#include "version.h" + +/* Inside the libusb code, mark all public functions as follows: + * return_type API_EXPORTED function_name(params) { ... } + * But if the function returns a pointer, mark it as follows: + * DEFAULT_VISIBILITY return_type * LIBUSB_CALL function_name(params) { ... } + * In the libusb public header, mark all declarations as: + * return_type LIBUSB_CALL function_name(params); + */ +#define API_EXPORTED LIBUSB_CALL DEFAULT_VISIBILITY + +#ifdef __cplusplus +extern "C" { +#endif + +#define DEVICE_DESC_LENGTH 18 + +#define USB_MAXENDPOINTS 32 +#define USB_MAXINTERFACES 32 +#define USB_MAXCONFIG 8 + +/* Backend specific capabilities */ +#define USBI_CAP_HAS_HID_ACCESS 0x00010000 +#define USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER 0x00020000 + +/* Maximum number of bytes in a log line */ +#define USBI_MAX_LOG_LEN 1024 +/* Terminator for log lines */ +#define USBI_LOG_LINE_END "\n" + +/* The following is used to silence warnings for unused variables */ +#define UNUSED(var) do { (void)(var); } while(0) + +#if !defined(ARRAYSIZE) +#define ARRAYSIZE(array) (sizeof(array) / sizeof(array[0])) +#endif + +struct list_head { + struct list_head *prev, *next; +}; + +/* Get an entry from the list + * ptr - the address of this list_head element in "type" + * type - the data type that contains "member" + * member - the list_head element in "type" + */ +#define list_entry(ptr, type, member) \ + ((type *)((uintptr_t)(ptr) - (uintptr_t)offsetof(type, member))) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +/* Get each entry from a list + * pos - A structure pointer has a "member" element + * head - list head + * member - the list_head element in "pos" + * type - the type of the first parameter + */ +#define list_for_each_entry(pos, head, member, type) \ + for (pos = list_entry((head)->next, type, member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, type, member)) + +#define list_for_each_entry_safe(pos, n, head, member, type) \ + for (pos = list_entry((head)->next, type, member), \ + n = list_entry(pos->member.next, type, member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, type, member)) + +#define list_empty(entry) ((entry)->next == (entry)) + +static inline void list_init(struct list_head *entry) +{ + entry->prev = entry->next = entry; +} + +static inline void list_add(struct list_head *entry, struct list_head *head) +{ + entry->next = head->next; + entry->prev = head; + + head->next->prev = entry; + head->next = entry; +} + +static inline void list_add_tail(struct list_head *entry, + struct list_head *head) +{ + entry->next = head; + entry->prev = head->prev; + + head->prev->next = entry; + head->prev = entry; +} + +static inline void list_del(struct list_head *entry) +{ + entry->next->prev = entry->prev; + entry->prev->next = entry->next; + entry->next = entry->prev = NULL; +} + +static inline void *usbi_reallocf(void *ptr, size_t size) +{ + void *ret = realloc(ptr, size); + if (!ret) + free(ptr); + return ret; +} + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *mptr = (ptr); \ + (type *)( (char *)mptr - offsetof(type,member) );}) + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0) + +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +#define TIMEVAL_TV_SEC_TYPE long +#else +#define TIMEVAL_TV_SEC_TYPE time_t +#endif + +/* Some platforms don't have this define */ +#ifndef TIMESPEC_TO_TIMEVAL +#define TIMESPEC_TO_TIMEVAL(tv, ts) \ + do { \ + (tv)->tv_sec = (TIMEVAL_TV_SEC_TYPE) (ts)->tv_sec; \ + (tv)->tv_usec = (ts)->tv_nsec / 1000; \ + } while (0) +#endif + +void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, + const char *function, const char *format, ...); + +void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, + const char *function, const char *format, va_list args); + +#if !defined(_MSC_VER) || _MSC_VER >= 1400 + +#ifdef ENABLE_LOGGING +#define _usbi_log(ctx, level, ...) usbi_log(ctx, level, __FUNCTION__, __VA_ARGS__) +#define usbi_dbg(...) _usbi_log(NULL, LIBUSB_LOG_LEVEL_DEBUG, __VA_ARGS__) +#else +#define _usbi_log(ctx, level, ...) do { (void)(ctx); } while(0) +#define usbi_dbg(...) do {} while(0) +#endif + +#define usbi_info(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_INFO, __VA_ARGS__) +#define usbi_warn(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_WARNING, __VA_ARGS__) +#define usbi_err(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_ERROR, __VA_ARGS__) + +#else /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ + +#ifdef ENABLE_LOGGING +#define LOG_BODY(ctxt, level) \ +{ \ + va_list args; \ + va_start(args, format); \ + usbi_log_v(ctxt, level, "", format, args); \ + va_end(args); \ +} +#else +#define LOG_BODY(ctxt, level) \ +{ \ + (void)(ctxt); \ +} +#endif + +static inline void usbi_info(struct libusb_context *ctx, const char *format, ...) + LOG_BODY(ctx, LIBUSB_LOG_LEVEL_INFO) +static inline void usbi_warn(struct libusb_context *ctx, const char *format, ...) + LOG_BODY(ctx, LIBUSB_LOG_LEVEL_WARNING) +static inline void usbi_err(struct libusb_context *ctx, const char *format, ...) + LOG_BODY(ctx, LIBUSB_LOG_LEVEL_ERROR) + +static inline void usbi_dbg(const char *format, ...) + LOG_BODY(NULL, LIBUSB_LOG_LEVEL_DEBUG) + +#endif /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ + +#define USBI_GET_CONTEXT(ctx) \ + do { \ + if (!(ctx)) \ + (ctx) = usbi_default_context; \ + } while(0) + +#define DEVICE_CTX(dev) ((dev)->ctx) +#define HANDLE_CTX(handle) (DEVICE_CTX((handle)->dev)) +#define TRANSFER_CTX(transfer) (HANDLE_CTX((transfer)->dev_handle)) +#define ITRANSFER_CTX(transfer) \ + (TRANSFER_CTX(USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer))) + +#define IS_EPIN(ep) (0 != ((ep) & LIBUSB_ENDPOINT_IN)) +#define IS_EPOUT(ep) (!IS_EPIN(ep)) +#define IS_XFERIN(xfer) (0 != ((xfer)->endpoint & LIBUSB_ENDPOINT_IN)) +#define IS_XFEROUT(xfer) (!IS_XFERIN(xfer)) + +/* Internal abstraction for thread synchronization */ +#if defined(THREADS_POSIX) +#include "os/threads_posix.h" +#elif defined(OS_WINDOWS) || defined(OS_WINCE) +#include "os/threads_windows.h" +#endif + +extern struct libusb_context *usbi_default_context; + +/* Forward declaration for use in context (fully defined inside poll abstraction) */ +struct pollfd; + +struct libusb_context { + int debug; + int debug_fixed; + + /* internal event pipe, used for signalling occurrence of an internal event. */ + int event_pipe[2]; + + struct list_head usb_devs; + usbi_mutex_t usb_devs_lock; + + /* A list of open handles. Backends are free to traverse this if required. + */ + struct list_head open_devs; + usbi_mutex_t open_devs_lock; + + /* A list of registered hotplug callbacks */ + struct list_head hotplug_cbs; + usbi_mutex_t hotplug_cbs_lock; + + /* this is a list of in-flight transfer handles, sorted by timeout + * expiration. URBs to timeout the soonest are placed at the beginning of + * the list, URBs that will time out later are placed after, and urbs with + * infinite timeout are always placed at the very end. */ + struct list_head flying_transfers; + /* Note paths taking both this and usbi_transfer->lock must always + * take this lock first */ + usbi_mutex_t flying_transfers_lock; + + /* user callbacks for pollfd changes */ + libusb_pollfd_added_cb fd_added_cb; + libusb_pollfd_removed_cb fd_removed_cb; + void *fd_cb_user_data; + + /* ensures that only one thread is handling events at any one time */ + usbi_mutex_t events_lock; + + /* used to see if there is an active thread doing event handling */ + int event_handler_active; + + /* A thread-local storage key to track which thread is performing event + * handling */ + usbi_tls_key_t event_handling_key; + + /* used to wait for event completion in threads other than the one that is + * event handling */ + usbi_mutex_t event_waiters_lock; + usbi_cond_t event_waiters_cond; + + /* A lock to protect internal context event data. */ + usbi_mutex_t event_data_lock; + + /* A bitmask of flags that are set to indicate specific events that need to + * be handled. Protected by event_data_lock. */ + unsigned int event_flags; + + /* A counter that is set when we want to interrupt and prevent event handling, + * in order to safely close a device. Protected by event_data_lock. */ + unsigned int device_close; + + /* list and count of poll fds and an array of poll fd structures that is + * (re)allocated as necessary prior to polling. Protected by event_data_lock. */ + struct list_head ipollfds; + struct pollfd *pollfds; + POLL_NFDS_TYPE pollfds_cnt; + + /* A list of pending hotplug messages. Protected by event_data_lock. */ + struct list_head hotplug_msgs; + + /* A list of pending completed transfers. Protected by event_data_lock. */ + struct list_head completed_transfers; + +#ifdef USBI_TIMERFD_AVAILABLE + /* used for timeout handling, if supported by OS. + * this timerfd is maintained to trigger on the next pending timeout */ + int timerfd; +#endif + + struct list_head list; +}; + +enum usbi_event_flags { + /* The list of pollfds has been modified */ + USBI_EVENT_POLLFDS_MODIFIED = 1 << 0, + + /* The user has interrupted the event handler */ + USBI_EVENT_USER_INTERRUPT = 1 << 1, +}; + +/* Macros for managing event handling state */ +#define usbi_handling_events(ctx) \ + (usbi_tls_key_get((ctx)->event_handling_key) != NULL) + +#define usbi_start_event_handling(ctx) \ + usbi_tls_key_set((ctx)->event_handling_key, ctx) + +#define usbi_end_event_handling(ctx) \ + usbi_tls_key_set((ctx)->event_handling_key, NULL) + +/* Update the following macro if new event sources are added */ +#define usbi_pending_events(ctx) \ + ((ctx)->event_flags || (ctx)->device_close \ + || !list_empty(&(ctx)->hotplug_msgs) || !list_empty(&(ctx)->completed_transfers)) + +#ifdef USBI_TIMERFD_AVAILABLE +#define usbi_using_timerfd(ctx) ((ctx)->timerfd >= 0) +#else +#define usbi_using_timerfd(ctx) (0) +#endif + +struct libusb_device { + /* lock protects refcnt, everything else is finalized at initialization + * time */ + usbi_mutex_t lock; + int refcnt; + + struct libusb_context *ctx; + + uint8_t bus_number; + uint8_t port_number; + struct libusb_device* parent_dev; + uint8_t device_address; + uint8_t num_configurations; + enum libusb_speed speed; + + struct list_head list; + unsigned long session_data; + + #ifdef OS_WINDOWS + int has_winusb_driver; + #endif + + struct libusb_device_descriptor device_descriptor; + int attached; + + unsigned char os_priv +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif +#if defined(OS_SUNOS) + __attribute__ ((aligned (8))); +#else + ; +#endif +}; + +struct libusb_device_handle { + /* lock protects claimed_interfaces */ + usbi_mutex_t lock; + unsigned long claimed_interfaces; + + struct list_head list; + struct libusb_device *dev; + int auto_detach_kernel_driver; + unsigned char os_priv +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif +#if defined(OS_SUNOS) + __attribute__ ((aligned (8))); +#else + ; +#endif +}; + +enum { + USBI_CLOCK_MONOTONIC, + USBI_CLOCK_REALTIME +}; + +/* in-memory transfer layout: + * + * 1. struct usbi_transfer + * 2. struct libusb_transfer (which includes iso packets) [variable size] + * 3. os private data [variable size] + * + * from a libusb_transfer, you can get the usbi_transfer by rewinding the + * appropriate number of bytes. + * the usbi_transfer includes the number of allocated packets, so you can + * determine the size of the transfer and hence the start and length of the + * OS-private data. + */ + +struct usbi_transfer { + int num_iso_packets; + struct list_head list; + struct list_head completed_list; + struct timeval timeout; + int transferred; + uint32_t stream_id; + uint8_t state_flags; /* Protected by usbi_transfer->lock */ + uint8_t timeout_flags; /* Protected by the flying_stransfers_lock */ + + /* this lock is held during libusb_submit_transfer() and + * libusb_cancel_transfer() (allowing the OS backend to prevent duplicate + * cancellation, submission-during-cancellation, etc). the OS backend + * should also take this lock in the handle_events path, to prevent the user + * cancelling the transfer from another thread while you are processing + * its completion (presumably there would be races within your OS backend + * if this were possible). + * Note paths taking both this and the flying_transfers_lock must + * always take the flying_transfers_lock first */ + usbi_mutex_t lock; +}; + +enum usbi_transfer_state_flags { + /* Transfer successfully submitted by backend */ + USBI_TRANSFER_IN_FLIGHT = 1 << 0, + + /* Cancellation was requested via libusb_cancel_transfer() */ + USBI_TRANSFER_CANCELLING = 1 << 1, + + /* Operation on the transfer failed because the device disappeared */ + USBI_TRANSFER_DEVICE_DISAPPEARED = 1 << 2, +}; + +enum usbi_transfer_timeout_flags { + /* Set by backend submit_transfer() if the OS handles timeout */ + USBI_TRANSFER_OS_HANDLES_TIMEOUT = 1 << 0, + + /* The transfer timeout has been handled */ + USBI_TRANSFER_TIMEOUT_HANDLED = 1 << 1, + + /* The transfer timeout was successfully processed */ + USBI_TRANSFER_TIMED_OUT = 1 << 2, +}; + +#define USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer) \ + ((struct libusb_transfer *)(((unsigned char *)(transfer)) \ + + sizeof(struct usbi_transfer))) +#define LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer) \ + ((struct usbi_transfer *)(((unsigned char *)(transfer)) \ + - sizeof(struct usbi_transfer))) + +static inline void *usbi_transfer_get_os_priv(struct usbi_transfer *transfer) +{ + return ((unsigned char *)transfer) + sizeof(struct usbi_transfer) + + sizeof(struct libusb_transfer) + + (transfer->num_iso_packets + * sizeof(struct libusb_iso_packet_descriptor)); +} + +/* bus structures */ + +/* All standard descriptors have these 2 fields in common */ +struct usb_descriptor_header { + uint8_t bLength; + uint8_t bDescriptorType; +}; + +/* shared data and functions */ + +int usbi_io_init(struct libusb_context *ctx); +void usbi_io_exit(struct libusb_context *ctx); + +struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, + unsigned long session_id); +struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, + unsigned long session_id); +int usbi_sanitize_device(struct libusb_device *dev); +void usbi_handle_disconnect(struct libusb_device_handle *dev_handle); + +int usbi_handle_transfer_completion(struct usbi_transfer *itransfer, + enum libusb_transfer_status status); +int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer); +void usbi_signal_transfer_completion(struct usbi_transfer *transfer); + +int usbi_parse_descriptor(const unsigned char *source, const char *descriptor, + void *dest, int host_endian); +int usbi_device_cache_descriptor(libusb_device *dev); +int usbi_get_config_index_by_value(struct libusb_device *dev, + uint8_t bConfigurationValue, int *idx); + +void usbi_connect_device (struct libusb_device *dev); +void usbi_disconnect_device (struct libusb_device *dev); + +int usbi_signal_event(struct libusb_context *ctx); +int usbi_clear_event(struct libusb_context *ctx); + +/* Internal abstraction for poll (needs struct usbi_transfer on Windows) */ +#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) || defined(OS_NETBSD) ||\ + defined(OS_HAIKU) || defined(OS_SUNOS) +#include +#include "os/poll_posix.h" +#elif defined(OS_WINDOWS) || defined(OS_WINCE) +#include "os/poll_windows.h" +#endif + +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#define snprintf usbi_snprintf +#define vsnprintf usbi_vsnprintf +int usbi_snprintf(char *dst, size_t size, const char *format, ...); +int usbi_vsnprintf(char *dst, size_t size, const char *format, va_list ap); +#define LIBUSB_PRINTF_WIN32 +#endif + +struct usbi_pollfd { + /* must come first */ + struct libusb_pollfd pollfd; + + struct list_head list; +}; + +int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events); +void usbi_remove_pollfd(struct libusb_context *ctx, int fd); + +/* device discovery */ + +/* we traverse usbfs without knowing how many devices we are going to find. + * so we create this discovered_devs model which is similar to a linked-list + * which grows when required. it can be freed once discovery has completed, + * eliminating the need for a list node in the libusb_device structure + * itself. */ +struct discovered_devs { + size_t len; + size_t capacity; + struct libusb_device *devices +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + [] /* valid C99 code */ +#else + [0] /* non-standard, but usually working code */ +#endif + ; +}; + +struct discovered_devs *discovered_devs_append( + struct discovered_devs *discdevs, struct libusb_device *dev); + +/* OS abstraction */ + +/* This is the interface that OS backends need to implement. + * All fields are mandatory, except ones explicitly noted as optional. */ +struct usbi_os_backend { + /* A human-readable name for your backend, e.g. "Linux usbfs" */ + const char *name; + + /* Binary mask for backend specific capabilities */ + uint32_t caps; + + /* Perform initialization of your backend. You might use this function + * to determine specific capabilities of the system, allocate required + * data structures for later, etc. + * + * This function is called when a libusb user initializes the library + * prior to use. + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*init)(struct libusb_context *ctx); + + /* Deinitialization. Optional. This function should destroy anything + * that was set up by init. + * + * This function is called when the user deinitializes the library. + */ + void (*exit)(void); + + /* Enumerate all the USB devices on the system, returning them in a list + * of discovered devices. + * + * Your implementation should enumerate all devices on the system, + * regardless of whether they have been seen before or not. + * + * When you have found a device, compute a session ID for it. The session + * ID should uniquely represent that particular device for that particular + * connection session since boot (i.e. if you disconnect and reconnect a + * device immediately after, it should be assigned a different session ID). + * If your OS cannot provide a unique session ID as described above, + * presenting a session ID of (bus_number << 8 | device_address) should + * be sufficient. Bus numbers and device addresses wrap and get reused, + * but that is an unlikely case. + * + * After computing a session ID for a device, call + * usbi_get_device_by_session_id(). This function checks if libusb already + * knows about the device, and if so, it provides you with a reference + * to a libusb_device structure for it. + * + * If usbi_get_device_by_session_id() returns NULL, it is time to allocate + * a new device structure for the device. Call usbi_alloc_device() to + * obtain a new libusb_device structure with reference count 1. Populate + * the bus_number and device_address attributes of the new device, and + * perform any other internal backend initialization you need to do. At + * this point, you should be ready to provide device descriptors and so + * on through the get_*_descriptor functions. Finally, call + * usbi_sanitize_device() to perform some final sanity checks on the + * device. Assuming all of the above succeeded, we can now continue. + * If any of the above failed, remember to unreference the device that + * was returned by usbi_alloc_device(). + * + * At this stage we have a populated libusb_device structure (either one + * that was found earlier, or one that we have just allocated and + * populated). This can now be added to the discovered devices list + * using discovered_devs_append(). Note that discovered_devs_append() + * may reallocate the list, returning a new location for it, and also + * note that reallocation can fail. Your backend should handle these + * error conditions appropriately. + * + * This function should not generate any bus I/O and should not block. + * If I/O is required (e.g. reading the active configuration value), it is + * OK to ignore these suggestions :) + * + * This function is executed when the user wishes to retrieve a list + * of USB devices connected to the system. + * + * If the backend has hotplug support, this function is not used! + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*get_device_list)(struct libusb_context *ctx, + struct discovered_devs **discdevs); + + /* Apps which were written before hotplug support, may listen for + * hotplug events on their own and call libusb_get_device_list on + * device addition. In this case libusb_get_device_list will likely + * return a list without the new device in there, as the hotplug + * event thread will still be busy enumerating the device, which may + * take a while, or may not even have seen the event yet. + * + * To avoid this libusb_get_device_list will call this optional + * function for backends with hotplug support before copying + * ctx->usb_devs to the user. In this function the backend should + * ensure any pending hotplug events are fully processed before + * returning. + * + * Optional, should be implemented by backends with hotplug support. + */ + void (*hotplug_poll)(void); + + /* Open a device for I/O and other USB operations. The device handle + * is preallocated for you, you can retrieve the device in question + * through handle->dev. + * + * Your backend should allocate any internal resources required for I/O + * and other operations so that those operations can happen (hopefully) + * without hiccup. This is also a good place to inform libusb that it + * should monitor certain file descriptors related to this device - + * see the usbi_add_pollfd() function. + * + * This function should not generate any bus I/O and should not block. + * + * This function is called when the user attempts to obtain a device + * handle for a device. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_ACCESS if the user has insufficient permissions + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since + * discovery + * - another LIBUSB_ERROR code on other failure + * + * Do not worry about freeing the handle on failed open, the upper layers + * do this for you. + */ + int (*open)(struct libusb_device_handle *dev_handle); + + /* Close a device such that the handle cannot be used again. Your backend + * should destroy any resources that were allocated in the open path. + * This may also be a good place to call usbi_remove_pollfd() to inform + * libusb of any file descriptors associated with this device that should + * no longer be monitored. + * + * This function is called when the user closes a device handle. + */ + void (*close)(struct libusb_device_handle *dev_handle); + + /* Retrieve the device descriptor from a device. + * + * The descriptor should be retrieved from memory, NOT via bus I/O to the + * device. This means that you may have to cache it in a private structure + * during get_device_list enumeration. Alternatively, you may be able + * to retrieve it from a kernel interface (some Linux setups can do this) + * still without generating bus I/O. + * + * This function is expected to write DEVICE_DESC_LENGTH (18) bytes into + * buffer, which is guaranteed to be big enough. + * + * This function is called when sanity-checking a device before adding + * it to the list of discovered devices, and also when the user requests + * to read the device descriptor. + * + * This function is expected to return the descriptor in bus-endian format + * (LE). If it returns the multi-byte values in host-endian format, + * set the host_endian output parameter to "1". + * + * Return 0 on success or a LIBUSB_ERROR code on failure. + */ + int (*get_device_descriptor)(struct libusb_device *device, + unsigned char *buffer, int *host_endian); + + /* Get the ACTIVE configuration descriptor for a device. + * + * The descriptor should be retrieved from memory, NOT via bus I/O to the + * device. This means that you may have to cache it in a private structure + * during get_device_list enumeration. You may also have to keep track + * of which configuration is active when the user changes it. + * + * This function is expected to write len bytes of data into buffer, which + * is guaranteed to be big enough. If you can only do a partial write, + * return an error code. + * + * This function is expected to return the descriptor in bus-endian format + * (LE). If it returns the multi-byte values in host-endian format, + * set the host_endian output parameter to "1". + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state + * - another LIBUSB_ERROR code on other failure + */ + int (*get_active_config_descriptor)(struct libusb_device *device, + unsigned char *buffer, size_t len, int *host_endian); + + /* Get a specific configuration descriptor for a device. + * + * The descriptor should be retrieved from memory, NOT via bus I/O to the + * device. This means that you may have to cache it in a private structure + * during get_device_list enumeration. + * + * The requested descriptor is expressed as a zero-based index (i.e. 0 + * indicates that we are requesting the first descriptor). The index does + * not (necessarily) equal the bConfigurationValue of the configuration + * being requested. + * + * This function is expected to write len bytes of data into buffer, which + * is guaranteed to be big enough. If you can only do a partial write, + * return an error code. + * + * This function is expected to return the descriptor in bus-endian format + * (LE). If it returns the multi-byte values in host-endian format, + * set the host_endian output parameter to "1". + * + * Return the length read on success or a LIBUSB_ERROR code on failure. + */ + int (*get_config_descriptor)(struct libusb_device *device, + uint8_t config_index, unsigned char *buffer, size_t len, + int *host_endian); + + /* Like get_config_descriptor but then by bConfigurationValue instead + * of by index. + * + * Optional, if not present the core will call get_config_descriptor + * for all configs until it finds the desired bConfigurationValue. + * + * Returns a pointer to the raw-descriptor in *buffer, this memory + * is valid as long as device is valid. + * + * Returns the length of the returned raw-descriptor on success, + * or a LIBUSB_ERROR code on failure. + */ + int (*get_config_descriptor_by_value)(struct libusb_device *device, + uint8_t bConfigurationValue, unsigned char **buffer, + int *host_endian); + + /* Get the bConfigurationValue for the active configuration for a device. + * Optional. This should only be implemented if you can retrieve it from + * cache (don't generate I/O). + * + * If you cannot retrieve this from cache, either do not implement this + * function, or return LIBUSB_ERROR_NOT_SUPPORTED. This will cause + * libusb to retrieve the information through a standard control transfer. + * + * This function must be non-blocking. + * Return: + * - 0 on success + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - LIBUSB_ERROR_NOT_SUPPORTED if the value cannot be retrieved without + * blocking + * - another LIBUSB_ERROR code on other failure. + */ + int (*get_configuration)(struct libusb_device_handle *dev_handle, int *config); + + /* Set the active configuration for a device. + * + * A configuration value of -1 should put the device in unconfigured state. + * + * This function can block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the configuration does not exist + * - LIBUSB_ERROR_BUSY if interfaces are currently claimed (and hence + * configuration cannot be changed) + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure. + */ + int (*set_configuration)(struct libusb_device_handle *dev_handle, int config); + + /* Claim an interface. When claimed, the application can then perform + * I/O to an interface's endpoints. + * + * This function should not generate any bus I/O and should not block. + * Interface claiming is a logical operation that simply ensures that + * no other drivers/applications are using the interface, and after + * claiming, no other drivers/applications can use the interface because + * we now "own" it. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the interface does not exist + * - LIBUSB_ERROR_BUSY if the interface is in use by another driver/app + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*claim_interface)(struct libusb_device_handle *dev_handle, int interface_number); + + /* Release a previously claimed interface. + * + * This function should also generate a SET_INTERFACE control request, + * resetting the alternate setting of that interface to 0. It's OK for + * this function to block as a result. + * + * You will only ever be asked to release an interface which was + * successfully claimed earlier. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*release_interface)(struct libusb_device_handle *dev_handle, int interface_number); + + /* Set the alternate setting for an interface. + * + * You will only ever be asked to set the alternate setting for an + * interface which was successfully claimed earlier. + * + * It's OK for this function to block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the alternate setting does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*set_interface_altsetting)(struct libusb_device_handle *dev_handle, + int interface_number, int altsetting); + + /* Clear a halt/stall condition on an endpoint. + * + * It's OK for this function to block. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*clear_halt)(struct libusb_device_handle *dev_handle, + unsigned char endpoint); + + /* Perform a USB port reset to reinitialize a device. + * + * If possible, the device handle should still be usable after the reset + * completes, assuming that the device descriptors did not change during + * reset and all previous interface state can be restored. + * + * If something changes, or you cannot easily locate/verify the resetted + * device, return LIBUSB_ERROR_NOT_FOUND. This prompts the application + * to close the old handle and re-enumerate the device. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the device + * has been disconnected since it was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*reset_device)(struct libusb_device_handle *dev_handle); + + /* Alloc num_streams usb3 bulk streams on the passed in endpoints */ + int (*alloc_streams)(struct libusb_device_handle *dev_handle, + uint32_t num_streams, unsigned char *endpoints, int num_endpoints); + + /* Free usb3 bulk streams allocated with alloc_streams */ + int (*free_streams)(struct libusb_device_handle *dev_handle, + unsigned char *endpoints, int num_endpoints); + + /* Allocate persistent DMA memory for the given device, suitable for + * zerocopy. May return NULL on failure. Optional to implement. + */ + unsigned char *(*dev_mem_alloc)(struct libusb_device_handle *handle, + size_t len); + + /* Free memory allocated by dev_mem_alloc. */ + int (*dev_mem_free)(struct libusb_device_handle *handle, + unsigned char *buffer, size_t len); + + /* Determine if a kernel driver is active on an interface. Optional. + * + * The presence of a kernel driver on an interface indicates that any + * calls to claim_interface would fail with the LIBUSB_ERROR_BUSY code. + * + * Return: + * - 0 if no driver is active + * - 1 if a driver is active + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*kernel_driver_active)(struct libusb_device_handle *dev_handle, + int interface_number); + + /* Detach a kernel driver from an interface. Optional. + * + * After detaching a kernel driver, the interface should be available + * for claim. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - another LIBUSB_ERROR code on other failure + */ + int (*detach_kernel_driver)(struct libusb_device_handle *dev_handle, + int interface_number); + + /* Attach a kernel driver to an interface. Optional. + * + * Reattach a kernel driver to the device. + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active + * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it + * was opened + * - LIBUSB_ERROR_BUSY if a program or driver has claimed the interface, + * preventing reattachment + * - another LIBUSB_ERROR code on other failure + */ + int (*attach_kernel_driver)(struct libusb_device_handle *dev_handle, + int interface_number); + + /* Destroy a device. Optional. + * + * This function is called when the last reference to a device is + * destroyed. It should free any resources allocated in the get_device_list + * path. + */ + void (*destroy_device)(struct libusb_device *dev); + + /* Submit a transfer. Your implementation should take the transfer, + * morph it into whatever form your platform requires, and submit it + * asynchronously. + * + * This function must not block. + * + * This function gets called with the flying_transfers_lock locked! + * + * Return: + * - 0 on success + * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * - another LIBUSB_ERROR code on other failure + */ + int (*submit_transfer)(struct usbi_transfer *itransfer); + + /* Cancel a previously submitted transfer. + * + * This function must not block. The transfer cancellation must complete + * later, resulting in a call to usbi_handle_transfer_cancellation() + * from the context of handle_events. + */ + int (*cancel_transfer)(struct usbi_transfer *itransfer); + + /* Clear a transfer as if it has completed or cancelled, but do not + * report any completion/cancellation to the library. You should free + * all private data from the transfer as if you were just about to report + * completion or cancellation. + * + * This function might seem a bit out of place. It is used when libusb + * detects a disconnected device - it calls this function for all pending + * transfers before reporting completion (with the disconnect code) to + * the user. Maybe we can improve upon this internal interface in future. + */ + void (*clear_transfer_priv)(struct usbi_transfer *itransfer); + + /* Handle any pending events on file descriptors. Optional. + * + * Provide this function when file descriptors directly indicate device + * or transfer activity. If your backend does not have such file descriptors, + * implement the handle_transfer_completion function below. + * + * This involves monitoring any active transfers and processing their + * completion or cancellation. + * + * The function is passed an array of pollfd structures (size nfds) + * as a result of the poll() system call. The num_ready parameter + * indicates the number of file descriptors that have reported events + * (i.e. the poll() return value). This should be enough information + * for you to determine which actions need to be taken on the currently + * active transfers. + * + * For any cancelled transfers, call usbi_handle_transfer_cancellation(). + * For completed transfers, call usbi_handle_transfer_completion(). + * For control/bulk/interrupt transfers, populate the "transferred" + * element of the appropriate usbi_transfer structure before calling the + * above functions. For isochronous transfers, populate the status and + * transferred fields of the iso packet descriptors of the transfer. + * + * This function should also be able to detect disconnection of the + * device, reporting that situation with usbi_handle_disconnect(). + * + * When processing an event related to a transfer, you probably want to + * take usbi_transfer.lock to prevent races. See the documentation for + * the usbi_transfer structure. + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*handle_events)(struct libusb_context *ctx, + struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready); + + /* Handle transfer completion. Optional. + * + * Provide this function when there are no file descriptors available + * that directly indicate device or transfer activity. If your backend does + * have such file descriptors, implement the handle_events function above. + * + * Your backend must tell the library when a transfer has completed by + * calling usbi_signal_transfer_completion(). You should store any private + * information about the transfer and its completion status in the transfer's + * private backend data. + * + * During event handling, this function will be called on each transfer for + * which usbi_signal_transfer_completion() was called. + * + * For any cancelled transfers, call usbi_handle_transfer_cancellation(). + * For completed transfers, call usbi_handle_transfer_completion(). + * For control/bulk/interrupt transfers, populate the "transferred" + * element of the appropriate usbi_transfer structure before calling the + * above functions. For isochronous transfers, populate the status and + * transferred fields of the iso packet descriptors of the transfer. + * + * Return 0 on success, or a LIBUSB_ERROR code on failure. + */ + int (*handle_transfer_completion)(struct usbi_transfer *itransfer); + + /* Get time from specified clock. At least two clocks must be implemented + by the backend: USBI_CLOCK_REALTIME, and USBI_CLOCK_MONOTONIC. + + Description of clocks: + USBI_CLOCK_REALTIME : clock returns time since system epoch. + USBI_CLOCK_MONOTONIC: clock returns time since unspecified start + time (usually boot). + */ + int (*clock_gettime)(int clkid, struct timespec *tp); + +#ifdef USBI_TIMERFD_AVAILABLE + /* clock ID of the clock that should be used for timerfd */ + clockid_t (*get_timerfd_clockid)(void); +#endif + + /* Number of bytes to reserve for per-device private backend data. + * This private data area is accessible through the "os_priv" field of + * struct libusb_device. */ + size_t device_priv_size; + + /* Number of bytes to reserve for per-handle private backend data. + * This private data area is accessible through the "os_priv" field of + * struct libusb_device. */ + size_t device_handle_priv_size; + + /* Number of bytes to reserve for per-transfer private backend data. + * This private data area is accessible by calling + * usbi_transfer_get_os_priv() on the appropriate usbi_transfer instance. + */ + size_t transfer_priv_size; +}; + +extern const struct usbi_os_backend * const usbi_backend; + +extern const struct usbi_os_backend linux_usbfs_backend; +extern const struct usbi_os_backend darwin_backend; +extern const struct usbi_os_backend openbsd_backend; +extern const struct usbi_os_backend netbsd_backend; +extern const struct usbi_os_backend windows_backend; +extern const struct usbi_os_backend usbdk_backend; +extern const struct usbi_os_backend wince_backend; +extern const struct usbi_os_backend haiku_usb_raw_backend; +extern const struct usbi_os_backend sunos_backend; + +extern struct list_head active_contexts_list; +extern usbi_mutex_static_t active_contexts_lock; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/darwin_usb.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/darwin_usb.c new file mode 100644 index 00000000..7b868109 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/darwin_usb.c @@ -0,0 +1,2117 @@ +/* -*- Mode: C; indent-tabs-mode:nil -*- */ +/* + * darwin backend for libusb 1.0 + * Copyright © 2008-2016 Nathan Hjelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && MAC_OS_X_VERSION_MIN_REQUIRED < 101200 + #include +#endif + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101200 +/* Apple deprecated the darwin atomics in 10.12 in favor of C11 atomics */ +#include +#define libusb_darwin_atomic_fetch_add(x, y) atomic_fetch_add(x, y) + +_Atomic int32_t initCount = ATOMIC_VAR_INIT(0); +#else +/* use darwin atomics if the target is older than 10.12 */ +#include + +/* OSAtomicAdd32Barrier returns the new value */ +#define libusb_darwin_atomic_fetch_add(x, y) (OSAtomicAdd32Barrier(y, x) - y) + +static volatile int32_t initCount = 0; +#endif + +#include "darwin_usb.h" + +/* async event thread */ +static pthread_mutex_t libusb_darwin_at_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t libusb_darwin_at_cond = PTHREAD_COND_INITIALIZER; + +static pthread_once_t darwin_init_once = PTHREAD_ONCE_INIT; + +static clock_serv_t clock_realtime; +static clock_serv_t clock_monotonic; + +static CFRunLoopRef libusb_darwin_acfl = NULL; /* event cf loop */ +static CFRunLoopSourceRef libusb_darwin_acfls = NULL; /* shutdown signal for event cf loop */ + +static usbi_mutex_t darwin_cached_devices_lock = PTHREAD_MUTEX_INITIALIZER; +static struct list_head darwin_cached_devices = {&darwin_cached_devices, &darwin_cached_devices}; +static char *darwin_device_class = kIOUSBDeviceClassName; + +#define DARWIN_CACHED_DEVICE(a) ((struct darwin_cached_device *) (((struct darwin_device_priv *)((a)->os_priv))->dev)) + +/* async event thread */ +static pthread_t libusb_darwin_at; + +static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian); +static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface); +static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface); +static int darwin_reset_device(struct libusb_device_handle *dev_handle); +static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0); + +static int darwin_scan_devices(struct libusb_context *ctx); +static int process_new_device (struct libusb_context *ctx, io_service_t service); + +#if defined(ENABLE_LOGGING) +static const char *darwin_error_str (int result) { + static char string_buffer[50]; + switch (result) { + case kIOReturnSuccess: + return "no error"; + case kIOReturnNotOpen: + return "device not opened for exclusive access"; + case kIOReturnNoDevice: + return "no connection to an IOService"; + case kIOUSBNoAsyncPortErr: + return "no async port has been opened for interface"; + case kIOReturnExclusiveAccess: + return "another process has device opened for exclusive access"; + case kIOUSBPipeStalled: + return "pipe is stalled"; + case kIOReturnError: + return "could not establish a connection to the Darwin kernel"; + case kIOUSBTransactionTimeout: + return "transaction timed out"; + case kIOReturnBadArgument: + return "invalid argument"; + case kIOReturnAborted: + return "transaction aborted"; + case kIOReturnNotResponding: + return "device not responding"; + case kIOReturnOverrun: + return "data overrun"; + case kIOReturnCannotWire: + return "physical memory can not be wired down"; + case kIOReturnNoResources: + return "out of resources"; + case kIOUSBHighSpeedSplitError: + return "high speed split error"; + default: + snprintf(string_buffer, sizeof(string_buffer), "unknown error (0x%x)", result); + return string_buffer; + } +} +#endif + +static int darwin_to_libusb (int result) { + switch (result) { + case kIOReturnUnderrun: + usbi_dbg ("kIOReturnUnderrun"); + return LIBUSB_SUCCESS; + case kIOReturnSuccess: + usbi_dbg ("kIOReturnSuccess"); + return LIBUSB_SUCCESS; + case kIOReturnNotOpen: + usbi_dbg ("kIOReturnNotOpen"); + return LIBUSB_ERROR_NO_DEVICE; + case kIOReturnNoDevice: + usbi_dbg ("kIOReturnNoDevice"); + return LIBUSB_ERROR_NO_DEVICE; + case kIOReturnExclusiveAccess: + usbi_dbg ("kIOReturnExclusiveAccess"); + return LIBUSB_ERROR_ACCESS; + case kIOUSBPipeStalled: + usbi_dbg ("kIOUSBPipeStalled"); + return LIBUSB_ERROR_PIPE; + case kIOReturnBadArgument: + usbi_dbg ("kIOUSBBadArgument"); + return LIBUSB_ERROR_INVALID_PARAM; + case kIOUSBTransactionTimeout: + usbi_dbg ("kIOUSBTransactionTimeout"); + return LIBUSB_ERROR_TIMEOUT; + case kIOReturnNotResponding: + usbi_dbg ("kIOReturnNotResponding"); + return LIBUSB_ERROR_OTHER; + case kIOReturnAborted: + usbi_dbg ("kIOReturnAborted"); + return LIBUSB_ERROR_OTHER; + case kIOReturnError: + usbi_dbg ("kIOReturnError"); + return LIBUSB_ERROR_OTHER; + case kIOUSBNoAsyncPortErr: + usbi_dbg ("kIOUSBNoAsyncPortErr"); + return LIBUSB_ERROR_OTHER; + default: + usbi_dbg ("darwin_to_libusb Other error"); + return LIBUSB_ERROR_OTHER; + } +} + +/* this function must be called with the darwin_cached_devices_lock held */ +static void darwin_deref_cached_device(struct darwin_cached_device *cached_dev) { + cached_dev->refcount--; + /* free the device and remove it from the cache */ + if (0 == cached_dev->refcount) { + list_del(&cached_dev->list); + + (*(cached_dev->device))->Release(cached_dev->device); + free (cached_dev); + } +} + +static void darwin_ref_cached_device(struct darwin_cached_device *cached_dev) { + cached_dev->refcount++; +} + +static int ep_to_pipeRef(struct libusb_device_handle *dev_handle, uint8_t ep, uint8_t *pipep, uint8_t *ifcp, struct darwin_interface **interface_out) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + + /* current interface */ + struct darwin_interface *cInterface; + + int8_t i, iface; + + usbi_dbg ("converting ep address 0x%02x to pipeRef and interface", ep); + + for (iface = 0 ; iface < USB_MAXINTERFACES ; iface++) { + cInterface = &priv->interfaces[iface]; + + if (dev_handle->claimed_interfaces & (1 << iface)) { + for (i = 0 ; i < cInterface->num_endpoints ; i++) { + if (cInterface->endpoint_addrs[i] == ep) { + *pipep = i + 1; + + if (ifcp) + *ifcp = iface; + + if (interface_out) + *interface_out = cInterface; + + usbi_dbg ("pipe %d on interface %d matches", *pipep, iface); + return 0; + } + } + } + } + + /* No pipe found with the correct endpoint address */ + usbi_warn (HANDLE_CTX(dev_handle), "no pipeRef found with endpoint address 0x%02x.", ep); + + return LIBUSB_ERROR_NOT_FOUND; +} + +static int usb_setup_device_iterator (io_iterator_t *deviceIterator, UInt32 location) { + CFMutableDictionaryRef matchingDict = IOServiceMatching(darwin_device_class); + + if (!matchingDict) + return kIOReturnError; + + if (location) { + CFMutableDictionaryRef propertyMatchDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + if (propertyMatchDict) { + /* there are no unsigned CFNumber types so treat the value as signed. the os seems to do this + internally (CFNumberType of locationID is 3) */ + CFTypeRef locationCF = CFNumberCreate (NULL, kCFNumberSInt32Type, &location); + + CFDictionarySetValue (propertyMatchDict, CFSTR(kUSBDevicePropertyLocationID), locationCF); + /* release our reference to the CFNumber (CFDictionarySetValue retains it) */ + CFRelease (locationCF); + + CFDictionarySetValue (matchingDict, CFSTR(kIOPropertyMatchKey), propertyMatchDict); + /* release out reference to the CFMutableDictionaryRef (CFDictionarySetValue retains it) */ + CFRelease (propertyMatchDict); + } + /* else we can still proceed as long as the caller accounts for the possibility of other devices in the iterator */ + } + + return IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, deviceIterator); +} + +/* Returns 1 on success, 0 on failure. */ +static int get_ioregistry_value_number (io_service_t service, CFStringRef property, CFNumberType type, void *p) { + CFTypeRef cfNumber = IORegistryEntryCreateCFProperty (service, property, kCFAllocatorDefault, 0); + int ret = 0; + + if (cfNumber) { + if (CFGetTypeID(cfNumber) == CFNumberGetTypeID()) { + ret = CFNumberGetValue(cfNumber, type, p); + } + + CFRelease (cfNumber); + } + + return ret; +} + +static int get_ioregistry_value_data (io_service_t service, CFStringRef property, ssize_t size, void *p) { + CFTypeRef cfData = IORegistryEntryCreateCFProperty (service, property, kCFAllocatorDefault, 0); + int ret = 0; + + if (cfData) { + if (CFGetTypeID (cfData) == CFDataGetTypeID ()) { + CFIndex length = CFDataGetLength (cfData); + if (length < size) { + size = length; + } + + CFDataGetBytes (cfData, CFRangeMake(0, size), p); + ret = 1; + } + + CFRelease (cfData); + } + + return ret; +} + +static usb_device_t **darwin_device_from_service (io_service_t service) +{ + io_cf_plugin_ref_t *plugInInterface = NULL; + usb_device_t **device; + kern_return_t result; + SInt32 score; + + result = IOCreatePlugInInterfaceForService(service, kIOUSBDeviceUserClientTypeID, + kIOCFPlugInInterfaceID, &plugInInterface, + &score); + + if (kIOReturnSuccess != result || !plugInInterface) { + usbi_dbg ("could not set up plugin for service: %s", darwin_error_str (result)); + return NULL; + } + + (void)(*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(DeviceInterfaceID), + (LPVOID)&device); + /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */ + (*plugInInterface)->Release (plugInInterface); + + return device; +} + +static void darwin_devices_attached (void *ptr, io_iterator_t add_devices) { + struct libusb_context *ctx; + io_service_t service; + + usbi_mutex_lock(&active_contexts_lock); + + while ((service = IOIteratorNext(add_devices))) { + /* add this device to each active context's device list */ + list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { + process_new_device (ctx, service);; + } + + IOObjectRelease(service); + } + + usbi_mutex_unlock(&active_contexts_lock); +} + +static void darwin_devices_detached (void *ptr, io_iterator_t rem_devices) { + struct libusb_device *dev = NULL; + struct libusb_context *ctx; + struct darwin_cached_device *old_device; + + io_service_t device; + UInt64 session; + int ret; + + usbi_mutex_lock(&active_contexts_lock); + + while ((device = IOIteratorNext (rem_devices)) != 0) { + /* get the location from the i/o registry */ + ret = get_ioregistry_value_number (device, CFSTR("sessionID"), kCFNumberSInt64Type, &session); + IOObjectRelease (device); + if (!ret) + continue; + + /* we need to match darwin_ref_cached_device call made in darwin_get_cached_device function + otherwise no cached device will ever get freed */ + usbi_mutex_lock(&darwin_cached_devices_lock); + list_for_each_entry(old_device, &darwin_cached_devices, list, struct darwin_cached_device) { + if (old_device->session == session) { + darwin_deref_cached_device (old_device); + break; + } + } + usbi_mutex_unlock(&darwin_cached_devices_lock); + + list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { + usbi_dbg ("notifying context %p of device disconnect", ctx); + + dev = usbi_get_device_by_session_id(ctx, (unsigned long) session); + if (dev) { + /* signal the core that this device has been disconnected. the core will tear down this device + when the reference count reaches 0 */ + usbi_disconnect_device(dev); + libusb_unref_device(dev); + } + } + } + + usbi_mutex_unlock(&active_contexts_lock); +} + +static void darwin_hotplug_poll (void) +{ + /* not sure if 5 seconds will be too long/short but it should work ok */ + mach_timespec_t timeout = {.tv_sec = 5, .tv_nsec = 0}; + + /* since a kernel thread may nodify the IOInterators used for + * hotplug notidication we can't just clear the iterators. + * instead just wait until all IOService providers are quiet */ + (void) IOKitWaitQuiet (kIOMasterPortDefault, &timeout); +} + +static void darwin_clear_iterator (io_iterator_t iter) { + io_service_t device; + + while ((device = IOIteratorNext (iter)) != 0) + IOObjectRelease (device); +} + +static void *darwin_event_thread_main (void *arg0) { + IOReturn kresult; + struct libusb_context *ctx = (struct libusb_context *)arg0; + CFRunLoopRef runloop; + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 + /* Set this thread's name, so it can be seen in the debugger + and crash reports. */ + pthread_setname_np ("org.libusb.device-hotplug"); +#endif + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && MAC_OS_X_VERSION_MIN_REQUIRED < 101200 + /* Tell the Objective-C garbage collector about this thread. + This is required because, unlike NSThreads, pthreads are + not automatically registered. Although we don't use + Objective-C, we use CoreFoundation, which does. + Garbage collection support was entirely removed in 10.12, + so don't bother there. */ + objc_registerThreadWithCollector(); +#endif + + /* hotplug (device arrival/removal) sources */ + CFRunLoopSourceContext libusb_shutdown_cfsourcectx; + CFRunLoopSourceRef libusb_notification_cfsource; + io_notification_port_t libusb_notification_port; + io_iterator_t libusb_rem_device_iterator; + io_iterator_t libusb_add_device_iterator; + + usbi_dbg ("creating hotplug event source"); + + runloop = CFRunLoopGetCurrent (); + CFRetain (runloop); + + /* add the shutdown cfsource to the run loop */ + memset(&libusb_shutdown_cfsourcectx, 0, sizeof(libusb_shutdown_cfsourcectx)); + libusb_shutdown_cfsourcectx.info = runloop; + libusb_shutdown_cfsourcectx.perform = (void (*)(void *))CFRunLoopStop; + libusb_darwin_acfls = CFRunLoopSourceCreate(NULL, 0, &libusb_shutdown_cfsourcectx); + CFRunLoopAddSource(runloop, libusb_darwin_acfls, kCFRunLoopDefaultMode); + + /* add the notification port to the run loop */ + libusb_notification_port = IONotificationPortCreate (kIOMasterPortDefault); + libusb_notification_cfsource = IONotificationPortGetRunLoopSource (libusb_notification_port); + CFRunLoopAddSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode); + + /* create notifications for removed devices */ + kresult = IOServiceAddMatchingNotification (libusb_notification_port, kIOTerminatedNotification, + IOServiceMatching(darwin_device_class), + darwin_devices_detached, + ctx, &libusb_rem_device_iterator); + + if (kresult != kIOReturnSuccess) { + usbi_err (ctx, "could not add hotplug event source: %s", darwin_error_str (kresult)); + + pthread_exit (NULL); + } + + /* create notifications for attached devices */ + kresult = IOServiceAddMatchingNotification(libusb_notification_port, kIOFirstMatchNotification, + IOServiceMatching(darwin_device_class), + darwin_devices_attached, + ctx, &libusb_add_device_iterator); + + if (kresult != kIOReturnSuccess) { + usbi_err (ctx, "could not add hotplug event source: %s", darwin_error_str (kresult)); + + pthread_exit (NULL); + } + + /* arm notifiers */ + darwin_clear_iterator (libusb_rem_device_iterator); + darwin_clear_iterator (libusb_add_device_iterator); + + usbi_dbg ("darwin event thread ready to receive events"); + + /* signal the main thread that the hotplug runloop has been created. */ + pthread_mutex_lock (&libusb_darwin_at_mutex); + libusb_darwin_acfl = runloop; + pthread_cond_signal (&libusb_darwin_at_cond); + pthread_mutex_unlock (&libusb_darwin_at_mutex); + + /* run the runloop */ + CFRunLoopRun(); + + usbi_dbg ("darwin event thread exiting"); + + /* remove the notification cfsource */ + CFRunLoopRemoveSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode); + + /* remove the shutdown cfsource */ + CFRunLoopRemoveSource(runloop, libusb_darwin_acfls, kCFRunLoopDefaultMode); + + /* delete notification port */ + IONotificationPortDestroy (libusb_notification_port); + + /* delete iterators */ + IOObjectRelease (libusb_rem_device_iterator); + IOObjectRelease (libusb_add_device_iterator); + + CFRelease (libusb_darwin_acfls); + CFRelease (runloop); + + libusb_darwin_acfls = NULL; + libusb_darwin_acfl = NULL; + + pthread_exit (NULL); +} + +/* cleanup function to destroy cached devices */ +static void __attribute__((destructor)) _darwin_finalize(void) { + struct darwin_cached_device *dev, *next; + + usbi_mutex_lock(&darwin_cached_devices_lock); + list_for_each_entry_safe(dev, next, &darwin_cached_devices, list, struct darwin_cached_device) { + darwin_deref_cached_device(dev); + } + usbi_mutex_unlock(&darwin_cached_devices_lock); +} + +static void darwin_check_version (void) { + /* adjust for changes in the USB stack in xnu 15 */ + int sysctl_args[] = {CTL_KERN, KERN_OSRELEASE}; + long version; + char version_string[256] = {'\0',}; + size_t length = 256; + + sysctl(sysctl_args, 2, version_string, &length, NULL, 0); + + errno = 0; + version = strtol (version_string, NULL, 10); + if (0 == errno && version >= 15) { + darwin_device_class = "IOUSBHostDevice"; + } +} + +static int darwin_init(struct libusb_context *ctx) { + host_name_port_t host_self; + int rc; + + rc = pthread_once (&darwin_init_once, darwin_check_version); + if (rc) { + return LIBUSB_ERROR_OTHER; + } + + rc = darwin_scan_devices (ctx); + if (LIBUSB_SUCCESS != rc) { + return rc; + } + + if (libusb_darwin_atomic_fetch_add (&initCount, 1) == 0) { + /* create the clocks that will be used */ + + host_self = mach_host_self(); + host_get_clock_service(host_self, CALENDAR_CLOCK, &clock_realtime); + host_get_clock_service(host_self, SYSTEM_CLOCK, &clock_monotonic); + mach_port_deallocate(mach_task_self(), host_self); + + pthread_create (&libusb_darwin_at, NULL, darwin_event_thread_main, ctx); + + pthread_mutex_lock (&libusb_darwin_at_mutex); + while (!libusb_darwin_acfl) + pthread_cond_wait (&libusb_darwin_at_cond, &libusb_darwin_at_mutex); + pthread_mutex_unlock (&libusb_darwin_at_mutex); + } + + return rc; +} + +static void darwin_exit (void) { + if (libusb_darwin_atomic_fetch_add (&initCount, -1) == 1) { + mach_port_deallocate(mach_task_self(), clock_realtime); + mach_port_deallocate(mach_task_self(), clock_monotonic); + + /* stop the event runloop and wait for the thread to terminate. */ + CFRunLoopSourceSignal(libusb_darwin_acfls); + CFRunLoopWakeUp (libusb_darwin_acfl); + pthread_join (libusb_darwin_at, NULL); + } +} + +static int darwin_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) { + struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); + + /* return cached copy */ + memmove (buffer, &(priv->dev_descriptor), DEVICE_DESC_LENGTH); + + *host_endian = 0; + + return 0; +} + +static int get_configuration_index (struct libusb_device *dev, int config_value) { + struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); + UInt8 i, numConfig; + IOUSBConfigurationDescriptorPtr desc; + IOReturn kresult; + + /* is there a simpler way to determine the index? */ + kresult = (*(priv->device))->GetNumberOfConfigurations (priv->device, &numConfig); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + for (i = 0 ; i < numConfig ; i++) { + (*(priv->device))->GetConfigurationDescriptorPtr (priv->device, i, &desc); + + if (desc->bConfigurationValue == config_value) + return i; + } + + /* configuration not found */ + return LIBUSB_ERROR_NOT_FOUND; +} + +static int darwin_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) { + struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); + int config_index; + + if (0 == priv->active_config) + return LIBUSB_ERROR_NOT_FOUND; + + config_index = get_configuration_index (dev, priv->active_config); + if (config_index < 0) + return config_index; + + return darwin_get_config_descriptor (dev, config_index, buffer, len, host_endian); +} + +static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) { + struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); + IOUSBConfigurationDescriptorPtr desc; + IOReturn kresult; + int ret; + + if (!priv || !priv->device) + return LIBUSB_ERROR_OTHER; + + kresult = (*priv->device)->GetConfigurationDescriptorPtr (priv->device, config_index, &desc); + if (kresult == kIOReturnSuccess) { + /* copy descriptor */ + if (libusb_le16_to_cpu(desc->wTotalLength) < len) + len = libusb_le16_to_cpu(desc->wTotalLength); + + memmove (buffer, desc, len); + + /* GetConfigurationDescriptorPtr returns the descriptor in USB bus order */ + *host_endian = 0; + } + + ret = darwin_to_libusb (kresult); + if (ret != LIBUSB_SUCCESS) + return ret; + + return (int) len; +} + +/* check whether the os has configured the device */ +static int darwin_check_configuration (struct libusb_context *ctx, struct darwin_cached_device *dev) { + usb_device_t **darwin_device = dev->device; + + IOUSBConfigurationDescriptorPtr configDesc; + IOUSBFindInterfaceRequest request; + kern_return_t kresult; + io_iterator_t interface_iterator; + io_service_t firstInterface; + + if (dev->dev_descriptor.bNumConfigurations < 1) { + usbi_err (ctx, "device has no configurations"); + return LIBUSB_ERROR_OTHER; /* no configurations at this speed so we can't use it */ + } + + /* checking the configuration of a root hub simulation takes ~1 s in 10.11. the device is + not usable anyway */ + if (0x05ac == dev->dev_descriptor.idVendor && 0x8005 == dev->dev_descriptor.idProduct) { + usbi_dbg ("ignoring configuration on root hub simulation"); + dev->active_config = 0; + return 0; + } + + /* find the first configuration */ + kresult = (*darwin_device)->GetConfigurationDescriptorPtr (darwin_device, 0, &configDesc); + dev->first_config = (kIOReturnSuccess == kresult) ? configDesc->bConfigurationValue : 1; + + /* check if the device is already configured. there is probably a better way than iterating over the + to accomplish this (the trick is we need to avoid a call to GetConfigurations since buggy devices + might lock up on the device request) */ + + /* Setup the Interface Request */ + request.bInterfaceClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; + request.bAlternateSetting = kIOUSBFindInterfaceDontCare; + + kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator); + if (kresult) + return darwin_to_libusb (kresult); + + /* iterate once */ + firstInterface = IOIteratorNext(interface_iterator); + + /* done with the interface iterator */ + IOObjectRelease(interface_iterator); + + if (firstInterface) { + IOObjectRelease (firstInterface); + + /* device is configured */ + if (dev->dev_descriptor.bNumConfigurations == 1) + /* to avoid problems with some devices get the configurations value from the configuration descriptor */ + dev->active_config = dev->first_config; + else + /* devices with more than one configuration should work with GetConfiguration */ + (*darwin_device)->GetConfiguration (darwin_device, &dev->active_config); + } else + /* not configured */ + dev->active_config = 0; + + usbi_dbg ("active config: %u, first config: %u", dev->active_config, dev->first_config); + + return 0; +} + +static int darwin_request_descriptor (usb_device_t **device, UInt8 desc, UInt8 desc_index, void *buffer, size_t buffer_size) { + IOUSBDevRequestTO req; + + memset (buffer, 0, buffer_size); + + /* Set up request for descriptor/ */ + req.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice); + req.bRequest = kUSBRqGetDescriptor; + req.wValue = desc << 8; + req.wIndex = desc_index; + req.wLength = buffer_size; + req.pData = buffer; + req.noDataTimeout = 20; + req.completionTimeout = 100; + + return (*device)->DeviceRequestTO (device, &req); +} + +static int darwin_cache_device_descriptor (struct libusb_context *ctx, struct darwin_cached_device *dev) { + usb_device_t **device = dev->device; + int retries = 1, delay = 30000; + int unsuspended = 0, try_unsuspend = 1, try_reconfigure = 1; + int is_open = 0; + int ret = 0, ret2; + UInt8 bDeviceClass; + UInt16 idProduct, idVendor; + + dev->can_enumerate = 0; + + (*device)->GetDeviceClass (device, &bDeviceClass); + (*device)->GetDeviceProduct (device, &idProduct); + (*device)->GetDeviceVendor (device, &idVendor); + + /* According to Apple's documentation the device must be open for DeviceRequest but we may not be able to open some + * devices and Apple's USB Prober doesn't bother to open the device before issuing a descriptor request. Still, + * to follow the spec as closely as possible, try opening the device */ + is_open = ((*device)->USBDeviceOpenSeize(device) == kIOReturnSuccess); + + do { + /**** retrieve device descriptor ****/ + ret = darwin_request_descriptor (device, kUSBDeviceDesc, 0, &dev->dev_descriptor, sizeof(dev->dev_descriptor)); + + if (kIOReturnOverrun == ret && kUSBDeviceDesc == dev->dev_descriptor.bDescriptorType) + /* received an overrun error but we still received a device descriptor */ + ret = kIOReturnSuccess; + + if (kIOUSBVendorIDAppleComputer == idVendor) { + /* NTH: don't bother retrying or unsuspending Apple devices */ + break; + } + + if (kIOReturnSuccess == ret && (0 == dev->dev_descriptor.bNumConfigurations || + 0 == dev->dev_descriptor.bcdUSB)) { + /* work around for incorrectly configured devices */ + if (try_reconfigure && is_open) { + usbi_dbg("descriptor appears to be invalid. resetting configuration before trying again..."); + + /* set the first configuration */ + (*device)->SetConfiguration(device, 1); + + /* don't try to reconfigure again */ + try_reconfigure = 0; + } + + ret = kIOUSBPipeStalled; + } + + if (kIOReturnSuccess != ret && is_open && try_unsuspend) { + /* device may be suspended. unsuspend it and try again */ +#if DeviceVersion >= 320 + UInt32 info = 0; + + /* IOUSBFamily 320+ provides a way to detect device suspension but earlier versions do not */ + (void)(*device)->GetUSBDeviceInformation (device, &info); + + /* note that the device was suspended */ + if (info & (1 << kUSBInformationDeviceIsSuspendedBit) || 0 == info) + try_unsuspend = 1; +#endif + + if (try_unsuspend) { + /* try to unsuspend the device */ + ret2 = (*device)->USBDeviceSuspend (device, 0); + if (kIOReturnSuccess != ret2) { + /* prevent log spew from poorly behaving devices. this indicates the + os actually had trouble communicating with the device */ + usbi_dbg("could not retrieve device descriptor. failed to unsuspend: %s",darwin_error_str(ret2)); + } else + unsuspended = 1; + + try_unsuspend = 0; + } + } + + if (kIOReturnSuccess != ret) { + usbi_dbg("kernel responded with code: 0x%08x. sleeping for %d ms before trying again", ret, delay/1000); + /* sleep for a little while before trying again */ + nanosleep(&(struct timespec){delay / 1000000, (delay * 1000) % 1000000000UL}, NULL); + } + } while (kIOReturnSuccess != ret && retries--); + + if (unsuspended) + /* resuspend the device */ + (void)(*device)->USBDeviceSuspend (device, 1); + + if (is_open) + (void) (*device)->USBDeviceClose (device); + + if (ret != kIOReturnSuccess) { + /* a debug message was already printed out for this error */ + if (LIBUSB_CLASS_HUB == bDeviceClass) + usbi_dbg ("could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device", + idVendor, idProduct, darwin_error_str (ret), ret); + else + usbi_warn (ctx, "could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device", + idVendor, idProduct, darwin_error_str (ret), ret); + return darwin_to_libusb (ret); + } + + /* catch buggy hubs (which appear to be virtual). Apple's own USB prober has problems with these devices. */ + if (libusb_le16_to_cpu (dev->dev_descriptor.idProduct) != idProduct) { + /* not a valid device */ + usbi_warn (ctx, "idProduct from iokit (%04x) does not match idProduct in descriptor (%04x). skipping device", + idProduct, libusb_le16_to_cpu (dev->dev_descriptor.idProduct)); + return LIBUSB_ERROR_NO_DEVICE; + } + + usbi_dbg ("cached device descriptor:"); + usbi_dbg (" bDescriptorType: 0x%02x", dev->dev_descriptor.bDescriptorType); + usbi_dbg (" bcdUSB: 0x%04x", dev->dev_descriptor.bcdUSB); + usbi_dbg (" bDeviceClass: 0x%02x", dev->dev_descriptor.bDeviceClass); + usbi_dbg (" bDeviceSubClass: 0x%02x", dev->dev_descriptor.bDeviceSubClass); + usbi_dbg (" bDeviceProtocol: 0x%02x", dev->dev_descriptor.bDeviceProtocol); + usbi_dbg (" bMaxPacketSize0: 0x%02x", dev->dev_descriptor.bMaxPacketSize0); + usbi_dbg (" idVendor: 0x%04x", dev->dev_descriptor.idVendor); + usbi_dbg (" idProduct: 0x%04x", dev->dev_descriptor.idProduct); + usbi_dbg (" bcdDevice: 0x%04x", dev->dev_descriptor.bcdDevice); + usbi_dbg (" iManufacturer: 0x%02x", dev->dev_descriptor.iManufacturer); + usbi_dbg (" iProduct: 0x%02x", dev->dev_descriptor.iProduct); + usbi_dbg (" iSerialNumber: 0x%02x", dev->dev_descriptor.iSerialNumber); + usbi_dbg (" bNumConfigurations: 0x%02x", dev->dev_descriptor.bNumConfigurations); + + dev->can_enumerate = 1; + + return LIBUSB_SUCCESS; +} + +static int get_device_port (io_service_t service, UInt8 *port) { + kern_return_t result; + io_service_t parent; + int ret = 0; + + if (get_ioregistry_value_number (service, CFSTR("PortNum"), kCFNumberSInt8Type, port)) { + return 1; + } + + result = IORegistryEntryGetParentEntry (service, kIOServicePlane, &parent); + if (kIOReturnSuccess == result) { + ret = get_ioregistry_value_data (parent, CFSTR("port"), 1, port); + IOObjectRelease (parent); + } + + return ret; +} + +static int darwin_get_cached_device(struct libusb_context *ctx, io_service_t service, + struct darwin_cached_device **cached_out) { + struct darwin_cached_device *new_device; + UInt64 sessionID = 0, parent_sessionID = 0; + int ret = LIBUSB_SUCCESS; + usb_device_t **device; + io_service_t parent; + kern_return_t result; + UInt8 port = 0; + + /* get some info from the io registry */ + (void) get_ioregistry_value_number (service, CFSTR("sessionID"), kCFNumberSInt64Type, &sessionID); + if (!get_device_port (service, &port)) { + usbi_dbg("could not get connected port number"); + } + + usbi_dbg("finding cached device for sessionID 0x%" PRIx64, sessionID); + + result = IORegistryEntryGetParentEntry (service, kIOUSBPlane, &parent); + + if (kIOReturnSuccess == result) { + (void) get_ioregistry_value_number (parent, CFSTR("sessionID"), kCFNumberSInt64Type, &parent_sessionID); + IOObjectRelease(parent); + } + + usbi_mutex_lock(&darwin_cached_devices_lock); + do { + *cached_out = NULL; + + list_for_each_entry(new_device, &darwin_cached_devices, list, struct darwin_cached_device) { + usbi_dbg("matching sessionID 0x%" PRIx64 " against cached device with sessionID 0x%" PRIx64, sessionID, new_device->session); + if (new_device->session == sessionID) { + usbi_dbg("using cached device for device"); + *cached_out = new_device; + break; + } + } + + if (*cached_out) + break; + + usbi_dbg("caching new device with sessionID 0x%" PRIx64, sessionID); + + device = darwin_device_from_service (service); + if (!device) { + ret = LIBUSB_ERROR_NO_DEVICE; + break; + } + + new_device = calloc (1, sizeof (*new_device)); + if (!new_device) { + ret = LIBUSB_ERROR_NO_MEM; + break; + } + + /* add this device to the cached device list */ + list_add(&new_device->list, &darwin_cached_devices); + + (*device)->GetDeviceAddress (device, (USBDeviceAddress *)&new_device->address); + + /* keep a reference to this device */ + darwin_ref_cached_device(new_device); + + new_device->device = device; + new_device->session = sessionID; + (*device)->GetLocationID (device, &new_device->location); + new_device->port = port; + new_device->parent_session = parent_sessionID; + + /* cache the device descriptor */ + ret = darwin_cache_device_descriptor(ctx, new_device); + if (ret) + break; + + if (new_device->can_enumerate) { + snprintf(new_device->sys_path, 20, "%03i-%04x-%04x-%02x-%02x", new_device->address, + new_device->dev_descriptor.idVendor, new_device->dev_descriptor.idProduct, + new_device->dev_descriptor.bDeviceClass, new_device->dev_descriptor.bDeviceSubClass); + } + } while (0); + + usbi_mutex_unlock(&darwin_cached_devices_lock); + + /* keep track of devices regardless of if we successfully enumerate them to + prevent them from being enumerated multiple times */ + + *cached_out = new_device; + + return ret; +} + +static int process_new_device (struct libusb_context *ctx, io_service_t service) { + struct darwin_device_priv *priv; + struct libusb_device *dev = NULL; + struct darwin_cached_device *cached_device; + UInt8 devSpeed; + int ret = 0; + + do { + ret = darwin_get_cached_device (ctx, service, &cached_device); + + if (ret < 0 || !cached_device->can_enumerate) { + return ret; + } + + /* check current active configuration (and cache the first configuration value-- + which may be used by claim_interface) */ + ret = darwin_check_configuration (ctx, cached_device); + if (ret) + break; + + usbi_dbg ("allocating new device in context %p for with session 0x%" PRIx64, + ctx, cached_device->session); + + dev = usbi_alloc_device(ctx, (unsigned long) cached_device->session); + if (!dev) { + return LIBUSB_ERROR_NO_MEM; + } + + priv = (struct darwin_device_priv *)dev->os_priv; + + priv->dev = cached_device; + darwin_ref_cached_device (priv->dev); + + if (cached_device->parent_session > 0) { + dev->parent_dev = usbi_get_device_by_session_id (ctx, (unsigned long) cached_device->parent_session); + } else { + dev->parent_dev = NULL; + } + dev->port_number = cached_device->port; + dev->bus_number = cached_device->location >> 24; + dev->device_address = cached_device->address; + + (*(priv->dev->device))->GetDeviceSpeed (priv->dev->device, &devSpeed); + + switch (devSpeed) { + case kUSBDeviceSpeedLow: dev->speed = LIBUSB_SPEED_LOW; break; + case kUSBDeviceSpeedFull: dev->speed = LIBUSB_SPEED_FULL; break; + case kUSBDeviceSpeedHigh: dev->speed = LIBUSB_SPEED_HIGH; break; +#if DeviceVersion >= 500 + case kUSBDeviceSpeedSuper: dev->speed = LIBUSB_SPEED_SUPER; break; +#endif + default: + usbi_warn (ctx, "Got unknown device speed %d", devSpeed); + } + + ret = usbi_sanitize_device (dev); + if (ret < 0) + break; + + usbi_dbg ("found device with address %d port = %d parent = %p at %p", dev->device_address, + dev->port_number, (void *) dev->parent_dev, priv->dev->sys_path); + } while (0); + + if (0 == ret) { + usbi_connect_device (dev); + } else { + libusb_unref_device (dev); + } + + return ret; +} + +static int darwin_scan_devices(struct libusb_context *ctx) { + io_iterator_t deviceIterator; + io_service_t service; + kern_return_t kresult; + + kresult = usb_setup_device_iterator (&deviceIterator, 0); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + while ((service = IOIteratorNext (deviceIterator))) { + (void) process_new_device (ctx, service); + + IOObjectRelease(service); + } + + IOObjectRelease(deviceIterator); + + return 0; +} + +static int darwin_open (struct libusb_device_handle *dev_handle) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + IOReturn kresult; + + if (0 == dpriv->open_count) { + /* try to open the device */ + kresult = (*(dpriv->device))->USBDeviceOpenSeize (dpriv->device); + if (kresult != kIOReturnSuccess) { + usbi_warn (HANDLE_CTX (dev_handle), "USBDeviceOpen: %s", darwin_error_str(kresult)); + + if (kIOReturnExclusiveAccess != kresult) { + return darwin_to_libusb (kresult); + } + + /* it is possible to perform some actions on a device that is not open so do not return an error */ + priv->is_open = 0; + } else { + priv->is_open = 1; + } + + /* create async event source */ + kresult = (*(dpriv->device))->CreateDeviceAsyncEventSource (dpriv->device, &priv->cfSource); + if (kresult != kIOReturnSuccess) { + usbi_err (HANDLE_CTX (dev_handle), "CreateDeviceAsyncEventSource: %s", darwin_error_str(kresult)); + + if (priv->is_open) { + (*(dpriv->device))->USBDeviceClose (dpriv->device); + } + + priv->is_open = 0; + + return darwin_to_libusb (kresult); + } + + CFRetain (libusb_darwin_acfl); + + /* add the cfSource to the aync run loop */ + CFRunLoopAddSource(libusb_darwin_acfl, priv->cfSource, kCFRunLoopCommonModes); + } + + /* device opened successfully */ + dpriv->open_count++; + + usbi_dbg ("device open for access"); + + return 0; +} + +static void darwin_close (struct libusb_device_handle *dev_handle) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + IOReturn kresult; + int i; + + if (dpriv->open_count == 0) { + /* something is probably very wrong if this is the case */ + usbi_err (HANDLE_CTX (dev_handle), "Close called on a device that was not open!"); + return; + } + + dpriv->open_count--; + + /* make sure all interfaces are released */ + for (i = 0 ; i < USB_MAXINTERFACES ; i++) + if (dev_handle->claimed_interfaces & (1 << i)) + libusb_release_interface (dev_handle, i); + + if (0 == dpriv->open_count) { + /* delete the device's async event source */ + if (priv->cfSource) { + CFRunLoopRemoveSource (libusb_darwin_acfl, priv->cfSource, kCFRunLoopDefaultMode); + CFRelease (priv->cfSource); + priv->cfSource = NULL; + CFRelease (libusb_darwin_acfl); + } + + if (priv->is_open) { + /* close the device */ + kresult = (*(dpriv->device))->USBDeviceClose(dpriv->device); + if (kresult) { + /* Log the fact that we had a problem closing the file, however failing a + * close isn't really an error, so return success anyway */ + usbi_warn (HANDLE_CTX (dev_handle), "USBDeviceClose: %s", darwin_error_str(kresult)); + } + } + } +} + +static int darwin_get_configuration(struct libusb_device_handle *dev_handle, int *config) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + + *config = (int) dpriv->active_config; + + return 0; +} + +static int darwin_set_configuration(struct libusb_device_handle *dev_handle, int config) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + IOReturn kresult; + int i; + + /* Setting configuration will invalidate the interface, so we need + to reclaim it. First, dispose of existing interfaces, if any. */ + for (i = 0 ; i < USB_MAXINTERFACES ; i++) + if (dev_handle->claimed_interfaces & (1 << i)) + darwin_release_interface (dev_handle, i); + + kresult = (*(dpriv->device))->SetConfiguration (dpriv->device, config); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + /* Reclaim any interfaces. */ + for (i = 0 ; i < USB_MAXINTERFACES ; i++) + if (dev_handle->claimed_interfaces & (1 << i)) + darwin_claim_interface (dev_handle, i); + + dpriv->active_config = config; + + return 0; +} + +static int darwin_get_interface (usb_device_t **darwin_device, uint8_t ifc, io_service_t *usbInterfacep) { + IOUSBFindInterfaceRequest request; + kern_return_t kresult; + io_iterator_t interface_iterator; + UInt8 bInterfaceNumber; + int ret; + + *usbInterfacep = IO_OBJECT_NULL; + + /* Setup the Interface Request */ + request.bInterfaceClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; + request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; + request.bAlternateSetting = kIOUSBFindInterfaceDontCare; + + kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator); + if (kresult) + return kresult; + + while ((*usbInterfacep = IOIteratorNext(interface_iterator))) { + /* find the interface number */ + ret = get_ioregistry_value_number (*usbInterfacep, CFSTR("bInterfaceNumber"), kCFNumberSInt8Type, + &bInterfaceNumber); + + if (ret && bInterfaceNumber == ifc) { + break; + } + + (void) IOObjectRelease (*usbInterfacep); + } + + /* done with the interface iterator */ + IOObjectRelease(interface_iterator); + + return 0; +} + +static int get_endpoints (struct libusb_device_handle *dev_handle, int iface) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + kern_return_t kresult; + + u_int8_t numep, direction, number; + u_int8_t dont_care1, dont_care3; + u_int16_t dont_care2; + int rc; + + usbi_dbg ("building table of endpoints."); + + /* retrieve the total number of endpoints on this interface */ + kresult = (*(cInterface->interface))->GetNumEndpoints(cInterface->interface, &numep); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "can't get number of endpoints for interface: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + /* iterate through pipe references */ + for (int i = 1 ; i <= numep ; i++) { + kresult = (*(cInterface->interface))->GetPipeProperties(cInterface->interface, i, &direction, &number, &dont_care1, + &dont_care2, &dont_care3); + + if (kresult != kIOReturnSuccess) { + /* probably a buggy device. try to get the endpoint address from the descriptors */ + struct libusb_config_descriptor *config; + const struct libusb_endpoint_descriptor *endpoint_desc; + UInt8 alt_setting; + + kresult = (*(cInterface->interface))->GetAlternateSetting (cInterface->interface, &alt_setting); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "can't get alternate setting for interface"); + return darwin_to_libusb (kresult); + } + + rc = libusb_get_active_config_descriptor (dev_handle->dev, &config); + if (LIBUSB_SUCCESS != rc) { + return rc; + } + + endpoint_desc = config->interface[iface].altsetting[alt_setting].endpoint + i - 1; + + cInterface->endpoint_addrs[i - 1] = endpoint_desc->bEndpointAddress; + } else { + cInterface->endpoint_addrs[i - 1] = (((kUSBIn == direction) << kUSBRqDirnShift) | (number & LIBUSB_ENDPOINT_ADDRESS_MASK)); + } + + usbi_dbg ("interface: %i pipe %i: dir: %i number: %i", iface, i, cInterface->endpoint_addrs[i - 1] >> kUSBRqDirnShift, + cInterface->endpoint_addrs[i - 1] & LIBUSB_ENDPOINT_ADDRESS_MASK); + } + + cInterface->num_endpoints = numep; + + return 0; +} + +static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + io_service_t usbInterface = IO_OBJECT_NULL; + IOReturn kresult; + IOCFPlugInInterface **plugInInterface = NULL; + SInt32 score; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + kresult = darwin_get_interface (dpriv->device, iface, &usbInterface); + if (kresult != kIOReturnSuccess) + return darwin_to_libusb (kresult); + + /* make sure we have an interface */ + if (!usbInterface && dpriv->first_config != 0) { + usbi_info (HANDLE_CTX (dev_handle), "no interface found; setting configuration: %d", dpriv->first_config); + + /* set the configuration */ + kresult = darwin_set_configuration (dev_handle, dpriv->first_config); + if (kresult != LIBUSB_SUCCESS) { + usbi_err (HANDLE_CTX (dev_handle), "could not set configuration"); + return kresult; + } + + kresult = darwin_get_interface (dpriv->device, iface, &usbInterface); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + } + + if (!usbInterface) { + usbi_err (HANDLE_CTX (dev_handle), "interface not found"); + return LIBUSB_ERROR_NOT_FOUND; + } + + /* get an interface to the device's interface */ + kresult = IOCreatePlugInInterfaceForService (usbInterface, kIOUSBInterfaceUserClientTypeID, + kIOCFPlugInInterfaceID, &plugInInterface, &score); + + /* ignore release error */ + (void)IOObjectRelease (usbInterface); + + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "IOCreatePlugInInterfaceForService: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + if (!plugInInterface) { + usbi_err (HANDLE_CTX (dev_handle), "plugin interface not found"); + return LIBUSB_ERROR_NOT_FOUND; + } + + /* Do the actual claim */ + kresult = (*plugInInterface)->QueryInterface(plugInInterface, + CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID), + (LPVOID)&cInterface->interface); + /* We no longer need the intermediate plug-in */ + /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */ + (*plugInInterface)->Release (plugInInterface); + if (kresult || !cInterface->interface) { + usbi_err (HANDLE_CTX (dev_handle), "QueryInterface: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + /* claim the interface */ + kresult = (*(cInterface->interface))->USBInterfaceOpen(cInterface->interface); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "USBInterfaceOpen: %s", darwin_error_str(kresult)); + return darwin_to_libusb (kresult); + } + + /* update list of endpoints */ + kresult = get_endpoints (dev_handle, iface); + if (kresult) { + /* this should not happen */ + darwin_release_interface (dev_handle, iface); + usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table"); + return kresult; + } + + cInterface->cfSource = NULL; + + /* create async event source */ + kresult = (*(cInterface->interface))->CreateInterfaceAsyncEventSource (cInterface->interface, &cInterface->cfSource); + if (kresult != kIOReturnSuccess) { + usbi_err (HANDLE_CTX (dev_handle), "could not create async event source"); + + /* can't continue without an async event source */ + (void)darwin_release_interface (dev_handle, iface); + + return darwin_to_libusb (kresult); + } + + /* add the cfSource to the async thread's run loop */ + CFRunLoopAddSource(libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode); + + usbi_dbg ("interface opened"); + + return 0; +} + +static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + IOReturn kresult; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + /* Check to see if an interface is open */ + if (!cInterface->interface) + return LIBUSB_SUCCESS; + + /* clean up endpoint data */ + cInterface->num_endpoints = 0; + + /* delete the interface's async event source */ + if (cInterface->cfSource) { + CFRunLoopRemoveSource (libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode); + CFRelease (cInterface->cfSource); + } + + kresult = (*(cInterface->interface))->USBInterfaceClose(cInterface->interface); + if (kresult) + usbi_warn (HANDLE_CTX (dev_handle), "USBInterfaceClose: %s", darwin_error_str(kresult)); + + kresult = (*(cInterface->interface))->Release(cInterface->interface); + if (kresult != kIOReturnSuccess) + usbi_warn (HANDLE_CTX (dev_handle), "Release: %s", darwin_error_str(kresult)); + + cInterface->interface = (usb_interface_t **) IO_OBJECT_NULL; + + return darwin_to_libusb (kresult); +} + +static int darwin_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) { + struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; + IOReturn kresult; + + /* current interface */ + struct darwin_interface *cInterface = &priv->interfaces[iface]; + + if (!cInterface->interface) + return LIBUSB_ERROR_NO_DEVICE; + + kresult = (*(cInterface->interface))->SetAlternateInterface (cInterface->interface, altsetting); + if (kresult != kIOReturnSuccess) + darwin_reset_device (dev_handle); + + /* update list of endpoints */ + kresult = get_endpoints (dev_handle, iface); + if (kresult) { + /* this should not happen */ + darwin_release_interface (dev_handle, iface); + usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table"); + return kresult; + } + + return darwin_to_libusb (kresult); +} + +static int darwin_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) { + /* current interface */ + struct darwin_interface *cInterface; + IOReturn kresult; + uint8_t pipeRef; + + /* determine the interface/endpoint to use */ + if (ep_to_pipeRef (dev_handle, endpoint, &pipeRef, NULL, &cInterface) != 0) { + usbi_err (HANDLE_CTX (dev_handle), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + /* newer versions of darwin support clearing additional bits on the device's endpoint */ + kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef); + if (kresult) + usbi_warn (HANDLE_CTX (dev_handle), "ClearPipeStall: %s", darwin_error_str (kresult)); + + return darwin_to_libusb (kresult); +} + +static int darwin_reset_device(struct libusb_device_handle *dev_handle) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + IOUSBDeviceDescriptor descriptor; + IOUSBConfigurationDescriptorPtr cached_configuration; + IOUSBConfigurationDescriptor configuration; + bool reenumerate = false; + IOReturn kresult; + int i; + + kresult = (*(dpriv->device))->ResetDevice (dpriv->device); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "ResetDevice: %s", darwin_error_str (kresult)); + return darwin_to_libusb (kresult); + } + + do { + usbi_dbg ("darwin/reset_device: checking if device descriptor changed"); + + /* ignore return code. if we can't get a descriptor it might be worthwhile re-enumerating anway */ + (void) darwin_request_descriptor (dpriv->device, kUSBDeviceDesc, 0, &descriptor, sizeof (descriptor)); + + /* check if the device descriptor has changed */ + if (0 != memcmp (&dpriv->dev_descriptor, &descriptor, sizeof (descriptor))) { + reenumerate = true; + break; + } + + /* check if any configuration descriptor has changed */ + for (i = 0 ; i < descriptor.bNumConfigurations ; ++i) { + usbi_dbg ("darwin/reset_device: checking if configuration descriptor %d changed", i); + + (void) darwin_request_descriptor (dpriv->device, kUSBConfDesc, i, &configuration, sizeof (configuration)); + (*(dpriv->device))->GetConfigurationDescriptorPtr (dpriv->device, i, &cached_configuration); + + if (!cached_configuration || 0 != memcmp (cached_configuration, &configuration, sizeof (configuration))) { + reenumerate = true; + break; + } + } + } while (0); + + if (reenumerate) { + usbi_dbg ("darwin/reset_device: device requires reenumeration"); + (void) (*(dpriv->device))->USBDeviceReEnumerate (dpriv->device, 0); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg ("darwin/reset_device: device reset complete"); + + return LIBUSB_SUCCESS; +} + +static int darwin_kernel_driver_active(struct libusb_device_handle *dev_handle, int interface) { + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); + io_service_t usbInterface; + CFTypeRef driver; + IOReturn kresult; + + kresult = darwin_get_interface (dpriv->device, interface, &usbInterface); + if (kresult) { + usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult)); + + return darwin_to_libusb (kresult); + } + + driver = IORegistryEntryCreateCFProperty (usbInterface, kIOBundleIdentifierKey, kCFAllocatorDefault, 0); + IOObjectRelease (usbInterface); + + if (driver) { + CFRelease (driver); + + return 1; + } + + /* no driver */ + return 0; +} + +/* attaching/detaching kernel drivers is not currently supported (maybe in the future?) */ +static int darwin_attach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) { + UNUSED(dev_handle); + UNUSED(interface); + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int darwin_detach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) { + UNUSED(dev_handle); + UNUSED(interface); + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static void darwin_destroy_device(struct libusb_device *dev) { + struct darwin_device_priv *dpriv = (struct darwin_device_priv *) dev->os_priv; + + if (dpriv->dev) { + /* need to hold the lock in case this is the last reference to the device */ + usbi_mutex_lock(&darwin_cached_devices_lock); + darwin_deref_cached_device (dpriv->dev); + dpriv->dev = NULL; + usbi_mutex_unlock(&darwin_cached_devices_lock); + } +} + +static int submit_bulk_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + IOReturn ret; + uint8_t transferType; + /* None of the values below are used in libusbx for bulk transfers */ + uint8_t direction, number, interval, pipeRef; + uint16_t maxPacketSize; + + struct darwin_interface *cInterface; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + ret = (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, + &transferType, &maxPacketSize, &interval); + + if (ret) { + usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out", + darwin_error_str(ret), ret); + return darwin_to_libusb (ret); + } + + if (0 != (transfer->length % maxPacketSize)) { + /* do not need a zero packet */ + transfer->flags &= ~LIBUSB_TRANSFER_ADD_ZERO_PACKET; + } + + /* submit the request */ + /* timeouts are unavailable on interrupt endpoints */ + if (transferType == kUSBInterrupt) { + if (IS_XFERIN(transfer)) + ret = (*(cInterface->interface))->ReadPipeAsync(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, darwin_async_io_callback, itransfer); + else + ret = (*(cInterface->interface))->WritePipeAsync(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, darwin_async_io_callback, itransfer); + } else { + itransfer->timeout_flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; + + if (IS_XFERIN(transfer)) + ret = (*(cInterface->interface))->ReadPipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, transfer->timeout, transfer->timeout, + darwin_async_io_callback, (void *)itransfer); + else + ret = (*(cInterface->interface))->WritePipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer, + transfer->length, transfer->timeout, transfer->timeout, + darwin_async_io_callback, (void *)itransfer); + } + + if (ret) + usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out", + darwin_error_str(ret), ret); + + return darwin_to_libusb (ret); +} + +#if InterfaceVersion >= 550 +static int submit_stream_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_interface *cInterface; + uint8_t pipeRef; + IOReturn ret; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + itransfer->timeout_flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; + + if (IS_XFERIN(transfer)) + ret = (*(cInterface->interface))->ReadStreamsPipeAsyncTO(cInterface->interface, pipeRef, itransfer->stream_id, + transfer->buffer, transfer->length, transfer->timeout, + transfer->timeout, darwin_async_io_callback, (void *)itransfer); + else + ret = (*(cInterface->interface))->WriteStreamsPipeAsyncTO(cInterface->interface, pipeRef, itransfer->stream_id, + transfer->buffer, transfer->length, transfer->timeout, + transfer->timeout, darwin_async_io_callback, (void *)itransfer); + + if (ret) + usbi_err (TRANSFER_CTX (transfer), "bulk stream transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out", + darwin_error_str(ret), ret); + + return darwin_to_libusb (ret); +} +#endif + +static int submit_iso_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + IOReturn kresult; + uint8_t direction, number, interval, pipeRef, transferType; + uint16_t maxPacketSize; + UInt64 frame; + AbsoluteTime atTime; + int i; + + struct darwin_interface *cInterface; + + /* construct an array of IOUSBIsocFrames, reuse the old one if possible */ + if (tpriv->isoc_framelist && tpriv->num_iso_packets != transfer->num_iso_packets) { + free(tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } + + if (!tpriv->isoc_framelist) { + tpriv->num_iso_packets = transfer->num_iso_packets; + tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame)); + if (!tpriv->isoc_framelist) + return LIBUSB_ERROR_NO_MEM; + } + + /* copy the frame list from the libusb descriptor (the structures differ only is member order) */ + for (i = 0 ; i < transfer->num_iso_packets ; i++) + tpriv->isoc_framelist[i].frReqCount = transfer->iso_packet_desc[i].length; + + /* determine the interface/endpoint to use */ + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + /* determine the properties of this endpoint and the speed of the device */ + (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, + &transferType, &maxPacketSize, &interval); + + /* Last but not least we need the bus frame number */ + kresult = (*(cInterface->interface))->GetBusFrameNumber(cInterface->interface, &frame, &atTime); + if (kresult) { + usbi_err (TRANSFER_CTX (transfer), "failed to get bus frame number: %d", kresult); + free(tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + + return darwin_to_libusb (kresult); + } + + (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, + &transferType, &maxPacketSize, &interval); + + /* schedule for a frame a little in the future */ + frame += 4; + + if (cInterface->frames[transfer->endpoint] && frame < cInterface->frames[transfer->endpoint]) + frame = cInterface->frames[transfer->endpoint]; + + /* submit the request */ + if (IS_XFERIN(transfer)) + kresult = (*(cInterface->interface))->ReadIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame, + transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, + itransfer); + else + kresult = (*(cInterface->interface))->WriteIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame, + transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, + itransfer); + + if (LIBUSB_SPEED_FULL == transfer->dev_handle->dev->speed) + /* Full speed */ + cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1)); + else + /* High/super speed */ + cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1)) / 8; + + if (kresult != kIOReturnSuccess) { + usbi_err (TRANSFER_CTX (transfer), "isochronous transfer failed (dir: %s): %s", IS_XFERIN(transfer) ? "In" : "Out", + darwin_error_str(kresult)); + free (tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } + + return darwin_to_libusb (kresult); +} + +static int submit_control_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_control_setup *setup = (struct libusb_control_setup *) transfer->buffer; + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + IOReturn kresult; + + memset(&tpriv->req, 0, sizeof(tpriv->req)); + + /* IOUSBDeviceInterface expects the request in cpu endianness */ + tpriv->req.bmRequestType = setup->bmRequestType; + tpriv->req.bRequest = setup->bRequest; + /* these values should be in bus order from libusb_fill_control_setup */ + tpriv->req.wValue = OSSwapLittleToHostInt16 (setup->wValue); + tpriv->req.wIndex = OSSwapLittleToHostInt16 (setup->wIndex); + tpriv->req.wLength = OSSwapLittleToHostInt16 (setup->wLength); + /* data is stored after the libusb control block */ + tpriv->req.pData = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; + tpriv->req.completionTimeout = transfer->timeout; + tpriv->req.noDataTimeout = transfer->timeout; + + itransfer->timeout_flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; + + /* all transfers in libusb-1.0 are async */ + + if (transfer->endpoint) { + struct darwin_interface *cInterface; + uint8_t pipeRef; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + kresult = (*(cInterface->interface))->ControlRequestAsyncTO (cInterface->interface, pipeRef, &(tpriv->req), darwin_async_io_callback, itransfer); + } else + /* control request on endpoint 0 */ + kresult = (*(dpriv->device))->DeviceRequestAsyncTO(dpriv->device, &(tpriv->req), darwin_async_io_callback, itransfer); + + if (kresult != kIOReturnSuccess) + usbi_err (TRANSFER_CTX (transfer), "control request failed: %s", darwin_error_str(kresult)); + + return darwin_to_libusb (kresult); +} + +static int darwin_submit_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return submit_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return submit_bulk_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return submit_iso_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: +#if InterfaceVersion >= 550 + return submit_stream_transfer(itransfer); +#else + usbi_err (TRANSFER_CTX(transfer), "IOUSBFamily version does not support bulk stream transfers"); + return LIBUSB_ERROR_NOT_SUPPORTED; +#endif + default: + usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int cancel_control_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev); + IOReturn kresult; + + usbi_warn (ITRANSFER_CTX (itransfer), "aborting all transactions control pipe"); + + if (!dpriv->device) + return LIBUSB_ERROR_NO_DEVICE; + + kresult = (*(dpriv->device))->USBDeviceAbortPipeZero (dpriv->device); + + return darwin_to_libusb (kresult); +} + +static int darwin_abort_transfers (struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev); + struct darwin_interface *cInterface; + uint8_t pipeRef, iface; + IOReturn kresult; + + if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface, &cInterface) != 0) { + usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); + + return LIBUSB_ERROR_NOT_FOUND; + } + + if (!dpriv->device) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_warn (ITRANSFER_CTX (itransfer), "aborting all transactions on interface %d pipe %d", iface, pipeRef); + + /* abort transactions */ +#if InterfaceVersion >= 550 + if (LIBUSB_TRANSFER_TYPE_BULK_STREAM == transfer->type) + (*(cInterface->interface))->AbortStreamsPipe (cInterface->interface, pipeRef, itransfer->stream_id); + else +#endif + (*(cInterface->interface))->AbortPipe (cInterface->interface, pipeRef); + + usbi_dbg ("calling clear pipe stall to clear the data toggle bit"); + + /* newer versions of darwin support clearing additional bits on the device's endpoint */ + kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef); + + return darwin_to_libusb (kresult); +} + +static int darwin_cancel_transfer(struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return cancel_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return darwin_abort_transfers (itransfer); + default: + usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static void darwin_clear_transfer_priv (struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS && tpriv->isoc_framelist) { + free (tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } +} + +static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0) { + struct usbi_transfer *itransfer = (struct usbi_transfer *)refcon; + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + usbi_dbg ("an async io operation has completed"); + + /* if requested write a zero packet */ + if (kIOReturnSuccess == result && IS_XFEROUT(transfer) && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { + struct darwin_interface *cInterface; + uint8_t pipeRef; + + (void) ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface); + + (*(cInterface->interface))->WritePipe (cInterface->interface, pipeRef, transfer->buffer, 0); + } + + tpriv->result = result; + tpriv->size = (UInt32) (uintptr_t) arg0; + + /* signal the core that this transfer is complete */ + usbi_signal_transfer_completion(itransfer); +} + +static int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_t result) { + if (itransfer->timeout_flags & USBI_TRANSFER_TIMED_OUT) + result = kIOUSBTransactionTimeout; + + switch (result) { + case kIOReturnUnderrun: + usbi_dbg ("kIOReturnUnderrun"); + return LIBUSB_TRANSFER_COMPLETED; + case kIOReturnSuccess: + usbi_dbg ("kIOReturnSuccess"); + return LIBUSB_TRANSFER_COMPLETED; + case kIOReturnAborted: + usbi_dbg ("kIOReturnAborted"); + return LIBUSB_TRANSFER_CANCELLED; + case kIOUSBPipeStalled: + usbi_dbg ("kIOUSBPipeStalled"); + return LIBUSB_TRANSFER_STALL; + case kIOReturnOverrun: + usbi_dbg ("kIOReturnOverrun"); + return LIBUSB_TRANSFER_OVERFLOW; + case kIOUSBTransactionTimeout: + usbi_dbg ("kIOUSBTransactionTimeout"); + itransfer->timeout_flags |= USBI_TRANSFER_TIMED_OUT; + return LIBUSB_TRANSFER_TIMED_OUT; + default: + usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: %s (value = 0x%08x)", darwin_error_str (result), result); + return LIBUSB_TRANSFER_ERROR; + } +} + +static int darwin_handle_transfer_completion (struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + int isIsoc = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type; + int isBulk = LIBUSB_TRANSFER_TYPE_BULK == transfer->type; + int isControl = LIBUSB_TRANSFER_TYPE_CONTROL == transfer->type; + int isInterrupt = LIBUSB_TRANSFER_TYPE_INTERRUPT == transfer->type; + int i; + + if (!isIsoc && !isBulk && !isControl && !isInterrupt) { + usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } + + usbi_dbg ("handling %s completion with kernel status %d", + isControl ? "control" : isBulk ? "bulk" : isIsoc ? "isoc" : "interrupt", tpriv->result); + + if (kIOReturnSuccess == tpriv->result || kIOReturnUnderrun == tpriv->result) { + if (isIsoc && tpriv->isoc_framelist) { + /* copy isochronous results back */ + + for (i = 0; i < transfer->num_iso_packets ; i++) { + struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[i]; + lib_desc->status = darwin_to_libusb (tpriv->isoc_framelist[i].frStatus); + lib_desc->actual_length = tpriv->isoc_framelist[i].frActCount; + } + } else if (!isIsoc) + itransfer->transferred += tpriv->size; + } + + /* it is ok to handle cancelled transfers without calling usbi_handle_transfer_cancellation (we catch timeout transfers) */ + return usbi_handle_transfer_completion (itransfer, darwin_transfer_status (itransfer, tpriv->result)); +} + +static int darwin_clock_gettime(int clk_id, struct timespec *tp) { + mach_timespec_t sys_time; + clock_serv_t clock_ref; + + switch (clk_id) { + case USBI_CLOCK_REALTIME: + /* CLOCK_REALTIME represents time since the epoch */ + clock_ref = clock_realtime; + break; + case USBI_CLOCK_MONOTONIC: + /* use system boot time as reference for the monotonic clock */ + clock_ref = clock_monotonic; + break; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } + + clock_get_time (clock_ref, &sys_time); + + tp->tv_sec = sys_time.tv_sec; + tp->tv_nsec = sys_time.tv_nsec; + + return 0; +} + +#if InterfaceVersion >= 550 +static int darwin_alloc_streams (struct libusb_device_handle *dev_handle, uint32_t num_streams, unsigned char *endpoints, + int num_endpoints) { + struct darwin_interface *cInterface; + UInt32 supportsStreams; + uint8_t pipeRef; + int rc, i; + + /* find the mimimum number of supported streams on the endpoint list */ + for (i = 0 ; i < num_endpoints ; ++i) { + if (0 != (rc = ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface))) { + return rc; + } + + (*(cInterface->interface))->SupportsStreams (cInterface->interface, pipeRef, &supportsStreams); + if (num_streams > supportsStreams) + num_streams = supportsStreams; + } + + /* it is an error if any endpoint in endpoints does not support streams */ + if (0 == num_streams) + return LIBUSB_ERROR_INVALID_PARAM; + + /* create the streams */ + for (i = 0 ; i < num_endpoints ; ++i) { + (void) ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface); + + rc = (*(cInterface->interface))->CreateStreams (cInterface->interface, pipeRef, num_streams); + if (kIOReturnSuccess != rc) + return darwin_to_libusb(rc); + } + + return num_streams; +} + +static int darwin_free_streams (struct libusb_device_handle *dev_handle, unsigned char *endpoints, int num_endpoints) { + struct darwin_interface *cInterface; + UInt32 supportsStreams; + uint8_t pipeRef; + int rc; + + for (int i = 0 ; i < num_endpoints ; ++i) { + if (0 != (rc = ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface))) + return rc; + + (*(cInterface->interface))->SupportsStreams (cInterface->interface, pipeRef, &supportsStreams); + if (0 == supportsStreams) + return LIBUSB_ERROR_INVALID_PARAM; + + rc = (*(cInterface->interface))->CreateStreams (cInterface->interface, pipeRef, 0); + if (kIOReturnSuccess != rc) + return darwin_to_libusb(rc); + } + + return LIBUSB_SUCCESS; +} +#endif + +const struct usbi_os_backend darwin_backend = { + .name = "Darwin", + .caps = 0, + .init = darwin_init, + .exit = darwin_exit, + .get_device_list = NULL, /* not needed */ + .get_device_descriptor = darwin_get_device_descriptor, + .get_active_config_descriptor = darwin_get_active_config_descriptor, + .get_config_descriptor = darwin_get_config_descriptor, + .hotplug_poll = darwin_hotplug_poll, + + .open = darwin_open, + .close = darwin_close, + .get_configuration = darwin_get_configuration, + .set_configuration = darwin_set_configuration, + .claim_interface = darwin_claim_interface, + .release_interface = darwin_release_interface, + + .set_interface_altsetting = darwin_set_interface_altsetting, + .clear_halt = darwin_clear_halt, + .reset_device = darwin_reset_device, + +#if InterfaceVersion >= 550 + .alloc_streams = darwin_alloc_streams, + .free_streams = darwin_free_streams, +#endif + + .kernel_driver_active = darwin_kernel_driver_active, + .detach_kernel_driver = darwin_detach_kernel_driver, + .attach_kernel_driver = darwin_attach_kernel_driver, + + .destroy_device = darwin_destroy_device, + + .submit_transfer = darwin_submit_transfer, + .cancel_transfer = darwin_cancel_transfer, + .clear_transfer_priv = darwin_clear_transfer_priv, + + .handle_transfer_completion = darwin_handle_transfer_completion, + + .clock_gettime = darwin_clock_gettime, + + .device_priv_size = sizeof(struct darwin_device_priv), + .device_handle_priv_size = sizeof(struct darwin_device_handle_priv), + .transfer_priv_size = sizeof(struct darwin_transfer_priv), +}; diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/darwin_usb.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/darwin_usb.h new file mode 100644 index 00000000..11804342 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/darwin_usb.h @@ -0,0 +1,164 @@ +/* + * darwin backend for libusb 1.0 + * Copyright © 2008-2015 Nathan Hjelm + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if !defined(LIBUSB_DARWIN_H) +#define LIBUSB_DARWIN_H + +#include "libusbi.h" + +#include +#include +#include +#include + +/* IOUSBInterfaceInferface */ +#if defined (kIOUSBInterfaceInterfaceID700) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 + +#define usb_interface_t IOUSBInterfaceInterface700 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID700 +#define InterfaceVersion 700 + +#elif defined (kIOUSBInterfaceInterfaceID550) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 + +#define usb_interface_t IOUSBInterfaceInterface550 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID550 +#define InterfaceVersion 550 + +#elif defined (kIOUSBInterfaceInterfaceID500) + +#define usb_interface_t IOUSBInterfaceInterface500 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID500 +#define InterfaceVersion 500 + +#elif defined (kIOUSBInterfaceInterfaceID300) + +#define usb_interface_t IOUSBInterfaceInterface300 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300 +#define InterfaceVersion 300 + +#elif defined (kIOUSBInterfaceInterfaceID245) + +#define usb_interface_t IOUSBInterfaceInterface245 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245 +#define InterfaceVersion 245 + +#elif defined (kIOUSBInterfaceInterfaceID220) + +#define usb_interface_t IOUSBInterfaceInterface220 +#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220 +#define InterfaceVersion 220 + +#else + +#error "IOUSBFamily is too old. Please upgrade your OS" + +#endif + +/* IOUSBDeviceInterface */ +#if defined (kIOUSBDeviceInterfaceID500) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 + +#define usb_device_t IOUSBDeviceInterface500 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID500 +#define DeviceVersion 500 + +#elif defined (kIOUSBDeviceInterfaceID320) + +#define usb_device_t IOUSBDeviceInterface320 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID320 +#define DeviceVersion 320 + +#elif defined (kIOUSBDeviceInterfaceID300) + +#define usb_device_t IOUSBDeviceInterface300 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID300 +#define DeviceVersion 300 + +#elif defined (kIOUSBDeviceInterfaceID245) + +#define usb_device_t IOUSBDeviceInterface245 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID245 +#define DeviceVersion 245 + +#elif defined (kIOUSBDeviceInterfaceID220) +#define usb_device_t IOUSBDeviceInterface197 +#define DeviceInterfaceID kIOUSBDeviceInterfaceID197 +#define DeviceVersion 197 + +#else + +#error "IOUSBFamily is too old. Please upgrade your OS" + +#endif + +#if !defined(IO_OBJECT_NULL) +#define IO_OBJECT_NULL ((io_object_t) 0) +#endif + +typedef IOCFPlugInInterface *io_cf_plugin_ref_t; +typedef IONotificationPortRef io_notification_port_t; + +/* private structures */ +struct darwin_cached_device { + struct list_head list; + IOUSBDeviceDescriptor dev_descriptor; + UInt32 location; + UInt64 parent_session; + UInt64 session; + UInt16 address; + char sys_path[21]; + usb_device_t **device; + int open_count; + UInt8 first_config, active_config, port; + int can_enumerate; + int refcount; +}; + +struct darwin_device_priv { + struct darwin_cached_device *dev; +}; + +struct darwin_device_handle_priv { + int is_open; + CFRunLoopSourceRef cfSource; + + struct darwin_interface { + usb_interface_t **interface; + uint8_t num_endpoints; + CFRunLoopSourceRef cfSource; + uint64_t frames[256]; + uint8_t endpoint_addrs[USB_MAXENDPOINTS]; + } interfaces[USB_MAXINTERFACES]; +}; + +struct darwin_transfer_priv { + /* Isoc */ + IOUSBIsocFrame *isoc_framelist; + int num_iso_packets; + + /* Control */ + IOUSBDevRequestTO req; + + /* Bulk */ + + /* Completion status */ + IOReturn result; + UInt32 size; +}; + +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/linux_netlink.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/linux_netlink.c new file mode 100644 index 00000000..60cf3ad1 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/linux_netlink.c @@ -0,0 +1,400 @@ +/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */ +/* + * Linux usbfs backend for libusb + * Copyright (C) 2007-2009 Daniel Drake + * Copyright (c) 2001 Johannes Erdfelt + * Copyright (c) 2013 Nathan Hjelm + * Copyright (c) 2016 Chris Dickens + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_ASM_TYPES_H +#include +#endif + +#include +#include + +#include "libusbi.h" +#include "linux_usbfs.h" + +#define NL_GROUP_KERNEL 1 + +static int linux_netlink_socket = -1; +static int netlink_control_pipe[2] = { -1, -1 }; +static pthread_t libusb_linux_event_thread; + +static void *linux_netlink_event_thread_main(void *arg); + +static int set_fd_cloexec_nb(int fd) +{ + int flags; + +#if defined(FD_CLOEXEC) + flags = fcntl(fd, F_GETFD); + if (flags == -1) { + usbi_err(NULL, "failed to get netlink fd flags (%d)", errno); + return -1; + } + + if (!(flags & FD_CLOEXEC)) { + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) { + usbi_err(NULL, "failed to set netlink fd flags (%d)", errno); + return -1; + } + } +#endif + + flags = fcntl(fd, F_GETFL); + if (flags == -1) { + usbi_err(NULL, "failed to get netlink fd status flags (%d)", errno); + return -1; + } + + if (!(flags & O_NONBLOCK)) { + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) { + usbi_err(NULL, "failed to set netlink fd status flags (%d)", errno); + return -1; + } + } + + return 0; +} + +int linux_netlink_start_event_monitor(void) +{ + struct sockaddr_nl sa_nl = { .nl_family = AF_NETLINK, .nl_groups = NL_GROUP_KERNEL }; + int socktype = SOCK_RAW; + int opt = 1; + int ret; + +#if defined(SOCK_CLOEXEC) + socktype |= SOCK_CLOEXEC; +#endif +#if defined(SOCK_NONBLOCK) + socktype |= SOCK_NONBLOCK; +#endif + + linux_netlink_socket = socket(PF_NETLINK, socktype, NETLINK_KOBJECT_UEVENT); + if (linux_netlink_socket == -1 && errno == EINVAL) { + usbi_dbg("failed to create netlink socket of type %d, attempting SOCK_RAW", socktype); + linux_netlink_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT); + } + + if (linux_netlink_socket == -1) { + usbi_err(NULL, "failed to create netlink socket (%d)", errno); + goto err; + } + + ret = set_fd_cloexec_nb(linux_netlink_socket); + if (ret == -1) + goto err_close_socket; + + ret = bind(linux_netlink_socket, (struct sockaddr *)&sa_nl, sizeof(sa_nl)); + if (ret == -1) { + usbi_err(NULL, "failed to bind netlink socket (%d)", errno); + goto err_close_socket; + } + + ret = setsockopt(linux_netlink_socket, SOL_SOCKET, SO_PASSCRED, &opt, sizeof(opt)); + if (ret == -1) { + usbi_err(NULL, "failed to set netlink socket SO_PASSCRED option (%d)", errno); + goto err_close_socket; + } + + ret = usbi_pipe(netlink_control_pipe); + if (ret) { + usbi_err(NULL, "failed to create netlink control pipe"); + goto err_close_socket; + } + + ret = pthread_create(&libusb_linux_event_thread, NULL, linux_netlink_event_thread_main, NULL); + if (ret != 0) { + usbi_err(NULL, "failed to create netlink event thread (%d)", ret); + goto err_close_pipe; + } + + return LIBUSB_SUCCESS; + +err_close_pipe: + close(netlink_control_pipe[0]); + close(netlink_control_pipe[1]); + netlink_control_pipe[0] = -1; + netlink_control_pipe[1] = -1; +err_close_socket: + close(linux_netlink_socket); + linux_netlink_socket = -1; +err: + return LIBUSB_ERROR_OTHER; +} + +int linux_netlink_stop_event_monitor(void) +{ + char dummy = 1; + ssize_t r; + + assert(linux_netlink_socket != -1); + + /* Write some dummy data to the control pipe and + * wait for the thread to exit */ + r = usbi_write(netlink_control_pipe[1], &dummy, sizeof(dummy)); + if (r <= 0) + usbi_warn(NULL, "netlink control pipe signal failed"); + + pthread_join(libusb_linux_event_thread, NULL); + + close(linux_netlink_socket); + linux_netlink_socket = -1; + + /* close and reset control pipe */ + close(netlink_control_pipe[0]); + close(netlink_control_pipe[1]); + netlink_control_pipe[0] = -1; + netlink_control_pipe[1] = -1; + + return LIBUSB_SUCCESS; +} + +static const char *netlink_message_parse(const char *buffer, size_t len, const char *key) +{ + const char *end = buffer + len; + size_t keylen = strlen(key); + + while (buffer < end && *buffer) { + if (strncmp(buffer, key, keylen) == 0 && buffer[keylen] == '=') + return buffer + keylen + 1; + buffer += strlen(buffer) + 1; + } + + return NULL; +} + +/* parse parts of netlink message common to both libudev and the kernel */ +static int linux_netlink_parse(const char *buffer, size_t len, int *detached, + const char **sys_name, uint8_t *busnum, uint8_t *devaddr) +{ + const char *tmp, *slash; + + errno = 0; + + *sys_name = NULL; + *detached = 0; + *busnum = 0; + *devaddr = 0; + + tmp = netlink_message_parse(buffer, len, "ACTION"); + if (!tmp) { + return -1; + } else if (strcmp(tmp, "remove") == 0) { + *detached = 1; + } else if (strcmp(tmp, "add") != 0) { + usbi_dbg("unknown device action %s", tmp); + return -1; + } + + /* check that this is a usb message */ + tmp = netlink_message_parse(buffer, len, "SUBSYSTEM"); + if (!tmp || strcmp(tmp, "usb") != 0) { + /* not usb. ignore */ + return -1; + } + + /* check that this is an actual usb device */ + tmp = netlink_message_parse(buffer, len, "DEVTYPE"); + if (!tmp || strcmp(tmp, "usb_device") != 0) { + /* not usb. ignore */ + return -1; + } + + tmp = netlink_message_parse(buffer, len, "BUSNUM"); + if (tmp) { + *busnum = (uint8_t)(strtoul(tmp, NULL, 10) & 0xff); + if (errno) { + errno = 0; + return -1; + } + + tmp = netlink_message_parse(buffer, len, "DEVNUM"); + if (NULL == tmp) + return -1; + + *devaddr = (uint8_t)(strtoul(tmp, NULL, 10) & 0xff); + if (errno) { + errno = 0; + return -1; + } + } else { + /* no bus number. try "DEVICE" */ + tmp = netlink_message_parse(buffer, len, "DEVICE"); + if (!tmp) { + /* not usb. ignore */ + return -1; + } + + /* Parse a device path such as /dev/bus/usb/003/004 */ + slash = strrchr(tmp, '/'); + if (!slash) + return -1; + + *busnum = (uint8_t)(strtoul(slash - 3, NULL, 10) & 0xff); + if (errno) { + errno = 0; + return -1; + } + + *devaddr = (uint8_t)(strtoul(slash + 1, NULL, 10) & 0xff); + if (errno) { + errno = 0; + return -1; + } + + return 0; + } + + tmp = netlink_message_parse(buffer, len, "DEVPATH"); + if (!tmp) + return -1; + + slash = strrchr(tmp, '/'); + if (slash) + *sys_name = slash + 1; + + /* found a usb device */ + return 0; +} + +static int linux_netlink_read_message(void) +{ + char cred_buffer[CMSG_SPACE(sizeof(struct ucred))]; + char msg_buffer[2048]; + const char *sys_name = NULL; + uint8_t busnum, devaddr; + int detached, r; + ssize_t len; + struct cmsghdr *cmsg; + struct ucred *cred; + struct sockaddr_nl sa_nl; + struct iovec iov = { .iov_base = msg_buffer, .iov_len = sizeof(msg_buffer) }; + struct msghdr msg = { + .msg_iov = &iov, .msg_iovlen = 1, + .msg_control = cred_buffer, .msg_controllen = sizeof(cred_buffer), + .msg_name = &sa_nl, .msg_namelen = sizeof(sa_nl) + }; + + /* read netlink message */ + len = recvmsg(linux_netlink_socket, &msg, 0); + if (len == -1) { + if (errno != EAGAIN && errno != EINTR) + usbi_err(NULL, "error receiving message from netlink (%d)", errno); + return -1; + } + + if (len < 32 || (msg.msg_flags & MSG_TRUNC)) { + usbi_err(NULL, "invalid netlink message length"); + return -1; + } + + if (sa_nl.nl_groups != NL_GROUP_KERNEL || sa_nl.nl_pid != 0) { + usbi_dbg("ignoring netlink message from unknown group/PID (%u/%u)", + (unsigned int)sa_nl.nl_groups, (unsigned int)sa_nl.nl_pid); + return -1; + } + + cmsg = CMSG_FIRSTHDR(&msg); + if (!cmsg || cmsg->cmsg_type != SCM_CREDENTIALS) { + usbi_dbg("ignoring netlink message with no sender credentials"); + return -1; + } + + cred = (struct ucred *)CMSG_DATA(cmsg); + if (cred->uid != 0) { + usbi_dbg("ignoring netlink message with non-zero sender UID %u", (unsigned int)cred->uid); + return -1; + } + + r = linux_netlink_parse(msg_buffer, (size_t)len, &detached, &sys_name, &busnum, &devaddr); + if (r) + return r; + + usbi_dbg("netlink hotplug found device busnum: %hhu, devaddr: %hhu, sys_name: %s, removed: %s", + busnum, devaddr, sys_name, detached ? "yes" : "no"); + + /* signal device is available (or not) to all contexts */ + if (detached) + linux_device_disconnected(busnum, devaddr); + else + linux_hotplug_enumerate(busnum, devaddr, sys_name); + + return 0; +} + +static void *linux_netlink_event_thread_main(void *arg) +{ + char dummy; + ssize_t r; + struct pollfd fds[] = { + { .fd = netlink_control_pipe[0], + .events = POLLIN }, + { .fd = linux_netlink_socket, + .events = POLLIN }, + }; + + UNUSED(arg); + + usbi_dbg("netlink event thread entering"); + + while (poll(fds, 2, -1) >= 0) { + if (fds[0].revents & POLLIN) { + /* activity on control pipe, read the byte and exit */ + r = usbi_read(netlink_control_pipe[0], &dummy, sizeof(dummy)); + if (r <= 0) + usbi_warn(NULL, "netlink control pipe read failed"); + break; + } + if (fds[1].revents & POLLIN) { + usbi_mutex_static_lock(&linux_hotplug_lock); + linux_netlink_read_message(); + usbi_mutex_static_unlock(&linux_hotplug_lock); + } + } + + usbi_dbg("netlink event thread exiting"); + + return NULL; +} + +void linux_netlink_hotplug_poll(void) +{ + int r; + + usbi_mutex_static_lock(&linux_hotplug_lock); + do { + r = linux_netlink_read_message(); + } while (r == 0); + usbi_mutex_static_unlock(&linux_hotplug_lock); +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/linux_usbfs.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/linux_usbfs.c new file mode 100644 index 00000000..6b89ba28 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/linux_usbfs.c @@ -0,0 +1,2738 @@ +/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */ +/* + * Linux usbfs backend for libusb + * Copyright © 2007-2009 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * Copyright © 2013 Nathan Hjelm + * Copyright © 2012-2013 Hans de Goede + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libusbi.h" +#include "linux_usbfs.h" + +/* sysfs vs usbfs: + * opening a usbfs node causes the device to be resumed, so we attempt to + * avoid this during enumeration. + * + * sysfs allows us to read the kernel's in-memory copies of device descriptors + * and so forth, avoiding the need to open the device: + * - The binary "descriptors" file contains all config descriptors since + * 2.6.26, commit 217a9081d8e69026186067711131b77f0ce219ed + * - The binary "descriptors" file was added in 2.6.23, commit + * 69d42a78f935d19384d1f6e4f94b65bb162b36df, but it only contains the + * active config descriptors + * - The "busnum" file was added in 2.6.22, commit + * 83f7d958eab2fbc6b159ee92bf1493924e1d0f72 + * - The "devnum" file has been present since pre-2.6.18 + * - the "bConfigurationValue" file has been present since pre-2.6.18 + * + * If we have bConfigurationValue, busnum, and devnum, then we can determine + * the active configuration without having to open the usbfs node in RDWR mode. + * The busnum file is important as that is the only way we can relate sysfs + * devices to usbfs nodes. + * + * If we also have all descriptors, we can obtain the device descriptor and + * configuration without touching usbfs at all. + */ + +/* endianness for multi-byte fields: + * + * Descriptors exposed by usbfs have the multi-byte fields in the device + * descriptor as host endian. Multi-byte fields in the other descriptors are + * bus-endian. The kernel documentation says otherwise, but it is wrong. + * + * In sysfs all descriptors are bus-endian. + */ + +static const char *usbfs_path = NULL; + +/* use usbdev*.* device names in /dev instead of the usbfs bus directories */ +static int usbdev_names = 0; + +/* Linux 2.6.32 adds support for a bulk continuation URB flag. this basically + * allows us to mark URBs as being part of a specific logical transfer when + * we submit them to the kernel. then, on any error except a cancellation, all + * URBs within that transfer will be cancelled and no more URBs will be + * accepted for the transfer, meaning that no more data can creep in. + * + * The BULK_CONTINUATION flag must be set on all URBs within a bulk transfer + * (in either direction) except the first. + * For IN transfers, we must also set SHORT_NOT_OK on all URBs except the + * last; it means that the kernel should treat a short reply as an error. + * For OUT transfers, SHORT_NOT_OK must not be set. it isn't needed (OUT + * transfers can't be short unless there's already some sort of error), and + * setting this flag is disallowed (a kernel with USB debugging enabled will + * reject such URBs). + */ +static int supports_flag_bulk_continuation = -1; + +/* Linux 2.6.31 fixes support for the zero length packet URB flag. This + * allows us to mark URBs that should be followed by a zero length data + * packet, which can be required by device- or class-specific protocols. + */ +static int supports_flag_zero_packet = -1; + +/* clock ID for monotonic clock, as not all clock sources are available on all + * systems. appropriate choice made at initialization time. */ +static clockid_t monotonic_clkid = -1; + +/* Linux 2.6.22 (commit 83f7d958eab2fbc6b159ee92bf1493924e1d0f72) adds a busnum + * to sysfs, so we can relate devices. This also implies that we can read + * the active configuration through bConfigurationValue */ +static int sysfs_can_relate_devices = -1; + +/* Linux 2.6.26 (commit 217a9081d8e69026186067711131b77f0ce219ed) adds all + * config descriptors (rather then just the active config) to the sysfs + * descriptors file, so from then on we can use them. */ +static int sysfs_has_descriptors = -1; + +/* how many times have we initted (and not exited) ? */ +static int init_count = 0; + +/* Serialize hotplug start/stop */ +static usbi_mutex_static_t linux_hotplug_startstop_lock = USBI_MUTEX_INITIALIZER; +/* Serialize scan-devices, event-thread, and poll */ +usbi_mutex_static_t linux_hotplug_lock = USBI_MUTEX_INITIALIZER; + +static int linux_start_event_monitor(void); +static int linux_stop_event_monitor(void); +static int linux_scan_devices(struct libusb_context *ctx); +static int sysfs_scan_device(struct libusb_context *ctx, const char *devname); +static int detach_kernel_driver_and_claim(struct libusb_device_handle *, int); + +#if !defined(USE_UDEV) +static int linux_default_scan_devices (struct libusb_context *ctx); +#endif + +struct linux_device_priv { + char *sysfs_dir; + unsigned char *descriptors; + int descriptors_len; + int active_config; /* cache val for !sysfs_can_relate_devices */ +}; + +struct linux_device_handle_priv { + int fd; + int fd_removed; + uint32_t caps; +}; + +enum reap_action { + NORMAL = 0, + /* submission failed after the first URB, so await cancellation/completion + * of all the others */ + SUBMIT_FAILED, + + /* cancelled by user or timeout */ + CANCELLED, + + /* completed multi-URB transfer in non-final URB */ + COMPLETED_EARLY, + + /* one or more urbs encountered a low-level error */ + ERROR, +}; + +struct linux_transfer_priv { + union { + struct usbfs_urb *urbs; + struct usbfs_urb **iso_urbs; + }; + + enum reap_action reap_action; + int num_urbs; + int num_retired; + enum libusb_transfer_status reap_status; + + /* next iso packet in user-supplied transfer to be populated */ + int iso_packet_offset; +}; + +static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + char path[PATH_MAX]; + int fd; + int delay = 10000; + + if (usbdev_names) + snprintf(path, PATH_MAX, "%s/usbdev%d.%d", + usbfs_path, dev->bus_number, dev->device_address); + else + snprintf(path, PATH_MAX, "%s/%03d/%03d", + usbfs_path, dev->bus_number, dev->device_address); + + fd = open(path, mode); + if (fd != -1) + return fd; /* Success */ + + if (errno == ENOENT) { + if (!silent) + usbi_err(ctx, "File doesn't exist, wait %d ms and try again", delay/1000); + + /* Wait 10ms for USB device path creation.*/ + nanosleep(&(struct timespec){delay / 1000000, (delay * 1000) % 1000000000UL}, NULL); + + fd = open(path, mode); + if (fd != -1) + return fd; /* Success */ + } + + if (!silent) { + usbi_err(ctx, "libusb couldn't open USB device %s: %s", + path, strerror(errno)); + if (errno == EACCES && mode == O_RDWR) + usbi_err(ctx, "libusb requires write access to USB " + "device nodes."); + } + + if (errno == EACCES) + return LIBUSB_ERROR_ACCESS; + if (errno == ENOENT) + return LIBUSB_ERROR_NO_DEVICE; + return LIBUSB_ERROR_IO; +} + +static struct linux_device_priv *_device_priv(struct libusb_device *dev) +{ + return (struct linux_device_priv *) dev->os_priv; +} + +static struct linux_device_handle_priv *_device_handle_priv( + struct libusb_device_handle *handle) +{ + return (struct linux_device_handle_priv *) handle->os_priv; +} + +/* check dirent for a /dev/usbdev%d.%d name + * optionally return bus/device on success */ +static int _is_usbdev_entry(struct dirent *entry, int *bus_p, int *dev_p) +{ + int busnum, devnum; + + if (sscanf(entry->d_name, "usbdev%d.%d", &busnum, &devnum) != 2) + return 0; + + usbi_dbg("found: %s", entry->d_name); + if (bus_p != NULL) + *bus_p = busnum; + if (dev_p != NULL) + *dev_p = devnum; + return 1; +} + +static int check_usb_vfs(const char *dirname) +{ + DIR *dir; + struct dirent *entry; + int found = 0; + + dir = opendir(dirname); + if (!dir) + return 0; + + while ((entry = readdir(dir)) != NULL) { + if (entry->d_name[0] == '.') + continue; + + /* We assume if we find any files that it must be the right place */ + found = 1; + break; + } + + closedir(dir); + return found; +} + +static const char *find_usbfs_path(void) +{ + const char *path = "/dev/bus/usb"; + const char *ret = NULL; + + if (check_usb_vfs(path)) { + ret = path; + } else { + path = "/proc/bus/usb"; + if (check_usb_vfs(path)) + ret = path; + } + + /* look for /dev/usbdev*.* if the normal places fail */ + if (ret == NULL) { + struct dirent *entry; + DIR *dir; + + path = "/dev"; + dir = opendir(path); + if (dir != NULL) { + while ((entry = readdir(dir)) != NULL) { + if (_is_usbdev_entry(entry, NULL, NULL)) { + /* found one; that's enough */ + ret = path; + usbdev_names = 1; + break; + } + } + closedir(dir); + } + } + +/* On udev based systems without any usb-devices /dev/bus/usb will not + * exist. So if we've not found anything and we're using udev for hotplug + * simply assume /dev/bus/usb rather then making libusb_init fail. */ +#if defined(USE_UDEV) + if (ret == NULL) + ret = "/dev/bus/usb"; +#endif + + if (ret != NULL) + usbi_dbg("found usbfs at %s", ret); + + return ret; +} + +/* the monotonic clock is not usable on all systems (e.g. embedded ones often + * seem to lack it). fall back to REALTIME if we have to. */ +static clockid_t find_monotonic_clock(void) +{ +#ifdef CLOCK_MONOTONIC + struct timespec ts; + int r; + + /* Linux 2.6.28 adds CLOCK_MONOTONIC_RAW but we don't use it + * because it's not available through timerfd */ + r = clock_gettime(CLOCK_MONOTONIC, &ts); + if (r == 0) + return CLOCK_MONOTONIC; + usbi_dbg("monotonic clock doesn't work, errno %d", errno); +#endif + + return CLOCK_REALTIME; +} + +static int kernel_version_ge(int major, int minor, int sublevel) +{ + struct utsname uts; + int atoms, kmajor, kminor, ksublevel; + + if (uname(&uts) < 0) + return -1; + atoms = sscanf(uts.release, "%d.%d.%d", &kmajor, &kminor, &ksublevel); + if (atoms < 1) + return -1; + + if (kmajor > major) + return 1; + if (kmajor < major) + return 0; + + /* kmajor == major */ + if (atoms < 2) + return 0 == minor && 0 == sublevel; + if (kminor > minor) + return 1; + if (kminor < minor) + return 0; + + /* kminor == minor */ + if (atoms < 3) + return 0 == sublevel; + + return ksublevel >= sublevel; +} + +static int op_init(struct libusb_context *ctx) +{ + struct stat statbuf; + int r; + + usbfs_path = find_usbfs_path(); + if (!usbfs_path) { + usbi_err(ctx, "could not find usbfs"); + return LIBUSB_ERROR_OTHER; + } + + if (monotonic_clkid == -1) + monotonic_clkid = find_monotonic_clock(); + + if (supports_flag_bulk_continuation == -1) { + /* bulk continuation URB flag available from Linux 2.6.32 */ + supports_flag_bulk_continuation = kernel_version_ge(2,6,32); + if (supports_flag_bulk_continuation == -1) { + usbi_err(ctx, "error checking for bulk continuation support"); + return LIBUSB_ERROR_OTHER; + } + } + + if (supports_flag_bulk_continuation) + usbi_dbg("bulk continuation flag supported"); + + if (-1 == supports_flag_zero_packet) { + /* zero length packet URB flag fixed since Linux 2.6.31 */ + supports_flag_zero_packet = kernel_version_ge(2,6,31); + if (-1 == supports_flag_zero_packet) { + usbi_err(ctx, "error checking for zero length packet support"); + return LIBUSB_ERROR_OTHER; + } + } + + if (supports_flag_zero_packet) + usbi_dbg("zero length packet flag supported"); + + if (-1 == sysfs_has_descriptors) { + /* sysfs descriptors has all descriptors since Linux 2.6.26 */ + sysfs_has_descriptors = kernel_version_ge(2,6,26); + if (-1 == sysfs_has_descriptors) { + usbi_err(ctx, "error checking for sysfs descriptors"); + return LIBUSB_ERROR_OTHER; + } + } + + if (-1 == sysfs_can_relate_devices) { + /* sysfs has busnum since Linux 2.6.22 */ + sysfs_can_relate_devices = kernel_version_ge(2,6,22); + if (-1 == sysfs_can_relate_devices) { + usbi_err(ctx, "error checking for sysfs busnum"); + return LIBUSB_ERROR_OTHER; + } + } + + if (sysfs_can_relate_devices || sysfs_has_descriptors) { + r = stat(SYSFS_DEVICE_PATH, &statbuf); + if (r != 0 || !S_ISDIR(statbuf.st_mode)) { + usbi_warn(ctx, "sysfs not mounted"); + sysfs_can_relate_devices = 0; + sysfs_has_descriptors = 0; + } + } + + if (sysfs_can_relate_devices) + usbi_dbg("sysfs can relate devices"); + + if (sysfs_has_descriptors) + usbi_dbg("sysfs has complete descriptors"); + + usbi_mutex_static_lock(&linux_hotplug_startstop_lock); + r = LIBUSB_SUCCESS; + if (init_count == 0) { + /* start up hotplug event handler */ + r = linux_start_event_monitor(); + } + if (r == LIBUSB_SUCCESS) { + r = linux_scan_devices(ctx); + if (r == LIBUSB_SUCCESS) + init_count++; + else if (init_count == 0) + linux_stop_event_monitor(); + } else + usbi_err(ctx, "error starting hotplug event monitor"); + usbi_mutex_static_unlock(&linux_hotplug_startstop_lock); + + return r; +} + +static void op_exit(void) +{ + usbi_mutex_static_lock(&linux_hotplug_startstop_lock); + assert(init_count != 0); + if (!--init_count) { + /* tear down event handler */ + (void)linux_stop_event_monitor(); + } + usbi_mutex_static_unlock(&linux_hotplug_startstop_lock); +} + +static int linux_start_event_monitor(void) +{ +#if defined(USE_UDEV) + return linux_udev_start_event_monitor(); +#else + return linux_netlink_start_event_monitor(); +#endif +} + +static int linux_stop_event_monitor(void) +{ +#if defined(USE_UDEV) + return linux_udev_stop_event_monitor(); +#else + return linux_netlink_stop_event_monitor(); +#endif +} + +static int linux_scan_devices(struct libusb_context *ctx) +{ + int ret; + + usbi_mutex_static_lock(&linux_hotplug_lock); + +#if defined(USE_UDEV) + ret = linux_udev_scan_devices(ctx); +#else + ret = linux_default_scan_devices(ctx); +#endif + + usbi_mutex_static_unlock(&linux_hotplug_lock); + + return ret; +} + +static void op_hotplug_poll(void) +{ +#if defined(USE_UDEV) + linux_udev_hotplug_poll(); +#else + linux_netlink_hotplug_poll(); +#endif +} + +static int _open_sysfs_attr(struct libusb_device *dev, const char *attr) +{ + struct linux_device_priv *priv = _device_priv(dev); + char filename[PATH_MAX]; + int fd; + + snprintf(filename, PATH_MAX, "%s/%s/%s", + SYSFS_DEVICE_PATH, priv->sysfs_dir, attr); + fd = open(filename, O_RDONLY); + if (fd < 0) { + usbi_err(DEVICE_CTX(dev), + "open %s failed ret=%d errno=%d", filename, fd, errno); + return LIBUSB_ERROR_IO; + } + + return fd; +} + +/* Note only suitable for attributes which always read >= 0, < 0 is error */ +static int __read_sysfs_attr(struct libusb_context *ctx, + const char *devname, const char *attr) +{ + char filename[PATH_MAX]; + FILE *f; + int r, value; + + snprintf(filename, PATH_MAX, "%s/%s/%s", SYSFS_DEVICE_PATH, + devname, attr); + f = fopen(filename, "r"); + if (f == NULL) { + if (errno == ENOENT) { + /* File doesn't exist. Assume the device has been + disconnected (see trac ticket #70). */ + return LIBUSB_ERROR_NO_DEVICE; + } + usbi_err(ctx, "open %s failed errno=%d", filename, errno); + return LIBUSB_ERROR_IO; + } + + r = fscanf(f, "%d", &value); + fclose(f); + if (r != 1) { + usbi_err(ctx, "fscanf %s returned %d, errno=%d", attr, r, errno); + return LIBUSB_ERROR_NO_DEVICE; /* For unplug race (trac #70) */ + } + if (value < 0) { + usbi_err(ctx, "%s contains a negative value", filename); + return LIBUSB_ERROR_IO; + } + + return value; +} + +static int op_get_device_descriptor(struct libusb_device *dev, + unsigned char *buffer, int *host_endian) +{ + struct linux_device_priv *priv = _device_priv(dev); + + *host_endian = sysfs_has_descriptors ? 0 : 1; + memcpy(buffer, priv->descriptors, DEVICE_DESC_LENGTH); + + return 0; +} + +/* read the bConfigurationValue for a device */ +static int sysfs_get_active_config(struct libusb_device *dev, int *config) +{ + char *endptr; + char tmp[5] = {0, 0, 0, 0, 0}; + long num; + int fd; + ssize_t r; + + fd = _open_sysfs_attr(dev, "bConfigurationValue"); + if (fd < 0) + return fd; + + r = read(fd, tmp, sizeof(tmp)); + close(fd); + if (r < 0) { + usbi_err(DEVICE_CTX(dev), + "read bConfigurationValue failed ret=%d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } else if (r == 0) { + usbi_dbg("device unconfigured"); + *config = -1; + return 0; + } + + if (tmp[sizeof(tmp) - 1] != 0) { + usbi_err(DEVICE_CTX(dev), "not null-terminated?"); + return LIBUSB_ERROR_IO; + } else if (tmp[0] == 0) { + usbi_err(DEVICE_CTX(dev), "no configuration value?"); + return LIBUSB_ERROR_IO; + } + + num = strtol(tmp, &endptr, 10); + if (endptr == tmp) { + usbi_err(DEVICE_CTX(dev), "error converting '%s' to integer", tmp); + return LIBUSB_ERROR_IO; + } + + *config = (int) num; + return 0; +} + +int linux_get_device_address (struct libusb_context *ctx, int detached, + uint8_t *busnum, uint8_t *devaddr,const char *dev_node, + const char *sys_name) +{ + int sysfs_attr; + + usbi_dbg("getting address for device: %s detached: %d", sys_name, detached); + /* can't use sysfs to read the bus and device number if the + * device has been detached */ + if (!sysfs_can_relate_devices || detached || NULL == sys_name) { + if (NULL == dev_node) { + return LIBUSB_ERROR_OTHER; + } + + /* will this work with all supported kernel versions? */ + if (!strncmp(dev_node, "/dev/bus/usb", 12)) { + sscanf (dev_node, "/dev/bus/usb/%hhu/%hhu", busnum, devaddr); + } else if (!strncmp(dev_node, "/proc/bus/usb", 13)) { + sscanf (dev_node, "/proc/bus/usb/%hhu/%hhu", busnum, devaddr); + } + + return LIBUSB_SUCCESS; + } + + usbi_dbg("scan %s", sys_name); + + sysfs_attr = __read_sysfs_attr(ctx, sys_name, "busnum"); + if (0 > sysfs_attr) + return sysfs_attr; + if (sysfs_attr > 255) + return LIBUSB_ERROR_INVALID_PARAM; + *busnum = (uint8_t) sysfs_attr; + + sysfs_attr = __read_sysfs_attr(ctx, sys_name, "devnum"); + if (0 > sysfs_attr) + return sysfs_attr; + if (sysfs_attr > 255) + return LIBUSB_ERROR_INVALID_PARAM; + + *devaddr = (uint8_t) sysfs_attr; + + usbi_dbg("bus=%d dev=%d", *busnum, *devaddr); + + return LIBUSB_SUCCESS; +} + +/* Return offset of the next descriptor with the given type */ +static int seek_to_next_descriptor(struct libusb_context *ctx, + uint8_t descriptor_type, unsigned char *buffer, int size) +{ + struct usb_descriptor_header header; + int i; + + for (i = 0; size >= 0; i += header.bLength, size -= header.bLength) { + if (size == 0) + return LIBUSB_ERROR_NOT_FOUND; + + if (size < 2) { + usbi_err(ctx, "short descriptor read %d/2", size); + return LIBUSB_ERROR_IO; + } + usbi_parse_descriptor(buffer + i, "bb", &header, 0); + + if (i && header.bDescriptorType == descriptor_type) + return i; + } + usbi_err(ctx, "bLength overflow by %d bytes", -size); + return LIBUSB_ERROR_IO; +} + +/* Return offset to next config */ +static int seek_to_next_config(struct libusb_context *ctx, + unsigned char *buffer, int size) +{ + struct libusb_config_descriptor config; + + if (size == 0) + return LIBUSB_ERROR_NOT_FOUND; + + if (size < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(ctx, "short descriptor read %d/%d", + size, LIBUSB_DT_CONFIG_SIZE); + return LIBUSB_ERROR_IO; + } + + usbi_parse_descriptor(buffer, "bbwbbbbb", &config, 0); + if (config.bDescriptorType != LIBUSB_DT_CONFIG) { + usbi_err(ctx, "descriptor is not a config desc (type 0x%02x)", + config.bDescriptorType); + return LIBUSB_ERROR_IO; + } + + /* + * In usbfs the config descriptors are config.wTotalLength bytes apart, + * with any short reads from the device appearing as holes in the file. + * + * In sysfs wTotalLength is ignored, instead the kernel returns a + * config descriptor with verified bLength fields, with descriptors + * with an invalid bLength removed. + */ + if (sysfs_has_descriptors) { + int next = seek_to_next_descriptor(ctx, LIBUSB_DT_CONFIG, + buffer, size); + if (next == LIBUSB_ERROR_NOT_FOUND) + next = size; + if (next < 0) + return next; + + if (next != config.wTotalLength) + usbi_warn(ctx, "config length mismatch wTotalLength " + "%d real %d", config.wTotalLength, next); + return next; + } else { + if (config.wTotalLength < LIBUSB_DT_CONFIG_SIZE) { + usbi_err(ctx, "invalid wTotalLength %d", + config.wTotalLength); + return LIBUSB_ERROR_IO; + } else if (config.wTotalLength > size) { + usbi_warn(ctx, "short descriptor read %d/%d", + size, config.wTotalLength); + return size; + } else + return config.wTotalLength; + } +} + +static int op_get_config_descriptor_by_value(struct libusb_device *dev, + uint8_t value, unsigned char **buffer, int *host_endian) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + struct linux_device_priv *priv = _device_priv(dev); + unsigned char *descriptors = priv->descriptors; + int size = priv->descriptors_len; + struct libusb_config_descriptor *config; + + *buffer = NULL; + /* Unlike the device desc. config descs. are always in raw format */ + *host_endian = 0; + + /* Skip device header */ + descriptors += DEVICE_DESC_LENGTH; + size -= DEVICE_DESC_LENGTH; + + /* Seek till the config is found, or till "EOF" */ + while (1) { + int next = seek_to_next_config(ctx, descriptors, size); + if (next < 0) + return next; + config = (struct libusb_config_descriptor *)descriptors; + if (config->bConfigurationValue == value) { + *buffer = descriptors; + return next; + } + size -= next; + descriptors += next; + } +} + +static int op_get_active_config_descriptor(struct libusb_device *dev, + unsigned char *buffer, size_t len, int *host_endian) +{ + int r, config; + unsigned char *config_desc; + + if (sysfs_can_relate_devices) { + r = sysfs_get_active_config(dev, &config); + if (r < 0) + return r; + } else { + /* Use cached bConfigurationValue */ + struct linux_device_priv *priv = _device_priv(dev); + config = priv->active_config; + } + if (config == -1) + return LIBUSB_ERROR_NOT_FOUND; + + r = op_get_config_descriptor_by_value(dev, config, &config_desc, + host_endian); + if (r < 0) + return r; + + len = MIN(len, r); + memcpy(buffer, config_desc, len); + return len; +} + +static int op_get_config_descriptor(struct libusb_device *dev, + uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +{ + struct linux_device_priv *priv = _device_priv(dev); + unsigned char *descriptors = priv->descriptors; + int i, r, size = priv->descriptors_len; + + /* Unlike the device desc. config descs. are always in raw format */ + *host_endian = 0; + + /* Skip device header */ + descriptors += DEVICE_DESC_LENGTH; + size -= DEVICE_DESC_LENGTH; + + /* Seek till the config is found, or till "EOF" */ + for (i = 0; ; i++) { + r = seek_to_next_config(DEVICE_CTX(dev), descriptors, size); + if (r < 0) + return r; + if (i == config_index) + break; + size -= r; + descriptors += r; + } + + len = MIN(len, r); + memcpy(buffer, descriptors, len); + return len; +} + +/* send a control message to retrieve active configuration */ +static int usbfs_get_active_config(struct libusb_device *dev, int fd) +{ + struct linux_device_priv *priv = _device_priv(dev); + unsigned char active_config = 0; + int r; + + struct usbfs_ctrltransfer ctrl = { + .bmRequestType = LIBUSB_ENDPOINT_IN, + .bRequest = LIBUSB_REQUEST_GET_CONFIGURATION, + .wValue = 0, + .wIndex = 0, + .wLength = 1, + .timeout = 1000, + .data = &active_config + }; + + r = ioctl(fd, IOCTL_USBFS_CONTROL, &ctrl); + if (r < 0) { + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + /* we hit this error path frequently with buggy devices :( */ + usbi_warn(DEVICE_CTX(dev), + "get_configuration failed ret=%d errno=%d", r, errno); + priv->active_config = -1; + } else { + if (active_config > 0) { + priv->active_config = active_config; + } else { + /* some buggy devices have a configuration 0, but we're + * reaching into the corner of a corner case here, so let's + * not support buggy devices in these circumstances. + * stick to the specs: a configuration value of 0 means + * unconfigured. */ + usbi_warn(DEVICE_CTX(dev), + "active cfg 0? assuming unconfigured device"); + priv->active_config = -1; + } + } + + return LIBUSB_SUCCESS; +} + +static int initialize_device(struct libusb_device *dev, uint8_t busnum, + uint8_t devaddr, const char *sysfs_dir) +{ + struct linux_device_priv *priv = _device_priv(dev); + struct libusb_context *ctx = DEVICE_CTX(dev); + int descriptors_size = 512; /* Begin with a 1024 byte alloc */ + int fd, speed; + ssize_t r; + + dev->bus_number = busnum; + dev->device_address = devaddr; + + if (sysfs_dir) { + priv->sysfs_dir = strdup(sysfs_dir); + if (!priv->sysfs_dir) + return LIBUSB_ERROR_NO_MEM; + + /* Note speed can contain 1.5, in this case __read_sysfs_attr + will stop parsing at the '.' and return 1 */ + speed = __read_sysfs_attr(DEVICE_CTX(dev), sysfs_dir, "speed"); + if (speed >= 0) { + switch (speed) { + case 1: dev->speed = LIBUSB_SPEED_LOW; break; + case 12: dev->speed = LIBUSB_SPEED_FULL; break; + case 480: dev->speed = LIBUSB_SPEED_HIGH; break; + case 5000: dev->speed = LIBUSB_SPEED_SUPER; break; + default: + usbi_warn(DEVICE_CTX(dev), "Unknown device speed: %d Mbps", speed); + } + } + } + + /* cache descriptors in memory */ + if (sysfs_has_descriptors) + fd = _open_sysfs_attr(dev, "descriptors"); + else + fd = _get_usbfs_fd(dev, O_RDONLY, 0); + if (fd < 0) + return fd; + + do { + descriptors_size *= 2; + priv->descriptors = usbi_reallocf(priv->descriptors, + descriptors_size); + if (!priv->descriptors) { + close(fd); + return LIBUSB_ERROR_NO_MEM; + } + /* usbfs has holes in the file */ + if (!sysfs_has_descriptors) { + memset(priv->descriptors + priv->descriptors_len, + 0, descriptors_size - priv->descriptors_len); + } + r = read(fd, priv->descriptors + priv->descriptors_len, + descriptors_size - priv->descriptors_len); + if (r < 0) { + usbi_err(ctx, "read descriptor failed ret=%d errno=%d", + fd, errno); + close(fd); + return LIBUSB_ERROR_IO; + } + priv->descriptors_len += r; + } while (priv->descriptors_len == descriptors_size); + + close(fd); + + if (priv->descriptors_len < DEVICE_DESC_LENGTH) { + usbi_err(ctx, "short descriptor read (%d)", + priv->descriptors_len); + return LIBUSB_ERROR_IO; + } + + if (sysfs_can_relate_devices) + return LIBUSB_SUCCESS; + + /* cache active config */ + fd = _get_usbfs_fd(dev, O_RDWR, 1); + if (fd < 0) { + /* cannot send a control message to determine the active + * config. just assume the first one is active. */ + usbi_warn(ctx, "Missing rw usbfs access; cannot determine " + "active configuration descriptor"); + if (priv->descriptors_len >= + (DEVICE_DESC_LENGTH + LIBUSB_DT_CONFIG_SIZE)) { + struct libusb_config_descriptor config; + usbi_parse_descriptor( + priv->descriptors + DEVICE_DESC_LENGTH, + "bbwbbbbb", &config, 0); + priv->active_config = config.bConfigurationValue; + } else + priv->active_config = -1; /* No config dt */ + + return LIBUSB_SUCCESS; + } + + r = usbfs_get_active_config(dev, fd); + close(fd); + + return r; +} + +static int linux_get_parent_info(struct libusb_device *dev, const char *sysfs_dir) +{ + struct libusb_context *ctx = DEVICE_CTX(dev); + struct libusb_device *it; + char *parent_sysfs_dir, *tmp; + int ret, add_parent = 1; + + /* XXX -- can we figure out the topology when using usbfs? */ + if (NULL == sysfs_dir || 0 == strncmp(sysfs_dir, "usb", 3)) { + /* either using usbfs or finding the parent of a root hub */ + return LIBUSB_SUCCESS; + } + + parent_sysfs_dir = strdup(sysfs_dir); + if (NULL == parent_sysfs_dir) { + return LIBUSB_ERROR_NO_MEM; + } + if (NULL != (tmp = strrchr(parent_sysfs_dir, '.')) || + NULL != (tmp = strrchr(parent_sysfs_dir, '-'))) { + dev->port_number = atoi(tmp + 1); + *tmp = '\0'; + } else { + usbi_warn(ctx, "Can not parse sysfs_dir: %s, no parent info", + parent_sysfs_dir); + free (parent_sysfs_dir); + return LIBUSB_SUCCESS; + } + + /* is the parent a root hub? */ + if (NULL == strchr(parent_sysfs_dir, '-')) { + tmp = parent_sysfs_dir; + ret = asprintf (&parent_sysfs_dir, "usb%s", tmp); + free (tmp); + if (0 > ret) { + return LIBUSB_ERROR_NO_MEM; + } + } + +retry: + /* find the parent in the context */ + usbi_mutex_lock(&ctx->usb_devs_lock); + list_for_each_entry(it, &ctx->usb_devs, list, struct libusb_device) { + struct linux_device_priv *priv = _device_priv(it); + if (priv->sysfs_dir) { + if (0 == strcmp (priv->sysfs_dir, parent_sysfs_dir)) { + dev->parent_dev = libusb_ref_device(it); + break; + } + } + } + usbi_mutex_unlock(&ctx->usb_devs_lock); + + if (!dev->parent_dev && add_parent) { + usbi_dbg("parent_dev %s not enumerated yet, enumerating now", + parent_sysfs_dir); + sysfs_scan_device(ctx, parent_sysfs_dir); + add_parent = 0; + goto retry; + } + + usbi_dbg("Dev %p (%s) has parent %p (%s) port %d", dev, sysfs_dir, + dev->parent_dev, parent_sysfs_dir, dev->port_number); + + free (parent_sysfs_dir); + + return LIBUSB_SUCCESS; +} + +int linux_enumerate_device(struct libusb_context *ctx, + uint8_t busnum, uint8_t devaddr, const char *sysfs_dir) +{ + unsigned long session_id; + struct libusb_device *dev; + int r = 0; + + /* FIXME: session ID is not guaranteed unique as addresses can wrap and + * will be reused. instead we should add a simple sysfs attribute with + * a session ID. */ + session_id = busnum << 8 | devaddr; + usbi_dbg("busnum %d devaddr %d session_id %ld", busnum, devaddr, + session_id); + + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev) { + /* device already exists in the context */ + usbi_dbg("session_id %ld already exists", session_id); + libusb_unref_device(dev); + return LIBUSB_SUCCESS; + } + + usbi_dbg("allocating new device for %d/%d (session %ld)", + busnum, devaddr, session_id); + dev = usbi_alloc_device(ctx, session_id); + if (!dev) + return LIBUSB_ERROR_NO_MEM; + + r = initialize_device(dev, busnum, devaddr, sysfs_dir); + if (r < 0) + goto out; + r = usbi_sanitize_device(dev); + if (r < 0) + goto out; + + r = linux_get_parent_info(dev, sysfs_dir); + if (r < 0) + goto out; +out: + if (r < 0) + libusb_unref_device(dev); + else + usbi_connect_device(dev); + + return r; +} + +void linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name) +{ + struct libusb_context *ctx; + + usbi_mutex_static_lock(&active_contexts_lock); + list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { + linux_enumerate_device(ctx, busnum, devaddr, sys_name); + } + usbi_mutex_static_unlock(&active_contexts_lock); +} + +void linux_device_disconnected(uint8_t busnum, uint8_t devaddr) +{ + struct libusb_context *ctx; + struct libusb_device *dev; + unsigned long session_id = busnum << 8 | devaddr; + + usbi_mutex_static_lock(&active_contexts_lock); + list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { + dev = usbi_get_device_by_session_id (ctx, session_id); + if (NULL != dev) { + usbi_disconnect_device (dev); + libusb_unref_device(dev); + } else { + usbi_dbg("device not found for session %x", session_id); + } + } + usbi_mutex_static_unlock(&active_contexts_lock); +} + +#if !defined(USE_UDEV) +/* open a bus directory and adds all discovered devices to the context */ +static int usbfs_scan_busdir(struct libusb_context *ctx, uint8_t busnum) +{ + DIR *dir; + char dirpath[PATH_MAX]; + struct dirent *entry; + int r = LIBUSB_ERROR_IO; + + snprintf(dirpath, PATH_MAX, "%s/%03d", usbfs_path, busnum); + usbi_dbg("%s", dirpath); + dir = opendir(dirpath); + if (!dir) { + usbi_err(ctx, "opendir '%s' failed, errno=%d", dirpath, errno); + /* FIXME: should handle valid race conditions like hub unplugged + * during directory iteration - this is not an error */ + return r; + } + + while ((entry = readdir(dir))) { + int devaddr; + + if (entry->d_name[0] == '.') + continue; + + devaddr = atoi(entry->d_name); + if (devaddr == 0) { + usbi_dbg("unknown dir entry %s", entry->d_name); + continue; + } + + if (linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL)) { + usbi_dbg("failed to enumerate dir entry %s", entry->d_name); + continue; + } + + r = 0; + } + + closedir(dir); + return r; +} + +static int usbfs_get_device_list(struct libusb_context *ctx) +{ + struct dirent *entry; + DIR *buses = opendir(usbfs_path); + int r = 0; + + if (!buses) { + usbi_err(ctx, "opendir buses failed errno=%d", errno); + return LIBUSB_ERROR_IO; + } + + while ((entry = readdir(buses))) { + int busnum; + + if (entry->d_name[0] == '.') + continue; + + if (usbdev_names) { + int devaddr; + if (!_is_usbdev_entry(entry, &busnum, &devaddr)) + continue; + + r = linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL); + if (r < 0) { + usbi_dbg("failed to enumerate dir entry %s", entry->d_name); + continue; + } + } else { + busnum = atoi(entry->d_name); + if (busnum == 0) { + usbi_dbg("unknown dir entry %s", entry->d_name); + continue; + } + + r = usbfs_scan_busdir(ctx, busnum); + if (r < 0) + break; + } + } + + closedir(buses); + return r; + +} +#endif + +static int sysfs_scan_device(struct libusb_context *ctx, const char *devname) +{ + uint8_t busnum, devaddr; + int ret; + + ret = linux_get_device_address (ctx, 0, &busnum, &devaddr, NULL, devname); + if (LIBUSB_SUCCESS != ret) { + return ret; + } + + return linux_enumerate_device(ctx, busnum & 0xff, devaddr & 0xff, + devname); +} + +#if !defined(USE_UDEV) +static int sysfs_get_device_list(struct libusb_context *ctx) +{ + DIR *devices = opendir(SYSFS_DEVICE_PATH); + struct dirent *entry; + int r = LIBUSB_ERROR_IO; + + if (!devices) { + usbi_err(ctx, "opendir devices failed errno=%d", errno); + return r; + } + + while ((entry = readdir(devices))) { + if ((!isdigit(entry->d_name[0]) && strncmp(entry->d_name, "usb", 3)) + || strchr(entry->d_name, ':')) + continue; + + if (sysfs_scan_device(ctx, entry->d_name)) { + usbi_dbg("failed to enumerate dir entry %s", entry->d_name); + continue; + } + + r = 0; + } + + closedir(devices); + return r; +} + +static int linux_default_scan_devices (struct libusb_context *ctx) +{ + /* we can retrieve device list and descriptors from sysfs or usbfs. + * sysfs is preferable, because if we use usbfs we end up resuming + * any autosuspended USB devices. however, sysfs is not available + * everywhere, so we need a usbfs fallback too. + * + * as described in the "sysfs vs usbfs" comment at the top of this + * file, sometimes we have sysfs but not enough information to + * relate sysfs devices to usbfs nodes. op_init() determines the + * adequacy of sysfs and sets sysfs_can_relate_devices. + */ + if (sysfs_can_relate_devices != 0) + return sysfs_get_device_list(ctx); + else + return usbfs_get_device_list(ctx); +} +#endif + +static int op_open(struct libusb_device_handle *handle) +{ + struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); + int r; + + hpriv->fd = _get_usbfs_fd(handle->dev, O_RDWR, 0); + if (hpriv->fd < 0) { + if (hpriv->fd == LIBUSB_ERROR_NO_DEVICE) { + /* device will still be marked as attached if hotplug monitor thread + * hasn't processed remove event yet */ + usbi_mutex_static_lock(&linux_hotplug_lock); + if (handle->dev->attached) { + usbi_dbg("open failed with no device, but device still attached"); + linux_device_disconnected(handle->dev->bus_number, + handle->dev->device_address); + } + usbi_mutex_static_unlock(&linux_hotplug_lock); + } + return hpriv->fd; + } + + r = ioctl(hpriv->fd, IOCTL_USBFS_GET_CAPABILITIES, &hpriv->caps); + if (r < 0) { + if (errno == ENOTTY) + usbi_dbg("getcap not available"); + else + usbi_err(HANDLE_CTX(handle), "getcap failed (%d)", errno); + hpriv->caps = 0; + if (supports_flag_zero_packet) + hpriv->caps |= USBFS_CAP_ZERO_PACKET; + if (supports_flag_bulk_continuation) + hpriv->caps |= USBFS_CAP_BULK_CONTINUATION; + } + + r = usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT); + if (r < 0) + close(hpriv->fd); + + return r; +} + +static void op_close(struct libusb_device_handle *dev_handle) +{ + struct linux_device_handle_priv *hpriv = _device_handle_priv(dev_handle); + /* fd may have already been removed by POLLERR condition in op_handle_events() */ + if (!hpriv->fd_removed) + usbi_remove_pollfd(HANDLE_CTX(dev_handle), hpriv->fd); + close(hpriv->fd); +} + +static int op_get_configuration(struct libusb_device_handle *handle, + int *config) +{ + int r; + + if (sysfs_can_relate_devices) { + r = sysfs_get_active_config(handle->dev, config); + } else { + r = usbfs_get_active_config(handle->dev, + _device_handle_priv(handle)->fd); + if (r == LIBUSB_SUCCESS) + *config = _device_priv(handle->dev)->active_config; + } + if (r < 0) + return r; + + if (*config == -1) { + usbi_err(HANDLE_CTX(handle), "device unconfigured"); + *config = 0; + } + + return 0; +} + +static int op_set_configuration(struct libusb_device_handle *handle, int config) +{ + struct linux_device_priv *priv = _device_priv(handle->dev); + int fd = _device_handle_priv(handle)->fd; + int r = ioctl(fd, IOCTL_USBFS_SETCONFIG, &config); + if (r) { + if (errno == EINVAL) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EBUSY) + return LIBUSB_ERROR_BUSY; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), "failed, error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + /* update our cached active config descriptor */ + priv->active_config = config; + + return LIBUSB_SUCCESS; +} + +static int claim_interface(struct libusb_device_handle *handle, int iface) +{ + int fd = _device_handle_priv(handle)->fd; + int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface); + if (r) { + if (errno == ENOENT) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EBUSY) + return LIBUSB_ERROR_BUSY; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "claim interface failed, error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + return 0; +} + +static int release_interface(struct libusb_device_handle *handle, int iface) +{ + int fd = _device_handle_priv(handle)->fd; + int r = ioctl(fd, IOCTL_USBFS_RELEASEINTF, &iface); + if (r) { + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "release interface failed, error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + return 0; +} + +static int op_set_interface(struct libusb_device_handle *handle, int iface, + int altsetting) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_setinterface setintf; + int r; + + setintf.interface = iface; + setintf.altsetting = altsetting; + r = ioctl(fd, IOCTL_USBFS_SETINTF, &setintf); + if (r) { + if (errno == EINVAL) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "setintf failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 0; +} + +static int op_clear_halt(struct libusb_device_handle *handle, + unsigned char endpoint) +{ + int fd = _device_handle_priv(handle)->fd; + unsigned int _endpoint = endpoint; + int r = ioctl(fd, IOCTL_USBFS_CLEAR_HALT, &_endpoint); + if (r) { + if (errno == ENOENT) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "clear_halt failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 0; +} + +static int op_reset_device(struct libusb_device_handle *handle) +{ + int fd = _device_handle_priv(handle)->fd; + int i, r, ret = 0; + + /* Doing a device reset will cause the usbfs driver to get unbound + from any interfaces it is bound to. By voluntarily unbinding + the usbfs driver ourself, we stop the kernel from rebinding + the interface after reset (which would end up with the interface + getting bound to the in kernel driver if any). */ + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (handle->claimed_interfaces & (1L << i)) { + release_interface(handle, i); + } + } + + usbi_mutex_lock(&handle->lock); + r = ioctl(fd, IOCTL_USBFS_RESET, NULL); + if (r) { + if (errno == ENODEV) { + ret = LIBUSB_ERROR_NOT_FOUND; + goto out; + } + + usbi_err(HANDLE_CTX(handle), + "reset failed error %d errno %d", r, errno); + ret = LIBUSB_ERROR_OTHER; + goto out; + } + + /* And re-claim any interfaces which were claimed before the reset */ + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (handle->claimed_interfaces & (1L << i)) { + /* + * A driver may have completed modprobing during + * IOCTL_USBFS_RESET, and bound itself as soon as + * IOCTL_USBFS_RESET released the device lock + */ + r = detach_kernel_driver_and_claim(handle, i); + if (r) { + usbi_warn(HANDLE_CTX(handle), + "failed to re-claim interface %d after reset: %s", + i, libusb_error_name(r)); + handle->claimed_interfaces &= ~(1L << i); + ret = LIBUSB_ERROR_NOT_FOUND; + } + } + } +out: + usbi_mutex_unlock(&handle->lock); + return ret; +} + +static int do_streams_ioctl(struct libusb_device_handle *handle, long req, + uint32_t num_streams, unsigned char *endpoints, int num_endpoints) +{ + int r, fd = _device_handle_priv(handle)->fd; + struct usbfs_streams *streams; + + if (num_endpoints > 30) /* Max 15 in + 15 out eps */ + return LIBUSB_ERROR_INVALID_PARAM; + + streams = malloc(sizeof(struct usbfs_streams) + num_endpoints); + if (!streams) + return LIBUSB_ERROR_NO_MEM; + + streams->num_streams = num_streams; + streams->num_eps = num_endpoints; + memcpy(streams->eps, endpoints, num_endpoints); + + r = ioctl(fd, req, streams); + + free(streams); + + if (r < 0) { + if (errno == ENOTTY) + return LIBUSB_ERROR_NOT_SUPPORTED; + else if (errno == EINVAL) + return LIBUSB_ERROR_INVALID_PARAM; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "streams-ioctl failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + return r; +} + +static int op_alloc_streams(struct libusb_device_handle *handle, + uint32_t num_streams, unsigned char *endpoints, int num_endpoints) +{ + return do_streams_ioctl(handle, IOCTL_USBFS_ALLOC_STREAMS, + num_streams, endpoints, num_endpoints); +} + +static int op_free_streams(struct libusb_device_handle *handle, + unsigned char *endpoints, int num_endpoints) +{ + return do_streams_ioctl(handle, IOCTL_USBFS_FREE_STREAMS, 0, + endpoints, num_endpoints); +} + +static unsigned char *op_dev_mem_alloc(struct libusb_device_handle *handle, + size_t len) +{ + struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); + unsigned char *buffer = (unsigned char *)mmap(NULL, len, + PROT_READ | PROT_WRITE, MAP_SHARED, hpriv->fd, 0); + if (buffer == MAP_FAILED) { + usbi_err(HANDLE_CTX(handle), "alloc dev mem failed errno %d", + errno); + return NULL; + } + return buffer; +} + +static int op_dev_mem_free(struct libusb_device_handle *handle, + unsigned char *buffer, size_t len) +{ + if (munmap(buffer, len) != 0) { + usbi_err(HANDLE_CTX(handle), "free dev mem failed errno %d", + errno); + return LIBUSB_ERROR_OTHER; + } else { + return LIBUSB_SUCCESS; + } +} + +static int op_kernel_driver_active(struct libusb_device_handle *handle, + int interface) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_getdriver getdrv; + int r; + + getdrv.interface = interface; + r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); + if (r) { + if (errno == ENODATA) + return 0; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "get driver failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return (strcmp(getdrv.driver, "usbfs") == 0) ? 0 : 1; +} + +static int op_detach_kernel_driver(struct libusb_device_handle *handle, + int interface) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_ioctl command; + struct usbfs_getdriver getdrv; + int r; + + command.ifno = interface; + command.ioctl_code = IOCTL_USBFS_DISCONNECT; + command.data = NULL; + + getdrv.interface = interface; + r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); + if (r == 0 && strcmp(getdrv.driver, "usbfs") == 0) + return LIBUSB_ERROR_NOT_FOUND; + + r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); + if (r) { + if (errno == ENODATA) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EINVAL) + return LIBUSB_ERROR_INVALID_PARAM; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), + "detach failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } + + return 0; +} + +static int op_attach_kernel_driver(struct libusb_device_handle *handle, + int interface) +{ + int fd = _device_handle_priv(handle)->fd; + struct usbfs_ioctl command; + int r; + + command.ifno = interface; + command.ioctl_code = IOCTL_USBFS_CONNECT; + command.data = NULL; + + r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); + if (r < 0) { + if (errno == ENODATA) + return LIBUSB_ERROR_NOT_FOUND; + else if (errno == EINVAL) + return LIBUSB_ERROR_INVALID_PARAM; + else if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + else if (errno == EBUSY) + return LIBUSB_ERROR_BUSY; + + usbi_err(HANDLE_CTX(handle), + "attach failed error %d errno %d", r, errno); + return LIBUSB_ERROR_OTHER; + } else if (r == 0) { + return LIBUSB_ERROR_NOT_FOUND; + } + + return 0; +} + +static int detach_kernel_driver_and_claim(struct libusb_device_handle *handle, + int interface) +{ + struct usbfs_disconnect_claim dc; + int r, fd = _device_handle_priv(handle)->fd; + + dc.interface = interface; + strcpy(dc.driver, "usbfs"); + dc.flags = USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER; + r = ioctl(fd, IOCTL_USBFS_DISCONNECT_CLAIM, &dc); + if (r == 0 || (r != 0 && errno != ENOTTY)) { + if (r == 0) + return 0; + + switch (errno) { + case EBUSY: + return LIBUSB_ERROR_BUSY; + case EINVAL: + return LIBUSB_ERROR_INVALID_PARAM; + case ENODEV: + return LIBUSB_ERROR_NO_DEVICE; + } + usbi_err(HANDLE_CTX(handle), + "disconnect-and-claim failed errno %d", errno); + return LIBUSB_ERROR_OTHER; + } + + /* Fallback code for kernels which don't support the + disconnect-and-claim ioctl */ + r = op_detach_kernel_driver(handle, interface); + if (r != 0 && r != LIBUSB_ERROR_NOT_FOUND) + return r; + + return claim_interface(handle, interface); +} + +static int op_claim_interface(struct libusb_device_handle *handle, int iface) +{ + if (handle->auto_detach_kernel_driver) + return detach_kernel_driver_and_claim(handle, iface); + else + return claim_interface(handle, iface); +} + +static int op_release_interface(struct libusb_device_handle *handle, int iface) +{ + int r; + + r = release_interface(handle, iface); + if (r) + return r; + + if (handle->auto_detach_kernel_driver) + op_attach_kernel_driver(handle, iface); + + return 0; +} + +static void op_destroy_device(struct libusb_device *dev) +{ + struct linux_device_priv *priv = _device_priv(dev); + if (priv->descriptors) + free(priv->descriptors); + if (priv->sysfs_dir) + free(priv->sysfs_dir); +} + +/* URBs are discarded in reverse order of submission to avoid races. */ +static int discard_urbs(struct usbi_transfer *itransfer, int first, int last_plus_one) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = + usbi_transfer_get_os_priv(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + int i, ret = 0; + struct usbfs_urb *urb; + + for (i = last_plus_one - 1; i >= first; i--) { + if (LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type) + urb = tpriv->iso_urbs[i]; + else + urb = &tpriv->urbs[i]; + + if (0 == ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, urb)) + continue; + + if (EINVAL == errno) { + usbi_dbg("URB not found --> assuming ready to be reaped"); + if (i == (last_plus_one - 1)) + ret = LIBUSB_ERROR_NOT_FOUND; + } else if (ENODEV == errno) { + usbi_dbg("Device not found for URB --> assuming ready to be reaped"); + ret = LIBUSB_ERROR_NO_DEVICE; + } else { + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised discard errno %d", errno); + ret = LIBUSB_ERROR_OTHER; + } + } + return ret; +} + +static void free_iso_urbs(struct linux_transfer_priv *tpriv) +{ + int i; + for (i = 0; i < tpriv->num_urbs; i++) { + struct usbfs_urb *urb = tpriv->iso_urbs[i]; + if (!urb) + break; + free(urb); + } + + free(tpriv->iso_urbs); + tpriv->iso_urbs = NULL; +} + +static int submit_bulk_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + struct usbfs_urb *urbs; + int is_out = (transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) + == LIBUSB_ENDPOINT_OUT; + int bulk_buffer_len, use_bulk_continuation; + int r; + int i; + + if (is_out && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) && + !(dpriv->caps & USBFS_CAP_ZERO_PACKET)) + return LIBUSB_ERROR_NOT_SUPPORTED; + + /* + * Older versions of usbfs place a 16kb limit on bulk URBs. We work + * around this by splitting large transfers into 16k blocks, and then + * submit all urbs at once. it would be simpler to submit one urb at + * a time, but there is a big performance gain doing it this way. + * + * Newer versions lift the 16k limit (USBFS_CAP_NO_PACKET_SIZE_LIM), + * using arbritary large transfers can still be a bad idea though, as + * the kernel needs to allocate physical contiguous memory for this, + * which may fail for large buffers. + * + * The kernel solves this problem by splitting the transfer into + * blocks itself when the host-controller is scatter-gather capable + * (USBFS_CAP_BULK_SCATTER_GATHER), which most controllers are. + * + * Last, there is the issue of short-transfers when splitting, for + * short split-transfers to work reliable USBFS_CAP_BULK_CONTINUATION + * is needed, but this is not always available. + */ + if (dpriv->caps & USBFS_CAP_BULK_SCATTER_GATHER) { + /* Good! Just submit everything in one go */ + bulk_buffer_len = transfer->length ? transfer->length : 1; + use_bulk_continuation = 0; + } else if (dpriv->caps & USBFS_CAP_BULK_CONTINUATION) { + /* Split the transfers and use bulk-continuation to + avoid issues with short-transfers */ + bulk_buffer_len = MAX_BULK_BUFFER_LENGTH; + use_bulk_continuation = 1; + } else if (dpriv->caps & USBFS_CAP_NO_PACKET_SIZE_LIM) { + /* Don't split, assume the kernel can alloc the buffer + (otherwise the submit will fail with -ENOMEM) */ + bulk_buffer_len = transfer->length ? transfer->length : 1; + use_bulk_continuation = 0; + } else { + /* Bad, splitting without bulk-continuation, short transfers + which end before the last urb will not work reliable! */ + /* Note we don't warn here as this is "normal" on kernels < + 2.6.32 and not a problem for most applications */ + bulk_buffer_len = MAX_BULK_BUFFER_LENGTH; + use_bulk_continuation = 0; + } + + int num_urbs = transfer->length / bulk_buffer_len; + int last_urb_partial = 0; + + if (transfer->length == 0) { + num_urbs = 1; + } else if ((transfer->length % bulk_buffer_len) > 0) { + last_urb_partial = 1; + num_urbs++; + } + usbi_dbg("need %d urbs for new transfer with length %d", num_urbs, + transfer->length); + urbs = calloc(num_urbs, sizeof(struct usbfs_urb)); + if (!urbs) + return LIBUSB_ERROR_NO_MEM; + tpriv->urbs = urbs; + tpriv->num_urbs = num_urbs; + tpriv->num_retired = 0; + tpriv->reap_action = NORMAL; + tpriv->reap_status = LIBUSB_TRANSFER_COMPLETED; + + for (i = 0; i < num_urbs; i++) { + struct usbfs_urb *urb = &urbs[i]; + urb->usercontext = itransfer; + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_BULK: + urb->type = USBFS_URB_TYPE_BULK; + urb->stream_id = 0; + break; + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + urb->type = USBFS_URB_TYPE_BULK; + urb->stream_id = itransfer->stream_id; + break; + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + urb->type = USBFS_URB_TYPE_INTERRUPT; + break; + } + urb->endpoint = transfer->endpoint; + urb->buffer = transfer->buffer + (i * bulk_buffer_len); + /* don't set the short not ok flag for the last URB */ + if (use_bulk_continuation && !is_out && (i < num_urbs - 1)) + urb->flags = USBFS_URB_SHORT_NOT_OK; + if (i == num_urbs - 1 && last_urb_partial) + urb->buffer_length = transfer->length % bulk_buffer_len; + else if (transfer->length == 0) + urb->buffer_length = 0; + else + urb->buffer_length = bulk_buffer_len; + + if (i > 0 && use_bulk_continuation) + urb->flags |= USBFS_URB_BULK_CONTINUATION; + + /* we have already checked that the flag is supported */ + if (is_out && i == num_urbs - 1 && + transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) + urb->flags |= USBFS_URB_ZERO_PACKET; + + r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); + if (r < 0) { + if (errno == ENODEV) { + r = LIBUSB_ERROR_NO_DEVICE; + } else { + usbi_err(TRANSFER_CTX(transfer), + "submiturb failed error %d errno=%d", r, errno); + r = LIBUSB_ERROR_IO; + } + + /* if the first URB submission fails, we can simply free up and + * return failure immediately. */ + if (i == 0) { + usbi_dbg("first URB failed, easy peasy"); + free(urbs); + tpriv->urbs = NULL; + return r; + } + + /* if it's not the first URB that failed, the situation is a bit + * tricky. we may need to discard all previous URBs. there are + * complications: + * - discarding is asynchronous - discarded urbs will be reaped + * later. the user must not have freed the transfer when the + * discarded URBs are reaped, otherwise libusb will be using + * freed memory. + * - the earlier URBs may have completed successfully and we do + * not want to throw away any data. + * - this URB failing may be no error; EREMOTEIO means that + * this transfer simply didn't need all the URBs we submitted + * so, we report that the transfer was submitted successfully and + * in case of error we discard all previous URBs. later when + * the final reap completes we can report error to the user, + * or success if an earlier URB was completed successfully. + */ + tpriv->reap_action = EREMOTEIO == errno ? COMPLETED_EARLY : SUBMIT_FAILED; + + /* The URBs we haven't submitted yet we count as already + * retired. */ + tpriv->num_retired += num_urbs - i; + + /* If we completed short then don't try to discard. */ + if (COMPLETED_EARLY == tpriv->reap_action) + return 0; + + discard_urbs(itransfer, 0, i); + + usbi_dbg("reporting successful submission but waiting for %d " + "discards before reporting error", i); + return 0; + } + } + + return 0; +} + +static int submit_iso_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + struct usbfs_urb **urbs; + size_t alloc_size; + int num_packets = transfer->num_iso_packets; + int i; + int this_urb_len = 0; + int num_urbs = 1; + int packet_offset = 0; + unsigned int packet_len; + unsigned char *urb_buffer = transfer->buffer; + + /* usbfs places arbitrary limits on iso URBs. this limit has changed + * at least three times, and it's difficult to accurately detect which + * limit this running kernel might impose. so we attempt to submit + * whatever the user has provided. if the kernel rejects the request + * due to its size, we return an error indicating such to the user. + */ + + /* calculate how many URBs we need */ + for (i = 0; i < num_packets; i++) { + unsigned int space_remaining = MAX_ISO_BUFFER_LENGTH - this_urb_len; + packet_len = transfer->iso_packet_desc[i].length; + + if (packet_len > space_remaining) { + num_urbs++; + this_urb_len = packet_len; + /* check that we can actually support this packet length */ + if (this_urb_len > MAX_ISO_BUFFER_LENGTH) + return LIBUSB_ERROR_INVALID_PARAM; + } else { + this_urb_len += packet_len; + } + } + usbi_dbg("need %d %dk URBs for transfer", num_urbs, MAX_ISO_BUFFER_LENGTH / 1024); + + urbs = calloc(num_urbs, sizeof(*urbs)); + if (!urbs) + return LIBUSB_ERROR_NO_MEM; + + tpriv->iso_urbs = urbs; + tpriv->num_urbs = num_urbs; + tpriv->num_retired = 0; + tpriv->reap_action = NORMAL; + tpriv->iso_packet_offset = 0; + + /* allocate + initialize each URB with the correct number of packets */ + for (i = 0; i < num_urbs; i++) { + struct usbfs_urb *urb; + unsigned int space_remaining_in_urb = MAX_ISO_BUFFER_LENGTH; + int urb_packet_offset = 0; + unsigned char *urb_buffer_orig = urb_buffer; + int j; + int k; + + /* swallow up all the packets we can fit into this URB */ + while (packet_offset < transfer->num_iso_packets) { + packet_len = transfer->iso_packet_desc[packet_offset].length; + if (packet_len <= space_remaining_in_urb) { + /* throw it in */ + urb_packet_offset++; + packet_offset++; + space_remaining_in_urb -= packet_len; + urb_buffer += packet_len; + } else { + /* it can't fit, save it for the next URB */ + break; + } + } + + alloc_size = sizeof(*urb) + + (urb_packet_offset * sizeof(struct usbfs_iso_packet_desc)); + urb = calloc(1, alloc_size); + if (!urb) { + free_iso_urbs(tpriv); + return LIBUSB_ERROR_NO_MEM; + } + urbs[i] = urb; + + /* populate packet lengths */ + for (j = 0, k = packet_offset - urb_packet_offset; + k < packet_offset; k++, j++) { + packet_len = transfer->iso_packet_desc[k].length; + urb->iso_frame_desc[j].length = packet_len; + } + + urb->usercontext = itransfer; + urb->type = USBFS_URB_TYPE_ISO; + /* FIXME: interface for non-ASAP data? */ + urb->flags = USBFS_URB_ISO_ASAP; + urb->endpoint = transfer->endpoint; + urb->number_of_packets = urb_packet_offset; + urb->buffer = urb_buffer_orig; + } + + /* submit URBs */ + for (i = 0; i < num_urbs; i++) { + int r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urbs[i]); + if (r < 0) { + if (errno == ENODEV) { + r = LIBUSB_ERROR_NO_DEVICE; + } else if (errno == EINVAL) { + usbi_warn(TRANSFER_CTX(transfer), + "submiturb failed, transfer too large"); + r = LIBUSB_ERROR_INVALID_PARAM; + } else { + usbi_err(TRANSFER_CTX(transfer), + "submiturb failed error %d errno=%d", r, errno); + r = LIBUSB_ERROR_IO; + } + + /* if the first URB submission fails, we can simply free up and + * return failure immediately. */ + if (i == 0) { + usbi_dbg("first URB failed, easy peasy"); + free_iso_urbs(tpriv); + return r; + } + + /* if it's not the first URB that failed, the situation is a bit + * tricky. we must discard all previous URBs. there are + * complications: + * - discarding is asynchronous - discarded urbs will be reaped + * later. the user must not have freed the transfer when the + * discarded URBs are reaped, otherwise libusb will be using + * freed memory. + * - the earlier URBs may have completed successfully and we do + * not want to throw away any data. + * so, in this case we discard all the previous URBs BUT we report + * that the transfer was submitted successfully. then later when + * the final discard completes we can report error to the user. + */ + tpriv->reap_action = SUBMIT_FAILED; + + /* The URBs we haven't submitted yet we count as already + * retired. */ + tpriv->num_retired = num_urbs - i; + discard_urbs(itransfer, 0, i); + + usbi_dbg("reporting successful submission but waiting for %d " + "discards before reporting error", i); + return 0; + } + } + + return 0; +} + +static int submit_control_transfer(struct usbi_transfer *itransfer) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_device_handle_priv *dpriv = + _device_handle_priv(transfer->dev_handle); + struct usbfs_urb *urb; + int r; + + if (transfer->length - LIBUSB_CONTROL_SETUP_SIZE > MAX_CTRL_BUFFER_LENGTH) + return LIBUSB_ERROR_INVALID_PARAM; + + urb = calloc(1, sizeof(struct usbfs_urb)); + if (!urb) + return LIBUSB_ERROR_NO_MEM; + tpriv->urbs = urb; + tpriv->num_urbs = 1; + tpriv->reap_action = NORMAL; + + urb->usercontext = itransfer; + urb->type = USBFS_URB_TYPE_CONTROL; + urb->endpoint = transfer->endpoint; + urb->buffer = transfer->buffer; + urb->buffer_length = transfer->length; + + r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); + if (r < 0) { + free(urb); + tpriv->urbs = NULL; + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(TRANSFER_CTX(transfer), + "submiturb failed error %d errno=%d", r, errno); + return LIBUSB_ERROR_IO; + } + return 0; +} + +static int op_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return submit_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + return submit_bulk_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return submit_bulk_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return submit_iso_transfer(itransfer); + default: + usbi_err(TRANSFER_CTX(transfer), + "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int op_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + int r; + + if (!tpriv->urbs) + return LIBUSB_ERROR_NOT_FOUND; + + r = discard_urbs(itransfer, 0, tpriv->num_urbs); + if (r != 0) + return r; + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + if (tpriv->reap_action == ERROR) + break; + /* else, fall through */ + default: + tpriv->reap_action = CANCELLED; + } + + return 0; +} + +static void op_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + + /* urbs can be freed also in submit_transfer so lock mutex first */ + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (tpriv->urbs) { + free(tpriv->urbs); + tpriv->urbs = NULL; + } + break; + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + if (tpriv->iso_urbs) { + free_iso_urbs(tpriv); + tpriv->iso_urbs = NULL; + } + break; + default: + usbi_err(TRANSFER_CTX(transfer), + "unknown endpoint type %d", transfer->type); + } +} + +static int handle_bulk_completion(struct usbi_transfer *itransfer, + struct usbfs_urb *urb) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + int urb_idx = urb - tpriv->urbs; + + usbi_mutex_lock(&itransfer->lock); + usbi_dbg("handling completion status %d of bulk urb %d/%d", urb->status, + urb_idx + 1, tpriv->num_urbs); + + tpriv->num_retired++; + + if (tpriv->reap_action != NORMAL) { + /* cancelled, submit_fail, or completed early */ + usbi_dbg("abnormal reap: urb status %d", urb->status); + + /* even though we're in the process of cancelling, it's possible that + * we may receive some data in these URBs that we don't want to lose. + * examples: + * 1. while the kernel is cancelling all the packets that make up an + * URB, a few of them might complete. so we get back a successful + * cancellation *and* some data. + * 2. we receive a short URB which marks the early completion condition, + * so we start cancelling the remaining URBs. however, we're too + * slow and another URB completes (or at least completes partially). + * (this can't happen since we always use BULK_CONTINUATION.) + * + * When this happens, our objectives are not to lose any "surplus" data, + * and also to stick it at the end of the previously-received data + * (closing any holes), so that libusb reports the total amount of + * transferred data and presents it in a contiguous chunk. + */ + if (urb->actual_length > 0) { + unsigned char *target = transfer->buffer + itransfer->transferred; + usbi_dbg("received %d bytes of surplus data", urb->actual_length); + if (urb->buffer != target) { + usbi_dbg("moving surplus data from offset %d to offset %d", + (unsigned char *) urb->buffer - transfer->buffer, + target - transfer->buffer); + memmove(target, urb->buffer, urb->actual_length); + } + itransfer->transferred += urb->actual_length; + } + + if (tpriv->num_retired == tpriv->num_urbs) { + usbi_dbg("abnormal reap: last URB handled, reporting"); + if (tpriv->reap_action != COMPLETED_EARLY && + tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) + tpriv->reap_status = LIBUSB_TRANSFER_ERROR; + goto completed; + } + goto out_unlock; + } + + itransfer->transferred += urb->actual_length; + + /* Many of these errors can occur on *any* urb of a multi-urb + * transfer. When they do, we tear down the rest of the transfer. + */ + switch (urb->status) { + case 0: + break; + case -EREMOTEIO: /* short transfer */ + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + tpriv->reap_status = LIBUSB_TRANSFER_NO_DEVICE; + goto cancel_remaining; + case -EPIPE: + usbi_dbg("detected endpoint stall"); + if (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) + tpriv->reap_status = LIBUSB_TRANSFER_STALL; + goto cancel_remaining; + case -EOVERFLOW: + /* overflow can only ever occur in the last urb */ + usbi_dbg("overflow, actual_length=%d", urb->actual_length); + if (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) + tpriv->reap_status = LIBUSB_TRANSFER_OVERFLOW; + goto completed; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + usbi_dbg("low level error %d", urb->status); + tpriv->reap_action = ERROR; + goto cancel_remaining; + default: + usbi_warn(ITRANSFER_CTX(itransfer), + "unrecognised urb status %d", urb->status); + tpriv->reap_action = ERROR; + goto cancel_remaining; + } + + /* if we're the last urb or we got less data than requested then we're + * done */ + if (urb_idx == tpriv->num_urbs - 1) { + usbi_dbg("last URB in transfer --> complete!"); + goto completed; + } else if (urb->actual_length < urb->buffer_length) { + usbi_dbg("short transfer %d/%d --> complete!", + urb->actual_length, urb->buffer_length); + if (tpriv->reap_action == NORMAL) + tpriv->reap_action = COMPLETED_EARLY; + } else + goto out_unlock; + +cancel_remaining: + if (ERROR == tpriv->reap_action && LIBUSB_TRANSFER_COMPLETED == tpriv->reap_status) + tpriv->reap_status = LIBUSB_TRANSFER_ERROR; + + if (tpriv->num_retired == tpriv->num_urbs) /* nothing to cancel */ + goto completed; + + /* cancel remaining urbs and wait for their completion before + * reporting results */ + discard_urbs(itransfer, urb_idx + 1, tpriv->num_urbs); + +out_unlock: + usbi_mutex_unlock(&itransfer->lock); + return 0; + +completed: + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + return CANCELLED == tpriv->reap_action ? + usbi_handle_transfer_cancellation(itransfer) : + usbi_handle_transfer_completion(itransfer, tpriv->reap_status); +} + +static int handle_iso_completion(struct usbi_transfer *itransfer, + struct usbfs_urb *urb) +{ + struct libusb_transfer *transfer = + USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + int num_urbs = tpriv->num_urbs; + int urb_idx = 0; + int i; + enum libusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED; + + usbi_mutex_lock(&itransfer->lock); + for (i = 0; i < num_urbs; i++) { + if (urb == tpriv->iso_urbs[i]) { + urb_idx = i + 1; + break; + } + } + if (urb_idx == 0) { + usbi_err(TRANSFER_CTX(transfer), "could not locate urb!"); + usbi_mutex_unlock(&itransfer->lock); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("handling completion status %d of iso urb %d/%d", urb->status, + urb_idx, num_urbs); + + /* copy isochronous results back in */ + + for (i = 0; i < urb->number_of_packets; i++) { + struct usbfs_iso_packet_desc *urb_desc = &urb->iso_frame_desc[i]; + struct libusb_iso_packet_descriptor *lib_desc = + &transfer->iso_packet_desc[tpriv->iso_packet_offset++]; + lib_desc->status = LIBUSB_TRANSFER_COMPLETED; + switch (urb_desc->status) { + case 0: + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + lib_desc->status = LIBUSB_TRANSFER_NO_DEVICE; + break; + case -EPIPE: + usbi_dbg("detected endpoint stall"); + lib_desc->status = LIBUSB_TRANSFER_STALL; + break; + case -EOVERFLOW: + usbi_dbg("overflow error"); + lib_desc->status = LIBUSB_TRANSFER_OVERFLOW; + break; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + case -EXDEV: + usbi_dbg("low-level USB error %d", urb_desc->status); + lib_desc->status = LIBUSB_TRANSFER_ERROR; + break; + default: + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised urb status %d", urb_desc->status); + lib_desc->status = LIBUSB_TRANSFER_ERROR; + break; + } + lib_desc->actual_length = urb_desc->actual_length; + } + + tpriv->num_retired++; + + if (tpriv->reap_action != NORMAL) { /* cancelled or submit_fail */ + usbi_dbg("CANCEL: urb status %d", urb->status); + + if (tpriv->num_retired == num_urbs) { + usbi_dbg("CANCEL: last URB handled, reporting"); + free_iso_urbs(tpriv); + if (tpriv->reap_action == CANCELLED) { + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_cancellation(itransfer); + } else { + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, + LIBUSB_TRANSFER_ERROR); + } + } + goto out; + } + + switch (urb->status) { + case 0: + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ESHUTDOWN: + usbi_dbg("device removed"); + status = LIBUSB_TRANSFER_NO_DEVICE; + break; + default: + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised urb status %d", urb->status); + status = LIBUSB_TRANSFER_ERROR; + break; + } + + /* if we're the last urb then we're done */ + if (urb_idx == num_urbs) { + usbi_dbg("last URB in transfer --> complete!"); + free_iso_urbs(tpriv); + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, status); + } + +out: + usbi_mutex_unlock(&itransfer->lock); + return 0; +} + +static int handle_control_completion(struct usbi_transfer *itransfer, + struct usbfs_urb *urb) +{ + struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); + int status; + + usbi_mutex_lock(&itransfer->lock); + usbi_dbg("handling completion status %d", urb->status); + + itransfer->transferred += urb->actual_length; + + if (tpriv->reap_action == CANCELLED) { + if (urb->status != 0 && urb->status != -ENOENT) + usbi_warn(ITRANSFER_CTX(itransfer), + "cancel: unrecognised urb status %d", urb->status); + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_cancellation(itransfer); + } + + switch (urb->status) { + case 0: + status = LIBUSB_TRANSFER_COMPLETED; + break; + case -ENOENT: /* cancelled */ + status = LIBUSB_TRANSFER_CANCELLED; + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + status = LIBUSB_TRANSFER_NO_DEVICE; + break; + case -EPIPE: + usbi_dbg("unsupported control request"); + status = LIBUSB_TRANSFER_STALL; + break; + case -EOVERFLOW: + usbi_dbg("control overflow error"); + status = LIBUSB_TRANSFER_OVERFLOW; + break; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + usbi_dbg("low-level bus error occurred"); + status = LIBUSB_TRANSFER_ERROR; + break; + default: + usbi_warn(ITRANSFER_CTX(itransfer), + "unrecognised urb status %d", urb->status); + status = LIBUSB_TRANSFER_ERROR; + break; + } + + free(tpriv->urbs); + tpriv->urbs = NULL; + usbi_mutex_unlock(&itransfer->lock); + return usbi_handle_transfer_completion(itransfer, status); +} + +static int reap_for_handle(struct libusb_device_handle *handle) +{ + struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); + int r; + struct usbfs_urb *urb; + struct usbi_transfer *itransfer; + struct libusb_transfer *transfer; + + r = ioctl(hpriv->fd, IOCTL_USBFS_REAPURBNDELAY, &urb); + if (r == -1 && errno == EAGAIN) + return 1; + if (r < 0) { + if (errno == ENODEV) + return LIBUSB_ERROR_NO_DEVICE; + + usbi_err(HANDLE_CTX(handle), "reap failed error %d errno=%d", + r, errno); + return LIBUSB_ERROR_IO; + } + + itransfer = urb->usercontext; + transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + usbi_dbg("urb type=%d status=%d transferred=%d", urb->type, urb->status, + urb->actual_length); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return handle_iso_completion(itransfer, urb); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + return handle_bulk_completion(itransfer, urb); + case LIBUSB_TRANSFER_TYPE_CONTROL: + return handle_control_completion(itransfer, urb); + default: + usbi_err(HANDLE_CTX(handle), "unrecognised endpoint type %x", + transfer->type); + return LIBUSB_ERROR_OTHER; + } +} + +static int op_handle_events(struct libusb_context *ctx, + struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + int r; + unsigned int i = 0; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + struct pollfd *pollfd = &fds[i]; + struct libusb_device_handle *handle; + struct linux_device_handle_priv *hpriv = NULL; + + if (!pollfd->revents) + continue; + + num_ready--; + list_for_each_entry(handle, &ctx->open_devs, list, struct libusb_device_handle) { + hpriv = _device_handle_priv(handle); + if (hpriv->fd == pollfd->fd) + break; + } + + if (!hpriv || hpriv->fd != pollfd->fd) { + usbi_err(ctx, "cannot find handle for fd %d", + pollfd->fd); + continue; + } + + if (pollfd->revents & POLLERR) { + /* remove the fd from the pollfd set so that it doesn't continuously + * trigger an event, and flag that it has been removed so op_close() + * doesn't try to remove it a second time */ + usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->fd); + hpriv->fd_removed = 1; + + /* device will still be marked as attached if hotplug monitor thread + * hasn't processed remove event yet */ + usbi_mutex_static_lock(&linux_hotplug_lock); + if (handle->dev->attached) + linux_device_disconnected(handle->dev->bus_number, + handle->dev->device_address); + usbi_mutex_static_unlock(&linux_hotplug_lock); + + if (hpriv->caps & USBFS_CAP_REAP_AFTER_DISCONNECT) { + do { + r = reap_for_handle(handle); + } while (r == 0); + } + + usbi_handle_disconnect(handle); + continue; + } + + do { + r = reap_for_handle(handle); + } while (r == 0); + if (r == 1 || r == LIBUSB_ERROR_NO_DEVICE) + continue; + else if (r < 0) + goto out; + } + + r = 0; +out: + usbi_mutex_unlock(&ctx->open_devs_lock); + return r; +} + +static int op_clock_gettime(int clk_id, struct timespec *tp) +{ + switch (clk_id) { + case USBI_CLOCK_MONOTONIC: + return clock_gettime(monotonic_clkid, tp); + case USBI_CLOCK_REALTIME: + return clock_gettime(CLOCK_REALTIME, tp); + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +#ifdef USBI_TIMERFD_AVAILABLE +static clockid_t op_get_timerfd_clockid(void) +{ + return monotonic_clkid; + +} +#endif + +const struct usbi_os_backend linux_usbfs_backend = { + .name = "Linux usbfs", + .caps = USBI_CAP_HAS_HID_ACCESS|USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER, + .init = op_init, + .exit = op_exit, + .get_device_list = NULL, + .hotplug_poll = op_hotplug_poll, + .get_device_descriptor = op_get_device_descriptor, + .get_active_config_descriptor = op_get_active_config_descriptor, + .get_config_descriptor = op_get_config_descriptor, + .get_config_descriptor_by_value = op_get_config_descriptor_by_value, + + .open = op_open, + .close = op_close, + .get_configuration = op_get_configuration, + .set_configuration = op_set_configuration, + .claim_interface = op_claim_interface, + .release_interface = op_release_interface, + + .set_interface_altsetting = op_set_interface, + .clear_halt = op_clear_halt, + .reset_device = op_reset_device, + + .alloc_streams = op_alloc_streams, + .free_streams = op_free_streams, + + .dev_mem_alloc = op_dev_mem_alloc, + .dev_mem_free = op_dev_mem_free, + + .kernel_driver_active = op_kernel_driver_active, + .detach_kernel_driver = op_detach_kernel_driver, + .attach_kernel_driver = op_attach_kernel_driver, + + .destroy_device = op_destroy_device, + + .submit_transfer = op_submit_transfer, + .cancel_transfer = op_cancel_transfer, + .clear_transfer_priv = op_clear_transfer_priv, + + .handle_events = op_handle_events, + + .clock_gettime = op_clock_gettime, + +#ifdef USBI_TIMERFD_AVAILABLE + .get_timerfd_clockid = op_get_timerfd_clockid, +#endif + + .device_priv_size = sizeof(struct linux_device_priv), + .device_handle_priv_size = sizeof(struct linux_device_handle_priv), + .transfer_priv_size = sizeof(struct linux_transfer_priv), +}; diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/linux_usbfs.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/linux_usbfs.h new file mode 100644 index 00000000..8bd3ebcb --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/linux_usbfs.h @@ -0,0 +1,193 @@ +/* + * usbfs header structures + * Copyright © 2007 Daniel Drake + * Copyright © 2001 Johannes Erdfelt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_USBFS_H +#define LIBUSB_USBFS_H + +#include + +#define SYSFS_DEVICE_PATH "/sys/bus/usb/devices" + +struct usbfs_ctrltransfer { + /* keep in sync with usbdevice_fs.h:usbdevfs_ctrltransfer */ + uint8_t bmRequestType; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; + + uint32_t timeout; /* in milliseconds */ + + /* pointer to data */ + void *data; +}; + +struct usbfs_bulktransfer { + /* keep in sync with usbdevice_fs.h:usbdevfs_bulktransfer */ + unsigned int ep; + unsigned int len; + unsigned int timeout; /* in milliseconds */ + + /* pointer to data */ + void *data; +}; + +struct usbfs_setinterface { + /* keep in sync with usbdevice_fs.h:usbdevfs_setinterface */ + unsigned int interface; + unsigned int altsetting; +}; + +#define USBFS_MAXDRIVERNAME 255 + +struct usbfs_getdriver { + unsigned int interface; + char driver[USBFS_MAXDRIVERNAME + 1]; +}; + +#define USBFS_URB_SHORT_NOT_OK 0x01 +#define USBFS_URB_ISO_ASAP 0x02 +#define USBFS_URB_BULK_CONTINUATION 0x04 +#define USBFS_URB_QUEUE_BULK 0x10 +#define USBFS_URB_ZERO_PACKET 0x40 + +enum usbfs_urb_type { + USBFS_URB_TYPE_ISO = 0, + USBFS_URB_TYPE_INTERRUPT = 1, + USBFS_URB_TYPE_CONTROL = 2, + USBFS_URB_TYPE_BULK = 3, +}; + +struct usbfs_iso_packet_desc { + unsigned int length; + unsigned int actual_length; + unsigned int status; +}; + +#define MAX_ISO_BUFFER_LENGTH 49152 * 128 +#define MAX_BULK_BUFFER_LENGTH 16384 +#define MAX_CTRL_BUFFER_LENGTH 4096 + +struct usbfs_urb { + unsigned char type; + unsigned char endpoint; + int status; + unsigned int flags; + void *buffer; + int buffer_length; + int actual_length; + int start_frame; + union { + int number_of_packets; /* Only used for isoc urbs */ + unsigned int stream_id; /* Only used with bulk streams */ + }; + int error_count; + unsigned int signr; + void *usercontext; + struct usbfs_iso_packet_desc iso_frame_desc[0]; +}; + +struct usbfs_connectinfo { + unsigned int devnum; + unsigned char slow; +}; + +struct usbfs_ioctl { + int ifno; /* interface 0..N ; negative numbers reserved */ + int ioctl_code; /* MUST encode size + direction of data so the + * macros in give correct values */ + void *data; /* param buffer (in, or out) */ +}; + +struct usbfs_hub_portinfo { + unsigned char numports; + unsigned char port[127]; /* port to device num mapping */ +}; + +#define USBFS_CAP_ZERO_PACKET 0x01 +#define USBFS_CAP_BULK_CONTINUATION 0x02 +#define USBFS_CAP_NO_PACKET_SIZE_LIM 0x04 +#define USBFS_CAP_BULK_SCATTER_GATHER 0x08 +#define USBFS_CAP_REAP_AFTER_DISCONNECT 0x10 + +#define USBFS_DISCONNECT_CLAIM_IF_DRIVER 0x01 +#define USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER 0x02 + +struct usbfs_disconnect_claim { + unsigned int interface; + unsigned int flags; + char driver[USBFS_MAXDRIVERNAME + 1]; +}; + +struct usbfs_streams { + unsigned int num_streams; /* Not used by USBDEVFS_FREE_STREAMS */ + unsigned int num_eps; + unsigned char eps[0]; +}; + +#define IOCTL_USBFS_CONTROL _IOWR('U', 0, struct usbfs_ctrltransfer) +#define IOCTL_USBFS_BULK _IOWR('U', 2, struct usbfs_bulktransfer) +#define IOCTL_USBFS_RESETEP _IOR('U', 3, unsigned int) +#define IOCTL_USBFS_SETINTF _IOR('U', 4, struct usbfs_setinterface) +#define IOCTL_USBFS_SETCONFIG _IOR('U', 5, unsigned int) +#define IOCTL_USBFS_GETDRIVER _IOW('U', 8, struct usbfs_getdriver) +#define IOCTL_USBFS_SUBMITURB _IOR('U', 10, struct usbfs_urb) +#define IOCTL_USBFS_DISCARDURB _IO('U', 11) +#define IOCTL_USBFS_REAPURB _IOW('U', 12, void *) +#define IOCTL_USBFS_REAPURBNDELAY _IOW('U', 13, void *) +#define IOCTL_USBFS_CLAIMINTF _IOR('U', 15, unsigned int) +#define IOCTL_USBFS_RELEASEINTF _IOR('U', 16, unsigned int) +#define IOCTL_USBFS_CONNECTINFO _IOW('U', 17, struct usbfs_connectinfo) +#define IOCTL_USBFS_IOCTL _IOWR('U', 18, struct usbfs_ioctl) +#define IOCTL_USBFS_HUB_PORTINFO _IOR('U', 19, struct usbfs_hub_portinfo) +#define IOCTL_USBFS_RESET _IO('U', 20) +#define IOCTL_USBFS_CLEAR_HALT _IOR('U', 21, unsigned int) +#define IOCTL_USBFS_DISCONNECT _IO('U', 22) +#define IOCTL_USBFS_CONNECT _IO('U', 23) +#define IOCTL_USBFS_CLAIM_PORT _IOR('U', 24, unsigned int) +#define IOCTL_USBFS_RELEASE_PORT _IOR('U', 25, unsigned int) +#define IOCTL_USBFS_GET_CAPABILITIES _IOR('U', 26, __u32) +#define IOCTL_USBFS_DISCONNECT_CLAIM _IOR('U', 27, struct usbfs_disconnect_claim) +#define IOCTL_USBFS_ALLOC_STREAMS _IOR('U', 28, struct usbfs_streams) +#define IOCTL_USBFS_FREE_STREAMS _IOR('U', 29, struct usbfs_streams) + +extern usbi_mutex_static_t linux_hotplug_lock; + +#if defined(HAVE_LIBUDEV) +int linux_udev_start_event_monitor(void); +int linux_udev_stop_event_monitor(void); +int linux_udev_scan_devices(struct libusb_context *ctx); +void linux_udev_hotplug_poll(void); +#else +int linux_netlink_start_event_monitor(void); +int linux_netlink_stop_event_monitor(void); +void linux_netlink_hotplug_poll(void); +#endif + +void linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name); +void linux_device_disconnected(uint8_t busnum, uint8_t devaddr); + +int linux_get_device_address (struct libusb_context *ctx, int detached, + uint8_t *busnum, uint8_t *devaddr, const char *dev_node, + const char *sys_name); +int linux_enumerate_device(struct libusb_context *ctx, + uint8_t busnum, uint8_t devaddr, const char *sysfs_dir); + +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_posix.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_posix.c new file mode 100644 index 00000000..e2f55a57 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_posix.c @@ -0,0 +1,53 @@ +/* + * poll_posix: poll compatibility wrapper for POSIX systems + * Copyright © 2013 RealVNC Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include + +#include +#include +#include +#include + +#include "libusbi.h" + +int usbi_pipe(int pipefd[2]) +{ + int ret = pipe(pipefd); + if (ret != 0) { + return ret; + } + ret = fcntl(pipefd[1], F_GETFL); + if (ret == -1) { + usbi_dbg("Failed to get pipe fd flags: %d", errno); + goto err_close_pipe; + } + ret = fcntl(pipefd[1], F_SETFL, ret | O_NONBLOCK); + if (ret != 0) { + usbi_dbg("Failed to set non-blocking on new pipe: %d", errno); + goto err_close_pipe; + } + + return 0; + +err_close_pipe: + usbi_close(pipefd[0]); + usbi_close(pipefd[1]); + return ret; +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_posix.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_posix.h new file mode 100644 index 00000000..5b4b2c90 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_posix.h @@ -0,0 +1,11 @@ +#ifndef LIBUSB_POLL_POSIX_H +#define LIBUSB_POLL_POSIX_H + +#define usbi_write write +#define usbi_read read +#define usbi_close close +#define usbi_poll poll + +int usbi_pipe(int pipefd[2]); + +#endif /* LIBUSB_POLL_POSIX_H */ diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_windows.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_windows.c new file mode 100644 index 00000000..98256075 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_windows.c @@ -0,0 +1,728 @@ +/* + * poll_windows: poll compatibility wrapper for Windows + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* + * poll() and pipe() Windows compatibility layer for libusb 1.0 + * + * The way this layer works is by using OVERLAPPED with async I/O transfers, as + * OVERLAPPED have an associated event which is flagged for I/O completion. + * + * For USB pollable async I/O, you would typically: + * - obtain a Windows HANDLE to a file or device that has been opened in + * OVERLAPPED mode + * - call usbi_create_fd with this handle to obtain a custom fd. + * Note that if you need simultaneous R/W access, you need to call create_fd + * twice, once in RW_READ and once in RW_WRITE mode to obtain 2 separate + * pollable fds + * - leave the core functions call the poll routine and flag POLLIN/POLLOUT + * + * The pipe pollable synchronous I/O works using the overlapped event associated + * with a fake pipe. The read/write functions are only meant to be used in that + * context. + */ +#include + +#include +#include +#include + +#include "libusbi.h" + +// Uncomment to debug the polling layer +//#define DEBUG_POLL_WINDOWS +#if defined(DEBUG_POLL_WINDOWS) +#define poll_dbg usbi_dbg +#else +// MSVC++ < 2005 cannot use a variadic argument and non MSVC +// compilers produce warnings if parenthesis are omitted. +#if defined(_MSC_VER) && (_MSC_VER < 1400) +#define poll_dbg +#else +#define poll_dbg(...) +#endif +#endif + +#if defined(_PREFAST_) +#pragma warning(disable:28719) +#endif + +#define CHECK_INIT_POLLING do {if(!is_polling_set) init_polling();} while(0) + +// public fd data +const struct winfd INVALID_WINFD = {-1, INVALID_HANDLE_VALUE, NULL, NULL, NULL, RW_NONE}; +struct winfd poll_fd[MAX_FDS]; +// internal fd data +struct { + CRITICAL_SECTION mutex; // lock for fds + // Additional variables for XP CancelIoEx partial emulation + HANDLE original_handle; + DWORD thread_id; +} _poll_fd[MAX_FDS]; + +// globals +BOOLEAN is_polling_set = FALSE; +LONG pipe_number = 0; +static volatile LONG compat_spinlock = 0; + +#if !defined(_WIN32_WCE) +// CancelIoEx, available on Vista and later only, provides the ability to cancel +// a single transfer (OVERLAPPED) when used. As it may not be part of any of the +// platform headers, we hook into the Kernel32 system DLL directly to seek it. +static BOOL (__stdcall *pCancelIoEx)(HANDLE, LPOVERLAPPED) = NULL; +#define Use_Duplicate_Handles (pCancelIoEx == NULL) + +static inline void setup_cancel_io(void) +{ + HMODULE hKernel32 = GetModuleHandleA("KERNEL32"); + if (hKernel32 != NULL) { + pCancelIoEx = (BOOL (__stdcall *)(HANDLE,LPOVERLAPPED)) + GetProcAddress(hKernel32, "CancelIoEx"); + } + usbi_dbg("Will use CancelIo%s for I/O cancellation", + Use_Duplicate_Handles?"":"Ex"); +} + +static inline BOOL cancel_io(int _index) +{ + if ((_index < 0) || (_index >= MAX_FDS)) { + return FALSE; + } + + if ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE) + || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) { + return TRUE; + } + if (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) { + // Cancel outstanding transfer via the specific callback + (*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer); + return TRUE; + } + if (pCancelIoEx != NULL) { + return (*pCancelIoEx)(poll_fd[_index].handle, poll_fd[_index].overlapped); + } + if (_poll_fd[_index].thread_id == GetCurrentThreadId()) { + return CancelIo(poll_fd[_index].handle); + } + usbi_warn(NULL, "Unable to cancel I/O that was started from another thread"); + return FALSE; +} +#else +#define Use_Duplicate_Handles FALSE + +static __inline void setup_cancel_io() +{ + // No setup needed on WinCE +} + +static __inline BOOL cancel_io(int _index) +{ + if ((_index < 0) || (_index >= MAX_FDS)) { + return FALSE; + } + if ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE) + || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) { + return TRUE; + } + if (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) { + // Cancel outstanding transfer via the specific callback + (*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer); + } + return TRUE; +} +#endif + +// Init +void init_polling(void) +{ + int i; + + while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { + SleepEx(0, TRUE); + } + if (!is_polling_set) { + setup_cancel_io(); + for (i=0; ihEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if(overlapped->hEvent == NULL) { + free (overlapped); + return NULL; + } + return overlapped; +} + +static void free_overlapped(OVERLAPPED *overlapped) +{ + if (overlapped == NULL) + return; + + if ( (overlapped->hEvent != 0) + && (overlapped->hEvent != INVALID_HANDLE_VALUE) ) { + CloseHandle(overlapped->hEvent); + } + free(overlapped); +} + +void exit_polling(void) +{ + int i; + + while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { + SleepEx(0, TRUE); + } + if (is_polling_set) { + is_polling_set = FALSE; + + for (i=0; iInternal = STATUS_PENDING; + overlapped->InternalHigh = 0; + + for (i=0; i= 0) { + LeaveCriticalSection(&_poll_fd[i].mutex); + continue; + } + + // Use index as the unique fd number + poll_fd[i].fd = i; + // Read end of the "pipe" + filedes[0] = poll_fd[i].fd; + // We can use the same handle for both ends + filedes[1] = filedes[0]; + + poll_fd[i].handle = DUMMY_HANDLE; + poll_fd[i].overlapped = overlapped; + // There's no polling on the write end, so we just use READ for our needs + poll_fd[i].rw = RW_READ; + _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; + LeaveCriticalSection(&_poll_fd[i].mutex); + return 0; + } + } + free_overlapped(overlapped); + return -1; +} + +/* + * Create both an fd and an OVERLAPPED from an open Windows handle, so that + * it can be used with our polling function + * The handle MUST support overlapped transfers (usually requires CreateFile + * with FILE_FLAG_OVERLAPPED) + * Return a pollable file descriptor struct, or INVALID_WINFD on error + * + * Note that the fd returned by this function is a per-transfer fd, rather + * than a per-session fd and cannot be used for anything else but our + * custom functions (the fd itself points to the NUL: device) + * if you plan to do R/W on the same handle, you MUST create 2 fds: one for + * read and one for write. Using a single R/W fd is unsupported and will + * produce unexpected results + */ +struct winfd usbi_create_fd(HANDLE handle, int access_mode, struct usbi_transfer *itransfer, cancel_transfer *cancel_fn) +{ + int i; + struct winfd wfd = INVALID_WINFD; + OVERLAPPED* overlapped = NULL; + + CHECK_INIT_POLLING; + + if ((handle == 0) || (handle == INVALID_HANDLE_VALUE)) { + return INVALID_WINFD; + } + + wfd.itransfer = itransfer; + wfd.cancel_fn = cancel_fn; + + if ((access_mode != RW_READ) && (access_mode != RW_WRITE)) { + usbi_warn(NULL, "only one of RW_READ or RW_WRITE are supported. " + "If you want to poll for R/W simultaneously, create multiple fds from the same handle."); + return INVALID_WINFD; + } + if (access_mode == RW_READ) { + wfd.rw = RW_READ; + } else { + wfd.rw = RW_WRITE; + } + + overlapped = create_overlapped(); + if(overlapped == NULL) { + return INVALID_WINFD; + } + + for (i=0; i= 0) { + LeaveCriticalSection(&_poll_fd[i].mutex); + continue; + } + // Use index as the unique fd number + wfd.fd = i; + // Attempt to emulate some of the CancelIoEx behaviour on platforms + // that don't have it + if (Use_Duplicate_Handles) { + _poll_fd[i].thread_id = GetCurrentThreadId(); + if (!DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(), + &wfd.handle, 0, TRUE, DUPLICATE_SAME_ACCESS)) { + usbi_dbg("could not duplicate handle for CancelIo - using original one"); + wfd.handle = handle; + // Make sure we won't close the original handle on fd deletion then + _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; + } else { + _poll_fd[i].original_handle = handle; + } + } else { + wfd.handle = handle; + } + wfd.overlapped = overlapped; + memcpy(&poll_fd[i], &wfd, sizeof(struct winfd)); + LeaveCriticalSection(&_poll_fd[i].mutex); + return wfd; + } + } + free_overlapped(overlapped); + return INVALID_WINFD; +} + +static void _free_index(int _index) +{ + // Cancel any async IO (Don't care about the validity of our handles for this) + cancel_io(_index); + // close the duplicate handle (if we have an actual duplicate) + if (Use_Duplicate_Handles) { + if (_poll_fd[_index].original_handle != INVALID_HANDLE_VALUE) { + CloseHandle(poll_fd[_index].handle); + } + _poll_fd[_index].original_handle = INVALID_HANDLE_VALUE; + _poll_fd[_index].thread_id = 0; + } + free_overlapped(poll_fd[_index].overlapped); + poll_fd[_index] = INVALID_WINFD; +} + +/* + * Release a pollable file descriptor. + * + * Note that the associated Windows handle is not closed by this call + */ +void usbi_free_fd(struct winfd *wfd) +{ + int _index; + + CHECK_INIT_POLLING; + + _index = _fd_to_index_and_lock(wfd->fd); + if (_index < 0) { + return; + } + _free_index(_index); + *wfd = INVALID_WINFD; + LeaveCriticalSection(&_poll_fd[_index].mutex); +} + +/* + * The functions below perform various conversions between fd, handle and OVERLAPPED + */ +struct winfd fd_to_winfd(int fd) +{ + int i; + struct winfd wfd; + + CHECK_INIT_POLLING; + + if (fd < 0) + return INVALID_WINFD; + + for (i=0; i= 0) { + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + usbi_warn(NULL, "invalid fd"); + triggered = -1; + goto poll_exit; + } + + // IN or OUT must match our fd direction + if ((fds[i].events & POLLIN) && (poll_fd[_index].rw != RW_READ)) { + fds[i].revents |= POLLNVAL | POLLERR; + errno = EBADF; + usbi_warn(NULL, "attempted POLLIN on fd without READ access"); + LeaveCriticalSection(&_poll_fd[_index].mutex); + triggered = -1; + goto poll_exit; + } + + if ((fds[i].events & POLLOUT) && (poll_fd[_index].rw != RW_WRITE)) { + fds[i].revents |= POLLNVAL | POLLERR; + errno = EBADF; + usbi_warn(NULL, "attempted POLLOUT on fd without WRITE access"); + LeaveCriticalSection(&_poll_fd[_index].mutex); + triggered = -1; + goto poll_exit; + } + + // The following macro only works if overlapped I/O was reported pending + if ( (HasOverlappedIoCompleted(poll_fd[_index].overlapped)) + || (HasOverlappedIoCompletedSync(poll_fd[_index].overlapped)) ) { + poll_dbg(" completed"); + // checks above should ensure this works: + fds[i].revents = fds[i].events; + triggered++; + } else { + handles_to_wait_on[nb_handles_to_wait_on] = poll_fd[_index].overlapped->hEvent; + handle_to_index[nb_handles_to_wait_on] = i; + nb_handles_to_wait_on++; + } + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + + // If nothing was triggered, wait on all fds that require it + if ((timeout != 0) && (triggered == 0) && (nb_handles_to_wait_on != 0)) { + if (timeout < 0) { + poll_dbg("starting infinite wait for %u handles...", (unsigned int)nb_handles_to_wait_on); + } else { + poll_dbg("starting %d ms wait for %u handles...", timeout, (unsigned int)nb_handles_to_wait_on); + } + ret = WaitForMultipleObjects(nb_handles_to_wait_on, handles_to_wait_on, + FALSE, (timeout<0)?INFINITE:(DWORD)timeout); + object_index = ret-WAIT_OBJECT_0; + if ((object_index >= 0) && ((DWORD)object_index < nb_handles_to_wait_on)) { + poll_dbg(" completed after wait"); + i = handle_to_index[object_index]; + _index = _fd_to_index_and_lock(fds[i].fd); + fds[i].revents = fds[i].events; + triggered++; + if (_index >= 0) { + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + } else if (ret == WAIT_TIMEOUT) { + poll_dbg(" timed out"); + triggered = 0; // 0 = timeout + } else { + errno = EIO; + triggered = -1; // error + } + } + +poll_exit: + if (handles_to_wait_on != NULL) { + free(handles_to_wait_on); + } + if (handle_to_index != NULL) { + free(handle_to_index); + } + return triggered; +} + +/* + * close a fake pipe fd + */ +int usbi_close(int fd) +{ + int _index; + int r = -1; + + CHECK_INIT_POLLING; + + _index = _fd_to_index_and_lock(fd); + + if (_index < 0) { + errno = EBADF; + } else { + free_overlapped(poll_fd[_index].overlapped); + poll_fd[_index] = INVALID_WINFD; + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + return r; +} + +/* + * synchronous write for fake "pipe" signaling + */ +ssize_t usbi_write(int fd, const void *buf, size_t count) +{ + int _index; + UNUSED(buf); + + CHECK_INIT_POLLING; + + if (count != sizeof(unsigned char)) { + usbi_err(NULL, "this function should only used for signaling"); + return -1; + } + + _index = _fd_to_index_and_lock(fd); + + if ( (_index < 0) || (poll_fd[_index].overlapped == NULL) ) { + errno = EBADF; + if (_index >= 0) { + LeaveCriticalSection(&_poll_fd[_index].mutex); + } + return -1; + } + + poll_dbg("set pipe event (fd = %d, thread = %08X)", _index, (unsigned int)GetCurrentThreadId()); + SetEvent(poll_fd[_index].overlapped->hEvent); + poll_fd[_index].overlapped->Internal = STATUS_WAIT_0; + // If two threads write on the pipe at the same time, we need to + // process two separate reads => use the overlapped as a counter + poll_fd[_index].overlapped->InternalHigh++; + + LeaveCriticalSection(&_poll_fd[_index].mutex); + return sizeof(unsigned char); +} + +/* + * synchronous read for fake "pipe" signaling + */ +ssize_t usbi_read(int fd, void *buf, size_t count) +{ + int _index; + ssize_t r = -1; + UNUSED(buf); + + CHECK_INIT_POLLING; + + if (count != sizeof(unsigned char)) { + usbi_err(NULL, "this function should only used for signaling"); + return -1; + } + + _index = _fd_to_index_and_lock(fd); + + if (_index < 0) { + errno = EBADF; + return -1; + } + + if (WaitForSingleObject(poll_fd[_index].overlapped->hEvent, INFINITE) != WAIT_OBJECT_0) { + usbi_warn(NULL, "waiting for event failed: %u", (unsigned int)GetLastError()); + errno = EIO; + goto out; + } + + poll_dbg("clr pipe event (fd = %d, thread = %08X)", _index, (unsigned int)GetCurrentThreadId()); + poll_fd[_index].overlapped->InternalHigh--; + // Don't reset unless we don't have any more events to process + if (poll_fd[_index].overlapped->InternalHigh <= 0) { + ResetEvent(poll_fd[_index].overlapped->hEvent); + poll_fd[_index].overlapped->Internal = STATUS_PENDING; + } + + r = sizeof(unsigned char); + +out: + LeaveCriticalSection(&_poll_fd[_index].mutex); + return r; +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_windows.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_windows.h new file mode 100644 index 00000000..aa4c985d --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/poll_windows.h @@ -0,0 +1,131 @@ +/* + * Windows compat: POSIX compatibility wrapper + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2010 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#pragma once + +#if defined(_MSC_VER) +// disable /W4 MSVC warnings that are benign +#pragma warning(disable:4127) // conditional expression is constant +#endif + +// Handle synchronous completion through the overlapped structure +#if !defined(STATUS_REPARSE) // reuse the REPARSE status code +#define STATUS_REPARSE ((LONG)0x00000104L) +#endif +#define STATUS_COMPLETED_SYNCHRONOUSLY STATUS_REPARSE +#if defined(_WIN32_WCE) +// WinCE doesn't have a HasOverlappedIoCompleted() macro, so attempt to emulate it +#define HasOverlappedIoCompleted(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) != STATUS_PENDING) +#endif +#define HasOverlappedIoCompletedSync(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) == STATUS_COMPLETED_SYNCHRONOUSLY) + +#define DUMMY_HANDLE ((HANDLE)(LONG_PTR)-2) + +/* Windows versions */ +enum windows_version { + WINDOWS_CE = -2, + WINDOWS_UNDEFINED = -1, + WINDOWS_UNSUPPORTED = 0, + WINDOWS_XP = 0x51, + WINDOWS_2003 = 0x52, // Also XP x64 + WINDOWS_VISTA = 0x60, + WINDOWS_7 = 0x61, + WINDOWS_8 = 0x62, + WINDOWS_8_1_OR_LATER = 0x63, + WINDOWS_MAX +}; +extern int windows_version; + +#define MAX_FDS 256 + +#define POLLIN 0x0001 /* There is data to read */ +#define POLLPRI 0x0002 /* There is urgent data to read */ +#define POLLOUT 0x0004 /* Writing now will not block */ +#define POLLERR 0x0008 /* Error condition */ +#define POLLHUP 0x0010 /* Hung up */ +#define POLLNVAL 0x0020 /* Invalid request: fd not open */ + +struct pollfd { + int fd; /* file descriptor */ + short events; /* requested events */ + short revents; /* returned events */ +}; + +// access modes +enum rw_type { + RW_NONE, + RW_READ, + RW_WRITE, +}; + +// fd struct that can be used for polling on Windows +typedef int cancel_transfer(struct usbi_transfer *itransfer); + +struct winfd { + int fd; // what's exposed to libusb core + HANDLE handle; // what we need to attach overlapped to the I/O op, so we can poll it + OVERLAPPED* overlapped; // what will report our I/O status + struct usbi_transfer *itransfer; // Associated transfer, or NULL if completed + cancel_transfer *cancel_fn; // Function pointer to cancel transfer API + enum rw_type rw; // I/O transfer direction: read *XOR* write (NOT BOTH) +}; +extern const struct winfd INVALID_WINFD; + +int usbi_pipe(int pipefd[2]); +int usbi_poll(struct pollfd *fds, unsigned int nfds, int timeout); +ssize_t usbi_write(int fd, const void *buf, size_t count); +ssize_t usbi_read(int fd, void *buf, size_t count); +int usbi_close(int fd); + +void init_polling(void); +void exit_polling(void); +struct winfd usbi_create_fd(HANDLE handle, int access_mode, + struct usbi_transfer *transfer, cancel_transfer *cancel_fn); +void usbi_free_fd(struct winfd* winfd); +struct winfd fd_to_winfd(int fd); +struct winfd handle_to_winfd(HANDLE handle); +struct winfd overlapped_to_winfd(OVERLAPPED* overlapped); + +/* + * Timeval operations + */ +#if defined(DDKBUILD) +#include // defines timeval functions on DDK +#endif + +#if !defined(TIMESPEC_TO_TIMEVAL) +#define TIMESPEC_TO_TIMEVAL(tv, ts) { \ + (tv)->tv_sec = (long)(ts)->tv_sec; \ + (tv)->tv_usec = (long)(ts)->tv_nsec / 1000; \ +} +#endif +#if !defined(timersub) +#define timersub(a, b, result) \ +do { \ + (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ + (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ + if ((result)->tv_usec < 0) { \ + --(result)->tv_sec; \ + (result)->tv_usec += 1000000; \ + } \ +} while (0) +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_posix.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_posix.c new file mode 100644 index 00000000..a4f270bb --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_posix.c @@ -0,0 +1,79 @@ +/* + * libusb synchronization using POSIX Threads + * + * Copyright © 2011 Vitali Lovich + * Copyright © 2011 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#if defined(__linux__) || defined(__OpenBSD__) +# if defined(__OpenBSD__) +# define _BSD_SOURCE +# endif +# include +# include +#elif defined(__APPLE__) +# include +#elif defined(__CYGWIN__) +# include +#endif + +#include "threads_posix.h" +#include "libusbi.h" + +int usbi_cond_timedwait(pthread_cond_t *cond, + pthread_mutex_t *mutex, const struct timeval *tv) +{ + struct timespec timeout; + int r; + + r = usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &timeout); + if (r < 0) + return r; + + timeout.tv_sec += tv->tv_sec; + timeout.tv_nsec += tv->tv_usec * 1000; + while (timeout.tv_nsec >= 1000000000L) { + timeout.tv_nsec -= 1000000000L; + timeout.tv_sec++; + } + + return pthread_cond_timedwait(cond, mutex, &timeout); +} + +int usbi_get_tid(void) +{ + int ret = -1; +#if defined(__ANDROID__) + ret = gettid(); +#elif defined(__linux__) + ret = syscall(SYS_gettid); +#elif defined(__OpenBSD__) + /* The following only works with OpenBSD > 5.1 as it requires + real thread support. For 5.1 and earlier, -1 is returned. */ + ret = syscall(SYS_getthrid); +#elif defined(__APPLE__) + ret = mach_thread_self(); + mach_port_deallocate(mach_task_self(), ret); +#elif defined(__CYGWIN__) + ret = GetCurrentThreadId(); +#endif +/* TODO: NetBSD thread ID support */ + return ret; +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_posix.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_posix.h new file mode 100644 index 00000000..4c1514ea --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_posix.h @@ -0,0 +1,55 @@ +/* + * libusb synchronization using POSIX Threads + * + * Copyright © 2010 Peter Stuge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_THREADS_POSIX_H +#define LIBUSB_THREADS_POSIX_H + +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#define usbi_mutex_static_t pthread_mutex_t +#define USBI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +#define usbi_mutex_static_lock pthread_mutex_lock +#define usbi_mutex_static_unlock pthread_mutex_unlock + +#define usbi_mutex_t pthread_mutex_t +#define usbi_mutex_init(mutex) pthread_mutex_init((mutex), NULL) +#define usbi_mutex_lock pthread_mutex_lock +#define usbi_mutex_unlock pthread_mutex_unlock +#define usbi_mutex_trylock pthread_mutex_trylock +#define usbi_mutex_destroy pthread_mutex_destroy + +#define usbi_cond_t pthread_cond_t +#define usbi_cond_init(cond) pthread_cond_init((cond), NULL) +#define usbi_cond_wait pthread_cond_wait +#define usbi_cond_broadcast pthread_cond_broadcast +#define usbi_cond_destroy pthread_cond_destroy + +#define usbi_tls_key_t pthread_key_t +#define usbi_tls_key_create(key) pthread_key_create((key), NULL) +#define usbi_tls_key_get pthread_getspecific +#define usbi_tls_key_set pthread_setspecific +#define usbi_tls_key_delete pthread_key_delete + +int usbi_get_tid(void); + +#endif /* LIBUSB_THREADS_POSIX_H */ diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_windows.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_windows.c new file mode 100644 index 00000000..9e896c64 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_windows.c @@ -0,0 +1,268 @@ +/* + * libusb synchronization on Microsoft Windows + * + * Copyright © 2010 Michael Plante + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include + +#ifdef OS_WINDOWS + #include + + #include + #if defined(interface) + #undef interface + #endif +#endif + +#include "libusbi.h" + +struct usbi_cond_perthread { + struct list_head list; + DWORD tid; + HANDLE event; +}; + +int usbi_mutex_static_lock(usbi_mutex_static_t *mutex) +{ + if (!mutex) + return EINVAL; + while (InterlockedExchange(mutex, 1) == 1) + SleepEx(0, TRUE); + return 0; +} + +int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex) +{ + if (!mutex) + return EINVAL; + InterlockedExchange(mutex, 0); + return 0; +} + +int usbi_mutex_init(usbi_mutex_t *mutex) +{ + if (!mutex) + return EINVAL; + *mutex = CreateMutex(NULL, FALSE, NULL); + if (!*mutex) + return ENOMEM; + return 0; +} + +int usbi_mutex_lock(usbi_mutex_t *mutex) +{ + DWORD result; + + if (!mutex) + return EINVAL; + result = WaitForSingleObject(*mutex, INFINITE); + if (result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) + return 0; // acquired (ToDo: check that abandoned is ok) + else + return EINVAL; // don't know how this would happen + // so don't know proper errno +} + +int usbi_mutex_unlock(usbi_mutex_t *mutex) +{ + if (!mutex) + return EINVAL; + if (ReleaseMutex(*mutex)) + return 0; + else + return EPERM; +} + +int usbi_mutex_trylock(usbi_mutex_t *mutex) +{ + DWORD result; + + if (!mutex) + return EINVAL; + result = WaitForSingleObject(*mutex, 0); + if (result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) + return 0; // acquired (ToDo: check that abandoned is ok) + else if (result == WAIT_TIMEOUT) + return EBUSY; + else + return EINVAL; // don't know how this would happen + // so don't know proper error +} + +int usbi_mutex_destroy(usbi_mutex_t *mutex) +{ + // It is not clear if CloseHandle failure is due to failure to unlock. + // If so, this should be errno=EBUSY. + if (!mutex || !CloseHandle(*mutex)) + return EINVAL; + *mutex = NULL; + return 0; +} + +int usbi_cond_init(usbi_cond_t *cond) +{ + if (!cond) + return EINVAL; + list_init(&cond->waiters); + list_init(&cond->not_waiting); + return 0; +} + +int usbi_cond_destroy(usbi_cond_t *cond) +{ + // This assumes no one is using this anymore. The check MAY NOT BE safe. + struct usbi_cond_perthread *pos, *next_pos; + + if(!cond) + return EINVAL; + if (!list_empty(&cond->waiters)) + return EBUSY; // (!see above!) + list_for_each_entry_safe(pos, next_pos, &cond->not_waiting, list, struct usbi_cond_perthread) { + CloseHandle(pos->event); + list_del(&pos->list); + free(pos); + } + return 0; +} + +int usbi_cond_broadcast(usbi_cond_t *cond) +{ + // Assumes mutex is locked; this is not in keeping with POSIX spec, but + // libusb does this anyway, so we simplify by not adding more sync + // primitives to the CV definition! + int fail = 0; + struct usbi_cond_perthread *pos; + + if (!cond) + return EINVAL; + list_for_each_entry(pos, &cond->waiters, list, struct usbi_cond_perthread) { + if (!SetEvent(pos->event)) + fail = 1; + } + // The wait function will remove its respective item from the list. + return fail ? EINVAL : 0; +} + +__inline static int usbi_cond_intwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, DWORD timeout_ms) +{ + struct usbi_cond_perthread *pos; + int r, found = 0; + DWORD r2, tid = GetCurrentThreadId(); + + if (!cond || !mutex) + return EINVAL; + list_for_each_entry(pos, &cond->not_waiting, list, struct usbi_cond_perthread) { + if(tid == pos->tid) { + found = 1; + break; + } + } + + if (!found) { + pos = calloc(1, sizeof(struct usbi_cond_perthread)); + if (!pos) + return ENOMEM; // This errno is not POSIX-allowed. + pos->tid = tid; + pos->event = CreateEvent(NULL, FALSE, FALSE, NULL); // auto-reset. + if (!pos->event) { + free(pos); + return ENOMEM; + } + list_add(&pos->list, &cond->not_waiting); + } + + list_del(&pos->list); // remove from not_waiting list. + list_add(&pos->list, &cond->waiters); + + r = usbi_mutex_unlock(mutex); + if (r) + return r; + + r2 = WaitForSingleObject(pos->event, timeout_ms); + r = usbi_mutex_lock(mutex); + if (r) + return r; + + list_del(&pos->list); + list_add(&pos->list, &cond->not_waiting); + + if (r2 == WAIT_OBJECT_0) + return 0; + else if (r2 == WAIT_TIMEOUT) + return ETIMEDOUT; + else + return EINVAL; +} +// N.B.: usbi_cond_*wait() can also return ENOMEM, even though pthread_cond_*wait cannot! +int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex) +{ + return usbi_cond_intwait(cond, mutex, INFINITE); +} + +int usbi_cond_timedwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, const struct timeval *tv) +{ + DWORD millis; + + millis = (DWORD)(tv->tv_sec * 1000) + (tv->tv_usec / 1000); + /* round up to next millisecond */ + if (tv->tv_usec % 1000) + millis++; + return usbi_cond_intwait(cond, mutex, millis); +} + +int usbi_tls_key_create(usbi_tls_key_t *key) +{ + if (!key) + return EINVAL; + *key = TlsAlloc(); + if (*key == TLS_OUT_OF_INDEXES) + return ENOMEM; + else + return 0; +} + +void *usbi_tls_key_get(usbi_tls_key_t key) +{ + return TlsGetValue(key); +} + +int usbi_tls_key_set(usbi_tls_key_t key, void *value) +{ + if (TlsSetValue(key, value)) + return 0; + else + return EINVAL; +} + +int usbi_tls_key_delete(usbi_tls_key_t key) +{ + if (TlsFree(key)) + return 0; + else + return EINVAL; +} + +int usbi_get_tid(void) +{ + return (int)GetCurrentThreadId(); +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_windows.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_windows.h new file mode 100644 index 00000000..e97ee787 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/threads_windows.h @@ -0,0 +1,76 @@ +/* + * libusb synchronization on Microsoft Windows + * + * Copyright © 2010 Michael Plante + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef LIBUSB_THREADS_WINDOWS_H +#define LIBUSB_THREADS_WINDOWS_H + +#define usbi_mutex_static_t volatile LONG +#define USBI_MUTEX_INITIALIZER 0 + +#define usbi_mutex_t HANDLE + +typedef struct usbi_cond { + // Every time a thread touches the CV, it winds up in one of these lists. + // It stays there until the CV is destroyed, even if the thread terminates. + struct list_head waiters; + struct list_head not_waiting; +} usbi_cond_t; + +// We *were* getting timespec from pthread.h: +#if (!defined(HAVE_STRUCT_TIMESPEC) && !defined(_TIMESPEC_DEFINED)) +#define HAVE_STRUCT_TIMESPEC 1 +#define _TIMESPEC_DEFINED 1 +struct timespec { + long tv_sec; + long tv_nsec; +}; +#endif /* HAVE_STRUCT_TIMESPEC | _TIMESPEC_DEFINED */ + +// We *were* getting ETIMEDOUT from pthread.h: +#ifndef ETIMEDOUT +# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ +#endif + +#define usbi_tls_key_t DWORD + +int usbi_mutex_static_lock(usbi_mutex_static_t *mutex); +int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex); + +int usbi_mutex_init(usbi_mutex_t *mutex); +int usbi_mutex_lock(usbi_mutex_t *mutex); +int usbi_mutex_unlock(usbi_mutex_t *mutex); +int usbi_mutex_trylock(usbi_mutex_t *mutex); +int usbi_mutex_destroy(usbi_mutex_t *mutex); + +int usbi_cond_init(usbi_cond_t *cond); +int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex); +int usbi_cond_timedwait(usbi_cond_t *cond, + usbi_mutex_t *mutex, const struct timeval *tv); +int usbi_cond_broadcast(usbi_cond_t *cond); +int usbi_cond_destroy(usbi_cond_t *cond); + +int usbi_tls_key_create(usbi_tls_key_t *key); +void *usbi_tls_key_get(usbi_tls_key_t key); +int usbi_tls_key_set(usbi_tls_key_t key, void *value); +int usbi_tls_key_delete(usbi_tls_key_t key); + +int usbi_get_tid(void); + +#endif /* LIBUSB_THREADS_WINDOWS_H */ diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_common.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_common.h new file mode 100644 index 00000000..55344ca2 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_common.h @@ -0,0 +1,124 @@ +/* + * Windows backend common header for libusb 1.0 + * + * This file brings together header code common between + * the desktop Windows and Windows CE backends. + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +// Windows API default is uppercase - ugh! +#if !defined(bool) +#define bool BOOL +#endif +#if !defined(true) +#define true TRUE +#endif +#if !defined(false) +#define false FALSE +#endif + +#define EPOCH_TIME UINT64_C(116444736000000000) // 1970.01.01 00:00:000 in MS Filetime + +#if defined(__CYGWIN__ ) +#define _stricmp strcasecmp +#define _strdup strdup +// _beginthreadex is MSVCRT => unavailable for cygwin. Fallback to using CreateThread +#define _beginthreadex(a, b, c, d, e, f) CreateThread(a, b, (LPTHREAD_START_ROUTINE)c, d, e, (LPDWORD)f) +#endif + +#define safe_free(p) do {if (p != NULL) {free((void *)p); p = NULL;}} while (0) + +#ifndef ARRAYSIZE +#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) +#endif + +#define ERR_BUFFER_SIZE 256 + +/* + * API macros - leveraged from libusb-win32 1.x + */ +#ifndef _WIN32_WCE +#define DLL_STRINGIFY(s) #s +#define DLL_LOAD_LIBRARY(name) LoadLibraryA(DLL_STRINGIFY(name)) +#else +#define DLL_STRINGIFY(s) L#s +#define DLL_LOAD_LIBRARY(name) LoadLibrary(DLL_STRINGIFY(name)) +#endif + +/* + * Macros for handling DLL themselves + */ +#define DLL_DECLARE_HANDLE(name) \ + static HMODULE __dll_##name##_handle = NULL + +#define DLL_GET_HANDLE(name) \ + do { \ + __dll_##name##_handle = DLL_LOAD_LIBRARY(name); \ + if (!__dll_##name##_handle) \ + return LIBUSB_ERROR_OTHER; \ + } while (0) + +#define DLL_FREE_HANDLE(name) \ + do { \ + if (__dll_##name##_handle) { \ + FreeLibrary(__dll_##name##_handle); \ + __dll_##name##_handle = NULL; \ + } \ + } while(0) + + +/* + * Macros for handling functions within a DLL + */ +#define DLL_DECLARE_FUNC_PREFIXNAME(api, ret, prefixname, name, args) \ + typedef ret (api * __dll_##name##_func_t)args; \ + static __dll_##name##_func_t prefixname = NULL + +#define DLL_DECLARE_FUNC(api, ret, name, args) \ + DLL_DECLARE_FUNC_PREFIXNAME(api, ret, name, name, args) +#define DLL_DECLARE_FUNC_PREFIXED(api, ret, prefix, name, args) \ + DLL_DECLARE_FUNC_PREFIXNAME(api, ret, prefix##name, name, args) + +#define DLL_LOAD_FUNC_PREFIXNAME(dll, prefixname, name, ret_on_failure) \ + do { \ + HMODULE h = __dll_##dll##_handle; \ + prefixname = (__dll_##name##_func_t)GetProcAddress(h, \ + DLL_STRINGIFY(name)); \ + if (prefixname) \ + break; \ + prefixname = (__dll_##name##_func_t)GetProcAddress(h, \ + DLL_STRINGIFY(name) DLL_STRINGIFY(A)); \ + if (prefixname) \ + break; \ + prefixname = (__dll_##name##_func_t)GetProcAddress(h, \ + DLL_STRINGIFY(name) DLL_STRINGIFY(W)); \ + if (prefixname) \ + break; \ + if (ret_on_failure) \ + return LIBUSB_ERROR_NOT_FOUND; \ + } while(0) + +#define DLL_LOAD_FUNC(dll, name, ret_on_failure) \ + DLL_LOAD_FUNC_PREFIXNAME(dll, name, name, ret_on_failure) +#define DLL_LOAD_FUNC_PREFIXED(dll, prefix, name, ret_on_failure) \ + DLL_LOAD_FUNC_PREFIXNAME(dll, prefix##name, name, ret_on_failure) diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_nt_common.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_nt_common.c new file mode 100644 index 00000000..d935394a --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_nt_common.c @@ -0,0 +1,591 @@ +/* + * windows backend for libusb 1.0 + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software + * Hash table functions adapted from glibc, by Ulrich Drepper et al. + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include + +#include "libusbi.h" +#include "windows_common.h" +#include "windows_nt_common.h" + +// Global variables for clock_gettime mechanism +static uint64_t hires_ticks_to_ps; +static uint64_t hires_frequency; + +#define TIMER_REQUEST_RETRY_MS 100 +#define WM_TIMER_REQUEST (WM_USER + 1) +#define WM_TIMER_EXIT (WM_USER + 2) + +// used for monotonic clock_gettime() +struct timer_request { + struct timespec *tp; + HANDLE event; +}; + +// Timer thread +static HANDLE timer_thread = NULL; +static DWORD timer_thread_id = 0; + +/* User32 dependencies */ +DLL_DECLARE_HANDLE(User32); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, GetMessageA, (LPMSG, HWND, UINT, UINT)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PeekMessageA, (LPMSG, HWND, UINT, UINT, UINT)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PostThreadMessageA, (DWORD, UINT, WPARAM, LPARAM)); + +static unsigned __stdcall windows_clock_gettime_threaded(void *param); + +/* +* Converts a windows error to human readable string +* uses retval as errorcode, or, if 0, use GetLastError() +*/ +#if defined(ENABLE_LOGGING) +const char *windows_error_str(DWORD error_code) +{ + static char err_string[ERR_BUFFER_SIZE]; + + DWORD size; + int len; + + if (error_code == 0) + error_code = GetLastError(); + + len = sprintf(err_string, "[%u] ", (unsigned int)error_code); + + // Translate codes returned by SetupAPI. The ones we are dealing with are either + // in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes. + // See http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011.aspx + switch (error_code & 0xE0000000) { + case 0: + error_code = HRESULT_FROM_WIN32(error_code); // Still leaves ERROR_SUCCESS unmodified + break; + case 0xE0000000: + error_code = 0x80000000 | (FACILITY_SETUPAPI << 16) | (error_code & 0x0000FFFF); + break; + default: + break; + } + + size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + &err_string[len], ERR_BUFFER_SIZE - len, NULL); + if (size == 0) { + DWORD format_error = GetLastError(); + if (format_error) + snprintf(err_string, ERR_BUFFER_SIZE, + "Windows error code %u (FormatMessage error code %u)", + (unsigned int)error_code, (unsigned int)format_error); + else + snprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", (unsigned int)error_code); + } else { + // Remove CRLF from end of message, if present + size_t pos = len + size - 2; + if (err_string[pos] == '\r') + err_string[pos] = '\0'; + } + + return err_string; +} +#endif + +/* Hash table functions - modified From glibc 2.3.2: + [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 + [Knuth] The Art of Computer Programming, part 3 (6.4) */ + +#define HTAB_SIZE 1021UL // *MUST* be a prime number!! + +typedef struct htab_entry { + unsigned long used; + char *str; +} htab_entry; + +static htab_entry *htab_table = NULL; +static usbi_mutex_t htab_mutex = NULL; +static unsigned long htab_filled; + +/* Before using the hash table we must allocate memory for it. + We allocate one element more as the found prime number says. + This is done for more effective indexing as explained in the + comment for the hash function. */ +static bool htab_create(struct libusb_context *ctx) +{ + if (htab_table != NULL) { + usbi_err(ctx, "hash table already allocated"); + return true; + } + + // Create a mutex + usbi_mutex_init(&htab_mutex); + + usbi_dbg("using %lu entries hash table", HTAB_SIZE); + htab_filled = 0; + + // allocate memory and zero out. + htab_table = calloc(HTAB_SIZE + 1, sizeof(htab_entry)); + if (htab_table == NULL) { + usbi_err(ctx, "could not allocate space for hash table"); + return false; + } + + return true; +} + +/* After using the hash table it has to be destroyed. */ +static void htab_destroy(void) +{ + unsigned long i; + + if (htab_table == NULL) + return; + + for (i = 0; i < HTAB_SIZE; i++) + free(htab_table[i].str); + + safe_free(htab_table); + + usbi_mutex_destroy(&htab_mutex); +} + +/* This is the search function. It uses double hashing with open addressing. + We use a trick to speed up the lookup. The table is created with one + more element available. This enables us to use the index zero special. + This index will never be used because we store the first hash index in + the field used where zero means not used. Every other value means used. + The used field can be used as a first fast comparison for equality of + the stored and the parameter value. This helps to prevent unnecessary + expensive calls of strcmp. */ +unsigned long htab_hash(const char *str) +{ + unsigned long hval, hval2; + unsigned long idx; + unsigned long r = 5381; + int c; + const char *sz = str; + + if (str == NULL) + return 0; + + // Compute main hash value (algorithm suggested by Nokia) + while ((c = *sz++) != 0) + r = ((r << 5) + r) + c; + if (r == 0) + ++r; + + // compute table hash: simply take the modulus + hval = r % HTAB_SIZE; + if (hval == 0) + ++hval; + + // Try the first index + idx = hval; + + // Mutually exclusive access (R/W lock would be better) + usbi_mutex_lock(&htab_mutex); + + if (htab_table[idx].used) { + if ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0)) + goto out_unlock; // existing hash + + usbi_dbg("hash collision ('%s' vs '%s')", str, htab_table[idx].str); + + // Second hash function, as suggested in [Knuth] + hval2 = 1 + hval % (HTAB_SIZE - 2); + + do { + // Because size is prime this guarantees to step through all available indexes + if (idx <= hval2) + idx = HTAB_SIZE + idx - hval2; + else + idx -= hval2; + + // If we visited all entries leave the loop unsuccessfully + if (idx == hval) + break; + + // If entry is found use it. + if ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0)) + goto out_unlock; + } while (htab_table[idx].used); + } + + // Not found => New entry + + // If the table is full return an error + if (htab_filled >= HTAB_SIZE) { + usbi_err(NULL, "hash table is full (%lu entries)", HTAB_SIZE); + idx = 0; + goto out_unlock; + } + + htab_table[idx].str = _strdup(str); + if (htab_table[idx].str == NULL) { + usbi_err(NULL, "could not duplicate string for hash table"); + idx = 0; + goto out_unlock; + } + + htab_table[idx].used = hval; + ++htab_filled; + +out_unlock: + usbi_mutex_unlock(&htab_mutex); + + return idx; +} + +static int windows_init_dlls(void) +{ + DLL_GET_HANDLE(User32); + DLL_LOAD_FUNC_PREFIXED(User32, p, GetMessageA, TRUE); + DLL_LOAD_FUNC_PREFIXED(User32, p, PeekMessageA, TRUE); + DLL_LOAD_FUNC_PREFIXED(User32, p, PostThreadMessageA, TRUE); + + return LIBUSB_SUCCESS; +} + +static void windows_exit_dlls(void) +{ + DLL_FREE_HANDLE(User32); +} + +static bool windows_init_clock(struct libusb_context *ctx) +{ + DWORD_PTR affinity, dummy; + HANDLE event = NULL; + LARGE_INTEGER li_frequency; + int i; + + if (QueryPerformanceFrequency(&li_frequency)) { + // Load DLL imports + if (windows_init_dlls() != LIBUSB_SUCCESS) { + usbi_err(ctx, "could not resolve DLL functions"); + return false; + } + + // The hires frequency can go as high as 4 GHz, so we'll use a conversion + // to picoseconds to compute the tv_nsecs part in clock_gettime + hires_frequency = li_frequency.QuadPart; + hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; + usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); + + // Because QueryPerformanceCounter might report different values when + // running on different cores, we create a separate thread for the timer + // calls, which we glue to the first available core always to prevent timing discrepancies. + if (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy) || (affinity == 0)) { + usbi_err(ctx, "could not get process affinity: %s", windows_error_str(0)); + return false; + } + + // The process affinity mask is a bitmask where each set bit represents a core on + // which this process is allowed to run, so we find the first set bit + for (i = 0; !(affinity & (DWORD_PTR)(1 << i)); i++); + affinity = (DWORD_PTR)(1 << i); + + usbi_dbg("timer thread will run on core #%d", i); + + event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (event == NULL) { + usbi_err(ctx, "could not create event: %s", windows_error_str(0)); + return false; + } + + timer_thread = (HANDLE)_beginthreadex(NULL, 0, windows_clock_gettime_threaded, (void *)event, + 0, (unsigned int *)&timer_thread_id); + if (timer_thread == NULL) { + usbi_err(ctx, "unable to create timer thread - aborting"); + CloseHandle(event); + return false; + } + + if (!SetThreadAffinityMask(timer_thread, affinity)) + usbi_warn(ctx, "unable to set timer thread affinity, timer discrepancies may arise"); + + // Wait for timer thread to init before continuing. + if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) { + usbi_err(ctx, "failed to wait for timer thread to become ready - aborting"); + CloseHandle(event); + return false; + } + + CloseHandle(event); + } else { + usbi_dbg("no hires timer available on this platform"); + hires_frequency = 0; + hires_ticks_to_ps = UINT64_C(0); + } + + return true; +} + +void windows_destroy_clock(void) +{ + if (timer_thread) { + // actually the signal to quit the thread. + if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) + || (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { + usbi_dbg("could not wait for timer thread to quit"); + TerminateThread(timer_thread, 1); + // shouldn't happen, but we're destroying + // all objects it might have held anyway. + } + CloseHandle(timer_thread); + timer_thread = NULL; + timer_thread_id = 0; + } +} + +/* +* Monotonic and real time functions +*/ +static unsigned __stdcall windows_clock_gettime_threaded(void *param) +{ + struct timer_request *request; + LARGE_INTEGER hires_counter; + MSG msg; + + // The following call will create this thread's message queue + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx + pPeekMessageA(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); + + // Signal windows_init_clock() that we're ready to service requests + if (!SetEvent((HANDLE)param)) + usbi_dbg("SetEvent failed for timer init event: %s", windows_error_str(0)); + param = NULL; + + // Main loop - wait for requests + while (1) { + if (pGetMessageA(&msg, NULL, WM_TIMER_REQUEST, WM_TIMER_EXIT) == -1) { + usbi_err(NULL, "GetMessage failed for timer thread: %s", windows_error_str(0)); + return 1; + } + + switch (msg.message) { + case WM_TIMER_REQUEST: + // Requests to this thread are for hires always + // Microsoft says that this function always succeeds on XP and later + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904.aspx + request = (struct timer_request *)msg.lParam; + QueryPerformanceCounter(&hires_counter); + request->tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); + request->tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps); + if (!SetEvent(request->event)) + usbi_err(NULL, "SetEvent failed for timer request: %s", windows_error_str(0)); + break; + case WM_TIMER_EXIT: + usbi_dbg("timer thread quitting"); + return 0; + } + } +} + +int windows_clock_gettime(int clk_id, struct timespec *tp) +{ + struct timer_request request; +#if !defined(_MSC_VER) || (_MSC_VER < 1900) + FILETIME filetime; + ULARGE_INTEGER rtime; +#endif + DWORD r; + + switch (clk_id) { + case USBI_CLOCK_MONOTONIC: + if (timer_thread) { + request.tp = tp; + request.event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (request.event == NULL) + return LIBUSB_ERROR_NO_MEM; + + if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_REQUEST, 0, (LPARAM)&request)) { + usbi_err(NULL, "PostThreadMessage failed for timer thread: %s", windows_error_str(0)); + CloseHandle(request.event); + return LIBUSB_ERROR_OTHER; + } + + do { + r = WaitForSingleObject(request.event, TIMER_REQUEST_RETRY_MS); + if (r == WAIT_TIMEOUT) + usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); + else if (r == WAIT_FAILED) + usbi_err(NULL, "WaitForSingleObject failed: %s", windows_error_str(0)); + } while (r == WAIT_TIMEOUT); + CloseHandle(request.event); + + if (r == WAIT_OBJECT_0) + return LIBUSB_SUCCESS; + else + return LIBUSB_ERROR_OTHER; + } + // Fall through and return real-time if monotonic was not detected @ timer init + case USBI_CLOCK_REALTIME: +#if defined(_MSC_VER) && (_MSC_VER >= 1900) + timespec_get(tp, TIME_UTC); +#else + // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx + // with a predef epoch time to have an epoch that starts at 1970.01.01 00:00 + // Note however that our resolution is bounded by the Windows system time + // functions and is at best of the order of 1 ms (or, usually, worse) + GetSystemTimeAsFileTime(&filetime); + rtime.LowPart = filetime.dwLowDateTime; + rtime.HighPart = filetime.dwHighDateTime; + rtime.QuadPart -= EPOCH_TIME; + tp->tv_sec = (long)(rtime.QuadPart / 10000000); + tp->tv_nsec = (long)((rtime.QuadPart % 10000000) * 100); +#endif + return LIBUSB_SUCCESS; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static void windows_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + int status, istatus; + + usbi_dbg("handling I/O completion with errcode %u, size %u", io_result, io_size); + + switch (io_result) { + case NO_ERROR: + status = windows_copy_transfer_data(itransfer, io_size); + break; + case ERROR_GEN_FAILURE: + usbi_dbg("detected endpoint stall"); + status = LIBUSB_TRANSFER_STALL; + break; + case ERROR_SEM_TIMEOUT: + usbi_dbg("detected semaphore timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + break; + case ERROR_OPERATION_ABORTED: + istatus = windows_copy_transfer_data(itransfer, io_size); + if (istatus != LIBUSB_TRANSFER_COMPLETED) + usbi_dbg("Failed to copy partial data in aborted operation: %d", istatus); + + usbi_dbg("detected operation aborted"); + status = LIBUSB_TRANSFER_CANCELLED; + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error %u: %s", io_result, windows_error_str(io_result)); + status = LIBUSB_TRANSFER_ERROR; + break; + } + windows_clear_transfer_priv(itransfer); // Cancel polling + if (status == LIBUSB_TRANSFER_CANCELLED) + usbi_handle_transfer_cancellation(itransfer); + else + usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); +} + +void windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + windows_transfer_callback(itransfer, io_result, io_size); + break; + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + usbi_warn(ITRANSFER_CTX(itransfer), "bulk stream transfers are not yet supported on this platform"); + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + } +} + +int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + POLL_NFDS_TYPE i; + bool found = false; + struct usbi_transfer *transfer; + struct winfd *pollable_fd = NULL; + DWORD io_size, io_result; + int r = LIBUSB_SUCCESS; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + + usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); + + if (!fds[i].revents) + continue; + + num_ready--; + + // Because a Windows OVERLAPPED is used for poll emulation, + // a pollable fd is created and stored with each transfer + usbi_mutex_lock(&ctx->flying_transfers_lock); + found = false; + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + pollable_fd = windows_get_fd(transfer); + if (pollable_fd->fd == fds[i].fd) { + found = true; + break; + } + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (found) { + windows_get_overlapped_result(transfer, pollable_fd, &io_result, &io_size); + + usbi_remove_pollfd(ctx, pollable_fd->fd); + // let handle_callback free the event using the transfer wfd + // If you don't use the transfer wfd, you run a risk of trying to free a + // newly allocated wfd that took the place of the one from the transfer. + windows_handle_callback(transfer, io_result, io_size); + } else { + usbi_err(ctx, "could not find a matching transfer for fd %d", fds[i]); + r = LIBUSB_ERROR_NOT_FOUND; + break; + } + } + usbi_mutex_unlock(&ctx->open_devs_lock); + + return r; +} + +int windows_common_init(struct libusb_context *ctx) +{ + if (!windows_init_clock(ctx)) + goto error_roll_back; + + if (!htab_create(ctx)) + goto error_roll_back; + + return LIBUSB_SUCCESS; + +error_roll_back: + windows_common_exit(); + return LIBUSB_ERROR_NO_MEM; +} + +void windows_common_exit(void) +{ + htab_destroy(); + windows_destroy_clock(); + windows_exit_dlls(); +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_nt_common.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_nt_common.h new file mode 100644 index 00000000..52ea8708 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_nt_common.h @@ -0,0 +1,63 @@ +/* + * Windows backend common header for libusb 1.0 + * + * This file brings together header code common between + * the desktop Windows backends. + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +// Missing from MinGW +#if !defined(FACILITY_SETUPAPI) +#define FACILITY_SETUPAPI 15 +#endif + +typedef struct USB_CONFIGURATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT wTotalLength; + UCHAR bNumInterfaces; + UCHAR bConfigurationValue; + UCHAR iConfiguration; + UCHAR bmAttributes; + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; + +typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; + +int windows_common_init(struct libusb_context *ctx); +void windows_common_exit(void); + +unsigned long htab_hash(const char *str); +int windows_clock_gettime(int clk_id, struct timespec *tp); + +void windows_clear_transfer_priv(struct usbi_transfer *itransfer); +int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size); +struct winfd *windows_get_fd(struct usbi_transfer *transfer); +void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size); + +void windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size); +int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready); + +#if defined(ENABLE_LOGGING) +const char *windows_error_str(DWORD error_code); +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_winusb.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_winusb.c new file mode 100644 index 00000000..09566d5c --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_winusb.c @@ -0,0 +1,3241 @@ +/* + * windows backend for libusb 1.0 + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software + * Hash table functions adapted from glibc, by Ulrich Drepper et al. + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#if !defined(USE_USBDK) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libusbi.h" +#include "poll_windows.h" +#include "windows_winusb.h" + +#define HANDLE_VALID(h) (((h) != 0) && ((h) != INVALID_HANDLE_VALUE)) + +// The 2 macros below are used in conjunction with safe loops. +#define LOOP_CHECK(fcall) \ + { \ + r = fcall; \ + if (r != LIBUSB_SUCCESS) \ + continue; \ + } +#define LOOP_BREAK(err) \ + { \ + r = err; \ + continue; \ + } + +// WinUSB-like API prototypes +static int winusbx_init(int sub_api, struct libusb_context *ctx); +static int winusbx_exit(int sub_api); +static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle); +static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle); +static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); +static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); +static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer); +static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle); +static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); +// Composite API prototypes +static int composite_init(int sub_api, struct libusb_context *ctx); +static int composite_exit(int sub_api); +static int composite_open(int sub_api, struct libusb_device_handle *dev_handle); +static void composite_close(int sub_api, struct libusb_device_handle *dev_handle); +static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); +static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); +static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); +static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); +static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer); +static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); +static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer); +static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer); +static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle); +static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); + +#if defined(interface) +#undef interface +#endif + +// Global variables +int windows_version = WINDOWS_UNDEFINED; +static char windows_version_str[128] = "Undefined"; +// Concurrency +static int concurrent_usage = -1; +static usbi_mutex_t autoclaim_lock; +// API globals +#define CHECK_WINUSBX_AVAILABLE(sub_api) \ + do { \ + if (sub_api == SUB_API_NOTSET) \ + sub_api = priv->sub_api; \ + if (!WinUSBX[sub_api].initialized) \ + return LIBUSB_ERROR_ACCESS; \ + } while(0) + +static HMODULE WinUSBX_handle = NULL; +static struct winusb_interface WinUSBX[SUB_API_MAX]; +static const char *sub_api_name[SUB_API_MAX] = WINUSBX_DRV_NAMES; + +static bool api_hid_available = false; + +static inline BOOLEAN guid_eq(const GUID *guid1, const GUID *guid2) +{ + if ((guid1 != NULL) && (guid2 != NULL)) + return (memcmp(guid1, guid2, sizeof(GUID)) == 0); + + return false; +} + +#if defined(ENABLE_LOGGING) +static char *guid_to_string(const GUID *guid) +{ + static char guid_string[MAX_GUID_STRING_LENGTH]; + + if (guid == NULL) + return NULL; + + sprintf(guid_string, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + (unsigned int)guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); + + return guid_string; +} +#endif + +/* + * Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes. + * Return an allocated sanitized string or NULL on error. + */ +static char *sanitize_path(const char *path) +{ + const char root_prefix[] = { '\\', '\\', '.', '\\' }; + size_t j, size; + char *ret_path; + size_t add_root = 0; + + if (path == NULL) + return NULL; + + size = strlen(path) + 1; + + // Microsoft indiscriminately uses '\\?\', '\\.\', '##?#" or "##.#" for root prefixes. + if (!((size > 3) && (((path[0] == '\\') && (path[1] == '\\') && (path[3] == '\\')) + || ((path[0] == '#') && (path[1] == '#') && (path[3] == '#'))))) { + add_root = sizeof(root_prefix); + size += add_root; + } + + ret_path = malloc(size); + if (ret_path == NULL) + return NULL; + + strcpy(&ret_path[add_root], path); + + // Ensure consistency with root prefix + memcpy(ret_path, root_prefix, sizeof(root_prefix)); + + // Same goes for '\' and '#' after the root prefix. Ensure '#' is used + for (j = sizeof(root_prefix); j < size; j++) { + ret_path[j] = (char)toupper((int)ret_path[j]); // Fix case too + if (ret_path[j] == '\\') + ret_path[j] = '#'; + } + + return ret_path; +} + +/* + * Cfgmgr32, OLE32 and SetupAPI DLL functions + */ +static int init_dlls(void) +{ + DLL_GET_HANDLE(Cfgmgr32); + DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Parent, TRUE); + DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Child, TRUE); + DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Sibling, TRUE); + DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Device_IDA, TRUE); + + // Prefixed to avoid conflict with header files + DLL_GET_HANDLE(AdvAPI32); + DLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegQueryValueExW, TRUE); + DLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegCloseKey, TRUE); + + DLL_GET_HANDLE(Kernel32); + DLL_LOAD_FUNC_PREFIXED(Kernel32, p, IsWow64Process, FALSE); + + DLL_GET_HANDLE(OLE32); + DLL_LOAD_FUNC_PREFIXED(OLE32, p, CLSIDFromString, TRUE); + + DLL_GET_HANDLE(SetupAPI); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetClassDevsA, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInfo, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInterfaces, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceInterfaceDetailA, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiDestroyDeviceInfoList, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDevRegKey, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceRegistryPropertyA, TRUE); + DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDeviceInterfaceRegKey, TRUE); + + return LIBUSB_SUCCESS; +} + +static void exit_dlls(void) +{ + DLL_FREE_HANDLE(Cfgmgr32); + DLL_FREE_HANDLE(AdvAPI32); + DLL_FREE_HANDLE(Kernel32); + DLL_FREE_HANDLE(OLE32); + DLL_FREE_HANDLE(SetupAPI); +} + +/* + * enumerate interfaces for the whole USB class + * + * Parameters: + * dev_info: a pointer to a dev_info list + * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) + * usb_class: the generic USB class for which to retrieve interface details + * index: zero based index of the interface in the device info list + * + * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA + * structure returned and call this function repeatedly using the same guid (with an + * incremented index starting at zero) until all interfaces have been returned. + */ +static bool get_devinfo_data(struct libusb_context *ctx, + HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const char *usb_class, unsigned _index) +{ + if (_index <= 0) { + *dev_info = pSetupDiGetClassDevsA(NULL, usb_class, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); + if (*dev_info == INVALID_HANDLE_VALUE) + return false; + } + + dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) + usbi_err(ctx, "Could not obtain device info data for index %u: %s", + _index, windows_error_str(0)); + + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return false; + } + return true; +} + +/* + * enumerate interfaces for a specific GUID + * + * Parameters: + * dev_info: a pointer to a dev_info list + * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) + * guid: the GUID for which to retrieve interface details + * index: zero based index of the interface in the device info list + * + * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA + * structure returned and call this function repeatedly using the same guid (with an + * incremented index starting at zero) until all interfaces have been returned. + */ +static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details(struct libusb_context *ctx, + HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID *guid, unsigned _index) +{ + SP_DEVICE_INTERFACE_DATA dev_interface_data; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details; + DWORD size; + + if (_index <= 0) + *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); + + if (dev_info_data != NULL) { + dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) + usbi_err(ctx, "Could not obtain device info data for index %u: %s", + _index, windows_error_str(0)); + + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + } + + dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) + usbi_err(ctx, "Could not obtain interface data for index %u: %s", + _index, windows_error_str(0)); + + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + + // Read interface data (dummy + actual) to access the device path + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { + // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", + _index, windows_error_str(0)); + goto err_exit; + } + } else { + usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); + goto err_exit; + } + + dev_interface_details = calloc(1, size); + if (dev_interface_details == NULL) { + usbi_err(ctx, "could not allocate interface data for index %u.", _index); + goto err_exit; + } + + dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, + dev_interface_details, size, &size, NULL)) { + usbi_err(ctx, "could not access interface data (actual) for index %u: %s", + _index, windows_error_str(0)); + } + + return dev_interface_details; + +err_exit: + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; +} + +/* For libusb0 filter */ +static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details_filter(struct libusb_context *ctx, + HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID *guid, unsigned _index, char *filter_path) +{ + SP_DEVICE_INTERFACE_DATA dev_interface_data; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details; + DWORD size; + + if (_index <= 0) + *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); + + if (dev_info_data != NULL) { + dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); + if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) + usbi_err(ctx, "Could not obtain device info data for index %u: %s", + _index, windows_error_str(0)); + + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + } + + dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { + if (GetLastError() != ERROR_NO_MORE_ITEMS) + usbi_err(ctx, "Could not obtain interface data for index %u: %s", + _index, windows_error_str(0)); + + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; + } + + // Read interface data (dummy + actual) to access the device path + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { + // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", + _index, windows_error_str(0)); + goto err_exit; + } + } else { + usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); + goto err_exit; + } + + dev_interface_details = calloc(1, size); + if (dev_interface_details == NULL) { + usbi_err(ctx, "could not allocate interface data for index %u.", _index); + goto err_exit; + } + + dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, dev_interface_details, size, &size, NULL)) + usbi_err(ctx, "could not access interface data (actual) for index %u: %s", + _index, windows_error_str(0)); + + // [trobinso] lookup the libusb0 symbolic index. + if (dev_interface_details) { + HKEY hkey_device_interface = pSetupDiOpenDeviceInterfaceRegKey(*dev_info, &dev_interface_data, 0, KEY_READ); + if (hkey_device_interface != INVALID_HANDLE_VALUE) { + DWORD libusb0_symboliclink_index = 0; + DWORD value_length = sizeof(DWORD); + DWORD value_type = 0; + LONG status; + + status = pRegQueryValueExW(hkey_device_interface, L"LUsb0", NULL, &value_type, + (LPBYTE)&libusb0_symboliclink_index, &value_length); + if (status == ERROR_SUCCESS) { + if (libusb0_symboliclink_index < 256) { + // libusb0.sys is connected to this device instance. + // If the the device interface guid is {F9F3FF14-AE21-48A0-8A25-8011A7A931D9} then it's a filter. + sprintf(filter_path, "\\\\.\\libusb0-%04u", (unsigned int)libusb0_symboliclink_index); + usbi_dbg("assigned libusb0 symbolic link %s", filter_path); + } else { + // libusb0.sys was connected to this device instance at one time; but not anymore. + } + } + pRegCloseKey(hkey_device_interface); + } + } + + return dev_interface_details; + +err_exit: + pSetupDiDestroyDeviceInfoList(*dev_info); + *dev_info = INVALID_HANDLE_VALUE; + return NULL; +} + +/* + * Returns the session ID of a device's nth level ancestor + * If there's no device at the nth level, return 0 + */ +static unsigned long get_ancestor_session_id(DWORD devinst, unsigned level) +{ + DWORD parent_devinst; + unsigned long session_id; + char *sanitized_path; + char path[MAX_PATH_LENGTH]; + unsigned i; + + if (level < 1) + return 0; + + for (i = 0; i < level; i++) { + if (CM_Get_Parent(&parent_devinst, devinst, 0) != CR_SUCCESS) + return 0; + devinst = parent_devinst; + } + + if (CM_Get_Device_IDA(devinst, path, MAX_PATH_LENGTH, 0) != CR_SUCCESS) + return 0; + + // TODO: (post hotplug): try without sanitizing + sanitized_path = sanitize_path(path); + if (sanitized_path == NULL) + return 0; + + session_id = htab_hash(sanitized_path); + free(sanitized_path); + return session_id; +} + +/* + * Determine which interface the given endpoint address belongs to + */ +static int get_interface_by_endpoint(struct libusb_config_descriptor *conf_desc, uint8_t ep) +{ + const struct libusb_interface *intf; + const struct libusb_interface_descriptor *intf_desc; + int i, j, k; + + for (i = 0; i < conf_desc->bNumInterfaces; i++) { + intf = &conf_desc->interface[i]; + for (j = 0; j < intf->num_altsetting; j++) { + intf_desc = &intf->altsetting[j]; + for (k = 0; k < intf_desc->bNumEndpoints; k++) { + if (intf_desc->endpoint[k].bEndpointAddress == ep) { + usbi_dbg("found endpoint %02X on interface %d", intf_desc->bInterfaceNumber, i); + return intf_desc->bInterfaceNumber; + } + } + } + } + + usbi_dbg("endpoint %02X not found on any interface", ep); + return LIBUSB_ERROR_NOT_FOUND; +} + +/* + * Populate the endpoints addresses of the device_priv interface helper structs + */ +static int windows_assign_endpoints(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + int i, r; + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct libusb_config_descriptor *conf_desc; + const struct libusb_interface_descriptor *if_desc; + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + + r = libusb_get_active_config_descriptor(dev_handle->dev, &conf_desc); + if (r != LIBUSB_SUCCESS) { + usbi_warn(ctx, "could not read config descriptor: error %d", r); + return r; + } + + if_desc = &conf_desc->interface[iface].altsetting[altsetting]; + safe_free(priv->usb_interface[iface].endpoint); + + if (if_desc->bNumEndpoints == 0) { + usbi_dbg("no endpoints found for interface %d", iface); + libusb_free_config_descriptor(conf_desc); + return LIBUSB_SUCCESS; + } + + priv->usb_interface[iface].endpoint = malloc(if_desc->bNumEndpoints); + if (priv->usb_interface[iface].endpoint == NULL) { + libusb_free_config_descriptor(conf_desc); + return LIBUSB_ERROR_NO_MEM; + } + + priv->usb_interface[iface].nb_endpoints = if_desc->bNumEndpoints; + for (i = 0; i < if_desc->bNumEndpoints; i++) { + priv->usb_interface[iface].endpoint[i] = if_desc->endpoint[i].bEndpointAddress; + usbi_dbg("(re)assigned endpoint %02X to interface %d", priv->usb_interface[iface].endpoint[i], iface); + } + libusb_free_config_descriptor(conf_desc); + + // Extra init may be required to configure endpoints + return priv->apib->configure_endpoints(SUB_API_NOTSET, dev_handle, iface); +} + +// Lookup for a match in the list of API driver names +// return -1 if not found, driver match number otherwise +static int get_sub_api(char *driver, int api) +{ + int i; + const char sep_str[2] = {LIST_SEPARATOR, 0}; + char *tok, *tmp_str; + size_t len = strlen(driver); + + if (len == 0) + return SUB_API_NOTSET; + + tmp_str = _strdup(driver); + if (tmp_str == NULL) + return SUB_API_NOTSET; + + tok = strtok(tmp_str, sep_str); + while (tok != NULL) { + for (i = 0; i < usb_api_backend[api].nb_driver_names; i++) { + if (_stricmp(tok, usb_api_backend[api].driver_name_list[i]) == 0) { + free(tmp_str); + return i; + } + } + tok = strtok(NULL, sep_str); + } + + free(tmp_str); + return SUB_API_NOTSET; +} + +/* + * auto-claiming and auto-release helper functions + */ +static int auto_claim(struct libusb_transfer *transfer, int *interface_number, int api_type) +{ + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv( + transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface = *interface_number; + int r = LIBUSB_SUCCESS; + + switch(api_type) { + case USB_API_WINUSBX: + break; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } + + usbi_mutex_lock(&autoclaim_lock); + if (current_interface < 0) { // No serviceable interface was found + for (current_interface = 0; current_interface < USB_MAXINTERFACES; current_interface++) { + // Must claim an interface of the same API type + if ((priv->usb_interface[current_interface].apib->id == api_type) + && (libusb_claim_interface(transfer->dev_handle, current_interface) == LIBUSB_SUCCESS)) { + usbi_dbg("auto-claimed interface %d for control request", current_interface); + if (handle_priv->autoclaim_count[current_interface] != 0) + usbi_warn(ctx, "program assertion failed - autoclaim_count was nonzero"); + handle_priv->autoclaim_count[current_interface]++; + break; + } + } + if (current_interface == USB_MAXINTERFACES) { + usbi_err(ctx, "could not auto-claim any interface"); + r = LIBUSB_ERROR_NOT_FOUND; + } + } else { + // If we have a valid interface that was autoclaimed, we must increment + // its autoclaim count so that we can prevent an early release. + if (handle_priv->autoclaim_count[current_interface] != 0) + handle_priv->autoclaim_count[current_interface]++; + } + usbi_mutex_unlock(&autoclaim_lock); + + *interface_number = current_interface; + return r; +} + +static void auto_release(struct usbi_transfer *itransfer) +{ + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + libusb_device_handle *dev_handle = transfer->dev_handle; + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + int r; + + usbi_mutex_lock(&autoclaim_lock); + if (handle_priv->autoclaim_count[transfer_priv->interface_number] > 0) { + handle_priv->autoclaim_count[transfer_priv->interface_number]--; + if (handle_priv->autoclaim_count[transfer_priv->interface_number] == 0) { + r = libusb_release_interface(dev_handle, transfer_priv->interface_number); + if (r == LIBUSB_SUCCESS) + usbi_dbg("auto-released interface %d", transfer_priv->interface_number); + else + usbi_dbg("failed to auto-release interface %d (%s)", + transfer_priv->interface_number, libusb_error_name((enum libusb_error)r)); + } + } + usbi_mutex_unlock(&autoclaim_lock); +} + +/* Windows version dtection */ +static BOOL is_x64(void) +{ + BOOL ret = FALSE; + + // Detect if we're running a 32 or 64 bit system + if (sizeof(uintptr_t) < 8) { + if (pIsWow64Process != NULL) + pIsWow64Process(GetCurrentProcess(), &ret); + } else { + ret = TRUE; + } + + return ret; +} + +static void get_windows_version(void) +{ + OSVERSIONINFOEXA vi, vi2; + const char *arch, *w = NULL; + unsigned major, minor; + ULONGLONG major_equal, minor_equal; + BOOL ws; + + memset(&vi, 0, sizeof(vi)); + vi.dwOSVersionInfoSize = sizeof(vi); + if (!GetVersionExA((OSVERSIONINFOA *)&vi)) { + memset(&vi, 0, sizeof(vi)); + vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + if (!GetVersionExA((OSVERSIONINFOA *)&vi)) + return; + } + + if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) { + if (vi.dwMajorVersion > 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion >= 2)) { + // Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the actual OS version + // See: http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx + + major_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); + for (major = vi.dwMajorVersion; major <= 9; major++) { + memset(&vi2, 0, sizeof(vi2)); + vi2.dwOSVersionInfoSize = sizeof(vi2); + vi2.dwMajorVersion = major; + if (!VerifyVersionInfoA(&vi2, VER_MAJORVERSION, major_equal)) + continue; + + if (vi.dwMajorVersion < major) { + vi.dwMajorVersion = major; + vi.dwMinorVersion = 0; + } + + minor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL); + for (minor = vi.dwMinorVersion; minor <= 9; minor++) { + memset(&vi2, 0, sizeof(vi2)); + vi2.dwOSVersionInfoSize = sizeof(vi2); + vi2.dwMinorVersion = minor; + if (!VerifyVersionInfoA(&vi2, VER_MINORVERSION, minor_equal)) + continue; + + vi.dwMinorVersion = minor; + break; + } + + break; + } + } + + if (vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) { + ws = (vi.wProductType <= VER_NT_WORKSTATION); + windows_version = vi.dwMajorVersion << 4 | vi.dwMinorVersion; + switch (windows_version) { + case 0x50: w = "2000"; break; + case 0x51: w = "XP"; break; + case 0x52: w = "2003"; break; + case 0x60: w = (ws ? "Vista" : "2008"); break; + case 0x61: w = (ws ? "7" : "2008_R2"); break; + case 0x62: w = (ws ? "8" : "2012"); break; + case 0x63: w = (ws ? "8.1" : "2012_R2"); break; + case 0x64: w = (ws ? "10" : "2015"); break; + default: + if (windows_version < 0x50) + windows_version = WINDOWS_UNSUPPORTED; + else + w = "11 or later"; + break; + } + } + } + + arch = is_x64() ? "64-bit" : "32-bit"; + + if (w == NULL) + snprintf(windows_version_str, sizeof(windows_version_str), "%s %u.%u %s", + (vi.dwPlatformId == VER_PLATFORM_WIN32_NT ? "NT" : "??"), + (unsigned int)vi.dwMajorVersion, (unsigned int)vi.dwMinorVersion, arch); + else if (vi.wServicePackMinor) + snprintf(windows_version_str, sizeof(windows_version_str), "%s SP%u.%u %s", + w, vi.wServicePackMajor, vi.wServicePackMinor, arch); + else if (vi.wServicePackMajor) + snprintf(windows_version_str, sizeof(windows_version_str), "%s SP%u %s", + w, vi.wServicePackMajor, arch); + else + snprintf(windows_version_str, sizeof(windows_version_str), "%s %s", + w, arch); +} + +/* + * init: libusb backend init function + * + * This function enumerates the HCDs (Host Controller Drivers) and populates our private HCD list + * In our implementation, we equate Windows' "HCD" to libusb's "bus". Note that bus is zero indexed. + * HCDs are not expected to change after init (might not hold true for hot pluggable USB PCI card?) + */ +static int windows_init(struct libusb_context *ctx) +{ + int i, r = LIBUSB_ERROR_OTHER; + HANDLE semaphore; + char sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' + + sprintf(sem_name, "libusb_init%08X", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); + semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); + if (semaphore == NULL) { + usbi_err(ctx, "could not create semaphore: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_MEM; + } + + // A successful wait brings our semaphore count to 0 (unsignaled) + // => any concurent wait stalls until the semaphore's release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + usbi_err(ctx, "failure to access semaphore: %s", windows_error_str(0)); + CloseHandle(semaphore); + return LIBUSB_ERROR_NO_MEM; + } + + // NB: concurrent usage supposes that init calls are equally balanced with + // exit calls. If init is called more than exit, we will not exit properly + if (++concurrent_usage == 0) { // First init? + get_windows_version(); + usbi_dbg("Windows %s", windows_version_str); + + if (windows_version == WINDOWS_UNSUPPORTED) { + usbi_err(ctx, "This version of Windows is NOT supported"); + r = LIBUSB_ERROR_NOT_SUPPORTED; + goto init_exit; + } + + // We need a lock for proper auto-release + usbi_mutex_init(&autoclaim_lock); + + // Initialize pollable file descriptors + init_polling(); + + // Load DLL imports + if (init_dlls() != LIBUSB_SUCCESS) { + usbi_err(ctx, "could not resolve DLL functions"); + goto init_exit; + } + + // Initialize the low level APIs (we don't care about errors at this stage) + for (i = 0; i < USB_API_MAX; i++) + usb_api_backend[i].init(SUB_API_NOTSET, ctx); + + r = windows_common_init(ctx); + if (r) + goto init_exit; + } + // At this stage, either we went through full init successfully, or didn't need to + r = LIBUSB_SUCCESS; + +init_exit: // Holds semaphore here. + if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? + for (i = 0; i < USB_API_MAX; i++) + usb_api_backend[i].exit(SUB_API_NOTSET); + exit_dlls(); + exit_polling(); + windows_common_exit(); + usbi_mutex_destroy(&autoclaim_lock); + } + + if (r != LIBUSB_SUCCESS) + --concurrent_usage; // Not expected to call libusb_exit if we failed. + + ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 + CloseHandle(semaphore); + return r; +} + +/* + * HCD (root) hubs need to have their device descriptor manually populated + * + * Note that, like Microsoft does in the device manager, we populate the + * Vendor and Device ID for HCD hubs with the ones from the PCI HCD device. + */ +static int force_hcd_device_descriptor(struct libusb_device *dev) +{ + struct windows_device_priv *parent_priv, *priv = _device_priv(dev); + struct libusb_context *ctx = DEVICE_CTX(dev); + int vid, pid; + + dev->num_configurations = 1; + priv->dev_descriptor.bLength = sizeof(USB_DEVICE_DESCRIPTOR); + priv->dev_descriptor.bDescriptorType = USB_DEVICE_DESCRIPTOR_TYPE; + priv->dev_descriptor.bNumConfigurations = 1; + priv->active_config = 1; + + if (dev->parent_dev == NULL) { + usbi_err(ctx, "program assertion failed - HCD hub has no parent"); + return LIBUSB_ERROR_NO_DEVICE; + } + + parent_priv = _device_priv(dev->parent_dev); + if (sscanf(parent_priv->path, "\\\\.\\PCI#VEN_%04x&DEV_%04x%*s", &vid, &pid) == 2) { + priv->dev_descriptor.idVendor = (uint16_t)vid; + priv->dev_descriptor.idProduct = (uint16_t)pid; + } else { + usbi_warn(ctx, "could not infer VID/PID of HCD hub from '%s'", parent_priv->path); + priv->dev_descriptor.idVendor = 0x1d6b; // Linux Foundation root hub + priv->dev_descriptor.idProduct = 1; + } + + return LIBUSB_SUCCESS; +} + +/* + * fetch and cache all the config descriptors through I/O + */ +static void cache_config_descriptors(struct libusb_device *dev, HANDLE hub_handle, char *device_id) +{ + DWORD size, ret_size; + struct libusb_context *ctx = DEVICE_CTX(dev); + struct windows_device_priv *priv = _device_priv(dev); + uint8_t i; + + USB_CONFIGURATION_DESCRIPTOR_SHORT cd_buf_short; // dummy request + PUSB_DESCRIPTOR_REQUEST cd_buf_actual = NULL; // actual request + PUSB_CONFIGURATION_DESCRIPTOR cd_data = NULL; + + if (dev->num_configurations == 0) + return; + + priv->config_descriptor = calloc(dev->num_configurations, sizeof(unsigned char *)); + if (priv->config_descriptor == NULL) { + usbi_err(ctx, "could not allocate configuration descriptor array for '%s'", device_id); + } + + for (i = 0; i < dev->num_configurations; i++) + priv->config_descriptor[i] = NULL; + + for (i = 0; i <= dev->num_configurations; i++) { + safe_free(cd_buf_actual); + + if (i == dev->num_configurations) + break; + + size = sizeof(USB_CONFIGURATION_DESCRIPTOR_SHORT); + memset(&cd_buf_short, 0, size); + + cd_buf_short.req.ConnectionIndex = (ULONG)priv->port; + cd_buf_short.req.SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; + cd_buf_short.req.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; + cd_buf_short.req.SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; + cd_buf_short.req.SetupPacket.wIndex = 0; + cd_buf_short.req.SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); + + // Dummy call to get the required data size. Initial failures are reported as info rather + // than error as they can occur for non-penalizing situations, such as with some hubs. + // coverity[tainted_data_argument] + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, &cd_buf_short, size, + &cd_buf_short, size, &ret_size, NULL)) { + usbi_info(ctx, "could not access configuration descriptor %u (dummy) for '%s': %s", i, device_id, windows_error_str(0)); + continue; + } + + if ((ret_size != size) || (cd_buf_short.data.wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))) { + usbi_info(ctx, "unexpected configuration descriptor %u size (dummy) for '%s'.", i, device_id); + continue; + } + + size = sizeof(USB_DESCRIPTOR_REQUEST) + cd_buf_short.data.wTotalLength; + cd_buf_actual = calloc(1, size); + if (cd_buf_actual == NULL) { + usbi_err(ctx, "could not allocate configuration descriptor %u buffer for '%s'.", i, device_id); + continue; + } + + // Actual call + cd_buf_actual->ConnectionIndex = (ULONG)priv->port; + cd_buf_actual->SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; + cd_buf_actual->SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; + cd_buf_actual->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; + cd_buf_actual->SetupPacket.wIndex = 0; + cd_buf_actual->SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); + + if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, cd_buf_actual, size, + cd_buf_actual, size, &ret_size, NULL)) { + usbi_err(ctx, "could not access configuration descriptor %u (actual) for '%s': %s", i, device_id, windows_error_str(0)); + continue; + } + + cd_data = (PUSB_CONFIGURATION_DESCRIPTOR)((UCHAR *)cd_buf_actual + sizeof(USB_DESCRIPTOR_REQUEST)); + + if ((size != ret_size) || (cd_data->wTotalLength != cd_buf_short.data.wTotalLength)) { + usbi_err(ctx, "unexpected configuration descriptor %u size (actual) for '%s'.", i, device_id); + continue; + } + + if (cd_data->bDescriptorType != USB_CONFIGURATION_DESCRIPTOR_TYPE) { + usbi_err(ctx, "not a configuration descriptor %u for '%s'", i, device_id); + continue; + } + + usbi_dbg("cached config descriptor %u (bConfigurationValue=%u, %u bytes)", + i, cd_data->bConfigurationValue, cd_data->wTotalLength); + + // Cache the descriptor + priv->config_descriptor[i] = malloc(cd_data->wTotalLength); + if (priv->config_descriptor[i] != NULL) { + memcpy(priv->config_descriptor[i], cd_data, cd_data->wTotalLength); + } else { + usbi_err(ctx, "could not allocate configuration descriptor %u buffer for '%s'", i, device_id); + } + } +} + +/* + * Populate a libusb device structure + */ +static int init_device(struct libusb_device *dev, struct libusb_device *parent_dev, + uint8_t port_number, char *device_id, DWORD devinst) +{ + HANDLE handle; + DWORD size; + USB_NODE_CONNECTION_INFORMATION_EX conn_info; + USB_NODE_CONNECTION_INFORMATION_EX_V2 conn_info_v2; + struct windows_device_priv *priv, *parent_priv; + struct libusb_context *ctx; + struct libusb_device *tmp_dev; + unsigned long tmp_id; + unsigned i; + + if ((dev == NULL) || (parent_dev == NULL)) + return LIBUSB_ERROR_NOT_FOUND; + + ctx = DEVICE_CTX(dev); + priv = _device_priv(dev); + parent_priv = _device_priv(parent_dev); + if (parent_priv->apib->id != USB_API_HUB) { + usbi_warn(ctx, "parent for device '%s' is not a hub", device_id); + return LIBUSB_ERROR_NOT_FOUND; + } + + // It is possible for the parent hub not to have been initialized yet + // If that's the case, lookup the ancestors to set the bus number + if (parent_dev->bus_number == 0) { + for (i = 2; ; i++) { + tmp_id = get_ancestor_session_id(devinst, i); + if (tmp_id == 0) + break; + + tmp_dev = usbi_get_device_by_session_id(ctx, tmp_id); + if (tmp_dev == NULL) + continue; + + if (tmp_dev->bus_number != 0) { + usbi_dbg("got bus number from ancestor #%u", i); + parent_dev->bus_number = tmp_dev->bus_number; + libusb_unref_device(tmp_dev); + break; + } + + libusb_unref_device(tmp_dev); + } + } + + if (parent_dev->bus_number == 0) { + usbi_err(ctx, "program assertion failed: unable to find ancestor bus number for '%s'", device_id); + return LIBUSB_ERROR_NOT_FOUND; + } + + dev->bus_number = parent_dev->bus_number; + priv->port = port_number; + dev->port_number = port_number; + priv->depth = parent_priv->depth + 1; + dev->parent_dev = parent_dev; + + // If the device address is already set, we can stop here + if (dev->device_address != 0) + return LIBUSB_SUCCESS; + + memset(&conn_info, 0, sizeof(conn_info)); + if (priv->depth != 0) { // Not a HCD hub + handle = CreateFileA(parent_priv->path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, NULL); + if (handle == INVALID_HANDLE_VALUE) { + usbi_warn(ctx, "could not open hub %s: %s", parent_priv->path, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + + size = sizeof(conn_info); + conn_info.ConnectionIndex = (ULONG)port_number; + // coverity[tainted_data_argument] + if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, size, + &conn_info, size, &size, NULL)) { + usbi_warn(ctx, "could not get node connection information for device '%s': %s", + device_id, windows_error_str(0)); + CloseHandle(handle); + return LIBUSB_ERROR_NO_DEVICE; + } + + if (conn_info.ConnectionStatus == NoDeviceConnected) { + usbi_err(ctx, "device '%s' is no longer connected!", device_id); + CloseHandle(handle); + return LIBUSB_ERROR_NO_DEVICE; + } + + memcpy(&priv->dev_descriptor, &(conn_info.DeviceDescriptor), sizeof(USB_DEVICE_DESCRIPTOR)); + dev->num_configurations = priv->dev_descriptor.bNumConfigurations; + priv->active_config = conn_info.CurrentConfigurationValue; + usbi_dbg("found %u configurations (active conf: %u)", dev->num_configurations, priv->active_config); + + // If we can't read the config descriptors, just set the number of confs to zero + cache_config_descriptors(dev, handle, device_id); + + // In their great wisdom, Microsoft decided to BREAK the USB speed report between Windows 7 and Windows 8 + if (windows_version >= WINDOWS_8) { + memset(&conn_info_v2, 0, sizeof(conn_info_v2)); + size = sizeof(conn_info_v2); + conn_info_v2.ConnectionIndex = (ULONG)port_number; + conn_info_v2.Length = size; + conn_info_v2.SupportedUsbProtocols.Usb300 = 1; + if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, + &conn_info_v2, size, &conn_info_v2, size, &size, NULL)) { + usbi_warn(ctx, "could not get node connection information (V2) for device '%s': %s", + device_id, windows_error_str(0)); + } else if (conn_info_v2.Flags.DeviceIsOperatingAtSuperSpeedOrHigher) { + conn_info.Speed = 3; + } + } + + CloseHandle(handle); + + if (conn_info.DeviceAddress > UINT8_MAX) + usbi_err(ctx, "program assertion failed: device address overflow"); + + dev->device_address = (uint8_t)conn_info.DeviceAddress + 1; + if (dev->device_address == 1) + usbi_err(ctx, "program assertion failed: device address collision with root hub"); + + switch (conn_info.Speed) { + case 0: dev->speed = LIBUSB_SPEED_LOW; break; + case 1: dev->speed = LIBUSB_SPEED_FULL; break; + case 2: dev->speed = LIBUSB_SPEED_HIGH; break; + case 3: dev->speed = LIBUSB_SPEED_SUPER; break; + default: + usbi_warn(ctx, "Got unknown device speed %u", conn_info.Speed); + break; + } + } else { + dev->device_address = 1; // root hubs are set to use device number 1 + force_hcd_device_descriptor(dev); + } + + dev->has_winusb_driver = 0; + + usbi_sanitize_device(dev); + + usbi_dbg("(bus: %u, addr: %u, depth: %u, port: %u): '%s'", + dev->bus_number, dev->device_address, priv->depth, priv->port, device_id); + + return LIBUSB_SUCCESS; +} + +// Returns the api type, or 0 if not found/unsupported +static void get_api_type(struct libusb_context *ctx, HDEVINFO *dev_info, + SP_DEVINFO_DATA *dev_info_data, int *api, int *sub_api) +{ + // Precedence for filter drivers vs driver is in the order of this array + struct driver_lookup lookup[3] = { + {"\0\0", SPDRP_SERVICE, "driver"}, + {"\0\0", SPDRP_UPPERFILTERS, "upper filter driver"}, + {"\0\0", SPDRP_LOWERFILTERS, "lower filter driver"} + }; + DWORD size, reg_type; + unsigned k, l; + int i, j; + + *api = USB_API_UNSUPPORTED; + *sub_api = SUB_API_NOTSET; + + // Check the service & filter names to know the API we should use + for (k = 0; k < 3; k++) { + if (pSetupDiGetDeviceRegistryPropertyA(*dev_info, dev_info_data, lookup[k].reg_prop, + ®_type, (BYTE *)lookup[k].list, MAX_KEY_LENGTH, &size)) { + // Turn the REG_SZ SPDRP_SERVICE into REG_MULTI_SZ + if (lookup[k].reg_prop == SPDRP_SERVICE) + // our buffers are MAX_KEY_LENGTH + 1 so we can overflow if needed + lookup[k].list[strlen(lookup[k].list) + 1] = 0; + + // MULTI_SZ is a pain to work with. Turn it into something much more manageable + // NB: none of the driver names we check against contain LIST_SEPARATOR, + // (currently ';'), so even if an unsuported one does, it's not an issue + for (l = 0; (lookup[k].list[l] != 0) || (lookup[k].list[l + 1] != 0); l++) { + if (lookup[k].list[l] == 0) + lookup[k].list[l] = LIST_SEPARATOR; + } + usbi_dbg("%s(s): %s", lookup[k].designation, lookup[k].list); + } else { + if (GetLastError() != ERROR_INVALID_DATA) + usbi_dbg("could not access %s: %s", lookup[k].designation, windows_error_str(0)); + lookup[k].list[0] = 0; + } + } + + for (i = 1; i < USB_API_MAX; i++) { + for (k = 0; k < 3; k++) { + j = get_sub_api(lookup[k].list, i); + if (j >= 0) { + usbi_dbg("matched %s name against %s", lookup[k].designation, + (i != USB_API_WINUSBX) ? usb_api_backend[i].designation : sub_api_name[j]); + *api = i; + *sub_api = j; + return; + } + } + } +} + +static int set_composite_interface(struct libusb_context *ctx, struct libusb_device *dev, + char *dev_interface_path, char *device_id, int api, int sub_api) +{ + unsigned i; + struct windows_device_priv *priv = _device_priv(dev); + int interface_number; + + if (priv->apib->id != USB_API_COMPOSITE) { + usbi_err(ctx, "program assertion failed: '%s' is not composite", device_id); + return LIBUSB_ERROR_NO_DEVICE; + } + + if (api == USB_API_WINUSBX) { + dev->has_winusb_driver = 1; + } + + // Because MI_## are not necessarily in sequential order (some composite + // devices will have only MI_00 & MI_03 for instance), we retrieve the actual + // interface number from the path's MI value + interface_number = 0; + for (i = 0; device_id[i] != 0; ) { + if ((device_id[i++] == 'M') && (device_id[i++] == 'I') + && (device_id[i++] == '_')) { + interface_number = (device_id[i++] - '0') * 10; + interface_number += device_id[i] - '0'; + break; + } + } + + if (device_id[i] == 0) + usbi_warn(ctx, "failure to read interface number for %s. Using default value %d", + device_id, interface_number); + + if (priv->usb_interface[interface_number].path != NULL) { + if (api == USB_API_HID) { + // HID devices can have multiple collections (COL##) for each MI_## interface + usbi_dbg("interface[%d] already set - ignoring HID collection: %s", + interface_number, device_id); + return LIBUSB_ERROR_ACCESS; + } + // In other cases, just use the latest data + safe_free(priv->usb_interface[interface_number].path); + } + + usbi_dbg("interface[%d] = %s", interface_number, dev_interface_path); + priv->usb_interface[interface_number].path = dev_interface_path; + priv->usb_interface[interface_number].apib = &usb_api_backend[api]; + priv->usb_interface[interface_number].sub_api = sub_api; + if ((api == USB_API_HID) && (priv->hid == NULL)) { + priv->hid = calloc(1, sizeof(struct hid_device_priv)); + if (priv->hid == NULL) + return LIBUSB_ERROR_NO_MEM; + } + + return LIBUSB_SUCCESS; +} + +/* + * get_device_list: libusb backend device enumeration function + */ +static int windows_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) +{ + struct discovered_devs *discdevs; + HDEVINFO dev_info = { 0 }; + const char *usb_class[] = {"USB", "NUSB3", "IUSB3", "IARUSB3"}; + SP_DEVINFO_DATA dev_info_data = { 0 }; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; +#define MAX_ENUM_GUIDS 64 + const GUID *guid[MAX_ENUM_GUIDS]; +#define HCD_PASS 0 +#define HUB_PASS 1 +#define GEN_PASS 2 +#define DEV_PASS 3 + int r = LIBUSB_SUCCESS; + int api, sub_api; + size_t class_index = 0; + unsigned int nb_guids, pass, i, j, ancestor; + char path[MAX_PATH_LENGTH]; + char strbuf[MAX_PATH_LENGTH]; + struct libusb_device *dev, *parent_dev; + struct windows_device_priv *priv, *parent_priv; + char *dev_interface_path = NULL; + char *dev_id_path = NULL; + unsigned long session_id; + DWORD size, reg_type, port_nr, install_state; + HKEY key; + WCHAR guid_string_w[MAX_GUID_STRING_LENGTH]; + GUID *if_guid; + LONG s; + // Keep a list of newly allocated devs to unref + libusb_device **unref_list, **new_unref_list; + unsigned int unref_size = 64; + unsigned int unref_cur = 0; + + // PASS 1 : (re)enumerate HCDs (allows for HCD hotplug) + // PASS 2 : (re)enumerate HUBS + // PASS 3 : (re)enumerate generic USB devices (including driverless) + // and list additional USB device interface GUIDs to explore + // PASS 4 : (re)enumerate master USB devices that have a device interface + // PASS 5+: (re)enumerate device interfaced GUIDs (including HID) and + // set the device interfaces. + + // Init the GUID table + guid[HCD_PASS] = &GUID_DEVINTERFACE_USB_HOST_CONTROLLER; + guid[HUB_PASS] = &GUID_DEVINTERFACE_USB_HUB; + guid[GEN_PASS] = NULL; + guid[DEV_PASS] = &GUID_DEVINTERFACE_USB_DEVICE; + nb_guids = DEV_PASS + 1; + + unref_list = calloc(unref_size, sizeof(libusb_device *)); + if (unref_list == NULL) + return LIBUSB_ERROR_NO_MEM; + + for (pass = 0; ((pass < nb_guids) && (r == LIBUSB_SUCCESS)); pass++) { +//#define ENUM_DEBUG +#if defined(ENABLE_LOGGING) && defined(ENUM_DEBUG) + const char *passname[] = { "HCD", "HUB", "GEN", "DEV"}; + usbi_dbg("#### PROCESSING %ss %s", pass <= DEV_PASS ? passname[pass] : "EXT", + (pass != GEN_PASS) ? guid_to_string(guid[pass]) : ""); +#endif + for (i = 0; ; i++) { + // safe loop: free up any (unprotected) dynamic resource + // NB: this is always executed before breaking the loop + safe_free(dev_interface_details); + safe_free(dev_interface_path); + safe_free(dev_id_path); + priv = parent_priv = NULL; + dev = parent_dev = NULL; + + // Safe loop: end of loop conditions + if (r != LIBUSB_SUCCESS) + break; + + if ((pass == HCD_PASS) && (i == UINT8_MAX)) { + usbi_warn(ctx, "program assertion failed - found more than %d buses, skipping the rest.", UINT8_MAX); + break; + } + + if (pass != GEN_PASS) { + // Except for GEN, all passes deal with device interfaces + dev_interface_details = get_interface_details(ctx, &dev_info, &dev_info_data, guid[pass], i); + if (dev_interface_details == NULL) + break; + + dev_interface_path = sanitize_path(dev_interface_details->DevicePath); + if (dev_interface_path == NULL) { + usbi_warn(ctx, "could not sanitize device interface path for '%s'", dev_interface_details->DevicePath); + continue; + } + } else { + // Workaround for a Nec/Renesas USB 3.0 driver bug where root hubs are + // being listed under the "NUSB3" PnP Symbolic Name rather than "USB". + // The Intel USB 3.0 driver behaves similar, but uses "IUSB3" + // The Intel Alpine Ridge USB 3.1 driver uses "IARUSB3" + for (; class_index < ARRAYSIZE(usb_class); class_index++) { + if (get_devinfo_data(ctx, &dev_info, &dev_info_data, usb_class[class_index], i)) + break; + i = 0; + } + if (class_index >= ARRAYSIZE(usb_class)) + break; + } + + // Read the Device ID path. This is what we'll use as UID + // Note that if the device is plugged in a different port or hub, the Device ID changes + if (CM_Get_Device_IDA(dev_info_data.DevInst, path, sizeof(path), 0) != CR_SUCCESS) { + usbi_warn(ctx, "could not read the device id path for devinst %X, skipping", + (unsigned int)dev_info_data.DevInst); + continue; + } + + dev_id_path = sanitize_path(path); + if (dev_id_path == NULL) { + usbi_warn(ctx, "could not sanitize device id path for devinst %X, skipping", + (unsigned int)dev_info_data.DevInst); + continue; + } + + if (strstr(dev_id_path, "HUB") == NULL && pass != HCD_PASS && pass != HUB_PASS) { + usbi_warn(ctx, "Device '%s' not satisfying filter, skipping (pass %d)", dev_id_path, pass); + continue; + } + +#ifdef ENUM_DEBUG + usbi_dbg("PRO: %s", dev_id_path); +#endif + + // The SPDRP_ADDRESS for USB devices is the device port number on the hub + port_nr = 0; + if ((pass >= HUB_PASS) && (pass <= GEN_PASS)) { + if ((!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ADDRESS, + ®_type, (BYTE *)&port_nr, 4, &size)) || (size != 4)) { + usbi_warn(ctx, "could not retrieve port number for device '%s', skipping: %s", + dev_id_path, windows_error_str(0)); + continue; + } + } + + // Set API to use or get additional data from generic pass + api = USB_API_UNSUPPORTED; + sub_api = SUB_API_NOTSET; + switch (pass) { + case HCD_PASS: + break; + case GEN_PASS: + // We use the GEN pass to detect driverless devices... + size = sizeof(strbuf); + if (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_DRIVER, + ®_type, (BYTE *)strbuf, size, &size)) { + usbi_info(ctx, "The following device has no driver: '%s'", dev_id_path); + usbi_info(ctx, "libusb will not be able to access it."); + usbi_info(ctx, "error number: %u", (unsigned int)GetLastError()); + } + // ...and to add the additional device interface GUIDs + key = pSetupDiOpenDevRegKey(dev_info, &dev_info_data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); + if (key != INVALID_HANDLE_VALUE) { + size = sizeof(guid_string_w); + s = pRegQueryValueExW(key, L"DeviceInterfaceGUIDs", NULL, ®_type, + (BYTE *)guid_string_w, &size); + pRegCloseKey(key); + if (s == ERROR_SUCCESS) { + if (nb_guids >= MAX_ENUM_GUIDS) { + // If this assert is ever reported, grow a GUID table dynamically + usbi_err(ctx, "program assertion failed: too many GUIDs"); + LOOP_BREAK(LIBUSB_ERROR_OVERFLOW); + } + if_guid = calloc(1, sizeof(GUID)); + if (if_guid == NULL) { + usbi_err(ctx, "could not calloc for if_guid: not enough memory"); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } + pCLSIDFromString(guid_string_w, if_guid); + guid[nb_guids++] = if_guid; + usbi_dbg("extra GUID: %s", guid_to_string(if_guid)); + } else { + usbi_info(ctx, "Error number %ld on RegQueryValueEx", s); + } + } else { + usbi_info(ctx, "Invalid key handle on SetupDiOpenDevRegKey"); + } + break; + default: + // Get the API type (after checking that the driver installation is OK) + if ((!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_INSTALL_STATE, + ®_type, (BYTE *)&install_state, 4, &size)) || (size != 4)) { + usbi_warn(ctx, "could not detect installation state of driver for '%s': %s", + dev_id_path, windows_error_str(0)); + } else if (install_state != 0) { + usbi_warn(ctx, "driver for device '%s' is reporting an issue (code: %u) - skipping", + dev_id_path, (unsigned int)install_state); + continue; + } + get_api_type(ctx, &dev_info, &dev_info_data, &api, &sub_api); + break; + } + + usbi_info(ctx, "Find parent device"); + // Find parent device (for the passes that need it) + switch (pass) { + case HCD_PASS: + case DEV_PASS: + case HUB_PASS: + break; + default: + // Go through the ancestors until we see a face we recognize + parent_dev = NULL; + for (ancestor = 1; parent_dev == NULL; ancestor++) { + session_id = get_ancestor_session_id(dev_info_data.DevInst, ancestor); + if (session_id == 0) + break; + + parent_dev = usbi_get_device_by_session_id(ctx, session_id); + } + + if (parent_dev == NULL) { + usbi_dbg("unlisted ancestor for '%s' (non USB HID, newly connected, etc.) - ignoring", dev_id_path); + continue; + } + + parent_priv = _device_priv(parent_dev); + // virtual USB devices are also listed during GEN - don't process these yet + if ((pass == GEN_PASS) && (parent_priv->apib->id != USB_API_HUB)) { + usbi_info(ctx, "skipping virtual device"); + libusb_unref_device(parent_dev); + continue; + } + + break; + } + + usbi_info(ctx, "Create new or match existing device"); + // Create new or match existing device, using the (hashed) device_id as session id + if (pass <= DEV_PASS) { // For subsequent passes, we'll lookup the parent + // These are the passes that create "new" devices + session_id = htab_hash(dev_id_path); + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev == NULL) { + if (pass == DEV_PASS) { + // This can occur if the OS only reports a newly plugged device after we started enum + usbi_warn(ctx, "'%s' was only detected in late pass (newly connected device?)" + " - ignoring", dev_id_path); + continue; + } + + usbi_dbg("allocating new device for session [%lX]", session_id); + dev = usbi_alloc_device(ctx, session_id); + if (dev == NULL) + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + + priv = windows_device_priv_init(dev); + } else { + usbi_dbg("found existing device for session [%lX] (%u.%u)", + session_id, dev->bus_number, dev->device_address); + + priv = _device_priv(dev); + if ((parent_dev != NULL) && (dev->parent_dev != NULL)) { + if (dev->parent_dev != parent_dev) { + // It is possible for the actual parent device to not have existed at the + // time of enumeration, so the currently assigned parent may in fact be a + // grandparent. If the devices differ, we assume the "new" parent device + // is in fact closer to the device. + usbi_dbg("updating parent device [session %lX -> %lX]", + dev->parent_dev->session_data, parent_dev->session_data); + libusb_unref_device(dev->parent_dev); + dev->parent_dev = parent_dev; + } else { + // We hold a reference to parent_dev instance, but this device already + // has a parent_dev reference (only one per child) + libusb_unref_device(parent_dev); + } + } + } + + // Keep track of devices that need unref + unref_list[unref_cur++] = dev; + if (unref_cur >= unref_size) { + unref_size += 64; + new_unref_list = usbi_reallocf(unref_list, unref_size * sizeof(libusb_device *)); + if (new_unref_list == NULL) { + usbi_err(ctx, "could not realloc list for unref - aborting."); + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + } else { + unref_list = new_unref_list; + } + } + } + + usbi_info(ctx, "Setup device"); + // Setup device + switch (pass) { + case HCD_PASS: + // If the hcd has already been setup, don't do it again + if (priv->path != NULL) + break; + dev->bus_number = (uint8_t)(i + 1); // bus 0 is reserved for disconnected + dev->device_address = 0; + dev->num_configurations = 0; + priv->apib = &usb_api_backend[USB_API_HUB]; + priv->sub_api = SUB_API_NOTSET; + priv->depth = UINT8_MAX; // Overflow to 0 for HCD Hubs + priv->path = dev_interface_path; + dev_interface_path = NULL; + break; + case HUB_PASS: + case DEV_PASS: + // If the device has already been setup, don't do it again + if (priv->path != NULL) + break; + // Take care of API initialization + priv->path = dev_interface_path; + dev_interface_path = NULL; + priv->apib = &usb_api_backend[api]; + priv->sub_api = sub_api; + switch(api) { + case USB_API_COMPOSITE: + case USB_API_HUB: + break; + case USB_API_HID: + priv->hid = calloc(1, sizeof(struct hid_device_priv)); + if (priv->hid == NULL) + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + + priv->hid->nb_interfaces = 0; + break; + case USB_API_WINUSBX: + dev->has_winusb_driver = 1; + default: + // For other devices, the first interface is the same as the device + priv->usb_interface[0].path = _strdup(priv->path); + if (priv->usb_interface[0].path == NULL) + usbi_warn(ctx, "could not duplicate interface path '%s'", priv->path); + // The following is needed if we want API calls to work for both simple + // and composite devices. + for (j = 0; j < USB_MAXINTERFACES; j++) + priv->usb_interface[j].apib = &usb_api_backend[api]; + + break; + } + break; + case GEN_PASS: + usbi_info(ctx, "Will init device"); + r = init_device(dev, parent_dev, (uint8_t)port_nr, dev_id_path, dev_info_data.DevInst); + if (r == LIBUSB_SUCCESS) { + // Append device to the list of discovered devices + discdevs = discovered_devs_append(*_discdevs, dev); + if (!discdevs) + LOOP_BREAK(LIBUSB_ERROR_NO_MEM); + + *_discdevs = discdevs; + } else if (r == LIBUSB_ERROR_NO_DEVICE) { + // This can occur if the device was disconnected but Windows hasn't + // refreshed its enumeration yet - in that case, we ignore the device + r = LIBUSB_SUCCESS; + } + break; + default: // HID_PASS and later + if (parent_priv->apib->id == USB_API_HID || parent_priv->apib->id == USB_API_COMPOSITE) { + { + usbi_dbg("setting composite interface for [%lX]:", parent_dev->session_data); + r = set_composite_interface(ctx, parent_dev, dev_interface_path, dev_id_path, api, sub_api); + } + switch (r) { + case LIBUSB_SUCCESS: + dev_interface_path = NULL; + break; + case LIBUSB_ERROR_ACCESS: + // interface has already been set => make sure dev_interface_path is freed then + r = LIBUSB_SUCCESS; + break; + default: + LOOP_BREAK(r); + break; + } + } + libusb_unref_device(parent_dev); + break; + } + } + } + + // Free any additional GUIDs + for (pass = DEV_PASS + 1; pass < nb_guids; pass++) + free((void *)guid[pass]); + + // Unref newly allocated devs + for (i = 0; i < unref_cur; i++) + libusb_unref_device(unref_list[i]); + free(unref_list); + + return r; +} + +/* + * exit: libusb backend deinitialization function + */ +static void windows_exit(void) +{ + int i; + HANDLE semaphore; + char sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' + + sprintf(sem_name, "libusb_init%08X", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); + semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); + if (semaphore == NULL) + return; + + // A successful wait brings our semaphore count to 0 (unsignaled) + // => any concurent wait stalls until the semaphore release + if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { + CloseHandle(semaphore); + return; + } + + // Only works if exits and inits are balanced exactly + if (--concurrent_usage < 0) { // Last exit + for (i = 0; i < USB_API_MAX; i++) + usb_api_backend[i].exit(SUB_API_NOTSET); + exit_dlls(); + exit_polling(); + windows_common_exit(); + usbi_mutex_destroy(&autoclaim_lock); + } + + ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 + CloseHandle(semaphore); +} + +static int windows_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) +{ + struct windows_device_priv *priv = _device_priv(dev); + + memcpy(buffer, &priv->dev_descriptor, DEVICE_DESC_LENGTH); + *host_endian = 0; + + return LIBUSB_SUCCESS; +} + +static int windows_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +{ + struct windows_device_priv *priv = _device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + size_t size; + + // config index is zero based + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_INVALID_PARAM; + + if ((priv->config_descriptor == NULL) || (priv->config_descriptor[config_index] == NULL)) + return LIBUSB_ERROR_NOT_FOUND; + + config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[config_index]; + + size = MIN(config_header->wTotalLength, len); + memcpy(buffer, priv->config_descriptor[config_index], size); + *host_endian = 0; + + return (int)size; +} + +static int windows_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue, + unsigned char **buffer, int *host_endian) +{ + usbi_dbg("start"); + struct windows_device_priv *priv = _device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + uint8_t index; + + *buffer = NULL; + *host_endian = 0; + + if (priv->config_descriptor == NULL) { + usbi_dbg("err_not_found"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("before loop"); + for (index = 0; usbi_dbg("loop try"), index < dev->num_configurations; usbi_dbg("loop step"), index++) { + usbi_dbg("loop"); + config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[index]; + bool isNull = config_header == NULL; + if (isNull) { + usbi_dbg("is null, next"); + continue; + } + usbi_dbg("is config value"); + bool is = config_header->bConfigurationValue == bConfigurationValue; + usbi_dbg("is done"); + if (is) { + usbi_dbg("write to buffer"); + *buffer = priv->config_descriptor[index]; + usbi_dbg("return"); + return (int)config_header->wTotalLength; + } else { + usbi_dbg("is not, next"); + } + } + + usbi_dbg("err_not_found"); + + return LIBUSB_ERROR_NOT_FOUND; +} + +/* + * return the cached copy of the active config descriptor + */ +static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) +{ + usbi_dbg("start, get device priv"); + struct windows_device_priv *priv = _device_priv(dev); + usbi_dbg("device priv done"); + unsigned char *config_desc; + int r; + if (priv->active_config == 0) { + usbi_dbg("err not found"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("get_config_descriptor_by_value"); + r = windows_get_config_descriptor_by_value(dev, priv->active_config, &config_desc, host_endian); + if (r < 0) { + usbi_dbg("return err %d", r); + return r; + } + + usbi_dbg("MIN %d %d", r, len); + + len = MIN((size_t)r, len); + usbi_dbg("Mempcpy %d", len); + memcpy(buffer, config_desc, len); + usbi_dbg("return %d", len); + return (int)len; +} + +static int windows_open(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + usbi_info(ctx, "windows open start"); + + if (priv->apib == NULL) { + usbi_err(ctx, "program assertion failed - device is not initialized"); + return LIBUSB_ERROR_NO_DEVICE; + } + + usbi_info(ctx, "windows open - go lower"); + return priv->apib->open(SUB_API_NOTSET, dev_handle); +} + +static void windows_close(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + priv->apib->close(SUB_API_NOTSET, dev_handle); +} + +static int windows_get_configuration(struct libusb_device_handle *dev_handle, int *config) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + if (priv->active_config == 0) { + *config = 0; + return LIBUSB_ERROR_NOT_FOUND; + } + + *config = priv->active_config; + return LIBUSB_SUCCESS; +} + +/* + * from http://msdn.microsoft.com/en-us/library/ms793522.aspx: "The port driver + * does not currently expose a service that allows higher-level drivers to set + * the configuration." + */ +static int windows_set_configuration(struct libusb_device_handle *dev_handle, int config) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int r = LIBUSB_SUCCESS; + + if (config >= USB_MAXCONFIG) + return LIBUSB_ERROR_INVALID_PARAM; + + r = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_OUT | + LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_RECIPIENT_DEVICE, + LIBUSB_REQUEST_SET_CONFIGURATION, (uint16_t)config, + 0, NULL, 0, 1000); + + if (r == LIBUSB_SUCCESS) + priv->active_config = (uint8_t)config; + + return r; +} + +static int windows_claim_interface(struct libusb_device_handle *dev_handle, int iface) +{ + int r = LIBUSB_SUCCESS; + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + safe_free(priv->usb_interface[iface].endpoint); + priv->usb_interface[iface].nb_endpoints = 0; + + r = priv->apib->claim_interface(SUB_API_NOTSET, dev_handle, iface); + + if (r == LIBUSB_SUCCESS) + r = windows_assign_endpoints(dev_handle, iface, 0); + + return r; +} + +static int windows_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + int r = LIBUSB_SUCCESS; + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + safe_free(priv->usb_interface[iface].endpoint); + priv->usb_interface[iface].nb_endpoints = 0; + + r = priv->apib->set_interface_altsetting(SUB_API_NOTSET, dev_handle, iface, altsetting); + + if (r == LIBUSB_SUCCESS) + r = windows_assign_endpoints(dev_handle, iface, altsetting); + + return r; +} + +static int windows_release_interface(struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + return priv->apib->release_interface(SUB_API_NOTSET, dev_handle, iface); +} + +static int windows_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->apib->clear_halt(SUB_API_NOTSET, dev_handle, endpoint); +} + +static int windows_reset_device(struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + return priv->apib->reset_device(SUB_API_NOTSET, dev_handle); +} + +// The 3 functions below are unlikely to ever get supported on Windows +static int windows_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int windows_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int windows_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static void windows_destroy_device(struct libusb_device *dev) +{ + windows_device_priv_release(dev); +} + +void windows_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + + usbi_free_fd(&transfer_priv->pollable_fd); + safe_free(transfer_priv->hid_buffer); + // When auto claim is in use, attempt to release the auto-claimed interface + auto_release(itransfer); +} + +static int submit_bulk_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int r; + + r = priv->apib->submit_bulk_transfer(SUB_API_NOTSET, itransfer); + if (r != LIBUSB_SUCCESS) + return r; + + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, + (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + + return LIBUSB_SUCCESS; +} + +static int submit_iso_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int r; + + r = priv->apib->submit_iso_transfer(SUB_API_NOTSET, itransfer); + if (r != LIBUSB_SUCCESS) + return r; + + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, + (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + + return LIBUSB_SUCCESS; +} + +static int submit_control_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int r; + + r = priv->apib->submit_control_transfer(SUB_API_NOTSET, itransfer); + if (r != LIBUSB_SUCCESS) + return r; + + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN); + + return LIBUSB_SUCCESS; +} + +static int windows_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return submit_control_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)) + return LIBUSB_ERROR_NOT_SUPPORTED; + return submit_bulk_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return submit_iso_transfer(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + return LIBUSB_ERROR_NOT_SUPPORTED; + default: + usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int windows_abort_control(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->apib->abort_control(SUB_API_NOTSET, itransfer); +} + +static int windows_abort_transfers(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->apib->abort_transfers(SUB_API_NOTSET, itransfer); +} + +static int windows_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return windows_abort_control(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return windows_abort_transfers(itransfer); + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + return LIBUSB_ERROR_NOT_SUPPORTED; + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + return priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); +} + +struct winfd *windows_get_fd(struct usbi_transfer *transfer) +{ + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(transfer); + return &transfer_priv->pollable_fd; +} + +void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size) +{ + if (HasOverlappedIoCompletedSync(pollable_fd->overlapped)) { + *io_result = NO_ERROR; + *io_size = (DWORD)pollable_fd->overlapped->InternalHigh; + } else if (GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { + // Regular async overlapped + *io_result = NO_ERROR; + } else { + *io_result = GetLastError(); + } +} + +// NB: MSVC6 does not support named initializers. +const struct usbi_os_backend windows_backend = { + "Windows", + USBI_CAP_HAS_HID_ACCESS, + windows_init, + windows_exit, + + windows_get_device_list, + NULL, /* hotplug_poll */ + windows_open, + windows_close, + + windows_get_device_descriptor, + windows_get_active_config_descriptor, + windows_get_config_descriptor, + windows_get_config_descriptor_by_value, + + windows_get_configuration, + windows_set_configuration, + windows_claim_interface, + windows_release_interface, + + windows_set_interface_altsetting, + windows_clear_halt, + windows_reset_device, + + NULL, /* alloc_streams */ + NULL, /* free_streams */ + + NULL, /* dev_mem_alloc */ + NULL, /* dev_mem_free */ + + windows_kernel_driver_active, + windows_detach_kernel_driver, + windows_attach_kernel_driver, + + windows_destroy_device, + + windows_submit_transfer, + windows_cancel_transfer, + windows_clear_transfer_priv, + + windows_handle_events, + NULL, + + windows_clock_gettime, +#if defined(USBI_TIMERFD_AVAILABLE) + NULL, +#endif + sizeof(struct windows_device_priv), + sizeof(struct windows_device_handle_priv), + sizeof(struct windows_transfer_priv), +}; + + +/* + * USB API backends + */ +static int unsupported_init(int sub_api, struct libusb_context *ctx) +{ + return LIBUSB_SUCCESS; +} + +static int unsupported_exit(int sub_api) +{ + return LIBUSB_SUCCESS; +} + +static int unsupported_open(int sub_api, struct libusb_device_handle *dev_handle) +{ + usbi_dbg("unsupported open"); + PRINT_UNSUPPORTED_API(open); +} + +static void unsupported_close(int sub_api, struct libusb_device_handle *dev_handle) +{ + usbi_dbg("unsupported API call for 'close'"); +} + +static int unsupported_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + PRINT_UNSUPPORTED_API(configure_endpoints); +} + +static int unsupported_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + PRINT_UNSUPPORTED_API(claim_interface); +} + +static int unsupported_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + PRINT_UNSUPPORTED_API(set_interface_altsetting); +} + +static int unsupported_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + PRINT_UNSUPPORTED_API(release_interface); +} + +static int unsupported_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + PRINT_UNSUPPORTED_API(clear_halt); +} + +static int unsupported_reset_device(int sub_api, struct libusb_device_handle *dev_handle) +{ + PRINT_UNSUPPORTED_API(reset_device); +} + +static int unsupported_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + PRINT_UNSUPPORTED_API(submit_bulk_transfer); +} + +static int unsupported_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + PRINT_UNSUPPORTED_API(submit_iso_transfer); +} + +static int unsupported_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + PRINT_UNSUPPORTED_API(submit_control_transfer); +} + +static int unsupported_abort_control(int sub_api, struct usbi_transfer *itransfer) +{ + PRINT_UNSUPPORTED_API(abort_control); +} + +static int unsupported_abort_transfers(int sub_api, struct usbi_transfer *itransfer) +{ + PRINT_UNSUPPORTED_API(abort_transfers); +} + +static int unsupported_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) +{ + PRINT_UNSUPPORTED_API(copy_transfer_data); +} + +static int common_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + return LIBUSB_SUCCESS; +} + +// These names must be uppercase +static const char *hub_driver_names[] = {"USBHUB", "USBHUB3", "USB3HUB", "NUSB3HUB", "RUSB3HUB", "FLXHCIH", "TIHUB3", "ETRONHUB3", "VIAHUB3", "ASMTHUB3", "IUSB3HUB", "VUSB3HUB", "AMDHUB30", "VHHUB", "AUSB3HUB"}; +static const char *composite_driver_names[] = {"USBCCGP"}; +static const char *winusbx_driver_names[] = WINUSBX_DRV_NAMES; +static const char *hid_driver_names[] = {"HIDUSB", "MOUHID", "KBDHID"}; +const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { + { + USB_API_UNSUPPORTED, + "Unsupported API", + NULL, + 0, + unsupported_init, + unsupported_exit, + unsupported_open, + unsupported_close, + unsupported_configure_endpoints, + unsupported_claim_interface, + unsupported_set_interface_altsetting, + unsupported_release_interface, + unsupported_clear_halt, + unsupported_reset_device, + unsupported_submit_bulk_transfer, + unsupported_submit_iso_transfer, + unsupported_submit_control_transfer, + unsupported_abort_control, + unsupported_abort_transfers, + unsupported_copy_transfer_data, + }, + { + USB_API_HUB, + "HUB API", + hub_driver_names, + ARRAYSIZE(hub_driver_names), + unsupported_init, + unsupported_exit, + unsupported_open, + unsupported_close, + unsupported_configure_endpoints, + unsupported_claim_interface, + unsupported_set_interface_altsetting, + unsupported_release_interface, + unsupported_clear_halt, + unsupported_reset_device, + unsupported_submit_bulk_transfer, + unsupported_submit_iso_transfer, + unsupported_submit_control_transfer, + unsupported_abort_control, + unsupported_abort_transfers, + unsupported_copy_transfer_data, + }, + { + USB_API_COMPOSITE, + "Composite API", + composite_driver_names, + ARRAYSIZE(composite_driver_names), + composite_init, + composite_exit, + composite_open, + composite_close, + common_configure_endpoints, + composite_claim_interface, + composite_set_interface_altsetting, + composite_release_interface, + composite_clear_halt, + composite_reset_device, + composite_submit_bulk_transfer, + composite_submit_iso_transfer, + composite_submit_control_transfer, + composite_abort_control, + composite_abort_transfers, + composite_copy_transfer_data, + }, + { + USB_API_WINUSBX, + "WinUSB-like APIs", + winusbx_driver_names, + ARRAYSIZE(winusbx_driver_names), + winusbx_init, + winusbx_exit, + winusbx_open, + winusbx_close, + winusbx_configure_endpoints, + winusbx_claim_interface, + winusbx_set_interface_altsetting, + winusbx_release_interface, + winusbx_clear_halt, + winusbx_reset_device, + winusbx_submit_bulk_transfer, + unsupported_submit_iso_transfer, + winusbx_submit_control_transfer, + winusbx_abort_control, + winusbx_abort_transfers, + winusbx_copy_transfer_data, + } +}; + + +/* + * WinUSB-like (WinUSB, libusb0/libusbK through libusbk DLL) API functions + */ +#define WinUSBX_Set(fn) \ + do { \ + if (native_winusb) \ + WinUSBX[i].fn = (WinUsb_##fn##_t)GetProcAddress(h, "WinUsb_" #fn); \ + else \ + pLibK_GetProcAddress((PVOID *)&WinUSBX[i].fn, i, KUSB_FNID_##fn); \ + } while (0) + +static int winusbx_init(int sub_api, struct libusb_context *ctx) +{ + HMODULE h; + bool native_winusb; + int i; + KLIB_VERSION LibK_Version; + LibK_GetProcAddress_t pLibK_GetProcAddress = NULL; + LibK_GetVersion_t pLibK_GetVersion; + + h = LoadLibraryA("libusbK"); + + if (h == NULL) { + usbi_info(ctx, "libusbK DLL is not available, will use native WinUSB"); + h = LoadLibraryA("WinUSB"); + + if (h == NULL) { + usbi_warn(ctx, "WinUSB DLL is not available either, " + "you will not be able to access devices outside of enumeration"); + return LIBUSB_ERROR_NOT_FOUND; + } + } else { + usbi_dbg("using libusbK DLL for universal access"); + pLibK_GetVersion = (LibK_GetVersion_t)GetProcAddress(h, "LibK_GetVersion"); + if (pLibK_GetVersion != NULL) { + pLibK_GetVersion(&LibK_Version); + usbi_dbg("libusbK version: %d.%d.%d.%d", LibK_Version.Major, LibK_Version.Minor, + LibK_Version.Micro, LibK_Version.Nano); + } + pLibK_GetProcAddress = (LibK_GetProcAddress_t)GetProcAddress(h, "LibK_GetProcAddress"); + if (pLibK_GetProcAddress == NULL) { + usbi_err(ctx, "LibK_GetProcAddress() not found in libusbK DLL"); + FreeLibrary(h); + return LIBUSB_ERROR_NOT_FOUND; + } + } + + native_winusb = (pLibK_GetProcAddress == NULL); + for (i = SUB_API_LIBUSBK; i < SUB_API_MAX; i++) { + WinUSBX_Set(AbortPipe); + WinUSBX_Set(ControlTransfer); + WinUSBX_Set(FlushPipe); + WinUSBX_Set(Free); + WinUSBX_Set(GetAssociatedInterface); + WinUSBX_Set(GetCurrentAlternateSetting); + WinUSBX_Set(GetDescriptor); + WinUSBX_Set(GetOverlappedResult); + WinUSBX_Set(GetPipePolicy); + WinUSBX_Set(GetPowerPolicy); + WinUSBX_Set(Initialize); + WinUSBX_Set(QueryDeviceInformation); + WinUSBX_Set(QueryInterfaceSettings); + WinUSBX_Set(QueryPipe); + WinUSBX_Set(ReadPipe); + WinUSBX_Set(ResetPipe); + WinUSBX_Set(SetCurrentAlternateSetting); + WinUSBX_Set(SetPipePolicy); + WinUSBX_Set(SetPowerPolicy); + WinUSBX_Set(WritePipe); + if (!native_winusb) + WinUSBX_Set(ResetDevice); + + if (WinUSBX[i].Initialize != NULL) { + WinUSBX[i].initialized = true; + usbi_dbg("initalized sub API %s", sub_api_name[i]); + } else { + usbi_warn(ctx, "Failed to initalize sub API %s", sub_api_name[i]); + WinUSBX[i].initialized = false; + } + } + + WinUSBX_handle = h; + return LIBUSB_SUCCESS; +} + +static int winusbx_exit(int sub_api) +{ + if (WinUSBX_handle != NULL) { + FreeLibrary(WinUSBX_handle); + WinUSBX_handle = NULL; + + /* Reset the WinUSBX API structures */ + memset(&WinUSBX, 0, sizeof(WinUSBX)); + } + + return LIBUSB_SUCCESS; +} + +// NB: open and close must ensure that they only handle interface of +// the right API type, as these functions can be called wholesale from +// composite_open(), with interfaces belonging to different APIs +static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + usbi_info(ctx, "winusbx_open start"); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + + HANDLE file_handle; + int i; + + CHECK_WINUSBX_AVAILABLE(sub_api); + usbi_info(ctx, "winusbx available"); + + // WinUSB requires a separate handle for each interface + for (i = 0; i < USB_MAXINTERFACES; i++) { + if ((priv->usb_interface[i].path != NULL) + && (priv->usb_interface[i].apib->id == USB_API_WINUSBX)) { + usbi_info(ctx, "API for %d is WinUSB", i); + file_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (file_handle == INVALID_HANDLE_VALUE) { + usbi_err(ctx, "could not open device %s (interface %d): %s", priv->usb_interface[i].path, i, windows_error_str(0)); + switch(GetLastError()) { + case ERROR_FILE_NOT_FOUND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_ACCESS_DENIED: + return LIBUSB_ERROR_ACCESS; + default: + return LIBUSB_ERROR_IO; + } + } + handle_priv->interface_handle[i].dev_handle = file_handle; + usbi_info(ctx, "handle handled"); + } + } + usbi_info(ctx, "open success"); + + return LIBUSB_SUCCESS; +} + +static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE handle; + int i; + + if (sub_api == SUB_API_NOTSET) + sub_api = priv->sub_api; + + if (!WinUSBX[sub_api].initialized) + return; + + if (priv->apib->id == USB_API_COMPOSITE) { + // If this is a composite device, just free and close all WinUSB-like + // interfaces directly (each is independent and not associated with another) + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (priv->usb_interface[i].apib->id == USB_API_WINUSBX) { + handle = handle_priv->interface_handle[i].api_handle; + if (HANDLE_VALID(handle)) + WinUSBX[sub_api].Free(handle); + + handle = handle_priv->interface_handle[i].dev_handle; + if (HANDLE_VALID(handle)) + CloseHandle(handle); + } + } + } else { + // If this is a WinUSB device, free all interfaces above interface 0, + // then free and close interface 0 last + for (i = 1; i < USB_MAXINTERFACES; i++) { + handle = handle_priv->interface_handle[i].api_handle; + if (HANDLE_VALID(handle)) + WinUSBX[sub_api].Free(handle); + } + handle = handle_priv->interface_handle[0].api_handle; + if (HANDLE_VALID(handle)) + WinUSBX[sub_api].Free(handle); + + handle = handle_priv->interface_handle[0].dev_handle; + if (HANDLE_VALID(handle)) + CloseHandle(handle); + } +} + +static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle = handle_priv->interface_handle[iface].api_handle; + UCHAR policy; + ULONG timeout = 0; + uint8_t endpoint_address; + int i; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // With handle and enpoints set (in parent), we can setup the default pipe properties + // see http://download.microsoft.com/download/D/1/D/D1DD7745-426B-4CC3-A269-ABBBE427C0EF/DVC-T705_DDC08.pptx + for (i = -1; i < priv->usb_interface[iface].nb_endpoints; i++) { + endpoint_address = (i == -1) ? 0 : priv->usb_interface[iface].endpoint[i]; + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + PIPE_TRANSFER_TIMEOUT, sizeof(ULONG), &timeout)) + usbi_dbg("failed to set PIPE_TRANSFER_TIMEOUT for control endpoint %02X", endpoint_address); + + if ((i == -1) || (sub_api == SUB_API_LIBUSB0)) + continue; // Other policies don't apply to control endpoint or libusb0 + + policy = false; + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + SHORT_PACKET_TERMINATE, sizeof(UCHAR), &policy)) + usbi_dbg("failed to disable SHORT_PACKET_TERMINATE for endpoint %02X", endpoint_address); + + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + IGNORE_SHORT_PACKETS, sizeof(UCHAR), &policy)) + usbi_dbg("failed to disable IGNORE_SHORT_PACKETS for endpoint %02X", endpoint_address); + + policy = true; + /* ALLOW_PARTIAL_READS must be enabled due to likely libusbK bug. See: + https://sourceforge.net/mailarchive/message.php?msg_id=29736015 */ + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + ALLOW_PARTIAL_READS, sizeof(UCHAR), &policy)) + usbi_dbg("failed to enable ALLOW_PARTIAL_READS for endpoint %02X", endpoint_address); + + if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, + AUTO_CLEAR_STALL, sizeof(UCHAR), &policy)) + usbi_dbg("failed to enable AUTO_CLEAR_STALL for endpoint %02X", endpoint_address); + } + + return LIBUSB_SUCCESS; +} + +static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + bool is_using_usbccgp = (priv->apib->id == USB_API_COMPOSITE); + SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; + HDEVINFO dev_info = INVALID_HANDLE_VALUE; + SP_DEVINFO_DATA dev_info_data; + char *dev_path_no_guid = NULL; + char filter_path[] = "\\\\.\\libusb0-0000"; + bool found_filter = false; + HANDLE file_handle, winusb_handle; + DWORD err; + int i; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // If the device is composite, but using the default Windows composite parent driver (usbccgp) + // or if it's the first WinUSB-like interface, we get a handle through Initialize(). + if ((is_using_usbccgp) || (iface == 0)) { + // composite device (independent interfaces) or interface 0 + file_handle = handle_priv->interface_handle[iface].dev_handle; + if (!HANDLE_VALID(file_handle)) + return LIBUSB_ERROR_NOT_FOUND; + + if (!WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + err = GetLastError(); + switch(err) { + case ERROR_BAD_COMMAND: + // The device was disconnected + usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + default: + // it may be that we're using the libusb0 filter driver. + // TODO: can we move this whole business into the K/0 DLL? + for (i = 0; ; i++) { + safe_free(dev_interface_details); + safe_free(dev_path_no_guid); + + dev_interface_details = get_interface_details_filter(ctx, &dev_info, &dev_info_data, &GUID_DEVINTERFACE_LIBUSB0_FILTER, i, filter_path); + if ((found_filter) || (dev_interface_details == NULL)) + break; + + // ignore GUID part + dev_path_no_guid = sanitize_path(strtok(dev_interface_details->DevicePath, "{")); + if (dev_path_no_guid == NULL) + continue; + + if (strncmp(dev_path_no_guid, priv->usb_interface[iface].path, strlen(dev_path_no_guid)) == 0) { + file_handle = CreateFileA(filter_path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (file_handle != INVALID_HANDLE_VALUE) { + if (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { + // Replace the existing file handle with the working one + CloseHandle(handle_priv->interface_handle[iface].dev_handle); + handle_priv->interface_handle[iface].dev_handle = file_handle; + found_filter = true; + } else { + usbi_err(ctx, "could not initialize filter driver for %s", filter_path); + CloseHandle(file_handle); + } + } else { + usbi_err(ctx, "could not open device %s: %s", filter_path, windows_error_str(0)); + } + } + } + free(dev_interface_details); + if (!found_filter) { + usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(err)); + return LIBUSB_ERROR_ACCESS; + } + } + } + handle_priv->interface_handle[iface].api_handle = winusb_handle; + } else { + // For all other interfaces, use GetAssociatedInterface() + winusb_handle = handle_priv->interface_handle[0].api_handle; + // It is a requirement for multiple interface devices on Windows that, to you + // must first claim the first interface before you claim the others + if (!HANDLE_VALID(winusb_handle)) { + file_handle = handle_priv->interface_handle[0].dev_handle; + if (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { + handle_priv->interface_handle[0].api_handle = winusb_handle; + usbi_warn(ctx, "auto-claimed interface 0 (required to claim %d with WinUSB)", iface); + } else { + usbi_warn(ctx, "failed to auto-claim interface 0 (required to claim %d with WinUSB): %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + } + if (!WinUSBX[sub_api].GetAssociatedInterface(winusb_handle, (UCHAR)(iface - 1), + &handle_priv->interface_handle[iface].api_handle)) { + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + switch(GetLastError()) { + case ERROR_NO_MORE_ITEMS: // invalid iface + return LIBUSB_ERROR_NOT_FOUND; + case ERROR_BAD_COMMAND: // The device was disconnected + return LIBUSB_ERROR_NO_DEVICE; + case ERROR_ALREADY_EXISTS: // already claimed + return LIBUSB_ERROR_BUSY; + default: + usbi_err(ctx, "could not claim interface %d: %s", iface, windows_error_str(0)); + return LIBUSB_ERROR_ACCESS; + } + } + } + usbi_dbg("claimed interface %d", iface); + handle_priv->active_interface = iface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + winusb_handle = handle_priv->interface_handle[iface].api_handle; + if (!HANDLE_VALID(winusb_handle)) + return LIBUSB_ERROR_NOT_FOUND; + + WinUSBX[sub_api].Free(winusb_handle); + handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; + + return LIBUSB_SUCCESS; +} + +/* + * Return the first valid interface (of the same API type), for control transfers + */ +static int get_valid_interface(struct libusb_device_handle *dev_handle, int api_id) +{ + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int i; + + if ((api_id < USB_API_WINUSBX) || (api_id > USB_API_HID)) { + usbi_dbg("unsupported API ID"); + return -1; + } + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (HANDLE_VALID(handle_priv->interface_handle[i].dev_handle) + && HANDLE_VALID(handle_priv->interface_handle[i].api_handle) + && (priv->usb_interface[i].apib->id == api_id)) + return i; + } + + return -1; +} + +/* + * Lookup interface by endpoint address. -1 if not found + */ +static int interface_by_endpoint(struct windows_device_priv *priv, + struct windows_device_handle_priv *handle_priv, uint8_t endpoint_address) +{ + int i, j; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if (!HANDLE_VALID(handle_priv->interface_handle[i].api_handle)) + continue; + if (priv->usb_interface[i].endpoint == NULL) + continue; + for (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) { + if (priv->usb_interface[i].endpoint[j] == endpoint_address) + return i; + } + } + + return -1; +} + +static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer; + ULONG size; + HANDLE winusb_handle; + int current_interface; + struct winfd wfd; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + transfer_priv->pollable_fd = INVALID_WINFD; + size = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; + + // Windows places upper limits on the control transfer size + // See: https://msdn.microsoft.com/en-us/library/windows/hardware/ff538112.aspx + if (size > MAX_CTRL_BUFFER_LENGTH) + return LIBUSB_ERROR_INVALID_PARAM; + + current_interface = get_valid_interface(transfer->dev_handle, USB_API_WINUSBX); + if (current_interface < 0) { + if (auto_claim(transfer, ¤t_interface, USB_API_WINUSBX) != LIBUSB_SUCCESS) + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("will use interface %d", current_interface); + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + wfd = usbi_create_fd(winusb_handle, RW_READ, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) + return LIBUSB_ERROR_NO_MEM; + + // Sending of set configuration control requests from WinUSB creates issues + if (((setup->request_type & (0x03 << 5)) == LIBUSB_REQUEST_TYPE_STANDARD) + && (setup->request == LIBUSB_REQUEST_SET_CONFIGURATION)) { + if (setup->value != priv->active_config) { + usbi_warn(ctx, "cannot set configuration other than the default one"); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_INVALID_PARAM; + } + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = 0; + } else { + if (!WinUSBX[sub_api].ControlTransfer(wfd.handle, *setup, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, size, NULL, wfd.overlapped)) { + if (GetLastError() != ERROR_IO_PENDING) { + usbi_warn(ctx, "ControlTransfer failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_IO; + } + } else { + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = (DWORD)size; + } + } + + // Use priv_transfer to store data needed for async polling + transfer_priv->pollable_fd = wfd; + transfer_priv->interface_number = (uint8_t)current_interface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + if (altsetting > 255) + return LIBUSB_ERROR_INVALID_PARAM; + + winusb_handle = handle_priv->interface_handle[iface].api_handle; + if (!HANDLE_VALID(winusb_handle)) { + usbi_err(ctx, "interface must be claimed first"); + return LIBUSB_ERROR_NOT_FOUND; + } + + if (!WinUSBX[sub_api].SetCurrentAlternateSetting(winusb_handle, (UCHAR)altsetting)) { + usbi_err(ctx, "SetCurrentAlternateSetting failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + + return LIBUSB_SUCCESS; +} + +static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + HANDLE winusb_handle; + bool ret; + int current_interface; + struct winfd wfd; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + transfer_priv->pollable_fd = INVALID_WINFD; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); + + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + wfd = usbi_create_fd(winusb_handle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) + return LIBUSB_ERROR_NO_MEM; + + if (IS_XFERIN(transfer)) { + usbi_dbg("reading %d bytes", transfer->length); + ret = WinUSBX[sub_api].ReadPipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); + } else { + usbi_dbg("writing %d bytes", transfer->length); + ret = WinUSBX[sub_api].WritePipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); + } + + if (!ret) { + if (GetLastError() != ERROR_IO_PENDING) { + usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_IO; + } + } else { + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = (DWORD)transfer->length; + } + + transfer_priv->pollable_fd = wfd; + transfer_priv->interface_number = (uint8_t)current_interface; + + return LIBUSB_SUCCESS; +} + +static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + HANDLE winusb_handle; + int current_interface; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + current_interface = interface_by_endpoint(priv, handle_priv, endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_dbg("matched endpoint %02X with interface %d", endpoint, current_interface); + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + if (!WinUSBX[sub_api].ResetPipe(winusb_handle, endpoint)) { + usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +/* + * from http://www.winvistatips.com/winusb-bugchecks-t335323.html (confirmed + * through testing as well): + * "You can not call WinUsb_AbortPipe on control pipe. You can possibly cancel + * the control transfer using CancelIo" + */ +static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer) +{ + // Cancelling of the I/O is done in the parent + return LIBUSB_SUCCESS; +} + +static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + HANDLE winusb_handle; + int current_interface; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + current_interface = transfer_priv->interface_number; + if ((current_interface < 0) || (current_interface >= USB_MAXINTERFACES)) { + usbi_err(ctx, "program assertion failed: invalid interface_number"); + return LIBUSB_ERROR_NOT_FOUND; + } + usbi_dbg("will use interface %d", current_interface); + + winusb_handle = handle_priv->interface_handle[current_interface].api_handle; + + if (!WinUSBX[sub_api].AbortPipe(winusb_handle, transfer->endpoint)) { + usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +/* + * from the "How to Use WinUSB to Communicate with a USB Device" Microsoft white paper + * (http://www.microsoft.com/whdc/connect/usb/winusb_howto.mspx): + * "WinUSB does not support host-initiated reset port and cycle port operations" and + * IOCTL_INTERNAL_USB_CYCLE_PORT is only available in kernel mode and the + * IOCTL_USB_HUB_CYCLE_PORT ioctl was removed from Vista => the best we can do is + * cycle the pipes (and even then, the control pipe can not be reset using WinUSB) + */ +// TODO: (post hotplug): see if we can force eject the device and redetect it (reuse hotplug?) +static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + struct winfd wfd; + HANDLE winusb_handle; + int i, j; + + CHECK_WINUSBX_AVAILABLE(sub_api); + + // Reset any available pipe (except control) + for (i = 0; i < USB_MAXINTERFACES; i++) { + winusb_handle = handle_priv->interface_handle[i].api_handle; + for (wfd = handle_to_winfd(winusb_handle); wfd.fd > 0; ) { + // Cancel any pollable I/O + usbi_remove_pollfd(ctx, wfd.fd); + usbi_free_fd(&wfd); + wfd = handle_to_winfd(winusb_handle); + } + + if (HANDLE_VALID(winusb_handle)) { + for (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) { + usbi_dbg("resetting ep %02X", priv->usb_interface[i].endpoint[j]); + if (!WinUSBX[sub_api].AbortPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) + usbi_err(ctx, "AbortPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + + // FlushPipe seems to fail on OUT pipes + if (IS_EPIN(priv->usb_interface[i].endpoint[j]) + && (!WinUSBX[sub_api].FlushPipe(winusb_handle, priv->usb_interface[i].endpoint[j]))) + usbi_err(ctx, "FlushPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + + if (!WinUSBX[sub_api].ResetPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) + usbi_err(ctx, "ResetPipe (pipe address %02X) failed: %s", + priv->usb_interface[i].endpoint[j], windows_error_str(0)); + } + } + } + + // libusbK & libusb0 have the ability to issue an actual device reset + if (WinUSBX[sub_api].ResetDevice != NULL) { + winusb_handle = handle_priv->interface_handle[0].api_handle; + if (HANDLE_VALID(winusb_handle)) + WinUSBX[sub_api].ResetDevice(winusb_handle); + } + + return LIBUSB_SUCCESS; +} + +static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) +{ + itransfer->transferred += io_size; + return LIBUSB_TRANSFER_COMPLETED; +} + +/* + * Composite API functions + */ +static int composite_init(int sub_api, struct libusb_context *ctx) +{ + return LIBUSB_SUCCESS; +} + +static int composite_exit(int sub_api) +{ + return LIBUSB_SUCCESS; +} + +static int composite_open(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + usbi_info(ctx, "composite open"); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int r = LIBUSB_ERROR_NOT_FOUND; + uint8_t i; + // SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID + bool available[SUB_API_MAX + 1] = { 0 }; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + switch (priv->usb_interface[i].apib->id) { + case USB_API_WINUSBX: + if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) + available[priv->usb_interface[i].sub_api] = true; + break; + case USB_API_HID: + available[SUB_API_MAX] = true; + break; + default: + break; + } + } + + for (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers + if (available[i]) { + r = usb_api_backend[USB_API_WINUSBX].open(i, dev_handle); + if (r != LIBUSB_SUCCESS) + return r; + } + } + + return r; +} + +static void composite_close(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + uint8_t i; + // SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID + bool available[SUB_API_MAX + 1] = { 0 }; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + switch (priv->usb_interface[i].apib->id) { + case USB_API_WINUSBX: + if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) + available[priv->usb_interface[i].sub_api] = true; + break; + case USB_API_HID: + available[SUB_API_MAX] = true; + break; + default: + break; + } + } + + for (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers + if (available[i]) + usb_api_backend[USB_API_WINUSBX].close(i, dev_handle); + } +} + +static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + return priv->usb_interface[iface].apib-> + claim_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); +} + +static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + return priv->usb_interface[iface].apib-> + set_interface_altsetting(priv->usb_interface[iface].sub_api, dev_handle, iface, altsetting); +} + +static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + + return priv->usb_interface[iface].apib-> + release_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); +} + +static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + struct libusb_config_descriptor *conf_desc; + WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer; + int iface, pass, r; + + // Interface shouldn't matter for control, but it does in practice, with Windows' + // restrictions with regards to accessing HID keyboards and mice. Try to target + // a specific interface first, if possible. + switch (LIBUSB_REQ_RECIPIENT(setup->request_type)) { + case LIBUSB_RECIPIENT_INTERFACE: + iface = setup->index & 0xFF; + break; + case LIBUSB_RECIPIENT_ENDPOINT: + r = libusb_get_active_config_descriptor(transfer->dev_handle->dev, &conf_desc); + if (r == LIBUSB_SUCCESS) { + iface = get_interface_by_endpoint(conf_desc, (setup->index & 0xFF)); + libusb_free_config_descriptor(conf_desc); + break; + } + // Fall through if not able to determine interface + default: + iface = -1; + break; + } + + // Try and target a specific interface if the control setup indicates such + if ((iface >= 0) && (iface < USB_MAXINTERFACES)) { + usbi_dbg("attempting control transfer targeted to interface %d", iface); + if (priv->usb_interface[iface].path != NULL) { + r = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer); + if (r == LIBUSB_SUCCESS) + return r; + } + } + + // Either not targeted to a specific interface or no luck in doing so. + // Try a 2 pass approach with all interfaces. + for (pass = 0; pass < 2; pass++) { + for (iface = 0; iface < USB_MAXINTERFACES; iface++) { + if (priv->usb_interface[iface].path != NULL) { + if ((pass == 0) && (priv->usb_interface[iface].restricted_functionality)) { + usbi_dbg("trying to skip restricted interface #%d (HID keyboard or mouse?)", iface); + continue; + } + usbi_dbg("using interface %d", iface); + r = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer); + // If not supported on this API, it may be supported on another, so don't give up yet!! + if (r == LIBUSB_ERROR_NOT_SUPPORTED) + continue; + return r; + } + } + } + + usbi_err(ctx, "no libusb supported interfaces to complete request"); + return LIBUSB_ERROR_NOT_FOUND; +} + +static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + return priv->usb_interface[current_interface].apib-> + submit_bulk_transfer(priv->usb_interface[current_interface].sub_api, itransfer); +} + +static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) { + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); + return LIBUSB_ERROR_NOT_FOUND; + } + + return priv->usb_interface[current_interface].apib-> + submit_iso_transfer(priv->usb_interface[current_interface].sub_api, itransfer); +} + +static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int current_interface; + + current_interface = interface_by_endpoint(priv, handle_priv, endpoint); + if (current_interface < 0) { + usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); + return LIBUSB_ERROR_NOT_FOUND; + } + + return priv->usb_interface[current_interface].apib-> + clear_halt(priv->usb_interface[current_interface].sub_api, dev_handle, endpoint); +} + +static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->usb_interface[transfer_priv->interface_number].apib-> + abort_control(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer); +} + +static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->usb_interface[transfer_priv->interface_number].apib-> + abort_transfers(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer); +} + +static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle) +{ + struct windows_device_priv *priv = _device_priv(dev_handle->dev); + int r; + uint8_t i; + bool available[SUB_API_MAX]; + + for (i = 0; i < SUB_API_MAX; i++) + available[i] = false; + + for (i = 0; i < USB_MAXINTERFACES; i++) { + if ((priv->usb_interface[i].apib->id == USB_API_WINUSBX) + && (priv->usb_interface[i].sub_api != SUB_API_NOTSET)) + available[priv->usb_interface[i].sub_api] = true; + } + + for (i = 0; i < SUB_API_MAX; i++) { + if (available[i]) { + r = usb_api_backend[USB_API_WINUSBX].reset_device(i, dev_handle); + if (r != LIBUSB_SUCCESS) + return r; + } + } + + return LIBUSB_SUCCESS; +} + +static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); + struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); + + return priv->usb_interface[transfer_priv->interface_number].apib-> + copy_transfer_data(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer, io_size); +} + +#endif /* !USE_USBDK */ diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_winusb.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_winusb.h new file mode 100644 index 00000000..0c1580cd --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/os/windows_winusb.h @@ -0,0 +1,833 @@ +/* + * Windows backend for libusb 1.0 + * Copyright © 2009-2012 Pete Batard + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +#include "windows_common.h" +#include "windows_nt_common.h" + +#if defined(_MSC_VER) +// disable /W4 MSVC warnings that are benign +#pragma warning(disable:4100) // unreferenced formal parameter +#pragma warning(disable:4127) // conditional expression is constant +#pragma warning(disable:4201) // nameless struct/union +#pragma warning(disable:4214) // bit field types other than int +#pragma warning(disable:4996) // deprecated API calls +#pragma warning(disable:28159) // more deprecated API calls +#endif + +// Missing from MSVC6 setupapi.h +#if !defined(SPDRP_ADDRESS) +#define SPDRP_ADDRESS 28 +#endif +#if !defined(SPDRP_INSTALL_STATE) +#define SPDRP_INSTALL_STATE 34 +#endif + +#define MAX_CTRL_BUFFER_LENGTH 4096 +#define MAX_USB_DEVICES 256 +#define MAX_USB_STRING_LENGTH 128 +#define MAX_HID_REPORT_SIZE 1024 +#define MAX_HID_DESCRIPTOR_SIZE 256 +#define MAX_GUID_STRING_LENGTH 40 +#define MAX_PATH_LENGTH 128 +#define MAX_KEY_LENGTH 256 +#define LIST_SEPARATOR ';' + +// Handle code for HID interface that have been claimed ("dibs") +#define INTERFACE_CLAIMED ((HANDLE)(intptr_t)0xD1B5) +// Additional return code for HID operations that completed synchronously +#define LIBUSB_COMPLETED (LIBUSB_SUCCESS + 1) + +// http://msdn.microsoft.com/en-us/library/ff545978.aspx +// http://msdn.microsoft.com/en-us/library/ff545972.aspx +// http://msdn.microsoft.com/en-us/library/ff545982.aspx +#if !defined(GUID_DEVINTERFACE_USB_HOST_CONTROLLER) +const GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27} }; +#endif +#if !defined(GUID_DEVINTERFACE_USB_DEVICE) +const GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} }; +#endif +#if !defined(GUID_DEVINTERFACE_USB_HUB) +const GUID GUID_DEVINTERFACE_USB_HUB = { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8} }; +#endif +#if !defined(GUID_DEVINTERFACE_LIBUSB0_FILTER) +const GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = { 0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9} }; +#endif + + +/* + * Multiple USB API backend support + */ +#define USB_API_UNSUPPORTED 0 +#define USB_API_HUB 1 +#define USB_API_COMPOSITE 2 +#define USB_API_WINUSBX 3 +#define USB_API_HID 4 +#define USB_API_MAX 4 // hid is dead +// The following is used to indicate if the HID or composite extra props have already been set. +#define USB_API_SET (1 << USB_API_MAX) + +// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL) +// Must have the same values as the KUSB_DRVID enum from libusbk.h +#define SUB_API_NOTSET -1 +#define SUB_API_LIBUSBK 0 +#define SUB_API_LIBUSB0 1 +#define SUB_API_WINUSB 2 +#define SUB_API_MAX 3 + +#define WINUSBX_DRV_NAMES {"libusbK", "libusb0", "WinUSB"} + +struct windows_usb_api_backend { + const uint8_t id; + const char *designation; + const char **driver_name_list; // Driver name, without .sys, e.g. "usbccgp" + const uint8_t nb_driver_names; + int (*init)(int sub_api, struct libusb_context *ctx); + int (*exit)(int sub_api); + int (*open)(int sub_api, struct libusb_device_handle *dev_handle); + void (*close)(int sub_api, struct libusb_device_handle *dev_handle); + int (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface); + int (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); + int (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); + int (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); + int (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); + int (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle); + int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer); + int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer); + int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer); + int (*abort_control)(int sub_api, struct usbi_transfer *itransfer); + int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer); + int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); +}; + +extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX]; + +#define PRINT_UNSUPPORTED_API(fname) \ + usbi_dbg("unsupported API call for '" \ + #fname "' (unrecognized device driver)"); \ + return LIBUSB_ERROR_NOT_SUPPORTED; + +/* + * private structures definition + * with inline pseudo constructors/destructors + */ + +#define LIBUSB_DT_HID_SIZE 9 +#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \ + + LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE) +#define HID_MAX_REPORT_SIZE 1024 +#define HID_IN_EP 0x81 +#define HID_OUT_EP 0x02 +#define LIBUSB_REQ_RECIPIENT(request_type) ((request_type) & 0x1F) +#define LIBUSB_REQ_TYPE(request_type) ((request_type) & (0x03 << 5)) +#define LIBUSB_REQ_IN(request_type) ((request_type) & LIBUSB_ENDPOINT_IN) +#define LIBUSB_REQ_OUT(request_type) (!LIBUSB_REQ_IN(request_type)) + +// The following are used for HID reports IOCTLs +#define HID_CTL_CODE(id) \ + CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS) +#define HID_BUFFER_CTL_CODE(id) \ + CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_BUFFERED, FILE_ANY_ACCESS) +#define HID_IN_CTL_CODE_HIDHACK(id) \ + CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS) + +#define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) +#define IOCTL_HID_GET_INPUT_REPORT HID_OUT_CTL_CODE(104) +#define IOCTL_HID_SET_FEATURE HID_IN_CTL_CODE_HIDHACK(100) +#define IOCTL_HID_SET_OUTPUT_REPORT HID_IN_CTL_CODE_HIDHACK(101) + +enum libusb_hid_request_type { + HID_REQ_GET_REPORT = 0x01, + HID_REQ_GET_IDLE = 0x02, + HID_REQ_GET_PROTOCOL = 0x03, + HID_REQ_SET_REPORT = 0x09, + HID_REQ_SET_IDLE = 0x0A, + HID_REQ_SET_PROTOCOL = 0x0B +}; + +enum libusb_hid_report_type { + HID_REPORT_TYPE_INPUT = 0x01, + HID_REPORT_TYPE_OUTPUT = 0x02, + HID_REPORT_TYPE_FEATURE = 0x03 +}; + +struct hid_device_priv { + uint16_t vid; + uint16_t pid; + uint8_t config; + uint8_t nb_interfaces; + bool uses_report_ids[3]; // input, ouptput, feature + uint16_t input_report_size; + uint16_t output_report_size; + uint16_t feature_report_size; + WCHAR string[3][MAX_USB_STRING_LENGTH]; + uint8_t string_index[3]; // man, prod, ser +}; + +struct windows_device_priv { + uint8_t depth; // distance to HCD + uint8_t port; // port number on the hub + uint8_t active_config; + struct windows_usb_api_backend const *apib; + char *path; // device interface path + int sub_api; // for WinUSB-like APIs + struct { + char *path; // each interface needs a device interface path, + struct windows_usb_api_backend const *apib; // an API backend (multiple drivers support), + int sub_api; + int8_t nb_endpoints; // and a set of endpoint addresses (USB_MAXENDPOINTS) + uint8_t *endpoint; + bool restricted_functionality; // indicates if the interface functionality is restricted + // by Windows (eg. HID keyboards or mice cannot do R/W) + } usb_interface[USB_MAXINTERFACES]; + struct hid_device_priv *hid; + USB_DEVICE_DESCRIPTOR dev_descriptor; + unsigned char **config_descriptor; // list of pointers to the cached config descriptors +}; + +static inline struct windows_device_priv *_device_priv(struct libusb_device *dev) +{ + return (struct windows_device_priv *)dev->os_priv; +} + +static inline struct windows_device_priv *windows_device_priv_init(struct libusb_device *dev) +{ + struct windows_device_priv *p = _device_priv(dev); + int i; + + p->apib = &usb_api_backend[USB_API_UNSUPPORTED]; + p->sub_api = SUB_API_NOTSET; + for (i = 0; i < USB_MAXINTERFACES; i++) { + p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED]; + p->usb_interface[i].sub_api = SUB_API_NOTSET; + } + + return p; +} + +static inline void windows_device_priv_release(struct libusb_device *dev) +{ + struct windows_device_priv *p = _device_priv(dev); + int i; + + free(p->path); + if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) { + for (i = 0; i < dev->num_configurations; i++) + free(p->config_descriptor[i]); + } + free(p->config_descriptor); + free(p->hid); + for (i = 0; i < USB_MAXINTERFACES; i++) { + free(p->usb_interface[i].path); + free(p->usb_interface[i].endpoint); + } +} + +struct interface_handle_t { + HANDLE dev_handle; // WinUSB needs an extra handle for the file + HANDLE api_handle; // used by the API to communicate with the device +}; + +struct windows_device_handle_priv { + int active_interface; + struct interface_handle_t interface_handle[USB_MAXINTERFACES]; + int autoclaim_count[USB_MAXINTERFACES]; // For auto-release +}; + +static inline struct windows_device_handle_priv *_device_handle_priv( + struct libusb_device_handle *handle) +{ + return (struct windows_device_handle_priv *)handle->os_priv; +} + +// used for async polling functions +struct windows_transfer_priv { + struct winfd pollable_fd; + uint8_t interface_number; + uint8_t *hid_buffer; // 1 byte extended data buffer, required for HID + uint8_t *hid_dest; // transfer buffer destination, required for HID + size_t hid_expected_size; +}; + +// used to match a device driver (including filter drivers) against a supported API +struct driver_lookup { + char list[MAX_KEY_LENGTH + 1]; // REG_MULTI_SZ list of services (driver) names + const DWORD reg_prop; // SPDRP registry key to use to retrieve list + const char* designation; // internal designation (for debug output) +}; + +/* OLE32 dependency */ +DLL_DECLARE_HANDLE(OLE32); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID)); + +/* Kernel32 dependencies */ +DLL_DECLARE_HANDLE(Kernel32); +/* This call is only available from XP SP2 */ +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, IsWow64Process, (HANDLE, PBOOL)); + +/* SetupAPI dependencies */ +DLL_DECLARE_HANDLE(SetupAPI); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (const GUID*, PCSTR, HWND, DWORD)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA, + const GUID*, DWORD, PSP_DEVICE_INTERFACE_DATA)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, + PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO, + PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD)); + +/* AdvAPI32 dependencies */ +DLL_DECLARE_HANDLE(AdvAPI32); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); +DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); + +/* + * Windows DDK API definitions. Most of it copied from MinGW's includes + */ +typedef DWORD DEVNODE, DEVINST; +typedef DEVNODE *PDEVNODE, *PDEVINST; +typedef DWORD RETURN_TYPE; +typedef RETURN_TYPE CONFIGRET; + +#define CR_SUCCESS 0x00000000 +#define CR_NO_SUCH_DEVNODE 0x0000000D + +#define USB_DEVICE_DESCRIPTOR_TYPE LIBUSB_DT_DEVICE +#define USB_CONFIGURATION_DESCRIPTOR_TYPE LIBUSB_DT_CONFIG +#define USB_STRING_DESCRIPTOR_TYPE LIBUSB_DT_STRING +#define USB_INTERFACE_DESCRIPTOR_TYPE LIBUSB_DT_INTERFACE +#define USB_ENDPOINT_DESCRIPTOR_TYPE LIBUSB_DT_ENDPOINT + +#define USB_REQUEST_GET_STATUS LIBUSB_REQUEST_GET_STATUS +#define USB_REQUEST_CLEAR_FEATURE LIBUSB_REQUEST_CLEAR_FEATURE +#define USB_REQUEST_SET_FEATURE LIBUSB_REQUEST_SET_FEATURE +#define USB_REQUEST_SET_ADDRESS LIBUSB_REQUEST_SET_ADDRESS +#define USB_REQUEST_GET_DESCRIPTOR LIBUSB_REQUEST_GET_DESCRIPTOR +#define USB_REQUEST_SET_DESCRIPTOR LIBUSB_REQUEST_SET_DESCRIPTOR +#define USB_REQUEST_GET_CONFIGURATION LIBUSB_REQUEST_GET_CONFIGURATION +#define USB_REQUEST_SET_CONFIGURATION LIBUSB_REQUEST_SET_CONFIGURATION +#define USB_REQUEST_GET_INTERFACE LIBUSB_REQUEST_GET_INTERFACE +#define USB_REQUEST_SET_INTERFACE LIBUSB_REQUEST_SET_INTERFACE +#define USB_REQUEST_SYNC_FRAME LIBUSB_REQUEST_SYNCH_FRAME + +#define USB_GET_NODE_INFORMATION 258 +#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260 +#define USB_GET_NODE_CONNECTION_NAME 261 +#define USB_GET_HUB_CAPABILITIES 271 +#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX) +#define USB_GET_NODE_CONNECTION_INFORMATION_EX 274 +#endif +#if !defined(USB_GET_HUB_CAPABILITIES_EX) +#define USB_GET_HUB_CAPABILITIES_EX 276 +#endif +#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX_V2) +#define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 279 +#endif + +#ifndef METHOD_BUFFERED +#define METHOD_BUFFERED 0 +#endif +#ifndef FILE_ANY_ACCESS +#define FILE_ANY_ACCESS 0x00000000 +#endif +#ifndef FILE_DEVICE_UNKNOWN +#define FILE_DEVICE_UNKNOWN 0x00000022 +#endif +#ifndef FILE_DEVICE_USB +#define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN +#endif + +#ifndef CTL_CODE +#define CTL_CODE(DeviceType, Function, Method, Access) \ + (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) +#endif + +typedef enum USB_CONNECTION_STATUS { + NoDeviceConnected, + DeviceConnected, + DeviceFailedEnumeration, + DeviceGeneralFailure, + DeviceCausedOvercurrent, + DeviceNotEnoughPower, + DeviceNotEnoughBandwidth, + DeviceHubNestedTooDeeply, + DeviceInLegacyHub +} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; + +typedef enum USB_HUB_NODE { + UsbHub, + UsbMIParent +} USB_HUB_NODE; + +/* Cfgmgr32.dll interface */ +DLL_DECLARE_HANDLE(Cfgmgr32); +DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Sibling, (PDEVINST, DEVINST, ULONG)); +DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG)); + +#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \ + CTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_HUB_CAPABILITIES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_ROOT_HUB_NAME \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_INFORMATION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// Most of the structures below need to be packed +#pragma pack(push, 1) + +typedef struct USB_INTERFACE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bInterfaceNumber; + UCHAR bAlternateSetting; + UCHAR bNumEndpoints; + UCHAR bInterfaceClass; + UCHAR bInterfaceSubClass; + UCHAR bInterfaceProtocol; + UCHAR iInterface; +} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; + +typedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT { + struct { + ULONG ConnectionIndex; + struct { + UCHAR bmRequest; + UCHAR bRequest; + USHORT wValue; + USHORT wIndex; + USHORT wLength; + } SetupPacket; + } req; + USB_CONFIGURATION_DESCRIPTOR data; +} USB_CONFIGURATION_DESCRIPTOR_SHORT; + +typedef struct USB_ENDPOINT_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bEndpointAddress; + UCHAR bmAttributes; + USHORT wMaxPacketSize; + UCHAR bInterval; +} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; + +typedef struct USB_DESCRIPTOR_REQUEST { + ULONG ConnectionIndex; + struct { + UCHAR bmRequest; + UCHAR bRequest; + USHORT wValue; + USHORT wIndex; + USHORT wLength; + } SetupPacket; +// UCHAR Data[0]; +} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; + +typedef struct USB_HUB_DESCRIPTOR { + UCHAR bDescriptorLength; + UCHAR bDescriptorType; + UCHAR bNumberOfPorts; + USHORT wHubCharacteristics; + UCHAR bPowerOnToPowerGood; + UCHAR bHubControlCurrent; + UCHAR bRemoveAndPowerMask[64]; +} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR; + +typedef struct USB_ROOT_HUB_NAME { + ULONG ActualLength; + WCHAR RootHubName[1]; +} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; + +typedef struct USB_ROOT_HUB_NAME_FIXED { + ULONG ActualLength; + WCHAR RootHubName[MAX_PATH_LENGTH]; +} USB_ROOT_HUB_NAME_FIXED; + +typedef struct USB_NODE_CONNECTION_NAME { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR NodeName[1]; +} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; + +typedef struct USB_NODE_CONNECTION_NAME_FIXED { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR NodeName[MAX_PATH_LENGTH]; +} USB_NODE_CONNECTION_NAME_FIXED; + +typedef struct USB_HUB_NAME_FIXED { + union { + USB_ROOT_HUB_NAME_FIXED root; + USB_NODE_CONNECTION_NAME_FIXED node; + } u; +} USB_HUB_NAME_FIXED; + +typedef struct USB_HUB_INFORMATION { + USB_HUB_DESCRIPTOR HubDescriptor; + BOOLEAN HubIsBusPowered; +} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; + +typedef struct USB_MI_PARENT_INFORMATION { + ULONG NumberOfInterfaces; +} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; + +typedef struct USB_NODE_INFORMATION { + USB_HUB_NODE NodeType; + union { + USB_HUB_INFORMATION HubInformation; + USB_MI_PARENT_INFORMATION MiParentInformation; + } u; +} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; + +typedef struct USB_PIPE_INFO { + USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + ULONG ScheduleOffset; +} USB_PIPE_INFO, *PUSB_PIPE_INFO; + +typedef struct USB_NODE_CONNECTION_INFORMATION_EX { + ULONG ConnectionIndex; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + UCHAR CurrentConfigurationValue; + UCHAR Speed; + BOOLEAN DeviceIsHub; + USHORT DeviceAddress; + ULONG NumberOfOpenPipes; + USB_CONNECTION_STATUS ConnectionStatus; +// USB_PIPE_INFO PipeList[0]; +} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX; + +typedef union _USB_PROTOCOLS { + ULONG ul; + struct { + ULONG Usb110:1; + ULONG Usb200:1; + ULONG Usb300:1; + ULONG ReservedMBZ:29; + }; +} USB_PROTOCOLS, *PUSB_PROTOCOLS; + +typedef union _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS { + ULONG ul; + struct { + ULONG DeviceIsOperatingAtSuperSpeedOrHigher:1; + ULONG DeviceIsSuperSpeedCapableOrHigher:1; + ULONG ReservedMBZ:30; + }; +} USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS; + +typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 { + ULONG ConnectionIndex; + ULONG Length; + USB_PROTOCOLS SupportedUsbProtocols; + USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags; +} USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2; + +typedef struct USB_HUB_CAP_FLAGS { + ULONG HubIsHighSpeedCapable:1; + ULONG HubIsHighSpeed:1; + ULONG HubIsMultiTtCapable:1; + ULONG HubIsMultiTt:1; + ULONG HubIsRoot:1; + ULONG HubIsArmedWakeOnConnect:1; + ULONG ReservedMBZ:26; +} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS; + +typedef struct USB_HUB_CAPABILITIES { + ULONG HubIs2xCapable:1; +} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; + +typedef struct USB_HUB_CAPABILITIES_EX { + USB_HUB_CAP_FLAGS CapabilityFlags; +} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX; + +#pragma pack(pop) + +/* winusb.dll interface */ + +#define SHORT_PACKET_TERMINATE 0x01 +#define AUTO_CLEAR_STALL 0x02 +#define PIPE_TRANSFER_TIMEOUT 0x03 +#define IGNORE_SHORT_PACKETS 0x04 +#define ALLOW_PARTIAL_READS 0x05 +#define AUTO_FLUSH 0x06 +#define RAW_IO 0x07 +#define MAXIMUM_TRANSFER_SIZE 0x08 +#define AUTO_SUSPEND 0x81 +#define SUSPEND_DELAY 0x83 +#define DEVICE_SPEED 0x01 +#define LowSpeed 0x01 +#define FullSpeed 0x02 +#define HighSpeed 0x03 + +typedef enum USBD_PIPE_TYPE { + UsbdPipeTypeControl, + UsbdPipeTypeIsochronous, + UsbdPipeTypeBulk, + UsbdPipeTypeInterrupt +} USBD_PIPE_TYPE; + +typedef struct { + USBD_PIPE_TYPE PipeType; + UCHAR PipeId; + USHORT MaximumPacketSize; + UCHAR Interval; +} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION; + +#pragma pack(1) +typedef struct { + UCHAR request_type; + UCHAR request; + USHORT value; + USHORT index; + USHORT length; +} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET; +#pragma pack() + +typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; + +typedef BOOL (WINAPI *WinUsb_AbortPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID +); +typedef BOOL (WINAPI *WinUsb_ControlTransfer_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + WINUSB_SETUP_PACKET SetupPacket, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +); +typedef BOOL (WINAPI *WinUsb_FlushPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID +); +typedef BOOL (WINAPI *WinUsb_Free_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AssociatedInterfaceIndex, + PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_GetCurrentAlternateSetting_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + PUCHAR AlternateSetting +); +typedef BOOL (WINAPI *WinUsb_GetDescriptor_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR DescriptorType, + UCHAR Index, + USHORT LanguageID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred +); +typedef BOOL (WINAPI *WinUsb_GetOverlappedResult_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + LPOVERLAPPED lpOverlapped, + LPDWORD lpNumberOfBytesTransferred, + BOOL bWait +); +typedef BOOL (WINAPI *WinUsb_GetPipePolicy_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + ULONG PolicyType, + PULONG ValueLength, + PVOID Value +); +typedef BOOL (WINAPI *WinUsb_GetPowerPolicy_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + ULONG PolicyType, + PULONG ValueLength, + PVOID Value +); +typedef BOOL (WINAPI *WinUsb_Initialize_t)( + HANDLE DeviceHandle, + PWINUSB_INTERFACE_HANDLE InterfaceHandle +); +typedef BOOL (WINAPI *WinUsb_QueryDeviceInformation_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + ULONG InformationType, + PULONG BufferLength, + PVOID Buffer +); +typedef BOOL (WINAPI *WinUsb_QueryInterfaceSettings_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AlternateSettingNumber, + PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor +); +typedef BOOL (WINAPI *WinUsb_QueryPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AlternateInterfaceNumber, + UCHAR PipeIndex, + PWINUSB_PIPE_INFORMATION PipeInformation +); +typedef BOOL (WINAPI *WinUsb_ReadPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +); +typedef BOOL (WINAPI *WinUsb_ResetPipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID +); +typedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AlternateSetting +); +typedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + ULONG PolicyType, + ULONG ValueLength, + PVOID Value +); +typedef BOOL (WINAPI *WinUsb_SetPowerPolicy_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + ULONG PolicyType, + ULONG ValueLength, + PVOID Value +); +typedef BOOL (WINAPI *WinUsb_WritePipe_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +); +typedef BOOL (WINAPI *WinUsb_ResetDevice_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle +); + +/* /!\ These must match the ones from the official libusbk.h */ +typedef enum _KUSB_FNID { + KUSB_FNID_Init, + KUSB_FNID_Free, + KUSB_FNID_ClaimInterface, + KUSB_FNID_ReleaseInterface, + KUSB_FNID_SetAltInterface, + KUSB_FNID_GetAltInterface, + KUSB_FNID_GetDescriptor, + KUSB_FNID_ControlTransfer, + KUSB_FNID_SetPowerPolicy, + KUSB_FNID_GetPowerPolicy, + KUSB_FNID_SetConfiguration, + KUSB_FNID_GetConfiguration, + KUSB_FNID_ResetDevice, + KUSB_FNID_Initialize, + KUSB_FNID_SelectInterface, + KUSB_FNID_GetAssociatedInterface, + KUSB_FNID_Clone, + KUSB_FNID_QueryInterfaceSettings, + KUSB_FNID_QueryDeviceInformation, + KUSB_FNID_SetCurrentAlternateSetting, + KUSB_FNID_GetCurrentAlternateSetting, + KUSB_FNID_QueryPipe, + KUSB_FNID_SetPipePolicy, + KUSB_FNID_GetPipePolicy, + KUSB_FNID_ReadPipe, + KUSB_FNID_WritePipe, + KUSB_FNID_ResetPipe, + KUSB_FNID_AbortPipe, + KUSB_FNID_FlushPipe, + KUSB_FNID_IsoReadPipe, + KUSB_FNID_IsoWritePipe, + KUSB_FNID_GetCurrentFrameNumber, + KUSB_FNID_GetOverlappedResult, + KUSB_FNID_GetProperty, + KUSB_FNID_COUNT, +} KUSB_FNID; + +typedef struct _KLIB_VERSION { + INT Major; + INT Minor; + INT Micro; + INT Nano; +} KLIB_VERSION; +typedef KLIB_VERSION* PKLIB_VERSION; + +typedef BOOL (WINAPI *LibK_GetProcAddress_t)( + PVOID *ProcAddress, + ULONG DriverID, + ULONG FunctionID +); + +typedef VOID (WINAPI *LibK_GetVersion_t)( + PKLIB_VERSION Version +); + +struct winusb_interface { + bool initialized; + WinUsb_AbortPipe_t AbortPipe; + WinUsb_ControlTransfer_t ControlTransfer; + WinUsb_FlushPipe_t FlushPipe; + WinUsb_Free_t Free; + WinUsb_GetAssociatedInterface_t GetAssociatedInterface; + WinUsb_GetCurrentAlternateSetting_t GetCurrentAlternateSetting; + WinUsb_GetDescriptor_t GetDescriptor; + WinUsb_GetOverlappedResult_t GetOverlappedResult; + WinUsb_GetPipePolicy_t GetPipePolicy; + WinUsb_GetPowerPolicy_t GetPowerPolicy; + WinUsb_Initialize_t Initialize; + WinUsb_QueryDeviceInformation_t QueryDeviceInformation; + WinUsb_QueryInterfaceSettings_t QueryInterfaceSettings; + WinUsb_QueryPipe_t QueryPipe; + WinUsb_ReadPipe_t ReadPipe; + WinUsb_ResetPipe_t ResetPipe; + WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting; + WinUsb_SetPipePolicy_t SetPipePolicy; + WinUsb_SetPowerPolicy_t SetPowerPolicy; + WinUsb_WritePipe_t WritePipe; + WinUsb_ResetDevice_t ResetDevice; +}; + +/* hid.dll interface */ + +typedef USHORT USAGE; diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/strerror.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/strerror.c new file mode 100644 index 00000000..d2be0e2a --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/strerror.c @@ -0,0 +1,202 @@ +/* + * libusb strerror code + * Copyright © 2013 Hans de Goede + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#if defined(HAVE_STRINGS_H) +#include +#endif + +#include "libusbi.h" + +#if defined(_MSC_VER) +#define strncasecmp _strnicmp +#endif + +static size_t usbi_locale = 0; + +/** \ingroup libusb_misc + * How to add a new \ref libusb_strerror() translation: + *
    + *
  1. Download the latest \c strerror.c from:
    + * https://raw.github.com/libusb/libusb/master/libusb/sterror.c
  2. + *
  3. Open the file in an UTF-8 capable editor
  4. + *
  5. Add the 2 letter ISO 639-1 + * code for your locale at the end of \c usbi_locale_supported[]
    + * Eg. for Chinese, you would add "zh" so that: + * \code... usbi_locale_supported[] = { "en", "nl", "fr" };\endcode + * becomes: + * \code... usbi_locale_supported[] = { "en", "nl", "fr", "zh" };\endcode
  6. + *
  7. Copy the { / * English (en) * / ... } section and add it at the end of \c usbi_localized_errors
    + * Eg. for Chinese, the last section of \c usbi_localized_errors could look like: + * \code + * }, { / * Chinese (zh) * / + * "Success", + * ... + * "Other error", + * } + * };\endcode
  8. + *
  9. Translate each of the English messages from the section you copied into your language
  10. + *
  11. Save the file (in UTF-8 format) and send it to \c libusb-devel\@lists.sourceforge.net
  12. + *
+ */ + +static const char* usbi_locale_supported[] = { "en", "nl", "fr", "ru" }; +static const char* usbi_localized_errors[ARRAYSIZE(usbi_locale_supported)][LIBUSB_ERROR_COUNT] = { + { /* English (en) */ + "Success", + "Input/Output Error", + "Invalid parameter", + "Access denied (insufficient permissions)", + "No such device (it may have been disconnected)", + "Entity not found", + "Resource busy", + "Operation timed out", + "Overflow", + "Pipe error", + "System call interrupted (perhaps due to signal)", + "Insufficient memory", + "Operation not supported or unimplemented on this platform", + "Other error", + }, { /* Dutch (nl) */ + "Gelukt", + "Invoer-/uitvoerfout", + "Ongeldig argument", + "Toegang geweigerd (onvoldoende toegangsrechten)", + "Apparaat bestaat niet (verbinding met apparaat verbroken?)", + "Niet gevonden", + "Apparaat of hulpbron is bezig", + "Bewerking verlopen", + "Waarde is te groot", + "Gebroken pijp", + "Onderbroken systeemaanroep", + "Onvoldoende geheugen beschikbaar", + "Bewerking wordt niet ondersteund", + "Andere fout", + }, { /* French (fr) */ + "Succès", + "Erreur d'entrée/sortie", + "Paramètre invalide", + "Accès refusé (permissions insuffisantes)", + "Périphérique introuvable (peut-être déconnecté)", + "Elément introuvable", + "Resource déjà occupée", + "Operation expirée", + "Débordement", + "Erreur de pipe", + "Appel système abandonné (peut-être à cause d’un signal)", + "Mémoire insuffisante", + "Opération non supportée or non implémentée sur cette plateforme", + "Autre erreur", + }, { /* Russian (ru) */ + "УÑпех", + "Ошибка ввода/вывода", + "Ðеверный параметр", + "ДоÑтуп запрещён (не хватает прав)", + "УÑтройÑтво отÑутÑтвует (возможно, оно было отÑоединено)", + "Элемент не найден", + "РеÑÑƒÑ€Ñ Ð·Ð°Ð½ÑÑ‚", + "ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸", + "Переполнение", + "Ошибка канала", + "СиÑтемный вызов прерван (возможно, Ñигналом)", + "ПамÑÑ‚ÑŒ иÑчерпана", + "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ Ð´Ð°Ð½Ð½Ð¾Ð¹ платформой", + "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" + } +}; + +/** \ingroup libusb_misc + * Set the language, and only the language, not the encoding! used for + * translatable libusb messages. + * + * This takes a locale string in the default setlocale format: lang[-region] + * or lang[_country_region][.codeset]. Only the lang part of the string is + * used, and only 2 letter ISO 639-1 codes are accepted for it, such as "de". + * The optional region, country_region or codeset parts are ignored. This + * means that functions which return translatable strings will NOT honor the + * specified encoding. + * All strings returned are encoded as UTF-8 strings. + * + * If libusb_setlocale() is not called, all messages will be in English. + * + * The following functions return translatable strings: libusb_strerror(). + * Note that the libusb log messages controlled through libusb_set_debug() + * are not translated, they are always in English. + * + * For POSIX UTF-8 environments if you want libusb to follow the standard + * locale settings, call libusb_setlocale(setlocale(LC_MESSAGES, NULL)), + * after your app has done its locale setup. + * + * \param locale locale-string in the form of lang[_country_region][.codeset] + * or lang[-region], where lang is a 2 letter ISO 639-1 code + * \returns LIBUSB_SUCCESS on success + * \returns LIBUSB_ERROR_INVALID_PARAM if the locale doesn't meet the requirements + * \returns LIBUSB_ERROR_NOT_FOUND if the requested language is not supported + * \returns a LIBUSB_ERROR code on other errors + */ + +int API_EXPORTED libusb_setlocale(const char *locale) +{ + size_t i; + + if ( (locale == NULL) || (strlen(locale) < 2) + || ((strlen(locale) > 2) && (locale[2] != '-') && (locale[2] != '_') && (locale[2] != '.')) ) + return LIBUSB_ERROR_INVALID_PARAM; + + for (i=0; i= ARRAYSIZE(usbi_locale_supported)) { + return LIBUSB_ERROR_NOT_FOUND; + } + + usbi_locale = i; + + return LIBUSB_SUCCESS; +} + +/** \ingroup libusb_misc + * Returns a constant string with a short description of the given error code, + * this description is intended for displaying to the end user and will be in + * the language set by libusb_setlocale(). + * + * The returned string is encoded in UTF-8. + * + * The messages always start with a capital letter and end without any dot. + * The caller must not free() the returned string. + * + * \param errcode the error code whose description is desired + * \returns a short description of the error code in UTF-8 encoding + */ +DEFAULT_VISIBILITY const char* LIBUSB_CALL libusb_strerror(enum libusb_error errcode) +{ + int errcode_index = -errcode; + + if ((errcode_index < 0) || (errcode_index >= LIBUSB_ERROR_COUNT)) { + /* "Other Error", which should always be our last message, is returned */ + errcode_index = LIBUSB_ERROR_COUNT - 1; + } + + return usbi_localized_errors[usbi_locale][errcode_index]; +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/sync.c b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/sync.c new file mode 100644 index 00000000..375d1cf5 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/sync.c @@ -0,0 +1,421 @@ +/* + * Synchronous I/O functions for libusb + * Copyright © 2007-2008 Daniel Drake + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include + +#include "libusbi.h" + +/** + * @defgroup libusb_syncio Synchronous device I/O + * + * This page documents libusb's synchronous (blocking) API for USB device I/O. + * This interface is easy to use but has some limitations. More advanced users + * may wish to consider using the \ref libusb_asyncio "asynchronous I/O API" instead. + */ + +static void LIBUSB_CALL sync_transfer_cb(struct libusb_transfer *transfer) +{ + int *completed = transfer->user_data; + *completed = 1; + usbi_dbg("actual_length=%d", transfer->actual_length); + /* caller interprets result and frees transfer */ +} + +static void sync_transfer_wait_for_completion(struct libusb_transfer *transfer) +{ + int r, *completed = transfer->user_data; + struct libusb_context *ctx = HANDLE_CTX(transfer->dev_handle); + + while (!*completed) { + r = libusb_handle_events_completed(ctx, completed); + if (r < 0) { + if (r == LIBUSB_ERROR_INTERRUPTED) + continue; + usbi_err(ctx, "libusb_handle_events failed: %s, cancelling transfer and retrying", + libusb_error_name(r)); + libusb_cancel_transfer(transfer); + continue; + } + } +} + +/** \ingroup libusb_syncio + * Perform a USB control transfer. + * + * The direction of the transfer is inferred from the bmRequestType field of + * the setup packet. + * + * The wValue, wIndex and wLength fields values should be given in host-endian + * byte order. + * + * \param dev_handle a handle for the device to communicate with + * \param bmRequestType the request type field for the setup packet + * \param bRequest the request field for the setup packet + * \param wValue the value field for the setup packet + * \param wIndex the index field for the setup packet + * \param data a suitably-sized data buffer for either input or output + * (depending on direction bits within bmRequestType) + * \param wLength the length field for the setup packet. The data buffer should + * be at least this size. + * \param timeout timeout (in millseconds) that this function should wait + * before giving up due to no response being received. For an unlimited + * timeout, use value 0. + * \returns on success, the number of bytes actually transferred + * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out + * \returns LIBUSB_ERROR_PIPE if the control request was not supported by the + * device + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_BUSY if called from event handling context + * \returns LIBUSB_ERROR_INVALID_PARAM if the transfer size is larger than + * the operating system and/or hardware can support + * \returns another LIBUSB_ERROR code on other failures + */ +int API_EXPORTED libusb_control_transfer(libusb_device_handle *dev_handle, + uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, + unsigned char *data, uint16_t wLength, unsigned int timeout) +{ + struct libusb_transfer *transfer; + unsigned char *buffer; + int completed = 0; + int r; + + if (usbi_handling_events(HANDLE_CTX(dev_handle))) + return LIBUSB_ERROR_BUSY; + + transfer = libusb_alloc_transfer(0); + if (!transfer) + return LIBUSB_ERROR_NO_MEM; + + buffer = (unsigned char*) malloc(LIBUSB_CONTROL_SETUP_SIZE + wLength); + if (!buffer) { + libusb_free_transfer(transfer); + return LIBUSB_ERROR_NO_MEM; + } + + libusb_fill_control_setup(buffer, bmRequestType, bRequest, wValue, wIndex, + wLength); + if ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT) + memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, data, wLength); + + libusb_fill_control_transfer(transfer, dev_handle, buffer, + sync_transfer_cb, &completed, timeout); + transfer->flags = LIBUSB_TRANSFER_FREE_BUFFER; + r = libusb_submit_transfer(transfer); + if (r < 0) { + libusb_free_transfer(transfer); + return r; + } + + sync_transfer_wait_for_completion(transfer); + + if ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) + memcpy(data, libusb_control_transfer_get_data(transfer), + transfer->actual_length); + + switch (transfer->status) { + case LIBUSB_TRANSFER_COMPLETED: + r = transfer->actual_length; + break; + case LIBUSB_TRANSFER_TIMED_OUT: + r = LIBUSB_ERROR_TIMEOUT; + break; + case LIBUSB_TRANSFER_STALL: + r = LIBUSB_ERROR_PIPE; + break; + case LIBUSB_TRANSFER_NO_DEVICE: + r = LIBUSB_ERROR_NO_DEVICE; + break; + case LIBUSB_TRANSFER_OVERFLOW: + r = LIBUSB_ERROR_OVERFLOW; + break; + case LIBUSB_TRANSFER_ERROR: + case LIBUSB_TRANSFER_CANCELLED: + r = LIBUSB_ERROR_IO; + break; + default: + usbi_warn(HANDLE_CTX(dev_handle), + "unrecognised status code %d", transfer->status); + r = LIBUSB_ERROR_OTHER; + } + + libusb_free_transfer(transfer); + return r; +} + +// ============= TREZORD LIBUSB CODE ============ + +// libusb does not have the option to cancel transfers, made through sync API +// however, we did not want to rewrite everything into async API and +// basically re-implement sync.c in go +// -> so I added a function that kills running transfers on a device +// +// It works because I know there is always only 1 transfer running on 1 device, +// because of mutexes in the golang code + +#define MAX_SAVED_TRANSFERS 256 +struct running_transfer { + struct libusb_device_handle *dev_handle; + struct libusb_transfer *transfer; +}; +static struct running_transfer running_transfers[MAX_SAVED_TRANSFERS]; +// it will fail with >256 transfers, but since we limit 1 trezor to 1 transfer, +// that would mean 256 concurrent connected trezors +// - and also it doesn't fail that terribly, it just doesn't cancel the transfers + +static usbi_mutex_static_t running_transfers_lock = USBI_MUTEX_INITIALIZER; + +static void save_running_transfer(struct libusb_device_handle *dev_handle, struct libusb_transfer *transfer) { + usbi_dbg("wait for lock"); + usbi_mutex_static_lock(&running_transfers_lock); + usbi_dbg("wait for lock finished"); + int i = 0; + for (i = 0; i < MAX_SAVED_TRANSFERS; i++) { + if (running_transfers[i].dev_handle == NULL) { + usbi_dbg("saved at %d", i); + running_transfers[i].dev_handle = dev_handle; + running_transfers[i].transfer = transfer; + usbi_mutex_static_unlock(&running_transfers_lock); + return; + } + } + usbi_dbg("not saved"); + usbi_mutex_static_unlock(&running_transfers_lock); +} + +static struct libusb_transfer* get_and_remove_running_transfer(struct libusb_device_handle *dev_handle) { + usbi_dbg("wait for lock"); + usbi_mutex_static_lock(&running_transfers_lock); + usbi_dbg("wait for lock finished"); + int i = 0; + for (i = 0; i < MAX_SAVED_TRANSFERS; i++) { + if (running_transfers[i].dev_handle == dev_handle) { + usbi_dbg("got at %d", i); + struct libusb_transfer* res = running_transfers[i].transfer; + running_transfers[i].dev_handle = NULL; + running_transfers[i].transfer = NULL; + usbi_mutex_static_unlock(&running_transfers_lock); + return res; + } + } + usbi_dbg("did not get any"); + usbi_mutex_static_unlock(&running_transfers_lock); + return NULL; +} + +void API_EXPORTED libusb_cancel_sync_transfers_on_device(struct libusb_device_handle *dev_handle) { + struct libusb_transfer* t = get_and_remove_running_transfer(dev_handle); + if (t != NULL){ + libusb_cancel_transfer(t); + } +} + +// ============= TREZORD LIBUSB CODE END ======== + +static int do_sync_bulk_transfer(struct libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *buffer, int length, + int *transferred, unsigned int timeout, unsigned char type) +{ + usbi_dbg("start"); + struct libusb_transfer *transfer; + int completed = 0; + int r; + + if (usbi_handling_events(HANDLE_CTX(dev_handle))) { + usbi_dbg("busy"); + return LIBUSB_ERROR_BUSY; + } + + transfer = libusb_alloc_transfer(0); + if (!transfer) { + usbi_dbg("no memory"); + return LIBUSB_ERROR_NO_MEM; + } + + libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer, length, + sync_transfer_cb, &completed, timeout); + transfer->type = type; + + usbi_dbg("submit transfer"); + r = libusb_submit_transfer(transfer); + if (r < 0) { + usbi_dbg("errored, try to free, returning original error %d", r); + libusb_free_transfer(transfer); + return r; + } + + usbi_dbg("save_running_transfer"); + save_running_transfer(dev_handle, transfer); + + usbi_dbg("sync_transfer_wait_for_completion"); + sync_transfer_wait_for_completion(transfer); + + // removing the transfer from the saved structure + usbi_dbg("get_and_remove_running_transfer"); + get_and_remove_running_transfer(dev_handle); + + if (transferred) + *transferred = transfer->actual_length; + + switch (transfer->status) { + case LIBUSB_TRANSFER_COMPLETED: + usbi_dbg("completed"); + r = 0; + break; + case LIBUSB_TRANSFER_TIMED_OUT: + usbi_dbg("timed out"); + r = LIBUSB_ERROR_TIMEOUT; + break; + case LIBUSB_TRANSFER_STALL: + usbi_dbg("stall / pipe"); + r = LIBUSB_ERROR_PIPE; + break; + case LIBUSB_TRANSFER_OVERFLOW: + usbi_dbg("overflow"); + r = LIBUSB_ERROR_OVERFLOW; + break; + case LIBUSB_TRANSFER_NO_DEVICE: + usbi_dbg("no device"); + r = LIBUSB_ERROR_NO_DEVICE; + break; + case LIBUSB_TRANSFER_ERROR: + usbi_dbg("transfer error"); + r = LIBUSB_ERROR_IO; + break; + case LIBUSB_TRANSFER_CANCELLED: + usbi_dbg("cancelled"); + r = LIBUSB_ERROR_IO; + break; + default: + usbi_warn(HANDLE_CTX(dev_handle), + "unrecognised status code %d", transfer->status); + r = LIBUSB_ERROR_OTHER; + } + + usbi_dbg("regular freeing"); + libusb_free_transfer(transfer); + return r; +} + +/** \ingroup libusb_syncio + * Perform a USB bulk transfer. The direction of the transfer is inferred from + * the direction bits of the endpoint address. + * + * For bulk reads, the length field indicates the maximum length of + * data you are expecting to receive. If less data arrives than expected, + * this function will return that data, so be sure to check the + * transferred output parameter. + * + * You should also check the transferred parameter for bulk writes. + * Not all of the data may have been written. + * + * Also check transferred when dealing with a timeout error code. + * libusb may have to split your transfer into a number of chunks to satisfy + * underlying O/S requirements, meaning that the timeout may expire after + * the first few chunks have completed. libusb is careful not to lose any data + * that may have been transferred; do not assume that timeout conditions + * indicate a complete lack of I/O. + * + * \param dev_handle a handle for the device to communicate with + * \param endpoint the address of a valid endpoint to communicate with + * \param data a suitably-sized data buffer for either input or output + * (depending on endpoint) + * \param length for bulk writes, the number of bytes from data to be sent. for + * bulk reads, the maximum number of bytes to receive into the data buffer. + * \param transferred output location for the number of bytes actually + * transferred. Since version 1.0.21 (\ref LIBUSB_API_VERSION >= 0x01000105), + * it is legal to pass a NULL pointer if you do not wish to receive this + * information. + * \param timeout timeout (in millseconds) that this function should wait + * before giving up due to no response being received. For an unlimited + * timeout, use value 0. + * + * \returns 0 on success (and populates transferred) + * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out (and populates + * transferred) + * \returns LIBUSB_ERROR_PIPE if the endpoint halted + * \returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see + * \ref libusb_packetoverflow + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_BUSY if called from event handling context + * \returns another LIBUSB_ERROR code on other failures + */ +int API_EXPORTED libusb_bulk_transfer(struct libusb_device_handle *dev_handle, + unsigned char endpoint, unsigned char *data, int length, int *transferred, + unsigned int timeout) +{ + return do_sync_bulk_transfer(dev_handle, endpoint, data, length, + transferred, timeout, LIBUSB_TRANSFER_TYPE_BULK); +} + +/** \ingroup libusb_syncio + * Perform a USB interrupt transfer. The direction of the transfer is inferred + * from the direction bits of the endpoint address. + * + * For interrupt reads, the length field indicates the maximum length + * of data you are expecting to receive. If less data arrives than expected, + * this function will return that data, so be sure to check the + * transferred output parameter. + * + * You should also check the transferred parameter for interrupt + * writes. Not all of the data may have been written. + * + * Also check transferred when dealing with a timeout error code. + * libusb may have to split your transfer into a number of chunks to satisfy + * underlying O/S requirements, meaning that the timeout may expire after + * the first few chunks have completed. libusb is careful not to lose any data + * that may have been transferred; do not assume that timeout conditions + * indicate a complete lack of I/O. + * + * The default endpoint bInterval value is used as the polling interval. + * + * \param dev_handle a handle for the device to communicate with + * \param endpoint the address of a valid endpoint to communicate with + * \param data a suitably-sized data buffer for either input or output + * (depending on endpoint) + * \param length for bulk writes, the number of bytes from data to be sent. for + * bulk reads, the maximum number of bytes to receive into the data buffer. + * \param transferred output location for the number of bytes actually + * transferred. Since version 1.0.21 (\ref LIBUSB_API_VERSION >= 0x01000105), + * it is legal to pass a NULL pointer if you do not wish to receive this + * information. + * \param timeout timeout (in millseconds) that this function should wait + * before giving up due to no response being received. For an unlimited + * timeout, use value 0. + * + * \returns 0 on success (and populates transferred) + * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out + * \returns LIBUSB_ERROR_PIPE if the endpoint halted + * \returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see + * \ref libusb_packetoverflow + * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected + * \returns LIBUSB_ERROR_BUSY if called from event handling context + * \returns another LIBUSB_ERROR code on other error + */ +int API_EXPORTED libusb_interrupt_transfer( + struct libusb_device_handle *dev_handle, unsigned char endpoint, + unsigned char *data, int length, int *transferred, unsigned int timeout) +{ + return do_sync_bulk_transfer(dev_handle, endpoint, data, length, + transferred, timeout, LIBUSB_TRANSFER_TYPE_INTERRUPT); +} diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/version.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/version.h new file mode 100644 index 00000000..6ce48a7d --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/version.h @@ -0,0 +1,18 @@ +/* This file is parsed by m4 and windres and RC.EXE so please keep it simple. */ +#include "version_nano.h" +#ifndef LIBUSB_MAJOR +#define LIBUSB_MAJOR 1 +#endif +#ifndef LIBUSB_MINOR +#define LIBUSB_MINOR 0 +#endif +#ifndef LIBUSB_MICRO +#define LIBUSB_MICRO 21 +#endif +#ifndef LIBUSB_NANO +#define LIBUSB_NANO 0 +#endif +/* LIBUSB_RC is the release candidate suffix. Should normally be empty. */ +#ifndef LIBUSB_RC +#define LIBUSB_RC "" +#endif diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/version_nano.h b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/version_nano.h new file mode 100644 index 00000000..0a5d1c99 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/c/version_nano.h @@ -0,0 +1 @@ +#define LIBUSB_NANO 11182 diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/libusb.go b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/libusb.go new file mode 100644 index 00000000..58bd82f6 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/libusb.go @@ -0,0 +1,1439 @@ +// +build linux,cgo freebsd,cgo darwin,!ios,cgo windows,cgo + +//----------------------------------------------------------------------------- +/* + +Golang wrapper for libusb-1.0 + +Copyright (c) 2017 Jason T. Harris + +*/ +//----------------------------------------------------------------------------- + +// Package libusb provides go wrappers for libusb-1.0 +package libusb + +/* + +extern void goLibusbLog(const char *s); + +#define ENABLE_LOGGING 1 +#define ENABLE_DEBUG_LOGGING 1 +#define ENUM_DEBUG + +#cgo CFLAGS: -I./c + +#cgo linux CFLAGS: -DDEFAULT_VISIBILITY="" -DOS_LINUX -D_GNU_SOURCE -DPOLL_NFDS_TYPE=int +#cgo linux,!android LDFLAGS: -lrt +#cgo freebsd CFLAGS: -DOS_FREEBSD +#cgo freebsd LDFLAGS: -lusb +#cgo darwin CFLAGS: -DOS_DARWIN -DDEFAULT_VISIBILITY="" -DPOLL_NFDS_TYPE="unsigned int" +#cgo darwin LDFLAGS: -framework CoreFoundation -framework IOKit -lobjc +#cgo windows CFLAGS: -DOS_WINDOWS -DDEFAULT_VISIBILITY="" -DPOLL_NFDS_TYPE="unsigned int" +#cgo windows LDFLAGS: -lsetupapi + + +#ifdef OS_LINUX + #include + + #include "os/threads_posix.c" + #include "os/poll_posix.c" + #include "os/linux_usbfs.c" + #include "os/linux_netlink.c" +#elif OS_FREEBSD + #include +#elif OS_DARWIN + #include + + #include "os/threads_posix.c" + #include "os/poll_posix.c" + #include "os/darwin_usb.c" +#elif OS_WINDOWS + #include + + #include "os/poll_windows.c" + #include "os/threads_windows.c" +#endif + +#ifndef OS_FREEBSD + #include "core.c" + #include "descriptor.c" + #include "hotplug.c" + #include "io.c" + #include "strerror.c" + #include "sync.c" +#else + #include +#endif + +#ifdef OS_WINDOWS + #include "os/windows_nt_common.c" + #include "os/windows_winusb.c" +#endif + +#cgo freebsd LDFLAGS: -lusb + +#ifndef __FreeBSD__ +#include "libusb.h" +#else +#include + +// "fake" function so freebsd builds +void libusb_cancel_sync_transfers_on_device(struct libusb_device_handle *dev_handle) { +} +#endif + +// When a C struct ends with a zero-sized field, but the struct itself is not zero-sized, +// Go code can no longer refer to the zero-sized field. Any such references will have to be rewritten. +// https://golang.org/doc/go1.5#cgo +// https://github.com/golang/go/issues/11925 + +static uint8_t *dev_capability_data_ptr(struct libusb_bos_dev_capability_descriptor *x) { + return &x->dev_capability_data[0]; +} + +static struct libusb_bos_dev_capability_descriptor **dev_capability_ptr(struct libusb_bos_descriptor *x) { + return &x->dev_capability[0]; +} + +*/ +import "C" + +import ( + "fmt" + "reflect" + "strings" + "unsafe" +) + +//----------------------------------------------------------------------------- +// utilities + +func bcd2str(x uint16) string { + if (x>>12)&15 != 0 { + return fmt.Sprintf("%d%d.%d%d", (x>>12)&15, (x>>8)&15, (x>>4)&15, (x>>0)&15) + } else { + return fmt.Sprintf("%d.%d%d", (x>>8)&15, (x>>4)&15, (x>>0)&15) + } +} + +func indent(s string) string { + x := strings.Split(s, "\n") + for i, _ := range x { + x[i] = fmt.Sprintf("%s%s", " ", x[i]) + } + return strings.Join(x, "\n") +} + +// return a string for the extra buffer +func Extra_str(x []byte) string { + s := make([]string, len(x)) + for i, v := range x { + s[i] = fmt.Sprintf("%02x", v) + } + return fmt.Sprintf("[%s]", strings.Join(s, " ")) +} + +//----------------------------------------------------------------------------- + +// libusb API version. +const API_VERSION = C.LIBUSB_API_VERSION + +// Device and/or Interface Class codes. +const ( + CLASS_PER_INTERFACE = C.LIBUSB_CLASS_PER_INTERFACE + CLASS_AUDIO = C.LIBUSB_CLASS_AUDIO + CLASS_COMM = C.LIBUSB_CLASS_COMM + CLASS_HID = C.LIBUSB_CLASS_HID + CLASS_PHYSICAL = C.LIBUSB_CLASS_PHYSICAL + CLASS_PRINTER = C.LIBUSB_CLASS_PRINTER + CLASS_PTP = C.LIBUSB_CLASS_PTP + CLASS_IMAGE = C.LIBUSB_CLASS_IMAGE + CLASS_MASS_STORAGE = C.LIBUSB_CLASS_MASS_STORAGE + CLASS_HUB = C.LIBUSB_CLASS_HUB + CLASS_DATA = C.LIBUSB_CLASS_DATA + CLASS_SMART_CARD = C.LIBUSB_CLASS_SMART_CARD + CLASS_CONTENT_SECURITY = C.LIBUSB_CLASS_CONTENT_SECURITY + CLASS_VIDEO = C.LIBUSB_CLASS_VIDEO + CLASS_PERSONAL_HEALTHCARE = C.LIBUSB_CLASS_PERSONAL_HEALTHCARE + CLASS_DIAGNOSTIC_DEVICE = C.LIBUSB_CLASS_DIAGNOSTIC_DEVICE + CLASS_WIRELESS = C.LIBUSB_CLASS_WIRELESS + CLASS_APPLICATION = C.LIBUSB_CLASS_APPLICATION + CLASS_VENDOR_SPEC = C.LIBUSB_CLASS_VENDOR_SPEC +) + +// Descriptor types as defined by the USB specification. +const ( + DT_DEVICE = C.LIBUSB_DT_DEVICE + DT_CONFIG = C.LIBUSB_DT_CONFIG + DT_STRING = C.LIBUSB_DT_STRING + DT_INTERFACE = C.LIBUSB_DT_INTERFACE + DT_ENDPOINT = C.LIBUSB_DT_ENDPOINT + DT_BOS = C.LIBUSB_DT_BOS + DT_DEVICE_CAPABILITY = C.LIBUSB_DT_DEVICE_CAPABILITY + DT_HID = C.LIBUSB_DT_HID + DT_REPORT = C.LIBUSB_DT_REPORT + DT_PHYSICAL = C.LIBUSB_DT_PHYSICAL + DT_HUB = C.LIBUSB_DT_HUB + DT_SUPERSPEED_HUB = C.LIBUSB_DT_SUPERSPEED_HUB + DT_SS_ENDPOINT_COMPANION = C.LIBUSB_DT_SS_ENDPOINT_COMPANION +) + +// Descriptor sizes per descriptor type. +const DT_DEVICE_SIZE = C.LIBUSB_DT_DEVICE_SIZE +const DT_CONFIG_SIZE = C.LIBUSB_DT_CONFIG_SIZE +const DT_INTERFACE_SIZE = C.LIBUSB_DT_INTERFACE_SIZE +const DT_ENDPOINT_SIZE = C.LIBUSB_DT_ENDPOINT_SIZE +const DT_ENDPOINT_AUDIO_SIZE = C.LIBUSB_DT_ENDPOINT_AUDIO_SIZE +const DT_HUB_NONVAR_SIZE = C.LIBUSB_DT_HUB_NONVAR_SIZE +const DT_SS_ENDPOINT_COMPANION_SIZE = C.LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE +const DT_BOS_SIZE = C.LIBUSB_DT_BOS_SIZE +const DT_DEVICE_CAPABILITY_SIZE = C.LIBUSB_DT_DEVICE_CAPABILITY_SIZE + +// BOS descriptor sizes. +const BT_USB_2_0_EXTENSION_SIZE = C.LIBUSB_BT_USB_2_0_EXTENSION_SIZE +const BT_SS_USB_DEVICE_CAPABILITY_SIZE = C.LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE +const BT_CONTAINER_ID_SIZE = C.LIBUSB_BT_CONTAINER_ID_SIZE +const DT_BOS_MAX_SIZE = C.LIBUSB_DT_BOS_MAX_SIZE +const ENDPOINT_ADDRESS_MASK = C.LIBUSB_ENDPOINT_ADDRESS_MASK +const ENDPOINT_DIR_MASK = C.LIBUSB_ENDPOINT_DIR_MASK + +// Endpoint direction. Values for bit 7 of Endpoint_Descriptor.BEndpointAddress. +const ( + ENDPOINT_IN = C.LIBUSB_ENDPOINT_IN // In: device-to-host. + ENDPOINT_OUT = C.LIBUSB_ENDPOINT_OUT // Out: host-to-device. +) + +// in BmAttributes +const TRANSFER_TYPE_MASK = C.LIBUSB_TRANSFER_TYPE_MASK + +// Endpoint transfer type. Values for bits 0:1 of Endpoint_Descriptor.BmAttributes. +const ( + TRANSFER_TYPE_CONTROL = C.LIBUSB_TRANSFER_TYPE_CONTROL + TRANSFER_TYPE_ISOCHRONOUS = C.LIBUSB_TRANSFER_TYPE_ISOCHRONOUS + TRANSFER_TYPE_BULK = C.LIBUSB_TRANSFER_TYPE_BULK + TRANSFER_TYPE_INTERRUPT = C.LIBUSB_TRANSFER_TYPE_INTERRUPT + TRANSFER_TYPE_BULK_STREAM = C.LIBUSB_TRANSFER_TYPE_BULK_STREAM +) + +// Standard requests, as defined in table 9-5 of the USB 3.0 specifications. +const ( + REQUEST_GET_STATUS = C.LIBUSB_REQUEST_GET_STATUS + REQUEST_CLEAR_FEATURE = C.LIBUSB_REQUEST_CLEAR_FEATURE + REQUEST_SET_FEATURE = C.LIBUSB_REQUEST_SET_FEATURE + REQUEST_SET_ADDRESS = C.LIBUSB_REQUEST_SET_ADDRESS + REQUEST_GET_DESCRIPTOR = C.LIBUSB_REQUEST_GET_DESCRIPTOR + REQUEST_SET_DESCRIPTOR = C.LIBUSB_REQUEST_SET_DESCRIPTOR + REQUEST_GET_CONFIGURATION = C.LIBUSB_REQUEST_GET_CONFIGURATION + REQUEST_SET_CONFIGURATION = C.LIBUSB_REQUEST_SET_CONFIGURATION + REQUEST_GET_INTERFACE = C.LIBUSB_REQUEST_GET_INTERFACE + REQUEST_SET_INTERFACE = C.LIBUSB_REQUEST_SET_INTERFACE + REQUEST_SYNCH_FRAME = C.LIBUSB_REQUEST_SYNCH_FRAME + REQUEST_SET_SEL = C.LIBUSB_REQUEST_SET_SEL + SET_ISOCH_DELAY = C.LIBUSB_SET_ISOCH_DELAY +) + +// Request type bits of Control_Setup.BmRequestType. +const ( + REQUEST_TYPE_STANDARD = C.LIBUSB_REQUEST_TYPE_STANDARD + REQUEST_TYPE_CLASS = C.LIBUSB_REQUEST_TYPE_CLASS + REQUEST_TYPE_VENDOR = C.LIBUSB_REQUEST_TYPE_VENDOR + REQUEST_TYPE_RESERVED = C.LIBUSB_REQUEST_TYPE_RESERVED +) + +// Recipient bits of Control_Setup.BmRequestType in control transfers. +// Values 4 through 31 are reserved. +const ( + RECIPIENT_DEVICE = C.LIBUSB_RECIPIENT_DEVICE + RECIPIENT_INTERFACE = C.LIBUSB_RECIPIENT_INTERFACE + RECIPIENT_ENDPOINT = C.LIBUSB_RECIPIENT_ENDPOINT + RECIPIENT_OTHER = C.LIBUSB_RECIPIENT_OTHER +) + +const ISO_SYNC_TYPE_MASK = C.LIBUSB_ISO_SYNC_TYPE_MASK + +// Synchronization type for isochronous endpoints. +// Values for bits 2:3 of Endpoint_Descriptor.BmAttributes. +const ( + ISO_SYNC_TYPE_NONE = C.LIBUSB_ISO_SYNC_TYPE_NONE + ISO_SYNC_TYPE_ASYNC = C.LIBUSB_ISO_SYNC_TYPE_ASYNC + ISO_SYNC_TYPE_ADAPTIVE = C.LIBUSB_ISO_SYNC_TYPE_ADAPTIVE + ISO_SYNC_TYPE_SYNC = C.LIBUSB_ISO_SYNC_TYPE_SYNC +) + +const ISO_USAGE_TYPE_MASK = C.LIBUSB_ISO_USAGE_TYPE_MASK + +// Usage type for isochronous endpoints. +// Values for bits 4:5 of Endpoint_Descriptor.BmAttributes. +const ( + ISO_USAGE_TYPE_DATA = C.LIBUSB_ISO_USAGE_TYPE_DATA + ISO_USAGE_TYPE_FEEDBACK = C.LIBUSB_ISO_USAGE_TYPE_FEEDBACK + ISO_USAGE_TYPE_IMPLICIT = C.LIBUSB_ISO_USAGE_TYPE_IMPLICIT +) + +const CONTROL_SETUP_SIZE = C.LIBUSB_CONTROL_SETUP_SIZE + +// Speed codes. Indicates the speed at which the device is operating. +const ( + SPEED_UNKNOWN = C.LIBUSB_SPEED_UNKNOWN + SPEED_LOW = C.LIBUSB_SPEED_LOW + SPEED_FULL = C.LIBUSB_SPEED_FULL + SPEED_HIGH = C.LIBUSB_SPEED_HIGH + SPEED_SUPER = C.LIBUSB_SPEED_SUPER +) + +// Supported speeds (WSpeedSupported) bitfield. Indicates what speeds the device supports. +const ( + LOW_SPEED_OPERATION = C.LIBUSB_LOW_SPEED_OPERATION + FULL_SPEED_OPERATION = C.LIBUSB_FULL_SPEED_OPERATION + HIGH_SPEED_OPERATION = C.LIBUSB_HIGH_SPEED_OPERATION + SUPER_SPEED_OPERATION = C.LIBUSB_SUPER_SPEED_OPERATION +) + +// Bitmasks for USB_2_0_Extension_Descriptor.BmAttributes. +const ( + BM_LPM_SUPPORT = C.LIBUSB_BM_LPM_SUPPORT +) + +// Bitmasks for SS_USB_Device_Capability_Descriptor.BmAttributes. +const ( + BM_LTM_SUPPORT = C.LIBUSB_BM_LTM_SUPPORT +) + +// USB capability types. +const ( + BT_WIRELESS_USB_DEVICE_CAPABILITY = C.LIBUSB_BT_WIRELESS_USB_DEVICE_CAPABILITY + BT_USB_2_0_EXTENSION = C.LIBUSB_BT_USB_2_0_EXTENSION + BT_SS_USB_DEVICE_CAPABILITY = C.LIBUSB_BT_SS_USB_DEVICE_CAPABILITY + BT_CONTAINER_ID = C.LIBUSB_BT_CONTAINER_ID +) + +// Error codes. +const ( + SUCCESS = C.LIBUSB_SUCCESS + ERROR_IO = C.LIBUSB_ERROR_IO + ERROR_INVALID_PARAM = C.LIBUSB_ERROR_INVALID_PARAM + ERROR_ACCESS = C.LIBUSB_ERROR_ACCESS + ERROR_NO_DEVICE = C.LIBUSB_ERROR_NO_DEVICE + ERROR_NOT_FOUND = C.LIBUSB_ERROR_NOT_FOUND + ERROR_BUSY = C.LIBUSB_ERROR_BUSY + ERROR_TIMEOUT = C.LIBUSB_ERROR_TIMEOUT + ERROR_OVERFLOW = C.LIBUSB_ERROR_OVERFLOW + ERROR_PIPE = C.LIBUSB_ERROR_PIPE + ERROR_INTERRUPTED = C.LIBUSB_ERROR_INTERRUPTED + ERROR_NO_MEM = C.LIBUSB_ERROR_NO_MEM + ERROR_NOT_SUPPORTED = C.LIBUSB_ERROR_NOT_SUPPORTED + ERROR_OTHER = C.LIBUSB_ERROR_OTHER +) + +// Total number of error codes. +const ERROR_COUNT = C.LIBUSB_ERROR_COUNT + +// Transfer status codes. +const ( + TRANSFER_COMPLETED = C.LIBUSB_TRANSFER_COMPLETED + TRANSFER_ERROR = C.LIBUSB_TRANSFER_ERROR + TRANSFER_TIMED_OUT = C.LIBUSB_TRANSFER_TIMED_OUT + TRANSFER_CANCELLED = C.LIBUSB_TRANSFER_CANCELLED + TRANSFER_STALL = C.LIBUSB_TRANSFER_STALL + TRANSFER_NO_DEVICE = C.LIBUSB_TRANSFER_NO_DEVICE + TRANSFER_OVERFLOW = C.LIBUSB_TRANSFER_OVERFLOW +) + +// Transfer.Flags values. +const ( + TRANSFER_SHORT_NOT_OK = C.LIBUSB_TRANSFER_SHORT_NOT_OK + TRANSFER_FREE_BUFFER = C.LIBUSB_TRANSFER_FREE_BUFFER + TRANSFER_FREE_TRANSFER = C.LIBUSB_TRANSFER_FREE_TRANSFER + TRANSFER_ADD_ZERO_PACKET = C.LIBUSB_TRANSFER_ADD_ZERO_PACKET +) + +// Capabilities supported by an instance of libusb on the current running platform. +// Test if the loaded library supports a given capability by calling Has_Capability(). +const ( + CAP_HAS_CAPABILITY = C.LIBUSB_CAP_HAS_CAPABILITY + CAP_HAS_HOTPLUG = C.LIBUSB_CAP_HAS_HOTPLUG + CAP_HAS_HID_ACCESS = C.LIBUSB_CAP_HAS_HID_ACCESS + CAP_SUPPORTS_DETACH_KERNEL_DRIVER = C.LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER +) + +// Log message levels. +const ( + LOG_LEVEL_NONE = C.LIBUSB_LOG_LEVEL_NONE + LOG_LEVEL_ERROR = C.LIBUSB_LOG_LEVEL_ERROR + LOG_LEVEL_WARNING = C.LIBUSB_LOG_LEVEL_WARNING + LOG_LEVEL_INFO = C.LIBUSB_LOG_LEVEL_INFO + LOG_LEVEL_DEBUG = C.LIBUSB_LOG_LEVEL_DEBUG +) + +// Flags for hotplug events. +const ( + //HOTPLUG_NO_FLAGS = C.LIBUSB_HOTPLUG_NO_FLAGS + HOTPLUG_ENUMERATE = C.LIBUSB_HOTPLUG_ENUMERATE +) + +// Hotplug events. +const ( + HOTPLUG_EVENT_DEVICE_ARRIVED = C.LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED + HOTPLUG_EVENT_DEVICE_LEFT = C.LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT +) + +// Wildcard matching for hotplug events. +const HOTPLUG_MATCH_ANY = C.LIBUSB_HOTPLUG_MATCH_ANY + +//----------------------------------------------------------------------------- + +// A structure representing the standard USB endpoint descriptor. +// This descriptor is documented in section 9.6.6 of the USB 3.0 specification. +// All multiple-byte fields are represented in host-endian format. +type Endpoint_Descriptor struct { + ptr *C.struct_libusb_endpoint_descriptor + BLength uint8 + BDescriptorType uint8 + BEndpointAddress uint8 + BmAttributes uint8 + WMaxPacketSize uint16 + BInterval uint8 + BRefresh uint8 + BSynchAddress uint8 + Extra []byte +} + +func (x *C.struct_libusb_endpoint_descriptor) c2go() *Endpoint_Descriptor { + return &Endpoint_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + BEndpointAddress: uint8(x.bEndpointAddress), + BmAttributes: uint8(x.bmAttributes), + WMaxPacketSize: uint16(x.wMaxPacketSize), + BInterval: uint8(x.bInterval), + BRefresh: uint8(x.bRefresh), + BSynchAddress: uint8(x.bSynchAddress), + Extra: C.GoBytes(unsafe.Pointer(x.extra), x.extra_length), + } +} + +// return a string for an Endpoint_Descriptor +func (x *Endpoint_Descriptor) String() string { + s := make([]string, 0, 16) + s = append(s, fmt.Sprintf("bLength %d", x.BLength)) + s = append(s, fmt.Sprintf("bDescriptorType %d", x.BDescriptorType)) + s = append(s, fmt.Sprintf("bEndpointAddress 0x%02x", x.BEndpointAddress)) + s = append(s, fmt.Sprintf("bmAttributes %d", x.BmAttributes)) + s = append(s, fmt.Sprintf("wMaxPacketSize %d", x.WMaxPacketSize)) + s = append(s, fmt.Sprintf("bInterval %d", x.BInterval)) + s = append(s, fmt.Sprintf("bRefresh %d", x.BRefresh)) + s = append(s, fmt.Sprintf("bSynchAddress %d", x.BSynchAddress)) + s = append(s, fmt.Sprintf("extra %s", Extra_str(x.Extra))) + return strings.Join(s, "\n") +} + +//----------------------------------------------------------------------------- + +// A structure representing the standard USB interface descriptor. +// This descriptor is documented in section 9.6.5 of the USB 3.0 specification. +// All multiple-byte fields are represented in host-endian format. +type Interface_Descriptor struct { + ptr *C.struct_libusb_interface_descriptor + BLength uint8 + BDescriptorType uint8 + BInterfaceNumber uint8 + BAlternateSetting uint8 + BNumEndpoints uint8 + BInterfaceClass uint8 + BInterfaceSubClass uint8 + BInterfaceProtocol uint8 + IInterface uint8 + Endpoint []*Endpoint_Descriptor + Extra []byte +} + +func (x *C.struct_libusb_interface_descriptor) c2go() *Interface_Descriptor { + var list []C.struct_libusb_endpoint_descriptor + hdr := (*reflect.SliceHeader)(unsafe.Pointer(&list)) + hdr.Cap = int(x.bNumEndpoints) + hdr.Len = int(x.bNumEndpoints) + hdr.Data = uintptr(unsafe.Pointer(x.endpoint)) + endpoints := make([]*Endpoint_Descriptor, x.bNumEndpoints) + for i, _ := range endpoints { + endpoints[i] = (&list[i]).c2go() + } + return &Interface_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + BInterfaceNumber: uint8(x.bInterfaceNumber), + BAlternateSetting: uint8(x.bAlternateSetting), + BNumEndpoints: uint8(x.bNumEndpoints), + BInterfaceClass: uint8(x.bInterfaceClass), + BInterfaceSubClass: uint8(x.bInterfaceSubClass), + BInterfaceProtocol: uint8(x.bInterfaceProtocol), + IInterface: uint8(x.iInterface), + Endpoint: endpoints, + Extra: C.GoBytes(unsafe.Pointer(x.extra), x.extra_length), + } +} + +// return a string for an Interface_Descriptor +func (x *Interface_Descriptor) String() string { + s := make([]string, 0, 16) + s = append(s, fmt.Sprintf("bLength %d", x.BLength)) + s = append(s, fmt.Sprintf("bDescriptorType %d", x.BDescriptorType)) + s = append(s, fmt.Sprintf("bInterfaceNumber %d", x.BInterfaceNumber)) + s = append(s, fmt.Sprintf("bAlternateSetting %d", x.BAlternateSetting)) + s = append(s, fmt.Sprintf("bNumEndpoints %d", x.BNumEndpoints)) + s = append(s, fmt.Sprintf("bInterfaceClass %d", x.BInterfaceClass)) + s = append(s, fmt.Sprintf("bInterfaceSubClass %d", x.BInterfaceSubClass)) + s = append(s, fmt.Sprintf("bInterfaceProtocol %d", x.BInterfaceProtocol)) + s = append(s, fmt.Sprintf("iInterface %d", x.IInterface)) + for i, v := range x.Endpoint { + s = append(s, fmt.Sprintf("Endpoint %d:", i)) + s = append(s, indent(v.String())) + } + s = append(s, fmt.Sprintf("extra %s", Extra_str(x.Extra))) + return strings.Join(s, "\n") +} + +//----------------------------------------------------------------------------- + +// A collection of alternate settings for a particular USB interface. +type Interface struct { + ptr *C.struct_libusb_interface + Num_altsetting int + Altsetting []*Interface_Descriptor +} + +func (x *C.struct_libusb_interface) c2go() *Interface { + var list []C.struct_libusb_interface_descriptor + hdr := (*reflect.SliceHeader)(unsafe.Pointer(&list)) + hdr.Cap = int(x.num_altsetting) + hdr.Len = int(x.num_altsetting) + hdr.Data = uintptr(unsafe.Pointer(x.altsetting)) + altsetting := make([]*Interface_Descriptor, x.num_altsetting) + for i, _ := range altsetting { + altsetting[i] = (&list[i]).c2go() + } + return &Interface{ + ptr: x, + Num_altsetting: int(x.num_altsetting), + Altsetting: altsetting, + } +} + +// return a string for an Interface +func Interface_str(x *Interface) string { + s := make([]string, 0, 1) + s = append(s, fmt.Sprintf("num_altsetting %d", x.Num_altsetting)) + for i, v := range x.Altsetting { + s = append(s, fmt.Sprintf("Interface Descriptor %d:", i)) + s = append(s, indent(v.String())) + } + return strings.Join(s, "\n") +} + +//----------------------------------------------------------------------------- + +// A structure representing the standard USB configuration descriptor. +// This descriptor is documented in section 9.6.3 of the USB 3.0 specification. +// All multiple-byte fields are represented in host-endian format. +type Config_Descriptor struct { + ptr *C.struct_libusb_config_descriptor + BLength uint8 + BDescriptorType uint8 + WTotalLength uint16 + BNumInterfaces uint8 + BConfigurationValue uint8 + IConfiguration uint8 + BmAttributes uint8 + MaxPower uint8 + Interface []*Interface + Extra []byte +} + +func (x *C.struct_libusb_config_descriptor) c2go() *Config_Descriptor { + var list []C.struct_libusb_interface + hdr := (*reflect.SliceHeader)(unsafe.Pointer(&list)) + hdr.Cap = int(x.bNumInterfaces) + hdr.Len = int(x.bNumInterfaces) + hdr.Data = uintptr(unsafe.Pointer(x._interface)) + interfaces := make([]*Interface, x.bNumInterfaces) + for i, _ := range interfaces { + interfaces[i] = (&list[i]).c2go() + } + return &Config_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + WTotalLength: uint16(x.wTotalLength), + BNumInterfaces: uint8(x.bNumInterfaces), + BConfigurationValue: uint8(x.bConfigurationValue), + IConfiguration: uint8(x.iConfiguration), + BmAttributes: uint8(x.bmAttributes), + MaxPower: uint8(x.MaxPower), + Interface: interfaces, + Extra: C.GoBytes(unsafe.Pointer(x.extra), x.extra_length), + } +} + +// return a string for a Config_Descriptor +func (x *Config_Descriptor) String() string { + s := make([]string, 0, 16) + s = append(s, fmt.Sprintf("bLength %d", x.BLength)) + s = append(s, fmt.Sprintf("bDescriptorType %d", x.BDescriptorType)) + s = append(s, fmt.Sprintf("wTotalLength %d", x.WTotalLength)) + s = append(s, fmt.Sprintf("bNumInterfaces %d", x.BNumInterfaces)) + s = append(s, fmt.Sprintf("bConfigurationValue %d", x.BConfigurationValue)) + s = append(s, fmt.Sprintf("iConfiguration %d", x.IConfiguration)) + s = append(s, fmt.Sprintf("bmAttributes %d", x.BmAttributes)) + s = append(s, fmt.Sprintf("MaxPower %d", x.MaxPower)) + for i, v := range x.Interface { + s = append(s, fmt.Sprintf("Interface %d:", i)) + s = append(s, indent(fmt.Sprintf(Interface_str(v)))) + } + s = append(s, fmt.Sprintf("extra %s", Extra_str(x.Extra))) + return strings.Join(s, "\n") +} + +//----------------------------------------------------------------------------- + +// A structure representing the superspeed endpoint companion descriptor. +// This descriptor is documented in section 9.6.7 of the USB 3.0 specification. +// All multiple-byte fields are represented in host-endian format. +type SS_Endpoint_Companion_Descriptor struct { + ptr *C.struct_libusb_ss_endpoint_companion_descriptor + BLength uint8 + BDescriptorType uint8 + BMaxBurst uint8 + BmAttributes uint8 + WBytesPerInterval uint16 +} + +func (x *C.struct_libusb_ss_endpoint_companion_descriptor) c2go() *SS_Endpoint_Companion_Descriptor { + return &SS_Endpoint_Companion_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + BMaxBurst: uint8(x.bMaxBurst), + BmAttributes: uint8(x.bmAttributes), + WBytesPerInterval: uint16(x.wBytesPerInterval), + } +} + +//----------------------------------------------------------------------------- + +// A generic representation of a BOS Device Capability descriptor. +// It is advised to check BDevCapabilityType and call the matching +// Get_*_Descriptor function to get a structure fully matching the type. +type BOS_Dev_Capability_Descriptor struct { + ptr *C.struct_libusb_bos_dev_capability_descriptor + BLength uint8 + BDescriptorType uint8 + BDevCapabilityType uint8 + Dev_capability_data []byte +} + +func (x *C.struct_libusb_bos_dev_capability_descriptor) c2go() *BOS_Dev_Capability_Descriptor { + return &BOS_Dev_Capability_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + BDevCapabilityType: uint8(x.bDevCapabilityType), + Dev_capability_data: C.GoBytes(unsafe.Pointer(C.dev_capability_data_ptr(x)), C.int(x.bLength-3)), + } +} + +//----------------------------------------------------------------------------- + +// A structure representing the Binary Device Object Store (BOS) descriptor. +// This descriptor is documented in section 9.6.2 of the USB 3.0 specification. +// All multiple-byte fields are represented in host-endian format. +type BOS_Descriptor struct { + ptr *C.struct_libusb_bos_descriptor + BLength uint8 + BDescriptorType uint8 + WTotalLength uint16 + Dev_capability []*BOS_Dev_Capability_Descriptor +} + +func (x *C.struct_libusb_bos_descriptor) c2go() *BOS_Descriptor { + var list []*C.struct_libusb_bos_dev_capability_descriptor + hdr := (*reflect.SliceHeader)(unsafe.Pointer(&list)) + hdr.Cap = int(x.bNumDeviceCaps) + hdr.Len = int(x.bNumDeviceCaps) + hdr.Data = uintptr(unsafe.Pointer(C.dev_capability_ptr(x))) + dev_capability := make([]*BOS_Dev_Capability_Descriptor, x.bNumDeviceCaps) + for i, _ := range dev_capability { + dev_capability[i] = list[i].c2go() + } + return &BOS_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + WTotalLength: uint16(x.wTotalLength), + Dev_capability: dev_capability, + } +} + +//----------------------------------------------------------------------------- + +// A structure representing the USB 2.0 Extension descriptor +// This descriptor is documented in section 9.6.2.1 of the USB 3.0 specification. +// All multiple-byte fields are represented in host-endian format. +type USB_2_0_Extension_Descriptor struct { + ptr *C.struct_libusb_usb_2_0_extension_descriptor + BLength uint8 + BDescriptorType uint8 + BDevCapabilityType uint8 + BmAttributes uint32 +} + +func (x *C.struct_libusb_usb_2_0_extension_descriptor) c2go() *USB_2_0_Extension_Descriptor { + return &USB_2_0_Extension_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + BDevCapabilityType: uint8(x.bDevCapabilityType), + BmAttributes: uint32(x.bmAttributes), + } +} + +//----------------------------------------------------------------------------- + +// A structure representing the SuperSpeed USB Device Capability descriptor +// This descriptor is documented in section 9.6.2.2 of the USB 3.0 specification. +// All multiple-byte fields are represented in host-endian format. +type SS_USB_Device_Capability_Descriptor struct { + ptr *C.struct_libusb_ss_usb_device_capability_descriptor + BLength uint8 + BDescriptorType uint8 + BDevCapabilityType uint8 + BmAttributes uint8 + WSpeedSupported uint16 + BFunctionalitySupport uint8 + BU1DevExitLat uint8 + BU2DevExitLat uint16 +} + +func (x *C.struct_libusb_ss_usb_device_capability_descriptor) c2go() *SS_USB_Device_Capability_Descriptor { + return &SS_USB_Device_Capability_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + BDevCapabilityType: uint8(x.bDevCapabilityType), + BmAttributes: uint8(x.bmAttributes), + WSpeedSupported: uint16(x.wSpeedSupported), + BFunctionalitySupport: uint8(x.bFunctionalitySupport), + BU1DevExitLat: uint8(x.bU1DevExitLat), + BU2DevExitLat: uint16(x.bU2DevExitLat), + } +} + +//----------------------------------------------------------------------------- + +// A structure representing the Container ID descriptor. +// This descriptor is documented in section 9.6.2.3 of the USB 3.0 specification. +// All multiple-byte fields, except UUIDs, are represented in host-endian format. +type Container_ID_Descriptor struct { + ptr *C.struct_libusb_container_id_descriptor + BLength uint8 + BDescriptorType uint8 + BDevCapabilityType uint8 + BReserved uint8 + ContainerID []byte +} + +func (x *C.struct_libusb_container_id_descriptor) c2go() *Container_ID_Descriptor { + return &Container_ID_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + BDevCapabilityType: uint8(x.bDevCapabilityType), + BReserved: uint8(x.bReserved), + ContainerID: C.GoBytes(unsafe.Pointer(&x.ContainerID[0]), 16), + } +} + +//----------------------------------------------------------------------------- + +/* +// Setup packet for control transfers. +struct libusb_control_setup { + uint8_t bmRequestType; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +}; +*/ + +//----------------------------------------------------------------------------- + +// A structure representing the standard USB device descriptor. +// This descriptor is documented in section 9.6.1 of the USB 3.0 specification. +// All multiple-byte fields are represented in host-endian format. +type Device_Descriptor struct { + ptr *C.struct_libusb_device_descriptor + BLength uint8 + BDescriptorType uint8 + BcdUSB uint16 + BDeviceClass uint8 + BDeviceSubClass uint8 + BDeviceProtocol uint8 + BMaxPacketSize0 uint8 + IdVendor uint16 + IdProduct uint16 + BcdDevice uint16 + IManufacturer uint8 + IProduct uint8 + ISerialNumber uint8 + BNumConfigurations uint8 +} + +func (x *C.struct_libusb_device_descriptor) c2go() *Device_Descriptor { + return &Device_Descriptor{ + ptr: x, + BLength: uint8(x.bLength), + BDescriptorType: uint8(x.bDescriptorType), + BcdUSB: uint16(x.bcdUSB), + BDeviceClass: uint8(x.bDeviceClass), + BDeviceSubClass: uint8(x.bDeviceSubClass), + BDeviceProtocol: uint8(x.bDeviceProtocol), + BMaxPacketSize0: uint8(x.bMaxPacketSize0), + IdVendor: uint16(x.idVendor), + IdProduct: uint16(x.idProduct), + BcdDevice: uint16(x.bcdDevice), + IManufacturer: uint8(x.iManufacturer), + IProduct: uint8(x.iProduct), + ISerialNumber: uint8(x.iSerialNumber), + BNumConfigurations: uint8(x.bNumConfigurations), + } +} + +// return a string for a Device_Descriptor +func (x *Device_Descriptor) String() string { + s := make([]string, 0, 16) + s = append(s, fmt.Sprintf("bLength %d", x.BLength)) + s = append(s, fmt.Sprintf("bDescriptorType %d", x.BDescriptorType)) + s = append(s, fmt.Sprintf("bcdUSB %s", bcd2str(x.BcdUSB))) + s = append(s, fmt.Sprintf("bDeviceClass %d", x.BDeviceClass)) + s = append(s, fmt.Sprintf("bDeviceSubClass %d", x.BDeviceSubClass)) + s = append(s, fmt.Sprintf("bDeviceProtocol %d", x.BDeviceProtocol)) + s = append(s, fmt.Sprintf("bMaxPacketSize0 %d", x.BMaxPacketSize0)) + s = append(s, fmt.Sprintf("idVendor 0x%04x", x.IdVendor)) + s = append(s, fmt.Sprintf("idProduct 0x%04x", x.IdProduct)) + s = append(s, fmt.Sprintf("bcdDevice %s", bcd2str(x.BcdDevice))) + s = append(s, fmt.Sprintf("iManufacturer %d", x.IManufacturer)) + s = append(s, fmt.Sprintf("iProduct %d", x.IProduct)) + s = append(s, fmt.Sprintf("iSerialNumber %d", x.ISerialNumber)) + s = append(s, fmt.Sprintf("bNumConfigurations %d", x.BNumConfigurations)) + return strings.Join(s, "\n") +} + +//----------------------------------------------------------------------------- + +/* + +struct libusb_transfer { + libusb_device_handle *dev_handle; + uint8_t flags; + unsigned char endpoint; + unsigned char type; + unsigned int timeout; + enum libusb_transfer_status status; + int length; + int actual_length; + libusb_transfer_cb_fn callback; + void *user_data; + unsigned char *buffer; + int num_iso_packets; + struct libusb_iso_packet_descriptor iso_packet_desc[]; +}; + +*/ + +// The generic USB transfer structure. The user populates this structure and +// then submits it in order to request a transfer. After the transfer has +// completed, the library populates the transfer with the results and passes +// it back to the user. +type Transfer struct { + ptr *C.struct_libusb_transfer +} + +func (x *C.struct_libusb_transfer) c2go() *Transfer { + return &Transfer{ + ptr: x, + } +} + +func (x *Transfer) go2c() *C.struct_libusb_transfer { + return x.ptr +} + +// return a string for a Device_Descriptor +func (x *Transfer) String() string { + s := make([]string, 0, 1) + return strings.Join(s, "\n") +} + +//----------------------------------------------------------------------------- + +// Structure providing the version of the libusb runtime. +type Version struct { + ptr *C.struct_libusb_version + Major uint16 + Minor uint16 + Micro uint16 + Nano uint16 + Rc string + Describe string +} + +func (x *C.struct_libusb_version) c2go() *Version { + return &Version{ + ptr: x, + Major: uint16(x.major), + Minor: uint16(x.minor), + Micro: uint16(x.micro), + Nano: uint16(x.nano), + Rc: C.GoString(x.rc), + Describe: C.GoString(x.describe), + } +} + +//----------------------------------------------------------------------------- + +// Structure representing a libusb session. +type Context *C.struct_libusb_context + +// Structure representing a USB device detected on the system. +type Device *C.struct_libusb_device + +// Structure representing a handle on a USB device. +type Device_Handle *C.struct_libusb_device_handle + +//type Hotplug_Callback *C.struct_libusb_hotplug_callback + +//----------------------------------------------------------------------------- +// errors + +type libusb_error struct { + Code int +} + +func (e *libusb_error) Error() string { + return Error_Name(e.Code) +} + +//----------------------------------------------------------------------------- +// Library initialization/deinitialization + +func Set_Debug(ctx Context, level int) { + C.libusb_set_debug(ctx, C.int(level)) +} + +func Init(ctx *Context) error { + rc := int(C.libusb_init((**C.struct_libusb_context)(ctx))) + if rc != 0 { + return &libusb_error{rc} + } + return nil +} + +func Exit(ctx Context) { + C.libusb_exit(ctx) +} + +//----------------------------------------------------------------------------- +// Device handling and enumeration + +func Get_Device_List(ctx Context) ([]Device, error) { + var hdl **C.struct_libusb_device + rc := int(C.libusb_get_device_list(ctx, (***C.struct_libusb_device)(&hdl))) + if rc < 0 { + return nil, &libusb_error{rc} + } + // turn the c array into a slice of device pointers + var list []Device + hdr := (*reflect.SliceHeader)(unsafe.Pointer(&list)) + hdr.Cap = rc + hdr.Len = rc + hdr.Data = uintptr(unsafe.Pointer(hdl)) + return list, nil +} + +func Free_Device_List(list []Device, unref_devices int) { + if list == nil { + return + } + if len(list) == 0 { + return + } + C.libusb_free_device_list((**C.struct_libusb_device)(&list[0]), C.int(unref_devices)) +} + +func Get_Bus_Number(dev Device) uint8 { + return uint8(C.libusb_get_bus_number(dev)) +} + +func Get_Port_Number(dev Device) uint8 { + return uint8(C.libusb_get_port_number(dev)) +} + +func Get_Port_Numbers(dev Device, ports []byte) ([]byte, error) { + rc := int(C.libusb_get_port_numbers(dev, (*C.uint8_t)(&ports[0]), (C.int)(len(ports)))) + if rc < 0 { + return nil, &libusb_error{rc} + } + return ports[:rc], nil +} + +/* +func Get_Parent(dev Device) Device { + return C.libusb_get_parent(dev) +} +*/ + +func Get_Device_Address(dev Device) uint8 { + return uint8(C.libusb_get_device_address(dev)) +} + +func Get_Device_Speed(dev Device) int { + return int(C.libusb_get_device_speed(dev)) +} + +func Get_Max_Packet_Size(dev Device, endpoint uint8) int { + return int(C.libusb_get_max_packet_size(dev, (C.uchar)(endpoint))) +} + +func Get_Max_ISO_Packet_Size(dev Device, endpoint uint8) int { + return int(C.libusb_get_max_iso_packet_size(dev, (C.uchar)(endpoint))) +} + +func Ref_Device(dev Device) Device { + return C.libusb_ref_device(dev) +} + +func Unref_Device(dev Device) { + C.libusb_unref_device(dev) +} + +func Open(dev Device) (Device_Handle, error) { + var hdl Device_Handle + rc := int(C.libusb_open(dev, (**C.struct_libusb_device_handle)(&hdl))) + if rc < 0 { + return nil, &libusb_error{rc} + } + return hdl, nil +} + +func Open_Device_With_VID_PID(ctx Context, vendor_id uint16, product_id uint16) Device_Handle { + return C.libusb_open_device_with_vid_pid(ctx, (C.uint16_t)(vendor_id), (C.uint16_t)(product_id)) +} + +func Close(hdl Device_Handle) { + C.libusb_close(hdl) +} + +func Get_Device(hdl Device_Handle) Device { + return C.libusb_get_device(hdl) +} + +func Get_Configuration(hdl Device_Handle) (int, error) { + var config C.int + rc := int(C.libusb_get_configuration(hdl, &config)) + if rc < 0 { + return 0, &libusb_error{rc} + } + return int(config), nil +} + +func Set_Configuration(hdl Device_Handle, configuration int) error { + rc := int(C.libusb_set_configuration(hdl, (C.int)(configuration))) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} + +func Claim_Interface(hdl Device_Handle, interface_number int) error { + rc := int(C.libusb_claim_interface(hdl, (C.int)(interface_number))) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} + +func Release_Interface(hdl Device_Handle, interface_number int) error { + rc := int(C.libusb_release_interface(hdl, (C.int)(interface_number))) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} + +func Set_Interface_Alt_Setting(hdl Device_Handle, interface_number int, alternate_setting int) error { + rc := int(C.libusb_set_interface_alt_setting(hdl, (C.int)(interface_number), (C.int)(alternate_setting))) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} + +func Clear_Halt(hdl Device_Handle, endpoint uint8) error { + rc := int(C.libusb_clear_halt(hdl, (C.uchar)(endpoint))) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} + +func Reset_Device(hdl Device_Handle) error { + rc := int(C.libusb_reset_device(hdl)) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} + +func Kernel_Driver_Active(hdl Device_Handle, interface_number int) (bool, error) { + rc := int(C.libusb_kernel_driver_active(hdl, (C.int)(interface_number))) + if rc < 0 { + return false, &libusb_error{rc} + } + return rc != 0, nil +} + +func Detach_Kernel_Driver(hdl Device_Handle, interface_number int) error { + rc := int(C.libusb_detach_kernel_driver(hdl, (C.int)(interface_number))) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} + +func Attach_Kernel_Driver(hdl Device_Handle, interface_number int) error { + rc := int(C.libusb_attach_kernel_driver(hdl, (C.int)(interface_number))) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} + +func Set_Auto_Detach_Kernel_Driver(hdl Device_Handle, enable bool) error { + enable_int := 0 + if enable { + enable_int = 1 + } + rc := int(C.libusb_set_auto_detach_kernel_driver(hdl, (C.int)(enable_int))) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} + +//----------------------------------------------------------------------------- +// Miscellaneous + +/* +func Has_Capability(capability uint32) bool { + rc := int(C.libusb_has_capability((C.uint32_t)(capability))) + return rc != 0 +} +*/ + +func Error_Name(code int) string { + return C.GoString(C.libusb_error_name(C.int(code))) +} + +func Get_Version() *Version { + ver := (*C.struct_libusb_version)(unsafe.Pointer(C.libusb_get_version())) + return ver.c2go() +} + +func CPU_To_LE16(x uint16) uint16 { + return uint16(C.libusb_cpu_to_le16((C.uint16_t)(x))) +} + +/* +func Setlocale(locale string) error { + cstr := C.CString(locale) + rc := int(C.libusb_setlocale(cstr)) + if rc < 0 { + return &libusb_error{rc} + } + return nil +} +*/ + +func Strerror(errcode int) string { + return C.GoString(C.libusb_strerror(int32(errcode))) +} + +//----------------------------------------------------------------------------- +// USB descriptors + +func Get_Device_Descriptor(dev Device) (*Device_Descriptor, error) { + var desc C.struct_libusb_device_descriptor + rc := int(C.libusb_get_device_descriptor(dev, &desc)) + if rc != 0 { + return nil, &libusb_error{rc} + } + return (&desc).c2go(), nil +} + +func Get_Active_Config_Descriptor(dev Device) (*Config_Descriptor, error) { + var desc *C.struct_libusb_config_descriptor + rc := int(C.libusb_get_active_config_descriptor(dev, &desc)) + if rc != 0 { + return nil, &libusb_error{rc} + } + return desc.c2go(), nil +} + +func Get_Config_Descriptor(dev Device, config_index uint8) (*Config_Descriptor, error) { + var desc *C.struct_libusb_config_descriptor + rc := int(C.libusb_get_config_descriptor(dev, (C.uint8_t)(config_index), &desc)) + if rc != 0 { + return nil, &libusb_error{rc} + } + return desc.c2go(), nil +} + +func Get_Config_Descriptor_By_Value(dev Device, bConfigurationValue uint8) (*Config_Descriptor, error) { + var desc *C.struct_libusb_config_descriptor + rc := int(C.libusb_get_config_descriptor_by_value(dev, (C.uint8_t)(bConfigurationValue), &desc)) + if rc != 0 { + return nil, &libusb_error{rc} + } + return desc.c2go(), nil +} + +func Free_Config_Descriptor(config *Config_Descriptor) { + C.libusb_free_config_descriptor(config.ptr) +} + +func Get_SS_Endpoint_Companion_Descriptor(ctx Context, endpoint *Endpoint_Descriptor) (*SS_Endpoint_Companion_Descriptor, error) { + var desc *C.struct_libusb_ss_endpoint_companion_descriptor + rc := int(C.libusb_get_ss_endpoint_companion_descriptor(ctx, endpoint.ptr, &desc)) + if rc != 0 { + return nil, &libusb_error{rc} + } + return desc.c2go(), nil +} + +func Free_SS_Endpoint_Companion_Descriptor(ep_comp *SS_Endpoint_Companion_Descriptor) { + C.libusb_free_ss_endpoint_companion_descriptor(ep_comp.ptr) +} + +func Get_BOS_Descriptor(hdl Device_Handle) (*BOS_Descriptor, error) { + var desc *C.struct_libusb_bos_descriptor + rc := int(C.libusb_get_bos_descriptor(hdl, &desc)) + if rc != 0 { + return nil, &libusb_error{rc} + } + return desc.c2go(), nil +} + +func Free_BOS_Descriptor(bos *BOS_Descriptor) { + C.libusb_free_bos_descriptor(bos.ptr) +} + +func Get_USB_2_0_Extension_Descriptor(ctx Context, dev_cap *BOS_Dev_Capability_Descriptor) (*USB_2_0_Extension_Descriptor, error) { + var desc *C.struct_libusb_usb_2_0_extension_descriptor + rc := int(C.libusb_get_usb_2_0_extension_descriptor(ctx, dev_cap.ptr, &desc)) + if rc != 0 { + return nil, &libusb_error{rc} + } + return desc.c2go(), nil +} + +func Free_USB_2_0_Extension_Descriptor(usb_2_0_extension *USB_2_0_Extension_Descriptor) { + C.libusb_free_usb_2_0_extension_descriptor(usb_2_0_extension.ptr) +} + +func Get_SS_USB_Device_Capability_Descriptor(ctx Context, dev_cap *BOS_Dev_Capability_Descriptor) (*SS_USB_Device_Capability_Descriptor, error) { + var desc *C.struct_libusb_ss_usb_device_capability_descriptor + rc := int(C.libusb_get_ss_usb_device_capability_descriptor(ctx, dev_cap.ptr, &desc)) + if rc != 0 { + return nil, &libusb_error{rc} + } + return desc.c2go(), nil +} + +func Free_SS_USB_Device_Capability_Descriptor(ss_usb_device_cap *SS_USB_Device_Capability_Descriptor) { + C.libusb_free_ss_usb_device_capability_descriptor(ss_usb_device_cap.ptr) +} + +func Get_Container_ID_Descriptor(ctx Context, dev_cap *BOS_Dev_Capability_Descriptor) (*Container_ID_Descriptor, error) { + var desc *C.struct_libusb_container_id_descriptor + rc := int(C.libusb_get_container_id_descriptor(ctx, dev_cap.ptr, &desc)) + if rc != 0 { + return nil, &libusb_error{rc} + } + return desc.c2go(), nil +} + +func Free_Container_ID_Descriptor(container_id *Container_ID_Descriptor) { + C.libusb_free_container_id_descriptor(container_id.ptr) +} + +func Get_String_Descriptor_ASCII(hdl Device_Handle, desc_index uint8, data []byte) ([]byte, error) { + rc := int(C.libusb_get_string_descriptor_ascii(hdl, (C.uint8_t)(desc_index), (*C.uchar)(&data[0]), (C.int)(len(data)))) + if rc < 0 { + return nil, &libusb_error{rc} + } + return data[:rc], nil +} + +func Get_Descriptor(hdl Device_Handle, desc_type uint8, desc_index uint8, data []byte) ([]byte, error) { + rc := int(C.libusb_get_descriptor(hdl, (C.uint8_t)(desc_type), (C.uint8_t)(desc_index), (*C.uchar)(&data[0]), (C.int)(len(data)))) + if rc < 0 { + return nil, &libusb_error{rc} + } + return data[:rc], nil +} + +func Get_String_Descriptor(hdl Device_Handle, desc_index uint8, langid uint16, data []byte) ([]byte, error) { + rc := int(C.libusb_get_string_descriptor(hdl, (C.uint8_t)(desc_index), (C.uint16_t)(langid), (*C.uchar)(&data[0]), (C.int)(len(data)))) + if rc < 0 { + return nil, &libusb_error{rc} + } + return data[:rc], nil +} + +//----------------------------------------------------------------------------- +// Device hotplug event notification + +//int libusb_hotplug_register_callback (libusb_context *ctx, libusb_hotplug_event events, libusb_hotplug_flag flags, int vendor_id, int product_id, int dev_class, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *handle) +//void libusb_hotplug_deregister_callback (libusb_context *ctx, libusb_hotplug_callback_handle handle) + +//----------------------------------------------------------------------------- +//Asynchronous device I/O + +func Alloc_Streams(dev Device_Handle, num_streams uint32, endpoints []byte) (int, error) { + rc := int(C.libusb_alloc_streams(dev, (C.uint32_t)(num_streams), (*C.uchar)(&endpoints[0]), (C.int)(len(endpoints)))) + if rc < 0 { + return 0, &libusb_error{rc} + } + return rc, nil +} + +func Free_Streams(dev Device_Handle, endpoints []byte) error { + rc := int(C.libusb_free_streams(dev, (*C.uchar)(&endpoints[0]), (C.int)(len(endpoints)))) + if rc != 0 { + return &libusb_error{rc} + } + return nil +} + +func Alloc_Transfer(iso_packets int) (*Transfer, error) { + ptr := C.libusb_alloc_transfer((C.int)(iso_packets)) + if ptr == nil { + return nil, &libusb_error{ERROR_OTHER} + } + return ptr.c2go(), nil +} + +func Free_Transfer(transfer *Transfer) { + C.libusb_free_transfer(transfer.ptr) +} + +func Submit_Transfer(transfer *Transfer) error { + rc := int(C.libusb_submit_transfer(transfer.go2c())) + if rc != 0 { + return &libusb_error{rc} + } + return nil +} + +func Cancel_Transfer(transfer *Transfer) error { + rc := int(C.libusb_cancel_transfer(transfer.go2c())) + if rc != 0 { + return &libusb_error{rc} + } + return nil +} + +func Transfer_Set_Stream_ID(transfer *Transfer, stream_id uint32) { + C.libusb_transfer_set_stream_id(transfer.go2c(), (C.uint32_t)(stream_id)) +} + +func Transfer_Get_Stream_ID(transfer *Transfer) uint32 { + return uint32(C.libusb_transfer_get_stream_id(transfer.go2c())) +} + +func Control_Transfer_Get_Data(transfer *Transfer) *byte { + // should this return a slice? - what's the length? + return (*byte)(C.libusb_control_transfer_get_data(transfer.go2c())) +} + +// static struct libusb_control_setup * libusb_control_transfer_get_setup (struct libusb_transfer *transfer) +// static void libusb_fill_control_setup (unsigned char *buffer, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength) +// static void libusb_fill_control_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +// static void libusb_fill_bulk_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +// static void libusb_fill_bulk_stream_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, uint32_t stream_id, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +// static void libusb_fill_interrupt_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +// static void libusb_fill_iso_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, int num_iso_packets, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) +// static void libusb_set_iso_packet_lengths (struct libusb_transfer *transfer, unsigned int length) +// static unsigned char * libusb_get_iso_packet_buffer (struct libusb_transfer *transfer, unsigned int packet) +// static unsigned char * libusb_get_iso_packet_buffer_simple (struct libusb_transfer *transfer, unsigned int packet) + +//----------------------------------------------------------------------------- +// Polling and timing + +// int libusb_try_lock_events (libusb_context *ctx) +// void libusb_lock_events (libusb_context *ctx) +// void libusb_unlock_events (libusb_context *ctx) +// int libusb_event_handling_ok (libusb_context *ctx) +// int libusb_event_handler_active (libusb_context *ctx) +// void libusb_lock_event_waiters (libusb_context *ctx) +// void libusb_unlock_event_waiters (libusb_context *ctx) +// int libusb_wait_for_event (libusb_context *ctx, struct timeval *tv) +// int libusb_handle_events_timeout_completed (libusb_context *ctx, struct timeval *tv, int *completed) +// int libusb_handle_events_timeout (libusb_context *ctx, struct timeval *tv) +// int libusb_handle_events (libusb_context *ctx) +// int libusb_handle_events_completed (libusb_context *ctx, int *completed) +// int libusb_handle_events_locked (libusb_context *ctx, struct timeval *tv) +// int libusb_pollfds_handle_timeouts (libusb_context *ctx) +// int libusb_get_next_timeout (libusb_context *ctx, struct timeval *tv) +// void libusb_set_pollfd_notifiers (libusb_context *ctx, libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, void *user_data) +// const struct libusb_pollfd ** libusb_get_pollfds (libusb_context *ctx) +// void libusb_free_pollfds (const struct libusb_pollfd **pollfds) + +//----------------------------------------------------------------------------- +// Synchronous device I/O + +func Control_Transfer(hdl Device_Handle, bmRequestType uint8, bRequest uint8, wValue uint16, wIndex uint16, data []byte, timeout uint) ([]byte, error) { + rc := int(C.libusb_control_transfer(hdl, (C.uint8_t)(bmRequestType), (C.uint8_t)(bRequest), (C.uint16_t)(wValue), (C.uint16_t)(wIndex), + (*C.uchar)(&data[0]), (C.uint16_t)(len(data)), (C.uint)(timeout))) + if rc < 0 { + return nil, &libusb_error{rc} + } + return data[:rc], nil +} + +func Bulk_Transfer(hdl Device_Handle, endpoint uint8, data []byte, timeout uint) ([]byte, error) { + var transferred C.int + rc := int(C.libusb_bulk_transfer(hdl, (C.uchar)(endpoint), (*C.uchar)(&data[0]), (C.int)(len(data)), &transferred, (C.uint)(timeout))) + if rc != 0 { + return nil, &libusb_error{rc} + } + return data[:int(transferred)], nil +} + +func Interrupt_Transfer(hdl Device_Handle, endpoint uint8, data []byte, timeout uint) ([]byte, error) { + var transferred C.int + rc := int(C.libusb_interrupt_transfer(hdl, (C.uchar)(endpoint), (*C.uchar)(&data[0]), (C.int)(len(data)), &transferred, (C.uint)(timeout))) + if rc != 0 { + return nil, &libusb_error{rc} + } + return data[:int(transferred)], nil +} + +// libusb_cancel_sync_transfers_on_device(struct libusb_device_handle *dev_handle) { +func Cancel_Sync_Transfers_On_Device(hdl Device_Handle) { + C.libusb_cancel_sync_transfers_on_device(hdl) +} + +//----------------------------------------------------------------------------- diff --git a/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/log.go b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/log.go new file mode 100644 index 00000000..f0a0900e --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-go/src/usb/lowlevel/libusb/log.go @@ -0,0 +1,20 @@ +package libusb + +import ( + "io" +) + +import "C" + +var writer io.Writer + +func SetLogWriter(l io.Writer) { + writer = l +} + +//export goLibusbLog +func goLibusbLog(s *C.char) { + if writer != nil { + writer.Write([]byte(C.GoString(s))) + } +} diff --git a/vendor/github.com/fibercrypto/skywallet-protob/go/google/protobuf/descriptor.pb.go b/vendor/github.com/fibercrypto/skywallet-protob/go/google/protobuf/descriptor.pb.go new file mode 100644 index 00000000..52d6b703 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-protob/go/google/protobuf/descriptor.pb.go @@ -0,0 +1,2201 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: google/protobuf/descriptor.proto + +package google_protobuf + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type FieldDescriptorProto_Type int32 + +const ( + // 0 is reserved for errors. + // Order is weird for historical reasons. + FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1 + FieldDescriptorProto_TYPE_FLOAT FieldDescriptorProto_Type = 2 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT64 FieldDescriptorProto_Type = 3 + FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4 + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + FieldDescriptorProto_TYPE_INT32 FieldDescriptorProto_Type = 5 + FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6 + FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7 + FieldDescriptorProto_TYPE_BOOL FieldDescriptorProto_Type = 8 + FieldDescriptorProto_TYPE_STRING FieldDescriptorProto_Type = 9 + FieldDescriptorProto_TYPE_GROUP FieldDescriptorProto_Type = 10 + FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11 + // New in version 2. + FieldDescriptorProto_TYPE_BYTES FieldDescriptorProto_Type = 12 + FieldDescriptorProto_TYPE_UINT32 FieldDescriptorProto_Type = 13 + FieldDescriptorProto_TYPE_ENUM FieldDescriptorProto_Type = 14 + FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15 + FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16 + FieldDescriptorProto_TYPE_SINT32 FieldDescriptorProto_Type = 17 + FieldDescriptorProto_TYPE_SINT64 FieldDescriptorProto_Type = 18 +) + +var FieldDescriptorProto_Type_name = map[int32]string{ + 1: "TYPE_DOUBLE", + 2: "TYPE_FLOAT", + 3: "TYPE_INT64", + 4: "TYPE_UINT64", + 5: "TYPE_INT32", + 6: "TYPE_FIXED64", + 7: "TYPE_FIXED32", + 8: "TYPE_BOOL", + 9: "TYPE_STRING", + 10: "TYPE_GROUP", + 11: "TYPE_MESSAGE", + 12: "TYPE_BYTES", + 13: "TYPE_UINT32", + 14: "TYPE_ENUM", + 15: "TYPE_SFIXED32", + 16: "TYPE_SFIXED64", + 17: "TYPE_SINT32", + 18: "TYPE_SINT64", +} +var FieldDescriptorProto_Type_value = map[string]int32{ + "TYPE_DOUBLE": 1, + "TYPE_FLOAT": 2, + "TYPE_INT64": 3, + "TYPE_UINT64": 4, + "TYPE_INT32": 5, + "TYPE_FIXED64": 6, + "TYPE_FIXED32": 7, + "TYPE_BOOL": 8, + "TYPE_STRING": 9, + "TYPE_GROUP": 10, + "TYPE_MESSAGE": 11, + "TYPE_BYTES": 12, + "TYPE_UINT32": 13, + "TYPE_ENUM": 14, + "TYPE_SFIXED32": 15, + "TYPE_SFIXED64": 16, + "TYPE_SINT32": 17, + "TYPE_SINT64": 18, +} + +func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type { + p := new(FieldDescriptorProto_Type) + *p = x + return p +} +func (x FieldDescriptorProto_Type) String() string { + return proto.EnumName(FieldDescriptorProto_Type_name, int32(x)) +} +func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type") + if err != nil { + return err + } + *x = FieldDescriptorProto_Type(value) + return nil +} +func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{3, 0} +} + +type FieldDescriptorProto_Label int32 + +const ( + // 0 is reserved for errors + FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1 + FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 + FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3 +) + +var FieldDescriptorProto_Label_name = map[int32]string{ + 1: "LABEL_OPTIONAL", + 2: "LABEL_REQUIRED", + 3: "LABEL_REPEATED", +} +var FieldDescriptorProto_Label_value = map[string]int32{ + "LABEL_OPTIONAL": 1, + "LABEL_REQUIRED": 2, + "LABEL_REPEATED": 3, +} + +func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label { + p := new(FieldDescriptorProto_Label) + *p = x + return p +} +func (x FieldDescriptorProto_Label) String() string { + return proto.EnumName(FieldDescriptorProto_Label_name, int32(x)) +} +func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label") + if err != nil { + return err + } + *x = FieldDescriptorProto_Label(value) + return nil +} +func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{3, 1} +} + +// Generated classes can be optimized for speed or code size. +type FileOptions_OptimizeMode int32 + +const ( + FileOptions_SPEED FileOptions_OptimizeMode = 1 + // etc. + FileOptions_CODE_SIZE FileOptions_OptimizeMode = 2 + FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3 +) + +var FileOptions_OptimizeMode_name = map[int32]string{ + 1: "SPEED", + 2: "CODE_SIZE", + 3: "LITE_RUNTIME", +} +var FileOptions_OptimizeMode_value = map[string]int32{ + "SPEED": 1, + "CODE_SIZE": 2, + "LITE_RUNTIME": 3, +} + +func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode { + p := new(FileOptions_OptimizeMode) + *p = x + return p +} +func (x FileOptions_OptimizeMode) String() string { + return proto.EnumName(FileOptions_OptimizeMode_name, int32(x)) +} +func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode") + if err != nil { + return err + } + *x = FileOptions_OptimizeMode(value) + return nil +} +func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{9, 0} +} + +type FieldOptions_CType int32 + +const ( + // Default mode. + FieldOptions_STRING FieldOptions_CType = 0 + FieldOptions_CORD FieldOptions_CType = 1 + FieldOptions_STRING_PIECE FieldOptions_CType = 2 +) + +var FieldOptions_CType_name = map[int32]string{ + 0: "STRING", + 1: "CORD", + 2: "STRING_PIECE", +} +var FieldOptions_CType_value = map[string]int32{ + "STRING": 0, + "CORD": 1, + "STRING_PIECE": 2, +} + +func (x FieldOptions_CType) Enum() *FieldOptions_CType { + p := new(FieldOptions_CType) + *p = x + return p +} +func (x FieldOptions_CType) String() string { + return proto.EnumName(FieldOptions_CType_name, int32(x)) +} +func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType") + if err != nil { + return err + } + *x = FieldOptions_CType(value) + return nil +} +func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{11, 0} +} + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +type FileDescriptorSet struct { + File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorSet) Reset() { *m = FileDescriptorSet{} } +func (m *FileDescriptorSet) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorSet) ProtoMessage() {} +func (*FileDescriptorSet) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{0} +} +func (m *FileDescriptorSet) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorSet.Unmarshal(m, b) +} +func (m *FileDescriptorSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorSet.Marshal(b, m, deterministic) +} +func (dst *FileDescriptorSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorSet.Merge(dst, src) +} +func (m *FileDescriptorSet) XXX_Size() int { + return xxx_messageInfo_FileDescriptorSet.Size(m) +} +func (m *FileDescriptorSet) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorSet.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorSet proto.InternalMessageInfo + +func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto { + if m != nil { + return m.File + } + return nil +} + +// Describes a complete .proto file. +type FileDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` + // Names of files imported by this file. + Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"` + // Indexes of the public imported files in the dependency list above. + PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"` + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"` + // All top-level definitions in this file. + MessageType []*DescriptorProto `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + Service []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"` + Options *FileOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` + // The syntax of the proto file. + // The supported values are "proto2" and "proto3". + Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileDescriptorProto) Reset() { *m = FileDescriptorProto{} } +func (m *FileDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FileDescriptorProto) ProtoMessage() {} +func (*FileDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{1} +} +func (m *FileDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileDescriptorProto.Unmarshal(m, b) +} +func (m *FileDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *FileDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileDescriptorProto.Merge(dst, src) +} +func (m *FileDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FileDescriptorProto.Size(m) +} +func (m *FileDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FileDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FileDescriptorProto proto.InternalMessageInfo + +func (m *FileDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FileDescriptorProto) GetPackage() string { + if m != nil && m.Package != nil { + return *m.Package + } + return "" +} + +func (m *FileDescriptorProto) GetDependency() []string { + if m != nil { + return m.Dependency + } + return nil +} + +func (m *FileDescriptorProto) GetPublicDependency() []int32 { + if m != nil { + return m.PublicDependency + } + return nil +} + +func (m *FileDescriptorProto) GetWeakDependency() []int32 { + if m != nil { + return m.WeakDependency + } + return nil +} + +func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto { + if m != nil { + return m.MessageType + } + return nil +} + +func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto { + if m != nil { + return m.Service + } + return nil +} + +func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *FileDescriptorProto) GetOptions() *FileOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo { + if m != nil { + return m.SourceCodeInfo + } + return nil +} + +func (m *FileDescriptorProto) GetSyntax() string { + if m != nil && m.Syntax != nil { + return *m.Syntax + } + return "" +} + +// Describes a message type. +type DescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Field []*FieldDescriptorProto `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"` + Extension []*FieldDescriptorProto `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"` + NestedType []*DescriptorProto `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"` + EnumType []*EnumDescriptorProto `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"` + ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"` + OneofDecl []*OneofDescriptorProto `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"` + Options *MessageOptions `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto) Reset() { *m = DescriptorProto{} } +func (m *DescriptorProto) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto) ProtoMessage() {} +func (*DescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{2} +} +func (m *DescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto.Unmarshal(m, b) +} +func (m *DescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto.Marshal(b, m, deterministic) +} +func (dst *DescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto.Merge(dst, src) +} +func (m *DescriptorProto) XXX_Size() int { + return xxx_messageInfo_DescriptorProto.Size(m) +} +func (m *DescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto proto.InternalMessageInfo + +func (m *DescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *DescriptorProto) GetField() []*FieldDescriptorProto { + if m != nil { + return m.Field + } + return nil +} + +func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto { + if m != nil { + return m.Extension + } + return nil +} + +func (m *DescriptorProto) GetNestedType() []*DescriptorProto { + if m != nil { + return m.NestedType + } + return nil +} + +func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto { + if m != nil { + return m.EnumType + } + return nil +} + +func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange { + if m != nil { + return m.ExtensionRange + } + return nil +} + +func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto { + if m != nil { + return m.OneofDecl + } + return nil +} + +func (m *DescriptorProto) GetOptions() *MessageOptions { + if m != nil { + return m.Options + } + return nil +} + +type DescriptorProto_ExtensionRange struct { + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DescriptorProto_ExtensionRange) Reset() { *m = DescriptorProto_ExtensionRange{} } +func (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) } +func (*DescriptorProto_ExtensionRange) ProtoMessage() {} +func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{2, 0} +} +func (m *DescriptorProto_ExtensionRange) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Unmarshal(m, b) +} +func (m *DescriptorProto_ExtensionRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Marshal(b, m, deterministic) +} +func (dst *DescriptorProto_ExtensionRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_DescriptorProto_ExtensionRange.Merge(dst, src) +} +func (m *DescriptorProto_ExtensionRange) XXX_Size() int { + return xxx_messageInfo_DescriptorProto_ExtensionRange.Size(m) +} +func (m *DescriptorProto_ExtensionRange) XXX_DiscardUnknown() { + xxx_messageInfo_DescriptorProto_ExtensionRange.DiscardUnknown(m) +} + +var xxx_messageInfo_DescriptorProto_ExtensionRange proto.InternalMessageInfo + +func (m *DescriptorProto_ExtensionRange) GetStart() int32 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *DescriptorProto_ExtensionRange) GetEnd() int32 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +// Describes a field within a message. +type FieldDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,3,opt,name=number" json:"number,omitempty"` + Label *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"` + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"` + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"` + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"` + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. Extensions of a oneof should + // not set this since the oneof to which they belong will be inferred based + // on the extension range containing the extension's field number. + OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"` + Options *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldDescriptorProto) Reset() { *m = FieldDescriptorProto{} } +func (m *FieldDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*FieldDescriptorProto) ProtoMessage() {} +func (*FieldDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{3} +} +func (m *FieldDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldDescriptorProto.Unmarshal(m, b) +} +func (m *FieldDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *FieldDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldDescriptorProto.Merge(dst, src) +} +func (m *FieldDescriptorProto) XXX_Size() int { + return xxx_messageInfo_FieldDescriptorProto.Size(m) +} +func (m *FieldDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_FieldDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldDescriptorProto proto.InternalMessageInfo + +func (m *FieldDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *FieldDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label { + if m != nil && m.Label != nil { + return *m.Label + } + return FieldDescriptorProto_LABEL_OPTIONAL +} + +func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return FieldDescriptorProto_TYPE_DOUBLE +} + +func (m *FieldDescriptorProto) GetTypeName() string { + if m != nil && m.TypeName != nil { + return *m.TypeName + } + return "" +} + +func (m *FieldDescriptorProto) GetExtendee() string { + if m != nil && m.Extendee != nil { + return *m.Extendee + } + return "" +} + +func (m *FieldDescriptorProto) GetDefaultValue() string { + if m != nil && m.DefaultValue != nil { + return *m.DefaultValue + } + return "" +} + +func (m *FieldDescriptorProto) GetOneofIndex() int32 { + if m != nil && m.OneofIndex != nil { + return *m.OneofIndex + } + return 0 +} + +func (m *FieldDescriptorProto) GetOptions() *FieldOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a oneof. +type OneofDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *OneofDescriptorProto) Reset() { *m = OneofDescriptorProto{} } +func (m *OneofDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*OneofDescriptorProto) ProtoMessage() {} +func (*OneofDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{4} +} +func (m *OneofDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_OneofDescriptorProto.Unmarshal(m, b) +} +func (m *OneofDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_OneofDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *OneofDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_OneofDescriptorProto.Merge(dst, src) +} +func (m *OneofDescriptorProto) XXX_Size() int { + return xxx_messageInfo_OneofDescriptorProto.Size(m) +} +func (m *OneofDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_OneofDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_OneofDescriptorProto proto.InternalMessageInfo + +func (m *OneofDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +// Describes an enum type. +type EnumDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumDescriptorProto) Reset() { *m = EnumDescriptorProto{} } +func (m *EnumDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumDescriptorProto) ProtoMessage() {} +func (*EnumDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{5} +} +func (m *EnumDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumDescriptorProto.Unmarshal(m, b) +} +func (m *EnumDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *EnumDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumDescriptorProto.Merge(dst, src) +} +func (m *EnumDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumDescriptorProto.Size(m) +} +func (m *EnumDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumDescriptorProto proto.InternalMessageInfo + +func (m *EnumDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto { + if m != nil { + return m.Value + } + return nil +} + +func (m *EnumDescriptorProto) GetOptions() *EnumOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a value within an enum. +type EnumValueDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` + Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueDescriptorProto) Reset() { *m = EnumValueDescriptorProto{} } +func (m *EnumValueDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*EnumValueDescriptorProto) ProtoMessage() {} +func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{6} +} +func (m *EnumValueDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueDescriptorProto.Unmarshal(m, b) +} +func (m *EnumValueDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *EnumValueDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueDescriptorProto.Merge(dst, src) +} +func (m *EnumValueDescriptorProto) XXX_Size() int { + return xxx_messageInfo_EnumValueDescriptorProto.Size(m) +} +func (m *EnumValueDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueDescriptorProto proto.InternalMessageInfo + +func (m *EnumValueDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *EnumValueDescriptorProto) GetNumber() int32 { + if m != nil && m.Number != nil { + return *m.Number + } + return 0 +} + +func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a service. +type ServiceDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` + Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceDescriptorProto) Reset() { *m = ServiceDescriptorProto{} } +func (m *ServiceDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*ServiceDescriptorProto) ProtoMessage() {} +func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{7} +} +func (m *ServiceDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceDescriptorProto.Unmarshal(m, b) +} +func (m *ServiceDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *ServiceDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceDescriptorProto.Merge(dst, src) +} +func (m *ServiceDescriptorProto) XXX_Size() int { + return xxx_messageInfo_ServiceDescriptorProto.Size(m) +} +func (m *ServiceDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceDescriptorProto proto.InternalMessageInfo + +func (m *ServiceDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto { + if m != nil { + return m.Method + } + return nil +} + +func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions { + if m != nil { + return m.Options + } + return nil +} + +// Describes a method of a service. +type MethodDescriptorProto struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + InputType *string `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"` + OutputType *string `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"` + Options *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"` + // Identifies if client streams multiple client messages + ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` + // Identifies if server streams multiple server messages + ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodDescriptorProto) Reset() { *m = MethodDescriptorProto{} } +func (m *MethodDescriptorProto) String() string { return proto.CompactTextString(m) } +func (*MethodDescriptorProto) ProtoMessage() {} +func (*MethodDescriptorProto) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{8} +} +func (m *MethodDescriptorProto) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodDescriptorProto.Unmarshal(m, b) +} +func (m *MethodDescriptorProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodDescriptorProto.Marshal(b, m, deterministic) +} +func (dst *MethodDescriptorProto) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodDescriptorProto.Merge(dst, src) +} +func (m *MethodDescriptorProto) XXX_Size() int { + return xxx_messageInfo_MethodDescriptorProto.Size(m) +} +func (m *MethodDescriptorProto) XXX_DiscardUnknown() { + xxx_messageInfo_MethodDescriptorProto.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodDescriptorProto proto.InternalMessageInfo + +const Default_MethodDescriptorProto_ClientStreaming bool = false +const Default_MethodDescriptorProto_ServerStreaming bool = false + +func (m *MethodDescriptorProto) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MethodDescriptorProto) GetInputType() string { + if m != nil && m.InputType != nil { + return *m.InputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOutputType() string { + if m != nil && m.OutputType != nil { + return *m.OutputType + } + return "" +} + +func (m *MethodDescriptorProto) GetOptions() *MethodOptions { + if m != nil { + return m.Options + } + return nil +} + +func (m *MethodDescriptorProto) GetClientStreaming() bool { + if m != nil && m.ClientStreaming != nil { + return *m.ClientStreaming + } + return Default_MethodDescriptorProto_ClientStreaming +} + +func (m *MethodDescriptorProto) GetServerStreaming() bool { + if m != nil && m.ServerStreaming != nil { + return *m.ServerStreaming + } + return Default_MethodDescriptorProto_ServerStreaming +} + +type FileOptions struct { + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` + // If set true, then the Java code generator will generate equals() and + // hashCode() methods for all messages defined in the .proto file. + // - In the full runtime, this is purely a speed optimization, as the + // AbstractMessage base class includes reflection-based implementations of + // these methods. + // - In the lite runtime, setting this option changes the semantics of + // equals() and hashCode() to more closely match those of the full runtime; + // the generated methods compute their results based on field values rather + // than object identity. (Implementations should not assume that hashcodes + // will be consistent across runtimes or versions of the protocol compiler.) + JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash,def=0" json:"java_generate_equals_and_hash,omitempty"` + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + JavaStringCheckUtf8 *bool `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"` + OptimizeFor *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"` + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"` + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + CcGenericServices *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"` + JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"` + PyGenericServices *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"` + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FileOptions) Reset() { *m = FileOptions{} } +func (m *FileOptions) String() string { return proto.CompactTextString(m) } +func (*FileOptions) ProtoMessage() {} +func (*FileOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{9} +} + +var extRange_FileOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FileOptions +} +func (m *FileOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FileOptions.Unmarshal(m, b) +} +func (m *FileOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FileOptions.Marshal(b, m, deterministic) +} +func (dst *FileOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileOptions.Merge(dst, src) +} +func (m *FileOptions) XXX_Size() int { + return xxx_messageInfo_FileOptions.Size(m) +} +func (m *FileOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FileOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FileOptions proto.InternalMessageInfo + +const Default_FileOptions_JavaMultipleFiles bool = false +const Default_FileOptions_JavaGenerateEqualsAndHash bool = false +const Default_FileOptions_JavaStringCheckUtf8 bool = false +const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED +const Default_FileOptions_CcGenericServices bool = false +const Default_FileOptions_JavaGenericServices bool = false +const Default_FileOptions_PyGenericServices bool = false +const Default_FileOptions_Deprecated bool = false +const Default_FileOptions_CcEnableArenas bool = false + +func (m *FileOptions) GetJavaPackage() string { + if m != nil && m.JavaPackage != nil { + return *m.JavaPackage + } + return "" +} + +func (m *FileOptions) GetJavaOuterClassname() string { + if m != nil && m.JavaOuterClassname != nil { + return *m.JavaOuterClassname + } + return "" +} + +func (m *FileOptions) GetJavaMultipleFiles() bool { + if m != nil && m.JavaMultipleFiles != nil { + return *m.JavaMultipleFiles + } + return Default_FileOptions_JavaMultipleFiles +} + +func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool { + if m != nil && m.JavaGenerateEqualsAndHash != nil { + return *m.JavaGenerateEqualsAndHash + } + return Default_FileOptions_JavaGenerateEqualsAndHash +} + +func (m *FileOptions) GetJavaStringCheckUtf8() bool { + if m != nil && m.JavaStringCheckUtf8 != nil { + return *m.JavaStringCheckUtf8 + } + return Default_FileOptions_JavaStringCheckUtf8 +} + +func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode { + if m != nil && m.OptimizeFor != nil { + return *m.OptimizeFor + } + return Default_FileOptions_OptimizeFor +} + +func (m *FileOptions) GetGoPackage() string { + if m != nil && m.GoPackage != nil { + return *m.GoPackage + } + return "" +} + +func (m *FileOptions) GetCcGenericServices() bool { + if m != nil && m.CcGenericServices != nil { + return *m.CcGenericServices + } + return Default_FileOptions_CcGenericServices +} + +func (m *FileOptions) GetJavaGenericServices() bool { + if m != nil && m.JavaGenericServices != nil { + return *m.JavaGenericServices + } + return Default_FileOptions_JavaGenericServices +} + +func (m *FileOptions) GetPyGenericServices() bool { + if m != nil && m.PyGenericServices != nil { + return *m.PyGenericServices + } + return Default_FileOptions_PyGenericServices +} + +func (m *FileOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FileOptions_Deprecated +} + +func (m *FileOptions) GetCcEnableArenas() bool { + if m != nil && m.CcEnableArenas != nil { + return *m.CcEnableArenas + } + return Default_FileOptions_CcEnableArenas +} + +func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MessageOptions struct { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"` + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"` + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementions still need to work as + // if the field is a repeated message field. + // + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MessageOptions) Reset() { *m = MessageOptions{} } +func (m *MessageOptions) String() string { return proto.CompactTextString(m) } +func (*MessageOptions) ProtoMessage() {} +func (*MessageOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{10} +} + +var extRange_MessageOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MessageOptions +} +func (m *MessageOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MessageOptions.Unmarshal(m, b) +} +func (m *MessageOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MessageOptions.Marshal(b, m, deterministic) +} +func (dst *MessageOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MessageOptions.Merge(dst, src) +} +func (m *MessageOptions) XXX_Size() int { + return xxx_messageInfo_MessageOptions.Size(m) +} +func (m *MessageOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MessageOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MessageOptions proto.InternalMessageInfo + +const Default_MessageOptions_MessageSetWireFormat bool = false +const Default_MessageOptions_NoStandardDescriptorAccessor bool = false +const Default_MessageOptions_Deprecated bool = false + +func (m *MessageOptions) GetMessageSetWireFormat() bool { + if m != nil && m.MessageSetWireFormat != nil { + return *m.MessageSetWireFormat + } + return Default_MessageOptions_MessageSetWireFormat +} + +func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool { + if m != nil && m.NoStandardDescriptorAccessor != nil { + return *m.NoStandardDescriptorAccessor + } + return Default_MessageOptions_NoStandardDescriptorAccessor +} + +func (m *MessageOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MessageOptions_Deprecated +} + +func (m *MessageOptions) GetMapEntry() bool { + if m != nil && m.MapEntry != nil { + return *m.MapEntry + } + return false +} + +func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type FieldOptions struct { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. + Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outher message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // For Google-internal migration only. Do not use. + Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FieldOptions) Reset() { *m = FieldOptions{} } +func (m *FieldOptions) String() string { return proto.CompactTextString(m) } +func (*FieldOptions) ProtoMessage() {} +func (*FieldOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{11} +} + +var extRange_FieldOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_FieldOptions +} +func (m *FieldOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_FieldOptions.Unmarshal(m, b) +} +func (m *FieldOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_FieldOptions.Marshal(b, m, deterministic) +} +func (dst *FieldOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_FieldOptions.Merge(dst, src) +} +func (m *FieldOptions) XXX_Size() int { + return xxx_messageInfo_FieldOptions.Size(m) +} +func (m *FieldOptions) XXX_DiscardUnknown() { + xxx_messageInfo_FieldOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_FieldOptions proto.InternalMessageInfo + +const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING +const Default_FieldOptions_Lazy bool = false +const Default_FieldOptions_Deprecated bool = false +const Default_FieldOptions_Weak bool = false + +func (m *FieldOptions) GetCtype() FieldOptions_CType { + if m != nil && m.Ctype != nil { + return *m.Ctype + } + return Default_FieldOptions_Ctype +} + +func (m *FieldOptions) GetPacked() bool { + if m != nil && m.Packed != nil { + return *m.Packed + } + return false +} + +func (m *FieldOptions) GetLazy() bool { + if m != nil && m.Lazy != nil { + return *m.Lazy + } + return Default_FieldOptions_Lazy +} + +func (m *FieldOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_FieldOptions_Deprecated +} + +func (m *FieldOptions) GetWeak() bool { + if m != nil && m.Weak != nil { + return *m.Weak + } + return Default_FieldOptions_Weak +} + +func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumOptions struct { + // Set this option to true to allow mapping different tag names to the same + // value. + AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"` + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumOptions) Reset() { *m = EnumOptions{} } +func (m *EnumOptions) String() string { return proto.CompactTextString(m) } +func (*EnumOptions) ProtoMessage() {} +func (*EnumOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{12} +} + +var extRange_EnumOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumOptions +} +func (m *EnumOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumOptions.Unmarshal(m, b) +} +func (m *EnumOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumOptions.Marshal(b, m, deterministic) +} +func (dst *EnumOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumOptions.Merge(dst, src) +} +func (m *EnumOptions) XXX_Size() int { + return xxx_messageInfo_EnumOptions.Size(m) +} +func (m *EnumOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumOptions proto.InternalMessageInfo + +const Default_EnumOptions_Deprecated bool = false + +func (m *EnumOptions) GetAllowAlias() bool { + if m != nil && m.AllowAlias != nil { + return *m.AllowAlias + } + return false +} + +func (m *EnumOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumOptions_Deprecated +} + +func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type EnumValueOptions struct { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EnumValueOptions) Reset() { *m = EnumValueOptions{} } +func (m *EnumValueOptions) String() string { return proto.CompactTextString(m) } +func (*EnumValueOptions) ProtoMessage() {} +func (*EnumValueOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{13} +} + +var extRange_EnumValueOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_EnumValueOptions +} +func (m *EnumValueOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EnumValueOptions.Unmarshal(m, b) +} +func (m *EnumValueOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EnumValueOptions.Marshal(b, m, deterministic) +} +func (dst *EnumValueOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnumValueOptions.Merge(dst, src) +} +func (m *EnumValueOptions) XXX_Size() int { + return xxx_messageInfo_EnumValueOptions.Size(m) +} +func (m *EnumValueOptions) XXX_DiscardUnknown() { + xxx_messageInfo_EnumValueOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_EnumValueOptions proto.InternalMessageInfo + +const Default_EnumValueOptions_Deprecated bool = false + +func (m *EnumValueOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_EnumValueOptions_Deprecated +} + +func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type ServiceOptions struct { + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ServiceOptions) Reset() { *m = ServiceOptions{} } +func (m *ServiceOptions) String() string { return proto.CompactTextString(m) } +func (*ServiceOptions) ProtoMessage() {} +func (*ServiceOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{14} +} + +var extRange_ServiceOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_ServiceOptions +} +func (m *ServiceOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ServiceOptions.Unmarshal(m, b) +} +func (m *ServiceOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ServiceOptions.Marshal(b, m, deterministic) +} +func (dst *ServiceOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_ServiceOptions.Merge(dst, src) +} +func (m *ServiceOptions) XXX_Size() int { + return xxx_messageInfo_ServiceOptions.Size(m) +} +func (m *ServiceOptions) XXX_DiscardUnknown() { + xxx_messageInfo_ServiceOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_ServiceOptions proto.InternalMessageInfo + +const Default_ServiceOptions_Deprecated bool = false + +func (m *ServiceOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_ServiceOptions_Deprecated +} + +func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +type MethodOptions struct { + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // The parser stores options it doesn't recognize here. See above. + UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + proto.XXX_InternalExtensions `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MethodOptions) Reset() { *m = MethodOptions{} } +func (m *MethodOptions) String() string { return proto.CompactTextString(m) } +func (*MethodOptions) ProtoMessage() {} +func (*MethodOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{15} +} + +var extRange_MethodOptions = []proto.ExtensionRange{ + {Start: 1000, End: 536870911}, +} + +func (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MethodOptions +} +func (m *MethodOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MethodOptions.Unmarshal(m, b) +} +func (m *MethodOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MethodOptions.Marshal(b, m, deterministic) +} +func (dst *MethodOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MethodOptions.Merge(dst, src) +} +func (m *MethodOptions) XXX_Size() int { + return xxx_messageInfo_MethodOptions.Size(m) +} +func (m *MethodOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MethodOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MethodOptions proto.InternalMessageInfo + +const Default_MethodOptions_Deprecated bool = false + +func (m *MethodOptions) GetDeprecated() bool { + if m != nil && m.Deprecated != nil { + return *m.Deprecated + } + return Default_MethodOptions_Deprecated +} + +func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { + if m != nil { + return m.UninterpretedOption + } + return nil +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +type UninterpretedOption struct { + Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` + PositiveIntValue *uint64 `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"` + NegativeIntValue *int64 `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` + StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` + AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption) Reset() { *m = UninterpretedOption{} } +func (m *UninterpretedOption) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption) ProtoMessage() {} +func (*UninterpretedOption) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{16} +} +func (m *UninterpretedOption) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption.Unmarshal(m, b) +} +func (m *UninterpretedOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption.Marshal(b, m, deterministic) +} +func (dst *UninterpretedOption) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption.Merge(dst, src) +} +func (m *UninterpretedOption) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption.Size(m) +} +func (m *UninterpretedOption) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption proto.InternalMessageInfo + +func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart { + if m != nil { + return m.Name + } + return nil +} + +func (m *UninterpretedOption) GetIdentifierValue() string { + if m != nil && m.IdentifierValue != nil { + return *m.IdentifierValue + } + return "" +} + +func (m *UninterpretedOption) GetPositiveIntValue() uint64 { + if m != nil && m.PositiveIntValue != nil { + return *m.PositiveIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetNegativeIntValue() int64 { + if m != nil && m.NegativeIntValue != nil { + return *m.NegativeIntValue + } + return 0 +} + +func (m *UninterpretedOption) GetDoubleValue() float64 { + if m != nil && m.DoubleValue != nil { + return *m.DoubleValue + } + return 0 +} + +func (m *UninterpretedOption) GetStringValue() []byte { + if m != nil { + return m.StringValue + } + return nil +} + +func (m *UninterpretedOption) GetAggregateValue() string { + if m != nil && m.AggregateValue != nil { + return *m.AggregateValue + } + return "" +} + +// The name of the uninterpreted option. Each string represents a segment in +// a dot-separated name. is_extension is true iff a segment represents an +// extension (denoted with parentheses in options specs in .proto files). +// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents +// "foo.(bar.baz).qux". +type UninterpretedOption_NamePart struct { + NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` + IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UninterpretedOption_NamePart) Reset() { *m = UninterpretedOption_NamePart{} } +func (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) } +func (*UninterpretedOption_NamePart) ProtoMessage() {} +func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{16, 0} +} +func (m *UninterpretedOption_NamePart) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_UninterpretedOption_NamePart.Unmarshal(m, b) +} +func (m *UninterpretedOption_NamePart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_UninterpretedOption_NamePart.Marshal(b, m, deterministic) +} +func (dst *UninterpretedOption_NamePart) XXX_Merge(src proto.Message) { + xxx_messageInfo_UninterpretedOption_NamePart.Merge(dst, src) +} +func (m *UninterpretedOption_NamePart) XXX_Size() int { + return xxx_messageInfo_UninterpretedOption_NamePart.Size(m) +} +func (m *UninterpretedOption_NamePart) XXX_DiscardUnknown() { + xxx_messageInfo_UninterpretedOption_NamePart.DiscardUnknown(m) +} + +var xxx_messageInfo_UninterpretedOption_NamePart proto.InternalMessageInfo + +func (m *UninterpretedOption_NamePart) GetNamePart() string { + if m != nil && m.NamePart != nil { + return *m.NamePart + } + return "" +} + +func (m *UninterpretedOption_NamePart) GetIsExtension() bool { + if m != nil && m.IsExtension != nil { + return *m.IsExtension + } + return false +} + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +type SourceCodeInfo struct { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo) Reset() { *m = SourceCodeInfo{} } +func (m *SourceCodeInfo) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo) ProtoMessage() {} +func (*SourceCodeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{17} +} +func (m *SourceCodeInfo) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo.Unmarshal(m, b) +} +func (m *SourceCodeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo.Marshal(b, m, deterministic) +} +func (dst *SourceCodeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo.Merge(dst, src) +} +func (m *SourceCodeInfo) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo.Size(m) +} +func (m *SourceCodeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo proto.InternalMessageInfo + +func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { + if m != nil { + return m.Location + } + return nil +} + +type SourceCodeInfo_Location struct { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"` + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` + TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SourceCodeInfo_Location) Reset() { *m = SourceCodeInfo_Location{} } +func (m *SourceCodeInfo_Location) String() string { return proto.CompactTextString(m) } +func (*SourceCodeInfo_Location) ProtoMessage() {} +func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { + return fileDescriptor_descriptor_1315903dacfcb8f9, []int{17, 0} +} +func (m *SourceCodeInfo_Location) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SourceCodeInfo_Location.Unmarshal(m, b) +} +func (m *SourceCodeInfo_Location) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SourceCodeInfo_Location.Marshal(b, m, deterministic) +} +func (dst *SourceCodeInfo_Location) XXX_Merge(src proto.Message) { + xxx_messageInfo_SourceCodeInfo_Location.Merge(dst, src) +} +func (m *SourceCodeInfo_Location) XXX_Size() int { + return xxx_messageInfo_SourceCodeInfo_Location.Size(m) +} +func (m *SourceCodeInfo_Location) XXX_DiscardUnknown() { + xxx_messageInfo_SourceCodeInfo_Location.DiscardUnknown(m) +} + +var xxx_messageInfo_SourceCodeInfo_Location proto.InternalMessageInfo + +func (m *SourceCodeInfo_Location) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +func (m *SourceCodeInfo_Location) GetSpan() []int32 { + if m != nil { + return m.Span + } + return nil +} + +func (m *SourceCodeInfo_Location) GetLeadingComments() string { + if m != nil && m.LeadingComments != nil { + return *m.LeadingComments + } + return "" +} + +func (m *SourceCodeInfo_Location) GetTrailingComments() string { + if m != nil && m.TrailingComments != nil { + return *m.TrailingComments + } + return "" +} + +func init() { + proto.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet") + proto.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto") + proto.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto") + proto.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange") + proto.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto") + proto.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto") + proto.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto") + proto.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto") + proto.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto") + proto.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto") + proto.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions") + proto.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions") + proto.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions") + proto.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions") + proto.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions") + proto.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions") + proto.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions") + proto.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption") + proto.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart") + proto.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo") + proto.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location") + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value) + proto.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value) + proto.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value) + proto.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value) +} + +func init() { + proto.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor_descriptor_1315903dacfcb8f9) +} + +var fileDescriptor_descriptor_1315903dacfcb8f9 = []byte{ + // 1981 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4f, 0x73, 0x1b, 0x49, + 0x15, 0x67, 0xf4, 0xcf, 0xd2, 0x93, 0x2c, 0xb7, 0xdb, 0x5e, 0xef, 0x24, 0xd9, 0x6c, 0x6c, 0x2d, + 0x4b, 0x9c, 0x04, 0xe4, 0x2d, 0x27, 0x31, 0x5e, 0x2f, 0xb5, 0x94, 0x2c, 0x4d, 0xbc, 0xa2, 0x64, + 0xcb, 0x8c, 0x64, 0xc8, 0x72, 0x99, 0x6a, 0xcf, 0xb4, 0xe4, 0x21, 0xa3, 0x1e, 0x31, 0x33, 0x4a, + 0xe2, 0x3d, 0xa5, 0x8a, 0x13, 0x57, 0x8e, 0x40, 0x71, 0xe0, 0xc2, 0x17, 0xa0, 0x38, 0x70, 0xa4, + 0x8a, 0x6f, 0xc1, 0x91, 0x2a, 0xa8, 0xe2, 0x23, 0x70, 0xa1, 0xba, 0x7b, 0x66, 0x34, 0x1a, 0x49, + 0xc4, 0x6c, 0xd5, 0xb2, 0x9c, 0xec, 0xfe, 0xbd, 0xdf, 0x7b, 0x7a, 0xfd, 0xde, 0xeb, 0xd7, 0xaf, + 0x07, 0xb6, 0x87, 0xae, 0x3b, 0x74, 0xe8, 0xde, 0xd8, 0x73, 0x03, 0xf7, 0x72, 0x32, 0xd8, 0xb3, + 0xa8, 0x6f, 0x7a, 0xf6, 0x38, 0x70, 0xbd, 0xba, 0xc0, 0xf0, 0x9a, 0x64, 0xd4, 0x23, 0x46, 0xed, + 0x14, 0xd6, 0x9f, 0xd9, 0x0e, 0x6d, 0xc5, 0xc4, 0x1e, 0x0d, 0xf0, 0x21, 0xe4, 0x06, 0xb6, 0x43, + 0x55, 0x65, 0x3b, 0xbb, 0x5b, 0xde, 0xff, 0x66, 0x3d, 0xa5, 0x54, 0x9f, 0xd5, 0x38, 0xe7, 0xb0, + 0x2e, 0x34, 0x6a, 0x7f, 0xcb, 0xc1, 0xc6, 0x02, 0x29, 0xc6, 0x90, 0x63, 0x64, 0xc4, 0x2d, 0x2a, + 0xbb, 0x25, 0x5d, 0xfc, 0x8f, 0x55, 0x58, 0x19, 0x13, 0xf3, 0x05, 0x19, 0x52, 0x35, 0x23, 0xe0, + 0x68, 0x89, 0xdf, 0x07, 0xb0, 0xe8, 0x98, 0x32, 0x8b, 0x32, 0xf3, 0x5a, 0xcd, 0x6e, 0x67, 0x77, + 0x4b, 0x7a, 0x02, 0xc1, 0x8f, 0x60, 0x7d, 0x3c, 0xb9, 0x74, 0x6c, 0xd3, 0x48, 0xd0, 0x60, 0x3b, + 0xbb, 0x9b, 0xd7, 0x91, 0x14, 0xb4, 0xa6, 0xe4, 0xfb, 0xb0, 0xf6, 0x8a, 0x92, 0x17, 0x49, 0x6a, + 0x59, 0x50, 0xab, 0x1c, 0x4e, 0x10, 0x9b, 0x50, 0x19, 0x51, 0xdf, 0x27, 0x43, 0x6a, 0x04, 0xd7, + 0x63, 0xaa, 0xe6, 0xc4, 0xee, 0xb7, 0xe7, 0x76, 0x9f, 0xde, 0x79, 0x39, 0xd4, 0xea, 0x5f, 0x8f, + 0x29, 0x6e, 0x40, 0x89, 0xb2, 0xc9, 0x48, 0x5a, 0xc8, 0x2f, 0x89, 0x9f, 0xc6, 0x26, 0xa3, 0xb4, + 0x95, 0x22, 0x57, 0x0b, 0x4d, 0xac, 0xf8, 0xd4, 0x7b, 0x69, 0x9b, 0x54, 0x2d, 0x08, 0x03, 0xf7, + 0xe7, 0x0c, 0xf4, 0xa4, 0x3c, 0x6d, 0x23, 0xd2, 0xc3, 0x4d, 0x28, 0xd1, 0xd7, 0x01, 0x65, 0xbe, + 0xed, 0x32, 0x75, 0x45, 0x18, 0xf9, 0x70, 0x41, 0x16, 0xa9, 0x63, 0xa5, 0x4d, 0x4c, 0xf5, 0xf0, + 0x01, 0xac, 0xb8, 0xe3, 0xc0, 0x76, 0x99, 0xaf, 0x16, 0xb7, 0x95, 0xdd, 0xf2, 0xfe, 0x7b, 0x0b, + 0x0b, 0xa1, 0x2b, 0x39, 0x7a, 0x44, 0xc6, 0x6d, 0x40, 0xbe, 0x3b, 0xf1, 0x4c, 0x6a, 0x98, 0xae, + 0x45, 0x0d, 0x9b, 0x0d, 0x5c, 0xb5, 0x24, 0x0c, 0xdc, 0x9b, 0xdf, 0x88, 0x20, 0x36, 0x5d, 0x8b, + 0xb6, 0xd9, 0xc0, 0xd5, 0xab, 0xfe, 0xcc, 0x1a, 0x6f, 0x41, 0xc1, 0xbf, 0x66, 0x01, 0x79, 0xad, + 0x56, 0x44, 0x85, 0x84, 0xab, 0xda, 0x9f, 0x73, 0xb0, 0x76, 0x93, 0x12, 0xfb, 0x04, 0xf2, 0x03, + 0xbe, 0x4b, 0x35, 0xf3, 0xdf, 0xc4, 0x40, 0xea, 0xcc, 0x06, 0xb1, 0xf0, 0x25, 0x83, 0xd8, 0x80, + 0x32, 0xa3, 0x7e, 0x40, 0x2d, 0x59, 0x11, 0xd9, 0x1b, 0xd6, 0x14, 0x48, 0xa5, 0xf9, 0x92, 0xca, + 0x7d, 0xa9, 0x92, 0x7a, 0x0e, 0x6b, 0xb1, 0x4b, 0x86, 0x47, 0xd8, 0x30, 0xaa, 0xcd, 0xbd, 0xb7, + 0x79, 0x52, 0xd7, 0x22, 0x3d, 0x9d, 0xab, 0xe9, 0x55, 0x3a, 0xb3, 0xc6, 0x2d, 0x00, 0x97, 0x51, + 0x77, 0x60, 0x58, 0xd4, 0x74, 0xd4, 0xe2, 0x92, 0x28, 0x75, 0x39, 0x65, 0x2e, 0x4a, 0xae, 0x44, + 0x4d, 0x07, 0x7f, 0x3c, 0x2d, 0xb5, 0x95, 0x25, 0x95, 0x72, 0x2a, 0x0f, 0x59, 0xba, 0xda, 0x6e, + 0x1f, 0x42, 0x75, 0xd6, 0x45, 0xbc, 0x09, 0x79, 0x3f, 0x20, 0x5e, 0x20, 0x2a, 0x21, 0xaf, 0xcb, + 0x05, 0x46, 0x90, 0xa5, 0xcc, 0x12, 0x9d, 0x26, 0xaf, 0xf3, 0x7f, 0x6b, 0xff, 0xca, 0xc3, 0xe6, + 0xa2, 0xf4, 0x2d, 0xac, 0xa4, 0x2d, 0x28, 0xb0, 0xc9, 0xe8, 0x92, 0x7a, 0x6a, 0x56, 0x58, 0x08, + 0x57, 0xb8, 0x01, 0x79, 0x87, 0x5c, 0x52, 0x47, 0xcd, 0x6d, 0x2b, 0xbb, 0xd5, 0xfd, 0x47, 0x37, + 0x2a, 0x90, 0x7a, 0x87, 0xab, 0xe8, 0x52, 0x13, 0x7f, 0x0a, 0xb9, 0xb0, 0x5b, 0x70, 0x0b, 0x0f, + 0x6f, 0x66, 0x81, 0xa7, 0x55, 0x17, 0x7a, 0xf8, 0x0e, 0x94, 0xf8, 0x5f, 0x43, 0xf8, 0x5c, 0x10, + 0x3e, 0x17, 0x39, 0x70, 0xc6, 0xfd, 0xbe, 0x0d, 0x45, 0x91, 0x31, 0x8b, 0x46, 0x5d, 0x36, 0x5e, + 0xe3, 0x0f, 0x60, 0xd5, 0xa2, 0x03, 0x32, 0x71, 0x02, 0xe3, 0x25, 0x71, 0x26, 0x54, 0xc4, 0xbe, + 0xa4, 0x57, 0x42, 0xf0, 0x47, 0x1c, 0xc3, 0xf7, 0xa0, 0x2c, 0x13, 0x6c, 0x33, 0x8b, 0xbe, 0x16, + 0x07, 0x39, 0xaf, 0xcb, 0x9c, 0xb7, 0x39, 0x82, 0xbf, 0x9b, 0x6e, 0x13, 0x77, 0x17, 0xef, 0x20, + 0x9d, 0xb9, 0xda, 0x1f, 0x33, 0x90, 0x13, 0xd5, 0xb9, 0x06, 0xe5, 0xfe, 0xe7, 0xe7, 0x9a, 0xd1, + 0xea, 0x5e, 0x1c, 0x77, 0x34, 0xa4, 0xe0, 0x2a, 0x80, 0x00, 0x9e, 0x75, 0xba, 0x8d, 0x3e, 0xca, + 0xc4, 0xeb, 0xf6, 0x59, 0xff, 0xe0, 0x09, 0xca, 0xc6, 0x0a, 0x17, 0x12, 0xc8, 0x25, 0x09, 0x8f, + 0xf7, 0x51, 0x1e, 0x23, 0xa8, 0x48, 0x03, 0xed, 0xe7, 0x5a, 0xeb, 0xe0, 0x09, 0x2a, 0xcc, 0x22, + 0x8f, 0xf7, 0xd1, 0x0a, 0x5e, 0x85, 0x92, 0x40, 0x8e, 0xbb, 0xdd, 0x0e, 0x2a, 0xc6, 0x36, 0x7b, + 0x7d, 0xbd, 0x7d, 0x76, 0x82, 0x4a, 0xb1, 0xcd, 0x13, 0xbd, 0x7b, 0x71, 0x8e, 0x20, 0xb6, 0x70, + 0xaa, 0xf5, 0x7a, 0x8d, 0x13, 0x0d, 0x95, 0x63, 0xc6, 0xf1, 0xe7, 0x7d, 0xad, 0x87, 0x2a, 0x33, + 0x6e, 0x3d, 0xde, 0x47, 0xab, 0xf1, 0x4f, 0x68, 0x67, 0x17, 0xa7, 0xa8, 0x8a, 0xd7, 0x61, 0x55, + 0xfe, 0x44, 0xe4, 0xc4, 0x5a, 0x0a, 0x3a, 0x78, 0x82, 0xd0, 0xd4, 0x11, 0x69, 0x65, 0x7d, 0x06, + 0x38, 0x78, 0x82, 0x70, 0xad, 0x09, 0x79, 0x51, 0x40, 0x18, 0x43, 0xb5, 0xd3, 0x38, 0xd6, 0x3a, + 0x46, 0xf7, 0xbc, 0xdf, 0xee, 0x9e, 0x35, 0x3a, 0x48, 0x99, 0x62, 0xba, 0xf6, 0xc3, 0x8b, 0xb6, + 0xae, 0xb5, 0x50, 0x26, 0x89, 0x9d, 0x6b, 0x8d, 0xbe, 0xd6, 0x42, 0xd9, 0xda, 0x43, 0xd8, 0x5c, + 0x74, 0x2a, 0x17, 0x15, 0x7f, 0xed, 0x77, 0x0a, 0x6c, 0x2c, 0x68, 0x30, 0x0b, 0x0f, 0xca, 0xf7, + 0x21, 0x2f, 0x8b, 0x49, 0xb6, 0xdc, 0x07, 0x0b, 0x3b, 0x95, 0x28, 0xad, 0xb9, 0xb6, 0x2b, 0xf4, + 0x92, 0xd7, 0x4e, 0x76, 0xc9, 0xb5, 0xc3, 0x4d, 0xcc, 0x95, 0xd3, 0xcf, 0x15, 0x50, 0x97, 0xd9, + 0x7e, 0xcb, 0x91, 0xce, 0xcc, 0x1c, 0xe9, 0x4f, 0xd2, 0x0e, 0xec, 0x2c, 0xdf, 0xc3, 0x9c, 0x17, + 0xbf, 0x57, 0x60, 0x6b, 0xf1, 0xed, 0xbc, 0xd0, 0x87, 0x4f, 0xa1, 0x30, 0xa2, 0xc1, 0x95, 0x1b, + 0xdd, 0x50, 0xdf, 0x5a, 0xd0, 0xf7, 0xb8, 0x38, 0x1d, 0xab, 0x50, 0x2b, 0xd9, 0x38, 0xb3, 0xcb, + 0xae, 0x58, 0xe9, 0xcd, 0x9c, 0xa7, 0xbf, 0xc8, 0xc0, 0x3b, 0x0b, 0x8d, 0x2f, 0x74, 0xf4, 0x2e, + 0x80, 0xcd, 0xc6, 0x93, 0x40, 0xde, 0x42, 0xb2, 0x93, 0x94, 0x04, 0x22, 0x8e, 0x30, 0xef, 0x12, + 0x93, 0x20, 0x96, 0x67, 0x85, 0x1c, 0x24, 0x24, 0x08, 0x87, 0x53, 0x47, 0x73, 0xc2, 0xd1, 0xf7, + 0x97, 0xec, 0x74, 0x6e, 0x9c, 0xf8, 0x08, 0x90, 0xe9, 0xd8, 0x94, 0x05, 0x86, 0x1f, 0x78, 0x94, + 0x8c, 0x6c, 0x36, 0x14, 0xad, 0xb2, 0x78, 0x94, 0x1f, 0x10, 0xc7, 0xa7, 0xfa, 0x9a, 0x14, 0xf7, + 0x22, 0x29, 0xd7, 0xe0, 0x83, 0x10, 0xf5, 0x12, 0x1a, 0x85, 0x19, 0x0d, 0x29, 0x8e, 0x35, 0x6a, + 0x7f, 0x28, 0x40, 0x39, 0x31, 0xcb, 0xe0, 0x1d, 0xa8, 0xfc, 0x94, 0xbc, 0x24, 0x46, 0x34, 0x9f, + 0xca, 0x48, 0x94, 0x39, 0x76, 0x1e, 0xce, 0xa8, 0x1f, 0xc1, 0xa6, 0xa0, 0xb8, 0x93, 0x80, 0x7a, + 0x86, 0xe9, 0x10, 0xdf, 0x17, 0x41, 0x2b, 0x0a, 0x2a, 0xe6, 0xb2, 0x2e, 0x17, 0x35, 0x23, 0x09, + 0x7e, 0x0a, 0x1b, 0x42, 0x63, 0x34, 0x71, 0x02, 0x7b, 0xec, 0x50, 0x83, 0x4f, 0xcc, 0xbe, 0x0a, + 0x49, 0xcf, 0xd6, 0x39, 0xe3, 0x34, 0x24, 0x70, 0x8f, 0x7c, 0x7c, 0x02, 0x77, 0x85, 0xda, 0x90, + 0x32, 0xea, 0x91, 0x80, 0x1a, 0xf4, 0x67, 0x13, 0xe2, 0xf8, 0x06, 0x61, 0x96, 0x71, 0x45, 0xfc, + 0x2b, 0x75, 0x33, 0x69, 0xe0, 0x16, 0xe7, 0x9e, 0x84, 0x54, 0x4d, 0x30, 0x1b, 0xcc, 0xfa, 0x8c, + 0xf8, 0x57, 0xf8, 0x08, 0xb6, 0x84, 0x21, 0x3f, 0xf0, 0x6c, 0x36, 0x34, 0xcc, 0x2b, 0x6a, 0xbe, + 0x30, 0x26, 0xc1, 0xe0, 0x50, 0xbd, 0x93, 0xb4, 0x20, 0x9c, 0xec, 0x09, 0x4e, 0x93, 0x53, 0x2e, + 0x82, 0xc1, 0x21, 0xee, 0x41, 0x85, 0xe7, 0x63, 0x64, 0x7f, 0x41, 0x8d, 0x81, 0xeb, 0x89, 0x6b, + 0xa0, 0xba, 0xe0, 0x70, 0x27, 0x82, 0x58, 0xef, 0x86, 0x0a, 0xa7, 0xae, 0x45, 0x8f, 0xf2, 0xbd, + 0x73, 0x4d, 0x6b, 0xe9, 0xe5, 0xc8, 0xca, 0x33, 0xd7, 0xe3, 0x35, 0x35, 0x74, 0xe3, 0x18, 0x97, + 0x65, 0x4d, 0x0d, 0xdd, 0x28, 0xc2, 0x4f, 0x61, 0xc3, 0x34, 0xe5, 0xb6, 0x6d, 0xd3, 0x08, 0x47, + 0x5b, 0x5f, 0x45, 0x33, 0xf1, 0x32, 0xcd, 0x13, 0x49, 0x08, 0xcb, 0xdc, 0xc7, 0x1f, 0xc3, 0x3b, + 0xd3, 0x78, 0x25, 0x15, 0xd7, 0xe7, 0x76, 0x99, 0x56, 0x7d, 0x0a, 0x1b, 0xe3, 0xeb, 0x79, 0x45, + 0x3c, 0xf3, 0x8b, 0xe3, 0xeb, 0xb4, 0xda, 0x87, 0xe2, 0xb9, 0xe2, 0x51, 0x93, 0x04, 0xd4, 0x52, + 0xdf, 0x4d, 0xb2, 0x13, 0x02, 0xbc, 0x07, 0xc8, 0x34, 0x0d, 0xca, 0xc8, 0xa5, 0x43, 0x0d, 0xe2, + 0x51, 0x46, 0x7c, 0xf5, 0x5e, 0x92, 0x5c, 0x35, 0x4d, 0x4d, 0x48, 0x1b, 0x42, 0x88, 0x9f, 0xc3, + 0xe6, 0x84, 0xd9, 0x2c, 0xa0, 0xde, 0xd8, 0xa3, 0x7c, 0x84, 0x94, 0x47, 0x42, 0xfd, 0xfb, 0xca, + 0x92, 0x21, 0xf0, 0x22, 0xc9, 0x96, 0x69, 0xd0, 0x37, 0x26, 0xf3, 0x60, 0xed, 0x08, 0x2a, 0xc9, + 0xec, 0xe0, 0x12, 0xc8, 0xfc, 0x20, 0x85, 0xdf, 0x59, 0xcd, 0x6e, 0x8b, 0xdf, 0x36, 0x3f, 0xd1, + 0x50, 0x86, 0xdf, 0x7a, 0x9d, 0x76, 0x5f, 0x33, 0xf4, 0x8b, 0xb3, 0x7e, 0xfb, 0x54, 0x43, 0xd9, + 0x87, 0xa5, 0xe2, 0x3f, 0x56, 0xd0, 0x9b, 0x37, 0x6f, 0xde, 0x64, 0x6a, 0x7f, 0xc9, 0x40, 0x75, + 0x76, 0x2e, 0xc3, 0xdf, 0x83, 0x77, 0xa3, 0x47, 0x94, 0x4f, 0x03, 0xe3, 0x95, 0xed, 0x89, 0x82, + 0x19, 0x11, 0x39, 0x8e, 0xc5, 0x7b, 0xdd, 0x0c, 0x59, 0x3d, 0x1a, 0xfc, 0xd8, 0xf6, 0x78, 0x39, + 0x8c, 0x48, 0x80, 0x3b, 0x70, 0x8f, 0xb9, 0x86, 0x1f, 0x10, 0x66, 0x11, 0xcf, 0x32, 0xa6, 0xcf, + 0x57, 0x83, 0x98, 0x26, 0xf5, 0x7d, 0x57, 0xf6, 0xea, 0xd8, 0xca, 0x7b, 0xcc, 0xed, 0x85, 0xe4, + 0x69, 0x13, 0x6b, 0x84, 0xd4, 0x54, 0x5e, 0xb2, 0xcb, 0xf2, 0x72, 0x07, 0x4a, 0x23, 0x32, 0x36, + 0x28, 0x0b, 0xbc, 0x6b, 0x31, 0x02, 0x15, 0xf5, 0xe2, 0x88, 0x8c, 0x35, 0xbe, 0xfe, 0xea, 0x72, + 0x90, 0x8c, 0xe3, 0x5f, 0x33, 0x50, 0x49, 0xce, 0x48, 0x7c, 0xaa, 0x34, 0x45, 0x23, 0x55, 0xc4, + 0x39, 0xfb, 0xe0, 0x3f, 0x4e, 0x54, 0xf5, 0x26, 0xef, 0xb0, 0x47, 0x05, 0x39, 0xb9, 0xe8, 0x52, + 0x93, 0xdf, 0x6e, 0xfc, 0x64, 0x51, 0x39, 0xf2, 0x16, 0xf5, 0x70, 0x85, 0x6f, 0x41, 0xce, 0x21, + 0x5f, 0x5c, 0xcf, 0xb6, 0x50, 0x01, 0xdd, 0x34, 0x5e, 0xb7, 0x20, 0xc7, 0x5f, 0xce, 0xb3, 0x8d, + 0x4b, 0x40, 0x5f, 0x61, 0xc5, 0xee, 0x41, 0x5e, 0x6c, 0x13, 0x03, 0x84, 0x1b, 0x45, 0xdf, 0xc0, + 0x45, 0xc8, 0x35, 0xbb, 0x3a, 0xaf, 0x5a, 0x04, 0x15, 0x89, 0x1a, 0xe7, 0x6d, 0xad, 0xa9, 0xa1, + 0x4c, 0x32, 0xbc, 0x7f, 0x52, 0xa0, 0x9c, 0x18, 0x19, 0xf8, 0x65, 0x45, 0x1c, 0xc7, 0x7d, 0x65, + 0x10, 0xc7, 0x26, 0x7e, 0x18, 0x1f, 0x10, 0x50, 0x83, 0x23, 0x37, 0x0d, 0xc4, 0xff, 0xa4, 0x36, + 0x7e, 0xab, 0x00, 0x4a, 0x8f, 0x1b, 0x29, 0x07, 0x95, 0xaf, 0xd5, 0xc1, 0xdf, 0x28, 0x50, 0x9d, + 0x9d, 0x31, 0x52, 0xee, 0xed, 0x7c, 0xad, 0xee, 0xfd, 0x5a, 0x81, 0xd5, 0x99, 0xc9, 0xe2, 0xff, + 0xca, 0xbb, 0x5f, 0x65, 0x61, 0x63, 0x81, 0x1e, 0x6e, 0x84, 0x23, 0x98, 0x9c, 0x0a, 0xbf, 0x73, + 0x93, 0xdf, 0xaa, 0xf3, 0xf7, 0xde, 0x39, 0xf1, 0x82, 0x70, 0x62, 0x7b, 0x00, 0xc8, 0xb6, 0x28, + 0x0b, 0xec, 0x81, 0x4d, 0xbd, 0xf0, 0x81, 0x27, 0xe7, 0xb2, 0xb5, 0x29, 0x2e, 0xdf, 0x78, 0xdf, + 0x06, 0x3c, 0x76, 0x7d, 0x3b, 0xb0, 0x5f, 0x52, 0xc3, 0x66, 0xd1, 0x6b, 0x90, 0xcf, 0x69, 0x39, + 0x1d, 0x45, 0x92, 0x36, 0x0b, 0x62, 0x36, 0xa3, 0x43, 0x92, 0x62, 0xf3, 0x7e, 0x92, 0xd5, 0x51, + 0x24, 0x89, 0xd9, 0x3b, 0x50, 0xb1, 0xdc, 0x09, 0xbf, 0xf2, 0x24, 0x8f, 0x0f, 0x62, 0x8a, 0x5e, + 0x96, 0x58, 0x4c, 0x09, 0x67, 0x92, 0xe9, 0x33, 0xb4, 0xa2, 0x97, 0x25, 0x26, 0x29, 0xf7, 0x61, + 0x8d, 0x0c, 0x87, 0x1e, 0x37, 0x1e, 0x19, 0x92, 0x83, 0x56, 0x35, 0x86, 0x05, 0xf1, 0xf6, 0x0f, + 0xa0, 0x18, 0xc5, 0x81, 0x37, 0x76, 0x1e, 0x09, 0x63, 0x2c, 0x3f, 0x06, 0x64, 0xf8, 0xe3, 0x97, + 0x45, 0xc2, 0x1d, 0xa8, 0xd8, 0xbe, 0x31, 0xfd, 0xc0, 0x93, 0xd9, 0xce, 0xec, 0x16, 0xf5, 0xb2, + 0xed, 0xc7, 0x5f, 0x13, 0x6a, 0xff, 0xe4, 0x95, 0x3d, 0xfb, 0x41, 0xaa, 0x05, 0x45, 0xc7, 0x35, + 0x89, 0x28, 0x04, 0xf9, 0x75, 0x74, 0xf7, 0x2d, 0xdf, 0xb4, 0xea, 0x9d, 0x90, 0xaf, 0xc7, 0x9a, + 0xb7, 0x7f, 0xa9, 0x40, 0x31, 0x82, 0xf1, 0x16, 0xe4, 0xc6, 0x24, 0xb8, 0x12, 0xe6, 0xf2, 0xc7, + 0x19, 0xa4, 0xe8, 0x62, 0xcd, 0x71, 0x7f, 0x4c, 0x98, 0x28, 0x81, 0x10, 0xe7, 0x6b, 0x9e, 0x57, + 0x87, 0x12, 0x4b, 0x8c, 0x70, 0xee, 0x68, 0x44, 0x59, 0xe0, 0x47, 0x79, 0x0d, 0xf1, 0x66, 0x08, + 0xe3, 0x47, 0xb0, 0x1e, 0x78, 0xc4, 0x76, 0x66, 0xb8, 0x39, 0xc1, 0x45, 0x91, 0x20, 0x22, 0x1f, + 0x3f, 0x80, 0x0d, 0xd3, 0x1d, 0xa5, 0x77, 0x73, 0x8c, 0x52, 0xaf, 0x03, 0xff, 0x33, 0xe5, 0xdf, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x5b, 0x6c, 0x19, 0xda, 0x68, 0x16, 0x00, 0x00, +} diff --git a/vendor/github.com/fibercrypto/skywallet-protob/go/messages.pb.go b/vendor/github.com/fibercrypto/skywallet-protob/go/messages.pb.go new file mode 100644 index 00000000..e16ddb85 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-protob/go/messages.pb.go @@ -0,0 +1,12650 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: messages.proto + +package messages + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +// * +// Mapping between Skywallet wire identifier (uint) and a protobuf message +type MessageType int32 + +const ( + MessageType_MessageType_Initialize MessageType = 0 + MessageType_MessageType_Ping MessageType = 1 + MessageType_MessageType_Success MessageType = 2 + MessageType_MessageType_Failure MessageType = 3 + MessageType_MessageType_ChangePin MessageType = 4 + MessageType_MessageType_WipeDevice MessageType = 5 + // Bootloader + MessageType_MessageType_FirmwareErase MessageType = 6 + MessageType_MessageType_FirmwareUpload MessageType = 7 + MessageType_MessageType_GetRawEntropy MessageType = 9 + MessageType_MessageType_Entropy MessageType = 10 + MessageType_MessageType_LoadDevice MessageType = 13 + MessageType_MessageType_ResetDevice MessageType = 14 + MessageType_MessageType_Features MessageType = 17 + MessageType_MessageType_PinMatrixRequest MessageType = 18 + MessageType_MessageType_PinMatrixAck MessageType = 19 + MessageType_MessageType_Cancel MessageType = 20 + MessageType_MessageType_ApplySettings MessageType = 25 + MessageType_MessageType_ButtonRequest MessageType = 26 + MessageType_MessageType_ButtonAck MessageType = 27 + MessageType_MessageType_BackupDevice MessageType = 34 + MessageType_MessageType_EntropyRequest MessageType = 35 + MessageType_MessageType_EntropyAck MessageType = 36 + MessageType_MessageType_PassphraseRequest MessageType = 41 + MessageType_MessageType_PassphraseAck MessageType = 42 + MessageType_MessageType_RecoveryDevice MessageType = 45 + MessageType_MessageType_WordRequest MessageType = 46 + MessageType_MessageType_WordAck MessageType = 47 + MessageType_MessageType_GetFeatures MessageType = 55 + MessageType_MessageType_PassphraseStateRequest MessageType = 77 + MessageType_MessageType_PassphraseStateAck MessageType = 78 + MessageType_MessageType_SetMnemonic MessageType = 113 + MessageType_MessageType_SkycoinAddress MessageType = 114 + MessageType_MessageType_SkycoinCheckMessageSignature MessageType = 115 + MessageType_MessageType_SkycoinSignMessage MessageType = 116 + MessageType_MessageType_ResponseSkycoinAddress MessageType = 117 + MessageType_MessageType_ResponseSkycoinSignMessage MessageType = 118 + MessageType_MessageType_GenerateMnemonic MessageType = 119 + MessageType_MessageType_TransactionSign MessageType = 122 + MessageType_MessageType_ResponseTransactionSign MessageType = 123 + MessageType_MessageType_GetMixedEntropy MessageType = 124 + MessageType_MessageType_SignTx MessageType = 125 + MessageType_MessageType_TxRequest MessageType = 126 + MessageType_MessageType_TxAck MessageType = 127 +) + +var MessageType_name = map[int32]string{ + 0: "MessageType_Initialize", + 1: "MessageType_Ping", + 2: "MessageType_Success", + 3: "MessageType_Failure", + 4: "MessageType_ChangePin", + 5: "MessageType_WipeDevice", + 6: "MessageType_FirmwareErase", + 7: "MessageType_FirmwareUpload", + 9: "MessageType_GetRawEntropy", + 10: "MessageType_Entropy", + 13: "MessageType_LoadDevice", + 14: "MessageType_ResetDevice", + 17: "MessageType_Features", + 18: "MessageType_PinMatrixRequest", + 19: "MessageType_PinMatrixAck", + 20: "MessageType_Cancel", + 25: "MessageType_ApplySettings", + 26: "MessageType_ButtonRequest", + 27: "MessageType_ButtonAck", + 34: "MessageType_BackupDevice", + 35: "MessageType_EntropyRequest", + 36: "MessageType_EntropyAck", + 41: "MessageType_PassphraseRequest", + 42: "MessageType_PassphraseAck", + 45: "MessageType_RecoveryDevice", + 46: "MessageType_WordRequest", + 47: "MessageType_WordAck", + 55: "MessageType_GetFeatures", + 77: "MessageType_PassphraseStateRequest", + 78: "MessageType_PassphraseStateAck", + 113: "MessageType_SetMnemonic", + 114: "MessageType_SkycoinAddress", + 115: "MessageType_SkycoinCheckMessageSignature", + 116: "MessageType_SkycoinSignMessage", + 117: "MessageType_ResponseSkycoinAddress", + 118: "MessageType_ResponseSkycoinSignMessage", + 119: "MessageType_GenerateMnemonic", + 122: "MessageType_TransactionSign", + 123: "MessageType_ResponseTransactionSign", + 124: "MessageType_GetMixedEntropy", + 125: "MessageType_SignTx", + 126: "MessageType_TxRequest", + 127: "MessageType_TxAck", +} +var MessageType_value = map[string]int32{ + "MessageType_Initialize": 0, + "MessageType_Ping": 1, + "MessageType_Success": 2, + "MessageType_Failure": 3, + "MessageType_ChangePin": 4, + "MessageType_WipeDevice": 5, + "MessageType_FirmwareErase": 6, + "MessageType_FirmwareUpload": 7, + "MessageType_GetRawEntropy": 9, + "MessageType_Entropy": 10, + "MessageType_LoadDevice": 13, + "MessageType_ResetDevice": 14, + "MessageType_Features": 17, + "MessageType_PinMatrixRequest": 18, + "MessageType_PinMatrixAck": 19, + "MessageType_Cancel": 20, + "MessageType_ApplySettings": 25, + "MessageType_ButtonRequest": 26, + "MessageType_ButtonAck": 27, + "MessageType_BackupDevice": 34, + "MessageType_EntropyRequest": 35, + "MessageType_EntropyAck": 36, + "MessageType_PassphraseRequest": 41, + "MessageType_PassphraseAck": 42, + "MessageType_RecoveryDevice": 45, + "MessageType_WordRequest": 46, + "MessageType_WordAck": 47, + "MessageType_GetFeatures": 55, + "MessageType_PassphraseStateRequest": 77, + "MessageType_PassphraseStateAck": 78, + "MessageType_SetMnemonic": 113, + "MessageType_SkycoinAddress": 114, + "MessageType_SkycoinCheckMessageSignature": 115, + "MessageType_SkycoinSignMessage": 116, + "MessageType_ResponseSkycoinAddress": 117, + "MessageType_ResponseSkycoinSignMessage": 118, + "MessageType_GenerateMnemonic": 119, + "MessageType_TransactionSign": 122, + "MessageType_ResponseTransactionSign": 123, + "MessageType_GetMixedEntropy": 124, + "MessageType_SignTx": 125, + "MessageType_TxRequest": 126, + "MessageType_TxAck": 127, +} + +func (x MessageType) Enum() *MessageType { + p := new(MessageType) + *p = x + return p +} +func (x MessageType) String() string { + return proto.EnumName(MessageType_name, int32(x)) +} +func (x *MessageType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MessageType_value, data, "MessageType") + if err != nil { + return err + } + *x = MessageType(value) + return nil +} +func (MessageType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{0} +} + +// * +// Type of information required by transaction signing process +type TxRequest_RequestType int32 + +const ( + TxRequest_TXINPUT TxRequest_RequestType = 0 + TxRequest_TXOUTPUT TxRequest_RequestType = 1 + TxRequest_TXMETA TxRequest_RequestType = 2 + TxRequest_TXFINISHED TxRequest_RequestType = 3 + TxRequest_TXEXTRADATA TxRequest_RequestType = 4 +) + +var TxRequest_RequestType_name = map[int32]string{ + 0: "TXINPUT", + 1: "TXOUTPUT", + 2: "TXMETA", + 3: "TXFINISHED", + 4: "TXEXTRADATA", +} +var TxRequest_RequestType_value = map[string]int32{ + "TXINPUT": 0, + "TXOUTPUT": 1, + "TXMETA": 2, + "TXFINISHED": 3, + "TXEXTRADATA": 4, +} + +func (x TxRequest_RequestType) Enum() *TxRequest_RequestType { + p := new(TxRequest_RequestType) + *p = x + return p +} +func (x TxRequest_RequestType) String() string { + return proto.EnumName(TxRequest_RequestType_name, int32(x)) +} +func (x *TxRequest_RequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(TxRequest_RequestType_value, data, "TxRequest_RequestType") + if err != nil { + return err + } + *x = TxRequest_RequestType(value) + return nil +} +func (TxRequest_RequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{42, 0} +} + +// * +// Request: Reset device to default state and ask for device details +// @next Features +type Initialize struct { + State []byte `protobuf:"bytes,1,opt,name=state" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Initialize) Reset() { *m = Initialize{} } +func (m *Initialize) String() string { return proto.CompactTextString(m) } +func (*Initialize) ProtoMessage() {} +func (*Initialize) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{0} +} +func (m *Initialize) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Initialize) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Initialize.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Initialize) XXX_Merge(src proto.Message) { + xxx_messageInfo_Initialize.Merge(dst, src) +} +func (m *Initialize) XXX_Size() int { + return m.Size() +} +func (m *Initialize) XXX_DiscardUnknown() { + xxx_messageInfo_Initialize.DiscardUnknown(m) +} + +var xxx_messageInfo_Initialize proto.InternalMessageInfo + +func (m *Initialize) GetState() []byte { + if m != nil { + return m.State + } + return nil +} + +// * +// Request: Ask for device details (no device reset) +// @next Features +type GetFeatures struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetFeatures) Reset() { *m = GetFeatures{} } +func (m *GetFeatures) String() string { return proto.CompactTextString(m) } +func (*GetFeatures) ProtoMessage() {} +func (*GetFeatures) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{1} +} +func (m *GetFeatures) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetFeatures.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *GetFeatures) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetFeatures.Merge(dst, src) +} +func (m *GetFeatures) XXX_Size() int { + return m.Size() +} +func (m *GetFeatures) XXX_DiscardUnknown() { + xxx_messageInfo_GetFeatures.DiscardUnknown(m) +} + +var xxx_messageInfo_GetFeatures proto.InternalMessageInfo + +// * +// Response: Reports various information about the device +// @prev Initialize +// @prev GetFeatures +type Features struct { + Vendor *string `protobuf:"bytes,1,opt,name=vendor" json:"vendor,omitempty"` + MajorVersion *uint32 `protobuf:"varint,2,opt,name=major_version,json=majorVersion" json:"major_version,omitempty"` + MinorVersion *uint32 `protobuf:"varint,3,opt,name=minor_version,json=minorVersion" json:"minor_version,omitempty"` + PatchVersion *uint32 `protobuf:"varint,4,opt,name=patch_version,json=patchVersion" json:"patch_version,omitempty"` + BootloaderMode *bool `protobuf:"varint,5,opt,name=bootloader_mode,json=bootloaderMode" json:"bootloader_mode,omitempty"` + DeviceId *string `protobuf:"bytes,6,opt,name=device_id,json=deviceId" json:"device_id,omitempty"` + PinProtection *bool `protobuf:"varint,7,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + PassphraseProtection *bool `protobuf:"varint,8,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + Language *string `protobuf:"bytes,9,opt,name=language" json:"language,omitempty"` + Label *string `protobuf:"bytes,10,opt,name=label" json:"label,omitempty"` + Initialized *bool `protobuf:"varint,12,opt,name=initialized" json:"initialized,omitempty"` + BootloaderHash []byte `protobuf:"bytes,14,opt,name=bootloader_hash,json=bootloaderHash" json:"bootloader_hash,omitempty"` + PinCached *bool `protobuf:"varint,16,opt,name=pin_cached,json=pinCached" json:"pin_cached,omitempty"` + PassphraseCached *bool `protobuf:"varint,17,opt,name=passphrase_cached,json=passphraseCached" json:"passphrase_cached,omitempty"` + FirmwarePresent *bool `protobuf:"varint,18,opt,name=firmware_present,json=firmwarePresent" json:"firmware_present,omitempty"` + NeedsBackup *bool `protobuf:"varint,19,opt,name=needs_backup,json=needsBackup" json:"needs_backup,omitempty"` + Model *string `protobuf:"bytes,21,opt,name=model" json:"model,omitempty"` + FwMajor *uint32 `protobuf:"varint,22,opt,name=fw_major,json=fwMajor" json:"fw_major,omitempty"` + FwMinor *uint32 `protobuf:"varint,23,opt,name=fw_minor,json=fwMinor" json:"fw_minor,omitempty"` + FwPatch *uint32 `protobuf:"varint,24,opt,name=fw_patch,json=fwPatch" json:"fw_patch,omitempty"` + FwVersionHead *string `protobuf:"bytes,25,opt,name=fw_version_head,json=fwVersionHead" json:"fw_version_head,omitempty"` + FwVendor *string `protobuf:"bytes,26,opt,name=fw_vendor,json=fwVendor" json:"fw_vendor,omitempty"` + FwVendorKeys []byte `protobuf:"bytes,27,opt,name=fw_vendor_keys,json=fwVendorKeys" json:"fw_vendor_keys,omitempty"` + UnfinishedBackup *bool `protobuf:"varint,28,opt,name=unfinished_backup,json=unfinishedBackup" json:"unfinished_backup,omitempty"` + FirmwareFeatures *uint32 `protobuf:"varint,29,opt,name=firmware_features,json=firmwareFeatures" json:"firmware_features,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Features) Reset() { *m = Features{} } +func (m *Features) String() string { return proto.CompactTextString(m) } +func (*Features) ProtoMessage() {} +func (*Features) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{2} +} +func (m *Features) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Features) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Features.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Features) XXX_Merge(src proto.Message) { + xxx_messageInfo_Features.Merge(dst, src) +} +func (m *Features) XXX_Size() int { + return m.Size() +} +func (m *Features) XXX_DiscardUnknown() { + xxx_messageInfo_Features.DiscardUnknown(m) +} + +var xxx_messageInfo_Features proto.InternalMessageInfo + +func (m *Features) GetVendor() string { + if m != nil && m.Vendor != nil { + return *m.Vendor + } + return "" +} + +func (m *Features) GetMajorVersion() uint32 { + if m != nil && m.MajorVersion != nil { + return *m.MajorVersion + } + return 0 +} + +func (m *Features) GetMinorVersion() uint32 { + if m != nil && m.MinorVersion != nil { + return *m.MinorVersion + } + return 0 +} + +func (m *Features) GetPatchVersion() uint32 { + if m != nil && m.PatchVersion != nil { + return *m.PatchVersion + } + return 0 +} + +func (m *Features) GetBootloaderMode() bool { + if m != nil && m.BootloaderMode != nil { + return *m.BootloaderMode + } + return false +} + +func (m *Features) GetDeviceId() string { + if m != nil && m.DeviceId != nil { + return *m.DeviceId + } + return "" +} + +func (m *Features) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *Features) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *Features) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return "" +} + +func (m *Features) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *Features) GetInitialized() bool { + if m != nil && m.Initialized != nil { + return *m.Initialized + } + return false +} + +func (m *Features) GetBootloaderHash() []byte { + if m != nil { + return m.BootloaderHash + } + return nil +} + +func (m *Features) GetPinCached() bool { + if m != nil && m.PinCached != nil { + return *m.PinCached + } + return false +} + +func (m *Features) GetPassphraseCached() bool { + if m != nil && m.PassphraseCached != nil { + return *m.PassphraseCached + } + return false +} + +func (m *Features) GetFirmwarePresent() bool { + if m != nil && m.FirmwarePresent != nil { + return *m.FirmwarePresent + } + return false +} + +func (m *Features) GetNeedsBackup() bool { + if m != nil && m.NeedsBackup != nil { + return *m.NeedsBackup + } + return false +} + +func (m *Features) GetModel() string { + if m != nil && m.Model != nil { + return *m.Model + } + return "" +} + +func (m *Features) GetFwMajor() uint32 { + if m != nil && m.FwMajor != nil { + return *m.FwMajor + } + return 0 +} + +func (m *Features) GetFwMinor() uint32 { + if m != nil && m.FwMinor != nil { + return *m.FwMinor + } + return 0 +} + +func (m *Features) GetFwPatch() uint32 { + if m != nil && m.FwPatch != nil { + return *m.FwPatch + } + return 0 +} + +func (m *Features) GetFwVersionHead() string { + if m != nil && m.FwVersionHead != nil { + return *m.FwVersionHead + } + return "" +} + +func (m *Features) GetFwVendor() string { + if m != nil && m.FwVendor != nil { + return *m.FwVendor + } + return "" +} + +func (m *Features) GetFwVendorKeys() []byte { + if m != nil { + return m.FwVendorKeys + } + return nil +} + +func (m *Features) GetUnfinishedBackup() bool { + if m != nil && m.UnfinishedBackup != nil { + return *m.UnfinishedBackup + } + return false +} + +func (m *Features) GetFirmwareFeatures() uint32 { + if m != nil && m.FirmwareFeatures != nil { + return *m.FirmwareFeatures + } + return 0 +} + +// * +// Request: change language and/or label of the device +// @start +// @next Success +// @next Failure +type ApplySettings struct { + Language *string `protobuf:"bytes,1,opt,name=language" json:"language,omitempty"` + Label *string `protobuf:"bytes,2,opt,name=label" json:"label,omitempty"` + UsePassphrase *bool `protobuf:"varint,3,opt,name=use_passphrase,json=usePassphrase" json:"use_passphrase,omitempty"` + Homescreen []byte `protobuf:"bytes,4,opt,name=homescreen" json:"homescreen,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplySettings) Reset() { *m = ApplySettings{} } +func (m *ApplySettings) String() string { return proto.CompactTextString(m) } +func (*ApplySettings) ProtoMessage() {} +func (*ApplySettings) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{3} +} +func (m *ApplySettings) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplySettings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplySettings.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *ApplySettings) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplySettings.Merge(dst, src) +} +func (m *ApplySettings) XXX_Size() int { + return m.Size() +} +func (m *ApplySettings) XXX_DiscardUnknown() { + xxx_messageInfo_ApplySettings.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplySettings proto.InternalMessageInfo + +func (m *ApplySettings) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return "" +} + +func (m *ApplySettings) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *ApplySettings) GetUsePassphrase() bool { + if m != nil && m.UsePassphrase != nil { + return *m.UsePassphrase + } + return false +} + +func (m *ApplySettings) GetHomescreen() []byte { + if m != nil { + return m.Homescreen + } + return nil +} + +// * +// Request: Ask the device to generate a mnemonic and configure itself with it +// @next Success +type GenerateMnemonic struct { + PassphraseProtection *bool `protobuf:"varint,1,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + WordCount *uint32 `protobuf:"varint,2,opt,name=word_count,json=wordCount" json:"word_count,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GenerateMnemonic) Reset() { *m = GenerateMnemonic{} } +func (m *GenerateMnemonic) String() string { return proto.CompactTextString(m) } +func (*GenerateMnemonic) ProtoMessage() {} +func (*GenerateMnemonic) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{4} +} +func (m *GenerateMnemonic) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenerateMnemonic) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenerateMnemonic.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *GenerateMnemonic) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenerateMnemonic.Merge(dst, src) +} +func (m *GenerateMnemonic) XXX_Size() int { + return m.Size() +} +func (m *GenerateMnemonic) XXX_DiscardUnknown() { + xxx_messageInfo_GenerateMnemonic.DiscardUnknown(m) +} + +var xxx_messageInfo_GenerateMnemonic proto.InternalMessageInfo + +func (m *GenerateMnemonic) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *GenerateMnemonic) GetWordCount() uint32 { + if m != nil && m.WordCount != nil { + return *m.WordCount + } + return 0 +} + +// * +// Request: Send a mnemonic to the device +// @next Success +type SetMnemonic struct { + Mnemonic *string `protobuf:"bytes,1,req,name=mnemonic" json:"mnemonic,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetMnemonic) Reset() { *m = SetMnemonic{} } +func (m *SetMnemonic) String() string { return proto.CompactTextString(m) } +func (*SetMnemonic) ProtoMessage() {} +func (*SetMnemonic) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{5} +} +func (m *SetMnemonic) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetMnemonic) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetMnemonic.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *SetMnemonic) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetMnemonic.Merge(dst, src) +} +func (m *SetMnemonic) XXX_Size() int { + return m.Size() +} +func (m *SetMnemonic) XXX_DiscardUnknown() { + xxx_messageInfo_SetMnemonic.DiscardUnknown(m) +} + +var xxx_messageInfo_SetMnemonic proto.InternalMessageInfo + +func (m *SetMnemonic) GetMnemonic() string { + if m != nil && m.Mnemonic != nil { + return *m.Mnemonic + } + return "" +} + +// * +// Request: Starts workflow for setting/changing/removing the PIN +// @next ButtonRequest +// @next PinMatrixRequest +type ChangePin struct { + Remove *bool `protobuf:"varint,1,opt,name=remove" json:"remove,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangePin) Reset() { *m = ChangePin{} } +func (m *ChangePin) String() string { return proto.CompactTextString(m) } +func (*ChangePin) ProtoMessage() {} +func (*ChangePin) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{6} +} +func (m *ChangePin) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChangePin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChangePin.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *ChangePin) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangePin.Merge(dst, src) +} +func (m *ChangePin) XXX_Size() int { + return m.Size() +} +func (m *ChangePin) XXX_DiscardUnknown() { + xxx_messageInfo_ChangePin.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangePin proto.InternalMessageInfo + +func (m *ChangePin) GetRemove() bool { + if m != nil && m.Remove != nil { + return *m.Remove + } + return false +} + +// * +// Request: Generate a Skycoin or a Bitcoin address from a seed, device sends back the address in a Success message +// @next Failure +// @next ResponseSkycoinAddress +type SkycoinAddress struct { + AddressN *uint32 `protobuf:"varint,1,req,name=address_n,json=addressN" json:"address_n,omitempty"` + StartIndex *uint32 `protobuf:"varint,2,opt,name=start_index,json=startIndex" json:"start_index,omitempty"` + ConfirmAddress *bool `protobuf:"varint,3,opt,name=confirm_address,json=confirmAddress" json:"confirm_address,omitempty"` + Bip44Addr *Bip44AddrIndex `protobuf:"bytes,4,opt,name=bip44_addr,json=bip44Addr" json:"bip44_addr,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SkycoinAddress) Reset() { *m = SkycoinAddress{} } +func (m *SkycoinAddress) String() string { return proto.CompactTextString(m) } +func (*SkycoinAddress) ProtoMessage() {} +func (*SkycoinAddress) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{7} +} +func (m *SkycoinAddress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SkycoinAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SkycoinAddress.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *SkycoinAddress) XXX_Merge(src proto.Message) { + xxx_messageInfo_SkycoinAddress.Merge(dst, src) +} +func (m *SkycoinAddress) XXX_Size() int { + return m.Size() +} +func (m *SkycoinAddress) XXX_DiscardUnknown() { + xxx_messageInfo_SkycoinAddress.DiscardUnknown(m) +} + +var xxx_messageInfo_SkycoinAddress proto.InternalMessageInfo + +func (m *SkycoinAddress) GetAddressN() uint32 { + if m != nil && m.AddressN != nil { + return *m.AddressN + } + return 0 +} + +func (m *SkycoinAddress) GetStartIndex() uint32 { + if m != nil && m.StartIndex != nil { + return *m.StartIndex + } + return 0 +} + +func (m *SkycoinAddress) GetConfirmAddress() bool { + if m != nil && m.ConfirmAddress != nil { + return *m.ConfirmAddress + } + return false +} + +func (m *SkycoinAddress) GetBip44Addr() *Bip44AddrIndex { + if m != nil { + return m.Bip44Addr + } + return nil +} + +// * +// Response: Return the generated skycoin address +// @prev SkycoinAddress +type ResponseSkycoinAddress struct { + Addresses []string `protobuf:"bytes,1,rep,name=addresses" json:"addresses,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResponseSkycoinAddress) Reset() { *m = ResponseSkycoinAddress{} } +func (m *ResponseSkycoinAddress) String() string { return proto.CompactTextString(m) } +func (*ResponseSkycoinAddress) ProtoMessage() {} +func (*ResponseSkycoinAddress) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{8} +} +func (m *ResponseSkycoinAddress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseSkycoinAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseSkycoinAddress.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *ResponseSkycoinAddress) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseSkycoinAddress.Merge(dst, src) +} +func (m *ResponseSkycoinAddress) XXX_Size() int { + return m.Size() +} +func (m *ResponseSkycoinAddress) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseSkycoinAddress.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseSkycoinAddress proto.InternalMessageInfo + +func (m *ResponseSkycoinAddress) GetAddresses() []string { + if m != nil { + return m.Addresses + } + return nil +} + +// * +// Response: Return the signatures necessary for the transaction +// @prev TransactionSign +type ResponseTransactionSign struct { + Signatures []string `protobuf:"bytes,1,rep,name=signatures" json:"signatures,omitempty"` + Padding *bool `protobuf:"varint,2,req,name=padding" json:"padding,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResponseTransactionSign) Reset() { *m = ResponseTransactionSign{} } +func (m *ResponseTransactionSign) String() string { return proto.CompactTextString(m) } +func (*ResponseTransactionSign) ProtoMessage() {} +func (*ResponseTransactionSign) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{9} +} +func (m *ResponseTransactionSign) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseTransactionSign) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseTransactionSign.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *ResponseTransactionSign) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseTransactionSign.Merge(dst, src) +} +func (m *ResponseTransactionSign) XXX_Size() int { + return m.Size() +} +func (m *ResponseTransactionSign) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseTransactionSign.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseTransactionSign proto.InternalMessageInfo + +func (m *ResponseTransactionSign) GetSignatures() []string { + if m != nil { + return m.Signatures + } + return nil +} + +func (m *ResponseTransactionSign) GetPadding() bool { + if m != nil && m.Padding != nil { + return *m.Padding + } + return false +} + +// * +// Request: Check a message signature matches the given address. +// @next Success +type SkycoinCheckMessageSignature struct { + Address *string `protobuf:"bytes,1,req,name=address" json:"address,omitempty"` + Message *string `protobuf:"bytes,2,req,name=message" json:"message,omitempty"` + Signature *string `protobuf:"bytes,3,req,name=signature" json:"signature,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SkycoinCheckMessageSignature) Reset() { *m = SkycoinCheckMessageSignature{} } +func (m *SkycoinCheckMessageSignature) String() string { return proto.CompactTextString(m) } +func (*SkycoinCheckMessageSignature) ProtoMessage() {} +func (*SkycoinCheckMessageSignature) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{10} +} +func (m *SkycoinCheckMessageSignature) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SkycoinCheckMessageSignature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SkycoinCheckMessageSignature.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *SkycoinCheckMessageSignature) XXX_Merge(src proto.Message) { + xxx_messageInfo_SkycoinCheckMessageSignature.Merge(dst, src) +} +func (m *SkycoinCheckMessageSignature) XXX_Size() int { + return m.Size() +} +func (m *SkycoinCheckMessageSignature) XXX_DiscardUnknown() { + xxx_messageInfo_SkycoinCheckMessageSignature.DiscardUnknown(m) +} + +var xxx_messageInfo_SkycoinCheckMessageSignature proto.InternalMessageInfo + +func (m *SkycoinCheckMessageSignature) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +func (m *SkycoinCheckMessageSignature) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +func (m *SkycoinCheckMessageSignature) GetSignature() string { + if m != nil && m.Signature != nil { + return *m.Signature + } + return "" +} + +// * +// Request: Sign a message digest using the given secret key. +// @next Failure +// @next ResponseSkycoinSignMessage +type SkycoinSignMessage struct { + AddressN *uint32 `protobuf:"varint,1,req,name=address_n,json=addressN" json:"address_n,omitempty"` + Message *string `protobuf:"bytes,2,req,name=message" json:"message,omitempty"` + Bip44Addr *Bip44AddrIndex `protobuf:"bytes,3,opt,name=bip44_addr,json=bip44Addr" json:"bip44_addr,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SkycoinSignMessage) Reset() { *m = SkycoinSignMessage{} } +func (m *SkycoinSignMessage) String() string { return proto.CompactTextString(m) } +func (*SkycoinSignMessage) ProtoMessage() {} +func (*SkycoinSignMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{11} +} +func (m *SkycoinSignMessage) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SkycoinSignMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SkycoinSignMessage.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *SkycoinSignMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_SkycoinSignMessage.Merge(dst, src) +} +func (m *SkycoinSignMessage) XXX_Size() int { + return m.Size() +} +func (m *SkycoinSignMessage) XXX_DiscardUnknown() { + xxx_messageInfo_SkycoinSignMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_SkycoinSignMessage proto.InternalMessageInfo + +func (m *SkycoinSignMessage) GetAddressN() uint32 { + if m != nil && m.AddressN != nil { + return *m.AddressN + } + return 0 +} + +func (m *SkycoinSignMessage) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +func (m *SkycoinSignMessage) GetBip44Addr() *Bip44AddrIndex { + if m != nil { + return m.Bip44Addr + } + return nil +} + +// * +// Response: Return the generated skycoin address +// @prev SkycoinAddress +type ResponseSkycoinSignMessage struct { + SignedMessage *string `protobuf:"bytes,1,req,name=signed_message,json=signedMessage" json:"signed_message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResponseSkycoinSignMessage) Reset() { *m = ResponseSkycoinSignMessage{} } +func (m *ResponseSkycoinSignMessage) String() string { return proto.CompactTextString(m) } +func (*ResponseSkycoinSignMessage) ProtoMessage() {} +func (*ResponseSkycoinSignMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{12} +} +func (m *ResponseSkycoinSignMessage) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseSkycoinSignMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseSkycoinSignMessage.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *ResponseSkycoinSignMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseSkycoinSignMessage.Merge(dst, src) +} +func (m *ResponseSkycoinSignMessage) XXX_Size() int { + return m.Size() +} +func (m *ResponseSkycoinSignMessage) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseSkycoinSignMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseSkycoinSignMessage proto.InternalMessageInfo + +func (m *ResponseSkycoinSignMessage) GetSignedMessage() string { + if m != nil && m.SignedMessage != nil { + return *m.SignedMessage + } + return "" +} + +// * +// Request: Test if the device is alive, device sends back the message in Success response +// @next Success +type Ping struct { + Message *string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` + ButtonProtection *bool `protobuf:"varint,2,opt,name=button_protection,json=buttonProtection" json:"button_protection,omitempty"` + PinProtection *bool `protobuf:"varint,3,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + PassphraseProtection *bool `protobuf:"varint,4,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ping) Reset() { *m = Ping{} } +func (m *Ping) String() string { return proto.CompactTextString(m) } +func (*Ping) ProtoMessage() {} +func (*Ping) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{13} +} +func (m *Ping) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Ping.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Ping) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ping.Merge(dst, src) +} +func (m *Ping) XXX_Size() int { + return m.Size() +} +func (m *Ping) XXX_DiscardUnknown() { + xxx_messageInfo_Ping.DiscardUnknown(m) +} + +var xxx_messageInfo_Ping proto.InternalMessageInfo + +func (m *Ping) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +func (m *Ping) GetButtonProtection() bool { + if m != nil && m.ButtonProtection != nil { + return *m.ButtonProtection + } + return false +} + +func (m *Ping) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *Ping) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +// * +// Response: Success of the previous request +type Success struct { + MsgType *MessageType `protobuf:"varint,1,opt,name=msg_type,json=msgType,enum=MessageType" json:"msg_type,omitempty"` + Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Success) Reset() { *m = Success{} } +func (m *Success) String() string { return proto.CompactTextString(m) } +func (*Success) ProtoMessage() {} +func (*Success) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{14} +} +func (m *Success) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Success) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Success.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Success) XXX_Merge(src proto.Message) { + xxx_messageInfo_Success.Merge(dst, src) +} +func (m *Success) XXX_Size() int { + return m.Size() +} +func (m *Success) XXX_DiscardUnknown() { + xxx_messageInfo_Success.DiscardUnknown(m) +} + +var xxx_messageInfo_Success proto.InternalMessageInfo + +func (m *Success) GetMsgType() MessageType { + if m != nil && m.MsgType != nil { + return *m.MsgType + } + return MessageType_MessageType_Initialize +} + +func (m *Success) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +// * +// Response: Failure of the previous request +type Failure struct { + MsgType *MessageType `protobuf:"varint,1,opt,name=msg_type,json=msgType,enum=MessageType" json:"msg_type,omitempty"` + Code *FailureType `protobuf:"varint,2,opt,name=code,enum=FailureType" json:"code,omitempty"` + Message *string `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Failure) Reset() { *m = Failure{} } +func (m *Failure) String() string { return proto.CompactTextString(m) } +func (*Failure) ProtoMessage() {} +func (*Failure) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{15} +} +func (m *Failure) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Failure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Failure.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Failure) XXX_Merge(src proto.Message) { + xxx_messageInfo_Failure.Merge(dst, src) +} +func (m *Failure) XXX_Size() int { + return m.Size() +} +func (m *Failure) XXX_DiscardUnknown() { + xxx_messageInfo_Failure.DiscardUnknown(m) +} + +var xxx_messageInfo_Failure proto.InternalMessageInfo + +func (m *Failure) GetMsgType() MessageType { + if m != nil && m.MsgType != nil { + return *m.MsgType + } + return MessageType_MessageType_Initialize +} + +func (m *Failure) GetCode() FailureType { + if m != nil && m.Code != nil { + return *m.Code + } + return FailureType_Failure_UnexpectedMessage +} + +func (m *Failure) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +// * +// Response: Device is waiting for HW button press. +// @next ButtonAck +// @next Cancel +type ButtonRequest struct { + Code *ButtonRequestType `protobuf:"varint,1,opt,name=code,enum=ButtonRequestType" json:"code,omitempty"` + Data *string `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ButtonRequest) Reset() { *m = ButtonRequest{} } +func (m *ButtonRequest) String() string { return proto.CompactTextString(m) } +func (*ButtonRequest) ProtoMessage() {} +func (*ButtonRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{16} +} +func (m *ButtonRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ButtonRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ButtonRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *ButtonRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ButtonRequest.Merge(dst, src) +} +func (m *ButtonRequest) XXX_Size() int { + return m.Size() +} +func (m *ButtonRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ButtonRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ButtonRequest proto.InternalMessageInfo + +func (m *ButtonRequest) GetCode() ButtonRequestType { + if m != nil && m.Code != nil { + return *m.Code + } + return ButtonRequestType_ButtonRequest_Other +} + +func (m *ButtonRequest) GetData() string { + if m != nil && m.Data != nil { + return *m.Data + } + return "" +} + +// * +// Request: Computer agrees to wait for HW button press +// @prev ButtonRequest +type ButtonAck struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ButtonAck) Reset() { *m = ButtonAck{} } +func (m *ButtonAck) String() string { return proto.CompactTextString(m) } +func (*ButtonAck) ProtoMessage() {} +func (*ButtonAck) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{17} +} +func (m *ButtonAck) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ButtonAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ButtonAck.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *ButtonAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_ButtonAck.Merge(dst, src) +} +func (m *ButtonAck) XXX_Size() int { + return m.Size() +} +func (m *ButtonAck) XXX_DiscardUnknown() { + xxx_messageInfo_ButtonAck.DiscardUnknown(m) +} + +var xxx_messageInfo_ButtonAck proto.InternalMessageInfo + +// * +// Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme +// @next PinMatrixAck +// @next Cancel +type PinMatrixRequest struct { + Type *PinMatrixRequestType `protobuf:"varint,1,opt,name=type,enum=PinMatrixRequestType" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PinMatrixRequest) Reset() { *m = PinMatrixRequest{} } +func (m *PinMatrixRequest) String() string { return proto.CompactTextString(m) } +func (*PinMatrixRequest) ProtoMessage() {} +func (*PinMatrixRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{18} +} +func (m *PinMatrixRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PinMatrixRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PinMatrixRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *PinMatrixRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PinMatrixRequest.Merge(dst, src) +} +func (m *PinMatrixRequest) XXX_Size() int { + return m.Size() +} +func (m *PinMatrixRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PinMatrixRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PinMatrixRequest proto.InternalMessageInfo + +func (m *PinMatrixRequest) GetType() PinMatrixRequestType { + if m != nil && m.Type != nil { + return *m.Type + } + return PinMatrixRequestType_PinMatrixRequestType_Current +} + +// * +// Request: Computer responds with encoded PIN +// @prev PinMatrixRequest +type PinMatrixAck struct { + Pin *string `protobuf:"bytes,1,req,name=pin" json:"pin,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PinMatrixAck) Reset() { *m = PinMatrixAck{} } +func (m *PinMatrixAck) String() string { return proto.CompactTextString(m) } +func (*PinMatrixAck) ProtoMessage() {} +func (*PinMatrixAck) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{19} +} +func (m *PinMatrixAck) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PinMatrixAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PinMatrixAck.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *PinMatrixAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_PinMatrixAck.Merge(dst, src) +} +func (m *PinMatrixAck) XXX_Size() int { + return m.Size() +} +func (m *PinMatrixAck) XXX_DiscardUnknown() { + xxx_messageInfo_PinMatrixAck.DiscardUnknown(m) +} + +var xxx_messageInfo_PinMatrixAck proto.InternalMessageInfo + +func (m *PinMatrixAck) GetPin() string { + if m != nil && m.Pin != nil { + return *m.Pin + } + return "" +} + +// * +// Request: Abort last operation that required user interaction +// @prev ButtonRequest +// @prev PinMatrixRequest +// @prev PassphraseRequest +type Cancel struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Cancel) Reset() { *m = Cancel{} } +func (m *Cancel) String() string { return proto.CompactTextString(m) } +func (*Cancel) ProtoMessage() {} +func (*Cancel) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{20} +} +func (m *Cancel) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Cancel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Cancel.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Cancel) XXX_Merge(src proto.Message) { + xxx_messageInfo_Cancel.Merge(dst, src) +} +func (m *Cancel) XXX_Size() int { + return m.Size() +} +func (m *Cancel) XXX_DiscardUnknown() { + xxx_messageInfo_Cancel.DiscardUnknown(m) +} + +var xxx_messageInfo_Cancel proto.InternalMessageInfo + +// * +// Response: Device awaits encryption passphrase +// @next PassphraseAck +// @next Cancel +type PassphraseRequest struct { + OnDevice *bool `protobuf:"varint,1,opt,name=on_device,json=onDevice" json:"on_device,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseRequest) Reset() { *m = PassphraseRequest{} } +func (m *PassphraseRequest) String() string { return proto.CompactTextString(m) } +func (*PassphraseRequest) ProtoMessage() {} +func (*PassphraseRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{21} +} +func (m *PassphraseRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PassphraseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PassphraseRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *PassphraseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseRequest.Merge(dst, src) +} +func (m *PassphraseRequest) XXX_Size() int { + return m.Size() +} +func (m *PassphraseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseRequest proto.InternalMessageInfo + +func (m *PassphraseRequest) GetOnDevice() bool { + if m != nil && m.OnDevice != nil { + return *m.OnDevice + } + return false +} + +// * +// Request: Send passphrase back +// @prev PassphraseRequest +// @next PassphraseStateRequest +type PassphraseAck struct { + Passphrase *string `protobuf:"bytes,1,opt,name=passphrase" json:"passphrase,omitempty"` + State []byte `protobuf:"bytes,2,opt,name=state" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseAck) Reset() { *m = PassphraseAck{} } +func (m *PassphraseAck) String() string { return proto.CompactTextString(m) } +func (*PassphraseAck) ProtoMessage() {} +func (*PassphraseAck) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{22} +} +func (m *PassphraseAck) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PassphraseAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PassphraseAck.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *PassphraseAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseAck.Merge(dst, src) +} +func (m *PassphraseAck) XXX_Size() int { + return m.Size() +} +func (m *PassphraseAck) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseAck.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseAck proto.InternalMessageInfo + +func (m *PassphraseAck) GetPassphrase() string { + if m != nil && m.Passphrase != nil { + return *m.Passphrase + } + return "" +} + +func (m *PassphraseAck) GetState() []byte { + if m != nil { + return m.State + } + return nil +} + +// * +// @prev PassphraseAck +// @next PassphraseStateAck +type PassphraseStateRequest struct { + State []byte `protobuf:"bytes,1,opt,name=state" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseStateRequest) Reset() { *m = PassphraseStateRequest{} } +func (m *PassphraseStateRequest) String() string { return proto.CompactTextString(m) } +func (*PassphraseStateRequest) ProtoMessage() {} +func (*PassphraseStateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{23} +} +func (m *PassphraseStateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PassphraseStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PassphraseStateRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *PassphraseStateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseStateRequest.Merge(dst, src) +} +func (m *PassphraseStateRequest) XXX_Size() int { + return m.Size() +} +func (m *PassphraseStateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseStateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseStateRequest proto.InternalMessageInfo + +func (m *PassphraseStateRequest) GetState() []byte { + if m != nil { + return m.State + } + return nil +} + +// * +// @prev PassphraseStateRequest +type PassphraseStateAck struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseStateAck) Reset() { *m = PassphraseStateAck{} } +func (m *PassphraseStateAck) String() string { return proto.CompactTextString(m) } +func (*PassphraseStateAck) ProtoMessage() {} +func (*PassphraseStateAck) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{24} +} +func (m *PassphraseStateAck) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PassphraseStateAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PassphraseStateAck.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *PassphraseStateAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseStateAck.Merge(dst, src) +} +func (m *PassphraseStateAck) XXX_Size() int { + return m.Size() +} +func (m *PassphraseStateAck) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseStateAck.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseStateAck proto.InternalMessageInfo + +// * +// Request: Request a sample of random data generated by hardware RNG. May be used for testing. +// @next ButtonRequest +// @next Entropy +// @next Failure +type GetRawEntropy struct { + Size_ *uint32 `protobuf:"varint,1,req,name=size" json:"size,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetRawEntropy) Reset() { *m = GetRawEntropy{} } +func (m *GetRawEntropy) String() string { return proto.CompactTextString(m) } +func (*GetRawEntropy) ProtoMessage() {} +func (*GetRawEntropy) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{25} +} +func (m *GetRawEntropy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetRawEntropy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetRawEntropy.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *GetRawEntropy) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetRawEntropy.Merge(dst, src) +} +func (m *GetRawEntropy) XXX_Size() int { + return m.Size() +} +func (m *GetRawEntropy) XXX_DiscardUnknown() { + xxx_messageInfo_GetRawEntropy.DiscardUnknown(m) +} + +var xxx_messageInfo_GetRawEntropy proto.InternalMessageInfo + +func (m *GetRawEntropy) GetSize_() uint32 { + if m != nil && m.Size_ != nil { + return *m.Size_ + } + return 0 +} + +// * +// Request: Request a sample of salted random data. May be used for testing. +// @next ButtonRequest +// @next Entropy +// @next Failure +type GetMixedEntropy struct { + Size_ *uint32 `protobuf:"varint,1,req,name=size" json:"size,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetMixedEntropy) Reset() { *m = GetMixedEntropy{} } +func (m *GetMixedEntropy) String() string { return proto.CompactTextString(m) } +func (*GetMixedEntropy) ProtoMessage() {} +func (*GetMixedEntropy) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{26} +} +func (m *GetMixedEntropy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetMixedEntropy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetMixedEntropy.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *GetMixedEntropy) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetMixedEntropy.Merge(dst, src) +} +func (m *GetMixedEntropy) XXX_Size() int { + return m.Size() +} +func (m *GetMixedEntropy) XXX_DiscardUnknown() { + xxx_messageInfo_GetMixedEntropy.DiscardUnknown(m) +} + +var xxx_messageInfo_GetMixedEntropy proto.InternalMessageInfo + +func (m *GetMixedEntropy) GetSize_() uint32 { + if m != nil && m.Size_ != nil { + return *m.Size_ + } + return 0 +} + +// * +// Response: Reply with random data generated by internal RNG +// @prev GetRawEntropy +// @prev GetMixedEntropy +type Entropy struct { + Entropy []byte `protobuf:"bytes,1,req,name=entropy" json:"entropy,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Entropy) Reset() { *m = Entropy{} } +func (m *Entropy) String() string { return proto.CompactTextString(m) } +func (*Entropy) ProtoMessage() {} +func (*Entropy) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{27} +} +func (m *Entropy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Entropy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Entropy.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Entropy) XXX_Merge(src proto.Message) { + xxx_messageInfo_Entropy.Merge(dst, src) +} +func (m *Entropy) XXX_Size() int { + return m.Size() +} +func (m *Entropy) XXX_DiscardUnknown() { + xxx_messageInfo_Entropy.DiscardUnknown(m) +} + +var xxx_messageInfo_Entropy proto.InternalMessageInfo + +func (m *Entropy) GetEntropy() []byte { + if m != nil { + return m.Entropy + } + return nil +} + +// * +// Request: Request device to wipe all sensitive data and settings +// @next ButtonRequest +type WipeDevice struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *WipeDevice) Reset() { *m = WipeDevice{} } +func (m *WipeDevice) String() string { return proto.CompactTextString(m) } +func (*WipeDevice) ProtoMessage() {} +func (*WipeDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{28} +} +func (m *WipeDevice) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WipeDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WipeDevice.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *WipeDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_WipeDevice.Merge(dst, src) +} +func (m *WipeDevice) XXX_Size() int { + return m.Size() +} +func (m *WipeDevice) XXX_DiscardUnknown() { + xxx_messageInfo_WipeDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_WipeDevice proto.InternalMessageInfo + +// * +// Request: Load seed and related internal settings from the computer +// @next ButtonRequest +// @next Success +// @next Failure +type LoadDevice struct { + Mnemonic *string `protobuf:"bytes,1,opt,name=mnemonic" json:"mnemonic,omitempty"` + Node *HDNodeType `protobuf:"bytes,2,opt,name=node" json:"node,omitempty"` + Pin *string `protobuf:"bytes,3,opt,name=pin" json:"pin,omitempty"` + PassphraseProtection *bool `protobuf:"varint,4,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + Language *string `protobuf:"bytes,5,opt,name=language,def=english" json:"language,omitempty"` + Label *string `protobuf:"bytes,6,opt,name=label" json:"label,omitempty"` + SkipChecksum *bool `protobuf:"varint,7,opt,name=skip_checksum,json=skipChecksum" json:"skip_checksum,omitempty"` + U2FCounter *uint32 `protobuf:"varint,8,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LoadDevice) Reset() { *m = LoadDevice{} } +func (m *LoadDevice) String() string { return proto.CompactTextString(m) } +func (*LoadDevice) ProtoMessage() {} +func (*LoadDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{29} +} +func (m *LoadDevice) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LoadDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LoadDevice.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *LoadDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_LoadDevice.Merge(dst, src) +} +func (m *LoadDevice) XXX_Size() int { + return m.Size() +} +func (m *LoadDevice) XXX_DiscardUnknown() { + xxx_messageInfo_LoadDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_LoadDevice proto.InternalMessageInfo + +const Default_LoadDevice_Language string = "english" + +func (m *LoadDevice) GetMnemonic() string { + if m != nil && m.Mnemonic != nil { + return *m.Mnemonic + } + return "" +} + +func (m *LoadDevice) GetNode() *HDNodeType { + if m != nil { + return m.Node + } + return nil +} + +func (m *LoadDevice) GetPin() string { + if m != nil && m.Pin != nil { + return *m.Pin + } + return "" +} + +func (m *LoadDevice) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *LoadDevice) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return Default_LoadDevice_Language +} + +func (m *LoadDevice) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *LoadDevice) GetSkipChecksum() bool { + if m != nil && m.SkipChecksum != nil { + return *m.SkipChecksum + } + return false +} + +func (m *LoadDevice) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +// * +// Request: Ask device to do initialization involving user interaction +// @next EntropyRequest +// @next Failure +type ResetDevice struct { + DisplayRandom *bool `protobuf:"varint,1,opt,name=display_random,json=displayRandom" json:"display_random,omitempty"` + Strength *uint32 `protobuf:"varint,2,opt,name=strength,def=256" json:"strength,omitempty"` + PassphraseProtection *bool `protobuf:"varint,3,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + PinProtection *bool `protobuf:"varint,4,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + Language *string `protobuf:"bytes,5,opt,name=language,def=english" json:"language,omitempty"` + Label *string `protobuf:"bytes,6,opt,name=label" json:"label,omitempty"` + U2FCounter *uint32 `protobuf:"varint,7,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + SkipBackup *bool `protobuf:"varint,8,opt,name=skip_backup,json=skipBackup" json:"skip_backup,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResetDevice) Reset() { *m = ResetDevice{} } +func (m *ResetDevice) String() string { return proto.CompactTextString(m) } +func (*ResetDevice) ProtoMessage() {} +func (*ResetDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{30} +} +func (m *ResetDevice) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResetDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResetDevice.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *ResetDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResetDevice.Merge(dst, src) +} +func (m *ResetDevice) XXX_Size() int { + return m.Size() +} +func (m *ResetDevice) XXX_DiscardUnknown() { + xxx_messageInfo_ResetDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_ResetDevice proto.InternalMessageInfo + +const Default_ResetDevice_Strength uint32 = 256 +const Default_ResetDevice_Language string = "english" + +func (m *ResetDevice) GetDisplayRandom() bool { + if m != nil && m.DisplayRandom != nil { + return *m.DisplayRandom + } + return false +} + +func (m *ResetDevice) GetStrength() uint32 { + if m != nil && m.Strength != nil { + return *m.Strength + } + return Default_ResetDevice_Strength +} + +func (m *ResetDevice) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *ResetDevice) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *ResetDevice) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return Default_ResetDevice_Language +} + +func (m *ResetDevice) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *ResetDevice) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +func (m *ResetDevice) GetSkipBackup() bool { + if m != nil && m.SkipBackup != nil { + return *m.SkipBackup + } + return false +} + +// * +// Request: Perform backup of the device seed if not backed up using ResetDevice +// @next ButtonRequest +type BackupDevice struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BackupDevice) Reset() { *m = BackupDevice{} } +func (m *BackupDevice) String() string { return proto.CompactTextString(m) } +func (*BackupDevice) ProtoMessage() {} +func (*BackupDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{31} +} +func (m *BackupDevice) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BackupDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BackupDevice.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *BackupDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_BackupDevice.Merge(dst, src) +} +func (m *BackupDevice) XXX_Size() int { + return m.Size() +} +func (m *BackupDevice) XXX_DiscardUnknown() { + xxx_messageInfo_BackupDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_BackupDevice proto.InternalMessageInfo + +// * +// Response: Ask for additional entropy from host computer +// @prev ResetDevice +// @next EntropyAck +type EntropyRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EntropyRequest) Reset() { *m = EntropyRequest{} } +func (m *EntropyRequest) String() string { return proto.CompactTextString(m) } +func (*EntropyRequest) ProtoMessage() {} +func (*EntropyRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{32} +} +func (m *EntropyRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EntropyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EntropyRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *EntropyRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_EntropyRequest.Merge(dst, src) +} +func (m *EntropyRequest) XXX_Size() int { + return m.Size() +} +func (m *EntropyRequest) XXX_DiscardUnknown() { + xxx_messageInfo_EntropyRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_EntropyRequest proto.InternalMessageInfo + +// * +// Request: Provide additional entropy for seed generation function +// @prev EntropyRequest +// @next ButtonRequest +type EntropyAck struct { + Entropy []byte `protobuf:"bytes,1,opt,name=entropy" json:"entropy,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EntropyAck) Reset() { *m = EntropyAck{} } +func (m *EntropyAck) String() string { return proto.CompactTextString(m) } +func (*EntropyAck) ProtoMessage() {} +func (*EntropyAck) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{33} +} +func (m *EntropyAck) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EntropyAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EntropyAck.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *EntropyAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_EntropyAck.Merge(dst, src) +} +func (m *EntropyAck) XXX_Size() int { + return m.Size() +} +func (m *EntropyAck) XXX_DiscardUnknown() { + xxx_messageInfo_EntropyAck.DiscardUnknown(m) +} + +var xxx_messageInfo_EntropyAck proto.InternalMessageInfo + +func (m *EntropyAck) GetEntropy() []byte { + if m != nil { + return m.Entropy + } + return nil +} + +// * +// Request: Start recovery workflow asking user for specific words of mnemonic +// Used to recovery device safely even on untrusted computer. +// @next WordRequest +type RecoveryDevice struct { + WordCount *uint32 `protobuf:"varint,1,opt,name=word_count,json=wordCount" json:"word_count,omitempty"` + PassphraseProtection *bool `protobuf:"varint,2,opt,name=passphrase_protection,json=passphraseProtection" json:"passphrase_protection,omitempty"` + PinProtection *bool `protobuf:"varint,3,opt,name=pin_protection,json=pinProtection" json:"pin_protection,omitempty"` + Language *string `protobuf:"bytes,4,opt,name=language,def=english" json:"language,omitempty"` + Label *string `protobuf:"bytes,5,opt,name=label" json:"label,omitempty"` + DryRun *bool `protobuf:"varint,6,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RecoveryDevice) Reset() { *m = RecoveryDevice{} } +func (m *RecoveryDevice) String() string { return proto.CompactTextString(m) } +func (*RecoveryDevice) ProtoMessage() {} +func (*RecoveryDevice) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{34} +} +func (m *RecoveryDevice) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RecoveryDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RecoveryDevice.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *RecoveryDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_RecoveryDevice.Merge(dst, src) +} +func (m *RecoveryDevice) XXX_Size() int { + return m.Size() +} +func (m *RecoveryDevice) XXX_DiscardUnknown() { + xxx_messageInfo_RecoveryDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_RecoveryDevice proto.InternalMessageInfo + +const Default_RecoveryDevice_Language string = "english" + +func (m *RecoveryDevice) GetWordCount() uint32 { + if m != nil && m.WordCount != nil { + return *m.WordCount + } + return 0 +} + +func (m *RecoveryDevice) GetPassphraseProtection() bool { + if m != nil && m.PassphraseProtection != nil { + return *m.PassphraseProtection + } + return false +} + +func (m *RecoveryDevice) GetPinProtection() bool { + if m != nil && m.PinProtection != nil { + return *m.PinProtection + } + return false +} + +func (m *RecoveryDevice) GetLanguage() string { + if m != nil && m.Language != nil { + return *m.Language + } + return Default_RecoveryDevice_Language +} + +func (m *RecoveryDevice) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *RecoveryDevice) GetDryRun() bool { + if m != nil && m.DryRun != nil { + return *m.DryRun + } + return false +} + +// * +// Response: Device is waiting for user to enter word of the mnemonic +// Its position is shown only on device's internal display. +// @prev RecoveryDevice +// @prev WordAck +type WordRequest struct { + Type *WordRequestType `protobuf:"varint,1,opt,name=type,enum=WordRequestType" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *WordRequest) Reset() { *m = WordRequest{} } +func (m *WordRequest) String() string { return proto.CompactTextString(m) } +func (*WordRequest) ProtoMessage() {} +func (*WordRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{35} +} +func (m *WordRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WordRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WordRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *WordRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_WordRequest.Merge(dst, src) +} +func (m *WordRequest) XXX_Size() int { + return m.Size() +} +func (m *WordRequest) XXX_DiscardUnknown() { + xxx_messageInfo_WordRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_WordRequest proto.InternalMessageInfo + +func (m *WordRequest) GetType() WordRequestType { + if m != nil && m.Type != nil { + return *m.Type + } + return WordRequestType_WordRequestType_Plain +} + +// * +// Request: Computer replies with word from the mnemonic +// @prev WordRequest +// @next WordRequest +// @next Success +// @next Failure +type WordAck struct { + Word *string `protobuf:"bytes,1,req,name=word" json:"word,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *WordAck) Reset() { *m = WordAck{} } +func (m *WordAck) String() string { return proto.CompactTextString(m) } +func (*WordAck) ProtoMessage() {} +func (*WordAck) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{36} +} +func (m *WordAck) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WordAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WordAck.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *WordAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_WordAck.Merge(dst, src) +} +func (m *WordAck) XXX_Size() int { + return m.Size() +} +func (m *WordAck) XXX_DiscardUnknown() { + xxx_messageInfo_WordAck.DiscardUnknown(m) +} + +var xxx_messageInfo_WordAck proto.InternalMessageInfo + +func (m *WordAck) GetWord() string { + if m != nil && m.Word != nil { + return *m.Word + } + return "" +} + +// * +// Request: Ask device to erase its firmware (so it can be replaced via FirmwareUpload) +// @start +// @next FirmwareRequest +type FirmwareErase struct { + Length *uint32 `protobuf:"varint,1,opt,name=length" json:"length,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FirmwareErase) Reset() { *m = FirmwareErase{} } +func (m *FirmwareErase) String() string { return proto.CompactTextString(m) } +func (*FirmwareErase) ProtoMessage() {} +func (*FirmwareErase) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{37} +} +func (m *FirmwareErase) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FirmwareErase) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_FirmwareErase.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *FirmwareErase) XXX_Merge(src proto.Message) { + xxx_messageInfo_FirmwareErase.Merge(dst, src) +} +func (m *FirmwareErase) XXX_Size() int { + return m.Size() +} +func (m *FirmwareErase) XXX_DiscardUnknown() { + xxx_messageInfo_FirmwareErase.DiscardUnknown(m) +} + +var xxx_messageInfo_FirmwareErase proto.InternalMessageInfo + +func (m *FirmwareErase) GetLength() uint32 { + if m != nil && m.Length != nil { + return *m.Length + } + return 0 +} + +// * +// Response: Ask for firmware chunk +// @next FirmwareUpload +type FirmwareRequest struct { + Offset *uint32 `protobuf:"varint,1,opt,name=offset" json:"offset,omitempty"` + Length *uint32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FirmwareRequest) Reset() { *m = FirmwareRequest{} } +func (m *FirmwareRequest) String() string { return proto.CompactTextString(m) } +func (*FirmwareRequest) ProtoMessage() {} +func (*FirmwareRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{38} +} +func (m *FirmwareRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FirmwareRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_FirmwareRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *FirmwareRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_FirmwareRequest.Merge(dst, src) +} +func (m *FirmwareRequest) XXX_Size() int { + return m.Size() +} +func (m *FirmwareRequest) XXX_DiscardUnknown() { + xxx_messageInfo_FirmwareRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_FirmwareRequest proto.InternalMessageInfo + +func (m *FirmwareRequest) GetOffset() uint32 { + if m != nil && m.Offset != nil { + return *m.Offset + } + return 0 +} + +func (m *FirmwareRequest) GetLength() uint32 { + if m != nil && m.Length != nil { + return *m.Length + } + return 0 +} + +// * +// Request: Ask device to upload its firmware +// @start +// @next FirmwareUpload +type FirmwareUpload struct { + Payload []byte `protobuf:"bytes,1,opt,name=payload" json:"payload,omitempty"` + Hash []byte `protobuf:"bytes,2,opt,name=hash" json:"hash,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *FirmwareUpload) Reset() { *m = FirmwareUpload{} } +func (m *FirmwareUpload) String() string { return proto.CompactTextString(m) } +func (*FirmwareUpload) ProtoMessage() {} +func (*FirmwareUpload) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{39} +} +func (m *FirmwareUpload) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FirmwareUpload) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_FirmwareUpload.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *FirmwareUpload) XXX_Merge(src proto.Message) { + xxx_messageInfo_FirmwareUpload.Merge(dst, src) +} +func (m *FirmwareUpload) XXX_Size() int { + return m.Size() +} +func (m *FirmwareUpload) XXX_DiscardUnknown() { + xxx_messageInfo_FirmwareUpload.DiscardUnknown(m) +} + +var xxx_messageInfo_FirmwareUpload proto.InternalMessageInfo + +func (m *FirmwareUpload) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func (m *FirmwareUpload) GetHash() []byte { + if m != nil { + return m.Hash + } + return nil +} + +// * +// Request: Ask device to sign transactions one by one +// @next ResponseSkycoinSignMessage +// @next Success +// @next Failure +type TransactionSign struct { + NbIn *uint32 `protobuf:"varint,1,req,name=nbIn" json:"nbIn,omitempty"` + TransactionIn []*SkycoinTransactionInput `protobuf:"bytes,2,rep,name=transactionIn" json:"transactionIn,omitempty"` + NbOut *uint32 `protobuf:"varint,3,req,name=nbOut" json:"nbOut,omitempty"` + TransactionOut []*SkycoinTransactionOutput `protobuf:"bytes,4,rep,name=transactionOut" json:"transactionOut,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TransactionSign) Reset() { *m = TransactionSign{} } +func (m *TransactionSign) String() string { return proto.CompactTextString(m) } +func (*TransactionSign) ProtoMessage() {} +func (*TransactionSign) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{40} +} +func (m *TransactionSign) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TransactionSign) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TransactionSign.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TransactionSign) XXX_Merge(src proto.Message) { + xxx_messageInfo_TransactionSign.Merge(dst, src) +} +func (m *TransactionSign) XXX_Size() int { + return m.Size() +} +func (m *TransactionSign) XXX_DiscardUnknown() { + xxx_messageInfo_TransactionSign.DiscardUnknown(m) +} + +var xxx_messageInfo_TransactionSign proto.InternalMessageInfo + +func (m *TransactionSign) GetNbIn() uint32 { + if m != nil && m.NbIn != nil { + return *m.NbIn + } + return 0 +} + +func (m *TransactionSign) GetTransactionIn() []*SkycoinTransactionInput { + if m != nil { + return m.TransactionIn + } + return nil +} + +func (m *TransactionSign) GetNbOut() uint32 { + if m != nil && m.NbOut != nil { + return *m.NbOut + } + return 0 +} + +func (m *TransactionSign) GetTransactionOut() []*SkycoinTransactionOutput { + if m != nil { + return m.TransactionOut + } + return nil +} + +type SignTx struct { + OutputsCount *uint32 `protobuf:"varint,1,req,name=outputs_count,json=outputsCount" json:"outputs_count,omitempty"` + InputsCount *uint32 `protobuf:"varint,2,req,name=inputs_count,json=inputsCount" json:"inputs_count,omitempty"` + CoinName *string `protobuf:"bytes,3,opt,name=coin_name,json=coinName,def=SKY" json:"coin_name,omitempty"` + Version *uint32 `protobuf:"varint,4,opt,name=version,def=1" json:"version,omitempty"` + LockTime *uint32 `protobuf:"varint,5,opt,name=lock_time,json=lockTime,def=0" json:"lock_time,omitempty"` + TxHash *string `protobuf:"bytes,6,opt,name=tx_hash,json=txHash" json:"tx_hash,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SignTx) Reset() { *m = SignTx{} } +func (m *SignTx) String() string { return proto.CompactTextString(m) } +func (*SignTx) ProtoMessage() {} +func (*SignTx) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{41} +} +func (m *SignTx) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SignTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SignTx.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *SignTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignTx.Merge(dst, src) +} +func (m *SignTx) XXX_Size() int { + return m.Size() +} +func (m *SignTx) XXX_DiscardUnknown() { + xxx_messageInfo_SignTx.DiscardUnknown(m) +} + +var xxx_messageInfo_SignTx proto.InternalMessageInfo + +const Default_SignTx_CoinName string = "SKY" +const Default_SignTx_Version uint32 = 1 +const Default_SignTx_LockTime uint32 = 0 + +func (m *SignTx) GetOutputsCount() uint32 { + if m != nil && m.OutputsCount != nil { + return *m.OutputsCount + } + return 0 +} + +func (m *SignTx) GetInputsCount() uint32 { + if m != nil && m.InputsCount != nil { + return *m.InputsCount + } + return 0 +} + +func (m *SignTx) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return Default_SignTx_CoinName +} + +func (m *SignTx) GetVersion() uint32 { + if m != nil && m.Version != nil { + return *m.Version + } + return Default_SignTx_Version +} + +func (m *SignTx) GetLockTime() uint32 { + if m != nil && m.LockTime != nil { + return *m.LockTime + } + return Default_SignTx_LockTime +} + +func (m *SignTx) GetTxHash() string { + if m != nil && m.TxHash != nil { + return *m.TxHash + } + return "" +} + +type TxRequest struct { + RequestType *TxRequest_RequestType `protobuf:"varint,1,req,name=request_type,json=requestType,enum=TxRequest_RequestType" json:"request_type,omitempty"` + Details *TxRequest_TxRequestDetailsType `protobuf:"bytes,2,opt,name=details" json:"details,omitempty"` + SignResult []*TxRequest_TxRequestSignResponseType `protobuf:"bytes,3,rep,name=sign_result,json=signResult" json:"sign_result,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxRequest) Reset() { *m = TxRequest{} } +func (m *TxRequest) String() string { return proto.CompactTextString(m) } +func (*TxRequest) ProtoMessage() {} +func (*TxRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{42} +} +func (m *TxRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxRequest.Merge(dst, src) +} +func (m *TxRequest) XXX_Size() int { + return m.Size() +} +func (m *TxRequest) XXX_DiscardUnknown() { + xxx_messageInfo_TxRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_TxRequest proto.InternalMessageInfo + +func (m *TxRequest) GetRequestType() TxRequest_RequestType { + if m != nil && m.RequestType != nil { + return *m.RequestType + } + return TxRequest_TXINPUT +} + +func (m *TxRequest) GetDetails() *TxRequest_TxRequestDetailsType { + if m != nil { + return m.Details + } + return nil +} + +func (m *TxRequest) GetSignResult() []*TxRequest_TxRequestSignResponseType { + if m != nil { + return m.SignResult + } + return nil +} + +// * +// Structure representing request details +type TxRequest_TxRequestDetailsType struct { + RequestIndex *uint32 `protobuf:"varint,1,opt,name=request_index,json=requestIndex" json:"request_index,omitempty"` + TxHash *string `protobuf:"bytes,2,opt,name=tx_hash,json=txHash" json:"tx_hash,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxRequest_TxRequestDetailsType) Reset() { *m = TxRequest_TxRequestDetailsType{} } +func (m *TxRequest_TxRequestDetailsType) String() string { return proto.CompactTextString(m) } +func (*TxRequest_TxRequestDetailsType) ProtoMessage() {} +func (*TxRequest_TxRequestDetailsType) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{42, 0} +} +func (m *TxRequest_TxRequestDetailsType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxRequest_TxRequestDetailsType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxRequest_TxRequestDetailsType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxRequest_TxRequestDetailsType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxRequest_TxRequestDetailsType.Merge(dst, src) +} +func (m *TxRequest_TxRequestDetailsType) XXX_Size() int { + return m.Size() +} +func (m *TxRequest_TxRequestDetailsType) XXX_DiscardUnknown() { + xxx_messageInfo_TxRequest_TxRequestDetailsType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxRequest_TxRequestDetailsType proto.InternalMessageInfo + +func (m *TxRequest_TxRequestDetailsType) GetRequestIndex() uint32 { + if m != nil && m.RequestIndex != nil { + return *m.RequestIndex + } + return 0 +} + +func (m *TxRequest_TxRequestDetailsType) GetTxHash() string { + if m != nil && m.TxHash != nil { + return *m.TxHash + } + return "" +} + +// * +// Structure representing serialized data +type TxRequest_TxRequestSignResponseType struct { + SignatureIndex *uint32 `protobuf:"varint,1,opt,name=signature_index,json=signatureIndex" json:"signature_index,omitempty"` + Signature *string `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxRequest_TxRequestSignResponseType) Reset() { *m = TxRequest_TxRequestSignResponseType{} } +func (m *TxRequest_TxRequestSignResponseType) String() string { return proto.CompactTextString(m) } +func (*TxRequest_TxRequestSignResponseType) ProtoMessage() {} +func (*TxRequest_TxRequestSignResponseType) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{42, 1} +} +func (m *TxRequest_TxRequestSignResponseType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxRequest_TxRequestSignResponseType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxRequest_TxRequestSignResponseType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxRequest_TxRequestSignResponseType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxRequest_TxRequestSignResponseType.Merge(dst, src) +} +func (m *TxRequest_TxRequestSignResponseType) XXX_Size() int { + return m.Size() +} +func (m *TxRequest_TxRequestSignResponseType) XXX_DiscardUnknown() { + xxx_messageInfo_TxRequest_TxRequestSignResponseType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxRequest_TxRequestSignResponseType proto.InternalMessageInfo + +func (m *TxRequest_TxRequestSignResponseType) GetSignatureIndex() uint32 { + if m != nil && m.SignatureIndex != nil { + return *m.SignatureIndex + } + return 0 +} + +func (m *TxRequest_TxRequestSignResponseType) GetSignature() string { + if m != nil && m.Signature != nil { + return *m.Signature + } + return "" +} + +type TxAck struct { + Tx *TxAck_TransactionType `protobuf:"bytes,1,opt,name=tx" json:"tx,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxAck) Reset() { *m = TxAck{} } +func (m *TxAck) String() string { return proto.CompactTextString(m) } +func (*TxAck) ProtoMessage() {} +func (*TxAck) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{43} +} +func (m *TxAck) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxAck.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxAck.Merge(dst, src) +} +func (m *TxAck) XXX_Size() int { + return m.Size() +} +func (m *TxAck) XXX_DiscardUnknown() { + xxx_messageInfo_TxAck.DiscardUnknown(m) +} + +var xxx_messageInfo_TxAck proto.InternalMessageInfo + +func (m *TxAck) GetTx() *TxAck_TransactionType { + if m != nil { + return m.Tx + } + return nil +} + +// * +// Structure representing transaction +type TxAck_TransactionType struct { + Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"` + Inputs []*TxAck_TransactionType_TxInputType `protobuf:"bytes,2,rep,name=inputs" json:"inputs,omitempty"` + LockTime *uint32 `protobuf:"varint,4,opt,name=lock_time,json=lockTime" json:"lock_time,omitempty"` + Outputs []*TxAck_TransactionType_TxOutputType `protobuf:"bytes,5,rep,name=outputs" json:"outputs,omitempty"` + InputsCnt *uint32 `protobuf:"varint,6,opt,name=inputs_cnt,json=inputsCnt" json:"inputs_cnt,omitempty"` + OutputsCnt *uint32 `protobuf:"varint,7,opt,name=outputs_cnt,json=outputsCnt" json:"outputs_cnt,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxAck_TransactionType) Reset() { *m = TxAck_TransactionType{} } +func (m *TxAck_TransactionType) String() string { return proto.CompactTextString(m) } +func (*TxAck_TransactionType) ProtoMessage() {} +func (*TxAck_TransactionType) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{43, 0} +} +func (m *TxAck_TransactionType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxAck_TransactionType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxAck_TransactionType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxAck_TransactionType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxAck_TransactionType.Merge(dst, src) +} +func (m *TxAck_TransactionType) XXX_Size() int { + return m.Size() +} +func (m *TxAck_TransactionType) XXX_DiscardUnknown() { + xxx_messageInfo_TxAck_TransactionType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxAck_TransactionType proto.InternalMessageInfo + +func (m *TxAck_TransactionType) GetVersion() uint32 { + if m != nil && m.Version != nil { + return *m.Version + } + return 0 +} + +func (m *TxAck_TransactionType) GetInputs() []*TxAck_TransactionType_TxInputType { + if m != nil { + return m.Inputs + } + return nil +} + +func (m *TxAck_TransactionType) GetLockTime() uint32 { + if m != nil && m.LockTime != nil { + return *m.LockTime + } + return 0 +} + +func (m *TxAck_TransactionType) GetOutputs() []*TxAck_TransactionType_TxOutputType { + if m != nil { + return m.Outputs + } + return nil +} + +func (m *TxAck_TransactionType) GetInputsCnt() uint32 { + if m != nil && m.InputsCnt != nil { + return *m.InputsCnt + } + return 0 +} + +func (m *TxAck_TransactionType) GetOutputsCnt() uint32 { + if m != nil && m.OutputsCnt != nil { + return *m.OutputsCnt + } + return 0 +} + +// * +// Structure representing transaction input +type TxAck_TransactionType_TxInputType struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + HashIn *string `protobuf:"bytes,2,req,name=hashIn" json:"hashIn,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxAck_TransactionType_TxInputType) Reset() { *m = TxAck_TransactionType_TxInputType{} } +func (m *TxAck_TransactionType_TxInputType) String() string { return proto.CompactTextString(m) } +func (*TxAck_TransactionType_TxInputType) ProtoMessage() {} +func (*TxAck_TransactionType_TxInputType) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{43, 0, 0} +} +func (m *TxAck_TransactionType_TxInputType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxAck_TransactionType_TxInputType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxAck_TransactionType_TxInputType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxAck_TransactionType_TxInputType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxAck_TransactionType_TxInputType.Merge(dst, src) +} +func (m *TxAck_TransactionType_TxInputType) XXX_Size() int { + return m.Size() +} +func (m *TxAck_TransactionType_TxInputType) XXX_DiscardUnknown() { + xxx_messageInfo_TxAck_TransactionType_TxInputType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxAck_TransactionType_TxInputType proto.InternalMessageInfo + +func (m *TxAck_TransactionType_TxInputType) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *TxAck_TransactionType_TxInputType) GetHashIn() string { + if m != nil && m.HashIn != nil { + return *m.HashIn + } + return "" +} + +// * +// Structure representing transaction output +type TxAck_TransactionType_TxOutputType struct { + Address *string `protobuf:"bytes,1,req,name=address" json:"address,omitempty"` + AddressN []uint32 `protobuf:"varint,2,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Coins *uint64 `protobuf:"varint,3,req,name=coins" json:"coins,omitempty"` + Hours *uint64 `protobuf:"varint,4,req,name=hours" json:"hours,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxAck_TransactionType_TxOutputType) Reset() { *m = TxAck_TransactionType_TxOutputType{} } +func (m *TxAck_TransactionType_TxOutputType) String() string { return proto.CompactTextString(m) } +func (*TxAck_TransactionType_TxOutputType) ProtoMessage() {} +func (*TxAck_TransactionType_TxOutputType) Descriptor() ([]byte, []int) { + return fileDescriptor_messages_9ca50c8b3bdd214d, []int{43, 0, 1} +} +func (m *TxAck_TransactionType_TxOutputType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxAck_TransactionType_TxOutputType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxAck_TransactionType_TxOutputType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxAck_TransactionType_TxOutputType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxAck_TransactionType_TxOutputType.Merge(dst, src) +} +func (m *TxAck_TransactionType_TxOutputType) XXX_Size() int { + return m.Size() +} +func (m *TxAck_TransactionType_TxOutputType) XXX_DiscardUnknown() { + xxx_messageInfo_TxAck_TransactionType_TxOutputType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxAck_TransactionType_TxOutputType proto.InternalMessageInfo + +func (m *TxAck_TransactionType_TxOutputType) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +func (m *TxAck_TransactionType_TxOutputType) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *TxAck_TransactionType_TxOutputType) GetCoins() uint64 { + if m != nil && m.Coins != nil { + return *m.Coins + } + return 0 +} + +func (m *TxAck_TransactionType_TxOutputType) GetHours() uint64 { + if m != nil && m.Hours != nil { + return *m.Hours + } + return 0 +} + +func init() { + proto.RegisterType((*Initialize)(nil), "Initialize") + proto.RegisterType((*GetFeatures)(nil), "GetFeatures") + proto.RegisterType((*Features)(nil), "Features") + proto.RegisterType((*ApplySettings)(nil), "ApplySettings") + proto.RegisterType((*GenerateMnemonic)(nil), "GenerateMnemonic") + proto.RegisterType((*SetMnemonic)(nil), "SetMnemonic") + proto.RegisterType((*ChangePin)(nil), "ChangePin") + proto.RegisterType((*SkycoinAddress)(nil), "SkycoinAddress") + proto.RegisterType((*ResponseSkycoinAddress)(nil), "ResponseSkycoinAddress") + proto.RegisterType((*ResponseTransactionSign)(nil), "ResponseTransactionSign") + proto.RegisterType((*SkycoinCheckMessageSignature)(nil), "SkycoinCheckMessageSignature") + proto.RegisterType((*SkycoinSignMessage)(nil), "SkycoinSignMessage") + proto.RegisterType((*ResponseSkycoinSignMessage)(nil), "ResponseSkycoinSignMessage") + proto.RegisterType((*Ping)(nil), "Ping") + proto.RegisterType((*Success)(nil), "Success") + proto.RegisterType((*Failure)(nil), "Failure") + proto.RegisterType((*ButtonRequest)(nil), "ButtonRequest") + proto.RegisterType((*ButtonAck)(nil), "ButtonAck") + proto.RegisterType((*PinMatrixRequest)(nil), "PinMatrixRequest") + proto.RegisterType((*PinMatrixAck)(nil), "PinMatrixAck") + proto.RegisterType((*Cancel)(nil), "Cancel") + proto.RegisterType((*PassphraseRequest)(nil), "PassphraseRequest") + proto.RegisterType((*PassphraseAck)(nil), "PassphraseAck") + proto.RegisterType((*PassphraseStateRequest)(nil), "PassphraseStateRequest") + proto.RegisterType((*PassphraseStateAck)(nil), "PassphraseStateAck") + proto.RegisterType((*GetRawEntropy)(nil), "GetRawEntropy") + proto.RegisterType((*GetMixedEntropy)(nil), "GetMixedEntropy") + proto.RegisterType((*Entropy)(nil), "Entropy") + proto.RegisterType((*WipeDevice)(nil), "WipeDevice") + proto.RegisterType((*LoadDevice)(nil), "LoadDevice") + proto.RegisterType((*ResetDevice)(nil), "ResetDevice") + proto.RegisterType((*BackupDevice)(nil), "BackupDevice") + proto.RegisterType((*EntropyRequest)(nil), "EntropyRequest") + proto.RegisterType((*EntropyAck)(nil), "EntropyAck") + proto.RegisterType((*RecoveryDevice)(nil), "RecoveryDevice") + proto.RegisterType((*WordRequest)(nil), "WordRequest") + proto.RegisterType((*WordAck)(nil), "WordAck") + proto.RegisterType((*FirmwareErase)(nil), "FirmwareErase") + proto.RegisterType((*FirmwareRequest)(nil), "FirmwareRequest") + proto.RegisterType((*FirmwareUpload)(nil), "FirmwareUpload") + proto.RegisterType((*TransactionSign)(nil), "TransactionSign") + proto.RegisterType((*SignTx)(nil), "SignTx") + proto.RegisterType((*TxRequest)(nil), "TxRequest") + proto.RegisterType((*TxRequest_TxRequestDetailsType)(nil), "TxRequest.TxRequestDetailsType") + proto.RegisterType((*TxRequest_TxRequestSignResponseType)(nil), "TxRequest.TxRequestSignResponseType") + proto.RegisterType((*TxAck)(nil), "TxAck") + proto.RegisterType((*TxAck_TransactionType)(nil), "TxAck.TransactionType") + proto.RegisterType((*TxAck_TransactionType_TxInputType)(nil), "TxAck.TransactionType.TxInputType") + proto.RegisterType((*TxAck_TransactionType_TxOutputType)(nil), "TxAck.TransactionType.TxOutputType") + proto.RegisterEnum("MessageType", MessageType_name, MessageType_value) + proto.RegisterEnum("TxRequest_RequestType", TxRequest_RequestType_name, TxRequest_RequestType_value) +} +func (m *Initialize) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Initialize) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.State != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *GetFeatures) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetFeatures) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Features) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Features) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Vendor != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Vendor))) + i += copy(dAtA[i:], *m.Vendor) + } + if m.MajorVersion != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.MajorVersion)) + } + if m.MinorVersion != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.MinorVersion)) + } + if m.PatchVersion != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.PatchVersion)) + } + if m.BootloaderMode != nil { + dAtA[i] = 0x28 + i++ + if *m.BootloaderMode { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.DeviceId != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.DeviceId))) + i += copy(dAtA[i:], *m.DeviceId) + } + if m.PinProtection != nil { + dAtA[i] = 0x38 + i++ + if *m.PinProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.PassphraseProtection != nil { + dAtA[i] = 0x40 + i++ + if *m.PassphraseProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Language != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Language))) + i += copy(dAtA[i:], *m.Language) + } + if m.Label != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Label))) + i += copy(dAtA[i:], *m.Label) + } + if m.Initialized != nil { + dAtA[i] = 0x60 + i++ + if *m.Initialized { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.BootloaderHash != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.BootloaderHash))) + i += copy(dAtA[i:], m.BootloaderHash) + } + if m.PinCached != nil { + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x1 + i++ + if *m.PinCached { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.PassphraseCached != nil { + dAtA[i] = 0x88 + i++ + dAtA[i] = 0x1 + i++ + if *m.PassphraseCached { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.FirmwarePresent != nil { + dAtA[i] = 0x90 + i++ + dAtA[i] = 0x1 + i++ + if *m.FirmwarePresent { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.NeedsBackup != nil { + dAtA[i] = 0x98 + i++ + dAtA[i] = 0x1 + i++ + if *m.NeedsBackup { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Model != nil { + dAtA[i] = 0xaa + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Model))) + i += copy(dAtA[i:], *m.Model) + } + if m.FwMajor != nil { + dAtA[i] = 0xb0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.FwMajor)) + } + if m.FwMinor != nil { + dAtA[i] = 0xb8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.FwMinor)) + } + if m.FwPatch != nil { + dAtA[i] = 0xc0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.FwPatch)) + } + if m.FwVersionHead != nil { + dAtA[i] = 0xca + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.FwVersionHead))) + i += copy(dAtA[i:], *m.FwVersionHead) + } + if m.FwVendor != nil { + dAtA[i] = 0xd2 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.FwVendor))) + i += copy(dAtA[i:], *m.FwVendor) + } + if m.FwVendorKeys != nil { + dAtA[i] = 0xda + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.FwVendorKeys))) + i += copy(dAtA[i:], m.FwVendorKeys) + } + if m.UnfinishedBackup != nil { + dAtA[i] = 0xe0 + i++ + dAtA[i] = 0x1 + i++ + if *m.UnfinishedBackup { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.FirmwareFeatures != nil { + dAtA[i] = 0xe8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.FirmwareFeatures)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ApplySettings) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplySettings) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Language != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Language))) + i += copy(dAtA[i:], *m.Language) + } + if m.Label != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Label))) + i += copy(dAtA[i:], *m.Label) + } + if m.UsePassphrase != nil { + dAtA[i] = 0x18 + i++ + if *m.UsePassphrase { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Homescreen != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.Homescreen))) + i += copy(dAtA[i:], m.Homescreen) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *GenerateMnemonic) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenerateMnemonic) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.PassphraseProtection != nil { + dAtA[i] = 0x8 + i++ + if *m.PassphraseProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.WordCount != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.WordCount)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SetMnemonic) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SetMnemonic) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Mnemonic == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("mnemonic") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Mnemonic))) + i += copy(dAtA[i:], *m.Mnemonic) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ChangePin) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangePin) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Remove != nil { + dAtA[i] = 0x8 + i++ + if *m.Remove { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SkycoinAddress) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SkycoinAddress) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.AddressN == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("address_n") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.AddressN)) + } + if m.StartIndex != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.StartIndex)) + } + if m.ConfirmAddress != nil { + dAtA[i] = 0x18 + i++ + if *m.ConfirmAddress { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Bip44Addr != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMessages(dAtA, i, uint64(m.Bip44Addr.Size())) + n1, err := m.Bip44Addr.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ResponseSkycoinAddress) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseSkycoinAddress) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ResponseTransactionSign) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseTransactionSign) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Signatures) > 0 { + for _, s := range m.Signatures { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if m.Padding == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("padding") + } else { + dAtA[i] = 0x10 + i++ + if *m.Padding { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SkycoinCheckMessageSignature) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SkycoinCheckMessageSignature) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Address == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("address") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Address))) + i += copy(dAtA[i:], *m.Address) + } + if m.Message == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("message") + } else { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Message))) + i += copy(dAtA[i:], *m.Message) + } + if m.Signature == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("signature") + } else { + dAtA[i] = 0x1a + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Signature))) + i += copy(dAtA[i:], *m.Signature) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SkycoinSignMessage) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SkycoinSignMessage) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.AddressN == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("address_n") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.AddressN)) + } + if m.Message == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("message") + } else { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Message))) + i += copy(dAtA[i:], *m.Message) + } + if m.Bip44Addr != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMessages(dAtA, i, uint64(m.Bip44Addr.Size())) + n2, err := m.Bip44Addr.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ResponseSkycoinSignMessage) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseSkycoinSignMessage) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.SignedMessage == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("signed_message") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.SignedMessage))) + i += copy(dAtA[i:], *m.SignedMessage) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Ping) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Ping) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Message != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Message))) + i += copy(dAtA[i:], *m.Message) + } + if m.ButtonProtection != nil { + dAtA[i] = 0x10 + i++ + if *m.ButtonProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.PinProtection != nil { + dAtA[i] = 0x18 + i++ + if *m.PinProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.PassphraseProtection != nil { + dAtA[i] = 0x20 + i++ + if *m.PassphraseProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Success) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Success) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.MsgType != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.MsgType)) + } + if m.Message != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Message))) + i += copy(dAtA[i:], *m.Message) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Failure) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Failure) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.MsgType != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.MsgType)) + } + if m.Code != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Code)) + } + if m.Message != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Message))) + i += copy(dAtA[i:], *m.Message) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ButtonRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ButtonRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Code != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Code)) + } + if m.Data != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Data))) + i += copy(dAtA[i:], *m.Data) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ButtonAck) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ButtonAck) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PinMatrixRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PinMatrixRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Type)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PinMatrixAck) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PinMatrixAck) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Pin == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("pin") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Pin))) + i += copy(dAtA[i:], *m.Pin) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Cancel) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Cancel) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PassphraseRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PassphraseRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.OnDevice != nil { + dAtA[i] = 0x8 + i++ + if *m.OnDevice { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PassphraseAck) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PassphraseAck) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Passphrase != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Passphrase))) + i += copy(dAtA[i:], *m.Passphrase) + } + if m.State != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PassphraseStateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PassphraseStateRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.State != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PassphraseStateAck) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PassphraseStateAck) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *GetRawEntropy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetRawEntropy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Size_ == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("size") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Size_)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *GetMixedEntropy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetMixedEntropy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Size_ == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("size") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Size_)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Entropy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Entropy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Entropy == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("entropy") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.Entropy))) + i += copy(dAtA[i:], m.Entropy) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *WipeDevice) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WipeDevice) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *LoadDevice) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LoadDevice) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Mnemonic != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Mnemonic))) + i += copy(dAtA[i:], *m.Mnemonic) + } + if m.Node != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(m.Node.Size())) + n3, err := m.Node.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if m.Pin != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Pin))) + i += copy(dAtA[i:], *m.Pin) + } + if m.PassphraseProtection != nil { + dAtA[i] = 0x20 + i++ + if *m.PassphraseProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Language != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Language))) + i += copy(dAtA[i:], *m.Language) + } + if m.Label != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Label))) + i += copy(dAtA[i:], *m.Label) + } + if m.SkipChecksum != nil { + dAtA[i] = 0x38 + i++ + if *m.SkipChecksum { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.U2FCounter != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.U2FCounter)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *ResetDevice) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResetDevice) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.DisplayRandom != nil { + dAtA[i] = 0x8 + i++ + if *m.DisplayRandom { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Strength != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Strength)) + } + if m.PassphraseProtection != nil { + dAtA[i] = 0x18 + i++ + if *m.PassphraseProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.PinProtection != nil { + dAtA[i] = 0x20 + i++ + if *m.PinProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Language != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Language))) + i += copy(dAtA[i:], *m.Language) + } + if m.Label != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Label))) + i += copy(dAtA[i:], *m.Label) + } + if m.U2FCounter != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.U2FCounter)) + } + if m.SkipBackup != nil { + dAtA[i] = 0x40 + i++ + if *m.SkipBackup { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *BackupDevice) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BackupDevice) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *EntropyRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EntropyRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *EntropyAck) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EntropyAck) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Entropy != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.Entropy))) + i += copy(dAtA[i:], m.Entropy) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *RecoveryDevice) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RecoveryDevice) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.WordCount != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.WordCount)) + } + if m.PassphraseProtection != nil { + dAtA[i] = 0x10 + i++ + if *m.PassphraseProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.PinProtection != nil { + dAtA[i] = 0x18 + i++ + if *m.PinProtection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Language != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Language))) + i += copy(dAtA[i:], *m.Language) + } + if m.Label != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Label))) + i += copy(dAtA[i:], *m.Label) + } + if m.DryRun != nil { + dAtA[i] = 0x30 + i++ + if *m.DryRun { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *WordRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WordRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Type)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *WordAck) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WordAck) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Word == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("word") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Word))) + i += copy(dAtA[i:], *m.Word) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *FirmwareErase) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FirmwareErase) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Length != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Length)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *FirmwareRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FirmwareRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Offset != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Offset)) + } + if m.Length != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Length)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *FirmwareUpload) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FirmwareUpload) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Payload != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.Payload))) + i += copy(dAtA[i:], m.Payload) + } + if m.Hash != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(m.Hash))) + i += copy(dAtA[i:], m.Hash) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TransactionSign) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TransactionSign) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.NbIn == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("nbIn") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.NbIn)) + } + if len(m.TransactionIn) > 0 { + for _, msg := range m.TransactionIn { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.NbOut == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("nbOut") + } else { + dAtA[i] = 0x18 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.NbOut)) + } + if len(m.TransactionOut) > 0 { + for _, msg := range m.TransactionOut { + dAtA[i] = 0x22 + i++ + i = encodeVarintMessages(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SignTx) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SignTx) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.OutputsCount == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("outputs_count") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.OutputsCount)) + } + if m.InputsCount == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("inputs_count") + } else { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.InputsCount)) + } + if m.CoinName != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.CoinName))) + i += copy(dAtA[i:], *m.CoinName) + } + if m.Version != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Version)) + } + if m.LockTime != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.LockTime)) + } + if m.TxHash != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.TxHash))) + i += copy(dAtA[i:], *m.TxHash) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.RequestType == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("request_type") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.RequestType)) + } + if m.Details != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(m.Details.Size())) + n4, err := m.Details.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if len(m.SignResult) > 0 { + for _, msg := range m.SignResult { + dAtA[i] = 0x1a + i++ + i = encodeVarintMessages(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxRequest_TxRequestDetailsType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxRequest_TxRequestDetailsType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.RequestIndex != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.RequestIndex)) + } + if m.TxHash != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.TxHash))) + i += copy(dAtA[i:], *m.TxHash) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxRequest_TxRequestSignResponseType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxRequest_TxRequestSignResponseType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.SignatureIndex != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.SignatureIndex)) + } + if m.Signature != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Signature))) + i += copy(dAtA[i:], *m.Signature) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxAck) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxAck) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Tx != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(m.Tx.Size())) + n5, err := m.Tx.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxAck_TransactionType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxAck_TransactionType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Version != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Version)) + } + if len(m.Inputs) > 0 { + for _, msg := range m.Inputs { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.LockTime != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.LockTime)) + } + if len(m.Outputs) > 0 { + for _, msg := range m.Outputs { + dAtA[i] = 0x2a + i++ + i = encodeVarintMessages(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.InputsCnt != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.InputsCnt)) + } + if m.OutputsCnt != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.OutputsCnt)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxAck_TransactionType_TxInputType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxAck_TransactionType_TxInputType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.AddressN) > 0 { + for _, num := range m.AddressN { + dAtA[i] = 0x8 + i++ + i = encodeVarintMessages(dAtA, i, uint64(num)) + } + } + if m.HashIn == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("hashIn") + } else { + dAtA[i] = 0x12 + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.HashIn))) + i += copy(dAtA[i:], *m.HashIn) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxAck_TransactionType_TxOutputType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxAck_TransactionType_TxOutputType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Address == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("address") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintMessages(dAtA, i, uint64(len(*m.Address))) + i += copy(dAtA[i:], *m.Address) + } + if len(m.AddressN) > 0 { + for _, num := range m.AddressN { + dAtA[i] = 0x10 + i++ + i = encodeVarintMessages(dAtA, i, uint64(num)) + } + } + if m.Coins == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("coins") + } else { + dAtA[i] = 0x18 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Coins)) + } + if m.Hours == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("hours") + } else { + dAtA[i] = 0x20 + i++ + i = encodeVarintMessages(dAtA, i, uint64(*m.Hours)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func encodeVarintMessages(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Initialize) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.State != nil { + l = len(m.State) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetFeatures) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Features) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Vendor != nil { + l = len(*m.Vendor) + n += 1 + l + sovMessages(uint64(l)) + } + if m.MajorVersion != nil { + n += 1 + sovMessages(uint64(*m.MajorVersion)) + } + if m.MinorVersion != nil { + n += 1 + sovMessages(uint64(*m.MinorVersion)) + } + if m.PatchVersion != nil { + n += 1 + sovMessages(uint64(*m.PatchVersion)) + } + if m.BootloaderMode != nil { + n += 2 + } + if m.DeviceId != nil { + l = len(*m.DeviceId) + n += 1 + l + sovMessages(uint64(l)) + } + if m.PinProtection != nil { + n += 2 + } + if m.PassphraseProtection != nil { + n += 2 + } + if m.Language != nil { + l = len(*m.Language) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Label != nil { + l = len(*m.Label) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Initialized != nil { + n += 2 + } + if m.BootloaderHash != nil { + l = len(m.BootloaderHash) + n += 1 + l + sovMessages(uint64(l)) + } + if m.PinCached != nil { + n += 3 + } + if m.PassphraseCached != nil { + n += 3 + } + if m.FirmwarePresent != nil { + n += 3 + } + if m.NeedsBackup != nil { + n += 3 + } + if m.Model != nil { + l = len(*m.Model) + n += 2 + l + sovMessages(uint64(l)) + } + if m.FwMajor != nil { + n += 2 + sovMessages(uint64(*m.FwMajor)) + } + if m.FwMinor != nil { + n += 2 + sovMessages(uint64(*m.FwMinor)) + } + if m.FwPatch != nil { + n += 2 + sovMessages(uint64(*m.FwPatch)) + } + if m.FwVersionHead != nil { + l = len(*m.FwVersionHead) + n += 2 + l + sovMessages(uint64(l)) + } + if m.FwVendor != nil { + l = len(*m.FwVendor) + n += 2 + l + sovMessages(uint64(l)) + } + if m.FwVendorKeys != nil { + l = len(m.FwVendorKeys) + n += 2 + l + sovMessages(uint64(l)) + } + if m.UnfinishedBackup != nil { + n += 3 + } + if m.FirmwareFeatures != nil { + n += 2 + sovMessages(uint64(*m.FirmwareFeatures)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ApplySettings) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Language != nil { + l = len(*m.Language) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Label != nil { + l = len(*m.Label) + n += 1 + l + sovMessages(uint64(l)) + } + if m.UsePassphrase != nil { + n += 2 + } + if m.Homescreen != nil { + l = len(m.Homescreen) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GenerateMnemonic) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PassphraseProtection != nil { + n += 2 + } + if m.WordCount != nil { + n += 1 + sovMessages(uint64(*m.WordCount)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetMnemonic) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Mnemonic != nil { + l = len(*m.Mnemonic) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ChangePin) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Remove != nil { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SkycoinAddress) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AddressN != nil { + n += 1 + sovMessages(uint64(*m.AddressN)) + } + if m.StartIndex != nil { + n += 1 + sovMessages(uint64(*m.StartIndex)) + } + if m.ConfirmAddress != nil { + n += 2 + } + if m.Bip44Addr != nil { + l = m.Bip44Addr.Size() + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ResponseSkycoinAddress) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Addresses) > 0 { + for _, s := range m.Addresses { + l = len(s) + n += 1 + l + sovMessages(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ResponseTransactionSign) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Signatures) > 0 { + for _, s := range m.Signatures { + l = len(s) + n += 1 + l + sovMessages(uint64(l)) + } + } + if m.Padding != nil { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SkycoinCheckMessageSignature) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Address != nil { + l = len(*m.Address) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Signature != nil { + l = len(*m.Signature) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SkycoinSignMessage) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AddressN != nil { + n += 1 + sovMessages(uint64(*m.AddressN)) + } + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Bip44Addr != nil { + l = m.Bip44Addr.Size() + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ResponseSkycoinSignMessage) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SignedMessage != nil { + l = len(*m.SignedMessage) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Ping) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + sovMessages(uint64(l)) + } + if m.ButtonProtection != nil { + n += 2 + } + if m.PinProtection != nil { + n += 2 + } + if m.PassphraseProtection != nil { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Success) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MsgType != nil { + n += 1 + sovMessages(uint64(*m.MsgType)) + } + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Failure) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MsgType != nil { + n += 1 + sovMessages(uint64(*m.MsgType)) + } + if m.Code != nil { + n += 1 + sovMessages(uint64(*m.Code)) + } + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ButtonRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != nil { + n += 1 + sovMessages(uint64(*m.Code)) + } + if m.Data != nil { + l = len(*m.Data) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ButtonAck) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PinMatrixRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != nil { + n += 1 + sovMessages(uint64(*m.Type)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PinMatrixAck) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pin != nil { + l = len(*m.Pin) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Cancel) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PassphraseRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.OnDevice != nil { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PassphraseAck) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Passphrase != nil { + l = len(*m.Passphrase) + n += 1 + l + sovMessages(uint64(l)) + } + if m.State != nil { + l = len(m.State) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PassphraseStateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.State != nil { + l = len(m.State) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PassphraseStateAck) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetRawEntropy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Size_ != nil { + n += 1 + sovMessages(uint64(*m.Size_)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetMixedEntropy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Size_ != nil { + n += 1 + sovMessages(uint64(*m.Size_)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Entropy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Entropy != nil { + l = len(m.Entropy) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *WipeDevice) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *LoadDevice) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Mnemonic != nil { + l = len(*m.Mnemonic) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Node != nil { + l = m.Node.Size() + n += 1 + l + sovMessages(uint64(l)) + } + if m.Pin != nil { + l = len(*m.Pin) + n += 1 + l + sovMessages(uint64(l)) + } + if m.PassphraseProtection != nil { + n += 2 + } + if m.Language != nil { + l = len(*m.Language) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Label != nil { + l = len(*m.Label) + n += 1 + l + sovMessages(uint64(l)) + } + if m.SkipChecksum != nil { + n += 2 + } + if m.U2FCounter != nil { + n += 1 + sovMessages(uint64(*m.U2FCounter)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ResetDevice) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DisplayRandom != nil { + n += 2 + } + if m.Strength != nil { + n += 1 + sovMessages(uint64(*m.Strength)) + } + if m.PassphraseProtection != nil { + n += 2 + } + if m.PinProtection != nil { + n += 2 + } + if m.Language != nil { + l = len(*m.Language) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Label != nil { + l = len(*m.Label) + n += 1 + l + sovMessages(uint64(l)) + } + if m.U2FCounter != nil { + n += 1 + sovMessages(uint64(*m.U2FCounter)) + } + if m.SkipBackup != nil { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *BackupDevice) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EntropyRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EntropyAck) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Entropy != nil { + l = len(m.Entropy) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RecoveryDevice) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.WordCount != nil { + n += 1 + sovMessages(uint64(*m.WordCount)) + } + if m.PassphraseProtection != nil { + n += 2 + } + if m.PinProtection != nil { + n += 2 + } + if m.Language != nil { + l = len(*m.Language) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Label != nil { + l = len(*m.Label) + n += 1 + l + sovMessages(uint64(l)) + } + if m.DryRun != nil { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *WordRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != nil { + n += 1 + sovMessages(uint64(*m.Type)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *WordAck) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Word != nil { + l = len(*m.Word) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *FirmwareErase) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Length != nil { + n += 1 + sovMessages(uint64(*m.Length)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *FirmwareRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Offset != nil { + n += 1 + sovMessages(uint64(*m.Offset)) + } + if m.Length != nil { + n += 1 + sovMessages(uint64(*m.Length)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *FirmwareUpload) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Payload != nil { + l = len(m.Payload) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Hash != nil { + l = len(m.Hash) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TransactionSign) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NbIn != nil { + n += 1 + sovMessages(uint64(*m.NbIn)) + } + if len(m.TransactionIn) > 0 { + for _, e := range m.TransactionIn { + l = e.Size() + n += 1 + l + sovMessages(uint64(l)) + } + } + if m.NbOut != nil { + n += 1 + sovMessages(uint64(*m.NbOut)) + } + if len(m.TransactionOut) > 0 { + for _, e := range m.TransactionOut { + l = e.Size() + n += 1 + l + sovMessages(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SignTx) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.OutputsCount != nil { + n += 1 + sovMessages(uint64(*m.OutputsCount)) + } + if m.InputsCount != nil { + n += 1 + sovMessages(uint64(*m.InputsCount)) + } + if m.CoinName != nil { + l = len(*m.CoinName) + n += 1 + l + sovMessages(uint64(l)) + } + if m.Version != nil { + n += 1 + sovMessages(uint64(*m.Version)) + } + if m.LockTime != nil { + n += 1 + sovMessages(uint64(*m.LockTime)) + } + if m.TxHash != nil { + l = len(*m.TxHash) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.RequestType != nil { + n += 1 + sovMessages(uint64(*m.RequestType)) + } + if m.Details != nil { + l = m.Details.Size() + n += 1 + l + sovMessages(uint64(l)) + } + if len(m.SignResult) > 0 { + for _, e := range m.SignResult { + l = e.Size() + n += 1 + l + sovMessages(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxRequest_TxRequestDetailsType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.RequestIndex != nil { + n += 1 + sovMessages(uint64(*m.RequestIndex)) + } + if m.TxHash != nil { + l = len(*m.TxHash) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxRequest_TxRequestSignResponseType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SignatureIndex != nil { + n += 1 + sovMessages(uint64(*m.SignatureIndex)) + } + if m.Signature != nil { + l = len(*m.Signature) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxAck) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Tx != nil { + l = m.Tx.Size() + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxAck_TransactionType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Version != nil { + n += 1 + sovMessages(uint64(*m.Version)) + } + if len(m.Inputs) > 0 { + for _, e := range m.Inputs { + l = e.Size() + n += 1 + l + sovMessages(uint64(l)) + } + } + if m.LockTime != nil { + n += 1 + sovMessages(uint64(*m.LockTime)) + } + if len(m.Outputs) > 0 { + for _, e := range m.Outputs { + l = e.Size() + n += 1 + l + sovMessages(uint64(l)) + } + } + if m.InputsCnt != nil { + n += 1 + sovMessages(uint64(*m.InputsCnt)) + } + if m.OutputsCnt != nil { + n += 1 + sovMessages(uint64(*m.OutputsCnt)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxAck_TransactionType_TxInputType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AddressN) > 0 { + for _, e := range m.AddressN { + n += 1 + sovMessages(uint64(e)) + } + } + if m.HashIn != nil { + l = len(*m.HashIn) + n += 1 + l + sovMessages(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxAck_TransactionType_TxOutputType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Address != nil { + l = len(*m.Address) + n += 1 + l + sovMessages(uint64(l)) + } + if len(m.AddressN) > 0 { + for _, e := range m.AddressN { + n += 1 + sovMessages(uint64(e)) + } + } + if m.Coins != nil { + n += 1 + sovMessages(uint64(*m.Coins)) + } + if m.Hours != nil { + n += 1 + sovMessages(uint64(*m.Hours)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovMessages(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozMessages(x uint64) (n int) { + return sovMessages(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Initialize) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Initialize: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Initialize: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = append(m.State[:0], dAtA[iNdEx:postIndex]...) + if m.State == nil { + m.State = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetFeatures) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetFeatures: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetFeatures: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Features) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Features: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Features: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vendor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Vendor = &s + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MajorVersion", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MajorVersion = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinorVersion", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MinorVersion = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PatchVersion", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PatchVersion = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BootloaderMode", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.BootloaderMode = &b + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.DeviceId = &s + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PinProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PinProtection = &b + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PassphraseProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PassphraseProtection = &b + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Language", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Language = &s + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Label", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Label = &s + iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Initialized", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Initialized = &b + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BootloaderHash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BootloaderHash = append(m.BootloaderHash[:0], dAtA[iNdEx:postIndex]...) + if m.BootloaderHash == nil { + m.BootloaderHash = []byte{} + } + iNdEx = postIndex + case 16: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PinCached", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PinCached = &b + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PassphraseCached", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PassphraseCached = &b + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FirmwarePresent", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.FirmwarePresent = &b + case 19: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NeedsBackup", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.NeedsBackup = &b + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Model", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Model = &s + iNdEx = postIndex + case 22: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FwMajor", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.FwMajor = &v + case 23: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FwMinor", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.FwMinor = &v + case 24: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FwPatch", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.FwPatch = &v + case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FwVersionHead", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.FwVersionHead = &s + iNdEx = postIndex + case 26: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FwVendor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.FwVendor = &s + iNdEx = postIndex + case 27: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FwVendorKeys", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FwVendorKeys = append(m.FwVendorKeys[:0], dAtA[iNdEx:postIndex]...) + if m.FwVendorKeys == nil { + m.FwVendorKeys = []byte{} + } + iNdEx = postIndex + case 28: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnfinishedBackup", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.UnfinishedBackup = &b + case 29: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FirmwareFeatures", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.FirmwareFeatures = &v + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplySettings) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplySettings: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplySettings: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Language", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Language = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Label", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Label = &s + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UsePassphrase", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.UsePassphrase = &b + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Homescreen", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Homescreen = append(m.Homescreen[:0], dAtA[iNdEx:postIndex]...) + if m.Homescreen == nil { + m.Homescreen = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GenerateMnemonic) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GenerateMnemonic: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenerateMnemonic: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PassphraseProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PassphraseProtection = &b + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field WordCount", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.WordCount = &v + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetMnemonic) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SetMnemonic: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetMnemonic: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Mnemonic", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Mnemonic = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("mnemonic") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangePin) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangePin: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangePin: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Remove", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Remove = &b + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SkycoinAddress) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SkycoinAddress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SkycoinAddress: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AddressN", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartIndex", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.StartIndex = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfirmAddress", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.ConfirmAddress = &b + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bip44Addr", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Bip44Addr == nil { + m.Bip44Addr = &Bip44AddrIndex{} + } + if err := m.Bip44Addr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("address_n") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseSkycoinAddress) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseSkycoinAddress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseSkycoinAddress: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addresses = append(m.Addresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseTransactionSign) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseTransactionSign: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseTransactionSign: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signatures = append(m.Signatures, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Padding", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Padding = &b + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("padding") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SkycoinCheckMessageSignature) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SkycoinCheckMessageSignature: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SkycoinCheckMessageSignature: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Address = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Signature = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000004) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("address") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("message") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("signature") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SkycoinSignMessage) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SkycoinSignMessage: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SkycoinSignMessage: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AddressN", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bip44Addr", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Bip44Addr == nil { + m.Bip44Addr = &Bip44AddrIndex{} + } + if err := m.Bip44Addr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("address_n") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("message") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResponseSkycoinSignMessage) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseSkycoinSignMessage: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseSkycoinSignMessage: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignedMessage", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.SignedMessage = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("signed_message") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ping) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Ping: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ping: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ButtonProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.ButtonProtection = &b + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PinProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PinProtection = &b + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PassphraseProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PassphraseProtection = &b + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Success) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Success: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Success: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MsgType", wireType) + } + var v MessageType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (MessageType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MsgType = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Failure) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Failure: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Failure: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MsgType", wireType) + } + var v MessageType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (MessageType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MsgType = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + var v FailureType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (FailureType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Code = &v + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ButtonRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ButtonRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ButtonRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + var v ButtonRequestType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (ButtonRequestType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Code = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Data = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ButtonAck) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ButtonAck: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ButtonAck: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PinMatrixRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PinMatrixRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PinMatrixRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var v PinMatrixRequestType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (PinMatrixRequestType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Type = &v + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PinMatrixAck) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PinMatrixAck: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PinMatrixAck: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pin", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Pin = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("pin") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Cancel) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Cancel: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Cancel: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PassphraseRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PassphraseRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PassphraseRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OnDevice", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.OnDevice = &b + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PassphraseAck) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PassphraseAck: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PassphraseAck: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Passphrase", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Passphrase = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = append(m.State[:0], dAtA[iNdEx:postIndex]...) + if m.State == nil { + m.State = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PassphraseStateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PassphraseStateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PassphraseStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = append(m.State[:0], dAtA[iNdEx:postIndex]...) + if m.State == nil { + m.State = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PassphraseStateAck) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PassphraseStateAck: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PassphraseStateAck: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetRawEntropy) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetRawEntropy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetRawEntropy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Size_", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Size_ = &v + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("size") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetMixedEntropy) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetMixedEntropy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetMixedEntropy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Size_", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Size_ = &v + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("size") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Entropy) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Entropy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Entropy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entropy", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Entropy = append(m.Entropy[:0], dAtA[iNdEx:postIndex]...) + if m.Entropy == nil { + m.Entropy = []byte{} + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("entropy") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WipeDevice) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WipeDevice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WipeDevice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LoadDevice) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LoadDevice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LoadDevice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Mnemonic", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Mnemonic = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Node", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Node == nil { + m.Node = &HDNodeType{} + } + if err := m.Node.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pin", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Pin = &s + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PassphraseProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PassphraseProtection = &b + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Language", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Language = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Label", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Label = &s + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SkipChecksum", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.SkipChecksum = &b + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field U2FCounter", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.U2FCounter = &v + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResetDevice) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResetDevice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResetDevice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisplayRandom", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.DisplayRandom = &b + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Strength", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Strength = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PassphraseProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PassphraseProtection = &b + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PinProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PinProtection = &b + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Language", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Language = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Label", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Label = &s + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field U2FCounter", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.U2FCounter = &v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SkipBackup", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.SkipBackup = &b + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BackupDevice) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BackupDevice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BackupDevice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EntropyRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EntropyRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EntropyRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EntropyAck) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EntropyAck: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EntropyAck: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entropy", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Entropy = append(m.Entropy[:0], dAtA[iNdEx:postIndex]...) + if m.Entropy == nil { + m.Entropy = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RecoveryDevice) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RecoveryDevice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RecoveryDevice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field WordCount", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.WordCount = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PassphraseProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PassphraseProtection = &b + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PinProtection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PinProtection = &b + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Language", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Language = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Label", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Label = &s + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.DryRun = &b + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WordRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WordRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WordRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var v WordRequestType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (WordRequestType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Type = &v + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WordAck) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WordAck: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WordAck: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Word", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Word = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("word") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FirmwareErase) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FirmwareErase: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FirmwareErase: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Length", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Length = &v + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FirmwareRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FirmwareRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FirmwareRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Offset", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Offset = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Length", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Length = &v + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FirmwareUpload) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FirmwareUpload: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FirmwareUpload: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) + if m.Payload == nil { + m.Payload = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TransactionSign) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TransactionSign: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TransactionSign: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NbIn", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NbIn = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TransactionIn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TransactionIn = append(m.TransactionIn, &SkycoinTransactionInput{}) + if err := m.TransactionIn[len(m.TransactionIn)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NbOut", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NbOut = &v + hasFields[0] |= uint64(0x00000002) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TransactionOut", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TransactionOut = append(m.TransactionOut, &SkycoinTransactionOutput{}) + if err := m.TransactionOut[len(m.TransactionOut)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("nbIn") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("nbOut") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SignTx) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SignTx: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SignTx: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutputsCount", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutputsCount = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InputsCount", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InputsCount = &v + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CoinName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.CoinName = &s + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Version = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LockTime", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LockTime = &v + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TxHash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.TxHash = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("outputs_count") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("inputs_count") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestType", wireType) + } + var v TxRequest_RequestType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (TxRequest_RequestType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RequestType = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Details", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Details == nil { + m.Details = &TxRequest_TxRequestDetailsType{} + } + if err := m.Details.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignResult", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SignResult = append(m.SignResult, &TxRequest_TxRequestSignResponseType{}) + if err := m.SignResult[len(m.SignResult)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("request_type") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxRequest_TxRequestDetailsType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxRequestDetailsType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxRequestDetailsType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestIndex", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RequestIndex = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TxHash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.TxHash = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxRequest_TxRequestSignResponseType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxRequestSignResponseType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxRequestSignResponseType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SignatureIndex", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.SignatureIndex = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Signature = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxAck) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxAck: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxAck: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tx", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Tx == nil { + m.Tx = &TxAck_TransactionType{} + } + if err := m.Tx.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxAck_TransactionType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TransactionType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TransactionType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Version = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Inputs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Inputs = append(m.Inputs, &TxAck_TransactionType_TxInputType{}) + if err := m.Inputs[len(m.Inputs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LockTime", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LockTime = &v + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Outputs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Outputs = append(m.Outputs, &TxAck_TransactionType_TxOutputType{}) + if err := m.Outputs[len(m.Outputs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InputsCnt", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InputsCnt = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutputsCnt", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutputsCnt = &v + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxAck_TransactionType_TxInputType) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxInputType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxInputType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.AddressN) == 0 { + m.AddressN = make([]uint32, 0, elementCount) + } + for iNdEx < postIndex { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field AddressN", wireType) + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HashIn", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.HashIn = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("hashIn") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxAck_TransactionType_TxOutputType) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxOutputType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxOutputType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Address = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType == 0 { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.AddressN) == 0 { + m.AddressN = make([]uint32, 0, elementCount) + } + for iNdEx < postIndex { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field AddressN", wireType) + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Coins", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Coins = &v + hasFields[0] |= uint64(0x00000002) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hours", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Hours = &v + hasFields[0] |= uint64(0x00000004) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("address") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("coins") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("hours") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipMessages(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMessages + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMessages + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMessages + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthMessages + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMessages + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipMessages(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthMessages = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowMessages = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("messages.proto", fileDescriptor_messages_9ca50c8b3bdd214d) } + +var fileDescriptor_messages_9ca50c8b3bdd214d = []byte{ + // 2587 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x4b, 0x73, 0xe3, 0xc6, + 0x11, 0x36, 0x48, 0x8a, 0x8f, 0xe6, 0x43, 0x23, 0x58, 0xab, 0xc5, 0x72, 0x57, 0x5a, 0x19, 0x5a, + 0x69, 0xb5, 0x7e, 0x30, 0x8e, 0xec, 0x38, 0x65, 0x55, 0xd9, 0x55, 0x94, 0x56, 0xbb, 0xab, 0xb2, + 0x25, 0xab, 0x20, 0x6e, 0xac, 0x9c, 0x58, 0x10, 0x31, 0x24, 0x11, 0x91, 0x03, 0x1a, 0x00, 0x25, + 0xd1, 0xce, 0xe3, 0x9a, 0x63, 0x72, 0xcb, 0x3f, 0x48, 0xe5, 0x92, 0xca, 0x25, 0x55, 0xa9, 0x1c, + 0x72, 0xf6, 0x31, 0x95, 0x5b, 0x4e, 0x49, 0xf9, 0x9c, 0x73, 0xce, 0xa9, 0x9e, 0x19, 0x80, 0x03, + 0x18, 0xd2, 0xc6, 0xc9, 0x89, 0xd3, 0xdd, 0xdf, 0x74, 0xf7, 0xf4, 0x74, 0xcf, 0xf4, 0x80, 0xd0, + 0x18, 0xd3, 0x20, 0xb0, 0x07, 0x34, 0x68, 0x4d, 0x7c, 0x2f, 0xf4, 0x9a, 0xd5, 0x70, 0x36, 0x89, + 0x08, 0xd3, 0x04, 0x38, 0x64, 0x6e, 0xe8, 0xda, 0x23, 0xf7, 0x4b, 0xaa, 0x2f, 0xc3, 0x42, 0x10, + 0xda, 0x21, 0x35, 0xb4, 0x75, 0x6d, 0xbb, 0x66, 0x09, 0xc2, 0xac, 0x43, 0xf5, 0x39, 0x0d, 0x9f, + 0x51, 0x3b, 0x9c, 0xfa, 0x34, 0x30, 0xff, 0x5d, 0x84, 0x72, 0x44, 0xe8, 0x2b, 0x50, 0xbc, 0xa4, + 0xcc, 0xf1, 0x7c, 0x3e, 0xa5, 0x62, 0x49, 0x4a, 0xdf, 0x80, 0xfa, 0xd8, 0xfe, 0x89, 0xe7, 0x77, + 0x2f, 0xa9, 0x1f, 0xb8, 0x1e, 0x33, 0x72, 0xeb, 0xda, 0x76, 0xdd, 0xaa, 0x71, 0xe6, 0x8f, 0x04, + 0x8f, 0x83, 0x5c, 0xa6, 0x80, 0xf2, 0x12, 0x84, 0x4c, 0x05, 0x34, 0xb1, 0xc3, 0xde, 0x30, 0x06, + 0x15, 0x04, 0x88, 0x33, 0x23, 0xd0, 0x63, 0x58, 0x3c, 0xf7, 0xbc, 0x70, 0xe4, 0xd9, 0x0e, 0xf5, + 0xbb, 0x63, 0xcf, 0xa1, 0xc6, 0xc2, 0xba, 0xb6, 0x5d, 0xb6, 0x1a, 0x73, 0xf6, 0x91, 0xe7, 0x50, + 0xfd, 0x3e, 0x54, 0x1c, 0x7a, 0xe9, 0xf6, 0x68, 0xd7, 0x75, 0x8c, 0x22, 0x77, 0xb9, 0x2c, 0x18, + 0x87, 0x8e, 0xbe, 0x09, 0x8d, 0x89, 0xcb, 0xba, 0x18, 0x19, 0xda, 0x0b, 0xd1, 0x56, 0x89, 0x2b, + 0xa9, 0x4f, 0x5c, 0x76, 0x12, 0x33, 0xf5, 0xf7, 0xe0, 0xce, 0xc4, 0x0e, 0x82, 0xc9, 0xd0, 0xb7, + 0x03, 0xaa, 0xa2, 0xcb, 0x1c, 0xbd, 0x3c, 0x17, 0x2a, 0x93, 0x9a, 0x50, 0x1e, 0xd9, 0x6c, 0x30, + 0xb5, 0x07, 0xd4, 0xa8, 0x08, 0xbb, 0x11, 0x8d, 0x61, 0x1f, 0xd9, 0xe7, 0x74, 0x64, 0x00, 0x17, + 0x08, 0x42, 0x5f, 0x87, 0xaa, 0x1b, 0x6f, 0x8d, 0x63, 0xd4, 0xb8, 0x72, 0x95, 0x95, 0x5a, 0xf5, + 0xd0, 0x0e, 0x86, 0x46, 0x83, 0x6f, 0x9c, 0xb2, 0xea, 0x17, 0x76, 0x30, 0xd4, 0x57, 0x01, 0x70, + 0x61, 0x3d, 0xbb, 0x37, 0xa4, 0x8e, 0x41, 0xb8, 0xa6, 0xca, 0xc4, 0x65, 0xfb, 0x9c, 0xa1, 0xbf, + 0x05, 0x4b, 0xca, 0x82, 0x24, 0x6a, 0x89, 0xa3, 0xc8, 0x5c, 0x20, 0xc1, 0x4f, 0x80, 0xf4, 0x5d, + 0x7f, 0x7c, 0x65, 0xfb, 0xb8, 0x76, 0x1a, 0x50, 0x16, 0x1a, 0x3a, 0xc7, 0x2e, 0x46, 0xfc, 0x13, + 0xc1, 0xd6, 0xdf, 0x80, 0x1a, 0xa3, 0xd4, 0x09, 0xba, 0xe7, 0x76, 0xef, 0x62, 0x3a, 0x31, 0x5e, + 0x17, 0x4b, 0xe0, 0xbc, 0x3d, 0xce, 0xc2, 0xa5, 0xe3, 0x6e, 0x8d, 0x8c, 0x3b, 0x62, 0xe9, 0x9c, + 0xd0, 0xef, 0x41, 0xb9, 0x7f, 0xd5, 0xe5, 0xb9, 0x62, 0xac, 0xf0, 0xed, 0x2e, 0xf5, 0xaf, 0x8e, + 0x90, 0x8c, 0x44, 0x98, 0x21, 0xc6, 0xdd, 0x58, 0x84, 0xa4, 0x14, 0xf1, 0xbc, 0x30, 0x8c, 0x48, + 0x74, 0x82, 0xa4, 0xbe, 0x05, 0x8b, 0xfd, 0xab, 0x28, 0x83, 0xba, 0x43, 0x6a, 0x3b, 0xc6, 0x3d, + 0x6e, 0xb0, 0xde, 0xbf, 0x92, 0x39, 0xf4, 0x82, 0xda, 0x0e, 0xa6, 0x07, 0xc7, 0xf1, 0x8c, 0x6e, + 0x8a, 0x6d, 0x42, 0x04, 0xcf, 0xe9, 0x47, 0xd0, 0x88, 0x85, 0xdd, 0x0b, 0x3a, 0x0b, 0x8c, 0xfb, + 0x3c, 0xda, 0xb5, 0x08, 0xf1, 0x09, 0x9d, 0x05, 0x18, 0xcc, 0x29, 0xeb, 0xbb, 0xcc, 0x0d, 0x86, + 0xd4, 0x89, 0x56, 0xfe, 0x40, 0x04, 0x73, 0x2e, 0x90, 0xcb, 0x7f, 0x0b, 0x96, 0xe2, 0x60, 0xf6, + 0x65, 0x4d, 0x19, 0xab, 0xdc, 0xf7, 0x38, 0xca, 0x71, 0xe1, 0xfd, 0x52, 0x83, 0x7a, 0x7b, 0x32, + 0x19, 0xcd, 0x4e, 0x69, 0x18, 0xba, 0x6c, 0x10, 0x24, 0x92, 0x4a, 0xbb, 0x29, 0xa9, 0x72, 0x6a, + 0x52, 0x6d, 0x42, 0x63, 0x8a, 0x49, 0x1b, 0xef, 0x2a, 0xaf, 0xb9, 0xb2, 0x55, 0x9f, 0x06, 0xf4, + 0x24, 0x66, 0xea, 0x6b, 0x00, 0x43, 0x6f, 0x4c, 0x83, 0x9e, 0x4f, 0xa9, 0xa8, 0xb8, 0x9a, 0xa5, + 0x70, 0xcc, 0x3e, 0x90, 0xe7, 0x94, 0x51, 0xdf, 0x0e, 0xe9, 0x11, 0xa3, 0x63, 0x8f, 0xb9, 0xbd, + 0x9b, 0xcb, 0x42, 0xbb, 0xa5, 0x2c, 0x56, 0x01, 0xae, 0x3c, 0xdf, 0xe9, 0xf6, 0xbc, 0x29, 0x0b, + 0xe5, 0x21, 0x51, 0x41, 0xce, 0x3e, 0x32, 0xcc, 0x27, 0x50, 0x3d, 0xa5, 0x61, 0x6c, 0xa2, 0x09, + 0xe5, 0xb1, 0x1c, 0x1b, 0xda, 0x7a, 0x0e, 0xd7, 0x1b, 0xd1, 0xe6, 0x06, 0x54, 0xf6, 0x87, 0x36, + 0x1b, 0xd0, 0x13, 0x97, 0xe1, 0xb1, 0xe4, 0xd3, 0xb1, 0x77, 0x49, 0xa5, 0x71, 0x49, 0x99, 0xbf, + 0xd5, 0xa0, 0x71, 0x7a, 0x31, 0xeb, 0x79, 0x2e, 0x6b, 0x3b, 0x8e, 0x4f, 0x83, 0x00, 0xb7, 0xdc, + 0x16, 0xc3, 0x2e, 0xe3, 0x4a, 0xeb, 0x56, 0x59, 0x32, 0x8e, 0xf5, 0x87, 0x50, 0x0d, 0x42, 0xdb, + 0x0f, 0xbb, 0x2e, 0x73, 0xe8, 0xb5, 0xf4, 0x0f, 0x38, 0xeb, 0x10, 0x39, 0x58, 0x82, 0x3d, 0x8f, + 0xe1, 0x56, 0x75, 0xe5, 0x24, 0x19, 0xd0, 0x86, 0x64, 0x47, 0x66, 0x5a, 0x00, 0xe7, 0xee, 0xe4, + 0xfd, 0xf7, 0x39, 0x8c, 0x47, 0xb4, 0xba, 0xb3, 0xd8, 0xda, 0x43, 0x16, 0x42, 0xb8, 0x36, 0xab, + 0x72, 0x1e, 0xd1, 0xe6, 0x07, 0xb0, 0x62, 0xd1, 0x60, 0xe2, 0xb1, 0x80, 0xa6, 0x1c, 0x7e, 0x10, + 0x3b, 0x4c, 0x03, 0x43, 0x5b, 0xcf, 0x6f, 0x57, 0xac, 0x39, 0xc3, 0x3c, 0x85, 0xbb, 0xd1, 0xbc, + 0x8e, 0x6f, 0xb3, 0xc0, 0xe6, 0x71, 0x3e, 0x75, 0x07, 0x0c, 0x37, 0x35, 0x70, 0x07, 0x4c, 0x66, + 0x99, 0x98, 0xa9, 0x70, 0x74, 0x03, 0x4a, 0x13, 0xdb, 0x71, 0x5c, 0x36, 0x30, 0x72, 0xeb, 0xb9, + 0xed, 0xb2, 0x15, 0x91, 0xe6, 0x04, 0x1e, 0x48, 0x27, 0xf6, 0x87, 0xb4, 0x77, 0x71, 0x24, 0x2e, + 0x94, 0xd3, 0x68, 0x2a, 0xce, 0x8c, 0x56, 0x2f, 0xb6, 0x25, 0x22, 0x51, 0x22, 0xaf, 0x1f, 0xae, + 0xb3, 0x62, 0x45, 0x24, 0x2e, 0x23, 0xb6, 0x6d, 0xe4, 0xb9, 0x6c, 0xce, 0x30, 0xbf, 0x02, 0x5d, + 0x5a, 0x44, 0x2b, 0xd2, 0xe0, 0xed, 0x7b, 0x75, 0xb3, 0xa9, 0x64, 0xec, 0xf3, 0xaf, 0x8c, 0xfd, + 0x3e, 0x34, 0x53, 0xb1, 0x57, 0x9d, 0xd8, 0x84, 0x06, 0xfa, 0x49, 0x9d, 0x6e, 0x64, 0x4e, 0xac, + 0xb9, 0x2e, 0xb8, 0x12, 0x66, 0xfe, 0x4e, 0x83, 0xc2, 0x89, 0xcb, 0x06, 0xaa, 0x5f, 0xa2, 0x46, + 0x63, 0xbf, 0xde, 0x82, 0xa5, 0xf3, 0x69, 0x18, 0x7a, 0x89, 0x2b, 0x27, 0x27, 0x8e, 0x0a, 0x21, + 0x50, 0x2a, 0xe5, 0xdb, 0x97, 0x53, 0xfe, 0x3b, 0x5d, 0x4e, 0x85, 0x9b, 0xab, 0xd0, 0xfc, 0x14, + 0x4a, 0xa7, 0xd3, 0x5e, 0x0f, 0x37, 0xec, 0x31, 0x94, 0xc7, 0xc1, 0xa0, 0x8b, 0x3d, 0x02, 0x77, + 0xb7, 0xb1, 0x53, 0x6b, 0xc9, 0x25, 0x75, 0x66, 0x13, 0x6a, 0x95, 0xc6, 0xc1, 0x00, 0x07, 0xc9, + 0x70, 0xab, 0xcb, 0x32, 0x19, 0x94, 0x9e, 0xd9, 0xee, 0x08, 0x13, 0xe3, 0xbf, 0xd6, 0xb6, 0x0e, + 0x85, 0x1e, 0xde, 0xda, 0x39, 0x09, 0x92, 0x0a, 0x38, 0x88, 0x4b, 0x54, 0x7b, 0xf9, 0xa4, 0xbd, + 0x4f, 0xa0, 0xbe, 0xc7, 0xa3, 0x65, 0xd1, 0x2f, 0xa6, 0x34, 0x08, 0xf5, 0x2d, 0xa9, 0x4c, 0x58, + 0xd4, 0x5b, 0x09, 0xa9, 0xa2, 0x52, 0x87, 0x82, 0x63, 0x87, 0xb6, 0xf4, 0x9f, 0x8f, 0xcd, 0x2a, + 0x54, 0x04, 0xbc, 0xdd, 0xbb, 0x30, 0x3f, 0x02, 0x72, 0xe2, 0xb2, 0x23, 0x3b, 0xf4, 0xdd, 0xeb, + 0x48, 0xf9, 0x13, 0x28, 0x28, 0xcb, 0xb9, 0xd3, 0x4a, 0x03, 0x84, 0x7e, 0x84, 0x98, 0xeb, 0x50, + 0x8b, 0xa5, 0xed, 0xde, 0x85, 0x4e, 0x20, 0x3f, 0x71, 0x99, 0x4c, 0x17, 0x1c, 0x9a, 0x65, 0x28, + 0xee, 0xdb, 0xac, 0x47, 0x47, 0xe6, 0xbb, 0xb0, 0x34, 0x3f, 0x7f, 0x23, 0x5b, 0xf7, 0xa1, 0xe2, + 0xb1, 0xae, 0xe8, 0x4f, 0xe4, 0x49, 0x56, 0xf6, 0xd8, 0x53, 0x4e, 0x9b, 0x07, 0x50, 0x9f, 0xcf, + 0x40, 0xf5, 0x6b, 0x00, 0xca, 0xb9, 0x2e, 0x72, 0x4d, 0xe1, 0xcc, 0xbb, 0xbb, 0x9c, 0xda, 0xdd, + 0xb5, 0x60, 0x65, 0xae, 0xe6, 0x14, 0x59, 0x91, 0xf5, 0xec, 0x6e, 0x70, 0x19, 0xf4, 0x14, 0x1e, + 0x23, 0xb5, 0x01, 0xf5, 0xe7, 0x34, 0xb4, 0xec, 0xab, 0x03, 0x16, 0xfa, 0xde, 0x64, 0x86, 0xb1, + 0x0d, 0xdc, 0x2f, 0xa9, 0xac, 0x52, 0x3e, 0x36, 0x37, 0x61, 0xf1, 0x39, 0x0d, 0x8f, 0xdc, 0x6b, + 0xea, 0xdc, 0x06, 0xdb, 0x80, 0x52, 0x24, 0x36, 0xa0, 0x44, 0xc5, 0x90, 0x23, 0x6a, 0x56, 0x44, + 0x9a, 0x35, 0x80, 0xcf, 0xdd, 0x09, 0x95, 0xb1, 0xf8, 0x75, 0x0e, 0xe0, 0x53, 0xcf, 0x76, 0x04, + 0x99, 0xba, 0x27, 0x34, 0xf5, 0x9e, 0xd0, 0x1f, 0x42, 0x81, 0x45, 0x99, 0x56, 0xdd, 0xa9, 0xb6, + 0x5e, 0x3c, 0x3d, 0xf6, 0x1c, 0x99, 0x68, 0x28, 0x88, 0x76, 0x49, 0x24, 0x19, 0x0e, 0xff, 0xa7, + 0x9a, 0xd2, 0x37, 0x94, 0xbb, 0x19, 0x7b, 0xd1, 0xca, 0x6e, 0x89, 0xb2, 0xc1, 0xc8, 0x0d, 0x86, + 0x59, 0x97, 0x74, 0x51, 0xbd, 0xa4, 0x37, 0xa0, 0x1e, 0x5c, 0xb8, 0x93, 0x6e, 0x0f, 0x0f, 0xdb, + 0x60, 0x3a, 0x96, 0x6d, 0x68, 0x0d, 0x99, 0xfb, 0x92, 0x87, 0x57, 0xd3, 0x74, 0xa7, 0x2f, 0x2e, + 0x4e, 0xea, 0xf3, 0xde, 0xb3, 0x6e, 0xc1, 0x74, 0xa7, 0xbf, 0x2f, 0x38, 0xe6, 0xef, 0x73, 0x50, + 0xb5, 0x68, 0x40, 0x43, 0x19, 0x94, 0x4d, 0x68, 0x38, 0x6e, 0x30, 0x19, 0xd9, 0xb3, 0xae, 0x6f, + 0x33, 0xc7, 0x1b, 0xcb, 0x8c, 0xaa, 0x4b, 0xae, 0xc5, 0x99, 0xfa, 0x43, 0x28, 0x07, 0xa1, 0x4f, + 0xd9, 0x20, 0x1c, 0x8a, 0xfb, 0x6e, 0x37, 0xbf, 0xf3, 0x83, 0x0f, 0xac, 0x98, 0x79, 0x73, 0x34, + 0xf2, 0xb7, 0x44, 0xe3, 0xdb, 0xa7, 0x57, 0x21, 0xeb, 0xf4, 0xfa, 0x3f, 0x82, 0x96, 0x8a, 0x47, + 0x29, 0x1d, 0x0f, 0x7e, 0x97, 0x63, 0x54, 0x65, 0x4b, 0x26, 0x9a, 0x75, 0x40, 0x96, 0x68, 0xc6, + 0xcc, 0x06, 0xd4, 0xc4, 0x48, 0x26, 0x15, 0x81, 0x86, 0xcc, 0x43, 0x59, 0x11, 0xe6, 0x16, 0x80, + 0xe4, 0x60, 0xbd, 0x25, 0x92, 0x53, 0x53, 0x93, 0xf3, 0x1f, 0x1a, 0x34, 0x2c, 0xda, 0xf3, 0x2e, + 0xa9, 0x3f, 0x93, 0xd1, 0x4f, 0x36, 0x3a, 0x5a, 0xaa, 0xd1, 0xb9, 0x39, 0xa8, 0xb9, 0xef, 0x14, + 0xd4, 0xfc, 0xab, 0x82, 0x5a, 0x78, 0x65, 0x50, 0x17, 0xd4, 0xa0, 0xde, 0x85, 0x92, 0xe3, 0xcf, + 0xba, 0xfe, 0x94, 0xf1, 0x60, 0x97, 0xad, 0xa2, 0xe3, 0xcf, 0xac, 0x29, 0x33, 0xdf, 0x83, 0xea, + 0xe7, 0x9e, 0xef, 0x44, 0x47, 0xc5, 0xa3, 0xc4, 0xa1, 0x48, 0x5a, 0x8a, 0x4c, 0x39, 0x0f, 0x57, + 0xa1, 0x84, 0x02, 0x8c, 0x9d, 0x0e, 0x05, 0x5c, 0xbc, 0x3c, 0x0b, 0xf9, 0xd8, 0x7c, 0x0c, 0xf5, + 0x67, 0xb2, 0xe7, 0x3d, 0xe0, 0x07, 0xd6, 0x0a, 0x14, 0x47, 0x22, 0x11, 0x45, 0xbc, 0x24, 0x65, + 0xb6, 0x61, 0x31, 0x02, 0x46, 0x0e, 0xac, 0x40, 0xd1, 0xeb, 0xf7, 0x03, 0x1a, 0x85, 0x56, 0x52, + 0x8a, 0x8a, 0x5c, 0x42, 0xc5, 0xc7, 0xd0, 0x88, 0x54, 0xbc, 0x9c, 0xe0, 0x4b, 0x49, 0x74, 0x3f, + 0x33, 0x1c, 0x46, 0xbb, 0x29, 0x49, 0xf4, 0x95, 0xbf, 0xad, 0xc4, 0xb1, 0xc9, 0xc7, 0xe6, 0x5f, + 0x34, 0x58, 0x4c, 0xf7, 0x57, 0x3a, 0x14, 0xd8, 0xf9, 0x61, 0xd4, 0x98, 0xf0, 0xb1, 0xfe, 0x31, + 0xd4, 0xc3, 0x39, 0xec, 0x10, 0xf7, 0x33, 0xbf, 0x5d, 0xdd, 0x31, 0x5a, 0xb2, 0xb1, 0xe8, 0xa8, + 0xc2, 0xc9, 0x34, 0xb4, 0x92, 0x70, 0xdc, 0x16, 0x76, 0xfe, 0xd9, 0x34, 0xe4, 0x1d, 0x52, 0xdd, + 0x12, 0x84, 0xde, 0x86, 0x86, 0x02, 0x43, 0x71, 0x81, 0xab, 0xbd, 0x97, 0xa1, 0xf6, 0xb3, 0x69, + 0x88, 0x7a, 0x53, 0x13, 0xcc, 0xaf, 0x35, 0x28, 0xa2, 0xd7, 0x9d, 0x6b, 0x3c, 0x6e, 0x3c, 0x0e, + 0x0a, 0xe2, 0xec, 0x44, 0x5b, 0x35, 0xc9, 0x14, 0x09, 0xfa, 0x06, 0xd4, 0x5c, 0xa6, 0x60, 0x72, + 0x1c, 0x53, 0x15, 0x3c, 0x01, 0x59, 0x87, 0x0a, 0xda, 0xee, 0x32, 0x7b, 0x2c, 0xef, 0xe8, 0xdd, + 0xfc, 0xe9, 0x27, 0x3f, 0xb6, 0xca, 0xc8, 0x3d, 0xb6, 0xc7, 0xd8, 0xbf, 0x95, 0x12, 0xaf, 0xf8, + 0x5d, 0xed, 0xfb, 0x56, 0xc4, 0xd1, 0xd7, 0xa0, 0x32, 0xf2, 0x7a, 0x17, 0xdd, 0xd0, 0x1d, 0x8b, + 0xe2, 0xaf, 0xef, 0x6a, 0xef, 0x5a, 0x65, 0xe4, 0x75, 0xdc, 0x31, 0xc5, 0x5c, 0x0c, 0xaf, 0xc5, + 0x2b, 0x57, 0x14, 0x7e, 0x31, 0xbc, 0xc6, 0xd7, 0xad, 0xf9, 0xf7, 0x3c, 0x54, 0x3a, 0xf1, 0xfd, + 0xfc, 0x21, 0xd4, 0x7c, 0x31, 0x8c, 0xda, 0x8e, 0xdc, 0x76, 0x63, 0x67, 0xa5, 0x15, 0x23, 0x5a, + 0x6a, 0x62, 0x56, 0xfd, 0x39, 0xa1, 0x7f, 0x08, 0x25, 0x87, 0x86, 0xb6, 0x3b, 0x0a, 0xe4, 0xed, + 0xf0, 0x50, 0x99, 0x15, 0x8f, 0x9e, 0x0a, 0x88, 0xe8, 0x5f, 0x24, 0x5e, 0x3f, 0x80, 0x2a, 0xb6, + 0x7f, 0x5d, 0x9f, 0x06, 0xd3, 0x11, 0xee, 0x16, 0x6e, 0xc7, 0xa3, 0xac, 0xe9, 0x18, 0xf4, 0xb8, + 0x43, 0x47, 0x1d, 0xbc, 0x05, 0xb7, 0xf8, 0xbc, 0x66, 0x07, 0x96, 0xb3, 0xec, 0xe0, 0x16, 0x45, + 0x8b, 0x12, 0x2f, 0x11, 0x91, 0xe5, 0xd1, 0x4a, 0xc5, 0x5b, 0x44, 0x09, 0x50, 0x4e, 0x0d, 0x50, + 0xf3, 0x1c, 0xee, 0xdd, 0x68, 0x1e, 0x5f, 0x30, 0x71, 0xdb, 0x9d, 0x50, 0xde, 0x88, 0xd9, 0x42, + 0x7d, 0xa2, 0x61, 0x17, 0x06, 0x94, 0x86, 0xfd, 0x25, 0x5e, 0x36, 0xf3, 0x50, 0x56, 0xa1, 0xd4, + 0x39, 0x3b, 0x3c, 0x3e, 0x79, 0xd9, 0x21, 0xaf, 0xe9, 0x35, 0x28, 0x77, 0xce, 0x3e, 0x7b, 0xd9, + 0x41, 0x4a, 0xd3, 0x01, 0x8a, 0x9d, 0xb3, 0xa3, 0x83, 0x4e, 0x9b, 0xe4, 0xf4, 0x06, 0x40, 0xe7, + 0xec, 0xd9, 0xe1, 0xf1, 0xe1, 0xe9, 0x8b, 0x83, 0xa7, 0x24, 0xaf, 0x2f, 0x42, 0xb5, 0x73, 0x76, + 0x70, 0xd6, 0xb1, 0xda, 0x4f, 0xdb, 0x9d, 0x36, 0x29, 0x98, 0xff, 0xca, 0xc3, 0x42, 0x87, 0x37, + 0x4f, 0x5b, 0x90, 0x0b, 0x85, 0x6b, 0x55, 0xbe, 0x9b, 0xed, 0xde, 0x45, 0x4b, 0x49, 0x73, 0x1e, + 0xca, 0x5c, 0x78, 0xdd, 0xfc, 0x73, 0x3e, 0x51, 0x99, 0x51, 0xaf, 0x1a, 0xe5, 0x9d, 0x58, 0x5b, + 0x9c, 0x74, 0xbb, 0x50, 0x14, 0x29, 0x2c, 0x0b, 0xd3, 0xcc, 0xd6, 0xdc, 0xea, 0x5c, 0xf3, 0xf2, + 0xe4, 0x56, 0xe4, 0x0c, 0xec, 0xce, 0xe6, 0x09, 0x2b, 0xbe, 0x4a, 0xcd, 0xb3, 0xf5, 0x23, 0x28, + 0xc9, 0xfa, 0x31, 0x16, 0xb8, 0xe6, 0x8d, 0x1b, 0x35, 0x8b, 0x0a, 0x15, 0xf9, 0x24, 0xe7, 0xe0, + 0x75, 0x11, 0x95, 0x1b, 0x0b, 0x79, 0xbe, 0xd7, 0xad, 0x8a, 0x2c, 0x36, 0x16, 0xe2, 0x5d, 0x16, + 0x97, 0x2c, 0x0b, 0xa3, 0xcb, 0x2e, 0x2a, 0x58, 0x16, 0x36, 0xf7, 0xa0, 0xaa, 0xb8, 0x9c, 0x7e, + 0x38, 0xe5, 0x13, 0x0f, 0xa7, 0x15, 0x28, 0x62, 0xd2, 0xf0, 0xc3, 0x09, 0x4f, 0x63, 0x49, 0x35, + 0xbf, 0x80, 0x9a, 0xea, 0xdc, 0x2d, 0xaf, 0xbc, 0x84, 0xfa, 0x5c, 0x4a, 0xfd, 0x32, 0x2c, 0xe0, + 0x01, 0x10, 0xf0, 0x23, 0xac, 0x60, 0x09, 0x02, 0xb9, 0x43, 0x6f, 0xea, 0x07, 0x46, 0x41, 0x70, + 0x39, 0xf1, 0xe6, 0xdf, 0x6a, 0x50, 0x55, 0xde, 0x07, 0xfa, 0x3a, 0xac, 0x28, 0x64, 0x77, 0xfe, + 0xa9, 0x92, 0xbc, 0xd6, 0x2c, 0xfc, 0xea, 0x8f, 0x86, 0xa6, 0x37, 0x81, 0xa8, 0x08, 0x7c, 0x71, + 0x11, 0x4d, 0xca, 0x56, 0xe1, 0x75, 0x55, 0x26, 0x9f, 0x38, 0x24, 0xd7, 0x2c, 0xfc, 0x26, 0x43, + 0x2c, 0x9f, 0x1c, 0x24, 0x2f, 0xc5, 0x0f, 0xe1, 0x8e, 0x2a, 0x8e, 0x3f, 0x2e, 0x90, 0x82, 0x54, + 0x9f, 0x72, 0x6e, 0xde, 0x8e, 0x92, 0x05, 0x89, 0x78, 0x0c, 0xf7, 0x12, 0x16, 0xd4, 0xdb, 0x8d, + 0x14, 0x9b, 0x65, 0x04, 0xfd, 0x09, 0x81, 0xdb, 0xd0, 0xcc, 0x02, 0x8a, 0xab, 0x89, 0x94, 0x14, + 0xe4, 0x46, 0x52, 0x65, 0xa2, 0xe9, 0x26, 0x95, 0xec, 0x85, 0x47, 0x62, 0x90, 0x2b, 0x4b, 0x39, + 0x3e, 0x6f, 0x9c, 0x49, 0x5d, 0x2a, 0x78, 0x03, 0xee, 0xaa, 0x08, 0xa5, 0x8d, 0x24, 0x0d, 0x09, + 0x59, 0x83, 0xe5, 0x84, 0xcb, 0xf2, 0x2b, 0x15, 0x59, 0x92, 0x46, 0xb6, 0xe0, 0x41, 0x6a, 0x63, + 0x12, 0xcf, 0x24, 0xa2, 0xc7, 0x38, 0x23, 0x13, 0xd7, 0xee, 0x5d, 0x90, 0xd7, 0xc5, 0xc2, 0xff, + 0x80, 0xb8, 0x07, 0xa0, 0x27, 0xb6, 0x83, 0x3f, 0x9b, 0xc8, 0xb2, 0xf4, 0x26, 0x15, 0x96, 0xc4, + 0x67, 0x32, 0x72, 0x2f, 0x1b, 0x94, 0x78, 0x16, 0x92, 0xa6, 0xf4, 0x67, 0x23, 0xb9, 0xed, 0xf1, + 0x63, 0x90, 0xdc, 0x57, 0x9c, 0x31, 0x93, 0x4e, 0xab, 0x6d, 0x23, 0x31, 0xa5, 0xb5, 0x47, 0xc9, + 0x3d, 0x4d, 0xb6, 0x92, 0x64, 0x23, 0x7b, 0x2f, 0xe6, 0xed, 0x25, 0x79, 0x14, 0x27, 0xd1, 0x6a, + 0x22, 0x40, 0xe9, 0x57, 0x22, 0x79, 0x22, 0x55, 0xa5, 0xb2, 0x2d, 0xf1, 0x38, 0x24, 0x6f, 0x2a, + 0xde, 0xa7, 0x3c, 0x4b, 0x76, 0xaa, 0xe4, 0x9d, 0xec, 0x1c, 0x50, 0x5a, 0x3a, 0xd2, 0xca, 0xae, + 0x20, 0xd9, 0xdc, 0x91, 0xef, 0x65, 0x6b, 0x50, 0xfe, 0x44, 0x20, 0x3f, 0x94, 0x90, 0xb7, 0xc1, + 0xcc, 0xf6, 0x59, 0x7d, 0x89, 0x92, 0x23, 0x69, 0xef, 0x6d, 0x58, 0xbb, 0x05, 0x8d, 0xa6, 0x8f, + 0x95, 0x65, 0xa6, 0xcc, 0x2b, 0x1f, 0x12, 0xc9, 0x17, 0xd9, 0x7b, 0x94, 0xfc, 0xd2, 0x46, 0x7c, + 0x89, 0xda, 0x81, 0xed, 0x0c, 0x54, 0xe6, 0xa7, 0x30, 0x12, 0xc8, 0x39, 0xdb, 0x49, 0x57, 0xbf, + 0xfd, 0x1d, 0x89, 0x84, 0xd9, 0x21, 0xc8, 0xfe, 0xea, 0x47, 0xa6, 0x32, 0x04, 0xef, 0xc2, 0xd6, + 0x2d, 0x68, 0x55, 0xff, 0x65, 0x76, 0x21, 0xa6, 0xbf, 0xdb, 0x92, 0x2b, 0xe9, 0xc7, 0x26, 0xdc, + 0x57, 0x71, 0xa9, 0xee, 0x96, 0x7c, 0x29, 0x61, 0xef, 0xc0, 0x46, 0x96, 0x03, 0x69, 0xf8, 0x57, + 0xd2, 0x7a, 0x4a, 0x6b, 0xea, 0xfd, 0x4f, 0x7e, 0x2a, 0xb5, 0xa6, 0xaa, 0x5b, 0x74, 0xa6, 0xe4, + 0x67, 0x52, 0x9a, 0x3a, 0x8a, 0xe3, 0x66, 0x86, 0xfc, 0x5c, 0x5a, 0xb9, 0x0f, 0x4b, 0x49, 0x00, + 0xe6, 0xc2, 0x2f, 0xc4, 0xec, 0xbd, 0x8f, 0xbf, 0xfe, 0x66, 0x4d, 0xfb, 0xeb, 0x37, 0x6b, 0xda, + 0x3f, 0xbf, 0x59, 0xd3, 0x60, 0x8d, 0xd1, 0xb0, 0x15, 0x88, 0x70, 0xe1, 0xef, 0x95, 0x3d, 0x1a, + 0xd1, 0x50, 0xfc, 0x1d, 0x76, 0x3e, 0xed, 0xef, 0x91, 0xd3, 0x88, 0x27, 0x35, 0xfe, 0x27, 0x00, + 0x00, 0xff, 0xff, 0x65, 0xa9, 0x52, 0x89, 0x41, 0x1b, 0x00, 0x00, +} diff --git a/vendor/github.com/fibercrypto/skywallet-protob/go/types.pb.go b/vendor/github.com/fibercrypto/skywallet-protob/go/types.pb.go new file mode 100644 index 00000000..28adc919 --- /dev/null +++ b/vendor/github.com/fibercrypto/skywallet-protob/go/types.pb.go @@ -0,0 +1,6213 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: types.proto + +package messages + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" +import protobuf "github.com/fibercrypto/skywallet-protob/go/google/protobuf" + +import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +// * +// Type of failures returned by Failure message +// @used_in Failure +type FailureType int32 + +const ( + FailureType_Failure_UnexpectedMessage FailureType = 1 + FailureType_Failure_ButtonExpected FailureType = 2 + FailureType_Failure_DataError FailureType = 3 + FailureType_Failure_ActionCancelled FailureType = 4 + FailureType_Failure_PinExpected FailureType = 5 + FailureType_Failure_PinCancelled FailureType = 6 + FailureType_Failure_PinInvalid FailureType = 7 + FailureType_Failure_InvalidSignature FailureType = 8 + FailureType_Failure_ProcessError FailureType = 9 + FailureType_Failure_NotEnoughFunds FailureType = 10 + FailureType_Failure_NotInitialized FailureType = 11 + FailureType_Failure_PinMismatch FailureType = 12 + FailureType_Failure_AddressGeneration FailureType = 13 + FailureType_Failure_FirmwarePanic FailureType = 14 + FailureType_Failure_FirmwareError FailureType = 99 +) + +var FailureType_name = map[int32]string{ + 1: "Failure_UnexpectedMessage", + 2: "Failure_ButtonExpected", + 3: "Failure_DataError", + 4: "Failure_ActionCancelled", + 5: "Failure_PinExpected", + 6: "Failure_PinCancelled", + 7: "Failure_PinInvalid", + 8: "Failure_InvalidSignature", + 9: "Failure_ProcessError", + 10: "Failure_NotEnoughFunds", + 11: "Failure_NotInitialized", + 12: "Failure_PinMismatch", + 13: "Failure_AddressGeneration", + 14: "Failure_FirmwarePanic", + 99: "Failure_FirmwareError", +} +var FailureType_value = map[string]int32{ + "Failure_UnexpectedMessage": 1, + "Failure_ButtonExpected": 2, + "Failure_DataError": 3, + "Failure_ActionCancelled": 4, + "Failure_PinExpected": 5, + "Failure_PinCancelled": 6, + "Failure_PinInvalid": 7, + "Failure_InvalidSignature": 8, + "Failure_ProcessError": 9, + "Failure_NotEnoughFunds": 10, + "Failure_NotInitialized": 11, + "Failure_PinMismatch": 12, + "Failure_AddressGeneration": 13, + "Failure_FirmwarePanic": 14, + "Failure_FirmwareError": 99, +} + +func (x FailureType) Enum() *FailureType { + p := new(FailureType) + *p = x + return p +} +func (x FailureType) String() string { + return proto.EnumName(FailureType_name, int32(x)) +} +func (x *FailureType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FailureType_value, data, "FailureType") + if err != nil { + return err + } + *x = FailureType(value) + return nil +} +func (FailureType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{0} +} + +// * +// Type of script which will be used for transaction output +// @used_in TxOutputType +type OutputScriptType int32 + +const ( + OutputScriptType_PAYTOADDRESS OutputScriptType = 0 + OutputScriptType_PAYTOSCRIPTHASH OutputScriptType = 1 + OutputScriptType_PAYTOMULTISIG OutputScriptType = 2 + OutputScriptType_PAYTOOPRETURN OutputScriptType = 3 + OutputScriptType_PAYTOWITNESS OutputScriptType = 4 + OutputScriptType_PAYTOP2SHWITNESS OutputScriptType = 5 +) + +var OutputScriptType_name = map[int32]string{ + 0: "PAYTOADDRESS", + 1: "PAYTOSCRIPTHASH", + 2: "PAYTOMULTISIG", + 3: "PAYTOOPRETURN", + 4: "PAYTOWITNESS", + 5: "PAYTOP2SHWITNESS", +} +var OutputScriptType_value = map[string]int32{ + "PAYTOADDRESS": 0, + "PAYTOSCRIPTHASH": 1, + "PAYTOMULTISIG": 2, + "PAYTOOPRETURN": 3, + "PAYTOWITNESS": 4, + "PAYTOP2SHWITNESS": 5, +} + +func (x OutputScriptType) Enum() *OutputScriptType { + p := new(OutputScriptType) + *p = x + return p +} +func (x OutputScriptType) String() string { + return proto.EnumName(OutputScriptType_name, int32(x)) +} +func (x *OutputScriptType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(OutputScriptType_value, data, "OutputScriptType") + if err != nil { + return err + } + *x = OutputScriptType(value) + return nil +} +func (OutputScriptType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{1} +} + +// * +// Type of script which will be used for transaction output +// @used_in TxInputType +type InputScriptType int32 + +const ( + InputScriptType_SPENDADDRESS InputScriptType = 0 + InputScriptType_SPENDMULTISIG InputScriptType = 1 + InputScriptType_EXTERNAL InputScriptType = 2 + InputScriptType_SPENDWITNESS InputScriptType = 3 + InputScriptType_SPENDP2SHWITNESS InputScriptType = 4 +) + +var InputScriptType_name = map[int32]string{ + 0: "SPENDADDRESS", + 1: "SPENDMULTISIG", + 2: "EXTERNAL", + 3: "SPENDWITNESS", + 4: "SPENDP2SHWITNESS", +} +var InputScriptType_value = map[string]int32{ + "SPENDADDRESS": 0, + "SPENDMULTISIG": 1, + "EXTERNAL": 2, + "SPENDWITNESS": 3, + "SPENDP2SHWITNESS": 4, +} + +func (x InputScriptType) Enum() *InputScriptType { + p := new(InputScriptType) + *p = x + return p +} +func (x InputScriptType) String() string { + return proto.EnumName(InputScriptType_name, int32(x)) +} +func (x *InputScriptType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(InputScriptType_value, data, "InputScriptType") + if err != nil { + return err + } + *x = InputScriptType(value) + return nil +} +func (InputScriptType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{2} +} + +// * +// Type of information required by transaction signing process +// @used_in TxRequest +type RequestType int32 + +const ( + RequestType_TXINPUT RequestType = 0 + RequestType_TXOUTPUT RequestType = 1 + RequestType_TXMETA RequestType = 2 + RequestType_TXFINISHED RequestType = 3 + RequestType_TXEXTRADATA RequestType = 4 +) + +var RequestType_name = map[int32]string{ + 0: "TXINPUT", + 1: "TXOUTPUT", + 2: "TXMETA", + 3: "TXFINISHED", + 4: "TXEXTRADATA", +} +var RequestType_value = map[string]int32{ + "TXINPUT": 0, + "TXOUTPUT": 1, + "TXMETA": 2, + "TXFINISHED": 3, + "TXEXTRADATA": 4, +} + +func (x RequestType) Enum() *RequestType { + p := new(RequestType) + *p = x + return p +} +func (x RequestType) String() string { + return proto.EnumName(RequestType_name, int32(x)) +} +func (x *RequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RequestType_value, data, "RequestType") + if err != nil { + return err + } + *x = RequestType(value) + return nil +} +func (RequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{3} +} + +// * +// Type of button request +// @used_in ButtonRequest +type ButtonRequestType int32 + +const ( + ButtonRequestType_ButtonRequest_Other ButtonRequestType = 1 + ButtonRequestType_ButtonRequest_FeeOverThreshold ButtonRequestType = 2 + ButtonRequestType_ButtonRequest_ConfirmOutput ButtonRequestType = 3 + ButtonRequestType_ButtonRequest_ResetDevice ButtonRequestType = 4 + ButtonRequestType_ButtonRequest_ConfirmWord ButtonRequestType = 5 + ButtonRequestType_ButtonRequest_WipeDevice ButtonRequestType = 6 + ButtonRequestType_ButtonRequest_ProtectCall ButtonRequestType = 7 + ButtonRequestType_ButtonRequest_SignTx ButtonRequestType = 8 + ButtonRequestType_ButtonRequest_FirmwareCheck ButtonRequestType = 9 + ButtonRequestType_ButtonRequest_Address ButtonRequestType = 10 + ButtonRequestType_ButtonRequest_PublicKey ButtonRequestType = 11 + ButtonRequestType_ButtonRequest_MnemonicWordCount ButtonRequestType = 12 + ButtonRequestType_ButtonRequest_MnemonicInput ButtonRequestType = 13 + ButtonRequestType_ButtonRequest_PassphraseType ButtonRequestType = 14 +) + +var ButtonRequestType_name = map[int32]string{ + 1: "ButtonRequest_Other", + 2: "ButtonRequest_FeeOverThreshold", + 3: "ButtonRequest_ConfirmOutput", + 4: "ButtonRequest_ResetDevice", + 5: "ButtonRequest_ConfirmWord", + 6: "ButtonRequest_WipeDevice", + 7: "ButtonRequest_ProtectCall", + 8: "ButtonRequest_SignTx", + 9: "ButtonRequest_FirmwareCheck", + 10: "ButtonRequest_Address", + 11: "ButtonRequest_PublicKey", + 12: "ButtonRequest_MnemonicWordCount", + 13: "ButtonRequest_MnemonicInput", + 14: "ButtonRequest_PassphraseType", +} +var ButtonRequestType_value = map[string]int32{ + "ButtonRequest_Other": 1, + "ButtonRequest_FeeOverThreshold": 2, + "ButtonRequest_ConfirmOutput": 3, + "ButtonRequest_ResetDevice": 4, + "ButtonRequest_ConfirmWord": 5, + "ButtonRequest_WipeDevice": 6, + "ButtonRequest_ProtectCall": 7, + "ButtonRequest_SignTx": 8, + "ButtonRequest_FirmwareCheck": 9, + "ButtonRequest_Address": 10, + "ButtonRequest_PublicKey": 11, + "ButtonRequest_MnemonicWordCount": 12, + "ButtonRequest_MnemonicInput": 13, + "ButtonRequest_PassphraseType": 14, +} + +func (x ButtonRequestType) Enum() *ButtonRequestType { + p := new(ButtonRequestType) + *p = x + return p +} +func (x ButtonRequestType) String() string { + return proto.EnumName(ButtonRequestType_name, int32(x)) +} +func (x *ButtonRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ButtonRequestType_value, data, "ButtonRequestType") + if err != nil { + return err + } + *x = ButtonRequestType(value) + return nil +} +func (ButtonRequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{4} +} + +// * +// Type of PIN request +// @used_in PinMatrixRequest +type PinMatrixRequestType int32 + +const ( + PinMatrixRequestType_PinMatrixRequestType_Current PinMatrixRequestType = 1 + PinMatrixRequestType_PinMatrixRequestType_NewFirst PinMatrixRequestType = 2 + PinMatrixRequestType_PinMatrixRequestType_NewSecond PinMatrixRequestType = 3 +) + +var PinMatrixRequestType_name = map[int32]string{ + 1: "PinMatrixRequestType_Current", + 2: "PinMatrixRequestType_NewFirst", + 3: "PinMatrixRequestType_NewSecond", +} +var PinMatrixRequestType_value = map[string]int32{ + "PinMatrixRequestType_Current": 1, + "PinMatrixRequestType_NewFirst": 2, + "PinMatrixRequestType_NewSecond": 3, +} + +func (x PinMatrixRequestType) Enum() *PinMatrixRequestType { + p := new(PinMatrixRequestType) + *p = x + return p +} +func (x PinMatrixRequestType) String() string { + return proto.EnumName(PinMatrixRequestType_name, int32(x)) +} +func (x *PinMatrixRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(PinMatrixRequestType_value, data, "PinMatrixRequestType") + if err != nil { + return err + } + *x = PinMatrixRequestType(value) + return nil +} +func (PinMatrixRequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{5} +} + +// * +// Type of Recovery Word request +// @used_in WordRequest +type WordRequestType int32 + +const ( + WordRequestType_WordRequestType_Plain WordRequestType = 0 + WordRequestType_WordRequestType_Matrix9 WordRequestType = 1 + WordRequestType_WordRequestType_Matrix6 WordRequestType = 2 +) + +var WordRequestType_name = map[int32]string{ + 0: "WordRequestType_Plain", + 1: "WordRequestType_Matrix9", + 2: "WordRequestType_Matrix6", +} +var WordRequestType_value = map[string]int32{ + "WordRequestType_Plain": 0, + "WordRequestType_Matrix9": 1, + "WordRequestType_Matrix6": 2, +} + +func (x WordRequestType) Enum() *WordRequestType { + p := new(WordRequestType) + *p = x + return p +} +func (x WordRequestType) String() string { + return proto.EnumName(WordRequestType_name, int32(x)) +} +func (x *WordRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(WordRequestType_value, data, "WordRequestType") + if err != nil { + return err + } + *x = WordRequestType(value) + return nil +} +func (WordRequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{6} +} + +// * +// Flags used to build firmware +// @used_in Features +// @warning it's very important to preserve the order of the fields, and add +// @warning the new ones in a monotonic fashion as this can broke existing code. +type FirmwareFeatures int32 + +const ( + FirmwareFeatures_RequireGetEntropyConfirm FirmwareFeatures = 1 + FirmwareFeatures_IsGetEntropyEnabled FirmwareFeatures = 2 + FirmwareFeatures_IsEmulator FirmwareFeatures = 4 + FirmwareFeatures_FirmwareFeatures_RdpDebugDisabled FirmwareFeatures = 8 + FirmwareFeatures_FirmwareFeatures_RdpMemProtect FirmwareFeatures = 16 +) + +var FirmwareFeatures_name = map[int32]string{ + 1: "RequireGetEntropyConfirm", + 2: "IsGetEntropyEnabled", + 4: "IsEmulator", + 8: "FirmwareFeatures_RdpDebugDisabled", + 16: "FirmwareFeatures_RdpMemProtect", +} +var FirmwareFeatures_value = map[string]int32{ + "RequireGetEntropyConfirm": 1, + "IsGetEntropyEnabled": 2, + "IsEmulator": 4, + "FirmwareFeatures_RdpDebugDisabled": 8, + "FirmwareFeatures_RdpMemProtect": 16, +} + +func (x FirmwareFeatures) Enum() *FirmwareFeatures { + p := new(FirmwareFeatures) + *p = x + return p +} +func (x FirmwareFeatures) String() string { + return proto.EnumName(FirmwareFeatures_name, int32(x)) +} +func (x *FirmwareFeatures) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FirmwareFeatures_value, data, "FirmwareFeatures") + if err != nil { + return err + } + *x = FirmwareFeatures(value) + return nil +} +func (FirmwareFeatures) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{7} +} + +// TODO remove this +type SkycoinAddressType int32 + +const ( + SkycoinAddressType_AddressTypeSkycoin SkycoinAddressType = 1 + SkycoinAddressType_AddressTypeBitcoin SkycoinAddressType = 2 +) + +var SkycoinAddressType_name = map[int32]string{ + 1: "AddressTypeSkycoin", + 2: "AddressTypeBitcoin", +} +var SkycoinAddressType_value = map[string]int32{ + "AddressTypeSkycoin": 1, + "AddressTypeBitcoin": 2, +} + +func (x SkycoinAddressType) Enum() *SkycoinAddressType { + p := new(SkycoinAddressType) + *p = x + return p +} +func (x SkycoinAddressType) String() string { + return proto.EnumName(SkycoinAddressType_name, int32(x)) +} +func (x *SkycoinAddressType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(SkycoinAddressType_value, data, "SkycoinAddressType") + if err != nil { + return err + } + *x = SkycoinAddressType(value) + return nil +} +func (SkycoinAddressType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{8} +} + +// TODO remove this +type HDNodeType struct { + Depth *uint32 `protobuf:"varint,1,req,name=depth" json:"depth,omitempty"` + Fingerprint *uint32 `protobuf:"varint,2,req,name=fingerprint" json:"fingerprint,omitempty"` + ChildNum *uint32 `protobuf:"varint,3,req,name=child_num,json=childNum" json:"child_num,omitempty"` + ChainCode []byte `protobuf:"bytes,4,req,name=chain_code,json=chainCode" json:"chain_code,omitempty"` + PrivateKey []byte `protobuf:"bytes,5,opt,name=private_key,json=privateKey" json:"private_key,omitempty"` + PublicKey []byte `protobuf:"bytes,6,opt,name=public_key,json=publicKey" json:"public_key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HDNodeType) Reset() { *m = HDNodeType{} } +func (m *HDNodeType) String() string { return proto.CompactTextString(m) } +func (*HDNodeType) ProtoMessage() {} +func (*HDNodeType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{0} +} +func (m *HDNodeType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *HDNodeType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_HDNodeType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *HDNodeType) XXX_Merge(src proto.Message) { + xxx_messageInfo_HDNodeType.Merge(dst, src) +} +func (m *HDNodeType) XXX_Size() int { + return m.Size() +} +func (m *HDNodeType) XXX_DiscardUnknown() { + xxx_messageInfo_HDNodeType.DiscardUnknown(m) +} + +var xxx_messageInfo_HDNodeType proto.InternalMessageInfo + +func (m *HDNodeType) GetDepth() uint32 { + if m != nil && m.Depth != nil { + return *m.Depth + } + return 0 +} + +func (m *HDNodeType) GetFingerprint() uint32 { + if m != nil && m.Fingerprint != nil { + return *m.Fingerprint + } + return 0 +} + +func (m *HDNodeType) GetChildNum() uint32 { + if m != nil && m.ChildNum != nil { + return *m.ChildNum + } + return 0 +} + +func (m *HDNodeType) GetChainCode() []byte { + if m != nil { + return m.ChainCode + } + return nil +} + +func (m *HDNodeType) GetPrivateKey() []byte { + if m != nil { + return m.PrivateKey + } + return nil +} + +func (m *HDNodeType) GetPublicKey() []byte { + if m != nil { + return m.PublicKey + } + return nil +} + +// TODO remove this +type HDNodePathType struct { + Node *HDNodeType `protobuf:"bytes,1,req,name=node" json:"node,omitempty"` + AddressN []uint32 `protobuf:"varint,2,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HDNodePathType) Reset() { *m = HDNodePathType{} } +func (m *HDNodePathType) String() string { return proto.CompactTextString(m) } +func (*HDNodePathType) ProtoMessage() {} +func (*HDNodePathType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{1} +} +func (m *HDNodePathType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *HDNodePathType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_HDNodePathType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *HDNodePathType) XXX_Merge(src proto.Message) { + xxx_messageInfo_HDNodePathType.Merge(dst, src) +} +func (m *HDNodePathType) XXX_Size() int { + return m.Size() +} +func (m *HDNodePathType) XXX_DiscardUnknown() { + xxx_messageInfo_HDNodePathType.DiscardUnknown(m) +} + +var xxx_messageInfo_HDNodePathType proto.InternalMessageInfo + +func (m *HDNodePathType) GetNode() *HDNodeType { + if m != nil { + return m.Node + } + return nil +} + +func (m *HDNodePathType) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +// * +// Structure representing Coin +// @used_in Features +type CoinType struct { + CoinName *string `protobuf:"bytes,1,opt,name=coin_name,json=coinName" json:"coin_name,omitempty"` + CoinShortcut *string `protobuf:"bytes,2,opt,name=coin_shortcut,json=coinShortcut" json:"coin_shortcut,omitempty"` + AddressType *uint32 `protobuf:"varint,3,opt,name=address_type,json=addressType,def=0" json:"address_type,omitempty"` + MaxfeeKb *uint64 `protobuf:"varint,4,opt,name=maxfee_kb,json=maxfeeKb" json:"maxfee_kb,omitempty"` + AddressTypeP2Sh *uint32 `protobuf:"varint,5,opt,name=address_type_p2sh,json=addressTypeP2sh,def=5" json:"address_type_p2sh,omitempty"` + SignedMessageHeader *string `protobuf:"bytes,8,opt,name=signed_message_header,json=signedMessageHeader" json:"signed_message_header,omitempty"` + XpubMagic *uint32 `protobuf:"varint,9,opt,name=xpub_magic,json=xpubMagic,def=76067358" json:"xpub_magic,omitempty"` + XprvMagic *uint32 `protobuf:"varint,10,opt,name=xprv_magic,json=xprvMagic,def=76066276" json:"xprv_magic,omitempty"` + Segwit *bool `protobuf:"varint,11,opt,name=segwit" json:"segwit,omitempty"` + Forkid *uint32 `protobuf:"varint,12,opt,name=forkid" json:"forkid,omitempty"` + ForceBip143 *bool `protobuf:"varint,13,opt,name=force_bip143,json=forceBip143" json:"force_bip143,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CoinType) Reset() { *m = CoinType{} } +func (m *CoinType) String() string { return proto.CompactTextString(m) } +func (*CoinType) ProtoMessage() {} +func (*CoinType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{2} +} +func (m *CoinType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CoinType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CoinType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *CoinType) XXX_Merge(src proto.Message) { + xxx_messageInfo_CoinType.Merge(dst, src) +} +func (m *CoinType) XXX_Size() int { + return m.Size() +} +func (m *CoinType) XXX_DiscardUnknown() { + xxx_messageInfo_CoinType.DiscardUnknown(m) +} + +var xxx_messageInfo_CoinType proto.InternalMessageInfo + +const Default_CoinType_AddressType uint32 = 0 +const Default_CoinType_AddressTypeP2Sh uint32 = 5 +const Default_CoinType_XpubMagic uint32 = 76067358 +const Default_CoinType_XprvMagic uint32 = 76066276 + +func (m *CoinType) GetCoinName() string { + if m != nil && m.CoinName != nil { + return *m.CoinName + } + return "" +} + +func (m *CoinType) GetCoinShortcut() string { + if m != nil && m.CoinShortcut != nil { + return *m.CoinShortcut + } + return "" +} + +func (m *CoinType) GetAddressType() uint32 { + if m != nil && m.AddressType != nil { + return *m.AddressType + } + return Default_CoinType_AddressType +} + +func (m *CoinType) GetMaxfeeKb() uint64 { + if m != nil && m.MaxfeeKb != nil { + return *m.MaxfeeKb + } + return 0 +} + +func (m *CoinType) GetAddressTypeP2Sh() uint32 { + if m != nil && m.AddressTypeP2Sh != nil { + return *m.AddressTypeP2Sh + } + return Default_CoinType_AddressTypeP2Sh +} + +func (m *CoinType) GetSignedMessageHeader() string { + if m != nil && m.SignedMessageHeader != nil { + return *m.SignedMessageHeader + } + return "" +} + +func (m *CoinType) GetXpubMagic() uint32 { + if m != nil && m.XpubMagic != nil { + return *m.XpubMagic + } + return Default_CoinType_XpubMagic +} + +func (m *CoinType) GetXprvMagic() uint32 { + if m != nil && m.XprvMagic != nil { + return *m.XprvMagic + } + return Default_CoinType_XprvMagic +} + +func (m *CoinType) GetSegwit() bool { + if m != nil && m.Segwit != nil { + return *m.Segwit + } + return false +} + +func (m *CoinType) GetForkid() uint32 { + if m != nil && m.Forkid != nil { + return *m.Forkid + } + return 0 +} + +func (m *CoinType) GetForceBip143() bool { + if m != nil && m.ForceBip143 != nil { + return *m.ForceBip143 + } + return false +} + +// TODO remove this +type MultisigRedeemScriptType struct { + Pubkeys []*HDNodePathType `protobuf:"bytes,1,rep,name=pubkeys" json:"pubkeys,omitempty"` + Signatures [][]byte `protobuf:"bytes,2,rep,name=signatures" json:"signatures,omitempty"` + M *uint32 `protobuf:"varint,3,opt,name=m" json:"m,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MultisigRedeemScriptType) Reset() { *m = MultisigRedeemScriptType{} } +func (m *MultisigRedeemScriptType) String() string { return proto.CompactTextString(m) } +func (*MultisigRedeemScriptType) ProtoMessage() {} +func (*MultisigRedeemScriptType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{3} +} +func (m *MultisigRedeemScriptType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MultisigRedeemScriptType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MultisigRedeemScriptType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *MultisigRedeemScriptType) XXX_Merge(src proto.Message) { + xxx_messageInfo_MultisigRedeemScriptType.Merge(dst, src) +} +func (m *MultisigRedeemScriptType) XXX_Size() int { + return m.Size() +} +func (m *MultisigRedeemScriptType) XXX_DiscardUnknown() { + xxx_messageInfo_MultisigRedeemScriptType.DiscardUnknown(m) +} + +var xxx_messageInfo_MultisigRedeemScriptType proto.InternalMessageInfo + +func (m *MultisigRedeemScriptType) GetPubkeys() []*HDNodePathType { + if m != nil { + return m.Pubkeys + } + return nil +} + +func (m *MultisigRedeemScriptType) GetSignatures() [][]byte { + if m != nil { + return m.Signatures + } + return nil +} + +func (m *MultisigRedeemScriptType) GetM() uint32 { + if m != nil && m.M != nil { + return *m.M + } + return 0 +} + +// * +// Structure representing transaction input +// @used_in SimpleSignTx +// @used_in TransactionType +type TxInputType struct { + AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + PrevHash []byte `protobuf:"bytes,2,req,name=prev_hash,json=prevHash" json:"prev_hash,omitempty"` + PrevIndex *uint32 `protobuf:"varint,3,req,name=prev_index,json=prevIndex" json:"prev_index,omitempty"` + ScriptSig []byte `protobuf:"bytes,4,opt,name=script_sig,json=scriptSig" json:"script_sig,omitempty"` + Sequence *uint32 `protobuf:"varint,5,opt,name=sequence,def=4294967295" json:"sequence,omitempty"` + ScriptType *InputScriptType `protobuf:"varint,6,opt,name=script_type,json=scriptType,enum=InputScriptType,def=0" json:"script_type,omitempty"` + Multisig *MultisigRedeemScriptType `protobuf:"bytes,7,opt,name=multisig" json:"multisig,omitempty"` + Amount *uint64 `protobuf:"varint,8,opt,name=amount" json:"amount,omitempty"` + DecredTree *uint32 `protobuf:"varint,9,opt,name=decred_tree,json=decredTree" json:"decred_tree,omitempty"` + DecredScriptVersion *uint32 `protobuf:"varint,10,opt,name=decred_script_version,json=decredScriptVersion" json:"decred_script_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxInputType) Reset() { *m = TxInputType{} } +func (m *TxInputType) String() string { return proto.CompactTextString(m) } +func (*TxInputType) ProtoMessage() {} +func (*TxInputType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{4} +} +func (m *TxInputType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxInputType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxInputType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxInputType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxInputType.Merge(dst, src) +} +func (m *TxInputType) XXX_Size() int { + return m.Size() +} +func (m *TxInputType) XXX_DiscardUnknown() { + xxx_messageInfo_TxInputType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxInputType proto.InternalMessageInfo + +const Default_TxInputType_Sequence uint32 = 4294967295 +const Default_TxInputType_ScriptType InputScriptType = InputScriptType_SPENDADDRESS + +func (m *TxInputType) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *TxInputType) GetPrevHash() []byte { + if m != nil { + return m.PrevHash + } + return nil +} + +func (m *TxInputType) GetPrevIndex() uint32 { + if m != nil && m.PrevIndex != nil { + return *m.PrevIndex + } + return 0 +} + +func (m *TxInputType) GetScriptSig() []byte { + if m != nil { + return m.ScriptSig + } + return nil +} + +func (m *TxInputType) GetSequence() uint32 { + if m != nil && m.Sequence != nil { + return *m.Sequence + } + return Default_TxInputType_Sequence +} + +func (m *TxInputType) GetScriptType() InputScriptType { + if m != nil && m.ScriptType != nil { + return *m.ScriptType + } + return Default_TxInputType_ScriptType +} + +func (m *TxInputType) GetMultisig() *MultisigRedeemScriptType { + if m != nil { + return m.Multisig + } + return nil +} + +func (m *TxInputType) GetAmount() uint64 { + if m != nil && m.Amount != nil { + return *m.Amount + } + return 0 +} + +func (m *TxInputType) GetDecredTree() uint32 { + if m != nil && m.DecredTree != nil { + return *m.DecredTree + } + return 0 +} + +func (m *TxInputType) GetDecredScriptVersion() uint32 { + if m != nil && m.DecredScriptVersion != nil { + return *m.DecredScriptVersion + } + return 0 +} + +// * +// Structure representing transaction output +// @used_in SimpleSignTx +// @used_in TransactionType +type TxOutputType struct { + Address *string `protobuf:"bytes,1,opt,name=address" json:"address,omitempty"` + AddressN []uint32 `protobuf:"varint,2,rep,name=address_n,json=addressN" json:"address_n,omitempty"` + Amount *uint64 `protobuf:"varint,3,req,name=amount" json:"amount,omitempty"` + ScriptType *OutputScriptType `protobuf:"varint,4,req,name=script_type,json=scriptType,enum=OutputScriptType" json:"script_type,omitempty"` + Multisig *MultisigRedeemScriptType `protobuf:"bytes,5,opt,name=multisig" json:"multisig,omitempty"` + OpReturnData []byte `protobuf:"bytes,6,opt,name=op_return_data,json=opReturnData" json:"op_return_data,omitempty"` + DecredScriptVersion *uint32 `protobuf:"varint,7,opt,name=decred_script_version,json=decredScriptVersion" json:"decred_script_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxOutputType) Reset() { *m = TxOutputType{} } +func (m *TxOutputType) String() string { return proto.CompactTextString(m) } +func (*TxOutputType) ProtoMessage() {} +func (*TxOutputType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{5} +} +func (m *TxOutputType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxOutputType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxOutputType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxOutputType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxOutputType.Merge(dst, src) +} +func (m *TxOutputType) XXX_Size() int { + return m.Size() +} +func (m *TxOutputType) XXX_DiscardUnknown() { + xxx_messageInfo_TxOutputType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxOutputType proto.InternalMessageInfo + +func (m *TxOutputType) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +func (m *TxOutputType) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *TxOutputType) GetAmount() uint64 { + if m != nil && m.Amount != nil { + return *m.Amount + } + return 0 +} + +func (m *TxOutputType) GetScriptType() OutputScriptType { + if m != nil && m.ScriptType != nil { + return *m.ScriptType + } + return OutputScriptType_PAYTOADDRESS +} + +func (m *TxOutputType) GetMultisig() *MultisigRedeemScriptType { + if m != nil { + return m.Multisig + } + return nil +} + +func (m *TxOutputType) GetOpReturnData() []byte { + if m != nil { + return m.OpReturnData + } + return nil +} + +func (m *TxOutputType) GetDecredScriptVersion() uint32 { + if m != nil && m.DecredScriptVersion != nil { + return *m.DecredScriptVersion + } + return 0 +} + +// * +// Structure representing compiled transaction output +// @used_in TransactionType +type TxOutputBinType struct { + Amount *uint64 `protobuf:"varint,1,req,name=amount" json:"amount,omitempty"` + ScriptPubkey []byte `protobuf:"bytes,2,req,name=script_pubkey,json=scriptPubkey" json:"script_pubkey,omitempty"` + DecredScriptVersion *uint32 `protobuf:"varint,3,opt,name=decred_script_version,json=decredScriptVersion" json:"decred_script_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxOutputBinType) Reset() { *m = TxOutputBinType{} } +func (m *TxOutputBinType) String() string { return proto.CompactTextString(m) } +func (*TxOutputBinType) ProtoMessage() {} +func (*TxOutputBinType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{6} +} +func (m *TxOutputBinType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxOutputBinType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxOutputBinType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxOutputBinType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxOutputBinType.Merge(dst, src) +} +func (m *TxOutputBinType) XXX_Size() int { + return m.Size() +} +func (m *TxOutputBinType) XXX_DiscardUnknown() { + xxx_messageInfo_TxOutputBinType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxOutputBinType proto.InternalMessageInfo + +func (m *TxOutputBinType) GetAmount() uint64 { + if m != nil && m.Amount != nil { + return *m.Amount + } + return 0 +} + +func (m *TxOutputBinType) GetScriptPubkey() []byte { + if m != nil { + return m.ScriptPubkey + } + return nil +} + +func (m *TxOutputBinType) GetDecredScriptVersion() uint32 { + if m != nil && m.DecredScriptVersion != nil { + return *m.DecredScriptVersion + } + return 0 +} + +// * +// Structure representing transaction +// @used_in SimpleSignTx +type TransactionType struct { + Version *uint32 `protobuf:"varint,1,opt,name=version" json:"version,omitempty"` + Inputs []*TxInputType `protobuf:"bytes,2,rep,name=inputs" json:"inputs,omitempty"` + BinOutputs []*TxOutputBinType `protobuf:"bytes,3,rep,name=bin_outputs,json=binOutputs" json:"bin_outputs,omitempty"` + Outputs []*TxOutputType `protobuf:"bytes,5,rep,name=outputs" json:"outputs,omitempty"` + LockTime *uint32 `protobuf:"varint,4,opt,name=lock_time,json=lockTime" json:"lock_time,omitempty"` + InputsCnt *uint32 `protobuf:"varint,6,opt,name=inputs_cnt,json=inputsCnt" json:"inputs_cnt,omitempty"` + OutputsCnt *uint32 `protobuf:"varint,7,opt,name=outputs_cnt,json=outputsCnt" json:"outputs_cnt,omitempty"` + ExtraData []byte `protobuf:"bytes,8,opt,name=extra_data,json=extraData" json:"extra_data,omitempty"` + ExtraDataLen *uint32 `protobuf:"varint,9,opt,name=extra_data_len,json=extraDataLen" json:"extra_data_len,omitempty"` + DecredExpiry *uint32 `protobuf:"varint,10,opt,name=decred_expiry,json=decredExpiry" json:"decred_expiry,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TransactionType) Reset() { *m = TransactionType{} } +func (m *TransactionType) String() string { return proto.CompactTextString(m) } +func (*TransactionType) ProtoMessage() {} +func (*TransactionType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{7} +} +func (m *TransactionType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TransactionType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TransactionType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TransactionType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TransactionType.Merge(dst, src) +} +func (m *TransactionType) XXX_Size() int { + return m.Size() +} +func (m *TransactionType) XXX_DiscardUnknown() { + xxx_messageInfo_TransactionType.DiscardUnknown(m) +} + +var xxx_messageInfo_TransactionType proto.InternalMessageInfo + +func (m *TransactionType) GetVersion() uint32 { + if m != nil && m.Version != nil { + return *m.Version + } + return 0 +} + +func (m *TransactionType) GetInputs() []*TxInputType { + if m != nil { + return m.Inputs + } + return nil +} + +func (m *TransactionType) GetBinOutputs() []*TxOutputBinType { + if m != nil { + return m.BinOutputs + } + return nil +} + +func (m *TransactionType) GetOutputs() []*TxOutputType { + if m != nil { + return m.Outputs + } + return nil +} + +func (m *TransactionType) GetLockTime() uint32 { + if m != nil && m.LockTime != nil { + return *m.LockTime + } + return 0 +} + +func (m *TransactionType) GetInputsCnt() uint32 { + if m != nil && m.InputsCnt != nil { + return *m.InputsCnt + } + return 0 +} + +func (m *TransactionType) GetOutputsCnt() uint32 { + if m != nil && m.OutputsCnt != nil { + return *m.OutputsCnt + } + return 0 +} + +func (m *TransactionType) GetExtraData() []byte { + if m != nil { + return m.ExtraData + } + return nil +} + +func (m *TransactionType) GetExtraDataLen() uint32 { + if m != nil && m.ExtraDataLen != nil { + return *m.ExtraDataLen + } + return 0 +} + +func (m *TransactionType) GetDecredExpiry() uint32 { + if m != nil && m.DecredExpiry != nil { + return *m.DecredExpiry + } + return 0 +} + +// * +// Structure representing request details +// @used_in TxRequest +type TxRequestDetailsType struct { + RequestIndex *uint32 `protobuf:"varint,1,opt,name=request_index,json=requestIndex" json:"request_index,omitempty"` + TxHash []byte `protobuf:"bytes,2,opt,name=tx_hash,json=txHash" json:"tx_hash,omitempty"` + ExtraDataLen *uint32 `protobuf:"varint,3,opt,name=extra_data_len,json=extraDataLen" json:"extra_data_len,omitempty"` + ExtraDataOffset *uint32 `protobuf:"varint,4,opt,name=extra_data_offset,json=extraDataOffset" json:"extra_data_offset,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxRequestDetailsType) Reset() { *m = TxRequestDetailsType{} } +func (m *TxRequestDetailsType) String() string { return proto.CompactTextString(m) } +func (*TxRequestDetailsType) ProtoMessage() {} +func (*TxRequestDetailsType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{8} +} +func (m *TxRequestDetailsType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxRequestDetailsType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxRequestDetailsType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxRequestDetailsType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxRequestDetailsType.Merge(dst, src) +} +func (m *TxRequestDetailsType) XXX_Size() int { + return m.Size() +} +func (m *TxRequestDetailsType) XXX_DiscardUnknown() { + xxx_messageInfo_TxRequestDetailsType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxRequestDetailsType proto.InternalMessageInfo + +func (m *TxRequestDetailsType) GetRequestIndex() uint32 { + if m != nil && m.RequestIndex != nil { + return *m.RequestIndex + } + return 0 +} + +func (m *TxRequestDetailsType) GetTxHash() []byte { + if m != nil { + return m.TxHash + } + return nil +} + +func (m *TxRequestDetailsType) GetExtraDataLen() uint32 { + if m != nil && m.ExtraDataLen != nil { + return *m.ExtraDataLen + } + return 0 +} + +func (m *TxRequestDetailsType) GetExtraDataOffset() uint32 { + if m != nil && m.ExtraDataOffset != nil { + return *m.ExtraDataOffset + } + return 0 +} + +// * +// Structure representing serialized data +// @used_in TxRequest +type TxRequestSerializedType struct { + SignatureIndex *uint32 `protobuf:"varint,1,opt,name=signature_index,json=signatureIndex" json:"signature_index,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + SerializedTx []byte `protobuf:"bytes,3,opt,name=serialized_tx,json=serializedTx" json:"serialized_tx,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TxRequestSerializedType) Reset() { *m = TxRequestSerializedType{} } +func (m *TxRequestSerializedType) String() string { return proto.CompactTextString(m) } +func (*TxRequestSerializedType) ProtoMessage() {} +func (*TxRequestSerializedType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{9} +} +func (m *TxRequestSerializedType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TxRequestSerializedType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TxRequestSerializedType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *TxRequestSerializedType) XXX_Merge(src proto.Message) { + xxx_messageInfo_TxRequestSerializedType.Merge(dst, src) +} +func (m *TxRequestSerializedType) XXX_Size() int { + return m.Size() +} +func (m *TxRequestSerializedType) XXX_DiscardUnknown() { + xxx_messageInfo_TxRequestSerializedType.DiscardUnknown(m) +} + +var xxx_messageInfo_TxRequestSerializedType proto.InternalMessageInfo + +func (m *TxRequestSerializedType) GetSignatureIndex() uint32 { + if m != nil && m.SignatureIndex != nil { + return *m.SignatureIndex + } + return 0 +} + +func (m *TxRequestSerializedType) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *TxRequestSerializedType) GetSerializedTx() []byte { + if m != nil { + return m.SerializedTx + } + return nil +} + +// * +// Structure representing identity data +// @used_in IdentityType +type IdentityType struct { + Proto *string `protobuf:"bytes,1,opt,name=proto" json:"proto,omitempty"` + User *string `protobuf:"bytes,2,opt,name=user" json:"user,omitempty"` + Host *string `protobuf:"bytes,3,opt,name=host" json:"host,omitempty"` + Port *string `protobuf:"bytes,4,opt,name=port" json:"port,omitempty"` + Path *string `protobuf:"bytes,5,opt,name=path" json:"path,omitempty"` + Index *uint32 `protobuf:"varint,6,opt,name=index,def=0" json:"index,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IdentityType) Reset() { *m = IdentityType{} } +func (m *IdentityType) String() string { return proto.CompactTextString(m) } +func (*IdentityType) ProtoMessage() {} +func (*IdentityType) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{10} +} +func (m *IdentityType) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IdentityType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IdentityType.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *IdentityType) XXX_Merge(src proto.Message) { + xxx_messageInfo_IdentityType.Merge(dst, src) +} +func (m *IdentityType) XXX_Size() int { + return m.Size() +} +func (m *IdentityType) XXX_DiscardUnknown() { + xxx_messageInfo_IdentityType.DiscardUnknown(m) +} + +var xxx_messageInfo_IdentityType proto.InternalMessageInfo + +const Default_IdentityType_Index uint32 = 0 + +func (m *IdentityType) GetProto() string { + if m != nil && m.Proto != nil { + return *m.Proto + } + return "" +} + +func (m *IdentityType) GetUser() string { + if m != nil && m.User != nil { + return *m.User + } + return "" +} + +func (m *IdentityType) GetHost() string { + if m != nil && m.Host != nil { + return *m.Host + } + return "" +} + +func (m *IdentityType) GetPort() string { + if m != nil && m.Port != nil { + return *m.Port + } + return "" +} + +func (m *IdentityType) GetPath() string { + if m != nil && m.Path != nil { + return *m.Path + } + return "" +} + +func (m *IdentityType) GetIndex() uint32 { + if m != nil && m.Index != nil { + return *m.Index + } + return Default_IdentityType_Index +} + +// * +// Skycoin transaction input +// @used_in TransactionSign +type SkycoinTransactionInput struct { + HashIn *string `protobuf:"bytes,1,req,name=hashIn" json:"hashIn,omitempty"` + Index *uint32 `protobuf:"varint,2,opt,name=index" json:"index,omitempty"` + Bip44Addr *Bip44AddrIndex `protobuf:"bytes,3,opt,name=bip44_addr,json=bip44Addr" json:"bip44_addr,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SkycoinTransactionInput) Reset() { *m = SkycoinTransactionInput{} } +func (m *SkycoinTransactionInput) String() string { return proto.CompactTextString(m) } +func (*SkycoinTransactionInput) ProtoMessage() {} +func (*SkycoinTransactionInput) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{11} +} +func (m *SkycoinTransactionInput) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SkycoinTransactionInput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SkycoinTransactionInput.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *SkycoinTransactionInput) XXX_Merge(src proto.Message) { + xxx_messageInfo_SkycoinTransactionInput.Merge(dst, src) +} +func (m *SkycoinTransactionInput) XXX_Size() int { + return m.Size() +} +func (m *SkycoinTransactionInput) XXX_DiscardUnknown() { + xxx_messageInfo_SkycoinTransactionInput.DiscardUnknown(m) +} + +var xxx_messageInfo_SkycoinTransactionInput proto.InternalMessageInfo + +func (m *SkycoinTransactionInput) GetHashIn() string { + if m != nil && m.HashIn != nil { + return *m.HashIn + } + return "" +} + +func (m *SkycoinTransactionInput) GetIndex() uint32 { + if m != nil && m.Index != nil { + return *m.Index + } + return 0 +} + +func (m *SkycoinTransactionInput) GetBip44Addr() *Bip44AddrIndex { + if m != nil { + return m.Bip44Addr + } + return nil +} + +// * +// Skycoin transaction output +// @used_in TransactionSign +type SkycoinTransactionOutput struct { + Address *string `protobuf:"bytes,1,req,name=address" json:"address,omitempty"` + Coin *uint64 `protobuf:"varint,2,req,name=coin" json:"coin,omitempty"` + Hour *uint64 `protobuf:"varint,3,req,name=hour" json:"hour,omitempty"` + AddressIndex *uint32 `protobuf:"varint,4,opt,name=address_index,json=addressIndex" json:"address_index,omitempty"` + Bip44Addr *Bip44AddrIndex `protobuf:"bytes,5,opt,name=bip44_addr,json=bip44Addr" json:"bip44_addr,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SkycoinTransactionOutput) Reset() { *m = SkycoinTransactionOutput{} } +func (m *SkycoinTransactionOutput) String() string { return proto.CompactTextString(m) } +func (*SkycoinTransactionOutput) ProtoMessage() {} +func (*SkycoinTransactionOutput) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{12} +} +func (m *SkycoinTransactionOutput) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SkycoinTransactionOutput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SkycoinTransactionOutput.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *SkycoinTransactionOutput) XXX_Merge(src proto.Message) { + xxx_messageInfo_SkycoinTransactionOutput.Merge(dst, src) +} +func (m *SkycoinTransactionOutput) XXX_Size() int { + return m.Size() +} +func (m *SkycoinTransactionOutput) XXX_DiscardUnknown() { + xxx_messageInfo_SkycoinTransactionOutput.DiscardUnknown(m) +} + +var xxx_messageInfo_SkycoinTransactionOutput proto.InternalMessageInfo + +func (m *SkycoinTransactionOutput) GetAddress() string { + if m != nil && m.Address != nil { + return *m.Address + } + return "" +} + +func (m *SkycoinTransactionOutput) GetCoin() uint64 { + if m != nil && m.Coin != nil { + return *m.Coin + } + return 0 +} + +func (m *SkycoinTransactionOutput) GetHour() uint64 { + if m != nil && m.Hour != nil { + return *m.Hour + } + return 0 +} + +func (m *SkycoinTransactionOutput) GetAddressIndex() uint32 { + if m != nil && m.AddressIndex != nil { + return *m.AddressIndex + } + return 0 +} + +func (m *SkycoinTransactionOutput) GetBip44Addr() *Bip44AddrIndex { + if m != nil { + return m.Bip44Addr + } + return nil +} + +type Bip44AddrIndex struct { + CoinType *uint32 `protobuf:"varint,1,req,name=coin_type,json=coinType" json:"coin_type,omitempty"` + Account *uint32 `protobuf:"varint,2,req,name=account" json:"account,omitempty"` + Change *uint32 `protobuf:"varint,3,req,name=change" json:"change,omitempty"` + AddressStartIndex *uint32 `protobuf:"varint,4,req,name=address_start_index,json=addressStartIndex" json:"address_start_index,omitempty"` + AddressN *uint32 `protobuf:"varint,5,req,name=address_n,json=addressN" json:"address_n,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Bip44AddrIndex) Reset() { *m = Bip44AddrIndex{} } +func (m *Bip44AddrIndex) String() string { return proto.CompactTextString(m) } +func (*Bip44AddrIndex) ProtoMessage() {} +func (*Bip44AddrIndex) Descriptor() ([]byte, []int) { + return fileDescriptor_types_0bfb6936339e7e82, []int{13} +} +func (m *Bip44AddrIndex) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Bip44AddrIndex) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Bip44AddrIndex.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Bip44AddrIndex) XXX_Merge(src proto.Message) { + xxx_messageInfo_Bip44AddrIndex.Merge(dst, src) +} +func (m *Bip44AddrIndex) XXX_Size() int { + return m.Size() +} +func (m *Bip44AddrIndex) XXX_DiscardUnknown() { + xxx_messageInfo_Bip44AddrIndex.DiscardUnknown(m) +} + +var xxx_messageInfo_Bip44AddrIndex proto.InternalMessageInfo + +func (m *Bip44AddrIndex) GetCoinType() uint32 { + if m != nil && m.CoinType != nil { + return *m.CoinType + } + return 0 +} + +func (m *Bip44AddrIndex) GetAccount() uint32 { + if m != nil && m.Account != nil { + return *m.Account + } + return 0 +} + +func (m *Bip44AddrIndex) GetChange() uint32 { + if m != nil && m.Change != nil { + return *m.Change + } + return 0 +} + +func (m *Bip44AddrIndex) GetAddressStartIndex() uint32 { + if m != nil && m.AddressStartIndex != nil { + return *m.AddressStartIndex + } + return 0 +} + +func (m *Bip44AddrIndex) GetAddressN() uint32 { + if m != nil && m.AddressN != nil { + return *m.AddressN + } + return 0 +} + +var E_WireIn = &proto.ExtensionDesc{ + ExtendedType: (*protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50002, + Name: "wire_in", + Tag: "varint,50002,opt,name=wire_in,json=wireIn", + Filename: "types.proto", +} + +var E_WireOut = &proto.ExtensionDesc{ + ExtendedType: (*protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50003, + Name: "wire_out", + Tag: "varint,50003,opt,name=wire_out,json=wireOut", + Filename: "types.proto", +} + +var E_WireDebugIn = &proto.ExtensionDesc{ + ExtendedType: (*protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50004, + Name: "wire_debug_in", + Tag: "varint,50004,opt,name=wire_debug_in,json=wireDebugIn", + Filename: "types.proto", +} + +var E_WireDebugOut = &proto.ExtensionDesc{ + ExtendedType: (*protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50005, + Name: "wire_debug_out", + Tag: "varint,50005,opt,name=wire_debug_out,json=wireDebugOut", + Filename: "types.proto", +} + +var E_WireTiny = &proto.ExtensionDesc{ + ExtendedType: (*protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50006, + Name: "wire_tiny", + Tag: "varint,50006,opt,name=wire_tiny,json=wireTiny", + Filename: "types.proto", +} + +var E_WireBootloader = &proto.ExtensionDesc{ + ExtendedType: (*protobuf.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50007, + Name: "wire_bootloader", + Tag: "varint,50007,opt,name=wire_bootloader,json=wireBootloader", + Filename: "types.proto", +} + +func init() { + proto.RegisterType((*HDNodeType)(nil), "HDNodeType") + proto.RegisterType((*HDNodePathType)(nil), "HDNodePathType") + proto.RegisterType((*CoinType)(nil), "CoinType") + proto.RegisterType((*MultisigRedeemScriptType)(nil), "MultisigRedeemScriptType") + proto.RegisterType((*TxInputType)(nil), "TxInputType") + proto.RegisterType((*TxOutputType)(nil), "TxOutputType") + proto.RegisterType((*TxOutputBinType)(nil), "TxOutputBinType") + proto.RegisterType((*TransactionType)(nil), "TransactionType") + proto.RegisterType((*TxRequestDetailsType)(nil), "TxRequestDetailsType") + proto.RegisterType((*TxRequestSerializedType)(nil), "TxRequestSerializedType") + proto.RegisterType((*IdentityType)(nil), "IdentityType") + proto.RegisterType((*SkycoinTransactionInput)(nil), "SkycoinTransactionInput") + proto.RegisterType((*SkycoinTransactionOutput)(nil), "SkycoinTransactionOutput") + proto.RegisterType((*Bip44AddrIndex)(nil), "Bip44AddrIndex") + proto.RegisterEnum("FailureType", FailureType_name, FailureType_value) + proto.RegisterEnum("OutputScriptType", OutputScriptType_name, OutputScriptType_value) + proto.RegisterEnum("InputScriptType", InputScriptType_name, InputScriptType_value) + proto.RegisterEnum("RequestType", RequestType_name, RequestType_value) + proto.RegisterEnum("ButtonRequestType", ButtonRequestType_name, ButtonRequestType_value) + proto.RegisterEnum("PinMatrixRequestType", PinMatrixRequestType_name, PinMatrixRequestType_value) + proto.RegisterEnum("WordRequestType", WordRequestType_name, WordRequestType_value) + proto.RegisterEnum("FirmwareFeatures", FirmwareFeatures_name, FirmwareFeatures_value) + proto.RegisterEnum("SkycoinAddressType", SkycoinAddressType_name, SkycoinAddressType_value) + proto.RegisterExtension(E_WireIn) + proto.RegisterExtension(E_WireOut) + proto.RegisterExtension(E_WireDebugIn) + proto.RegisterExtension(E_WireDebugOut) + proto.RegisterExtension(E_WireTiny) + proto.RegisterExtension(E_WireBootloader) +} +func (m *HDNodeType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HDNodeType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Depth == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("depth") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Depth)) + } + if m.Fingerprint == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("fingerprint") + } else { + dAtA[i] = 0x10 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Fingerprint)) + } + if m.ChildNum == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("child_num") + } else { + dAtA[i] = 0x18 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.ChildNum)) + } + if m.ChainCode == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("chain_code") + } else { + dAtA[i] = 0x22 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainCode))) + i += copy(dAtA[i:], m.ChainCode) + } + if m.PrivateKey != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.PrivateKey))) + i += copy(dAtA[i:], m.PrivateKey) + } + if m.PublicKey != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.PublicKey))) + i += copy(dAtA[i:], m.PublicKey) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *HDNodePathType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HDNodePathType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Node == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("node") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintTypes(dAtA, i, uint64(m.Node.Size())) + n1, err := m.Node.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if len(m.AddressN) > 0 { + for _, num := range m.AddressN { + dAtA[i] = 0x10 + i++ + i = encodeVarintTypes(dAtA, i, uint64(num)) + } + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *CoinType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CoinType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.CoinName != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.CoinName))) + i += copy(dAtA[i:], *m.CoinName) + } + if m.CoinShortcut != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.CoinShortcut))) + i += copy(dAtA[i:], *m.CoinShortcut) + } + if m.AddressType != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.AddressType)) + } + if m.MaxfeeKb != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.MaxfeeKb)) + } + if m.AddressTypeP2Sh != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.AddressTypeP2Sh)) + } + if m.SignedMessageHeader != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.SignedMessageHeader))) + i += copy(dAtA[i:], *m.SignedMessageHeader) + } + if m.XpubMagic != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.XpubMagic)) + } + if m.XprvMagic != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.XprvMagic)) + } + if m.Segwit != nil { + dAtA[i] = 0x58 + i++ + if *m.Segwit { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Forkid != nil { + dAtA[i] = 0x60 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Forkid)) + } + if m.ForceBip143 != nil { + dAtA[i] = 0x68 + i++ + if *m.ForceBip143 { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *MultisigRedeemScriptType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MultisigRedeemScriptType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Pubkeys) > 0 { + for _, msg := range m.Pubkeys { + dAtA[i] = 0xa + i++ + i = encodeVarintTypes(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Signatures) > 0 { + for _, b := range m.Signatures { + dAtA[i] = 0x12 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(b))) + i += copy(dAtA[i:], b) + } + } + if m.M != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.M)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxInputType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxInputType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.AddressN) > 0 { + for _, num := range m.AddressN { + dAtA[i] = 0x8 + i++ + i = encodeVarintTypes(dAtA, i, uint64(num)) + } + } + if m.PrevHash == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("prev_hash") + } else { + dAtA[i] = 0x12 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.PrevHash))) + i += copy(dAtA[i:], m.PrevHash) + } + if m.PrevIndex == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("prev_index") + } else { + dAtA[i] = 0x18 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.PrevIndex)) + } + if m.ScriptSig != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.ScriptSig))) + i += copy(dAtA[i:], m.ScriptSig) + } + if m.Sequence != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Sequence)) + } + if m.ScriptType != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.ScriptType)) + } + if m.Multisig != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintTypes(dAtA, i, uint64(m.Multisig.Size())) + n2, err := m.Multisig.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + if m.Amount != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Amount)) + } + if m.DecredTree != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.DecredTree)) + } + if m.DecredScriptVersion != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.DecredScriptVersion)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxOutputType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxOutputType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Address != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.Address))) + i += copy(dAtA[i:], *m.Address) + } + if len(m.AddressN) > 0 { + for _, num := range m.AddressN { + dAtA[i] = 0x10 + i++ + i = encodeVarintTypes(dAtA, i, uint64(num)) + } + } + if m.Amount == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("amount") + } else { + dAtA[i] = 0x18 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Amount)) + } + if m.ScriptType == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("script_type") + } else { + dAtA[i] = 0x20 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.ScriptType)) + } + if m.Multisig != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintTypes(dAtA, i, uint64(m.Multisig.Size())) + n3, err := m.Multisig.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if m.OpReturnData != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.OpReturnData))) + i += copy(dAtA[i:], m.OpReturnData) + } + if m.DecredScriptVersion != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.DecredScriptVersion)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxOutputBinType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxOutputBinType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Amount == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("amount") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Amount)) + } + if m.ScriptPubkey == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("script_pubkey") + } else { + dAtA[i] = 0x12 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.ScriptPubkey))) + i += copy(dAtA[i:], m.ScriptPubkey) + } + if m.DecredScriptVersion != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.DecredScriptVersion)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TransactionType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TransactionType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Version != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Version)) + } + if len(m.Inputs) > 0 { + for _, msg := range m.Inputs { + dAtA[i] = 0x12 + i++ + i = encodeVarintTypes(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.BinOutputs) > 0 { + for _, msg := range m.BinOutputs { + dAtA[i] = 0x1a + i++ + i = encodeVarintTypes(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.LockTime != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.LockTime)) + } + if len(m.Outputs) > 0 { + for _, msg := range m.Outputs { + dAtA[i] = 0x2a + i++ + i = encodeVarintTypes(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.InputsCnt != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.InputsCnt)) + } + if m.OutputsCnt != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.OutputsCnt)) + } + if m.ExtraData != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.ExtraData))) + i += copy(dAtA[i:], m.ExtraData) + } + if m.ExtraDataLen != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.ExtraDataLen)) + } + if m.DecredExpiry != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.DecredExpiry)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxRequestDetailsType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxRequestDetailsType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.RequestIndex != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.RequestIndex)) + } + if m.TxHash != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.TxHash))) + i += copy(dAtA[i:], m.TxHash) + } + if m.ExtraDataLen != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.ExtraDataLen)) + } + if m.ExtraDataOffset != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.ExtraDataOffset)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *TxRequestSerializedType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TxRequestSerializedType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.SignatureIndex != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.SignatureIndex)) + } + if m.Signature != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.Signature))) + i += copy(dAtA[i:], m.Signature) + } + if m.SerializedTx != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(m.SerializedTx))) + i += copy(dAtA[i:], m.SerializedTx) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *IdentityType) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IdentityType) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Proto != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.Proto))) + i += copy(dAtA[i:], *m.Proto) + } + if m.User != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.User))) + i += copy(dAtA[i:], *m.User) + } + if m.Host != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.Host))) + i += copy(dAtA[i:], *m.Host) + } + if m.Port != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.Port))) + i += copy(dAtA[i:], *m.Port) + } + if m.Path != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.Path))) + i += copy(dAtA[i:], *m.Path) + } + if m.Index != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SkycoinTransactionInput) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SkycoinTransactionInput) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.HashIn == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("hashIn") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.HashIn))) + i += copy(dAtA[i:], *m.HashIn) + } + if m.Index != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Index)) + } + if m.Bip44Addr != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintTypes(dAtA, i, uint64(m.Bip44Addr.Size())) + n4, err := m.Bip44Addr.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SkycoinTransactionOutput) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SkycoinTransactionOutput) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Address == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("address") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintTypes(dAtA, i, uint64(len(*m.Address))) + i += copy(dAtA[i:], *m.Address) + } + if m.Coin == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("coin") + } else { + dAtA[i] = 0x10 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Coin)) + } + if m.Hour == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("hour") + } else { + dAtA[i] = 0x18 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Hour)) + } + if m.AddressIndex != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.AddressIndex)) + } + if m.Bip44Addr != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintTypes(dAtA, i, uint64(m.Bip44Addr.Size())) + n5, err := m.Bip44Addr.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Bip44AddrIndex) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Bip44AddrIndex) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.CoinType == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("coin_type") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.CoinType)) + } + if m.Account == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("account") + } else { + dAtA[i] = 0x10 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Account)) + } + if m.Change == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("change") + } else { + dAtA[i] = 0x18 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.Change)) + } + if m.AddressStartIndex == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("address_start_index") + } else { + dAtA[i] = 0x20 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.AddressStartIndex)) + } + if m.AddressN == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("address_n") + } else { + dAtA[i] = 0x28 + i++ + i = encodeVarintTypes(dAtA, i, uint64(*m.AddressN)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *HDNodeType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Depth != nil { + n += 1 + sovTypes(uint64(*m.Depth)) + } + if m.Fingerprint != nil { + n += 1 + sovTypes(uint64(*m.Fingerprint)) + } + if m.ChildNum != nil { + n += 1 + sovTypes(uint64(*m.ChildNum)) + } + if m.ChainCode != nil { + l = len(m.ChainCode) + n += 1 + l + sovTypes(uint64(l)) + } + if m.PrivateKey != nil { + l = len(m.PrivateKey) + n += 1 + l + sovTypes(uint64(l)) + } + if m.PublicKey != nil { + l = len(m.PublicKey) + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *HDNodePathType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Node != nil { + l = m.Node.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.AddressN) > 0 { + for _, e := range m.AddressN { + n += 1 + sovTypes(uint64(e)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *CoinType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CoinName != nil { + l = len(*m.CoinName) + n += 1 + l + sovTypes(uint64(l)) + } + if m.CoinShortcut != nil { + l = len(*m.CoinShortcut) + n += 1 + l + sovTypes(uint64(l)) + } + if m.AddressType != nil { + n += 1 + sovTypes(uint64(*m.AddressType)) + } + if m.MaxfeeKb != nil { + n += 1 + sovTypes(uint64(*m.MaxfeeKb)) + } + if m.AddressTypeP2Sh != nil { + n += 1 + sovTypes(uint64(*m.AddressTypeP2Sh)) + } + if m.SignedMessageHeader != nil { + l = len(*m.SignedMessageHeader) + n += 1 + l + sovTypes(uint64(l)) + } + if m.XpubMagic != nil { + n += 1 + sovTypes(uint64(*m.XpubMagic)) + } + if m.XprvMagic != nil { + n += 1 + sovTypes(uint64(*m.XprvMagic)) + } + if m.Segwit != nil { + n += 2 + } + if m.Forkid != nil { + n += 1 + sovTypes(uint64(*m.Forkid)) + } + if m.ForceBip143 != nil { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *MultisigRedeemScriptType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Pubkeys) > 0 { + for _, e := range m.Pubkeys { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.Signatures) > 0 { + for _, b := range m.Signatures { + l = len(b) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.M != nil { + n += 1 + sovTypes(uint64(*m.M)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxInputType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AddressN) > 0 { + for _, e := range m.AddressN { + n += 1 + sovTypes(uint64(e)) + } + } + if m.PrevHash != nil { + l = len(m.PrevHash) + n += 1 + l + sovTypes(uint64(l)) + } + if m.PrevIndex != nil { + n += 1 + sovTypes(uint64(*m.PrevIndex)) + } + if m.ScriptSig != nil { + l = len(m.ScriptSig) + n += 1 + l + sovTypes(uint64(l)) + } + if m.Sequence != nil { + n += 1 + sovTypes(uint64(*m.Sequence)) + } + if m.ScriptType != nil { + n += 1 + sovTypes(uint64(*m.ScriptType)) + } + if m.Multisig != nil { + l = m.Multisig.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.Amount != nil { + n += 1 + sovTypes(uint64(*m.Amount)) + } + if m.DecredTree != nil { + n += 1 + sovTypes(uint64(*m.DecredTree)) + } + if m.DecredScriptVersion != nil { + n += 1 + sovTypes(uint64(*m.DecredScriptVersion)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxOutputType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Address != nil { + l = len(*m.Address) + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.AddressN) > 0 { + for _, e := range m.AddressN { + n += 1 + sovTypes(uint64(e)) + } + } + if m.Amount != nil { + n += 1 + sovTypes(uint64(*m.Amount)) + } + if m.ScriptType != nil { + n += 1 + sovTypes(uint64(*m.ScriptType)) + } + if m.Multisig != nil { + l = m.Multisig.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.OpReturnData != nil { + l = len(m.OpReturnData) + n += 1 + l + sovTypes(uint64(l)) + } + if m.DecredScriptVersion != nil { + n += 1 + sovTypes(uint64(*m.DecredScriptVersion)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxOutputBinType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Amount != nil { + n += 1 + sovTypes(uint64(*m.Amount)) + } + if m.ScriptPubkey != nil { + l = len(m.ScriptPubkey) + n += 1 + l + sovTypes(uint64(l)) + } + if m.DecredScriptVersion != nil { + n += 1 + sovTypes(uint64(*m.DecredScriptVersion)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TransactionType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Version != nil { + n += 1 + sovTypes(uint64(*m.Version)) + } + if len(m.Inputs) > 0 { + for _, e := range m.Inputs { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.BinOutputs) > 0 { + for _, e := range m.BinOutputs { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.LockTime != nil { + n += 1 + sovTypes(uint64(*m.LockTime)) + } + if len(m.Outputs) > 0 { + for _, e := range m.Outputs { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.InputsCnt != nil { + n += 1 + sovTypes(uint64(*m.InputsCnt)) + } + if m.OutputsCnt != nil { + n += 1 + sovTypes(uint64(*m.OutputsCnt)) + } + if m.ExtraData != nil { + l = len(m.ExtraData) + n += 1 + l + sovTypes(uint64(l)) + } + if m.ExtraDataLen != nil { + n += 1 + sovTypes(uint64(*m.ExtraDataLen)) + } + if m.DecredExpiry != nil { + n += 1 + sovTypes(uint64(*m.DecredExpiry)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxRequestDetailsType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.RequestIndex != nil { + n += 1 + sovTypes(uint64(*m.RequestIndex)) + } + if m.TxHash != nil { + l = len(m.TxHash) + n += 1 + l + sovTypes(uint64(l)) + } + if m.ExtraDataLen != nil { + n += 1 + sovTypes(uint64(*m.ExtraDataLen)) + } + if m.ExtraDataOffset != nil { + n += 1 + sovTypes(uint64(*m.ExtraDataOffset)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TxRequestSerializedType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SignatureIndex != nil { + n += 1 + sovTypes(uint64(*m.SignatureIndex)) + } + if m.Signature != nil { + l = len(m.Signature) + n += 1 + l + sovTypes(uint64(l)) + } + if m.SerializedTx != nil { + l = len(m.SerializedTx) + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *IdentityType) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Proto != nil { + l = len(*m.Proto) + n += 1 + l + sovTypes(uint64(l)) + } + if m.User != nil { + l = len(*m.User) + n += 1 + l + sovTypes(uint64(l)) + } + if m.Host != nil { + l = len(*m.Host) + n += 1 + l + sovTypes(uint64(l)) + } + if m.Port != nil { + l = len(*m.Port) + n += 1 + l + sovTypes(uint64(l)) + } + if m.Path != nil { + l = len(*m.Path) + n += 1 + l + sovTypes(uint64(l)) + } + if m.Index != nil { + n += 1 + sovTypes(uint64(*m.Index)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SkycoinTransactionInput) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.HashIn != nil { + l = len(*m.HashIn) + n += 1 + l + sovTypes(uint64(l)) + } + if m.Index != nil { + n += 1 + sovTypes(uint64(*m.Index)) + } + if m.Bip44Addr != nil { + l = m.Bip44Addr.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SkycoinTransactionOutput) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Address != nil { + l = len(*m.Address) + n += 1 + l + sovTypes(uint64(l)) + } + if m.Coin != nil { + n += 1 + sovTypes(uint64(*m.Coin)) + } + if m.Hour != nil { + n += 1 + sovTypes(uint64(*m.Hour)) + } + if m.AddressIndex != nil { + n += 1 + sovTypes(uint64(*m.AddressIndex)) + } + if m.Bip44Addr != nil { + l = m.Bip44Addr.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Bip44AddrIndex) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CoinType != nil { + n += 1 + sovTypes(uint64(*m.CoinType)) + } + if m.Account != nil { + n += 1 + sovTypes(uint64(*m.Account)) + } + if m.Change != nil { + n += 1 + sovTypes(uint64(*m.Change)) + } + if m.AddressStartIndex != nil { + n += 1 + sovTypes(uint64(*m.AddressStartIndex)) + } + if m.AddressN != nil { + n += 1 + sovTypes(uint64(*m.AddressN)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovTypes(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozTypes(x uint64) (n int) { + return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *HDNodeType) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HDNodeType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HDNodeType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Depth", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Depth = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Fingerprint", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Fingerprint = &v + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ChildNum", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ChildNum = &v + hasFields[0] |= uint64(0x00000004) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainCode", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainCode = append(m.ChainCode[:0], dAtA[iNdEx:postIndex]...) + if m.ChainCode == nil { + m.ChainCode = []byte{} + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000008) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrivateKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrivateKey = append(m.PrivateKey[:0], dAtA[iNdEx:postIndex]...) + if m.PrivateKey == nil { + m.PrivateKey = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.PublicKey == nil { + m.PublicKey = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("depth") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("fingerprint") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("child_num") + } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("chain_code") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HDNodePathType) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HDNodePathType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HDNodePathType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Node", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Node == nil { + m.Node = &HDNodeType{} + } + if err := m.Node.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType == 0 { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.AddressN) == 0 { + m.AddressN = make([]uint32, 0, elementCount) + } + for iNdEx < postIndex { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field AddressN", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("node") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CoinType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CoinType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CoinType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CoinName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.CoinName = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CoinShortcut", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.CoinShortcut = &s + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AddressType", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressType = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxfeeKb", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MaxfeeKb = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AddressTypeP2Sh", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressTypeP2Sh = &v + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignedMessageHeader", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.SignedMessageHeader = &s + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field XpubMagic", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.XpubMagic = &v + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field XprvMagic", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.XprvMagic = &v + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Segwit", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Segwit = &b + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Forkid", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Forkid = &v + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ForceBip143", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.ForceBip143 = &b + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MultisigRedeemScriptType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MultisigRedeemScriptType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MultisigRedeemScriptType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pubkeys", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pubkeys = append(m.Pubkeys, &HDNodePathType{}) + if err := m.Pubkeys[len(m.Pubkeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signatures = append(m.Signatures, make([]byte, postIndex-iNdEx)) + copy(m.Signatures[len(m.Signatures)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field M", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.M = &v + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxInputType) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxInputType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxInputType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.AddressN) == 0 { + m.AddressN = make([]uint32, 0, elementCount) + } + for iNdEx < postIndex { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field AddressN", wireType) + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevHash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrevHash = append(m.PrevHash[:0], dAtA[iNdEx:postIndex]...) + if m.PrevHash == nil { + m.PrevHash = []byte{} + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevIndex", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PrevIndex = &v + hasFields[0] |= uint64(0x00000002) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScriptSig", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ScriptSig = append(m.ScriptSig[:0], dAtA[iNdEx:postIndex]...) + if m.ScriptSig == nil { + m.ScriptSig = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Sequence = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ScriptType", wireType) + } + var v InputScriptType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (InputScriptType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ScriptType = &v + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Multisig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Multisig == nil { + m.Multisig = &MultisigRedeemScriptType{} + } + if err := m.Multisig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Amount = &v + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DecredTree", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DecredTree = &v + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DecredScriptVersion", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DecredScriptVersion = &v + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("prev_hash") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("prev_index") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxOutputType) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxOutputType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxOutputType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Address = &s + iNdEx = postIndex + case 2: + if wireType == 0 { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.AddressN) == 0 { + m.AddressN = make([]uint32, 0, elementCount) + } + for iNdEx < postIndex { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = append(m.AddressN, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field AddressN", wireType) + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Amount = &v + hasFields[0] |= uint64(0x00000001) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ScriptType", wireType) + } + var v OutputScriptType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (OutputScriptType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ScriptType = &v + hasFields[0] |= uint64(0x00000002) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Multisig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Multisig == nil { + m.Multisig = &MultisigRedeemScriptType{} + } + if err := m.Multisig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OpReturnData", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OpReturnData = append(m.OpReturnData[:0], dAtA[iNdEx:postIndex]...) + if m.OpReturnData == nil { + m.OpReturnData = []byte{} + } + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DecredScriptVersion", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DecredScriptVersion = &v + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("amount") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("script_type") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxOutputBinType) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxOutputBinType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxOutputBinType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Amount = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScriptPubkey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ScriptPubkey = append(m.ScriptPubkey[:0], dAtA[iNdEx:postIndex]...) + if m.ScriptPubkey == nil { + m.ScriptPubkey = []byte{} + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DecredScriptVersion", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DecredScriptVersion = &v + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("amount") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("script_pubkey") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TransactionType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TransactionType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TransactionType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Version = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Inputs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Inputs = append(m.Inputs, &TxInputType{}) + if err := m.Inputs[len(m.Inputs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BinOutputs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BinOutputs = append(m.BinOutputs, &TxOutputBinType{}) + if err := m.BinOutputs[len(m.BinOutputs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LockTime", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LockTime = &v + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Outputs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Outputs = append(m.Outputs, &TxOutputType{}) + if err := m.Outputs[len(m.Outputs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InputsCnt", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InputsCnt = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutputsCnt", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutputsCnt = &v + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraData", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExtraData = append(m.ExtraData[:0], dAtA[iNdEx:postIndex]...) + if m.ExtraData == nil { + m.ExtraData = []byte{} + } + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraDataLen", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ExtraDataLen = &v + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DecredExpiry", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DecredExpiry = &v + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxRequestDetailsType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxRequestDetailsType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxRequestDetailsType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestIndex", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RequestIndex = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TxHash", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TxHash = append(m.TxHash[:0], dAtA[iNdEx:postIndex]...) + if m.TxHash == nil { + m.TxHash = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraDataLen", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ExtraDataLen = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtraDataOffset", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ExtraDataOffset = &v + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TxRequestSerializedType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TxRequestSerializedType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TxRequestSerializedType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SignatureIndex", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.SignatureIndex = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SerializedTx", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SerializedTx = append(m.SerializedTx[:0], dAtA[iNdEx:postIndex]...) + if m.SerializedTx == nil { + m.SerializedTx = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IdentityType) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IdentityType: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IdentityType: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proto", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Proto = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.User = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Host", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Host = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Port = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Path = &s + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Index = &v + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SkycoinTransactionInput) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SkycoinTransactionInput: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SkycoinTransactionInput: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HashIn", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.HashIn = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Index = &v + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bip44Addr", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Bip44Addr == nil { + m.Bip44Addr = &Bip44AddrIndex{} + } + if err := m.Bip44Addr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("hashIn") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SkycoinTransactionOutput) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SkycoinTransactionOutput: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SkycoinTransactionOutput: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Address = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Coin", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Coin = &v + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hour", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Hour = &v + hasFields[0] |= uint64(0x00000004) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AddressIndex", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressIndex = &v + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bip44Addr", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Bip44Addr == nil { + m.Bip44Addr = &Bip44AddrIndex{} + } + if err := m.Bip44Addr.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("address") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("coin") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("hour") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Bip44AddrIndex) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Bip44AddrIndex: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Bip44AddrIndex: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CoinType", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CoinType = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Account", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Account = &v + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Change", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Change = &v + hasFields[0] |= uint64(0x00000004) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AddressStartIndex", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressStartIndex = &v + hasFields[0] |= uint64(0x00000008) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AddressN", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AddressN = &v + hasFields[0] |= uint64(0x00000010) + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("coin_type") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("account") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("change") + } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("address_start_index") + } + if hasFields[0]&uint64(0x00000010) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("address_n") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTypes(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthTypes + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipTypes(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("types.proto", fileDescriptor_types_0bfb6936339e7e82) } + +var fileDescriptor_types_0bfb6936339e7e82 = []byte{ + // 2320 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0x49, 0x73, 0x23, 0x49, + 0xf5, 0xef, 0x92, 0x64, 0x5b, 0x7a, 0x92, 0xec, 0xec, 0xec, 0xc5, 0xea, 0x99, 0x5e, 0xd4, 0xee, + 0xfe, 0xcf, 0xf8, 0xef, 0x08, 0x34, 0x33, 0x9a, 0x5e, 0x68, 0x07, 0x01, 0xd8, 0x96, 0xdc, 0x56, + 0x4c, 0x5b, 0x56, 0x94, 0xaa, 0x67, 0x0c, 0x97, 0x8a, 0x52, 0x55, 0x5a, 0xca, 0x70, 0x29, 0xab, + 0xc8, 0xca, 0x72, 0x4b, 0x5c, 0x88, 0x20, 0x02, 0x38, 0x71, 0xe1, 0xc2, 0x9d, 0x00, 0x4e, 0x5c, + 0xf8, 0x06, 0xdc, 0xe0, 0x48, 0xb0, 0x5e, 0x89, 0xf9, 0x0c, 0x7c, 0x00, 0x22, 0x97, 0xd2, 0xe2, + 0x6e, 0x43, 0xdf, 0x94, 0xbf, 0xdf, 0xcb, 0x97, 0x6f, 0xcf, 0x54, 0x41, 0x59, 0x4c, 0x63, 0x92, + 0x34, 0x62, 0x1e, 0x89, 0xe8, 0x83, 0xfa, 0x30, 0x8a, 0x86, 0x21, 0xf9, 0x44, 0xad, 0x06, 0xe9, + 0xd9, 0x27, 0x01, 0x49, 0x7c, 0x4e, 0x63, 0x11, 0x71, 0x2d, 0xb1, 0xf5, 0x07, 0x0b, 0xe0, 0xa8, + 0xd5, 0x8d, 0x02, 0xe2, 0x4c, 0x63, 0x82, 0x6f, 0xc2, 0x4a, 0x40, 0x62, 0x31, 0xaa, 0x59, 0xf5, + 0xdc, 0x76, 0xd5, 0xd6, 0x0b, 0x5c, 0x87, 0xf2, 0x19, 0x65, 0x43, 0xc2, 0x63, 0x4e, 0x99, 0xa8, + 0xe5, 0x14, 0xb7, 0x08, 0xe1, 0x0f, 0xa1, 0xe4, 0x8f, 0x68, 0x18, 0xb8, 0x2c, 0x1d, 0xd7, 0xf2, + 0x8a, 0x2f, 0x2a, 0xa0, 0x9b, 0x8e, 0xf1, 0x3d, 0x00, 0x7f, 0xe4, 0x51, 0xe6, 0xfa, 0x51, 0x40, + 0x6a, 0x85, 0x7a, 0x6e, 0xbb, 0x62, 0x97, 0x14, 0x72, 0x10, 0x05, 0x04, 0x3f, 0x80, 0x72, 0xcc, + 0xe9, 0x85, 0x27, 0x88, 0x7b, 0x4e, 0xa6, 0xb5, 0x95, 0xba, 0xb5, 0x5d, 0xb1, 0xc1, 0x40, 0x5f, + 0x90, 0xa9, 0xdc, 0x1f, 0xa7, 0x83, 0x90, 0xfa, 0x8a, 0x5f, 0x55, 0x7c, 0x49, 0x23, 0x5f, 0x90, + 0xe9, 0x56, 0x17, 0xd6, 0xb5, 0x07, 0x3d, 0x4f, 0x8c, 0x94, 0x17, 0x0f, 0xa0, 0xc0, 0xe4, 0x51, + 0xd2, 0x89, 0x72, 0xb3, 0xdc, 0x98, 0x3b, 0x68, 0x2b, 0x42, 0x9a, 0xeb, 0x05, 0x01, 0x27, 0x49, + 0xe2, 0xb2, 0x5a, 0xae, 0x9e, 0x97, 0xe6, 0x1a, 0xa0, 0xbb, 0xf5, 0xcb, 0x3c, 0x14, 0x0f, 0x22, + 0xca, 0x94, 0x2a, 0xe9, 0x58, 0x44, 0x99, 0xcb, 0xbc, 0xb1, 0xd4, 0x67, 0x6d, 0x97, 0xec, 0xa2, + 0x04, 0xba, 0xde, 0x98, 0xe0, 0x47, 0x50, 0x55, 0x64, 0x32, 0x8a, 0xb8, 0xf0, 0x53, 0x19, 0x19, + 0x29, 0x50, 0x91, 0x60, 0xdf, 0x60, 0xf8, 0x31, 0x54, 0xb2, 0xb3, 0x64, 0x6a, 0x6a, 0xf9, 0xba, + 0xb5, 0x5d, 0xdd, 0xb5, 0x3e, 0xb5, 0xcb, 0x06, 0xce, 0xce, 0x19, 0x7b, 0x93, 0x33, 0x42, 0xdc, + 0xf3, 0x41, 0xad, 0x50, 0xb7, 0xb6, 0x0b, 0x76, 0x51, 0x03, 0x5f, 0x0c, 0xf0, 0x37, 0xe0, 0xfa, + 0xa2, 0x0a, 0x37, 0x6e, 0x26, 0x23, 0x15, 0xa7, 0xea, 0xae, 0xf5, 0xd4, 0xde, 0x58, 0xd0, 0xd3, + 0x6b, 0x26, 0x23, 0xdc, 0x84, 0x5b, 0x09, 0x1d, 0x32, 0x12, 0xb8, 0x63, 0x92, 0x24, 0xde, 0x90, + 0xb8, 0x23, 0xe2, 0x05, 0x84, 0xd7, 0x8a, 0xca, 0xbc, 0x1b, 0x9a, 0x3c, 0xd6, 0xdc, 0x91, 0xa2, + 0xf0, 0xc7, 0x00, 0x93, 0x38, 0x1d, 0xb8, 0x63, 0x6f, 0x48, 0xfd, 0x5a, 0x49, 0xe9, 0x2e, 0x3e, + 0x7f, 0xf6, 0xe9, 0xb3, 0xe7, 0x9f, 0x3f, 0xfd, 0xa6, 0x5d, 0x92, 0xdc, 0xb1, 0xa4, 0xb4, 0x20, + 0xbf, 0x30, 0x82, 0x30, 0x17, 0x7c, 0xd6, 0x7c, 0xfe, 0x4c, 0x0a, 0xf2, 0x0b, 0x2d, 0x78, 0x1b, + 0x56, 0x13, 0x32, 0x7c, 0x43, 0x45, 0xad, 0x5c, 0xb7, 0xb6, 0x8b, 0xb6, 0x59, 0x49, 0xfc, 0x2c, + 0xe2, 0xe7, 0x34, 0xa8, 0x55, 0xe4, 0x66, 0xdb, 0xac, 0xf0, 0x43, 0xa8, 0x9c, 0x45, 0xdc, 0x27, + 0xee, 0x80, 0xc6, 0x9f, 0x3d, 0xf9, 0xbc, 0x56, 0x55, 0xbb, 0xca, 0x0a, 0xdb, 0x57, 0xd0, 0x56, + 0x02, 0xb5, 0xe3, 0x34, 0x14, 0x34, 0xa1, 0x43, 0x9b, 0x04, 0x84, 0x8c, 0xfb, 0xaa, 0x98, 0x55, + 0x00, 0xff, 0x1f, 0xd6, 0xe2, 0x74, 0x70, 0x4e, 0xa6, 0x49, 0xcd, 0xaa, 0xe7, 0xb7, 0xcb, 0xcd, + 0x8d, 0xc6, 0x72, 0x55, 0xd8, 0x19, 0x8f, 0xef, 0x03, 0xc8, 0x10, 0x78, 0x22, 0xe5, 0x24, 0x51, + 0xe9, 0xaf, 0xd8, 0x0b, 0x08, 0xae, 0x80, 0x35, 0xd6, 0x69, 0xb2, 0xad, 0xf1, 0xd6, 0x2f, 0xf2, + 0x50, 0x76, 0x26, 0x1d, 0x16, 0xa7, 0x22, 0xcb, 0xd4, 0xbc, 0x76, 0xac, 0xe5, 0xda, 0x91, 0x64, + 0xcc, 0xc9, 0x85, 0x3b, 0xf2, 0x92, 0x91, 0xea, 0x93, 0x8a, 0x5d, 0x94, 0xc0, 0x91, 0x97, 0x8c, + 0x54, 0x1d, 0x4b, 0x92, 0xb2, 0x80, 0x4c, 0x4c, 0x97, 0x28, 0xf1, 0x8e, 0x04, 0x24, 0xad, 0x9b, + 0xd3, 0x4d, 0xe8, 0x50, 0xd5, 0x40, 0xc5, 0x2e, 0x69, 0xa4, 0x4f, 0x87, 0xf8, 0x23, 0x28, 0x26, + 0xe4, 0x07, 0x29, 0x61, 0x3e, 0x31, 0xb9, 0x87, 0x27, 0xcd, 0x17, 0x4f, 0x5e, 0x3c, 0x7b, 0xde, + 0x7c, 0xf1, 0xd4, 0x9e, 0x71, 0xf8, 0x3b, 0x50, 0x36, 0x6a, 0x54, 0xb9, 0xc9, 0x76, 0x59, 0x6f, + 0xa2, 0x86, 0x72, 0x60, 0x1e, 0xaf, 0xdd, 0x4a, 0xbf, 0xd7, 0xee, 0xb6, 0xf6, 0x5a, 0x2d, 0xbb, + 0xdd, 0xef, 0xdb, 0xe6, 0x64, 0xe5, 0xe0, 0x53, 0x28, 0x8e, 0x4d, 0x94, 0x6b, 0x6b, 0x75, 0x6b, + 0xbb, 0xdc, 0xbc, 0xd3, 0xb8, 0x2a, 0xec, 0xf6, 0x4c, 0x54, 0xe6, 0xd5, 0x1b, 0x47, 0x29, 0x13, + 0xaa, 0xcc, 0x0a, 0xb6, 0x59, 0xc9, 0xf6, 0x0e, 0x88, 0xcf, 0x49, 0xe0, 0x0a, 0x4e, 0x88, 0x2e, + 0x2d, 0x1b, 0x34, 0xe4, 0x70, 0x42, 0x64, 0xb9, 0x1a, 0x01, 0x63, 0xf7, 0x05, 0xe1, 0x09, 0x8d, + 0x98, 0x2e, 0x2e, 0xfb, 0x86, 0x26, 0xf5, 0x99, 0x5f, 0x6a, 0x6a, 0xeb, 0x57, 0x39, 0xa8, 0x38, + 0x93, 0x93, 0x54, 0x64, 0x59, 0xa9, 0xc1, 0x9a, 0x49, 0x82, 0xe9, 0xd2, 0x6c, 0xf9, 0x5f, 0x7b, + 0x7d, 0xc1, 0x68, 0x99, 0x8e, 0xb9, 0xd1, 0xcd, 0xe5, 0x20, 0xca, 0x99, 0xb5, 0xde, 0xbc, 0xde, + 0xd0, 0x07, 0x2e, 0xb8, 0x7f, 0x55, 0xdc, 0x56, 0xde, 0x3f, 0x6e, 0x8f, 0x61, 0x3d, 0x8a, 0x5d, + 0x4e, 0x44, 0xca, 0x99, 0x1b, 0x78, 0xc2, 0x33, 0x13, 0xae, 0x12, 0xc5, 0xb6, 0x02, 0x5b, 0x9e, + 0xf0, 0xae, 0x0e, 0xd2, 0xda, 0xd5, 0x41, 0xfa, 0xb1, 0x05, 0x1b, 0x59, 0x90, 0xf6, 0xcd, 0x3c, + 0x9b, 0x3b, 0x6c, 0x2d, 0x39, 0xfc, 0x08, 0xaa, 0x46, 0xb1, 0xee, 0x12, 0x53, 0xbc, 0x15, 0x0d, + 0xf6, 0x14, 0x76, 0xb5, 0x11, 0xf9, 0xab, 0x8d, 0xf8, 0x77, 0x0e, 0x36, 0x1c, 0xee, 0xb1, 0xc4, + 0xf3, 0x05, 0x8d, 0x58, 0x96, 0xac, 0x6c, 0xa7, 0xa5, 0x76, 0x66, 0x4b, 0xfc, 0x18, 0x56, 0xa9, + 0x2c, 0x54, 0xdd, 0x96, 0xe5, 0x66, 0xa5, 0xb1, 0xd0, 0x7a, 0xb6, 0xe1, 0xf0, 0x67, 0x50, 0x1e, + 0x50, 0xe6, 0x46, 0xca, 0xb3, 0xa4, 0x96, 0x57, 0xa2, 0xa8, 0x71, 0xc9, 0x57, 0x1b, 0x06, 0x94, + 0x69, 0x44, 0x55, 0x41, 0x18, 0xf9, 0xe7, 0xae, 0xa0, 0x63, 0xa2, 0x7a, 0xab, 0x6a, 0x17, 0x25, + 0xe0, 0xd0, 0x31, 0xc1, 0x1f, 0xc3, 0x5a, 0xa6, 0x6b, 0x45, 0xe9, 0xaa, 0x36, 0x16, 0x8b, 0xcb, + 0xce, 0x58, 0xd9, 0xa2, 0xda, 0x04, 0xd7, 0x67, 0x42, 0xe5, 0xa9, 0x6a, 0x97, 0x34, 0x72, 0xa0, + 0x4b, 0xdd, 0x48, 0x2a, 0x5e, 0xa7, 0x06, 0x0c, 0x24, 0x05, 0xee, 0x01, 0x90, 0x89, 0xe0, 0x9e, + 0xce, 0x73, 0x51, 0xb7, 0xb8, 0x42, 0x54, 0x92, 0x1f, 0xc3, 0xfa, 0x9c, 0x76, 0x43, 0xc2, 0x4c, + 0xb7, 0x54, 0x66, 0x22, 0xaf, 0x08, 0x93, 0xa9, 0x32, 0x59, 0x20, 0x93, 0x98, 0xf2, 0xa9, 0xe9, + 0x93, 0x8a, 0x06, 0xdb, 0x0a, 0xdb, 0xfa, 0xad, 0x05, 0x37, 0x9d, 0x89, 0x2d, 0x87, 0x42, 0x22, + 0x5a, 0x44, 0x78, 0x34, 0xd4, 0x17, 0xcd, 0x23, 0xa8, 0x72, 0x8d, 0x9a, 0x39, 0xa4, 0x33, 0x50, + 0x31, 0xa0, 0x1e, 0x45, 0x9b, 0xb0, 0x26, 0x26, 0xd9, 0x10, 0x93, 0x46, 0xae, 0x8a, 0x89, 0x1a, + 0x61, 0x6f, 0x5b, 0x98, 0x7f, 0x87, 0x85, 0x3b, 0x70, 0x7d, 0x41, 0x2a, 0x3a, 0x3b, 0x4b, 0x88, + 0x30, 0x41, 0xdf, 0x98, 0x09, 0x9e, 0x28, 0x78, 0xeb, 0x27, 0x16, 0x6c, 0xce, 0x0c, 0xed, 0x13, + 0x4e, 0xbd, 0x90, 0xfe, 0x90, 0x04, 0xca, 0xd6, 0x8f, 0x61, 0x63, 0x36, 0x96, 0x97, 0xac, 0x5d, + 0x9f, 0xc1, 0xda, 0xde, 0xbb, 0x50, 0x9a, 0x21, 0xc6, 0xe2, 0x39, 0xa0, 0x6a, 0x7b, 0xa6, 0xd8, + 0x15, 0x13, 0x65, 0xb3, 0xac, 0xed, 0xf9, 0x69, 0x93, 0xad, 0x9f, 0x5b, 0x50, 0xe9, 0x04, 0x84, + 0x09, 0x2a, 0xa6, 0xd9, 0x53, 0x48, 0x3d, 0x91, 0xcc, 0x3c, 0xd1, 0x0b, 0x8c, 0xa1, 0x90, 0x26, + 0x84, 0x9b, 0x9b, 0x5e, 0xfd, 0x96, 0xd8, 0x28, 0x4a, 0x84, 0x52, 0x5b, 0xb2, 0xd5, 0x6f, 0x89, + 0xc5, 0x11, 0xd7, 0x5e, 0x97, 0x6c, 0xf5, 0x5b, 0x61, 0x9e, 0xd0, 0x37, 0xb7, 0xc4, 0x3c, 0x31, + 0xc2, 0x9b, 0xb0, 0xa2, 0x1d, 0x5b, 0xcd, 0x9e, 0x05, 0x7a, 0xbd, 0xf5, 0x06, 0x36, 0xfb, 0xe7, + 0x53, 0xf9, 0x92, 0x58, 0xe8, 0x1e, 0xd5, 0x0a, 0xb2, 0x87, 0x65, 0x6a, 0x3a, 0x4c, 0xf5, 0x70, + 0xc9, 0x36, 0x2b, 0x69, 0xb1, 0xd6, 0x95, 0x53, 0x41, 0xd2, 0x0b, 0xdc, 0x00, 0x18, 0xd0, 0xf8, + 0xc9, 0x13, 0x57, 0x0e, 0x3d, 0x65, 0xa3, 0xbc, 0x1b, 0xf7, 0x25, 0xb4, 0x17, 0x04, 0x5c, 0x05, + 0xd0, 0x2e, 0x0d, 0xb2, 0xf5, 0xd6, 0xef, 0x2d, 0xa8, 0xbd, 0x7d, 0xb2, 0xee, 0x86, 0xe5, 0x31, + 0x9b, 0x5b, 0x1c, 0xb3, 0x18, 0x0a, 0x72, 0x8b, 0x9a, 0x1b, 0x05, 0x5b, 0xfd, 0xd6, 0x81, 0x49, + 0xb9, 0x99, 0xad, 0xea, 0xb7, 0x4c, 0x46, 0x36, 0x8e, 0xb5, 0xb1, 0xba, 0x2e, 0xb2, 0x37, 0x52, + 0xe7, 0x1d, 0x36, 0xaf, 0xfc, 0x4f, 0x9b, 0x7f, 0x67, 0xc1, 0xfa, 0x32, 0x3b, 0x7b, 0xb8, 0xa9, + 0xf9, 0x6d, 0x99, 0x17, 0x69, 0xf6, 0xaa, 0x93, 0x6e, 0xf8, 0xbe, 0x1a, 0x83, 0xfa, 0x31, 0x9b, + 0x2d, 0x65, 0x6c, 0xfd, 0x91, 0xc7, 0x86, 0xc4, 0xdc, 0xcf, 0x66, 0x85, 0x1b, 0x70, 0x23, 0x33, + 0x3b, 0x11, 0x1e, 0x17, 0x33, 0xe3, 0xa5, 0x50, 0xf6, 0x3a, 0xeb, 0x4b, 0x66, 0x76, 0xfc, 0xfc, + 0xd6, 0x59, 0xd1, 0xc7, 0x67, 0xb7, 0xce, 0xce, 0x6f, 0xf2, 0x50, 0x3e, 0xf4, 0x68, 0x98, 0x72, + 0xfd, 0xea, 0xbe, 0x07, 0x77, 0xcc, 0xd2, 0x7d, 0xcd, 0xc8, 0x24, 0x26, 0xbe, 0x98, 0xbd, 0xcf, + 0x90, 0x85, 0x3f, 0x80, 0xdb, 0x19, 0xbd, 0x9f, 0x0a, 0x11, 0xb1, 0xb6, 0x11, 0x41, 0x39, 0x7c, + 0x0b, 0xae, 0x67, 0x9c, 0x6c, 0xaa, 0x36, 0xe7, 0x11, 0x47, 0x79, 0xfc, 0x21, 0x6c, 0x66, 0xf0, + 0x9e, 0xca, 0xdf, 0x81, 0xc7, 0x7c, 0x12, 0x86, 0x24, 0x40, 0x05, 0xbc, 0x09, 0x37, 0x32, 0xb2, + 0x47, 0xe7, 0xca, 0x56, 0x70, 0x0d, 0x6e, 0x2e, 0x10, 0xf3, 0x2d, 0xab, 0xf8, 0x36, 0xe0, 0x05, + 0xa6, 0xc3, 0x2e, 0xbc, 0x90, 0x06, 0x68, 0x0d, 0xdf, 0x85, 0x5a, 0x86, 0x1b, 0xb0, 0x9f, 0xb5, + 0x1d, 0x2a, 0x2e, 0xe9, 0xe3, 0x91, 0x4f, 0x92, 0x44, 0xdb, 0x57, 0x5a, 0x74, 0xa9, 0x1b, 0x89, + 0x36, 0x8b, 0xd2, 0xe1, 0xe8, 0x30, 0x65, 0x41, 0x82, 0xe0, 0x12, 0xd7, 0x61, 0x54, 0x98, 0x2e, + 0x45, 0xe5, 0x4b, 0xa6, 0x1f, 0xd3, 0x64, 0xec, 0x09, 0x7f, 0x84, 0x2a, 0x8b, 0x21, 0xdc, 0xd3, + 0x61, 0x7e, 0x49, 0x18, 0xe1, 0x9e, 0xf4, 0x1d, 0x55, 0xf1, 0x1d, 0xb8, 0x95, 0xd1, 0x87, 0x94, + 0x8f, 0xdf, 0x78, 0x9c, 0xf4, 0x3c, 0x46, 0x7d, 0xb4, 0xfe, 0x2e, 0x4a, 0x5b, 0xe9, 0xef, 0xfc, + 0xcc, 0x02, 0x74, 0xf9, 0xca, 0xc7, 0x08, 0x2a, 0xbd, 0xbd, 0xef, 0x39, 0x27, 0xe6, 0xe9, 0x84, + 0xae, 0xe1, 0x1b, 0xb0, 0xa1, 0x90, 0xfe, 0x81, 0xdd, 0xe9, 0x39, 0x47, 0x7b, 0xfd, 0x23, 0x64, + 0xe1, 0xeb, 0x50, 0x55, 0xe0, 0xf1, 0xeb, 0x57, 0x4e, 0xa7, 0xdf, 0x79, 0x89, 0x72, 0x33, 0xe8, + 0xa4, 0x67, 0xb7, 0x9d, 0xd7, 0x76, 0x17, 0xe5, 0x67, 0xca, 0xbe, 0xea, 0x38, 0x5d, 0xa9, 0xac, + 0x80, 0x6f, 0x02, 0x52, 0x48, 0xaf, 0xd9, 0x3f, 0xca, 0xd0, 0x95, 0x9d, 0x10, 0x36, 0x2e, 0x3d, + 0xe0, 0xe4, 0xd6, 0xc5, 0x27, 0x1c, 0xba, 0x26, 0xf5, 0x2b, 0x64, 0x76, 0xa4, 0x85, 0x2b, 0x50, + 0x6c, 0x9f, 0x3a, 0x6d, 0xbb, 0xbb, 0xf7, 0x0a, 0xe5, 0x66, 0x5b, 0x32, 0xbd, 0x79, 0x79, 0x9a, + 0x42, 0x16, 0x4f, 0x2b, 0xec, 0xbc, 0x86, 0xb2, 0x19, 0xc8, 0xea, 0xa4, 0x32, 0xac, 0x39, 0xa7, + 0x9d, 0x6e, 0xef, 0xb5, 0x83, 0xae, 0x49, 0x8d, 0xce, 0xe9, 0xc9, 0x6b, 0x47, 0xae, 0x2c, 0x0c, + 0xb0, 0xea, 0x9c, 0x1e, 0xb7, 0x9d, 0x3d, 0x94, 0xc3, 0xeb, 0x00, 0xce, 0xe9, 0x61, 0xa7, 0xdb, + 0xe9, 0x1f, 0xb5, 0x5b, 0x28, 0x8f, 0x37, 0xa0, 0xec, 0x9c, 0xb6, 0x4f, 0x1d, 0x7b, 0xaf, 0xb5, + 0xe7, 0xec, 0xa1, 0xc2, 0xce, 0x1f, 0xf3, 0x70, 0x5d, 0x17, 0xf0, 0xa2, 0xf6, 0x4d, 0xb8, 0xb1, + 0x04, 0xba, 0x27, 0x62, 0x44, 0x38, 0xb2, 0xf0, 0x16, 0xdc, 0x5f, 0x26, 0x0e, 0x09, 0x39, 0xb9, + 0x20, 0xdc, 0x19, 0x71, 0x92, 0x8c, 0xa2, 0x50, 0x96, 0xff, 0x03, 0xf8, 0x70, 0x59, 0xe6, 0x20, + 0x62, 0x67, 0x94, 0x8f, 0x75, 0xd6, 0x50, 0x5e, 0xd6, 0xc5, 0xb2, 0x80, 0x4d, 0x12, 0x22, 0x5a, + 0xe4, 0x82, 0xfa, 0x04, 0x15, 0xde, 0xa6, 0xcd, 0xfe, 0xaf, 0x22, 0x2e, 0x1b, 0xe2, 0x2e, 0xd4, + 0x96, 0xe9, 0xaf, 0x68, 0x4c, 0xcc, 0xe6, 0xd5, 0xb7, 0x37, 0xf7, 0x78, 0x24, 0x88, 0x2f, 0x0e, + 0xbc, 0x30, 0x44, 0x6b, 0xb2, 0xfa, 0x97, 0x69, 0xd9, 0x1a, 0xce, 0x04, 0x15, 0xdf, 0xb6, 0x3a, + 0x2b, 0xbc, 0x83, 0x11, 0xf1, 0xcf, 0x51, 0x49, 0xd6, 0xe4, 0xb2, 0x80, 0xa9, 0x69, 0x04, 0xb2, + 0xb3, 0x2f, 0x1d, 0x9a, 0xfd, 0x11, 0x46, 0x65, 0xfc, 0x08, 0x1e, 0x2c, 0x93, 0xc7, 0x8c, 0x8c, + 0x23, 0x46, 0x7d, 0xe9, 0xcf, 0x81, 0x1c, 0x70, 0xa8, 0xf2, 0xf6, 0xe9, 0x99, 0x90, 0xaa, 0x30, + 0x54, 0xc5, 0x75, 0xb8, 0x7b, 0xe9, 0x08, 0x2f, 0x49, 0xe2, 0x11, 0xf7, 0x12, 0x35, 0xae, 0xd0, + 0xfa, 0xce, 0x8f, 0xe0, 0xa6, 0x6c, 0x3f, 0x4f, 0x70, 0x3a, 0x59, 0xcc, 0x65, 0x1d, 0xee, 0xbe, + 0x0b, 0x77, 0x0f, 0x52, 0xce, 0x09, 0x13, 0xc8, 0xc2, 0x0f, 0xe1, 0xde, 0x3b, 0x25, 0xba, 0xe4, + 0xcd, 0x21, 0xe5, 0x89, 0x40, 0x39, 0x99, 0xf7, 0xab, 0x44, 0xfa, 0xc4, 0x8f, 0x58, 0x80, 0xf2, + 0x3b, 0x67, 0xb0, 0x21, 0x5d, 0x5a, 0x3c, 0xfb, 0x0e, 0xdc, 0xba, 0x04, 0xb9, 0xbd, 0xd0, 0xa3, + 0x0c, 0x5d, 0x93, 0x31, 0xbb, 0x4c, 0x69, 0xf5, 0x2f, 0x90, 0x75, 0x35, 0xf9, 0x0c, 0xe5, 0x76, + 0x7e, 0x6d, 0x01, 0xca, 0x92, 0x73, 0x48, 0xcc, 0xff, 0xc3, 0xbb, 0x50, 0x93, 0xd2, 0x94, 0x93, + 0x97, 0x44, 0xb4, 0x99, 0xe0, 0x51, 0x3c, 0x35, 0x75, 0x83, 0x2c, 0x59, 0xcf, 0x9d, 0x64, 0x4e, + 0xb4, 0x99, 0x37, 0x08, 0xd5, 0xa8, 0x5e, 0x07, 0xe8, 0x24, 0xed, 0x71, 0x1a, 0x7a, 0x22, 0xe2, + 0xa8, 0x80, 0xff, 0x0f, 0x1e, 0x5e, 0x56, 0xed, 0xda, 0x41, 0xdc, 0x22, 0x83, 0x74, 0xd8, 0xa2, + 0x89, 0xde, 0x56, 0x94, 0xe1, 0x78, 0x97, 0xd8, 0x31, 0x19, 0x9b, 0x72, 0x43, 0x68, 0xa7, 0x05, + 0xd8, 0x5c, 0xd9, 0x7b, 0x0b, 0xdf, 0x14, 0x6e, 0x03, 0x5e, 0x58, 0x1a, 0x01, 0x64, 0x5d, 0xc2, + 0xf7, 0xa9, 0x50, 0x78, 0x6e, 0xf7, 0x5b, 0xb0, 0xf6, 0x86, 0xaa, 0x97, 0x16, 0x7e, 0xd8, 0xd0, + 0x5f, 0x8e, 0x1a, 0xd9, 0x97, 0xa3, 0x46, 0x9b, 0xa5, 0xe3, 0x2f, 0xbd, 0x30, 0x25, 0x27, 0xb1, + 0x9c, 0xa9, 0x49, 0xed, 0x2f, 0x3f, 0xcd, 0xeb, 0xff, 0xf5, 0x72, 0x4f, 0x87, 0xed, 0x7e, 0x1b, + 0x8a, 0x6a, 0x77, 0x94, 0x8a, 0xf7, 0xd9, 0xfe, 0x57, 0xb3, 0x5d, 0x1d, 0x79, 0x92, 0x8a, 0xdd, + 0x97, 0x50, 0x55, 0xfb, 0x03, 0xe9, 0xff, 0x7b, 0xda, 0xf0, 0x37, 0xa3, 0xa4, 0x2c, 0x77, 0xaa, + 0xc0, 0x75, 0xd8, 0x6e, 0x07, 0xd6, 0x17, 0x14, 0xbd, 0xa7, 0x39, 0x7f, 0x37, 0x9a, 0x2a, 0x33, + 0x4d, 0xd2, 0xa6, 0xef, 0x42, 0x49, 0xa9, 0x12, 0x94, 0x4d, 0xdf, 0x47, 0xcb, 0x3f, 0x8c, 0x16, + 0x15, 0x09, 0x87, 0xb2, 0xe9, 0xee, 0x2b, 0xd8, 0x50, 0x1a, 0x06, 0x51, 0x24, 0xc2, 0x48, 0x7d, + 0x6a, 0x79, 0x0f, 0x3d, 0xff, 0x34, 0x7a, 0x94, 0x23, 0xfb, 0xb3, 0xad, 0xfb, 0xc7, 0x7f, 0xfa, + 0xfa, 0xbe, 0xf5, 0xe7, 0xaf, 0xef, 0x5b, 0xff, 0xfa, 0xfa, 0xbe, 0x05, 0x1f, 0xf9, 0xd1, 0xb8, + 0x91, 0x78, 0x22, 0x4a, 0x46, 0x34, 0xf4, 0x06, 0x49, 0xa3, 0x7f, 0x3e, 0x7d, 0xe3, 0x85, 0x21, + 0x11, 0x8d, 0x90, 0x0e, 0x66, 0xea, 0xf7, 0xab, 0x33, 0x5c, 0xe6, 0xfb, 0xfb, 0x45, 0xf3, 0x55, + 0x28, 0xf9, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x97, 0x24, 0x5f, 0xfb, 0x2c, 0x14, 0x00, 0x00, +} diff --git a/vendor/github.com/gogo/protobuf/AUTHORS b/vendor/github.com/gogo/protobuf/AUTHORS new file mode 100644 index 00000000..3d97fc7a --- /dev/null +++ b/vendor/github.com/gogo/protobuf/AUTHORS @@ -0,0 +1,15 @@ +# This is the official list of GoGo authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS file, which +# lists people. For example, employees are listed in CONTRIBUTORS, +# but not in AUTHORS, because the employer holds the copyright. + +# Names should be added to this file as one of +# Organization's name +# Individual's name +# Individual's name + +# Please keep the list sorted. + +Sendgrid, Inc +Vastech SA (PTY) LTD +Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/CONTRIBUTORS b/vendor/github.com/gogo/protobuf/CONTRIBUTORS new file mode 100644 index 00000000..1b4f6c20 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/CONTRIBUTORS @@ -0,0 +1,23 @@ +Anton Povarov +Brian Goff +Clayton Coleman +Denis Smirnov +DongYun Kang +Dwayne Schultz +Georg Apitz +Gustav Paul +Johan Brandhorst +John Shahid +John Tuley +Laurent +Patrick Lee +Peter Edge +Roger Johansson +Sam Nguyen +Sergio Arbeo +Stephen J Day +Tamir Duberstein +Todd Eisenberger +Tormod Erevik Lea +Vyacheslav Kim +Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS b/vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS new file mode 100644 index 00000000..b368efb7 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS @@ -0,0 +1,5 @@ +The contributors to the Go protobuf repository: + +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. \ No newline at end of file diff --git a/vendor/github.com/gogo/protobuf/LICENSE b/vendor/github.com/gogo/protobuf/LICENSE new file mode 100644 index 00000000..f57de90d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/LICENSE @@ -0,0 +1,35 @@ +Copyright (c) 2013, The GoGo Authors. All rights reserved. + +Protocol Buffers for Go with Gadgets + +Go support for Protocol Buffers - Google's data interchange format + +Copyright 2010 The Go Authors. All rights reserved. +https://github.com/golang/protobuf + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/gogo/protobuf/proto/clone.go b/vendor/github.com/gogo/protobuf/proto/clone.go new file mode 100644 index 00000000..a26b046d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/clone.go @@ -0,0 +1,258 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "fmt" + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(src Message) Message { + in := reflect.ValueOf(src) + if in.IsNil() { + return src + } + out := reflect.New(in.Type().Elem()) + dst := out.Interface().(Message) + Merge(dst, src) + return dst +} + +// Merger is the interface representing objects that can merge messages of the same type. +type Merger interface { + // Merge merges src into this message. + // Required and optional fields that are set in src will be set to that value in dst. + // Elements of repeated fields will be appended. + // + // Merge may panic if called with a different argument type than the receiver. + Merge(src Message) +} + +// generatedMerger is the custom merge method that generated protos will have. +// We must add this method since a generate Merge method will conflict with +// many existing protos that have a Merge data field already defined. +type generatedMerger interface { + XXX_Merge(src Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + if m, ok := dst.(Merger); ok { + m.Merge(src) + return + } + + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) + } + if in.IsNil() { + return // Merge from nil src is a noop + } + if m, ok := dst.(generatedMerger); ok { + m.XXX_Merge(src) + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, ok := in.Addr().Interface().(extensionsBytes); ok { + emOut := out.Addr().Interface().(extensionsBytes) + bIn := emIn.GetExtensions() + bOut := emOut.GetExtensions() + *bOut = append(*bOut, *bIn...) + } else if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/custom_gogo.go b/vendor/github.com/gogo/protobuf/proto/custom_gogo.go new file mode 100644 index 00000000..24552483 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/custom_gogo.go @@ -0,0 +1,39 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import "reflect" + +type custom interface { + Marshal() ([]byte, error) + Unmarshal(data []byte) error + Size() int +} + +var customType = reflect.TypeOf((*custom)(nil)).Elem() diff --git a/vendor/github.com/gogo/protobuf/proto/decode.go b/vendor/github.com/gogo/protobuf/proto/decode.go new file mode 100644 index 00000000..63b0f08b --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/decode.go @@ -0,0 +1,427 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +// Unmarshal implementations should not clear the receiver. +// Any unmarshaled data should be merged into the receiver. +// Callers of Unmarshal that do not want to retain existing data +// should Reset the receiver before calling Unmarshal. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// newUnmarshaler is the interface representing objects that can +// unmarshal themselves. The semantics are identical to Unmarshaler. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newUnmarshaler interface { + XXX_Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +// StartGroup tag is already consumed. This function consumes +// EndGroup tag. +func (p *Buffer) DecodeGroup(pb Message) error { + b := p.buf[p.index:] + x, y := findEndGroup(b) + if x < 0 { + return io.ErrUnexpectedEOF + } + err := Unmarshal(b[:x], pb) + p.index += y + return err +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(newUnmarshaler); ok { + err := u.XXX_Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + // Slow workaround for messages that aren't Unmarshalers. + // This includes some hand-coded .pb.go files and + // bootstrap protos. + // TODO: fix all of those and then add Unmarshal to + // the Message interface. Then: + // The cast above and code below can be deleted. + // The old unmarshaler can be deleted. + // Clients can call Unmarshal directly (can already do that, actually). + var info InternalMessageInfo + err := info.Unmarshal(pb, p.buf[p.index:]) + p.index = len(p.buf) + return err +} diff --git a/vendor/github.com/gogo/protobuf/proto/deprecated.go b/vendor/github.com/gogo/protobuf/proto/deprecated.go new file mode 100644 index 00000000..35b882c0 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/deprecated.go @@ -0,0 +1,63 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2018 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import "errors" + +// Deprecated: do not use. +type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } + +// Deprecated: do not use. +func GetStats() Stats { return Stats{} } + +// Deprecated: do not use. +func MarshalMessageSet(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSet([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func MarshalMessageSetJSON(interface{}) ([]byte, error) { + return nil, errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func UnmarshalMessageSetJSON([]byte, interface{}) error { + return errors.New("proto: not implemented") +} + +// Deprecated: do not use. +func RegisterMessageSetType(Message, int32, string) {} diff --git a/vendor/github.com/gogo/protobuf/proto/discard.go b/vendor/github.com/gogo/protobuf/proto/discard.go new file mode 100644 index 00000000..fe1bd7d9 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/discard.go @@ -0,0 +1,350 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +type generatedDiscarder interface { + XXX_DiscardUnknown() +} + +// DiscardUnknown recursively discards all unknown fields from this message +// and all embedded messages. +// +// When unmarshaling a message with unrecognized fields, the tags and values +// of such fields are preserved in the Message. This allows a later call to +// marshal to be able to produce a message that continues to have those +// unrecognized fields. To avoid this, DiscardUnknown is used to +// explicitly clear the unknown fields after unmarshaling. +// +// For proto2 messages, the unknown fields of message extensions are only +// discarded from messages that have been accessed via GetExtension. +func DiscardUnknown(m Message) { + if m, ok := m.(generatedDiscarder); ok { + m.XXX_DiscardUnknown() + return + } + // TODO: Dynamically populate a InternalMessageInfo for legacy messages, + // but the master branch has no implementation for InternalMessageInfo, + // so it would be more work to replicate that approach. + discardLegacy(m) +} + +// DiscardUnknown recursively discards all unknown fields. +func (a *InternalMessageInfo) DiscardUnknown(m Message) { + di := atomicLoadDiscardInfo(&a.discard) + if di == nil { + di = getDiscardInfo(reflect.TypeOf(m).Elem()) + atomicStoreDiscardInfo(&a.discard, di) + } + di.discard(toPointer(&m)) +} + +type discardInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []discardFieldInfo + unrecognized field +} + +type discardFieldInfo struct { + field field // Offset of field, guaranteed to be valid + discard func(src pointer) +} + +var ( + discardInfoMap = map[reflect.Type]*discardInfo{} + discardInfoLock sync.Mutex +) + +func getDiscardInfo(t reflect.Type) *discardInfo { + discardInfoLock.Lock() + defer discardInfoLock.Unlock() + di := discardInfoMap[t] + if di == nil { + di = &discardInfo{typ: t} + discardInfoMap[t] = di + } + return di +} + +func (di *discardInfo) discard(src pointer) { + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&di.initialized) == 0 { + di.computeDiscardInfo() + } + + for _, fi := range di.fields { + sfp := src.offset(fi.field) + fi.discard(sfp) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { + // Ignore lock since DiscardUnknown is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + DiscardUnknown(m) + } + } + } + + if di.unrecognized.IsValid() { + *src.offset(di.unrecognized).toBytes() = nil + } +} + +func (di *discardInfo) computeDiscardInfo() { + di.lock.Lock() + defer di.lock.Unlock() + if di.initialized != 0 { + return + } + t := di.typ + n := t.NumField() + + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + dfi := discardFieldInfo{field: toField(&f)} + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) + case isSlice: // E.g., []*pb.T + discardInfo := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sps := src.getPointerSlice() + for _, sp := range sps { + if !sp.isNil() { + discardInfo.discard(sp) + } + } + } + default: // E.g., *pb.T + discardInfo := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sp := src.getPointer() + if !sp.isNil() { + discardInfo.discard(sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) + default: // E.g., map[K]V + if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) + dfi.discard = func(src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + DiscardUnknown(val.Interface().(Message)) + } + } + } else { + dfi.discard = func(pointer) {} // Noop + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) + default: // E.g., interface{} + // TODO: Make this faster? + dfi.discard = func(src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + DiscardUnknown(sv.Interface().(Message)) + } + } + } + } + default: + continue + } + di.fields = append(di.fields, dfi) + } + + di.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + di.unrecognized = toField(&f) + } + + atomic.StoreInt32(&di.initialized, 1) +} + +func discardLegacy(m Message) { + v := reflect.ValueOf(m) + if v.Kind() != reflect.Ptr || v.IsNil() { + return + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return + } + t := v.Type() + + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + vf := v.Field(i) + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) + case isSlice: // E.g., []*pb.T + for j := 0; j < vf.Len(); j++ { + discardLegacy(vf.Index(j).Interface().(Message)) + } + default: // E.g., *pb.T + discardLegacy(vf.Interface().(Message)) + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) + default: // E.g., map[K]V + tv := vf.Type().Elem() + if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) + for _, key := range vf.MapKeys() { + val := vf.MapIndex(key) + discardLegacy(val.Interface().(Message)) + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) + default: // E.g., test_proto.isCommunique_Union interface + if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { + vf = vf.Elem() // E.g., *test_proto.Communique_Msg + if !vf.IsNil() { + vf = vf.Elem() // E.g., test_proto.Communique_Msg + vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value + if vf.Kind() == reflect.Ptr { + discardLegacy(vf.Interface().(Message)) + } + } + } + } + } + } + + if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { + if vf.Type() != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + vf.Set(reflect.ValueOf([]byte(nil))) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(m); err == nil { + // Ignore lock since discardLegacy is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + discardLegacy(m) + } + } + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/duration.go b/vendor/github.com/gogo/protobuf/proto/duration.go new file mode 100644 index 00000000..93464c91 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/duration.go @@ -0,0 +1,100 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// This file implements conversions between google.protobuf.Duration +// and time.Duration. + +import ( + "errors" + "fmt" + "time" +) + +const ( + // Range of a Duration in seconds, as specified in + // google/protobuf/duration.proto. This is about 10,000 years in seconds. + maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) + minSeconds = -maxSeconds +) + +// validateDuration determines whether the Duration is valid according to the +// definition in google/protobuf/duration.proto. A valid Duration +// may still be too large to fit into a time.Duration (the range of Duration +// is about 10,000 years, and the range of time.Duration is about 290). +func validateDuration(d *duration) error { + if d == nil { + return errors.New("duration: nil Duration") + } + if d.Seconds < minSeconds || d.Seconds > maxSeconds { + return fmt.Errorf("duration: %#v: seconds out of range", d) + } + if d.Nanos <= -1e9 || d.Nanos >= 1e9 { + return fmt.Errorf("duration: %#v: nanos out of range", d) + } + // Seconds and Nanos must have the same sign, unless d.Nanos is zero. + if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { + return fmt.Errorf("duration: %#v: seconds and nanos have different signs", d) + } + return nil +} + +// DurationFromProto converts a Duration to a time.Duration. DurationFromProto +// returns an error if the Duration is invalid or is too large to be +// represented in a time.Duration. +func durationFromProto(p *duration) (time.Duration, error) { + if err := validateDuration(p); err != nil { + return 0, err + } + d := time.Duration(p.Seconds) * time.Second + if int64(d/time.Second) != p.Seconds { + return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) + } + if p.Nanos != 0 { + d += time.Duration(p.Nanos) + if (d < 0) != (p.Nanos < 0) { + return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) + } + } + return d, nil +} + +// DurationProto converts a time.Duration to a Duration. +func durationProto(d time.Duration) *duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/duration_gogo.go b/vendor/github.com/gogo/protobuf/proto/duration_gogo.go new file mode 100644 index 00000000..e748e173 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/duration_gogo.go @@ -0,0 +1,49 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2016, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" + "time" +) + +var durationType = reflect.TypeOf((*time.Duration)(nil)).Elem() + +type duration struct { + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` +} + +func (m *duration) Reset() { *m = duration{} } +func (*duration) ProtoMessage() {} +func (*duration) String() string { return "duration" } + +func init() { + RegisterType((*duration)(nil), "gogo.protobuf.proto.duration") +} diff --git a/vendor/github.com/gogo/protobuf/proto/encode.go b/vendor/github.com/gogo/protobuf/proto/encode.go new file mode 100644 index 00000000..9581ccd3 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/encode.go @@ -0,0 +1,205 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "errors" + "reflect" +) + +var ( + // errRepeatedHasNil is the error returned if Marshal is called with + // a struct with a repeated field containing a nil element. + errRepeatedHasNil = errors.New("proto: repeated field has nil element") + + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + + // ErrNil is the error returned if Marshal is called with nil. + ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + switch { + case x < 1<<7: + return 1 + case x < 1<<14: + return 2 + case x < 1<<21: + return 3 + case x < 1<<28: + return 4 + case x < 1<<35: + return 5 + case x < 1<<42: + return 6 + case x < 1<<49: + return 7 + case x < 1<<56: + return 8 + case x < 1<<63: + return 9 + } + return 10 +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + siz := Size(pb) + sizVar := SizeVarint(uint64(siz)) + p.grow(siz + sizVar) + p.EncodeVarint(uint64(siz)) + return p.Marshal(pb) +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} diff --git a/vendor/github.com/gogo/protobuf/proto/encode_gogo.go b/vendor/github.com/gogo/protobuf/proto/encode_gogo.go new file mode 100644 index 00000000..0f5fb173 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/encode_gogo.go @@ -0,0 +1,33 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +func NewRequiredNotSetError(field string) *RequiredNotSetError { + return &RequiredNotSetError{field} +} diff --git a/vendor/github.com/gogo/protobuf/proto/equal.go b/vendor/github.com/gogo/protobuf/proto/equal.go new file mode 100644 index 00000000..d4db5a1c --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/equal.go @@ -0,0 +1,300 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer comparison. + +package proto + +import ( + "bytes" + "log" + "reflect" + "strings" +) + +/* +Equal returns true iff protocol buffers a and b are equal. +The arguments must both be pointers to protocol buffer structs. + +Equality is defined in this way: + - Two messages are equal iff they are the same type, + corresponding fields are equal, unknown field sets + are equal, and extensions sets are equal. + - Two set scalar fields are equal iff their values are equal. + If the fields are of a floating-point type, remember that + NaN != x for all x, including NaN. If the message is defined + in a proto3 .proto file, fields are not "set"; specifically, + zero length proto3 "bytes" fields are equal (nil == {}). + - Two repeated fields are equal iff their lengths are the same, + and their corresponding elements are equal. Note a "bytes" field, + although represented by []byte, is not a repeated field and the + rule for the scalar fields described above applies. + - Two unset fields are equal. + - Two unknown field sets are equal if their current + encoded state is equal. + - Two extension sets are equal iff they have corresponding + elements that are pairwise equal. + - Two map fields are equal iff their lengths are the same, + and they contain the same set of elements. Zero-length map + fields are equal. + - Every other combination of things are not equal. + +The return value is undefined if a and b are not protocol buffers. +*/ +func Equal(a, b Message) bool { + if a == nil || b == nil { + return a == b + } + v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) + if v1.Type() != v2.Type() { + return false + } + if v1.Kind() == reflect.Ptr { + if v1.IsNil() { + return v2.IsNil() + } + if v2.IsNil() { + return false + } + v1, v2 = v1.Elem(), v2.Elem() + } + if v1.Kind() != reflect.Struct { + return false + } + return equalStruct(v1, v2) +} + +// v1 and v2 are known to have the same type. +func equalStruct(v1, v2 reflect.Value) bool { + sprop := GetProperties(v1.Type()) + for i := 0; i < v1.NumField(); i++ { + f := v1.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + f1, f2 := v1.Field(i), v2.Field(i) + if f.Type.Kind() == reflect.Ptr { + if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { + // both unset + continue + } else if n1 != n2 { + // set/unset mismatch + return false + } + f1, f2 = f1.Elem(), f2.Elem() + } + if !equalAny(f1, f2, sprop.Prop[i]) { + return false + } + } + + if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_InternalExtensions") + if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { + return false + } + } + + if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_extensions") + if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { + return false + } + } + + uf := v1.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return true + } + + u1 := uf.Bytes() + u2 := v2.FieldByName("XXX_unrecognized").Bytes() + return bytes.Equal(u1, u2) +} + +// v1 and v2 are known to have the same type. +// prop may be nil. +func equalAny(v1, v2 reflect.Value, prop *Properties) bool { + if v1.Type() == protoMessageType { + m1, _ := v1.Interface().(Message) + m2, _ := v2.Interface().(Message) + return Equal(m1, m2) + } + switch v1.Kind() { + case reflect.Bool: + return v1.Bool() == v2.Bool() + case reflect.Float32, reflect.Float64: + return v1.Float() == v2.Float() + case reflect.Int32, reflect.Int64: + return v1.Int() == v2.Int() + case reflect.Interface: + // Probably a oneof field; compare the inner values. + n1, n2 := v1.IsNil(), v2.IsNil() + if n1 || n2 { + return n1 == n2 + } + e1, e2 := v1.Elem(), v2.Elem() + if e1.Type() != e2.Type() { + return false + } + return equalAny(e1, e2, nil) + case reflect.Map: + if v1.Len() != v2.Len() { + return false + } + for _, key := range v1.MapKeys() { + val2 := v2.MapIndex(key) + if !val2.IsValid() { + // This key was not found in the second map. + return false + } + if !equalAny(v1.MapIndex(key), val2, nil) { + return false + } + } + return true + case reflect.Ptr: + // Maps may have nil values in them, so check for nil. + if v1.IsNil() && v2.IsNil() { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return equalAny(v1.Elem(), v2.Elem(), prop) + case reflect.Slice: + if v1.Type().Elem().Kind() == reflect.Uint8 { + // short circuit: []byte + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value. + if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) + } + + if v1.Len() != v2.Len() { + return false + } + for i := 0; i < v1.Len(); i++ { + if !equalAny(v1.Index(i), v2.Index(i), prop) { + return false + } + } + return true + case reflect.String: + return v1.Interface().(string) == v2.Interface().(string) + case reflect.Struct: + return equalStruct(v1, v2) + case reflect.Uint32, reflect.Uint64: + return v1.Uint() == v2.Uint() + } + + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to compare %v", v1) + return false +} + +// base is the struct type that the extensions are based on. +// x1 and x2 are InternalExtensions. +func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { + em1, _ := x1.extensionsRead() + em2, _ := x2.extensionsRead() + return equalExtMap(base, em1, em2) +} + +func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { + if len(em1) != len(em2) { + return false + } + + for extNum, e1 := range em1 { + e2, ok := em2[extNum] + if !ok { + return false + } + + m1, m2 := e1.value, e2.value + + if m1 == nil && m2 == nil { + // Both have only encoded form. + if bytes.Equal(e1.enc, e2.enc) { + continue + } + // The bytes are different, but the extensions might still be + // equal. We need to decode them to compare. + } + + if m1 != nil && m2 != nil { + // Both are unencoded. + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + continue + } + + // At least one is encoded. To do a semantically correct comparison + // we need to unmarshal them first. + var desc *ExtensionDesc + if m := extensionMaps[base]; m != nil { + desc = m[extNum] + } + if desc == nil { + // If both have only encoded form and the bytes are the same, + // it is handled above. We get here when the bytes are different. + // We don't know how to decode it, so just compare them as byte + // slices. + log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) + return false + } + var err error + if m1 == nil { + m1, err = decodeExtension(e1.enc, desc) + } + if m2 == nil && err == nil { + m2, err = decodeExtension(e2.enc, desc) + } + if err != nil { + // The encoded form is invalid. + log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) + return false + } + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + } + + return true +} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions.go b/vendor/github.com/gogo/protobuf/proto/extensions.go new file mode 100644 index 00000000..341c6f57 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/extensions.go @@ -0,0 +1,605 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Types and routines for supporting protocol buffer extensions. + */ + +import ( + "errors" + "fmt" + "io" + "reflect" + "strconv" + "sync" +) + +// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. +var ErrMissingExtension = errors.New("proto: missing extension") + +// ExtensionRange represents a range of message extensions for a protocol buffer. +// Used in code generated by the protocol compiler. +type ExtensionRange struct { + Start, End int32 // both inclusive +} + +// extendableProto is an interface implemented by any protocol buffer generated by the current +// proto compiler that may be extended. +type extendableProto interface { + Message + ExtensionRangeArray() []ExtensionRange + extensionsWrite() map[int32]Extension + extensionsRead() (map[int32]Extension, sync.Locker) +} + +// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous +// version of the proto compiler that may be extended. +type extendableProtoV1 interface { + Message + ExtensionRangeArray() []ExtensionRange + ExtensionMap() map[int32]Extension +} + +// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. +type extensionAdapter struct { + extendableProtoV1 +} + +func (e extensionAdapter) extensionsWrite() map[int32]Extension { + return e.ExtensionMap() +} + +func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + return e.ExtensionMap(), notLocker{} +} + +// notLocker is a sync.Locker whose Lock and Unlock methods are nops. +type notLocker struct{} + +func (n notLocker) Lock() {} +func (n notLocker) Unlock() {} + +// extendable returns the extendableProto interface for the given generated proto message. +// If the proto message has the old extension format, it returns a wrapper that implements +// the extendableProto interface. +func extendable(p interface{}) (extendableProto, error) { + switch p := p.(type) { + case extendableProto: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return p, nil + case extendableProtoV1: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return extensionAdapter{p}, nil + case extensionsBytes: + return slowExtensionAdapter{p}, nil + } + // Don't allocate a specific error containing %T: + // this is the hot path for Clone and MarshalText. + return nil, errNotExtendable +} + +var errNotExtendable = errors.New("proto: not an extendable proto.Message") + +func isNilPtr(x interface{}) bool { + v := reflect.ValueOf(x) + return v.Kind() == reflect.Ptr && v.IsNil() +} + +// XXX_InternalExtensions is an internal representation of proto extensions. +// +// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, +// thus gaining the unexported 'extensions' method, which can be called only from the proto package. +// +// The methods of XXX_InternalExtensions are not concurrency safe in general, +// but calls to logically read-only methods such as has and get may be executed concurrently. +type XXX_InternalExtensions struct { + // The struct must be indirect so that if a user inadvertently copies a + // generated message and its embedded XXX_InternalExtensions, they + // avoid the mayhem of a copied mutex. + // + // The mutex serializes all logically read-only operations to p.extensionMap. + // It is up to the client to ensure that write operations to p.extensionMap are + // mutually exclusive with other accesses. + p *struct { + mu sync.Mutex + extensionMap map[int32]Extension + } +} + +// extensionsWrite returns the extension map, creating it on first use. +func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { + if e.p == nil { + e.p = new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }) + e.p.extensionMap = make(map[int32]Extension) + } + return e.p.extensionMap +} + +// extensionsRead returns the extensions map for read-only use. It may be nil. +// The caller must hold the returned mutex's lock when accessing Elements within the map. +func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { + if e.p == nil { + return nil, nil + } + return e.p.extensionMap, &e.p.mu +} + +// ExtensionDesc represents an extension specification. +// Used in generated code from the protocol compiler. +type ExtensionDesc struct { + ExtendedType Message // nil pointer to the type that is being extended + ExtensionType interface{} // nil pointer to the extension type + Field int32 // field number + Name string // fully-qualified name of extension, for text formatting + Tag string // protobuf tag style + Filename string // name of the file in which the extension is defined +} + +func (ed *ExtensionDesc) repeated() bool { + t := reflect.TypeOf(ed.ExtensionType) + return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 +} + +// Extension represents an extension in a message. +type Extension struct { + // When an extension is stored in a message using SetExtension + // only desc and value are set. When the message is marshaled + // enc will be set to the encoded form of the message. + // + // When a message is unmarshaled and contains extensions, each + // extension will have only enc set. When such an extension is + // accessed using GetExtension (or GetExtensions) desc and value + // will be set. + desc *ExtensionDesc + value interface{} + enc []byte +} + +// SetRawExtension is for testing only. +func SetRawExtension(base Message, id int32, b []byte) { + if ebase, ok := base.(extensionsBytes); ok { + clearExtension(base, id) + ext := ebase.GetExtensions() + *ext = append(*ext, b...) + return + } + epb, err := extendable(base) + if err != nil { + return + } + extmap := epb.extensionsWrite() + extmap[id] = Extension{enc: b} +} + +// isExtensionField returns true iff the given field number is in an extension range. +func isExtensionField(pb extendableProto, field int32) bool { + for _, er := range pb.ExtensionRangeArray() { + if er.Start <= field && field <= er.End { + return true + } + } + return false +} + +// checkExtensionTypes checks that the given extension is valid for pb. +func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { + var pbi interface{} = pb + // Check the extended type. + if ea, ok := pbi.(extensionAdapter); ok { + pbi = ea.extendableProtoV1 + } + if ea, ok := pbi.(slowExtensionAdapter); ok { + pbi = ea.extensionsBytes + } + if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { + return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) + } + // Check the range. + if !isExtensionField(pb, extension.Field) { + return errors.New("proto: bad extension number; not in declared ranges") + } + return nil +} + +// extPropKey is sufficient to uniquely identify an extension. +type extPropKey struct { + base reflect.Type + field int32 +} + +var extProp = struct { + sync.RWMutex + m map[extPropKey]*Properties +}{ + m: make(map[extPropKey]*Properties), +} + +func extensionProperties(ed *ExtensionDesc) *Properties { + key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} + + extProp.RLock() + if prop, ok := extProp.m[key]; ok { + extProp.RUnlock() + return prop + } + extProp.RUnlock() + + extProp.Lock() + defer extProp.Unlock() + // Check again. + if prop, ok := extProp.m[key]; ok { + return prop + } + + prop := new(Properties) + prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) + extProp.m[key] = prop + return prop +} + +// HasExtension returns whether the given extension is present in pb. +func HasExtension(pb Message, extension *ExtensionDesc) bool { + if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + buf := *ext + o := 0 + for o < len(buf) { + tag, n := DecodeVarint(buf[o:]) + fieldNum := int32(tag >> 3) + if int32(fieldNum) == extension.Field { + return true + } + wireType := int(tag & 0x7) + o += n + l, err := size(buf[o:], wireType) + if err != nil { + return false + } + o += l + } + return false + } + // TODO: Check types, field numbers, etc.? + epb, err := extendable(pb) + if err != nil { + return false + } + extmap, mu := epb.extensionsRead() + if extmap == nil { + return false + } + mu.Lock() + _, ok := extmap[extension.Field] + mu.Unlock() + return ok +} + +// ClearExtension removes the given extension from pb. +func ClearExtension(pb Message, extension *ExtensionDesc) { + clearExtension(pb, extension.Field) +} + +func clearExtension(pb Message, fieldNum int32) { + if epb, ok := pb.(extensionsBytes); ok { + offset := 0 + for offset != -1 { + offset = deleteExtension(epb, fieldNum, offset) + } + return + } + epb, err := extendable(pb) + if err != nil { + return + } + // TODO: Check types, field numbers, etc.? + extmap := epb.extensionsWrite() + delete(extmap, fieldNum) +} + +// GetExtension retrieves a proto2 extended field from pb. +// +// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), +// then GetExtension parses the encoded field and returns a Go value of the specified type. +// If the field is not present, then the default value is returned (if one is specified), +// otherwise ErrMissingExtension is reported. +// +// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), +// then GetExtension returns the raw encoded bytes of the field extension. +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + return decodeExtensionFromBytes(extension, *ext) + } + + epb, err := extendable(pb) + if err != nil { + return nil, err + } + + if extension.ExtendedType != nil { + // can only check type if this is a complete descriptor + if cerr := checkExtensionTypes(epb, extension); cerr != nil { + return nil, cerr + } + } + + emap, mu := epb.extensionsRead() + if emap == nil { + return defaultExtensionValue(extension) + } + mu.Lock() + defer mu.Unlock() + e, ok := emap[extension.Field] + if !ok { + // defaultExtensionValue returns the default value or + // ErrMissingExtension if there is no default. + return defaultExtensionValue(extension) + } + + if e.value != nil { + // Already decoded. Check the descriptor, though. + if e.desc != extension { + // This shouldn't happen. If it does, it means that + // GetExtension was called twice with two different + // descriptors with the same field number. + return nil, errors.New("proto: descriptor conflict") + } + return e.value, nil + } + + if extension.ExtensionType == nil { + // incomplete descriptor + return e.enc, nil + } + + v, err := decodeExtension(e.enc, extension) + if err != nil { + return nil, err + } + + // Remember the decoded version and drop the encoded version. + // That way it is safe to mutate what we return. + e.value = v + e.desc = extension + e.enc = nil + emap[extension.Field] = e + return e.value, nil +} + +// defaultExtensionValue returns the default value for extension. +// If no default for an extension is defined ErrMissingExtension is returned. +func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + if extension.ExtensionType == nil { + // incomplete descriptor, so no default + return nil, ErrMissingExtension + } + + t := reflect.TypeOf(extension.ExtensionType) + props := extensionProperties(extension) + + sf, _, err := fieldDefault(t, props) + if err != nil { + return nil, err + } + + if sf == nil || sf.value == nil { + // There is no default value. + return nil, ErrMissingExtension + } + + if t.Kind() != reflect.Ptr { + // We do not need to return a Ptr, we can directly return sf.value. + return sf.value, nil + } + + // We need to return an interface{} that is a pointer to sf.value. + value := reflect.New(t).Elem() + value.Set(reflect.New(value.Type().Elem())) + if sf.kind == reflect.Int32 { + // We may have an int32 or an enum, but the underlying data is int32. + // Since we can't set an int32 into a non int32 reflect.value directly + // set it as a int32. + value.Elem().SetInt(int64(sf.value.(int32))) + } else { + value.Elem().Set(reflect.ValueOf(sf.value)) + } + return value.Interface(), nil +} + +// decodeExtension decodes an extension encoded in b. +func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { + t := reflect.TypeOf(extension.ExtensionType) + unmarshal := typeUnmarshaler(t, extension.Tag) + + // t is a pointer to a struct, pointer to basic type or a slice. + // Allocate space to store the pointer/slice. + value := reflect.New(t).Elem() + + var err error + for { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + wire := int(x) & 7 + + b, err = unmarshal(b, valToPointer(value.Addr()), wire) + if err != nil { + return nil, err + } + + if len(b) == 0 { + break + } + } + return value.Interface(), nil +} + +// GetExtensions returns a slice of the extensions present in pb that are also listed in es. +// The returned slice has the same length as es; missing extensions will appear as nil elements. +func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + extensions = make([]interface{}, len(es)) + for i, e := range es { + extensions[i], err = GetExtension(epb, e) + if err == ErrMissingExtension { + err = nil + } + if err != nil { + return + } + } + return +} + +// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. +// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing +// just the Field field, which defines the extension's field number. +func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + registeredExtensions := RegisteredExtensions(pb) + + emap, mu := epb.extensionsRead() + if emap == nil { + return nil, nil + } + mu.Lock() + defer mu.Unlock() + extensions := make([]*ExtensionDesc, 0, len(emap)) + for extid, e := range emap { + desc := e.desc + if desc == nil { + desc = registeredExtensions[extid] + if desc == nil { + desc = &ExtensionDesc{Field: extid} + } + } + + extensions = append(extensions, desc) + } + return extensions, nil +} + +// SetExtension sets the specified extension of pb to the specified value. +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + if epb, ok := pb.(extensionsBytes); ok { + ClearExtension(pb, extension) + newb, err := encodeExtension(extension, value) + if err != nil { + return err + } + bb := epb.GetExtensions() + *bb = append(*bb, newb...) + return nil + } + epb, err := extendable(pb) + if err != nil { + return err + } + if err := checkExtensionTypes(epb, extension); err != nil { + return err + } + typ := reflect.TypeOf(extension.ExtensionType) + if typ != reflect.TypeOf(value) { + return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType) + } + // nil extension values need to be caught early, because the + // encoder can't distinguish an ErrNil due to a nil extension + // from an ErrNil due to a missing field. Extensions are + // always optional, so the encoder would just swallow the error + // and drop all the extensions from the encoded message. + if reflect.ValueOf(value).IsNil() { + return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) + } + + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: value} + return nil +} + +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + if epb, doki := pb.(extensionsBytes); doki { + ext := epb.GetExtensions() + *ext = []byte{} + return + } + epb, err := extendable(pb) + if err != nil { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + +// A global registry of extensions. +// The generated code will register the generated descriptors by calling RegisterExtension. + +var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) + +// RegisterExtension is called from the generated code. +func RegisterExtension(desc *ExtensionDesc) { + st := reflect.TypeOf(desc.ExtendedType).Elem() + m := extensionMaps[st] + if m == nil { + m = make(map[int32]*ExtensionDesc) + extensionMaps[st] = m + } + if _, ok := m[desc.Field]; ok { + panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) + } + m[desc.Field] = desc +} + +// RegisteredExtensions returns a map of the registered extensions of a +// protocol buffer struct, indexed by the extension number. +// The argument pb should be a nil pointer to the struct type. +func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { + return extensionMaps[reflect.TypeOf(pb).Elem()] +} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go b/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go new file mode 100644 index 00000000..6f1ae120 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go @@ -0,0 +1,389 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "bytes" + "errors" + "fmt" + "io" + "reflect" + "sort" + "strings" + "sync" +) + +type extensionsBytes interface { + Message + ExtensionRangeArray() []ExtensionRange + GetExtensions() *[]byte +} + +type slowExtensionAdapter struct { + extensionsBytes +} + +func (s slowExtensionAdapter) extensionsWrite() map[int32]Extension { + panic("Please report a bug to github.com/gogo/protobuf if you see this message: Writing extensions is not supported for extensions stored in a byte slice field.") +} + +func (s slowExtensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + b := s.GetExtensions() + m, err := BytesToExtensionsMap(*b) + if err != nil { + panic(err) + } + return m, notLocker{} +} + +func GetBoolExtension(pb Message, extension *ExtensionDesc, ifnotset bool) bool { + if reflect.ValueOf(pb).IsNil() { + return ifnotset + } + value, err := GetExtension(pb, extension) + if err != nil { + return ifnotset + } + if value == nil { + return ifnotset + } + if value.(*bool) == nil { + return ifnotset + } + return *(value.(*bool)) +} + +func (this *Extension) Equal(that *Extension) bool { + if err := this.Encode(); err != nil { + return false + } + if err := that.Encode(); err != nil { + return false + } + return bytes.Equal(this.enc, that.enc) +} + +func (this *Extension) Compare(that *Extension) int { + if err := this.Encode(); err != nil { + return 1 + } + if err := that.Encode(); err != nil { + return -1 + } + return bytes.Compare(this.enc, that.enc) +} + +func SizeOfInternalExtension(m extendableProto) (n int) { + info := getMarshalInfo(reflect.TypeOf(m)) + return info.sizeV1Extensions(m.extensionsWrite()) +} + +type sortableMapElem struct { + field int32 + ext Extension +} + +func newSortableExtensionsFromMap(m map[int32]Extension) sortableExtensions { + s := make(sortableExtensions, 0, len(m)) + for k, v := range m { + s = append(s, &sortableMapElem{field: k, ext: v}) + } + return s +} + +type sortableExtensions []*sortableMapElem + +func (this sortableExtensions) Len() int { return len(this) } + +func (this sortableExtensions) Swap(i, j int) { this[i], this[j] = this[j], this[i] } + +func (this sortableExtensions) Less(i, j int) bool { return this[i].field < this[j].field } + +func (this sortableExtensions) String() string { + sort.Sort(this) + ss := make([]string, len(this)) + for i := range this { + ss[i] = fmt.Sprintf("%d: %v", this[i].field, this[i].ext) + } + return "map[" + strings.Join(ss, ",") + "]" +} + +func StringFromInternalExtension(m extendableProto) string { + return StringFromExtensionsMap(m.extensionsWrite()) +} + +func StringFromExtensionsMap(m map[int32]Extension) string { + return newSortableExtensionsFromMap(m).String() +} + +func StringFromExtensionsBytes(ext []byte) string { + m, err := BytesToExtensionsMap(ext) + if err != nil { + panic(err) + } + return StringFromExtensionsMap(m) +} + +func EncodeInternalExtension(m extendableProto, data []byte) (n int, err error) { + return EncodeExtensionMap(m.extensionsWrite(), data) +} + +func EncodeInternalExtensionBackwards(m extendableProto, data []byte) (n int, err error) { + return EncodeExtensionMapBackwards(m.extensionsWrite(), data) +} + +func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) { + o := 0 + for _, e := range m { + if err := e.Encode(); err != nil { + return 0, err + } + n := copy(data[o:], e.enc) + if n != len(e.enc) { + return 0, io.ErrShortBuffer + } + o += n + } + return o, nil +} + +func EncodeExtensionMapBackwards(m map[int32]Extension, data []byte) (n int, err error) { + o := 0 + end := len(data) + for _, e := range m { + if err := e.Encode(); err != nil { + return 0, err + } + n := copy(data[end-len(e.enc):], e.enc) + if n != len(e.enc) { + return 0, io.ErrShortBuffer + } + end -= n + o += n + } + return o, nil +} + +func GetRawExtension(m map[int32]Extension, id int32) ([]byte, error) { + e := m[id] + if err := e.Encode(); err != nil { + return nil, err + } + return e.enc, nil +} + +func size(buf []byte, wire int) (int, error) { + switch wire { + case WireVarint: + _, n := DecodeVarint(buf) + return n, nil + case WireFixed64: + return 8, nil + case WireBytes: + v, n := DecodeVarint(buf) + return int(v) + n, nil + case WireFixed32: + return 4, nil + case WireStartGroup: + offset := 0 + for { + u, n := DecodeVarint(buf[offset:]) + fwire := int(u & 0x7) + offset += n + if fwire == WireEndGroup { + return offset, nil + } + s, err := size(buf[offset:], wire) + if err != nil { + return 0, err + } + offset += s + } + } + return 0, fmt.Errorf("proto: can't get size for unknown wire type %d", wire) +} + +func BytesToExtensionsMap(buf []byte) (map[int32]Extension, error) { + m := make(map[int32]Extension) + i := 0 + for i < len(buf) { + tag, n := DecodeVarint(buf[i:]) + if n <= 0 { + return nil, fmt.Errorf("unable to decode varint") + } + fieldNum := int32(tag >> 3) + wireType := int(tag & 0x7) + l, err := size(buf[i+n:], wireType) + if err != nil { + return nil, err + } + end := i + int(l) + n + m[int32(fieldNum)] = Extension{enc: buf[i:end]} + i = end + } + return m, nil +} + +func NewExtension(e []byte) Extension { + ee := Extension{enc: make([]byte, len(e))} + copy(ee.enc, e) + return ee +} + +func AppendExtension(e Message, tag int32, buf []byte) { + if ee, eok := e.(extensionsBytes); eok { + ext := ee.GetExtensions() + *ext = append(*ext, buf...) + return + } + if ee, eok := e.(extendableProto); eok { + m := ee.extensionsWrite() + ext := m[int32(tag)] // may be missing + ext.enc = append(ext.enc, buf...) + m[int32(tag)] = ext + } +} + +func encodeExtension(extension *ExtensionDesc, value interface{}) ([]byte, error) { + u := getMarshalInfo(reflect.TypeOf(extension.ExtendedType)) + ei := u.getExtElemInfo(extension) + v := value + p := toAddrPointer(&v, ei.isptr) + siz := ei.sizer(p, SizeVarint(ei.wiretag)) + buf := make([]byte, 0, siz) + return ei.marshaler(buf, p, ei.wiretag, false) +} + +func decodeExtensionFromBytes(extension *ExtensionDesc, buf []byte) (interface{}, error) { + o := 0 + for o < len(buf) { + tag, n := DecodeVarint((buf)[o:]) + fieldNum := int32(tag >> 3) + wireType := int(tag & 0x7) + if o+n > len(buf) { + return nil, fmt.Errorf("unable to decode extension") + } + l, err := size((buf)[o+n:], wireType) + if err != nil { + return nil, err + } + if int32(fieldNum) == extension.Field { + if o+n+l > len(buf) { + return nil, fmt.Errorf("unable to decode extension") + } + v, err := decodeExtension((buf)[o:o+n+l], extension) + if err != nil { + return nil, err + } + return v, nil + } + o += n + l + } + return defaultExtensionValue(extension) +} + +func (this *Extension) Encode() error { + if this.enc == nil { + var err error + this.enc, err = encodeExtension(this.desc, this.value) + if err != nil { + return err + } + } + return nil +} + +func (this Extension) GoString() string { + if err := this.Encode(); err != nil { + return fmt.Sprintf("error encoding extension: %v", err) + } + return fmt.Sprintf("proto.NewExtension(%#v)", this.enc) +} + +func SetUnsafeExtension(pb Message, fieldNum int32, value interface{}) error { + typ := reflect.TypeOf(pb).Elem() + ext, ok := extensionMaps[typ] + if !ok { + return fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) + } + desc, ok := ext[fieldNum] + if !ok { + return errors.New("proto: bad extension number; not in declared ranges") + } + return SetExtension(pb, desc, value) +} + +func GetUnsafeExtension(pb Message, fieldNum int32) (interface{}, error) { + typ := reflect.TypeOf(pb).Elem() + ext, ok := extensionMaps[typ] + if !ok { + return nil, fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) + } + desc, ok := ext[fieldNum] + if !ok { + return nil, fmt.Errorf("unregistered field number %d", fieldNum) + } + return GetExtension(pb, desc) +} + +func NewUnsafeXXX_InternalExtensions(m map[int32]Extension) XXX_InternalExtensions { + x := &XXX_InternalExtensions{ + p: new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }), + } + x.p.extensionMap = m + return *x +} + +func GetUnsafeExtensionsMap(extendable Message) map[int32]Extension { + pb := extendable.(extendableProto) + return pb.extensionsWrite() +} + +func deleteExtension(pb extensionsBytes, theFieldNum int32, offset int) int { + ext := pb.GetExtensions() + for offset < len(*ext) { + tag, n1 := DecodeVarint((*ext)[offset:]) + fieldNum := int32(tag >> 3) + wireType := int(tag & 0x7) + n2, err := size((*ext)[offset+n1:], wireType) + if err != nil { + panic(err) + } + newOffset := offset + n1 + n2 + if fieldNum == theFieldNum { + *ext = append((*ext)[:offset], (*ext)[newOffset:]...) + return offset + } + offset = newOffset + } + return -1 +} diff --git a/vendor/github.com/gogo/protobuf/proto/lib.go b/vendor/github.com/gogo/protobuf/proto/lib.go new file mode 100644 index 00000000..80db1c15 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/lib.go @@ -0,0 +1,973 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/gogo/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/gogo/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. +// Marshal reports this when a required field is not initialized. +// Unmarshal reports this when a required field is missing from the wire data. +type RequiredNotSetError struct{ field string } + +func (e *RequiredNotSetError) Error() string { + if e.field == "" { + return fmt.Sprintf("proto: required field not set") + } + return fmt.Sprintf("proto: required field %q not set", e.field) +} +func (e *RequiredNotSetError) RequiredNotSet() bool { + return true +} + +type invalidUTF8Error struct{ field string } + +func (e *invalidUTF8Error) Error() string { + if e.field == "" { + return "proto: invalid UTF-8 detected" + } + return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) +} +func (e *invalidUTF8Error) InvalidUTF8() bool { + return true +} + +// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. +// This error should not be exposed to the external API as such errors should +// be recreated with the field information. +var errInvalidUTF8 = &invalidUTF8Error{} + +// isNonFatal reports whether the error is either a RequiredNotSet error +// or a InvalidUTF8 error. +func isNonFatal(err error) bool { + if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { + return true + } + if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { + return true + } + return false +} + +type nonFatal struct{ E error } + +// Merge merges err into nf and reports whether it was successful. +// Otherwise it returns false for any fatal non-nil errors. +func (nf *nonFatal) Merge(err error) (ok bool) { + if err == nil { + return true // not an error + } + if !isNonFatal(err) { + return false // fatal error + } + if nf.E == nil { + nf.E = err // store first instance of non-fatal error + } + return true +} + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // read point + + deterministic bool +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +// SetDeterministic sets whether to use deterministic serialization. +// +// Deterministic serialization guarantees that for a given binary, equal +// messages will always be serialized to the same bytes. This implies: +// +// - Repeated serialization of a message will return the same bytes. +// - Different processes of the same binary (which may be executing on +// different machines) will serialize equal messages to the same bytes. +// +// Note that the deterministic serialization is NOT canonical across +// languages. It is not guaranteed to remain stable over time. It is unstable +// across different builds with schema changes due to unknown fields. +// Users who need canonical serialization (e.g., persistent storage in a +// canonical form, fingerprinting, etc.) should define their own +// canonicalization specification and implement their own serializer rather +// than relying on this API. +// +// If deterministic serialization is requested, map entries will be sorted +// by keys in lexographical order. This is an implementation detail and +// subject to change. +func (p *Buffer) SetDeterministic(deterministic bool) { + p.deterministic = deterministic +} + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + sindex := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = sindex +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or T or []*T or []T + switch f.Kind() { + case reflect.Struct: + setDefaults(f, recur, zeros) + + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.Kind() == reflect.Ptr && e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Struct: + nestedMessage = true // non-nullable + + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr, reflect.Struct: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// mapKeys returns a sort.Interface to be used for sorting the map keys. +// Map fields may have key types of non-float scalars, strings and enums. +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{vs: vs} + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + case reflect.Bool: + s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true + case reflect.String: + s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } + default: + panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +const ( + // ProtoPackageIsVersion3 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + GoGoProtoPackageIsVersion3 = true + + // ProtoPackageIsVersion2 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + GoGoProtoPackageIsVersion2 = true + + // ProtoPackageIsVersion1 is referenced from generated protocol buffer files + // to assert that that code is compatible with this version of the proto package. + GoGoProtoPackageIsVersion1 = true +) + +// InternalMessageInfo is a type used internally by generated .pb.go files. +// This type is not intended to be used by non-generated code. +// This type is not subject to any compatibility guarantee. +type InternalMessageInfo struct { + marshal *marshalInfo + unmarshal *unmarshalInfo + merge *mergeInfo + discard *discardInfo +} diff --git a/vendor/github.com/gogo/protobuf/proto/lib_gogo.go b/vendor/github.com/gogo/protobuf/proto/lib_gogo.go new file mode 100644 index 00000000..b3aa3919 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/lib_gogo.go @@ -0,0 +1,50 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "encoding/json" + "strconv" +) + +type Sizer interface { + Size() int +} + +type ProtoSizer interface { + ProtoSize() int +} + +func MarshalJSONEnum(m map[int32]string, value int32) ([]byte, error) { + s, ok := m[value] + if !ok { + s = strconv.Itoa(int(value)) + } + return json.Marshal(s) +} diff --git a/vendor/github.com/gogo/protobuf/proto/message_set.go b/vendor/github.com/gogo/protobuf/proto/message_set.go new file mode 100644 index 00000000..f48a7567 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/message_set.go @@ -0,0 +1,181 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Support for message sets. + */ + +import ( + "errors" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + return ms.find(pb) != nil +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func unmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go new file mode 100644 index 00000000..b6cad908 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go @@ -0,0 +1,357 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" + "sync" +) + +const unsafeAllowed = false + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// zeroField is a noop when calling pointer.offset. +var zeroField = field([]int{}) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// The pointer type is for the table-driven decoder. +// The implementation here uses a reflect.Value of pointer type to +// create a generic pointer. In pointer_unsafe.go we use unsafe +// instead of reflect to implement the same (but faster) interface. +type pointer struct { + v reflect.Value +} + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + return pointer{v: reflect.ValueOf(*i)} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + v := reflect.ValueOf(*i) + u := reflect.New(v.Type()) + u.Elem().Set(v) + return pointer{v: u} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{v: v} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} +} + +func (p pointer) isNil() bool { + return p.v.IsNil() +} + +// grow updates the slice s in place to make it one element longer. +// s must be addressable. +// Returns the (addressable) new element. +func grow(s reflect.Value) reflect.Value { + n, m := s.Len(), s.Cap() + if n < m { + s.SetLen(n + 1) + } else { + s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) + } + return s.Index(n) +} + +func (p pointer) toInt64() *int64 { + return p.v.Interface().(*int64) +} +func (p pointer) toInt64Ptr() **int64 { + return p.v.Interface().(**int64) +} +func (p pointer) toInt64Slice() *[]int64 { + return p.v.Interface().(*[]int64) +} + +var int32ptr = reflect.TypeOf((*int32)(nil)) + +func (p pointer) toInt32() *int32 { + return p.v.Convert(int32ptr).Interface().(*int32) +} + +// The toInt32Ptr/Slice methods don't work because of enums. +// Instead, we must use set/get methods for the int32ptr/slice case. +/* + func (p pointer) toInt32Ptr() **int32 { + return p.v.Interface().(**int32) +} + func (p pointer) toInt32Slice() *[]int32 { + return p.v.Interface().(*[]int32) +} +*/ +func (p pointer) getInt32Ptr() *int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().(*int32) + } + // an enum + return p.v.Elem().Convert(int32PtrType).Interface().(*int32) +} +func (p pointer) setInt32Ptr(v int32) { + // Allocate value in a *int32. Possibly convert that to a *enum. + // Then assign it to a **int32 or **enum. + // Note: we can convert *int32 to *enum, but we can't convert + // **int32 to **enum! + p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) +} + +// getInt32Slice copies []int32 from p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getInt32Slice() []int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().([]int32) + } + // an enum + // Allocate a []int32, then assign []enum's values into it. + // Note: we can't convert []enum to []int32. + slice := p.v.Elem() + s := make([]int32, slice.Len()) + for i := 0; i < slice.Len(); i++ { + s[i] = int32(slice.Index(i).Int()) + } + return s +} + +// setInt32Slice copies []int32 into p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setInt32Slice(v []int32) { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + p.v.Elem().Set(reflect.ValueOf(v)) + return + } + // an enum + // Allocate a []enum, then assign []int32's values into it. + // Note: we can't convert []enum to []int32. + slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) + for i, x := range v { + slice.Index(i).SetInt(int64(x)) + } + p.v.Elem().Set(slice) +} +func (p pointer) appendInt32Slice(v int32) { + grow(p.v.Elem()).SetInt(int64(v)) +} + +func (p pointer) toUint64() *uint64 { + return p.v.Interface().(*uint64) +} +func (p pointer) toUint64Ptr() **uint64 { + return p.v.Interface().(**uint64) +} +func (p pointer) toUint64Slice() *[]uint64 { + return p.v.Interface().(*[]uint64) +} +func (p pointer) toUint32() *uint32 { + return p.v.Interface().(*uint32) +} +func (p pointer) toUint32Ptr() **uint32 { + return p.v.Interface().(**uint32) +} +func (p pointer) toUint32Slice() *[]uint32 { + return p.v.Interface().(*[]uint32) +} +func (p pointer) toBool() *bool { + return p.v.Interface().(*bool) +} +func (p pointer) toBoolPtr() **bool { + return p.v.Interface().(**bool) +} +func (p pointer) toBoolSlice() *[]bool { + return p.v.Interface().(*[]bool) +} +func (p pointer) toFloat64() *float64 { + return p.v.Interface().(*float64) +} +func (p pointer) toFloat64Ptr() **float64 { + return p.v.Interface().(**float64) +} +func (p pointer) toFloat64Slice() *[]float64 { + return p.v.Interface().(*[]float64) +} +func (p pointer) toFloat32() *float32 { + return p.v.Interface().(*float32) +} +func (p pointer) toFloat32Ptr() **float32 { + return p.v.Interface().(**float32) +} +func (p pointer) toFloat32Slice() *[]float32 { + return p.v.Interface().(*[]float32) +} +func (p pointer) toString() *string { + return p.v.Interface().(*string) +} +func (p pointer) toStringPtr() **string { + return p.v.Interface().(**string) +} +func (p pointer) toStringSlice() *[]string { + return p.v.Interface().(*[]string) +} +func (p pointer) toBytes() *[]byte { + return p.v.Interface().(*[]byte) +} +func (p pointer) toBytesSlice() *[][]byte { + return p.v.Interface().(*[][]byte) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return p.v.Interface().(*XXX_InternalExtensions) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return p.v.Interface().(*map[int32]Extension) +} +func (p pointer) getPointer() pointer { + return pointer{v: p.v.Elem()} +} +func (p pointer) setPointer(q pointer) { + p.v.Elem().Set(q.v) +} +func (p pointer) appendPointer(q pointer) { + grow(p.v.Elem()).Set(q.v) +} + +// getPointerSlice copies []*T from p as a new []pointer. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getPointerSlice() []pointer { + if p.v.IsNil() { + return nil + } + n := p.v.Elem().Len() + s := make([]pointer, n) + for i := 0; i < n; i++ { + s[i] = pointer{v: p.v.Elem().Index(i)} + } + return s +} + +// setPointerSlice copies []pointer into p as a new []*T. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setPointerSlice(v []pointer) { + if v == nil { + p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) + return + } + s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) + for _, p := range v { + s = reflect.Append(s, p.v) + } + p.v.Elem().Set(s) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + if p.v.Elem().IsNil() { + return pointer{v: p.v.Elem()} + } + return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct +} + +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + // TODO: check that p.v.Type().Elem() == t? + return p.v +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} + +var atomicLock sync.Mutex diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go new file mode 100644 index 00000000..7ffd3c29 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go @@ -0,0 +1,59 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" +) + +// TODO: untested, so probably incorrect. + +func (p pointer) getRef() pointer { + return pointer{v: p.v.Addr()} +} + +func (p pointer) appendRef(v pointer, typ reflect.Type) { + slice := p.getSlice(typ) + elem := v.asPointerTo(typ).Elem() + newSlice := reflect.Append(slice, elem) + slice.Set(newSlice) +} + +func (p pointer) getSlice(typ reflect.Type) reflect.Value { + sliceTyp := reflect.SliceOf(typ) + slice := p.asPointerTo(sliceTyp) + slice = slice.Elem() + return slice +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go new file mode 100644 index 00000000..d55a335d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,308 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "sync/atomic" + "unsafe" +) + +const unsafeAllowed = true + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// zeroField is a noop when calling pointer.offset. +const zeroField = field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != invalidField +} + +// The pointer type below is for the new table-driven encoder/decoder. +// The implementation here uses unsafe.Pointer to create a generic pointer. +// In pointer_reflect.go we use reflect instead of unsafe to implement +// the same (but slower) interface. +type pointer struct { + p unsafe.Pointer +} + +// size of pointer +var ptrSize = unsafe.Sizeof(uintptr(0)) + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + // Super-tricky - read pointer out of data word of interface value. + // Saves ~25ns over the equivalent: + // return valToPointer(reflect.ValueOf(*i)) + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + // Super-tricky - read or get the address of data word of interface value. + if isptr { + // The interface is of pointer type, thus it is a direct interface. + // The data word is the pointer data itself. We take its address. + return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} + } + // The interface is not of pointer type. The data word is the pointer + // to the data. + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{p: unsafe.Pointer(v.Pointer())} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + // For safety, we should panic if !f.IsValid, however calling panic causes + // this to no longer be inlineable, which is a serious performance cost. + /* + if !f.IsValid() { + panic("invalid field") + } + */ + return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} +} + +func (p pointer) isNil() bool { + return p.p == nil +} + +func (p pointer) toInt64() *int64 { + return (*int64)(p.p) +} +func (p pointer) toInt64Ptr() **int64 { + return (**int64)(p.p) +} +func (p pointer) toInt64Slice() *[]int64 { + return (*[]int64)(p.p) +} +func (p pointer) toInt32() *int32 { + return (*int32)(p.p) +} + +// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. +/* + func (p pointer) toInt32Ptr() **int32 { + return (**int32)(p.p) + } + func (p pointer) toInt32Slice() *[]int32 { + return (*[]int32)(p.p) + } +*/ +func (p pointer) getInt32Ptr() *int32 { + return *(**int32)(p.p) +} +func (p pointer) setInt32Ptr(v int32) { + *(**int32)(p.p) = &v +} + +// getInt32Slice loads a []int32 from p. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getInt32Slice() []int32 { + return *(*[]int32)(p.p) +} + +// setInt32Slice stores a []int32 to p. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setInt32Slice(v []int32) { + *(*[]int32)(p.p) = v +} + +// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? +func (p pointer) appendInt32Slice(v int32) { + s := (*[]int32)(p.p) + *s = append(*s, v) +} + +func (p pointer) toUint64() *uint64 { + return (*uint64)(p.p) +} +func (p pointer) toUint64Ptr() **uint64 { + return (**uint64)(p.p) +} +func (p pointer) toUint64Slice() *[]uint64 { + return (*[]uint64)(p.p) +} +func (p pointer) toUint32() *uint32 { + return (*uint32)(p.p) +} +func (p pointer) toUint32Ptr() **uint32 { + return (**uint32)(p.p) +} +func (p pointer) toUint32Slice() *[]uint32 { + return (*[]uint32)(p.p) +} +func (p pointer) toBool() *bool { + return (*bool)(p.p) +} +func (p pointer) toBoolPtr() **bool { + return (**bool)(p.p) +} +func (p pointer) toBoolSlice() *[]bool { + return (*[]bool)(p.p) +} +func (p pointer) toFloat64() *float64 { + return (*float64)(p.p) +} +func (p pointer) toFloat64Ptr() **float64 { + return (**float64)(p.p) +} +func (p pointer) toFloat64Slice() *[]float64 { + return (*[]float64)(p.p) +} +func (p pointer) toFloat32() *float32 { + return (*float32)(p.p) +} +func (p pointer) toFloat32Ptr() **float32 { + return (**float32)(p.p) +} +func (p pointer) toFloat32Slice() *[]float32 { + return (*[]float32)(p.p) +} +func (p pointer) toString() *string { + return (*string)(p.p) +} +func (p pointer) toStringPtr() **string { + return (**string)(p.p) +} +func (p pointer) toStringSlice() *[]string { + return (*[]string)(p.p) +} +func (p pointer) toBytes() *[]byte { + return (*[]byte)(p.p) +} +func (p pointer) toBytesSlice() *[][]byte { + return (*[][]byte)(p.p) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(p.p) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return (*map[int32]Extension)(p.p) +} + +// getPointerSlice loads []*T from p as a []pointer. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getPointerSlice() []pointer { + // Super-tricky - p should point to a []*T where T is a + // message type. We load it as []pointer. + return *(*[]pointer)(p.p) +} + +// setPointerSlice stores []pointer into p as a []*T. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setPointerSlice(v []pointer) { + // Super-tricky - p should point to a []*T where T is a + // message type. We store it as []pointer. + *(*[]pointer)(p.p) = v +} + +// getPointer loads the pointer at p and returns it. +func (p pointer) getPointer() pointer { + return pointer{p: *(*unsafe.Pointer)(p.p)} +} + +// setPointer stores the pointer q at p. +func (p pointer) setPointer(q pointer) { + *(*unsafe.Pointer)(p.p) = q.p +} + +// append q to the slice pointed to by p. +func (p pointer) appendPointer(q pointer) { + s := (*[]unsafe.Pointer)(p.p) + *s = append(*s, q.p) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + // Super-tricky - read pointer out of data word of interface value. + return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +} + +// asPointerTo returns a reflect.Value that is a pointer to an +// object of type t stored at p. +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + return reflect.NewAt(t, p.p) +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go new file mode 100644 index 00000000..aca8eed0 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go @@ -0,0 +1,56 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "unsafe" +) + +func (p pointer) getRef() pointer { + return pointer{p: (unsafe.Pointer)(&p.p)} +} + +func (p pointer) appendRef(v pointer, typ reflect.Type) { + slice := p.getSlice(typ) + elem := v.asPointerTo(typ).Elem() + newSlice := reflect.Append(slice, elem) + slice.Set(newSlice) +} + +func (p pointer) getSlice(typ reflect.Type) reflect.Value { + sliceTyp := reflect.SliceOf(typ) + slice := p.asPointerTo(sliceTyp) + slice = slice.Elem() + return slice +} diff --git a/vendor/github.com/gogo/protobuf/proto/properties.go b/vendor/github.com/gogo/protobuf/proto/properties.go new file mode 100644 index 00000000..28da1475 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/properties.go @@ -0,0 +1,610 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + CustomType string + CastType string + StdTime bool + StdDuration bool + WktPointer bool + + stype reflect.Type // set for struct types only + ctype reflect.Type // set for custom types only + sprop *StructProperties // set for struct types only + + mtype reflect.Type // set for map types only + MapKeyProp *Properties // set for map types only + MapValProp *Properties // set for map types only +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s += "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + log.Printf("proto: tag has too few fields: %q", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + case "fixed32": + p.WireType = WireFixed32 + case "fixed64": + p.WireType = WireFixed64 + case "zigzag32": + p.WireType = WireVarint + case "zigzag64": + p.WireType = WireVarint + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + log.Printf("proto: tag has unknown wire type: %q", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + +outer: + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break outer + } + case strings.HasPrefix(f, "embedded="): + p.OrigName = strings.Split(f, "=")[1] + case strings.HasPrefix(f, "customtype="): + p.CustomType = strings.Split(f, "=")[1] + case strings.HasPrefix(f, "casttype="): + p.CastType = strings.Split(f, "=")[1] + case f == "stdtime": + p.StdTime = true + case f == "stdduration": + p.StdDuration = true + case f == "wktptr": + p.WktPointer = true + } + } +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// setFieldProps initializes the field properties for submessages and maps. +func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + isMap := typ.Kind() == reflect.Map + if len(p.CustomType) > 0 && !isMap { + p.ctype = typ + p.setTag(lockGetProp) + return + } + if p.StdTime && !isMap { + p.setTag(lockGetProp) + return + } + if p.StdDuration && !isMap { + p.setTag(lockGetProp) + return + } + if p.WktPointer && !isMap { + p.setTag(lockGetProp) + return + } + switch t1 := typ; t1.Kind() { + case reflect.Struct: + p.stype = typ + case reflect.Ptr: + if t1.Elem().Kind() == reflect.Struct { + p.stype = t1.Elem() + } + case reflect.Slice: + switch t2 := t1.Elem(); t2.Kind() { + case reflect.Ptr: + switch t3 := t2.Elem(); t3.Kind() { + case reflect.Struct: + p.stype = t3 + } + case reflect.Struct: + p.stype = t2 + } + + case reflect.Map: + + p.mtype = t1 + p.MapKeyProp = &Properties{} + p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.MapValProp = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + + p.MapValProp.CustomType = p.CustomType + p.MapValProp.StdDuration = p.StdDuration + p.MapValProp.StdTime = p.StdTime + p.MapValProp.WktPointer = p.WktPointer + p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + p.setTag(lockGetProp) +} + +func (p *Properties) setTag(lockGetProp bool) { + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() +) + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if tag == "" { + return + } + p.Parse(tag) + p.setFieldProps(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +type ( + oneofFuncsIface interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + oneofWrappersIface interface { + XXX_OneofWrappers() []interface{} + } +) + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + return prop + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + isOneofMessage := false + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + isOneofMessage = true + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + if isOneofMessage { + var oots []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oots = m.XXX_OneofFuncs() + case oneofWrappersIface: + oots = m.XXX_OneofWrappers() + } + if len(oots) > 0 { + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) +var enumStringMaps = make(map[string]map[int32]string) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap + if _, ok := enumStringMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumStringMaps[typeName] = unusedNameMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers + protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypedNils[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { + // Generated code always calls RegisterType with nil x. + // This check is just for extra safety. + protoTypedNils[name] = x + } else { + protoTypedNils[name] = reflect.Zero(t).Interface().(Message) + } + revProtoTypes[t] = name +} + +// RegisterMapType is called from generated code and maps from the fully qualified +// proto name to the native map type of the proto map definition. +func RegisterMapType(x interface{}, name string) { + if reflect.TypeOf(x).Kind() != reflect.Map { + panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) + } + if _, ok := protoMapTypes[name]; ok { + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoMapTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} + +// MessageType returns the message type (pointer to struct) for a named message. +// The type is not guaranteed to implement proto.Message if the name refers to a +// map entry. +func MessageType(name string) reflect.Type { + if t, ok := protoTypedNils[name]; ok { + return reflect.TypeOf(t) + } + return protoMapTypes[name] +} + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/gogo/protobuf/proto/properties_gogo.go b/vendor/github.com/gogo/protobuf/proto/properties_gogo.go new file mode 100644 index 00000000..40ea3dd9 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/properties_gogo.go @@ -0,0 +1,36 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" +) + +var sizerType = reflect.TypeOf((*Sizer)(nil)).Elem() +var protosizerType = reflect.TypeOf((*ProtoSizer)(nil)).Elem() diff --git a/vendor/github.com/gogo/protobuf/proto/skip_gogo.go b/vendor/github.com/gogo/protobuf/proto/skip_gogo.go new file mode 100644 index 00000000..5a5fd93f --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/skip_gogo.go @@ -0,0 +1,119 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "io" +) + +func Skip(data []byte) (n int, err error) { + l := len(data) + index := 0 + for index < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + b := data[index] + index++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + index++ + if data[index-1] < 0x80 { + break + } + } + return index, nil + case 1: + index += 8 + return index, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + b := data[index] + index++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + index += length + return index, nil + case 3: + for { + var innerWire uint64 + var start int = index + for shift := uint(0); ; shift += 7 { + if index >= l { + return 0, io.ErrUnexpectedEOF + } + b := data[index] + index++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := Skip(data[start:]) + if err != nil { + return 0, err + } + index = start + next + } + return index, nil + case 4: + return index, nil + case 5: + index += 4 + return index, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_marshal.go b/vendor/github.com/gogo/protobuf/proto/table_marshal.go new file mode 100644 index 00000000..f8babdef --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_marshal.go @@ -0,0 +1,3009 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// a sizer takes a pointer to a field and the size of its tag, computes the size of +// the encoded data. +type sizer func(pointer, int) int + +// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), +// marshals the field to the end of the slice, returns the slice and error (if any). +type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) + +// marshalInfo is the information used for marshaling a message. +type marshalInfo struct { + typ reflect.Type + fields []*marshalFieldInfo + unrecognized field // offset of XXX_unrecognized + extensions field // offset of XXX_InternalExtensions + v1extensions field // offset of XXX_extensions + sizecache field // offset of XXX_sizecache + initialized int32 // 0 -- only typ is set, 1 -- fully initialized + messageset bool // uses message set wire format + hasmarshaler bool // has custom marshaler + sync.RWMutex // protect extElems map, also for initialization + extElems map[int32]*marshalElemInfo // info of extension elements + + hassizer bool // has custom sizer + hasprotosizer bool // has custom protosizer + + bytesExtensions field // offset of XXX_extensions where the field type is []byte +} + +// marshalFieldInfo is the information used for marshaling a field of a message. +type marshalFieldInfo struct { + field field + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isPointer bool + required bool // field is required + name string // name of the field, for error reporting + oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements +} + +// marshalElemInfo is the information used for marshaling an extension or oneof element. +type marshalElemInfo struct { + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) +} + +var ( + marshalInfoMap = map[reflect.Type]*marshalInfo{} + marshalInfoLock sync.Mutex + + uint8SliceType = reflect.TypeOf(([]uint8)(nil)).Kind() +) + +// getMarshalInfo returns the information to marshal a given type of message. +// The info it returns may not necessarily initialized. +// t is the type of the message (NOT the pointer to it). +func getMarshalInfo(t reflect.Type) *marshalInfo { + marshalInfoLock.Lock() + u, ok := marshalInfoMap[t] + if !ok { + u = &marshalInfo{typ: t} + marshalInfoMap[t] = u + } + marshalInfoLock.Unlock() + return u +} + +// Size is the entry point from generated code, +// and should be ONLY called by generated code. +// It computes the size of encoded data of msg. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Size(msg Message) int { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return 0 + } + return u.size(ptr) +} + +// Marshal is the entry point from generated code, +// and should be ONLY called by generated code. +// It marshals msg to the end of b. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return b, ErrNil + } + return u.marshal(b, ptr, deterministic) +} + +func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { + // u := a.marshal, but atomically. + // We use an atomic here to ensure memory consistency. + u := atomicLoadMarshalInfo(&a.marshal) + if u == nil { + // Get marshal information from type of message. + t := reflect.ValueOf(msg).Type() + if t.Kind() != reflect.Ptr { + panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) + } + u = getMarshalInfo(t.Elem()) + // Store it in the cache for later users. + // a.marshal = u, but atomically. + atomicStoreMarshalInfo(&a.marshal, u) + } + return u +} + +// size is the main function to compute the size of the encoded data of a message. +// ptr is the pointer to the message. +func (u *marshalInfo) size(ptr pointer) int { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + // Uses the message's Size method if available + if u.hassizer { + s := ptr.asPointerTo(u.typ).Interface().(Sizer) + return s.Size() + } + // Uses the message's ProtoSize method if available + if u.hasprotosizer { + s := ptr.asPointerTo(u.typ).Interface().(ProtoSizer) + return s.ProtoSize() + } + + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b, _ := m.Marshal() + return len(b) + } + + n := 0 + for _, f := range u.fields { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + n += f.sizer(ptr.offset(f.field), f.tagsize) + } + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + n += u.sizeMessageSet(e) + } else { + n += u.sizeExtensions(e) + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + n += u.sizeV1Extensions(m) + } + if u.bytesExtensions.IsValid() { + s := *ptr.offset(u.bytesExtensions).toBytes() + n += len(s) + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + n += len(s) + } + + // cache the result for use in marshal + if u.sizecache.IsValid() { + atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) + } + return n +} + +// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), +// fall back to compute the size. +func (u *marshalInfo) cachedsize(ptr pointer) int { + if u.sizecache.IsValid() { + return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) + } + return u.size(ptr) +} + +// marshal is the main function to marshal a message. It takes a byte slice and appends +// the encoded data to the end of the slice, returns the slice and error (if any). +// ptr is the pointer to the message. +// If deterministic is true, map is marshaled in deterministic order. +func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b1, err := m.Marshal() + b = append(b, b1...) + return b, err + } + + var err, errLater error + // The old marshaler encodes extensions at beginning. + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + b, err = u.appendMessageSet(b, e, deterministic) + } else { + b, err = u.appendExtensions(b, e, deterministic) + } + if err != nil { + return b, err + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + b, err = u.appendV1Extensions(b, m, deterministic) + if err != nil { + return b, err + } + } + if u.bytesExtensions.IsValid() { + s := *ptr.offset(u.bytesExtensions).toBytes() + b = append(b, s...) + } + for _, f := range u.fields { + if f.required { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // Required field is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name} + } + continue + } + } + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) + if err != nil { + if err1, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name + "." + err1.field} + } + continue + } + if err == errRepeatedHasNil { + err = errors.New("proto: repeated field " + f.name + " has nil element") + } + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return b, err + } + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + b = append(b, s...) + } + return b, errLater +} + +// computeMarshalInfo initializes the marshal info. +func (u *marshalInfo) computeMarshalInfo() { + u.Lock() + defer u.Unlock() + if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock + return + } + + t := u.typ + u.unrecognized = invalidField + u.extensions = invalidField + u.v1extensions = invalidField + u.bytesExtensions = invalidField + u.sizecache = invalidField + isOneofMessage := false + + if reflect.PtrTo(t).Implements(sizerType) { + u.hassizer = true + } + if reflect.PtrTo(t).Implements(protosizerType) { + u.hasprotosizer = true + } + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if reflect.PtrTo(t).Implements(marshalerType) { + u.hasmarshaler = true + atomic.StoreInt32(&u.initialized, 1) + return + } + + n := t.NumField() + + // deal with XXX fields first + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Tag.Get("protobuf_oneof") != "" { + isOneofMessage = true + } + if !strings.HasPrefix(f.Name, "XXX_") { + continue + } + switch f.Name { + case "XXX_sizecache": + u.sizecache = toField(&f) + case "XXX_unrecognized": + u.unrecognized = toField(&f) + case "XXX_InternalExtensions": + u.extensions = toField(&f) + u.messageset = f.Tag.Get("protobuf_messageset") == "1" + case "XXX_extensions": + if f.Type.Kind() == reflect.Map { + u.v1extensions = toField(&f) + } else { + u.bytesExtensions = toField(&f) + } + case "XXX_NoUnkeyedLiteral": + // nothing to do + default: + panic("unknown XXX field: " + f.Name) + } + n-- + } + + // get oneof implementers + var oneofImplementers []interface{} + // gogo: isOneofMessage is needed for embedded oneof messages, without a marshaler and unmarshaler + if isOneofMessage { + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + } + + // normal fields + fields := make([]marshalFieldInfo, n) // batch allocation + u.fields = make([]*marshalFieldInfo, 0, n) + for i, j := 0, 0; i < t.NumField(); i++ { + f := t.Field(i) + + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + field := &fields[j] + j++ + field.name = f.Name + u.fields = append(u.fields, field) + if f.Tag.Get("protobuf_oneof") != "" { + field.computeOneofFieldInfo(&f, oneofImplementers) + continue + } + if f.Tag.Get("protobuf") == "" { + // field has no tag (not in generated message), ignore it + u.fields = u.fields[:len(u.fields)-1] + j-- + continue + } + field.computeMarshalFieldInfo(&f) + } + + // fields are marshaled in tag order on the wire. + sort.Sort(byTag(u.fields)) + + atomic.StoreInt32(&u.initialized, 1) +} + +// helper for sorting fields by tag +type byTag []*marshalFieldInfo + +func (a byTag) Len() int { return len(a) } +func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } + +// getExtElemInfo returns the information to marshal an extension element. +// The info it returns is initialized. +func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { + // get from cache first + u.RLock() + e, ok := u.extElems[desc.Field] + u.RUnlock() + if ok { + return e + } + + t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct + tags := strings.Split(desc.Tag, ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizr, marshalr := typeMarshaler(t, tags, false, false) + e = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizr, + marshaler: marshalr, + isptr: t.Kind() == reflect.Ptr, + } + + // update cache + u.Lock() + if u.extElems == nil { + u.extElems = make(map[int32]*marshalElemInfo) + } + u.extElems[desc.Field] = e + u.Unlock() + return e +} + +// computeMarshalFieldInfo fills up the information to marshal a field. +func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { + // parse protobuf tag of the field. + // tag has format of "bytes,49,opt,name=foo,def=hello!" + tags := strings.Split(f.Tag.Get("protobuf"), ",") + if tags[0] == "" { + return + } + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if tags[2] == "req" { + fi.required = true + } + fi.setTag(f, tag, wt) + fi.setMarshaler(f, tags) +} + +func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { + fi.field = toField(f) + fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. + fi.isPointer = true + fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) + fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) + + ityp := f.Type // interface type + for _, o := range oneofImplementers { + t := reflect.TypeOf(o) + if !t.Implements(ityp) { + continue + } + sf := t.Elem().Field(0) // oneof implementer is a struct with a single field + tags := strings.Split(sf.Tag.Get("protobuf"), ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizr, marshalr := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value + fi.oneofElems[t.Elem()] = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizr, + marshaler: marshalr, + } + } +} + +// wiretype returns the wire encoding of the type. +func wiretype(encoding string) uint64 { + switch encoding { + case "fixed32": + return WireFixed32 + case "fixed64": + return WireFixed64 + case "varint", "zigzag32", "zigzag64": + return WireVarint + case "bytes": + return WireBytes + case "group": + return WireStartGroup + } + panic("unknown wire type " + encoding) +} + +// setTag fills up the tag (in wire format) and its size in the info of a field. +func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { + fi.field = toField(f) + fi.wiretag = uint64(tag)<<3 | wt + fi.tagsize = SizeVarint(uint64(tag) << 3) +} + +// setMarshaler fills up the sizer and marshaler in the info of a field. +func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { + switch f.Type.Kind() { + case reflect.Map: + // map field + fi.isPointer = true + fi.sizer, fi.marshaler = makeMapMarshaler(f) + return + case reflect.Ptr, reflect.Slice: + fi.isPointer = true + } + fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) +} + +// typeMarshaler returns the sizer and marshaler of a given field. +// t is the type of the field. +// tags is the generated "protobuf" tag of the field. +// If nozero is true, zero value is not marshaled to the wire. +// If oneof is true, it is a oneof field. +func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { + encoding := tags[0] + + pointer := false + slice := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + packed := false + proto3 := false + ctype := false + isTime := false + isDuration := false + isWktPointer := false + validateUTF8 := true + for i := 2; i < len(tags); i++ { + if tags[i] == "packed" { + packed = true + } + if tags[i] == "proto3" { + proto3 = true + } + if strings.HasPrefix(tags[i], "customtype=") { + ctype = true + } + if tags[i] == "stdtime" { + isTime = true + } + if tags[i] == "stdduration" { + isDuration = true + } + if tags[i] == "wktptr" { + isWktPointer = true + } + } + validateUTF8 = validateUTF8 && proto3 + if !proto3 && !pointer && !slice { + nozero = false + } + + if ctype { + if reflect.PtrTo(t).Implements(customType) { + if slice { + return makeMessageRefSliceMarshaler(getMarshalInfo(t)) + } + if pointer { + return makeCustomPtrMarshaler(getMarshalInfo(t)) + } + return makeCustomMarshaler(getMarshalInfo(t)) + } else { + panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t)) + } + } + + if isTime { + if pointer { + if slice { + return makeTimePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeTimePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeTimeSliceMarshaler(getMarshalInfo(t)) + } + return makeTimeMarshaler(getMarshalInfo(t)) + } + + if isDuration { + if pointer { + if slice { + return makeDurationPtrSliceMarshaler(getMarshalInfo(t)) + } + return makeDurationPtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeDurationSliceMarshaler(getMarshalInfo(t)) + } + return makeDurationMarshaler(getMarshalInfo(t)) + } + + if isWktPointer { + switch t.Kind() { + case reflect.Float64: + if pointer { + if slice { + return makeStdDoubleValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdDoubleValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdDoubleValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdDoubleValueMarshaler(getMarshalInfo(t)) + case reflect.Float32: + if pointer { + if slice { + return makeStdFloatValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdFloatValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdFloatValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdFloatValueMarshaler(getMarshalInfo(t)) + case reflect.Int64: + if pointer { + if slice { + return makeStdInt64ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt64ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdInt64ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt64ValueMarshaler(getMarshalInfo(t)) + case reflect.Uint64: + if pointer { + if slice { + return makeStdUInt64ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt64ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdUInt64ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt64ValueMarshaler(getMarshalInfo(t)) + case reflect.Int32: + if pointer { + if slice { + return makeStdInt32ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt32ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdInt32ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdInt32ValueMarshaler(getMarshalInfo(t)) + case reflect.Uint32: + if pointer { + if slice { + return makeStdUInt32ValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt32ValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdUInt32ValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdUInt32ValueMarshaler(getMarshalInfo(t)) + case reflect.Bool: + if pointer { + if slice { + return makeStdBoolValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBoolValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdBoolValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBoolValueMarshaler(getMarshalInfo(t)) + case reflect.String: + if pointer { + if slice { + return makeStdStringValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdStringValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdStringValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdStringValueMarshaler(getMarshalInfo(t)) + case uint8SliceType: + if pointer { + if slice { + return makeStdBytesValuePtrSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBytesValuePtrMarshaler(getMarshalInfo(t)) + } + if slice { + return makeStdBytesValueSliceMarshaler(getMarshalInfo(t)) + } + return makeStdBytesValueMarshaler(getMarshalInfo(t)) + default: + panic(fmt.Sprintf("unknown wktpointer type %#v", t)) + } + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return sizeBoolPtr, appendBoolPtr + } + if slice { + if packed { + return sizeBoolPackedSlice, appendBoolPackedSlice + } + return sizeBoolSlice, appendBoolSlice + } + if nozero { + return sizeBoolValueNoZero, appendBoolValueNoZero + } + return sizeBoolValue, appendBoolValue + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixed32Ptr, appendFixed32Ptr + } + if slice { + if packed { + return sizeFixed32PackedSlice, appendFixed32PackedSlice + } + return sizeFixed32Slice, appendFixed32Slice + } + if nozero { + return sizeFixed32ValueNoZero, appendFixed32ValueNoZero + } + return sizeFixed32Value, appendFixed32Value + case "varint": + if pointer { + return sizeVarint32Ptr, appendVarint32Ptr + } + if slice { + if packed { + return sizeVarint32PackedSlice, appendVarint32PackedSlice + } + return sizeVarint32Slice, appendVarint32Slice + } + if nozero { + return sizeVarint32ValueNoZero, appendVarint32ValueNoZero + } + return sizeVarint32Value, appendVarint32Value + } + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixedS32Ptr, appendFixedS32Ptr + } + if slice { + if packed { + return sizeFixedS32PackedSlice, appendFixedS32PackedSlice + } + return sizeFixedS32Slice, appendFixedS32Slice + } + if nozero { + return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero + } + return sizeFixedS32Value, appendFixedS32Value + case "varint": + if pointer { + return sizeVarintS32Ptr, appendVarintS32Ptr + } + if slice { + if packed { + return sizeVarintS32PackedSlice, appendVarintS32PackedSlice + } + return sizeVarintS32Slice, appendVarintS32Slice + } + if nozero { + return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero + } + return sizeVarintS32Value, appendVarintS32Value + case "zigzag32": + if pointer { + return sizeZigzag32Ptr, appendZigzag32Ptr + } + if slice { + if packed { + return sizeZigzag32PackedSlice, appendZigzag32PackedSlice + } + return sizeZigzag32Slice, appendZigzag32Slice + } + if nozero { + return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero + } + return sizeZigzag32Value, appendZigzag32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixed64Ptr, appendFixed64Ptr + } + if slice { + if packed { + return sizeFixed64PackedSlice, appendFixed64PackedSlice + } + return sizeFixed64Slice, appendFixed64Slice + } + if nozero { + return sizeFixed64ValueNoZero, appendFixed64ValueNoZero + } + return sizeFixed64Value, appendFixed64Value + case "varint": + if pointer { + return sizeVarint64Ptr, appendVarint64Ptr + } + if slice { + if packed { + return sizeVarint64PackedSlice, appendVarint64PackedSlice + } + return sizeVarint64Slice, appendVarint64Slice + } + if nozero { + return sizeVarint64ValueNoZero, appendVarint64ValueNoZero + } + return sizeVarint64Value, appendVarint64Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixedS64Ptr, appendFixedS64Ptr + } + if slice { + if packed { + return sizeFixedS64PackedSlice, appendFixedS64PackedSlice + } + return sizeFixedS64Slice, appendFixedS64Slice + } + if nozero { + return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero + } + return sizeFixedS64Value, appendFixedS64Value + case "varint": + if pointer { + return sizeVarintS64Ptr, appendVarintS64Ptr + } + if slice { + if packed { + return sizeVarintS64PackedSlice, appendVarintS64PackedSlice + } + return sizeVarintS64Slice, appendVarintS64Slice + } + if nozero { + return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero + } + return sizeVarintS64Value, appendVarintS64Value + case "zigzag64": + if pointer { + return sizeZigzag64Ptr, appendZigzag64Ptr + } + if slice { + if packed { + return sizeZigzag64PackedSlice, appendZigzag64PackedSlice + } + return sizeZigzag64Slice, appendZigzag64Slice + } + if nozero { + return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero + } + return sizeZigzag64Value, appendZigzag64Value + } + case reflect.Float32: + if pointer { + return sizeFloat32Ptr, appendFloat32Ptr + } + if slice { + if packed { + return sizeFloat32PackedSlice, appendFloat32PackedSlice + } + return sizeFloat32Slice, appendFloat32Slice + } + if nozero { + return sizeFloat32ValueNoZero, appendFloat32ValueNoZero + } + return sizeFloat32Value, appendFloat32Value + case reflect.Float64: + if pointer { + return sizeFloat64Ptr, appendFloat64Ptr + } + if slice { + if packed { + return sizeFloat64PackedSlice, appendFloat64PackedSlice + } + return sizeFloat64Slice, appendFloat64Slice + } + if nozero { + return sizeFloat64ValueNoZero, appendFloat64ValueNoZero + } + return sizeFloat64Value, appendFloat64Value + case reflect.String: + if validateUTF8 { + if pointer { + return sizeStringPtr, appendUTF8StringPtr + } + if slice { + return sizeStringSlice, appendUTF8StringSlice + } + if nozero { + return sizeStringValueNoZero, appendUTF8StringValueNoZero + } + return sizeStringValue, appendUTF8StringValue + } + if pointer { + return sizeStringPtr, appendStringPtr + } + if slice { + return sizeStringSlice, appendStringSlice + } + if nozero { + return sizeStringValueNoZero, appendStringValueNoZero + } + return sizeStringValue, appendStringValue + case reflect.Slice: + if slice { + return sizeBytesSlice, appendBytesSlice + } + if oneof { + // Oneof bytes field may also have "proto3" tag. + // We want to marshal it as a oneof field. Do this + // check before the proto3 check. + return sizeBytesOneof, appendBytesOneof + } + if proto3 { + return sizeBytes3, appendBytes3 + } + return sizeBytes, appendBytes + case reflect.Struct: + switch encoding { + case "group": + if slice { + return makeGroupSliceMarshaler(getMarshalInfo(t)) + } + return makeGroupMarshaler(getMarshalInfo(t)) + case "bytes": + if pointer { + if slice { + return makeMessageSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageMarshaler(getMarshalInfo(t)) + } else { + if slice { + return makeMessageRefSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageRefMarshaler(getMarshalInfo(t)) + } + } + } + panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) +} + +// Below are functions to size/marshal a specific type of a field. +// They are stored in the field's info, and called by function pointers. +// They have type sizer or marshaler. + +func sizeFixed32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixedS32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFloat32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + return (4 + tagsize) * len(s) +} +func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixed64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFixedS64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFloat64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + return (8 + tagsize) * len(s) +} +func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeVarint32Value(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarint32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarint64Value(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + return SizeVarint(v) + tagsize +} +func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return SizeVarint(v) + tagsize +} +func sizeVarint64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return SizeVarint(*p) + tagsize +} +func sizeVarint64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(v) + tagsize + } + return n +} +func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize + } + return n +} +func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize + } + return n +} +func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeBoolValue(_ pointer, tagsize int) int { + return 1 + tagsize +} +func sizeBoolValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toBool() + if !v { + return 0 + } + return 1 + tagsize +} +func sizeBoolPtr(ptr pointer, tagsize int) int { + p := *ptr.toBoolPtr() + if p == nil { + return 0 + } + return 1 + tagsize +} +func sizeBoolSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + return (1 + tagsize) * len(s) +} +func sizeBoolPackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return 0 + } + return len(s) + SizeVarint(uint64(len(s))) + tagsize +} +func sizeStringValue(ptr pointer, tagsize int) int { + v := *ptr.toString() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toString() + if v == "" { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringPtr(ptr pointer, tagsize int) int { + p := *ptr.toStringPtr() + if p == nil { + return 0 + } + v := *p + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringSlice(ptr pointer, tagsize int) int { + s := *ptr.toStringSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} +func sizeBytes(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if v == nil { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytes3(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if len(v) == 0 { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesOneof(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesSlice(ptr pointer, tagsize int) int { + s := *ptr.toBytesSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} + +// appendFixed32 appends an encoded fixed32 to b. +func appendFixed32(b []byte, v uint32) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24)) + return b +} + +// appendFixed64 appends an encoded fixed64 to b. +func appendFixed64(b []byte, v uint64) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24), + byte(v>>32), + byte(v>>40), + byte(v>>48), + byte(v>>56)) + return b +} + +// appendVarint appends an encoded varint to b. +func appendVarint(b []byte, v uint64) []byte { + // TODO: make 1-byte (maybe 2-byte) case inline-able, once we + // have non-leaf inliner. + switch { + case v < 1<<7: + b = append(b, byte(v)) + case v < 1<<14: + b = append(b, + byte(v&0x7f|0x80), + byte(v>>7)) + case v < 1<<21: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte(v>>14)) + case v < 1<<28: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte(v>>21)) + case v < 1<<35: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte(v>>28)) + case v < 1<<42: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte(v>>35)) + case v < 1<<49: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte(v>>42)) + case v < 1<<56: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte(v>>49)) + case v < 1<<63: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte(v>>56)) + default: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte((v>>56)&0x7f|0x80), + 1) + } + return b +} + +func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, *p) + return b, nil +} +func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(*p)) + return b, nil +} +func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(*p)) + return b, nil +} +func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, *p) + return b, nil +} +func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(*p)) + return b, nil +} +func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(*p)) + return b, nil +} +func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, *p) + return b, nil +} +func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + } + return b, nil +} +func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, v) + } + return b, nil +} +func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + if !v { + return b, nil + } + b = appendVarint(b, wiretag) + b = append(b, 1) + return b, nil +} + +func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toBoolPtr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + if *p { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(len(s))) + for _, v := range s { + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if v == "" { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toStringSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} +func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if v == "" { + return b, nil + } + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + s := *ptr.toStringSlice() + for _, v := range s { + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if v == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if len(v) == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBytesSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} + +// makeGroupMarshaler returns the sizer and marshaler for a group. +// u is the marshal info of the underlying message. +func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + return u.size(p) + 2*tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + var err error + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, p, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + return b, err + } +} + +// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. +// u is the marshal info of the underlying message. +func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + n += u.size(v) + 2*tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, v, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMessageMarshaler returns the sizer and marshaler for a message field. +// u is the marshal info of the message. +func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.size(p) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(p) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, p, deterministic) + } +} + +// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. +// u is the marshal info of the message. +func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMapMarshaler returns the sizer and marshaler for a map field. +// f is the pointer to the reflect data structure of the field. +func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { + // figure out key and value type + t := f.Type + keyType := t.Key() + valType := t.Elem() + tags := strings.Split(f.Tag.Get("protobuf"), ",") + keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + stdOptions := false + for _, t := range tags { + if strings.HasPrefix(t, "customtype=") { + valTags = append(valTags, t) + } + if t == "stdtime" { + valTags = append(valTags, t) + stdOptions = true + } + if t == "stdduration" { + valTags = append(valTags, t) + stdOptions = true + } + if t == "wktptr" { + valTags = append(valTags, t) + } + } + keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map + valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map + keyWireTag := 1<<3 | wiretype(keyTags[0]) + valWireTag := 2<<3 | wiretype(valTags[0]) + + // We create an interface to get the addresses of the map key and value. + // If value is pointer-typed, the interface is a direct interface, the + // idata itself is the value. Otherwise, the idata is the pointer to the + // value. + // Key cannot be pointer-typed. + valIsPtr := valType.Kind() == reflect.Ptr + + // If value is a message with nested maps, calling + // valSizer in marshal may be quadratic. We should use + // cached version in marshal (but not in size). + // If value is not message type, we don't have size cache, + // but it cannot be nested either. Just use valSizer. + valCachedSizer := valSizer + if valIsPtr && !stdOptions && valType.Elem().Kind() == reflect.Struct { + u := getMarshalInfo(valType.Elem()) + valCachedSizer = func(ptr pointer, tagsize int) int { + // Same as message sizer, but use cache. + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.cachedsize(p) + return siz + SizeVarint(uint64(siz)) + tagsize + } + } + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(t).Elem() // the map + n := 0 + for _, k := range m.MapKeys() { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(t).Elem() // the map + var err error + keys := m.MapKeys() + if len(keys) > 1 && deterministic { + sort.Sort(mapKeys(keys)) + } + + var nerr nonFatal + for _, k := range keys { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + b = appendVarint(b, tag) + siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + b = appendVarint(b, uint64(siz)) + b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) + if !nerr.Merge(err) { + return b, err + } + b, err = valMarshaler(b, vaddr, valWireTag, deterministic) + if err != ErrNil && !nerr.Merge(err) { // allow nil value in map + return b, err + } + } + return b, nerr.E + } +} + +// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. +// fi is the marshal info of the field. +// f is the pointer to the reflect data structure of the field. +func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { + // Oneof field is an interface. We need to get the actual data type on the fly. + t := f.Type + return func(ptr pointer, _ int) int { + p := ptr.getInterfacePointer() + if p.isNil() { + return 0 + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + e := fi.oneofElems[telem] + return e.sizer(p, e.tagsize) + }, + func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { + p := ptr.getInterfacePointer() + if p.isNil() { + return b, nil + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { + return b, errOneofHasNil + } + e := fi.oneofElems[telem] + return e.marshaler(b, p, e.wiretag, deterministic) + } +} + +// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. +func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + mu.Unlock() + return n +} + +// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. +func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + // Not sure this is required, but the old code does it. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// message set format is: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } + +// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field +// in message set format (above). +func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for id, e := range m { + n += 2 // start group, end group. tag = 1 (size=1) + n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + siz := len(msgWithLen) + n += siz + 1 // message, tag = 3 (size=1) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, 1) // message, tag = 3 (size=1) + } + mu.Unlock() + return n +} + +// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) +// to the end of byte slice b. +func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for id, e := range m { + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + if !nerr.Merge(err) { + return b, err + } + b = append(b, 1<<3|WireEndGroup) + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, id := range keys { + e := m[int32(id)] + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + b = append(b, 1<<3|WireEndGroup) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// sizeV1Extensions computes the size of encoded data for a V1-API extension field. +func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { + if m == nil { + return 0 + } + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + return n +} + +// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. +func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { + if m == nil { + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + var err error + var nerr nonFatal + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// newMarshaler is the interface representing objects that can marshal themselves. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newMarshaler interface { + XXX_Size() int + XXX_Marshal(b []byte, deterministic bool) ([]byte, error) +} + +// Size returns the encoded size of a protocol buffer message. +// This is the main entry point. +func Size(pb Message) int { + if m, ok := pb.(newMarshaler); ok { + return m.XXX_Size() + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, _ := m.Marshal() + return len(b) + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return 0 + } + var info InternalMessageInfo + return info.Size(pb) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, returning the data. +// This is the main entry point. +func Marshal(pb Message) ([]byte, error) { + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + b := make([]byte, 0, siz) + return m.XXX_Marshal(b, false) + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + return m.Marshal() + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return nil, ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + b := make([]byte, 0, siz) + return info.Marshal(b, pb, false) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, writing the result to the +// Buffer. +// This is an alternative entry point. It is not necessary to use +// a Buffer for most applications. +func (p *Buffer) Marshal(pb Message) error { + var err error + if p.deterministic { + if _, ok := pb.(Marshaler); ok { + return fmt.Errorf("proto: deterministic not supported by the Marshal method of %T", pb) + } + } + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + p.grow(siz) // make sure buf has enough capacity + pp := p.buf[len(p.buf) : len(p.buf) : len(p.buf)+siz] + pp, err = m.XXX_Marshal(pp, p.deterministic) + p.buf = append(p.buf, pp...) + return err + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + var b []byte + b, err = m.Marshal() + p.buf = append(p.buf, b...) + return err + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + p.grow(siz) // make sure buf has enough capacity + p.buf, err = info.Marshal(p.buf, pb, p.deterministic) + return err +} + +// grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After grow(n), at least n bytes can be written to the +// buffer without another allocation. +func (p *Buffer) grow(n int) { + need := len(p.buf) + n + if need <= cap(p.buf) { + return + } + newCap := len(p.buf) * 2 + if newCap < need { + newCap = need + } + p.buf = append(make([]byte, 0, newCap), p.buf...) +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go b/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go new file mode 100644 index 00000000..997f57c1 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.go @@ -0,0 +1,388 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" + "time" +) + +// makeMessageRefMarshaler differs a bit from makeMessageMarshaler +// It marshal a message T instead of a *T +func makeMessageRefMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + siz := u.size(ptr) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + b = appendVarint(b, wiretag) + siz := u.cachedsize(ptr) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, ptr, deterministic) + } +} + +// makeMessageRefSliceMarshaler differs quite a lot from makeMessageSliceMarshaler +// It marshals a slice of messages []T instead of []*T +func makeMessageRefSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + e := elem.Interface() + v := toAddrPointer(&e, false) + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + var err, errreq error + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + e := elem.Interface() + v := toAddrPointer(&e, false) + b = appendVarint(b, wiretag) + siz := u.size(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if err != nil { + if _, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errreq == nil { + errreq = err + } + continue + } + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + + return b, errreq + } +} + +func makeCustomPtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + m := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(custom) + siz := m.Size() + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + m := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(custom) + siz := m.Size() + buf, err := m.Marshal() + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + return b, nil + } +} + +func makeCustomMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(u.typ).Interface().(custom) + siz := m.Size() + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(u.typ).Interface().(custom) + siz := m.Size() + buf, err := m.Marshal() + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + return b, nil + } +} + +func makeTimeMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return 0 + } + siz := Size(ts) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return nil, err + } + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeTimePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return 0 + } + siz := Size(ts) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return nil, err + } + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeTimeSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(time.Time) + ts, err := timestampProto(t) + if err != nil { + return 0 + } + siz := Size(ts) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(time.Time) + ts, err := timestampProto(t) + if err != nil { + return nil, err + } + siz := Size(ts) + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeTimePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return 0 + } + siz := Size(ts) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*time.Time) + ts, err := timestampProto(*t) + if err != nil { + return nil, err + } + siz := Size(ts) + buf, err := Marshal(ts) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeDurationMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + d := ptr.asPointerTo(u.typ).Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + d := ptr.asPointerTo(u.typ).Interface().(*time.Duration) + dur := durationProto(*d) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeDurationPtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + d := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + d := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*time.Duration) + dur := durationProto(*d) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeDurationSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(time.Duration) + dur := durationProto(d) + siz := Size(dur) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(time.Duration) + dur := durationProto(d) + siz := Size(dur) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeDurationPtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + d := elem.Interface().(*time.Duration) + dur := durationProto(*d) + siz := Size(dur) + buf, err := Marshal(dur) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_merge.go b/vendor/github.com/gogo/protobuf/proto/table_merge.go new file mode 100644 index 00000000..60dcf70d --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_merge.go @@ -0,0 +1,676 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +// Merge merges the src message into dst. +// This assumes that dst and src of the same type and are non-nil. +func (a *InternalMessageInfo) Merge(dst, src Message) { + mi := atomicLoadMergeInfo(&a.merge) + if mi == nil { + mi = getMergeInfo(reflect.TypeOf(dst).Elem()) + atomicStoreMergeInfo(&a.merge, mi) + } + mi.merge(toPointer(&dst), toPointer(&src)) +} + +type mergeInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []mergeFieldInfo + unrecognized field // Offset of XXX_unrecognized +} + +type mergeFieldInfo struct { + field field // Offset of field, guaranteed to be valid + + // isPointer reports whether the value in the field is a pointer. + // This is true for the following situations: + // * Pointer to struct + // * Pointer to basic type (proto2 only) + // * Slice (first value in slice header is a pointer) + // * String (first value in string header is a pointer) + isPointer bool + + // basicWidth reports the width of the field assuming that it is directly + // embedded in the struct (as is the case for basic types in proto3). + // The possible values are: + // 0: invalid + // 1: bool + // 4: int32, uint32, float32 + // 8: int64, uint64, float64 + basicWidth int + + // Where dst and src are pointers to the types being merged. + merge func(dst, src pointer) +} + +var ( + mergeInfoMap = map[reflect.Type]*mergeInfo{} + mergeInfoLock sync.Mutex +) + +func getMergeInfo(t reflect.Type) *mergeInfo { + mergeInfoLock.Lock() + defer mergeInfoLock.Unlock() + mi := mergeInfoMap[t] + if mi == nil { + mi = &mergeInfo{typ: t} + mergeInfoMap[t] = mi + } + return mi +} + +// merge merges src into dst assuming they are both of type *mi.typ. +func (mi *mergeInfo) merge(dst, src pointer) { + if dst.isNil() { + panic("proto: nil destination") + } + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&mi.initialized) == 0 { + mi.computeMergeInfo() + } + + for _, fi := range mi.fields { + sfp := src.offset(fi.field) + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string + continue + } + if fi.basicWidth > 0 { + switch { + case fi.basicWidth == 1 && !*sfp.toBool(): + continue + case fi.basicWidth == 4 && *sfp.toUint32() == 0: + continue + case fi.basicWidth == 8 && *sfp.toUint64() == 0: + continue + } + } + } + + dfp := dst.offset(fi.field) + fi.merge(dfp, sfp) + } + + // TODO: Make this faster? + out := dst.asPointerTo(mi.typ).Elem() + in := src.asPointerTo(mi.typ).Elem() + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + if mi.unrecognized.IsValid() { + if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { + *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) + } + } +} + +func (mi *mergeInfo) computeMergeInfo() { + mi.lock.Lock() + defer mi.lock.Unlock() + if mi.initialized != 0 { + return + } + t := mi.typ + n := t.NumField() + + props := GetProperties(t) + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + mfi := mergeFieldInfo{field: toField(&f)} + tf := f.Type + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + switch tf.Kind() { + case reflect.Ptr, reflect.Slice, reflect.String: + // As a special case, we assume slices and strings are pointers + // since we know that the first field in the SliceSlice or + // StringHeader is a data pointer. + mfi.isPointer = true + case reflect.Bool: + mfi.basicWidth = 1 + case reflect.Int32, reflect.Uint32, reflect.Float32: + mfi.basicWidth = 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + mfi.basicWidth = 8 + } + } + + // Unwrap tf to get at its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + tf.Name()) + } + + switch tf.Kind() { + case reflect.Int32: + switch { + case isSlice: // E.g., []int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Slice is not defined (see pointer_reflect.go). + /* + sfsp := src.toInt32Slice() + if *sfsp != nil { + dfsp := dst.toInt32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + */ + sfs := src.getInt32Slice() + if sfs != nil { + dfs := dst.getInt32Slice() + dfs = append(dfs, sfs...) + if dfs == nil { + dfs = []int32{} + } + dst.setInt32Slice(dfs) + } + } + case isPointer: // E.g., *int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). + /* + sfpp := src.toInt32Ptr() + if *sfpp != nil { + dfpp := dst.toInt32Ptr() + if *dfpp == nil { + *dfpp = Int32(**sfpp) + } else { + **dfpp = **sfpp + } + } + */ + sfp := src.getInt32Ptr() + if sfp != nil { + dfp := dst.getInt32Ptr() + if dfp == nil { + dst.setInt32Ptr(*sfp) + } else { + *dfp = *sfp + } + } + } + default: // E.g., int32 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt32(); v != 0 { + *dst.toInt32() = v + } + } + } + case reflect.Int64: + switch { + case isSlice: // E.g., []int64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toInt64Slice() + if *sfsp != nil { + dfsp := dst.toInt64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + } + case isPointer: // E.g., *int64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toInt64Ptr() + if *sfpp != nil { + dfpp := dst.toInt64Ptr() + if *dfpp == nil { + *dfpp = Int64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., int64 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt64(); v != 0 { + *dst.toInt64() = v + } + } + } + case reflect.Uint32: + switch { + case isSlice: // E.g., []uint32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint32Slice() + if *sfsp != nil { + dfsp := dst.toUint32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint32{} + } + } + } + case isPointer: // E.g., *uint32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint32Ptr() + if *sfpp != nil { + dfpp := dst.toUint32Ptr() + if *dfpp == nil { + *dfpp = Uint32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint32 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint32(); v != 0 { + *dst.toUint32() = v + } + } + } + case reflect.Uint64: + switch { + case isSlice: // E.g., []uint64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint64Slice() + if *sfsp != nil { + dfsp := dst.toUint64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint64{} + } + } + } + case isPointer: // E.g., *uint64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint64Ptr() + if *sfpp != nil { + dfpp := dst.toUint64Ptr() + if *dfpp == nil { + *dfpp = Uint64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint64 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint64(); v != 0 { + *dst.toUint64() = v + } + } + } + case reflect.Float32: + switch { + case isSlice: // E.g., []float32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat32Slice() + if *sfsp != nil { + dfsp := dst.toFloat32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float32{} + } + } + } + case isPointer: // E.g., *float32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat32Ptr() + if *sfpp != nil { + dfpp := dst.toFloat32Ptr() + if *dfpp == nil { + *dfpp = Float32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float32 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat32(); v != 0 { + *dst.toFloat32() = v + } + } + } + case reflect.Float64: + switch { + case isSlice: // E.g., []float64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat64Slice() + if *sfsp != nil { + dfsp := dst.toFloat64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float64{} + } + } + } + case isPointer: // E.g., *float64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat64Ptr() + if *sfpp != nil { + dfpp := dst.toFloat64Ptr() + if *dfpp == nil { + *dfpp = Float64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float64 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat64(); v != 0 { + *dst.toFloat64() = v + } + } + } + case reflect.Bool: + switch { + case isSlice: // E.g., []bool + mfi.merge = func(dst, src pointer) { + sfsp := src.toBoolSlice() + if *sfsp != nil { + dfsp := dst.toBoolSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []bool{} + } + } + } + case isPointer: // E.g., *bool + mfi.merge = func(dst, src pointer) { + sfpp := src.toBoolPtr() + if *sfpp != nil { + dfpp := dst.toBoolPtr() + if *dfpp == nil { + *dfpp = Bool(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., bool + mfi.merge = func(dst, src pointer) { + if v := *src.toBool(); v { + *dst.toBool() = v + } + } + } + case reflect.String: + switch { + case isSlice: // E.g., []string + mfi.merge = func(dst, src pointer) { + sfsp := src.toStringSlice() + if *sfsp != nil { + dfsp := dst.toStringSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []string{} + } + } + } + case isPointer: // E.g., *string + mfi.merge = func(dst, src pointer) { + sfpp := src.toStringPtr() + if *sfpp != nil { + dfpp := dst.toStringPtr() + if *dfpp == nil { + *dfpp = String(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., string + mfi.merge = func(dst, src pointer) { + if v := *src.toString(); v != "" { + *dst.toString() = v + } + } + } + case reflect.Slice: + isProto3 := props.Prop[i].proto3 + switch { + case isPointer: + panic("bad pointer in byte slice case in " + tf.Name()) + case tf.Elem().Kind() != reflect.Uint8: + panic("bad element kind in byte slice case in " + tf.Name()) + case isSlice: // E.g., [][]byte + mfi.merge = func(dst, src pointer) { + sbsp := src.toBytesSlice() + if *sbsp != nil { + dbsp := dst.toBytesSlice() + for _, sb := range *sbsp { + if sb == nil { + *dbsp = append(*dbsp, nil) + } else { + *dbsp = append(*dbsp, append([]byte{}, sb...)) + } + } + if *dbsp == nil { + *dbsp = [][]byte{} + } + } + } + default: // E.g., []byte + mfi.merge = func(dst, src pointer) { + sbp := src.toBytes() + if *sbp != nil { + dbp := dst.toBytes() + if !isProto3 || len(*sbp) > 0 { + *dbp = append([]byte{}, *sbp...) + } + } + } + } + case reflect.Struct: + switch { + case isSlice && !isPointer: // E.g. []pb.T + mergeInfo := getMergeInfo(tf) + zero := reflect.Zero(tf) + mfi.merge = func(dst, src pointer) { + // TODO: Make this faster? + dstsp := dst.asPointerTo(f.Type) + dsts := dstsp.Elem() + srcs := src.asPointerTo(f.Type).Elem() + for i := 0; i < srcs.Len(); i++ { + dsts = reflect.Append(dsts, zero) + srcElement := srcs.Index(i).Addr() + dstElement := dsts.Index(dsts.Len() - 1).Addr() + mergeInfo.merge(valToPointer(dstElement), valToPointer(srcElement)) + } + if dsts.IsNil() { + dsts = reflect.MakeSlice(f.Type, 0, 0) + } + dstsp.Elem().Set(dsts) + } + case !isPointer: + mergeInfo := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + mergeInfo.merge(dst, src) + } + case isSlice: // E.g., []*pb.T + mergeInfo := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sps := src.getPointerSlice() + if sps != nil { + dps := dst.getPointerSlice() + for _, sp := range sps { + var dp pointer + if !sp.isNil() { + dp = valToPointer(reflect.New(tf)) + mergeInfo.merge(dp, sp) + } + dps = append(dps, dp) + } + if dps == nil { + dps = []pointer{} + } + dst.setPointerSlice(dps) + } + } + default: // E.g., *pb.T + mergeInfo := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sp := src.getPointer() + if !sp.isNil() { + dp := dst.getPointer() + if dp.isNil() { + dp = valToPointer(reflect.New(tf)) + dst.setPointer(dp) + } + mergeInfo.merge(dp, sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic("bad pointer or slice in map case in " + tf.Name()) + default: // E.g., map[K]V + mfi.merge = func(dst, src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + dm := dst.asPointerTo(tf).Elem() + if dm.IsNil() { + dm.Set(reflect.MakeMap(tf)) + } + + switch tf.Elem().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(Clone(val.Interface().(Message))) + dm.SetMapIndex(key, val) + } + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + dm.SetMapIndex(key, val) + } + default: // Basic type (e.g., string) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + dm.SetMapIndex(key, val) + } + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic("bad pointer or slice in interface case in " + tf.Name()) + default: // E.g., interface{} + // TODO: Make this faster? + mfi.merge = func(dst, src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + du := dst.asPointerTo(tf).Elem() + typ := su.Elem().Type() + if du.IsNil() || du.Elem().Type() != typ { + du.Set(reflect.New(typ.Elem())) // Initialize interface if empty + } + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + dv := du.Elem().Elem().Field(0) + if dv.Kind() == reflect.Ptr && dv.IsNil() { + dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + Merge(dv.Interface().(Message), sv.Interface().(Message)) + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) + default: // Basic type (e.g., string) + dv.Set(sv) + } + } + } + } + default: + panic(fmt.Sprintf("merger not found for type:%s", tf)) + } + mi.fields = append(mi.fields, mfi) + } + + mi.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + mi.unrecognized = toField(&f) + } + + atomic.StoreInt32(&mi.initialized, 1) +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go new file mode 100644 index 00000000..93722938 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_unmarshal.go @@ -0,0 +1,2249 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// Unmarshal is the entry point from the generated .pb.go files. +// This function is not intended to be used by non-generated code. +// This function is not subject to any compatibility guarantee. +// msg contains a pointer to a protocol buffer struct. +// b is the data to be unmarshaled into the protocol buffer. +// a is a pointer to a place to store cached unmarshal information. +func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { + // Load the unmarshal information for this message type. + // The atomic load ensures memory consistency. + u := atomicLoadUnmarshalInfo(&a.unmarshal) + if u == nil { + // Slow path: find unmarshal info for msg, update a with it. + u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) + atomicStoreUnmarshalInfo(&a.unmarshal, u) + } + // Then do the unmarshaling. + err := u.unmarshal(toPointer(&msg), b) + return err +} + +type unmarshalInfo struct { + typ reflect.Type // type of the protobuf struct + + // 0 = only typ field is initialized + // 1 = completely initialized + initialized int32 + lock sync.Mutex // prevents double initialization + dense []unmarshalFieldInfo // fields indexed by tag # + sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # + reqFields []string // names of required fields + reqMask uint64 // 1< 0 { + // Read tag and wire type. + // Special case 1 and 2 byte varints. + var x uint64 + if b[0] < 128 { + x = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + x = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + x, n = decodeVarint(b) + if n == 0 { + return io.ErrUnexpectedEOF + } + b = b[n:] + } + tag := x >> 3 + wire := int(x) & 7 + + // Dispatch on the tag to one of the unmarshal* functions below. + var f unmarshalFieldInfo + if tag < uint64(len(u.dense)) { + f = u.dense[tag] + } else { + f = u.sparse[tag] + } + if fn := f.unmarshal; fn != nil { + var err error + b, err = fn(b, m.offset(f.field), wire) + if err == nil { + reqMask |= f.reqMask + continue + } + if r, ok := err.(*RequiredNotSetError); ok { + // Remember this error, but keep parsing. We need to produce + // a full parse even if a required field is missing. + if errLater == nil { + errLater = r + } + reqMask |= f.reqMask + continue + } + if err != errInternalBadWireType { + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return err + } + // Fragments with bad wire type are treated as unknown fields. + } + + // Unknown tag. + if !u.unrecognized.IsValid() { + // Don't keep unrecognized data; just skip it. + var err error + b, err = skipField(b, wire) + if err != nil { + return err + } + continue + } + // Keep unrecognized data around. + // maybe in extensions, maybe in the unrecognized field. + z := m.offset(u.unrecognized).toBytes() + var emap map[int32]Extension + var e Extension + for _, r := range u.extensionRanges { + if uint64(r.Start) <= tag && tag <= uint64(r.End) { + if u.extensions.IsValid() { + mp := m.offset(u.extensions).toExtensions() + emap = mp.extensionsWrite() + e = emap[int32(tag)] + z = &e.enc + break + } + if u.oldExtensions.IsValid() { + p := m.offset(u.oldExtensions).toOldExtensions() + emap = *p + if emap == nil { + emap = map[int32]Extension{} + *p = emap + } + e = emap[int32(tag)] + z = &e.enc + break + } + if u.bytesExtensions.IsValid() { + z = m.offset(u.bytesExtensions).toBytes() + break + } + panic("no extensions field available") + } + } + // Use wire type to skip data. + var err error + b0 := b + b, err = skipField(b, wire) + if err != nil { + return err + } + *z = encodeVarint(*z, tag<<3|uint64(wire)) + *z = append(*z, b0[:len(b0)-len(b)]...) + + if emap != nil { + emap[int32(tag)] = e + } + } + if reqMask != u.reqMask && errLater == nil { + // A required field of this message is missing. + for _, n := range u.reqFields { + if reqMask&1 == 0 { + errLater = &RequiredNotSetError{n} + } + reqMask >>= 1 + } + } + return errLater +} + +// computeUnmarshalInfo fills in u with information for use +// in unmarshaling protocol buffers of type u.typ. +func (u *unmarshalInfo) computeUnmarshalInfo() { + u.lock.Lock() + defer u.lock.Unlock() + if u.initialized != 0 { + return + } + t := u.typ + n := t.NumField() + + // Set up the "not found" value for the unrecognized byte buffer. + // This is the default for proto3. + u.unrecognized = invalidField + u.extensions = invalidField + u.oldExtensions = invalidField + u.bytesExtensions = invalidField + + // List of the generated type and offset for each oneof field. + type oneofField struct { + ityp reflect.Type // interface type of oneof field + field field // offset in containing message + } + var oneofFields []oneofField + + for i := 0; i < n; i++ { + f := t.Field(i) + if f.Name == "XXX_unrecognized" { + // The byte slice used to hold unrecognized input is special. + if f.Type != reflect.TypeOf(([]byte)(nil)) { + panic("bad type for XXX_unrecognized field: " + f.Type.Name()) + } + u.unrecognized = toField(&f) + continue + } + if f.Name == "XXX_InternalExtensions" { + // Ditto here. + if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { + panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) + } + u.extensions = toField(&f) + if f.Tag.Get("protobuf_messageset") == "1" { + u.isMessageSet = true + } + continue + } + if f.Name == "XXX_extensions" { + // An older form of the extensions field. + if f.Type == reflect.TypeOf((map[int32]Extension)(nil)) { + u.oldExtensions = toField(&f) + continue + } else if f.Type == reflect.TypeOf(([]byte)(nil)) { + u.bytesExtensions = toField(&f) + continue + } + panic("bad type for XXX_extensions field: " + f.Type.Name()) + } + if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { + continue + } + + oneof := f.Tag.Get("protobuf_oneof") + if oneof != "" { + oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) + // The rest of oneof processing happens below. + continue + } + + tags := f.Tag.Get("protobuf") + tagArray := strings.Split(tags, ",") + if len(tagArray) < 2 { + panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) + } + tag, err := strconv.Atoi(tagArray[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tagArray[1]) + } + + name := "" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Extract unmarshaling function from the field (its type and tags). + unmarshal := fieldUnmarshaler(&f) + + // Required field? + var reqMask uint64 + if tagArray[2] == "req" { + bit := len(u.reqFields) + u.reqFields = append(u.reqFields, name) + reqMask = uint64(1) << uint(bit) + // TODO: if we have more than 64 required fields, we end up + // not verifying that all required fields are present. + // Fix this, perhaps using a count of required fields? + } + + // Store the info in the correct slot in the message. + u.setTag(tag, toField(&f), unmarshal, reqMask, name) + } + + // Find any types associated with oneof fields. + // gogo: len(oneofFields) > 0 is needed for embedded oneof messages, without a marshaler and unmarshaler + if len(oneofFields) > 0 { + var oneofImplementers []interface{} + switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) { + case oneofFuncsIface: + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + case oneofWrappersIface: + oneofImplementers = m.XXX_OneofWrappers() + } + for _, v := range oneofImplementers { + tptr := reflect.TypeOf(v) // *Msg_X + typ := tptr.Elem() // Msg_X + + f := typ.Field(0) // oneof implementers have one field + baseUnmarshal := fieldUnmarshaler(&f) + tags := strings.Split(f.Tag.Get("protobuf"), ",") + fieldNum, err := strconv.Atoi(tags[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tags[1]) + } + var name string + for _, tag := range tags { + if strings.HasPrefix(tag, "name=") { + name = strings.TrimPrefix(tag, "name=") + break + } + } + + // Find the oneof field that this struct implements. + // Might take O(n^2) to process all of the oneofs, but who cares. + for _, of := range oneofFields { + if tptr.Implements(of.ityp) { + // We have found the corresponding interface for this struct. + // That lets us know where this struct should be stored + // when we encounter it during unmarshaling. + unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) + u.setTag(fieldNum, of.field, unmarshal, 0, name) + } + } + + } + } + + // Get extension ranges, if any. + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + if fn.IsValid() { + if !u.extensions.IsValid() && !u.oldExtensions.IsValid() && !u.bytesExtensions.IsValid() { + panic("a message with extensions, but no extensions field in " + t.Name()) + } + u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) + } + + // Explicitly disallow tag 0. This will ensure we flag an error + // when decoding a buffer of all zeros. Without this code, we + // would decode and skip an all-zero buffer of even length. + // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. + u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { + return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) + }, 0, "") + + // Set mask for required field check. + u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? + for len(u.dense) <= tag { + u.dense = append(u.dense, unmarshalFieldInfo{}) + } + u.dense[tag] = i + return + } + if u.sparse == nil { + u.sparse = map[uint64]unmarshalFieldInfo{} + } + u.sparse[uint64(tag)] = i +} + +// fieldUnmarshaler returns an unmarshaler for the given field. +func fieldUnmarshaler(f *reflect.StructField) unmarshaler { + if f.Type.Kind() == reflect.Map { + return makeUnmarshalMap(f) + } + return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) +} + +// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. +func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { + tagArray := strings.Split(tags, ",") + encoding := tagArray[0] + name := "unknown" + ctype := false + isTime := false + isDuration := false + isWktPointer := false + proto3 := false + validateUTF8 := true + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + if tag == "proto3" { + proto3 = true + } + if strings.HasPrefix(tag, "customtype=") { + ctype = true + } + if tag == "stdtime" { + isTime = true + } + if tag == "stdduration" { + isDuration = true + } + if tag == "wktptr" { + isWktPointer = true + } + } + validateUTF8 = validateUTF8 && proto3 + + // Figure out packaging (pointer, slice, or both) + slice := false + pointer := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + if ctype { + if reflect.PtrTo(t).Implements(customType) { + if slice { + return makeUnmarshalCustomSlice(getUnmarshalInfo(t), name) + } + if pointer { + return makeUnmarshalCustomPtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalCustom(getUnmarshalInfo(t), name) + } else { + panic(fmt.Sprintf("custom type: type: %v, does not implement the proto.custom interface", t)) + } + } + + if isTime { + if pointer { + if slice { + return makeUnmarshalTimePtrSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalTimePtr(getUnmarshalInfo(t), name) + } + if slice { + return makeUnmarshalTimeSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalTime(getUnmarshalInfo(t), name) + } + + if isDuration { + if pointer { + if slice { + return makeUnmarshalDurationPtrSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalDurationPtr(getUnmarshalInfo(t), name) + } + if slice { + return makeUnmarshalDurationSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalDuration(getUnmarshalInfo(t), name) + } + + if isWktPointer { + switch t.Kind() { + case reflect.Float64: + if pointer { + if slice { + return makeStdDoubleValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdDoubleValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdDoubleValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdDoubleValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Float32: + if pointer { + if slice { + return makeStdFloatValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdFloatValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdFloatValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdFloatValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Int64: + if pointer { + if slice { + return makeStdInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt64ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Uint64: + if pointer { + if slice { + return makeStdUInt64ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt64ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdUInt64ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt64ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Int32: + if pointer { + if slice { + return makeStdInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdInt32ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Uint32: + if pointer { + if slice { + return makeStdUInt32ValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt32ValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdUInt32ValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdUInt32ValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.Bool: + if pointer { + if slice { + return makeStdBoolValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBoolValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdBoolValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBoolValueUnmarshaler(getUnmarshalInfo(t), name) + case reflect.String: + if pointer { + if slice { + return makeStdStringValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdStringValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdStringValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdStringValueUnmarshaler(getUnmarshalInfo(t), name) + case uint8SliceType: + if pointer { + if slice { + return makeStdBytesValuePtrSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBytesValuePtrUnmarshaler(getUnmarshalInfo(t), name) + } + if slice { + return makeStdBytesValueSliceUnmarshaler(getUnmarshalInfo(t), name) + } + return makeStdBytesValueUnmarshaler(getUnmarshalInfo(t), name) + default: + panic(fmt.Sprintf("unknown wktpointer type %#v", t)) + } + } + + // We'll never have both pointer and slice for basic types. + if pointer && slice && t.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + t.Name()) + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return unmarshalBoolPtr + } + if slice { + return unmarshalBoolSlice + } + return unmarshalBoolValue + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixedS32Ptr + } + if slice { + return unmarshalFixedS32Slice + } + return unmarshalFixedS32Value + case "varint": + // this could be int32 or enum + if pointer { + return unmarshalInt32Ptr + } + if slice { + return unmarshalInt32Slice + } + return unmarshalInt32Value + case "zigzag32": + if pointer { + return unmarshalSint32Ptr + } + if slice { + return unmarshalSint32Slice + } + return unmarshalSint32Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixedS64Ptr + } + if slice { + return unmarshalFixedS64Slice + } + return unmarshalFixedS64Value + case "varint": + if pointer { + return unmarshalInt64Ptr + } + if slice { + return unmarshalInt64Slice + } + return unmarshalInt64Value + case "zigzag64": + if pointer { + return unmarshalSint64Ptr + } + if slice { + return unmarshalSint64Slice + } + return unmarshalSint64Value + } + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixed32Ptr + } + if slice { + return unmarshalFixed32Slice + } + return unmarshalFixed32Value + case "varint": + if pointer { + return unmarshalUint32Ptr + } + if slice { + return unmarshalUint32Slice + } + return unmarshalUint32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixed64Ptr + } + if slice { + return unmarshalFixed64Slice + } + return unmarshalFixed64Value + case "varint": + if pointer { + return unmarshalUint64Ptr + } + if slice { + return unmarshalUint64Slice + } + return unmarshalUint64Value + } + case reflect.Float32: + if pointer { + return unmarshalFloat32Ptr + } + if slice { + return unmarshalFloat32Slice + } + return unmarshalFloat32Value + case reflect.Float64: + if pointer { + return unmarshalFloat64Ptr + } + if slice { + return unmarshalFloat64Slice + } + return unmarshalFloat64Value + case reflect.Map: + panic("map type in typeUnmarshaler in " + t.Name()) + case reflect.Slice: + if pointer { + panic("bad pointer in slice case in " + t.Name()) + } + if slice { + return unmarshalBytesSlice + } + return unmarshalBytesValue + case reflect.String: + if validateUTF8 { + if pointer { + return unmarshalUTF8StringPtr + } + if slice { + return unmarshalUTF8StringSlice + } + return unmarshalUTF8StringValue + } + if pointer { + return unmarshalStringPtr + } + if slice { + return unmarshalStringSlice + } + return unmarshalStringValue + case reflect.Struct: + // message or group field + if !pointer { + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlice(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessage(getUnmarshalInfo(t), name) + } + } + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) + case "group": + if slice { + return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) + } + } + panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) +} + +// Below are all the unmarshalers for individual fields of various types. + +func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64() = v + return b, nil +} + +func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64() = v + return b, nil +} + +func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64() = v + return b, nil +} + +func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64Ptr() = &v + return b, nil +} + +func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + *f.toInt32() = v + return b, nil +} + +func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + *f.toInt32() = v + return b, nil +} + +func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32() = v + return b, nil +} + +func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32Ptr() = &v + return b, nil +} + +func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64() = v + return b[8:], nil +} + +func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64() = v + return b[8:], nil +} + +func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32() = v + return b[4:], nil +} + +func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32Ptr() = &v + return b[4:], nil +} + +func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + *f.toInt32() = v + return b[4:], nil +} + +func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.setInt32Ptr(v) + return b[4:], nil +} + +func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + return b[4:], nil +} + +func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + // Note: any length varint is allowed, even though any sane + // encoder will use one byte. + // See https://github.com/golang/protobuf/issues/76 + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + // TODO: check if x>1? Tests seem to indicate no. + v := x != 0 + *f.toBool() = v + return b[n:], nil +} + +func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + *f.toBoolPtr() = &v + return b[n:], nil +} + +func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + b = b[n:] + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + return b[n:], nil +} + +func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64() = v + return b[8:], nil +} + +func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64Ptr() = &v + return b[8:], nil +} + +func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32() = v + return b[4:], nil +} + +func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32Ptr() = &v + return b[4:], nil +} + +func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + return b[x:], nil +} + +func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + return b[x:], nil +} + +func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + return b[x:], nil +} + +func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +var emptyBuf [0]byte + +func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // The use of append here is a trick which avoids the zeroing + // that would be required if we used a make/copy pair. + // We append to emptyBuf instead of nil because we want + // a non-nil result even when the length is 0. + v := append(emptyBuf[:], b[:x]...) + *f.toBytes() = v + return b[x:], nil +} + +func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := append(emptyBuf[:], b[:x]...) + s := f.toBytesSlice() + *s = append(*s, v) + return b[x:], nil +} + +func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[y:], err + } +} + +func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[y:], err + } +} + +func makeUnmarshalMap(f *reflect.StructField) unmarshaler { + t := f.Type + kt := t.Key() + vt := t.Elem() + tagArray := strings.Split(f.Tag.Get("protobuf"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + for _, t := range tagArray { + if strings.HasPrefix(t, "customtype=") { + valTags = append(valTags, t) + } + if t == "stdtime" { + valTags = append(valTags, t) + } + if t == "stdduration" { + valTags = append(valTags, t) + } + if t == "wktptr" { + valTags = append(valTags, t) + } + } + unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) + unmarshalVal := typeUnmarshaler(vt, strings.Join(valTags, ",")) + return func(b []byte, f pointer, w int) ([]byte, error) { + // The map entry is a submessage. Figure out how big it is. + if w != WireBytes { + return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + r := b[x:] // unused data to return + b = b[:x] // data for map entry + + // Note: we could use #keys * #values ~= 200 functions + // to do map decoding without reflection. Probably not worth it. + // Maps will be somewhat slow. Oh well. + + // Read key and value from data. + var nerr nonFatal + k := reflect.New(kt) + v := reflect.New(vt) + for len(b) > 0 { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + wire := int(x) & 7 + b = b[n:] + + var err error + switch x >> 3 { + case 1: + b, err = unmarshalKey(b, valToPointer(k), wire) + case 2: + b, err = unmarshalVal(b, valToPointer(v), wire) + default: + err = errInternalBadWireType // skip unknown tag + } + + if nerr.Merge(err) { + continue + } + if err != errInternalBadWireType { + return nil, err + } + + // Skip past unknown fields. + b, err = skipField(b, wire) + if err != nil { + return nil, err + } + } + + // Get map, allocate if needed. + m := f.asPointerTo(t).Elem() // an addressable map[K]T + if m.IsNil() { + m.Set(reflect.MakeMap(t)) + } + + // Insert into map. + m.SetMapIndex(k.Elem(), v.Elem()) + + return r, nerr.E + } +} + +// makeUnmarshalOneof makes an unmarshaler for oneof fields. +// for: +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } +// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). +// ityp is the interface type of the oneof field (e.g. isMsg_F). +// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). +// Note that this function will be called once for each case in the oneof. +func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { + sf := typ.Field(0) + field0 := toField(&sf) + return func(b []byte, f pointer, w int) ([]byte, error) { + // Allocate holder for value. + v := reflect.New(typ) + + // Unmarshal data into holder. + // We unmarshal into the first field of the holder object. + var err error + var nerr nonFatal + b, err = unmarshal(b, valToPointer(v).offset(field0), w) + if !nerr.Merge(err) { + return nil, err + } + + // Write pointer to holder into target field. + f.asPointerTo(ityp).Elem().Set(v) + + return b, nerr.E + } +} + +// Error used by decode internally. +var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") + +// skipField skips past a field of type wire and returns the remaining bytes. +func skipField(b []byte, wire int) ([]byte, error) { + switch wire { + case WireVarint: + _, k := decodeVarint(b) + if k == 0 { + return b, io.ErrUnexpectedEOF + } + b = b[k:] + case WireFixed32: + if len(b) < 4 { + return b, io.ErrUnexpectedEOF + } + b = b[4:] + case WireFixed64: + if len(b) < 8 { + return b, io.ErrUnexpectedEOF + } + b = b[8:] + case WireBytes: + m, k := decodeVarint(b) + if k == 0 || uint64(len(b)-k) < m { + return b, io.ErrUnexpectedEOF + } + b = b[uint64(k)+m:] + case WireStartGroup: + _, i := findEndGroup(b) + if i == -1 { + return b, io.ErrUnexpectedEOF + } + b = b[i:] + default: + return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) + } + return b, nil +} + +// findEndGroup finds the index of the next EndGroup tag. +// Groups may be nested, so the "next" EndGroup tag is the first +// unpaired EndGroup. +// findEndGroup returns the indexes of the start and end of the EndGroup tag. +// Returns (-1,-1) if it can't find one. +func findEndGroup(b []byte) (int, int) { + depth := 1 + i := 0 + for { + x, n := decodeVarint(b[i:]) + if n == 0 { + return -1, -1 + } + j := i + i += n + switch x & 7 { + case WireVarint: + _, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + case WireFixed32: + if len(b)-4 < i { + return -1, -1 + } + i += 4 + case WireFixed64: + if len(b)-8 < i { + return -1, -1 + } + i += 8 + case WireBytes: + m, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + if uint64(len(b)-i) < m { + return -1, -1 + } + i += int(m) + case WireStartGroup: + depth++ + case WireEndGroup: + depth-- + if depth == 0 { + return j, i + } + default: + return -1, -1 + } + } +} + +// encodeVarint appends a varint-encoded integer to b and returns the result. +func encodeVarint(b []byte, x uint64) []byte { + for x >= 1<<7 { + b = append(b, byte(x&0x7f|0x80)) + x >>= 7 + } + return append(b, byte(x)) +} + +// decodeVarint reads a varint-encoded integer from b. +// Returns the decoded integer and the number of bytes read. +// If there is an error, it returns 0,0. +func decodeVarint(b []byte) (uint64, int) { + var x, y uint64 + if len(b) == 0 { + goto bad + } + x = uint64(b[0]) + if x < 0x80 { + return x, 1 + } + x -= 0x80 + + if len(b) <= 1 { + goto bad + } + y = uint64(b[1]) + x += y << 7 + if y < 0x80 { + return x, 2 + } + x -= 0x80 << 7 + + if len(b) <= 2 { + goto bad + } + y = uint64(b[2]) + x += y << 14 + if y < 0x80 { + return x, 3 + } + x -= 0x80 << 14 + + if len(b) <= 3 { + goto bad + } + y = uint64(b[3]) + x += y << 21 + if y < 0x80 { + return x, 4 + } + x -= 0x80 << 21 + + if len(b) <= 4 { + goto bad + } + y = uint64(b[4]) + x += y << 28 + if y < 0x80 { + return x, 5 + } + x -= 0x80 << 28 + + if len(b) <= 5 { + goto bad + } + y = uint64(b[5]) + x += y << 35 + if y < 0x80 { + return x, 6 + } + x -= 0x80 << 35 + + if len(b) <= 6 { + goto bad + } + y = uint64(b[6]) + x += y << 42 + if y < 0x80 { + return x, 7 + } + x -= 0x80 << 42 + + if len(b) <= 7 { + goto bad + } + y = uint64(b[7]) + x += y << 49 + if y < 0x80 { + return x, 8 + } + x -= 0x80 << 49 + + if len(b) <= 8 { + goto bad + } + y = uint64(b[8]) + x += y << 56 + if y < 0x80 { + return x, 9 + } + x -= 0x80 << 56 + + if len(b) <= 9 { + goto bad + } + y = uint64(b[9]) + x += y << 63 + if y < 2 { + return x, 10 + } + +bad: + return 0, 0 +} diff --git a/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go b/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go new file mode 100644 index 00000000..00d6c7ad --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.go @@ -0,0 +1,385 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "io" + "reflect" +) + +func makeUnmarshalMessage(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f // gogo: changed from v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendRef(v, sub.typ) // gogo: changed from f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalCustomPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.New(sub.typ)) + m := s.Interface().(custom) + if err := m.Unmarshal(b[:x]); err != nil { + return nil, err + } + return b[x:], nil + } +} + +func makeUnmarshalCustomSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := reflect.New(sub.typ) + c := m.Interface().(custom) + if err := c.Unmarshal(b[:x]); err != nil { + return nil, err + } + v := valToPointer(m) + f.appendRef(v, sub.typ) + return b[x:], nil + } +} + +func makeUnmarshalCustom(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + + m := f.asPointerTo(sub.typ).Interface().(custom) + if err := m.Unmarshal(b[:x]); err != nil { + return nil, err + } + return b[x:], nil + } +} + +func makeUnmarshalTime(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(t)) + return b[x:], nil + } +} + +func makeUnmarshalTimePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&t)) + return b[x:], nil + } +} + +func makeUnmarshalTimePtrSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&t)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeUnmarshalTimeSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := ×tamp{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + t, err := timestampFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(t)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeUnmarshalDurationPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&d)) + return b[x:], nil + } +} + +func makeUnmarshalDuration(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(d)) + return b[x:], nil + } +} + +func makeUnmarshalDurationPtrSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&d)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeUnmarshalDurationSlice(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &duration{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + d, err := durationFromProto(m) + if err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(d)) + slice.Set(newSlice) + return b[x:], nil + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/text.go b/vendor/github.com/gogo/protobuf/proto/text.go new file mode 100644 index 00000000..87416afe --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/text.go @@ -0,0 +1,930 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" + "sync" + "time" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Print("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if name == "XXX_NoUnkeyedLiteral" { + continue + } + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if len(props.Enum) > 0 { + if err := tm.writeEnum(w, v, props); err != nil { + return err + } + } else if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.MapValProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if props.proto3 && fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + + if len(props.Enum) > 0 { + if err := tm.writeEnum(w, fv, props); err != nil { + return err + } + } else if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv + if pv.CanAddr() { + pv = sv.Addr() + } else { + pv = reflect.New(sv.Type()) + pv.Elem().Set(sv) + } + if _, err := extendable(pv.Interface()); err == nil { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +var textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + if props != nil { + if len(props.CustomType) > 0 { + custom, ok := v.Interface().(Marshaler) + if ok { + data, err := custom.Marshal() + if err != nil { + return err + } + if err := writeString(w, string(data)); err != nil { + return err + } + return nil + } + } else if len(props.CastType) > 0 { + if _, ok := v.Interface().(interface { + String() string + }); ok { + switch v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + _, err := fmt.Fprintf(w, "%d", v.Interface()) + return err + } + } + } else if props.StdTime { + t, ok := v.Interface().(time.Time) + if !ok { + return fmt.Errorf("stdtime is not time.Time, but %T", v.Interface()) + } + tproto, err := timestampProto(t) + if err != nil { + return err + } + propsCopy := *props // Make a copy so that this is goroutine-safe + propsCopy.StdTime = false + err = tm.writeAny(w, reflect.ValueOf(tproto), &propsCopy) + return err + } else if props.StdDuration { + d, ok := v.Interface().(time.Duration) + if !ok { + return fmt.Errorf("stdtime is not time.Duration, but %T", v.Interface()) + } + dproto := durationProto(d) + propsCopy := *props // Make a copy so that this is goroutine-safe + propsCopy.StdDuration = false + err := tm.writeAny(w, reflect.ValueOf(dproto), &propsCopy) + return err + } + } + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Bytes())); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if v.CanAddr() { + // Calling v.Interface on a struct causes the reflect package to + // copy the entire struct. This is racy with the new Marshaler + // since we atomically update the XXX_sizecache. + // + // Thus, we retrieve a pointer to the struct if possible to avoid + // a race since v.Interface on the pointer doesn't copy the struct. + // + // If v is not addressable, then we are not worried about a race + // since it implies that the binary Marshaler cannot possibly be + // mutating this value. + v = v.Addr() + } + if v.Type().Implements(textMarshalerType) { + text, err := v.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if err := tm.writeStruct(w, v); err != nil { + return err + } + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, ferr := fmt.Fprintf(w, "/* %v */\n", err) + return ferr + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, werr := w.Write(endBraceNewline); werr != nil { + return werr + } + continue + } + if _, ferr := fmt.Fprint(w, tag); ferr != nil { + return ferr + } + if wire != WireStartGroup { + if err = w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err = w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + e := pv.Interface().(Message) + + var m map[int32]Extension + var mu sync.Locker + if em, ok := e.(extensionsBytes); ok { + eb := em.GetExtensions() + var err error + m, err = BytesToExtensionsMap(*eb) + if err != nil { + return err + } + mu = notLocker{} + } else if _, ok := e.(extendableProto); ok { + ep, _ := extendable(e) + m, mu = ep.extensionsRead() + if m == nil { + return nil + } + } + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(e, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/gogo/protobuf/proto/text_gogo.go b/vendor/github.com/gogo/protobuf/proto/text_gogo.go new file mode 100644 index 00000000..1d6c6aa0 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/text_gogo.go @@ -0,0 +1,57 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" +) + +func (tm *TextMarshaler) writeEnum(w *textWriter, v reflect.Value, props *Properties) error { + m, ok := enumStringMaps[props.Enum] + if !ok { + if err := tm.writeAny(w, v, props); err != nil { + return err + } + } + key := int32(0) + if v.Kind() == reflect.Ptr { + key = int32(v.Elem().Int()) + } else { + key = int32(v.Int()) + } + s, ok := m[key] + if !ok { + if err := tm.writeAny(w, v, props); err != nil { + return err + } + } + _, err := fmt.Fprint(w, s) + return err +} diff --git a/vendor/github.com/gogo/protobuf/proto/text_parser.go b/vendor/github.com/gogo/protobuf/proto/text_parser.go new file mode 100644 index 00000000..1ce0be2f --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/text_parser.go @@ -0,0 +1,1018 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2013, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + ss := string(r) + s[:2] + s = s[2:] + i, err := strconv.ParseUint(ss, 8, 8) + if err != nil { + return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) + } + return string([]byte{byte(i)}), s, nil + case 'x', 'X', 'u', 'U': + var n int + switch r { + case 'x', 'X': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) + } + ss := s[:n] + s = s[n:] + i, err := strconv.ParseUint(ss, 16, 64) + if err != nil { + return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) + } + if r == 'x' || r == 'X' { + return string([]byte{byte(i)}), s, nil + } + if i > utf8.MaxRune { + return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + } + return string(i), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.MapKeyProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.MapValProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + if p.done && tok.value != "]" { + return "", p.errorf("unclosed type_url or extension name") + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + if len(props.CustomType) > 0 { + if props.Repeated { + t := reflect.TypeOf(v.Interface()) + if t.Kind() == reflect.Slice { + tc := reflect.TypeOf(new(Marshaler)) + ok := t.Elem().Implements(tc.Elem()) + if ok { + fv := v + flen := fv.Len() + if flen == fv.Cap() { + nav := reflect.MakeSlice(v.Type(), flen, 2*flen+1) + reflect.Copy(nav, fv) + fv.Set(nav) + } + fv.SetLen(flen + 1) + + // Read one. + p.back() + return p.readAny(fv.Index(flen), props) + } + } + } + if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { + custom := reflect.New(props.ctype.Elem()).Interface().(Unmarshaler) + err := custom.Unmarshal([]byte(tok.unquoted)) + if err != nil { + return p.errorf("%v %v: %v", err, v.Type(), tok.value) + } + v.Set(reflect.ValueOf(custom)) + } else { + custom := reflect.New(reflect.TypeOf(v.Interface())).Interface().(Unmarshaler) + err := custom.Unmarshal([]byte(tok.unquoted)) + if err != nil { + return p.errorf("%v %v: %v", err, v.Type(), tok.value) + } + v.Set(reflect.Indirect(reflect.ValueOf(custom))) + } + return nil + } + if props.StdTime { + fv := v + p.back() + props.StdTime = false + tproto := ×tamp{} + err := p.readAny(reflect.ValueOf(tproto).Elem(), props) + props.StdTime = true + if err != nil { + return err + } + tim, err := timestampFromProto(tproto) + if err != nil { + return err + } + if props.Repeated { + t := reflect.TypeOf(v.Interface()) + if t.Kind() == reflect.Slice { + if t.Elem().Kind() == reflect.Ptr { + ts := fv.Interface().([]*time.Time) + ts = append(ts, &tim) + fv.Set(reflect.ValueOf(ts)) + return nil + } else { + ts := fv.Interface().([]time.Time) + ts = append(ts, tim) + fv.Set(reflect.ValueOf(ts)) + return nil + } + } + } + if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { + v.Set(reflect.ValueOf(&tim)) + } else { + v.Set(reflect.Indirect(reflect.ValueOf(&tim))) + } + return nil + } + if props.StdDuration { + fv := v + p.back() + props.StdDuration = false + dproto := &duration{} + err := p.readAny(reflect.ValueOf(dproto).Elem(), props) + props.StdDuration = true + if err != nil { + return err + } + dur, err := durationFromProto(dproto) + if err != nil { + return err + } + if props.Repeated { + t := reflect.TypeOf(v.Interface()) + if t.Kind() == reflect.Slice { + if t.Elem().Kind() == reflect.Ptr { + ds := fv.Interface().([]*time.Duration) + ds = append(ds, &dur) + fv.Set(reflect.ValueOf(ds)) + return nil + } else { + ds := fv.Interface().([]time.Duration) + ds = append(ds, dur) + fv.Set(reflect.ValueOf(ds)) + return nil + } + } + } + if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { + v.Set(reflect.ValueOf(&dur)) + } else { + v.Set(reflect.Indirect(reflect.ValueOf(&dur))) + } + return nil + } + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + ntok := p.next() + if ntok.err != nil { + return ntok.err + } + if ntok.value == "]" { + break + } + if ntok.value != "," { + return p.errorf("Expected ']' or ',' found %q", ntok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // true/1/t/True or false/f/0/False. + switch tok.value { + case "true", "1", "t", "True": + fv.SetBool(true) + return nil + case "false", "0", "f", "False": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int8: + if x, err := strconv.ParseInt(tok.value, 0, 8); err == nil { + fv.SetInt(x) + return nil + } + case reflect.Int16: + if x, err := strconv.ParseInt(tok.value, 0, 16); err == nil { + fv.SetInt(x) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint8: + if x, err := strconv.ParseUint(tok.value, 0, 8); err == nil { + fv.SetUint(x) + return nil + } + case reflect.Uint16: + if x, err := strconv.ParseUint(tok.value, 0, 16); err == nil { + fv.SetUint(x) + return nil + } + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(uint64(x)) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + return um.UnmarshalText([]byte(s)) + } + pb.Reset() + v := reflect.ValueOf(pb) + return newTextParser(s).readStruct(v.Elem(), "") +} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp.go b/vendor/github.com/gogo/protobuf/proto/timestamp.go new file mode 100644 index 00000000..9324f654 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/timestamp.go @@ -0,0 +1,113 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// This file implements operations on google.protobuf.Timestamp. + +import ( + "errors" + "fmt" + "time" +) + +const ( + // Seconds field of the earliest valid Timestamp. + // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + minValidSeconds = -62135596800 + // Seconds field just after the latest valid Timestamp. + // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + maxValidSeconds = 253402300800 +) + +// validateTimestamp determines whether a Timestamp is valid. +// A valid timestamp represents a time in the range +// [0001-01-01, 10000-01-01) and has a Nanos field +// in the range [0, 1e9). +// +// If the Timestamp is valid, validateTimestamp returns nil. +// Otherwise, it returns an error that describes +// the problem. +// +// Every valid Timestamp can be represented by a time.Time, but the converse is not true. +func validateTimestamp(ts *timestamp) error { + if ts == nil { + return errors.New("timestamp: nil Timestamp") + } + if ts.Seconds < minValidSeconds { + return fmt.Errorf("timestamp: %#v before 0001-01-01", ts) + } + if ts.Seconds >= maxValidSeconds { + return fmt.Errorf("timestamp: %#v after 10000-01-01", ts) + } + if ts.Nanos < 0 || ts.Nanos >= 1e9 { + return fmt.Errorf("timestamp: %#v: nanos not in range [0, 1e9)", ts) + } + return nil +} + +// TimestampFromProto converts a google.protobuf.Timestamp proto to a time.Time. +// It returns an error if the argument is invalid. +// +// Unlike most Go functions, if Timestamp returns an error, the first return value +// is not the zero time.Time. Instead, it is the value obtained from the +// time.Unix function when passed the contents of the Timestamp, in the UTC +// locale. This may or may not be a meaningful time; many invalid Timestamps +// do map to valid time.Times. +// +// A nil Timestamp returns an error. The first return value in that case is +// undefined. +func timestampFromProto(ts *timestamp) (time.Time, error) { + // Don't return the zero value on error, because corresponds to a valid + // timestamp. Instead return whatever time.Unix gives us. + var t time.Time + if ts == nil { + t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp + } else { + t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() + } + return t, validateTimestamp(ts) +} + +// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. +// It returns an error if the resulting Timestamp is invalid. +func timestampProto(t time.Time) (*timestamp, error) { + seconds := t.Unix() + nanos := int32(t.Sub(time.Unix(seconds, 0))) + ts := ×tamp{ + Seconds: seconds, + Nanos: nanos, + } + if err := validateTimestamp(ts); err != nil { + return nil, err + } + return ts, nil +} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go b/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go new file mode 100644 index 00000000..38439fa9 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go @@ -0,0 +1,49 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2016, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "reflect" + "time" +) + +var timeType = reflect.TypeOf((*time.Time)(nil)).Elem() + +type timestamp struct { + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` +} + +func (m *timestamp) Reset() { *m = timestamp{} } +func (*timestamp) ProtoMessage() {} +func (*timestamp) String() string { return "timestamp" } + +func init() { + RegisterType((*timestamp)(nil), "gogo.protobuf.proto.timestamp") +} diff --git a/vendor/github.com/gogo/protobuf/proto/wrappers.go b/vendor/github.com/gogo/protobuf/proto/wrappers.go new file mode 100644 index 00000000..b175d1b6 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/wrappers.go @@ -0,0 +1,1888 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "io" + "reflect" +) + +func makeStdDoubleValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*float64) + v := &float64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdDoubleValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float64) + v := &float64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdDoubleValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float64) + v := &float64Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float64) + v := &float64Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdDoubleValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float64) + v := &float64Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdDoubleValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdDoubleValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdDoubleValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdDoubleValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdFloatValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*float32) + v := &float32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdFloatValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*float32) + v := &float32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdFloatValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float32) + v := &float32Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(float32) + v := &float32Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdFloatValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*float32) + v := &float32Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdFloatValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdFloatValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdFloatValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdFloatValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &float32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt64ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*int64) + v := &int64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt64ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int64) + v := &int64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt64ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int64) + v := &int64Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int64) + v := &int64Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt64ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int64) + v := &int64Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt64ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdInt64ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdInt64ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt64ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt64ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*uint64) + v := &uint64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt64ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint64) + v := &uint64Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt64ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint64) + v := &uint64Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint64) + v := &uint64Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt64ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint64) + v := &uint64Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt64ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdUInt64ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdUInt64ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt64ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint64Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt32ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*int32) + v := &int32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt32ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*int32) + v := &int32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdInt32ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int32) + v := &int32Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(int32) + v := &int32Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt32ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*int32) + v := &int32Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdInt32ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdInt32ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdInt32ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdInt32ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &int32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt32ValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*uint32) + v := &uint32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt32ValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*uint32) + v := &uint32Value{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdUInt32ValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint32) + v := &uint32Value{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(uint32) + v := &uint32Value{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt32ValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*uint32) + v := &uint32Value{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdUInt32ValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdUInt32ValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdUInt32ValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdUInt32ValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &uint32Value{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBoolValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*bool) + v := &boolValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBoolValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*bool) + v := &boolValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBoolValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(bool) + v := &boolValue{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(bool) + v := &boolValue{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBoolValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*bool) + v := &boolValue{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBoolValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdBoolValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdBoolValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBoolValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &boolValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdStringValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*string) + v := &stringValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdStringValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*string) + v := &stringValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdStringValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(string) + v := &stringValue{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(string) + v := &stringValue{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdStringValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*string) + v := &stringValue{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdStringValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdStringValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdStringValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdStringValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &stringValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBytesValueMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + t := ptr.asPointerTo(u.typ).Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + t := ptr.asPointerTo(u.typ).Interface().(*[]byte) + v := &bytesValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBytesValuePtrMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + if ptr.isNil() { + return 0 + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + return tagsize + SizeVarint(uint64(siz)) + siz + }, func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + if ptr.isNil() { + return b, nil + } + t := ptr.asPointerTo(reflect.PtrTo(u.typ)).Elem().Interface().(*[]byte) + v := &bytesValue{*t} + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(buf))) + b = append(b, buf...) + return b, nil + } +} + +func makeStdBytesValueSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(u.typ) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().([]byte) + v := &bytesValue{t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(u.typ) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().([]byte) + v := &bytesValue{t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBytesValuePtrSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + n := 0 + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getSlice(reflect.PtrTo(u.typ)) + for i := 0; i < s.Len(); i++ { + elem := s.Index(i) + t := elem.Interface().(*[]byte) + v := &bytesValue{*t} + siz := Size(v) + buf, err := Marshal(v) + if err != nil { + return nil, err + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(siz)) + b = append(b, buf...) + } + + return b, nil + } +} + +func makeStdBytesValueUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(sub.typ).Elem() + s.Set(reflect.ValueOf(m.Value)) + return b[x:], nil + } +} + +func makeStdBytesValuePtrUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + s := f.asPointerTo(reflect.PtrTo(sub.typ)).Elem() + s.Set(reflect.ValueOf(&m.Value)) + return b[x:], nil + } +} + +func makeStdBytesValuePtrSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(reflect.PtrTo(sub.typ)) + newSlice := reflect.Append(slice, reflect.ValueOf(&m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} + +func makeStdBytesValueSliceUnmarshaler(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return nil, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + m := &bytesValue{} + if err := Unmarshal(b[:x], m); err != nil { + return nil, err + } + slice := f.getSlice(sub.typ) + newSlice := reflect.Append(slice, reflect.ValueOf(m.Value)) + slice.Set(newSlice) + return b[x:], nil + } +} diff --git a/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go b/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go new file mode 100644 index 00000000..c1cf7bf8 --- /dev/null +++ b/vendor/github.com/gogo/protobuf/proto/wrappers_gogo.go @@ -0,0 +1,113 @@ +// Protocol Buffers for Go with Gadgets +// +// Copyright (c) 2018, The GoGo Authors. All rights reserved. +// http://github.com/gogo/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +type float64Value struct { + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *float64Value) Reset() { *m = float64Value{} } +func (*float64Value) ProtoMessage() {} +func (*float64Value) String() string { return "float64" } + +type float32Value struct { + Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *float32Value) Reset() { *m = float32Value{} } +func (*float32Value) ProtoMessage() {} +func (*float32Value) String() string { return "float32" } + +type int64Value struct { + Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *int64Value) Reset() { *m = int64Value{} } +func (*int64Value) ProtoMessage() {} +func (*int64Value) String() string { return "int64" } + +type uint64Value struct { + Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *uint64Value) Reset() { *m = uint64Value{} } +func (*uint64Value) ProtoMessage() {} +func (*uint64Value) String() string { return "uint64" } + +type int32Value struct { + Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *int32Value) Reset() { *m = int32Value{} } +func (*int32Value) ProtoMessage() {} +func (*int32Value) String() string { return "int32" } + +type uint32Value struct { + Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *uint32Value) Reset() { *m = uint32Value{} } +func (*uint32Value) ProtoMessage() {} +func (*uint32Value) String() string { return "uint32" } + +type boolValue struct { + Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *boolValue) Reset() { *m = boolValue{} } +func (*boolValue) ProtoMessage() {} +func (*boolValue) String() string { return "bool" } + +type stringValue struct { + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *stringValue) Reset() { *m = stringValue{} } +func (*stringValue) ProtoMessage() {} +func (*stringValue) String() string { return "string" } + +type bytesValue struct { + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *bytesValue) Reset() { *m = bytesValue{} } +func (*bytesValue) ProtoMessage() {} +func (*bytesValue) String() string { return "[]byte" } + +func init() { + RegisterType((*float64Value)(nil), "gogo.protobuf.proto.DoubleValue") + RegisterType((*float32Value)(nil), "gogo.protobuf.proto.FloatValue") + RegisterType((*int64Value)(nil), "gogo.protobuf.proto.Int64Value") + RegisterType((*uint64Value)(nil), "gogo.protobuf.proto.UInt64Value") + RegisterType((*int32Value)(nil), "gogo.protobuf.proto.Int32Value") + RegisterType((*uint32Value)(nil), "gogo.protobuf.proto.UInt32Value") + RegisterType((*boolValue)(nil), "gogo.protobuf.proto.BoolValue") + RegisterType((*stringValue)(nil), "gogo.protobuf.proto.StringValue") + RegisterType((*bytesValue)(nil), "gogo.protobuf.proto.BytesValue") +} diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go index fdd328bb..70fbda53 100644 --- a/vendor/github.com/golang/protobuf/proto/lib.go +++ b/vendor/github.com/golang/protobuf/proto/lib.go @@ -393,7 +393,7 @@ func (p *Buffer) Bytes() []byte { return p.buf } // than relying on this API. // // If deterministic serialization is requested, map entries will be sorted -// by keys in lexographical order. This is an implementation detail and +// by keys in lexicographical order. This is an implementation detail and // subject to change. func (p *Buffer) SetDeterministic(deterministic bool) { p.deterministic = deterministic diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go index 1aaee725..d97f9b35 100644 --- a/vendor/github.com/golang/protobuf/proto/text.go +++ b/vendor/github.com/golang/protobuf/proto/text.go @@ -456,6 +456,8 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return nil } +var textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() + // writeAny writes an arbitrary field. func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { v = reflect.Indirect(v) @@ -519,8 +521,8 @@ func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Propert // mutating this value. v = v.Addr() } - if etm, ok := v.Interface().(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() + if v.Type().Implements(textMarshalerType) { + text, err := v.Interface().(encoding.TextMarshaler).MarshalText() if err != nil { return err } diff --git a/vendor/github.com/golang/protobuf/ptypes/any.go b/vendor/github.com/golang/protobuf/ptypes/any.go new file mode 100644 index 00000000..70276e8f --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/any.go @@ -0,0 +1,141 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package ptypes + +// This file implements functions to marshal proto.Message to/from +// google.protobuf.Any message. + +import ( + "fmt" + "reflect" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/any" +) + +const googleApis = "type.googleapis.com/" + +// AnyMessageName returns the name of the message contained in a google.protobuf.Any message. +// +// Note that regular type assertions should be done using the Is +// function. AnyMessageName is provided for less common use cases like filtering a +// sequence of Any messages based on a set of allowed message type names. +func AnyMessageName(any *any.Any) (string, error) { + if any == nil { + return "", fmt.Errorf("message is nil") + } + slash := strings.LastIndex(any.TypeUrl, "/") + if slash < 0 { + return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) + } + return any.TypeUrl[slash+1:], nil +} + +// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. +func MarshalAny(pb proto.Message) (*any.Any, error) { + value, err := proto.Marshal(pb) + if err != nil { + return nil, err + } + return &any.Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil +} + +// DynamicAny is a value that can be passed to UnmarshalAny to automatically +// allocate a proto.Message for the type specified in a google.protobuf.Any +// message. The allocated message is stored in the embedded proto.Message. +// +// Example: +// +// var x ptypes.DynamicAny +// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } +// fmt.Printf("unmarshaled message: %v", x.Message) +type DynamicAny struct { + proto.Message +} + +// Empty returns a new proto.Message of the type specified in a +// google.protobuf.Any message. It returns an error if corresponding message +// type isn't linked in. +func Empty(any *any.Any) (proto.Message, error) { + aname, err := AnyMessageName(any) + if err != nil { + return nil, err + } + + t := proto.MessageType(aname) + if t == nil { + return nil, fmt.Errorf("any: message type %q isn't linked in", aname) + } + return reflect.New(t.Elem()).Interface().(proto.Message), nil +} + +// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any +// message and places the decoded result in pb. It returns an error if type of +// contents of Any message does not match type of pb message. +// +// pb can be a proto.Message, or a *DynamicAny. +func UnmarshalAny(any *any.Any, pb proto.Message) error { + if d, ok := pb.(*DynamicAny); ok { + if d.Message == nil { + var err error + d.Message, err = Empty(any) + if err != nil { + return err + } + } + return UnmarshalAny(any, d.Message) + } + + aname, err := AnyMessageName(any) + if err != nil { + return err + } + + mname := proto.MessageName(pb) + if aname != mname { + return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) + } + return proto.Unmarshal(any.Value, pb) +} + +// Is returns true if any value contains a given message type. +func Is(any *any.Any, pb proto.Message) bool { + // The following is equivalent to AnyMessageName(any) == proto.MessageName(pb), + // but it avoids scanning TypeUrl for the slash. + if any == nil { + return false + } + name := proto.MessageName(pb) + prefix := len(any.TypeUrl) - len(name) + return prefix >= 1 && any.TypeUrl[prefix-1] == '/' && any.TypeUrl[prefix:] == name +} diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go b/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go new file mode 100644 index 00000000..78ee5233 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go @@ -0,0 +1,200 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/any.proto + +package any + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := ptypes.MarshalAny(foo) +// ... +// foo := &pb.Foo{} +// if err := ptypes.UnmarshalAny(any, foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +type Any struct { + // A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` + // Must be a valid serialized protocol buffer of the above specified type. + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Any) Reset() { *m = Any{} } +func (m *Any) String() string { return proto.CompactTextString(m) } +func (*Any) ProtoMessage() {} +func (*Any) Descriptor() ([]byte, []int) { + return fileDescriptor_b53526c13ae22eb4, []int{0} +} + +func (*Any) XXX_WellKnownType() string { return "Any" } + +func (m *Any) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Any.Unmarshal(m, b) +} +func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Any.Marshal(b, m, deterministic) +} +func (m *Any) XXX_Merge(src proto.Message) { + xxx_messageInfo_Any.Merge(m, src) +} +func (m *Any) XXX_Size() int { + return xxx_messageInfo_Any.Size(m) +} +func (m *Any) XXX_DiscardUnknown() { + xxx_messageInfo_Any.DiscardUnknown(m) +} + +var xxx_messageInfo_Any proto.InternalMessageInfo + +func (m *Any) GetTypeUrl() string { + if m != nil { + return m.TypeUrl + } + return "" +} + +func (m *Any) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func init() { + proto.RegisterType((*Any)(nil), "google.protobuf.Any") +} + +func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_b53526c13ae22eb4) } + +var fileDescriptor_b53526c13ae22eb4 = []byte{ + // 185 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4, + 0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a, + 0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46, + 0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7, + 0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xca, 0xe7, 0x12, 0x4e, 0xce, + 0xcf, 0xd5, 0x43, 0x33, 0xce, 0x89, 0xc3, 0x31, 0xaf, 0x32, 0x00, 0xc4, 0x09, 0x60, 0x8c, 0x52, + 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, + 0x4b, 0x47, 0xb8, 0xa8, 0x00, 0x64, 0x7a, 0x31, 0xc8, 0x61, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, + 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x8c, 0x0a, 0x80, 0x2a, 0xd1, 0x0b, 0x4f, 0xcd, 0xc9, 0xf1, 0xce, + 0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0x29, 0x4d, 0x62, 0x03, 0xeb, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, + 0xff, 0x13, 0xf8, 0xe8, 0x42, 0xdd, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/doc.go b/vendor/github.com/golang/protobuf/ptypes/doc.go new file mode 100644 index 00000000..c0d595da --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/doc.go @@ -0,0 +1,35 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package ptypes contains code for interacting with well-known types. +*/ +package ptypes diff --git a/vendor/github.com/golang/protobuf/ptypes/duration.go b/vendor/github.com/golang/protobuf/ptypes/duration.go new file mode 100644 index 00000000..26d1ca2f --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/duration.go @@ -0,0 +1,102 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package ptypes + +// This file implements conversions between google.protobuf.Duration +// and time.Duration. + +import ( + "errors" + "fmt" + "time" + + durpb "github.com/golang/protobuf/ptypes/duration" +) + +const ( + // Range of a durpb.Duration in seconds, as specified in + // google/protobuf/duration.proto. This is about 10,000 years in seconds. + maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) + minSeconds = -maxSeconds +) + +// validateDuration determines whether the durpb.Duration is valid according to the +// definition in google/protobuf/duration.proto. A valid durpb.Duration +// may still be too large to fit into a time.Duration (the range of durpb.Duration +// is about 10,000 years, and the range of time.Duration is about 290). +func validateDuration(d *durpb.Duration) error { + if d == nil { + return errors.New("duration: nil Duration") + } + if d.Seconds < minSeconds || d.Seconds > maxSeconds { + return fmt.Errorf("duration: %v: seconds out of range", d) + } + if d.Nanos <= -1e9 || d.Nanos >= 1e9 { + return fmt.Errorf("duration: %v: nanos out of range", d) + } + // Seconds and Nanos must have the same sign, unless d.Nanos is zero. + if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { + return fmt.Errorf("duration: %v: seconds and nanos have different signs", d) + } + return nil +} + +// Duration converts a durpb.Duration to a time.Duration. Duration +// returns an error if the durpb.Duration is invalid or is too large to be +// represented in a time.Duration. +func Duration(p *durpb.Duration) (time.Duration, error) { + if err := validateDuration(p); err != nil { + return 0, err + } + d := time.Duration(p.Seconds) * time.Second + if int64(d/time.Second) != p.Seconds { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + if p.Nanos != 0 { + d += time.Duration(p.Nanos) * time.Nanosecond + if (d < 0) != (p.Nanos < 0) { + return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) + } + } + return d, nil +} + +// DurationProto converts a time.Duration to a durpb.Duration. +func DurationProto(d time.Duration) *durpb.Duration { + nanos := d.Nanoseconds() + secs := nanos / 1e9 + nanos -= secs * 1e9 + return &durpb.Duration{ + Seconds: secs, + Nanos: int32(nanos), + } +} diff --git a/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go b/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go new file mode 100644 index 00000000..0d681ee2 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go @@ -0,0 +1,161 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/duration.proto + +package duration + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (durations.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +// +type Duration struct { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Duration) Reset() { *m = Duration{} } +func (m *Duration) String() string { return proto.CompactTextString(m) } +func (*Duration) ProtoMessage() {} +func (*Duration) Descriptor() ([]byte, []int) { + return fileDescriptor_23597b2ebd7ac6c5, []int{0} +} + +func (*Duration) XXX_WellKnownType() string { return "Duration" } + +func (m *Duration) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Duration.Unmarshal(m, b) +} +func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Duration.Marshal(b, m, deterministic) +} +func (m *Duration) XXX_Merge(src proto.Message) { + xxx_messageInfo_Duration.Merge(m, src) +} +func (m *Duration) XXX_Size() int { + return xxx_messageInfo_Duration.Size(m) +} +func (m *Duration) XXX_DiscardUnknown() { + xxx_messageInfo_Duration.DiscardUnknown(m) +} + +var xxx_messageInfo_Duration proto.InternalMessageInfo + +func (m *Duration) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Duration) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") +} + +func init() { proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor_23597b2ebd7ac6c5) } + +var fileDescriptor_23597b2ebd7ac6c5 = []byte{ + // 190 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a, + 0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56, + 0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5, + 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e, + 0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0xc3, 0x25, 0x9c, 0x9c, + 0x9f, 0xab, 0x87, 0x66, 0xa4, 0x13, 0x2f, 0xcc, 0xc0, 0x00, 0x90, 0x48, 0x00, 0x63, 0x94, 0x56, + 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x7a, 0x7e, 0x4e, 0x62, 0x5e, + 0x3a, 0xc2, 0x7d, 0x05, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x70, 0x67, 0xfe, 0x60, 0x64, 0x5c, 0xc4, + 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, 0x00, 0x54, 0xa9, 0x5e, 0x78, + 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, 0x12, 0x1b, 0xd8, 0x0c, 0x63, + 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x84, 0x30, 0xff, 0xf3, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp.go b/vendor/github.com/golang/protobuf/ptypes/timestamp.go new file mode 100644 index 00000000..8da0df01 --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/timestamp.go @@ -0,0 +1,132 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package ptypes + +// This file implements operations on google.protobuf.Timestamp. + +import ( + "errors" + "fmt" + "time" + + tspb "github.com/golang/protobuf/ptypes/timestamp" +) + +const ( + // Seconds field of the earliest valid Timestamp. + // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + minValidSeconds = -62135596800 + // Seconds field just after the latest valid Timestamp. + // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). + maxValidSeconds = 253402300800 +) + +// validateTimestamp determines whether a Timestamp is valid. +// A valid timestamp represents a time in the range +// [0001-01-01, 10000-01-01) and has a Nanos field +// in the range [0, 1e9). +// +// If the Timestamp is valid, validateTimestamp returns nil. +// Otherwise, it returns an error that describes +// the problem. +// +// Every valid Timestamp can be represented by a time.Time, but the converse is not true. +func validateTimestamp(ts *tspb.Timestamp) error { + if ts == nil { + return errors.New("timestamp: nil Timestamp") + } + if ts.Seconds < minValidSeconds { + return fmt.Errorf("timestamp: %v before 0001-01-01", ts) + } + if ts.Seconds >= maxValidSeconds { + return fmt.Errorf("timestamp: %v after 10000-01-01", ts) + } + if ts.Nanos < 0 || ts.Nanos >= 1e9 { + return fmt.Errorf("timestamp: %v: nanos not in range [0, 1e9)", ts) + } + return nil +} + +// Timestamp converts a google.protobuf.Timestamp proto to a time.Time. +// It returns an error if the argument is invalid. +// +// Unlike most Go functions, if Timestamp returns an error, the first return value +// is not the zero time.Time. Instead, it is the value obtained from the +// time.Unix function when passed the contents of the Timestamp, in the UTC +// locale. This may or may not be a meaningful time; many invalid Timestamps +// do map to valid time.Times. +// +// A nil Timestamp returns an error. The first return value in that case is +// undefined. +func Timestamp(ts *tspb.Timestamp) (time.Time, error) { + // Don't return the zero value on error, because corresponds to a valid + // timestamp. Instead return whatever time.Unix gives us. + var t time.Time + if ts == nil { + t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp + } else { + t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() + } + return t, validateTimestamp(ts) +} + +// TimestampNow returns a google.protobuf.Timestamp for the current time. +func TimestampNow() *tspb.Timestamp { + ts, err := TimestampProto(time.Now()) + if err != nil { + panic("ptypes: time.Now() out of Timestamp range") + } + return ts +} + +// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. +// It returns an error if the resulting Timestamp is invalid. +func TimestampProto(t time.Time) (*tspb.Timestamp, error) { + ts := &tspb.Timestamp{ + Seconds: t.Unix(), + Nanos: int32(t.Nanosecond()), + } + if err := validateTimestamp(ts); err != nil { + return nil, err + } + return ts, nil +} + +// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid +// Timestamps, it returns an error message in parentheses. +func TimestampString(ts *tspb.Timestamp) string { + t, err := Timestamp(ts) + if err != nil { + return fmt.Sprintf("(%v)", err) + } + return t.Format(time.RFC3339Nano) +} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go new file mode 100644 index 00000000..31cd846d --- /dev/null +++ b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go @@ -0,0 +1,179 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/timestamp.proto + +package timestamp + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// A Timestamp represents a point in time independent of any time zone +// or calendar, represented as seconds and fractions of seconds at +// nanosecond resolution in UTC Epoch time. It is encoded using the +// Proleptic Gregorian Calendar which extends the Gregorian calendar +// backwards to year one. It is encoded assuming all minutes are 60 +// seconds long, i.e. leap seconds are "smeared" so that no leap second +// table is needed for interpretation. Range is from +// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. +// By restricting to that range, we ensure that we can convert to +// and from RFC 3339 date strings. +// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// +// Example 5: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required. A proto3 JSON serializer should always use UTC (as indicated by +// "Z") when printing the Timestamp type and a proto3 JSON parser should be +// able to accept both UTC and other timezones (as indicated by an offset). +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) +// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one +// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime-- +// ) to obtain a formatter capable of generating timestamps in this format. +// +// +type Timestamp struct { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Timestamp) Reset() { *m = Timestamp{} } +func (m *Timestamp) String() string { return proto.CompactTextString(m) } +func (*Timestamp) ProtoMessage() {} +func (*Timestamp) Descriptor() ([]byte, []int) { + return fileDescriptor_292007bbfe81227e, []int{0} +} + +func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" } + +func (m *Timestamp) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Timestamp.Unmarshal(m, b) +} +func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Timestamp.Marshal(b, m, deterministic) +} +func (m *Timestamp) XXX_Merge(src proto.Message) { + xxx_messageInfo_Timestamp.Merge(m, src) +} +func (m *Timestamp) XXX_Size() int { + return xxx_messageInfo_Timestamp.Size(m) +} +func (m *Timestamp) XXX_DiscardUnknown() { + xxx_messageInfo_Timestamp.DiscardUnknown(m) +} + +var xxx_messageInfo_Timestamp proto.InternalMessageInfo + +func (m *Timestamp) GetSeconds() int64 { + if m != nil { + return m.Seconds + } + return 0 +} + +func (m *Timestamp) GetNanos() int32 { + if m != nil { + return m.Nanos + } + return 0 +} + +func init() { + proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") +} + +func init() { proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_292007bbfe81227e) } + +var fileDescriptor_292007bbfe81227e = []byte{ + // 191 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f, + 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d, + 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28, + 0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5, + 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89, + 0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x1d, 0x97, 0x70, + 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0x99, 0x4e, 0x7c, 0x70, 0x13, 0x03, 0x40, 0x42, 0x01, 0x8c, 0x51, + 0xda, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xe9, 0xf9, 0x39, 0x89, + 0x79, 0xe9, 0x08, 0x27, 0x16, 0x94, 0x54, 0x16, 0xa4, 0x16, 0x23, 0x5c, 0xfa, 0x83, 0x91, 0x71, + 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0xc9, 0x01, 0x50, 0xb5, 0x7a, + 0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, 0x3d, 0x49, 0x6c, 0x60, 0x43, + 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x77, 0x4a, 0x07, 0xf7, 0x00, 0x00, 0x00, +} diff --git a/vendor/github.com/inconshreveable/mousetrap/README.md b/vendor/github.com/inconshreveable/mousetrap/README.md deleted file mode 100644 index 7a950d17..00000000 --- a/vendor/github.com/inconshreveable/mousetrap/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# mousetrap - -mousetrap is a tiny library that answers a single question. - -On a Windows machine, was the process invoked by someone double clicking on -the executable file while browsing in explorer? - -### Motivation - -Windows developers unfamiliar with command line tools will often "double-click" -the executable for a tool. Because most CLI tools print the help and then exit -when invoked without arguments, this is often very frustrating for those users. - -mousetrap provides a way to detect these invocations so that you can provide -more helpful behavior and instructions on how to run the CLI tool. To see what -this looks like, both from an organizational and a technical perspective, see -https://inconshreveable.com/09-09-2014/sweat-the-small-stuff/ - -### The interface - -The library exposes a single interface: - - func StartedByExplorer() (bool) diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md b/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md deleted file mode 100644 index 195333e5..00000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Windows Terminal Sequences - -This library allow for enabling Windows terminal color support for Go. - -See [Console Virtual Terminal Sequences](https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences) for details. - -## Usage - -```go -import ( - "syscall" - - sequences "github.com/konsorten/go-windows-terminal-sequences" -) - -func main() { - sequences.EnableVirtualTerminalProcessing(syscall.Stdout, true) -} - -``` - -## Authors - -The tool is sponsored by the [marvin + konsorten GmbH](http://www.konsorten.de). - -We thank all the authors who provided code to this library: - -* Felix Kollmann -* Nicolas Perraut - -## License - -(The MIT License) - -Copyright (c) 2018 marvin + konsorten GmbH (open-source@konsorten.de) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod b/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod deleted file mode 100644 index 716c6131..00000000 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/konsorten/go-windows-terminal-sequences diff --git a/vendor/github.com/mattn/go-colorable/.travis.yml b/vendor/github.com/mattn/go-colorable/.travis.yml deleted file mode 100644 index 98db8f06..00000000 --- a/vendor/github.com/mattn/go-colorable/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: go -go: - - tip - -before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover -script: - - $HOME/gopath/bin/goveralls -repotoken xnXqRGwgW3SXIguzxf90ZSK1GPYZPaGrw diff --git a/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md deleted file mode 100644 index 56729a92..00000000 --- a/vendor/github.com/mattn/go-colorable/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# go-colorable - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) -[![Build Status](https://travis-ci.org/mattn/go-colorable.svg?branch=master)](https://travis-ci.org/mattn/go-colorable) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-colorable/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-colorable?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable) - -Colorable writer for windows. - -For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.) -This package is possible to handle escape sequence for ansi color on windows. - -## Too Bad! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png) - - -## So Good! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png) - -## Usage - -```go -logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true}) -logrus.SetOutput(colorable.NewColorableStdout()) - -logrus.Info("succeeded") -logrus.Warn("not correct") -logrus.Error("something error") -logrus.Fatal("panic") -``` - -You can compile above code on non-windows OSs. - -## Installation - -``` -$ go get github.com/mattn/go-colorable -``` - -# License - -MIT - -# Author - -Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/mattn/go-colorable/go.mod b/vendor/github.com/mattn/go-colorable/go.mod deleted file mode 100644 index ef3ca9d4..00000000 --- a/vendor/github.com/mattn/go-colorable/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/mattn/go-colorable - -require github.com/mattn/go-isatty v0.0.8 diff --git a/vendor/github.com/mattn/go-colorable/go.sum b/vendor/github.com/mattn/go-colorable/go.sum deleted file mode 100644 index 2c12960e..00000000 --- a/vendor/github.com/mattn/go-colorable/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/mattn/go-isatty/.travis.yml b/vendor/github.com/mattn/go-isatty/.travis.yml deleted file mode 100644 index 5597e026..00000000 --- a/vendor/github.com/mattn/go-isatty/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go -go: - - tip - -os: - - linux - - osx - -before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover -script: - - $HOME/gopath/bin/goveralls -repotoken 3gHdORO5k5ziZcWMBxnd9LrMZaJs8m9x5 diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md deleted file mode 100644 index 1e69004b..00000000 --- a/vendor/github.com/mattn/go-isatty/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# go-isatty - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) -[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) - -isatty for golang - -## Usage - -```go -package main - -import ( - "fmt" - "github.com/mattn/go-isatty" - "os" -) - -func main() { - if isatty.IsTerminal(os.Stdout.Fd()) { - fmt.Println("Is Terminal") - } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { - fmt.Println("Is Cygwin/MSYS2 Terminal") - } else { - fmt.Println("Is Not Terminal") - } -} -``` - -## Installation - -``` -$ go get github.com/mattn/go-isatty -``` - -## License - -MIT - -## Author - -Yasuhiro Matsumoto (a.k.a mattn) - -## Thanks - -* k-takata: base idea for IsCygwinTerminal - - https://github.com/k-takata/go-iscygpty diff --git a/vendor/github.com/mattn/go-isatty/go.mod b/vendor/github.com/mattn/go-isatty/go.mod deleted file mode 100644 index a8ddf404..00000000 --- a/vendor/github.com/mattn/go-isatty/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/mattn/go-isatty - -require golang.org/x/sys v0.0.0-20191008105621-543471e840be - -go 1.14 diff --git a/vendor/github.com/mattn/go-isatty/go.sum b/vendor/github.com/mattn/go-isatty/go.sum deleted file mode 100644 index c141fc53..00000000 --- a/vendor/github.com/mattn/go-isatty/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-isatty/isatty_android.go b/vendor/github.com/mattn/go-isatty/isatty_android.go deleted file mode 100644 index d3567cb5..00000000 --- a/vendor/github.com/mattn/go-isatty/isatty_android.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build android - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go index 07e93039..711f2880 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_bsd.go +++ b/vendor/github.com/mattn/go-isatty/isatty_bsd.go @@ -3,18 +3,12 @@ package isatty -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TIOCGETA +import "golang.org/x/sys/unix" // IsTerminal return true if the file descriptor is terminal. func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 + _, err := unix.IoctlGetTermios(int(fd), unix.TIOCGETA) + return err == nil } // IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 diff --git a/vendor/github.com/mattn/go-isatty/isatty_plan9.go b/vendor/github.com/mattn/go-isatty/isatty_plan9.go index bc0a7092..c5b6e0c0 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_plan9.go +++ b/vendor/github.com/mattn/go-isatty/isatty_plan9.go @@ -8,7 +8,7 @@ import ( // IsTerminal returns true if the given file descriptor is a terminal. func IsTerminal(fd uintptr) bool { - path, err := syscall.Fd2path(fd) + path, err := syscall.Fd2path(int(fd)) if err != nil { return false } diff --git a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go index 453b025d..31a1ca97 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go +++ b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go @@ -1,6 +1,5 @@ // +build linux aix // +build !appengine -// +build !android package isatty diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore deleted file mode 100644 index e16fb946..00000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore +++ /dev/null @@ -1 +0,0 @@ -cover.dat diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile deleted file mode 100644 index 81be2143..00000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: - -cover: - go test -cover -v -coverprofile=cover.dat ./... - go tool cover -func cover.dat - -.PHONY: cover diff --git a/vendor/github.com/mgutz/ansi/.gitignore b/vendor/github.com/mgutz/ansi/.gitignore deleted file mode 100644 index 9ed3b07c..00000000 --- a/vendor/github.com/mgutz/ansi/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.test diff --git a/vendor/github.com/mgutz/ansi/README.md b/vendor/github.com/mgutz/ansi/README.md deleted file mode 100644 index 8f8e20b7..00000000 --- a/vendor/github.com/mgutz/ansi/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# ansi - -Package ansi is a small, fast library to create ANSI colored strings and codes. - -## Install - -Get it - -```sh -go get -u github.com/mgutz/ansi -``` - -## Example - -```go -import "github.com/mgutz/ansi" - -// colorize a string, SLOW -msg := ansi.Color("foo", "red+b:white") - -// create a FAST closure function to avoid computation of ANSI code -phosphorize := ansi.ColorFunc("green+h:black") -msg = phosphorize("Bring back the 80s!") -msg2 := phospohorize("Look, I'm a CRT!") - -// cache escape codes and build strings manually -lime := ansi.ColorCode("green+h:black") -reset := ansi.ColorCode("reset") - -fmt.Println(lime, "Bring back the 80s!", reset) -``` - -Other examples - -```go -Color(s, "red") // red -Color(s, "red+b") // red bold -Color(s, "red+B") // red blinking -Color(s, "red+u") // red underline -Color(s, "red+bh") // red bold bright -Color(s, "red:white") // red on white -Color(s, "red+b:white+h") // red bold on white bright -Color(s, "red+B:white+h") // red blink on white bright -Color(s, "off") // turn off ansi codes -``` - -To view color combinations, from project directory in terminal. - -```sh -go test -``` - -## Style format - -```go -"foregroundColor+attributes:backgroundColor+attributes" -``` - -Colors - -* black -* red -* green -* yellow -* blue -* magenta -* cyan -* white -* 0...255 (256 colors) - -Foreground Attributes - -* B = Blink -* b = bold -* h = high intensity (bright) -* i = inverse -* s = strikethrough -* u = underline - -Background Attributes - -* h = high intensity (bright) - -## Constants - -* ansi.Reset -* ansi.DefaultBG -* ansi.DefaultFG -* ansi.Black -* ansi.Red -* ansi.Green -* ansi.Yellow -* ansi.Blue -* ansi.Magenta -* ansi.Cyan -* ansi.White -* ansi.LightBlack -* ansi.LightRed -* ansi.LightGreen -* ansi.LightYellow -* ansi.LightBlue -* ansi.LightMagenta -* ansi.LightCyan -* ansi.LightWhite - -## References - -Wikipedia ANSI escape codes [Colors](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) - -General [tips and formatting](http://misc.flogisoft.com/bash/tip_colors_and_formatting) - -What about support on Windows? Use [colorable by mattn](https://github.com/mattn/go-colorable). -Ansi and colorable are used by [logxi](https://github.com/mgutz/logxi) to support logging in -color on Windows. - -## MIT License - -Copyright (c) 2013 Mario Gutierrez mario@mgutz.com - -See the file LICENSE for copying permission. - diff --git a/vendor/github.com/prometheus/client_golang/prometheus/.gitignore b/vendor/github.com/prometheus/client_golang/prometheus/.gitignore deleted file mode 100644 index 3460f034..00000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/.gitignore +++ /dev/null @@ -1 +0,0 @@ -command-line-arguments.test diff --git a/vendor/github.com/prometheus/client_golang/prometheus/README.md b/vendor/github.com/prometheus/client_golang/prometheus/README.md deleted file mode 100644 index 44986bff..00000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/README.md +++ /dev/null @@ -1 +0,0 @@ -See [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus). diff --git a/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/vendor/github.com/prometheus/client_model/go/metrics.pb.go index 9805432c..2f4930d9 100644 --- a/vendor/github.com/prometheus/client_model/go/metrics.pb.go +++ b/vendor/github.com/prometheus/client_model/go/metrics.pb.go @@ -1,11 +1,14 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: metrics.proto -package io_prometheus_client // import "github.com/prometheus/client_model/go" +package io_prometheus_client -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -16,7 +19,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type MetricType int32 @@ -35,6 +38,7 @@ var MetricType_name = map[int32]string{ 3: "UNTYPED", 4: "HISTOGRAM", } + var MetricType_value = map[string]int32{ "COUNTER": 0, "GAUGE": 1, @@ -48,9 +52,11 @@ func (x MetricType) Enum() *MetricType { *p = x return p } + func (x MetricType) String() string { return proto.EnumName(MetricType_name, int32(x)) } + func (x *MetricType) UnmarshalJSON(data []byte) error { value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") if err != nil { @@ -59,8 +65,9 @@ func (x *MetricType) UnmarshalJSON(data []byte) error { *x = MetricType(value) return nil } + func (MetricType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{0} + return fileDescriptor_6039342a2ba47b72, []int{0} } type LabelPair struct { @@ -75,16 +82,17 @@ func (m *LabelPair) Reset() { *m = LabelPair{} } func (m *LabelPair) String() string { return proto.CompactTextString(m) } func (*LabelPair) ProtoMessage() {} func (*LabelPair) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{0} + return fileDescriptor_6039342a2ba47b72, []int{0} } + func (m *LabelPair) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LabelPair.Unmarshal(m, b) } func (m *LabelPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_LabelPair.Marshal(b, m, deterministic) } -func (dst *LabelPair) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelPair.Merge(dst, src) +func (m *LabelPair) XXX_Merge(src proto.Message) { + xxx_messageInfo_LabelPair.Merge(m, src) } func (m *LabelPair) XXX_Size() int { return xxx_messageInfo_LabelPair.Size(m) @@ -120,16 +128,17 @@ func (m *Gauge) Reset() { *m = Gauge{} } func (m *Gauge) String() string { return proto.CompactTextString(m) } func (*Gauge) ProtoMessage() {} func (*Gauge) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{1} + return fileDescriptor_6039342a2ba47b72, []int{1} } + func (m *Gauge) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Gauge.Unmarshal(m, b) } func (m *Gauge) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Gauge.Marshal(b, m, deterministic) } -func (dst *Gauge) XXX_Merge(src proto.Message) { - xxx_messageInfo_Gauge.Merge(dst, src) +func (m *Gauge) XXX_Merge(src proto.Message) { + xxx_messageInfo_Gauge.Merge(m, src) } func (m *Gauge) XXX_Size() int { return xxx_messageInfo_Gauge.Size(m) @@ -148,26 +157,28 @@ func (m *Gauge) GetValue() float64 { } type Counter struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Counter) Reset() { *m = Counter{} } func (m *Counter) String() string { return proto.CompactTextString(m) } func (*Counter) ProtoMessage() {} func (*Counter) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{2} + return fileDescriptor_6039342a2ba47b72, []int{2} } + func (m *Counter) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Counter.Unmarshal(m, b) } func (m *Counter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Counter.Marshal(b, m, deterministic) } -func (dst *Counter) XXX_Merge(src proto.Message) { - xxx_messageInfo_Counter.Merge(dst, src) +func (m *Counter) XXX_Merge(src proto.Message) { + xxx_messageInfo_Counter.Merge(m, src) } func (m *Counter) XXX_Size() int { return xxx_messageInfo_Counter.Size(m) @@ -185,6 +196,13 @@ func (m *Counter) GetValue() float64 { return 0 } +func (m *Counter) GetExemplar() *Exemplar { + if m != nil { + return m.Exemplar + } + return nil +} + type Quantile struct { Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` @@ -197,16 +215,17 @@ func (m *Quantile) Reset() { *m = Quantile{} } func (m *Quantile) String() string { return proto.CompactTextString(m) } func (*Quantile) ProtoMessage() {} func (*Quantile) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{3} + return fileDescriptor_6039342a2ba47b72, []int{3} } + func (m *Quantile) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Quantile.Unmarshal(m, b) } func (m *Quantile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Quantile.Marshal(b, m, deterministic) } -func (dst *Quantile) XXX_Merge(src proto.Message) { - xxx_messageInfo_Quantile.Merge(dst, src) +func (m *Quantile) XXX_Merge(src proto.Message) { + xxx_messageInfo_Quantile.Merge(m, src) } func (m *Quantile) XXX_Size() int { return xxx_messageInfo_Quantile.Size(m) @@ -244,16 +263,17 @@ func (m *Summary) Reset() { *m = Summary{} } func (m *Summary) String() string { return proto.CompactTextString(m) } func (*Summary) ProtoMessage() {} func (*Summary) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{4} + return fileDescriptor_6039342a2ba47b72, []int{4} } + func (m *Summary) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Summary.Unmarshal(m, b) } func (m *Summary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Summary.Marshal(b, m, deterministic) } -func (dst *Summary) XXX_Merge(src proto.Message) { - xxx_messageInfo_Summary.Merge(dst, src) +func (m *Summary) XXX_Merge(src proto.Message) { + xxx_messageInfo_Summary.Merge(m, src) } func (m *Summary) XXX_Size() int { return xxx_messageInfo_Summary.Size(m) @@ -296,16 +316,17 @@ func (m *Untyped) Reset() { *m = Untyped{} } func (m *Untyped) String() string { return proto.CompactTextString(m) } func (*Untyped) ProtoMessage() {} func (*Untyped) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{5} + return fileDescriptor_6039342a2ba47b72, []int{5} } + func (m *Untyped) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Untyped.Unmarshal(m, b) } func (m *Untyped) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Untyped.Marshal(b, m, deterministic) } -func (dst *Untyped) XXX_Merge(src proto.Message) { - xxx_messageInfo_Untyped.Merge(dst, src) +func (m *Untyped) XXX_Merge(src proto.Message) { + xxx_messageInfo_Untyped.Merge(m, src) } func (m *Untyped) XXX_Size() int { return xxx_messageInfo_Untyped.Size(m) @@ -336,16 +357,17 @@ func (m *Histogram) Reset() { *m = Histogram{} } func (m *Histogram) String() string { return proto.CompactTextString(m) } func (*Histogram) ProtoMessage() {} func (*Histogram) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{6} + return fileDescriptor_6039342a2ba47b72, []int{6} } + func (m *Histogram) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Histogram.Unmarshal(m, b) } func (m *Histogram) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Histogram.Marshal(b, m, deterministic) } -func (dst *Histogram) XXX_Merge(src proto.Message) { - xxx_messageInfo_Histogram.Merge(dst, src) +func (m *Histogram) XXX_Merge(src proto.Message) { + xxx_messageInfo_Histogram.Merge(m, src) } func (m *Histogram) XXX_Size() int { return xxx_messageInfo_Histogram.Size(m) @@ -378,27 +400,29 @@ func (m *Histogram) GetBucket() []*Bucket { } type Bucket struct { - CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count,json=cumulativeCount" json:"cumulative_count,omitempty"` - UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound,json=upperBound" json:"upper_bound,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count,json=cumulativeCount" json:"cumulative_count,omitempty"` + UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound,json=upperBound" json:"upper_bound,omitempty"` + Exemplar *Exemplar `protobuf:"bytes,3,opt,name=exemplar" json:"exemplar,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Bucket) Reset() { *m = Bucket{} } func (m *Bucket) String() string { return proto.CompactTextString(m) } func (*Bucket) ProtoMessage() {} func (*Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{7} + return fileDescriptor_6039342a2ba47b72, []int{7} } + func (m *Bucket) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Bucket.Unmarshal(m, b) } func (m *Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Bucket.Marshal(b, m, deterministic) } -func (dst *Bucket) XXX_Merge(src proto.Message) { - xxx_messageInfo_Bucket.Merge(dst, src) +func (m *Bucket) XXX_Merge(src proto.Message) { + xxx_messageInfo_Bucket.Merge(m, src) } func (m *Bucket) XXX_Size() int { return xxx_messageInfo_Bucket.Size(m) @@ -423,6 +447,68 @@ func (m *Bucket) GetUpperBound() float64 { return 0 } +func (m *Bucket) GetExemplar() *Exemplar { + if m != nil { + return m.Exemplar + } + return nil +} + +type Exemplar struct { + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + Timestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=timestamp" json:"timestamp,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Exemplar) Reset() { *m = Exemplar{} } +func (m *Exemplar) String() string { return proto.CompactTextString(m) } +func (*Exemplar) ProtoMessage() {} +func (*Exemplar) Descriptor() ([]byte, []int) { + return fileDescriptor_6039342a2ba47b72, []int{8} +} + +func (m *Exemplar) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Exemplar.Unmarshal(m, b) +} +func (m *Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Exemplar.Marshal(b, m, deterministic) +} +func (m *Exemplar) XXX_Merge(src proto.Message) { + xxx_messageInfo_Exemplar.Merge(m, src) +} +func (m *Exemplar) XXX_Size() int { + return xxx_messageInfo_Exemplar.Size(m) +} +func (m *Exemplar) XXX_DiscardUnknown() { + xxx_messageInfo_Exemplar.DiscardUnknown(m) +} + +var xxx_messageInfo_Exemplar proto.InternalMessageInfo + +func (m *Exemplar) GetLabel() []*LabelPair { + if m != nil { + return m.Label + } + return nil +} + +func (m *Exemplar) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +func (m *Exemplar) GetTimestamp() *timestamp.Timestamp { + if m != nil { + return m.Timestamp + } + return nil +} + type Metric struct { Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` @@ -440,16 +526,17 @@ func (m *Metric) Reset() { *m = Metric{} } func (m *Metric) String() string { return proto.CompactTextString(m) } func (*Metric) ProtoMessage() {} func (*Metric) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{8} + return fileDescriptor_6039342a2ba47b72, []int{9} } + func (m *Metric) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Metric.Unmarshal(m, b) } func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Metric.Marshal(b, m, deterministic) } -func (dst *Metric) XXX_Merge(src proto.Message) { - xxx_messageInfo_Metric.Merge(dst, src) +func (m *Metric) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metric.Merge(m, src) } func (m *Metric) XXX_Size() int { return xxx_messageInfo_Metric.Size(m) @@ -523,16 +610,17 @@ func (m *MetricFamily) Reset() { *m = MetricFamily{} } func (m *MetricFamily) String() string { return proto.CompactTextString(m) } func (*MetricFamily) ProtoMessage() {} func (*MetricFamily) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{9} + return fileDescriptor_6039342a2ba47b72, []int{10} } + func (m *MetricFamily) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MetricFamily.Unmarshal(m, b) } func (m *MetricFamily) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_MetricFamily.Marshal(b, m, deterministic) } -func (dst *MetricFamily) XXX_Merge(src proto.Message) { - xxx_messageInfo_MetricFamily.Merge(dst, src) +func (m *MetricFamily) XXX_Merge(src proto.Message) { + xxx_messageInfo_MetricFamily.Merge(m, src) } func (m *MetricFamily) XXX_Size() int { return xxx_messageInfo_MetricFamily.Size(m) @@ -572,6 +660,7 @@ func (m *MetricFamily) GetMetric() []*Metric { } func init() { + proto.RegisterEnum("io.prometheus.client.MetricType", MetricType_name, MetricType_value) proto.RegisterType((*LabelPair)(nil), "io.prometheus.client.LabelPair") proto.RegisterType((*Gauge)(nil), "io.prometheus.client.Gauge") proto.RegisterType((*Counter)(nil), "io.prometheus.client.Counter") @@ -580,50 +669,55 @@ func init() { proto.RegisterType((*Untyped)(nil), "io.prometheus.client.Untyped") proto.RegisterType((*Histogram)(nil), "io.prometheus.client.Histogram") proto.RegisterType((*Bucket)(nil), "io.prometheus.client.Bucket") + proto.RegisterType((*Exemplar)(nil), "io.prometheus.client.Exemplar") proto.RegisterType((*Metric)(nil), "io.prometheus.client.Metric") proto.RegisterType((*MetricFamily)(nil), "io.prometheus.client.MetricFamily") - proto.RegisterEnum("io.prometheus.client.MetricType", MetricType_name, MetricType_value) } -func init() { proto.RegisterFile("metrics.proto", fileDescriptor_metrics_c97c9a2b9560cb8f) } - -var fileDescriptor_metrics_c97c9a2b9560cb8f = []byte{ - // 591 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4f, 0x4f, 0xdb, 0x4e, - 0x14, 0xfc, 0x99, 0xd8, 0x09, 0x7e, 0x86, 0x5f, 0xad, 0x15, 0x07, 0xab, 0x2d, 0x25, 0xcd, 0x89, - 0xf6, 0x10, 0x54, 0x04, 0xaa, 0x44, 0xdb, 0x03, 0x50, 0x1a, 0x2a, 0xd5, 0x40, 0x37, 0xc9, 0x81, - 0x5e, 0xac, 0x8d, 0x59, 0x25, 0x56, 0xbd, 0xb6, 0x6b, 0xef, 0x22, 0xe5, 0xdc, 0x43, 0xbf, 0x47, - 0xbf, 0x68, 0xab, 0xfd, 0xe3, 0x18, 0x24, 0xc3, 0xa9, 0xb7, 0xb7, 0xf3, 0x66, 0xde, 0x8e, 0x77, - 0xc7, 0x0b, 0x9b, 0x8c, 0xf2, 0x32, 0x89, 0xab, 0x61, 0x51, 0xe6, 0x3c, 0x47, 0x5b, 0x49, 0x2e, - 0x2b, 0x46, 0xf9, 0x82, 0x8a, 0x6a, 0x18, 0xa7, 0x09, 0xcd, 0xf8, 0xe0, 0x10, 0xdc, 0x2f, 0x64, - 0x46, 0xd3, 0x2b, 0x92, 0x94, 0x08, 0x81, 0x9d, 0x11, 0x46, 0x03, 0xab, 0x6f, 0xed, 0xba, 0x58, - 0xd5, 0x68, 0x0b, 0x9c, 0x5b, 0x92, 0x0a, 0x1a, 0xac, 0x29, 0x50, 0x2f, 0x06, 0xdb, 0xe0, 0x8c, - 0x88, 0x98, 0xdf, 0x69, 0x4b, 0x8d, 0x55, 0xb7, 0x77, 0xa0, 0x77, 0x9a, 0x8b, 0x8c, 0xd3, 0xf2, - 0x01, 0xc2, 0x7b, 0x58, 0xff, 0x2a, 0x48, 0xc6, 0x93, 0x94, 0xa2, 0xa7, 0xb0, 0xfe, 0xc3, 0xd4, - 0x86, 0xb4, 0x5a, 0xdf, 0xdf, 0x7d, 0xa5, 0xfe, 0x65, 0x41, 0x6f, 0x2c, 0x18, 0x23, 0xe5, 0x12, - 0xbd, 0x84, 0x8d, 0x8a, 0xb0, 0x22, 0xa5, 0x51, 0x2c, 0x77, 0x54, 0x13, 0x6c, 0xec, 0x69, 0x4c, - 0x99, 0x40, 0xdb, 0x00, 0x86, 0x52, 0x09, 0x66, 0x26, 0xb9, 0x1a, 0x19, 0x0b, 0x86, 0x8e, 0xee, - 0xec, 0xdf, 0xe9, 0x77, 0x76, 0xbd, 0xfd, 0x17, 0xc3, 0xb6, 0xb3, 0x1a, 0xd6, 0x8e, 0x1b, 0x7f, - 0xf2, 0x43, 0xa7, 0x19, 0x5f, 0x16, 0xf4, 0xe6, 0x81, 0x0f, 0xfd, 0x69, 0x81, 0x7b, 0x9e, 0x54, - 0x3c, 0x9f, 0x97, 0x84, 0xfd, 0x03, 0xb3, 0x07, 0xd0, 0x9d, 0x89, 0xf8, 0x3b, 0xe5, 0xc6, 0xea, - 0xf3, 0x76, 0xab, 0x27, 0x8a, 0x83, 0x0d, 0x77, 0x30, 0x81, 0xae, 0x46, 0xd0, 0x2b, 0xf0, 0x63, - 0xc1, 0x44, 0x4a, 0x78, 0x72, 0x7b, 0xdf, 0xc5, 0x93, 0x06, 0xd7, 0x4e, 0x76, 0xc0, 0x13, 0x45, - 0x41, 0xcb, 0x68, 0x96, 0x8b, 0xec, 0xc6, 0x58, 0x01, 0x05, 0x9d, 0x48, 0x64, 0xf0, 0x67, 0x0d, - 0xba, 0xa1, 0xca, 0x18, 0x3a, 0x04, 0x27, 0x95, 0x31, 0x0a, 0x2c, 0xe5, 0x6a, 0xa7, 0xdd, 0xd5, - 0x2a, 0x69, 0x58, 0xb3, 0xd1, 0x1b, 0x70, 0xe6, 0x32, 0x46, 0x6a, 0xb8, 0xb7, 0xff, 0xac, 0x5d, - 0xa6, 0x92, 0x86, 0x35, 0x13, 0xbd, 0x85, 0x5e, 0xac, 0xa3, 0x15, 0x74, 0x94, 0x68, 0xbb, 0x5d, - 0x64, 0xf2, 0x87, 0x6b, 0xb6, 0x14, 0x56, 0x3a, 0x33, 0x81, 0xfd, 0x98, 0xd0, 0x04, 0x0b, 0xd7, - 0x6c, 0x29, 0x14, 0xfa, 0x8e, 0x03, 0xe7, 0x31, 0xa1, 0x09, 0x02, 0xae, 0xd9, 0xe8, 0x03, 0xb8, - 0x8b, 0xfa, 0xea, 0x83, 0x9e, 0x92, 0x3e, 0x70, 0x30, 0xab, 0x84, 0xe0, 0x46, 0x21, 0xc3, 0xc2, - 0x13, 0x46, 0x2b, 0x4e, 0x58, 0x11, 0xb1, 0x2a, 0xe8, 0xf6, 0xad, 0xdd, 0x0e, 0xf6, 0x56, 0x58, - 0x58, 0x0d, 0x7e, 0x5b, 0xb0, 0xa1, 0x6f, 0xe0, 0x13, 0x61, 0x49, 0xba, 0x6c, 0xfd, 0x83, 0x11, - 0xd8, 0x0b, 0x9a, 0x16, 0xe6, 0x07, 0x56, 0x35, 0x3a, 0x00, 0x5b, 0x7a, 0x54, 0x47, 0xf8, 0xff, - 0x7e, 0xbf, 0xdd, 0x95, 0x9e, 0x3c, 0x59, 0x16, 0x14, 0x2b, 0xb6, 0x0c, 0x9f, 0x7e, 0x53, 0x02, - 0xfb, 0xb1, 0xf0, 0x69, 0x1d, 0x36, 0xdc, 0xd7, 0x21, 0x40, 0x33, 0x09, 0x79, 0xd0, 0x3b, 0xbd, - 0x9c, 0x5e, 0x4c, 0xce, 0xb0, 0xff, 0x1f, 0x72, 0xc1, 0x19, 0x1d, 0x4f, 0x47, 0x67, 0xbe, 0x25, - 0xf1, 0xf1, 0x34, 0x0c, 0x8f, 0xf1, 0xb5, 0xbf, 0x26, 0x17, 0xd3, 0x8b, 0xc9, 0xf5, 0xd5, 0xd9, - 0x47, 0xbf, 0x83, 0x36, 0xc1, 0x3d, 0xff, 0x3c, 0x9e, 0x5c, 0x8e, 0xf0, 0x71, 0xe8, 0xdb, 0x27, - 0x18, 0x5a, 0x5f, 0xb2, 0x6f, 0x47, 0xf3, 0x84, 0x2f, 0xc4, 0x6c, 0x18, 0xe7, 0x6c, 0xaf, 0xe9, - 0xee, 0xe9, 0x6e, 0xc4, 0xf2, 0x1b, 0x9a, 0xee, 0xcd, 0xf3, 0x77, 0x49, 0x1e, 0x35, 0xdd, 0x48, - 0x77, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x45, 0x21, 0x7f, 0x64, 0x2b, 0x05, 0x00, 0x00, +func init() { proto.RegisterFile("metrics.proto", fileDescriptor_6039342a2ba47b72) } + +var fileDescriptor_6039342a2ba47b72 = []byte{ + // 665 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0xcd, 0x6e, 0xd3, 0x4c, + 0x14, 0xfd, 0xdc, 0x38, 0x3f, 0xbe, 0x69, 0x3f, 0xa2, 0x51, 0x17, 0x56, 0xa1, 0x24, 0x78, 0x55, + 0x58, 0x38, 0xa2, 0x6a, 0x05, 0x2a, 0xb0, 0x68, 0x4b, 0x48, 0x91, 0x48, 0x5b, 0x26, 0xc9, 0xa2, + 0xb0, 0x88, 0x1c, 0x77, 0x70, 0x2c, 0x3c, 0xb1, 0xb1, 0x67, 0x2a, 0xb2, 0x66, 0xc1, 0x16, 0x5e, + 0x81, 0x17, 0x05, 0xcd, 0x8f, 0x6d, 0x2a, 0xb9, 0x95, 0x40, 0xec, 0x66, 0xee, 0x3d, 0xe7, 0xfa, + 0xcc, 0xf8, 0x9c, 0x81, 0x0d, 0x4a, 0x58, 0x1a, 0xfa, 0x99, 0x9b, 0xa4, 0x31, 0x8b, 0xd1, 0x66, + 0x18, 0x8b, 0x15, 0x25, 0x6c, 0x41, 0x78, 0xe6, 0xfa, 0x51, 0x48, 0x96, 0x6c, 0xab, 0x1b, 0xc4, + 0x71, 0x10, 0x91, 0xbe, 0xc4, 0xcc, 0xf9, 0x87, 0x3e, 0x0b, 0x29, 0xc9, 0x98, 0x47, 0x13, 0x45, + 0x73, 0xf6, 0xc1, 0x7a, 0xe3, 0xcd, 0x49, 0x74, 0xee, 0x85, 0x29, 0x42, 0x60, 0x2e, 0x3d, 0x4a, + 0x6c, 0xa3, 0x67, 0xec, 0x58, 0x58, 0xae, 0xd1, 0x26, 0xd4, 0xaf, 0xbc, 0x88, 0x13, 0x7b, 0x4d, + 0x16, 0xd5, 0xc6, 0xd9, 0x86, 0xfa, 0xd0, 0xe3, 0xc1, 0x6f, 0x6d, 0xc1, 0x31, 0xf2, 0xf6, 0x7b, + 0x68, 0x1e, 0xc7, 0x7c, 0xc9, 0x48, 0x5a, 0x0d, 0x40, 0x07, 0xd0, 0x22, 0x9f, 0x09, 0x4d, 0x22, + 0x2f, 0x95, 0x83, 0xdb, 0xbb, 0xf7, 0xdd, 0xaa, 0x03, 0xb8, 0x03, 0x8d, 0xc2, 0x05, 0xde, 0x79, + 0x0e, 0xad, 0xb7, 0xdc, 0x5b, 0xb2, 0x30, 0x22, 0x68, 0x0b, 0x5a, 0x9f, 0xf4, 0x5a, 0x7f, 0xa0, + 0xd8, 0x5f, 0x57, 0x5e, 0x48, 0xfb, 0x6a, 0x40, 0x73, 0xcc, 0x29, 0xf5, 0xd2, 0x15, 0x7a, 0x00, + 0xeb, 0x99, 0x47, 0x93, 0x88, 0xcc, 0x7c, 0xa1, 0x56, 0x4e, 0x30, 0x71, 0x5b, 0xd5, 0xe4, 0x01, + 0xd0, 0x36, 0x80, 0x86, 0x64, 0x9c, 0xea, 0x49, 0x96, 0xaa, 0x8c, 0x39, 0x15, 0xe7, 0x28, 0xbe, + 0x5f, 0xeb, 0xd5, 0x6e, 0x3e, 0x47, 0xae, 0xb8, 0xd4, 0xe7, 0x74, 0xa1, 0x39, 0x5d, 0xb2, 0x55, + 0x42, 0x2e, 0x6f, 0xb8, 0xc5, 0x2f, 0x06, 0x58, 0x27, 0x61, 0xc6, 0xe2, 0x20, 0xf5, 0xe8, 0x3f, + 0x10, 0xbb, 0x07, 0x8d, 0x39, 0xf7, 0x3f, 0x12, 0xa6, 0xa5, 0xde, 0xab, 0x96, 0x7a, 0x24, 0x31, + 0x58, 0x63, 0x9d, 0x6f, 0x06, 0x34, 0x54, 0x09, 0x3d, 0x84, 0x8e, 0xcf, 0x29, 0x8f, 0x3c, 0x16, + 0x5e, 0x5d, 0x97, 0x71, 0xa7, 0xac, 0x2b, 0x29, 0x5d, 0x68, 0xf3, 0x24, 0x21, 0xe9, 0x6c, 0x1e, + 0xf3, 0xe5, 0xa5, 0xd6, 0x02, 0xb2, 0x74, 0x24, 0x2a, 0xd7, 0x1c, 0x50, 0xfb, 0x43, 0x07, 0x7c, + 0x37, 0xa0, 0x95, 0x97, 0xd1, 0x3e, 0xd4, 0x23, 0xe1, 0x60, 0xdb, 0x90, 0x87, 0xea, 0x56, 0x4f, + 0x29, 0x4c, 0x8e, 0x15, 0xba, 0xda, 0x1d, 0xe8, 0x29, 0x58, 0x45, 0x42, 0xb4, 0xac, 0x2d, 0x57, + 0x65, 0xc8, 0xcd, 0x33, 0xe4, 0x4e, 0x72, 0x04, 0x2e, 0xc1, 0xce, 0xcf, 0x35, 0x68, 0x8c, 0x64, + 0x22, 0xff, 0x56, 0xd1, 0x63, 0xa8, 0x07, 0x22, 0x53, 0x3a, 0x10, 0x77, 0xab, 0x69, 0x32, 0x76, + 0x58, 0x21, 0xd1, 0x13, 0x68, 0xfa, 0x2a, 0x67, 0x5a, 0xec, 0x76, 0x35, 0x49, 0x87, 0x11, 0xe7, + 0x68, 0x41, 0xcc, 0x54, 0x08, 0x6c, 0xf3, 0x36, 0xa2, 0x4e, 0x0a, 0xce, 0xd1, 0x82, 0xc8, 0x95, + 0x69, 0xed, 0xfa, 0x6d, 0x44, 0xed, 0x6c, 0x9c, 0xa3, 0xd1, 0x0b, 0xb0, 0x16, 0xb9, 0x97, 0xed, + 0xa6, 0xa4, 0xde, 0x70, 0x31, 0x85, 0xe5, 0x71, 0xc9, 0x10, 0xee, 0x2f, 0xee, 0x7a, 0x46, 0x33, + 0xbb, 0xd1, 0x33, 0x76, 0x6a, 0xb8, 0x5d, 0xd4, 0x46, 0x99, 0xf3, 0xc3, 0x80, 0x75, 0xf5, 0x07, + 0x5e, 0x79, 0x34, 0x8c, 0x56, 0x95, 0xcf, 0x19, 0x02, 0x73, 0x41, 0xa2, 0x44, 0xbf, 0x66, 0x72, + 0x8d, 0xf6, 0xc0, 0x14, 0x1a, 0xe5, 0x15, 0xfe, 0xbf, 0xdb, 0xab, 0x56, 0xa5, 0x26, 0x4f, 0x56, + 0x09, 0xc1, 0x12, 0x2d, 0xd2, 0xa4, 0x5e, 0x60, 0xdb, 0xbc, 0x2d, 0x4d, 0x8a, 0x87, 0x35, 0xf6, + 0xd1, 0x08, 0xa0, 0x9c, 0x84, 0xda, 0xd0, 0x3c, 0x3e, 0x9b, 0x9e, 0x4e, 0x06, 0xb8, 0xf3, 0x1f, + 0xb2, 0xa0, 0x3e, 0x3c, 0x9c, 0x0e, 0x07, 0x1d, 0x43, 0xd4, 0xc7, 0xd3, 0xd1, 0xe8, 0x10, 0x5f, + 0x74, 0xd6, 0xc4, 0x66, 0x7a, 0x3a, 0xb9, 0x38, 0x1f, 0xbc, 0xec, 0xd4, 0xd0, 0x06, 0x58, 0x27, + 0xaf, 0xc7, 0x93, 0xb3, 0x21, 0x3e, 0x1c, 0x75, 0xcc, 0x23, 0x0c, 0x95, 0xef, 0xfe, 0xbb, 0x83, + 0x20, 0x64, 0x0b, 0x3e, 0x77, 0xfd, 0x98, 0xf6, 0xcb, 0x6e, 0x5f, 0x75, 0x67, 0x34, 0xbe, 0x24, + 0x51, 0x3f, 0x88, 0x9f, 0x85, 0xf1, 0xac, 0xec, 0xce, 0x54, 0xf7, 0x57, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xd0, 0x84, 0x91, 0x73, 0x59, 0x06, 0x00, 0x00, } diff --git a/vendor/github.com/prometheus/client_model/ruby/LICENSE b/vendor/github.com/prometheus/client_model/ruby/LICENSE deleted file mode 100644 index 11069edd..00000000 --- a/vendor/github.com/prometheus/client_model/ruby/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -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. diff --git a/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/prometheus/common/expfmt/encode.go index 11839ed6..bd4e3474 100644 --- a/vendor/github.com/prometheus/common/expfmt/encode.go +++ b/vendor/github.com/prometheus/common/expfmt/encode.go @@ -30,17 +30,38 @@ type Encoder interface { Encode(*dto.MetricFamily) error } -type encoder func(*dto.MetricFamily) error +// Closer is implemented by Encoders that need to be closed to finalize +// encoding. (For example, OpenMetrics needs a final `# EOF` line.) +// +// Note that all Encoder implementations returned from this package implement +// Closer, too, even if the Close call is a no-op. This happens in preparation +// for adding a Close method to the Encoder interface directly in a (mildly +// breaking) release in the future. +type Closer interface { + Close() error +} + +type encoderCloser struct { + encode func(*dto.MetricFamily) error + close func() error +} -func (e encoder) Encode(v *dto.MetricFamily) error { - return e(v) +func (ec encoderCloser) Encode(v *dto.MetricFamily) error { + return ec.encode(v) } -// Negotiate returns the Content-Type based on the given Accept header. -// If no appropriate accepted type is found, FmtText is returned. +func (ec encoderCloser) Close() error { + return ec.close() +} + +// Negotiate returns the Content-Type based on the given Accept header. If no +// appropriate accepted type is found, FmtText is returned (which is the +// Prometheus text format). This function will never negotiate FmtOpenMetrics, +// as the support is still experimental. To include the option to negotiate +// FmtOpenMetrics, use NegotiateOpenMetrics. func Negotiate(h http.Header) Format { for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { - // Check for protocol buffer + ver := ac.Params["version"] if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { switch ac.Params["encoding"] { case "delimited": @@ -51,38 +72,91 @@ func Negotiate(h http.Header) Format { return FmtProtoCompact } } - // Check for text format. + if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { + return FmtText + } + } + return FmtText +} + +// NegotiateIncludingOpenMetrics works like Negotiate but includes +// FmtOpenMetrics as an option for the result. Note that this function is +// temporary and will disappear once FmtOpenMetrics is fully supported and as +// such may be negotiated by the normal Negotiate function. +func NegotiateIncludingOpenMetrics(h http.Header) Format { + for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { ver := ac.Params["version"] + if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { + switch ac.Params["encoding"] { + case "delimited": + return FmtProtoDelim + case "text": + return FmtProtoText + case "compact-text": + return FmtProtoCompact + } + } if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { return FmtText } + if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion || ver == "") { + return FmtOpenMetrics + } } return FmtText } -// NewEncoder returns a new encoder based on content type negotiation. +// NewEncoder returns a new encoder based on content type negotiation. All +// Encoder implementations returned by NewEncoder also implement Closer, and +// callers should always call the Close method. It is currently only required +// for FmtOpenMetrics, but a future (breaking) release will add the Close method +// to the Encoder interface directly. The current version of the Encoder +// interface is kept for backwards compatibility. func NewEncoder(w io.Writer, format Format) Encoder { switch format { case FmtProtoDelim: - return encoder(func(v *dto.MetricFamily) error { - _, err := pbutil.WriteDelimited(w, v) - return err - }) + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := pbutil.WriteDelimited(w, v) + return err + }, + close: func() error { return nil }, + } case FmtProtoCompact: - return encoder(func(v *dto.MetricFamily) error { - _, err := fmt.Fprintln(w, v.String()) - return err - }) + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, v.String()) + return err + }, + close: func() error { return nil }, + } case FmtProtoText: - return encoder(func(v *dto.MetricFamily) error { - _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) - return err - }) + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + return err + }, + close: func() error { return nil }, + } case FmtText: - return encoder(func(v *dto.MetricFamily) error { - _, err := MetricFamilyToText(w, v) - return err - }) + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := MetricFamilyToText(w, v) + return err + }, + close: func() error { return nil }, + } + case FmtOpenMetrics: + return encoderCloser{ + encode: func(v *dto.MetricFamily) error { + _, err := MetricFamilyToOpenMetrics(w, v) + return err + }, + close: func() error { + _, err := FinalizeOpenMetrics(w) + return err + }, + } } - panic("expfmt.NewEncoder: unknown format") + panic(fmt.Errorf("expfmt.NewEncoder: unknown format %q", format)) } diff --git a/vendor/github.com/prometheus/common/expfmt/expfmt.go b/vendor/github.com/prometheus/common/expfmt/expfmt.go index c71bcb98..0f176fa6 100644 --- a/vendor/github.com/prometheus/common/expfmt/expfmt.go +++ b/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -19,10 +19,12 @@ type Format string // Constants to assemble the Content-Type values for the different wire protocols. const ( - TextVersion = "0.0.4" - ProtoType = `application/vnd.google.protobuf` - ProtoProtocol = `io.prometheus.client.MetricFamily` - ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + TextVersion = "0.0.4" + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + OpenMetricsType = `application/openmetrics-text` + OpenMetricsVersion = "0.0.1" // The Content-Type values for the different wire protocols. FmtUnknown Format = `` @@ -30,6 +32,7 @@ const ( FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` FmtProtoText Format = ProtoFmt + ` encoding=text` FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` + FmtOpenMetrics Format = OpenMetricsType + `; version=` + OpenMetricsVersion + `; charset=utf-8` ) const ( diff --git a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go new file mode 100644 index 00000000..8a9313a3 --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go @@ -0,0 +1,527 @@ +// Copyright 2020 The Prometheus Authors +// 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. + +package expfmt + +import ( + "bufio" + "bytes" + "fmt" + "io" + "math" + "strconv" + "strings" + + "github.com/golang/protobuf/ptypes" + "github.com/prometheus/common/model" + + dto "github.com/prometheus/client_model/go" +) + +// MetricFamilyToOpenMetrics converts a MetricFamily proto message into the +// OpenMetrics text format and writes the resulting lines to 'out'. It returns +// the number of bytes written and any error encountered. The output will have +// the same order as the input, no further sorting is performed. Furthermore, +// this function assumes the input is already sanitized and does not perform any +// sanity checks. If the input contains duplicate metrics or invalid metric or +// label names, the conversion will result in invalid text format output. +// +// This function fulfills the type 'expfmt.encoder'. +// +// Note that OpenMetrics requires a final `# EOF` line. Since this function acts +// on individual metric families, it is the responsibility of the caller to +// append this line to 'out' once all metric families have been written. +// Conveniently, this can be done by calling FinalizeOpenMetrics. +// +// The output should be fully OpenMetrics compliant. However, there are a few +// missing features and peculiarities to avoid complications when switching from +// Prometheus to OpenMetrics or vice versa: +// +// - Counters are expected to have the `_total` suffix in their metric name. In +// the output, the suffix will be truncated from the `# TYPE` and `# HELP` +// line. A counter with a missing `_total` suffix is not an error. However, +// its type will be set to `unknown` in that case to avoid invalid OpenMetrics +// output. +// +// - No support for the following (optional) features: `# UNIT` line, `_created` +// line, info type, stateset type, gaugehistogram type. +// +// - The size of exemplar labels is not checked (i.e. it's possible to create +// exemplars that are larger than allowed by the OpenMetrics specification). +// +// - The value of Counters is not checked. (OpenMetrics doesn't allow counters +// with a `NaN` value.) +func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int, err error) { + name := in.GetName() + if name == "" { + return 0, fmt.Errorf("MetricFamily has no name: %s", in) + } + + // Try the interface upgrade. If it doesn't work, we'll use a + // bufio.Writer from the sync.Pool. + w, ok := out.(enhancedWriter) + if !ok { + b := bufPool.Get().(*bufio.Writer) + b.Reset(out) + w = b + defer func() { + bErr := b.Flush() + if err == nil { + err = bErr + } + bufPool.Put(b) + }() + } + + var ( + n int + metricType = in.GetType() + shortName = name + ) + if metricType == dto.MetricType_COUNTER && strings.HasSuffix(shortName, "_total") { + shortName = name[:len(name)-6] + } + + // Comments, first HELP, then TYPE. + if in.Help != nil { + n, err = w.WriteString("# HELP ") + written += n + if err != nil { + return + } + n, err = w.WriteString(shortName) + written += n + if err != nil { + return + } + err = w.WriteByte(' ') + written++ + if err != nil { + return + } + n, err = writeEscapedString(w, *in.Help, true) + written += n + if err != nil { + return + } + err = w.WriteByte('\n') + written++ + if err != nil { + return + } + } + n, err = w.WriteString("# TYPE ") + written += n + if err != nil { + return + } + n, err = w.WriteString(shortName) + written += n + if err != nil { + return + } + switch metricType { + case dto.MetricType_COUNTER: + if strings.HasSuffix(name, "_total") { + n, err = w.WriteString(" counter\n") + } else { + n, err = w.WriteString(" unknown\n") + } + case dto.MetricType_GAUGE: + n, err = w.WriteString(" gauge\n") + case dto.MetricType_SUMMARY: + n, err = w.WriteString(" summary\n") + case dto.MetricType_UNTYPED: + n, err = w.WriteString(" unknown\n") + case dto.MetricType_HISTOGRAM: + n, err = w.WriteString(" histogram\n") + default: + return written, fmt.Errorf("unknown metric type %s", metricType.String()) + } + written += n + if err != nil { + return + } + + // Finally the samples, one line for each. + for _, metric := range in.Metric { + switch metricType { + case dto.MetricType_COUNTER: + if metric.Counter == nil { + return written, fmt.Errorf( + "expected counter in metric %s %s", name, metric, + ) + } + // Note that we have ensured above that either the name + // ends on `_total` or that the rendered type is + // `unknown`. Therefore, no `_total` must be added here. + n, err = writeOpenMetricsSample( + w, name, "", metric, "", 0, + metric.Counter.GetValue(), 0, false, + metric.Counter.Exemplar, + ) + case dto.MetricType_GAUGE: + if metric.Gauge == nil { + return written, fmt.Errorf( + "expected gauge in metric %s %s", name, metric, + ) + } + n, err = writeOpenMetricsSample( + w, name, "", metric, "", 0, + metric.Gauge.GetValue(), 0, false, + nil, + ) + case dto.MetricType_UNTYPED: + if metric.Untyped == nil { + return written, fmt.Errorf( + "expected untyped in metric %s %s", name, metric, + ) + } + n, err = writeOpenMetricsSample( + w, name, "", metric, "", 0, + metric.Untyped.GetValue(), 0, false, + nil, + ) + case dto.MetricType_SUMMARY: + if metric.Summary == nil { + return written, fmt.Errorf( + "expected summary in metric %s %s", name, metric, + ) + } + for _, q := range metric.Summary.Quantile { + n, err = writeOpenMetricsSample( + w, name, "", metric, + model.QuantileLabel, q.GetQuantile(), + q.GetValue(), 0, false, + nil, + ) + written += n + if err != nil { + return + } + } + n, err = writeOpenMetricsSample( + w, name, "_sum", metric, "", 0, + metric.Summary.GetSampleSum(), 0, false, + nil, + ) + written += n + if err != nil { + return + } + n, err = writeOpenMetricsSample( + w, name, "_count", metric, "", 0, + 0, metric.Summary.GetSampleCount(), true, + nil, + ) + case dto.MetricType_HISTOGRAM: + if metric.Histogram == nil { + return written, fmt.Errorf( + "expected histogram in metric %s %s", name, metric, + ) + } + infSeen := false + for _, b := range metric.Histogram.Bucket { + n, err = writeOpenMetricsSample( + w, name, "_bucket", metric, + model.BucketLabel, b.GetUpperBound(), + 0, b.GetCumulativeCount(), true, + b.Exemplar, + ) + written += n + if err != nil { + return + } + if math.IsInf(b.GetUpperBound(), +1) { + infSeen = true + } + } + if !infSeen { + n, err = writeOpenMetricsSample( + w, name, "_bucket", metric, + model.BucketLabel, math.Inf(+1), + 0, metric.Histogram.GetSampleCount(), true, + nil, + ) + written += n + if err != nil { + return + } + } + n, err = writeOpenMetricsSample( + w, name, "_sum", metric, "", 0, + metric.Histogram.GetSampleSum(), 0, false, + nil, + ) + written += n + if err != nil { + return + } + n, err = writeOpenMetricsSample( + w, name, "_count", metric, "", 0, + 0, metric.Histogram.GetSampleCount(), true, + nil, + ) + default: + return written, fmt.Errorf( + "unexpected type in metric %s %s", name, metric, + ) + } + written += n + if err != nil { + return + } + } + return +} + +// FinalizeOpenMetrics writes the final `# EOF\n` line required by OpenMetrics. +func FinalizeOpenMetrics(w io.Writer) (written int, err error) { + return w.Write([]byte("# EOF\n")) +} + +// writeOpenMetricsSample writes a single sample in OpenMetrics text format to +// w, given the metric name, the metric proto message itself, optionally an +// additional label name with a float64 value (use empty string as label name if +// not required), the value (optionally as float64 or uint64, determined by +// useIntValue), and optionally an exemplar (use nil if not required). The +// function returns the number of bytes written and any error encountered. +func writeOpenMetricsSample( + w enhancedWriter, + name, suffix string, + metric *dto.Metric, + additionalLabelName string, additionalLabelValue float64, + floatValue float64, intValue uint64, useIntValue bool, + exemplar *dto.Exemplar, +) (int, error) { + var written int + n, err := w.WriteString(name) + written += n + if err != nil { + return written, err + } + if suffix != "" { + n, err = w.WriteString(suffix) + written += n + if err != nil { + return written, err + } + } + n, err = writeOpenMetricsLabelPairs( + w, metric.Label, additionalLabelName, additionalLabelValue, + ) + written += n + if err != nil { + return written, err + } + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + if useIntValue { + n, err = writeUint(w, intValue) + } else { + n, err = writeOpenMetricsFloat(w, floatValue) + } + written += n + if err != nil { + return written, err + } + if metric.TimestampMs != nil { + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + // TODO(beorn7): Format this directly without converting to a float first. + n, err = writeOpenMetricsFloat(w, float64(*metric.TimestampMs)/1000) + written += n + if err != nil { + return written, err + } + } + if exemplar != nil { + n, err = writeExemplar(w, exemplar) + written += n + if err != nil { + return written, err + } + } + err = w.WriteByte('\n') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeOpenMetricsLabelPairs works like writeOpenMetrics but formats the float +// in OpenMetrics style. +func writeOpenMetricsLabelPairs( + w enhancedWriter, + in []*dto.LabelPair, + additionalLabelName string, additionalLabelValue float64, +) (int, error) { + if len(in) == 0 && additionalLabelName == "" { + return 0, nil + } + var ( + written int + separator byte = '{' + ) + for _, lp := range in { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(lp.GetName()) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeEscapedString(w, lp.GetValue(), true) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + separator = ',' + } + if additionalLabelName != "" { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(additionalLabelName) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeOpenMetricsFloat(w, additionalLabelValue) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + } + err := w.WriteByte('}') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeExemplar writes the provided exemplar in OpenMetrics format to w. The +// function returns the number of bytes written and any error encountered. +func writeExemplar(w enhancedWriter, e *dto.Exemplar) (int, error) { + written := 0 + n, err := w.WriteString(" # ") + written += n + if err != nil { + return written, err + } + n, err = writeOpenMetricsLabelPairs(w, e.Label, "", 0) + written += n + if err != nil { + return written, err + } + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + n, err = writeOpenMetricsFloat(w, e.GetValue()) + written += n + if err != nil { + return written, err + } + if e.Timestamp != nil { + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + ts, err := ptypes.Timestamp((*e).Timestamp) + if err != nil { + return written, err + } + // TODO(beorn7): Format this directly from components of ts to + // avoid overflow/underflow and precision issues of the float + // conversion. + n, err = writeOpenMetricsFloat(w, float64(ts.UnixNano())/1e9) + written += n + if err != nil { + return written, err + } + } + return written, nil +} + +// writeOpenMetricsFloat works like writeFloat but appends ".0" if the resulting +// number would otherwise contain neither a "." nor an "e". +func writeOpenMetricsFloat(w enhancedWriter, f float64) (int, error) { + switch { + case f == 1: + return w.WriteString("1.0") + case f == 0: + return w.WriteString("0.0") + case f == -1: + return w.WriteString("-1.0") + case math.IsNaN(f): + return w.WriteString("NaN") + case math.IsInf(f, +1): + return w.WriteString("+Inf") + case math.IsInf(f, -1): + return w.WriteString("-Inf") + default: + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendFloat((*bp)[:0], f, 'g', -1, 64) + if !bytes.ContainsAny(*bp, "e.") { + *bp = append(*bp, '.', '0') + } + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err + } +} + +// writeUint is like writeInt just for uint64. +func writeUint(w enhancedWriter, u uint64) (int, error) { + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendUint((*bp)[:0], u, 10) + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err +} diff --git a/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/prometheus/common/expfmt/text_create.go index 0327865e..5ba503b0 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_create.go +++ b/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -423,9 +423,8 @@ var ( func writeEscapedString(w enhancedWriter, v string, includeDoubleQuote bool) (int, error) { if includeDoubleQuote { return quotedEscaper.WriteString(w, v) - } else { - return escaper.WriteString(w, v) } + return escaper.WriteString(w, v) } // writeFloat is equivalent to fmt.Fprint with a float64 argument but hardcodes diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt deleted file mode 100644 index 7723656d..00000000 --- a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt +++ /dev/null @@ -1,67 +0,0 @@ -PACKAGE - -package goautoneg -import "bitbucket.org/ww/goautoneg" - -HTTP Content-Type Autonegotiation. - -The functions in this package implement the behaviour specified in -http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html - -Copyright (c) 2011, Open Knowledge Foundation Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - Neither the name of the Open Knowledge Foundation Ltd. nor the - names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -FUNCTIONS - -func Negotiate(header string, alternatives []string) (content_type string) -Negotiate the most appropriate content_type given the accept header -and a list of alternatives. - -func ParseAccept(header string) (accept []Accept) -Parse an Accept Header string returning a sorted list -of clauses - - -TYPES - -type Accept struct { - Type, SubType string - Q float32 - Params map[string]string -} -Structure to represent a clause in an HTTP Accept Header - - -SUBDIRECTORIES - - .hg diff --git a/vendor/github.com/prometheus/procfs/.gitignore b/vendor/github.com/prometheus/procfs/.gitignore deleted file mode 100644 index 25e3659a..00000000 --- a/vendor/github.com/prometheus/procfs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/fixtures/ diff --git a/vendor/github.com/prometheus/procfs/.golangci.yml b/vendor/github.com/prometheus/procfs/.golangci.yml deleted file mode 100644 index 438ca92e..00000000 --- a/vendor/github.com/prometheus/procfs/.golangci.yml +++ /dev/null @@ -1,6 +0,0 @@ -# Run only staticcheck for now. Additional linters will be enabled one-by-one. -linters: - enable: - - staticcheck - - govet - disable-all: true diff --git a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md deleted file mode 100644 index 40503edb..00000000 --- a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -Prometheus uses GitHub to manage reviews of pull requests. - -* If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see - [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. - -* If you plan to do something more involved, first discuss your ideas - on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). - This will avoid unnecessary work and surely give you and us a good deal - of inspiration. - -* Relevant coding style guidelines are the [Go Code Review - Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) - and the _Formatting and style_ section of Peter Bourgon's [Go: Best - Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/vendor/github.com/prometheus/procfs/MAINTAINERS.md deleted file mode 100644 index 56ba67d3..00000000 --- a/vendor/github.com/prometheus/procfs/MAINTAINERS.md +++ /dev/null @@ -1,2 +0,0 @@ -* Johannes 'fish' Ziemke @discordianfish -* Paul Gier @pgier diff --git a/vendor/github.com/prometheus/procfs/Makefile b/vendor/github.com/prometheus/procfs/Makefile deleted file mode 100644 index 616a0d25..00000000 --- a/vendor/github.com/prometheus/procfs/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2018 The Prometheus Authors -# 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. - -include Makefile.common - -%/.unpacked: %.ttar - @echo ">> extracting fixtures" - ./ttar -C $(dir $*) -x -f $*.ttar - touch $@ - -update_fixtures: - rm -vf fixtures/.unpacked - ./ttar -c -f fixtures.ttar fixtures/ - -.PHONY: build -build: - -.PHONY: test -test: fixtures/.unpacked common-test diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common deleted file mode 100644 index d7aea1b8..00000000 --- a/vendor/github.com/prometheus/procfs/Makefile.common +++ /dev/null @@ -1,275 +0,0 @@ -# Copyright 2018 The Prometheus Authors -# 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. - - -# A common Makefile that includes rules to be reused in different prometheus projects. -# !!! Open PRs only against the prometheus/prometheus/Makefile.common repository! - -# Example usage : -# Create the main Makefile in the root project directory. -# include Makefile.common -# customTarget: -# @echo ">> Running customTarget" -# - -# Ensure GOBIN is not set during build so that promu is installed to the correct path -unexport GOBIN - -GO ?= go -GOFMT ?= $(GO)fmt -FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) -GOOPTS ?= -GOHOSTOS ?= $(shell $(GO) env GOHOSTOS) -GOHOSTARCH ?= $(shell $(GO) env GOHOSTARCH) - -GO_VERSION ?= $(shell $(GO) version) -GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) -PRE_GO_111 ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.') - -GOVENDOR := -GO111MODULE := -ifeq (, $(PRE_GO_111)) - ifneq (,$(wildcard go.mod)) - # Enforce Go modules support just in case the directory is inside GOPATH (and for Travis CI). - GO111MODULE := on - - ifneq (,$(wildcard vendor)) - # Always use the local vendor/ directory to satisfy the dependencies. - GOOPTS := $(GOOPTS) -mod=vendor - endif - endif -else - ifneq (,$(wildcard go.mod)) - ifneq (,$(wildcard vendor)) -$(warning This repository requires Go >= 1.11 because of Go modules) -$(warning Some recipes may not work as expected as the current Go runtime is '$(GO_VERSION_NUMBER)') - endif - else - # This repository isn't using Go modules (yet). - GOVENDOR := $(FIRST_GOPATH)/bin/govendor - endif -endif -PROMU := $(FIRST_GOPATH)/bin/promu -pkgs = ./... - -ifeq (arm, $(GOHOSTARCH)) - GOHOSTARM ?= $(shell GOARM= $(GO) env GOARM) - GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)v$(GOHOSTARM) -else - GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH) -endif - -PROMU_VERSION ?= 0.4.0 -PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz - -GOLANGCI_LINT := -GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.16.0 -# golangci-lint only supports linux, darwin and windows platforms on i386/amd64. -# windows isn't included here because of the path separator being different. -ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) - ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386)) - GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint - endif -endif - -PREFIX ?= $(shell pwd) -BIN_DIR ?= $(shell pwd) -DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD)) -DOCKERFILE_PATH ?= ./ -DOCKER_REPO ?= prom - -DOCKER_ARCHS ?= amd64 - -BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS)) -PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS)) -TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS)) - -ifeq ($(GOHOSTARCH),amd64) - ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows)) - # Only supported on amd64 - test-flags := -race - endif -endif - -# This rule is used to forward a target like "build" to "common-build". This -# allows a new "build" target to be defined in a Makefile which includes this -# one and override "common-build" without override warnings. -%: common-% ; - -.PHONY: common-all -common-all: precheck style check_license lint unused build test - -.PHONY: common-style -common-style: - @echo ">> checking code style" - @fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \ - if [ -n "$${fmtRes}" ]; then \ - echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \ - echo "Please ensure you are using $$($(GO) version) for formatting code."; \ - exit 1; \ - fi - -.PHONY: common-check_license -common-check_license: - @echo ">> checking license header" - @licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \ - awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \ - done); \ - if [ -n "$${licRes}" ]; then \ - echo "license header checking failed:"; echo "$${licRes}"; \ - exit 1; \ - fi - -.PHONY: common-deps -common-deps: - @echo ">> getting dependencies" -ifdef GO111MODULE - GO111MODULE=$(GO111MODULE) $(GO) mod download -else - $(GO) get $(GOOPTS) -t ./... -endif - -.PHONY: common-test-short -common-test-short: - @echo ">> running short tests" - GO111MODULE=$(GO111MODULE) $(GO) test -short $(GOOPTS) $(pkgs) - -.PHONY: common-test -common-test: - @echo ">> running all tests" - GO111MODULE=$(GO111MODULE) $(GO) test $(test-flags) $(GOOPTS) $(pkgs) - -.PHONY: common-format -common-format: - @echo ">> formatting code" - GO111MODULE=$(GO111MODULE) $(GO) fmt $(pkgs) - -.PHONY: common-vet -common-vet: - @echo ">> vetting code" - GO111MODULE=$(GO111MODULE) $(GO) vet $(GOOPTS) $(pkgs) - -.PHONY: common-lint -common-lint: $(GOLANGCI_LINT) -ifdef GOLANGCI_LINT - @echo ">> running golangci-lint" -ifdef GO111MODULE -# 'go list' needs to be executed before staticcheck to prepopulate the modules cache. -# Otherwise staticcheck might fail randomly for some reason not yet explained. - GO111MODULE=$(GO111MODULE) $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null - GO111MODULE=$(GO111MODULE) $(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs) -else - $(GOLANGCI_LINT) run $(pkgs) -endif -endif - -# For backward-compatibility. -.PHONY: common-staticcheck -common-staticcheck: lint - -.PHONY: common-unused -common-unused: $(GOVENDOR) -ifdef GOVENDOR - @echo ">> running check for unused packages" - @$(GOVENDOR) list +unused | grep . && exit 1 || echo 'No unused packages' -else -ifdef GO111MODULE - @echo ">> running check for unused/missing packages in go.mod" - GO111MODULE=$(GO111MODULE) $(GO) mod tidy -ifeq (,$(wildcard vendor)) - @git diff --exit-code -- go.sum go.mod -else - @echo ">> running check for unused packages in vendor/" - GO111MODULE=$(GO111MODULE) $(GO) mod vendor - @git diff --exit-code -- go.sum go.mod vendor/ -endif -endif -endif - -.PHONY: common-build -common-build: promu - @echo ">> building binaries" - GO111MODULE=$(GO111MODULE) $(PROMU) build --prefix $(PREFIX) - -.PHONY: common-tarball -common-tarball: promu - @echo ">> building release tarball" - $(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR) - -.PHONY: common-docker $(BUILD_DOCKER_ARCHS) -common-docker: $(BUILD_DOCKER_ARCHS) -$(BUILD_DOCKER_ARCHS): common-docker-%: - docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \ - --build-arg ARCH="$*" \ - --build-arg OS="linux" \ - $(DOCKERFILE_PATH) - -.PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS) -common-docker-publish: $(PUBLISH_DOCKER_ARCHS) -$(PUBLISH_DOCKER_ARCHS): common-docker-publish-%: - docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" - -.PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS) -common-docker-tag-latest: $(TAG_DOCKER_ARCHS) -$(TAG_DOCKER_ARCHS): common-docker-tag-latest-%: - docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" - -.PHONY: common-docker-manifest -common-docker-manifest: - DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(DOCKER_IMAGE_TAG)) - DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" - -.PHONY: promu -promu: $(PROMU) - -$(PROMU): - $(eval PROMU_TMP := $(shell mktemp -d)) - curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP) - mkdir -p $(FIRST_GOPATH)/bin - cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu - rm -r $(PROMU_TMP) - -.PHONY: proto -proto: - @echo ">> generating code from proto files" - @./scripts/genproto.sh - -ifdef GOLANGCI_LINT -$(GOLANGCI_LINT): - mkdir -p $(FIRST_GOPATH)/bin - curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_LINT_VERSION)/install.sh \ - | sed -e '/install -d/d' \ - | sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION) -endif - -ifdef GOVENDOR -.PHONY: $(GOVENDOR) -$(GOVENDOR): - GOOS= GOARCH= $(GO) get -u github.com/kardianos/govendor -endif - -.PHONY: precheck -precheck:: - -define PRECHECK_COMMAND_template = -precheck:: $(1)_precheck - -PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1))) -.PHONY: $(1)_precheck -$(1)_precheck: - @if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \ - echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \ - exit 1; \ - fi -endef diff --git a/vendor/github.com/prometheus/procfs/README.md b/vendor/github.com/prometheus/procfs/README.md deleted file mode 100644 index 6f8850fe..00000000 --- a/vendor/github.com/prometheus/procfs/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# procfs - -This procfs package provides functions to retrieve system, kernel and process -metrics from the pseudo-filesystems /proc and /sys. - -*WARNING*: This package is a work in progress. Its API may still break in -backwards-incompatible ways without warnings. Use it at your own risk. - -[![GoDoc](https://godoc.org/github.com/prometheus/procfs?status.png)](https://godoc.org/github.com/prometheus/procfs) -[![Build Status](https://travis-ci.org/prometheus/procfs.svg?branch=master)](https://travis-ci.org/prometheus/procfs) -[![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) - -## Usage - -The procfs library is organized by packages based on whether the gathered data is coming from -/proc, /sys, or both. Each package contains an `FS` type which represents the path to either /proc, /sys, or both. For example, current cpu statistics are gathered from -`/proc/stat` and are available via the root procfs package. First, the proc filesystem mount -point is initialized, and then the stat information is read. - -```go -fs, err := procfs.NewFS("/proc") -stats, err := fs.Stat() -``` - -Some sub-packages such as `blockdevice`, require access to both the proc and sys filesystems. - -```go - fs, err := blockdevice.NewFS("/proc", "/sys") - stats, err := fs.ProcDiskstats() -``` - -## Building and Testing - -The procfs library is normally built as part of another application. However, when making -changes to the library, the `make test` command can be used to run the API test suite. - -### Updating Test Fixtures - -The procfs library includes a set of test fixtures which include many example files from -the `/proc` and `/sys` filesystems. These fixtures are included as a [ttar](https://github.com/ideaship/ttar) file -which is extracted automatically during testing. To add/update the test fixtures, first -ensure the `fixtures` directory is up to date by removing the existing directory and then -extracting the ttar file using `make fixtures/.unpacked` or just `make test`. - -```bash -rm -rf fixtures -make test -``` - -Next, make the required changes to the extracted files in the `fixtures` directory. When -the changes are complete, run `make update_fixtures` to create a new `fixtures.ttar` file -based on the updated `fixtures` directory. And finally, verify the changes using -`git diff fixtures.ttar`. diff --git a/vendor/github.com/prometheus/procfs/cpuinfo.go b/vendor/github.com/prometheus/procfs/cpuinfo.go index 16491d6a..2e022155 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo.go @@ -16,9 +16,10 @@ package procfs import ( "bufio" "bytes" - "io/ioutil" "strconv" "strings" + + "github.com/prometheus/procfs/internal/util" ) // CPUInfo contains general information about a system CPU found in /proc/cpuinfo @@ -54,7 +55,7 @@ type CPUInfo struct { // CPUInfo returns information about current system CPUs. // See https://www.kernel.org/doc/Documentation/filesystems/proc.txt func (fs FS) CPUInfo() ([]CPUInfo, error) { - data, err := ioutil.ReadFile(fs.proc.Path("cpuinfo")) + data, err := util.ReadFileNoStat(fs.proc.Path("cpuinfo")) if err != nil { return nil, err } diff --git a/vendor/github.com/prometheus/procfs/fixtures.ttar b/vendor/github.com/prometheus/procfs/fixtures.ttar deleted file mode 100644 index 0b290554..00000000 --- a/vendor/github.com/prometheus/procfs/fixtures.ttar +++ /dev/null @@ -1,4550 +0,0 @@ -# Archive created by ttar -c -f fixtures.ttar fixtures/ -Directory: fixtures -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/cmdline -Lines: 1 -vimNULLBYTEtest.goNULLBYTE+10NULLBYTEEOF -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/comm -Lines: 1 -vim -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/cwd -SymlinkTo: /usr/bin -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/environ -Lines: 1 -PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binNULLBYTEHOSTNAME=cd24e11f73a5NULLBYTETERM=xtermNULLBYTEGOLANG_VERSION=1.12.5NULLBYTEGOPATH=/goNULLBYTEHOME=/rootNULLBYTEEOF -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/exe -SymlinkTo: /usr/bin/vim -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231/fd -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/0 -SymlinkTo: ../../symlinktargets/abc -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/1 -SymlinkTo: ../../symlinktargets/def -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/10 -SymlinkTo: ../../symlinktargets/xyz -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/2 -SymlinkTo: ../../symlinktargets/ghi -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fd/3 -SymlinkTo: ../../symlinktargets/uvw -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231/fdinfo -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/0 -Lines: 6 -pos: 0 -flags: 02004000 -mnt_id: 13 -inotify wd:3 ino:1 sdev:34 mask:fce ignored_mask:0 fhandle-bytes:c fhandle-type:81 f_handle:000000000100000000000000 -inotify wd:2 ino:1300016 sdev:fd00002 mask:fce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:16003001ed3f022a -inotify wd:1 ino:2e0001 sdev:fd00000 mask:fce ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01002e00138e7c65 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/1 -Lines: 4 -pos: 0 -flags: 02004002 -mnt_id: 13 -eventfd-count: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/10 -Lines: 3 -pos: 0 -flags: 02004002 -mnt_id: 9 -Mode: 400 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/2 -Lines: 3 -pos: 0 -flags: 02004002 -mnt_id: 9 -Mode: 400 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/fdinfo/3 -Lines: 3 -pos: 0 -flags: 02004002 -mnt_id: 9 -Mode: 400 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/io -Lines: 7 -rchar: 750339 -wchar: 818609 -syscr: 7405 -syscw: 5245 -read_bytes: 1024 -write_bytes: 2048 -cancelled_write_bytes: -1024 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/limits -Lines: 17 -Limit Soft Limit Hard Limit Units -Max cpu time unlimited unlimited seconds -Max file size unlimited unlimited bytes -Max data size unlimited unlimited bytes -Max stack size 8388608 unlimited bytes -Max core file size 0 unlimited bytes -Max resident set unlimited unlimited bytes -Max processes 62898 62898 processes -Max open files 2048 4096 files -Max locked memory 65536 65536 bytes -Max address space 8589934592 unlimited bytes -Max file locks unlimited unlimited locks -Max pending signals 62898 62898 signals -Max msgqueue size 819200 819200 bytes -Max nice priority 0 0 -Max realtime priority 0 0 -Max realtime timeout unlimited unlimited us -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/mountstats -Lines: 20 -device rootfs mounted on / with fstype rootfs -device sysfs mounted on /sys with fstype sysfs -device proc mounted on /proc with fstype proc -device /dev/sda1 mounted on / with fstype ext4 -device 192.168.1.1:/srv/test mounted on /mnt/nfs/test with fstype nfs4 statvers=1.1 - opts: rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.1,clientaddr=192.168.1.5,local_lock=none - age: 13968 - caps: caps=0xfff7,wtmult=512,dtsize=32768,bsize=0,namlen=255 - nfsv4: bm0=0xfdffafff,bm1=0xf9be3e,bm2=0x0,acl=0x0,pnfs=not configured - sec: flavor=1,pseudoflavor=1 - events: 52 226 0 0 1 13 398 0 0 331 0 47 0 0 77 0 0 77 0 0 0 0 0 0 0 0 0 - bytes: 1207640230 0 0 0 1210214218 0 295483 0 - RPC iostats version: 1.0 p/v: 100003/4 (nfs) - xprt: tcp 832 0 1 0 11 6428 6428 0 12154 0 24 26 5726 - per-op statistics - NULL: 0 0 0 0 0 0 0 0 - READ: 1298 1298 0 207680 1210292152 6 79386 79407 - WRITE: 0 0 0 0 0 0 0 0 - ACCESS: 2927395007 2927394995 0 526931094212 362996810236 18446743919241604546 1667369447 1953587717 - -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231/net -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/net/dev -Lines: 4 -Inter-| Receive | Transmit - face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed - lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26231/ns -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/ns/mnt -SymlinkTo: mnt:[4026531840] -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/ns/net -SymlinkTo: net:[4026531993] -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/root -SymlinkTo: / -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/schedstat -Lines: 1 -411605849 93680043 79 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/stat -Lines: 1 -26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26231/status -Lines: 53 - -Name: prometheus -Umask: 0022 -State: S (sleeping) -Tgid: 26231 -Ngid: 0 -Pid: 26231 -PPid: 1 -TracerPid: 0 -Uid: 0 0 0 0 -Gid: 0 0 0 0 -FDSize: 128 -Groups: -NStgid: 1 -NSpid: 1 -NSpgid: 1 -NSsid: 1 -VmPeak: 58472 kB -VmSize: 58440 kB -VmLck: 0 kB -VmPin: 0 kB -VmHWM: 8028 kB -VmRSS: 6716 kB -RssAnon: 2092 kB -RssFile: 4624 kB -RssShmem: 0 kB -VmData: 2580 kB -VmStk: 136 kB -VmExe: 948 kB -VmLib: 6816 kB -VmPTE: 128 kB -VmPMD: 12 kB -VmSwap: 660 kB -HugetlbPages: 0 kB -Threads: 1 -SigQ: 8/63965 -SigPnd: 0000000000000000 -ShdPnd: 0000000000000000 -SigBlk: 7be3c0fe28014a03 -SigIgn: 0000000000001000 -SigCgt: 00000001800004ec -CapInh: 0000000000000000 -CapPrm: 0000003fffffffff -CapEff: 0000003fffffffff -CapBnd: 0000003fffffffff -CapAmb: 0000000000000000 -Seccomp: 0 -Cpus_allowed: ff -Cpus_allowed_list: 0-7 -Mems_allowed: 00000000,00000001 -Mems_allowed_list: 0 -voluntary_ctxt_switches: 4742839 -nonvoluntary_ctxt_switches: 1727500 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26232 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/cmdline -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/comm -Lines: 1 -ata_sff -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/cwd -SymlinkTo: /does/not/exist -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26232/fd -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/0 -SymlinkTo: ../../symlinktargets/abc -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/1 -SymlinkTo: ../../symlinktargets/def -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/2 -SymlinkTo: ../../symlinktargets/ghi -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/3 -SymlinkTo: ../../symlinktargets/uvw -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/fd/4 -SymlinkTo: ../../symlinktargets/xyz -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/limits -Lines: 17 -Limit Soft Limit Hard Limit Units -Max cpu time unlimited unlimited seconds -Max file size unlimited unlimited bytes -Max data size unlimited unlimited bytes -Max stack size 8388608 unlimited bytes -Max core file size 0 unlimited bytes -Max resident set unlimited unlimited bytes -Max processes 29436 29436 processes -Max open files 1024 4096 files -Max locked memory 65536 65536 bytes -Max address space unlimited unlimited bytes -Max file locks unlimited unlimited locks -Max pending signals 29436 29436 signals -Max msgqueue size 819200 819200 bytes -Max nice priority 0 0 -Max realtime priority 0 0 -Max realtime timeout unlimited unlimited us -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/root -SymlinkTo: /does/not/exist -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26232/stat -Lines: 1 -33 (ata_sff) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 5 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/26233 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26233/cmdline -Lines: 1 -com.github.uiautomatorNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/26233/schedstat -Lines: 8 - ____________________________________ -< this is a malformed schedstat file > - ------------------------------------ - \ ^__^ - \ (oo)\_______ - (__)\ )\/\ - ||----w | - || || -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/584 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/584/stat -Lines: 2 -1020 ((a b ) ( c d) ) R 28378 1020 28378 34842 1020 4218880 286 0 0 0 0 0 0 0 20 0 1 0 10839175 10395648 155 18446744073709551615 4194304 4238788 140736466511168 140736466511168 140609271124624 0 0 0 0 0 0 0 17 5 0 0 0 0 0 6336016 6337300 25579520 140736466515030 140736466515061 140736466515061 140736466518002 0 -#!/bin/cat /proc/self/stat -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/buddyinfo -Lines: 3 -Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 -Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 -Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/cpuinfo -Lines: 216 -processor : 0 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 799.998 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 0 -cpu cores : 4 -apicid : 0 -initial apicid : 0 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 1 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.037 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 1 -cpu cores : 4 -apicid : 2 -initial apicid : 2 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 2 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.010 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 2 -cpu cores : 4 -apicid : 4 -initial apicid : 4 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 3 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.028 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 3 -cpu cores : 4 -apicid : 6 -initial apicid : 6 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 4 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 799.989 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 0 -cpu cores : 4 -apicid : 1 -initial apicid : 1 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 5 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.083 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 1 -cpu cores : 4 -apicid : 3 -initial apicid : 3 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 6 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.017 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 2 -cpu cores : 4 -apicid : 5 -initial apicid : 5 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 7 -vendor_id : GenuineIntel -cpu family : 6 -model : 142 -model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz -stepping : 10 -microcode : 0xb4 -cpu MHz : 800.030 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 3 -cpu cores : 4 -apicid : 7 -initial apicid : 7 -fpu : yes -fpu_exception : yes -cpuid level : 22 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d -bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs -bogomips : 4224.00 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/crypto -Lines: 971 -name : ccm(aes) -driver : ccm_base(ctr(aes-aesni),cbcmac(aes-aesni)) -module : ccm -priority : 300 -refcnt : 4 -selftest : passed -internal : no -type : aead -async : no -blocksize : 1 -ivsize : 16 -maxauthsize : 16 -geniv : - -name : cbcmac(aes) -driver : cbcmac(aes-aesni) -module : ccm -priority : 300 -refcnt : 7 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 16 - -name : ecdh -driver : ecdh-generic -module : ecdh_generic -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : kpp - -name : ecb(arc4) -driver : ecb(arc4)-generic -module : arc4 -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : no -blocksize : 1 -min keysize : 1 -max keysize : 256 -ivsize : 0 -chunksize : 1 -walksize : 1 - -name : arc4 -driver : arc4-generic -module : arc4 -priority : 0 -refcnt : 3 -selftest : passed -internal : no -type : cipher -blocksize : 1 -min keysize : 1 -max keysize : 256 - -name : crct10dif -driver : crct10dif-pclmul -module : crct10dif_pclmul -priority : 200 -refcnt : 2 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 2 - -name : crc32 -driver : crc32-pclmul -module : crc32_pclmul -priority : 200 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 4 - -name : __ghash -driver : cryptd(__ghash-pclmulqdqni) -module : kernel -priority : 50 -refcnt : 1 -selftest : passed -internal : yes -type : ahash -async : yes -blocksize : 16 -digestsize : 16 - -name : ghash -driver : ghash-clmulni -module : ghash_clmulni_intel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : ahash -async : yes -blocksize : 16 -digestsize : 16 - -name : __ghash -driver : __ghash-pclmulqdqni -module : ghash_clmulni_intel -priority : 0 -refcnt : 1 -selftest : passed -internal : yes -type : shash -blocksize : 16 -digestsize : 16 - -name : crc32c -driver : crc32c-intel -module : crc32c_intel -priority : 200 -refcnt : 5 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 4 - -name : cbc(aes) -driver : cbc(aes-aesni) -module : kernel -priority : 300 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : no -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : ctr(aes) -driver : ctr(aes-aesni) -module : kernel -priority : 300 -refcnt : 5 -selftest : passed -internal : no -type : skcipher -async : no -blocksize : 1 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : pkcs1pad(rsa,sha256) -driver : pkcs1pad(rsa-generic,sha256) -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : akcipher - -name : __xts(aes) -driver : cryptd(__xts-aes-aesni) -module : kernel -priority : 451 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : yes -blocksize : 16 -min keysize : 32 -max keysize : 64 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : xts(aes) -driver : xts-aes-aesni -module : kernel -priority : 401 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : yes -blocksize : 16 -min keysize : 32 -max keysize : 64 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __ctr(aes) -driver : cryptd(__ctr-aes-aesni) -module : kernel -priority : 450 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : yes -blocksize : 1 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : ctr(aes) -driver : ctr-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : yes -blocksize : 1 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __cbc(aes) -driver : cryptd(__cbc-aes-aesni) -module : kernel -priority : 450 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : yes -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : cbc(aes) -driver : cbc-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : yes -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __ecb(aes) -driver : cryptd(__ecb-aes-aesni) -module : kernel -priority : 450 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : yes -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 0 -chunksize : 16 -walksize : 16 - -name : ecb(aes) -driver : ecb-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : yes -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 0 -chunksize : 16 -walksize : 16 - -name : __generic-gcm-aes-aesni -driver : cryptd(__driver-generic-gcm-aes-aesni) -module : kernel -priority : 50 -refcnt : 1 -selftest : passed -internal : yes -type : aead -async : yes -blocksize : 1 -ivsize : 12 -maxauthsize : 16 -geniv : - -name : gcm(aes) -driver : generic-gcm-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : aead -async : yes -blocksize : 1 -ivsize : 12 -maxauthsize : 16 -geniv : - -name : __generic-gcm-aes-aesni -driver : __driver-generic-gcm-aes-aesni -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : yes -type : aead -async : no -blocksize : 1 -ivsize : 12 -maxauthsize : 16 -geniv : - -name : __gcm-aes-aesni -driver : cryptd(__driver-gcm-aes-aesni) -module : kernel -priority : 50 -refcnt : 1 -selftest : passed -internal : yes -type : aead -async : yes -blocksize : 1 -ivsize : 8 -maxauthsize : 16 -geniv : - -name : rfc4106(gcm(aes)) -driver : rfc4106-gcm-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : no -type : aead -async : yes -blocksize : 1 -ivsize : 8 -maxauthsize : 16 -geniv : - -name : __gcm-aes-aesni -driver : __driver-gcm-aes-aesni -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : yes -type : aead -async : no -blocksize : 1 -ivsize : 8 -maxauthsize : 16 -geniv : - -name : __xts(aes) -driver : __xts-aes-aesni -module : kernel -priority : 401 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : no -blocksize : 16 -min keysize : 32 -max keysize : 64 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __ctr(aes) -driver : __ctr-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : no -blocksize : 1 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __cbc(aes) -driver : __cbc-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : no -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 16 -chunksize : 16 -walksize : 16 - -name : __ecb(aes) -driver : __ecb-aes-aesni -module : kernel -priority : 400 -refcnt : 1 -selftest : passed -internal : yes -type : skcipher -async : no -blocksize : 16 -min keysize : 16 -max keysize : 32 -ivsize : 0 -chunksize : 16 -walksize : 16 - -name : __aes -driver : __aes-aesni -module : kernel -priority : 300 -refcnt : 1 -selftest : passed -internal : yes -type : cipher -blocksize : 16 -min keysize : 16 -max keysize : 32 - -name : aes -driver : aes-aesni -module : kernel -priority : 300 -refcnt : 8 -selftest : passed -internal : no -type : cipher -blocksize : 16 -min keysize : 16 -max keysize : 32 - -name : hmac(sha1) -driver : hmac(sha1-generic) -module : kernel -priority : 100 -refcnt : 9 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 20 - -name : ghash -driver : ghash-generic -module : kernel -priority : 100 -refcnt : 3 -selftest : passed -internal : no -type : shash -blocksize : 16 -digestsize : 16 - -name : jitterentropy_rng -driver : jitterentropy_rng -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_hmac_sha256 -module : kernel -priority : 221 -refcnt : 2 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_hmac_sha512 -module : kernel -priority : 220 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_hmac_sha384 -module : kernel -priority : 219 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_hmac_sha1 -module : kernel -priority : 218 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_sha256 -module : kernel -priority : 217 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_sha512 -module : kernel -priority : 216 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_sha384 -module : kernel -priority : 215 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_sha1 -module : kernel -priority : 214 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_ctr_aes256 -module : kernel -priority : 213 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_ctr_aes192 -module : kernel -priority : 212 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_nopr_ctr_aes128 -module : kernel -priority : 211 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : hmac(sha256) -driver : hmac(sha256-generic) -module : kernel -priority : 100 -refcnt : 10 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 32 - -name : stdrng -driver : drbg_pr_hmac_sha256 -module : kernel -priority : 210 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_hmac_sha512 -module : kernel -priority : 209 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_hmac_sha384 -module : kernel -priority : 208 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_hmac_sha1 -module : kernel -priority : 207 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_sha256 -module : kernel -priority : 206 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_sha512 -module : kernel -priority : 205 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_sha384 -module : kernel -priority : 204 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_sha1 -module : kernel -priority : 203 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_ctr_aes256 -module : kernel -priority : 202 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_ctr_aes192 -module : kernel -priority : 201 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : stdrng -driver : drbg_pr_ctr_aes128 -module : kernel -priority : 200 -refcnt : 1 -selftest : passed -internal : no -type : rng -seedsize : 0 - -name : 842 -driver : 842-scomp -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : 842 -driver : 842-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : compression - -name : lzo-rle -driver : lzo-rle-scomp -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : lzo-rle -driver : lzo-rle-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : compression - -name : lzo -driver : lzo-scomp -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : lzo -driver : lzo-generic -module : kernel -priority : 0 -refcnt : 9 -selftest : passed -internal : no -type : compression - -name : crct10dif -driver : crct10dif-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 2 - -name : crc32c -driver : crc32c-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 4 - -name : zlib-deflate -driver : zlib-deflate-scomp -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : deflate -driver : deflate-scomp -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : scomp - -name : deflate -driver : deflate-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : compression - -name : aes -driver : aes-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : cipher -blocksize : 16 -min keysize : 16 -max keysize : 32 - -name : sha224 -driver : sha224-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 28 - -name : sha256 -driver : sha256-generic -module : kernel -priority : 100 -refcnt : 11 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 32 - -name : sha1 -driver : sha1-generic -module : kernel -priority : 100 -refcnt : 11 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 20 - -name : md5 -driver : md5-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 64 -digestsize : 16 - -name : ecb(cipher_null) -driver : ecb-cipher_null -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : skcipher -async : no -blocksize : 1 -min keysize : 0 -max keysize : 0 -ivsize : 0 -chunksize : 1 -walksize : 1 - -name : digest_null -driver : digest_null-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : shash -blocksize : 1 -digestsize : 0 - -name : compress_null -driver : compress_null-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : compression - -name : cipher_null -driver : cipher_null-generic -module : kernel -priority : 0 -refcnt : 1 -selftest : passed -internal : no -type : cipher -blocksize : 1 -min keysize : 0 -max keysize : 0 - -name : rsa -driver : rsa-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : akcipher - -name : dh -driver : dh-generic -module : kernel -priority : 100 -refcnt : 1 -selftest : passed -internal : no -type : kpp - -name : aes -driver : aes-asm -module : kernel -priority : 200 -refcnt : 1 -selftest : passed -internal : no -type : cipher -blocksize : 16 -min keysize : 16 -max keysize : 32 - -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/diskstats -Lines: 49 - 1 0 ram0 0 0 0 0 0 0 0 0 0 0 0 - 1 1 ram1 0 0 0 0 0 0 0 0 0 0 0 - 1 2 ram2 0 0 0 0 0 0 0 0 0 0 0 - 1 3 ram3 0 0 0 0 0 0 0 0 0 0 0 - 1 4 ram4 0 0 0 0 0 0 0 0 0 0 0 - 1 5 ram5 0 0 0 0 0 0 0 0 0 0 0 - 1 6 ram6 0 0 0 0 0 0 0 0 0 0 0 - 1 7 ram7 0 0 0 0 0 0 0 0 0 0 0 - 1 8 ram8 0 0 0 0 0 0 0 0 0 0 0 - 1 9 ram9 0 0 0 0 0 0 0 0 0 0 0 - 1 10 ram10 0 0 0 0 0 0 0 0 0 0 0 - 1 11 ram11 0 0 0 0 0 0 0 0 0 0 0 - 1 12 ram12 0 0 0 0 0 0 0 0 0 0 0 - 1 13 ram13 0 0 0 0 0 0 0 0 0 0 0 - 1 14 ram14 0 0 0 0 0 0 0 0 0 0 0 - 1 15 ram15 0 0 0 0 0 0 0 0 0 0 0 - 7 0 loop0 0 0 0 0 0 0 0 0 0 0 0 - 7 1 loop1 0 0 0 0 0 0 0 0 0 0 0 - 7 2 loop2 0 0 0 0 0 0 0 0 0 0 0 - 7 3 loop3 0 0 0 0 0 0 0 0 0 0 0 - 7 4 loop4 0 0 0 0 0 0 0 0 0 0 0 - 7 5 loop5 0 0 0 0 0 0 0 0 0 0 0 - 7 6 loop6 0 0 0 0 0 0 0 0 0 0 0 - 7 7 loop7 0 0 0 0 0 0 0 0 0 0 0 - 8 0 sda 25354637 34367663 1003346126 18492372 28444756 11134226 505697032 63877960 0 9653880 82621804 - 8 1 sda1 250 0 2000 36 0 0 0 0 0 36 36 - 8 2 sda2 246 0 1968 32 0 0 0 0 0 32 32 - 8 3 sda3 340 13 2818 52 11 8 152 8 0 56 60 - 8 4 sda4 25353629 34367650 1003337964 18492232 27448755 11134218 505696880 61593380 0 7576432 80332428 - 252 0 dm-0 59910002 0 1003337218 46229572 39231014 0 505696880 1158557800 0 11325968 1206301256 - 252 1 dm-1 388 0 3104 84 74 0 592 0 0 76 84 - 252 2 dm-2 11571 0 308350 6536 153522 0 5093416 122884 0 65400 129416 - 252 3 dm-3 3870 0 3870 104 0 0 0 0 0 16 104 - 252 4 dm-4 392 0 1034 28 38 0 137 16 0 24 44 - 252 5 dm-5 3729 0 84279 924 98918 0 1151688 104684 0 58848 105632 - 179 0 mmcblk0 192 3 1560 156 0 0 0 0 0 136 156 - 179 1 mmcblk0p1 17 3 160 24 0 0 0 0 0 24 24 - 179 2 mmcblk0p2 95 0 760 68 0 0 0 0 0 68 68 - 2 0 fd0 2 0 16 80 0 0 0 0 0 80 80 - 254 0 vda 1775784 15386 32670882 8655768 6038856 20711856 213637440 2069221364 0 41614592 2077872228 - 254 1 vda1 668 85 5984 956 207 4266 35784 32772 0 8808 33720 - 254 2 vda2 1774936 15266 32663262 8654692 5991028 20707590 213601656 2069152216 0 41607628 2077801992 - 11 0 sr0 0 0 0 0 0 0 0 0 0 0 0 - 259 0 nvme0n1 47114 4 4643973 21650 1078320 43950 39451633 1011053 0 222766 1032546 - 259 1 nvme0n1p1 1140 0 9370 16 1 0 1 0 0 16 16 - 259 2 nvme0n1p2 45914 4 4631243 21626 1036885 43950 39451632 919480 0 131580 940970 - 8 0 sdb 326552 841 9657779 84 41822 2895 1972905 5007 0 60730 67070 68851 0 1925173784 11130 - 8 1 sdb1 231 3 34466 4 24 23 106 0 0 64 64 0 0 0 0 - 8 2 sdb2 326310 838 9622281 67 40726 2872 1972799 4924 0 58250 64567 68851 0 1925173784 11130 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/fs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/fs/xfs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/fs/xfs/stat -Lines: 23 -extent_alloc 92447 97589 92448 93751 -abt 0 0 0 0 -blk_map 1767055 188820 184891 92447 92448 2140766 0 -bmbt 0 0 0 0 -dir 185039 92447 92444 136422 -trans 706 944304 0 -ig 185045 58807 0 126238 0 33637 22 -log 2883 113448 9 17360 739 -push_ail 945014 0 134260 15483 0 3940 464 159985 0 40 -xstrat 92447 0 -rw 107739 94045 -attr 4 0 0 0 -icluster 8677 7849 135802 -vnodes 92601 0 0 0 92444 92444 92444 0 -buf 2666287 7122 2659202 3599 2 7085 0 10297 7085 -abtb2 184941 1277345 13257 13278 0 0 0 0 0 0 0 0 0 0 2746147 -abtc2 345295 2416764 172637 172658 0 0 0 0 0 0 0 0 0 0 21406023 -bmbt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -ibt2 343004 1358467 0 0 0 0 0 0 0 0 0 0 0 0 0 -fibt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -qm 0 0 0 0 0 0 0 0 -xpc 399724544 92823103 86219234 -debug 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/mdstat -Lines: 56 -Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] - -md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] sdd1[10](S) sdd2[11](S) - 5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU] - -md127 : active raid1 sdi2[0] sdj2[1] - 312319552 blocks [2/2] [UU] - -md0 : active raid1 sdi1[0] sdj1[1] - 248896 blocks [2/2] [UU] - -md4 : inactive raid1 sda3[0](F) sdb3[1](S) - 4883648 blocks [2/2] [UU] - -md6 : active raid1 sdb2[2](F) sdc[1](S) sda2[0] - 195310144 blocks [2/1] [U_] - [=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec - -md8 : active raid1 sdb1[1] sda1[0] sdc[2](S) sde[3](S) - 195310144 blocks [2/2] [UU] - [=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec - -md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1](F) - 7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU] - bitmap: 0/30 pages [0KB], 65536KB chunk - -md9 : active raid1 sdc2[2] sdd2[3] sdb2[1] sda2[0] sde[4](F) sdf[5](F) sdg[6](S) - 523968 blocks super 1.2 [4/4] [UUUU] - resync=DELAYED - -md10 : active raid0 sda1[0] sdb1[1] - 314159265 blocks 64k chunks - -md11 : active (auto-read-only) raid1 sdb2[0] sdc2[1] sdc3[2](F) hda[4](S) ssdc2[3](S) - 4190208 blocks super 1.2 [2/2] [UU] - resync=PENDING - -md12 : active raid0 sdc2[0] sdd2[1] - 3886394368 blocks super 1.2 512k chunks - -md126 : active raid0 sdb[1] sdc[0] - 1855870976 blocks super external:/md127/0 128k chunks - -md219 : inactive sdb[2](S) sdc[1](S) sda[0](S) - 7932 blocks super external:imsm - -md00 : active raid0 xvdb[0] - 4186624 blocks super 1.2 256k chunks - -md120 : active linear sda1[1] sdb1[0] - 2095104 blocks super 1.2 0k rounding - -md101 : active (read-only) raid0 sdb[2] sdd[1] sdc[0] - 322560 blocks super 1.2 512k chunks - -unused devices: -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/net -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/arp -Lines: 2 -IP address HW type Flags HW address Mask Device -192.168.224.1 0x1 0x2 00:50:56:c0:00:08 * ens33 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/dev -Lines: 6 -Inter-| Receive | Transmit - face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed -vethf345468: 648 8 0 0 0 0 0 0 438 5 0 0 0 0 0 0 - lo: 1664039048 1566805 0 0 0 0 0 0 1664039048 1566805 0 0 0 0 0 0 -docker0: 2568 38 0 0 0 0 0 0 438 5 0 0 0 0 0 0 - eth0: 874354587 1036395 0 0 0 0 0 0 563352563 732147 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/ip_vs -Lines: 21 -IP Virtual Server version 1.2.1 (size=4096) -Prot LocalAddress:Port Scheduler Flags - -> RemoteAddress:Port Forward Weight ActiveConn InActConn -TCP C0A80016:0CEA wlc - -> C0A85216:0CEA Tunnel 100 248 2 - -> C0A85318:0CEA Tunnel 100 248 2 - -> C0A85315:0CEA Tunnel 100 248 1 -TCP C0A80039:0CEA wlc - -> C0A85416:0CEA Tunnel 0 0 0 - -> C0A85215:0CEA Tunnel 100 1499 0 - -> C0A83215:0CEA Tunnel 100 1498 0 -TCP C0A80037:0CEA wlc - -> C0A8321A:0CEA Tunnel 0 0 0 - -> C0A83120:0CEA Tunnel 100 0 0 -TCP [2620:0000:0000:0000:0000:0000:0000:0001]:0050 sh - -> [2620:0000:0000:0000:0000:0000:0000:0002]:0050 Route 1 0 0 - -> [2620:0000:0000:0000:0000:0000:0000:0003]:0050 Route 1 0 0 - -> [2620:0000:0000:0000:0000:0000:0000:0004]:0050 Route 1 1 1 -FWM 10001000 wlc - -> C0A8321A:0CEA Route 0 0 1 - -> C0A83215:0CEA Route 0 0 2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/ip_vs_stats -Lines: 6 - Total Incoming Outgoing Incoming Outgoing - Conns Packets Packets Bytes Bytes - 16AA370 E33656E5 0 51D8C8883AB3 0 - - Conns/s Pkts/s Pkts/s Bytes/s Bytes/s - 4 1FB3C 0 1282A8F 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/net/rpc -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/rpc/nfs -Lines: 5 -net 18628 0 18628 6 -rpc 4329785 0 4338291 -proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 -proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 0 241 4 4 2 39 -proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/rpc/nfsd -Lines: 11 -rc 0 6 18622 -fh 0 0 0 0 0 -io 157286400 0 -th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -ra 32 0 0 0 0 0 0 0 0 0 0 0 -net 18628 0 18628 6 -rpc 18628 0 0 0 0 -proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 -proc3 22 2 112 0 2719 111 0 0 0 0 0 0 0 0 0 0 0 27 216 0 2 1 0 -proc4 2 2 10853 -proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/softnet_stat -Lines: 1 -00015c73 00020e76 F0000769 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/unix -Lines: 6 -Num RefCount Protocol Flags Type St Inode Path -0000000000000000: 00000002 00000000 00010000 0001 01 3442596 /var/run/postgresql/.s.PGSQL.5432 -0000000000000000: 0000000a 00000000 00010000 0005 01 10061 /run/udev/control -0000000000000000: 00000007 00000000 00000000 0002 01 12392 /dev/log -0000000000000000: 00000003 00000000 00000000 0001 03 4787297 /var/run/postgresql/.s.PGSQL.5432 -0000000000000000: 00000003 00000000 00000000 0001 03 5091797 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/unix_without_inode -Lines: 6 -Num RefCount Protocol Flags Type St Path -0000000000000000: 00000002 00000000 00010000 0001 01 /var/run/postgresql/.s.PGSQL.5432 -0000000000000000: 0000000a 00000000 00010000 0005 01 /run/udev/control -0000000000000000: 00000007 00000000 00000000 0002 01 /dev/log -0000000000000000: 00000003 00000000 00000000 0001 03 /var/run/postgresql/.s.PGSQL.5432 -0000000000000000: 00000003 00000000 00000000 0001 03 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/net/xfrm_stat -Lines: 28 -XfrmInError 1 -XfrmInBufferError 2 -XfrmInHdrError 4 -XfrmInNoStates 3 -XfrmInStateProtoError 40 -XfrmInStateModeError 100 -XfrmInStateSeqError 6000 -XfrmInStateExpired 4 -XfrmInStateMismatch 23451 -XfrmInStateInvalid 55555 -XfrmInTmplMismatch 51 -XfrmInNoPols 65432 -XfrmInPolBlock 100 -XfrmInPolError 10000 -XfrmOutError 1000000 -XfrmOutBundleGenError 43321 -XfrmOutBundleCheckError 555 -XfrmOutNoStates 869 -XfrmOutStateProtoError 4542 -XfrmOutStateModeError 4 -XfrmOutStateSeqError 543 -XfrmOutStateExpired 565 -XfrmOutPolBlock 43456 -XfrmOutPolDead 7656 -XfrmOutPolError 1454 -XfrmFwdHdrError 6654 -XfrmOutStateInvalid 28765 -XfrmAcquireError 24532 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/pressure -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/pressure/cpu -Lines: 1 -some avg10=0.10 avg60=2.00 avg300=3.85 total=15 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/pressure/io -Lines: 2 -some avg10=0.10 avg60=2.00 avg300=3.85 total=15 -full avg10=0.20 avg60=3.00 avg300=4.95 total=25 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/pressure/memory -Lines: 2 -some avg10=0.10 avg60=2.00 avg300=3.85 total=15 -full avg10=0.20 avg60=3.00 avg300=4.95 total=25 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/schedstat -Lines: 6 -version 15 -timestamp 15819019232 -cpu0 498494191 0 3533438552 2553969831 3853684107 2465731542 2045936778163039 343796328169361 4767485306 -domain0 00000000,00000003 212499247 210112015 1861015 1860405436 536440 369895 32599 210079416 25368550 24241256 384652 927363878 807233 6366 1647 24239609 2122447165 1886868564 121112060 2848625533 125678146 241025 1032026 1885836538 2545 12 2533 0 0 0 0 0 0 1387952561 21076581 0 -cpu1 518377256 0 4155211005 2778589869 10466382 2867629021 1904686152592476 364107263788241 5145567945 -domain0 00000000,00000003 217653037 215526982 1577949 1580427380 557469 393576 28538 215498444 28721913 27662819 371153 870843407 745912 5523 1639 27661180 2331056874 2107732788 111442342 652402556 123615235 196159 1045245 2106687543 2400 3 2397 0 0 0 0 0 0 1437804657 26220076 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/self -SymlinkTo: 26231 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/stat -Lines: 16 -cpu 301854 612 111922 8979004 3552 2 3944 0 0 0 -cpu0 44490 19 21045 1087069 220 1 3410 0 0 0 -cpu1 47869 23 16474 1110787 591 0 46 0 0 0 -cpu2 46504 36 15916 1112321 441 0 326 0 0 0 -cpu3 47054 102 15683 1113230 533 0 60 0 0 0 -cpu4 28413 25 10776 1140321 217 0 8 0 0 0 -cpu5 29271 101 11586 1136270 672 0 30 0 0 0 -cpu6 29152 36 10276 1139721 319 0 29 0 0 0 -cpu7 29098 268 10164 1139282 555 0 31 0 0 0 -intr 8885917 17 0 0 0 0 0 0 0 1 79281 0 0 0 0 0 0 0 231237 0 0 0 0 250586 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223424 190745 13 906 1283803 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -ctxt 38014093 -btime 1418183276 -processes 26442 -procs_running 2 -procs_blocked 1 -softirq 5057579 250191 1481983 1647 211099 186066 0 1783454 622196 12499 508444 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/symlinktargets -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/README -Lines: 2 -This directory contains some empty files that are the symlinks the files in the "fd" directory point to. -They are otherwise ignored by the tests -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/abc -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/def -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/ghi -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/uvw -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/symlinktargets/xyz -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/sys -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/proc/sys/vm -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/admin_reserve_kbytes -Lines: 1 -8192 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/block_dump -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/compact_unevictable_allowed -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_background_bytes -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_background_ratio -Lines: 1 -10 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_bytes -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_expire_centisecs -Lines: 1 -3000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_ratio -Lines: 1 -20 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirty_writeback_centisecs -Lines: 1 -500 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/dirtytime_expire_seconds -Lines: 1 -43200 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/drop_caches -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/extfrag_threshold -Lines: 1 -500 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/hugetlb_shm_group -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/laptop_mode -Lines: 1 -5 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/legacy_va_layout -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/lowmem_reserve_ratio -Lines: 1 -256 256 32 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/max_map_count -Lines: 1 -65530 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/memory_failure_early_kill -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/memory_failure_recovery -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/min_free_kbytes -Lines: 1 -67584 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/min_slab_ratio -Lines: 1 -5 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/min_unmapped_ratio -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/mmap_min_addr -Lines: 1 -65536 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/nr_hugepages -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/nr_hugepages_mempolicy -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/nr_overcommit_hugepages -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/numa_stat -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/numa_zonelist_order -Lines: 1 -Node -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/oom_dump_tasks -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/oom_kill_allocating_task -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/overcommit_kbytes -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/overcommit_memory -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/overcommit_ratio -Lines: 1 -50 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/page-cluster -Lines: 1 -3 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/panic_on_oom -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/percpu_pagelist_fraction -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/stat_interval -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/swappiness -Lines: 1 -60 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/user_reserve_kbytes -Lines: 1 -131072 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/vfs_cache_pressure -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/watermark_boost_factor -Lines: 1 -15000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/watermark_scale_factor -Lines: 1 -10 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/sys/vm/zone_reclaim_mode -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/proc/zoneinfo -Lines: 262 -Node 0, zone DMA - per-node stats - nr_inactive_anon 230981 - nr_active_anon 547580 - nr_inactive_file 316904 - nr_active_file 346282 - nr_unevictable 115467 - nr_slab_reclaimable 131220 - nr_slab_unreclaimable 47320 - nr_isolated_anon 0 - nr_isolated_file 0 - workingset_nodes 11627 - workingset_refault 466886 - workingset_activate 276925 - workingset_restore 84055 - workingset_nodereclaim 487 - nr_anon_pages 795576 - nr_mapped 215483 - nr_file_pages 761874 - nr_dirty 908 - nr_writeback 0 - nr_writeback_temp 0 - nr_shmem 224925 - nr_shmem_hugepages 0 - nr_shmem_pmdmapped 0 - nr_anon_transparent_hugepages 0 - nr_unstable 0 - nr_vmscan_write 12950 - nr_vmscan_immediate_reclaim 3033 - nr_dirtied 8007423 - nr_written 7752121 - nr_kernel_misc_reclaimable 0 - pages free 3952 - min 33 - low 41 - high 49 - spanned 4095 - present 3975 - managed 3956 - protection: (0, 2877, 7826, 7826, 7826) - nr_free_pages 3952 - nr_zone_inactive_anon 0 - nr_zone_active_anon 0 - nr_zone_inactive_file 0 - nr_zone_active_file 0 - nr_zone_unevictable 0 - nr_zone_write_pending 0 - nr_mlock 0 - nr_page_table_pages 0 - nr_kernel_stack 0 - nr_bounce 0 - nr_zspages 0 - nr_free_cma 0 - numa_hit 1 - numa_miss 0 - numa_foreign 0 - numa_interleave 0 - numa_local 1 - numa_other 0 - pagesets - cpu: 0 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 1 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 2 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 3 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 4 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 5 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 6 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - cpu: 7 - count: 0 - high: 0 - batch: 1 - vm stats threshold: 8 - node_unreclaimable: 0 - start_pfn: 1 -Node 0, zone DMA32 - pages free 204252 - min 19510 - low 21059 - high 22608 - spanned 1044480 - present 759231 - managed 742806 - protection: (0, 0, 4949, 4949, 4949) - nr_free_pages 204252 - nr_zone_inactive_anon 118558 - nr_zone_active_anon 106598 - nr_zone_inactive_file 75475 - nr_zone_active_file 70293 - nr_zone_unevictable 66195 - nr_zone_write_pending 64 - nr_mlock 4 - nr_page_table_pages 1756 - nr_kernel_stack 2208 - nr_bounce 0 - nr_zspages 0 - nr_free_cma 0 - numa_hit 113952967 - numa_miss 0 - numa_foreign 0 - numa_interleave 0 - numa_local 113952967 - numa_other 0 - pagesets - cpu: 0 - count: 345 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 1 - count: 356 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 2 - count: 325 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 3 - count: 346 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 4 - count: 321 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 5 - count: 316 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 6 - count: 373 - high: 378 - batch: 63 - vm stats threshold: 48 - cpu: 7 - count: 339 - high: 378 - batch: 63 - vm stats threshold: 48 - node_unreclaimable: 0 - start_pfn: 4096 -Node 0, zone Normal - pages free 18553 - min 11176 - low 13842 - high 16508 - spanned 1308160 - present 1308160 - managed 1268711 - protection: (0, 0, 0, 0, 0) - nr_free_pages 18553 - nr_zone_inactive_anon 112423 - nr_zone_active_anon 440982 - nr_zone_inactive_file 241429 - nr_zone_active_file 275989 - nr_zone_unevictable 49272 - nr_zone_write_pending 844 - nr_mlock 154 - nr_page_table_pages 9750 - nr_kernel_stack 15136 - nr_bounce 0 - nr_zspages 0 - nr_free_cma 0 - numa_hit 162718019 - numa_miss 0 - numa_foreign 0 - numa_interleave 26812 - numa_local 162718019 - numa_other 0 - pagesets - cpu: 0 - count: 316 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 1 - count: 366 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 2 - count: 60 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 3 - count: 256 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 4 - count: 253 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 5 - count: 159 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 6 - count: 311 - high: 378 - batch: 63 - vm stats threshold: 56 - cpu: 7 - count: 264 - high: 378 - batch: 63 - vm stats threshold: 56 - node_unreclaimable: 0 - start_pfn: 1048576 -Node 0, zone Movable - pages free 0 - min 0 - low 0 - high 0 - spanned 0 - present 0 - managed 0 - protection: (0, 0, 0, 0, 0) -Node 0, zone Device - pages free 0 - min 0 - low 0 - high 0 - spanned 0 - present 0 - managed 0 - protection: (0, 0, 0, 0, 0) -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/block -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/block/dm-0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/dm-0/stat -Lines: 1 -6447303 0 710266738 1529043 953216 0 31201176 4557464 0 796160 6088971 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/block/sda -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/block/sda/stat -Lines: 1 -9652963 396792 759304206 412943 8422549 6731723 286915323 13947418 0 5658367 19174573 1 2 3 12 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/board_id -Lines: 1 -SM_1141000001000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/fw_ver -Lines: 1 -2.31.5050 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/hca_type -Lines: 1 -MT4099 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/excessive_buffer_overrun_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_downed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/link_error_recovery -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/local_link_integrity_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_data -Lines: 1 -2221223609 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_packets -Lines: 1 -87169372 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_remote_physical_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_rcv_switch_relay_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_data -Lines: 1 -26509113295 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_discards -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_packets -Lines: 1 -85734114 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/port_xmit_wait -Lines: 1 -3599 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/counters/symbol_error -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/phys_state -Lines: 1 -5: LinkUp -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/rate -Lines: 1 -40 Gb/sec (4X QDR) -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/1/state -Lines: 1 -4: ACTIVE -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/excessive_buffer_overrun_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_downed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/link_error_recovery -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/local_link_integrity_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_data -Lines: 1 -2460436784 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_packets -Lines: 1 -89332064 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_remote_physical_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_rcv_switch_relay_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_constraint_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_data -Lines: 1 -26540356890 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_discards -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_packets -Lines: 1 -88622850 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/port_xmit_wait -Lines: 1 -3846 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/counters/symbol_error -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/phys_state -Lines: 1 -5: LinkUp -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/rate -Lines: 1 -40 Gb/sec (4X QDR) -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/infiniband/mlx4_0/ports/2/state -Lines: 1 -4: ACTIVE -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/net -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/net/eth0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/addr_assign_type -Lines: 1 -3 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/addr_len -Lines: 1 -6 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/address -Lines: 1 -01:01:01:01:01:01 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/broadcast -Lines: 1 -ff:ff:ff:ff:ff:ff -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/carrier -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/carrier_changes -Lines: 1 -2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/carrier_down_count -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/carrier_up_count -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/dev_id -Lines: 1 -0x20 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/device -SymlinkTo: ../../../devices/pci0000:00/0000:00:1f.6/ -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/dormant -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/duplex -Lines: 1 -full -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/flags -Lines: 1 -0x1303 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/ifalias -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/ifindex -Lines: 1 -2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/iflink -Lines: 1 -2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/link_mode -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/mtu -Lines: 1 -1500 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/name_assign_type -Lines: 1 -2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/netdev_group -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/operstate -Lines: 1 -up -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/phys_port_id -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/phys_port_name -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/phys_switch_id -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/speed -Lines: 1 -1000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/tx_queue_len -Lines: 1 -1000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/net/eth0/type -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/power_supply -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/power_supply/AC -SymlinkTo: ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/power_supply/BAT0 -SymlinkTo: ../../devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal/cooling_device0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device0/cur_state -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device0/max_state -Lines: 1 -50 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device0/type -Lines: 1 -Processor -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal/cooling_device1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device1/cur_state -Lines: 1 --1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device1/max_state -Lines: 1 -27 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/cooling_device1/type -Lines: 1 -intel_powerclamp -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal/thermal_zone0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone0/policy -Lines: 1 -step_wise -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone0/temp -Lines: 1 -49925 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone0/type -Lines: 1 -bcm2835_thermal -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/class/thermal/thermal_zone1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/mode -Lines: 1 -enabled -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/passive -Lines: 1 -0 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/policy -Lines: 1 -step_wise -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/temp -Lines: 1 -44000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/class/thermal/thermal_zone1/type -Lines: 1 -acpitz -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/device -SymlinkTo: ../../../ACPI0003:00 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/online -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/async -Lines: 1 -disabled -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/autosuspend_delay_ms -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/control -Lines: 1 -auto -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_active_kids -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_active_time -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_enabled -Lines: 1 -disabled -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_status -Lines: 1 -unsupported -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_suspended_time -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/runtime_usage -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup -Lines: 1 -enabled -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_abort_count -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_active -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_active_count -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_count -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_expire_count -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_last_time_ms -Lines: 1 -10598 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_max_time_ms -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_prevent_sleep_time_ms -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/power/wakeup_total_time_ms -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/subsystem -SymlinkTo: ../../../../../../../../../class/power_supply -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/type -Lines: 1 -Mains -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/ACPI0003:00/power_supply/AC/uevent -Lines: 2 -POWER_SUPPLY_NAME=AC -POWER_SUPPLY_ONLINE=0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/alarm -Lines: 1 -2369000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/capacity -Lines: 1 -98 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/capacity_level -Lines: 1 -Normal -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/charge_start_threshold -Lines: 1 -95 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/charge_stop_threshold -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/cycle_count -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/device -SymlinkTo: ../../../PNP0C0A:00 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full -Lines: 1 -50060000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_full_design -Lines: 1 -47520000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/energy_now -Lines: 1 -49450000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/manufacturer -Lines: 1 -LGC -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/model_name -Lines: 1 -LNV-45N1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/async -Lines: 1 -disabled -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/autosuspend_delay_ms -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/control -Lines: 1 -auto -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_active_kids -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_active_time -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_enabled -Lines: 1 -disabled -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_status -Lines: 1 -unsupported -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_suspended_time -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power/runtime_usage -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/power_now -Lines: 1 -4830000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/present -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/serial_number -Lines: 1 -38109 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/status -Lines: 1 -Discharging -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/subsystem -SymlinkTo: ../../../../../../../../../class/power_supply -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/technology -Lines: 1 -Li-ion -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/type -Lines: 1 -Battery -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/uevent -Lines: 16 -POWER_SUPPLY_NAME=BAT0 -POWER_SUPPLY_STATUS=Discharging -POWER_SUPPLY_PRESENT=1 -POWER_SUPPLY_TECHNOLOGY=Li-ion -POWER_SUPPLY_CYCLE_COUNT=0 -POWER_SUPPLY_VOLTAGE_MIN_DESIGN=10800000 -POWER_SUPPLY_VOLTAGE_NOW=11750000 -POWER_SUPPLY_POWER_NOW=5064000 -POWER_SUPPLY_ENERGY_FULL_DESIGN=47520000 -POWER_SUPPLY_ENERGY_FULL=47390000 -POWER_SUPPLY_ENERGY_NOW=40730000 -POWER_SUPPLY_CAPACITY=85 -POWER_SUPPLY_CAPACITY_LEVEL=Normal -POWER_SUPPLY_MODEL_NAME=LNV-45N1 -POWER_SUPPLY_MANUFACTURER=LGC -POWER_SUPPLY_SERIAL_NUMBER=38109 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_min_design -Lines: 1 -10800000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:00/PNP0C09:00/PNP0C0A:00/power_supply/BAT0/voltage_now -Lines: 1 -12229000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/dirty_data -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_hits -Lines: 1 -289 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_day/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_five_minute/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_hour/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_hits -Lines: 1 -546 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata4/host3/target3:0:0/3:0:0:0/block/sdb/bcache/stats_total/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/io_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/metadata_written -Lines: 1 -512 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/priority_stats -Lines: 5 -Unused: 99% -Metadata: 0% -Average: 10473 -Sectors per Q: 64 -Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:0d.0/ata5/host4/target4:0:0/4:0:0:0/block/sdc/bcache/written -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/pci0000:00/0000:00:1f.6 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/ari_enabled -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/broken_parity_status -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/class -Lines: 1 -0x020000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/consistent_dma_mask_bits -Lines: 1 -64 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/d3cold_allowed -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/device -Lines: 1 -0x15d7 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/dma_mask_bits -Lines: 1 -64 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/driver_override -Lines: 1 -(null) -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/irq -Lines: 1 -140 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/local_cpulist -Lines: 1 -0-7 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/local_cpus -Lines: 1 -ff -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/modalias -Lines: 1 -pci:v00008086d000015D7sv000017AAsd0000225Abc02sc00i00 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/msi_bus -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/numa_node -Lines: 1 --1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/resource -Lines: 13 -0x00000000ec200000 0x00000000ec21ffff 0x0000000000040200 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -0x0000000000000000 0x0000000000000000 0x0000000000000000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/revision -Lines: 1 -0x21 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/subsystem_device -Lines: 1 -0x225a -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/subsystem_vendor -Lines: 1 -0x17aa -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/uevent -Lines: 6 -DRIVER=e1000e -PCI_CLASS=20000 -PCI_ID=8086:15D7 -PCI_SUBSYS_ID=17AA:225A -PCI_SLOT_NAME=0000:00:1f.6 -MODALIAS=pci:v00008086d000015D7sv000017AAsd0000225Abc02sc00i00 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/pci0000:00/0000:00:1f.6/vendor -Lines: 1 -0x8086 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/rbd -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/rbd/0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/rbd/0/name -Lines: 1 -demo -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/rbd/0/pool -Lines: 1 -iscsi-images -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/rbd/1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/rbd/1/name -Lines: 1 -wrong -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/rbd/1/pool -Lines: 1 -wrong-images -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/clocksource -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/clocksource/clocksource0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/clocksource/clocksource0/available_clocksource -Lines: 1 -tsc hpet acpi_pm -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/clocksource/clocksource0/current_clocksource -Lines: 1 -tsc -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/cpufreq -SymlinkTo: ../cpufreq/policy0 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle/core_throttle_count -Lines: 1 -10084 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/thermal_throttle/package_throttle_count -Lines: 1 -34818 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu0/topology -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_id -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_siblings -Lines: 1 -ff -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/core_siblings_list -Lines: 1 -0-7 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/physical_package_id -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/thread_siblings -Lines: 1 -11 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu0/topology/thread_siblings_list -Lines: 1 -0,4 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu1 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu1/cpufreq -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freq -Lines: 1 -1200195 -Mode: 400 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_max_freq -Lines: 1 -3300000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_min_freq -Lines: 1 -1200000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_transition_latency -Lines: 1 -4294967295 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/related_cpus -Lines: 1 -1 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_available_governors -Lines: 1 -performance powersave -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_driver -Lines: 1 -intel_pstate -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor -Lines: 1 -powersave -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq -Lines: 1 -3300000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq -Lines: 1 -1200000 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/cpufreq/scaling_setspeed -Lines: 1 - -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle/core_throttle_count -Lines: 1 -523 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/thermal_throttle/package_throttle_count -Lines: 1 -34818 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpu1/topology -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_id -Lines: 1 -1 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_siblings -Lines: 1 -ff -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/core_siblings_list -Lines: 1 -0-7 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/physical_package_id -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/thread_siblings -Lines: 1 -22 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpu1/topology/thread_siblings_list -Lines: 1 -1,5 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpufreq -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpufreq/policy0 -Mode: 775 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/affected_cpus -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq -Lines: 1 -2400000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq -Lines: 1 -800000 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_transition_latency -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/related_cpus -Lines: 1 -0 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors -Lines: 1 -performance powersave -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq -Lines: 1 -1219917 -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_driver -Lines: 1 -intel_pstate -Mode: 444 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_governor -Lines: 1 -powersave -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq -Lines: 1 -2400000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq -Lines: 1 -800000 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed -Lines: 1 - -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/devices/system/cpu/cpufreq/policy1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/average_key_size -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0 -Mode: 777 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/dirty_data -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_hits -Lines: 1 -289 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_day/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_five_minute/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_hour/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_hits -Lines: 1 -546 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/bdev0/stats_total/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/btree_cache_size -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0 -Mode: 777 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/io_errors -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/metadata_written -Lines: 1 -512 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/priority_stats -Lines: 5 -Unused: 99% -Metadata: 0% -Average: 10473 -Sectors per Q: 64 -Quantiles: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946 20946] -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache0/written -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/cache_available_percent -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/congested -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/active_journal_entries -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_nodes -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/btree_read_average_duration_us -Lines: 1 -1305 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/internal/cache_read_races -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/root_usage_percent -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_hits -Lines: 1 -289 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_day/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_five_minute/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hit_ratio -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_hour/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/bypassed -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_hits -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_bypass_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hit_ratio -Lines: 1 -100 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_hits -Lines: 1 -546 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_miss_collisions -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_misses -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/stats_total/cache_readaheads -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/bcache/deaddd54-c735-46d5-868e-f331c5fd7c74/tree_depth -Lines: 1 -0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs/sda1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs/sda1/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/xfs/sda1/stats/stats -Lines: 1 -extent_alloc 1 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs/sdb1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/fs/xfs/sdb1/stats -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/fs/xfs/sdb1/stats/stats -Lines: 1 -extent_alloc 2 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/fileio_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/fileio_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/fileio_1/file_lio_1G/udev_path -Lines: 1 -/home/iscsi/file_back_1G -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/iblock_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/iblock_0/block_lio_rbd1/udev_path -Lines: 1 -/dev/rbd1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/rbd_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/rbd_0/iscsi-images-demo/udev_path -Lines: 1 -/dev/rbd/iscsi-images/demo -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/core/rd_mcp_119/ramdisk_lio_1G/udev_path -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/7f4a4eb56d -SymlinkTo: ../../../../../../target/core/rd_mcp_119/ramdisk_lio_1G -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds -Lines: 1 -204950 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes -Lines: 1 -10325 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.8888bbbbddd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes -Lines: 1 -40325 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/795b7c7026 -SymlinkTo: ../../../../../../target/core/iblock_0/block_lio_rbd1 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds -Lines: 1 -104950 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes -Lines: 1 -20095 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2003-01.org.linux-iscsi.osd1.x8664:sn.abcd1abcd2ab/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes -Lines: 1 -71235 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/fff5e16686 -SymlinkTo: ../../../../../../target/core/fileio_1/file_lio_1G -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds -Lines: 1 -301950 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes -Lines: 1 -10195 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:dev.rbd0/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes -Lines: 1 -30195 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/enable -Lines: 1 -1 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/eba1edf893 -SymlinkTo: ../../../../../../target/core/rbd_0/iscsi-images-demo -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/in_cmds -Lines: 1 -1234 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/read_mbytes -Lines: 1 -1504 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/sys/kernel/config/target/iscsi/iqn.2016-11.org.linux-iscsi.igw.x86:sn.ramdemo/tpgt_1/lun/lun_0/statistics/scsi_tgt_port/write_mbytes -Lines: 1 -4733 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/prometheus/procfs/go.mod b/vendor/github.com/prometheus/procfs/go.mod deleted file mode 100644 index b2f8cca9..00000000 --- a/vendor/github.com/prometheus/procfs/go.mod +++ /dev/null @@ -1,6 +0,0 @@ -module github.com/prometheus/procfs - -require ( - github.com/google/go-cmp v0.3.0 - golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 -) diff --git a/vendor/github.com/prometheus/procfs/go.sum b/vendor/github.com/prometheus/procfs/go.sum deleted file mode 100644 index db54133d..00000000 --- a/vendor/github.com/prometheus/procfs/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/vendor/github.com/prometheus/procfs/internal/fs/fs.go b/vendor/github.com/prometheus/procfs/internal/fs/fs.go index 7ddfd6b6..565e89e4 100644 --- a/vendor/github.com/prometheus/procfs/internal/fs/fs.go +++ b/vendor/github.com/prometheus/procfs/internal/fs/fs.go @@ -26,7 +26,7 @@ const ( // DefaultSysMountPoint is the common mount point of the sys filesystem. DefaultSysMountPoint = "/sys" - // DefaultConfigfsMountPoint is the commont mount point of the configfs + // DefaultConfigfsMountPoint is the common mount point of the configfs DefaultConfigfsMountPoint = "/sys/kernel/config" ) diff --git a/vendor/github.com/prometheus/procfs/internal/util/readfile.go b/vendor/github.com/prometheus/procfs/internal/util/readfile.go new file mode 100644 index 00000000..8051161b --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/readfile.go @@ -0,0 +1,38 @@ +// Copyright 2019 The Prometheus Authors +// 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. + +package util + +import ( + "io" + "io/ioutil" + "os" +) + +// ReadFileNoStat uses ioutil.ReadAll to read contents of entire file. +// This is similar to ioutil.ReadFile but without the call to os.Stat, because +// many files in /proc and /sys report incorrect file sizes (either 0 or 4096). +// Reads a max file size of 512kB. For files larger than this, a scanner +// should be used. +func ReadFileNoStat(filename string) ([]byte, error) { + const maxBufferSize = 1024 * 512 + + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + + reader := io.LimitReader(f, maxBufferSize) + return ioutil.ReadAll(reader) +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go index 68b37c4b..c07de0b6 100644 --- a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go +++ b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go @@ -23,6 +23,8 @@ import ( // SysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. // https://github.com/prometheus/node_exporter/pull/728/files +// +// Note that this function will not read files larger than 128 bytes. func SysReadFile(file string) (string, error) { f, err := os.Open(file) if err != nil { @@ -35,7 +37,8 @@ func SysReadFile(file string) (string, error) { // // Since we either want to read data or bail immediately, do the simplest // possible read using syscall directly. - b := make([]byte, 128) + const sysFileBufferSize = 128 + b := make([]byte, sysFileBufferSize) n, err := syscall.Read(int(f.Fd()), b) if err != nil { return "", err diff --git a/vendor/github.com/prometheus/procfs/internal/util/valueparser.go b/vendor/github.com/prometheus/procfs/internal/util/valueparser.go index ac93cb42..fe2355d3 100644 --- a/vendor/github.com/prometheus/procfs/internal/util/valueparser.go +++ b/vendor/github.com/prometheus/procfs/internal/util/valueparser.go @@ -33,6 +33,9 @@ func NewValueParser(v string) *ValueParser { return &ValueParser{v: v} } +// Int interprets the underlying value as an int and returns that value. +func (vp *ValueParser) Int() int { return int(vp.int64()) } + // PInt64 interprets the underlying value as an int64 and returns a pointer to // that value. func (vp *ValueParser) PInt64() *int64 { @@ -40,16 +43,27 @@ func (vp *ValueParser) PInt64() *int64 { return nil } + v := vp.int64() + return &v +} + +// int64 interprets the underlying value as an int64 and returns that value. +// TODO: export if/when necessary. +func (vp *ValueParser) int64() int64 { + if vp.err != nil { + return 0 + } + // A base value of zero makes ParseInt infer the correct base using the // string's prefix, if any. const base = 0 v, err := strconv.ParseInt(vp.v, base, 64) if err != nil { vp.err = err - return nil + return 0 } - return &v + return v } // PUInt64 interprets the underlying value as an uint64 and returns a pointer to diff --git a/vendor/github.com/prometheus/procfs/ipvs.go b/vendor/github.com/prometheus/procfs/ipvs.go index 2d6cb8d1..89e44774 100644 --- a/vendor/github.com/prometheus/procfs/ipvs.go +++ b/vendor/github.com/prometheus/procfs/ipvs.go @@ -15,6 +15,7 @@ package procfs import ( "bufio" + "bytes" "encoding/hex" "errors" "fmt" @@ -24,6 +25,8 @@ import ( "os" "strconv" "strings" + + "github.com/prometheus/procfs/internal/util" ) // IPVSStats holds IPVS statistics, as exposed by the kernel in `/proc/net/ip_vs_stats`. @@ -64,17 +67,16 @@ type IPVSBackendStatus struct { // IPVSStats reads the IPVS statistics from the specified `proc` filesystem. func (fs FS) IPVSStats() (IPVSStats, error) { - file, err := os.Open(fs.proc.Path("net/ip_vs_stats")) + data, err := util.ReadFileNoStat(fs.proc.Path("net/ip_vs_stats")) if err != nil { return IPVSStats{}, err } - defer file.Close() - return parseIPVSStats(file) + return parseIPVSStats(bytes.NewReader(data)) } // parseIPVSStats performs the actual parsing of `ip_vs_stats`. -func parseIPVSStats(file io.Reader) (IPVSStats, error) { +func parseIPVSStats(r io.Reader) (IPVSStats, error) { var ( statContent []byte statLines []string @@ -82,7 +84,7 @@ func parseIPVSStats(file io.Reader) (IPVSStats, error) { stats IPVSStats ) - statContent, err := ioutil.ReadAll(file) + statContent, err := ioutil.ReadAll(r) if err != nil { return IPVSStats{}, err } diff --git a/vendor/github.com/prometheus/procfs/meminfo.go b/vendor/github.com/prometheus/procfs/meminfo.go new file mode 100644 index 00000000..50dab4bc --- /dev/null +++ b/vendor/github.com/prometheus/procfs/meminfo.go @@ -0,0 +1,277 @@ +// Copyright 2019 The Prometheus Authors +// 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. + +package procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Meminfo represents memory statistics. +type Meminfo struct { + // Total usable ram (i.e. physical ram minus a few reserved + // bits and the kernel binary code) + MemTotal uint64 + // The sum of LowFree+HighFree + MemFree uint64 + // An estimate of how much memory is available for starting + // new applications, without swapping. Calculated from + // MemFree, SReclaimable, the size of the file LRU lists, and + // the low watermarks in each zone. The estimate takes into + // account that the system needs some page cache to function + // well, and that not all reclaimable slab will be + // reclaimable, due to items being in use. The impact of those + // factors will vary from system to system. + MemAvailable uint64 + // Relatively temporary storage for raw disk blocks shouldn't + // get tremendously large (20MB or so) + Buffers uint64 + Cached uint64 + // Memory that once was swapped out, is swapped back in but + // still also is in the swapfile (if memory is needed it + // doesn't need to be swapped out AGAIN because it is already + // in the swapfile. This saves I/O) + SwapCached uint64 + // Memory that has been used more recently and usually not + // reclaimed unless absolutely necessary. + Active uint64 + // Memory which has been less recently used. It is more + // eligible to be reclaimed for other purposes + Inactive uint64 + ActiveAnon uint64 + InactiveAnon uint64 + ActiveFile uint64 + InactiveFile uint64 + Unevictable uint64 + Mlocked uint64 + // total amount of swap space available + SwapTotal uint64 + // Memory which has been evicted from RAM, and is temporarily + // on the disk + SwapFree uint64 + // Memory which is waiting to get written back to the disk + Dirty uint64 + // Memory which is actively being written back to the disk + Writeback uint64 + // Non-file backed pages mapped into userspace page tables + AnonPages uint64 + // files which have been mapped, such as libraries + Mapped uint64 + Shmem uint64 + // in-kernel data structures cache + Slab uint64 + // Part of Slab, that might be reclaimed, such as caches + SReclaimable uint64 + // Part of Slab, that cannot be reclaimed on memory pressure + SUnreclaim uint64 + KernelStack uint64 + // amount of memory dedicated to the lowest level of page + // tables. + PageTables uint64 + // NFS pages sent to the server, but not yet committed to + // stable storage + NFSUnstable uint64 + // Memory used for block device "bounce buffers" + Bounce uint64 + // Memory used by FUSE for temporary writeback buffers + WritebackTmp uint64 + // Based on the overcommit ratio ('vm.overcommit_ratio'), + // this is the total amount of memory currently available to + // be allocated on the system. This limit is only adhered to + // if strict overcommit accounting is enabled (mode 2 in + // 'vm.overcommit_memory'). + // The CommitLimit is calculated with the following formula: + // CommitLimit = ([total RAM pages] - [total huge TLB pages]) * + // overcommit_ratio / 100 + [total swap pages] + // For example, on a system with 1G of physical RAM and 7G + // of swap with a `vm.overcommit_ratio` of 30 it would + // yield a CommitLimit of 7.3G. + // For more details, see the memory overcommit documentation + // in vm/overcommit-accounting. + CommitLimit uint64 + // The amount of memory presently allocated on the system. + // The committed memory is a sum of all of the memory which + // has been allocated by processes, even if it has not been + // "used" by them as of yet. A process which malloc()'s 1G + // of memory, but only touches 300M of it will show up as + // using 1G. This 1G is memory which has been "committed" to + // by the VM and can be used at any time by the allocating + // application. With strict overcommit enabled on the system + // (mode 2 in 'vm.overcommit_memory'),allocations which would + // exceed the CommitLimit (detailed above) will not be permitted. + // This is useful if one needs to guarantee that processes will + // not fail due to lack of memory once that memory has been + // successfully allocated. + CommittedAS uint64 + // total size of vmalloc memory area + VmallocTotal uint64 + // amount of vmalloc area which is used + VmallocUsed uint64 + // largest contiguous block of vmalloc area which is free + VmallocChunk uint64 + HardwareCorrupted uint64 + AnonHugePages uint64 + ShmemHugePages uint64 + ShmemPmdMapped uint64 + CmaTotal uint64 + CmaFree uint64 + HugePagesTotal uint64 + HugePagesFree uint64 + HugePagesRsvd uint64 + HugePagesSurp uint64 + Hugepagesize uint64 + DirectMap4k uint64 + DirectMap2M uint64 + DirectMap1G uint64 +} + +// Meminfo returns an information about current kernel/system memory statistics. +// See https://www.kernel.org/doc/Documentation/filesystems/proc.txt +func (fs FS) Meminfo() (Meminfo, error) { + b, err := util.ReadFileNoStat(fs.proc.Path("meminfo")) + if err != nil { + return Meminfo{}, err + } + + m, err := parseMemInfo(bytes.NewReader(b)) + if err != nil { + return Meminfo{}, fmt.Errorf("failed to parse meminfo: %v", err) + } + + return *m, nil +} + +func parseMemInfo(r io.Reader) (*Meminfo, error) { + var m Meminfo + s := bufio.NewScanner(r) + for s.Scan() { + // Each line has at least a name and value; we ignore the unit. + fields := strings.Fields(s.Text()) + if len(fields) < 2 { + return nil, fmt.Errorf("malformed meminfo line: %q", s.Text()) + } + + v, err := strconv.ParseUint(fields[1], 0, 64) + if err != nil { + return nil, err + } + + switch fields[0] { + case "MemTotal:": + m.MemTotal = v + case "MemFree:": + m.MemFree = v + case "MemAvailable:": + m.MemAvailable = v + case "Buffers:": + m.Buffers = v + case "Cached:": + m.Cached = v + case "SwapCached:": + m.SwapCached = v + case "Active:": + m.Active = v + case "Inactive:": + m.Inactive = v + case "Active(anon):": + m.ActiveAnon = v + case "Inactive(anon):": + m.InactiveAnon = v + case "Active(file):": + m.ActiveFile = v + case "Inactive(file):": + m.InactiveFile = v + case "Unevictable:": + m.Unevictable = v + case "Mlocked:": + m.Mlocked = v + case "SwapTotal:": + m.SwapTotal = v + case "SwapFree:": + m.SwapFree = v + case "Dirty:": + m.Dirty = v + case "Writeback:": + m.Writeback = v + case "AnonPages:": + m.AnonPages = v + case "Mapped:": + m.Mapped = v + case "Shmem:": + m.Shmem = v + case "Slab:": + m.Slab = v + case "SReclaimable:": + m.SReclaimable = v + case "SUnreclaim:": + m.SUnreclaim = v + case "KernelStack:": + m.KernelStack = v + case "PageTables:": + m.PageTables = v + case "NFS_Unstable:": + m.NFSUnstable = v + case "Bounce:": + m.Bounce = v + case "WritebackTmp:": + m.WritebackTmp = v + case "CommitLimit:": + m.CommitLimit = v + case "Committed_AS:": + m.CommittedAS = v + case "VmallocTotal:": + m.VmallocTotal = v + case "VmallocUsed:": + m.VmallocUsed = v + case "VmallocChunk:": + m.VmallocChunk = v + case "HardwareCorrupted:": + m.HardwareCorrupted = v + case "AnonHugePages:": + m.AnonHugePages = v + case "ShmemHugePages:": + m.ShmemHugePages = v + case "ShmemPmdMapped:": + m.ShmemPmdMapped = v + case "CmaTotal:": + m.CmaTotal = v + case "CmaFree:": + m.CmaFree = v + case "HugePages_Total:": + m.HugePagesTotal = v + case "HugePages_Free:": + m.HugePagesFree = v + case "HugePages_Rsvd:": + m.HugePagesRsvd = v + case "HugePages_Surp:": + m.HugePagesSurp = v + case "Hugepagesize:": + m.Hugepagesize = v + case "DirectMap4k:": + m.DirectMap4k = v + case "DirectMap2M:": + m.DirectMap2M = v + case "DirectMap1G:": + m.DirectMap1G = v + } + } + + return &m, nil +} diff --git a/vendor/github.com/prometheus/procfs/mountinfo.go b/vendor/github.com/prometheus/procfs/mountinfo.go index 61fa6188..bb01bb5a 100644 --- a/vendor/github.com/prometheus/procfs/mountinfo.go +++ b/vendor/github.com/prometheus/procfs/mountinfo.go @@ -15,19 +15,13 @@ package procfs import ( "bufio" + "bytes" "fmt" - "io" - "os" "strconv" "strings" -) -var validOptionalFields = map[string]bool{ - "shared": true, - "master": true, - "propagate_from": true, - "unbindable": true, -} + "github.com/prometheus/procfs/internal/util" +) // A MountInfo is a type that describes the details, options // for each mount, parsed from /proc/self/mountinfo. @@ -58,18 +52,10 @@ type MountInfo struct { SuperOptions map[string]string } -// Returns part of the mountinfo line, if it exists, else an empty string. -func getStringSliceElement(parts []string, idx int, defaultValue string) string { - if idx >= len(parts) { - return defaultValue - } - return parts[idx] -} - // Reads each line of the mountinfo file, and returns a list of formatted MountInfo structs. -func parseMountInfo(r io.Reader) ([]*MountInfo, error) { +func parseMountInfo(info []byte) ([]*MountInfo, error) { mounts := []*MountInfo{} - scanner := bufio.NewScanner(r) + scanner := bufio.NewScanner(bytes.NewReader(info)) for scanner.Scan() { mountString := scanner.Text() parsedMounts, err := parseMountInfoString(mountString) @@ -89,57 +75,75 @@ func parseMountInfo(r io.Reader) ([]*MountInfo, error) { func parseMountInfoString(mountString string) (*MountInfo, error) { var err error - // OptionalFields can be zero, hence these checks to ensure we do not populate the wrong values in the wrong spots - separatorIndex := strings.Index(mountString, "-") - if separatorIndex == -1 { - return nil, fmt.Errorf("no separator found in mountinfo string: %s", mountString) + mountInfo := strings.Split(mountString, " ") + mountInfoLength := len(mountInfo) + if mountInfoLength < 11 { + return nil, fmt.Errorf("couldn't find enough fields in mount string: %s", mountString) } - beforeFields := strings.Fields(mountString[:separatorIndex]) - afterFields := strings.Fields(mountString[separatorIndex+1:]) - if (len(beforeFields) + len(afterFields)) < 7 { - return nil, fmt.Errorf("too few fields") + + if mountInfo[mountInfoLength-4] != "-" { + return nil, fmt.Errorf("couldn't find separator in expected field: %s", mountInfo[mountInfoLength-4]) } mount := &MountInfo{ - MajorMinorVer: getStringSliceElement(beforeFields, 2, ""), - Root: getStringSliceElement(beforeFields, 3, ""), - MountPoint: getStringSliceElement(beforeFields, 4, ""), - Options: mountOptionsParser(getStringSliceElement(beforeFields, 5, "")), + MajorMinorVer: mountInfo[2], + Root: mountInfo[3], + MountPoint: mountInfo[4], + Options: mountOptionsParser(mountInfo[5]), OptionalFields: nil, - FSType: getStringSliceElement(afterFields, 0, ""), - Source: getStringSliceElement(afterFields, 1, ""), - SuperOptions: mountOptionsParser(getStringSliceElement(afterFields, 2, "")), + FSType: mountInfo[mountInfoLength-3], + Source: mountInfo[mountInfoLength-2], + SuperOptions: mountOptionsParser(mountInfo[mountInfoLength-1]), } - mount.MountId, err = strconv.Atoi(getStringSliceElement(beforeFields, 0, "")) + mount.MountId, err = strconv.Atoi(mountInfo[0]) if err != nil { return nil, fmt.Errorf("failed to parse mount ID") } - mount.ParentId, err = strconv.Atoi(getStringSliceElement(beforeFields, 1, "")) + mount.ParentId, err = strconv.Atoi(mountInfo[1]) if err != nil { return nil, fmt.Errorf("failed to parse parent ID") } // Has optional fields, which is a space separated list of values. // Example: shared:2 master:7 - if len(beforeFields) > 6 { - mount.OptionalFields = make(map[string]string) - optionalFields := beforeFields[6:] - for _, field := range optionalFields { - optionSplit := strings.Split(field, ":") - target, value := optionSplit[0], "" - if len(optionSplit) == 2 { - value = optionSplit[1] - } - // Checks if the 'keys' in the optional fields in the mountinfo line are acceptable. - // Allowed 'keys' are shared, master, propagate_from, unbindable. - if _, ok := validOptionalFields[target]; ok { - mount.OptionalFields[target] = value - } + if mountInfo[6] != "" { + mount.OptionalFields, err = mountOptionsParseOptionalFields(mountInfo[6 : mountInfoLength-4]) + if err != nil { + return nil, err } } return mount, nil } +// mountOptionsIsValidField checks a string against a valid list of optional fields keys. +func mountOptionsIsValidField(s string) bool { + switch s { + case + "shared", + "master", + "propagate_from", + "unbindable": + return true + } + return false +} + +// mountOptionsParseOptionalFields parses a list of optional fields strings into a double map of strings. +func mountOptionsParseOptionalFields(o []string) (map[string]string, error) { + optionalFields := make(map[string]string) + for _, field := range o { + optionSplit := strings.SplitN(field, ":", 2) + value := "" + if len(optionSplit) == 2 { + value = optionSplit[1] + } + if mountOptionsIsValidField(optionSplit[0]) { + optionalFields[optionSplit[0]] = value + } + } + return optionalFields, nil +} + // Parses the mount options, superblock options. func mountOptionsParser(mountOptions string) map[string]string { opts := make(map[string]string) @@ -159,20 +163,18 @@ func mountOptionsParser(mountOptions string) map[string]string { // Retrieves mountinfo information from `/proc/self/mountinfo`. func GetMounts() ([]*MountInfo, error) { - f, err := os.Open("/proc/self/mountinfo") + data, err := util.ReadFileNoStat("/proc/self/mountinfo") if err != nil { return nil, err } - defer f.Close() - return parseMountInfo(f) + return parseMountInfo(data) } // Retrieves mountinfo information from a processes' `/proc//mountinfo`. func GetProcMounts(pid int) ([]*MountInfo, error) { - f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid)) + data, err := util.ReadFileNoStat(fmt.Sprintf("/proc/%d/mountinfo", pid)) if err != nil { return nil, err } - defer f.Close() - return parseMountInfo(f) + return parseMountInfo(data) } diff --git a/vendor/github.com/prometheus/procfs/net_dev.go b/vendor/github.com/prometheus/procfs/net_dev.go index a0b7a011..47a710be 100644 --- a/vendor/github.com/prometheus/procfs/net_dev.go +++ b/vendor/github.com/prometheus/procfs/net_dev.go @@ -183,7 +183,6 @@ func (netDev NetDev) Total() NetDevLine { names = append(names, ifc.Name) total.RxBytes += ifc.RxBytes total.RxPackets += ifc.RxPackets - total.RxPackets += ifc.RxPackets total.RxErrors += ifc.RxErrors total.RxDropped += ifc.RxDropped total.RxFIFO += ifc.RxFIFO diff --git a/vendor/github.com/prometheus/procfs/net_sockstat.go b/vendor/github.com/prometheus/procfs/net_sockstat.go new file mode 100644 index 00000000..f91ef552 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_sockstat.go @@ -0,0 +1,163 @@ +// Copyright 2019 The Prometheus Authors +// 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. + +package procfs + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// A NetSockstat contains the output of /proc/net/sockstat{,6} for IPv4 or IPv6, +// respectively. +type NetSockstat struct { + // Used is non-nil for IPv4 sockstat results, but nil for IPv6. + Used *int + Protocols []NetSockstatProtocol +} + +// A NetSockstatProtocol contains statistics about a given socket protocol. +// Pointer fields indicate that the value may or may not be present on any +// given protocol. +type NetSockstatProtocol struct { + Protocol string + InUse int + Orphan *int + TW *int + Alloc *int + Mem *int + Memory *int +} + +// NetSockstat retrieves IPv4 socket statistics. +func (fs FS) NetSockstat() (*NetSockstat, error) { + return readSockstat(fs.proc.Path("net", "sockstat")) +} + +// NetSockstat6 retrieves IPv6 socket statistics. +// +// If IPv6 is disabled on this kernel, the returned error can be checked with +// os.IsNotExist. +func (fs FS) NetSockstat6() (*NetSockstat, error) { + return readSockstat(fs.proc.Path("net", "sockstat6")) +} + +// readSockstat opens and parses a NetSockstat from the input file. +func readSockstat(name string) (*NetSockstat, error) { + // This file is small and can be read with one syscall. + b, err := util.ReadFileNoStat(name) + if err != nil { + // Do not wrap this error so the caller can detect os.IsNotExist and + // similar conditions. + return nil, err + } + + stat, err := parseSockstat(bytes.NewReader(b)) + if err != nil { + return nil, fmt.Errorf("failed to read sockstats from %q: %v", name, err) + } + + return stat, nil +} + +// parseSockstat reads the contents of a sockstat file and parses a NetSockstat. +func parseSockstat(r io.Reader) (*NetSockstat, error) { + var stat NetSockstat + s := bufio.NewScanner(r) + for s.Scan() { + // Expect a minimum of a protocol and one key/value pair. + fields := strings.Split(s.Text(), " ") + if len(fields) < 3 { + return nil, fmt.Errorf("malformed sockstat line: %q", s.Text()) + } + + // The remaining fields are key/value pairs. + kvs, err := parseSockstatKVs(fields[1:]) + if err != nil { + return nil, fmt.Errorf("error parsing sockstat key/value pairs from %q: %v", s.Text(), err) + } + + // The first field is the protocol. We must trim its colon suffix. + proto := strings.TrimSuffix(fields[0], ":") + switch proto { + case "sockets": + // Special case: IPv4 has a sockets "used" key/value pair that we + // embed at the top level of the structure. + used := kvs["used"] + stat.Used = &used + default: + // Parse all other lines as individual protocols. + nsp := parseSockstatProtocol(kvs) + nsp.Protocol = proto + stat.Protocols = append(stat.Protocols, nsp) + } + } + + if err := s.Err(); err != nil { + return nil, err + } + + return &stat, nil +} + +// parseSockstatKVs parses a string slice into a map of key/value pairs. +func parseSockstatKVs(kvs []string) (map[string]int, error) { + if len(kvs)%2 != 0 { + return nil, errors.New("odd number of fields in key/value pairs") + } + + // Iterate two values at a time to gather key/value pairs. + out := make(map[string]int, len(kvs)/2) + for i := 0; i < len(kvs); i += 2 { + vp := util.NewValueParser(kvs[i+1]) + out[kvs[i]] = vp.Int() + + if err := vp.Err(); err != nil { + return nil, err + } + } + + return out, nil +} + +// parseSockstatProtocol parses a NetSockstatProtocol from the input kvs map. +func parseSockstatProtocol(kvs map[string]int) NetSockstatProtocol { + var nsp NetSockstatProtocol + for k, v := range kvs { + // Capture the range variable to ensure we get unique pointers for + // each of the optional fields. + v := v + switch k { + case "inuse": + nsp.InUse = v + case "orphan": + nsp.Orphan = &v + case "tw": + nsp.TW = &v + case "alloc": + nsp.Alloc = &v + case "mem": + nsp.Mem = &v + case "memory": + nsp.Memory = &v + } + } + + return nsp +} diff --git a/vendor/github.com/prometheus/procfs/net_unix.go b/vendor/github.com/prometheus/procfs/net_unix.go index 240340a8..93bd58f8 100644 --- a/vendor/github.com/prometheus/procfs/net_unix.go +++ b/vendor/github.com/prometheus/procfs/net_unix.go @@ -207,10 +207,6 @@ func (u NetUnix) parseUsers(hexStr string) (uint64, error) { return strconv.ParseUint(hexStr, 16, 32) } -func (u NetUnix) parseProtocol(hexStr string) (uint64, error) { - return strconv.ParseUint(hexStr, 16, 32) -} - func (u NetUnix) parseType(hexStr string) (NetUnixType, error) { typ, err := strconv.ParseUint(hexStr, 16, 16) if err != nil { diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/prometheus/procfs/proc.go index b7c79cf7..330e472c 100644 --- a/vendor/github.com/prometheus/procfs/proc.go +++ b/vendor/github.com/prometheus/procfs/proc.go @@ -22,6 +22,7 @@ import ( "strings" "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" ) // Proc provides information about a running process. @@ -121,13 +122,7 @@ func (fs FS) AllProcs() (Procs, error) { // CmdLine returns the command line of a process. func (p Proc) CmdLine() ([]string, error) { - f, err := os.Open(p.path("cmdline")) - if err != nil { - return nil, err - } - defer f.Close() - - data, err := ioutil.ReadAll(f) + data, err := util.ReadFileNoStat(p.path("cmdline")) if err != nil { return nil, err } @@ -141,13 +136,7 @@ func (p Proc) CmdLine() ([]string, error) { // Comm returns the command name of a process. func (p Proc) Comm() (string, error) { - f, err := os.Open(p.path("comm")) - if err != nil { - return "", err - } - defer f.Close() - - data, err := ioutil.ReadAll(f) + data, err := util.ReadFileNoStat(p.path("comm")) if err != nil { return "", err } @@ -252,13 +241,11 @@ func (p Proc) MountStats() ([]*Mount, error) { // It supplies information missing in `/proc/self/mounts` and // fixes various other problems with that file too. func (p Proc) MountInfo() ([]*MountInfo, error) { - f, err := os.Open(p.path("mountinfo")) + data, err := util.ReadFileNoStat(p.path("mountinfo")) if err != nil { return nil, err } - defer f.Close() - - return parseMountInfo(f) + return parseMountInfo(data) } func (p Proc) fileDescriptors() ([]string, error) { diff --git a/vendor/github.com/prometheus/procfs/proc_environ.go b/vendor/github.com/prometheus/procfs/proc_environ.go index 7172bb58..6134b358 100644 --- a/vendor/github.com/prometheus/procfs/proc_environ.go +++ b/vendor/github.com/prometheus/procfs/proc_environ.go @@ -14,22 +14,16 @@ package procfs import ( - "io/ioutil" - "os" "strings" + + "github.com/prometheus/procfs/internal/util" ) // Environ reads process environments from /proc//environ func (p Proc) Environ() ([]string, error) { environments := make([]string, 0) - f, err := os.Open(p.path("environ")) - if err != nil { - return environments, err - } - defer f.Close() - - data, err := ioutil.ReadAll(f) + data, err := util.ReadFileNoStat(p.path("environ")) if err != nil { return environments, err } diff --git a/vendor/github.com/prometheus/procfs/proc_fdinfo.go b/vendor/github.com/prometheus/procfs/proc_fdinfo.go index 83b67d1b..4e7597f8 100644 --- a/vendor/github.com/prometheus/procfs/proc_fdinfo.go +++ b/vendor/github.com/prometheus/procfs/proc_fdinfo.go @@ -15,11 +15,10 @@ package procfs import ( "bufio" - "fmt" - "io/ioutil" - "os" + "bytes" "regexp" - "strings" + + "github.com/prometheus/procfs/internal/util" ) // Regexp variables @@ -46,21 +45,15 @@ type ProcFDInfo struct { // FDInfo constructor. On kernels older than 3.8, InotifyInfos will always be empty. func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) { - f, err := os.Open(p.path("fdinfo", fd)) + data, err := util.ReadFileNoStat(p.path("fdinfo", fd)) if err != nil { return nil, err } - defer f.Close() - - fdinfo, err := ioutil.ReadAll(f) - if err != nil { - return nil, fmt.Errorf("could not read %s: %s", f.Name(), err) - } var text, pos, flags, mntid string var inotify []InotifyInfo - scanner := bufio.NewScanner(strings.NewReader(string(fdinfo))) + scanner := bufio.NewScanner(bytes.NewReader(data)) for scanner.Scan() { text = scanner.Text() if rPos.MatchString(text) { diff --git a/vendor/github.com/prometheus/procfs/proc_io.go b/vendor/github.com/prometheus/procfs/proc_io.go index 0ff89b1c..776f3497 100644 --- a/vendor/github.com/prometheus/procfs/proc_io.go +++ b/vendor/github.com/prometheus/procfs/proc_io.go @@ -15,8 +15,8 @@ package procfs import ( "fmt" - "io/ioutil" - "os" + + "github.com/prometheus/procfs/internal/util" ) // ProcIO models the content of /proc//io. @@ -43,13 +43,7 @@ type ProcIO struct { func (p Proc) IO() (ProcIO, error) { pio := ProcIO{} - f, err := os.Open(p.path("io")) - if err != nil { - return pio, err - } - defer f.Close() - - data, err := ioutil.ReadAll(f) + data, err := util.ReadFileNoStat(p.path("io")) if err != nil { return pio, err } diff --git a/vendor/github.com/prometheus/procfs/proc_psi.go b/vendor/github.com/prometheus/procfs/proc_psi.go index 46fe2662..0d7bee54 100644 --- a/vendor/github.com/prometheus/procfs/proc_psi.go +++ b/vendor/github.com/prometheus/procfs/proc_psi.go @@ -24,11 +24,13 @@ package procfs // > full avg10=0.00 avg60=0.13 avg300=0.96 total=8183134 import ( + "bufio" + "bytes" "fmt" "io" - "io/ioutil" - "os" "strings" + + "github.com/prometheus/procfs/internal/util" ) const lineFormat = "avg10=%f avg60=%f avg300=%f total=%d" @@ -55,24 +57,21 @@ type PSIStats struct { // resource from /proc/pressure/. At time of writing this can be // either "cpu", "memory" or "io". func (fs FS) PSIStatsForResource(resource string) (PSIStats, error) { - file, err := os.Open(fs.proc.Path(fmt.Sprintf("%s/%s", "pressure", resource))) + data, err := util.ReadFileNoStat(fs.proc.Path(fmt.Sprintf("%s/%s", "pressure", resource))) if err != nil { return PSIStats{}, fmt.Errorf("psi_stats: unavailable for %s", resource) } - defer file.Close() - return parsePSIStats(resource, file) + return parsePSIStats(resource, bytes.NewReader(data)) } // parsePSIStats parses the specified file for pressure stall information -func parsePSIStats(resource string, file io.Reader) (PSIStats, error) { +func parsePSIStats(resource string, r io.Reader) (PSIStats, error) { psiStats := PSIStats{} - stats, err := ioutil.ReadAll(file) - if err != nil { - return psiStats, fmt.Errorf("psi_stats: unable to read data for %s", resource) - } - for _, l := range strings.Split(string(stats), "\n") { + scanner := bufio.NewScanner(r) + for scanner.Scan() { + l := scanner.Text() prefix := strings.Split(l, " ")[0] switch prefix { case "some": diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/prometheus/procfs/proc_stat.go index dbde1fa0..4517d2e9 100644 --- a/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/vendor/github.com/prometheus/procfs/proc_stat.go @@ -16,10 +16,10 @@ package procfs import ( "bytes" "fmt" - "io/ioutil" "os" "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" ) // Originally, this USER_HZ value was dynamically retrieved via a sysconf call @@ -113,13 +113,7 @@ func (p Proc) NewStat() (ProcStat, error) { // Stat returns the current status information of the process. func (p Proc) Stat() (ProcStat, error) { - f, err := os.Open(p.path("stat")) - if err != nil { - return ProcStat{}, err - } - defer f.Close() - - data, err := ioutil.ReadAll(f) + data, err := util.ReadFileNoStat(p.path("stat")) if err != nil { return ProcStat{}, err } diff --git a/vendor/github.com/prometheus/procfs/proc_status.go b/vendor/github.com/prometheus/procfs/proc_status.go index ad290fae..e30c2b88 100644 --- a/vendor/github.com/prometheus/procfs/proc_status.go +++ b/vendor/github.com/prometheus/procfs/proc_status.go @@ -15,10 +15,10 @@ package procfs import ( "bytes" - "io/ioutil" - "os" "strconv" "strings" + + "github.com/prometheus/procfs/internal/util" ) // ProcStatus provides status information about the process, @@ -75,13 +75,7 @@ type ProcStatus struct { // NewStatus returns the current status information of the process. func (p Proc) NewStatus() (ProcStatus, error) { - f, err := os.Open(p.path("status")) - if err != nil { - return ProcStatus{}, err - } - defer f.Close() - - data, err := ioutil.ReadAll(f) + data, err := util.ReadFileNoStat(p.path("status")) if err != nil { return ProcStatus{}, err } diff --git a/vendor/github.com/prometheus/procfs/stat.go b/vendor/github.com/prometheus/procfs/stat.go index 6661ee03..b2a6fc99 100644 --- a/vendor/github.com/prometheus/procfs/stat.go +++ b/vendor/github.com/prometheus/procfs/stat.go @@ -15,13 +15,14 @@ package procfs import ( "bufio" + "bytes" "fmt" "io" - "os" "strconv" "strings" "github.com/prometheus/procfs/internal/fs" + "github.com/prometheus/procfs/internal/util" ) // CPUStat shows how much time the cpu spend in various stages. @@ -164,16 +165,15 @@ func (fs FS) NewStat() (Stat, error) { // Stat returns information about current cpu/process statistics. // See https://www.kernel.org/doc/Documentation/filesystems/proc.txt func (fs FS) Stat() (Stat, error) { - - f, err := os.Open(fs.proc.Path("stat")) + fileName := fs.proc.Path("stat") + data, err := util.ReadFileNoStat(fileName) if err != nil { return Stat{}, err } - defer f.Close() stat := Stat{} - scanner := bufio.NewScanner(f) + scanner := bufio.NewScanner(bytes.NewReader(data)) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(scanner.Text()) @@ -237,7 +237,7 @@ func (fs FS) Stat() (Stat, error) { } if err := scanner.Err(); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s: %s", f.Name(), err) + return Stat{}, fmt.Errorf("couldn't parse %s: %s", fileName, err) } return stat, nil diff --git a/vendor/github.com/prometheus/procfs/ttar b/vendor/github.com/prometheus/procfs/ttar deleted file mode 100755 index 19ef02b8..00000000 --- a/vendor/github.com/prometheus/procfs/ttar +++ /dev/null @@ -1,413 +0,0 @@ -#!/usr/bin/env bash - -# Purpose: plain text tar format -# Limitations: - only suitable for text files, directories, and symlinks -# - stores only filename, content, and mode -# - not designed for untrusted input -# -# Note: must work with bash version 3.2 (macOS) - -# Copyright 2017 Roger Luethi -# -# 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. - -set -o errexit -o nounset - -# Sanitize environment (for instance, standard sorting of glob matches) -export LC_ALL=C - -path="" -CMD="" -ARG_STRING="$*" - -#------------------------------------------------------------------------------ -# Not all sed implementations can work on null bytes. In order to make ttar -# work out of the box on macOS, use Python as a stream editor. - -USE_PYTHON=0 - -PYTHON_CREATE_FILTER=$(cat << 'PCF' -#!/usr/bin/env python - -import re -import sys - -for line in sys.stdin: - line = re.sub(r'EOF', r'\EOF', line) - line = re.sub(r'NULLBYTE', r'\NULLBYTE', line) - line = re.sub('\x00', r'NULLBYTE', line) - sys.stdout.write(line) -PCF -) - -PYTHON_EXTRACT_FILTER=$(cat << 'PEF' -#!/usr/bin/env python - -import re -import sys - -for line in sys.stdin: - line = re.sub(r'(?/dev/null; then - echo "ERROR Python not found. Aborting." - exit 2 - fi - USE_PYTHON=1 - fi -} - -#------------------------------------------------------------------------------ - -function usage { - bname=$(basename "$0") - cat << USAGE -Usage: $bname [-C ] -c -f (create archive) - $bname -t -f (list archive contents) - $bname [-C ] -x -f (extract archive) - -Options: - -C (change directory) - -v (verbose) - --recursive-unlink (recursively delete existing directory if path - collides with file or directory to extract) - -Example: Change to sysfs directory, create ttar file from fixtures directory - $bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/ -USAGE -exit "$1" -} - -function vecho { - if [ "${VERBOSE:-}" == "yes" ]; then - echo >&7 "$@" - fi -} - -function set_cmd { - if [ -n "$CMD" ]; then - echo "ERROR: more than one command given" - echo - usage 2 - fi - CMD=$1 -} - -unset VERBOSE -unset RECURSIVE_UNLINK - -while getopts :cf:-:htxvC: opt; do - case $opt in - c) - set_cmd "create" - ;; - f) - ARCHIVE=$OPTARG - ;; - h) - usage 0 - ;; - t) - set_cmd "list" - ;; - x) - set_cmd "extract" - ;; - v) - VERBOSE=yes - exec 7>&1 - ;; - C) - CDIR=$OPTARG - ;; - -) - case $OPTARG in - recursive-unlink) - RECURSIVE_UNLINK="yes" - ;; - *) - echo -e "Error: invalid option -$OPTARG" - echo - usage 1 - ;; - esac - ;; - *) - echo >&2 "ERROR: invalid option -$OPTARG" - echo - usage 1 - ;; - esac -done - -# Remove processed options from arguments -shift $(( OPTIND - 1 )); - -if [ "${CMD:-}" == "" ]; then - echo >&2 "ERROR: no command given" - echo - usage 1 -elif [ "${ARCHIVE:-}" == "" ]; then - echo >&2 "ERROR: no archive name given" - echo - usage 1 -fi - -function list { - local path="" - local size=0 - local line_no=0 - local ttar_file=$1 - if [ -n "${2:-}" ]; then - echo >&2 "ERROR: too many arguments." - echo - usage 1 - fi - if [ ! -e "$ttar_file" ]; then - echo >&2 "ERROR: file not found ($ttar_file)" - echo - usage 1 - fi - while read -r line; do - line_no=$(( line_no + 1 )) - if [ $size -gt 0 ]; then - size=$(( size - 1 )) - continue - fi - if [[ $line =~ ^Path:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - elif [[ $line =~ ^Lines:\ (.*)$ ]]; then - size=${BASH_REMATCH[1]} - echo "$path" - elif [[ $line =~ ^Directory:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - echo "$path/" - elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then - echo "$path -> ${BASH_REMATCH[1]}" - fi - done < "$ttar_file" -} - -function extract { - local path="" - local size=0 - local line_no=0 - local ttar_file=$1 - if [ -n "${2:-}" ]; then - echo >&2 "ERROR: too many arguments." - echo - usage 1 - fi - if [ ! -e "$ttar_file" ]; then - echo >&2 "ERROR: file not found ($ttar_file)" - echo - usage 1 - fi - while IFS= read -r line; do - line_no=$(( line_no + 1 )) - local eof_without_newline - if [ "$size" -gt 0 ]; then - if [[ "$line" =~ [^\\]EOF ]]; then - # An EOF not preceded by a backslash indicates that the line - # does not end with a newline - eof_without_newline=1 - else - eof_without_newline=0 - fi - # Replace NULLBYTE with null byte if at beginning of line - # Replace NULLBYTE with null byte unless preceded by backslash - # Remove one backslash in front of NULLBYTE (if any) - # Remove EOF unless preceded by backslash - # Remove one backslash in front of EOF - if [ $USE_PYTHON -eq 1 ]; then - echo -n "$line" | python -c "$PYTHON_EXTRACT_FILTER" >> "$path" - else - # The repeated pattern makes up for sed's lack of negative - # lookbehind assertions (for consecutive null bytes). - echo -n "$line" | \ - sed -e 's/^NULLBYTE/\x0/g; - s/\([^\\]\)NULLBYTE/\1\x0/g; - s/\([^\\]\)NULLBYTE/\1\x0/g; - s/\\NULLBYTE/NULLBYTE/g; - s/\([^\\]\)EOF/\1/g; - s/\\EOF/EOF/g; - ' >> "$path" - fi - if [[ "$eof_without_newline" -eq 0 ]]; then - echo >> "$path" - fi - size=$(( size - 1 )) - continue - fi - if [[ $line =~ ^Path:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - if [ -L "$path" ]; then - rm "$path" - elif [ -d "$path" ]; then - if [ "${RECURSIVE_UNLINK:-}" == "yes" ]; then - rm -r "$path" - else - # Safe because symlinks to directories are dealt with above - rmdir "$path" - fi - elif [ -e "$path" ]; then - rm "$path" - fi - elif [[ $line =~ ^Lines:\ (.*)$ ]]; then - size=${BASH_REMATCH[1]} - # Create file even if it is zero-length. - touch "$path" - vecho " $path" - elif [[ $line =~ ^Mode:\ (.*)$ ]]; then - mode=${BASH_REMATCH[1]} - chmod "$mode" "$path" - vecho "$mode" - elif [[ $line =~ ^Directory:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - mkdir -p "$path" - vecho " $path/" - elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then - ln -s "${BASH_REMATCH[1]}" "$path" - vecho " $path -> ${BASH_REMATCH[1]}" - elif [[ $line =~ ^# ]]; then - # Ignore comments between files - continue - else - echo >&2 "ERROR: Unknown keyword on line $line_no: $line" - exit 1 - fi - done < "$ttar_file" -} - -function div { - echo "# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" \ - "- - - - - -" -} - -function get_mode { - local mfile=$1 - if [ -z "${STAT_OPTION:-}" ]; then - if stat -c '%a' "$mfile" >/dev/null 2>&1; then - # GNU stat - STAT_OPTION='-c' - STAT_FORMAT='%a' - else - # BSD stat - STAT_OPTION='-f' - # Octal output, user/group/other (omit file type, sticky bit) - STAT_FORMAT='%OLp' - fi - fi - stat "${STAT_OPTION}" "${STAT_FORMAT}" "$mfile" -} - -function _create { - shopt -s nullglob - local mode - local eof_without_newline - while (( "$#" )); do - file=$1 - if [ -L "$file" ]; then - echo "Path: $file" - symlinkTo=$(readlink "$file") - echo "SymlinkTo: $symlinkTo" - vecho " $file -> $symlinkTo" - div - elif [ -d "$file" ]; then - # Strip trailing slash (if there is one) - file=${file%/} - echo "Directory: $file" - mode=$(get_mode "$file") - echo "Mode: $mode" - vecho "$mode $file/" - div - # Find all files and dirs, including hidden/dot files - for x in "$file/"{*,.[^.]*}; do - _create "$x" - done - elif [ -f "$file" ]; then - echo "Path: $file" - lines=$(wc -l "$file"|awk '{print $1}') - eof_without_newline=0 - if [[ "$(wc -c "$file"|awk '{print $1}')" -gt 0 ]] && \ - [[ "$(tail -c 1 "$file" | wc -l)" -eq 0 ]]; then - eof_without_newline=1 - lines=$((lines+1)) - fi - echo "Lines: $lines" - # Add backslash in front of EOF - # Add backslash in front of NULLBYTE - # Replace null byte with NULLBYTE - if [ $USE_PYTHON -eq 1 ]; then - < "$file" python -c "$PYTHON_CREATE_FILTER" - else - < "$file" \ - sed 's/EOF/\\EOF/g; - s/NULLBYTE/\\NULLBYTE/g; - s/\x0/NULLBYTE/g; - ' - fi - if [[ "$eof_without_newline" -eq 1 ]]; then - # Finish line with EOF to indicate that the original line did - # not end with a linefeed - echo "EOF" - fi - mode=$(get_mode "$file") - echo "Mode: $mode" - vecho "$mode $file" - div - else - echo >&2 "ERROR: file not found ($file in $(pwd))" - exit 2 - fi - shift - done -} - -function create { - ttar_file=$1 - shift - if [ -z "${1:-}" ]; then - echo >&2 "ERROR: missing arguments." - echo - usage 1 - fi - if [ -e "$ttar_file" ]; then - rm "$ttar_file" - fi - exec > "$ttar_file" - echo "# Archive created by ttar $ARG_STRING" - _create "$@" -} - -test_environment - -if [ -n "${CDIR:-}" ]; then - if [[ "$ARCHIVE" != /* ]]; then - # Relative path: preserve the archive's location before changing - # directory - ARCHIVE="$(pwd)/$ARCHIVE" - fi - cd "$CDIR" -fi - -"$CMD" "$ARCHIVE" "$@" diff --git a/vendor/github.com/rs/cors/.travis.yml b/vendor/github.com/rs/cors/.travis.yml deleted file mode 100644 index 9a68b567..00000000 --- a/vendor/github.com/rs/cors/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: go -go: -- "1.10" -- "1.11" -- "1.12" -- tip -matrix: - allow_failures: - - go: tip diff --git a/vendor/github.com/rs/cors/README.md b/vendor/github.com/rs/cors/README.md deleted file mode 100644 index ecc83b29..00000000 --- a/vendor/github.com/rs/cors/README.md +++ /dev/null @@ -1,115 +0,0 @@ -# Go CORS handler [![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/cors) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/cors/master/LICENSE) [![build](https://img.shields.io/travis/rs/cors.svg?style=flat)](https://travis-ci.org/rs/cors) [![Coverage](http://gocover.io/_badge/github.com/rs/cors)](http://gocover.io/github.com/rs/cors) - -CORS is a `net/http` handler implementing [Cross Origin Resource Sharing W3 specification](http://www.w3.org/TR/cors/) in Golang. - -## Getting Started - -After installing Go and setting up your [GOPATH](http://golang.org/doc/code.html#GOPATH), create your first `.go` file. We'll call it `server.go`. - -```go -package main - -import ( - "net/http" - - "github.com/rs/cors" -) - -func main() { - mux := http.NewServeMux() - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte("{\"hello\": \"world\"}")) - }) - - // cors.Default() setup the middleware with default options being - // all origins accepted with simple methods (GET, POST). See - // documentation below for more options. - handler := cors.Default().Handler(mux) - http.ListenAndServe(":8080", handler) -} -``` - -Install `cors`: - - go get github.com/rs/cors - -Then run your server: - - go run server.go - -The server now runs on `localhost:8080`: - - $ curl -D - -H 'Origin: http://foo.com' http://localhost:8080/ - HTTP/1.1 200 OK - Access-Control-Allow-Origin: foo.com - Content-Type: application/json - Date: Sat, 25 Oct 2014 03:43:57 GMT - Content-Length: 18 - - {"hello": "world"} - -### Allow * With Credentials Security Protection - -This library has been modified to avoid a well known security issue when configured with `AllowedOrigins` to `*` and `AllowCredentials` to `true`. Such setup used to make the library reflects the request `Origin` header value, working around a security protection embedded into the standard that makes clients to refuse such configuration. This behavior has been removed with [#55](https://github.com/rs/cors/issues/55) and [#57](https://github.com/rs/cors/issues/57). - -If you depend on this behavior and understand the implications, you can restore it using the `AllowOriginFunc` with `func(origin string) {return true}`. - -Please refer to [#55](https://github.com/rs/cors/issues/55) for more information about the security implications. - -### More Examples - -* `net/http`: [examples/nethttp/server.go](https://github.com/rs/cors/blob/master/examples/nethttp/server.go) -* [Goji](https://goji.io): [examples/goji/server.go](https://github.com/rs/cors/blob/master/examples/goji/server.go) -* [Martini](http://martini.codegangsta.io): [examples/martini/server.go](https://github.com/rs/cors/blob/master/examples/martini/server.go) -* [Negroni](https://github.com/codegangsta/negroni): [examples/negroni/server.go](https://github.com/rs/cors/blob/master/examples/negroni/server.go) -* [Alice](https://github.com/justinas/alice): [examples/alice/server.go](https://github.com/rs/cors/blob/master/examples/alice/server.go) -* [HttpRouter](https://github.com/julienschmidt/httprouter): [examples/httprouter/server.go](https://github.com/rs/cors/blob/master/examples/httprouter/server.go) -* [Gorilla](http://www.gorillatoolkit.org/pkg/mux): [examples/gorilla/server.go](https://github.com/rs/cors/blob/master/examples/gorilla/server.go) -* [Buffalo](https://gobuffalo.io): [examples/buffalo/server.go](https://github.com/rs/cors/blob/master/examples/buffalo/server.go) -* [Gin](https://gin-gonic.github.io/gin): [examples/gin/server.go](https://github.com/rs/cors/blob/master/examples/gin/server.go) -* [Chi](https://github.com/go-chi/chi): [examples/chi/server.go](https://github.com/rs/cors/blob/master/examples/chi/server.go) - -## Parameters - -Parameters are passed to the middleware thru the `cors.New` method as follow: - -```go -c := cors.New(cors.Options{ - AllowedOrigins: []string{"http://foo.com", "http://foo.com:8080"}, - AllowCredentials: true, - // Enable Debugging for testing, consider disabling in production - Debug: true, -}) - -// Insert the middleware -handler = c.Handler(handler) -``` - -* **AllowedOrigins** `[]string`: A list of origins a cross-domain request can be executed from. If the special `*` value is present in the list, all origins will be allowed. An origin may contain a wildcard (`*`) to replace 0 or more characters (i.e.: `http://*.domain.com`). Usage of wildcards implies a small performance penality. Only one wildcard can be used per origin. The default value is `*`. -* **AllowOriginFunc** `func (origin string) bool`: A custom function to validate the origin. It takes the origin as an argument and returns true if allowed, or false otherwise. If this option is set, the content of `AllowedOrigins` is ignored. -* **AllowOriginRequestFunc** `func (r *http.Request origin string) bool`: A custom function to validate the origin. It takes the HTTP Request object and the origin as argument and returns true if allowed or false otherwise. If this option is set, the content of `AllowedOrigins` and `AllowOriginFunc` is ignored -* **AllowedMethods** `[]string`: A list of methods the client is allowed to use with cross-domain requests. Default value is simple methods (`GET` and `POST`). -* **AllowedHeaders** `[]string`: A list of non simple headers the client is allowed to use with cross-domain requests. -* **ExposedHeaders** `[]string`: Indicates which headers are safe to expose to the API of a CORS API specification -* **AllowCredentials** `bool`: Indicates whether the request can include user credentials like cookies, HTTP authentication or client side SSL certificates. The default is `false`. -* **MaxAge** `int`: Indicates how long (in seconds) the results of a preflight request can be cached. The default is `0` which stands for no max age. -* **OptionsPassthrough** `bool`: Instructs preflight to let other potential next handlers to process the `OPTIONS` method. Turn this on if your application handles `OPTIONS`. -* **Debug** `bool`: Debugging flag adds additional output to debug server side CORS issues. - -See [API documentation](http://godoc.org/github.com/rs/cors) for more info. - -## Benchmarks - - BenchmarkWithout 20000000 64.6 ns/op 8 B/op 1 allocs/op - BenchmarkDefault 3000000 469 ns/op 114 B/op 2 allocs/op - BenchmarkAllowedOrigin 3000000 608 ns/op 114 B/op 2 allocs/op - BenchmarkPreflight 20000000 73.2 ns/op 0 B/op 0 allocs/op - BenchmarkPreflightHeader 20000000 73.6 ns/op 0 B/op 0 allocs/op - BenchmarkParseHeaderList 2000000 847 ns/op 184 B/op 6 allocs/op - BenchmarkParse…Single 5000000 290 ns/op 32 B/op 3 allocs/op - BenchmarkParse…Normalized 2000000 776 ns/op 160 B/op 6 allocs/op - -## Licenses - -All source code is licensed under the [MIT License](https://raw.github.com/rs/cors/master/LICENSE). diff --git a/vendor/github.com/rs/cors/go.mod b/vendor/github.com/rs/cors/go.mod deleted file mode 100644 index 0a4c6521..00000000 --- a/vendor/github.com/rs/cors/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/rs/cors diff --git a/vendor/github.com/shopspring/decimal/.gitignore b/vendor/github.com/shopspring/decimal/.gitignore deleted file mode 100644 index 53579428..00000000 --- a/vendor/github.com/shopspring/decimal/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.git -*.swp diff --git a/vendor/github.com/shopspring/decimal/.travis.yml b/vendor/github.com/shopspring/decimal/.travis.yml deleted file mode 100644 index d2d585ce..00000000 --- a/vendor/github.com/shopspring/decimal/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go - -go: - - 1.2 - - 1.3 - - 1.4 - - tip - -install: - - go build . - -script: - - go test -v diff --git a/vendor/github.com/shopspring/decimal/README.md b/vendor/github.com/shopspring/decimal/README.md deleted file mode 100644 index 54c1a6b4..00000000 --- a/vendor/github.com/shopspring/decimal/README.md +++ /dev/null @@ -1,126 +0,0 @@ -# decimal - -[![Build Status](https://travis-ci.org/shopspring/decimal.png?branch=master)](https://travis-ci.org/shopspring/decimal) [![GoDoc](https://godoc.org/github.com/shopspring/decimal?status.svg)](https://godoc.org/github.com/shopspring/decimal) [![Go Report Card](https://goreportcard.com/badge/github.com/shopspring/decimal)](https://goreportcard.com/report/github.com/shopspring/decimal) - -Arbitrary-precision fixed-point decimal numbers in go. - -NOTE: can "only" represent numbers with a maximum of 2^31 digits after the decimal point. - -## Features - - * the zero-value is 0, and is safe to use without initialization - * addition, subtraction, multiplication with no loss of precision - * division with specified precision - * database/sql serialization/deserialization - * json and xml serialization/deserialization - -## Install - -Run `go get github.com/shopspring/decimal` - -## Usage - -```go -package main - -import ( - "fmt" - "github.com/shopspring/decimal" -) - -func main() { - price, err := decimal.NewFromString("136.02") - if err != nil { - panic(err) - } - - quantity := decimal.NewFromFloat(3) - - fee, _ := decimal.NewFromString(".035") - taxRate, _ := decimal.NewFromString(".08875") - - subtotal := price.Mul(quantity) - - preTax := subtotal.Mul(fee.Add(decimal.NewFromFloat(1))) - - total := preTax.Mul(taxRate.Add(decimal.NewFromFloat(1))) - - fmt.Println("Subtotal:", subtotal) // Subtotal: 408.06 - fmt.Println("Pre-tax:", preTax) // Pre-tax: 422.3421 - fmt.Println("Taxes:", total.Sub(preTax)) // Taxes: 37.482861375 - fmt.Println("Total:", total) // Total: 459.824961375 - fmt.Println("Tax rate:", total.Sub(preTax).Div(preTax)) // Tax rate: 0.08875 -} -``` - -## Documentation - -http://godoc.org/github.com/shopspring/decimal - -## Production Usage - -* [Spring](https://shopspring.com/), since August 14, 2014. -* If you are using this in production, please let us know! - -## FAQ - -#### Why don't you just use float64? - -Because float64s (or any binary floating point type, actually) can't represent -numbers such as 0.1 exactly. - -Consider this code: http://play.golang.org/p/TQBd4yJe6B You might expect that -it prints out `10`, but it actually prints `9.999999999999831`. Over time, -these small errors can really add up! - -#### Why don't you just use big.Rat? - -big.Rat is fine for representing rational numbers, but Decimal is better for -representing money. Why? Here's a (contrived) example: - -Let's say you use big.Rat, and you have two numbers, x and y, both -representing 1/3, and you have `z = 1 - x - y = 1/3`. If you print each one -out, the string output has to stop somewhere (let's say it stops at 3 decimal -digits, for simplicity), so you'll get 0.333, 0.333, and 0.333. But where did -the other 0.001 go? - -Here's the above example as code: http://play.golang.org/p/lCZZs0w9KE - -With Decimal, the strings being printed out represent the number exactly. So, -if you have `x = y = 1/3` (with precision 3), they will actually be equal to -0.333, and when you do `z = 1 - x - y`, `z` will be equal to .334. No money is -unaccounted for! - -You still have to be careful. If you want to split a number `N` 3 ways, you -can't just send `N/3` to three different people. You have to pick one to send -`N - (2/3*N)` to. That person will receive the fraction of a penny remainder. - -But, it is much easier to be careful with Decimal than with big.Rat. - -#### Why isn't the API similar to big.Int's? - -big.Int's API is built to reduce the number of memory allocations for maximal -performance. This makes sense for its use-case, but the trade-off is that the -API is awkward and easy to misuse. - -For example, to add two big.Ints, you do: `z := new(big.Int).Add(x, y)`. A -developer unfamiliar with this API might try to do `z := a.Add(a, b)`. This -modifies `a` and sets `z` as an alias for `a`, which they might not expect. It -also modifies any other aliases to `a`. - -Here's an example of the subtle bugs you can introduce with big.Int's API: -https://play.golang.org/p/x2R_78pa8r - -In contrast, it's difficult to make such mistakes with decimal. Decimals -behave like other go numbers types: even though `a = b` will not deep copy -`b` into `a`, it is impossible to modify a Decimal, since all Decimal methods -return new Decimals and do not modify the originals. The downside is that -this causes extra allocations, so Decimal is less performant. My assumption -is that if you're using Decimals, you probably care more about correctness -than performance. - -## License - -The MIT License (MIT) - -This is a heavily modified fork of [fpd.Decimal](https://github.com/oguzbilgic/fpd), which was also released under the MIT License. diff --git a/vendor/github.com/sirupsen/logrus/.gitignore b/vendor/github.com/sirupsen/logrus/.gitignore deleted file mode 100644 index 6b7d7d1e..00000000 --- a/vendor/github.com/sirupsen/logrus/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -logrus -vendor diff --git a/vendor/github.com/sirupsen/logrus/.travis.yml b/vendor/github.com/sirupsen/logrus/.travis.yml deleted file mode 100644 index 848938a6..00000000 --- a/vendor/github.com/sirupsen/logrus/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: go -go_import_path: github.com/sirupsen/logrus -git: - depth: 1 -env: - - GO111MODULE=on - - GO111MODULE=off -go: [ 1.11.x, 1.12.x ] -os: [ linux, osx ] -matrix: - exclude: - - go: 1.12.x - env: GO111MODULE=off - - go: 1.11.x - os: osx -install: - - ./travis/install.sh - - if [[ "$GO111MODULE" == "on" ]]; then go mod download; fi - - if [[ "$GO111MODULE" == "off" ]]; then go get github.com/stretchr/testify/assert golang.org/x/sys/unix github.com/konsorten/go-windows-terminal-sequences; fi -script: - - ./travis/cross_build.sh - - export GOMAXPROCS=4 - - export GORACE=halt_on_error=1 - - go test -race -v ./... - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then go test -race -v -tags appengine ./... ; fi diff --git a/vendor/github.com/sirupsen/logrus/CHANGELOG.md b/vendor/github.com/sirupsen/logrus/CHANGELOG.md deleted file mode 100644 index 51a7ab0c..00000000 --- a/vendor/github.com/sirupsen/logrus/CHANGELOG.md +++ /dev/null @@ -1,200 +0,0 @@ -# 1.4.2 - * Fixes build break for plan9, nacl, solaris -# 1.4.1 -This new release introduces: - * Enhance TextFormatter to not print caller information when they are empty (#944) - * Remove dependency on golang.org/x/crypto (#932, #943) - -Fixes: - * Fix Entry.WithContext method to return a copy of the initial entry (#941) - -# 1.4.0 -This new release introduces: - * Add `DeferExitHandler`, similar to `RegisterExitHandler` but prepending the handler to the list of handlers (semantically like `defer`) (#848). - * Add `CallerPrettyfier` to `JSONFormatter` and `TextFormatter (#909, #911) - * Add `Entry.WithContext()` and `Entry.Context`, to set a context on entries to be used e.g. in hooks (#919). - -Fixes: - * Fix wrong method calls `Logger.Print` and `Logger.Warningln` (#893). - * Update `Entry.Logf` to not do string formatting unless the log level is enabled (#903) - * Fix infinite recursion on unknown `Level.String()` (#907) - * Fix race condition in `getCaller` (#916). - - -# 1.3.0 -This new release introduces: - * Log, Logf, Logln functions for Logger and Entry that take a Level - -Fixes: - * Building prometheus node_exporter on AIX (#840) - * Race condition in TextFormatter (#468) - * Travis CI import path (#868) - * Remove coloured output on Windows (#862) - * Pointer to func as field in JSONFormatter (#870) - * Properly marshal Levels (#873) - -# 1.2.0 -This new release introduces: - * A new method `SetReportCaller` in the `Logger` to enable the file, line and calling function from which the trace has been issued - * A new trace level named `Trace` whose level is below `Debug` - * A configurable exit function to be called upon a Fatal trace - * The `Level` object now implements `encoding.TextUnmarshaler` interface - -# 1.1.1 -This is a bug fix release. - * fix the build break on Solaris - * don't drop a whole trace in JSONFormatter when a field param is a function pointer which can not be serialized - -# 1.1.0 -This new release introduces: - * several fixes: - * a fix for a race condition on entry formatting - * proper cleanup of previously used entries before putting them back in the pool - * the extra new line at the end of message in text formatter has been removed - * a new global public API to check if a level is activated: IsLevelEnabled - * the following methods have been added to the Logger object - * IsLevelEnabled - * SetFormatter - * SetOutput - * ReplaceHooks - * introduction of go module - * an indent configuration for the json formatter - * output colour support for windows - * the field sort function is now configurable for text formatter - * the CLICOLOR and CLICOLOR\_FORCE environment variable support in text formater - -# 1.0.6 - -This new release introduces: - * a new api WithTime which allows to easily force the time of the log entry - which is mostly useful for logger wrapper - * a fix reverting the immutability of the entry given as parameter to the hooks - a new configuration field of the json formatter in order to put all the fields - in a nested dictionnary - * a new SetOutput method in the Logger - * a new configuration of the textformatter to configure the name of the default keys - * a new configuration of the text formatter to disable the level truncation - -# 1.0.5 - -* Fix hooks race (#707) -* Fix panic deadlock (#695) - -# 1.0.4 - -* Fix race when adding hooks (#612) -* Fix terminal check in AppEngine (#635) - -# 1.0.3 - -* Replace example files with testable examples - -# 1.0.2 - -* bug: quote non-string values in text formatter (#583) -* Make (*Logger) SetLevel a public method - -# 1.0.1 - -* bug: fix escaping in text formatter (#575) - -# 1.0.0 - -* Officially changed name to lower-case -* bug: colors on Windows 10 (#541) -* bug: fix race in accessing level (#512) - -# 0.11.5 - -* feature: add writer and writerlevel to entry (#372) - -# 0.11.4 - -* bug: fix undefined variable on solaris (#493) - -# 0.11.3 - -* formatter: configure quoting of empty values (#484) -* formatter: configure quoting character (default is `"`) (#484) -* bug: fix not importing io correctly in non-linux environments (#481) - -# 0.11.2 - -* bug: fix windows terminal detection (#476) - -# 0.11.1 - -* bug: fix tty detection with custom out (#471) - -# 0.11.0 - -* performance: Use bufferpool to allocate (#370) -* terminal: terminal detection for app-engine (#343) -* feature: exit handler (#375) - -# 0.10.0 - -* feature: Add a test hook (#180) -* feature: `ParseLevel` is now case-insensitive (#326) -* feature: `FieldLogger` interface that generalizes `Logger` and `Entry` (#308) -* performance: avoid re-allocations on `WithFields` (#335) - -# 0.9.0 - -* logrus/text_formatter: don't emit empty msg -* logrus/hooks/airbrake: move out of main repository -* logrus/hooks/sentry: move out of main repository -* logrus/hooks/papertrail: move out of main repository -* logrus/hooks/bugsnag: move out of main repository -* logrus/core: run tests with `-race` -* logrus/core: detect TTY based on `stderr` -* logrus/core: support `WithError` on logger -* logrus/core: Solaris support - -# 0.8.7 - -* logrus/core: fix possible race (#216) -* logrus/doc: small typo fixes and doc improvements - - -# 0.8.6 - -* hooks/raven: allow passing an initialized client - -# 0.8.5 - -* logrus/core: revert #208 - -# 0.8.4 - -* formatter/text: fix data race (#218) - -# 0.8.3 - -* logrus/core: fix entry log level (#208) -* logrus/core: improve performance of text formatter by 40% -* logrus/core: expose `LevelHooks` type -* logrus/core: add support for DragonflyBSD and NetBSD -* formatter/text: print structs more verbosely - -# 0.8.2 - -* logrus: fix more Fatal family functions - -# 0.8.1 - -* logrus: fix not exiting on `Fatalf` and `Fatalln` - -# 0.8.0 - -* logrus: defaults to stderr instead of stdout -* hooks/sentry: add special field for `*http.Request` -* formatter/text: ignore Windows for colors - -# 0.7.3 - -* formatter/\*: allow configuration of timestamp layout - -# 0.7.2 - -* formatter/text: Add configuration option for time format (#158) diff --git a/vendor/github.com/sirupsen/logrus/README.md b/vendor/github.com/sirupsen/logrus/README.md deleted file mode 100644 index a4796eb0..00000000 --- a/vendor/github.com/sirupsen/logrus/README.md +++ /dev/null @@ -1,495 +0,0 @@ -# Logrus :walrus: [![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus) [![GoDoc](https://godoc.org/github.com/sirupsen/logrus?status.svg)](https://godoc.org/github.com/sirupsen/logrus) - -Logrus is a structured logger for Go (golang), completely API compatible with -the standard library logger. - -**Seeing weird case-sensitive problems?** It's in the past been possible to -import Logrus as both upper- and lower-case. Due to the Go package environment, -this caused issues in the community and we needed a standard. Some environments -experienced problems with the upper-case variant, so the lower-case was decided. -Everything using `logrus` will need to use the lower-case: -`github.com/sirupsen/logrus`. Any package that isn't, should be changed. - -To fix Glide, see [these -comments](https://github.com/sirupsen/logrus/issues/553#issuecomment-306591437). -For an in-depth explanation of the casing issue, see [this -comment](https://github.com/sirupsen/logrus/issues/570#issuecomment-313933276). - -**Are you interested in assisting in maintaining Logrus?** Currently I have a -lot of obligations, and I am unable to provide Logrus with the maintainership it -needs. If you'd like to help, please reach out to me at `simon at author's -username dot com`. - -Nicely color-coded in development (when a TTY is attached, otherwise just -plain text): - -![Colored](http://i.imgur.com/PY7qMwd.png) - -With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash -or Splunk: - -```json -{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the -ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"} - -{"level":"warning","msg":"The group's number increased tremendously!", -"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"} - -{"animal":"walrus","level":"info","msg":"A giant walrus appears!", -"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"} - -{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.", -"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"} - -{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true, -"time":"2014-03-10 19:57:38.562543128 -0400 EDT"} -``` - -With the default `log.SetFormatter(&log.TextFormatter{})` when a TTY is not -attached, the output is compatible with the -[logfmt](http://godoc.org/github.com/kr/logfmt) format: - -```text -time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8 -time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10 -time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased tremendously!" number=122 omg=true -time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4 -time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009 -time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true -``` -To ensure this behaviour even if a TTY is attached, set your formatter as follows: - -```go - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) -``` - -#### Logging Method Name - -If you wish to add the calling method as a field, instruct the logger via: -```go -log.SetReportCaller(true) -``` -This adds the caller as 'method' like so: - -```json -{"animal":"penguin","level":"fatal","method":"github.com/sirupsen/arcticcreatures.migrate","msg":"a penguin swims by", -"time":"2014-03-10 19:57:38.562543129 -0400 EDT"} -``` - -```text -time="2015-03-26T01:27:38-04:00" level=fatal method=github.com/sirupsen/arcticcreatures.migrate msg="a penguin swims by" animal=penguin -``` -Note that this does add measurable overhead - the cost will depend on the version of Go, but is -between 20 and 40% in recent tests with 1.6 and 1.7. You can validate this in your -environment via benchmarks: -``` -go test -bench=.*CallerTracing -``` - - -#### Case-sensitivity - -The organization's name was changed to lower-case--and this will not be changed -back. If you are getting import conflicts due to case sensitivity, please use -the lower-case import: `github.com/sirupsen/logrus`. - -#### Example - -The simplest way to use Logrus is simply the package-level exported logger: - -```go -package main - -import ( - log "github.com/sirupsen/logrus" -) - -func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - }).Info("A walrus appears") -} -``` - -Note that it's completely api-compatible with the stdlib logger, so you can -replace your `log` imports everywhere with `log "github.com/sirupsen/logrus"` -and you'll now have the flexibility of Logrus. You can customize it all you -want: - -```go -package main - -import ( - "os" - log "github.com/sirupsen/logrus" -) - -func init() { - // Log as JSON instead of the default ASCII formatter. - log.SetFormatter(&log.JSONFormatter{}) - - // Output to stdout instead of the default stderr - // Can be any io.Writer, see below for File example - log.SetOutput(os.Stdout) - - // Only log the warning severity or above. - log.SetLevel(log.WarnLevel) -} - -func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") - - log.WithFields(log.Fields{ - "omg": true, - "number": 122, - }).Warn("The group's number increased tremendously!") - - log.WithFields(log.Fields{ - "omg": true, - "number": 100, - }).Fatal("The ice breaks!") - - // A common pattern is to re-use fields between logging statements by re-using - // the logrus.Entry returned from WithFields() - contextLogger := log.WithFields(log.Fields{ - "common": "this is a common field", - "other": "I also should be logged always", - }) - - contextLogger.Info("I'll be logged with common and other field") - contextLogger.Info("Me too") -} -``` - -For more advanced usage such as logging to multiple locations from the same -application, you can also create an instance of the `logrus` Logger: - -```go -package main - -import ( - "os" - "github.com/sirupsen/logrus" -) - -// Create a new instance of the logger. You can have any number of instances. -var log = logrus.New() - -func main() { - // The API for setting attributes is a little different than the package level - // exported logger. See Godoc. - log.Out = os.Stdout - - // You could set this to any `io.Writer` such as a file - // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666) - // if err == nil { - // log.Out = file - // } else { - // log.Info("Failed to log to file, using default stderr") - // } - - log.WithFields(logrus.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") -} -``` - -#### Fields - -Logrus encourages careful, structured logging through logging fields instead of -long, unparseable error messages. For example, instead of: `log.Fatalf("Failed -to send event %s to topic %s with key %d")`, you should log the much more -discoverable: - -```go -log.WithFields(log.Fields{ - "event": event, - "topic": topic, - "key": key, -}).Fatal("Failed to send event") -``` - -We've found this API forces you to think about logging in a way that produces -much more useful logging messages. We've been in countless situations where just -a single added field to a log statement that was already there would've saved us -hours. The `WithFields` call is optional. - -In general, with Logrus using any of the `printf`-family functions should be -seen as a hint you should add a field, however, you can still use the -`printf`-family functions with Logrus. - -#### Default Fields - -Often it's helpful to have fields _always_ attached to log statements in an -application or parts of one. For example, you may want to always log the -`request_id` and `user_ip` in the context of a request. Instead of writing -`log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})` on -every line, you can create a `logrus.Entry` to pass around instead: - -```go -requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) -requestLogger.Info("something happened on that request") # will log request_id and user_ip -requestLogger.Warn("something not great happened") -``` - -#### Hooks - -You can add hooks for logging levels. For example to send errors to an exception -tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to -multiple places simultaneously, e.g. syslog. - -Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in -`init`: - -```go -import ( - log "github.com/sirupsen/logrus" - "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake" - logrus_syslog "github.com/sirupsen/logrus/hooks/syslog" - "log/syslog" -) - -func init() { - - // Use the Airbrake hook to report errors that have Error severity or above to - // an exception tracker. You can create custom hooks, see the Hooks section. - log.AddHook(airbrake.NewHook(123, "xyz", "production")) - - hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") - if err != nil { - log.Error("Unable to connect to local syslog daemon") - } else { - log.AddHook(hook) - } -} -``` -Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md). - -A list of currently known of service hook can be found in this wiki [page](https://github.com/sirupsen/logrus/wiki/Hooks) - - -#### Level logging - -Logrus has seven logging levels: Trace, Debug, Info, Warning, Error, Fatal and Panic. - -```go -log.Trace("Something very low level.") -log.Debug("Useful debugging information.") -log.Info("Something noteworthy happened!") -log.Warn("You should probably take a look at this.") -log.Error("Something failed but I'm not quitting.") -// Calls os.Exit(1) after logging -log.Fatal("Bye.") -// Calls panic() after logging -log.Panic("I'm bailing.") -``` - -You can set the logging level on a `Logger`, then it will only log entries with -that severity or anything above it: - -```go -// Will log anything that is info or above (warn, error, fatal, panic). Default. -log.SetLevel(log.InfoLevel) -``` - -It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose -environment if your application has that. - -#### Entries - -Besides the fields added with `WithField` or `WithFields` some fields are -automatically added to all logging events: - -1. `time`. The timestamp when the entry was created. -2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after - the `AddFields` call. E.g. `Failed to send event.` -3. `level`. The logging level. E.g. `info`. - -#### Environments - -Logrus has no notion of environment. - -If you wish for hooks and formatters to only be used in specific environments, -you should handle that yourself. For example, if your application has a global -variable `Environment`, which is a string representation of the environment you -could do: - -```go -import ( - log "github.com/sirupsen/logrus" -) - -init() { - // do something here to set environment depending on an environment variable - // or command-line flag - if Environment == "production" { - log.SetFormatter(&log.JSONFormatter{}) - } else { - // The TextFormatter is default, you don't actually have to do this. - log.SetFormatter(&log.TextFormatter{}) - } -} -``` - -This configuration is how `logrus` was intended to be used, but JSON in -production is mostly only useful if you do log aggregation with tools like -Splunk or Logstash. - -#### Formatters - -The built-in logging formatters are: - -* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise - without colors. - * *Note:* to force colored output when there is no TTY, set the `ForceColors` - field to `true`. To force no colored output even if there is a TTY set the - `DisableColors` field to `true`. For Windows, see - [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable). - * When colors are enabled, levels are truncated to 4 characters by default. To disable - truncation set the `DisableLevelTruncation` field to `true`. - * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#TextFormatter). -* `logrus.JSONFormatter`. Logs fields as JSON. - * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#JSONFormatter). - -Third party logging formatters: - -* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can be parsed by Kubernetes and Google Container Engine. -* [`GELF`](https://github.com/fabienm/go-logrus-formatters). Formats entries so they comply to Graylog's [GELF 1.1 specification](http://docs.graylog.org/en/2.4/pages/gelf.html). -* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events. -* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout. -* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ÅÌ Í•Í–ÌšfÌÍÌ  ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗lÍ–ÍŽg̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦. -* [`nested-logrus-formatter`](https://github.com/antonfisher/nested-logrus-formatter). Converts logrus fields to a nested structure. - -You can define your formatter by implementing the `Formatter` interface, -requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a -`Fields` type (`map[string]interface{}`) with all your fields as well as the -default ones (see Entries section above): - -```go -type MyJSONFormatter struct { -} - -log.SetFormatter(new(MyJSONFormatter)) - -func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) { - // Note this doesn't include Time, Level and Message which are available on - // the Entry. Consult `godoc` on information about those fields or read the - // source of the official loggers. - serialized, err := json.Marshal(entry.Data) - if err != nil { - return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) - } - return append(serialized, '\n'), nil -} -``` - -#### Logger as an `io.Writer` - -Logrus can be transformed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it. - -```go -w := logger.Writer() -defer w.Close() - -srv := http.Server{ - // create a stdlib log.Logger that writes to - // logrus.Logger. - ErrorLog: log.New(w, "", 0), -} -``` - -Each line written to that writer will be printed the usual way, using formatters -and hooks. The level for those entries is `info`. - -This means that we can override the standard library logger easily: - -```go -logger := logrus.New() -logger.Formatter = &logrus.JSONFormatter{} - -// Use logrus for standard log output -// Note that `log` here references stdlib's log -// Not logrus imported under the name `log`. -log.SetOutput(logger.Writer()) -``` - -#### Rotation - -Log rotation is not provided with Logrus. Log rotation should be done by an -external program (like `logrotate(8)`) that can compress and delete old log -entries. It should not be a feature of the application-level logger. - -#### Tools - -| Tool | Description | -| ---- | ----------- | -|[Logrus Mate](https://github.com/gogap/logrus_mate)|Logrus mate is a tool for Logrus to manage loggers, you can initial logger's level, hook and formatter by config file, the logger will generated with different config at different environment.| -|[Logrus Viper Helper](https://github.com/heirko/go-contrib/tree/master/logrusHelper)|An Helper around Logrus to wrap with spf13/Viper to load configuration with fangs! And to simplify Logrus configuration use some behavior of [Logrus Mate](https://github.com/gogap/logrus_mate). [sample](https://github.com/heirko/iris-contrib/blob/master/middleware/logrus-logger/example) | - -#### Testing - -Logrus has a built in facility for asserting the presence of log messages. This is implemented through the `test` hook and provides: - -* decorators for existing logger (`test.NewLocal` and `test.NewGlobal`) which basically just add the `test` hook -* a test logger (`test.NewNullLogger`) that just records log messages (and does not output any): - -```go -import( - "github.com/sirupsen/logrus" - "github.com/sirupsen/logrus/hooks/test" - "github.com/stretchr/testify/assert" - "testing" -) - -func TestSomething(t*testing.T){ - logger, hook := test.NewNullLogger() - logger.Error("Helloerror") - - assert.Equal(t, 1, len(hook.Entries)) - assert.Equal(t, logrus.ErrorLevel, hook.LastEntry().Level) - assert.Equal(t, "Helloerror", hook.LastEntry().Message) - - hook.Reset() - assert.Nil(t, hook.LastEntry()) -} -``` - -#### Fatal handlers - -Logrus can register one or more functions that will be called when any `fatal` -level message is logged. The registered handlers will be executed before -logrus performs a `os.Exit(1)`. This behavior may be helpful if callers need -to gracefully shutdown. Unlike a `panic("Something went wrong...")` call which can be intercepted with a deferred `recover` a call to `os.Exit(1)` can not be intercepted. - -``` -... -handler := func() { - // gracefully shutdown something... -} -logrus.RegisterExitHandler(handler) -... -``` - -#### Thread safety - -By default, Logger is protected by a mutex for concurrent writes. The mutex is held when calling hooks and writing logs. -If you are sure such locking is not needed, you can call logger.SetNoLock() to disable the locking. - -Situation when locking is not needed includes: - -* You have no hooks registered, or hooks calling is already thread-safe. - -* Writing to logger.Out is already thread-safe, for example: - - 1) logger.Out is protected by locks. - - 2) logger.Out is a os.File handler opened with `O_APPEND` flag, and every write is smaller than 4k. (This allow multi-thread/multi-process writing) - - (Refer to http://www.notthewizard.com/2014/06/17/are-files-appends-really-atomic/) diff --git a/vendor/github.com/sirupsen/logrus/appveyor.yml b/vendor/github.com/sirupsen/logrus/appveyor.yml deleted file mode 100644 index 96c2ce15..00000000 --- a/vendor/github.com/sirupsen/logrus/appveyor.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: "{build}" -platform: x64 -clone_folder: c:\gopath\src\github.com\sirupsen\logrus -environment: - GOPATH: c:\gopath -branches: - only: - - master -install: - - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% - - go version -build_script: - - go get -t - - go test diff --git a/vendor/github.com/sirupsen/logrus/go.mod b/vendor/github.com/sirupsen/logrus/go.mod deleted file mode 100644 index 12fdf989..00000000 --- a/vendor/github.com/sirupsen/logrus/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/sirupsen/logrus - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.1 - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/objx v0.1.1 // indirect - github.com/stretchr/testify v1.2.2 - golang.org/x/sys v0.0.0-20190422165155-953cdadca894 -) diff --git a/vendor/github.com/sirupsen/logrus/go.sum b/vendor/github.com/sirupsen/logrus/go.sum deleted file mode 100644 index 596c318b..00000000 --- a/vendor/github.com/sirupsen/logrus/go.sum +++ /dev/null @@ -1,16 +0,0 @@ -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/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe h1:CHRGQ8V7OlCYtwaKPJi3iA7J+YdNKdo8j7nG5IgDhjs= -github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -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/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/address.go b/vendor/github.com/skycoin/skycoin/src/cipher/address.go new file mode 100644 index 00000000..b5d93275 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/address.go @@ -0,0 +1,183 @@ +package cipher + +import ( + "errors" + "log" + + "github.com/skycoin/skycoin/src/cipher/base58" +) + +var ( + // ErrAddressInvalidLength Unexpected size of address bytes buffer + ErrAddressInvalidLength = errors.New("Invalid address length") + // ErrAddressInvalidChecksum Computed checksum did not match expected value + ErrAddressInvalidChecksum = errors.New("Invalid checksum") + // ErrAddressInvalidVersion Unsupported address version value + ErrAddressInvalidVersion = errors.New("Address version invalid") + // ErrAddressInvalidPubKey Public key invalid for address + ErrAddressInvalidPubKey = errors.New("Public key invalid for address") + // ErrAddressInvalidFirstByte Invalid first byte in wallet import format string + ErrAddressInvalidFirstByte = errors.New("first byte invalid") + // ErrAddressInvalidLastByte 33rd byte in wallet import format string is invalid + ErrAddressInvalidLastByte = errors.New("invalid 33rd byte") +) + +/* +Addresses are the Ripemd160 of the double SHA256 of the public key +- public key must be in compressed format + +In the block chain the address is 20+1 bytes +- the first byte is the version byte +- the next twenty bytes are RIPMD160(SHA256(SHA256(pubkey))) + +In base 58 format the address is 20+1+4 bytes +- the first 20 bytes are RIPMD160(SHA256(SHA256(pubkey))). +-- this is to allow for any prefix in vanity addresses +- the next byte is the version byte +- the next 4 bytes are a checksum +-- the first 4 bytes of the SHA256 of the 21 bytes that come before + +*/ + +// Checksum 4 bytes +type Checksum [4]byte + +// Addresser defines an interface for cryptocurrency addresses +type Addresser interface { + Bytes() []byte + String() string + Checksum() Checksum + Verify(PubKey) error + Null() bool +} + +// PubKeyRipemd160 returns ripemd160(sha256(sha256(pubkey))) +func PubKeyRipemd160(pubKey PubKey) Ripemd160 { + r1 := SumSHA256(pubKey[:]) + r2 := SumSHA256(r1[:]) + return HashRipemd160(r2[:]) +} + +// Address version is after Key to enable better vanity address generation +// Address struct is a 25 byte with a 20 byte public key hash, 1 byte address +// type and 4 byte checksum. +type Address struct { + Version byte //1 byte + Key Ripemd160 //20 byte pubkey hash +} + +// AddressFromPubKey creates Address from PubKey as ripemd160(sha256(sha256(pubkey))) +func AddressFromPubKey(pubKey PubKey) Address { + return Address{ + Version: 0, + Key: PubKeyRipemd160(pubKey), + } +} + +// AddressFromSecKey generates address from secret key +func AddressFromSecKey(secKey SecKey) (Address, error) { + p, err := PubKeyFromSecKey(secKey) + if err != nil { + return Address{}, err + } + return AddressFromPubKey(p), nil +} + +// MustAddressFromSecKey generates address from secret key, panics on error +func MustAddressFromSecKey(secKey SecKey) Address { + return AddressFromPubKey(MustPubKeyFromSecKey(secKey)) +} + +// DecodeBase58Address creates an Address from its base58 encoding +func DecodeBase58Address(addr string) (Address, error) { + b, err := base58.Decode(addr) + if err != nil { + return Address{}, err + } + return AddressFromBytes(b) +} + +// MustDecodeBase58Address creates an Address from its base58 encoding, panics on error +func MustDecodeBase58Address(addr string) Address { + a, err := DecodeBase58Address(addr) + if err != nil { + log.Panicf("Invalid address %s: %v", addr, err) + } + return a +} + +// AddressFromBytes converts []byte to an Address +func AddressFromBytes(b []byte) (Address, error) { + if len(b) != 20+1+4 { + return Address{}, ErrAddressInvalidLength + } + a := Address{} + copy(a.Key[0:20], b[0:20]) + a.Version = b[20] + + chksum := a.Checksum() + var checksum [4]byte + copy(checksum[0:4], b[21:25]) + + if checksum != chksum { + return Address{}, ErrAddressInvalidChecksum + } + + if a.Version != 0 { + return Address{}, ErrAddressInvalidVersion + } + + return a, nil +} + +// MustAddressFromBytes converts []byte to an Address, panics on error +func MustAddressFromBytes(b []byte) Address { + addr, err := AddressFromBytes(b) + if err != nil { + log.Panic(err) + } + + return addr +} + +// Null returns true if the address is null (0x0000....) +func (addr Address) Null() bool { + return addr == Address{} +} + +// Bytes return address as a byte slice +func (addr Address) Bytes() []byte { + b := make([]byte, 20+1+4) + copy(b[0:20], addr.Key[0:20]) + b[20] = addr.Version + chksum := addr.Checksum() + copy(b[21:25], chksum[0:4]) + return b +} + +// Verify checks that the address appears valid for the public key +func (addr Address) Verify(pubKey PubKey) error { + if addr.Version != 0x00 { + return ErrAddressInvalidVersion + } + + if addr.Key != PubKeyRipemd160(pubKey) { + return ErrAddressInvalidPubKey + } + + return nil +} + +// String address as Base58 encoded string +func (addr Address) String() string { + return string(base58.Encode(addr.Bytes())) +} + +// Checksum returns Address Checksum which is the first 4 bytes of sha256(key+version) +func (addr Address) Checksum() Checksum { + r1 := append(addr.Key[:], []byte{addr.Version}...) + r2 := SumSHA256(r1[:]) + c := Checksum{} + copy(c[:], r2[:len(c)]) + return c +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/base58/LICENSE b/vendor/github.com/skycoin/skycoin/src/cipher/base58/LICENSE new file mode 100644 index 00000000..9d58fbb4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/base58/LICENSE @@ -0,0 +1,24 @@ +MIT License + +Copyright (c) 2017 Denis Subbotin +Copyright (c) 2017 Nika Jones +Copyright (c) 2017 Philip Schlump +Copyright (c) 2019 gz-c + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/base58/LICENSE_old b/vendor/github.com/skycoin/skycoin/src/cipher/base58/LICENSE_old new file mode 100644 index 00000000..58da01b3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/base58/LICENSE_old @@ -0,0 +1,27 @@ +Copyright (c) 2012 ThePiachu. All rights reserved. +Copyright (c) 2019 gz-c, Skycoin developers. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * The name of ThePiachu may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58.go b/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58.go new file mode 100644 index 00000000..c18ae5a8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58.go @@ -0,0 +1,178 @@ +package base58 + +import ( + "errors" + "fmt" +) + +var ( + // ErrInvalidChar Invalid base58 character + ErrInvalidChar = errors.New("Invalid base58 character") + // ErrInvalidString Invalid base58 string + ErrInvalidString = errors.New("Invalid base58 string") +) + +// Alphabet is a a b58 alphabet. +type Alphabet struct { + decode [128]int8 + encode [58]byte +} + +// NewAlphabet creates a new alphabet from the passed string. +// +// It panics if the passed string is not 58 bytes long or isn't valid ASCII. +func NewAlphabet(s string) *Alphabet { + if len(s) != 58 { + panic("base58 alphabets must be 58 bytes long") + } + + ret := &Alphabet{} + + copy(ret.encode[:], s) + + for i := range ret.decode { + ret.decode[i] = -1 + } + for i, b := range ret.encode { + ret.decode[b] = int8(i) + } + + return ret +} + +// btcAlphabet is the bitcoin base58 alphabet. +var btcAlphabet = NewAlphabet("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") + +// Encode encodes the passed bytes into a base58 encoded string. +func Encode(bin []byte) string { + return fastBase58EncodingAlphabet(bin, btcAlphabet) +} + +// fastBase58EncodingAlphabet encodes the passed bytes into a base58 encoded +// string with the passed alphabet. +func fastBase58EncodingAlphabet(bin []byte, alphabet *Alphabet) string { + binsz := len(bin) + var i, j, zcount, high int + var carry uint32 + + for zcount < binsz && bin[zcount] == 0 { + zcount++ + } + + size := (binsz-zcount)*138/100 + 1 + var buf = make([]uint32, size) + + high = size - 1 + for i = zcount; i < binsz; i++ { + j = size - 1 + for carry = uint32(bin[i]); j > high || carry != 0; j-- { + carry += buf[j] << 8 + buf[j] = carry % 58 + carry /= 58 + } + high = j + } + + for j = 0; j < size && buf[j] == 0; j++ { + } + + var b58 = make([]byte, size-j+zcount) + + if zcount != 0 { + for i = 0; i < zcount; i++ { + b58[i] = '1' + } + } + + for i = zcount; j < size; i++ { + b58[i] = alphabet.encode[buf[j]] + j++ + } + + return string(b58) +} + +// Decode decodes the base58 encoded bytes. +func Decode(str string) ([]byte, error) { + return fastBase58DecodingAlphabet(str, btcAlphabet) +} + +// fastBase58DecodingAlphabet decodes the base58 encoded bytes using the given +// b58 alphabet. +func fastBase58DecodingAlphabet(str string, alphabet *Alphabet) ([]byte, error) { + if len(str) == 0 { + return nil, ErrInvalidString + } + + var ( + t, c uint64 + zmask uint32 + zcount int + + b58u = []rune(str) + b58sz = len(b58u) + + outisz = (b58sz + 3) >> 2 + binu = make([]byte, (b58sz+3)*3) + bytesleft = b58sz & 3 + ) + + if bytesleft > 0 { + zmask = 0xffffffff << uint32(bytesleft*8) + } else { + bytesleft = 4 + } + + var outi = make([]uint32, outisz) + + for i := 0; i < b58sz && b58u[i] == '1'; i++ { + zcount++ + } + + for _, r := range b58u { + if r > 127 { + return nil, ErrInvalidChar + } + if alphabet.decode[r] == -1 { + return nil, ErrInvalidChar + } + + c = uint64(alphabet.decode[r]) + + for j := outisz - 1; j >= 0; j-- { + t = uint64(outi[j])*58 + c + c = (t >> 32) & 0x3f + outi[j] = uint32(t & 0xffffffff) + } + + // Neither of these should occur because the buffer is allocated ourselves + if c > 0 { + return nil, fmt.Errorf("output number too big (carry to the next int32)") + } + + if outi[0]&zmask != 0 { + return nil, fmt.Errorf("output number too big (last int32 filled too far)") + } + } + + var j, cnt int + for j, cnt = 0, 0; j < outisz; j++ { + for mask := byte(bytesleft-1) * 8; mask <= 0x18; mask, cnt = mask-8, cnt+1 { + binu[cnt] = byte(outi[j] >> mask) + } + if j == 0 { + bytesleft = 4 // because it could be less than 4 the first time through + } + } + + for n, v := range binu { + if v > 0 { + start := n - zcount + if start < 0 { + start = 0 + } + return binu[start:cnt], nil + } + } + return binu[:cnt], nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go b/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go new file mode 100644 index 00000000..ffa4bca5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go @@ -0,0 +1,190 @@ +// Copyright 2011 ThePiachu. All rights reserved. +// Copyright 2019 gz-c, Skycoin developers. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package base58 + +import ( + "errors" + "fmt" + "math/big" +) + +//alphabet used by Bitcoins +var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + +var ( + // errInvalidBase58Char Invalid base58 character + errInvalidBase58Char = errors.New("Invalid base58 character") + // errInvalidBase58String Invalid base58 string + errInvalidBase58String = errors.New("Invalid base58 string") + // errInvalidBase58Length Invalid base58 length + errInvalidBase58Length = errors.New("base58 invalid length") +) + +// oldBase58 type to hold the oldBase58 string +type oldBase58 string + +//reverse alphabet used for quckly converting base58 strings into numbers +var revalp = map[string]int{ + "1": 0, "2": 1, "3": 2, "4": 3, "5": 4, "6": 5, "7": 6, "8": 7, "9": 8, "A": 9, + "B": 10, "C": 11, "D": 12, "E": 13, "F": 14, "G": 15, "H": 16, "J": 17, "K": 18, "L": 19, + "M": 20, "N": 21, "P": 22, "Q": 23, "R": 24, "S": 25, "T": 26, "U": 27, "V": 28, "W": 29, + "X": 30, "Y": 31, "Z": 32, "a": 33, "b": 34, "c": 35, "d": 36, "e": 37, "f": 38, "g": 39, + "h": 40, "i": 41, "j": 42, "k": 43, "m": 44, "n": 45, "o": 46, "p": 47, "q": 48, "r": 49, + "s": 50, "t": 51, "u": 52, "v": 53, "w": 54, "x": 55, "y": 56, "z": 57, +} + +// oldHex2Big converts hex to big +func oldHex2Big(b []byte) *big.Int { + answer := big.NewInt(0) + + for i := 0; i < len(b); i++ { + answer.Lsh(answer, 8) + answer.Add(answer, big.NewInt(int64(b[i]))) + } + + return answer +} + +// ToBig convert base58 to big.Int +func (b oldBase58) ToBig() (*big.Int, error) { + answer := new(big.Int) + for i := 0; i < len(b); i++ { + answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return nil, errInvalidBase58Char + } + answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter + } + return answer, nil +} + +// ToInt converts base58 to int +func (b oldBase58) ToInt() (int, error) { + answer := 0 + for i := 0; i < len(b); i++ { + answer *= 58 //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return 0, errInvalidBase58Char + } + answer += c //add value of the current letter + } + return answer, nil +} + +//ToHex converts base58 to hex bytes +func (b oldBase58) ToHex() ([]byte, error) { + value, err := b.ToBig() //convert to big.Int + if err != nil { + return nil, err + } + oneCount := 0 + bs := string(b) + if len(bs) == 0 { + return nil, fmt.Errorf("%v - len(bs) == 0", errInvalidBase58String) + } + for bs[oneCount] == '1' { + oneCount++ + if oneCount >= len(bs) { + return nil, fmt.Errorf("%v - oneCount >= len(bs)", errInvalidBase58String) + } + } + //convert big.Int to bytes + return append(make([]byte, oneCount), value.Bytes()...), nil +} + +// Base582Big converts base58 to big +func (b oldBase58) Base582Big() (*big.Int, error) { + answer := new(big.Int) + for i := 0; i < len(b); i++ { + answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return nil, errInvalidBase58Char + } + answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter + } + return answer, nil +} + +// Base582Int converts base58 to int +func (b oldBase58) Base582Int() (int, error) { + answer := 0 + for i := 0; i < len(b); i++ { + answer *= 58 //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return 0, errInvalidBase58Char + } + answer += c //add value of the current letter + } + return answer, nil +} + +// oldBase582Hex converts base58 to hex bytes +func oldBase582Hex(b string) ([]byte, error) { + return oldBase58(b).ToHex() +} + +// BitHex converts base58 to hexes used by Bitcoins (keeping the zeroes on the front, 25 bytes long) +func (b oldBase58) BitHex() ([]byte, error) { + value, err := b.ToBig() //convert to big.Int + if err != nil { + return nil, err + } + + tmp := value.Bytes() //convert to hex bytes + if len(tmp) == 25 { //if it is exactly 25 bytes, return + return tmp, nil + } else if len(tmp) > 25 { //if it is longer than 25, return nothing + return nil, errInvalidBase58Length + } + answer := make([]byte, 25) //make 25 byte container + for i := 0; i < len(tmp); i++ { //copy converted bytes + answer[24-i] = tmp[len(tmp)-1-i] + } + return answer, nil +} + +// oldBig2Base58 encodes big.Int to base58 string +func oldBig2Base58(val *big.Int) oldBase58 { + answer := "" + valCopy := new(big.Int).Abs(val) //copies big.Int + + if val.Cmp(big.NewInt(0)) <= 0 { //if it is less than 0, returns empty string + return oldBase58("") + } + + tmpStr := "" + tmp := new(big.Int) + for valCopy.Cmp(big.NewInt(0)) > 0 { //converts the number into base58 + tmp.Mod(valCopy, big.NewInt(58)) //takes modulo 58 value + valCopy.Div(valCopy, big.NewInt(58)) //divides the rest by 58 + tmpStr += alphabet[tmp.Int64() : tmp.Int64()+1] //encodes + } + for i := (len(tmpStr) - 1); i > -1; i-- { + answer += tmpStr[i : i+1] //reverses the order + } + return oldBase58(answer) //returns +} + +// oldHex2Base58 encodes hex bytes into base58 +func oldHex2Base58(val []byte) oldBase58 { + tmp := oldBig2Base58(oldHex2Big(val)) //encoding of the number without zeroes in front + + //looking for zeros at the beginning + i := 0 + for i = 0; val[i] == 0 && i < len(val); i++ { + } + answer := "" + for j := 0; j < i; j++ { //adds zeroes from the front + answer += alphabet[0:1] + } + answer += string(tmp) //concatenates + + return oldBase58(answer) //returns +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip32/LICENSE b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/LICENSE new file mode 100644 index 00000000..23d5c3ef --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip32/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2017 Tyler Smith +Copyright (c) 2019 Skycoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bip39/LICENSE b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/LICENSE new file mode 100644 index 00000000..1dc11de8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bip39/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Tyler Smith and contributors +Copyright (c) 2018-2019 Skycoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bitcoin.go b/vendor/github.com/skycoin/skycoin/src/cipher/bitcoin.go new file mode 100644 index 00000000..e601d5a2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bitcoin.go @@ -0,0 +1,195 @@ +package cipher + +import ( + "bytes" + "errors" + "log" + + "github.com/skycoin/skycoin/src/cipher/base58" +) + +var ( + // ErrInvalidLength Unexpected size of string or bytes buffer + ErrInvalidLength = errors.New("Invalid length") + // ErrBitcoinWIFInvalidFirstByte Unexpected value (!= 0x80) of first byte in Bitcoin Wallet Import Format + ErrBitcoinWIFInvalidFirstByte = errors.New("Bitcoin WIF: First byte invalid") + // ErrBitcoinWIFInvalidSuffix Unexpected value (!= 0x01) of 33rd byte in Bitcoin Wallet Import Format + ErrBitcoinWIFInvalidSuffix = errors.New("Bitcoin WIF: Invalid 33rd byte") + // ErrBitcoinWIFInvalidChecksum Invalid Checksum in Bitcoin WIF address + ErrBitcoinWIFInvalidChecksum = errors.New("Bitcoin WIF: Checksum fail") +) + +// BitcoinAddress is a bitcoin address +type BitcoinAddress struct { + Version byte // 1 byte + Key Ripemd160 // 20 byte pubkey hash +} + +// BitcoinPubKeyRipemd160 returns ripemd160(sha256(key)) +func BitcoinPubKeyRipemd160(pubKey PubKey) Ripemd160 { + r1 := SumSHA256(pubKey[:]) + return HashRipemd160(r1[:]) +} + +// BitcoinAddressFromPubKey creates a mainnet (version 0) BitcoinAddress from PubKey as ripemd160(sha256(pubkey))) +func BitcoinAddressFromPubKey(pubKey PubKey) BitcoinAddress { + return BitcoinAddress{ + Version: 0, + Key: BitcoinPubKeyRipemd160(pubKey), + } +} + +// BitcoinAddressFromSecKey generates a BitcoinAddress from SecKey +func BitcoinAddressFromSecKey(secKey SecKey) (BitcoinAddress, error) { + p, err := PubKeyFromSecKey(secKey) + if err != nil { + return BitcoinAddress{}, err + } + return BitcoinAddressFromPubKey(p), nil +} + +// MustBitcoinAddressFromSecKey generates a BitcoinAddress from SecKey, panics on error +func MustBitcoinAddressFromSecKey(secKey SecKey) BitcoinAddress { + return BitcoinAddressFromPubKey(MustPubKeyFromSecKey(secKey)) +} + +// DecodeBase58BitcoinAddress creates a BitcoinAddress from its base58 encoding +func DecodeBase58BitcoinAddress(addr string) (BitcoinAddress, error) { + b, err := base58.Decode(addr) + if err != nil { + return BitcoinAddress{}, err + } + return BitcoinAddressFromBytes(b) +} + +// MustDecodeBase58BitcoinAddress creates a BitcoinAddress from its base58 encoding, panics on error +func MustDecodeBase58BitcoinAddress(addr string) BitcoinAddress { + a, err := DecodeBase58BitcoinAddress(addr) + if err != nil { + log.Panicf("Invalid bitcoin address %s: %v", addr, err) + } + return a +} + +// BitcoinAddressFromBytes converts []byte to a BitcoinAddress. Only supports mainnet (version 0) addresses. +func BitcoinAddressFromBytes(b []byte) (BitcoinAddress, error) { + if len(b) != 20+1+4 { + return BitcoinAddress{}, ErrAddressInvalidLength + } + a := BitcoinAddress{} + copy(a.Key[0:20], b[1:21]) + a.Version = b[0] + + var checksum [4]byte + copy(checksum[0:4], b[21:25]) + + if checksum != a.Checksum() { + return BitcoinAddress{}, ErrAddressInvalidChecksum + } + + // BitcoinAddress only supports mainnet addresses for now + if a.Version != 0 { + return BitcoinAddress{}, ErrAddressInvalidVersion + } + + return a, nil +} + +// MustBitcoinAddressFromBytes converts []byte to a BitcoinAddress, panics on error +func MustBitcoinAddressFromBytes(b []byte) BitcoinAddress { + addr, err := BitcoinAddressFromBytes(b) + if err != nil { + log.Panic(err) + } + + return addr +} + +// Null returns true if the address is null (0x0000....) +func (addr BitcoinAddress) Null() bool { + return addr == BitcoinAddress{} +} + +// Bytes returns bitcoin address as byte slice +func (addr BitcoinAddress) Bytes() []byte { + b := make([]byte, 20+1+4) + b[0] = addr.Version + copy(b[1:21], addr.Key[0:20]) + chksum := addr.Checksum() + copy(b[21:25], chksum[0:4]) + return b +} + +// Verify checks that the bitcoin address appears valid for the public key +func (addr BitcoinAddress) Verify(key PubKey) error { + // BitcoinAddress only supports mainnet addresses for now + if addr.Version != 0x00 { + return ErrAddressInvalidVersion + } + if addr.Key != BitcoinPubKeyRipemd160(key) { + return ErrAddressInvalidPubKey + } + return nil +} + +// String convert bitcoin address to hex string +func (addr BitcoinAddress) String() string { + return string(base58.Encode(addr.Bytes())) +} + +// Checksum returns a bitcoin address Checksum which is the first 4 bytes of sha256(sha256(version+key)) +func (addr BitcoinAddress) Checksum() Checksum { + r1 := append([]byte{addr.Version}, addr.Key[:]...) + r2 := DoubleSHA256(r1[:]) + c := Checksum{} + copy(c[:], r2[:len(c)]) + return c +} + +// BitcoinWalletImportFormatFromSeckey exports seckey in wallet import format +// key must be compressed +func BitcoinWalletImportFormatFromSeckey(seckey SecKey) string { + b1 := append([]byte{byte(0x80)}, seckey[:]...) + b2 := append(b1[:], []byte{0x01}...) + b3 := DoubleSHA256(b2) //checksum + b4 := append(b2, b3[0:4]...) + return string(base58.Encode(b4)) +} + +// SecKeyFromBitcoinWalletImportFormat extracts a seckey from the bitcoin wallet import format +func SecKeyFromBitcoinWalletImportFormat(input string) (SecKey, error) { + b, err := base58.Decode(input) + if err != nil { + return SecKey{}, err + } + + //1+32+1+4 + if len(b) != 38 { + return SecKey{}, ErrInvalidLength + } + if b[0] != 0x80 { + return SecKey{}, ErrBitcoinWIFInvalidFirstByte + } + + if b[1+32] != 0x01 { + return SecKey{}, ErrBitcoinWIFInvalidSuffix + } + + b2 := DoubleSHA256(b[0:34]) + chksum := b[34:38] + + if !bytes.Equal(chksum, b2[0:4]) { + return SecKey{}, ErrBitcoinWIFInvalidChecksum + } + + return NewSecKey(b[1:33]) +} + +// MustSecKeyFromBitcoinWalletImportFormat extracts a seckey from the bitcoin wallet import format, panics on error +func MustSecKeyFromBitcoinWalletImportFormat(input string) SecKey { + seckey, err := SecKeyFromBitcoinWalletImportFormat(input) + if err != nil { + log.Panicf("MustSecKeyFromBitcoinWalletImportFormat, invalid seckey, %v", err) + } + return seckey +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go b/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go new file mode 100644 index 00000000..53bce1fe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go @@ -0,0 +1,713 @@ +/* +Package cipher implements cryptographic methods. + +These methods include: + +* Public and private key generation +* Address generation +* Signing + +Private keys are secp256k1 keys. Addresses are base58 encoded. + +All dependencies are either from the go stdlib, or are manually vendored +below this package. This manual vendoring ensures that the exact same dependencies +are used by any user of this package, regardless of their gopath. +*/ +package cipher + +import ( + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "hash" + "log" + "time" + + "github.com/skycoin/skycoin/src/cipher/ripemd160" + secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" +) + +var ( + // DebugLevel1 debug level one + DebugLevel1 = true //checks for extremely unlikely conditions (10e-40) + // DebugLevel2 debug level two + DebugLevel2 = true //enable checks for impossible conditions + + // ErrInvalidLengthPubKey Invalid public key length + ErrInvalidLengthPubKey = errors.New("Invalid public key length") + // ErrPubKeyFromNullSecKey Attempt to load null seckey, unsafe + ErrPubKeyFromNullSecKey = errors.New("Attempt to load null seckey, unsafe") + // ErrPubKeyFromBadSecKey PubKeyFromSecKey, pubkey recovery failed. Function + ErrPubKeyFromBadSecKey = errors.New("PubKeyFromSecKey, pubkey recovery failed. Function assumes seckey is valid. Check seckey") + // ErrInvalidLengthSecKey Invalid secret key length + ErrInvalidLengthSecKey = errors.New("Invalid secret key length") + // ErrECHDInvalidPubKey ECDH invalid pubkey input + ErrECHDInvalidPubKey = errors.New("ECDH invalid pubkey input") + // ErrECHDInvalidSecKey ECDH invalid seckey input + ErrECHDInvalidSecKey = errors.New("ECDH invalid seckey input") + // ErrInvalidLengthSig Invalid signature length + ErrInvalidLengthSig = errors.New("Invalid signature length") + // ErrInvalidPubKey Invalid public key + ErrInvalidPubKey = errors.New("Invalid public key") + // ErrInvalidSecKey Invalid secret key + ErrInvalidSecKey = errors.New("Invalid secret key") + // ErrNullSignHash Attempted to sign null hash digest + ErrNullSignHash = errors.New("Cannot sign null hash digest") + // ErrInvalidSig Invalid signature + ErrInvalidSig = errors.New("Invalid signature") + // ErrInvalidSigPubKeyRecovery could not recover pubkey from sig + ErrInvalidSigPubKeyRecovery = errors.New("Failed to recover pubkey from signature") + // ErrInvalidAddressForSig the address derived from the pubkey recovered from the signature does not match a provided address + ErrInvalidAddressForSig = errors.New("Address does not match recovered signing address") + // ErrInvalidHashForSig Signature invalid for hash + ErrInvalidHashForSig = errors.New("Signature not valid for hash") + // ErrPubKeyRecoverMismatch Recovered pubkey does not match pubkey + ErrPubKeyRecoverMismatch = errors.New("Recovered pubkey does not match pubkey") + // ErrInvalidSigInvalidPubKey VerifySignatureRecoverPubKey, secp256k1.VerifyPubkey failed + ErrInvalidSigInvalidPubKey = errors.New("VerifySignatureRecoverPubKey, secp256k1.VerifyPubkey failed") + // ErrInvalidSigValidity VerifySignatureRecoverPubKey, VerifySignatureValidity failed + ErrInvalidSigValidity = errors.New("VerifySignatureRecoverPubKey, VerifySignatureValidity failed") + // ErrInvalidSigForMessage Invalid signature for this message + ErrInvalidSigForMessage = errors.New("Invalid signature for this message") + // ErrInvalidSecKyVerification Seckey secp256k1 verification failed + ErrInvalidSecKyVerification = errors.New("Seckey verification failed") + // ErrNullPubKeyFromSecKey Impossible error, TestSecKey, nil pubkey recovered + ErrNullPubKeyFromSecKey = errors.New("impossible error, TestSecKey, nil pubkey recovered") + // ErrInvalidDerivedPubKeyFromSecKey impossible error, TestSecKey, Derived Pubkey verification failed + ErrInvalidDerivedPubKeyFromSecKey = errors.New("impossible error, TestSecKey, Derived Pubkey verification failed") + // ErrInvalidPubKeyFromHash Recovered pubkey does not match signed hash + ErrInvalidPubKeyFromHash = errors.New("Recovered pubkey does not match signed hash") + // ErrPubKeyFromSecKeyMismatch impossible error TestSecKey, pubkey does not match recovered pubkey + ErrPubKeyFromSecKeyMismatch = errors.New("impossible error TestSecKey, pubkey does not match recovered pubkey") + // ErrEmptySeed Seed input is empty + ErrEmptySeed = errors.New("Seed input is empty") +) + +// PubKey public key +type PubKey [33]byte + +// RandByte returns rand N bytes +func RandByte(n int) []byte { + return secp256k1.RandByte(n) +} + +// NewPubKey converts []byte to a PubKey +func NewPubKey(b []byte) (PubKey, error) { + p := PubKey{} + if len(b) != len(p) { + return PubKey{}, ErrInvalidLengthPubKey + } + copy(p[:], b[:]) + + if err := p.Verify(); err != nil { + return PubKey{}, err + } + + return p, nil +} + +// MustNewPubKey converts []byte to a PubKey, panics on error +func MustNewPubKey(b []byte) PubKey { + p, err := NewPubKey(b) + if err != nil { + log.Panic(err) + } + return p +} + +// PubKeyFromHex generates PubKey from hex string +func PubKeyFromHex(s string) (PubKey, error) { + b, err := hex.DecodeString(s) + if err != nil { + return PubKey{}, ErrInvalidPubKey + } + return NewPubKey(b) +} + +// MustPubKeyFromHex decodes a hex encoded PubKey, panics on error +func MustPubKeyFromHex(s string) PubKey { + b, err := hex.DecodeString(s) + if err != nil { + log.Panic(err) + } + return MustNewPubKey(b) +} + +// PubKeyFromSecKey recovers the public key for a secret key +func PubKeyFromSecKey(seckey SecKey) (PubKey, error) { + if seckey.Null() { + return PubKey{}, ErrPubKeyFromNullSecKey + } + + b := secp256k1.PubkeyFromSeckey(seckey[:]) + if b == nil { + return PubKey{}, ErrPubKeyFromBadSecKey + } + + return NewPubKey(b) +} + +// MustPubKeyFromSecKey recovers the public key for a secret key. Panics on error. +func MustPubKeyFromSecKey(seckey SecKey) PubKey { + pk, err := PubKeyFromSecKey(seckey) + if err != nil { + log.Panic(err) + } + return pk +} + +// PubKeyFromSig recovers the public key from a signed hash +func PubKeyFromSig(sig Sig, hash SHA256) (PubKey, error) { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return PubKey{}, ErrInvalidSigPubKeyRecovery + } + return NewPubKey(rawPubKey) +} + +// MustPubKeyFromSig recovers the public key from a signed hash, panics on error +func MustPubKeyFromSig(sig Sig, hash SHA256) PubKey { + pk, err := PubKeyFromSig(sig, hash) + if err != nil { + log.Panic(err) + } + return pk +} + +// Verify attempts to determine if pubkey is valid. Returns nil on success +func (pk PubKey) Verify() error { + if secp256k1.VerifyPubkey(pk[:]) != 1 { + return ErrInvalidPubKey + } + return nil +} + +// Hex returns a hex encoded PubKey string +func (pk PubKey) Hex() string { + return hex.EncodeToString(pk[:]) +} + +// Null returns true if PubKey is the null PubKey +func (pk PubKey) Null() bool { + return pk == PubKey{} +} + +// SecKey secret key +type SecKey [32]byte + +// NewSecKey converts []byte to a SecKey +func NewSecKey(b []byte) (SecKey, error) { + p := SecKey{} + if len(b) != len(p) { + return SecKey{}, ErrInvalidLengthSecKey + } + copy(p[:], b[:]) + + // Disable the DebugLevel2 check here because it is too slow. + // If desired, perform the full Verify() check after using this method + if err := p.verify(false); err != nil { + return SecKey{}, err + } + + return p, nil +} + +// MustNewSecKey converts []byte to a SecKey. Panics is []byte is not the exact size +func MustNewSecKey(b []byte) SecKey { + p, err := NewSecKey(b) + if err != nil { + log.Panic(err) + } + return p +} + +// MustSecKeyFromHex decodes a hex encoded SecKey, or panics +func MustSecKeyFromHex(s string) SecKey { + b, err := hex.DecodeString(s) + if err != nil { + log.Panic(err) + } + return MustNewSecKey(b) +} + +// SecKeyFromHex decodes a hex encoded SecKey, or panics +func SecKeyFromHex(s string) (SecKey, error) { + b, err := hex.DecodeString(s) + if err != nil { + return SecKey{}, ErrInvalidSecKey + } + return NewSecKey(b) +} + +// Verify attempts to determine if SecKey is valid. Returns nil on success. +// If DebugLevel2, will do additional sanity checking +func (sk SecKey) Verify() error { + return sk.verify(DebugLevel2) +} + +func (sk SecKey) verify(debugLevel2Check bool) error { + if secp256k1.VerifySeckey(sk[:]) != 1 { + return ErrInvalidSecKey + } + + if debugLevel2Check { + if err := CheckSecKey(sk); err != nil { + log.Panicf("DebugLevel2, WARNING CRYPTO ARMAGEDDON: %v", err) + } + } + + return nil +} + +// Hex returns a hex encoded SecKey string +func (sk SecKey) Hex() string { + return hex.EncodeToString(sk[:]) +} + +// Null returns true if SecKey is the null SecKey +func (sk SecKey) Null() bool { + return sk == SecKey{} +} + +//ECDH generates a shared secret +// A: pub1,sec1 +// B: pub2,sec2 +// person A sends their public key pub1 +// person B sends an emphameral pubkey pub2 +// person A computes cipher.ECDH(pub2, sec1) +// person B computes cipher.ECDH(pub1, sec2) +// cipher.ECDH(pub2, sec1) equals cipher.ECDH(pub1, sec2) +// This is their shared secret +func ECDH(pub PubKey, sec SecKey) ([]byte, error) { + if err := pub.Verify(); err != nil { + return nil, ErrECHDInvalidPubKey + } + + // Don't perform the DebugLevel2 verification check for the secret key, + // it is too slow to use in an ECDH context and is not important for that use case + if err := sec.verify(false); err != nil { + return nil, ErrECHDInvalidSecKey + } + + buff := secp256k1.ECDH(pub[:], sec[:]) + ret := SumSHA256(buff) // hash this so they cant screw up + return ret[:], nil +} + +// MustECDH calls ECDH and panics on error +func MustECDH(pub PubKey, sec SecKey) []byte { + r, err := ECDH(pub, sec) + if err != nil { + log.Panic(err) + } + return r +} + +// Sig signature +type Sig [64 + 1]byte //64 byte signature with 1 byte for key recovery + +// NewSig converts []byte to a Sig +func NewSig(b []byte) (Sig, error) { + s := Sig{} + if len(b) != len(s) { + return Sig{}, ErrInvalidLengthSig + } + copy(s[:], b[:]) + return s, nil +} + +// MustNewSig converts []byte to a Sig. Panics is []byte is not the exact size +func MustNewSig(b []byte) Sig { + s := Sig{} + if len(b) != len(s) { + log.Panic("Invalid signature length") + } + copy(s[:], b[:]) + return s +} + +// SigFromHex converts a hex string to a signature +func SigFromHex(s string) (Sig, error) { + b, err := hex.DecodeString(s) + if err != nil { + return Sig{}, ErrInvalidSig + } + return NewSig(b) +} + +// MustSigFromHex converts a hex string to a signature, panics on error +func MustSigFromHex(s string) Sig { + sig, err := SigFromHex(s) + if err != nil { + log.Panic(err) + } + return sig +} + +func (s Sig) String() string { + return s.Hex() +} + +// Null returns true if the Sig is a null Sig +func (s Sig) Null() bool { + return s == Sig{} +} + +// Hex converts signature to hex string +func (s Sig) Hex() string { + return hex.EncodeToString(s[:]) +} + +// SignHash sign hash +func SignHash(hash SHA256, sec SecKey) (Sig, error) { + if secp256k1.VerifySeckey(sec[:]) != 1 { + // Can't use sec.Verify() because that calls SignHash again, with DebugLevel2 set + return Sig{}, ErrInvalidSecKey + } + + // Null hashes can't be signed + if hash.Null() { + return Sig{}, ErrNullSignHash + } + + s := secp256k1.Sign(hash[:], sec[:]) + + sig, err := NewSig(s) + if err != nil { + return Sig{}, err + } + + if DebugLevel2 || DebugLevel1 { + // Guard against coin loss; + // if the generated signature is somehow invalid, coins would be lost, + // make sure that the signature is valid + pubkey, err := PubKeyFromSig(sig, hash) + if err != nil { + log.Panic("SignHash error: pubkey from sig recovery failure") + } + if VerifyPubKeySignedHash(pubkey, sig, hash) != nil { + log.Panic("SignHash error: secp256k1.Sign returned non-null invalid non-null signature") + } + if VerifyAddressSignedHash(AddressFromPubKey(pubkey), sig, hash) != nil { + log.Panic("SignHash error: VerifyAddressSignedHash failed for signature") + } + } + + return sig, nil +} + +// MustSignHash sign hash, panics on error +func MustSignHash(hash SHA256, sec SecKey) Sig { + sig, err := SignHash(hash, sec) + if err != nil { + log.Panic(err) + } + return sig +} + +// VerifyAddressSignedHash checks whether PubKey corresponding to address hash signed hash +// - recovers the PubKey from sig and hash +// - fail if PubKey cannot be be recovered +// - computes the address from the PubKey +// - fail if recovered address does not match PubKey hash +// - verify that signature is valid for hash for PubKey +func VerifyAddressSignedHash(address Address, sig Sig, hash SHA256) error { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return ErrInvalidSigPubKeyRecovery + } + + pubKey, err := NewPubKey(rawPubKey) + if err != nil { + return err + } + + if address != AddressFromPubKey(pubKey) { + return ErrInvalidAddressForSig + } + + if secp256k1.VerifySignature(hash[:], sig[:], rawPubKey[:]) != 1 { + return ErrInvalidHashForSig + } + + return nil +} + +// VerifyPubKeySignedHash verifies that hash was signed by PubKey +func VerifyPubKeySignedHash(pubkey PubKey, sig Sig, hash SHA256) error { + pubkeyRec, err := PubKeyFromSig(sig, hash) // recovered pubkey + if err != nil { + return ErrInvalidSigPubKeyRecovery + } + if pubkeyRec != pubkey { + return ErrPubKeyRecoverMismatch + } + if secp256k1.VerifyPubkey(pubkey[:]) != 1 { + if DebugLevel2 { + if secp256k1.VerifySignature(hash[:], sig[:], pubkey[:]) == 1 { + log.Panic("VerifyPubKeySignedHash warning, invalid pubkey is valid for signature") + } + } + return ErrInvalidSigInvalidPubKey + } + if secp256k1.VerifySignatureValidity(sig[:]) != 1 { + return ErrInvalidSigValidity + } + if secp256k1.VerifySignature(hash[:], sig[:], pubkey[:]) != 1 { + return ErrInvalidSigForMessage + } + return nil +} + +// VerifySignatureRecoverPubKey this only checks that the signature can be converted to a public key. +// It does not check that the signature signed the hash. +// The original public key or address is required to verify that the signature signed the hash. +func VerifySignatureRecoverPubKey(sig Sig, hash SHA256) error { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return ErrInvalidSigPubKeyRecovery + } + if secp256k1.VerifySignature(hash[:], sig[:], rawPubKey) != 1 { + // This should always pass; the recovered pubkey should always be valid + return ErrInvalidHashForSig + } + return nil +} + +// GenerateKeyPair creates key pair +func GenerateKeyPair() (PubKey, SecKey) { + public, secret := secp256k1.GenerateKeyPair() + + secKey, err := NewSecKey(secret) + if err != nil { + log.Panicf("GenerateKeyPair: secp256k1.GenerateKeyPair returned invalid secKey: %v", err) + } + + pubKey, err := NewPubKey(public) + if err != nil { + log.Panicf("GenerateKeyPair: secp256k1.GenerateKeyPair returned invalid pubKey: %v", err) + } + + if DebugLevel1 { + if err := CheckSecKey(secKey); err != nil { + log.Panicf("DebugLevel1, GenerateKeyPair, generated private key failed CheckSecKey: %v", err) + } + + if MustPubKeyFromSecKey(secKey) != pubKey { + log.Panic("DebugLevel1, GenerateKeyPair, public key does not match private key") + } + } + + return pubKey, secKey +} + +// GenerateDeterministicKeyPair generates deterministic key pair +func GenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey, error) { + if len(seed) == 0 { + return PubKey{}, SecKey{}, ErrEmptySeed + } + + public, secret := secp256k1.GenerateDeterministicKeyPair(seed) + + secKey, err := NewSecKey(secret) + if err != nil { + log.Panicf("GenerateDeterministicKeyPair: secp256k1.GenerateDeterministicKeyPair returned invalid secKey: %v", err) + } + + pubKey, err := NewPubKey(public) + if err != nil { + log.Panicf("GenerateDeterministicKeyPair: secp256k1.GenerateDeterministicKeyPair returned invalid pubKey: %v", err) + } + + if DebugLevel1 { + if err := CheckSecKey(secKey); err != nil { + log.Panicf("DebugLevel1, GenerateDeterministicKeyPair, CheckSecKey failed: %v", err) + } + + if MustPubKeyFromSecKey(secKey) != pubKey { + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, public key does not match private key") + } + } + + return pubKey, secKey, nil +} + +// MustGenerateDeterministicKeyPair generates deterministic key pair, panics on error +func MustGenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey) { + p, s, err := GenerateDeterministicKeyPair(seed) + if err != nil { + log.Panic(err) + } + return p, s +} + +// DeterministicKeyPairIterator takes SHA256 value, returns a new +// SHA256 value and publickey and private key. Apply multiple times +// feeding the SHA256 value back into generate sequence of keys +func DeterministicKeyPairIterator(seed []byte) ([]byte, PubKey, SecKey, error) { + if len(seed) == 0 { + return nil, PubKey{}, SecKey{}, ErrEmptySeed + } + + hash, public, secret := secp256k1.DeterministicKeyPairIterator(seed) + + secKey := MustNewSecKey(secret) + pubKey := MustNewPubKey(public) + + if DebugLevel1 { + if err := CheckSecKey(secKey); err != nil { + log.Panicf("DebugLevel1, DeterministicKeyPairIterator, CheckSecKey failed: %v", err) + } + + if MustPubKeyFromSecKey(secKey) != pubKey { + log.Panic("DebugLevel1, DeterministicKeyPairIterator, public key does not match private key") + } + } + + return hash, pubKey, secKey, nil +} + +// MustDeterministicKeyPairIterator takes SHA256 value, returns a new +// SHA256 value and publickey and private key. Apply multiple times +// feeding the SHA256 value back into generate sequence of keys, panics on error +func MustDeterministicKeyPairIterator(seed []byte) ([]byte, PubKey, SecKey) { + hash, p, s, err := DeterministicKeyPairIterator(seed) + if err != nil { + log.Panic(err) + } + return hash, p, s +} + +// GenerateDeterministicKeyPairs returns sequence of n private keys from initial seed +func GenerateDeterministicKeyPairs(seed []byte, n int) ([]SecKey, error) { + _, keys, err := GenerateDeterministicKeyPairsSeed(seed, n) + return keys, err +} + +// MustGenerateDeterministicKeyPairs returns sequence of n private keys from initial seed, panics on error +func MustGenerateDeterministicKeyPairs(seed []byte, n int) []SecKey { + keys, err := GenerateDeterministicKeyPairs(seed, n) + if err != nil { + log.Panic(err) + } + return keys +} + +// GenerateDeterministicKeyPairsSeed returns sequence of n private keys from initial seed, and return the new seed +func GenerateDeterministicKeyPairsSeed(seed []byte, n int) ([]byte, []SecKey, error) { + var keys []SecKey + var seckey SecKey + for i := 0; i < n; i++ { + var err error + seed, _, seckey, err = DeterministicKeyPairIterator(seed) + if err != nil { + return nil, nil, err + } + keys = append(keys, seckey) + } + return seed, keys, nil +} + +// MustGenerateDeterministicKeyPairsSeed returns sequence of n private keys from initial seed, and return the new seed +func MustGenerateDeterministicKeyPairsSeed(seed []byte, n int) ([]byte, []SecKey) { + newSeed, keys, err := GenerateDeterministicKeyPairsSeed(seed, n) + if err != nil { + log.Panic(err) + } + return newSeed, keys +} + +// CheckSecKey test seckey hash +func CheckSecKey(seckey SecKey) error { + hash := SumSHA256([]byte(time.Now().String())) + return CheckSecKeyHash(seckey, hash) +} + +// CheckSecKeyHash performs a series of tests to determine if a seckey is valid. +// All generated keys and keys loaded from disc must pass the CheckSecKey suite. +// TestPrivKey returns error if a key fails any test in the test suite. +func CheckSecKeyHash(seckey SecKey, hash SHA256) error { + // check seckey with verify + if secp256k1.VerifySeckey(seckey[:]) != 1 { + return ErrInvalidSecKyVerification + } + + // check pubkey recovery + pubkey, err := PubKeyFromSecKey(seckey) + if err != nil { + return fmt.Errorf("PubKeyFromSecKey failed: %v", err) + } + if pubkey == (PubKey{}) { + return ErrNullPubKeyFromSecKey + } + // verify recovered pubkey + if secp256k1.VerifyPubkey(pubkey[:]) != 1 { + return ErrInvalidDerivedPubKeyFromSecKey + } + + // check signature production + sig, err := SignHash(hash, seckey) + if err != nil { + return fmt.Errorf("SignHash failed: %v", err) + } + + pubkey2, err := PubKeyFromSig(sig, hash) + if err != nil { + return fmt.Errorf("PubKeyFromSig failed: %v", err) + } + if pubkey != pubkey2 { + return ErrInvalidPubKeyFromHash + } + + // check pubkey recovered from sig + recoveredPubkey, err := PubKeyFromSig(sig, hash) + if err != nil { + return fmt.Errorf("impossible error, CheckSecKeyHash, pubkey recovery from signature failed: %v", err) + } + if pubkey != recoveredPubkey { + return ErrPubKeyFromSecKeyMismatch + } + + // verify produced signature + err = VerifyPubKeySignedHash(pubkey, sig, hash) + if err != nil { + return fmt.Errorf("impossible error, CheckSecKeyHash, VerifyPubKeySignedHash failed for sig: %v", err) + } + + // verify VerifyAddressSignedHash + addr := AddressFromPubKey(pubkey) + err = VerifyAddressSignedHash(addr, sig, hash) + if err != nil { + return fmt.Errorf("impossible error CheckSecKeyHash, VerifyAddressSignedHash Failed, should not get this far: %v", err) + } + + // verify VerifySignatureRecoverPubKey + err = VerifySignatureRecoverPubKey(sig, hash) + if err != nil { + return fmt.Errorf("VerifySignatureRecoverPubKey failed: %v", err) + } + + return nil +} + +func init() { + ripemd160HashPool = make(chan hash.Hash, ripemd160HashPoolSize) + for i := 0; i < ripemd160HashPoolSize; i++ { + ripemd160HashPool <- ripemd160.New() + } + + sha256HashPool = make(chan hash.Hash, sha256HashPoolSize) + for i := 0; i < sha256HashPoolSize; i++ { + sha256HashPool <- sha256.New() + } + + // Do not allow program to start if crypto tests fail + pubkey, seckey := GenerateKeyPair() + if err := CheckSecKey(seckey); err != nil { + log.Panicf("CRYPTOGRAPHIC INTEGRITY CHECK FAILED: TERMINATING PROGRAM TO PROTECT COINS: %v", err) + } + if MustPubKeyFromSecKey(seckey) != pubkey { + log.Panic("DebugLevel1, GenerateKeyPair, public key does not match private key") + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/hash.go b/vendor/github.com/skycoin/skycoin/src/cipher/hash.go new file mode 100644 index 00000000..039cf6a4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/hash.go @@ -0,0 +1,208 @@ +package cipher + +import ( + "encoding/hex" + "errors" + "hash" + "log" +) + +var ( + // Memory pool for hashes + sha256HashPoolSize = 30 + sha256HashPool chan hash.Hash + ripemd160HashPoolSize = 30 + ripemd160HashPool chan hash.Hash +) + +var ( + // ErrInvalidLengthRipemd160 Invalid ripemd160 length + ErrInvalidLengthRipemd160 = errors.New("Invalid ripemd160 length") + // ErrInvalidLengthSHA256 Invalid sha256 length + ErrInvalidLengthSHA256 = errors.New("Invalid sha256 length") + // ErrInvalidHexLength Invalid hex length + ErrInvalidHexLength = errors.New("Invalid hex length") + // ErrInvalidBytesLength Invalid bytes length + ErrInvalidBytesLength = errors.New("Invalid bytes length") +) + +// Ripemd160 ripemd160 +type Ripemd160 [20]byte + +// MustSet sets value, panics on error +func (rd *Ripemd160) MustSet(b []byte) { + if len(b) != 20 { + log.Panic(ErrInvalidLengthRipemd160) + } + copy(rd[:], b[:]) +} + +// Set sets value +func (rd *Ripemd160) Set(b []byte) error { + if len(b) != 20 { + return ErrInvalidLengthRipemd160 + } + copy(rd[:], b[:]) + return nil +} + +// Ripemd160FromBytes converts []byte to Ripemd160 +func Ripemd160FromBytes(b []byte) (Ripemd160, error) { + h := Ripemd160{} + err := h.Set(b) + return h, err +} + +// MustRipemd160FromBytes converts []byte to Ripemd160, panics on error +func MustRipemd160FromBytes(b []byte) Ripemd160 { + h := Ripemd160{} + h.MustSet(b) + return h +} + +// HashRipemd160 hash data to Ripemd160 +func HashRipemd160(data []byte) Ripemd160 { + ripemd160Hash := <-ripemd160HashPool + ripemd160Hash.Reset() + // ripemd160.Write never returns an error + ripemd160Hash.Write(data) //nolint:errcheck + sum := ripemd160Hash.Sum(nil) + ripemd160HashPool <- ripemd160Hash + + h := Ripemd160{} + h.MustSet(sum) + return h +} + +// SHA256 32 bytes +type SHA256 [32]byte + +// MustSet sets value, panics on error +func (g *SHA256) MustSet(b []byte) { + if len(b) != 32 { + panic(ErrInvalidLengthSHA256) + } + copy(g[:], b[:]) +} + +// Set sets value +func (g *SHA256) Set(b []byte) error { + if len(b) != 32 { + return ErrInvalidLengthSHA256 + } + copy(g[:], b[:]) + return nil +} + +func (g SHA256) String() string { + return g.Hex() +} + +// Hex encode SHA256 to hex string +func (g SHA256) Hex() string { + return hex.EncodeToString(g[:]) +} + +// Null returns true if the hash is null (0x0000..) +func (g SHA256) Null() bool { + return g == SHA256{} +} + +// Xor xor +func (g *SHA256) Xor(b SHA256) SHA256 { + c := SHA256{} + for i := 0; i < 32; i++ { + c[i] = g[i] ^ b[i] + } + return c +} + +// SHA256FromHex decodes a hex encoded SHA256 hash to bytes +func SHA256FromHex(hs string) (SHA256, error) { + h := SHA256{} + b, err := hex.DecodeString(hs) + if err != nil { + return h, err + } + if len(b) != len(h) { + return h, ErrInvalidHexLength + } + h.MustSet(b) + return h, nil +} + +// MustSHA256FromHex decodes a hex encoded SHA256 hash to bytes, panics on error +func MustSHA256FromHex(hs string) SHA256 { + h, err := SHA256FromHex(hs) + if err != nil { + log.Panic(err) + } + return h +} + +// SHA256FromBytes converts []byte to SHA256 +func SHA256FromBytes(b []byte) (SHA256, error) { + h := SHA256{} + err := h.Set(b) + return h, err +} + +// MustSHA256FromBytes converts []byte to SHA256, panics on error +func MustSHA256FromBytes(b []byte) SHA256 { + h := SHA256{} + h.MustSet(b) + return h +} + +// SumSHA256 sum sha256 +func SumSHA256(b []byte) SHA256 { + sha256Hash := <-sha256HashPool + sha256Hash.Reset() + // sha256.Write never returns an error + sha256Hash.Write(b) //nolint:errcheck + sum := sha256Hash.Sum(nil) + sha256HashPool <- sha256Hash + + h := SHA256{} + h.MustSet(sum) + return h +} + +// DoubleSHA256 double SHA256 +func DoubleSHA256(b []byte) SHA256 { + h1 := SumSHA256(b) + h2 := SumSHA256(h1[:]) + return h2 +} + +// AddSHA256 returns the SHA256 hash of to two concatenated hashes +func AddSHA256(a SHA256, b SHA256) SHA256 { + c := append(a[:], b[:]...) + return SumSHA256(c) +} + +// Returns the next highest power of 2 above n, if n is not already a +// power of 2 +func nextPowerOfTwo(n uint64) uint64 { + var k uint64 = 1 + for k < n { + k *= 2 + } + return k +} + +// Merkle computes the merkle root of a hash array +// Array of hashes is padded with 0 hashes until next power of 2 +func Merkle(h0 []SHA256) SHA256 { + lh := uint64(len(h0)) + np := nextPowerOfTwo(lh) + h1 := append(h0, make([]SHA256, np-lh)...) + for len(h1) != 1 { + h2 := make([]SHA256, len(h1)/2) + for i := 0; i < len(h2); i++ { + h2[i] = AddSHA256(h1[2*i], h1[2*i+1]) + } + h1 = h2 + } + return h1[0] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripemd160block.go b/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripemd160block.go new file mode 100644 index 00000000..2f45a532 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripemd160block.go @@ -0,0 +1,161 @@ +// 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. + +// RIPEMD-160 block step. +// In its own file so that a faster assembly or C version +// can be substituted easily. + +package ripemd160 + +// work buffer indices and roll amounts for one line +var _n = [80]uint{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13, +} + +var _r = [80]uint{ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6, +} + +// same for the other parallel one +var n_ = [80]uint{ //nolint:golint + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11, +} + +var r_ = [80]uint{ //nolint:golint + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11, +} + +func _Block(md *digest, p []byte) int { + n := 0 + var x [16]uint32 + var alpha, beta uint32 + for len(p) >= BlockSize { + a, b, c, d, e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4] + aa, bb, cc, dd, ee := a, b, c, d, e + j := 0 + for i := 0; i < 16; i++ { + x[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24 + j += 4 + } + + // round 1 + i := 0 + for i < 16 { + alpha = a + (b ^ c ^ d) + x[_n[i]] + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 2 + for i < 32 { + alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 3 + for i < 48 { + alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 4 + for i < 64 { + alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 5 + for i < 80 { + alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // combine results + dd += c + md.s[1] + md.s[1] = md.s[2] + d + ee + md.s[2] = md.s[3] + e + aa + md.s[3] = md.s[4] + a + bb + md.s[4] = md.s[0] + b + cc + md.s[0] = dd + + p = p[BlockSize:] + n += BlockSize + } + return n +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripmd_160.go b/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripmd_160.go new file mode 100644 index 00000000..d406bbfe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripmd_160.go @@ -0,0 +1,121 @@ +// 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 ripemd160 implements the RIPEMD-160 hash algorithm. +package ripemd160 + +// RIPEMD-160 is designed by by Hans Dobbertin, Antoon Bosselaers, and Bart +// Preneel with specifications available at: +// http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf. + +import ( + "crypto" + "hash" +) + +func init() { + crypto.RegisterHash(crypto.RIPEMD160, New) +} + +// Size is the size of the checksum in bytes. +const Size = 20 + +// BlockSize is the block size of the hash algorithm in bytes. +const BlockSize = 64 + +const ( + _s0 = 0x67452301 + _s1 = 0xefcdab89 + _s2 = 0x98badcfe + _s3 = 0x10325476 + _s4 = 0xc3d2e1f0 +) + +// digest represents the partial evaluation of a checksum. +type digest struct { + s [5]uint32 // running context + x [BlockSize]byte // temporary buffer + nx int // index into x + tc uint64 // total count of bytes processed +} + +func (d *digest) Reset() { + d.s[0], d.s[1], d.s[2], d.s[3], d.s[4] = _s0, _s1, _s2, _s3, _s4 + d.nx = 0 + d.tc = 0 +} + +// New returns a new hash.Hash computing the checksum. +func New() hash.Hash { + result := new(digest) + result.Reset() + return result +} + +func (d *digest) Size() int { return Size } + +func (d *digest) BlockSize() int { return BlockSize } + +func (d *digest) Write(p []byte) (nn int, err error) { + nn = len(p) + d.tc += uint64(nn) + if d.nx > 0 { + n := len(p) + if n > BlockSize-d.nx { + n = BlockSize - d.nx + } + for i := 0; i < n; i++ { + d.x[d.nx+i] = p[i] + } + d.nx += n + if d.nx == BlockSize { + _Block(d, d.x[0:]) + d.nx = 0 + } + p = p[n:] + } + n := _Block(d, p) + p = p[n:] + if len(p) > 0 { + d.nx = copy(d.x[:], p) + } + return +} + +func (d0 *digest) Sum(in []byte) []byte { //nolint:golint + // Make a copy of d0 so that caller can keep writing and summing. + d := *d0 + + // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. + tc := d.tc + var tmp [64]byte + tmp[0] = 0x80 + if tc%64 < 56 { + + d.Write(tmp[0 : 56-tc%64]) //nolint:errcheck,gosec + } else { + d.Write(tmp[0 : 64+56-tc%64]) //nolint:errcheck,gosec + } + + // Length in bits. + tc <<= 3 + for i := uint(0); i < 8; i++ { + tmp[i] = byte(tc >> (8 * i)) + } + d.Write(tmp[0:8]) //nolint:errcheck,gosec + + if d.nx != 0 { + panic("d.nx != 0") + } + + var digest [Size]byte + for i, s := range d.s { + digest[i*4] = byte(s) + digest[i*4+1] = byte(s >> 8) + digest[i*4+2] = byte(s >> 16) + digest[i*4+3] = byte(s >> 24) + } + + return append(in, digest[:]...) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256_rand.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256_rand.go new file mode 100644 index 00000000..3a785a9e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256_rand.go @@ -0,0 +1,151 @@ +package secp256k1 + +import ( + crand "crypto/rand" // secure, system random number generator + "crypto/sha256" + "hash" + "io" + "log" + "os" + "strconv" + "strings" + "sync" + "time" +) + +var ( + // Memory pool for SHA256 hashes + sha256HashPoolSize = 30 + sha256HashPool chan hash.Hash +) + +// SumSHA256 sum sha256 +func SumSHA256(b []byte) []byte { + sha256Hash := <-sha256HashPool + sha256Hash.Reset() + // sha256.Write never returns an error + sha256Hash.Write(b) //nolint:errcheck + sum := sha256Hash.Sum(nil) + sha256HashPool <- sha256Hash + return sum[:] +} + +/* +Entropy pool needs +- state (an array of bytes) +- a compression function (two 256 bit blocks to single block) +- a mixing function across the pool + +- Xor is safe, as it cannot make value less random +-- apply compression function, then xor with current value +-- + +*/ + +// EntropyPool entropy pool +type EntropyPool struct { + Ent [32]byte // 256 bit accumulator + lock sync.Mutex +} + +// Mix256 mixes in 256 bits, outputs 256 bits +func (ep *EntropyPool) Mix256(in []byte) (out []byte) { + // hash input + val1 := SumSHA256(in) + // return value + ep.lock.Lock() + val2 := SumSHA256(append(val1, ep.Ent[:]...)) + // next ent value + val3 := SumSHA256(append(val1, val2...)) + + for i := 0; i < 32; i++ { + ep.Ent[i] = val3[i] + val3[i] = 0x00 + } + ep.lock.Unlock() + + return val2 +} + +// Mix take in N bytes, salts, return N +func (ep *EntropyPool) Mix(in []byte) []byte { + length := len(in) - len(in)%32 + 32 + buff := make([]byte, length) + for i := 0; i < len(in); i++ { + buff[i] = in[i] + } + iterations := (len(in) / 32) + 1 + for i := 0; i < iterations; i++ { + tmp := ep.Mix256(buff[32*i : 32+32*i]) //32 byte slice + for j := 0; j < 32; j++ { + buff[i*32+j] = tmp[j] + } + } + return buff[:len(in)] +} + +/* +Note: + +- On windows cryto/rand uses CrytoGenRandom which uses RC4 which is insecure +- Android random number generator is known to be insecure. +- Linux uses /dev/urandom , which is thought to be secure and uses entropy pool + +Therefore the output is salted. +*/ + +/* +Note: + +Should allow pseudo-random mode for repeatability for certain types of tests +*/ + +var _ent EntropyPool + +// seed pseudo random number generator with +// - hash of system time in nano seconds +// - hash of system environmental variables +// - hash of process id +func init() { + // init the hash reuse pool + sha256HashPool = make(chan hash.Hash, sha256HashPoolSize) + for i := 0; i < sha256HashPoolSize; i++ { + sha256HashPool <- sha256.New() + } + + seed1 := []byte(strconv.FormatUint(uint64(time.Now().UnixNano()), 16)) + seed2 := []byte(strings.Join(os.Environ(), "")) + seed3 := []byte(strconv.FormatUint(uint64(os.Getpid()), 16)) + + seed4 := make([]byte, 256) + _, err := io.ReadFull(crand.Reader, seed4) // system secure random number generator + if err != nil { + log.Panic(err) + } + + // seed entropy pool + _ent.Mix256(seed1) + _ent.Mix256(seed2) + _ent.Mix256(seed3) + _ent.Mix256(seed4) +} + +// RandByte Secure Random number generator for forwards security +// On Unix-like systems, Reader reads from /dev/urandom. +// On Windows systems, Reader uses the CryptGenRandom API. +// Pseudo-random sequence, seeded from program start time, environmental variables, +// and process id is mixed in for forward security. Future version should use entropy pool +func RandByte(n int) []byte { + buff := make([]byte, n) + _, err := io.ReadFull(crand.Reader, buff) // system secure random number generator + if err != nil { + log.Panic(err) + } + + // XORing in sequence, cannot reduce security (even if sequence is bad/known/non-random) + buff2 := _ent.Mix(buff) + for i := 0; i < n; i++ { + buff[i] ^= buff2[i] + } + return buff +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING new file mode 100644 index 00000000..a7fd60bb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING @@ -0,0 +1,4 @@ +This single package (secp256k1) is distributed with the same license as +the original C implementation by sipa: + + * https://github.com/bitcoin/secp256k1/blob/master/COPYING diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go new file mode 100644 index 00000000..0ade1604 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go @@ -0,0 +1,202 @@ +package secp256k1go + +import ( + "bytes" + "log" +) + +// DecompressPoint decompresses point +func DecompressPoint(X []byte, off bool, Y []byte) { + var rx, ry, c, x2, x3 Field + rx.SetB32(X) + rx.Sqr(&x2) + rx.Mul(&x3, &x2) + c.SetInt(7) + c.SetAdd(&x3) + c.Sqrt(&ry) + ry.Normalize() + if ry.IsOdd() != off { + ry.Negate(&ry, 1) + } + ry.Normalize() + ry.GetB32(Y) +} + +// RecoverPublicKey recovers a public key from a signature and the message it signed. +// Returns nil on error with an int error code. Returns 1 on success. +func RecoverPublicKey(sigBytes, msgBytes []byte, recid int) ([]byte, int) { + if len(sigBytes) != 64 { + log.Panic("must pass in 64 byte pubkey") + } + + var pubkey XY + var sig Signature + var msg Number + + sig.ParseBytes(sigBytes[0:64]) + + if sig.R.Sign() <= 0 || sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + if sig.R.Sign() == 0 { + return nil, -1 + } + if sig.R.Sign() <= 0 { + return nil, -2 + } + if sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + return nil, -3 + } + return nil, -4 + } + if sig.S.Sign() <= 0 || sig.S.Cmp(&TheCurve.Order.Int) >= 0 { + return nil, -5 + } + + msg.SetBytes(msgBytes) + if !sig.Recover(&pubkey, &msg, recid) { + return nil, -6 + } + + return pubkey.Bytes(), 1 +} + +// Multiply standard EC multiplication k(xy) +// xy is the compressed public key format (33 bytes long) +func Multiply(xy, k []byte) []byte { + var pk XY + var xyz XYZ + var na, nzero Number + if err := pk.ParsePubkey(xy); err != nil { + return nil + } + xyz.SetXY(&pk) + na.SetBytes(k) + xyz.ECmult(&xyz, &na, &nzero) + pk.SetXYZ(&xyz) + + if !pk.IsValid() { + log.Panic("Multiply pk is invalid") + } + return pk.Bytes() +} + +// pubkeyTest panics if assumptions about pubkey are violated +func pubkeyTest(pk XY) { + if !pk.IsValid() { + log.Panic("IMPOSSIBLE3: pubkey invalid") + } + var pk2 XY + if err := pk2.ParsePubkey(pk.Bytes()); err != nil { + log.Panicf("IMPOSSIBLE2: parse failed: %v", err) + } + if !pk2.IsValid() { + log.Panic("IMPOSSIBLE3: parse failed non valid key") + } + if PubkeyIsValid(pk2.Bytes()) != 1 { + log.Panic("IMPOSSIBLE4: pubkey failed") + } +} + +// BaseMultiply base multiply +func BaseMultiply(k []byte) []byte { + var n Number + var pk XY + n.SetBytes(k) + r := ECmultGen(n) + pk.SetXYZ(&r) + if !pk.IsValid() { + log.Panic("BaseMultiply pk is invalid") + } + + pubkeyTest(pk) + + return pk.Bytes() +} + +// BaseMultiplyAdd computes G*k + xy +// Returns 33 bytes out (compressed pubkey). +func BaseMultiplyAdd(xy, k []byte) []byte { + var n Number + var pk XY + if err := pk.ParsePubkey(xy); err != nil { + return nil + } + n.SetBytes(k) + r := ECmultGen(n) + r.AddXY(&r, &pk) + pk.SetXYZ(&r) + + pubkeyTest(pk) + return pk.Bytes() +} + +// GeneratePublicKey generates a public key from secret key bytes. +// The secret key must 32 bytes. +func GeneratePublicKey(k []byte) []byte { + if len(k) != 32 { + log.Panic("secret key length must be 32 bytes") + } + var n Number + var pk XY + + // must not be zero + // must not be negative + // must be less than order of curve + n.SetBytes(k) + if n.Sign() <= 0 || n.Cmp(&TheCurve.Order.Int) >= 0 { + log.Panic("only call for valid seckey, check that seckey is valid first") + return nil + } + r := ECmultGen(n) + pk.SetXYZ(&r) + if !pk.IsValid() { + log.Panic("public key derived from secret key is unexpectedly valid") + } + pubkeyTest(pk) + return pk.Bytes() +} + +// SeckeyIsValid 1 on success +// Must be 32 bytes +// Must not be zero +// Must not be negative +// Must be less than order of curve +// The probability of any 32 bytes being an invalid secret key is ~2^-128 +func SeckeyIsValid(seckey []byte) int { + if len(seckey) != 32 { + log.Panic("SeckeyIsValid seckey must be 32 bytes") + } + var n Number + n.SetBytes(seckey) + // must not be zero + // must not be negative + // must be less than order of curve + if n.Sign() <= 0 { + return -1 + } + if n.Cmp(&TheCurve.Order.Int) >= 0 { + return -2 + } + return 1 +} + +// PubkeyIsValid returns 1 on success +func PubkeyIsValid(pubkey []byte) int { + if len(pubkey) != 33 { + log.Panic("public key length must be 33 bytes") + return -2 + } + var pubkey1 XY + if err := pubkey1.ParsePubkey(pubkey); err != nil { + return -1 + } + + if !bytes.Equal(pubkey1.Bytes(), pubkey) { + log.Panic("pubkey parses but serialize/deserialize roundtrip fails") + } + + if !pubkey1.IsValid() { + return -3 // invalid, point is infinity or some other problem + } + + return 1 +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go new file mode 100644 index 00000000..1be6c817 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go @@ -0,0 +1,738 @@ +package secp256k1go + +import ( + "encoding/hex" + "math/big" +) + +// Field represents the signature field +type Field struct { + n [10]uint32 +} + +// String returns the hex string of the field +func (fd *Field) String() string { + var tmp [32]byte + b := *fd + b.Normalize() + b.GetB32(tmp[:]) + return hex.EncodeToString(tmp[:]) +} + +// GetBig returns big int +func (fd *Field) GetBig() (r *big.Int) { + fd.Normalize() + r = new(big.Int) + var tmp [32]byte + fd.GetB32(tmp[:]) + r.SetBytes(tmp[:]) + return +} + +// SetB32 sets +func (fd *Field) SetB32(a []byte) { + fd.n[0] = 0 + fd.n[1] = 0 + fd.n[2] = 0 + fd.n[3] = 0 + fd.n[4] = 0 + fd.n[5] = 0 + fd.n[6] = 0 + fd.n[7] = 0 + fd.n[8] = 0 + fd.n[9] = 0 + var v uint32 + for i := uint(0); i < 32; i++ { + for j := uint(0); j < 4; j++ { + limb := (8*i + 2*j) / 26 + shift := (8*i + 2*j) % 26 + v = (uint32)((a[31-i]>>(2*j))&0x3) << shift + fd.n[limb] |= v + } + } +} + +// SetBytes sets bytes +func (fd *Field) SetBytes(a []byte) { + if len(a) > 32 { + panic("too many bytes to set") + } + if len(a) == 32 { + fd.SetB32(a) + } else { + var buf [32]byte + copy(buf[32-len(a):], a) + fd.SetB32(buf[:]) + } +} + +// SetHex sets field in hex string +func (fd *Field) SetHex(s string) { + d, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + fd.SetBytes(d) +} + +// IsOdd check if odd +func (fd *Field) IsOdd() bool { + return (fd.n[0] & 1) != 0 +} + +// IsZero check if field is zero +func (fd *Field) IsZero() bool { + return (fd.n[0] == 0 && fd.n[1] == 0 && fd.n[2] == 0 && fd.n[3] == 0 && fd.n[4] == 0 && fd.n[5] == 0 && fd.n[6] == 0 && fd.n[7] == 0 && fd.n[8] == 0 && fd.n[9] == 0) +} + +// SetInt set fields with an int value +func (fd *Field) SetInt(a uint32) { + fd.n[0] = a + fd.n[1] = 0 + fd.n[2] = 0 + fd.n[3] = 0 + fd.n[4] = 0 + fd.n[5] = 0 + fd.n[6] = 0 + fd.n[7] = 0 + fd.n[8] = 0 + fd.n[9] = 0 +} + +// Normalize normalize the field +func (fd *Field) Normalize() { + c := fd.n[0] + t0 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[1] + t1 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[2] + t2 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[3] + t3 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[4] + t4 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[5] + t5 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[6] + t6 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[7] + t7 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[8] + t8 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[9] + t9 := c & 0x03FFFFF + c >>= 22 + + // The following code will not modify the t's if c is initially 0. + d := c*0x3D1 + t0 + t0 = d & 0x3FFFFFF + d = (d >> 26) + t1 + c*0x40 + t1 = d & 0x3FFFFFF + d = (d >> 26) + t2 + t2 = d & 0x3FFFFFF + d = (d >> 26) + t3 + t3 = d & 0x3FFFFFF + d = (d >> 26) + t4 + t4 = d & 0x3FFFFFF + d = (d >> 26) + t5 + t5 = d & 0x3FFFFFF + d = (d >> 26) + t6 + t6 = d & 0x3FFFFFF + d = (d >> 26) + t7 + t7 = d & 0x3FFFFFF + d = (d >> 26) + t8 + t8 = d & 0x3FFFFFF + d = (d >> 26) + t9 + t9 = d & 0x03FFFFF + + // Subtract p if result >= p + low := (uint64(t1) << 26) | uint64(t0) + //mask := uint64(-(int64)((t9 < 0x03FFFFF) | (t8 < 0x3FFFFFF) | (t7 < 0x3FFFFFF) | (t6 < 0x3FFFFFF) | (t5 < 0x3FFFFFF) | (t4 < 0x3FFFFFF) | (t3 < 0x3FFFFFF) | (t2 < 0x3FFFFFF) | (low < 0xFFFFEFFFFFC2F))) + var mask uint64 + if (t9 < 0x03FFFFF) || + (t8 < 0x3FFFFFF) || + (t7 < 0x3FFFFFF) || + (t6 < 0x3FFFFFF) || + (t5 < 0x3FFFFFF) || + (t4 < 0x3FFFFFF) || + (t3 < 0x3FFFFFF) || + (t2 < 0x3FFFFFF) || + (low < 0xFFFFEFFFFFC2F) { + mask = 0xFFFFFFFFFFFFFFFF + } + t9 &= uint32(mask) + t8 &= uint32(mask) + t7 &= uint32(mask) + t6 &= uint32(mask) + t5 &= uint32(mask) + t4 &= uint32(mask) + t3 &= uint32(mask) + t2 &= uint32(mask) + low -= ((mask ^ 0xFFFFFFFFFFFFFFFF) & 0xFFFFEFFFFFC2F) + + // push internal variables back + fd.n[0] = uint32(low) & 0x3FFFFFF + fd.n[1] = uint32(low>>26) & 0x3FFFFFF + fd.n[2] = t2 + fd.n[3] = t3 + fd.n[4] = t4 + fd.n[5] = t5 + fd.n[6] = t6 + fd.n[7] = t7 + fd.n[8] = t8 + fd.n[9] = t9 +} + +// GetB32 get B32, TODO: need further explanation +func (fd *Field) GetB32(r []byte) { + var i, j, c, limb, shift uint32 + for i = 0; i < 32; i++ { + c = 0 + for j = 0; j < 4; j++ { + limb = (8*i + 2*j) / 26 + shift = (8*i + 2*j) % 26 + c |= ((fd.n[limb] >> shift) & 0x3) << (2 * j) + } + r[31-i] = byte(c) + } +} + +// Equals check if field is the same as the given one +func (fd *Field) Equals(b *Field) bool { + return (fd.n[0] == b.n[0] && fd.n[1] == b.n[1] && fd.n[2] == b.n[2] && fd.n[3] == b.n[3] && fd.n[4] == b.n[4] && + fd.n[5] == b.n[5] && fd.n[6] == b.n[6] && fd.n[7] == b.n[7] && fd.n[8] == b.n[8] && fd.n[9] == b.n[9]) +} + +// SetAdd adds value to corresponding fields +func (fd *Field) SetAdd(a *Field) { + fd.n[0] += a.n[0] + fd.n[1] += a.n[1] + fd.n[2] += a.n[2] + fd.n[3] += a.n[3] + fd.n[4] += a.n[4] + fd.n[5] += a.n[5] + fd.n[6] += a.n[6] + fd.n[7] += a.n[7] + fd.n[8] += a.n[8] + fd.n[9] += a.n[9] +} + +// MulInt multiples the fields +func (fd *Field) MulInt(a uint32) { + fd.n[0] *= a + fd.n[1] *= a + fd.n[2] *= a + fd.n[3] *= a + fd.n[4] *= a + fd.n[5] *= a + fd.n[6] *= a + fd.n[7] *= a + fd.n[8] *= a + fd.n[9] *= a +} + +// Negate caculate the negate +func (fd *Field) Negate(r *Field, m uint32) { + r.n[0] = 0x3FFFC2F*(m+1) - fd.n[0] + r.n[1] = 0x3FFFFBF*(m+1) - fd.n[1] + r.n[2] = 0x3FFFFFF*(m+1) - fd.n[2] + r.n[3] = 0x3FFFFFF*(m+1) - fd.n[3] + r.n[4] = 0x3FFFFFF*(m+1) - fd.n[4] + r.n[5] = 0x3FFFFFF*(m+1) - fd.n[5] + r.n[6] = 0x3FFFFFF*(m+1) - fd.n[6] + r.n[7] = 0x3FFFFFF*(m+1) - fd.n[7] + r.n[8] = 0x3FFFFFF*(m+1) - fd.n[8] + r.n[9] = 0x03FFFFF*(m+1) - fd.n[9] +} + +// Inv new algo by peterdettman - https://github.com/sipa/TheCurve/pull/19 +func (fd *Field) Inv(r *Field) { + var x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1 Field + var j int + + fd.Sqr(&x2) + x2.Mul(&x2, fd) + + x2.Sqr(&x3) + x3.Mul(&x3, fd) + + x3.Sqr(&x6) + x6.Sqr(&x6) + x6.Sqr(&x6) + x6.Mul(&x6, &x3) + + x6.Sqr(&x9) + x9.Sqr(&x9) + x9.Sqr(&x9) + x9.Mul(&x9, &x3) + + x9.Sqr(&x11) + x11.Sqr(&x11) + x11.Mul(&x11, &x2) + + x11.Sqr(&x22) + for j = 1; j < 11; j++ { + x22.Sqr(&x22) + } + x22.Mul(&x22, &x11) + + x22.Sqr(&x44) + for j = 1; j < 22; j++ { + x44.Sqr(&x44) + } + x44.Mul(&x44, &x22) + + x44.Sqr(&x88) + for j = 1; j < 44; j++ { + x88.Sqr(&x88) + } + x88.Mul(&x88, &x44) + + x88.Sqr(&x176) + for j = 1; j < 88; j++ { + x176.Sqr(&x176) + } + x176.Mul(&x176, &x88) + + x176.Sqr(&x220) + for j = 1; j < 44; j++ { + x220.Sqr(&x220) + } + x220.Mul(&x220, &x44) + + x220.Sqr(&x223) + x223.Sqr(&x223) + x223.Sqr(&x223) + x223.Mul(&x223, &x3) + + x223.Sqr(&t1) + for j = 1; j < 23; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x22) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(&t1, fd) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(&t1, &x2) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(r, fd) +} + +// Sqrt new algo by peterdettman - https://github.com/sipa/TheCurve/pull/19 +func (fd *Field) Sqrt(r *Field) { + var x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1 Field + var j int + + fd.Sqr(&x2) + x2.Mul(&x2, fd) + + x2.Sqr(&x3) + x3.Mul(&x3, fd) + + x3.Sqr(&x6) + x6.Sqr(&x6) + x6.Sqr(&x6) + x6.Mul(&x6, &x3) + + x6.Sqr(&x9) + x9.Sqr(&x9) + x9.Sqr(&x9) + x9.Mul(&x9, &x3) + + x9.Sqr(&x11) + x11.Sqr(&x11) + x11.Mul(&x11, &x2) + + x11.Sqr(&x22) + for j = 1; j < 11; j++ { + x22.Sqr(&x22) + } + x22.Mul(&x22, &x11) + + x22.Sqr(&x44) + for j = 1; j < 22; j++ { + x44.Sqr(&x44) + } + x44.Mul(&x44, &x22) + + x44.Sqr(&x88) + for j = 1; j < 44; j++ { + x88.Sqr(&x88) + } + x88.Mul(&x88, &x44) + + x88.Sqr(&x176) + for j = 1; j < 88; j++ { + x176.Sqr(&x176) + } + x176.Mul(&x176, &x88) + + x176.Sqr(&x220) + for j = 1; j < 44; j++ { + x220.Sqr(&x220) + } + x220.Mul(&x220, &x44) + + x220.Sqr(&x223) + x223.Sqr(&x223) + x223.Sqr(&x223) + x223.Mul(&x223, &x3) + + x223.Sqr(&t1) + for j = 1; j < 23; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x22) + for j = 0; j < 6; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x2) + t1.Sqr(&t1) + t1.Sqr(r) +} + +// InvVar ... +func (fd *Field) InvVar(r *Field) { + var b [32]byte + c := *fd + c.Normalize() + c.GetB32(b[:]) + var n Number + n.SetBytes(b[:]) + n.modInv(&n, &TheCurve.p) + r.SetBytes(n.Bytes()) +} + +// Mul ... +func (fd *Field) Mul(r, b *Field) { + var c, d uint64 + var t0, t1, t2, t3, t4, t5, t6 uint64 + var t7, t8, t9, t10, t11, t12, t13 uint64 + var t14, t15, t16, t17, t18, t19 uint64 + + c = uint64(fd.n[0]) * uint64(b.n[0]) + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[1]) + + uint64(fd.n[1])*uint64(b.n[0]) + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[2]) + + uint64(fd.n[1])*uint64(b.n[1]) + + uint64(fd.n[2])*uint64(b.n[0]) + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[3]) + + uint64(fd.n[1])*uint64(b.n[2]) + + uint64(fd.n[2])*uint64(b.n[1]) + + uint64(fd.n[3])*uint64(b.n[0]) + t3 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[4]) + + uint64(fd.n[1])*uint64(b.n[3]) + + uint64(fd.n[2])*uint64(b.n[2]) + + uint64(fd.n[3])*uint64(b.n[1]) + + uint64(fd.n[4])*uint64(b.n[0]) + t4 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[5]) + + uint64(fd.n[1])*uint64(b.n[4]) + + uint64(fd.n[2])*uint64(b.n[3]) + + uint64(fd.n[3])*uint64(b.n[2]) + + uint64(fd.n[4])*uint64(b.n[1]) + + uint64(fd.n[5])*uint64(b.n[0]) + t5 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[6]) + + uint64(fd.n[1])*uint64(b.n[5]) + + uint64(fd.n[2])*uint64(b.n[4]) + + uint64(fd.n[3])*uint64(b.n[3]) + + uint64(fd.n[4])*uint64(b.n[2]) + + uint64(fd.n[5])*uint64(b.n[1]) + + uint64(fd.n[6])*uint64(b.n[0]) + t6 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[7]) + + uint64(fd.n[1])*uint64(b.n[6]) + + uint64(fd.n[2])*uint64(b.n[5]) + + uint64(fd.n[3])*uint64(b.n[4]) + + uint64(fd.n[4])*uint64(b.n[3]) + + uint64(fd.n[5])*uint64(b.n[2]) + + uint64(fd.n[6])*uint64(b.n[1]) + + uint64(fd.n[7])*uint64(b.n[0]) + t7 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[8]) + + uint64(fd.n[1])*uint64(b.n[7]) + + uint64(fd.n[2])*uint64(b.n[6]) + + uint64(fd.n[3])*uint64(b.n[5]) + + uint64(fd.n[4])*uint64(b.n[4]) + + uint64(fd.n[5])*uint64(b.n[3]) + + uint64(fd.n[6])*uint64(b.n[2]) + + uint64(fd.n[7])*uint64(b.n[1]) + + uint64(fd.n[8])*uint64(b.n[0]) + t8 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[9]) + + uint64(fd.n[1])*uint64(b.n[8]) + + uint64(fd.n[2])*uint64(b.n[7]) + + uint64(fd.n[3])*uint64(b.n[6]) + + uint64(fd.n[4])*uint64(b.n[5]) + + uint64(fd.n[5])*uint64(b.n[4]) + + uint64(fd.n[6])*uint64(b.n[3]) + + uint64(fd.n[7])*uint64(b.n[2]) + + uint64(fd.n[8])*uint64(b.n[1]) + + uint64(fd.n[9])*uint64(b.n[0]) + t9 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[1])*uint64(b.n[9]) + + uint64(fd.n[2])*uint64(b.n[8]) + + uint64(fd.n[3])*uint64(b.n[7]) + + uint64(fd.n[4])*uint64(b.n[6]) + + uint64(fd.n[5])*uint64(b.n[5]) + + uint64(fd.n[6])*uint64(b.n[4]) + + uint64(fd.n[7])*uint64(b.n[3]) + + uint64(fd.n[8])*uint64(b.n[2]) + + uint64(fd.n[9])*uint64(b.n[1]) + t10 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[2])*uint64(b.n[9]) + + uint64(fd.n[3])*uint64(b.n[8]) + + uint64(fd.n[4])*uint64(b.n[7]) + + uint64(fd.n[5])*uint64(b.n[6]) + + uint64(fd.n[6])*uint64(b.n[5]) + + uint64(fd.n[7])*uint64(b.n[4]) + + uint64(fd.n[8])*uint64(b.n[3]) + + uint64(fd.n[9])*uint64(b.n[2]) + t11 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[3])*uint64(b.n[9]) + + uint64(fd.n[4])*uint64(b.n[8]) + + uint64(fd.n[5])*uint64(b.n[7]) + + uint64(fd.n[6])*uint64(b.n[6]) + + uint64(fd.n[7])*uint64(b.n[5]) + + uint64(fd.n[8])*uint64(b.n[4]) + + uint64(fd.n[9])*uint64(b.n[3]) + t12 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[4])*uint64(b.n[9]) + + uint64(fd.n[5])*uint64(b.n[8]) + + uint64(fd.n[6])*uint64(b.n[7]) + + uint64(fd.n[7])*uint64(b.n[6]) + + uint64(fd.n[8])*uint64(b.n[5]) + + uint64(fd.n[9])*uint64(b.n[4]) + t13 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[5])*uint64(b.n[9]) + + uint64(fd.n[6])*uint64(b.n[8]) + + uint64(fd.n[7])*uint64(b.n[7]) + + uint64(fd.n[8])*uint64(b.n[6]) + + uint64(fd.n[9])*uint64(b.n[5]) + t14 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[6])*uint64(b.n[9]) + + uint64(fd.n[7])*uint64(b.n[8]) + + uint64(fd.n[8])*uint64(b.n[7]) + + uint64(fd.n[9])*uint64(b.n[6]) + t15 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[7])*uint64(b.n[9]) + + uint64(fd.n[8])*uint64(b.n[8]) + + uint64(fd.n[9])*uint64(b.n[7]) + t16 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[8])*uint64(b.n[9]) + + uint64(fd.n[9])*uint64(b.n[8]) + t17 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[9])*uint64(b.n[9]) + t18 = c & 0x3FFFFFF + c = c >> 26 + t19 = c + + c = t0 + t10*0x3D10 + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + t1 + t10*0x400 + t11*0x3D10 + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + t2 + t11*0x400 + t12*0x3D10 + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + t3 + t12*0x400 + t13*0x3D10 + r.n[3] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t4 + t13*0x400 + t14*0x3D10 + r.n[4] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t5 + t14*0x400 + t15*0x3D10 + r.n[5] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t6 + t15*0x400 + t16*0x3D10 + r.n[6] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t7 + t16*0x400 + t17*0x3D10 + r.n[7] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t8 + t17*0x400 + t18*0x3D10 + r.n[8] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t9 + t18*0x400 + t19*0x1000003D10 + r.n[9] = uint32(c) & 0x03FFFFF + c = c >> 22 + d = t0 + c*0x3D1 + r.n[0] = uint32(d) & 0x3FFFFFF + d = d >> 26 + d = d + t1 + c*0x40 + r.n[1] = uint32(d) & 0x3FFFFFF + d = d >> 26 + r.n[2] = uint32(t2 + d) +} + +// Sqr ... +func (fd *Field) Sqr(r *Field) { + var c, d uint64 + var t0, t1, t2, t3, t4, t5, t6 uint64 + var t7, t8, t9, t10, t11, t12, t13 uint64 + var t14, t15, t16, t17, t18, t19 uint64 + + c = uint64(fd.n[0]) * uint64(fd.n[0]) + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[1]) + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[2]) + + uint64(fd.n[1])*uint64(fd.n[1]) + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[3]) + + (uint64(fd.n[1])*2)*uint64(fd.n[2]) + t3 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[4]) + + (uint64(fd.n[1])*2)*uint64(fd.n[3]) + + uint64(fd.n[2])*uint64(fd.n[2]) + t4 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[5]) + + (uint64(fd.n[1])*2)*uint64(fd.n[4]) + + (uint64(fd.n[2])*2)*uint64(fd.n[3]) + t5 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[6]) + + (uint64(fd.n[1])*2)*uint64(fd.n[5]) + + (uint64(fd.n[2])*2)*uint64(fd.n[4]) + + uint64(fd.n[3])*uint64(fd.n[3]) + t6 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[7]) + + (uint64(fd.n[1])*2)*uint64(fd.n[6]) + + (uint64(fd.n[2])*2)*uint64(fd.n[5]) + + (uint64(fd.n[3])*2)*uint64(fd.n[4]) + t7 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[8]) + + (uint64(fd.n[1])*2)*uint64(fd.n[7]) + + (uint64(fd.n[2])*2)*uint64(fd.n[6]) + + (uint64(fd.n[3])*2)*uint64(fd.n[5]) + + uint64(fd.n[4])*uint64(fd.n[4]) + t8 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[9]) + + (uint64(fd.n[1])*2)*uint64(fd.n[8]) + + (uint64(fd.n[2])*2)*uint64(fd.n[7]) + + (uint64(fd.n[3])*2)*uint64(fd.n[6]) + + (uint64(fd.n[4])*2)*uint64(fd.n[5]) + t9 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[1])*2)*uint64(fd.n[9]) + + (uint64(fd.n[2])*2)*uint64(fd.n[8]) + + (uint64(fd.n[3])*2)*uint64(fd.n[7]) + + (uint64(fd.n[4])*2)*uint64(fd.n[6]) + + uint64(fd.n[5])*uint64(fd.n[5]) + t10 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[2])*2)*uint64(fd.n[9]) + + (uint64(fd.n[3])*2)*uint64(fd.n[8]) + + (uint64(fd.n[4])*2)*uint64(fd.n[7]) + + (uint64(fd.n[5])*2)*uint64(fd.n[6]) + t11 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[3])*2)*uint64(fd.n[9]) + + (uint64(fd.n[4])*2)*uint64(fd.n[8]) + + (uint64(fd.n[5])*2)*uint64(fd.n[7]) + + uint64(fd.n[6])*uint64(fd.n[6]) + t12 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[4])*2)*uint64(fd.n[9]) + + (uint64(fd.n[5])*2)*uint64(fd.n[8]) + + (uint64(fd.n[6])*2)*uint64(fd.n[7]) + t13 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[5])*2)*uint64(fd.n[9]) + + (uint64(fd.n[6])*2)*uint64(fd.n[8]) + + uint64(fd.n[7])*uint64(fd.n[7]) + t14 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[6])*2)*uint64(fd.n[9]) + + (uint64(fd.n[7])*2)*uint64(fd.n[8]) + t15 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[7])*2)*uint64(fd.n[9]) + + uint64(fd.n[8])*uint64(fd.n[8]) + t16 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[8])*2)*uint64(fd.n[9]) + t17 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[9])*uint64(fd.n[9]) + t18 = c & 0x3FFFFFF + c = c >> 26 + t19 = c + + c = t0 + t10*0x3D10 + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + t1 + t10*0x400 + t11*0x3D10 + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + t2 + t11*0x400 + t12*0x3D10 + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + t3 + t12*0x400 + t13*0x3D10 + r.n[3] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t4 + t13*0x400 + t14*0x3D10 + r.n[4] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t5 + t14*0x400 + t15*0x3D10 + r.n[5] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t6 + t15*0x400 + t16*0x3D10 + r.n[6] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t7 + t16*0x400 + t17*0x3D10 + r.n[7] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t8 + t17*0x400 + t18*0x3D10 + r.n[8] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t9 + t18*0x400 + t19*0x1000003D10 + r.n[9] = uint32(c) & 0x03FFFFF + c = c >> 22 + d = t0 + c*0x3D1 + r.n[0] = uint32(d) & 0x3FFFFFF + d = d >> 26 + d = d + t1 + c*0x40 + r.n[1] = uint32(d) & 0x3FFFFFF + d = d >> 26 + r.n[2] = uint32(t2 + d) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go new file mode 100644 index 00000000..07527d85 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go @@ -0,0 +1,100 @@ +package secp256k1go + +import ( + "math/big" +) + +var ( + // BigInt1 represents big int with value 1 + BigInt1 = new(big.Int).SetInt64(1) +) + +// Number wraps the big.Int +type Number struct { + big.Int +} + +func (num *Number) modMul(a, b, m *Number) { + num.Mul(&a.Int, &b.Int) + num.Mod(&num.Int, &m.Int) +} + +func (num *Number) modInv(a, b *Number) { + num.ModInverse(&a.Int, &b.Int) +} + +func (num *Number) mod(a *Number) { + num.Mod(&num.Int, &a.Int) +} + +// SetHex sets number from string +func (num *Number) SetHex(s string) { + if _, ok := num.SetString(s, 16); !ok { + panic("Number.SetHex failed") + } +} + +func (num *Number) maskBits(bits uint) { + mask := new(big.Int).Lsh(BigInt1, bits) + mask.Sub(mask, BigInt1) + num.Int.And(&num.Int, mask) +} + +func (num *Number) splitExp(r1, r2 *Number) { + var bnc1, bnc2, bnn2, bnt1, bnt2 Number + + bnn2.Int.Rsh(&TheCurve.Order.Int, 1) + + bnc1.Mul(&num.Int, &TheCurve.a1b2.Int) + bnc1.Add(&bnc1.Int, &bnn2.Int) + bnc1.Div(&bnc1.Int, &TheCurve.Order.Int) + + bnc2.Mul(&num.Int, &TheCurve.b1.Int) + bnc2.Add(&bnc2.Int, &bnn2.Int) + bnc2.Div(&bnc2.Int, &TheCurve.Order.Int) + + bnt1.Mul(&bnc1.Int, &TheCurve.a1b2.Int) + bnt2.Mul(&bnc2.Int, &TheCurve.a2.Int) + bnt1.Add(&bnt1.Int, &bnt2.Int) + r1.Sub(&num.Int, &bnt1.Int) + + bnt1.Mul(&bnc1.Int, &TheCurve.b1.Int) + bnt2.Mul(&bnc2.Int, &TheCurve.a1b2.Int) + r2.Sub(&bnt1.Int, &bnt2.Int) +} + +func (num *Number) split(rl, rh *Number, bits uint) { //nolint:unparam + rl.Int.Set(&num.Int) + rh.Int.Rsh(&rl.Int, bits) + rl.maskBits(bits) +} + +func (num *Number) rsh(bits uint) { //nolint:unparam + num.Rsh(&num.Int, bits) +} + +func (num *Number) inc() { + num.Add(&num.Int, BigInt1) +} + +func (num *Number) rshX(bits uint) (res int) { + res = int(new(big.Int).And(&num.Int, new(big.Int).SetUint64((1< length { + panic("buffer too small") + } + if len(b) == length { + return b + } + return append(make([]byte, length-len(b)), b...) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go new file mode 100644 index 00000000..1cbb4ae3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go @@ -0,0 +1,64 @@ +/* +Package secp256k1go implements the underlying secp256k1 primitives +*/ +package secp256k1go + +const winA = 5 +const winG = 14 + +// TheCurve is the secp256k1 curve +var TheCurve struct { + Order Number // the order of the base point (stdlib crypto/elliptic.CurveParams.N) + halfOrder Number // half of the Order value + G XY // (x, y) of the base point (stdlib crypto/elliptic.CurveParams.Gx, Gy) + beta Field // endomorphism optimization parameter (derived from Hal Finney's post https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565) + lambda, a1b2, b1, a2 Number // endomorphism optimization parameters (derived from Hal Finney's post https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565) + p Number // // the order of the underlying field (stdlib crypto/elliptic.CurveParams.P) +} + +func initConstants() { + TheCurve.Order.SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41}) + + TheCurve.halfOrder.SetBytes([]byte{ + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X5D, 0X57, 0X6E, 0X73, 0X57, 0XA4, 0X50, 0X1D, 0XDF, 0XE9, 0X2F, 0X46, 0X68, 0X1B, 0X20, 0XA0}) + + TheCurve.p.SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F}) + + TheCurve.G.X.SetB32([]byte{ + 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, 0x07, + 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98}) + + TheCurve.G.Y.SetB32([]byte{ + 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, 0xA8, + 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, 0xB8}) + + // See Hal Finney's post https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565 + // Backup archive: https://gist.github.com/gz-c/bf70ce96b2488e5ccca65900086c75f5 + // for explanation of the following constants: + + TheCurve.lambda.SetBytes([]byte{ + 0x53, 0x63, 0xad, 0x4c, 0xc0, 0x5c, 0x30, 0xe0, 0xa5, 0x26, 0x1c, 0x02, 0x88, 0x12, 0x64, 0x5a, + 0x12, 0x2e, 0x22, 0xea, 0x20, 0x81, 0x66, 0x78, 0xdf, 0x02, 0x96, 0x7c, 0x1b, 0x23, 0xbd, 0x72}) + + TheCurve.beta.SetB32([]byte{ + 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9, + 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee}) + + TheCurve.a1b2.SetBytes([]byte{ + 0x30, 0x86, 0xd2, 0x21, 0xa7, 0xd4, 0x6b, 0xcd, 0xe8, 0x6c, 0x90, 0xe4, 0x92, 0x84, 0xeb, 0x15}) + + TheCurve.b1.SetBytes([]byte{ + 0xe4, 0x43, 0x7e, 0xd6, 0x01, 0x0e, 0x88, 0x28, 0x6f, 0x54, 0x7f, 0xa9, 0x0a, 0xbf, 0xe4, 0xc3}) + + TheCurve.a2.SetBytes([]byte{ + 0x01, 0x14, 0xca, 0x50, 0xf7, 0xa8, 0xe2, 0xf3, 0xf6, 0x57, 0xc1, 0x10, 0x8d, 0x9d, 0x44, 0xcf, 0xd8}) +} + +func init() { + initConstants() +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go new file mode 100644 index 00000000..2ea702c3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go @@ -0,0 +1,280 @@ +package secp256k1go + +import ( + "bytes" + "log" +) + +// Signature represents the signature +type Signature struct { + R, S Number +} + +// Verify verify the signature +func (sig *Signature) Verify(pubkey *XY, message *Number) bool { + var r2 Number + return sig.recompute(&r2, pubkey, message) && sig.R.Cmp(&r2.Int) == 0 +} + +func (sig *Signature) recompute(r2 *Number, pubkey *XY, message *Number) bool { + var sn, u1, u2 Number + + sn.modInv(&sig.S, &TheCurve.Order) + u1.modMul(&sn, message, &TheCurve.Order) + u2.modMul(&sn, &sig.R, &TheCurve.Order) + + var pr, pubkeyj XYZ + pubkeyj.SetXY(pubkey) + + pubkeyj.ECmult(&pr, &u2, &u1) + if pr.IsInfinity() { + return false + } + + var xr Field + pr.getX(&xr) + xr.Normalize() + var xrb [32]byte + xr.GetB32(xrb[:]) + r2.SetBytes(xrb[:]) + r2.Mod(&r2.Int, &TheCurve.Order.Int) + + return true +} + +/* +Reference code for Signature.Recover + +https://github.com/bitcoin-core/secp256k1/blob/e541a90ef6461007d9c6a74b9f9a7fb8aa34aaa8/src/modules/recovery/main_impl.h + +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar* sigs, secp256k1_ge *pubkey, const secp256k1_scalar *message, int recid) { + unsigned char brx[32]; + secp256k1_fe fx; + secp256k1_ge x; + secp256k1_gej xj; + secp256k1_scalar rn, u1, u2; + secp256k1_gej qj; + int r; + + if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { + return 0; + } + + secp256k1_scalar_get_b32(brx, sigr); + r = secp256k1_fe_set_b32(&fx, brx); + (void)r; + VERIFY_CHECK(r); // brx comes from a scalar, so is less than the order; certainly less than p + if (recid & 2) { + if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + return 0; + } + secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); + } + if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { + return 0; + } + secp256k1_gej_set_ge(&xj, &x); + secp256k1_scalar_inverse_var(&rn, sigr); + secp256k1_scalar_mul(&u1, &rn, message); + secp256k1_scalar_negate(&u1, &u1); + secp256k1_scalar_mul(&u2, &rn, sigs); + secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); + secp256k1_ge_set_gej_var(pubkey, &qj); + return !secp256k1_gej_is_infinity(&qj); +} +*/ + +// Recover recovers a pubkey XY point given the message that was signed to create +// this signature. +func (sig *Signature) Recover(pubkey *XY, msg *Number, recid int) bool { + var rx, rn, u1, u2 Number + var fx Field + var x XY + var xj, qj XYZ + + if sig.R.Sign() == 0 || sig.S.Sign() == 0 { + return false + } + + rx.Set(&sig.R.Int) + if (recid & 2) != 0 { + rx.Add(&rx.Int, &TheCurve.Order.Int) + if rx.Cmp(&TheCurve.p.Int) >= 0 { + return false + } + } + + fx.SetB32(LeftPadBytes(rx.Bytes(), 32)) + + x.SetXO(&fx, (recid&1) != 0) + if !x.IsValid() { + return false + } + + xj.SetXY(&x) + rn.modInv(&sig.R, &TheCurve.Order) + u1.modMul(&rn, msg, &TheCurve.Order) + u1.Sub(&TheCurve.Order.Int, &u1.Int) + u2.modMul(&rn, &sig.S, &TheCurve.Order) + xj.ECmult(&qj, &u2, &u1) + pubkey.SetXYZ(&qj) + return !qj.IsInfinity() +} + +/* +Reference code for Signature.Sign + +https://github.com/bitcoin-core/secp256k1/blob/master/src/ecdsa_impl.h + +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) { + unsigned char b[32]; + secp256k1_gej rp; + secp256k1_ge r; + secp256k1_scalar n; + int overflow = 0; + + secp256k1_ecmult_gen(ctx, &rp, nonce); + secp256k1_ge_set_gej(&r, &rp); + secp256k1_fe_normalize(&r.x); + secp256k1_fe_normalize(&r.y); + secp256k1_fe_get_b32(b, &r.x); + secp256k1_scalar_set_b32(sigr, b, &overflow); + // These two conditions should be checked before calling + VERIFY_CHECK(!secp256k1_scalar_is_zero(sigr)); + VERIFY_CHECK(overflow == 0); + + if (recid) { + // The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log + // of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria. + *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); + } + secp256k1_scalar_mul(&n, sigr, seckey); + secp256k1_scalar_add(&n, &n, message); + secp256k1_scalar_inverse(sigs, nonce); + secp256k1_scalar_mul(sigs, sigs, &n); + secp256k1_scalar_clear(&n); + secp256k1_gej_clear(&rp); + secp256k1_ge_clear(&r); + if (secp256k1_scalar_is_zero(sigs)) { + return 0; + } + if (secp256k1_scalar_is_high(sigs)) { + secp256k1_scalar_negate(sigs, sigs); + if (recid) { + *recid ^= 1; + } + } + return 1; +} +*/ + +// Sign signs the signature. Returns 1 on success, 0 on failure +func (sig *Signature) Sign(seckey, message, nonce *Number, recid *int) int { + var r XY + var n Number + var b [32]byte + + // r = nonce*G + rp := ECmultGen(*nonce) + r.SetXYZ(&rp) + r.X.Normalize() + r.Y.Normalize() + r.X.GetB32(b[:]) + sig.R.SetBytes(b[:]) + + if sig.R.Sign() == 0 { + log.Panic("sig R value should not be 0") + } + + if recid != nil { + *recid = 0 + // The overflow condition is cryptographically unreachable as hitting + // it requires finding the discrete log of some P where P.x >= order, + // and only 1 in about 2^127 points meet this criteria. + if sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + *recid |= 2 + } + if r.Y.IsOdd() { + *recid |= 1 + } + } + + sig.R.mod(&TheCurve.Order) + n.modMul(&sig.R, seckey, &TheCurve.Order) + n.Add(&n.Int, &message.Int) + n.mod(&TheCurve.Order) + sig.S.modInv(nonce, &TheCurve.Order) + sig.S.modMul(&sig.S, &n, &TheCurve.Order) + + if sig.S.Sign() == 0 { + return 0 + } + + // Break signature malleability + if sig.S.Cmp(&TheCurve.halfOrder.Int) == 1 { + sig.S.Sub(&TheCurve.Order.Int, &sig.S.Int) + if recid != nil { + *recid ^= 1 + } + } + + return 1 +} + +// ParseBytes parses a serialized R||S pair to Signature. +// R and S should be in big-endian encoding. +func (sig *Signature) ParseBytes(v []byte) { + if len(v) != 64 { + log.Panic("Signature.ParseBytes requires 64 bytes") + } + sig.R.SetBytes(v[0:32]) + sig.S.SetBytes(v[32:64]) +} + +//secp256k1_num_get_bin(sig64, 32, &sig.r); +//secp256k1_num_get_bin(sig64 + 32, 32, &sig.s); + +// Bytes serializes compressed signatures as bytes. +// The serialization format is R||S. R and S bytes are big-endian. +// R and S are left-padded with the NUL byte to ensure their length is 32 bytes. +func (sig *Signature) Bytes() []byte { + r := sig.R.Bytes() // big-endian + s := sig.S.Bytes() // big-endian + + for len(r) < 32 { + r = append([]byte{0}, r...) + } + for len(s) < 32 { + s = append([]byte{0}, s...) + } + + if len(r) != 32 || len(s) != 32 { + log.Panicf("signature size invalid: %d, %d", len(r), len(s)) + } + + res := new(bytes.Buffer) + if _, err := res.Write(r); err != nil { + log.Panic(err) + } + if _, err := res.Write(s); err != nil { + log.Panic(err) + } + + //test + if true { + ret := res.Bytes() + var sig2 Signature + sig2.ParseBytes(ret) + if !bytes.Equal(sig.R.Bytes(), sig2.R.Bytes()) { + log.Panic("serialization failed 1") + } + if !bytes.Equal(sig.S.Bytes(), sig2.S.Bytes()) { + log.Panic("serialization failed 2") + } + } + + if len(res.Bytes()) != 64 { + log.Panic("Signature.Bytes result bytes must be 64 bytes long") + } + return res.Bytes() +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go new file mode 100644 index 00000000..a6f9d6c8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go @@ -0,0 +1,244 @@ +package secp256k1go + +import ( + "errors" + "log" +) + +// XY is a point on the secp256k1 curve +type XY struct { + X, Y Field + Infinity bool +} + +func (xy *XY) String() string { + if xy.Infinity { + return "Infinity" + } + return xy.X.String() + "," + xy.Y.String() +} + +//edited + +/* + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + secp256k1_fe_set_b32(&x, pub+1); + return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + secp256k1_fe_set_b32(&x, pub+1); + secp256k1_fe_set_b32(&y, pub+33); + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) + return 0; + return secp256k1_ge_is_valid(elem); + } +*/ +//All compact keys appear to be valid by construction, but may fail +//is valid check + +// ParsePubkey parses a compressed pubkey to a point on the curve +func (xy *XY) ParsePubkey(pub []byte) error { + // ParsePubkey WARNING: for compact signatures, will succeed unconditionally + //however, elem.IsValid will fail + if len(pub) != 33 { + log.Panic("pubkey len must be 33 bytes") // do not permit invalid length inputs + return errors.New("pubkey len must be 33 bytes") + } + if len(pub) == 33 && (pub[0] == 0x02 || pub[0] == 0x03) { + xy.X.SetB32(pub[1:33]) + xy.SetXO(&xy.X, pub[0] == 0x03) + } else { + return errors.New("pubkey y-coordinate parity byte is invalid") // the leading bytes indicates if Y is odd or not + } + //THIS FAILS + //reenable later + //if !elem.IsValid() { + // return false + //} + + /* + else if len(pub) == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07) { + elem.X.SetB32(pub[1:33]) + elem.Y.SetB32(pub[33:65]) + if (pub[0] == 0x06 || pub[0] == 0x07) && elem.Y.IsOdd() != (pub[0] == 0x07) { + return false + } + } + */ + return nil +} + +// Bytes returns the compressed public key (33 bytes) in the format +// "<0x03> " or <0x02> ". The leading byte is 0x03 if the Y point is odd. +func (xy XY) Bytes() []byte { + xy.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + + raw := make([]byte, 33) + if xy.Y.IsOdd() { + raw[0] = 0x03 + } else { + raw[0] = 0x02 + } + xy.X.GetB32(raw[1:]) + return raw +} + +// BytesUncompressed returns serialized key in uncompressed format "<04> " +//65 bytes +func (xy *XY) BytesUncompressed() (raw []byte) { + xy.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + xy.Y.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + + raw = make([]byte, 65) + raw[0] = 0x04 + xy.X.GetB32(raw[1:33]) + xy.Y.GetB32(raw[33:65]) + return +} + +// SetXY sets x y fields +func (xy *XY) SetXY(X, Y *Field) { + xy.Infinity = false + xy.X = *X + xy.Y = *Y +} + +/* +int static secp256k1_ecdsa_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size) { + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + secp256k1_fe_set_b32(&x, pub+1); + return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + secp256k1_fe_set_b32(&x, pub+1); + secp256k1_fe_set_b32(&y, pub+33); + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) + return 0; + return secp256k1_ge_is_valid(elem); + } else { + return 0; + } +} +*/ + +// if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { +// secp256k1_fe_t x; +// secp256k1_fe_set_b32(&x, pub+1); +// return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + +// IsValid checks that the point is not infinity and is on the secp256k1 curve +func (xy *XY) IsValid() bool { + // Adopted from libsecp256k1: + // https://github.com/bitcoin-core/secp256k1/blob/2ebdad772af770b4587af0856de27c63de1b03be/src/group_impl.h#L292-L304 + /* + static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) { + secp256k1_fe y2, x3, c; + if (a->infinity) { + return 0; + } + // y^2 = x^3 + 7 // + secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_set_int(&c, CURVE_B); + secp256k1_fe_add(&x3, &c); + secp256k1_fe_normalize_weak(&x3); + return secp256k1_fe_equal_var(&y2, &x3); + } + */ + if xy.Infinity { + return false + } + var y2, x3, c Field + xy.Y.Sqr(&y2) + xy.X.Sqr(&x3) + x3.Mul(&x3, &xy.X) + c.SetInt(7) + x3.SetAdd(&c) + y2.Normalize() + x3.Normalize() + return y2.Equals(&x3) +} + +// SetXYZ sets X Y Z fields +func (xy *XY) SetXYZ(a *XYZ) { + var z2, z3 Field + a.Z.InvVar(&a.Z) + a.Z.Sqr(&z2) + a.Z.Mul(&z3, &z2) + a.X.Mul(&a.X, &z2) + a.Y.Mul(&a.Y, &z3) + a.Z.SetInt(1) + xy.Infinity = a.Infinity + xy.X = a.X + xy.Y = a.Y +} + +func (xy *XY) precomp(w int) []XY { //nolint:unused,megacheck + pre := make([]XY, (1 << (uint(w) - 2))) + pre[0] = *xy + var X, d, tmp XYZ + X.SetXY(xy) + X.Double(&d) + for i := 1; i < len(pre); i++ { + d.AddXY(&tmp, &pre[i-1]) + pre[i].SetXYZ(&tmp) + } + return pre +} + +// Neg caculates negate +func (xy *XY) Neg(r *XY) { + r.Infinity = xy.Infinity + r.X = xy.X + r.Y = xy.Y + r.Y.Normalize() + r.Y.Negate(&r.Y, 1) +} + +/* +int static secp256k1_ge_set_xo(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd) { + r->x = *x; + secp256k1_fe_t x2; secp256k1_fe_sqr(&x2, x); + secp256k1_fe_t x3; secp256k1_fe_mul(&x3, x, &x2); + r->infinity = 0; + secp256k1_fe_t c; secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&c, &x3); + if (!secp256k1_fe_sqrt(&r->y, &c)) + return 0; + secp256k1_fe_normalize(&r->y); + if (secp256k1_fe_is_odd(&r->y) != odd) + secp256k1_fe_negate(&r->y, &r->y, 1); + return 1; +} +*/ + +// SetXO sets the X and Y field from an X value and flag indicating whether or +// not Y is odd. +func (xy *XY) SetXO(X *Field, odd bool) { + var c, x2, x3 Field + xy.X = *X + X.Sqr(&x2) + X.Mul(&x3, &x2) + xy.Infinity = false + c.SetInt(7) + c.SetAdd(&x3) + c.Sqrt(&xy.Y) //does not return, can fail + if xy.Y.IsOdd() != odd { + xy.Y.Negate(&xy.Y, 1) + } + + //r.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + xy.Y.Normalize() +} + +// AddXY adds xy +func (xy *XY) AddXY(a *XY) { + var xyz XYZ + xyz.SetXY(xy) + xyz.AddXY(&xyz, a) + xy.SetXYZ(&xyz) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go new file mode 100644 index 00000000..88a0a1ce --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go @@ -0,0 +1,378 @@ +package secp256k1go + +// XYZ contains xyz fields +type XYZ struct { + X, Y, Z Field + Infinity bool +} + +func (xyz XYZ) String() string { + if xyz.Infinity { + return "INFINITY" + } + return xyz.X.String() + "," + xyz.Y.String() + "," + xyz.Z.String() +} + +// SetXY sets xy +func (xyz *XYZ) SetXY(a *XY) { + xyz.Infinity = a.Infinity + xyz.X = a.X + xyz.Y = a.Y + xyz.Z.SetInt(1) +} + +// IsInfinity check if xyz is infinity +func (xyz *XYZ) IsInfinity() bool { + return xyz.Infinity +} + +// IsValid check if xyz is valid +func (xyz *XYZ) IsValid() bool { + if xyz.Infinity { + return false + } + var y2, x3, z2, z6 Field + xyz.Y.Sqr(&y2) + xyz.X.Sqr(&x3) + x3.Mul(&x3, &xyz.X) + xyz.Z.Sqr(&z2) + z2.Sqr(&z6) + z6.Mul(&z6, &z2) + z6.MulInt(7) + x3.SetAdd(&z6) + y2.Normalize() + x3.Normalize() + return y2.Equals(&x3) +} + +func (xyz *XYZ) getX(r *Field) { + var zi2 Field + xyz.Z.InvVar(&zi2) + zi2.Sqr(&zi2) + xyz.X.Mul(r, &zi2) +} + +// Normalize normalize all fields +func (xyz *XYZ) Normalize() { + xyz.X.Normalize() + xyz.Y.Normalize() + xyz.Z.Normalize() +} + +// Equals checks if equal +func (xyz *XYZ) Equals(b *XYZ) bool { + if xyz.Infinity != b.Infinity { + return false + } + // TODO: is the normalize really needed here? + xyz.Normalize() + b.Normalize() + return xyz.X.Equals(&b.X) && xyz.Y.Equals(&b.Y) && xyz.Z.Equals(&b.Z) +} + +func (xyz *XYZ) precomp(w int) (pre []XYZ) { //nolint:unparam + var d XYZ + pre = make([]XYZ, (1 << (uint(w) - 2))) + pre[0] = *xyz + pre[0].Double(&d) + for i := 1; i < len(pre); i++ { + d.Add(&pre[i], &pre[i-1]) + } + return +} + +func ecmultWnaf(wnaf []int, a *Number, w uint) (ret int) { + var zeroes uint + var X Number + X.Set(&a.Int) + + for X.Sign() != 0 { + for X.Bit(0) == 0 { + zeroes++ + X.rsh(1) + } + word := X.rshX(w) + for zeroes > 0 { + wnaf[ret] = 0 + ret++ + zeroes-- + } + if (word & (1 << (w - 1))) != 0 { + X.inc() + wnaf[ret] = (word - (1 << w)) + } else { + wnaf[ret] = word + } + zeroes = w - 1 + ret++ + } + return +} + +// ECmult r = na*a + ng*G +func (xyz *XYZ) ECmult(r *XYZ, na, ng *Number) { + var na1, naLam, ng1, ng128 Number + + // split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) + na.splitExp(&na1, &naLam) + + // split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) + ng.split(&ng1, &ng128, 128) + + // build wnaf representation for na_1, na_lam, ng_1, ng_128 + var wnafNa1, wnafNaLam, wnafNg1, wnafNg128 [129]int + bitsNa1 := ecmultWnaf(wnafNa1[:], &na1, winA) + bitsNaLam := ecmultWnaf(wnafNaLam[:], &naLam, winA) + bitsNg1 := ecmultWnaf(wnafNg1[:], &ng1, winG) + bitsNg128 := ecmultWnaf(wnafNg128[:], &ng128, winG) + + // calculate a_lam = a*lambda + var aLam XYZ + xyz.mulLambda(&aLam) + + // calculate odd multiples of a and a_lam + preA1 := xyz.precomp(winA) + preALam := aLam.precomp(winA) + + bits := bitsNa1 + if bitsNaLam > bits { + bits = bitsNaLam + } + if bitsNg1 > bits { + bits = bitsNg1 + } + if bitsNg128 > bits { + bits = bitsNg128 + } + + r.Infinity = true + + var tmpj XYZ + var tmpa XY + var n int + + for i := bits - 1; i >= 0; i-- { + r.Double(r) + + if i < bitsNa1 { + n = wnafNa1[i] + if n > 0 { + r.Add(r, &preA1[((n)-1)/2]) + } else if n != 0 { + preA1[(-(n)-1)/2].Neg(&tmpj) + r.Add(r, &tmpj) + } + } + + if i < bitsNaLam { + n = wnafNaLam[i] + if n > 0 { + r.Add(r, &preALam[((n)-1)/2]) + } else if n != 0 { + preALam[(-(n)-1)/2].Neg(&tmpj) + r.Add(r, &tmpj) + } + } + + if i < bitsNg1 { + n = wnafNg1[i] + if n > 0 { + r.AddXY(r, &preG[((n)-1)/2]) + } else if n != 0 { + preG[(-(n)-1)/2].Neg(&tmpa) + r.AddXY(r, &tmpa) + } + } + + if i < bitsNg128 { + n = wnafNg128[i] + if n > 0 { + r.AddXY(r, &preG128[((n)-1)/2]) + } else if n != 0 { + preG128[(-(n)-1)/2].Neg(&tmpa) + r.AddXY(r, &tmpa) + } + } + } +} + +// Neg caculate neg +func (xyz *XYZ) Neg(r *XYZ) { + r.Infinity = xyz.Infinity + r.X = xyz.X + r.Y = xyz.Y + r.Z = xyz.Z + r.Y.Normalize() + r.Y.Negate(&r.Y, 1) +} + +func (xyz *XYZ) mulLambda(r *XYZ) { + *r = *xyz + r.X.Mul(&r.X, &TheCurve.beta) +} + +// Double cacule double +func (xyz *XYZ) Double(r *XYZ) { + var t1, t2, t3, t4, t5 Field + + t5 = xyz.Y + t5.Normalize() + if xyz.Infinity || t5.IsZero() { + r.Infinity = true + return + } + + t5.Mul(&r.Z, &xyz.Z) + r.Z.MulInt(2) + xyz.X.Sqr(&t1) + t1.MulInt(3) + t1.Sqr(&t2) + t5.Sqr(&t3) + t3.MulInt(2) + t3.Sqr(&t4) + t4.MulInt(2) + xyz.X.Mul(&t3, &t3) + r.X = t3 + r.X.MulInt(4) + r.X.Negate(&r.X, 4) + r.X.SetAdd(&t2) + t2.Negate(&t2, 1) + t3.MulInt(6) + t3.SetAdd(&t2) + t1.Mul(&r.Y, &t3) + t4.Negate(&t2, 2) + r.Y.SetAdd(&t2) + r.Infinity = false +} + +// AddXY adds XY +func (xyz *XYZ) AddXY(r *XYZ, b *XY) { + if xyz.Infinity { + r.Infinity = b.Infinity + r.X = b.X + r.Y = b.Y + r.Z.SetInt(1) + return + } + if b.Infinity { + *r = *xyz + return + } + r.Infinity = false + var z12, u1, u2, s1, s2 Field + xyz.Z.Sqr(&z12) + u1 = xyz.X + u1.Normalize() + b.X.Mul(&u2, &z12) + s1 = xyz.Y + s1.Normalize() + b.Y.Mul(&s2, &z12) + s2.Mul(&s2, &xyz.Z) + u1.Normalize() + u2.Normalize() + + if u1.Equals(&u2) { + s1.Normalize() + s2.Normalize() + if s1.Equals(&s2) { + xyz.Double(r) + } else { + r.Infinity = true + } + return + } + + var h, i, i2, h2, h3, t Field + u1.Negate(&h, 1) + h.SetAdd(&u2) + s1.Negate(&i, 1) + i.SetAdd(&s2) + i.Sqr(&i2) + h.Sqr(&h2) + h.Mul(&h3, &h2) + r.Z = xyz.Z + r.Z.Mul(&r.Z, &h) + u1.Mul(&t, &h2) + r.X = t + r.X.MulInt(2) + r.X.SetAdd(&h3) + r.X.Negate(&r.X, 3) + r.X.SetAdd(&i2) + r.X.Negate(&r.Y, 5) + r.Y.SetAdd(&t) + r.Y.Mul(&r.Y, &i) + h3.Mul(&h3, &s1) + h3.Negate(&h3, 1) + r.Y.SetAdd(&h3) +} + +// Add adds value +func (xyz *XYZ) Add(r, b *XYZ) { + if xyz.Infinity { + *r = *b + return + } + if b.Infinity { + *r = *xyz + return + } + r.Infinity = false + var z22, z12, u1, u2, s1, s2 Field + + b.Z.Sqr(&z22) + xyz.Z.Sqr(&z12) + xyz.X.Mul(&u1, &z22) + b.X.Mul(&u2, &z12) + xyz.Y.Mul(&s1, &z22) + s1.Mul(&s1, &b.Z) + b.Y.Mul(&s2, &z12) + s2.Mul(&s2, &xyz.Z) + u1.Normalize() + u2.Normalize() + if u1.Equals(&u2) { + s1.Normalize() + s2.Normalize() + if s1.Equals(&s2) { + xyz.Double(r) + } else { + r.Infinity = true + } + return + } + var h, i, i2, h2, h3, t Field + + u1.Negate(&h, 1) + h.SetAdd(&u2) + s1.Negate(&i, 1) + i.SetAdd(&s2) + i.Sqr(&i2) + h.Sqr(&h2) + h.Mul(&h3, &h2) + xyz.Z.Mul(&r.Z, &b.Z) + r.Z.Mul(&r.Z, &h) + u1.Mul(&t, &h2) + r.X = t + r.X.MulInt(2) + r.X.SetAdd(&h3) + r.X.Negate(&r.X, 3) + r.X.SetAdd(&i2) + r.X.Negate(&r.Y, 5) + r.Y.SetAdd(&t) + r.Y.Mul(&r.Y, &i) + h3.Mul(&h3, &s1) + h3.Negate(&h3, 1) + r.Y.SetAdd(&h3) +} + +// ECmultGen r = a*G +func ECmultGen(a Number) XYZ { + var n Number + var r XYZ + n.Set(&a.Int) + r.SetXY(&prec[0][n.rshX(4)]) + for j := 1; j < 64; j++ { + r.AddXY(&r, &prec[j][n.rshX(4)]) + } + r.AddXY(&r, &fin) + return r +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go new file mode 100644 index 00000000..4b6c0f76 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go @@ -0,0 +1,9356 @@ +package secp256k1go + +var fin = XY{X: Field{[10]uint32{0x035871aa, 0x002dc101, 0x0059ab0f, 0x02cb297e, 0x00684bb5, 0x02585764, 0x02f3cceb, 0x002bdca3, 0x03dcb7cc, 0x0013cd56}}, Y: Field{[10]uint32{0x044d069d, 0x0603c088, 0x07541d4e, 0x04a4074d, 0x045fcba8, 0x05f00c34, 0x04bab268, 0x05fd8d65, 0x04e47151, 0x0071e924}}} + +var preG = []XY{ + {X: Field{[10]uint32{0x02f81798, 0x00a056c5, 0x028d959f, 0x036cb738, 0x03029bfc, 0x03a1c2c1, 0x0206295c, 0x02eeb156, 0x027ef9dc, 0x001e6f99}}, Y: Field{[10]uint32{0x0310d4b8, 0x01f423fe, 0x014199c4, 0x01229a15, 0x00fd17b4, 0x0384422a, 0x024fbfc0, 0x03119576, 0x027726a3, 0x00120eb6}}}, + {X: Field{[10]uint32{0x00e036f9, 0x007c44ef, 0x019b0860, 0x01160dbe, 0x01b531c8, 0x0227548a, 0x0344f85f, 0x030c4124, 0x02019258, 0x003e4c22}}, Y: Field{[10]uint32{0x00b8e672, 0x027f5d61, 0x0231b6cb, 0x0264d308, 0x026500a9, 0x028dfcd5, 0x02337e62, 0x03a0503f, 0x030f632d, 0x000e23de}}}, + {X: Field{[10]uint32{0x0240efe4, 0x02355a6c, 0x01ab7cba, 0x02f77186, 0x00e88b84, 0x0297144a, 0x034a7250, 0x00824d56, 0x024d1a07, 0x000be2f7}}, Y: Field{[10]uint32{0x02ac62d6, 0x021f4ea9, 0x02840dca, 0x006eac35, 0x02f78827, 0x01b27109, 0x01ba9dda, 0x038f5b53, 0x022636e5, 0x00362b08}}}, + {X: Field{[10]uint32{0x02c4f9bc, 0x02f77b72, 0x0239ce92, 0x01f80cc3, 0x023d419b, 0x00ba9e83, 0x018f365f, 0x02d3aa8e, 0x00646e5d, 0x00172f7c}}, Y: Field{[10]uint32{0x007264da, 0x02098a02, 0x027b5a50, 0x02e04ff7, 0x03a813d0, 0x01869536, 0x0178d6d8, 0x0165828c, 0x0240ba25, 0x001abaf2}}}, + {X: Field{[10]uint32{0x0027ccbe, 0x03c4437f, 0x02714c35, 0x025d315f, 0x01e09796, 0x03d566af, 0x02d178a9, 0x03d94c26, 0x00e2f0c7, 0x002b3521}}, Y: Field{[10]uint32{0x024f9c37, 0x03098ab1, 0x00e0f05c, 0x0290dd7e, 0x01add888, 0x018ed87a, 0x03809717, 0x0367f590, 0x0121b0a7, 0x00330ce2}}}, + {X: Field{[10]uint32{0x01a008cb, 0x0305e257, 0x03891bbe, 0x002f9705, 0x00564998, 0x003196ab, 0x034246b7, 0x0104797b, 0x03f858a9, 0x001dd2b9}}, Y: Field{[10]uint32{0x0153c61b, 0x035d3272, 0x016a8301, 0x038b7fe7, 0x01372db1, 0x01edecd9, 0x003dd56d, 0x01786409, 0x0032eb6b, 0x00366128}}}, + {X: Field{[10]uint32{0x01405aa8, 0x0377e3c6, 0x018cddee, 0x03198439, 0x01b075fb, 0x00dd2194, 0x011d205c, 0x00a22f1f, 0x03c2d975, 0x003ca1dc}}, Y: Field{[10]uint32{0x0303ed81, 0x0172d4b6, 0x0291f29b, 0x0369487e, 0x033a1a06, 0x01736bd1, 0x00212eb6, 0x002a25d6, 0x002e8d88, 0x0002ac24}}}, + {X: Field{[10]uint32{0x027e080e, 0x036f3e38, 0x0379e44a, 0x01bcf217, 0x0131e594, 0x0257fd04, 0x0065ae30, 0x03aa5969, 0x014f7d43, 0x0035e493}}, Y: Field{[10]uint32{0x02a26b58, 0x013727fd, 0x013a5c50, 0x00af625b, 0x03ea40af, 0x02331b7b, 0x0042ec22, 0x01ca9a0e, 0x0072a86c, 0x0016078a}}}, + {X: Field{[10]uint32{0x022d4a34, 0x013ea812, 0x0368766e, 0x02b9e6e5, 0x01eb9898, 0x01fab3c8, 0x020fee80, 0x01dd4290, 0x024cdb67, 0x0037bf7a}}, Y: Field{[10]uint32{0x0256eb77, 0x00667da7, 0x000f6cfb, 0x02812a57, 0x02ced1f4, 0x00aa4f6b, 0x017b0ead, 0x0145a3a6, 0x03069463, 0x0010846a}}}, + {X: Field{[10]uint32{0x00385b6c, 0x0159584e, 0x02d27747, 0x03af5fa1, 0x01f06acf, 0x0113d25e, 0x02f5cff4, 0x010f4a4f, 0x00a797a4, 0x000ad3a8}}, Y: Field{[10]uint32{0x01c09b7a, 0x00321539, 0x01763b57, 0x0031409a, 0x031a01f6, 0x02872184, 0x003083b5, 0x01764ecd, 0x03c03794, 0x00217a26}}}, + {X: Field{[10]uint32{0x01be59d5, 0x0102bbc9, 0x01071813, 0x0009c7e0, 0x001d9ad4, 0x0338cccc, 0x013fa332, 0x0049593e, 0x034a4cdd, 0x000d4aef}}, Y: Field{[10]uint32{0x0381998c, 0x034f62f3, 0x0039c67b, 0x00b9c6c4, 0x034a1b3b, 0x03768f87, 0x01c18259, 0x03d4d356, 0x00075348, 0x000c87ad}}}, + {X: Field{[10]uint32{0x02cacc3f, 0x0336b753, 0x03f29dc9, 0x037fbfd7, 0x00e42ab8, 0x0261e449, 0x03001055, 0x03446c08, 0x004d6b38, 0x000be884}}, Y: Field{[10]uint32{0x032b7d67, 0x02e9dad4, 0x02648423, 0x03b3f220, 0x00181d70, 0x02f57760, 0x00569335, 0x036196d9, 0x0068295d, 0x0000b784}}}, + {X: Field{[10]uint32{0x01453714, 0x028335fd, 0x032e269c, 0x02138255, 0x03263c3d, 0x01bb76a0, 0x021a9b06, 0x035a36ac, 0x039b09b4, 0x00249209}}, Y: Field{[10]uint32{0x03cb3402, 0x028cb3a5, 0x012ffe54, 0x00aa21e4, 0x033fc0de, 0x03a8ac7f, 0x01aa71bd, 0x02ab7974, 0x037bf234, 0x001cc05b}}}, + {X: Field{[10]uint32{0x01ee8729, 0x025b510f, 0x015c07e9, 0x00512fd8, 0x022f570e, 0x002fadd4, 0x030132fb, 0x02fc9e39, 0x032be3a8, 0x0036bb53}}, Y: Field{[10]uint32{0x00be1c55, 0x003948a4, 0x02726ab4, 0x00c3cebe, 0x003f83c2, 0x03be35c0, 0x021aca87, 0x0263a352, 0x024a7d6c, 0x0029a773}}}, + {X: Field{[10]uint32{0x0122e7db, 0x00ed7a1f, 0x001b0e6a, 0x03a7f7ca, 0x0011ecd9, 0x02ec67e4, 0x00f28d7c, 0x0204ba2b, 0x02c7065d, 0x00311344}}, Y: Field{[10]uint32{0x020e6482, 0x02418fc3, 0x021c5a03, 0x02187b7d, 0x000e106e, 0x0260bf6b, 0x0045926c, 0x01b371db, 0x0060ce32, 0x00084669}}}, + {X: Field{[10]uint32{0x0269e6b4, 0x031972f4, 0x00063b61, 0x014cdb0a, 0x03152b69, 0x03b58214, 0x01a20cfd, 0x02141322, 0x03f6dc69, 0x001a8916}}, Y: Field{[10]uint32{0x000d8a82, 0x0398d204, 0x03b6efd5, 0x01234108, 0x018b33ba, 0x005a892b, 0x03f5126f, 0x0129c22c, 0x0342c2bd, 0x003808b3}}}, + {X: Field{[10]uint32{0x010bd6a5, 0x02b95fc3, 0x01146f95, 0x002c2fb0, 0x00ce1330, 0x03950421, 0x037e3d2f, 0x03989f01, 0x03a6fd9d, 0x0005a5ff}}, Y: Field{[10]uint32{0x001b2396, 0x03a758f4, 0x00ae7ade, 0x00027926, 0x03a2cf15, 0x01155d0c, 0x0161506e, 0x01bd749d, 0x00f18680, 0x002e70e6}}}, + {X: Field{[10]uint32{0x027a7479, 0x008d17bc, 0x0361df98, 0x0183fedf, 0x019deb83, 0x020d32c3, 0x02d0f07e, 0x01c62e61, 0x03019981, 0x001816f6}}, Y: Field{[10]uint32{0x016b8c49, 0x00787a41, 0x00db43b0, 0x03a13ec5, 0x03c26bfa, 0x0325bf88, 0x0278d93e, 0x03481a06, 0x012de4f8, 0x0000a5cb}}}, + {X: Field{[10]uint32{0x007ff33d, 0x0071fa76, 0x0310cfe3, 0x00d52566, 0x00dcb01c, 0x02885784, 0x002fdc45, 0x02fd25d0, 0x01ab4150, 0x0018b453}}, Y: Field{[10]uint32{0x03b25eaf, 0x01590920, 0x0072235f, 0x00a59ead, 0x0301aa13, 0x003bb436, 0x0088a195, 0x02c04260, 0x02bd8cc5, 0x00203f01}}}, + {X: Field{[10]uint32{0x02308b6f, 0x01570be1, 0x00b425e5, 0x03d5ae6e, 0x032c50e9, 0x0102395a, 0x01b4b06c, 0x009f6b79, 0x02d0040f, 0x00203182}}, Y: Field{[10]uint32{0x030bd57a, 0x0007d590, 0x024eb1aa, 0x0132f9c0, 0x00a65eed, 0x03f9cbdc, 0x0266bad7, 0x030c3c9b, 0x003f1cc5, 0x00070e0c}}}, + {X: Field{[10]uint32{0x0203c8fb, 0x03aaec3e, 0x007049d5, 0x02521f61, 0x004cc5dc, 0x0331534d, 0x034c6348, 0x02b552a9, 0x01ad6167, 0x001ea4dd}}, Y: Field{[10]uint32{0x024dc7f7, 0x01267b08, 0x00e2b02d, 0x028431c3, 0x02bdc59e, 0x0249a411, 0x0159e0d7, 0x01c9a425, 0x03a9eca8, 0x0003438f}}}, + {X: Field{[10]uint32{0x03c3ffc9, 0x0147d166, 0x01f504bb, 0x030e6da3, 0x01bb408e, 0x01511e9e, 0x03a9ed04, 0x02d53241, 0x00d9b696, 0x00354a3b}}, Y: Field{[10]uint32{0x01409933, 0x01196d48, 0x00dbc063, 0x01017148, 0x02bc4345, 0x007f595b, 0x026f2188, 0x0397e665, 0x01253136, 0x003bb3d0}}}, + {X: Field{[10]uint32{0x00b45963, 0x00c6023e, 0x00b13872, 0x017929fb, 0x00526611, 0x023b36b4, 0x025f514e, 0x00d04ba8, 0x00a4b5f4, 0x000124dc}}, Y: Field{[10]uint32{0x02949c9a, 0x00c14a84, 0x02764b65, 0x02beed6d, 0x0254c3f3, 0x004bf58a, 0x03081b05, 0x03b50a2c, 0x0341afd6, 0x001d63cf}}}, + {X: Field{[10]uint32{0x00345d74, 0x004fac7f, 0x018e2f1c, 0x00783852, 0x03881d81, 0x0191c0bb, 0x03df930d, 0x0232ef5c, 0x00936ee8, 0x001dfc8c}}, Y: Field{[10]uint32{0x031c60d6, 0x03acf1d9, 0x037cbbe8, 0x00c365c1, 0x0096c953, 0x02e86cde, 0x008266e9, 0x02d90028, 0x002a7886, 0x002563bd}}}, + {X: Field{[10]uint32{0x0339f530, 0x0214c6dd, 0x00dbaeb2, 0x01d2ae75, 0x0258c800, 0x031f02f3, 0x004887e5, 0x0392e7a9, 0x0191cc4c, 0x003cb6b2}}, Y: Field{[10]uint32{0x003a3c37, 0x005f6e9c, 0x024fd1a1, 0x03ac1663, 0x039eb5fb, 0x03094c77, 0x021f32de, 0x0236b536, 0x009b3b2f, 0x003837b7}}}, + {X: Field{[10]uint32{0x0290d45b, 0x02921431, 0x023debcb, 0x037f276b, 0x025a216c, 0x03894804, 0x00be8fbb, 0x0087ec6d, 0x019f6626, 0x00118ecf}}, Y: Field{[10]uint32{0x02f7307e, 0x00ddec06, 0x01de31cb, 0x01f25c28, 0x03c622e2, 0x036188b5, 0x0114306d, 0x01b0d50c, 0x00d78c29, 0x0017b50c}}}, + {X: Field{[10]uint32{0x0198f247, 0x0125ad26, 0x022d1a32, 0x03050ca2, 0x036b98fa, 0x03ced665, 0x0232d4af, 0x01b8a824, 0x004244e4, 0x003c5be0}}, Y: Field{[10]uint32{0x00e31df6, 0x01e658b1, 0x00e26d65, 0x0309b973, 0x012a6c53, 0x03d38cf6, 0x01206fcd, 0x00fdf84f, 0x019b8220, 0x0033b6af}}}, + {X: Field{[10]uint32{0x011d41d1, 0x03857dc5, 0x03c65369, 0x0056b389, 0x015d2453, 0x010c46bd, 0x0352b7a1, 0x01158ec0, 0x00272dc8, 0x0032bdd5}}, Y: Field{[10]uint32{0x00a04476, 0x03e420c6, 0x032a5c32, 0x02de5888, 0x035f4fa9, 0x01791815, 0x01b643fa, 0x03d7ca90, 0x0260ef35, 0x0032d1d1}}}, + {X: Field{[10]uint32{0x03082120, 0x025ef21b, 0x017c1244, 0x001f2e1b, 0x0344a09c, 0x0265e762, 0x01d0f170, 0x02e61be1, 0x024b282c, 0x00098032}}, Y: Field{[10]uint32{0x027e4b40, 0x02fa51d6, 0x00ef44b0, 0x01d2ad7c, 0x015ac6be, 0x0376ed17, 0x013b03fc, 0x016f5a9a, 0x008753c1, 0x0010466e}}}, + {X: Field{[10]uint32{0x0198e435, 0x00a9dd1a, 0x03dc8c60, 0x0217893d, 0x0001c486, 0x0048882f, 0x00ec53cd, 0x010cb0ce, 0x0272d7e8, 0x001d8d72}}, Y: Field{[10]uint32{0x005b9c61, 0x01dbcc0b, 0x008bad9e, 0x018755c1, 0x034ecfc0, 0x03de39b5, 0x01d5e590, 0x027584f4, 0x00960948, 0x000246d9}}}, + {X: Field{[10]uint32{0x0356cc18, 0x0141d0ef, 0x028fbc1a, 0x00d1e751, 0x02b7f2b3, 0x03bba299, 0x03f4a87d, 0x015c336e, 0x0239f325, 0x001d538c}}, Y: Field{[10]uint32{0x00536683, 0x0366024f, 0x0295d0c5, 0x034065e9, 0x0023ee33, 0x013a9268, 0x00d0ed30, 0x028c3ecf, 0x0386e5bd, 0x00019cfe}}}, + {X: Field{[10]uint32{0x01d9b9e8, 0x009a51a4, 0x0152f9fe, 0x01987472, 0x00330800, 0x00b55c3c, 0x017859c8, 0x03a5abfd, 0x011071a1, 0x0038f9af}}, Y: Field{[10]uint32{0x020e37f5, 0x000abd24, 0x00c41670, 0x00e64fa4, 0x02a5a228, 0x01e68f2d, 0x000aa583, 0x039dbd03, 0x00bba394, 0x00167278}}}, + {X: Field{[10]uint32{0x004aa6eb, 0x011ff73c, 0x01f4b4cc, 0x03ccae8d, 0x01c4ccb1, 0x03dcca61, 0x02e73d88, 0x000ce09a, 0x003d056a, 0x00061ad2}}, Y: Field{[10]uint32{0x0280888b, 0x01e5fe1b, 0x038b4a4a, 0x02422544, 0x0321fb80, 0x0010602a, 0x017446e2, 0x03ddf8b8, 0x0132c67c, 0x000ee54b}}}, + {X: Field{[10]uint32{0x00e0963f, 0x00c85c93, 0x019c91a8, 0x034adcdf, 0x025442e6, 0x012f93dc, 0x0098561f, 0x01b39513, 0x00a6b987, 0x0037e75c}}, Y: Field{[10]uint32{0x02ba2417, 0x0231173c, 0x01da217b, 0x009c83be, 0x02b15722, 0x0370e752, 0x0062b785, 0x01b3357e, 0x01afd84d, 0x00157acb}}}, + {X: Field{[10]uint32{0x00ce7143, 0x019317cd, 0x018995de, 0x013e127b, 0x00ab5255, 0x0177383e, 0x03ca815d, 0x03a1e925, 0x00c23c51, 0x0017b757}}, Y: Field{[10]uint32{0x0399a868, 0x01c1aadc, 0x02905cdc, 0x030345e8, 0x00c13c66, 0x003226b4, 0x028cec03, 0x004c1987, 0x008dbc14, 0x003beba7}}}, + {X: Field{[10]uint32{0x00614fba, 0x034d8be1, 0x0317a722, 0x02870d56, 0x037aa3fb, 0x021fa79d, 0x012fe022, 0x01a0c368, 0x00c2b647, 0x000a41e6}}, Y: Field{[10]uint32{0x01943e7a, 0x000ebf50, 0x023146d0, 0x02536ca8, 0x015b29c0, 0x01e6bc97, 0x00d00bcf, 0x00188662, 0x036dcd44, 0x0038e369}}}, + {X: Field{[10]uint32{0x00053b45, 0x03f7b3bd, 0x0257362d, 0x00bf8d80, 0x01cd2955, 0x00542b0e, 0x00754efa, 0x03d6cc15, 0x023a95d9, 0x002bcf10}}, Y: Field{[10]uint32{0x018fd9c6, 0x03fb7b52, 0x01581bc2, 0x02999e85, 0x00c8cd5a, 0x00d73ed0, 0x013b0e6f, 0x00add26a, 0x03d831eb, 0x003e628f}}}, + {X: Field{[10]uint32{0x0084249a, 0x03fb5436, 0x018df8d2, 0x02c9b73e, 0x0106bb66, 0x026fc9d2, 0x00aa28c9, 0x039d1733, 0x0324d134, 0x001d9b6e}}, Y: Field{[10]uint32{0x03ac5996, 0x0093e5f2, 0x00edd2c9, 0x0197e81b, 0x0097584a, 0x00368e2e, 0x00c88798, 0x03978e37, 0x0152eacb, 0x001d12c4}}}, + {X: Field{[10]uint32{0x011abe3e, 0x00b99986, 0x02a58ce9, 0x013db165, 0x0245f7b4, 0x01e13d05, 0x01277c33, 0x01d66e88, 0x006f8c94, 0x001676fd}}, Y: Field{[10]uint32{0x02307f6e, 0x03885b12, 0x0398cd85, 0x0269e465, 0x0042ce73, 0x0120c268, 0x00ea6ce6, 0x02f0c03d, 0x0144175f, 0x00314d2b}}}, + {X: Field{[10]uint32{0x00fd87b8, 0x03718063, 0x0273cb62, 0x01c46a57, 0x00dd647e, 0x013a692a, 0x01e691e7, 0x0114dcc1, 0x0295103c, 0x003c4eb6}}, Y: Field{[10]uint32{0x02f5733d, 0x021066f6, 0x00257077, 0x0069a9d7, 0x026949e2, 0x020d07cc, 0x03f4bc80, 0x0137998e, 0x03b44ee1, 0x00384e05}}}, + {X: Field{[10]uint32{0x0288522c, 0x01540056, 0x01fb6488, 0x0301baeb, 0x00da1869, 0x01673293, 0x00167a2c, 0x033b41b5, 0x00fa0e8a, 0x001dd52d}}, Y: Field{[10]uint32{0x001163a2, 0x0122d5e1, 0x03cc537a, 0x00d42db2, 0x028d1e4e, 0x00082e3e, 0x00b967c3, 0x02760889, 0x02864e66, 0x000c3a4f}}}, + {X: Field{[10]uint32{0x02262519, 0x00a32678, 0x001d2a68, 0x02577a01, 0x0301858f, 0x02afbe75, 0x03874d46, 0x038122a8, 0x02df5990, 0x00252372}}, Y: Field{[10]uint32{0x0347d57e, 0x028b2b94, 0x031d2cbb, 0x03bef4bb, 0x01df9154, 0x012c6f09, 0x0128a322, 0x03965f57, 0x002537f6, 0x00392469}}}, + {X: Field{[10]uint32{0x017c77ab, 0x00a2a28f, 0x03a15703, 0x03d6b02f, 0x03fb224c, 0x0080bb0d, 0x007b48f8, 0x01b05a27, 0x014450c7, 0x001e5890}}, Y: Field{[10]uint32{0x01b83437, 0x03e96ca7, 0x02c5760a, 0x00147c12, 0x0312507a, 0x00fbdbda, 0x01c1fc13, 0x02d1d835, 0x010ec4ff, 0x000402d8}}}, + {X: Field{[10]uint32{0x03ec47ca, 0x0342144d, 0x0047bb0d, 0x01c896e2, 0x005a1697, 0x01364552, 0x01b16064, 0x012d52c5, 0x00783496, 0x000d4502}}, Y: Field{[10]uint32{0x02293311, 0x03456837, 0x0378b7e7, 0x01f05708, 0x006039e7, 0x03a049ff, 0x01652c48, 0x00151238, 0x03b20562, 0x003bc2be}}}, + {X: Field{[10]uint32{0x03527eaf, 0x010f4fde, 0x007b4429, 0x03ae37de, 0x0193e947, 0x0362f152, 0x01ce2c9d, 0x00f92f1e, 0x00ad6b48, 0x0034f30c}}, Y: Field{[10]uint32{0x02ede0a4, 0x00d36c13, 0x00630afb, 0x018a40d6, 0x023c2ad4, 0x03e5422b, 0x005e9be8, 0x009e3627, 0x0222d827, 0x0022cde2}}}, + {X: Field{[10]uint32{0x00847610, 0x016e83fd, 0x03649397, 0x00f6e44f, 0x032b2982, 0x03fbf822, 0x01c78fcb, 0x00a18338, 0x00478073, 0x00058936}}, Y: Field{[10]uint32{0x00078575, 0x01b8a901, 0x024c8cc0, 0x03d4a0af, 0x02896878, 0x03367532, 0x014448c6, 0x0240f824, 0x00f9b6da, 0x001a1947}}}, + {X: Field{[10]uint32{0x03c61cd4, 0x01ed3f57, 0x007da6df, 0x012d6bc8, 0x00519247, 0x00f98aa6, 0x002c9563, 0x02a289a4, 0x000da955, 0x001ccf3a}}, Y: Field{[10]uint32{0x01c5ea1d, 0x019cef07, 0x00578c54, 0x03808079, 0x023e1ef8, 0x036e7f33, 0x01a4d8b8, 0x037df521, 0x022bd2ba, 0x003d50d6}}}, + {X: Field{[10]uint32{0x001c045c, 0x01637eae, 0x02699ef2, 0x002485c7, 0x038966c5, 0x02f4ed27, 0x01a1c33b, 0x0141933c, 0x00125494, 0x00057651}}, Y: Field{[10]uint32{0x03e4070d, 0x01eefa7b, 0x00685fc3, 0x02eb3aff, 0x03434800, 0x00ee105d, 0x035137b7, 0x00f9c8d3, 0x030b6946, 0x00355bac}}}, + {X: Field{[10]uint32{0x00717940, 0x00e16674, 0x00aaaac1, 0x01f274ae, 0x031c2141, 0x0339c349, 0x012136e5, 0x0399d6d8, 0x00f2ec9d, 0x0028743f}}, Y: Field{[10]uint32{0x0197a629, 0x004b4e70, 0x033d5192, 0x029501c3, 0x02641462, 0x002599fc, 0x02907373, 0x028f2acb, 0x0350bcb5, 0x003b75df}}}, + {X: Field{[10]uint32{0x00b36980, 0x028dccc7, 0x01c06c7c, 0x037ba091, 0x01a790ba, 0x03e136fa, 0x000c0735, 0x0233315e, 0x0215c0af, 0x00388bef}}, Y: Field{[10]uint32{0x0131da06, 0x0341b5df, 0x0399be43, 0x00552591, 0x03a38289, 0x03d4e869, 0x03430a69, 0x03583222, 0x03abad5c, 0x0002a156}}}, + {X: Field{[10]uint32{0x02cfa9b3, 0x02514891, 0x02aa7400, 0x00e51c13, 0x0369635e, 0x004557d7, 0x0213473c, 0x03a3883b, 0x01dd9860, 0x000c4424}}, Y: Field{[10]uint32{0x006d8374, 0x003c2c4a, 0x02685bd8, 0x02993fbb, 0x00871ec5, 0x02301a0c, 0x011f0478, 0x03c13fff, 0x016f87d1, 0x0019b6d9}}}, + {X: Field{[10]uint32{0x02c2dbdf, 0x01f508cb, 0x00078186, 0x02d16a4d, 0x00883928, 0x00f9ab09, 0x01c0442d, 0x02fa26cc, 0x0104d301, 0x000d307f}}, Y: Field{[10]uint32{0x0273abee, 0x008615ee, 0x0043dc53, 0x03bad21d, 0x02d57f1c, 0x0005d04d, 0x03d46f73, 0x006d6552, 0x0285e97b, 0x00025051}}}, + {X: Field{[10]uint32{0x009b8d63, 0x02979ac1, 0x00affcc2, 0x02aef342, 0x028d13f3, 0x015fad0a, 0x014de5b5, 0x01c07070, 0x025d6b54, 0x003c867a}}, Y: Field{[10]uint32{0x000766d1, 0x00a58a90, 0x03fb8d8c, 0x00f01ec9, 0x01f4b08d, 0x03333dac, 0x03af4544, 0x0102c3dc, 0x0157e83d, 0x00132e56}}}, + {X: Field{[10]uint32{0x01a0b448, 0x01a4491a, 0x02708723, 0x0242f298, 0x02543a54, 0x03d17789, 0x03683db8, 0x03eeaac7, 0x000f74a8, 0x0035ee1d}}, Y: Field{[10]uint32{0x02a4593b, 0x0380c57a, 0x009b3411, 0x017b4f01, 0x02ff15db, 0x02b51c5f, 0x0010f337, 0x0324bb84, 0x028128d9, 0x003e9de5}}}, + {X: Field{[10]uint32{0x02a824bf, 0x0134c246, 0x014289fe, 0x00caaf76, 0x02ad5bcd, 0x00e8ccd7, 0x02f7c98d, 0x01bc3be1, 0x00222f8f, 0x000cb4c7}}, Y: Field{[10]uint32{0x022e1661, 0x03452e11, 0x02961118, 0x0279bc9b, 0x022e6dac, 0x016e7876, 0x00d3d791, 0x015b8e73, 0x02f58921, 0x0017cc0c}}}, + {X: Field{[10]uint32{0x018347b5, 0x03e1b2f0, 0x012c4340, 0x01f35656, 0x028793d7, 0x03660c7a, 0x0045a155, 0x02cc99c4, 0x0371914a, 0x001d187c}}, Y: Field{[10]uint32{0x00092ff6, 0x0211ecf3, 0x02ea6b39, 0x03d43261, 0x002eee1f, 0x02a91095, 0x01ddcae0, 0x02fb032f, 0x02238b96, 0x0023b02e}}}, + {X: Field{[10]uint32{0x03b2b2d6, 0x01a62eb5, 0x0053d287, 0x00b0f99d, 0x026d716b, 0x028e081a, 0x0356a25a, 0x021801d0, 0x02db1df1, 0x003b81e6}}, Y: Field{[10]uint32{0x001c8c1e, 0x02b11e7b, 0x00e25eba, 0x026bc131, 0x02a44698, 0x03317e7d, 0x01f37e0e, 0x02f97131, 0x012aafe3, 0x00237090}}}, + {X: Field{[10]uint32{0x029da6b5, 0x036185ae, 0x01dc72bf, 0x00c61d32, 0x03e65de3, 0x03b9883d, 0x03b18302, 0x020fc119, 0x03e447ec, 0x0005bb24}}, Y: Field{[10]uint32{0x01b0674d, 0x019de389, 0x01713962, 0x01a94392, 0x039d5818, 0x02960128, 0x028c2a7c, 0x03ed0343, 0x01150e62, 0x0017918c}}}, + {X: Field{[10]uint32{0x0137bd99, 0x02581975, 0x02aa485b, 0x025fe62d, 0x03d88558, 0x03e9c2da, 0x0178290a, 0x03dbc0e2, 0x0180c245, 0x003aa97e}}, Y: Field{[10]uint32{0x02dc07dc, 0x00104093, 0x0267fb18, 0x0275f9ba, 0x00d78486, 0x03265189, 0x02528391, 0x00b82066, 0x013e292c, 0x003d97d7}}}, + {X: Field{[10]uint32{0x01a49f51, 0x0312dacd, 0x0342ea96, 0x021dc544, 0x0158ae04, 0x028090e6, 0x02ee1910, 0x0304c9a4, 0x0007544a, 0x0001e325}}, Y: Field{[10]uint32{0x00a3ddb4, 0x019d7c65, 0x00d2462b, 0x0160f019, 0x00fa1fbd, 0x00e6979a, 0x00047955, 0x026e1755, 0x019169eb, 0x003cf80c}}}, + {X: Field{[10]uint32{0x002857a5, 0x015e365c, 0x00688726, 0x02b9e9bf, 0x0001cdc8, 0x00c6ba80, 0x01cd8384, 0x029dc05b, 0x03e219a1, 0x001253d2}}, Y: Field{[10]uint32{0x000d562c, 0x012c0c62, 0x02d6e55f, 0x00c35d9f, 0x02f925ce, 0x038dae8a, 0x03a7f075, 0x0297cce6, 0x02969283, 0x0010890a}}}, + {X: Field{[10]uint32{0x001fe9b5, 0x03079997, 0x0270ebf4, 0x03a963ea, 0x01d28211, 0x0113a952, 0x007f2f51, 0x0361b1af, 0x00030da6, 0x0029662a}}, Y: Field{[10]uint32{0x01864e6b, 0x009b6f4b, 0x0386a100, 0x02d96cd7, 0x0023fc63, 0x001cdebb, 0x00b4a714, 0x00b0c1f9, 0x016f8482, 0x000812d7}}}, + {X: Field{[10]uint32{0x00595997, 0x02b70f96, 0x00a184db, 0x003c495c, 0x00208f02, 0x036fabfb, 0x0192f5f2, 0x00ad7424, 0x02365abb, 0x00310645}}, Y: Field{[10]uint32{0x00fa9913, 0x01ba5ad6, 0x03fc0ed1, 0x01143cd2, 0x01d5caf9, 0x02261262, 0x01245b32, 0x01fbe927, 0x0351d008, 0x00013c50}}}, + {X: Field{[10]uint32{0x00742881, 0x01ce9545, 0x02acfe4c, 0x034b828d, 0x0392a2e0, 0x0280ef16, 0x0324604d, 0x03e91d69, 0x0063a586, 0x00210758}}, Y: Field{[10]uint32{0x028d6154, 0x00db7806, 0x0169ce7a, 0x0359d130, 0x00e62562, 0x01d50da6, 0x004f9a1c, 0x0167a064, 0x03f59c06, 0x0001ce19}}}, + {X: Field{[10]uint32{0x030e20d5, 0x004ab135, 0x03e4ded1, 0x020424a2, 0x03282b33, 0x0226f78b, 0x0026947f, 0x01c74dd8, 0x03399a69, 0x0017a56e}}, Y: Field{[10]uint32{0x02012865, 0x00e131d1, 0x0238b161, 0x03b5f62e, 0x01a99c9a, 0x004c4ddd, 0x03fc7118, 0x00216fba, 0x03366809, 0x000e7c8f}}}, + {X: Field{[10]uint32{0x00ef2f66, 0x011c6f28, 0x01d8bf99, 0x0192d4c5, 0x025ec075, 0x027f65d3, 0x0039f8a9, 0x023f51db, 0x001a5394, 0x000db919}}, Y: Field{[10]uint32{0x014c78fc, 0x01473d5a, 0x023e06fd, 0x0124ff55, 0x0056ea13, 0x01726aa5, 0x00227b08, 0x013ae059, 0x031b1abe, 0x00349092}}}, + {X: Field{[10]uint32{0x0179f726, 0x02c9f0b1, 0x0114faea, 0x01085c3a, 0x00f56438, 0x0141e907, 0x00191a2f, 0x02eeca43, 0x001ea7bf, 0x0000cd96}}, Y: Field{[10]uint32{0x02fda224, 0x03372af4, 0x01e0ef3d, 0x00504334, 0x0391f7ab, 0x01b95acc, 0x0252129b, 0x0386fa64, 0x0168595f, 0x003ab448}}}, + {X: Field{[10]uint32{0x03d43ede, 0x01d09c1a, 0x010c4849, 0x0097b5a2, 0x00037810, 0x03c03b21, 0x032634fc, 0x035ada87, 0x0016dadf, 0x0022ae26}}, Y: Field{[10]uint32{0x01cdd24e, 0x011ea44a, 0x0045858a, 0x0270fa26, 0x03503d45, 0x018904db, 0x02654aef, 0x03428113, 0x0309f2f6, 0x001bf73b}}}, + {X: Field{[10]uint32{0x00c5fb94, 0x0100a12e, 0x032544bb, 0x023a2b3f, 0x0220b093, 0x00a67f2a, 0x033344d9, 0x0315de04, 0x01a746c9, 0x00078cfc}}, Y: Field{[10]uint32{0x03f3b3b6, 0x029f4815, 0x03010e33, 0x0083c740, 0x032306d3, 0x03493b7f, 0x008ed618, 0x006ceaa7, 0x00257dd1, 0x00018198}}}, + {X: Field{[10]uint32{0x00f08f31, 0x000d87f6, 0x00fcfa41, 0x0330632f, 0x020ed1f4, 0x01e77482, 0x03f30ded, 0x0306dfb9, 0x01dcb3ce, 0x00216df0}}, Y: Field{[10]uint32{0x02999511, 0x03b4f0d7, 0x02633c6f, 0x0062575e, 0x00fcafad, 0x02a211fd, 0x01048f25, 0x03750fce, 0x01cdd026, 0x000f662a}}}, + {X: Field{[10]uint32{0x01ac5f51, 0x00a00198, 0x03af872a, 0x00ee1e29, 0x017fbe9a, 0x0175b517, 0x035f4b12, 0x01194249, 0x03bd8d9e, 0x000a77e7}}, Y: Field{[10]uint32{0x0227d84b, 0x021dbaca, 0x01e55cd2, 0x02187006, 0x03da61dc, 0x01e44e7f, 0x02d88621, 0x016981b8, 0x03e99c77, 0x0002d313}}}, + {X: Field{[10]uint32{0x01fce252, 0x00acb912, 0x0105c808, 0x028bdda0, 0x03dfe58c, 0x02abe2b7, 0x02a6e671, 0x0211e8ff, 0x02e06b0a, 0x00282c72}}, Y: Field{[10]uint32{0x02296cf2, 0x0012540e, 0x030e650f, 0x0060d2bf, 0x026b72da, 0x01e9a8a3, 0x00b19d91, 0x002563b1, 0x0102edde, 0x002b90d0}}}, + {X: Field{[10]uint32{0x00e121e5, 0x00fcb930, 0x03e4ba11, 0x02cec84c, 0x01b499df, 0x03a100a5, 0x01c7ff67, 0x03a684db, 0x02afb9b3, 0x00013a33}}, Y: Field{[10]uint32{0x0326683c, 0x01f398a8, 0x00502b82, 0x01a98d18, 0x01422c08, 0x0133971e, 0x008f6d53, 0x01b5e92d, 0x00118c8b, 0x0033c85d}}}, + {X: Field{[10]uint32{0x0389a33b, 0x01c970ad, 0x00919f42, 0x01a26804, 0x000a5076, 0x028bda42, 0x03b81c7c, 0x026dbd6b, 0x00e047e1, 0x00349291}}, Y: Field{[10]uint32{0x03ea8fa3, 0x03b105eb, 0x0244d2cd, 0x01a21ee0, 0x01013f99, 0x0303c71a, 0x03db50f1, 0x01be3f18, 0x01591b46, 0x001bee35}}}, + {X: Field{[10]uint32{0x023b35d4, 0x013a63a3, 0x0377b510, 0x00a2aeea, 0x00001edd, 0x032e6561, 0x01fdfcfa, 0x02737492, 0x006a7a6c, 0x003a8058}}, Y: Field{[10]uint32{0x023ea98d, 0x01948622, 0x03700cfd, 0x012f0a08, 0x01b7d449, 0x01e9ecf3, 0x03fe369f, 0x004ac33e, 0x00908c73, 0x000c8abd}}}, + {X: Field{[10]uint32{0x00e2131f, 0x0065b7a3, 0x031be4ad, 0x036317a8, 0x01252007, 0x03ae5994, 0x02328655, 0x007229b1, 0x01bf2b66, 0x002be2b7}}, Y: Field{[10]uint32{0x01749700, 0x03ef36dc, 0x02ac8f3d, 0x021a0389, 0x03252081, 0x0025a0da, 0x0034eafd, 0x0217d4a8, 0x027c029b, 0x0019d279}}}, + {X: Field{[10]uint32{0x00f45889, 0x03c38d14, 0x0215e722, 0x036af3f2, 0x01a674a3, 0x0383ec59, 0x00516d47, 0x01b281b3, 0x02197456, 0x000038eb}}, Y: Field{[10]uint32{0x030bd6a4, 0x0029cbba, 0x01f53342, 0x0121d3e0, 0x000de97e, 0x03d341cc, 0x0217f07b, 0x01440458, 0x027e4531, 0x000abaaf}}}, + {X: Field{[10]uint32{0x0397e246, 0x03aa33b4, 0x00802075, 0x03cfb496, 0x0301993f, 0x03b478f8, 0x036993ff, 0x0265c873, 0x0355313d, 0x001647b8}}, Y: Field{[10]uint32{0x03e5d196, 0x0263c692, 0x022bdeee, 0x014f4972, 0x001ff0b0, 0x011831e4, 0x00fc4775, 0x00c2fa98, 0x018a113c, 0x002c3a95}}}, + {X: Field{[10]uint32{0x01b52984, 0x033c0c95, 0x00945077, 0x0391ec21, 0x01fa8584, 0x02363698, 0x01aa9731, 0x013127c6, 0x0155fda5, 0x00044e5b}}, Y: Field{[10]uint32{0x03ea57a4, 0x019efaa4, 0x03be4c57, 0x02c06c95, 0x004ff536, 0x01efad1d, 0x01d5833a, 0x02b004a2, 0x00a8cd45, 0x0026631d}}}, + {X: Field{[10]uint32{0x0017aa7a, 0x010055f8, 0x00b64055, 0x0151a1d5, 0x038dcdfd, 0x02783102, 0x0000738c, 0x01685e40, 0x021ba39c, 0x000f174a}}, Y: Field{[10]uint32{0x001bd257, 0x01e72932, 0x00f6661f, 0x027f749c, 0x000f9b8b, 0x01bf062e, 0x014de739, 0x00d38be7, 0x0279995a, 0x002c8a10}}}, + {X: Field{[10]uint32{0x013cc030, 0x03be285e, 0x00078425, 0x02bec12b, 0x03fbc395, 0x027cba70, 0x0299a729, 0x0037be8e, 0x00b8a60a, 0x003321c1}}, Y: Field{[10]uint32{0x001f1b13, 0x02dd38eb, 0x01c4e940, 0x013f12f3, 0x00f395b7, 0x02cd1fe3, 0x01e0862d, 0x005e2074, 0x0039feed, 0x002f7518}}}, + {X: Field{[10]uint32{0x0089b197, 0x010466ca, 0x02e7ea20, 0x03f3314f, 0x017dd4de, 0x032b4a6e, 0x01777ac5, 0x0156ab36, 0x00f7ea85, 0x00314cf9}}, Y: Field{[10]uint32{0x03596096, 0x0383d17a, 0x03a26bb8, 0x02ed292c, 0x02d9b925, 0x03c690e8, 0x02fb6242, 0x037d0a68, 0x016bc5ef, 0x001bc289}}}, + {X: Field{[10]uint32{0x03da6593, 0x01b5238c, 0x03bbcf56, 0x00d3bb01, 0x0269ba8c, 0x000f325a, 0x01f6d08d, 0x01f5bc42, 0x00f2ccb2, 0x0003053e}}, Y: Field{[10]uint32{0x03dc3a38, 0x02192444, 0x035e6c0e, 0x03742601, 0x0075b740, 0x03f870a1, 0x00473e16, 0x0263dff5, 0x02923bb3, 0x0030d675}}}, + {X: Field{[10]uint32{0x0390e6ef, 0x007dcb82, 0x0321ce44, 0x03b5d7e3, 0x024c9739, 0x0285c456, 0x0024789f, 0x029142eb, 0x03046bc6, 0x0029b2f0}}, Y: Field{[10]uint32{0x03fa9b9f, 0x00abf585, 0x00313986, 0x01cf1c18, 0x0360ceb5, 0x0303e568, 0x030619e2, 0x02226ec4, 0x03f4680e, 0x000086b9}}}, + {X: Field{[10]uint32{0x0143cc38, 0x02ce7e67, 0x01ce6344, 0x00099f44, 0x03130a3c, 0x0166c72b, 0x03b86c13, 0x02249faf, 0x019a02c4, 0x000d1f5b}}, Y: Field{[10]uint32{0x01c74448, 0x027fc78c, 0x00cb1268, 0x02da1e1c, 0x006d565a, 0x03b24bc2, 0x0187f6ec, 0x01493472, 0x0361a353, 0x00183a9f}}}, + {X: Field{[10]uint32{0x0372656a, 0x03bdd0de, 0x008cf855, 0x02c6fcc7, 0x02d47c67, 0x017bd619, 0x037dcb37, 0x02e3660f, 0x01d2181d, 0x00369951}}, Y: Field{[10]uint32{0x03dc208a, 0x02a092dd, 0x03d897fe, 0x006d24d6, 0x01667305, 0x015a0317, 0x038f07ce, 0x01e29e79, 0x0315ab68, 0x00126e59}}}, + {X: Field{[10]uint32{0x03eb1111, 0x016652e3, 0x03146b9d, 0x02517595, 0x03ec25d6, 0x00271b79, 0x03b81483, 0x00b2c684, 0x03cc9d01, 0x003101d1}}, Y: Field{[10]uint32{0x020fa2d4, 0x03a0c0df, 0x014e1bb5, 0x0055ae54, 0x025db936, 0x032d2255, 0x01e6caf2, 0x0284bf1b, 0x00753be2, 0x00172958}}}, + {X: Field{[10]uint32{0x037f3502, 0x000fbd00, 0x03d34c82, 0x01c4cd22, 0x00338c7f, 0x03a1c39e, 0x033a610b, 0x025e6333, 0x00ec82c9, 0x001390b2}}, Y: Field{[10]uint32{0x03606437, 0x0111cda4, 0x03cc40a9, 0x01133152, 0x01a54921, 0x01de0cd0, 0x028b33a0, 0x03ee4a9e, 0x034ee5e0, 0x001d5c75}}}, + {X: Field{[10]uint32{0x030dedea, 0x008a86ce, 0x03432875, 0x036c3219, 0x02d251ca, 0x03dc2c8d, 0x02ba2e1a, 0x01abe08e, 0x037089bc, 0x000ddd6a}}, Y: Field{[10]uint32{0x01018cf7, 0x03658502, 0x02a2c42a, 0x01efde9d, 0x03ac8db1, 0x00a33e9f, 0x039736a8, 0x002762f2, 0x0107bcfa, 0x002f94b4}}}, + {X: Field{[10]uint32{0x02f74e26, 0x01678fa0, 0x03a88469, 0x01744c52, 0x02d95459, 0x034f5dd6, 0x014fb814, 0x03b0de76, 0x00bf7e34, 0x0033b8c7}}, Y: Field{[10]uint32{0x003b1c6d, 0x01228071, 0x014d80f4, 0x002f853b, 0x020149ef, 0x02f3dafe, 0x03947ae2, 0x0162709a, 0x0214c06b, 0x0023f592}}}, + {X: Field{[10]uint32{0x00b47986, 0x00680742, 0x02befcdc, 0x03f516c7, 0x02fddb58, 0x03ad5193, 0x036ea6a4, 0x0245d867, 0x02ea09b6, 0x002d3e7a}}, Y: Field{[10]uint32{0x0200682a, 0x02a2b01c, 0x0142eb24, 0x03004b29, 0x038bb131, 0x03185c9b, 0x033a4f18, 0x0152c1d0, 0x01925b5a, 0x000e7972}}}, + {X: Field{[10]uint32{0x02bcc60e, 0x0241de4b, 0x00cc1b77, 0x016bf0f7, 0x0284e251, 0x019b4c33, 0x0179a489, 0x03e48e80, 0x01fc3d2d, 0x0035098f}}, Y: Field{[10]uint32{0x02208d54, 0x0193848a, 0x00f7fae1, 0x01d82b5b, 0x0189e127, 0x01614f38, 0x0230d629, 0x023facc3, 0x0307a0f7, 0x0018b7eb}}}, + {X: Field{[10]uint32{0x017612c4, 0x00fbb6a2, 0x01e42223, 0x0302928b, 0x000032ac, 0x024c215f, 0x00d35eb6, 0x0299693e, 0x0124820f, 0x0012115d}}, Y: Field{[10]uint32{0x01bd0f77, 0x01daaa92, 0x00a9ae7a, 0x01f6cb58, 0x03dc6cc0, 0x03e870b9, 0x033c38a1, 0x01e7661c, 0x00ab3679, 0x000969d2}}}, + {X: Field{[10]uint32{0x011cceda, 0x0285d9f0, 0x0123f367, 0x0246454a, 0x02045e19, 0x00abf7f0, 0x01644f3a, 0x007cb2c4, 0x03188110, 0x0037fbbb}}, Y: Field{[10]uint32{0x029a7517, 0x020eb826, 0x03dff16a, 0x039d2d2e, 0x00c390bd, 0x0259e4f0, 0x0020bab3, 0x03810be5, 0x0056cf1d, 0x003b3edc}}}, + {X: Field{[10]uint32{0x00fae859, 0x00b7e0ee, 0x00ed36c8, 0x02f1818b, 0x035d89bc, 0x007ce260, 0x0173f44e, 0x03e0dcf1, 0x02b17543, 0x001b5fbd}}, Y: Field{[10]uint32{0x02712d10, 0x02c64372, 0x000bbf74, 0x02566cb6, 0x00c521a0, 0x01ffaa6f, 0x02fa10c5, 0x02261b7f, 0x02c33543, 0x00335143}}}, + {X: Field{[10]uint32{0x0204541f, 0x0096bd9b, 0x007035af, 0x024c8955, 0x03f3c88b, 0x02647cb8, 0x00500d3b, 0x029689a1, 0x01d59102, 0x0039d581}}, Y: Field{[10]uint32{0x03fad125, 0x0026438a, 0x00693836, 0x0314c22c, 0x014f729a, 0x0211cf8c, 0x039b4872, 0x007b9502, 0x0354a8f7, 0x003d7151}}}, + {X: Field{[10]uint32{0x01ed620c, 0x010ffbec, 0x008457dd, 0x0182af8e, 0x019a0c2e, 0x014082f2, 0x02be453d, 0x03ea81a8, 0x020f4c4d, 0x003ae619}}, Y: Field{[10]uint32{0x0099223e, 0x03d10400, 0x0131ce85, 0x022a5044, 0x00a0a7cd, 0x0349b348, 0x009af3ad, 0x02e14818, 0x00876d9c, 0x001b2e6a}}}, + {X: Field{[10]uint32{0x00dba942, 0x0158f8ee, 0x00336dc3, 0x01a50622, 0x02215459, 0x024ac664, 0x039f2e68, 0x00534d64, 0x03027d85, 0x0004fa1e}}, Y: Field{[10]uint32{0x02b8adf1, 0x00355591, 0x02beb257, 0x0295a35a, 0x02ac2b9d, 0x02fc7a46, 0x01624114, 0x029b7b17, 0x03c68059, 0x003fbd68}}}, + {X: Field{[10]uint32{0x01e5764a, 0x011245a4, 0x0308e7bf, 0x00dc7389, 0x0125424b, 0x016f9bf0, 0x0038f06a, 0x01bf805f, 0x0026e9fd, 0x003b858c}}, Y: Field{[10]uint32{0x016c62b2, 0x00c3682b, 0x02623e54, 0x03e856e5, 0x00f49ae3, 0x01c343d6, 0x0194ccc6, 0x0358710f, 0x010f255d, 0x0006b2c9}}}, + {X: Field{[10]uint32{0x03af3d80, 0x00b976cc, 0x02799993, 0x010d4161, 0x031e626d, 0x030b7226, 0x01e3a750, 0x007935e3, 0x01ef9ad5, 0x002c9a3d}}, Y: Field{[10]uint32{0x0216e423, 0x03a51684, 0x01614003, 0x013f5064, 0x018cf0d3, 0x03077b80, 0x01f77d41, 0x02e7aec6, 0x014b3c99, 0x0017cc43}}}, + {X: Field{[10]uint32{0x03c4750d, 0x03ff6ea4, 0x02ea3bf7, 0x0072a673, 0x002b02f0, 0x01b1eff9, 0x03ad85eb, 0x03c0d7a7, 0x03118a9d, 0x003fc1fc}}, Y: Field{[10]uint32{0x02d1f0d8, 0x00342633, 0x02ddd474, 0x0084538b, 0x01c1d294, 0x03b32eb7, 0x00440c38, 0x01628e97, 0x02d603e8, 0x0010e04d}}}, + {X: Field{[10]uint32{0x02b526a1, 0x03a30f38, 0x01ebec16, 0x02783609, 0x02a4b9f6, 0x03ed962f, 0x006fd20f, 0x014a8d05, 0x0055c7c0, 0x002362e6}}, Y: Field{[10]uint32{0x03036758, 0x00b9fd18, 0x03ceb30e, 0x03fb9475, 0x004bcf50, 0x0213a935, 0x03af44fb, 0x01e7e49a, 0x01eedc2d, 0x00336d56}}}, + {X: Field{[10]uint32{0x01a32b63, 0x0098c603, 0x031eba54, 0x033b2a46, 0x03e4b851, 0x01eb89b7, 0x029d472d, 0x02fc16fe, 0x035384df, 0x0014b6c2}}, Y: Field{[10]uint32{0x00a7b375, 0x012da761, 0x0279de92, 0x0240a1d5, 0x03b3180c, 0x01b6e7d5, 0x02baf66a, 0x0397508f, 0x017d050e, 0x00030ee6}}}, + {X: Field{[10]uint32{0x03d43352, 0x0150efb2, 0x008c6fff, 0x030fcfe9, 0x007d0f29, 0x02024673, 0x01efd24e, 0x007698e5, 0x0090d3d5, 0x00398be5}}, Y: Field{[10]uint32{0x00cafa7d, 0x001eff67, 0x02f5170e, 0x01647c76, 0x02f342c8, 0x031a0a18, 0x002ca280, 0x01ac2c8b, 0x017ba487, 0x001b626b}}}, + {X: Field{[10]uint32{0x02ab1193, 0x039f596a, 0x014fd6d8, 0x03d72dec, 0x011afa2f, 0x03ddf406, 0x03509c88, 0x0266d255, 0x022476b3, 0x001fcc3a}}, Y: Field{[10]uint32{0x037acaec, 0x03d2ffd8, 0x03e9880e, 0x02d9ec40, 0x01daff7b, 0x03d8c47a, 0x015389a5, 0x032530ec, 0x03d4b231, 0x003297bd}}}, + {X: Field{[10]uint32{0x000b7a00, 0x0280d860, 0x01d9ac60, 0x02d28774, 0x03ef0fb7, 0x029b240f, 0x02210fad, 0x0053ed1a, 0x031e1d9f, 0x0014263f}}, Y: Field{[10]uint32{0x0117ddc0, 0x016c4cbf, 0x03e5362a, 0x01035837, 0x02b3ee1b, 0x01d50801, 0x00d37c6e, 0x0323e021, 0x0141d81f, 0x00025cc4}}}, + {X: Field{[10]uint32{0x0378ad58, 0x00b20789, 0x01c96b9f, 0x03333911, 0x02e2f3c4, 0x0272fbe9, 0x0095be6b, 0x0144a9ca, 0x007de9ee, 0x000cade3}}, Y: Field{[10]uint32{0x00c8753c, 0x01c8dde5, 0x0275ba49, 0x0151eb88, 0x0073bb80, 0x038a0983, 0x03c3896e, 0x01c78cbb, 0x01f513df, 0x003b8612}}}, + {X: Field{[10]uint32{0x0147a4f7, 0x01605541, 0x01fc074b, 0x03c209a7, 0x00e37d50, 0x01f1cac3, 0x036eef2a, 0x027ef341, 0x00fddc8e, 0x0038b2dd}}, Y: Field{[10]uint32{0x005cc4a4, 0x006af2c0, 0x012be864, 0x038d848b, 0x03addea9, 0x01cdbac2, 0x022df062, 0x034891e9, 0x02d71c9d, 0x0034ea8b}}}, + {X: Field{[10]uint32{0x010ae3a8, 0x00366734, 0x00b141be, 0x00d7c8d7, 0x0026009a, 0x01aacd5d, 0x01c29949, 0x035efb6b, 0x007566d4, 0x00210e11}}, Y: Field{[10]uint32{0x02dd791f, 0x00109acb, 0x01c4f239, 0x01e4198c, 0x0334ef0d, 0x01ab4cc1, 0x0101ac5e, 0x00293697, 0x02091698, 0x00313840}}}, + {X: Field{[10]uint32{0x0311d67e, 0x019720b1, 0x00b878ab, 0x0311bd98, 0x030587d9, 0x01b0c221, 0x0184c6fc, 0x00080e6d, 0x0088b894, 0x001058b5}}, Y: Field{[10]uint32{0x00852649, 0x011eb968, 0x0295dbda, 0x00ae12d3, 0x03c1732f, 0x03ee28eb, 0x02f22c25, 0x00a27ddd, 0x02903236, 0x0019c58f}}}, + {X: Field{[10]uint32{0x035f683d, 0x02e9292f, 0x010684f3, 0x01ebb0f9, 0x00175d76, 0x0373d53f, 0x0389bfd2, 0x003cd3c3, 0x03a84caf, 0x000feb4f}}, Y: Field{[10]uint32{0x03e61826, 0x0083bf37, 0x012a53fa, 0x01cb9f43, 0x030cf718, 0x031c629c, 0x030ca647, 0x0101eecb, 0x007cb6cc, 0x0003346f}}}, + {X: Field{[10]uint32{0x02b1a86b, 0x0254cbeb, 0x0398f1c6, 0x02fc4dc1, 0x02c1fb84, 0x00174205, 0x00c1a7ce, 0x01e8015a, 0x0200a300, 0x0019d3c9}}, Y: Field{[10]uint32{0x020d38a5, 0x03bb31a7, 0x02259e09, 0x03682c60, 0x0370db57, 0x00011602, 0x0343b257, 0x00cecfb7, 0x01f9413f, 0x000a6748}}}, + {X: Field{[10]uint32{0x02e9f08f, 0x034a6f57, 0x00bcff87, 0x031a49c5, 0x023d82d6, 0x007ecec9, 0x01b815ad, 0x01d2aee0, 0x01a54ade, 0x0034cbd3}}, Y: Field{[10]uint32{0x033eea87, 0x0105a442, 0x01d582fc, 0x0114d4d6, 0x0382e14f, 0x00165c1d, 0x0299016c, 0x014ee5a3, 0x02738b8e, 0x003e50a7}}}, + {X: Field{[10]uint32{0x03ce3ff6, 0x02553c78, 0x008cb1ed, 0x00c7dcac, 0x036fbb69, 0x00d61174, 0x01936571, 0x021555b9, 0x02704353, 0x000c3939}}, Y: Field{[10]uint32{0x0388db7b, 0x0169567a, 0x0340dc69, 0x00d769c1, 0x010a878d, 0x00eef26c, 0x01935011, 0x02618e12, 0x03ce6198, 0x00118be6}}}, + {X: Field{[10]uint32{0x00cad297, 0x01c6c135, 0x0180bf19, 0x0042c079, 0x027f3dcd, 0x00c3937b, 0x02829043, 0x0330c011, 0x02003c51, 0x002f8818}}, Y: Field{[10]uint32{0x01ccb9bc, 0x0163b5cb, 0x002a0d55, 0x0242415a, 0x01b1c610, 0x01387195, 0x033d48a7, 0x03950a15, 0x03c49d61, 0x00188622}}}, + {X: Field{[10]uint32{0x035df04a, 0x026167ff, 0x01993c41, 0x0298077d, 0x01cb6e84, 0x030abc84, 0x01e0fb9a, 0x01147b4a, 0x0023ace3, 0x0024c511}}, Y: Field{[10]uint32{0x0037b47c, 0x00a9b44c, 0x039d1d90, 0x0093dcae, 0x00f10652, 0x01e6480e, 0x031a3f9d, 0x01097d71, 0x03b164c3, 0x001f0437}}}, + {X: Field{[10]uint32{0x017b112c, 0x01906305, 0x012a7cb6, 0x00171edf, 0x01978292, 0x030d3ee0, 0x01ca26d6, 0x032f73c8, 0x00044f5f, 0x002c057e}}, Y: Field{[10]uint32{0x023a1d5f, 0x03a85153, 0x008c1d3a, 0x01bea8c2, 0x003b3cdc, 0x037e357e, 0x00a655b2, 0x03a04dd1, 0x02086d04, 0x002ae307}}}, + {X: Field{[10]uint32{0x01a21b52, 0x03cabcd0, 0x000d36b3, 0x03795e85, 0x024f8a18, 0x0291968e, 0x00868117, 0x025f6279, 0x01da649d, 0x00357a78}}, Y: Field{[10]uint32{0x0327447a, 0x017a164b, 0x0080d895, 0x01708901, 0x03169346, 0x03537436, 0x01a13cc1, 0x03b5cc44, 0x0037f391, 0x00132c11}}}, + {X: Field{[10]uint32{0x036966bb, 0x0294c5b4, 0x02d6f996, 0x0335cb85, 0x01983005, 0x02e6490e, 0x03f8ed77, 0x03281976, 0x01047dd7, 0x0034eb90}}, Y: Field{[10]uint32{0x0125ac46, 0x00370534, 0x00a614b1, 0x035f7c2b, 0x0164f8cd, 0x0105f1b6, 0x010f0303, 0x03aec8a8, 0x0321ad22, 0x002f46ba}}}, + {X: Field{[10]uint32{0x0097b065, 0x002be1f2, 0x037b49f8, 0x002a0b8d, 0x0087197d, 0x02003c29, 0x026cdd22, 0x03e563f1, 0x0363d885, 0x00118f89}}, Y: Field{[10]uint32{0x02f7ca7f, 0x026499c7, 0x03508b79, 0x0187ef25, 0x0326b80c, 0x0137818a, 0x03a311a9, 0x003f5f7c, 0x00db0e5d, 0x002ffbeb}}}, + {X: Field{[10]uint32{0x00641917, 0x0377f244, 0x0347c83c, 0x03102ff9, 0x0158e597, 0x02d8fb0c, 0x0353ec1b, 0x00159f1b, 0x01fd127c, 0x001e617f}}, Y: Field{[10]uint32{0x0332ed03, 0x016f559f, 0x0308703a, 0x00783b19, 0x0124ed29, 0x038a26bb, 0x0325fe1d, 0x0218bbca, 0x02daf3d9, 0x00180f04}}}, + {X: Field{[10]uint32{0x027703e9, 0x03c550f6, 0x02d0ed5f, 0x0272e0f4, 0x019e74c5, 0x003ab1fe, 0x01d24941, 0x038e76cb, 0x016b5f76, 0x001d286b}}, Y: Field{[10]uint32{0x00e0db08, 0x00dff5e4, 0x00c33d57, 0x01a250ba, 0x00093e09, 0x00c6efa8, 0x0193d836, 0x0318f358, 0x03ef18c9, 0x00331855}}}, + {X: Field{[10]uint32{0x022f6da3, 0x034225ac, 0x03463a71, 0x00b1c9d1, 0x03c9bab4, 0x02e866df, 0x01416664, 0x01d7d80b, 0x02507033, 0x000c1a0a}}, Y: Field{[10]uint32{0x03a22ff8, 0x0053665d, 0x0273f177, 0x0383c672, 0x036290d0, 0x00c474c5, 0x00f39e7f, 0x02d3e9b2, 0x00f6b018, 0x00154f81}}}, + {X: Field{[10]uint32{0x0369ef57, 0x01b04d1d, 0x0352b1ee, 0x00ac9193, 0x03654e7a, 0x03e9e565, 0x03791efe, 0x0357c9b0, 0x00f0d7c0, 0x00278856}}, Y: Field{[10]uint32{0x01008373, 0x03efc98a, 0x038509e2, 0x023bcd68, 0x029ffd7c, 0x03e9dd8b, 0x003a3481, 0x014fc240, 0x00dd1b90, 0x0001c4bf}}}, + {X: Field{[10]uint32{0x02327d66, 0x0215fcef, 0x03ce7322, 0x019b8f13, 0x028172e5, 0x00094e30, 0x024029c2, 0x03273fae, 0x02989a43, 0x0005db89}}, Y: Field{[10]uint32{0x03a4b1c3, 0x01e0d307, 0x009ee7b4, 0x007d3bb8, 0x019aefd3, 0x023710f0, 0x0270b487, 0x03ae1df4, 0x01d04b29, 0x003b6332}}}, + {X: Field{[10]uint32{0x00374da8, 0x011e2314, 0x00f1b700, 0x00e4f7f1, 0x02cf1892, 0x00eb5d1f, 0x02bb89a1, 0x0079b9a2, 0x02fea377, 0x001d751b}}, Y: Field{[10]uint32{0x02a6bed8, 0x011c9961, 0x02e1a3ca, 0x008544d1, 0x00d7efc2, 0x02ce6a1a, 0x00b86fd2, 0x01d9e7f4, 0x010a9950, 0x0026148e}}}, + {X: Field{[10]uint32{0x01605721, 0x00c67d91, 0x029345b7, 0x00114721, 0x032310fb, 0x0097db57, 0x0298c4c8, 0x02403fed, 0x00c67d64, 0x00202688}}, Y: Field{[10]uint32{0x00e286c1, 0x03e97cfe, 0x03e6a5eb, 0x03315258, 0x003d096c, 0x01fe8105, 0x02b06192, 0x01f88add, 0x0180d991, 0x0027a652}}}, + {X: Field{[10]uint32{0x0172c180, 0x018d11be, 0x023528d5, 0x0073ca71, 0x03defece, 0x02b1c20f, 0x00500b4e, 0x03c453b5, 0x003a43f7, 0x0006ce24}}, Y: Field{[10]uint32{0x02f408f9, 0x02504676, 0x0272ad33, 0x01adbd76, 0x022708b2, 0x0354f792, 0x0353f77f, 0x002ba224, 0x01c931a6, 0x00100dbb}}}, + {X: Field{[10]uint32{0x00feef23, 0x01b1621a, 0x0166df4e, 0x0338b41d, 0x03263458, 0x03e8fbf9, 0x00b4e8dd, 0x012e7aac, 0x01b6eb29, 0x00242a03}}, Y: Field{[10]uint32{0x03cf91e6, 0x031dba4b, 0x01681442, 0x02c9eef6, 0x035ee050, 0x0278a4da, 0x0321145d, 0x03c6361f, 0x039f9754, 0x001d4f22}}}, + {X: Field{[10]uint32{0x036bea9b, 0x009751cd, 0x0146e6dc, 0x00152851, 0x023e6f36, 0x03d80d03, 0x01625460, 0x0166604b, 0x03844b70, 0x0030b203}}, Y: Field{[10]uint32{0x02a79c64, 0x02f5120e, 0x00f6123a, 0x029c0ad3, 0x0173b871, 0x0074ec6d, 0x03495b89, 0x03539c62, 0x020d68f4, 0x0021b285}}}, + {X: Field{[10]uint32{0x028e7553, 0x00f38468, 0x01692a32, 0x038757f3, 0x012d00cf, 0x0067ec99, 0x03989d3f, 0x02d7cff7, 0x02744cf4, 0x00273d81}}, Y: Field{[10]uint32{0x0247759d, 0x003144f0, 0x0385dc30, 0x0038f116, 0x03edd0f3, 0x03eb5a18, 0x017b6a3c, 0x03f3056d, 0x03f7b973, 0x002051f2}}}, + {X: Field{[10]uint32{0x02d82208, 0x023d6156, 0x005abce9, 0x0031d080, 0x02a6280b, 0x018364db, 0x0093fd60, 0x031ac969, 0x03a28742, 0x0015d223}}, Y: Field{[10]uint32{0x01a29574, 0x021e113c, 0x03921dc2, 0x03994084, 0x03af949a, 0x009ed1c2, 0x02dbe56c, 0x02fa9562, 0x02455073, 0x000c6cf2}}}, + {X: Field{[10]uint32{0x0099447d, 0x02f17ad2, 0x00dc84ed, 0x005b1d63, 0x02d40ed6, 0x01d658f0, 0x00df2b8d, 0x02ef2372, 0x00be6be8, 0x003c44cf}}, Y: Field{[10]uint32{0x0252f50f, 0x02ee24fd, 0x016870cb, 0x018375e8, 0x0110bd3a, 0x0359f558, 0x014626d8, 0x02c8fd5c, 0x00472225, 0x0015ff09}}}, + {X: Field{[10]uint32{0x03be89c0, 0x038105d6, 0x025050f4, 0x02ffcf90, 0x013f3d69, 0x00196ee0, 0x00989c79, 0x02f5e1fe, 0x02753301, 0x0025420f}}, Y: Field{[10]uint32{0x00b33482, 0x024fe925, 0x03c70cc5, 0x038055ac, 0x00ee4e92, 0x01dc1039, 0x017c73ca, 0x0037a518, 0x035ce7d1, 0x002112b6}}}, + {X: Field{[10]uint32{0x005c75c6, 0x000110ef, 0x01973621, 0x02cd8f23, 0x038668c7, 0x03266bd8, 0x0176ed29, 0x0159d579, 0x0355cbb7, 0x0006a420}}, Y: Field{[10]uint32{0x032454a2, 0x02b48b8b, 0x03f27057, 0x001d2d13, 0x00a73538, 0x01589f60, 0x03787222, 0x01b8d4bd, 0x026c6e55, 0x0035d951}}}, + {X: Field{[10]uint32{0x0349b648, 0x037cefbc, 0x01db4f04, 0x018f17cc, 0x038a2d1f, 0x02b65fe7, 0x0067308f, 0x010f56aa, 0x03740bd3, 0x0031648b}}, Y: Field{[10]uint32{0x027bd648, 0x014f251b, 0x00c4377f, 0x01108da9, 0x00da8118, 0x0362dd4b, 0x02605e50, 0x036fa204, 0x00687cfc, 0x001dec7c}}}, + {X: Field{[10]uint32{0x02c95dc9, 0x00d10839, 0x017d9964, 0x00c458e2, 0x02055dcf, 0x006c2d9c, 0x011a4043, 0x000a5dda, 0x01969f91, 0x0019386c}}, Y: Field{[10]uint32{0x0222550c, 0x02538ca4, 0x0371ddce, 0x034873bc, 0x029bfb77, 0x0240d6d9, 0x027fa26a, 0x030f27ac, 0x00c7c11f, 0x00305bd8}}}, + {X: Field{[10]uint32{0x03ce08de, 0x03edfa81, 0x01ce7808, 0x029d527a, 0x03c602f8, 0x00ccf74d, 0x0121bad3, 0x0113b5b1, 0x02766877, 0x0000cecb}}, Y: Field{[10]uint32{0x02988efd, 0x01444aa1, 0x038114c2, 0x032a9b79, 0x03d742e8, 0x03f7652f, 0x036c2437, 0x022ba573, 0x027fc8ed, 0x00386f3f}}}, + {X: Field{[10]uint32{0x01e4f294, 0x011cef91, 0x0275c951, 0x003fca52, 0x0189fbf3, 0x01ed2b0c, 0x02310331, 0x0228730a, 0x034c866d, 0x00083c63}}, Y: Field{[10]uint32{0x02d0ea0e, 0x032ba074, 0x0358943f, 0x027dc5cf, 0x030fe852, 0x034defb9, 0x00883363, 0x03ded3f6, 0x03c9d08e, 0x00235a15}}}, + {X: Field{[10]uint32{0x03b69a8b, 0x01105db5, 0x03befd14, 0x014d5190, 0x012df346, 0x038aa2e7, 0x02b4c685, 0x031c5a83, 0x03c944c9, 0x00134588}}, Y: Field{[10]uint32{0x0117be80, 0x0160e222, 0x02f7854f, 0x0357b654, 0x022b601b, 0x01bb0d25, 0x016bf6b9, 0x02b40fe6, 0x01fe8744, 0x00377c6e}}}, + {X: Field{[10]uint32{0x01b079e0, 0x0343fd4f, 0x027e2d4a, 0x02937436, 0x014faad0, 0x016251e1, 0x00d6b368, 0x00a4b4a0, 0x00dbe8ab, 0x002a406c}}, Y: Field{[10]uint32{0x03298a9d, 0x00398391, 0x023b301d, 0x03829ac1, 0x00716bc5, 0x0079eb99, 0x02f04dc6, 0x006986bd, 0x03e1834f, 0x000fc9f9}}}, + {X: Field{[10]uint32{0x03fc9a70, 0x007269ba, 0x0089b303, 0x013df202, 0x012f42a2, 0x0211916c, 0x03d66f44, 0x023ff542, 0x00713021, 0x001f82bc}}, Y: Field{[10]uint32{0x02aedb3f, 0x01b6de16, 0x003ab241, 0x005fd6f7, 0x010d5795, 0x017ac7a2, 0x013fbb23, 0x0343127d, 0x03f3926c, 0x00142f08}}}, + {X: Field{[10]uint32{0x02ebf20d, 0x00aaac16, 0x01da4ef8, 0x00a151ba, 0x00b47f05, 0x0102a40e, 0x005d3354, 0x00968b06, 0x007e1a7b, 0x001eea06}}, Y: Field{[10]uint32{0x02185187, 0x00924c26, 0x033a39ab, 0x02f39f62, 0x000527ef, 0x0329775e, 0x026c25c7, 0x00dc2be1, 0x026c9625, 0x001b9abb}}}, + {X: Field{[10]uint32{0x013a6807, 0x02128e76, 0x0277255b, 0x02583a49, 0x009767b7, 0x0063f28e, 0x0000816e, 0x02c9e6d8, 0x03c34d83, 0x00230143}}, Y: Field{[10]uint32{0x01174870, 0x026f104d, 0x023ce701, 0x0336073c, 0x015d699f, 0x0106604e, 0x03c29650, 0x023eca09, 0x00ef75b6, 0x002618c5}}}, + {X: Field{[10]uint32{0x019c2ec9, 0x02e2c6f2, 0x006202a7, 0x028b2fd4, 0x009d7201, 0x01492652, 0x0060583a, 0x037e1896, 0x009a78e4, 0x0014ede1}}, Y: Field{[10]uint32{0x03e469c0, 0x00b77e78, 0x012c544d, 0x00951ca3, 0x02e0a44d, 0x006f8b14, 0x024b22de, 0x01f41d77, 0x0212ac60, 0x00138c7a}}}, + {X: Field{[10]uint32{0x03313b33, 0x03149f94, 0x0278efeb, 0x0010c77b, 0x02b63350, 0x03f9d8af, 0x0075a010, 0x032655a8, 0x0267a5d0, 0x0026f7e7}}, Y: Field{[10]uint32{0x029d2bb0, 0x0252bf63, 0x00d5a17e, 0x00d9d8ba, 0x02907f26, 0x03c5b2b4, 0x00c27926, 0x00383b89, 0x0221a596, 0x00250991}}}, + {X: Field{[10]uint32{0x02381f34, 0x03f66412, 0x012fb429, 0x00b1bb0b, 0x0117d9f4, 0x01d81be2, 0x02c031a4, 0x02cef42e, 0x02b37a8a, 0x001f2a9c}}, Y: Field{[10]uint32{0x017303c9, 0x01f77597, 0x037f1ef8, 0x00781a0b, 0x03ff8fbd, 0x00804253, 0x023d6beb, 0x037a34d3, 0x03ab7ee5, 0x0016d614}}}, + {X: Field{[10]uint32{0x0193d81a, 0x01ae5f8e, 0x0093dde1, 0x031d54c9, 0x03925d62, 0x00fd236d, 0x000295fc, 0x01e5d5e7, 0x039f0982, 0x000bbca6}}, Y: Field{[10]uint32{0x03110753, 0x008cde8c, 0x015e89b4, 0x0090e1f6, 0x00a0afff, 0x02fd31c5, 0x0137ef96, 0x016e9829, 0x004dd987, 0x00125b25}}}, + {X: Field{[10]uint32{0x03317ff8, 0x030d2fa5, 0x00e6a9e5, 0x014bb0d5, 0x024029e9, 0x039740b1, 0x03c1860a, 0x01e1d55c, 0x00ad95b0, 0x0037c55f}}, Y: Field{[10]uint32{0x0284c162, 0x01bb8e04, 0x03ba470f, 0x00ba15a4, 0x00b629e6, 0x00acf30c, 0x01c979a0, 0x00ad4226, 0x02c77592, 0x003cbb32}}}, + {X: Field{[10]uint32{0x02454b1d, 0x02a61c05, 0x020e7b15, 0x00dadc64, 0x00e651d2, 0x02e7ad51, 0x0182e643, 0x02949ad8, 0x0150a29c, 0x00375570}}, Y: Field{[10]uint32{0x002e9368, 0x01788fd3, 0x00f5c4d9, 0x02af5dea, 0x00ac685a, 0x01a30944, 0x01605d42, 0x03a8bace, 0x03a542f4, 0x001131d5}}}, + {X: Field{[10]uint32{0x00227f27, 0x02792e26, 0x0172325b, 0x024e1fc0, 0x02c4d5d3, 0x018f4c95, 0x01477630, 0x00b1e464, 0x00f46ed4, 0x0005a21b}}, Y: Field{[10]uint32{0x0217fffb, 0x00e0c5c2, 0x00367ec5, 0x02378bd2, 0x02c824ed, 0x00f280f7, 0x02192fc9, 0x00ca6751, 0x02207ee7, 0x001d0868}}}, + {X: Field{[10]uint32{0x0360732f, 0x03aa9eca, 0x0345e56a, 0x0089213f, 0x0327968c, 0x01bc2b3f, 0x028b306d, 0x00186023, 0x00fcdaa3, 0x001bfc60}}, Y: Field{[10]uint32{0x029961a9, 0x00fa87bd, 0x038cc22f, 0x008baa16, 0x026c8d40, 0x018dd868, 0x0254dad0, 0x02bfc3f0, 0x0254f0c2, 0x001f45b5}}}, + {X: Field{[10]uint32{0x00395e36, 0x03323ab7, 0x005c4f8b, 0x0154e7da, 0x00aa912b, 0x003b99df, 0x034f51f4, 0x030a80fa, 0x0111a00d, 0x0000fa91}}, Y: Field{[10]uint32{0x03c9259d, 0x000d719c, 0x0049824b, 0x00d94a43, 0x030a2f2e, 0x010376d4, 0x02398393, 0x0008564e, 0x01f1528b, 0x001b27b4}}}, + {X: Field{[10]uint32{0x0253081d, 0x0332883c, 0x014b63c7, 0x002a0d79, 0x0153e415, 0x00cb7ee3, 0x00742d8f, 0x03a7aace, 0x0170dc3d, 0x0002e0b3}}, Y: Field{[10]uint32{0x01d0e24d, 0x012f02ab, 0x0326860d, 0x015aa48b, 0x0302effc, 0x00ca5d97, 0x02e20499, 0x01b9d74c, 0x03fe1f7f, 0x0003a2f2}}}, + {X: Field{[10]uint32{0x0196c77f, 0x00e2d5e8, 0x03d49b7b, 0x03c05cc9, 0x0206d056, 0x00169a69, 0x02e23bf1, 0x021d1613, 0x03e00074, 0x003f8bf0}}, Y: Field{[10]uint32{0x01bf3916, 0x02ef6dba, 0x0271d4f9, 0x007793f7, 0x007da856, 0x01601ec7, 0x01a32f69, 0x034a5f32, 0x001cc3c6, 0x000f8625}}}, + {X: Field{[10]uint32{0x03b7858b, 0x036fd5d2, 0x035ec845, 0x00511ba8, 0x02e8b001, 0x00b6e75b, 0x028778b1, 0x00da4d1f, 0x0176cdaa, 0x00012e40}}, Y: Field{[10]uint32{0x0173c154, 0x032abb2e, 0x03155295, 0x03f0bdea, 0x021fdad0, 0x02162031, 0x026e349b, 0x017f4fb2, 0x03ab6e9c, 0x003d8151}}}, + {X: Field{[10]uint32{0x0144c6d2, 0x03b04296, 0x028a0cd3, 0x01cbd654, 0x01defc42, 0x0036f27b, 0x00c86a9f, 0x01802d2e, 0x02511d34, 0x000d7ce0}}, Y: Field{[10]uint32{0x00b5ccd5, 0x00c8d2f4, 0x00daeae8, 0x02c6c4a8, 0x0043762b, 0x03e5b2a6, 0x0337a80c, 0x028797db, 0x01f6ef7f, 0x000a6a0d}}}, + {X: Field{[10]uint32{0x022cb94a, 0x0308dc5c, 0x011cdf3c, 0x02b0fc04, 0x03e1d0e9, 0x021f4fd6, 0x0027e265, 0x02dffe84, 0x02970311, 0x00075d2c}}, Y: Field{[10]uint32{0x00c2071e, 0x03307dca, 0x030e2606, 0x02ba771f, 0x0135dc99, 0x003d7183, 0x03bcfb81, 0x005382dc, 0x038b57f1, 0x00171ef3}}}, + {X: Field{[10]uint32{0x00450428, 0x0129a2a6, 0x013e6f93, 0x02df1056, 0x024f75d1, 0x027b1c8b, 0x0020737b, 0x03e5582c, 0x00f309c6, 0x00142825}}, Y: Field{[10]uint32{0x03778eee, 0x0243c7a0, 0x021b554a, 0x02da1a6a, 0x0089c86d, 0x02a07c11, 0x009eaba6, 0x0033f65a, 0x0222dfe1, 0x0028a1b8}}}, + {X: Field{[10]uint32{0x03c63db7, 0x0029b589, 0x0010599b, 0x036452d2, 0x00282dbc, 0x01d7b0e3, 0x02cf12e2, 0x0055f37f, 0x03812129, 0x0026d96e}}, Y: Field{[10]uint32{0x00223188, 0x0164ef06, 0x03d65528, 0x0102b423, 0x00660b4c, 0x007a629e, 0x013b2e95, 0x00890864, 0x031a3f0f, 0x003160b6}}}, + {X: Field{[10]uint32{0x02a4bc6b, 0x00200b4d, 0x02ca51c2, 0x03179883, 0x0085e7f1, 0x007720c7, 0x02c1115a, 0x0281b915, 0x00fc1fdf, 0x0022d151}}, Y: Field{[10]uint32{0x0220350d, 0x022c67de, 0x003b06ea, 0x02e6556c, 0x01e4116f, 0x02dc3993, 0x022af7f4, 0x00980b9c, 0x0041288f, 0x0038f9df}}}, + {X: Field{[10]uint32{0x020ab4aa, 0x02076577, 0x01e29d5f, 0x004f773b, 0x006cb2ae, 0x0155e3f7, 0x039b29cc, 0x03adf145, 0x0080b959, 0x001b1c26}}, Y: Field{[10]uint32{0x027c4bdc, 0x033144e7, 0x03b43c2d, 0x0314254f, 0x02ee2b59, 0x03cf7aae, 0x036c0c76, 0x02e9099c, 0x03aebd8e, 0x003278cf}}}, + {X: Field{[10]uint32{0x01537806, 0x02d59dcf, 0x001e7085, 0x019e00ae, 0x0076fc9d, 0x012821e8, 0x01891f79, 0x01a9c657, 0x035137ba, 0x001ddd82}}, Y: Field{[10]uint32{0x018e3a25, 0x0206af85, 0x037f0d7e, 0x037b9a39, 0x021b87ff, 0x03d105ef, 0x0358c7ed, 0x02962fd3, 0x00f5aaee, 0x003d480b}}}, + {X: Field{[10]uint32{0x02163102, 0x03109b9f, 0x025d0df4, 0x03e3bf58, 0x03e23cd4, 0x02324699, 0x02904a8a, 0x00320ba6, 0x03836a0b, 0x0006a2f5}}, Y: Field{[10]uint32{0x02285844, 0x0317f304, 0x01f2e4e9, 0x005adc02, 0x01c2a963, 0x03dd2a1f, 0x0174f282, 0x00b2b8f1, 0x00cab095, 0x00187f99}}}, + {X: Field{[10]uint32{0x024abc30, 0x02d4e421, 0x031d753d, 0x02679a51, 0x02a3fb30, 0x00936475, 0x01e453ed, 0x02644fec, 0x01b65907, 0x003f885f}}, Y: Field{[10]uint32{0x01730b58, 0x03dac0d3, 0x012538cd, 0x00714e5a, 0x0193a0c6, 0x007c11f5, 0x030f20fb, 0x017b5a02, 0x02bba962, 0x001773e6}}}, + {X: Field{[10]uint32{0x01b33b91, 0x02bb527d, 0x02c5f212, 0x035d232d, 0x0107e3ab, 0x03ab5a5b, 0x00f58b65, 0x0357af0e, 0x023754af, 0x00094135}}, Y: Field{[10]uint32{0x035d75d4, 0x0004eb5e, 0x03437b5e, 0x004159d7, 0x00ba7cec, 0x01cbeefd, 0x01321c6c, 0x011a713d, 0x034375f1, 0x001e69af}}}, + {X: Field{[10]uint32{0x03197b5c, 0x03772bf6, 0x0176b7fb, 0x02fd7322, 0x036160ab, 0x021c4170, 0x029bd3f6, 0x008b5e26, 0x0302f47b, 0x0002c1bd}}, Y: Field{[10]uint32{0x0332f63d, 0x017e4635, 0x007781cd, 0x01ff45e7, 0x005bd2fe, 0x02a8f7f9, 0x012a35b6, 0x035247d6, 0x03d419a4, 0x001d9a6e}}}, + {X: Field{[10]uint32{0x01044e23, 0x004a2983, 0x010acbc2, 0x027af48f, 0x00a6f3f9, 0x006d5120, 0x034eeb93, 0x0273e500, 0x003bb31f, 0x00200ec8}}, Y: Field{[10]uint32{0x0328d1c7, 0x014e0705, 0x006a954e, 0x02fd26e5, 0x03bfc9cc, 0x03e98aeb, 0x0320c5c7, 0x03dd6566, 0x008df271, 0x000c22af}}}, + {X: Field{[10]uint32{0x0302749a, 0x00a27f80, 0x028dcd57, 0x037a3a56, 0x02e52de1, 0x000e9cc4, 0x010e5bda, 0x033ab6ed, 0x00b4c5f5, 0x00099aa7}}, Y: Field{[10]uint32{0x02e0ae7e, 0x021bff11, 0x03baa8b3, 0x02e879f0, 0x033dc0ef, 0x03213b53, 0x0282877c, 0x02cbea8f, 0x030ba856, 0x0027baa5}}}, + {X: Field{[10]uint32{0x004eba94, 0x00d82f3e, 0x02a355d7, 0x0107a6af, 0x0364c4c1, 0x02058f7c, 0x019a7ab9, 0x01eb5496, 0x0195d80c, 0x003f62a7}}, Y: Field{[10]uint32{0x03b1030c, 0x035f5cf7, 0x01a713e2, 0x03691eff, 0x03a30377, 0x02b9ff4c, 0x032e2688, 0x014ecd66, 0x03021009, 0x002a7ec5}}}, + {X: Field{[10]uint32{0x01db0a7d, 0x02dbc9be, 0x038f8f2c, 0x0316dec2, 0x026e84ac, 0x02cb202f, 0x03c339a8, 0x023c8d67, 0x01f309f2, 0x0029cc8b}}, Y: Field{[10]uint32{0x02db6be6, 0x028ba85b, 0x00885c12, 0x0384c5c5, 0x03095f40, 0x03c4be95, 0x01b7f5b2, 0x025405ff, 0x029d2174, 0x0008bdbf}}}, + {X: Field{[10]uint32{0x03052d36, 0x00f1f932, 0x01ffc82c, 0x006ba95a, 0x00bd4c46, 0x03dfc3c6, 0x02104ddb, 0x0199258e, 0x010f336a, 0x0020aa30}}, Y: Field{[10]uint32{0x01f1dd0c, 0x0384a1e5, 0x038c118f, 0x03533411, 0x015e5c31, 0x02dc6d9c, 0x010501cc, 0x01c89e2e, 0x00a2c0ef, 0x001cdf3b}}}, + {X: Field{[10]uint32{0x0315d6df, 0x01e12a53, 0x00516c54, 0x02dd6e97, 0x026c4ef2, 0x01698309, 0x03cd12f0, 0x03de5401, 0x01b68e3b, 0x0026d434}}, Y: Field{[10]uint32{0x03ddd8fd, 0x01bfadf2, 0x02778737, 0x009cb51f, 0x02403fff, 0x03c63549, 0x003fd2a4, 0x01db6340, 0x0109b791, 0x000abf23}}}, + {X: Field{[10]uint32{0x02e08d32, 0x021657ee, 0x00b80671, 0x035fba0b, 0x02b8dcb9, 0x0074c15a, 0x023a8228, 0x008ff9f7, 0x03ddc8b4, 0x000fe420}}, Y: Field{[10]uint32{0x028fa758, 0x0257ff3c, 0x01376e21, 0x01b48330, 0x0081f77f, 0x03e80868, 0x020ed90a, 0x007646a7, 0x0152fd51, 0x0032c4f0}}}, + {X: Field{[10]uint32{0x02167faf, 0x0041d3bc, 0x00bfadbd, 0x00196754, 0x03c92317, 0x024999b2, 0x02ff6bd5, 0x0306895b, 0x01c1ee17, 0x0031d721}}, Y: Field{[10]uint32{0x00023a52, 0x02bc5a50, 0x00c8596d, 0x005b53df, 0x01bd698a, 0x0191fd23, 0x00ca8922, 0x010275d7, 0x02be5e09, 0x0006ad3a}}}, + {X: Field{[10]uint32{0x00656045, 0x02355da6, 0x03fb95c6, 0x00acf52d, 0x0060ea8e, 0x03deab5f, 0x010cf0d2, 0x03d74ed3, 0x03eaf8a0, 0x00314d07}}, Y: Field{[10]uint32{0x00e88915, 0x034eae5d, 0x023986e6, 0x035535c4, 0x02dc48a4, 0x009aae60, 0x00fa422a, 0x016e7e92, 0x00e9007e, 0x00257e7d}}}, + {X: Field{[10]uint32{0x00c2d89b, 0x01e80c98, 0x027fd896, 0x02ddd4b5, 0x02220852, 0x01c17748, 0x02bd4c68, 0x025f8354, 0x023e2a89, 0x0020eb36}}, Y: Field{[10]uint32{0x03c31df0, 0x03a5de46, 0x00e8e330, 0x00ef752e, 0x030a77cd, 0x025c45d5, 0x01b55809, 0x02e945fd, 0x02e1d655, 0x0037386e}}}, + {X: Field{[10]uint32{0x0025237b, 0x009e6cc0, 0x039625bd, 0x01c5b174, 0x00f1c0d5, 0x00a75653, 0x01c4164e, 0x0241d16e, 0x01468b29, 0x0016e064}}, Y: Field{[10]uint32{0x03625d8e, 0x0227d2bd, 0x034fcf69, 0x0329c6e8, 0x011c48d2, 0x00207cd6, 0x0188daab, 0x0377eafb, 0x02a03fdd, 0x00330d8d}}}, + {X: Field{[10]uint32{0x003b0e6c, 0x0241178b, 0x037219b8, 0x01934e35, 0x0332f5f6, 0x01984139, 0x00417961, 0x00e3bfe0, 0x0122214e, 0x00191de0}}, Y: Field{[10]uint32{0x0211a32d, 0x033e6111, 0x02f81974, 0x000e352b, 0x00d8b632, 0x02e29f47, 0x02afc4a0, 0x03bb1ee3, 0x00497e15, 0x000ca73c}}}, + {X: Field{[10]uint32{0x02f12323, 0x0032e7c6, 0x0017c43d, 0x0275b684, 0x002b475a, 0x02bba199, 0x01099099, 0x018bd1e5, 0x026afe57, 0x003b5360}}, Y: Field{[10]uint32{0x03e48e78, 0x00c6defd, 0x02274d05, 0x02696510, 0x01c4d88c, 0x02b1e467, 0x0296f928, 0x0297bb20, 0x01be3faf, 0x00231be0}}}, + {X: Field{[10]uint32{0x01109c4a, 0x01bad033, 0x02fe97a0, 0x00ad57de, 0x024d82ac, 0x011bf586, 0x016f5513, 0x03b30eb3, 0x0124419a, 0x000e2d0a}}, Y: Field{[10]uint32{0x03e05583, 0x032e4adc, 0x02b07b5a, 0x01a28b39, 0x02de49d7, 0x03cd669a, 0x030965a1, 0x00bdceca, 0x00962feb, 0x001fd0b0}}}, + {X: Field{[10]uint32{0x02138911, 0x02b0ba60, 0x016e3446, 0x018893c8, 0x01bb2a8f, 0x020fa185, 0x034cf701, 0x02529ed0, 0x00a8d8bb, 0x0030f2b5}}, Y: Field{[10]uint32{0x0282765e, 0x023b4e1c, 0x01b2759a, 0x00bbc6c9, 0x01420e37, 0x00b738e8, 0x0342ce38, 0x025d9081, 0x02278cad, 0x003d926f}}}, + {X: Field{[10]uint32{0x00bd6538, 0x02239295, 0x01a9e555, 0x015cd964, 0x00d9212e, 0x038faa7b, 0x03ae40dc, 0x00dbf553, 0x03f4d3d2, 0x000b5023}}, Y: Field{[10]uint32{0x00e815b7, 0x02816d43, 0x021324b9, 0x01c5616a, 0x0285e2a1, 0x00a66fbd, 0x02284bf0, 0x00a81af1, 0x01f0e869, 0x003565ab}}}, + {X: Field{[10]uint32{0x0233c854, 0x02dfaa9e, 0x03daebaf, 0x028e8f1b, 0x03d67423, 0x00fe223a, 0x0290cf81, 0x0097eddb, 0x036d247f, 0x003b9eb7}}, Y: Field{[10]uint32{0x027a8fb4, 0x03bf0754, 0x01801dea, 0x01c5e278, 0x01143f68, 0x01505a27, 0x010dd9ef, 0x03dc15b0, 0x004b4ae8, 0x00381dc6}}}, + {X: Field{[10]uint32{0x01144b34, 0x0047cf80, 0x0064b7c8, 0x028df26a, 0x01dd5d37, 0x01317a27, 0x011151dc, 0x02b284f6, 0x03c8a9ff, 0x000be515}}, Y: Field{[10]uint32{0x035e221d, 0x018d3839, 0x01cfbb40, 0x033acf4f, 0x02787120, 0x035bf122, 0x015407e1, 0x0355ce8a, 0x00489093, 0x003ad326}}}, + {X: Field{[10]uint32{0x03fec294, 0x00311bad, 0x01c277b3, 0x020fbd4c, 0x03601204, 0x03f86378, 0x023478ce, 0x00560873, 0x02b8a0f1, 0x0034fccc}}, Y: Field{[10]uint32{0x030b2155, 0x0085786e, 0x00f9f323, 0x0243bc4d, 0x01c8968b, 0x030dca50, 0x02f1c019, 0x01e18746, 0x01b25d71, 0x003a9d6e}}}, + {X: Field{[10]uint32{0x02152b91, 0x0337c7e3, 0x02f7e9a4, 0x02199ad4, 0x035f3ddb, 0x03bcdb75, 0x021fcd86, 0x016ab4d4, 0x00d338b0, 0x00060d02}}, Y: Field{[10]uint32{0x0241218c, 0x00d54dc5, 0x018095de, 0x01339126, 0x00210e20, 0x00326209, 0x01be21f2, 0x012b1bce, 0x01206edf, 0x0019a661}}}, + {X: Field{[10]uint32{0x0340374e, 0x02558257, 0x006863d3, 0x035b094d, 0x0321faff, 0x0273e269, 0x00f1f0ff, 0x01794eea, 0x005db114, 0x000a0ffb}}, Y: Field{[10]uint32{0x0032fefe, 0x006fa0af, 0x02f77851, 0x000f3ce6, 0x0008846e, 0x01729ba6, 0x0268e5f6, 0x015439a3, 0x023774af, 0x001c2c04}}}, + {X: Field{[10]uint32{0x0152fa62, 0x02837ef7, 0x016daf54, 0x01e5dc3f, 0x00ebc735, 0x0239f6ff, 0x03bd249d, 0x00f3e904, 0x030a4f94, 0x000339d5}}, Y: Field{[10]uint32{0x0375d41d, 0x01be73a2, 0x013907c3, 0x02260f81, 0x00bd5e5b, 0x02e8e617, 0x005bdf98, 0x02573fee, 0x014bef46, 0x0038456c}}}, + {X: Field{[10]uint32{0x038fd470, 0x02529320, 0x02b15377, 0x0055d32f, 0x01df7903, 0x03646549, 0x029f648c, 0x03b0fc49, 0x0319c8f4, 0x001fa713}}, Y: Field{[10]uint32{0x00fa5270, 0x037d73ac, 0x013e9c86, 0x0236b5af, 0x0060fafa, 0x03447d20, 0x015d6ccb, 0x03d732a1, 0x03fe8cf5, 0x003a7676}}}, + {X: Field{[10]uint32{0x00cb001b, 0x01146d19, 0x03ec23bf, 0x0131c8a8, 0x010ba04f, 0x03c8c27e, 0x007f919d, 0x016ffa9f, 0x03e60d5d, 0x0038aa6e}}, Y: Field{[10]uint32{0x02393fb0, 0x004691e1, 0x03f16984, 0x024741a9, 0x03d1925b, 0x039cb2dd, 0x0125bd67, 0x01ab1de2, 0x00e1c3cd, 0x003905df}}}, + {X: Field{[10]uint32{0x01271012, 0x0264009d, 0x00265e70, 0x006c5563, 0x00f55e64, 0x00aa5264, 0x03bf37d4, 0x03bd4390, 0x02a43e17, 0x00141144}}, Y: Field{[10]uint32{0x021ed18b, 0x029274b9, 0x0381b742, 0x02e5a265, 0x011f21c4, 0x02387cb3, 0x00b1f41e, 0x00eb3cb5, 0x03d857ba, 0x00255297}}}, + {X: Field{[10]uint32{0x005f850d, 0x032fa1ca, 0x03411cd5, 0x036285ec, 0x01859945, 0x029cb1c8, 0x02d1d51b, 0x00c97d2c, 0x0013a6bb, 0x0020747c}}, Y: Field{[10]uint32{0x00937193, 0x012f3177, 0x0071adce, 0x0127535c, 0x01259d3d, 0x0262c816, 0x01fe2492, 0x002154ec, 0x03b1f0c3, 0x000b574b}}}, + {X: Field{[10]uint32{0x01895022, 0x00ce0f47, 0x0387ca73, 0x0050528e, 0x01d90dd5, 0x0399b0cf, 0x02872767, 0x02099862, 0x02dfc1d2, 0x0016d9b0}}, Y: Field{[10]uint32{0x0154e0ff, 0x02d51cb5, 0x00f5449e, 0x03684b63, 0x0327fcae, 0x0101fa61, 0x017267b7, 0x0255a488, 0x038e3818, 0x0026f405}}}, + {X: Field{[10]uint32{0x00381186, 0x03e1a208, 0x00597afa, 0x0366bd63, 0x0399b583, 0x036ffe2a, 0x012d544b, 0x0178e36f, 0x030e98ec, 0x002bad7d}}, Y: Field{[10]uint32{0x0184427b, 0x02b705cd, 0x01a052e7, 0x01cc3cbd, 0x01691b09, 0x00cdb908, 0x00b76929, 0x029c37c2, 0x02b0d25c, 0x001862f5}}}, + {X: Field{[10]uint32{0x0105052e, 0x02a60849, 0x0353a707, 0x0329dab5, 0x02557679, 0x01ea700a, 0x0361e3c6, 0x0250ee11, 0x02ffe841, 0x0002ca27}}, Y: Field{[10]uint32{0x0079992c, 0x02e743fa, 0x01e330cf, 0x00e17974, 0x00530ed7, 0x0318920b, 0x034f895d, 0x018aa14e, 0x01f0c218, 0x0001ea60}}}, + {X: Field{[10]uint32{0x0219291c, 0x02f4d5bd, 0x01200f81, 0x005f9138, 0x003f5859, 0x03f4a0a2, 0x00c8360c, 0x006679ac, 0x01458b12, 0x002aeb8e}}, Y: Field{[10]uint32{0x01753f28, 0x02dd7bed, 0x02934233, 0x02ded99f, 0x000b2a81, 0x011a6c1a, 0x03be30b2, 0x01a717a0, 0x03cdb3d0, 0x002b6c8e}}}, + {X: Field{[10]uint32{0x01fbacaa, 0x02720255, 0x03013941, 0x02323646, 0x011e0f65, 0x0063aca7, 0x02c224a5, 0x01696a06, 0x03a6485b, 0x0012a560}}, Y: Field{[10]uint32{0x00e8dbca, 0x00558c6d, 0x037decea, 0x00466dec, 0x00803ecf, 0x01dda36d, 0x02375a8a, 0x010bd7b7, 0x009ee3c8, 0x0036000f}}}, + {X: Field{[10]uint32{0x00ebc169, 0x00404084, 0x017ae3a2, 0x0305183c, 0x02ea236a, 0x012ac367, 0x03cf4654, 0x03df2d97, 0x030edba6, 0x00354bd8}}, Y: Field{[10]uint32{0x030d26d0, 0x0304f84d, 0x003d9145, 0x003106f2, 0x0368e21a, 0x02801714, 0x01bea50d, 0x00ee20f9, 0x03489fa9, 0x00084555}}}, + {X: Field{[10]uint32{0x02dd6a4d, 0x00384826, 0x029bf8d1, 0x018cd6f2, 0x01c74a2a, 0x00b9307a, 0x0050fc05, 0x016163d7, 0x023782c7, 0x0002f714}}, Y: Field{[10]uint32{0x0034f189, 0x01010d9a, 0x0323e585, 0x00ef0755, 0x0312ff02, 0x02fd4a74, 0x014efbaf, 0x01d9a388, 0x01f87463, 0x002aec76}}}, + {X: Field{[10]uint32{0x019ad087, 0x038244b9, 0x00e8626e, 0x005a3c4f, 0x0288156d, 0x03ad859e, 0x0364e476, 0x02aae0ee, 0x02338bf0, 0x00111dc2}}, Y: Field{[10]uint32{0x0360a55c, 0x0170cf7b, 0x01b99c96, 0x008edca4, 0x036a3abd, 0x030b5915, 0x0393a895, 0x0102f2cc, 0x00f12e9c, 0x0016d64c}}}, + {X: Field{[10]uint32{0x015e1679, 0x00b64914, 0x021c83e3, 0x02363ba3, 0x02650310, 0x00f8d99c, 0x01ac2032, 0x012bb8c6, 0x03322e40, 0x002c579e}}, Y: Field{[10]uint32{0x01997e7a, 0x00f3abcf, 0x03d57a87, 0x00961cd1, 0x005ced5c, 0x001e5bd4, 0x002ed565, 0x02ca457e, 0x00190bbf, 0x001491aa}}}, + {X: Field{[10]uint32{0x01b00f22, 0x02f66bb7, 0x0019027b, 0x00235781, 0x01665ae1, 0x0287077e, 0x0050f758, 0x017343cb, 0x01570522, 0x00287b5d}}, Y: Field{[10]uint32{0x02791ee2, 0x0049dd9a, 0x001a13d2, 0x001024ca, 0x02d71dbd, 0x02143b40, 0x017e7464, 0x021d21ee, 0x005dad9f, 0x000f20c5}}}, + {X: Field{[10]uint32{0x01918af5, 0x022becc7, 0x037a23cf, 0x032708e8, 0x03479e9e, 0x03181603, 0x03fc43c2, 0x03183f66, 0x03616a1b, 0x003a2abc}}, Y: Field{[10]uint32{0x0279827c, 0x02dbc9e7, 0x03d3ec89, 0x000e96b0, 0x009ab9c3, 0x02e68356, 0x0141041a, 0x0319c9f8, 0x03b64a37, 0x001b39a4}}}, + {X: Field{[10]uint32{0x014c20a3, 0x00ea8dc1, 0x01b76c5a, 0x010ce28f, 0x020759c0, 0x0061e9b5, 0x024a4ef6, 0x01798d4a, 0x00cd2c85, 0x001771be}}, Y: Field{[10]uint32{0x026f4838, 0x01c05193, 0x03f0fbb8, 0x03d4b9a9, 0x000fe9f5, 0x0307620d, 0x031d1bc7, 0x02a6a359, 0x03428593, 0x003d80b0}}}, + {X: Field{[10]uint32{0x0342f3a6, 0x0281f2da, 0x0326a5f1, 0x0081186b, 0x00f65636, 0x00aa9227, 0x02063ef2, 0x0362bda2, 0x031167be, 0x0018cc9c}}, Y: Field{[10]uint32{0x034424a6, 0x0032e06d, 0x01f1a3ea, 0x00026a46, 0x02bf94a7, 0x01874f95, 0x00ca0367, 0x004c83c8, 0x03b22070, 0x002e3df0}}}, + {X: Field{[10]uint32{0x00080263, 0x008c3e52, 0x020d3535, 0x002b5e62, 0x03ad66e5, 0x03a19536, 0x005c2017, 0x00ece08c, 0x01259a39, 0x00229036}}, Y: Field{[10]uint32{0x019fcaff, 0x02d747e7, 0x01d6f6a7, 0x03326a69, 0x0143f9cb, 0x031985b4, 0x03f703a5, 0x01153b75, 0x034d9849, 0x002beda9}}}, + {X: Field{[10]uint32{0x0078645a, 0x037abe08, 0x0317dcdf, 0x022f3082, 0x02a6a02c, 0x02816df7, 0x017fd3f9, 0x01082bd4, 0x010727c7, 0x0039c51c}}, Y: Field{[10]uint32{0x0217daca, 0x00513ad0, 0x03055eaa, 0x02809606, 0x01a3561b, 0x025ac13e, 0x01d5dcdc, 0x03a753fb, 0x03cbc1ed, 0x00369f59}}}, + {X: Field{[10]uint32{0x0261c82d, 0x007da725, 0x026c0cae, 0x03a24700, 0x029922bc, 0x014e54b0, 0x0242a685, 0x02e1e007, 0x011cd95f, 0x00184c4a}}, Y: Field{[10]uint32{0x0130bf01, 0x03f0410b, 0x03b89384, 0x01e44dcc, 0x0042b894, 0x02b98cae, 0x014f9898, 0x00bf5167, 0x001c1334, 0x00058387}}}, + {X: Field{[10]uint32{0x01ca4951, 0x00af3c74, 0x003bfb78, 0x02a76940, 0x02fc5e2a, 0x01e22027, 0x029bfa81, 0x011a4b42, 0x0045b676, 0x0012f13e}}, Y: Field{[10]uint32{0x00b751f0, 0x03103f04, 0x0383cefd, 0x0315fec5, 0x0164c4a7, 0x029dbb01, 0x03055ff3, 0x0349538e, 0x01cbb9c3, 0x0021c24b}}}, + {X: Field{[10]uint32{0x02be67df, 0x039bb2a8, 0x0201f698, 0x017560a8, 0x0052865b, 0x02617cd9, 0x039bff5c, 0x03a77ca7, 0x00a27bbe, 0x00116a20}}, Y: Field{[10]uint32{0x0055fabb, 0x00cae8de, 0x00eb6131, 0x01ae3ba5, 0x02a831d4, 0x02af5643, 0x0279714d, 0x01afc7bd, 0x02a8b5e4, 0x003f9269}}}, + {X: Field{[10]uint32{0x02f4f2a4, 0x03c68352, 0x000d3f21, 0x0256c854, 0x01877e54, 0x00805174, 0x016847a2, 0x00321993, 0x0238317c, 0x001aa09a}}, Y: Field{[10]uint32{0x005f4513, 0x0117e1f8, 0x0322c154, 0x002ef081, 0x02f6b83f, 0x01b9ad1e, 0x02f14e0e, 0x02098f7c, 0x014efcc9, 0x00114865}}}, + {X: Field{[10]uint32{0x026a23a9, 0x03a28d0d, 0x0075f613, 0x0379f1b3, 0x028bd860, 0x0277395c, 0x008aa1b0, 0x03dfa5b3, 0x0106f255, 0x00054d59}}, Y: Field{[10]uint32{0x00110bf3, 0x014ec700, 0x034cee3e, 0x02d38d8a, 0x03122f37, 0x03e26977, 0x01e401f1, 0x03521435, 0x03bcd744, 0x0033456a}}}, + {X: Field{[10]uint32{0x02b89b91, 0x0387283c, 0x0043a2b5, 0x02973299, 0x00cacff3, 0x00b6b0bb, 0x00651780, 0x027d7dae, 0x02aef53d, 0x003cef04}}, Y: Field{[10]uint32{0x00e00957, 0x03294246, 0x03131368, 0x017fc91f, 0x01303e91, 0x0281cdeb, 0x03d0f367, 0x0047c907, 0x036beb2e, 0x0033f534}}}, + {X: Field{[10]uint32{0x035c0fd4, 0x00a0a5cc, 0x033736f7, 0x03bd6114, 0x0122320b, 0x02ce1d92, 0x0226ef18, 0x0294dbde, 0x006dfa04, 0x001f8f23}}, Y: Field{[10]uint32{0x01f7c189, 0x01c4a134, 0x03fe9155, 0x01362339, 0x02b6a129, 0x000f008d, 0x032400b3, 0x00cdb4cc, 0x02b532a7, 0x001cba85}}}, + {X: Field{[10]uint32{0x010369d8, 0x0111822b, 0x03223d88, 0x026f5b85, 0x026943ab, 0x0214557f, 0x021c696d, 0x017f0b05, 0x03cfa057, 0x0006632f}}, Y: Field{[10]uint32{0x013cf7ae, 0x01cac985, 0x006c2f29, 0x025209e9, 0x03032159, 0x039ee8b9, 0x019fe0ef, 0x00908af9, 0x028b3095, 0x00357989}}}, + {X: Field{[10]uint32{0x03b0e5e8, 0x02c4d42b, 0x01fd63ae, 0x02a9e02c, 0x015a147c, 0x00226e43, 0x0183c089, 0x03cd6888, 0x0289b68c, 0x0007815b}}, Y: Field{[10]uint32{0x003f32b9, 0x0011cae5, 0x008379f8, 0x00e431be, 0x003e258a, 0x01b505bd, 0x02d6ff38, 0x01315f76, 0x0053abc4, 0x002e0905}}}, + {X: Field{[10]uint32{0x02faaa21, 0x031ca79c, 0x018fb3fa, 0x011339fe, 0x03d81081, 0x02991b51, 0x0173b2f1, 0x01f9fa98, 0x01748d82, 0x00371ffe}}, Y: Field{[10]uint32{0x030c4914, 0x00b9ffb9, 0x02a1aaaf, 0x001c51b6, 0x013e3d5f, 0x01105f1c, 0x038e1c5c, 0x01bc3ff2, 0x005aef4c, 0x00307f6b}}}, + {X: Field{[10]uint32{0x03d28e79, 0x027686cb, 0x00ec29a9, 0x03c2fe3e, 0x0036b2ef, 0x0337ef12, 0x0354bc11, 0x00781c14, 0x02fcc498, 0x001c6e57}}, Y: Field{[10]uint32{0x03d684cc, 0x010b31bb, 0x03fa30af, 0x02c269cd, 0x011f3695, 0x00faef14, 0x004752cc, 0x01abbb0c, 0x01976fad, 0x003f568c}}}, + {X: Field{[10]uint32{0x02542b3a, 0x01a20eb7, 0x004ae687, 0x008625c1, 0x03f6b961, 0x0096eea0, 0x033e8ffa, 0x00af5b27, 0x00af29dc, 0x0010e153}}, Y: Field{[10]uint32{0x009c6c81, 0x02d1200f, 0x03f36fd8, 0x02957072, 0x0034c5c9, 0x02893d56, 0x01e31677, 0x018cbe37, 0x01760897, 0x00158d94}}}, + {X: Field{[10]uint32{0x0027b222, 0x00bb3cb5, 0x0396145c, 0x0243ee1d, 0x00b6eff9, 0x0357f421, 0x00c9b730, 0x027e71c2, 0x0217090e, 0x0000ab7f}}, Y: Field{[10]uint32{0x03abd7ed, 0x01b66d14, 0x010cd4c8, 0x008301a5, 0x02c44398, 0x0334a244, 0x00ae425c, 0x0367188b, 0x01605d6d, 0x002d738c}}}, + {X: Field{[10]uint32{0x03a9d6f9, 0x038fa089, 0x00620471, 0x0152b8cf, 0x0209f70c, 0x02cffcc6, 0x033a5343, 0x02bcc456, 0x012c2b7e, 0x002848d1}}, Y: Field{[10]uint32{0x01e3b4eb, 0x0053337b, 0x0396e8fa, 0x029bdde7, 0x03f53e37, 0x03f15179, 0x008194aa, 0x007d10de, 0x008378a7, 0x0024cf4d}}}, + {X: Field{[10]uint32{0x02c0a6ab, 0x01b8cb33, 0x00a603d0, 0x02b9f7b3, 0x03aab166, 0x004d21cd, 0x00152176, 0x016a061b, 0x03c2ca99, 0x0026e268}}, Y: Field{[10]uint32{0x03731232, 0x02a322b9, 0x0141480b, 0x034150ed, 0x03cbea83, 0x0092b020, 0x03c48302, 0x012c4af5, 0x0301a872, 0x000a9f4d}}}, + {X: Field{[10]uint32{0x01e9e9b2, 0x01e59184, 0x032edc90, 0x00ce7b62, 0x03384b04, 0x031149ca, 0x022b9a0d, 0x035ce423, 0x0057e7d9, 0x0019375d}}, Y: Field{[10]uint32{0x023c470e, 0x00a430e0, 0x03885b29, 0x031de03b, 0x014e311d, 0x019a6626, 0x0208a723, 0x03b85bb5, 0x00aae214, 0x003aa43e}}}, + {X: Field{[10]uint32{0x03a2176c, 0x015d9f5b, 0x0150a6b3, 0x010871fd, 0x0320abba, 0x03adc721, 0x027fd714, 0x01f1af4c, 0x0031be60, 0x0016489d}}, Y: Field{[10]uint32{0x0061d598, 0x01449712, 0x03d0b870, 0x02c4b254, 0x00796da2, 0x00f3cfce, 0x03d289ea, 0x01549d96, 0x01c4071c, 0x0032dd5c}}}, + {X: Field{[10]uint32{0x015fe2c2, 0x0041bbde, 0x03bdc8c5, 0x00229c8d, 0x03843b7d, 0x024dd0d8, 0x000ddf19, 0x01ba7872, 0x01cdadb2, 0x0014f5d9}}, Y: Field{[10]uint32{0x017c287b, 0x0269016b, 0x000bec98, 0x00ec4a29, 0x00a66d4f, 0x01351454, 0x0187f819, 0x025ceddb, 0x0198eb39, 0x001eeeec}}}, + {X: Field{[10]uint32{0x03bb66af, 0x02d46695, 0x03fc16d7, 0x02426d9b, 0x010452ee, 0x03d7fdb0, 0x03a989c0, 0x00efcd48, 0x029ec16b, 0x003941f7}}, Y: Field{[10]uint32{0x03f7892a, 0x014078a3, 0x0195259a, 0x03401320, 0x0251b6d3, 0x022566b4, 0x008b3950, 0x0379b8f7, 0x002a8272, 0x0028bcbc}}}, + {X: Field{[10]uint32{0x01b4a6f2, 0x027260ce, 0x03983556, 0x01db8a95, 0x0265601d, 0x027d82de, 0x0103b8cb, 0x013eca06, 0x00c60eb8, 0x00005bd2}}, Y: Field{[10]uint32{0x0132b289, 0x023d40f7, 0x016a441d, 0x00a43d25, 0x03d827b6, 0x02dbbd13, 0x031e75d5, 0x01a0759b, 0x03848398, 0x002184ee}}}, + {X: Field{[10]uint32{0x01446056, 0x02d8ce78, 0x03af90ca, 0x00e0a8ec, 0x010bb98e, 0x00f44b61, 0x00b51323, 0x01978c9c, 0x01ae7742, 0x0019411c}}, Y: Field{[10]uint32{0x01a50306, 0x009c92a9, 0x03cda4e6, 0x00c85765, 0x01187b40, 0x00d670ce, 0x0290a62d, 0x01bf9b2b, 0x039334aa, 0x0020e39d}}}, + {X: Field{[10]uint32{0x0021dda8, 0x02ab0aaf, 0x00821559, 0x0287f5eb, 0x02348d1b, 0x026097eb, 0x010e19d6, 0x01613f32, 0x0016fa34, 0x000577a9}}, Y: Field{[10]uint32{0x00433047, 0x01c090ea, 0x01c15d40, 0x03d7517e, 0x00010fa5, 0x012f44c1, 0x012a3d28, 0x0339a3b8, 0x03f21e19, 0x00007f2a}}}, + {X: Field{[10]uint32{0x005b46e2, 0x032e81ec, 0x00751dc5, 0x001ed3df, 0x02ee9d6a, 0x00d5ee91, 0x03900878, 0x01c3b4f6, 0x00954f1f, 0x002d0ac9}}, Y: Field{[10]uint32{0x0169ed71, 0x0065a802, 0x03ec69f9, 0x02d31546, 0x034851f5, 0x00110f18, 0x0328d6da, 0x036f9b5b, 0x03eb0e0b, 0x003855c8}}}, + {X: Field{[10]uint32{0x00230f83, 0x03f15ff0, 0x00960a17, 0x01fa3894, 0x006ab10b, 0x03b26d18, 0x02b1125d, 0x02b0c476, 0x00f5c6ae, 0x00023a79}}, Y: Field{[10]uint32{0x03959ab2, 0x01db4c6a, 0x03dee645, 0x00d358a1, 0x03f1e32c, 0x0016899f, 0x03d4e53a, 0x02ede5e2, 0x0211c79f, 0x003fec38}}}, + {X: Field{[10]uint32{0x03e1ac2e, 0x0127fa4f, 0x03528295, 0x0207e012, 0x03d6f2bb, 0x0353542f, 0x027fb63b, 0x012dce18, 0x032373bd, 0x0021ef9c}}, Y: Field{[10]uint32{0x0294e1a4, 0x01087e1f, 0x00288ce8, 0x01f5d589, 0x021ae553, 0x03038956, 0x00844b2e, 0x02e6d7ff, 0x006ff147, 0x003daa46}}}, + {X: Field{[10]uint32{0x019d60f7, 0x01c9f859, 0x02c95002, 0x019abcd2, 0x01d2cfd4, 0x01722493, 0x029514ab, 0x00e1d217, 0x0161c836, 0x0010d807}}, Y: Field{[10]uint32{0x03bc2c2a, 0x039d6d60, 0x02b099a5, 0x00d999e7, 0x00113335, 0x02316eef, 0x028034b8, 0x032536cc, 0x00007c09, 0x0021e470}}}, + {X: Field{[10]uint32{0x02b49d0d, 0x02abe8ca, 0x020aca0d, 0x0250a895, 0x026902e3, 0x0299abe5, 0x01f0bcbb, 0x01c714d9, 0x0180f830, 0x000d06c5}}, Y: Field{[10]uint32{0x00877b20, 0x00d38519, 0x01d941c0, 0x0386e840, 0x037e8fdb, 0x0119271b, 0x03564d2d, 0x024099ff, 0x0313c549, 0x0012e616}}}, + {X: Field{[10]uint32{0x014dad95, 0x009c5c7c, 0x012eb576, 0x02a39592, 0x0033ac1a, 0x01e7ec55, 0x03181e2c, 0x00e90df1, 0x00b3ce4a, 0x0005d79f}}, Y: Field{[10]uint32{0x01135b0d, 0x0363f0a0, 0x01d9ce92, 0x01558f29, 0x02581301, 0x00da5bd0, 0x038703f9, 0x03d4bbf3, 0x01a87834, 0x000c7398}}}, + {X: Field{[10]uint32{0x007165ad, 0x0391704c, 0x03a98249, 0x02553202, 0x0089c1e4, 0x0328fb2b, 0x033c8482, 0x0071878e, 0x00cc64e6, 0x0016b50c}}, Y: Field{[10]uint32{0x0251c791, 0x033b3aa4, 0x03fbeac7, 0x01b86b08, 0x009ead5f, 0x016a2e17, 0x03ca083c, 0x004ef0c5, 0x0060505c, 0x002fa8a8}}}, + {X: Field{[10]uint32{0x01b8b837, 0x03fbe983, 0x009f28ae, 0x038f75f4, 0x01080f0c, 0x01fea130, 0x00602df0, 0x038c6262, 0x00d96dac, 0x00107738}}, Y: Field{[10]uint32{0x02827928, 0x03fe3434, 0x02e333cd, 0x0247e137, 0x02088500, 0x0154c8ed, 0x02635ea8, 0x01ba7225, 0x003fed9a, 0x001d258b}}}, + {X: Field{[10]uint32{0x01961bcc, 0x0330508e, 0x03e5ba23, 0x017810cb, 0x039aed2d, 0x00819d90, 0x03c1dc25, 0x01376840, 0x00988710, 0x00297bd1}}, Y: Field{[10]uint32{0x0122db3a, 0x02c3587c, 0x009f0696, 0x0099d96c, 0x02a165c5, 0x0194ee9e, 0x02ecc328, 0x038364f9, 0x003ea363, 0x00072f3e}}}, + {X: Field{[10]uint32{0x033a9d45, 0x015c8d7e, 0x01e626db, 0x00b8b5b5, 0x0218225f, 0x014a8b2f, 0x03df68b8, 0x01800ce2, 0x02ce9ad4, 0x0013689b}}, Y: Field{[10]uint32{0x01fae659, 0x037a427a, 0x029c73d3, 0x001b9ee8, 0x0061b0a8, 0x030f587d, 0x0210e2d1, 0x011aff31, 0x02637ab5, 0x003442d6}}}, + {X: Field{[10]uint32{0x018f4763, 0x03b71a7e, 0x0111129d, 0x0214479a, 0x03e9d955, 0x0286693d, 0x00d8eb16, 0x01023922, 0x026f53d2, 0x001b9887}}, Y: Field{[10]uint32{0x00ea1a19, 0x017f540f, 0x0048e4bb, 0x00b2d4b1, 0x007b945a, 0x00d0b1ef, 0x01ad4779, 0x02c4c4d0, 0x02f273e1, 0x001ec523}}}, + {X: Field{[10]uint32{0x038be83b, 0x01553549, 0x02ab6da4, 0x002a3c20, 0x0066bae2, 0x028e56a4, 0x017ea758, 0x01d1a66d, 0x03645bed, 0x003aebd5}}, Y: Field{[10]uint32{0x03cfbba7, 0x02ae782f, 0x02028650, 0x01298049, 0x02d91631, 0x0227b8f9, 0x029ea943, 0x00c0cd78, 0x00e06c65, 0x001611fd}}}, + {X: Field{[10]uint32{0x0310182f, 0x03fd8d4c, 0x0017a6a6, 0x028450e3, 0x02faa38c, 0x014ac574, 0x0355dbf0, 0x018cb492, 0x0271711b, 0x00303e22}}, Y: Field{[10]uint32{0x010676ff, 0x027913b3, 0x012481c5, 0x02605069, 0x03fb2e98, 0x002020be, 0x0211eec4, 0x01c08619, 0x014d16c0, 0x000b2feb}}}, + {X: Field{[10]uint32{0x035c6350, 0x00a1ec16, 0x00ae01b5, 0x02dcf3dc, 0x02dc1cdd, 0x018a48b1, 0x0244fbf2, 0x02526318, 0x001884b7, 0x001766db}}, Y: Field{[10]uint32{0x017fdf1d, 0x0144431f, 0x0297e5e8, 0x02316dab, 0x0118db17, 0x02d53321, 0x03e1644b, 0x0058b12a, 0x031d2f2b, 0x000ca3a0}}}, + {X: Field{[10]uint32{0x0202e21c, 0x03127c13, 0x00016654, 0x02555641, 0x03e57d75, 0x008e94ed, 0x03214c63, 0x01b9a753, 0x020f37ed, 0x0034744d}}, Y: Field{[10]uint32{0x01d15e4e, 0x007ce51b, 0x02b6a152, 0x0351b248, 0x006eba68, 0x002a2c40, 0x01594144, 0x02d4fe51, 0x0293c6c9, 0x00189fba}}}, + {X: Field{[10]uint32{0x02411731, 0x01a732fb, 0x00703e49, 0x020d959d, 0x02ace29a, 0x01ec6cac, 0x02cfa189, 0x00ebd562, 0x03cbf102, 0x003bf261}}, Y: Field{[10]uint32{0x01740c69, 0x026f10bd, 0x01dbbe15, 0x03f27d59, 0x02e38242, 0x02f3bd0c, 0x02429863, 0x002fb1c5, 0x0265d379, 0x0006569a}}}, + {X: Field{[10]uint32{0x00284ff0, 0x0243ea86, 0x02b01310, 0x01ee0fbd, 0x00968d1d, 0x00e19120, 0x0388b787, 0x03cef586, 0x0397163d, 0x003cc09a}}, Y: Field{[10]uint32{0x0211509b, 0x015ab06d, 0x030e9a6c, 0x01321359, 0x035f8764, 0x0167c1bf, 0x0281615d, 0x018eaefc, 0x02616823, 0x0005df0e}}}, + {X: Field{[10]uint32{0x002c5873, 0x0082435a, 0x0030b562, 0x03e5a3fe, 0x020deeec, 0x03273fd1, 0x02c92c68, 0x016da64a, 0x035f123b, 0x00174d3f}}, Y: Field{[10]uint32{0x01955ac8, 0x02d989b1, 0x02ff3d49, 0x03ea03e2, 0x0025443e, 0x023ac586, 0x0204df14, 0x0281950c, 0x039c8eab, 0x000b4682}}}, + {X: Field{[10]uint32{0x028447f4, 0x019ca011, 0x030bbdac, 0x0074c6a6, 0x00e0ee59, 0x010c2332, 0x01da0658, 0x01491f0e, 0x021794a9, 0x0032fe6e}}, Y: Field{[10]uint32{0x00461736, 0x009e5ab4, 0x005381b8, 0x0075d3c0, 0x03405810, 0x00d044b4, 0x025fade9, 0x02ba8408, 0x00c310fe, 0x001526c6}}}, + {X: Field{[10]uint32{0x03dcd31f, 0x032b3531, 0x03a5379a, 0x02e0da35, 0x008e7747, 0x015e9cd1, 0x01982a6b, 0x00986efd, 0x01ba09e2, 0x0024825d}}, Y: Field{[10]uint32{0x00b46dbd, 0x039d8e2b, 0x03dcb434, 0x012f5516, 0x016367d2, 0x0255040c, 0x0221f5ae, 0x01543424, 0x010881af, 0x003a5781}}}, + {X: Field{[10]uint32{0x03eeca64, 0x033c4c81, 0x000ff33f, 0x0048ef06, 0x00391323, 0x02d3c974, 0x02cdce82, 0x02d57649, 0x02e46fdc, 0x002056ca}}, Y: Field{[10]uint32{0x01b8c971, 0x022d3f92, 0x01512c96, 0x021d57c9, 0x0199285b, 0x0194462e, 0x01e2e268, 0x018dd23c, 0x03c67d88, 0x0018bd8d}}}, + {X: Field{[10]uint32{0x03e0b16e, 0x00f1153d, 0x019260de, 0x0097688c, 0x0227ca80, 0x02934e1f, 0x02a86397, 0x0352e8c3, 0x02c28e28, 0x0006ee69}}, Y: Field{[10]uint32{0x00d7ab93, 0x03bf1277, 0x01a94f56, 0x0355040d, 0x03206349, 0x031f8051, 0x004265ea, 0x005c7206, 0x00165e32, 0x002832f0}}}, + {X: Field{[10]uint32{0x0268bc22, 0x00cdf1b6, 0x00c3d34d, 0x02e9e3ad, 0x019c05a4, 0x03789e3c, 0x019d29dd, 0x020faac2, 0x03fedffd, 0x001bc054}}, Y: Field{[10]uint32{0x03f0c626, 0x00147e79, 0x02f824d5, 0x019c3838, 0x039fc499, 0x0288c7ca, 0x00041d3a, 0x00fe167d, 0x000d3501, 0x00294cb4}}}, + {X: Field{[10]uint32{0x0320258a, 0x032dea46, 0x028552e9, 0x039b1b6b, 0x02ed23e5, 0x006fd556, 0x000d3847, 0x01de9034, 0x033b3bee, 0x000d153d}}, Y: Field{[10]uint32{0x00d18dde, 0x023e54b6, 0x0128f23a, 0x00e8fd03, 0x03992683, 0x01af7b70, 0x025bcaa0, 0x007a3cff, 0x0046cfdf, 0x0024b082}}}, + {X: Field{[10]uint32{0x030e9a86, 0x024c5f08, 0x01f02fc5, 0x021903b7, 0x001dfcf6, 0x0354a00c, 0x00c2616a, 0x01ad386e, 0x03c9a360, 0x000d9e01}}, Y: Field{[10]uint32{0x016ecae6, 0x012904b0, 0x01a14830, 0x00bc00a0, 0x03fdc4f9, 0x00902572, 0x01ba14c1, 0x03b39c0f, 0x032fa2bb, 0x0007c08f}}}, + {X: Field{[10]uint32{0x001af62b, 0x02965048, 0x00909acb, 0x0105d7f1, 0x0101b825, 0x03112e05, 0x034e06f0, 0x03dabc4d, 0x01c39891, 0x0023b13f}}, Y: Field{[10]uint32{0x034e5f1b, 0x015b3dfb, 0x01751137, 0x033d7f0a, 0x00fe067b, 0x00f1e63e, 0x01ca0e50, 0x03621e0f, 0x02e5cac2, 0x000b71b2}}}, + {X: Field{[10]uint32{0x0178a263, 0x026c1aa4, 0x03842872, 0x014546e2, 0x03ffa085, 0x017ea4df, 0x0142f91e, 0x0093e451, 0x026d4c5b, 0x00173092}}, Y: Field{[10]uint32{0x037da472, 0x027573fe, 0x00b98da1, 0x02a0f76f, 0x02ca8d55, 0x0067e87f, 0x0338a4e4, 0x00687efe, 0x02358153, 0x002c76a1}}}, + {X: Field{[10]uint32{0x03599e9f, 0x013f1378, 0x02a21913, 0x01414314, 0x0292602a, 0x02a04374, 0x0244a6cd, 0x00170ea5, 0x0126c039, 0x0020e416}}, Y: Field{[10]uint32{0x0246089a, 0x0038315e, 0x01e16cf2, 0x022c8767, 0x00909429, 0x02a0dd8e, 0x00b115ea, 0x019e4a88, 0x020fe8af, 0x0010a4c9}}}, + {X: Field{[10]uint32{0x0189b6c7, 0x02ca6159, 0x00822481, 0x0050d2b9, 0x02e8fa6c, 0x034e1e3e, 0x0204ac30, 0x03a777e0, 0x017e4721, 0x002512c2}}, Y: Field{[10]uint32{0x03d6ddf6, 0x03d2e5a6, 0x00e8ee8a, 0x013011d9, 0x011525bd, 0x039d16e6, 0x03796431, 0x02c257e2, 0x016530e9, 0x0017f11d}}}, + {X: Field{[10]uint32{0x0023b73d, 0x017aefcd, 0x0030107b, 0x00797ea4, 0x0117327a, 0x018e9ccc, 0x00aaf04a, 0x0304d387, 0x023fcfb7, 0x002ac2d2}}, Y: Field{[10]uint32{0x0296c9da, 0x00efc6b3, 0x00781376, 0x034de170, 0x02b84944, 0x02bb334e, 0x038c92cf, 0x02ea2b35, 0x0263a5bb, 0x003879e4}}}, + {X: Field{[10]uint32{0x03e8b85f, 0x00f7fb83, 0x010bcf80, 0x0361efc2, 0x031aa2c3, 0x0168b939, 0x03f7fbf0, 0x00ac3bde, 0x00b5220f, 0x0015e8d1}}, Y: Field{[10]uint32{0x01a7d04e, 0x0398e6ec, 0x00f10576, 0x00f059e3, 0x01a9e11a, 0x00e9caa5, 0x00c9f135, 0x02588392, 0x010e08ef, 0x003e0adf}}}, + {X: Field{[10]uint32{0x00d81ac5, 0x02498ff2, 0x0188da1a, 0x025bb118, 0x033608e3, 0x033c3d3f, 0x038c4c95, 0x01f13147, 0x021a800b, 0x001b814f}}, Y: Field{[10]uint32{0x015e7473, 0x0363124e, 0x03dbadc3, 0x01e5c80b, 0x0362e365, 0x03390a30, 0x035384ff, 0x008f2786, 0x0298e3c8, 0x00218e27}}}, + {X: Field{[10]uint32{0x02485cb7, 0x03ab8973, 0x03f1c59d, 0x03b1fc20, 0x0148a289, 0x0159ed51, 0x00d4a7c7, 0x01c5fecc, 0x00061804, 0x0018b5d9}}, Y: Field{[10]uint32{0x0268be84, 0x03f2506d, 0x020fc4ca, 0x00b6989a, 0x03d1509b, 0x011c3ed4, 0x031d57b9, 0x007e3614, 0x014b661d, 0x003c758c}}}, + {X: Field{[10]uint32{0x0129250f, 0x011fcc77, 0x006589e3, 0x00020b4d, 0x025c4d08, 0x02f49126, 0x00cf1080, 0x02caaa0c, 0x00f2219f, 0x003976ca}}, Y: Field{[10]uint32{0x008bd453, 0x023f9a22, 0x00b248e5, 0x034bcd7e, 0x03324fcf, 0x02b512db, 0x03b7012e, 0x01f756e8, 0x024632f9, 0x0030a5b9}}}, + {X: Field{[10]uint32{0x01b32729, 0x02057c42, 0x00ab23fe, 0x026f0a65, 0x03733ec8, 0x03ffe0c7, 0x013177c9, 0x00379229, 0x03e9a3d0, 0x0011c96c}}, Y: Field{[10]uint32{0x01f8e778, 0x0279a26e, 0x02e12d4a, 0x0334a5e7, 0x02324127, 0x0120aed4, 0x01fdb741, 0x03003c51, 0x0347de38, 0x002b0edd}}}, + {X: Field{[10]uint32{0x01d72b3e, 0x0278d190, 0x00569bbe, 0x017a9db8, 0x03b036b6, 0x0004f8d1, 0x00ed9187, 0x01cb9ce5, 0x03b6492c, 0x003434eb}}, Y: Field{[10]uint32{0x0202fef3, 0x010bede3, 0x03f1396f, 0x002c0bd8, 0x00bd952b, 0x0028a158, 0x0061caa0, 0x03f81d4c, 0x005b94aa, 0x000b74e9}}}, + {X: Field{[10]uint32{0x0304632c, 0x0241a3f0, 0x00b4c786, 0x03b73d2d, 0x03104143, 0x0092b3fc, 0x0385654a, 0x03215e5e, 0x0335d717, 0x001e14f9}}, Y: Field{[10]uint32{0x021efadd, 0x00d4d577, 0x00e69cb5, 0x0068524e, 0x02bae3a3, 0x01680a48, 0x0377a8fb, 0x03452b09, 0x03d9e70f, 0x00002a1c}}}, + {X: Field{[10]uint32{0x02e904a4, 0x02778ce3, 0x032ca778, 0x0325fe75, 0x02ee44e2, 0x013248d5, 0x021a01a1, 0x0371644e, 0x02b37d4f, 0x0001b6c9}}, Y: Field{[10]uint32{0x031941fb, 0x00a2ba58, 0x01b6854a, 0x02498e1a, 0x02d8adf7, 0x02612712, 0x001c409e, 0x028330a3, 0x0225bf2b, 0x00053f88}}}, + {X: Field{[10]uint32{0x032848df, 0x028bbe3a, 0x00ce699a, 0x003d8ea7, 0x02538e40, 0x01a7e90f, 0x02f7f5c6, 0x02bcf02c, 0x0069bb98, 0x002d4bc2}}, Y: Field{[10]uint32{0x0107be5a, 0x005b85e2, 0x03858bb6, 0x02329dbe, 0x028b821c, 0x00395eda, 0x03378cca, 0x01152b9e, 0x032455bc, 0x0009159a}}}, + {X: Field{[10]uint32{0x0197b448, 0x007e4e80, 0x037e4c1e, 0x03004e13, 0x03234152, 0x01c3e9f0, 0x034a9e99, 0x02bc0fac, 0x01e11ee6, 0x00218537}}, Y: Field{[10]uint32{0x0372f3cc, 0x0134f31e, 0x02ba15e5, 0x015762e9, 0x024e5c7e, 0x008c3103, 0x0222b5ad, 0x01a1c0ae, 0x01a2ac99, 0x000a8449}}}, + {X: Field{[10]uint32{0x038c1cfa, 0x00824de4, 0x00ab2dbc, 0x03ad6743, 0x008b3308, 0x03c82f74, 0x0271c180, 0x01b96de3, 0x03ae625f, 0x00260a8d}}, Y: Field{[10]uint32{0x02a40d0c, 0x014c26ad, 0x017dc18e, 0x00af75b1, 0x032a689e, 0x02d41c2f, 0x01249e20, 0x0144a164, 0x016f00a6, 0x0019c7f8}}}, + {X: Field{[10]uint32{0x003e703a, 0x0068bf53, 0x01d9b408, 0x02bc8b2a, 0x00627a09, 0x0248c700, 0x019742fc, 0x020a73b2, 0x030526b4, 0x001afaa4}}, Y: Field{[10]uint32{0x019a6cc1, 0x00ac1652, 0x014832b0, 0x0043116f, 0x01d7541f, 0x00650f9a, 0x0344d14b, 0x01ed307c, 0x002a5451, 0x002bb150}}}, + {X: Field{[10]uint32{0x02583edb, 0x01ef4a65, 0x019200ba, 0x026481cc, 0x0054016a, 0x01b445ac, 0x00188b33, 0x0121f9f3, 0x03818694, 0x002d5c91}}, Y: Field{[10]uint32{0x03845cdc, 0x03d8a19d, 0x03ec6208, 0x02ced35f, 0x011d278f, 0x02f163ff, 0x018262de, 0x0292f4f5, 0x01861f80, 0x00172ef4}}}, + {X: Field{[10]uint32{0x017c5412, 0x03a78b66, 0x01bb62e0, 0x00d1c13b, 0x024df5a5, 0x022b14e4, 0x02f4f531, 0x003a45e1, 0x02627ba0, 0x003786b7}}, Y: Field{[10]uint32{0x022021e0, 0x03fba76b, 0x01a8e4bf, 0x039b8742, 0x03a9d003, 0x007019cf, 0x02dc15a4, 0x00efeff1, 0x02c50bf2, 0x001fbd21}}}, + {X: Field{[10]uint32{0x0398c0a0, 0x01b4dbcc, 0x0166dd47, 0x0262f004, 0x03337203, 0x02e03875, 0x01e465df, 0x0071067e, 0x017cb172, 0x000dce29}}, Y: Field{[10]uint32{0x030c22f5, 0x01529e2d, 0x00bfd118, 0x01b14a49, 0x0243df56, 0x03610e16, 0x028a629a, 0x02c5b5b4, 0x03b21662, 0x00387c96}}}, + {X: Field{[10]uint32{0x0281885d, 0x00001b9e, 0x02e37694, 0x02e2dd40, 0x021955fe, 0x0377db6a, 0x01575f12, 0x0048e6a1, 0x01c16b2a, 0x00132b88}}, Y: Field{[10]uint32{0x00dc99c3, 0x03d5972d, 0x019e237a, 0x026ca755, 0x0225fa2c, 0x020a0cac, 0x0271e89c, 0x0183609d, 0x00553886, 0x000abffa}}}, + {X: Field{[10]uint32{0x00c2bd7b, 0x00bebe37, 0x02039573, 0x03b86ea9, 0x0397bfa7, 0x016f30e9, 0x037cf558, 0x002f8db8, 0x021fba8a, 0x00131446}}, Y: Field{[10]uint32{0x025651af, 0x029172ac, 0x0372d8a6, 0x01a621f0, 0x03abb272, 0x02575a0c, 0x0000fd4a, 0x02affc8d, 0x03945c6b, 0x003a9a7d}}}, + {X: Field{[10]uint32{0x005a7e29, 0x0145e79d, 0x01f8320c, 0x012cae94, 0x02c2e4a4, 0x03a4db02, 0x007c25ad, 0x010dc098, 0x00c4323b, 0x00360476}}, Y: Field{[10]uint32{0x03c05345, 0x037652b9, 0x0293c3c4, 0x00fda7e7, 0x0346c6df, 0x02d2438e, 0x020aeabc, 0x011fe036, 0x00a217bf, 0x001bfe5c}}}, + {X: Field{[10]uint32{0x02c43eee, 0x03897985, 0x01b0b1ca, 0x02b87ec2, 0x0233db68, 0x004ed7fe, 0x01bbafdf, 0x02abff8e, 0x01d3b5e5, 0x000407ad}}, Y: Field{[10]uint32{0x02c5ddb3, 0x00698eae, 0x00f4a163, 0x00e4d383, 0x00a49709, 0x02c0c483, 0x03a1c96e, 0x01c96981, 0x01149867, 0x00275a95}}}, + {X: Field{[10]uint32{0x02480519, 0x0073e2dc, 0x03968de2, 0x01c3bfe3, 0x01ecdc7f, 0x018bfab4, 0x001f21f0, 0x03917f85, 0x0152b8dd, 0x00227ac4}}, Y: Field{[10]uint32{0x0297b447, 0x036c1f2d, 0x0195b41f, 0x02a18fef, 0x00cb6703, 0x00af11dc, 0x02c99d7f, 0x038f55a7, 0x03c43181, 0x003e28cd}}}, + {X: Field{[10]uint32{0x02d0dc16, 0x03a59366, 0x030cdbd1, 0x03ada379, 0x0149d95e, 0x0154066a, 0x03d8f1e4, 0x0291349c, 0x03f3f48e, 0x0014f58c}}, Y: Field{[10]uint32{0x011645fe, 0x03f4cef3, 0x023af48f, 0x03b923f9, 0x028e8ff4, 0x039b6df9, 0x03fe6f32, 0x033c6cfd, 0x0176964d, 0x0006c9bb}}}, + {X: Field{[10]uint32{0x00d9be6a, 0x023e57f6, 0x02d1a92f, 0x012e0e62, 0x006ce3db, 0x0273b6d9, 0x0294d26b, 0x00441966, 0x01104989, 0x0037841a}}, Y: Field{[10]uint32{0x02b43d32, 0x03644cd7, 0x03e7b5b9, 0x039b73e0, 0x008768a4, 0x008f5022, 0x00a3d06d, 0x0274595e, 0x0341dbd9, 0x0021d902}}}, + {X: Field{[10]uint32{0x02f5bea2, 0x005dcf1a, 0x023caf76, 0x01ed0685, 0x00cc6daa, 0x02027684, 0x0189a9a7, 0x038916b0, 0x026f0b9e, 0x00103b47}}, Y: Field{[10]uint32{0x00217b2e, 0x0330787f, 0x03adb50b, 0x00ba9c65, 0x0082bae8, 0x010c2b01, 0x02b7bdf1, 0x03ee69e3, 0x01017298, 0x003ffb45}}}, + {X: Field{[10]uint32{0x03ba15c1, 0x0046f599, 0x02dfaa3b, 0x028ca7c9, 0x001b7ab3, 0x03a94a73, 0x004d1719, 0x002e68de, 0x02ee59a2, 0x00157eaa}}, Y: Field{[10]uint32{0x002f4a65, 0x014f77c6, 0x0075c373, 0x00169f95, 0x000d7f28, 0x0391c197, 0x014771d8, 0x014f8d7b, 0x039b52ac, 0x002a7e24}}}, + {X: Field{[10]uint32{0x028af3fb, 0x02f40afe, 0x03ccba53, 0x001fc0d3, 0x00a95ac6, 0x01255b44, 0x000ca172, 0x0222bc86, 0x024e21cf, 0x002d4779}}, Y: Field{[10]uint32{0x03b7f81e, 0x02ce1b00, 0x01ac4878, 0x0066922c, 0x029b8400, 0x0399b129, 0x0399f1f6, 0x00bafd1a, 0x03701c65, 0x0005d766}}}, + {X: Field{[10]uint32{0x0307b143, 0x03e65ede, 0x00171556, 0x03a3361d, 0x007b8927, 0x00d9f3d0, 0x03235be9, 0x007a092e, 0x00dcbcd9, 0x001455ac}}, Y: Field{[10]uint32{0x00cc91dc, 0x03d2fe08, 0x018dec2a, 0x02432ec3, 0x01d40ada, 0x0049c05b, 0x01ded191, 0x0130ff99, 0x000fa29d, 0x0007515f}}}, + {X: Field{[10]uint32{0x016dd63d, 0x00476382, 0x02bcd00e, 0x0019e46d, 0x03f1993c, 0x02391069, 0x01fac558, 0x0125cc58, 0x0172060b, 0x000efd47}}, Y: Field{[10]uint32{0x00722d49, 0x02ba293d, 0x0312663e, 0x038abdd3, 0x0173e1e4, 0x03da6126, 0x023905dd, 0x02bf6ff1, 0x007090a7, 0x001ef1ad}}}, + {X: Field{[10]uint32{0x02d61fe5, 0x036dec26, 0x0205ad76, 0x03193eab, 0x0122fa74, 0x029bcb68, 0x014f4d3b, 0x02040845, 0x00912008, 0x0034a5c4}}, Y: Field{[10]uint32{0x028e3fc8, 0x0123dad8, 0x00156926, 0x01cd954a, 0x02bc33cb, 0x014708f0, 0x000cc141, 0x03cf23e5, 0x03aaf2cc, 0x001cd43a}}}, + {X: Field{[10]uint32{0x0368013d, 0x02d82a71, 0x0126c559, 0x01f88d05, 0x036d7a3b, 0x007ff4c2, 0x015a5202, 0x0044be89, 0x03ca8e17, 0x0030bb91}}, Y: Field{[10]uint32{0x03ece448, 0x0014058a, 0x0031a453, 0x002080a6, 0x0280d9ff, 0x036cec8e, 0x008e83be, 0x01fd6c77, 0x036bd83b, 0x000b9ba2}}}, + {X: Field{[10]uint32{0x0270b6cf, 0x016b6f4f, 0x03aaae47, 0x012d5876, 0x00c5ef44, 0x01b31300, 0x00da39e9, 0x03383678, 0x00d69ddc, 0x00156666}}, Y: Field{[10]uint32{0x00ffb328, 0x014d308d, 0x03ac525c, 0x01cc6bcb, 0x00cf0f31, 0x02d34879, 0x02b5e8cd, 0x03b96e37, 0x020095ae, 0x0031270a}}}, + {X: Field{[10]uint32{0x03baf363, 0x0152405a, 0x032f9e9d, 0x03764372, 0x017c1955, 0x01c86a63, 0x01305c39, 0x02eb7791, 0x02c3e4c8, 0x0012d2c0}}, Y: Field{[10]uint32{0x00d43468, 0x01a178c6, 0x00fb925b, 0x0191856f, 0x01d22a6a, 0x00f70c13, 0x01d546e0, 0x0166cf09, 0x037ebe8f, 0x00282d9e}}}, + {X: Field{[10]uint32{0x02c549c5, 0x01f74b2a, 0x0101fe0d, 0x03a3b87b, 0x007650ad, 0x0350a25f, 0x00f897c5, 0x02d09d47, 0x03fd7836, 0x003eebf9}}, Y: Field{[10]uint32{0x02668436, 0x00044384, 0x03aeb5e7, 0x00a26914, 0x01229a7e, 0x03b69489, 0x03841f58, 0x01f945ed, 0x014352d0, 0x000bd446}}}, + {X: Field{[10]uint32{0x0076c06c, 0x03786d9c, 0x0219f954, 0x0340a92c, 0x0281b21b, 0x01ceb139, 0x004e620b, 0x02e281e2, 0x02f90c65, 0x003334c1}}, Y: Field{[10]uint32{0x0257510b, 0x017d6c55, 0x005668ab, 0x029d6932, 0x00003f68, 0x00f8115d, 0x03056dc7, 0x02d43241, 0x007fa7b0, 0x00208fe9}}}, + {X: Field{[10]uint32{0x00195a3b, 0x02e35586, 0x01980820, 0x0177626a, 0x01912415, 0x0211d14b, 0x01a870a7, 0x01a474ed, 0x0038995a, 0x002ebef6}}, Y: Field{[10]uint32{0x00ad92a3, 0x024f9f42, 0x006874e8, 0x03560e72, 0x004f05f4, 0x00082d6c, 0x00e7f521, 0x00a7bbec, 0x01fac948, 0x00237d32}}}, + {X: Field{[10]uint32{0x024f458f, 0x0330e008, 0x019fb157, 0x00dee1a4, 0x00713d8f, 0x03e50299, 0x0166af8f, 0x0055b828, 0x003a8073, 0x00344973}}, Y: Field{[10]uint32{0x0035abde, 0x013b2f2f, 0x012a3a03, 0x00bbc981, 0x021bb7a2, 0x0288e9e3, 0x001054ae, 0x00de9f7c, 0x00b6ac4e, 0x00280c3a}}}, + {X: Field{[10]uint32{0x038187c2, 0x03c9e3b2, 0x008668cb, 0x03f629fa, 0x01f2d1bb, 0x0388b90b, 0x02c6433b, 0x036aebbc, 0x03281b5d, 0x001f5247}}, Y: Field{[10]uint32{0x00dfe8ed, 0x009ee9bd, 0x02af9bea, 0x031faf20, 0x0228b040, 0x01d82cbf, 0x0381ea3f, 0x00259b28, 0x021d7036, 0x00328605}}}, + {X: Field{[10]uint32{0x01f8c39e, 0x017c1ef3, 0x03961601, 0x025541e6, 0x016d70a5, 0x02a7d25e, 0x002995c6, 0x0048ea1b, 0x02339f29, 0x000c7336}}, Y: Field{[10]uint32{0x00b49f65, 0x030b93fa, 0x03a19561, 0x02c2f201, 0x02376626, 0x0018347c, 0x0128a9ff, 0x007eb265, 0x010bedf6, 0x002bac9f}}}, + {X: Field{[10]uint32{0x017807ba, 0x00e7d28a, 0x01ba7d74, 0x00bc3784, 0x01e5ec91, 0x006ddbec, 0x012073e7, 0x024625b2, 0x00c7f45f, 0x0001e799}}, Y: Field{[10]uint32{0x0023c921, 0x0177b5d6, 0x02e7efe8, 0x02f3258c, 0x00d17685, 0x0097626d, 0x011abe38, 0x0258f162, 0x0036b354, 0x0015f64d}}}, + {X: Field{[10]uint32{0x0042274e, 0x00c7daa3, 0x0206c78a, 0x034b7af3, 0x0369f422, 0x002f690f, 0x02f057b6, 0x00e1a1c7, 0x02dffccb, 0x003588cb}}, Y: Field{[10]uint32{0x000ef826, 0x0331f5fb, 0x004d6d62, 0x018eb0f7, 0x0158a18f, 0x026d7df4, 0x03472f22, 0x038274db, 0x03a0b2e2, 0x0004f6bb}}}, + {X: Field{[10]uint32{0x006e368e, 0x02ed99d1, 0x03ea6a7e, 0x0349228c, 0x00722d78, 0x020a2516, 0x038fc00c, 0x038e94dc, 0x0298b2d6, 0x0008703c}}, Y: Field{[10]uint32{0x03062383, 0x019837f7, 0x034a2b20, 0x016b97cc, 0x02cbb3f2, 0x017695a7, 0x015eede1, 0x03f656e2, 0x03ec17d2, 0x00219d54}}}, + {X: Field{[10]uint32{0x003196c8, 0x00b2bb93, 0x031d0f4f, 0x0070ff66, 0x00eaa231, 0x013dd1c8, 0x011621c5, 0x03de6755, 0x01010dcb, 0x0007468f}}, Y: Field{[10]uint32{0x039734eb, 0x03ebab90, 0x0233d6f8, 0x00701f97, 0x005453bf, 0x00e51763, 0x01b1a301, 0x03e4321e, 0x01159900, 0x003569e8}}}, + {X: Field{[10]uint32{0x00e76735, 0x02ec770a, 0x025614f4, 0x0171dd4e, 0x0162e26d, 0x0160a854, 0x00a97d18, 0x027b7803, 0x02808fa9, 0x0015d221}}, Y: Field{[10]uint32{0x03c17c6f, 0x02876e4b, 0x02b1eeba, 0x00d2576c, 0x00b3bbee, 0x03b06925, 0x000ecc54, 0x03b78373, 0x00597117, 0x0037af6a}}}, + {X: Field{[10]uint32{0x0391715a, 0x03eb7225, 0x0207c9f6, 0x034c7073, 0x03607194, 0x0322f7a7, 0x01e820c4, 0x037fe938, 0x00d34ce1, 0x002db74d}}, Y: Field{[10]uint32{0x0239cc9d, 0x02194862, 0x03200717, 0x0150e810, 0x031487e5, 0x0126f1f3, 0x01c0ec90, 0x0354ccab, 0x0068e405, 0x0022fd22}}}, + {X: Field{[10]uint32{0x0291d0de, 0x01412f52, 0x031600f3, 0x01b27882, 0x035821df, 0x0148b7e6, 0x02bc8871, 0x021dcb28, 0x02d56908, 0x00243e77}}, Y: Field{[10]uint32{0x02f902ac, 0x03ae9dba, 0x017f9a2b, 0x006c498e, 0x01f76b3c, 0x011250ce, 0x010af26b, 0x0129bbf7, 0x024add53, 0x000345f9}}}, + {X: Field{[10]uint32{0x032cfa59, 0x02b3195a, 0x0299d260, 0x00e66c40, 0x03db07b2, 0x00c00a1c, 0x006e4a0c, 0x024d4e44, 0x00e858d1, 0x003157cd}}, Y: Field{[10]uint32{0x00e50f5b, 0x0058b78c, 0x00dda11f, 0x03ef05ae, 0x009a8fe1, 0x00b3becd, 0x0149f7fe, 0x0288b9ca, 0x00d474b5, 0x001f67ce}}}, + {X: Field{[10]uint32{0x02b8ecad, 0x03c5c895, 0x025750c5, 0x034adbd4, 0x03f39c16, 0x0128ad89, 0x03f8452c, 0x0207166c, 0x0192d389, 0x001ab910}}, Y: Field{[10]uint32{0x030b099d, 0x0365c55f, 0x02d61603, 0x0073b69a, 0x03fa61de, 0x00e3925c, 0x01c4b91e, 0x00812a7b, 0x00dd7c49, 0x0026eeea}}}, + {X: Field{[10]uint32{0x03dcffbc, 0x0113bbdb, 0x0379ae03, 0x007db362, 0x00bd0c25, 0x02ad9113, 0x013ad99e, 0x006cd9aa, 0x0239423e, 0x000ce9f5}}, Y: Field{[10]uint32{0x0011c61e, 0x021b8ee5, 0x002c02bb, 0x024756eb, 0x032f0678, 0x027b48b4, 0x012684fc, 0x0328abe9, 0x02cc006d, 0x00309844}}}, + {X: Field{[10]uint32{0x0159af0a, 0x010351fc, 0x024b2ea6, 0x03643d4a, 0x013380c1, 0x01db29b1, 0x03a6642a, 0x0219c0a3, 0x0331eac4, 0x001211c4}}, Y: Field{[10]uint32{0x00142704, 0x021b51e8, 0x0314d5b5, 0x0251c169, 0x01c5047b, 0x022ed87d, 0x0103a311, 0x038073ee, 0x014693fd, 0x002d3aa1}}}, + {X: Field{[10]uint32{0x02587917, 0x0004a970, 0x00e86d46, 0x01e6fae3, 0x0172defd, 0x00f492dc, 0x03faab74, 0x00c70133, 0x00399ae7, 0x0001596b}}, Y: Field{[10]uint32{0x00bbab48, 0x000a6066, 0x000d779c, 0x0227f53d, 0x02146649, 0x0026a591, 0x0011fece, 0x00c7abf1, 0x02a5d450, 0x0037ad5a}}}, + {X: Field{[10]uint32{0x00314c0b, 0x01c21726, 0x03773eaa, 0x0251b72f, 0x00995490, 0x03168cbf, 0x00d017d0, 0x00adf5aa, 0x00b53b6c, 0x0025920e}}, Y: Field{[10]uint32{0x01130b97, 0x03e717bf, 0x02a2f6ca, 0x027be810, 0x03ac6fdc, 0x039daf5d, 0x0271ee0e, 0x000d3f22, 0x033cec44, 0x000b6be7}}}, + {X: Field{[10]uint32{0x00eb88d5, 0x038bc7b1, 0x0087c4aa, 0x00340bbe, 0x006f9bff, 0x039522c5, 0x003522da, 0x001e2e76, 0x02907b8d, 0x002f0036}}, Y: Field{[10]uint32{0x00ddb152, 0x03856908, 0x02befeaf, 0x01fed066, 0x020fef4d, 0x0132ca7d, 0x0321dd13, 0x036dcd97, 0x0111f9e2, 0x001af43f}}}, + {X: Field{[10]uint32{0x03a7bea4, 0x01156af6, 0x0111d075, 0x02cc9fec, 0x00a2082b, 0x03d79543, 0x03dd8ae9, 0x027c33c4, 0x005500f8, 0x0006967e}}, Y: Field{[10]uint32{0x0200c823, 0x0321c29d, 0x035c2150, 0x01db8b90, 0x00e77e6e, 0x02997142, 0x0225c530, 0x02b7ff27, 0x0340d460, 0x001fa8be}}}, + {X: Field{[10]uint32{0x02ccc764, 0x01662953, 0x02fdad88, 0x028c9e69, 0x00452706, 0x015a5409, 0x01081624, 0x03f1ab51, 0x011bd3bf, 0x001e8ed8}}, Y: Field{[10]uint32{0x02233145, 0x0286b48c, 0x030d368a, 0x035a875c, 0x0283d30b, 0x015274ea, 0x033d6efe, 0x01b94b21, 0x01896806, 0x0005b825}}}, + {X: Field{[10]uint32{0x015d6d91, 0x01786dc0, 0x02bef4cd, 0x00a14444, 0x02a0a1cc, 0x0315b89e, 0x02fa95b5, 0x002969e1, 0x01779cbe, 0x000bfb55}}, Y: Field{[10]uint32{0x014bddfa, 0x02751b8b, 0x02637995, 0x0399bf97, 0x02f66fd3, 0x01b71942, 0x01691fa3, 0x01fed58f, 0x0027b229, 0x001fbab3}}}, + {X: Field{[10]uint32{0x034a9558, 0x0152835d, 0x02d02f01, 0x0377c6cd, 0x03018326, 0x02faed12, 0x03efaea6, 0x037d959c, 0x0217952e, 0x00099eb4}}, Y: Field{[10]uint32{0x01a13fef, 0x01456ec4, 0x01e6d907, 0x02de8121, 0x01703cc9, 0x02fd5280, 0x00a7b330, 0x017979a2, 0x00c07e9d, 0x001dd64f}}}, + {X: Field{[10]uint32{0x036687e8, 0x0017b85f, 0x02b106fa, 0x006f29fa, 0x010e0d34, 0x017cc851, 0x038cceca, 0x026721a5, 0x022c239b, 0x003adbb5}}, Y: Field{[10]uint32{0x02c0a241, 0x027eff14, 0x0133b662, 0x02e24187, 0x012a6e6a, 0x00eb61d5, 0x029b2258, 0x02a3a338, 0x022250f6, 0x002b6267}}}, + {X: Field{[10]uint32{0x030a9e5b, 0x00425350, 0x027b1089, 0x026fe232, 0x035087a5, 0x005a1b13, 0x00ef33c4, 0x00853c2d, 0x017ce03d, 0x0032973c}}, Y: Field{[10]uint32{0x00989ce9, 0x018eb4f4, 0x0003ef99, 0x0201c95e, 0x01e19351, 0x023a80a6, 0x03ae683c, 0x01d6eb3f, 0x02eb473f, 0x0005f913}}}, + {X: Field{[10]uint32{0x01e82f7c, 0x01c85794, 0x03a2fe4c, 0x033d1988, 0x00c82f21, 0x024f9adb, 0x03035eca, 0x0190b98f, 0x029cacf0, 0x00131ef0}}, Y: Field{[10]uint32{0x02776875, 0x034af8a0, 0x01322e59, 0x03903c7d, 0x03eb537b, 0x0102900a, 0x03f64e7e, 0x01e5b050, 0x036e8756, 0x001f1579}}}, + {X: Field{[10]uint32{0x031058e3, 0x0186f0d9, 0x03d2080b, 0x02108e27, 0x03797831, 0x02b3d375, 0x03e50130, 0x0227c140, 0x00e9b422, 0x0015f2ae}}, Y: Field{[10]uint32{0x03d9e2bc, 0x0262aaa7, 0x012ca7c3, 0x011650c3, 0x022b048c, 0x01cba6fb, 0x030b884e, 0x009cf69e, 0x03186671, 0x001e0894}}}, + {X: Field{[10]uint32{0x03c4823e, 0x03d8c426, 0x02c2753f, 0x01cbb4b9, 0x01abf3d2, 0x015a10fd, 0x0013a82a, 0x0030d37a, 0x023df112, 0x000f0afc}}, Y: Field{[10]uint32{0x013f1990, 0x03add64b, 0x029d0d08, 0x00a384bf, 0x00767409, 0x032772e2, 0x00c5b47e, 0x0348cf38, 0x036388ae, 0x0005d676}}}, + {X: Field{[10]uint32{0x02ab38d2, 0x0206c683, 0x02856d85, 0x0288a34d, 0x0234170a, 0x0373f774, 0x03348dc3, 0x01d0a834, 0x01ac83e0, 0x0030042a}}, Y: Field{[10]uint32{0x0076aafd, 0x009da10f, 0x038ea9cd, 0x004111ad, 0x002b2dc8, 0x02433e48, 0x031da1f1, 0x029a3f87, 0x03ed0644, 0x0018d325}}}, + {X: Field{[10]uint32{0x02071994, 0x01164ea4, 0x01660550, 0x00fee8ea, 0x014f1b77, 0x00f6722a, 0x00cb632b, 0x0291a039, 0x01ee548b, 0x00292af6}}, Y: Field{[10]uint32{0x00f87182, 0x017a3bf2, 0x00b6111b, 0x0123afff, 0x01c9390b, 0x0100d597, 0x02ab00a8, 0x00ca5ff1, 0x026aba26, 0x000e8509}}}, + {X: Field{[10]uint32{0x00dda172, 0x028ccf7a, 0x007115a7, 0x039666de, 0x01d68b82, 0x03b3bff9, 0x0008540d, 0x0057c717, 0x0052efc1, 0x003700b2}}, Y: Field{[10]uint32{0x036c29c6, 0x01febd57, 0x009ba236, 0x03732e15, 0x028a35f8, 0x023332a8, 0x03f4eaed, 0x03a10b29, 0x013a8e1a, 0x00393996}}}, + {X: Field{[10]uint32{0x01ec57c8, 0x036d68a4, 0x01cac1b6, 0x0205c85d, 0x000a54fc, 0x03ca7f5f, 0x00a5a4b5, 0x008bff0a, 0x01e82238, 0x003b91da}}, Y: Field{[10]uint32{0x0020385f, 0x004ff9b0, 0x00619384, 0x0050a025, 0x00338905, 0x02c05631, 0x0178b9a2, 0x0323ae82, 0x02bc4076, 0x003f28b1}}}, + {X: Field{[10]uint32{0x013ef066, 0x0349c9f6, 0x032abb11, 0x033cc493, 0x002cf990, 0x03c2230e, 0x035a6dec, 0x00303f50, 0x001d3491, 0x003cc01b}}, Y: Field{[10]uint32{0x0149eae2, 0x00da4132, 0x00d9b82d, 0x01b2237f, 0x03f8016a, 0x00d73c99, 0x01ebaf12, 0x01fd468a, 0x01f5aa36, 0x00001d8a}}}, + {X: Field{[10]uint32{0x027313b7, 0x02e4d5c7, 0x030f3794, 0x001124cb, 0x02b1b9c8, 0x00970ff5, 0x01f0a3e3, 0x0159a44a, 0x003d07bf, 0x001f3ec8}}, Y: Field{[10]uint32{0x002bc60f, 0x0116ed3a, 0x02d3982a, 0x03f99c60, 0x01e4ae08, 0x021ec05b, 0x00c42173, 0x0270e322, 0x01fd2433, 0x0013ddae}}}, + {X: Field{[10]uint32{0x02312c0a, 0x01343acc, 0x03206a32, 0x01c60eba, 0x01efeabe, 0x01c1156b, 0x0130be8e, 0x00264c27, 0x00e036e0, 0x0003328f}}, Y: Field{[10]uint32{0x0215b9e5, 0x035fa345, 0x018b20ef, 0x03766369, 0x0091b437, 0x00163223, 0x00637252, 0x01f1b4d3, 0x0258fe94, 0x00259d2b}}}, + {X: Field{[10]uint32{0x02b0d9c8, 0x02b39982, 0x01212c66, 0x03488e27, 0x01d9815f, 0x007e635c, 0x01a071c0, 0x01709e0b, 0x014881cd, 0x0027ed90}}, Y: Field{[10]uint32{0x01813251, 0x00f04fb4, 0x0309bce2, 0x011e71da, 0x03d11d50, 0x0013c71c, 0x035e515c, 0x00dd097d, 0x00541a51, 0x00013095}}}, + {X: Field{[10]uint32{0x01558b25, 0x001c2d94, 0x01542c2c, 0x03601aa8, 0x01eb5d2a, 0x009582d3, 0x0139de23, 0x03516443, 0x02bf03e3, 0x000076ef}}, Y: Field{[10]uint32{0x010b9db1, 0x02e739cb, 0x01876877, 0x0145a60c, 0x01940eae, 0x01d21328, 0x014753fd, 0x03924106, 0x031c2e94, 0x003b1a39}}}, + {X: Field{[10]uint32{0x006bb5f7, 0x00428fe9, 0x01e215a2, 0x03a49061, 0x015a890e, 0x01321350, 0x002856b0, 0x01d085dd, 0x021992f4, 0x001dd474}}, Y: Field{[10]uint32{0x03237fef, 0x00f19206, 0x01a2273a, 0x028532b1, 0x036371f6, 0x03da6305, 0x01327493, 0x0321b3b7, 0x01c5b770, 0x000a456a}}}, + {X: Field{[10]uint32{0x00f36a2d, 0x025ff2bb, 0x01737707, 0x02593847, 0x01e7b89c, 0x033d992c, 0x0382983e, 0x0270f881, 0x01a05b18, 0x000e6a12}}, Y: Field{[10]uint32{0x013690c5, 0x02d7b440, 0x01114f43, 0x014d53d0, 0x0148e692, 0x019a1625, 0x02274d15, 0x036c1af8, 0x00f16191, 0x0034f9be}}}, + {X: Field{[10]uint32{0x039b25bb, 0x0045f2f9, 0x01dea768, 0x00a2e2ff, 0x0080e3d6, 0x0104b59f, 0x0395522d, 0x03b483e7, 0x0125b29c, 0x0019f958}}, Y: Field{[10]uint32{0x0103da21, 0x01edc4a3, 0x0257f916, 0x033c19ba, 0x033c83ed, 0x0340b4a4, 0x020fd883, 0x008fd12a, 0x00157e3c, 0x0018237f}}}, + {X: Field{[10]uint32{0x038f1525, 0x008a6ded, 0x027bb5cb, 0x03bd4a4c, 0x02ecdd01, 0x02560e7d, 0x01eec20e, 0x0356774c, 0x02da02f7, 0x0002946b}}, Y: Field{[10]uint32{0x03847903, 0x0024b035, 0x02cdd1f0, 0x03420364, 0x036621c7, 0x031a062a, 0x038b18f4, 0x0218acf4, 0x03df93fb, 0x001c1259}}}, + {X: Field{[10]uint32{0x02c1745d, 0x019308da, 0x01e7aaae, 0x01bfed22, 0x01f8bcb3, 0x00ec00e2, 0x02b71b77, 0x032d1bd7, 0x013e73a1, 0x0032601a}}, Y: Field{[10]uint32{0x02fae474, 0x0330162d, 0x02bd4274, 0x03bc01c1, 0x00b3b21f, 0x03eee9ba, 0x01853e56, 0x01fbeddc, 0x008efe6b, 0x002fcee0}}}, + {X: Field{[10]uint32{0x021391a9, 0x01e8dd02, 0x007136b1, 0x034a5235, 0x0394167b, 0x025d7a7c, 0x0227aab2, 0x013070a3, 0x0130bcf5, 0x0031e37e}}, Y: Field{[10]uint32{0x004d9ae7, 0x023c378c, 0x01e5e031, 0x00886f19, 0x00163bfe, 0x020ef878, 0x03b5e9a2, 0x01e6f956, 0x03366d3a, 0x00269093}}}, + {X: Field{[10]uint32{0x01284089, 0x010bf11b, 0x016e5fb2, 0x039399cc, 0x00a998b1, 0x03dfc794, 0x0168ebc8, 0x03cea798, 0x03bcc6d2, 0x00269d7d}}, Y: Field{[10]uint32{0x03169e01, 0x03cc566f, 0x037bfd40, 0x030de1e5, 0x0239bf6e, 0x03f1f8d6, 0x0106c6e8, 0x02e6a8eb, 0x00e6dff8, 0x00032d1e}}}, + {X: Field{[10]uint32{0x036e6224, 0x02dc68e2, 0x001c0d20, 0x01f2dbe0, 0x007eba1e, 0x01739cf9, 0x008277d9, 0x02cf9f6d, 0x031adb0b, 0x001dac84}}, Y: Field{[10]uint32{0x0179263a, 0x034924a6, 0x007b2f79, 0x03e04831, 0x03196c5a, 0x034a1dcd, 0x01e36e6c, 0x03956c2a, 0x00daef60, 0x0000cb8f}}}, + {X: Field{[10]uint32{0x001384e1, 0x0290acd7, 0x01e68f32, 0x011b7ae3, 0x03cdcc4c, 0x036a2520, 0x01f96c93, 0x025c77d5, 0x03614ec5, 0x00086260}}, Y: Field{[10]uint32{0x026dac3e, 0x021ad7c4, 0x02c97d64, 0x012b6726, 0x01c5eda5, 0x01dda5d0, 0x02a2d224, 0x0254eac8, 0x005044a4, 0x000b0e5b}}}, + {X: Field{[10]uint32{0x03db8adc, 0x013e1d78, 0x002a9aa1, 0x029b3d76, 0x03a08449, 0x014a3fb2, 0x01dbe1ca, 0x00603440, 0x02494e9d, 0x002b02c2}}, Y: Field{[10]uint32{0x00412554, 0x03bf8f9c, 0x02dd9b2a, 0x027cc518, 0x00371dd1, 0x01a9aa3a, 0x0153b9c5, 0x02d60cb7, 0x001225a1, 0x0009b475}}}, + {X: Field{[10]uint32{0x00e04625, 0x029b09cc, 0x00a1b6dc, 0x0336efc1, 0x029d1a78, 0x017d65a8, 0x02d33297, 0x02997ef5, 0x018c0851, 0x003e1a6d}}, Y: Field{[10]uint32{0x02a5bff0, 0x02eaec31, 0x01b09c3c, 0x006ee2e4, 0x00a0cfb3, 0x00526527, 0x00b1603e, 0x0171cb06, 0x0344fc6f, 0x001037b8}}}, + {X: Field{[10]uint32{0x01544c3a, 0x01e35bae, 0x032aaecf, 0x00ea39f5, 0x01a640a4, 0x01cf18fb, 0x004a5f22, 0x00943e26, 0x02db2406, 0x003dd3c0}}, Y: Field{[10]uint32{0x0386185b, 0x02bd64f3, 0x02aea1c0, 0x01e87bba, 0x015e364f, 0x017caf3c, 0x03c1a618, 0x007a4a28, 0x026dcacc, 0x00220b8e}}}, + {X: Field{[10]uint32{0x027ea65d, 0x0250ea81, 0x0069ff3d, 0x01412dfa, 0x0288c390, 0x002a9a74, 0x03c9284a, 0x0157acba, 0x02b61d67, 0x0030184f}}, Y: Field{[10]uint32{0x03848cba, 0x0084f149, 0x02c09fe4, 0x006fc34d, 0x0129931c, 0x01764a27, 0x03a89665, 0x0320b92b, 0x02e527b5, 0x001cbd86}}}, + {X: Field{[10]uint32{0x031285db, 0x00e7c23c, 0x007a7eb7, 0x018d490c, 0x00ae0dbf, 0x0045ebac, 0x00fd8c47, 0x002298f0, 0x039860ba, 0x003ad9bf}}, Y: Field{[10]uint32{0x03ddc5d5, 0x01d456a1, 0x0261655c, 0x03cc1dd3, 0x027d3662, 0x03903d2e, 0x005dfb94, 0x03caba2c, 0x02ca54bc, 0x00030c50}}}, + {X: Field{[10]uint32{0x004a861d, 0x0145bc3b, 0x015b871a, 0x005455b0, 0x02e41c6b, 0x0294d180, 0x025d58bc, 0x018187f0, 0x00e6a125, 0x000e9c42}}, Y: Field{[10]uint32{0x004393a6, 0x00c1938f, 0x01226a18, 0x035d9b7c, 0x00957bfc, 0x005f9fa2, 0x011b5bec, 0x02aec806, 0x0102041c, 0x0036ab8b}}}, + {X: Field{[10]uint32{0x00f89d5f, 0x03a500ee, 0x00958949, 0x03cd39d1, 0x00ea1a2f, 0x02c817cb, 0x02e73717, 0x01a744cf, 0x0258c831, 0x00345f8e}}, Y: Field{[10]uint32{0x018b1a20, 0x01ffcc98, 0x010225ac, 0x02e60729, 0x012d75fc, 0x034574d2, 0x00ffafa6, 0x03662e48, 0x037d69e5, 0x002630d7}}}, + {X: Field{[10]uint32{0x03f6541c, 0x00daeac2, 0x01385fff, 0x0353dd9e, 0x0298caf6, 0x018638bf, 0x0350cbf2, 0x02e3b450, 0x0092cefb, 0x0035b8ca}}, Y: Field{[10]uint32{0x02636298, 0x0207af6c, 0x0021e080, 0x02f3b6f8, 0x00976196, 0x015bc926, 0x0072b553, 0x017b001e, 0x022ebe0f, 0x001c5d51}}}, + {X: Field{[10]uint32{0x02ffef75, 0x01777e02, 0x0229186d, 0x02ba4ea9, 0x0282ddc8, 0x00e3b001, 0x00e2182f, 0x0002b9ba, 0x01ff60e9, 0x000c6352}}, Y: Field{[10]uint32{0x026333b2, 0x02205981, 0x00831a98, 0x03aef8a2, 0x0008dcc3, 0x037daa9c, 0x02d4fd8f, 0x01853707, 0x0027dd7d, 0x001ba5fb}}}, + {X: Field{[10]uint32{0x00cf6346, 0x03e05126, 0x0367c5a2, 0x00ada35b, 0x01c075e7, 0x01616aef, 0x00ea5aeb, 0x036e2e9a, 0x02301772, 0x003f5be7}}, Y: Field{[10]uint32{0x0128d2c0, 0x03aace07, 0x001254d4, 0x00c2abfd, 0x02d76082, 0x01610d55, 0x01c5f513, 0x016f5729, 0x02e76477, 0x0036b745}}}, + {X: Field{[10]uint32{0x002ddd36, 0x02b90e86, 0x00d31566, 0x00aba558, 0x00f07428, 0x02f39da3, 0x00ed08d4, 0x011d86a4, 0x0338a2c7, 0x0023f896}}, Y: Field{[10]uint32{0x024c23a2, 0x0386a087, 0x015c73f8, 0x010c9c74, 0x0251d668, 0x03ef7f8b, 0x00da1b32, 0x02ade28b, 0x004a77c6, 0x001bb87a}}}, + {X: Field{[10]uint32{0x0393bef8, 0x03fae665, 0x03e5d2e6, 0x02ca91b5, 0x013e12ba, 0x01afee05, 0x0217bcff, 0x023fbd2b, 0x02d288ed, 0x000df3c3}}, Y: Field{[10]uint32{0x03e3e0d3, 0x02851b6e, 0x03339119, 0x01ec85e4, 0x00e17a41, 0x036d709e, 0x01254f4d, 0x001d4726, 0x025718eb, 0x00024b9e}}}, + {X: Field{[10]uint32{0x03bf403c, 0x01611081, 0x011e0091, 0x013d4c7b, 0x00eca0e0, 0x0180003a, 0x01eb812b, 0x034321db, 0x006106b9, 0x001a2308}}, Y: Field{[10]uint32{0x00cc01fe, 0x01fac517, 0x035bda8b, 0x020fcb3a, 0x00011d85, 0x008802f7, 0x0112e763, 0x01354f7d, 0x02ba41ba, 0x002ead2c}}}, + {X: Field{[10]uint32{0x00b3d804, 0x020e569c, 0x004e9d86, 0x0213626a, 0x02d1b535, 0x00e59485, 0x022371d6, 0x0254d760, 0x02aaf539, 0x0012d32a}}, Y: Field{[10]uint32{0x01ee73d2, 0x01ef5014, 0x0070ae4c, 0x02444571, 0x02652fbd, 0x01d8793a, 0x001d0437, 0x001268ec, 0x03afcd18, 0x000f7749}}}, + {X: Field{[10]uint32{0x02fa1d2e, 0x013754b8, 0x00e56144, 0x02609388, 0x0347cca3, 0x022ce6d7, 0x00ed9a51, 0x036981d6, 0x03c44135, 0x001bd6b2}}, Y: Field{[10]uint32{0x02cd58c4, 0x0134df12, 0x02569052, 0x035ccd7e, 0x02f729f1, 0x00bc65e8, 0x02f2efc0, 0x03653522, 0x0146e5f6, 0x00017727}}}, + {X: Field{[10]uint32{0x0267fc42, 0x010c4f70, 0x008c6ce9, 0x008dce0a, 0x02661d6f, 0x022dad88, 0x01a527bf, 0x032e45bf, 0x00493dff, 0x001e74b5}}, Y: Field{[10]uint32{0x020c08db, 0x0017cdc2, 0x01de1d28, 0x0247575b, 0x038d9027, 0x03ef2454, 0x0302823d, 0x03dff2f8, 0x03f13fa8, 0x002c9a0e}}}, + {X: Field{[10]uint32{0x01f95524, 0x0002ccfe, 0x00118c08, 0x02f00860, 0x01f3915d, 0x03319f50, 0x037a6b07, 0x01ee7271, 0x007e246b, 0x000cea3a}}, Y: Field{[10]uint32{0x0116ff8f, 0x00d0cce7, 0x0229470b, 0x03bf736c, 0x01207d30, 0x00b97116, 0x015e36be, 0x03417c99, 0x004c584f, 0x002eaa09}}}, + {X: Field{[10]uint32{0x01868e95, 0x036aae9e, 0x03a193f4, 0x02c83ee9, 0x013235dd, 0x012f5518, 0x0161a7ae, 0x01f7e081, 0x0132f388, 0x002685a4}}, Y: Field{[10]uint32{0x00630bcd, 0x02408a51, 0x03bc0719, 0x000397e2, 0x02a233b1, 0x02a59656, 0x01452161, 0x011b110a, 0x03179954, 0x001a1bf0}}}, + {X: Field{[10]uint32{0x0383ac42, 0x01184121, 0x026fc290, 0x0278b297, 0x01c85998, 0x010e7cbd, 0x03dc7e90, 0x0338fe6a, 0x00f48405, 0x001e42dd}}, Y: Field{[10]uint32{0x0224a701, 0x02cc12e2, 0x028a66eb, 0x00aec6a4, 0x011dc676, 0x01c44697, 0x00593a37, 0x02172a64, 0x01135623, 0x00225872}}}, + {X: Field{[10]uint32{0x02f9e49c, 0x021ea8dc, 0x02438b54, 0x0217d493, 0x02954717, 0x03ccbf35, 0x00aaeb69, 0x030b661f, 0x00cfae1f, 0x0038a8f4}}, Y: Field{[10]uint32{0x00c93046, 0x00b4cdc5, 0x008db498, 0x000e63ed, 0x0211f7dc, 0x00233914, 0x03edb543, 0x01c230d5, 0x0205ecf2, 0x00273090}}}, + {X: Field{[10]uint32{0x020bcbea, 0x03087b25, 0x03a7a2b3, 0x00f98f8e, 0x00cfd265, 0x01bcab9a, 0x01372b19, 0x030655db, 0x00435992, 0x00032cc3}}, Y: Field{[10]uint32{0x01ccd0b4, 0x01f374e2, 0x0083d498, 0x016099a9, 0x02fb6830, 0x02d246e2, 0x009cba14, 0x00e326b3, 0x01b97083, 0x003d95cd}}}, + {X: Field{[10]uint32{0x00e8b46a, 0x0090e044, 0x01d2dfe9, 0x01adf265, 0x03296ca6, 0x03ecf9a8, 0x018ffb16, 0x002fb98a, 0x0095d631, 0x0007ebb7}}, Y: Field{[10]uint32{0x00725089, 0x02f493ee, 0x012cee7b, 0x03391097, 0x0226d9f0, 0x02f62dd9, 0x0378d032, 0x03a41394, 0x023f8201, 0x000d40e7}}}, + {X: Field{[10]uint32{0x02b3e8f9, 0x031d42d4, 0x03f318f6, 0x014c78a2, 0x018e93ea, 0x03546cfd, 0x005410ce, 0x030744fc, 0x035a2be8, 0x002991b3}}, Y: Field{[10]uint32{0x00c102bb, 0x03d19429, 0x029bda01, 0x03911950, 0x01e427d7, 0x00794744, 0x03a7e78e, 0x02a482d1, 0x02cb7727, 0x00163163}}}, + {X: Field{[10]uint32{0x02be2205, 0x02f00837, 0x02d39dce, 0x031857b7, 0x011c77c0, 0x01730c8b, 0x038c397a, 0x01f4e3a6, 0x03271853, 0x000c9cd1}}, Y: Field{[10]uint32{0x01a42d65, 0x00092402, 0x032bb72c, 0x012f0f94, 0x01c1ea78, 0x011d69f5, 0x007b072d, 0x03d82f53, 0x008958c3, 0x0030b7af}}}, + {X: Field{[10]uint32{0x0172827e, 0x00bce4f5, 0x03f4d4ce, 0x008b9f6c, 0x009906dd, 0x024c289c, 0x028c095d, 0x02884b01, 0x03180855, 0x0005a869}}, Y: Field{[10]uint32{0x0115605c, 0x01adc934, 0x00660219, 0x005aa2dd, 0x01b1ef30, 0x02fa3df7, 0x0280335c, 0x02a7adb3, 0x024bb30b, 0x0034e275}}}, + {X: Field{[10]uint32{0x03687596, 0x02bd33c8, 0x002e9a61, 0x03e129d0, 0x00eeb1eb, 0x01859ba4, 0x0294b867, 0x0155c4cd, 0x01145de2, 0x002d2fd3}}, Y: Field{[10]uint32{0x03d11242, 0x00bf046e, 0x023dbfac, 0x0186962b, 0x0237d389, 0x02d817a5, 0x018640a6, 0x025f958c, 0x00a4d823, 0x001276c8}}}, + {X: Field{[10]uint32{0x03892630, 0x019ee6c2, 0x0164bbf3, 0x004fa42a, 0x03fc3114, 0x0364e032, 0x00a0de08, 0x01997906, 0x03a9ccf4, 0x00353b59}}, Y: Field{[10]uint32{0x011df131, 0x0017462d, 0x015fa371, 0x01dd86c1, 0x0007472b, 0x00924dd9, 0x028a9729, 0x00220c7f, 0x017ce79a, 0x0023fdf9}}}, + {X: Field{[10]uint32{0x014fe70d, 0x03c7d1fd, 0x01366b32, 0x0373e45b, 0x0044d5df, 0x03070b29, 0x02e906f0, 0x00fbc83a, 0x02f19f41, 0x0022b495}}, Y: Field{[10]uint32{0x02d34da7, 0x0090fb69, 0x02ff494e, 0x01783497, 0x0134778f, 0x00725c86, 0x0147f659, 0x01371609, 0x03418d2c, 0x002f7bba}}}, + {X: Field{[10]uint32{0x01f17f8e, 0x018a854c, 0x0362f07f, 0x03b887c7, 0x01c67d22, 0x029561ee, 0x03723e01, 0x02d7c7c4, 0x02fafe55, 0x002374f8}}, Y: Field{[10]uint32{0x03c88cb0, 0x02fe4fd7, 0x0160b4b4, 0x0072e99a, 0x028f2db4, 0x036711b1, 0x017c6b65, 0x01c5f957, 0x02a47d6b, 0x002a88f4}}}, + {X: Field{[10]uint32{0x00b3d0f6, 0x01de9741, 0x01a678e5, 0x005d5536, 0x0103c139, 0x01ec3a4e, 0x034db01a, 0x00c2beb0, 0x02282a8e, 0x00113f67}}, Y: Field{[10]uint32{0x011a61d0, 0x003305a4, 0x0290e484, 0x001b32c4, 0x0218927d, 0x0256f6f8, 0x0269d592, 0x0066ce85, 0x00613533, 0x0032c1e4}}}, + {X: Field{[10]uint32{0x00b7aa42, 0x02c69c62, 0x02477746, 0x03d39691, 0x022db7c9, 0x025917d1, 0x01d2aa9c, 0x03b5960c, 0x02024464, 0x00174926}}, Y: Field{[10]uint32{0x037281d0, 0x03e2c501, 0x01a12b54, 0x03efca53, 0x0023bb8d, 0x0022d348, 0x0195f80e, 0x01ad70b1, 0x0386527d, 0x000affdc}}}, + {X: Field{[10]uint32{0x0210fb23, 0x0311f203, 0x008ca85a, 0x01502e50, 0x01ddd18b, 0x02247120, 0x01e123cd, 0x03547519, 0x00581edc, 0x003663ad}}, Y: Field{[10]uint32{0x00b4dcf2, 0x033086de, 0x010816a2, 0x005c6c99, 0x032b1537, 0x03c95326, 0x031f9e60, 0x01ab1bcb, 0x03bed375, 0x00056ff4}}}, + {X: Field{[10]uint32{0x00db6082, 0x02013591, 0x02eb5876, 0x01ba759c, 0x036edb48, 0x03a14543, 0x032134d2, 0x02bad884, 0x036919a2, 0x000bc4b0}}, Y: Field{[10]uint32{0x038cf73b, 0x004cf15f, 0x02dd0827, 0x031ef6a0, 0x0320834d, 0x030af438, 0x01264b8d, 0x00a313b7, 0x02dd3b4d, 0x00300447}}}, + {X: Field{[10]uint32{0x004b4624, 0x0005f0c5, 0x023e6f03, 0x00d23c1f, 0x02713260, 0x02f395ea, 0x01d35dfe, 0x0327e108, 0x02847099, 0x00136525}}, Y: Field{[10]uint32{0x01b673da, 0x02c7fff7, 0x02adb126, 0x0136c60b, 0x00b91f95, 0x022c1f68, 0x01b308fb, 0x01a71ca3, 0x0257d713, 0x0026bed6}}}, + {X: Field{[10]uint32{0x02af2466, 0x01a1c038, 0x008b2a97, 0x00936777, 0x020fca8f, 0x014aac5f, 0x020b39a7, 0x03c7238d, 0x01105e95, 0x0033c76e}}, Y: Field{[10]uint32{0x0247ca5f, 0x02371cfd, 0x020040ad, 0x029ecf4b, 0x015e645c, 0x02e59006, 0x001b94b4, 0x0219d29b, 0x0366c49c, 0x0039f267}}}, + {X: Field{[10]uint32{0x02a62b85, 0x0390a11a, 0x03f22a9e, 0x01fc16c9, 0x01d4b174, 0x00b19d61, 0x01d63a24, 0x03ea2ade, 0x00257d2f, 0x0039c7ad}}, Y: Field{[10]uint32{0x022c8865, 0x03d9099a, 0x033c3d10, 0x01e61c38, 0x023bc0a7, 0x0294f8d0, 0x0321f45d, 0x028dd9f5, 0x02ecf901, 0x002a41ab}}}, + {X: Field{[10]uint32{0x00559887, 0x0220aacc, 0x03b218f9, 0x01b289fa, 0x0321c58b, 0x0128a66f, 0x005c3e1b, 0x01d7d0ef, 0x03d30b25, 0x002f3661}}, Y: Field{[10]uint32{0x01483f65, 0x03a6ce87, 0x01b00761, 0x01324a27, 0x00690c1b, 0x018e93ad, 0x02fd894e, 0x02b89cae, 0x00c94339, 0x00100e01}}}, + {X: Field{[10]uint32{0x01f8cab0, 0x031f8d2c, 0x00042ea9, 0x02e9a559, 0x007a2beb, 0x029a7dd0, 0x01d2d5e8, 0x01c588e5, 0x00f748af, 0x002dd357}}, Y: Field{[10]uint32{0x0049b336, 0x015f7afa, 0x00a3ea3c, 0x02a9f73f, 0x035728df, 0x02be9150, 0x01e9a234, 0x03ed660d, 0x01db332b, 0x002d717f}}}, + {X: Field{[10]uint32{0x0160837d, 0x0146dc8d, 0x03edc572, 0x03b98cec, 0x01e9bc12, 0x02482faa, 0x03b3b13a, 0x0326b869, 0x02f59835, 0x0011bcf7}}, Y: Field{[10]uint32{0x010ce67b, 0x014f9a05, 0x02eca91d, 0x007040d7, 0x00818fb7, 0x01c0853b, 0x02a69778, 0x02e72cde, 0x021f2e8e, 0x00161ecb}}}, + {X: Field{[10]uint32{0x0267d572, 0x0133eddd, 0x018b6577, 0x02906457, 0x01a50ceb, 0x02ed80a6, 0x011f4d7c, 0x0025a379, 0x00fdeb3f, 0x00234d06}}, Y: Field{[10]uint32{0x00661db8, 0x014456ab, 0x022039d0, 0x00e03d2c, 0x03e8b3dd, 0x03d9ed31, 0x01da7c00, 0x02118aaa, 0x011016a2, 0x0033b9e6}}}, + {X: Field{[10]uint32{0x016f7c10, 0x033c84ab, 0x03bcf529, 0x01ede193, 0x0230f432, 0x02d9c94e, 0x020a672e, 0x01a575e2, 0x03094510, 0x002632c3}}, Y: Field{[10]uint32{0x020ab333, 0x0355abca, 0x0132f09f, 0x01d69af5, 0x03300fde, 0x00a14b47, 0x007e9b55, 0x0140d66d, 0x01ac4e1b, 0x0009654b}}}, + {X: Field{[10]uint32{0x0339a3cf, 0x02e6384a, 0x00effb58, 0x0132c0c3, 0x01a34c7c, 0x000f7841, 0x01383f3f, 0x01d7f129, 0x024c0ca0, 0x00258117}}, Y: Field{[10]uint32{0x0201bafe, 0x03548c5c, 0x00c6e8f2, 0x038e9412, 0x016ebd03, 0x02f577fb, 0x011f24f7, 0x010546e8, 0x00fd9223, 0x003d49ee}}}, + {X: Field{[10]uint32{0x01cc6030, 0x02fd5aa6, 0x0293e703, 0x03956642, 0x01c3f4b3, 0x035de5d8, 0x0226a9ca, 0x037be32e, 0x009142ad, 0x003c98ba}}, Y: Field{[10]uint32{0x030b594b, 0x00c8635b, 0x01ca1d1f, 0x02dcce4e, 0x035382c7, 0x0024bb3f, 0x0197dd67, 0x01aa403d, 0x036486c8, 0x0009d731}}}, + {X: Field{[10]uint32{0x016d17fe, 0x01c5f6c5, 0x016347cc, 0x0204f1b1, 0x03ad75ef, 0x03946eca, 0x01f7900b, 0x014cd97e, 0x0002ee17, 0x000335e7}}, Y: Field{[10]uint32{0x007a985d, 0x00000c65, 0x0394ac45, 0x023ad245, 0x014ff919, 0x01aaeeb8, 0x03260441, 0x0396f694, 0x00ffb30d, 0x002d7afa}}}, + {X: Field{[10]uint32{0x00f858f4, 0x00897e52, 0x009d280a, 0x00a73147, 0x02d9ba46, 0x018c20c2, 0x0122e03e, 0x01037780, 0x03225b1d, 0x000a2d2f}}, Y: Field{[10]uint32{0x00f3cac0, 0x00db894b, 0x027954ea, 0x03f2c439, 0x03aadf4f, 0x00c00a5e, 0x0134c6be, 0x01053529, 0x018998bb, 0x00091d58}}}, + {X: Field{[10]uint32{0x02ed2ff7, 0x02119731, 0x03ea016c, 0x00db1ec2, 0x03cc765c, 0x0184a297, 0x013344bc, 0x0177ce71, 0x02067dd5, 0x003c063c}}, Y: Field{[10]uint32{0x00aa7e66, 0x02803e39, 0x0261a960, 0x01da1b15, 0x00cda34a, 0x01454133, 0x02c1cd22, 0x02752b19, 0x02b2cd61, 0x00367f16}}}, + {X: Field{[10]uint32{0x024a7a13, 0x03621b10, 0x0394218e, 0x03c5222c, 0x027f661e, 0x03d1f2f6, 0x01dd5c74, 0x01b40a69, 0x00cf0808, 0x00125a5a}}, Y: Field{[10]uint32{0x021874e7, 0x012de1c7, 0x022dfc8d, 0x00909dd3, 0x00360b51, 0x01e71980, 0x017a3635, 0x0183803c, 0x03984420, 0x0035f637}}}, + {X: Field{[10]uint32{0x02efedab, 0x00405ac8, 0x03949892, 0x01728741, 0x03b98435, 0x00d80369, 0x02485749, 0x00eddda3, 0x0059e911, 0x00090b53}}, Y: Field{[10]uint32{0x020f42b1, 0x022de59e, 0x0257727a, 0x0081ac2b, 0x0342f509, 0x014155ce, 0x0228074a, 0x030bb58e, 0x03d7b0c8, 0x0011c373}}}, + {X: Field{[10]uint32{0x0385e8c7, 0x003d3744, 0x015861d2, 0x02f356ac, 0x03466280, 0x01794143, 0x004afacc, 0x01674e13, 0x00cc1a1a, 0x002dae01}}, Y: Field{[10]uint32{0x0121d439, 0x01e62ed9, 0x02d0c898, 0x019c2ec9, 0x0139b579, 0x00a0a7d0, 0x022a1d23, 0x00daa66e, 0x034602a6, 0x000bde24}}}, + {X: Field{[10]uint32{0x01918a4e, 0x02d26dc7, 0x011ca0d1, 0x00b4a931, 0x0346904b, 0x00a04092, 0x038048af, 0x017f74e2, 0x03d07ecc, 0x00370c28}}, Y: Field{[10]uint32{0x018cc917, 0x014469b0, 0x0110febb, 0x02d9e29f, 0x02b701f7, 0x024da952, 0x03536987, 0x003a5d63, 0x01b07055, 0x000c9902}}}, + {X: Field{[10]uint32{0x03d3fab8, 0x0057cad0, 0x013c20c0, 0x00d25de0, 0x005fb229, 0x03d3d12b, 0x02bb6280, 0x03ccc20e, 0x034d345b, 0x00387f90}}, Y: Field{[10]uint32{0x034c4d83, 0x0256c1dd, 0x03f7a59a, 0x00b0b735, 0x03d3b31b, 0x038f4581, 0x008df48c, 0x025eb130, 0x00a52af8, 0x0006c947}}}, + {X: Field{[10]uint32{0x02fb8d08, 0x03f5745d, 0x02060bd1, 0x004f3f5c, 0x0182c2f5, 0x039dd591, 0x03e4a40e, 0x03178abe, 0x00dae08a, 0x002a3b62}}, Y: Field{[10]uint32{0x00175729, 0x007e7ce1, 0x0081b77b, 0x023c74a5, 0x035cc2d9, 0x005eca9b, 0x02f5b537, 0x0258c3ee, 0x00b07441, 0x003d3ed8}}}, + {X: Field{[10]uint32{0x007c6481, 0x0295e40b, 0x0143f76f, 0x004e8389, 0x008e7707, 0x0314348a, 0x01c083ee, 0x02735f25, 0x0028de1e, 0x002d4b3e}}, Y: Field{[10]uint32{0x0375790f, 0x017abdc6, 0x02d833c9, 0x0314dd23, 0x0343eebd, 0x00f8ed4a, 0x03dc729d, 0x03eefe40, 0x01530046, 0x0018d68e}}}, + {X: Field{[10]uint32{0x021d5e83, 0x01e0a485, 0x0178e4dc, 0x015358d2, 0x00b1297c, 0x02ab64ff, 0x03957a94, 0x026ff732, 0x01aef76d, 0x001c081e}}, Y: Field{[10]uint32{0x02783b52, 0x00419096, 0x01f82c8c, 0x011712e5, 0x0132a43a, 0x0031b76e, 0x033a202e, 0x00714b4e, 0x008bf2d8, 0x001260f0}}}, + {X: Field{[10]uint32{0x0257bbf5, 0x00fb8baf, 0x009a0dd7, 0x02e544f3, 0x023ed3dc, 0x02d0de38, 0x00fe8cbd, 0x03873bbd, 0x00d18e9d, 0x00118e35}}, Y: Field{[10]uint32{0x0327e110, 0x01fbc832, 0x01e87cf7, 0x01029654, 0x020cb507, 0x007e8daf, 0x00853f75, 0x00c19a5a, 0x003245cc, 0x001587b8}}}, + {X: Field{[10]uint32{0x03386bfc, 0x02c8b64e, 0x039cbecf, 0x02024410, 0x01d98e48, 0x00f4280e, 0x021dc5ee, 0x02b77b55, 0x02b75fac, 0x003bacd3}}, Y: Field{[10]uint32{0x02e57c4c, 0x0308d269, 0x00af4c21, 0x00eb473d, 0x00e9d8f6, 0x030c46a5, 0x018db8c1, 0x03723015, 0x00ff05eb, 0x003cac8f}}}, + {X: Field{[10]uint32{0x012c45ca, 0x01a167b1, 0x0175e5c5, 0x0190f7dd, 0x01f70a8c, 0x03efa38e, 0x0107df0c, 0x00c84f07, 0x02e5becf, 0x0001fcb1}}, Y: Field{[10]uint32{0x02b6c89d, 0x03903788, 0x0189a77b, 0x03bac847, 0x02cf9d66, 0x03614794, 0x01a04248, 0x0276b83f, 0x01c01971, 0x00254126}}}, + {X: Field{[10]uint32{0x03e53647, 0x008cc0c8, 0x00f81856, 0x003daa54, 0x023cea09, 0x013e2c05, 0x0211064d, 0x0349f3df, 0x03221ec5, 0x001bb1d9}}, Y: Field{[10]uint32{0x0269a3d6, 0x02c5c0eb, 0x01254984, 0x02816b5d, 0x01d0aa7b, 0x0018f13f, 0x02ec7d0f, 0x03a0e723, 0x03579704, 0x0026c0f1}}}, + {X: Field{[10]uint32{0x024dea7e, 0x027e2914, 0x02f5499e, 0x01eb16ca, 0x01b44a70, 0x01e3d9f3, 0x03184b03, 0x017b2807, 0x029d320d, 0x00263dbd}}, Y: Field{[10]uint32{0x02b69a02, 0x03d509bc, 0x0244d79e, 0x0375e324, 0x02ca54a3, 0x015af0ce, 0x01333fe0, 0x01d98e5e, 0x033d7b03, 0x0009bbda}}}, + {X: Field{[10]uint32{0x0347e390, 0x0073c156, 0x017af296, 0x01a0b67b, 0x012d3086, 0x03005c32, 0x037ac998, 0x00b1d975, 0x004558b8, 0x0033c7bd}}, Y: Field{[10]uint32{0x018511c3, 0x037d1192, 0x03d23bef, 0x0360d8e5, 0x00f4345b, 0x016bfbfa, 0x022d8f3f, 0x003b1e1d, 0x0105fb88, 0x0022f307}}}, + {X: Field{[10]uint32{0x006f07e8, 0x00a02863, 0x035aa37c, 0x02096821, 0x009ab62b, 0x01653cde, 0x00cc5c10, 0x01bcbbe2, 0x0251efa2, 0x00043805}}, Y: Field{[10]uint32{0x01779df2, 0x03540fae, 0x00c0a8fa, 0x028c1f8a, 0x0083105d, 0x0222aaa6, 0x03b2cdb7, 0x018cd4c3, 0x01e11f77, 0x000b9a85}}}, + {X: Field{[10]uint32{0x013eee4a, 0x009e59ba, 0x01a58054, 0x0114482e, 0x000af909, 0x01260c4c, 0x03d77d74, 0x00826dbb, 0x03e041ce, 0x002e538b}}, Y: Field{[10]uint32{0x01bca443, 0x01c50b72, 0x020f01d0, 0x02349dda, 0x01a86bfb, 0x011b7c43, 0x00b1dde7, 0x024bd577, 0x03f1103e, 0x00023dea}}}, + {X: Field{[10]uint32{0x02d41154, 0x0174acc5, 0x02ccc122, 0x00d385fc, 0x026d71cc, 0x011362bd, 0x01d233e2, 0x02a7a851, 0x0102c671, 0x0033e79f}}, Y: Field{[10]uint32{0x012d2ca7, 0x03bfe143, 0x00c4ee13, 0x02ef86d8, 0x01a853e2, 0x021e3e5a, 0x003858a3, 0x0259beef, 0x00a10f0b, 0x0020bbae}}}, + {X: Field{[10]uint32{0x03d48bb2, 0x00e6bfd2, 0x034366d5, 0x00af814b, 0x00df8e4f, 0x033d2e4d, 0x01d18ebd, 0x00ee44c6, 0x002994ad, 0x00368e8f}}, Y: Field{[10]uint32{0x01dc0193, 0x01a6a474, 0x00f54256, 0x03b7db6d, 0x035e0d32, 0x03b21998, 0x01ccfe7b, 0x0091e20c, 0x0253c404, 0x000a3e75}}}, + {X: Field{[10]uint32{0x01eec101, 0x0289ec3c, 0x02450d4b, 0x03274394, 0x00a0a095, 0x00a0c7cc, 0x014c9fcd, 0x00de2f64, 0x00182b80, 0x002ae04a}}, Y: Field{[10]uint32{0x026666b3, 0x01351780, 0x0078f142, 0x00ab7030, 0x022286dc, 0x02ec7602, 0x00e366af, 0x01db58f7, 0x01822748, 0x00016af1}}}, + {X: Field{[10]uint32{0x01c4977a, 0x01023df9, 0x014ab831, 0x019fe37e, 0x03f0edd9, 0x00259714, 0x0164391c, 0x032a9757, 0x02a2bf02, 0x003a96e0}}, Y: Field{[10]uint32{0x033d9339, 0x022f3a3f, 0x02cac5d2, 0x00fa25f6, 0x022518d5, 0x01ee2239, 0x01dd5040, 0x0020deb3, 0x02990f32, 0x00207fa0}}}, + {X: Field{[10]uint32{0x03e70fa2, 0x02e3ef3e, 0x00d2ca95, 0x0305f7d6, 0x01318aea, 0x00f68b4a, 0x01d618be, 0x0075f40f, 0x000bab20, 0x00141817}}, Y: Field{[10]uint32{0x02a60383, 0x03ce5f5c, 0x028afc03, 0x03f1b0a9, 0x02d4c978, 0x024a335b, 0x02cc160d, 0x015a4f13, 0x031e007b, 0x00003942}}}, + {X: Field{[10]uint32{0x021191dd, 0x0162c97a, 0x0316831b, 0x0184422d, 0x02513566, 0x0153de6d, 0x01409d88, 0x032b3bd1, 0x00b66d7d, 0x003ddb14}}, Y: Field{[10]uint32{0x01f3cc72, 0x0346041b, 0x01f86d3b, 0x0121dc83, 0x03a30401, 0x025fc1ec, 0x00e2e93a, 0x014502f0, 0x0374b019, 0x001f4156}}}, + {X: Field{[10]uint32{0x03260e7d, 0x00f65664, 0x01b32f6d, 0x0240af5e, 0x01413126, 0x01cb9384, 0x02367db2, 0x0011f330, 0x03bad716, 0x00379414}}, Y: Field{[10]uint32{0x017cc7e2, 0x00e37872, 0x03bf3d3f, 0x02041444, 0x03b1e4c5, 0x017d180c, 0x02b61b5b, 0x02c36c37, 0x02d39c34, 0x00071528}}}, + {X: Field{[10]uint32{0x0206499d, 0x03df237e, 0x017121af, 0x00902527, 0x00437f1a, 0x03786395, 0x018a332b, 0x0251ac6e, 0x019f180e, 0x002b4f9c}}, Y: Field{[10]uint32{0x02f1b554, 0x032b4f80, 0x032c882b, 0x037df28b, 0x03ef310a, 0x02fb7018, 0x0073863a, 0x02935f49, 0x03f1390f, 0x002d1635}}}, + {X: Field{[10]uint32{0x036bae4b, 0x03210330, 0x026ecb46, 0x039db899, 0x01839a3a, 0x00cbe2de, 0x010c8673, 0x02bdad8c, 0x02345560, 0x0009c280}}, Y: Field{[10]uint32{0x02bedeaf, 0x005a8653, 0x01bc689d, 0x01c86f6d, 0x01ef7ef0, 0x02661de8, 0x020f1600, 0x01f45832, 0x004b9215, 0x00236aae}}}, + {X: Field{[10]uint32{0x00624621, 0x00cd3b9a, 0x02d30f98, 0x016cafdc, 0x0325ba2b, 0x012a13fd, 0x03ffdb29, 0x03271321, 0x017e3027, 0x003ad7b4}}, Y: Field{[10]uint32{0x0060a942, 0x012d3b02, 0x003ae3b5, 0x02ff5667, 0x03df4a91, 0x013186b4, 0x028d1a21, 0x0351c66f, 0x00b38f74, 0x000e7fff}}}, + {X: Field{[10]uint32{0x00e0a5dd, 0x0304d70b, 0x02d6a7ba, 0x00869d5c, 0x01fb1f66, 0x016b351a, 0x03f4e807, 0x02633188, 0x01f28a0b, 0x002e7047}}, Y: Field{[10]uint32{0x00a76278, 0x03b15150, 0x00a1e391, 0x028938bf, 0x015eb506, 0x024aceea, 0x03eb0c36, 0x0257bcc9, 0x0278d42b, 0x0016fea2}}}, + {X: Field{[10]uint32{0x03e74b5c, 0x018c433a, 0x0221ca8a, 0x0264f126, 0x00f60f13, 0x03b68102, 0x02611066, 0x038967f9, 0x004380ab, 0x003bb45c}}, Y: Field{[10]uint32{0x02a0d750, 0x03576dc8, 0x0324a567, 0x018594b0, 0x028cc2c6, 0x01ebf366, 0x02a243f5, 0x01ee4458, 0x0276cbe3, 0x001b72d8}}}, + {X: Field{[10]uint32{0x03aa97a7, 0x01400314, 0x034c2526, 0x00417b8d, 0x028c68e3, 0x02b7d8ad, 0x025524a4, 0x0273d1a3, 0x036f5f5b, 0x002392c3}}, Y: Field{[10]uint32{0x01b7f74a, 0x004dfb30, 0x00d56e25, 0x00b455f0, 0x02c7e59f, 0x0341063d, 0x00578c16, 0x000646dd, 0x00aec18d, 0x00347e20}}}, + {X: Field{[10]uint32{0x02a5ebbe, 0x03d67232, 0x0176e90c, 0x036848e3, 0x01a7f393, 0x00c44ac7, 0x005ce9c9, 0x025ae6ba, 0x01bdfc65, 0x001deb88}}, Y: Field{[10]uint32{0x034a21d1, 0x01b151ff, 0x02f9b910, 0x005cc81b, 0x03516947, 0x01ca4553, 0x0225390e, 0x019b37d1, 0x01811e32, 0x003d1211}}}, + {X: Field{[10]uint32{0x03d2346f, 0x035ac1f6, 0x03999e16, 0x00cfc140, 0x01929225, 0x01419899, 0x028bd35f, 0x00bbd166, 0x00a871c0, 0x00074de7}}, Y: Field{[10]uint32{0x0140cad0, 0x002ddc90, 0x011c10d5, 0x01785e36, 0x00a6333d, 0x006571c1, 0x0197cfed, 0x0269ed08, 0x039a7289, 0x00301542}}}, + {X: Field{[10]uint32{0x03ef1ccc, 0x0359c30f, 0x00296cba, 0x0085f51f, 0x025c7ea7, 0x03c09dca, 0x03671995, 0x005aba64, 0x03f328fc, 0x00189405}}, Y: Field{[10]uint32{0x00450603, 0x0269d359, 0x02bf3618, 0x001985f0, 0x02d7056d, 0x0004437d, 0x03eb4ac5, 0x00853fb6, 0x0253af3b, 0x0006d138}}}, + {X: Field{[10]uint32{0x0238412d, 0x029cae01, 0x01eb78ea, 0x0059d029, 0x00d1019d, 0x010e1dfa, 0x023f508d, 0x00d424eb, 0x02496bdc, 0x0031e93f}}, Y: Field{[10]uint32{0x020febef, 0x02a5d125, 0x016fba30, 0x022d9d66, 0x01673093, 0x012e3dcd, 0x03924067, 0x01c4c3a1, 0x02a895fb, 0x0006d6c4}}}, + {X: Field{[10]uint32{0x02441d3f, 0x00a0d22c, 0x0052fa56, 0x019add3c, 0x01b65c61, 0x03123102, 0x000102cb, 0x0313bcfa, 0x003ce8f9, 0x0033fe7e}}, Y: Field{[10]uint32{0x0352ee6f, 0x038cb378, 0x0252e338, 0x001ea2f4, 0x02814ceb, 0x035a5cfc, 0x0046a41e, 0x0081fbf2, 0x00f82180, 0x00133106}}}, + {X: Field{[10]uint32{0x02700541, 0x0011c859, 0x02ef82c6, 0x0395eb79, 0x002fd23a, 0x027a8477, 0x038ae98a, 0x030a5724, 0x031045b8, 0x0021009d}}, Y: Field{[10]uint32{0x001e4f99, 0x0381c8e1, 0x01da5f56, 0x033502c5, 0x03f3f80d, 0x02ea0753, 0x01b972ce, 0x00501220, 0x0192d3c1, 0x001ca519}}}, + {X: Field{[10]uint32{0x012e0d2c, 0x01c18503, 0x004afb5c, 0x013aa53e, 0x015e304a, 0x023d548b, 0x01a346bd, 0x02e7b018, 0x0330e00c, 0x003deac4}}, Y: Field{[10]uint32{0x035e6144, 0x004406f7, 0x02f866bb, 0x028e7753, 0x012ef0f6, 0x03cfcf5a, 0x018def46, 0x002952bd, 0x00518935, 0x001752b2}}}, + {X: Field{[10]uint32{0x03d4e618, 0x0062131b, 0x0292c785, 0x037304fd, 0x01d0da4d, 0x021b260a, 0x01a4d5b7, 0x02dde230, 0x02192303, 0x0029f213}}, Y: Field{[10]uint32{0x031774fe, 0x02e915ae, 0x01744939, 0x00cea0a7, 0x01659285, 0x0178fc45, 0x0164bad3, 0x036cbc87, 0x025b8fc2, 0x0015b8cb}}}, + {X: Field{[10]uint32{0x0098c43a, 0x0276036b, 0x00dccf19, 0x00e41fd7, 0x02c65f41, 0x0299de9c, 0x03bc55af, 0x036b00d8, 0x0084a680, 0x002e2c32}}, Y: Field{[10]uint32{0x016b8127, 0x0239c794, 0x03932d0f, 0x01e98976, 0x016569f8, 0x013b6c11, 0x02bec5ba, 0x001b0735, 0x008ac926, 0x0010f906}}}, + {X: Field{[10]uint32{0x025e0df6, 0x014120a9, 0x038ddac2, 0x023a50eb, 0x01c5bef9, 0x036d285e, 0x03bc33c1, 0x0184d568, 0x0043d057, 0x00205bb1}}, Y: Field{[10]uint32{0x01f0b360, 0x021f1215, 0x022a9c9b, 0x00c04862, 0x02054f9a, 0x01b8d9ad, 0x00f6fa19, 0x01623664, 0x02c9e9f3, 0x002269ec}}}, + {X: Field{[10]uint32{0x011e28a0, 0x027526aa, 0x03fd2af3, 0x003cedc5, 0x00b10196, 0x03f3311f, 0x03ba24f7, 0x001f54cf, 0x0103823d, 0x00237b48}}, Y: Field{[10]uint32{0x00011728, 0x02549b30, 0x02ad4fb1, 0x0244a9a0, 0x01e3e1a3, 0x01d4faab, 0x03ef9f7d, 0x01987bd0, 0x011fbe1a, 0x000fc0fb}}}, + {X: Field{[10]uint32{0x00d6260b, 0x026baab4, 0x00c87484, 0x0312fb88, 0x010ff4f7, 0x03a30c59, 0x03df9e3c, 0x0351e2fe, 0x039ce874, 0x002c712c}}, Y: Field{[10]uint32{0x004b4fde, 0x02f48db0, 0x00dbda54, 0x02137ef1, 0x0132c25b, 0x00e5ab72, 0x03fe7245, 0x006207ee, 0x03613070, 0x000e2be2}}}, + {X: Field{[10]uint32{0x02b2c971, 0x0176b67e, 0x0390d0e7, 0x03c9f842, 0x01f011bc, 0x02af2082, 0x03f657cf, 0x00face85, 0x023be595, 0x001f56f3}}, Y: Field{[10]uint32{0x00f84787, 0x03b78aac, 0x0167cbbc, 0x029d0198, 0x01864b2b, 0x00b0e792, 0x0308b3b6, 0x035e0ac1, 0x02865f5f, 0x001ce035}}}, + {X: Field{[10]uint32{0x0000f285, 0x034ae1d3, 0x01497a54, 0x01e22c8a, 0x00096af1, 0x031c5c71, 0x027717fb, 0x03cb3453, 0x011a422a, 0x000abd44}}, Y: Field{[10]uint32{0x03771f41, 0x012fabae, 0x0259f753, 0x031722b2, 0x032f3445, 0x01ecec90, 0x0000b68b, 0x03c401fa, 0x031bee43, 0x00111a2f}}}, + {X: Field{[10]uint32{0x037af766, 0x029ed258, 0x0155dc81, 0x02ba8b42, 0x01fe010d, 0x01010ed8, 0x03dfb65f, 0x0377bfe2, 0x01c06dc8, 0x002d1b8a}}, Y: Field{[10]uint32{0x017b59f5, 0x03b27767, 0x016459c1, 0x026c2714, 0x03748c5c, 0x01289ea7, 0x010cef82, 0x00c53f5f, 0x0095ae16, 0x00189ddd}}}, + {X: Field{[10]uint32{0x03a6b1ea, 0x02c8673e, 0x034a5089, 0x03e9648e, 0x00aef6d8, 0x00e73545, 0x02b3bd53, 0x02903dc7, 0x02d3f44e, 0x000415e1}}, Y: Field{[10]uint32{0x0343d0bc, 0x0001736d, 0x00f151ba, 0x00927f0b, 0x0139fad0, 0x03a1b42e, 0x012c4508, 0x008b2df6, 0x03dac875, 0x000a93a9}}}, + {X: Field{[10]uint32{0x02adb23f, 0x0093d205, 0x038575c6, 0x03bfc22d, 0x02d2d2d8, 0x024b3ac8, 0x01345738, 0x01b8c062, 0x0081be85, 0x0007cf03}}, Y: Field{[10]uint32{0x03f6072b, 0x03a959e2, 0x031c9faa, 0x014b4c9c, 0x0011158d, 0x027135ed, 0x02f48408, 0x012673d4, 0x0290de24, 0x0001cc85}}}, + {X: Field{[10]uint32{0x028bd2b3, 0x03d1aa91, 0x01c9f5ab, 0x01afc5be, 0x02e43787, 0x020cee83, 0x012484ff, 0x0257e824, 0x02e3a95a, 0x0005b72e}}, Y: Field{[10]uint32{0x01ffa44d, 0x027c9056, 0x00034344, 0x00ab3785, 0x0030e558, 0x031a45c0, 0x02de4733, 0x004b5b06, 0x0007247b, 0x00159c9f}}}, + {X: Field{[10]uint32{0x02e70726, 0x02510e36, 0x03fff1c7, 0x029927b6, 0x02e42314, 0x017b6af1, 0x00ff3c0f, 0x00f23e49, 0x016cd672, 0x000452f9}}, Y: Field{[10]uint32{0x028ac521, 0x03641949, 0x035e1d5f, 0x01d6511c, 0x0245b61b, 0x00cb3e9e, 0x0180046b, 0x037ab9f1, 0x0172855c, 0x00026137}}}, + {X: Field{[10]uint32{0x0103fdaf, 0x02dfab36, 0x0217d747, 0x00ea35d3, 0x0351766b, 0x03d6eaff, 0x029dbac7, 0x0211cb85, 0x02e601f9, 0x0023432c}}, Y: Field{[10]uint32{0x00bc9b92, 0x03dcdaa0, 0x0160a0f1, 0x02ae2678, 0x01f06b36, 0x033aaec4, 0x00ea3682, 0x024fdc97, 0x03f5b9e7, 0x0034564e}}}, + {X: Field{[10]uint32{0x01714db3, 0x01c9fd4c, 0x005caab4, 0x00f9212d, 0x0134e3b4, 0x020125a4, 0x032f3a2c, 0x020b936d, 0x0354188c, 0x0016d081}}, Y: Field{[10]uint32{0x00723d9f, 0x01b304e9, 0x008838bf, 0x0171dd66, 0x001c7eed, 0x0066f852, 0x00d16437, 0x03cd81eb, 0x007d27d7, 0x0012a24c}}}, + {X: Field{[10]uint32{0x00cbf74b, 0x006d63e2, 0x006ed18c, 0x00b87311, 0x019f01c6, 0x0003f82d, 0x0056a728, 0x00765a36, 0x021d9576, 0x002478dd}}, Y: Field{[10]uint32{0x0396c772, 0x00494c0a, 0x02bc7258, 0x03034cf7, 0x01b73a58, 0x02667bd5, 0x033389e9, 0x020dd8a3, 0x01e396f8, 0x002d6ad8}}}, + {X: Field{[10]uint32{0x001a4655, 0x0174a717, 0x02ad35b0, 0x007c0b62, 0x02016e0f, 0x02af814a, 0x02f55480, 0x0397ca70, 0x0383dc77, 0x000c4e02}}, Y: Field{[10]uint32{0x0193403d, 0x00ff8999, 0x01b20107, 0x02f06a87, 0x02b42173, 0x020e7342, 0x0034342b, 0x03a9c8f1, 0x03aecc84, 0x0008f32b}}}, + {X: Field{[10]uint32{0x021edd27, 0x0336a02c, 0x0239a764, 0x009e8325, 0x038f3f37, 0x02406554, 0x00b44c7c, 0x01099241, 0x018cbcd5, 0x002b9006}}, Y: Field{[10]uint32{0x00eeba8f, 0x02b988cd, 0x012005cf, 0x0269b0e7, 0x02ffceea, 0x009f6628, 0x01a0e7c8, 0x0333f336, 0x0308ffec, 0x0000e95f}}}, + {X: Field{[10]uint32{0x00a981c8, 0x0093222a, 0x0015f73e, 0x0151c9ed, 0x015764a8, 0x0066ec09, 0x01b1d3ac, 0x0303c492, 0x0387abea, 0x003d1ca5}}, Y: Field{[10]uint32{0x0265d172, 0x02d3a7ab, 0x0319d00a, 0x00542ff9, 0x03b51aae, 0x03851b41, 0x039783fd, 0x004ca31f, 0x01a568d8, 0x0038c458}}}, + {X: Field{[10]uint32{0x02d5884a, 0x03205d5f, 0x03b69ce4, 0x023029f5, 0x02f52d3b, 0x03a13429, 0x0059b617, 0x0224d3dc, 0x02b83414, 0x003e4bc0}}, Y: Field{[10]uint32{0x00864080, 0x00f3d06a, 0x026b706f, 0x023c3eed, 0x03cacd20, 0x031b7a92, 0x00eb5305, 0x00c08222, 0x02f88273, 0x003ebb5f}}}, + {X: Field{[10]uint32{0x00c93363, 0x00f385df, 0x01ec49ed, 0x008acac3, 0x029efe40, 0x007e13f0, 0x028cc4dd, 0x035a082f, 0x00aae93b, 0x0028afb6}}, Y: Field{[10]uint32{0x018ada1d, 0x003277c6, 0x00213d63, 0x02cecfc2, 0x027bf235, 0x03b7ae27, 0x0340f299, 0x01bedf80, 0x01c96212, 0x000a1eae}}}, + {X: Field{[10]uint32{0x03af4724, 0x01063e6d, 0x0198e899, 0x038b80a5, 0x00cf6219, 0x024c204d, 0x0309dc80, 0x00474666, 0x03cd3d18, 0x001690b3}}, Y: Field{[10]uint32{0x013f8423, 0x03ba3c16, 0x007172e0, 0x00f583ee, 0x02e30141, 0x002fc970, 0x02a83b18, 0x0275dac3, 0x021c3992, 0x0025739c}}}, + {X: Field{[10]uint32{0x030e530f, 0x028ae516, 0x0278940b, 0x01ae850d, 0x012e768a, 0x0105d421, 0x03f1eca4, 0x02fc64c8, 0x030567e8, 0x000749ea}}, Y: Field{[10]uint32{0x01e1afa8, 0x00cf9a84, 0x01b07c6c, 0x03775468, 0x02a23e3d, 0x01ac124c, 0x02532be7, 0x00a68562, 0x0139496d, 0x000610e6}}}, + {X: Field{[10]uint32{0x02ab4326, 0x01d2451b, 0x03d319bc, 0x0222dc98, 0x01bbbf80, 0x01337cff, 0x002fcf6e, 0x016fd12d, 0x005922c0, 0x00164afe}}, Y: Field{[10]uint32{0x004c7f65, 0x016f1d00, 0x0201e7d9, 0x01da3dfd, 0x013aaab9, 0x028bab09, 0x03946f3b, 0x03c3bf78, 0x00c38dcc, 0x002132f6}}}, + {X: Field{[10]uint32{0x009359d5, 0x02785bc0, 0x00fcf1dd, 0x015b40f1, 0x010d4df1, 0x03bab710, 0x0001f4ad, 0x036ae2ff, 0x02705ae3, 0x00199cc2}}, Y: Field{[10]uint32{0x038273ee, 0x03d5e81d, 0x03718582, 0x00b1218f, 0x036e8f42, 0x026e7bec, 0x03b91701, 0x0362c89c, 0x00c44ea1, 0x0030131f}}}, + {X: Field{[10]uint32{0x03b7fe83, 0x016453b6, 0x011ae07c, 0x01ee5e52, 0x001ce689, 0x01392158, 0x03b246d8, 0x0082b027, 0x02005324, 0x000f4009}}, Y: Field{[10]uint32{0x00c7d98e, 0x010775e5, 0x0152a532, 0x0074c871, 0x03c221fa, 0x00925148, 0x00c48557, 0x03539def, 0x02642f16, 0x0016f5cc}}}, + {X: Field{[10]uint32{0x03a24487, 0x03509d50, 0x021c061e, 0x02b5c42a, 0x02750395, 0x008b8b0a, 0x0089d37d, 0x0348bf48, 0x02362b5d, 0x000350ab}}, Y: Field{[10]uint32{0x0339ada7, 0x01863fb2, 0x02fc9c2a, 0x0126ca84, 0x00ded0a6, 0x0046dbdf, 0x03cc24ba, 0x0387a94e, 0x02001571, 0x002110e7}}}, + {X: Field{[10]uint32{0x02253743, 0x03c494ea, 0x01670ede, 0x00796f74, 0x00409e10, 0x0063a41d, 0x00b306dc, 0x02aff400, 0x01ca486f, 0x000df1d8}}, Y: Field{[10]uint32{0x010cad12, 0x01fd99ee, 0x033d0627, 0x02a5701f, 0x0129669d, 0x01ecb2e2, 0x02c241ae, 0x0036c627, 0x00e30111, 0x00394e10}}}, + {X: Field{[10]uint32{0x03b0e788, 0x027b42bc, 0x0345b288, 0x0206865c, 0x002afa97, 0x016b035b, 0x0019f371, 0x02f23bae, 0x02f8bbaf, 0x001399cb}}, Y: Field{[10]uint32{0x00814061, 0x03f3d30e, 0x0385204a, 0x02e5464d, 0x03130cb0, 0x018b83aa, 0x000133fe, 0x03601d1a, 0x00dbbb16, 0x0027043c}}}, + {X: Field{[10]uint32{0x03d51fec, 0x01e475a3, 0x03a68ed8, 0x004bcd6a, 0x0108e1df, 0x01bd8a52, 0x00635ae6, 0x01e4a7a7, 0x003b23c0, 0x00307ca5}}, Y: Field{[10]uint32{0x0264ae75, 0x0352ffba, 0x005fdfc4, 0x0319a001, 0x012f2262, 0x029ac441, 0x01f7ef96, 0x017b1664, 0x02c893ad, 0x000cddad}}}, + {X: Field{[10]uint32{0x00370be6, 0x0180abb0, 0x00ffce17, 0x01b5ebf7, 0x01351e82, 0x0198f994, 0x00f10cdf, 0x036611cb, 0x021e739c, 0x000f7c91}}, Y: Field{[10]uint32{0x0292cb06, 0x000340b1, 0x0301fc9f, 0x0295fbab, 0x02bd5ec5, 0x0206b6aa, 0x014eeb00, 0x0303b0d6, 0x00b33ed9, 0x0017923f}}}, + {X: Field{[10]uint32{0x022a82b7, 0x02307cf5, 0x033fd551, 0x009d6d8e, 0x0150f123, 0x02d83f61, 0x004ecfba, 0x024b57d3, 0x0128f98b, 0x003534f5}}, Y: Field{[10]uint32{0x027d5b76, 0x0034b3b6, 0x01a2e049, 0x00ed52c1, 0x01255405, 0x02612f02, 0x01a838ed, 0x01779a64, 0x01508543, 0x0019125b}}}, + {X: Field{[10]uint32{0x0209236b, 0x039f4084, 0x01108b3e, 0x011c3889, 0x03ad6448, 0x00ffc0e9, 0x03a41136, 0x00da3c69, 0x019b4aa3, 0x003b360e}}, Y: Field{[10]uint32{0x01355213, 0x00dc48dd, 0x011af30f, 0x023c1329, 0x01c629d8, 0x00f00b2d, 0x0351e617, 0x0070a438, 0x01fba792, 0x000b8482}}}, + {X: Field{[10]uint32{0x01f78722, 0x00cb8273, 0x01ae38c3, 0x01c1e173, 0x01416d1a, 0x02cd1356, 0x033354af, 0x0036a40c, 0x03e57e6a, 0x00356642}}, Y: Field{[10]uint32{0x03a17814, 0x0316445e, 0x01eceeef, 0x03224e5e, 0x00278f73, 0x01110402, 0x039198d3, 0x01bcf441, 0x018b73f7, 0x002ca8b3}}}, + {X: Field{[10]uint32{0x00374b1b, 0x03c10aa4, 0x0174f85e, 0x0224a1ef, 0x02b57e90, 0x01876007, 0x03d59786, 0x03b402bc, 0x03651d8c, 0x001d662a}}, Y: Field{[10]uint32{0x0028f04f, 0x036d835b, 0x00240b60, 0x021e3d33, 0x027edaae, 0x0008ba7b, 0x000cbd4b, 0x02c7fee7, 0x00269466, 0x001627f1}}}, + {X: Field{[10]uint32{0x01f694e7, 0x0248b3d0, 0x00e7d7e0, 0x03f663af, 0x03be088c, 0x00714c06, 0x02048b76, 0x00b4c614, 0x0017b12d, 0x003f41c5}}, Y: Field{[10]uint32{0x0232c363, 0x013688ef, 0x00b45966, 0x01d163be, 0x00d47d8f, 0x01ad5236, 0x01f679d9, 0x00ee4cab, 0x03f10ee6, 0x000b6714}}}, + {X: Field{[10]uint32{0x0372ca0e, 0x01b3804a, 0x038d15e5, 0x02ff2f0a, 0x02b1e513, 0x03a4d1fc, 0x01571ac8, 0x021a2b47, 0x0190e290, 0x001696d2}}, Y: Field{[10]uint32{0x03ebf968, 0x0186663b, 0x005d5e51, 0x039fa0c5, 0x01424285, 0x0313271f, 0x01569f63, 0x02549150, 0x02f50715, 0x0031da14}}}, + {X: Field{[10]uint32{0x01e7f2bd, 0x023015bf, 0x020f5972, 0x02057cf4, 0x0225c900, 0x01ba9bcd, 0x035a415f, 0x03c5190b, 0x00243cd4, 0x0024f7bb}}, Y: Field{[10]uint32{0x032dc7cb, 0x0217c96f, 0x0336dd5e, 0x0164641d, 0x006abfa8, 0x0150527d, 0x0378145f, 0x00e85987, 0x01beb999, 0x00223e46}}}, + {X: Field{[10]uint32{0x02df82b6, 0x02645f91, 0x02602f5c, 0x01f9d84e, 0x019c9bec, 0x001a350e, 0x01104c93, 0x03659e5a, 0x017ba65a, 0x00248934}}, Y: Field{[10]uint32{0x00a32f65, 0x03bef3c6, 0x0071055c, 0x03ef3d69, 0x001b5691, 0x03ac4193, 0x0289e54e, 0x0293a31d, 0x00e32bc2, 0x000d1b26}}}, + {X: Field{[10]uint32{0x0379c38e, 0x015450ce, 0x011890f0, 0x00ddb956, 0x01cfc916, 0x01cd1e9c, 0x00f054b8, 0x03fe7053, 0x009124dd, 0x002146b3}}, Y: Field{[10]uint32{0x02116f35, 0x031a7307, 0x0213a55c, 0x03c4c3c3, 0x022dd20b, 0x03127715, 0x00527e8c, 0x00730d0c, 0x01f058d2, 0x0036566f}}}, + {X: Field{[10]uint32{0x00ea4d96, 0x0041d7cb, 0x012122b7, 0x004a4c7e, 0x00eff0a6, 0x0120a544, 0x03e01ef4, 0x00471421, 0x0303b7c1, 0x003fdb04}}, Y: Field{[10]uint32{0x034841f6, 0x003ba85e, 0x01574537, 0x03fd6a56, 0x027e99d0, 0x02495417, 0x02239beb, 0x0142a832, 0x03bf7bcf, 0x00093c26}}}, + {X: Field{[10]uint32{0x035fdac0, 0x02f18d90, 0x029d06a4, 0x013d3d32, 0x020fd501, 0x022dbb2d, 0x03fb51ec, 0x02f4750c, 0x01f055e7, 0x003c8ef6}}, Y: Field{[10]uint32{0x016d7b60, 0x00653ba9, 0x03da69d2, 0x01f7c482, 0x0325ba91, 0x03b91d11, 0x02e7012a, 0x026b65a3, 0x00589d26, 0x002594ad}}}, + {X: Field{[10]uint32{0x01f46ff7, 0x01549e92, 0x035642a0, 0x03e4e46e, 0x001fe070, 0x02ef52bc, 0x0023e601, 0x017465ee, 0x0056ea6d, 0x0027588b}}, Y: Field{[10]uint32{0x015c609e, 0x00ea473f, 0x01494e6c, 0x0310b809, 0x02c648c7, 0x01b6cf72, 0x03bd5576, 0x0217fb67, 0x03940d64, 0x0020186e}}}, + {X: Field{[10]uint32{0x03020c13, 0x0342b7cb, 0x03b80370, 0x03795a4c, 0x012915af, 0x001ee658, 0x014b67c4, 0x03579d8e, 0x03e4cff5, 0x0025253b}}, Y: Field{[10]uint32{0x00a7e4ea, 0x016bce16, 0x00a8184f, 0x02e3f4fc, 0x03fd86ec, 0x03908dcb, 0x03964b2d, 0x03873009, 0x0238c85e, 0x002ac31f}}}, + {X: Field{[10]uint32{0x012e1a86, 0x005802a5, 0x03268dbe, 0x01665d00, 0x00e028c2, 0x024e2807, 0x028cb6c2, 0x014bf002, 0x03baffbc, 0x002a3935}}, Y: Field{[10]uint32{0x011a0bed, 0x019f0a4d, 0x0096fc9f, 0x02e72591, 0x02cc7eee, 0x01bc59c8, 0x0379723c, 0x0008b013, 0x003d0dc3, 0x0002356e}}}, + {X: Field{[10]uint32{0x00927ac5, 0x030eed79, 0x00df1f17, 0x02bc5467, 0x01203c01, 0x035cb5e9, 0x03191ad4, 0x01183fbf, 0x0364938e, 0x0020e107}}, Y: Field{[10]uint32{0x03536800, 0x00075e7a, 0x03e4180e, 0x0036c813, 0x02ecb1f3, 0x00105712, 0x03733974, 0x01c92484, 0x00f2c2e8, 0x0003d61a}}}, + {X: Field{[10]uint32{0x020612f6, 0x00f220c0, 0x02acbd62, 0x03da542b, 0x02af2a2d, 0x02d65fec, 0x00dcba67, 0x00fe2a18, 0x00d95ef0, 0x003ba25d}}, Y: Field{[10]uint32{0x00f141ac, 0x0381fe29, 0x0321634e, 0x03ebadf3, 0x016596ab, 0x03e7dd8f, 0x02951453, 0x01775f31, 0x01740308, 0x00173c43}}}, + {X: Field{[10]uint32{0x02579606, 0x0006982d, 0x01857b2d, 0x01ac9a47, 0x01a92dde, 0x0109d8a3, 0x036e5fa3, 0x01b28ec4, 0x018c2361, 0x001a3a23}}, Y: Field{[10]uint32{0x00fd5450, 0x01345e68, 0x03c41257, 0x01ce1a85, 0x01e5ec7b, 0x02da959d, 0x00c5d609, 0x035baf16, 0x00903766, 0x000016a4}}}, + {X: Field{[10]uint32{0x0122345b, 0x031626a5, 0x02e7c50a, 0x016b38ec, 0x00cfe6ab, 0x01333290, 0x01bea794, 0x0322d883, 0x018ac62e, 0x003f8d37}}, Y: Field{[10]uint32{0x03d6c8c0, 0x02ee6fda, 0x025bff0a, 0x03562634, 0x0330c9ed, 0x034f8029, 0x01611d7b, 0x0384894d, 0x0055adf1, 0x002233c0}}}, + {X: Field{[10]uint32{0x0251bc1f, 0x017c8d60, 0x03ff7f6a, 0x019bf462, 0x00099893, 0x004c5cda, 0x0262479c, 0x005226aa, 0x029cc0f8, 0x00108e9e}}, Y: Field{[10]uint32{0x01c678ee, 0x00986f4a, 0x0271fde4, 0x02591cb3, 0x01259ce8, 0x01844b90, 0x02776ea1, 0x0090740b, 0x03dd0519, 0x003249ac}}}, + {X: Field{[10]uint32{0x010b98f4, 0x013c55eb, 0x00e730ed, 0x02d1c9f0, 0x010ffb0e, 0x00b82364, 0x01bb840b, 0x0153ff98, 0x03f97cbf, 0x001fe982}}, Y: Field{[10]uint32{0x0294d733, 0x02cec243, 0x0281f6e7, 0x03b5e5e3, 0x027e296f, 0x01fdcda9, 0x01c7b26a, 0x021ee3f7, 0x02df84d3, 0x00356c6a}}}, + {X: Field{[10]uint32{0x00153a66, 0x01dd0cd8, 0x0098cf1e, 0x01743bbe, 0x01829481, 0x0245fe45, 0x02df8a66, 0x037af1df, 0x030ef1ed, 0x002794f2}}, Y: Field{[10]uint32{0x02b41ccf, 0x03e05fd1, 0x037a2ed8, 0x0273f955, 0x01498349, 0x022faf82, 0x024c6f1b, 0x028a86e6, 0x02f260fe, 0x0014d636}}}, + {X: Field{[10]uint32{0x02d6f119, 0x01a5548e, 0x01e9631e, 0x023a3b24, 0x00140471, 0x0150ccb0, 0x0344ad53, 0x0319de66, 0x0241c616, 0x002b7e4d}}, Y: Field{[10]uint32{0x0242ff9e, 0x00a84edf, 0x00619dfe, 0x01056b4e, 0x028dc172, 0x031ab10a, 0x01f67615, 0x02cf7fd5, 0x02afe4cf, 0x00368f19}}}, + {X: Field{[10]uint32{0x034e4ca8, 0x01bb2d91, 0x02f0c972, 0x0310e5bd, 0x035b6242, 0x02f857d2, 0x0287ddb2, 0x02cd9ec1, 0x03ec485d, 0x0001c078}}, Y: Field{[10]uint32{0x013b9e83, 0x0360644b, 0x00f946f2, 0x033cf44f, 0x03691aa3, 0x001d00dd, 0x01f7fea3, 0x0387140a, 0x027613dc, 0x0004263e}}}, + {X: Field{[10]uint32{0x00ccfefc, 0x0036443e, 0x01e84aac, 0x01781852, 0x02d51364, 0x03149402, 0x01a7e042, 0x02a8167a, 0x03a5d3ec, 0x00363f16}}, Y: Field{[10]uint32{0x034b3d8a, 0x025c225e, 0x01920c25, 0x020f95e3, 0x02df96ee, 0x00e8b7c1, 0x014b4d98, 0x025369d2, 0x034d0eec, 0x001c9c92}}}, + {X: Field{[10]uint32{0x0371398e, 0x03aa0fbf, 0x038dcc9e, 0x027528ce, 0x00c900cb, 0x02aa97c3, 0x018a186f, 0x03fedc19, 0x039a8279, 0x001ef223}}, Y: Field{[10]uint32{0x03a14a7c, 0x01581983, 0x001b0aa9, 0x027c7d56, 0x034939d3, 0x0022ddbd, 0x02d8c77e, 0x02054468, 0x01dfe5ed, 0x00337348}}}, + {X: Field{[10]uint32{0x035ef0e5, 0x01ba845b, 0x019190f4, 0x0297befe, 0x03e5fb92, 0x03c85ca8, 0x0219bc77, 0x02787db8, 0x01310bc7, 0x00215e35}}, Y: Field{[10]uint32{0x03b7d550, 0x01d67344, 0x00290768, 0x0137b45f, 0x00cac2d0, 0x008ce3e7, 0x02ef5e05, 0x018b1a53, 0x02ac39c2, 0x003f346c}}}, + {X: Field{[10]uint32{0x00020a62, 0x0379d62a, 0x010935cd, 0x008112ee, 0x02d41240, 0x01f87302, 0x01eb5f43, 0x01986d51, 0x02d73ea2, 0x00262f08}}, Y: Field{[10]uint32{0x02232226, 0x038530a0, 0x032d9f32, 0x03ca86a8, 0x002607bf, 0x03118be5, 0x02c8d83c, 0x02e96f0a, 0x01de0d33, 0x00050f1f}}}, + {X: Field{[10]uint32{0x01e8ee10, 0x0112c2b5, 0x0001aaca, 0x0197a8f1, 0x019980f2, 0x016fc215, 0x008106ca, 0x005db742, 0x021e95d2, 0x001ff3e0}}, Y: Field{[10]uint32{0x02400284, 0x03b274bf, 0x01cfb266, 0x01506ce2, 0x03c127b0, 0x02389f2a, 0x02f4598e, 0x02bfbbe2, 0x01ae87e7, 0x0009f0d0}}}, + {X: Field{[10]uint32{0x0216a5f1, 0x00a4ba80, 0x02ca8316, 0x01e87f1d, 0x0367acd6, 0x028cd3e4, 0x03e195b6, 0x03bc17e1, 0x01b9d440, 0x0022628e}}, Y: Field{[10]uint32{0x00ce52ef, 0x03290ec6, 0x037c3fc2, 0x0398af53, 0x02c0db80, 0x0113eafe, 0x011cae97, 0x01d394bf, 0x03bbfe32, 0x003ad90b}}}, + {X: Field{[10]uint32{0x032192a4, 0x00e2fd0f, 0x03e3cbf1, 0x009e0cc8, 0x0287d6a6, 0x03c62fe6, 0x01624801, 0x0308582a, 0x00a28918, 0x000fba5d}}, Y: Field{[10]uint32{0x01660d9c, 0x002d56f3, 0x01c63dc5, 0x03f04375, 0x020fde39, 0x0183f483, 0x01d5b2a9, 0x03acd526, 0x02dfac71, 0x003d6ce1}}}, + {X: Field{[10]uint32{0x0047c14a, 0x030fcd90, 0x010a57dd, 0x03d0bed8, 0x019766bb, 0x001b0494, 0x03753eed, 0x037cd26a, 0x012fde76, 0x002f7443}}, Y: Field{[10]uint32{0x02923dec, 0x01d0cc05, 0x03bbd6bc, 0x03da7100, 0x022b8b47, 0x02d1000c, 0x0327664a, 0x01fae6e2, 0x02ed34f9, 0x0014114c}}}, + {X: Field{[10]uint32{0x03edd63d, 0x0028738e, 0x02b23c00, 0x0123105d, 0x02477a51, 0x02e7fca4, 0x039a4a0e, 0x0104913f, 0x00373978, 0x000b05e5}}, Y: Field{[10]uint32{0x032fcfb6, 0x039803c3, 0x00173e37, 0x03dcf98c, 0x002c1ca5, 0x02684aa3, 0x02fcccab, 0x01ecaea0, 0x01844f9b, 0x0028d9ed}}}, + {X: Field{[10]uint32{0x03e71580, 0x0225e62c, 0x01841362, 0x028cb4f3, 0x01a83036, 0x03ba5faf, 0x031e6df6, 0x00744dbd, 0x030ef2d6, 0x000a0bbc}}, Y: Field{[10]uint32{0x03d0f43a, 0x02097738, 0x0286fc47, 0x030c7d63, 0x035b4f9d, 0x028ff247, 0x00252647, 0x03a8b953, 0x0133c350, 0x00242c33}}}, + {X: Field{[10]uint32{0x019eff23, 0x00e31ce2, 0x00ef71ea, 0x03ab6c4e, 0x01085bf6, 0x03b82faf, 0x00ab3d50, 0x03e9f2d5, 0x015542ac, 0x00290ad3}}, Y: Field{[10]uint32{0x03566bb7, 0x03cf3287, 0x030bdb1f, 0x00e83f4b, 0x0363d0e0, 0x009ac2e7, 0x00c49973, 0x02649dd9, 0x0080f10b, 0x0005f8e2}}}, + {X: Field{[10]uint32{0x037ef00e, 0x008947bf, 0x0138b1a0, 0x0295d7cf, 0x01a06fce, 0x02562556, 0x0180d474, 0x00323d2d, 0x0064c5b0, 0x002c8eb3}}, Y: Field{[10]uint32{0x00b6464f, 0x01502a87, 0x007293bc, 0x02b3fe42, 0x03073964, 0x0115fd79, 0x03e6a17d, 0x0193612f, 0x000a7eaa, 0x0019aec6}}}, + {X: Field{[10]uint32{0x01885ea7, 0x0298a3dd, 0x03023411, 0x0273b31d, 0x0189df02, 0x001d45ba, 0x001ce7a4, 0x02c18d1a, 0x00e696ae, 0x000250b7}}, Y: Field{[10]uint32{0x007caf14, 0x00fe02dc, 0x02784ba1, 0x02eb545e, 0x01c439f0, 0x00eabed1, 0x02b06cea, 0x01ecfdad, 0x028a88be, 0x0038822f}}}, + {X: Field{[10]uint32{0x00392d16, 0x01196ae2, 0x020e1610, 0x0253843a, 0x0023e64a, 0x01c7ae52, 0x038e4dbe, 0x013b0208, 0x02b95219, 0x002e29a8}}, Y: Field{[10]uint32{0x03a5fec1, 0x018f5472, 0x015c74cb, 0x03d306d5, 0x0034c7be, 0x010ef896, 0x02758ae3, 0x03b8fdde, 0x0331b8e5, 0x003e00a7}}}, + {X: Field{[10]uint32{0x0068fc20, 0x020ff082, 0x016d90cc, 0x03105e90, 0x02f15fea, 0x0298532d, 0x03db083e, 0x0017dec7, 0x0369a1ee, 0x0028db4c}}, Y: Field{[10]uint32{0x02f0af52, 0x00c9f8dd, 0x01f10e94, 0x03817c28, 0x00aacd2a, 0x02a7f5c5, 0x03b76516, 0x03c9f56d, 0x03f9fe40, 0x00392af5}}}, + {X: Field{[10]uint32{0x008dda1d, 0x03d790c2, 0x00cc0ebe, 0x01a3d142, 0x016f03bd, 0x035bf535, 0x00cc89b9, 0x006b9bff, 0x01083d71, 0x0013a8c0}}, Y: Field{[10]uint32{0x00a3e513, 0x01e4f557, 0x02c83eed, 0x017f3957, 0x0340f9ea, 0x015059b4, 0x0154bcf1, 0x01652419, 0x017a8b1c, 0x00207a66}}}, + {X: Field{[10]uint32{0x02ffdc55, 0x03d0938a, 0x0175ece2, 0x023d01a8, 0x020fee11, 0x0109edc4, 0x0342e62e, 0x02271d91, 0x03161c1c, 0x000808a1}}, Y: Field{[10]uint32{0x03fa35b1, 0x005dd999, 0x02c28bc8, 0x00317b34, 0x0291eaff, 0x00787426, 0x00d28644, 0x029fcd0a, 0x025ecf26, 0x001e0de5}}}, + {X: Field{[10]uint32{0x0070d20c, 0x036dfa18, 0x0384cf5a, 0x024bc599, 0x0395be90, 0x00481848, 0x010d4296, 0x03c5815e, 0x02fc8e4b, 0x0034f01c}}, Y: Field{[10]uint32{0x00daf31a, 0x032ae0b6, 0x01c0cf5b, 0x03ac2bf4, 0x00f412e0, 0x03de6472, 0x015c0faa, 0x01d6eeed, 0x0262594c, 0x001c9a20}}}, + {X: Field{[10]uint32{0x0130ec82, 0x037d8381, 0x03dad3e6, 0x02f729d8, 0x0294003d, 0x0228d534, 0x00e8f342, 0x03e9f33c, 0x007ce307, 0x000a536b}}, Y: Field{[10]uint32{0x0384673d, 0x026d17f3, 0x01ecc0fb, 0x020ebf52, 0x02cfbcc7, 0x0298c279, 0x02807c4b, 0x02a98abb, 0x0222a7bc, 0x0011e7f0}}}, + {X: Field{[10]uint32{0x02732fae, 0x01766b13, 0x0175c707, 0x0027a891, 0x02225de6, 0x01ec9dbf, 0x0042a8d6, 0x03a36790, 0x025cc09f, 0x000e55b2}}, Y: Field{[10]uint32{0x02eaa23e, 0x01e89a8b, 0x00302e28, 0x0075ef5e, 0x03719643, 0x007f58bc, 0x025ee0ce, 0x02414a74, 0x03e7a821, 0x00072597}}}, + {X: Field{[10]uint32{0x01fb3def, 0x03a0afe4, 0x029e697e, 0x0359b61e, 0x014f4109, 0x0125005d, 0x036eb068, 0x012d239c, 0x0396da14, 0x000934b8}}, Y: Field{[10]uint32{0x0372236e, 0x01f43668, 0x0081e76d, 0x01d47f9f, 0x02ea875c, 0x036eb484, 0x01e3c9ce, 0x00bf3f74, 0x037224b0, 0x002ede79}}}, + {X: Field{[10]uint32{0x01a2aa5e, 0x038ae6e6, 0x00d3ab49, 0x0224f84b, 0x01188528, 0x03670be4, 0x03f9619d, 0x01701ff2, 0x0042f16e, 0x0018e350}}, Y: Field{[10]uint32{0x032b3d92, 0x0392acac, 0x024db222, 0x010dd2e2, 0x03f618da, 0x03976051, 0x039eb8b8, 0x00429037, 0x00424f00, 0x0034365e}}}, + {X: Field{[10]uint32{0x030d866c, 0x019e0a23, 0x00c5cd7d, 0x02218da0, 0x0194202d, 0x00c0cb87, 0x0323a1fd, 0x01caeaec, 0x015ba999, 0x0003e46b}}, Y: Field{[10]uint32{0x0052bdc0, 0x02853565, 0x03571e24, 0x0386c344, 0x001cb558, 0x03eccb6b, 0x038bb4fe, 0x005d68e8, 0x0145a693, 0x00182d9b}}}, + {X: Field{[10]uint32{0x02a69b7c, 0x005c9cba, 0x03c39c64, 0x0236239f, 0x039e6af4, 0x01b40dc2, 0x031fb88a, 0x0097c53f, 0x037d779c, 0x000c5504}}, Y: Field{[10]uint32{0x02295f7a, 0x034e7ee4, 0x03b13560, 0x0066c664, 0x02c1980c, 0x00991213, 0x00e112a9, 0x005e28e6, 0x011e9c09, 0x003acef6}}}, + {X: Field{[10]uint32{0x01549597, 0x0072e4d8, 0x01355072, 0x00b65286, 0x01f710be, 0x03475e99, 0x03acb3c1, 0x027f2078, 0x021fdfdf, 0x003e2087}}, Y: Field{[10]uint32{0x018993ec, 0x013116df, 0x002a3f4b, 0x00171ebf, 0x02c5770c, 0x033ca396, 0x03635b9d, 0x014a0946, 0x0068c1e0, 0x002ed41e}}}, + {X: Field{[10]uint32{0x0354a655, 0x013d8fa0, 0x033b06dd, 0x02be1c0c, 0x00ec5d6f, 0x01438eb6, 0x018aa900, 0x0012968b, 0x023a5214, 0x00210251}}, Y: Field{[10]uint32{0x01db3bd4, 0x0215efb8, 0x01ecf91b, 0x00949a68, 0x031b8a65, 0x00edeacd, 0x00c1b668, 0x00b294e7, 0x012b8509, 0x00332651}}}, + {X: Field{[10]uint32{0x003bc471, 0x01041980, 0x01e09f72, 0x0395a08a, 0x02314380, 0x015d1767, 0x0222eb53, 0x01c2d5b6, 0x001112d3, 0x0025a009}}, Y: Field{[10]uint32{0x005d8f38, 0x017e518a, 0x0092ff49, 0x000c4eed, 0x0327d6c7, 0x0165b440, 0x020419d6, 0x030807fe, 0x01377f03, 0x00376b0b}}}, + {X: Field{[10]uint32{0x023a69c8, 0x027f0fe8, 0x01393d3f, 0x01fda329, 0x020f85e8, 0x005c2547, 0x03628244, 0x00568571, 0x02ec9f57, 0x002746ae}}, Y: Field{[10]uint32{0x0328cadf, 0x02b4a2cf, 0x03bdd149, 0x039e6219, 0x0071b010, 0x02508d4e, 0x00c89e62, 0x02d8708e, 0x030050db, 0x003c87b9}}}, + {X: Field{[10]uint32{0x001f7ae6, 0x01d0b585, 0x03a32f72, 0x02816166, 0x019886d6, 0x012c10dc, 0x03234b6a, 0x02bd1b0d, 0x02918db3, 0x0007ee59}}, Y: Field{[10]uint32{0x001f7379, 0x035560b5, 0x00ecab09, 0x01e08101, 0x02a17b55, 0x03a69096, 0x034c4426, 0x03f647df, 0x02cc207e, 0x0022f04f}}}, + {X: Field{[10]uint32{0x021ec7b8, 0x00876da7, 0x01281ee2, 0x03c169e0, 0x02416d54, 0x0010a3a2, 0x00bcb23e, 0x0136ac26, 0x0364b927, 0x0008b678}}, Y: Field{[10]uint32{0x02d8407d, 0x01219780, 0x024c1c1e, 0x0244a3e4, 0x014c300a, 0x01d3a546, 0x0399195b, 0x01f6d795, 0x0258f93d, 0x0017708c}}}, + {X: Field{[10]uint32{0x0073e45d, 0x01ca5efe, 0x03ff8398, 0x030091f2, 0x01adb168, 0x0161d04c, 0x0166766d, 0x020fecc0, 0x0050aed0, 0x001897e9}}, Y: Field{[10]uint32{0x0376bb7b, 0x007d9121, 0x011175a2, 0x02196e39, 0x00fbb5a2, 0x0280913c, 0x0185ed21, 0x03241195, 0x0104473d, 0x001c82a0}}}, + {X: Field{[10]uint32{0x02a2147f, 0x020bcde9, 0x028ff01f, 0x003fc86b, 0x002deacc, 0x009a06ba, 0x03b01c2e, 0x03f0977b, 0x01c19b6d, 0x00092b2c}}, Y: Field{[10]uint32{0x03ca5d4b, 0x02647774, 0x03d52783, 0x036b7ebd, 0x0193f50a, 0x01c6aaf8, 0x00abdcdb, 0x0201862a, 0x0335210e, 0x003dca74}}}, + {X: Field{[10]uint32{0x035ab555, 0x004c0b3d, 0x0339f33c, 0x025ae96c, 0x036c6d18, 0x02fdf6ce, 0x02328e3b, 0x00c353ce, 0x0003a99d, 0x0034a15a}}, Y: Field{[10]uint32{0x0292d6ff, 0x02727681, 0x00fdf568, 0x0224f9e0, 0x012b814a, 0x02d06dc9, 0x0098bbf1, 0x016e1d8b, 0x014d6470, 0x00259266}}}, + {X: Field{[10]uint32{0x00b5fe0a, 0x002f2613, 0x0031b50a, 0x023cef1e, 0x008fb529, 0x01c797f6, 0x01e95ef8, 0x01a212c5, 0x02659d19, 0x002014a7}}, Y: Field{[10]uint32{0x00b3b778, 0x0391dbc4, 0x02de6e9a, 0x02a1d3a1, 0x000b74b4, 0x01696c9a, 0x01e50bfc, 0x02faa3bf, 0x024f9ae4, 0x0021a2cf}}}, + {X: Field{[10]uint32{0x0328e183, 0x01d35fa1, 0x01dded06, 0x005a54fc, 0x030e0bb3, 0x02710c9d, 0x0288e494, 0x0007b574, 0x01aa3b82, 0x001fe466}}, Y: Field{[10]uint32{0x025288b9, 0x0387e7c6, 0x01e2ffcb, 0x0107765f, 0x00ee9d7e, 0x029c89a3, 0x02c174a3, 0x0080a551, 0x0273d037, 0x00006ae9}}}, + {X: Field{[10]uint32{0x0029ecbc, 0x0322598b, 0x02fb76d0, 0x01b59134, 0x0129b456, 0x03332c64, 0x004674cd, 0x0167d923, 0x008508e9, 0x001f4cb2}}, Y: Field{[10]uint32{0x02d39698, 0x0000d081, 0x013e866e, 0x0278c7d5, 0x02875ea9, 0x01971ce1, 0x011afb8e, 0x03fba325, 0x00ecb50b, 0x003643a5}}}, + {X: Field{[10]uint32{0x011abfbf, 0x020678cb, 0x0374cbf8, 0x03feb67a, 0x011f1727, 0x02f46fc0, 0x02ce67eb, 0x03b3215d, 0x01c09291, 0x003cae58}}, Y: Field{[10]uint32{0x0126f795, 0x001c408c, 0x00524017, 0x002b5030, 0x00ed0aec, 0x0195bd8e, 0x00382208, 0x01a8d91b, 0x00495a1e, 0x003aff96}}}, + {X: Field{[10]uint32{0x01be876e, 0x02efefe0, 0x02676f75, 0x005d3a62, 0x026b4ae3, 0x025c606c, 0x02d6a728, 0x00ca465c, 0x02899528, 0x00366831}}, Y: Field{[10]uint32{0x02bfa042, 0x03e31eb1, 0x00d922b7, 0x024eecd4, 0x01e9039b, 0x034fc0c2, 0x0164d974, 0x02f26b45, 0x0086a0ac, 0x0034daba}}}, + {X: Field{[10]uint32{0x007c3e0a, 0x0375205f, 0x0269fbe2, 0x0048c2ce, 0x00fff299, 0x002af7d7, 0x01b2aa71, 0x01f23264, 0x03246aeb, 0x0031e8d8}}, Y: Field{[10]uint32{0x01c9e21f, 0x016c3001, 0x025f815f, 0x01235b47, 0x0102b321, 0x02d2cb52, 0x01863026, 0x0234b5e6, 0x01d70e44, 0x0004a63f}}}, + {X: Field{[10]uint32{0x00985a86, 0x010853f9, 0x00ac4830, 0x01931ff8, 0x02640d24, 0x036fd58e, 0x02535a04, 0x034ef019, 0x03a05064, 0x0018d735}}, Y: Field{[10]uint32{0x01e3ae1f, 0x014f89fa, 0x01a4ce04, 0x011fcca0, 0x00e8d5f0, 0x03e78bcc, 0x0335cfca, 0x01dfd919, 0x0265913e, 0x00003900}}}, + {X: Field{[10]uint32{0x009ee5f5, 0x02478426, 0x00adcc5b, 0x02dc85a7, 0x02eca54b, 0x0256d206, 0x035b6326, 0x03a894df, 0x024f38ed, 0x00017698}}, Y: Field{[10]uint32{0x02721779, 0x0035dc72, 0x02505a22, 0x0088dec5, 0x0248c288, 0x00e9495b, 0x03aeeb24, 0x000c03ff, 0x01baa108, 0x0034fa9b}}}, + {X: Field{[10]uint32{0x007d4d5e, 0x024a13fa, 0x0080efe1, 0x0230a5db, 0x01ce0527, 0x03f92db5, 0x001f6871, 0x01d7b24b, 0x00a2b197, 0x002a93d9}}, Y: Field{[10]uint32{0x02d4f240, 0x01e4f70f, 0x0118e293, 0x00a20e59, 0x00224ea0, 0x0160e99b, 0x036e9499, 0x0383eda5, 0x017e95fc, 0x003ce7c4}}}, + {X: Field{[10]uint32{0x027e0641, 0x02d70d90, 0x038c1477, 0x03b3af8d, 0x01d60969, 0x00b81554, 0x0293f266, 0x006d088a, 0x00ea99ff, 0x0026d946}}, Y: Field{[10]uint32{0x0393165a, 0x01d21f63, 0x0165627b, 0x03147508, 0x01bebdf7, 0x0014cbfe, 0x02ea9dd3, 0x03eced0e, 0x02558650, 0x000ba7c5}}}, + {X: Field{[10]uint32{0x0297b562, 0x024f402b, 0x011594b1, 0x01ffec40, 0x006547f4, 0x03772fae, 0x02011381, 0x00b83e87, 0x02a2b597, 0x001b26e6}}, Y: Field{[10]uint32{0x0275e27d, 0x01280e18, 0x02d3b162, 0x02c99d1d, 0x02a6e78e, 0x034816f6, 0x0123d0f9, 0x01c74af9, 0x011c8d4c, 0x002bc276}}}, + {X: Field{[10]uint32{0x03467cbe, 0x019984b6, 0x01f71f53, 0x031a8df9, 0x00cf80ae, 0x031c44a8, 0x02365410, 0x02571579, 0x00803cdc, 0x0028a872}}, Y: Field{[10]uint32{0x0223fc09, 0x02e6cb53, 0x02fc273e, 0x00683108, 0x01802e2e, 0x00352c5d, 0x025410d5, 0x03c103ff, 0x030f3638, 0x003133d5}}}, + {X: Field{[10]uint32{0x03650427, 0x010df96a, 0x008a9ca8, 0x02b883cb, 0x0213102b, 0x02225cd9, 0x025af104, 0x033358d2, 0x0350c961, 0x00018f4d}}, Y: Field{[10]uint32{0x02339248, 0x01c01163, 0x03fa06d6, 0x03c1c4e4, 0x01f21125, 0x0261d0a8, 0x01e90dc6, 0x0269d9cb, 0x033274b3, 0x0021d054}}}, + {X: Field{[10]uint32{0x02bdd04a, 0x00582c94, 0x0130e1f5, 0x02fc66da, 0x00bcc97d, 0x02117453, 0x013e8fb5, 0x02095429, 0x0266e442, 0x002341c3}}, Y: Field{[10]uint32{0x01487ecd, 0x036a3766, 0x00bb2497, 0x02433bbd, 0x0248cdef, 0x005cf348, 0x0084099f, 0x013c1326, 0x00824f2b, 0x0012f263}}}, + {X: Field{[10]uint32{0x0291c8bd, 0x02ff4ad2, 0x01456175, 0x037decd8, 0x03e3f3d4, 0x03305963, 0x00143950, 0x00022ed4, 0x02a72e5f, 0x003c7f95}}, Y: Field{[10]uint32{0x01f275f2, 0x03219bbd, 0x017b2be2, 0x017ffa29, 0x03a19caa, 0x00da2159, 0x01e302ad, 0x01f69740, 0x02bee57a, 0x002f97ff}}}, + {X: Field{[10]uint32{0x03554b21, 0x01a87f9c, 0x01635747, 0x02756bb3, 0x03b41239, 0x019d6f31, 0x0271a950, 0x025a7a6e, 0x02dbd2eb, 0x00200b26}}, Y: Field{[10]uint32{0x0372bc5e, 0x008b84d9, 0x007efb74, 0x0326f841, 0x02cc3344, 0x01c3e703, 0x026527d3, 0x0339a59b, 0x0026f547, 0x001084c8}}}, + {X: Field{[10]uint32{0x0093db56, 0x020812c5, 0x02745c71, 0x0293c5e2, 0x009d24cd, 0x02f1e965, 0x030a5cda, 0x03b48803, 0x02c09d6c, 0x00256c6d}}, Y: Field{[10]uint32{0x02adb01d, 0x0002752d, 0x023ddf69, 0x0074db2c, 0x0127b233, 0x01b3c903, 0x00ce5e9a, 0x00f45ab2, 0x02815303, 0x002f050d}}}, + {X: Field{[10]uint32{0x02ede35d, 0x0120e9a9, 0x0169d2d6, 0x01bb5dac, 0x017b79a0, 0x005c08bc, 0x03b2aa4e, 0x013ab860, 0x012901f9, 0x0003abb5}}, Y: Field{[10]uint32{0x01d559b3, 0x009fee57, 0x03f8f9cb, 0x01f266b1, 0x00bc6e37, 0x02b5aebc, 0x02c1efa3, 0x02267376, 0x027691c5, 0x0014f56c}}}, + {X: Field{[10]uint32{0x0027d770, 0x02dcd667, 0x02abeac7, 0x0038d9ef, 0x03906d69, 0x03bcfdfc, 0x02b485b6, 0x011231cb, 0x03e59f6f, 0x001df113}}, Y: Field{[10]uint32{0x031102fd, 0x008bbafe, 0x009d3833, 0x027feb31, 0x00e6629c, 0x038f5ace, 0x00f03604, 0x003e00b3, 0x00226c44, 0x002f35d4}}}, + {X: Field{[10]uint32{0x000a0306, 0x02b97ef9, 0x0144efad, 0x01e55046, 0x00011b62, 0x0364daa2, 0x0352002c, 0x00291ad9, 0x02e2f00f, 0x003a18ec}}, Y: Field{[10]uint32{0x03243a5f, 0x03f81119, 0x00358b36, 0x01f59802, 0x01c2ed93, 0x00c7a3ab, 0x039caff6, 0x027c5c16, 0x03a36da2, 0x002d71e6}}}, + {X: Field{[10]uint32{0x02f8f191, 0x0079cbbb, 0x02dec272, 0x02d3cf73, 0x003883ad, 0x02b68c26, 0x03eedda4, 0x01c742cb, 0x03ef93df, 0x00089bd6}}, Y: Field{[10]uint32{0x001707c3, 0x008cf39d, 0x00fbcc13, 0x022f5d73, 0x00f96607, 0x02116186, 0x00a08fbe, 0x02f05228, 0x00b52bce, 0x00282481}}}, + {X: Field{[10]uint32{0x03467184, 0x03a40da0, 0x0046e3a4, 0x0292bfdf, 0x02c33bed, 0x031bc237, 0x03a82b39, 0x01f14e7c, 0x03b08c1e, 0x002a888b}}, Y: Field{[10]uint32{0x001c3765, 0x03590c5f, 0x01d4ac5d, 0x00a641ad, 0x01c1653d, 0x01b7fe4c, 0x01a7c3aa, 0x03f4e608, 0x01cf21ca, 0x00010441}}}, + {X: Field{[10]uint32{0x01fec96a, 0x01d53c78, 0x01a82239, 0x033048db, 0x01f94482, 0x025ec540, 0x01220bb3, 0x013b4f71, 0x02cd26ef, 0x00061e70}}, Y: Field{[10]uint32{0x01f0d67d, 0x01c96ddc, 0x01351464, 0x01472dcf, 0x024fc689, 0x00758c10, 0x03b16092, 0x03785247, 0x033575ea, 0x00244b57}}}, + {X: Field{[10]uint32{0x009902e0, 0x01fb2c6b, 0x03b76765, 0x007af70a, 0x026df621, 0x01c352df, 0x024cfc59, 0x03622fd2, 0x00a4e7ee, 0x002f8e79}}, Y: Field{[10]uint32{0x0227cb4e, 0x03311d9f, 0x00899f94, 0x02915857, 0x0132ae54, 0x0133d692, 0x006d9a2b, 0x029edd8c, 0x00f113fc, 0x00362c79}}}, + {X: Field{[10]uint32{0x012d5786, 0x02f70bdd, 0x00631d3f, 0x0391f3d1, 0x001c2912, 0x01b0fe2a, 0x03028368, 0x0230f740, 0x03ce3337, 0x0007a9cb}}, Y: Field{[10]uint32{0x0348906e, 0x002e220d, 0x007c9aed, 0x02c201ff, 0x000cb6e2, 0x03941ade, 0x03f261af, 0x03745333, 0x0158fe1c, 0x003883d1}}}, + {X: Field{[10]uint32{0x02036806, 0x0198beb6, 0x032423ac, 0x0046dd36, 0x022d0ca0, 0x00caf0e5, 0x00638e6f, 0x03d5f7a3, 0x03dd67bf, 0x00015b8c}}, Y: Field{[10]uint32{0x0393f461, 0x00ee4ff0, 0x02e2efbb, 0x033cf853, 0x0350d78e, 0x007795ef, 0x0317d4e4, 0x01c4c024, 0x00cc165e, 0x00100e70}}}, + {X: Field{[10]uint32{0x000f37ad, 0x01c330ba, 0x034470c4, 0x0153c429, 0x02d036ce, 0x00e2e78f, 0x02fb95a7, 0x03637c72, 0x0291a5f1, 0x00146605}}, Y: Field{[10]uint32{0x01972261, 0x02a998b1, 0x03664d31, 0x03711c7b, 0x01d03fab, 0x03a5fc11, 0x026e3c26, 0x00aa641d, 0x004767cf, 0x00027ee4}}}, + {X: Field{[10]uint32{0x00869dbd, 0x03165e66, 0x03f3016e, 0x02e6f355, 0x02b90db9, 0x03e49e65, 0x00be7f95, 0x025e0dac, 0x028577a5, 0x003bce95}}, Y: Field{[10]uint32{0x037c5e07, 0x030f6306, 0x024d372a, 0x00d92ed4, 0x03fabe11, 0x0387d1e0, 0x01782c6a, 0x01d27a52, 0x0057ff22, 0x001473f9}}}, + {X: Field{[10]uint32{0x03196415, 0x0301836b, 0x00a22523, 0x020814c1, 0x0379a668, 0x038f190c, 0x029e0b16, 0x0216e9fb, 0x02a18c3a, 0x003bf194}}, Y: Field{[10]uint32{0x00f7b2a5, 0x0111ecd5, 0x01d49737, 0x00726302, 0x038fcee7, 0x01661c20, 0x01b2498f, 0x006bcc07, 0x0014cef9, 0x0022995b}}}, + {X: Field{[10]uint32{0x004bbf82, 0x00dc2862, 0x015def07, 0x018b012a, 0x018adc79, 0x0226203c, 0x00021983, 0x0338b366, 0x03eff4d5, 0x00337687}}, Y: Field{[10]uint32{0x01e31d6c, 0x01726c12, 0x0235a0e5, 0x02ae14d8, 0x024417f9, 0x0291e058, 0x019174b4, 0x0370175e, 0x03fcb0c9, 0x0022f09b}}}, + {X: Field{[10]uint32{0x016cf0d4, 0x021a11ee, 0x03a3f938, 0x02b370e8, 0x00d46bb6, 0x01f7b750, 0x00b76d77, 0x02a84c4d, 0x01853454, 0x001bcfce}}, Y: Field{[10]uint32{0x00adba81, 0x03b1724b, 0x01637e4e, 0x02479592, 0x00b6e324, 0x029020d1, 0x03e5192e, 0x0286d6b9, 0x019c4f7c, 0x002a2e92}}}, + {X: Field{[10]uint32{0x014b13e4, 0x033577f9, 0x01ee8061, 0x01f61452, 0x03a2a362, 0x03636013, 0x0042065e, 0x03ee0faa, 0x01af91ab, 0x00394b44}}, Y: Field{[10]uint32{0x01cfff97, 0x00e384aa, 0x01069468, 0x00f438fb, 0x012e132a, 0x039cca17, 0x021f6ed4, 0x0159cb2c, 0x006d619e, 0x00167cc4}}}, + {X: Field{[10]uint32{0x027256ff, 0x0033e8e7, 0x02ac066c, 0x01a70c38, 0x038fb918, 0x00cacf2a, 0x0254d13b, 0x0072d915, 0x0336f0de, 0x00227fb1}}, Y: Field{[10]uint32{0x03e44274, 0x01156b81, 0x01ded46b, 0x036ed63d, 0x0173e708, 0x037f798b, 0x02b938d9, 0x0069b6da, 0x02e84d3e, 0x003e505e}}}, + {X: Field{[10]uint32{0x02b70b29, 0x036b0248, 0x03f7531b, 0x0082a240, 0x03522615, 0x000a1d27, 0x006ce733, 0x00154f3a, 0x035691b1, 0x00014503}}, Y: Field{[10]uint32{0x022dc024, 0x019f5caa, 0x00afd0dd, 0x002fe894, 0x00ad0acf, 0x007033a4, 0x021f4ce2, 0x0308f401, 0x022b9e02, 0x00246865}}}, + {X: Field{[10]uint32{0x01267b5c, 0x0243f21f, 0x00d09c0f, 0x03ae1548, 0x030579d0, 0x034cbe52, 0x035e199e, 0x02645c41, 0x01309310, 0x0000f058}}, Y: Field{[10]uint32{0x00ac64c3, 0x01f4dade, 0x00e51a5f, 0x03297a00, 0x01e9f156, 0x01a4eb00, 0x02a00107, 0x0036e40e, 0x00dfe404, 0x00354341}}}, + {X: Field{[10]uint32{0x03e8bac9, 0x00fbae26, 0x01fa8be1, 0x014a4474, 0x02a2d0b9, 0x00090154, 0x00b8a58f, 0x0008dc96, 0x010e63a5, 0x003f61da}}, Y: Field{[10]uint32{0x021b9225, 0x013fa922, 0x0247458e, 0x038eb144, 0x03b40f04, 0x011ff19a, 0x023ee352, 0x01a3d5be, 0x01acccb9, 0x00101b70}}}, + {X: Field{[10]uint32{0x01a12a81, 0x01d0d2f5, 0x01347ebc, 0x0381aa36, 0x0299005c, 0x01cecca3, 0x028ad599, 0x01e3ccb3, 0x01de017e, 0x00023934}}, Y: Field{[10]uint32{0x01a2a8ae, 0x0065006c, 0x036da429, 0x02a230c6, 0x02992baf, 0x02efc362, 0x00c843b4, 0x029975d1, 0x033e744c, 0x00318d23}}}, + {X: Field{[10]uint32{0x007743c2, 0x00e6831b, 0x03ff6ea7, 0x001059de, 0x02f49881, 0x029632aa, 0x03b6eebb, 0x0319e05c, 0x03cfea62, 0x000e0b1e}}, Y: Field{[10]uint32{0x01c5eb7d, 0x0154e69a, 0x035237cf, 0x0372bf34, 0x0267e9ad, 0x000703da, 0x01f7f27e, 0x01090d4f, 0x01da77e6, 0x00006429}}}, + {X: Field{[10]uint32{0x0114ed0f, 0x0364357e, 0x01d29e87, 0x03254efd, 0x0125b0da, 0x03a941e5, 0x01fa471b, 0x01201d4e, 0x034e74b8, 0x003d5aa2}}, Y: Field{[10]uint32{0x0096db8b, 0x00547ef0, 0x01a48c50, 0x00704e45, 0x008f9f20, 0x01a9ba89, 0x03881c65, 0x039848ea, 0x0108da57, 0x001515b6}}}, + {X: Field{[10]uint32{0x03965b80, 0x03f6c185, 0x02a044ec, 0x00b157c4, 0x003af365, 0x005ae031, 0x02f8ea2b, 0x0155e87f, 0x03fb6a5e, 0x002423a7}}, Y: Field{[10]uint32{0x038bc2ce, 0x0379d6a1, 0x02043562, 0x0253b5ad, 0x03b9c010, 0x03af0c4d, 0x0182ca07, 0x0133c3e0, 0x00c9d1b1, 0x002fab8a}}}, + {X: Field{[10]uint32{0x02c86ef4, 0x00b9ba6f, 0x01e787ef, 0x012e6750, 0x033fad25, 0x014a4d3a, 0x03225330, 0x0207f45a, 0x03184333, 0x0029b0c1}}, Y: Field{[10]uint32{0x023fb818, 0x024015d8, 0x026f44bf, 0x020817b8, 0x029e266f, 0x000c271c, 0x01129e4e, 0x01440813, 0x0286a60d, 0x0011ea68}}}, + {X: Field{[10]uint32{0x00b3e903, 0x019bade6, 0x01361047, 0x038d28a6, 0x0230a652, 0x00af882b, 0x01461635, 0x00b0980b, 0x01866c3e, 0x002522eb}}, Y: Field{[10]uint32{0x01c35164, 0x01312136, 0x00d3395b, 0x0129da86, 0x004321da, 0x02457783, 0x0043b0f0, 0x0228ae67, 0x0222ad47, 0x000c34c1}}}, + {X: Field{[10]uint32{0x00f6a3f2, 0x03a13487, 0x02c9f0c9, 0x0373e5b4, 0x029d536e, 0x021e0b4d, 0x03881251, 0x005eb9dd, 0x039dcb8a, 0x0035b24a}}, Y: Field{[10]uint32{0x02de09b9, 0x00412bca, 0x0207b9e0, 0x00923b08, 0x030ed686, 0x02bb1752, 0x030ae881, 0x020dde5e, 0x03a09351, 0x003764d9}}}, + {X: Field{[10]uint32{0x01566abd, 0x03bc3f59, 0x0232854c, 0x00269d6b, 0x037b0822, 0x0137e00b, 0x00641ca6, 0x004f591b, 0x017b7d8b, 0x003e7fcf}}, Y: Field{[10]uint32{0x02deec98, 0x0396580c, 0x011c8c84, 0x00a2861c, 0x01b9269d, 0x00f60474, 0x02230224, 0x008257dc, 0x019e1f19, 0x002b1618}}}, + {X: Field{[10]uint32{0x02c8d5e0, 0x00a3dba4, 0x014e1c35, 0x01fe0d34, 0x017f4e76, 0x00a0dfb5, 0x009a9204, 0x0383dc08, 0x01ba3a70, 0x000f6b87}}, Y: Field{[10]uint32{0x000f797f, 0x0134154a, 0x0332e08b, 0x0367aa64, 0x015c7816, 0x03ffa1f2, 0x03cdfad3, 0x03cb3f87, 0x028d6ea1, 0x001eb891}}}, + {X: Field{[10]uint32{0x01b49937, 0x012c0746, 0x007cad0b, 0x01f836ef, 0x008ffd22, 0x03caabac, 0x03ffe130, 0x024df272, 0x01056fcc, 0x0009c114}}, Y: Field{[10]uint32{0x03fa4397, 0x029a63c7, 0x02ad4d08, 0x03d710a1, 0x01bbd801, 0x01875b1d, 0x00d37246, 0x03f7f888, 0x02546c24, 0x00045d9a}}}, + {X: Field{[10]uint32{0x00defd22, 0x00359788, 0x00865bb9, 0x01599271, 0x012024c5, 0x018beea0, 0x00340752, 0x0183bb35, 0x03f96c32, 0x003e7657}}, Y: Field{[10]uint32{0x03a13c2d, 0x0009af05, 0x01dda24b, 0x0128696c, 0x030a89d5, 0x00c11cc2, 0x02632ba8, 0x00504602, 0x03fd8f74, 0x000df2fd}}}, + {X: Field{[10]uint32{0x01a7021f, 0x02d5f171, 0x0021448a, 0x02ef6e64, 0x02ff0a86, 0x019b3ef9, 0x018c6d5b, 0x019fa7fb, 0x0318f90f, 0x00013a37}}, Y: Field{[10]uint32{0x02a621f5, 0x024ff6bc, 0x0329ea22, 0x03f4ea0d, 0x000e9bad, 0x02cd210f, 0x03a2b1b3, 0x01904d14, 0x00c5ccf5, 0x001f9a7e}}}, + {X: Field{[10]uint32{0x02ffef9f, 0x016dde74, 0x01821c8a, 0x02f4ef8d, 0x00ab3d32, 0x00f19916, 0x02783836, 0x01fec86e, 0x012a710a, 0x00230a93}}, Y: Field{[10]uint32{0x025511d6, 0x016ab18d, 0x01205caa, 0x0247fce7, 0x03f82d8f, 0x006f595d, 0x01715157, 0x00960d18, 0x007d27e4, 0x00354c91}}}, + {X: Field{[10]uint32{0x03654b75, 0x010f3be1, 0x00e19631, 0x007b52c1, 0x02c10e81, 0x023eb9cb, 0x00677afa, 0x027339bf, 0x03a01974, 0x000a2dfc}}, Y: Field{[10]uint32{0x005ec782, 0x035698e1, 0x03e392ce, 0x00c699e3, 0x01e241ba, 0x01c7d287, 0x017c881e, 0x02ace456, 0x01eb3245, 0x0000c11c}}}, + {X: Field{[10]uint32{0x01be416b, 0x01b5f6d6, 0x0300808f, 0x025033d2, 0x02d89f64, 0x02667b23, 0x03b5acb0, 0x039cb095, 0x010ffcb8, 0x0032d1d3}}, Y: Field{[10]uint32{0x016622fd, 0x00c146a8, 0x000c7e3a, 0x02cfbff0, 0x029a0e59, 0x01d67e15, 0x039a9508, 0x00f2ee2a, 0x00cefc29, 0x003fdf34}}}, + {X: Field{[10]uint32{0x0055b36c, 0x01ecd7d0, 0x023f5bd5, 0x00d0ba65, 0x011a1800, 0x0378a929, 0x01567fbe, 0x02f10099, 0x01825dbe, 0x0030cf9a}}, Y: Field{[10]uint32{0x0146be18, 0x023b0b31, 0x01e0db79, 0x02d64694, 0x02082c0c, 0x0266ac19, 0x03b50615, 0x01973894, 0x03f57ce2, 0x0008bfcf}}}, + {X: Field{[10]uint32{0x01bd2237, 0x01060e06, 0x00a0eee3, 0x0116cf43, 0x03257e07, 0x01112a6a, 0x02441a84, 0x01c48dc6, 0x010644d3, 0x00212ff0}}, Y: Field{[10]uint32{0x009ef6f1, 0x00861eca, 0x0235ae1c, 0x00847b38, 0x03afd7f4, 0x00f9065e, 0x03d13ffb, 0x03dc1b0c, 0x02d57b7a, 0x001f2f95}}}, + {X: Field{[10]uint32{0x017b713a, 0x026594fe, 0x008dc735, 0x02296c12, 0x03606302, 0x01f820d7, 0x000f003f, 0x00913bf5, 0x02ecd53b, 0x000270c4}}, Y: Field{[10]uint32{0x02b76d14, 0x01126c53, 0x01fe6165, 0x0297fb90, 0x0059698b, 0x00622d3a, 0x00d0b160, 0x01dfbe15, 0x010f58fc, 0x00046f2f}}}, + {X: Field{[10]uint32{0x0315cefc, 0x02a0b72b, 0x004332d0, 0x006b8074, 0x01d474f6, 0x00eef3c8, 0x0183bf4e, 0x01bcb433, 0x0359a22d, 0x001701ab}}, Y: Field{[10]uint32{0x0322aae8, 0x02059690, 0x02be2904, 0x02c50978, 0x0341fbef, 0x0319a6ab, 0x006d70d6, 0x0197f6a3, 0x03e9f1c2, 0x0011dad2}}}, + {X: Field{[10]uint32{0x01b6bdcf, 0x03516cfc, 0x002bf2d6, 0x01c72118, 0x03f44f0d, 0x02bce7ae, 0x000eb547, 0x03b50ed3, 0x01c681a3, 0x001ddc96}}, Y: Field{[10]uint32{0x033bf754, 0x037861fe, 0x02bba22f, 0x0273d58f, 0x03d6742b, 0x0320d199, 0x00448514, 0x02162bbb, 0x03535481, 0x0022a74d}}}, + {X: Field{[10]uint32{0x01266842, 0x00831410, 0x0283ce38, 0x03101d98, 0x020174b8, 0x03409137, 0x024328b4, 0x03074c53, 0x001eae1f, 0x002cdc18}}, Y: Field{[10]uint32{0x00125ac0, 0x00da0d2f, 0x029323e1, 0x02a9010a, 0x03eda7b5, 0x036603b8, 0x02a9abc8, 0x030ec1d4, 0x00792174, 0x0023bc14}}}, + {X: Field{[10]uint32{0x02fe6584, 0x022b23b6, 0x028bf824, 0x015ac054, 0x02780868, 0x01c25c81, 0x032ad406, 0x01924a91, 0x02c07f8d, 0x0016be52}}, Y: Field{[10]uint32{0x022daf1a, 0x030e59b9, 0x016552a9, 0x035e33f9, 0x00b40dff, 0x03bd7d5b, 0x01f32efc, 0x03794475, 0x03ce57ea, 0x00229531}}}, + {X: Field{[10]uint32{0x030586c6, 0x032e39d6, 0x0194581a, 0x007cfe51, 0x034f84b4, 0x0160cbcd, 0x01d4f23c, 0x01c154e1, 0x019ce2e8, 0x0023f8f0}}, Y: Field{[10]uint32{0x01728c28, 0x013d6b24, 0x03860067, 0x005c055b, 0x012f5e20, 0x02bc64f2, 0x0314d491, 0x01130e90, 0x019fd16f, 0x003e48c2}}}, + {X: Field{[10]uint32{0x03ac9a71, 0x00a23f04, 0x02fc3b5f, 0x01fe8dee, 0x01e531d1, 0x026d97ad, 0x01211b30, 0x02f4797e, 0x021d2642, 0x00356025}}, Y: Field{[10]uint32{0x034185cb, 0x0225fa46, 0x03650e4f, 0x03716ce3, 0x02d9678c, 0x02c4bea1, 0x0250a6e0, 0x022d0cdb, 0x0154337e, 0x00140301}}}, + {X: Field{[10]uint32{0x0295e82b, 0x033efc50, 0x01405256, 0x019d6a71, 0x02234e79, 0x019e430c, 0x02460338, 0x02988d27, 0x00ed529f, 0x00009577}}, Y: Field{[10]uint32{0x01799815, 0x03d2d29f, 0x00b100c8, 0x033653db, 0x035dfba7, 0x02a918c5, 0x03253d3f, 0x0071eff0, 0x01c47f3e, 0x001fbb6a}}}, + {X: Field{[10]uint32{0x00891557, 0x02f908bb, 0x004580bd, 0x00e2a376, 0x031a27c3, 0x03923957, 0x00476a4a, 0x01147eae, 0x03a79240, 0x0012dfaf}}, Y: Field{[10]uint32{0x01b59085, 0x00f60fa1, 0x012848c6, 0x035f90a1, 0x02c12622, 0x035fb604, 0x00a23cfa, 0x00d7d83f, 0x00e9f891, 0x0037ec98}}}, + {X: Field{[10]uint32{0x032fbf28, 0x01fd5547, 0x00c7d8f4, 0x0274ef45, 0x01311956, 0x0319dc67, 0x035819e0, 0x024aa68e, 0x03809e60, 0x00246741}}, Y: Field{[10]uint32{0x003d8094, 0x02bca0e1, 0x024fdcbc, 0x03528c38, 0x00c204d3, 0x02635846, 0x03b2fa50, 0x003cb3b2, 0x02f876d7, 0x003282da}}}, + {X: Field{[10]uint32{0x0070ee78, 0x03754da3, 0x03f42393, 0x01ad67ba, 0x009b8c89, 0x02b8d0a9, 0x02d73bd5, 0x02a5116f, 0x03a9de89, 0x00119a19}}, Y: Field{[10]uint32{0x02e042e1, 0x03559e2a, 0x02029385, 0x024d3ba5, 0x019cbb9f, 0x022dfb42, 0x01bd6cae, 0x01608c1e, 0x0307b3e1, 0x000a9765}}}, + {X: Field{[10]uint32{0x01db3f7b, 0x0172e8b0, 0x01f3cd98, 0x016ef995, 0x01fc740d, 0x03dc4963, 0x021526fc, 0x01145e24, 0x0108c878, 0x001c49d3}}, Y: Field{[10]uint32{0x034b25e0, 0x01237bfe, 0x03f560d8, 0x0299aaf9, 0x033cdd2c, 0x010185de, 0x01652bc4, 0x0050d3e3, 0x0130a5be, 0x00382bc0}}}, + {X: Field{[10]uint32{0x02be2bcd, 0x03838ddf, 0x0111fa0a, 0x01b47ecc, 0x03b6e825, 0x013981a3, 0x00693c1f, 0x0090744f, 0x00482d25, 0x00291ba4}}, Y: Field{[10]uint32{0x00474eda, 0x02486fa5, 0x0111140f, 0x02ff56b9, 0x01fdd708, 0x0185c9ab, 0x026e7ac9, 0x02ada604, 0x000cf22a, 0x001d59dc}}}, + {X: Field{[10]uint32{0x01e84abd, 0x000afea9, 0x03b5baec, 0x022e89b4, 0x0110ea91, 0x01ef9a14, 0x0073b0f7, 0x00449a16, 0x0391f243, 0x003dd642}}, Y: Field{[10]uint32{0x02708999, 0x024d6918, 0x00e2eded, 0x02357a8a, 0x002d2512, 0x016372f2, 0x035d6cc8, 0x02534326, 0x00f8594c, 0x00120612}}}, + {X: Field{[10]uint32{0x028c2edf, 0x00bb7790, 0x023bc9a2, 0x037ebfd7, 0x004f966e, 0x0263c1e4, 0x0139d643, 0x03876b6b, 0x00e51282, 0x000b5eaa}}, Y: Field{[10]uint32{0x035d9d79, 0x016d868c, 0x01fb5763, 0x0285c233, 0x01a30b4d, 0x005d57e7, 0x033ea24f, 0x008267ac, 0x033c4203, 0x0004ac84}}}, + {X: Field{[10]uint32{0x0236d0e3, 0x0143ea5c, 0x00607995, 0x009d7d96, 0x00822809, 0x0207c4d7, 0x03113a55, 0x0311ff67, 0x03403302, 0x00244c4f}}, Y: Field{[10]uint32{0x00838a77, 0x00fd89e4, 0x03f27c32, 0x0308b833, 0x03aa9e96, 0x03c84a16, 0x01daee91, 0x0012fd18, 0x00075e78, 0x003e2dbb}}}, + {X: Field{[10]uint32{0x006743cb, 0x0128755b, 0x010de2f4, 0x0070e867, 0x01e0be03, 0x02c51bef, 0x028e86e1, 0x02169e11, 0x011909d3, 0x00368920}}, Y: Field{[10]uint32{0x00348cbf, 0x027bd9d0, 0x01a666d3, 0x02d874b3, 0x0305d418, 0x026cdf11, 0x00625111, 0x03dbbbcb, 0x017b5f76, 0x00301f22}}}, + {X: Field{[10]uint32{0x01e82220, 0x00809a37, 0x01bd62e8, 0x03e5bc07, 0x02760ec3, 0x03a7b50c, 0x01e6082d, 0x030b8fed, 0x02240b1b, 0x002578da}}, Y: Field{[10]uint32{0x00e1cb63, 0x017a7447, 0x03d01766, 0x021c7878, 0x0352a74a, 0x032d080a, 0x003b209d, 0x0128ea3c, 0x00d73abc, 0x002f9a64}}}, + {X: Field{[10]uint32{0x02bc6e8b, 0x020ccfcf, 0x01cdf488, 0x021c5411, 0x01afe54a, 0x007e0478, 0x03489e45, 0x01d6c315, 0x00603abd, 0x0022c16c}}, Y: Field{[10]uint32{0x0340fb39, 0x003d3f9f, 0x0179dbb3, 0x0056b358, 0x0027f5b6, 0x0206f69f, 0x01e2ddce, 0x0103ee22, 0x008145db, 0x0007443e}}}, + {X: Field{[10]uint32{0x03020f54, 0x0274c33c, 0x0372855a, 0x02df7363, 0x01d43ec0, 0x0072e0ca, 0x00bbb2ba, 0x00c9e9d4, 0x023b764a, 0x003feaf2}}, Y: Field{[10]uint32{0x01d0f05a, 0x021510db, 0x01302cf5, 0x0172d828, 0x00c79196, 0x013a652d, 0x02fb393a, 0x0289816c, 0x0265c90b, 0x0024e5c2}}}, + {X: Field{[10]uint32{0x03866c72, 0x03ec14c2, 0x027c0a18, 0x01a2c4cf, 0x02d35148, 0x01d4a662, 0x00f05fa9, 0x0392a63c, 0x02efef35, 0x002cea16}}, Y: Field{[10]uint32{0x036005e2, 0x011b47d6, 0x0275238f, 0x031fa228, 0x0009ee78, 0x0139c03a, 0x016b36c5, 0x016e780f, 0x02e1c21e, 0x000c0457}}}, + {X: Field{[10]uint32{0x015b7ab5, 0x01494332, 0x012d5d15, 0x00cbaf2d, 0x015b78fc, 0x03d99b54, 0x01c56590, 0x00f3c82e, 0x015f4c23, 0x00293c7f}}, Y: Field{[10]uint32{0x01faa0da, 0x00f58720, 0x02d52c36, 0x00962764, 0x03337543, 0x03148671, 0x00419fe0, 0x00496111, 0x0385726a, 0x00247467}}}, + {X: Field{[10]uint32{0x015bbb0a, 0x00f98900, 0x03c98bec, 0x00df4a6c, 0x019eb146, 0x02d62d7b, 0x03f39232, 0x033c4e52, 0x034b7bae, 0x0025ee12}}, Y: Field{[10]uint32{0x01162435, 0x01bd254b, 0x03bf48b8, 0x00c361b6, 0x025eac7f, 0x02a4ad2d, 0x0093d73c, 0x01ece84d, 0x00afbe8e, 0x00125f6d}}}, + {X: Field{[10]uint32{0x006312b3, 0x01d34665, 0x0169a1c2, 0x0208f321, 0x03a9de5f, 0x006d6d5e, 0x0278e965, 0x00d999d7, 0x00d9203e, 0x000b3ae8}}, Y: Field{[10]uint32{0x02d2b437, 0x029d70e3, 0x0040a488, 0x02db1aad, 0x00b7805d, 0x035df062, 0x030a88a6, 0x033f7907, 0x0286f042, 0x003530bf}}}, + {X: Field{[10]uint32{0x032b7009, 0x02e1a88f, 0x01e10e91, 0x032f1a90, 0x00912391, 0x0120da66, 0x0257b78b, 0x02b28a2f, 0x01306cdd, 0x002ae2c6}}, Y: Field{[10]uint32{0x034172cf, 0x00a1940d, 0x02a03351, 0x0144da24, 0x027abed6, 0x02992081, 0x00472a17, 0x0286ba76, 0x03dc79fb, 0x003f6eea}}}, + {X: Field{[10]uint32{0x0215b394, 0x0034c146, 0x01acd6bb, 0x01742a8b, 0x03c14970, 0x024e3c9a, 0x02ac2b59, 0x0102c55f, 0x00291ff1, 0x00009d8c}}, Y: Field{[10]uint32{0x01374ee6, 0x01412b12, 0x01875a91, 0x01e61bb3, 0x00553594, 0x014bd728, 0x0240838c, 0x02e78bd1, 0x032a38dc, 0x0030adac}}}, + {X: Field{[10]uint32{0x02fc78c5, 0x01e7ad72, 0x02d8e6cc, 0x03423197, 0x009e703f, 0x03a77449, 0x011d7933, 0x014531fe, 0x01bd1cc1, 0x0008b47b}}, Y: Field{[10]uint32{0x00a85efe, 0x01959e30, 0x03f7a05e, 0x03048de3, 0x02a93942, 0x00228e05, 0x0024fca2, 0x039d044c, 0x03eea53a, 0x001d14f9}}}, + {X: Field{[10]uint32{0x00ffe222, 0x01f26f6b, 0x01b7cc8e, 0x009d7b3b, 0x00b61465, 0x02f6cfee, 0x00fa5590, 0x027a509c, 0x01c0c572, 0x001c361a}}, Y: Field{[10]uint32{0x02ec30c5, 0x0372ee3d, 0x01657115, 0x01d2704c, 0x00f8d414, 0x0230b0ea, 0x03baec84, 0x023ed185, 0x01328ce7, 0x0012ff2b}}}, + {X: Field{[10]uint32{0x011b1647, 0x0093ae1e, 0x0097dd4a, 0x0301aedf, 0x00ed9039, 0x02a5ef4a, 0x0360dccd, 0x015e0993, 0x01deda8d, 0x002896d1}}, Y: Field{[10]uint32{0x0243db8f, 0x031a362a, 0x00c7dfe1, 0x0078bc0c, 0x00f306f1, 0x0310e999, 0x03765554, 0x036558c8, 0x0183fd2a, 0x0023f612}}}, + {X: Field{[10]uint32{0x031024b8, 0x02a29d0e, 0x025cf39c, 0x0052e5d6, 0x033e77fa, 0x01cdc19b, 0x02383366, 0x01f0356a, 0x016c9b23, 0x00208ff3}}, Y: Field{[10]uint32{0x0024dde0, 0x03c5ad51, 0x01d72198, 0x012f4719, 0x01d1433e, 0x02db50d1, 0x01c2ba3b, 0x03cb77a6, 0x004d29a4, 0x0039a469}}}, + {X: Field{[10]uint32{0x02158d0c, 0x01b13396, 0x0033a3a9, 0x0349bb49, 0x01ee594b, 0x00e534c1, 0x02b1247d, 0x02bbd90c, 0x02638244, 0x0000e696}}, Y: Field{[10]uint32{0x026a8023, 0x03e2c9d8, 0x016cd32d, 0x010d4315, 0x00ee4b9f, 0x00932c42, 0x03ff37ea, 0x02125355, 0x0139dd8b, 0x00051f3b}}}, + {X: Field{[10]uint32{0x03206487, 0x012a95ac, 0x035f8de9, 0x02ed21e7, 0x022a18f6, 0x006c9de5, 0x00aaf7b8, 0x02cb701d, 0x03b5b85b, 0x0023e7fa}}, Y: Field{[10]uint32{0x0210c2a2, 0x021ab2fd, 0x0093c32a, 0x03caada8, 0x01dc7474, 0x00ad5ecf, 0x037dbdec, 0x01680038, 0x03d6d417, 0x001236ba}}}, + {X: Field{[10]uint32{0x0143f60c, 0x01e80f64, 0x013f804f, 0x014cdba7, 0x016a08db, 0x03dad38d, 0x009158a5, 0x00215914, 0x03142f50, 0x003f05be}}, Y: Field{[10]uint32{0x001f7a36, 0x033e0137, 0x02eaf58b, 0x0139acca, 0x03402758, 0x036e17f9, 0x034ada59, 0x02dce843, 0x02f27e02, 0x0023a4c9}}}, + {X: Field{[10]uint32{0x01c5a281, 0x024921a1, 0x01d788e2, 0x0007d080, 0x03eaecae, 0x021faea0, 0x015d8f09, 0x01bdba44, 0x02a71744, 0x001f6c27}}, Y: Field{[10]uint32{0x0215742b, 0x00f8c9f0, 0x03864273, 0x019f169b, 0x0279fd21, 0x004bf45f, 0x036b2adc, 0x011577dc, 0x00ee426d, 0x002d11a7}}}, + {X: Field{[10]uint32{0x00d9a57e, 0x03ef2529, 0x030b8564, 0x03d71fb2, 0x023df7ca, 0x007e34f1, 0x0256fdab, 0x03bc70fa, 0x03f528ba, 0x00351746}}, Y: Field{[10]uint32{0x02aeccc1, 0x005cb845, 0x02191c1a, 0x0344f016, 0x00ad0c84, 0x006b5c00, 0x0121d3d8, 0x003a2473, 0x01846483, 0x0024789a}}}, + {X: Field{[10]uint32{0x01f03901, 0x0286a45d, 0x0278ad43, 0x0266ba5d, 0x016a4d9c, 0x01e89aec, 0x00a9ffaa, 0x02176154, 0x03751b6f, 0x000febc2}}, Y: Field{[10]uint32{0x0044328f, 0x01710d86, 0x01368b55, 0x0050ee36, 0x00be775d, 0x00e18c47, 0x02aa39f6, 0x00f3d972, 0x022aa4e4, 0x00229741}}}, + {X: Field{[10]uint32{0x02efd121, 0x01ac1b1d, 0x03107492, 0x028cec49, 0x001eefdb, 0x019787b0, 0x00c5e39c, 0x0291c9e7, 0x00be8e08, 0x00151823}}, Y: Field{[10]uint32{0x0140f038, 0x02278831, 0x01afdcb7, 0x01d9c741, 0x039bdc27, 0x03263f0a, 0x02c5f91c, 0x03e07923, 0x01bc40de, 0x00029da5}}}, + {X: Field{[10]uint32{0x009823ec, 0x03560364, 0x02d4664d, 0x03693865, 0x02e8a201, 0x00ed5a5c, 0x00e69552, 0x03f350d9, 0x0189050d, 0x00156683}}, Y: Field{[10]uint32{0x00dc71c3, 0x03a014ba, 0x027b4c46, 0x00ac1a9a, 0x035641e3, 0x021fd654, 0x01b8d5c0, 0x022e433b, 0x01add652, 0x001efe38}}}, + {X: Field{[10]uint32{0x00f467a8, 0x025ae52b, 0x039c31a9, 0x02a42c19, 0x00bb305e, 0x00797f0a, 0x0248c344, 0x02e7cac5, 0x0058b5e2, 0x00059ba2}}, Y: Field{[10]uint32{0x02e5bdb2, 0x008168e4, 0x01d2af64, 0x00df7432, 0x00dc1b7c, 0x0023e665, 0x018a6b91, 0x03ed0ab3, 0x006dff82, 0x002726cc}}}, + {X: Field{[10]uint32{0x00fe1941, 0x0369ce0e, 0x025a8d41, 0x025317bf, 0x02e5284f, 0x02b90e3b, 0x00ec5fc3, 0x020eeaa5, 0x028ce66e, 0x001038a7}}, Y: Field{[10]uint32{0x01acb2dc, 0x0062134e, 0x009c3955, 0x013ec39c, 0x0384ae68, 0x00e88f42, 0x03154e27, 0x01e1a073, 0x031cc01e, 0x001f1c7d}}}, + {X: Field{[10]uint32{0x02d4ee7e, 0x0110e01c, 0x004081a8, 0x00f6fd9d, 0x006aeb8b, 0x01986d00, 0x007fc764, 0x027399fe, 0x00f9eb65, 0x001a0a72}}, Y: Field{[10]uint32{0x0222913b, 0x001a5172, 0x01908ea5, 0x02ccc13f, 0x036647fc, 0x03a7fcc2, 0x02825225, 0x03701553, 0x030a8332, 0x00074d54}}}, + {X: Field{[10]uint32{0x03658196, 0x00d75044, 0x00e7adbb, 0x01010b44, 0x03e25a25, 0x038abc8d, 0x0393b136, 0x027f4e4c, 0x005a322e, 0x00128ff8}}, Y: Field{[10]uint32{0x0101574c, 0x01c0631e, 0x02ea1f14, 0x0115fb7a, 0x0178dbdc, 0x03c2ac5d, 0x03c40d9e, 0x01d906a4, 0x01f8d452, 0x00216690}}}, + {X: Field{[10]uint32{0x02a44f94, 0x01784066, 0x0338225a, 0x030805df, 0x029e9dde, 0x01919f30, 0x0167ad5a, 0x03acbb05, 0x03c9a675, 0x00379605}}, Y: Field{[10]uint32{0x00f723a4, 0x01959eb3, 0x00af5ec3, 0x005d323f, 0x0271b45e, 0x0352fc40, 0x017e6256, 0x00c4737c, 0x03d05413, 0x0010143a}}}, + {X: Field{[10]uint32{0x0262a108, 0x03697ad5, 0x03e7a155, 0x02cc6d47, 0x00daa7b9, 0x03cf63ce, 0x03df1a26, 0x03d0442a, 0x02454f07, 0x003f78a4}}, Y: Field{[10]uint32{0x0327808a, 0x037f722d, 0x0371ed98, 0x015b901c, 0x03f09d17, 0x031b1c67, 0x03347a3a, 0x03a4a733, 0x02d37b39, 0x003ca939}}}, + {X: Field{[10]uint32{0x03f42436, 0x02a43b7b, 0x022e8a43, 0x00574230, 0x01b09174, 0x029dca18, 0x03c536d6, 0x022e85db, 0x00fb6eb9, 0x003ca34f}}, Y: Field{[10]uint32{0x0279d1bf, 0x0009cd44, 0x00b61e9d, 0x02310b9b, 0x001971fe, 0x022252a9, 0x003dc82d, 0x00943781, 0x022bb328, 0x0011422f}}}, + {X: Field{[10]uint32{0x0316e3ee, 0x01ee545f, 0x038c7011, 0x0259083d, 0x037bb654, 0x00669b7d, 0x0192afb1, 0x02d6df42, 0x00304d1c, 0x0031d957}}, Y: Field{[10]uint32{0x031dfdfd, 0x009f8b79, 0x0070d2e4, 0x02f946e4, 0x01a348b0, 0x00379e70, 0x0186b1cb, 0x00c3712e, 0x02c2cdb7, 0x00226058}}}, + {X: Field{[10]uint32{0x03b4b147, 0x00fb2801, 0x00d0d7ae, 0x01d3c856, 0x0053ffba, 0x02d8bd36, 0x0167936e, 0x03b999c7, 0x03c72fa3, 0x00395f65}}, Y: Field{[10]uint32{0x01fecd64, 0x031c83f8, 0x00958c07, 0x01811f0d, 0x031ed426, 0x019a3284, 0x02b80b9a, 0x00a5d646, 0x012ca3d9, 0x002c78c0}}}, + {X: Field{[10]uint32{0x022b0c01, 0x037e3078, 0x02a44bcc, 0x01edd9a1, 0x036cd3d3, 0x03805332, 0x0244f92f, 0x0096ff01, 0x02421550, 0x003ab6a1}}, Y: Field{[10]uint32{0x01dfeeed, 0x03b5f482, 0x03e9106a, 0x02b2bde7, 0x0107152a, 0x0103e0a9, 0x03c37c55, 0x006ec045, 0x017d71d7, 0x002240d7}}}, + {X: Field{[10]uint32{0x020d0e25, 0x01fb2139, 0x03e27556, 0x03e5dd40, 0x0362dbf8, 0x0047e8ff, 0x01d7e8e0, 0x0086627e, 0x027e3f17, 0x000f9d89}}, Y: Field{[10]uint32{0x021160b6, 0x02288d9b, 0x0087182d, 0x031f8bf8, 0x02416f8b, 0x01f8e5ce, 0x013001ec, 0x031b6e91, 0x03909631, 0x002860d5}}}, + {X: Field{[10]uint32{0x01a3df70, 0x00b49424, 0x0350c697, 0x00d46399, 0x0205de72, 0x0359af9f, 0x0279e692, 0x00bcd408, 0x03d89c26, 0x00284765}}, Y: Field{[10]uint32{0x012a69dd, 0x0071b6f5, 0x00b71fd3, 0x01dfa522, 0x0144768d, 0x02e22459, 0x02e48fea, 0x02c05b7c, 0x00a3dd6f, 0x0034637e}}}, + {X: Field{[10]uint32{0x01f20651, 0x03d0887d, 0x01787922, 0x0023f563, 0x01a5ab52, 0x02b9f30a, 0x0154bf8d, 0x0301bbb7, 0x0375cefe, 0x002c5b8f}}, Y: Field{[10]uint32{0x02d0eb2d, 0x021d86a9, 0x0381da75, 0x024314e6, 0x010233ae, 0x01a42624, 0x03c19891, 0x00cbb5d3, 0x02b45a6e, 0x0015feff}}}, + {X: Field{[10]uint32{0x034628b2, 0x0095e131, 0x03d9fbeb, 0x02cd128c, 0x00837339, 0x02bc51e9, 0x03564c2f, 0x03a9ba7a, 0x000a3f73, 0x000df7a0}}, Y: Field{[10]uint32{0x02254050, 0x007b04f9, 0x020a02f4, 0x01b3e8ab, 0x03e33fc9, 0x0165aab5, 0x016b7e53, 0x01600c06, 0x02599da5, 0x00164ce4}}}, + {X: Field{[10]uint32{0x03d68055, 0x03b10e32, 0x021f19be, 0x02c24c96, 0x024ae57f, 0x02db9aea, 0x00b781d8, 0x02aebdbf, 0x012d65b3, 0x001bda10}}, Y: Field{[10]uint32{0x038d3bcc, 0x00c550cb, 0x02f08ec0, 0x00cfbd26, 0x0127dc14, 0x0086aed7, 0x03310420, 0x01c6f002, 0x019d4061, 0x002213f5}}}, + {X: Field{[10]uint32{0x036e4366, 0x0240b5b2, 0x00a79572, 0x026bd82f, 0x03980f1f, 0x014bc1c3, 0x00f0ce2b, 0x03898493, 0x029e6bc5, 0x002451e6}}, Y: Field{[10]uint32{0x002f5288, 0x00d746a7, 0x0364aef9, 0x0090044b, 0x03479325, 0x02c4ef89, 0x036025d4, 0x0110d667, 0x030a22de, 0x0008c13d}}}, + {X: Field{[10]uint32{0x0119bd8a, 0x02306513, 0x03701835, 0x031d29b1, 0x014cceab, 0x005df732, 0x01e7c1e4, 0x021c2230, 0x00df36ac, 0x0022e9ac}}, Y: Field{[10]uint32{0x02ab9ed4, 0x01fe1658, 0x005baad1, 0x006de26a, 0x01989dff, 0x01deb1d5, 0x02abe8a1, 0x00578a48, 0x020ee9d5, 0x003a5adc}}}, + {X: Field{[10]uint32{0x01d567cc, 0x02b2deca, 0x02c9ef4a, 0x01a55393, 0x00f11b8a, 0x00d5453c, 0x0359a8ca, 0x00ff3163, 0x0195871f, 0x002ac548}}, Y: Field{[10]uint32{0x03267fb4, 0x03a80dc3, 0x0019c3c8, 0x0329946d, 0x01965ec1, 0x017e23fc, 0x0099ad17, 0x02f6850a, 0x0148623e, 0x0030776b}}}, + {X: Field{[10]uint32{0x011600c5, 0x00b39f55, 0x00756e55, 0x011b5357, 0x026ca45c, 0x0066b708, 0x00e6448e, 0x00af4070, 0x03485eb9, 0x001fac8f}}, Y: Field{[10]uint32{0x03c57ac5, 0x0309ec69, 0x03328b3d, 0x025ea161, 0x01a300ef, 0x00f8c315, 0x033de076, 0x02e4e41e, 0x03124278, 0x00254fa6}}}, + {X: Field{[10]uint32{0x0221ee17, 0x00924153, 0x01f0a2f6, 0x02dc3bac, 0x01e0212f, 0x01624124, 0x0120a922, 0x01c0371d, 0x002ba4b2, 0x002c8fd3}}, Y: Field{[10]uint32{0x03598530, 0x02b83762, 0x03811457, 0x01f98d27, 0x028a2c28, 0x0040e1b0, 0x007d5a5c, 0x02cebcb3, 0x03729e95, 0x0028e2d9}}}, + {X: Field{[10]uint32{0x0369c2a4, 0x002addc9, 0x024a90a1, 0x00badd50, 0x0067a6c1, 0x01b3eb59, 0x001a02b9, 0x0156da8b, 0x0323387e, 0x002174b9}}, Y: Field{[10]uint32{0x00e4d303, 0x01145432, 0x031d0db8, 0x033c8684, 0x00ded380, 0x0352050d, 0x03077fb7, 0x0262bc06, 0x01ac2238, 0x001c9eaf}}}, + {X: Field{[10]uint32{0x0309273d, 0x02369b26, 0x014be9fd, 0x0006229e, 0x0254ae69, 0x019a7d9a, 0x0383d59e, 0x02933104, 0x015e08db, 0x0009f05c}}, Y: Field{[10]uint32{0x01b1a266, 0x0357352d, 0x03f9d998, 0x03173cae, 0x03e16e22, 0x039fcc3c, 0x017d8841, 0x01b288d4, 0x0254306e, 0x0009d9f2}}}, + {X: Field{[10]uint32{0x015eed89, 0x0173e2c2, 0x0350f446, 0x01090200, 0x0342cf40, 0x03e169aa, 0x00c4fb56, 0x017a3a78, 0x00d37f9a, 0x0039c2e3}}, Y: Field{[10]uint32{0x030cb31a, 0x012c3f9a, 0x014fe5ec, 0x0018c661, 0x01faacdf, 0x01d4232b, 0x034e93c0, 0x02346e5c, 0x00589478, 0x000b8f63}}}, + {X: Field{[10]uint32{0x01e956b9, 0x00804f37, 0x0365ee2c, 0x0187439f, 0x0293932c, 0x00fc1dab, 0x0081a39f, 0x020e5a63, 0x00552405, 0x00388f75}}, Y: Field{[10]uint32{0x00cf77c9, 0x036da2de, 0x0315b1dc, 0x01e72d4c, 0x0052b57e, 0x022a82d9, 0x01cef85a, 0x022ae2fd, 0x03d000cd, 0x001b14f2}}}, + {X: Field{[10]uint32{0x01919c9f, 0x001ce653, 0x003b7d7a, 0x00c8431a, 0x039aaf08, 0x01d9df2e, 0x0209f2c4, 0x02604c46, 0x0381ccc4, 0x0017a48f}}, Y: Field{[10]uint32{0x00306873, 0x02e5fd0e, 0x019f7738, 0x01f3ed45, 0x02705966, 0x03dc153f, 0x00e64a8a, 0x02b41bf8, 0x0112e64c, 0x0018135c}}}, + {X: Field{[10]uint32{0x00142507, 0x00deaddc, 0x006a5600, 0x010d8cca, 0x031380e5, 0x004ff79a, 0x02b71d71, 0x0289e380, 0x02531a9f, 0x0008f67c}}, Y: Field{[10]uint32{0x0244a9ac, 0x00cdcaff, 0x0256442d, 0x00053da5, 0x030a9fd2, 0x02d3a178, 0x02f49f6b, 0x0184669b, 0x0247b6eb, 0x00157720}}}, + {X: Field{[10]uint32{0x033b8f24, 0x03d76275, 0x0318a050, 0x03bc4b1c, 0x02886c79, 0x03bdb494, 0x01bb2815, 0x0147bc57, 0x0095ad25, 0x003bac8c}}, Y: Field{[10]uint32{0x01ba1ddb, 0x026166c4, 0x00eac67d, 0x020a74e1, 0x0056a80f, 0x039f3ee4, 0x00c38963, 0x0033a3ac, 0x0394b981, 0x003469c6}}}, + {X: Field{[10]uint32{0x00b7c21b, 0x009a0ad5, 0x023c0e7a, 0x00db9087, 0x03899a84, 0x03bfbaa6, 0x03eee536, 0x03df8952, 0x027b57bd, 0x001929b7}}, Y: Field{[10]uint32{0x03b4755b, 0x00325bc9, 0x01537cf4, 0x02438fc3, 0x03181ad1, 0x0240bf1b, 0x0002e2d2, 0x013f2831, 0x036e2e34, 0x001909e4}}}, + {X: Field{[10]uint32{0x00270073, 0x03c0b0b3, 0x0046d779, 0x0114f3b2, 0x008207fd, 0x0079c02e, 0x01aad5e5, 0x02bcfc70, 0x02ced76d, 0x0027919d}}, Y: Field{[10]uint32{0x03dc9e42, 0x01d3d2f2, 0x00c38d9d, 0x0333ad16, 0x036ffc4a, 0x0362a112, 0x02550195, 0x0042b411, 0x03811d76, 0x0015a171}}}, + {X: Field{[10]uint32{0x01645473, 0x012cd663, 0x003e5d13, 0x00d5bb21, 0x031d83c6, 0x0110a31e, 0x020ee231, 0x01ae85db, 0x02288061, 0x00257b84}}, Y: Field{[10]uint32{0x03bf4054, 0x00b8a7a8, 0x023a37d1, 0x004c31bb, 0x0149a60d, 0x02c9531c, 0x00812789, 0x01301d60, 0x00644191, 0x001ef8d3}}}, + {X: Field{[10]uint32{0x006516ad, 0x039300ff, 0x00da994f, 0x02683166, 0x03d0b108, 0x0114f2f7, 0x01df5066, 0x02068be4, 0x02efd920, 0x00394fff}}, Y: Field{[10]uint32{0x00c59c2f, 0x00762479, 0x01929ecc, 0x019eb01c, 0x035dcd1b, 0x00591863, 0x0270b285, 0x00340a8b, 0x02c14a60, 0x001583c0}}}, + {X: Field{[10]uint32{0x022a7b68, 0x0330fa81, 0x03a83faf, 0x00418ebe, 0x0090d4eb, 0x028f665d, 0x014f1adf, 0x01223168, 0x03447c75, 0x00270cc9}}, Y: Field{[10]uint32{0x01791c63, 0x026dbb86, 0x02b8ad68, 0x023d5643, 0x00cacfb7, 0x01343315, 0x00ff7d22, 0x03f0ed34, 0x01fb09a7, 0x002731d6}}}, + {X: Field{[10]uint32{0x033d3c45, 0x00e50c25, 0x0058e4ea, 0x01fa078f, 0x02f1d103, 0x022dd050, 0x02b22b0c, 0x0057fddf, 0x01002f43, 0x003a09b5}}, Y: Field{[10]uint32{0x008b65de, 0x0346666f, 0x010455d8, 0x0380ab9d, 0x00e8ab16, 0x031f54e9, 0x039316df, 0x01c7d0ea, 0x025882f9, 0x000e919b}}}, + {X: Field{[10]uint32{0x015e13c7, 0x01ece204, 0x03512d38, 0x01ecff59, 0x00dd38a8, 0x03a6c5af, 0x00f196c6, 0x02d71237, 0x030eaf93, 0x0033b537}}, Y: Field{[10]uint32{0x028b74cc, 0x0118b1b5, 0x0197e910, 0x01c73b75, 0x018c7542, 0x02734478, 0x032c9309, 0x02772ad3, 0x023bdd14, 0x003f8229}}}, + {X: Field{[10]uint32{0x037eb33d, 0x031505b6, 0x00b27ee8, 0x01b78086, 0x038065e3, 0x03ce3d53, 0x0220182d, 0x01437cac, 0x012788ea, 0x002c15bb}}, Y: Field{[10]uint32{0x02cf6409, 0x02a0f6f6, 0x00a6b0a1, 0x027ff0c0, 0x018d514d, 0x023a687a, 0x0243aa82, 0x015fe7af, 0x0375cef4, 0x0025cce0}}}, + {X: Field{[10]uint32{0x037830df, 0x03b8a216, 0x011561c9, 0x03010187, 0x03eba030, 0x00d07da8, 0x0260b667, 0x03e529ff, 0x007402fe, 0x0000d77b}}, Y: Field{[10]uint32{0x009b933e, 0x007c161e, 0x0045caba, 0x01b9363c, 0x013eb8be, 0x02dba488, 0x0302fe6e, 0x0043f79f, 0x012139c8, 0x00009664}}}, + {X: Field{[10]uint32{0x024e020b, 0x02b77ecc, 0x02f1f081, 0x025cdf16, 0x03d7981e, 0x010abd13, 0x0215cb99, 0x0084ff4b, 0x00c87733, 0x0000fc8f}}, Y: Field{[10]uint32{0x016e8f83, 0x03f0145d, 0x0065ac8a, 0x0184ed7e, 0x007ffc0c, 0x0337b040, 0x0392455d, 0x03378d38, 0x00c0d43c, 0x00093a33}}}, + {X: Field{[10]uint32{0x03babbdb, 0x014dfbca, 0x01bc1e06, 0x03322f3a, 0x03c8471d, 0x02e8361b, 0x02cfa43d, 0x0173ab5f, 0x0076c080, 0x0026ea5b}}, Y: Field{[10]uint32{0x0143def3, 0x00ef0dfe, 0x023ae0e9, 0x008181fb, 0x01622d98, 0x03d3c1ec, 0x02f8e3a8, 0x038136f8, 0x00331c2a, 0x003068f1}}}, + {X: Field{[10]uint32{0x016a3815, 0x0221f5f4, 0x02ac5c2e, 0x01058438, 0x021d414f, 0x037b3273, 0x01103965, 0x014e5635, 0x039a3147, 0x0020f051}}, Y: Field{[10]uint32{0x009b5b7a, 0x0215d00a, 0x0292c7f0, 0x01c341f0, 0x02c123d4, 0x027ffeee, 0x0339bbff, 0x03351b97, 0x00181354, 0x00213534}}}, + {X: Field{[10]uint32{0x03e0a32d, 0x017af1fb, 0x01ab1fcb, 0x0035ecd2, 0x00a8d701, 0x00a15f6e, 0x026714a0, 0x007621db, 0x027a2db1, 0x002eb3d8}}, Y: Field{[10]uint32{0x00c83129, 0x02b8c0fa, 0x02f5ed57, 0x021aeadf, 0x0214b3e5, 0x01ab3882, 0x03777b73, 0x011239a2, 0x000da44c, 0x0028a1f7}}}, + {X: Field{[10]uint32{0x0376ebd7, 0x03173fc9, 0x024d4619, 0x03475934, 0x034ca888, 0x00051c59, 0x03fd2d3a, 0x027de442, 0x00553012, 0x001cc18f}}, Y: Field{[10]uint32{0x00159489, 0x0312ec8b, 0x004ea368, 0x01b34a16, 0x019d7190, 0x005261b1, 0x02b0362b, 0x03e320be, 0x01d944cc, 0x00355e50}}}, + {X: Field{[10]uint32{0x035d6637, 0x022802ce, 0x020114d0, 0x004b5116, 0x02a3f51a, 0x0376d00f, 0x03a4ce34, 0x02b4544a, 0x0232df55, 0x00013ba1}}, Y: Field{[10]uint32{0x02b14820, 0x039b1164, 0x03d8188a, 0x0006585b, 0x01916879, 0x025c8f46, 0x03f01a31, 0x009d68e7, 0x0199dc30, 0x0030a7dc}}}, + {X: Field{[10]uint32{0x03e7ef28, 0x00abf9f5, 0x0386ccd4, 0x03bed59d, 0x028f5345, 0x008fbeb2, 0x0318a16a, 0x03507e62, 0x026d68bb, 0x003f11b9}}, Y: Field{[10]uint32{0x0243c18a, 0x0009c569, 0x029d50d7, 0x00c7b23d, 0x01a02382, 0x02930a2e, 0x01af38a4, 0x0212754f, 0x02dfabf8, 0x0022d0a8}}}, + {X: Field{[10]uint32{0x03a7dc13, 0x0379862c, 0x039638a9, 0x0262bbf1, 0x013f9b6b, 0x028e41ec, 0x02ece5e2, 0x01e5e01f, 0x01b0158d, 0x0029c6b4}}, Y: Field{[10]uint32{0x0308bf90, 0x0179a87b, 0x026ea437, 0x0113a029, 0x02ccfc5c, 0x006e6df4, 0x038a8644, 0x03119394, 0x006da956, 0x001bf5fa}}}, + {X: Field{[10]uint32{0x01860a3a, 0x00ddda3c, 0x0028d0ed, 0x014f5476, 0x0161a7c5, 0x0031abd6, 0x03b99576, 0x0299ff5e, 0x01f36075, 0x00180861}}, Y: Field{[10]uint32{0x0110b2e7, 0x030caf53, 0x02802165, 0x0353754b, 0x0102265c, 0x01ea274e, 0x03a027ce, 0x020d7991, 0x02db706b, 0x002434c4}}}, + {X: Field{[10]uint32{0x007a77ca, 0x01edf7d8, 0x006b598e, 0x01fe50dc, 0x0336b443, 0x01f718b0, 0x019976d3, 0x024646e7, 0x02837672, 0x0036c3f2}}, Y: Field{[10]uint32{0x02efc29d, 0x01210760, 0x03dd9c4f, 0x01a26541, 0x0278699a, 0x028600be, 0x009f0b32, 0x01faff83, 0x016e8eba, 0x0008f7b7}}}, + {X: Field{[10]uint32{0x00a54939, 0x023c95e9, 0x01884761, 0x03b00ce7, 0x02237d0a, 0x03fe37a0, 0x0159909f, 0x013c24a8, 0x0061598d, 0x001a466e}}, Y: Field{[10]uint32{0x0334b90c, 0x0072f6db, 0x03ff2f3e, 0x0050e4b0, 0x0127a1a2, 0x02693864, 0x01c07845, 0x00ea8ee1, 0x02fe1fa5, 0x002ae7e0}}}, + {X: Field{[10]uint32{0x0074bd59, 0x03becba0, 0x01e39299, 0x0063df8e, 0x02877ec1, 0x0354e803, 0x00f0a5d5, 0x006e9f0f, 0x02e9f1f5, 0x003d29f4}}, Y: Field{[10]uint32{0x005bd257, 0x01f8640b, 0x01be0ef1, 0x027665d0, 0x030c9bea, 0x02f39e60, 0x00e6380c, 0x02b38b69, 0x01006aa6, 0x0027c142}}}, + {X: Field{[10]uint32{0x01453da3, 0x02cb8d73, 0x03656366, 0x01f95065, 0x02392731, 0x03ffef65, 0x011ae232, 0x03784c42, 0x0210d4f1, 0x0022975c}}, Y: Field{[10]uint32{0x00580a54, 0x0345912c, 0x02a98abc, 0x001394ca, 0x034cae10, 0x024c1ab6, 0x0158a05a, 0x03683a99, 0x021b5b71, 0x0026bfe2}}}, + {X: Field{[10]uint32{0x00e86f16, 0x020063ae, 0x039f3f93, 0x0308abf5, 0x022c9195, 0x02812e1e, 0x020406be, 0x01c566c2, 0x03dce40d, 0x00267ac8}}, Y: Field{[10]uint32{0x00ecff66, 0x011f5059, 0x01b3782b, 0x037a7a03, 0x03b1f17f, 0x01e7f2af, 0x036cddaa, 0x03f7b1ff, 0x0138a66e, 0x000bbc86}}}, + {X: Field{[10]uint32{0x00d37472, 0x02e996ad, 0x02904a99, 0x0391eb2f, 0x01611ad0, 0x02aef9e0, 0x03f0d0b9, 0x011062b1, 0x02841a87, 0x000efc5b}}, Y: Field{[10]uint32{0x03e714ad, 0x00d44868, 0x003551fb, 0x02ca2bbd, 0x007d1138, 0x009dd0df, 0x008c0f19, 0x0232cbf2, 0x01f4e194, 0x00074f2e}}}, + {X: Field{[10]uint32{0x03f01f3e, 0x027f93f9, 0x0095af45, 0x03395126, 0x02561811, 0x018e22a1, 0x007c1333, 0x00e5382e, 0x03ff19eb, 0x0028fbe0}}, Y: Field{[10]uint32{0x0178cbab, 0x0344e920, 0x024a1045, 0x03374cd6, 0x019d687c, 0x00474238, 0x007ddb47, 0x02b32f37, 0x01398bdc, 0x00065577}}}, + {X: Field{[10]uint32{0x00b1af90, 0x03bc5f9c, 0x02552063, 0x0047d6b7, 0x005a344d, 0x008f75ad, 0x01c024c2, 0x013a04fb, 0x0351da9b, 0x0009a05b}}, Y: Field{[10]uint32{0x014aabd6, 0x001e980a, 0x03d30220, 0x01feef33, 0x0365611b, 0x01813a25, 0x02809676, 0x019e8d5c, 0x021d1d6b, 0x001189e3}}}, + {X: Field{[10]uint32{0x03dea823, 0x03a1112b, 0x0125a909, 0x0325239d, 0x031d47dc, 0x01e502c3, 0x03b14f69, 0x03c523b2, 0x03c0d640, 0x00178594}}, Y: Field{[10]uint32{0x00b092c7, 0x017333d3, 0x01c86cd4, 0x0325bfbb, 0x008e499c, 0x00af714a, 0x03aef229, 0x020d43b3, 0x01ede7cb, 0x0026e2e0}}}, + {X: Field{[10]uint32{0x0028de9e, 0x03a76f7a, 0x008f247f, 0x01beb770, 0x02b7725d, 0x0096c4ad, 0x0348c231, 0x00da5158, 0x02450b0d, 0x0006f623}}, Y: Field{[10]uint32{0x00a95db0, 0x036e8bee, 0x00fe2098, 0x01a1a602, 0x009f6faf, 0x00750059, 0x03dae7ca, 0x0377695d, 0x01e32d8b, 0x00060a4e}}}, + {X: Field{[10]uint32{0x01b73c02, 0x004b17f6, 0x01fbd31b, 0x005b5080, 0x02b80ab7, 0x03aede00, 0x01e754fb, 0x013900c5, 0x02063adc, 0x0012c0ff}}, Y: Field{[10]uint32{0x0080fb06, 0x0233d507, 0x0030e73e, 0x00c7a929, 0x03a5623c, 0x000fe638, 0x00ed537e, 0x03946403, 0x00a8e2c5, 0x002a1934}}}, + {X: Field{[10]uint32{0x01d35f61, 0x013c7a11, 0x0268c588, 0x003f4217, 0x01214686, 0x0311bced, 0x01927f13, 0x023ccc7b, 0x01150781, 0x00038829}}, Y: Field{[10]uint32{0x02bcf328, 0x021d79a5, 0x00db0484, 0x02828f48, 0x02a924e9, 0x03f523d9, 0x02466c43, 0x035b1627, 0x00021a79, 0x00287048}}}, + {X: Field{[10]uint32{0x001e37be, 0x024971fe, 0x03a732db, 0x0287200a, 0x034aaece, 0x0221787a, 0x0224d874, 0x0387362f, 0x024e74a1, 0x0038f446}}, Y: Field{[10]uint32{0x021645f5, 0x00a8eda1, 0x03c7f73d, 0x0271ed12, 0x03022b0a, 0x0220c752, 0x0006787b, 0x03c07d8e, 0x001e0a1e, 0x0023c7b0}}}, + {X: Field{[10]uint32{0x0237f6e5, 0x00a8204f, 0x00617d1e, 0x00c83d00, 0x03da71fa, 0x01ca6c58, 0x0292b584, 0x0036fba3, 0x021557fe, 0x002288cc}}, Y: Field{[10]uint32{0x02cce950, 0x022415ab, 0x01f5e938, 0x00a5870d, 0x03267dbd, 0x035de632, 0x021ed74b, 0x01d416ba, 0x031abb8c, 0x002bd791}}}, + {X: Field{[10]uint32{0x0051d20d, 0x0269db5a, 0x01cbe99f, 0x03ea65a1, 0x02997e8d, 0x01c05735, 0x01070e00, 0x011a0c54, 0x022cb43f, 0x000eef02}}, Y: Field{[10]uint32{0x00b4f97d, 0x038d46df, 0x00278bb0, 0x010e5bea, 0x01fd1408, 0x01820c44, 0x0168e88b, 0x013102e6, 0x038ea5f1, 0x0026877e}}}, + {X: Field{[10]uint32{0x011d1deb, 0x0384cf24, 0x01184811, 0x00e0e50c, 0x0165380f, 0x0101ed2e, 0x0059dac9, 0x020eafa3, 0x0381082d, 0x00230135}}, Y: Field{[10]uint32{0x000a3db4, 0x014982d3, 0x00eab4a6, 0x0261c663, 0x00c0a3e0, 0x0200e54d, 0x03213408, 0x008c5bf3, 0x0093fdb2, 0x00135d39}}}, + {X: Field{[10]uint32{0x02a0291f, 0x002935b5, 0x028c8577, 0x0057279f, 0x001ed9f9, 0x00b80d91, 0x00aa7c46, 0x00b37b7c, 0x010e7231, 0x00119f53}}, Y: Field{[10]uint32{0x00a1ce32, 0x0376875c, 0x001fc0d4, 0x010060ea, 0x02f117e2, 0x00475596, 0x00624ddf, 0x025528c3, 0x00a9d7c2, 0x0020f6d0}}}, + {X: Field{[10]uint32{0x01a3dc8c, 0x03d26311, 0x00195d55, 0x00b7866b, 0x02ce73ae, 0x01072f54, 0x00601869, 0x028406ac, 0x00cd8e55, 0x002d8bd8}}, Y: Field{[10]uint32{0x0314ef41, 0x0330c06c, 0x03cef428, 0x02e3efdb, 0x034a5108, 0x01633482, 0x030ed091, 0x00958bba, 0x00b07c6d, 0x00167692}}}, + {X: Field{[10]uint32{0x039e681f, 0x03746d72, 0x02183379, 0x03301924, 0x01166e88, 0x0151bbfa, 0x036d7f19, 0x03b9877c, 0x0210f98a, 0x001ad758}}, Y: Field{[10]uint32{0x018a0d76, 0x011b9bda, 0x028e77f2, 0x01eb11c8, 0x027c6de8, 0x00c01170, 0x008afca8, 0x0229adcb, 0x034859c8, 0x0036fec5}}}, + {X: Field{[10]uint32{0x02300c97, 0x03b34288, 0x00286049, 0x036d234f, 0x00548768, 0x01625df3, 0x012cc9ef, 0x0210ada3, 0x0104e8c7, 0x00221d13}}, Y: Field{[10]uint32{0x03b9c38c, 0x03d628a3, 0x01bc0393, 0x024e4421, 0x02149d29, 0x031f242d, 0x00b0e425, 0x03147968, 0x02a51ea3, 0x002115ce}}}, + {X: Field{[10]uint32{0x032e37c8, 0x02038cb0, 0x03d4bada, 0x0296f934, 0x00d0218b, 0x005ab64e, 0x03065712, 0x02b16066, 0x002440f2, 0x003f7cb2}}, Y: Field{[10]uint32{0x01538f74, 0x01b56a97, 0x028b5587, 0x0069d019, 0x01917203, 0x02180b7f, 0x00c6f205, 0x007fef92, 0x00b59e96, 0x0030aaf1}}}, + {X: Field{[10]uint32{0x03777559, 0x012255fb, 0x028a9366, 0x03826d33, 0x0115178c, 0x011d5501, 0x02273bd2, 0x0220ecc8, 0x03641f5a, 0x00134bf7}}, Y: Field{[10]uint32{0x02a41b11, 0x002ce152, 0x029fabed, 0x00070d12, 0x02b2837f, 0x02cc85eb, 0x021b89b9, 0x03cc7190, 0x0101210b, 0x0008ae87}}}, + {X: Field{[10]uint32{0x00ddc633, 0x0185648d, 0x022699c4, 0x0330abf2, 0x035a54dc, 0x017192a3, 0x02f3faea, 0x02ff7e06, 0x00a1e743, 0x003b1f2f}}, Y: Field{[10]uint32{0x02ab0917, 0x01e05b93, 0x02e295f5, 0x039263f3, 0x03dc5263, 0x01684041, 0x0128c05e, 0x028141ed, 0x01a9ea76, 0x0027c64f}}}, + {X: Field{[10]uint32{0x00b44fdf, 0x02aef011, 0x01943c7f, 0x037e74dc, 0x00da9cd6, 0x00f2e013, 0x001e7790, 0x0262e2e0, 0x01137719, 0x003fcbe8}}, Y: Field{[10]uint32{0x01f6093c, 0x011af2cb, 0x02c54237, 0x009008b2, 0x022aec68, 0x02335bc2, 0x01d966db, 0x01d9c31e, 0x03f21ac5, 0x00258849}}}, + {X: Field{[10]uint32{0x00a57580, 0x0179de82, 0x035ee647, 0x0324a7c5, 0x034fd418, 0x010db5ab, 0x02c21bec, 0x000b48d3, 0x006b2dfb, 0x001b46d0}}, Y: Field{[10]uint32{0x00e895eb, 0x03a88f6f, 0x02f07b2d, 0x0394e2e7, 0x02f157ef, 0x00f9ed80, 0x00693d6d, 0x0238be3c, 0x02689dba, 0x002e2515}}}, + {X: Field{[10]uint32{0x004d7963, 0x03bd4e59, 0x01df587b, 0x03ddd308, 0x020317bf, 0x00371ae5, 0x00767270, 0x00033919, 0x01fb449e, 0x0012aee7}}, Y: Field{[10]uint32{0x006e6407, 0x03162f7e, 0x018e49c2, 0x02a1d517, 0x004d6dbb, 0x026bc726, 0x01807868, 0x031a6cab, 0x02b7c016, 0x001821bc}}}, + {X: Field{[10]uint32{0x010fcee6, 0x036d8e99, 0x022361f8, 0x0293f43b, 0x022fb3be, 0x016128f2, 0x00b0b895, 0x010258dd, 0x01cc634a, 0x0036c314}}, Y: Field{[10]uint32{0x01b6e6a0, 0x03f8cf31, 0x02486367, 0x01fe160d, 0x015d2825, 0x01ec3993, 0x0116fd39, 0x02b8612f, 0x012baea1, 0x001fb02f}}}, + {X: Field{[10]uint32{0x03fdb287, 0x01348b0d, 0x00e74495, 0x020886aa, 0x006996a3, 0x011b79c1, 0x01e02ed6, 0x01246699, 0x01bcd066, 0x002b9bdb}}, Y: Field{[10]uint32{0x03f2f201, 0x03eda870, 0x03d1bb76, 0x03d7d7fb, 0x02c5bbb2, 0x027e440b, 0x01313791, 0x01d01046, 0x02aef8ae, 0x002af9c3}}}, + {X: Field{[10]uint32{0x035f6227, 0x034eb234, 0x01fda63d, 0x018beb14, 0x00f4079a, 0x01ff25dc, 0x00771a91, 0x007cc2f4, 0x0397cb32, 0x002ba8fa}}, Y: Field{[10]uint32{0x02bf39b6, 0x006b919a, 0x0352506f, 0x0285105a, 0x03878145, 0x00a1f7f7, 0x0133704a, 0x005717a4, 0x00163985, 0x002da94d}}}, + {X: Field{[10]uint32{0x012233be, 0x02f28721, 0x01ded051, 0x0018fa24, 0x0039355c, 0x01b04ebe, 0x037234ef, 0x01437a07, 0x00cf711d, 0x0024327e}}, Y: Field{[10]uint32{0x0021bff5, 0x0388720d, 0x0151ed7f, 0x00baa805, 0x0317d2c3, 0x004d61e0, 0x013d4528, 0x025927cb, 0x037818f1, 0x00023655}}}, + {X: Field{[10]uint32{0x02d976e0, 0x017b6321, 0x020e2149, 0x02ae4809, 0x02fd954a, 0x012d23bf, 0x028dcde3, 0x000d1154, 0x00e5ab1d, 0x0016b5fb}}, Y: Field{[10]uint32{0x038569b0, 0x0052c0fd, 0x003d8700, 0x0112c5e1, 0x0062ac94, 0x0311adb8, 0x03274e93, 0x018eaefb, 0x023b2c3c, 0x000b7c85}}}, + {X: Field{[10]uint32{0x03d28d9a, 0x0113a38e, 0x0031cb78, 0x01f5622a, 0x001d80ae, 0x00eac32b, 0x026d3ee1, 0x00bbc05b, 0x022c8e94, 0x002dae8b}}, Y: Field{[10]uint32{0x03ef7fb4, 0x01776dc6, 0x0101d085, 0x014f402d, 0x00a2ebf4, 0x03490458, 0x01b6b067, 0x037f7d40, 0x0235f923, 0x00104602}}}, + {X: Field{[10]uint32{0x03f5f37d, 0x01319d1f, 0x01cc413a, 0x02a71a02, 0x00799555, 0x03211627, 0x03dd450b, 0x01b1f7ea, 0x03c9bba2, 0x001f9026}}, Y: Field{[10]uint32{0x01c9e6b1, 0x00f7b9de, 0x0030ce42, 0x00d067f8, 0x036066b0, 0x020763f7, 0x01c42604, 0x02bf8b90, 0x01619cc5, 0x00031462}}}, + {X: Field{[10]uint32{0x024f602c, 0x02145bb7, 0x024e0300, 0x01aa942d, 0x022c7263, 0x031f1308, 0x01010606, 0x03cbb8a3, 0x011470b2, 0x002521b3}}, Y: Field{[10]uint32{0x02b467af, 0x03edd2f7, 0x012ceaac, 0x028d27d1, 0x02c062e9, 0x01cc8d9f, 0x0131785f, 0x0001bf7e, 0x038cfc5b, 0x00221b32}}}, + {X: Field{[10]uint32{0x01338d2a, 0x027b62c8, 0x0183b1af, 0x0271520b, 0x0294b1ee, 0x0116e817, 0x01af6d87, 0x01c81478, 0x017bc8b0, 0x0039f047}}, Y: Field{[10]uint32{0x035c8e50, 0x0214b7b5, 0x00f79c74, 0x00f5e5ff, 0x016ad468, 0x024bcd6a, 0x01062aa1, 0x02ac7bf2, 0x0293828c, 0x003f7134}}}, + {X: Field{[10]uint32{0x03d50bcd, 0x00003c24, 0x02217c98, 0x01763a00, 0x0119b1a8, 0x01db7b4d, 0x01b67b27, 0x0172c06c, 0x027bff31, 0x00037f98}}, Y: Field{[10]uint32{0x01f9e773, 0x00aa3b95, 0x03c285f3, 0x0346e57b, 0x03ea0f69, 0x0275a39a, 0x01d2480c, 0x0021edbf, 0x01ebbb65, 0x00264f15}}}, + {X: Field{[10]uint32{0x0046f516, 0x03ab1969, 0x01dde189, 0x01b55210, 0x03eb31c2, 0x0183c0bc, 0x007c9818, 0x028b2d7f, 0x0017fd00, 0x00283c33}}, Y: Field{[10]uint32{0x033b8969, 0x030a5792, 0x03a74ff5, 0x03aaf4c3, 0x0214bbe4, 0x00fb74df, 0x01077a7d, 0x0228efc4, 0x004c31d5, 0x002feba2}}}, + {X: Field{[10]uint32{0x03e37338, 0x02dcaea8, 0x01dd9dd7, 0x014e47f8, 0x03d37e7f, 0x0251ad4a, 0x02ef926c, 0x00a1bb5b, 0x02bcbc14, 0x003076ed}}, Y: Field{[10]uint32{0x02df7bf0, 0x00f9a984, 0x01bd0e79, 0x00d44e78, 0x03aa5e27, 0x028ea235, 0x036fdc81, 0x01a20bd2, 0x0187bd33, 0x0019ec0b}}}, + {X: Field{[10]uint32{0x034bebb2, 0x01416f2e, 0x03eebe82, 0x004440d0, 0x03070255, 0x03bb7d7b, 0x02cb1f06, 0x02571324, 0x025bc7d4, 0x00082e41}}, Y: Field{[10]uint32{0x00756835, 0x01449184, 0x00fbd55d, 0x029c12c9, 0x014fec71, 0x018090b6, 0x021a4f90, 0x00764af4, 0x03165c23, 0x0029a61c}}}, + {X: Field{[10]uint32{0x01a69190, 0x0152043b, 0x03f2e03c, 0x01993e36, 0x0255ab9a, 0x023f21e1, 0x029544d3, 0x0230e376, 0x01d00c4d, 0x001efb7f}}, Y: Field{[10]uint32{0x00af77a1, 0x01c569be, 0x00591690, 0x0394f275, 0x01365556, 0x01cbfb81, 0x02d00491, 0x014b79ba, 0x00b00d4f, 0x0026653c}}}, + {X: Field{[10]uint32{0x035918e0, 0x034e179a, 0x01368df4, 0x03481067, 0x035adcad, 0x0083a5f2, 0x023815b7, 0x020fdab1, 0x02af9979, 0x00099d8b}}, Y: Field{[10]uint32{0x0227e6be, 0x00862356, 0x02549279, 0x0359daab, 0x0125f0c0, 0x0395883f, 0x00be2e9b, 0x0136f009, 0x008ce11b, 0x00207d51}}}, + {X: Field{[10]uint32{0x0387bb79, 0x013d337c, 0x013d9a94, 0x01d64b43, 0x03ea14f1, 0x036a1b84, 0x0354ff5d, 0x03854b0c, 0x02e7ee18, 0x001c5232}}, Y: Field{[10]uint32{0x0310b18d, 0x032d3788, 0x0336593d, 0x002fbba0, 0x02ffd42a, 0x02b1af03, 0x0065efed, 0x01ba4105, 0x01faf6f8, 0x0002f6cd}}}, + {X: Field{[10]uint32{0x03bdbc90, 0x023385e1, 0x02723503, 0x001964f0, 0x01bb4d8f, 0x015a116d, 0x01ae00b1, 0x00b0ce9a, 0x01d933ae, 0x0009f917}}, Y: Field{[10]uint32{0x01801ac9, 0x02aff594, 0x02db1f7c, 0x0281643c, 0x017dfe36, 0x009c68ac, 0x019c75c9, 0x01e68fe3, 0x033fa935, 0x0028af38}}}, + {X: Field{[10]uint32{0x03d6b7d7, 0x02fcacb5, 0x02a98fa2, 0x0047fb4a, 0x00d0539c, 0x0207980f, 0x02d79c7d, 0x02ba30a8, 0x02155b28, 0x002bc31c}}, Y: Field{[10]uint32{0x03ac41f9, 0x00b1a6a9, 0x0085640d, 0x038793cb, 0x023b5b26, 0x0073eb0f, 0x0380bfc7, 0x00270002, 0x03cfa251, 0x002b9af7}}}, + {X: Field{[10]uint32{0x03cbabf4, 0x03f80a98, 0x02bec7ec, 0x00646b32, 0x02de0f5a, 0x007a38dc, 0x00e609b2, 0x034d3cc5, 0x0008d4f8, 0x001ed8f1}}, Y: Field{[10]uint32{0x00f16327, 0x02ca6fa5, 0x03a7ce0d, 0x03402f32, 0x02236925, 0x0222166d, 0x02b6f65e, 0x025af633, 0x009a78fa, 0x002a8200}}}, + {X: Field{[10]uint32{0x01c6890c, 0x0163e6e1, 0x03f9394d, 0x000506bb, 0x024f4b48, 0x03d3cc8c, 0x03cffb68, 0x03a22f58, 0x005314f3, 0x002adda2}}, Y: Field{[10]uint32{0x037f192c, 0x0280dbf3, 0x019e05d3, 0x010455f1, 0x01c9ff98, 0x01ffc520, 0x033610ed, 0x01af0430, 0x0033d6d9, 0x00069c72}}}, + {X: Field{[10]uint32{0x023bd32e, 0x038d4727, 0x025a9953, 0x03692c97, 0x01ccd308, 0x0303b616, 0x0375487c, 0x01444be0, 0x03f07ad7, 0x0019050d}}, Y: Field{[10]uint32{0x01a9b131, 0x00e8e220, 0x026b0ccc, 0x0142130c, 0x027d2ec9, 0x03c02198, 0x00f1ba83, 0x00d1abd4, 0x03e6b255, 0x000f163d}}}, + {X: Field{[10]uint32{0x03a082cb, 0x029d9259, 0x0180b9b4, 0x0321dce5, 0x0360f7ec, 0x03406ba1, 0x01cceaff, 0x0351e307, 0x012d600e, 0x003d4cbf}}, Y: Field{[10]uint32{0x0285fa96, 0x02f3e844, 0x0145e440, 0x02b5a5f2, 0x03221847, 0x0200f27c, 0x01bb4d6c, 0x01f5fdf3, 0x014c7111, 0x001ce4d4}}}, + {X: Field{[10]uint32{0x031c7631, 0x02f41d42, 0x01c3ee1f, 0x0351d7c3, 0x00db73db, 0x03e20a4e, 0x01e6f608, 0x02ad1362, 0x01592c4b, 0x000cd9e6}}, Y: Field{[10]uint32{0x01694fbc, 0x01c058d2, 0x035aa1fd, 0x018973d9, 0x0217125d, 0x03fd5f37, 0x00782515, 0x0273cdb4, 0x00046fe8, 0x001307e0}}}, + {X: Field{[10]uint32{0x0256c9cb, 0x008681ef, 0x00a5be22, 0x0380ca5c, 0x016f18b7, 0x0232b0a1, 0x02b53962, 0x03295ec1, 0x016d2a34, 0x00386130}}, Y: Field{[10]uint32{0x02c5bf73, 0x01780f78, 0x009c77f8, 0x00d11ad4, 0x03d646cd, 0x0319b7d5, 0x02ab0688, 0x027137c5, 0x017b51ef, 0x001f7ff0}}}, + {X: Field{[10]uint32{0x0015d419, 0x01b22119, 0x0068f0e2, 0x035bbee3, 0x034f6ce6, 0x02883078, 0x00de9909, 0x027556ee, 0x01162fb4, 0x003e2a5f}}, Y: Field{[10]uint32{0x02061146, 0x0130b910, 0x034a7ded, 0x00ea19a1, 0x005f20a8, 0x007cba1b, 0x012e1616, 0x03280652, 0x00534dbf, 0x000f34f3}}}, + {X: Field{[10]uint32{0x02475781, 0x03783a84, 0x0164eb32, 0x001ab5c6, 0x0328cfc4, 0x0234f714, 0x02dd6123, 0x03608751, 0x022f6c6a, 0x0027adaa}}, Y: Field{[10]uint32{0x0045c299, 0x00f8d1db, 0x004afcb3, 0x03a3ef08, 0x0053dfe3, 0x029066ca, 0x024ce341, 0x00b824d9, 0x028379d3, 0x00051406}}}, + {X: Field{[10]uint32{0x0202668a, 0x021e8f0d, 0x036425f8, 0x017f3ae9, 0x017c4031, 0x008ff500, 0x02427403, 0x02255787, 0x026a68e6, 0x003af095}}, Y: Field{[10]uint32{0x00c7ea39, 0x024c7935, 0x0063aa06, 0x03050bbc, 0x01fab3bd, 0x03a7b269, 0x01f9f85a, 0x015b8995, 0x010996ff, 0x0001d7a0}}}, + {X: Field{[10]uint32{0x012bc392, 0x02dfacbd, 0x029fd674, 0x012d01d2, 0x03ab9c5e, 0x02921032, 0x025b29db, 0x033970be, 0x0038a966, 0x00155919}}, Y: Field{[10]uint32{0x001c8d66, 0x01c083e6, 0x0228f0a3, 0x0033a6a3, 0x022987d8, 0x017354b9, 0x003f68a4, 0x012a273f, 0x02867603, 0x000d18c6}}}, + {X: Field{[10]uint32{0x0316575e, 0x02c0cdde, 0x032e7ece, 0x01759ca7, 0x00082eff, 0x01f76453, 0x03257b8c, 0x0207ccc4, 0x0309befb, 0x002e1fe0}}, Y: Field{[10]uint32{0x016ea298, 0x036dff6a, 0x00630dee, 0x030b3157, 0x03eda5e1, 0x0202fb06, 0x03df03fb, 0x0000b5be, 0x003259e4, 0x002fa99a}}}, + {X: Field{[10]uint32{0x00a0a93e, 0x011c77dc, 0x008d7953, 0x0054a24b, 0x0224b6cf, 0x005b90d7, 0x03598b20, 0x0358fab3, 0x0185b440, 0x0011655d}}, Y: Field{[10]uint32{0x00b71427, 0x03aabab1, 0x013a00b3, 0x03f08cd2, 0x03b29739, 0x019419fe, 0x02c366a5, 0x013d3c8e, 0x0260776a, 0x003d32d8}}}, + {X: Field{[10]uint32{0x0248ca87, 0x01eef925, 0x02e11148, 0x0122e583, 0x033fe8d6, 0x03e73015, 0x024c8218, 0x010aec60, 0x024c8d9c, 0x000b243d}}, Y: Field{[10]uint32{0x03c25a8a, 0x006f9074, 0x00ab4da2, 0x01f5ac76, 0x0369bebf, 0x008bf3d5, 0x03000a9f, 0x00f2d827, 0x0157ac64, 0x0020a6f3}}}, + {X: Field{[10]uint32{0x004b5efe, 0x02c15205, 0x037be36d, 0x0048aea7, 0x012e7539, 0x01dcc5ca, 0x006a3fcc, 0x026af655, 0x02c7779c, 0x003acc9e}}, Y: Field{[10]uint32{0x018c9435, 0x00e46414, 0x025a08c4, 0x01948e15, 0x032cbbf3, 0x01b9d200, 0x032c594d, 0x0334e230, 0x00858d2f, 0x00086b0b}}}, + {X: Field{[10]uint32{0x006d007d, 0x0032c74b, 0x00e6adba, 0x00606b8c, 0x00daa354, 0x00df43c2, 0x02b07fdd, 0x03329ea8, 0x03e2272c, 0x000257b1}}, Y: Field{[10]uint32{0x03a12b5f, 0x01e3f14a, 0x00f3375f, 0x01f93dd0, 0x002d589e, 0x0042e224, 0x02ac913c, 0x01814154, 0x02ef59df, 0x001ccde1}}}, + {X: Field{[10]uint32{0x000cbbd1, 0x019f1a7f, 0x015f5fc3, 0x00a4b186, 0x0191104a, 0x03fc5cdc, 0x03c845d7, 0x028203c9, 0x02988b4f, 0x0012de99}}, Y: Field{[10]uint32{0x03a85b8f, 0x011606d8, 0x0207c928, 0x01360904, 0x008e5249, 0x0266ca79, 0x0338fd4d, 0x01584a1e, 0x03d0a360, 0x0022c10e}}}, + {X: Field{[10]uint32{0x0342e6b2, 0x02af4c68, 0x025e747d, 0x024bf194, 0x00a92337, 0x006409f0, 0x02ab28a6, 0x02077cd4, 0x018b6df5, 0x00226cb1}}, Y: Field{[10]uint32{0x03f53a2b, 0x01168435, 0x001f4100, 0x03ae223a, 0x009b053f, 0x000edd2f, 0x025edea2, 0x03996f89, 0x0334d459, 0x000c02c6}}}, + {X: Field{[10]uint32{0x03c43cf1, 0x02a04526, 0x008007ad, 0x009e27c3, 0x031c9263, 0x01d7b121, 0x027ff0db, 0x00a34392, 0x035d9f6a, 0x00104266}}, Y: Field{[10]uint32{0x0262cae5, 0x03056dde, 0x00b26995, 0x02680d65, 0x013e0791, 0x00196234, 0x009253be, 0x024adba5, 0x02962e2b, 0x000a82ae}}}, + {X: Field{[10]uint32{0x03229be4, 0x03f58581, 0x00817af7, 0x02704e27, 0x018825ea, 0x02998d55, 0x03396b29, 0x00230d41, 0x00649ec5, 0x002f2c3f}}, Y: Field{[10]uint32{0x0207d606, 0x011a4cce, 0x03e5c2c7, 0x02e4b5ef, 0x0313664d, 0x0248b991, 0x03a12ae0, 0x03d6adb0, 0x0192cf3b, 0x0005a31e}}}, + {X: Field{[10]uint32{0x018b762e, 0x01c6737b, 0x009a50ec, 0x035bdc0d, 0x029cd3b3, 0x0156a025, 0x0314ca70, 0x015abe78, 0x01585a62, 0x001e8ff2}}, Y: Field{[10]uint32{0x03df1346, 0x011172f4, 0x00f2217d, 0x01e0e44a, 0x00dadecd, 0x01c5e764, 0x0288526b, 0x001c58d4, 0x000c29cd, 0x003fa2ca}}}, + {X: Field{[10]uint32{0x01a8176a, 0x038fc198, 0x02fe1c89, 0x03980341, 0x027583c1, 0x0195b6a6, 0x03229e1e, 0x028d7b83, 0x03e1b968, 0x000ddc24}}, Y: Field{[10]uint32{0x02c601d9, 0x003e2830, 0x02b82e6e, 0x0220082b, 0x006aba8e, 0x02303600, 0x02a4dd0b, 0x03d185f9, 0x020df6c9, 0x0039f021}}}, + {X: Field{[10]uint32{0x02afecd8, 0x018fc512, 0x02a375ba, 0x03496a63, 0x01919b1d, 0x0184c068, 0x0327a933, 0x033333c7, 0x03daf4a5, 0x00317bfc}}, Y: Field{[10]uint32{0x00b97a1c, 0x01259337, 0x01d67f42, 0x027d38fc, 0x010a9412, 0x0088b0bf, 0x008a02c2, 0x020f7063, 0x023426f9, 0x000d3845}}}, + {X: Field{[10]uint32{0x023ffb27, 0x02a732f9, 0x014e984e, 0x03c54bb1, 0x033c0fa6, 0x00da2bf2, 0x0230f728, 0x0034cd10, 0x0119eb56, 0x00003f1e}}, Y: Field{[10]uint32{0x0059a6b3, 0x00a10aa6, 0x03fa9413, 0x033ab6b4, 0x00a04bc4, 0x03929f74, 0x01cb8388, 0x01bfe6f0, 0x0382af76, 0x00071f4d}}}, + {X: Field{[10]uint32{0x021ca5bd, 0x0362c921, 0x001c6287, 0x00890f4e, 0x03b31183, 0x0371bd1b, 0x0034cd6e, 0x01b5c951, 0x03fb4938, 0x0009e0f5}}, Y: Field{[10]uint32{0x03fa5c70, 0x005b8e31, 0x00111a93, 0x01d205c4, 0x01e4c685, 0x023e271e, 0x00450262, 0x01ab038f, 0x02710b80, 0x0028eabc}}}, + {X: Field{[10]uint32{0x018a02f3, 0x012cc3cb, 0x012298ad, 0x01bff4d7, 0x0188f54a, 0x0396efe5, 0x03f89495, 0x038343dd, 0x007868d4, 0x001d01e9}}, Y: Field{[10]uint32{0x03fdec9c, 0x03046d61, 0x001ce24c, 0x0250166b, 0x02debf3d, 0x024cca5f, 0x01b393ea, 0x0232c2a9, 0x016296e1, 0x00049435}}}, + {X: Field{[10]uint32{0x0061a321, 0x0137486a, 0x01df6cc5, 0x0293e118, 0x01c5899f, 0x0055101e, 0x02c108e7, 0x03b369de, 0x00e32940, 0x0030b4b3}}, Y: Field{[10]uint32{0x005a1909, 0x037a16fc, 0x01b729e6, 0x02aba0c3, 0x030a919e, 0x03321516, 0x00b05e3e, 0x0201c64a, 0x01fa40bb, 0x003c2fac}}}, + {X: Field{[10]uint32{0x01e8a56f, 0x03eb0fab, 0x013eb349, 0x00d4132c, 0x00d459a9, 0x02d7a54c, 0x014e1f5a, 0x006559aa, 0x0189c505, 0x00233dac}}, Y: Field{[10]uint32{0x03cf9c96, 0x018152f3, 0x0338c160, 0x02205884, 0x00327aa7, 0x008b51ea, 0x02d06d3b, 0x00a21b39, 0x017032e5, 0x002fdaa7}}}, + {X: Field{[10]uint32{0x01a94968, 0x019d9b4a, 0x01d51ece, 0x00adff42, 0x022deeaa, 0x00c9df47, 0x016ac5f5, 0x0211c43e, 0x0186ed9f, 0x0035ac1d}}, Y: Field{[10]uint32{0x009c5326, 0x03a0fd7c, 0x03c9c75b, 0x007b4b88, 0x022f7904, 0x038fe8a4, 0x02f0d0d5, 0x01573d2b, 0x00b4ce56, 0x0036ad35}}}, + {X: Field{[10]uint32{0x02f4d647, 0x01c89ec3, 0x0000fb85, 0x00cd136a, 0x009e661d, 0x001e560d, 0x03a09219, 0x00fb7fcc, 0x033360a0, 0x0029c82d}}, Y: Field{[10]uint32{0x0084ea63, 0x01702d52, 0x035b11bb, 0x03fef513, 0x0313d79d, 0x003d219f, 0x037e3a5a, 0x00b60980, 0x006a721c, 0x0007c84f}}}, + {X: Field{[10]uint32{0x033a5ff7, 0x01a73b07, 0x030ac95a, 0x028b2806, 0x01b39f9b, 0x0167741d, 0x03db862e, 0x031b19c5, 0x02983b03, 0x00156295}}, Y: Field{[10]uint32{0x00ffb1a4, 0x0331b1f5, 0x0155792e, 0x01a621ff, 0x00fe3ae8, 0x00117f18, 0x0338458a, 0x02da2c85, 0x0352db21, 0x001f81f1}}}, + {X: Field{[10]uint32{0x00e14ca4, 0x02d55404, 0x002639ca, 0x035fe35b, 0x02a7c2d9, 0x00474382, 0x0329941f, 0x01a2a314, 0x03c32786, 0x002e49f7}}, Y: Field{[10]uint32{0x0323388c, 0x01e570ad, 0x035524b8, 0x0152666b, 0x0172f4d8, 0x01dc1489, 0x020e35f7, 0x0089eed0, 0x03259954, 0x000f3a0d}}}, + {X: Field{[10]uint32{0x030e6da8, 0x0263b313, 0x0016513f, 0x00719470, 0x003c35f7, 0x02d568dd, 0x0223ed5a, 0x02bfd623, 0x00991085, 0x000adc35}}, Y: Field{[10]uint32{0x006a8b06, 0x013c0a94, 0x025cd1a9, 0x004c72b8, 0x030a7014, 0x03609d8b, 0x03984697, 0x01727288, 0x034daa1e, 0x0037d04e}}}, + {X: Field{[10]uint32{0x01aefe56, 0x007cbbcb, 0x01144142, 0x015298b8, 0x01e1368e, 0x012e9dfa, 0x029181d9, 0x01b80266, 0x00dcf72f, 0x002e20db}}, Y: Field{[10]uint32{0x010427ce, 0x01488279, 0x00359afa, 0x02a94e53, 0x0201beec, 0x0233abad, 0x017014b6, 0x03c9b72b, 0x012f0e31, 0x00026b51}}}, + {X: Field{[10]uint32{0x00af93a7, 0x02daa031, 0x01b004dc, 0x01173643, 0x02ec66b4, 0x03cce026, 0x0388b480, 0x0388e825, 0x017b65f0, 0x00094aca}}, Y: Field{[10]uint32{0x00916838, 0x02c37898, 0x010e806c, 0x034314cd, 0x039f77c7, 0x0092962f, 0x02a3bcfc, 0x018845cd, 0x00c43c34, 0x00233138}}}, + {X: Field{[10]uint32{0x02be6330, 0x0245c737, 0x01892aad, 0x001335ca, 0x03d34f27, 0x035adef6, 0x03d5fa03, 0x03319a3b, 0x00ca1c15, 0x0027cf4c}}, Y: Field{[10]uint32{0x023211b0, 0x0188c9ec, 0x0057b386, 0x02613888, 0x01353d9b, 0x0051d85c, 0x0056974f, 0x03b9eaf0, 0x00340f95, 0x001122d9}}}, + {X: Field{[10]uint32{0x03d35e49, 0x034a614b, 0x039e66e2, 0x01793952, 0x01653b54, 0x02f1ef38, 0x00a771b5, 0x02b767fe, 0x016e5bc9, 0x00208978}}, Y: Field{[10]uint32{0x010570fa, 0x012a9d5f, 0x0212c717, 0x02774401, 0x00df836b, 0x01fc2765, 0x024e1de8, 0x028b05b2, 0x01e3aaef, 0x00189531}}}, + {X: Field{[10]uint32{0x02d02ebe, 0x01a729aa, 0x01799046, 0x019d34f1, 0x01074f47, 0x0378956c, 0x02a80b74, 0x0266c6dc, 0x02484d6e, 0x0029f73b}}, Y: Field{[10]uint32{0x01c170a7, 0x0160ee80, 0x002a42db, 0x01e231f1, 0x00785861, 0x03bdea52, 0x021f541b, 0x02407d21, 0x00fa76a2, 0x00075bc3}}}, + {X: Field{[10]uint32{0x009976b4, 0x038c57a0, 0x03d1e210, 0x00ae8e5b, 0x009a6baa, 0x00b1992e, 0x013372fd, 0x03a43a63, 0x01a85d4c, 0x002a4511}}, Y: Field{[10]uint32{0x00b1d100, 0x020e1d9e, 0x01449f1d, 0x03e539f1, 0x0072deac, 0x0365001f, 0x01d1512c, 0x01cac6d4, 0x028b99b0, 0x002b7131}}}, + {X: Field{[10]uint32{0x027ce1f1, 0x0217b88a, 0x01c79ed6, 0x02b621b3, 0x036f6ea6, 0x01443803, 0x00410963, 0x025955d7, 0x01ce907c, 0x001d18b2}}, Y: Field{[10]uint32{0x0371c7df, 0x03fe882e, 0x00f2ae67, 0x03a0ccbe, 0x0047a854, 0x02731050, 0x02df5ac7, 0x008a6710, 0x01c5f02c, 0x0013fe90}}}, + {X: Field{[10]uint32{0x00cd4f40, 0x0232a18a, 0x005065d3, 0x0112596a, 0x00dfd855, 0x029e7c8d, 0x00e36bb6, 0x0256f6be, 0x01f3dea4, 0x00350a25}}, Y: Field{[10]uint32{0x010d9cf5, 0x024ab82d, 0x01bbd59c, 0x003ea036, 0x00982171, 0x02ee121b, 0x0069b207, 0x00710b9e, 0x031813a1, 0x000bfb7a}}}, + {X: Field{[10]uint32{0x01388adc, 0x03666853, 0x01669c29, 0x01b5da99, 0x02e8291e, 0x03bd4f44, 0x03434b27, 0x01622bc4, 0x0362ce85, 0x003be6da}}, Y: Field{[10]uint32{0x03bf912f, 0x022bb826, 0x0138adb1, 0x015516da, 0x02802612, 0x024501f2, 0x0107955e, 0x03258bb6, 0x03cf9af0, 0x000567d7}}}, + {X: Field{[10]uint32{0x01bc9f32, 0x02c1b23f, 0x03f392af, 0x01f8a9a4, 0x0392877c, 0x0325abff, 0x01fb7bdb, 0x0276bf7d, 0x01a0bc65, 0x001000fc}}, Y: Field{[10]uint32{0x0161fef9, 0x0217ad5e, 0x03cc9ea6, 0x029b09c1, 0x017faeaf, 0x012fa197, 0x03f1dcb7, 0x03c2c0a3, 0x02a17458, 0x003afff2}}}, + {X: Field{[10]uint32{0x02c09a8b, 0x01c0da9a, 0x027debed, 0x03640121, 0x01aa9ae1, 0x0121bd73, 0x00786f07, 0x03614592, 0x008b6b03, 0x0010e412}}, Y: Field{[10]uint32{0x0282f07a, 0x01da98e1, 0x03d6e5dd, 0x0304a682, 0x03452001, 0x00777ce4, 0x035b88a2, 0x02d5ac70, 0x01e5a10d, 0x001e0ca7}}}, + {X: Field{[10]uint32{0x03fadea1, 0x01d019ea, 0x006b9605, 0x005be7fe, 0x016074ee, 0x037fe2d0, 0x0006c565, 0x03ed9ad8, 0x00d29ea3, 0x002b9b68}}, Y: Field{[10]uint32{0x011cdac7, 0x00cc8d30, 0x009c05ca, 0x007ae22d, 0x0229e3f0, 0x00dc1853, 0x02f0916f, 0x00a98f9d, 0x0263dd01, 0x001d32aa}}}, + {X: Field{[10]uint32{0x03cfc72a, 0x0362a1ae, 0x014fb2fa, 0x03825414, 0x02035942, 0x013a01bd, 0x00656520, 0x011c86df, 0x01df9861, 0x001e3e1e}}, Y: Field{[10]uint32{0x00281ac6, 0x014a5b4e, 0x01c68a75, 0x034e2358, 0x032318aa, 0x03ee1731, 0x03661b7f, 0x03a02fea, 0x018c478a, 0x00106539}}}, + {X: Field{[10]uint32{0x03c97e01, 0x00be5b97, 0x01d1dedd, 0x00a1ec70, 0x000352e0, 0x00e0d577, 0x00d51cc8, 0x02c31b5b, 0x03654f41, 0x00201a10}}, Y: Field{[10]uint32{0x02b62461, 0x000cfae4, 0x01c45262, 0x01f8ec79, 0x037546bc, 0x00d7ca69, 0x0141a0d0, 0x006d3878, 0x023f13c6, 0x0022c308}}}, + {X: Field{[10]uint32{0x0387466c, 0x02ce4212, 0x0301005c, 0x00d271e5, 0x02f83b59, 0x0365f42a, 0x03d11691, 0x01d7d1bb, 0x019f4fd9, 0x000a5427}}, Y: Field{[10]uint32{0x02d0da81, 0x03ae9a81, 0x038da8a0, 0x0214bab4, 0x02a33de5, 0x00d78f21, 0x00fccbe1, 0x02be5b27, 0x037569a0, 0x00051dfa}}}, + {X: Field{[10]uint32{0x031dfa4a, 0x03ffabb7, 0x0399c2d8, 0x0105bafd, 0x004e3d57, 0x00f18ea7, 0x01532fe3, 0x01c8bc30, 0x00433d9c, 0x00064745}}, Y: Field{[10]uint32{0x003a2cd8, 0x012d375c, 0x01706eae, 0x02d997b2, 0x01a5e3c7, 0x006213bb, 0x01ecf839, 0x01c6b5d1, 0x0009b6b5, 0x0016f401}}}, + {X: Field{[10]uint32{0x030155a8, 0x022c5646, 0x001e1ebf, 0x0078f6c8, 0x02a50f0e, 0x03aa0afc, 0x02d65afe, 0x0205a17b, 0x002ed273, 0x000a10f5}}, Y: Field{[10]uint32{0x03c63ee8, 0x01f4246e, 0x02f98ff8, 0x02e02669, 0x0177edaf, 0x00cb2c89, 0x03e6e2c2, 0x027d4ed1, 0x0266c0fa, 0x00201f3a}}}, + {X: Field{[10]uint32{0x03c8f644, 0x014ef44a, 0x000184d6, 0x00b5145b, 0x00e96ed0, 0x03a084be, 0x007514b8, 0x034dbd4d, 0x03b09656, 0x00155a2d}}, Y: Field{[10]uint32{0x00e60d87, 0x03618e14, 0x009118b2, 0x026e904a, 0x02496045, 0x03a8d901, 0x03da30d7, 0x01b710fe, 0x03a65483, 0x0016d13a}}}, + {X: Field{[10]uint32{0x0145e803, 0x023b17ac, 0x03d6e5f3, 0x008701cf, 0x004a7dd4, 0x0256ccbe, 0x00d81ab5, 0x01129a7a, 0x00e0809e, 0x0016e138}}, Y: Field{[10]uint32{0x0113d398, 0x00f4fbeb, 0x00243cb4, 0x0303fa4d, 0x017e6109, 0x0390c455, 0x03a1522a, 0x0073b5cb, 0x02d0fa79, 0x00069968}}}, + {X: Field{[10]uint32{0x02dfa672, 0x02993aaf, 0x00ede900, 0x010a4b32, 0x00675ba8, 0x0234ca44, 0x021519a1, 0x0041c51f, 0x016bdd24, 0x003bd0b1}}, Y: Field{[10]uint32{0x03ff75ac, 0x01ef34e2, 0x00e3cc9e, 0x0288c51d, 0x0326a618, 0x02b76fda, 0x01e0c254, 0x0265dd84, 0x03473335, 0x001c0545}}}, + {X: Field{[10]uint32{0x0256eb63, 0x01f04a55, 0x0294c92b, 0x03b21fab, 0x00adc653, 0x02c5056d, 0x026ed003, 0x0129592f, 0x02dcb50d, 0x001237fc}}, Y: Field{[10]uint32{0x01643928, 0x01982063, 0x036b5f0f, 0x00f7dc07, 0x02fa29e6, 0x02feb550, 0x03c59e98, 0x03b3dbc2, 0x03fb53af, 0x002a6fa5}}}, + {X: Field{[10]uint32{0x02e938d4, 0x00793ed2, 0x00337f88, 0x035067f7, 0x00d1923b, 0x008ac263, 0x009a2dfc, 0x0345d043, 0x00f5246a, 0x0019cba4}}, Y: Field{[10]uint32{0x01781f19, 0x028a2e68, 0x02c9e97a, 0x0091585f, 0x02f331b6, 0x00797c27, 0x03e678b3, 0x01b6da20, 0x03801fda, 0x001cff4c}}}, + {X: Field{[10]uint32{0x03315cde, 0x032dd852, 0x03723ee7, 0x008529f2, 0x02dbfe55, 0x01770577, 0x01e094a9, 0x02067242, 0x01b171fb, 0x0016736e}}, Y: Field{[10]uint32{0x008351a2, 0x036c06fa, 0x00a187a6, 0x03679243, 0x017f2d38, 0x00208027, 0x033f8e73, 0x01298fb3, 0x0212670b, 0x000156b0}}}, + {X: Field{[10]uint32{0x012ddb18, 0x004237ab, 0x028f0043, 0x020a3873, 0x006b827f, 0x02666531, 0x00db879b, 0x0162ac4d, 0x010a357a, 0x001738e3}}, Y: Field{[10]uint32{0x0397f716, 0x0285364e, 0x009c1745, 0x019c4227, 0x0394748c, 0x036f3146, 0x0384b33d, 0x0361bb0b, 0x0202d9c1, 0x0017a058}}}, + {X: Field{[10]uint32{0x0398afda, 0x012846d4, 0x028c8282, 0x016b41c4, 0x02c1a74d, 0x02dabe49, 0x0227a940, 0x03eeeec3, 0x016a7466, 0x00326086}}, Y: Field{[10]uint32{0x00901f55, 0x0058df54, 0x006b6f00, 0x00953915, 0x032d8fb9, 0x00704cf6, 0x00e6448a, 0x00e2bee7, 0x01eae644, 0x001ea47e}}}, + {X: Field{[10]uint32{0x039ec818, 0x03d4ca60, 0x03d31725, 0x030a0f20, 0x0360bfbc, 0x01e5b403, 0x0281d297, 0x006fb372, 0x008479e6, 0x000e0f2c}}, Y: Field{[10]uint32{0x01dec91e, 0x028643de, 0x004ffdb1, 0x009ab619, 0x010bbc34, 0x0057cd36, 0x01e04980, 0x0224ce2f, 0x03a24900, 0x0009b89b}}}, + {X: Field{[10]uint32{0x002f612b, 0x03293f44, 0x00550248, 0x026dab21, 0x0328b88c, 0x01200477, 0x0117b524, 0x03c529c6, 0x03312ad4, 0x0039a515}}, Y: Field{[10]uint32{0x0176f53d, 0x030ce193, 0x0089c1b1, 0x01be5c1a, 0x00c81cc8, 0x027ac2d1, 0x03edddac, 0x01c0797a, 0x008251fc, 0x000c3b48}}}, + {X: Field{[10]uint32{0x039976f7, 0x00f131ae, 0x018a7f28, 0x03c893e9, 0x01250809, 0x0098a9ca, 0x02168d21, 0x024d4884, 0x01ba8f79, 0x000b401c}}, Y: Field{[10]uint32{0x031dfd8b, 0x00ac05d7, 0x01b03c87, 0x03c695c2, 0x01ccc118, 0x020001e7, 0x01455440, 0x01cfc45a, 0x01014e48, 0x0033729a}}}, + {X: Field{[10]uint32{0x001e927e, 0x0123c880, 0x017898d7, 0x02c210df, 0x01da35c2, 0x01e61dee, 0x00f35f06, 0x013efe47, 0x005765b7, 0x00320ae5}}, Y: Field{[10]uint32{0x005fd6a2, 0x00f67c81, 0x0133d931, 0x00a8e6c5, 0x03b57a0f, 0x02ab23c1, 0x0057dae9, 0x01aff1f8, 0x01d10bb0, 0x000b9413}}}, + {X: Field{[10]uint32{0x01bbf0a6, 0x02d8ca1d, 0x0022763c, 0x028bece9, 0x012654ed, 0x01cdf746, 0x01135ede, 0x0086a7fb, 0x002e7eac, 0x00270693}}, Y: Field{[10]uint32{0x00e9197f, 0x0023bf84, 0x02e60200, 0x011ba768, 0x0280eb66, 0x02ded681, 0x02c91289, 0x00716089, 0x036c12f7, 0x003cc4d2}}}, + {X: Field{[10]uint32{0x016c9b28, 0x02b09fa3, 0x0353b6a2, 0x00d8b55d, 0x019b170a, 0x0202df3e, 0x00bd645e, 0x00c88bb6, 0x019bbc69, 0x0025c74f}}, Y: Field{[10]uint32{0x01d22e2e, 0x00dbdfe4, 0x0098080a, 0x00cfce16, 0x01e20394, 0x03f17a1b, 0x00a73af7, 0x0370b1b1, 0x009ae296, 0x000358f5}}}, + {X: Field{[10]uint32{0x03917d2b, 0x0200bea2, 0x0023fa67, 0x01eafd6b, 0x01660a31, 0x00186781, 0x0329f2ae, 0x0045448f, 0x027386bc, 0x003d524e}}, Y: Field{[10]uint32{0x01e0f1d7, 0x008c1b99, 0x03e23964, 0x000a004c, 0x0138455e, 0x0109ee2d, 0x0305157b, 0x0014c0ac, 0x00cb8b78, 0x0039ab6f}}}, + {X: Field{[10]uint32{0x01b6e014, 0x00154de6, 0x006dadde, 0x03f502ce, 0x01763244, 0x03af78ab, 0x017a3215, 0x00282b92, 0x023e500e, 0x0020c7c4}}, Y: Field{[10]uint32{0x03221d6c, 0x01c67232, 0x03950f44, 0x002a76da, 0x01ac04af, 0x03bbd7be, 0x02fa508c, 0x0222b154, 0x00622ff5, 0x000d585a}}}, + {X: Field{[10]uint32{0x017cfb35, 0x00a321e2, 0x02975f17, 0x008a63a4, 0x027a338c, 0x03bce175, 0x014c3342, 0x011d30ce, 0x006d0018, 0x0026e338}}, Y: Field{[10]uint32{0x02a40d72, 0x033a8150, 0x0331d712, 0x015e928d, 0x0307ce87, 0x007d4dd1, 0x01a50c4c, 0x00f811f3, 0x0220b8dc, 0x001da500}}}, + {X: Field{[10]uint32{0x03c5b855, 0x004de9cf, 0x027cb1e8, 0x02b437fe, 0x0014f06c, 0x00afcf85, 0x01724104, 0x00af2580, 0x016ba98d, 0x003dc2a4}}, Y: Field{[10]uint32{0x000275a2, 0x023ffeca, 0x0023fff9, 0x02110f10, 0x03b5426d, 0x025ea23c, 0x01a3fbe9, 0x0225bfce, 0x01f470d7, 0x003c6e30}}}, + {X: Field{[10]uint32{0x00763d56, 0x014abeb0, 0x0259992d, 0x0027f653, 0x01a64d69, 0x03d88741, 0x02836612, 0x01ff92ac, 0x03bbc44e, 0x000b4aad}}, Y: Field{[10]uint32{0x015328e8, 0x034cb331, 0x0328ae57, 0x02bcd815, 0x03c5fec8, 0x02d870b4, 0x03e044e8, 0x024721a3, 0x02002a69, 0x0014d143}}}, + {X: Field{[10]uint32{0x00d10005, 0x02e751bd, 0x018f3dc9, 0x03157601, 0x03321ff7, 0x02a44c55, 0x025423f3, 0x025e33a8, 0x02b8c516, 0x00205e37}}, Y: Field{[10]uint32{0x016ff4bc, 0x00efeda3, 0x02bfb598, 0x011a89ad, 0x01f9c001, 0x00d4926f, 0x02e6a282, 0x034c0fd2, 0x032b46c9, 0x0005a9c6}}}, + {X: Field{[10]uint32{0x02b56a64, 0x01a9a48d, 0x0301126e, 0x03285800, 0x0001f700, 0x03756650, 0x02f9c32a, 0x02e9f99f, 0x0376d012, 0x002d1c2e}}, Y: Field{[10]uint32{0x014fd95c, 0x03089c98, 0x03a6927c, 0x020a8bef, 0x031775f0, 0x02349a61, 0x01f36f15, 0x0261861c, 0x03e07d17, 0x003df424}}}, + {X: Field{[10]uint32{0x02de29ce, 0x01c4cff8, 0x03f78fe1, 0x0084736c, 0x01d3a899, 0x003c0850, 0x0348eb33, 0x02b04866, 0x02ba837c, 0x000593ca}}, Y: Field{[10]uint32{0x031d28dc, 0x01d8dd21, 0x011972c0, 0x01419a49, 0x02c2837c, 0x02e08701, 0x01ec79e0, 0x0340d12a, 0x020895f7, 0x000ef015}}}, + {X: Field{[10]uint32{0x02e725f4, 0x027fb144, 0x02283ec5, 0x03aa20f8, 0x01e6a210, 0x0172ee27, 0x012268b3, 0x01b4bbd4, 0x020402a8, 0x0031de8e}}, Y: Field{[10]uint32{0x031cfba2, 0x027bb704, 0x029148dc, 0x03896d27, 0x036d1db4, 0x03b580ac, 0x007e5928, 0x0281ff96, 0x016bedf1, 0x000baf35}}}, + {X: Field{[10]uint32{0x03b11349, 0x02b4cd40, 0x00e9f060, 0x0010368e, 0x0011df55, 0x0071aafa, 0x03a3f1d7, 0x033dc555, 0x03a1f714, 0x00038b7b}}, Y: Field{[10]uint32{0x0045f229, 0x02d516b8, 0x0354bd88, 0x0368ee6a, 0x000c5107, 0x0195f651, 0x001912ea, 0x02ef1cbd, 0x03037a53, 0x0017b590}}}, + {X: Field{[10]uint32{0x02313e3c, 0x004910ed, 0x017b2d21, 0x03a73075, 0x0335280c, 0x0290cc2b, 0x03fca1e5, 0x02793058, 0x02cbb4cd, 0x003b8b44}}, Y: Field{[10]uint32{0x02153262, 0x02488ebb, 0x02f0849f, 0x01bf752e, 0x024057fb, 0x03ffeda5, 0x00ecafab, 0x01f1960e, 0x01c1a437, 0x0038a2c7}}}, + {X: Field{[10]uint32{0x019e28bd, 0x0095b59f, 0x0067c78f, 0x011489c5, 0x01a2109b, 0x016f9f0f, 0x0039c34f, 0x037b2bcf, 0x009673e6, 0x00010e4b}}, Y: Field{[10]uint32{0x00110c50, 0x00aa2180, 0x006fd590, 0x035f43d0, 0x00747d63, 0x010e9aed, 0x009edd53, 0x0094cec1, 0x0183ae35, 0x001ff930}}}, + {X: Field{[10]uint32{0x020d6960, 0x03fcc702, 0x017a6712, 0x02cbe046, 0x020f5586, 0x00023d26, 0x02655f16, 0x01d2b64e, 0x02ee1673, 0x00165cb8}}, Y: Field{[10]uint32{0x037c71d6, 0x037b069b, 0x00847bc3, 0x03f1f024, 0x02779343, 0x0240ef5c, 0x02e485ad, 0x01f1d228, 0x0055d0a5, 0x001b5c3f}}}, + {X: Field{[10]uint32{0x002c78aa, 0x0226bc0c, 0x03c19855, 0x00690038, 0x02a180f3, 0x02795d9a, 0x01f1faa2, 0x000c5622, 0x000afc2c, 0x002a1760}}, Y: Field{[10]uint32{0x017ec85e, 0x022c036e, 0x032a508f, 0x01e94b74, 0x02ff5aca, 0x00a196de, 0x0037b419, 0x01da8291, 0x03f4903c, 0x001d0a75}}}, + {X: Field{[10]uint32{0x01f1c245, 0x0215a7e9, 0x01cdc954, 0x00e1c9d6, 0x02ccee3f, 0x035418e1, 0x009e85d7, 0x013f326a, 0x030f0d59, 0x003260da}}, Y: Field{[10]uint32{0x0094fac0, 0x02dc20b4, 0x031ed943, 0x03166ed0, 0x03bed1c2, 0x035c59c9, 0x01a7d06f, 0x03fb58bc, 0x012693b7, 0x0027c2c6}}}, + {X: Field{[10]uint32{0x0202bd3b, 0x032b9ff4, 0x0222b588, 0x0106b991, 0x0375f2c4, 0x03658c64, 0x0348e5f6, 0x01195340, 0x00fdb2b8, 0x00328861}}, Y: Field{[10]uint32{0x026a4de9, 0x013c3f5c, 0x0162683c, 0x03207d9c, 0x01e2563c, 0x03a5ca6e, 0x013dbb2f, 0x01eab012, 0x00203d65, 0x0034488a}}}, + {X: Field{[10]uint32{0x02941fd8, 0x00b9814d, 0x0066b44a, 0x03331e93, 0x02b5dea0, 0x00181755, 0x03627048, 0x02599021, 0x01c63c9b, 0x00278145}}, Y: Field{[10]uint32{0x00be831a, 0x02c87255, 0x01e506d4, 0x018845fb, 0x0295f0b7, 0x036e8187, 0x02f789e2, 0x00b61abf, 0x0224a2eb, 0x000a778c}}}, + {X: Field{[10]uint32{0x035dc1cc, 0x023c002b, 0x02f6053a, 0x03694759, 0x018a3447, 0x0297cf5e, 0x022cf7af, 0x00e9fc30, 0x00253320, 0x0010810b}}, Y: Field{[10]uint32{0x01e6c05a, 0x022369fd, 0x03d9dff6, 0x007587dc, 0x03c54f3c, 0x02f04f44, 0x01420d50, 0x00e1c8c5, 0x027a6d6c, 0x003c1d69}}}, + {X: Field{[10]uint32{0x02295b96, 0x0259f1c4, 0x031bccd3, 0x032a6b90, 0x023f5a68, 0x0222557f, 0x0084ffd2, 0x000af916, 0x01bd4eab, 0x00199168}}, Y: Field{[10]uint32{0x0384cfad, 0x033344ae, 0x00b6730c, 0x01949014, 0x00bf9028, 0x003a4b13, 0x02d4b30f, 0x013b50a3, 0x01f91d26, 0x0008c7de}}}, + {X: Field{[10]uint32{0x00b32f9f, 0x0347ba35, 0x0075f30b, 0x02a21c3d, 0x036898f3, 0x0161f78d, 0x01482ab1, 0x01ba208c, 0x026d2c31, 0x00138a07}}, Y: Field{[10]uint32{0x0065602c, 0x03dd6070, 0x0091011e, 0x0357cdf9, 0x02c3f708, 0x03770d05, 0x0378062c, 0x027b7797, 0x01c81c11, 0x003d232b}}}, + {X: Field{[10]uint32{0x02af5136, 0x0153bc12, 0x00e02fcd, 0x034f90cb, 0x034fbaf7, 0x01e99880, 0x03c7ffbc, 0x007a7fc4, 0x001496e4, 0x001dc8d9}}, Y: Field{[10]uint32{0x002dd218, 0x020c1d09, 0x0328c800, 0x028195fc, 0x0398bec7, 0x00003da5, 0x00b4bf29, 0x03007bed, 0x01740d6c, 0x00088b80}}}, + {X: Field{[10]uint32{0x01d45860, 0x00765dc3, 0x02bddaf3, 0x027fded7, 0x0018ab00, 0x00488610, 0x026070cb, 0x01e166b6, 0x004c8d46, 0x000fcadc}}, Y: Field{[10]uint32{0x034dd88a, 0x03ebaa0e, 0x02a9fb59, 0x022ff417, 0x03e2b6ab, 0x035868b7, 0x038dd215, 0x03ad7a30, 0x03a5146a, 0x00291c59}}}, + {X: Field{[10]uint32{0x00ad4146, 0x02e7a4bb, 0x01b51640, 0x0342b931, 0x0384b3ac, 0x017e60f6, 0x03b70f03, 0x036044ba, 0x0130d243, 0x001e53b0}}, Y: Field{[10]uint32{0x007be84d, 0x01ddeab4, 0x01e71c80, 0x03576303, 0x00658f2d, 0x00debbd7, 0x00a537f9, 0x0171f3bb, 0x00be95c2, 0x00127b7b}}}, + {X: Field{[10]uint32{0x01a96aa3, 0x03258525, 0x023ba808, 0x0335ba7f, 0x0149c554, 0x01ec702c, 0x0304cf4a, 0x0384ade6, 0x01ece363, 0x001d43fe}}, Y: Field{[10]uint32{0x021d59a9, 0x00540bde, 0x02dfb2de, 0x02fc7931, 0x022d4474, 0x028182d0, 0x0270f149, 0x028fb7d3, 0x029dd1c5, 0x00168a09}}}, + {X: Field{[10]uint32{0x026272cf, 0x017ecaad, 0x00169633, 0x00b26dfd, 0x02263b08, 0x0344a518, 0x02c9ec1f, 0x01a3b2e5, 0x01d7df66, 0x00359701}}, Y: Field{[10]uint32{0x02188839, 0x02e93c37, 0x03c37891, 0x0019acbd, 0x017e48be, 0x031dff6b, 0x02cc5b7f, 0x0350b490, 0x00c51c10, 0x00035dca}}}, + {X: Field{[10]uint32{0x015190c3, 0x016fbd56, 0x012f6122, 0x00e5ca8f, 0x02aecffe, 0x036e685c, 0x039d2700, 0x03a7a6d6, 0x00b68cb2, 0x0034e013}}, Y: Field{[10]uint32{0x01e30d5e, 0x03091c6d, 0x01613482, 0x00f9bfc3, 0x00287902, 0x01814d0a, 0x02f41314, 0x01922cc2, 0x010c9568, 0x00047ecd}}}, + {X: Field{[10]uint32{0x00351bf6, 0x03a7a11c, 0x01b3db34, 0x0104441b, 0x036a9382, 0x03b3e34d, 0x0095c619, 0x00d27db3, 0x022635c6, 0x003dd8b7}}, Y: Field{[10]uint32{0x009fd814, 0x03702eaf, 0x0010b1ca, 0x00b4fa21, 0x000ccfe2, 0x026444b9, 0x013352da, 0x003e7b9d, 0x01e0c8a5, 0x003719fe}}}, + {X: Field{[10]uint32{0x03b87a71, 0x0395d9d4, 0x00e7dac5, 0x03baea1f, 0x03d7dcec, 0x005f8e49, 0x02e163ed, 0x03fd2c5f, 0x00bfa827, 0x002ac62d}}, Y: Field{[10]uint32{0x030da919, 0x03aa6e4a, 0x01ed5b57, 0x00734ac7, 0x0229706d, 0x01341fdc, 0x002bc09c, 0x00249b22, 0x03d573e4, 0x001b6e0e}}}, + {X: Field{[10]uint32{0x0198c95e, 0x0199a540, 0x02d8bf5c, 0x02b63d8e, 0x02b12478, 0x0116588a, 0x0343a870, 0x006ba368, 0x0248fec2, 0x003dd530}}, Y: Field{[10]uint32{0x0052b1bd, 0x009e6498, 0x02e5293b, 0x01e8caee, 0x00e056ca, 0x03d511dd, 0x008d8e67, 0x021ddae1, 0x02a25f9c, 0x000b3edd}}}, + {X: Field{[10]uint32{0x0246c51c, 0x018b53e6, 0x008e2c24, 0x030c4d07, 0x02103516, 0x005af285, 0x013ecdb7, 0x001e63e2, 0x033e3c3f, 0x003e3651}}, Y: Field{[10]uint32{0x03924e02, 0x016fa4b5, 0x006869e0, 0x00ef846d, 0x015c53bd, 0x01d51e0d, 0x03314dac, 0x03f8e89a, 0x025fa422, 0x00157c01}}}, + {X: Field{[10]uint32{0x014eb741, 0x0341435d, 0x00395352, 0x02d2fef1, 0x012f7c5a, 0x02ca7f6a, 0x035fa225, 0x032f2269, 0x0142d294, 0x000218e6}}, Y: Field{[10]uint32{0x03d11e4d, 0x02762a79, 0x01c29677, 0x020d32e0, 0x03741da8, 0x02cfb5f3, 0x0179abdd, 0x038d68db, 0x022a445d, 0x000e44fa}}}, + {X: Field{[10]uint32{0x0395d5c2, 0x03469e2e, 0x02c61794, 0x020820eb, 0x02068572, 0x0169c6d2, 0x0319230b, 0x00e22fc5, 0x006c706a, 0x000a9623}}, Y: Field{[10]uint32{0x00c47592, 0x010b12db, 0x01b00968, 0x02bafeec, 0x0361f458, 0x01f847e5, 0x007f07ea, 0x03db6590, 0x01771a56, 0x002bc97b}}}, + {X: Field{[10]uint32{0x020a0cb6, 0x03a35500, 0x01fe337e, 0x005c08b8, 0x00a54597, 0x02697b6c, 0x02dba4ad, 0x02e6a2c9, 0x01ee8931, 0x0004def4}}, Y: Field{[10]uint32{0x03ceea62, 0x01228c05, 0x00b7ff58, 0x01788455, 0x01eaea10, 0x021f5da8, 0x03e9f0ee, 0x031df49c, 0x037b8197, 0x00337a7e}}}, + {X: Field{[10]uint32{0x02de2bbf, 0x02ef8cb4, 0x03b48d21, 0x03aa8782, 0x020f9b5f, 0x00ebcb0a, 0x01523711, 0x00c4f25c, 0x0345c686, 0x00119600}}, Y: Field{[10]uint32{0x0092ef64, 0x02a3ba7b, 0x030510a3, 0x023a85ae, 0x027edade, 0x019bd30a, 0x03bc79db, 0x027fecaf, 0x017bb632, 0x001d6f17}}}, + {X: Field{[10]uint32{0x011bd233, 0x017bd90e, 0x02a8556d, 0x03586ca0, 0x0102ef93, 0x009abd51, 0x02fc491c, 0x016b3660, 0x0252afaf, 0x00128524}}, Y: Field{[10]uint32{0x00cfe285, 0x00f5e3d8, 0x0259a3b5, 0x03f16897, 0x03bb9e83, 0x018fd752, 0x0256ea38, 0x016d8259, 0x00bc10b5, 0x003ef040}}}, + {X: Field{[10]uint32{0x01a01f18, 0x03e4bc85, 0x013faad0, 0x0225f65d, 0x0395bdf0, 0x011d7592, 0x00251313, 0x033e3c38, 0x01a6fc0b, 0x002253af}}, Y: Field{[10]uint32{0x035ec056, 0x0389b3d7, 0x003779fa, 0x000b8a65, 0x001e4ede, 0x01f4deb8, 0x01d02519, 0x01cb3f1a, 0x01501557, 0x002c97cc}}}, + {X: Field{[10]uint32{0x01eb032e, 0x029bab91, 0x0285a3c2, 0x029be796, 0x002deedc, 0x03f5c82b, 0x01ef1b2b, 0x02e244c3, 0x02930a91, 0x0039c362}}, Y: Field{[10]uint32{0x00d9f9cc, 0x03f7c453, 0x01b0a693, 0x02061e28, 0x02fe1026, 0x024472c0, 0x03b96ea4, 0x03fdad17, 0x0253a3b0, 0x002f4ebb}}}, + {X: Field{[10]uint32{0x02b36852, 0x0117eed3, 0x0047eeb2, 0x00fc4d75, 0x02118988, 0x02551ada, 0x016765bf, 0x02c77528, 0x01c3e5cc, 0x001f2c7f}}, Y: Field{[10]uint32{0x03ca582d, 0x0238b2a3, 0x014e0196, 0x0022a3fb, 0x00d18890, 0x0176fc96, 0x00edbe17, 0x017fdee0, 0x00d6becf, 0x000243b8}}}, + {X: Field{[10]uint32{0x03b9bfc1, 0x02fef0a1, 0x00685bf9, 0x0340c484, 0x00b39f57, 0x00cae416, 0x0090a214, 0x03685e3f, 0x02d80331, 0x001449e2}}, Y: Field{[10]uint32{0x03a66b6f, 0x03773a74, 0x00040536, 0x0387dd6f, 0x017bc1f9, 0x00976cf9, 0x03ad759b, 0x0399e230, 0x0147f39c, 0x00016abd}}}, + {X: Field{[10]uint32{0x00f59cdd, 0x03a64115, 0x036cee9f, 0x00215389, 0x030fee50, 0x00bf3c3c, 0x03563082, 0x00c1a122, 0x021fc52b, 0x003c3baa}}, Y: Field{[10]uint32{0x02124f02, 0x02ecb27c, 0x02e63ab3, 0x03ea0460, 0x00d51cf7, 0x02befacc, 0x01e5e016, 0x01c2f7ad, 0x009b944d, 0x000243fe}}}, + {X: Field{[10]uint32{0x03aeea71, 0x0376dac0, 0x01df6648, 0x02bc94ad, 0x00df5b4c, 0x01ed4700, 0x03670c22, 0x003f4984, 0x03f28bf9, 0x000dbf26}}, Y: Field{[10]uint32{0x03836683, 0x0038e8f9, 0x0075e13d, 0x031a7f64, 0x03d975ec, 0x0376eef9, 0x02c81614, 0x01b0a181, 0x0076f1ac, 0x00221f0e}}}, + {X: Field{[10]uint32{0x0391b68b, 0x037caa26, 0x03acdba4, 0x02757996, 0x02135c54, 0x030a7d8b, 0x00d2d041, 0x010db385, 0x026b0cf9, 0x001b8c78}}, Y: Field{[10]uint32{0x00d0e7ae, 0x0258622b, 0x01a85858, 0x021f426a, 0x0194c1af, 0x029de2cc, 0x037d9f77, 0x02f6aad7, 0x02849e63, 0x00008e25}}}, + {X: Field{[10]uint32{0x0198e864, 0x02499c87, 0x02eac357, 0x03613dd0, 0x003da9fa, 0x02b4cea8, 0x02a8a1ce, 0x030afeb1, 0x0249a4b1, 0x00314111}}, Y: Field{[10]uint32{0x03a1027b, 0x02c80769, 0x000af537, 0x0136e350, 0x0345fdc8, 0x0330450e, 0x03d13270, 0x025aedc5, 0x02d283e6, 0x001b4980}}}, + {X: Field{[10]uint32{0x0299ca28, 0x02013b1a, 0x011e6eca, 0x01331148, 0x03b9b2e8, 0x016801ee, 0x028e963b, 0x011356f6, 0x0271f13c, 0x0002a4cf}}, Y: Field{[10]uint32{0x02200faa, 0x003d967d, 0x014f5c1c, 0x01e55084, 0x00c3ce02, 0x00750bf7, 0x01712073, 0x038bdb99, 0x03bcec45, 0x0024c6fc}}}, + {X: Field{[10]uint32{0x00e4a58b, 0x037d977e, 0x021aa83a, 0x0342c4ca, 0x030b8559, 0x0045c0e2, 0x0298884e, 0x00b5886e, 0x021d840c, 0x002400fd}}, Y: Field{[10]uint32{0x00d30895, 0x03d5b73a, 0x01532b67, 0x02b1cd8c, 0x001388a1, 0x02e89a15, 0x02b7ecec, 0x00e54a7f, 0x0124f72b, 0x001431d4}}}, + {X: Field{[10]uint32{0x02a0a886, 0x02df0df2, 0x022c533f, 0x02a7a7cf, 0x02914e21, 0x005ca069, 0x038abdfc, 0x01c33218, 0x00183cb3, 0x003f201f}}, Y: Field{[10]uint32{0x00af00ba, 0x009286fa, 0x02cdee9d, 0x0341ae34, 0x021ccf6f, 0x03559095, 0x02f72639, 0x00756ea6, 0x013e75ac, 0x000eb1e7}}}, + {X: Field{[10]uint32{0x03ee9cbd, 0x024f33b7, 0x033c1862, 0x02b9f901, 0x03cd780d, 0x0142f352, 0x03b608f1, 0x02b08ed0, 0x02e4aca4, 0x000f41ca}}, Y: Field{[10]uint32{0x0265d9b6, 0x0355749f, 0x0385792f, 0x00519f68, 0x03f9c604, 0x00235d89, 0x00fc5630, 0x0327e2a6, 0x0043f721, 0x0001b679}}}, + {X: Field{[10]uint32{0x03f80dc0, 0x02aaf669, 0x01d3d106, 0x02f1eb2c, 0x03ba6e26, 0x008bebe2, 0x03c5eed5, 0x02d29f4a, 0x01947061, 0x003432e1}}, Y: Field{[10]uint32{0x03012e0a, 0x00e791de, 0x0092c9b7, 0x03c507c2, 0x038d7562, 0x006a61da, 0x0107b82d, 0x03730680, 0x0326e9d0, 0x003eff43}}}, + {X: Field{[10]uint32{0x035bc9fd, 0x01b496d8, 0x02e3241a, 0x02b090b3, 0x00267aad, 0x01c88730, 0x019f46cc, 0x03191079, 0x00ab6416, 0x00393b70}}, Y: Field{[10]uint32{0x03cdc71e, 0x0307f0d3, 0x02964b84, 0x01382ec1, 0x01c496fd, 0x020201f4, 0x00344829, 0x02d31012, 0x02e9cea7, 0x003d070e}}}, + {X: Field{[10]uint32{0x017eb4b2, 0x034caaf7, 0x01271557, 0x01046c2d, 0x02ffb806, 0x012f83d7, 0x01a83c88, 0x0244063d, 0x010b2d3d, 0x00188ced}}, Y: Field{[10]uint32{0x015dbcc5, 0x007bc661, 0x00399791, 0x00af7690, 0x01034a3a, 0x00a1622c, 0x030f21e3, 0x00ab095d, 0x0124ffdd, 0x00237eab}}}, + {X: Field{[10]uint32{0x02a19ab5, 0x012df714, 0x015df943, 0x017af78a, 0x03c427e6, 0x03a607da, 0x034e5447, 0x0197889e, 0x0162e272, 0x001b2800}}, Y: Field{[10]uint32{0x0154cce1, 0x015f9944, 0x03a5ce0f, 0x00583854, 0x03223e89, 0x02aece81, 0x03fe297b, 0x009f8290, 0x0363a8f2, 0x0034cfd7}}}, + {X: Field{[10]uint32{0x02fefcfc, 0x02199b8d, 0x005b3cd6, 0x024a2d84, 0x02d6c9d9, 0x0339f2c5, 0x01328ae7, 0x02357703, 0x01aa5d2a, 0x00300481}}, Y: Field{[10]uint32{0x02831d3e, 0x00061643, 0x03b453ad, 0x02affea6, 0x02cf2988, 0x02be2e9f, 0x03d6f6f6, 0x02025786, 0x0399c4f4, 0x002d9797}}}, + {X: Field{[10]uint32{0x02e0e155, 0x02de34b6, 0x00abb4e0, 0x025d29b1, 0x0107b8a5, 0x020143ce, 0x016fb195, 0x01a32d87, 0x03930e62, 0x0038e594}}, Y: Field{[10]uint32{0x00731737, 0x00a26fe0, 0x00828a2f, 0x02973683, 0x003f971f, 0x014e0ecb, 0x00048928, 0x03876460, 0x01462ed6, 0x0007de2b}}}, + {X: Field{[10]uint32{0x00b099ce, 0x0120889b, 0x004f8012, 0x03e142f6, 0x013dc03a, 0x03f6643f, 0x010c1a69, 0x02750c01, 0x00f3702a, 0x0009eff4}}, Y: Field{[10]uint32{0x00643de8, 0x0306c72f, 0x00f390fe, 0x03c36425, 0x00c49fd3, 0x0102f9f0, 0x030c0bce, 0x02baf466, 0x0360e8ca, 0x0008b85a}}}, + {X: Field{[10]uint32{0x0396a2f0, 0x0020281b, 0x023c6cbf, 0x00b1bdd7, 0x012a3717, 0x00a65ea2, 0x02c17771, 0x0255967b, 0x03c02331, 0x0020843e}}, Y: Field{[10]uint32{0x02afee8d, 0x03aa4791, 0x0109716d, 0x0095b469, 0x03bfacbb, 0x01787bac, 0x011d5528, 0x019b2eec, 0x03921011, 0x0007775d}}}, + {X: Field{[10]uint32{0x02347b5e, 0x034869d3, 0x03ab089c, 0x0197e2fb, 0x00ae4d50, 0x0178bfe0, 0x015298a2, 0x02f6037c, 0x02b65fcb, 0x00057319}}, Y: Field{[10]uint32{0x03937c97, 0x02b34c81, 0x0334b6dd, 0x00d1223e, 0x007b225b, 0x01585b4a, 0x03324c9f, 0x020a5b7a, 0x03e93574, 0x002512d1}}}, + {X: Field{[10]uint32{0x00c97976, 0x0006b825, 0x02c4bff8, 0x03f1c9b0, 0x02c7bb08, 0x0279b0d7, 0x021a482a, 0x0005a47a, 0x02a24596, 0x003adede}}, Y: Field{[10]uint32{0x02d1b1f6, 0x008fe08b, 0x003f227c, 0x01380413, 0x02f5596f, 0x00fc195a, 0x03d20e90, 0x01de47f2, 0x0170cc18, 0x00134ba5}}}, + {X: Field{[10]uint32{0x029ba12c, 0x0039f7d7, 0x01ea15fb, 0x001ad029, 0x0118e7c1, 0x025aa11a, 0x02436e09, 0x03a11308, 0x02fced29, 0x0011663e}}, Y: Field{[10]uint32{0x035e6093, 0x0388a3fc, 0x016297dc, 0x015796c2, 0x01978a85, 0x03dc5982, 0x0379dfe7, 0x03a8b0e5, 0x02b6d292, 0x0039cf65}}}, + {X: Field{[10]uint32{0x028600f7, 0x01fbacc6, 0x007058e3, 0x03f06443, 0x00e57d4d, 0x01be4386, 0x02a25917, 0x0396515c, 0x02863612, 0x001260d6}}, Y: Field{[10]uint32{0x03cfa531, 0x003b4df7, 0x017b9825, 0x028b9223, 0x02464c08, 0x003a034d, 0x023b147e, 0x00b30730, 0x013a0fbd, 0x0000edd8}}}, + {X: Field{[10]uint32{0x02335351, 0x0245bdf3, 0x005b9965, 0x02df464c, 0x033cbfe0, 0x0136f70c, 0x023177b0, 0x02019cca, 0x03ed1fcc, 0x000e9b5b}}, Y: Field{[10]uint32{0x026624ea, 0x021a4956, 0x01d0df29, 0x01586f47, 0x0111eb2b, 0x01fc4190, 0x00a6706d, 0x0185fc52, 0x018a314d, 0x00330fcf}}}, + {X: Field{[10]uint32{0x02d7a9f5, 0x035b1ece, 0x02a78fb0, 0x0093b9ee, 0x00f672a0, 0x0080d6dd, 0x012d2efb, 0x03f8c33a, 0x01866860, 0x00084821}}, Y: Field{[10]uint32{0x00bebbb7, 0x01d2825e, 0x01d7ce10, 0x038d07c9, 0x0396ff0c, 0x03dba75c, 0x02e8be11, 0x02c7b0ff, 0x01be0051, 0x002abc51}}}, + {X: Field{[10]uint32{0x026e4e06, 0x03681349, 0x03cc867c, 0x0209b3bf, 0x01833ac0, 0x0072c46e, 0x03d609c5, 0x00bc2598, 0x032ac9bb, 0x003e0644}}, Y: Field{[10]uint32{0x00891de5, 0x009c8e53, 0x02bb37e2, 0x03bdd91a, 0x00c52f48, 0x01012bbb, 0x03fd1a06, 0x00c172ab, 0x0238ec6a, 0x002c7f79}}}, + {X: Field{[10]uint32{0x02ec009d, 0x02a50df0, 0x00428423, 0x028484f1, 0x01168385, 0x02bb58b6, 0x0334d720, 0x0190310d, 0x01d88786, 0x0014db01}}, Y: Field{[10]uint32{0x036df0d5, 0x0224c976, 0x02f134b4, 0x03b87ea7, 0x01fd84dd, 0x020e8231, 0x03c2b43c, 0x037861a2, 0x0100d827, 0x001fd2f8}}}, + {X: Field{[10]uint32{0x01df722b, 0x02dceea8, 0x024bd650, 0x02c68e68, 0x0109de2f, 0x00b22a16, 0x02e3ed34, 0x036dd8df, 0x023ec4c6, 0x0010ca04}}, Y: Field{[10]uint32{0x03a40857, 0x0275fa58, 0x01b1594c, 0x00403d75, 0x014ee11f, 0x02d3e1bd, 0x0222fa71, 0x01dd4f9a, 0x02ea0127, 0x00207000}}}, + {X: Field{[10]uint32{0x012a5f17, 0x00369a04, 0x01a08155, 0x00cb543a, 0x016a85fc, 0x003e6170, 0x029e5360, 0x0265461a, 0x02fef852, 0x003cf855}}, Y: Field{[10]uint32{0x008892d2, 0x037426ad, 0x010915d5, 0x0339d063, 0x03a2f441, 0x00d8ae14, 0x0167e83c, 0x0039bd97, 0x026b56ff, 0x00247ff5}}}, + {X: Field{[10]uint32{0x03456cc9, 0x00aa3622, 0x030e6824, 0x02bfabc0, 0x006645a1, 0x0153102b, 0x028a716a, 0x00fd0b4b, 0x035984e1, 0x000cae9c}}, Y: Field{[10]uint32{0x00b4c6f5, 0x022c60ef, 0x02200f86, 0x017279f9, 0x03f05576, 0x03bc9324, 0x02ab3178, 0x02c542a0, 0x031e1c32, 0x0019fff3}}}, + {X: Field{[10]uint32{0x01829311, 0x02f02b16, 0x03dddcca, 0x024c62ae, 0x029c868b, 0x01362d2a, 0x00674cf6, 0x00417946, 0x033a043d, 0x0032e70a}}, Y: Field{[10]uint32{0x002b691f, 0x0181fba1, 0x015db242, 0x017ef4af, 0x01834bea, 0x02721674, 0x013ac479, 0x001daf7b, 0x02f2233f, 0x0007f19f}}}, + {X: Field{[10]uint32{0x029234f0, 0x028c6f4b, 0x01e856ef, 0x015eaf06, 0x035effa9, 0x0026f34e, 0x0349695e, 0x01c1c0c8, 0x0058b7bf, 0x003853ca}}, Y: Field{[10]uint32{0x00e08bdb, 0x03457937, 0x01761f3c, 0x00352a25, 0x02cf8cbf, 0x00357fc1, 0x03cbc258, 0x03f4e620, 0x009dd3f3, 0x000f8139}}}, + {X: Field{[10]uint32{0x03550d82, 0x02dce221, 0x01e010d7, 0x03b16102, 0x0274810d, 0x025ffc09, 0x0078113c, 0x02e38c33, 0x037b1c27, 0x00055afa}}, Y: Field{[10]uint32{0x00bc5371, 0x009ea464, 0x0017b16e, 0x0318305b, 0x013a8e92, 0x0164e664, 0x02adf2fd, 0x01bb20d4, 0x030a8021, 0x0031c45c}}}, + {X: Field{[10]uint32{0x0055d600, 0x0262d6cb, 0x013557b7, 0x0267e00e, 0x01a24a33, 0x028b76a8, 0x000e4959, 0x01a1912e, 0x03e6b9b4, 0x003797a9}}, Y: Field{[10]uint32{0x00d48ee8, 0x00f18563, 0x037d53a0, 0x019c8adf, 0x02b9b1de, 0x0060b354, 0x00a9d24e, 0x008f4b70, 0x0027e6a8, 0x00224068}}}, + {X: Field{[10]uint32{0x0017c3c7, 0x02e78ffb, 0x01adeb79, 0x005284a0, 0x00aea074, 0x02cafc3b, 0x037312e7, 0x03b51896, 0x03688bfa, 0x0023b774}}, Y: Field{[10]uint32{0x0155da7b, 0x03b6db1e, 0x032316d8, 0x02c5713d, 0x0359b885, 0x0088f95e, 0x00a48a89, 0x0074d357, 0x02f92617, 0x000b6d0e}}}, + {X: Field{[10]uint32{0x00b1d4e3, 0x02b4f5fc, 0x02b85fb2, 0x003fbe57, 0x0187872e, 0x0088dfb6, 0x02489ae2, 0x03477a3e, 0x036a665a, 0x001725c6}}, Y: Field{[10]uint32{0x038b1f66, 0x031a4e97, 0x039a6c4f, 0x01ecc0b4, 0x01aa8d4d, 0x00ae8076, 0x0332ff74, 0x02bdbc2b, 0x019837c2, 0x00135c7d}}}, + {X: Field{[10]uint32{0x02b9e228, 0x03edc291, 0x0076885c, 0x03bcd095, 0x01bd3586, 0x00aa3c73, 0x0366589a, 0x00adab56, 0x013c2821, 0x003b7ec9}}, Y: Field{[10]uint32{0x02616c00, 0x02ca892c, 0x00c1d7f7, 0x0380944d, 0x02594e42, 0x03cc18a4, 0x00b26b84, 0x007da6e3, 0x0208b7e8, 0x000f96d9}}}, + {X: Field{[10]uint32{0x01525c13, 0x0315adf7, 0x03384737, 0x031acb19, 0x03d2373c, 0x00895d2e, 0x0163dd4e, 0x01dcb36c, 0x024ae127, 0x0010e57c}}, Y: Field{[10]uint32{0x00103526, 0x02f99304, 0x0047a819, 0x037006d1, 0x00676581, 0x03dce55d, 0x0096913d, 0x0030b192, 0x03254c80, 0x002eb1b9}}}, + {X: Field{[10]uint32{0x006866f5, 0x03c3fc65, 0x023eb182, 0x014d7d8a, 0x038c7823, 0x017d6a1f, 0x0113b64b, 0x019adfe2, 0x02d573a7, 0x00204402}}, Y: Field{[10]uint32{0x01a00c73, 0x02d05c3a, 0x029c9d28, 0x02ea61c2, 0x01c6afb8, 0x01477675, 0x0068f7d0, 0x00226674, 0x016e325b, 0x0014b2b0}}}, + {X: Field{[10]uint32{0x0395120f, 0x008d1efa, 0x02e407f7, 0x017b9777, 0x01dee3a0, 0x0285085b, 0x02358c3a, 0x020519ab, 0x01514116, 0x003f4e81}}, Y: Field{[10]uint32{0x028ee5b7, 0x01ef34f6, 0x03250e4c, 0x001d6339, 0x0011a3c6, 0x01f812c8, 0x01b7b88b, 0x02c4aae2, 0x030d45ce, 0x000abcbc}}}, + {X: Field{[10]uint32{0x02435ff9, 0x03f0fbf9, 0x018fa4e3, 0x00caaf46, 0x0276d1a0, 0x0285f5b0, 0x0305b6df, 0x03bbe8ff, 0x0358a7ec, 0x0005e956}}, Y: Field{[10]uint32{0x01574d4f, 0x026fdc6e, 0x02240bc9, 0x02915f81, 0x02418f35, 0x01c7c14d, 0x01cee72e, 0x019f043f, 0x0158a3ad, 0x0035c9ce}}}, + {X: Field{[10]uint32{0x03789b6d, 0x02d0224e, 0x0003bc49, 0x00157b5c, 0x02793fd0, 0x0057a2c8, 0x01c73aee, 0x017a8231, 0x03b8e2ca, 0x0021c32d}}, Y: Field{[10]uint32{0x03e67aa3, 0x003b8106, 0x01cc6a7b, 0x03b2b542, 0x0104badb, 0x0089912a, 0x017a9bce, 0x0072bc9b, 0x03407b70, 0x0030cf22}}}, + {X: Field{[10]uint32{0x0271f8a7, 0x00b306d3, 0x00897545, 0x00db6039, 0x03ffbf7c, 0x01432829, 0x0053c89a, 0x03bc02b7, 0x01fcdc46, 0x003e5471}}, Y: Field{[10]uint32{0x0392c95f, 0x0081ce31, 0x02648751, 0x02495e4b, 0x01c1705b, 0x0137e796, 0x0064d7d2, 0x033090c2, 0x00217849, 0x001ab8be}}}, + {X: Field{[10]uint32{0x02a0caf1, 0x01240b25, 0x02d6131e, 0x00a858df, 0x036cbd83, 0x0062b68f, 0x011bb06a, 0x0319dab8, 0x037f3b92, 0x002bae01}}, Y: Field{[10]uint32{0x03cc1e35, 0x00cb87ab, 0x00cfde02, 0x01f42cdf, 0x036c8a6d, 0x02fcc5ff, 0x0275fb98, 0x0290c253, 0x011df5d4, 0x000a7d07}}}, + {X: Field{[10]uint32{0x013b78f9, 0x0080d7cc, 0x0260cb9d, 0x022d6577, 0x038482b7, 0x036161f0, 0x0118a7e5, 0x00b9601b, 0x01975d2f, 0x00351bd3}}, Y: Field{[10]uint32{0x006392f0, 0x00d246ba, 0x0233c105, 0x02650c5b, 0x02f704e1, 0x00c7fb90, 0x02154ef0, 0x0045d8e5, 0x01aa3bdc, 0x002575e0}}}, + {X: Field{[10]uint32{0x0229b201, 0x0297c71e, 0x02eaf4f3, 0x025dcf1d, 0x03af810b, 0x0126e7b0, 0x021b54ac, 0x03627cb8, 0x03444b4b, 0x00001abe}}, Y: Field{[10]uint32{0x02bf932f, 0x0186089b, 0x0334eaf0, 0x00342fb4, 0x0364db46, 0x00e22acd, 0x00ed90d1, 0x02d3384d, 0x001fd7d3, 0x000d40a4}}}, + {X: Field{[10]uint32{0x03d86976, 0x00bdfb7a, 0x00394093, 0x01533ebe, 0x01e66349, 0x0161ebd7, 0x03f60869, 0x005c0e9e, 0x0182a38b, 0x0017c0b9}}, Y: Field{[10]uint32{0x017afec2, 0x01a8014b, 0x00a7def4, 0x00328ada, 0x02ccfa5d, 0x0102e3f8, 0x00b06bf7, 0x029e5ac9, 0x00de92f3, 0x0028121f}}}, + {X: Field{[10]uint32{0x020599fe, 0x014b4e82, 0x02e33c66, 0x01d67155, 0x03ad70eb, 0x00d5199f, 0x007b885f, 0x00b3b568, 0x00826043, 0x0009909d}}, Y: Field{[10]uint32{0x0028ce85, 0x03e163ae, 0x00c62949, 0x033db811, 0x03a63867, 0x00d0114e, 0x02ea7379, 0x00e0bf5d, 0x00fe2560, 0x0004648e}}}, + {X: Field{[10]uint32{0x029f91dc, 0x01999811, 0x037ff2cd, 0x029f8796, 0x014f03a5, 0x017a0dfb, 0x0319a7dd, 0x02b7694a, 0x025ad327, 0x001aca8f}}, Y: Field{[10]uint32{0x0254c6d9, 0x0012f3a2, 0x0257a22f, 0x0197a35f, 0x01354ed2, 0x036a7a51, 0x03365601, 0x020be83c, 0x012606b4, 0x000be7d1}}}, + {X: Field{[10]uint32{0x035daa79, 0x000d1710, 0x03dc4fcc, 0x01df5d25, 0x02e5fbaf, 0x03bc4fa2, 0x010934dd, 0x013eeaac, 0x008b7e21, 0x0009622e}}, Y: Field{[10]uint32{0x01435bbf, 0x02f04531, 0x035e151e, 0x013eb2e8, 0x0261ca64, 0x03c69476, 0x03f142ce, 0x01b53235, 0x010bd3ba, 0x000f973e}}}, + {X: Field{[10]uint32{0x02551a93, 0x0173fe77, 0x03fcbcff, 0x011b0830, 0x02e4e3d8, 0x02805012, 0x00178b40, 0x00bbbfea, 0x01469285, 0x00365210}}, Y: Field{[10]uint32{0x02a6d5a4, 0x020962e5, 0x024ccdbb, 0x02f65a61, 0x0213ea0a, 0x02b66618, 0x00a12196, 0x03109d0d, 0x017fe628, 0x00356c3f}}}, + {X: Field{[10]uint32{0x030de2ff, 0x02713a8e, 0x025eb9fe, 0x01e19f3b, 0x005ccc1e, 0x02dbd1d5, 0x0364b1c9, 0x00821c32, 0x03dc3a2f, 0x00173e07}}, Y: Field{[10]uint32{0x01bc0d7d, 0x023ee305, 0x031131b7, 0x0094036b, 0x01e7ff31, 0x03b1cd1c, 0x01dc7005, 0x023977df, 0x031cf6bb, 0x00382c2a}}}, + {X: Field{[10]uint32{0x03e879a7, 0x01999836, 0x023203b8, 0x01c459de, 0x00f8ed24, 0x004cb1a5, 0x00b3f174, 0x03f6d5c1, 0x037eb719, 0x00106d3b}}, Y: Field{[10]uint32{0x0221c85f, 0x0024ee0d, 0x0081ae12, 0x02a8722a, 0x009f44c2, 0x03ab0669, 0x028b459e, 0x0088d736, 0x01b1cbae, 0x0029bf99}}}, + {X: Field{[10]uint32{0x03117af7, 0x01c26a6e, 0x03bdc5c2, 0x00fd01bc, 0x007a4c0a, 0x019013b2, 0x01d16918, 0x02478aa3, 0x032c41f6, 0x0010fb55}}, Y: Field{[10]uint32{0x02481da3, 0x03481cfe, 0x03ac3fd4, 0x024c36be, 0x0390a2b0, 0x02f9351d, 0x02cbbab7, 0x000cd1ae, 0x01b890b4, 0x002dee78}}}, + {X: Field{[10]uint32{0x03397de3, 0x00e39186, 0x02e421c3, 0x0107a17e, 0x0281722b, 0x00bc6557, 0x00bb5260, 0x021a98c5, 0x02192230, 0x00138042}}, Y: Field{[10]uint32{0x03a65fa2, 0x016689fa, 0x02ec4a61, 0x038dc311, 0x00283b44, 0x02f42ee3, 0x0076e7b3, 0x017b6112, 0x011c0347, 0x003c34fc}}}, + {X: Field{[10]uint32{0x0211f36b, 0x03510bfb, 0x01e2241d, 0x00a9f4d5, 0x0045e15d, 0x007b7361, 0x03c385e8, 0x01af3136, 0x00bb7fc8, 0x002cd827}}, Y: Field{[10]uint32{0x009c5f68, 0x00643237, 0x018e20e6, 0x006aa85a, 0x00c30891, 0x01deeea2, 0x00017dc9, 0x00d3fe01, 0x01aca3df, 0x002181f9}}}, + {X: Field{[10]uint32{0x03965b4e, 0x01b90fb7, 0x009d1df9, 0x02dac9c9, 0x02d1bdd6, 0x036c4497, 0x0168cdf6, 0x03ef4def, 0x00b20543, 0x00111798}}, Y: Field{[10]uint32{0x03715fd1, 0x0373c2f1, 0x025b00b5, 0x0148a1e9, 0x03c65f8b, 0x0248b9c4, 0x03fdc7cf, 0x02d1eafa, 0x018a8c4a, 0x00297e91}}}, + {X: Field{[10]uint32{0x00f50fc9, 0x02ed90c4, 0x0364cf9d, 0x01278032, 0x01be875b, 0x03c53062, 0x0359a7be, 0x03267e1a, 0x02279264, 0x001c27e0}}, Y: Field{[10]uint32{0x00960d10, 0x00540c56, 0x0362883f, 0x03ffeaab, 0x013d4903, 0x01a39379, 0x029064b4, 0x034afa29, 0x03f0cd28, 0x0005a009}}}, + {X: Field{[10]uint32{0x01fb4ba3, 0x019ffe4a, 0x00cdbe15, 0x017befc6, 0x008a2e9d, 0x00ccfc87, 0x012e725a, 0x00902e89, 0x000dcbd1, 0x0018aa88}}, Y: Field{[10]uint32{0x020a1347, 0x038fca27, 0x021b7b18, 0x00ac4b7b, 0x001ec328, 0x010f906b, 0x0106b468, 0x02f6f12e, 0x016c7017, 0x00066abf}}}, + {X: Field{[10]uint32{0x0082c09e, 0x03c42b2e, 0x02e11f38, 0x01ff2206, 0x01e12398, 0x000b8aae, 0x01f23898, 0x01191bea, 0x01588ed5, 0x000ae9ce}}, Y: Field{[10]uint32{0x035a25a6, 0x03cf848d, 0x00423721, 0x024ddd46, 0x03d8f8a1, 0x012004d4, 0x02cc45d3, 0x0262bbe1, 0x021c9c0a, 0x003cdf6a}}}, + {X: Field{[10]uint32{0x01005de8, 0x00539bde, 0x02397073, 0x0380d64a, 0x01e266e9, 0x02d677f8, 0x01c0f549, 0x02da6ab9, 0x01cce8fb, 0x00219cae}}, Y: Field{[10]uint32{0x0305af65, 0x025ea1a6, 0x01aa399a, 0x01d699ad, 0x02c411e8, 0x03efe7ab, 0x00aac680, 0x0071e6b7, 0x036aefb6, 0x00083611}}}, + {X: Field{[10]uint32{0x01ab6ab5, 0x015c7a2f, 0x000eda26, 0x03984ccc, 0x031f32be, 0x017b9705, 0x03dbac10, 0x00a665e7, 0x00028420, 0x000cd32c}}, Y: Field{[10]uint32{0x02a574d4, 0x01686216, 0x0038d96e, 0x02d92759, 0x00e4e972, 0x01e7172e, 0x0345bfd5, 0x021e3d1a, 0x019f3da7, 0x002209f6}}}, + {X: Field{[10]uint32{0x01ac6d4d, 0x03c8a68d, 0x01afe602, 0x01391efc, 0x00e9f25f, 0x03d93e07, 0x00cad6a2, 0x03b01cd5, 0x0207d260, 0x000cacc3}}, Y: Field{[10]uint32{0x003c0427, 0x01821d0f, 0x03941856, 0x0223cc18, 0x025c5e36, 0x0049b113, 0x02904181, 0x0241e1bc, 0x030d64ee, 0x001c7ff3}}}, + {X: Field{[10]uint32{0x039a8451, 0x00798028, 0x03a05076, 0x000970e3, 0x033b5ce4, 0x0267a6fe, 0x02401ff2, 0x01398d0f, 0x02587a4b, 0x00394265}}, Y: Field{[10]uint32{0x03bb2ece, 0x00b1196c, 0x03241f13, 0x0059c3f1, 0x00683a39, 0x031acce0, 0x02acccf5, 0x026a1a53, 0x02a86542, 0x001ec0e0}}}, + {X: Field{[10]uint32{0x01d6477d, 0x01ba4c39, 0x026abd31, 0x0084a76d, 0x01ca6841, 0x02cf5e1b, 0x02ea0353, 0x00e6f382, 0x004c2bf5, 0x002ce1cb}}, Y: Field{[10]uint32{0x0101e285, 0x01342402, 0x034f9242, 0x01c48b43, 0x0159391c, 0x02775058, 0x037ed1fa, 0x0321bcec, 0x00afe4c8, 0x0001f381}}}, + {X: Field{[10]uint32{0x0135d07b, 0x0101b7a6, 0x00908f3b, 0x01d28b7e, 0x0006095e, 0x027d3106, 0x0014d964, 0x038eacb9, 0x03df9156, 0x0034ad5b}}, Y: Field{[10]uint32{0x03e3b23f, 0x00ed403b, 0x012aaadc, 0x02bcdc55, 0x03b06a33, 0x011aa397, 0x00b49259, 0x02315aa1, 0x001b6766, 0x00110f0b}}}, + {X: Field{[10]uint32{0x037fbacb, 0x02c56a7c, 0x0208115d, 0x03f58ac2, 0x034e8288, 0x0327d06c, 0x03f32e1e, 0x031d9648, 0x027e1074, 0x0003da61}}, Y: Field{[10]uint32{0x013fca16, 0x01417190, 0x00e58cd0, 0x039dbf74, 0x0368709b, 0x01c6708a, 0x0204c6ed, 0x02945a73, 0x02252a11, 0x003f5b1b}}}, + {X: Field{[10]uint32{0x01e64988, 0x01c362ae, 0x02579626, 0x0261556d, 0x00cae238, 0x0223f33b, 0x00778c86, 0x004706b6, 0x00b4a9ab, 0x002f060c}}, Y: Field{[10]uint32{0x022e3c81, 0x0256b130, 0x01ea5b6d, 0x032c4b6e, 0x028e95cd, 0x00f4323c, 0x039a0faf, 0x0184cc65, 0x0089f3c4, 0x002d8910}}}, + {X: Field{[10]uint32{0x038dbafc, 0x0392d1fc, 0x003b7445, 0x007a887d, 0x02126cfa, 0x03357ee4, 0x004bbe83, 0x027f6a63, 0x0221dc72, 0x003eaeab}}, Y: Field{[10]uint32{0x002d8cdc, 0x00cd8016, 0x01fbcc4c, 0x02eacb02, 0x03177ce1, 0x035abb67, 0x03513b3e, 0x0160cb1c, 0x03756446, 0x0006d5a5}}}, + {X: Field{[10]uint32{0x011f8bd4, 0x00f65b5e, 0x0157b547, 0x000c85b7, 0x03bcd3fc, 0x00923638, 0x012497ea, 0x0130f7e4, 0x01014d5d, 0x0024ce18}}, Y: Field{[10]uint32{0x00936725, 0x00c3e8db, 0x02d951d6, 0x00ae3a01, 0x019e57f2, 0x0129ab5c, 0x033add54, 0x0058f13f, 0x016ac141, 0x000f63f2}}}, + {X: Field{[10]uint32{0x02fd07f8, 0x02a0ffa9, 0x007f2094, 0x00934c05, 0x02da0a43, 0x031ac61b, 0x0146b8ee, 0x00a08165, 0x015f85c4, 0x00314c4b}}, Y: Field{[10]uint32{0x01d2992f, 0x03e01b11, 0x0251beda, 0x03a2cd6d, 0x00332898, 0x035511cd, 0x03be12c8, 0x001d5948, 0x022a79ba, 0x003e2b9b}}}, + {X: Field{[10]uint32{0x0203b057, 0x01202d7c, 0x03388558, 0x00a046a9, 0x01b73b11, 0x02808bd0, 0x0375c4dd, 0x00bd01b6, 0x009652c5, 0x002823c9}}, Y: Field{[10]uint32{0x033eb2e5, 0x0371d14b, 0x00ccc845, 0x0094df13, 0x02191d7a, 0x03b3f8f2, 0x01aa9251, 0x0387657a, 0x03de9ab5, 0x0028e5b1}}}, + {X: Field{[10]uint32{0x00f634df, 0x01792f50, 0x0205bc52, 0x02d626e2, 0x02a036e0, 0x00289469, 0x034b34f0, 0x01be9829, 0x030fe8df, 0x0024f54c}}, Y: Field{[10]uint32{0x01838756, 0x031582dc, 0x03a08f5a, 0x019df454, 0x000c4df5, 0x0321f68a, 0x02774f77, 0x00939575, 0x02ea10f4, 0x0032857e}}}, + {X: Field{[10]uint32{0x02b51fa2, 0x0157e4aa, 0x024f6170, 0x004c3c16, 0x005c35b8, 0x03d94844, 0x010a9941, 0x02dcafa1, 0x03ccdfca, 0x0001188a}}, Y: Field{[10]uint32{0x03ca2d4f, 0x02d07a75, 0x01a8cd29, 0x02918259, 0x00e883d2, 0x0256d4f2, 0x01cd2456, 0x02c95b49, 0x002d31ee, 0x0036581c}}}, + {X: Field{[10]uint32{0x00ef9fe5, 0x03b821b8, 0x00d8807a, 0x00fb45f2, 0x010fb6c8, 0x004e30c3, 0x03a58728, 0x02176652, 0x036c7dd8, 0x0028c980}}, Y: Field{[10]uint32{0x02cb9bf7, 0x00f359cc, 0x01a53489, 0x03871d79, 0x03456a6c, 0x01da2685, 0x00aafcde, 0x028554c7, 0x02693719, 0x002d1973}}}, + {X: Field{[10]uint32{0x02ef77a5, 0x0082d69f, 0x00946b1d, 0x02a6129b, 0x03f3d5e7, 0x03e97154, 0x030c887b, 0x01f9e5c6, 0x017e1963, 0x0008d510}}, Y: Field{[10]uint32{0x01f4bd4b, 0x027d22ca, 0x02d4d216, 0x014cf3d3, 0x01ea7400, 0x03cd3d02, 0x014fbf99, 0x034f2ec9, 0x0321b6ea, 0x002056a5}}}, + {X: Field{[10]uint32{0x03ce6fca, 0x01f322ed, 0x01f9f2b0, 0x00677757, 0x033a4078, 0x008e0435, 0x01a746b0, 0x005d3d73, 0x016dfc53, 0x00274d1b}}, Y: Field{[10]uint32{0x0376c806, 0x00acd5e5, 0x029b9851, 0x000f7c23, 0x014a199b, 0x007a4154, 0x01a8ff9f, 0x00f97295, 0x006b6429, 0x0026db30}}}, + {X: Field{[10]uint32{0x0148dd01, 0x028ccc3f, 0x00564bb5, 0x02d01542, 0x03bba638, 0x03af8843, 0x01f000ad, 0x029edfe5, 0x038ec643, 0x001cf20a}}, Y: Field{[10]uint32{0x0005b614, 0x03c4da42, 0x02f075ff, 0x01737c35, 0x027d2acf, 0x0132caf6, 0x035f61b8, 0x017187f8, 0x0299a088, 0x003ffc55}}}, + {X: Field{[10]uint32{0x00798ac8, 0x00e72fff, 0x011afc9b, 0x02fdb28a, 0x010f2d29, 0x02141ae5, 0x01316728, 0x0357473e, 0x01d5a0b2, 0x0024091a}}, Y: Field{[10]uint32{0x03c3ade4, 0x00f7a247, 0x030d4fa6, 0x036eafa2, 0x03cd78ad, 0x032bf93f, 0x02378bff, 0x01da74d0, 0x0011d71c, 0x0000d5b4}}}, + {X: Field{[10]uint32{0x03110637, 0x03f88f87, 0x00371b1e, 0x03a7f540, 0x00dc4013, 0x0066e251, 0x0123afb8, 0x021bc14d, 0x00fb3a0c, 0x00399c28}}, Y: Field{[10]uint32{0x020b31b8, 0x019677c9, 0x0250a9bf, 0x0382772c, 0x03272557, 0x001f967b, 0x03db5a3d, 0x0372c855, 0x036bcd13, 0x00021a44}}}, + {X: Field{[10]uint32{0x0205c395, 0x034f56e2, 0x005fcb9a, 0x03961255, 0x01b57f11, 0x033ee732, 0x0368e270, 0x02079ac3, 0x006d5265, 0x003cffbc}}, Y: Field{[10]uint32{0x01b8f553, 0x01d55106, 0x012f4ff3, 0x034412c2, 0x01570752, 0x03e97eef, 0x0045176e, 0x0083b313, 0x01971444, 0x000cacba}}}, + {X: Field{[10]uint32{0x016a05bd, 0x02974e4e, 0x02cac70c, 0x02711c74, 0x00f942c0, 0x03306762, 0x00fc28a8, 0x03611158, 0x02633958, 0x001ca8dd}}, Y: Field{[10]uint32{0x035ee1ad, 0x03d1521c, 0x03ba8503, 0x011834bd, 0x01729ce8, 0x000ba363, 0x004b3b84, 0x0041c3da, 0x030e6e12, 0x0037a6c6}}}, + {X: Field{[10]uint32{0x005300b0, 0x00def620, 0x01ae22b6, 0x013ea133, 0x00417289, 0x0243379a, 0x019c3a81, 0x01f7bd04, 0x02d9c43b, 0x000e2de2}}, Y: Field{[10]uint32{0x03d01e6f, 0x039d2a2c, 0x01c8423d, 0x01a77214, 0x010de7cc, 0x02ffccba, 0x0204f175, 0x017d461c, 0x01676c4f, 0x00028605}}}, + {X: Field{[10]uint32{0x0334752e, 0x00563fca, 0x013af68e, 0x0224232f, 0x03540e2e, 0x00653ec8, 0x026fac9e, 0x01f14db1, 0x02c81d2e, 0x0036e5a2}}, Y: Field{[10]uint32{0x02b48a0a, 0x03969cea, 0x00769a24, 0x023bf453, 0x0104179e, 0x018d1c9c, 0x02b4af0a, 0x025caeb1, 0x03ab79d9, 0x00135715}}}, + {X: Field{[10]uint32{0x00aad318, 0x0174d9ea, 0x02435a14, 0x03e65f1c, 0x02505dd4, 0x007b4d6c, 0x0114f28c, 0x01360dc4, 0x02792d3a, 0x000ab385}}, Y: Field{[10]uint32{0x0226f625, 0x0239cfcd, 0x03539cc8, 0x03be86b8, 0x010405b0, 0x01a17db4, 0x0063b87f, 0x01d3933b, 0x012a2468, 0x0014c50c}}}, + {X: Field{[10]uint32{0x01bae108, 0x03e4ebcf, 0x0277e852, 0x0060958c, 0x00bb1fda, 0x0189c9f1, 0x00a46008, 0x0037b76e, 0x02690c39, 0x000cb603}}, Y: Field{[10]uint32{0x00dc7c07, 0x0155ea58, 0x01d08cbd, 0x0048f67c, 0x03bc1c3e, 0x0207df36, 0x03cb3f81, 0x0341a9b4, 0x016fea89, 0x0000f1f6}}}, + {X: Field{[10]uint32{0x02ee3908, 0x0229021d, 0x01521d8e, 0x00379497, 0x03f1bf05, 0x01176cf2, 0x00e61a29, 0x01ad018a, 0x028ae7fe, 0x000fbd27}}, Y: Field{[10]uint32{0x01a123f2, 0x00778200, 0x0092bd3d, 0x009d630f, 0x033ff72d, 0x018c456b, 0x0031b54d, 0x017ec935, 0x035c62f4, 0x0010e071}}}, + {X: Field{[10]uint32{0x009722da, 0x009d508f, 0x006405aa, 0x03996797, 0x000e280e, 0x032235ec, 0x03517d41, 0x00b340e6, 0x00d5cdb8, 0x00214e02}}, Y: Field{[10]uint32{0x037e8f5e, 0x0308a7d7, 0x0200fb4d, 0x000e4b50, 0x023ed18d, 0x005c8890, 0x00a652f8, 0x025899a6, 0x00449b2a, 0x003059df}}}, + {X: Field{[10]uint32{0x03c8584f, 0x0076de07, 0x02f4958c, 0x03cca6b7, 0x03306ee4, 0x02187f32, 0x03520bd8, 0x0017fa15, 0x0083490c, 0x0015cbf5}}, Y: Field{[10]uint32{0x0013f4a5, 0x00000d8d, 0x03ca0be3, 0x0156cc7a, 0x00d38e91, 0x02ced865, 0x00107c06, 0x008c0b3c, 0x01061039, 0x0020ab32}}}, + {X: Field{[10]uint32{0x036e1386, 0x024d60cd, 0x0248138c, 0x01135164, 0x00fa7713, 0x013655b9, 0x02a9a2dd, 0x0328c5d6, 0x03b29aa8, 0x002c72ea}}, Y: Field{[10]uint32{0x02292ec9, 0x0234b759, 0x015fcbc5, 0x03d80300, 0x01265cb2, 0x01050270, 0x021de030, 0x03f7c1ae, 0x00f17f9a, 0x00222330}}}, + {X: Field{[10]uint32{0x036bab20, 0x02eee60b, 0x001a16dd, 0x00359c1c, 0x012c5c96, 0x01269ba0, 0x000a65a1, 0x00c4d1d6, 0x03924239, 0x003e15b2}}, Y: Field{[10]uint32{0x00536674, 0x02540452, 0x03869c55, 0x030b5758, 0x0377d9d6, 0x01704477, 0x01f580f6, 0x0003a664, 0x01ba192c, 0x0030cd44}}}, + {X: Field{[10]uint32{0x0273920e, 0x03f0e9fb, 0x00e230ff, 0x03edb04a, 0x039eed92, 0x015aeece, 0x0042887b, 0x004a78b0, 0x00d4773e, 0x00385807}}, Y: Field{[10]uint32{0x001054ca, 0x02805bcc, 0x00ec96f4, 0x02328142, 0x000a7864, 0x026e87f3, 0x0247c714, 0x01de5bb8, 0x00c8a38c, 0x000601d2}}}, + {X: Field{[10]uint32{0x027c7e72, 0x024a38cd, 0x01534a98, 0x02ae5d22, 0x00e8b37c, 0x0032fc76, 0x02206a5b, 0x0185dd72, 0x00d45ffb, 0x00263b88}}, Y: Field{[10]uint32{0x0273c610, 0x02391958, 0x03c30697, 0x03811486, 0x01854b70, 0x023f1017, 0x02b5e6e8, 0x036d45a2, 0x00e1ea42, 0x000b7d2b}}}, + {X: Field{[10]uint32{0x01fe179f, 0x02b53bb7, 0x00246ec0, 0x0107d6b3, 0x035417bc, 0x03b74784, 0x01cfe95b, 0x024168c7, 0x0257acde, 0x0011e5b2}}, Y: Field{[10]uint32{0x00a367a8, 0x0258a87c, 0x0015f8ff, 0x028d18fe, 0x015bc565, 0x0159308e, 0x03637e59, 0x00e00acd, 0x0122395a, 0x001d04fd}}}, + {X: Field{[10]uint32{0x02341200, 0x01a2f746, 0x01d4006c, 0x00da6aef, 0x03cfd555, 0x01b1f7e7, 0x03627fd5, 0x02c2e356, 0x006438ad, 0x002cd9f2}}, Y: Field{[10]uint32{0x028fba51, 0x0092678b, 0x0349dfd2, 0x03d72715, 0x02b4986c, 0x0089a1c0, 0x002f3657, 0x03a059e6, 0x03440b99, 0x00300d91}}}, + {X: Field{[10]uint32{0x00914d29, 0x01fd29e2, 0x01386a74, 0x00293c9f, 0x00e74076, 0x00837a11, 0x02244c00, 0x037b3df8, 0x004b723d, 0x0036cda2}}, Y: Field{[10]uint32{0x0179e023, 0x03ccccdf, 0x023b40e5, 0x0093f683, 0x03fef90e, 0x037bc3ca, 0x01e07507, 0x00e8f0a8, 0x03cc2a74, 0x0022b921}}}, + {X: Field{[10]uint32{0x01a316c4, 0x0171a826, 0x03123ccf, 0x00b9b1b0, 0x0176b473, 0x007bbd3e, 0x02458213, 0x0084aea3, 0x0018f71c, 0x001965c6}}, Y: Field{[10]uint32{0x013604db, 0x001dd538, 0x035db4cd, 0x00c71c0d, 0x01526a28, 0x00dd8446, 0x0087f391, 0x01434cec, 0x03913533, 0x001057d9}}}, + {X: Field{[10]uint32{0x00ebd65a, 0x0332b1d8, 0x01338fcb, 0x00fe5868, 0x01905390, 0x01fadb36, 0x0182a639, 0x03d2c908, 0x033a13a8, 0x003cbd3a}}, Y: Field{[10]uint32{0x00ef9ca8, 0x0032bf82, 0x00b6e795, 0x00fce8ef, 0x0018811b, 0x03aae3af, 0x02dc8b74, 0x02535c82, 0x027b667e, 0x00295d75}}}, + {X: Field{[10]uint32{0x01113a49, 0x01ad34c7, 0x00a47e8c, 0x01df301a, 0x03884b3f, 0x034f249f, 0x028fa51f, 0x03c318cc, 0x020da058, 0x0028939e}}, Y: Field{[10]uint32{0x010ef78b, 0x01c84bd1, 0x00c81a9a, 0x00559179, 0x010bcee6, 0x00a5c675, 0x032fe3f8, 0x0295a67a, 0x003079ac, 0x002fa36e}}}, + {X: Field{[10]uint32{0x01efad5a, 0x0076dc90, 0x024b8098, 0x029d23c2, 0x0142212d, 0x03af5660, 0x036cc325, 0x005e5df6, 0x00cb77e1, 0x0039668f}}, Y: Field{[10]uint32{0x00a800d9, 0x030b5381, 0x012999d4, 0x005a9281, 0x00d69034, 0x00e268b6, 0x00a10a22, 0x0099a330, 0x0145fdda, 0x002a381d}}}, + {X: Field{[10]uint32{0x024b8f32, 0x03d8183f, 0x00e9f0da, 0x01d6aaa5, 0x01fc6c1a, 0x036afa72, 0x00721f93, 0x002f96fb, 0x0263a3c7, 0x000c646c}}, Y: Field{[10]uint32{0x01f38a96, 0x02c7e657, 0x00491717, 0x009d4f9d, 0x00c7af7b, 0x028f2eac, 0x01a87c4e, 0x026f1caa, 0x02cc1c7a, 0x000ce464}}}, + {X: Field{[10]uint32{0x0187023a, 0x01e1d3e4, 0x014638b9, 0x0394f04e, 0x0012f408, 0x03a0e6c8, 0x0147e275, 0x0376c23f, 0x03c604f9, 0x0018f757}}, Y: Field{[10]uint32{0x0104bd9a, 0x00d72f21, 0x0239b84f, 0x00410588, 0x03067e09, 0x004bbdfb, 0x016cccfd, 0x02df9b51, 0x00b402e8, 0x0006bc12}}}, + {X: Field{[10]uint32{0x031bcf13, 0x036fd2d9, 0x025c12d3, 0x01030ae3, 0x032e1d86, 0x03dd4712, 0x007229b7, 0x004bb32e, 0x0057cd83, 0x0002a4b9}}, Y: Field{[10]uint32{0x03fba768, 0x03ca4b97, 0x00b3f551, 0x013cf56d, 0x02be46ab, 0x0281f59c, 0x00492413, 0x03ad7461, 0x03565447, 0x0035ebb6}}}, + {X: Field{[10]uint32{0x01b10495, 0x0375be0e, 0x035ba6c0, 0x0179617c, 0x004789f5, 0x013c02ed, 0x0320f021, 0x0274880a, 0x0170b9e0, 0x0007b9ae}}, Y: Field{[10]uint32{0x009e9462, 0x03443837, 0x032be3f8, 0x02ef5282, 0x019dcf73, 0x01894a21, 0x023c8a04, 0x03bbd746, 0x03eceff9, 0x001f2443}}}, + {X: Field{[10]uint32{0x0306a76a, 0x03459663, 0x01cebe4f, 0x025cc0a1, 0x001abe9e, 0x00f4121c, 0x0328d7c4, 0x00655c14, 0x03b9c2ac, 0x002c6708}}, Y: Field{[10]uint32{0x03a38398, 0x016ca0cd, 0x00a49274, 0x01f34232, 0x01c60560, 0x038da791, 0x0380f8cf, 0x022dc1bc, 0x01bec07c, 0x001e6a04}}}, + {X: Field{[10]uint32{0x014f49a5, 0x026bbcc0, 0x02016b1e, 0x0262e2ca, 0x014f3fbf, 0x0099a915, 0x00888f5e, 0x017f09f0, 0x039f9ed3, 0x000f0836}}, Y: Field{[10]uint32{0x03fbc4d5, 0x025438d6, 0x009ea7d8, 0x02d733d2, 0x029327c1, 0x02879684, 0x010815a4, 0x0398ebd8, 0x02943f29, 0x002eceb0}}}, + {X: Field{[10]uint32{0x02ea4389, 0x0248b14b, 0x00014f6b, 0x03f0233a, 0x00efa29f, 0x034ce091, 0x02b59040, 0x01ba7913, 0x01bab474, 0x003f4733}}, Y: Field{[10]uint32{0x028df06e, 0x02080ca6, 0x0004097a, 0x014843db, 0x0373961a, 0x010f393a, 0x012439fc, 0x01be43e9, 0x01465214, 0x00384195}}}, + {X: Field{[10]uint32{0x0364020c, 0x03682666, 0x03ab51e2, 0x00a636cd, 0x0183641a, 0x030ac35d, 0x0252dc73, 0x02e29bbc, 0x018eabde, 0x0038c3f4}}, Y: Field{[10]uint32{0x00dce88b, 0x0309304a, 0x01704cfb, 0x00a5abfa, 0x018e195d, 0x01c5bad0, 0x02bcab86, 0x03d20658, 0x02721824, 0x0012598d}}}, + {X: Field{[10]uint32{0x015bda37, 0x0085f9d4, 0x00548e6e, 0x00001550, 0x015cd723, 0x00ea7702, 0x02ea7848, 0x03e4c386, 0x038926dd, 0x0012f07d}}, Y: Field{[10]uint32{0x0200ca69, 0x0133f374, 0x0047163a, 0x01b0a94b, 0x0336d8a2, 0x00d2f66a, 0x00bfa2e7, 0x006c0237, 0x02b695dc, 0x00259acc}}}, + {X: Field{[10]uint32{0x00f036d4, 0x03ffa855, 0x0139aaff, 0x023b51ad, 0x009004f9, 0x03b3a6f1, 0x030f7d26, 0x012e2d03, 0x027b9c86, 0x0008f4f8}}, Y: Field{[10]uint32{0x02c0b05d, 0x01b1e522, 0x026c71b3, 0x02eca24a, 0x01b3dfef, 0x03054354, 0x00143d6a, 0x0289f331, 0x03ebf680, 0x002f9185}}}, + {X: Field{[10]uint32{0x026009c0, 0x0392250f, 0x01aab56d, 0x02472db0, 0x004a5130, 0x01ded730, 0x02e0a894, 0x00edc3d1, 0x03d014cd, 0x000a2b72}}, Y: Field{[10]uint32{0x00e31601, 0x024b33bf, 0x00fdaf4a, 0x031cf7b5, 0x0025040d, 0x00233f93, 0x03250b46, 0x013328e3, 0x00387520, 0x001f126a}}}, + {X: Field{[10]uint32{0x00a29d08, 0x03c867c7, 0x02a0cc86, 0x01ee9517, 0x00ea52ec, 0x003613d8, 0x0044ab87, 0x00208e94, 0x00b8a86f, 0x001dd821}}, Y: Field{[10]uint32{0x001c60db, 0x00d14c96, 0x00b2cd08, 0x01c9615c, 0x03def172, 0x027959f6, 0x010bc384, 0x034942d0, 0x02cb1048, 0x00182eef}}}, + {X: Field{[10]uint32{0x028f2350, 0x03879f48, 0x035fbd4f, 0x02e7b5ab, 0x01e3db94, 0x01811254, 0x019667bc, 0x03bd2257, 0x020ffd32, 0x001177cb}}, Y: Field{[10]uint32{0x03eaf095, 0x035e4618, 0x0399473f, 0x032da2ec, 0x004de155, 0x010592e6, 0x024076ed, 0x03f819a7, 0x024b1a8c, 0x0029cc91}}}, + {X: Field{[10]uint32{0x027dd7ea, 0x027c386f, 0x03ebe7f6, 0x03a1e0f3, 0x008ae9bb, 0x0124e8bf, 0x00bff80c, 0x03f47e9d, 0x036b46a5, 0x001a4125}}, Y: Field{[10]uint32{0x022c3e64, 0x01886bb2, 0x03cfd5ad, 0x0115799b, 0x0030f1df, 0x02802cd0, 0x0241a221, 0x0050d818, 0x01b8df9d, 0x0006741c}}}, + {X: Field{[10]uint32{0x01aef659, 0x00a3a14a, 0x00f0bef5, 0x00d47ba0, 0x03e01def, 0x03a02603, 0x01e805c8, 0x0341d6a3, 0x0328f977, 0x00212761}}, Y: Field{[10]uint32{0x025bf428, 0x00c5652b, 0x006ffedf, 0x026bb1c9, 0x018042dd, 0x0301a743, 0x017adadb, 0x018a0ee7, 0x01c46c88, 0x00361255}}}, + {X: Field{[10]uint32{0x032d58eb, 0x0319d191, 0x01281e27, 0x031fa9a1, 0x0054588d, 0x035d4d2b, 0x03facec8, 0x001b9839, 0x034c2345, 0x0038f592}}, Y: Field{[10]uint32{0x025a36eb, 0x007cd8eb, 0x030efbc6, 0x00e53265, 0x0011a9c8, 0x022ba966, 0x0047baf6, 0x00aa11d1, 0x013ccf82, 0x00128cab}}}, + {X: Field{[10]uint32{0x0063bbaa, 0x021f54d5, 0x03ece0c7, 0x02aba484, 0x02889877, 0x02d9d8e6, 0x036f1323, 0x0168c466, 0x012857d1, 0x003d071e}}, Y: Field{[10]uint32{0x014d9328, 0x018140de, 0x016d07cc, 0x0239fa91, 0x00630c45, 0x014b6777, 0x00075941, 0x01315534, 0x010e00c8, 0x001cf3f3}}}, + {X: Field{[10]uint32{0x01186079, 0x014bf5de, 0x0321d67f, 0x0071079e, 0x030e0cba, 0x02bb64e7, 0x03a4a02c, 0x02e13391, 0x0347047a, 0x00387485}}, Y: Field{[10]uint32{0x01b2b668, 0x006abf9f, 0x02f63af8, 0x019a6b24, 0x01fb26da, 0x0092a040, 0x01728a3e, 0x03028fb6, 0x0228aa4b, 0x0005ec2d}}}, + {X: Field{[10]uint32{0x006ef1d8, 0x0239f736, 0x00c8095a, 0x012e34a4, 0x005d7ddb, 0x014ad36c, 0x009da2dd, 0x019e54c6, 0x018af8f8, 0x002a2800}}, Y: Field{[10]uint32{0x0026518b, 0x02ae9f5a, 0x00c17fc8, 0x035e72ad, 0x0225b927, 0x00d8208f, 0x0180c7e9, 0x02287b7e, 0x006c84b8, 0x0022ee58}}}, + {X: Field{[10]uint32{0x036fffed, 0x03589fdc, 0x038f4cd8, 0x0384f7cc, 0x00e4e0c0, 0x003af698, 0x03a57c05, 0x0179136a, 0x02716ee0, 0x001ce0f1}}, Y: Field{[10]uint32{0x0289f0e0, 0x03625b23, 0x00ba004a, 0x01225487, 0x0338eafd, 0x031df6ab, 0x00cb973f, 0x0129d18e, 0x01465f16, 0x000ef72e}}}, + {X: Field{[10]uint32{0x01372dfd, 0x023e42eb, 0x00c1e085, 0x03d01483, 0x031ca36a, 0x00216018, 0x03e64312, 0x02b25e5a, 0x021c8bc8, 0x00187e9f}}, Y: Field{[10]uint32{0x03eba33d, 0x00d121b0, 0x002078d6, 0x02c252c3, 0x00a5f646, 0x02210778, 0x0287909c, 0x039a50c8, 0x036836c3, 0x000fc359}}}, + {X: Field{[10]uint32{0x02c4a740, 0x00c428ec, 0x0116d3cb, 0x01250efc, 0x00b4f143, 0x03d220aa, 0x0092defc, 0x03180664, 0x022bca0a, 0x002180a7}}, Y: Field{[10]uint32{0x001c2f7c, 0x018edf49, 0x00480154, 0x014f75c2, 0x00ef5f15, 0x004885b2, 0x0261cffd, 0x015bc3cc, 0x006ecd90, 0x002e2fa4}}}, + {X: Field{[10]uint32{0x03ad95cc, 0x011d3013, 0x0390e2f6, 0x02c17f17, 0x0348c4a6, 0x0035ae6a, 0x01d6c4cd, 0x02921d62, 0x03e5912a, 0x00385cbd}}, Y: Field{[10]uint32{0x00acc401, 0x019cf702, 0x00290ea0, 0x01e54027, 0x010d7bfd, 0x022d935f, 0x019920ce, 0x003b4ee2, 0x03c12b0a, 0x003b6f48}}}, + {X: Field{[10]uint32{0x02873494, 0x00df6f8c, 0x00616d1f, 0x01e335aa, 0x032d931c, 0x020e37a4, 0x03b22abf, 0x03f0922d, 0x028d322e, 0x001e61ae}}, Y: Field{[10]uint32{0x02a13634, 0x02f25a04, 0x0201ee6e, 0x034f4edf, 0x002420a5, 0x034a7f83, 0x01b75440, 0x001648c6, 0x03224c75, 0x001a4faa}}}, + {X: Field{[10]uint32{0x01e00383, 0x02319738, 0x01d4603e, 0x034daa2a, 0x03400bb5, 0x034dac4c, 0x000a6d88, 0x01d9cdd8, 0x01384a72, 0x002e9650}}, Y: Field{[10]uint32{0x002ce557, 0x02676fcf, 0x019bd867, 0x0114bd88, 0x03d9c685, 0x00c4162f, 0x03fc9535, 0x0204ac89, 0x0228bc1b, 0x001d1bd3}}}, + {X: Field{[10]uint32{0x00476c8f, 0x02be1a48, 0x006b9802, 0x035cb3c3, 0x036bf96c, 0x02c5de27, 0x02eeb77b, 0x02c45f21, 0x01c992d6, 0x00117fd0}}, Y: Field{[10]uint32{0x0002b59f, 0x035a5c88, 0x015cbec3, 0x021a1ff2, 0x004f522e, 0x009c59f6, 0x010c9e10, 0x038eb880, 0x01bf6422, 0x0024c93d}}}, + {X: Field{[10]uint32{0x016ed68f, 0x00fb30f0, 0x02a7d9a9, 0x0293655d, 0x00d00bad, 0x02199bb5, 0x031c282e, 0x013681c5, 0x0235487a, 0x002eb5e7}}, Y: Field{[10]uint32{0x007b57d2, 0x0354371e, 0x029207a6, 0x005e40e2, 0x005b1535, 0x0076c335, 0x0202e129, 0x021290c6, 0x022eefb1, 0x00064e5e}}}, + {X: Field{[10]uint32{0x023c8a41, 0x0100ef27, 0x01b79cfa, 0x00374d99, 0x0022cf89, 0x025d56ff, 0x004d5835, 0x01d7b183, 0x01072d88, 0x00377f88}}, Y: Field{[10]uint32{0x033f62e7, 0x00ad8211, 0x00d90ce2, 0x00fe1f04, 0x028dbe0d, 0x0230a21c, 0x015674c2, 0x002a2a48, 0x0117491d, 0x00318af6}}}, + {X: Field{[10]uint32{0x027eb299, 0x0203b6d9, 0x03a64b11, 0x01a68f67, 0x00d75942, 0x03be7657, 0x00ccadfb, 0x0248fe5a, 0x0253c07f, 0x002497da}}, Y: Field{[10]uint32{0x01e7809c, 0x00e6582c, 0x010b7b29, 0x00e2e329, 0x0058f000, 0x03e73b92, 0x008b26b7, 0x006399bc, 0x00ff01f9, 0x0004203a}}}, + {X: Field{[10]uint32{0x0320dd80, 0x01e2ea09, 0x00d0d878, 0x0341ac38, 0x0012768b, 0x007c0ebc, 0x025d2c7d, 0x000a0ce3, 0x01dda75f, 0x0030a392}}, Y: Field{[10]uint32{0x010db12b, 0x02116ad7, 0x00a98331, 0x02d35fda, 0x03ec5ae6, 0x0261f859, 0x0112c5b4, 0x02926f31, 0x0189c941, 0x0019c3e2}}}, + {X: Field{[10]uint32{0x00837cbb, 0x03e1b28b, 0x006f37b9, 0x01235650, 0x02b21dae, 0x017a3816, 0x008c196d, 0x016fa206, 0x013e9503, 0x0001ea41}}, Y: Field{[10]uint32{0x003a7e1c, 0x00af43d1, 0x02352e7f, 0x03dbdfef, 0x026de026, 0x03425f5d, 0x00774e79, 0x0252de65, 0x008e8e76, 0x00103b82}}}, + {X: Field{[10]uint32{0x02036aa2, 0x029e7f43, 0x01b956c6, 0x021686d8, 0x02e0b32c, 0x025986c5, 0x008ef81e, 0x00031536, 0x00eabfbb, 0x000cebde}}, Y: Field{[10]uint32{0x03cfd3c0, 0x01231a74, 0x00629d80, 0x022017bd, 0x03153319, 0x03215742, 0x01796440, 0x029e5b13, 0x02af0537, 0x001c4f9e}}}, + {X: Field{[10]uint32{0x01583bd0, 0x0031c812, 0x0163df9a, 0x02901e5f, 0x031326df, 0x01b59d30, 0x02955739, 0x00f4cca5, 0x00145a3f, 0x00316234}}, Y: Field{[10]uint32{0x0053cdfa, 0x00c719ab, 0x020d7375, 0x009232bd, 0x027f7470, 0x03f4b35d, 0x02baa8fc, 0x0336b6ae, 0x03d16c67, 0x002d7033}}}, + {X: Field{[10]uint32{0x0038d29e, 0x02ad48e0, 0x01d5a2f2, 0x00887c3b, 0x0397223f, 0x01924d06, 0x008ef12c, 0x010b19f1, 0x01edb937, 0x0025acf5}}, Y: Field{[10]uint32{0x00e44c4e, 0x007b032c, 0x016aa996, 0x015d2ca3, 0x01bf25fe, 0x0339ed3b, 0x019a2e64, 0x028174dc, 0x00aa38a3, 0x0036d1d7}}}, + {X: Field{[10]uint32{0x0244f0c7, 0x0369dfd5, 0x02782a62, 0x010968a1, 0x001eea3a, 0x01198aa7, 0x00cb00b1, 0x013b9bec, 0x036e3d89, 0x00104bd2}}, Y: Field{[10]uint32{0x02a676fe, 0x026be1bd, 0x031d6f13, 0x0226300f, 0x01a8503e, 0x00e1d10a, 0x03de8139, 0x032016ff, 0x0236ab9b, 0x002a13bd}}}, + {X: Field{[10]uint32{0x00563252, 0x01387eb9, 0x01049379, 0x0312270e, 0x0132fdfd, 0x00cb1063, 0x031421da, 0x00c0a14b, 0x0385c7b4, 0x00097c29}}, Y: Field{[10]uint32{0x0004e4bc, 0x009a20d8, 0x02334a02, 0x03d4771b, 0x02da716a, 0x03afbd01, 0x00953a3a, 0x0242d627, 0x010d4571, 0x003bfac2}}}, + {X: Field{[10]uint32{0x01741c6f, 0x0356293b, 0x02cfde0b, 0x01610c9e, 0x03f02fed, 0x027a8f9f, 0x034403a4, 0x03ebd2b2, 0x02b7f367, 0x00143f52}}, Y: Field{[10]uint32{0x0146dd5f, 0x00c1f18f, 0x0207ea56, 0x033e81e5, 0x022d08ab, 0x02b6c70e, 0x020cb520, 0x03352194, 0x01a73c9d, 0x001e2af0}}}, + {X: Field{[10]uint32{0x006a477a, 0x03efb441, 0x03313bbc, 0x007d2e53, 0x02c35762, 0x00c3c41f, 0x038fa664, 0x01fde4ce, 0x03d4cfaf, 0x00055d60}}, Y: Field{[10]uint32{0x017e8db5, 0x02737a8a, 0x02aaffc0, 0x02359674, 0x01fe35ed, 0x011b5216, 0x00d4355c, 0x0347f983, 0x0235ce8c, 0x0026a9ac}}}, + {X: Field{[10]uint32{0x033300be, 0x00ef1296, 0x03494f4b, 0x037e2f9a, 0x02f2edce, 0x016cd65d, 0x00affc16, 0x00980f91, 0x03625d26, 0x000f112e}}, Y: Field{[10]uint32{0x00bc2535, 0x03b0afcf, 0x007b9079, 0x031c7fdc, 0x021ef0e8, 0x00166054, 0x00d45949, 0x00eae17b, 0x01616797, 0x00222c71}}}, + {X: Field{[10]uint32{0x02298958, 0x0096e3ee, 0x01d935ee, 0x031b821f, 0x008fc5d9, 0x00fc8f31, 0x0371d193, 0x01ae5fcb, 0x024de160, 0x000c7509}}, Y: Field{[10]uint32{0x018251cb, 0x0004641c, 0x032c44ae, 0x02d8b98a, 0x00c8e41d, 0x021556e6, 0x025180c9, 0x007498a1, 0x01c0a3aa, 0x00118182}}}, + {X: Field{[10]uint32{0x0103ad2f, 0x0091eb97, 0x03b78a87, 0x007602a3, 0x03352d1d, 0x037060d2, 0x02b206d3, 0x011c9182, 0x030a8ff1, 0x0007d547}}, Y: Field{[10]uint32{0x0116a6e3, 0x03a8cfb0, 0x03b32ecc, 0x02d94255, 0x00fcb97a, 0x000afb8d, 0x0144f818, 0x02c5236e, 0x0006a4c8, 0x0009094f}}}, + {X: Field{[10]uint32{0x01cf333e, 0x02daed70, 0x003a87aa, 0x01ccaabb, 0x00206a1f, 0x03fd6a31, 0x03343119, 0x02101cc4, 0x021d27f0, 0x00378b13}}, Y: Field{[10]uint32{0x0195170d, 0x0173f8a0, 0x01a71c5a, 0x00ab2cb5, 0x019226ca, 0x007e9263, 0x03f4a8e4, 0x0334e8c7, 0x03a140fe, 0x0037204e}}}, + {X: Field{[10]uint32{0x00a95612, 0x02f13046, 0x01620a54, 0x03462bb5, 0x00c1f54b, 0x00e0b0bc, 0x02c4a22c, 0x012b204c, 0x01b2adf5, 0x001bf717}}, Y: Field{[10]uint32{0x030e221e, 0x03a24565, 0x00d26944, 0x032a9b71, 0x03cf60b0, 0x00748590, 0x00110536, 0x03a53703, 0x00e5f318, 0x0036cfe9}}}, + {X: Field{[10]uint32{0x03680603, 0x01dedcd4, 0x030fc7fd, 0x00342177, 0x00bb7665, 0x035fae84, 0x02ea6f4d, 0x0071468e, 0x02c6ea0e, 0x0031fadd}}, Y: Field{[10]uint32{0x035bf655, 0x011dc4b7, 0x013e0e6f, 0x00e6a0ad, 0x020a4f4a, 0x02f0cbbc, 0x0041c3d7, 0x0024a80f, 0x01d7b788, 0x0016b870}}}, + {X: Field{[10]uint32{0x00aa89ed, 0x004ea632, 0x01857b48, 0x02de0867, 0x021a52c7, 0x00c4afee, 0x00e048e6, 0x022d6d93, 0x01a2b7e7, 0x00320541}}, Y: Field{[10]uint32{0x03096806, 0x0177f037, 0x007fa87d, 0x01fe5ac9, 0x01c222be, 0x0167c0cf, 0x01e49be4, 0x03884578, 0x00426d6c, 0x0011b6ca}}}, + {X: Field{[10]uint32{0x00503bf8, 0x01fae79e, 0x031c90a1, 0x00482f71, 0x00f7dec3, 0x00eb0d42, 0x005ff0d8, 0x030f561c, 0x025515f9, 0x0032b5d4}}, Y: Field{[10]uint32{0x026bd719, 0x02704b1b, 0x034c52d1, 0x039496da, 0x0106231b, 0x00e39358, 0x012ddc76, 0x036e5fb3, 0x020276cf, 0x000cacda}}}, + {X: Field{[10]uint32{0x024cdd25, 0x03a4036f, 0x03fabc70, 0x0196094c, 0x00f17f3c, 0x035ac576, 0x02ca8a47, 0x01f8c15b, 0x0144e22b, 0x00253488}}, Y: Field{[10]uint32{0x03d93bf9, 0x006a1351, 0x02e5f612, 0x00b5e6d2, 0x03828bf7, 0x03404932, 0x01dfbbdb, 0x00be1762, 0x020d5fef, 0x0004b01d}}}, + {X: Field{[10]uint32{0x016731a3, 0x004ae2e4, 0x022253b1, 0x027f03cb, 0x0213cba1, 0x01c86f78, 0x03520407, 0x01807f77, 0x0023ef00, 0x000c9717}}, Y: Field{[10]uint32{0x022498e0, 0x02397bb5, 0x0370e962, 0x02c91763, 0x015cb38c, 0x01931f4a, 0x03f3dd30, 0x00590e64, 0x0398c09c, 0x001674f2}}}, + {X: Field{[10]uint32{0x01ee2318, 0x01b61864, 0x00a7cda9, 0x00e0f9fd, 0x027d1874, 0x006f7f69, 0x02515168, 0x020c5928, 0x0089544b, 0x0027241c}}, Y: Field{[10]uint32{0x0372d20d, 0x00639be0, 0x00911d97, 0x037a7ef9, 0x01547117, 0x03089416, 0x00539eb5, 0x0018c0d9, 0x02e7e701, 0x003d8e77}}}, + {X: Field{[10]uint32{0x002b7a82, 0x03e60d4c, 0x03fc0f32, 0x0373ab06, 0x01ec5544, 0x01e93ee0, 0x032a1d89, 0x0301b132, 0x0007ede9, 0x000d3c52}}, Y: Field{[10]uint32{0x016d9c57, 0x007ca902, 0x024828d0, 0x019d75af, 0x003c54c3, 0x01a2f79a, 0x0318813a, 0x0288a3d7, 0x028cec6a, 0x001e10de}}}, + {X: Field{[10]uint32{0x0239788b, 0x01ed8005, 0x00d75388, 0x03fc30d1, 0x01490b47, 0x032e07f7, 0x03d459af, 0x0020a380, 0x030b3f08, 0x00252634}}, Y: Field{[10]uint32{0x002522f7, 0x00da14b9, 0x03d2ece1, 0x02cd59f3, 0x00677865, 0x01461ea7, 0x001627dc, 0x02f8fac9, 0x0305b97a, 0x001e9720}}}, + {X: Field{[10]uint32{0x0354f226, 0x0114bd5d, 0x038c876d, 0x03ffaee5, 0x025d4f36, 0x00f3be23, 0x013ec32d, 0x01b8dea9, 0x036fefd3, 0x003ae823}}, Y: Field{[10]uint32{0x012015c1, 0x031f8e2f, 0x01470608, 0x01e1340a, 0x0339e171, 0x00e32f82, 0x03eade9b, 0x015329eb, 0x02b543aa, 0x003f8399}}}, + {X: Field{[10]uint32{0x0240091b, 0x0251211c, 0x01e504c7, 0x02f664b3, 0x02c8ef49, 0x03a326f3, 0x0119b77a, 0x005ca7d8, 0x03c20bd2, 0x00155752}}, Y: Field{[10]uint32{0x03437b54, 0x0046731f, 0x00315d30, 0x03fe953e, 0x036c9052, 0x024fad29, 0x02869415, 0x0078ccb2, 0x01b86952, 0x003333af}}}, + {X: Field{[10]uint32{0x03fe8872, 0x03c21ec3, 0x01823679, 0x03b31a4b, 0x013f3060, 0x005c8f51, 0x0333833d, 0x00d1d10b, 0x039c19da, 0x000cdca6}}, Y: Field{[10]uint32{0x0034fc30, 0x02f59317, 0x00800b4a, 0x001f5faf, 0x00fac2f0, 0x02fee011, 0x00854056, 0x03d813ae, 0x024f283a, 0x002a52da}}}, + {X: Field{[10]uint32{0x01f1dc11, 0x03857803, 0x03c32d8a, 0x03835131, 0x0378124e, 0x00eae4b3, 0x03b060a7, 0x0119e191, 0x009fafe6, 0x000a86a2}}, Y: Field{[10]uint32{0x008b75d8, 0x0017fcff, 0x01218986, 0x0341fbe4, 0x0275aba0, 0x01b6efc3, 0x02ba46be, 0x007e39a1, 0x023d3bf1, 0x00189be5}}}, + {X: Field{[10]uint32{0x00197d6f, 0x02f2c2df, 0x027fff2d, 0x02cd38e4, 0x01639148, 0x0162ecbd, 0x0062f702, 0x039bf3ff, 0x014ca303, 0x0011c0a1}}, Y: Field{[10]uint32{0x031e1156, 0x011111f5, 0x02c5195c, 0x02cc3cec, 0x022da76e, 0x00164dcb, 0x0075c2de, 0x0095f345, 0x01b28513, 0x001f6898}}}, + {X: Field{[10]uint32{0x01319c5b, 0x01f165b3, 0x00e03485, 0x03f5f681, 0x0351d90c, 0x01b9279e, 0x0015cae0, 0x008e8194, 0x01c5a0cc, 0x001c00bb}}, Y: Field{[10]uint32{0x03db73bb, 0x00f88c30, 0x02975db6, 0x015a13f1, 0x0178c47b, 0x027f5845, 0x012d2ae1, 0x02a961eb, 0x01bd06b7, 0x001bca11}}}, + {X: Field{[10]uint32{0x0348d485, 0x02b7c2db, 0x00ae67c1, 0x0321c976, 0x03f4cc5b, 0x00755143, 0x0169f057, 0x018436c8, 0x00d4483d, 0x0009cca5}}, Y: Field{[10]uint32{0x03d942b1, 0x0221d2d9, 0x036d3726, 0x030473ee, 0x02a71e3c, 0x0208e6a8, 0x039a0031, 0x03278280, 0x01a20ffe, 0x00266c90}}}, + {X: Field{[10]uint32{0x018c9a69, 0x00d7a3fa, 0x00e83b03, 0x00ab134a, 0x010710c7, 0x02a14a97, 0x0126a535, 0x02d103eb, 0x03823055, 0x0006fb33}}, Y: Field{[10]uint32{0x038aecfc, 0x03780fde, 0x03489e2f, 0x00597892, 0x002c5db7, 0x0351c7ab, 0x00ce0a40, 0x03b881f2, 0x0166ac0e, 0x0003cead}}}, + {X: Field{[10]uint32{0x03128160, 0x02386494, 0x02197fae, 0x008dde24, 0x00a19023, 0x023f99cb, 0x0149caec, 0x00f54d76, 0x02cf4f03, 0x0036f93b}}, Y: Field{[10]uint32{0x01aa566f, 0x00f51f35, 0x00a1f5fd, 0x0018702a, 0x01896fc8, 0x012583f1, 0x0241c722, 0x00396d58, 0x03c7927f, 0x002cfd42}}}, + {X: Field{[10]uint32{0x01bd1e20, 0x03b3d28e, 0x02631133, 0x0212c2b8, 0x03caf7f4, 0x03715cff, 0x011887a5, 0x0031a516, 0x0075bed8, 0x001990ff}}, Y: Field{[10]uint32{0x038d58e5, 0x02d717e1, 0x03b7a1f8, 0x0270a4f0, 0x038ec1e6, 0x031289b8, 0x001875fd, 0x01f24eeb, 0x0285f7ac, 0x00011c04}}}, + {X: Field{[10]uint32{0x01422a21, 0x00d0bf81, 0x03f14516, 0x00daf298, 0x03ef19d9, 0x00fe0839, 0x01582805, 0x0335781c, 0x03decf1d, 0x00267e42}}, Y: Field{[10]uint32{0x019cd4fd, 0x034b5e6e, 0x01e2a180, 0x0064cfe4, 0x025cfd77, 0x02fafab5, 0x0390a868, 0x01856c14, 0x01306dfc, 0x0028137f}}}, + {X: Field{[10]uint32{0x02e33433, 0x00774ca1, 0x0033eaad, 0x01f81270, 0x00bcf71f, 0x024ad59e, 0x03b4e351, 0x02dff917, 0x02483184, 0x001539f3}}, Y: Field{[10]uint32{0x00c0e8ef, 0x033b2205, 0x02c3c4de, 0x0118f1a8, 0x024d4f85, 0x01fd3938, 0x028b85cb, 0x0272de0e, 0x033b65ba, 0x0032b0a0}}}, + {X: Field{[10]uint32{0x03f02e08, 0x01a1ae12, 0x027d31f7, 0x0058a558, 0x034705aa, 0x03d2a65c, 0x00f4e7b8, 0x0264f911, 0x024ffb60, 0x0033e192}}, Y: Field{[10]uint32{0x036f1bde, 0x01db1f36, 0x02a51af2, 0x0145dd12, 0x016b8a19, 0x03a62f7c, 0x01db874c, 0x03ad3519, 0x020fb736, 0x001ea634}}}, + {X: Field{[10]uint32{0x0159d1ae, 0x001c849b, 0x03f26c9e, 0x01141829, 0x02a25693, 0x02a62bf8, 0x022cd457, 0x03fe456b, 0x00d6516f, 0x001bfc58}}, Y: Field{[10]uint32{0x00eedc4a, 0x017065ed, 0x034deaff, 0x03b4007c, 0x017db5d5, 0x0143e71d, 0x038b4153, 0x0042b393, 0x0355bf14, 0x001747c4}}}, + {X: Field{[10]uint32{0x035dfcc9, 0x007f9327, 0x01a46f23, 0x016cdc0b, 0x01a56fe3, 0x018a1f6a, 0x037f2a2c, 0x009a4075, 0x0262aefd, 0x00026b6e}}, Y: Field{[10]uint32{0x03b04161, 0x017c54ea, 0x02e7e482, 0x010d0765, 0x012e708d, 0x034b12f7, 0x03126aff, 0x00d66c01, 0x0045cb4a, 0x002e963b}}}, + {X: Field{[10]uint32{0x00a2402d, 0x0038aa85, 0x035d652c, 0x0183a773, 0x02b5d900, 0x00b0437f, 0x00ea9457, 0x03712335, 0x001ebbdc, 0x000813a9}}, Y: Field{[10]uint32{0x0036ae38, 0x03de02eb, 0x01809789, 0x00c8fb02, 0x02fb0b9e, 0x024929be, 0x005db8a9, 0x00bcf2cb, 0x01aca195, 0x001eca22}}}, + {X: Field{[10]uint32{0x03c8ba22, 0x02b3a5d7, 0x0296a82a, 0x0243a109, 0x02a4b4f1, 0x008349ae, 0x01a6826c, 0x00c45089, 0x0269364d, 0x003df5b1}}, Y: Field{[10]uint32{0x039d3470, 0x019e9721, 0x03d1636f, 0x03d12c32, 0x031ff47c, 0x02cf1d86, 0x027d160c, 0x00e31401, 0x0177b425, 0x00056aec}}}, + {X: Field{[10]uint32{0x01352587, 0x019bc9df, 0x03f0dcb4, 0x019116d5, 0x01e50a7e, 0x000af488, 0x0066e00c, 0x00a31e2c, 0x030a87dd, 0x001ef134}}, Y: Field{[10]uint32{0x00c294d4, 0x032ae5b4, 0x0152ec68, 0x030481ad, 0x026efbc9, 0x032c1287, 0x026e0c9f, 0x00059369, 0x00542e7e, 0x003d3b52}}}, + {X: Field{[10]uint32{0x02316ef1, 0x01250ec7, 0x009d7856, 0x0086d094, 0x01c200eb, 0x027c818a, 0x005dfb95, 0x02fb9b09, 0x0184b046, 0x00155109}}, Y: Field{[10]uint32{0x00580d82, 0x000c6a52, 0x02280905, 0x018b4676, 0x02a29c41, 0x000fcb93, 0x026353a1, 0x007b6599, 0x0171c811, 0x000b8aaa}}}, + {X: Field{[10]uint32{0x01dce1eb, 0x01a7992c, 0x02dccbcd, 0x01ca107c, 0x020923f8, 0x02a32996, 0x0224c973, 0x0240f9c4, 0x00c0de88, 0x00239f7e}}, Y: Field{[10]uint32{0x01d2a0cc, 0x0390f049, 0x0066252a, 0x0388d325, 0x03c31205, 0x007eea36, 0x0147873f, 0x01b5479c, 0x00839ae8, 0x0039054c}}}, + {X: Field{[10]uint32{0x0251de8f, 0x011bd471, 0x024915d5, 0x0324d6f6, 0x01b84a9b, 0x017eb81e, 0x0169d066, 0x02a86095, 0x01dc69d8, 0x0019c8c8}}, Y: Field{[10]uint32{0x03ef005f, 0x00f5bdb9, 0x00188d33, 0x03c5acd3, 0x02f977b1, 0x000e9bbb, 0x0009ab18, 0x0225f6fa, 0x030b8708, 0x0022b590}}}, + {X: Field{[10]uint32{0x01ac3abc, 0x003d1ca2, 0x01bfc2d2, 0x026bda4f, 0x001b8beb, 0x02175da6, 0x00327182, 0x026c0148, 0x03c143e9, 0x003d38ae}}, Y: Field{[10]uint32{0x01651a2a, 0x02fc2c57, 0x03a897ea, 0x00f8817a, 0x036d80e9, 0x0033509b, 0x0322b7f7, 0x003aacb9, 0x00f5dc33, 0x00395264}}}, + {X: Field{[10]uint32{0x0139ffff, 0x004d3c43, 0x01ad8009, 0x0119ad7f, 0x0272694f, 0x00170582, 0x03c72758, 0x00963241, 0x025fc6d2, 0x0016a8ea}}, Y: Field{[10]uint32{0x00ea9531, 0x03018012, 0x0244a7f4, 0x02632c1d, 0x023146aa, 0x03d9c330, 0x003e82b5, 0x02be96e1, 0x0170617e, 0x0008b5c8}}}, + {X: Field{[10]uint32{0x03e2e7ef, 0x03ac021e, 0x00383be3, 0x03a9170d, 0x009e9a31, 0x02de18cf, 0x033acbd1, 0x01266b1a, 0x03f9d2bf, 0x000d1d4b}}, Y: Field{[10]uint32{0x001104f8, 0x01b6d1cb, 0x03edd91a, 0x02a60c1a, 0x0339d73c, 0x03d9f22e, 0x037d0763, 0x03621947, 0x03742cf3, 0x002d4fa8}}}, + {X: Field{[10]uint32{0x03047327, 0x00d4d989, 0x02d6b517, 0x018b6cae, 0x01889770, 0x001a7871, 0x01b4c9b5, 0x0113dc36, 0x022402ea, 0x00359409}}, Y: Field{[10]uint32{0x02b16f2d, 0x00547f12, 0x02c288c7, 0x00861b6c, 0x02d80143, 0x015cdd5f, 0x034db3fb, 0x02a2fb00, 0x019af2f2, 0x0014bd72}}}, + {X: Field{[10]uint32{0x011f4cc9, 0x024f0c00, 0x032acb45, 0x02a7b576, 0x010915d4, 0x007ce6af, 0x024a0e0b, 0x00097f45, 0x02c6553d, 0x0014aceb}}, Y: Field{[10]uint32{0x00e2f8c9, 0x029dc5fd, 0x03ba2432, 0x02f3839e, 0x0377af18, 0x00c6c975, 0x00016839, 0x02caee75, 0x00021c17, 0x0014551d}}}, + {X: Field{[10]uint32{0x027ef9ca, 0x02551fa0, 0x01b174d9, 0x01bae93e, 0x02eaa0ec, 0x022de704, 0x03284186, 0x02489049, 0x037ef797, 0x00232ed9}}, Y: Field{[10]uint32{0x000183f2, 0x0243e601, 0x00e19ae5, 0x0262ffb7, 0x0292974f, 0x0046d82f, 0x0240ec64, 0x004c4ada, 0x01b8b07e, 0x0028ca02}}}, + {X: Field{[10]uint32{0x0131d47b, 0x01c938f5, 0x022487f1, 0x035b0c5e, 0x013f89f2, 0x01d1cd2e, 0x00b1564d, 0x03c5f7a5, 0x01e0e2ee, 0x00363d57}}, Y: Field{[10]uint32{0x02b7d770, 0x00fa4b26, 0x02930052, 0x01317821, 0x00fa7dc6, 0x009c7993, 0x0016f71f, 0x018dc381, 0x02f5da57, 0x003a7f51}}}, + {X: Field{[10]uint32{0x016b6fdb, 0x0133d88d, 0x02b79d0f, 0x03b7b52e, 0x03a4ddb8, 0x01ddc5a7, 0x01573014, 0x02cc7fe7, 0x01bbfaa2, 0x003e9bf2}}, Y: Field{[10]uint32{0x0357d494, 0x01083803, 0x01b331b4, 0x033e7de0, 0x0043a2ad, 0x012c4476, 0x02fd1e4d, 0x01e431eb, 0x03cddfdd, 0x002dbfd5}}}, + {X: Field{[10]uint32{0x01b58e9a, 0x00fc2758, 0x02ae6bb9, 0x005d94f9, 0x00f93590, 0x02eb4126, 0x03752d9a, 0x03b765a7, 0x028ce748, 0x0008e7c0}}, Y: Field{[10]uint32{0x00f8b516, 0x013a3b05, 0x02f7c064, 0x028a46f6, 0x01d55c8a, 0x02dec50b, 0x02463b7b, 0x03dae9ee, 0x02b78831, 0x0005f7ff}}}, + {X: Field{[10]uint32{0x025e4f3b, 0x03e3dd25, 0x017bd99a, 0x00523c96, 0x00ecad3c, 0x00e26ee9, 0x0071db05, 0x025dbe67, 0x03fb728d, 0x000bbdb2}}, Y: Field{[10]uint32{0x01b0fd00, 0x006d83de, 0x00273b41, 0x010b3c5d, 0x03deeef5, 0x0364e8de, 0x01ebe8c1, 0x001e30fc, 0x03a7a382, 0x0006689e}}}, + {X: Field{[10]uint32{0x03064a0e, 0x025d764c, 0x0343698b, 0x011f614d, 0x021a4292, 0x00dde1c7, 0x03042f13, 0x00c57a23, 0x032b9af8, 0x0025cb5c}}, Y: Field{[10]uint32{0x024fd28b, 0x02bd36ea, 0x021d4f40, 0x00fc97f7, 0x02a5c2ae, 0x012f2ee8, 0x02380fee, 0x00ee1d02, 0x03baba4c, 0x000c2054}}}, + {X: Field{[10]uint32{0x02062a4c, 0x03c9d1db, 0x02ed33c4, 0x03b6bd08, 0x02e788bc, 0x0215052f, 0x03aa2951, 0x0263c60c, 0x0334ba49, 0x000f4de2}}, Y: Field{[10]uint32{0x02c4c8a3, 0x03686a3c, 0x0017093e, 0x00e34dd6, 0x013c3d52, 0x027dd700, 0x0087b502, 0x03e46602, 0x019c9217, 0x0011a915}}}, + {X: Field{[10]uint32{0x015c3087, 0x03e20b4e, 0x011e376b, 0x03c9f591, 0x02b13d70, 0x02f8ecd8, 0x032b289a, 0x02ceabf4, 0x003b1fc1, 0x003eec80}}, Y: Field{[10]uint32{0x00dfdabd, 0x028c5701, 0x00a81653, 0x00753906, 0x03f28e5b, 0x0305f6c0, 0x02b96bb9, 0x00d8a933, 0x02a5c462, 0x0025f219}}}, + {X: Field{[10]uint32{0x037a0471, 0x0137a3e1, 0x0247e6e1, 0x02debed6, 0x00295efd, 0x016389b1, 0x03d27a92, 0x02c7e802, 0x014e8eea, 0x0000a3ea}}, Y: Field{[10]uint32{0x01d23276, 0x016a4242, 0x022a5514, 0x0065345d, 0x03622219, 0x0233a743, 0x007b5e20, 0x03a3cf03, 0x010af2ee, 0x003dd867}}}, + {X: Field{[10]uint32{0x01308ae9, 0x033283be, 0x00f25c12, 0x00cc21e6, 0x014be272, 0x03ea3f8a, 0x0227ede6, 0x030455c5, 0x02857eb9, 0x0011c228}}, Y: Field{[10]uint32{0x024fa449, 0x00dae472, 0x00c3550e, 0x019821ea, 0x02854034, 0x02a4b3d5, 0x020ab601, 0x00e642cb, 0x01642e77, 0x003cd7e6}}}, + {X: Field{[10]uint32{0x0048a62f, 0x013cbe26, 0x02c6a636, 0x032cdad8, 0x02a82427, 0x00f3bb5b, 0x00903dcb, 0x02e1d362, 0x00976ff4, 0x0024d020}}, Y: Field{[10]uint32{0x015f3c6f, 0x033ed8fa, 0x020aeff3, 0x012262f1, 0x03daf64d, 0x0282eafd, 0x032d4fe0, 0x019d926a, 0x0162d4e2, 0x0038969a}}}, + {X: Field{[10]uint32{0x020ddf9a, 0x01676f1c, 0x03cac039, 0x037495b2, 0x039e0d24, 0x02959988, 0x0195da93, 0x00072b8c, 0x03a08182, 0x003d290a}}, Y: Field{[10]uint32{0x02000f86, 0x0349f802, 0x0396a60f, 0x0239c8c3, 0x0110bd4c, 0x01ce44a1, 0x01194afe, 0x03bfc1d7, 0x03cc0be3, 0x0023f49b}}}, + {X: Field{[10]uint32{0x03a6240c, 0x006c59b8, 0x009919c5, 0x03bed06c, 0x03791cac, 0x025f82a5, 0x0339ef61, 0x03350033, 0x0216e65b, 0x00316b69}}, Y: Field{[10]uint32{0x016eb8c3, 0x000229fe, 0x011a04a7, 0x01e9834d, 0x01cc2678, 0x02441aba, 0x01b0b323, 0x0318b721, 0x0168fe41, 0x00393197}}}, + {X: Field{[10]uint32{0x00c640e7, 0x02b84020, 0x002baca2, 0x01215844, 0x01e8b1fa, 0x00186969, 0x017c62e5, 0x03646f2f, 0x02c3d3f1, 0x001f064f}}, Y: Field{[10]uint32{0x03873ccd, 0x01672b65, 0x0333a26b, 0x01a0752c, 0x0103b8e0, 0x02294da1, 0x000ff310, 0x0023cf90, 0x00955114, 0x00331f3e}}}, + {X: Field{[10]uint32{0x011bd3c3, 0x0000ac2b, 0x016f1d96, 0x01547b1c, 0x0122b763, 0x039a8706, 0x01656293, 0x03c4a0c8, 0x01438e7c, 0x001dd509}}, Y: Field{[10]uint32{0x03d2137f, 0x02fe0022, 0x007c4deb, 0x00c80306, 0x01edf7d9, 0x022182be, 0x006eec20, 0x00def864, 0x029d212c, 0x000dd1c5}}}, + {X: Field{[10]uint32{0x03d90992, 0x02643d89, 0x02c5a3b9, 0x010f9536, 0x00bb48ff, 0x002af46a, 0x01c0f7f9, 0x039e1be9, 0x0399fa75, 0x0024b754}}, Y: Field{[10]uint32{0x0311b7ba, 0x0152484f, 0x029a406e, 0x00c664cb, 0x00ee4932, 0x031b14d2, 0x025c824a, 0x020f830b, 0x028ef937, 0x00172c6f}}}, + {X: Field{[10]uint32{0x0293157d, 0x01b77bf5, 0x00b376eb, 0x029ede87, 0x004f66e7, 0x0294cbf8, 0x03550532, 0x03ae4042, 0x0028468e, 0x00305dc2}}, Y: Field{[10]uint32{0x019a2e11, 0x01f492a0, 0x02bc2d2e, 0x0269de9d, 0x02070e5e, 0x0186b928, 0x029e262f, 0x01f51ff4, 0x003da014, 0x00036959}}}, + {X: Field{[10]uint32{0x036378c8, 0x03f7732b, 0x00ad533c, 0x0396fa2a, 0x01a8baab, 0x0044e4bf, 0x009a5341, 0x03948919, 0x0116e90a, 0x0004dcb8}}, Y: Field{[10]uint32{0x00346af9, 0x00adb972, 0x004d6e9b, 0x03ccaf16, 0x011d0a1c, 0x02369bd1, 0x038c2aaf, 0x01d6ef70, 0x00a26957, 0x0017bef5}}}, + {X: Field{[10]uint32{0x01dda936, 0x00b61a99, 0x00c008f3, 0x03eb840e, 0x0105e2b7, 0x03cc24a7, 0x01520097, 0x028acaf3, 0x021e9fa1, 0x000aef7c}}, Y: Field{[10]uint32{0x039d45ec, 0x0280b24c, 0x0364cb0b, 0x0331610e, 0x011806eb, 0x02a20cd8, 0x02c0dcd2, 0x02f77185, 0x01986008, 0x00146de2}}}, + {X: Field{[10]uint32{0x013005e1, 0x010e2f5d, 0x03f7f6a7, 0x01f09bb8, 0x039b63cc, 0x01bc8485, 0x0230d49e, 0x017b5de0, 0x00a4d049, 0x000d9a53}}, Y: Field{[10]uint32{0x00bc0af8, 0x02a8345c, 0x039075f5, 0x02da56d7, 0x03a87f48, 0x00635499, 0x031e17db, 0x02c4ccff, 0x03f3bbdc, 0x000b9278}}}, + {X: Field{[10]uint32{0x032013b8, 0x01225600, 0x027e85e6, 0x01cdaee2, 0x036fbc13, 0x004f12ab, 0x0113bf8d, 0x03850e9a, 0x00b1dc9c, 0x00090f61}}, Y: Field{[10]uint32{0x027f28bf, 0x02af56db, 0x02b91108, 0x020cb7ff, 0x0021a3dd, 0x037b1784, 0x023c2dc6, 0x031c77ff, 0x03adb6be, 0x0000e4c5}}}, + {X: Field{[10]uint32{0x0191ec92, 0x02550acb, 0x0185de03, 0x037bc641, 0x020ba6df, 0x0284aa3f, 0x00eab821, 0x03cfda0e, 0x03875255, 0x00076220}}, Y: Field{[10]uint32{0x0324b489, 0x0080dfcc, 0x012bc46c, 0x02b76f64, 0x039ccabd, 0x00bc2bbc, 0x0233538d, 0x03e05575, 0x03e2e919, 0x002a74e2}}}, + {X: Field{[10]uint32{0x01be3765, 0x01be6b2c, 0x00955645, 0x00a1e920, 0x015512d6, 0x01d0dd47, 0x0160e2aa, 0x00cddbdd, 0x03754c0d, 0x000e6887}}, Y: Field{[10]uint32{0x0035e005, 0x00baa750, 0x031bde0b, 0x02c4e914, 0x01ef4950, 0x0156ed12, 0x00188c4d, 0x035e78ef, 0x00a52a7f, 0x000f3cc9}}}, + {X: Field{[10]uint32{0x002e21c8, 0x0249e3ad, 0x029e948d, 0x007e9595, 0x0118ab0a, 0x00b19fdb, 0x01394a95, 0x0177ca87, 0x020cd8e2, 0x002843fd}}, Y: Field{[10]uint32{0x01f9e991, 0x013d4083, 0x03237bfd, 0x00d7c0b2, 0x0389fd2b, 0x03e2451c, 0x000c0bd4, 0x00bbe077, 0x01633ce8, 0x002d17cb}}}, + {X: Field{[10]uint32{0x03bcbcb1, 0x031167ad, 0x022b25bb, 0x03377092, 0x01bb801a, 0x01ae5c7e, 0x011f7a64, 0x010bdc41, 0x03920d50, 0x002f09a5}}, Y: Field{[10]uint32{0x01235665, 0x00d6f5dc, 0x031f478b, 0x0378760f, 0x02c7fab6, 0x0248175f, 0x0301530c, 0x00818586, 0x01fc1c03, 0x002dc111}}}, + {X: Field{[10]uint32{0x0037cb95, 0x00709024, 0x00da99a6, 0x0123daf3, 0x025f0ef4, 0x0076d110, 0x02a7f95d, 0x00da0aa0, 0x01fefd5a, 0x000f5c9e}}, Y: Field{[10]uint32{0x00159740, 0x01980bdc, 0x021622de, 0x024c3364, 0x019a2ea1, 0x02e89253, 0x0342cca2, 0x016df88a, 0x02cae636, 0x0037d489}}}, + {X: Field{[10]uint32{0x00dbe588, 0x00b0b57a, 0x02e2fd55, 0x03439085, 0x01bc439a, 0x0146cf54, 0x036c2bd9, 0x02bc02e4, 0x0130ef92, 0x0038315b}}, Y: Field{[10]uint32{0x00555fee, 0x0212ceda, 0x03e0f064, 0x031e921c, 0x03f35189, 0x01d9a683, 0x01bd1862, 0x01711103, 0x037d02a7, 0x0030af45}}}, + {X: Field{[10]uint32{0x0073315b, 0x0266b89e, 0x03c15d99, 0x00c909ca, 0x00f0d6e3, 0x00d2ebc7, 0x00398306, 0x02fd4bf6, 0x00e52b7b, 0x0026fe58}}, Y: Field{[10]uint32{0x018d0405, 0x0188e1c7, 0x001c9066, 0x03df6732, 0x01551862, 0x02914dce, 0x0016cb16, 0x007732c0, 0x019d20e0, 0x0002ca1c}}}, + {X: Field{[10]uint32{0x00351198, 0x0120280d, 0x019dc0d5, 0x0117511f, 0x0287fffb, 0x011d5f83, 0x017a6b14, 0x029c6b98, 0x016be60b, 0x000837c6}}, Y: Field{[10]uint32{0x02eb07d8, 0x003387c9, 0x020ae996, 0x01610bfb, 0x02f12ba3, 0x02b42aea, 0x03d49539, 0x001c6e81, 0x01430c0d, 0x00271c8b}}}, + {X: Field{[10]uint32{0x029bac17, 0x01998772, 0x036330a2, 0x01c48ed7, 0x00455a5f, 0x02055260, 0x019693d0, 0x02d02e51, 0x01360208, 0x000210f0}}, Y: Field{[10]uint32{0x02f12078, 0x0137d1bc, 0x00edec9b, 0x008e19dc, 0x02d0c74f, 0x0076e950, 0x011820d3, 0x03f1034b, 0x018d9095, 0x00356d6f}}}, + {X: Field{[10]uint32{0x008d11a0, 0x02f1c890, 0x01c03e05, 0x032dcbe7, 0x03708a3f, 0x02d1b5bb, 0x024ee0ca, 0x007a837a, 0x00df702c, 0x0024426d}}, Y: Field{[10]uint32{0x02dc507a, 0x03b322e5, 0x03242cf4, 0x031e44ee, 0x007348e9, 0x030b0c09, 0x03151954, 0x020072d4, 0x02c18be5, 0x001d6ea8}}}, + {X: Field{[10]uint32{0x0191113c, 0x03bbcf16, 0x02db2329, 0x00b8dc9f, 0x018e5155, 0x0080f167, 0x02dff03c, 0x02a6ec4a, 0x01f5c960, 0x003c4334}}, Y: Field{[10]uint32{0x028c465a, 0x03c2fc57, 0x0151b8f3, 0x03191e58, 0x009d2e03, 0x03fb998b, 0x01746898, 0x036a9859, 0x00e16f65, 0x002a12b2}}}, + {X: Field{[10]uint32{0x00e747a8, 0x03f9ab44, 0x03a071ea, 0x03437d62, 0x010ae0d6, 0x02297d4e, 0x0077b69a, 0x0180beb4, 0x013cffd3, 0x0027c1dc}}, Y: Field{[10]uint32{0x03ee867b, 0x03579723, 0x00afe58c, 0x00e95e5c, 0x01cbb4ea, 0x020be3b0, 0x003d7357, 0x02420f37, 0x007342b5, 0x002b7f32}}}, + {X: Field{[10]uint32{0x0195801a, 0x018cd0b3, 0x019f3640, 0x01b2c483, 0x005ce9ec, 0x03fe25e3, 0x032b870f, 0x015cd04e, 0x010e3290, 0x001b4767}}, Y: Field{[10]uint32{0x0031018f, 0x0153e31a, 0x010efba1, 0x025e48b9, 0x0325a3f5, 0x00eef738, 0x0345f7c2, 0x02d80935, 0x00a895d3, 0x001942f9}}}, + {X: Field{[10]uint32{0x00dcbd82, 0x0083319b, 0x03fa7128, 0x026771d9, 0x015c649f, 0x0387ec52, 0x027791c7, 0x033251e8, 0x01a56b3a, 0x00125c61}}, Y: Field{[10]uint32{0x03e6568c, 0x01aa5443, 0x01c3df5b, 0x02fdd060, 0x00f33ce5, 0x039d5968, 0x00078b2f, 0x0386c5f9, 0x037c11da, 0x001f5446}}}, + {X: Field{[10]uint32{0x000a743f, 0x0153fcc4, 0x030a2c31, 0x02f85291, 0x019a35f7, 0x00b361f0, 0x01b8bc75, 0x03ae7137, 0x00f9848e, 0x003ffdce}}, Y: Field{[10]uint32{0x032c38ec, 0x03fcdccb, 0x01df57bd, 0x02685c21, 0x00211b97, 0x01171628, 0x0037cdcf, 0x00f25dda, 0x0255cd91, 0x00041ae2}}}, + {X: Field{[10]uint32{0x001b4830, 0x024086e6, 0x00e38ccb, 0x03d177f2, 0x0141899e, 0x01f58005, 0x026876a3, 0x011b2d11, 0x01a48d35, 0x000c80e4}}, Y: Field{[10]uint32{0x0251b102, 0x01c48159, 0x0000f09c, 0x01f798ce, 0x0323fa2d, 0x015c1ed2, 0x002f3032, 0x0250479d, 0x0030b455, 0x0011bd8c}}}, + {X: Field{[10]uint32{0x0185fe9e, 0x005b8017, 0x013f9adf, 0x001848a0, 0x00558791, 0x01d8c7c6, 0x0137f7fb, 0x03a2349a, 0x0240a925, 0x002f9133}}, Y: Field{[10]uint32{0x036e1dc4, 0x02c0998a, 0x0089324d, 0x032a6906, 0x02ca6948, 0x03d12db8, 0x02806d4b, 0x01b719f9, 0x01e7d22e, 0x0005d56b}}}, + {X: Field{[10]uint32{0x0333ddae, 0x00810d73, 0x012ddeeb, 0x002d0cea, 0x03da6aa8, 0x019bf0a8, 0x03b05314, 0x035827e0, 0x02b158dd, 0x00234fc1}}, Y: Field{[10]uint32{0x0337af63, 0x011c1752, 0x01f2c4c7, 0x0106630f, 0x02f1d0a6, 0x02f4ba50, 0x036e5f4d, 0x0144eee2, 0x0299efde, 0x000b5552}}}, + {X: Field{[10]uint32{0x01596729, 0x03aa11a4, 0x02627210, 0x01d1d0ad, 0x00d0c71d, 0x00153f30, 0x01c1cb3a, 0x03d54c95, 0x039cf258, 0x003e0529}}, Y: Field{[10]uint32{0x032d867d, 0x004fdd68, 0x002dc318, 0x022bb7ae, 0x010271ce, 0x0347cf51, 0x0080c42f, 0x02d2c88f, 0x0095be48, 0x0000467f}}}, + {X: Field{[10]uint32{0x0142fb60, 0x0399097a, 0x03ec8109, 0x03efbe45, 0x01d77e57, 0x038ab4c1, 0x0262bfbe, 0x03c76d76, 0x01461c37, 0x00257a3f}}, Y: Field{[10]uint32{0x00e2db93, 0x000c0a82, 0x00d09a03, 0x03f8c1ad, 0x01d3d5b1, 0x002d162e, 0x01ace316, 0x033686a9, 0x031edfdb, 0x003770a2}}}, + {X: Field{[10]uint32{0x03981e77, 0x02ac3a29, 0x02149e2d, 0x0303d0db, 0x026f4e5c, 0x03f08209, 0x0320604c, 0x02205af1, 0x03fc47e1, 0x00301950}}, Y: Field{[10]uint32{0x03021441, 0x00d20c65, 0x0234ee66, 0x00c45fb1, 0x01281854, 0x00653327, 0x034819ac, 0x029f0844, 0x0065f3a4, 0x000881c1}}}, + {X: Field{[10]uint32{0x00d5c68e, 0x025c21ad, 0x001caa2b, 0x0142f580, 0x010fd5b0, 0x037b6138, 0x014d116b, 0x02bbe928, 0x015b3716, 0x001260f6}}, Y: Field{[10]uint32{0x03f0a279, 0x036b8b01, 0x01b0280c, 0x0299beb0, 0x00f5e609, 0x02f4efbf, 0x03d47bce, 0x033450cc, 0x026da2ef, 0x0004dcd0}}}, + {X: Field{[10]uint32{0x02afe6ab, 0x0332560f, 0x03ef61fd, 0x03b79adc, 0x03ad8054, 0x01782143, 0x022cd092, 0x012e5cee, 0x00c692e8, 0x0028af57}}, Y: Field{[10]uint32{0x02a5ce2b, 0x02c9d9f9, 0x02a4e4f0, 0x025e5e56, 0x0133d8d7, 0x027e0093, 0x019011b9, 0x006c7985, 0x038af914, 0x003329b9}}}, + {X: Field{[10]uint32{0x036d741a, 0x026353da, 0x02b60bf6, 0x0098c45e, 0x00b8f852, 0x00d9f421, 0x0076281b, 0x0139ce54, 0x0231a18f, 0x00187264}}, Y: Field{[10]uint32{0x026cbfe5, 0x0102051b, 0x019299d3, 0x02c19f52, 0x01af886d, 0x02823006, 0x00616090, 0x0074c192, 0x03979e7f, 0x00208c52}}}, + {X: Field{[10]uint32{0x02b34304, 0x0182ff5a, 0x00db73ed, 0x00bdb1af, 0x02d4072a, 0x0244cc86, 0x03114fc7, 0x014a64e9, 0x03ef32c5, 0x001296b3}}, Y: Field{[10]uint32{0x020c03c9, 0x006c15a6, 0x024da9f6, 0x02252bfe, 0x0301323e, 0x012c9b6f, 0x03f9f296, 0x0166c9a6, 0x0229c068, 0x0001ca56}}}, + {X: Field{[10]uint32{0x037f4023, 0x03d6da2e, 0x02d487d4, 0x004d085a, 0x02604e50, 0x0197b2b1, 0x036dcb6c, 0x012530ac, 0x0355866f, 0x0038119d}}, Y: Field{[10]uint32{0x00b336b3, 0x01690b0c, 0x02029d9e, 0x01d4a3b3, 0x01ae9459, 0x0098626b, 0x032f9558, 0x03e86fd4, 0x03c5974d, 0x0037ab40}}}, + {X: Field{[10]uint32{0x03215ea7, 0x03034aee, 0x0059640d, 0x01808211, 0x01c4e8be, 0x016c788c, 0x014ca74b, 0x017f7d6d, 0x0305c926, 0x001a1bf7}}, Y: Field{[10]uint32{0x017ea7da, 0x018794f5, 0x01710b65, 0x03cb1640, 0x03c93723, 0x03fcd9de, 0x02f950eb, 0x02e5d02b, 0x021cedf9, 0x003d350f}}}, + {X: Field{[10]uint32{0x03d21253, 0x017b2ee2, 0x01cb9fce, 0x009347c5, 0x03e2bcd9, 0x00365b4b, 0x022b7d7b, 0x02c833a9, 0x018500f9, 0x000491da}}, Y: Field{[10]uint32{0x03522004, 0x03785b4a, 0x03842e32, 0x03c90f75, 0x033f1950, 0x010e2702, 0x027b356b, 0x013f190e, 0x00b39e90, 0x0034d0df}}}, + {X: Field{[10]uint32{0x02d17b1b, 0x0220098a, 0x0324e453, 0x007b4be9, 0x03b5eb1e, 0x0027d95e, 0x03322910, 0x0326cb96, 0x00ec9a87, 0x00195af7}}, Y: Field{[10]uint32{0x012fa64d, 0x00f738be, 0x01d116aa, 0x00c345f0, 0x030cdfc8, 0x03f7023f, 0x03f704b3, 0x0393dfd8, 0x010c47b6, 0x0031dd23}}}, + {X: Field{[10]uint32{0x0083e4b5, 0x02fae5ad, 0x0004c3ae, 0x00f983af, 0x027a3d40, 0x020f3b44, 0x0279b244, 0x00584832, 0x010e0f72, 0x0016dfdc}}, Y: Field{[10]uint32{0x03b08080, 0x03dca12f, 0x0386b698, 0x01caf65a, 0x0011db4b, 0x0396a7bb, 0x00196e8d, 0x022bb98d, 0x03a7f068, 0x0006d455}}}, + {X: Field{[10]uint32{0x01e6b4da, 0x034f4128, 0x00deabc8, 0x00f6074b, 0x01254521, 0x003e4361, 0x015bf184, 0x029bd55e, 0x02d0552b, 0x002ff299}}, Y: Field{[10]uint32{0x01754e75, 0x01b746bc, 0x0069084b, 0x0282f776, 0x00223043, 0x0032ce84, 0x00c46383, 0x01095f01, 0x00cc290d, 0x0012442c}}}, + {X: Field{[10]uint32{0x00496f16, 0x01980ca2, 0x009247f5, 0x006f3b1c, 0x001447c1, 0x0015ef45, 0x018f8ef2, 0x032ef91e, 0x028fb79d, 0x00198fe9}}, Y: Field{[10]uint32{0x03c41786, 0x009ea9a0, 0x03951f2b, 0x028aacc3, 0x00a42597, 0x00747d08, 0x005598a9, 0x02f48f62, 0x02fa1f3b, 0x000eb38b}}}, + {X: Field{[10]uint32{0x015c4321, 0x017c7792, 0x03004608, 0x02b82033, 0x017c1675, 0x0379a289, 0x02f2f86e, 0x02e3c87f, 0x03338a3d, 0x0009f338}}, Y: Field{[10]uint32{0x00d373ae, 0x01aa0ac9, 0x01c294b1, 0x027f68aa, 0x037aefa6, 0x018f53f7, 0x0144a002, 0x0391cbac, 0x018c8bab, 0x001c55af}}}, + {X: Field{[10]uint32{0x00bd9560, 0x016f1359, 0x00ce35aa, 0x012c703a, 0x03b727be, 0x00f15d7b, 0x027940e1, 0x017026f8, 0x02c452ec, 0x00352701}}, Y: Field{[10]uint32{0x038d18b0, 0x01d48e39, 0x033c2f51, 0x022551b7, 0x015d7ad7, 0x02680d8d, 0x0266469f, 0x004029ca, 0x0118b298, 0x000b194d}}}, + {X: Field{[10]uint32{0x004ad08a, 0x0005fdd5, 0x01129cfa, 0x03f442bf, 0x023d7bf4, 0x01034ef5, 0x00ecd251, 0x02009b4f, 0x007ebd02, 0x001a5820}}, Y: Field{[10]uint32{0x020e7c7c, 0x02bab024, 0x03f4cf7b, 0x020eaa6a, 0x036f9a63, 0x02f69af7, 0x03cb5465, 0x03eb9cad, 0x004f28be, 0x0029e141}}}, + {X: Field{[10]uint32{0x01f8faa1, 0x02d4c94f, 0x03aa1ede, 0x03156953, 0x02fc9263, 0x0295f6eb, 0x0375abeb, 0x00e9c68e, 0x033654b6, 0x0020e0af}}, Y: Field{[10]uint32{0x0049b011, 0x003f3c42, 0x026dcb6d, 0x00f6515d, 0x02dc9bef, 0x0189d987, 0x021da269, 0x032d4d11, 0x01dcc319, 0x003817ae}}}, + {X: Field{[10]uint32{0x02b0bffb, 0x0168f452, 0x0379acc4, 0x026bd814, 0x02b7e705, 0x02a4cbc8, 0x008cca9f, 0x021db9e3, 0x037930ec, 0x00200ee4}}, Y: Field{[10]uint32{0x01e5790f, 0x02bc1195, 0x01152b52, 0x03745f34, 0x01cb90d1, 0x01e1a51c, 0x03ec7d0b, 0x03470b1b, 0x001c5202, 0x001f6c8d}}}, + {X: Field{[10]uint32{0x02c5292c, 0x022e8474, 0x03e08f99, 0x003a2591, 0x02cb78fb, 0x01cfeac0, 0x0165ff4f, 0x02ba7c44, 0x01290ab6, 0x0032d36c}}, Y: Field{[10]uint32{0x03d1c9c2, 0x01506235, 0x02e9ef61, 0x00235d53, 0x02745c24, 0x02ecd9bf, 0x0280ad65, 0x00e12ed6, 0x039a1776, 0x000332bb}}}, + {X: Field{[10]uint32{0x00d115a2, 0x014ab37b, 0x0179aa81, 0x01ee1325, 0x038fd6af, 0x0301c3f1, 0x038be8af, 0x03d9c8e0, 0x035750e9, 0x003eaca1}}, Y: Field{[10]uint32{0x00b3f065, 0x00452430, 0x024956c3, 0x00c7671b, 0x03764ee9, 0x02ba14c0, 0x017d3b83, 0x0158b54e, 0x002889cd, 0x003567f8}}}, + {X: Field{[10]uint32{0x0249bbc1, 0x00092159, 0x0376c198, 0x01335a96, 0x02fbdf84, 0x0020cf84, 0x02e3f036, 0x03b8f43d, 0x02baf870, 0x003761e7}}, Y: Field{[10]uint32{0x0143c55a, 0x011c5b26, 0x038f7309, 0x00ab1a94, 0x00b041a1, 0x0355a5b2, 0x03a324c1, 0x01704775, 0x00c3a99a, 0x0039eec1}}}, + {X: Field{[10]uint32{0x00f8016e, 0x03330120, 0x00d8ed00, 0x01d06d7e, 0x031df68f, 0x0095cac4, 0x01319d57, 0x01a87b6a, 0x03be29b0, 0x001ea92b}}, Y: Field{[10]uint32{0x03fe7130, 0x0252c5d4, 0x00d2dc9d, 0x00364df0, 0x02423fd0, 0x0080ae5c, 0x002e3c13, 0x02161dfc, 0x029fb77b, 0x00057de6}}}, + {X: Field{[10]uint32{0x0039f890, 0x03933163, 0x0168ba19, 0x03a455c7, 0x00c34354, 0x00b5b998, 0x03fee64f, 0x00c99575, 0x03f5876a, 0x0024517c}}, Y: Field{[10]uint32{0x0285d8ff, 0x03368a2c, 0x036c998e, 0x00755d9a, 0x0337650c, 0x0284235b, 0x009ba7fd, 0x027f416f, 0x015dcf36, 0x0011782a}}}, + {X: Field{[10]uint32{0x0111ac9e, 0x03dd03d1, 0x0131713d, 0x03224688, 0x00a5a7f6, 0x001dfcf7, 0x0337afa2, 0x0004347b, 0x035236fb, 0x0015142d}}, Y: Field{[10]uint32{0x026ba175, 0x03c0603f, 0x01ef08b6, 0x00e99c42, 0x0313ff56, 0x037b4b5e, 0x021084d3, 0x03e1b537, 0x015762be, 0x0029f1fb}}}, + {X: Field{[10]uint32{0x00666a0f, 0x00b3e230, 0x001b84c3, 0x01bf44d4, 0x01bbf276, 0x0105f41d, 0x00256d67, 0x0378b32e, 0x01725e48, 0x002e9b03}}, Y: Field{[10]uint32{0x0125e442, 0x0061bcf9, 0x006405ed, 0x012e46f3, 0x02bdecd6, 0x0296640c, 0x02da6693, 0x00a67d43, 0x01327137, 0x00334aa4}}}, + {X: Field{[10]uint32{0x0205c921, 0x036dece5, 0x00b0553a, 0x0276ab56, 0x01d25a64, 0x0263ef7d, 0x011006b7, 0x03aed1bf, 0x01ff1fee, 0x002e5208}}, Y: Field{[10]uint32{0x01077c05, 0x03162afe, 0x0365a72d, 0x02bbbb10, 0x01f45ccf, 0x015d2bf3, 0x003d950c, 0x024a8b1f, 0x03a079bb, 0x00085626}}}, + {X: Field{[10]uint32{0x01a0681d, 0x0221e7c3, 0x01f8198f, 0x037a4f58, 0x00432f14, 0x02a58f32, 0x00e0d7a5, 0x01f1dadc, 0x0046497f, 0x001190d9}}, Y: Field{[10]uint32{0x01c83a5f, 0x03982352, 0x012398a3, 0x0396cfb2, 0x0348c367, 0x03a89797, 0x01a8aab5, 0x03604043, 0x024e90c4, 0x000a4d12}}}, + {X: Field{[10]uint32{0x00c1ae1d, 0x02c2ce39, 0x00d0802b, 0x005d6ea8, 0x01bd3be9, 0x02f2c33c, 0x019185b7, 0x0042f925, 0x02c6a2e2, 0x002f6396}}, Y: Field{[10]uint32{0x01b1fa19, 0x03c22a8b, 0x000a94ed, 0x0069f0fb, 0x0269c6f7, 0x03b22229, 0x03773a5e, 0x025d5769, 0x03e46dcc, 0x001ace06}}}, + {X: Field{[10]uint32{0x01f22493, 0x03463fe6, 0x0231974c, 0x024ece50, 0x017fb645, 0x022b39db, 0x00c34055, 0x029e943d, 0x021ac428, 0x00309f07}}, Y: Field{[10]uint32{0x019cf57c, 0x013e4671, 0x004a4954, 0x03cf0178, 0x0025108a, 0x02a7d665, 0x031884cf, 0x01ece872, 0x0261c12f, 0x003f2575}}}, + {X: Field{[10]uint32{0x03eb30d5, 0x00ebc89d, 0x03c029e5, 0x00050103, 0x0044c17c, 0x0364119b, 0x028168ee, 0x01329549, 0x0161837e, 0x00285d95}}, Y: Field{[10]uint32{0x02c28eb5, 0x022d9b2d, 0x015aecfc, 0x01d743e8, 0x033032c7, 0x0039b8bd, 0x0255d0b3, 0x0222ff35, 0x01e2b8d4, 0x00228b7b}}}, + {X: Field{[10]uint32{0x01ddbea9, 0x03a63060, 0x02f93b03, 0x00de0c03, 0x00e9eea7, 0x01e2e8da, 0x029279f6, 0x0332461f, 0x030d35ca, 0x000afda4}}, Y: Field{[10]uint32{0x0225209d, 0x03e81a79, 0x00db46e2, 0x00c30d74, 0x02d0f3f9, 0x0232a385, 0x03ee5383, 0x022ec0ff, 0x01433aaa, 0x00228b53}}}, + {X: Field{[10]uint32{0x0077c8d7, 0x019a9c1a, 0x0056a6a0, 0x01680e96, 0x00a36d08, 0x019d5649, 0x03005f4d, 0x02bbf643, 0x03259cc5, 0x001d9a9d}}, Y: Field{[10]uint32{0x00049190, 0x03078cd2, 0x03dc4171, 0x0012fd02, 0x0090b46d, 0x03a4e3bc, 0x01bfad15, 0x038b9fc1, 0x00974fd9, 0x0036cfeb}}}, + {X: Field{[10]uint32{0x00461268, 0x024bfe46, 0x03242887, 0x038e6a44, 0x02134196, 0x025cca76, 0x00c333c0, 0x0087517f, 0x00cd953f, 0x00349698}}, Y: Field{[10]uint32{0x010c7863, 0x03c9339e, 0x0270f397, 0x026240d4, 0x00a07ad5, 0x008d4a60, 0x03874e71, 0x020d7f6e, 0x03e8bd04, 0x00226fca}}}, + {X: Field{[10]uint32{0x02d95d68, 0x03f90a72, 0x000b360d, 0x021a3286, 0x019bf569, 0x01997abf, 0x021f467b, 0x0096c99c, 0x029e8b71, 0x0031eca3}}, Y: Field{[10]uint32{0x0295c398, 0x030ea9e7, 0x02167b37, 0x00d1d91a, 0x009ec7bf, 0x02f291da, 0x03947ed8, 0x02d869c7, 0x0158b3a7, 0x0002b0a3}}}, + {X: Field{[10]uint32{0x0059bc24, 0x02cd375f, 0x03a97ce8, 0x01803c7d, 0x0120c291, 0x033f3a61, 0x022d7a74, 0x0230a6b6, 0x008ac61f, 0x0038a948}}, Y: Field{[10]uint32{0x01c70830, 0x0367d6cf, 0x00e4a880, 0x009dddff, 0x03a152ce, 0x03a438e0, 0x034483b4, 0x02281332, 0x02144970, 0x00037a2e}}}, + {X: Field{[10]uint32{0x02e205b1, 0x0112b7c4, 0x03ca53e8, 0x000620a1, 0x016976e0, 0x0150259f, 0x032b152a, 0x037e574e, 0x00cd02e8, 0x00387a39}}, Y: Field{[10]uint32{0x03bfc9e2, 0x03633bd0, 0x02491a77, 0x025fd51a, 0x020d34aa, 0x008cdc8f, 0x03f00918, 0x0151ef2c, 0x02f9cdc7, 0x002976f1}}}, + {X: Field{[10]uint32{0x012b6512, 0x0152fc27, 0x0375bea4, 0x02cee257, 0x023c3143, 0x03cec70a, 0x02284803, 0x013954ac, 0x02514a68, 0x002c83c2}}, Y: Field{[10]uint32{0x000d02c9, 0x0376a5ba, 0x02c31e0e, 0x02173513, 0x00f7c955, 0x0250681f, 0x000b0c31, 0x00345027, 0x0380676d, 0x002f0f6c}}}, + {X: Field{[10]uint32{0x0029d3ec, 0x029a5a83, 0x009499cf, 0x0326e5d2, 0x039582cb, 0x001eb25b, 0x00d9d8d4, 0x02fdde53, 0x0123b1ad, 0x002dc69a}}, Y: Field{[10]uint32{0x00b4f151, 0x03f38699, 0x03b1c89b, 0x03b9d9e7, 0x027b6d75, 0x00e31cb4, 0x03113c8d, 0x01563ee4, 0x03899d59, 0x001d4608}}}, + {X: Field{[10]uint32{0x03d3bb3f, 0x013571a9, 0x01a65200, 0x017c3677, 0x00a82f41, 0x01d595e2, 0x00ef76c0, 0x00e34633, 0x01ac68ba, 0x003291eb}}, Y: Field{[10]uint32{0x028701df, 0x02b41412, 0x0137842f, 0x0130e5a7, 0x02ccd845, 0x00597f56, 0x0035385e, 0x00ce0910, 0x00ab1b78, 0x0002f566}}}, + {X: Field{[10]uint32{0x0140e441, 0x03e6740b, 0x025eea45, 0x0313667d, 0x014fb989, 0x03757932, 0x034eeece, 0x03a7ba7e, 0x0148acee, 0x0017eb78}}, Y: Field{[10]uint32{0x033831f0, 0x00775335, 0x031cb5e6, 0x032ce50f, 0x0015afd1, 0x02374b00, 0x01104cac, 0x015606b1, 0x023ae82e, 0x002e9bf2}}}, + {X: Field{[10]uint32{0x025f84e9, 0x02b698ff, 0x0049e8ad, 0x014798ce, 0x02e834c8, 0x0073cc3e, 0x000ba01a, 0x033c0024, 0x01d214fc, 0x001d9f72}}, Y: Field{[10]uint32{0x00404639, 0x00c85799, 0x017d69ee, 0x03466b86, 0x0101a5bc, 0x03f5f2ff, 0x02b97a52, 0x003958b5, 0x0111aca3, 0x00231942}}}, + {X: Field{[10]uint32{0x024f06d9, 0x01c5e2df, 0x0286b91d, 0x035d1df9, 0x01523544, 0x030f01b6, 0x02a7648f, 0x00a88176, 0x0161445e, 0x0009fe3e}}, Y: Field{[10]uint32{0x02a73a60, 0x01f37f60, 0x00172042, 0x010886fa, 0x02379332, 0x02de7977, 0x0196bce6, 0x01efa5d5, 0x032782cd, 0x000e4442}}}, + {X: Field{[10]uint32{0x033de668, 0x000c594f, 0x035bc6a4, 0x02260e5c, 0x008a1b28, 0x01e77792, 0x024070bf, 0x01792eb6, 0x005b343b, 0x00237812}}, Y: Field{[10]uint32{0x02d5729d, 0x033eb883, 0x021431c2, 0x01ca0c0b, 0x0212fbba, 0x03164492, 0x011c1a44, 0x0383df5f, 0x03676f43, 0x00240c15}}}, + {X: Field{[10]uint32{0x012df0ff, 0x03973165, 0x01fe1b68, 0x0287bb25, 0x005b6af8, 0x039c030a, 0x038d3188, 0x03a2ba2a, 0x036c8770, 0x001790f6}}, Y: Field{[10]uint32{0x006c7aa6, 0x00a90e54, 0x01f90ae0, 0x00f4dc1d, 0x009aeebb, 0x0179671e, 0x02a10911, 0x02f3f8e8, 0x028dd85f, 0x001a2098}}}, + {X: Field{[10]uint32{0x01a4ed54, 0x0047d096, 0x037a0893, 0x00f3b7fa, 0x03610286, 0x00b7c508, 0x00af4e35, 0x00c0379f, 0x02ab4bf4, 0x001f6cae}}, Y: Field{[10]uint32{0x038e8a84, 0x0009bf85, 0x000cbd33, 0x01328f53, 0x01e553a8, 0x02164273, 0x03fbbcd6, 0x0112f8c0, 0x01a2fbbb, 0x000e1d58}}}, + {X: Field{[10]uint32{0x0196c6f1, 0x0134436e, 0x00bbefc0, 0x0332aee4, 0x00cdbefd, 0x00cb6cf9, 0x03df9e82, 0x01a21f47, 0x01253910, 0x0025b6a1}}, Y: Field{[10]uint32{0x03f9edcc, 0x00f4c026, 0x00509402, 0x024adff3, 0x0345948c, 0x0370cca1, 0x035d6513, 0x01cd067e, 0x02314912, 0x001949c6}}}, + {X: Field{[10]uint32{0x01d50613, 0x029e122b, 0x03b0081b, 0x003eb2e5, 0x0264cd4c, 0x00e2d217, 0x03a51fa8, 0x004a13d6, 0x01cb14eb, 0x00213bfc}}, Y: Field{[10]uint32{0x02febd9e, 0x01e314a9, 0x004fc7f5, 0x0044cbca, 0x03609f45, 0x033a0631, 0x01e602b6, 0x002a35ec, 0x01c8a654, 0x000249b2}}}, + {X: Field{[10]uint32{0x02adfbbe, 0x00665078, 0x017057fe, 0x02489756, 0x00416e6a, 0x02fe5280, 0x02e60007, 0x00a83fd7, 0x03718e2a, 0x0007ae58}}, Y: Field{[10]uint32{0x0005b855, 0x027da84c, 0x01bb009c, 0x008f3fc3, 0x02d3cf05, 0x00018e6a, 0x03d40115, 0x0377eb70, 0x02d89635, 0x00121c2a}}}, + {X: Field{[10]uint32{0x03bdc098, 0x01372e1d, 0x03fd8d45, 0x0287dda0, 0x03c75fd4, 0x02bc64f7, 0x01a8696b, 0x03cc1c6f, 0x036a6ea3, 0x000a6528}}, Y: Field{[10]uint32{0x03856766, 0x00b1312f, 0x02eb3fc8, 0x000c6dda, 0x009969bf, 0x025bf4fa, 0x006bd0be, 0x00f5335e, 0x00eea727, 0x0039197a}}}, + {X: Field{[10]uint32{0x0126c414, 0x01d63567, 0x03c00237, 0x032edfcb, 0x01d2b68f, 0x038b65f6, 0x01b115b5, 0x015e8b0a, 0x0370f3d3, 0x000979fe}}, Y: Field{[10]uint32{0x0356c4f2, 0x0099dcfc, 0x02631fed, 0x00c3beb2, 0x00206b73, 0x00ea1aae, 0x0130fa01, 0x02257afd, 0x0370a3bb, 0x00125668}}}, + {X: Field{[10]uint32{0x007c0623, 0x035624cd, 0x020ea0df, 0x01496221, 0x03c3945c, 0x0359af16, 0x030481a2, 0x01aef867, 0x039880bf, 0x003f0e1f}}, Y: Field{[10]uint32{0x009d67c4, 0x0198faed, 0x001ff16e, 0x01d03042, 0x027ba332, 0x00d1812a, 0x01d07af7, 0x03c0ca72, 0x000e83ca, 0x002275ee}}}, + {X: Field{[10]uint32{0x0201e1d4, 0x000ca53f, 0x03a99e2f, 0x02d00217, 0x00ef5c00, 0x03c5ddc8, 0x0220fa82, 0x0327f840, 0x0368c25f, 0x003142bc}}, Y: Field{[10]uint32{0x017579fb, 0x02532dae, 0x0131ba42, 0x003e5e32, 0x0327d9f1, 0x03a52bde, 0x012b80d9, 0x00c25024, 0x03264198, 0x0030ddde}}}, + {X: Field{[10]uint32{0x00041f94, 0x01d85f84, 0x01bea7c9, 0x0121553d, 0x00d7015c, 0x010697c8, 0x02003629, 0x0366ea8b, 0x0109d524, 0x00283e74}}, Y: Field{[10]uint32{0x010e9ad0, 0x00f18a9c, 0x019f1daf, 0x00e80e9a, 0x012eae92, 0x01915838, 0x0277ff2c, 0x0384200f, 0x0002daa5, 0x000a3147}}}, + {X: Field{[10]uint32{0x00316de1, 0x0218a8d2, 0x03a285da, 0x008f2f37, 0x032138bc, 0x0020012c, 0x03271389, 0x02dc2161, 0x02270058, 0x00107449}}, Y: Field{[10]uint32{0x001b9673, 0x037d3c1f, 0x02999d29, 0x029243ac, 0x00341d90, 0x03545764, 0x015f4513, 0x033b2572, 0x0029153b, 0x000189dc}}}, + {X: Field{[10]uint32{0x0299ca87, 0x003e159b, 0x0221cfb8, 0x02335875, 0x02577444, 0x00ceb6ce, 0x03afb77e, 0x03d50f64, 0x00cefe6c, 0x00251316}}, Y: Field{[10]uint32{0x004d66b5, 0x01cc5c0a, 0x03056e74, 0x022adf5e, 0x02329495, 0x01af2c88, 0x011c5576, 0x031c5f2a, 0x001c9b7f, 0x00301c7b}}}, + {X: Field{[10]uint32{0x02437145, 0x02afafef, 0x00635f2b, 0x01645ca4, 0x009a27be, 0x023baed6, 0x0029bf18, 0x01c73a70, 0x0312e06d, 0x000cc1ea}}, Y: Field{[10]uint32{0x0061d213, 0x01aa5272, 0x014c3c6b, 0x03425f61, 0x014a6966, 0x0227a602, 0x008dd9bf, 0x0242451d, 0x00b928cf, 0x0022270f}}}, + {X: Field{[10]uint32{0x01cb9ae6, 0x006dfcd1, 0x028acdee, 0x01c8b6da, 0x0272b745, 0x0090c1ed, 0x0203abd0, 0x00893932, 0x00111eb2, 0x0010aebc}}, Y: Field{[10]uint32{0x0212ee06, 0x0257ea8b, 0x00b11256, 0x0349cde7, 0x02879515, 0x02348b17, 0x0164bec3, 0x037a892d, 0x0128d608, 0x002fccb8}}}, + {X: Field{[10]uint32{0x0002c621, 0x01321531, 0x006bfe73, 0x03028af2, 0x01166c69, 0x0043445d, 0x03be8981, 0x012f4127, 0x02bbbe7b, 0x00215aea}}, Y: Field{[10]uint32{0x0112ac0c, 0x035d0612, 0x0321b943, 0x025e7b51, 0x011f8251, 0x0388a7a2, 0x0024161b, 0x007f4f35, 0x03c9b6d3, 0x000928c8}}}, + {X: Field{[10]uint32{0x024a9cd4, 0x01b60c34, 0x02c1c321, 0x03720172, 0x0195aeea, 0x03a0e0d3, 0x00c224ed, 0x0050f61d, 0x018ed998, 0x000e36f0}}, Y: Field{[10]uint32{0x027eae4a, 0x02247945, 0x00a03570, 0x03b9fe4d, 0x01271c6e, 0x0242ad71, 0x038e2eaa, 0x015de3a8, 0x0126f7e8, 0x0009cfb0}}}, + {X: Field{[10]uint32{0x0188dc59, 0x007ae052, 0x00d92c98, 0x019697d2, 0x015e24c0, 0x020dd2bc, 0x026bb20c, 0x008ca4c5, 0x005bffcd, 0x000d6772}}, Y: Field{[10]uint32{0x03bf39c6, 0x0058beaf, 0x0184ae58, 0x000fdded, 0x02c4a057, 0x010def7f, 0x0237d06e, 0x01622e40, 0x01f7deef, 0x0037977b}}}, + {X: Field{[10]uint32{0x023666ea, 0x028d6df1, 0x0283bb1c, 0x01d275fc, 0x031d872a, 0x0297cf69, 0x022f73a6, 0x007220f7, 0x0065e2e9, 0x003841a0}}, Y: Field{[10]uint32{0x03752cd9, 0x0347c05c, 0x00523c5e, 0x03eb2375, 0x01a7e155, 0x01da140d, 0x0128afaa, 0x0021461e, 0x0252b5df, 0x0020430e}}}, + {X: Field{[10]uint32{0x03b19d83, 0x02141b76, 0x033c70fd, 0x01b72f57, 0x00b56495, 0x03377f7f, 0x03171830, 0x032699b8, 0x037137e7, 0x00141d9f}}, Y: Field{[10]uint32{0x00d4fff8, 0x00e19928, 0x039fa5e3, 0x019d58f6, 0x02393b61, 0x03cb82b8, 0x03d24dd3, 0x017fb601, 0x015f5e9d, 0x003870b7}}}, + {X: Field{[10]uint32{0x02e65864, 0x02d66039, 0x00a725a0, 0x017fd4f6, 0x035e0127, 0x03f3a84d, 0x0216d0de, 0x020d57c4, 0x03f0cdf8, 0x001133b2}}, Y: Field{[10]uint32{0x011cd40e, 0x030eb5bd, 0x00d2e025, 0x008bc572, 0x02e8e3f0, 0x019ef18d, 0x0290550e, 0x03a6e7b8, 0x028e5094, 0x00011a55}}}, + {X: Field{[10]uint32{0x02aa18b3, 0x038d11e5, 0x005e886c, 0x024980b8, 0x0387ed8a, 0x02bf28ae, 0x02fe5976, 0x02c1fbe8, 0x00ea43cb, 0x00060c32}}, Y: Field{[10]uint32{0x031da49d, 0x0077610b, 0x01d658bf, 0x03ead511, 0x013c8ce2, 0x03e8c704, 0x03562037, 0x02bb9d9f, 0x0328e064, 0x0037d544}}}, + {X: Field{[10]uint32{0x019326c6, 0x0242a92f, 0x02b799bf, 0x03ab13e3, 0x00708245, 0x0107d3b9, 0x0033417a, 0x01eac947, 0x037a473a, 0x00163552}}, Y: Field{[10]uint32{0x009b2a85, 0x01168bb1, 0x027891ce, 0x024febd7, 0x02a16920, 0x02c72cb2, 0x00c331bf, 0x0381f329, 0x033815e2, 0x0028647c}}}, + {X: Field{[10]uint32{0x02c6792c, 0x024ad544, 0x01af7ba1, 0x01b913a0, 0x0170a18b, 0x00bf2618, 0x03af1044, 0x0204b980, 0x02049507, 0x003c3739}}, Y: Field{[10]uint32{0x03b966e4, 0x029ec26e, 0x015ce3ad, 0x02d31536, 0x004cc60e, 0x033c3d58, 0x0248df55, 0x01bb588f, 0x0221b5e8, 0x00308868}}}, + {X: Field{[10]uint32{0x01dd2ab5, 0x02e94156, 0x013d40d7, 0x033eb94a, 0x02e4b958, 0x0112c9ab, 0x02aaa046, 0x00c0aca1, 0x01e572c0, 0x0010bec2}}, Y: Field{[10]uint32{0x01f2299f, 0x0206f546, 0x00099437, 0x02a09d25, 0x03f46e1b, 0x020f9f45, 0x007ec769, 0x01a223ef, 0x0173a00e, 0x001e7041}}}, + {X: Field{[10]uint32{0x03502ecb, 0x034104bc, 0x005deea2, 0x02f222c0, 0x00935465, 0x0036b443, 0x028db25e, 0x00326a18, 0x0151ddae, 0x001eb7c5}}, Y: Field{[10]uint32{0x01acfd20, 0x01621bca, 0x01a9bb3c, 0x019e7651, 0x012e031e, 0x02744428, 0x01ef5c36, 0x03aa4832, 0x03a2143c, 0x00195f02}}}, + {X: Field{[10]uint32{0x002c7a5a, 0x03f6470a, 0x013454df, 0x0324a049, 0x013a7bfd, 0x03f0bd6f, 0x0271310a, 0x03da9b58, 0x00b956fd, 0x00375692}}, Y: Field{[10]uint32{0x00a52657, 0x03df305f, 0x021e385d, 0x03364685, 0x002ac6b0, 0x02564119, 0x03521072, 0x01fcdbea, 0x00372e06, 0x001ce434}}}, + {X: Field{[10]uint32{0x021466fe, 0x01b0b622, 0x0301d293, 0x00ec74d8, 0x0013ac76, 0x00134b38, 0x01c783b1, 0x011652f8, 0x00b51537, 0x0018c614}}, Y: Field{[10]uint32{0x0190882e, 0x03cc8a31, 0x03a8578b, 0x000addfb, 0x022016d2, 0x015ca6b3, 0x0241416c, 0x01f912a4, 0x021ea9b6, 0x00092433}}}, + {X: Field{[10]uint32{0x03a0bca5, 0x02c381bc, 0x028e0741, 0x01a6f71a, 0x00244668, 0x00e8f331, 0x0185cd58, 0x0088a6bb, 0x01e4d673, 0x000ccb8e}}, Y: Field{[10]uint32{0x017578e7, 0x01135217, 0x025aa602, 0x0037d351, 0x00b66ac3, 0x01d2b597, 0x018b1b40, 0x014ab829, 0x030360db, 0x00242103}}}, + {X: Field{[10]uint32{0x022f0c97, 0x0144e90d, 0x00980de7, 0x02ca479c, 0x01d72c0e, 0x00994cbc, 0x027224e8, 0x03870595, 0x0156f0c7, 0x00378065}}, Y: Field{[10]uint32{0x00411ea3, 0x002bb61a, 0x03e479af, 0x02f5925d, 0x01d75fa5, 0x018e094a, 0x022227a6, 0x02210105, 0x039d1cc9, 0x000e68f5}}}, + {X: Field{[10]uint32{0x00ed859f, 0x0128b2c9, 0x002a6809, 0x01b28fe4, 0x024f81b7, 0x006e0b91, 0x02ffbf26, 0x036a0031, 0x00c8e675, 0x00131130}}, Y: Field{[10]uint32{0x0245ac34, 0x00ad64c3, 0x0224663b, 0x025c68e8, 0x00c54978, 0x010eae2b, 0x03f28002, 0x01177b63, 0x02881ecc, 0x0016787b}}}, + {X: Field{[10]uint32{0x009286a2, 0x00d953cc, 0x03d28279, 0x02f844f9, 0x02a4e0dc, 0x017773b1, 0x01f4d1a8, 0x03867970, 0x01b80481, 0x003980ce}}, Y: Field{[10]uint32{0x009d9d59, 0x0229c1a9, 0x0372d1b0, 0x03e51cdf, 0x00bc58e3, 0x034a96a6, 0x01c7998e, 0x02507ed4, 0x02cca607, 0x002687ba}}}, + {X: Field{[10]uint32{0x00a25e66, 0x0340b0f6, 0x01be0d44, 0x015714a1, 0x010c6ad9, 0x0023ffb1, 0x00bc4727, 0x024bce7d, 0x02e30e72, 0x00043d0b}}, Y: Field{[10]uint32{0x00916a25, 0x02a5d73b, 0x01106034, 0x0037c069, 0x00183e13, 0x0259f3c5, 0x01d5f2bc, 0x038a3f6e, 0x01f053eb, 0x0001bcd9}}}, + {X: Field{[10]uint32{0x0329c445, 0x014f6199, 0x01548b6d, 0x02b964ea, 0x03703af3, 0x031635d2, 0x02fb0f31, 0x019a1df4, 0x01cad128, 0x001f824c}}, Y: Field{[10]uint32{0x036b0b0b, 0x00485d07, 0x03ffbf5a, 0x03e489dc, 0x00a9c34a, 0x0015bd32, 0x03caf7e8, 0x02d07598, 0x01fc75ea, 0x0001792e}}}, + {X: Field{[10]uint32{0x03963f22, 0x00450d55, 0x00f1c6a0, 0x03036c9e, 0x01b7f1ac, 0x020d8bdf, 0x014cd1a7, 0x00f1b3fc, 0x037ef961, 0x000d8c4f}}, Y: Field{[10]uint32{0x03d7edc2, 0x006ead10, 0x03a69864, 0x0246e998, 0x0033960a, 0x01250817, 0x006627f5, 0x0108c52b, 0x02ab02a9, 0x00079a51}}}, + {X: Field{[10]uint32{0x0069fe01, 0x03b15d0a, 0x033bb55c, 0x0164bf23, 0x0283f9ba, 0x03aa8ba7, 0x0218a63c, 0x030996cb, 0x02d88eed, 0x00088fbb}}, Y: Field{[10]uint32{0x01bbd71c, 0x00842570, 0x025ffeff, 0x02e35a1f, 0x005593f7, 0x00b5cb44, 0x0232cc89, 0x026ff3cd, 0x01734ae2, 0x001c8488}}}, + {X: Field{[10]uint32{0x00b3ec20, 0x01e9698a, 0x035fc31b, 0x02f3e6a6, 0x0160dbb2, 0x021e5684, 0x03b9b321, 0x00b1780f, 0x02c93330, 0x002daf57}}, Y: Field{[10]uint32{0x019dd495, 0x0074b672, 0x0242cd0f, 0x03ce6d0a, 0x0034f373, 0x00ed22eb, 0x01f051d6, 0x0397fac5, 0x03f298a8, 0x003ee7e1}}}, + {X: Field{[10]uint32{0x00e24668, 0x02a2c053, 0x012c98f0, 0x02fcee3e, 0x025a802d, 0x023f55eb, 0x03f69ce0, 0x0093ec55, 0x03603b1c, 0x0028d969}}, Y: Field{[10]uint32{0x000a89f9, 0x02fb0fd7, 0x037606f2, 0x02d06c34, 0x02578005, 0x02606039, 0x0238cc72, 0x02af680a, 0x022b7746, 0x001cf990}}}, + {X: Field{[10]uint32{0x03cebe6e, 0x017287b5, 0x0213aa23, 0x007b4de7, 0x03e24bac, 0x03511a81, 0x02dba309, 0x00dbdbd2, 0x03ac43e4, 0x003a1be3}}, Y: Field{[10]uint32{0x00a166af, 0x00f5b6fd, 0x01cd4a91, 0x0009df30, 0x00930b74, 0x00a8044d, 0x03a592c4, 0x02a6f5c4, 0x00efaa75, 0x00079eed}}}, + {X: Field{[10]uint32{0x039bd5ac, 0x00fa1a3a, 0x015cc993, 0x038ba162, 0x0205cab3, 0x03f78768, 0x0109304c, 0x0155c76b, 0x01fad2b2, 0x003d695f}}, Y: Field{[10]uint32{0x037c1ff6, 0x02317a61, 0x029b0c76, 0x001afb2e, 0x008eb909, 0x02265e89, 0x018dad26, 0x00390754, 0x025e8fc9, 0x00349977}}}, + {X: Field{[10]uint32{0x01f76c7b, 0x011651dd, 0x010f145c, 0x01f28afc, 0x01665660, 0x009192a7, 0x02fd8cab, 0x024dd1f9, 0x017a0725, 0x00387734}}, Y: Field{[10]uint32{0x02f9a20e, 0x03799012, 0x0278a130, 0x0339ae55, 0x00dff819, 0x008caf51, 0x009feb61, 0x021b4992, 0x0310023f, 0x003be8b0}}}, + {X: Field{[10]uint32{0x03a801ff, 0x00e1b373, 0x00c3bafd, 0x03f73290, 0x03cb3774, 0x00176a6a, 0x0274b80a, 0x025ab46f, 0x03dd0849, 0x0020fe2a}}, Y: Field{[10]uint32{0x03c3f63d, 0x01f18e92, 0x002873d3, 0x00ddaa89, 0x001c85ff, 0x019a1a36, 0x02e792d9, 0x02c4395b, 0x0164329f, 0x00099faf}}}, + {X: Field{[10]uint32{0x03259fae, 0x02e952d3, 0x02454ea9, 0x006bcd3f, 0x03ca324b, 0x01445216, 0x0087c716, 0x016a409d, 0x01796ca8, 0x00153327}}, Y: Field{[10]uint32{0x02b2da2a, 0x007682fe, 0x020f2e20, 0x030545f3, 0x023c6ce8, 0x03adba0e, 0x0016e9ed, 0x021875f4, 0x0071ef0b, 0x000630e4}}}, + {X: Field{[10]uint32{0x01402ba4, 0x0070864c, 0x02a51635, 0x02b25039, 0x001c3f65, 0x0047e1d1, 0x0075ac1b, 0x0059538a, 0x012ae009, 0x002744a9}}, Y: Field{[10]uint32{0x00e81d2e, 0x038bc04e, 0x02e52bbe, 0x00b754fd, 0x03c6d7e4, 0x03d7eb58, 0x00d17f39, 0x0066bd06, 0x03342762, 0x0017feec}}}, + {X: Field{[10]uint32{0x02496998, 0x00ed9979, 0x038244f2, 0x03c2dfbc, 0x00488007, 0x03c86ba9, 0x0030917f, 0x006a4734, 0x01b76682, 0x001966ff}}, Y: Field{[10]uint32{0x014784e0, 0x0139f289, 0x039db844, 0x023af087, 0x03d7321a, 0x022f091f, 0x01ef96b7, 0x03a168d0, 0x00bc4506, 0x000ab5c2}}}, + {X: Field{[10]uint32{0x02b4670b, 0x004a5b97, 0x02413d60, 0x013d5cc4, 0x0276ba1b, 0x0055269a, 0x026a2538, 0x020dd121, 0x0233d4a0, 0x0038b313}}, Y: Field{[10]uint32{0x00672476, 0x00502269, 0x00e18797, 0x002e8eca, 0x0080497f, 0x01930dc6, 0x039780ea, 0x01fcd1ed, 0x0325347e, 0x0014a2ca}}}, + {X: Field{[10]uint32{0x02edec68, 0x023840f9, 0x00131e24, 0x03133f2b, 0x01e8dbba, 0x02941580, 0x02164c0f, 0x030db26c, 0x039c9e21, 0x0014a702}}, Y: Field{[10]uint32{0x027125f4, 0x01c04a55, 0x037e4967, 0x017c272e, 0x026cb74f, 0x034b80e1, 0x0269e6ab, 0x032804cd, 0x002172a0, 0x001fe912}}}, + {X: Field{[10]uint32{0x003b63a1, 0x034d54da, 0x01dda654, 0x01efacbc, 0x033d89e5, 0x0203ed96, 0x00d6532a, 0x01f47055, 0x03afbe6a, 0x000a275a}}, Y: Field{[10]uint32{0x01005400, 0x024c5a1f, 0x03b53388, 0x03c30f36, 0x03db149f, 0x01499e1d, 0x022c62c5, 0x02358583, 0x0063d3ce, 0x002007d2}}}, + {X: Field{[10]uint32{0x010f14a1, 0x00bb3c1e, 0x0099e51f, 0x01616346, 0x022eab9b, 0x0096ad0c, 0x0005bb34, 0x019981f0, 0x00c9e3b3, 0x00345aa1}}, Y: Field{[10]uint32{0x0156dd07, 0x02d46614, 0x0231379b, 0x033c672c, 0x0146ec79, 0x02b5b83c, 0x03fc5ea4, 0x014ca3e7, 0x01ab1071, 0x000b1bd7}}}, + {X: Field{[10]uint32{0x036348f1, 0x01c0ec5a, 0x01affd30, 0x03cfb2f8, 0x02a7062d, 0x010436ac, 0x00a6893e, 0x02fefd10, 0x00394fda, 0x00340f2b}}, Y: Field{[10]uint32{0x009d19f9, 0x006e8d11, 0x0040ae5d, 0x01b4e390, 0x035dc4a8, 0x037a56c6, 0x0185c087, 0x02cc5dc3, 0x03cef530, 0x000548c4}}}, + {X: Field{[10]uint32{0x0063379b, 0x0081ed6a, 0x03101c89, 0x0012f125, 0x00d4c4b6, 0x03e5a616, 0x00a7d851, 0x0312a5df, 0x006ca673, 0x002d9acf}}, Y: Field{[10]uint32{0x01624da4, 0x01c2c18c, 0x005609a4, 0x03fc61fc, 0x004b00fa, 0x0055a587, 0x02c63cb7, 0x01aab120, 0x0163771c, 0x00152e89}}}, + {X: Field{[10]uint32{0x018c8c45, 0x039145aa, 0x01e86236, 0x01a01e71, 0x002a43fb, 0x039f5cc2, 0x013127f4, 0x01f35f7f, 0x024411c4, 0x002f9a11}}, Y: Field{[10]uint32{0x026733da, 0x03eba160, 0x01f19a15, 0x030bf7ba, 0x017d78dd, 0x0273143a, 0x0395aaeb, 0x00da30b8, 0x0383c61d, 0x001e4a43}}}, + {X: Field{[10]uint32{0x03cbde9b, 0x00afedeb, 0x00e0c5c6, 0x007e4748, 0x0004ca42, 0x03b8061e, 0x021de709, 0x03d18d35, 0x03a09f34, 0x0011e2b0}}, Y: Field{[10]uint32{0x030988bf, 0x00dd955e, 0x01c34f6e, 0x012fddfb, 0x02e4bc7d, 0x015d2d7d, 0x027526f5, 0x0042586b, 0x03b2ccbc, 0x003dd4bc}}}, + {X: Field{[10]uint32{0x033dcfc8, 0x01905e63, 0x00796e70, 0x028301df, 0x037271a2, 0x026f5284, 0x00d7de9c, 0x01c6a675, 0x015af2ed, 0x001d17cd}}, Y: Field{[10]uint32{0x02e288b9, 0x010818e1, 0x01f6e672, 0x00998c31, 0x02d4fe88, 0x00c78664, 0x0105816c, 0x021fc27b, 0x01f46b0c, 0x00063a98}}}, + {X: Field{[10]uint32{0x02760ce0, 0x02d483a1, 0x014b218d, 0x0238e2ae, 0x00a3157a, 0x00a1909f, 0x01aede59, 0x02a2c242, 0x016f9878, 0x001539ef}}, Y: Field{[10]uint32{0x01fb8e49, 0x03493cc3, 0x03f2ddc1, 0x0294d034, 0x00e04bdb, 0x01d7702d, 0x033c6386, 0x02d12347, 0x000dc1ea, 0x0035edf6}}}, + {X: Field{[10]uint32{0x007d510e, 0x012807e8, 0x0120827e, 0x02b8f725, 0x0399b018, 0x0331bfaf, 0x006f5c7f, 0x010c7bcf, 0x03b655eb, 0x003fd5ab}}, Y: Field{[10]uint32{0x0191e371, 0x03a6d109, 0x03509655, 0x00403a89, 0x02ec7232, 0x01268a35, 0x00388b40, 0x02c71e7d, 0x01b842d7, 0x0026feaf}}}, + {X: Field{[10]uint32{0x029cda72, 0x00e7487f, 0x02be382d, 0x01057fcf, 0x00ea511b, 0x0363a9e4, 0x01d02506, 0x023f219e, 0x0099ed29, 0x0030af30}}, Y: Field{[10]uint32{0x030f971f, 0x03b2d614, 0x03070aa1, 0x03c163be, 0x00825de4, 0x00bf4e31, 0x02c31a58, 0x03ddcd6d, 0x02c435ec, 0x001b1efc}}}, + {X: Field{[10]uint32{0x00e2ec4e, 0x020061c2, 0x000f599a, 0x00da242e, 0x02c8549e, 0x0271a07f, 0x014b9a11, 0x00cc79b1, 0x01449811, 0x0008e0fc}}, Y: Field{[10]uint32{0x0133a1f9, 0x0182838d, 0x01cb1448, 0x00fa774d, 0x00d8fff0, 0x00111c3c, 0x00a999a7, 0x02dad64e, 0x011fd846, 0x0004ead0}}}, + {X: Field{[10]uint32{0x02096048, 0x01afc31b, 0x016b817d, 0x01ca2778, 0x0209953f, 0x0293d499, 0x0244584b, 0x00762fe2, 0x01c0d4fa, 0x000bc89c}}, Y: Field{[10]uint32{0x03b42fc4, 0x0182d80b, 0x00ab57cd, 0x00f69bc5, 0x03a95717, 0x00fbd54f, 0x0332c226, 0x0143a2db, 0x005db40e, 0x00191bbc}}}, + {X: Field{[10]uint32{0x01e951c7, 0x007c9a89, 0x01d089bf, 0x03682b69, 0x03809e7a, 0x02c047ba, 0x01be55cb, 0x01e89fbb, 0x031b0f06, 0x002ded26}}, Y: Field{[10]uint32{0x037c33ed, 0x037b8b1f, 0x033315b2, 0x00811641, 0x014a9b7f, 0x01f2c0ca, 0x02ec95c0, 0x001496b5, 0x00aca816, 0x003fb1d8}}}, + {X: Field{[10]uint32{0x01409223, 0x0206a979, 0x03557941, 0x032e7c2b, 0x027765d4, 0x00b6be07, 0x01866eb1, 0x00f9725c, 0x01cad993, 0x000db238}}, Y: Field{[10]uint32{0x008b8fdf, 0x0064cab7, 0x00853e29, 0x017d4926, 0x0122f2e3, 0x0045baa5, 0x01cc7309, 0x008a0b5c, 0x02d0a025, 0x002257ad}}}, + {X: Field{[10]uint32{0x001ed523, 0x01ef78ef, 0x00d6a6ee, 0x00455a13, 0x00fa5b8a, 0x0330ac38, 0x0173e018, 0x00d6484c, 0x01276328, 0x000f2fa4}}, Y: Field{[10]uint32{0x0244dc81, 0x03cc33f3, 0x03055e4d, 0x02cf4264, 0x01c5149a, 0x01d7c785, 0x030aa9dc, 0x01b26e65, 0x01c922f9, 0x001ecb4f}}}, + {X: Field{[10]uint32{0x0247213c, 0x01fa5ed8, 0x02d164e6, 0x02640c53, 0x02fe0aec, 0x022c8e79, 0x0048d380, 0x0250648d, 0x0141c463, 0x001dba53}}, Y: Field{[10]uint32{0x01fa1278, 0x03061ac8, 0x03cb5a3b, 0x0392fca0, 0x03f9efe4, 0x01d7e8e3, 0x03460bfd, 0x001d2440, 0x02c32f01, 0x0023b929}}}, + {X: Field{[10]uint32{0x031851ec, 0x03cd0cd2, 0x00c08506, 0x009e3bb0, 0x025b265d, 0x01ffa76e, 0x01749e00, 0x039f9e85, 0x01cb12c0, 0x00124e49}}, Y: Field{[10]uint32{0x0062b193, 0x02c5af13, 0x01a9a1f5, 0x003b6067, 0x02e4a240, 0x03dcc299, 0x02b318f9, 0x029195b2, 0x006b3960, 0x001c2403}}}, + {X: Field{[10]uint32{0x003cdcbf, 0x01cebb71, 0x026b7511, 0x01aaa7d7, 0x00387330, 0x01208f4e, 0x0020eb4a, 0x00e4f5e6, 0x02bad1a1, 0x002cdff6}}, Y: Field{[10]uint32{0x0327030a, 0x03b18203, 0x0252f28f, 0x03ca78d5, 0x03dfd325, 0x00c29d69, 0x00df67be, 0x0344e788, 0x00de57fa, 0x002141bc}}}, + {X: Field{[10]uint32{0x00a5e8c1, 0x027d296c, 0x007033c2, 0x008c271b, 0x008f2b70, 0x027e41c9, 0x030c90e0, 0x017124ca, 0x020c48e9, 0x00111465}}, Y: Field{[10]uint32{0x00d7490c, 0x006da1f5, 0x024de53b, 0x013efbd4, 0x0228bc40, 0x01dd9a93, 0x01c9e1a4, 0x027d9a58, 0x0218d9ce, 0x0020d54e}}}, + {X: Field{[10]uint32{0x03ea3449, 0x018ee037, 0x00704caf, 0x006f21a7, 0x00785772, 0x00fe61c6, 0x00ab20eb, 0x01a6e603, 0x01a8697c, 0x0026c2b0}}, Y: Field{[10]uint32{0x027e60e9, 0x0159877e, 0x0045d65b, 0x008c1cba, 0x0361b617, 0x00a02614, 0x0232a582, 0x02fcfdc7, 0x0053bf1b, 0x00084393}}}, + {X: Field{[10]uint32{0x001e0851, 0x01a12d1e, 0x01cebe92, 0x03e9f6f4, 0x0132eca4, 0x03003731, 0x02d62de1, 0x013df848, 0x0355ccae, 0x00399a5c}}, Y: Field{[10]uint32{0x01bdc3cb, 0x02e88dba, 0x01da1736, 0x024509ef, 0x029d3ded, 0x02201aa0, 0x00353f71, 0x03bcf251, 0x00ffdbe5, 0x0007c48b}}}, + {X: Field{[10]uint32{0x0167201e, 0x027c983c, 0x03f2afe3, 0x01387311, 0x03ad480a, 0x00a22eb1, 0x0326f861, 0x02932807, 0x00f11a1a, 0x003fea24}}, Y: Field{[10]uint32{0x01439cb4, 0x011272a1, 0x02b5d69d, 0x03682c06, 0x00ac569c, 0x01f43ba3, 0x03c41497, 0x03f0f51c, 0x03c41716, 0x0005a237}}}, + {X: Field{[10]uint32{0x00b6bf47, 0x02c6d3d5, 0x02c14cd3, 0x015e51b1, 0x00c41fcc, 0x03012813, 0x02b09b15, 0x00e33d8f, 0x00f26ce2, 0x00242235}}, Y: Field{[10]uint32{0x00d2c2b9, 0x00997579, 0x02909bfe, 0x0204adc3, 0x032ae4ec, 0x00f4d676, 0x01c9943b, 0x000138f5, 0x0017bc61, 0x00278e01}}}, + {X: Field{[10]uint32{0x01576a91, 0x0023ff36, 0x0070767c, 0x0288b00d, 0x0299949c, 0x00ca5af0, 0x03f7e5fe, 0x018383f9, 0x01dac1e7, 0x0028ce57}}, Y: Field{[10]uint32{0x012393d3, 0x025039d1, 0x038706ee, 0x00337800, 0x02314185, 0x00f7f3ee, 0x03070162, 0x01b45c5b, 0x039a5403, 0x0013e2a1}}}, + {X: Field{[10]uint32{0x038ad651, 0x0219e2ca, 0x00ecbd20, 0x0035d4cc, 0x011a7730, 0x007da1aa, 0x00ef2345, 0x03078163, 0x016454aa, 0x00047953}}, Y: Field{[10]uint32{0x01c020f2, 0x022ce5b2, 0x026796e0, 0x01164234, 0x01aaa53f, 0x0154a893, 0x0121dfef, 0x0067e715, 0x01605a84, 0x001d26ca}}}, + {X: Field{[10]uint32{0x00327f30, 0x02023f19, 0x0174675e, 0x036a3932, 0x0198f5f0, 0x031c074a, 0x02d5a707, 0x03a08aad, 0x00df7b41, 0x00323c4f}}, Y: Field{[10]uint32{0x03199404, 0x01a251f0, 0x0194d441, 0x02b75827, 0x00445d7a, 0x007cd3d8, 0x00329d6a, 0x0270737b, 0x01df17c0, 0x0012269a}}}, + {X: Field{[10]uint32{0x02d84442, 0x00f3dba4, 0x0250cd46, 0x02522897, 0x029487f3, 0x0386a770, 0x00c628c3, 0x0120e2a5, 0x02dccf67, 0x00245d79}}, Y: Field{[10]uint32{0x03de1c22, 0x002061a3, 0x007298cb, 0x00ec6e0f, 0x03c13e19, 0x01e329e9, 0x0237e510, 0x01c49547, 0x013fed37, 0x0021c15c}}}, + {X: Field{[10]uint32{0x0220099b, 0x018efd0d, 0x0209d228, 0x03b36c5e, 0x005df8b9, 0x014eb028, 0x038f6b89, 0x03c3a7b9, 0x012fb6d5, 0x0023bb52}}, Y: Field{[10]uint32{0x020ff1bf, 0x03a22747, 0x039d99ec, 0x03f41036, 0x0082e1ac, 0x0090e7b2, 0x00f8b946, 0x00ba6367, 0x03421767, 0x0008e915}}}, + {X: Field{[10]uint32{0x015c2dd9, 0x03e8d9c3, 0x03756beb, 0x02f1946d, 0x035cde90, 0x00417d75, 0x0393f543, 0x001bbde5, 0x0223dbac, 0x0032e573}}, Y: Field{[10]uint32{0x024a9a48, 0x022f9785, 0x02a4fc61, 0x01d3dfb3, 0x0057d22d, 0x01c777ad, 0x035ed992, 0x02c301ce, 0x02bac023, 0x002584a9}}}, + {X: Field{[10]uint32{0x03a3c980, 0x02b24199, 0x007c915d, 0x024e7391, 0x01d8fdd4, 0x02d69de4, 0x02a8ebf8, 0x03fcdf50, 0x00c8bbd3, 0x00199c86}}, Y: Field{[10]uint32{0x00ec26c0, 0x02020f23, 0x00f2ace9, 0x039c19d4, 0x00452a21, 0x00156d55, 0x0344aab1, 0x02bf751a, 0x01799e19, 0x00375004}}}, + {X: Field{[10]uint32{0x02f76e5f, 0x0166be0c, 0x0385219b, 0x02d683b4, 0x000c7627, 0x0310a5a6, 0x013e855d, 0x01214739, 0x01c60ded, 0x002211e6}}, Y: Field{[10]uint32{0x021c4a6b, 0x036998b0, 0x005ac3af, 0x01dff33c, 0x0022e343, 0x014b379e, 0x00d2d371, 0x010231e7, 0x01ed84e6, 0x0008e35d}}}, + {X: Field{[10]uint32{0x0111d143, 0x03bbab5a, 0x0396a256, 0x0240e9af, 0x022cc8bb, 0x0093a9b4, 0x03a05bae, 0x0020b165, 0x036b5fc0, 0x0023663c}}, Y: Field{[10]uint32{0x00ab3cd3, 0x035ece38, 0x01516f2a, 0x00c6c770, 0x03de7df9, 0x0005a05d, 0x01b2fcf8, 0x00a9b541, 0x011afc90, 0x0009ba2b}}}, + {X: Field{[10]uint32{0x03d70ad2, 0x00fd2e0f, 0x001ae740, 0x0223219d, 0x03d1db23, 0x034bbec7, 0x032cbc28, 0x031b4c9f, 0x02cac0dd, 0x002ea418}}, Y: Field{[10]uint32{0x028b38c2, 0x012ec299, 0x019f78f2, 0x03f5edcf, 0x01674539, 0x00e05115, 0x0171ccd5, 0x039d5367, 0x035b3036, 0x0011cecc}}}, + {X: Field{[10]uint32{0x02cdca29, 0x007700c2, 0x008f01ff, 0x014c478a, 0x017453ca, 0x01588414, 0x029be675, 0x039825e9, 0x02d73bf0, 0x00128b4d}}, Y: Field{[10]uint32{0x02ca8f83, 0x0290e1ac, 0x001d8595, 0x0205236c, 0x029d694a, 0x00a63d7e, 0x0283ac6c, 0x00c73513, 0x01e7a903, 0x0003fda4}}}, + {X: Field{[10]uint32{0x0337d0c4, 0x018b8773, 0x01c4fcd3, 0x00db8015, 0x006b3651, 0x00b0c972, 0x00fb0d93, 0x012c5ad9, 0x028fd99c, 0x003a1a3c}}, Y: Field{[10]uint32{0x00d4a9eb, 0x00ab7b13, 0x00bca274, 0x0044df65, 0x0240e5fa, 0x02224426, 0x00e0440e, 0x0040d23a, 0x02c18340, 0x002b4cd1}}}, + {X: Field{[10]uint32{0x03abbf3b, 0x028d464a, 0x03eea99d, 0x025b6903, 0x03ea77e6, 0x0088e60c, 0x0177e566, 0x01b2944b, 0x0289830a, 0x001b17a1}}, Y: Field{[10]uint32{0x01779540, 0x03a5196b, 0x017c12be, 0x00351a96, 0x0356b983, 0x01d4d91f, 0x01c333dd, 0x002d81ef, 0x01f15fd0, 0x0030a781}}}, + {X: Field{[10]uint32{0x00046344, 0x0096fb07, 0x02210e1a, 0x0318942b, 0x01c317ad, 0x02e756a4, 0x0391cc86, 0x00b7feba, 0x02a56ebf, 0x002ce85c}}, Y: Field{[10]uint32{0x034ac3d5, 0x017ebe0e, 0x01d119fc, 0x030379e9, 0x02f06401, 0x026930be, 0x031fff90, 0x0035b6f4, 0x01799ae4, 0x000a3db7}}}, + {X: Field{[10]uint32{0x000d8f47, 0x02a53884, 0x02b80091, 0x03b1c68e, 0x00ac4a22, 0x0251a2a3, 0x00aed673, 0x035de694, 0x01d2e2f9, 0x000663c1}}, Y: Field{[10]uint32{0x03cd0414, 0x0226782d, 0x002b3cbf, 0x01a0d830, 0x03397089, 0x00ff2c88, 0x02e3baaf, 0x00c5cf2b, 0x003fc981, 0x00331a86}}}, + {X: Field{[10]uint32{0x0077f48e, 0x03d42aac, 0x039d89f0, 0x036de7f0, 0x0341ae77, 0x02142c1e, 0x007703ae, 0x029e452f, 0x038fa943, 0x001e2c85}}, Y: Field{[10]uint32{0x025274e7, 0x0272c558, 0x02beb11b, 0x03b30a7a, 0x01d78fce, 0x006006f8, 0x0389004e, 0x02c24a2e, 0x0234f2cb, 0x00217f4f}}}, + {X: Field{[10]uint32{0x01943f3e, 0x010fee36, 0x02dcccec, 0x03e757dc, 0x0023828e, 0x01c38a29, 0x017a7951, 0x0145d7e6, 0x03001d4c, 0x001bdc37}}, Y: Field{[10]uint32{0x028315ce, 0x007bb733, 0x03ee5f0f, 0x030aa37e, 0x02956a66, 0x01cc38a9, 0x039c34be, 0x020f9165, 0x0213b771, 0x00098c54}}}, + {X: Field{[10]uint32{0x01a9dccc, 0x030d676d, 0x03bd09cf, 0x00b47343, 0x02e3964b, 0x0116d649, 0x01509e3b, 0x01b4a741, 0x01443c94, 0x002ae04c}}, Y: Field{[10]uint32{0x00f5c5ac, 0x00db2a41, 0x01062063, 0x002cfd41, 0x0216b771, 0x031b184c, 0x005e5876, 0x01cebe83, 0x03150c12, 0x002baf7c}}}, + {X: Field{[10]uint32{0x01473ad3, 0x03a20f81, 0x021a20a3, 0x027ae8cc, 0x016b9456, 0x01f979bb, 0x0323e627, 0x00449c8d, 0x0391dd75, 0x0039cacd}}, Y: Field{[10]uint32{0x0328a3d8, 0x03d320a6, 0x0319fd4d, 0x02b220c2, 0x039c2091, 0x038e8a11, 0x03109ab5, 0x02aa83f4, 0x00742dbc, 0x0004c6cc}}}, + {X: Field{[10]uint32{0x023ded63, 0x00a10cb3, 0x00c74619, 0x01f15ad4, 0x02bb525d, 0x033141f6, 0x03df77af, 0x017940e3, 0x0296ecdd, 0x0032968c}}, Y: Field{[10]uint32{0x03c4ab9e, 0x0197f1bf, 0x0254b3f8, 0x0274af73, 0x005a1420, 0x00acd96f, 0x027258e4, 0x01deea40, 0x0394b7e1, 0x0022f6d9}}}, + {X: Field{[10]uint32{0x031a9222, 0x0069c038, 0x01819c88, 0x00569c9a, 0x02e7d2e8, 0x0300ec80, 0x01be59dc, 0x0233ff3b, 0x029f26ae, 0x003aa8ef}}, Y: Field{[10]uint32{0x0124ec1c, 0x03917065, 0x02acc735, 0x0059f35f, 0x0336ac28, 0x0077cb4e, 0x02f80265, 0x034d3183, 0x00d7a367, 0x0006d68b}}}, + {X: Field{[10]uint32{0x00e97728, 0x02c0f7ba, 0x02206582, 0x0399d21c, 0x0035a011, 0x019e4555, 0x022076d5, 0x03fdab85, 0x002d3ab4, 0x003aeea2}}, Y: Field{[10]uint32{0x01be16ac, 0x02f91d19, 0x010ed355, 0x0161ef7f, 0x018a004c, 0x027b6319, 0x02f2ac76, 0x034b3736, 0x02053d8d, 0x0025088a}}}, + {X: Field{[10]uint32{0x013aba86, 0x0248f20d, 0x01f446d8, 0x0345a3a3, 0x01ba88e0, 0x03688180, 0x03cb784e, 0x01774451, 0x03ea537a, 0x00328365}}, Y: Field{[10]uint32{0x028fba1f, 0x01f2a67d, 0x01b68016, 0x024a1d2d, 0x0196c978, 0x01124399, 0x02bb979a, 0x021bc623, 0x005889eb, 0x0021d2b2}}}, + {X: Field{[10]uint32{0x03b797e1, 0x0233ecfa, 0x01a24771, 0x002c3877, 0x0184a90a, 0x017f0671, 0x0398f98c, 0x01d151f9, 0x01653480, 0x0014778a}}, Y: Field{[10]uint32{0x03f7c54d, 0x03bfd600, 0x007bf87c, 0x012e6792, 0x03ace0ee, 0x03f37e69, 0x001952b0, 0x039ae557, 0x023aad04, 0x00204dd3}}}, + {X: Field{[10]uint32{0x01387509, 0x031bb230, 0x00df5151, 0x00d4d96e, 0x0287b521, 0x007523ed, 0x00e39bda, 0x01af8833, 0x011f0313, 0x0001a758}}, Y: Field{[10]uint32{0x0195bde0, 0x028b088c, 0x01fa7e9d, 0x02a9ac9c, 0x00fb84c0, 0x0170a5c8, 0x01127e1a, 0x01932b13, 0x0020563b, 0x001d78b6}}}, + {X: Field{[10]uint32{0x028aa135, 0x015f784e, 0x00a9cb2f, 0x03037914, 0x006fa4a4, 0x03737886, 0x02204561, 0x01983c8c, 0x00830558, 0x000c458c}}, Y: Field{[10]uint32{0x0346eae2, 0x0376fdbf, 0x03817539, 0x001f97ee, 0x0229e142, 0x038762dd, 0x008c636a, 0x005a20c0, 0x0096b134, 0x000975b5}}}, + {X: Field{[10]uint32{0x007ac334, 0x0335584b, 0x00274cc3, 0x00f61a13, 0x0111f462, 0x0342b66a, 0x002e5b44, 0x03353536, 0x02aaefa9, 0x002138d0}}, Y: Field{[10]uint32{0x0292a70e, 0x023d980a, 0x016540fb, 0x03ed42bb, 0x02f552af, 0x03f974bd, 0x00f0a324, 0x02665f21, 0x03ff260f, 0x003ee436}}}, + {X: Field{[10]uint32{0x03bf6562, 0x0199a499, 0x025bc64d, 0x02b2219e, 0x00fa812a, 0x03538ea8, 0x00468143, 0x02c45489, 0x0002969d, 0x00257bf1}}, Y: Field{[10]uint32{0x03371883, 0x0304d667, 0x034b3e82, 0x027f5dea, 0x02e4567d, 0x0114957e, 0x033f00d4, 0x0094b15b, 0x00316149, 0x000c56f3}}}, + {X: Field{[10]uint32{0x038d07fe, 0x01727a35, 0x01507e3d, 0x0126ed40, 0x0255b401, 0x0156ee6f, 0x0289993a, 0x027682f4, 0x023cf87e, 0x001488d8}}, Y: Field{[10]uint32{0x00613b56, 0x02023f2b, 0x03deffa5, 0x00876cf2, 0x000832e9, 0x0001dbe2, 0x01b1c16b, 0x03d0dc02, 0x0221dd2d, 0x001aff42}}}, + {X: Field{[10]uint32{0x00cb0a4f, 0x0132e5f0, 0x0255df5f, 0x00659ac2, 0x00ea180f, 0x0027845e, 0x0187ab31, 0x01c1f987, 0x01990a6b, 0x003c84b4}}, Y: Field{[10]uint32{0x00f7c84b, 0x01ac1a68, 0x0382412f, 0x008867b0, 0x037f5114, 0x0303a844, 0x03c31427, 0x02d93b91, 0x006c7edb, 0x000ca011}}}, + {X: Field{[10]uint32{0x01cfe8c9, 0x033d630c, 0x01b50835, 0x03888438, 0x02e1e19c, 0x000163e5, 0x014431b2, 0x01dbe085, 0x023ff25d, 0x001ad541}}, Y: Field{[10]uint32{0x0069f8bf, 0x002236a4, 0x031c6492, 0x028f75f8, 0x01558a82, 0x03d83ffb, 0x02997076, 0x001d891b, 0x01623645, 0x001509f7}}}, + {X: Field{[10]uint32{0x01b23045, 0x006755c2, 0x01e96472, 0x0106a0b8, 0x03c9388d, 0x039be2c9, 0x02e0c129, 0x0243004a, 0x01cfa096, 0x00094e79}}, Y: Field{[10]uint32{0x01021ac3, 0x0115eb76, 0x0224a77c, 0x02d28967, 0x0331d804, 0x01444cd1, 0x0393000e, 0x02937346, 0x03f61e26, 0x002532e0}}}, + {X: Field{[10]uint32{0x0247d51d, 0x03eb9502, 0x03fb6297, 0x007bc394, 0x03910642, 0x03ca30fd, 0x02ed31e8, 0x0070c1c6, 0x02d34aaf, 0x002aa6da}}, Y: Field{[10]uint32{0x03544c47, 0x02779de0, 0x03d3ed1c, 0x01fb2910, 0x0158cbd8, 0x002ad366, 0x034e7db1, 0x02b80262, 0x00e49fe4, 0x00370256}}}, + {X: Field{[10]uint32{0x013487ad, 0x014cbd80, 0x0262f780, 0x0397a728, 0x03e08964, 0x028fdac3, 0x02d6e635, 0x0093efd7, 0x0313aad2, 0x002a1428}}, Y: Field{[10]uint32{0x014ccbe7, 0x020cd8fb, 0x01a4c43b, 0x01c09bc5, 0x01d9a5e5, 0x03bbcd1e, 0x01708ca0, 0x015708ee, 0x02d54cbc, 0x001f91da}}}, + {X: Field{[10]uint32{0x03a09c1a, 0x02352b97, 0x0328c741, 0x00c991de, 0x025da441, 0x00638a74, 0x00889fab, 0x00325b41, 0x0033f4fd, 0x000c53fb}}, Y: Field{[10]uint32{0x03d25f42, 0x01ee53fa, 0x024a976b, 0x034c6a9a, 0x00d9b4b8, 0x0254d3f7, 0x01dd4f54, 0x03fede6d, 0x01130a98, 0x00028b25}}}, + {X: Field{[10]uint32{0x033d0963, 0x02be8d53, 0x01c85329, 0x02e33d4b, 0x03183998, 0x02bef73b, 0x01581ae1, 0x01f9e6b8, 0x03c89ec5, 0x001b9f70}}, Y: Field{[10]uint32{0x019f87d8, 0x01457e27, 0x00964a83, 0x00c3f32b, 0x038f0578, 0x01662ac6, 0x011e3a82, 0x023a7e59, 0x00056d5a, 0x001ad8da}}}, + {X: Field{[10]uint32{0x033337c5, 0x01f50015, 0x034ad955, 0x03016309, 0x0038b6cf, 0x03461071, 0x0097a507, 0x028b5481, 0x0293fc4b, 0x00165b7d}}, Y: Field{[10]uint32{0x037f4ff5, 0x00ff412c, 0x033c6bd0, 0x00cf5732, 0x0274b75c, 0x027b173f, 0x0171723e, 0x02c26ce8, 0x01e91c97, 0x0019827b}}}, + {X: Field{[10]uint32{0x00e8afb7, 0x03c28485, 0x034ee13c, 0x01665ef2, 0x00ee3ba2, 0x01ef50b5, 0x0150e8e7, 0x01e00161, 0x01d410de, 0x0008d7e3}}, Y: Field{[10]uint32{0x00fa6712, 0x038562db, 0x031bd189, 0x00ce092d, 0x0153b72c, 0x00429115, 0x00f8d595, 0x0384da00, 0x00cdb8e8, 0x002fdb83}}}, + {X: Field{[10]uint32{0x03db8b47, 0x027308c4, 0x0227904c, 0x01abbda4, 0x003f0390, 0x0203a07c, 0x01fbb28c, 0x03a47c49, 0x0297b259, 0x002a762e}}, Y: Field{[10]uint32{0x00048656, 0x01d52b3b, 0x0337bf14, 0x03d916e9, 0x015e6ce6, 0x0087d625, 0x0072afe2, 0x0203c99d, 0x015419b5, 0x00399a2e}}}, + {X: Field{[10]uint32{0x02288e5c, 0x02c1fa12, 0x027f4827, 0x00d6df66, 0x00c4e2cc, 0x004d26e2, 0x02bc6295, 0x0305c050, 0x01c64f74, 0x0014ed13}}, Y: Field{[10]uint32{0x017075d4, 0x01b855c2, 0x02c7e589, 0x021f6325, 0x02322161, 0x03fb9ed6, 0x03006ead, 0x018b1363, 0x03e14045, 0x0012bfc4}}}, + {X: Field{[10]uint32{0x000af1a0, 0x02d68096, 0x0362f947, 0x01e4121b, 0x02a91872, 0x0125121a, 0x00b56ca1, 0x03e7dc6b, 0x0038a6ba, 0x001db9b8}}, Y: Field{[10]uint32{0x01f0f0fa, 0x039ad378, 0x03fd4465, 0x035c899b, 0x003b57e0, 0x03811644, 0x0018348b, 0x0101d913, 0x01106688, 0x00146974}}}, + {X: Field{[10]uint32{0x03c1e6b5, 0x03d4efe6, 0x038702bc, 0x031c6fb1, 0x001c45b4, 0x037a192f, 0x02da284d, 0x0004a443, 0x03192fc7, 0x001dd87f}}, Y: Field{[10]uint32{0x016e11b2, 0x01f6b10a, 0x007c1d94, 0x032ec6ad, 0x03e0bb75, 0x030f9f4d, 0x037e1fdf, 0x01c65987, 0x0370a82f, 0x00202603}}}, + {X: Field{[10]uint32{0x009aadf9, 0x034a012a, 0x02d7f8fe, 0x02388434, 0x0095c0bd, 0x021a7618, 0x01cdc333, 0x03d47f9b, 0x01d61224, 0x00206672}}, Y: Field{[10]uint32{0x031ec89b, 0x038c15d2, 0x0292ddaa, 0x01f4aa74, 0x00a158ee, 0x000c371d, 0x01bbd73f, 0x008e12ba, 0x024f5cbd, 0x002fa25c}}}, + {X: Field{[10]uint32{0x01c55c0e, 0x009d0164, 0x033b799d, 0x032f9422, 0x0008bd4d, 0x02f5de76, 0x01626803, 0x00955aef, 0x01fc760a, 0x0005709e}}, Y: Field{[10]uint32{0x03390c39, 0x00f934d4, 0x01dee337, 0x02c19c85, 0x010ea0b9, 0x0328103f, 0x015d352b, 0x03258d24, 0x00bfed80, 0x003f540e}}}, + {X: Field{[10]uint32{0x00a39b46, 0x0045857e, 0x031a83c1, 0x03900520, 0x019724ac, 0x0330b9fb, 0x03b46a3e, 0x01011dbd, 0x0106b280, 0x003ecfe3}}, Y: Field{[10]uint32{0x03d2154e, 0x03ecf3da, 0x011854fb, 0x0142b264, 0x023177ed, 0x00f06f5c, 0x03fd70c6, 0x006d84ec, 0x00b6ff85, 0x003e4943}}}, + {X: Field{[10]uint32{0x02012edb, 0x03269bae, 0x0389b5ea, 0x00576c2c, 0x02f9faf4, 0x025f0ff7, 0x02723e30, 0x01049768, 0x01473c96, 0x000e6cad}}, Y: Field{[10]uint32{0x03fb7547, 0x0220bc86, 0x01564002, 0x02b8377e, 0x016bce7b, 0x03d97c8c, 0x028aedf1, 0x03d04ef5, 0x02a5a586, 0x0022b070}}}, + {X: Field{[10]uint32{0x03f1552b, 0x03fd1291, 0x0284820c, 0x00fab21f, 0x01bf72d7, 0x02c93a33, 0x03f6d0bb, 0x00546874, 0x03fae476, 0x0010b577}}, Y: Field{[10]uint32{0x00847ee4, 0x03eb6d2e, 0x02ee2922, 0x01185f61, 0x02663f6e, 0x0100ef3d, 0x03ebe3af, 0x03000589, 0x0245d941, 0x0018c765}}}, + {X: Field{[10]uint32{0x02e0bd8f, 0x007edeb9, 0x02158e31, 0x0349b671, 0x02630a0b, 0x03a48b66, 0x02dd0711, 0x02afc297, 0x02c624ec, 0x00213725}}, Y: Field{[10]uint32{0x038703c6, 0x023ab8fb, 0x025a82cc, 0x01c4302a, 0x01c795cc, 0x02f4bf09, 0x00ff10a8, 0x00c934ab, 0x018a16b7, 0x00102bcc}}}, + {X: Field{[10]uint32{0x03bf505e, 0x01ce60d2, 0x013bf018, 0x000b0db6, 0x034663ba, 0x01efdf2e, 0x03812af3, 0x033bb846, 0x020a797b, 0x0018db9d}}, Y: Field{[10]uint32{0x01f724d2, 0x03dc0e99, 0x012ffd74, 0x010015f6, 0x0069924f, 0x0012e516, 0x02dab981, 0x033dd90d, 0x024b6cc8, 0x003b5717}}}, + {X: Field{[10]uint32{0x00d06ae4, 0x03dd6026, 0x01090d4f, 0x003fd85d, 0x007d32bc, 0x0389e019, 0x01ca6f4a, 0x03b9e19a, 0x00254bb5, 0x0004dff4}}, Y: Field{[10]uint32{0x028d0fd4, 0x02dfc24c, 0x00bc808f, 0x00f7a739, 0x03e07ec2, 0x00dba4b9, 0x03186a30, 0x02aa83a6, 0x02a225ea, 0x000a0b5a}}}, + {X: Field{[10]uint32{0x02459e92, 0x01cd3484, 0x00b611b6, 0x01805eaf, 0x00df781f, 0x02c943f0, 0x01bc7a5c, 0x02495ad5, 0x004839e4, 0x000862ae}}, Y: Field{[10]uint32{0x010e1599, 0x012cf393, 0x02444c99, 0x03f1c072, 0x001a7212, 0x00cbce7c, 0x00c49c8d, 0x02c3710c, 0x0356b53f, 0x001fac53}}}, + {X: Field{[10]uint32{0x038eda65, 0x00552557, 0x034fb619, 0x0267aed3, 0x011b2f0a, 0x03c4dd81, 0x029e3a78, 0x008be37d, 0x03a0106f, 0x001acfde}}, Y: Field{[10]uint32{0x0330d299, 0x03ededc8, 0x013b7aaa, 0x000174db, 0x036c8310, 0x0207a21c, 0x019a4ab4, 0x01afbe1b, 0x00c44c94, 0x000315e2}}}, + {X: Field{[10]uint32{0x01e8ceca, 0x038c7f76, 0x03d08c5d, 0x032bdffb, 0x02131ad1, 0x00bad6e1, 0x02fdf196, 0x00465465, 0x02cba2de, 0x0026d053}}, Y: Field{[10]uint32{0x0325a637, 0x024897a9, 0x00797063, 0x0216579d, 0x0251e94e, 0x036a7d39, 0x01b06269, 0x037d0203, 0x031f9550, 0x000e39bc}}}, + {X: Field{[10]uint32{0x02940653, 0x03d986c9, 0x01f8ecba, 0x023bcfcb, 0x02156a4a, 0x00751135, 0x0133af0d, 0x0097861a, 0x03a18574, 0x0010dac1}}, Y: Field{[10]uint32{0x003f2d44, 0x0156cc51, 0x0053ace1, 0x0346f393, 0x03c6822d, 0x0093f318, 0x02427137, 0x03af7b29, 0x0335f124, 0x0025294b}}}, + {X: Field{[10]uint32{0x028fbc6b, 0x00cb3544, 0x034d1fff, 0x00a08266, 0x00b8d76f, 0x01ed78a4, 0x0019bd18, 0x017e08cd, 0x033809b2, 0x003302a4}}, Y: Field{[10]uint32{0x023f458e, 0x02ffa1db, 0x029ec220, 0x01e90c3b, 0x00e713ad, 0x01d54038, 0x00cb6278, 0x031ea512, 0x006dec7a, 0x000331fa}}}, + {X: Field{[10]uint32{0x03a19858, 0x007fa0f0, 0x038888f2, 0x03a9cbef, 0x037ea684, 0x02be372a, 0x03b1907e, 0x01debf31, 0x016eaaf8, 0x001686cc}}, Y: Field{[10]uint32{0x0181e7e1, 0x010933b3, 0x00450cf7, 0x02508b6f, 0x02744110, 0x029a504b, 0x02b3466d, 0x0211a9ad, 0x039ada08, 0x0012bc0c}}}, + {X: Field{[10]uint32{0x016c53ee, 0x01f5025b, 0x0327400e, 0x0094be7f, 0x01ac4a57, 0x000e62c9, 0x021e4114, 0x012ec87f, 0x01657444, 0x003ebe24}}, Y: Field{[10]uint32{0x01a43100, 0x0053db26, 0x03cb3997, 0x02b20420, 0x01d87984, 0x02c5b271, 0x00b64263, 0x0151fd77, 0x015faf75, 0x0033e9de}}}, + {X: Field{[10]uint32{0x0174f248, 0x03937ab4, 0x01e33aa9, 0x00b52586, 0x00c94cd2, 0x031b2c0a, 0x000c68c6, 0x00588c61, 0x018aca14, 0x000e797f}}, Y: Field{[10]uint32{0x003c1ff1, 0x00429be3, 0x0210561d, 0x02194a2a, 0x020a8d36, 0x023d989d, 0x0013e788, 0x036995d0, 0x03657083, 0x003e0487}}}, + {X: Field{[10]uint32{0x0325cbc1, 0x010c2600, 0x000e9257, 0x0350866f, 0x02a64b8e, 0x03ef84d5, 0x013cddf6, 0x0033cb33, 0x01ec147d, 0x0008284d}}, Y: Field{[10]uint32{0x0282c013, 0x008ab9bb, 0x006a7156, 0x002a047c, 0x01fa1d17, 0x01d74c2a, 0x0101fd26, 0x00dc9530, 0x00abea1a, 0x002c5d45}}}, + {X: Field{[10]uint32{0x0072320a, 0x0070ad0b, 0x011fab46, 0x00462a21, 0x039903ca, 0x031d6c4e, 0x03d69e2a, 0x03dcfe84, 0x01b8af48, 0x00286068}}, Y: Field{[10]uint32{0x03a6df20, 0x03212ca5, 0x02a5a219, 0x00e8310e, 0x00a66fbd, 0x035621e8, 0x032c432a, 0x01f988f5, 0x00673f48, 0x00325b21}}}, + {X: Field{[10]uint32{0x01b3ee4f, 0x0118b1df, 0x03fc2752, 0x02557ae1, 0x01eb4626, 0x0145b7a3, 0x035d76a9, 0x01768beb, 0x0031720a, 0x000e57f0}}, Y: Field{[10]uint32{0x0359ad6a, 0x022fd071, 0x00523128, 0x01a66cd0, 0x00962ac8, 0x00fb1127, 0x00e14e7c, 0x00e256ad, 0x006b5378, 0x0012baf2}}}, + {X: Field{[10]uint32{0x0364fa6f, 0x01accf46, 0x03d17424, 0x0395c6e7, 0x0103fffc, 0x02ed8cdf, 0x01632a61, 0x00ae5a1f, 0x01ecf6df, 0x0028db7a}}, Y: Field{[10]uint32{0x011999f4, 0x03721899, 0x01ea9cdb, 0x027f43c1, 0x01620fe2, 0x01f7ad03, 0x0212e147, 0x0345006c, 0x004fa133, 0x001e1393}}}, + {X: Field{[10]uint32{0x0040ba8c, 0x01d1b8a6, 0x00359d04, 0x02e0f6f7, 0x03e55a3a, 0x0114d7d5, 0x03818200, 0x0110c3dc, 0x0099ecee, 0x00232d6a}}, Y: Field{[10]uint32{0x017ff59a, 0x03697780, 0x00b2cb92, 0x02c7bc0b, 0x01731ded, 0x00f4a2d3, 0x01df0ecc, 0x028f04b0, 0x002ae9c3, 0x0004a9ca}}}, + {X: Field{[10]uint32{0x00b60985, 0x0142d998, 0x01f299c4, 0x0362c9ac, 0x004cee72, 0x00bf47ef, 0x02372012, 0x026e8643, 0x01e14d9c, 0x00037910}}, Y: Field{[10]uint32{0x0271b63e, 0x03884500, 0x02110508, 0x0319d40c, 0x022927b3, 0x009fefad, 0x03740d44, 0x0374cf53, 0x030ed12d, 0x002b7468}}}, + {X: Field{[10]uint32{0x039fbab7, 0x02081ea6, 0x01067407, 0x030e5ca5, 0x00520646, 0x004a3446, 0x02f3c1b7, 0x0151283c, 0x0356b5e5, 0x002238e2}}, Y: Field{[10]uint32{0x0000e5e3, 0x00763984, 0x034b7810, 0x00828b63, 0x00dc8ea0, 0x02f6bc61, 0x03ac529c, 0x02595b96, 0x008ed44e, 0x00220cc8}}}, + {X: Field{[10]uint32{0x034640a7, 0x03ccdd03, 0x0266c6c5, 0x032583d4, 0x013ee217, 0x0234b5ca, 0x03fa3d15, 0x019082e7, 0x0192f561, 0x00293c3e}}, Y: Field{[10]uint32{0x002e6ddb, 0x0038807e, 0x01e713d8, 0x023a04a2, 0x010b131a, 0x006bd0bf, 0x02c9188a, 0x021af103, 0x01a8437a, 0x003699d0}}}, + {X: Field{[10]uint32{0x005c945b, 0x014901c7, 0x02ad7efe, 0x02fcdfe5, 0x0286899f, 0x01147634, 0x00a40bee, 0x02aab981, 0x00cff2d1, 0x0017c02a}}, Y: Field{[10]uint32{0x019deb12, 0x02d8f4ad, 0x0262a424, 0x034eb9b1, 0x030b48ea, 0x011a4b56, 0x011549fb, 0x01b5b8e7, 0x00b69ea7, 0x0004d7f2}}}, + {X: Field{[10]uint32{0x00f99218, 0x01b38c62, 0x00da0b41, 0x019ea79b, 0x039d1689, 0x00e376e3, 0x004c7998, 0x03f28bb8, 0x020ebfd6, 0x00164d46}}, Y: Field{[10]uint32{0x010fdb34, 0x00f53a75, 0x025b64fe, 0x0275ce91, 0x000fc415, 0x00a479f2, 0x0227b6d4, 0x03d2a0a3, 0x02673184, 0x001b8068}}}, + {X: Field{[10]uint32{0x00b1aecf, 0x025be44b, 0x039f72c7, 0x01cf9dfc, 0x006705ef, 0x03c98f43, 0x007387a5, 0x00cecf7a, 0x0235f5c5, 0x00005d7b}}, Y: Field{[10]uint32{0x01d9513f, 0x0340a02e, 0x03506a80, 0x018cf35e, 0x005fca3b, 0x0317ef58, 0x00d40fc4, 0x03909878, 0x03154540, 0x0028de49}}}, + {X: Field{[10]uint32{0x0347b8fe, 0x01f7eefc, 0x033b0204, 0x0077eb40, 0x00565595, 0x01e416b5, 0x036362fa, 0x0062b26a, 0x0341597b, 0x001d4626}}, Y: Field{[10]uint32{0x01b2527e, 0x01deddc8, 0x03ed5b01, 0x010a116b, 0x01aa2468, 0x015a967b, 0x00023de2, 0x0043a95f, 0x01210ffa, 0x003d4dbf}}}, + {X: Field{[10]uint32{0x019bd4ae, 0x02690528, 0x01c72004, 0x01cdad68, 0x02438855, 0x01fbf48e, 0x03d2a315, 0x035971c2, 0x02c32522, 0x00246be7}}, Y: Field{[10]uint32{0x001a32de, 0x01aec21d, 0x02d6e643, 0x00668b29, 0x0331c9cc, 0x002d1066, 0x004898ed, 0x02e161ad, 0x03c38462, 0x000c4801}}}, + {X: Field{[10]uint32{0x00565c27, 0x02876129, 0x01b04712, 0x02906853, 0x00732273, 0x03ca0f17, 0x01094432, 0x03574174, 0x008d41fa, 0x00376cbf}}, Y: Field{[10]uint32{0x029c1d0a, 0x02e8beb5, 0x01a38d63, 0x02db5fcb, 0x028f6ac9, 0x0224f424, 0x01673a09, 0x031bd080, 0x00c502ce, 0x0013df8c}}}, + {X: Field{[10]uint32{0x023641a6, 0x037077fd, 0x00f96f7d, 0x001fcac1, 0x01ad40a9, 0x0290494e, 0x0144936e, 0x00370d40, 0x0122d724, 0x00273997}}, Y: Field{[10]uint32{0x01d97c8c, 0x009d825e, 0x02340cf9, 0x010e0150, 0x00c3037e, 0x01818bd5, 0x020b4257, 0x02f19091, 0x01877f25, 0x002be4f9}}}, + {X: Field{[10]uint32{0x036e9a2b, 0x01b5dbdd, 0x015f5493, 0x02c079fe, 0x015489f1, 0x002fd24b, 0x003932eb, 0x03b16247, 0x00d41fed, 0x001f7034}}, Y: Field{[10]uint32{0x0107c47a, 0x01a6656c, 0x0134fa52, 0x03d694d6, 0x001e9bbc, 0x00e0c685, 0x021c7a49, 0x00f04efe, 0x039e760c, 0x00355689}}}, + {X: Field{[10]uint32{0x000e5ead, 0x000ea553, 0x008c163d, 0x003cca07, 0x02f190d4, 0x00f92a9f, 0x018d351f, 0x035ca277, 0x015cb6b4, 0x00034048}}, Y: Field{[10]uint32{0x00fdc662, 0x00b2206c, 0x02a2548b, 0x0318267b, 0x01c68be6, 0x01906153, 0x03ce7fe0, 0x01fbb9c8, 0x004bccbd, 0x003be60d}}}, + {X: Field{[10]uint32{0x017cb92f, 0x0019d9e3, 0x02af3e1d, 0x0318a4cf, 0x00bb6498, 0x02f7fcf5, 0x011b0d29, 0x03be3d66, 0x0031a9fa, 0x00035347}}, Y: Field{[10]uint32{0x026a4831, 0x017e18ab, 0x0190a4df, 0x036e93d9, 0x02715fae, 0x00861791, 0x03ccd42f, 0x0247ea16, 0x0048ac6b, 0x00263cea}}}, + {X: Field{[10]uint32{0x02080839, 0x034bc931, 0x035a49fa, 0x00310686, 0x023d718f, 0x0212c78c, 0x022d83c0, 0x03c930f6, 0x02cf42ab, 0x00331967}}, Y: Field{[10]uint32{0x001f963c, 0x009d86b2, 0x00cbbf0f, 0x0250fe13, 0x00c7aef0, 0x039e55d6, 0x02df249a, 0x00ce66db, 0x01554d84, 0x001eef7f}}}, + {X: Field{[10]uint32{0x01ea4b04, 0x0345905c, 0x0104e594, 0x01d59c23, 0x00f0eb47, 0x01e2fbcd, 0x0074e944, 0x03ce1674, 0x0167d5cf, 0x00066e85}}, Y: Field{[10]uint32{0x02820f9a, 0x014d2152, 0x00ed5d4f, 0x024722e4, 0x0030555c, 0x03967044, 0x00583114, 0x02c0bb6a, 0x001bd536, 0x000d3a8a}}}, + {X: Field{[10]uint32{0x03bbc30f, 0x01e63d75, 0x006a5437, 0x039d4a56, 0x02e825d8, 0x0354b4b6, 0x01960e5f, 0x01641d8c, 0x02e31a6e, 0x000fc3c0}}, Y: Field{[10]uint32{0x03e63c3b, 0x00241878, 0x0119a035, 0x00a5ed01, 0x0162a3bf, 0x038b35a9, 0x0079ddcb, 0x03536964, 0x03c33aec, 0x002e4f89}}}, + {X: Field{[10]uint32{0x0149ab12, 0x001e4900, 0x0323e0df, 0x025b97ea, 0x008d0fb0, 0x003ce0ad, 0x01dd895b, 0x00ff656a, 0x008f35f6, 0x00262131}}, Y: Field{[10]uint32{0x0180eb44, 0x00907ed0, 0x02aa013f, 0x017a627f, 0x03e01154, 0x022dbd06, 0x01e321f5, 0x010df0f5, 0x02667070, 0x0015a230}}}, + {X: Field{[10]uint32{0x006c7b4d, 0x026edf31, 0x00b47448, 0x0380ac8f, 0x02bb4a6f, 0x00be0f96, 0x002e85ac, 0x027154c2, 0x029379bc, 0x002503ca}}, Y: Field{[10]uint32{0x0321fd9d, 0x03038b1f, 0x02284700, 0x0274b2b8, 0x002aa742, 0x02f1a9e1, 0x027c735c, 0x02763d47, 0x038077ba, 0x002d2e08}}}, + {X: Field{[10]uint32{0x00b782f0, 0x01d0bad6, 0x0001c0e0, 0x000d0be4, 0x005f4beb, 0x014d0fa9, 0x02feccbb, 0x00f67d06, 0x019ce535, 0x002a69da}}, Y: Field{[10]uint32{0x0187c994, 0x02a565e5, 0x018b4c7c, 0x02f17ed2, 0x01b0536f, 0x029806b2, 0x0341f778, 0x0233c690, 0x02aab3e1, 0x000f1d67}}}, + {X: Field{[10]uint32{0x03218913, 0x008898c2, 0x034afb15, 0x00748fc9, 0x0293f4da, 0x00b4044a, 0x0236cc28, 0x036c015b, 0x008a009c, 0x0028878d}}, Y: Field{[10]uint32{0x02be89ed, 0x0307d31f, 0x038da588, 0x01cec79d, 0x03c70b18, 0x01c07998, 0x00b8e28a, 0x025419bb, 0x03fa652f, 0x00050550}}}, + {X: Field{[10]uint32{0x025fd383, 0x0123ecd6, 0x01ca41f0, 0x0018c1a9, 0x00e81429, 0x006339ce, 0x03298d60, 0x0384614a, 0x01951121, 0x0035b553}}, Y: Field{[10]uint32{0x028a7a83, 0x014d1160, 0x02912412, 0x03cd4d68, 0x028f76c8, 0x02363bb4, 0x00fe9d03, 0x007f88c1, 0x00b8de89, 0x00225f73}}}, + {X: Field{[10]uint32{0x031e6cda, 0x0303c770, 0x03ebe21c, 0x01928e91, 0x026232b4, 0x03bec4be, 0x00c7f7b5, 0x03abed22, 0x035dc937, 0x001f8298}}, Y: Field{[10]uint32{0x01e921e2, 0x00eb18e3, 0x01e822d6, 0x021b3b58, 0x0274489c, 0x02b72fcd, 0x025b34e3, 0x017874b3, 0x014a7552, 0x00034b47}}}, + {X: Field{[10]uint32{0x0051a659, 0x02802e35, 0x000d3afe, 0x0053eb08, 0x0155bafa, 0x01acfeba, 0x00870e83, 0x0071a10a, 0x000f66a2, 0x00133882}}, Y: Field{[10]uint32{0x007da4c4, 0x03c157db, 0x01b1d891, 0x0249cf8c, 0x02f0ca1b, 0x0037e4eb, 0x00d0f3ef, 0x000bf4c6, 0x0226565b, 0x000a787e}}}, + {X: Field{[10]uint32{0x012bad2e, 0x007d509c, 0x00f7fc09, 0x02d363d6, 0x01e6d4b7, 0x02e27a05, 0x00d5caf1, 0x02fd9567, 0x0387b633, 0x0036ae1a}}, Y: Field{[10]uint32{0x03c85b5e, 0x0057acd4, 0x03bdf8fd, 0x00d1f95e, 0x004506a6, 0x0156f64c, 0x00159d7f, 0x0157ce36, 0x0109d79a, 0x0023926c}}}, + {X: Field{[10]uint32{0x0365aca9, 0x00a4006c, 0x017a56ae, 0x012854a2, 0x01ba1622, 0x01d9cb4e, 0x035386ea, 0x00cb93a2, 0x02c290fa, 0x0031a852}}, Y: Field{[10]uint32{0x035dbc67, 0x003ab1dc, 0x00164b2c, 0x00b7e896, 0x0245cd5f, 0x00bfd857, 0x021967a4, 0x0223f890, 0x00d6dcc5, 0x0010aab7}}}, + {X: Field{[10]uint32{0x02450a27, 0x0138853a, 0x0041de69, 0x02b32284, 0x0263510b, 0x03cd163d, 0x03244004, 0x00423ca3, 0x0240880b, 0x0009667e}}, Y: Field{[10]uint32{0x03a57a01, 0x0365321e, 0x013e6951, 0x01b95230, 0x02a424c4, 0x0280aff4, 0x03a973a1, 0x0337d1a9, 0x02ad4ae1, 0x000151e4}}}, + {X: Field{[10]uint32{0x02d9f9ff, 0x035d1da3, 0x0153bbf3, 0x00cdbe91, 0x01312655, 0x01e7b10f, 0x02d8fe9e, 0x02a3deab, 0x00b4a6af, 0x003daac3}}, Y: Field{[10]uint32{0x005026ef, 0x0365d1a1, 0x013f973f, 0x02f15ebc, 0x0282e913, 0x0241ff35, 0x001a4761, 0x00024123, 0x0189c4ba, 0x0013a849}}}, + {X: Field{[10]uint32{0x007f1dfc, 0x03522c9c, 0x01bebdfd, 0x03caf1c7, 0x0372738f, 0x00ffd369, 0x017ecdbd, 0x000838b6, 0x008bab8f, 0x003d46f5}}, Y: Field{[10]uint32{0x02697c40, 0x024fcfd2, 0x01e4308c, 0x0148922f, 0x01b361c7, 0x01fbe43e, 0x03fe7bce, 0x011fea29, 0x03a0947f, 0x001ac5a2}}}, + {X: Field{[10]uint32{0x022a3443, 0x0263c292, 0x013625c8, 0x02194d48, 0x020a50b2, 0x0342fdf4, 0x0398f2b1, 0x02a432bd, 0x01146c9c, 0x002d807c}}, Y: Field{[10]uint32{0x021f87dd, 0x03c8e471, 0x027edf0c, 0x0343f305, 0x006877fe, 0x027c3c44, 0x0317a115, 0x02d9d57c, 0x004136b6, 0x0029b28c}}}, + {X: Field{[10]uint32{0x005f974b, 0x0241947e, 0x01ccb37e, 0x0163ca1c, 0x015be6a1, 0x0316dc64, 0x030511f0, 0x01f011db, 0x027ae595, 0x001e4b75}}, Y: Field{[10]uint32{0x031dd44b, 0x01d60252, 0x03bcb941, 0x017212b0, 0x011a4c1c, 0x00bd18f8, 0x004774dd, 0x027da4e9, 0x00b9bec5, 0x0026dfd7}}}, + {X: Field{[10]uint32{0x03b093f9, 0x0004c0a2, 0x00377931, 0x0080cf0d, 0x004c29c4, 0x0009452b, 0x0300eb4f, 0x03d2b6cd, 0x026933b6, 0x001f6211}}, Y: Field{[10]uint32{0x01e2cb3b, 0x025187ed, 0x00885a2f, 0x03e2944d, 0x022ebeb5, 0x0391b0c1, 0x007ead35, 0x00036d4a, 0x035e6745, 0x000bf230}}}, + {X: Field{[10]uint32{0x012a5351, 0x03b6e01a, 0x00249010, 0x01077e0b, 0x01ead4bc, 0x01c2250d, 0x03820387, 0x02182c86, 0x03916d0f, 0x00271dba}}, Y: Field{[10]uint32{0x01c88b62, 0x0260a43d, 0x006b0d99, 0x03835b78, 0x030e51d1, 0x0231dda7, 0x0235a6da, 0x00055878, 0x03f33880, 0x001caeb6}}}, + {X: Field{[10]uint32{0x03d807f9, 0x02ec3cc7, 0x0024ecf5, 0x0360b6bf, 0x038fef18, 0x00791f0c, 0x0252a2aa, 0x024f8557, 0x02383d8a, 0x002926d5}}, Y: Field{[10]uint32{0x001d3ae0, 0x0163a364, 0x0176dbee, 0x03987f3a, 0x029dc392, 0x0324d191, 0x00b0760b, 0x013133b9, 0x01b39bf3, 0x0006f09c}}}, + {X: Field{[10]uint32{0x00634460, 0x01891f37, 0x029e0a4d, 0x03f9deba, 0x02a704c9, 0x023c71cb, 0x01d5cc96, 0x02c2c32a, 0x035a675b, 0x000134c4}}, Y: Field{[10]uint32{0x000cfc4e, 0x029dbb8a, 0x02d38395, 0x03bda333, 0x02cb74bc, 0x03c0ac4e, 0x031ffeac, 0x03d2f3cb, 0x00be72f5, 0x002b975f}}}, + {X: Field{[10]uint32{0x0253f588, 0x00cc2267, 0x00e3711f, 0x020ea481, 0x00eff955, 0x010bc64b, 0x00421b9b, 0x01b8e3f0, 0x03be17dd, 0x001655cb}}, Y: Field{[10]uint32{0x021c7c24, 0x01150877, 0x0382a39c, 0x00be6dc9, 0x03a01c8f, 0x03582811, 0x01ab8051, 0x00fe79a8, 0x0240a8cb, 0x0015c4d1}}}, + {X: Field{[10]uint32{0x012d9511, 0x03a8799c, 0x005a5cb5, 0x00203d58, 0x020a5fff, 0x00a34ba6, 0x02a1c612, 0x01e03b2a, 0x006d49b4, 0x001cf333}}, Y: Field{[10]uint32{0x03752cf4, 0x00b353f8, 0x0308edbb, 0x01b5aa16, 0x036a52c0, 0x026c5634, 0x012ea8b5, 0x0323c470, 0x0174f986, 0x00118ea3}}}, + {X: Field{[10]uint32{0x004c1e46, 0x00f0a8e3, 0x03d1ee50, 0x03c61da0, 0x02ae3885, 0x023f73db, 0x02f7280e, 0x002aa51d, 0x03fddb62, 0x002db23a}}, Y: Field{[10]uint32{0x03d39802, 0x02441839, 0x01ddeb40, 0x0157cc85, 0x0276a25d, 0x02065297, 0x0175c2ac, 0x000122f9, 0x02d9f021, 0x00269beb}}}, + {X: Field{[10]uint32{0x005e392e, 0x01ff2713, 0x01f7eb50, 0x02353087, 0x03b9cc4a, 0x00c19f78, 0x0196c539, 0x01524f6a, 0x020f92de, 0x002d058b}}, Y: Field{[10]uint32{0x023b385b, 0x0149585a, 0x01120a40, 0x005dee3b, 0x02eecf22, 0x00183660, 0x03978733, 0x0074d918, 0x00d0c921, 0x00333384}}}, + {X: Field{[10]uint32{0x012b33a2, 0x011a75e3, 0x019b7a2a, 0x02359513, 0x00a58100, 0x0282e350, 0x02919552, 0x00d75eaf, 0x0166ca42, 0x0011afc9}}, Y: Field{[10]uint32{0x02785040, 0x01f21ff1, 0x01ef10b7, 0x03c0085c, 0x01285b5c, 0x0342f275, 0x0182e39c, 0x0221064b, 0x016bb827, 0x001bd9bf}}}, + {X: Field{[10]uint32{0x0159ab2f, 0x02a4538f, 0x036b7419, 0x01a0aa7b, 0x01b5422a, 0x022704d7, 0x02dfcd1b, 0x02a73e2e, 0x01a4e869, 0x001e111b}}, Y: Field{[10]uint32{0x028c9ce3, 0x00ad6196, 0x0098327d, 0x02fcb50a, 0x023f5f31, 0x00cefaf7, 0x003c051f, 0x011b0678, 0x0131db7e, 0x0010856c}}}, + {X: Field{[10]uint32{0x0205f3b7, 0x02fc0055, 0x01d1f4be, 0x032972f4, 0x03fa2b01, 0x017ae3b6, 0x03dc7629, 0x0203350a, 0x02055110, 0x0021a21a}}, Y: Field{[10]uint32{0x03914466, 0x001f9dfd, 0x037d7675, 0x03b565e9, 0x00f9b753, 0x00eb7501, 0x038854a8, 0x030371c1, 0x01f35579, 0x0031c6da}}}, + {X: Field{[10]uint32{0x03713388, 0x03652f20, 0x03371e16, 0x03f2ca29, 0x0036d5fa, 0x011101b8, 0x038675a7, 0x03f10ff4, 0x035e37f8, 0x00280b99}}, Y: Field{[10]uint32{0x0041239e, 0x005cf7bf, 0x01c36de3, 0x03568626, 0x004ee66b, 0x01dfa7ab, 0x02162512, 0x020353ab, 0x0141835c, 0x0035be69}}}, + {X: Field{[10]uint32{0x0092bf26, 0x03322261, 0x03f14ea4, 0x01dfb8a1, 0x009b2997, 0x025ef013, 0x01100966, 0x01b3b734, 0x02a8432c, 0x00285ada}}, Y: Field{[10]uint32{0x020db298, 0x035c9053, 0x01aced2f, 0x028627bc, 0x021e734d, 0x03a9f853, 0x00ed6446, 0x010ab034, 0x0270ef9e, 0x00017046}}}, + {X: Field{[10]uint32{0x00f45b5a, 0x0052e638, 0x01c5c971, 0x00afe1a1, 0x0212d7fc, 0x01ee07f2, 0x03a1205f, 0x03979742, 0x02fe775f, 0x0019a8fc}}, Y: Field{[10]uint32{0x025e3eaf, 0x008c1417, 0x001c8c18, 0x038a57b4, 0x0100e626, 0x002d3ac8, 0x00daad03, 0x03527554, 0x0114a49a, 0x0014166f}}}, + {X: Field{[10]uint32{0x0314b3a1, 0x004de114, 0x01785962, 0x0183aa15, 0x02a1f094, 0x0184542e, 0x01c63210, 0x001319d5, 0x03cebf9a, 0x002691e8}}, Y: Field{[10]uint32{0x0040a80a, 0x03bf03bb, 0x02acbc6c, 0x03c8ae57, 0x03efd3a3, 0x024a5a49, 0x03c7045b, 0x01f9abcd, 0x02ce8f38, 0x0008b697}}}, + {X: Field{[10]uint32{0x036628c5, 0x03d89cd6, 0x02c6f97a, 0x014d27e6, 0x0312b25a, 0x03c63ea1, 0x00e3c288, 0x02e6878f, 0x00149027, 0x00070050}}, Y: Field{[10]uint32{0x02448a4f, 0x015b2583, 0x03d353a4, 0x00d15d4e, 0x0087b499, 0x00583e5e, 0x00bc34ff, 0x034f5ade, 0x00fcd048, 0x0019c864}}}, + {X: Field{[10]uint32{0x028d84cc, 0x03bff94b, 0x0231d057, 0x0002793a, 0x018d1374, 0x025f81d9, 0x00965cd4, 0x03a1d96b, 0x030a1de5, 0x0030b659}}, Y: Field{[10]uint32{0x013ccdf1, 0x029c9c7c, 0x02379cc7, 0x02303e14, 0x00b97a2e, 0x00a55b42, 0x0356b585, 0x03eec4ea, 0x0247a6dd, 0x003fe061}}}, + {X: Field{[10]uint32{0x0196ec1d, 0x006c7972, 0x026910e0, 0x03954e5a, 0x03d21339, 0x005075a3, 0x00e094c4, 0x01a9a5c3, 0x004716fd, 0x0006a7fb}}, Y: Field{[10]uint32{0x03f8557e, 0x001b62e4, 0x0140c240, 0x00e047d7, 0x01d29b87, 0x025778a4, 0x037639b5, 0x01cffa53, 0x02eb6c83, 0x0038e3ac}}}, + {X: Field{[10]uint32{0x01d8c464, 0x015abec0, 0x03bae778, 0x019a6358, 0x0053a514, 0x02c6ac9b, 0x029e5006, 0x0069b503, 0x02ed15e9, 0x002df7d4}}, Y: Field{[10]uint32{0x02e21254, 0x03b14c2d, 0x01ac1162, 0x0034297f, 0x01705c36, 0x03c60354, 0x010706ff, 0x03f63e67, 0x01bfd915, 0x003a983c}}}, + {X: Field{[10]uint32{0x03db6b5f, 0x03e65675, 0x039d1295, 0x03e21222, 0x00918ba7, 0x000d4cd4, 0x0086a534, 0x00b8bef7, 0x00cabd09, 0x0000be57}}, Y: Field{[10]uint32{0x01693ad2, 0x01192368, 0x02a7b523, 0x024e36c7, 0x01d5b0f8, 0x0026fce3, 0x02a9c3df, 0x03b61967, 0x0014fe6c, 0x000c515a}}}, + {X: Field{[10]uint32{0x018a7c1c, 0x029984af, 0x03fea883, 0x028df7bc, 0x023b6ae1, 0x00df9008, 0x01a432ca, 0x03936da8, 0x02c864df, 0x001d8e49}}, Y: Field{[10]uint32{0x0361bd1f, 0x00fc2970, 0x03a410bd, 0x0396e793, 0x00a3e741, 0x0203c7e6, 0x00b3e63d, 0x03443aed, 0x03724378, 0x003cd356}}}, + {X: Field{[10]uint32{0x00a31b0d, 0x0201f272, 0x00ebf72a, 0x03746371, 0x03708ce2, 0x032db262, 0x012a513f, 0x01b3dbcc, 0x027a1291, 0x000b90ef}}, Y: Field{[10]uint32{0x0024acfa, 0x03a67437, 0x019c5971, 0x0024232d, 0x00a3a9dc, 0x03545334, 0x0257b6ce, 0x01f95c5b, 0x0224ce1b, 0x0036e464}}}, + {X: Field{[10]uint32{0x014a5561, 0x02583073, 0x02df9a56, 0x03ec4e96, 0x002d1acd, 0x03f1a1cf, 0x0331984a, 0x01f4a1d9, 0x008f1a86, 0x001f5979}}, Y: Field{[10]uint32{0x0183ebfc, 0x01f32fb6, 0x029da7b9, 0x00daf9f9, 0x00bc9924, 0x02bde576, 0x00e2d4bc, 0x01eb4bfc, 0x0155f095, 0x00271cee}}}, + {X: Field{[10]uint32{0x0019d725, 0x02529c5e, 0x02b7c10b, 0x021f171d, 0x006b132c, 0x035c54e4, 0x02166f04, 0x02ddcb2b, 0x00c03131, 0x00071afb}}, Y: Field{[10]uint32{0x023280ad, 0x0313492c, 0x0106e318, 0x008b3ed2, 0x0041b84a, 0x02bf7d82, 0x03dd26cd, 0x0214cc25, 0x00ff9499, 0x000b0f19}}}, + {X: Field{[10]uint32{0x03347675, 0x02ca9904, 0x020f8198, 0x02c1fa74, 0x01aff339, 0x01fb7c1e, 0x02c83c7d, 0x020408ca, 0x025d5d11, 0x003d410a}}, Y: Field{[10]uint32{0x01a3e4c8, 0x01f7ff5e, 0x01d20b59, 0x015d6a2f, 0x02b2723f, 0x02811414, 0x02388020, 0x03f1b4bc, 0x03bce644, 0x00067043}}}, + {X: Field{[10]uint32{0x014be300, 0x00cd622f, 0x02539b48, 0x03c0b784, 0x030e0ee9, 0x01038213, 0x000c8872, 0x00d4f9b8, 0x0066c2c0, 0x001f0e1e}}, Y: Field{[10]uint32{0x032b8f79, 0x00ded0fb, 0x00ab400c, 0x0155b2bd, 0x0356f088, 0x001d2003, 0x03c49c6d, 0x0316350b, 0x0394587f, 0x0033319b}}}, + {X: Field{[10]uint32{0x02b3c140, 0x0081b93a, 0x034e0b7b, 0x03445a47, 0x02104b35, 0x022e8bb7, 0x02381945, 0x0370adb3, 0x0123d33a, 0x003b3a2b}}, Y: Field{[10]uint32{0x000c0a88, 0x029023df, 0x01e7c5c6, 0x00bd4d99, 0x031c7e67, 0x0326dca3, 0x00245a12, 0x034fd7cf, 0x02c07fa1, 0x003bb25d}}}, + {X: Field{[10]uint32{0x01d12b9d, 0x02bd63c6, 0x03c56a1b, 0x0064f8b2, 0x00b951cf, 0x034085dd, 0x02efecc7, 0x0370e327, 0x0126a274, 0x00208ac2}}, Y: Field{[10]uint32{0x00118313, 0x0030b791, 0x0263f1be, 0x0021443f, 0x023638f0, 0x03f3c144, 0x014d2c49, 0x030dd60c, 0x010af9ca, 0x00122f2c}}}, + {X: Field{[10]uint32{0x0385b8c3, 0x00b9dec3, 0x028a85cd, 0x011e0311, 0x03401dfe, 0x03398bf8, 0x0058d257, 0x03d0a3e8, 0x02036ef5, 0x00349a8e}}, Y: Field{[10]uint32{0x026a6fa7, 0x02c45d44, 0x00ba010f, 0x033e6eb9, 0x0362f1bb, 0x00c230b6, 0x01c6759a, 0x010ca5f5, 0x03623a64, 0x002630e5}}}, + {X: Field{[10]uint32{0x03019090, 0x00f0d1a4, 0x024beb5b, 0x037eec59, 0x0124c8fc, 0x02891f47, 0x0002ab6c, 0x032ef40c, 0x001d8aa0, 0x001ffaee}}, Y: Field{[10]uint32{0x02c3ec26, 0x02918129, 0x03b446cf, 0x008f62c8, 0x03966dc9, 0x02a12e6f, 0x00ca6c02, 0x01b69d51, 0x03cb12ca, 0x003b9896}}}, + {X: Field{[10]uint32{0x01d3473c, 0x03cac394, 0x0008733d, 0x00a9b78b, 0x02b7aa00, 0x030d912e, 0x0363a75c, 0x02daef9b, 0x00e72d43, 0x0020e791}}, Y: Field{[10]uint32{0x000fb9a9, 0x02478c4d, 0x03da43e5, 0x026150ac, 0x002d876d, 0x01dd6fda, 0x0163806d, 0x00508829, 0x023526f4, 0x0020da3d}}}, + {X: Field{[10]uint32{0x030d7afe, 0x0163ab36, 0x01135ea9, 0x025e1b48, 0x017e049b, 0x00fcbbb6, 0x02c84f32, 0x0381f278, 0x03da1c96, 0x0014ba51}}, Y: Field{[10]uint32{0x0073a831, 0x019c39b5, 0x0097d9fa, 0x003b7112, 0x02bdbbe5, 0x027e9cae, 0x01e19a90, 0x0034f4e7, 0x02c9e0c7, 0x001af3f7}}}, + {X: Field{[10]uint32{0x027f3603, 0x0231ad31, 0x000cedb1, 0x01d33f2c, 0x00c8b220, 0x0323a793, 0x03f6dd71, 0x029d0c75, 0x002605e4, 0x001cbb15}}, Y: Field{[10]uint32{0x006b5ee5, 0x01b53e9e, 0x01023615, 0x03e056f2, 0x0249455c, 0x007bb52e, 0x02a6d715, 0x03be53d7, 0x020b7f9d, 0x00376e4d}}}, + {X: Field{[10]uint32{0x0006c849, 0x026b74c5, 0x00f36af3, 0x03a75aa4, 0x012ac051, 0x00a18f44, 0x02bf9baf, 0x015a2405, 0x031559a5, 0x000dc28f}}, Y: Field{[10]uint32{0x03005840, 0x0283b187, 0x01ddaba3, 0x024c8d74, 0x03ee80d9, 0x002c419e, 0x01ab5d32, 0x033b9825, 0x01a68517, 0x0021532f}}}, + {X: Field{[10]uint32{0x03ef5dc2, 0x03e68e66, 0x02c6a714, 0x0033dc66, 0x0141d1cf, 0x01dfbda8, 0x03af5275, 0x03ef6f2c, 0x008860d2, 0x0004b95e}}, Y: Field{[10]uint32{0x02bd9ea2, 0x01b17061, 0x00821ab4, 0x027192b7, 0x01a09496, 0x01692d1d, 0x03b79ead, 0x0049bdf6, 0x02ca5dd8, 0x003d6bde}}}, + {X: Field{[10]uint32{0x00a2b722, 0x02b630cc, 0x025bdfe2, 0x0322b282, 0x028b7905, 0x015efe74, 0x031abad7, 0x0297785e, 0x03cd0b2f, 0x002d252a}}, Y: Field{[10]uint32{0x0294cb87, 0x02475ca4, 0x01adfbf9, 0x00431902, 0x00cbacf7, 0x0100693e, 0x038d8aee, 0x0186767f, 0x03d6dad8, 0x0030e5ff}}}, + {X: Field{[10]uint32{0x02b9d89c, 0x011817a2, 0x02a83106, 0x03912677, 0x03118ea6, 0x03dc6f72, 0x008245c0, 0x002e52c8, 0x012d900d, 0x000a55da}}, Y: Field{[10]uint32{0x00444a7b, 0x03595690, 0x02a91857, 0x00adfaee, 0x00f12934, 0x03f09354, 0x0037e940, 0x02bfa800, 0x00479284, 0x0028f155}}}, + {X: Field{[10]uint32{0x01bd20eb, 0x02fdc8e8, 0x00cda39c, 0x034cb927, 0x031969ae, 0x03052979, 0x0213642d, 0x0381caf2, 0x0079f325, 0x00184406}}, Y: Field{[10]uint32{0x00e443b3, 0x016611c0, 0x017a9c1d, 0x00fb599d, 0x03e5c248, 0x02763ac2, 0x0367269e, 0x0392ef56, 0x00824816, 0x00138667}}}, + {X: Field{[10]uint32{0x0255ab18, 0x027106ae, 0x034e429a, 0x0352642a, 0x02c65f6a, 0x009c87ef, 0x028c648c, 0x011d3e2a, 0x00b299f3, 0x0027ba92}}, Y: Field{[10]uint32{0x03234443, 0x01f62707, 0x00654c1d, 0x024befb8, 0x03b68028, 0x03cad687, 0x00570497, 0x0346f1fa, 0x029735ce, 0x0004e551}}}, + {X: Field{[10]uint32{0x018bd97a, 0x03d00ed4, 0x03c5cc9d, 0x02d8c7c6, 0x013fff42, 0x028da023, 0x00759826, 0x02dc1f29, 0x00d78ba7, 0x0036ec15}}, Y: Field{[10]uint32{0x011b923a, 0x021e5d58, 0x01d4a89d, 0x03e06ae5, 0x030a55a1, 0x009f9e07, 0x00048854, 0x00e95775, 0x02c09634, 0x000e5bbd}}}, + {X: Field{[10]uint32{0x021bbcf1, 0x03cf2aad, 0x0275cd70, 0x01056c23, 0x01b2f625, 0x01705372, 0x03cc0ea3, 0x00bbd276, 0x03d57fdd, 0x0036ea56}}, Y: Field{[10]uint32{0x00d20a3d, 0x02438c80, 0x004cc64a, 0x02b2ba4e, 0x020b8f76, 0x0054566e, 0x036dba84, 0x01f91862, 0x025eb7a1, 0x000abc25}}}, + {X: Field{[10]uint32{0x02d0e5be, 0x02fabee2, 0x02ef5297, 0x00c9c8bd, 0x030bf1a1, 0x00f1d576, 0x02d8febc, 0x02ec3f9c, 0x02c97979, 0x0001b0c4}}, Y: Field{[10]uint32{0x0202c6ea, 0x0001c620, 0x006438be, 0x0185c7de, 0x006c4359, 0x0363ead5, 0x038d5ea3, 0x01ce777d, 0x0388db74, 0x000d8d98}}}, + {X: Field{[10]uint32{0x008825cd, 0x038c6db7, 0x021e5b9f, 0x00c2a8c5, 0x03ad9870, 0x006335c5, 0x01b8638e, 0x02f23d52, 0x0057a494, 0x00197adc}}, Y: Field{[10]uint32{0x03a80312, 0x019a530b, 0x03c92765, 0x01088256, 0x02160b7b, 0x021c1a38, 0x016b4acf, 0x02178246, 0x02a167f2, 0x00116080}}}, + {X: Field{[10]uint32{0x02ffa7f6, 0x01f8ae53, 0x000d6b56, 0x009b610b, 0x02c11174, 0x00abaf47, 0x01db7cbd, 0x01a36bb5, 0x0117b0e8, 0x00281a5a}}, Y: Field{[10]uint32{0x01ecba78, 0x0159d710, 0x030f5ba5, 0x00f8dffa, 0x03c797ec, 0x03a2f6a2, 0x01cb828b, 0x013723c0, 0x020da1bb, 0x00321d34}}}, + {X: Field{[10]uint32{0x002cced2, 0x009f195e, 0x0387903b, 0x01e474ed, 0x01108744, 0x0021ad93, 0x01378301, 0x00a84cb7, 0x03821937, 0x0010646e}}, Y: Field{[10]uint32{0x03dc3f2c, 0x024bf299, 0x03b4a348, 0x01e40925, 0x00493352, 0x00b84c2f, 0x02e52bf8, 0x03486347, 0x03c98ce4, 0x0031d241}}}, + {X: Field{[10]uint32{0x01b218c3, 0x039fd71e, 0x0038f3c3, 0x03c82427, 0x030945e3, 0x02572563, 0x023b9b2b, 0x024fb964, 0x01337212, 0x001d7cdf}}, Y: Field{[10]uint32{0x01928be7, 0x037ab3a9, 0x02a339af, 0x02847d00, 0x02a7d2fd, 0x033c46a8, 0x0328e181, 0x008a9e8b, 0x038ec6b2, 0x002b0107}}}, + {X: Field{[10]uint32{0x02fb154e, 0x01c6bee5, 0x02c65785, 0x03dc0775, 0x026004d1, 0x03c62a12, 0x00b3bef6, 0x00bca408, 0x033ab58b, 0x0032f0c5}}, Y: Field{[10]uint32{0x01fd5c37, 0x0393783e, 0x0089226d, 0x0325863a, 0x01b8f36e, 0x0255dfb8, 0x03c166de, 0x011050b4, 0x00b76f26, 0x003104e8}}}, + {X: Field{[10]uint32{0x02e226cc, 0x0390dc36, 0x00dd92a5, 0x03d16fd3, 0x0164f212, 0x0067346f, 0x02888324, 0x03e965a5, 0x0309a139, 0x0019395a}}, Y: Field{[10]uint32{0x010fbbbe, 0x02f06781, 0x02fa7671, 0x02a18a80, 0x01d10915, 0x02d0a505, 0x001eb3d0, 0x0240592d, 0x02eef242, 0x002a4653}}}, + {X: Field{[10]uint32{0x015285a6, 0x033ed24d, 0x0014f73b, 0x0140273f, 0x0334e133, 0x0380be44, 0x022c2fb8, 0x01b3ca68, 0x01c5e288, 0x0038cde5}}, Y: Field{[10]uint32{0x01afb304, 0x035908c0, 0x035e15c2, 0x03431b37, 0x01f7c575, 0x02d2ec19, 0x02580cb7, 0x01231c93, 0x0121f33d, 0x001e243f}}}, + {X: Field{[10]uint32{0x02b0b6dc, 0x01739d69, 0x036998f2, 0x0250d7ad, 0x036e6a09, 0x01b1e48c, 0x0143d2c7, 0x03428345, 0x026b7a73, 0x0001e5d7}}, Y: Field{[10]uint32{0x023eb06f, 0x00738bfd, 0x03115012, 0x004289fd, 0x008f16eb, 0x0158af09, 0x0248d5f7, 0x024fb757, 0x00aec689, 0x00042c58}}}, + {X: Field{[10]uint32{0x01580f6f, 0x01c73774, 0x03ce02ad, 0x02124b38, 0x03c1ca44, 0x0007d106, 0x02093d08, 0x00e59e4b, 0x03cbf9c1, 0x001b4344}}, Y: Field{[10]uint32{0x03b45746, 0x012fcb3a, 0x016f1bae, 0x0351c769, 0x014bdb25, 0x01e910c2, 0x01dcfe33, 0x03c08aef, 0x023884ca, 0x0005eb90}}}, + {X: Field{[10]uint32{0x03df0154, 0x01d28806, 0x008560a9, 0x019cfef4, 0x0360d398, 0x0098200d, 0x03d3f904, 0x00ad6727, 0x014a23af, 0x0008657c}}, Y: Field{[10]uint32{0x00136a8d, 0x00fb853e, 0x02111da5, 0x01621bfd, 0x025ff1aa, 0x014028dc, 0x01b3a10b, 0x03bc07d3, 0x038c9a44, 0x003f016c}}}, + {X: Field{[10]uint32{0x03713628, 0x029ff7e2, 0x03c4dac2, 0x0220e113, 0x021f5582, 0x03477468, 0x0354e167, 0x03e2e746, 0x007360ac, 0x0011d9e7}}, Y: Field{[10]uint32{0x03803ea7, 0x00fdb285, 0x007510a9, 0x002bfce9, 0x037ca018, 0x013df365, 0x014bbde9, 0x03a07793, 0x0225f3b8, 0x0020a808}}}, + {X: Field{[10]uint32{0x0230831a, 0x02a9f277, 0x00655ac9, 0x00b8bdf2, 0x038cb4ff, 0x030859af, 0x03fe514c, 0x029a6c8f, 0x02f51636, 0x002c2f40}}, Y: Field{[10]uint32{0x03d5f518, 0x03743423, 0x0081448a, 0x00fee9b2, 0x00f4843b, 0x02fae8f6, 0x03ffc51f, 0x032f14a9, 0x016248ba, 0x0001cfeb}}}, + {X: Field{[10]uint32{0x03660158, 0x0226c068, 0x034520c6, 0x00548f2d, 0x000aab5f, 0x036fb16e, 0x03f81afa, 0x03e07fb4, 0x03d6bfe9, 0x0037ebbf}}, Y: Field{[10]uint32{0x01240583, 0x017cf6b2, 0x0324df3b, 0x0200435e, 0x0330c4bf, 0x032d6d53, 0x00a4bf9c, 0x0120539b, 0x0105c3ef, 0x000fd534}}}, + {X: Field{[10]uint32{0x000d42ed, 0x02b81afd, 0x00ba7046, 0x038fadf9, 0x0080dffa, 0x01bf5af9, 0x013d2e79, 0x0079263d, 0x02bbda66, 0x003ac05a}}, Y: Field{[10]uint32{0x02f895be, 0x03e0e89e, 0x011f518b, 0x03b5b4a7, 0x0110f005, 0x030b97a1, 0x014d50ad, 0x0166a5b3, 0x01bbaa76, 0x000c435b}}}, + {X: Field{[10]uint32{0x019fb2ed, 0x01ebec32, 0x01173e51, 0x01334bcd, 0x01726378, 0x00dfe398, 0x035b5eb1, 0x0202cdb4, 0x03c43c08, 0x00262786}}, Y: Field{[10]uint32{0x01faa1d8, 0x02dd1da7, 0x012feb53, 0x02d30b36, 0x00999b3b, 0x0077ddf6, 0x035963d1, 0x033314e8, 0x035f110c, 0x0013133a}}}, + {X: Field{[10]uint32{0x02033811, 0x03846630, 0x010bbfbe, 0x01be4249, 0x00dd801d, 0x01db57bf, 0x025bd407, 0x01eefc7d, 0x0170be4a, 0x0002fac0}}, Y: Field{[10]uint32{0x0086461f, 0x037304e1, 0x01644ff4, 0x0277f316, 0x000f5234, 0x01b4f39b, 0x02998202, 0x0268e15e, 0x018a1d32, 0x0004d5ae}}}, + {X: Field{[10]uint32{0x03c0b145, 0x032d0abf, 0x0112e337, 0x01756d83, 0x02ea9bc5, 0x01b10a5a, 0x035e5969, 0x026935bd, 0x03c1986f, 0x0000b642}}, Y: Field{[10]uint32{0x031a0c4c, 0x0327c1bd, 0x03b5b48d, 0x02fb4bbc, 0x02b377cc, 0x019fabed, 0x004b721e, 0x00665efe, 0x0364734d, 0x001f55f3}}}, + {X: Field{[10]uint32{0x009f51bf, 0x02729dde, 0x02481e82, 0x03cffb9c, 0x0159fd53, 0x030d9cef, 0x0196848d, 0x02018b78, 0x0254c960, 0x001ade9a}}, Y: Field{[10]uint32{0x0009af23, 0x0148939b, 0x0321a579, 0x00ad0f2f, 0x03dd4dc4, 0x0162bef8, 0x0079f30c, 0x0229a7c2, 0x0208157b, 0x001aa7b8}}}, + {X: Field{[10]uint32{0x028e8393, 0x02f2da0d, 0x03a8bf4a, 0x03a221c3, 0x0316faf0, 0x02df9fba, 0x01f8fa87, 0x037f9da3, 0x00c732cb, 0x00326491}}, Y: Field{[10]uint32{0x035620ae, 0x0303f0a1, 0x01951bc0, 0x02331a92, 0x0058cc9b, 0x00b6b8ba, 0x0163453b, 0x00ab4901, 0x035553ba, 0x00082b46}}}, + {X: Field{[10]uint32{0x00f01b6b, 0x01c7e51c, 0x013f6d28, 0x009a707e, 0x01350fef, 0x0026807f, 0x01cf4fc6, 0x0237157c, 0x007b402a, 0x00154ff0}}, Y: Field{[10]uint32{0x00e5a824, 0x02644dcd, 0x002909c1, 0x005df91c, 0x039b3102, 0x035f54ea, 0x03cd0dc7, 0x01b7bfe9, 0x00753961, 0x000ed463}}}, + {X: Field{[10]uint32{0x00fe2f69, 0x012fb030, 0x02369a4e, 0x009e524b, 0x03721fa9, 0x00d3216e, 0x00dfc80a, 0x0229f2cf, 0x037806ed, 0x003164c0}}, Y: Field{[10]uint32{0x0317c149, 0x031e94cd, 0x023001e1, 0x019e7d11, 0x02d7580e, 0x004ff5c0, 0x016dea62, 0x0244a4de, 0x00698a3e, 0x000da679}}}, + {X: Field{[10]uint32{0x011e7eb5, 0x02fb3224, 0x01c6a79d, 0x01ffc744, 0x008cda0e, 0x030d275d, 0x034613d8, 0x026592e3, 0x0118f4d5, 0x0032dbc4}}, Y: Field{[10]uint32{0x01de20ee, 0x020d723f, 0x036f4cf4, 0x00f5f799, 0x030ca0fe, 0x02095f11, 0x03cc88f4, 0x03573dc8, 0x028898b0, 0x0018ac2b}}}, + {X: Field{[10]uint32{0x01a26db9, 0x03148a8c, 0x009a946f, 0x023259a2, 0x0078b5d4, 0x037b2e67, 0x0322ae61, 0x019a3765, 0x038f8c26, 0x00368b2a}}, Y: Field{[10]uint32{0x010c7e98, 0x007869db, 0x01ad8fc2, 0x01ac4921, 0x01180849, 0x0324ec4c, 0x0214cb70, 0x03e52529, 0x037e0234, 0x001a80cd}}}, + {X: Field{[10]uint32{0x003b7d86, 0x023579ad, 0x00a82b22, 0x020e69bb, 0x03fa595b, 0x003c0fbb, 0x03374110, 0x038f1ff8, 0x01423f9b, 0x003f1a93}}, Y: Field{[10]uint32{0x0298beff, 0x01da1968, 0x016f5bb4, 0x01b89a46, 0x0027dfbd, 0x03094fea, 0x0078fdda, 0x02f868f7, 0x0144eb8f, 0x001b0225}}}, + {X: Field{[10]uint32{0x03dee882, 0x00dd5b78, 0x03e09db7, 0x0126509b, 0x003d09fb, 0x032a5183, 0x03258e83, 0x038341dc, 0x011ab9c6, 0x001cf26a}}, Y: Field{[10]uint32{0x0171d2b3, 0x0358d7f9, 0x0222478c, 0x00411741, 0x0352040a, 0x027b61da, 0x0290259c, 0x01422b56, 0x0327efc0, 0x0022cc50}}}, + {X: Field{[10]uint32{0x034516d3, 0x01d1328e, 0x02762933, 0x0122ba5d, 0x022bc028, 0x012e0265, 0x03e61271, 0x033470d0, 0x006145b8, 0x00029a7c}}, Y: Field{[10]uint32{0x030ebe3d, 0x03688275, 0x009aea86, 0x006d1fd9, 0x0396b6d9, 0x02185789, 0x016caf01, 0x00dd07b0, 0x0190b450, 0x0021d463}}}, + {X: Field{[10]uint32{0x00ed9691, 0x0148d7ca, 0x02572fc9, 0x003d11a8, 0x01376a43, 0x0056e910, 0x01dfb2ac, 0x0102dc73, 0x022570df, 0x00072f92}}, Y: Field{[10]uint32{0x0213de85, 0x01748095, 0x0380b6ef, 0x03ce6714, 0x02c8ac69, 0x02ce54fb, 0x02a2d10a, 0x0386ab3c, 0x02ccf262, 0x00049553}}}, + {X: Field{[10]uint32{0x0388e27d, 0x0320df6d, 0x0052fd13, 0x006a209e, 0x014ee2f1, 0x02822c64, 0x005ac85b, 0x0333ed0c, 0x01c7406d, 0x00237a92}}, Y: Field{[10]uint32{0x03e9d9b0, 0x00a55ef3, 0x00056d90, 0x0395a5ed, 0x002b6071, 0x01e8141b, 0x038b15ab, 0x01f0faea, 0x01a83b51, 0x0031cf58}}}, + {X: Field{[10]uint32{0x02d0ade5, 0x0310e921, 0x0094f6e4, 0x01f4156f, 0x025e4b71, 0x0074e35a, 0x00ab5af8, 0x0330ec7b, 0x0377b175, 0x0037a498}}, Y: Field{[10]uint32{0x03d0e11f, 0x00e1f545, 0x01cb973c, 0x02b39834, 0x016be387, 0x02352e2c, 0x0289115d, 0x0365d350, 0x03e79169, 0x000a757c}}}, + {X: Field{[10]uint32{0x03b41497, 0x02896c34, 0x00fa38a9, 0x03317ac6, 0x00f6e8a9, 0x03549450, 0x0055a2f3, 0x01ead2ad, 0x02a7aeb3, 0x001b9dba}}, Y: Field{[10]uint32{0x01e066fa, 0x0064f925, 0x0108a89f, 0x00f35a42, 0x0144c40a, 0x011eaaf6, 0x03fb936a, 0x027456ef, 0x005a7890, 0x0001f8f3}}}, + {X: Field{[10]uint32{0x00607574, 0x03b43e2f, 0x03f8f09e, 0x0274dfd7, 0x01467853, 0x026247e6, 0x022b03fc, 0x01fc3699, 0x02cf22d5, 0x000dc4c7}}, Y: Field{[10]uint32{0x0249f3b3, 0x01e87244, 0x026acc17, 0x02a9aaeb, 0x01281323, 0x005cf52e, 0x011d596e, 0x00a5a3d8, 0x012169d4, 0x00300ecb}}}, + {X: Field{[10]uint32{0x025d8152, 0x004fcdd2, 0x024e7667, 0x023d25e6, 0x0365155c, 0x0337c3ae, 0x0276633b, 0x02655ca3, 0x001482c8, 0x001c8222}}, Y: Field{[10]uint32{0x0174eedc, 0x01d8b972, 0x02e92d2a, 0x01d2d22b, 0x00588a79, 0x02642803, 0x00e26f81, 0x03722f6a, 0x019f8c0a, 0x0019e0f1}}}, + {X: Field{[10]uint32{0x03241864, 0x0048d974, 0x01e8adb7, 0x03345136, 0x02d4567f, 0x02fe74f3, 0x03a7a7ad, 0x0112ca9f, 0x03dfbaca, 0x0006e098}}, Y: Field{[10]uint32{0x0388606d, 0x02906fb5, 0x02785783, 0x02020065, 0x02edf366, 0x00b6b00d, 0x004b98db, 0x00450c65, 0x023e24f0, 0x00007f1f}}}, + {X: Field{[10]uint32{0x02f5fd43, 0x02309833, 0x013dff1a, 0x0381684c, 0x03ea41ba, 0x03560fb7, 0x019714db, 0x01fcae06, 0x02de27ca, 0x0001e8dc}}, Y: Field{[10]uint32{0x02281142, 0x01bc6e6d, 0x032e2091, 0x0192e83a, 0x01a5d3ab, 0x03d793b5, 0x0060f220, 0x015e16d7, 0x016bb32c, 0x002838c8}}}, + {X: Field{[10]uint32{0x00d02300, 0x03b03aa3, 0x0232a72b, 0x03f5e750, 0x00c30f22, 0x0156b07c, 0x03b94327, 0x01124722, 0x01aa5525, 0x001c6057}}, Y: Field{[10]uint32{0x036471b4, 0x03c58031, 0x03804876, 0x00613118, 0x003ade09, 0x013af8f0, 0x02fcc688, 0x0170597e, 0x03928de1, 0x0022cd04}}}, + {X: Field{[10]uint32{0x03654d2b, 0x031714ff, 0x01c785d1, 0x01304b22, 0x0205535d, 0x027c815b, 0x02d866a0, 0x033192d8, 0x037ad3cf, 0x00006952}}, Y: Field{[10]uint32{0x03a12f19, 0x020e42d1, 0x012e841d, 0x03e774a2, 0x03e9f5ae, 0x0247b0c1, 0x0077395a, 0x021ef48b, 0x02e39f4b, 0x002df1de}}}, + {X: Field{[10]uint32{0x019c44a6, 0x00adfb66, 0x01987726, 0x0081d00e, 0x0022cd28, 0x035d68bb, 0x030b6953, 0x01cf9772, 0x00571fc9, 0x002172d1}}, Y: Field{[10]uint32{0x010f6aa5, 0x034cc627, 0x02d53280, 0x01eaf41b, 0x0358037a, 0x03850824, 0x014ef028, 0x03f99b03, 0x01f3bd13, 0x003bf747}}}, + {X: Field{[10]uint32{0x00fd4e4e, 0x02f7dd7f, 0x03962c35, 0x02384e37, 0x02cd72df, 0x0101e8da, 0x00b305a2, 0x00432509, 0x009c64a0, 0x00263a19}}, Y: Field{[10]uint32{0x01a6c60b, 0x02a921b5, 0x008efcd3, 0x03dbf338, 0x01624a8c, 0x030febb4, 0x01f77704, 0x0175f152, 0x01693439, 0x002a0131}}}, + {X: Field{[10]uint32{0x00a5a72b, 0x0002e51d, 0x028817e5, 0x0191a71a, 0x035019a1, 0x01d3eb22, 0x00338958, 0x0396a23d, 0x03e6a297, 0x0007ab11}}, Y: Field{[10]uint32{0x01a11105, 0x02792b83, 0x00325f51, 0x028a570c, 0x01043a10, 0x03992e7b, 0x000bb1ff, 0x037abbce, 0x026b784d, 0x0022df6a}}}, + {X: Field{[10]uint32{0x004f42f5, 0x012b9a01, 0x026bc96c, 0x031e80a9, 0x01e29950, 0x029c8f89, 0x029e0ab6, 0x01cd8c5f, 0x006591f2, 0x003c1e6b}}, Y: Field{[10]uint32{0x0032dfc5, 0x02051a71, 0x00562249, 0x0340f649, 0x03490186, 0x005287bd, 0x00c3ca02, 0x010dd12b, 0x01bfc99f, 0x003aa1f4}}}, + {X: Field{[10]uint32{0x02539643, 0x01c72a8c, 0x0186eba4, 0x03a21a0c, 0x00fa0d94, 0x001dec76, 0x011c3ada, 0x00c383c0, 0x0179bf1f, 0x0035b427}}, Y: Field{[10]uint32{0x00aa8adf, 0x03d7325f, 0x00049876, 0x00dd19af, 0x00ef5100, 0x036b4b52, 0x030494dc, 0x03d507dc, 0x0064fac8, 0x0021dc2f}}}, + {X: Field{[10]uint32{0x00351f65, 0x03cee82e, 0x0291e3af, 0x029ac793, 0x01d6416c, 0x020c4fe2, 0x00595656, 0x00cda01c, 0x03d9f896, 0x000ddb92}}, Y: Field{[10]uint32{0x025f13f1, 0x014de379, 0x0295b78a, 0x03a91feb, 0x000497de, 0x0111f2ca, 0x019e8b96, 0x023c757a, 0x01e56724, 0x002e90db}}}, + {X: Field{[10]uint32{0x039f20d7, 0x0231d042, 0x0210c657, 0x014eee85, 0x000b17cb, 0x025be0d3, 0x0193daec, 0x031e6688, 0x02184b42, 0x0009c3ce}}, Y: Field{[10]uint32{0x03e7e5bc, 0x019cca15, 0x0300021b, 0x02a7d28e, 0x023a7054, 0x019ccddf, 0x00fb0d01, 0x022eec28, 0x012b9ab9, 0x003333ac}}}, + {X: Field{[10]uint32{0x02c1a599, 0x00169743, 0x02de20f5, 0x02dfea62, 0x00b055d2, 0x00ed25b4, 0x0247a8a9, 0x014d20a7, 0x03641a1e, 0x002b89c6}}, Y: Field{[10]uint32{0x03c2bdd3, 0x03ec911f, 0x0181e45d, 0x02294f05, 0x01584790, 0x021ebea7, 0x02a9a23f, 0x0207c948, 0x012f39b4, 0x00053a55}}}, + {X: Field{[10]uint32{0x03f28c8c, 0x021a6d69, 0x016a25ec, 0x00ea50ff, 0x02db36a9, 0x03b94e43, 0x0288ad64, 0x0229d2a4, 0x00fb177d, 0x0015a7ab}}, Y: Field{[10]uint32{0x03732f7c, 0x0271c6d7, 0x028440cb, 0x03d517d4, 0x02bfda9a, 0x01bd3c4d, 0x027508aa, 0x0190ae66, 0x00329127, 0x00073d8b}}}, + {X: Field{[10]uint32{0x0315b558, 0x01f3e057, 0x01e46f27, 0x03b5b4d9, 0x0041bfb5, 0x025e43e3, 0x026a2468, 0x039eea8c, 0x027ffdc4, 0x001df1fc}}, Y: Field{[10]uint32{0x021c3007, 0x03e4cee0, 0x01a4325a, 0x03ac1140, 0x00e0f970, 0x014b0bb0, 0x02a68288, 0x03976559, 0x00dc138b, 0x00134d10}}}, + {X: Field{[10]uint32{0x00adbb25, 0x03b5f625, 0x001ed132, 0x0079ee0c, 0x017d4676, 0x00113fbe, 0x03f67e9b, 0x000c1aa1, 0x02dbf173, 0x003598a4}}, Y: Field{[10]uint32{0x008b83c5, 0x03963d8b, 0x00209cb0, 0x0051bf14, 0x033d36db, 0x02ff2cca, 0x0145f238, 0x0293b648, 0x03558cec, 0x0033bbdd}}}, + {X: Field{[10]uint32{0x037ed0d6, 0x021597a9, 0x03a4925e, 0x02efd541, 0x038769e3, 0x01faec7c, 0x03927ef0, 0x01bd12dd, 0x032e12ea, 0x000710a0}}, Y: Field{[10]uint32{0x0029d5ee, 0x0394e2a7, 0x0211e280, 0x028cc9ef, 0x02786a62, 0x03879076, 0x017917d9, 0x013d769c, 0x03a4b31b, 0x0022e4e0}}}, + {X: Field{[10]uint32{0x021f7968, 0x02afddec, 0x014cc5d6, 0x00d4f34e, 0x00608324, 0x02e633cc, 0x0362911f, 0x018aa330, 0x02ff9422, 0x0018f95f}}, Y: Field{[10]uint32{0x01b009be, 0x00ba8d56, 0x036b0450, 0x038a897e, 0x00146062, 0x008ba94c, 0x0344e7d3, 0x020fc930, 0x022dfb90, 0x00278f07}}}, + {X: Field{[10]uint32{0x03b83c90, 0x01452265, 0x03f9b02a, 0x02a6d3a8, 0x00cf3ed3, 0x024253aa, 0x0088e591, 0x022971cb, 0x03a186f3, 0x002f88cf}}, Y: Field{[10]uint32{0x01dba564, 0x0067437b, 0x0156fefd, 0x03a98a5a, 0x0140bd48, 0x03714def, 0x0389ef9e, 0x02b6c9b8, 0x02b3362f, 0x00100bac}}}, + {X: Field{[10]uint32{0x01844b78, 0x0030fc58, 0x03579aaa, 0x01592892, 0x02f2cc69, 0x029cc3f3, 0x01f4d065, 0x01d3ea71, 0x03804e7c, 0x0018db76}}, Y: Field{[10]uint32{0x02a2496c, 0x03d1faf9, 0x022e7dee, 0x03ee4589, 0x026aa31f, 0x025fab22, 0x02feb598, 0x004b1808, 0x01695832, 0x001a928d}}}, + {X: Field{[10]uint32{0x02e1c5e7, 0x035b0b37, 0x01e605bd, 0x030adb9a, 0x02215ae7, 0x038bc959, 0x035af1ee, 0x0361ffde, 0x01d17250, 0x00349470}}, Y: Field{[10]uint32{0x03b4ae78, 0x012d461f, 0x004cbf55, 0x001b2116, 0x005de60d, 0x02e59963, 0x035c9862, 0x00bea32a, 0x00f57df5, 0x000916b3}}}, + {X: Field{[10]uint32{0x018ed407, 0x0371d106, 0x0248cc3b, 0x005ceea0, 0x029055f9, 0x012c1bd0, 0x011cbe05, 0x004cedc1, 0x00b8c62f, 0x00101753}}, Y: Field{[10]uint32{0x005deb54, 0x02aee9cc, 0x027201a9, 0x03f181d1, 0x01523553, 0x034af0fb, 0x00e8031b, 0x00f2d0a6, 0x0310a896, 0x002118f7}}}, + {X: Field{[10]uint32{0x03e983b8, 0x03b638e6, 0x03003546, 0x025073a3, 0x00ab3293, 0x03f696f9, 0x00a03144, 0x00e81f85, 0x02ee9ab3, 0x0025fc16}}, Y: Field{[10]uint32{0x03849261, 0x012b56fa, 0x01a7c3be, 0x008078f4, 0x03d321f1, 0x00cde0b2, 0x0070b155, 0x004e2f13, 0x02267fd9, 0x0016798a}}}, + {X: Field{[10]uint32{0x02b91ac8, 0x0181d243, 0x0153dea1, 0x02350c25, 0x01c99fdf, 0x02e6b5a4, 0x01060f26, 0x009701aa, 0x016118e1, 0x0000ce20}}, Y: Field{[10]uint32{0x0004384b, 0x005d9f65, 0x00c88728, 0x023f6f70, 0x02a57178, 0x0116a640, 0x013af0d2, 0x0069a301, 0x018b5b8e, 0x00160fa4}}}, + {X: Field{[10]uint32{0x0117a9f9, 0x03dff4cf, 0x03c31dc8, 0x0198cda7, 0x038cf653, 0x0370ed81, 0x0306b1ad, 0x01a8967d, 0x00466bbe, 0x00377483}}, Y: Field{[10]uint32{0x01de5a99, 0x01e3a270, 0x03daa7cf, 0x0166b2d0, 0x017833e1, 0x0188733c, 0x02adcf46, 0x0261a2ee, 0x0329b4ea, 0x002cb7de}}}, + {X: Field{[10]uint32{0x03dfc9f7, 0x00005c8e, 0x011cfdfe, 0x004ba37e, 0x00eecd07, 0x004e272f, 0x02c26bc3, 0x003b9565, 0x012f71ae, 0x00248f1b}}, Y: Field{[10]uint32{0x034be948, 0x0290dc00, 0x03082414, 0x021cc81f, 0x005ff2ed, 0x02680f50, 0x001ae969, 0x00490da9, 0x00ad27c4, 0x001bf6ca}}}, + {X: Field{[10]uint32{0x00a09e65, 0x0277c637, 0x031a7fde, 0x01b05241, 0x01a44887, 0x0229f444, 0x0212461b, 0x01fa1d9a, 0x02bd28d5, 0x001b50a9}}, Y: Field{[10]uint32{0x01fd28bf, 0x02fb5ae5, 0x02775640, 0x0099d1fc, 0x00dcdd28, 0x0008988d, 0x005554df, 0x03a5f0d6, 0x02b801db, 0x00137c1e}}}, + {X: Field{[10]uint32{0x01d761ae, 0x018c3b08, 0x023f04b9, 0x0010c726, 0x0170efe1, 0x014e7b38, 0x003610d8, 0x03c9674f, 0x016159f9, 0x001ff50a}}, Y: Field{[10]uint32{0x01d7e280, 0x03c77c49, 0x026dc787, 0x0005b574, 0x00e85b60, 0x03543990, 0x037d00c4, 0x00afd440, 0x0041b8ce, 0x003f5a55}}}, + {X: Field{[10]uint32{0x026770b5, 0x026ec97a, 0x018a75b5, 0x0377d023, 0x00944045, 0x00156664, 0x0100a017, 0x025f7f9e, 0x010b128d, 0x00123041}}, Y: Field{[10]uint32{0x00f66559, 0x0005f05b, 0x0061ef9b, 0x027e218c, 0x01d450e4, 0x00d4e282, 0x0061b315, 0x00c67073, 0x01a04b6e, 0x0023df3b}}}, + {X: Field{[10]uint32{0x02e2a686, 0x01963df7, 0x00a09689, 0x01037969, 0x00b3214c, 0x0220f19f, 0x02baa1b4, 0x018b725a, 0x019da12d, 0x0015118b}}, Y: Field{[10]uint32{0x01ccd957, 0x03fb0b96, 0x02e370bc, 0x00583546, 0x026a3f00, 0x03bba067, 0x0133bb50, 0x00475c3f, 0x016f9160, 0x001d9ceb}}}, + {X: Field{[10]uint32{0x026435e8, 0x01ce6087, 0x02261443, 0x011d535e, 0x0095c5fe, 0x012ddc7c, 0x025a46e4, 0x0076260a, 0x00c4e4e1, 0x001a614d}}, Y: Field{[10]uint32{0x01cbba18, 0x03d07538, 0x011376a8, 0x0267dc70, 0x039faba0, 0x039f5a1c, 0x0219a8a5, 0x0031c635, 0x02acb272, 0x000db580}}}, + {X: Field{[10]uint32{0x03e77ecc, 0x0120ca82, 0x0341ad8c, 0x00849bf4, 0x01d0bc2a, 0x03223b36, 0x0376b0d7, 0x02070eec, 0x035951c6, 0x001124fd}}, Y: Field{[10]uint32{0x0120351e, 0x002624b0, 0x0012a391, 0x03d3a0a7, 0x02df7143, 0x02ff552f, 0x03158574, 0x026ab65f, 0x021dd4d9, 0x003954f8}}}, + {X: Field{[10]uint32{0x00f8313b, 0x02f89233, 0x02ec8cf8, 0x0179a1f9, 0x006c0632, 0x0245f009, 0x0384cf5f, 0x02038625, 0x02a93300, 0x002c1536}}, Y: Field{[10]uint32{0x0367d866, 0x0222c76d, 0x01a83b06, 0x016877ba, 0x014ed52a, 0x01809083, 0x015f2a40, 0x03956b1d, 0x03155c9c, 0x00147c11}}}, + {X: Field{[10]uint32{0x0029583e, 0x000dc4f0, 0x03c571fe, 0x032581be, 0x02c1f8cf, 0x0194676c, 0x03e6796e, 0x01ac7e7f, 0x02a4fa99, 0x0012d09c}}, Y: Field{[10]uint32{0x030edb83, 0x032029bf, 0x0110cf5f, 0x00cd0e13, 0x03cecde8, 0x032f145e, 0x0336f8cf, 0x0314f572, 0x02d0dce7, 0x002549bc}}}, + {X: Field{[10]uint32{0x03e29604, 0x0012a8d8, 0x00bff46a, 0x020fc7c1, 0x006cf63f, 0x03468e52, 0x02d8e647, 0x03a0bb2b, 0x0281c69d, 0x003587ad}}, Y: Field{[10]uint32{0x021f08b8, 0x0218965c, 0x001dfaa3, 0x01756fd1, 0x03f62fdf, 0x002b8a3a, 0x006d9a43, 0x01ee3cdf, 0x02fb156d, 0x0026d6a4}}}, + {X: Field{[10]uint32{0x02bf507f, 0x00f93830, 0x0157d576, 0x0103bf63, 0x008349e3, 0x037057ae, 0x0173c8f3, 0x01e7027e, 0x000257f9, 0x0002fe3c}}, Y: Field{[10]uint32{0x020614fe, 0x01052820, 0x037d9f66, 0x00e7d3c5, 0x03433467, 0x01b4d8e8, 0x00265a83, 0x0399c3f7, 0x022f1041, 0x00158761}}}, + {X: Field{[10]uint32{0x034cb498, 0x00f8a25d, 0x032d5eb0, 0x011547b1, 0x03b471fd, 0x00a4ea1b, 0x01ca03f7, 0x03eb5936, 0x00e2a7a6, 0x0018ec95}}, Y: Field{[10]uint32{0x01948c8b, 0x01eef9d4, 0x01880083, 0x014dafbf, 0x01f5be7d, 0x00b79273, 0x03b3819a, 0x03a48b71, 0x01113a4c, 0x003d0514}}}, + {X: Field{[10]uint32{0x03968725, 0x00628a74, 0x0009ae04, 0x0021ae4f, 0x0350fdd9, 0x01327bf9, 0x0091f33c, 0x01bb618d, 0x02cde1da, 0x002eb9be}}, Y: Field{[10]uint32{0x02a30533, 0x0198241b, 0x0349bb4d, 0x03149498, 0x02e4ca46, 0x019539a8, 0x03df74c6, 0x00c5dbda, 0x01550e48, 0x001f1f72}}}, + {X: Field{[10]uint32{0x00eb34af, 0x021188eb, 0x0029b595, 0x005d4e01, 0x00d30a63, 0x0271982c, 0x02d81395, 0x02a823cf, 0x01f8ea15, 0x003d58a1}}, Y: Field{[10]uint32{0x015a9eb9, 0x02c73a41, 0x038ee31e, 0x0369ee66, 0x02d9a0f6, 0x028b72e6, 0x0303c9de, 0x00652901, 0x03c1a202, 0x0004400c}}}, + {X: Field{[10]uint32{0x0151d87a, 0x01c98ce0, 0x006a540d, 0x0348663b, 0x020eafba, 0x003a38da, 0x039191c6, 0x035147b6, 0x00953de3, 0x0021db1f}}, Y: Field{[10]uint32{0x032279b8, 0x013897a5, 0x03d27df5, 0x00744016, 0x01cf5501, 0x0394aa16, 0x0010d177, 0x0031b010, 0x037472ce, 0x00257bff}}}, + {X: Field{[10]uint32{0x000a6d30, 0x0360eb25, 0x030e3fbf, 0x01b6e8fc, 0x00a024d8, 0x02ac71d6, 0x00969024, 0x01ef55a0, 0x03ed077c, 0x003a55b1}}, Y: Field{[10]uint32{0x03aad9da, 0x01c5dc41, 0x0026b45c, 0x0164339a, 0x0205aa57, 0x01669592, 0x017a9da2, 0x026adde9, 0x00a6f0d1, 0x0006d77f}}}, + {X: Field{[10]uint32{0x01dd3f16, 0x00bfeaa6, 0x028bd8fe, 0x016a0691, 0x03ab743b, 0x01412335, 0x016e9c06, 0x01150c51, 0x0261abdb, 0x003d4ff7}}, Y: Field{[10]uint32{0x0390222f, 0x01ad93b5, 0x026bc1a2, 0x023b838a, 0x01a65ac7, 0x02cd586f, 0x038e86ba, 0x008ad405, 0x013947ea, 0x00074a2d}}}, + {X: Field{[10]uint32{0x00043ad9, 0x00d91272, 0x003b5f5d, 0x02d3def3, 0x025e49b0, 0x00da9f18, 0x01b91039, 0x010d751d, 0x028152eb, 0x002e46a1}}, Y: Field{[10]uint32{0x013aaa75, 0x00c018a8, 0x0288bb34, 0x00347a2f, 0x01722dc9, 0x007746f5, 0x0296f3d1, 0x026f0185, 0x01175693, 0x00031d63}}}, + {X: Field{[10]uint32{0x018f8cc7, 0x03c233e3, 0x02897b16, 0x032ec930, 0x0261f5ad, 0x02f25d4d, 0x00c55d0a, 0x00a49f6d, 0x007023e3, 0x0016a1ef}}, Y: Field{[10]uint32{0x03731e54, 0x02a9b81b, 0x01b2c3d2, 0x00b622a2, 0x009d1ac3, 0x02ffdd2d, 0x02d2120f, 0x00357011, 0x024baa6a, 0x00273aab}}}, + {X: Field{[10]uint32{0x01ceb034, 0x01e7de5c, 0x02e80de9, 0x02a19ad9, 0x01215622, 0x03f1736c, 0x00a80b9e, 0x02cd50ef, 0x0343e54e, 0x002b02c6}}, Y: Field{[10]uint32{0x00638d8d, 0x0344fcfd, 0x007f609b, 0x03ef4afc, 0x01439477, 0x025f6a6d, 0x03c2b871, 0x0385485e, 0x035e5731, 0x002a2455}}}, + {X: Field{[10]uint32{0x005ca915, 0x01cd19fa, 0x03dc1450, 0x01277cea, 0x00e84f19, 0x01ae88dc, 0x034d6f3f, 0x033609db, 0x02bc2017, 0x0034f107}}, Y: Field{[10]uint32{0x00dcf7b7, 0x02979363, 0x02ce609d, 0x01d8ee8f, 0x01bc1e95, 0x0043f3cd, 0x02b1e916, 0x0165147d, 0x01528be5, 0x0014aac7}}}, + {X: Field{[10]uint32{0x03923b02, 0x03afa551, 0x010634d1, 0x013d27ba, 0x02ab842e, 0x0386c3cd, 0x0100d00f, 0x00b31bde, 0x0057f4c8, 0x001a33ff}}, Y: Field{[10]uint32{0x02b1d8e2, 0x01a92166, 0x026b26fe, 0x0012ebb4, 0x03367ba9, 0x00628c1a, 0x03da281c, 0x001d070f, 0x01bfaac1, 0x001ca655}}}, + {X: Field{[10]uint32{0x00177d9c, 0x03c954e3, 0x0074cd30, 0x0194d0fe, 0x02579dc7, 0x014c9299, 0x00566b33, 0x0267bb82, 0x00e12462, 0x001f83d6}}, Y: Field{[10]uint32{0x0021447c, 0x010065a2, 0x0128dcd3, 0x0055a816, 0x00086b90, 0x034d99d0, 0x009af7b5, 0x024fc020, 0x01835872, 0x000e5949}}}, + {X: Field{[10]uint32{0x00c9b542, 0x0057ae39, 0x03bbb97a, 0x0219cc95, 0x025dc450, 0x02cc97f5, 0x013d4bf1, 0x019263ad, 0x03dbd181, 0x0031caae}}, Y: Field{[10]uint32{0x0325a7b9, 0x01debeca, 0x0378288e, 0x0232da06, 0x00841a06, 0x011b34c6, 0x0041ed3e, 0x03cf4a21, 0x03a55df5, 0x000f23eb}}}, + {X: Field{[10]uint32{0x02363d0d, 0x002aed74, 0x015a1b72, 0x0329cff8, 0x00943654, 0x03da40de, 0x024d76ce, 0x0245107d, 0x035d3eb0, 0x001d1d1f}}, Y: Field{[10]uint32{0x00443649, 0x03eb5f07, 0x019b9746, 0x029907e5, 0x03bf54c1, 0x032bc151, 0x01f993a5, 0x03a3dcc8, 0x03240bc7, 0x00004b19}}}, + {X: Field{[10]uint32{0x01b67067, 0x03ff23e4, 0x006e1212, 0x00b347ec, 0x0129db86, 0x02b5a26a, 0x00b5d71d, 0x039f10d3, 0x02d1ab1d, 0x003ca9c0}}, Y: Field{[10]uint32{0x03afd854, 0x01ef458d, 0x0242962c, 0x006af451, 0x031d5ec1, 0x03ed373e, 0x03452bc7, 0x02b26b2d, 0x022cc730, 0x00016e47}}}, + {X: Field{[10]uint32{0x000d9340, 0x02d58d34, 0x01e1b530, 0x00f52fa4, 0x00c2535b, 0x000711ba, 0x01a87b62, 0x01ad197f, 0x030814e7, 0x002a4b53}}, Y: Field{[10]uint32{0x01cd0277, 0x02e81941, 0x030be6f4, 0x02f08d43, 0x0038d96d, 0x01d536b6, 0x01fd9bfe, 0x03ed015a, 0x028f3c02, 0x001360a6}}}, + {X: Field{[10]uint32{0x02f205a1, 0x03e45e89, 0x017462aa, 0x010a1285, 0x02df5ea1, 0x002a03ee, 0x00ea3206, 0x030ecfe4, 0x00b1ac06, 0x001e78c3}}, Y: Field{[10]uint32{0x00d5c82f, 0x007c9db2, 0x028d5352, 0x012a7d85, 0x007f1736, 0x0032ea5d, 0x008a79ed, 0x0252556b, 0x020a8145, 0x002b4882}}}, + {X: Field{[10]uint32{0x009401d1, 0x008c6da3, 0x02ff3020, 0x028eeaf5, 0x0288c8d6, 0x00903e8c, 0x023252be, 0x015dfc11, 0x0053d412, 0x001b5577}}, Y: Field{[10]uint32{0x03006eb3, 0x00cbf4de, 0x021540d7, 0x03228297, 0x02c98e17, 0x019e7c15, 0x01553452, 0x00cb0164, 0x0096aa3b, 0x0020e907}}}, + {X: Field{[10]uint32{0x01b3f20a, 0x00ed5a92, 0x02f487c8, 0x038834f8, 0x0211ef14, 0x032e2830, 0x03ea5eb4, 0x02e426cd, 0x031f604e, 0x0033e727}}, Y: Field{[10]uint32{0x0247dff8, 0x034722e8, 0x03f93dd3, 0x03e77d5b, 0x02da24ea, 0x032d1077, 0x0260b5be, 0x026621dc, 0x01f64e64, 0x000ae42e}}}, + {X: Field{[10]uint32{0x006b35dd, 0x03649786, 0x00346a2f, 0x016eea6a, 0x00e30f43, 0x03bdbf2b, 0x03677809, 0x02652acc, 0x019f29ed, 0x0018350a}}, Y: Field{[10]uint32{0x0360331e, 0x008da551, 0x0143737b, 0x02927462, 0x03040d51, 0x03639092, 0x0386ddd2, 0x02d3163f, 0x0388b8aa, 0x00037da6}}}, + {X: Field{[10]uint32{0x01493540, 0x0314ddb6, 0x02122887, 0x01660b34, 0x037de3be, 0x004528ef, 0x02bbb854, 0x012981ad, 0x02dd1b67, 0x00364e9b}}, Y: Field{[10]uint32{0x01e5f7ff, 0x03146ffe, 0x01230423, 0x023111fb, 0x03acfdb0, 0x03e486b9, 0x01590064, 0x0065ef00, 0x03d7dc79, 0x0021f68d}}}, + {X: Field{[10]uint32{0x01652962, 0x024646af, 0x03c6025d, 0x0368681b, 0x01fd5869, 0x032ded7d, 0x02bb6b31, 0x023662dc, 0x01377e10, 0x0033e30f}}, Y: Field{[10]uint32{0x00128fbb, 0x02722c4d, 0x01c93afc, 0x006a1e7b, 0x02fc5427, 0x0086cf2b, 0x002b0343, 0x02b40b6d, 0x0102bb96, 0x0001bd73}}}, + {X: Field{[10]uint32{0x00df29eb, 0x011f9a23, 0x002a6908, 0x0123c931, 0x00715b90, 0x01ee7283, 0x03ab65ac, 0x03b3e609, 0x02474637, 0x001b2a64}}, Y: Field{[10]uint32{0x02b55439, 0x0260f93f, 0x001f6d93, 0x00374057, 0x028bb616, 0x02ad5f0f, 0x02a446ed, 0x01153b65, 0x01a5fefa, 0x00144de3}}}, + {X: Field{[10]uint32{0x00d17afd, 0x035a1b4a, 0x008c558e, 0x0135ee7c, 0x033cc306, 0x02b3cb8f, 0x0267758c, 0x004f577a, 0x00043cb8, 0x001bdf4b}}, Y: Field{[10]uint32{0x0233bc6f, 0x029b3194, 0x013c8c65, 0x03c82b0a, 0x01b590a5, 0x01f17858, 0x039106c1, 0x03b120cf, 0x027813ec, 0x0011e538}}}, + {X: Field{[10]uint32{0x0124f3e1, 0x02a2893a, 0x03475d2c, 0x0069f667, 0x01e818d0, 0x0213a466, 0x02a82b01, 0x0220fead, 0x00d00bc9, 0x003e2bb8}}, Y: Field{[10]uint32{0x039442b5, 0x01bcd2a0, 0x01b8ab52, 0x01797348, 0x0244f105, 0x01ac6cf7, 0x0026bfac, 0x0177c025, 0x032b6913, 0x002b3e72}}}, + {X: Field{[10]uint32{0x00ce781c, 0x010ad180, 0x03f9d222, 0x03aba461, 0x010a85c8, 0x03d32470, 0x03123fc7, 0x000fd12f, 0x00bfc1a2, 0x0022c03f}}, Y: Field{[10]uint32{0x01d35bc9, 0x02617322, 0x03cac478, 0x02676b7e, 0x020a8de6, 0x03b9510a, 0x00264280, 0x039a43b0, 0x018a3e81, 0x00187a79}}}, + {X: Field{[10]uint32{0x01d6dd4d, 0x02dfe84e, 0x03c1ab0e, 0x008fa612, 0x00a72785, 0x0330c84b, 0x001ebbc1, 0x028acb08, 0x03078e84, 0x003eeb2e}}, Y: Field{[10]uint32{0x003a0f52, 0x02129f93, 0x020833aa, 0x017f45b1, 0x014e557d, 0x032eea89, 0x03df675c, 0x002265e5, 0x01d6f5eb, 0x000b1b27}}}, + {X: Field{[10]uint32{0x005c0611, 0x00cf6b2b, 0x02175bfa, 0x02ecf7e2, 0x005ba601, 0x00ee8a01, 0x028f9935, 0x03c14e34, 0x035c2f32, 0x000555a1}}, Y: Field{[10]uint32{0x00e240b7, 0x02bfa129, 0x01cf8eba, 0x00e84391, 0x03d2eb78, 0x022238e1, 0x01fb5405, 0x0251923a, 0x0050c3da, 0x0014d88c}}}, + {X: Field{[10]uint32{0x02d93d77, 0x01caec00, 0x0379e2e9, 0x03416617, 0x0349a8ce, 0x01a0fe00, 0x03e690ec, 0x017a6338, 0x00957f5b, 0x002d80ac}}, Y: Field{[10]uint32{0x01435227, 0x00e6d3a1, 0x009d960d, 0x00e2bd6e, 0x01ff3588, 0x006edecc, 0x00046acb, 0x02e0878c, 0x0390ddd6, 0x001e21a0}}}, + {X: Field{[10]uint32{0x022dd17a, 0x01454076, 0x0037724f, 0x0059d7f9, 0x037a8462, 0x001bc154, 0x01d66f8a, 0x00913822, 0x016523a5, 0x000a8440}}, Y: Field{[10]uint32{0x00825159, 0x0314e86e, 0x02bff938, 0x01e1f4b0, 0x02b881d0, 0x001cdfce, 0x02de4983, 0x018ba6c0, 0x0125e1ca, 0x000934ed}}}, + {X: Field{[10]uint32{0x017efce0, 0x00d76991, 0x01d3835a, 0x02495bf2, 0x01a13edb, 0x03d0f4b6, 0x0326a8e4, 0x03e6a738, 0x03591148, 0x0001cc51}}, Y: Field{[10]uint32{0x03b2d8b3, 0x02c3fddd, 0x03790c7f, 0x03c0c182, 0x021ad5ad, 0x015d991c, 0x02c7cfa4, 0x02a8134e, 0x009480d0, 0x002c6573}}}, + {X: Field{[10]uint32{0x036206fc, 0x0117b76c, 0x02e3db2f, 0x0190df65, 0x000525d8, 0x016a7638, 0x0362979c, 0x008f5c58, 0x03e40c7e, 0x0028db93}}, Y: Field{[10]uint32{0x02844751, 0x0158d799, 0x02707c74, 0x027da5e9, 0x00034669, 0x0020ce69, 0x0270de87, 0x0236d2a2, 0x03850a42, 0x0015ab39}}}, + {X: Field{[10]uint32{0x003cac9a, 0x0135de3d, 0x00402344, 0x035fa219, 0x0085b877, 0x0289253d, 0x021b61d5, 0x01046175, 0x03e7a2c5, 0x0025e192}}, Y: Field{[10]uint32{0x01f2ff69, 0x023b68ae, 0x000ab013, 0x00a1c6e6, 0x003a6c54, 0x03a4f9c7, 0x01dcd900, 0x020e4554, 0x0278a85b, 0x0010ccca}}}, + {X: Field{[10]uint32{0x0119893e, 0x03ae65a1, 0x02458b74, 0x01057fc0, 0x03daa7ca, 0x0177351f, 0x02c92c84, 0x03ba9b68, 0x01bf2449, 0x000d294b}}, Y: Field{[10]uint32{0x0303ece4, 0x00151ff8, 0x001b9427, 0x00d5a675, 0x03b3545a, 0x007ceec8, 0x03a8d552, 0x009b27de, 0x0029900f, 0x002b7506}}}, + {X: Field{[10]uint32{0x03f3d629, 0x037a298b, 0x02fcf5af, 0x02ede67d, 0x030d8bdb, 0x018c7d6e, 0x037b2b48, 0x02985d7e, 0x03a994ee, 0x0038942a}}, Y: Field{[10]uint32{0x0143b0ea, 0x02f60da0, 0x01757409, 0x03b02ffc, 0x022e92c4, 0x02254c3e, 0x00b6fae6, 0x03ea182f, 0x00f59db0, 0x00200fcd}}}, + {X: Field{[10]uint32{0x0071ae00, 0x026b8a6e, 0x02372086, 0x00bb8eca, 0x02795304, 0x01563845, 0x009347a4, 0x011b8845, 0x026d0b59, 0x00060d5a}}, Y: Field{[10]uint32{0x015385cb, 0x03a6aee6, 0x01f08f19, 0x008eea30, 0x000ba6de, 0x032849f1, 0x0398ec8d, 0x01be0787, 0x01716b17, 0x0015bbc2}}}, + {X: Field{[10]uint32{0x00205533, 0x033caa44, 0x0288eed3, 0x035bdcf5, 0x02ca5932, 0x0030a795, 0x025ef3f3, 0x0182100d, 0x03f5e530, 0x000d6a3a}}, Y: Field{[10]uint32{0x03259958, 0x0061481f, 0x018c453a, 0x03570b41, 0x0220d30f, 0x02b69d67, 0x01410325, 0x0153788f, 0x01950429, 0x0027ab97}}}, + {X: Field{[10]uint32{0x02a4e1b9, 0x014107f9, 0x007bda70, 0x02427292, 0x037b3dbe, 0x014ea597, 0x0062b920, 0x023fa7aa, 0x02f525ea, 0x0000df81}}, Y: Field{[10]uint32{0x03ceb97c, 0x015fed87, 0x020d703f, 0x01a3f73d, 0x003f2f65, 0x00686650, 0x0313b604, 0x026fa88f, 0x03d35e48, 0x0020e467}}}, + {X: Field{[10]uint32{0x02131c27, 0x037b0657, 0x007131a4, 0x0119c636, 0x01483166, 0x03929bff, 0x00629476, 0x0000bc44, 0x0297ac6c, 0x002aeef9}}, Y: Field{[10]uint32{0x012f9dcb, 0x01c55cac, 0x00300929, 0x01126a92, 0x02fd7049, 0x0083abd3, 0x00d8a24a, 0x008bfdfe, 0x02cb9d51, 0x002cb249}}}, + {X: Field{[10]uint32{0x01b05878, 0x0161691a, 0x0204368a, 0x00dabab2, 0x015a1a36, 0x022454c5, 0x0029c8b7, 0x03730fdf, 0x02cb1484, 0x00137cda}}, Y: Field{[10]uint32{0x0241c41d, 0x0308379a, 0x02d09d4f, 0x012edff3, 0x00aa059f, 0x0255914d, 0x00417fb1, 0x03c098ff, 0x026fc08a, 0x003f85bf}}}, + {X: Field{[10]uint32{0x0399d0d7, 0x01f4a6f9, 0x0073123a, 0x018371f1, 0x03c8f49c, 0x02f6bdab, 0x01570e5e, 0x01a82a22, 0x02e31025, 0x0017fc53}}, Y: Field{[10]uint32{0x03e65d7b, 0x0074af3d, 0x010d8989, 0x01b15b3f, 0x0295382d, 0x02b66146, 0x02a923ee, 0x00beb23c, 0x013855eb, 0x0025bfc5}}}, + {X: Field{[10]uint32{0x015d119a, 0x00b7a8a1, 0x028104f6, 0x0320dabd, 0x02a24dba, 0x01eadc61, 0x01281a1b, 0x008bd1e4, 0x0052c1d4, 0x0005a84b}}, Y: Field{[10]uint32{0x00c17478, 0x0205c8c9, 0x03b2ab3a, 0x03d01838, 0x01d36a4b, 0x02eeaaea, 0x0196cb38, 0x015b791a, 0x0272f673, 0x001e9bbc}}}, + {X: Field{[10]uint32{0x01489ef5, 0x0003fea8, 0x00eda606, 0x02b2fa91, 0x0005fcdb, 0x03f559f9, 0x00b3d154, 0x02248292, 0x00338368, 0x0023d327}}, Y: Field{[10]uint32{0x03885717, 0x015932b6, 0x01b4e37d, 0x035232ee, 0x01a4b0ab, 0x018a78b9, 0x03c0082d, 0x01131eca, 0x004de064, 0x000aed6f}}}, + {X: Field{[10]uint32{0x02b83310, 0x035b4aaa, 0x017776ab, 0x00bf417d, 0x0219236d, 0x0140e672, 0x00ca399e, 0x01c04215, 0x039b0754, 0x001262fc}}, Y: Field{[10]uint32{0x02fd691c, 0x0394699a, 0x01d0c4dd, 0x0118b0d5, 0x02b5edcd, 0x0291752e, 0x007beb58, 0x0238daf3, 0x03ff0cb5, 0x00238b7a}}}, + {X: Field{[10]uint32{0x02fb5996, 0x01b84dbb, 0x01c1171e, 0x024047a2, 0x022ba51d, 0x012560cd, 0x02247d17, 0x034e5ac8, 0x020a2978, 0x001e051f}}, Y: Field{[10]uint32{0x03f85989, 0x00c349c3, 0x01fd41d8, 0x03d6e2c1, 0x004c75bf, 0x03ad1043, 0x01bf0fb2, 0x01986f9c, 0x030ca73b, 0x00299ade}}}, + {X: Field{[10]uint32{0x028d4927, 0x035df760, 0x01f663f4, 0x028b85ab, 0x0047e112, 0x00b7c012, 0x037aea1d, 0x01b1f951, 0x00d9fb23, 0x000d44a6}}, Y: Field{[10]uint32{0x00fe00f9, 0x00ab2077, 0x03f2067f, 0x035161e3, 0x01241094, 0x01862b94, 0x01c3884e, 0x008ea745, 0x01af8b6f, 0x001b2724}}}, + {X: Field{[10]uint32{0x02399d10, 0x00af2f85, 0x00a67a34, 0x01a2797e, 0x01c18146, 0x0121526b, 0x00ffc148, 0x01827093, 0x000c88fb, 0x003ed7ff}}, Y: Field{[10]uint32{0x00229ab3, 0x011b97ee, 0x00a0946f, 0x02472217, 0x0088cf57, 0x03a4ba5e, 0x03eff328, 0x02532e43, 0x013f9ced, 0x002a6578}}}, + {X: Field{[10]uint32{0x0032097b, 0x0293e812, 0x036b36c7, 0x0251df35, 0x0089565e, 0x00372aa8, 0x03bd1974, 0x027175c5, 0x03c44cc0, 0x0020d4ad}}, Y: Field{[10]uint32{0x010fe6bc, 0x02bdb1df, 0x01e236f8, 0x02ada531, 0x00f91c8f, 0x01dd2b9a, 0x018ca786, 0x0097641d, 0x019800fa, 0x002541f2}}}, + {X: Field{[10]uint32{0x01919f4a, 0x00104561, 0x0140bd82, 0x036d8ab6, 0x015d5ed1, 0x02ec7165, 0x01014d76, 0x009d1b5b, 0x000f273a, 0x0006f997}}, Y: Field{[10]uint32{0x0009a3f2, 0x0368d657, 0x03552da3, 0x00f202c8, 0x00f044e9, 0x03be0eba, 0x01470a83, 0x03e0e68f, 0x03302a38, 0x0036b263}}}, + {X: Field{[10]uint32{0x0358418e, 0x017e6302, 0x003a7ed6, 0x0227afdd, 0x008de14d, 0x03a003d9, 0x0365037a, 0x03889fba, 0x03a52f4b, 0x001c41fc}}, Y: Field{[10]uint32{0x01fca7a4, 0x01a9d29a, 0x00e6069f, 0x03caa857, 0x01927b2d, 0x023bab91, 0x00e429d1, 0x03cc9f45, 0x0009bd1a, 0x002ff3c7}}}, + {X: Field{[10]uint32{0x03312e3e, 0x00125ce5, 0x00cff9dd, 0x03300293, 0x00983389, 0x02c7e766, 0x0254a133, 0x02b96c73, 0x004be8ed, 0x000045ca}}, Y: Field{[10]uint32{0x0212b03d, 0x02d170e0, 0x01539638, 0x01de1b98, 0x0084e3af, 0x0321342e, 0x03519994, 0x03b5262f, 0x001e724f, 0x00247923}}}, + {X: Field{[10]uint32{0x000de54e, 0x02d129ec, 0x015ded31, 0x02db1f99, 0x0041c243, 0x0226d9c5, 0x01f1cd0d, 0x026ad194, 0x02deb1ff, 0x00282361}}, Y: Field{[10]uint32{0x030f0d2f, 0x0098a720, 0x0012c0ec, 0x03530b6f, 0x01a72ed8, 0x01d33252, 0x0364feef, 0x00e7455d, 0x03f6344d, 0x001343f9}}}, + {X: Field{[10]uint32{0x00e8c25f, 0x023b2d69, 0x015503f7, 0x00cf79c4, 0x0098cfc6, 0x02352282, 0x032cbf36, 0x01062bbb, 0x01cedf67, 0x00271130}}, Y: Field{[10]uint32{0x01e743fa, 0x01936f8c, 0x0335f81f, 0x01b79306, 0x03de3d3c, 0x03e61c30, 0x01a959b9, 0x03c258c7, 0x002086d3, 0x000f3688}}}, + {X: Field{[10]uint32{0x0339f149, 0x00ce2c88, 0x02319250, 0x012694ab, 0x00f85979, 0x03c935c5, 0x03118da6, 0x030196ea, 0x00755215, 0x00364cf9}}, Y: Field{[10]uint32{0x00baec45, 0x01f5bf22, 0x01dcb054, 0x00e74bc6, 0x030e277e, 0x012604a1, 0x03abfa60, 0x03c13778, 0x028e313a, 0x0017ec3c}}}, + {X: Field{[10]uint32{0x008a42cb, 0x003c74c6, 0x015ff63c, 0x014d96ab, 0x024c2f9e, 0x03c90ef1, 0x00105289, 0x014cb288, 0x0197ddd0, 0x001ff87c}}, Y: Field{[10]uint32{0x02472af7, 0x0159e3ff, 0x02c7cd3f, 0x02b1ae8a, 0x01a9ec6b, 0x015879d7, 0x03618286, 0x024863b8, 0x033fa186, 0x00204ec4}}}, + {X: Field{[10]uint32{0x0107f79c, 0x02ae54b1, 0x0151a96a, 0x02bacf5d, 0x037ba412, 0x00b71b55, 0x010789c7, 0x008409eb, 0x01218961, 0x0038d5a1}}, Y: Field{[10]uint32{0x023e3a30, 0x01919690, 0x029a8496, 0x00533579, 0x017d8201, 0x0377d351, 0x01fe225e, 0x02a2b2b9, 0x01058e2c, 0x001d9171}}}, + {X: Field{[10]uint32{0x02ebece4, 0x03b3e0ad, 0x0380d146, 0x020ee089, 0x00c667a1, 0x02daa768, 0x02bcefc3, 0x01128aaf, 0x01468a56, 0x00315abf}}, Y: Field{[10]uint32{0x00f1a8d4, 0x018d7e55, 0x01e750cc, 0x005071a4, 0x022915ba, 0x01a19526, 0x03c587cb, 0x00a11227, 0x0255a80e, 0x00279071}}}, + {X: Field{[10]uint32{0x01589345, 0x0347c9a8, 0x02d5600a, 0x023f46af, 0x01440f9f, 0x00257c38, 0x036042e1, 0x02a3c1ce, 0x033960e6, 0x002c90ba}}, Y: Field{[10]uint32{0x036dfde0, 0x00107961, 0x01ca4bb5, 0x02b7a11a, 0x00378579, 0x025bca8d, 0x002decb6, 0x03c280d8, 0x036df063, 0x00251369}}}, + {X: Field{[10]uint32{0x023bb827, 0x01ec41cc, 0x03d42af5, 0x029ad70e, 0x0378f835, 0x0339a1c0, 0x00a43f2f, 0x00b8ba22, 0x01666d2e, 0x000e94bf}}, Y: Field{[10]uint32{0x03af91c7, 0x0136a669, 0x034cc487, 0x035b4390, 0x020096c7, 0x023d3ca7, 0x015cea01, 0x01e9189d, 0x0177a7b3, 0x0004b944}}}, + {X: Field{[10]uint32{0x00d28f53, 0x01deba89, 0x026cf708, 0x03f8259e, 0x034a71c0, 0x0262a31a, 0x03072d25, 0x006b4451, 0x0215c883, 0x002ddf55}}, Y: Field{[10]uint32{0x02bf3132, 0x02318d27, 0x011760d1, 0x030cdaa3, 0x01f5cff2, 0x03de4d81, 0x02df83d5, 0x0299977a, 0x03cfa068, 0x0009756d}}}, + {X: Field{[10]uint32{0x008530dc, 0x0260da70, 0x0214d798, 0x013d3fde, 0x03f23d22, 0x0109aa89, 0x03847288, 0x00d6a14d, 0x003b61e4, 0x00391083}}, Y: Field{[10]uint32{0x00ca8572, 0x034b213b, 0x019a7f7c, 0x02a626c4, 0x029b3c67, 0x01622b65, 0x02bd74e1, 0x0212e66f, 0x00b48579, 0x00108ac1}}}, + {X: Field{[10]uint32{0x030aaaea, 0x00204158, 0x007cecae, 0x011262b4, 0x01236e3c, 0x01853ec0, 0x020fadda, 0x00a678ee, 0x01bfc6ab, 0x002222ff}}, Y: Field{[10]uint32{0x0370eb3c, 0x03d1dccd, 0x03453f06, 0x032761c4, 0x037ada97, 0x006a3d02, 0x00fb94aa, 0x0396018a, 0x013d58cf, 0x0021b9c9}}}, + {X: Field{[10]uint32{0x00ef419c, 0x01310d84, 0x02cce8ef, 0x00b52185, 0x000d850f, 0x004e6059, 0x03de398a, 0x022cc376, 0x018bf7d7, 0x003dd349}}, Y: Field{[10]uint32{0x03029204, 0x029ffc94, 0x02c9dfca, 0x02db5233, 0x0205d60e, 0x02ec4b4c, 0x0332213c, 0x02b7f250, 0x01af1e6d, 0x00344f52}}}, + {X: Field{[10]uint32{0x00da6df0, 0x00504417, 0x00ae0679, 0x0352deb0, 0x0365cea0, 0x006e4895, 0x00097861, 0x00120e9c, 0x029098d6, 0x002a2ccf}}, Y: Field{[10]uint32{0x0121c553, 0x03ced44d, 0x01ddc650, 0x030194b2, 0x021182b6, 0x01bfd1d8, 0x032598e9, 0x0255ec45, 0x038cc08d, 0x00163308}}}, + {X: Field{[10]uint32{0x023ef1ff, 0x0251c286, 0x03cb8969, 0x02d96b84, 0x027a4a6c, 0x01286857, 0x01dbbe3d, 0x03eb6639, 0x01547477, 0x0016be2c}}, Y: Field{[10]uint32{0x016f25bf, 0x012c68df, 0x03672cc8, 0x0056dbbd, 0x033c0a8c, 0x019ba05c, 0x008fac13, 0x0060c8db, 0x0201d0c6, 0x001497b4}}}, + {X: Field{[10]uint32{0x03bec21c, 0x027ca780, 0x030bc811, 0x0196adff, 0x02fa71e6, 0x037e198a, 0x01143833, 0x01712887, 0x00546d4c, 0x00005571}}, Y: Field{[10]uint32{0x00411aae, 0x0259afd4, 0x036d0378, 0x020bb7bf, 0x03638422, 0x03f5c91f, 0x00eaefe8, 0x00461737, 0x03672f64, 0x00083a67}}}, + {X: Field{[10]uint32{0x0025a56e, 0x0019831d, 0x01473101, 0x00319ce3, 0x00c8fd7f, 0x02998ddc, 0x0022aea5, 0x00b59b9f, 0x0186ee18, 0x0014e461}}, Y: Field{[10]uint32{0x0056152e, 0x01636746, 0x0052fabc, 0x01e9c848, 0x00cdbf72, 0x01c2e249, 0x02564a1e, 0x03b075f8, 0x00923052, 0x0031ffa8}}}, + {X: Field{[10]uint32{0x03ad6414, 0x0262ee8e, 0x00d4f679, 0x03ca356b, 0x01cc52d7, 0x01dd03d3, 0x0004abba, 0x02dc59d2, 0x01d9a0fa, 0x003de593}}, Y: Field{[10]uint32{0x01f62c59, 0x02b20d22, 0x03ccb31c, 0x008bc6ef, 0x02d469a1, 0x03b04779, 0x03dc5c2a, 0x03d8339e, 0x0364aba0, 0x001aa627}}}, + {X: Field{[10]uint32{0x01663183, 0x0167b6f3, 0x0258e720, 0x038ad6c5, 0x02ffd72e, 0x00c9f1bb, 0x000a909b, 0x03cb79e2, 0x008af514, 0x001d0723}}, Y: Field{[10]uint32{0x0087b2ae, 0x00915129, 0x01b49012, 0x00c7edbf, 0x02e40b6b, 0x022bf9cd, 0x013532d4, 0x00518371, 0x036de5de, 0x003cd749}}}, + {X: Field{[10]uint32{0x0347945a, 0x03e20d62, 0x037e9b2e, 0x03c4c485, 0x02606e55, 0x01bbd3c8, 0x02ea9f12, 0x028a2bf1, 0x01bf6cc2, 0x0037a31a}}, Y: Field{[10]uint32{0x00a48a02, 0x017292d0, 0x0052c8b8, 0x0108ec72, 0x0270d847, 0x013fdc19, 0x00e2fecb, 0x035851e0, 0x00536900, 0x0023798a}}}, + {X: Field{[10]uint32{0x0357c537, 0x0163a8db, 0x006afcd0, 0x03f66a11, 0x01d6a8d5, 0x00f7404d, 0x02523b2d, 0x02d07362, 0x0339619b, 0x0020785b}}, Y: Field{[10]uint32{0x03f4b31e, 0x0170996e, 0x0032f239, 0x0135f6eb, 0x00375c43, 0x01477bb1, 0x006de9b9, 0x03b32b45, 0x00737cd2, 0x0019e1bf}}}, + {X: Field{[10]uint32{0x026f988d, 0x008eab9e, 0x01a20f01, 0x00122ac8, 0x02e70f7f, 0x01c96cc2, 0x01625b8a, 0x02c8ba31, 0x0189d079, 0x001167a5}}, Y: Field{[10]uint32{0x03f38e08, 0x01fa310c, 0x0112ee76, 0x0069155d, 0x00915de2, 0x030d41b3, 0x02d26acc, 0x028a4b12, 0x02935b71, 0x00295bb7}}}, + {X: Field{[10]uint32{0x028ebddd, 0x013ce161, 0x03758228, 0x014746ae, 0x01f2e5bb, 0x01c2d3ab, 0x0018806a, 0x029ffc82, 0x03554fab, 0x002c1e75}}, Y: Field{[10]uint32{0x0274dffe, 0x016dc07f, 0x001dcfcf, 0x03115d18, 0x0120b6c0, 0x0390d3ea, 0x00f65773, 0x005d2c84, 0x002d552f, 0x00125777}}}, + {X: Field{[10]uint32{0x034f288b, 0x02af4b19, 0x00100569, 0x005cfc17, 0x00bb30af, 0x0356c42d, 0x0180de1d, 0x03ec8505, 0x03bb5983, 0x001d4e46}}, Y: Field{[10]uint32{0x02958d67, 0x0292bdf7, 0x0080db58, 0x00d347c7, 0x02b319f5, 0x004d694a, 0x026032f2, 0x012ae7ad, 0x02bac915, 0x0015f1e9}}}, + {X: Field{[10]uint32{0x01524db4, 0x02784d90, 0x03e7d5a8, 0x03dccbf2, 0x035bda94, 0x013f1a47, 0x0061069e, 0x023dd7f1, 0x0157f284, 0x001c50da}}, Y: Field{[10]uint32{0x033f0007, 0x014476f7, 0x0224fe92, 0x016973bc, 0x0195658a, 0x006e4f20, 0x022813c5, 0x02b75596, 0x0052ef4f, 0x0004a1fe}}}, + {X: Field{[10]uint32{0x01543f9c, 0x03263c50, 0x037853b7, 0x01adc9e7, 0x0094ad07, 0x00965c3b, 0x00c74c9e, 0x03425c37, 0x0333fa75, 0x002e40e2}}, Y: Field{[10]uint32{0x03cf838e, 0x01c2ac36, 0x02660734, 0x03cf5bd9, 0x02af59ce, 0x038e7235, 0x03c1bf48, 0x017b40fe, 0x01696929, 0x0028a30c}}}, + {X: Field{[10]uint32{0x01f86196, 0x022bc5e9, 0x034b083b, 0x02e759f0, 0x03f259bd, 0x01b6f832, 0x00664e63, 0x036403ef, 0x0028a9fb, 0x002cb18f}}, Y: Field{[10]uint32{0x0149ebdd, 0x0040fbb3, 0x012b0ee7, 0x008dbd70, 0x01b79207, 0x02544329, 0x03084218, 0x018f119c, 0x00fc069c, 0x002a3c14}}}, + {X: Field{[10]uint32{0x0017f39c, 0x00b31e89, 0x0128a5c9, 0x011bce3a, 0x01d06bf3, 0x03edf1e1, 0x027edfad, 0x008657d2, 0x01bea32b, 0x003374a9}}, Y: Field{[10]uint32{0x03fa621b, 0x02b775ad, 0x01f04d2d, 0x01320e0a, 0x02213386, 0x00ace02b, 0x0203ee72, 0x0070d80c, 0x0278ac42, 0x0002ad9b}}}, + {X: Field{[10]uint32{0x033db80f, 0x033e9867, 0x01c39780, 0x0031c93e, 0x01a27d74, 0x0220e3b1, 0x02f03a82, 0x029cdeb3, 0x0064b079, 0x00209742}}, Y: Field{[10]uint32{0x021071d3, 0x01c866d1, 0x02b43a87, 0x02b6f0b8, 0x01c2154f, 0x03817ae9, 0x027e427f, 0x011299fc, 0x00b7749e, 0x002fcfba}}}, + {X: Field{[10]uint32{0x035e24c7, 0x02e243ef, 0x02218608, 0x01dfc2c3, 0x01d0c364, 0x027d338f, 0x02930a87, 0x03d00b25, 0x023cbf6b, 0x000dede7}}, Y: Field{[10]uint32{0x00f66f1d, 0x016b40c4, 0x02e29204, 0x02cbdec3, 0x00c32a5b, 0x0084f0bc, 0x010ff4c9, 0x018c2e82, 0x02c7cec5, 0x00365c50}}}, + {X: Field{[10]uint32{0x012b6135, 0x008b0cd5, 0x039d8aed, 0x003beec1, 0x0389560b, 0x02d14baf, 0x01105bf5, 0x029d7502, 0x02d0678e, 0x003ee992}}, Y: Field{[10]uint32{0x011f938c, 0x00f02c83, 0x03e3bdf6, 0x0065f5b6, 0x035c628f, 0x02a01ab5, 0x01dd8441, 0x00dea2a1, 0x022de4e6, 0x0039994d}}}, + {X: Field{[10]uint32{0x00d9cf72, 0x028fe5fb, 0x027a859e, 0x0034610c, 0x03d3bd49, 0x021311db, 0x004897de, 0x034dbe76, 0x038e077e, 0x001d9e1e}}, Y: Field{[10]uint32{0x0180a9b3, 0x0336508e, 0x00158210, 0x022ccf59, 0x00e3ba22, 0x0075e37f, 0x0126011d, 0x00e30f30, 0x03141a3f, 0x00033de7}}}, + {X: Field{[10]uint32{0x00157b31, 0x00694340, 0x03e8a369, 0x02790be7, 0x01f16a12, 0x01986954, 0x026ba1c5, 0x028cd217, 0x01d0ffb3, 0x0009aeaf}}, Y: Field{[10]uint32{0x002c530d, 0x0101cb63, 0x008eee4c, 0x01c49fb7, 0x02e66a6c, 0x0080dc2c, 0x0266e33a, 0x00691bed, 0x02e2b1cf, 0x0006ce92}}}, + {X: Field{[10]uint32{0x0376307a, 0x000c75a7, 0x02008c1b, 0x03c8d811, 0x007ca4d3, 0x01dca7ca, 0x02aa8640, 0x0287a5e9, 0x03b77a2f, 0x00056bb6}}, Y: Field{[10]uint32{0x03073649, 0x033f65bf, 0x00788a6d, 0x01e14d53, 0x03f94088, 0x03017cda, 0x01746439, 0x008d81a9, 0x0142bf8b, 0x000cd0a8}}}, + {X: Field{[10]uint32{0x026fe467, 0x0003d5d1, 0x01fb3de1, 0x02837f79, 0x01c2b072, 0x01bbd330, 0x00d5767c, 0x03353f7d, 0x00a39bb7, 0x00263b38}}, Y: Field{[10]uint32{0x03227e28, 0x03d18faa, 0x02bba6f4, 0x00a5a829, 0x021e679d, 0x00e555b1, 0x0029d0f8, 0x024f9fae, 0x00a8218c, 0x00313a49}}}, + {X: Field{[10]uint32{0x03f373a9, 0x026daa0f, 0x03304198, 0x028becc8, 0x018a48cd, 0x0019eedc, 0x01ffafab, 0x00fbb533, 0x0105fc21, 0x001f619d}}, Y: Field{[10]uint32{0x0097d47c, 0x027bdd5f, 0x00c1b919, 0x03e233a8, 0x0096e167, 0x01290053, 0x03c417ef, 0x0081e065, 0x03f03c21, 0x00177d47}}}, + {X: Field{[10]uint32{0x01b3001f, 0x02dce8a5, 0x0117f410, 0x012275db, 0x02bf269a, 0x02c03578, 0x03ece8b7, 0x02387ef8, 0x01d74357, 0x003c93c6}}, Y: Field{[10]uint32{0x0223631f, 0x014d89c1, 0x0020d53e, 0x011d4520, 0x0116d2b5, 0x00d3d31e, 0x0048bbbb, 0x022d99ec, 0x03ff5544, 0x00191290}}}, + {X: Field{[10]uint32{0x000efd59, 0x0374ef20, 0x0227b923, 0x007480e6, 0x021fd106, 0x0352fa88, 0x0111281e, 0x00a5b87a, 0x03045c22, 0x0024e14c}}, Y: Field{[10]uint32{0x03eb7040, 0x03f9a662, 0x011628c2, 0x0087a7eb, 0x022607da, 0x01332417, 0x0399bbfe, 0x00b4543d, 0x00f600cd, 0x0008a623}}}, + {X: Field{[10]uint32{0x02319743, 0x014c7251, 0x01f0daf1, 0x03b2625f, 0x01b91ff4, 0x039349a1, 0x03b14ee8, 0x013c5894, 0x03053983, 0x003c2431}}, Y: Field{[10]uint32{0x000bd522, 0x0160d04a, 0x02d2abf1, 0x02326bce, 0x0228c59c, 0x014e80ad, 0x0208391f, 0x009c76a2, 0x00851d30, 0x003045c6}}}, + {X: Field{[10]uint32{0x02a78c6e, 0x01b34fbf, 0x038e67fb, 0x0022a401, 0x000df9bb, 0x00aa3abf, 0x00234aeb, 0x03cedd28, 0x00ecab5b, 0x0003a3f2}}, Y: Field{[10]uint32{0x02ddabe5, 0x001eca09, 0x035c29b0, 0x002d2439, 0x01a8397c, 0x018b829d, 0x02fcd713, 0x026edd1b, 0x016534ce, 0x00002c20}}}, + {X: Field{[10]uint32{0x03126785, 0x02835c67, 0x03aa09b0, 0x02eb200c, 0x03c7426d, 0x012bcdf8, 0x003cef69, 0x010f9cc0, 0x00d187cb, 0x00118963}}, Y: Field{[10]uint32{0x01ad4fc4, 0x02b48dd5, 0x006d4601, 0x02fdc20b, 0x0175576e, 0x030da608, 0x00dd82e2, 0x002089d9, 0x01a75f06, 0x00211850}}}, + {X: Field{[10]uint32{0x00a3e430, 0x02fb9ab3, 0x037a1e65, 0x03cd17e6, 0x0394109b, 0x010cd042, 0x01d27c3f, 0x021fbd4a, 0x033bdb38, 0x0039fce2}}, Y: Field{[10]uint32{0x02cd589f, 0x02b0d24a, 0x00f8109f, 0x02deb6f2, 0x00ab1faf, 0x02c1fa2b, 0x02dec0c0, 0x031c0a42, 0x00f15eae, 0x003d4910}}}, + {X: Field{[10]uint32{0x03537aec, 0x02c0e94b, 0x0062eda5, 0x019fdcff, 0x02fa9a01, 0x007d5a76, 0x03d5b750, 0x01e635d7, 0x00331472, 0x000b4a7a}}, Y: Field{[10]uint32{0x012d2be6, 0x025dba5e, 0x00001d18, 0x017d688c, 0x03d9e2f5, 0x00164d80, 0x03c58cfc, 0x02e7ea85, 0x011ab117, 0x0014b4f7}}}, + {X: Field{[10]uint32{0x0091ffb6, 0x025f470e, 0x03c7c8ac, 0x0291be50, 0x00f47609, 0x01d54b76, 0x03b44c9c, 0x029edddf, 0x009cabf7, 0x0028ecbb}}, Y: Field{[10]uint32{0x00fc19de, 0x0272efcf, 0x03417d55, 0x01856c06, 0x024d5280, 0x00a96b59, 0x00933852, 0x00e07d4c, 0x0070f091, 0x001b38e3}}}, + {X: Field{[10]uint32{0x0100f473, 0x03d974cc, 0x03015a21, 0x01896150, 0x026cefe7, 0x02cf46a3, 0x02504dda, 0x0295b039, 0x001e7582, 0x002bf2cf}}, Y: Field{[10]uint32{0x03171af8, 0x029db1a2, 0x004a38e5, 0x021d5ecb, 0x0367edbd, 0x03864c40, 0x02afc618, 0x02126629, 0x039dfbeb, 0x001aebc7}}}, + {X: Field{[10]uint32{0x010e2ac8, 0x00d58976, 0x006eccdd, 0x0129242e, 0x026650f7, 0x0119aa30, 0x022bbea9, 0x02559efd, 0x0212dc89, 0x00222cbc}}, Y: Field{[10]uint32{0x018c30a5, 0x01629934, 0x0208e7e4, 0x010b6652, 0x026ecd6c, 0x0285c8f8, 0x036d4f5d, 0x0054ff5f, 0x017bdef6, 0x001cff5d}}}, + {X: Field{[10]uint32{0x01adef3c, 0x02646f87, 0x000d493d, 0x01157125, 0x03395c59, 0x0369a8a9, 0x01c971d7, 0x00a45994, 0x029f4ca3, 0x0002ff7a}}, Y: Field{[10]uint32{0x01bc20d8, 0x02d93608, 0x00a17578, 0x01947db5, 0x004166bc, 0x02e01df3, 0x000adea5, 0x03da1108, 0x00447ef3, 0x00209d1c}}}, + {X: Field{[10]uint32{0x00973ae5, 0x00d91fb9, 0x0265b521, 0x0298f593, 0x00e8fdf6, 0x01247b3c, 0x012e3869, 0x0175a729, 0x0381aa76, 0x00175172}}, Y: Field{[10]uint32{0x03d019db, 0x03e0ac4b, 0x022bdb17, 0x03f8f2be, 0x00fdab36, 0x0040e9f7, 0x03517e7c, 0x01b5dddc, 0x032b51a7, 0x00292928}}}, + {X: Field{[10]uint32{0x02e7109d, 0x0019d4de, 0x033ae87d, 0x0249174b, 0x036d6fe0, 0x0310f976, 0x034fa531, 0x026652a8, 0x03cee14e, 0x003ce940}}, Y: Field{[10]uint32{0x03ec49e8, 0x0157957c, 0x01785ac5, 0x02e81cc9, 0x03568aa5, 0x006546d8, 0x0322daad, 0x0142d081, 0x00c0a24d, 0x000ac5c5}}}, + {X: Field{[10]uint32{0x00cbeeb5, 0x01ab78e2, 0x012d9b66, 0x014cdf47, 0x02042619, 0x02e39ae2, 0x00c225ea, 0x00bb4915, 0x036d6f81, 0x002530e9}}, Y: Field{[10]uint32{0x03a953e3, 0x0358e87b, 0x0104cbc8, 0x03eb59b8, 0x023d1351, 0x02fc6062, 0x00893b95, 0x019d1b75, 0x02e6aa40, 0x002ee273}}}, + {X: Field{[10]uint32{0x00f4c050, 0x0242323c, 0x02a3cc0c, 0x03446077, 0x01b9a2d3, 0x007f696f, 0x015a6625, 0x00900ce7, 0x02810523, 0x0008f6ff}}, Y: Field{[10]uint32{0x01eae6b2, 0x016e12d3, 0x036794e4, 0x0267502a, 0x00b5c168, 0x01e7b439, 0x00f8385c, 0x0043bd22, 0x0271229f, 0x0032bbce}}}, + {X: Field{[10]uint32{0x00bbf1d2, 0x00a7b1ab, 0x03b88e46, 0x03286d2e, 0x01d2dcbe, 0x015e4d7d, 0x01dc69dc, 0x02186704, 0x03d120ef, 0x000e41f8}}, Y: Field{[10]uint32{0x0015e853, 0x02611185, 0x00055ba2, 0x02f16288, 0x00e6aad1, 0x0324da11, 0x017b0a60, 0x00ae7730, 0x02b7d74e, 0x0010e3e5}}}, + {X: Field{[10]uint32{0x032b7d9c, 0x03c17859, 0x00b710e6, 0x012ccde2, 0x01651c94, 0x0101fd64, 0x02a6a373, 0x0013f602, 0x03193eeb, 0x00030502}}, Y: Field{[10]uint32{0x01e44072, 0x001dee4a, 0x02e641f7, 0x03bd0c34, 0x03899450, 0x001d8ed8, 0x01fef6b7, 0x01150e75, 0x011559e2, 0x002526ff}}}, + {X: Field{[10]uint32{0x032ea56c, 0x02951f83, 0x028d1740, 0x02dac1b8, 0x002563c3, 0x00c3dd79, 0x012fe269, 0x00e72077, 0x005bc96a, 0x0025df3c}}, Y: Field{[10]uint32{0x02a10d52, 0x03039ae6, 0x02dc0e70, 0x01e0daa7, 0x0307e158, 0x01b291a2, 0x0295e234, 0x005930db, 0x023a8508, 0x0000e00b}}}, + {X: Field{[10]uint32{0x00a034e3, 0x009ec836, 0x003761e8, 0x02ce7b8f, 0x02795a7b, 0x039395fd, 0x0151e5a9, 0x0383532b, 0x00d63995, 0x00041a70}}, Y: Field{[10]uint32{0x027fe33b, 0x03065316, 0x028041d2, 0x02b1e23f, 0x0047963a, 0x02aed792, 0x01d89c47, 0x01319560, 0x00879c0e, 0x00386a85}}}, + {X: Field{[10]uint32{0x013e3682, 0x02096cf2, 0x0245bba3, 0x03d4d49e, 0x0142419a, 0x0138a9d5, 0x03ab10c7, 0x010607fc, 0x0280c341, 0x003fde31}}, Y: Field{[10]uint32{0x00d3615e, 0x0128dd89, 0x0256e1fc, 0x01d37cbc, 0x0186c8c5, 0x002cb6fb, 0x032382e2, 0x0243cdda, 0x02dbf053, 0x003badc2}}}, + {X: Field{[10]uint32{0x02bcddc7, 0x01abf661, 0x03d05905, 0x01af570d, 0x002b0cb2, 0x020e29a8, 0x004c3ff5, 0x00f5aa70, 0x03033acd, 0x0017b27a}}, Y: Field{[10]uint32{0x032aff03, 0x0099d25c, 0x01c8b9ae, 0x02d230ea, 0x03e39d92, 0x03651170, 0x000bed1e, 0x0037c05f, 0x03f60eed, 0x0024a8a1}}}, + {X: Field{[10]uint32{0x031b37d1, 0x0363b211, 0x03ee9339, 0x01369f71, 0x00bef0a5, 0x0236f1fa, 0x0267e14d, 0x034d2dfb, 0x02ba792d, 0x003aa881}}, Y: Field{[10]uint32{0x011ee92e, 0x0041f1a3, 0x025e2695, 0x008475e3, 0x0355e00d, 0x01030585, 0x02f2530c, 0x027281ff, 0x025ebe71, 0x00155df9}}}, + {X: Field{[10]uint32{0x00eb3ed7, 0x014abf43, 0x03f54af9, 0x023b4f61, 0x02689ef0, 0x01573be8, 0x036789d4, 0x0004a8f5, 0x02f56034, 0x0009b418}}, Y: Field{[10]uint32{0x01323424, 0x02d60db4, 0x011094e7, 0x02896b3a, 0x01dbe6fa, 0x00347db7, 0x00340c5f, 0x0161de67, 0x01acef6f, 0x0017bfc7}}}, + {X: Field{[10]uint32{0x02602d48, 0x03c89c47, 0x03bd1492, 0x03e70d06, 0x021a2413, 0x0047b6a3, 0x009e449d, 0x02d8a93d, 0x015ae50d, 0x00200350}}, Y: Field{[10]uint32{0x0002eb50, 0x0255fd5f, 0x036fbdc5, 0x0039d580, 0x03d5c8cb, 0x0344b67c, 0x019ec5cf, 0x026d748a, 0x016d05d1, 0x0015a72b}}}, + {X: Field{[10]uint32{0x009a1c90, 0x00f189e7, 0x006bb985, 0x02f83e16, 0x02e1531f, 0x0068859d, 0x03aaca5f, 0x0370665c, 0x0352bc16, 0x001b0068}}, Y: Field{[10]uint32{0x00cc04e7, 0x01cec63e, 0x027654c0, 0x034b5935, 0x01a39a17, 0x0095204e, 0x027226ab, 0x01a83c9d, 0x0342c959, 0x0020cf75}}}, + {X: Field{[10]uint32{0x03742c26, 0x01390c4d, 0x038e80a5, 0x02e3423b, 0x01f0b914, 0x01ce346b, 0x00e7c4d4, 0x03fc3141, 0x0122f1b3, 0x000eb332}}, Y: Field{[10]uint32{0x03cb0ad7, 0x0026b2c0, 0x00b1786a, 0x00620b84, 0x0152a2d1, 0x014aca5e, 0x00dee26c, 0x002cd0c1, 0x008327d6, 0x002aa735}}}, + {X: Field{[10]uint32{0x00f8ec72, 0x01c3fc74, 0x03edf2ec, 0x0307b9ba, 0x02f8d978, 0x03e398d4, 0x0380f753, 0x01cfc828, 0x0072828b, 0x002837d7}}, Y: Field{[10]uint32{0x00ac6670, 0x01ea27e9, 0x0230680d, 0x02dbac3b, 0x02b1327d, 0x01e79c8c, 0x02226893, 0x02f44c79, 0x01bef1e0, 0x002c8c2b}}}, + {X: Field{[10]uint32{0x03b52c73, 0x015ee5cc, 0x005a449d, 0x01c34ffe, 0x02d4bbc9, 0x01521971, 0x03a8dbbd, 0x03b26181, 0x01949776, 0x002757c3}}, Y: Field{[10]uint32{0x00afc1a8, 0x03a83c80, 0x02cf202c, 0x0055f446, 0x01ad7faf, 0x03d834d1, 0x038a056f, 0x00eb7552, 0x03baf489, 0x003fc23b}}}, + {X: Field{[10]uint32{0x01d3d84e, 0x03c8421b, 0x00917fb7, 0x02d699ce, 0x00228f54, 0x022947b2, 0x025b2935, 0x0208bb7a, 0x012d9ea1, 0x0037bd76}}, Y: Field{[10]uint32{0x008b3129, 0x01667b80, 0x0307a479, 0x002b5f00, 0x039d5bc2, 0x000affcd, 0x00d3ad02, 0x03af0c4e, 0x000db94a, 0x0002db1d}}}, + {X: Field{[10]uint32{0x00df33de, 0x010b9961, 0x03832736, 0x03c6e9ba, 0x03643fb0, 0x03d341d7, 0x007136c0, 0x035d38fe, 0x0105cdc8, 0x003ea42c}}, Y: Field{[10]uint32{0x00bba36d, 0x01e77a94, 0x00c273c0, 0x02494989, 0x003a180d, 0x003c3891, 0x029e852f, 0x023ae927, 0x00c373f5, 0x000f9aca}}}, + {X: Field{[10]uint32{0x03d0eb52, 0x02e33468, 0x02349575, 0x02ca5c1a, 0x01ce077c, 0x0353677e, 0x01c84613, 0x01ee4300, 0x0021ff2f, 0x002084ba}}, Y: Field{[10]uint32{0x003185f0, 0x0390ffdc, 0x02b5b8f8, 0x03b4b22b, 0x01d24bb5, 0x00d5018e, 0x0256e8f3, 0x039d5bf6, 0x01db2fa3, 0x00356701}}}, + {X: Field{[10]uint32{0x0061220d, 0x0362c83b, 0x00e49f9c, 0x02dcabed, 0x0124f155, 0x00074579, 0x01a641e1, 0x01c75d2c, 0x00c81d1f, 0x003b8d03}}, Y: Field{[10]uint32{0x02286f37, 0x020ce0ab, 0x01438f00, 0x007bd604, 0x0086f814, 0x02a3a2c1, 0x02fa7964, 0x017f5fc7, 0x033f2535, 0x00245760}}}, + {X: Field{[10]uint32{0x002afee1, 0x009bd951, 0x026b50aa, 0x0025fe0d, 0x02302b50, 0x02dc88f8, 0x00b257fb, 0x00f60dd0, 0x0125dd2e, 0x000b14d5}}, Y: Field{[10]uint32{0x021cf765, 0x01c9c4ed, 0x03947672, 0x01e5fdcf, 0x0292d43a, 0x03ced500, 0x038f9662, 0x02d9a13c, 0x014ef945, 0x00073514}}}, + {X: Field{[10]uint32{0x0267d94d, 0x026b517e, 0x00f2baae, 0x0075ba05, 0x03404b9e, 0x00a97e5d, 0x00a9083a, 0x028a233d, 0x03cf8b57, 0x0037ddd8}}, Y: Field{[10]uint32{0x01580ce2, 0x030ceb2c, 0x0309cb4f, 0x01706a49, 0x01bf0529, 0x00e23ba7, 0x02276bdd, 0x02d23184, 0x033631fd, 0x0013df70}}}, + {X: Field{[10]uint32{0x00dcee60, 0x0049a83b, 0x00da18fd, 0x023d3579, 0x038ff99b, 0x0335b418, 0x0374b928, 0x03c86044, 0x0240d6d0, 0x000d4530}}, Y: Field{[10]uint32{0x0197fca2, 0x00297190, 0x035cee53, 0x02c9c825, 0x02ac17ab, 0x01ddfb46, 0x018421c7, 0x02be00f2, 0x034a1a1b, 0x000a8347}}}, + {X: Field{[10]uint32{0x02e40a27, 0x012f4f1a, 0x0360a0b5, 0x016364d7, 0x00237a1b, 0x02d50755, 0x01de551a, 0x032e0653, 0x01d9e58b, 0x0000f79d}}, Y: Field{[10]uint32{0x01d97c75, 0x02cae349, 0x03ddc455, 0x036bf756, 0x033ec422, 0x01bc940d, 0x03ad8c48, 0x02c1631a, 0x00dbbe2d, 0x0026b685}}}, + {X: Field{[10]uint32{0x01e0420f, 0x0228229b, 0x005ddae2, 0x014bd40b, 0x0290ad3d, 0x0357ac70, 0x00144f81, 0x00d56f17, 0x020b1804, 0x0029ca33}}, Y: Field{[10]uint32{0x03ddad3d, 0x00f40051, 0x004f7ac9, 0x02e7b0cd, 0x0142cce3, 0x0215247f, 0x034893fa, 0x0146833e, 0x00a8f72b, 0x0010e1f3}}}, + {X: Field{[10]uint32{0x0151c39b, 0x00761d15, 0x0032e16c, 0x02aeaa50, 0x011d8234, 0x0140ea05, 0x03b22e02, 0x01130251, 0x028a05b8, 0x003b0f26}}, Y: Field{[10]uint32{0x02bd7fa6, 0x01790423, 0x03043382, 0x033ba0da, 0x00c8ac51, 0x013b7eba, 0x00845ca4, 0x03ea4d98, 0x00ef45f0, 0x001ec22f}}}, + {X: Field{[10]uint32{0x024761db, 0x023b1568, 0x02e9326a, 0x0333a61c, 0x03e619e7, 0x005d4cb3, 0x02b7e6c6, 0x016b2cee, 0x01562494, 0x002c05cf}}, Y: Field{[10]uint32{0x01f1b381, 0x0246b8c1, 0x0310d445, 0x03cc4c83, 0x0172a81d, 0x026372c4, 0x03eff121, 0x001d8743, 0x035f3e9a, 0x001e349e}}}, + {X: Field{[10]uint32{0x00cd73f6, 0x03658010, 0x023a7970, 0x0047e565, 0x034e04bd, 0x034e92e3, 0x03c3890e, 0x03722e5d, 0x03f3cd43, 0x00367ace}}, Y: Field{[10]uint32{0x03b23044, 0x016cbf58, 0x01c41e7f, 0x039326da, 0x000510b9, 0x02314012, 0x01db7189, 0x020228fc, 0x035cc42e, 0x0026065a}}}, + {X: Field{[10]uint32{0x01a84e74, 0x01530219, 0x03f107ca, 0x02c07009, 0x0029bbf1, 0x007e4ace, 0x02026062, 0x008c2b1d, 0x01af8a40, 0x003ef694}}, Y: Field{[10]uint32{0x00d6ccf5, 0x00944eff, 0x03c71e81, 0x02e8eef9, 0x038fd427, 0x024043f2, 0x00729e4e, 0x00ef5532, 0x0194aa45, 0x001920ce}}}, + {X: Field{[10]uint32{0x02583f9d, 0x03e1cbee, 0x02cf808a, 0x0317c14c, 0x03472b14, 0x00498beb, 0x01646616, 0x0065983d, 0x01a751be, 0x0002b92e}}, Y: Field{[10]uint32{0x0295ee5e, 0x019cb925, 0x02281f4b, 0x01e3693e, 0x03e2bd40, 0x02b4ead7, 0x00c6eed9, 0x01f969bc, 0x008baa9d, 0x0022cb09}}}, + {X: Field{[10]uint32{0x00cf6ff5, 0x02db8313, 0x036dda40, 0x0380c7b7, 0x00f29764, 0x0118a117, 0x028c6a2e, 0x02009859, 0x01520608, 0x00160100}}, Y: Field{[10]uint32{0x03329485, 0x0069c076, 0x030cd5fb, 0x023ffb41, 0x00a2e5f8, 0x00e65db6, 0x032f9a4e, 0x03013681, 0x02e64a83, 0x0034be5a}}}, + {X: Field{[10]uint32{0x007e029e, 0x029cc993, 0x0203b57c, 0x0098711a, 0x03cf477e, 0x02bf3d1f, 0x01abbd9f, 0x003e058e, 0x02865738, 0x00130a35}}, Y: Field{[10]uint32{0x00ed8a70, 0x02c09383, 0x0202259f, 0x01045436, 0x023122a9, 0x02b3eb05, 0x02a67e80, 0x01785015, 0x029c4fa7, 0x001a52e2}}}, + {X: Field{[10]uint32{0x0325c9a4, 0x016a4b3f, 0x026b9046, 0x01ddc5e6, 0x016984fc, 0x03601be0, 0x03b51a73, 0x01561fc8, 0x02b39e00, 0x00378816}}, Y: Field{[10]uint32{0x01273d83, 0x0170c9f1, 0x011355af, 0x010a6bb2, 0x0048f68e, 0x03ab304b, 0x002cf1f0, 0x03070b6d, 0x025e12ef, 0x003b610c}}}, + {X: Field{[10]uint32{0x014273f4, 0x031ada56, 0x025f1b3e, 0x0225b48a, 0x01b968f5, 0x0087995c, 0x0258dd57, 0x02c29d2d, 0x00680c2c, 0x0017aa0a}}, Y: Field{[10]uint32{0x004a9499, 0x008df48e, 0x038ad6e2, 0x00e40794, 0x00e18285, 0x00dbdb16, 0x02decce6, 0x0193e04e, 0x02b08db2, 0x00223443}}}, + {X: Field{[10]uint32{0x024998ba, 0x00b40d8c, 0x03c9c37f, 0x011b5ee6, 0x03c3b0dd, 0x038f6d39, 0x00bd98a3, 0x01d05908, 0x03c86449, 0x0006273d}}, Y: Field{[10]uint32{0x02daa083, 0x00960087, 0x03da204d, 0x0235c8fd, 0x01742211, 0x01f7581b, 0x0201b1cf, 0x03fca0d9, 0x01ced46d, 0x002ecd02}}}, + {X: Field{[10]uint32{0x0082789f, 0x014dbe6f, 0x0214d3cf, 0x035e3b97, 0x013c3c41, 0x02040091, 0x00680265, 0x00350c22, 0x018738f5, 0x001c285c}}, Y: Field{[10]uint32{0x0027c1d6, 0x0118b5ef, 0x022962b9, 0x0116a7cd, 0x02101dc4, 0x023c2747, 0x03338701, 0x014df907, 0x0120e112, 0x00057254}}}, + {X: Field{[10]uint32{0x03b3a368, 0x011ae6c3, 0x03865cff, 0x02a91a0c, 0x018e4271, 0x00c04421, 0x0020eedf, 0x036db823, 0x00ff622a, 0x0015e2b0}}, Y: Field{[10]uint32{0x03d7f851, 0x007296ee, 0x0215f1f0, 0x03d4759f, 0x026b0cea, 0x03542062, 0x01b2f7d9, 0x005cb4ae, 0x01ddf5f3, 0x003dc468}}}, + {X: Field{[10]uint32{0x01840071, 0x02c178a3, 0x01aea3e3, 0x01dfe9b3, 0x035887f1, 0x0373a296, 0x00738bad, 0x029d1f59, 0x0003476a, 0x003727ef}}, Y: Field{[10]uint32{0x01eee1b4, 0x03c293a2, 0x03ab9515, 0x01d33d39, 0x008bd267, 0x00a53954, 0x0194a19d, 0x037497e3, 0x012c8087, 0x00303d9d}}}, + {X: Field{[10]uint32{0x03b0294d, 0x02548551, 0x0178fe02, 0x0371165b, 0x014bb817, 0x00f5cc54, 0x004dec0b, 0x03357cba, 0x00ffa348, 0x0025d26b}}, Y: Field{[10]uint32{0x0381a1c6, 0x03a13815, 0x0116723d, 0x03265140, 0x03d89856, 0x0039f480, 0x02ec20be, 0x0120436b, 0x01ea35e5, 0x0037d99f}}}, + {X: Field{[10]uint32{0x02657d85, 0x034d0f8c, 0x032e8e92, 0x02635ac4, 0x00ae8e7a, 0x02a0551e, 0x0359f21f, 0x01cc370c, 0x01cf2fd2, 0x0038e7ef}}, Y: Field{[10]uint32{0x01b5e01c, 0x001ac2f9, 0x0028320a, 0x01e230c7, 0x02624415, 0x01922168, 0x026ae3e3, 0x021659da, 0x008170a7, 0x002ebfa6}}}, + {X: Field{[10]uint32{0x01402c09, 0x02ae2fe4, 0x02b89e0f, 0x00a83a8c, 0x02e04b69, 0x03244d45, 0x000bda4d, 0x00dc4830, 0x014e27f1, 0x00180240}}, Y: Field{[10]uint32{0x02359f6b, 0x01826750, 0x032e5708, 0x02a1b3b0, 0x01eb4006, 0x0376e998, 0x0396f588, 0x00734b2d, 0x0094f6bd, 0x000d2442}}}, + {X: Field{[10]uint32{0x03f2f773, 0x025223a1, 0x02162d41, 0x00b50d88, 0x03b644c9, 0x01dacfbb, 0x039bec4f, 0x011b60be, 0x0247d02e, 0x002fc13c}}, Y: Field{[10]uint32{0x002172f6, 0x0073af1f, 0x0284d32b, 0x016f07b5, 0x00302e12, 0x019d38d5, 0x019ab004, 0x00b9303c, 0x00e8bb3c, 0x003591bd}}}, + {X: Field{[10]uint32{0x01e5e3c3, 0x0137ea8c, 0x01acff5b, 0x02af0c3a, 0x013e5468, 0x00571b66, 0x0071efd9, 0x02cd4e16, 0x03ecb122, 0x0025827d}}, Y: Field{[10]uint32{0x008f9a27, 0x02d43766, 0x015925d6, 0x03e7bae5, 0x01ebb4d9, 0x0138ab62, 0x0178ac77, 0x03c2e1c5, 0x012eb933, 0x00041af1}}}, + {X: Field{[10]uint32{0x03ab9abe, 0x00ab5882, 0x033668da, 0x007537b1, 0x03f5ae58, 0x032f7d5b, 0x03440fb5, 0x02f89681, 0x003a0e1e, 0x002da433}}, Y: Field{[10]uint32{0x0049dbd1, 0x019aa5f8, 0x0135fb96, 0x03d89269, 0x0335e5f9, 0x02db0595, 0x01a96032, 0x00f76cb3, 0x0023fd3a, 0x0020f340}}}, + {X: Field{[10]uint32{0x01d326d4, 0x00025de4, 0x0338d6cd, 0x0120e56f, 0x002c9479, 0x02a42636, 0x022bc114, 0x01dd106a, 0x008ced50, 0x001cb694}}, Y: Field{[10]uint32{0x03668457, 0x03ed19cf, 0x03e095ea, 0x036ee045, 0x02e5d743, 0x03fb248b, 0x01780364, 0x03a8ac3a, 0x02933433, 0x000596ea}}}, + {X: Field{[10]uint32{0x01851c37, 0x00726dea, 0x0101729b, 0x006e6174, 0x01113320, 0x004969cb, 0x014322f5, 0x00c024a5, 0x016e540a, 0x00383f44}}, Y: Field{[10]uint32{0x01b88a92, 0x024117b9, 0x017ac850, 0x01addde6, 0x01a516a0, 0x00c34c55, 0x01e899d6, 0x01c1f952, 0x027648aa, 0x0031af1c}}}, + {X: Field{[10]uint32{0x00c10af1, 0x00ada0a5, 0x01c13abe, 0x007341a5, 0x030297f0, 0x0220fe76, 0x00d6389e, 0x03904bb8, 0x03ea85d4, 0x002752e2}}, Y: Field{[10]uint32{0x03556181, 0x014962a5, 0x038d38a9, 0x02ef9a28, 0x035bb66e, 0x02a2125c, 0x02e62fd6, 0x0020cb66, 0x00d73f7c, 0x001788a0}}}, + {X: Field{[10]uint32{0x008e08ff, 0x01e8b50e, 0x02d25505, 0x01547085, 0x01069f12, 0x0357acc7, 0x0056123c, 0x01b81377, 0x0395aa4b, 0x003bbe10}}, Y: Field{[10]uint32{0x022d2376, 0x035ad875, 0x039280b1, 0x01b56658, 0x0087797e, 0x00c5e712, 0x018b26c7, 0x010d9103, 0x02a434e1, 0x00114262}}}, + {X: Field{[10]uint32{0x010d7654, 0x02845972, 0x00de739a, 0x02bdb983, 0x03b4652d, 0x01dbbd09, 0x034371e0, 0x02392184, 0x007d56e3, 0x0019bf97}}, Y: Field{[10]uint32{0x011a2fba, 0x022a1370, 0x02582a10, 0x021259b2, 0x0196d4c3, 0x032edb13, 0x000ad433, 0x0324edf9, 0x026bb6ed, 0x000b5ca4}}}, + {X: Field{[10]uint32{0x008ea2ed, 0x031b7cb0, 0x027afdc2, 0x030a4e7c, 0x0082f9e1, 0x02a60f26, 0x015a304a, 0x032bb331, 0x01cc1818, 0x00144d7e}}, Y: Field{[10]uint32{0x003f22d6, 0x028d8878, 0x0295427c, 0x03851e61, 0x002619b5, 0x0056b86d, 0x00baf4e1, 0x005d413e, 0x01d27dfe, 0x0016949b}}}, + {X: Field{[10]uint32{0x026487ca, 0x03e6d88f, 0x0229c3fd, 0x022b386b, 0x0182e331, 0x008a8f8a, 0x03fa2bcc, 0x012a700b, 0x0089af7f, 0x00068df0}}, Y: Field{[10]uint32{0x012464a5, 0x0157fc0f, 0x02c183c9, 0x0048d74b, 0x03509b03, 0x01cd9cb3, 0x02b33d23, 0x008c2ea5, 0x00338522, 0x0034e270}}}, + {X: Field{[10]uint32{0x03a248a0, 0x00461211, 0x01576e4a, 0x00888bec, 0x01ed1edb, 0x02405be5, 0x03c68dfc, 0x02bd0244, 0x01ff15da, 0x00127de9}}, Y: Field{[10]uint32{0x01abd8fd, 0x0231e9ee, 0x03f611a1, 0x02086975, 0x00d5ebec, 0x029aefbd, 0x0394246f, 0x01ef27a5, 0x03013d63, 0x003e6d56}}}, + {X: Field{[10]uint32{0x02641ed7, 0x02abe207, 0x03130253, 0x00d6b0eb, 0x003b87f8, 0x01bac11c, 0x03f0f1e2, 0x03e0e481, 0x005e5d9e, 0x002091e1}}, Y: Field{[10]uint32{0x013c5f1e, 0x01102a79, 0x011de3e2, 0x023c8fce, 0x03b4409c, 0x032d0ab5, 0x01b19474, 0x026139fc, 0x010c1a23, 0x0015df5e}}}, + {X: Field{[10]uint32{0x010e0749, 0x006164f6, 0x024fb8f1, 0x00f897ba, 0x0257b782, 0x00214fa3, 0x0292ef61, 0x000906b3, 0x004ecd16, 0x0020a566}}, Y: Field{[10]uint32{0x00ac8353, 0x0236f230, 0x003c14c3, 0x0259e032, 0x022c5dac, 0x01ec70e2, 0x02450e76, 0x0357dce6, 0x01a66798, 0x0018d4c8}}}, + {X: Field{[10]uint32{0x01d75461, 0x03a7200f, 0x015377b2, 0x004ac4d0, 0x01fb5db4, 0x01c31a2d, 0x00ba34e7, 0x03d7fef8, 0x03f6d8fc, 0x003530ca}}, Y: Field{[10]uint32{0x0085f93d, 0x014fd991, 0x03353741, 0x01459b44, 0x01a1a71e, 0x03b69c2e, 0x004272b4, 0x0116ccb1, 0x0202e238, 0x002cf1cd}}}, + {X: Field{[10]uint32{0x00c897ff, 0x00fdda5b, 0x00d849fd, 0x0329a20b, 0x023babe7, 0x02d49a8c, 0x00703af6, 0x01a39a91, 0x032d04a9, 0x00068238}}, Y: Field{[10]uint32{0x03ad4141, 0x02caa3ab, 0x00b399a6, 0x0025c0d1, 0x013fdc82, 0x00ac52a3, 0x002e19be, 0x03b52897, 0x00bdb77b, 0x0011bb66}}}, + {X: Field{[10]uint32{0x014f4af7, 0x03f70d0d, 0x01e82e7c, 0x03bb3927, 0x036b40e1, 0x02a325dd, 0x0305965d, 0x00fc1012, 0x020e9672, 0x0021566f}}, Y: Field{[10]uint32{0x01333ef6, 0x000f7524, 0x02dc05af, 0x037aae90, 0x02ba4db6, 0x0374241a, 0x03f049b2, 0x008344b0, 0x0388854e, 0x0018f892}}}, + {X: Field{[10]uint32{0x01e211e8, 0x022f7181, 0x008c55e2, 0x0237a333, 0x02edd0f0, 0x03cbbca9, 0x01c0ee30, 0x011e2a12, 0x0223fc7a, 0x0038382c}}, Y: Field{[10]uint32{0x03ca60fc, 0x03580de7, 0x00d1a511, 0x017b44a2, 0x0206609a, 0x016e211e, 0x02d38e12, 0x03eb0481, 0x032c3aaf, 0x00328e20}}}, + {X: Field{[10]uint32{0x00e40a19, 0x014e739a, 0x034e2034, 0x009159e6, 0x00265c34, 0x0245d60b, 0x0001eaa5, 0x034941d6, 0x02982d8e, 0x00288def}}, Y: Field{[10]uint32{0x02231318, 0x0260a956, 0x0087cf48, 0x00ca400f, 0x00dc1bfc, 0x0009b59a, 0x00d5de47, 0x00de0115, 0x0227976a, 0x0003d334}}}, + {X: Field{[10]uint32{0x0205ccf2, 0x03e6d804, 0x03ef2474, 0x035ad0d9, 0x005edbd0, 0x0285bcaf, 0x03fe7705, 0x02341fc0, 0x00821eb0, 0x000a2a12}}, Y: Field{[10]uint32{0x0056a17c, 0x02d7f0fe, 0x02301eec, 0x02f7c03e, 0x01162551, 0x00748f6a, 0x00526b17, 0x01d8a2e8, 0x03e9e7d7, 0x002419f4}}}, + {X: Field{[10]uint32{0x00c1d5e8, 0x01a6b726, 0x01d16f4c, 0x03b84f56, 0x03cc83e2, 0x02083796, 0x01b8fdc3, 0x01ad74c9, 0x00d542bd, 0x00050bfa}}, Y: Field{[10]uint32{0x0075b150, 0x00c42877, 0x004539c8, 0x00186fe7, 0x001b66d1, 0x0235fe98, 0x01d14213, 0x00cee556, 0x02780325, 0x000a5cfc}}}, + {X: Field{[10]uint32{0x00ad87d2, 0x01ec04a6, 0x036b99c9, 0x03edc03e, 0x008f3d5f, 0x006d2e4a, 0x01bb00a1, 0x01927406, 0x011c5d20, 0x0016ced8}}, Y: Field{[10]uint32{0x02519182, 0x032d62bc, 0x0058f8eb, 0x021d688b, 0x00192ead, 0x03b5c2ed, 0x03a76219, 0x00384b37, 0x01c80cde, 0x00212416}}}, + {X: Field{[10]uint32{0x00beb8af, 0x00b1f394, 0x00f6b019, 0x018e5153, 0x012edbdc, 0x03cd7dbd, 0x01f74c35, 0x00168fd8, 0x02495d49, 0x00092288}}, Y: Field{[10]uint32{0x03fd4c83, 0x00dab1ee, 0x035c3b11, 0x00fa6e26, 0x0161eaf7, 0x02219e87, 0x0197b243, 0x03042073, 0x03ffb707, 0x002d69bc}}}, + {X: Field{[10]uint32{0x03ff075c, 0x00e134f6, 0x025d2875, 0x024c0b4e, 0x0231ea20, 0x008a408f, 0x011fa99a, 0x0143a753, 0x022a292b, 0x002291d2}}, Y: Field{[10]uint32{0x03804dd9, 0x035ad97b, 0x01dc8721, 0x01174c35, 0x0245b5f0, 0x01b3e3f4, 0x00392891, 0x0106c797, 0x005c7d53, 0x001dd14a}}}, + {X: Field{[10]uint32{0x0015ffec, 0x023444d4, 0x03b228ca, 0x03492356, 0x03826d10, 0x0198dcc4, 0x00be4ea8, 0x010ba99f, 0x02557fc0, 0x000fe804}}, Y: Field{[10]uint32{0x02a937b3, 0x01d7c9c9, 0x00b25e3f, 0x01b28c8a, 0x00162d43, 0x02312386, 0x03dca5a5, 0x012e3bb2, 0x0325f59b, 0x00042e74}}}, + {X: Field{[10]uint32{0x03d65648, 0x03086567, 0x028c046a, 0x017f22a0, 0x036b778d, 0x02bc126c, 0x008f0071, 0x03c69376, 0x000e7b94, 0x002dded7}}, Y: Field{[10]uint32{0x02aeccc5, 0x032c55fe, 0x0021ad54, 0x00ba77db, 0x01e2b65d, 0x01bb7582, 0x01d57222, 0x02efaa32, 0x03c06722, 0x000c491a}}}, + {X: Field{[10]uint32{0x0135b44a, 0x03107fe1, 0x018e08f2, 0x01bb5747, 0x00567184, 0x026f52ed, 0x02ccad78, 0x00ae5db0, 0x008267e8, 0x00098d7d}}, Y: Field{[10]uint32{0x032b8def, 0x01b569e9, 0x0234dafb, 0x02702d4c, 0x010d2ce3, 0x01edcd4f, 0x03f9e4d4, 0x0247ed99, 0x004e9560, 0x001fb720}}}, + {X: Field{[10]uint32{0x021b474d, 0x0382198d, 0x032384a4, 0x0368635d, 0x03ed0012, 0x0347a8da, 0x036f39b6, 0x014b271a, 0x012dae09, 0x0008c1ad}}, Y: Field{[10]uint32{0x025486c0, 0x02d5b3cc, 0x01221582, 0x01caf348, 0x00bd7674, 0x00b3bf3d, 0x023688bb, 0x023dae69, 0x00b88d7b, 0x0010e094}}}, + {X: Field{[10]uint32{0x01f74b4c, 0x03625eea, 0x0016e248, 0x03baa300, 0x03aa5604, 0x03568747, 0x0186f9ee, 0x020a123d, 0x02b80dde, 0x0032aa19}}, Y: Field{[10]uint32{0x0009c341, 0x012957f7, 0x038f2995, 0x029f563e, 0x00e33746, 0x02016909, 0x02834ceb, 0x01e3115c, 0x0140349f, 0x000a063c}}}, + {X: Field{[10]uint32{0x00bb1641, 0x031c3fa2, 0x037cbb74, 0x01eec949, 0x03fb5e57, 0x027007b4, 0x01e9cc42, 0x00f5417d, 0x035aa079, 0x0020637b}}, Y: Field{[10]uint32{0x024f276d, 0x02cfb8bb, 0x0045fbdd, 0x02d24e85, 0x01f48ea2, 0x0258d9f4, 0x022d54d7, 0x0040c603, 0x0280f762, 0x0036a7bb}}}, + {X: Field{[10]uint32{0x007bf736, 0x00b7e491, 0x01bf08b1, 0x030d68a5, 0x03c36e11, 0x02f2b16e, 0x0364ed01, 0x0104bf35, 0x01fa568d, 0x000b18b3}}, Y: Field{[10]uint32{0x02c31979, 0x0301468f, 0x025a8f82, 0x02fc654c, 0x00ee73ea, 0x02ae9906, 0x01ef9859, 0x01c189c1, 0x00255811, 0x003a2e38}}}, + {X: Field{[10]uint32{0x01f04adb, 0x033a01f8, 0x0341659b, 0x006adbac, 0x014e477f, 0x0145f412, 0x022f7cd0, 0x01ba3352, 0x00d99db0, 0x000a2ad5}}, Y: Field{[10]uint32{0x0094541c, 0x028a799d, 0x03b0872a, 0x00107b2f, 0x004fb003, 0x03cf9f61, 0x0256276b, 0x02580af9, 0x0319a5cb, 0x00264ed4}}}, + {X: Field{[10]uint32{0x012b6061, 0x01205314, 0x03bb63ea, 0x03d7c57a, 0x01d6c2ab, 0x008ea090, 0x034eca42, 0x02903152, 0x00162254, 0x00124f9f}}, Y: Field{[10]uint32{0x00eed628, 0x03e02e8f, 0x02c897de, 0x01efc25f, 0x025fcf81, 0x02ba3c87, 0x0236b597, 0x027533fb, 0x037b588d, 0x00158e1f}}}, + {X: Field{[10]uint32{0x01c51d4f, 0x034818ae, 0x01bce902, 0x023888b2, 0x018922a6, 0x00b174e2, 0x02118dda, 0x0245953f, 0x01bee743, 0x0019cb84}}, Y: Field{[10]uint32{0x03dc36e1, 0x000b70c8, 0x03c5fc51, 0x03eaff39, 0x030db6bb, 0x017a758a, 0x03cfbca4, 0x00aa76d2, 0x034a0238, 0x000d5544}}}, + {X: Field{[10]uint32{0x02da550a, 0x022cb0e3, 0x02701003, 0x00b0a567, 0x0027524b, 0x0167e397, 0x0286c06b, 0x01a22637, 0x036ee3b8, 0x0023e343}}, Y: Field{[10]uint32{0x01212f34, 0x005c40d2, 0x01fd45d4, 0x01b09afc, 0x03f36429, 0x021ef2ce, 0x000fed66, 0x02af1665, 0x02819e27, 0x0039f7bc}}}, + {X: Field{[10]uint32{0x00b293e3, 0x004fed5e, 0x01495e82, 0x00084817, 0x03118f28, 0x005e7cc2, 0x03cf4c79, 0x03c295e5, 0x03834a11, 0x0036a315}}, Y: Field{[10]uint32{0x01c35f91, 0x00077ce2, 0x00d28a2c, 0x0386d8ce, 0x007c7a0c, 0x02d77146, 0x02bb1c3a, 0x00e5d421, 0x035c6f66, 0x001bb3f8}}}, + {X: Field{[10]uint32{0x01681955, 0x01fea852, 0x00ef4265, 0x02ce0f88, 0x00fbce09, 0x02a66e83, 0x03ec2d6f, 0x0197fcfb, 0x00f53b19, 0x001254f8}}, Y: Field{[10]uint32{0x035541c6, 0x026d5065, 0x00a39fc0, 0x025c6343, 0x023c28fa, 0x01e601d9, 0x00683240, 0x00d6c8f9, 0x038d9d16, 0x00308431}}}, + {X: Field{[10]uint32{0x0375f293, 0x0108108d, 0x038db6c7, 0x03205b68, 0x025cd3e0, 0x03a442f5, 0x021f7fdb, 0x038786f8, 0x01af48a0, 0x0015247f}}, Y: Field{[10]uint32{0x007ffae7, 0x013b34bf, 0x0243e3d3, 0x02580c61, 0x039c82de, 0x02d47d3c, 0x03e9b299, 0x014ce28e, 0x02885d1c, 0x001949cd}}}, + {X: Field{[10]uint32{0x03c168d1, 0x03b26d6a, 0x007f0af3, 0x00a50f24, 0x020b0a85, 0x03c5f46d, 0x01838858, 0x018ee7ed, 0x03a80423, 0x002e712b}}, Y: Field{[10]uint32{0x03550d9a, 0x03f85592, 0x0178e514, 0x006c1b50, 0x01e24d51, 0x0329f635, 0x0013aa1e, 0x03afb574, 0x006b1b75, 0x003af4c4}}}, + {X: Field{[10]uint32{0x02d2bd62, 0x00dda0e4, 0x02386242, 0x01cceaf2, 0x01d6802e, 0x02ae0275, 0x039826de, 0x011e86d7, 0x036c4448, 0x00246368}}, Y: Field{[10]uint32{0x0253e218, 0x03c77722, 0x02eca0ab, 0x01b9859b, 0x02889d5e, 0x02ce2627, 0x0214113a, 0x021f9857, 0x03afd7cc, 0x001b988d}}}, + {X: Field{[10]uint32{0x01d3392a, 0x010b8dc0, 0x02c93a2e, 0x00bd15ca, 0x00748eb4, 0x026dd0f3, 0x000240e5, 0x01452820, 0x0194da1f, 0x001ddf4a}}, Y: Field{[10]uint32{0x029680c6, 0x0374e8e2, 0x038645e6, 0x016a7487, 0x039d9250, 0x01387493, 0x02b96f41, 0x00c654b2, 0x03d7e9eb, 0x00001864}}}, + {X: Field{[10]uint32{0x0323bf3d, 0x01fc8c95, 0x0154c4d1, 0x0140d3be, 0x013988c6, 0x03c93bd5, 0x03b8b3ea, 0x03171789, 0x02a09a08, 0x0004239b}}, Y: Field{[10]uint32{0x0013b2eb, 0x03786fff, 0x01be288f, 0x01dba093, 0x02b8a0dd, 0x020464de, 0x0314ebff, 0x01aed1f0, 0x034b86db, 0x0006a2e5}}}, + {X: Field{[10]uint32{0x016bf185, 0x02b15291, 0x02839b5d, 0x03d129a0, 0x013c2dce, 0x037ab87f, 0x018a4868, 0x01352446, 0x02db65a5, 0x000db676}}, Y: Field{[10]uint32{0x0147bbf7, 0x014092c8, 0x00d8d078, 0x03e0d1f7, 0x011edd9b, 0x0196fbc6, 0x02ec3065, 0x01761897, 0x0356d93b, 0x00097a10}}}, + {X: Field{[10]uint32{0x02531fa7, 0x039c74d9, 0x02fe3ab2, 0x01508ca4, 0x02aab896, 0x0009c9b3, 0x01d8a9e3, 0x039dd9ca, 0x02b143ec, 0x000f83ae}}, Y: Field{[10]uint32{0x018d41cd, 0x00e0f665, 0x03d5c691, 0x0384f66a, 0x008e38ea, 0x03ec12cd, 0x008f32b2, 0x0188da25, 0x0208556d, 0x001b9ec9}}}, + {X: Field{[10]uint32{0x00fa3728, 0x02f6d706, 0x034832ba, 0x0108055f, 0x03ab08ab, 0x004fba6a, 0x01e9521a, 0x03cc6a87, 0x036af315, 0x00248f71}}, Y: Field{[10]uint32{0x02d3ae47, 0x03b81f03, 0x0003ef6b, 0x02158cc4, 0x017facf6, 0x03627992, 0x001bfca6, 0x0215ecc5, 0x03b67439, 0x001ea3c5}}}, + {X: Field{[10]uint32{0x016a6618, 0x0313a80f, 0x02c6de85, 0x02a4deea, 0x036bee02, 0x00738b85, 0x029cb815, 0x03ab8d33, 0x033202df, 0x003e1fff}}, Y: Field{[10]uint32{0x005a03e0, 0x01d84856, 0x00e13c71, 0x0330b879, 0x027c14a4, 0x000f36ff, 0x03ace256, 0x01b828d5, 0x0037aa72, 0x001d3924}}}, + {X: Field{[10]uint32{0x018881ed, 0x00fe7040, 0x008200e3, 0x03fc1d5a, 0x01e00b5a, 0x014e7dfa, 0x01ec106b, 0x01a68047, 0x025ddd7f, 0x0004e201}}, Y: Field{[10]uint32{0x0113408e, 0x00c8c5d3, 0x0332c92b, 0x00c88ff9, 0x0065d1a9, 0x02ad090b, 0x02f72a55, 0x01877508, 0x018f1406, 0x002b2ac7}}}, + {X: Field{[10]uint32{0x004b6941, 0x026d88eb, 0x0201e59e, 0x00d2b314, 0x003d685b, 0x028dd46e, 0x03315427, 0x01a8220d, 0x031ea99b, 0x003951da}}, Y: Field{[10]uint32{0x033b4e21, 0x022cba57, 0x0177bb41, 0x019cf321, 0x00bc86dd, 0x02a3e9d5, 0x03c794ca, 0x01e568c8, 0x02f1c4dd, 0x0015f56c}}}, + {X: Field{[10]uint32{0x01cd1f15, 0x011f2c05, 0x0109c3dd, 0x02053b5e, 0x0290c149, 0x03261063, 0x0229d894, 0x03afa930, 0x0360f1e8, 0x003e4e3f}}, Y: Field{[10]uint32{0x02bb13e1, 0x0140c63b, 0x028214da, 0x0316dbb5, 0x02037fe2, 0x01cafef5, 0x0176e293, 0x03191a81, 0x02121a0c, 0x0035c5c8}}}, + {X: Field{[10]uint32{0x00a30aa3, 0x0168ef66, 0x038ad8ad, 0x013e8221, 0x01180b49, 0x02153e6f, 0x015544d5, 0x0144205e, 0x00107c4a, 0x002cc6f5}}, Y: Field{[10]uint32{0x00519e82, 0x01bd7014, 0x031c18fb, 0x03c384ac, 0x03d33828, 0x0001faac, 0x0141affa, 0x0225897a, 0x00976bd5, 0x00250984}}}, + {X: Field{[10]uint32{0x00c1cb2f, 0x011f40fd, 0x03af7b44, 0x02495768, 0x0333abd6, 0x0269b1b4, 0x02df141b, 0x00340468, 0x03ba8321, 0x002cfb61}}, Y: Field{[10]uint32{0x01d632b3, 0x02452a93, 0x0347abe0, 0x006cd1f9, 0x02b90be7, 0x018d0799, 0x030273cb, 0x015f86a5, 0x037929c7, 0x00252774}}}, + {X: Field{[10]uint32{0x01221e17, 0x03b85b4c, 0x03f46668, 0x0038e2e1, 0x0089a57c, 0x00c6f282, 0x0395e787, 0x0243612e, 0x02401ea7, 0x001839b0}}, Y: Field{[10]uint32{0x029465c2, 0x02f451b2, 0x0198cc03, 0x00110143, 0x00367387, 0x015c7abc, 0x01c800a0, 0x00263ca9, 0x0335c722, 0x003c91ef}}}, + {X: Field{[10]uint32{0x03750a80, 0x02bebc70, 0x03b87994, 0x01abdd30, 0x01eaf3e1, 0x01c4f35c, 0x01d8d370, 0x03411f9f, 0x02b04cc8, 0x000aba01}}, Y: Field{[10]uint32{0x02e2e954, 0x03793aec, 0x0135ae38, 0x028906a8, 0x026facf6, 0x0017283b, 0x007fafe6, 0x01c6d46a, 0x00acb297, 0x002a365e}}}, + {X: Field{[10]uint32{0x01bb5c47, 0x0109308a, 0x0343958a, 0x0218dde7, 0x01d23843, 0x007dbcea, 0x020bb155, 0x00b4a79e, 0x00a4bbba, 0x0026bc5e}}, Y: Field{[10]uint32{0x0279abd3, 0x0006886b, 0x03259781, 0x02eab737, 0x014052a4, 0x00beecf4, 0x007ac857, 0x02215e92, 0x03baa023, 0x003040c7}}}, + {X: Field{[10]uint32{0x0008f523, 0x005b6658, 0x00b2c3a1, 0x00c4cc3b, 0x00fd78a5, 0x027a2894, 0x03da097c, 0x009ebcb9, 0x0321e9cb, 0x002775a9}}, Y: Field{[10]uint32{0x03f36080, 0x03274ff9, 0x0217357d, 0x0177d3a0, 0x03fc4e97, 0x02f195e1, 0x012adb14, 0x0027251c, 0x037d6473, 0x0039a0de}}}, + {X: Field{[10]uint32{0x01e91c52, 0x006876a9, 0x03f0f0e3, 0x02da68a2, 0x03fcb717, 0x0113beed, 0x03e3f1de, 0x028794ec, 0x02bed7a1, 0x0033d7c5}}, Y: Field{[10]uint32{0x00487497, 0x00a0d2b1, 0x014b1485, 0x003629a7, 0x00b0c80a, 0x0264833d, 0x03912c99, 0x0081ef18, 0x03d54d87, 0x0025527a}}}, + {X: Field{[10]uint32{0x03a64722, 0x03a417b7, 0x001afd45, 0x03ece880, 0x01de577c, 0x014a8052, 0x02466a3c, 0x015341e0, 0x00908109, 0x00319e52}}, Y: Field{[10]uint32{0x035ca468, 0x0091837d, 0x01187fcc, 0x00946f9a, 0x018621b6, 0x03209e0a, 0x00a5fbd5, 0x0100c6ff, 0x0351deb6, 0x001293f7}}}, + {X: Field{[10]uint32{0x00599713, 0x0354904c, 0x023e4442, 0x0083f869, 0x02b03b49, 0x010501aa, 0x019c1ea0, 0x0383fc59, 0x03cbbee9, 0x002897ff}}, Y: Field{[10]uint32{0x0341486a, 0x01bc912f, 0x007e2123, 0x024537a6, 0x0240fab7, 0x02dca86e, 0x03fc28af, 0x004626b0, 0x02065a82, 0x0005dae7}}}, + {X: Field{[10]uint32{0x00c5bf71, 0x0125dd38, 0x025ecdca, 0x01ab2ba7, 0x01128cab, 0x009238ca, 0x02cfafc7, 0x0248ec5a, 0x0322fd5d, 0x00181e69}}, Y: Field{[10]uint32{0x018c4bcc, 0x03debaf4, 0x00c45df0, 0x024af57b, 0x02023f52, 0x000cdfbf, 0x036f1d91, 0x01691713, 0x02de99ca, 0x0030265c}}}, + {X: Field{[10]uint32{0x0366b403, 0x02772e4a, 0x0182c813, 0x003f2add, 0x02f64b95, 0x02c59c8f, 0x03ffc428, 0x01e39c63, 0x003d9d40, 0x0006232d}}, Y: Field{[10]uint32{0x03af5404, 0x03dfc688, 0x0314c140, 0x03ccd62a, 0x01fcc8c2, 0x0155a45b, 0x01a28799, 0x02890002, 0x0237ec9e, 0x00280e3e}}}, + {X: Field{[10]uint32{0x0019bb30, 0x006c9fbe, 0x0102cd78, 0x00d1a33f, 0x00c445ca, 0x01559fb2, 0x03925066, 0x0171a3d5, 0x0040cb57, 0x0038c43f}}, Y: Field{[10]uint32{0x02be625e, 0x01ae278a, 0x0384ddf6, 0x00da83c5, 0x02e0c183, 0x01b9ee51, 0x0101def6, 0x004bb97a, 0x02655ba3, 0x000c4ca2}}}, + {X: Field{[10]uint32{0x03dea4ac, 0x015d2fdd, 0x03c8e52b, 0x037c91b0, 0x00f15693, 0x03d18b32, 0x000bdeb1, 0x01177765, 0x005d1c82, 0x00376192}}, Y: Field{[10]uint32{0x01966ce2, 0x03027182, 0x03b4833f, 0x02d1f9d0, 0x018963a8, 0x028a6282, 0x0290175b, 0x0289c131, 0x03c256c9, 0x00335aed}}}, + {X: Field{[10]uint32{0x03019aef, 0x01740a81, 0x0097bde8, 0x02666cd8, 0x03dba773, 0x02da7865, 0x03dc67ca, 0x019ee1bd, 0x020cf815, 0x0006dfb4}}, Y: Field{[10]uint32{0x00e3d1bb, 0x03f0d7bc, 0x01531be6, 0x01534c53, 0x00df428d, 0x0292f0de, 0x00d89b59, 0x010e1954, 0x012ad1cb, 0x003e053a}}}, + {X: Field{[10]uint32{0x01ded284, 0x01c669ed, 0x01897a0f, 0x00328191, 0x019b41cd, 0x01c2cfc7, 0x0146a036, 0x020ce3b4, 0x007b2d52, 0x00028556}}, Y: Field{[10]uint32{0x022e925d, 0x03a9c9c4, 0x0052bfe6, 0x008ab5ad, 0x0312fc15, 0x01008fb9, 0x00d225cc, 0x00693b8c, 0x034b5aba, 0x000abbf8}}}, + {X: Field{[10]uint32{0x036a5484, 0x01254fa4, 0x01054048, 0x018e7934, 0x0208d194, 0x02825033, 0x00fcf209, 0x029a4663, 0x01f9c99d, 0x00015eee}}, Y: Field{[10]uint32{0x031660e4, 0x0291f20c, 0x0079e9a6, 0x01ef634c, 0x03700dc5, 0x035defc3, 0x03be5e41, 0x009ba0b1, 0x03a8d902, 0x0018f43e}}}, + {X: Field{[10]uint32{0x03bd262c, 0x02497564, 0x03746bab, 0x03ee3e92, 0x01291f84, 0x00844ec8, 0x017f7a10, 0x02d2835f, 0x01b37fa1, 0x000890a5}}, Y: Field{[10]uint32{0x00195796, 0x0258ae4e, 0x03ddcea2, 0x023b1145, 0x0246ed38, 0x00889982, 0x023eb74c, 0x02c369d5, 0x0040b1e4, 0x0003582b}}}, + {X: Field{[10]uint32{0x0053b0e3, 0x00e69ad5, 0x0055e53b, 0x0283c8a0, 0x02d6101c, 0x039d0d53, 0x00031b29, 0x0314f81f, 0x02e6a34e, 0x00090d3a}}, Y: Field{[10]uint32{0x003ce23d, 0x01e8e09d, 0x010ed6ce, 0x01d591db, 0x008b04f7, 0x00e88398, 0x00f39563, 0x0012ec4e, 0x0161d57a, 0x000bfd7b}}}, + {X: Field{[10]uint32{0x01885ce9, 0x02961c62, 0x0203b700, 0x02d8db42, 0x01ef2e6a, 0x03ec8ac1, 0x0304c649, 0x00444ef6, 0x0192907c, 0x00112379}}, Y: Field{[10]uint32{0x0079eabc, 0x0108732a, 0x028803d0, 0x00435164, 0x0063af8b, 0x016c0a4c, 0x03e6dea2, 0x0141a37a, 0x03fd6ab3, 0x0035eab3}}}, + {X: Field{[10]uint32{0x0393dd76, 0x028dc618, 0x0298f7c2, 0x00730769, 0x00defc0a, 0x006a8ee8, 0x02b92e70, 0x01d9d1ff, 0x03735aef, 0x00210173}}, Y: Field{[10]uint32{0x02c407f2, 0x01549639, 0x0053fc79, 0x00beea1a, 0x0189c9ef, 0x03d2a1c4, 0x0261c783, 0x00428129, 0x000649cd, 0x0015e574}}}, + {X: Field{[10]uint32{0x0208efc9, 0x0084735b, 0x026d5581, 0x03341cb1, 0x029318ac, 0x00dc7ae1, 0x01349aa0, 0x0121f7fa, 0x00c1e5c1, 0x001a625d}}, Y: Field{[10]uint32{0x0384509c, 0x030703fb, 0x00e1590b, 0x00aaee13, 0x01bcec87, 0x02ae6bd8, 0x036536c2, 0x012fd47d, 0x038cdc8f, 0x000df088}}}, + {X: Field{[10]uint32{0x003fee05, 0x0395cc99, 0x02d8dce2, 0x01846e11, 0x03e6548c, 0x00c57de2, 0x017781df, 0x02af19c6, 0x017abe3c, 0x00228de1}}, Y: Field{[10]uint32{0x00f674ed, 0x01da62d3, 0x020b78b8, 0x026c8777, 0x005e28e9, 0x038e19b5, 0x0055e4d9, 0x013341f9, 0x03680915, 0x000a620b}}}, + {X: Field{[10]uint32{0x0397eaef, 0x02f380c8, 0x00846793, 0x037c3e98, 0x0325ec8c, 0x01ea29c5, 0x0104c968, 0x00e7f84c, 0x034f5cdd, 0x002a1c6c}}, Y: Field{[10]uint32{0x0387cb28, 0x03f5e8b0, 0x00c5df3f, 0x037a379b, 0x00642312, 0x01b2484f, 0x03e2dc68, 0x000f027d, 0x00179de1, 0x00213e59}}}, + {X: Field{[10]uint32{0x0286f44a, 0x019339a0, 0x00fb4fd9, 0x031ebaae, 0x009ec66e, 0x02679d2b, 0x0057905e, 0x029fd6a2, 0x03b89f78, 0x00126f2b}}, Y: Field{[10]uint32{0x019eff6f, 0x03901f3b, 0x0194f4ea, 0x01849c5b, 0x0271124a, 0x02f464fa, 0x011d2ca7, 0x02add29e, 0x00cb5641, 0x0039f6e3}}}, + {X: Field{[10]uint32{0x028b6df6, 0x01c4c03d, 0x03686c3f, 0x012de7fa, 0x0140d9b8, 0x03ffa126, 0x0186289d, 0x0327963d, 0x012f2f05, 0x003571f6}}, Y: Field{[10]uint32{0x0151c08e, 0x0200abc7, 0x020434f1, 0x00aff38d, 0x036fcb2b, 0x0073d0ae, 0x00b272ce, 0x028e3a81, 0x025c219e, 0x0029a2ca}}}, + {X: Field{[10]uint32{0x03286696, 0x02a36d4e, 0x0056cfe4, 0x02f8a09b, 0x006a825c, 0x02c323b4, 0x034a249c, 0x0335ee71, 0x023cfea4, 0x000ab0bf}}, Y: Field{[10]uint32{0x0360f43f, 0x039e0102, 0x03834a67, 0x01b3c028, 0x00505bb4, 0x01b2981e, 0x02f6031c, 0x02947b28, 0x0259b008, 0x001f6429}}}, + {X: Field{[10]uint32{0x00a39234, 0x00716a84, 0x011d92f6, 0x03bec0ed, 0x025b0069, 0x0283b69e, 0x023a85f5, 0x01fb3d3d, 0x00bc6282, 0x001f026b}}, Y: Field{[10]uint32{0x01624836, 0x01b1a21a, 0x030015a9, 0x03c8258a, 0x00854b56, 0x017f70c6, 0x01f86414, 0x00a315a1, 0x0139c291, 0x00381f49}}}, + {X: Field{[10]uint32{0x03fbf9f0, 0x025aefdb, 0x03a7f2c4, 0x0008d289, 0x033bb4ff, 0x00ecbeb4, 0x0141ae71, 0x010b9da6, 0x01567e1b, 0x003a21b7}}, Y: Field{[10]uint32{0x0267a877, 0x0045cb71, 0x0301081d, 0x03cf18c2, 0x025a4666, 0x037d3977, 0x01c097f0, 0x03e03cdc, 0x037babee, 0x00352c89}}}, + {X: Field{[10]uint32{0x0059c2dc, 0x02866740, 0x00464073, 0x039614d1, 0x038ca8a6, 0x03d82ec6, 0x02178f0f, 0x00e60f16, 0x00c800e8, 0x003b7d97}}, Y: Field{[10]uint32{0x01ab2d5e, 0x01d89122, 0x0123a92c, 0x036c41c3, 0x030118a4, 0x0378737e, 0x024710a2, 0x00c27e12, 0x0313f0c5, 0x00289099}}}, + {X: Field{[10]uint32{0x026d17f8, 0x01abdbb4, 0x01036a74, 0x02ee8f4b, 0x03435ad7, 0x02c548c8, 0x016dbbe5, 0x01baee4d, 0x0304b78a, 0x000a704b}}, Y: Field{[10]uint32{0x016eae4a, 0x03f3b388, 0x019358b7, 0x009fe816, 0x02b3336d, 0x027b1146, 0x02a211f3, 0x0046a9e3, 0x0275bf62, 0x00020e64}}}, + {X: Field{[10]uint32{0x0263c3e2, 0x03e29e59, 0x00789994, 0x01192986, 0x03169f20, 0x0383e7f3, 0x02034ac3, 0x026453c2, 0x038c280e, 0x003576e2}}, Y: Field{[10]uint32{0x0263412b, 0x00355df0, 0x02cbbeb6, 0x01e2a997, 0x0398f270, 0x0066507d, 0x025635a8, 0x0000e7d7, 0x003a085a, 0x0010458f}}}, + {X: Field{[10]uint32{0x01135f8d, 0x00285f36, 0x01165700, 0x016b151f, 0x0210e105, 0x02ed3dff, 0x00e57ac8, 0x02c03656, 0x03a5630e, 0x00264293}}, Y: Field{[10]uint32{0x03c9653b, 0x02c8f5d2, 0x032912ec, 0x0053e3f3, 0x03eb2524, 0x0231c485, 0x02a03646, 0x028a2511, 0x0025491f, 0x003c97b8}}}, + {X: Field{[10]uint32{0x029c0935, 0x00ded5e7, 0x031b7416, 0x03b31a35, 0x034e3049, 0x00c573d4, 0x0101c3b3, 0x012773b2, 0x00f01c78, 0x0035e13b}}, Y: Field{[10]uint32{0x034205ce, 0x03593eda, 0x03dde6b2, 0x00202159, 0x02306720, 0x03b1bf51, 0x0082a841, 0x00abb763, 0x0122cc38, 0x00177a63}}}, + {X: Field{[10]uint32{0x00e38193, 0x01334d5b, 0x01338320, 0x03946726, 0x019b4d38, 0x037cf067, 0x0353b67b, 0x0032eeab, 0x00d05885, 0x000195db}}, Y: Field{[10]uint32{0x0310eaca, 0x03dd3195, 0x03420658, 0x0038c2fc, 0x03d98496, 0x01d923f8, 0x001fbeb2, 0x0395b8c7, 0x013e92d1, 0x0028ca66}}}, + {X: Field{[10]uint32{0x0035efce, 0x012113af, 0x024d8bb9, 0x01dcf49b, 0x0320ccb1, 0x0311527f, 0x009a8081, 0x03031919, 0x00e5f675, 0x00255de2}}, Y: Field{[10]uint32{0x021d9b5b, 0x016a8394, 0x00a8c051, 0x001a6f04, 0x0301d329, 0x005785f3, 0x01c39486, 0x03b8df65, 0x031cdc4b, 0x001fa910}}}, + {X: Field{[10]uint32{0x039e4a2e, 0x014b0178, 0x0096b014, 0x03cec114, 0x00da5549, 0x02304ffc, 0x0101abd7, 0x02d4dfb1, 0x02805053, 0x0022bdf2}}, Y: Field{[10]uint32{0x017e8402, 0x0160da8b, 0x03fb8e1b, 0x001ba759, 0x036a4362, 0x03690150, 0x03235e60, 0x010b933e, 0x0225aac0, 0x00097a18}}}, + {X: Field{[10]uint32{0x0215236c, 0x024df438, 0x02ba2623, 0x01598dec, 0x01e6eb74, 0x035e705e, 0x02ff642a, 0x018d3880, 0x0393e16e, 0x00126fc0}}, Y: Field{[10]uint32{0x0031a85d, 0x00f9a5e9, 0x00722d60, 0x00305e6b, 0x0141e5f8, 0x02684d10, 0x000ce1ee, 0x03835073, 0x013f401d, 0x00216418}}}, + {X: Field{[10]uint32{0x00192063, 0x03af4675, 0x035afdc5, 0x03b68992, 0x01df3653, 0x02326db7, 0x03b68581, 0x00a18d49, 0x02250257, 0x00320b8a}}, Y: Field{[10]uint32{0x01a6de8c, 0x01d78f8e, 0x011c7b26, 0x03dcddbe, 0x01c2717f, 0x01fe7a4e, 0x030af044, 0x0306f4f5, 0x0000cd87, 0x000ee1be}}}, + {X: Field{[10]uint32{0x00eedbf3, 0x004b7f76, 0x02041a37, 0x0154562c, 0x0142ec13, 0x0393489f, 0x02fc9c3f, 0x023df0eb, 0x01202b9a, 0x0027390e}}, Y: Field{[10]uint32{0x035b52f6, 0x0288327f, 0x026e26d5, 0x02cf70bb, 0x0153a54b, 0x02a4e7fe, 0x02f15d59, 0x03b74feb, 0x0305859a, 0x0036eed6}}}, + {X: Field{[10]uint32{0x02fe6227, 0x02f6dac5, 0x0324a168, 0x02b425bb, 0x00baa707, 0x03b2ad2e, 0x01202213, 0x0017294b, 0x009e49de, 0x000381c0}}, Y: Field{[10]uint32{0x00bc33c9, 0x023e739b, 0x03b2e417, 0x00f28548, 0x03258383, 0x037a353a, 0x03865b0a, 0x02e89a06, 0x00bfe752, 0x001a8d6c}}}, + {X: Field{[10]uint32{0x021da888, 0x00056f60, 0x03fab065, 0x017fd308, 0x01d58861, 0x025849c5, 0x02948147, 0x02bd8791, 0x01b47e09, 0x003ad373}}, Y: Field{[10]uint32{0x01661b8f, 0x017454fa, 0x000834a5, 0x01710410, 0x00008630, 0x01320457, 0x006536ad, 0x000be878, 0x01685846, 0x0018f8e0}}}, + {X: Field{[10]uint32{0x00e49db6, 0x013cce44, 0x00f7bf86, 0x001c981e, 0x03a2c659, 0x034a76b3, 0x0257015d, 0x00044c74, 0x02812bf2, 0x002f97e1}}, Y: Field{[10]uint32{0x016d9da7, 0x01004765, 0x01f308f0, 0x02e3103a, 0x0143c4f1, 0x01cfe944, 0x015a92da, 0x012bfd66, 0x00e45617, 0x00343d08}}}, + {X: Field{[10]uint32{0x015b99a8, 0x007e204d, 0x01ed74a6, 0x0172cc75, 0x03db214a, 0x0375fa3b, 0x03a1318e, 0x017e7663, 0x003910e7, 0x000eccb7}}, Y: Field{[10]uint32{0x03a18bc5, 0x02bc68a8, 0x03c4218b, 0x02b15cbe, 0x036e4e0a, 0x01d4b952, 0x01df756e, 0x03a7967f, 0x028619c2, 0x000684b7}}}, + {X: Field{[10]uint32{0x02e04db1, 0x00f9e921, 0x029d0a3c, 0x00d45a5c, 0x03dde107, 0x00fce1ad, 0x012922ea, 0x03a21597, 0x01ce5c06, 0x00256b17}}, Y: Field{[10]uint32{0x02f39838, 0x02d6c9cf, 0x029fde77, 0x01dc9465, 0x01680edb, 0x005aded2, 0x0049e856, 0x0060878f, 0x0187ab1b, 0x000688b3}}}, + {X: Field{[10]uint32{0x00e708eb, 0x0060db5f, 0x005ccd30, 0x00782a37, 0x027dad59, 0x017b4a57, 0x01d1b74a, 0x03c4f8cd, 0x00fba4b0, 0x001b93b4}}, Y: Field{[10]uint32{0x0234b931, 0x01fc5482, 0x01a54ac3, 0x0267a670, 0x0016a2ef, 0x027366ac, 0x0188e6e5, 0x013827b6, 0x026ac61c, 0x00241585}}}, + {X: Field{[10]uint32{0x03a42e10, 0x03ae8b08, 0x01859898, 0x01e6474b, 0x01ea8d9a, 0x0209f612, 0x00925e17, 0x003b84dd, 0x0394208e, 0x0022df0c}}, Y: Field{[10]uint32{0x0043d193, 0x02afac9c, 0x02d0d003, 0x03d8bc86, 0x032c8beb, 0x01d7bcff, 0x00e64400, 0x002f3244, 0x02379672, 0x002daae4}}}, + {X: Field{[10]uint32{0x00f871c6, 0x001612ec, 0x02dcc8e2, 0x01363e5b, 0x02dd48ab, 0x02dbd772, 0x00965b98, 0x0035ce21, 0x0347f669, 0x0003f69e}}, Y: Field{[10]uint32{0x02926c5d, 0x02e39af2, 0x03560e18, 0x00895791, 0x00309292, 0x0152d1cf, 0x03487e8b, 0x0331b4a2, 0x0035a272, 0x0026d009}}}, + {X: Field{[10]uint32{0x01bcb217, 0x0041a8cf, 0x0255dad6, 0x022f3246, 0x036e6301, 0x0303a6a8, 0x00beb534, 0x01686bbe, 0x00f5395a, 0x003c5768}}, Y: Field{[10]uint32{0x038a8f1c, 0x03afdd95, 0x00f6ddb6, 0x00bef3e6, 0x0380be25, 0x021825c8, 0x03571ac4, 0x00054645, 0x01eabb3b, 0x000a33da}}}, + {X: Field{[10]uint32{0x00af9253, 0x036206ef, 0x032f4abf, 0x02e1fea0, 0x03d9a208, 0x021c26a5, 0x02378e63, 0x005f8324, 0x02dd2c78, 0x0031b899}}, Y: Field{[10]uint32{0x03769626, 0x0247b9f2, 0x02082842, 0x03724c8c, 0x005ffa7a, 0x0342fbd6, 0x00e95e35, 0x02ce8c32, 0x00c1fa9b, 0x000abc40}}}, + {X: Field{[10]uint32{0x02e28753, 0x00cf422d, 0x0313f0d1, 0x01e93f6a, 0x037f5a72, 0x00e495a1, 0x00c21a83, 0x00807922, 0x02020fdd, 0x0012fe2a}}, Y: Field{[10]uint32{0x015fc8b8, 0x02fa74f3, 0x01d88f39, 0x0016572f, 0x02d8fe5f, 0x0279b188, 0x01c6bd70, 0x01356685, 0x0258ad9c, 0x00162049}}}, + {X: Field{[10]uint32{0x00d0a6d3, 0x03f04a5f, 0x0248b972, 0x01cf6d87, 0x0105cda6, 0x029dfee5, 0x009fc39d, 0x01216956, 0x032806dd, 0x002aa617}}, Y: Field{[10]uint32{0x024b75b2, 0x017d8347, 0x00a04e1e, 0x00404389, 0x007c2777, 0x007fc0b8, 0x025a92da, 0x018ecca6, 0x00972f11, 0x002aec3e}}}, + {X: Field{[10]uint32{0x01c41c9d, 0x01ccbb18, 0x0197c8e1, 0x012c33b4, 0x016c2fa0, 0x02305048, 0x039f88d8, 0x02873d3a, 0x0101ec13, 0x00205d34}}, Y: Field{[10]uint32{0x03d79aa7, 0x01a9d623, 0x01bbb46f, 0x012c69e4, 0x00c6e5d9, 0x0298e6c0, 0x037a6625, 0x00b9ffab, 0x01c231b0, 0x00319d97}}}, + {X: Field{[10]uint32{0x01f3d876, 0x00bc13db, 0x02cbb870, 0x02b3f6f9, 0x0292573a, 0x016a68e8, 0x028fe098, 0x024a5edc, 0x02a9d603, 0x003e7d93}}, Y: Field{[10]uint32{0x024ca01a, 0x01f4b266, 0x02f9b1a6, 0x03ef61fb, 0x01188069, 0x005cba1e, 0x00950f21, 0x019f4058, 0x03c14060, 0x001051b1}}}, + {X: Field{[10]uint32{0x00f1b3b4, 0x0197b32a, 0x02951d88, 0x02f072a4, 0x01f8067c, 0x02977a49, 0x034454a2, 0x0217acf4, 0x02705a68, 0x000f990e}}, Y: Field{[10]uint32{0x02fb0355, 0x03822df8, 0x02f11b0f, 0x0209c58b, 0x028b5e58, 0x01ddea65, 0x01d54d1d, 0x014d3b7a, 0x03045525, 0x000b7b29}}}, + {X: Field{[10]uint32{0x036c63c5, 0x0259bccd, 0x0082e4c0, 0x034ae1ea, 0x03caae45, 0x01bddb40, 0x015d200d, 0x02b01dfa, 0x0011fcc3, 0x0011137d}}, Y: Field{[10]uint32{0x0016cc23, 0x0142a955, 0x032bc643, 0x024eb1b8, 0x01ec520c, 0x00b7b3cf, 0x00d1a4df, 0x02592a9f, 0x0198643d, 0x002d1599}}}, + {X: Field{[10]uint32{0x006946a0, 0x01ea1e99, 0x01465bbb, 0x01aa1093, 0x0019cdaa, 0x029a0429, 0x00a7beb1, 0x00d7f8c5, 0x021f58be, 0x0004a8bd}}, Y: Field{[10]uint32{0x010ba47d, 0x0354d74a, 0x010698df, 0x00c6575e, 0x0248410b, 0x029a7ef2, 0x01539461, 0x03323fc6, 0x034494c2, 0x00269ef7}}}, + {X: Field{[10]uint32{0x0264cb9f, 0x00acadf8, 0x007933d5, 0x01ea4fd2, 0x02511b2b, 0x01a1ef48, 0x008af94b, 0x01cf1cf5, 0x02924625, 0x002f75c9}}, Y: Field{[10]uint32{0x02123874, 0x03037de8, 0x034ed955, 0x03df7103, 0x02858e6d, 0x03dd1a6a, 0x01ac9923, 0x03eac2f5, 0x004eb794, 0x00015b9b}}}, + {X: Field{[10]uint32{0x00066bdd, 0x01ff95a9, 0x003d60ec, 0x00a75f41, 0x03c974bd, 0x02936a7b, 0x034f156e, 0x03d5744a, 0x015877c3, 0x00386f55}}, Y: Field{[10]uint32{0x03233170, 0x02541d70, 0x0033ff5a, 0x006c7111, 0x03789cbf, 0x03168cbd, 0x002bea56, 0x010da88e, 0x0399fbe7, 0x00237366}}}, + {X: Field{[10]uint32{0x00132ad9, 0x00d47498, 0x0185d804, 0x02e2c1c6, 0x00fc064e, 0x01287d54, 0x0246609f, 0x020a52fa, 0x01e4781c, 0x0029f1a3}}, Y: Field{[10]uint32{0x01b42c32, 0x02218aeb, 0x00766842, 0x026fafe8, 0x026f6bbf, 0x0116626e, 0x022b240d, 0x03fad441, 0x00b63d9e, 0x0028209e}}}, + {X: Field{[10]uint32{0x029aa855, 0x00f1c34a, 0x0279a56b, 0x0198f632, 0x0205fa0d, 0x004df41e, 0x01eb90f5, 0x038da72f, 0x0369b4c6, 0x0013cea1}}, Y: Field{[10]uint32{0x026ea169, 0x01921bba, 0x0393e35b, 0x00b2d8af, 0x00b9d6db, 0x011c1d61, 0x00ed9f2c, 0x007854d2, 0x011c5f70, 0x0003db01}}}, + {X: Field{[10]uint32{0x0044f232, 0x018f77bd, 0x01a8d744, 0x01ff2d0d, 0x0036fd04, 0x0229aed6, 0x01cac66d, 0x03aff610, 0x001c8089, 0x0037aaaf}}, Y: Field{[10]uint32{0x0228e8a1, 0x0030a4f0, 0x014f90f5, 0x01258a9b, 0x00ccd14a, 0x03229b59, 0x026e6547, 0x01b9eaa0, 0x00ba49c2, 0x003edf31}}}, + {X: Field{[10]uint32{0x019c0695, 0x02e3e4cc, 0x023788b5, 0x02adf3f3, 0x02fd7f33, 0x03bcaccb, 0x0151e1f4, 0x006ce049, 0x0361547b, 0x0031046b}}, Y: Field{[10]uint32{0x018cb66b, 0x02efe215, 0x02ab4797, 0x013bd888, 0x02294ace, 0x03f3eedd, 0x0266d212, 0x03e0aba4, 0x03d73d50, 0x0034afb9}}}, + {X: Field{[10]uint32{0x009ec5e7, 0x002f7aa4, 0x01637821, 0x000742a2, 0x004a35f1, 0x02e77771, 0x00284945, 0x0376a343, 0x0294485b, 0x00343fda}}, Y: Field{[10]uint32{0x024f620f, 0x0087c88d, 0x02a65e21, 0x03fe0ea4, 0x00cb1910, 0x023e54f1, 0x02b7e83d, 0x02a3cb40, 0x00fd2923, 0x002acfd8}}}, + {X: Field{[10]uint32{0x0308c0f1, 0x00d6a9c7, 0x02424982, 0x01102cff, 0x01006f27, 0x016b5b2c, 0x011baea3, 0x03b648a1, 0x01cc9555, 0x00028341}}, Y: Field{[10]uint32{0x02339948, 0x0131f275, 0x037dc471, 0x02b4c601, 0x0150afe2, 0x0082c9c1, 0x017e67ca, 0x01629c2f, 0x01052371, 0x00210ec4}}}, + {X: Field{[10]uint32{0x023f5d32, 0x03964807, 0x039d0568, 0x010a24fe, 0x007d5996, 0x0364265e, 0x0083ef67, 0x017ee817, 0x0045eb29, 0x002fa821}}, Y: Field{[10]uint32{0x00ce10e3, 0x03cc8a9b, 0x01cc7908, 0x035af53d, 0x01e26594, 0x00744bb4, 0x00bb2bb4, 0x03d14f5e, 0x03ffb3f7, 0x000aa069}}}, + {X: Field{[10]uint32{0x02f0d5f0, 0x00b1f7b9, 0x02ce3e82, 0x026316b3, 0x00551c30, 0x01aae5c0, 0x035aea6f, 0x039a267a, 0x004c431b, 0x003a3af3}}, Y: Field{[10]uint32{0x01fa902e, 0x03428ecc, 0x0161e097, 0x0193aa83, 0x016d65db, 0x0268ab9e, 0x03d511f5, 0x0393d63e, 0x0061760a, 0x003be669}}}, + {X: Field{[10]uint32{0x026e8fd2, 0x00c2f3a5, 0x03cd1d96, 0x02d6161d, 0x020806ba, 0x01e5b62d, 0x031db77c, 0x037113b3, 0x006cdd73, 0x00125218}}, Y: Field{[10]uint32{0x02b95f80, 0x012e496f, 0x01123bc6, 0x03b7cf6e, 0x00cb8c13, 0x00e511aa, 0x01630aa6, 0x02319e10, 0x033f786c, 0x000f19cc}}}, + {X: Field{[10]uint32{0x02a778c2, 0x021e4ba7, 0x00a165c1, 0x02996d72, 0x00fb5a19, 0x019b3525, 0x03e40cca, 0x03bee938, 0x033240d9, 0x0013c966}}, Y: Field{[10]uint32{0x0117446d, 0x023aab93, 0x00efb1b6, 0x01fd1d23, 0x00b1590f, 0x027d3a8b, 0x02006054, 0x01a66712, 0x008778c2, 0x003f7620}}}, + {X: Field{[10]uint32{0x02dfcc29, 0x0143e91e, 0x03f337e3, 0x02379ea9, 0x031e7e91, 0x038463ba, 0x036e2b43, 0x01fd4bc9, 0x0093e14d, 0x003cc0e9}}, Y: Field{[10]uint32{0x01141b57, 0x006f52da, 0x00163cfa, 0x01df17f9, 0x01453f79, 0x029ab499, 0x01bc49da, 0x0394fd7d, 0x006d0bef, 0x003127e9}}}, + {X: Field{[10]uint32{0x01df595d, 0x02cbd4f0, 0x01a41ea4, 0x03f0a77d, 0x0158b9fd, 0x01029583, 0x0311859c, 0x02003b06, 0x0317f4c0, 0x00380312}}, Y: Field{[10]uint32{0x0363b99d, 0x007edd65, 0x032fb8c8, 0x000f4d20, 0x00a72a10, 0x02d33346, 0x00d0d957, 0x0134a746, 0x0266c3ec, 0x00189106}}}, + {X: Field{[10]uint32{0x0372ce70, 0x02c8c076, 0x011714cf, 0x03c88560, 0x03ca16be, 0x02dd52f9, 0x03603bd2, 0x02bd4a91, 0x00861af6, 0x001212e1}}, Y: Field{[10]uint32{0x0132fbc7, 0x01f9cb13, 0x02359d47, 0x0314231d, 0x01cf72e5, 0x028299d6, 0x02968652, 0x01e68ff9, 0x03f5a0ac, 0x000dbe13}}}, + {X: Field{[10]uint32{0x00d93f14, 0x0119ee13, 0x02dab210, 0x0338469e, 0x03ca07fe, 0x032f0526, 0x03e6a8a7, 0x007d1286, 0x00ead8b5, 0x00222f96}}, Y: Field{[10]uint32{0x02687fdc, 0x01baf2a4, 0x0067d4d4, 0x03d27c03, 0x018ebbeb, 0x001a5ec6, 0x00d6cd6a, 0x03ef05c7, 0x00af7037, 0x00253043}}}, + {X: Field{[10]uint32{0x03da781b, 0x037a5111, 0x03b77384, 0x0351f058, 0x037372a3, 0x0040466d, 0x0275e11b, 0x035fbd12, 0x02af9fdd, 0x002afdb3}}, Y: Field{[10]uint32{0x0395d290, 0x003b3319, 0x0259a796, 0x024a0712, 0x01417183, 0x026ed3bd, 0x01fe2f3b, 0x0319eba7, 0x030c6320, 0x00172b6c}}}, + {X: Field{[10]uint32{0x009d173a, 0x020e13ae, 0x03deb74f, 0x00365598, 0x014e221e, 0x01f1b0f3, 0x03cf10a1, 0x0196c99f, 0x01229ef6, 0x003a3099}}, Y: Field{[10]uint32{0x022aeeb3, 0x02b847f2, 0x00934035, 0x009a7f34, 0x02bec7ba, 0x00364591, 0x031965b3, 0x0143bf48, 0x03adf9b0, 0x00269a7e}}}, + {X: Field{[10]uint32{0x01c6c23e, 0x03e93ff6, 0x0358df60, 0x03aa47ff, 0x01e031f3, 0x021a0c55, 0x0270a24e, 0x03b2e579, 0x03d8bf72, 0x0019994a}}, Y: Field{[10]uint32{0x00be994e, 0x0168ea4c, 0x03b3b4b6, 0x00054b73, 0x0205fa69, 0x03d98c29, 0x002fbb66, 0x00adcc8b, 0x00083f18, 0x0012113b}}}, + {X: Field{[10]uint32{0x002c0964, 0x0094b753, 0x02f0badf, 0x01054caa, 0x0075cac8, 0x016fdb56, 0x00202c44, 0x00410372, 0x00c2d842, 0x00081e20}}, Y: Field{[10]uint32{0x01860cfd, 0x01b47c30, 0x01c54e91, 0x024c203f, 0x010a562d, 0x0324a9ec, 0x00ef3167, 0x013786b9, 0x01d73eb2, 0x000ac606}}}, + {X: Field{[10]uint32{0x0013f581, 0x03f65648, 0x030cc763, 0x00b1f649, 0x007e8f26, 0x03437fda, 0x0133485e, 0x01a4bbb2, 0x01e453d0, 0x0011ae6f}}, Y: Field{[10]uint32{0x014f9bf7, 0x02af4b28, 0x022256ec, 0x021a7cbf, 0x01394cc7, 0x00216df5, 0x019b0d63, 0x026703d2, 0x03e63ae5, 0x00162be6}}}, + {X: Field{[10]uint32{0x01ea3e11, 0x00759e5d, 0x0278b82b, 0x015758a6, 0x02a2fa25, 0x00a6bcea, 0x0356e2f0, 0x03974025, 0x0174dbeb, 0x001766c9}}, Y: Field{[10]uint32{0x02e59263, 0x01ed9143, 0x030f02b8, 0x02405963, 0x03f3a641, 0x018a5d63, 0x023dd507, 0x031a3f3b, 0x00acaa6a, 0x003b67d0}}}, + {X: Field{[10]uint32{0x02590e4f, 0x01b05c9b, 0x02c52d08, 0x035ddf3f, 0x03dc598f, 0x01dd0ce2, 0x036a6491, 0x01909669, 0x01828b98, 0x003b2d6b}}, Y: Field{[10]uint32{0x01887886, 0x02637cb2, 0x034e301d, 0x029f3312, 0x0365d33e, 0x00be084b, 0x014b5bf5, 0x0361faa5, 0x013673c6, 0x0000ade2}}}, + {X: Field{[10]uint32{0x0124ea67, 0x03294c8e, 0x0296e8f3, 0x0267f243, 0x00ddd62e, 0x00037957, 0x01747250, 0x006e2874, 0x00c15e71, 0x002ccad9}}, Y: Field{[10]uint32{0x02ac2083, 0x02c30929, 0x016a5403, 0x013783f8, 0x024d81b8, 0x01f92f86, 0x027a94de, 0x02b7c8d2, 0x01d36dce, 0x002bd758}}}, + {X: Field{[10]uint32{0x020cd364, 0x0023f160, 0x034ab1c3, 0x010aa002, 0x008b7f68, 0x033daacf, 0x0157aa15, 0x008cd29b, 0x031b7158, 0x00144dfd}}, Y: Field{[10]uint32{0x01f1eab4, 0x0194a913, 0x00381efa, 0x00e25596, 0x010e4a3b, 0x025d5dc4, 0x02a248d4, 0x01f6ac31, 0x03ecc9b1, 0x003dfa97}}}, + {X: Field{[10]uint32{0x029ea866, 0x0158a5f3, 0x01539e7c, 0x01958c58, 0x0025f94e, 0x00070fd7, 0x0113a898, 0x016224f8, 0x021a390b, 0x002e6ec3}}, Y: Field{[10]uint32{0x00324a11, 0x01a547c2, 0x0080e6b6, 0x02a094e6, 0x01247f60, 0x0207938c, 0x00e14ece, 0x00d7eeb9, 0x00903c3d, 0x003636cf}}}, + {X: Field{[10]uint32{0x024fe9af, 0x03ad1a24, 0x027d317b, 0x024bb060, 0x0388cc11, 0x0310bd1e, 0x0291c211, 0x003b0811, 0x01676da4, 0x000fc246}}, Y: Field{[10]uint32{0x02bb8de9, 0x0177d705, 0x01395877, 0x02f74ff3, 0x00ba4c04, 0x00e341c9, 0x02e6a812, 0x00b07c62, 0x00263e88, 0x003c6d12}}}, + {X: Field{[10]uint32{0x0093b4fe, 0x016b2236, 0x00ed80d5, 0x011f5897, 0x003767da, 0x01c286cb, 0x015e7afc, 0x01803a35, 0x01f1dad4, 0x002d7e89}}, Y: Field{[10]uint32{0x02d22347, 0x024e6ca2, 0x0270e1d6, 0x000ee85e, 0x0183e495, 0x02927426, 0x013a1908, 0x00a5b1fb, 0x0261f2ba, 0x001d5d7d}}}, + {X: Field{[10]uint32{0x000d17b0, 0x031bdf5a, 0x000183d4, 0x03a9ac73, 0x01e4ca06, 0x000dcc1a, 0x01b797e9, 0x00096de3, 0x00e2dc6a, 0x00280dc7}}, Y: Field{[10]uint32{0x0059919d, 0x01f10cba, 0x036bc693, 0x01d1712b, 0x0024f0ff, 0x01666ddd, 0x011c5214, 0x00173ba1, 0x00a89a50, 0x0024ad6a}}}, + {X: Field{[10]uint32{0x02e2f210, 0x02650a87, 0x02c8c7b1, 0x00a36896, 0x00cd0a98, 0x01f50808, 0x0063967d, 0x02441de2, 0x029000a4, 0x0016ab9b}}, Y: Field{[10]uint32{0x03ee8fd7, 0x00393ded, 0x03957576, 0x031335e0, 0x017e82fd, 0x01e7b0e6, 0x03218f7b, 0x013cfff5, 0x002082a5, 0x0003b673}}}, + {X: Field{[10]uint32{0x020841a0, 0x034a8a06, 0x03b053fe, 0x02cb9b39, 0x0164efdd, 0x01437ad9, 0x000f9648, 0x02dbd2c4, 0x02ecf4a9, 0x001539f6}}, Y: Field{[10]uint32{0x03c9c63d, 0x00f7b2a5, 0x03daecc8, 0x0215c250, 0x0270d467, 0x022cd365, 0x02857ad0, 0x00ea0756, 0x032a5477, 0x00366b68}}}, + {X: Field{[10]uint32{0x03bf44e8, 0x01153223, 0x00d7abdb, 0x0148e47b, 0x00383ed7, 0x01d926e1, 0x00d8be0c, 0x03bd1ad2, 0x0110d8bc, 0x003a6ca6}}, Y: Field{[10]uint32{0x021d6b69, 0x031c0f09, 0x033deb84, 0x024a6a37, 0x03d7a267, 0x00393102, 0x01739655, 0x03a47e94, 0x0094f669, 0x003ac9a0}}}, + {X: Field{[10]uint32{0x02546a97, 0x0385de76, 0x00ef6384, 0x00727f85, 0x013f537a, 0x01df4767, 0x037c5895, 0x02944c65, 0x0222f254, 0x0010fe54}}, Y: Field{[10]uint32{0x01cb18cc, 0x03b3ad5c, 0x035e14b0, 0x02ce5ecf, 0x030eef80, 0x0198a8b7, 0x005b305b, 0x01711fc9, 0x02534334, 0x0035f4f1}}}, + {X: Field{[10]uint32{0x02c3b103, 0x004a52e9, 0x00b1dcc9, 0x01701c89, 0x01672338, 0x005ab921, 0x00bc0902, 0x03ee4a0c, 0x03d53999, 0x0027ed17}}, Y: Field{[10]uint32{0x02bdf451, 0x03deb27f, 0x0213a277, 0x001ae09c, 0x036731b5, 0x0269252e, 0x017bf7f3, 0x020b4e43, 0x001bdbfd, 0x0016d1c2}}}, + {X: Field{[10]uint32{0x031dcce9, 0x032092ed, 0x007f23cb, 0x003882b6, 0x0109ca84, 0x03ad19bd, 0x015919b2, 0x00a734ca, 0x002b8355, 0x0037648a}}, Y: Field{[10]uint32{0x03726371, 0x02a78717, 0x03b7ad58, 0x01a0ed63, 0x01f37962, 0x00788ef3, 0x02f4a29d, 0x0359a2c7, 0x02e7bc59, 0x003b117d}}}, + {X: Field{[10]uint32{0x0016348d, 0x030176b7, 0x01c38686, 0x01bf06b5, 0x01fe2903, 0x00f788f1, 0x019def4f, 0x02f75efe, 0x0012009f, 0x001d20bc}}, Y: Field{[10]uint32{0x0040abd1, 0x0198e9ae, 0x025f8db1, 0x02eb0939, 0x0173fc0d, 0x0196eb44, 0x02b2a20b, 0x03dbc2fc, 0x020d5497, 0x00290f12}}}, + {X: Field{[10]uint32{0x00ebd9a5, 0x029a1a5c, 0x02377a69, 0x00c3dea6, 0x01537fca, 0x016c0c65, 0x012f587a, 0x0189e077, 0x019597fd, 0x003e933f}}, Y: Field{[10]uint32{0x03ae823a, 0x03af8771, 0x0105c1b8, 0x00c428c1, 0x01e2a350, 0x03862a3f, 0x031d269b, 0x03dde2f4, 0x02c99ddb, 0x00115a2d}}}, + {X: Field{[10]uint32{0x03a60b9e, 0x01f4440f, 0x00c53d9b, 0x034c9e51, 0x022f1078, 0x03c7ffaf, 0x0105e1b4, 0x00fa3a06, 0x03dae776, 0x00147834}}, Y: Field{[10]uint32{0x02da6740, 0x00bfca8d, 0x033f7bfa, 0x02948e57, 0x001da673, 0x008423b4, 0x01f20b90, 0x00beb33e, 0x00c4ab57, 0x00046368}}}, + {X: Field{[10]uint32{0x01bc9530, 0x00a99a03, 0x03f86c48, 0x01d3d03a, 0x00502fc6, 0x0227a5bd, 0x003b8572, 0x008cd4e3, 0x027cc055, 0x001f6395}}, Y: Field{[10]uint32{0x02b37571, 0x030ba9a3, 0x00ad7600, 0x00716172, 0x00748458, 0x02a2c985, 0x01fe552b, 0x0111a92e, 0x004600c6, 0x001db0ff}}}, + {X: Field{[10]uint32{0x011dfb1f, 0x00ae52b3, 0x000ed8d1, 0x019e7bd3, 0x011c316d, 0x03e8631e, 0x01f216fd, 0x0065bf74, 0x02d3b400, 0x00364931}}, Y: Field{[10]uint32{0x03ebcea8, 0x00aaa013, 0x012e59d8, 0x00649b1a, 0x0290b9d1, 0x023766e4, 0x01eb3f28, 0x0012e2c4, 0x00ee881c, 0x0003b0cf}}}, + {X: Field{[10]uint32{0x0293c0db, 0x01d115d7, 0x03b8f330, 0x006afe54, 0x033965cb, 0x02a6760a, 0x00d28b97, 0x00a72346, 0x030b06f6, 0x002372cc}}, Y: Field{[10]uint32{0x006857a3, 0x01d3cde9, 0x0097ab6d, 0x0103dbdf, 0x00b58b73, 0x004fe06a, 0x0129b573, 0x0240b46c, 0x01198323, 0x000f628b}}}, + {X: Field{[10]uint32{0x02a5d2b5, 0x01d27daf, 0x02e80d3f, 0x0074d68c, 0x0157910f, 0x036bad9c, 0x0386797d, 0x018de233, 0x023b94b0, 0x00374712}}, Y: Field{[10]uint32{0x03230777, 0x026fb7ac, 0x0064c086, 0x02f1cf5f, 0x003d2afe, 0x02de32de, 0x03e5be9a, 0x0160f590, 0x00c75a69, 0x003befb0}}}, + {X: Field{[10]uint32{0x03f5e772, 0x022a214d, 0x02dab765, 0x03caf1d8, 0x01ec0275, 0x0134a4b0, 0x01f6ec48, 0x035fdce5, 0x02341dfa, 0x000ac0f7}}, Y: Field{[10]uint32{0x03c0d0e3, 0x019a9db0, 0x03bdf971, 0x0346b926, 0x020803d7, 0x027de397, 0x03d48bb4, 0x0160b156, 0x00fb3818, 0x000c8d7a}}}, + {X: Field{[10]uint32{0x0028dde2, 0x01e320c5, 0x03f39479, 0x02f530f9, 0x02677f06, 0x01addc4c, 0x03a80efa, 0x016f25f9, 0x030fba14, 0x000e9e56}}, Y: Field{[10]uint32{0x00914691, 0x037d5e51, 0x0352b526, 0x013a8fc4, 0x0081af64, 0x03b502bb, 0x00bc9e1e, 0x022898df, 0x039ddf03, 0x003d0496}}}, + {X: Field{[10]uint32{0x004fcbbf, 0x0301621a, 0x01e59ef8, 0x0085e234, 0x03121f5c, 0x002a1476, 0x006c081b, 0x035b2e71, 0x013ba133, 0x0003b3e0}}, Y: Field{[10]uint32{0x03e53560, 0x035dce04, 0x020930ec, 0x0057af84, 0x02597e39, 0x02254a70, 0x02becd07, 0x02d1cdfc, 0x02f2a7b7, 0x001a7836}}}, + {X: Field{[10]uint32{0x02217d5a, 0x01a461b5, 0x00c33576, 0x01154da3, 0x03743832, 0x0138274f, 0x037191dd, 0x018f9040, 0x0182c141, 0x0018df12}}, Y: Field{[10]uint32{0x02ecb410, 0x03695cf7, 0x00b77a74, 0x011d6b19, 0x00f6fb37, 0x028de0c6, 0x03aaa5c0, 0x034b8c96, 0x02b8fd83, 0x0036968a}}}, + {X: Field{[10]uint32{0x01b90e87, 0x022cf8dc, 0x037c6b19, 0x01604947, 0x00542556, 0x0014c368, 0x03f5fac2, 0x016d5f73, 0x03a2d887, 0x00067f9c}}, Y: Field{[10]uint32{0x00151ca0, 0x027de836, 0x01ad35a3, 0x0204a3f0, 0x01a32646, 0x03f97a2e, 0x027a77a1, 0x0094630d, 0x00182ccc, 0x000ec0eb}}}, + {X: Field{[10]uint32{0x03b7ebb2, 0x0156dfce, 0x0023471d, 0x02f7c513, 0x00c68b4c, 0x02d9a02c, 0x01151b30, 0x03700027, 0x022a0d4c, 0x00005ba9}}, Y: Field{[10]uint32{0x013fa629, 0x03f3a779, 0x01f6a8ff, 0x0180b8ee, 0x0135f020, 0x02566030, 0x00612a89, 0x00b964ce, 0x021c5367, 0x00232b12}}}, + {X: Field{[10]uint32{0x02a40970, 0x00d4e508, 0x012e849f, 0x0217efd4, 0x00e1eed4, 0x01e7e68a, 0x00e54132, 0x01b4859e, 0x00b5454c, 0x001ae75a}}, Y: Field{[10]uint32{0x02365482, 0x02c6c9eb, 0x01472fa4, 0x01952c17, 0x03907f85, 0x02a223ad, 0x01e6969d, 0x038df6be, 0x004498eb, 0x002d8fd4}}}, + {X: Field{[10]uint32{0x035ed3e6, 0x037449c2, 0x01d05868, 0x01f48c59, 0x0232c3c2, 0x03edfb24, 0x03dc948a, 0x0204b0b9, 0x008c08f0, 0x0007e883}}, Y: Field{[10]uint32{0x01838076, 0x0137ad8a, 0x020cfed8, 0x015ca029, 0x026cd168, 0x0308a7fa, 0x03686062, 0x00d909f7, 0x034d8213, 0x0031495f}}}, + {X: Field{[10]uint32{0x036acc86, 0x0229a86f, 0x02263e8e, 0x00e2f941, 0x02af15bb, 0x00763d4d, 0x031df6b3, 0x02d37873, 0x00927dae, 0x001cea0f}}, Y: Field{[10]uint32{0x02eb8adc, 0x01eb5aa0, 0x000ab2fb, 0x02af937d, 0x0126a21d, 0x02326e24, 0x034e24de, 0x030c2e0a, 0x03e40cd6, 0x002822b2}}}, + {X: Field{[10]uint32{0x0188bdbe, 0x01d87b9d, 0x015a48e1, 0x033bf4a9, 0x0285ba90, 0x03389978, 0x0278cf93, 0x00b7bb28, 0x0264924e, 0x000ea655}}, Y: Field{[10]uint32{0x00cbbb0e, 0x02351711, 0x00f39dd4, 0x02f40edf, 0x02d011a1, 0x0072bc63, 0x0065d939, 0x00cf4d49, 0x02dc99eb, 0x003cc886}}}, + {X: Field{[10]uint32{0x01429c26, 0x01fc9a4f, 0x005965e0, 0x03ead3e2, 0x025ca516, 0x030583a1, 0x005cd9b9, 0x03d73075, 0x0219b032, 0x001f197b}}, Y: Field{[10]uint32{0x023704c5, 0x015ca900, 0x02287ff9, 0x0178dd0f, 0x018cc54a, 0x02f88893, 0x01076ae4, 0x03c9df4c, 0x02f90e3d, 0x0011f1fe}}}, + {X: Field{[10]uint32{0x00d397dc, 0x0002c8b9, 0x00fb03dc, 0x0365976e, 0x032f05e6, 0x0332e340, 0x0153118d, 0x036ef6f6, 0x014c6750, 0x0030041a}}, Y: Field{[10]uint32{0x008e730c, 0x020ee01b, 0x01be2395, 0x00054b50, 0x025a5e61, 0x0065bc4c, 0x01fde10a, 0x01510567, 0x00c6dd6c, 0x000ed245}}}, + {X: Field{[10]uint32{0x02519d57, 0x005f3d98, 0x03ae75e3, 0x00b29c8f, 0x01a33dcb, 0x0084d84c, 0x015a12b9, 0x022db5be, 0x008ed28d, 0x00389561}}, Y: Field{[10]uint32{0x03cfb7b6, 0x0364990f, 0x02fe4d36, 0x03007841, 0x00377c9a, 0x02060ec9, 0x0207dcd1, 0x036b5e60, 0x01aa1757, 0x0018bdf5}}}, + {X: Field{[10]uint32{0x00236ed9, 0x0295b40b, 0x03c45bd1, 0x029ddbbf, 0x01a9669d, 0x00778c34, 0x0078dfbf, 0x00a648ea, 0x00e57323, 0x003cc506}}, Y: Field{[10]uint32{0x0256b84c, 0x008d2e2b, 0x01552af7, 0x03d87e22, 0x0316a1ef, 0x00c2d6bb, 0x0234c8a6, 0x03651957, 0x0084dce0, 0x00398aae}}}, + {X: Field{[10]uint32{0x01703181, 0x004b0aef, 0x03770615, 0x026ba319, 0x021f3f3c, 0x01f079aa, 0x01c290d4, 0x00c4eeb2, 0x0145b876, 0x00026b6e}}, Y: Field{[10]uint32{0x030908fd, 0x01d347a7, 0x00f8650f, 0x003b7c3c, 0x0251531d, 0x03777cac, 0x020b82be, 0x00985920, 0x0142b463, 0x002c87f0}}}, + {X: Field{[10]uint32{0x008da322, 0x01b0f160, 0x03f36172, 0x01182e0e, 0x03ca04b8, 0x00d6ce42, 0x01132e9b, 0x018e8615, 0x032b9d4a, 0x00311a0a}}, Y: Field{[10]uint32{0x035f6972, 0x02d740f4, 0x025a26ee, 0x016a0d73, 0x0014e907, 0x00f8dbc1, 0x02597622, 0x02e8c86d, 0x006a7100, 0x003c96a4}}}, + {X: Field{[10]uint32{0x0280d63a, 0x028419ba, 0x0003da99, 0x03ceb810, 0x02559159, 0x025f1d97, 0x027c4055, 0x02711e05, 0x016d60f4, 0x003aec3f}}, Y: Field{[10]uint32{0x02a0b0f7, 0x0321a39a, 0x00350afd, 0x019dc1bd, 0x00c4202f, 0x022d0c72, 0x022ffcf2, 0x03218876, 0x0160667a, 0x003acdf4}}}, + {X: Field{[10]uint32{0x01a5597a, 0x006f2f02, 0x0334e355, 0x026257d5, 0x0165ffb0, 0x03fd8dfc, 0x0267cbbb, 0x02f2d000, 0x012070d8, 0x001e3c4b}}, Y: Field{[10]uint32{0x03bb78f8, 0x005c240a, 0x037407de, 0x038ce65c, 0x037419a3, 0x021f6672, 0x03574d2c, 0x005d586e, 0x02b33662, 0x0010a5da}}}, + {X: Field{[10]uint32{0x01919f69, 0x022befa1, 0x01eee579, 0x02ef9d9e, 0x0235ae41, 0x02525886, 0x039fbc2b, 0x012d8e60, 0x004af621, 0x0000f7ff}}, Y: Field{[10]uint32{0x03f2c456, 0x03fab615, 0x020e9036, 0x03fa40a1, 0x02a13480, 0x02765d40, 0x01d15a42, 0x0086b88b, 0x036b1b40, 0x001605d2}}}, + {X: Field{[10]uint32{0x015a15cc, 0x0175d16d, 0x028bf55d, 0x0034c914, 0x00bd16bf, 0x036ddbae, 0x015198f4, 0x010b2884, 0x0393a4ed, 0x00104324}}, Y: Field{[10]uint32{0x02d58306, 0x03ea8297, 0x003d7059, 0x0069cc7f, 0x0283c298, 0x0328945d, 0x00c2cf9b, 0x02e26f05, 0x00b1df71, 0x001013fd}}}, + {X: Field{[10]uint32{0x024e3649, 0x01b1256f, 0x031966c1, 0x01a599e5, 0x00b93e65, 0x03f9a5df, 0x03366326, 0x02c1e4f7, 0x015687d6, 0x001ad354}}, Y: Field{[10]uint32{0x0169f4e3, 0x0304697a, 0x01c815d6, 0x002a5544, 0x001a2556, 0x036c5d83, 0x02a03152, 0x0081fd74, 0x0094bbac, 0x00191e92}}}, + {X: Field{[10]uint32{0x01f34247, 0x01c716e9, 0x01fd94a7, 0x0091af93, 0x016f0d87, 0x00017670, 0x03ccfd85, 0x01661bc2, 0x017ae87d, 0x00163feb}}, Y: Field{[10]uint32{0x00069817, 0x0173c03c, 0x02ce5e50, 0x01afb8da, 0x03b33fba, 0x03218a70, 0x00d6f93e, 0x0057ebd4, 0x02d8f9ab, 0x002b62de}}}, + {X: Field{[10]uint32{0x02a757fd, 0x003ab3e9, 0x02c72b31, 0x01a5ca24, 0x00adb956, 0x00fa20ed, 0x03277382, 0x03eb782b, 0x001d1835, 0x0039b4f9}}, Y: Field{[10]uint32{0x01359c15, 0x0283bc08, 0x02e61045, 0x02aed09e, 0x03d6395c, 0x036f6e3b, 0x0303e425, 0x03b39f3b, 0x008cb580, 0x00284db2}}}, + {X: Field{[10]uint32{0x01953b35, 0x02ba51c3, 0x032a5573, 0x010828b4, 0x023b561b, 0x006f0409, 0x01044792, 0x0280c2b0, 0x022b43aa, 0x003f11f1}}, Y: Field{[10]uint32{0x006224f0, 0x00c18009, 0x03b29502, 0x00982ce4, 0x01627236, 0x00287d44, 0x02b58104, 0x01e019cc, 0x011d65fc, 0x00174c63}}}, + {X: Field{[10]uint32{0x03db251b, 0x02b2df1b, 0x031ca36b, 0x028a4cf2, 0x02d0a1b8, 0x00d54e19, 0x0278da90, 0x00deec23, 0x0067cbcb, 0x0033ab8a}}, Y: Field{[10]uint32{0x02bb3dfd, 0x00b47742, 0x00c16d4c, 0x00a4e862, 0x03956cc6, 0x010dc9ed, 0x0017b373, 0x02aa55e5, 0x007ec163, 0x00122fcb}}}, + {X: Field{[10]uint32{0x03efeab0, 0x02090f86, 0x02d78daa, 0x01d3225c, 0x039195fb, 0x0145b621, 0x03408d82, 0x00d6d708, 0x0378c847, 0x002aec48}}, Y: Field{[10]uint32{0x0366698e, 0x01646ccf, 0x01a02abb, 0x00d99c10, 0x01ce901c, 0x032295b6, 0x010be913, 0x02919767, 0x024b0da5, 0x001682fd}}}, + {X: Field{[10]uint32{0x0159eeaf, 0x03a9c00c, 0x0024f274, 0x03a50e92, 0x021a576c, 0x038458c5, 0x005302b0, 0x031f2486, 0x02398330, 0x0035de07}}, Y: Field{[10]uint32{0x0106651a, 0x01192bc3, 0x03310fbb, 0x02665bdb, 0x01261aed, 0x006f8f5f, 0x027398dd, 0x03171cfb, 0x00324e07, 0x0018d069}}}, + {X: Field{[10]uint32{0x024c760c, 0x02dda11f, 0x01a6dbe5, 0x00cf7f50, 0x016f3ad1, 0x00a8877c, 0x0171646d, 0x008115cb, 0x01cd46ec, 0x0029a463}}, Y: Field{[10]uint32{0x0132fa9c, 0x015b9f42, 0x034e51f0, 0x03ecbd98, 0x001d6c7c, 0x01484e5f, 0x030e4b53, 0x01263669, 0x02ba378d, 0x00303946}}}, + {X: Field{[10]uint32{0x03d1a204, 0x001132a0, 0x027706ef, 0x03809234, 0x027785e2, 0x017f65c1, 0x02b340a6, 0x037980e4, 0x02e4fbb5, 0x00104e93}}, Y: Field{[10]uint32{0x023dd197, 0x03c5cbe2, 0x027c343a, 0x01d1476c, 0x016595a6, 0x006c23f4, 0x02bc668d, 0x023cd0ef, 0x0106c18a, 0x00280d89}}}, + {X: Field{[10]uint32{0x0204001c, 0x00560717, 0x011a8968, 0x01988dcc, 0x0287fd87, 0x03ef4449, 0x004aa082, 0x002483db, 0x0024de8b, 0x003869ef}}, Y: Field{[10]uint32{0x026bed16, 0x02ac4006, 0x0249b29b, 0x02c7bea3, 0x013a3d90, 0x00695719, 0x01aeea26, 0x021cf452, 0x01fdd0a2, 0x000f8eea}}}, + {X: Field{[10]uint32{0x01333a75, 0x0283f0f7, 0x0142d8a9, 0x026c5e56, 0x01ab1dde, 0x028cdf81, 0x02e077f8, 0x033312d6, 0x02a0a147, 0x003fe4a4}}, Y: Field{[10]uint32{0x0223a166, 0x03d6de1e, 0x007a43b6, 0x00ae0c17, 0x02b555ea, 0x016b577f, 0x014b4122, 0x00d18dd9, 0x027c5f7a, 0x003943c0}}}, + {X: Field{[10]uint32{0x00cb9c0c, 0x000e7513, 0x0140d900, 0x03186600, 0x03afe849, 0x001170b4, 0x007a36b0, 0x02774e77, 0x0223437c, 0x003ab959}}, Y: Field{[10]uint32{0x0132e043, 0x01a25d37, 0x037be39f, 0x0100dcb5, 0x0055e62e, 0x00bf9f9e, 0x02b5a9b2, 0x01d0db72, 0x01e99284, 0x003c6e32}}}, + {X: Field{[10]uint32{0x00bd5282, 0x000b2d55, 0x012273d0, 0x0012f322, 0x017f9c60, 0x01230e79, 0x02da0f30, 0x028f7f87, 0x00be3467, 0x001f7483}}, Y: Field{[10]uint32{0x001485d0, 0x01a9a25f, 0x014c64eb, 0x020a377f, 0x02ee9225, 0x005dca91, 0x034c3f83, 0x034b5533, 0x0323f035, 0x003b134b}}}, + {X: Field{[10]uint32{0x02a877eb, 0x00b68fc4, 0x03fc73a0, 0x03af6c36, 0x03e4e245, 0x00ef68f0, 0x03b88703, 0x004a4551, 0x01cc5acf, 0x000d6604}}, Y: Field{[10]uint32{0x0108a792, 0x02b3663a, 0x03a59bb6, 0x02f8ada0, 0x037702d1, 0x00470e89, 0x03f916f5, 0x028f781b, 0x00878b97, 0x003b4bd4}}}, + {X: Field{[10]uint32{0x01a71c24, 0x00440b92, 0x005a2c03, 0x03282f18, 0x035a6c76, 0x00689346, 0x02d57ea0, 0x0329393a, 0x009cf2bc, 0x003eccfa}}, Y: Field{[10]uint32{0x031c9f45, 0x00a1874b, 0x0180e019, 0x010309ba, 0x03d7fca9, 0x00aa49cb, 0x035b9584, 0x009c15ea, 0x02f5ca60, 0x0031d780}}}, + {X: Field{[10]uint32{0x01f687aa, 0x03aed5b9, 0x036069d1, 0x003bca4e, 0x01b7b297, 0x0016944a, 0x034f836b, 0x01d28054, 0x033e5eed, 0x00028734}}, Y: Field{[10]uint32{0x02c4a6b0, 0x01e34207, 0x01abcc99, 0x01ea25a8, 0x01bdefc3, 0x0390e03a, 0x02b60cc1, 0x030d14ec, 0x02b90ccf, 0x003e4346}}}, + {X: Field{[10]uint32{0x00213614, 0x014d4131, 0x00999b85, 0x027876cc, 0x025d9f16, 0x03b62b24, 0x03383cfc, 0x00edeafe, 0x02b90364, 0x001185a5}}, Y: Field{[10]uint32{0x0033bc72, 0x0035668c, 0x018d60de, 0x0339a566, 0x03ee91c4, 0x02bafff4, 0x0340a859, 0x003e8323, 0x00775f30, 0x0019d3d7}}}, + {X: Field{[10]uint32{0x014ab025, 0x00356f78, 0x01727f39, 0x03c89d1c, 0x021fd5cd, 0x00fdfa2a, 0x00885ae9, 0x027daf33, 0x02221b58, 0x001b1aaa}}, Y: Field{[10]uint32{0x02077538, 0x034b2eea, 0x0015c9f8, 0x005e2329, 0x02aeb844, 0x02d43e9d, 0x0164483f, 0x02e4346b, 0x020340e1, 0x0029df17}}}, + {X: Field{[10]uint32{0x0261c38b, 0x013f35d3, 0x00268387, 0x0069cab3, 0x01792eff, 0x039ca79b, 0x032c7ee6, 0x00cc4340, 0x0391927f, 0x00324634}}, Y: Field{[10]uint32{0x000dfb5b, 0x010f201e, 0x03965742, 0x01c9b89f, 0x00fce24a, 0x016db2d6, 0x021bed0e, 0x0123e3b6, 0x006c3460, 0x00163f5d}}}, + {X: Field{[10]uint32{0x01ea5918, 0x03b1625b, 0x022c2142, 0x03c0cfef, 0x019240c3, 0x004f1253, 0x02c26542, 0x028fd792, 0x02161ca0, 0x001219e7}}, Y: Field{[10]uint32{0x021d1a41, 0x0347c78f, 0x004a9a30, 0x039e73c8, 0x03b2a19f, 0x019e1038, 0x03a29667, 0x02bf8fa4, 0x03fe300c, 0x00155be4}}}, + {X: Field{[10]uint32{0x02e7b858, 0x01a28c31, 0x02584699, 0x0166b11a, 0x025e9456, 0x02ab0216, 0x02d6eede, 0x0191029c, 0x01a9e46b, 0x0031a301}}, Y: Field{[10]uint32{0x01de450d, 0x00991805, 0x032b61b1, 0x01a934af, 0x03c76874, 0x000da845, 0x03d64a1d, 0x03fe02f8, 0x01dc35d4, 0x002e2d2d}}}, + {X: Field{[10]uint32{0x01444e6a, 0x00e1d5e7, 0x02dc9f05, 0x038dbcc9, 0x0121e3df, 0x01b151a6, 0x0176dc4b, 0x01227e3e, 0x03106358, 0x00344cfb}}, Y: Field{[10]uint32{0x02f968cb, 0x00f140ae, 0x005becbf, 0x03af8cad, 0x02327ec3, 0x03f59a9b, 0x02b0f57a, 0x0034b09c, 0x03c4db69, 0x000b19aa}}}, + {X: Field{[10]uint32{0x01f976ae, 0x02b416cf, 0x0119392d, 0x01828807, 0x0261ca0a, 0x0229f8b6, 0x00766dc4, 0x0277aac4, 0x03598d75, 0x0014d513}}, Y: Field{[10]uint32{0x0069cd47, 0x010aff8a, 0x017e879a, 0x00454df8, 0x030993d7, 0x028666b5, 0x004e3f03, 0x01ebbc08, 0x005e61cb, 0x00112688}}}, + {X: Field{[10]uint32{0x03b8b331, 0x00d2b2e0, 0x00a622fe, 0x0177b8dd, 0x009254c6, 0x012dadf0, 0x02263851, 0x0144cce7, 0x00740fda, 0x000c4228}}, Y: Field{[10]uint32{0x028b6243, 0x00c04c89, 0x0115b5d9, 0x0347d678, 0x00d6fc05, 0x030bc891, 0x01a473da, 0x00ffaa2c, 0x010d5426, 0x0010bb72}}}, + {X: Field{[10]uint32{0x00b4b23c, 0x0336329f, 0x03962154, 0x0301ac8b, 0x012ee58a, 0x03ad5618, 0x0295099a, 0x00701367, 0x000d052c, 0x000599b1}}, Y: Field{[10]uint32{0x03a82fb9, 0x01112c64, 0x0284fb6c, 0x011f4807, 0x00abafc2, 0x001d4a55, 0x0355923e, 0x0198e2aa, 0x0341ae04, 0x0014196e}}}, + {X: Field{[10]uint32{0x0247722e, 0x01c915fb, 0x02ad53a5, 0x0242ef57, 0x02ed80fa, 0x01dacb60, 0x001290df, 0x039aa3c0, 0x03ebd3ee, 0x00325b41}}, Y: Field{[10]uint32{0x0220baf3, 0x0370b31f, 0x032c8d00, 0x0391e290, 0x0113ba06, 0x0262dd27, 0x0016af17, 0x02dfa68d, 0x0004447f, 0x0034f5a7}}}, + {X: Field{[10]uint32{0x0181b49d, 0x02136447, 0x03479fce, 0x02f5ecb0, 0x00647fa7, 0x0339d50b, 0x0369a9e8, 0x016c15e1, 0x0039b11b, 0x0002a7ff}}, Y: Field{[10]uint32{0x00bcbee7, 0x0348489a, 0x03747375, 0x0124e394, 0x0280a644, 0x016101c4, 0x00894dc2, 0x00a3dfa6, 0x024882e9, 0x002fb084}}}, + {X: Field{[10]uint32{0x03af0632, 0x0317eefd, 0x00f2737f, 0x01fc6980, 0x03e82578, 0x024c83f4, 0x015d3f52, 0x024e0239, 0x028ccd4c, 0x0014b284}}, Y: Field{[10]uint32{0x0135f7c4, 0x010b378c, 0x02ec370f, 0x024e0d9d, 0x0137ffa4, 0x03676fee, 0x02bab014, 0x0232ded3, 0x028095a9, 0x00211ba2}}}, + {X: Field{[10]uint32{0x01407c20, 0x03e8d3aa, 0x039ae8e0, 0x00948ca6, 0x00006985, 0x0127df25, 0x00abc41e, 0x02649dee, 0x02c177fd, 0x003fe4aa}}, Y: Field{[10]uint32{0x03fdcfb5, 0x01e7d163, 0x03331a33, 0x024d0a91, 0x03dafd9a, 0x01c8c0dc, 0x03bf2a9b, 0x0149cfae, 0x00dd5aaf, 0x002bc363}}}, + {X: Field{[10]uint32{0x03991e0c, 0x007406c9, 0x03f09a54, 0x02c75ca7, 0x025fb653, 0x005340be, 0x0163c973, 0x0028f0e0, 0x033ed3c1, 0x0029a4a9}}, Y: Field{[10]uint32{0x0068b905, 0x026f9a79, 0x03809cff, 0x0126694d, 0x02aa05c9, 0x02e09056, 0x0063d006, 0x034fa036, 0x015a3e5b, 0x0001c8bd}}}, + {X: Field{[10]uint32{0x0120aefd, 0x031ffb50, 0x024e2e2f, 0x0298c573, 0x006b813b, 0x03263520, 0x02fc4cd2, 0x026a4f8c, 0x003f7a62, 0x00367967}}, Y: Field{[10]uint32{0x030214bb, 0x023853eb, 0x00d30eb0, 0x00e44eaa, 0x013234be, 0x002691ff, 0x01bf6589, 0x00c4653d, 0x01942307, 0x00093389}}}, + {X: Field{[10]uint32{0x00a0f6ff, 0x02394d01, 0x0358714b, 0x0169816a, 0x034dde8d, 0x02af3c16, 0x0191ef79, 0x02c42592, 0x030f7771, 0x001d3949}}, Y: Field{[10]uint32{0x03b1670f, 0x02c1186c, 0x0088714b, 0x0199a455, 0x0371ced0, 0x00d5ac78, 0x03a285f1, 0x00fc25a1, 0x01a3a4a8, 0x000ab618}}}, + {X: Field{[10]uint32{0x01d4420c, 0x0007d64c, 0x03f587a2, 0x0292161f, 0x02744668, 0x0255f0e8, 0x02856157, 0x03df9d86, 0x02301c43, 0x002e45a4}}, Y: Field{[10]uint32{0x0019536f, 0x007dd396, 0x03e5bebe, 0x008fd6c8, 0x03659ea4, 0x01945696, 0x01818e0c, 0x020a0133, 0x025bc126, 0x002f4d81}}}, + {X: Field{[10]uint32{0x024d51ee, 0x00e7640d, 0x03cd8792, 0x0325654e, 0x02cd01fd, 0x0016dfec, 0x02d72115, 0x01a36a5c, 0x02538645, 0x000dfebc}}, Y: Field{[10]uint32{0x03c15f85, 0x0127ab4e, 0x02823657, 0x008dbdef, 0x01d8c125, 0x028ef258, 0x02ea7360, 0x02cf9f9a, 0x02ce749d, 0x002da6b8}}}, + {X: Field{[10]uint32{0x020cf8d2, 0x0021eee8, 0x0214b43b, 0x02630661, 0x011c379f, 0x00373419, 0x0082477f, 0x004e2cd2, 0x014c4a1c, 0x00386504}}, Y: Field{[10]uint32{0x0098a93b, 0x00dd62ba, 0x00d6789e, 0x034f5c75, 0x00889f2a, 0x01452a66, 0x0182cf06, 0x0388b8ec, 0x034bb90a, 0x001e8ebe}}}, + {X: Field{[10]uint32{0x0217ddaa, 0x0150de7e, 0x0333cca0, 0x03bc245c, 0x011c8b13, 0x02056234, 0x008e4b3c, 0x02d145ce, 0x03010d3f, 0x000b38b6}}, Y: Field{[10]uint32{0x027bbbc0, 0x00c35dcd, 0x00922e2c, 0x02ce0043, 0x0074285c, 0x0346955a, 0x021529ae, 0x01daa617, 0x029daf0e, 0x00248cb6}}}, + {X: Field{[10]uint32{0x016f051f, 0x0063e7cf, 0x01f49986, 0x01b9658d, 0x000bd66c, 0x03fa9da2, 0x00e2e821, 0x01c114f7, 0x00484bdb, 0x0030a4bb}}, Y: Field{[10]uint32{0x03b57d6d, 0x0067b225, 0x008872b1, 0x00d849bd, 0x0312b777, 0x03454c91, 0x00af49bf, 0x039a7134, 0x00f06b81, 0x0008429d}}}, + {X: Field{[10]uint32{0x01acfeee, 0x00c80da9, 0x002ad3e1, 0x020f5ded, 0x020933db, 0x0360eb4f, 0x03b423cc, 0x022bbda5, 0x01c09761, 0x00056f32}}, Y: Field{[10]uint32{0x008a7a33, 0x00ea01ae, 0x0211c1a8, 0x02a403a5, 0x01a1bb98, 0x01244b28, 0x033c4901, 0x025bf6fe, 0x02f11bb9, 0x003a7f1f}}}, + {X: Field{[10]uint32{0x021e7785, 0x0132c91b, 0x03113fd2, 0x031a6756, 0x00848639, 0x017cb4a6, 0x03e45fe5, 0x00ef5e5e, 0x00af50f1, 0x00118467}}, Y: Field{[10]uint32{0x0042ea3b, 0x009ea4c2, 0x01215b13, 0x00056bac, 0x00ba3015, 0x03be4cad, 0x022cf8f9, 0x01bae5dd, 0x0391f4c5, 0x001a880f}}}, + {X: Field{[10]uint32{0x02f9ecf4, 0x037e216d, 0x03a649d9, 0x025179ac, 0x01cf1410, 0x03687e7f, 0x0149a3d2, 0x03c60aa5, 0x03943e4d, 0x003ce85d}}, Y: Field{[10]uint32{0x02cf7e8f, 0x033b041b, 0x02115c80, 0x03ff20bb, 0x00444a1d, 0x0167e0ca, 0x02b66198, 0x02b4e7f0, 0x03cc5e82, 0x002cd3ad}}}, + {X: Field{[10]uint32{0x03913fe4, 0x001d71ad, 0x03d67536, 0x03e940a5, 0x01fa98bd, 0x016e6831, 0x01cbd45f, 0x03d1a36e, 0x027484a7, 0x0033be42}}, Y: Field{[10]uint32{0x02301815, 0x0290289a, 0x0173730f, 0x01579715, 0x01fb79a5, 0x00941e1d, 0x03029465, 0x03ef0a19, 0x02ad2a43, 0x0034243b}}}, + {X: Field{[10]uint32{0x035702ce, 0x031bb4a8, 0x00b06833, 0x02dae418, 0x0126c528, 0x02fe9598, 0x00b88b24, 0x02a4e3b1, 0x0214987a, 0x00087628}}, Y: Field{[10]uint32{0x004579e4, 0x019bc9b6, 0x03c8e94b, 0x03a69407, 0x00f736df, 0x00228a0c, 0x028167c0, 0x0288ef18, 0x000d5b65, 0x0030d50d}}}, + {X: Field{[10]uint32{0x021ca53e, 0x00e5460e, 0x0361d5d1, 0x03e91b81, 0x00e19196, 0x020b6f49, 0x0204f6cf, 0x02f9298a, 0x03279049, 0x001ac63f}}, Y: Field{[10]uint32{0x01ffa3b7, 0x033f6cb1, 0x038d86ca, 0x035c948b, 0x026343f0, 0x01a63e8c, 0x001e9b26, 0x004d9e3e, 0x030c52c0, 0x003be01b}}}, + {X: Field{[10]uint32{0x03466e6f, 0x02b8c772, 0x020ee850, 0x00db0206, 0x00bab07c, 0x028f99cf, 0x0332afbe, 0x03301354, 0x00f20452, 0x001f63bd}}, Y: Field{[10]uint32{0x00fa0c0d, 0x0298910b, 0x017bc137, 0x011fc644, 0x01d224da, 0x03c43db2, 0x03367d0d, 0x033bbc9c, 0x026755a2, 0x000c9185}}}, + {X: Field{[10]uint32{0x00d12cab, 0x012d2208, 0x01afd699, 0x0182c74c, 0x02034135, 0x016b1d28, 0x03b63276, 0x015927d6, 0x002155d1, 0x0031f786}}, Y: Field{[10]uint32{0x02eaa23a, 0x014b39e5, 0x02844482, 0x00d8475f, 0x007fbe01, 0x030c9036, 0x03b86595, 0x00b03f24, 0x0056c5fb, 0x00366596}}}, + {X: Field{[10]uint32{0x0381b294, 0x0224ef50, 0x005c600f, 0x0025ca65, 0x03eddeff, 0x017e93ac, 0x01eb6ee4, 0x00b0ec62, 0x033a915e, 0x00133b2c}}, Y: Field{[10]uint32{0x02a3aeb1, 0x02ef6387, 0x036ffd1b, 0x0384cc42, 0x033534d6, 0x02dc0335, 0x02250357, 0x0072e111, 0x0112b5e6, 0x0033c5fc}}}, + {X: Field{[10]uint32{0x02255749, 0x02a99619, 0x00c10204, 0x00aca172, 0x001c9bc7, 0x033c03f9, 0x003ab5d4, 0x0181aed3, 0x0064bfce, 0x00209b3d}}, Y: Field{[10]uint32{0x036849c4, 0x02388d5e, 0x011cbb87, 0x0192c600, 0x036d7ca5, 0x00542a8b, 0x016fabfb, 0x00a16d45, 0x0031527d, 0x001ae8ed}}}, + {X: Field{[10]uint32{0x008f8f62, 0x0061f9d9, 0x0028e0b2, 0x002360ba, 0x01de51d6, 0x035bf043, 0x012ba922, 0x03491546, 0x02c6f497, 0x003204b6}}, Y: Field{[10]uint32{0x008b317e, 0x01ad2aec, 0x028f61ba, 0x0361ddcf, 0x002be94d, 0x03ebd4ff, 0x026ee1ae, 0x001a0204, 0x00c77363, 0x000340ba}}}, + {X: Field{[10]uint32{0x00ff8851, 0x03574ff8, 0x00d1e3c6, 0x01adb8e3, 0x03aa4592, 0x027c53ae, 0x01eaa8bc, 0x01fd1f91, 0x010ebd96, 0x00149a55}}, Y: Field{[10]uint32{0x01a7455b, 0x021987e6, 0x0295a38b, 0x0340c21a, 0x01b45963, 0x0346cff4, 0x03422ffc, 0x03b3b510, 0x012026e3, 0x0028565f}}}, + {X: Field{[10]uint32{0x004d7676, 0x02bfb9fa, 0x01e9baf1, 0x01b55294, 0x00c7c2ae, 0x037102ea, 0x002721fc, 0x014b3ef1, 0x032980e6, 0x001ff3f2}}, Y: Field{[10]uint32{0x002cfcdd, 0x037afe22, 0x00ce9f95, 0x03d59aa7, 0x02a4d044, 0x0323c675, 0x02bcbaaa, 0x0238d3b1, 0x01904a40, 0x002afdcb}}}, + {X: Field{[10]uint32{0x00a9f451, 0x03712d99, 0x0057c079, 0x03ae2eaa, 0x033d5f25, 0x00ca9a81, 0x00e18a21, 0x03841212, 0x02a04597, 0x00217c06}}, Y: Field{[10]uint32{0x01f081af, 0x013b11f9, 0x0013204b, 0x03072d38, 0x025398ce, 0x016f3d15, 0x03b71ab3, 0x02061dee, 0x00eb8a05, 0x003dd18f}}}, + {X: Field{[10]uint32{0x02885628, 0x03e37fe4, 0x035fda01, 0x02f08900, 0x00dc1a5f, 0x003fafbb, 0x03fee1d1, 0x02183eb0, 0x021a7dcd, 0x000256d2}}, Y: Field{[10]uint32{0x02f7f772, 0x0101bb2f, 0x00d97f70, 0x03b48dce, 0x021f80bc, 0x0131bb8f, 0x029dfa69, 0x01119fbe, 0x039c5bd9, 0x000a8337}}}, + {X: Field{[10]uint32{0x036c51c5, 0x0243b35f, 0x009f049b, 0x02b3b11c, 0x008cd95c, 0x00ddd4f6, 0x014b38ce, 0x03742ec9, 0x00a624dd, 0x00013d89}}, Y: Field{[10]uint32{0x037a4fa5, 0x039612f1, 0x02bd070c, 0x03ac6e5d, 0x00668de4, 0x0333f515, 0x0220dcd8, 0x03b3640a, 0x028302ef, 0x0021d2a6}}}, + {X: Field{[10]uint32{0x0106b48d, 0x03759b5d, 0x00043437, 0x0215a635, 0x02a2914d, 0x0117a71b, 0x0040f585, 0x014def39, 0x0112e18b, 0x000e781a}}, Y: Field{[10]uint32{0x02f352e0, 0x01e859c1, 0x03ef18db, 0x01b51a56, 0x0200f06c, 0x004a2a84, 0x0080153c, 0x00c25aaf, 0x020a16e9, 0x003bfc83}}}, + {X: Field{[10]uint32{0x00f1ace9, 0x005ed19e, 0x013107a7, 0x02d97bee, 0x014c1d41, 0x032b6e5e, 0x03f4f590, 0x01e0c5d3, 0x013266d6, 0x0014bb70}}, Y: Field{[10]uint32{0x00d402d1, 0x01aef071, 0x0127c3af, 0x01563d1a, 0x03cb07cf, 0x01a135f4, 0x02c0bf49, 0x0078ff8c, 0x0202c678, 0x00395a78}}}, + {X: Field{[10]uint32{0x0328465f, 0x0290fcd0, 0x00d3a1df, 0x0235bcaa, 0x01e4e945, 0x02457f23, 0x0287f07c, 0x02041cf8, 0x0348964b, 0x0038dd92}}, Y: Field{[10]uint32{0x00fdb023, 0x01723cd3, 0x01b6c3ad, 0x02a94e9e, 0x005b7261, 0x03435d5d, 0x01b460f6, 0x0382e8d4, 0x024bfb13, 0x002f78a9}}}, + {X: Field{[10]uint32{0x00f513e6, 0x009fbfef, 0x00ebe756, 0x02b6710b, 0x03e1c81a, 0x03e05cca, 0x0038768e, 0x01a638fb, 0x01077c77, 0x00203bf9}}, Y: Field{[10]uint32{0x0388b709, 0x03c41280, 0x00bc3483, 0x005d6bb5, 0x02a9df2e, 0x014f4f67, 0x01e60599, 0x0247a5a5, 0x031bc543, 0x001a4319}}}, + {X: Field{[10]uint32{0x0108b641, 0x00fdc3f2, 0x02728517, 0x01fa4fe3, 0x0319b0bf, 0x01f348fb, 0x032bcac8, 0x03125e8b, 0x03d50ebc, 0x001212b1}}, Y: Field{[10]uint32{0x00ef371e, 0x013a97a4, 0x02eb61b4, 0x0254530a, 0x015bc8c9, 0x014fcc9c, 0x02b85516, 0x01c8da7c, 0x00e6f3b1, 0x0007655c}}}, + {X: Field{[10]uint32{0x03e3d124, 0x023ed7dd, 0x03f6536b, 0x0098e007, 0x02adf26c, 0x0105737e, 0x03ca53e4, 0x02f76137, 0x023fbf1f, 0x00272627}}, Y: Field{[10]uint32{0x00212a38, 0x02aac322, 0x02dd4c79, 0x010b5fc5, 0x002993c4, 0x023fb8eb, 0x00b3b802, 0x0058ee59, 0x021f5755, 0x0028d2b9}}}, + {X: Field{[10]uint32{0x01a5066b, 0x02315f5d, 0x018e0930, 0x034a5ec3, 0x0032846d, 0x0278dfe0, 0x016570f1, 0x03f9fd91, 0x030f601a, 0x00022e3e}}, Y: Field{[10]uint32{0x0048c9e7, 0x02ca783a, 0x03b3c240, 0x01c89bc0, 0x01d6166c, 0x003f59e8, 0x0232f100, 0x039b26cb, 0x02feffc4, 0x0001e162}}}, + {X: Field{[10]uint32{0x02e78177, 0x0367581f, 0x000ef451, 0x00e88470, 0x03bce095, 0x00297601, 0x01baa79e, 0x035e6a60, 0x02740ee1, 0x0038df43}}, Y: Field{[10]uint32{0x009f8f9c, 0x008fafec, 0x02e6f4bd, 0x024eaad3, 0x01a07d05, 0x03f9661d, 0x01b5625b, 0x0097d37c, 0x028502ad, 0x0034a284}}}, + {X: Field{[10]uint32{0x0325c147, 0x02a79c04, 0x00e194b2, 0x03555334, 0x03281052, 0x01d95ec7, 0x0258e754, 0x00da0eb5, 0x037e9a00, 0x00203215}}, Y: Field{[10]uint32{0x024d945c, 0x018d1bd5, 0x03fe432a, 0x0266f3ee, 0x03fe2baf, 0x01ca5cd1, 0x03ba8a0d, 0x028babb1, 0x00cd7ca3, 0x0002cff4}}}, + {X: Field{[10]uint32{0x02a8c6a1, 0x02ce0ccf, 0x0349adde, 0x0234b414, 0x0150f6ba, 0x01eb806a, 0x02f79026, 0x0087954d, 0x016d0341, 0x0039c117}}, Y: Field{[10]uint32{0x02181fba, 0x0222ae22, 0x019e4e7d, 0x00bfa5d5, 0x0060b37c, 0x00a97749, 0x01571d9c, 0x02537f85, 0x00db3269, 0x001cc1aa}}}, + {X: Field{[10]uint32{0x012e0d71, 0x025e3219, 0x029804f2, 0x03df2cd1, 0x02d87554, 0x0300e226, 0x03af0b13, 0x011fedac, 0x024b850a, 0x001574b6}}, Y: Field{[10]uint32{0x03e16e7c, 0x01879e77, 0x02780723, 0x01b57311, 0x010189a5, 0x008bbb97, 0x020b7b4f, 0x0343db34, 0x0182c861, 0x001ab03e}}}, + {X: Field{[10]uint32{0x01a38d2f, 0x00736c2c, 0x019f55bd, 0x00710100, 0x03a1e86d, 0x00540300, 0x03a5ff21, 0x00bdff20, 0x020955a2, 0x0033958b}}, Y: Field{[10]uint32{0x021bb865, 0x01b65ad4, 0x02d314bd, 0x00c9bc73, 0x02474070, 0x03717e0b, 0x030a165e, 0x0311ef1a, 0x004db4aa, 0x00247780}}}, + {X: Field{[10]uint32{0x0054773b, 0x0164b8de, 0x036fecc7, 0x02e1ae4e, 0x0100cd0e, 0x00c41fc7, 0x011bd645, 0x02bc15fe, 0x021f0596, 0x001d3803}}, Y: Field{[10]uint32{0x00e1d217, 0x03edd276, 0x01374e13, 0x005445e4, 0x016fa9f0, 0x0042851b, 0x0311867b, 0x00a94fac, 0x00a338e5, 0x000472a2}}}, + {X: Field{[10]uint32{0x0104eb48, 0x0267e788, 0x00530a2e, 0x00e6561a, 0x0368214d, 0x0324bb65, 0x003e400a, 0x03db2476, 0x036bc194, 0x002ba3c2}}, Y: Field{[10]uint32{0x03ce4cf2, 0x0173bb35, 0x02362c85, 0x01cc5191, 0x00d4aa8f, 0x02d5f2fe, 0x0127de9e, 0x02a4c0d8, 0x00420dc0, 0x003a5cff}}}, + {X: Field{[10]uint32{0x03891ae7, 0x00bf737b, 0x03674158, 0x0089bdda, 0x037854e7, 0x0197ccf4, 0x008e0c05, 0x00d9d784, 0x006c8df8, 0x00102a30}}, Y: Field{[10]uint32{0x007bf7ed, 0x00155762, 0x0224ea10, 0x00260ebd, 0x01b8ff9c, 0x003eaafb, 0x029e0b04, 0x01abf4f4, 0x0050b511, 0x0005ae9e}}}, + {X: Field{[10]uint32{0x01f83b33, 0x037c6f1b, 0x00e487f6, 0x02c13490, 0x03926795, 0x0187c7ff, 0x02b410f8, 0x03dbea8a, 0x02545c57, 0x00187aa7}}, Y: Field{[10]uint32{0x0279ed15, 0x01c56076, 0x0003c490, 0x019ce2a3, 0x02b9063e, 0x03514a7c, 0x021791f7, 0x005f0dcb, 0x012ae0b2, 0x0031a7b0}}}, + {X: Field{[10]uint32{0x01d37632, 0x0032d7b0, 0x031cc30a, 0x03b09920, 0x03d73e25, 0x00517f05, 0x01f55f72, 0x02aa93f3, 0x00d4440c, 0x00072227}}, Y: Field{[10]uint32{0x02d72fdf, 0x016f2508, 0x00166ee5, 0x02184558, 0x00574f5b, 0x036d792c, 0x014a2237, 0x0299f1cc, 0x0246131f, 0x000106d4}}}, + {X: Field{[10]uint32{0x0249525d, 0x0059a863, 0x02abb4ab, 0x001894e4, 0x01c58e0d, 0x02d42fe9, 0x02a99d3a, 0x021f9e60, 0x0090791d, 0x003fca56}}, Y: Field{[10]uint32{0x01454570, 0x02680686, 0x00a58e61, 0x027fbef9, 0x02c37087, 0x02201bef, 0x0249baf8, 0x004d9065, 0x00de1995, 0x00282599}}}, + {X: Field{[10]uint32{0x00e95f99, 0x02a1d9e1, 0x037857bc, 0x02bb66f7, 0x0174e399, 0x023e2433, 0x00939e5b, 0x007f401f, 0x02bfcfca, 0x0017acba}}, Y: Field{[10]uint32{0x032c9871, 0x03ee3efd, 0x00f63031, 0x0097f844, 0x0001f46f, 0x00589976, 0x01aff120, 0x01e0f080, 0x01701c9a, 0x001310ba}}}, + {X: Field{[10]uint32{0x02cbaf91, 0x01edad3d, 0x0361fcfc, 0x0136054f, 0x033b17bf, 0x0281c706, 0x03f8ce17, 0x0324ed6c, 0x008cdbcc, 0x0010f954}}, Y: Field{[10]uint32{0x03dfdcfc, 0x001cd0e6, 0x0063815a, 0x01cf6c90, 0x03c853bb, 0x002694c1, 0x01ec388d, 0x029c7942, 0x0378438b, 0x002d7b63}}}, + {X: Field{[10]uint32{0x01b56f53, 0x0303dd7f, 0x02c995b0, 0x021dfdb8, 0x00eb513f, 0x02bf94cf, 0x0207261c, 0x00837f21, 0x013023cb, 0x003d745a}}, Y: Field{[10]uint32{0x026ece68, 0x03837084, 0x008f492c, 0x0101bacb, 0x002557dd, 0x00f8a597, 0x03c4bf87, 0x020ccbdf, 0x01680152, 0x00394e6c}}}, + {X: Field{[10]uint32{0x00aba2a1, 0x038303de, 0x01eb6c7f, 0x01bee944, 0x0372313c, 0x0198a8ba, 0x0180a62d, 0x02a46118, 0x02d15dc5, 0x0036e759}}, Y: Field{[10]uint32{0x01517227, 0x02883ca8, 0x030b1f89, 0x02d6070f, 0x003cfb46, 0x0095e15f, 0x02762d92, 0x03716a78, 0x00a361f0, 0x00325b7a}}}, + {X: Field{[10]uint32{0x028ecdf2, 0x02992e21, 0x01ab6833, 0x00209ee6, 0x0356ffce, 0x02fd44ce, 0x0165bfe7, 0x018ef13d, 0x03d846fd, 0x0039d834}}, Y: Field{[10]uint32{0x02f102ce, 0x00397504, 0x003810e6, 0x0048a172, 0x012c1c1e, 0x01018b80, 0x021cc825, 0x00bad060, 0x028508be, 0x00183b99}}}, + {X: Field{[10]uint32{0x0033e026, 0x0075e417, 0x00d99135, 0x02c0c769, 0x00e3a956, 0x00b8dc01, 0x02533e71, 0x029eaf48, 0x02990cac, 0x000af6c8}}, Y: Field{[10]uint32{0x02e44731, 0x011c4fed, 0x03f82a78, 0x0218932e, 0x03801932, 0x009f4039, 0x003e877e, 0x0204176b, 0x00dfc273, 0x001919d7}}}, + {X: Field{[10]uint32{0x0166bee4, 0x021ee6a0, 0x03bbfc3c, 0x00838006, 0x007be48d, 0x03f5b211, 0x00137739, 0x0084d2de, 0x03fd0599, 0x00073382}}, Y: Field{[10]uint32{0x02d37057, 0x0222ef72, 0x034cc427, 0x00fb059b, 0x02b5eeb7, 0x03367a0f, 0x021253c4, 0x03f8c30e, 0x02e51ed7, 0x000b52a3}}}, + {X: Field{[10]uint32{0x03641075, 0x03e2695d, 0x035bd6eb, 0x0316ed95, 0x01ec8405, 0x031ae319, 0x01b5bd8e, 0x02b9effd, 0x03c37f5d, 0x001b5af8}}, Y: Field{[10]uint32{0x009c2c7f, 0x011b33eb, 0x01b80392, 0x0234d456, 0x0324d193, 0x0313abd2, 0x011507f7, 0x034ef180, 0x001f5c6f, 0x0013f4f3}}}, + {X: Field{[10]uint32{0x01b22351, 0x001f62ef, 0x0036cc60, 0x00bc50fa, 0x01b3c67f, 0x01d63e87, 0x03fb1ca8, 0x01e075e0, 0x0180d96e, 0x000360b0}}, Y: Field{[10]uint32{0x02d0c7d9, 0x01ee389e, 0x031e151a, 0x03d9e592, 0x0037415a, 0x01290c86, 0x033e9a97, 0x02b6a24e, 0x0269952a, 0x000e00bd}}}, + {X: Field{[10]uint32{0x01b3cd71, 0x0233860f, 0x02343b22, 0x03ba31cf, 0x00fbf9fc, 0x0151bc6e, 0x01dfed1b, 0x03f4d3e4, 0x02dd7e03, 0x0013b187}}, Y: Field{[10]uint32{0x003ba9a9, 0x021215ac, 0x01cffb19, 0x023eaa50, 0x02db7d94, 0x03a7b0f1, 0x0390340d, 0x038bb22b, 0x0309b5b2, 0x00384665}}}, + {X: Field{[10]uint32{0x017a034b, 0x01e07a78, 0x01643add, 0x023e39cd, 0x02a8df7a, 0x03ab44fb, 0x00744d7b, 0x02846e95, 0x006973ae, 0x000c6ab5}}, Y: Field{[10]uint32{0x00b37adb, 0x02d9d3e1, 0x02913f13, 0x03e39838, 0x02a94680, 0x033b5d21, 0x028bdf57, 0x03d818fd, 0x03413e49, 0x001919db}}}, + {X: Field{[10]uint32{0x01173e02, 0x00739353, 0x0131a5eb, 0x02f65f8a, 0x0201f946, 0x01627a98, 0x0115903b, 0x036e3bd9, 0x01892fcc, 0x002a6108}}, Y: Field{[10]uint32{0x01a3908b, 0x01222922, 0x02049abe, 0x01b42959, 0x0307ea26, 0x0335becd, 0x0370e133, 0x035e8e8c, 0x02ac3b2d, 0x00142f9d}}}, + {X: Field{[10]uint32{0x03bef099, 0x0383b3ad, 0x015e3f8f, 0x0022941a, 0x02fee79b, 0x01dd5033, 0x02cfa092, 0x0010cde9, 0x00f33ec0, 0x00208ad5}}, Y: Field{[10]uint32{0x036bf7f6, 0x01121448, 0x007128d0, 0x00dbf6a3, 0x007405d3, 0x022016fc, 0x003ddced, 0x03d811cd, 0x03c620d3, 0x000e4d88}}}, + {X: Field{[10]uint32{0x01065e0b, 0x037c9705, 0x02a3d33a, 0x0043a677, 0x0215793d, 0x02ff175f, 0x038de14e, 0x01c00317, 0x0355fe3d, 0x000403da}}, Y: Field{[10]uint32{0x02ecb4c2, 0x0335d293, 0x00e519b2, 0x034373b2, 0x00a352ff, 0x035b0445, 0x01282676, 0x037789f2, 0x00f758c4, 0x00346ed1}}}, + {X: Field{[10]uint32{0x02142f7f, 0x03a20db5, 0x031bb2d4, 0x01f16b6d, 0x006a5425, 0x00657425, 0x01aa6ecd, 0x03089d20, 0x03186a09, 0x00329760}}, Y: Field{[10]uint32{0x0277b42d, 0x013d3649, 0x0133de01, 0x00c7f1ce, 0x03878d8d, 0x012b815f, 0x03a0c388, 0x01e82bce, 0x007fb974, 0x00362421}}}, + {X: Field{[10]uint32{0x00bfbf14, 0x03684b89, 0x016cafa5, 0x00fc406d, 0x00e8ffe5, 0x0263fd84, 0x031a352f, 0x034838a4, 0x01f42234, 0x003a4709}}, Y: Field{[10]uint32{0x024dbb86, 0x02d288a5, 0x02b41872, 0x03d450f3, 0x037a26bc, 0x0183a669, 0x01740f6d, 0x0314af1c, 0x01e5441e, 0x002c7b05}}}, + {X: Field{[10]uint32{0x02e34445, 0x02750b06, 0x0306509e, 0x011cb33d, 0x03acb545, 0x00ba66b9, 0x029b2902, 0x000b6215, 0x00dc3109, 0x0015ea32}}, Y: Field{[10]uint32{0x00ab1fb7, 0x0185878c, 0x00accb9c, 0x00fee308, 0x0250e7cc, 0x01219abb, 0x0292db56, 0x038277d3, 0x01410442, 0x00214891}}}, + {X: Field{[10]uint32{0x0104500f, 0x00116c1c, 0x007d9581, 0x00769bfa, 0x0355a853, 0x02300adb, 0x01d0d412, 0x0345b6eb, 0x00672502, 0x0008cae3}}, Y: Field{[10]uint32{0x01f93fb9, 0x02903d61, 0x00f399a7, 0x03679863, 0x034f5255, 0x0152524b, 0x03c476f6, 0x02161c89, 0x020e9e7d, 0x000e0442}}}, + {X: Field{[10]uint32{0x03004fec, 0x0189ff9d, 0x00876187, 0x031c38f7, 0x020750d5, 0x0067df9e, 0x01d48763, 0x01a6cd3d, 0x028ad71f, 0x001f42f9}}, Y: Field{[10]uint32{0x01124633, 0x027bf351, 0x01e67ca0, 0x0060b291, 0x02a12b1d, 0x0296e5c7, 0x02f54028, 0x03cf9875, 0x00507d0a, 0x000f9ca8}}}, + {X: Field{[10]uint32{0x02f93292, 0x01e8b49e, 0x00d836ba, 0x0312691b, 0x01b70b02, 0x00310d21, 0x01fa4369, 0x0289c725, 0x030b77c2, 0x00137617}}, Y: Field{[10]uint32{0x0011d597, 0x038efd47, 0x0178e8c9, 0x01348206, 0x00f139e6, 0x036b69e8, 0x02b6ff85, 0x01366122, 0x02e5c955, 0x00210d90}}}, + {X: Field{[10]uint32{0x012e52f8, 0x01938bdc, 0x032149e2, 0x0307add9, 0x023eb2e5, 0x012ea69e, 0x03531a17, 0x008011c2, 0x03f588f0, 0x0014dea4}}, Y: Field{[10]uint32{0x000e161f, 0x00e6d84d, 0x03ebb3f8, 0x03e5e095, 0x0394efa1, 0x006256bc, 0x0225f067, 0x02499823, 0x03a0dc00, 0x002c366c}}}, + {X: Field{[10]uint32{0x02e48684, 0x00accc67, 0x00ae8b97, 0x02420962, 0x01ab3465, 0x03e0aff4, 0x00e60a46, 0x00795e63, 0x0071325b, 0x0004febd}}, Y: Field{[10]uint32{0x0234f743, 0x0086b79d, 0x00bfa49a, 0x0062116e, 0x02dce7ba, 0x026c8806, 0x02f25857, 0x02d4a788, 0x0384e84e, 0x00299c80}}}, + {X: Field{[10]uint32{0x03e8acb8, 0x03910173, 0x0206be1b, 0x02088b67, 0x03ca17c4, 0x00277b79, 0x015dbea8, 0x02cd1380, 0x00ed5861, 0x001a4789}}, Y: Field{[10]uint32{0x01c529ab, 0x026ddae4, 0x03f966f4, 0x0250f43c, 0x035ad002, 0x036718d1, 0x0120d909, 0x01ec3f31, 0x02dc0c19, 0x0038d592}}}, + {X: Field{[10]uint32{0x013d7ea2, 0x0305771f, 0x0373f423, 0x03e2411f, 0x03b754b3, 0x02ccd248, 0x02a394ff, 0x02a14056, 0x0391aaae, 0x000d950e}}, Y: Field{[10]uint32{0x03be5799, 0x0228bc6e, 0x02fd52d6, 0x03f9687e, 0x039dff44, 0x00860252, 0x008c8389, 0x02003a39, 0x0293b79b, 0x0001ced1}}}, + {X: Field{[10]uint32{0x0033f05b, 0x0082c1e1, 0x008a224f, 0x02c3f8ef, 0x000e007b, 0x00c83aa0, 0x00450455, 0x02032c78, 0x03e03941, 0x003fc96a}}, Y: Field{[10]uint32{0x030b7e51, 0x00d8c794, 0x026c2f90, 0x038022bb, 0x02938f69, 0x03676d04, 0x01bd678a, 0x0399439b, 0x010926df, 0x002944ac}}}, + {X: Field{[10]uint32{0x0187e443, 0x00e2685f, 0x0322272d, 0x0305c314, 0x00cc607b, 0x034091eb, 0x0051f57c, 0x03f6bd44, 0x007b5faa, 0x000077b0}}, Y: Field{[10]uint32{0x03a9a325, 0x014252e7, 0x038d3bb3, 0x019f4384, 0x00d870ce, 0x016636b5, 0x02207a92, 0x00af0168, 0x0137382b, 0x001f9dfa}}}, + {X: Field{[10]uint32{0x03413c32, 0x030a6527, 0x02236029, 0x0237f18d, 0x01485ab7, 0x00538246, 0x020147ed, 0x0218cba8, 0x0376f62f, 0x000bc43d}}, Y: Field{[10]uint32{0x00d2184a, 0x009a7b1a, 0x02f5ad25, 0x01a0cf9f, 0x0235c236, 0x02a9ac7d, 0x01d8c8b5, 0x0118b82e, 0x03c6e760, 0x000ecb17}}}, + {X: Field{[10]uint32{0x02bd73ca, 0x018008b6, 0x00188311, 0x010f3060, 0x02ade319, 0x02f2bed2, 0x03096814, 0x00b36eb3, 0x0394e61c, 0x001e5d3c}}, Y: Field{[10]uint32{0x01e98309, 0x020d8022, 0x0005673c, 0x03a0c439, 0x012be4cd, 0x004ee914, 0x01f854e8, 0x02a99a1f, 0x01a03bc1, 0x00386cd3}}}, + {X: Field{[10]uint32{0x0301c332, 0x01d233c5, 0x01b14436, 0x03780e94, 0x0132af1e, 0x012a8da5, 0x01774698, 0x03105959, 0x03393c5c, 0x00015317}}, Y: Field{[10]uint32{0x01043e4e, 0x0306da81, 0x020cd800, 0x02b3bde2, 0x02ddbde8, 0x03baadae, 0x030626a0, 0x0273148a, 0x03494976, 0x000f719e}}}, + {X: Field{[10]uint32{0x025f3783, 0x03068ed0, 0x0115d081, 0x00179556, 0x028092e9, 0x0061616b, 0x00a972a3, 0x031fac76, 0x0296f047, 0x000666a8}}, Y: Field{[10]uint32{0x0346c262, 0x03a3f1fa, 0x002e2b87, 0x038433b8, 0x02585154, 0x03f4e899, 0x00a7946d, 0x01ea5ad3, 0x027964d1, 0x003d608d}}}, + {X: Field{[10]uint32{0x03b7f299, 0x03c222a6, 0x03e879a7, 0x02f9e5da, 0x03cbcdf0, 0x007f1639, 0x0292a3ba, 0x01b7e9b0, 0x01d6fb61, 0x0034574e}}, Y: Field{[10]uint32{0x03d7a900, 0x016e980a, 0x01061f70, 0x00602d5f, 0x01679dd4, 0x010eff1e, 0x03d4912f, 0x03e0def6, 0x017c4e37, 0x001322ba}}}, + {X: Field{[10]uint32{0x024ef58b, 0x019a0fcd, 0x02df5a6f, 0x032a696b, 0x01bff26e, 0x0012e0af, 0x02332c6a, 0x01f7f206, 0x0134880e, 0x001db594}}, Y: Field{[10]uint32{0x001507e7, 0x01101ad0, 0x0246a646, 0x02f16fc4, 0x027b4aa5, 0x025d6e68, 0x02c90486, 0x00b60e87, 0x0308bbd2, 0x002dc6b9}}}, + {X: Field{[10]uint32{0x00ae51b7, 0x002050f7, 0x02a02a03, 0x03865301, 0x03452ef0, 0x024bfea6, 0x02e9ead7, 0x03f8d8c2, 0x02a5d4df, 0x0007ad34}}, Y: Field{[10]uint32{0x03f47b0b, 0x01736f5b, 0x0144c9a5, 0x019d626c, 0x027cc94b, 0x0232cfb6, 0x0286af45, 0x0239e668, 0x00c1e6ab, 0x0022365e}}}, + {X: Field{[10]uint32{0x01df571d, 0x004bc337, 0x0162f955, 0x0349144d, 0x01e474bd, 0x01c4188f, 0x01c34516, 0x021e40d8, 0x02513570, 0x0037b80c}}, Y: Field{[10]uint32{0x0290f565, 0x03121e85, 0x027c307f, 0x008ec819, 0x00496d96, 0x00463ffb, 0x028a28dc, 0x036024b1, 0x00fdcbf6, 0x00348b6f}}}, + {X: Field{[10]uint32{0x02d4760a, 0x008d5b95, 0x005aeef0, 0x0277cd8e, 0x01bf1dbd, 0x03c4fd42, 0x028f0d55, 0x031af7fd, 0x032dc98a, 0x000bac09}}, Y: Field{[10]uint32{0x02a04277, 0x03280ac9, 0x03746111, 0x0111c847, 0x035c69ad, 0x0015cda1, 0x02a18329, 0x013ae89e, 0x03554aaf, 0x003e0350}}}, + {X: Field{[10]uint32{0x030eabf3, 0x02c0c86a, 0x036b5c39, 0x03a809d8, 0x02b75853, 0x01de2208, 0x036ff7fc, 0x019cb63f, 0x02697509, 0x003abd8b}}, Y: Field{[10]uint32{0x020a3b7c, 0x03f7b6cb, 0x000956ef, 0x0180d41c, 0x008614e1, 0x001ccfc7, 0x0388b969, 0x0388b5c6, 0x02aa1c8f, 0x00110b95}}}, + {X: Field{[10]uint32{0x00592858, 0x03dcab81, 0x01d3b15e, 0x0216e1e6, 0x03cbc701, 0x00dbbd18, 0x01c442c2, 0x01bf65af, 0x030a13d9, 0x00081641}}, Y: Field{[10]uint32{0x00961ec8, 0x028d2f45, 0x014a280d, 0x03fa406e, 0x00f426fb, 0x01ab95b6, 0x0221d7f4, 0x026ba3d8, 0x02e83f25, 0x002f2410}}}, + {X: Field{[10]uint32{0x012f52fe, 0x009749eb, 0x0062a0f9, 0x01108231, 0x014b8b4a, 0x0113b0a0, 0x03b4ceea, 0x00f9f9bd, 0x03fd9e7f, 0x003fcbbd}}, Y: Field{[10]uint32{0x030a5e24, 0x03393cf7, 0x03e3b233, 0x011dada7, 0x030956a4, 0x019fd44d, 0x016cb52a, 0x01cad205, 0x00fbfa6f, 0x001ab39d}}}, + {X: Field{[10]uint32{0x01d14d83, 0x01fe7602, 0x03bf620f, 0x039937c5, 0x01d8fd0d, 0x00d5ffc7, 0x037a7b04, 0x014fef4c, 0x02f6fc45, 0x0038f973}}, Y: Field{[10]uint32{0x038f0460, 0x013d1348, 0x033651b8, 0x03fa2811, 0x03e667b6, 0x01a691d7, 0x011863f7, 0x02d83f43, 0x01a1baa7, 0x002b377f}}}, + {X: Field{[10]uint32{0x0357a6c3, 0x0046736f, 0x0054ec11, 0x01def78f, 0x01a0c645, 0x019ae708, 0x0142341a, 0x00a203a6, 0x026a41c0, 0x0025ea1c}}, Y: Field{[10]uint32{0x0367b4e8, 0x0330e362, 0x01164681, 0x03fcd167, 0x01fe160a, 0x01b61178, 0x00cc5c72, 0x00f41c1e, 0x00ae2702, 0x002d7cdf}}}, + {X: Field{[10]uint32{0x01cc81e6, 0x00811427, 0x001c41b0, 0x000875de, 0x0012fd90, 0x0067ab6d, 0x039484a1, 0x03e50e18, 0x02e94862, 0x002ac079}}, Y: Field{[10]uint32{0x0083b14b, 0x007b815d, 0x000436b1, 0x03d0568c, 0x0148853c, 0x00bb5e79, 0x01fab050, 0x0170e814, 0x0032101b, 0x001ab943}}}, + {X: Field{[10]uint32{0x0273668f, 0x03a857dd, 0x02b0d5a2, 0x01302a30, 0x0258ed9a, 0x023611e7, 0x026ba5ac, 0x033dac0b, 0x0010da2d, 0x00031191}}, Y: Field{[10]uint32{0x03499945, 0x02f0e182, 0x01361adb, 0x01114827, 0x03eadee9, 0x034f3916, 0x017f333c, 0x00b1f796, 0x01906239, 0x000da631}}}, + {X: Field{[10]uint32{0x03867534, 0x00263d05, 0x03d8648f, 0x00909bb6, 0x01ee49d5, 0x01b041e5, 0x013b0e67, 0x007cf880, 0x00685f72, 0x0005fab3}}, Y: Field{[10]uint32{0x009ef300, 0x018fb386, 0x0201bd6b, 0x015ba652, 0x03fec0f8, 0x00eaddbe, 0x037214bb, 0x027d26ef, 0x02e90cb1, 0x00330c45}}}, + {X: Field{[10]uint32{0x00c00d73, 0x00537ab5, 0x0208f2b1, 0x02f35f4d, 0x013ed2e8, 0x02fbf54f, 0x01b77bd5, 0x03bc5d4e, 0x01402908, 0x00301037}}, Y: Field{[10]uint32{0x01279c00, 0x020d6d05, 0x013d7427, 0x032db383, 0x02b2053e, 0x01444f73, 0x01403d84, 0x00960134, 0x00ae55ec, 0x001e98e1}}}, + {X: Field{[10]uint32{0x02bddb42, 0x000f8e4b, 0x01b9341b, 0x028aea4b, 0x0041bf2b, 0x019668a4, 0x0025fed6, 0x03dc30bb, 0x00983658, 0x0029658d}}, Y: Field{[10]uint32{0x039f4872, 0x002b7935, 0x01600a95, 0x034a08d6, 0x011ce7c2, 0x01a55e17, 0x00e8bf41, 0x03129c2a, 0x00af260e, 0x00370453}}}, + {X: Field{[10]uint32{0x0329aa0d, 0x01f3a846, 0x02279989, 0x01c8ce77, 0x03663823, 0x00ce0db1, 0x0233d095, 0x03d8ff1f, 0x02d451dc, 0x00113f88}}, Y: Field{[10]uint32{0x004279b3, 0x015df313, 0x01a9e53b, 0x003eba01, 0x014f3bf8, 0x00925bde, 0x01e9ffae, 0x0350d24a, 0x00e73d4b, 0x0005c631}}}, + {X: Field{[10]uint32{0x0071647b, 0x019a844b, 0x0091cff4, 0x03cfb57b, 0x004fc6b5, 0x00912ff6, 0x03b246de, 0x03057be8, 0x00aa1358, 0x0022f5c6}}, Y: Field{[10]uint32{0x03d737fa, 0x01b7fa12, 0x02fa5f40, 0x032110ec, 0x0365a0a3, 0x010009e4, 0x03deb8de, 0x0047c06d, 0x0288ba6c, 0x0005cbc6}}}, + {X: Field{[10]uint32{0x038680d1, 0x03e3385c, 0x03cfcd9f, 0x0355773c, 0x01d7ad4c, 0x03fce9e9, 0x01aa53c3, 0x02a88e02, 0x0025bbe6, 0x0023af73}}, Y: Field{[10]uint32{0x01e5641a, 0x02621d51, 0x01872cd7, 0x0199e2b1, 0x005be647, 0x0221b60f, 0x003728cf, 0x02b7e803, 0x0326af86, 0x0017158e}}}, + {X: Field{[10]uint32{0x011713d2, 0x0319f83a, 0x02f4e9db, 0x034bfadc, 0x02b469e5, 0x03a25b3e, 0x0342fb8b, 0x02aaf265, 0x021f688f, 0x00173d53}}, Y: Field{[10]uint32{0x00fd09c5, 0x011e1af9, 0x00b18569, 0x02a218c9, 0x034920e8, 0x0240556c, 0x006393e1, 0x00c360be, 0x0190d063, 0x00360b59}}}, + {X: Field{[10]uint32{0x01845f1a, 0x03061ea1, 0x02f8cdb4, 0x03053228, 0x01387185, 0x00115c7b, 0x0016ff4e, 0x02869cbb, 0x02e43f01, 0x001b0365}}, Y: Field{[10]uint32{0x00798c08, 0x02a5a9ac, 0x01dd6e55, 0x00e8c45f, 0x00abcf01, 0x026edbdc, 0x0015c1bb, 0x030bb3cd, 0x014b763e, 0x003ce668}}}, + {X: Field{[10]uint32{0x02b74046, 0x00cb70e4, 0x02ad690d, 0x002fa9c5, 0x039a15ef, 0x01c9a84c, 0x01f15155, 0x00bf7341, 0x00fefb6a, 0x003aba4a}}, Y: Field{[10]uint32{0x014c76bc, 0x03315dc0, 0x01b0984e, 0x0099835b, 0x02f6fd46, 0x035bb503, 0x03da7978, 0x00ce772f, 0x02d9f086, 0x002f7e1e}}}, + {X: Field{[10]uint32{0x007b3a21, 0x00802391, 0x008f0d57, 0x02cc6a9a, 0x02b61d5c, 0x00382376, 0x030dbbd0, 0x00bf7b67, 0x030cbbe7, 0x00397978}}, Y: Field{[10]uint32{0x01b248ae, 0x000196a1, 0x0035c561, 0x020a8415, 0x005de656, 0x0145c73a, 0x006ec03d, 0x01b99d1f, 0x01b8f80b, 0x0027ed2b}}}, + {X: Field{[10]uint32{0x038223ee, 0x036f3284, 0x00b79007, 0x00329e68, 0x0078df6b, 0x01acc02f, 0x02ce1762, 0x01aedf16, 0x02acc9e2, 0x001c4484}}, Y: Field{[10]uint32{0x03027757, 0x02a9cabb, 0x01cbbdc3, 0x00e46384, 0x036b8732, 0x0131cff8, 0x02b343bc, 0x01377679, 0x00584ef4, 0x000371a2}}}, + {X: Field{[10]uint32{0x01c5e22c, 0x00d03c08, 0x03d506b6, 0x02ca9319, 0x00c4cf11, 0x02d795e1, 0x03b9ea3f, 0x0293db76, 0x03b3531a, 0x000ed4ba}}, Y: Field{[10]uint32{0x0190938a, 0x02665aec, 0x039de55a, 0x0298f17e, 0x00b698c8, 0x01a06190, 0x02cf02e4, 0x011a84fe, 0x02bddc00, 0x000f68fb}}}, + {X: Field{[10]uint32{0x0356b78b, 0x01daf733, 0x02df91eb, 0x005fa5b2, 0x0245294a, 0x03871e95, 0x02e7292f, 0x011789f7, 0x00811103, 0x000c3ca1}}, Y: Field{[10]uint32{0x03abb049, 0x035c0add, 0x02b088e6, 0x01902877, 0x003c1491, 0x01445beb, 0x007864d2, 0x038d2fc1, 0x00fc26ec, 0x001c3184}}}, + {X: Field{[10]uint32{0x0130ff58, 0x0055937a, 0x01ab5edf, 0x009da675, 0x015cfef5, 0x0329287c, 0x00d37b61, 0x0156d939, 0x00a8012c, 0x00012a11}}, Y: Field{[10]uint32{0x003dfa3c, 0x0227565a, 0x00cd3f31, 0x03018c9d, 0x025826f9, 0x0342a7fd, 0x03e6bd38, 0x039b936e, 0x0148508d, 0x001261d1}}}, + {X: Field{[10]uint32{0x0068b06f, 0x0279b19e, 0x01026451, 0x0177b714, 0x0005ce2b, 0x02667853, 0x02e0fd9a, 0x01212990, 0x021ea7c8, 0x00297295}}, Y: Field{[10]uint32{0x01afa7ed, 0x0310e8e1, 0x025a47a7, 0x01a89077, 0x037abe38, 0x03fe9fda, 0x009b00ea, 0x03bbaab0, 0x0142a5e2, 0x0033245e}}}, + {X: Field{[10]uint32{0x03d6e72c, 0x03e3b937, 0x017ef3c1, 0x031915b9, 0x021fa547, 0x0043d852, 0x0051a68e, 0x03115b0e, 0x02d31e16, 0x003d86df}}, Y: Field{[10]uint32{0x03622f2b, 0x028ca017, 0x01a54734, 0x00453426, 0x02a0c5a8, 0x0345efe9, 0x035fbdb4, 0x00619647, 0x00b7fc40, 0x0032c9b4}}}, + {X: Field{[10]uint32{0x01f678b2, 0x01586145, 0x007fcaee, 0x019a8888, 0x02559768, 0x01d9bef9, 0x02859f9e, 0x000312d4, 0x00628897, 0x003e3935}}, Y: Field{[10]uint32{0x02c77554, 0x006a93ae, 0x011ae6f0, 0x02542775, 0x0106791e, 0x03eeddac, 0x009c271b, 0x01bec2a8, 0x039fc1b1, 0x000c2ec0}}}, + {X: Field{[10]uint32{0x032ab653, 0x00a4274c, 0x0291ca39, 0x001a9c5e, 0x03d5d97a, 0x0060528b, 0x02f6f717, 0x0164542c, 0x001a05d2, 0x002272bf}}, Y: Field{[10]uint32{0x017ab76e, 0x00bc5109, 0x03ce16fe, 0x036983a1, 0x015eac02, 0x0053cd38, 0x01c00557, 0x0121634a, 0x00ab0b4e, 0x00068928}}}, + {X: Field{[10]uint32{0x037c4f20, 0x02365f51, 0x020bb4a4, 0x0155aba9, 0x0033c5b5, 0x028ab544, 0x0201dca7, 0x01773f2a, 0x030bd04f, 0x0034a14d}}, Y: Field{[10]uint32{0x0293b9d4, 0x01348091, 0x01b416c4, 0x02cb1a60, 0x01c61386, 0x031c1451, 0x022adf8e, 0x0217404e, 0x03b732e8, 0x00352d09}}}, + {X: Field{[10]uint32{0x01f217c0, 0x01bd9a93, 0x00974902, 0x019b87f5, 0x01fd3350, 0x01eae89a, 0x01dc90d1, 0x02fecc86, 0x02f2d9bd, 0x0000f14c}}, Y: Field{[10]uint32{0x02ac5d59, 0x00f8c199, 0x0057675b, 0x03e7e320, 0x032791a6, 0x02104e5d, 0x033c7b42, 0x01ff40b0, 0x027ca6c9, 0x0021bf57}}}, + {X: Field{[10]uint32{0x008ac1ee, 0x000c5333, 0x02924b73, 0x00f8df89, 0x02298445, 0x00c0dc89, 0x0317a165, 0x01c1a886, 0x010bfc35, 0x00093465}}, Y: Field{[10]uint32{0x01f918ac, 0x0307aa72, 0x01ed84b9, 0x03822d5f, 0x01b05bb9, 0x026ba69d, 0x0247c685, 0x006a42ec, 0x005d06a3, 0x001348a9}}}, + {X: Field{[10]uint32{0x027615a9, 0x020acd93, 0x03d44595, 0x01042ad9, 0x02d85053, 0x0280dbf0, 0x01f8acee, 0x02c6ac52, 0x00f36227, 0x00331aac}}, Y: Field{[10]uint32{0x03761cb8, 0x01a028e0, 0x037d7107, 0x02bd5283, 0x01bac918, 0x003e9bc8, 0x00806b12, 0x0049619f, 0x03cc040b, 0x003e6b64}}}, + {X: Field{[10]uint32{0x025318cf, 0x03fdc6c0, 0x01cdef08, 0x00366c50, 0x016320f2, 0x01cc2e67, 0x0016bcff, 0x0252db2a, 0x0154f36e, 0x0037892a}}, Y: Field{[10]uint32{0x03899933, 0x00129076, 0x014d9679, 0x017a920e, 0x038475c3, 0x012bf58b, 0x002d2354, 0x012926e6, 0x01d91ac2, 0x000f8d2c}}}, + {X: Field{[10]uint32{0x021ffec7, 0x03fc9496, 0x03618f83, 0x036d23ea, 0x015f8243, 0x0254f3ef, 0x003a12c7, 0x02aea436, 0x00c34900, 0x001deac1}}, Y: Field{[10]uint32{0x00ac2f00, 0x01cfbfaf, 0x032bdae8, 0x00680c28, 0x01231c87, 0x016a36cc, 0x02265af7, 0x01dffd25, 0x00273bcd, 0x0018996b}}}, + {X: Field{[10]uint32{0x02e78209, 0x012b5445, 0x0341ece8, 0x03b876ad, 0x0251ff8d, 0x00656028, 0x0079885d, 0x02679780, 0x03065f46, 0x00291ebd}}, Y: Field{[10]uint32{0x02257440, 0x03cd2e5e, 0x03abfbb8, 0x0220f6bf, 0x035b7860, 0x01196ae5, 0x023f7cb3, 0x03de2e95, 0x03fdf1b1, 0x000e4f2e}}}, + {X: Field{[10]uint32{0x00d7016d, 0x0117a7a7, 0x037ea8a5, 0x038754a8, 0x0293d709, 0x000c8809, 0x01170fbd, 0x031edd37, 0x01fd0c55, 0x002a7d7e}}, Y: Field{[10]uint32{0x01d5e0e1, 0x012c417c, 0x0162b873, 0x009fdad8, 0x0254f0d3, 0x027a02ac, 0x01847b2e, 0x03c8ba3f, 0x01254bad, 0x00261c5e}}}, + {X: Field{[10]uint32{0x0218ec38, 0x01f358d3, 0x03b716cc, 0x01902a51, 0x01ba8668, 0x0161b9f8, 0x02200c4e, 0x00e28a3e, 0x02bc96b9, 0x00355fa7}}, Y: Field{[10]uint32{0x01b6bd36, 0x029aab34, 0x016a3062, 0x03abca16, 0x0325de16, 0x0104b7e1, 0x00c8b7cb, 0x0244416d, 0x02ef6823, 0x0026a834}}}, + {X: Field{[10]uint32{0x03aa58e9, 0x001a0a43, 0x006119f5, 0x0072ae08, 0x02e27ccc, 0x02a175ce, 0x018e66ca, 0x03053558, 0x00d8fb4d, 0x001d18ea}}, Y: Field{[10]uint32{0x00d4829f, 0x026ab41a, 0x0389f056, 0x03102d30, 0x02ae7990, 0x010e36e1, 0x00645a28, 0x03d412a8, 0x02b2275a, 0x0020bf5a}}}, + {X: Field{[10]uint32{0x013bf412, 0x01b9f3f5, 0x032fca3c, 0x01914d36, 0x013927ae, 0x03accc6c, 0x002d03e4, 0x0120c668, 0x008a29c4, 0x000b9e9c}}, Y: Field{[10]uint32{0x031e11d1, 0x038ecf52, 0x00160fd2, 0x0093b006, 0x03ebdf68, 0x00e6ceca, 0x02e0073f, 0x003372ba, 0x01997350, 0x00213cfc}}}, + {X: Field{[10]uint32{0x01dd5e03, 0x034c3136, 0x00dda414, 0x012edfea, 0x02180d09, 0x022e8c13, 0x032f3c2e, 0x030163eb, 0x00bf540b, 0x0021c1ec}}, Y: Field{[10]uint32{0x0100b915, 0x0127083c, 0x0025dfbb, 0x03a6599f, 0x0318db5e, 0x02816535, 0x006bd25a, 0x0040cd43, 0x0175fb79, 0x001c2d84}}}, + {X: Field{[10]uint32{0x03ca842d, 0x02a8b594, 0x008b9613, 0x03386db0, 0x0122f67d, 0x023999d2, 0x02070a72, 0x03340a21, 0x030c3ce6, 0x000ff6cd}}, Y: Field{[10]uint32{0x00e0dafc, 0x0121ac32, 0x0006317a, 0x03e65004, 0x035d3a5e, 0x002c7bfb, 0x004c5ec1, 0x000d1297, 0x00f2474a, 0x00058d46}}}, + {X: Field{[10]uint32{0x00472f62, 0x020f6252, 0x031af2a2, 0x0180252c, 0x03330779, 0x01bd6352, 0x01411e70, 0x03552680, 0x0302412c, 0x0030df68}}, Y: Field{[10]uint32{0x0221f92a, 0x031bf84e, 0x01d26801, 0x0002e2b4, 0x01ca8490, 0x0282a0af, 0x002d1daa, 0x010bd21c, 0x028716c6, 0x002a823c}}}, + {X: Field{[10]uint32{0x01e08a1c, 0x009bf1e9, 0x007cf257, 0x03b0ac2d, 0x0160ade9, 0x0171e8ce, 0x01f923b0, 0x02c3e494, 0x0150381a, 0x000fae81}}, Y: Field{[10]uint32{0x030fa7d9, 0x010697f3, 0x02396557, 0x03668316, 0x00492a1a, 0x02bf1380, 0x02396525, 0x0374ea21, 0x00ebb681, 0x000509ec}}}, + {X: Field{[10]uint32{0x0350cee8, 0x02be39ae, 0x02e0194e, 0x029e14d5, 0x02e43f20, 0x01d53e83, 0x024628f7, 0x035752fd, 0x02a18ce5, 0x00259c8f}}, Y: Field{[10]uint32{0x01f49bdd, 0x0019a960, 0x00e8a713, 0x016eca32, 0x016cf51b, 0x035122bb, 0x02eef512, 0x02fc43a1, 0x03bbb9bb, 0x0016b427}}}, + {X: Field{[10]uint32{0x03663748, 0x02358128, 0x00f1329f, 0x02499e44, 0x00ab8228, 0x01575716, 0x009d3460, 0x02db34e8, 0x02117ecf, 0x0035d914}}, Y: Field{[10]uint32{0x028540f7, 0x02e00c70, 0x01a46eeb, 0x00430897, 0x03bf2c9b, 0x02eaaa73, 0x0089dbe2, 0x037820b2, 0x0104d20f, 0x002adf30}}}, + {X: Field{[10]uint32{0x00ada5e6, 0x02a241b4, 0x03e434dc, 0x0196d2b1, 0x008c8660, 0x0352f251, 0x01907afa, 0x02c4d883, 0x03dc7e0a, 0x0007dac8}}, Y: Field{[10]uint32{0x023e247c, 0x03b0959d, 0x02602398, 0x0103923d, 0x01560414, 0x036aa7ac, 0x00920405, 0x00e76ab4, 0x025d6bc6, 0x00230dec}}}, + {X: Field{[10]uint32{0x01459945, 0x0203541d, 0x01f9d9bd, 0x004a2bf4, 0x036abb5a, 0x0303a3b5, 0x0079e64b, 0x0285a1e5, 0x00bbaa06, 0x0011bfc1}}, Y: Field{[10]uint32{0x011bcd4a, 0x03e7693d, 0x0176491e, 0x00a5075c, 0x03e7e9d2, 0x011e986a, 0x0133bb9e, 0x02e838e4, 0x02c26af2, 0x002c4413}}}, + {X: Field{[10]uint32{0x02597ce2, 0x012a20ca, 0x02f86f3f, 0x02cf6092, 0x013bcdff, 0x022ec114, 0x0076e545, 0x0201a4ec, 0x00253888, 0x003286cf}}, Y: Field{[10]uint32{0x01e0285a, 0x006ff8a8, 0x03622005, 0x03d5e611, 0x01dfc9d6, 0x0367a07b, 0x0109d11b, 0x01b711d8, 0x02fbdd1b, 0x003c0a45}}}, + {X: Field{[10]uint32{0x01ece6b4, 0x011e8426, 0x01763ee7, 0x01dcae00, 0x005fad12, 0x0336f7ec, 0x03ec7fed, 0x027b123b, 0x029aadb6, 0x00032587}}, Y: Field{[10]uint32{0x018fb6e4, 0x00bc9a67, 0x022a984e, 0x00f0d7c2, 0x0056bb9b, 0x005b12dc, 0x00bb70ad, 0x014f949c, 0x0033e0b2, 0x0011a69b}}}, + {X: Field{[10]uint32{0x039d99dc, 0x03ca2fe4, 0x03393ea4, 0x03d6e6d9, 0x037b3132, 0x035139dd, 0x03817089, 0x0332534f, 0x02791418, 0x000e8ba8}}, Y: Field{[10]uint32{0x03f164be, 0x025b195a, 0x01f8831a, 0x02381949, 0x02b981bf, 0x02344f8b, 0x0217dc71, 0x036486f8, 0x0143c035, 0x00056014}}}, + {X: Field{[10]uint32{0x025a7a4a, 0x03b7a9ad, 0x01189e7d, 0x02333cd3, 0x034e24d4, 0x00bec700, 0x03fd6ad5, 0x03c2f868, 0x00dfb3a1, 0x000105b7}}, Y: Field{[10]uint32{0x00c204c3, 0x037444d8, 0x0235beba, 0x0028f1b2, 0x0147e90a, 0x004cb6cc, 0x01777812, 0x00cd66b0, 0x02c2bbc9, 0x001da427}}}, + {X: Field{[10]uint32{0x03c63eb3, 0x021516e4, 0x022b1731, 0x0312174a, 0x032ed9d1, 0x0352cfb4, 0x03a51772, 0x0305d422, 0x02459aef, 0x002ce5f0}}, Y: Field{[10]uint32{0x01e71748, 0x00732dbd, 0x03a7e447, 0x01d38c45, 0x02228135, 0x024810fb, 0x0018ffc6, 0x00d9daad, 0x03603076, 0x002841a8}}}, + {X: Field{[10]uint32{0x000637df, 0x03ce4275, 0x0306532e, 0x03034a68, 0x02c1bdb8, 0x03a026ca, 0x01dbb755, 0x005918ca, 0x009befd6, 0x001d7156}}, Y: Field{[10]uint32{0x03e6f631, 0x009eb7e8, 0x0347dcba, 0x025687f8, 0x0395e602, 0x007f39ae, 0x02a19dd8, 0x00417243, 0x01e51492, 0x0009bcf8}}}, + {X: Field{[10]uint32{0x029135a5, 0x039bc225, 0x018b6620, 0x02004679, 0x02e4b0dc, 0x00e6a411, 0x015158c4, 0x01d0c85f, 0x0112a351, 0x000bbbb3}}, Y: Field{[10]uint32{0x01aaba4c, 0x03d2474b, 0x03707806, 0x019c5051, 0x01136064, 0x031315e4, 0x013d7539, 0x023b4c6d, 0x03d048c5, 0x003877ba}}}, + {X: Field{[10]uint32{0x00be65d1, 0x000164e7, 0x00124aa1, 0x002b1d6b, 0x038cab86, 0x02b77699, 0x031d52e5, 0x0359419a, 0x00915d39, 0x002a607c}}, Y: Field{[10]uint32{0x013ed069, 0x0180101f, 0x00e7b66c, 0x01253ccd, 0x0188d4f1, 0x025b9442, 0x018b23c0, 0x000a4cb6, 0x03cb7ab6, 0x00132c27}}}, + {X: Field{[10]uint32{0x03d4ef62, 0x01302826, 0x0331a9aa, 0x01a4999a, 0x02545cd8, 0x01d679e7, 0x01260c9a, 0x00740828, 0x02e3a7e8, 0x0006867e}}, Y: Field{[10]uint32{0x00937902, 0x016dcaac, 0x0070789c, 0x03c1a2b8, 0x0379714d, 0x021df71e, 0x01bf7bfd, 0x0171a78a, 0x02578af2, 0x000a01f5}}}, + {X: Field{[10]uint32{0x0020c61a, 0x00a04f49, 0x00567195, 0x0052674c, 0x029b0f43, 0x0198b9dd, 0x036f1392, 0x03465835, 0x016c1ee7, 0x0033fe1a}}, Y: Field{[10]uint32{0x02d16df8, 0x0314b179, 0x030c147f, 0x008ad8ad, 0x023581f1, 0x00daee05, 0x0004b1a1, 0x025a4097, 0x00138a39, 0x002125f8}}}, + {X: Field{[10]uint32{0x0227ce8c, 0x02417887, 0x01cd66cc, 0x016a7969, 0x00966911, 0x03523ac1, 0x02a95824, 0x00d1e72a, 0x00204a8b, 0x001a05e9}}, Y: Field{[10]uint32{0x033052ad, 0x01ca4dde, 0x026fd95e, 0x0309d8c8, 0x028182a0, 0x01720e17, 0x03254653, 0x01e97261, 0x028bc337, 0x00256151}}}, + {X: Field{[10]uint32{0x01d9d58e, 0x00cf5b23, 0x03233bcd, 0x00656494, 0x037d114b, 0x01e51e3c, 0x013eb995, 0x03309abc, 0x00846e0e, 0x00273bff}}, Y: Field{[10]uint32{0x025d2582, 0x0342aa3e, 0x00426856, 0x00d0fa99, 0x00510602, 0x03bc71fb, 0x03c4d4af, 0x03e86c19, 0x021a5cf8, 0x003806b2}}}, + {X: Field{[10]uint32{0x03456c49, 0x03c3b734, 0x00543835, 0x00c63104, 0x03995a37, 0x00c0797e, 0x03965892, 0x03dff765, 0x01c6f203, 0x001a9b87}}, Y: Field{[10]uint32{0x0384496b, 0x02eb284d, 0x03482f93, 0x02fdbbf4, 0x0183b579, 0x02a5d51b, 0x01f9ad86, 0x00fa7ac1, 0x039898b9, 0x000a81ca}}}, + {X: Field{[10]uint32{0x02a9129b, 0x00c75f34, 0x036d24dd, 0x008626b0, 0x008ba3a5, 0x02e461ba, 0x018b4f0f, 0x01d86d45, 0x021a588d, 0x001f9eeb}}, Y: Field{[10]uint32{0x033dbdd6, 0x0215beaa, 0x0129dcc4, 0x02f03503, 0x0017e6bb, 0x0343e1ce, 0x01e60e57, 0x01731ca2, 0x023b3799, 0x0014663d}}}, + {X: Field{[10]uint32{0x006bd253, 0x0316cd40, 0x039f805d, 0x018fb84b, 0x03ffa158, 0x02a17954, 0x014966ff, 0x02acafb5, 0x03a863de, 0x00004ff0}}, Y: Field{[10]uint32{0x03821459, 0x016d5ddc, 0x01d58b3b, 0x0209c0b9, 0x03a8b77c, 0x039daa55, 0x00a59e76, 0x01415bff, 0x02459127, 0x0038c70c}}}, + {X: Field{[10]uint32{0x02e9c167, 0x02f1b445, 0x00ccbbec, 0x00983452, 0x03e56503, 0x03a27a92, 0x036dbeda, 0x03645fda, 0x01eb3f39, 0x003ff8a3}}, Y: Field{[10]uint32{0x01bb988a, 0x02abb5a7, 0x01b2c262, 0x03844a31, 0x01383c4b, 0x0380acff, 0x03857604, 0x01113794, 0x02b3b878, 0x00236294}}}, + {X: Field{[10]uint32{0x01cc57be, 0x020ec3c1, 0x003cd444, 0x0150772f, 0x00481c43, 0x003e83b3, 0x0379a883, 0x01b79f40, 0x00239bf2, 0x0000a3b5}}, Y: Field{[10]uint32{0x00ce126e, 0x001016c4, 0x00ac37bc, 0x01c866f4, 0x012d5608, 0x012e3616, 0x020d860b, 0x02399d14, 0x02e2ea01, 0x00064848}}}, + {X: Field{[10]uint32{0x03f8a708, 0x01cb22c2, 0x02d7276c, 0x00e0be01, 0x025aa4ca, 0x03b9da76, 0x02acc00e, 0x03121014, 0x027c7be8, 0x001efce0}}, Y: Field{[10]uint32{0x0159eebe, 0x0090fa29, 0x011726bb, 0x001c6b4a, 0x0224a75d, 0x035c75c1, 0x00601fa1, 0x014a6d17, 0x02eee505, 0x002497cf}}}, + {X: Field{[10]uint32{0x03ce7000, 0x0384e01b, 0x017a4a7b, 0x02accc28, 0x012acb5a, 0x007dedaf, 0x02de8627, 0x00070fe3, 0x0299021a, 0x0033c69f}}, Y: Field{[10]uint32{0x01d3d673, 0x02855756, 0x0078a7c3, 0x028fce2a, 0x035f1e70, 0x00ce8d18, 0x023e7400, 0x0298445a, 0x02837b3b, 0x00084d96}}}, + {X: Field{[10]uint32{0x01bb29c7, 0x02f2ba44, 0x02944afc, 0x019d4989, 0x02af3bdd, 0x02f42a61, 0x036c8121, 0x01f31038, 0x0237d151, 0x0039de7a}}, Y: Field{[10]uint32{0x038a8a2f, 0x03200575, 0x03f81e8a, 0x01b51706, 0x026472bb, 0x00a71bd0, 0x00e2c6c0, 0x01dd6a81, 0x01ac4b19, 0x000cb18d}}}, + {X: Field{[10]uint32{0x026c2a92, 0x02dfda3c, 0x002a1638, 0x00a23806, 0x02f96977, 0x030e0754, 0x019785d6, 0x01084056, 0x012b76b5, 0x00040c27}}, Y: Field{[10]uint32{0x018265a9, 0x02340819, 0x02a1a043, 0x02b3066d, 0x02f3abce, 0x03e4c4c5, 0x03b9b377, 0x0261c03b, 0x03834c85, 0x000087b7}}}, + {X: Field{[10]uint32{0x033a27f9, 0x039c8694, 0x00701813, 0x00469c50, 0x02f2b6b3, 0x0244c80d, 0x032240de, 0x011b50ba, 0x0309701e, 0x001e649e}}, Y: Field{[10]uint32{0x0358920f, 0x03613b4e, 0x039053b3, 0x03bae34a, 0x008a0f47, 0x0184d841, 0x00756403, 0x021b0693, 0x0113a818, 0x003edf19}}}, + {X: Field{[10]uint32{0x0128849e, 0x03631cc5, 0x0137e0fd, 0x038128f7, 0x03085b1d, 0x0338938f, 0x0193e683, 0x00d0a67d, 0x023377da, 0x001d0ed3}}, Y: Field{[10]uint32{0x002f3216, 0x0135ad9d, 0x014f1816, 0x039a1278, 0x01fbba7d, 0x02b9cca0, 0x03f178ca, 0x018fb1ec, 0x0069b5ee, 0x000de400}}}, + {X: Field{[10]uint32{0x004f04da, 0x01a18143, 0x02cbf498, 0x03ec29ce, 0x02e46064, 0x02547f9a, 0x02cd9b49, 0x02edfc6a, 0x02e10ce1, 0x0035cf34}}, Y: Field{[10]uint32{0x0253dde8, 0x01fd2b6c, 0x0209614b, 0x0138bc8a, 0x00cae7f8, 0x028cffc7, 0x0087fcd6, 0x039c7fd6, 0x02e44cc6, 0x0039a9d8}}}, + {X: Field{[10]uint32{0x01f6fa68, 0x00b5a5e5, 0x033e8ed3, 0x02051f01, 0x01ba6324, 0x01ecfafc, 0x03318a17, 0x0091acff, 0x00d3f563, 0x000f8700}}, Y: Field{[10]uint32{0x010776d3, 0x01cbc34b, 0x00ef6b4a, 0x000308ff, 0x0118ce2e, 0x02038e07, 0x036aecb0, 0x0304a440, 0x00cf87d5, 0x0037cad8}}}, + {X: Field{[10]uint32{0x0168053c, 0x03f71b36, 0x03221a32, 0x039318a6, 0x00ed90c2, 0x01d49b6d, 0x00f10e68, 0x00594f97, 0x039092da, 0x0025b81f}}, Y: Field{[10]uint32{0x01c2bd66, 0x0081e1d3, 0x036164ab, 0x03f8b978, 0x021f8517, 0x03eb4ee6, 0x0220ea5b, 0x03a9ae7b, 0x003bb8a2, 0x00359707}}}, + {X: Field{[10]uint32{0x03e1debb, 0x005deaab, 0x02854d8e, 0x0148ce18, 0x02d27a76, 0x00b81e5a, 0x01cc124b, 0x03b8094c, 0x004026b1, 0x001b48c1}}, Y: Field{[10]uint32{0x0179bbd3, 0x00ef027b, 0x012c2598, 0x00a2a33f, 0x00e3dc62, 0x0393b002, 0x03bde471, 0x011a2543, 0x0195faa1, 0x003cea3e}}}, + {X: Field{[10]uint32{0x01707781, 0x03f3bc79, 0x02d9dc76, 0x004692c1, 0x00ad7d45, 0x039c584e, 0x00e43c49, 0x027700c5, 0x035c1f94, 0x002376a7}}, Y: Field{[10]uint32{0x0001310d, 0x0229609a, 0x03a775c7, 0x03bc2b96, 0x01ad9d9b, 0x02dcdd0d, 0x03674f5d, 0x02c2944a, 0x03aa7585, 0x0034158f}}}, + {X: Field{[10]uint32{0x03de97cd, 0x028d5eee, 0x036c4e5a, 0x03ead309, 0x03b4bf17, 0x03ff6905, 0x02da369f, 0x01cd8fd7, 0x013f9866, 0x00141c18}}, Y: Field{[10]uint32{0x0034ebc2, 0x033c26f7, 0x008178a0, 0x01f921a9, 0x02eb40e4, 0x02c5b6e1, 0x005751f9, 0x01fa8d06, 0x02ff4fe7, 0x00002c83}}}, + {X: Field{[10]uint32{0x0316bce7, 0x024bac2b, 0x03a8efc7, 0x01d1aa6c, 0x0004986d, 0x0306a862, 0x038838ea, 0x00515ae6, 0x00f0bfab, 0x000e929c}}, Y: Field{[10]uint32{0x01c4f3e5, 0x03d68f2b, 0x01e248bd, 0x022608e0, 0x03843b3e, 0x0013a108, 0x0032980c, 0x023b6a86, 0x02931916, 0x00391492}}}, + {X: Field{[10]uint32{0x02b33532, 0x02448c2a, 0x01a38b52, 0x0264ef37, 0x02db5fba, 0x018c1dcf, 0x01a82f54, 0x0166a76a, 0x00921831, 0x000b373e}}, Y: Field{[10]uint32{0x017677b9, 0x00d61c1d, 0x02044e0a, 0x0248c8a4, 0x010fd956, 0x00aaf3a3, 0x02299e74, 0x00fcca17, 0x02eac911, 0x003223a9}}}, + {X: Field{[10]uint32{0x00955c99, 0x028b778a, 0x0203d781, 0x00082630, 0x022b7fed, 0x00cc667a, 0x02e0cd6f, 0x017d8404, 0x028df8f1, 0x0006a164}}, Y: Field{[10]uint32{0x00db4299, 0x00b38e5d, 0x02945568, 0x009147af, 0x010534a1, 0x001c970a, 0x013a6b03, 0x01da8ff8, 0x02b2821c, 0x0006ce61}}}, + {X: Field{[10]uint32{0x01a1d388, 0x01ae13c7, 0x02c1a6b6, 0x0198f988, 0x00dde019, 0x006e7c04, 0x01206634, 0x00c19685, 0x01a1d6b0, 0x0021b453}}, Y: Field{[10]uint32{0x0399b2de, 0x00e030a0, 0x01055fd1, 0x00f87db9, 0x01cfe568, 0x00e010b3, 0x004a6f9f, 0x017327a2, 0x00ec764f, 0x0019e545}}}, + {X: Field{[10]uint32{0x02201cc2, 0x0340d5c5, 0x01441565, 0x0265f091, 0x03300459, 0x02941e38, 0x03343415, 0x0321e50c, 0x014f0bdf, 0x003907dd}}, Y: Field{[10]uint32{0x010e8e8e, 0x02c3f75e, 0x02e47dcb, 0x0382ecf3, 0x000743f5, 0x024bba6d, 0x02f119f4, 0x00647b7f, 0x0241c21d, 0x00374165}}}, + {X: Field{[10]uint32{0x0075cae4, 0x0265b4d1, 0x022fc756, 0x01ea0ce3, 0x032946e1, 0x03911190, 0x0268d8f4, 0x02fb11e5, 0x026845b5, 0x002dfb24}}, Y: Field{[10]uint32{0x03dda53b, 0x018b9c53, 0x002cb7cc, 0x01425e3b, 0x00d945e3, 0x01e51dad, 0x02210f57, 0x027a4043, 0x018bb753, 0x0002ad28}}}, + {X: Field{[10]uint32{0x03518912, 0x01da752d, 0x009d456b, 0x02f020c9, 0x03bf3ecf, 0x02896142, 0x022554a0, 0x03786459, 0x01dcf1ea, 0x000903f6}}, Y: Field{[10]uint32{0x0104515b, 0x001ac234, 0x0220776a, 0x025cc4d4, 0x005318a8, 0x02a9aa01, 0x03a3a62e, 0x00e42214, 0x025ee0ba, 0x002bc0fe}}}, + {X: Field{[10]uint32{0x035bb769, 0x015c8de1, 0x00129a5c, 0x037e3c73, 0x022b88aa, 0x02330fea, 0x01e39d28, 0x00c4525e, 0x00ecee7d, 0x0000d4f1}}, Y: Field{[10]uint32{0x012d147e, 0x03693f34, 0x03cf02a0, 0x02e16b8c, 0x0228e607, 0x035c2ae3, 0x000118ba, 0x01384ba5, 0x004090af, 0x0027e9fb}}}, + {X: Field{[10]uint32{0x03d933de, 0x0200dd8a, 0x0082d39e, 0x02232f81, 0x03893409, 0x018a3f46, 0x0206ae11, 0x019a2045, 0x018aa855, 0x003d3bb5}}, Y: Field{[10]uint32{0x033b3d44, 0x01bc3e37, 0x03eb9160, 0x03e94b5f, 0x0118b40b, 0x0233ad03, 0x031969ca, 0x0381c341, 0x0364fe74, 0x00109e33}}}, + {X: Field{[10]uint32{0x026ef1ce, 0x004a4389, 0x000fa01a, 0x0029cdaf, 0x000b284f, 0x02d554b5, 0x00c17d50, 0x0099810d, 0x02e2e2d0, 0x001a63fe}}, Y: Field{[10]uint32{0x01ffc970, 0x00206638, 0x0143fab6, 0x03fec2f4, 0x038bd50c, 0x025bf04b, 0x027e53a4, 0x016dd076, 0x008d0784, 0x000659b3}}}, + {X: Field{[10]uint32{0x01314098, 0x01c48699, 0x0196b595, 0x028013ed, 0x0122d884, 0x005f2251, 0x020587d4, 0x0305035b, 0x016d5c88, 0x002d4ed6}}, Y: Field{[10]uint32{0x032c745a, 0x025eba23, 0x01a56771, 0x01c13306, 0x0025deeb, 0x01b0cbbb, 0x03de4857, 0x03f9db21, 0x00b909be, 0x00377fd8}}}, + {X: Field{[10]uint32{0x0213066a, 0x004bedc6, 0x02d65527, 0x01967d89, 0x00791518, 0x03a7c9da, 0x024cba67, 0x00efe75b, 0x0321d439, 0x0025d812}}, Y: Field{[10]uint32{0x028d17f8, 0x018988d2, 0x03616360, 0x0153e809, 0x027d871c, 0x00d5fc99, 0x005b0d17, 0x01fdf197, 0x0384e1cf, 0x0039ebbc}}}, + {X: Field{[10]uint32{0x01bb8623, 0x01213a54, 0x007edb63, 0x003b6875, 0x013b3876, 0x0018bdef, 0x02b234c1, 0x03b980c4, 0x01ba6eda, 0x001e8d72}}, Y: Field{[10]uint32{0x0184a5b1, 0x035a9093, 0x002457eb, 0x015e1bbe, 0x00769f3a, 0x03bdc128, 0x0292b586, 0x019d85ab, 0x027ba454, 0x000ce25e}}}, + {X: Field{[10]uint32{0x011e2804, 0x00836543, 0x03e01b6a, 0x005e19c1, 0x02c9638b, 0x0098c043, 0x026e0cc9, 0x00457728, 0x0075f989, 0x0021b503}}, Y: Field{[10]uint32{0x00315ca3, 0x00e1d0bb, 0x00410c0f, 0x010b105c, 0x01dddf28, 0x0211ad72, 0x031dcc8a, 0x02307839, 0x03624ffd, 0x001d66f5}}}, + {X: Field{[10]uint32{0x009badb7, 0x037acc58, 0x001ce3e8, 0x03a6ca90, 0x01fc77f6, 0x00ee4397, 0x03ddea49, 0x02de7d98, 0x03479a4b, 0x00180eff}}, Y: Field{[10]uint32{0x01a4f4b4, 0x008e6627, 0x0320ee1e, 0x0377700d, 0x03358c86, 0x034ce80b, 0x02eefffc, 0x006aa9ab, 0x01fc6528, 0x00018a1e}}}, + {X: Field{[10]uint32{0x032203ed, 0x039a2c40, 0x03d7b5de, 0x03705261, 0x00fa13eb, 0x029d68db, 0x01e0bbf8, 0x01e9f5c8, 0x00f3c7dc, 0x0001722e}}, Y: Field{[10]uint32{0x0208e7d3, 0x0124d033, 0x0190ce77, 0x0328506f, 0x013faa43, 0x023f35b9, 0x01d304d8, 0x031af5f6, 0x03382bc4, 0x001ad807}}}, + {X: Field{[10]uint32{0x0144fb05, 0x018f3a1d, 0x00505a79, 0x01fa4024, 0x0025a6f2, 0x020edcde, 0x027a55ff, 0x02530907, 0x02c5a916, 0x000c4f07}}, Y: Field{[10]uint32{0x003c6384, 0x01980dc4, 0x02e59825, 0x023891d4, 0x0101ed85, 0x031118b1, 0x0244699b, 0x0197ebed, 0x03ff9a43, 0x00270c54}}}, + {X: Field{[10]uint32{0x01d923bd, 0x000550ea, 0x006bf98b, 0x03569e5d, 0x00150b4b, 0x01a383e8, 0x0268cb29, 0x02bbecc0, 0x02514616, 0x000146b2}}, Y: Field{[10]uint32{0x02e028b4, 0x0115e9d3, 0x001cc203, 0x0310c77d, 0x01a0a66e, 0x0138acd8, 0x0163ca4f, 0x01dd1eff, 0x01b4073a, 0x001f147e}}}, + {X: Field{[10]uint32{0x0219677d, 0x01edb0c9, 0x00a122ab, 0x0359dd0f, 0x01353071, 0x02efa5ea, 0x036d3f92, 0x00192124, 0x039927ea, 0x0012ba34}}, Y: Field{[10]uint32{0x008a47a3, 0x019df50f, 0x027c919e, 0x01790d4b, 0x000f350f, 0x0244414e, 0x02a332b0, 0x02f3a0e3, 0x019bc251, 0x003e7714}}}, + {X: Field{[10]uint32{0x0256dcca, 0x01e137a8, 0x0257baa0, 0x022712bc, 0x03b100c2, 0x021352ef, 0x01a054a8, 0x02d68230, 0x015d3f9c, 0x001af472}}, Y: Field{[10]uint32{0x03803b5b, 0x0153be1a, 0x03e71396, 0x015ea221, 0x00801923, 0x02c1f79e, 0x031fc401, 0x02c4bdbd, 0x003bde39, 0x001e4d8a}}}, + {X: Field{[10]uint32{0x0249480e, 0x0374a0ea, 0x028ce19b, 0x00027be7, 0x035737f7, 0x001feef2, 0x0370a62e, 0x032ab6b8, 0x02294642, 0x003889e2}}, Y: Field{[10]uint32{0x0037dd01, 0x03c50ed2, 0x00f77b36, 0x02d60f59, 0x01087bc8, 0x0360bd87, 0x03570b7e, 0x00f39cd6, 0x03cdf394, 0x0010c48b}}}, + {X: Field{[10]uint32{0x0296c644, 0x03d2b13f, 0x0071ffee, 0x00b02c89, 0x008d24fb, 0x00ccd60c, 0x004bb019, 0x01a7f744, 0x00d59f94, 0x001a14df}}, Y: Field{[10]uint32{0x0000050e, 0x018f2061, 0x024a7320, 0x01165e77, 0x004003ab, 0x01b8ec67, 0x0399ff32, 0x01e9476f, 0x00ef4110, 0x001d94d8}}}, + {X: Field{[10]uint32{0x025af330, 0x024281dd, 0x03b54b12, 0x03bcfe06, 0x0070be08, 0x03022209, 0x00a0735f, 0x027e7e3e, 0x03c669c9, 0x0017b27f}}, Y: Field{[10]uint32{0x0163b222, 0x0084e5c4, 0x03b381a4, 0x03737472, 0x001f4f1c, 0x015ad1f0, 0x00c32290, 0x021c581e, 0x0008e76f, 0x002aed50}}}, + {X: Field{[10]uint32{0x004dfae9, 0x02661d1c, 0x0231db23, 0x03d8572b, 0x0101a330, 0x01945528, 0x0071aba4, 0x00c3eea5, 0x008e5d49, 0x00138006}}, Y: Field{[10]uint32{0x01317868, 0x02ee0753, 0x02bba57f, 0x00a74821, 0x015ed3fe, 0x016d0082, 0x03656dd3, 0x00daa9cf, 0x03302824, 0x0001f9db}}}, + {X: Field{[10]uint32{0x015ed984, 0x0377f57c, 0x02e3c8aa, 0x0392f4ed, 0x03a2659c, 0x0130bcfe, 0x0139edeb, 0x0054bbff, 0x03a4d480, 0x0012b8d1}}, Y: Field{[10]uint32{0x02d4e523, 0x00b170d8, 0x033070ca, 0x0307cd71, 0x0165bb6a, 0x029cb18d, 0x02b8ba7b, 0x033f7d3e, 0x03460d44, 0x000e0f8b}}}, + {X: Field{[10]uint32{0x006665ef, 0x03386e27, 0x0319c603, 0x031363dd, 0x0235fd09, 0x01942697, 0x02d90fc8, 0x02b03be5, 0x0224a8d3, 0x000cb2b7}}, Y: Field{[10]uint32{0x038bea36, 0x004342be, 0x036af55c, 0x03cb8324, 0x02266939, 0x032a27e6, 0x023c5aa6, 0x02c4dd6d, 0x00735c63, 0x0021c9ce}}}, + {X: Field{[10]uint32{0x01cfcbee, 0x00891114, 0x0204f5f4, 0x030f53dc, 0x0320c703, 0x03e1f08b, 0x00e68910, 0x01d5d9ab, 0x01956014, 0x002393bc}}, Y: Field{[10]uint32{0x02ed47af, 0x025c1b81, 0x00666045, 0x00332527, 0x02cd5b9d, 0x0003ef3f, 0x02da0afc, 0x01f06de7, 0x02e389d9, 0x0000be9c}}}, + {X: Field{[10]uint32{0x00a2c30a, 0x01f9ffe9, 0x02509aae, 0x005a7bf0, 0x01559d73, 0x02181e80, 0x01549911, 0x000fdb13, 0x035c4adc, 0x000d7f55}}, Y: Field{[10]uint32{0x0248e000, 0x012b7472, 0x00aa1347, 0x03367252, 0x03dbf3ee, 0x033442b1, 0x0300926d, 0x02079f2d, 0x039d2748, 0x003e695d}}}, + {X: Field{[10]uint32{0x010a9cf6, 0x00d7fb72, 0x032873c6, 0x017d7d76, 0x03efc12f, 0x031049b1, 0x00929a52, 0x00965452, 0x00507fd0, 0x0024cb93}}, Y: Field{[10]uint32{0x028ba783, 0x0187be6e, 0x01f2875f, 0x03ef36fc, 0x009e84ef, 0x034660b0, 0x036b1b24, 0x028670a7, 0x0221bbac, 0x00339af2}}}, + {X: Field{[10]uint32{0x01fbea11, 0x01175cd2, 0x03fb211a, 0x02b4d77a, 0x0355d3e2, 0x03d165c1, 0x036a37f2, 0x014706f8, 0x024422a0, 0x0032b637}}, Y: Field{[10]uint32{0x001c347a, 0x008e99bc, 0x013e0533, 0x035e2a7f, 0x01308eeb, 0x013e1bc4, 0x0241c903, 0x01a7ca02, 0x031d4f66, 0x00122c37}}}, + {X: Field{[10]uint32{0x009594d6, 0x03efa41b, 0x0357b462, 0x0323f3ad, 0x031919ff, 0x032cd8e0, 0x016aa646, 0x03eb9f40, 0x0304c847, 0x0027f1f4}}, Y: Field{[10]uint32{0x019860ff, 0x038e9143, 0x03c9e516, 0x01b39352, 0x00196367, 0x01ebf729, 0x029dd38a, 0x02861f36, 0x00e13bc6, 0x003745f0}}}, + {X: Field{[10]uint32{0x008b5849, 0x00d5d866, 0x000b4c89, 0x03dd305f, 0x008300e4, 0x02537aee, 0x00654538, 0x0281771a, 0x00df10d4, 0x00106e9b}}, Y: Field{[10]uint32{0x007ad4c5, 0x026107f9, 0x03ac5930, 0x02133c54, 0x01ece57e, 0x00a0ccc8, 0x031e278b, 0x00259795, 0x03158c3f, 0x001fad8a}}}, + {X: Field{[10]uint32{0x01c7377b, 0x01ee9104, 0x02884b22, 0x0037c15f, 0x03d5bbf3, 0x03bee1a4, 0x0174248c, 0x01ab9a8b, 0x025aaef3, 0x0007fe7f}}, Y: Field{[10]uint32{0x01e74278, 0x00815d7c, 0x00692165, 0x01416f99, 0x01506908, 0x032d57c2, 0x009cf41f, 0x0000e127, 0x036c585c, 0x001ae892}}}, + {X: Field{[10]uint32{0x03f5d660, 0x03ce31b2, 0x03ebd893, 0x00507e3d, 0x026d1348, 0x0215b09c, 0x019d0704, 0x01b4a79b, 0x00440d70, 0x000a675f}}, Y: Field{[10]uint32{0x0103ff32, 0x0217ba8b, 0x000400fc, 0x03fe6d25, 0x0062f7d1, 0x01b7a6b3, 0x01b48877, 0x01d3832a, 0x00f34d03, 0x0003929d}}}, + {X: Field{[10]uint32{0x02e3a67d, 0x02caff5c, 0x012d69f7, 0x00b73a94, 0x020b607c, 0x00f5ba4e, 0x0318ceb8, 0x03261db8, 0x02d90ec1, 0x00280ccf}}, Y: Field{[10]uint32{0x03a0539e, 0x0216467e, 0x0141e0d6, 0x00eedae2, 0x0019f83e, 0x007f9ed4, 0x03373932, 0x01da74d6, 0x03655f51, 0x00369f74}}}, + {X: Field{[10]uint32{0x004251e0, 0x02e13e90, 0x020d2e75, 0x0005593a, 0x032821cf, 0x02a5a197, 0x00093d0b, 0x028cc14d, 0x02a22e52, 0x00169104}}, Y: Field{[10]uint32{0x030e4313, 0x0101e363, 0x0300c7cd, 0x009d53ad, 0x033675ab, 0x001b4a4e, 0x010bc0ab, 0x015c3a0e, 0x00e07e6c, 0x001a91e2}}}, + {X: Field{[10]uint32{0x02b7b0b5, 0x008f3d8c, 0x03cdc3e8, 0x00770bf9, 0x01078335, 0x01a7e6d9, 0x0134ea6a, 0x00771839, 0x004c3b14, 0x0035dcbb}}, Y: Field{[10]uint32{0x009ac0df, 0x00a6f99a, 0x03cfdda9, 0x00bf6e26, 0x01c9ccd9, 0x036ace08, 0x010979dd, 0x0121f9c2, 0x000d1036, 0x002f64d0}}}, + {X: Field{[10]uint32{0x01f89336, 0x0288d9db, 0x0321cd04, 0x0293b284, 0x03d4452f, 0x03903e01, 0x033e1cd6, 0x0130effe, 0x02d2c769, 0x002525e0}}, Y: Field{[10]uint32{0x02d436dc, 0x0351672e, 0x00930b68, 0x005325ef, 0x019f4e2c, 0x03358f15, 0x032e5dbb, 0x008ad50d, 0x027fb8ba, 0x0039f179}}}, + {X: Field{[10]uint32{0x0057e6de, 0x013d85a9, 0x0070e233, 0x032185dd, 0x036d9ca0, 0x031271c7, 0x00a9e4d4, 0x03d67cf8, 0x01f575e6, 0x001fb9f5}}, Y: Field{[10]uint32{0x03d9f3ee, 0x01ccbbb5, 0x03d0197e, 0x000b5a81, 0x029cbbbe, 0x01be8c42, 0x0074add7, 0x00f99b24, 0x029c7612, 0x001118b6}}}, + {X: Field{[10]uint32{0x013f843e, 0x02baedec, 0x0320b50f, 0x011c2ee0, 0x018a5548, 0x01505e54, 0x005ba7c1, 0x011ed6de, 0x030ae08d, 0x001e92d8}}, Y: Field{[10]uint32{0x01937c00, 0x035c1da7, 0x025dc6b5, 0x00641fe7, 0x0269a3b2, 0x02d26037, 0x023a524d, 0x0007a5c5, 0x004fb868, 0x00328939}}}, + {X: Field{[10]uint32{0x02a82b96, 0x0071b2c6, 0x037939c3, 0x03cca653, 0x013a18ee, 0x02ed88f0, 0x02a55032, 0x03102902, 0x0242428a, 0x0034b642}}, Y: Field{[10]uint32{0x0234972a, 0x013568fc, 0x03b66746, 0x01b960b7, 0x01394a3b, 0x002c7838, 0x0039e064, 0x03567cc0, 0x02332367, 0x001d614b}}}, + {X: Field{[10]uint32{0x015d13e0, 0x0382c5ba, 0x01b91340, 0x017120d2, 0x03a4809b, 0x00bb53cb, 0x01b56066, 0x037ecf68, 0x01ab6206, 0x00364926}}, Y: Field{[10]uint32{0x0271be38, 0x00a6caac, 0x0294111f, 0x0192f800, 0x00fa4dfc, 0x024eae98, 0x01400749, 0x03f86a3e, 0x00ed26a4, 0x00108d51}}}, + {X: Field{[10]uint32{0x01d09a23, 0x020c3d71, 0x034dc8d5, 0x02f9b1af, 0x02bba6f2, 0x02dffe1e, 0x00e2d315, 0x01799b49, 0x02c25887, 0x003b0307}}, Y: Field{[10]uint32{0x00591421, 0x02e9058a, 0x00d7aee8, 0x0261d601, 0x018b798c, 0x01822fde, 0x009a237e, 0x02f46071, 0x03f1648a, 0x003949a9}}}, + {X: Field{[10]uint32{0x03ba8863, 0x0384025a, 0x00c2ef30, 0x00205de6, 0x003a6ae5, 0x0243a814, 0x01b48052, 0x01662621, 0x0168835b, 0x001a4e02}}, Y: Field{[10]uint32{0x0311e5f4, 0x01c3d78b, 0x03345a61, 0x01d6064b, 0x037522df, 0x005341f1, 0x0297137a, 0x02e98d14, 0x039d80f0, 0x001c6fa8}}}, + {X: Field{[10]uint32{0x00a9ab23, 0x02b7237f, 0x0062bebb, 0x0177d65b, 0x0115a40a, 0x007fcbfb, 0x00fe8d2e, 0x018df913, 0x01a19fd1, 0x00359ac7}}, Y: Field{[10]uint32{0x006b9946, 0x01a51d96, 0x03b6878a, 0x00749960, 0x015cc5d9, 0x001eccc5, 0x0217c4e6, 0x012edc72, 0x00ebbd2b, 0x001a33d9}}}, + {X: Field{[10]uint32{0x0298c95f, 0x0037220c, 0x01695a51, 0x01729ad6, 0x01503647, 0x0264c590, 0x0350d70c, 0x018b2e49, 0x00a2c6fa, 0x00277663}}, Y: Field{[10]uint32{0x00fbe821, 0x00381f6b, 0x03c8187a, 0x0017663f, 0x03407509, 0x018ecc76, 0x01278b7e, 0x02735be3, 0x03b853b9, 0x00156a22}}}, + {X: Field{[10]uint32{0x0141bfa2, 0x02a6b7b4, 0x01b925b9, 0x02336dea, 0x014efd84, 0x03078b5c, 0x00ecccd0, 0x03c6efa9, 0x002c842c, 0x0006d9af}}, Y: Field{[10]uint32{0x03673bea, 0x02e69c20, 0x00a890dd, 0x000620c7, 0x02402b35, 0x02108f2d, 0x003d88b6, 0x020ae2bd, 0x030155fe, 0x003f82d1}}}, + {X: Field{[10]uint32{0x00eb688a, 0x001d72b2, 0x00312c1c, 0x03243c3a, 0x03c7d2d5, 0x0248b800, 0x016a61c2, 0x00c77b4e, 0x01c48a92, 0x0002ca03}}, Y: Field{[10]uint32{0x02738a74, 0x0338c1b4, 0x03ff7da9, 0x01854c73, 0x00498c82, 0x00aeaebc, 0x02cb3ad6, 0x02f99acc, 0x01a6a2f8, 0x00206dd1}}}, + {X: Field{[10]uint32{0x018a6b5d, 0x0073717c, 0x0280f8cf, 0x01b3c055, 0x02413e90, 0x00438ba4, 0x00125ad5, 0x02e8720a, 0x011c9eb3, 0x001ef165}}, Y: Field{[10]uint32{0x00352a07, 0x02bd69a6, 0x01a1cd43, 0x03c3b88a, 0x000fbda2, 0x026b71b5, 0x026fc7f4, 0x02a2f6e2, 0x01d8480b, 0x00106e41}}}, + {X: Field{[10]uint32{0x02eabfc1, 0x00b14efd, 0x02ea34ed, 0x0023713c, 0x01116479, 0x0172a1a5, 0x02530952, 0x015235da, 0x00d12318, 0x001a7fdd}}, Y: Field{[10]uint32{0x03de2419, 0x02f9dd6b, 0x01bde0d4, 0x025f7325, 0x011d6173, 0x00eb7d7f, 0x02aca1eb, 0x027de04b, 0x02288eb9, 0x003ce8f9}}}, + {X: Field{[10]uint32{0x004af209, 0x014b86b2, 0x003b92c5, 0x0262a83c, 0x02ffa460, 0x039fda26, 0x028f8cdd, 0x034e967e, 0x013f01f6, 0x0017f9b7}}, Y: Field{[10]uint32{0x00dbfb55, 0x02f1d3d8, 0x01aacd6d, 0x00589d28, 0x03f356cc, 0x015443ab, 0x01197a91, 0x0340893b, 0x0101acb8, 0x0027baba}}}, + {X: Field{[10]uint32{0x0105f5f0, 0x008b9671, 0x023b121d, 0x031e3338, 0x01d3b52b, 0x0314fe44, 0x029fafe9, 0x01d76dd1, 0x0122cb04, 0x0011a7a4}}, Y: Field{[10]uint32{0x0058d812, 0x0138bf04, 0x0237ecb8, 0x0200276d, 0x0280d8a5, 0x01348b09, 0x025825fa, 0x02e9afd6, 0x03a838b2, 0x003f9d21}}}, + {X: Field{[10]uint32{0x0160e6ab, 0x018ed364, 0x00c1c06d, 0x0061c307, 0x0072a5e7, 0x02cc3e39, 0x01f816e8, 0x00a48ecb, 0x02bf06b6, 0x0007d28f}}, Y: Field{[10]uint32{0x01c89e2f, 0x031a9853, 0x02d39b77, 0x037a21c1, 0x011ebeeb, 0x00a6299f, 0x0138bd40, 0x02b86626, 0x02957602, 0x00263684}}}, + {X: Field{[10]uint32{0x03b86b0f, 0x01e3af54, 0x00773c2f, 0x00b743e9, 0x00411722, 0x01bd4428, 0x00226ac2, 0x03fc333b, 0x01fe1c12, 0x00363aa5}}, Y: Field{[10]uint32{0x006288d9, 0x03bd1ca3, 0x03f5b25f, 0x026e8075, 0x01f154b5, 0x03a4b092, 0x00bebb3c, 0x03ca4ee2, 0x039edde6, 0x000556fb}}}, + {X: Field{[10]uint32{0x0227cac6, 0x01ef53c4, 0x02527179, 0x017771fc, 0x002bb36f, 0x01c114c0, 0x014b2cf8, 0x0201c488, 0x03c797b3, 0x0006b628}}, Y: Field{[10]uint32{0x0057814c, 0x00f017d2, 0x02a1ccfa, 0x01741355, 0x0158398c, 0x03f3d47b, 0x00189576, 0x008dfc55, 0x03aa3755, 0x001a029d}}}, + {X: Field{[10]uint32{0x00fa7d66, 0x03b0c609, 0x0292a3fd, 0x02cb0caa, 0x00355540, 0x03c2c3e2, 0x01426469, 0x0349b836, 0x010405d1, 0x003ffa9c}}, Y: Field{[10]uint32{0x0034eac8, 0x03413089, 0x00ed4cb5, 0x02bcb299, 0x00081f67, 0x01c0bb75, 0x02c8db75, 0x0281b113, 0x00e22d8d, 0x003b2891}}}, + {X: Field{[10]uint32{0x0159d8ab, 0x0192b22e, 0x00f3fc17, 0x02e95764, 0x01d3abe9, 0x03f5bd9d, 0x02141c8c, 0x02226152, 0x03a3f7fc, 0x0012b156}}, Y: Field{[10]uint32{0x00be2bd2, 0x02f24efe, 0x039ce15b, 0x02d06f61, 0x03714821, 0x0062c412, 0x0252d141, 0x03edeff4, 0x0391f135, 0x00271eca}}}, + {X: Field{[10]uint32{0x03718ac4, 0x01ebd42e, 0x01536fe2, 0x02a72949, 0x02bc7061, 0x0196e280, 0x01de0eb8, 0x02933bca, 0x00677aa9, 0x0017e051}}, Y: Field{[10]uint32{0x00d9c042, 0x033c4064, 0x01b3669a, 0x0251cf8e, 0x022b8cb8, 0x00c07ec0, 0x00340716, 0x02c9bf99, 0x01dc4062, 0x002f6a59}}}, + {X: Field{[10]uint32{0x01dd88bb, 0x03ac551d, 0x0390388b, 0x029346b2, 0x02da5f96, 0x016607cc, 0x029f2130, 0x01d2612c, 0x03043791, 0x003cdcb2}}, Y: Field{[10]uint32{0x02367d89, 0x002ad186, 0x00efcb2a, 0x03b38cb1, 0x007ceda2, 0x01a50653, 0x00a0ea07, 0x03540068, 0x035c1e62, 0x0020b5a3}}}, + {X: Field{[10]uint32{0x0359b128, 0x0314c82e, 0x026927a3, 0x03c890f8, 0x02878ec6, 0x03efe92c, 0x03133753, 0x0011e0d8, 0x03c54576, 0x0003ec4a}}, Y: Field{[10]uint32{0x0153aef5, 0x01af9712, 0x03e17a92, 0x01dff5ef, 0x01961930, 0x009329a0, 0x01ac0cba, 0x0386d6ed, 0x011867da, 0x000fe080}}}, + {X: Field{[10]uint32{0x00c0ea07, 0x03fe0658, 0x02447316, 0x0286c2a4, 0x034adafe, 0x01ea5d1f, 0x03075601, 0x0128d3d0, 0x01ac918a, 0x000f65d6}}, Y: Field{[10]uint32{0x02018aaa, 0x02956695, 0x03ecc6fc, 0x0299defa, 0x00caa317, 0x02a5925f, 0x031d5dda, 0x00cc2ad9, 0x03cf6d6a, 0x00033676}}}, + {X: Field{[10]uint32{0x023e00ce, 0x015720bf, 0x02909844, 0x037d6390, 0x019f476f, 0x01a6f1f7, 0x0349be46, 0x014870fe, 0x02b3699c, 0x003ab82a}}, Y: Field{[10]uint32{0x0317259e, 0x01feb853, 0x00bdd977, 0x0078478c, 0x0362c7ef, 0x017a0228, 0x0377b562, 0x039f0a66, 0x00dd450e, 0x002eb73a}}}, + {X: Field{[10]uint32{0x011eb851, 0x002afb51, 0x0338455e, 0x01f49328, 0x0343718a, 0x0097b974, 0x0225d0e9, 0x033aa95d, 0x02eec2c0, 0x003fb494}}, Y: Field{[10]uint32{0x002c648f, 0x0296a2ba, 0x03b4c457, 0x007173c2, 0x00dd0721, 0x001d5bd9, 0x0166b277, 0x03bf3087, 0x02ae56ce, 0x0019aeed}}}, + {X: Field{[10]uint32{0x017f9dbd, 0x021e4e8b, 0x013c9bc0, 0x00be74c0, 0x022362af, 0x02eac2c8, 0x03fb04d3, 0x030f0505, 0x02bd022a, 0x003698e7}}, Y: Field{[10]uint32{0x022466d5, 0x029ed3a0, 0x0031c10a, 0x03a8f9e8, 0x003627aa, 0x00daef95, 0x034ed0d5, 0x03a7cbe9, 0x022055f1, 0x0020fc9d}}}, + {X: Field{[10]uint32{0x02ab90dd, 0x01f3f09f, 0x0282ce09, 0x029ab2b9, 0x0132ced2, 0x031c77e4, 0x00d3ac67, 0x0116bd35, 0x00ded773, 0x00149349}}, Y: Field{[10]uint32{0x02b7f5c2, 0x01e81d3e, 0x03b01b2f, 0x000221ec, 0x032d010a, 0x003f9f3f, 0x036f55c9, 0x01f170c6, 0x00f7c692, 0x003933d7}}}, + {X: Field{[10]uint32{0x00ae4f94, 0x03149a15, 0x021c4b24, 0x02917ef0, 0x0028672d, 0x00a185ed, 0x007cde0c, 0x02d830d7, 0x02d5fb52, 0x001f6b0b}}, Y: Field{[10]uint32{0x03794038, 0x023b83f9, 0x0309ea57, 0x02db4a0a, 0x02f6cc11, 0x034919b0, 0x035c4a2b, 0x022199c2, 0x007ae916, 0x00331ab3}}}, + {X: Field{[10]uint32{0x016083ae, 0x01472fb9, 0x03ea6f7c, 0x02728e24, 0x02887e5d, 0x003a4a46, 0x019d10d0, 0x03d67dae, 0x024dda61, 0x0017d1ad}}, Y: Field{[10]uint32{0x0283a8ae, 0x007cf678, 0x0182e5ee, 0x02e9f86d, 0x0109bfa6, 0x0155ca4a, 0x02dcfb9c, 0x00995541, 0x0055da25, 0x001810f4}}}, + {X: Field{[10]uint32{0x01e14aa3, 0x0258685f, 0x03635175, 0x0308e29f, 0x0348ef0f, 0x023177c3, 0x0241ec2b, 0x017c85b9, 0x0033b6a2, 0x002218fb}}, Y: Field{[10]uint32{0x02b42541, 0x032c4ac3, 0x037a117d, 0x020f683f, 0x0345b2a5, 0x01241956, 0x00292777, 0x016070be, 0x00f31e52, 0x00275986}}}, + {X: Field{[10]uint32{0x03a2f9f4, 0x035a9a0c, 0x02a03a1b, 0x03dcfa4b, 0x03b377f3, 0x03c9be47, 0x00184c7e, 0x016739b6, 0x00463ac4, 0x0021500d}}, Y: Field{[10]uint32{0x01b399cb, 0x03dc9e31, 0x01430438, 0x03c8ec32, 0x018f7719, 0x00c4ff8d, 0x012a5b18, 0x019266c9, 0x02968ac5, 0x000b47c4}}}, + {X: Field{[10]uint32{0x02223c7f, 0x032b7597, 0x03201379, 0x009d7adf, 0x006a325d, 0x018899ad, 0x0251dbc3, 0x0104aff9, 0x03f6217e, 0x0002fdac}}, Y: Field{[10]uint32{0x03ba748b, 0x02c6bbe5, 0x03eaf0a9, 0x0035abc6, 0x01ebfad9, 0x03bb8f7b, 0x0041e7dc, 0x029157ec, 0x0154c14a, 0x00284582}}}, + {X: Field{[10]uint32{0x02d9e59d, 0x009396af, 0x03ffc771, 0x00662e86, 0x03860ca2, 0x0026a933, 0x02079ea4, 0x0184d52a, 0x002d3c18, 0x0012c808}}, Y: Field{[10]uint32{0x035b8873, 0x017a2a43, 0x002bab55, 0x01154418, 0x007703eb, 0x03c47641, 0x01d858f2, 0x0302c2e9, 0x0103c107, 0x0027da11}}}, + {X: Field{[10]uint32{0x02421dd2, 0x01a96a81, 0x03e28268, 0x03c989f2, 0x0199c050, 0x009ed64c, 0x024f5331, 0x02692ce8, 0x00806d67, 0x001021fe}}, Y: Field{[10]uint32{0x0188e8b9, 0x01c1f4af, 0x0121b5a5, 0x0105627e, 0x01698800, 0x0263d696, 0x008c8836, 0x035220cf, 0x0184b3d9, 0x00120e2b}}}, + {X: Field{[10]uint32{0x0297b79c, 0x0244c6bf, 0x02ac766d, 0x00131e43, 0x00538775, 0x01693f0d, 0x01b91e00, 0x01d01a8b, 0x0287cb2e, 0x000569e4}}, Y: Field{[10]uint32{0x014a238a, 0x029069ae, 0x003fadf2, 0x033ee5aa, 0x031bd597, 0x00b18583, 0x03ce497c, 0x01cb8f4f, 0x03220765, 0x0027d3bc}}}, + {X: Field{[10]uint32{0x03bcecbe, 0x026cd0f8, 0x02812273, 0x0029f888, 0x02404fb1, 0x032cf502, 0x0233d61b, 0x012f13fc, 0x0063c052, 0x000713e8}}, Y: Field{[10]uint32{0x02d48bd6, 0x0231cf58, 0x003533aa, 0x02cafd34, 0x03d39c90, 0x035cc2ca, 0x0209e9eb, 0x00bbae5c, 0x01eca2d8, 0x000aa158}}}, + {X: Field{[10]uint32{0x01f2a636, 0x0058ed6b, 0x02c2656d, 0x029b5221, 0x02bb50b8, 0x014c4bca, 0x03936c18, 0x02cb1499, 0x03a743c1, 0x00281c22}}, Y: Field{[10]uint32{0x031a20ea, 0x017a534d, 0x00324584, 0x0188d669, 0x007dc66a, 0x004b874b, 0x01b81550, 0x022331b2, 0x01f19169, 0x002563d1}}}, + {X: Field{[10]uint32{0x00acad7d, 0x00de4f3a, 0x02858c21, 0x0152c4a6, 0x0109b797, 0x00b8cfff, 0x009d71f0, 0x010b9b84, 0x034df01a, 0x0035e582}}, Y: Field{[10]uint32{0x03deb920, 0x03078676, 0x00707d81, 0x024d8c46, 0x02335661, 0x03195cc2, 0x003d0e1d, 0x0074ad87, 0x01aa5a84, 0x00232bc6}}}, + {X: Field{[10]uint32{0x038ba611, 0x030c902f, 0x03789daa, 0x01b9ba28, 0x02a7c450, 0x03f286cc, 0x0225ba38, 0x01c3565b, 0x006bf8ba, 0x001e80f7}}, Y: Field{[10]uint32{0x037d9028, 0x021293df, 0x03881fcb, 0x0207425a, 0x00048a36, 0x01dcf85c, 0x023e378b, 0x01a15969, 0x0222292d, 0x001c3c67}}}, + {X: Field{[10]uint32{0x03443b97, 0x00e3c971, 0x01dbac2f, 0x0281c9bf, 0x01da516c, 0x01b20ea9, 0x0189850c, 0x00d0470e, 0x0262a8fa, 0x0014ea69}}, Y: Field{[10]uint32{0x03945e25, 0x03fd6780, 0x0036e140, 0x0316e00c, 0x022adcfd, 0x01134797, 0x013279e8, 0x030c6fcc, 0x02506179, 0x00177ab0}}}, + {X: Field{[10]uint32{0x02b2cdf7, 0x0143673f, 0x036f20a4, 0x02ca1da0, 0x01b7ee99, 0x0306eeaa, 0x0269af63, 0x00361bff, 0x02b63dbb, 0x0021ae51}}, Y: Field{[10]uint32{0x0374b1fa, 0x012d6603, 0x03a62ed7, 0x03006665, 0x037cbc39, 0x00793c4c, 0x018ea1ba, 0x038a9b2c, 0x0383d3d0, 0x0011101d}}}, + {X: Field{[10]uint32{0x03752d8e, 0x0054b9bb, 0x019babef, 0x03fee9c7, 0x036b28c8, 0x0034908f, 0x01567262, 0x012d1bda, 0x00f5cb88, 0x00033a07}}, Y: Field{[10]uint32{0x02a9248c, 0x02d50117, 0x009262d0, 0x03fca243, 0x02979177, 0x001306aa, 0x01bf924c, 0x019130d2, 0x01738120, 0x001d6bf6}}}, + {X: Field{[10]uint32{0x01172ed9, 0x033a4b78, 0x02b8fbc6, 0x010c4ce8, 0x037b791d, 0x01f55f51, 0x006cb9e4, 0x0134b67e, 0x02413a46, 0x0010441b}}, Y: Field{[10]uint32{0x036741c6, 0x031be87d, 0x03374d2e, 0x00a9cde6, 0x002ce4e4, 0x01ce83e2, 0x01601a27, 0x0082e001, 0x00c230e9, 0x0038b291}}}, + {X: Field{[10]uint32{0x00b49777, 0x0106d288, 0x001524e1, 0x0328814b, 0x03bca3f1, 0x01eb1bda, 0x006541ec, 0x00284b95, 0x02a04e83, 0x003a707c}}, Y: Field{[10]uint32{0x02a58124, 0x0247e6cc, 0x0030886b, 0x0087d754, 0x005ca737, 0x0059c4b2, 0x0173fcd5, 0x004b08a6, 0x004308dd, 0x001477ce}}}, + {X: Field{[10]uint32{0x033bbf2c, 0x0173c579, 0x01511fce, 0x009d0943, 0x039be21f, 0x00554b8e, 0x0225775f, 0x03fcf92e, 0x012dc5e8, 0x0022ee78}}, Y: Field{[10]uint32{0x000d1152, 0x03c46a34, 0x0162f91e, 0x022af08e, 0x02b4d096, 0x03067137, 0x024fcf50, 0x00dcc070, 0x037a273c, 0x0022a08a}}}, + {X: Field{[10]uint32{0x00b6bd0f, 0x0165e9eb, 0x011399ad, 0x00f80a5f, 0x01697f3f, 0x03d9b80c, 0x0294c3ee, 0x01de4791, 0x02f1da22, 0x002c0163}}, Y: Field{[10]uint32{0x02205a2a, 0x016cbc2f, 0x02978c80, 0x0111f4ae, 0x01e5deb6, 0x03ffa009, 0x000bee68, 0x00e05363, 0x034a0579, 0x001fd6ea}}}, + {X: Field{[10]uint32{0x002522a5, 0x014da32b, 0x025c8db9, 0x015d2e1c, 0x006dfc35, 0x0137f2ac, 0x0202b780, 0x03f7594b, 0x002d8df5, 0x00077b75}}, Y: Field{[10]uint32{0x02bca540, 0x019567ad, 0x0254f5b4, 0x037bcd5d, 0x0024b918, 0x020ed86e, 0x03f4a8f9, 0x00349463, 0x00492373, 0x000c1569}}}, + {X: Field{[10]uint32{0x000ea544, 0x03cbbd0e, 0x01f7da46, 0x00f67571, 0x03e47181, 0x00af0e76, 0x005b0b51, 0x012ea4fd, 0x0248c679, 0x001d8694}}, Y: Field{[10]uint32{0x032c1292, 0x03442c20, 0x01fc5c60, 0x00217eb4, 0x029f7034, 0x016ea3b5, 0x018d0a39, 0x033ab178, 0x0130c4f5, 0x0006177b}}}, + {X: Field{[10]uint32{0x03aa5caf, 0x02ae2638, 0x00f2ffef, 0x021d4069, 0x03a17496, 0x004f06d6, 0x0020982a, 0x03433237, 0x0360e515, 0x0003c756}}, Y: Field{[10]uint32{0x00a0d91d, 0x03b673de, 0x00708e42, 0x02dd5265, 0x03ee6f9a, 0x03ad8fc1, 0x033a9e48, 0x03630805, 0x026c395f, 0x00157f5d}}}, + {X: Field{[10]uint32{0x0337425f, 0x0264ff6e, 0x002d7fba, 0x012f0c09, 0x02fb09ff, 0x00711156, 0x02ba0bf6, 0x0002a95d, 0x004c9b79, 0x0015a72d}}, Y: Field{[10]uint32{0x00c350b1, 0x01009c83, 0x026d0d33, 0x03a03895, 0x01c1131d, 0x031f768f, 0x038f646a, 0x038f5079, 0x00d2ff1a, 0x0037f7ae}}}, + {X: Field{[10]uint32{0x021851eb, 0x031e1f2e, 0x00776d22, 0x0045f734, 0x039c2dda, 0x0363e142, 0x0147a787, 0x00e7a146, 0x029ad998, 0x000f966d}}, Y: Field{[10]uint32{0x012e20b3, 0x03620d16, 0x036d434c, 0x017acb27, 0x03705074, 0x01fb13c9, 0x01d93583, 0x02c0c1af, 0x02a48bfe, 0x001ccb34}}}, + {X: Field{[10]uint32{0x01296967, 0x03a93125, 0x0087b0e6, 0x015ccb0c, 0x0181acec, 0x03f0221b, 0x02502403, 0x015a0a60, 0x022107b4, 0x00291b59}}, Y: Field{[10]uint32{0x01763d33, 0x006b3bee, 0x03464005, 0x02139849, 0x01461478, 0x026a0823, 0x0097a73f, 0x02c18890, 0x00f429a5, 0x00050333}}}, + {X: Field{[10]uint32{0x0079ab1c, 0x005b1194, 0x0392774d, 0x03fb6bad, 0x004ad70e, 0x0055d727, 0x000c427d, 0x014ee9f0, 0x019cf25c, 0x002e4839}}, Y: Field{[10]uint32{0x0045b67f, 0x0065f07c, 0x005c9d43, 0x017cdfd6, 0x039201ec, 0x0195ae4d, 0x01435a61, 0x02223475, 0x00f1d4ba, 0x00181858}}}, + {X: Field{[10]uint32{0x00bfa8c5, 0x0381adfe, 0x00713896, 0x03663417, 0x023b88b6, 0x02c9c36d, 0x03da1efd, 0x00dee7ab, 0x02e1e7d8, 0x0004b3c6}}, Y: Field{[10]uint32{0x01c99c0f, 0x03329a4e, 0x035d91e8, 0x01b52141, 0x03c4c1d6, 0x0273f62c, 0x0323d7be, 0x024d2c27, 0x0213181b, 0x00383599}}}, + {X: Field{[10]uint32{0x01c0ec1f, 0x03ce74e3, 0x0230287f, 0x0002f84e, 0x02eb93a9, 0x00ca0553, 0x00620e5a, 0x02b28b98, 0x03ae0a4e, 0x001aab49}}, Y: Field{[10]uint32{0x00a1f46a, 0x0189aee5, 0x008112fe, 0x01d0d0b0, 0x02d46814, 0x0315ff5e, 0x03e8cd2d, 0x0054e789, 0x01c5caa2, 0x0024c855}}}, + {X: Field{[10]uint32{0x00f870a0, 0x00d0fb2b, 0x01c36ce9, 0x03e487dd, 0x008d168b, 0x0301b06e, 0x03489166, 0x019afa0a, 0x014e7cb1, 0x0004d336}}, Y: Field{[10]uint32{0x01453236, 0x02230ec2, 0x014c0fab, 0x039f9cf4, 0x012f7c8f, 0x03c268e6, 0x02a51cff, 0x03f517a0, 0x03c5e956, 0x0010a99c}}}, + {X: Field{[10]uint32{0x023989ee, 0x027d6d56, 0x00e2c56d, 0x0063729a, 0x02429b1d, 0x0072173b, 0x002971fa, 0x031e1a31, 0x018c7b7c, 0x00357735}}, Y: Field{[10]uint32{0x01208100, 0x01989388, 0x035c5e31, 0x002bc2ed, 0x0345bedd, 0x028ce2f1, 0x01a05297, 0x032b93b3, 0x0130ef1b, 0x00383290}}}, + {X: Field{[10]uint32{0x020d8c8e, 0x02b27403, 0x02861f66, 0x02f454e2, 0x033e3567, 0x01a47cce, 0x01fa4cdb, 0x02422e41, 0x0134c344, 0x00254759}}, Y: Field{[10]uint32{0x017046f1, 0x017cc1bb, 0x039f9d57, 0x024669f5, 0x0295a5f6, 0x0114957d, 0x001a9903, 0x01e4a19a, 0x0122eb84, 0x003bbcd6}}}, + {X: Field{[10]uint32{0x01cdd0fc, 0x019973f0, 0x01e27b33, 0x02ea59bb, 0x02690af0, 0x02d48455, 0x0184c9c9, 0x025935db, 0x004b25f7, 0x0033b6e9}}, Y: Field{[10]uint32{0x03c79e7e, 0x006de6a1, 0x037d94c2, 0x009246a3, 0x02187e71, 0x024cc5ad, 0x007b6b64, 0x026bc746, 0x0049cb8e, 0x00201aa4}}}, + {X: Field{[10]uint32{0x00a10b54, 0x01bd2ab6, 0x02a2049c, 0x03445124, 0x01d1c7d2, 0x00afb285, 0x02bd39d3, 0x01afb8a6, 0x0260d130, 0x0013fc0d}}, Y: Field{[10]uint32{0x02d1e574, 0x0389dcc1, 0x01893d99, 0x01774bfc, 0x014990f2, 0x039c7da2, 0x02e8bc8b, 0x0265478d, 0x02698fd8, 0x0030b1d7}}}, + {X: Field{[10]uint32{0x022e0ca7, 0x0010b3b3, 0x01824389, 0x0289a0ee, 0x00c78061, 0x037edc80, 0x03b77020, 0x019197a1, 0x01088dbd, 0x003022f5}}, Y: Field{[10]uint32{0x008d7307, 0x024c957e, 0x03e78417, 0x02d82318, 0x011db329, 0x00ea7c5c, 0x02408842, 0x0125eac5, 0x01d61343, 0x00158806}}}, + {X: Field{[10]uint32{0x03f9857d, 0x03f576d2, 0x01e3a07a, 0x02a09d28, 0x00955bdd, 0x022eb0c6, 0x005cdd22, 0x033ac8ee, 0x00aa6fd2, 0x001237f7}}, Y: Field{[10]uint32{0x020287ce, 0x017fe8ba, 0x011710d5, 0x02d450c7, 0x00af60f4, 0x0390a555, 0x014e76fc, 0x019ee945, 0x022e8961, 0x000a9198}}}, + {X: Field{[10]uint32{0x02a1f236, 0x02b3fcc5, 0x03ceebbf, 0x01e68ce8, 0x02802c14, 0x01c094e0, 0x0376b471, 0x03e20f2f, 0x0100d81a, 0x00101082}}, Y: Field{[10]uint32{0x0385e3f7, 0x01a346de, 0x01b4be41, 0x01bbc678, 0x007831e9, 0x02d50957, 0x00f50fa2, 0x02d4ecc2, 0x00e0dbbc, 0x00219811}}}, + {X: Field{[10]uint32{0x022bdc42, 0x00bcdf8c, 0x0156f8b1, 0x01080ec4, 0x02ec1e31, 0x03a64823, 0x02c20184, 0x019f1dc3, 0x007b23b6, 0x0025a8dd}}, Y: Field{[10]uint32{0x00f22ab2, 0x01f3618f, 0x03af798c, 0x03d29281, 0x03dc7545, 0x034c975b, 0x010b04ba, 0x01191ccc, 0x03c8df8c, 0x0019ec2c}}}, + {X: Field{[10]uint32{0x00460182, 0x0244caf2, 0x02784503, 0x0246a345, 0x03f1db3e, 0x00545212, 0x0361f0cb, 0x01e5a490, 0x017de403, 0x0033c1c0}}, Y: Field{[10]uint32{0x0397939d, 0x006ece4d, 0x0106799b, 0x0327996b, 0x00e2eb60, 0x01a5018e, 0x036e762f, 0x0278c343, 0x010762f2, 0x002de86c}}}, + {X: Field{[10]uint32{0x018beb15, 0x0173d688, 0x036dc080, 0x028f75c9, 0x0393507a, 0x01d7f756, 0x01b90ded, 0x02dbdeb4, 0x00b25b0b, 0x0004ad6e}}, Y: Field{[10]uint32{0x038933da, 0x02d5bb6d, 0x009aee89, 0x01942cd8, 0x015a5bc1, 0x01032866, 0x02d6368d, 0x02866e03, 0x03678cef, 0x00174f51}}}, + {X: Field{[10]uint32{0x03a46765, 0x0270de84, 0x0327dcd9, 0x0266f66d, 0x0177ecd2, 0x0062dbc6, 0x018b9ace, 0x039b64e6, 0x009ce866, 0x0021e6d1}}, Y: Field{[10]uint32{0x03781c63, 0x004ea0d8, 0x02baec6c, 0x0057c0f9, 0x01f0c452, 0x006a3679, 0x0350c4e9, 0x03ec4ab3, 0x00eb758c, 0x002c3120}}}, + {X: Field{[10]uint32{0x00c7dead, 0x01ee4283, 0x0121dd2b, 0x00332cdb, 0x01e50228, 0x00ffbc92, 0x03a401dd, 0x02807747, 0x0383e9d3, 0x000bb121}}, Y: Field{[10]uint32{0x01a67fce, 0x03c31fa1, 0x00703ca2, 0x020419e6, 0x0283fd8f, 0x03ad1a68, 0x01e61505, 0x038b2869, 0x012478f9, 0x003ec0a4}}}, + {X: Field{[10]uint32{0x037c3ce7, 0x008824d0, 0x03a83aee, 0x03eef61c, 0x025b7878, 0x0051655a, 0x03e8fcd2, 0x036c1ce7, 0x025827be, 0x001e7328}}, Y: Field{[10]uint32{0x00ac467e, 0x02073aa7, 0x015a8d33, 0x02c8b064, 0x00bee990, 0x03add2cc, 0x00b7c483, 0x021d4053, 0x0293d82e, 0x003fd222}}}, + {X: Field{[10]uint32{0x02dbd207, 0x00f37556, 0x01cd93e9, 0x0203526a, 0x028e146a, 0x00185aa9, 0x02b9eed4, 0x022dea09, 0x00ca3d2b, 0x00311129}}, Y: Field{[10]uint32{0x012d0f18, 0x03f09cc2, 0x032319d1, 0x003ee3f0, 0x00ac00ad, 0x037b41a1, 0x01ae3381, 0x00130950, 0x00a963d5, 0x001344da}}}, + {X: Field{[10]uint32{0x03f3e7a8, 0x0154a6f3, 0x03c267ee, 0x02298124, 0x02dbed32, 0x020d7a35, 0x024e2050, 0x0112c961, 0x0050cc0e, 0x000fb91f}}, Y: Field{[10]uint32{0x00a5f095, 0x0072a7a4, 0x0391f84e, 0x00c00f46, 0x00b6229a, 0x0117890f, 0x02496401, 0x02a1ef0c, 0x0339056e, 0x003e9554}}}, + {X: Field{[10]uint32{0x0009980c, 0x004b5f72, 0x020a81c0, 0x0364b464, 0x038e69e2, 0x03e6c3d1, 0x02251a29, 0x02edfd08, 0x01873036, 0x003a58f2}}, Y: Field{[10]uint32{0x01c52fd6, 0x009e8f15, 0x025e6180, 0x035b1fe3, 0x02140f92, 0x0202c5cf, 0x002bfa48, 0x02fcbc49, 0x03b0779b, 0x0003fe56}}}, + {X: Field{[10]uint32{0x008fc07d, 0x00473195, 0x008bd3f7, 0x01439a1b, 0x0023738e, 0x011be8e5, 0x024b747a, 0x02e2e6bf, 0x035bb6a1, 0x002abd81}}, Y: Field{[10]uint32{0x02f2b0cb, 0x0354866a, 0x0098b1bb, 0x01baef7e, 0x0253ab32, 0x03ad047a, 0x005bd162, 0x0328707a, 0x02ec6d11, 0x001336c2}}}, + {X: Field{[10]uint32{0x0157ac0f, 0x031d6150, 0x012986e4, 0x0357aa48, 0x02842b44, 0x0175c22a, 0x0174a18d, 0x01d5b638, 0x0017d8e9, 0x001a4792}}, Y: Field{[10]uint32{0x00c0c222, 0x03d01da8, 0x008c2d1f, 0x037ca7d4, 0x034bb9a8, 0x00be4a1c, 0x010eb157, 0x01eb5e03, 0x020b3bfa, 0x0027abae}}}, + {X: Field{[10]uint32{0x0344996a, 0x03821ff9, 0x03fd81d9, 0x02cc72bc, 0x00c77dbf, 0x020f6b63, 0x01c9d4c5, 0x01292250, 0x01bb45af, 0x0030f9bf}}, Y: Field{[10]uint32{0x008366f2, 0x010af258, 0x00a730e6, 0x01d2d526, 0x010b8694, 0x02b13a5e, 0x0207bfd1, 0x00a6e3fb, 0x011e65ab, 0x0032a663}}}, + {X: Field{[10]uint32{0x0140701f, 0x03002cc2, 0x013868ce, 0x03e00ccf, 0x02923ead, 0x01f17265, 0x032630be, 0x00973c87, 0x0320a55d, 0x003b6f58}}, Y: Field{[10]uint32{0x01e4889e, 0x005090d3, 0x003e3f7a, 0x0143dacb, 0x025e3d3d, 0x038a3e52, 0x00cd12bf, 0x03d79322, 0x02e7afce, 0x00359464}}}, + {X: Field{[10]uint32{0x0295d336, 0x02d30d3a, 0x005dad7c, 0x03b67536, 0x02b29684, 0x00f0dd04, 0x02fd2494, 0x0382e2b0, 0x0183a80a, 0x0032567b}}, Y: Field{[10]uint32{0x032b168b, 0x0268b869, 0x03e5f8b5, 0x023804bd, 0x014de5f5, 0x00965c30, 0x00b0e970, 0x03c94ab6, 0x02bb8dcc, 0x00203076}}}, + {X: Field{[10]uint32{0x02ed9237, 0x00f7e0cf, 0x0231274e, 0x03b76992, 0x022c5bc6, 0x034b573e, 0x00c90224, 0x0013a762, 0x01744710, 0x001de331}}, Y: Field{[10]uint32{0x02916c17, 0x00b724e4, 0x0360946b, 0x03f94730, 0x01675720, 0x02e48767, 0x012e502d, 0x007009ee, 0x01316b2a, 0x003ba88f}}}, + {X: Field{[10]uint32{0x03b42055, 0x02bf2598, 0x02d9a5c2, 0x011b4fef, 0x00173e7e, 0x036634b0, 0x03299f81, 0x015abd0f, 0x00388c36, 0x00287e1d}}, Y: Field{[10]uint32{0x016f4afc, 0x0261e9f5, 0x0284eabb, 0x03fb71ca, 0x015d874a, 0x0264d9e1, 0x0150e79b, 0x035b16cc, 0x00430820, 0x00042f21}}}, + {X: Field{[10]uint32{0x00224a5d, 0x008247da, 0x036a3d00, 0x020dd503, 0x028f7fa5, 0x00f410fb, 0x01a1839c, 0x022e2b36, 0x030b2d5f, 0x00322b5f}}, Y: Field{[10]uint32{0x03aebf8b, 0x017c6471, 0x01ec38e6, 0x02d4455f, 0x022a1cd4, 0x0229ff92, 0x01507cf1, 0x016e68b4, 0x0180eebe, 0x000c062d}}}, + {X: Field{[10]uint32{0x0020055f, 0x020436d2, 0x02d20bea, 0x01028a9e, 0x031ecf38, 0x02b9d9fd, 0x024e4261, 0x03f5eedf, 0x02640b93, 0x00309754}}, Y: Field{[10]uint32{0x025ad684, 0x027a3891, 0x03524c34, 0x03b0e851, 0x02bf331a, 0x02d23b4c, 0x01fffbce, 0x00ac3e8a, 0x00c76e3f, 0x003e8572}}}, + {X: Field{[10]uint32{0x0178f92b, 0x018afd7a, 0x032f2ccc, 0x01de22d7, 0x03283168, 0x02cb61ce, 0x03224dcc, 0x02feb6eb, 0x02eb7e4c, 0x00342e5c}}, Y: Field{[10]uint32{0x03ab8e3b, 0x0390837d, 0x03f56e94, 0x00c61082, 0x0275610b, 0x008f9e1e, 0x03bcb4cf, 0x01614aab, 0x00a1606a, 0x003bd74f}}}, + {X: Field{[10]uint32{0x030a2d07, 0x02010ac6, 0x014ab56c, 0x0146ef0a, 0x02d393e8, 0x02604cad, 0x008791ab, 0x0111e591, 0x00835856, 0x003e2d13}}, Y: Field{[10]uint32{0x0070a27c, 0x007b7fba, 0x00ed0b8e, 0x000756ec, 0x022dbe0c, 0x03239d93, 0x0051362f, 0x0102fba6, 0x02bf0420, 0x0030a090}}}, + {X: Field{[10]uint32{0x025666b7, 0x02df20f6, 0x02d368ac, 0x00641469, 0x005d9424, 0x00bf448d, 0x0010adc1, 0x02ab78e5, 0x01016f72, 0x0039f2e2}}, Y: Field{[10]uint32{0x02b21697, 0x01070d75, 0x00f63953, 0x02032c3e, 0x03f0c87e, 0x00e8595b, 0x014ee6c5, 0x03675fbf, 0x012246b6, 0x00378d9d}}}, + {X: Field{[10]uint32{0x0279d87f, 0x031d0930, 0x02167fb2, 0x03925733, 0x01f40f93, 0x01317abd, 0x02894786, 0x03d2aa4b, 0x028f14e3, 0x00022c84}}, Y: Field{[10]uint32{0x00f5d246, 0x02c39243, 0x00c11cbe, 0x0356e0c1, 0x02699926, 0x020c0c0f, 0x0012068a, 0x02d2c406, 0x004af469, 0x0039fb4e}}}, + {X: Field{[10]uint32{0x013b4afb, 0x01023d42, 0x00317658, 0x0075e17a, 0x001f3f63, 0x02d6cc7d, 0x036a5f3a, 0x035618e2, 0x01db3cbc, 0x003cd36d}}, Y: Field{[10]uint32{0x003dd3d9, 0x00c3f543, 0x02f2d56e, 0x018d3263, 0x005bf112, 0x03ff06b1, 0x031a1c74, 0x02119be8, 0x0372bb2c, 0x0037f39c}}}, + {X: Field{[10]uint32{0x00aabdb8, 0x017570bb, 0x01c86a96, 0x03937494, 0x0110b4fe, 0x03294cee, 0x00a48eab, 0x035a176b, 0x0209a445, 0x0030da27}}, Y: Field{[10]uint32{0x0279e3f4, 0x007c8bc5, 0x017a155c, 0x01f8e964, 0x03d62e18, 0x0101d747, 0x03efbe4f, 0x00feef0c, 0x005a6a26, 0x001e0134}}}, + {X: Field{[10]uint32{0x03005cbc, 0x022832cf, 0x00a78d70, 0x0128ad1f, 0x03f1e47d, 0x0025624b, 0x0266d626, 0x0284341e, 0x01ecf776, 0x001ffe65}}, Y: Field{[10]uint32{0x026ea90d, 0x0317ab32, 0x019f5cd5, 0x0343a4a6, 0x000e3911, 0x01b420a2, 0x00a4d115, 0x0390c337, 0x03745f17, 0x003b7371}}}, + {X: Field{[10]uint32{0x027d4d27, 0x0094fb10, 0x028e41c0, 0x035873f2, 0x010db78b, 0x0108faed, 0x03183512, 0x012fe5a6, 0x02626223, 0x000d98a8}}, Y: Field{[10]uint32{0x002e1b09, 0x032aeb07, 0x0199fc41, 0x026de6d2, 0x03d550ef, 0x032b28da, 0x000f671c, 0x039a703d, 0x00420f07, 0x00222988}}}, + {X: Field{[10]uint32{0x0354e8d1, 0x00ed050f, 0x03951176, 0x03a45852, 0x00b6b4eb, 0x01281ce2, 0x00e66ee2, 0x0310ba5c, 0x002e06d9, 0x000b049f}}, Y: Field{[10]uint32{0x03dd6629, 0x01672743, 0x0193aaae, 0x008d808b, 0x00856be0, 0x012b6b8c, 0x0226c8ff, 0x02b7eabe, 0x02b8dacb, 0x00291dcf}}}, + {X: Field{[10]uint32{0x02c17802, 0x03594552, 0x02cb37f6, 0x002e33e6, 0x02b7dfcb, 0x03f8c2df, 0x014863a9, 0x00587ff6, 0x03a6116f, 0x0031083f}}, Y: Field{[10]uint32{0x010a028c, 0x02c50ef9, 0x03bc0079, 0x025cbba3, 0x017fd76d, 0x017b6a30, 0x019e9cf9, 0x023db212, 0x029c25c6, 0x0039b311}}}, + {X: Field{[10]uint32{0x02e3de0d, 0x01de11fa, 0x0169b50c, 0x029f9ff2, 0x0034d386, 0x00c85d1a, 0x002f06fd, 0x010f7563, 0x03432203, 0x001de259}}, Y: Field{[10]uint32{0x01fd9369, 0x01529348, 0x021f8570, 0x016589e4, 0x00cd9067, 0x00a7a4aa, 0x00bcd7d6, 0x037365c4, 0x019e4408, 0x0010d435}}}, + {X: Field{[10]uint32{0x009f5827, 0x009c4e4d, 0x03c83dc1, 0x023c644c, 0x03714768, 0x00dbfc3d, 0x0334f9b6, 0x0372d00c, 0x002c1a14, 0x0033dfa9}}, Y: Field{[10]uint32{0x019e6d9d, 0x02547776, 0x00a29f8e, 0x02259918, 0x020ad1a6, 0x025792a9, 0x01c28468, 0x03e7744e, 0x0080166b, 0x002e700b}}}, + {X: Field{[10]uint32{0x0273a91f, 0x0057e969, 0x036309d8, 0x0211fdd4, 0x02417b1c, 0x00f27e5b, 0x028ab1b3, 0x02af76b6, 0x0039ab1f, 0x00345e4d}}, Y: Field{[10]uint32{0x02d3b3e0, 0x003473f3, 0x0105f9bc, 0x03496903, 0x03b429ad, 0x02699f43, 0x019f6f7f, 0x0106c8ec, 0x02593b59, 0x002b04f5}}}, + {X: Field{[10]uint32{0x0292b420, 0x0193c0a7, 0x0026be98, 0x01dd29d0, 0x02547225, 0x004cf727, 0x02f58630, 0x0379c314, 0x00d6727d, 0x002ec55a}}, Y: Field{[10]uint32{0x02af3992, 0x01c32548, 0x02fe70b1, 0x00af856a, 0x009e137d, 0x03bb8a70, 0x02adf80c, 0x01d31b31, 0x0356268d, 0x002d5951}}}, + {X: Field{[10]uint32{0x03877dcc, 0x037a9eb6, 0x0020535c, 0x00b5de37, 0x03ce07c4, 0x00c6ea4f, 0x00681772, 0x02968e9d, 0x02d783e8, 0x001cca44}}, Y: Field{[10]uint32{0x03df80a2, 0x01e3239d, 0x01bab06f, 0x034ffb4f, 0x011664f5, 0x0271ea51, 0x00ffd7c2, 0x02348f9a, 0x03881b12, 0x0034d2e0}}}, + {X: Field{[10]uint32{0x0297074c, 0x011a231c, 0x00afa908, 0x03748941, 0x034927b6, 0x01a134ed, 0x03e18651, 0x00cba0b0, 0x0371fb85, 0x0031d3c3}}, Y: Field{[10]uint32{0x01006ac1, 0x027c69ef, 0x0006a53a, 0x0350440a, 0x0235984b, 0x0341031b, 0x03e5a92d, 0x005e3a2f, 0x0261c0bd, 0x0027697a}}}, + {X: Field{[10]uint32{0x023283b0, 0x032f1a27, 0x00aac91f, 0x004cf25c, 0x031785a6, 0x00c18366, 0x00e9e494, 0x01683169, 0x01398bda, 0x002f53ea}}, Y: Field{[10]uint32{0x030e433a, 0x02973680, 0x0295c5d2, 0x02efc537, 0x02e79cfd, 0x032eb035, 0x01be1cac, 0x012d2516, 0x03edb661, 0x0018c753}}}, + {X: Field{[10]uint32{0x0341cc8f, 0x01971928, 0x03a72f24, 0x01e5ee26, 0x03e9bc2d, 0x0172daf4, 0x003e0c81, 0x004f4c92, 0x0062733f, 0x0027e995}}, Y: Field{[10]uint32{0x0212db04, 0x0280b89a, 0x0313010f, 0x03f0bc53, 0x01443505, 0x01289c54, 0x00ada32c, 0x02c635d2, 0x005bafc5, 0x001c147f}}}, + {X: Field{[10]uint32{0x035e31aa, 0x0101d130, 0x03d4a6cd, 0x03f8b07a, 0x03715168, 0x036f94ef, 0x02434a9d, 0x02fc7a05, 0x037dab3d, 0x003aba9b}}, Y: Field{[10]uint32{0x0384d61d, 0x0069eae5, 0x01e6a76a, 0x02c07dc2, 0x01a594b9, 0x03d2ea41, 0x0080619f, 0x00ae5b08, 0x02c24f20, 0x002e5a58}}}, + {X: Field{[10]uint32{0x0317a2fc, 0x01eff14e, 0x007516b9, 0x022925fe, 0x039a117c, 0x02e38954, 0x03e6d5b7, 0x01d413cc, 0x02b63b94, 0x002cf7de}}, Y: Field{[10]uint32{0x01758b9b, 0x006ef127, 0x025b5ec5, 0x03aa454a, 0x01f11f00, 0x0069d677, 0x03a62650, 0x039b3b5b, 0x0100a35a, 0x001cb7dd}}}, + {X: Field{[10]uint32{0x03281bbf, 0x0346b1b0, 0x017fa3a8, 0x0025c990, 0x034341df, 0x01438a53, 0x0219be99, 0x0122b915, 0x02cc46da, 0x003be1d7}}, Y: Field{[10]uint32{0x031c72f5, 0x010aecdf, 0x01bc28a6, 0x030ae7a3, 0x0351ced2, 0x00c1b261, 0x010eb6e8, 0x0016db5b, 0x0204af4c, 0x001eae78}}}, + {X: Field{[10]uint32{0x00024fdc, 0x01bcdb1c, 0x014e7fc2, 0x015d32fc, 0x033d7487, 0x03f29422, 0x002f234a, 0x0228e942, 0x0046576a, 0x001d30f1}}, Y: Field{[10]uint32{0x00136506, 0x03fa3877, 0x02ae88c4, 0x02725293, 0x03b6ccac, 0x027628c1, 0x01d2afbf, 0x01bea1cb, 0x01164ddb, 0x001cf55e}}}, + {X: Field{[10]uint32{0x00f39274, 0x00e11b43, 0x00e1acf3, 0x02096999, 0x00c06b71, 0x00ee8bc6, 0x00204933, 0x00b8f9b0, 0x032c409f, 0x00256712}}, Y: Field{[10]uint32{0x009aad47, 0x010bda0b, 0x015d945f, 0x027c68e6, 0x01d31991, 0x03716fb7, 0x03cd3980, 0x018a7edc, 0x035c7401, 0x0005f2ac}}}, + {X: Field{[10]uint32{0x009175fb, 0x01e6a6db, 0x00d69a94, 0x02f24bed, 0x03f67c24, 0x01ff7ead, 0x013b53c6, 0x014c4c65, 0x01d69419, 0x001013c3}}, Y: Field{[10]uint32{0x024d87b3, 0x0245ef7c, 0x01570147, 0x01e61bbf, 0x037e7d3e, 0x0350ac0d, 0x01560851, 0x01234eac, 0x01e7f40a, 0x00215f1d}}}, + {X: Field{[10]uint32{0x00e82075, 0x031248db, 0x03566807, 0x03bc05c2, 0x032db4ec, 0x0021504d, 0x01f4d5ab, 0x003d694f, 0x0111233b, 0x000f8101}}, Y: Field{[10]uint32{0x000df3d3, 0x000e09d8, 0x00e02b96, 0x03806de4, 0x021fda08, 0x019d4ec8, 0x0235ebf5, 0x00e10dde, 0x0271dd44, 0x003e4cdc}}}, + {X: Field{[10]uint32{0x00d77e6e, 0x01337c8b, 0x03bd3e04, 0x00ae5211, 0x00ecc869, 0x01ef6b01, 0x03993e74, 0x0370f87d, 0x005310df, 0x00250baa}}, Y: Field{[10]uint32{0x02a155e5, 0x039892e7, 0x00e51e02, 0x03e950a3, 0x01f33e9a, 0x023106c7, 0x0110bbe5, 0x02dba6d1, 0x03c8e688, 0x002efcbd}}}, + {X: Field{[10]uint32{0x0103b532, 0x01b3a873, 0x02c0a3fe, 0x0247842c, 0x01dce217, 0x03406028, 0x01938097, 0x0297ee15, 0x02749883, 0x000795de}}, Y: Field{[10]uint32{0x0041c003, 0x005fb0eb, 0x01790194, 0x004b5773, 0x007b5756, 0x009e3a1e, 0x02530007, 0x0178576e, 0x022f856f, 0x002851d9}}}, + {X: Field{[10]uint32{0x03feaa5a, 0x01cb13db, 0x014c8ae4, 0x03f9f156, 0x037a05fb, 0x001ff928, 0x02e9dfa6, 0x01ed9084, 0x015a8a23, 0x003af276}}, Y: Field{[10]uint32{0x03f1162a, 0x011e55f9, 0x03c05b17, 0x0361ad2b, 0x038fec2f, 0x03e2d234, 0x015fb458, 0x0291f33c, 0x01c0e311, 0x000e501b}}}, + {X: Field{[10]uint32{0x03cac063, 0x00febc18, 0x00475277, 0x00dc7ecb, 0x01b90816, 0x02125862, 0x023d2280, 0x03f08084, 0x03601afd, 0x0031e3ab}}, Y: Field{[10]uint32{0x02b42de7, 0x020ecfcf, 0x029c76df, 0x033db07f, 0x01bacb42, 0x01b4e5be, 0x02e84c51, 0x00b7177d, 0x01b1e0c2, 0x000254c9}}}, + {X: Field{[10]uint32{0x036d34a0, 0x01a173f7, 0x01db8752, 0x01a80d5c, 0x004f2e53, 0x005f09e6, 0x00a3d0e1, 0x00134ad1, 0x0319a1d5, 0x002d6461}}, Y: Field{[10]uint32{0x00184abe, 0x013a6986, 0x02a356d5, 0x02c9798b, 0x0016beac, 0x03226414, 0x029828aa, 0x02df23e8, 0x00cb585c, 0x0026c07a}}}, + {X: Field{[10]uint32{0x020042cd, 0x0325e3a3, 0x01584bda, 0x0115297a, 0x02454f10, 0x031bdd6d, 0x0107dfdc, 0x0327464a, 0x033eb59f, 0x0021c1a9}}, Y: Field{[10]uint32{0x03dc3a49, 0x024a1b56, 0x001ce710, 0x037478d3, 0x004265e2, 0x02daa1fa, 0x028405a2, 0x01e35bd4, 0x03566f1f, 0x0022c6d7}}}, + {X: Field{[10]uint32{0x0312d6ca, 0x0154a741, 0x0230ae64, 0x0108e888, 0x00793e56, 0x01b8ab41, 0x00a92890, 0x012fedbd, 0x016e4ddb, 0x0024fa49}}, Y: Field{[10]uint32{0x02afdcea, 0x01aa3b5b, 0x01cd6975, 0x011e429d, 0x03d874f2, 0x0038e626, 0x000ea62f, 0x037fb0d9, 0x02dbd9b3, 0x0020ec90}}}, + {X: Field{[10]uint32{0x022ac295, 0x031bfe7a, 0x0127fe9a, 0x02fd62ad, 0x03a24fff, 0x00755806, 0x0353956a, 0x03ce6f2c, 0x01af8702, 0x000b6b52}}, Y: Field{[10]uint32{0x03e4675b, 0x00e98949, 0x002fe277, 0x00450370, 0x00ed4036, 0x032b3a30, 0x000704e2, 0x001d8957, 0x00b8e604, 0x002d6bda}}}, + {X: Field{[10]uint32{0x036950a0, 0x00431513, 0x014f7597, 0x0193d0ec, 0x0086a2c3, 0x03af8ccb, 0x01627195, 0x00be9152, 0x00994da4, 0x0017ff06}}, Y: Field{[10]uint32{0x02c9bb88, 0x00c6b570, 0x0363f043, 0x00be6ea7, 0x014542ad, 0x036c14f3, 0x00e61419, 0x017ea888, 0x00a87981, 0x0008bab0}}}, + {X: Field{[10]uint32{0x001c51ba, 0x02982ff5, 0x02b6e69f, 0x02739b98, 0x00324c63, 0x00aed6b4, 0x0221bb8a, 0x029e6713, 0x01bb1832, 0x001c6f82}}, Y: Field{[10]uint32{0x00dda472, 0x03c8e355, 0x01656e4f, 0x03730578, 0x01950588, 0x0153ac92, 0x0040767b, 0x016e3ca3, 0x03c5719a, 0x0031489f}}}, + {X: Field{[10]uint32{0x02587212, 0x0303b59a, 0x002770ba, 0x0359115a, 0x0056d661, 0x037caeb1, 0x00a3cb37, 0x0267c299, 0x0305f927, 0x00013e50}}, Y: Field{[10]uint32{0x03c054ab, 0x007f04c4, 0x03344051, 0x01b5b403, 0x026baf79, 0x0363475f, 0x00ddc7ca, 0x020f5ae5, 0x011fbd86, 0x0013121a}}}, + {X: Field{[10]uint32{0x00f0ab81, 0x021ace98, 0x033bc54b, 0x02338b1a, 0x02b3aeb3, 0x017d8614, 0x024fc096, 0x0248fb98, 0x028b6fc2, 0x00157be1}}, Y: Field{[10]uint32{0x0222efab, 0x039b9e45, 0x01a0e72c, 0x037c8b70, 0x0376cff6, 0x0198147e, 0x014d0adc, 0x02d3314d, 0x02eaab16, 0x003b0662}}}, + {X: Field{[10]uint32{0x00fdab68, 0x0330d55d, 0x022790cb, 0x02f08d90, 0x00a357f6, 0x01028e56, 0x020953ed, 0x0276fc39, 0x019046e1, 0x0009ab55}}, Y: Field{[10]uint32{0x02795508, 0x03ecfc3e, 0x025e2184, 0x039d36f0, 0x00e5bb77, 0x002f1a25, 0x03c6a746, 0x00870154, 0x01ef9067, 0x002bdbf1}}}, + {X: Field{[10]uint32{0x0037312a, 0x03307c3b, 0x0150384f, 0x01a63ba3, 0x02bc051a, 0x00e406fc, 0x000b0ae4, 0x01c554e7, 0x003ab1b0, 0x001ce7ed}}, Y: Field{[10]uint32{0x006b7e28, 0x00f9d8db, 0x019e7a19, 0x02e1302d, 0x01ff90d6, 0x0379aad3, 0x00abe331, 0x008898b5, 0x03043c88, 0x0030488d}}}, + {X: Field{[10]uint32{0x0216771d, 0x026eb519, 0x02c6cc29, 0x0196a74c, 0x03d5a109, 0x00ba4497, 0x03422f82, 0x03d76a9e, 0x009d508c, 0x00085119}}, Y: Field{[10]uint32{0x001ca76e, 0x03348a74, 0x03a1a74a, 0x032b6776, 0x0376ddea, 0x01419f3a, 0x03ef96b3, 0x031117c0, 0x038c0e33, 0x000454c5}}}, + {X: Field{[10]uint32{0x03b97072, 0x036438ee, 0x03580ec8, 0x038d55b4, 0x014d5577, 0x014209e3, 0x02a85175, 0x023a3c5b, 0x023c16ee, 0x0018b311}}, Y: Field{[10]uint32{0x026a891e, 0x0218ffa2, 0x033fcb81, 0x03e8be6a, 0x0356b48e, 0x0244ce56, 0x02a6c91c, 0x03140211, 0x0043e299, 0x00334a52}}}, + {X: Field{[10]uint32{0x03ef9c21, 0x03ab0cd4, 0x031c9707, 0x0376e77f, 0x004317e1, 0x0103dd33, 0x00fdb006, 0x03c64345, 0x030133ed, 0x00004658}}, Y: Field{[10]uint32{0x0020494c, 0x00db4855, 0x020c8031, 0x0065841a, 0x00caa4f5, 0x03681c0d, 0x03851876, 0x03b9b5d0, 0x00e5e3a3, 0x003c5aad}}}, + {X: Field{[10]uint32{0x0289adcd, 0x0298c648, 0x03c162b4, 0x00d0099c, 0x03777d4e, 0x025554a1, 0x0315baed, 0x03e4fca3, 0x03863fda, 0x002c942f}}, Y: Field{[10]uint32{0x01b3d2c1, 0x0356b04e, 0x016f828a, 0x03bce7eb, 0x01da1e06, 0x02d0357e, 0x013543f6, 0x00f4a21f, 0x01bede34, 0x000a5701}}}, + {X: Field{[10]uint32{0x003e7c6c, 0x03d1bd92, 0x03e696f4, 0x002053a1, 0x01027ef0, 0x00b0666c, 0x010945a7, 0x011ce67c, 0x03bcae58, 0x0024e902}}, Y: Field{[10]uint32{0x02858a09, 0x03a32f2a, 0x0217389f, 0x03802bd9, 0x03f088e2, 0x0249a192, 0x03289a45, 0x0259d3d7, 0x00c02980, 0x00207b5c}}}, + {X: Field{[10]uint32{0x020978cc, 0x0230303d, 0x01f90eff, 0x03753eaa, 0x0019ff7d, 0x03a60978, 0x03e76b34, 0x0275d6c5, 0x021b4e90, 0x002e799d}}, Y: Field{[10]uint32{0x035aa117, 0x01e4241e, 0x0211b762, 0x00ef2634, 0x0165c75e, 0x03cb215d, 0x001b70fb, 0x0049c222, 0x01035fb9, 0x00190305}}}, + {X: Field{[10]uint32{0x00cfec24, 0x010d8344, 0x039beebf, 0x0146c08a, 0x00ae4547, 0x016cb702, 0x03e260cf, 0x026e91a1, 0x0012fe3d, 0x0013708a}}, Y: Field{[10]uint32{0x039a90d1, 0x00b7d7df, 0x01c4305b, 0x00b90c0c, 0x0227f082, 0x0135a015, 0x02e986da, 0x0204d554, 0x034a5685, 0x00270d7b}}}, + {X: Field{[10]uint32{0x009deadf, 0x020a1b13, 0x03540934, 0x00948d98, 0x03e198e2, 0x020f4b4e, 0x02b94ba6, 0x03e70901, 0x02b31127, 0x0010c49d}}, Y: Field{[10]uint32{0x001efb3e, 0x00e312b8, 0x03743139, 0x03237756, 0x02c26d39, 0x037232fb, 0x006280dd, 0x037e192d, 0x0184c7f1, 0x0008997b}}}, + {X: Field{[10]uint32{0x0283632a, 0x0042b2cd, 0x00360aa8, 0x00dae1e2, 0x03328f17, 0x033eaa45, 0x00b81d76, 0x0163d0ad, 0x02c3c990, 0x001d716d}}, Y: Field{[10]uint32{0x028f719d, 0x036d7142, 0x00464aff, 0x006ea03c, 0x014a5aaa, 0x026a243c, 0x02309ef4, 0x01edfdc2, 0x009fdef1, 0x001527c0}}}, + {X: Field{[10]uint32{0x02a827d7, 0x03be6773, 0x0357c815, 0x03a44ba9, 0x0326d4d4, 0x02920077, 0x02b1a377, 0x03dd0a5d, 0x0027205a, 0x000f2400}}, Y: Field{[10]uint32{0x00649cc0, 0x015e2c42, 0x0184c83c, 0x01183f9c, 0x02007a24, 0x00ce76ac, 0x007fa7c0, 0x029f788e, 0x03f337ec, 0x00038a33}}}, + {X: Field{[10]uint32{0x0310d9ff, 0x01ebaacc, 0x0297f3a8, 0x02f4ea3a, 0x00c89637, 0x01708fcc, 0x03a8ab0d, 0x02e57c27, 0x031a3676, 0x0015983c}}, Y: Field{[10]uint32{0x011c568b, 0x035e1b2c, 0x03839efb, 0x01b0ae8f, 0x03955bb7, 0x01366bfc, 0x0092ff3e, 0x032829f6, 0x00d66bc4, 0x003581a7}}}, + {X: Field{[10]uint32{0x033babe9, 0x01e1bfd7, 0x02f618cd, 0x0351e6bd, 0x00e6733c, 0x02dc75de, 0x03979ce5, 0x037219fd, 0x00a41b45, 0x000ae2da}}, Y: Field{[10]uint32{0x01e4097a, 0x0314b163, 0x021ab40a, 0x0311b050, 0x03840f89, 0x02b66824, 0x00923f63, 0x006ccf08, 0x0244d544, 0x001f20c4}}}, + {X: Field{[10]uint32{0x01c18610, 0x00a73aa2, 0x01290442, 0x012cc0fa, 0x001d369d, 0x01acff28, 0x03578869, 0x02f3712c, 0x004db817, 0x00218d40}}, Y: Field{[10]uint32{0x02b909e2, 0x03b0ca5b, 0x0300c4c3, 0x00487f12, 0x007e9f35, 0x00563687, 0x0384cc05, 0x01b9af8b, 0x02402bd4, 0x00091cb6}}}, + {X: Field{[10]uint32{0x00cb28d0, 0x01a88d22, 0x03b693a5, 0x000f7193, 0x01b0d39d, 0x01b87b33, 0x03afbde4, 0x013e5e6d, 0x026b6eeb, 0x001b2646}}, Y: Field{[10]uint32{0x01c95620, 0x00467bd9, 0x013722bc, 0x00f93350, 0x030e0b75, 0x00fad11c, 0x0277188d, 0x018d4140, 0x034fc2cd, 0x0007977d}}}, + {X: Field{[10]uint32{0x0341570c, 0x02865fa7, 0x03a0ca52, 0x029258bf, 0x00554569, 0x0248a22e, 0x0298ed7e, 0x033246e5, 0x019d4283, 0x002b36b0}}, Y: Field{[10]uint32{0x02d7b66e, 0x00e94831, 0x01afeea0, 0x029be5f6, 0x02451d41, 0x01c5d0ae, 0x030c6bfe, 0x021507d4, 0x0187523c, 0x003e94db}}}, + {X: Field{[10]uint32{0x025fc6c0, 0x00a96591, 0x00abba3e, 0x03c2bad4, 0x0385bba7, 0x034a29f2, 0x00b107c3, 0x032ee552, 0x03a3f696, 0x002c525a}}, Y: Field{[10]uint32{0x006318ad, 0x00bbcf72, 0x0057a857, 0x02effd73, 0x03487740, 0x03a01e09, 0x03c8f8ea, 0x0129bb83, 0x00d5727a, 0x001dfedb}}}, + {X: Field{[10]uint32{0x01b09126, 0x01500d36, 0x03ec94d8, 0x01e2b6c1, 0x02c2c9f8, 0x01b44a39, 0x00cab31d, 0x03a7283f, 0x01b56098, 0x000ff65f}}, Y: Field{[10]uint32{0x022b4578, 0x01007cc8, 0x014a22c0, 0x012c09f8, 0x0324e37d, 0x022c91bd, 0x00451273, 0x038dd03f, 0x00361494, 0x0006f5df}}}, + {X: Field{[10]uint32{0x02aefce9, 0x00ab8bb0, 0x03338898, 0x03feb5e4, 0x02eb174c, 0x00271f3e, 0x036d5c44, 0x01a3b551, 0x0055f2a4, 0x0017a37e}}, Y: Field{[10]uint32{0x02a6845f, 0x02e32c4d, 0x0357a17e, 0x03b311bc, 0x01d50da8, 0x021c0610, 0x01771843, 0x032a2282, 0x02823bb8, 0x0014b9ce}}}, + {X: Field{[10]uint32{0x024672bd, 0x005021b1, 0x006613f8, 0x0076e503, 0x0062021a, 0x003ee4cb, 0x01e6fb0a, 0x032da7a5, 0x02eb1417, 0x00267c41}}, Y: Field{[10]uint32{0x03a6501d, 0x02097ffd, 0x015337e9, 0x010f4613, 0x01e484d8, 0x00709ff9, 0x02926e6a, 0x0000441a, 0x0038e1e7, 0x00279fec}}}, + {X: Field{[10]uint32{0x0251ef8c, 0x00c18e9f, 0x031f7ac4, 0x03f52971, 0x0068bb14, 0x03fc3882, 0x011d6864, 0x0361fff4, 0x00985526, 0x001a1bf1}}, Y: Field{[10]uint32{0x00588e5b, 0x01824651, 0x0224422f, 0x017d6cf5, 0x024137dc, 0x0383c8ff, 0x016dd6b2, 0x02be16f2, 0x0132d793, 0x00074a3d}}}, + {X: Field{[10]uint32{0x03f6b83d, 0x03e5af2f, 0x03b2093d, 0x0001582f, 0x00e4c836, 0x00dc3e19, 0x00f3a85b, 0x002f2a45, 0x0356cc45, 0x0033e977}}, Y: Field{[10]uint32{0x0137604b, 0x0017cee3, 0x0203f78b, 0x03c09938, 0x0261cf56, 0x023e05c1, 0x01d96c74, 0x03ff246c, 0x0246bab7, 0x0033bee6}}}, + {X: Field{[10]uint32{0x013e404e, 0x0022791c, 0x003e8b39, 0x01aa58aa, 0x02893760, 0x00d39f2f, 0x0241eed5, 0x025a4fdd, 0x034c3fbb, 0x002646da}}, Y: Field{[10]uint32{0x023f8d3e, 0x02d83baf, 0x03c7113b, 0x01e75611, 0x02098dab, 0x012e4ae2, 0x038a0a2f, 0x019a234e, 0x026bbe55, 0x000fffae}}}, + {X: Field{[10]uint32{0x03c8c0d7, 0x006ee484, 0x00bcd689, 0x038d5a4e, 0x032955c4, 0x0089b144, 0x021fa14f, 0x00487162, 0x01d3b9b0, 0x00344131}}, Y: Field{[10]uint32{0x00caa6e9, 0x003415ac, 0x0196a3d9, 0x00028244, 0x00091ddb, 0x0171ddce, 0x02cea218, 0x01f3f40c, 0x019a814d, 0x0002320e}}}, + {X: Field{[10]uint32{0x0355dfce, 0x00c652f8, 0x031bcad9, 0x03df1d2c, 0x03415a06, 0x0065093a, 0x01c9a407, 0x00d921d2, 0x0053a45c, 0x001d864a}}, Y: Field{[10]uint32{0x024ad2fc, 0x03cdd14c, 0x01ecf84e, 0x00de451d, 0x02b5517b, 0x00984f18, 0x02bc9345, 0x01404b5f, 0x02873cbb, 0x000c44e4}}}, + {X: Field{[10]uint32{0x01070725, 0x027ec6b9, 0x016c8805, 0x02e6069f, 0x0210c7f9, 0x014424ec, 0x01b1de5c, 0x0307d301, 0x00a80509, 0x0005ccc1}}, Y: Field{[10]uint32{0x001d353e, 0x0087e24d, 0x013d5f9e, 0x022ce630, 0x02800cdc, 0x01a48a5e, 0x03db2e9c, 0x020e5150, 0x0198c8e0, 0x0010efef}}}, + {X: Field{[10]uint32{0x03da104a, 0x02b94542, 0x014c46b7, 0x02a02c53, 0x019eacca, 0x0391bf25, 0x03f5b6a9, 0x01545041, 0x03e1d28c, 0x002b2815}}, Y: Field{[10]uint32{0x02bf6ce8, 0x02e90cf9, 0x017024dc, 0x03348fdb, 0x00cb00e6, 0x012dcae3, 0x0095be9a, 0x01dbfc60, 0x031770bd, 0x00385fc5}}}, + {X: Field{[10]uint32{0x0076dbaa, 0x0212274d, 0x02b04b7e, 0x017d839b, 0x0385b294, 0x00029f70, 0x00a73859, 0x023ec70c, 0x0150e009, 0x003ec809}}, Y: Field{[10]uint32{0x039a0f28, 0x013d597b, 0x0099645e, 0x008b7f0f, 0x03cedda9, 0x01fd1cf3, 0x03bc98c7, 0x031a36f4, 0x00203f72, 0x0006abe1}}}, + {X: Field{[10]uint32{0x011ae7ac, 0x021e6f38, 0x0101c08f, 0x026108b1, 0x03af1aa2, 0x00a562f8, 0x0366c66c, 0x01eae396, 0x010ca022, 0x003a56dc}}, Y: Field{[10]uint32{0x0397cf19, 0x00975427, 0x030a2c55, 0x01a36728, 0x00c745a9, 0x03b7407e, 0x0109022c, 0x03d2df6a, 0x00e1ab5c, 0x0039917d}}}, + {X: Field{[10]uint32{0x0044770a, 0x019bcf7a, 0x02a15147, 0x01b339df, 0x03ab136c, 0x033b517f, 0x01cf203c, 0x02ffe581, 0x025c3589, 0x001b6d14}}, Y: Field{[10]uint32{0x02658c81, 0x035a121c, 0x00903eb5, 0x02ecf167, 0x03799cd7, 0x00b01a62, 0x031d2958, 0x01612c8c, 0x0003f5f7, 0x0039adfd}}}, + {X: Field{[10]uint32{0x01085eb3, 0x01cc4ccd, 0x022c8fbe, 0x0229a592, 0x01169043, 0x0136e711, 0x03c2959e, 0x03ab9c57, 0x029e49da, 0x002224ea}}, Y: Field{[10]uint32{0x01987cdd, 0x031c2539, 0x00c10d01, 0x0316ebb2, 0x01bd15ce, 0x0197d8b2, 0x037a4b02, 0x00fced8d, 0x003eae80, 0x001c3ef6}}}, + {X: Field{[10]uint32{0x020207a0, 0x02505363, 0x01fd56e3, 0x03123ceb, 0x012cd9e2, 0x02a9e2f2, 0x01e3ece8, 0x02336a1c, 0x02cfac6e, 0x002f95fd}}, Y: Field{[10]uint32{0x0293d5f2, 0x0083cafb, 0x03aa1581, 0x0374daec, 0x028893ee, 0x0266a9ee, 0x00d141d8, 0x03e273f7, 0x007299ab, 0x001e05c2}}}, + {X: Field{[10]uint32{0x00b34925, 0x0232d508, 0x03562671, 0x03d16a79, 0x00a2f69b, 0x0340ad75, 0x0205ddd8, 0x0044a717, 0x02d285a0, 0x0001dfe9}}, Y: Field{[10]uint32{0x026455cc, 0x0136d14c, 0x03b97ce0, 0x02643805, 0x0337a2da, 0x0303b7fa, 0x0086288e, 0x0348633a, 0x023c13a3, 0x000c56ec}}}, + {X: Field{[10]uint32{0x01f4dc03, 0x02826e34, 0x01d00b2e, 0x02b65e37, 0x02061094, 0x019ffec3, 0x00834ca7, 0x0370cd8b, 0x03fe8414, 0x000bfb5e}}, Y: Field{[10]uint32{0x00117e01, 0x0378b166, 0x00ff20a6, 0x0182db13, 0x0363332a, 0x00047186, 0x01e434f0, 0x00f4c559, 0x00f7aa0b, 0x0005397a}}}, + {X: Field{[10]uint32{0x034d66c6, 0x03ab2242, 0x026a101a, 0x010b3a3b, 0x037f8af2, 0x03c0fb8f, 0x0343df2b, 0x006e87f2, 0x00d05a87, 0x0027d30b}}, Y: Field{[10]uint32{0x02922920, 0x0316502f, 0x01acf83b, 0x03d7f0d0, 0x03d0fd7d, 0x030e1388, 0x038a2abd, 0x01e21e3f, 0x0352f242, 0x003ad087}}}, + {X: Field{[10]uint32{0x01bea647, 0x03e9f297, 0x013ce7c8, 0x022eef07, 0x0015f0a4, 0x00dce0fc, 0x0203ef6e, 0x001332dc, 0x00b6824a, 0x0014f038}}, Y: Field{[10]uint32{0x01618cf9, 0x03f4e853, 0x00e91836, 0x0178416a, 0x0313c59d, 0x03a024e5, 0x01729f9b, 0x0328694e, 0x018d9246, 0x001aa6d6}}}, + {X: Field{[10]uint32{0x0117d714, 0x00eb62ab, 0x02fd5c0a, 0x02fded3b, 0x03bb20fd, 0x00cf5a3a, 0x037bba54, 0x01ae12da, 0x0082d790, 0x0036f033}}, Y: Field{[10]uint32{0x01cd7211, 0x031d9d8b, 0x02e37a4f, 0x038a14c1, 0x008aee42, 0x039798ce, 0x001b0904, 0x00b0e9be, 0x038623ff, 0x0017af07}}}, + {X: Field{[10]uint32{0x008f5f0b, 0x002a9b49, 0x02165af2, 0x01e10314, 0x02ca93a4, 0x004c7557, 0x01a8cbb8, 0x023811ec, 0x0332a3c0, 0x001e18ab}}, Y: Field{[10]uint32{0x03fc15d8, 0x03f70ce2, 0x02684f1e, 0x00ba36a4, 0x017e8c27, 0x021ecefe, 0x0367a645, 0x00d4f228, 0x02076b10, 0x002ed7d9}}}, + {X: Field{[10]uint32{0x031049ee, 0x013032a4, 0x037524e4, 0x0326e1d4, 0x01f8238f, 0x005724ec, 0x012bad80, 0x0162ddbb, 0x01fc8001, 0x00034d5c}}, Y: Field{[10]uint32{0x02a44bc3, 0x01af1d20, 0x0315f4d2, 0x03e549af, 0x0170a9e6, 0x0056bd12, 0x00872fa9, 0x00c2aa74, 0x01e83e66, 0x00058b72}}}, + {X: Field{[10]uint32{0x00589d9b, 0x022c2de2, 0x02a26e90, 0x036a23eb, 0x03b9f531, 0x037cd613, 0x02b98e55, 0x031d6190, 0x0094cebb, 0x002a1472}}, Y: Field{[10]uint32{0x0375b422, 0x009638ec, 0x020e1151, 0x03e6d7eb, 0x011e1af1, 0x02b90ceb, 0x01f38983, 0x0307bdc7, 0x015cadfa, 0x001d1c0b}}}, + {X: Field{[10]uint32{0x0258012d, 0x0005b3b6, 0x0131e972, 0x03e407c2, 0x012d9af1, 0x036cba21, 0x0178a08c, 0x03feab82, 0x03f4012e, 0x002a4b90}}, Y: Field{[10]uint32{0x002fb668, 0x000ee574, 0x013c6bb9, 0x01ec8ef0, 0x02535c68, 0x02094825, 0x01d7bd12, 0x005c3acd, 0x009d5560, 0x00363d68}}}, + {X: Field{[10]uint32{0x03cff6bb, 0x001fed7c, 0x0024c090, 0x00a74a0f, 0x02bb29e1, 0x01d83b36, 0x02658c64, 0x01a7210b, 0x02448b43, 0x001d72bf}}, Y: Field{[10]uint32{0x0355dc39, 0x011dec42, 0x015f53c9, 0x028bee88, 0x02db1ea5, 0x00751ce2, 0x02affab5, 0x00d54c78, 0x02e243c7, 0x00328384}}}, + {X: Field{[10]uint32{0x0041d006, 0x012114e3, 0x02b56a21, 0x01ddedb9, 0x02c48c41, 0x02008ed6, 0x017a2337, 0x0167b0bc, 0x00664db9, 0x00002ac0}}, Y: Field{[10]uint32{0x035d8b31, 0x00dc5d67, 0x029b7b5d, 0x01f7adcb, 0x01e3d338, 0x0101d62b, 0x02762fb9, 0x0145a7d1, 0x02fc3554, 0x00233e78}}}, + {X: Field{[10]uint32{0x01b7ecb7, 0x02fa9427, 0x027814a1, 0x03f55cfc, 0x00f89b9a, 0x011a747c, 0x00855bf0, 0x0084d060, 0x02f82e4b, 0x0009d443}}, Y: Field{[10]uint32{0x00fb87e1, 0x01570d2b, 0x00aeb900, 0x00337b1a, 0x03b0a1b2, 0x02fa67f4, 0x02073555, 0x0130187f, 0x00e886b5, 0x00083f80}}}, + {X: Field{[10]uint32{0x01b16d3a, 0x00b23293, 0x02c1d745, 0x03b8ed66, 0x03f4a6c2, 0x02727081, 0x021405c9, 0x009dede4, 0x01a8d388, 0x001dcffd}}, Y: Field{[10]uint32{0x00a52f8e, 0x010d6fbe, 0x002848d7, 0x02bcf9cd, 0x0200f75c, 0x01cc638e, 0x00806bd8, 0x03196ebf, 0x0231f51c, 0x0033d179}}}, + {X: Field{[10]uint32{0x02f45746, 0x03311547, 0x0386fe14, 0x00dcb890, 0x034293fc, 0x03686a3b, 0x0277e359, 0x02ff0edc, 0x0098e69e, 0x000be3cb}}, Y: Field{[10]uint32{0x0168ec06, 0x032b5026, 0x02c3642c, 0x0323fba8, 0x008150a6, 0x0012aaba, 0x003e4066, 0x02ae808f, 0x03ecc4dc, 0x003e1748}}}, + {X: Field{[10]uint32{0x0277f67f, 0x020f7a58, 0x001c061a, 0x01e19369, 0x01745756, 0x018d5b39, 0x00849522, 0x03438a82, 0x00daab8d, 0x00061e2b}}, Y: Field{[10]uint32{0x01477020, 0x011596b5, 0x009bb968, 0x00a039b4, 0x03ecbcc1, 0x03e922bc, 0x0296f05b, 0x0024b2b7, 0x028d064e, 0x00104b21}}}, + {X: Field{[10]uint32{0x035618c1, 0x02312f13, 0x029c4cad, 0x003d273d, 0x02c5a17b, 0x004dcfd8, 0x004f3cdd, 0x039389fb, 0x001aeac4, 0x000233ca}}, Y: Field{[10]uint32{0x01ed5973, 0x03f61bca, 0x02625cd9, 0x036d93fe, 0x027dbf09, 0x038cc0a6, 0x023911ed, 0x03a89f36, 0x019529c9, 0x000bc5fe}}}, + {X: Field{[10]uint32{0x008939f9, 0x0081a634, 0x01ec39ea, 0x00d9c5fc, 0x02a09579, 0x0370abbf, 0x010d1913, 0x00da7976, 0x009ff165, 0x000e965f}}, Y: Field{[10]uint32{0x000a14d4, 0x018ad3ac, 0x01926da4, 0x021bd624, 0x03a7b48c, 0x00262381, 0x03464b00, 0x028b7816, 0x03b290c9, 0x00230880}}}, + {X: Field{[10]uint32{0x010ca15e, 0x013eb2e5, 0x028ac505, 0x0242eeb1, 0x03b9ceec, 0x014a40e4, 0x029c8615, 0x0043fd77, 0x0205096f, 0x00032f8c}}, Y: Field{[10]uint32{0x03ee27f4, 0x00ae51d3, 0x02bd0547, 0x00b2b785, 0x039bf7c7, 0x00580072, 0x02b48557, 0x02e84b0c, 0x006ab76a, 0x00111b2c}}}, + {X: Field{[10]uint32{0x02fed594, 0x036c1055, 0x00bd53a8, 0x00017b98, 0x011cde71, 0x019511cc, 0x0013b09e, 0x0139c061, 0x01cf0822, 0x0010c4f2}}, Y: Field{[10]uint32{0x03329a96, 0x0275cd46, 0x023317ab, 0x0352af12, 0x000e80bb, 0x02809482, 0x001021f9, 0x016a32c6, 0x019dd304, 0x0037ebcd}}}, + {X: Field{[10]uint32{0x0373c60e, 0x03c3eaaf, 0x036882bd, 0x02ac67ed, 0x011f5cbf, 0x03697fe9, 0x009651b2, 0x02b7b0b6, 0x0351f8d8, 0x0033ab4a}}, Y: Field{[10]uint32{0x02a25897, 0x01472915, 0x0221bf84, 0x029fb4b4, 0x026dd3bd, 0x02fc512b, 0x03e79322, 0x03c3a31c, 0x00806992, 0x002aca89}}}, + {X: Field{[10]uint32{0x027b79a0, 0x03c9eb92, 0x020e52d8, 0x02b67e2f, 0x0298e34d, 0x017b9bbb, 0x01164b84, 0x01d8bd91, 0x008d0848, 0x002739d7}}, Y: Field{[10]uint32{0x02a30a05, 0x00a76f26, 0x03571d0a, 0x0166e458, 0x029f6275, 0x02dd0a89, 0x017c04c8, 0x02a419ae, 0x014fe11b, 0x0038155b}}}, + {X: Field{[10]uint32{0x026741d7, 0x0002224c, 0x013a96ba, 0x020c0759, 0x0310214b, 0x0308e11e, 0x02106bf8, 0x038957e4, 0x009c621d, 0x00180912}}, Y: Field{[10]uint32{0x004ea858, 0x03638b84, 0x03aa9b1f, 0x0021989b, 0x02abf63e, 0x01ae0b97, 0x01326210, 0x000803b2, 0x032480a9, 0x0002543a}}}, + {X: Field{[10]uint32{0x0308e51d, 0x0348bb57, 0x01e11546, 0x028f1a11, 0x011f55e1, 0x001c957f, 0x02c2638c, 0x01af3501, 0x02f0108f, 0x0034f1d1}}, Y: Field{[10]uint32{0x038dfab6, 0x002f3390, 0x0165e25d, 0x0069bff0, 0x0335ed4e, 0x015fbcf6, 0x001a776c, 0x031ce799, 0x03e5d349, 0x00344936}}}, + {X: Field{[10]uint32{0x036514b8, 0x03c9c5c4, 0x00c6352c, 0x03e6f3e9, 0x01a69c69, 0x00216537, 0x03b9e11e, 0x03088be5, 0x035cd85d, 0x00287ad7}}, Y: Field{[10]uint32{0x00a15fff, 0x01429f3e, 0x03b68007, 0x01d8c094, 0x00ff5e3f, 0x03768ee8, 0x0247ddd7, 0x03805dd8, 0x0135a393, 0x0011bb4f}}}, + {X: Field{[10]uint32{0x005a8736, 0x03dd5852, 0x03639721, 0x015ae0b1, 0x00e44065, 0x0305051f, 0x025f1c61, 0x030b2fea, 0x0357fa3a, 0x000ac928}}, Y: Field{[10]uint32{0x03d73ade, 0x00cc3346, 0x0243c018, 0x017d742d, 0x01ad192a, 0x015c8751, 0x00fd7aed, 0x02b5546a, 0x01bd707a, 0x00359c86}}}, + {X: Field{[10]uint32{0x0187b2ec, 0x0293db3f, 0x03306126, 0x00f98ba7, 0x02ab6a62, 0x00bb2d06, 0x00c9cfb4, 0x0005658f, 0x01ab9dc6, 0x00264068}}, Y: Field{[10]uint32{0x00339317, 0x033363fc, 0x01730633, 0x0307b899, 0x03eb5950, 0x032d0539, 0x037a3df6, 0x035fcbff, 0x0194017c, 0x0023dd99}}}, + {X: Field{[10]uint32{0x0077e8da, 0x02e65961, 0x037634ae, 0x0386c870, 0x0328a2a4, 0x01f56320, 0x018e6003, 0x038bc787, 0x00455890, 0x000c47a1}}, Y: Field{[10]uint32{0x00ce030c, 0x016415bb, 0x00829a04, 0x009c7987, 0x01e017e9, 0x019c0ef0, 0x030dd00f, 0x015d8a86, 0x03676cc7, 0x0033d64f}}}, + {X: Field{[10]uint32{0x0283bb77, 0x023b31e7, 0x008b367a, 0x0391bfba, 0x03122d27, 0x023ebd9b, 0x00ad8b8c, 0x003db8a6, 0x02e39714, 0x002417dc}}, Y: Field{[10]uint32{0x01b65257, 0x01c529bc, 0x019b4698, 0x022a84b8, 0x022d9852, 0x02d6c94e, 0x00b94fc1, 0x03099764, 0x015dbde9, 0x00300fc5}}}, + {X: Field{[10]uint32{0x0339350c, 0x00fd56e8, 0x0085e04a, 0x00cc09f7, 0x0039eafd, 0x02672ed3, 0x00c2f021, 0x000004bf, 0x03a5d594, 0x001877dd}}, Y: Field{[10]uint32{0x01049161, 0x0189a8b6, 0x0005f684, 0x008235b7, 0x01f36640, 0x035b903d, 0x030603f2, 0x026cfdce, 0x037d00de, 0x0009f222}}}, + {X: Field{[10]uint32{0x01f18c28, 0x010aeb17, 0x021295bc, 0x0353bc09, 0x030de36d, 0x03bb01b1, 0x016af906, 0x012c7577, 0x0199886d, 0x00387e38}}, Y: Field{[10]uint32{0x01ca45a8, 0x03e2add4, 0x025e29ec, 0x02d53196, 0x0056a98d, 0x039f98d2, 0x025bc4ba, 0x03abc4a1, 0x02e9b956, 0x00140b04}}}, + {X: Field{[10]uint32{0x03b8565a, 0x02181dbe, 0x02ac19b6, 0x0151e692, 0x029180e1, 0x001133e5, 0x01fe6a77, 0x0288701f, 0x01b83804, 0x002b78bd}}, Y: Field{[10]uint32{0x03066aca, 0x006f09bb, 0x01eee375, 0x03d915c5, 0x0198a9e6, 0x017499f9, 0x00985d6f, 0x005a30c2, 0x021d07c8, 0x00343597}}}, + {X: Field{[10]uint32{0x03268187, 0x0208779b, 0x01b88ea5, 0x021685d5, 0x009f7f6b, 0x018a202e, 0x0345dd5c, 0x03e5cab0, 0x00bb0154, 0x00315608}}, Y: Field{[10]uint32{0x00613086, 0x00795af3, 0x027a2124, 0x016b605f, 0x014dc35f, 0x0285d223, 0x03b698c8, 0x02996498, 0x03ea1e6c, 0x002446c3}}}, + {X: Field{[10]uint32{0x007778b5, 0x000e719b, 0x01d089f7, 0x023054b7, 0x02128588, 0x023330b4, 0x0164352b, 0x0083d14e, 0x026e3210, 0x003a8825}}, Y: Field{[10]uint32{0x034fc18c, 0x00a7c9a7, 0x00d3959e, 0x01b37786, 0x0166f547, 0x010d0a70, 0x03dc9bd6, 0x007949aa, 0x0191cdc8, 0x003250bd}}}, + {X: Field{[10]uint32{0x007e2bf5, 0x03d37d18, 0x007079f9, 0x022a3a03, 0x02220c90, 0x0387be12, 0x0301bbd3, 0x03f9699c, 0x012d9c2d, 0x000f15d5}}, Y: Field{[10]uint32{0x031f39e3, 0x000802f9, 0x00522b9f, 0x0153b542, 0x016fd347, 0x00997fd9, 0x031a0a17, 0x018e5cf9, 0x00ffbc4a, 0x003527e8}}}, + {X: Field{[10]uint32{0x03d4e1c3, 0x02825466, 0x0071feb5, 0x002f3dfc, 0x01a3fd5c, 0x012b6859, 0x028e1339, 0x00fb0167, 0x00c6e104, 0x003c6233}}, Y: Field{[10]uint32{0x03bfdbe4, 0x021814c1, 0x021cf944, 0x010428bf, 0x03db045c, 0x0081d926, 0x02fb1908, 0x01e740b5, 0x031fe53e, 0x0017c7cd}}}, + {X: Field{[10]uint32{0x011c8c6a, 0x00d790b0, 0x013cad48, 0x028b4729, 0x01447112, 0x029efed2, 0x015a146a, 0x008cba01, 0x03d27e72, 0x00280517}}, Y: Field{[10]uint32{0x01e679cc, 0x00f9270f, 0x02cc5024, 0x02fc8b1f, 0x00ceb874, 0x001c272c, 0x00bb675f, 0x00333031, 0x00a0e5e7, 0x001ef006}}}, + {X: Field{[10]uint32{0x016ff48e, 0x00f7e03c, 0x016bd9c9, 0x0362c5d0, 0x01c17b7b, 0x02d56061, 0x03857060, 0x00454c7e, 0x01e80c22, 0x0014d003}}, Y: Field{[10]uint32{0x01a6cc6f, 0x034cf690, 0x0244c89c, 0x0082299a, 0x002df873, 0x00dbaa5c, 0x00840b6a, 0x0197c794, 0x02473ba5, 0x003848a3}}}, + {X: Field{[10]uint32{0x0264b1ac, 0x03199d33, 0x019048c6, 0x02d14ae6, 0x01cc8960, 0x03566be1, 0x00e34821, 0x00df8d43, 0x012d009d, 0x00208457}}, Y: Field{[10]uint32{0x021eb048, 0x03ee7bed, 0x02f05e75, 0x00f7a489, 0x01bffc1b, 0x02e74620, 0x02adab03, 0x00309012, 0x0209659a, 0x002637aa}}}, + {X: Field{[10]uint32{0x01fe7c3c, 0x005e2516, 0x039681fc, 0x01f00c20, 0x028669cb, 0x01437389, 0x01e6e9d4, 0x01bc7312, 0x001853d8, 0x0009cf63}}, Y: Field{[10]uint32{0x00c2ea00, 0x01b44040, 0x008af2e1, 0x007dfdfe, 0x0314974e, 0x007beeb6, 0x00c25a25, 0x009b205d, 0x01aa8ad0, 0x001b154c}}}, + {X: Field{[10]uint32{0x025ee319, 0x019d46ee, 0x01bfe403, 0x032d6c16, 0x0041e68c, 0x03d0a3f3, 0x0233f4fb, 0x020645c3, 0x0216a7e3, 0x0000185b}}, Y: Field{[10]uint32{0x0106748a, 0x012c393d, 0x032eaba8, 0x031cfa2b, 0x007c7dc3, 0x032a64dd, 0x01173f5c, 0x00fbf6e6, 0x0121182a, 0x001f6f2b}}}, + {X: Field{[10]uint32{0x00b82812, 0x00df0058, 0x0277452c, 0x00409d7d, 0x00dc5666, 0x000cfc84, 0x0373402d, 0x0260487d, 0x016a76a3, 0x0019d862}}, Y: Field{[10]uint32{0x03302c9b, 0x001e0b99, 0x007ebe76, 0x03c688d8, 0x0111848d, 0x038b2339, 0x011184c8, 0x024e7e02, 0x01cf1b40, 0x001ff740}}}, + {X: Field{[10]uint32{0x01e508b9, 0x029b53e2, 0x01fe6dd4, 0x008248d1, 0x00bd6eb0, 0x005dedac, 0x0135bd9e, 0x00176849, 0x03aae976, 0x001dfdea}}, Y: Field{[10]uint32{0x007f0b9e, 0x0392d973, 0x01231889, 0x03e84358, 0x020dbf20, 0x02df24cc, 0x035fd19b, 0x020c37f3, 0x016ccc7b, 0x003ec126}}}, + {X: Field{[10]uint32{0x00bce311, 0x0232a8e6, 0x005a4a0d, 0x02299ec3, 0x01bc4b4a, 0x0007e73c, 0x02973785, 0x00aee8f6, 0x03173a2e, 0x00304bd9}}, Y: Field{[10]uint32{0x039a47a8, 0x000c67dd, 0x03853a33, 0x00cdb960, 0x01097cd1, 0x02db2d50, 0x00012aa3, 0x00500544, 0x018644d3, 0x0037a4c2}}}, + {X: Field{[10]uint32{0x018e66aa, 0x01fbe570, 0x03304ee7, 0x03ea9dae, 0x004afe8f, 0x037ce80d, 0x039d268d, 0x0154b236, 0x02de19c7, 0x001954e8}}, Y: Field{[10]uint32{0x00edb93c, 0x01dc181c, 0x037f5373, 0x033b26ee, 0x0169f95b, 0x014b4dd3, 0x034dbb77, 0x002edcab, 0x00107c18, 0x002469c8}}}, + {X: Field{[10]uint32{0x03b834e3, 0x031411ad, 0x013eec1f, 0x008f9a8f, 0x01bba980, 0x010032aa, 0x022e9363, 0x0106148b, 0x00be353f, 0x0003d52d}}, Y: Field{[10]uint32{0x0296f17e, 0x0190df23, 0x013a5124, 0x02d015df, 0x03ab6f78, 0x0065d16a, 0x035afde2, 0x03c7c2a0, 0x006cbdd5, 0x0025af9e}}}, + {X: Field{[10]uint32{0x02adbb2a, 0x016d2d03, 0x03c64c0d, 0x01f12d9d, 0x03f86be3, 0x016d3722, 0x03c806e4, 0x0194882e, 0x03c2a0fa, 0x0030b4c5}}, Y: Field{[10]uint32{0x0313ab6a, 0x03acd7b4, 0x02af58e8, 0x023528eb, 0x03100f07, 0x03266529, 0x00cb16df, 0x032aedc6, 0x0169bd68, 0x00315c42}}}, + {X: Field{[10]uint32{0x0389f384, 0x03fcc4c6, 0x03ccefe1, 0x010d04db, 0x02cc43e1, 0x01fd751c, 0x034b9c95, 0x02993f71, 0x03c6a5b8, 0x0014a959}}, Y: Field{[10]uint32{0x009e8f53, 0x01bde8a7, 0x01d485c1, 0x03a5f60d, 0x02d7de27, 0x02064a55, 0x005f7d6b, 0x00a62b75, 0x01bfa314, 0x000cc98c}}}, + {X: Field{[10]uint32{0x01ba4e20, 0x012881c7, 0x005e98d2, 0x03c666d3, 0x013530f0, 0x00c491ef, 0x01435278, 0x01104a21, 0x006c891a, 0x003df702}}, Y: Field{[10]uint32{0x034444aa, 0x0378d16d, 0x027e7b82, 0x000ffc41, 0x00da0550, 0x00121618, 0x02f5f751, 0x0166bac3, 0x0312452e, 0x001cd3b5}}}, + {X: Field{[10]uint32{0x02ec06c6, 0x008362c8, 0x00d3e905, 0x0147944b, 0x01b3f2ae, 0x039be3dd, 0x02d8d8cd, 0x036f032f, 0x03a97bb6, 0x002553e7}}, Y: Field{[10]uint32{0x005dd9bb, 0x030e76c6, 0x0378bf65, 0x00523c10, 0x005426f6, 0x02d3e085, 0x01b3017b, 0x01983d2f, 0x03bb8bd9, 0x002d96d0}}}, + {X: Field{[10]uint32{0x0204e87e, 0x0236c509, 0x0145e818, 0x02f905ad, 0x026def2d, 0x01dd7365, 0x0366947f, 0x01962082, 0x03984141, 0x000839a6}}, Y: Field{[10]uint32{0x00632539, 0x019fe24a, 0x01f51caa, 0x01361f7c, 0x030dcce0, 0x010fd808, 0x02e45a3d, 0x00ae6cd6, 0x02590bd1, 0x00399451}}}, + {X: Field{[10]uint32{0x0072ed1c, 0x039f15c3, 0x01dc3709, 0x0210aace, 0x0371bed4, 0x00c0a55d, 0x0187fb53, 0x00bc1110, 0x03822dc4, 0x00173796}}, Y: Field{[10]uint32{0x01a0ea9f, 0x00a4a66a, 0x03e41b49, 0x02f9d897, 0x03cea3dc, 0x00ff584d, 0x00416e75, 0x0016d425, 0x02d864e4, 0x00283dee}}}, + {X: Field{[10]uint32{0x0326421f, 0x00ec4c7e, 0x01c346e7, 0x0181779c, 0x0045b204, 0x027535ba, 0x02fd03f4, 0x02c370aa, 0x034c6ba6, 0x002d61b2}}, Y: Field{[10]uint32{0x00948744, 0x02b26ad6, 0x0116d2b4, 0x01a662ec, 0x026767b4, 0x001abee1, 0x01de6235, 0x028eca8c, 0x03e7c26e, 0x0033b584}}}, + {X: Field{[10]uint32{0x00ba6ede, 0x029779a4, 0x00a8b2a2, 0x0150ddf9, 0x014e192a, 0x02358071, 0x0213dbfa, 0x00ea0b23, 0x01703580, 0x001f4fd8}}, Y: Field{[10]uint32{0x02c6cb15, 0x027d354b, 0x0100f196, 0x012f9e3a, 0x0177eaf8, 0x00302f2f, 0x03564778, 0x004f083e, 0x010e62f4, 0x0004e3a0}}}, + {X: Field{[10]uint32{0x037eb925, 0x01dfb0a3, 0x01b41d85, 0x037603ea, 0x01c9fa32, 0x00c12ae0, 0x03e67135, 0x03e18f9f, 0x00befc4a, 0x0039e8c5}}, Y: Field{[10]uint32{0x00f3eb1f, 0x02913d20, 0x008fb091, 0x033b1420, 0x0113ec94, 0x036a5c30, 0x019b6d07, 0x012b3fea, 0x0200f0e0, 0x003365e1}}}, + {X: Field{[10]uint32{0x03c6a577, 0x024098f4, 0x00231ec0, 0x02b67915, 0x00ba5fc0, 0x003c37f2, 0x01cd8e81, 0x0240bb88, 0x03e49f41, 0x0005e70e}}, Y: Field{[10]uint32{0x009cf184, 0x03fc32d3, 0x009dc5b9, 0x022693a2, 0x02640216, 0x0142df93, 0x02b03f5a, 0x026a80a7, 0x020efb9b, 0x001d7e7d}}}, + {X: Field{[10]uint32{0x01e6401f, 0x01842c24, 0x00c6fe50, 0x01a4173e, 0x0108d762, 0x015d53e9, 0x017808e2, 0x03060ae5, 0x0071464b, 0x00042956}}, Y: Field{[10]uint32{0x01b56ff4, 0x0145a8d0, 0x038b3029, 0x03caaa32, 0x0299a787, 0x0241aea7, 0x005c679f, 0x0368b38c, 0x03b96d2b, 0x0034d924}}}, + {X: Field{[10]uint32{0x008e555e, 0x03cfa6ba, 0x0099f96a, 0x028bcea7, 0x02585827, 0x00c7b1fd, 0x0108d45b, 0x02321055, 0x03225e85, 0x0012a40d}}, Y: Field{[10]uint32{0x0247d145, 0x01f44c8c, 0x0064c70c, 0x01df40b1, 0x0031c9a4, 0x003f3785, 0x012463f2, 0x01134331, 0x01a7fb9e, 0x00369351}}}, + {X: Field{[10]uint32{0x016acb3e, 0x00a5dcea, 0x02b621cd, 0x02ef80bc, 0x00c68373, 0x005c3b20, 0x00052d6b, 0x02023ded, 0x018c2505, 0x001b4427}}, Y: Field{[10]uint32{0x02dc9a57, 0x00e2ca3a, 0x012adc50, 0x002e72e5, 0x03200c87, 0x02c08eff, 0x001088ec, 0x01b90145, 0x00de511f, 0x003237a8}}}, + {X: Field{[10]uint32{0x02e1af88, 0x03c30e59, 0x01bf28f7, 0x00f8a1d3, 0x0106105b, 0x00d55d41, 0x015c7347, 0x00919f01, 0x00986d20, 0x00270866}}, Y: Field{[10]uint32{0x01d0914a, 0x027ecb63, 0x004550ec, 0x03354b52, 0x03efddf5, 0x01959783, 0x01d41463, 0x03fc4be7, 0x016c8edd, 0x00218dd2}}}, + {X: Field{[10]uint32{0x0292b03a, 0x023b71b0, 0x032e74de, 0x02d772e3, 0x03dcd104, 0x00aee5ce, 0x036dd750, 0x003d8040, 0x00390e66, 0x0008b294}}, Y: Field{[10]uint32{0x006b11e8, 0x03a457d9, 0x0258eda5, 0x02eb100f, 0x01cb6731, 0x0023e832, 0x016449a7, 0x02e07910, 0x00711ef6, 0x0021bf51}}}, + {X: Field{[10]uint32{0x02b6f938, 0x037a10b9, 0x0227c80b, 0x00977dd7, 0x022e39be, 0x03db2880, 0x0116fdd1, 0x011903c8, 0x0302cc00, 0x0033f063}}, Y: Field{[10]uint32{0x0290df7d, 0x0075a118, 0x01398645, 0x02936740, 0x01c09236, 0x01c232f9, 0x03a2923f, 0x0343965e, 0x00df4f79, 0x00358ad6}}}, + {X: Field{[10]uint32{0x0280a087, 0x03053e66, 0x02f259d3, 0x015afb2e, 0x02574905, 0x008d7142, 0x01f46ca6, 0x01163a64, 0x00c23425, 0x000ce22f}}, Y: Field{[10]uint32{0x0245c016, 0x00b84fa9, 0x0013b310, 0x029752b1, 0x0306c3dc, 0x02563efc, 0x00223166, 0x015e0c07, 0x02f806f6, 0x001f52a8}}}, + {X: Field{[10]uint32{0x00b46a19, 0x02a507bc, 0x03aa802b, 0x00f532f2, 0x0144ac96, 0x00db67e5, 0x018fefc1, 0x004b78f7, 0x00131b8c, 0x00349af4}}, Y: Field{[10]uint32{0x028d3a99, 0x002b096d, 0x00653cb1, 0x01f699e0, 0x020d045a, 0x032ad24a, 0x02948724, 0x01e571ad, 0x02a331b6, 0x0019be27}}}, + {X: Field{[10]uint32{0x03d1fdb9, 0x0274a795, 0x035ca1d9, 0x0353511f, 0x03465a03, 0x03bd7d9a, 0x03960edf, 0x03a3c858, 0x030cdb67, 0x003734cd}}, Y: Field{[10]uint32{0x007084ef, 0x0185a9cd, 0x01ed9922, 0x02f66d93, 0x028a9eb4, 0x024efdcc, 0x038d4483, 0x02fe1cb3, 0x007a320a, 0x0022e4dd}}}, + {X: Field{[10]uint32{0x038d8e7a, 0x0227cfd3, 0x0006f805, 0x02ecff82, 0x0121d449, 0x02718e06, 0x03105af5, 0x02b558cd, 0x0105e602, 0x001d01d3}}, Y: Field{[10]uint32{0x003d574d, 0x02e1052c, 0x002cfe19, 0x03db111e, 0x02bf0dd8, 0x0077548d, 0x00fd515a, 0x0202b411, 0x03d4adee, 0x00069352}}}, + {X: Field{[10]uint32{0x0305c174, 0x00dcea0b, 0x034dd732, 0x025035ae, 0x01971203, 0x01e024aa, 0x00df438a, 0x00faedaa, 0x0081f3a2, 0x0002a273}}, Y: Field{[10]uint32{0x03c4fda4, 0x02a59128, 0x03d77873, 0x039d5c1f, 0x00326a9c, 0x02e5e77b, 0x01ddc9fd, 0x03c18d39, 0x03dd676d, 0x0012dbe0}}}, + {X: Field{[10]uint32{0x0216424c, 0x028e03d9, 0x00e037dd, 0x0102d82b, 0x026443c5, 0x001fe592, 0x002ae36b, 0x00fc3864, 0x00bafa91, 0x0023c684}}, Y: Field{[10]uint32{0x01e5525f, 0x02615557, 0x0326e869, 0x018b5680, 0x0114e3a4, 0x01d03cc7, 0x0016ad4e, 0x01df0c91, 0x024445c1, 0x00040a35}}}, + {X: Field{[10]uint32{0x01e27b51, 0x01d01222, 0x026d6f4c, 0x03e11e3e, 0x019154a2, 0x0369266b, 0x0157268a, 0x0288da9e, 0x027914f9, 0x002b63f6}}, Y: Field{[10]uint32{0x020e82ae, 0x01392f8c, 0x03834617, 0x03c09818, 0x03703b74, 0x0170f24c, 0x02deffc0, 0x029b1bdd, 0x02ab1f7d, 0x00272874}}}, + {X: Field{[10]uint32{0x0167fbe7, 0x0178cb3f, 0x03c874d1, 0x003f93ec, 0x03219270, 0x03c8e38b, 0x008cc246, 0x00a5c110, 0x010a797b, 0x001b1ba6}}, Y: Field{[10]uint32{0x0391dac1, 0x00c1868f, 0x019e1be8, 0x021e4f53, 0x0139811b, 0x0010368c, 0x025b32cc, 0x0159667e, 0x03980f35, 0x0007ff05}}}, + {X: Field{[10]uint32{0x01118969, 0x007e68c9, 0x0247cedc, 0x01728d02, 0x039f86f7, 0x0027c8de, 0x035351de, 0x00aaf658, 0x03ea31ad, 0x00080ac4}}, Y: Field{[10]uint32{0x001bcba0, 0x03314d46, 0x004c0fe3, 0x0085c000, 0x03868a45, 0x02f2061c, 0x0111184e, 0x00dfd354, 0x0105a14e, 0x00314bed}}}, + {X: Field{[10]uint32{0x03b748a5, 0x0210a475, 0x02f5fd22, 0x031848c9, 0x03034053, 0x02615654, 0x01c7c7cf, 0x010beac3, 0x00a10251, 0x0014d57c}}, Y: Field{[10]uint32{0x02281949, 0x0333c5df, 0x0118f4b1, 0x01a9e071, 0x039cddd3, 0x0183b8fb, 0x008ff9de, 0x0007db07, 0x036a5535, 0x001d6ef8}}}, + {X: Field{[10]uint32{0x029829d7, 0x00ebab30, 0x02235f91, 0x02c4d1c1, 0x0279a39a, 0x02a0ebb0, 0x00f16644, 0x037b2747, 0x0178eacb, 0x002e214b}}, Y: Field{[10]uint32{0x03183156, 0x00c584f7, 0x020faeb4, 0x0343dca7, 0x038d51ee, 0x03a27b0e, 0x002735d2, 0x03187eb9, 0x035052b3, 0x001d8eea}}}, + {X: Field{[10]uint32{0x03057ae2, 0x033b56c1, 0x0188beec, 0x03a02c3c, 0x01696d18, 0x0027b343, 0x017d4d6a, 0x03de3870, 0x004b294d, 0x0032acb9}}, Y: Field{[10]uint32{0x01ff2f43, 0x02681a06, 0x00ed5405, 0x02b416c8, 0x02de28bf, 0x0156d41b, 0x0149607c, 0x01266b3b, 0x009a501a, 0x003cd46c}}}, + {X: Field{[10]uint32{0x03056b31, 0x01a14f15, 0x026589d4, 0x00dae6e1, 0x03b16f9f, 0x0152dd5a, 0x012355eb, 0x015568af, 0x01c99c6d, 0x0005002e}}, Y: Field{[10]uint32{0x03a077a8, 0x0270cab7, 0x00436e56, 0x007e5bc9, 0x035709b9, 0x03508477, 0x026993b3, 0x00459e82, 0x001662f4, 0x0022ca42}}}, + {X: Field{[10]uint32{0x03d9141e, 0x03b1b9af, 0x018a50fb, 0x00655623, 0x03b3d31b, 0x0044511a, 0x03ae7a9a, 0x027071a1, 0x032e973e, 0x0014ab8d}}, Y: Field{[10]uint32{0x02351ccb, 0x02ff8360, 0x0256b71e, 0x033363b3, 0x001f87cf, 0x0116436d, 0x0238721a, 0x0390b6e5, 0x000de6d0, 0x003e60ad}}}, + {X: Field{[10]uint32{0x01899c24, 0x03d976d8, 0x032e0fe5, 0x0022e4df, 0x001139b7, 0x0143700c, 0x0241e148, 0x011896f8, 0x03bd4082, 0x000f453f}}, Y: Field{[10]uint32{0x00a1dfb7, 0x03f1d862, 0x02872981, 0x03bf4dd9, 0x02799882, 0x034884e8, 0x01cf16b8, 0x03811d36, 0x00fa477e, 0x002c4299}}}, + {X: Field{[10]uint32{0x02a48930, 0x0057b36e, 0x0246e824, 0x0346a57f, 0x03e7ab3f, 0x0353261e, 0x03bc2700, 0x03065ea2, 0x02df54e0, 0x0031bd4a}}, Y: Field{[10]uint32{0x0056811d, 0x016bf64e, 0x03a8f77e, 0x024cab7a, 0x03b9ef91, 0x0267e912, 0x010281c0, 0x01ced241, 0x006fb538, 0x001d4930}}}, + {X: Field{[10]uint32{0x0144c1aa, 0x01828fb2, 0x00f559fe, 0x03601b46, 0x005f2d1d, 0x031e7070, 0x03c838a4, 0x01f2d9e8, 0x0264bdc4, 0x00240224}}, Y: Field{[10]uint32{0x02ee04de, 0x003ece74, 0x03064eea, 0x032e4779, 0x02ca140b, 0x010c392d, 0x01d582cc, 0x00c899aa, 0x0046d70b, 0x0006258e}}}, + {X: Field{[10]uint32{0x03da0662, 0x03dc247b, 0x006ebc1b, 0x019a5bcf, 0x012db741, 0x03a084a9, 0x035b2d4c, 0x00df0589, 0x00ea478b, 0x00389f09}}, Y: Field{[10]uint32{0x02783de3, 0x01f3c244, 0x03b7d853, 0x036bf0ed, 0x03bb99f4, 0x000c5e46, 0x01532bb5, 0x019f2feb, 0x0279c3a2, 0x0009fb14}}}, + {X: Field{[10]uint32{0x000a3eb2, 0x03bfe131, 0x0092b917, 0x03b98190, 0x032549b8, 0x025574ef, 0x0025d857, 0x035badc0, 0x02129cf1, 0x0032976a}}, Y: Field{[10]uint32{0x027a9811, 0x02109677, 0x01e9ef6a, 0x03c9dee2, 0x037c4aa5, 0x035082d2, 0x027c7c27, 0x01bdf4cf, 0x0105500f, 0x001a0b52}}}, + {X: Field{[10]uint32{0x00877f55, 0x005a67bf, 0x00170487, 0x016d0943, 0x006c98ac, 0x02274509, 0x0223fb5c, 0x031a2119, 0x000f2b2a, 0x00241a7b}}, Y: Field{[10]uint32{0x031fb05e, 0x034e95b9, 0x00266975, 0x02a322e0, 0x02a6c3c3, 0x00901f7f, 0x000617ee, 0x00dc485b, 0x02c4eff8, 0x00331403}}}, + {X: Field{[10]uint32{0x03bda16c, 0x02c4e470, 0x0250fb8c, 0x00f01649, 0x00053639, 0x017a2ae8, 0x02742d3c, 0x03b86dae, 0x02eb0bd5, 0x0017f87f}}, Y: Field{[10]uint32{0x0065a34b, 0x0250ade6, 0x01af53bf, 0x01a90dd7, 0x03ea02ae, 0x001cbddb, 0x025ba068, 0x0193b4d0, 0x032701ac, 0x0036c46c}}}, + {X: Field{[10]uint32{0x001b2c34, 0x019b12ab, 0x00cb8318, 0x00aa1783, 0x026bf260, 0x02439382, 0x0035b6cf, 0x03e20d24, 0x01a5f168, 0x000292a4}}, Y: Field{[10]uint32{0x03837596, 0x02080c1f, 0x00857ce0, 0x02a7023d, 0x02ff7265, 0x00ae262a, 0x02f2ff8e, 0x03b47462, 0x02a8fe36, 0x00016ffb}}}, + {X: Field{[10]uint32{0x02884849, 0x01bdd1be, 0x019e35f0, 0x01bb4f1f, 0x0143f536, 0x03aaaf93, 0x00705054, 0x016d492a, 0x0336f0c3, 0x003d04d7}}, Y: Field{[10]uint32{0x010c526b, 0x03f12c99, 0x0052dd55, 0x00c30ea7, 0x01ba1a5d, 0x00c1d75d, 0x019d0ea4, 0x0301e2d3, 0x03f1b8b6, 0x000719c1}}}, + {X: Field{[10]uint32{0x00380203, 0x00ea7ce5, 0x01e0fdcc, 0x01364ad0, 0x00014a50, 0x020fa12e, 0x03449928, 0x03eebb4a, 0x018a9363, 0x00356a26}}, Y: Field{[10]uint32{0x0260e9fb, 0x026cf6ba, 0x03d4b0bf, 0x02be98aa, 0x032f20c5, 0x0351b35f, 0x038ae7c6, 0x0320162e, 0x03036fdd, 0x0025805a}}}, + {X: Field{[10]uint32{0x03f3d176, 0x022e6f92, 0x01fa8cc3, 0x039e6443, 0x00d50297, 0x0043064e, 0x007fb622, 0x0036f428, 0x023404b3, 0x00220132}}, Y: Field{[10]uint32{0x03d37b0d, 0x02bb79d5, 0x02c9124c, 0x0142c472, 0x01eb65db, 0x00e1c58c, 0x008c55ff, 0x01f18dde, 0x02e57992, 0x0016d92f}}}, + {X: Field{[10]uint32{0x03811021, 0x0176fd8a, 0x00e740ac, 0x01d1f426, 0x010c947c, 0x022f6969, 0x008e78e7, 0x0086daf1, 0x01fc440c, 0x0021a470}}, Y: Field{[10]uint32{0x03b1787e, 0x0122f2b5, 0x01c0903d, 0x00e7d9b0, 0x00682f45, 0x000a9c44, 0x02c330af, 0x00460555, 0x01c535f5, 0x003f63b0}}}, + {X: Field{[10]uint32{0x03093229, 0x01018dfb, 0x001eb58a, 0x02aec3b4, 0x03c3ee5f, 0x0253a4a4, 0x02bfe3f8, 0x038b87f7, 0x01f6343b, 0x001117f0}}, Y: Field{[10]uint32{0x0185b605, 0x001ef6df, 0x010af329, 0x03cd236a, 0x03c3c087, 0x03b7b44e, 0x00aa1b73, 0x03e14f41, 0x03fe6737, 0x00215fc5}}}, + {X: Field{[10]uint32{0x036493b4, 0x03140069, 0x039667d1, 0x01568773, 0x02af1a55, 0x02e23135, 0x023aaf95, 0x0346c2cb, 0x03dea657, 0x00170e5f}}, Y: Field{[10]uint32{0x030aff0a, 0x02681bf7, 0x03d32de7, 0x00b3d21f, 0x03ce5cb5, 0x02a7f153, 0x0336aee6, 0x00f1d4b5, 0x00207b6f, 0x002739d2}}}, + {X: Field{[10]uint32{0x03fc1b7e, 0x00dbe931, 0x030c1d7e, 0x0210dcb4, 0x02d9f535, 0x037f8644, 0x01d2bc5b, 0x0380a0d8, 0x01cb28d7, 0x0026d559}}, Y: Field{[10]uint32{0x03879eea, 0x0266c458, 0x0062d827, 0x01d7662c, 0x01a23af0, 0x038fdb1b, 0x0257f054, 0x02a0c962, 0x028d2de2, 0x001f573e}}}, + {X: Field{[10]uint32{0x01194f1d, 0x015368f2, 0x03b4b896, 0x027c404a, 0x02a5229a, 0x006ec656, 0x031b1657, 0x021c34e5, 0x00631bbf, 0x002bef7b}}, Y: Field{[10]uint32{0x0327e296, 0x030914e3, 0x0316a773, 0x00507d50, 0x0383fe57, 0x02ec2899, 0x0074ad1b, 0x009497e6, 0x0349b949, 0x0033f2e9}}}, + {X: Field{[10]uint32{0x00ad916b, 0x0075a22b, 0x03f4d0e0, 0x0318b12c, 0x03a7cc11, 0x03a7a7b1, 0x03c61605, 0x014d1d72, 0x03cbca3a, 0x001dc4aa}}, Y: Field{[10]uint32{0x024b82fb, 0x023c289a, 0x03ead0c6, 0x03f47ffb, 0x02b57cbb, 0x030ef4cc, 0x02b43af8, 0x009556b4, 0x01bc0eb1, 0x001ee472}}}, + {X: Field{[10]uint32{0x00a2b7e2, 0x00b4e2c7, 0x01c9f07a, 0x00459b9d, 0x0311b43a, 0x037d419a, 0x01fe506f, 0x017904b9, 0x0346f293, 0x000f1148}}, Y: Field{[10]uint32{0x019cd800, 0x00231ffd, 0x026962c6, 0x0228d4ad, 0x010e0203, 0x012047f6, 0x03532f8d, 0x01a0a4eb, 0x01e127f9, 0x003f4fdb}}}, + {X: Field{[10]uint32{0x0248b7be, 0x020b6c2a, 0x030547d1, 0x011377c2, 0x00e04eda, 0x0032652e, 0x01a53d67, 0x0368ff1f, 0x002fb4db, 0x0002f616}}, Y: Field{[10]uint32{0x01285c68, 0x03a318d1, 0x0033ad6d, 0x02de5d9c, 0x00ef0dc4, 0x039f420a, 0x016b282e, 0x01a2ee30, 0x0369c182, 0x001e6789}}}, + {X: Field{[10]uint32{0x02c84112, 0x0339b3ec, 0x0371974d, 0x03ab667a, 0x03befe03, 0x01a44ce3, 0x03fb71c1, 0x0375018a, 0x00a78dd9, 0x00310404}}, Y: Field{[10]uint32{0x02a2ff83, 0x0058b690, 0x0208d29b, 0x001cc50f, 0x00f270f8, 0x0209298f, 0x01c5dbcf, 0x02f088ec, 0x039de71e, 0x00140230}}}, + {X: Field{[10]uint32{0x0121d311, 0x0094f309, 0x01f4a1b6, 0x01777b6d, 0x03f786bc, 0x01426f23, 0x02586a6a, 0x02e89c01, 0x007e6cf4, 0x003a27a0}}, Y: Field{[10]uint32{0x02fea2cc, 0x0366527c, 0x0117aad6, 0x03070264, 0x012228f9, 0x0301000a, 0x039fcfc4, 0x01237a4d, 0x03797c49, 0x002ab7b2}}}, + {X: Field{[10]uint32{0x00b08577, 0x006e43f7, 0x03fdbdca, 0x01ce19bc, 0x0084091f, 0x0048630d, 0x01379195, 0x02fe4190, 0x01b3be2d, 0x000d8f7c}}, Y: Field{[10]uint32{0x01848bae, 0x02f7c3dd, 0x026057e3, 0x01918c26, 0x00f9ea5b, 0x01f9dbc8, 0x0221493f, 0x038db125, 0x004e5634, 0x0002bbf4}}}, + {X: Field{[10]uint32{0x038ea16e, 0x028f22f1, 0x003becd4, 0x00e8d357, 0x03ca8fe3, 0x0173112e, 0x01213228, 0x02093920, 0x023883d2, 0x00172345}}, Y: Field{[10]uint32{0x02c0456f, 0x02baeb86, 0x02685872, 0x037e3cc6, 0x02355347, 0x027dd496, 0x01005914, 0x019b0225, 0x01d9c7ce, 0x003d9be4}}}, + {X: Field{[10]uint32{0x02cbe126, 0x0217a1fa, 0x01ff4080, 0x0162f9d7, 0x024181dd, 0x03649536, 0x037789ee, 0x020fb760, 0x02760835, 0x00042b19}}, Y: Field{[10]uint32{0x0317d22d, 0x015fafae, 0x02a1a01f, 0x02806057, 0x0372e0db, 0x031ac96b, 0x0065acb0, 0x039eec1d, 0x02de23f3, 0x001b4faa}}}, + {X: Field{[10]uint32{0x00153048, 0x029a5ea3, 0x037da8db, 0x003e6d87, 0x02974c4c, 0x00823a8f, 0x01677962, 0x01550111, 0x01ea7bb6, 0x00079e68}}, Y: Field{[10]uint32{0x00787fc4, 0x03bca97c, 0x015dd394, 0x02f8ce81, 0x03e07d35, 0x02a0023a, 0x01874064, 0x012221a2, 0x017920a3, 0x002d8f8f}}}, + {X: Field{[10]uint32{0x03fa9a5b, 0x02f34254, 0x0076a7be, 0x00604759, 0x02116991, 0x0003fc4f, 0x00df2abb, 0x0288fd42, 0x007397b0, 0x0036c347}}, Y: Field{[10]uint32{0x0100dfe8, 0x0278ca12, 0x00dc9d0b, 0x010598a7, 0x032f85fd, 0x02d723bb, 0x01724312, 0x013c7b46, 0x00773ca7, 0x00072742}}}, + {X: Field{[10]uint32{0x03385f27, 0x0280fb72, 0x03622003, 0x008f9883, 0x03969042, 0x00b9dd6f, 0x02bdc229, 0x033a3499, 0x03b3481e, 0x00387f75}}, Y: Field{[10]uint32{0x030a4c77, 0x01019aa5, 0x03e6d09e, 0x024f8840, 0x03d9b31f, 0x00ff71a9, 0x02dee658, 0x00ffdc35, 0x039f2895, 0x000f3eac}}}, + {X: Field{[10]uint32{0x0223ffd3, 0x037c46a8, 0x018803b2, 0x0396fc62, 0x039ed85f, 0x0084c323, 0x02701c92, 0x02ee3cf5, 0x01342b69, 0x00259e5c}}, Y: Field{[10]uint32{0x02631d31, 0x025f91c3, 0x0394e059, 0x031b0255, 0x02632c0d, 0x034a68f9, 0x00b6d93c, 0x01be7df1, 0x003f630b, 0x000b50cd}}}, + {X: Field{[10]uint32{0x01c33efc, 0x020505f6, 0x03ba8cba, 0x01b66a67, 0x00ec0a77, 0x02677520, 0x01d2a0f3, 0x0352531a, 0x02186e27, 0x0037ed00}}, Y: Field{[10]uint32{0x0137796e, 0x01ec4ad7, 0x00f4861f, 0x00705e08, 0x009bd850, 0x02580c14, 0x0245bcb7, 0x00c9cc57, 0x01dce9f9, 0x000ccb64}}}, + {X: Field{[10]uint32{0x027681ec, 0x02e11a30, 0x035e5189, 0x0011fef8, 0x01171de0, 0x017068cc, 0x0208da7b, 0x03729145, 0x01ebed13, 0x001ad971}}, Y: Field{[10]uint32{0x01a34f62, 0x01e723a2, 0x01f43e26, 0x0137d6ee, 0x013e71fc, 0x01bf53e1, 0x0246b51f, 0x02f02cbc, 0x02e8e0ae, 0x0002bf43}}}, + {X: Field{[10]uint32{0x00c4b619, 0x00e43d4a, 0x0100480a, 0x008bf7f3, 0x03021e5c, 0x03509b7c, 0x02396aa5, 0x00e59789, 0x01a160b0, 0x002f070f}}, Y: Field{[10]uint32{0x00a31640, 0x03b5192b, 0x03bc8076, 0x0334d6b2, 0x0386ad94, 0x0108b046, 0x017862c0, 0x03faa42b, 0x017465e4, 0x003f595c}}}, + {X: Field{[10]uint32{0x0005913a, 0x004f7ea3, 0x038e2de6, 0x001b0b1b, 0x01090264, 0x02f161f8, 0x038a6a8c, 0x0328d54f, 0x011796d6, 0x001626c7}}, Y: Field{[10]uint32{0x003fb3e0, 0x00b2eb94, 0x02c87974, 0x01a76917, 0x003c7b64, 0x00eee8a9, 0x039365de, 0x013d1b89, 0x01ecac25, 0x00399575}}}, + {X: Field{[10]uint32{0x00ae4ed5, 0x016fe61e, 0x01677612, 0x033f3a9d, 0x016ada63, 0x024b652f, 0x01c2ef5c, 0x01b0aa53, 0x03856d1e, 0x00279c98}}, Y: Field{[10]uint32{0x00e304dd, 0x03d4d058, 0x01896069, 0x01010f24, 0x030a83bc, 0x0371ea8a, 0x028a48e0, 0x00e3e2d8, 0x01f51e5b, 0x002308e3}}}, + {X: Field{[10]uint32{0x02764263, 0x02d76f71, 0x018d57ea, 0x02bc9548, 0x004f9bd3, 0x00820380, 0x000c551b, 0x03dd3ee9, 0x017814e0, 0x000489a7}}, Y: Field{[10]uint32{0x0385b3d6, 0x017e1938, 0x01a704a9, 0x031f08b7, 0x00daee58, 0x02f45a48, 0x02febcdb, 0x025d7041, 0x00bd6584, 0x0003c3dc}}}, + {X: Field{[10]uint32{0x033088a6, 0x0245ced5, 0x03aa315e, 0x02fc59db, 0x005c73fd, 0x009cfbff, 0x0048cdd6, 0x02405383, 0x032fcc50, 0x0034c84b}}, Y: Field{[10]uint32{0x0032df82, 0x01902112, 0x02fc09db, 0x03aa14fe, 0x00ff59b6, 0x0271a4d3, 0x02618c84, 0x03d47cd8, 0x01f10673, 0x000e6bce}}}, + {X: Field{[10]uint32{0x00250052, 0x01168821, 0x02dccdae, 0x03f67d0a, 0x034ef288, 0x03d92588, 0x0014e724, 0x002eb510, 0x032b9bcc, 0x00314d7d}}, Y: Field{[10]uint32{0x02271022, 0x0171fb92, 0x000a7465, 0x0008a4c0, 0x02884473, 0x01f3a0a6, 0x0014a17f, 0x018c6d8a, 0x005b6fb7, 0x000fde66}}}, + {X: Field{[10]uint32{0x03399605, 0x003eb4e4, 0x03c121c8, 0x004bb035, 0x03271e39, 0x003b437d, 0x002bb186, 0x027e9618, 0x01269b16, 0x0013d6dc}}, Y: Field{[10]uint32{0x01cfd0a7, 0x0104d8f3, 0x00fb5dbe, 0x03c81881, 0x02576f63, 0x025f24ca, 0x002c6cdb, 0x0163aa44, 0x01047f2a, 0x002d83f0}}}, + {X: Field{[10]uint32{0x03d5d065, 0x0323c6ed, 0x03851de9, 0x01f5cde9, 0x000ec70e, 0x0000a705, 0x02c2863e, 0x00e2c6bc, 0x033b244c, 0x0032d166}}, Y: Field{[10]uint32{0x0157fbd0, 0x01d293c6, 0x010ea53a, 0x0055a4b2, 0x02a888bd, 0x03a242ce, 0x02462411, 0x01db20bd, 0x015d3c03, 0x001ed9ec}}}, + {X: Field{[10]uint32{0x0219054e, 0x00a87e93, 0x02597ea7, 0x018f4691, 0x02d389f5, 0x03d0d065, 0x03121bb7, 0x03831463, 0x01c70ebd, 0x001e1f58}}, Y: Field{[10]uint32{0x0272a658, 0x00ef2fab, 0x014ba4b9, 0x02ef5cad, 0x03f42e9e, 0x02cf4542, 0x031cf396, 0x0232e309, 0x02f25fcf, 0x0016ebd5}}}, + {X: Field{[10]uint32{0x01f6115c, 0x00edbaf1, 0x012bacc9, 0x0229808d, 0x02337353, 0x0358e420, 0x037d97cb, 0x02c3252d, 0x002a31d0, 0x0030e2bf}}, Y: Field{[10]uint32{0x03ee529f, 0x0109a210, 0x004690d8, 0x022f4b96, 0x01875e09, 0x01917e35, 0x01a26a4c, 0x03f3092e, 0x03cab138, 0x002e4977}}}, + {X: Field{[10]uint32{0x03406d0a, 0x0321e6bf, 0x0282ad6e, 0x002e2ade, 0x0339a5dd, 0x016e6c97, 0x01c6ad5e, 0x01ba56e7, 0x023b8e60, 0x000dd987}}, Y: Field{[10]uint32{0x03e9b977, 0x02c58e29, 0x002a4df1, 0x00e44c8e, 0x0160d8bc, 0x01b3e510, 0x017e07bd, 0x023f384c, 0x025d430d, 0x002adcd7}}}, + {X: Field{[10]uint32{0x01e256ba, 0x01a28594, 0x02062abd, 0x0367d939, 0x0388ea5a, 0x0370319d, 0x018e9348, 0x00ad1f0f, 0x0051b8c2, 0x0039449e}}, Y: Field{[10]uint32{0x030405c6, 0x01fce1c9, 0x004b3f94, 0x0136e1c1, 0x025b1e7d, 0x0154dffe, 0x034b7dc0, 0x027ade42, 0x037e0034, 0x001611fd}}}, + {X: Field{[10]uint32{0x017382e9, 0x0191ee6b, 0x03b41955, 0x02601482, 0x02127a36, 0x00e03f81, 0x013e7cb7, 0x02a284dc, 0x005da6b8, 0x003cf1fd}}, Y: Field{[10]uint32{0x023e7c87, 0x0397ef7d, 0x00a51ddf, 0x0005c675, 0x034b4693, 0x00024d9d, 0x01decd09, 0x0274c7dc, 0x0211eb1b, 0x000ab3e6}}}, + {X: Field{[10]uint32{0x00d745ba, 0x012cbc21, 0x024de0ff, 0x0254eec3, 0x0279125f, 0x0122a642, 0x03733a18, 0x02c94948, 0x0047e8d5, 0x0021b790}}, Y: Field{[10]uint32{0x01bc969a, 0x0269d19c, 0x02007427, 0x00146a7b, 0x03569211, 0x0177a4b4, 0x0284cf7d, 0x000174ac, 0x00720dac, 0x001c79a9}}}, + {X: Field{[10]uint32{0x03f57504, 0x021d70bc, 0x02c635e2, 0x032b0317, 0x023029d9, 0x03cea85a, 0x020cd963, 0x02759b65, 0x00307225, 0x00318457}}, Y: Field{[10]uint32{0x037a712f, 0x004a1427, 0x0077050d, 0x0004d10f, 0x01ced024, 0x00f20868, 0x017f56c2, 0x0375e35e, 0x00d0b33f, 0x000635a4}}}, + {X: Field{[10]uint32{0x02f53c5b, 0x034d9d10, 0x03c6ac61, 0x03c78afe, 0x018bfae0, 0x01a4a6c1, 0x0038cbd7, 0x011cee46, 0x00998b43, 0x0032d514}}, Y: Field{[10]uint32{0x01572bbf, 0x0236de24, 0x00ddfde3, 0x02e9efed, 0x01c00ba8, 0x026e77d5, 0x03684b4f, 0x013c2335, 0x034d79e3, 0x00104675}}}, + {X: Field{[10]uint32{0x02922d2a, 0x014bca14, 0x013725a7, 0x01cf1b42, 0x020a333b, 0x0182a628, 0x01771e26, 0x00aed3ec, 0x0304b936, 0x00343739}}, Y: Field{[10]uint32{0x02e37e47, 0x028e4565, 0x018ffde5, 0x01529314, 0x02124d3f, 0x016730bb, 0x033891a2, 0x033837c7, 0x03707947, 0x003e4b0e}}}, + {X: Field{[10]uint32{0x016b20a4, 0x02866fc8, 0x03a96249, 0x01679f5c, 0x03d42702, 0x01957314, 0x02ab8570, 0x016618e3, 0x0238e5aa, 0x0036e4f8}}, Y: Field{[10]uint32{0x03bcc7c5, 0x035fad7e, 0x0094c815, 0x025718bf, 0x033ab178, 0x009bbd95, 0x034f60cd, 0x023ad942, 0x008b670e, 0x00234677}}}, + {X: Field{[10]uint32{0x00c3f486, 0x01753bda, 0x01835ba8, 0x03f2efc4, 0x014d6c6c, 0x001e584a, 0x0207e54b, 0x02fbe0a7, 0x037fd8ce, 0x0030e1f0}}, Y: Field{[10]uint32{0x01ddeda9, 0x03f9e384, 0x00897994, 0x0036d896, 0x03c8e3ae, 0x004b5ff9, 0x020f7d7f, 0x02cc01b2, 0x00d9ae7e, 0x00214960}}}, + {X: Field{[10]uint32{0x0206c232, 0x00dd271d, 0x01092f94, 0x03748eb6, 0x024d3b22, 0x024aed2d, 0x0001b5b1, 0x039544df, 0x0134f04d, 0x003aed63}}, Y: Field{[10]uint32{0x01d1ae16, 0x01223f37, 0x0112bc59, 0x00b14272, 0x03d92ae7, 0x0016af26, 0x01d3e829, 0x03e7536c, 0x01059c99, 0x0006e5e7}}}, + {X: Field{[10]uint32{0x02e38e6b, 0x017390a5, 0x038d8252, 0x022befc8, 0x032f1317, 0x00c32b44, 0x01810b17, 0x028a6dd9, 0x0066acfd, 0x001e2473}}, Y: Field{[10]uint32{0x027caaf1, 0x02b3d94d, 0x02db972f, 0x039f6c02, 0x03a21ff6, 0x01fb2bb0, 0x02987ad0, 0x0231b118, 0x03292018, 0x0008864d}}}, + {X: Field{[10]uint32{0x0014d081, 0x014378d6, 0x011f472c, 0x0003028c, 0x000acec8, 0x01e4ff63, 0x02578a53, 0x007a34b0, 0x0142e4bc, 0x00302c09}}, Y: Field{[10]uint32{0x017f8371, 0x0262f06d, 0x01673136, 0x0213afff, 0x0376b1a8, 0x00702465, 0x02e6bb57, 0x005f0006, 0x00710f59, 0x000092f7}}}, + {X: Field{[10]uint32{0x0026d2dd, 0x028dad71, 0x014b2f07, 0x03d13acf, 0x03c2000c, 0x0103a980, 0x02fd9a3e, 0x01141fc4, 0x0174b870, 0x003a8575}}, Y: Field{[10]uint32{0x0230944e, 0x00969462, 0x0124b6ca, 0x01b16269, 0x00c5cdc1, 0x02df8e25, 0x00faf58a, 0x028e7d38, 0x014f4d8c, 0x002d965b}}}, + {X: Field{[10]uint32{0x039604de, 0x006dde73, 0x006726e5, 0x02604d63, 0x02708776, 0x009274d3, 0x00d5726a, 0x01abdee2, 0x03dfc35a, 0x001df4e1}}, Y: Field{[10]uint32{0x008b4a87, 0x0336693c, 0x0324993f, 0x001b7805, 0x01459165, 0x013e8ac7, 0x013c2351, 0x02a58b4b, 0x02cd2d70, 0x003976bb}}}, + {X: Field{[10]uint32{0x01ccd7ec, 0x01aa7727, 0x02db8329, 0x03530c54, 0x031064f9, 0x035bfbee, 0x024dc2f9, 0x0093ef06, 0x02cb7d1a, 0x002a49d0}}, Y: Field{[10]uint32{0x01679f76, 0x0063908c, 0x0225ad9d, 0x018ecf9c, 0x0266d4f1, 0x0208fcf1, 0x0346df60, 0x03c293b0, 0x00f98cda, 0x001996a7}}}, + {X: Field{[10]uint32{0x02316a46, 0x02c417e9, 0x02b6f36c, 0x0368a783, 0x00f62de9, 0x01ed54c1, 0x034053d3, 0x00e4f574, 0x00f79f0c, 0x00094f95}}, Y: Field{[10]uint32{0x027155e0, 0x038cfaf3, 0x03fd7b2a, 0x01fe3f82, 0x0067c857, 0x016c9fbc, 0x029417ac, 0x03b030ca, 0x00cded78, 0x0015385a}}}, + {X: Field{[10]uint32{0x0003fbf2, 0x01173000, 0x004434ee, 0x031eccf6, 0x0255fc01, 0x038e00a6, 0x039586f9, 0x021c8185, 0x00e0e9c3, 0x00344c12}}, Y: Field{[10]uint32{0x00743f37, 0x01d42021, 0x021e3640, 0x0102e6f1, 0x01af2578, 0x02c9470e, 0x00906897, 0x0091de15, 0x02db9450, 0x001f1119}}}, + {X: Field{[10]uint32{0x00a284a2, 0x001194dc, 0x032c88e6, 0x00dca958, 0x02a632b2, 0x02f6f26a, 0x007d0797, 0x008488a2, 0x0110387c, 0x003a48d0}}, Y: Field{[10]uint32{0x036523c4, 0x02c33edb, 0x0363ae80, 0x0147dd03, 0x01839a26, 0x01be63b6, 0x03b3afe6, 0x01486d3f, 0x008c4ca3, 0x000ae62c}}}, + {X: Field{[10]uint32{0x03a29be5, 0x02a76b60, 0x0271332b, 0x007253e2, 0x00742834, 0x02ec95d9, 0x0091a5a7, 0x01e3bdce, 0x03a7ab69, 0x000c0b80}}, Y: Field{[10]uint32{0x0310120b, 0x028be0d5, 0x002eea98, 0x036d9102, 0x030e8430, 0x0395aecf, 0x02e850d2, 0x00d6facb, 0x02db210c, 0x0012af82}}}, + {X: Field{[10]uint32{0x01665368, 0x03345584, 0x008598d7, 0x0370c75a, 0x024fea8b, 0x02c3e31e, 0x020571ee, 0x003cc372, 0x03894440, 0x0014dc04}}, Y: Field{[10]uint32{0x02a97cbe, 0x0069d3fa, 0x02d1971b, 0x036fc5a9, 0x01a712e2, 0x02a68db8, 0x0331bbe5, 0x03c88695, 0x026439c1, 0x00328d15}}}, + {X: Field{[10]uint32{0x028383cd, 0x0254a6bc, 0x00ff4957, 0x0375508f, 0x01656aaa, 0x0168b4e6, 0x012b6f7a, 0x01f2e3eb, 0x0186645d, 0x002303a0}}, Y: Field{[10]uint32{0x0048d27f, 0x035dd5d3, 0x018ffcdc, 0x013b2538, 0x0263c6d2, 0x023eed20, 0x007319d1, 0x0126064c, 0x01ea14c4, 0x000bbc9d}}}, + {X: Field{[10]uint32{0x03ad8af5, 0x010f5e97, 0x0101dafc, 0x004b1a5e, 0x01adddc5, 0x03fe32a6, 0x01615c45, 0x028f2684, 0x003126ba, 0x001929c2}}, Y: Field{[10]uint32{0x02fe29d5, 0x014f9c2a, 0x0342c432, 0x0128a23d, 0x00148efe, 0x02ec5e5a, 0x0245c354, 0x017dab0e, 0x008b59a6, 0x002e90f1}}}, + {X: Field{[10]uint32{0x01438e06, 0x02d1ea97, 0x0268051d, 0x033ed3d5, 0x0363559a, 0x00598917, 0x03785e2e, 0x023892cb, 0x026e82ff, 0x003f6f41}}, Y: Field{[10]uint32{0x02973d63, 0x038aa104, 0x03def144, 0x0356c905, 0x02875731, 0x022e5267, 0x02a5d382, 0x036308dd, 0x01cfa19e, 0x0001836b}}}, + {X: Field{[10]uint32{0x02ad174f, 0x009bd07b, 0x03e0af1b, 0x033cb72c, 0x0282cf15, 0x02518544, 0x01dba01d, 0x001cc467, 0x00b81ff9, 0x002ca1f3}}, Y: Field{[10]uint32{0x0374e090, 0x02f7027e, 0x01bd1acf, 0x02af000e, 0x0236d1be, 0x036d9bb4, 0x038a4635, 0x002fb92c, 0x03397a9a, 0x001bfc54}}}, + {X: Field{[10]uint32{0x01068116, 0x035735ff, 0x02c3c962, 0x015c06f7, 0x033b3f84, 0x02cc0cbe, 0x01f21888, 0x00d293e9, 0x0248b652, 0x0006011e}}, Y: Field{[10]uint32{0x0224574b, 0x01385681, 0x0117b1f3, 0x00244068, 0x01801342, 0x033a95a0, 0x02c54446, 0x0220c8c1, 0x02691819, 0x0004d89d}}}, + {X: Field{[10]uint32{0x0235f914, 0x01f9ea00, 0x02aae0ce, 0x03a56f52, 0x026b74ff, 0x0290784d, 0x022dd328, 0x00b39622, 0x014fbe4e, 0x003c74ed}}, Y: Field{[10]uint32{0x00a3981a, 0x03589dea, 0x0233be86, 0x01965fbf, 0x02c0c211, 0x0212188c, 0x02e1471e, 0x0205fad2, 0x0141300e, 0x000df097}}}, + {X: Field{[10]uint32{0x013bec4a, 0x00e8db61, 0x02a839ce, 0x00db1788, 0x019770da, 0x0042b55b, 0x03509a60, 0x037eadff, 0x01e95046, 0x0026c36a}}, Y: Field{[10]uint32{0x00135faa, 0x01dd40ce, 0x024d96da, 0x006468a4, 0x03df757c, 0x010e0a73, 0x00bbc3ff, 0x0168dba0, 0x034530c2, 0x0009f580}}}, + {X: Field{[10]uint32{0x0099c5cc, 0x03635976, 0x025f9f13, 0x0093cbad, 0x022d3e4d, 0x01c5d5a3, 0x0255d403, 0x03462c2f, 0x03d95155, 0x003420ce}}, Y: Field{[10]uint32{0x024741e8, 0x01cef265, 0x01de13c4, 0x020bb13a, 0x02ffeefb, 0x01b6dc51, 0x03b1e4c5, 0x012ad447, 0x02c3b504, 0x0039426b}}}, + {X: Field{[10]uint32{0x03c37117, 0x00ca788b, 0x038a626c, 0x01885f27, 0x03ed62ad, 0x01e6039a, 0x0201b402, 0x005f90a2, 0x027c185f, 0x00231058}}, Y: Field{[10]uint32{0x023662f7, 0x016dee4e, 0x01ca77d9, 0x01071ccb, 0x02a36da4, 0x020fdcfb, 0x028a1e74, 0x029548df, 0x026c3316, 0x001d7288}}}, + {X: Field{[10]uint32{0x03728d27, 0x018a0ec9, 0x0311e7cc, 0x01b96d42, 0x002d75c2, 0x0284ee5f, 0x007099e9, 0x02a8c173, 0x0105e43a, 0x000dc7c0}}, Y: Field{[10]uint32{0x02b3ce99, 0x00ee031a, 0x0149b029, 0x009b3b7c, 0x01b11944, 0x0114e3ab, 0x00643120, 0x01b5a233, 0x03e7d097, 0x00325a76}}}, + {X: Field{[10]uint32{0x00cb1710, 0x03fef70b, 0x03e03541, 0x020dea3c, 0x02d94aeb, 0x01761930, 0x034d3a18, 0x028d63e2, 0x019a4238, 0x001440bd}}, Y: Field{[10]uint32{0x01ef1445, 0x008824e1, 0x016ce915, 0x030e27a6, 0x010bbffd, 0x035072af, 0x0130606c, 0x00f0fd33, 0x00f9adb6, 0x00278531}}}, + {X: Field{[10]uint32{0x03f08beb, 0x00aea9c7, 0x00cc26df, 0x02bef52a, 0x00a7f57e, 0x00d858bc, 0x00353c78, 0x0100f01e, 0x036cfd40, 0x00032886}}, Y: Field{[10]uint32{0x037f12f9, 0x038f9607, 0x03ffee6a, 0x02085092, 0x03d6b684, 0x0147b6c3, 0x019f2ef7, 0x02956cff, 0x004647eb, 0x0004228f}}}, + {X: Field{[10]uint32{0x01d775d9, 0x0139a28c, 0x007697c9, 0x00b2b310, 0x017ec364, 0x00038f72, 0x0368bc82, 0x034673a0, 0x00b3ff40, 0x00367351}}, Y: Field{[10]uint32{0x005f0901, 0x03257ad2, 0x033cb085, 0x006d6eaf, 0x03fd7c4a, 0x01e7792b, 0x00f71010, 0x03dc0753, 0x036c683e, 0x002dadbe}}}, + {X: Field{[10]uint32{0x01a10360, 0x02f7d105, 0x021e104f, 0x0020ff31, 0x00510da5, 0x006f5241, 0x01644267, 0x01a222ed, 0x00b2cbcb, 0x002684d5}}, Y: Field{[10]uint32{0x034f953a, 0x03a2e0a1, 0x01b9b710, 0x03ce0776, 0x03bc4927, 0x00f8900d, 0x023a2a89, 0x0122d136, 0x0291707c, 0x000fd7d4}}}, + {X: Field{[10]uint32{0x010fdf79, 0x002ae76b, 0x02941bd5, 0x0314e1a4, 0x0220fc60, 0x03ac3f6f, 0x03deb0bc, 0x020712b9, 0x020f271a, 0x00317957}}, Y: Field{[10]uint32{0x01c83a63, 0x001ddbff, 0x000aecb1, 0x01f5c228, 0x0285ed9e, 0x018aba4e, 0x0253e7cc, 0x024c041e, 0x0335eab4, 0x0004e283}}}, + {X: Field{[10]uint32{0x0060f919, 0x0012bb64, 0x012c69a0, 0x01c81667, 0x027c67ea, 0x03317d98, 0x010e4dc6, 0x02f4f48a, 0x03647f66, 0x0017af0b}}, Y: Field{[10]uint32{0x0054659c, 0x0265b582, 0x00f1e56e, 0x0182c432, 0x033ec1e8, 0x014da58d, 0x00f79206, 0x0217889f, 0x03cedf20, 0x001a3df6}}}, + {X: Field{[10]uint32{0x03966e03, 0x0041d733, 0x00b2da42, 0x02074e96, 0x00161d70, 0x029e7258, 0x011a5a79, 0x00374141, 0x039c7d06, 0x0013ca3a}}, Y: Field{[10]uint32{0x0267fafc, 0x03cf8174, 0x02a6c2ef, 0x00f4b3c4, 0x0044849f, 0x028abf9e, 0x02aeb8e4, 0x011d06ec, 0x00610543, 0x003b0de2}}}, + {X: Field{[10]uint32{0x0283fe8f, 0x0056d286, 0x005c0efe, 0x03b95fb2, 0x019fa039, 0x002cd1f2, 0x00c7a9a1, 0x00f82614, 0x00d1ce11, 0x003d4388}}, Y: Field{[10]uint32{0x02e975be, 0x026ff0fe, 0x00aa94db, 0x01e09f55, 0x00cee464, 0x00501fc8, 0x018595f6, 0x01068a08, 0x023190df, 0x00136df0}}}, + {X: Field{[10]uint32{0x03eff5ef, 0x021068ea, 0x01e76ab2, 0x01735092, 0x0079de94, 0x015620af, 0x038cdf2b, 0x02ae5775, 0x02d01ade, 0x003339ac}}, Y: Field{[10]uint32{0x00626e52, 0x0109f94d, 0x02bd5604, 0x02be7e89, 0x01bab1db, 0x0182c6f5, 0x03764bb5, 0x00502bf7, 0x02741312, 0x00075a41}}}, + {X: Field{[10]uint32{0x032d8475, 0x003b5ba7, 0x03bbfbc8, 0x0394b4d2, 0x01e4830b, 0x016bf3b0, 0x00c73121, 0x0155f4bb, 0x0174fb10, 0x00156994}}, Y: Field{[10]uint32{0x038012c0, 0x032245c9, 0x03eec611, 0x03539cd4, 0x023f0623, 0x01524e01, 0x00dd4126, 0x014dea5c, 0x01f1de1e, 0x0031a5e5}}}, + {X: Field{[10]uint32{0x0127f290, 0x03b4a298, 0x00ab0267, 0x0065d965, 0x02d0c1d8, 0x01eb2351, 0x022779e9, 0x02cf71f8, 0x00fa7b4d, 0x001e0887}}, Y: Field{[10]uint32{0x03c46a54, 0x014fa432, 0x00b663ad, 0x0030b8d6, 0x02ace066, 0x03aad594, 0x003a1582, 0x02318922, 0x01edfd8e, 0x00237735}}}, + {X: Field{[10]uint32{0x006ed178, 0x00b5bea6, 0x03f9602b, 0x038a3e4b, 0x009006cc, 0x00041e0b, 0x00da39d6, 0x0390d3b5, 0x0039441e, 0x0026e614}}, Y: Field{[10]uint32{0x02c6cfa4, 0x0397e704, 0x003bb85f, 0x0385cfc0, 0x028a50da, 0x0364e230, 0x03f67d22, 0x01ecade2, 0x01c87b53, 0x003873e1}}}, + {X: Field{[10]uint32{0x037edf20, 0x027c8103, 0x004f38ae, 0x02c0a477, 0x026c27e7, 0x026d9d5e, 0x01b9d78d, 0x0123795f, 0x03b14a9e, 0x0026a8bf}}, Y: Field{[10]uint32{0x037d1040, 0x022dfd8d, 0x00a115ff, 0x03549dcb, 0x018f80d7, 0x0164a54b, 0x00066ef8, 0x03de53f8, 0x03e378e0, 0x001dc71e}}}, + {X: Field{[10]uint32{0x02937e1f, 0x0166a271, 0x02c021e3, 0x0145b603, 0x00949de2, 0x00248a83, 0x00510cb4, 0x02d18c5f, 0x008366a0, 0x00344164}}, Y: Field{[10]uint32{0x02c8630e, 0x0105517e, 0x000ac99c, 0x00bebb1e, 0x020e5e6f, 0x03117836, 0x017155c0, 0x011052a2, 0x0225c9ea, 0x0021014e}}}, + {X: Field{[10]uint32{0x01c5d066, 0x028bfc7e, 0x027c23e7, 0x03671c2e, 0x031ac58a, 0x00aa07df, 0x01c2d810, 0x02612bfb, 0x02cf7456, 0x0007cfb2}}, Y: Field{[10]uint32{0x01a23e54, 0x00d7601c, 0x00d94cd4, 0x018b83e6, 0x0015f1f3, 0x0085a07e, 0x034539ef, 0x0093c5cf, 0x00fa2bfd, 0x0031ab76}}}, + {X: Field{[10]uint32{0x022c4371, 0x03372836, 0x024fe569, 0x001bacd4, 0x035e504d, 0x01b23e51, 0x0151ece8, 0x0032b495, 0x0309a16d, 0x0028c4b1}}, Y: Field{[10]uint32{0x03ae7b03, 0x01e00e6c, 0x039690c7, 0x00a6b1ef, 0x0008c1fc, 0x01ad6ee1, 0x009ea2c6, 0x03176882, 0x002aea04, 0x002197b3}}}, + {X: Field{[10]uint32{0x004197af, 0x03ccbd9d, 0x0169d953, 0x036c405f, 0x008c3493, 0x030bbb4e, 0x00f64109, 0x02e9e3ef, 0x0275e829, 0x003c8711}}, Y: Field{[10]uint32{0x018b2f57, 0x03dd2b42, 0x03ef2b37, 0x01cd20b4, 0x01043d93, 0x028dec0f, 0x030ee061, 0x01f2bd76, 0x033e4337, 0x003f4b19}}}, + {X: Field{[10]uint32{0x00865692, 0x03b5f006, 0x014268fe, 0x00ce9cef, 0x01f48369, 0x02146acc, 0x00b2eb61, 0x02680bef, 0x00ea2a02, 0x0004585d}}, Y: Field{[10]uint32{0x030aaefd, 0x01cb5375, 0x00352ee7, 0x015512d9, 0x0125cf38, 0x01bd7475, 0x03ca2a2d, 0x02b676d7, 0x0027e1ce, 0x000848f4}}}, + {X: Field{[10]uint32{0x03f9d663, 0x00cd7e9c, 0x0260a962, 0x0343d79f, 0x022334fc, 0x015f9cb5, 0x00a21173, 0x0131b3d9, 0x03d0919e, 0x000d639d}}, Y: Field{[10]uint32{0x0037bc08, 0x02dbad9e, 0x020cb8b5, 0x02be821a, 0x03dcf5cd, 0x0222b1f3, 0x03819859, 0x03d00c41, 0x02206f99, 0x001fbe35}}}, + {X: Field{[10]uint32{0x02a33fa9, 0x031b6aae, 0x0060db86, 0x02cea04d, 0x008056de, 0x00597eab, 0x0157e203, 0x03c518e4, 0x020d9e81, 0x001427df}}, Y: Field{[10]uint32{0x00db6ea9, 0x016e34a8, 0x03090a09, 0x017f0eff, 0x03fd1216, 0x00fc6b4e, 0x028645f9, 0x02db139a, 0x021a340e, 0x00154523}}}, + {X: Field{[10]uint32{0x02a4ed09, 0x031f9ab4, 0x020b9ad9, 0x02f50e00, 0x00a15c95, 0x00d1bc87, 0x01e30c49, 0x0038987a, 0x025c185f, 0x000d638c}}, Y: Field{[10]uint32{0x0118c4b8, 0x026d97cb, 0x01b3d97f, 0x02f4d1e2, 0x0154aa11, 0x02cf5861, 0x02ef6903, 0x0056ca04, 0x0074c977, 0x00017f30}}}, + {X: Field{[10]uint32{0x01a2fc4c, 0x00daf8f7, 0x00d2608d, 0x00411e24, 0x02e314c3, 0x00962780, 0x0337e4ea, 0x02bcb4df, 0x012dbc00, 0x0007871c}}, Y: Field{[10]uint32{0x010655dc, 0x02c7da92, 0x00c145bf, 0x01d410b5, 0x03974e7e, 0x034c2ce2, 0x0398cf5a, 0x01aef8d9, 0x039ae313, 0x00012263}}}, + {X: Field{[10]uint32{0x03ffcd1d, 0x025ed5c8, 0x03918bd7, 0x0081cd86, 0x0064e317, 0x0202a564, 0x03b794dc, 0x01e6c3fc, 0x039aaa3f, 0x0029945b}}, Y: Field{[10]uint32{0x0254f5d4, 0x0140c00e, 0x00f9bed5, 0x0373af6f, 0x02812373, 0x01f1f0c4, 0x0377b074, 0x02e0c14f, 0x006b59f3, 0x003164d3}}}, + {X: Field{[10]uint32{0x01098155, 0x00046e2c, 0x01b79295, 0x00cf6966, 0x0150cb56, 0x00c1111a, 0x03ab8240, 0x006e12e7, 0x00d88b1e, 0x00391ad2}}, Y: Field{[10]uint32{0x00c94f51, 0x01e4d96c, 0x00a80a5d, 0x02033654, 0x003e7c8a, 0x0165d0d4, 0x002e5512, 0x0265db8d, 0x02244a33, 0x0010fa6e}}}, + {X: Field{[10]uint32{0x0365aa0b, 0x00cdc34f, 0x03400e58, 0x01000489, 0x00e1cc2d, 0x037e79c5, 0x025105b1, 0x030b8018, 0x009997a9, 0x00329e94}}, Y: Field{[10]uint32{0x02e1f071, 0x007abf99, 0x02039b7a, 0x011334b3, 0x0319c618, 0x03df2c3b, 0x01994fce, 0x03346883, 0x00e4d2ee, 0x00376329}}}, + {X: Field{[10]uint32{0x02313f08, 0x003561a5, 0x02d0da39, 0x027bb007, 0x00848659, 0x01de1b10, 0x01352d4b, 0x015dbc44, 0x02c0d29b, 0x000c9ad7}}, Y: Field{[10]uint32{0x0011d384, 0x020a2a04, 0x0126495e, 0x0280f693, 0x01c2d5d3, 0x0356ca83, 0x02a60633, 0x01952f9e, 0x0171a4ac, 0x003d28fc}}}, + {X: Field{[10]uint32{0x030d306d, 0x024c8a39, 0x03e2b392, 0x03bb944b, 0x017c5bf8, 0x03fa6eb6, 0x017038db, 0x031d6a95, 0x018254f5, 0x0002dd8a}}, Y: Field{[10]uint32{0x003606c5, 0x036cf6c5, 0x016fbf92, 0x01d4e612, 0x020cc85c, 0x035f7a2f, 0x035bb2d0, 0x00fa18b1, 0x039fb36e, 0x0022e023}}}, + {X: Field{[10]uint32{0x032286ca, 0x026886e1, 0x014f5ef7, 0x0295e419, 0x03ae66f1, 0x03c6a046, 0x0250a096, 0x00dbff77, 0x00e12b1d, 0x0022f589}}, Y: Field{[10]uint32{0x011f02df, 0x02e015eb, 0x004d0fe9, 0x02885c15, 0x038bf6a2, 0x01108d2b, 0x0331c747, 0x022586d9, 0x022ef453, 0x0019a1fa}}}, + {X: Field{[10]uint32{0x01de48a9, 0x02349741, 0x03da42d7, 0x00cf555c, 0x01509d1c, 0x03e11b19, 0x01414ccc, 0x024a402f, 0x02c72a9f, 0x003b497a}}, Y: Field{[10]uint32{0x00d89eaa, 0x0287ad40, 0x028b98f3, 0x03407dce, 0x018705a9, 0x020b35ef, 0x011583c6, 0x03f40edb, 0x01ed2710, 0x00155bea}}}, + {X: Field{[10]uint32{0x00bc02bf, 0x012e79c2, 0x000600df, 0x030778a0, 0x000e8fac, 0x01d57ecc, 0x027bc94c, 0x01aa1271, 0x036c9ed7, 0x003c650e}}, Y: Field{[10]uint32{0x002a40a7, 0x023295a2, 0x004b0481, 0x00cb7c7e, 0x03a31562, 0x00b2e1db, 0x00bb6464, 0x01383dab, 0x020885dc, 0x002631ee}}}, + {X: Field{[10]uint32{0x01e9e5d3, 0x01460ca9, 0x02f391d3, 0x0085ab23, 0x03834228, 0x033b6b9e, 0x0024276d, 0x02ae3ec3, 0x03142de3, 0x00316d82}}, Y: Field{[10]uint32{0x02b5cd69, 0x00ab37e7, 0x01260e91, 0x01e381f0, 0x02332595, 0x00535297, 0x01e10d90, 0x039827d5, 0x00da1174, 0x0033a1b9}}}, + {X: Field{[10]uint32{0x013755ab, 0x00b10252, 0x014f592e, 0x000305a3, 0x01c77782, 0x014fe678, 0x019647b2, 0x03f98ccd, 0x038e706c, 0x0002c198}}, Y: Field{[10]uint32{0x0344bbd5, 0x0228e0f2, 0x0369d3e8, 0x01ee1f9f, 0x03e16dd3, 0x027e54d5, 0x02e24933, 0x0148a44d, 0x03ab1b4d, 0x00399007}}}, + {X: Field{[10]uint32{0x024b14cf, 0x00e6df49, 0x03cd89f5, 0x0391a052, 0x03f0ec5f, 0x00cbe958, 0x0250ea54, 0x02b3f4a5, 0x01b5486d, 0x0033be30}}, Y: Field{[10]uint32{0x025a2fcf, 0x01aab046, 0x0166c931, 0x00aac94b, 0x015ed4fd, 0x01875ca0, 0x00939ea7, 0x002f8c00, 0x02c18d0b, 0x00020330}}}, + {X: Field{[10]uint32{0x0385d7ce, 0x011b6892, 0x014f38e5, 0x01009a5d, 0x0162defb, 0x00662c70, 0x00dccac4, 0x03ca857f, 0x004df868, 0x003d85a4}}, Y: Field{[10]uint32{0x038255b3, 0x0098ce9e, 0x023e47f6, 0x00deabab, 0x03de8b4d, 0x01cecc73, 0x03b93e0b, 0x009327c2, 0x00123440, 0x003ee5c4}}}, + {X: Field{[10]uint32{0x018632e3, 0x03d8b0fe, 0x02599a59, 0x0397b602, 0x011613d8, 0x000bfbd3, 0x02516979, 0x0129ecce, 0x0144bc7e, 0x0025ce18}}, Y: Field{[10]uint32{0x00fc16b4, 0x001b4d83, 0x03b6a5a8, 0x0196e9e6, 0x0308e560, 0x010c6bc9, 0x01834a95, 0x0264e4b7, 0x01845842, 0x002f44b5}}}, + {X: Field{[10]uint32{0x030200c8, 0x03390dee, 0x0311b551, 0x03701584, 0x011eb08d, 0x0195ac9e, 0x003a56f6, 0x03e803d0, 0x030c7a70, 0x00251bc4}}, Y: Field{[10]uint32{0x01945b8d, 0x019a5278, 0x0310507a, 0x02529efd, 0x00186d97, 0x02bc15e1, 0x01a923f3, 0x01f981fd, 0x00f6a503, 0x002b35a6}}}, + {X: Field{[10]uint32{0x03929230, 0x0102f730, 0x0287d917, 0x030cd08d, 0x01d5f1af, 0x03034962, 0x038c064f, 0x014ec030, 0x018472c4, 0x003b833c}}, Y: Field{[10]uint32{0x03ff8dc8, 0x01e09927, 0x0191f79c, 0x00a2cdba, 0x008c773c, 0x03289264, 0x014db12f, 0x034e5fa5, 0x035a7fec, 0x003605dd}}}, + {X: Field{[10]uint32{0x01535d7b, 0x018e9ddf, 0x03c21234, 0x0225364e, 0x03ef0072, 0x02ac4a1f, 0x0148b4f4, 0x02961c27, 0x03fe9542, 0x003ccd7d}}, Y: Field{[10]uint32{0x03350283, 0x006140b8, 0x01bf7455, 0x03a69ac6, 0x017639da, 0x023abed3, 0x0389c06d, 0x0174a4d4, 0x01a30246, 0x000cdb92}}}, + {X: Field{[10]uint32{0x017e7739, 0x02c383f2, 0x03f06f0e, 0x01b15675, 0x00b1326d, 0x01daa410, 0x00200d7b, 0x01fe3773, 0x01794fb3, 0x00156fe0}}, Y: Field{[10]uint32{0x03e69bfc, 0x024c28ab, 0x0086632e, 0x0293d274, 0x013053f6, 0x01f5c0fb, 0x002ade6f, 0x017307a4, 0x03007915, 0x00328cf3}}}, + {X: Field{[10]uint32{0x01de29b0, 0x01f5bd8a, 0x0062349b, 0x0004bf83, 0x031033b9, 0x02edb650, 0x022195fa, 0x0369197b, 0x03816143, 0x0037ff33}}, Y: Field{[10]uint32{0x00f0aff7, 0x01d6e71d, 0x0190bbfe, 0x02757f7b, 0x00c04bc3, 0x02178562, 0x029fc06f, 0x012b9f70, 0x03f6e1dc, 0x0026ff7c}}}, + {X: Field{[10]uint32{0x0139dec3, 0x039f608d, 0x0177f3c5, 0x0044ba3d, 0x02c435bc, 0x0155aec4, 0x01c1395b, 0x01be8bf9, 0x009425fc, 0x002e5d23}}, Y: Field{[10]uint32{0x014007a2, 0x032a2a32, 0x016e3dfa, 0x02f18eaa, 0x00f76d31, 0x0354507b, 0x016b2336, 0x0348ed7a, 0x03b2b995, 0x003d48e2}}}, + {X: Field{[10]uint32{0x0297f7ca, 0x00561e2b, 0x039a3fb6, 0x0397e9a8, 0x022c5349, 0x03d4ab66, 0x0329e335, 0x02c55ce3, 0x0054e951, 0x0024b10f}}, Y: Field{[10]uint32{0x012b4a17, 0x02c06558, 0x022bf71b, 0x01e75a29, 0x02bdc4ae, 0x00d92d8a, 0x00924fc6, 0x006f28c2, 0x0373dedd, 0x001f1e9a}}}, + {X: Field{[10]uint32{0x021eb272, 0x02d9ac34, 0x02d96040, 0x03a7d1c9, 0x035677af, 0x01e96248, 0x01ef139d, 0x017957b8, 0x03ea2599, 0x0002c64d}}, Y: Field{[10]uint32{0x03043dd6, 0x024c6033, 0x019195a9, 0x000ea3aa, 0x005585c5, 0x03911253, 0x003e0ca5, 0x031f3f9b, 0x0257544a, 0x00343e56}}}, + {X: Field{[10]uint32{0x0133f457, 0x01b601f0, 0x01fc94a4, 0x01ea3443, 0x00e2a504, 0x00026de2, 0x005a6b72, 0x03892caf, 0x024dbd7e, 0x000b0735}}, Y: Field{[10]uint32{0x020aabe3, 0x01a12dd9, 0x0230cfd8, 0x03ea7a73, 0x027a9449, 0x0179a209, 0x0031a1f0, 0x01e92f9f, 0x03dfce7d, 0x003fa298}}}, + {X: Field{[10]uint32{0x01004834, 0x03d4ff11, 0x014ed447, 0x01a1b321, 0x026d5443, 0x002900f5, 0x0030649b, 0x02a28ada, 0x0278be6e, 0x0013fc42}}, Y: Field{[10]uint32{0x018765d8, 0x00b4a1f9, 0x018bdb36, 0x035ca3d7, 0x01e43384, 0x0138b6c3, 0x001cf5bf, 0x001658ba, 0x00c356d5, 0x002cf2cc}}}, + {X: Field{[10]uint32{0x003d28de, 0x000d563d, 0x0344d9da, 0x0320145c, 0x01f877e8, 0x031c5164, 0x00a7c2a0, 0x01996ad8, 0x03666c90, 0x000cfd56}}, Y: Field{[10]uint32{0x015163f6, 0x0293d90b, 0x01ce08c2, 0x0150e17b, 0x02af1467, 0x024e4c68, 0x020ea80c, 0x017b562b, 0x00ab6aa9, 0x000e6612}}}, + {X: Field{[10]uint32{0x000d3e04, 0x0221eacd, 0x02636020, 0x01b56216, 0x02408da6, 0x03fcb5af, 0x037cc150, 0x00dfac62, 0x03595a72, 0x002e5c48}}, Y: Field{[10]uint32{0x0272363a, 0x01e22cef, 0x00ead817, 0x0223ea1f, 0x02dd125f, 0x031a4c51, 0x03f0ab8f, 0x0316906c, 0x03bd643a, 0x0028a0e8}}}, + {X: Field{[10]uint32{0x00a1035b, 0x0297f058, 0x00dccf0b, 0x02953661, 0x035a4204, 0x03fdcce3, 0x002c1e9f, 0x0250d7d8, 0x00676efa, 0x003483e4}}, Y: Field{[10]uint32{0x03404139, 0x02b9dee3, 0x0086f3fa, 0x01bd9915, 0x01ca1af2, 0x028c545d, 0x004406ce, 0x000fe1c9, 0x007a4520, 0x002b0e8f}}}, + {X: Field{[10]uint32{0x02f41f2d, 0x0252d4ff, 0x02ef54e2, 0x03800fb8, 0x0281d8b3, 0x001cb864, 0x00b2d0bd, 0x027c3511, 0x02a3157c, 0x000c8b5b}}, Y: Field{[10]uint32{0x012936b3, 0x0166d37e, 0x03a97ec3, 0x03dba98a, 0x026e096d, 0x0298e310, 0x02a9e676, 0x00b7799d, 0x03f19dc1, 0x0020e051}}}, + {X: Field{[10]uint32{0x020c26d5, 0x027b67be, 0x024cf8f2, 0x032e52ab, 0x011d2bfa, 0x02b802c3, 0x0164ea7b, 0x0106dadd, 0x00080683, 0x00256497}}, Y: Field{[10]uint32{0x02b92130, 0x01bdfe1d, 0x006d02b4, 0x03f2f749, 0x00edf14c, 0x0081f0bb, 0x015557b2, 0x0088cb09, 0x01b91315, 0x000318fb}}}, + {X: Field{[10]uint32{0x011f70af, 0x03b86f4f, 0x01664c06, 0x00b4f692, 0x03517a71, 0x00e64f35, 0x03fba71e, 0x00637684, 0x02b5d436, 0x001d64aa}}, Y: Field{[10]uint32{0x02eaa410, 0x0274e185, 0x01b457d7, 0x02ba5de8, 0x027a9222, 0x033ea2ac, 0x000aef1c, 0x00a1356b, 0x0077af74, 0x001553ba}}}, + {X: Field{[10]uint32{0x0209e0eb, 0x03669644, 0x03503671, 0x0129814f, 0x00806257, 0x02ce45a0, 0x031ad311, 0x02dc7e18, 0x018be13e, 0x003b674a}}, Y: Field{[10]uint32{0x0185c3cb, 0x02e86e27, 0x02b6fe54, 0x03f35403, 0x017b479e, 0x03d0361f, 0x007caa30, 0x0221b668, 0x03c0dab8, 0x0025ea6a}}}, + {X: Field{[10]uint32{0x02355fad, 0x039250be, 0x01fcb9f8, 0x028bff0e, 0x0378ae69, 0x002351a6, 0x028daf33, 0x002f0ef4, 0x0236a590, 0x00337fbd}}, Y: Field{[10]uint32{0x020db6d7, 0x02039194, 0x02d5179f, 0x0314de3c, 0x02f4f6c7, 0x024581ea, 0x02a1c255, 0x03bd3a91, 0x03cc54c0, 0x003e0ce3}}}, + {X: Field{[10]uint32{0x0149db49, 0x014b9a9e, 0x035848ca, 0x00f5a961, 0x03dbc094, 0x01b67d76, 0x03a8fc42, 0x02f5ab29, 0x03220ca3, 0x003d8e33}}, Y: Field{[10]uint32{0x01675295, 0x02478290, 0x03732f36, 0x009a7f47, 0x01653a79, 0x03565450, 0x03490039, 0x03aade42, 0x03dd8309, 0x0015a899}}}, + {X: Field{[10]uint32{0x0314bd1c, 0x01e8ac63, 0x02e1e638, 0x00eaf250, 0x037a6616, 0x018e482c, 0x0076cab1, 0x010fd40f, 0x02f29b1e, 0x0010d03f}}, Y: Field{[10]uint32{0x032210a0, 0x00af0ae0, 0x01eb6ad6, 0x00562eee, 0x0159ff2f, 0x01bdea77, 0x00908f0b, 0x034d4f1b, 0x002d6889, 0x000b569e}}}, + {X: Field{[10]uint32{0x01b80991, 0x0208bc6a, 0x01a30bf2, 0x025b1bb4, 0x001aa832, 0x03bae09b, 0x012c01fb, 0x036c4c33, 0x028005e3, 0x001e2be1}}, Y: Field{[10]uint32{0x008c3725, 0x0106bd89, 0x02a2a49d, 0x03761881, 0x01ec458c, 0x02e53e0d, 0x000d95b6, 0x033a449a, 0x023637a6, 0x000671f2}}}, + {X: Field{[10]uint32{0x01c41ef4, 0x00ab8472, 0x02d4958a, 0x01e4e2e5, 0x01720642, 0x00ecf558, 0x02831c01, 0x02fbdd52, 0x010fe6a4, 0x00361f96}}, Y: Field{[10]uint32{0x021d1dc6, 0x02d02e6f, 0x016b3e30, 0x0286d422, 0x0353b97a, 0x023b53af, 0x03ff97ff, 0x00d227c7, 0x013ac9b4, 0x000e4a2a}}}, + {X: Field{[10]uint32{0x01c54c32, 0x02a111b7, 0x00a7f630, 0x01a4656e, 0x0285ea85, 0x002e41db, 0x015cfd0a, 0x011fa505, 0x01f369c5, 0x002d6746}}, Y: Field{[10]uint32{0x02661865, 0x03fc2176, 0x00357f81, 0x01fb1129, 0x032d5082, 0x02058b17, 0x0383d552, 0x02af838a, 0x008affe7, 0x002e3d56}}}, + {X: Field{[10]uint32{0x00f3ee78, 0x00f4c318, 0x0143a6d8, 0x02f57abd, 0x03662726, 0x007050ea, 0x02a64cd8, 0x026c000e, 0x03da7cd5, 0x000d3d90}}, Y: Field{[10]uint32{0x00501ee8, 0x001111bd, 0x03b22d52, 0x0078fe91, 0x0291906c, 0x00fb968d, 0x00bd29b0, 0x03d5cd68, 0x00f291a7, 0x001055d3}}}, + {X: Field{[10]uint32{0x033dbbf3, 0x00e57588, 0x01b4ecac, 0x03d5ac17, 0x00fd007b, 0x030c725a, 0x0378757d, 0x027790cf, 0x03d0583e, 0x0015bbcd}}, Y: Field{[10]uint32{0x035c9286, 0x0052e6b7, 0x0229a92c, 0x037ee7a5, 0x02ba8cb5, 0x00ee853a, 0x02e28075, 0x0263e442, 0x001ab5c8, 0x00285038}}}, + {X: Field{[10]uint32{0x01c957d7, 0x037402bb, 0x00fc87e3, 0x01d9e115, 0x02fc54dd, 0x00e97750, 0x039ca5cb, 0x015a2c44, 0x0334815b, 0x0000790f}}, Y: Field{[10]uint32{0x02334cc8, 0x01c93ddf, 0x0302c85d, 0x03eb410c, 0x008e947a, 0x01370af7, 0x0282d9e6, 0x03b881e2, 0x0274ac96, 0x001730e0}}}, + {X: Field{[10]uint32{0x0339a952, 0x00c18bf0, 0x00eabad9, 0x020a63de, 0x01f8b06c, 0x03606df7, 0x029046d3, 0x036df366, 0x024935d2, 0x000339e7}}, Y: Field{[10]uint32{0x004f9686, 0x0282286e, 0x01dc7fff, 0x03d7f701, 0x038765c8, 0x02f0f3d6, 0x018c4943, 0x0189a96b, 0x02ee1b90, 0x003f0bdb}}}, + {X: Field{[10]uint32{0x02fe4fd9, 0x01030c61, 0x00e2c76c, 0x030d2cf7, 0x00f6766c, 0x0068033e, 0x00c3365e, 0x00b099c3, 0x0004ca86, 0x002d0512}}, Y: Field{[10]uint32{0x01b2219c, 0x016e6b54, 0x004b8717, 0x02ad78a8, 0x0029cbda, 0x00e803f5, 0x03752f00, 0x01b8028f, 0x021fca9b, 0x00390da2}}}, + {X: Field{[10]uint32{0x034fd39f, 0x00750887, 0x006a70b7, 0x007b06f1, 0x01541634, 0x03b5274e, 0x039cf65c, 0x03e09239, 0x03247406, 0x003aa8a5}}, Y: Field{[10]uint32{0x017c14a6, 0x0374a2ea, 0x01d46248, 0x033c0e28, 0x02d0d4b6, 0x01788610, 0x00d99328, 0x01730f79, 0x001be3b7, 0x001a39fe}}}, + {X: Field{[10]uint32{0x00f5b6a5, 0x00bb140c, 0x02999e7a, 0x0327d0b1, 0x02eb7371, 0x0372ff1c, 0x00c6caa3, 0x0222f0ee, 0x00ff1f72, 0x00138b44}}, Y: Field{[10]uint32{0x025a8774, 0x020803c2, 0x00f82be8, 0x03d7ad9e, 0x006ba793, 0x03905f40, 0x03515ca3, 0x013ec2a4, 0x005cdf2a, 0x001a368f}}}, + {X: Field{[10]uint32{0x030659f1, 0x02776888, 0x01adce00, 0x025115f0, 0x007d073b, 0x019f0a25, 0x00a4b45c, 0x03b258aa, 0x01e1114d, 0x0020d3c8}}, Y: Field{[10]uint32{0x01adc89c, 0x02b1fec9, 0x00a6ef78, 0x036d8c83, 0x0339263a, 0x001299f0, 0x03acb27d, 0x028280bd, 0x01b6edb5, 0x003a7e98}}}, + {X: Field{[10]uint32{0x00c7d0c7, 0x01c4e78c, 0x00381ece, 0x0367e6f7, 0x01c43cae, 0x034f5a3f, 0x03268d7c, 0x011156a5, 0x00aca0a6, 0x002a12d1}}, Y: Field{[10]uint32{0x03bf6b74, 0x02bc9642, 0x00d6da05, 0x01e4e20b, 0x03d12678, 0x02466bde, 0x03bde43f, 0x000aef4b, 0x033b74e7, 0x000be40f}}}, + {X: Field{[10]uint32{0x001d6789, 0x00d207c9, 0x02cbdd41, 0x01f2ed0c, 0x02600cbe, 0x02783e9b, 0x031df66f, 0x02e5dd1e, 0x020698bc, 0x00084867}}, Y: Field{[10]uint32{0x00954055, 0x0346249c, 0x03736aef, 0x02f8c92e, 0x022e6970, 0x02d74c99, 0x017d9688, 0x0061d2a2, 0x00d3c896, 0x001e90e2}}}, + {X: Field{[10]uint32{0x03aeafd4, 0x01ec8be6, 0x03562686, 0x01260a89, 0x017b9465, 0x013d261e, 0x034bbdbe, 0x0333da22, 0x021f93bf, 0x003e9453}}, Y: Field{[10]uint32{0x00f91b74, 0x03c95f69, 0x0330a478, 0x015b09a9, 0x012c2f61, 0x0324c382, 0x0087b518, 0x00ad2a78, 0x02155257, 0x00333520}}}, + {X: Field{[10]uint32{0x01451ffb, 0x03e80b1e, 0x01ffa4ca, 0x03d4fcbf, 0x012204d4, 0x026f630b, 0x0133a4a9, 0x0267c301, 0x03f16430, 0x002d82be}}, Y: Field{[10]uint32{0x0321294b, 0x03bbe2d2, 0x03f43886, 0x0018fbbc, 0x01d321e0, 0x01af69ba, 0x00b3bd27, 0x02649b35, 0x03901a02, 0x0003fb63}}}, + {X: Field{[10]uint32{0x03ed76cd, 0x02143a29, 0x00defc74, 0x0194e71b, 0x0017c2b7, 0x0151a53a, 0x02fcca65, 0x038d2a1b, 0x01a3196c, 0x003ca73e}}, Y: Field{[10]uint32{0x00c9c5f7, 0x0044a7e2, 0x028f6247, 0x01de6547, 0x00994b29, 0x036d6eb3, 0x03f1bf62, 0x00cf3ecd, 0x023af7c3, 0x00144c21}}}, + {X: Field{[10]uint32{0x01084e4d, 0x02e49d71, 0x014ed563, 0x0128c889, 0x01d8fe31, 0x00f88fc7, 0x03af34b0, 0x02ff1468, 0x023acb00, 0x00273678}}, Y: Field{[10]uint32{0x0298e1d5, 0x01bf1384, 0x0277d4d3, 0x0133e34a, 0x014f31bd, 0x01ecc5c1, 0x01d6c1a1, 0x029c4054, 0x035cc66e, 0x003b3c08}}}, + {X: Field{[10]uint32{0x02e5d65c, 0x00edbd7d, 0x025bff3d, 0x0246acac, 0x0218ed66, 0x0395a8a0, 0x02d99a6b, 0x00122be5, 0x01b02cfa, 0x0015be22}}, Y: Field{[10]uint32{0x001fe4bc, 0x03a81ec9, 0x00d921b7, 0x00a7a832, 0x01bb8ecc, 0x03723f28, 0x034f8248, 0x01cabfd9, 0x00ea4a23, 0x000d4ac8}}}, + {X: Field{[10]uint32{0x01ff2a08, 0x024daad7, 0x03dea16c, 0x039491af, 0x028e2366, 0x00f7bd55, 0x0169a7dd, 0x0363f05b, 0x02b7f8fa, 0x00378caf}}, Y: Field{[10]uint32{0x009e145f, 0x00013509, 0x01acba7c, 0x0332c378, 0x03eaa216, 0x038997ea, 0x002bd06f, 0x0070891b, 0x011c93a7, 0x0035cc7c}}}, + {X: Field{[10]uint32{0x026ba256, 0x0222578a, 0x02693096, 0x00ebe612, 0x037d12dc, 0x03beab36, 0x03dfa58f, 0x00a76300, 0x01c1dc17, 0x00217b1f}}, Y: Field{[10]uint32{0x024a747c, 0x02c2d166, 0x0041b194, 0x03cae86a, 0x0189e4b9, 0x03ee8c77, 0x00c73b5a, 0x02af2fe6, 0x00af8e9a, 0x00148c0e}}}, + {X: Field{[10]uint32{0x01e2e141, 0x02972bd0, 0x014abe23, 0x0038ac9b, 0x02e22328, 0x00b6e2fd, 0x03f5efe4, 0x023b07b5, 0x01956052, 0x003de522}}, Y: Field{[10]uint32{0x00c6ff98, 0x03f2dee0, 0x012fcdd6, 0x01585b37, 0x0258871e, 0x02a35b67, 0x0037e9fd, 0x007e621a, 0x00e296ed, 0x0027dd65}}}, + {X: Field{[10]uint32{0x03454f10, 0x0267383c, 0x00137621, 0x00eb88a3, 0x02866bd5, 0x0006a4ef, 0x036e8eef, 0x022094f5, 0x03d3b420, 0x0016235b}}, Y: Field{[10]uint32{0x002af573, 0x008a92ed, 0x02d2c6d9, 0x0206b437, 0x0206320b, 0x00c6df8c, 0x03f29ade, 0x00822ee8, 0x02533e41, 0x00297f25}}}, + {X: Field{[10]uint32{0x00cc7443, 0x0108f787, 0x0259c0bf, 0x0253a0d1, 0x03b01db2, 0x025d9dde, 0x0387d4e8, 0x03229d5b, 0x008dbbe5, 0x00061bf8}}, Y: Field{[10]uint32{0x03dfbdc0, 0x01be67a6, 0x01bdca25, 0x009a9912, 0x0229f12e, 0x00d7f432, 0x037a93a4, 0x01e080d0, 0x0139a46f, 0x0036677b}}}, + {X: Field{[10]uint32{0x01bd3d25, 0x01b57796, 0x036bb5a0, 0x02600bd5, 0x022af22e, 0x03b84ccd, 0x03eac38c, 0x02afcced, 0x03083055, 0x00395272}}, Y: Field{[10]uint32{0x01332381, 0x000c971f, 0x005fd4fe, 0x0390d2a5, 0x015ababd, 0x03f0d6b9, 0x001c7f7a, 0x00520d99, 0x0320e7b5, 0x00337cdf}}}, + {X: Field{[10]uint32{0x0224422b, 0x024ce240, 0x006e18ac, 0x01e7d4ea, 0x00b930df, 0x03fa12d6, 0x006108fc, 0x01456172, 0x02fbfd7f, 0x0029390a}}, Y: Field{[10]uint32{0x00ce1e30, 0x011e5800, 0x03e2f1ea, 0x0072efa8, 0x00541e55, 0x024575eb, 0x00d6177f, 0x00c40ad6, 0x021b0396, 0x0003a7e3}}}, + {X: Field{[10]uint32{0x0003dadb, 0x03bf72b6, 0x03d4ed09, 0x02a5c667, 0x004755fb, 0x01dd43e9, 0x009e9cfb, 0x00bd09ac, 0x00444202, 0x0017dfb6}}, Y: Field{[10]uint32{0x0376ffad, 0x0386f74a, 0x01addccb, 0x030e6ff3, 0x00e852d9, 0x02425bc7, 0x01592fcc, 0x023ac272, 0x01edd06a, 0x00024757}}}, + {X: Field{[10]uint32{0x02938d66, 0x038603b0, 0x038f1868, 0x03e42be8, 0x0191dcf7, 0x03d9ef45, 0x033fa223, 0x0193842c, 0x034332f0, 0x000feb11}}, Y: Field{[10]uint32{0x02aabe5c, 0x00f69878, 0x019206f9, 0x003e7a99, 0x03eebf27, 0x0045cc2e, 0x006d10ab, 0x00de64ce, 0x02676b20, 0x00115d13}}}, + {X: Field{[10]uint32{0x037a7aa9, 0x0192f7fe, 0x006b190e, 0x003da863, 0x00d4b10e, 0x01f639e1, 0x00d13df9, 0x034850b9, 0x03fff058, 0x0017ee60}}, Y: Field{[10]uint32{0x01dabd6f, 0x003c69a3, 0x018e8346, 0x020629b5, 0x00ec5811, 0x025ccf5d, 0x0373f73a, 0x0103343a, 0x02018dc5, 0x000cce51}}}, + {X: Field{[10]uint32{0x0341f88a, 0x003d79b7, 0x020e043e, 0x0078674f, 0x009c6e94, 0x02c20d99, 0x015eec1a, 0x00e68b6c, 0x01c30fa9, 0x0002ebcd}}, Y: Field{[10]uint32{0x028e9201, 0x004234bd, 0x01966214, 0x011553fb, 0x019de414, 0x00ee2c1a, 0x02bdc3fe, 0x0286f13b, 0x00d3e53f, 0x0010960f}}}, + {X: Field{[10]uint32{0x009a8602, 0x00128160, 0x01f9a0c7, 0x0366b36e, 0x004266c4, 0x00fecf58, 0x0186183a, 0x01ffc3c7, 0x035aa51e, 0x0025d907}}, Y: Field{[10]uint32{0x019517dd, 0x034ca1eb, 0x0239b5b0, 0x03f51676, 0x031ab169, 0x0073e9e3, 0x0182fc90, 0x02f6fb63, 0x0232aa9f, 0x0004d3fe}}}, + {X: Field{[10]uint32{0x0327292e, 0x031ad549, 0x02a5ee23, 0x03286a1d, 0x03f59feb, 0x02f8170d, 0x01aa8fb4, 0x03db716b, 0x011eacda, 0x0025a8dc}}, Y: Field{[10]uint32{0x01da4392, 0x03b34fe9, 0x00e96b82, 0x008d5840, 0x0134be91, 0x01eb5760, 0x01fce0e6, 0x02eded78, 0x03b9681e, 0x0023ec33}}}, + {X: Field{[10]uint32{0x03154b0a, 0x02ab7bd3, 0x01e2a14f, 0x02c0fa75, 0x029f9f16, 0x004d8c82, 0x01388926, 0x0031b4a3, 0x028b8e54, 0x002b9910}}, Y: Field{[10]uint32{0x00118aeb, 0x01e524ff, 0x002e4d5b, 0x03b5bf9b, 0x03cc68ad, 0x003fd679, 0x02d5193b, 0x01cf36e7, 0x025eb9bf, 0x0036c80b}}}, + {X: Field{[10]uint32{0x00c984fb, 0x00a41d5b, 0x0038d422, 0x03feea1d, 0x03e16424, 0x016d210c, 0x03532cf1, 0x030b0452, 0x02df65c0, 0x000b164c}}, Y: Field{[10]uint32{0x03d29130, 0x028b0931, 0x01e47f59, 0x00a0b3ac, 0x011c6436, 0x022e7fd3, 0x015deec3, 0x02815b4e, 0x00c4b908, 0x000587be}}}, + {X: Field{[10]uint32{0x02ecca3e, 0x0123d55e, 0x02071f9c, 0x0276f1a4, 0x02241538, 0x03aff2ff, 0x0252d563, 0x02e9a460, 0x00786937, 0x001db887}}, Y: Field{[10]uint32{0x0133c8e6, 0x0293bf51, 0x02a77a3f, 0x00a235c6, 0x01ca634d, 0x024c27fa, 0x0361d0d4, 0x01f5878e, 0x02fe9db4, 0x00379de1}}}, + {X: Field{[10]uint32{0x0267900f, 0x01c2016c, 0x00a36eaa, 0x018ff259, 0x02099df3, 0x02bf1a91, 0x020b3466, 0x004e3474, 0x00efca8a, 0x001c5c37}}, Y: Field{[10]uint32{0x00c0bb8d, 0x00db5776, 0x0320303b, 0x039188fe, 0x00440562, 0x021c3e3e, 0x0389f7bf, 0x00515663, 0x0139476f, 0x00065aff}}}, + {X: Field{[10]uint32{0x011b6ccd, 0x001f16da, 0x036f2e69, 0x018b8d60, 0x0361a956, 0x0347a27d, 0x01fb466e, 0x034916a8, 0x02b075bd, 0x00263b77}}, Y: Field{[10]uint32{0x030c91be, 0x02a107d5, 0x02814731, 0x0266aca5, 0x00bdbcdc, 0x00228e8b, 0x002ddc21, 0x0092e327, 0x01f6b591, 0x002bcfed}}}, + {X: Field{[10]uint32{0x028e8849, 0x03db6a2e, 0x00e6768b, 0x01383ea6, 0x018dd1c3, 0x0160de70, 0x0236fc5c, 0x0181be97, 0x000659ae, 0x002fd0be}}, Y: Field{[10]uint32{0x0155b8af, 0x039a3e1d, 0x0298f26b, 0x0344873b, 0x00ca74a0, 0x01aeba31, 0x03495782, 0x036e511b, 0x03706e4a, 0x0034d0fe}}}, + {X: Field{[10]uint32{0x0262e1cd, 0x037e5551, 0x038a0d82, 0x0170230c, 0x02c42fd6, 0x018927f0, 0x0075c365, 0x023718a4, 0x00a5891e, 0x00103071}}, Y: Field{[10]uint32{0x00689ec3, 0x02843a73, 0x0303ae5a, 0x009ce815, 0x03f20253, 0x02f304ac, 0x015d8192, 0x03db0dc6, 0x03d0e68e, 0x00199c88}}}, + {X: Field{[10]uint32{0x03883dc1, 0x0044cfa3, 0x03c92b92, 0x00f1524b, 0x03bfd3ef, 0x02828b5b, 0x004cf1b1, 0x00ff920e, 0x03100c8e, 0x00058b74}}, Y: Field{[10]uint32{0x01b5cff0, 0x00f23803, 0x00e21a65, 0x013a1ba8, 0x003d0ebf, 0x03d24387, 0x0197685c, 0x000ae7dc, 0x01d5c82f, 0x0007c8c4}}}, + {X: Field{[10]uint32{0x006331cb, 0x031f9033, 0x03b3dbdf, 0x03f5455e, 0x005d63c4, 0x00227b16, 0x03302e51, 0x02b8f3cf, 0x014689ea, 0x003fc3e0}}, Y: Field{[10]uint32{0x0151bf2e, 0x02d591c1, 0x00c2dac2, 0x037d68ec, 0x02f8814c, 0x01e3476a, 0x02549737, 0x00a78eeb, 0x01b94eb5, 0x0013707f}}}, + {X: Field{[10]uint32{0x0207b78e, 0x028e45d1, 0x02033c3e, 0x010553d2, 0x0314b3e6, 0x0131b66a, 0x0072b224, 0x02d55cbd, 0x0274b011, 0x00050eb9}}, Y: Field{[10]uint32{0x0201c35c, 0x032d084d, 0x0099fdb9, 0x022b8667, 0x03ca2029, 0x0280f7f5, 0x018820c0, 0x03ee8980, 0x01820fae, 0x00054a35}}}, + {X: Field{[10]uint32{0x019009a3, 0x01ec05e3, 0x006f35e1, 0x003b35ae, 0x004115a8, 0x00a5d366, 0x03a0efd3, 0x03517e5b, 0x02288fff, 0x003ceb73}}, Y: Field{[10]uint32{0x0116a20e, 0x001996d2, 0x00ba72d2, 0x0293aaf5, 0x03805580, 0x0252961a, 0x020915e4, 0x026ec1a6, 0x03009632, 0x0008080b}}}, + {X: Field{[10]uint32{0x00d8cccf, 0x001d5631, 0x032f85ad, 0x008bd13e, 0x034904ad, 0x02930891, 0x00e6bc6f, 0x003438b2, 0x0029e273, 0x003489c2}}, Y: Field{[10]uint32{0x0079a3bc, 0x000bd7a2, 0x03a93c63, 0x01eab819, 0x0227c66c, 0x0098b904, 0x009741df, 0x03d9a566, 0x00ac9d5b, 0x003569ad}}}, + {X: Field{[10]uint32{0x012964a6, 0x032b7d0d, 0x0356756e, 0x02299727, 0x01834753, 0x00aecbcf, 0x0057a948, 0x03caa117, 0x02b67d9b, 0x0009b45f}}, Y: Field{[10]uint32{0x02068fb2, 0x01c67078, 0x01c6b7f7, 0x006bf348, 0x00b8703d, 0x02926a9c, 0x03c4a520, 0x030d16f3, 0x03d47d67, 0x002552bc}}}, + {X: Field{[10]uint32{0x03fac74b, 0x01a3c879, 0x024760bf, 0x0264c4d1, 0x0036a52d, 0x017b9f44, 0x011618ce, 0x03226573, 0x038be104, 0x003910df}}, Y: Field{[10]uint32{0x0195cb81, 0x01c36e36, 0x0356e27b, 0x02f6e071, 0x00f9b015, 0x02d5bf23, 0x0020dbe3, 0x01b9b06a, 0x02d5b825, 0x0035b055}}}, + {X: Field{[10]uint32{0x02d3c1d4, 0x011d3be8, 0x02c70851, 0x00700347, 0x01ac5bb5, 0x026d68e7, 0x02b63ed2, 0x0181e598, 0x004e96db, 0x00224cb8}}, Y: Field{[10]uint32{0x03e58541, 0x021d511d, 0x0336ec05, 0x00368ef4, 0x01fc912a, 0x030d5472, 0x03f51668, 0x00897414, 0x037fe030, 0x00150df9}}}, + {X: Field{[10]uint32{0x02617b26, 0x020945c5, 0x01fd0c7c, 0x0390171b, 0x00933ed0, 0x01b20507, 0x02003c73, 0x021b016c, 0x0176465b, 0x003f9dda}}, Y: Field{[10]uint32{0x012aac39, 0x039b6731, 0x002aa472, 0x00f89544, 0x0094364d, 0x01677754, 0x002b0af3, 0x03541b4c, 0x005fd576, 0x002c9e77}}}, + {X: Field{[10]uint32{0x035b45f1, 0x03f24714, 0x0372cb86, 0x00f29ae7, 0x01f69eb7, 0x018ce05f, 0x004ecbe1, 0x02489172, 0x00ffb2a2, 0x001b1829}}, Y: Field{[10]uint32{0x022a0a2c, 0x01734a4a, 0x022231b5, 0x00af48f5, 0x036489af, 0x03e71e14, 0x0301a510, 0x033071c0, 0x026f814b, 0x0009e37b}}}, + {X: Field{[10]uint32{0x009af04d, 0x00791ce7, 0x02a81e12, 0x02d1ba70, 0x03a955be, 0x0327a185, 0x01556c5e, 0x0240aa63, 0x018f625f, 0x000c4cb9}}, Y: Field{[10]uint32{0x01a9e461, 0x02361a51, 0x01006943, 0x01f25171, 0x01cf0a95, 0x011a4131, 0x01b92204, 0x00f17853, 0x0164a244, 0x00296202}}}, + {X: Field{[10]uint32{0x00903f6f, 0x01404b8d, 0x022dc57e, 0x002a77a0, 0x03640e18, 0x0234e161, 0x01003fdc, 0x026fdbae, 0x0236361a, 0x002c173b}}, Y: Field{[10]uint32{0x005c9a5a, 0x0363a095, 0x018c5305, 0x0288c35e, 0x0126fe21, 0x01897617, 0x005ce16d, 0x0268a2dd, 0x00862951, 0x003ed1ce}}}, + {X: Field{[10]uint32{0x02005e83, 0x0017c584, 0x0273903a, 0x01b2af61, 0x0023cd2f, 0x00eab5f3, 0x014e68de, 0x039601e8, 0x020f5659, 0x00388084}}, Y: Field{[10]uint32{0x03ada136, 0x02755783, 0x01544084, 0x02b1f020, 0x02a70e8f, 0x0017eebc, 0x037cb4dc, 0x03e64b64, 0x0305b66a, 0x001264a2}}}, + {X: Field{[10]uint32{0x007a796b, 0x02618cc3, 0x034592f1, 0x0336316c, 0x039a9bf0, 0x01418532, 0x03e68f04, 0x002782c1, 0x01892e54, 0x0015ea47}}, Y: Field{[10]uint32{0x0098e7fc, 0x0307a7e1, 0x0116bbd5, 0x001b1763, 0x021dbf77, 0x0092c464, 0x02612c31, 0x023ea2ea, 0x00ce5901, 0x0011e417}}}, + {X: Field{[10]uint32{0x01a7e8da, 0x014ed929, 0x00ee1dd1, 0x02359d0a, 0x0291c046, 0x00997777, 0x019e7c58, 0x01970835, 0x000a3ba4, 0x003824b1}}, Y: Field{[10]uint32{0x03ffd39b, 0x009bdc56, 0x03042feb, 0x00444d3a, 0x03baa514, 0x00ec25fd, 0x00ab1d31, 0x010920b5, 0x02b4bdfc, 0x0020fd38}}}, + {X: Field{[10]uint32{0x01e0ab38, 0x02980247, 0x02554f78, 0x013fd691, 0x037c1ee8, 0x00cd74f7, 0x001a9c2c, 0x013f1282, 0x006e7baa, 0x001ce8cc}}, Y: Field{[10]uint32{0x01a1f938, 0x03a24f7b, 0x022350bc, 0x0210ebc2, 0x023d93f6, 0x01548646, 0x03a70439, 0x030c9b8d, 0x00f92022, 0x0007da32}}}, + {X: Field{[10]uint32{0x033a4434, 0x03aaef97, 0x0093a6a6, 0x03168e79, 0x03e99883, 0x02850076, 0x0152caf4, 0x012585cd, 0x01f86e90, 0x001f1e9e}}, Y: Field{[10]uint32{0x02e869bb, 0x005fe389, 0x0355415e, 0x0204b0a4, 0x00a26709, 0x002d65b3, 0x008ce8ac, 0x00e4c65b, 0x0252e488, 0x002173ac}}}, + {X: Field{[10]uint32{0x00a37788, 0x028711e1, 0x03918623, 0x021bb6a4, 0x0319f030, 0x0144d95f, 0x03054fae, 0x03ddcacd, 0x0161ce4f, 0x001aa77d}}, Y: Field{[10]uint32{0x01b65280, 0x016d88ff, 0x02db42b2, 0x019c41ba, 0x01fe7198, 0x019847fb, 0x01ba398a, 0x02fd60cc, 0x034ad9b3, 0x002f3c09}}}, + {X: Field{[10]uint32{0x0391c950, 0x02314eff, 0x019eef3f, 0x02d6fc8a, 0x0381934c, 0x034b1abf, 0x0145d2da, 0x02b7fc71, 0x024d47b3, 0x003f9eec}}, Y: Field{[10]uint32{0x02574e7f, 0x03971022, 0x00c5befd, 0x022c12bc, 0x03a88173, 0x0028a4b3, 0x00c27d6f, 0x0188f24c, 0x038609d2, 0x001ff997}}}, + {X: Field{[10]uint32{0x00407d3d, 0x010a41cc, 0x014531da, 0x0192ba05, 0x0382ce2b, 0x01f414d1, 0x00ba60e1, 0x02ddf0a4, 0x02f27944, 0x0009b474}}, Y: Field{[10]uint32{0x00f0f495, 0x00156d2d, 0x0206f4d1, 0x034756a8, 0x0051b768, 0x00d604e1, 0x00b23725, 0x00002c34, 0x00243106, 0x003b0f14}}}, + {X: Field{[10]uint32{0x0273e2b8, 0x03025b63, 0x008060e6, 0x01363c0d, 0x03fb85cf, 0x03a91378, 0x00563ff8, 0x0055cd2b, 0x01f938f9, 0x003c0394}}, Y: Field{[10]uint32{0x022c727b, 0x0259dc68, 0x00c703c5, 0x007484e0, 0x02585408, 0x03f62382, 0x02b6a136, 0x0292474e, 0x03ed3a39, 0x001edeff}}}, + {X: Field{[10]uint32{0x03cfc4d8, 0x004789cd, 0x03b309e0, 0x034538f8, 0x008bd179, 0x01352f2a, 0x02be811a, 0x021d424e, 0x0072f42f, 0x001cf855}}, Y: Field{[10]uint32{0x005b9231, 0x0341827e, 0x01a340b5, 0x01ae12f3, 0x01c53c82, 0x02c02d2a, 0x006426c9, 0x005da044, 0x00ae5832, 0x000e4bbd}}}, + {X: Field{[10]uint32{0x01568092, 0x02bd582a, 0x00333a7f, 0x0123b6be, 0x00d29d23, 0x01e77e39, 0x011d86e4, 0x00119321, 0x03a9aff3, 0x003b5199}}, Y: Field{[10]uint32{0x0149bb0c, 0x0371f98f, 0x002e43da, 0x03699e62, 0x006d9f4f, 0x03fd5df8, 0x01a9ab50, 0x0350b51a, 0x00756892, 0x001dcd9e}}}, + {X: Field{[10]uint32{0x001dde26, 0x02c3bc95, 0x00d74af5, 0x00b1e40d, 0x0351066f, 0x0136ff83, 0x00346a26, 0x0072f773, 0x02ab1081, 0x0035bb05}}, Y: Field{[10]uint32{0x02d0527e, 0x015fa792, 0x0315ef48, 0x0079286d, 0x034763b0, 0x0302e26f, 0x011b7336, 0x02f88a6a, 0x00ab7ac7, 0x002607c7}}}, + {X: Field{[10]uint32{0x034c593f, 0x0292d4ea, 0x008e68dc, 0x03caf47d, 0x033f762e, 0x03b96dc5, 0x001d92d2, 0x00c6b209, 0x007e6919, 0x000a13bd}}, Y: Field{[10]uint32{0x03cf5e82, 0x03150546, 0x013e1c7a, 0x00b8efeb, 0x03b53a4d, 0x03ff86da, 0x03e12887, 0x02f91c20, 0x02e1e6a7, 0x002adce7}}}, + {X: Field{[10]uint32{0x00d505c3, 0x030fe1c2, 0x034f6c6c, 0x02f20d5d, 0x0344b490, 0x0124063b, 0x03ba53ac, 0x01f42bf0, 0x01e75a26, 0x00014c3e}}, Y: Field{[10]uint32{0x0285e3f1, 0x02cef0d3, 0x028d36e2, 0x01c12e22, 0x00bee9fa, 0x03dff7b5, 0x02d7fba8, 0x03a72f3d, 0x001e44e5, 0x0018c312}}}, + {X: Field{[10]uint32{0x02a905f8, 0x0135673a, 0x022bc1ba, 0x0080f126, 0x02ef9c4d, 0x000974b6, 0x037a4b38, 0x00596d9c, 0x00fd81d0, 0x0019aa6d}}, Y: Field{[10]uint32{0x02525e8c, 0x01ec7353, 0x015f121b, 0x032895e5, 0x0112c86b, 0x02574c14, 0x017311c1, 0x03ab65f7, 0x004e6a4d, 0x0009dc31}}}, + {X: Field{[10]uint32{0x03a289be, 0x02484d48, 0x0394f601, 0x02625b76, 0x0139bb78, 0x011d3789, 0x018d7397, 0x01ed926c, 0x027edca4, 0x0009604b}}, Y: Field{[10]uint32{0x0317e2da, 0x031884db, 0x00e5c795, 0x02e2d634, 0x00788d3a, 0x0232e191, 0x0276f7f1, 0x029db9ae, 0x0183072a, 0x0012ee8f}}}, + {X: Field{[10]uint32{0x03b29608, 0x032e9df7, 0x00fd724a, 0x0228d5db, 0x02df1a0e, 0x03efd61f, 0x00f88b58, 0x0091205c, 0x0270af16, 0x000f206f}}, Y: Field{[10]uint32{0x02ee13d4, 0x0357fd0a, 0x0070027b, 0x03eb837a, 0x02ed9dc9, 0x0040ba6e, 0x00b52507, 0x03d201e8, 0x008eda59, 0x002ac5b9}}}, + {X: Field{[10]uint32{0x00d6e39d, 0x0093ddb8, 0x035252fb, 0x02421715, 0x0039626e, 0x0096ab6a, 0x0282c8d1, 0x00a4cfb3, 0x01cda514, 0x002ad89b}}, Y: Field{[10]uint32{0x024abff6, 0x03b7005d, 0x033cfe7e, 0x00f436ad, 0x02bb7be7, 0x0363aff0, 0x031f2a34, 0x012c6f55, 0x034b34fa, 0x0022b75d}}}, + {X: Field{[10]uint32{0x036bd85d, 0x033f82fc, 0x0133de1c, 0x015e638e, 0x03aaaaed, 0x028f8a1c, 0x02d65321, 0x0083fe32, 0x01061207, 0x0011fc94}}, Y: Field{[10]uint32{0x00585b60, 0x02c5be48, 0x03c60c38, 0x004fb342, 0x00cb44e0, 0x025960eb, 0x0374ea3f, 0x004b93b2, 0x032e7295, 0x0003db51}}}, + {X: Field{[10]uint32{0x03c26b1b, 0x0122e7c8, 0x00842361, 0x0099d4b4, 0x00e16409, 0x01c6e2ec, 0x0138d590, 0x023c6cf1, 0x0299f739, 0x001bf4c0}}, Y: Field{[10]uint32{0x026799da, 0x03816eee, 0x03d33372, 0x03c09dfc, 0x017810be, 0x017227fd, 0x02e9c4dc, 0x0388d468, 0x0166a79c, 0x000ee358}}}, + {X: Field{[10]uint32{0x0202e040, 0x026f5992, 0x031e3f44, 0x021f75e1, 0x0149db12, 0x01712827, 0x0051ab74, 0x00735963, 0x007c784e, 0x0003756c}}, Y: Field{[10]uint32{0x028d8659, 0x00c41e35, 0x03857a47, 0x01f36283, 0x036a0459, 0x003fbb66, 0x00ed2a7c, 0x0246e373, 0x018a62a4, 0x002c9b6b}}}, + {X: Field{[10]uint32{0x027fcdad, 0x00ab7c85, 0x016b7dff, 0x0229c02d, 0x0215b61a, 0x01ae12f2, 0x0275e5f1, 0x01089ea8, 0x0036104b, 0x0000f3d6}}, Y: Field{[10]uint32{0x0200c9fb, 0x012792b3, 0x03b5ce9e, 0x0098b6d0, 0x01445af7, 0x02006372, 0x00123408, 0x01e7f7da, 0x025a2cb5, 0x000731bd}}}, + {X: Field{[10]uint32{0x0119bb58, 0x0074a352, 0x03f413e0, 0x01348e15, 0x01d4cd80, 0x01d3010f, 0x02ea163d, 0x0108730e, 0x005508b9, 0x001a0ed5}}, Y: Field{[10]uint32{0x01a11f0a, 0x03f76f9e, 0x022da17c, 0x01a41540, 0x01691e23, 0x004473fb, 0x01d69438, 0x03015a2b, 0x01762cd5, 0x0006ef91}}}, + {X: Field{[10]uint32{0x003b724c, 0x000c9e79, 0x027d2195, 0x03835cf3, 0x03e83ff0, 0x0080ab94, 0x002f7ec4, 0x0103717d, 0x01b7897a, 0x0035e198}}, Y: Field{[10]uint32{0x02d20b21, 0x00aca772, 0x00a02665, 0x03fb43b1, 0x00aeead2, 0x00757ca4, 0x03db82a6, 0x01e3b3f0, 0x01b0e3f4, 0x001194a6}}}, + {X: Field{[10]uint32{0x01e15a21, 0x02954186, 0x0114a1af, 0x01f543b0, 0x0332e89e, 0x013bafc6, 0x00dbb87b, 0x039e5399, 0x0264fc15, 0x00049631}}, Y: Field{[10]uint32{0x001be0b1, 0x00148685, 0x0157194b, 0x025eef08, 0x03028c59, 0x00a83971, 0x011a7dec, 0x00e201c3, 0x029281a7, 0x000c9f12}}}, + {X: Field{[10]uint32{0x02e8be00, 0x033589e1, 0x03bb1a6c, 0x03492fdf, 0x01387f4d, 0x039cc531, 0x0243cdfa, 0x038af71b, 0x03b51cff, 0x003cb413}}, Y: Field{[10]uint32{0x03061c9e, 0x0142a309, 0x02b37932, 0x036b09f3, 0x0178d3a7, 0x021a8ab8, 0x032ee47a, 0x00854a34, 0x038d435f, 0x00226bcf}}}, + {X: Field{[10]uint32{0x030dfb08, 0x0152078f, 0x01f6bb33, 0x02864aa7, 0x03d21551, 0x03bc020e, 0x02cc402d, 0x00eb6394, 0x02c14ab2, 0x002d9eef}}, Y: Field{[10]uint32{0x00a64a23, 0x02cc3e04, 0x01fe6698, 0x004ffb80, 0x003757cc, 0x01961d55, 0x02845285, 0x02264c14, 0x03d19383, 0x0035b29a}}}, + {X: Field{[10]uint32{0x0379235e, 0x0120c48a, 0x0089d90d, 0x02120ea1, 0x008a4665, 0x00b5986e, 0x013ce90f, 0x007f5a81, 0x01b9fa40, 0x0006ebbc}}, Y: Field{[10]uint32{0x031699d7, 0x01492528, 0x01ee8033, 0x031b02d9, 0x01bc1a69, 0x02e9562b, 0x02b3872c, 0x0205f648, 0x0214a2f7, 0x000a2866}}}, + {X: Field{[10]uint32{0x0051aa8e, 0x0043fc6e, 0x03c79c3c, 0x01b394a1, 0x01f58de5, 0x0006eaa1, 0x036a7468, 0x00e922ca, 0x026b2362, 0x001b03c1}}, Y: Field{[10]uint32{0x01ff0868, 0x036ee4c5, 0x033574cc, 0x01e48167, 0x032347a4, 0x007218c9, 0x028bd94e, 0x02c3e394, 0x0256084c, 0x003b20dc}}}, + {X: Field{[10]uint32{0x023619d7, 0x004f767d, 0x01c0d949, 0x035862de, 0x00a0c815, 0x02baf3ca, 0x026d6cb7, 0x02748afa, 0x030965bb, 0x003ef56e}}, Y: Field{[10]uint32{0x0300b924, 0x00b7f28f, 0x01c7e661, 0x018cde8a, 0x0060ccc0, 0x0083cfdb, 0x0298f77e, 0x01796ff8, 0x034d5e60, 0x000cc0d5}}}, + {X: Field{[10]uint32{0x035b1739, 0x01a3e82c, 0x008fe7e5, 0x03ca36b6, 0x020f8bd5, 0x0041af46, 0x02c81ac8, 0x008cd2bd, 0x002ac4b2, 0x00089181}}, Y: Field{[10]uint32{0x02ff6e7c, 0x02af1c16, 0x00f797cd, 0x0208d169, 0x029e5382, 0x007e4b8d, 0x0229bd96, 0x0045bc33, 0x00eb9c10, 0x00076836}}}, + {X: Field{[10]uint32{0x0182bc4a, 0x00b67cd0, 0x00c51563, 0x01b7f4a5, 0x039606cf, 0x010b3d42, 0x01b3caf5, 0x00b4de0d, 0x014f2fff, 0x0011c2a4}}, Y: Field{[10]uint32{0x001d426e, 0x01619800, 0x012dbb3a, 0x001a0738, 0x034398c6, 0x0271aa3a, 0x03e3cc9e, 0x01215a96, 0x01a8d2c7, 0x001ace01}}}, + {X: Field{[10]uint32{0x021b4be0, 0x0009ec0c, 0x00c1ecc8, 0x004540c0, 0x0044bb7a, 0x00fe4274, 0x002153ba, 0x0364cd0a, 0x010bffb6, 0x001380fd}}, Y: Field{[10]uint32{0x008c504c, 0x03db96ac, 0x003e0095, 0x00940c7a, 0x009149b1, 0x0137a32f, 0x03e8f9cb, 0x01c7b3c7, 0x00ae963e, 0x00165b16}}}, + {X: Field{[10]uint32{0x0057455e, 0x02649e3f, 0x003b70d9, 0x02d02860, 0x00188a26, 0x00e7778a, 0x01567e91, 0x02edd864, 0x03eab806, 0x00169b13}}, Y: Field{[10]uint32{0x02e6ce49, 0x0269f5e0, 0x014590d5, 0x0310bd54, 0x03353d73, 0x01c6397d, 0x00ea476a, 0x00d9af0a, 0x007c6505, 0x001ba074}}}, + {X: Field{[10]uint32{0x0329bd5f, 0x01b70de6, 0x016c3a24, 0x027406f9, 0x0174f4e0, 0x03d8f753, 0x000bb1be, 0x014b884a, 0x01b29adf, 0x003b5cf2}}, Y: Field{[10]uint32{0x0113828b, 0x0321ecfe, 0x0216159d, 0x027cb7d8, 0x02e272ad, 0x0312df14, 0x011fa5b7, 0x0382b31f, 0x03b619eb, 0x0003a645}}}, + {X: Field{[10]uint32{0x001c04bd, 0x024eda70, 0x03a99bdf, 0x01308e1b, 0x03710dd3, 0x000f284f, 0x03106085, 0x03e7b52b, 0x005b38cb, 0x001a3185}}, Y: Field{[10]uint32{0x03edc73a, 0x0235f28f, 0x01e9de92, 0x0348b830, 0x02e7cb74, 0x03d4d6a7, 0x016f884d, 0x027ab140, 0x005e607d, 0x003258d6}}}, + {X: Field{[10]uint32{0x00454126, 0x00e69dec, 0x039b6a84, 0x00481661, 0x0092269a, 0x03d72473, 0x006094c3, 0x005ef077, 0x00639273, 0x0006d946}}, Y: Field{[10]uint32{0x00f5009f, 0x0077007a, 0x03cf9137, 0x00579c51, 0x03c42b19, 0x030c6fc4, 0x001fe920, 0x03426f63, 0x025f8ac3, 0x000c7184}}}, + {X: Field{[10]uint32{0x0209c52c, 0x019b539a, 0x01f0d381, 0x00824283, 0x027229ff, 0x00edc177, 0x02b74f7a, 0x0378f515, 0x00ccdadb, 0x0011564f}}, Y: Field{[10]uint32{0x000bd737, 0x0293aa6f, 0x01866a43, 0x03748361, 0x01e14634, 0x03ba5933, 0x02b9a311, 0x000814f0, 0x017d89fd, 0x0004f599}}}, + {X: Field{[10]uint32{0x03927da5, 0x034fad0d, 0x03960566, 0x0069339d, 0x01e4dd7c, 0x00a30842, 0x0132983d, 0x03e8bf35, 0x006ed6f2, 0x00050270}}, Y: Field{[10]uint32{0x020984e4, 0x0372b451, 0x0062390e, 0x00114def, 0x02fbeda3, 0x01a52dc7, 0x0369836e, 0x03f6eb8e, 0x018d4206, 0x0037017e}}}, + {X: Field{[10]uint32{0x005f4580, 0x03c0373a, 0x037074e2, 0x03213adc, 0x025d6e5c, 0x0109bfaf, 0x03239215, 0x02c15b50, 0x006bc307, 0x00367823}}, Y: Field{[10]uint32{0x012c632d, 0x01692d8a, 0x034f915d, 0x03908060, 0x01172f4d, 0x028c9817, 0x02b52add, 0x01e90e8e, 0x0247c6b4, 0x00288f05}}}, + {X: Field{[10]uint32{0x0162fb32, 0x00576eaf, 0x028ee1aa, 0x022eef57, 0x025ac0f1, 0x01357e89, 0x033a9166, 0x02dadcd4, 0x01f3d3c2, 0x001f7cc6}}, Y: Field{[10]uint32{0x03c9f8c0, 0x036d634a, 0x030b79c3, 0x026ea46b, 0x00a9bd16, 0x00778205, 0x02d8d963, 0x02ee6075, 0x02afe023, 0x0024483d}}}, + {X: Field{[10]uint32{0x0186d7a5, 0x01cd115a, 0x037110a3, 0x01126eb4, 0x0011d742, 0x008595e6, 0x0146232e, 0x03f47e4c, 0x018738b9, 0x0006a539}}, Y: Field{[10]uint32{0x03e4352e, 0x00810a2a, 0x0365a748, 0x0126b619, 0x020fc325, 0x025fcb6c, 0x034604b1, 0x039eb83e, 0x03b317ee, 0x000cca89}}}, + {X: Field{[10]uint32{0x03619a47, 0x01e07e46, 0x03691fa0, 0x0106257f, 0x014aefff, 0x03033e1c, 0x002ef8df, 0x019b6caa, 0x034d6db2, 0x0037e8b2}}, Y: Field{[10]uint32{0x01ad8b19, 0x033f9312, 0x0056e45a, 0x03ddba9c, 0x01d2a1a0, 0x032e98be, 0x0320fef4, 0x029b0633, 0x03ab3a28, 0x00317976}}}, + {X: Field{[10]uint32{0x02876730, 0x03931e4e, 0x0017bf35, 0x03af0429, 0x03acf4e2, 0x029b814e, 0x002c1352, 0x03ddad7a, 0x0007be6b, 0x00308804}}, Y: Field{[10]uint32{0x03efa581, 0x0345377e, 0x02be70c8, 0x03a24346, 0x039a735d, 0x030e1cd0, 0x0397c159, 0x0135d0eb, 0x02ecb9ae, 0x00249022}}}, + {X: Field{[10]uint32{0x03d7edc3, 0x020a1686, 0x0015e33e, 0x0253be8e, 0x022f25c7, 0x019cc1d0, 0x00d4d852, 0x01fc3e74, 0x02d2ab08, 0x0035158c}}, Y: Field{[10]uint32{0x015ff44f, 0x00f5bbe3, 0x02569554, 0x016369ee, 0x01814e72, 0x032792c7, 0x039e99f9, 0x013ea091, 0x0297c499, 0x002df38d}}}, + {X: Field{[10]uint32{0x035df93f, 0x000edc73, 0x00dedc90, 0x02e3dadf, 0x02df6c25, 0x008e85c6, 0x01f34ca9, 0x024ad221, 0x022bcdc2, 0x00233bcd}}, Y: Field{[10]uint32{0x009aaf5e, 0x02061b74, 0x02bdf260, 0x00ed76ad, 0x02d702e1, 0x03507666, 0x024f1c19, 0x01fe8afe, 0x0334ed8b, 0x002ce443}}}, + {X: Field{[10]uint32{0x00bf9838, 0x01d60ecf, 0x01bfc7f1, 0x03956565, 0x013a415a, 0x006121e3, 0x01604318, 0x00a0c45f, 0x03e1874c, 0x00091fde}}, Y: Field{[10]uint32{0x01f30eb8, 0x029f323c, 0x004642f8, 0x03a37cce, 0x01efd513, 0x017d9424, 0x01521da6, 0x02d3f03e, 0x01e6a779, 0x0024388d}}}, + {X: Field{[10]uint32{0x001cf568, 0x0122b626, 0x02c56b01, 0x01238daa, 0x02f26093, 0x032a8ae0, 0x01dd0b0a, 0x00eb7d04, 0x02f1c870, 0x002e3033}}, Y: Field{[10]uint32{0x01275f14, 0x011cab80, 0x03916a33, 0x02915303, 0x0345e7aa, 0x03526a5e, 0x00e74a81, 0x026a852e, 0x00114701, 0x00281065}}}, + {X: Field{[10]uint32{0x0208cf09, 0x006f61a0, 0x012c0ab5, 0x0036ab5e, 0x030a35ab, 0x03746f45, 0x026b43a4, 0x031e44aa, 0x036e06e1, 0x0023955d}}, Y: Field{[10]uint32{0x00822d56, 0x029eb61c, 0x01c012c8, 0x01fdb6aa, 0x02cec730, 0x03518b9a, 0x02d12bc6, 0x02aefc30, 0x00c3a025, 0x0037f933}}}, + {X: Field{[10]uint32{0x003ad1ad, 0x01611a83, 0x0267c5f0, 0x01c3122d, 0x01db813b, 0x038e4090, 0x0122790d, 0x02609138, 0x02d3fc9d, 0x0003c73d}}, Y: Field{[10]uint32{0x03984799, 0x025a6bf0, 0x026f6c8b, 0x024ec5ce, 0x01750069, 0x02b9ea13, 0x02f1ec77, 0x0346c8d7, 0x02ab3952, 0x00124971}}}, + {X: Field{[10]uint32{0x01b9ea31, 0x0199c2bb, 0x0000a9e5, 0x011f2b2f, 0x03811641, 0x036dd8b0, 0x00495ab9, 0x03b924ad, 0x0388dce5, 0x002d276f}}, Y: Field{[10]uint32{0x03a9ef2a, 0x01eb3ebf, 0x023feb8b, 0x030b7a24, 0x028971f7, 0x034a2291, 0x00d703ef, 0x025f1dd6, 0x0317ab57, 0x00303e4b}}}, + {X: Field{[10]uint32{0x018ca362, 0x0327dd43, 0x02cab9a8, 0x010e7992, 0x00399e26, 0x0097df73, 0x0173c50a, 0x015fb455, 0x02ad257b, 0x0035abf8}}, Y: Field{[10]uint32{0x0135749d, 0x02b1bce3, 0x01b42b47, 0x028d5871, 0x0138d355, 0x018a0ac4, 0x01402491, 0x02d5ac5c, 0x02b86919, 0x00177c8d}}}, + {X: Field{[10]uint32{0x02e8e89f, 0x00480106, 0x0244b53e, 0x0279a112, 0x0345b48a, 0x033b92d2, 0x032a439f, 0x0197e965, 0x00c5f233, 0x002ec0a1}}, Y: Field{[10]uint32{0x02265300, 0x01d8266e, 0x034936ae, 0x0329bc53, 0x0153221d, 0x03b554ca, 0x0018fb2a, 0x0164c9e4, 0x000de09e, 0x001a12f3}}}, + {X: Field{[10]uint32{0x024467ec, 0x00b611f9, 0x037e46e8, 0x009ead69, 0x03c47796, 0x0228105d, 0x00be6219, 0x025a5c6e, 0x03148a40, 0x0015fa55}}, Y: Field{[10]uint32{0x01443f13, 0x01467cb3, 0x00c126bb, 0x03497a15, 0x01fd8e7c, 0x004a94dd, 0x006d3a8f, 0x0096001f, 0x01b114ce, 0x001c52f4}}}, + {X: Field{[10]uint32{0x02713094, 0x0149b647, 0x03757d17, 0x01e3ad8d, 0x01a1e144, 0x03a01148, 0x03ef2a3d, 0x00ed1d48, 0x0360b33c, 0x002c320b}}, Y: Field{[10]uint32{0x02cea63c, 0x02be6528, 0x032eeac1, 0x03596a0a, 0x0123d163, 0x024fdff6, 0x022f70ac, 0x03d4b994, 0x01b9d763, 0x0033f234}}}, + {X: Field{[10]uint32{0x013e1ee3, 0x01292f55, 0x005a35c2, 0x0093fdfe, 0x00667d83, 0x01b663b4, 0x032c185c, 0x0216f564, 0x01704047, 0x000ae9d8}}, Y: Field{[10]uint32{0x02ea35b9, 0x035580fb, 0x03307205, 0x0067cf8b, 0x01e56aef, 0x01545934, 0x03167d6b, 0x00abd581, 0x03907426, 0x00006041}}}, + {X: Field{[10]uint32{0x02d3e88c, 0x0248d71b, 0x00895b5c, 0x02169c8a, 0x0103eb1c, 0x01f83296, 0x01d15c82, 0x02e483ec, 0x0213d508, 0x0016f553}}, Y: Field{[10]uint32{0x020cf0c9, 0x024cebd9, 0x016fc2b1, 0x02b3bcef, 0x02878017, 0x02b1f608, 0x030ab1e4, 0x03864fa9, 0x01fd5607, 0x0035974d}}}, + {X: Field{[10]uint32{0x02a8d09a, 0x037e5dcf, 0x026947cc, 0x017d5993, 0x00a590d6, 0x01b3c84b, 0x03f1664e, 0x03626aca, 0x02d2753b, 0x002c2ef0}}, Y: Field{[10]uint32{0x03993c23, 0x0026f723, 0x0147e47f, 0x01047cd3, 0x02072257, 0x03319c14, 0x00190654, 0x022eae85, 0x02c1a107, 0x002415ed}}}, + {X: Field{[10]uint32{0x013133a8, 0x03a771b3, 0x00459224, 0x00c083a3, 0x01b38b46, 0x0151484a, 0x000fe419, 0x00e2b377, 0x02033cca, 0x00305c04}}, Y: Field{[10]uint32{0x01557e9a, 0x02d8dabd, 0x03b14fb6, 0x02d7afd3, 0x02624f78, 0x01b02185, 0x00071888, 0x01bd9d1b, 0x007b1cfb, 0x00312576}}}, + {X: Field{[10]uint32{0x03a21bda, 0x00c28917, 0x032ea749, 0x037764d4, 0x007c9fa4, 0x03ef0a31, 0x02879617, 0x0127fcc8, 0x020e5f1e, 0x000782f4}}, Y: Field{[10]uint32{0x03dd6177, 0x02385810, 0x01cd5703, 0x02719af8, 0x01b2a586, 0x011cbe84, 0x01a681b2, 0x03c57797, 0x00000e98, 0x000b501d}}}, + {X: Field{[10]uint32{0x017ec15f, 0x006c560c, 0x0388b03a, 0x028ef017, 0x00f39def, 0x0214ce9c, 0x012a9740, 0x019863fc, 0x023fec4c, 0x00173f08}}, Y: Field{[10]uint32{0x03f21411, 0x00cd512b, 0x00cf93da, 0x03ded9c6, 0x01eb4468, 0x031ce2c2, 0x006ec226, 0x01c6798e, 0x03d489e3, 0x001f64a2}}}, + {X: Field{[10]uint32{0x01efa67d, 0x03330b20, 0x00e8801c, 0x033942b0, 0x005da345, 0x02b51ea1, 0x03e514eb, 0x019a3815, 0x020abebd, 0x003d4195}}, Y: Field{[10]uint32{0x020fc7e9, 0x029f4eb2, 0x00d639d9, 0x036056f7, 0x0263111f, 0x01fd9289, 0x03580ad1, 0x02a66af0, 0x03f7c9c2, 0x0038bfc2}}}, + {X: Field{[10]uint32{0x02c54f45, 0x039ef609, 0x02ef8306, 0x02b96fe5, 0x001d00dc, 0x0127405a, 0x0246e4c4, 0x01d21516, 0x0298ec88, 0x0021123f}}, Y: Field{[10]uint32{0x026f0407, 0x03bb6afa, 0x0256a66a, 0x0117da75, 0x0285b200, 0x00d204dd, 0x01a82713, 0x000c88b7, 0x02291750, 0x00343c1c}}}, + {X: Field{[10]uint32{0x03cffc55, 0x01156ea5, 0x004f56bc, 0x00a2a619, 0x002480cf, 0x00a50bcd, 0x015ca713, 0x01f0b8db, 0x017fdb03, 0x003269a1}}, Y: Field{[10]uint32{0x03aa149f, 0x0238d9e3, 0x011c6b79, 0x01d2da33, 0x01f742d9, 0x03b5be5f, 0x00b8326c, 0x023985b0, 0x00b98f67, 0x0029a782}}}, + {X: Field{[10]uint32{0x02c4011d, 0x0319936e, 0x019d503d, 0x01b6391a, 0x03b8fc28, 0x0226ac67, 0x02f7db2d, 0x03acef20, 0x03f5c611, 0x0002d744}}, Y: Field{[10]uint32{0x024b7adc, 0x02022c4c, 0x02bb6259, 0x036271c0, 0x02ef2692, 0x00921f42, 0x012493ff, 0x003f7d6e, 0x02507cdc, 0x0009fac5}}}, + {X: Field{[10]uint32{0x0235ce44, 0x02ecd3b6, 0x02fad75a, 0x01c75fc6, 0x02902184, 0x0230a71b, 0x001b8871, 0x0352b300, 0x01f32e0e, 0x002fe7b1}}, Y: Field{[10]uint32{0x027ef2d1, 0x00dea011, 0x0146bdd8, 0x01a1ce19, 0x00a1734f, 0x01a311e9, 0x01224ed3, 0x010196de, 0x0088892b, 0x0004e119}}}, + {X: Field{[10]uint32{0x02526e19, 0x024ab04e, 0x00f2ed6d, 0x021eb5aa, 0x00893c5a, 0x0329bd6e, 0x011f6bd1, 0x00704ebb, 0x02be4d3b, 0x000b0e04}}, Y: Field{[10]uint32{0x0033aece, 0x02533bcd, 0x03af324a, 0x02b4519a, 0x031b11ed, 0x02cd02f2, 0x03cf877d, 0x014782de, 0x02f145d5, 0x000d9ae0}}}, + {X: Field{[10]uint32{0x0233f572, 0x031721b2, 0x013a6f21, 0x014e362f, 0x019fd172, 0x002289b9, 0x00d0a13c, 0x03db21ff, 0x0328dc8e, 0x001def7b}}, Y: Field{[10]uint32{0x023c3a1b, 0x019fda7a, 0x017ef081, 0x022a0fe5, 0x016977ba, 0x02960294, 0x02c1feca, 0x03526c03, 0x00c7bf3b, 0x003699ac}}}, + {X: Field{[10]uint32{0x0371afe5, 0x03f445a2, 0x02b154ef, 0x0301953b, 0x028693ba, 0x03cd3181, 0x006503e3, 0x021def36, 0x019d3185, 0x002f129e}}, Y: Field{[10]uint32{0x0255569e, 0x03ddd5dc, 0x03e664f7, 0x01af4cc6, 0x03f59abf, 0x00985496, 0x0159c99e, 0x00643a9c, 0x03f899a8, 0x0014ff35}}}, + {X: Field{[10]uint32{0x02fcd040, 0x0170620b, 0x039dce27, 0x01bcb84f, 0x006fccdb, 0x000dd41e, 0x010e4c7d, 0x03381586, 0x0084733d, 0x000c07f6}}, Y: Field{[10]uint32{0x01e25cb6, 0x00b22294, 0x00b735de, 0x00303897, 0x00312c91, 0x012f981f, 0x0035cef6, 0x027d47f6, 0x01d5185b, 0x001e793e}}}, + {X: Field{[10]uint32{0x014adb70, 0x018062a0, 0x032f387b, 0x01df9436, 0x02133f83, 0x00dc6710, 0x00d0bda1, 0x01f95085, 0x029bbe5e, 0x000906d2}}, Y: Field{[10]uint32{0x0010bdb0, 0x019211ed, 0x039593c1, 0x0000922c, 0x03a8ce21, 0x03f30032, 0x036bca27, 0x0348b87d, 0x0008fa4f, 0x00319bb7}}}, + {X: Field{[10]uint32{0x00c79585, 0x028580b6, 0x0098156e, 0x005bcca5, 0x01dcd28c, 0x018cf547, 0x01c1351d, 0x004a24f1, 0x02396819, 0x002f9bc5}}, Y: Field{[10]uint32{0x03afff21, 0x029c797e, 0x0335a5f7, 0x0282950c, 0x021ade5d, 0x03d7f979, 0x038a9668, 0x014e7a9f, 0x027e1a65, 0x001bd9d2}}}, + {X: Field{[10]uint32{0x01d3a283, 0x01f2cc4f, 0x03285e23, 0x02eadff2, 0x01b3f7bf, 0x028b452e, 0x0209ef60, 0x0278a9f8, 0x008f79c6, 0x00322d40}}, Y: Field{[10]uint32{0x03b54bb9, 0x00fb029a, 0x008f52d8, 0x032a98c0, 0x023cea15, 0x01bbf2cd, 0x0036dd74, 0x03df802f, 0x03486c3c, 0x000771e4}}}, + {X: Field{[10]uint32{0x006c0998, 0x029ffd30, 0x027d4eed, 0x02b1df3c, 0x02b038ed, 0x01e5ab47, 0x0197ec3a, 0x03b5893a, 0x039eaad5, 0x0014052b}}, Y: Field{[10]uint32{0x0189dd7d, 0x0221808c, 0x031511a4, 0x014cd25d, 0x01911439, 0x021ed2db, 0x004a77a9, 0x028714b5, 0x006fb8fa, 0x0038075e}}}, + {X: Field{[10]uint32{0x03bb989a, 0x02b76329, 0x02d2b45d, 0x03023620, 0x01b0845e, 0x03ca3f37, 0x02d4f284, 0x0190fb68, 0x01e62c40, 0x001bffbf}}, Y: Field{[10]uint32{0x0011cc0e, 0x01bf9721, 0x004717fb, 0x0201a9bd, 0x01ff0a54, 0x028afb2f, 0x029e4bd9, 0x00ea7888, 0x003c782d, 0x00238ac6}}}, + {X: Field{[10]uint32{0x007d463f, 0x03fc7c52, 0x022904aa, 0x003f07a4, 0x020ad014, 0x02d3030d, 0x02a7e5d0, 0x004dd34c, 0x03bf190e, 0x002b1d8a}}, Y: Field{[10]uint32{0x033adefe, 0x02944f97, 0x02a7e435, 0x0143b606, 0x03bc34d8, 0x036dac4b, 0x001bfec5, 0x01ad028e, 0x03183101, 0x003335e7}}}, + {X: Field{[10]uint32{0x0011cb24, 0x023ab83a, 0x03342796, 0x0337a0a3, 0x03d791a5, 0x01cdec76, 0x03244e7b, 0x0171d424, 0x02d63ec0, 0x0025cd25}}, Y: Field{[10]uint32{0x01647533, 0x01cf99c9, 0x03b7abf5, 0x0194bd5e, 0x03d7420b, 0x030fcd3c, 0x037ff525, 0x00cd47d8, 0x03c0044e, 0x0012cb26}}}, + {X: Field{[10]uint32{0x00a15d32, 0x0266cd21, 0x034291a7, 0x0001be80, 0x02c39ce3, 0x03a8e78d, 0x03577539, 0x02f0c1d0, 0x01665f77, 0x002a7624}}, Y: Field{[10]uint32{0x0380e213, 0x0204ee12, 0x0296b8d0, 0x013f33ea, 0x0056dd88, 0x0018d694, 0x039ce982, 0x02e3f3d3, 0x0217fded, 0x0034270e}}}, + {X: Field{[10]uint32{0x00c5710b, 0x02a68828, 0x02f769ec, 0x01bd835b, 0x02cbab63, 0x009086eb, 0x00a7419f, 0x0151362e, 0x03fdaa2b, 0x000422a3}}, Y: Field{[10]uint32{0x00e0249d, 0x01599735, 0x028d7b12, 0x01ce77cc, 0x01cebbb2, 0x017c38e2, 0x025776a7, 0x02b56289, 0x01fcab04, 0x0002b4fa}}}, + {X: Field{[10]uint32{0x027c5fb5, 0x0316fb5c, 0x00a36de8, 0x02365448, 0x03954387, 0x01791257, 0x000ac6df, 0x00f15eff, 0x017bc884, 0x003be5a7}}, Y: Field{[10]uint32{0x021f16fb, 0x033e170d, 0x0302afc1, 0x014dee02, 0x01d1d4d6, 0x037aab69, 0x005d81a1, 0x0200dac5, 0x03b22673, 0x0016ae06}}}, + {X: Field{[10]uint32{0x03c39b62, 0x028c2590, 0x01162b0b, 0x03c9043d, 0x01d74200, 0x03dc2c91, 0x02dafb28, 0x01514fc4, 0x03c24d50, 0x002ae096}}, Y: Field{[10]uint32{0x01281a1d, 0x032c196c, 0x0194c6f9, 0x02e35155, 0x01708098, 0x01dea072, 0x03e31da2, 0x01105769, 0x01f22377, 0x001e279f}}}, + {X: Field{[10]uint32{0x00bf2622, 0x015aec12, 0x03ac0598, 0x00e664ce, 0x02eeed4e, 0x02125a5c, 0x039198cf, 0x00f00bb1, 0x00e52c17, 0x00126129}}, Y: Field{[10]uint32{0x00c5df3f, 0x033e25eb, 0x034348e7, 0x0090e647, 0x02f199e9, 0x0330f33d, 0x0087a9c2, 0x00b98682, 0x027b79be, 0x001165ad}}}, + {X: Field{[10]uint32{0x025f7272, 0x01284c98, 0x02fbccfa, 0x01a88fcf, 0x004bf0f7, 0x02a9f2c9, 0x0360d0d8, 0x02f84fd3, 0x03f493c1, 0x000a171b}}, Y: Field{[10]uint32{0x03ed49d3, 0x01ecf674, 0x03c1212d, 0x0397a289, 0x03c4caac, 0x0276e6c8, 0x00fd9984, 0x03bca357, 0x01a5cf9c, 0x000e77fa}}}, + {X: Field{[10]uint32{0x003db340, 0x02dc23e1, 0x02c7b348, 0x001b09e2, 0x019bc6e5, 0x00c402aa, 0x02667171, 0x0065c7a4, 0x01d17e72, 0x0007852c}}, Y: Field{[10]uint32{0x00e41cee, 0x0017c113, 0x02a1164d, 0x03f17de7, 0x00394d7d, 0x0135050f, 0x03fe464c, 0x03d89cd1, 0x039dd705, 0x00018e88}}}, + {X: Field{[10]uint32{0x0217c8aa, 0x0102ed6f, 0x018fc101, 0x030133cc, 0x033b1394, 0x03352161, 0x01dcf309, 0x03347bd8, 0x03b9ed71, 0x0002e3dc}}, Y: Field{[10]uint32{0x036f665c, 0x0041f99d, 0x02ec5827, 0x01a96b10, 0x01074567, 0x006f997b, 0x034823aa, 0x03b214bf, 0x02e0bd66, 0x0022bd76}}}, + {X: Field{[10]uint32{0x0314540a, 0x012fdba1, 0x01d15e62, 0x034c7352, 0x0049c995, 0x03456bf4, 0x02367760, 0x03f3db2d, 0x0297e878, 0x001f831c}}, Y: Field{[10]uint32{0x02ddd658, 0x02bc3f6b, 0x000e58aa, 0x00c0280a, 0x00ffd595, 0x02c9c680, 0x00b7568b, 0x00810fd2, 0x01f74c51, 0x0037d5e5}}}, + {X: Field{[10]uint32{0x03798545, 0x03f409da, 0x02cbade5, 0x0046dd52, 0x00109990, 0x03377f92, 0x0351133f, 0x03b67e8a, 0x011d465b, 0x00027c3b}}, Y: Field{[10]uint32{0x00a8459f, 0x02666405, 0x016e9217, 0x00e398c9, 0x01d85b6c, 0x00aaa676, 0x03adde01, 0x00380192, 0x009c73bb, 0x001c017b}}}, + {X: Field{[10]uint32{0x008e12bf, 0x02946aa7, 0x01b125a0, 0x0002c78d, 0x03cc8e40, 0x00388f3b, 0x020608d8, 0x016bc005, 0x035e0b5c, 0x000b555b}}, Y: Field{[10]uint32{0x01f12000, 0x0108b285, 0x038a94e4, 0x0223e02a, 0x01d24d44, 0x03f61bd0, 0x007f6fc1, 0x00eebc77, 0x014425bc, 0x0001d800}}}, + {X: Field{[10]uint32{0x035ed3f2, 0x0206f320, 0x0128ee8d, 0x03950526, 0x012cc14c, 0x0271f730, 0x0079524d, 0x0380b02d, 0x027d7637, 0x000985d9}}, Y: Field{[10]uint32{0x0380884b, 0x02b90651, 0x019babc6, 0x005806ca, 0x017a2c4e, 0x01e3298e, 0x01496be4, 0x0027ae3d, 0x03ba2cd8, 0x0014855c}}}, + {X: Field{[10]uint32{0x019aac10, 0x02c187c3, 0x02492ba1, 0x033fb416, 0x034cae40, 0x020428fc, 0x036e10f8, 0x026991ed, 0x016c5b51, 0x001891e4}}, Y: Field{[10]uint32{0x02e7f098, 0x00cc09bb, 0x034caf2d, 0x01a70fa7, 0x00602b09, 0x00036875, 0x02a193c5, 0x02a5e241, 0x0170535b, 0x003ff409}}}, + {X: Field{[10]uint32{0x023c52af, 0x017533e6, 0x03db4fa5, 0x012a544d, 0x01ea14c6, 0x03b3b3ee, 0x0017e780, 0x002a2180, 0x03e08ed5, 0x003102c9}}, Y: Field{[10]uint32{0x007b6493, 0x03c6b378, 0x0001ba86, 0x02e0c3aa, 0x00c4149f, 0x00416a95, 0x01d1e977, 0x016e13f6, 0x038c7d02, 0x00090572}}}, + {X: Field{[10]uint32{0x03e0de12, 0x0195e340, 0x029748b6, 0x02afc199, 0x03ad7103, 0x03aea713, 0x01bf17bc, 0x0295bf34, 0x008a54a3, 0x002e96bb}}, Y: Field{[10]uint32{0x0157ffbd, 0x03562c1b, 0x0370dc49, 0x0180e7e6, 0x00a705de, 0x03a96e98, 0x03474d28, 0x0312fcf1, 0x0311abec, 0x000d236a}}}, + {X: Field{[10]uint32{0x00076268, 0x00089225, 0x03f675c0, 0x00139571, 0x02c1e9e5, 0x03ecfcc6, 0x031262cf, 0x00a5384c, 0x0258f8dd, 0x002e8539}}, Y: Field{[10]uint32{0x001aa1dd, 0x01b792b2, 0x023659b9, 0x038e8c9b, 0x00c221b0, 0x01b76684, 0x00cb36c6, 0x03957b1c, 0x0105fc43, 0x0033b5d2}}}, + {X: Field{[10]uint32{0x03f4aff4, 0x037e85a9, 0x022d4cfb, 0x00382870, 0x00f9c1d0, 0x004e6acc, 0x02718cb4, 0x031fe8a7, 0x03698880, 0x000cdd6b}}, Y: Field{[10]uint32{0x02295a27, 0x0399fbb3, 0x01726ddd, 0x01e73957, 0x028d27db, 0x0389b1a3, 0x02fa0b85, 0x0396c6d9, 0x0091a83b, 0x0033ea2d}}}, + {X: Field{[10]uint32{0x019f01fe, 0x0252a92f, 0x002d5efc, 0x038bdf54, 0x035b9a8e, 0x0312c9db, 0x03a109a2, 0x03f7eba7, 0x014b306c, 0x001a3498}}, Y: Field{[10]uint32{0x0348550e, 0x00e1b217, 0x008f3661, 0x01221023, 0x01ef9e1d, 0x03503ed6, 0x01f54e84, 0x0197b5f7, 0x02bcf043, 0x0005230d}}}, + {X: Field{[10]uint32{0x00533edd, 0x011edfc7, 0x0277b7fc, 0x01ac1b0d, 0x03900ece, 0x0358ce1e, 0x02990d71, 0x000ec2b4, 0x02a55977, 0x0024feb3}}, Y: Field{[10]uint32{0x002ad5f4, 0x011e5f25, 0x03179745, 0x011363b9, 0x01c20bbe, 0x02687db0, 0x00199853, 0x0053a2d7, 0x03fa8fa1, 0x000f2006}}}, + {X: Field{[10]uint32{0x01054277, 0x01b09d5d, 0x005d6eef, 0x03c5b288, 0x025a0a61, 0x01b242ca, 0x0375ae17, 0x00c46255, 0x00a672f7, 0x003c4775}}, Y: Field{[10]uint32{0x01556ef6, 0x026d5a2e, 0x020e83f5, 0x01154782, 0x006c307d, 0x03063434, 0x022083ca, 0x02b03dfa, 0x016d2ef2, 0x002f01a8}}}, + {X: Field{[10]uint32{0x024204f7, 0x0328e721, 0x00010f10, 0x02165c97, 0x000b71fe, 0x020f2001, 0x029a94ef, 0x029153f4, 0x005d710b, 0x0010baf3}}, Y: Field{[10]uint32{0x025f223b, 0x001934b5, 0x00e40279, 0x01f371a6, 0x00e633c1, 0x01c7419f, 0x03d5cdb2, 0x0007b531, 0x00eb6431, 0x003e2aa1}}}, + {X: Field{[10]uint32{0x01c80e52, 0x0278f861, 0x03b2e67e, 0x03684fc7, 0x00549e96, 0x02274668, 0x03b6fbce, 0x016a5021, 0x03dcd96d, 0x0035021d}}, Y: Field{[10]uint32{0x02789444, 0x0388d317, 0x0087c837, 0x001bd764, 0x02c0be83, 0x03f00510, 0x017b59af, 0x003f2e39, 0x01b385f2, 0x002fa6ee}}}, + {X: Field{[10]uint32{0x0162931f, 0x01d0d609, 0x03e398fa, 0x02eeae35, 0x03aa40c1, 0x00e49029, 0x00ec9342, 0x0042ae22, 0x0098cd21, 0x003062cb}}, Y: Field{[10]uint32{0x015773f8, 0x00b3a5c5, 0x001cb24c, 0x02724df0, 0x03b83f18, 0x0019b102, 0x01f18cd1, 0x035d31d7, 0x00349147, 0x00365884}}}, + {X: Field{[10]uint32{0x005c0bd1, 0x03e238f8, 0x039e4d14, 0x01631923, 0x036fe946, 0x02ed37af, 0x034fa0c4, 0x03e10473, 0x03221a44, 0x0005535a}}, Y: Field{[10]uint32{0x0075559a, 0x014a9656, 0x01976de5, 0x03cfaf15, 0x037c1074, 0x0365398f, 0x00bbb6ad, 0x00ccbcca, 0x0307c705, 0x0037c2f0}}}, + {X: Field{[10]uint32{0x01a26f15, 0x009a8d78, 0x006e0a93, 0x01670eae, 0x0024485d, 0x02610b6f, 0x017d2285, 0x024ec68e, 0x01e5629f, 0x0028e096}}, Y: Field{[10]uint32{0x01f783fb, 0x02ee7aa4, 0x01892367, 0x013fd0d7, 0x00171327, 0x0229e6e3, 0x0074932e, 0x00a98ece, 0x00cc2fe5, 0x001a6d6b}}}, + {X: Field{[10]uint32{0x023fcd19, 0x02ca8f1d, 0x02013d4d, 0x00a5be08, 0x00148270, 0x03bb7b46, 0x025a7d52, 0x00d24e64, 0x02eee91e, 0x00275ca7}}, Y: Field{[10]uint32{0x03e89a1f, 0x02a8bc38, 0x00339657, 0x027938cc, 0x009cadc0, 0x0361d3ec, 0x02f731f2, 0x02188459, 0x015403cc, 0x001b60c8}}}, + {X: Field{[10]uint32{0x03751e3a, 0x01c06cd9, 0x00b39b25, 0x024e283e, 0x0346398c, 0x0112a7e6, 0x02cede79, 0x01f1f95d, 0x00088630, 0x00099d3c}}, Y: Field{[10]uint32{0x013f83cf, 0x0199ae06, 0x02fa212a, 0x031ea748, 0x02e31bde, 0x02c3c7d3, 0x03638d07, 0x0347be0d, 0x03426ac9, 0x0000fa7a}}}, + {X: Field{[10]uint32{0x02237f41, 0x03cd1453, 0x002c2743, 0x00b1bdc3, 0x03b7c164, 0x02d89b03, 0x028e9fdb, 0x02e15b74, 0x015eadb1, 0x002ca81b}}, Y: Field{[10]uint32{0x03f664d3, 0x033ab58e, 0x01f5ff3b, 0x02613401, 0x03de579a, 0x0206b582, 0x03baed44, 0x02c9a089, 0x038b8673, 0x0017532b}}}, + {X: Field{[10]uint32{0x022d713d, 0x03c8f848, 0x03a60f0b, 0x003c5056, 0x012b278c, 0x00103c17, 0x03e4ec92, 0x03af73b0, 0x0164d61d, 0x00082c9f}}, Y: Field{[10]uint32{0x00e516a3, 0x0111ede9, 0x03ffb41e, 0x0026eceb, 0x02c8c5c8, 0x00159d43, 0x01264886, 0x00b7cd73, 0x01e7ff5c, 0x00120761}}}, + {X: Field{[10]uint32{0x00e3f2e5, 0x0335714f, 0x0051bfc7, 0x003d169f, 0x03527093, 0x0031547d, 0x00d7c152, 0x02a897d8, 0x010c450e, 0x0013d298}}, Y: Field{[10]uint32{0x0247f328, 0x00bf640e, 0x0239c2b3, 0x013bf5f7, 0x01e82423, 0x03e75a3b, 0x02d8d8e0, 0x0188a19c, 0x0211db41, 0x0037c7a3}}}, + {X: Field{[10]uint32{0x00aceaa9, 0x03ee8daa, 0x01e9e776, 0x02245196, 0x03bc06c9, 0x00d66f01, 0x0170b4be, 0x010d6095, 0x02d80050, 0x0026cdd7}}, Y: Field{[10]uint32{0x01e90927, 0x01ab888d, 0x01f26d1e, 0x01021b73, 0x03226834, 0x01670d20, 0x01de5b1f, 0x0001a645, 0x0193385c, 0x000f4159}}}, + {X: Field{[10]uint32{0x02c9d1be, 0x0300648b, 0x03ba4060, 0x021cdff3, 0x03c13aff, 0x00e42dff, 0x03865e72, 0x00b21cc7, 0x00045d43, 0x0010d902}}, Y: Field{[10]uint32{0x0070cbeb, 0x01ac8818, 0x016eb234, 0x02496e2c, 0x025aff2a, 0x012ed3ef, 0x01f2aac5, 0x00ff878f, 0x02af6fc7, 0x00388ce3}}}, + {X: Field{[10]uint32{0x001e0b66, 0x01d849fd, 0x02a394c4, 0x00bbcae7, 0x0259287f, 0x02fa2353, 0x021f35cf, 0x0045c905, 0x004f2446, 0x0029b967}}, Y: Field{[10]uint32{0x019f334d, 0x03b17f9f, 0x032775f5, 0x00acb9ea, 0x0257a8ae, 0x0133dc62, 0x00fa470c, 0x01d7e507, 0x0347f5dd, 0x001d71c1}}}, + {X: Field{[10]uint32{0x01322d51, 0x02801ec9, 0x016ed7c9, 0x0165d2ca, 0x025293a9, 0x01a9b4ce, 0x03bf1e84, 0x0147f65d, 0x0217ae73, 0x003fd8e5}}, Y: Field{[10]uint32{0x03dac457, 0x01cc4594, 0x0239f79d, 0x01c7bd01, 0x03e21dca, 0x039e60d4, 0x03f81ffe, 0x0157dd94, 0x01abfa23, 0x0039848f}}}, + {X: Field{[10]uint32{0x02f4faf3, 0x0376fa53, 0x030435f8, 0x03b80722, 0x00c254df, 0x02b578a1, 0x0237cbc5, 0x03639822, 0x00401710, 0x001de452}}, Y: Field{[10]uint32{0x00611414, 0x02e3b638, 0x00ecaa54, 0x0118cb26, 0x02623be4, 0x02534a9a, 0x0075dc38, 0x03531c10, 0x00e99ef3, 0x00365fd1}}}, + {X: Field{[10]uint32{0x01484aad, 0x015e7ede, 0x00ee5d42, 0x03f01b76, 0x00947cf1, 0x03704d71, 0x0151c00a, 0x0152a841, 0x00aa0292, 0x003da244}}, Y: Field{[10]uint32{0x0052c1fc, 0x02d67930, 0x03c941b9, 0x0310fd71, 0x0269f9f5, 0x0325e137, 0x01587eaf, 0x01b58c2b, 0x03db33a5, 0x00102f7e}}}, + {X: Field{[10]uint32{0x036e0fd3, 0x01891906, 0x0169629f, 0x034b7bc7, 0x00f2d4d8, 0x03558361, 0x01c75011, 0x0133bdc6, 0x0381473d, 0x00056fa3}}, Y: Field{[10]uint32{0x00fd9a2a, 0x023bbb9c, 0x007bb1d2, 0x02a21241, 0x0364b85e, 0x01b64c99, 0x011ead00, 0x006d0711, 0x0126fc99, 0x001f99be}}}, + {X: Field{[10]uint32{0x0284e9ca, 0x006af762, 0x019db909, 0x01be682f, 0x03d0c5c2, 0x01f10722, 0x03272970, 0x00c0bbd0, 0x015a2e22, 0x0003844f}}, Y: Field{[10]uint32{0x01574dc0, 0x0095f2bd, 0x0353026a, 0x03472e00, 0x03b54941, 0x03c6cb16, 0x026b70b2, 0x0371145e, 0x02d834c6, 0x000b9218}}}, + {X: Field{[10]uint32{0x03bea688, 0x0237f9d1, 0x01595aa7, 0x02c15f5b, 0x022c94da, 0x030346f8, 0x0220d9de, 0x02e99dfd, 0x0370485b, 0x0025ac41}}, Y: Field{[10]uint32{0x03dbf30b, 0x027a7c6e, 0x016a5225, 0x03092926, 0x02ff854a, 0x031de766, 0x021bd58f, 0x01c9ab06, 0x02ae0222, 0x0038182a}}}, + {X: Field{[10]uint32{0x0005545d, 0x01e24d09, 0x02183de8, 0x031d68e3, 0x0057f6f7, 0x034b3f63, 0x025e8990, 0x0255385f, 0x03005555, 0x00205d0b}}, Y: Field{[10]uint32{0x02d2fc0e, 0x03b80f4b, 0x0236edf1, 0x031a3e48, 0x00a8d742, 0x00d5e3ec, 0x032fbb07, 0x0017cb9b, 0x03c2e5f7, 0x00285d8f}}}, + {X: Field{[10]uint32{0x0378a480, 0x01207fee, 0x01c17fcc, 0x002f85b0, 0x0386bc7a, 0x02434dee, 0x00b72eaf, 0x023d89df, 0x03139698, 0x0005f067}}, Y: Field{[10]uint32{0x03c78833, 0x030eed94, 0x01fd9c5e, 0x0181c63e, 0x013f430e, 0x038f946e, 0x01c2642a, 0x0193ad88, 0x00d52101, 0x0032c4a4}}}, + {X: Field{[10]uint32{0x02497a3c, 0x0066fae8, 0x01c3f403, 0x001d8f00, 0x00bfeee5, 0x02e18552, 0x0248b2bb, 0x01bb2719, 0x0306e874, 0x00001ec3}}, Y: Field{[10]uint32{0x02a70020, 0x02dde3b5, 0x00c6a2fd, 0x016275ba, 0x031634b7, 0x032a831e, 0x00b318f1, 0x01f638c2, 0x03788429, 0x0031a524}}}, + {X: Field{[10]uint32{0x02c5e8b3, 0x015ba444, 0x0013405f, 0x005f2c6e, 0x0055a805, 0x02a26dd5, 0x027d8c28, 0x0060fe69, 0x03062414, 0x001c570a}}, Y: Field{[10]uint32{0x0120370b, 0x015dcfc9, 0x03b33920, 0x000e5de1, 0x0123167f, 0x03e12d35, 0x02d4cca7, 0x01771c78, 0x01c89a79, 0x003e26e2}}}, + {X: Field{[10]uint32{0x0374d3b6, 0x03d03723, 0x024c78f1, 0x00277626, 0x01057aed, 0x03f976fd, 0x0377662e, 0x03f1e1d9, 0x0200f974, 0x00383433}}, Y: Field{[10]uint32{0x03e3eb56, 0x01c138b8, 0x000d3e85, 0x03f9f2cf, 0x03c253be, 0x01315447, 0x03c7f05c, 0x01211e52, 0x0265ed70, 0x002b316f}}}, + {X: Field{[10]uint32{0x026432a2, 0x002ac7f4, 0x02222e77, 0x021d6eb5, 0x01bdba9a, 0x033674a8, 0x01aaf75e, 0x02e2de69, 0x028976fb, 0x000dd54c}}, Y: Field{[10]uint32{0x02ced92d, 0x00584230, 0x01d77eb0, 0x01f0b170, 0x0001087e, 0x00aca822, 0x00bc7d01, 0x00192f60, 0x02331b7e, 0x001b6ef8}}}, + {X: Field{[10]uint32{0x03e3d3ff, 0x02ace81b, 0x00699446, 0x0144aaf7, 0x00f46ca6, 0x02cabec1, 0x003f6b08, 0x0240da1a, 0x03ef51ea, 0x000ba570}}, Y: Field{[10]uint32{0x019b554a, 0x02d030ca, 0x0349839c, 0x019802ca, 0x0201556c, 0x01876f18, 0x0063b94c, 0x037f8121, 0x0287b1d8, 0x0002417a}}}, + {X: Field{[10]uint32{0x00ff8eb5, 0x01f5d6b1, 0x02cf40fe, 0x0036d645, 0x02646758, 0x01cd54fd, 0x035c67fb, 0x00c915fc, 0x021e721f, 0x00094c43}}, Y: Field{[10]uint32{0x006b4ace, 0x02d50c1e, 0x03041016, 0x018b05fa, 0x0146ecd6, 0x01f72ac7, 0x01a359b8, 0x03bad509, 0x02f9be42, 0x00271794}}}, + {X: Field{[10]uint32{0x03830b7b, 0x001fd46d, 0x013b0cf7, 0x01f5febd, 0x0227a23b, 0x035f2d41, 0x00779117, 0x03f0b75e, 0x031b2b24, 0x000964ca}}, Y: Field{[10]uint32{0x03536765, 0x00cb6477, 0x00f3e04e, 0x00180427, 0x022215e2, 0x037ce8ab, 0x03969a6d, 0x009ac075, 0x03b4acdb, 0x001fa388}}}, + {X: Field{[10]uint32{0x03c5ed3e, 0x005a911c, 0x0284e22b, 0x017ac26d, 0x02892e13, 0x025fd6e2, 0x029ba443, 0x01d99ee9, 0x02f6251f, 0x001f48ca}}, Y: Field{[10]uint32{0x02d8356e, 0x00995c69, 0x0392c1cd, 0x01165426, 0x00131b90, 0x026093c7, 0x03dea61d, 0x0226d633, 0x0238c8a5, 0x0028fa3d}}}, + {X: Field{[10]uint32{0x00c720f9, 0x03a5d572, 0x03633cb9, 0x01141211, 0x026afc86, 0x01125581, 0x03e05b0a, 0x03aa1ee8, 0x02a01b65, 0x001355b2}}, Y: Field{[10]uint32{0x03537330, 0x0105dc5d, 0x0208f50f, 0x03865deb, 0x007c1eae, 0x00dbc0d2, 0x03f1ada9, 0x01465f28, 0x027836e6, 0x000530d1}}}, + {X: Field{[10]uint32{0x0100a88b, 0x03bef671, 0x01c2c122, 0x000cdc9f, 0x032615b5, 0x031c8bb5, 0x01c81f42, 0x03e2eddd, 0x0165ca6f, 0x001c6af4}}, Y: Field{[10]uint32{0x012620f1, 0x02ae2112, 0x00eb9c39, 0x01499089, 0x01a59693, 0x0046b12e, 0x031c46ae, 0x013e18be, 0x00670728, 0x001e6e89}}}, + {X: Field{[10]uint32{0x02a48965, 0x00ba4195, 0x039f4200, 0x01d31045, 0x0230215e, 0x03176795, 0x00496345, 0x00146731, 0x00ccc381, 0x002118bf}}, Y: Field{[10]uint32{0x03787d4b, 0x00241229, 0x005cb64d, 0x029d70f0, 0x00f0eb75, 0x027f1190, 0x0148a7e2, 0x02e662f1, 0x0166cd7f, 0x00014d6a}}}, + {X: Field{[10]uint32{0x02c09826, 0x03a4d44d, 0x01ae3286, 0x0011bf91, 0x00b9c2b1, 0x0195a12a, 0x0178b5c6, 0x0147402d, 0x0093fed7, 0x003da3ab}}, Y: Field{[10]uint32{0x0148bff5, 0x013f117f, 0x01831733, 0x0355cca8, 0x0366f7d8, 0x02943952, 0x0119ff2f, 0x02a28a3c, 0x032b98b0, 0x00263830}}}, + {X: Field{[10]uint32{0x01f72041, 0x0110acb6, 0x00b1615f, 0x031f9250, 0x0243467d, 0x01bfd5a6, 0x00e4014f, 0x0364d670, 0x025009a8, 0x0018511c}}, Y: Field{[10]uint32{0x02c8f807, 0x00cc505e, 0x02d2eb2f, 0x0024abac, 0x00fa58f2, 0x03efaa22, 0x02a7108d, 0x01fb9f7b, 0x037fc7f5, 0x0003edc5}}}, + {X: Field{[10]uint32{0x0315614f, 0x023b3152, 0x01497fc2, 0x0324de68, 0x01c9846a, 0x00b6233c, 0x0259a26e, 0x006f4b88, 0x02114ffa, 0x003a9a7b}}, Y: Field{[10]uint32{0x00e4e2de, 0x02dda317, 0x022c9b17, 0x006e026d, 0x0163183d, 0x0375b3cf, 0x00141083, 0x035d4244, 0x01b51dd6, 0x001626e0}}}, + {X: Field{[10]uint32{0x025d5263, 0x01319813, 0x02b78146, 0x0057147e, 0x0338e6aa, 0x01ffc542, 0x01a1ce0d, 0x037a5990, 0x03243404, 0x000d1c9e}}, Y: Field{[10]uint32{0x0027d4f2, 0x00a27536, 0x03804435, 0x03cb56ef, 0x031920bf, 0x03001a74, 0x039baadd, 0x0329dcd6, 0x026bcf56, 0x0024660c}}}, + {X: Field{[10]uint32{0x02217461, 0x02343667, 0x02ad952f, 0x036549b3, 0x00eeebf4, 0x03a62d3c, 0x022d2756, 0x01e370a7, 0x02ae6137, 0x00254914}}, Y: Field{[10]uint32{0x02d486a8, 0x01c5d6ca, 0x035ff079, 0x020b7052, 0x03c17f65, 0x006c5046, 0x0250eb10, 0x03ed6be6, 0x0228c195, 0x003022ce}}}, + {X: Field{[10]uint32{0x038e49ff, 0x02855ab9, 0x01bfd2d4, 0x010af78b, 0x02401b83, 0x019840c1, 0x01afeba6, 0x022f1dfa, 0x0318dc4a, 0x003ef28f}}, Y: Field{[10]uint32{0x014129c9, 0x01f910fe, 0x029b6c7b, 0x01ceee4c, 0x034cf755, 0x01dae493, 0x020db7bc, 0x02cb7bb6, 0x016d6027, 0x000ae0a7}}}, + {X: Field{[10]uint32{0x03d8c141, 0x03130556, 0x0082b57b, 0x03fee502, 0x005302bf, 0x0022929c, 0x03dff64a, 0x0190ea55, 0x011d7ddc, 0x0031f77c}}, Y: Field{[10]uint32{0x02708e20, 0x01559a5b, 0x02a8889d, 0x038628f6, 0x03b3711e, 0x00e6f9e6, 0x03e81468, 0x02c0600f, 0x01f1ac93, 0x003a7284}}}, + {X: Field{[10]uint32{0x00ce31b8, 0x03b9299c, 0x02fa2cd0, 0x014e72db, 0x011b3f23, 0x039a0860, 0x031f7e44, 0x0018fae0, 0x023086e3, 0x001c410e}}, Y: Field{[10]uint32{0x01322c9d, 0x02df2d22, 0x03411ebc, 0x01914c82, 0x019334c1, 0x0178a613, 0x029cc925, 0x0349cd2a, 0x0338ef9f, 0x00136cfc}}}, + {X: Field{[10]uint32{0x00602585, 0x01a9dd92, 0x034c3dbb, 0x0111e644, 0x005d70f0, 0x003e8dd7, 0x0349d368, 0x01f2ef64, 0x02401534, 0x001b793a}}, Y: Field{[10]uint32{0x03960418, 0x01df7c9f, 0x03d70f1d, 0x010ce31c, 0x02458a32, 0x01c0973c, 0x028d8394, 0x014b6fba, 0x018865ab, 0x0000edd9}}}, + {X: Field{[10]uint32{0x024fecbe, 0x0095a5ae, 0x02215bc4, 0x030387e9, 0x01db9a0c, 0x03dee80f, 0x017e23b6, 0x03b2dfa8, 0x039f467c, 0x000a7ea9}}, Y: Field{[10]uint32{0x00f34838, 0x03fe86d2, 0x01154e50, 0x017b4bfc, 0x0264a224, 0x01af7c41, 0x03027d04, 0x02f0a707, 0x011fc42f, 0x00396a9a}}}, + {X: Field{[10]uint32{0x02aafc99, 0x010be4c5, 0x00f79c8c, 0x02e1d244, 0x03d750f8, 0x00afe3d6, 0x025f15a0, 0x016c89e3, 0x03fc25ae, 0x003fe202}}, Y: Field{[10]uint32{0x025747df, 0x03bba08e, 0x00b105ee, 0x019af228, 0x0360e7a1, 0x02ed40b6, 0x0025bd81, 0x023de4de, 0x030a0072, 0x00254d7d}}}, + {X: Field{[10]uint32{0x00a2a378, 0x01af4be9, 0x00eeef6a, 0x02c90949, 0x0160eff0, 0x014ba302, 0x020c5663, 0x03dbd614, 0x02a03837, 0x002de06d}}, Y: Field{[10]uint32{0x00dbbb62, 0x03ffefd3, 0x01e4fc44, 0x027989d5, 0x01cbf838, 0x0304ada7, 0x0322ee73, 0x00f7650d, 0x03d46c68, 0x002b35ed}}}, + {X: Field{[10]uint32{0x027406db, 0x01028ed1, 0x01990ee5, 0x01896411, 0x03b3f190, 0x00b92b0a, 0x0332c648, 0x03174369, 0x0193e8ba, 0x001b65d9}}, Y: Field{[10]uint32{0x032a8b6b, 0x01fa704b, 0x016583bd, 0x00966a2e, 0x016cbc18, 0x00a92abb, 0x00bb9c0f, 0x020585b0, 0x03e4af6d, 0x000c30d4}}}, + {X: Field{[10]uint32{0x00dc3032, 0x0219af5b, 0x014015d0, 0x0208a9b6, 0x03683ec7, 0x03eb4784, 0x02121129, 0x03836d18, 0x036a4dd3, 0x00063b59}}, Y: Field{[10]uint32{0x00a51bd5, 0x009ac580, 0x019bb8ef, 0x039dfb8c, 0x0006f9a6, 0x01780d9c, 0x03b97626, 0x02a0a97d, 0x02e15dbf, 0x00321ac1}}}, + {X: Field{[10]uint32{0x035ce2a1, 0x015032b6, 0x0118ceb3, 0x034ee547, 0x01d1e859, 0x03bf52e3, 0x00bce4da, 0x003ff30b, 0x0238e944, 0x0000c4e3}}, Y: Field{[10]uint32{0x0095c241, 0x038a325a, 0x029a3430, 0x010253be, 0x03fef4bc, 0x02431b9b, 0x0260a134, 0x02199f75, 0x01b2a11a, 0x0037e2ac}}}, + {X: Field{[10]uint32{0x00b00c95, 0x015c73fa, 0x03c3a091, 0x0023d240, 0x02163ce6, 0x0126a5d8, 0x02b1e761, 0x0326aae2, 0x00ac2025, 0x001d5f7d}}, Y: Field{[10]uint32{0x03a03430, 0x0353b337, 0x018c4a37, 0x032d343f, 0x01c56bd7, 0x014001d9, 0x0115ab76, 0x0317611f, 0x01feab36, 0x003fc2bd}}}, + {X: Field{[10]uint32{0x004c27e1, 0x01c10262, 0x015cc9aa, 0x03a1142e, 0x020ce09d, 0x0078ecbc, 0x03319a08, 0x01626f44, 0x02527156, 0x00229a5e}}, Y: Field{[10]uint32{0x0151f39d, 0x0027e1ab, 0x03ca13df, 0x039aefc0, 0x015a5edd, 0x00ccb576, 0x032815ad, 0x027a78df, 0x013cb602, 0x00027bae}}}, + {X: Field{[10]uint32{0x018c721b, 0x035838f9, 0x000b1650, 0x026f53d3, 0x01d35eb8, 0x00dea135, 0x03c2198e, 0x0382c5b3, 0x018736f9, 0x002c2eda}}, Y: Field{[10]uint32{0x016e00dc, 0x018d8efb, 0x001ebb3b, 0x0054bd23, 0x010b8556, 0x02ce3a0b, 0x009808f0, 0x02d405bc, 0x0200ce25, 0x000cf56c}}}, + {X: Field{[10]uint32{0x0037efed, 0x006d5172, 0x022d8d9f, 0x017a41ab, 0x03ef6d6f, 0x034be3fd, 0x037882a0, 0x0118d098, 0x01de5dde, 0x0007283b}}, Y: Field{[10]uint32{0x002863bc, 0x027af6aa, 0x02e41acb, 0x013eb163, 0x024c4d3a, 0x017ae7cf, 0x015d4c0f, 0x01a0f69f, 0x01ae4cff, 0x00067bed}}}, + {X: Field{[10]uint32{0x01474aa7, 0x03f10893, 0x0121ed90, 0x006b793a, 0x01d59ad1, 0x00786dd9, 0x02849310, 0x0395f59a, 0x030eb9a4, 0x001e0396}}, Y: Field{[10]uint32{0x033ab811, 0x024c8304, 0x016a3d33, 0x03fd0614, 0x001d8f34, 0x01e6a8e9, 0x02579f4c, 0x017c84b6, 0x00cc58cc, 0x0017af67}}}, + {X: Field{[10]uint32{0x00eb4c9d, 0x01a1b68d, 0x01468edf, 0x026952fc, 0x0330ec07, 0x037c8429, 0x02af620c, 0x021414b4, 0x00e93980, 0x003dfa4b}}, Y: Field{[10]uint32{0x00f93666, 0x03deae5e, 0x035857b1, 0x0259ea22, 0x0257c234, 0x00bc52b6, 0x03d54c03, 0x02a58563, 0x01cfe113, 0x000b1567}}}, + {X: Field{[10]uint32{0x0289f938, 0x01f69712, 0x036f54bc, 0x02909a4c, 0x013a5688, 0x00360358, 0x01ff8092, 0x00829e3e, 0x022075bb, 0x000f0ebe}}, Y: Field{[10]uint32{0x03888c8d, 0x03cfe71e, 0x0132b978, 0x0364fc74, 0x023bd836, 0x0190d7c8, 0x023a9f54, 0x00d75b95, 0x03081dd2, 0x001fbce0}}}, + {X: Field{[10]uint32{0x022097ee, 0x03ec557c, 0x01115af4, 0x03700c06, 0x0389fb9e, 0x01f95848, 0x01ec59e0, 0x03e6d5d7, 0x001dee60, 0x001c75bc}}, Y: Field{[10]uint32{0x0080bfee, 0x0011c387, 0x016802ef, 0x03483abc, 0x0138da4f, 0x02d050c8, 0x0054091f, 0x028d714a, 0x02454a31, 0x00387330}}}, + {X: Field{[10]uint32{0x00c4fa2d, 0x03dd6e4e, 0x036ea1f5, 0x00c7162a, 0x02b107fc, 0x039895f7, 0x00a77b28, 0x03b20242, 0x020f5705, 0x0025c999}}, Y: Field{[10]uint32{0x008cd4c1, 0x021a526d, 0x000c690c, 0x039c23a9, 0x01d3636f, 0x01b6c319, 0x018c213b, 0x0347a584, 0x03ae3102, 0x00253301}}}, + {X: Field{[10]uint32{0x02802719, 0x000ab0ac, 0x004b87fd, 0x004bb07f, 0x02297fad, 0x01fa2d8c, 0x011a1a29, 0x0286bc1a, 0x00c754b2, 0x002b3974}}, Y: Field{[10]uint32{0x039f85eb, 0x03252162, 0x008581f4, 0x032b4934, 0x027fc843, 0x03c6235a, 0x02491f05, 0x01c973ae, 0x03248d3e, 0x002493e7}}}, + {X: Field{[10]uint32{0x01943f64, 0x0159ace1, 0x018b88fa, 0x03f588ba, 0x028200ea, 0x00e2928a, 0x01778f28, 0x003fc333, 0x006b3480, 0x003e944c}}, Y: Field{[10]uint32{0x0296e293, 0x01721c50, 0x015c85f0, 0x015eb4d3, 0x0104b677, 0x0324ad43, 0x00ee030f, 0x0121ce87, 0x02166b14, 0x002d83b9}}}, + {X: Field{[10]uint32{0x01bea60a, 0x0275610b, 0x030f17c1, 0x0165845c, 0x000b716a, 0x0163abf3, 0x00097ee4, 0x009699e7, 0x0018329d, 0x002177e4}}, Y: Field{[10]uint32{0x017ab0fa, 0x03a24462, 0x0180ae62, 0x031bcbda, 0x00b7bc64, 0x039e1ddd, 0x01ad7c09, 0x008473a6, 0x01b6046d, 0x00315575}}}, + {X: Field{[10]uint32{0x00af5e3a, 0x02627389, 0x037f3efb, 0x03d1e018, 0x01337ff5, 0x0398d2a6, 0x0061b52a, 0x01119ead, 0x000dc202, 0x000bddf0}}, Y: Field{[10]uint32{0x005e3e39, 0x0039fea4, 0x0325303f, 0x039ebbca, 0x020c5d28, 0x039fbee9, 0x00c52b0b, 0x03eaf61c, 0x0278ebcb, 0x0031fd29}}}, + {X: Field{[10]uint32{0x028bb34e, 0x03123088, 0x0200158f, 0x03d6c3bd, 0x011f238d, 0x02e00afd, 0x036a4997, 0x0143583f, 0x023a7200, 0x0014b628}}, Y: Field{[10]uint32{0x003d9136, 0x00c0b6e0, 0x000f2ccd, 0x004b245e, 0x02cebb18, 0x030c31e1, 0x02d29b51, 0x02386858, 0x01a7861b, 0x00262ba0}}}, + {X: Field{[10]uint32{0x0212b211, 0x003b6c5c, 0x022fd37b, 0x008901d1, 0x00701daf, 0x01d556d7, 0x03b83204, 0x0001248b, 0x0079eaca, 0x0029fcf9}}, Y: Field{[10]uint32{0x03bdaada, 0x019402e7, 0x03ae8e92, 0x01f311db, 0x013e3376, 0x006eb00e, 0x0268498d, 0x029f05ee, 0x010c8c4c, 0x00203d86}}}, + {X: Field{[10]uint32{0x02356103, 0x01181f28, 0x00880ea0, 0x0264023d, 0x0373db57, 0x0108e0ab, 0x03bf4d79, 0x034c9986, 0x0150e67b, 0x000c7bcc}}, Y: Field{[10]uint32{0x00a9a8ee, 0x020d2c6a, 0x00954631, 0x01ab8f4b, 0x01bc03c4, 0x012c5bb5, 0x0350bb51, 0x00a3464e, 0x01d6655d, 0x001f6e3d}}}, + {X: Field{[10]uint32{0x038b058d, 0x03b8914e, 0x031fceab, 0x034e1a04, 0x00599b0c, 0x00bb7a8c, 0x02d1ee35, 0x000a64e6, 0x0155469c, 0x003ba0bc}}, Y: Field{[10]uint32{0x0092b10c, 0x00bfcc14, 0x00400eed, 0x0263c0e5, 0x0032de93, 0x02b6e263, 0x01d9ed6c, 0x030b10ab, 0x014e2d77, 0x003f4303}}}, + {X: Field{[10]uint32{0x016b4586, 0x0347df95, 0x0073e206, 0x0242d15a, 0x01273549, 0x0281c55d, 0x01f7d458, 0x0375bc2a, 0x007abfce, 0x00037b1f}}, Y: Field{[10]uint32{0x007200c4, 0x0060041d, 0x0327673c, 0x031ee172, 0x002c7626, 0x01e7f8c8, 0x02f0912b, 0x025fd061, 0x02b4cad5, 0x002be106}}}, + {X: Field{[10]uint32{0x00d2369d, 0x02cd347d, 0x0362e526, 0x004bb921, 0x002bf34f, 0x01466f60, 0x011ba405, 0x01bfa5d6, 0x037048cd, 0x0030a38c}}, Y: Field{[10]uint32{0x00636e8b, 0x003ac5fc, 0x01a647d5, 0x0148e4c9, 0x03b8640f, 0x025dae84, 0x0086dba6, 0x019cc5fd, 0x03ddda45, 0x0003802a}}}, + {X: Field{[10]uint32{0x03222195, 0x011448f7, 0x01a93071, 0x00c473c1, 0x01370277, 0x003c8d4c, 0x0029e9db, 0x017d9403, 0x00a92c27, 0x0011c55f}}, Y: Field{[10]uint32{0x01cbef6e, 0x003833a2, 0x00dc4f43, 0x01cacd3e, 0x009fefeb, 0x0107321d, 0x007e9ed4, 0x03f496be, 0x03fac911, 0x001922c5}}}, + {X: Field{[10]uint32{0x00a73241, 0x01c6991b, 0x03868f54, 0x014e9eac, 0x039a0a92, 0x027fc651, 0x01b55037, 0x014f3b60, 0x0302745c, 0x00213445}}, Y: Field{[10]uint32{0x01f858c5, 0x0382f089, 0x016b62c0, 0x03076359, 0x01fc593e, 0x01139933, 0x03b13536, 0x0021e93b, 0x02a20c3c, 0x0013c5ad}}}, + {X: Field{[10]uint32{0x03d63fc9, 0x02f8b5e5, 0x02dccb7f, 0x00a23a46, 0x03c74e81, 0x02a20471, 0x02b2f28e, 0x0182e1ac, 0x00221960, 0x000eee8c}}, Y: Field{[10]uint32{0x0334e286, 0x00f4a8a9, 0x02f3a9d7, 0x0262db9f, 0x00879d3f, 0x03a93d53, 0x03c5aa12, 0x014dce9d, 0x014af094, 0x001fcd01}}}, + {X: Field{[10]uint32{0x00651c6b, 0x03a281a6, 0x038f4425, 0x001aaa14, 0x00b9f746, 0x00f5039c, 0x037485ab, 0x01850c90, 0x03f47a2c, 0x0002158d}}, Y: Field{[10]uint32{0x03396054, 0x0002b664, 0x00096c35, 0x00c68c34, 0x02f76e85, 0x020e940d, 0x03075760, 0x00ac799e, 0x01d56fb4, 0x002f1aa5}}}, + {X: Field{[10]uint32{0x01bbd123, 0x01bb4c53, 0x0167d8ea, 0x010a902a, 0x02e8021a, 0x034f150f, 0x02d1605d, 0x00066887, 0x02985e75, 0x00094c0b}}, Y: Field{[10]uint32{0x02797a83, 0x02936399, 0x010f3267, 0x00e447f7, 0x01c02206, 0x004dc4fe, 0x02f9b4ba, 0x01d64751, 0x03e02309, 0x00212732}}}, + {X: Field{[10]uint32{0x003bea40, 0x01fd793d, 0x01f8e411, 0x003edae1, 0x03485fde, 0x029c82b8, 0x00d73dab, 0x024f8f02, 0x00bf88e3, 0x0039668c}}, Y: Field{[10]uint32{0x0197dfd5, 0x02112618, 0x02fb4422, 0x01921e1c, 0x0383ebbb, 0x00f92fe0, 0x00fa6bd3, 0x032cdc68, 0x024fe222, 0x001bf5e0}}}, + {X: Field{[10]uint32{0x02247e4e, 0x03e060fd, 0x025bda83, 0x0074b04d, 0x02de0533, 0x024d778b, 0x01e9bc3b, 0x00698162, 0x01f69798, 0x0031640b}}, Y: Field{[10]uint32{0x0175fe3c, 0x016b1f4b, 0x02c91f86, 0x01bae4f6, 0x0121d073, 0x03fadf38, 0x035ecb58, 0x0147bc6a, 0x014f5af5, 0x00319fac}}}, + {X: Field{[10]uint32{0x015e66ad, 0x02ad3983, 0x00c1b277, 0x0270b9b1, 0x01b8b640, 0x0138f202, 0x039a9b47, 0x0049fb19, 0x02c7fe27, 0x0037e2f6}}, Y: Field{[10]uint32{0x017d43e1, 0x02c409dc, 0x02dc7645, 0x01bf0099, 0x00273825, 0x00bad1c2, 0x01802ed7, 0x00e25953, 0x03e49f0b, 0x000ffc9b}}}, + {X: Field{[10]uint32{0x0065a82c, 0x0233dd8b, 0x02cf3f1e, 0x00942459, 0x009eff91, 0x0204357c, 0x01c7c02b, 0x02e32b0e, 0x004e9c7c, 0x00075550}}, Y: Field{[10]uint32{0x02a7632f, 0x02ee6f6c, 0x00707c24, 0x03a82681, 0x03e5a760, 0x00bf1348, 0x0099f64a, 0x03228d71, 0x0023f6a1, 0x00305e1c}}}, + {X: Field{[10]uint32{0x01f43b44, 0x03b82203, 0x034ef804, 0x02599e86, 0x002d040e, 0x01617914, 0x0106073d, 0x03f7eda1, 0x00c9b035, 0x000d7ce4}}, Y: Field{[10]uint32{0x03f512a2, 0x01768e2f, 0x010383c5, 0x00ab690f, 0x004c3cad, 0x003ae5d5, 0x0036fec5, 0x0362ddf7, 0x018886aa, 0x001aa173}}}, + {X: Field{[10]uint32{0x01e059b0, 0x01d13131, 0x006d588f, 0x01bb50f4, 0x011d2278, 0x0091273f, 0x02d7005b, 0x023e9bc9, 0x000dee88, 0x003eec21}}, Y: Field{[10]uint32{0x01b8d3bf, 0x034ac973, 0x005a6508, 0x03d2f4f5, 0x02203b05, 0x03d946eb, 0x00ffa219, 0x01c3c8e9, 0x014fd89a, 0x00191814}}}, + {X: Field{[10]uint32{0x034d78d7, 0x02049c68, 0x00ac9ce4, 0x0384cd4f, 0x0161fa0a, 0x01a4c7a4, 0x0208ac46, 0x01d77111, 0x00f01c22, 0x0009015b}}, Y: Field{[10]uint32{0x03c7751f, 0x0286d8f2, 0x011bf7dd, 0x028361a9, 0x01965a3f, 0x00d2949d, 0x003088f4, 0x020746fc, 0x03c67e73, 0x0010faf4}}}, + {X: Field{[10]uint32{0x00f9cd78, 0x02465c9c, 0x01297e77, 0x01175f9c, 0x0354f9f7, 0x035cbdac, 0x007c938c, 0x01f1e238, 0x03dfe844, 0x000ec410}}, Y: Field{[10]uint32{0x0240d6fc, 0x03c4a697, 0x0050c34a, 0x0184385b, 0x03b67ba3, 0x00ac6171, 0x02c29d4b, 0x03544449, 0x00c4abf0, 0x000a380a}}}, + {X: Field{[10]uint32{0x01a040e6, 0x03b7481a, 0x03a81a5b, 0x023d715d, 0x008088b0, 0x018d6017, 0x0175b236, 0x00d8e203, 0x01d14179, 0x002bbe42}}, Y: Field{[10]uint32{0x0200dc51, 0x006edf21, 0x03382d8a, 0x03007125, 0x0293350c, 0x03d028fe, 0x00c2b43d, 0x01adb174, 0x006f0de2, 0x00032ed3}}}, + {X: Field{[10]uint32{0x02833f28, 0x027e74f2, 0x007ac02c, 0x02e043d0, 0x03913367, 0x03c8a6f1, 0x0359aef5, 0x00c72dbf, 0x00f73863, 0x00323525}}, Y: Field{[10]uint32{0x010de4d2, 0x02a9d2ec, 0x01a67e70, 0x009e358b, 0x00c7b850, 0x034fbc45, 0x01afdacb, 0x0217534e, 0x02f94b62, 0x0032cb1d}}}, + {X: Field{[10]uint32{0x00f75b28, 0x00e44e4d, 0x033f5f4f, 0x005dbf97, 0x03c1b52e, 0x00779ed7, 0x00744437, 0x0328c8f7, 0x03f7af14, 0x00096bf3}}, Y: Field{[10]uint32{0x0142b789, 0x01c5c89a, 0x03781752, 0x03ed2bd2, 0x025010cd, 0x03541699, 0x031f57f8, 0x01fa5db2, 0x00a47f9d, 0x003619e9}}}, + {X: Field{[10]uint32{0x0132e2c7, 0x03658c8f, 0x022f819a, 0x00b5dc23, 0x01d40768, 0x022f5cb9, 0x02c220dc, 0x024c361c, 0x0086f773, 0x000090db}}, Y: Field{[10]uint32{0x00ab67a5, 0x02737aa2, 0x01662bc8, 0x021cdfc0, 0x0320a958, 0x0138501f, 0x00de6902, 0x0198f311, 0x01ea92af, 0x001b8e5b}}}, + {X: Field{[10]uint32{0x007f349d, 0x03d34945, 0x0056b0d0, 0x02e1fcf3, 0x0257638b, 0x0064567b, 0x00bcb86e, 0x00cf1e44, 0x03d59e57, 0x001873ba}}, Y: Field{[10]uint32{0x02fadb9e, 0x012c573c, 0x02aef3e7, 0x023e18a0, 0x027d8521, 0x01068c3a, 0x023082e7, 0x03b423ed, 0x0145e9b0, 0x000aa141}}}, + {X: Field{[10]uint32{0x00b6c187, 0x03a05fad, 0x0116dd77, 0x039b840b, 0x030dcbfe, 0x0278a91b, 0x0391a737, 0x0001c50a, 0x03b5d45d, 0x0016844c}}, Y: Field{[10]uint32{0x00d492e1, 0x03c0c14a, 0x0381f0f6, 0x03a3ce63, 0x0134c1c2, 0x00ce92df, 0x01c05171, 0x036710f2, 0x02aeafd6, 0x000bff65}}}, + {X: Field{[10]uint32{0x0163c8ac, 0x00e343d1, 0x0129309c, 0x0244c537, 0x01fff0f1, 0x0372c4ee, 0x02b5abe8, 0x006d04a7, 0x00498b70, 0x002dd28e}}, Y: Field{[10]uint32{0x00b9014f, 0x02599e67, 0x01186ffa, 0x00a3e10c, 0x01689be5, 0x0299de15, 0x00d6f7c5, 0x0083f619, 0x0257e50a, 0x00276113}}}, + {X: Field{[10]uint32{0x0389d26c, 0x032c8117, 0x024b752f, 0x01b2992a, 0x008e9a80, 0x02a54ab5, 0x011c3375, 0x0082d0ff, 0x00d04afb, 0x0030d727}}, Y: Field{[10]uint32{0x01a9c65a, 0x021de49e, 0x015a4b7e, 0x030fc1a7, 0x0248c765, 0x0278656c, 0x0279d841, 0x03bf2f7b, 0x02aa4a83, 0x002c1071}}}, + {X: Field{[10]uint32{0x00b82b96, 0x022b4df4, 0x025e8fea, 0x037b96db, 0x0311703d, 0x01e45075, 0x00b2af44, 0x01a2cfc1, 0x02587538, 0x0026a16a}}, Y: Field{[10]uint32{0x03d75d27, 0x0366549e, 0x005f2551, 0x0104efd2, 0x024e0620, 0x00cfb189, 0x00b80752, 0x03c0ef49, 0x00abaa16, 0x0011971c}}}, + {X: Field{[10]uint32{0x0086fe14, 0x03ac15d7, 0x0061bd12, 0x028f3e93, 0x01b3e825, 0x02f48fd2, 0x0183c14c, 0x03cf944b, 0x03cce051, 0x000fb1c6}}, Y: Field{[10]uint32{0x01915bdc, 0x017c17ba, 0x00007db3, 0x00ea6a54, 0x0245caba, 0x000cfc6a, 0x0294c5ab, 0x0295a954, 0x021de2da, 0x003c6630}}}, + {X: Field{[10]uint32{0x0359ae63, 0x0123c02c, 0x01b45aea, 0x01e4dcdf, 0x036b09e5, 0x00d6fccf, 0x0010e235, 0x007b7824, 0x0222939e, 0x003b872f}}, Y: Field{[10]uint32{0x021b90a5, 0x01e005e4, 0x0228d471, 0x0367794c, 0x01acecb6, 0x036adaa4, 0x037d2971, 0x0137d89f, 0x0026d444, 0x002fd810}}}, + {X: Field{[10]uint32{0x0346073e, 0x03c32659, 0x01ee78dc, 0x00aef222, 0x035a8cd9, 0x03fd3409, 0x007677d1, 0x00e98bbd, 0x03e171de, 0x003af2fc}}, Y: Field{[10]uint32{0x02f6ebe8, 0x00fd5d27, 0x03f9805c, 0x02428e08, 0x0195c6d8, 0x00b6b7ae, 0x014a3f30, 0x01c89024, 0x03c7bc9c, 0x0021e358}}}, + {X: Field{[10]uint32{0x039db797, 0x006cbf6a, 0x01ae56e8, 0x00c30243, 0x01b60664, 0x01654836, 0x03c57d52, 0x03bc56e1, 0x02e4ce72, 0x00393a4b}}, Y: Field{[10]uint32{0x015f944c, 0x03da5959, 0x00217ebe, 0x0232707e, 0x026d2183, 0x0161dd14, 0x01f47dbf, 0x029d4d56, 0x00654a03, 0x000feab1}}}, + {X: Field{[10]uint32{0x02ac1cc1, 0x010b7437, 0x03d635bc, 0x0319f078, 0x03cf275f, 0x00bac7d9, 0x00ef7431, 0x00ac0ded, 0x03588e29, 0x003f0739}}, Y: Field{[10]uint32{0x025186d7, 0x01e58f79, 0x019b42fe, 0x024b08e2, 0x02495bc3, 0x032bf2de, 0x03c791e8, 0x0366bdfd, 0x01bf44f7, 0x0005dade}}}, + {X: Field{[10]uint32{0x0294fc56, 0x031c15ae, 0x0091f9e9, 0x00eae5e9, 0x0149482b, 0x03257be1, 0x02a86b21, 0x01a9b1a4, 0x03ff179e, 0x003c7d6f}}, Y: Field{[10]uint32{0x0239e143, 0x009613e2, 0x0209313a, 0x00484318, 0x00670415, 0x030aab9c, 0x00f06205, 0x00ef0fed, 0x03a8a2cd, 0x000e2495}}}, + {X: Field{[10]uint32{0x03793eb9, 0x0113f5aa, 0x03323ac7, 0x00b9d230, 0x012c7aaa, 0x005d6850, 0x02bfef8d, 0x038006e9, 0x001461c3, 0x0026039d}}, Y: Field{[10]uint32{0x0331826c, 0x029d8946, 0x00259c7f, 0x00e98db1, 0x0134cbb3, 0x010a1801, 0x00dde28d, 0x017a0ecf, 0x01ae29e0, 0x001b8df7}}}, + {X: Field{[10]uint32{0x01b1c179, 0x0095fb68, 0x0207f66a, 0x029a9bde, 0x01adb7fa, 0x039b0655, 0x01986dc7, 0x01495c1c, 0x03f7686a, 0x003d4673}}, Y: Field{[10]uint32{0x0255a807, 0x03ae3c82, 0x0297f09e, 0x03b470c7, 0x03174ed4, 0x024ee140, 0x001d008a, 0x017261e5, 0x02b08c76, 0x000fa00f}}}, + {X: Field{[10]uint32{0x028f8061, 0x0389d56e, 0x00eee144, 0x00e443b7, 0x009011d9, 0x02f31730, 0x029bafd0, 0x03faa46e, 0x01ea3851, 0x000b7636}}, Y: Field{[10]uint32{0x01a52ae3, 0x03f81347, 0x00dc1365, 0x02a73a5c, 0x007adfde, 0x03bd4986, 0x00d058b4, 0x011a24df, 0x01afd422, 0x001851fc}}}, + {X: Field{[10]uint32{0x0054a4ae, 0x03f5e005, 0x01b35ede, 0x02335f42, 0x032854f8, 0x02a803d8, 0x02c0c415, 0x00d4dd1e, 0x02620948, 0x00218310}}, Y: Field{[10]uint32{0x033392f4, 0x039b8bb5, 0x01cef95c, 0x028a014d, 0x01d15378, 0x03bbc361, 0x03dfc561, 0x01b49639, 0x022a7d82, 0x0028a9e8}}}, + {X: Field{[10]uint32{0x02d732a6, 0x01eb42eb, 0x00b28ae9, 0x0240b259, 0x01e0697f, 0x0014d482, 0x007d4ea2, 0x00b0f426, 0x00ec17d8, 0x0039dac8}}, Y: Field{[10]uint32{0x03f54bf0, 0x02092499, 0x038f4ad1, 0x00df665f, 0x0132bc11, 0x0311fdc0, 0x037cec9c, 0x0184eff6, 0x00b685f6, 0x00325e11}}}, + {X: Field{[10]uint32{0x0110ab88, 0x0157bf42, 0x007a6504, 0x03378f41, 0x03718ec9, 0x00a905ed, 0x02862b16, 0x0296098d, 0x010d12fb, 0x00099cc7}}, Y: Field{[10]uint32{0x03542192, 0x029c7f26, 0x017143b1, 0x00251ee9, 0x028d2986, 0x001cdb5b, 0x022023bb, 0x0129841b, 0x03b30b46, 0x000f043b}}}, + {X: Field{[10]uint32{0x0224dcde, 0x0177e768, 0x00ea8986, 0x003a2cb6, 0x003fc457, 0x0340536c, 0x03e46f5e, 0x02046a1f, 0x007852db, 0x001432d2}}, Y: Field{[10]uint32{0x0339621d, 0x012f60e2, 0x006f95d5, 0x0234c0f4, 0x00c69db4, 0x00403914, 0x03572a0c, 0x02ba2623, 0x00a87937, 0x002ee122}}}, + {X: Field{[10]uint32{0x03b02a60, 0x03bac87f, 0x03a0e7eb, 0x01372ca2, 0x03064b0c, 0x02cfeb97, 0x00f9fb92, 0x03ff6d9c, 0x013b1d67, 0x003eda51}}, Y: Field{[10]uint32{0x00fd2c39, 0x00c0fba9, 0x024ca41e, 0x02bd1dcd, 0x00d1ba17, 0x0210483e, 0x03b13879, 0x0206d8fa, 0x033692d8, 0x002c3f7b}}}, + {X: Field{[10]uint32{0x03b249b4, 0x01dc1b62, 0x03b9938c, 0x00695b6e, 0x0103f406, 0x028fde13, 0x03aec4fe, 0x00089867, 0x000b4b72, 0x002a3c4a}}, Y: Field{[10]uint32{0x0239b8cc, 0x01c0fd1b, 0x019d4484, 0x02e6f07f, 0x03a97e12, 0x02f9ef8c, 0x032e5014, 0x01644d15, 0x0171ac50, 0x003aeced}}}, + {X: Field{[10]uint32{0x02acaa98, 0x012409db, 0x02bb878b, 0x0306f066, 0x02420f83, 0x00265805, 0x03cb3be3, 0x015e43c5, 0x0209df30, 0x0010a4b3}}, Y: Field{[10]uint32{0x00745d36, 0x02a89207, 0x022f9aa2, 0x016d9d1b, 0x00f32c8d, 0x01186ddb, 0x00f18733, 0x0074760b, 0x014cbf2b, 0x0006c536}}}, + {X: Field{[10]uint32{0x00c9464f, 0x029561e9, 0x0305b8c5, 0x00b25e5a, 0x038e1a06, 0x02720fe3, 0x03967504, 0x01d1fc2d, 0x0177f16f, 0x002b0904}}, Y: Field{[10]uint32{0x0176cf58, 0x028ed764, 0x0341d1cb, 0x0173bd72, 0x03266b69, 0x00c195a1, 0x004eb037, 0x034113b2, 0x01038261, 0x0037415d}}}, + {X: Field{[10]uint32{0x011823d3, 0x0349515d, 0x00e7dd7f, 0x026e1ac6, 0x0278e75c, 0x033dfe11, 0x019d640a, 0x00b695ff, 0x027326bf, 0x001a4bb2}}, Y: Field{[10]uint32{0x01c8e97f, 0x01ff74dc, 0x033478f1, 0x01413fc0, 0x02014c38, 0x02275876, 0x01573202, 0x029e2861, 0x0062548e, 0x0005f5b5}}}, + {X: Field{[10]uint32{0x0310e216, 0x00f316db, 0x01889e82, 0x03534bd6, 0x01d0e129, 0x0300b9bd, 0x02cf946e, 0x01404793, 0x024455ef, 0x003406c6}}, Y: Field{[10]uint32{0x03f91a0f, 0x015ab995, 0x03988345, 0x038ce237, 0x01807879, 0x01927d7f, 0x00f38f21, 0x00fb7755, 0x009e55e3, 0x00212936}}}, + {X: Field{[10]uint32{0x03fc1e9b, 0x0242f1e6, 0x030f12f8, 0x0308e4cc, 0x03fb0798, 0x023ca833, 0x0273a671, 0x02236024, 0x01f296a7, 0x0007ae98}}, Y: Field{[10]uint32{0x01dc9661, 0x01f3574b, 0x03266bc4, 0x03027b84, 0x03505da2, 0x01b12dab, 0x030a6a6b, 0x004118b7, 0x00cbe847, 0x00227ca6}}}, + {X: Field{[10]uint32{0x015980ea, 0x02da35d0, 0x015489c9, 0x032ac69b, 0x010a2300, 0x0087b730, 0x009fe1f7, 0x00c48519, 0x00da9460, 0x0009b7fe}}, Y: Field{[10]uint32{0x00004e60, 0x03685724, 0x037139d3, 0x017e5fd6, 0x033c4a0a, 0x03ee5523, 0x0365862e, 0x02ef7f0e, 0x022155e1, 0x00360992}}}, + {X: Field{[10]uint32{0x023fe676, 0x00ef03cc, 0x01047cee, 0x03729b89, 0x01a3116a, 0x020fa7ac, 0x035f64f2, 0x00608849, 0x0351425e, 0x0013990a}}, Y: Field{[10]uint32{0x01eafbb2, 0x01a288e2, 0x0174247a, 0x0283b49f, 0x0165b9c5, 0x030d7537, 0x011db0ab, 0x011a3125, 0x01659125, 0x003ca2df}}}, + {X: Field{[10]uint32{0x00f448a2, 0x034b869e, 0x02b21e94, 0x0033a709, 0x03b4f370, 0x033a91da, 0x027c97b4, 0x009f6cdf, 0x035cee9a, 0x000d52bf}}, Y: Field{[10]uint32{0x0130fcdb, 0x0027218a, 0x00dd5977, 0x0345b29e, 0x0299b4c4, 0x03da9e53, 0x012d0082, 0x01e7958e, 0x03d1624b, 0x00235a41}}}, + {X: Field{[10]uint32{0x03fbdc3d, 0x002e55a3, 0x039dcd57, 0x03b97d26, 0x01e76995, 0x002d97dd, 0x029f020c, 0x01a7fa3d, 0x00749493, 0x0014a1b4}}, Y: Field{[10]uint32{0x039703ab, 0x020779a1, 0x005e2027, 0x00fac5ac, 0x00e0a23d, 0x01f9bb80, 0x0062a452, 0x03103079, 0x02e53dd2, 0x000957bc}}}, + {X: Field{[10]uint32{0x0268add7, 0x0357d80c, 0x0121c266, 0x02e1bf78, 0x026bddee, 0x02a24d64, 0x00c8ff91, 0x008a666b, 0x0346c86e, 0x002e12a0}}, Y: Field{[10]uint32{0x0320789f, 0x02d00efb, 0x020a3f65, 0x034f62fa, 0x0329f5c8, 0x00791965, 0x0380c878, 0x0008e386, 0x028c79f4, 0x000c45e6}}}, + {X: Field{[10]uint32{0x0112bb94, 0x039e1cb7, 0x0067e0fd, 0x009e408b, 0x031b9dfc, 0x013f1470, 0x018b9f11, 0x02694089, 0x01e663fc, 0x00079ef5}}, Y: Field{[10]uint32{0x002c1b84, 0x01847c83, 0x00b6b927, 0x03f9b647, 0x0107acce, 0x01dfba2d, 0x0250f11e, 0x02c519f4, 0x01b40555, 0x0018a1ea}}}, + {X: Field{[10]uint32{0x03d2bc81, 0x01acab4d, 0x038da9c9, 0x0311535a, 0x029d28ac, 0x0399cb29, 0x01cfde6b, 0x027af9e9, 0x02213728, 0x001fb9a2}}, Y: Field{[10]uint32{0x0170c83e, 0x00f6e131, 0x01dcc8a5, 0x02fadeb3, 0x0303d7dc, 0x02c93808, 0x028aeee9, 0x030f2bca, 0x006400a6, 0x000fb0d0}}}, + {X: Field{[10]uint32{0x00ce570e, 0x0364533e, 0x0033f8d4, 0x01d59f0f, 0x02f3adef, 0x029ae9eb, 0x0107fddd, 0x00efeaa7, 0x010cf4be, 0x000a752c}}, Y: Field{[10]uint32{0x0058bf4c, 0x00e4b384, 0x031f2422, 0x00236fbd, 0x022ec79e, 0x031c1c36, 0x0103c252, 0x03d02903, 0x038596a4, 0x002da9d0}}}, + {X: Field{[10]uint32{0x028c359e, 0x0145b5cc, 0x039c9895, 0x00436989, 0x0350218f, 0x00b0fc14, 0x012a43b4, 0x03591f8c, 0x01d95c5c, 0x001e41f1}}, Y: Field{[10]uint32{0x00d6a625, 0x007261d9, 0x005d4c8f, 0x01e163e6, 0x00268883, 0x037bab06, 0x02bca52f, 0x00a86fca, 0x01e1ec06, 0x001b196a}}}, + {X: Field{[10]uint32{0x019d31b1, 0x0252e365, 0x030adfc9, 0x015714d0, 0x02e5bc2c, 0x031a3f3e, 0x0014fe7b, 0x02ef0cd8, 0x02aece11, 0x003310db}}, Y: Field{[10]uint32{0x029706a2, 0x032492fe, 0x02db3a50, 0x00e59b5f, 0x016b2bd5, 0x01814a61, 0x004e6089, 0x02fd9359, 0x01e7d6ff, 0x00058583}}}, + {X: Field{[10]uint32{0x010ec1f0, 0x006d8805, 0x01bea735, 0x002c052b, 0x021b5fb3, 0x008e77e8, 0x0259d556, 0x010806b9, 0x015d278d, 0x0033c08f}}, Y: Field{[10]uint32{0x00990741, 0x00553935, 0x005749e5, 0x02dc15f5, 0x0034c473, 0x015d736d, 0x031c26e7, 0x0301e9b9, 0x0395ffce, 0x0035801c}}}, + {X: Field{[10]uint32{0x03746a21, 0x00104979, 0x0238d71b, 0x015fa01e, 0x0112b6a2, 0x03151ed8, 0x0135b732, 0x03166f53, 0x0093f718, 0x000068a8}}, Y: Field{[10]uint32{0x00fd4c95, 0x024d51e6, 0x03919f8b, 0x02c1760f, 0x0216c0f8, 0x02491e5b, 0x02cadcc3, 0x028e6868, 0x0142652f, 0x00099d2d}}}, + {X: Field{[10]uint32{0x02b799d7, 0x02496dfb, 0x00215fac, 0x031c1aa1, 0x02f712e4, 0x00893feb, 0x018fdff0, 0x02b145d4, 0x002004b8, 0x0014d3b5}}, Y: Field{[10]uint32{0x03d82155, 0x00204636, 0x01439c07, 0x00bf4933, 0x00fa3078, 0x01db7eba, 0x03e497f5, 0x00667ee7, 0x00523ea6, 0x0000d796}}}, + {X: Field{[10]uint32{0x0200d08e, 0x03613052, 0x0138cf11, 0x01ace898, 0x03e9ba64, 0x03d2c115, 0x038ff188, 0x00c2b9b1, 0x00ad9e6f, 0x00234c79}}, Y: Field{[10]uint32{0x01d5feb2, 0x00e6f353, 0x02996478, 0x03352cc3, 0x03e4b0b1, 0x0112caa1, 0x01e36a48, 0x025b04e8, 0x03c19093, 0x003c36fb}}}, + {X: Field{[10]uint32{0x012b3412, 0x0057f48b, 0x0315954c, 0x027e1adc, 0x03c41843, 0x01bfdfdc, 0x02643791, 0x01016afd, 0x00520267, 0x00205d21}}, Y: Field{[10]uint32{0x00f19bbc, 0x03cfd768, 0x02ba7cb3, 0x03f4a02f, 0x029f6f95, 0x02587d6b, 0x00093899, 0x02d42c05, 0x009b0435, 0x0004f448}}}, + {X: Field{[10]uint32{0x0258aaa3, 0x008e11c1, 0x0212a6cc, 0x01c15fbf, 0x02458422, 0x037ce032, 0x024552be, 0x03a21401, 0x0372e604, 0x002f2a1f}}, Y: Field{[10]uint32{0x039e3d0e, 0x03a0aeb7, 0x0184b54e, 0x02355d4b, 0x03af2653, 0x01dae88f, 0x00123c62, 0x01c495cb, 0x02f528b7, 0x003b9422}}}, + {X: Field{[10]uint32{0x03cd3fb2, 0x016460df, 0x03c52e8c, 0x01184903, 0x01d527e5, 0x01b9e32e, 0x000365cd, 0x014bdb03, 0x02a9a196, 0x000378ae}}, Y: Field{[10]uint32{0x02d38905, 0x01deb287, 0x039bd733, 0x01042a73, 0x01865739, 0x01c59cb7, 0x035f2be5, 0x00cbf532, 0x00ef466c, 0x002bad06}}}, + {X: Field{[10]uint32{0x02acca9e, 0x0010e408, 0x01e5ac00, 0x02af1d99, 0x02556f6c, 0x001dc4d7, 0x00a0591c, 0x01e466d5, 0x01e914df, 0x001ee338}}, Y: Field{[10]uint32{0x00b40628, 0x02b96630, 0x007c2fb8, 0x02a7cff7, 0x00d06a96, 0x010ce295, 0x0100b720, 0x02b52430, 0x03f39cd8, 0x0029828f}}}, + {X: Field{[10]uint32{0x00a50e75, 0x0089e6fb, 0x03d1b040, 0x03f69ab0, 0x034d6d44, 0x00175d85, 0x03c80f82, 0x01d10c66, 0x017913fe, 0x00335c70}}, Y: Field{[10]uint32{0x01419064, 0x02fce31c, 0x01211967, 0x00494a2b, 0x01ae3858, 0x03d8ce4a, 0x001d1a93, 0x00e3407c, 0x03bfcf34, 0x0027c79c}}}, + {X: Field{[10]uint32{0x03ca8fe4, 0x0079151c, 0x02444f4f, 0x003845f6, 0x010619b7, 0x00205abc, 0x0236161d, 0x02370d2e, 0x002e32dc, 0x0010b2b4}}, Y: Field{[10]uint32{0x02e75568, 0x00a2a30d, 0x013c6651, 0x01fb7496, 0x0279e59d, 0x038440c6, 0x030823df, 0x0273fe21, 0x01345a25, 0x0025f2c8}}}, + {X: Field{[10]uint32{0x018ff8c7, 0x00f00f2e, 0x021f6d47, 0x015b22e7, 0x03483317, 0x00a877ea, 0x006644a6, 0x014b18a6, 0x01304f06, 0x00262a24}}, Y: Field{[10]uint32{0x01a824e8, 0x0190003a, 0x00733988, 0x02b5ecaa, 0x00b277e0, 0x00d2b521, 0x0249b3e5, 0x01a40e72, 0x02cecc50, 0x00304c3c}}}, + {X: Field{[10]uint32{0x038a4328, 0x00274bb7, 0x0345522c, 0x00a1af5e, 0x00d7a4a1, 0x021100ec, 0x03d39ff2, 0x018aa9ef, 0x00760847, 0x0008f117}}, Y: Field{[10]uint32{0x03303cde, 0x01e5522e, 0x0350af0d, 0x01d3fc30, 0x02d57cb2, 0x02c350f7, 0x0146dc7c, 0x01bd1f0f, 0x031795c4, 0x003d2adc}}}, + {X: Field{[10]uint32{0x0221d856, 0x0313431a, 0x02d343a6, 0x020c4236, 0x019e6a7b, 0x02f4df0d, 0x01416f2d, 0x0313cbd9, 0x0037d584, 0x0022dc00}}, Y: Field{[10]uint32{0x0365ca35, 0x03f1dab0, 0x00c2becd, 0x03d830c9, 0x025a172c, 0x0245a7e6, 0x00e7d866, 0x0019b53a, 0x00039ed0, 0x0020dc7b}}}, + {X: Field{[10]uint32{0x030f8a7b, 0x025f66a8, 0x00596cdb, 0x03a142ba, 0x00004f4a, 0x020fa060, 0x01d78f20, 0x01044728, 0x00a8d0fb, 0x00369859}}, Y: Field{[10]uint32{0x029a342d, 0x02e9208a, 0x0307fc7a, 0x02871e20, 0x011cc0b5, 0x00304440, 0x03caf4e1, 0x013c5e9d, 0x0063717e, 0x0003e6a1}}}, + {X: Field{[10]uint32{0x035fd6b7, 0x00b51f7a, 0x010fa220, 0x038a7980, 0x02c45924, 0x01b6df5f, 0x029b9c20, 0x02953464, 0x0165a9d1, 0x00127cdf}}, Y: Field{[10]uint32{0x006aa51e, 0x01df79da, 0x03a94ca6, 0x0256c6fb, 0x0201e648, 0x00d03050, 0x010dbba9, 0x0098a5ef, 0x038528f6, 0x003e6e6d}}}, + {X: Field{[10]uint32{0x036efa10, 0x03a714f8, 0x037ccb38, 0x00dcc219, 0x0312d808, 0x0286262a, 0x0256b78b, 0x01668006, 0x0088e268, 0x0021d57c}}, Y: Field{[10]uint32{0x02f7e478, 0x037dd7db, 0x029a9de5, 0x02a7cbda, 0x02434906, 0x0157e0fd, 0x01b4768f, 0x01ea2085, 0x013d1eec, 0x001759c0}}}, + {X: Field{[10]uint32{0x0209045c, 0x03fdddf1, 0x00534069, 0x00d2849f, 0x01a4e6d1, 0x028d7820, 0x03550fc5, 0x029b761c, 0x0396b7ab, 0x000d4c85}}, Y: Field{[10]uint32{0x00a1e832, 0x004059fc, 0x028ba6fe, 0x0072d277, 0x03c5c830, 0x03c7844c, 0x017a6804, 0x00fd3bc6, 0x0343efa9, 0x0011ffc3}}}, + {X: Field{[10]uint32{0x012559b3, 0x03a6b398, 0x0342156f, 0x03b37cac, 0x0283479f, 0x00a08ed0, 0x03ab5ea0, 0x034aef9d, 0x012b644b, 0x000eafb7}}, Y: Field{[10]uint32{0x01e32b06, 0x0216c879, 0x0008f179, 0x03e8cc39, 0x0287bbcc, 0x0078cda6, 0x01824ba1, 0x02e0604c, 0x008e6c13, 0x00109a6c}}}, + {X: Field{[10]uint32{0x00956de8, 0x0263ff1f, 0x03f775be, 0x033249e1, 0x03c14b62, 0x038c9df5, 0x003dc530, 0x0118aaa0, 0x02a22c23, 0x0038c044}}, Y: Field{[10]uint32{0x0098da40, 0x02b4da52, 0x0368a8d2, 0x01b761a4, 0x0199d90f, 0x024f9d60, 0x01f4e0ff, 0x003a2dea, 0x03d0dbb1, 0x003431f8}}}, + {X: Field{[10]uint32{0x033cd06b, 0x01cfd6e5, 0x03762f10, 0x01efc274, 0x03bcdf49, 0x02496440, 0x0147f6cb, 0x012d3cc3, 0x0058439c, 0x00018942}}, Y: Field{[10]uint32{0x0075328e, 0x01adc854, 0x0102ecd2, 0x00c0bf32, 0x0387e4c9, 0x02c390e0, 0x004407af, 0x01096156, 0x01e484ce, 0x000d0dfd}}}, + {X: Field{[10]uint32{0x00f826ea, 0x00e6b5a2, 0x0209bdcb, 0x0143ec5b, 0x0366838d, 0x003a4f8f, 0x0104bc39, 0x0133e93a, 0x0085b8c9, 0x001deb51}}, Y: Field{[10]uint32{0x006001d4, 0x02e6efe0, 0x02b736b0, 0x02d5216e, 0x0334c2ec, 0x0143b0f0, 0x03c84447, 0x021e784d, 0x005a9798, 0x00136f14}}}, + {X: Field{[10]uint32{0x02c0b7db, 0x01e4664e, 0x0066cad5, 0x033eb104, 0x003852b8, 0x02a399f9, 0x01ce3377, 0x018076e7, 0x0292e413, 0x0017734f}}, Y: Field{[10]uint32{0x00e997c9, 0x01d532e9, 0x03f85417, 0x034358d9, 0x0336996e, 0x0309e3df, 0x02760ede, 0x02d0e8c1, 0x008135ef, 0x002b3334}}}, + {X: Field{[10]uint32{0x02ff788d, 0x0309fd72, 0x01737fc8, 0x021457d6, 0x01e65ca3, 0x02e4c614, 0x01d2e6b9, 0x00147f10, 0x023badce, 0x000e8999}}, Y: Field{[10]uint32{0x00abc2bb, 0x017e26e4, 0x00113bab, 0x02e0222a, 0x009b9db0, 0x01c9cb2d, 0x030110e0, 0x03611801, 0x02abaf01, 0x000b591f}}}, + {X: Field{[10]uint32{0x00b1aec0, 0x02c025b9, 0x03ac4b8b, 0x00081419, 0x034e3b0f, 0x000900c7, 0x02fe9c2c, 0x0263f1c4, 0x02b951dc, 0x003d5f33}}, Y: Field{[10]uint32{0x03a1ea25, 0x037cc06d, 0x03bca9c4, 0x01b50e29, 0x03ddb2c6, 0x020be67e, 0x03514557, 0x03afb429, 0x03eb7a8a, 0x001a5824}}}, + {X: Field{[10]uint32{0x029b4a0c, 0x022501af, 0x029b0935, 0x00e8b6ee, 0x02df47c8, 0x0123334d, 0x01bd46c9, 0x01b8502f, 0x0378bca0, 0x002a2691}}, Y: Field{[10]uint32{0x02f366cf, 0x03e7a85b, 0x030d1d23, 0x03b7567c, 0x02939d69, 0x039e079b, 0x0398e2e4, 0x0098b48a, 0x01d69d08, 0x003d0893}}}, + {X: Field{[10]uint32{0x00b962a9, 0x00196e04, 0x01d72adf, 0x00bee8a5, 0x036a3be9, 0x03fc129b, 0x0063f4c7, 0x02091cad, 0x038184fe, 0x00191ce0}}, Y: Field{[10]uint32{0x02ce32de, 0x00dc2680, 0x010bbc97, 0x03e8c900, 0x009ba164, 0x01600134, 0x029d58dd, 0x01ba4d3f, 0x00c0d09f, 0x002f3440}}}, + {X: Field{[10]uint32{0x02dc7774, 0x033fea8e, 0x026866c7, 0x0132bf57, 0x02f7bcaa, 0x027e1c9e, 0x00196bad, 0x0078a0b8, 0x02382126, 0x00129a0e}}, Y: Field{[10]uint32{0x014ff3b0, 0x024cde25, 0x00f202cc, 0x01c6c6e5, 0x01913af3, 0x017d03fb, 0x0337f0b1, 0x026a90e6, 0x00d0ec3d, 0x002d6ae9}}}, + {X: Field{[10]uint32{0x035cb3c7, 0x030b96ae, 0x0296f53c, 0x011b9080, 0x0053fee0, 0x023b8585, 0x02cfd9eb, 0x0333510d, 0x016efdae, 0x00040978}}, Y: Field{[10]uint32{0x00c48f3b, 0x0051003c, 0x011c2253, 0x0360ef58, 0x030704e4, 0x023ce3dc, 0x019b8075, 0x024a8f85, 0x016b67ce, 0x003e01ae}}}, + {X: Field{[10]uint32{0x036650d2, 0x038ab1b6, 0x000e4552, 0x02cd6821, 0x0360039c, 0x03d9ddf1, 0x022217b7, 0x014d4dbf, 0x0009675a, 0x00185276}}, Y: Field{[10]uint32{0x01a96ca9, 0x0151416c, 0x03a11681, 0x03ca78e5, 0x02c72f07, 0x0344bde1, 0x009b03fb, 0x0022a93d, 0x036c9a98, 0x00392b98}}}, + {X: Field{[10]uint32{0x03fec47f, 0x00507530, 0x03047d8c, 0x036d3581, 0x032fff3e, 0x02ec0f74, 0x02e83274, 0x020d0953, 0x01124388, 0x0002e890}}, Y: Field{[10]uint32{0x02d5c35e, 0x0190376e, 0x0366d0aa, 0x025e7430, 0x013717e9, 0x034a3228, 0x026a18de, 0x03f374e3, 0x012329c3, 0x00229afc}}}, + {X: Field{[10]uint32{0x0056a961, 0x001a239e, 0x00993219, 0x014252b5, 0x0035c005, 0x00e2bd54, 0x03aa2595, 0x02b1fa76, 0x00963c7c, 0x0030837c}}, Y: Field{[10]uint32{0x0245d40a, 0x0120d7ec, 0x0033bad8, 0x010aba9f, 0x00fb4f2c, 0x0296242e, 0x038dd8d6, 0x01eba616, 0x015d16cf, 0x001247a6}}}, + {X: Field{[10]uint32{0x03af0c50, 0x01912753, 0x032a50c7, 0x022c6d32, 0x01aac9f3, 0x00f74bb0, 0x02f3dcb9, 0x0135cb67, 0x00ca4dbb, 0x001bd4f6}}, Y: Field{[10]uint32{0x027ae24a, 0x0221a1d3, 0x02e12f78, 0x030c9f2b, 0x0077bbec, 0x0219d4f0, 0x0156de24, 0x02fadc90, 0x002df449, 0x0019e128}}}, + {X: Field{[10]uint32{0x037bdda3, 0x005dc49c, 0x006b3513, 0x003e3b2a, 0x036364ae, 0x0211d5fa, 0x008a0461, 0x023d8147, 0x00bd71a0, 0x00395f9e}}, Y: Field{[10]uint32{0x00385342, 0x025db43d, 0x00e8f116, 0x018ca3b0, 0x0231a1d2, 0x029dd553, 0x0116c82d, 0x017d995c, 0x007e8a53, 0x0028188f}}}, + {X: Field{[10]uint32{0x03ab099a, 0x03a5f13d, 0x03fff285, 0x03869b97, 0x037853e8, 0x01f2d4e9, 0x00abd0ea, 0x025aae78, 0x0329aad4, 0x003d4bdb}}, Y: Field{[10]uint32{0x019d55a3, 0x02588115, 0x028e0b71, 0x00706629, 0x01c36151, 0x01bca657, 0x01de4b76, 0x017a062d, 0x01fc6d5c, 0x000f7df0}}}, + {X: Field{[10]uint32{0x02fb0dc3, 0x020da9cf, 0x01fe259f, 0x02362f59, 0x02ec5cf0, 0x00cf6721, 0x0326268b, 0x01b425be, 0x01fb5c0a, 0x00369d3d}}, Y: Field{[10]uint32{0x00a62c47, 0x0281ea52, 0x03f3effe, 0x00c4d508, 0x018d0ea0, 0x00a947b7, 0x031c8164, 0x00a11df8, 0x0189de5e, 0x001f943a}}}, + {X: Field{[10]uint32{0x0051f4ff, 0x00de9938, 0x02ed8a23, 0x00533f4f, 0x0035d144, 0x02a74b7a, 0x0341d359, 0x01485c3c, 0x02a87bd4, 0x000a8b26}}, Y: Field{[10]uint32{0x0248a1ce, 0x01b1bbe5, 0x00bf8a46, 0x00856746, 0x01496882, 0x022bb27e, 0x01fd7e5d, 0x017da280, 0x01eb9933, 0x002fe7bf}}}, + {X: Field{[10]uint32{0x02022266, 0x02b58ca4, 0x0123b492, 0x03bc7aff, 0x037d13bc, 0x001f8b3c, 0x010da7db, 0x014c531b, 0x00b191dc, 0x000a8d10}}, Y: Field{[10]uint32{0x02ae2b40, 0x0398b4f8, 0x02fc6dd1, 0x03c8b0d3, 0x03e4c1e9, 0x021c1e51, 0x02fda24e, 0x028080bc, 0x00f5c993, 0x002f7b09}}}, + {X: Field{[10]uint32{0x010942a2, 0x01004278, 0x0081c287, 0x03ab54f4, 0x000e0acc, 0x01551140, 0x0136e8bd, 0x00dab7eb, 0x01743d1d, 0x0028ea6f}}, Y: Field{[10]uint32{0x00794ca0, 0x02ccd3fb, 0x0016b66d, 0x0013fdd7, 0x022cb711, 0x0286d305, 0x01ab1fce, 0x039f637b, 0x02cff8ca, 0x00330cf7}}}, + {X: Field{[10]uint32{0x00804950, 0x0254f462, 0x0170d308, 0x02b0ac23, 0x0380db7e, 0x01fd361f, 0x03dc7247, 0x03c84824, 0x008f70a2, 0x0016e0f5}}, Y: Field{[10]uint32{0x0248b545, 0x0352c510, 0x039c3030, 0x02d1fb54, 0x01982ecd, 0x0243f313, 0x01368d76, 0x019b0b84, 0x0088a10c, 0x003de301}}}, + {X: Field{[10]uint32{0x03e9736a, 0x0035dec2, 0x02c29414, 0x0258f1bf, 0x02d901ab, 0x021c76e3, 0x039e210a, 0x01288800, 0x02a56e3e, 0x003756d1}}, Y: Field{[10]uint32{0x0021d46b, 0x011f04f5, 0x008ceae6, 0x03be1e61, 0x009e7136, 0x0334d77e, 0x0052268c, 0x0116b0d7, 0x02baebdd, 0x00366ddb}}}, + {X: Field{[10]uint32{0x0361a6d3, 0x031b72cf, 0x00f6462c, 0x007c0de6, 0x03d1ff78, 0x00885025, 0x036bc5b2, 0x01849d88, 0x035a2548, 0x000bdd36}}, Y: Field{[10]uint32{0x03149c1c, 0x020f0254, 0x0248eca9, 0x011eb224, 0x03646471, 0x00c0536c, 0x01b868ea, 0x01b4bea4, 0x01ed256f, 0x002db58d}}}, + {X: Field{[10]uint32{0x03ab2e09, 0x016377c8, 0x030bec50, 0x009b7f92, 0x02119bff, 0x0378722e, 0x0240b8bf, 0x024e6961, 0x00c41f7c, 0x000cab70}}, Y: Field{[10]uint32{0x0146ae3f, 0x02ec374e, 0x0229366b, 0x020ce8d6, 0x0340beed, 0x02807645, 0x017772d2, 0x02ca5f5f, 0x02487f0b, 0x0033cc5c}}}, + {X: Field{[10]uint32{0x03c6cdce, 0x027cc061, 0x02ae936f, 0x02d6172c, 0x014e336c, 0x01d301fb, 0x02a152ed, 0x00b6a09c, 0x00a70017, 0x0013f94f}}, Y: Field{[10]uint32{0x01e3a8ce, 0x011ba620, 0x0084327e, 0x01c162e1, 0x02baf428, 0x00595e31, 0x00c29869, 0x00705887, 0x01c4bd71, 0x00207db4}}}, + {X: Field{[10]uint32{0x03b2569f, 0x02152367, 0x018ae63f, 0x001974f9, 0x023b08dc, 0x0137fb66, 0x02f316eb, 0x028a99c0, 0x00f5577f, 0x0018064d}}, Y: Field{[10]uint32{0x00f714cc, 0x001d340c, 0x03954362, 0x0243dab3, 0x0255e196, 0x00ec7c77, 0x0396f689, 0x03f5fed7, 0x00824360, 0x001b7df6}}}, + {X: Field{[10]uint32{0x0279d321, 0x00f03dea, 0x03129817, 0x0319e7e8, 0x03e1bec3, 0x03a7768b, 0x0092ee52, 0x0201b191, 0x03088ff4, 0x0001e769}}, Y: Field{[10]uint32{0x017f9a47, 0x02afa2c0, 0x0047ff90, 0x012ec382, 0x0344be73, 0x0348156b, 0x0167e8ab, 0x022128d4, 0x022976f2, 0x000ac7b2}}}, + {X: Field{[10]uint32{0x01262974, 0x0227739e, 0x011867e5, 0x032360e6, 0x015b8d4f, 0x02a2fda4, 0x0208b51c, 0x00a672f0, 0x0209c39f, 0x00180ae0}}, Y: Field{[10]uint32{0x027f5555, 0x03367695, 0x035f2267, 0x0016be43, 0x00a5ed1f, 0x01e46976, 0x02c43f94, 0x032a0daa, 0x00da05d7, 0x0003e2db}}}, + {X: Field{[10]uint32{0x020e53d1, 0x0144547f, 0x00232752, 0x001703e8, 0x010ff14c, 0x01399920, 0x02991e48, 0x0229b55c, 0x0368868a, 0x0015e93c}}, Y: Field{[10]uint32{0x023a0c6d, 0x03e95e04, 0x01a9efa1, 0x028ea8f9, 0x0353d52e, 0x03a593cb, 0x00e17869, 0x026e0cda, 0x007c5bc2, 0x00035b32}}}, + {X: Field{[10]uint32{0x0206db2a, 0x0122de1a, 0x02b54435, 0x00f96f4c, 0x02459906, 0x02c04b35, 0x004c5ae2, 0x03c441c3, 0x00f0ae9d, 0x0013e6d2}}, Y: Field{[10]uint32{0x015ea016, 0x03b7b5f7, 0x02a157bd, 0x0086fc62, 0x02980cd6, 0x01bf90ab, 0x03563ebf, 0x031e3d9b, 0x00fe3caf, 0x003569e8}}}, + {X: Field{[10]uint32{0x005e7375, 0x014ed7db, 0x007085a0, 0x02b4d778, 0x01e1910a, 0x022ed98f, 0x02615893, 0x00d27d11, 0x03084b11, 0x00391a94}}, Y: Field{[10]uint32{0x01183ce9, 0x029f4cb8, 0x03c479e1, 0x00afe9af, 0x02cb8c3d, 0x03c1eb38, 0x03923be9, 0x018cb7ef, 0x02889583, 0x003691b6}}}, + {X: Field{[10]uint32{0x01c071ea, 0x022e5880, 0x0267415c, 0x0358ad82, 0x00d62f2a, 0x03249410, 0x03e64de3, 0x005878c8, 0x0366b94b, 0x000d90f5}}, Y: Field{[10]uint32{0x0316fa98, 0x03c6d6e7, 0x01a967af, 0x013e0f4d, 0x0080835d, 0x00083db5, 0x029dcffa, 0x0278176c, 0x02f11f2b, 0x003ebda6}}}, + {X: Field{[10]uint32{0x03497dca, 0x03c6c6ef, 0x01478f6f, 0x01edfe8c, 0x00e6bea5, 0x01138177, 0x03e1b485, 0x0185486e, 0x02940c02, 0x00259da5}}, Y: Field{[10]uint32{0x03e30b03, 0x0209c0ac, 0x0293c407, 0x004b1d64, 0x038210fd, 0x0365f023, 0x033b033b, 0x02b85259, 0x02fd7d0d, 0x0013ad69}}}, + {X: Field{[10]uint32{0x01a24d07, 0x019f9996, 0x00ef65c8, 0x029bd04d, 0x007f80fd, 0x0104438a, 0x03e0ff4b, 0x0264c626, 0x01ef2c47, 0x0000b907}}, Y: Field{[10]uint32{0x0074c313, 0x0214c772, 0x01f52015, 0x03045d10, 0x0269bde3, 0x015bfece, 0x03a1f50e, 0x022c4a8e, 0x017bb838, 0x0009a853}}}, + {X: Field{[10]uint32{0x0003c29b, 0x00a1316b, 0x0037db7f, 0x03c2152a, 0x00db94cb, 0x007ad8f9, 0x004fbf77, 0x03f83a69, 0x001af6ea, 0x003ce765}}, Y: Field{[10]uint32{0x00bd7b73, 0x018b9ce3, 0x00183d8b, 0x00d300ec, 0x0072cd59, 0x001f812c, 0x001f8b55, 0x01344889, 0x03700dac, 0x0007ffb5}}}, + {X: Field{[10]uint32{0x00136419, 0x01d91254, 0x03d1c595, 0x0114a005, 0x011cdac0, 0x00b64189, 0x011f8dcc, 0x02fba824, 0x01344576, 0x00242403}}, Y: Field{[10]uint32{0x00161ad6, 0x00255a92, 0x01666b0c, 0x039bacd3, 0x001457ce, 0x028acb17, 0x00444980, 0x02040b68, 0x03bb2a33, 0x001834e2}}}, + {X: Field{[10]uint32{0x00ac2e06, 0x006944f6, 0x0109ee3e, 0x038e5ed9, 0x0244a523, 0x0074ade0, 0x0344226f, 0x03d298b9, 0x02271007, 0x000e9791}}, Y: Field{[10]uint32{0x00202449, 0x0089aeba, 0x01d90f75, 0x03f95ede, 0x010bcdfc, 0x029057cd, 0x016dee2f, 0x03f0fc09, 0x03c1074c, 0x00143c07}}}, + {X: Field{[10]uint32{0x03e24355, 0x02db0fc4, 0x02b87a06, 0x0162a3c3, 0x02b13ac2, 0x01bdb91a, 0x025492ef, 0x0047907a, 0x0256f6d7, 0x003d9ba8}}, Y: Field{[10]uint32{0x02243841, 0x0000c1c9, 0x010b57fa, 0x0281bcff, 0x028f32a2, 0x0303db4a, 0x02c24014, 0x03a9b21f, 0x00470980, 0x003ee287}}}, + {X: Field{[10]uint32{0x03038fa0, 0x009602f4, 0x022a85c6, 0x0216accd, 0x00c946a4, 0x031d0db4, 0x036d4ed6, 0x01b333ee, 0x012019a1, 0x0032b681}}, Y: Field{[10]uint32{0x03d32ae6, 0x03cb4841, 0x032032b5, 0x01c42bc3, 0x03421de9, 0x006b9ce4, 0x03069639, 0x010c92b1, 0x000a3480, 0x00389265}}}, + {X: Field{[10]uint32{0x03759cf1, 0x039d7eb2, 0x037122c4, 0x004d70b6, 0x02ce2084, 0x03760c2c, 0x03d51929, 0x01ca565a, 0x035e820b, 0x00345bd6}}, Y: Field{[10]uint32{0x02448ed8, 0x038de11a, 0x0349ce61, 0x021788a1, 0x036ecdd5, 0x01781451, 0x01363807, 0x02f35f77, 0x0084cfbe, 0x001c3b6c}}}, + {X: Field{[10]uint32{0x01f71535, 0x01444d35, 0x009a4847, 0x03275365, 0x013dc31a, 0x03199bcc, 0x02e51498, 0x02b8372d, 0x028ddc6b, 0x002ef333}}, Y: Field{[10]uint32{0x03f91eed, 0x03396b48, 0x03a6ea23, 0x01a02627, 0x01c8941f, 0x0239eefd, 0x031b4796, 0x024af949, 0x02fc63ff, 0x001369dc}}}, + {X: Field{[10]uint32{0x014243fe, 0x001854bb, 0x032915f6, 0x03e3a0da, 0x02e7d5d2, 0x01a087ae, 0x01e940d0, 0x01d710c9, 0x00f5cd8b, 0x001457ca}}, Y: Field{[10]uint32{0x03668b47, 0x00bc7118, 0x032a24ba, 0x0209bdf6, 0x00e1855a, 0x0208a496, 0x0209f466, 0x02e3f852, 0x03ccf5d2, 0x00284c50}}}, + {X: Field{[10]uint32{0x01233837, 0x03b61148, 0x03f79df6, 0x02d6e3f5, 0x0068d356, 0x034e049e, 0x011ed6f9, 0x0118b61a, 0x02aea78c, 0x002f4bd1}}, Y: Field{[10]uint32{0x01c4af11, 0x02f5f21e, 0x00324b92, 0x02b98aae, 0x0284ddd9, 0x035f5bf8, 0x0332f70e, 0x0200fdfa, 0x02d3f3cc, 0x0023d917}}}, + {X: Field{[10]uint32{0x01e37dfa, 0x01f5977e, 0x0313347d, 0x034e4b83, 0x0004f8d7, 0x00046914, 0x0210b512, 0x008489a7, 0x013cc3d3, 0x00215dbc}}, Y: Field{[10]uint32{0x028b1a4f, 0x027640fd, 0x021958d1, 0x00a116d9, 0x0386ff90, 0x027bb7a2, 0x009eb8c1, 0x0384c48c, 0x00483fa0, 0x003eefc8}}}, + {X: Field{[10]uint32{0x0309db4a, 0x02327ce0, 0x0341a23b, 0x03cb4c73, 0x01763a83, 0x03c8d87f, 0x03f262ab, 0x01391f5c, 0x02918fdf, 0x001c2f87}}, Y: Field{[10]uint32{0x028bc573, 0x00fdc210, 0x0318829f, 0x032770fb, 0x03a1897a, 0x0224a50e, 0x013fa488, 0x01bbd030, 0x0175e424, 0x0020be01}}}, + {X: Field{[10]uint32{0x0341180f, 0x0193a452, 0x02361c80, 0x026848c4, 0x01017352, 0x028d4ebe, 0x0354a461, 0x01ad4e6f, 0x013d1d58, 0x002ee282}}, Y: Field{[10]uint32{0x03478269, 0x00d3616b, 0x0165e723, 0x01034887, 0x02287075, 0x033d779f, 0x028d66bc, 0x02894735, 0x02d78456, 0x00118383}}}, + {X: Field{[10]uint32{0x005c2e69, 0x0128492f, 0x018606dc, 0x0211d530, 0x027b976a, 0x001c7e87, 0x03306287, 0x006533d2, 0x024f34d9, 0x001e05eb}}, Y: Field{[10]uint32{0x00d55cbc, 0x02f9774b, 0x02d7b481, 0x00303e12, 0x006afe1c, 0x013e2cd0, 0x02ed346e, 0x02c6d6f1, 0x0056c4e3, 0x00097d3b}}}, + {X: Field{[10]uint32{0x0366abcc, 0x03fb446f, 0x009a5bcc, 0x03c49cd3, 0x03e72af5, 0x00396ed7, 0x02ed8e2a, 0x0167e9bf, 0x00dc411f, 0x002171d8}}, Y: Field{[10]uint32{0x03cb8cc4, 0x019ac9b2, 0x028ad106, 0x00399403, 0x0389a891, 0x00e99f96, 0x00f12482, 0x0271c6fc, 0x01b0b57c, 0x0024960f}}}, + {X: Field{[10]uint32{0x015086c3, 0x0206af17, 0x0179ad4c, 0x008d1faa, 0x03d9ee71, 0x0079cdde, 0x00739e3b, 0x01d8bfcb, 0x01354d9d, 0x00083603}}, Y: Field{[10]uint32{0x02f0efe5, 0x01077dd8, 0x01cf7489, 0x01ac6c89, 0x010ef6ed, 0x03c4d46d, 0x0123b7f1, 0x0299d7a0, 0x017b8017, 0x001b8647}}}, + {X: Field{[10]uint32{0x01ba5657, 0x0370f83f, 0x00fde086, 0x03f25c24, 0x00ec26ce, 0x004a2601, 0x036d9c8d, 0x0312c197, 0x022d43f2, 0x000cc1a4}}, Y: Field{[10]uint32{0x03c7efc4, 0x01970c04, 0x00d881b8, 0x01067e1f, 0x0186f0e9, 0x02871019, 0x039f76ef, 0x035eb1c1, 0x009fc93d, 0x00262a33}}}, + {X: Field{[10]uint32{0x032fb001, 0x0379b1ce, 0x01fc18ac, 0x02b02c21, 0x018a1b9a, 0x02488da0, 0x00f77033, 0x01fc4910, 0x019754d3, 0x002cd71d}}, Y: Field{[10]uint32{0x03cd649d, 0x03dadd44, 0x01660a7a, 0x02d1be4f, 0x022ea789, 0x037d65a3, 0x0058ffb0, 0x02121657, 0x039069b0, 0x00001212}}}, + {X: Field{[10]uint32{0x034e1f33, 0x03c25d51, 0x0158786e, 0x03e3a43f, 0x0205c647, 0x01648ac6, 0x009d0104, 0x030c0db3, 0x03537f8b, 0x0026f506}}, Y: Field{[10]uint32{0x030274ac, 0x0340ef2f, 0x013aec25, 0x01da3480, 0x018b8667, 0x03fce269, 0x0086bfe1, 0x03849769, 0x03f655ec, 0x001642be}}}, + {X: Field{[10]uint32{0x001ded42, 0x023c5815, 0x0020e527, 0x00e9cd65, 0x036950d9, 0x00e38372, 0x0289703a, 0x02bbc2f3, 0x032ca9b3, 0x000a8e99}}, Y: Field{[10]uint32{0x02693d8e, 0x03cee270, 0x02a5fc6a, 0x0033e22b, 0x02c95f85, 0x02d8aeac, 0x008ebef6, 0x00e0f6e4, 0x00b613f3, 0x00130ea5}}}, + {X: Field{[10]uint32{0x00f74d3d, 0x0250e096, 0x01bf6937, 0x017c5b71, 0x00c8db94, 0x014e01b7, 0x01f38003, 0x0253e353, 0x02f20a2d, 0x000c6e9a}}, Y: Field{[10]uint32{0x0329df5a, 0x008e3308, 0x03f4a236, 0x020b1509, 0x01fc1e6a, 0x0180d131, 0x01d915ef, 0x03ac72e9, 0x0102b290, 0x002b4677}}}, + {X: Field{[10]uint32{0x00869720, 0x004a54af, 0x01bb05bb, 0x0147a712, 0x00587c02, 0x02fd12a6, 0x030f9b8e, 0x0053c177, 0x01bd74b0, 0x003e8866}}, Y: Field{[10]uint32{0x0163f45e, 0x00b484ec, 0x0231a66d, 0x03bac7d5, 0x03041ab6, 0x018387a6, 0x035c4838, 0x03d7d2c3, 0x017d6efd, 0x0010ca24}}}, + {X: Field{[10]uint32{0x03e22d52, 0x011a6a62, 0x0199f30a, 0x000b8eff, 0x0108aaac, 0x024aad8f, 0x00f28476, 0x00f03d73, 0x0046c7f5, 0x00105ee4}}, Y: Field{[10]uint32{0x023b82c0, 0x0175a921, 0x008e0d49, 0x02a0ef6c, 0x007aede9, 0x005c1b80, 0x036eae69, 0x025e237f, 0x02655f30, 0x001e3057}}}, + {X: Field{[10]uint32{0x0318bc2a, 0x0390f55b, 0x00964f33, 0x026005c5, 0x026158f4, 0x01e9a7fe, 0x00e6eca6, 0x007f6228, 0x01f247d5, 0x0015ab24}}, Y: Field{[10]uint32{0x010680c7, 0x02c699b7, 0x02740c54, 0x02b89b9e, 0x00429bee, 0x01ee0719, 0x03c518b3, 0x00692dc5, 0x015c9e1b, 0x000d46df}}}, + {X: Field{[10]uint32{0x03215f8a, 0x001f594d, 0x00250685, 0x01c04324, 0x01e164ae, 0x002eafb2, 0x02d835aa, 0x01fbcc54, 0x02f88330, 0x002bae8c}}, Y: Field{[10]uint32{0x002c4e21, 0x038aba16, 0x0040fdcd, 0x031a9073, 0x037ce7e3, 0x0333be10, 0x03165577, 0x017cb9bf, 0x013935cf, 0x00235d1f}}}, + {X: Field{[10]uint32{0x01db5813, 0x035a0748, 0x03e63d47, 0x03ac3936, 0x0379ee10, 0x015bb411, 0x03d6bcc2, 0x00325da4, 0x02199af0, 0x0010b1ec}}, Y: Field{[10]uint32{0x0219378f, 0x012196ec, 0x03c75c3c, 0x01747f3d, 0x02a5fd87, 0x0225610c, 0x0244a4df, 0x031f2cb3, 0x03081fb1, 0x002857ed}}}, + {X: Field{[10]uint32{0x024e5d98, 0x02845b68, 0x01e2c36c, 0x0288270e, 0x0225e0db, 0x006f357f, 0x03fe19d0, 0x0196a222, 0x0297ecf3, 0x0010cdec}}, Y: Field{[10]uint32{0x0242b7ad, 0x01056ec8, 0x01722915, 0x022f2736, 0x0328d1ef, 0x0381b6dc, 0x00833485, 0x007b6f2f, 0x03abc654, 0x001271c8}}}, + {X: Field{[10]uint32{0x03f857bf, 0x0066876d, 0x02f84a25, 0x00949f93, 0x00aeefbf, 0x02e12c94, 0x028af0ce, 0x024cb3a5, 0x00761481, 0x00062663}}, Y: Field{[10]uint32{0x02c97fa2, 0x03204a09, 0x01ba39b7, 0x015342fe, 0x00911330, 0x03cca274, 0x02c9ae77, 0x02110d72, 0x00856451, 0x001157af}}}, + {X: Field{[10]uint32{0x02a49b2b, 0x02e256c1, 0x0188e69c, 0x01907995, 0x0387767b, 0x02ff62d3, 0x010516f1, 0x015ca816, 0x0320fa24, 0x001931d8}}, Y: Field{[10]uint32{0x00b9603f, 0x03fa33dd, 0x01395d39, 0x022a1e67, 0x0178366c, 0x01a097b0, 0x03ae76f8, 0x01425680, 0x02a5c479, 0x00028e68}}}, + {X: Field{[10]uint32{0x012b0ad7, 0x034efd20, 0x004e1ebb, 0x028ceced, 0x02dea917, 0x031bc4a9, 0x03a5f2d3, 0x02e1f296, 0x0005e35e, 0x0010595d}}, Y: Field{[10]uint32{0x01ff815d, 0x02375be5, 0x034916b6, 0x0170825a, 0x034d0ed7, 0x02b732d4, 0x037fe787, 0x0114ad15, 0x01ae36f1, 0x0023885a}}}, + {X: Field{[10]uint32{0x00391f6e, 0x01b8c370, 0x00cb68b7, 0x00440b04, 0x017bfd4a, 0x03d298c5, 0x02110c80, 0x012e245b, 0x03a3768a, 0x002a8803}}, Y: Field{[10]uint32{0x0184695b, 0x00d4d3a9, 0x02fde7fb, 0x0351a416, 0x00c49b79, 0x01f4662a, 0x02c898bd, 0x0055577f, 0x015928b2, 0x00159ef6}}}, + {X: Field{[10]uint32{0x03131599, 0x03e6ee9d, 0x00966555, 0x035a7961, 0x03eb529b, 0x02327188, 0x003ba48c, 0x00bd52e1, 0x0328841d, 0x001ea9e0}}, Y: Field{[10]uint32{0x01f698ed, 0x0112bcda, 0x003ba1bb, 0x0118a696, 0x01327112, 0x0138bdbc, 0x01a7e7a6, 0x011e2c93, 0x0315e4b8, 0x001ad289}}}, + {X: Field{[10]uint32{0x016969a1, 0x00d11d4e, 0x01fdfdae, 0x013d92ef, 0x0248446b, 0x01e3eeef, 0x019234fc, 0x019ffc11, 0x03bd6a27, 0x00252c69}}, Y: Field{[10]uint32{0x011cc33d, 0x03a233e6, 0x0054fdf1, 0x01e3a2e2, 0x02e77e21, 0x02e6a907, 0x029320a8, 0x02a1c774, 0x01ef2273, 0x0023cc19}}}, + {X: Field{[10]uint32{0x0126573a, 0x036633b5, 0x0071035f, 0x01c4de8d, 0x005407df, 0x01a07830, 0x00c8cb27, 0x03afd4a5, 0x03a71bfe, 0x001ae55e}}, Y: Field{[10]uint32{0x022724a0, 0x03f6e21e, 0x037f4583, 0x003b0297, 0x0235c6df, 0x03bed424, 0x01cd4ff6, 0x0214f179, 0x008d3fc1, 0x0019f920}}}, + {X: Field{[10]uint32{0x03717f7f, 0x029a4590, 0x01cb2b8a, 0x02da02f6, 0x03f9a6df, 0x02c7f2ca, 0x0293892a, 0x010400ef, 0x03300ea3, 0x0022c9d0}}, Y: Field{[10]uint32{0x0198db90, 0x02bebc5e, 0x00da3c99, 0x02a82727, 0x014ed141, 0x0271c4e2, 0x027f8284, 0x01620f98, 0x02bb7785, 0x00153e8a}}}, + {X: Field{[10]uint32{0x0358db05, 0x0117899e, 0x012e75d1, 0x01c92668, 0x033b6863, 0x01eb1997, 0x01274de7, 0x008ce524, 0x039b6736, 0x0034fd93}}, Y: Field{[10]uint32{0x01a52449, 0x00a81432, 0x0310e5c8, 0x01410060, 0x009bea58, 0x02267eaa, 0x01284f43, 0x0057d051, 0x02c852bd, 0x00301845}}}, + {X: Field{[10]uint32{0x0237ba79, 0x03ad557c, 0x00d4bc4a, 0x007a006d, 0x02870d07, 0x0243de57, 0x03b92803, 0x010ca406, 0x02f8ce0e, 0x00066249}}, Y: Field{[10]uint32{0x02b3d34e, 0x00fc81b4, 0x01d76a83, 0x03411523, 0x035d6c10, 0x00373c43, 0x027658fa, 0x001f9d78, 0x03d95b8d, 0x001d8496}}}, + {X: Field{[10]uint32{0x0301a13f, 0x032962f3, 0x003099ad, 0x03f1be1e, 0x00ee4358, 0x03770961, 0x0346cfb6, 0x014be0e5, 0x014d5951, 0x000006ef}}, Y: Field{[10]uint32{0x038d7733, 0x01fa7f37, 0x016e0b58, 0x03f13c21, 0x03ebdc70, 0x03797af7, 0x003cdfe3, 0x0317a9c2, 0x00deccea, 0x00063d4d}}}, + {X: Field{[10]uint32{0x01a3132a, 0x00b89d7d, 0x0398c131, 0x01fc876c, 0x03005245, 0x008089a4, 0x00b551f5, 0x0249c8df, 0x0345b263, 0x00221cdf}}, Y: Field{[10]uint32{0x00c496ed, 0x0285e778, 0x020290b2, 0x03fb256a, 0x02e3e61c, 0x006e8317, 0x01a7b222, 0x0387a12c, 0x032c2895, 0x001e6959}}}, + {X: Field{[10]uint32{0x00cb1e83, 0x03852ff3, 0x02252004, 0x01f91b9e, 0x012d6849, 0x03f873ea, 0x00ca35e8, 0x01ddccd3, 0x018b1f27, 0x0032fcf8}}, Y: Field{[10]uint32{0x02bc3f99, 0x03d72521, 0x029a401f, 0x01c249ae, 0x007b91f7, 0x03c91d23, 0x01d242a5, 0x0115b0f2, 0x039565bd, 0x0036c030}}}, + {X: Field{[10]uint32{0x03022f70, 0x00699071, 0x0093c40b, 0x00809c82, 0x008ab65b, 0x00aa4ea6, 0x01c88467, 0x03beb97e, 0x030cf186, 0x00201c3b}}, Y: Field{[10]uint32{0x027bd9e5, 0x02762044, 0x018caa24, 0x014e9d17, 0x00cc85c8, 0x021ff60e, 0x0024cf5a, 0x01a8151a, 0x01b04694, 0x0036a601}}}, + {X: Field{[10]uint32{0x03f71eab, 0x021a6030, 0x03e21902, 0x02d88490, 0x035c57dc, 0x022dbf88, 0x00c50640, 0x0176efa1, 0x004b8fa4, 0x002b2be6}}, Y: Field{[10]uint32{0x00eb278e, 0x02cef44b, 0x010b5d1d, 0x0077c5f7, 0x03801b8c, 0x02eb8a41, 0x004dfb0b, 0x03e8bbc5, 0x00168259, 0x0011bd3b}}}, + {X: Field{[10]uint32{0x03fdc965, 0x036a5c7e, 0x000994ee, 0x01494a91, 0x01e89162, 0x015f8f49, 0x01e8a32a, 0x03b3a9cd, 0x020591f9, 0x0000a24e}}, Y: Field{[10]uint32{0x03cfbb6a, 0x02c5681e, 0x012a18c3, 0x03082abc, 0x01372aa6, 0x03edf495, 0x02b5186e, 0x02c48c04, 0x014191e4, 0x001ba8a6}}}, + {X: Field{[10]uint32{0x02be951d, 0x016d9130, 0x01b39dc0, 0x002963c4, 0x00cfccab, 0x03b44b7c, 0x0126e285, 0x032d8272, 0x023168f0, 0x001925d1}}, Y: Field{[10]uint32{0x01eafb7c, 0x0012268c, 0x03406016, 0x02a705e2, 0x03d432b5, 0x03c94271, 0x004bb219, 0x0217890d, 0x001b2fa8, 0x003a9d06}}}, + {X: Field{[10]uint32{0x021faeef, 0x03c3a22e, 0x006e2d1b, 0x007174ea, 0x01091862, 0x0260440e, 0x014f7c20, 0x025322cb, 0x003e5133, 0x002e4e11}}, Y: Field{[10]uint32{0x0353fc85, 0x021f6bf0, 0x01be0963, 0x03226d9a, 0x00c52473, 0x017fe505, 0x0384f384, 0x02190941, 0x02a8c7d9, 0x002bd1fc}}}, + {X: Field{[10]uint32{0x012a5320, 0x01b6b167, 0x03b8d42f, 0x02333da6, 0x0124f475, 0x01d8d1ae, 0x00fd4a78, 0x03d43a7e, 0x0245ad10, 0x002f47b8}}, Y: Field{[10]uint32{0x00039605, 0x021cd238, 0x01518af7, 0x010d92ce, 0x00134ce4, 0x013ffa4b, 0x02477ac7, 0x02235709, 0x023e069d, 0x001ddb8b}}}, + {X: Field{[10]uint32{0x0260650f, 0x0277d0f1, 0x006a97d4, 0x00819e92, 0x036d8e13, 0x009e763e, 0x027dc054, 0x02157c5f, 0x0068805e, 0x00032dfb}}, Y: Field{[10]uint32{0x029e903c, 0x0393f608, 0x01b5a91c, 0x00e5b496, 0x01b12d73, 0x01c5497f, 0x03302eb0, 0x01040c47, 0x00b284c0, 0x003d41e4}}}, + {X: Field{[10]uint32{0x0330cf83, 0x004846ea, 0x02a15e1c, 0x0057ef78, 0x031968c6, 0x03213369, 0x0222a1c7, 0x02ed68a7, 0x037e0aff, 0x003bc1f3}}, Y: Field{[10]uint32{0x00ef574f, 0x0310971c, 0x01979815, 0x01789616, 0x002ca556, 0x013203cb, 0x03fc2fee, 0x00c35040, 0x02c94226, 0x00263d29}}}, + {X: Field{[10]uint32{0x027b8fc6, 0x0309ab4f, 0x027814ee, 0x01902189, 0x0113dc50, 0x0045003c, 0x00e4ca0d, 0x03316733, 0x01484d7f, 0x0013ff06}}, Y: Field{[10]uint32{0x03b75aa9, 0x013961df, 0x0266961b, 0x038e4dfb, 0x02d94b65, 0x03721fc4, 0x01ac1075, 0x00f60f2d, 0x020798ff, 0x002fa7af}}}, + {X: Field{[10]uint32{0x01d18396, 0x035a2f18, 0x01b63b4e, 0x01acb693, 0x00fad1ad, 0x0318dc6c, 0x00df0efa, 0x03524ee3, 0x0373339e, 0x0032f754}}, Y: Field{[10]uint32{0x02bdb13f, 0x02fe86b5, 0x025fac77, 0x035f200f, 0x003784a7, 0x01c2704c, 0x0138b6ff, 0x00b51c7d, 0x0087c321, 0x00149f79}}}, + {X: Field{[10]uint32{0x027cb5d2, 0x01efd6f1, 0x01fed65e, 0x02838c0d, 0x014e650a, 0x03800fe6, 0x03f6b065, 0x035fa76d, 0x032bd8a1, 0x003a80d6}}, Y: Field{[10]uint32{0x003761c4, 0x01918223, 0x00edddbc, 0x0258a8ec, 0x032cd57e, 0x03fa071a, 0x0372e91a, 0x03d22219, 0x03702219, 0x002bb2d0}}}, + {X: Field{[10]uint32{0x01f8db89, 0x02a3bd66, 0x010cd99b, 0x03da407b, 0x02911648, 0x00b50ff6, 0x029dda6b, 0x00902b5b, 0x03d6c1d6, 0x00378693}}, Y: Field{[10]uint32{0x004da03e, 0x0088faa2, 0x012cd3a4, 0x02c4150b, 0x02f85f90, 0x01c78b98, 0x00a60853, 0x03fd0747, 0x00d161c0, 0x003bff25}}}, + {X: Field{[10]uint32{0x02a076ed, 0x033d6df9, 0x037f0e58, 0x022bc03e, 0x00d75e11, 0x02f3ffaf, 0x02157878, 0x01fb5b84, 0x0141e8d8, 0x000b9910}}, Y: Field{[10]uint32{0x0334b8d2, 0x03a03ff2, 0x005b7320, 0x0037d97e, 0x02b45c24, 0x009b48b0, 0x00a70110, 0x018b61ae, 0x00ddf2ba, 0x0012aa16}}}, + {X: Field{[10]uint32{0x01b73a33, 0x0220ecdc, 0x01c3e956, 0x01e4b49d, 0x0247ff88, 0x023cb4a3, 0x03b78ad0, 0x02e1e243, 0x006a90d6, 0x000e110e}}, Y: Field{[10]uint32{0x0365cd18, 0x03f51d2c, 0x0157c714, 0x015fc5f3, 0x01ff2845, 0x032a3ba2, 0x036bde12, 0x012701d7, 0x03121a81, 0x003dfd77}}}, + {X: Field{[10]uint32{0x00358e42, 0x03a5bc1d, 0x03ae8ff7, 0x0382eacb, 0x01bde185, 0x02ba080f, 0x0218cd89, 0x034d88ad, 0x03321b91, 0x00387fa6}}, Y: Field{[10]uint32{0x01f3e1c4, 0x00ded2b7, 0x021d5f85, 0x0192b2ae, 0x02cef4f0, 0x00afca9d, 0x01eff10f, 0x004cba89, 0x02901797, 0x0031643f}}}, + {X: Field{[10]uint32{0x027a3c0b, 0x01c9f12c, 0x00a499cc, 0x03b68782, 0x00aefbbd, 0x016262bc, 0x020144d4, 0x036086da, 0x00da2f57, 0x00158280}}, Y: Field{[10]uint32{0x0395e208, 0x00044ab9, 0x02eaaa8b, 0x018d36ef, 0x025db86d, 0x020ec54b, 0x00b79ff9, 0x004ddcef, 0x024e39db, 0x001921d3}}}, + {X: Field{[10]uint32{0x0379094d, 0x02ecbcbc, 0x011dce5c, 0x0076f433, 0x001afe9b, 0x015b8a05, 0x03164248, 0x0378ab06, 0x03a77ec8, 0x0027ccfe}}, Y: Field{[10]uint32{0x02fe94b0, 0x02c2a709, 0x0384892f, 0x0366fff8, 0x01d972ab, 0x0177b358, 0x0034f19b, 0x038a9c98, 0x00d81838, 0x0025f2e3}}}, + {X: Field{[10]uint32{0x02d7a1b9, 0x01411f9c, 0x01226da7, 0x014f81a8, 0x01e46ee2, 0x02833ec5, 0x039da042, 0x01d44923, 0x03a82405, 0x0026208b}}, Y: Field{[10]uint32{0x02b19285, 0x00f7c53f, 0x00cc2a55, 0x013339f1, 0x03db975d, 0x03e5643c, 0x01475611, 0x0152b369, 0x023507bc, 0x000fa7ba}}}, + {X: Field{[10]uint32{0x001dbd88, 0x021a81ab, 0x0307cc40, 0x0179f885, 0x03bc7287, 0x00bc3e12, 0x01883273, 0x01c9a1ab, 0x01ac4b75, 0x002e0534}}, Y: Field{[10]uint32{0x00f18a98, 0x0114a640, 0x01c36cf1, 0x03fc635a, 0x00c03462, 0x0129ee2a, 0x01b8ab3c, 0x02848900, 0x00883749, 0x002d8d91}}}, + {X: Field{[10]uint32{0x01043e97, 0x00f068af, 0x00cd8623, 0x010a170a, 0x03b39cf8, 0x03b677f3, 0x039f7b7e, 0x0044f334, 0x00c41e42, 0x00091921}}, Y: Field{[10]uint32{0x039552d3, 0x01fd743a, 0x00502387, 0x03ad1294, 0x0280f431, 0x0342dd79, 0x01d36f79, 0x02f76010, 0x01b02e31, 0x003cd409}}}, + {X: Field{[10]uint32{0x0351db91, 0x02bee63f, 0x0358e847, 0x00902474, 0x03bbe8c5, 0x00a13930, 0x03fff0e4, 0x02cbb361, 0x03657b41, 0x0027ccc0}}, Y: Field{[10]uint32{0x02d5e70d, 0x03d0cddc, 0x03dad317, 0x0305d584, 0x01adf519, 0x013df339, 0x0176a43d, 0x0221c378, 0x03cb221c, 0x0012e69e}}}, + {X: Field{[10]uint32{0x01529d25, 0x02e6f2a7, 0x0161c225, 0x01452c58, 0x02b0e719, 0x03d69370, 0x035623a8, 0x010cf017, 0x029b3c75, 0x0030b9e3}}, Y: Field{[10]uint32{0x039079bb, 0x02228f2a, 0x001b9505, 0x00ab5891, 0x03e79436, 0x02c928b8, 0x0387b209, 0x01db2b18, 0x00f19383, 0x00079d72}}}, + {X: Field{[10]uint32{0x03695391, 0x0179aea9, 0x03f867ce, 0x00340a41, 0x022125c4, 0x01522bab, 0x01c9636b, 0x006df215, 0x02c4b6e8, 0x00224d03}}, Y: Field{[10]uint32{0x012c72c6, 0x030fa8de, 0x00671575, 0x02755492, 0x002b2a9c, 0x00f8af04, 0x01cc2c10, 0x01e5b77c, 0x014e263e, 0x003dce6a}}}, + {X: Field{[10]uint32{0x02629d22, 0x00aef8b5, 0x022daa7e, 0x00f63f63, 0x035d66a9, 0x034e29b0, 0x00facd48, 0x00f3081e, 0x0315f144, 0x0024813f}}, Y: Field{[10]uint32{0x0159c019, 0x00098e9d, 0x03253be1, 0x015609c9, 0x00131205, 0x00a4ffcf, 0x005020ec, 0x0143a588, 0x0075456b, 0x000ae77a}}}, + {X: Field{[10]uint32{0x03ff04d6, 0x031257ba, 0x0284d7ab, 0x03929ef5, 0x0261fad9, 0x00c97d77, 0x02b518dc, 0x00bf5f39, 0x02104112, 0x003c55b6}}, Y: Field{[10]uint32{0x01b631d4, 0x011a8380, 0x0170376e, 0x0135ce7d, 0x017f2c40, 0x000c6976, 0x03aa78d2, 0x02b7fb72, 0x00abf4f2, 0x0031cca5}}}, + {X: Field{[10]uint32{0x0280fa75, 0x01f6808c, 0x022659fa, 0x01549941, 0x022c379a, 0x001430d8, 0x00998616, 0x0104e84c, 0x017837d6, 0x001dc68b}}, Y: Field{[10]uint32{0x014c9aca, 0x0002c997, 0x030f66b6, 0x001356f1, 0x03e42703, 0x01b23746, 0x03ef0b0f, 0x007d6e0a, 0x039f5cfe, 0x0022daf0}}}, + {X: Field{[10]uint32{0x01a18f69, 0x0048d9a1, 0x004018e5, 0x003ac730, 0x01aec29f, 0x01039473, 0x03b52b1f, 0x00b167d8, 0x00e036bb, 0x00053356}}, Y: Field{[10]uint32{0x005e2006, 0x00323667, 0x0372ef27, 0x0279d1ac, 0x03ea15b1, 0x027a93a3, 0x00c72623, 0x011905d1, 0x00fded35, 0x001e7095}}}, + {X: Field{[10]uint32{0x028633f1, 0x03fc9ec6, 0x0343c22b, 0x03254ada, 0x02cd539c, 0x024299f7, 0x000bff13, 0x0001c960, 0x00770106, 0x00397d50}}, Y: Field{[10]uint32{0x01666367, 0x02c80a23, 0x00b5f4c3, 0x02a6c3d5, 0x0280274d, 0x026be281, 0x038e691f, 0x021b1d60, 0x02c39baa, 0x0035b871}}}, + {X: Field{[10]uint32{0x03429197, 0x03abe2b9, 0x003d75b8, 0x012cf4df, 0x03679134, 0x025a4f64, 0x03d14ba7, 0x0080dfef, 0x03429c07, 0x002c3aab}}, Y: Field{[10]uint32{0x037af26d, 0x0145c5a6, 0x00341510, 0x0209a8bc, 0x00bc2373, 0x000805c4, 0x0124d9bd, 0x006d953c, 0x021e4a17, 0x00035c99}}}, + {X: Field{[10]uint32{0x004d67c2, 0x03847998, 0x00e883c2, 0x00bb3d8b, 0x005380f9, 0x021393a8, 0x01573832, 0x036bb4d6, 0x030b044e, 0x003808b5}}, Y: Field{[10]uint32{0x01ab4143, 0x00ac4724, 0x01c7152d, 0x026cb0f7, 0x0207aed8, 0x0054fa70, 0x015228a3, 0x03b43451, 0x01d43ba0, 0x00108f15}}}, + {X: Field{[10]uint32{0x03c5ab5f, 0x02999692, 0x00651349, 0x036a7976, 0x03af1a3e, 0x02525446, 0x0270f07b, 0x02abc996, 0x033eb2ea, 0x0024a8b5}}, Y: Field{[10]uint32{0x000fa973, 0x01a04878, 0x0004992d, 0x00f16b0d, 0x0105f170, 0x00e8c98c, 0x0089fff5, 0x03495268, 0x00194794, 0x001124b5}}}, + {X: Field{[10]uint32{0x01b9cb30, 0x008d6a63, 0x0003ec96, 0x00b8fb98, 0x03b12f10, 0x01ea73ba, 0x035ac444, 0x002a733c, 0x02860de5, 0x0010d025}}, Y: Field{[10]uint32{0x0210bba9, 0x00b37713, 0x02cb037d, 0x0261fcc5, 0x03c8e1e8, 0x03671b22, 0x00e38adb, 0x00405e39, 0x0040952e, 0x000bde04}}}, + {X: Field{[10]uint32{0x0394cd12, 0x0282b788, 0x024e1aaa, 0x010ce222, 0x02945426, 0x01cd7713, 0x003aa5ad, 0x03e3506e, 0x011b0643, 0x0034d277}}, Y: Field{[10]uint32{0x033249a5, 0x02b7b390, 0x01bc6072, 0x015fb38d, 0x01cf0822, 0x02803bfa, 0x01c71c9e, 0x02dab0a5, 0x00571da2, 0x0019fcbc}}}, + {X: Field{[10]uint32{0x02dd10e6, 0x004de059, 0x023d9c68, 0x02763e0c, 0x03babad3, 0x01cb6339, 0x036834d2, 0x01faecd7, 0x02957fb8, 0x0026a426}}, Y: Field{[10]uint32{0x02ddbca1, 0x02195ca8, 0x03cec863, 0x0367dc24, 0x01c12f16, 0x028bd800, 0x02248352, 0x0068a1fd, 0x011a3277, 0x00338fab}}}, + {X: Field{[10]uint32{0x0007fa0b, 0x02f33c2b, 0x01452a67, 0x01c44853, 0x031d77f9, 0x01a1ad7e, 0x03be25d3, 0x00a99268, 0x0218df2a, 0x003ce2c7}}, Y: Field{[10]uint32{0x01e65ea6, 0x019c7bdc, 0x039d4591, 0x03631223, 0x03419a20, 0x03029188, 0x011ced59, 0x02c806e8, 0x029a7f71, 0x00001727}}}, + {X: Field{[10]uint32{0x01535a67, 0x0381b20c, 0x039a6a86, 0x021304ad, 0x027b9097, 0x009d8bb4, 0x012738bc, 0x0342577d, 0x03ca26b8, 0x00108d83}}, Y: Field{[10]uint32{0x028345e4, 0x03064491, 0x02f665de, 0x030595fd, 0x03db93ae, 0x02f77114, 0x008bc432, 0x03000efa, 0x00e5e43e, 0x001adbd3}}}, + {X: Field{[10]uint32{0x003f4a1e, 0x00130d8c, 0x02a94534, 0x03016800, 0x01b87325, 0x00c8ddec, 0x03993eaa, 0x038ee665, 0x018da7c5, 0x0038f5c6}}, Y: Field{[10]uint32{0x0053ef4d, 0x004de048, 0x0265f5c8, 0x033cc817, 0x00a05f19, 0x017eaff9, 0x0342be83, 0x0052337d, 0x0218ece6, 0x001c90dc}}}, + {X: Field{[10]uint32{0x007cb59b, 0x02f1b65a, 0x01b480d6, 0x02d6f5a3, 0x0202f93d, 0x006454a7, 0x014f6258, 0x004441ad, 0x0145a830, 0x000e504a}}, Y: Field{[10]uint32{0x0250f08d, 0x009941bc, 0x01d9fd28, 0x02028405, 0x00e08b0a, 0x002a562d, 0x03057844, 0x030c6462, 0x022c60f5, 0x002e36e0}}}, + {X: Field{[10]uint32{0x01241fc2, 0x00b025f3, 0x014f421d, 0x0053552b, 0x02d93dc9, 0x0364da33, 0x03857c7e, 0x03a639da, 0x01f77e0e, 0x0001349d}}, Y: Field{[10]uint32{0x039d7473, 0x03922ae8, 0x02f05277, 0x03a24330, 0x03935448, 0x0254aac4, 0x019d361f, 0x00a447d8, 0x03d49b50, 0x003b2e00}}}, + {X: Field{[10]uint32{0x029556ce, 0x00fe01e1, 0x01e03c01, 0x0114f22a, 0x010160b1, 0x01667b56, 0x02fcd5b6, 0x0272f68f, 0x0076c1db, 0x000a4d92}}, Y: Field{[10]uint32{0x023f6ede, 0x00c6443c, 0x0186c2dc, 0x01a9df7c, 0x0243ffb5, 0x016507df, 0x03562379, 0x02543213, 0x02f4cc44, 0x000af6d2}}}, + {X: Field{[10]uint32{0x00878034, 0x003b9b79, 0x01e55d38, 0x0107d2c8, 0x036febcf, 0x00ee84cc, 0x003ef10d, 0x0337deae, 0x00a963dc, 0x001d4c7d}}, Y: Field{[10]uint32{0x03a36ae8, 0x0100d286, 0x0055e9c4, 0x02ec021f, 0x01e1dcb1, 0x03589a6c, 0x01628ca2, 0x01af087a, 0x029f91d5, 0x0011d4f6}}}, + {X: Field{[10]uint32{0x00286e08, 0x02514317, 0x02777a3d, 0x00a16f05, 0x016050ca, 0x02f7e2b0, 0x00dce7a4, 0x03fb2910, 0x02263d12, 0x002099b5}}, Y: Field{[10]uint32{0x03e2328b, 0x0177cb2b, 0x00877545, 0x03897369, 0x0096d908, 0x0267d8cf, 0x01e7e363, 0x013ad9a9, 0x02bffb8a, 0x0009403c}}}, + {X: Field{[10]uint32{0x03c589e9, 0x02a1b452, 0x023d69ea, 0x02a9672d, 0x036d5e62, 0x010e27e1, 0x039b26e8, 0x027c5630, 0x00014f33, 0x00199200}}, Y: Field{[10]uint32{0x02d92e2a, 0x01c05b12, 0x002f596c, 0x03076a29, 0x01f145ff, 0x01d6b0c6, 0x00785263, 0x0168de7c, 0x033fe3eb, 0x00281a66}}}, + {X: Field{[10]uint32{0x00c70d49, 0x01dead93, 0x0113486b, 0x02e387d1, 0x03f641e2, 0x01b224d0, 0x01921b5e, 0x003ee981, 0x00858b9c, 0x003e3bf3}}, Y: Field{[10]uint32{0x00a9d607, 0x00761d54, 0x00834f8b, 0x0389e49e, 0x005f4de2, 0x00d7668f, 0x01a0ae30, 0x03c366bd, 0x002f7086, 0x002ea5c8}}}, + {X: Field{[10]uint32{0x00992540, 0x010b8267, 0x02e736c5, 0x02c07638, 0x016f2485, 0x00eafecf, 0x02c627c9, 0x00928ec7, 0x027d2543, 0x00297048}}, Y: Field{[10]uint32{0x02ecc7cc, 0x005b6f21, 0x03da5a1d, 0x01173e5d, 0x0264cfef, 0x00e29fde, 0x019bed7f, 0x00eed5b6, 0x01b48a16, 0x00324627}}}, + {X: Field{[10]uint32{0x038bbaf3, 0x01418182, 0x018938e0, 0x00024983, 0x016c85bb, 0x01c0b7b1, 0x03b655d7, 0x014f7c3e, 0x0219a5b2, 0x0009c6c9}}, Y: Field{[10]uint32{0x02cd2ce5, 0x0326924f, 0x03bd8d86, 0x039756bc, 0x0172bca7, 0x02af9564, 0x01bd1746, 0x023c9f73, 0x03fc22cb, 0x0016333c}}}, + {X: Field{[10]uint32{0x0170ae16, 0x03077f41, 0x0036ad90, 0x00c24b2b, 0x021202ba, 0x01c8753c, 0x001800ce, 0x025d0436, 0x002b20c7, 0x0032784e}}, Y: Field{[10]uint32{0x0231e5b2, 0x0084ee04, 0x003f690d, 0x03ec3e69, 0x016f7a0d, 0x035e65d2, 0x012f7070, 0x033a80ea, 0x00ab2a47, 0x001fac7f}}}, + {X: Field{[10]uint32{0x000309f2, 0x00250780, 0x03decb1e, 0x01aa2f51, 0x0145897e, 0x00ad2251, 0x018cb751, 0x00a81075, 0x03256523, 0x000015d2}}, Y: Field{[10]uint32{0x024615a9, 0x02cebe3f, 0x03b72038, 0x03eb0ad7, 0x03474db8, 0x02a72774, 0x03bf2cc6, 0x01d2fe4f, 0x02a9567d, 0x002efee1}}}, + {X: Field{[10]uint32{0x03046c38, 0x02354218, 0x012b4a98, 0x03b1a54f, 0x021135e7, 0x037fdb15, 0x0120e004, 0x017b692d, 0x02aca630, 0x0027bfa1}}, Y: Field{[10]uint32{0x02e9af70, 0x02b60c6a, 0x02e42551, 0x01e646a6, 0x027afa4f, 0x030ed362, 0x03cbe67e, 0x002062bd, 0x029132cb, 0x0013e4a8}}}, + {X: Field{[10]uint32{0x0013f254, 0x028b72f6, 0x0328413a, 0x03e8cf61, 0x02df26ca, 0x0024639a, 0x00bf4c3d, 0x03e85cdd, 0x00a0ff76, 0x0020ba92}}, Y: Field{[10]uint32{0x032ac9f2, 0x021ac76f, 0x038e4a70, 0x03589b77, 0x0049b4c2, 0x005ea254, 0x01e1ca14, 0x0156a8e7, 0x01399bb5, 0x001a80a5}}}, + {X: Field{[10]uint32{0x01d2baaa, 0x0379d56f, 0x01f4f5fb, 0x03af78ca, 0x03e3af2f, 0x02982b7e, 0x0352a24b, 0x02c1b0c4, 0x003e817b, 0x0030a252}}, Y: Field{[10]uint32{0x00780a53, 0x00e87387, 0x005c04b1, 0x017b065a, 0x039c4994, 0x03fad657, 0x036854a1, 0x03b3bd8a, 0x010d8b4a, 0x000edfba}}}, + {X: Field{[10]uint32{0x02e12cc4, 0x01d02d25, 0x0030001c, 0x01835e2a, 0x02016986, 0x02c161ed, 0x028deb31, 0x003563a9, 0x02cbb558, 0x001af791}}, Y: Field{[10]uint32{0x01293292, 0x01baccba, 0x02d91e09, 0x0173450b, 0x020a41cc, 0x031e741d, 0x014ce750, 0x0059a922, 0x02a7c1cd, 0x000c6229}}}, + {X: Field{[10]uint32{0x01827cf4, 0x026b07d9, 0x00bdf451, 0x023e819b, 0x01017673, 0x01bf5d5c, 0x030a11d6, 0x0185795f, 0x03ae2844, 0x003474a8}}, Y: Field{[10]uint32{0x03f603db, 0x018c4899, 0x02ee70f9, 0x00d971f6, 0x038271f9, 0x014558ba, 0x03697d7c, 0x03065a2d, 0x03f70c01, 0x001f033f}}}, + {X: Field{[10]uint32{0x0227370a, 0x0057b5ee, 0x00be8f65, 0x02233ea8, 0x00e276b0, 0x02afe697, 0x0151c852, 0x01555ced, 0x00874d19, 0x002dd303}}, Y: Field{[10]uint32{0x01a662ab, 0x003c7dd1, 0x031b551e, 0x01784535, 0x026f0c32, 0x0313b630, 0x01e307be, 0x015c7bf9, 0x030e380c, 0x00003c32}}}, + {X: Field{[10]uint32{0x01015874, 0x0109827e, 0x0298f47d, 0x01deebb8, 0x00849500, 0x00c5f846, 0x03c30412, 0x01b0fe85, 0x039a9f12, 0x002a69c6}}, Y: Field{[10]uint32{0x002e0586, 0x0130a9a9, 0x020f08f3, 0x01fd5448, 0x03f1b113, 0x018d33b3, 0x024be1df, 0x03c32dfe, 0x03fdb31b, 0x003017cf}}}, + {X: Field{[10]uint32{0x00dbc68c, 0x0089d2a0, 0x01c259b0, 0x03e8fe88, 0x032b1b99, 0x02cfe08e, 0x03514162, 0x007c9f76, 0x01530a16, 0x0035b784}}, Y: Field{[10]uint32{0x0059764a, 0x03202f6f, 0x02215348, 0x018539d9, 0x00714fab, 0x02b2f7bf, 0x0015d259, 0x021697bb, 0x00636597, 0x001b1882}}}, + {X: Field{[10]uint32{0x036b73f1, 0x024a9d1d, 0x016df112, 0x00d80a9e, 0x0273a7dc, 0x016521fe, 0x038c22f3, 0x03297147, 0x01bc3acd, 0x00372a87}}, Y: Field{[10]uint32{0x00c85159, 0x0312a3c3, 0x035147c8, 0x026a5631, 0x01b4b4d4, 0x005c545e, 0x033719b0, 0x0181ed20, 0x01fcc22c, 0x0037104c}}}, + {X: Field{[10]uint32{0x0005ab6c, 0x01a89100, 0x01d21220, 0x00025526, 0x015f3a13, 0x01dc2535, 0x03aa93c6, 0x02f84c70, 0x03a000c4, 0x0004d54d}}, Y: Field{[10]uint32{0x00fb0f69, 0x00bc1159, 0x0333048c, 0x033f8d20, 0x0308f3eb, 0x03548dc2, 0x01f0d1dd, 0x037d9ccd, 0x031fd2d3, 0x001fbda7}}}, + {X: Field{[10]uint32{0x01de93ac, 0x03fa760e, 0x0004afb3, 0x03957a7a, 0x02751dd6, 0x00ff666b, 0x01572bbe, 0x018b9933, 0x0017c232, 0x000a3c76}}, Y: Field{[10]uint32{0x01e2cb7e, 0x00a6d20e, 0x01cb0970, 0x022f5079, 0x008f5dfe, 0x01f20d6b, 0x02e0e896, 0x00f690b6, 0x0061987e, 0x000093d6}}}, + {X: Field{[10]uint32{0x00294289, 0x03384d51, 0x001e25f8, 0x021e6b59, 0x03e0779b, 0x002040b7, 0x0331155c, 0x02dfee3a, 0x03836e8f, 0x003df13b}}, Y: Field{[10]uint32{0x036bce2c, 0x026593c7, 0x020d1362, 0x008da55e, 0x0216470d, 0x01bae5a0, 0x0150f091, 0x02588758, 0x0381db33, 0x0001fe69}}}, + {X: Field{[10]uint32{0x0228b3e6, 0x02a3d986, 0x03aeda8d, 0x0061444b, 0x00ddc8d0, 0x0169cd75, 0x0366f7e2, 0x026cd462, 0x025e1ddc, 0x003c7d6b}}, Y: Field{[10]uint32{0x01ad4288, 0x036777ee, 0x03cb41c6, 0x0218fb6d, 0x035c5c34, 0x013f9ea3, 0x024a8df2, 0x01360142, 0x012c9792, 0x00276ffc}}}, + {X: Field{[10]uint32{0x008b654f, 0x03ef5cc0, 0x0027dc2a, 0x0287ad96, 0x01257c10, 0x015e2d8e, 0x020dbc74, 0x033a7072, 0x0173d170, 0x00257e0c}}, Y: Field{[10]uint32{0x03412487, 0x03472f00, 0x035b8b75, 0x00edefb8, 0x017d5ab8, 0x01a4628c, 0x03c3c91c, 0x012a2104, 0x02bc0829, 0x0018ea0f}}}, + {X: Field{[10]uint32{0x023ff750, 0x020f025a, 0x03a7df8c, 0x00d646f8, 0x03964749, 0x01f58154, 0x008c8e37, 0x017847ae, 0x025c9f09, 0x003d2b69}}, Y: Field{[10]uint32{0x01861ed3, 0x0146972b, 0x0178d3ac, 0x01d86c37, 0x012ede16, 0x036f3129, 0x00bc87c3, 0x0116cb9b, 0x0328a385, 0x0039da0f}}}, + {X: Field{[10]uint32{0x019e5fd2, 0x039eb90a, 0x00fd03af, 0x015b64e5, 0x0040b827, 0x0371ef09, 0x03bcd591, 0x036cec6d, 0x0096f714, 0x00106beb}}, Y: Field{[10]uint32{0x0099fedc, 0x03a691c1, 0x02f20474, 0x0001769e, 0x0061c52d, 0x03195291, 0x02e98aea, 0x03fc4909, 0x006a3292, 0x00270ba7}}}, + {X: Field{[10]uint32{0x00487405, 0x02a85bba, 0x03ffd0cc, 0x03f710bc, 0x01e1b8df, 0x0328d7c3, 0x0141fe9c, 0x00726d86, 0x031b2cb8, 0x000dfcc2}}, Y: Field{[10]uint32{0x00b88a0f, 0x00755363, 0x022bb61b, 0x00f29326, 0x018086bb, 0x0021ad92, 0x03dd08e1, 0x00754767, 0x0285e340, 0x0024afde}}}, + {X: Field{[10]uint32{0x004fb3ce, 0x0181c596, 0x0205b9d7, 0x02651530, 0x03605a21, 0x0338323a, 0x01312022, 0x01faa885, 0x0166646e, 0x000bd5dc}}, Y: Field{[10]uint32{0x03d5f446, 0x019f7fc0, 0x00ee0985, 0x036bb589, 0x01af32e8, 0x03412e5a, 0x020dc684, 0x033ab56b, 0x026fe43d, 0x003c35cc}}}, + {X: Field{[10]uint32{0x00b5150a, 0x01f96e99, 0x03e7dfd5, 0x03fc2fe7, 0x003c2e24, 0x02bff6fe, 0x03a0af94, 0x0144ad7a, 0x038092c5, 0x0022aef1}}, Y: Field{[10]uint32{0x02896b75, 0x0059f5fd, 0x0232791a, 0x03b12454, 0x010bb87d, 0x03fb33db, 0x015b974f, 0x03066a92, 0x018f0c2e, 0x00163d66}}}, + {X: Field{[10]uint32{0x0147571c, 0x03741970, 0x00aed219, 0x03d70a04, 0x00f6da7c, 0x01f95f3f, 0x0073fe40, 0x01dacc9f, 0x028fa013, 0x003906b3}}, Y: Field{[10]uint32{0x036844a2, 0x02a52fdd, 0x027a37d8, 0x01146584, 0x01715d45, 0x01cbe639, 0x02d04592, 0x01c530c8, 0x02da3c2a, 0x002d642a}}}, + {X: Field{[10]uint32{0x010f1d88, 0x00533662, 0x03b5abe7, 0x03f2767a, 0x017c0c84, 0x00491e27, 0x0180f7f4, 0x0157bb77, 0x00778b63, 0x000c0326}}, Y: Field{[10]uint32{0x039c9002, 0x017a4ef8, 0x0138520f, 0x01b20d37, 0x0068c507, 0x03869ee0, 0x00f5c7a4, 0x021cc432, 0x0262c571, 0x0036b0ae}}}, + {X: Field{[10]uint32{0x02e24c61, 0x0205c1c4, 0x01b5c876, 0x008c9b28, 0x03dcdb66, 0x01e1db0f, 0x02072c1f, 0x003e1096, 0x01d219d4, 0x001a78ce}}, Y: Field{[10]uint32{0x00babc50, 0x002e1b4e, 0x005a1bad, 0x02024dd0, 0x014cd472, 0x02d4d648, 0x017e8499, 0x011c0085, 0x015059a4, 0x002350e4}}}, + {X: Field{[10]uint32{0x03bdb909, 0x03752132, 0x0346da2f, 0x027d47f1, 0x00cddd77, 0x007eaded, 0x033ccf64, 0x02a67e2a, 0x03df8e47, 0x00395924}}, Y: Field{[10]uint32{0x03f5ee59, 0x012728f8, 0x01145b6e, 0x0275d630, 0x01974531, 0x0107062d, 0x0006036d, 0x0053fb42, 0x020a559e, 0x001a36e8}}}, + {X: Field{[10]uint32{0x03f50587, 0x0134e379, 0x01c611a3, 0x03795d36, 0x00f76532, 0x01b803ac, 0x01c11e58, 0x0144734e, 0x00578998, 0x000dea47}}, Y: Field{[10]uint32{0x03145f18, 0x007710ec, 0x0381ee5d, 0x0042ae74, 0x01feac27, 0x00276a25, 0x01975dc0, 0x022891cd, 0x00af0d2d, 0x0038e862}}}, + {X: Field{[10]uint32{0x02e88c1f, 0x0149d0b7, 0x0124a86c, 0x01bd9793, 0x02622401, 0x02535e0e, 0x00629c71, 0x018b844b, 0x01fb5cc2, 0x00317c16}}, Y: Field{[10]uint32{0x038c890a, 0x0155e3ec, 0x00623ab1, 0x00147be8, 0x018c0907, 0x0242d1b5, 0x037792d5, 0x02a56945, 0x03521a96, 0x0007216f}}}, + {X: Field{[10]uint32{0x038716a1, 0x01e24926, 0x01827626, 0x018fca11, 0x03c6323c, 0x021006b3, 0x018c59d7, 0x033ac68a, 0x02ccd605, 0x00159bb7}}, Y: Field{[10]uint32{0x0244cc90, 0x0018b516, 0x010a15ad, 0x02bf0080, 0x038c40b3, 0x00b4ccbf, 0x01f85b93, 0x01bc81e2, 0x03735adf, 0x003b8344}}}, + {X: Field{[10]uint32{0x032c7c7b, 0x027337b6, 0x034c8db6, 0x038b0fae, 0x023e6cf4, 0x0332d190, 0x012e33db, 0x013e1c01, 0x0033c6ef, 0x000c9f9c}}, Y: Field{[10]uint32{0x03e8db36, 0x0385ba54, 0x012634aa, 0x00e7def6, 0x00122662, 0x0026bac7, 0x023e2667, 0x03ca6d2a, 0x012b2be0, 0x003f1242}}}, + {X: Field{[10]uint32{0x03778024, 0x039c0265, 0x01e1a1ea, 0x038a317d, 0x0284ef5a, 0x029b2bfd, 0x0329704e, 0x02b21957, 0x03693ac0, 0x0026269f}}, Y: Field{[10]uint32{0x00dadfd0, 0x01ed90a0, 0x0292bd1b, 0x035cec2c, 0x00e8eb1f, 0x02b3fa99, 0x03b5bd44, 0x011639d2, 0x027b3396, 0x0015cf44}}}, + {X: Field{[10]uint32{0x0330fc94, 0x00b31842, 0x019769c2, 0x03e92999, 0x037ce313, 0x013d2695, 0x01cec4b7, 0x01fd53b4, 0x032f14f2, 0x002729d9}}, Y: Field{[10]uint32{0x0104e4a1, 0x01b283ce, 0x011dcd2d, 0x0013bbb0, 0x006ab141, 0x00b7e34c, 0x0003f818, 0x00a928c2, 0x00d731d5, 0x003e4831}}}, + {X: Field{[10]uint32{0x0047f5f5, 0x0155579e, 0x030cde1d, 0x0143b4bb, 0x02060978, 0x01f89c86, 0x00316871, 0x03a38656, 0x0245654f, 0x0036c401}}, Y: Field{[10]uint32{0x01056567, 0x02064a0c, 0x0014c962, 0x033b9d14, 0x02619287, 0x03ddb22d, 0x03cdf895, 0x003b3cd3, 0x02cea9c9, 0x000acb0f}}}, + {X: Field{[10]uint32{0x013295a9, 0x01340335, 0x01c07bb9, 0x03e9949a, 0x02418a34, 0x00effc53, 0x02110a8f, 0x00ed0979, 0x009e8274, 0x00138a83}}, Y: Field{[10]uint32{0x00ccca7a, 0x02cb138f, 0x014b3d98, 0x03b237e8, 0x008a34e5, 0x028eb1a7, 0x00b90590, 0x02c12dad, 0x02e3e00b, 0x00144ab0}}}, + {X: Field{[10]uint32{0x02ac77f6, 0x010d4bd9, 0x0368d733, 0x01dca50e, 0x0060c71a, 0x0217ec73, 0x0136f981, 0x022b2c14, 0x037024ea, 0x00304acf}}, Y: Field{[10]uint32{0x02544803, 0x01ef77c0, 0x033239c0, 0x02560cc9, 0x020d67a1, 0x03ef8949, 0x009f5a7b, 0x01dbc07c, 0x019b6f4b, 0x002de67e}}}, + {X: Field{[10]uint32{0x03fd7e58, 0x01551923, 0x003feaa7, 0x020afe9e, 0x03d6c09b, 0x005904ff, 0x017c0cf6, 0x013877af, 0x022edaf3, 0x00019396}}, Y: Field{[10]uint32{0x002f4a50, 0x0147cd0f, 0x004ff726, 0x0292d461, 0x027509a2, 0x037c249b, 0x005d611a, 0x00cb8ba4, 0x020966f0, 0x00038083}}}, + {X: Field{[10]uint32{0x030a838a, 0x0102254f, 0x03b9fef0, 0x015cb3ec, 0x013d66ec, 0x000fc0b7, 0x02d1857e, 0x010e03da, 0x0355fa73, 0x000ac2e2}}, Y: Field{[10]uint32{0x0273a61a, 0x02404f67, 0x024765bd, 0x0070d023, 0x00147ce0, 0x00722029, 0x00b45bae, 0x01965e38, 0x0251a914, 0x002b225c}}}, + {X: Field{[10]uint32{0x0288525e, 0x01e24c0a, 0x00c5bd67, 0x02d07bf5, 0x016523e8, 0x0196a59e, 0x02545299, 0x0184cf4e, 0x0130a202, 0x002b838f}}, Y: Field{[10]uint32{0x00f80552, 0x0177ed4e, 0x03ee97ec, 0x01f7687b, 0x00c80c08, 0x00e6ac98, 0x00be67b3, 0x00b49094, 0x00ff8563, 0x003eda46}}}, + {X: Field{[10]uint32{0x03e00dd9, 0x037a18a3, 0x03454a83, 0x00c3b7c8, 0x033bfa15, 0x0007d130, 0x02e46cb0, 0x02859bfe, 0x03114dfe, 0x000bfe71}}, Y: Field{[10]uint32{0x03318783, 0x03a0b11b, 0x027599b5, 0x001ef483, 0x01acb0d7, 0x02065717, 0x02383517, 0x00605e8f, 0x027a0444, 0x00014fd9}}}, + {X: Field{[10]uint32{0x027bf695, 0x02c45a93, 0x017263ed, 0x0393067d, 0x019e2614, 0x010ac512, 0x003f60cc, 0x01671b01, 0x001488b9, 0x0033009c}}, Y: Field{[10]uint32{0x03b6007a, 0x00b99296, 0x01fe2e57, 0x017080db, 0x0307b532, 0x012697c1, 0x02ce6551, 0x03d9dd99, 0x01909b22, 0x003aacfd}}}, + {X: Field{[10]uint32{0x00a945d5, 0x01a2fa0a, 0x0145584d, 0x016bc067, 0x03f9dbf4, 0x02125749, 0x03e3b476, 0x00d6997b, 0x03d13c80, 0x0006007b}}, Y: Field{[10]uint32{0x0259c4fe, 0x02f686fe, 0x005681ac, 0x02f382da, 0x03f44a5a, 0x026a0be2, 0x02f49d50, 0x025a3bd3, 0x019efcb5, 0x0037fcb4}}}, + {X: Field{[10]uint32{0x00dd7cbf, 0x02de3f0f, 0x03f8be6a, 0x038db9d1, 0x015b698f, 0x031eaeaf, 0x03c09de4, 0x002588d5, 0x01d507b6, 0x001b68aa}}, Y: Field{[10]uint32{0x0275060c, 0x016f7338, 0x00378d50, 0x020a66b3, 0x0171310b, 0x00df02bc, 0x01ac9f9b, 0x022b88a5, 0x02704aeb, 0x000789d3}}}, + {X: Field{[10]uint32{0x02fc82e4, 0x02846b6e, 0x0344c832, 0x00e86a67, 0x00c7dfe2, 0x02a513fc, 0x039e8a6e, 0x005774ef, 0x016f6a92, 0x001fa3f2}}, Y: Field{[10]uint32{0x01342bff, 0x021cb8ec, 0x02d51ddc, 0x000ea023, 0x0257d095, 0x018fce21, 0x039ed00c, 0x01b29fdc, 0x03e1e0c2, 0x003a693e}}}, + {X: Field{[10]uint32{0x020caf64, 0x02ed121f, 0x00f27559, 0x00cdc633, 0x019f53e1, 0x021c1d90, 0x0266ab37, 0x035bdff8, 0x033a77d6, 0x00298d8b}}, Y: Field{[10]uint32{0x02cc787e, 0x02135874, 0x00d70087, 0x00e7d1cf, 0x03e29d85, 0x019bdd46, 0x025cd860, 0x00e17182, 0x02da3fc2, 0x00300588}}}, + {X: Field{[10]uint32{0x0337d2b3, 0x01c01d66, 0x01557449, 0x0154df09, 0x018582bd, 0x001db06a, 0x01a19b47, 0x01d24e8f, 0x022228b4, 0x00146194}}, Y: Field{[10]uint32{0x00287be1, 0x02bef411, 0x01ad17d0, 0x02e14914, 0x02826558, 0x01032e33, 0x03ca65bf, 0x0236764f, 0x01796863, 0x003c3c2e}}}, + {X: Field{[10]uint32{0x01d472ce, 0x02f0f460, 0x028e67e8, 0x004a7a3b, 0x0304d802, 0x01c6656a, 0x0314ff4f, 0x02e70e31, 0x009ba9f1, 0x0028a824}}, Y: Field{[10]uint32{0x0040068d, 0x03d717bb, 0x01a6a1e8, 0x007b3649, 0x028b364d, 0x03114ce4, 0x03fdf98e, 0x031efdc6, 0x000bd45e, 0x001048e4}}}, + {X: Field{[10]uint32{0x003aef2d, 0x00c7e1ee, 0x009212b0, 0x03abe7c3, 0x02f1357b, 0x006fe5e7, 0x03f5ac2a, 0x01fcda98, 0x0122454e, 0x00369460}}, Y: Field{[10]uint32{0x006da722, 0x0363cdda, 0x00b32b6b, 0x03e2e683, 0x016cb7f3, 0x02e7762e, 0x0028c5e1, 0x017a0032, 0x02fd0d41, 0x002fe1df}}}, + {X: Field{[10]uint32{0x0147a87d, 0x035d418e, 0x0382e6cb, 0x001b520f, 0x008a6983, 0x004316a9, 0x01aa5729, 0x00c49796, 0x00541a98, 0x00107103}}, Y: Field{[10]uint32{0x03bfc57f, 0x01bc4068, 0x00c814e8, 0x00cf0c3d, 0x03ef8400, 0x03ef7d79, 0x029f129f, 0x02442aee, 0x03656b89, 0x001db6ae}}}, + {X: Field{[10]uint32{0x02addbfd, 0x00267326, 0x01318709, 0x01322290, 0x0028745e, 0x03314362, 0x007c980a, 0x039191a1, 0x028387f2, 0x003127f7}}, Y: Field{[10]uint32{0x027227e1, 0x01231fab, 0x03a94bbb, 0x03b99847, 0x00c7ddb4, 0x00a2f9fe, 0x00baf9e6, 0x01ef4de7, 0x0112dfd0, 0x002996f1}}}, + {X: Field{[10]uint32{0x020fceae, 0x03c060c3, 0x010717a1, 0x0223a314, 0x023a6c6b, 0x035edd09, 0x03219406, 0x01d0f537, 0x0161b6ee, 0x00216c5f}}, Y: Field{[10]uint32{0x01868fef, 0x00c24b95, 0x02be892d, 0x00f9c13d, 0x03ebddc5, 0x03d2ffee, 0x006ce022, 0x007fad41, 0x00a274c7, 0x0008ae7a}}}, + {X: Field{[10]uint32{0x0117964f, 0x03d7153c, 0x0243e883, 0x030b2353, 0x023914af, 0x00158e7b, 0x03521895, 0x01dfc4f9, 0x037fe6d6, 0x00323874}}, Y: Field{[10]uint32{0x01bfc21e, 0x02b56ace, 0x008e4f88, 0x02d0daad, 0x03ee4a7a, 0x007e6525, 0x006ba559, 0x016a46bd, 0x0118d08f, 0x002c32b3}}}, + {X: Field{[10]uint32{0x0083836b, 0x001e29f9, 0x02dd9866, 0x02802e5e, 0x011a30ba, 0x00c44a65, 0x03d6f833, 0x02223169, 0x00307d25, 0x0037fb00}}, Y: Field{[10]uint32{0x02faa00d, 0x004ea42e, 0x0380956e, 0x002dbee5, 0x00f407ca, 0x00abe391, 0x00664168, 0x02511fbd, 0x0206bf2e, 0x001396a2}}}, + {X: Field{[10]uint32{0x030be9d6, 0x02535fdf, 0x00b20925, 0x01b97d35, 0x02c842ff, 0x0274c1db, 0x017618dc, 0x03631bbb, 0x00387c18, 0x003ab1b1}}, Y: Field{[10]uint32{0x0265b8d1, 0x008e9ac8, 0x021634e8, 0x019f5cd2, 0x0177a86a, 0x003fbaef, 0x031802ac, 0x006e0ae9, 0x03bffc0c, 0x000675a6}}}, + {X: Field{[10]uint32{0x03424cde, 0x0108046c, 0x019b74d6, 0x005672f2, 0x0069432c, 0x01fdab20, 0x0024db79, 0x0377b292, 0x004e04dc, 0x0027fce3}}, Y: Field{[10]uint32{0x01619ebc, 0x018886d4, 0x014f91d2, 0x0106e53d, 0x01266bd0, 0x033212e0, 0x005b0c93, 0x02effb7d, 0x0260b7c1, 0x003dcbe9}}}, + {X: Field{[10]uint32{0x01313f36, 0x03f19129, 0x02c1c146, 0x0277512c, 0x019153f6, 0x03f8a155, 0x01e4f8c4, 0x00ca4d7e, 0x013f3a5a, 0x00179e16}}, Y: Field{[10]uint32{0x02fd9c47, 0x02a6e6a2, 0x0114b89d, 0x02986cb4, 0x0358cbc5, 0x01758f25, 0x0195b700, 0x02f746cb, 0x0044dc63, 0x00276756}}}, + {X: Field{[10]uint32{0x01009ae4, 0x0321511c, 0x01b32d22, 0x0121debe, 0x020ad31a, 0x00f88870, 0x01ba38b0, 0x012dbec0, 0x03a48928, 0x002841f1}}, Y: Field{[10]uint32{0x03d9f6b5, 0x030da689, 0x014c4a0f, 0x002f1457, 0x03653b58, 0x0303e7ca, 0x0386cd5b, 0x019647b8, 0x02d46be4, 0x0001981c}}}, + {X: Field{[10]uint32{0x01b02af1, 0x03397e90, 0x028f4190, 0x023b308e, 0x02ff98e8, 0x01e4a65d, 0x02445ba6, 0x026117f8, 0x01d0308d, 0x0000907c}}, Y: Field{[10]uint32{0x03e194a9, 0x02dfaa29, 0x01c74366, 0x03bb16b2, 0x0209c881, 0x02be474c, 0x015723ad, 0x02a237e8, 0x03ecd413, 0x002219a5}}}, + {X: Field{[10]uint32{0x008a72fa, 0x02431af9, 0x01283c87, 0x005a2e6a, 0x02341860, 0x03ab0ed0, 0x015c6d26, 0x0241ba0f, 0x00d2627f, 0x000c67ba}}, Y: Field{[10]uint32{0x029eaa57, 0x033109cf, 0x032819d0, 0x014c197e, 0x01760344, 0x032d1631, 0x009f8491, 0x005b80d0, 0x02eda678, 0x00167925}}}, + {X: Field{[10]uint32{0x03ca4822, 0x0051896f, 0x038e1a26, 0x019864a1, 0x01e01008, 0x01a615d6, 0x03f4f7e9, 0x03e6f64d, 0x011a00fd, 0x000619a0}}, Y: Field{[10]uint32{0x01b7ae19, 0x01449a75, 0x0250172e, 0x00646990, 0x00585f03, 0x02d97e9f, 0x003a1316, 0x0272209e, 0x0065e85f, 0x00085781}}}, + {X: Field{[10]uint32{0x03992f26, 0x00bdda54, 0x00ce69ff, 0x016bdce5, 0x01398967, 0x033d9026, 0x03429fb8, 0x02400176, 0x02d70b94, 0x001fbfef}}, Y: Field{[10]uint32{0x00c7c749, 0x0026b210, 0x02aa7a1d, 0x01ab1b34, 0x03616d8b, 0x02fcb702, 0x016affac, 0x01b52d49, 0x01ba28f2, 0x001bbeed}}}, + {X: Field{[10]uint32{0x03168867, 0x0293494a, 0x00bf0957, 0x0199c3c5, 0x02665c8d, 0x00de54ac, 0x02e45c19, 0x0057c87f, 0x03d0e593, 0x003631ca}}, Y: Field{[10]uint32{0x0256fbcd, 0x011b186f, 0x02e6e5a9, 0x006cb266, 0x028a2da3, 0x01cff182, 0x01e2cc3a, 0x0029bf44, 0x0162fdd4, 0x0019300b}}}, + {X: Field{[10]uint32{0x00d0db4b, 0x0060c206, 0x0147abcf, 0x0147ead3, 0x0187bbfd, 0x002c35a4, 0x0396bbcb, 0x03ce050e, 0x0222ce64, 0x001c43b1}}, Y: Field{[10]uint32{0x0134d994, 0x00cc5391, 0x030c5496, 0x00dafaae, 0x013d275c, 0x0243d4c7, 0x029b9618, 0x00ebc30b, 0x0086526c, 0x003b7f44}}}, + {X: Field{[10]uint32{0x00d51ca6, 0x0131654c, 0x0334868e, 0x009e7930, 0x0370574f, 0x02021b76, 0x0168e763, 0x03b75270, 0x024b9aea, 0x002509e5}}, Y: Field{[10]uint32{0x004e2dd8, 0x00298457, 0x017af730, 0x03a9a131, 0x01e0026b, 0x00a160f6, 0x03b312e9, 0x00019fac, 0x01cf2a6b, 0x000442d0}}}, + {X: Field{[10]uint32{0x0355565f, 0x0166ce63, 0x00a5c46a, 0x00597aa9, 0x01c5a2e8, 0x036d8859, 0x03515c06, 0x03b6727a, 0x0035a8b3, 0x002bbde5}}, Y: Field{[10]uint32{0x0184b91d, 0x02c5e915, 0x012a0118, 0x0044f0d5, 0x03036535, 0x0250aaac, 0x00cb93d8, 0x03109714, 0x00f21274, 0x001985ba}}}, + {X: Field{[10]uint32{0x0074b5a3, 0x0319fccc, 0x03994a4a, 0x0339296b, 0x020f49f0, 0x0275cbc9, 0x03401935, 0x0018e9a3, 0x00323546, 0x000faf76}}, Y: Field{[10]uint32{0x00460238, 0x0254019e, 0x019beed8, 0x03cb238b, 0x02db7962, 0x00e575c4, 0x02ba318f, 0x0127bb43, 0x03d4b295, 0x000048d9}}}, + {X: Field{[10]uint32{0x026aeff2, 0x02d01790, 0x020dd729, 0x03894d35, 0x0019af86, 0x019cf212, 0x03c6bc3b, 0x0021c742, 0x025ec52b, 0x0028e367}}, Y: Field{[10]uint32{0x032cad02, 0x031d7a7c, 0x02a1cb01, 0x00a22b0d, 0x01f6d134, 0x03237935, 0x00955383, 0x01b1744e, 0x0371d9ae, 0x003af919}}}, + {X: Field{[10]uint32{0x00a7d624, 0x03b0d092, 0x01b0f9f4, 0x02845a40, 0x02334369, 0x0114b2e3, 0x00407f7b, 0x02ec6643, 0x0382619c, 0x0039f4a7}}, Y: Field{[10]uint32{0x03c4e614, 0x03b16d67, 0x02e0742b, 0x0052aa3b, 0x0315b6ce, 0x0175d85b, 0x00ce2304, 0x014581ae, 0x02d4618b, 0x001d6573}}}, + {X: Field{[10]uint32{0x0043ceae, 0x033bf3d0, 0x004edf81, 0x01738fa3, 0x007523de, 0x00063c03, 0x02333e26, 0x009ee52b, 0x02b02792, 0x003b21a7}}, Y: Field{[10]uint32{0x011ac92b, 0x02e9f71c, 0x01556ec6, 0x01dd9040, 0x03ca3fe5, 0x0399f60a, 0x00bdd264, 0x03210692, 0x02552c89, 0x0029086a}}}, + {X: Field{[10]uint32{0x02ec5e71, 0x003fcd71, 0x03ae7c07, 0x00f3809b, 0x026f0752, 0x01128d4a, 0x005c0571, 0x02322dbf, 0x0108e44a, 0x00115276}}, Y: Field{[10]uint32{0x02b5dd7a, 0x0044e2de, 0x0240f44c, 0x000069b5, 0x0164b486, 0x00b2371e, 0x0208c19e, 0x01f81040, 0x03200770, 0x001c7638}}}, + {X: Field{[10]uint32{0x01b070b2, 0x00512c29, 0x0385ff98, 0x00f4596c, 0x032cc7a5, 0x038501ac, 0x024f3813, 0x02e326c2, 0x029efef7, 0x00146edb}}, Y: Field{[10]uint32{0x0067044e, 0x0255ad69, 0x03befde5, 0x0372ab7c, 0x015268ee, 0x011b7df3, 0x031de11d, 0x013f4228, 0x03e9dd79, 0x00194a0a}}}, + {X: Field{[10]uint32{0x016d001f, 0x00fae81a, 0x013e45a8, 0x03536458, 0x02aa2027, 0x01239897, 0x0203afcd, 0x02aa0910, 0x02974c7c, 0x001f370c}}, Y: Field{[10]uint32{0x03519565, 0x014d2420, 0x00a36192, 0x0045b0b3, 0x026060a4, 0x00a27968, 0x00027a7a, 0x0156cede, 0x01433b1a, 0x002e4ae6}}}, + {X: Field{[10]uint32{0x009c9314, 0x02655d58, 0x02fc9030, 0x02e84051, 0x02aa478f, 0x0205e9af, 0x03722f6d, 0x0226da99, 0x02beb8e9, 0x000f2a71}}, Y: Field{[10]uint32{0x02ca2c0f, 0x01fc25b3, 0x00e4d6bb, 0x036af452, 0x0074c6e0, 0x0049328c, 0x006bba34, 0x006f0e0e, 0x017ff4b8, 0x001540bb}}}, + {X: Field{[10]uint32{0x01354d0c, 0x00447a2b, 0x00436864, 0x00a73248, 0x0390e1a2, 0x023b5798, 0x01bc1c83, 0x032b6bc0, 0x026c45ed, 0x002a8aaf}}, Y: Field{[10]uint32{0x0024f6cd, 0x03727cbe, 0x00d47c44, 0x02a21c55, 0x0295bb3d, 0x006e8ac9, 0x0061251f, 0x00c12893, 0x01c66f91, 0x0006e08a}}}, + {X: Field{[10]uint32{0x023bc7ee, 0x01a4db63, 0x0375a2ab, 0x02b7ef9b, 0x0375466a, 0x03dced83, 0x01f226de, 0x027564c6, 0x023df28c, 0x002d4b2b}}, Y: Field{[10]uint32{0x03cfe220, 0x00b6e222, 0x03a3a446, 0x0164b85f, 0x02421e07, 0x029f2562, 0x00738488, 0x00247732, 0x035e022c, 0x003afb9c}}}, + {X: Field{[10]uint32{0x0021ef54, 0x036414ce, 0x01661838, 0x030d1ed9, 0x01635469, 0x00d2585a, 0x01a62832, 0x0372d84f, 0x030362a6, 0x00304215}}, Y: Field{[10]uint32{0x00eaf517, 0x033e6cd3, 0x01cdec38, 0x03760ade, 0x0044511c, 0x002b531f, 0x002cac14, 0x02a3acb7, 0x02c8c1e6, 0x003f9910}}}, + {X: Field{[10]uint32{0x0308c11d, 0x00e5976b, 0x00768d5a, 0x0334be9b, 0x0383477f, 0x01908a41, 0x01454765, 0x0049fd67, 0x011cfcaf, 0x003c27a7}}, Y: Field{[10]uint32{0x03c15d10, 0x03e593a2, 0x009a27e8, 0x018f3fb3, 0x01a5b2e6, 0x0175fbf6, 0x0028fc9c, 0x03ec56fd, 0x03221f44, 0x0003c069}}}, + {X: Field{[10]uint32{0x015c4527, 0x0309dfd2, 0x0341a036, 0x017f80f4, 0x03fd3e80, 0x035c6d65, 0x00b3b179, 0x00fafb62, 0x02ef1e47, 0x00180918}}, Y: Field{[10]uint32{0x03a079c3, 0x0387db58, 0x02ce2844, 0x02c7ae74, 0x02fed2a9, 0x00fc8567, 0x02d9f235, 0x00773aaa, 0x00617141, 0x003e476d}}}, + {X: Field{[10]uint32{0x01bb582d, 0x0065ff82, 0x03c70720, 0x004c25ae, 0x016b828d, 0x0049a883, 0x00ae3558, 0x0267e841, 0x001e8e0d, 0x0009cea2}}, Y: Field{[10]uint32{0x004b0d5d, 0x00d2869a, 0x003da295, 0x01d5e68b, 0x00d1b407, 0x03ddadb0, 0x03b2f727, 0x02e45334, 0x005814a7, 0x0016ec9b}}}, + {X: Field{[10]uint32{0x000cd54d, 0x03237cba, 0x03d9f566, 0x00107691, 0x01e8cd05, 0x01bf263e, 0x02f41723, 0x032dcad0, 0x03460616, 0x001f077c}}, Y: Field{[10]uint32{0x03c41dd7, 0x02b58c13, 0x033b9390, 0x00bb059d, 0x0073153c, 0x02f04956, 0x03a8d456, 0x02e6f916, 0x020dd602, 0x002b4f9f}}}, + {X: Field{[10]uint32{0x01942f94, 0x0319544f, 0x006d3c62, 0x02c14e5e, 0x039ad644, 0x033a002d, 0x014551f3, 0x03c451ce, 0x0234657f, 0x001e5b89}}, Y: Field{[10]uint32{0x014f1c60, 0x0331f0a8, 0x01b11bb1, 0x01aa1003, 0x001e8ec6, 0x00c02069, 0x0080eb9c, 0x01c44431, 0x0238ed58, 0x002d96ef}}}, + {X: Field{[10]uint32{0x02302bd1, 0x02f7b586, 0x00206193, 0x016d80bf, 0x0062b056, 0x029990b2, 0x029953a2, 0x03da2a91, 0x01fa9985, 0x001789d8}}, Y: Field{[10]uint32{0x0253e274, 0x036eb15c, 0x030b4713, 0x036adf50, 0x003715c9, 0x0144d9f4, 0x0347c070, 0x013d740b, 0x03709db2, 0x0016e826}}}, + {X: Field{[10]uint32{0x03abe794, 0x0049b153, 0x010e6164, 0x008a636e, 0x005c004c, 0x02891ad0, 0x01ab0385, 0x00683fac, 0x0092fd34, 0x00119163}}, Y: Field{[10]uint32{0x03446725, 0x028f7635, 0x033eaf02, 0x02bbbb3c, 0x029d018f, 0x018fc729, 0x02fc3242, 0x0106e162, 0x028b3453, 0x00021675}}}, + {X: Field{[10]uint32{0x01153265, 0x00de6960, 0x0152c5c7, 0x00d32fee, 0x00a410e1, 0x01bd3989, 0x009ddc3d, 0x01f073ff, 0x0030bf81, 0x003f1206}}, Y: Field{[10]uint32{0x01322551, 0x0289e1d6, 0x02169a43, 0x017eb3a3, 0x038dfe38, 0x03676d2a, 0x0248e89f, 0x01f68512, 0x0228bd3d, 0x0028622c}}}, + {X: Field{[10]uint32{0x02ed03e6, 0x00984357, 0x01901779, 0x019a012b, 0x033a7804, 0x038abb6f, 0x0302742c, 0x029540f1, 0x027d9771, 0x0010b65d}}, Y: Field{[10]uint32{0x02d50417, 0x03a87096, 0x003ece89, 0x01a34376, 0x03d2e0f5, 0x000b490c, 0x02c782be, 0x03ccdce8, 0x032e9764, 0x0037da50}}}, + {X: Field{[10]uint32{0x01477148, 0x00bd386e, 0x004dcdc7, 0x03f74a38, 0x02462dee, 0x0057b644, 0x02602226, 0x02ca5dcb, 0x0049993a, 0x000dc48b}}, Y: Field{[10]uint32{0x0196e39d, 0x00e08316, 0x0008ef1d, 0x037a9549, 0x02410b3e, 0x01900ae3, 0x00422cc3, 0x03ef0ea8, 0x00f0924c, 0x00189ffd}}}, + {X: Field{[10]uint32{0x006896c3, 0x003a8697, 0x00bb7314, 0x015e972e, 0x013619a5, 0x01db87ab, 0x03e52cca, 0x03f2f9d0, 0x018294ba, 0x00271520}}, Y: Field{[10]uint32{0x038f7fcc, 0x00efc16c, 0x014c50b5, 0x02cc8252, 0x02ec0478, 0x01c14130, 0x031dafbf, 0x0214a3b1, 0x032eb88e, 0x0017f311}}}, + {X: Field{[10]uint32{0x025a2db9, 0x01a6e03d, 0x02a077ae, 0x01ff58fc, 0x000a5927, 0x01c48d82, 0x004e0251, 0x007da5d7, 0x02d7aa5b, 0x001ee75e}}, Y: Field{[10]uint32{0x017d1bf8, 0x03587f43, 0x0012fabf, 0x01729d5a, 0x02c4a7f1, 0x01453b2b, 0x01c14d6f, 0x0288a740, 0x02e8714a, 0x001b3787}}}, + {X: Field{[10]uint32{0x00a9a102, 0x00737a96, 0x0153e017, 0x0141b1df, 0x026990e9, 0x0107820b, 0x016d948e, 0x01582b59, 0x02f2c985, 0x002bd776}}, Y: Field{[10]uint32{0x00a5b505, 0x01607e7b, 0x003f5fd4, 0x0123bfe5, 0x011f6853, 0x03385ad6, 0x0039ff76, 0x01bfcf12, 0x011b7289, 0x0038d211}}}, + {X: Field{[10]uint32{0x0111293d, 0x03b2da48, 0x029a395b, 0x02d0538a, 0x01d26394, 0x03834559, 0x03ab3662, 0x02f46417, 0x0318e957, 0x0010999f}}, Y: Field{[10]uint32{0x02bbc7a5, 0x00083559, 0x022a2e57, 0x02c6bb2a, 0x033c0076, 0x03f895e5, 0x03fb16c1, 0x02ed8d39, 0x02b269e9, 0x000a2374}}}, + {X: Field{[10]uint32{0x00b276d7, 0x01506dd0, 0x03618587, 0x01857966, 0x029be971, 0x00c99973, 0x002a5a6f, 0x020c99d3, 0x021d50ab, 0x0017a71e}}, Y: Field{[10]uint32{0x03a11f17, 0x02115b57, 0x035b1a29, 0x0063b822, 0x02ec4664, 0x031c1d12, 0x0292c612, 0x02bd08d0, 0x00611f39, 0x00248a0d}}}, + {X: Field{[10]uint32{0x03ed8b2a, 0x0293ca37, 0x03c489a2, 0x001a2d1a, 0x038b52b5, 0x02cc82e5, 0x00d9ac97, 0x02d608ad, 0x03faf486, 0x00263183}}, Y: Field{[10]uint32{0x005280f9, 0x01eca6dd, 0x0132b580, 0x0212bb70, 0x0170416d, 0x001bb6f9, 0x02f42fa3, 0x01255604, 0x0113c253, 0x00287098}}}, + {X: Field{[10]uint32{0x0385babc, 0x01d66770, 0x0116cf0a, 0x007f6199, 0x03f30948, 0x00d43969, 0x0286e71f, 0x00b364f0, 0x01821ed5, 0x0024afea}}, Y: Field{[10]uint32{0x02c1ddb4, 0x02ba7b6c, 0x03cb802f, 0x024a545a, 0x036f5276, 0x037f893d, 0x0254e738, 0x02d2c6de, 0x0396c71a, 0x0028ff25}}}, + {X: Field{[10]uint32{0x025b865f, 0x025ce0be, 0x018c4ec1, 0x02e40eec, 0x037b7798, 0x000ac30d, 0x02413e84, 0x02d67eb3, 0x0008bd8e, 0x0026f89d}}, Y: Field{[10]uint32{0x027a2f61, 0x03a2ff69, 0x00027f54, 0x00a54093, 0x02def3ec, 0x02ee4b77, 0x02ed2c81, 0x01a8e5a3, 0x01801964, 0x00044215}}}, + {X: Field{[10]uint32{0x036350bc, 0x02e711a5, 0x018275b1, 0x01676e79, 0x037751bc, 0x0302462f, 0x0391ce38, 0x02c165ad, 0x026cb7ba, 0x0009f35a}}, Y: Field{[10]uint32{0x03faeda8, 0x03e03ba0, 0x00011a16, 0x01353fad, 0x032f41d0, 0x01a19479, 0x03761df0, 0x00ab17c4, 0x01678fce, 0x00224354}}}, + {X: Field{[10]uint32{0x0068f2eb, 0x022073bd, 0x00e1f5d8, 0x00f25bcc, 0x035f22be, 0x00319918, 0x00f6597a, 0x0184e532, 0x014daaf9, 0x003a25b8}}, Y: Field{[10]uint32{0x0196030b, 0x027cacec, 0x027260bb, 0x02136b74, 0x02efea7e, 0x03622eb2, 0x00d971af, 0x006ac771, 0x00b0512c, 0x002fac01}}}, + {X: Field{[10]uint32{0x013f8ec0, 0x030359f9, 0x033da54e, 0x0226142e, 0x03a9dd23, 0x03eacb03, 0x00b3779e, 0x0150058d, 0x0269ac48, 0x000938b4}}, Y: Field{[10]uint32{0x0219e525, 0x026a9600, 0x02460892, 0x016f907e, 0x03f5beda, 0x018e8168, 0x03ca2ca6, 0x0353080e, 0x02c2642b, 0x00379c0b}}}, + {X: Field{[10]uint32{0x001d1676, 0x0367025a, 0x03db95a9, 0x00077829, 0x009b5c4d, 0x02c48694, 0x010159b4, 0x03279175, 0x03c948c1, 0x0025e989}}, Y: Field{[10]uint32{0x033203d9, 0x01fba49b, 0x00b9ffef, 0x03e69f24, 0x018d5f3c, 0x03d75708, 0x02d43037, 0x0270a7f2, 0x015b5539, 0x00066f42}}}, + {X: Field{[10]uint32{0x0195b08f, 0x0354dc1c, 0x0014b40b, 0x01807e82, 0x0033ed67, 0x0274f214, 0x03234c7f, 0x03b17ddd, 0x0251e604, 0x0029c360}}, Y: Field{[10]uint32{0x00bccc4f, 0x009b542b, 0x01f4e0e1, 0x0225aa16, 0x0385325a, 0x031c4350, 0x012c016a, 0x00f78fc5, 0x010774e2, 0x0037ca36}}}, + {X: Field{[10]uint32{0x0242f42b, 0x023056be, 0x0012ea7c, 0x025cdbcd, 0x0327743a, 0x00f5e2c5, 0x001a0071, 0x0191cb38, 0x00434b27, 0x000b59db}}, Y: Field{[10]uint32{0x01fa7312, 0x03023ff2, 0x018ea024, 0x00f0ce52, 0x0052fa70, 0x0020ada1, 0x03b8f941, 0x0174c900, 0x01e406ef, 0x002f8a33}}}, + {X: Field{[10]uint32{0x00b29cf5, 0x0350ad00, 0x0172928f, 0x00a6d283, 0x0246c89d, 0x03c9f00d, 0x03857cfc, 0x01c9d576, 0x01e17516, 0x003d9b09}}, Y: Field{[10]uint32{0x03193201, 0x009b7a71, 0x01b6e059, 0x00c6eb5a, 0x028d2a02, 0x03670632, 0x0049150c, 0x02a21130, 0x02d422c4, 0x000fb88e}}}, + {X: Field{[10]uint32{0x02427060, 0x024f5f40, 0x01c6c293, 0x02b6393f, 0x01ce6e77, 0x013a3801, 0x004f81d2, 0x0361fbbd, 0x004b9d39, 0x0036e91f}}, Y: Field{[10]uint32{0x018d7622, 0x03b6eecf, 0x03597338, 0x022e7f3e, 0x015240f2, 0x0370ed71, 0x037eedd4, 0x00003c25, 0x0092e53d, 0x000b5719}}}, + {X: Field{[10]uint32{0x03e10f0f, 0x03e20549, 0x0301bbfd, 0x0197c20e, 0x0294788f, 0x024768ed, 0x015aedae, 0x01f71562, 0x01d94f62, 0x00285d80}}, Y: Field{[10]uint32{0x020a1183, 0x036100cd, 0x00890fa3, 0x016d178c, 0x020baded, 0x026416ce, 0x03025bd9, 0x006c56be, 0x03c8cfea, 0x001d0227}}}, + {X: Field{[10]uint32{0x0180e141, 0x03ce84d3, 0x003d5188, 0x030d53ae, 0x011c24c6, 0x03edeb23, 0x0261a125, 0x03fa41f8, 0x009fb84a, 0x00375c0c}}, Y: Field{[10]uint32{0x00bed563, 0x00d94d51, 0x018682a8, 0x019bd955, 0x024bdfd5, 0x03223777, 0x035b7862, 0x029dfe74, 0x02c0ac93, 0x000c8052}}}, + {X: Field{[10]uint32{0x03037afd, 0x015dda21, 0x003f783b, 0x024e4832, 0x03cadefb, 0x0131a8bc, 0x01253f00, 0x02ebe5c0, 0x003de746, 0x001e7f54}}, Y: Field{[10]uint32{0x00a61b93, 0x035a437b, 0x0317f1e0, 0x000023a2, 0x0286a4e6, 0x011e948f, 0x0220c266, 0x0024c4fe, 0x02586318, 0x000f172d}}}, + {X: Field{[10]uint32{0x020ff6a0, 0x00b048ae, 0x009566b9, 0x022a4d58, 0x021e7265, 0x01a8a692, 0x00eb8961, 0x0358ec7d, 0x037d77c7, 0x00346abc}}, Y: Field{[10]uint32{0x00a93bec, 0x004e514f, 0x0232ecfd, 0x0276766b, 0x00c7cac3, 0x03d0d6f7, 0x01f0e0bb, 0x02e81caf, 0x03ae5cfb, 0x00394d6d}}}, + {X: Field{[10]uint32{0x02d93c4f, 0x0149d5ea, 0x016445c7, 0x01635966, 0x01fe525d, 0x033690d1, 0x02b74fc2, 0x03652e6d, 0x0382b351, 0x001a3fc6}}, Y: Field{[10]uint32{0x0065a13c, 0x0063cead, 0x0192b798, 0x01d21460, 0x019186e3, 0x01764ef7, 0x02194aac, 0x02b02341, 0x02f1c422, 0x002aeec3}}}, + {X: Field{[10]uint32{0x0210552d, 0x00701665, 0x0224a5c4, 0x02898bb3, 0x0314393e, 0x01329921, 0x01b73bcf, 0x00f97417, 0x00971806, 0x00089e17}}, Y: Field{[10]uint32{0x021d8774, 0x00606aab, 0x018c4157, 0x0128972e, 0x021933e6, 0x029d735b, 0x005e75c8, 0x02a03093, 0x026ad7a7, 0x00270200}}}, + {X: Field{[10]uint32{0x035ffebf, 0x007c9113, 0x00580889, 0x018e9df6, 0x02e26780, 0x03f085d8, 0x00662583, 0x02dd5d7c, 0x01e7563f, 0x00189b2d}}, Y: Field{[10]uint32{0x028498b4, 0x01c32f19, 0x0211cce1, 0x0289598b, 0x01953a6d, 0x02a61470, 0x01161845, 0x030fc90d, 0x03f672c3, 0x00020da7}}}, + {X: Field{[10]uint32{0x00d12d2a, 0x01a3d6a0, 0x01ac55e6, 0x0392dbeb, 0x0061c8c4, 0x022293ca, 0x03fa430b, 0x01841603, 0x02f4d6f4, 0x002a67c3}}, Y: Field{[10]uint32{0x01053d06, 0x03fccfac, 0x00d3e28f, 0x012be0c1, 0x024e2f06, 0x02b8abbd, 0x0002c406, 0x00020dde, 0x032939db, 0x0025cab7}}}, + {X: Field{[10]uint32{0x03f02645, 0x00c77a71, 0x03e61019, 0x00f32acf, 0x03784afe, 0x03efa52a, 0x000a3fbd, 0x02cb6f2e, 0x02272ff0, 0x002c90f3}}, Y: Field{[10]uint32{0x020b7559, 0x0011238d, 0x03e9f41a, 0x0161188a, 0x023e85b8, 0x03a9460d, 0x0233df8f, 0x0320831c, 0x0119fbb8, 0x0036cbab}}}, + {X: Field{[10]uint32{0x0363deb3, 0x037d5c10, 0x022f3f8b, 0x019150c8, 0x0143efb2, 0x002877fd, 0x031b21a0, 0x02d8b1a9, 0x009d685c, 0x0031d38f}}, Y: Field{[10]uint32{0x01c4b2ec, 0x00d121bb, 0x03ed4387, 0x02d87a0c, 0x025cd550, 0x013bed86, 0x00358efc, 0x00f4168e, 0x0261fbf2, 0x00261f60}}}, + {X: Field{[10]uint32{0x01f71c47, 0x01bbc377, 0x03047888, 0x03090f70, 0x01d34710, 0x03025ba7, 0x00885f34, 0x01352f47, 0x00a7fc98, 0x003fcbd9}}, Y: Field{[10]uint32{0x006e906d, 0x006a16a8, 0x0249765e, 0x0035e17c, 0x0309eac6, 0x01a43035, 0x02c91257, 0x00bf7c7b, 0x0258fd5e, 0x00053018}}}, + {X: Field{[10]uint32{0x03712085, 0x0188506e, 0x01badec1, 0x0053da86, 0x026819b5, 0x0103dd0e, 0x02e8a8b1, 0x02ac934d, 0x00e13f4c, 0x001f64b1}}, Y: Field{[10]uint32{0x01b698c8, 0x01bd05a0, 0x033d1b72, 0x00839af8, 0x003e0dc9, 0x0369a1ae, 0x03193309, 0x035f4aa6, 0x03622ec7, 0x00181ad5}}}, + {X: Field{[10]uint32{0x03e13b6c, 0x03495183, 0x01518a0b, 0x0083fef3, 0x024ce0cc, 0x01e54580, 0x009487c7, 0x014a2627, 0x014d9ef4, 0x0000e90f}}, Y: Field{[10]uint32{0x01deb36e, 0x028ff036, 0x01912dfb, 0x02854d26, 0x00eedad2, 0x01ac49aa, 0x0228d61e, 0x024179ae, 0x03255768, 0x0017c934}}}, + {X: Field{[10]uint32{0x02a25f8f, 0x010a9b3b, 0x02308673, 0x0016cf19, 0x026e59fd, 0x01c74317, 0x00c67e73, 0x01793457, 0x03028010, 0x000239cb}}, Y: Field{[10]uint32{0x016b368e, 0x00767782, 0x015099ea, 0x02b66ef7, 0x031eada5, 0x01ede6c0, 0x01870da4, 0x02e1b7c2, 0x005158fd, 0x00025377}}}, + {X: Field{[10]uint32{0x00ef54dd, 0x03404f33, 0x02d6bfd9, 0x02c3961c, 0x02ab8789, 0x00d0fc4b, 0x037f9d18, 0x009d8b29, 0x00236dc0, 0x002e273f}}, Y: Field{[10]uint32{0x011141cd, 0x01ee4110, 0x0037d2ba, 0x0173c7dd, 0x01c3ad13, 0x03e18344, 0x02ce6f9d, 0x0265ad29, 0x028545a5, 0x0027269c}}}, + {X: Field{[10]uint32{0x01ccb59b, 0x03924410, 0x03ebbc64, 0x00f8b11c, 0x016744a4, 0x01892ced, 0x0190b535, 0x01a2d2ec, 0x00089798, 0x003a17b8}}, Y: Field{[10]uint32{0x02cbd6a2, 0x01d69484, 0x01723a80, 0x022fe10b, 0x010e1c9a, 0x01fb7747, 0x03e3b3d0, 0x03143089, 0x030f9ede, 0x0034ebf9}}}, + {X: Field{[10]uint32{0x02cb97b5, 0x035764ed, 0x01b3bfb0, 0x0144e645, 0x02f7f906, 0x0144d019, 0x00c8e16d, 0x01b4564f, 0x03f2774d, 0x0036375a}}, Y: Field{[10]uint32{0x035e26f4, 0x015bd294, 0x02b2c6d2, 0x03464544, 0x0325f7e6, 0x0217a7e2, 0x0031862b, 0x013cfc45, 0x00945f73, 0x0016880c}}}, + {X: Field{[10]uint32{0x02aa94e8, 0x00e1689d, 0x02aec3e6, 0x03be634d, 0x00033968, 0x0344cf61, 0x03bd5545, 0x02f7ad17, 0x01c5328f, 0x001df820}}, Y: Field{[10]uint32{0x00c2959a, 0x02daf845, 0x01669c0c, 0x02de4688, 0x00ba597f, 0x03820141, 0x026291a3, 0x03cbe116, 0x03f7ca25, 0x000b3a14}}}, + {X: Field{[10]uint32{0x03c904ab, 0x0311e7d9, 0x018c4fb9, 0x00f6c6b4, 0x02b5b920, 0x0127c1e8, 0x020b82f5, 0x025a09a0, 0x02eae8a4, 0x001441e1}}, Y: Field{[10]uint32{0x039cd96b, 0x025a19eb, 0x018a8fbd, 0x0307aac7, 0x00b39382, 0x0077219d, 0x03e21ae7, 0x031a7fd8, 0x03854e4d, 0x003704c0}}}, + {X: Field{[10]uint32{0x0242639d, 0x0109e268, 0x00ddabb6, 0x00cceaf0, 0x021169e4, 0x00203430, 0x0121056e, 0x0356d930, 0x02b3fbda, 0x000beebf}}, Y: Field{[10]uint32{0x00405cd3, 0x03e29f05, 0x031c92f3, 0x03257a97, 0x015ff199, 0x0074face, 0x019ef0a1, 0x02853796, 0x002fd9e6, 0x0002a176}}}, + {X: Field{[10]uint32{0x0312ae0a, 0x00ad791e, 0x02ae673b, 0x002478a3, 0x02aec808, 0x02d7c031, 0x03fbbc26, 0x0118f07c, 0x03eb6e6e, 0x0008036f}}, Y: Field{[10]uint32{0x03a95ecf, 0x0370072e, 0x0344ac59, 0x01dbf346, 0x03832127, 0x01524609, 0x021f0711, 0x00f65e0f, 0x0219bdaa, 0x001214a8}}}, + {X: Field{[10]uint32{0x00b8a3d9, 0x03fcaf89, 0x00ab41ac, 0x01c95086, 0x013ec225, 0x014b36e1, 0x03d46b6e, 0x03df7024, 0x00f60259, 0x0009ec50}}, Y: Field{[10]uint32{0x00583387, 0x02a9fff0, 0x00f7bc85, 0x018dc69d, 0x0228bb5d, 0x004c38c4, 0x00054c4f, 0x02b6eb50, 0x009f70cb, 0x000f3bb4}}}, + {X: Field{[10]uint32{0x015b7e71, 0x03592afa, 0x00a0fcd1, 0x032b5ca3, 0x000e175c, 0x0130ac0b, 0x022ec351, 0x014c4608, 0x01ee535c, 0x003f9250}}, Y: Field{[10]uint32{0x011f56f6, 0x01c013b9, 0x0370ed35, 0x03796172, 0x03748e0a, 0x02992b68, 0x01cb4422, 0x01946f62, 0x01ae286d, 0x003a7372}}}, + {X: Field{[10]uint32{0x01ff1cdf, 0x00e4979d, 0x01d885a0, 0x03b5664d, 0x030ce47c, 0x016f8bc5, 0x03443d76, 0x0252f4db, 0x009b4cae, 0x000c5f48}}, Y: Field{[10]uint32{0x02262d72, 0x01297ae2, 0x02864543, 0x037de298, 0x02c942a5, 0x02daa007, 0x03945af4, 0x015c703f, 0x009568fe, 0x00030645}}}, + {X: Field{[10]uint32{0x0093f9ea, 0x026850f3, 0x02cead9f, 0x002d64f3, 0x03df32e8, 0x00543a6a, 0x005f8ab0, 0x00c391dc, 0x0377764e, 0x003e5469}}, Y: Field{[10]uint32{0x03afd925, 0x01c3c548, 0x03052655, 0x00ec46b8, 0x026ac261, 0x004b3777, 0x00cc6b8b, 0x0088fb9b, 0x01d625f2, 0x003bee54}}}, + {X: Field{[10]uint32{0x0389c8ef, 0x007cd10c, 0x0284d309, 0x03d9b968, 0x024f251a, 0x03f925aa, 0x03229a9f, 0x023a2fc3, 0x00ebf5fd, 0x001c6b7c}}, Y: Field{[10]uint32{0x036969f4, 0x039957da, 0x0242539c, 0x01cb9d9d, 0x0198ed56, 0x0371ceb7, 0x00dfdf72, 0x0154d99d, 0x0063293a, 0x0004fd1d}}}, + {X: Field{[10]uint32{0x0236be75, 0x00471140, 0x02ea5009, 0x007a07db, 0x02c3fbab, 0x03518d04, 0x01cff39a, 0x03a03526, 0x000658c0, 0x0000ba81}}, Y: Field{[10]uint32{0x014f923f, 0x018ef225, 0x02234291, 0x03b7fbb8, 0x03d82c08, 0x02682938, 0x01743d20, 0x00dc87c2, 0x00740607, 0x0002f94b}}}, + {X: Field{[10]uint32{0x02182aea, 0x02df946d, 0x009350d9, 0x00b6589e, 0x03a37344, 0x00fc2c7c, 0x00c42223, 0x020309d4, 0x03904b3e, 0x00108d48}}, Y: Field{[10]uint32{0x01221d91, 0x03fb59f6, 0x02966395, 0x023e053e, 0x000fe09e, 0x02580c89, 0x008e48ba, 0x014598c3, 0x0349b27b, 0x001fd608}}}, + {X: Field{[10]uint32{0x027dda91, 0x03eae7be, 0x00e53771, 0x027b7023, 0x017702a2, 0x026af82d, 0x0064bf8e, 0x00a16e58, 0x0082a92b, 0x0014934f}}, Y: Field{[10]uint32{0x00f29c3a, 0x011c903c, 0x01894ec7, 0x01dc34fb, 0x00366a84, 0x00c6ff57, 0x0368e053, 0x02cb7352, 0x0217fdc6, 0x00291e80}}}, + {X: Field{[10]uint32{0x0056f7e8, 0x02eb85b0, 0x00c48776, 0x02bf45af, 0x000fc83c, 0x008c8ca7, 0x02eb5f5f, 0x013799aa, 0x02085ce0, 0x003dbb87}}, Y: Field{[10]uint32{0x00cea4d9, 0x01ab1b6f, 0x03c75c2f, 0x017462c9, 0x00ccbc95, 0x0251f5ed, 0x01939774, 0x03526aa8, 0x026a7e2b, 0x000cca2c}}}, + {X: Field{[10]uint32{0x03273978, 0x01345ac5, 0x03dae313, 0x01be6f64, 0x002ea84e, 0x0141df48, 0x02b5d119, 0x00505dc8, 0x012bb88f, 0x00270bdf}}, Y: Field{[10]uint32{0x01ab2a3a, 0x006f8f0b, 0x007daa57, 0x032bb94c, 0x01d338a4, 0x031795af, 0x033c5927, 0x02d0d739, 0x000366c8, 0x0004227c}}}, + {X: Field{[10]uint32{0x0299cc3c, 0x0204f1b2, 0x0228f9b9, 0x01ed23bf, 0x0305897b, 0x014eb879, 0x0124f152, 0x02db947f, 0x02b6730f, 0x00164e87}}, Y: Field{[10]uint32{0x0344f079, 0x00cc005d, 0x00ace404, 0x006a8ec7, 0x0109e35c, 0x03dd3946, 0x003a6300, 0x00b646f0, 0x0020fbd2, 0x003f3ede}}}, + {X: Field{[10]uint32{0x01f957e3, 0x00d4ac54, 0x039f40ef, 0x03ff7968, 0x028ec0ea, 0x01fe1e97, 0x004bc603, 0x02eb32f3, 0x00c383a7, 0x0018ae84}}, Y: Field{[10]uint32{0x007bdd45, 0x01fa7f33, 0x020bec2a, 0x003b5e99, 0x019fd01e, 0x02828940, 0x025fa19a, 0x02858695, 0x01b0dc84, 0x003099e8}}}, + {X: Field{[10]uint32{0x03731f64, 0x00f18657, 0x03c6a6d7, 0x0240529d, 0x0239e123, 0x00e92a76, 0x03641fe0, 0x018a858f, 0x0010deae, 0x000778ab}}, Y: Field{[10]uint32{0x03c8d2b2, 0x0106a276, 0x00006d71, 0x017e9bd4, 0x00a512b7, 0x0208853f, 0x027b5ad7, 0x025a7410, 0x0095b6d7, 0x00183d0f}}}, + {X: Field{[10]uint32{0x03d4e1d3, 0x0105b083, 0x02a6da43, 0x01c5ab2e, 0x00c48e92, 0x005dcbc6, 0x01086123, 0x020f220f, 0x01527090, 0x003c4695}}, Y: Field{[10]uint32{0x02d742f4, 0x024d4528, 0x03f4cdf5, 0x015368bc, 0x002be515, 0x02356cec, 0x00e397b3, 0x023106db, 0x01647cf4, 0x0029b42b}}}, + {X: Field{[10]uint32{0x00dc33fc, 0x02ba5b5f, 0x0243d2ae, 0x00fc45b0, 0x013dbad4, 0x032971fd, 0x015cc01f, 0x025f9487, 0x0240d756, 0x003d1151}}, Y: Field{[10]uint32{0x02549102, 0x0213de59, 0x026cfb37, 0x01af133d, 0x036b2599, 0x029d3b21, 0x02d70531, 0x01dc1175, 0x00ef46fe, 0x0010a5cb}}}, + {X: Field{[10]uint32{0x01b8780a, 0x00bb2368, 0x01ad4cad, 0x023423b3, 0x0110905b, 0x02cc67eb, 0x03c20fa3, 0x0019f06d, 0x007397be, 0x000afebc}}, Y: Field{[10]uint32{0x02590285, 0x03314993, 0x03cd5775, 0x02c57e08, 0x039077de, 0x025c3d3e, 0x028bdee9, 0x03259cf4, 0x0099ea97, 0x003b5499}}}, + {X: Field{[10]uint32{0x00f5f73b, 0x03153dd3, 0x01222cfe, 0x01623b5a, 0x026df6e0, 0x0108bdce, 0x023ca163, 0x03b642f7, 0x00812b5f, 0x003f06af}}, Y: Field{[10]uint32{0x032b975f, 0x03444da5, 0x01d8faf0, 0x01bd3fa7, 0x007ac68f, 0x02c73471, 0x00481dc4, 0x03f2f91a, 0x02db471c, 0x0036c71b}}}, + {X: Field{[10]uint32{0x00506a8d, 0x01db9bd3, 0x00c76124, 0x017ef8c7, 0x01b717d6, 0x024f00ab, 0x036f92d2, 0x00be6e8d, 0x02ac82e0, 0x00360e30}}, Y: Field{[10]uint32{0x01189377, 0x01ecc68d, 0x02ae251d, 0x032cf83d, 0x03532dd1, 0x01faac48, 0x0176f6ca, 0x03e380f0, 0x00670388, 0x00361e8c}}}, + {X: Field{[10]uint32{0x013ee38c, 0x025f81ac, 0x004b92f6, 0x03c4ce87, 0x0132c53f, 0x0269794e, 0x019d54ca, 0x015d2689, 0x02ff0729, 0x0012cea0}}, Y: Field{[10]uint32{0x028d6265, 0x02cc1d6e, 0x0229032d, 0x012f95c2, 0x00bf6073, 0x03205484, 0x026a0c46, 0x0115b4fd, 0x0341a788, 0x00110dca}}}, + {X: Field{[10]uint32{0x00e411aa, 0x035ab4ff, 0x002f20b8, 0x02438de7, 0x008e79d2, 0x02f54bdc, 0x01eaf6a9, 0x02b538c9, 0x03f36731, 0x0035df2e}}, Y: Field{[10]uint32{0x038372f0, 0x026fe13f, 0x01b50525, 0x019928e1, 0x02051f42, 0x0122f6a6, 0x02812377, 0x004f1e46, 0x0125f078, 0x003b919b}}}, + {X: Field{[10]uint32{0x02ea1483, 0x03f1b4bb, 0x006ec84e, 0x00b303c7, 0x03bed187, 0x014eb0c1, 0x00a75dc9, 0x002e09bb, 0x02b25892, 0x000e19fd}}, Y: Field{[10]uint32{0x0388aee3, 0x019c4d6b, 0x01cf4b82, 0x03d1a2b0, 0x01254d70, 0x032a7172, 0x013ff18d, 0x02025e80, 0x02dce607, 0x00331a9a}}}, + {X: Field{[10]uint32{0x001b0a9a, 0x02d4bbf3, 0x01279930, 0x026301ed, 0x032123fe, 0x0083dfc5, 0x00ea7dff, 0x03213d86, 0x0075e85f, 0x001ec022}}, Y: Field{[10]uint32{0x03075f90, 0x0159802f, 0x03904a8c, 0x00d2d42e, 0x02331f78, 0x00541dcb, 0x0055a1c4, 0x0245a697, 0x00bb8dbc, 0x000fcecc}}}, + {X: Field{[10]uint32{0x0234ef3a, 0x02875de3, 0x009a5ba7, 0x01e81369, 0x02907e9b, 0x01352de5, 0x01795600, 0x0129261d, 0x00d91630, 0x002e96d1}}, Y: Field{[10]uint32{0x03333661, 0x0131d6f3, 0x01e13f87, 0x01d8fb4e, 0x024d47ea, 0x00373537, 0x02e124f0, 0x0278ee6e, 0x03aa4821, 0x0005ad26}}}, + {X: Field{[10]uint32{0x02b8d9df, 0x0358a738, 0x03594342, 0x0084d568, 0x02910fe5, 0x016fe991, 0x02b3a23b, 0x00483614, 0x03e27fe4, 0x001a47ab}}, Y: Field{[10]uint32{0x02c71d85, 0x01fe7e2d, 0x02878188, 0x007712f2, 0x01bd71ea, 0x01489f6f, 0x0294fd6a, 0x013729f0, 0x00974218, 0x0010e818}}}, + {X: Field{[10]uint32{0x00a54123, 0x001b9215, 0x002d8440, 0x035f0dd5, 0x01551377, 0x01177299, 0x0173e38a, 0x02a1bcd4, 0x00bbc9f5, 0x00004e9b}}, Y: Field{[10]uint32{0x00488620, 0x00625202, 0x004b884d, 0x023cc08f, 0x028a43d3, 0x03a3ebe7, 0x01cc2e62, 0x01367bff, 0x009c9a96, 0x003b3ce0}}}, + {X: Field{[10]uint32{0x02f10e45, 0x00ba3579, 0x036ceb71, 0x0080b730, 0x02da6654, 0x02d3c396, 0x01731e91, 0x01734a4f, 0x02f3fb59, 0x000cff4a}}, Y: Field{[10]uint32{0x018ed2cf, 0x00c79802, 0x00c31f63, 0x00c6cea5, 0x0280ca53, 0x00233e8e, 0x0181bf98, 0x0376912e, 0x007a0a8b, 0x00389a8c}}}, + {X: Field{[10]uint32{0x00b774f6, 0x02f962cd, 0x0244c15c, 0x02608bd3, 0x03b00332, 0x029d6124, 0x033ba575, 0x01fde1da, 0x003359e4, 0x001d6550}}, Y: Field{[10]uint32{0x020458a9, 0x01c0f797, 0x01253f8e, 0x00729eb4, 0x00b6e665, 0x0110b000, 0x02998553, 0x015a36c2, 0x004070b8, 0x001fba68}}}, + {X: Field{[10]uint32{0x035b9480, 0x0176965b, 0x032f3650, 0x01944340, 0x00b3dd36, 0x01052fbd, 0x0015e7e8, 0x01f9a13a, 0x03b0c3b1, 0x001e4667}}, Y: Field{[10]uint32{0x03d9a0ab, 0x02b0fb94, 0x021b5054, 0x020d0646, 0x00abaab3, 0x0128156e, 0x03aacba5, 0x03273fbc, 0x0173f358, 0x00256f2a}}}, + {X: Field{[10]uint32{0x011aa352, 0x01c00029, 0x017b5d6d, 0x0306b226, 0x006edd0b, 0x028cff50, 0x03ed64e0, 0x03382cb9, 0x00e7962e, 0x0025c17d}}, Y: Field{[10]uint32{0x019ff347, 0x0375ca12, 0x0399db2b, 0x0157dc6a, 0x0058f408, 0x024875b6, 0x026193d8, 0x011ea284, 0x0357ad45, 0x00135339}}}, + {X: Field{[10]uint32{0x012fd777, 0x0368f38c, 0x02e12df7, 0x01d6e2c5, 0x01cadeeb, 0x00dd99d3, 0x0160b983, 0x02ad7cc1, 0x0067b841, 0x002206bc}}, Y: Field{[10]uint32{0x0083b84f, 0x0337b24d, 0x037019ac, 0x00f468e8, 0x017588be, 0x02c512c7, 0x010f62d8, 0x03c175f0, 0x03d4512e, 0x0033304f}}}, + {X: Field{[10]uint32{0x00e99621, 0x0357d704, 0x012fb1f6, 0x02dcbf50, 0x0041bfc3, 0x01eb41e5, 0x02e14cd9, 0x032763d0, 0x024433c2, 0x003fa3de}}, Y: Field{[10]uint32{0x02b3b2a9, 0x00ff752d, 0x026572a9, 0x03cf311a, 0x034c8bab, 0x0211b1e6, 0x01c4ee3a, 0x010dd25b, 0x02ee0cf3, 0x00396d5d}}}, + {X: Field{[10]uint32{0x004d798f, 0x024eaf17, 0x006cb918, 0x01927814, 0x0384f400, 0x00f0d3a0, 0x012f8320, 0x022ce0fe, 0x00da18e0, 0x003fd0f2}}, Y: Field{[10]uint32{0x01df2e7f, 0x01f6c05f, 0x02fd5242, 0x00ce92ec, 0x02f5a754, 0x02076f61, 0x009dde19, 0x03680b03, 0x005923a9, 0x00295d68}}}, + {X: Field{[10]uint32{0x00db276b, 0x031bf54a, 0x00a42ed3, 0x0105cd9e, 0x03d8f9d8, 0x012ec6cc, 0x00852427, 0x0138844d, 0x0056b97f, 0x00011c54}}, Y: Field{[10]uint32{0x014302b2, 0x03e88061, 0x0212fcab, 0x03b99beb, 0x0073a18b, 0x02e62a8a, 0x00cd71ef, 0x03c767fa, 0x01463521, 0x002d3034}}}, + {X: Field{[10]uint32{0x031fff51, 0x0121c709, 0x00814974, 0x03acc6a2, 0x02acd85e, 0x02e0f9fb, 0x0251394c, 0x00756b0a, 0x0008c5f5, 0x00217276}}, Y: Field{[10]uint32{0x03666a7d, 0x024aef96, 0x01eb8b49, 0x0034660b, 0x02018505, 0x01bb1fd7, 0x0191454d, 0x026e219a, 0x03bf2382, 0x0000a9f0}}}, + {X: Field{[10]uint32{0x0170dac9, 0x0265fe5f, 0x02f24529, 0x031db5b4, 0x03f46b60, 0x000d1173, 0x00b4b259, 0x00da380f, 0x00ef8b1e, 0x00300ae5}}, Y: Field{[10]uint32{0x0325f3a0, 0x00d0f079, 0x021d680a, 0x028ab3e5, 0x0310fadb, 0x037874a2, 0x0017825a, 0x02079235, 0x0129bcff, 0x002eee5f}}}, + {X: Field{[10]uint32{0x00241df6, 0x011caa0e, 0x02db3e29, 0x018ffb9e, 0x020fcb8b, 0x034d4e87, 0x01ac4393, 0x01bdf90c, 0x03bd28e2, 0x0012c564}}, Y: Field{[10]uint32{0x02fdcc56, 0x0138d3bc, 0x00ef0d6e, 0x022cf332, 0x003f184f, 0x02b27616, 0x0225b113, 0x01a15498, 0x0328f496, 0x002299e9}}}, + {X: Field{[10]uint32{0x02a64dd4, 0x007353c9, 0x00dd231d, 0x01b92e77, 0x037a8e7f, 0x0354a1a6, 0x02505559, 0x037b8eb5, 0x015bba51, 0x003d901d}}, Y: Field{[10]uint32{0x0287e1c8, 0x03414e5b, 0x00882a48, 0x03215745, 0x0391e0e3, 0x03092b01, 0x0029f6ee, 0x00a42f53, 0x0000a53e, 0x001ce1fe}}}, + {X: Field{[10]uint32{0x0389515b, 0x01da5e5d, 0x0206e022, 0x008a4529, 0x0016d0a5, 0x01c233be, 0x036f42cd, 0x00db18f7, 0x02a94368, 0x002524d1}}, Y: Field{[10]uint32{0x00e2b356, 0x00e0ee6a, 0x00073031, 0x034fb797, 0x0031dd41, 0x021d505d, 0x025c847b, 0x000807bd, 0x032d952a, 0x002a40e4}}}, + {X: Field{[10]uint32{0x03f91a60, 0x01802299, 0x0245cde4, 0x020f172f, 0x02cdcc97, 0x026308bc, 0x010b1f66, 0x03b7f08e, 0x019ec769, 0x00060902}}, Y: Field{[10]uint32{0x011bd1e2, 0x0109d9cc, 0x02ae0adf, 0x0200de24, 0x02804a87, 0x03e82238, 0x02051f3b, 0x013755b3, 0x01fa81e0, 0x0003e101}}}, + {X: Field{[10]uint32{0x0201d341, 0x022b3475, 0x022f92ec, 0x02484e71, 0x00683aa7, 0x03a57cf7, 0x005f34cc, 0x00f64a20, 0x03d8e463, 0x0039ad1b}}, Y: Field{[10]uint32{0x001d824a, 0x0074c033, 0x011d1639, 0x02930a0e, 0x00d6c0be, 0x032fd636, 0x00faf4a7, 0x0298e94a, 0x0013f3fe, 0x0014cf6e}}}, + {X: Field{[10]uint32{0x03992b93, 0x010db3ff, 0x0015d60a, 0x014bc5d8, 0x03a04c62, 0x03504e74, 0x00d150d3, 0x02c63752, 0x0330dc19, 0x0018de66}}, Y: Field{[10]uint32{0x02dcc41b, 0x0336c345, 0x015073c3, 0x032cae8d, 0x0007f485, 0x03c1905e, 0x00e72f5f, 0x0137bb40, 0x01125ebf, 0x00098814}}}, + {X: Field{[10]uint32{0x02ad7338, 0x028a7c4b, 0x01676670, 0x00927c7f, 0x037fac53, 0x038dc2c3, 0x01b88d3a, 0x0280b7a1, 0x035ab1d5, 0x0023340b}}, Y: Field{[10]uint32{0x00c0d8e4, 0x03c2586f, 0x006278e2, 0x03bb10e4, 0x03511d56, 0x02f26ee9, 0x02cb70f0, 0x02275984, 0x02acceb6, 0x000d62d0}}}, + {X: Field{[10]uint32{0x01f82fab, 0x0286a7b7, 0x00991d3e, 0x0199282a, 0x01f76127, 0x03ccec19, 0x01aba41b, 0x034777a5, 0x03e6d48b, 0x00357859}}, Y: Field{[10]uint32{0x0271d1f7, 0x0309a1ab, 0x03d70849, 0x0188e095, 0x02aaf45f, 0x03361ab8, 0x00ec9cb3, 0x0337d3f1, 0x0182d653, 0x001b308e}}}, + {X: Field{[10]uint32{0x009bfdba, 0x006773df, 0x030cf4ff, 0x01096192, 0x01d72b19, 0x01fc0306, 0x034f09d9, 0x03cb7c4c, 0x01006987, 0x003101cd}}, Y: Field{[10]uint32{0x037ff262, 0x003274ff, 0x00ca82bf, 0x002b295a, 0x02b760ff, 0x000de3e0, 0x03366bf3, 0x004c9aa6, 0x00466b46, 0x003d959a}}}, + {X: Field{[10]uint32{0x00c4fde2, 0x0031eabc, 0x02b91184, 0x0303ecb7, 0x0229a7c2, 0x020e0c63, 0x0221db2a, 0x006fec22, 0x02719c50, 0x000277c7}}, Y: Field{[10]uint32{0x02d00fc0, 0x014c973e, 0x03ea580a, 0x016d0f7b, 0x03e977c7, 0x024079c0, 0x0315ae54, 0x00300ac0, 0x00ae6d0e, 0x003358a3}}}, + {X: Field{[10]uint32{0x024c696c, 0x022e134a, 0x0165b7d0, 0x01242b5c, 0x031c91c2, 0x0248b165, 0x03108ee6, 0x030c2408, 0x0029df73, 0x002545d9}}, Y: Field{[10]uint32{0x01c0fbe4, 0x0021b2fa, 0x000cbdd8, 0x02dc901d, 0x011994fb, 0x00dd724a, 0x02084700, 0x036f3208, 0x00493b62, 0x000fb3ff}}}, + {X: Field{[10]uint32{0x01628c6e, 0x023d8031, 0x0156da31, 0x021cd3d5, 0x02f57fe1, 0x012fa3ed, 0x03a7e0e9, 0x0034d784, 0x00e8692b, 0x001c2312}}, Y: Field{[10]uint32{0x0105a664, 0x0378c828, 0x029bfe1c, 0x0004fdf6, 0x005af7e6, 0x03da8bc0, 0x020432e9, 0x00747c9f, 0x0302deee, 0x00254d38}}}, + {X: Field{[10]uint32{0x025b4c09, 0x00732853, 0x0222b299, 0x030274c9, 0x0146275e, 0x02c9af85, 0x01620794, 0x031ce6d7, 0x017ab82d, 0x0009dd78}}, Y: Field{[10]uint32{0x031ccddc, 0x02de4206, 0x0152e8a9, 0x00a21d13, 0x03338ab2, 0x03684ca3, 0x02b52c28, 0x00d67f7b, 0x027c80e8, 0x000ea9bb}}}, + {X: Field{[10]uint32{0x030192da, 0x0248a700, 0x03270be1, 0x00d0f0e0, 0x0044da6b, 0x023ed228, 0x0334959b, 0x013cc73c, 0x02c2039c, 0x0011f06a}}, Y: Field{[10]uint32{0x000d7cc0, 0x038562d8, 0x003551fd, 0x0168848a, 0x00e5813f, 0x02681471, 0x01cd4025, 0x03087611, 0x011c5ba6, 0x00176b59}}}, + {X: Field{[10]uint32{0x00bad15e, 0x036a86ee, 0x02c70d77, 0x0353e8a2, 0x01eef459, 0x033e897c, 0x03b2bf59, 0x01325806, 0x005a4b86, 0x003e03d1}}, Y: Field{[10]uint32{0x0374ff16, 0x01ffdc2c, 0x02c8863f, 0x03d297c4, 0x0183cd57, 0x03a7e239, 0x00b9da6c, 0x01a659b4, 0x02046b8c, 0x0028e0f7}}}, + {X: Field{[10]uint32{0x014d2f66, 0x02e40faf, 0x01bf6f9c, 0x00967cb5, 0x02b22081, 0x01e2dc5c, 0x01f436d5, 0x00d866a3, 0x03b91ad3, 0x000a4939}}, Y: Field{[10]uint32{0x00841875, 0x022f6e12, 0x00effa76, 0x0156b58b, 0x02afa412, 0x005747c1, 0x00e4f3fe, 0x027d50d2, 0x0169e231, 0x002e1908}}}, + {X: Field{[10]uint32{0x02dc4d83, 0x01017cdd, 0x02e2af13, 0x0179df8c, 0x00431078, 0x028ae6b1, 0x001854e3, 0x013b4a0d, 0x007b91a6, 0x000df582}}, Y: Field{[10]uint32{0x01f25003, 0x02e65c4f, 0x01b1f9bd, 0x0024b094, 0x01a3ac9f, 0x00b9bf37, 0x023092f3, 0x02f32ea0, 0x0117e068, 0x000d688e}}}, + {X: Field{[10]uint32{0x00f4fab2, 0x0372e484, 0x00fd8391, 0x033a0a53, 0x03e000d2, 0x033e12d3, 0x003691cb, 0x006f81ad, 0x016dc79f, 0x0035d22a}}, Y: Field{[10]uint32{0x005bf51c, 0x031369bc, 0x036c8223, 0x009eabed, 0x00975c09, 0x02e05c8a, 0x017e5c04, 0x0240bb39, 0x01e065da, 0x001d6d2b}}}, + {X: Field{[10]uint32{0x002cc30c, 0x00cf41b9, 0x03a8fa02, 0x013b0957, 0x03949241, 0x00edbee5, 0x02361ea3, 0x0213fc98, 0x0225eb50, 0x0034174a}}, Y: Field{[10]uint32{0x01a6f2d2, 0x03ead81a, 0x00f4e75e, 0x02616ea6, 0x01ba57a1, 0x022a80f6, 0x03514290, 0x0323ce16, 0x02eececd, 0x00052eef}}}, + {X: Field{[10]uint32{0x003ff793, 0x022765d2, 0x0030278c, 0x03d7a2a3, 0x00b4684b, 0x0193b2a7, 0x03f39067, 0x03b6f96b, 0x015bd137, 0x001a6ea6}}, Y: Field{[10]uint32{0x03b63e32, 0x03864d96, 0x000b246d, 0x01b1c056, 0x01a79ad9, 0x007176e5, 0x033e8649, 0x01965a60, 0x0051b622, 0x000ac73d}}}, + {X: Field{[10]uint32{0x00419461, 0x00bfdc55, 0x0197d9a8, 0x03cbc7b2, 0x033a50af, 0x01418412, 0x020342ff, 0x033ca3f7, 0x01a15d0e, 0x001fc07a}}, Y: Field{[10]uint32{0x0112dc68, 0x037310eb, 0x030e5e03, 0x0196a0d1, 0x03d27040, 0x03b72ad8, 0x01e25d1f, 0x034dd4d8, 0x0194a6b8, 0x00070f25}}}, + {X: Field{[10]uint32{0x02e48cc6, 0x02902795, 0x0219d813, 0x000fc3e1, 0x00f2413d, 0x00613933, 0x0201bc47, 0x024107f4, 0x02fd193b, 0x001c648c}}, Y: Field{[10]uint32{0x0229a953, 0x00674f2b, 0x02d1e68b, 0x028197e0, 0x0312fb55, 0x03ab816a, 0x037ff609, 0x02c14d4c, 0x03187dcc, 0x000587f1}}}, + {X: Field{[10]uint32{0x02e78c27, 0x00f7219d, 0x03d082f5, 0x03e91b22, 0x039a63bc, 0x01ef4a2f, 0x006009a5, 0x01cc40ce, 0x0120155f, 0x00056e10}}, Y: Field{[10]uint32{0x01737816, 0x00b140cc, 0x03605140, 0x0283aa7e, 0x03188171, 0x0102b293, 0x0004e0c8, 0x01f8bfa6, 0x037ec901, 0x0011f758}}}, + {X: Field{[10]uint32{0x03fec567, 0x01301d2e, 0x01a2c007, 0x0389d053, 0x0004a95c, 0x02e9a645, 0x0352ed4e, 0x00011df6, 0x0197bd38, 0x003fd0a7}}, Y: Field{[10]uint32{0x017b3048, 0x016a8075, 0x00f2569a, 0x002b2f2e, 0x036708c0, 0x037ddf00, 0x0173f624, 0x016eacd2, 0x03bd6e63, 0x001ece9b}}}, + {X: Field{[10]uint32{0x010a6ee3, 0x02c79575, 0x01ed8858, 0x0012c984, 0x01379174, 0x00b1dfa0, 0x01f476d1, 0x039d333c, 0x005b016b, 0x0003335c}}, Y: Field{[10]uint32{0x00e87c01, 0x02bff0d0, 0x01f1f737, 0x0130c6b6, 0x020946cb, 0x025fde35, 0x0155e178, 0x02c94937, 0x01e75cc7, 0x0021d06b}}}, + {X: Field{[10]uint32{0x03b65b27, 0x030df542, 0x01534d54, 0x001a3526, 0x0294e4b4, 0x00c03b2a, 0x0278e818, 0x0315fe45, 0x025e24b3, 0x00196d86}}, Y: Field{[10]uint32{0x01ed0c40, 0x005a9d9d, 0x024fd79c, 0x031e9719, 0x02f65ac4, 0x02b82147, 0x0386fda2, 0x01ee0bc6, 0x0228aab9, 0x002435d7}}}, + {X: Field{[10]uint32{0x03a06ef0, 0x005067de, 0x00cf173c, 0x021f068e, 0x014ffe04, 0x0163ee39, 0x0382bdd7, 0x01cf650f, 0x01df8f40, 0x0019c54a}}, Y: Field{[10]uint32{0x00fede59, 0x01533f45, 0x029504d8, 0x01071c1d, 0x00454fd1, 0x03547af9, 0x01121e10, 0x00d26b74, 0x032d1f23, 0x00311b67}}}, + {X: Field{[10]uint32{0x001b0440, 0x008f3fe4, 0x035b68e8, 0x0375319c, 0x0073da3f, 0x002ef4b0, 0x02f8e703, 0x005a5c1e, 0x02760e7a, 0x0000abe2}}, Y: Field{[10]uint32{0x02c3c1cb, 0x03f40989, 0x0143f72f, 0x02b7597d, 0x017c34f5, 0x007b8cf3, 0x01659769, 0x01c54f1c, 0x03e79ada, 0x00155596}}}, + {X: Field{[10]uint32{0x03575707, 0x0251ca9b, 0x01fc42fb, 0x03543bd6, 0x024def3f, 0x01f31cc2, 0x00b3b1fb, 0x02ee1d3f, 0x016fc5ff, 0x002b3607}}, Y: Field{[10]uint32{0x01d181a3, 0x00a59180, 0x011cce09, 0x03258fa1, 0x02b87c0e, 0x001c6da5, 0x02f47eb5, 0x03aa7847, 0x028ec8b8, 0x00238c66}}}, + {X: Field{[10]uint32{0x00ffb912, 0x033a36e0, 0x0041bd60, 0x02a66e45, 0x02ae062c, 0x0182a9fc, 0x012d0bb3, 0x03a2f081, 0x03d53ab9, 0x002addf9}}, Y: Field{[10]uint32{0x01f96b5a, 0x0131d48b, 0x02d8fdfa, 0x0262d75b, 0x02aca909, 0x0075c104, 0x03992e5e, 0x02e56e7a, 0x02d9cb0a, 0x0017e4ad}}}, + {X: Field{[10]uint32{0x00124046, 0x0222acde, 0x03265e01, 0x03cded98, 0x031d7efa, 0x001a88c0, 0x03eda09b, 0x0231fbe2, 0x01951a6a, 0x001e62e0}}, Y: Field{[10]uint32{0x002b1bf6, 0x03e75138, 0x01de7a1b, 0x02d7c460, 0x03d91382, 0x0399d1db, 0x004a7e54, 0x0290c0d9, 0x021b0bae, 0x002564b6}}}, + {X: Field{[10]uint32{0x0377b096, 0x0354a2e5, 0x02f29ed6, 0x00e893fd, 0x009dbff9, 0x0222bad3, 0x01dea224, 0x039df637, 0x02ae0c3b, 0x003c921a}}, Y: Field{[10]uint32{0x0029126b, 0x0096aa12, 0x028cc413, 0x018a360e, 0x03d8409b, 0x00dabec2, 0x010327fe, 0x03211df1, 0x0150fe75, 0x00238acb}}}, + {X: Field{[10]uint32{0x006d2d54, 0x025d2205, 0x00333f93, 0x0220993d, 0x02d16ca0, 0x02bbbb9c, 0x0364ee33, 0x03aa2f83, 0x01093b8a, 0x00088b8f}}, Y: Field{[10]uint32{0x02cdcaa9, 0x02d4e772, 0x018a4351, 0x01e332c2, 0x0137ba1f, 0x0283af5e, 0x02dd16e8, 0x02ef1070, 0x000fbfe6, 0x0003bfd4}}}, + {X: Field{[10]uint32{0x0121c1c9, 0x02df4130, 0x01bd0165, 0x007670c8, 0x024f9924, 0x02d4f800, 0x01a18eea, 0x00d1d891, 0x03fe7ca9, 0x0019da34}}, Y: Field{[10]uint32{0x00272877, 0x02bba2e4, 0x00a43823, 0x0094340c, 0x000c4dc8, 0x027871de, 0x019ff1d0, 0x025c888c, 0x0173c9b9, 0x00100b27}}}, + {X: Field{[10]uint32{0x022dda79, 0x01fc263c, 0x00ef2513, 0x02133e32, 0x01b0b628, 0x03f5e057, 0x0325697b, 0x022033bf, 0x000fb2f0, 0x001bad9d}}, Y: Field{[10]uint32{0x0085c86f, 0x027c0fc5, 0x01b68520, 0x02579163, 0x0079c4b6, 0x03d0b9ab, 0x002061c1, 0x015c4f0c, 0x0131c12f, 0x0033dfa1}}}, + {X: Field{[10]uint32{0x025fe51b, 0x0001aaa5, 0x01ac2950, 0x0165c5ca, 0x025ede89, 0x019eda9f, 0x00f385f3, 0x0169faa8, 0x03484eb0, 0x001c407c}}, Y: Field{[10]uint32{0x00d5c3f3, 0x013e24c4, 0x0144be26, 0x01687912, 0x00260559, 0x01c6bf0b, 0x00fff9fc, 0x03edd5de, 0x0113a040, 0x002347ee}}}, + {X: Field{[10]uint32{0x02886579, 0x0239b4c3, 0x0287a11c, 0x03ab3bee, 0x02a0de03, 0x0080c0d8, 0x024b25f1, 0x028978ff, 0x005cacc6, 0x001d6a79}}, Y: Field{[10]uint32{0x03f69c6e, 0x01f00af3, 0x03f7adbe, 0x03e555a0, 0x02854c49, 0x00007f60, 0x0202cf31, 0x021b649a, 0x0195e919, 0x0014aa16}}}, + {X: Field{[10]uint32{0x0337dcbc, 0x0359cc0d, 0x001b2954, 0x03de0c2b, 0x02ceac14, 0x01fe66b7, 0x03ffc542, 0x0195ca62, 0x0192bad7, 0x000c4653}}, Y: Field{[10]uint32{0x03dd2832, 0x007fcfd7, 0x02f19a2d, 0x02f36b0b, 0x028c556e, 0x00f316f1, 0x02449fa3, 0x023bba74, 0x0045f531, 0x00267a07}}}, + {X: Field{[10]uint32{0x03d505af, 0x02562b02, 0x0123c522, 0x030e115f, 0x03c1d743, 0x002d3338, 0x02c61387, 0x01bd0e1a, 0x03fe76fd, 0x002413e8}}, Y: Field{[10]uint32{0x03c1763b, 0x02ab9069, 0x023045c8, 0x03ece55e, 0x018dae9b, 0x0131c165, 0x02929e45, 0x0118cde7, 0x02621adf, 0x002509cc}}}, + {X: Field{[10]uint32{0x00a8e0fd, 0x02a4ffe9, 0x01f26b5f, 0x0109e29f, 0x03040de1, 0x00fe8996, 0x019aedef, 0x022cc8da, 0x01f31a82, 0x00074618}}, Y: Field{[10]uint32{0x0099f7dc, 0x017d1376, 0x01f61199, 0x03098e99, 0x013ffc30, 0x0212ee59, 0x01306e3b, 0x03faca38, 0x0381f13f, 0x002e595d}}}, + {X: Field{[10]uint32{0x0019ad64, 0x0395179a, 0x0009b73c, 0x008a110f, 0x02aac959, 0x02159773, 0x02f0289e, 0x02975797, 0x01ef6de1, 0x000ef4cf}}, Y: Field{[10]uint32{0x00f9c810, 0x00d7b575, 0x001c2975, 0x0077d491, 0x038bc985, 0x029c3a6f, 0x00366279, 0x002f525d, 0x0109eb56, 0x00264fc0}}}, + {X: Field{[10]uint32{0x00958634, 0x031fdb16, 0x0261c7be, 0x03adc543, 0x03e4c257, 0x039681f1, 0x0327b248, 0x02bb4a9f, 0x01452a39, 0x003286df}}, Y: Field{[10]uint32{0x004afcff, 0x03eb368f, 0x032c7298, 0x03dd10ab, 0x010179c0, 0x027ed520, 0x01a98043, 0x01f0dedf, 0x021bc035, 0x002ac47f}}}, + {X: Field{[10]uint32{0x0271aa58, 0x0355f461, 0x00f61da6, 0x01f57e4a, 0x00df145f, 0x0339f66b, 0x03f29a36, 0x00e1ad4f, 0x01cadee8, 0x0009cea5}}, Y: Field{[10]uint32{0x025bbe2b, 0x0053e546, 0x03ac2adb, 0x0071cf14, 0x00315a03, 0x010194a1, 0x02c6d832, 0x014df469, 0x019dbb06, 0x0022298d}}}, + {X: Field{[10]uint32{0x005561e6, 0x02443e6b, 0x02279d0f, 0x03d4a511, 0x01c06923, 0x00e48700, 0x03ad79cd, 0x02eeb154, 0x00fca139, 0x001fa930}}, Y: Field{[10]uint32{0x016dec96, 0x03e82eca, 0x0193a54d, 0x00ddc6bb, 0x002eb71c, 0x018e7c66, 0x01e79822, 0x00c38bcc, 0x01470458, 0x002f4127}}}, + {X: Field{[10]uint32{0x0207d336, 0x012581e5, 0x02ce80bc, 0x01a3f344, 0x00d3823f, 0x017331a1, 0x03932401, 0x02af9751, 0x001c0a2b, 0x001c7c60}}, Y: Field{[10]uint32{0x03f1b4b1, 0x039b76c7, 0x00a6cf5a, 0x00390e77, 0x0214430c, 0x03a3f9e9, 0x01b7de37, 0x01395082, 0x03d00838, 0x00107b41}}}, + {X: Field{[10]uint32{0x01cd8828, 0x00160b48, 0x00f2a1c9, 0x036589e7, 0x017000ff, 0x0155068f, 0x00aec515, 0x0287baba, 0x0073652b, 0x002ca0e2}}, Y: Field{[10]uint32{0x027dce5e, 0x02d20474, 0x0079d2a0, 0x03ca87bf, 0x01ee4d19, 0x01abf30c, 0x01faf658, 0x038e9491, 0x015573f5, 0x00011ffc}}}, + {X: Field{[10]uint32{0x015a3e21, 0x036263ad, 0x02cb5b68, 0x0129afc2, 0x03d9f816, 0x00224892, 0x033fbdcc, 0x012f05a1, 0x01a72263, 0x000d32a3}}, Y: Field{[10]uint32{0x01c5d986, 0x02440339, 0x01f4b73f, 0x0241464b, 0x031f041a, 0x02168ffd, 0x0369055d, 0x0324701d, 0x036036a9, 0x00362bed}}}, + {X: Field{[10]uint32{0x0319cc8f, 0x01c8cdd2, 0x0115aa0e, 0x021e270e, 0x034b76eb, 0x03db5e5a, 0x00cf5b2e, 0x0106bf28, 0x0397d973, 0x00084b2c}}, Y: Field{[10]uint32{0x02f170a1, 0x030d7590, 0x01e64875, 0x01ccbde3, 0x01ff17e2, 0x0049b143, 0x0285f501, 0x03c1be5d, 0x00ec5f29, 0x003c1b8b}}}, + {X: Field{[10]uint32{0x00a6228a, 0x0202471b, 0x002e9ffa, 0x00bf392d, 0x01d5f29d, 0x01e24fda, 0x0182dfde, 0x004f70c9, 0x03f643bd, 0x002f00d9}}, Y: Field{[10]uint32{0x00556e78, 0x03fd0a5d, 0x0373f527, 0x01e5ee5b, 0x02c17641, 0x02d66b0c, 0x03f3e44a, 0x007c192b, 0x0089d125, 0x0026fb1b}}}, + {X: Field{[10]uint32{0x01bd5672, 0x00403c6a, 0x029d8dec, 0x00cf37ad, 0x025e489e, 0x03466392, 0x03169bb4, 0x0222516a, 0x00235d8e, 0x0023f2c5}}, Y: Field{[10]uint32{0x03fc057c, 0x036de439, 0x01f5fe52, 0x00816c74, 0x03c45ae3, 0x01102109, 0x0302a46b, 0x0242c980, 0x0396bab3, 0x003e872c}}}, + {X: Field{[10]uint32{0x011e64ae, 0x0170beb9, 0x010440e1, 0x02133289, 0x00d4917e, 0x0077d83d, 0x0043e801, 0x03b0832f, 0x01056675, 0x001c2b61}}, Y: Field{[10]uint32{0x015a800d, 0x013e9847, 0x004e8c00, 0x03832fbd, 0x02b63d68, 0x03d6dc4e, 0x0262475d, 0x029f2697, 0x0356af9f, 0x003d2944}}}, + {X: Field{[10]uint32{0x01695842, 0x0387db2e, 0x028803ed, 0x036611be, 0x02bcf6e6, 0x025c6301, 0x026df81f, 0x0105a21b, 0x03474807, 0x002b69eb}}, Y: Field{[10]uint32{0x008a582f, 0x02ddb6e6, 0x001dd575, 0x02440031, 0x0298369c, 0x01dc7654, 0x0348bbe0, 0x009f5371, 0x011f50f4, 0x0003d9b5}}}, + {X: Field{[10]uint32{0x0102eeee, 0x011762c4, 0x0052c7f0, 0x01ee949f, 0x01bf1e97, 0x034d3e3a, 0x038108f9, 0x03aec46e, 0x018d7323, 0x003c6e1f}}, Y: Field{[10]uint32{0x00346556, 0x037dda2d, 0x000b79bd, 0x039c1f8e, 0x037e2aa0, 0x01edd56c, 0x01e58424, 0x039e827b, 0x030351eb, 0x0002f655}}}, + {X: Field{[10]uint32{0x012a0553, 0x0244d592, 0x00833cc5, 0x0145d9b3, 0x031fbf7c, 0x03fb5ee0, 0x000c301c, 0x0193ab24, 0x015ad552, 0x0024d967}}, Y: Field{[10]uint32{0x00154beb, 0x01b78170, 0x0089ccf4, 0x0176215b, 0x03519ff6, 0x030740a8, 0x02137df1, 0x000596be, 0x01e9646d, 0x002da4e2}}}, + {X: Field{[10]uint32{0x02d4ffe2, 0x00e3df63, 0x01f48b17, 0x039745e0, 0x00409a62, 0x0056fbbb, 0x002f54a4, 0x013ff712, 0x00492a9b, 0x003a74af}}, Y: Field{[10]uint32{0x00305df5, 0x00c10211, 0x00631608, 0x0020d854, 0x038d6392, 0x013c94e0, 0x01de313f, 0x02fe0037, 0x02522dcc, 0x00224f91}}}, + {X: Field{[10]uint32{0x006cb210, 0x038abde4, 0x00744229, 0x0306a1d8, 0x01825e0b, 0x01cb69a9, 0x0103eea3, 0x02b64460, 0x020a7bf1, 0x00050905}}, Y: Field{[10]uint32{0x0196af23, 0x03be284e, 0x0343f209, 0x03a47d8d, 0x024f1519, 0x002c8fa5, 0x02f1d0e1, 0x0175c479, 0x022696a7, 0x00325368}}}, + {X: Field{[10]uint32{0x009efd87, 0x0233ba27, 0x02300c45, 0x01639bc9, 0x018686d0, 0x02d7e9fa, 0x03e434ae, 0x012f52aa, 0x0312402e, 0x001fe409}}, Y: Field{[10]uint32{0x02f95fb5, 0x00622b18, 0x01602669, 0x02305498, 0x031b8b01, 0x022111a9, 0x02cdcddc, 0x02d062c5, 0x020b2aef, 0x002f0011}}}, + {X: Field{[10]uint32{0x0372745c, 0x03187d5b, 0x03c01255, 0x01a8e051, 0x022a133f, 0x02370a4d, 0x02e5f16c, 0x003d4fa1, 0x027c66cb, 0x0034c9f3}}, Y: Field{[10]uint32{0x02bea436, 0x01d628e1, 0x015f8353, 0x035071be, 0x02618cc6, 0x02314b72, 0x0108b85b, 0x00e7041a, 0x018ac3cb, 0x00137052}}}, + {X: Field{[10]uint32{0x032db3b3, 0x00e5ab78, 0x03d1a0d5, 0x033951ef, 0x01137dff, 0x022eff0c, 0x013803be, 0x00441800, 0x0319c9d8, 0x003c113a}}, Y: Field{[10]uint32{0x02526f2a, 0x00ae77df, 0x03af7c10, 0x037bff33, 0x028128a8, 0x02ca0b3f, 0x00551cea, 0x00f999fe, 0x028d9c4c, 0x0016b510}}}, + {X: Field{[10]uint32{0x0218daf4, 0x03172f03, 0x03d55f67, 0x02dfcf00, 0x03d135bb, 0x03755100, 0x006a81eb, 0x0066fabd, 0x0237b95d, 0x001e9b14}}, Y: Field{[10]uint32{0x0204385b, 0x038a48a8, 0x001d70cc, 0x019a29c3, 0x01bd492c, 0x03fda3fb, 0x00fc6e74, 0x03ad7121, 0x00b847fc, 0x0018a8ba}}}, + {X: Field{[10]uint32{0x019f82f0, 0x0256f06d, 0x01bb5804, 0x026d1d62, 0x02ffae94, 0x01708211, 0x0372afaf, 0x0302deed, 0x00dcb069, 0x001671ff}}, Y: Field{[10]uint32{0x026c38ad, 0x023bae84, 0x006ec335, 0x014bc935, 0x02c09b36, 0x03238b1e, 0x03a4d79a, 0x0159adc6, 0x008c6657, 0x0020bb16}}}, + {X: Field{[10]uint32{0x036543d7, 0x0006f51a, 0x03ae00ea, 0x036f37c9, 0x0081d99f, 0x02ee1795, 0x00d3dc6d, 0x01563310, 0x00211ed4, 0x003e33cf}}, Y: Field{[10]uint32{0x03a9778b, 0x037a7721, 0x03b20054, 0x030f82a2, 0x035506a5, 0x03338c10, 0x011f5dbd, 0x03d8c225, 0x01d01c3d, 0x002f6012}}}, + {X: Field{[10]uint32{0x024504bc, 0x00b39c54, 0x03764278, 0x00ff3f44, 0x024d2dd2, 0x00eb2a0a, 0x03471893, 0x02753c7f, 0x0364b238, 0x000e1575}}, Y: Field{[10]uint32{0x019ef72d, 0x01b02f1d, 0x01f95944, 0x03bb7c4f, 0x03b14a71, 0x02ab8ea8, 0x024ec346, 0x02af409c, 0x02254af2, 0x0020b13a}}}, + {X: Field{[10]uint32{0x02de5431, 0x03774694, 0x02ffa48c, 0x01b6bdf9, 0x036d3e0e, 0x01554f6a, 0x00b1d733, 0x03c3634c, 0x03311de4, 0x001dd912}}, Y: Field{[10]uint32{0x005916b4, 0x03d4853d, 0x029b4cdb, 0x00c1a560, 0x017581c9, 0x00aedd0c, 0x03730f99, 0x001cd5cd, 0x03ce0c0a, 0x00191785}}}, + {X: Field{[10]uint32{0x01ca138d, 0x00c198f6, 0x01d34565, 0x033dd996, 0x0156bfc0, 0x0194deaf, 0x02511daa, 0x02bef2ca, 0x0343afd6, 0x0029352b}}, Y: Field{[10]uint32{0x03bb09dd, 0x028afadc, 0x03747a25, 0x017cf57f, 0x0088b5db, 0x0358f7cd, 0x007f0737, 0x03cc6ee4, 0x03d0dd2d, 0x002f9b27}}}, + {X: Field{[10]uint32{0x00a75be5, 0x03f0181d, 0x011aaaa8, 0x032bed9b, 0x012da352, 0x03992f18, 0x02c3d645, 0x028207dc, 0x023fe673, 0x00105ffe}}, Y: Field{[10]uint32{0x00c50151, 0x0024f81a, 0x00be10de, 0x0129fdce, 0x02cfd9ca, 0x0169d243, 0x01472afd, 0x0251d202, 0x022f9084, 0x0026ae2f}}}, + {X: Field{[10]uint32{0x02ef73cd, 0x03ba0e32, 0x00622f75, 0x001257a2, 0x004f19eb, 0x01d084b1, 0x03d772cc, 0x014105b2, 0x01549311, 0x001e05d4}}, Y: Field{[10]uint32{0x00d0d3e6, 0x02fdff4d, 0x00ac2dd7, 0x02c29765, 0x02fdaf2c, 0x01f2c637, 0x0381b91d, 0x00d94098, 0x01c8ffec, 0x000df535}}}, + {X: Field{[10]uint32{0x031b5121, 0x0094fe82, 0x02f0f736, 0x02923d8b, 0x023c2ee7, 0x039d9896, 0x020c66c7, 0x00a3abd5, 0x020c3acc, 0x000d9715}}, Y: Field{[10]uint32{0x0374868f, 0x01f4df16, 0x018d6451, 0x005773b1, 0x016990aa, 0x00e3e374, 0x0303f883, 0x03c578e2, 0x02fa96c0, 0x000972f1}}}, + {X: Field{[10]uint32{0x035bac7c, 0x03e860a3, 0x03808a94, 0x03f76233, 0x016c6757, 0x02866a49, 0x026b6cb3, 0x0008fa44, 0x01251010, 0x0032516b}}, Y: Field{[10]uint32{0x0254e2bb, 0x037e4ab5, 0x01e5b174, 0x02ec99e7, 0x0399df4a, 0x0319bdb6, 0x008ae3df, 0x010ef3bc, 0x010cb4ac, 0x00326a3a}}}, + {X: Field{[10]uint32{0x002e0213, 0x0303878b, 0x03eec629, 0x02dedf4e, 0x02ac8c3f, 0x00ca18f7, 0x00223876, 0x0355f5ce, 0x01ac45e6, 0x0012ab61}}, Y: Field{[10]uint32{0x016a2708, 0x002d8f3f, 0x02595213, 0x0224ddbd, 0x0129c036, 0x0394e81c, 0x001c192d, 0x02fd9259, 0x00e19e81, 0x000e3bba}}}, + {X: Field{[10]uint32{0x02a291df, 0x027da689, 0x0367f24b, 0x03a9f4d4, 0x01907e37, 0x03d89118, 0x00f9f663, 0x01965ab7, 0x02480b0f, 0x000af040}}, Y: Field{[10]uint32{0x00311c79, 0x01509bc1, 0x02b2f4f3, 0x00c14204, 0x0324ad0c, 0x0242ddd0, 0x02780f6b, 0x02cdea46, 0x02d33016, 0x00382b0f}}}, + {X: Field{[10]uint32{0x03ddfde2, 0x007234e4, 0x03cffeb9, 0x000207f3, 0x02eca894, 0x0281387e, 0x001a2c09, 0x023e4c3a, 0x0191abd2, 0x00337016}}, Y: Field{[10]uint32{0x000193a5, 0x02686dd6, 0x02b32afc, 0x013af1e6, 0x038bf90a, 0x006a208b, 0x02b9852d, 0x038ac0ff, 0x02c44458, 0x0037f692}}}, + {X: Field{[10]uint32{0x0346a047, 0x00efe776, 0x02b7d079, 0x02ba722f, 0x0031d285, 0x03e2aac4, 0x00ea8570, 0x0310a7fd, 0x03f0af2d, 0x0016893b}}, Y: Field{[10]uint32{0x004c8f9a, 0x02d80167, 0x03327b53, 0x0185abbd, 0x00a98b6f, 0x02debc2e, 0x03f40dd0, 0x02458225, 0x01145973, 0x0005e76e}}}, + {X: Field{[10]uint32{0x0038183a, 0x03f8ab1e, 0x01467636, 0x02c2c151, 0x03e7c1d2, 0x01f457f6, 0x00aae6b5, 0x00f2a4dd, 0x013f5160, 0x0005b079}}, Y: Field{[10]uint32{0x03a183e3, 0x01a25d98, 0x0194ba53, 0x006815c1, 0x008d1f6c, 0x0383f724, 0x00af50c7, 0x026efd76, 0x02f056e0, 0x002fe163}}}, + {X: Field{[10]uint32{0x0301ccf4, 0x0299567a, 0x006eb0c3, 0x016c71a1, 0x01a2f240, 0x0305de00, 0x013a116a, 0x00be6b62, 0x02ea71b9, 0x001e4bc7}}, Y: Field{[10]uint32{0x0032a79d, 0x0342de8a, 0x001293cc, 0x002ef878, 0x0052c0df, 0x01e19ae7, 0x01ecf87a, 0x03bce4c4, 0x030cc610, 0x002f018b}}}, + {X: Field{[10]uint32{0x017378e1, 0x02e99769, 0x00dd7335, 0x02b3c201, 0x03917dab, 0x0044dff8, 0x004dc515, 0x01c673d5, 0x0040f057, 0x0006ce67}}, Y: Field{[10]uint32{0x000b425f, 0x029dd718, 0x02f6d380, 0x004aaa11, 0x02bfdd07, 0x0374cce8, 0x01e872c1, 0x02821507, 0x00d3b6e8, 0x001359e5}}}, + {X: Field{[10]uint32{0x02238e4f, 0x002ffeae, 0x02edec21, 0x01e2af85, 0x039f8cd2, 0x02223147, 0x00d8219b, 0x0173b783, 0x013eb9c4, 0x0004e2cc}}, Y: Field{[10]uint32{0x02ac56d6, 0x021c8f39, 0x03f7fd9e, 0x01b735b6, 0x0213f0f7, 0x03c2b349, 0x02d49512, 0x0010bd2d, 0x0357cbc8, 0x00286668}}}, + {X: Field{[10]uint32{0x03542338, 0x03f0937a, 0x0312284f, 0x00445f24, 0x008f4018, 0x03d2b869, 0x0068b24c, 0x01599340, 0x03119c76, 0x000f81b0}}, Y: Field{[10]uint32{0x0273624f, 0x039d55c1, 0x03696498, 0x02cca01e, 0x0293b08a, 0x026a4341, 0x01c45963, 0x01fc6daa, 0x0196e560, 0x0018e995}}}, + {X: Field{[10]uint32{0x03f8bd2e, 0x037a2d2e, 0x0125f8a3, 0x037bb47b, 0x0280f0f6, 0x005e7a77, 0x00e5455c, 0x0224c95d, 0x039b49c8, 0x0000fccb}}, Y: Field{[10]uint32{0x02589f17, 0x007e9ada, 0x02472855, 0x033b8ae1, 0x00091f49, 0x03d0aa77, 0x0090257b, 0x01be27bd, 0x031a5fc9, 0x0028b4ae}}}, + {X: Field{[10]uint32{0x02414ec5, 0x01dca651, 0x02b041fe, 0x03ef8ce0, 0x022c4f5e, 0x016c6e0a, 0x029602bf, 0x03143e84, 0x0017ffcc, 0x00226b71}}, Y: Field{[10]uint32{0x00253215, 0x01fbd523, 0x00bc8e2c, 0x00a0976a, 0x036c3daa, 0x02a9867b, 0x015c2915, 0x01d47405, 0x035c291b, 0x001339f9}}}, + {X: Field{[10]uint32{0x00e4e9b5, 0x03faab97, 0x01619a13, 0x03e81f07, 0x01e9f208, 0x00bd53d9, 0x017d4860, 0x02327d96, 0x01626bec, 0x003ccfef}}, Y: Field{[10]uint32{0x01593774, 0x00ad0914, 0x0025edf0, 0x022ddc9a, 0x02a6f43c, 0x00142c0c, 0x03e2eda3, 0x03c54a1f, 0x002bebb9, 0x00323c18}}}, + {X: Field{[10]uint32{0x00a7d6b8, 0x038f9929, 0x0071d568, 0x013d1448, 0x02117fa0, 0x003a5d01, 0x01f7703a, 0x038bdf91, 0x00ab7b90, 0x0003b332}}, Y: Field{[10]uint32{0x00a1b6f4, 0x005a6696, 0x0056048e, 0x01143c7f, 0x03fcc8a6, 0x0322ecd9, 0x033c2333, 0x028363cb, 0x0305a9c4, 0x002115bd}}}, + {X: Field{[10]uint32{0x017de915, 0x00fa5685, 0x03dfca4e, 0x035537c7, 0x000e6e31, 0x009d0fb4, 0x0181c754, 0x0218b960, 0x0333a7ad, 0x003da58a}}, Y: Field{[10]uint32{0x029e6605, 0x038c80ba, 0x01cf209e, 0x016a0cd6, 0x02055c15, 0x0280566a, 0x037e8ad2, 0x0173afe7, 0x03fb4851, 0x002bcf51}}}, + {X: Field{[10]uint32{0x02ace24d, 0x02748d36, 0x019e842b, 0x03c8e3fd, 0x025c45d2, 0x0025649a, 0x02d5df02, 0x03ec4197, 0x03c67996, 0x0000fc7c}}, Y: Field{[10]uint32{0x010ea28e, 0x012f529b, 0x0011f110, 0x00195a42, 0x03737507, 0x0088a36a, 0x023c30b2, 0x027c28a3, 0x01e4f0a2, 0x00356172}}}, + {X: Field{[10]uint32{0x026e589c, 0x0375145b, 0x030e34ae, 0x00b50206, 0x02dc3359, 0x02b4b357, 0x03f93c16, 0x00390f62, 0x00193629, 0x0003f2b8}}, Y: Field{[10]uint32{0x031165cc, 0x001ee851, 0x02c243a2, 0x0162e5c0, 0x02c8acb9, 0x03342665, 0x00710d88, 0x029110b7, 0x039ecc42, 0x0023a615}}}, + {X: Field{[10]uint32{0x011f522c, 0x015c2ac5, 0x012c6d89, 0x01f6ea8c, 0x01abc424, 0x03f23beb, 0x037922b5, 0x008a748e, 0x03ba0355, 0x001523c9}}, Y: Field{[10]uint32{0x02ab6fa9, 0x01fc6e21, 0x0200acb7, 0x018ce6e5, 0x02b7b63c, 0x03cdf207, 0x00ba774f, 0x01f35f23, 0x03d8bbb4, 0x00039565}}}, + {X: Field{[10]uint32{0x00146fa0, 0x00e6ef57, 0x003ab6e4, 0x02e18460, 0x0249797d, 0x0021adef, 0x025cf1ef, 0x00d1fb51, 0x0114e8bf, 0x0038bd92}}, Y: Field{[10]uint32{0x006ae76e, 0x035d18ff, 0x025d1d2e, 0x0251cb55, 0x0388b27a, 0x01debbe6, 0x02482570, 0x00793c54, 0x036f7c64, 0x00239a79}}}, + {X: Field{[10]uint32{0x0013db1d, 0x02faae8b, 0x011222cd, 0x0323ce33, 0x01c7d362, 0x00a62d03, 0x00f97622, 0x00303c76, 0x02a02d97, 0x0002314c}}, Y: Field{[10]uint32{0x0062bd0e, 0x01bfea1c, 0x0276801b, 0x02d8b7b0, 0x03568251, 0x032dd81b, 0x00ffc9fb, 0x0359b67a, 0x02e90428, 0x00243e28}}}, + {X: Field{[10]uint32{0x02291a23, 0x008c8618, 0x02f6d3c3, 0x025ebd59, 0x006fc0ed, 0x0014abb1, 0x02f7e0c8, 0x0065cbda, 0x02fee3c5, 0x0019191b}}, Y: Field{[10]uint32{0x007a69fe, 0x023d3dca, 0x03c50d6c, 0x022a61bf, 0x03a10eb8, 0x01c7cb76, 0x0276ee71, 0x00dc2cda, 0x0150f6ca, 0x00278a78}}}, + {X: Field{[10]uint32{0x033be659, 0x00787cd1, 0x011b51eb, 0x02fe699f, 0x01329199, 0x01bbd972, 0x03ff69a0, 0x037fdc32, 0x00da1df8, 0x001ba2e9}}, Y: Field{[10]uint32{0x015d852a, 0x01d19e60, 0x00a060f6, 0x0289f851, 0x03eb5a34, 0x0394def5, 0x03f21883, 0x01069cd7, 0x02c89594, 0x002b9d58}}}, + {X: Field{[10]uint32{0x036bcaef, 0x0307ccca, 0x029cae76, 0x007356e3, 0x02c94c87, 0x02b6fc7d, 0x020d7e1c, 0x00b03db7, 0x03c8f781, 0x0023086a}}, Y: Field{[10]uint32{0x007ed53e, 0x02832a5d, 0x006b2663, 0x03f9a3fd, 0x015a36d6, 0x03833bfa, 0x010ed037, 0x000f8950, 0x00c313be, 0x00169f27}}}, + {X: Field{[10]uint32{0x039f6353, 0x01ac9a4b, 0x01fea342, 0x00087ae2, 0x0010ce51, 0x015e8a3c, 0x0236ff76, 0x01f85099, 0x003a7c48, 0x0033838e}}, Y: Field{[10]uint32{0x0232e03a, 0x03030358, 0x02280532, 0x03dbf6b3, 0x0097fcb9, 0x031cf23b, 0x004e9da4, 0x01e010a0, 0x0065d43f, 0x000fe569}}}, + {X: Field{[10]uint32{0x01698eb8, 0x028dfb87, 0x03700080, 0x031f0072, 0x028078b6, 0x0119cff0, 0x00598483, 0x01f13fd1, 0x017f5147, 0x001f8cc2}}, Y: Field{[10]uint32{0x022d75a7, 0x03072972, 0x025ad141, 0x039a5c01, 0x02e282b7, 0x01241968, 0x001d274e, 0x0319e762, 0x03c07317, 0x003049d6}}}, + {X: Field{[10]uint32{0x016837a6, 0x01ec3904, 0x03867931, 0x019b3ecf, 0x01d686eb, 0x03bfc9cc, 0x031cf429, 0x01f987ec, 0x00d6b148, 0x003bd367}}, Y: Field{[10]uint32{0x0163be1f, 0x022dda8f, 0x012ecd11, 0x0161ffd8, 0x023bd2ff, 0x03a87ae8, 0x036461a6, 0x03756893, 0x02b4280d, 0x00313daf}}}, + {X: Field{[10]uint32{0x03716290, 0x015cecbc, 0x014b992c, 0x028b7c32, 0x03ce53f4, 0x0297e2e8, 0x0090bcb9, 0x024c93de, 0x01452ee4, 0x003cfb70}}, Y: Field{[10]uint32{0x03fb2f2d, 0x02a60834, 0x00dbf552, 0x01952470, 0x035c3905, 0x01f0aba4, 0x03301f08, 0x02c9ea36, 0x02abfbc9, 0x00265511}}}, + {X: Field{[10]uint32{0x03caa975, 0x01c32a0a, 0x02c92bd1, 0x009caf18, 0x0287d174, 0x00634831, 0x01341603, 0x03a45358, 0x02517398, 0x00307d88}}, Y: Field{[10]uint32{0x03769e99, 0x0019c821, 0x01cabfcb, 0x0148071d, 0x00f6d6da, 0x00a4bdc6, 0x0328d593, 0x016ddb54, 0x02273673, 0x0007216b}}}, + {X: Field{[10]uint32{0x023dea8e, 0x004c8791, 0x03889714, 0x00066956, 0x01b206c6, 0x038c41c5, 0x00561533, 0x00220752, 0x01f9605f, 0x0029fa07}}, Y: Field{[10]uint32{0x00ae8a4f, 0x01bfbe5f, 0x000adaa1, 0x03ad7151, 0x020eb23d, 0x01f7de5a, 0x0370dbba, 0x006f83c2, 0x00fd1f36, 0x000eb888}}}, + {X: Field{[10]uint32{0x006a536b, 0x01ca0af9, 0x033262fe, 0x02b16a33, 0x02f46af5, 0x01f52b97, 0x03ac0288, 0x03ca59e8, 0x03298f5d, 0x0006da6f}}, Y: Field{[10]uint32{0x0046a91f, 0x0093cbaa, 0x01c6028c, 0x03f62203, 0x02d7e9d7, 0x0066ce28, 0x0375c684, 0x0269c7a8, 0x00aa02d9, 0x00327189}}}, + {X: Field{[10]uint32{0x03bb44bb, 0x0048bb76, 0x0251db56, 0x021ff45c, 0x03b31c99, 0x02cecc49, 0x0315cb96, 0x018ee637, 0x03740317, 0x003377fb}}, Y: Field{[10]uint32{0x024869f5, 0x011679fc, 0x00b65854, 0x019e3de0, 0x00225f08, 0x028ca8e3, 0x0279ce26, 0x016a8d31, 0x02f42e93, 0x00025cbf}}}, + {X: Field{[10]uint32{0x00e957ff, 0x01c3ffd8, 0x0129cfcb, 0x00d79f00, 0x00ee07f2, 0x03bc0788, 0x0347d309, 0x01458d9a, 0x00ef2c8a, 0x000cbf87}}, Y: Field{[10]uint32{0x03b4588e, 0x013b7c93, 0x0036fe75, 0x031f116d, 0x023d13b2, 0x0030d53a, 0x033babe0, 0x0184922c, 0x0331bd37, 0x0027a185}}}, + {X: Field{[10]uint32{0x01c24b0d, 0x00896e1e, 0x02908505, 0x015c9955, 0x024a7596, 0x02bed87f, 0x01d0ccf6, 0x0104674c, 0x03e9f491, 0x0028e0be}}, Y: Field{[10]uint32{0x02111857, 0x01b36a34, 0x00a55513, 0x0063260e, 0x02cdde63, 0x01f088bf, 0x03e0287c, 0x02ff709c, 0x036039a1, 0x002a8c00}}}, + {X: Field{[10]uint32{0x0280ef88, 0x02453b06, 0x028bc6d6, 0x029e5a88, 0x0159e305, 0x01f00d13, 0x03e24670, 0x00c3ab84, 0x00399ae3, 0x002d4ed5}}, Y: Field{[10]uint32{0x01fadc7a, 0x003b8c35, 0x01a368f3, 0x00711d54, 0x02969d8d, 0x02ea2a38, 0x00f43cc8, 0x01b175d2, 0x00538dfc, 0x00266024}}}, + {X: Field{[10]uint32{0x0364169a, 0x007436be, 0x01b8df52, 0x02bc1abb, 0x00710fe2, 0x022c2b67, 0x00bbfed9, 0x03fb0fed, 0x0253f11c, 0x001886d4}}, Y: Field{[10]uint32{0x020378aa, 0x0036fa49, 0x00bb3abe, 0x01704d85, 0x033b9300, 0x00f81717, 0x01d025b6, 0x01abd88b, 0x01c48b71, 0x000a88d3}}}, + {X: Field{[10]uint32{0x01435b04, 0x00c5783e, 0x000bed5b, 0x03eae694, 0x001e5979, 0x003d5d63, 0x023f4428, 0x00f1fcc5, 0x036ccc9c, 0x0020ccca}}, Y: Field{[10]uint32{0x00d30ea0, 0x0285abf7, 0x012d416a, 0x03da1d8b, 0x0060c77d, 0x0100b761, 0x0241025c, 0x007c72f6, 0x0212258c, 0x00214d81}}}, + {X: Field{[10]uint32{0x03f6538a, 0x02a1a3f6, 0x006b668a, 0x0069e91d, 0x02fd54e2, 0x02806c43, 0x032d926d, 0x009888bd, 0x00e39120, 0x0009f236}}, Y: Field{[10]uint32{0x02d6eb91, 0x034ad088, 0x00090e90, 0x020484eb, 0x034d0c0a, 0x03783ffd, 0x009fe83f, 0x0121355b, 0x023fb8f2, 0x00221da3}}}, + {X: Field{[10]uint32{0x020067e5, 0x007aff81, 0x03a9155d, 0x0353c22d, 0x036ee768, 0x010955bb, 0x012e05ac, 0x008014bf, 0x030bbcd8, 0x003cd271}}, Y: Field{[10]uint32{0x010c6604, 0x0086939d, 0x009fb9f6, 0x02c1c75b, 0x0293fdc5, 0x01ebaa42, 0x003c4e9e, 0x0341431f, 0x00194011, 0x001b5657}}}, + {X: Field{[10]uint32{0x03b24f90, 0x0209e9c4, 0x03156edb, 0x00805ce9, 0x01a0183b, 0x030fe278, 0x031368ba, 0x0265998a, 0x027ab202, 0x00125995}}, Y: Field{[10]uint32{0x037e21ab, 0x01670cc0, 0x0094701f, 0x01645996, 0x01a097b8, 0x03020f8d, 0x0110ee76, 0x00eec252, 0x0036c2bb, 0x001bbe25}}}, + {X: Field{[10]uint32{0x013e0886, 0x01052fe4, 0x02eb69a7, 0x01d817fd, 0x0275611b, 0x02f18ffa, 0x0245b849, 0x0284fde1, 0x001b491d, 0x00124254}}, Y: Field{[10]uint32{0x01014df8, 0x02d96aa0, 0x03f17c54, 0x03dd7824, 0x0038b1ac, 0x0208ab17, 0x01d4c956, 0x001c3707, 0x02b6f2ee, 0x000b0831}}}, + {X: Field{[10]uint32{0x00cddb76, 0x0138d584, 0x01a72bf8, 0x023bb8f7, 0x03bd5f89, 0x03d058fd, 0x00d3ee40, 0x03450063, 0x0267f5a2, 0x0007b4b9}}, Y: Field{[10]uint32{0x02db8e7d, 0x024678c9, 0x027940f9, 0x03bda288, 0x02934810, 0x021a78db, 0x004babdd, 0x0133ab88, 0x00c564fa, 0x002ed25c}}}, + {X: Field{[10]uint32{0x0212f17b, 0x00758351, 0x03d5702a, 0x00361495, 0x00c15d1a, 0x037a1b5a, 0x01f9c8c7, 0x030dfeb7, 0x03410a0b, 0x00311eea}}, Y: Field{[10]uint32{0x02db09e3, 0x03baa068, 0x015cbb09, 0x019f3e0e, 0x00e84ce7, 0x028f30f8, 0x028091a1, 0x01f78444, 0x00b136f4, 0x000394ab}}}, + {X: Field{[10]uint32{0x027a7394, 0x03b1a831, 0x038c18f5, 0x03cf7484, 0x03f70825, 0x03b39d95, 0x0090b525, 0x033f10d5, 0x00c14993, 0x0038841a}}, Y: Field{[10]uint32{0x00c732da, 0x009c20c0, 0x00a12430, 0x03f276c1, 0x03065360, 0x017eadbe, 0x03997553, 0x02366caf, 0x0137d48f, 0x00335840}}}, + {X: Field{[10]uint32{0x03faf917, 0x01f93d0f, 0x03b87da0, 0x01bc47bb, 0x0200bd6a, 0x01942291, 0x029e1440, 0x00bd7ac1, 0x007d47a7, 0x0018d7d5}}, Y: Field{[10]uint32{0x03e64128, 0x00da48ca, 0x02642217, 0x015d53aa, 0x0021fecb, 0x0072c2fc, 0x024c8ed8, 0x01ced3cc, 0x01f23da2, 0x0023a82a}}}, + {X: Field{[10]uint32{0x01bdb47b, 0x0197c091, 0x02aa8485, 0x02ba4ca7, 0x013837b6, 0x00fe3993, 0x032f79ab, 0x02d2c7ff, 0x000a8648, 0x000918cb}}, Y: Field{[10]uint32{0x026e0426, 0x01b910bd, 0x03179814, 0x01d68e08, 0x02177ff8, 0x018aac8d, 0x02603608, 0x01574cf0, 0x0388c9e1, 0x00271b41}}}, + {X: Field{[10]uint32{0x037bf503, 0x03efde9a, 0x03b5ed59, 0x038574b0, 0x03146541, 0x032f2c06, 0x009cc56e, 0x00a75215, 0x01c3cfb2, 0x0010dd23}}, Y: Field{[10]uint32{0x01fb9c5c, 0x03cd3051, 0x019a9265, 0x01f86b7b, 0x000b2060, 0x0333623f, 0x007ea7f2, 0x026418ee, 0x01ed23a0, 0x00265d68}}}, + {X: Field{[10]uint32{0x03ae3ac0, 0x03ff72b0, 0x03a5804b, 0x03404549, 0x02bb8750, 0x026f8776, 0x0203b406, 0x0075a0c5, 0x0323b8c4, 0x0023e120}}, Y: Field{[10]uint32{0x02d1b37f, 0x020a22b0, 0x01c6e2c8, 0x00e8a95d, 0x01be81f8, 0x005f9691, 0x035805ab, 0x01830a1b, 0x00871282, 0x001dea2b}}}, + {X: Field{[10]uint32{0x0148422c, 0x0254ae8a, 0x012cc6e2, 0x036f1510, 0x002d8907, 0x00706720, 0x01e8be48, 0x0211b6ed, 0x0368b54d, 0x000a7af0}}, Y: Field{[10]uint32{0x03c7e845, 0x00bf898d, 0x0310aec7, 0x0285a180, 0x02426f79, 0x01e72f46, 0x02eb2d6f, 0x0276414e, 0x03a281d5, 0x0039ade4}}}, + {X: Field{[10]uint32{0x023ed345, 0x01e659c0, 0x008105ba, 0x000a7e39, 0x03d84bc6, 0x02dc5254, 0x00cbe21e, 0x0004b230, 0x03c4ccf4, 0x00250532}}, Y: Field{[10]uint32{0x017fdeee, 0x027ae035, 0x0272b39b, 0x0192edab, 0x01da45bb, 0x0338d72f, 0x0132790e, 0x028424b4, 0x039289e4, 0x002b47ba}}}, + {X: Field{[10]uint32{0x008f756e, 0x030f71ca, 0x035d411e, 0x02976c79, 0x000bea90, 0x003c8532, 0x03ab8149, 0x00009184, 0x025b769d, 0x0006f615}}, Y: Field{[10]uint32{0x01d375d8, 0x0085d770, 0x02b131df, 0x035f7315, 0x00b69c2c, 0x02af6b94, 0x01cfcb02, 0x007a46de, 0x006cfc78, 0x00301429}}}, + {X: Field{[10]uint32{0x0229cb01, 0x03b242c1, 0x013f276c, 0x038ca216, 0x0314ed0a, 0x02e37b59, 0x0009154e, 0x019af8f5, 0x004c35ad, 0x00013dd6}}, Y: Field{[10]uint32{0x03712bb0, 0x007acf05, 0x02048fb0, 0x03863c76, 0x021520fe, 0x0271685f, 0x00cf1b3e, 0x00483847, 0x0248232a, 0x003d2fa4}}}, + {X: Field{[10]uint32{0x01d9f13b, 0x031e0f87, 0x02b352b9, 0x021311dc, 0x01cffd16, 0x034bcf3b, 0x0127401f, 0x02cc5eac, 0x01de7e85, 0x0016c002}}, Y: Field{[10]uint32{0x0173ba64, 0x0048ca2e, 0x0048dbb4, 0x02fbb3f8, 0x01cb8839, 0x019cb1e3, 0x037cb7ce, 0x030d38cd, 0x0304f531, 0x003d1615}}}, + {X: Field{[10]uint32{0x03b32815, 0x00ef2b18, 0x019c3ad1, 0x014cfcfb, 0x0037f853, 0x0088b7ce, 0x025fdbc4, 0x01bc04ba, 0x01c37939, 0x00319bcc}}, Y: Field{[10]uint32{0x02b22668, 0x0334f69b, 0x01ca3ea1, 0x0212eeb1, 0x024113ee, 0x02d41490, 0x023ca861, 0x03a72f04, 0x00084ae5, 0x0001f5ee}}}, + {X: Field{[10]uint32{0x0263abd6, 0x03217997, 0x03af1a57, 0x0157a469, 0x023d7ba4, 0x03a679a5, 0x03a51b3e, 0x0264d09a, 0x035dc8b0, 0x000cc25f}}, Y: Field{[10]uint32{0x0270d7c4, 0x00d648b0, 0x02d80638, 0x03b59b93, 0x02987401, 0x0061a5d9, 0x039e1206, 0x00627722, 0x033b200c, 0x003ef49a}}}, + {X: Field{[10]uint32{0x005ffff4, 0x0374aa72, 0x015f8c37, 0x002e138e, 0x01aa71cf, 0x03eef90f, 0x02922d5f, 0x03b182e6, 0x0245a3b7, 0x0006b394}}, Y: Field{[10]uint32{0x0325084f, 0x0113686e, 0x029871c4, 0x01344358, 0x0006ad3f, 0x01b2eda7, 0x01c51cbb, 0x023e6fca, 0x01679470, 0x001cb03b}}}, + {X: Field{[10]uint32{0x030c4471, 0x0296bcda, 0x03512692, 0x00cb354b, 0x006ed54e, 0x00fe480b, 0x03225249, 0x0130b2fe, 0x039e4cce, 0x002f065e}}, Y: Field{[10]uint32{0x01673f70, 0x00213ef7, 0x017dfadb, 0x02553574, 0x013cad9b, 0x03b14222, 0x016be56c, 0x00197693, 0x02635182, 0x003544dd}}}, + {X: Field{[10]uint32{0x00c7df70, 0x0342f237, 0x03fab76a, 0x0002de69, 0x0213c6f5, 0x03b2b625, 0x00cfa733, 0x036fb45d, 0x0131334b, 0x0019a65e}}, Y: Field{[10]uint32{0x0199435a, 0x026f4b19, 0x003310d4, 0x037c9a50, 0x00ab00af, 0x0012b158, 0x03e7d3a5, 0x00663bb8, 0x0301948e, 0x003f6f4c}}}, + {X: Field{[10]uint32{0x026eb4bf, 0x020f30c6, 0x008b3890, 0x00bcdc2c, 0x02563742, 0x0040fde6, 0x020b9620, 0x020be5f0, 0x00dfb38d, 0x000eea1b}}, Y: Field{[10]uint32{0x0258dfc8, 0x035ab48c, 0x02fee33d, 0x00aaf7b2, 0x035377e3, 0x02d1db86, 0x017f9819, 0x02ec4e6f, 0x001176de, 0x002b3b26}}}, + {X: Field{[10]uint32{0x031603cd, 0x024c36fb, 0x01243fed, 0x027ddba0, 0x02639519, 0x00b64575, 0x03acdbdc, 0x01c76130, 0x032f9db9, 0x0003d890}}, Y: Field{[10]uint32{0x027b5f28, 0x0031e5d2, 0x02444c2e, 0x013bac46, 0x0282269f, 0x037a1d5f, 0x0056acd5, 0x01331b96, 0x033d177b, 0x003ba273}}}, + {X: Field{[10]uint32{0x0067bbaf, 0x02bbaa70, 0x00b1d688, 0x0141e538, 0x01b6d812, 0x016ca028, 0x016e6500, 0x03a9182b, 0x03dc6a6d, 0x00212d06}}, Y: Field{[10]uint32{0x03c00e7c, 0x03090e67, 0x032b2ab8, 0x01b97343, 0x03e452fe, 0x017c3c32, 0x008cdf7b, 0x02d2ecae, 0x003cb535, 0x0027de1c}}}, + {X: Field{[10]uint32{0x009d4c67, 0x010b06b2, 0x01f8828a, 0x02b294e6, 0x01048c52, 0x022e3515, 0x00f48839, 0x0128538a, 0x02a93ea6, 0x00238b7f}}, Y: Field{[10]uint32{0x02781271, 0x0169267c, 0x02ff7593, 0x01d3da77, 0x03e09d74, 0x023b413a, 0x01df10dd, 0x00d814cd, 0x0149cda5, 0x003fb005}}}, + {X: Field{[10]uint32{0x03105e0b, 0x009dd666, 0x012f118b, 0x028903a4, 0x01dbd2f6, 0x032f0be8, 0x0175e364, 0x02b074ff, 0x01ae5401, 0x0030ef1b}}, Y: Field{[10]uint32{0x0363d6b4, 0x01430fce, 0x00c340a6, 0x0122dbc3, 0x019c5dba, 0x000dc02c, 0x02345063, 0x024c9bf4, 0x00f55b73, 0x0005c3f7}}}, + {X: Field{[10]uint32{0x03c14691, 0x03b32268, 0x0395da10, 0x03b7a4d5, 0x00c2defc, 0x009ffe04, 0x01a289e0, 0x014b9eb1, 0x02931b1e, 0x000cc24f}}, Y: Field{[10]uint32{0x00deec38, 0x021e9fdc, 0x0047a7ee, 0x002f5a2f, 0x0102114f, 0x02b843ee, 0x03dc8421, 0x017af699, 0x01845bd5, 0x001feee9}}}, + {X: Field{[10]uint32{0x00141ef9, 0x03f9cd36, 0x00208a36, 0x00cbb2f3, 0x013f1211, 0x031e3762, 0x02c765ed, 0x028f3801, 0x0038b6d1, 0x00086cd5}}, Y: Field{[10]uint32{0x02e300d0, 0x01afc1ba, 0x02a7f256, 0x02f8ec59, 0x01e2d516, 0x01bed423, 0x01a82b36, 0x01f723d8, 0x01a5ed23, 0x0003d845}}}, + {X: Field{[10]uint32{0x03892df3, 0x020bf1b4, 0x008de037, 0x008470b9, 0x03ade708, 0x023a793e, 0x0248edf2, 0x03b45cc0, 0x0183aa1b, 0x0033b599}}, Y: Field{[10]uint32{0x00fdec96, 0x0239ce06, 0x031b6cb3, 0x00d4901f, 0x02c3a818, 0x03110710, 0x03e634e3, 0x0280efc3, 0x0136f29d, 0x0013d0eb}}}, + {X: Field{[10]uint32{0x026f71f8, 0x0215cefb, 0x03ec023a, 0x01f333ca, 0x0337f6eb, 0x027ef32b, 0x02731222, 0x02a2bac1, 0x0020f541, 0x003169d1}}, Y: Field{[10]uint32{0x00adb259, 0x01921958, 0x017096c8, 0x00d524d3, 0x021612a5, 0x0097e964, 0x00a6e25d, 0x00f4db00, 0x00024426, 0x002b98d3}}}, + {X: Field{[10]uint32{0x00b9de9e, 0x012eb052, 0x0212ef0a, 0x007f1334, 0x008311c5, 0x016c57a9, 0x03255211, 0x01ad2ca9, 0x008bf30f, 0x000c1281}}, Y: Field{[10]uint32{0x023bb3cd, 0x02c19781, 0x03fec154, 0x0216c848, 0x0311ceeb, 0x02a54fea, 0x01cb5dc8, 0x02fc344a, 0x01003d6e, 0x0023e4d6}}}, + {X: Field{[10]uint32{0x039c2048, 0x02fef356, 0x0251972e, 0x03c4eec1, 0x016ecb66, 0x01e047a4, 0x009875e9, 0x002bd42b, 0x01ae7eba, 0x003fe5ad}}, Y: Field{[10]uint32{0x0352a887, 0x00678bd8, 0x00e3c319, 0x0321c3f5, 0x033de89c, 0x015abb46, 0x00a0b1db, 0x0073ab96, 0x0186bca7, 0x00092bc8}}}, + {X: Field{[10]uint32{0x01b701a3, 0x037389ec, 0x035d050b, 0x02e5282c, 0x028b6d38, 0x01bf6cf3, 0x01472437, 0x00bbb410, 0x021cdf73, 0x00164273}}, Y: Field{[10]uint32{0x0224dfdf, 0x0301782c, 0x012b037f, 0x02eefdde, 0x037d3731, 0x000e0e8f, 0x01cf2239, 0x039d8609, 0x01440665, 0x0000b912}}}, + {X: Field{[10]uint32{0x03d1d527, 0x01acc3aa, 0x01ad7cfb, 0x01d32bc1, 0x0008ef99, 0x00a11152, 0x02032b79, 0x019841be, 0x031f86d6, 0x003fdadd}}, Y: Field{[10]uint32{0x008ba4b3, 0x03c109e4, 0x03f50b25, 0x02b8d512, 0x029fcd0b, 0x03a7daa1, 0x037e0557, 0x03a473fd, 0x029c9393, 0x001aaf4a}}}, + {X: Field{[10]uint32{0x021aa8d9, 0x035f48ce, 0x005f4bef, 0x0215f9ff, 0x03be9196, 0x00b66b39, 0x03da48a1, 0x007eb47b, 0x030494dd, 0x00250f33}}, Y: Field{[10]uint32{0x020a7bd6, 0x0044d306, 0x01c523d0, 0x007161e4, 0x006014e0, 0x029f93c4, 0x011a23fc, 0x00fe2cdd, 0x00cc2dd9, 0x0013c22d}}}, + {X: Field{[10]uint32{0x005f172c, 0x03127dd0, 0x035b3ee6, 0x022c7672, 0x0147a463, 0x03c9b0d0, 0x00e0968b, 0x00737242, 0x03a7a89e, 0x00029e69}}, Y: Field{[10]uint32{0x03bb8ceb, 0x03ba43fc, 0x00cd1b3c, 0x01dae60e, 0x03ebadcb, 0x0300c96c, 0x0097f34e, 0x02f8eb95, 0x016714b5, 0x0032d4f6}}}, + {X: Field{[10]uint32{0x007b89dd, 0x03014547, 0x01b2fa50, 0x00daa8cf, 0x024f548b, 0x005cfde2, 0x021667cd, 0x01bbeaa1, 0x02fc7117, 0x000a3fcb}}, Y: Field{[10]uint32{0x02fe4941, 0x03889275, 0x01988dc6, 0x02ccdf5e, 0x038e67cd, 0x0235f6f7, 0x005e1656, 0x02857c52, 0x0307db4b, 0x0011d6cd}}}, + {X: Field{[10]uint32{0x01012968, 0x021facec, 0x03557f86, 0x01ebc2b9, 0x00223e89, 0x016d3280, 0x0304fa25, 0x01a21701, 0x033216a8, 0x00216cb0}}, Y: Field{[10]uint32{0x0257ea11, 0x0175cd75, 0x015c5704, 0x039e6341, 0x021f2bcb, 0x003bd1e7, 0x03cbe7af, 0x01015bbe, 0x0145ba66, 0x00287d63}}}, + {X: Field{[10]uint32{0x00bb8778, 0x01c32697, 0x01d47c2a, 0x03834d53, 0x027a02b3, 0x01ef4da4, 0x028e2add, 0x00cb7901, 0x0109eefb, 0x003a7f0b}}, Y: Field{[10]uint32{0x0365c312, 0x003b1696, 0x01cdf80d, 0x03b2f632, 0x00f249d7, 0x03d4f33d, 0x02e219bb, 0x0341a00f, 0x02a51216, 0x003b8026}}}, + {X: Field{[10]uint32{0x00005d9e, 0x0010be68, 0x02d65763, 0x0341883f, 0x02a1cc88, 0x0288a142, 0x0238af95, 0x00434c9b, 0x0350afd5, 0x00368b72}}, Y: Field{[10]uint32{0x033eaeab, 0x0007af84, 0x014436d5, 0x026ac5b2, 0x01ae0eab, 0x004c237a, 0x016af23f, 0x00258d78, 0x03b1c370, 0x0007bbd1}}}, + {X: Field{[10]uint32{0x02b352e0, 0x01f68f07, 0x02f08b9b, 0x034ffded, 0x02327891, 0x0021cd59, 0x03174027, 0x019baf39, 0x029cc6b1, 0x000836a8}}, Y: Field{[10]uint32{0x02e8a3fb, 0x0374fdde, 0x027a4299, 0x00981370, 0x02a30cb5, 0x00b0e8c9, 0x01d66929, 0x03e937b0, 0x002cecd6, 0x000bfda6}}}, + {X: Field{[10]uint32{0x03674d9b, 0x00bafdd4, 0x00bdd71b, 0x0101b30d, 0x023aab84, 0x025be7d3, 0x0147a534, 0x02f84d9d, 0x00dd2ae5, 0x00385ac2}}, Y: Field{[10]uint32{0x03a06846, 0x01e87646, 0x02c1d931, 0x0322dc4d, 0x0248a1af, 0x00d5ed6e, 0x003d60d6, 0x00ac7239, 0x024bd952, 0x002dc3dc}}}, + {X: Field{[10]uint32{0x016b93d3, 0x014d59f9, 0x00475807, 0x03b00f1a, 0x00c59670, 0x002c1b51, 0x039485e0, 0x036cd03f, 0x01af2d69, 0x0022228b}}, Y: Field{[10]uint32{0x01d4e3f5, 0x01e7ed8c, 0x01a9e9ba, 0x0212de52, 0x028e8043, 0x02c9c6ae, 0x00753f05, 0x002e0ab1, 0x03a7792e, 0x00376f93}}}, + {X: Field{[10]uint32{0x016abd12, 0x035831d8, 0x01704d50, 0x0032fd0f, 0x02ee6d8e, 0x00c7e5ec, 0x022e3081, 0x03f754b0, 0x00e29090, 0x001d1dda}}, Y: Field{[10]uint32{0x00b61058, 0x02eb1827, 0x0384099d, 0x01172338, 0x0227b266, 0x03b9ffcd, 0x012879e5, 0x0382d2ed, 0x03408d1c, 0x003aa9d7}}}, + {X: Field{[10]uint32{0x018d6eda, 0x01f5e73f, 0x011435a1, 0x0163e44c, 0x0380897a, 0x01f00307, 0x0337cc88, 0x004c6a34, 0x02ac1c7d, 0x00215a7c}}, Y: Field{[10]uint32{0x03eacf71, 0x01fb5b60, 0x01a8edda, 0x02aa9397, 0x0385e43b, 0x011a8ce4, 0x00e700a7, 0x001ba0be, 0x0344252d, 0x001413c2}}}, + {X: Field{[10]uint32{0x011860c9, 0x035a1078, 0x00591e57, 0x03e2f920, 0x00c4418d, 0x010a6e1d, 0x00a1d680, 0x0087713f, 0x03f9a672, 0x0013c57c}}, Y: Field{[10]uint32{0x0096b7ed, 0x02571529, 0x02a820b7, 0x02f13318, 0x013f1154, 0x01f4a418, 0x02bda108, 0x02a70685, 0x01561783, 0x00260b03}}}, + {X: Field{[10]uint32{0x004a92ce, 0x02fdf005, 0x019439e1, 0x036ea909, 0x0204e4f9, 0x03dc9635, 0x03d56ce6, 0x01b878fa, 0x02201f22, 0x00087946}}, Y: Field{[10]uint32{0x01aac869, 0x011c1e5d, 0x0235918d, 0x019d144d, 0x02428f31, 0x0326f42a, 0x001486fe, 0x0292b497, 0x0001b6a5, 0x001311ea}}}, + {X: Field{[10]uint32{0x000211a0, 0x00a84627, 0x01f2ed5e, 0x00d8e56f, 0x03e0f283, 0x03fdafe2, 0x034c4f9d, 0x03b03342, 0x002e8865, 0x003eb1f9}}, Y: Field{[10]uint32{0x00dd695e, 0x01aee8b1, 0x025c641e, 0x02dceeb5, 0x02ce656f, 0x0265cc1e, 0x01fece11, 0x00667bec, 0x019c8337, 0x000da04b}}}, + {X: Field{[10]uint32{0x0226d225, 0x01915246, 0x03469910, 0x00b5ee72, 0x0257f0f4, 0x010b4a7b, 0x01686714, 0x031dfb31, 0x039ec91b, 0x002851e0}}, Y: Field{[10]uint32{0x005bc5a4, 0x001dc2b2, 0x02edab73, 0x0138bc53, 0x02fc0d06, 0x028a7f06, 0x0120257f, 0x019fc618, 0x010ebf72, 0x003d010d}}}, + {X: Field{[10]uint32{0x00636b8c, 0x02790706, 0x01e2bdf1, 0x003dc5ab, 0x0344a790, 0x00563cf8, 0x0083c1f4, 0x01a01112, 0x00f9e508, 0x0034484b}}, Y: Field{[10]uint32{0x03fc0964, 0x00eb2c09, 0x02ec0555, 0x03203a31, 0x022f9c21, 0x00c8d71a, 0x00183a0f, 0x0059944a, 0x005107b9, 0x0001c82e}}}, + {X: Field{[10]uint32{0x03948975, 0x027fa422, 0x03ce72dd, 0x03282249, 0x022e4852, 0x00681f5e, 0x037c1250, 0x0095e025, 0x0334a7ab, 0x0004f57c}}, Y: Field{[10]uint32{0x018773ca, 0x01edbade, 0x0282a7d8, 0x014d1e7f, 0x02ff9987, 0x03a30e05, 0x0231db1a, 0x02aed473, 0x01e2d1d0, 0x0025ce1a}}}, + {X: Field{[10]uint32{0x0063507d, 0x02f7ec39, 0x007e6b9a, 0x0294d31e, 0x025ec754, 0x01af084d, 0x029bec32, 0x027a39da, 0x01616dae, 0x0007c19a}}, Y: Field{[10]uint32{0x035b262d, 0x03473471, 0x013ceb5b, 0x01d02ccd, 0x03c6f999, 0x0264ea6f, 0x01f9fc12, 0x00447e20, 0x030eb4ea, 0x00369201}}}, + {X: Field{[10]uint32{0x01150269, 0x02ab57da, 0x020298d4, 0x03400453, 0x01907b15, 0x027e5d7d, 0x02d9a495, 0x00770f12, 0x01873868, 0x0001ca78}}, Y: Field{[10]uint32{0x01455442, 0x001967e3, 0x003f2456, 0x020a7a36, 0x02c1901c, 0x02c0d69f, 0x020022c8, 0x02806db7, 0x018ec60e, 0x0036fcbb}}}, + {X: Field{[10]uint32{0x01fda12a, 0x0085a1c7, 0x02fa02ee, 0x03bb0810, 0x028e3692, 0x03864309, 0x002435fd, 0x00d1dd35, 0x03e96135, 0x003a4bf2}}, Y: Field{[10]uint32{0x0164f2ff, 0x014b320b, 0x01a84fb8, 0x01447c07, 0x03585b14, 0x039bb173, 0x02369575, 0x02035907, 0x000e3f52, 0x0029d6d7}}}, + {X: Field{[10]uint32{0x00da36df, 0x0204b532, 0x01c1c789, 0x0335fcad, 0x001ad35b, 0x00fdae41, 0x004dfbf9, 0x0234e7a7, 0x021ac69f, 0x002170b9}}, Y: Field{[10]uint32{0x00b53f45, 0x03eaecf0, 0x03752f38, 0x036efca5, 0x02575264, 0x00caac46, 0x00a50b33, 0x00a78697, 0x01876944, 0x00329b64}}}, + {X: Field{[10]uint32{0x011bc05c, 0x0051f86f, 0x0024f10f, 0x016021e7, 0x003adf99, 0x016b93c0, 0x01c2791b, 0x031ad03d, 0x0232c33c, 0x0004345d}}, Y: Field{[10]uint32{0x039a687d, 0x00b24a64, 0x01718a8b, 0x013cc481, 0x000be846, 0x02393170, 0x01bae008, 0x03b1bd17, 0x0334f1dd, 0x003857b9}}}, + {X: Field{[10]uint32{0x025d609a, 0x03b21af8, 0x036f028f, 0x035a09d1, 0x0092511d, 0x01fa82ef, 0x01820bd2, 0x0225cbce, 0x03452593, 0x0029a508}}, Y: Field{[10]uint32{0x0311d6e9, 0x01cc20d3, 0x016bd0ea, 0x01b02d4a, 0x00af49ee, 0x0095b2d2, 0x036d1b66, 0x01cfd24f, 0x0216870f, 0x00381acd}}}, + {X: Field{[10]uint32{0x0394d8ac, 0x019b6237, 0x0190604f, 0x01d5aec3, 0x03c401a6, 0x016db131, 0x02ba0524, 0x02b8fd0f, 0x00ed2b3d, 0x002d29f6}}, Y: Field{[10]uint32{0x00963456, 0x00291b64, 0x01ecfd2b, 0x00138429, 0x01074dcb, 0x0341ebcd, 0x03def119, 0x036d6bf5, 0x00631a2c, 0x003ff207}}}, + {X: Field{[10]uint32{0x01a6fd17, 0x0078aaf7, 0x01266303, 0x03fd613c, 0x03f84fb2, 0x026a9574, 0x01cb660d, 0x00f15ca1, 0x021daebd, 0x0016baf8}}, Y: Field{[10]uint32{0x02f1abe8, 0x03366676, 0x00ff6d9d, 0x03bdecd7, 0x038f5994, 0x03572114, 0x0178c40c, 0x02d4c834, 0x01136a51, 0x00008ba9}}}, + {X: Field{[10]uint32{0x008c7f87, 0x00c5b9cb, 0x01c51278, 0x00360e18, 0x0269388d, 0x01158ea9, 0x016d64cb, 0x022356de, 0x02641943, 0x002b1a11}}, Y: Field{[10]uint32{0x02f41ac1, 0x004eace7, 0x02e5ff89, 0x02209961, 0x034d7109, 0x03da4fa4, 0x03bf1143, 0x002c0425, 0x02d82dc9, 0x0032e509}}}, + {X: Field{[10]uint32{0x00955250, 0x00855f09, 0x028356b8, 0x0190589f, 0x0176ad27, 0x009f3a2a, 0x00c58c2f, 0x0398861d, 0x01490f89, 0x001be52f}}, Y: Field{[10]uint32{0x007c5614, 0x037cfe6f, 0x012ec0d8, 0x02163b03, 0x01e3633a, 0x03e188bd, 0x03d9cf68, 0x0371f171, 0x00ce4a54, 0x003490cc}}}, + {X: Field{[10]uint32{0x0008f137, 0x01024168, 0x02fa9d09, 0x0229e168, 0x00775e06, 0x02b17fd1, 0x019ec5c9, 0x0251e81b, 0x008ce149, 0x0000fe5b}}, Y: Field{[10]uint32{0x005f3f40, 0x003ab320, 0x00ce2b12, 0x0100c380, 0x009b7d9e, 0x00d8327f, 0x03613d4e, 0x029418f3, 0x03af7111, 0x002a4773}}}, + {X: Field{[10]uint32{0x039c707d, 0x01c2565d, 0x033c8f34, 0x01866ca9, 0x00405a5b, 0x0124265d, 0x022a4c17, 0x01d74ee1, 0x005cdfd6, 0x0036016c}}, Y: Field{[10]uint32{0x003b6865, 0x0233b20f, 0x03a66b6d, 0x03c40f30, 0x0184366e, 0x02edff2c, 0x022abdbf, 0x027cb78e, 0x004cc727, 0x0029a2d5}}}, + {X: Field{[10]uint32{0x039df0e4, 0x02f8d381, 0x031d4808, 0x00cdbcbd, 0x03591422, 0x01d2afa6, 0x020efa78, 0x0272d9af, 0x000bd418, 0x00348a4f}}, Y: Field{[10]uint32{0x012682b1, 0x0301a3c8, 0x0131318c, 0x0268ff83, 0x017f24f7, 0x033a8e1c, 0x03fe70a5, 0x012582e6, 0x024887c5, 0x0017ef0c}}}, + {X: Field{[10]uint32{0x03209d5f, 0x032b6716, 0x016570fa, 0x03ed55be, 0x01e3f107, 0x01dacf17, 0x0149d26e, 0x008ff9eb, 0x010be226, 0x0024c7c2}}, Y: Field{[10]uint32{0x031cc087, 0x034685d2, 0x00144d5a, 0x03006143, 0x01848f57, 0x006ba8e5, 0x01daf748, 0x02626619, 0x0279d2a8, 0x00330957}}}, + {X: Field{[10]uint32{0x01e5ddc9, 0x0165cc8e, 0x00987a03, 0x002b6cd0, 0x006e4e69, 0x021500e9, 0x02a72f62, 0x03fdaf23, 0x02836707, 0x00046298}}, Y: Field{[10]uint32{0x03ff818b, 0x0086603d, 0x027ad722, 0x02361704, 0x00b6f5a1, 0x0365abe1, 0x039d4470, 0x024160db, 0x03e5e65a, 0x00247c03}}}, + {X: Field{[10]uint32{0x036a985a, 0x0071a907, 0x014be189, 0x00b4b998, 0x01b811ca, 0x03475278, 0x014ba420, 0x02d26b40, 0x00eb5b6c, 0x0020425b}}, Y: Field{[10]uint32{0x03607e5d, 0x03fa5c2d, 0x038f5b4d, 0x0181ac12, 0x003f4948, 0x00d52d9d, 0x0050a3c1, 0x03cf95e0, 0x01c5f8f9, 0x00036814}}}, + {X: Field{[10]uint32{0x000cae06, 0x0042624c, 0x0068b9f4, 0x010db771, 0x00351b7e, 0x020fad1f, 0x013559e7, 0x017b58b7, 0x00385ff4, 0x0026a029}}, Y: Field{[10]uint32{0x0004b6d0, 0x015efe2e, 0x01cad30e, 0x01678f90, 0x00bee656, 0x003154e6, 0x028aee8b, 0x02716d18, 0x039921b6, 0x00211747}}}, + {X: Field{[10]uint32{0x02747906, 0x009023d1, 0x0209081c, 0x0137eeed, 0x02214395, 0x007a57fa, 0x02c1d596, 0x0156e5fe, 0x00f3b899, 0x001a8c5a}}, Y: Field{[10]uint32{0x00ccc005, 0x00f15ca3, 0x01403c48, 0x007a0475, 0x02012c74, 0x00b2406d, 0x0244a3f8, 0x03c420eb, 0x03886778, 0x0016d7c7}}}, + {X: Field{[10]uint32{0x01214af8, 0x002a43f8, 0x018a73db, 0x03fbd3e3, 0x03797710, 0x022f23b5, 0x03d42985, 0x0196e88e, 0x031178d1, 0x002680ea}}, Y: Field{[10]uint32{0x01e85665, 0x00ad6f22, 0x0265ca65, 0x00287542, 0x0159a555, 0x02955bd4, 0x0112f2bf, 0x012fd245, 0x00e7e61e, 0x001c2223}}}, + {X: Field{[10]uint32{0x00ea2f5d, 0x01e3bdbd, 0x00e25e78, 0x01066477, 0x01296c8c, 0x0230525c, 0x02615754, 0x03678566, 0x018d78b8, 0x00232430}}, Y: Field{[10]uint32{0x031ca074, 0x005220b2, 0x01a68028, 0x03e6da42, 0x032b97c0, 0x036edc89, 0x0244a5e5, 0x02394685, 0x00cfde62, 0x000a950a}}}, + {X: Field{[10]uint32{0x008a8957, 0x035b74d4, 0x01d43b68, 0x008cce7f, 0x00933279, 0x000b27b4, 0x037a5daa, 0x00093613, 0x037f3062, 0x000ba6ea}}, Y: Field{[10]uint32{0x02a43345, 0x011d4c34, 0x02aca4a1, 0x023268dd, 0x03ea7e4f, 0x0148ecb7, 0x01e21f19, 0x000f27c8, 0x00b73f38, 0x00326be0}}}, + {X: Field{[10]uint32{0x02466322, 0x005d9c66, 0x0384db5c, 0x0260d0eb, 0x03e21298, 0x03ef9a8d, 0x0295e7c1, 0x033fbd92, 0x032e718e, 0x0009cd2f}}, Y: Field{[10]uint32{0x0284216e, 0x018d8c79, 0x03ca8f0a, 0x012f7e28, 0x007d0a1e, 0x01a5cc4b, 0x02a0ce34, 0x017c338d, 0x018a9f11, 0x003d4c02}}}, + {X: Field{[10]uint32{0x016aab58, 0x030a9475, 0x000d5e21, 0x01ee323d, 0x004af325, 0x01e6d485, 0x001b9975, 0x012939ba, 0x02f9500e, 0x002ae7b2}}, Y: Field{[10]uint32{0x01e0f047, 0x0035470f, 0x01bc3ff3, 0x039d5d0f, 0x01d0aaed, 0x00e2a216, 0x015e9d19, 0x0061126f, 0x03468e08, 0x003df4e1}}}, + {X: Field{[10]uint32{0x031af368, 0x0190d6b2, 0x000c0169, 0x01353a11, 0x00292b4d, 0x016eaa20, 0x029cd3e8, 0x027bcb96, 0x0146a4c0, 0x002b897d}}, Y: Field{[10]uint32{0x03f3da84, 0x004157bd, 0x03d59e05, 0x03c84404, 0x0080bd59, 0x0254f1b1, 0x039a9f22, 0x02103edc, 0x03b37373, 0x0011a8ac}}}, + {X: Field{[10]uint32{0x012e6142, 0x020f7070, 0x00ace54a, 0x02cafb01, 0x034e35ab, 0x0213f003, 0x017efaa8, 0x00736bd6, 0x01a64ef2, 0x00150a17}}, Y: Field{[10]uint32{0x00cdbc3d, 0x002db0c8, 0x03f6e522, 0x0124351b, 0x00b962a8, 0x00897757, 0x03c2dc29, 0x01ed6e91, 0x02b2144d, 0x000120ef}}}, + {X: Field{[10]uint32{0x03dca65e, 0x03ad984d, 0x00874c8d, 0x03ba8a45, 0x0035a627, 0x01a9e15f, 0x02d542ed, 0x008c7d82, 0x003404bc, 0x002fb3a1}}, Y: Field{[10]uint32{0x022f6a95, 0x00bd3acf, 0x034f8e9c, 0x02b6934e, 0x00fe1c93, 0x03820495, 0x0077fb8d, 0x039cbe39, 0x038002f9, 0x00288a7e}}}, + {X: Field{[10]uint32{0x035e81d1, 0x03672d3e, 0x0326b26f, 0x00b6b9b0, 0x0389994a, 0x03a082ef, 0x02fe5af1, 0x02e15d1c, 0x0347b148, 0x0000f555}}, Y: Field{[10]uint32{0x01e465df, 0x000073ef, 0x0052db90, 0x03efbf56, 0x03c9ea7d, 0x02cac58b, 0x035bc4f1, 0x00a293d8, 0x025ae867, 0x0037b7b2}}}, + {X: Field{[10]uint32{0x01cde5d4, 0x025f73dd, 0x01715fbc, 0x0080cd1d, 0x021846b5, 0x022fda9c, 0x036361a8, 0x00f1cd67, 0x0219d163, 0x0004f1a0}}, Y: Field{[10]uint32{0x03f83af4, 0x0104fe4d, 0x02e55935, 0x038aacad, 0x03bddf0c, 0x00b5e7a7, 0x02bfe7c5, 0x01fc825a, 0x00c239fc, 0x0033a28f}}}, + {X: Field{[10]uint32{0x01b0a6ac, 0x014049b5, 0x03433436, 0x00a6fa0d, 0x0036690a, 0x02ad4bc6, 0x00c481ad, 0x00691c9d, 0x02e1a804, 0x003a7902}}, Y: Field{[10]uint32{0x00c6bb7f, 0x0191bc8e, 0x029a9577, 0x008a9576, 0x019a22fa, 0x012451f3, 0x031f3147, 0x00e6e04d, 0x00b79c98, 0x00306656}}}, + {X: Field{[10]uint32{0x01493068, 0x006d3228, 0x00eea632, 0x01c6689a, 0x0113af43, 0x0236d872, 0x0353a537, 0x028697dc, 0x01537460, 0x000b8ed1}}, Y: Field{[10]uint32{0x03a54dcf, 0x014b1772, 0x01bb6e04, 0x03cadbed, 0x015ccf5c, 0x02439540, 0x019d3e22, 0x019b2125, 0x02561049, 0x003dee97}}}, + {X: Field{[10]uint32{0x034c62b8, 0x03c3d202, 0x0091edb1, 0x03713329, 0x026a59f3, 0x03d9c373, 0x02aa40eb, 0x012c019f, 0x0082b921, 0x0026156f}}, Y: Field{[10]uint32{0x00fcf435, 0x03072033, 0x000098d4, 0x0084e11e, 0x0387184e, 0x02c1c580, 0x0237d6b5, 0x031cf3a7, 0x036e3be6, 0x0029f64f}}}, + {X: Field{[10]uint32{0x01253979, 0x03e11d85, 0x00866982, 0x03148cee, 0x0367486b, 0x0273c9f7, 0x004bee26, 0x00a44db5, 0x00a9b934, 0x000dfe08}}, Y: Field{[10]uint32{0x0070ca15, 0x01a28a1e, 0x0288b2a5, 0x00ee75ee, 0x0150dd89, 0x01f159a9, 0x0345a5a3, 0x0274ddfc, 0x029daa62, 0x003f72ba}}}, + {X: Field{[10]uint32{0x02d41a98, 0x02a747f7, 0x013b03cb, 0x028a8e13, 0x023e0cd0, 0x001c3167, 0x00f6ba28, 0x00ec31a4, 0x0098a92a, 0x003a0b4b}}, Y: Field{[10]uint32{0x00501460, 0x021af832, 0x0306095c, 0x03341852, 0x01d09d7e, 0x031f540b, 0x0033d344, 0x016cd852, 0x023232d8, 0x000c79ce}}}, + {X: Field{[10]uint32{0x02923419, 0x024de666, 0x03f3a24b, 0x007ad002, 0x03ad4690, 0x03abb38e, 0x00711827, 0x032419a8, 0x03c36dd4, 0x002f524b}}, Y: Field{[10]uint32{0x01dd7798, 0x01a83240, 0x01af5fdc, 0x024ef349, 0x018b93da, 0x01ff5012, 0x036dbd0a, 0x03569199, 0x03c51e1f, 0x0032ab68}}}, + {X: Field{[10]uint32{0x0229577a, 0x03b4cae1, 0x039641cd, 0x0265ef7c, 0x00cd8f0d, 0x0169a720, 0x022c4dc1, 0x03b13cf2, 0x02da42d1, 0x001b22d1}}, Y: Field{[10]uint32{0x0318c956, 0x00900131, 0x030a97f1, 0x023b98ac, 0x01cbeb98, 0x02f2f08e, 0x02ef5965, 0x010b83dc, 0x0362729e, 0x0034eb53}}}, + {X: Field{[10]uint32{0x00f5dd62, 0x03af303e, 0x00f05ea9, 0x006ab432, 0x03effee7, 0x034d5ad3, 0x00a25d34, 0x034f7615, 0x01e6799b, 0x001e2c7a}}, Y: Field{[10]uint32{0x0131145d, 0x017e248e, 0x025c1dd2, 0x00adc0b9, 0x01d726ce, 0x028c0199, 0x03d70057, 0x02237301, 0x02d6a267, 0x000c540f}}}, + {X: Field{[10]uint32{0x02ebdccf, 0x01d3ba96, 0x00375c89, 0x0170057c, 0x03cb53fa, 0x03e92ada, 0x028cda6b, 0x0148f8f1, 0x02a663c5, 0x003cbb40}}, Y: Field{[10]uint32{0x00f36382, 0x039c968f, 0x03b67773, 0x02a3451d, 0x02937720, 0x00882b4c, 0x03922413, 0x000c838e, 0x01c3afdc, 0x0000ef79}}}, + {X: Field{[10]uint32{0x02caffd3, 0x00259f50, 0x02a60cde, 0x0005746a, 0x00f67ab1, 0x03fdae88, 0x0254d835, 0x0002fc1f, 0x0243a458, 0x001f90fd}}, Y: Field{[10]uint32{0x0398d68a, 0x00851655, 0x0079a76e, 0x004ad55a, 0x0158600d, 0x001ed49a, 0x03fbb378, 0x00ce66d5, 0x02da0f47, 0x0007d15b}}}, + {X: Field{[10]uint32{0x01319be8, 0x002d9598, 0x01d07643, 0x03299955, 0x017ccde2, 0x02d34b3a, 0x00c0a624, 0x00da5ea9, 0x01775eb7, 0x0037c578}}, Y: Field{[10]uint32{0x027311ad, 0x001e73ec, 0x00e53b35, 0x032ac5b9, 0x0108397c, 0x02983b8b, 0x0173dfb8, 0x00e06308, 0x00dcf154, 0x0000125b}}}, + {X: Field{[10]uint32{0x0382e2ae, 0x01fd9a71, 0x00fceef3, 0x03ee4685, 0x036707a3, 0x02503a12, 0x01c16487, 0x02ec804b, 0x03060295, 0x003b7c75}}, Y: Field{[10]uint32{0x02019a2e, 0x02a2593f, 0x00d7d239, 0x0263c239, 0x039ed8f5, 0x03a223ab, 0x00b2dd68, 0x01b25ec8, 0x02f6fcd7, 0x0038e83c}}}, + {X: Field{[10]uint32{0x02f8f6c0, 0x023ed705, 0x03c2d9b1, 0x0335aea1, 0x01fd92ce, 0x00f41193, 0x023c3137, 0x02087cef, 0x02b26b15, 0x00305408}}, Y: Field{[10]uint32{0x02136c2e, 0x01606f73, 0x02da9327, 0x0096a03f, 0x0065d57f, 0x00ba7e81, 0x03961e69, 0x00a10b81, 0x0370d94e, 0x001e3348}}}, + {X: Field{[10]uint32{0x036001d9, 0x01f69fb1, 0x01105e27, 0x032ed4b7, 0x00c6cc2b, 0x02a3e324, 0x01886a28, 0x00578042, 0x036bb6ae, 0x0002f537}}, Y: Field{[10]uint32{0x02f1446f, 0x021c9f63, 0x0387572f, 0x03736806, 0x03a6f6fa, 0x01b3b4b8, 0x00e50299, 0x032e596e, 0x01b2b0b4, 0x00126596}}}, + {X: Field{[10]uint32{0x03bc0b76, 0x0025c023, 0x03ed4b21, 0x02d3211a, 0x021e2d6e, 0x018bc603, 0x01f9b4f1, 0x02533949, 0x02328738, 0x0037f3b0}}, Y: Field{[10]uint32{0x01b4f92e, 0x03bc019a, 0x03b953f8, 0x0314cc90, 0x005a477e, 0x02842acf, 0x0318f059, 0x0239c670, 0x021bf4c8, 0x002bef1d}}}, + {X: Field{[10]uint32{0x01c94e54, 0x02c7fbfd, 0x008e1a9e, 0x00d5d939, 0x00b84739, 0x02e2d07f, 0x0259b005, 0x013eb88d, 0x004de3c9, 0x002c01db}}, Y: Field{[10]uint32{0x039c7d4f, 0x0288c203, 0x00551f3e, 0x0286e13a, 0x01fe17fd, 0x0120c282, 0x002ee5e4, 0x029a1dbd, 0x02553c55, 0x00387acc}}}, + {X: Field{[10]uint32{0x022d0c11, 0x0130fc36, 0x008be94b, 0x02c266fa, 0x020fe9eb, 0x03599e1e, 0x01e9fe33, 0x00957304, 0x029c17c4, 0x0002687f}}, Y: Field{[10]uint32{0x008e8379, 0x03d5a37a, 0x002b096a, 0x01b98b7c, 0x0325f6fd, 0x01eb472a, 0x023e1aac, 0x039ce5b8, 0x030999a8, 0x0039abbd}}}, + {X: Field{[10]uint32{0x01212899, 0x01ba7905, 0x030f2257, 0x01b9e658, 0x02e1d8b1, 0x01b19441, 0x0399b88b, 0x02f05766, 0x0134126b, 0x0007626a}}, Y: Field{[10]uint32{0x02f8f4eb, 0x02035669, 0x00fd7567, 0x0113b4db, 0x0137d646, 0x03657142, 0x01a79ef7, 0x001c883a, 0x025692db, 0x002df8c8}}}, + {X: Field{[10]uint32{0x000c7fa4, 0x02f90cdc, 0x000a6ac2, 0x015886f2, 0x02345469, 0x014c3b7e, 0x0062d4f7, 0x00de58f1, 0x0068b67b, 0x003183d7}}, Y: Field{[10]uint32{0x038a7e08, 0x01d6982f, 0x002c653f, 0x014d73b0, 0x03b5507b, 0x003724b4, 0x01b5a676, 0x03c38e86, 0x007197ff, 0x00223e2c}}}, + {X: Field{[10]uint32{0x02d9d949, 0x01f5b094, 0x02ec9e6b, 0x0073dda3, 0x03620576, 0x00c06f90, 0x036499ad, 0x009a646d, 0x036f0d9b, 0x0014b34a}}, Y: Field{[10]uint32{0x030ec835, 0x00084e00, 0x024aa138, 0x020bd51f, 0x02263563, 0x031e0ac9, 0x0111a3ea, 0x00d42283, 0x00661fa3, 0x003449f3}}}, + {X: Field{[10]uint32{0x0105dda9, 0x00d0091b, 0x03be920a, 0x02973d38, 0x01c21fbe, 0x0345aec6, 0x004f107f, 0x020d7fce, 0x019ea639, 0x00079112}}, Y: Field{[10]uint32{0x032d1f53, 0x0104b083, 0x0088d027, 0x008fa585, 0x018f8adf, 0x013f43c8, 0x00d12db7, 0x010be654, 0x00e90a90, 0x001071aa}}}, + {X: Field{[10]uint32{0x006861de, 0x009d50ff, 0x01cb1c67, 0x01595a81, 0x03984ecc, 0x01804dba, 0x0253bae3, 0x0252eb47, 0x00f0a563, 0x0004e451}}, Y: Field{[10]uint32{0x02d0742a, 0x03b4ed0b, 0x02dc1025, 0x0005ba87, 0x00964f3d, 0x03010aee, 0x03174ab6, 0x03a6c86f, 0x0337ff37, 0x001c0e51}}}, + {X: Field{[10]uint32{0x014a2280, 0x029d3e19, 0x02eb75a2, 0x0322db6d, 0x0134fe75, 0x018d39a1, 0x03cb9546, 0x037c6187, 0x002a2454, 0x0024d328}}, Y: Field{[10]uint32{0x03195761, 0x03e85736, 0x00be4375, 0x00e9af9e, 0x016865ce, 0x013f493c, 0x003caee7, 0x03f2802e, 0x0384266c, 0x001de7a5}}}, + {X: Field{[10]uint32{0x006a3be6, 0x034c9b62, 0x0279a7ac, 0x02a8b52d, 0x00af913b, 0x034d7b35, 0x01a8c329, 0x009165df, 0x007d9e1c, 0x002993c1}}, Y: Field{[10]uint32{0x01112b2b, 0x0052061e, 0x03581e60, 0x00263b15, 0x023210f3, 0x0091d677, 0x02145e3b, 0x03b5b440, 0x030ff3b4, 0x003847a0}}}, + {X: Field{[10]uint32{0x018757e1, 0x0150a3a0, 0x0034e2a1, 0x0312e2f5, 0x03cfcf45, 0x03c57fa3, 0x00820ccd, 0x02422236, 0x00bdcd62, 0x003871a2}}, Y: Field{[10]uint32{0x00c77f7d, 0x003dbc86, 0x03600d13, 0x00685499, 0x01a34e7d, 0x01deedd1, 0x03b8e00e, 0x03238004, 0x02e171e7, 0x002f0431}}}, + {X: Field{[10]uint32{0x00137358, 0x03baab1a, 0x01354c6d, 0x03b43655, 0x010ba2bd, 0x009ebf32, 0x0056de68, 0x01c3cb65, 0x00951231, 0x002c68c3}}, Y: Field{[10]uint32{0x004071f5, 0x01f5042c, 0x032985a1, 0x01fb7e86, 0x02a67879, 0x00100dcf, 0x00443469, 0x0072bf4e, 0x00abc16c, 0x00271da8}}}, + {X: Field{[10]uint32{0x02166e85, 0x024afab9, 0x034d0d68, 0x027da66b, 0x034c7cf9, 0x023d7894, 0x028ba235, 0x00a470d1, 0x03b5fbb0, 0x00093309}}, Y: Field{[10]uint32{0x039f71d5, 0x0287b633, 0x038ddd7a, 0x03388c4a, 0x02d51aab, 0x03c1da3f, 0x03c52e3f, 0x02e9099c, 0x01af2516, 0x003abcda}}}, + {X: Field{[10]uint32{0x008f6a57, 0x02aacb65, 0x00a92217, 0x01de136a, 0x02bacab5, 0x02f4c73b, 0x03e8921c, 0x03478bdf, 0x017a6166, 0x0022ed00}}, Y: Field{[10]uint32{0x008dc331, 0x00355ac2, 0x00c8a5c3, 0x01ca4f5e, 0x01a09cad, 0x0060a65b, 0x02e34fc7, 0x01a618d5, 0x000e6c47, 0x0032265d}}}, + {X: Field{[10]uint32{0x00497f6f, 0x02668cd8, 0x0368b0ec, 0x03d6949c, 0x01e6dafe, 0x002cc0ff, 0x02c17dc2, 0x03765b83, 0x03ddd82f, 0x0015762d}}, Y: Field{[10]uint32{0x03b8beca, 0x0211d8ad, 0x03657bbf, 0x00c347ff, 0x03f4f292, 0x0139cba7, 0x021709e4, 0x0359bd0d, 0x0111078b, 0x003f5891}}}, + {X: Field{[10]uint32{0x00c94df3, 0x038a148d, 0x028455db, 0x009bb11e, 0x03109d46, 0x00176f78, 0x01cbfe61, 0x00c6bd46, 0x01ef5a55, 0x0020aa8b}}, Y: Field{[10]uint32{0x01811511, 0x003b8e33, 0x007c4ebc, 0x03e81a85, 0x018d1e60, 0x0097eec9, 0x002df919, 0x028b9423, 0x03ea9f83, 0x00184582}}}, + {X: Field{[10]uint32{0x00f6f7f4, 0x010e33cb, 0x01636ad3, 0x02c30a38, 0x00804b03, 0x033ea466, 0x002cfbf3, 0x01ffe11f, 0x037cc6df, 0x000db049}}, Y: Field{[10]uint32{0x02fe4833, 0x0168a945, 0x03020aee, 0x018038cb, 0x03a7bb3b, 0x02963811, 0x015d821e, 0x0071d151, 0x03a274f8, 0x0008c13e}}}, + {X: Field{[10]uint32{0x00cd9119, 0x02215ab8, 0x0318c0eb, 0x0097e926, 0x02d57b89, 0x03002cd9, 0x02c9e860, 0x032b5f85, 0x01cc5b44, 0x003cddbf}}, Y: Field{[10]uint32{0x00a028cb, 0x039ea814, 0x006ac74f, 0x02b2f7d7, 0x01c3d0e7, 0x006b3f23, 0x009e3ef1, 0x03a07c12, 0x0132e4de, 0x000b5ab3}}}, + {X: Field{[10]uint32{0x01c5030b, 0x02ab3297, 0x03d1cc7a, 0x01b0e7b3, 0x0197150b, 0x001f4ea2, 0x02e8ecb9, 0x03a7d765, 0x00dc5372, 0x003a9384}}, Y: Field{[10]uint32{0x02d96ff5, 0x01999b0d, 0x003f9520, 0x0180513f, 0x0336d6be, 0x03f7ae25, 0x03486d29, 0x009aff0b, 0x02a393b6, 0x002c225b}}}, + {X: Field{[10]uint32{0x02fdeb08, 0x020728e9, 0x0191a0d1, 0x0067c6a7, 0x00a376ea, 0x006c512e, 0x03f0a2c7, 0x01285e74, 0x02b4b266, 0x001d3ce4}}, Y: Field{[10]uint32{0x009e1fc0, 0x03b820f8, 0x02636c6e, 0x00d901b4, 0x01c95230, 0x026d19cd, 0x02cef679, 0x01623d93, 0x0321428d, 0x0026f536}}}, + {X: Field{[10]uint32{0x014855eb, 0x0258bbf3, 0x02774ca6, 0x01ad62e0, 0x0111c13a, 0x00393208, 0x01a17daf, 0x01ddd290, 0x004259ba, 0x000e8db2}}, Y: Field{[10]uint32{0x00fa5e3c, 0x02574af8, 0x03f482f0, 0x02e91763, 0x01f35e46, 0x017bce79, 0x01720c71, 0x024a3359, 0x01ad9ede, 0x001b76b4}}}, + {X: Field{[10]uint32{0x0098c019, 0x01434a97, 0x0364deae, 0x00623cc9, 0x017635ef, 0x01ac5faa, 0x02739814, 0x02913c5b, 0x02ad5636, 0x00275dec}}, Y: Field{[10]uint32{0x02ee3eef, 0x030dc688, 0x03234f30, 0x033674bd, 0x03eb5936, 0x02cb6c25, 0x0392b8ac, 0x02186ae4, 0x0027a775, 0x0014cb74}}}, + {X: Field{[10]uint32{0x02a3c4ab, 0x02b9f9ef, 0x02c1b39a, 0x005fb91a, 0x000deb61, 0x00317c6f, 0x01168a0f, 0x00be0381, 0x02e9450e, 0x000b9d00}}, Y: Field{[10]uint32{0x0182fc3b, 0x020abeb3, 0x02b6034b, 0x0073c90b, 0x03cf8572, 0x02208404, 0x016b3fef, 0x03f8ae3b, 0x036b5606, 0x00107a3c}}}, + {X: Field{[10]uint32{0x033ebe6f, 0x030ddb94, 0x03320de0, 0x03c54c52, 0x006a6806, 0x023c0297, 0x0333d35e, 0x02d6f606, 0x03254ed0, 0x002bacb2}}, Y: Field{[10]uint32{0x01b9d59c, 0x03135a8a, 0x03d0b142, 0x003dda0c, 0x035d761c, 0x0320fcc5, 0x0028249f, 0x03e8b2cc, 0x02f52d7b, 0x001ae045}}}, + {X: Field{[10]uint32{0x00ca7895, 0x0330fd17, 0x03655fbb, 0x00eae8e8, 0x014cca66, 0x029e5e4a, 0x00adabe3, 0x00b25e80, 0x00bd55d6, 0x00321889}}, Y: Field{[10]uint32{0x011cc214, 0x00c8eef3, 0x00c21844, 0x014fea54, 0x001d8573, 0x0180276d, 0x0293adfa, 0x01e4d4d9, 0x03b7104f, 0x0028c668}}}, + {X: Field{[10]uint32{0x02efe561, 0x033eee8f, 0x03a66aac, 0x03814d2c, 0x00d53ddd, 0x03f739bd, 0x035a28bc, 0x01a8375e, 0x00cc2c57, 0x00074459}}, Y: Field{[10]uint32{0x004995a7, 0x0119c2ad, 0x0291c000, 0x022490fa, 0x01ec6009, 0x0311c391, 0x00ba6947, 0x03625ff3, 0x00deaa25, 0x002e1624}}}, + {X: Field{[10]uint32{0x0040e3c8, 0x00984629, 0x0393b92f, 0x01062f35, 0x035e7f0f, 0x03124f33, 0x036620a5, 0x0056d739, 0x02b413b9, 0x000ad53e}}, Y: Field{[10]uint32{0x039bf5d1, 0x03400593, 0x03cdb30a, 0x012c0bbf, 0x037a61ce, 0x037777cd, 0x01bdfefb, 0x02b635fa, 0x012556fe, 0x0022bfe3}}}, + {X: Field{[10]uint32{0x0329b340, 0x00ea9815, 0x0188709a, 0x0097cb7e, 0x03a9718c, 0x014f91b5, 0x01428ac8, 0x00a87d82, 0x0224a4e7, 0x0007c7ca}}, Y: Field{[10]uint32{0x00421cbd, 0x037c858b, 0x03170991, 0x00812c85, 0x020b6311, 0x01a1c40c, 0x0394f392, 0x002eeaf3, 0x00a4f492, 0x00011437}}}, + {X: Field{[10]uint32{0x00ebd4e5, 0x017b94b2, 0x03200f18, 0x0167c8bc, 0x0383fbc5, 0x0001f815, 0x025682c5, 0x01f93493, 0x018ee677, 0x00104bd9}}, Y: Field{[10]uint32{0x0171c8f4, 0x02de26d9, 0x00e32887, 0x038c9da4, 0x010c8399, 0x03e9932c, 0x030b3d7a, 0x0253fae4, 0x024a9d93, 0x0030b82d}}}, + {X: Field{[10]uint32{0x00f4912b, 0x007e1513, 0x011fbf56, 0x03e7e4b0, 0x0195102e, 0x019f8943, 0x02fec9a3, 0x02477a5d, 0x00b55677, 0x00212577}}, Y: Field{[10]uint32{0x02152443, 0x0270ca8a, 0x011c5e2a, 0x007d1938, 0x03542e51, 0x014ef693, 0x0263f191, 0x02093bd7, 0x01c57d3d, 0x00197e02}}}, + {X: Field{[10]uint32{0x0156cfde, 0x013fc216, 0x006ee1bb, 0x02a5e959, 0x030b4a18, 0x02172931, 0x0145b8bc, 0x032578ea, 0x01c0d841, 0x003e39ef}}, Y: Field{[10]uint32{0x00ed6d42, 0x03b7577c, 0x010111b4, 0x0358577d, 0x006d6660, 0x012e7f02, 0x009d28c2, 0x00d9e4df, 0x0083f93a, 0x0003342b}}}, + {X: Field{[10]uint32{0x02854c94, 0x00bdcc18, 0x0213164f, 0x0121db92, 0x008c8c56, 0x037ca2b5, 0x00767517, 0x0041c492, 0x025a4e4c, 0x0020c918}}, Y: Field{[10]uint32{0x039bfaeb, 0x03308c07, 0x003561f5, 0x032c902e, 0x01de65e2, 0x00189809, 0x01c7ec37, 0x00a09582, 0x01604992, 0x001d86c6}}}, + {X: Field{[10]uint32{0x03ca04d4, 0x03b61644, 0x032cf213, 0x0180c08f, 0x0216a8e1, 0x00d4f7c7, 0x00b6befd, 0x01f88abd, 0x01ff99f8, 0x0022c712}}, Y: Field{[10]uint32{0x03ad6c23, 0x006f78c8, 0x034c02ca, 0x01d5f89d, 0x006abbf9, 0x008b7894, 0x01cff728, 0x022194b4, 0x03d10e17, 0x00335144}}}, + {X: Field{[10]uint32{0x02f4f138, 0x02b2e0a5, 0x03790bca, 0x03ca1eba, 0x0259deac, 0x018c2d19, 0x0030e89d, 0x01360232, 0x01a120d2, 0x0038ab58}}, Y: Field{[10]uint32{0x02186291, 0x036f1bec, 0x0321abf5, 0x01a5800c, 0x02918497, 0x02b371f2, 0x02d29405, 0x01219f6a, 0x01dcfc1c, 0x00147346}}}, + {X: Field{[10]uint32{0x00c197a4, 0x038eb40d, 0x013ba9ea, 0x0339fd1e, 0x01e10356, 0x00c41580, 0x026aa915, 0x029bcc5a, 0x017ea9a9, 0x0003a373}}, Y: Field{[10]uint32{0x00ea6b5e, 0x0072a14e, 0x0295c2e6, 0x0249a9a1, 0x0195f698, 0x01c712b7, 0x02e2a99e, 0x02abd74c, 0x02d791f3, 0x00320d6e}}}, + {X: Field{[10]uint32{0x00f81233, 0x02423a6f, 0x03556e46, 0x02566c81, 0x00d8643f, 0x033ec171, 0x01bba690, 0x02e3bcd8, 0x00e35875, 0x003c2dd2}}, Y: Field{[10]uint32{0x01d6e908, 0x025006cb, 0x0023e91e, 0x02aea7fd, 0x01c1c0ae, 0x030a7298, 0x00765f60, 0x00e9ed9e, 0x02515d16, 0x001a8993}}}, + {X: Field{[10]uint32{0x01af3a87, 0x025f54ce, 0x017962ce, 0x02ba4faf, 0x03e6eef8, 0x03ff8908, 0x02dd305b, 0x016859d9, 0x016f0997, 0x0024037a}}, Y: Field{[10]uint32{0x01164478, 0x02a9c013, 0x01439650, 0x026c4848, 0x01f33f8e, 0x02f9a692, 0x031bf65d, 0x01628e8c, 0x02ecd9c0, 0x002252ac}}}, + {X: Field{[10]uint32{0x0188aa53, 0x0085283b, 0x00645a6e, 0x02879b4d, 0x01ce7fbd, 0x03a7b3e5, 0x030e3067, 0x008d081c, 0x0130d2ea, 0x00232f9e}}, Y: Field{[10]uint32{0x00186b83, 0x0377615c, 0x01ac9919, 0x01c3b01c, 0x0085092c, 0x008cb24d, 0x027f2c8e, 0x0299f6b8, 0x016bf875, 0x00219ec5}}}, + {X: Field{[10]uint32{0x0225e68d, 0x024bfb26, 0x003e69a2, 0x037f04d6, 0x00e79237, 0x0315c1b5, 0x01a65c0f, 0x03490e51, 0x01c95b35, 0x002832ec}}, Y: Field{[10]uint32{0x02047e4f, 0x0293ac60, 0x00a4055b, 0x00917a14, 0x013c6d70, 0x003701b8, 0x01c8a554, 0x006917e0, 0x01d13cd6, 0x002db5fa}}}, + {X: Field{[10]uint32{0x022463cf, 0x02912209, 0x03f4c832, 0x00f58ed1, 0x00d8050c, 0x017a61ff, 0x02d3bbe0, 0x0232d6a9, 0x0072a3fa, 0x000522ab}}, Y: Field{[10]uint32{0x037e4a61, 0x00ccc899, 0x000b292a, 0x02460963, 0x0372749f, 0x01bcb8ae, 0x0245f6d3, 0x0112156a, 0x0249a6e2, 0x001fca77}}}, + {X: Field{[10]uint32{0x02f3977f, 0x01f3ccd9, 0x018cefb0, 0x03e89688, 0x02c28616, 0x028838b9, 0x02caf7ef, 0x03f5b79b, 0x01073a1a, 0x000ee7fb}}, Y: Field{[10]uint32{0x02c65fc9, 0x01c00f04, 0x010fe0ac, 0x0284d23b, 0x034fa9e7, 0x025ab4f8, 0x030c936e, 0x03259287, 0x033c5084, 0x003c2a16}}}, + {X: Field{[10]uint32{0x023537aa, 0x0196b1f3, 0x020fecc5, 0x03ab7eff, 0x027c9cbc, 0x003e90c6, 0x03b443c3, 0x02ff6555, 0x00ed5228, 0x001f7917}}, Y: Field{[10]uint32{0x022686f0, 0x027377be, 0x00fc1199, 0x02298326, 0x0178e011, 0x0315418b, 0x03794f3a, 0x01c0cef2, 0x01376910, 0x00145777}}}, + {X: Field{[10]uint32{0x01913dd2, 0x03986c95, 0x015aa251, 0x0273ae87, 0x03c17cf9, 0x013cea15, 0x00102747, 0x03d58a60, 0x035a0534, 0x00273068}}, Y: Field{[10]uint32{0x02433ae5, 0x005a130f, 0x007ccc69, 0x010ebcaf, 0x03c653e2, 0x02fe384b, 0x0115da37, 0x0293e658, 0x01a8f30f, 0x003024b3}}}, + {X: Field{[10]uint32{0x02b52ec6, 0x002da41e, 0x00562092, 0x03ec8896, 0x0310fc71, 0x00a29ca0, 0x02ad7298, 0x00ee731d, 0x0168759b, 0x00360bc6}}, Y: Field{[10]uint32{0x0018c607, 0x002bd422, 0x03306c47, 0x020b72b0, 0x011b3720, 0x03872760, 0x0008f8ca, 0x00ec31ce, 0x02052698, 0x00153342}}}, + {X: Field{[10]uint32{0x007b7586, 0x0257ab6e, 0x02498241, 0x01221796, 0x0101f9c5, 0x00a46d83, 0x031bffcc, 0x016a5430, 0x014703d9, 0x0005b9aa}}, Y: Field{[10]uint32{0x03d8aafd, 0x00b15636, 0x03276f88, 0x02393b5c, 0x0080ff4c, 0x02a55f01, 0x010d3655, 0x01ae30b9, 0x0138581b, 0x000678a6}}}, + {X: Field{[10]uint32{0x035cd237, 0x0263948e, 0x03197ff0, 0x01395e85, 0x03ad57a7, 0x01df0d18, 0x02b46704, 0x013c9391, 0x02f300ee, 0x00341f9e}}, Y: Field{[10]uint32{0x035d0e20, 0x01bc9304, 0x00b1bc69, 0x037adbc8, 0x00d4d175, 0x03d86222, 0x031019be, 0x005959a6, 0x020f43c9, 0x003ffcd3}}}, + {X: Field{[10]uint32{0x01665380, 0x007d3679, 0x0301450a, 0x02e43260, 0x018ffe42, 0x00fea93a, 0x02118a34, 0x009ff18e, 0x00e56dc0, 0x000afd91}}, Y: Field{[10]uint32{0x02262ec5, 0x013e4956, 0x00477c92, 0x017d9ba9, 0x03eb84ca, 0x001ad57d, 0x0366fb7a, 0x007f17e3, 0x017577be, 0x002fbd70}}}, + {X: Field{[10]uint32{0x005cb045, 0x03b5493f, 0x03a3ab97, 0x01f97897, 0x027a8810, 0x010965f1, 0x00801014, 0x036e4d23, 0x01370db1, 0x001463c3}}, Y: Field{[10]uint32{0x014d7294, 0x0280e5da, 0x037418db, 0x03d37e2a, 0x006eb9f3, 0x0125d094, 0x03113a14, 0x03b4059b, 0x010ea4e9, 0x00372a1d}}}, + {X: Field{[10]uint32{0x030554c7, 0x031c975b, 0x0128e9a9, 0x02ea1e66, 0x0057bf54, 0x03087d89, 0x029893f8, 0x01d284af, 0x02b6c507, 0x0002f523}}, Y: Field{[10]uint32{0x0170f6e1, 0x03e9e1fd, 0x002d2e2c, 0x01418c9d, 0x00dd58f3, 0x01da7dce, 0x034bad90, 0x000c019d, 0x01a8cd8f, 0x0008029b}}}, + {X: Field{[10]uint32{0x031517e2, 0x02678d36, 0x031302aa, 0x01178f02, 0x00800c5b, 0x0193e870, 0x0336622b, 0x01a78da4, 0x013a8711, 0x00333236}}, Y: Field{[10]uint32{0x0101d845, 0x03f5b0db, 0x0305611e, 0x00252027, 0x00888373, 0x0115219a, 0x0211f1bc, 0x0191e3be, 0x03e4d45e, 0x000103b9}}}, + {X: Field{[10]uint32{0x03f6bd1a, 0x0149fc76, 0x03dab8f4, 0x00703f09, 0x0327e8d0, 0x01efa7a9, 0x01d2e9a2, 0x01e648c4, 0x012c7587, 0x0021bd8e}}, Y: Field{[10]uint32{0x010f7922, 0x02bcd340, 0x02dd3e7c, 0x0063f51a, 0x00571505, 0x0127b9a4, 0x02b1304c, 0x02a8a8f4, 0x0211b647, 0x001fb8a5}}}, + {X: Field{[10]uint32{0x03d7fdfd, 0x010760ed, 0x01c1bbfc, 0x0205b687, 0x019bb5a3, 0x00e1d47e, 0x03941053, 0x003e9b0d, 0x00e5927b, 0x00380d3d}}, Y: Field{[10]uint32{0x01a5f89d, 0x01239d50, 0x03b6ff22, 0x01eec9e7, 0x01e90256, 0x02fb72ae, 0x0282b05c, 0x010b904c, 0x02cb8382, 0x003727c0}}}, + {X: Field{[10]uint32{0x02b51045, 0x02d2731a, 0x01062837, 0x03bee1b8, 0x0075eadf, 0x02e09544, 0x023a66a0, 0x02fc017b, 0x02160a9d, 0x0023f0da}}, Y: Field{[10]uint32{0x03d200a6, 0x02526648, 0x0374a705, 0x009e7b27, 0x0266a885, 0x0001292f, 0x03d9957a, 0x02607485, 0x00409605, 0x0031fb8b}}}, + {X: Field{[10]uint32{0x033278e0, 0x002b7239, 0x0112d9c1, 0x037ad45f, 0x03997130, 0x019773f8, 0x0089b71e, 0x01f65b59, 0x00bc5407, 0x0035eed0}}, Y: Field{[10]uint32{0x028b0a4b, 0x0241d2a9, 0x01b468ce, 0x02f8ea2a, 0x025897c0, 0x025ad72d, 0x020706bd, 0x02eb916a, 0x03662f64, 0x00388258}}}, + {X: Field{[10]uint32{0x03bd2ac5, 0x0382a218, 0x007e0b8b, 0x020455ec, 0x003c8826, 0x00997390, 0x007d2d6c, 0x031c5045, 0x02858054, 0x0035cd5d}}, Y: Field{[10]uint32{0x01a9932b, 0x00baf961, 0x019c24f4, 0x0294e031, 0x01d2ce03, 0x03356013, 0x014099e9, 0x0108e709, 0x014b2fc9, 0x00253e1d}}}, + {X: Field{[10]uint32{0x018f8392, 0x02b836a1, 0x002b6669, 0x03f595f7, 0x013e720f, 0x034ff859, 0x01a7e99b, 0x00ffe9c7, 0x02aed935, 0x0016dbe2}}, Y: Field{[10]uint32{0x018f9089, 0x013d1cd0, 0x03c106e7, 0x0100c094, 0x03e49668, 0x0138917c, 0x02f85ec3, 0x01bbb7e9, 0x0105369c, 0x0013babf}}}, + {X: Field{[10]uint32{0x02222000, 0x01cb1390, 0x03b39f7b, 0x02806683, 0x02ab4076, 0x0313d221, 0x004b4f49, 0x00a7900e, 0x011267cc, 0x000e5113}}, Y: Field{[10]uint32{0x0283d771, 0x02806872, 0x010ba50e, 0x015c6ddf, 0x01329f30, 0x014e23ae, 0x0248adf3, 0x03b8b637, 0x002aaf90, 0x00197094}}}, + {X: Field{[10]uint32{0x030752c7, 0x021222c6, 0x010030a1, 0x02573b0b, 0x0216ebad, 0x02f26223, 0x019c4a7d, 0x02c28f05, 0x00dbf1ef, 0x0014f780}}, Y: Field{[10]uint32{0x01e2fbda, 0x0158c881, 0x026d33a5, 0x01993452, 0x0287dc61, 0x039ef146, 0x02d62285, 0x0177e9d4, 0x03d99947, 0x000ca3b2}}}, + {X: Field{[10]uint32{0x015ead39, 0x0052932f, 0x019e3d48, 0x033bad23, 0x03194d1b, 0x017ed80c, 0x000eef0d, 0x01c84f8a, 0x03af9b4f, 0x0001228e}}, Y: Field{[10]uint32{0x00334186, 0x026a2eca, 0x029ce709, 0x03b512a6, 0x037e749e, 0x03252c83, 0x006f7fbc, 0x00e14aef, 0x01c9e04a, 0x000ed2b2}}}, + {X: Field{[10]uint32{0x033ac541, 0x011c1f96, 0x02b6eb52, 0x001be85b, 0x03acccf4, 0x009f88b5, 0x00182370, 0x0073b4f1, 0x0230503c, 0x003c035d}}, Y: Field{[10]uint32{0x01ca95b5, 0x015c6dcc, 0x00404f47, 0x03ff6df4, 0x03c9e2bc, 0x03e3b564, 0x0254605d, 0x01d89ac4, 0x013fec17, 0x00268777}}}, + {X: Field{[10]uint32{0x0141eaac, 0x02099622, 0x01ee89a4, 0x03210205, 0x00c4f8ee, 0x03a30868, 0x01708582, 0x03ad6439, 0x01943ce7, 0x00387fc6}}, Y: Field{[10]uint32{0x03353b7e, 0x02d25cb5, 0x003dd003, 0x00faf0db, 0x01dbf27e, 0x022a95fa, 0x021b53d7, 0x01cb9b39, 0x0172746e, 0x0014a395}}}, + {X: Field{[10]uint32{0x0059bd49, 0x00afbc1d, 0x02c55256, 0x00116456, 0x0223b3aa, 0x01d709ef, 0x015a6652, 0x01d43838, 0x0020c48e, 0x00393c4f}}, Y: Field{[10]uint32{0x0287ca30, 0x008731db, 0x01ebca2d, 0x014cd8aa, 0x03639010, 0x01ec6eec, 0x026b9d6a, 0x007e668b, 0x02cec6e5, 0x002faf1f}}}, + {X: Field{[10]uint32{0x006f5f20, 0x035720e2, 0x03ea4d2d, 0x0012b1a4, 0x01598c6c, 0x0033c9c6, 0x003d3716, 0x019ba1c2, 0x00f3824b, 0x0038dba3}}, Y: Field{[10]uint32{0x0086c60b, 0x03432f68, 0x009f6c88, 0x03a193c9, 0x00f5be9f, 0x02069537, 0x03749104, 0x015f7cf6, 0x01938afe, 0x0013a838}}}, + {X: Field{[10]uint32{0x0246365f, 0x03478349, 0x0172a63d, 0x0373f7a5, 0x03797ff5, 0x0135f151, 0x00b4a068, 0x034beca7, 0x03193286, 0x0014787c}}, Y: Field{[10]uint32{0x02370e3a, 0x00b321d4, 0x01cb2ace, 0x03b6e519, 0x03b8640c, 0x03130f50, 0x0290d7e6, 0x03b318c6, 0x023c6f30, 0x002b11c3}}}, + {X: Field{[10]uint32{0x01a5fae0, 0x033de735, 0x0224829b, 0x01055b4a, 0x0022277f, 0x016f09b7, 0x01dadd64, 0x0139c981, 0x02a9c40d, 0x0023a0b6}}, Y: Field{[10]uint32{0x027c53ee, 0x03666e05, 0x024d733a, 0x0078ca84, 0x03b01b96, 0x00cf8a46, 0x0191dd72, 0x015ec8ac, 0x01fdbe90, 0x001fe055}}}, + {X: Field{[10]uint32{0x022c41e3, 0x006cd64f, 0x02595988, 0x01d1938a, 0x0038bea6, 0x0097e9e2, 0x03fd5e95, 0x01ea90d3, 0x0344273c, 0x001e7959}}, Y: Field{[10]uint32{0x0385ecab, 0x01b9f2fc, 0x03c33e80, 0x0083c9e2, 0x03eb786a, 0x011c48b5, 0x00ec764b, 0x03bee7c0, 0x01a3c50d, 0x00189422}}}, + {X: Field{[10]uint32{0x02743f79, 0x03b4fd98, 0x0206879d, 0x015bcbc7, 0x02af7fe1, 0x01389288, 0x01eb8918, 0x00655d47, 0x00e2d19c, 0x002a5f80}}, Y: Field{[10]uint32{0x018284a0, 0x029425f3, 0x03282944, 0x0177a9ce, 0x02f3f583, 0x0113fe47, 0x00726bbc, 0x00b124d5, 0x02bd8bcb, 0x0022075f}}}, + {X: Field{[10]uint32{0x03338542, 0x01c1c9c2, 0x00aa8f4a, 0x02fa3ece, 0x009bc52f, 0x001508de, 0x021c3fb4, 0x03d70c53, 0x014607bb, 0x000efc41}}, Y: Field{[10]uint32{0x024f6367, 0x010b1900, 0x022b6390, 0x01479611, 0x019a87ba, 0x03e10381, 0x0068e5fe, 0x02dffdb7, 0x006cfad5, 0x0039e256}}}, + {X: Field{[10]uint32{0x01d9cc5d, 0x012202d5, 0x03b2e01f, 0x033e10df, 0x0249cce0, 0x033cd01a, 0x034ee87e, 0x0077fce6, 0x00775879, 0x00200a5b}}, Y: Field{[10]uint32{0x00152dcb, 0x031376e4, 0x01284846, 0x00d2f6c2, 0x00902e48, 0x0022f145, 0x028753b7, 0x01e07f38, 0x02113c7f, 0x000ec1af}}}, + {X: Field{[10]uint32{0x00ba52fe, 0x02594188, 0x03023598, 0x013a1f95, 0x01b7b0fe, 0x016713fc, 0x029cc123, 0x036ff7da, 0x037aa3ee, 0x001238b2}}, Y: Field{[10]uint32{0x02e8ed1b, 0x01592c27, 0x00aac7ad, 0x00c4f3fd, 0x00a0a456, 0x01fdcbb8, 0x00411ba8, 0x026ef165, 0x017afa90, 0x00371e10}}}, + {X: Field{[10]uint32{0x03403d46, 0x02016a5c, 0x00b6b7b4, 0x00ba65cc, 0x0031a3db, 0x0061f5e7, 0x02b482aa, 0x015220a1, 0x011fcb77, 0x0037244d}}, Y: Field{[10]uint32{0x03adb1a3, 0x00ffe5bd, 0x01b2ffa9, 0x01713942, 0x03fc52e3, 0x03827e97, 0x0180ecd5, 0x0064ba30, 0x020d2d13, 0x003b5c83}}}, + {X: Field{[10]uint32{0x0190a670, 0x025cc67a, 0x02b9f017, 0x014d6c14, 0x013a2b26, 0x03ecd13a, 0x0105b151, 0x02d3ea73, 0x013948ce, 0x00174df0}}, Y: Field{[10]uint32{0x0174cb01, 0x01b54e86, 0x0348a185, 0x0349f279, 0x00b62e16, 0x02e5018d, 0x02832ad6, 0x02e9201e, 0x033c2590, 0x003de424}}}, + {X: Field{[10]uint32{0x03070aa2, 0x03b285dd, 0x00157708, 0x0096b67a, 0x0015c8e3, 0x02a123fd, 0x017eece0, 0x026c89bf, 0x02b0f8d6, 0x00262f2e}}, Y: Field{[10]uint32{0x02150212, 0x0379637a, 0x002060e2, 0x01266ec4, 0x03a08aa9, 0x008629fb, 0x02ffd615, 0x01521f9a, 0x03b3db71, 0x001d9c78}}}, + {X: Field{[10]uint32{0x0335b1c5, 0x0170448f, 0x03a188fa, 0x02340891, 0x0012ce30, 0x01640cd0, 0x0194384d, 0x0121bbe9, 0x01cb3de9, 0x001838b0}}, Y: Field{[10]uint32{0x0369d1bb, 0x010bcbe4, 0x008fa639, 0x021ada38, 0x024d58d0, 0x014efdc8, 0x03c11a38, 0x0319bd70, 0x031b9767, 0x001b79c0}}}, + {X: Field{[10]uint32{0x004885c7, 0x00fa9c8c, 0x03467d87, 0x02ecca7a, 0x01aaf513, 0x038be6f3, 0x03f2f702, 0x015add42, 0x02c5aa82, 0x002051c5}}, Y: Field{[10]uint32{0x03d297ee, 0x00290b71, 0x00b58630, 0x0324283f, 0x01eb7efa, 0x00d4cf7a, 0x03ba31e2, 0x0186244f, 0x00ee8fa9, 0x003b2991}}}, + {X: Field{[10]uint32{0x02f8de77, 0x024d3edc, 0x00e3be6d, 0x0218803a, 0x019fb715, 0x00d9a1b5, 0x0360f7b6, 0x004bbc2b, 0x033f1db4, 0x00095e27}}, Y: Field{[10]uint32{0x007de0ac, 0x0320c08b, 0x00ce9633, 0x00ee3163, 0x02863bc0, 0x022069a1, 0x034a6f77, 0x03886d5c, 0x039899d1, 0x00394889}}}, + {X: Field{[10]uint32{0x00f1bdcd, 0x02337ca8, 0x01527ef1, 0x0079e028, 0x0227f2a9, 0x00ff2da9, 0x02a87fdf, 0x03e39591, 0x000c98bf, 0x0014e0bd}}, Y: Field{[10]uint32{0x0232b502, 0x03a17192, 0x0079d9a1, 0x0360e31e, 0x0239c027, 0x02765e85, 0x0068ce13, 0x028e8768, 0x01dee41c, 0x0008c740}}}, + {X: Field{[10]uint32{0x011d1f2b, 0x00c8e2e8, 0x01dc6e57, 0x02cfc63a, 0x0167d9ec, 0x03d5f740, 0x02ab14d8, 0x03eb7ff2, 0x01209db2, 0x0011233f}}, Y: Field{[10]uint32{0x0166fea6, 0x0070c564, 0x005875a1, 0x019c2548, 0x032ba1bb, 0x0134a092, 0x01e8d181, 0x015b090d, 0x02e55a4f, 0x002eb638}}}, + {X: Field{[10]uint32{0x02e5653d, 0x02befa00, 0x02ab5667, 0x00f7ad84, 0x01f6c489, 0x01112efe, 0x012b69d5, 0x00cd7d40, 0x024b0fe6, 0x003645f2}}, Y: Field{[10]uint32{0x032bad17, 0x0216ebbc, 0x0033a4bb, 0x0154c40b, 0x00aeabc0, 0x005f397c, 0x0150f1ff, 0x025d589e, 0x024be6a4, 0x000ff7a6}}}, + {X: Field{[10]uint32{0x01ba8f72, 0x017c93a4, 0x00570db3, 0x0398293a, 0x031dd974, 0x038fbd60, 0x03de053b, 0x020eb5cc, 0x01f517a8, 0x00031fba}}, Y: Field{[10]uint32{0x039bba44, 0x03f41881, 0x01f3a2bf, 0x0134b7ce, 0x02e06a7e, 0x01a82338, 0x03d2a31c, 0x019efd95, 0x038d26d3, 0x00236ddc}}}, + {X: Field{[10]uint32{0x00d9a30b, 0x00217825, 0x00aed0b7, 0x02e28cab, 0x00819a77, 0x01f210ef, 0x022b1737, 0x035b781e, 0x019d983e, 0x0020fc28}}, Y: Field{[10]uint32{0x00afe6a7, 0x03d21d4b, 0x00e00c37, 0x011db55d, 0x00880acd, 0x0044ef98, 0x0348b636, 0x0111cf61, 0x029667be, 0x0034aacf}}}, + {X: Field{[10]uint32{0x0313989d, 0x02649dc8, 0x02f2e2b2, 0x01e41f14, 0x01596740, 0x01d360f7, 0x03b56bde, 0x01f10263, 0x026a6168, 0x003cfe2a}}, Y: Field{[10]uint32{0x01a109fb, 0x00e653d0, 0x03a21ad6, 0x0130da15, 0x00caa1b5, 0x02258d97, 0x0201ff9a, 0x000e8cb4, 0x009d0985, 0x000e9a43}}}, + {X: Field{[10]uint32{0x0032249e, 0x03b87fd4, 0x0316a283, 0x01010e11, 0x03914fdd, 0x03af2d39, 0x01d6e8b3, 0x035b1f65, 0x01caa30b, 0x00130684}}, Y: Field{[10]uint32{0x01424da0, 0x0394856e, 0x028809b7, 0x01f0dfe0, 0x006598f1, 0x0194ce74, 0x014c604e, 0x03bd0348, 0x00c94653, 0x0039f9c6}}}, + {X: Field{[10]uint32{0x02e5477d, 0x008b064f, 0x00f6c1d9, 0x03216872, 0x02529ebb, 0x0083cc60, 0x033bdb04, 0x0280614f, 0x01523419, 0x000a506e}}, Y: Field{[10]uint32{0x02628413, 0x00e4b74f, 0x02763864, 0x01442260, 0x0280482b, 0x03db07b7, 0x0205baa7, 0x019a82aa, 0x026c29ca, 0x000ddfc8}}}, + {X: Field{[10]uint32{0x0191a6a1, 0x00858761, 0x032c3384, 0x03bf8615, 0x004b5f25, 0x031c1e2b, 0x03b3eb18, 0x026be196, 0x0107aad4, 0x00027413}}, Y: Field{[10]uint32{0x0083cd34, 0x004ae88b, 0x03724f85, 0x03287523, 0x02779eb0, 0x0065912d, 0x01ae02d1, 0x02a27ed1, 0x028dec2c, 0x003d5ca5}}}, + {X: Field{[10]uint32{0x03d26e20, 0x011ac190, 0x03ef4a26, 0x01405def, 0x000d660c, 0x02988a09, 0x01a983c9, 0x028406e6, 0x0367c3c3, 0x0011007d}}, Y: Field{[10]uint32{0x02d4e342, 0x019a77a1, 0x00c0bb7d, 0x037bba60, 0x02999f8b, 0x03419a79, 0x00293091, 0x00453859, 0x02f78e1b, 0x001e54be}}}, + {X: Field{[10]uint32{0x03bba31f, 0x02dfc306, 0x03fa68d7, 0x0311eca0, 0x000ab8a1, 0x033218ea, 0x028665ba, 0x005f4ecc, 0x0027fc40, 0x00252dbd}}, Y: Field{[10]uint32{0x0340d85a, 0x028085f7, 0x01868e09, 0x0096a660, 0x019cbe77, 0x027741ea, 0x008199e9, 0x034b51bb, 0x027d35f0, 0x0004cd81}}}, + {X: Field{[10]uint32{0x01e7288f, 0x026d2893, 0x01445738, 0x027e4809, 0x03f2fba5, 0x039d55d2, 0x03b87cdd, 0x026ef518, 0x03a292c7, 0x00105886}}, Y: Field{[10]uint32{0x02cd3188, 0x0328b868, 0x0111b717, 0x001eca53, 0x033bc70a, 0x0399ee50, 0x0389951f, 0x002de204, 0x03d5b6f3, 0x000d54cd}}}, + {X: Field{[10]uint32{0x01a3594e, 0x030e67bf, 0x0173fc33, 0x02eaac53, 0x038a9b27, 0x0049a062, 0x0100dde6, 0x03074d56, 0x00156256, 0x002c20e1}}, Y: Field{[10]uint32{0x01a954a5, 0x01a11d71, 0x02c7dc5d, 0x034541a7, 0x03843ef8, 0x01a90a17, 0x00c5371b, 0x018b8a47, 0x019055b1, 0x000aabe4}}}, + {X: Field{[10]uint32{0x000dc9bd, 0x0249d19b, 0x008fb8ba, 0x004c3a11, 0x027d910f, 0x03330509, 0x029f4377, 0x023fa977, 0x014fef41, 0x00332668}}, Y: Field{[10]uint32{0x00536f28, 0x02baedc6, 0x017f5c77, 0x0364b3ff, 0x0222f7b3, 0x030326fc, 0x02f164ba, 0x0304b750, 0x03647c01, 0x0000b8c2}}}, + {X: Field{[10]uint32{0x01764e37, 0x01083741, 0x01d50a2f, 0x02d6e59f, 0x027b21d6, 0x03601763, 0x025d59c1, 0x00616355, 0x024adbec, 0x00234aec}}, Y: Field{[10]uint32{0x019f712f, 0x0052fe26, 0x005efe70, 0x0035a959, 0x02fc371d, 0x022824c8, 0x02537c70, 0x02bae9c4, 0x0330e78d, 0x003371b5}}}, + {X: Field{[10]uint32{0x010f7c9b, 0x008ce8f9, 0x0219203b, 0x01bc9d08, 0x00dbb94c, 0x01d438ca, 0x00a18717, 0x033d2b9b, 0x02de0f18, 0x0018f3b9}}, Y: Field{[10]uint32{0x02fdfeb8, 0x00d05cc7, 0x014367ca, 0x00c784d9, 0x00ce0050, 0x02a2160a, 0x0231b8f7, 0x008ce86d, 0x01adad2d, 0x002048c3}}}, + {X: Field{[10]uint32{0x02755a0c, 0x029679a4, 0x02114926, 0x01fee3d1, 0x02b2e4d0, 0x02e86776, 0x028d5cbf, 0x03740e69, 0x029c1dc6, 0x00188213}}, Y: Field{[10]uint32{0x01061a26, 0x03662dc1, 0x0302cc4b, 0x006bef37, 0x02cc9c7f, 0x02a09f82, 0x01c273aa, 0x006bc003, 0x00f462fb, 0x001b6fad}}}, + {X: Field{[10]uint32{0x018dd827, 0x01cd8957, 0x01238c27, 0x00ddf7de, 0x003f34a9, 0x01c1cab3, 0x02368ec1, 0x018a0053, 0x02baf65b, 0x00044303}}, Y: Field{[10]uint32{0x02e75c6d, 0x03fe16ca, 0x02ba9649, 0x01d0b6be, 0x030c3c3e, 0x00082e0e, 0x01d5865b, 0x01896258, 0x03166f23, 0x000692e9}}}, + {X: Field{[10]uint32{0x01c87e00, 0x01f279bc, 0x012b6892, 0x01748f34, 0x01baa50a, 0x02ae5d01, 0x007306cf, 0x008d2ea0, 0x011e50fb, 0x00361229}}, Y: Field{[10]uint32{0x016a4fd8, 0x01cadbea, 0x02adc16a, 0x027cf2de, 0x0151fdb4, 0x0265127b, 0x02e4b1cc, 0x00032132, 0x026288fb, 0x00276e6f}}}, + {X: Field{[10]uint32{0x014c2b5a, 0x03269f38, 0x0002396b, 0x0181606c, 0x02a8cf26, 0x02406e7b, 0x0147f3b3, 0x01aad149, 0x0093a270, 0x00108c46}}, Y: Field{[10]uint32{0x024165bc, 0x034f4b2b, 0x00d70daa, 0x0073a7bd, 0x03d6129a, 0x01d82691, 0x01c2a9f7, 0x0088b066, 0x02db9ba6, 0x001d43e1}}}, + {X: Field{[10]uint32{0x0034d37f, 0x02bb038e, 0x037419fd, 0x00797c5f, 0x026b252f, 0x01f2878c, 0x03454967, 0x037104cb, 0x00ee471a, 0x00110e71}}, Y: Field{[10]uint32{0x01897e87, 0x0003b95d, 0x0119581a, 0x0196ce16, 0x03617c95, 0x03e1be4e, 0x0316ab66, 0x030f798b, 0x032c22c5, 0x002f5d70}}}, + {X: Field{[10]uint32{0x0113b053, 0x02b2bfb0, 0x03bbf36b, 0x01e6601b, 0x02e02e9e, 0x0314bf6d, 0x00b0bbd8, 0x00c76992, 0x03dab192, 0x00137f38}}, Y: Field{[10]uint32{0x03042c3a, 0x01168a84, 0x0342f69d, 0x01650bfa, 0x029d647c, 0x011f3068, 0x00a1c3e1, 0x01fee910, 0x031f4b72, 0x0037a317}}}, + {X: Field{[10]uint32{0x0117dc9d, 0x03bfe6e0, 0x009efcdd, 0x03cfb1b6, 0x009d0ba6, 0x0207db05, 0x00f91582, 0x009cdbd5, 0x032ee8e7, 0x000eee8a}}, Y: Field{[10]uint32{0x0216ab24, 0x02428c36, 0x00d2baf6, 0x021a9a98, 0x036f9a21, 0x02bdb283, 0x0293f947, 0x01f95b97, 0x02747789, 0x003fc21c}}}, + {X: Field{[10]uint32{0x0317deae, 0x01f59f60, 0x0059527f, 0x003d3eec, 0x00e239a0, 0x03d56ac3, 0x02d92ff0, 0x031ac920, 0x0243037b, 0x0028bfb7}}, Y: Field{[10]uint32{0x01869ed4, 0x00d8e351, 0x012da98c, 0x0058bc61, 0x000f7801, 0x0033808b, 0x008e195d, 0x03ff5fbc, 0x010843be, 0x000a9e45}}}, + {X: Field{[10]uint32{0x004bc0a3, 0x00730f8c, 0x021852cb, 0x002610c2, 0x01b3d64d, 0x01cdc021, 0x01aa8e67, 0x03ad3128, 0x022ff503, 0x00088713}}, Y: Field{[10]uint32{0x01b7ae41, 0x00477465, 0x02de199e, 0x00a52898, 0x01a70a79, 0x034fe1d9, 0x024fd70a, 0x0139e704, 0x031b0f95, 0x0030f0de}}}, + {X: Field{[10]uint32{0x00740ed0, 0x03bcf145, 0x00bfca58, 0x02f55679, 0x02f909c8, 0x026e44c1, 0x02f945b4, 0x02e81432, 0x0380f7e4, 0x002830cb}}, Y: Field{[10]uint32{0x02f9562a, 0x0286244d, 0x02c9041b, 0x0318e290, 0x01966aa1, 0x033b5172, 0x01e4cfbd, 0x011c0107, 0x030146ab, 0x0034fae3}}}, + {X: Field{[10]uint32{0x00da85c6, 0x01e6f906, 0x02aa1dff, 0x02573258, 0x010bf333, 0x01dd0204, 0x01e1ca75, 0x0189fc00, 0x0218b4fe, 0x001d8b9e}}, Y: Field{[10]uint32{0x00f51ec5, 0x024c8d31, 0x02b93dce, 0x02552bd5, 0x025875f7, 0x01156e10, 0x00a743c3, 0x00703d3e, 0x03465046, 0x002837c3}}}, + {X: Field{[10]uint32{0x013a29f0, 0x018cb12e, 0x03561b8d, 0x00d0451b, 0x0378389f, 0x010cdec7, 0x02cfbe40, 0x032bcf55, 0x0135cd95, 0x000bc0b6}}, Y: Field{[10]uint32{0x00f44569, 0x013a49c6, 0x0287b0e7, 0x010704bf, 0x0209c454, 0x008fc68c, 0x0008872b, 0x0242d3e0, 0x00d823f1, 0x0005cd1c}}}, + {X: Field{[10]uint32{0x03eab212, 0x0398e4b9, 0x01612314, 0x01b893bc, 0x01c5877d, 0x03f2628e, 0x01adbd59, 0x005b7c71, 0x03d72eb8, 0x00327e1d}}, Y: Field{[10]uint32{0x02067c4c, 0x0216391a, 0x03ad10b0, 0x0149d52c, 0x0188bb00, 0x03f2aa7d, 0x01a52b58, 0x01fbb169, 0x011788cf, 0x000533a6}}}, + {X: Field{[10]uint32{0x00baa172, 0x03485e68, 0x005df239, 0x008eb9db, 0x02d6dd1c, 0x032fd743, 0x03296df6, 0x0172de9b, 0x036918a0, 0x0033137f}}, Y: Field{[10]uint32{0x014a4dc6, 0x01a51219, 0x00cd5b78, 0x02ead4e4, 0x02e4dda0, 0x018ed295, 0x01b06506, 0x005d4098, 0x00b1b847, 0x0007350e}}}, + {X: Field{[10]uint32{0x03cbfaa1, 0x03b20a3b, 0x02a5bccc, 0x02299591, 0x01ca015a, 0x01e2b354, 0x0010219a, 0x01c4e8a7, 0x034b3ed2, 0x003eaab1}}, Y: Field{[10]uint32{0x0130d934, 0x03d9869f, 0x00ecbf8b, 0x03244fef, 0x01b2e74c, 0x03f9e552, 0x025c46b7, 0x03b036f5, 0x003bdcc2, 0x002b72b5}}}, + {X: Field{[10]uint32{0x00fdbf46, 0x02bbf111, 0x02480dd0, 0x03c8f468, 0x028a0025, 0x016f9b03, 0x01444b73, 0x026f4368, 0x02c930fa, 0x0005c4d5}}, Y: Field{[10]uint32{0x009bce3f, 0x00526ee7, 0x0214eb2e, 0x0134bb8a, 0x0062e246, 0x008e6395, 0x004361ed, 0x03ee76ad, 0x02dc991e, 0x001dc3a7}}}, + {X: Field{[10]uint32{0x01680214, 0x00401ef9, 0x01b43b64, 0x01e81ea0, 0x01c05501, 0x017e7ec6, 0x01491af5, 0x00dd8f4b, 0x016ae047, 0x00024cfd}}, Y: Field{[10]uint32{0x00ea76ad, 0x02a72ae8, 0x02ba9f85, 0x03fe4ec7, 0x01ad1d70, 0x01253950, 0x01ea647f, 0x036d8d20, 0x0047481c, 0x00198167}}}, + {X: Field{[10]uint32{0x03bb6b34, 0x0307f816, 0x02cf664a, 0x01d87b06, 0x018a397f, 0x02f27272, 0x02446910, 0x02b4df5f, 0x0322b182, 0x00028c03}}, Y: Field{[10]uint32{0x0033593d, 0x00aead15, 0x035007b4, 0x011188a2, 0x01684abe, 0x01c8bc85, 0x00de2694, 0x01d2e518, 0x03fca909, 0x002f5bcb}}}, + {X: Field{[10]uint32{0x038fe1ea, 0x01b8fb2b, 0x03fd685d, 0x02d54a38, 0x00878b79, 0x03b9358c, 0x03c1d62d, 0x004d57e5, 0x03ed6e90, 0x003f1795}}, Y: Field{[10]uint32{0x035bab01, 0x02a6cacb, 0x01d498c4, 0x0124d172, 0x02bc7c85, 0x02141efb, 0x018b1b56, 0x032ee796, 0x027a6c21, 0x00044884}}}, + {X: Field{[10]uint32{0x0231ef3d, 0x0114bed4, 0x00bfff3f, 0x015ba8d0, 0x030899e9, 0x02406548, 0x00721c19, 0x02047ef5, 0x00e27a64, 0x00168bd0}}, Y: Field{[10]uint32{0x0093d547, 0x0048b4c8, 0x0086c20a, 0x00e989e6, 0x01d8c4a5, 0x0275c70c, 0x0206d263, 0x0231e5d2, 0x015d1257, 0x001acafe}}}, + {X: Field{[10]uint32{0x00f2084f, 0x005e6d59, 0x033106f9, 0x01f63747, 0x02fb1575, 0x01f5fbd8, 0x036610d6, 0x026716f9, 0x0333df0b, 0x00165e0c}}, Y: Field{[10]uint32{0x025b7f5a, 0x01d9a51f, 0x00c4fa76, 0x025f0d3d, 0x037d309d, 0x029d60fa, 0x03f4623b, 0x005c3204, 0x0280dd3d, 0x003caa7a}}}, + {X: Field{[10]uint32{0x03672d95, 0x01b6c7cd, 0x00a08154, 0x035d329f, 0x01a1c8be, 0x01e8a70b, 0x0372bb38, 0x00ff21cf, 0x01246b51, 0x00033d84}}, Y: Field{[10]uint32{0x038c70ee, 0x03deaf0b, 0x007873ef, 0x03d0b81f, 0x021e182c, 0x0187ec3f, 0x011d1a56, 0x00110e7b, 0x0076697f, 0x00348f0f}}}, + {X: Field{[10]uint32{0x03fe7d52, 0x012c5ccb, 0x017baac1, 0x032581a5, 0x031cb871, 0x0018fe3a, 0x02eb7eb8, 0x00520389, 0x0305133a, 0x003b7453}}, Y: Field{[10]uint32{0x00b1b70a, 0x017e358d, 0x0392a61b, 0x00203291, 0x02ee6033, 0x011709d3, 0x01b3aa84, 0x0354a130, 0x0280d295, 0x0035a0bc}}}, + {X: Field{[10]uint32{0x001a1713, 0x036571ff, 0x000d175f, 0x00c2977a, 0x0033cb8d, 0x0325649b, 0x026e7902, 0x022bce2c, 0x00e90cdc, 0x003e6c3f}}, Y: Field{[10]uint32{0x02a3e6ac, 0x0148903c, 0x022b5d47, 0x022f5bf3, 0x01df958b, 0x0233d2a2, 0x01083cdc, 0x018f5c60, 0x01f6f3d1, 0x003b1fa3}}}, + {X: Field{[10]uint32{0x0346a3b7, 0x02ff4905, 0x014e4e46, 0x0057c1c2, 0x02d9ea43, 0x0105f159, 0x03069817, 0x01fd5e24, 0x01995418, 0x002ba419}}, Y: Field{[10]uint32{0x031a129b, 0x01515fc8, 0x01b10677, 0x01cc16f9, 0x01173355, 0x02811c27, 0x01006ff2, 0x00cc4fa7, 0x01adc09d, 0x0008906f}}}, + {X: Field{[10]uint32{0x03d956e9, 0x02cd4391, 0x03540c54, 0x03cd1041, 0x03f68fe9, 0x01606b8e, 0x02134cde, 0x00bdefd7, 0x00007649, 0x00157c3e}}, Y: Field{[10]uint32{0x033956ff, 0x029232f0, 0x00b982c8, 0x02d71c33, 0x01e258dc, 0x017fa60d, 0x03b4b8a3, 0x0222877e, 0x011de684, 0x0008a822}}}, + {X: Field{[10]uint32{0x01663bbb, 0x00665306, 0x010c1b87, 0x03131147, 0x006cb7e3, 0x03e1991f, 0x0123bb1d, 0x010388c6, 0x030686fb, 0x0024322a}}, Y: Field{[10]uint32{0x00c80ab4, 0x01ef8fff, 0x02463e3b, 0x00625323, 0x01cb30d7, 0x03105e5e, 0x03bb2c50, 0x03acb71b, 0x00d9570e, 0x00371d23}}}, + {X: Field{[10]uint32{0x00a4c694, 0x00b89f21, 0x02b604bb, 0x01aeb027, 0x013e476d, 0x01baa127, 0x0268e735, 0x03aee7ec, 0x002d6b21, 0x0032fd1f}}, Y: Field{[10]uint32{0x02bb2873, 0x021bee9e, 0x001cf16e, 0x037f6ac2, 0x01416ed9, 0x01658908, 0x02bf8bbe, 0x022528e6, 0x03e68042, 0x003c0a23}}}, + {X: Field{[10]uint32{0x0111fe80, 0x027f3a5f, 0x03b1637e, 0x02c91950, 0x00d8f1bf, 0x005235ce, 0x03ff7582, 0x01a2c823, 0x005fc18b, 0x001f0c22}}, Y: Field{[10]uint32{0x00013f2f, 0x01471d8f, 0x0221c7ea, 0x006298f9, 0x0052c067, 0x03221b84, 0x02c6d378, 0x007056c9, 0x00b931a1, 0x000f8b47}}}, + {X: Field{[10]uint32{0x026d7753, 0x0050cefd, 0x033e64f1, 0x01c8dfcc, 0x03e137c7, 0x03a481f6, 0x02a9da9d, 0x032e8374, 0x01190d1b, 0x002b5852}}, Y: Field{[10]uint32{0x0239753d, 0x027807b4, 0x03d0baad, 0x035c3b14, 0x00190b72, 0x02e9d66d, 0x02046192, 0x02862275, 0x018b3512, 0x003f2ba8}}}, + {X: Field{[10]uint32{0x025e29a2, 0x01729f13, 0x01715a29, 0x01c68e4e, 0x00a7bc41, 0x03b4cd6d, 0x02b50a81, 0x027055c2, 0x001baf8c, 0x00237dc1}}, Y: Field{[10]uint32{0x01ce02e7, 0x0192e92f, 0x01a1399b, 0x030e1286, 0x00e12eab, 0x01f771b7, 0x0166b24c, 0x01ef77cd, 0x02438267, 0x0003a24b}}}, + {X: Field{[10]uint32{0x00fdadd6, 0x009e010b, 0x00fbf2a1, 0x01ddf762, 0x02217f4e, 0x0306ed7d, 0x0351891a, 0x01483a69, 0x025761c8, 0x0027d307}}, Y: Field{[10]uint32{0x027d0f50, 0x02e583d3, 0x008609d9, 0x018e7cf5, 0x02ed4b69, 0x00f84b1e, 0x035831eb, 0x03a22430, 0x00adc6ce, 0x003f6884}}}, + {X: Field{[10]uint32{0x0115acbf, 0x02332ae9, 0x0147c2ee, 0x0061d496, 0x03174de6, 0x00778c24, 0x013bacf9, 0x01c28b02, 0x00dd23ac, 0x00290dbd}}, Y: Field{[10]uint32{0x0219afb9, 0x015fbfdf, 0x020ec9fe, 0x02cc1f51, 0x005879e8, 0x009ef04a, 0x039a4509, 0x016e6a50, 0x01d92a61, 0x00303a76}}}, + {X: Field{[10]uint32{0x006f1930, 0x037e882e, 0x007d567b, 0x019f1655, 0x0037497c, 0x000e5a57, 0x018627c5, 0x010f645b, 0x01166997, 0x0028e3bb}}, Y: Field{[10]uint32{0x01d9d7fd, 0x03951512, 0x00c18bb0, 0x02c52105, 0x013be89b, 0x03c9b247, 0x035b5fe3, 0x00ed6b26, 0x02d6effc, 0x001b8f8f}}}, + {X: Field{[10]uint32{0x02fbf3d6, 0x0187aeb8, 0x02586833, 0x039623a4, 0x000b6f1d, 0x01ac3c93, 0x03659e33, 0x010e87eb, 0x00d20d40, 0x0017d164}}, Y: Field{[10]uint32{0x015197db, 0x0242f801, 0x00466158, 0x02dc0090, 0x02ccc833, 0x01939ffd, 0x001af117, 0x03bb00fb, 0x0273042c, 0x00094302}}}, + {X: Field{[10]uint32{0x00cf56c0, 0x0147d10d, 0x03c551be, 0x031dcf3a, 0x03d52bea, 0x03dca0a8, 0x02d16ff8, 0x02e401a3, 0x020dc6eb, 0x001d5961}}, Y: Field{[10]uint32{0x02e24c26, 0x01187c2e, 0x01346c32, 0x01ff8078, 0x039b8468, 0x0275fcfa, 0x028ad7de, 0x03516150, 0x00be526e, 0x0012d5bb}}}, + {X: Field{[10]uint32{0x01a9320c, 0x01ed43e5, 0x035dec53, 0x010afa02, 0x02772927, 0x00800e96, 0x03ad50f0, 0x03bc072a, 0x03ce3a56, 0x000f9f1f}}, Y: Field{[10]uint32{0x03dbfaf1, 0x0349c8a4, 0x03914a32, 0x00b31256, 0x01d5dc34, 0x0267ea76, 0x03789045, 0x01c447cd, 0x00b7926e, 0x00263365}}}, + {X: Field{[10]uint32{0x03cda208, 0x001c9d2d, 0x035522eb, 0x003dabd5, 0x032ac91a, 0x031318aa, 0x031aaf5e, 0x033e12af, 0x005714ce, 0x0004c7ad}}, Y: Field{[10]uint32{0x0320839e, 0x03f625f8, 0x0303127b, 0x004d8344, 0x029b017a, 0x02bb156a, 0x0061393f, 0x0098111b, 0x014ff051, 0x002a4ebb}}}, + {X: Field{[10]uint32{0x02a11ec8, 0x037493a8, 0x026f1637, 0x0380b6cf, 0x02a98e68, 0x0312d7d0, 0x008bff69, 0x018f5c0e, 0x0201e469, 0x000dc6f1}}, Y: Field{[10]uint32{0x01f84622, 0x02765292, 0x03dd37b3, 0x03c4ea9a, 0x0121bbc7, 0x006e249a, 0x0385238c, 0x028906a5, 0x02f1932f, 0x0038befb}}}, + {X: Field{[10]uint32{0x02e47d6d, 0x03d41172, 0x002371bc, 0x00d3910c, 0x01b4d459, 0x00b11461, 0x0136bc20, 0x01cfa280, 0x030492ca, 0x0011dc36}}, Y: Field{[10]uint32{0x0141ec22, 0x03bbcd8b, 0x0390af1a, 0x01ed2c75, 0x0399a92f, 0x00877d2f, 0x037e080d, 0x03641aad, 0x008c25b1, 0x00386bdd}}}, + {X: Field{[10]uint32{0x0194bfff, 0x00a04b25, 0x02fe0da8, 0x00d081e1, 0x01e8e2ae, 0x01f38ebd, 0x01dbae16, 0x036d5dd6, 0x02435af5, 0x002cc6a1}}, Y: Field{[10]uint32{0x009aa4a2, 0x010ef8f0, 0x020cf3c7, 0x0341547f, 0x00f5aaab, 0x0216c1a9, 0x02a85a25, 0x03266aa5, 0x025e860d, 0x000de4d0}}}, + {X: Field{[10]uint32{0x013631f4, 0x00b9996f, 0x019bf09b, 0x02f5f472, 0x00a94121, 0x018670dd, 0x01fe6dd1, 0x009407f7, 0x0052084a, 0x003817bb}}, Y: Field{[10]uint32{0x03b8e622, 0x031589bf, 0x01ed4f6c, 0x01ddb49a, 0x014d883d, 0x035d0909, 0x0224ea4b, 0x03e01a66, 0x03172122, 0x00300457}}}, + {X: Field{[10]uint32{0x0173d5c8, 0x0228c94a, 0x0335ce4d, 0x03beffce, 0x03e57810, 0x025f4fd5, 0x0384305d, 0x001f4d16, 0x00840ee4, 0x00395777}}, Y: Field{[10]uint32{0x027ee677, 0x03a24d90, 0x011a1026, 0x01abe833, 0x00abb87a, 0x023aec4f, 0x003e4257, 0x018505f9, 0x03b5b0fa, 0x001c7dde}}}, + {X: Field{[10]uint32{0x02cd788f, 0x03748fb7, 0x01f0ed46, 0x01dbc9aa, 0x021aabbe, 0x014074cf, 0x00bf3ea5, 0x02a6a8a1, 0x02b1a5c8, 0x003b5eda}}, Y: Field{[10]uint32{0x010db63e, 0x00cf8047, 0x030d3772, 0x0363145d, 0x03824027, 0x037f60be, 0x0054a4bc, 0x02988061, 0x035419d1, 0x0008a02e}}}, + {X: Field{[10]uint32{0x0090e79a, 0x0019c520, 0x02001f96, 0x0078893c, 0x01ce5cb7, 0x03353b9a, 0x03a3329a, 0x0362bb84, 0x01fc3da4, 0x003538cc}}, Y: Field{[10]uint32{0x015e10d6, 0x02385619, 0x00c521ae, 0x01441b42, 0x0277821e, 0x01aa2044, 0x00a6b42d, 0x0334c27d, 0x01aa2f63, 0x00225450}}}, + {X: Field{[10]uint32{0x016d4417, 0x022d21e2, 0x03d54d64, 0x02384834, 0x03265471, 0x036054b1, 0x002545ab, 0x007ff99a, 0x020ea8ec, 0x0013c2b6}}, Y: Field{[10]uint32{0x035aa591, 0x03b1fd64, 0x00cd4dc5, 0x01515b22, 0x0320aaff, 0x02a7eebd, 0x035acf55, 0x02ad191f, 0x01ac6026, 0x002980ee}}}, + {X: Field{[10]uint32{0x00fdca84, 0x03ab8f80, 0x031b7543, 0x0015041a, 0x00a884cc, 0x0037dd4a, 0x0086a9d2, 0x03bb893c, 0x0141b08e, 0x0028b44d}}, Y: Field{[10]uint32{0x00803a45, 0x000edfd7, 0x002d1745, 0x00d61780, 0x024bb67c, 0x03f58172, 0x03a52497, 0x01ae4549, 0x0166294d, 0x0016b02c}}}, + {X: Field{[10]uint32{0x01b6c8a4, 0x03a048ed, 0x0008f64f, 0x00880b38, 0x03cbfc47, 0x03ea517f, 0x00887fda, 0x001164ae, 0x0120014a, 0x00013075}}, Y: Field{[10]uint32{0x00ed738d, 0x00f8cd14, 0x026083bb, 0x03d0e542, 0x00ebcebf, 0x00d23bf5, 0x0106597f, 0x0246395f, 0x028017b7, 0x00090f10}}}, + {X: Field{[10]uint32{0x03c54390, 0x025c2a4a, 0x02c551a5, 0x01f7fcca, 0x00fc2f5b, 0x008c172c, 0x035b8e6b, 0x03a6d330, 0x01a67d13, 0x00017e79}}, Y: Field{[10]uint32{0x0395ff6f, 0x02550edc, 0x0276b30d, 0x02dc9bcc, 0x0085eb0c, 0x022fb7c0, 0x005833ce, 0x017df6f1, 0x02379696, 0x001d2021}}}, + {X: Field{[10]uint32{0x00954575, 0x00d2f282, 0x01286985, 0x025cd293, 0x004447c2, 0x0038a6ad, 0x02d28a88, 0x006c5e02, 0x03809538, 0x0035db1b}}, Y: Field{[10]uint32{0x0161b27b, 0x021cc029, 0x0049859c, 0x03c49def, 0x02aa8273, 0x00390a77, 0x02051789, 0x03806984, 0x03f86b30, 0x00112db0}}}, + {X: Field{[10]uint32{0x01df3344, 0x022816f6, 0x00658e7a, 0x0074036b, 0x006ad19f, 0x01619286, 0x03a9eaeb, 0x01d6bdc0, 0x029ff787, 0x001d5ddc}}, Y: Field{[10]uint32{0x030afec9, 0x030fe64b, 0x0134532e, 0x02c4b9c1, 0x033fa7c5, 0x0239fb3c, 0x012f8229, 0x02a94e4b, 0x0116ccea, 0x001ad466}}}, + {X: Field{[10]uint32{0x02dc17db, 0x0245b163, 0x03a67fca, 0x022c0dae, 0x0278700c, 0x01ab6a64, 0x03194258, 0x0012eb42, 0x032b457f, 0x00140de3}}, Y: Field{[10]uint32{0x02273fc1, 0x028f0bdd, 0x00ad05fe, 0x0193e0bf, 0x03269573, 0x0314ce33, 0x01bf40ba, 0x0335246b, 0x011c26bd, 0x0032f451}}}, + {X: Field{[10]uint32{0x009ba86c, 0x00e2fa33, 0x02b50b91, 0x01138f58, 0x027606eb, 0x0301e3fc, 0x0384ba0e, 0x01458098, 0x00686436, 0x000dd237}}, Y: Field{[10]uint32{0x0211d709, 0x020f2659, 0x01271965, 0x02074d43, 0x016e7bfb, 0x038060a3, 0x01005a04, 0x02ba7377, 0x0014f624, 0x001b0139}}}, + {X: Field{[10]uint32{0x03eea53b, 0x03174715, 0x014047f9, 0x010b417f, 0x013402f3, 0x027ab1ca, 0x01eaea44, 0x035587ef, 0x01be8ea8, 0x002c8e96}}, Y: Field{[10]uint32{0x006dfb9b, 0x03c3a110, 0x019c42fe, 0x03fdc0bb, 0x0295d40e, 0x00fd7e86, 0x03c359c8, 0x016e0b38, 0x0068f2d3, 0x002fa91f}}}, + {X: Field{[10]uint32{0x02a64770, 0x035c7045, 0x00b49ebf, 0x001a4973, 0x039538fc, 0x01c074ae, 0x005f4435, 0x0296f817, 0x01e87b42, 0x00392d14}}, Y: Field{[10]uint32{0x03156da4, 0x019eddcb, 0x001e9e14, 0x029a2a42, 0x014cb261, 0x02de6e61, 0x02fa86b2, 0x001d2523, 0x02699a79, 0x000abe11}}}, + {X: Field{[10]uint32{0x02dff165, 0x03dd5225, 0x01a1242f, 0x005593cf, 0x01de74a2, 0x0194777e, 0x02e671e8, 0x02c218d1, 0x02ec65b8, 0x002192b1}}, Y: Field{[10]uint32{0x031a8730, 0x03ad8009, 0x03188d68, 0x000b7ea4, 0x01b2cbf9, 0x0234afaf, 0x00a5103c, 0x02155647, 0x00a77ab4, 0x003cd5ce}}}, + {X: Field{[10]uint32{0x002ecab0, 0x009c95fc, 0x02ac4ecb, 0x035e6815, 0x00fd36c5, 0x01990e19, 0x00090225, 0x018f66de, 0x023da6a8, 0x002df412}}, Y: Field{[10]uint32{0x0383b0c1, 0x01fbdc1b, 0x031a15ec, 0x02f9d4c3, 0x001519ab, 0x039a81f0, 0x01e4e3bf, 0x03708f96, 0x034c6ba5, 0x00331018}}}, + {X: Field{[10]uint32{0x014c1a0e, 0x023f289c, 0x0044c7ca, 0x00c43af2, 0x03bd6e25, 0x02a0ddf3, 0x020de0c4, 0x03776080, 0x02f9b51e, 0x00377f06}}, Y: Field{[10]uint32{0x03fe3951, 0x0259838f, 0x01ad957b, 0x03d368f8, 0x01c30f23, 0x00976aae, 0x02d9f54a, 0x0313a2c8, 0x008c1742, 0x00033ddf}}}, + {X: Field{[10]uint32{0x011fcbe3, 0x016d1f35, 0x03c30ea7, 0x023e21a3, 0x01e00c82, 0x0053611e, 0x03de26a6, 0x02478e84, 0x0269d5bb, 0x001e3f3f}}, Y: Field{[10]uint32{0x03f2d47d, 0x029b9c91, 0x0306066d, 0x01210d03, 0x0298021b, 0x030a050e, 0x00b231aa, 0x014eeac3, 0x01636b70, 0x0027b19e}}}, + {X: Field{[10]uint32{0x0115863f, 0x00137684, 0x028fcd42, 0x0211e0ce, 0x03138c98, 0x0279dbb2, 0x022b4f81, 0x0075c608, 0x00de1696, 0x00373646}}, Y: Field{[10]uint32{0x0323bb04, 0x014aaeb2, 0x01ed2f5e, 0x003604e9, 0x023ff7fb, 0x004f0a4c, 0x012318dd, 0x00233f28, 0x00bac8d8, 0x002af0f6}}}, + {X: Field{[10]uint32{0x02c3177e, 0x00201b31, 0x012b294a, 0x028a5b33, 0x02e6f64f, 0x00def084, 0x0294eef5, 0x02041a4c, 0x02f05de0, 0x000e738b}}, Y: Field{[10]uint32{0x00730556, 0x034a76de, 0x0349239f, 0x0369e250, 0x020bbb5d, 0x03ce899a, 0x020ca926, 0x025e8e5e, 0x00cb0b76, 0x00097abd}}}, + {X: Field{[10]uint32{0x03157a04, 0x01a94f40, 0x02b5abae, 0x013f4e91, 0x02146451, 0x025eb12e, 0x010e937e, 0x03a27b7d, 0x01b643d4, 0x00125793}}, Y: Field{[10]uint32{0x02ec1701, 0x02c715f9, 0x026d46e6, 0x006e8833, 0x00f84bb8, 0x023105ad, 0x024251cf, 0x0035a7af, 0x0218b296, 0x001f4c9f}}}, + {X: Field{[10]uint32{0x037c33c1, 0x03d6e598, 0x03dbefca, 0x025fd6d9, 0x03a6cb6e, 0x027e79bd, 0x036dde52, 0x01f03070, 0x028cb635, 0x0024705f}}, Y: Field{[10]uint32{0x014c39ba, 0x017b06e9, 0x00e85c96, 0x0383da17, 0x03f07b76, 0x003d61ab, 0x01e26922, 0x022b0bbf, 0x0097fedb, 0x000bf948}}}, + {X: Field{[10]uint32{0x01ecfdbc, 0x01c48875, 0x018d4c03, 0x026f5ab8, 0x001c2874, 0x03172564, 0x011f11ec, 0x03b5118a, 0x00803dff, 0x0038f13d}}, Y: Field{[10]uint32{0x03dc62d8, 0x00afa4b2, 0x0240c65b, 0x009d514f, 0x004e7fb8, 0x033be2ca, 0x00ad71da, 0x009f3a5d, 0x0102571e, 0x00168b9c}}}, + {X: Field{[10]uint32{0x01c25073, 0x01763b5d, 0x0333acc1, 0x03a95a03, 0x0059ae7b, 0x03e772ee, 0x0014377a, 0x0079ed22, 0x03f5a0e8, 0x002cfb85}}, Y: Field{[10]uint32{0x00bfe86d, 0x024b9f5b, 0x01ecb6d0, 0x035415ce, 0x03b46332, 0x00e7b788, 0x0035afe1, 0x00a09698, 0x000c9a6d, 0x0004d68f}}}, + {X: Field{[10]uint32{0x02e76b75, 0x019819ba, 0x01732298, 0x0365796d, 0x017ca6e8, 0x019248cd, 0x02628e1f, 0x006fb4d0, 0x00442bc9, 0x0039332a}}, Y: Field{[10]uint32{0x016f76b9, 0x02364394, 0x01cececc, 0x03880c76, 0x02409f74, 0x00c66b1c, 0x00b42b0f, 0x019c3fdc, 0x015539b5, 0x00375569}}}, + {X: Field{[10]uint32{0x02223b2c, 0x02fefdf6, 0x02359b5e, 0x03aa58ad, 0x02e517e4, 0x013ab9eb, 0x00c02a46, 0x01822666, 0x03c181c9, 0x002ace73}}, Y: Field{[10]uint32{0x037d2fc4, 0x0393aa41, 0x02096a22, 0x01403e65, 0x0172ba3b, 0x00a06862, 0x01cfec18, 0x02ef8b9b, 0x0057b4dc, 0x0037bdb7}}}, + {X: Field{[10]uint32{0x03ab402a, 0x01172137, 0x02e01f8e, 0x034652ce, 0x02677572, 0x0193c206, 0x00cad409, 0x0011a7f9, 0x02639e6e, 0x0008a8c9}}, Y: Field{[10]uint32{0x00d2b437, 0x0157e610, 0x02f261b8, 0x0141750a, 0x00db44cf, 0x013263f3, 0x00f61484, 0x003bc16b, 0x0195bd4e, 0x00072727}}}, + {X: Field{[10]uint32{0x01f9cae9, 0x03f30908, 0x029037c2, 0x0285de42, 0x02db269d, 0x03ef137a, 0x03c5ead4, 0x012fc0c1, 0x00cceff9, 0x000af1e2}}, Y: Field{[10]uint32{0x00bc4b41, 0x000f9389, 0x01384aa7, 0x01227583, 0x00ccecb2, 0x0231e30f, 0x0081c43a, 0x01548110, 0x0061648c, 0x0005cbcd}}}, + {X: Field{[10]uint32{0x02052729, 0x00a8c000, 0x00fe4c62, 0x00d827ef, 0x003872c6, 0x02ef9a7a, 0x0275bb88, 0x001804d6, 0x03d2a672, 0x002e4c36}}, Y: Field{[10]uint32{0x0206f366, 0x0103fd6b, 0x01ebd839, 0x00d8ccd3, 0x01ff3f68, 0x01d0e2ce, 0x030e7f9a, 0x03a2e0a0, 0x0303a872, 0x0002660f}}}, + {X: Field{[10]uint32{0x0114e3d3, 0x02cb8e5d, 0x03466f33, 0x00fa1ca8, 0x0329bcd0, 0x029bc61b, 0x02db448d, 0x03a901c0, 0x038a2aa9, 0x002d0d5c}}, Y: Field{[10]uint32{0x0098636b, 0x01511ce4, 0x0074e92c, 0x02383d87, 0x011678cb, 0x0330d241, 0x0217e55b, 0x019c7e15, 0x02462d3c, 0x00160a34}}}, + {X: Field{[10]uint32{0x0072bd25, 0x037fee4c, 0x0223b532, 0x01fe76d8, 0x02ee1fe6, 0x01060375, 0x012df27d, 0x026ebcb1, 0x02813acc, 0x003247cb}}, Y: Field{[10]uint32{0x01b73c0c, 0x0057c1e1, 0x0345569c, 0x003ef493, 0x02b02735, 0x00ddf878, 0x02fa0c2b, 0x00bc4c4e, 0x03d696c1, 0x00072715}}}, + {X: Field{[10]uint32{0x008d36c8, 0x0257c017, 0x0131d2b9, 0x001be31f, 0x030bad0d, 0x005b6400, 0x028068f4, 0x02ea4e3c, 0x02c28099, 0x002ec251}}, Y: Field{[10]uint32{0x0176da4a, 0x00e41afb, 0x00164867, 0x007dde0b, 0x00156042, 0x03a5e3ca, 0x03e1a621, 0x017fa5e3, 0x00d93b57, 0x00238e1e}}}, + {X: Field{[10]uint32{0x03085c8d, 0x0281a923, 0x03398c31, 0x03df2d13, 0x035298db, 0x01c1fcd9, 0x0106521a, 0x00cdd335, 0x02a12e82, 0x0012178e}}, Y: Field{[10]uint32{0x02ca9a61, 0x018005e1, 0x03878a4b, 0x03837ed3, 0x02af0153, 0x000bf098, 0x0339d4c3, 0x02cac568, 0x02f57079, 0x00284b22}}}, + {X: Field{[10]uint32{0x013e844d, 0x027ee69c, 0x03db3e8a, 0x00a9e219, 0x020f21d0, 0x022a5baa, 0x00da03fe, 0x00895a50, 0x0048d328, 0x002143e5}}, Y: Field{[10]uint32{0x03fccb7b, 0x02c9108e, 0x00d8259a, 0x00d8296a, 0x0103a678, 0x0162a083, 0x034df3af, 0x02e8b029, 0x00fe3201, 0x00115479}}}, + {X: Field{[10]uint32{0x03e39884, 0x03214ec2, 0x01c43682, 0x030152db, 0x01449cd4, 0x03abd476, 0x00e51b18, 0x007f927e, 0x02b3f66c, 0x0029d205}}, Y: Field{[10]uint32{0x0372f7fc, 0x033bdfac, 0x0004f15e, 0x039203b2, 0x01396626, 0x01330416, 0x02f0cfdc, 0x01fa8516, 0x03b247ed, 0x00139f57}}}, + {X: Field{[10]uint32{0x0320136d, 0x02b5adde, 0x02f7785e, 0x00b5ae62, 0x02e1eb70, 0x00d04805, 0x01abcc17, 0x02885c1e, 0x016fc71d, 0x000abd71}}, Y: Field{[10]uint32{0x02b706bd, 0x01455061, 0x029321b6, 0x03642d4c, 0x02783911, 0x00c69ae3, 0x0049e95a, 0x00988ecb, 0x00a2c6a8, 0x001fcc44}}}, + {X: Field{[10]uint32{0x039b5834, 0x013fb90c, 0x00903968, 0x00525c98, 0x031a3137, 0x02b983b6, 0x0163135f, 0x037c7a43, 0x0091a61a, 0x0024a47b}}, Y: Field{[10]uint32{0x01d03884, 0x007745ef, 0x01e09bac, 0x02f2b78b, 0x03feef42, 0x020cb7a4, 0x009649f1, 0x036ecff0, 0x006be8b0, 0x00354c14}}}, + {X: Field{[10]uint32{0x00605b54, 0x0110a4b3, 0x028e1144, 0x034608f3, 0x03a8581f, 0x03863fda, 0x029cb474, 0x01e05813, 0x03c3659a, 0x000582b4}}, Y: Field{[10]uint32{0x00d141fe, 0x007d09a9, 0x03b58b6e, 0x03060636, 0x010a59f2, 0x007ae476, 0x01f939eb, 0x035c6698, 0x024d5f28, 0x00058611}}}, + {X: Field{[10]uint32{0x00ba9d58, 0x01c64d18, 0x02572b40, 0x03e18d62, 0x01ea4280, 0x01cf6b63, 0x005a5d76, 0x024830b6, 0x01bb8640, 0x000d4966}}, Y: Field{[10]uint32{0x03538d0c, 0x01f470a2, 0x0164a50f, 0x03618e35, 0x00aa2ac3, 0x00f2572b, 0x017707ad, 0x013cac8b, 0x011be806, 0x0029e296}}}, + {X: Field{[10]uint32{0x036ba527, 0x00b13ede, 0x03f334d1, 0x038488da, 0x01adb37c, 0x03a78575, 0x037a7281, 0x018d364b, 0x03bd9a8c, 0x003b083b}}, Y: Field{[10]uint32{0x0151b70d, 0x015ecec3, 0x021e2a9a, 0x024bf550, 0x02e8c547, 0x01ebe762, 0x019315e2, 0x00c454e4, 0x01bc2a5a, 0x002b36ca}}}, + {X: Field{[10]uint32{0x02dbebc3, 0x02b51838, 0x0064c5cf, 0x0214618f, 0x01bbd387, 0x0165e07a, 0x02e847dc, 0x031bb157, 0x00da8bda, 0x00103479}}, Y: Field{[10]uint32{0x016e9ab0, 0x0099568c, 0x013acd3a, 0x03fc9fed, 0x004e3755, 0x02e8fb06, 0x03c7d5bd, 0x00b9a299, 0x001cb7c9, 0x00318c16}}}, + {X: Field{[10]uint32{0x027d08c7, 0x02e91103, 0x035127db, 0x00b7c3fe, 0x0081674c, 0x022d9b7d, 0x01ac1c39, 0x037cb8ac, 0x03402faa, 0x003ef849}}, Y: Field{[10]uint32{0x03f412d6, 0x00bdee2d, 0x0187c52f, 0x00d39ba1, 0x00f3dfee, 0x011245a6, 0x00871821, 0x005340eb, 0x00d7f979, 0x003403b7}}}, + {X: Field{[10]uint32{0x0191eb03, 0x0364c370, 0x0008bb0c, 0x0358990c, 0x034070d9, 0x03ec7848, 0x010fbd80, 0x0247ee21, 0x01a747d1, 0x0035e06d}}, Y: Field{[10]uint32{0x006afa11, 0x01ac63cd, 0x03792d90, 0x00c09236, 0x019762ef, 0x0066ca44, 0x01f29245, 0x02ad57e5, 0x01a25c74, 0x00292aa5}}}, + {X: Field{[10]uint32{0x00cf02cd, 0x0111bc27, 0x0052944a, 0x00e7b948, 0x0122790c, 0x00e56d7a, 0x01045d00, 0x02f1f045, 0x0042d926, 0x00191cbf}}, Y: Field{[10]uint32{0x0205a99d, 0x02de2511, 0x0106863d, 0x02d438ab, 0x03045d1a, 0x00cf210a, 0x0264e376, 0x024f7b88, 0x0014a925, 0x00001448}}}, + {X: Field{[10]uint32{0x015e0c21, 0x0057b58e, 0x03fd2c57, 0x00993203, 0x005fa6cf, 0x01181e8b, 0x0117a935, 0x0007a1a9, 0x00c2e096, 0x003bb860}}, Y: Field{[10]uint32{0x0083e7ea, 0x01259a5d, 0x01711e06, 0x03c6b995, 0x0349490a, 0x03de1728, 0x03daff70, 0x01bf16d3, 0x0398221d, 0x003232e9}}}, + {X: Field{[10]uint32{0x01ada2d6, 0x012dd411, 0x00ab4fad, 0x03536d40, 0x039103be, 0x015d8c1d, 0x03ec071c, 0x02b50456, 0x022da172, 0x002402c9}}, Y: Field{[10]uint32{0x01e2cbaf, 0x0108f814, 0x015aa371, 0x0361459d, 0x0082c4c1, 0x00fe8d35, 0x0018e7fb, 0x03fa44fd, 0x03f2bbad, 0x000c5915}}}, + {X: Field{[10]uint32{0x03a34c9e, 0x02006884, 0x00e20420, 0x02c799af, 0x015d5e03, 0x027bca74, 0x02d3371b, 0x0141c1dc, 0x03874e1e, 0x001fa4f6}}, Y: Field{[10]uint32{0x038465a8, 0x0308ce78, 0x0356abc2, 0x011ed6fe, 0x0063f3ec, 0x00033704, 0x03aa0fee, 0x00ca9bd7, 0x02247500, 0x00337aa9}}}, + {X: Field{[10]uint32{0x01a379ca, 0x02320be2, 0x031f5da9, 0x01e80fb6, 0x02d17287, 0x012aff8e, 0x02761b84, 0x02957799, 0x002465f3, 0x001187ed}}, Y: Field{[10]uint32{0x00e815d9, 0x014a16c6, 0x0332b7f1, 0x0299ae39, 0x011f584a, 0x00179070, 0x0101dadc, 0x009c63d5, 0x01fdba03, 0x001da098}}}, + {X: Field{[10]uint32{0x0019e09f, 0x0379de25, 0x0059e997, 0x02997cd4, 0x036de28a, 0x006e93e4, 0x010f0cc9, 0x00683f97, 0x001af0f6, 0x000767d6}}, Y: Field{[10]uint32{0x011bf6cd, 0x00da6d22, 0x011f8adf, 0x00758889, 0x003f02db, 0x0259dbd5, 0x00302e18, 0x03715858, 0x018c7d59, 0x001ffa72}}}, + {X: Field{[10]uint32{0x027542c6, 0x010e085d, 0x0362be23, 0x03fcf337, 0x0166386d, 0x013bf8de, 0x00f7a70e, 0x00aa9c90, 0x0352904b, 0x002335c2}}, Y: Field{[10]uint32{0x01ddc2f2, 0x01afb26d, 0x001f1ff8, 0x00f62195, 0x020e9e29, 0x01caf1ae, 0x0308bb2f, 0x002c7c03, 0x003f4c7e, 0x002cf0f4}}}, + {X: Field{[10]uint32{0x034a5261, 0x02a98a3a, 0x02a2e819, 0x008d3910, 0x0199097b, 0x00036bbf, 0x025b8b38, 0x02196e66, 0x03ea9c08, 0x00282d51}}, Y: Field{[10]uint32{0x02ca2952, 0x0377627c, 0x03a2280c, 0x0063cb48, 0x00fd9d1e, 0x0289fad8, 0x003cb4e1, 0x00403700, 0x0115e585, 0x00181fbc}}}, + {X: Field{[10]uint32{0x0344d289, 0x0358d810, 0x0177578d, 0x03d57f6f, 0x00192406, 0x01fa06ad, 0x03a649c2, 0x00e38da0, 0x00f65470, 0x003aa298}}, Y: Field{[10]uint32{0x01822fb0, 0x003dd19e, 0x00691ac1, 0x033d4183, 0x02881b5f, 0x02f08bc5, 0x00b9f3e3, 0x0357aa3f, 0x02c0b05a, 0x00262bf2}}}, + {X: Field{[10]uint32{0x00b0a711, 0x02335285, 0x0075501a, 0x001a44d4, 0x0148bce5, 0x016ede0a, 0x01488fe5, 0x03e7bddf, 0x029d0882, 0x00398146}}, Y: Field{[10]uint32{0x02920fce, 0x02853d8b, 0x03498ffa, 0x0209364c, 0x00c1ec0c, 0x0182bdd7, 0x01257b8a, 0x02d5572e, 0x02be9d9e, 0x00072736}}}, + {X: Field{[10]uint32{0x00765674, 0x01497a62, 0x02a4b39a, 0x03153e3a, 0x03165338, 0x001f8396, 0x00e5efbc, 0x034cdc1b, 0x02c9c50f, 0x0018021d}}, Y: Field{[10]uint32{0x03ea4189, 0x01e5b936, 0x0346a213, 0x00b981a9, 0x03b04420, 0x0282c856, 0x01f5da0a, 0x0087ce0f, 0x031ef52b, 0x00100699}}}, + {X: Field{[10]uint32{0x02b2ff40, 0x03c7a5fd, 0x00185274, 0x01596df8, 0x003c0eca, 0x01a78105, 0x03efe121, 0x03f7426c, 0x039c5ef6, 0x000ec116}}, Y: Field{[10]uint32{0x02780a28, 0x039a04d8, 0x02dfad20, 0x01ef2c4d, 0x03a135a4, 0x035a4530, 0x00085d05, 0x001f10aa, 0x03acb211, 0x002a95dc}}}, + {X: Field{[10]uint32{0x01f0f1b6, 0x03b9fd2c, 0x022dc643, 0x0077954a, 0x01f9504b, 0x03b673bd, 0x027807fd, 0x01578135, 0x0132ee0b, 0x00373a63}}, Y: Field{[10]uint32{0x033fb086, 0x01687787, 0x031b8d43, 0x038a0077, 0x03aba058, 0x02b3d509, 0x03746d67, 0x00925f2e, 0x027c9e99, 0x00340eb0}}}, + {X: Field{[10]uint32{0x0378fd76, 0x03a61338, 0x0144958b, 0x01fc8be8, 0x03dd5aea, 0x00da19e1, 0x011c07a9, 0x0183fa2a, 0x01486e8a, 0x000d96c4}}, Y: Field{[10]uint32{0x0301c9c0, 0x00add87b, 0x005c3f85, 0x019d53d0, 0x01b36e27, 0x036ee3b0, 0x01ecbbcb, 0x01754131, 0x0217319e, 0x000b1fd4}}}, + {X: Field{[10]uint32{0x036b5806, 0x01cecbaa, 0x006cbb9c, 0x03a15f26, 0x023c3720, 0x013b78d5, 0x00dc3cad, 0x0197b7ba, 0x035a4dc4, 0x000b8de4}}, Y: Field{[10]uint32{0x03ce346b, 0x00e51752, 0x01522c0e, 0x0240431b, 0x02839cb6, 0x01fe0692, 0x02dc7f9d, 0x03d1b600, 0x03f15278, 0x002f421c}}}, + {X: Field{[10]uint32{0x01647568, 0x02eba53c, 0x030bb00f, 0x0215b91e, 0x0081cd85, 0x0035c656, 0x00ddf927, 0x016b5ed8, 0x00e19374, 0x000126da}}, Y: Field{[10]uint32{0x02819dc1, 0x01a4f01c, 0x03795755, 0x00c43d29, 0x021dc82d, 0x03d2e16f, 0x03cb2d05, 0x010fbd4e, 0x03f0013e, 0x00328752}}}, + {X: Field{[10]uint32{0x02744564, 0x00c3f33e, 0x0220cb81, 0x02e8f981, 0x016c8cc6, 0x027b781d, 0x02b6f66e, 0x016a20b0, 0x016cc79c, 0x001b7d4f}}, Y: Field{[10]uint32{0x02431344, 0x02013449, 0x036e1729, 0x01f2bed5, 0x014597f7, 0x00698525, 0x032f2914, 0x01f16491, 0x02ed3b2b, 0x001230f5}}}, + {X: Field{[10]uint32{0x034865a1, 0x0385c36f, 0x02b8bd28, 0x0307238c, 0x022f9467, 0x019c5168, 0x01636727, 0x038ee498, 0x03069104, 0x003667e3}}, Y: Field{[10]uint32{0x02543d7f, 0x02ff9414, 0x01479fd1, 0x00cf9044, 0x00c2b433, 0x0301b2c6, 0x0267c4e2, 0x01764d93, 0x02b055aa, 0x00333f11}}}, + {X: Field{[10]uint32{0x019930d1, 0x03ab64f9, 0x0342a538, 0x03f71a30, 0x01e23af7, 0x01562816, 0x00075728, 0x020ce2ea, 0x0017ebbf, 0x001ddc9f}}, Y: Field{[10]uint32{0x00c629ea, 0x0380ce10, 0x0308366d, 0x02504cf9, 0x00ede751, 0x017d4329, 0x023bc657, 0x0060083f, 0x007e2cde, 0x00280df7}}}, + {X: Field{[10]uint32{0x03e22604, 0x00328bda, 0x0266377e, 0x022667b0, 0x0036ae37, 0x0344ce6b, 0x00c84cfa, 0x013fdf05, 0x02d8563a, 0x0007503a}}, Y: Field{[10]uint32{0x00d1face, 0x007b0488, 0x01713a71, 0x00b6a5a3, 0x033a6b0c, 0x03137ee1, 0x025a5ac1, 0x0245ffb9, 0x0043b093, 0x002125ed}}}, + {X: Field{[10]uint32{0x006bfae0, 0x0241c410, 0x010ef405, 0x02645e8f, 0x03e32269, 0x0061034d, 0x0227c205, 0x02accdc6, 0x0341adf5, 0x0000a8e7}}, Y: Field{[10]uint32{0x005c27c5, 0x03cab1a4, 0x008ed155, 0x027b1c12, 0x008dd1a4, 0x03a11306, 0x0236b048, 0x027ee08e, 0x03a858e9, 0x000336bd}}}, + {X: Field{[10]uint32{0x01c684e0, 0x00dc2206, 0x0215e281, 0x024adb38, 0x0166f5ea, 0x0365d288, 0x031cc92f, 0x02331225, 0x00b1d8b0, 0x0002aab9}}, Y: Field{[10]uint32{0x03cd8f0c, 0x035e3a78, 0x01bdea34, 0x0344e909, 0x03c63739, 0x0145478c, 0x03d5cd50, 0x00d22a13, 0x0195c10a, 0x000248de}}}, + {X: Field{[10]uint32{0x02477d40, 0x03f6bf39, 0x03440965, 0x01520c7b, 0x0211315a, 0x02b0b278, 0x00939d29, 0x014ed8cd, 0x0042591a, 0x00296c30}}, Y: Field{[10]uint32{0x00a62ca6, 0x01e97301, 0x016d7e11, 0x03234a90, 0x00bc9904, 0x00f1f758, 0x022b206b, 0x000922cd, 0x00fd5d1f, 0x002b0f9f}}}, + {X: Field{[10]uint32{0x03c63f0b, 0x00b907c9, 0x035a1278, 0x02d40faf, 0x003c16e3, 0x03c252f9, 0x03643b47, 0x01aa5aa3, 0x0164e616, 0x000306dc}}, Y: Field{[10]uint32{0x01663a98, 0x003c079d, 0x01207fcc, 0x02fdcfb4, 0x01e34810, 0x0378eb1e, 0x010ba811, 0x03c7fd6d, 0x021a4ffa, 0x00211a45}}}, + {X: Field{[10]uint32{0x01ca63bc, 0x0263852b, 0x028b457b, 0x01763f7c, 0x00342e60, 0x03ac9b74, 0x00e0f2c8, 0x018fc136, 0x00254b79, 0x000263f6}}, Y: Field{[10]uint32{0x01a192d6, 0x0184456c, 0x0098f220, 0x0096f848, 0x012dc143, 0x032f2e67, 0x039dba65, 0x019991df, 0x000d213f, 0x0038a5ea}}}, + {X: Field{[10]uint32{0x014c3281, 0x02ceab56, 0x00dc163e, 0x033605ab, 0x0148c464, 0x030b9bc6, 0x034127d8, 0x03b524b4, 0x024971b6, 0x003c7c21}}, Y: Field{[10]uint32{0x00f31f5c, 0x00ce2ac0, 0x0031a346, 0x0394bf7b, 0x03506a0d, 0x01580b9b, 0x038954d8, 0x013ea44e, 0x02a0f9e0, 0x00009ab8}}}, + {X: Field{[10]uint32{0x030dd197, 0x010388e4, 0x03a91172, 0x00e98688, 0x01b63af8, 0x00141bed, 0x03441eac, 0x034ab298, 0x00cdc324, 0x0003fd1c}}, Y: Field{[10]uint32{0x0227788f, 0x00983495, 0x01eba5a5, 0x012e3f4c, 0x0330734b, 0x007be9ce, 0x007a772a, 0x01dfa118, 0x026bb18e, 0x0039807d}}}, + {X: Field{[10]uint32{0x006c63a6, 0x0110b7ef, 0x016dcd04, 0x02e4ccbb, 0x00ad0f82, 0x02aaeeaa, 0x0008127b, 0x02865ad6, 0x006d968a, 0x00243aaf}}, Y: Field{[10]uint32{0x035038f1, 0x03e93bae, 0x030f94c1, 0x038f7370, 0x032faed3, 0x0111daca, 0x03fc4be4, 0x00f35cb7, 0x0367ffb2, 0x0035b7c3}}}, + {X: Field{[10]uint32{0x007e11af, 0x012e2ef3, 0x03866ecd, 0x02dbfabc, 0x02bc0a43, 0x00c00d8f, 0x01e0826b, 0x001e86d0, 0x0126acc5, 0x003885ec}}, Y: Field{[10]uint32{0x01e98f30, 0x007f1b92, 0x01ecda8d, 0x017ec0c8, 0x02921e3a, 0x02c9e8e1, 0x00eb7332, 0x00cf562e, 0x01ef83db, 0x001faca3}}}, + {X: Field{[10]uint32{0x00e1d184, 0x039a2a7f, 0x0228d20d, 0x03bb1e55, 0x02b5d008, 0x01362ab4, 0x032bc218, 0x0175785d, 0x03d582b8, 0x000a865b}}, Y: Field{[10]uint32{0x02201303, 0x00e67d98, 0x022300c3, 0x019e2760, 0x0368526c, 0x02b4bfc7, 0x038dc8cc, 0x038f53f7, 0x0257ee9e, 0x002652d1}}}, + {X: Field{[10]uint32{0x02de4342, 0x0074099e, 0x002e6132, 0x02f5f99b, 0x02ca770c, 0x00463def, 0x01897c81, 0x0329fa2a, 0x03c83a6e, 0x002f278e}}, Y: Field{[10]uint32{0x014f3f4b, 0x01950b5c, 0x030a3f34, 0x0184be12, 0x00e2b076, 0x017cd749, 0x00992917, 0x029586ae, 0x03e2d544, 0x00275fbd}}}, + {X: Field{[10]uint32{0x02f198b3, 0x0144aaac, 0x00cdf6f6, 0x03b79a47, 0x017e76b8, 0x03c4bc82, 0x029e3676, 0x027e13fa, 0x03f3842a, 0x003fca04}}, Y: Field{[10]uint32{0x03fe1949, 0x012128b0, 0x03f7618a, 0x00abd00a, 0x01b8b668, 0x02027d21, 0x02de4380, 0x030586b1, 0x03d666d0, 0x00081b8e}}}, + {X: Field{[10]uint32{0x01af05f7, 0x011e6e34, 0x01baf6c7, 0x02f9382b, 0x0234a50b, 0x01da75f2, 0x01423210, 0x0358faf8, 0x01df2d38, 0x001b9d66}}, Y: Field{[10]uint32{0x03654c8d, 0x01bea978, 0x002cd555, 0x0117b346, 0x03256143, 0x01ad251a, 0x01ed56eb, 0x0136212a, 0x031d4b0e, 0x0008cf73}}}, + {X: Field{[10]uint32{0x03666146, 0x0141c64c, 0x039f9ba2, 0x00bad5db, 0x03839766, 0x02797059, 0x01844d1a, 0x03aca053, 0x00d56c82, 0x0007b767}}, Y: Field{[10]uint32{0x01f43f4c, 0x00946f8f, 0x0165fe24, 0x03725776, 0x0239d48d, 0x0345a083, 0x01b5cb04, 0x03a0fa52, 0x02850b2e, 0x002803d2}}}, + {X: Field{[10]uint32{0x007324af, 0x01e7ed90, 0x02b0718d, 0x01ce4b5e, 0x02818a2f, 0x00e2a07a, 0x024a0907, 0x01335dda, 0x02061f79, 0x0009c8f7}}, Y: Field{[10]uint32{0x02bbf41f, 0x00707fb1, 0x00e783db, 0x01c9df34, 0x0038daad, 0x0112ae22, 0x013429e3, 0x003140f1, 0x01bef981, 0x000d71ea}}}, + {X: Field{[10]uint32{0x039a213d, 0x027289aa, 0x0353af46, 0x00ae9f1a, 0x023874ec, 0x010f04f0, 0x01659eeb, 0x0137bdb6, 0x02444cb5, 0x001313ec}}, Y: Field{[10]uint32{0x038efa3d, 0x01d47956, 0x02472082, 0x036168d5, 0x03d4a1ae, 0x0126cce3, 0x039ad153, 0x01ea7ffa, 0x02fe5644, 0x002ef4ba}}}, + {X: Field{[10]uint32{0x027593e3, 0x0255c819, 0x0212f250, 0x034a3939, 0x0112847e, 0x03ecfef3, 0x03069771, 0x0256a238, 0x01f73479, 0x001cd8d6}}, Y: Field{[10]uint32{0x02bd3741, 0x0256fe44, 0x015f972c, 0x02920359, 0x00e303fd, 0x02e3e61a, 0x02215ca6, 0x001448d6, 0x03ed4bce, 0x0008eecd}}}, + {X: Field{[10]uint32{0x01f595be, 0x01e53661, 0x03293825, 0x03df0332, 0x026f33b0, 0x0021e6fb, 0x01813946, 0x01af452e, 0x0194ee93, 0x000572e5}}, Y: Field{[10]uint32{0x031bb152, 0x00950a7e, 0x0149ac7f, 0x03997962, 0x03e2e133, 0x036c9d3b, 0x03775e9e, 0x006ad804, 0x032a2ec8, 0x002aab5d}}}, + {X: Field{[10]uint32{0x03e78fa4, 0x01b159da, 0x00a9b41e, 0x01de987c, 0x02df5747, 0x002e1dca, 0x0290eb82, 0x033c7a12, 0x01ab97e5, 0x000ed522}}, Y: Field{[10]uint32{0x022219be, 0x00d33d95, 0x00cf9e71, 0x03aeeec4, 0x020d59a1, 0x0044f592, 0x02cad63f, 0x01285f33, 0x03c8e967, 0x00051744}}}, + {X: Field{[10]uint32{0x029dd2f5, 0x005d65e8, 0x01c56684, 0x0130e896, 0x0323323e, 0x0167389a, 0x01bec7bb, 0x034e16c2, 0x019aa6f9, 0x001e346e}}, Y: Field{[10]uint32{0x0216a122, 0x0220dedf, 0x020ef3cd, 0x033856d2, 0x00a6b890, 0x027da8a0, 0x014369ce, 0x02c8433d, 0x01f8e883, 0x00072344}}}, + {X: Field{[10]uint32{0x01661e85, 0x03457ece, 0x0121070c, 0x0060afa0, 0x02d2fd2d, 0x024e244b, 0x0013e3f0, 0x03eef4ea, 0x028c5cef, 0x000e1793}}, Y: Field{[10]uint32{0x0368069c, 0x00b6b2ea, 0x02c7036e, 0x03896337, 0x02c9b168, 0x00730232, 0x03ceb21c, 0x03ef1484, 0x00149f5c, 0x003d2871}}}, + {X: Field{[10]uint32{0x011aec6a, 0x0365c465, 0x02b1fc28, 0x00c0a4b5, 0x02a7c872, 0x014fa4a4, 0x0130df3c, 0x01b1b922, 0x0070d8e4, 0x000c43e3}}, Y: Field{[10]uint32{0x0017146f, 0x021bd70d, 0x01efdb03, 0x017db73b, 0x0359d92d, 0x0175c11b, 0x0315154d, 0x001ec959, 0x01d3c92c, 0x001bf8c6}}}, + {X: Field{[10]uint32{0x03c70bbb, 0x01996175, 0x00912940, 0x02590884, 0x03c1f91a, 0x02356248, 0x030b80d4, 0x03542b85, 0x003023d1, 0x001d93cf}}, Y: Field{[10]uint32{0x03dca724, 0x01f2d038, 0x038e4b54, 0x02e323ca, 0x03c3ee9e, 0x01e32673, 0x01411468, 0x02d283b6, 0x031abecd, 0x002f64be}}}, + {X: Field{[10]uint32{0x03e68126, 0x01fbdca8, 0x031ab36f, 0x01d4f11e, 0x02b37a80, 0x010042e2, 0x013c86f8, 0x028dfc6f, 0x03bab357, 0x000f5748}}, Y: Field{[10]uint32{0x0334255b, 0x0056575a, 0x028e0821, 0x018424c1, 0x017ccbb4, 0x017e7037, 0x00893c5f, 0x0009960e, 0x0041bdcf, 0x000aef46}}}, + {X: Field{[10]uint32{0x027f8a1e, 0x0095ae0a, 0x00dc087e, 0x01f543d4, 0x006d4ddd, 0x019d67a5, 0x03d2affd, 0x01ee2ffa, 0x01adcdfc, 0x0029c10c}}, Y: Field{[10]uint32{0x0147f593, 0x0091fd64, 0x01f20384, 0x00861bfd, 0x00231639, 0x03bfb32e, 0x03d77e8b, 0x02cbab0c, 0x022b9362, 0x000f290d}}}, + {X: Field{[10]uint32{0x000e8a7d, 0x0358f98c, 0x00697bf7, 0x03689177, 0x032263e9, 0x03177500, 0x00004327, 0x00bb3cf2, 0x02122c1b, 0x000a8e20}}, Y: Field{[10]uint32{0x02f6ff78, 0x00b20884, 0x01175fd7, 0x03669c91, 0x01a339c0, 0x02a6dcea, 0x005f2faf, 0x01efc0f7, 0x018853b8, 0x002b25b4}}}, + {X: Field{[10]uint32{0x024b5451, 0x005f0290, 0x01a9ab4d, 0x03fccc1a, 0x0356b49b, 0x015f8c04, 0x00bc545f, 0x0008bad4, 0x01a40ae3, 0x003a6716}}, Y: Field{[10]uint32{0x029bada0, 0x0111758b, 0x03349baf, 0x0260820d, 0x02b4fe1a, 0x00541645, 0x03737b56, 0x03eaddb0, 0x0379fe55, 0x000a6c92}}}, + {X: Field{[10]uint32{0x003306d4, 0x0300d382, 0x0384bf19, 0x035ac368, 0x03c0be26, 0x030ff8b4, 0x03f1a3c3, 0x0317b7d8, 0x02d1bd5a, 0x0028290b}}, Y: Field{[10]uint32{0x00a0bbc3, 0x033d8457, 0x039e4e5b, 0x01e59c99, 0x008aad08, 0x030c83ba, 0x0293e288, 0x008dd1e8, 0x03d2d444, 0x0030e7fc}}}, + {X: Field{[10]uint32{0x009e0053, 0x021baef0, 0x00b01c0b, 0x021c2dbc, 0x035cc17e, 0x01065cc3, 0x011670e1, 0x03c18fc7, 0x01d69ba9, 0x002e54b9}}, Y: Field{[10]uint32{0x01c46ae0, 0x023c31cb, 0x010ca0fe, 0x026bd4f3, 0x02273a4f, 0x02fc942b, 0x031c9b5b, 0x02e369b9, 0x019fa230, 0x00307a02}}}, + {X: Field{[10]uint32{0x01a4e904, 0x03e0ffa5, 0x01a2e620, 0x02319575, 0x01be83c1, 0x00498872, 0x03892b45, 0x017d3918, 0x033a130f, 0x000ebb89}}, Y: Field{[10]uint32{0x030af7e7, 0x03bac3ef, 0x01131eb7, 0x00d67a32, 0x009237b0, 0x024fe51c, 0x003c6a0b, 0x02db73cb, 0x01c6921f, 0x003b7d1d}}}, + {X: Field{[10]uint32{0x0266ceac, 0x0389576e, 0x0044965c, 0x01974a34, 0x00aa2f9e, 0x021e09ff, 0x0310d91b, 0x02bc1ab2, 0x00dcdc65, 0x00025b77}}, Y: Field{[10]uint32{0x0100ab39, 0x03e14bb4, 0x03584215, 0x01f98080, 0x039e2bf3, 0x0042ef08, 0x030d4fe3, 0x01009320, 0x036817fd, 0x000b9b40}}}, + {X: Field{[10]uint32{0x030334a3, 0x017eb934, 0x004d5af4, 0x039e78d6, 0x01e0d07a, 0x00a507e8, 0x00e111c3, 0x03b276c4, 0x0006c757, 0x003f543d}}, Y: Field{[10]uint32{0x013fde6f, 0x03d2f3f5, 0x03348324, 0x003b184d, 0x00ed9ccb, 0x03e36ca2, 0x01b1d364, 0x001a3f1f, 0x0094d49c, 0x001c6ddd}}}, + {X: Field{[10]uint32{0x03a097d1, 0x0193e45a, 0x03a77d3c, 0x004af28e, 0x03bd0611, 0x015a2ae6, 0x014915c9, 0x01148c18, 0x02681195, 0x001bcb60}}, Y: Field{[10]uint32{0x00787a87, 0x003bde0d, 0x035afe88, 0x01a34097, 0x0297261d, 0x029591e8, 0x017fe722, 0x029f134c, 0x0199849c, 0x002af904}}}, + {X: Field{[10]uint32{0x01cc1400, 0x019091c8, 0x03c9d3f0, 0x036f8988, 0x029c5099, 0x020ca8c4, 0x0283d2ce, 0x02d8a89d, 0x01b76dff, 0x00362303}}, Y: Field{[10]uint32{0x01cec51f, 0x0398d4a3, 0x034ea542, 0x02250c6e, 0x02ba5aa2, 0x0021ccad, 0x001726df, 0x01fa4976, 0x015adf6d, 0x00144d3c}}}, + {X: Field{[10]uint32{0x007105fe, 0x03d55f9d, 0x01562d95, 0x012a9c75, 0x00b6c0fd, 0x0080bf93, 0x01013632, 0x00fca3ab, 0x02e4ddde, 0x002a37a6}}, Y: Field{[10]uint32{0x03be8803, 0x00f8f6a8, 0x0107e038, 0x010dbbea, 0x02536820, 0x01f71d4a, 0x03c39a51, 0x02d85242, 0x006b5a71, 0x0005e7a5}}}, + {X: Field{[10]uint32{0x03cd45ac, 0x00942aa3, 0x037ae6eb, 0x03bf9201, 0x01799c94, 0x003996c3, 0x02a48118, 0x00f50276, 0x0027f7dc, 0x00189b1a}}, Y: Field{[10]uint32{0x01bf2f32, 0x031758cc, 0x01c00fce, 0x02841e06, 0x02b30b7e, 0x036e2397, 0x024a2db8, 0x01eca0cb, 0x01db87cf, 0x0000f596}}}, + {X: Field{[10]uint32{0x00a77d02, 0x01213d0b, 0x004955b5, 0x03bed488, 0x021666eb, 0x03d5b3c0, 0x00b2ef69, 0x03e91f6d, 0x022cf00e, 0x0000a28e}}, Y: Field{[10]uint32{0x0393c82b, 0x0266c5a0, 0x01b01f77, 0x00de5e53, 0x030fc168, 0x009c21b1, 0x00e90fb9, 0x01c3b667, 0x00edfc98, 0x00023740}}}, + {X: Field{[10]uint32{0x01545786, 0x00a4dc30, 0x02bd5dbb, 0x01d5fee4, 0x02c3b672, 0x005e2923, 0x01d0dc2f, 0x01901491, 0x029f27c4, 0x0037c2c0}}, Y: Field{[10]uint32{0x02a1099a, 0x03462900, 0x0279c6cc, 0x012ffa85, 0x01757b47, 0x004067c5, 0x00a5ad4e, 0x0166a204, 0x0105c7e1, 0x003c4cfb}}}, + {X: Field{[10]uint32{0x001a49ef, 0x02ef17f7, 0x02c8b421, 0x020d31f0, 0x020c5497, 0x0229ad8e, 0x02162a4e, 0x002f94b4, 0x03af9c1e, 0x00371bd5}}, Y: Field{[10]uint32{0x00f1a0c4, 0x01f84104, 0x0379e9e9, 0x01287064, 0x0366fca4, 0x02ce26ea, 0x02ee20d9, 0x03f97258, 0x02afe610, 0x001bd61a}}}, + {X: Field{[10]uint32{0x0255cd15, 0x00ece62c, 0x02ac4bf1, 0x00ba838f, 0x03816247, 0x02070764, 0x02dcc0fa, 0x031a4066, 0x02a2e0d2, 0x0036de5b}}, Y: Field{[10]uint32{0x0105ac88, 0x010c4f1f, 0x033e2947, 0x00810ef6, 0x02793754, 0x006478a3, 0x01e07662, 0x03ed1190, 0x02a732e1, 0x000b9831}}}, + {X: Field{[10]uint32{0x01633a2d, 0x03f8da4d, 0x023ca059, 0x01a4c2c1, 0x02881fe2, 0x01d3e233, 0x03a3efce, 0x0263f696, 0x029e72ea, 0x0015a6d9}}, Y: Field{[10]uint32{0x00ca0c8c, 0x02ddd57e, 0x00ca2f76, 0x01bffd3e, 0x02220b6a, 0x03ad78dd, 0x033f7406, 0x03e1c976, 0x02af2551, 0x002eb763}}}, + {X: Field{[10]uint32{0x00468ae4, 0x02b0ccde, 0x02451421, 0x004617f4, 0x02ec7951, 0x00b45d71, 0x036b6f0e, 0x00ceef52, 0x00201f9a, 0x000d84c9}}, Y: Field{[10]uint32{0x033c4314, 0x005863fe, 0x01dee282, 0x005c3655, 0x0262a58e, 0x011d5921, 0x02ba1351, 0x01cd99bb, 0x02cef7bc, 0x003d1ed5}}}, + {X: Field{[10]uint32{0x014a469c, 0x013b4cd2, 0x015b1b60, 0x020f24bf, 0x03855a07, 0x020b6c3f, 0x00fa2431, 0x00805246, 0x00371e4d, 0x00337ac8}}, Y: Field{[10]uint32{0x00dfa7d8, 0x031bde76, 0x03393a83, 0x03555462, 0x02970a7e, 0x0213b941, 0x010098bc, 0x00e074bf, 0x03186829, 0x001f4f1d}}}, + {X: Field{[10]uint32{0x031598ef, 0x005f3f05, 0x03755c87, 0x01d3e36d, 0x03ff6c4d, 0x037a23ff, 0x013b721a, 0x0317b003, 0x03a9d750, 0x00180d73}}, Y: Field{[10]uint32{0x03dd675a, 0x027f6d81, 0x01cb749f, 0x035f5632, 0x029bb129, 0x0120b480, 0x02dcde65, 0x0090d904, 0x00da160b, 0x003f85e6}}}, + {X: Field{[10]uint32{0x0379c0f7, 0x0279068e, 0x02ac18dc, 0x01765f64, 0x00bb250b, 0x011c5e3d, 0x0275b0c0, 0x02639383, 0x0297e499, 0x002c7d4b}}, Y: Field{[10]uint32{0x03df795f, 0x01e942b4, 0x0333d808, 0x03e04093, 0x03de484c, 0x00994717, 0x024370ca, 0x03f6317c, 0x01654e4c, 0x00360fcf}}}, + {X: Field{[10]uint32{0x01f1b641, 0x018ac85b, 0x02477d78, 0x0159094d, 0x03f1a5e0, 0x0357dc26, 0x0011395d, 0x00f6827c, 0x035304c7, 0x002a9e66}}, Y: Field{[10]uint32{0x03248646, 0x00f4b4cc, 0x03338a00, 0x001f2ef9, 0x02dd5920, 0x03ce2aa1, 0x03f68879, 0x016d9164, 0x0047b5e9, 0x000e8c9c}}}, + {X: Field{[10]uint32{0x0045aa03, 0x017a6ee9, 0x023c18d3, 0x026f7631, 0x01262d62, 0x034ce691, 0x01e56b66, 0x03d3f11e, 0x016445bd, 0x00369286}}, Y: Field{[10]uint32{0x029cb70d, 0x00fe4b2d, 0x006d563f, 0x039c9b0b, 0x02353376, 0x00d357b2, 0x02cff296, 0x018e9019, 0x02da25cc, 0x001ece97}}}, + {X: Field{[10]uint32{0x01b8d656, 0x039ccfe8, 0x0384c231, 0x011a81ec, 0x017e620d, 0x003bbc1c, 0x03eba80f, 0x01b4350c, 0x00adc234, 0x0030c02d}}, Y: Field{[10]uint32{0x03cdba42, 0x02a1dc78, 0x023566f4, 0x03691537, 0x02f73448, 0x00402e56, 0x02aa439a, 0x01eb1fcd, 0x03b948d2, 0x000c820e}}}, + {X: Field{[10]uint32{0x00359f04, 0x0162cae5, 0x02be76a3, 0x001f8833, 0x02ed64a9, 0x02437cac, 0x039bf7b0, 0x01c91358, 0x01286793, 0x00315669}}, Y: Field{[10]uint32{0x01bf5977, 0x011c3352, 0x004740d2, 0x03685659, 0x02806d78, 0x00fd10d2, 0x01671b56, 0x03260c83, 0x01aa5c08, 0x0027f2b0}}}, + {X: Field{[10]uint32{0x03e83540, 0x018ccef7, 0x015fa9b9, 0x03af4f9e, 0x01b0911c, 0x020f042c, 0x034bca9a, 0x036fd3c1, 0x01470a46, 0x000e6c40}}, Y: Field{[10]uint32{0x01308278, 0x0250658b, 0x0055e642, 0x005f458a, 0x00168da4, 0x0358cd38, 0x02aa313c, 0x009d0d36, 0x00c8c3b2, 0x002b4d77}}}, + {X: Field{[10]uint32{0x037d6d42, 0x01d2810b, 0x01d6b347, 0x00ba89de, 0x014129ab, 0x00666532, 0x00405970, 0x031805fe, 0x02b7d2de, 0x000e7272}}, Y: Field{[10]uint32{0x03781845, 0x0373a790, 0x013623af, 0x02d32012, 0x0272ca72, 0x01f77ecf, 0x00cdd453, 0x02284cd5, 0x016b835a, 0x0031cfaf}}}, + {X: Field{[10]uint32{0x02c679ed, 0x02d7bbbb, 0x01466fc7, 0x0135104c, 0x03f8f81c, 0x038863b0, 0x02c60972, 0x02d18ab7, 0x01988a30, 0x00069896}}, Y: Field{[10]uint32{0x034114ab, 0x03e3374c, 0x02037bf5, 0x0276e810, 0x033651a3, 0x03884ef5, 0x02776e62, 0x01f26efd, 0x02bb01a9, 0x001ce6fa}}}, + {X: Field{[10]uint32{0x024c4308, 0x008b7eba, 0x003bf3f4, 0x0330fbd9, 0x0085f33e, 0x03ca0ea6, 0x012761eb, 0x030c2350, 0x0110cd35, 0x000e5bb6}}, Y: Field{[10]uint32{0x004dfe57, 0x03467845, 0x01b7f556, 0x01620d9c, 0x013945e1, 0x010a91ac, 0x0048cf84, 0x01852937, 0x01a6a08a, 0x001c8737}}}, + {X: Field{[10]uint32{0x03299a47, 0x02debce6, 0x02becaf7, 0x0100978e, 0x0083e153, 0x002f60c7, 0x02ee96ab, 0x0333f652, 0x02e8a2e8, 0x00294381}}, Y: Field{[10]uint32{0x03beba52, 0x03593f8a, 0x0214f3fc, 0x0068ead7, 0x014521fc, 0x02382178, 0x01a4575e, 0x02018ff9, 0x01b259a1, 0x00164c81}}}, + {X: Field{[10]uint32{0x01c3e1de, 0x03c9adc4, 0x034a3dc3, 0x03591ba3, 0x00dbe15c, 0x00e4fe8d, 0x02c8bcf7, 0x03470398, 0x002317b0, 0x0012a7e0}}, Y: Field{[10]uint32{0x03c6bb71, 0x012faa7d, 0x015ac289, 0x030e5899, 0x00239867, 0x00d3a24a, 0x0330c244, 0x017fff36, 0x036d0091, 0x000103bf}}}, + {X: Field{[10]uint32{0x01608b73, 0x0368bf23, 0x01f055d2, 0x018957b6, 0x007f3232, 0x00bfeee2, 0x0318562e, 0x02df9842, 0x020d9dec, 0x00233978}}, Y: Field{[10]uint32{0x02c720de, 0x03da6386, 0x011b54f1, 0x02caa9c0, 0x0263f024, 0x01649c9e, 0x0292371b, 0x03859003, 0x036cf363, 0x0003ada6}}}, + {X: Field{[10]uint32{0x0083f24b, 0x009be6ed, 0x03e0a367, 0x0358dc02, 0x0184143e, 0x0295503b, 0x02525e28, 0x03a7947c, 0x01d79b53, 0x003cc9a5}}, Y: Field{[10]uint32{0x008471c8, 0x038641f0, 0x0123ef1e, 0x00587185, 0x031d81bd, 0x03f88d24, 0x012ca1f6, 0x00157d96, 0x0088eea2, 0x003a34d9}}}, + {X: Field{[10]uint32{0x02c34d07, 0x01b78775, 0x01959485, 0x02049749, 0x01d92748, 0x01b80822, 0x011ad140, 0x0164b96d, 0x01863bf6, 0x000e09bf}}, Y: Field{[10]uint32{0x03e4cc83, 0x020ec73f, 0x01e97265, 0x0006a240, 0x02020da0, 0x01ffe7e0, 0x0282058a, 0x00d71d0f, 0x01e6a290, 0x003aa1bc}}}, + {X: Field{[10]uint32{0x00ccd551, 0x01904290, 0x03ddd0dc, 0x02a263a1, 0x02ae8611, 0x03b1c9d8, 0x02098684, 0x02c3d46e, 0x00d32e32, 0x001ec6bf}}, Y: Field{[10]uint32{0x02e37884, 0x020a34f4, 0x020efc70, 0x02c2f158, 0x00a3ce0e, 0x02edb42a, 0x0036ee39, 0x0024c420, 0x02f779e1, 0x0037ae9b}}}, + {X: Field{[10]uint32{0x01a91bd4, 0x0118304d, 0x03b63348, 0x0331fdfd, 0x018deddd, 0x019a8db4, 0x00d39b1b, 0x01d61d50, 0x01fed2c2, 0x000fac7f}}, Y: Field{[10]uint32{0x026b36cb, 0x0263e5b4, 0x037b9eb8, 0x011633f3, 0x02642c53, 0x0204a99e, 0x01506cca, 0x039e5186, 0x02ca536a, 0x002e2baa}}}, + {X: Field{[10]uint32{0x0356da8f, 0x012fad66, 0x03c45c21, 0x027a406d, 0x02b71b4d, 0x020fba8b, 0x02290cb6, 0x03f17d4c, 0x02c8aae9, 0x00275876}}, Y: Field{[10]uint32{0x02446036, 0x021d8ace, 0x02271793, 0x0079e28a, 0x01280a8f, 0x0099f3a6, 0x024fc3ee, 0x02c8b9c0, 0x00a42ea1, 0x000b9f2b}}}, + {X: Field{[10]uint32{0x0211c7d8, 0x0343ab8f, 0x0239be38, 0x03bff76e, 0x02e91a43, 0x017b5551, 0x021e37a8, 0x03eaa3a3, 0x02dc3167, 0x000b6cdc}}, Y: Field{[10]uint32{0x01707ffe, 0x01b842d6, 0x023809b0, 0x00d2dc65, 0x0084f005, 0x02d67c3a, 0x0279697f, 0x02f5a85b, 0x0361bc1a, 0x0005aadb}}}, + {X: Field{[10]uint32{0x0005dc80, 0x0008f4a2, 0x000302ff, 0x019fdff1, 0x025b03dd, 0x02b4c4ca, 0x00e83cc9, 0x02d4e14e, 0x02f9f7a2, 0x00263df3}}, Y: Field{[10]uint32{0x02b98943, 0x020417eb, 0x00dd8d65, 0x034fe546, 0x01468bed, 0x03a5a85d, 0x016df891, 0x039b1af5, 0x00232813, 0x000ed03e}}}, + {X: Field{[10]uint32{0x01b62548, 0x0334657b, 0x00c7a363, 0x01853522, 0x02c48f08, 0x02a276d0, 0x01f58528, 0x00349357, 0x026cc8ab, 0x003baacb}}, Y: Field{[10]uint32{0x002649da, 0x002649f2, 0x022cc017, 0x01d100a0, 0x00523a7f, 0x03d7b7c5, 0x03e25030, 0x00ca35ca, 0x01ed65d3, 0x00181f10}}}, + {X: Field{[10]uint32{0x03db942a, 0x00d5c16c, 0x035376d9, 0x0346b69a, 0x03b7cb5e, 0x017ecc6d, 0x029a9d6c, 0x0071c0d1, 0x02ffb216, 0x002557fb}}, Y: Field{[10]uint32{0x01c0864b, 0x0123b905, 0x035a3fdf, 0x0029a0b2, 0x01283fcd, 0x029c4016, 0x039c9846, 0x030d081d, 0x0248a561, 0x002a4656}}}, + {X: Field{[10]uint32{0x00cd85a7, 0x03396b37, 0x025c9d44, 0x0376a606, 0x034db23b, 0x0336b0db, 0x008f5411, 0x03ba7b4f, 0x012d70d2, 0x00086693}}, Y: Field{[10]uint32{0x00ef53b4, 0x01593d71, 0x008e470a, 0x02a4171b, 0x013dbfdd, 0x03193df7, 0x0284aef2, 0x023b05c4, 0x01684300, 0x0019d106}}}, + {X: Field{[10]uint32{0x011ddb23, 0x010a5cbe, 0x028a5ed5, 0x01c5c8b8, 0x020d5945, 0x020b040d, 0x02f5cbd2, 0x02c584b8, 0x010d7794, 0x00125d8a}}, Y: Field{[10]uint32{0x0217ebc4, 0x001185b3, 0x03aec790, 0x00915bd5, 0x0023571c, 0x011b7144, 0x008354b4, 0x015954bf, 0x01f160fc, 0x00133f65}}}, + {X: Field{[10]uint32{0x0072b1c1, 0x0135c8ac, 0x00a4b5c4, 0x02cf0535, 0x021866e0, 0x0267d59d, 0x03b99ed5, 0x02b476ee, 0x03e0268e, 0x0011cb54}}, Y: Field{[10]uint32{0x02831232, 0x01a4fb30, 0x02db8e31, 0x00afb190, 0x01e4dfe8, 0x03659ee2, 0x02d42e31, 0x035352a3, 0x00096115, 0x003a6e70}}}, + {X: Field{[10]uint32{0x00ab18ef, 0x00c9ed1c, 0x01d50da3, 0x03ef0375, 0x003f3462, 0x0169b86c, 0x0075d617, 0x02e572be, 0x037e7a4d, 0x000a9bd6}}, Y: Field{[10]uint32{0x0259d506, 0x039f80e1, 0x033479ad, 0x013a8bcd, 0x02c9f372, 0x002c04f3, 0x01f5b78f, 0x037065f6, 0x03a392aa, 0x00246c91}}}, + {X: Field{[10]uint32{0x03146c19, 0x03e71148, 0x025ba17d, 0x00ae7441, 0x007431a6, 0x0383230f, 0x025e654f, 0x03606ed7, 0x01a3bf48, 0x00370605}}, Y: Field{[10]uint32{0x0194be8f, 0x02f7cbf5, 0x00f36d0f, 0x03dec232, 0x02d837c5, 0x01d1fbfe, 0x03e2af74, 0x0143c391, 0x029a3115, 0x003f881c}}}, + {X: Field{[10]uint32{0x00397776, 0x002db9a6, 0x03c4f1df, 0x033cf9a2, 0x00a8b47e, 0x000ffee6, 0x0295db4f, 0x03bae25e, 0x03ecad8f, 0x00239e54}}, Y: Field{[10]uint32{0x0141ac5d, 0x02c58df0, 0x01157893, 0x03f36aed, 0x0212f7c6, 0x007cc518, 0x0040a395, 0x0073109b, 0x02ef81b2, 0x00176b7c}}}, + {X: Field{[10]uint32{0x019b41a5, 0x03913304, 0x02a7472e, 0x0015b999, 0x01faf96a, 0x019a1b22, 0x0099fe1c, 0x01c92e7a, 0x026b49d5, 0x00293647}}, Y: Field{[10]uint32{0x020a4893, 0x03a77865, 0x0247414a, 0x00aae9cb, 0x02fef10b, 0x02f73f09, 0x02bb820c, 0x019263d6, 0x02150e29, 0x002af5a1}}}, + {X: Field{[10]uint32{0x0300eee9, 0x025210da, 0x0141dd02, 0x008ab2b8, 0x02754c49, 0x02383910, 0x0266dd60, 0x009ae74e, 0x01a4f3e4, 0x002e5c20}}, Y: Field{[10]uint32{0x00f153da, 0x007b5b2e, 0x024f1ea6, 0x01de38a2, 0x022c8c2f, 0x005542c4, 0x029cb641, 0x012ed2ea, 0x00839921, 0x001563db}}}, + {X: Field{[10]uint32{0x03825848, 0x00d0843e, 0x0225ea8c, 0x029ad8d2, 0x00b873a5, 0x01904b15, 0x0273c6ef, 0x026f39c2, 0x02ed8227, 0x001a20ad}}, Y: Field{[10]uint32{0x03f21b3b, 0x027852e7, 0x035aed6b, 0x002487ca, 0x031e3a3b, 0x01a27a28, 0x0279c616, 0x00f8e4ba, 0x02e9c823, 0x0031bf7b}}}, + {X: Field{[10]uint32{0x00717fe8, 0x01fb8691, 0x011a462c, 0x0202b543, 0x011a0dba, 0x013f7acf, 0x03bf11fa, 0x015c272a, 0x03311c71, 0x00271509}}, Y: Field{[10]uint32{0x01f2b045, 0x010a5d74, 0x0058d7ea, 0x01c713c8, 0x00ef4b64, 0x029dfdd8, 0x006bd40c, 0x00d16311, 0x03107816, 0x002a8106}}}, + {X: Field{[10]uint32{0x000cd32c, 0x01ccc31e, 0x015d9357, 0x005c0ec6, 0x024a5ed9, 0x00ef9637, 0x038779de, 0x01704ba0, 0x01a6776b, 0x001ce853}}, Y: Field{[10]uint32{0x02d2c49c, 0x03929c1e, 0x03a78b0c, 0x01d3332c, 0x01ceb585, 0x022fcb22, 0x0067bb7e, 0x0313569d, 0x03fde98e, 0x003101a3}}}, + {X: Field{[10]uint32{0x02af91b5, 0x01b15dad, 0x038ebfdc, 0x00d7677b, 0x028748d8, 0x039b76df, 0x01e9d261, 0x01b136eb, 0x028627d2, 0x00192228}}, Y: Field{[10]uint32{0x016d8ff3, 0x01806f4f, 0x02697b5c, 0x025416b6, 0x033c7f06, 0x0116ec1f, 0x030916a9, 0x0046462b, 0x01f0b050, 0x0009fe2c}}}, + {X: Field{[10]uint32{0x0151046c, 0x02753414, 0x0371bd8c, 0x023865e3, 0x02cca1d3, 0x01f73ef3, 0x01ee2ef4, 0x0132636e, 0x027a5b54, 0x0025951b}}, Y: Field{[10]uint32{0x01f4309d, 0x018329c1, 0x0189e841, 0x01cac984, 0x023b10f7, 0x00257260, 0x00f07d22, 0x03b3fc88, 0x032f8fe9, 0x003413f8}}}, + {X: Field{[10]uint32{0x00fecdf8, 0x0118fb63, 0x00066761, 0x01b20b4a, 0x01e76998, 0x01c808bb, 0x02cdb909, 0x02c50e80, 0x03564598, 0x002e811b}}, Y: Field{[10]uint32{0x0227250f, 0x000c8c8f, 0x01d68536, 0x00341de3, 0x023e57bc, 0x034f676a, 0x007d37c0, 0x015f0550, 0x03abd424, 0x003f1b88}}}, + {X: Field{[10]uint32{0x02d0e4ec, 0x02e02bd6, 0x027df310, 0x01fec4f2, 0x005e7655, 0x021aa081, 0x02d82ed0, 0x0329f77d, 0x0351e633, 0x000e5551}}, Y: Field{[10]uint32{0x006d3b1c, 0x021ac0a8, 0x03b4f894, 0x00f0bee6, 0x03cdb2ba, 0x03ea8fd9, 0x03df5e95, 0x03c83a5d, 0x0284f040, 0x002915ae}}}, + {X: Field{[10]uint32{0x009c22aa, 0x029a2926, 0x0317cd46, 0x035c0386, 0x01ba56b8, 0x00411b0f, 0x016c9241, 0x027f5c36, 0x00e75fef, 0x00317d54}}, Y: Field{[10]uint32{0x03ac3fa9, 0x030d8d89, 0x02cc2173, 0x010b723c, 0x038d65ea, 0x03b9f43e, 0x02a987ac, 0x02d85d55, 0x02e03aea, 0x00152160}}}, + {X: Field{[10]uint32{0x025fa050, 0x026ab35b, 0x0327eb99, 0x01d5e6c9, 0x0326d4ba, 0x03818e90, 0x000b2a0e, 0x0236ce6a, 0x0210a48d, 0x000b3305}}, Y: Field{[10]uint32{0x00348c84, 0x00fe5ffe, 0x02b70a07, 0x01a524a3, 0x03fa205d, 0x01e79610, 0x01cb17b1, 0x0000b023, 0x03db2114, 0x00379b75}}}, + {X: Field{[10]uint32{0x03084b3f, 0x0227843d, 0x012c5add, 0x03e3f9ba, 0x003ae59c, 0x03639919, 0x00089ff2, 0x00721079, 0x00e73e94, 0x0024ec1f}}, Y: Field{[10]uint32{0x0018fa63, 0x02a03910, 0x03634cb5, 0x03fb8634, 0x02533efc, 0x018a686b, 0x02c362d3, 0x0099f953, 0x0076c5a7, 0x00029b01}}}, + {X: Field{[10]uint32{0x0291e7e9, 0x03015996, 0x03a3e438, 0x001d872e, 0x02b0ec27, 0x01a166c5, 0x03aeec82, 0x0119e578, 0x01f055c1, 0x00114f00}}, Y: Field{[10]uint32{0x016766b2, 0x016f1269, 0x033d9874, 0x026794b9, 0x030e14ac, 0x00221096, 0x03738436, 0x032288bb, 0x02c9b9d3, 0x003ca3ab}}}, + {X: Field{[10]uint32{0x000f12f1, 0x0359197a, 0x027946f8, 0x013012a5, 0x00c1d09a, 0x0055656e, 0x02148fad, 0x0230a282, 0x01fdac07, 0x000f1b7c}}, Y: Field{[10]uint32{0x02a5b58d, 0x033c99e0, 0x0354f6df, 0x01700542, 0x02d443db, 0x039fb4a4, 0x02a68212, 0x004d2e81, 0x004d4eaa, 0x0011866a}}}, + {X: Field{[10]uint32{0x01b98630, 0x033160c4, 0x02fd600d, 0x03e49c17, 0x03f12054, 0x0240836f, 0x01429895, 0x025e14c1, 0x01683995, 0x0006dfda}}, Y: Field{[10]uint32{0x00645c25, 0x03670803, 0x00a37372, 0x00574305, 0x0067ee9e, 0x0223b1bc, 0x01731c9b, 0x03ea33ef, 0x023ee3e8, 0x0009e771}}}, + {X: Field{[10]uint32{0x03fccc19, 0x03610bef, 0x0300697a, 0x03da7340, 0x006256f2, 0x013489db, 0x010a6427, 0x0342e66e, 0x01539d49, 0x00386dee}}, Y: Field{[10]uint32{0x01f9500f, 0x03763435, 0x03316fd0, 0x036c9fe4, 0x00f2acfe, 0x027a054d, 0x004628b1, 0x0195a614, 0x016f51dc, 0x000ac8ee}}}, + {X: Field{[10]uint32{0x0354f911, 0x0205f22b, 0x012bf4bc, 0x017e9588, 0x039ce552, 0x02a5d193, 0x015f79bb, 0x0108cd2f, 0x00c56fbf, 0x0010133c}}, Y: Field{[10]uint32{0x031ef662, 0x00b29907, 0x03c0f2e2, 0x02d5e625, 0x02023c04, 0x0178d95e, 0x021a6e07, 0x00162171, 0x02098830, 0x002d6481}}}, + {X: Field{[10]uint32{0x00aae0c1, 0x038bb243, 0x0171f43f, 0x03b05faa, 0x00e7819a, 0x00268d10, 0x02e817fa, 0x01af63bf, 0x0186da62, 0x0010fc76}}, Y: Field{[10]uint32{0x0274f9ad, 0x028802ca, 0x03583e51, 0x00e0acea, 0x033e93f4, 0x005d45e7, 0x0011f518, 0x0246ab4a, 0x02ce0ce8, 0x00317e96}}}, + {X: Field{[10]uint32{0x005b9c1f, 0x03b2bd83, 0x028fcd23, 0x03a2d9fb, 0x027bbcaa, 0x02dd8844, 0x02183b81, 0x0265445a, 0x01c6b320, 0x00286211}}, Y: Field{[10]uint32{0x03ef1f44, 0x030a546e, 0x03b02dfc, 0x03c573ae, 0x038f54e7, 0x020619c6, 0x03c5350e, 0x01f9acb3, 0x01d9d7e0, 0x002603b5}}}, + {X: Field{[10]uint32{0x03ac01ed, 0x00124839, 0x015aa2a3, 0x02b7009b, 0x00254c38, 0x000f24a7, 0x01cc17be, 0x02609181, 0x03eb0af9, 0x00013671}}, Y: Field{[10]uint32{0x03e781d3, 0x01070654, 0x031c970d, 0x02e67ea6, 0x0097065b, 0x00cd83dd, 0x033cf00f, 0x03394c89, 0x0335bb0d, 0x00319316}}}, + {X: Field{[10]uint32{0x03e7c25d, 0x03ab7225, 0x00814eda, 0x03dc1319, 0x0155953e, 0x03a2a981, 0x01317833, 0x036c26f3, 0x02f2fbc3, 0x00386348}}, Y: Field{[10]uint32{0x03c7e07e, 0x03ca88bb, 0x00b5953e, 0x02ca15c0, 0x000f15b8, 0x032aa1c0, 0x037989df, 0x0081c893, 0x02817115, 0x00330962}}}, + {X: Field{[10]uint32{0x0247879d, 0x02f6f94a, 0x03d5a3c8, 0x029e6f0d, 0x0035083a, 0x030505fa, 0x02ec9a60, 0x02413e34, 0x01f9f220, 0x0005815d}}, Y: Field{[10]uint32{0x0279a5e5, 0x0157e4d4, 0x034ce0d6, 0x012cc274, 0x012c3870, 0x0350e7fb, 0x0191c60a, 0x025e3504, 0x00a6127e, 0x000795ad}}}, + {X: Field{[10]uint32{0x0192d514, 0x0280dc94, 0x03e53f9a, 0x01aa850d, 0x034c3c9f, 0x00f14d56, 0x02b7ebdd, 0x03589935, 0x03c757b1, 0x000ed946}}, Y: Field{[10]uint32{0x00231c3f, 0x015861a0, 0x022e419e, 0x01682287, 0x025feb28, 0x03722927, 0x031d8ec5, 0x000c483f, 0x03749599, 0x0025dea1}}}, + {X: Field{[10]uint32{0x02ba532a, 0x01e6a3c5, 0x03b0cd95, 0x02587f5a, 0x02a9660e, 0x0262aca1, 0x00250154, 0x033009d8, 0x01ef56fa, 0x0024216f}}, Y: Field{[10]uint32{0x02e9fe89, 0x01443c5e, 0x013b8c55, 0x005a3dae, 0x0368364c, 0x003a039e, 0x03f791d9, 0x01567179, 0x0108a557, 0x003f4174}}}, + {X: Field{[10]uint32{0x000569ec, 0x01151239, 0x00c21fef, 0x0095db87, 0x0067cf1b, 0x007c2b3a, 0x033aab8c, 0x00e18bf4, 0x006df64a, 0x0010890c}}, Y: Field{[10]uint32{0x020661bc, 0x004f563d, 0x032498bd, 0x0257fe59, 0x0063e723, 0x016790b9, 0x0087c2dc, 0x02f0773a, 0x02675279, 0x0021d02d}}}, + {X: Field{[10]uint32{0x0022935c, 0x00f28d77, 0x009182f8, 0x0303fd68, 0x02e0e2b2, 0x02f157b9, 0x03806b35, 0x00b8c69b, 0x02974a51, 0x002dcdd9}}, Y: Field{[10]uint32{0x01420103, 0x00a820a1, 0x0046251c, 0x000e75a2, 0x01890b3e, 0x023f572f, 0x00152a24, 0x03eb7bb9, 0x00202676, 0x0034d432}}}, + {X: Field{[10]uint32{0x010eb97a, 0x01093693, 0x01574557, 0x01a32ea0, 0x02bb82e0, 0x03069d21, 0x00505ab1, 0x0353429f, 0x038ed3b5, 0x001cee93}}, Y: Field{[10]uint32{0x02188271, 0x0292ff89, 0x01215adc, 0x026dc950, 0x013a58ba, 0x0218f4fe, 0x01b4a2d0, 0x030d8152, 0x0114552d, 0x0024ebce}}}, + {X: Field{[10]uint32{0x03d3d8ea, 0x012f80db, 0x01bef052, 0x0101af38, 0x020ae935, 0x01a52c14, 0x00576c45, 0x0093663c, 0x014e1747, 0x000a1680}}, Y: Field{[10]uint32{0x029af7dc, 0x00f9f21a, 0x028cab39, 0x01965a33, 0x039d4067, 0x0247536d, 0x03f5213f, 0x01dd5f9b, 0x01d8d2ce, 0x001bf6b4}}}, + {X: Field{[10]uint32{0x028e768f, 0x021a77b0, 0x01180963, 0x01e3b283, 0x0384c2fd, 0x01be302a, 0x025cea7c, 0x02d52e8a, 0x01d727bf, 0x002c24d3}}, Y: Field{[10]uint32{0x00b982c6, 0x01c2763c, 0x031bf2bc, 0x03df4535, 0x03484c94, 0x036c2644, 0x02bbb26e, 0x027cc52f, 0x01115602, 0x00372bc3}}}, + {X: Field{[10]uint32{0x03681561, 0x032303d6, 0x0365ec45, 0x033cd5ee, 0x02ffcb49, 0x03bc5742, 0x011c8bcc, 0x02a772dd, 0x02dd8b69, 0x000ed89e}}, Y: Field{[10]uint32{0x0046d19d, 0x00a5bf37, 0x015e1536, 0x02ee9dc8, 0x03693cd2, 0x0349f3fd, 0x02133649, 0x0202dcb6, 0x018009e3, 0x0002f686}}}, + {X: Field{[10]uint32{0x02cb5ac2, 0x00a8da54, 0x027c90a6, 0x01d9722a, 0x02e45938, 0x011d9b6a, 0x012e3f9a, 0x02277e81, 0x01ec1f22, 0x001f923f}}, Y: Field{[10]uint32{0x018cb5f2, 0x00e12e6f, 0x039ac61e, 0x023984a4, 0x0168449b, 0x02fb6d27, 0x021e10c5, 0x01a2159b, 0x007aac11, 0x003a1ebe}}}, + {X: Field{[10]uint32{0x023ffd9d, 0x03390f89, 0x0008b181, 0x02432a84, 0x00d094d8, 0x03bb0b90, 0x022c267f, 0x00eeeada, 0x008a5de3, 0x00100c7c}}, Y: Field{[10]uint32{0x01b0be07, 0x026dfc14, 0x006b58a7, 0x038c46e5, 0x01a8f23b, 0x0077fbd1, 0x0389beb9, 0x0297c269, 0x03d99737, 0x0033f713}}}, + {X: Field{[10]uint32{0x031ed764, 0x001fafe4, 0x00b1dd54, 0x00b1ee40, 0x00ec00a2, 0x03510730, 0x02e656f4, 0x036ed6fd, 0x037c61dd, 0x002e994a}}, Y: Field{[10]uint32{0x00029556, 0x011341c0, 0x00088a3b, 0x02566964, 0x001d2070, 0x00f19f80, 0x030b5d8d, 0x02055a8c, 0x0392d122, 0x0021ff2c}}}, + {X: Field{[10]uint32{0x0190e72d, 0x0307b419, 0x03b1bffd, 0x02e6e834, 0x0362c967, 0x03630c3c, 0x03dd95d2, 0x01d94eb1, 0x0172d101, 0x003ee4d9}}, Y: Field{[10]uint32{0x0036d8ed, 0x01e62092, 0x00587b08, 0x0119ad29, 0x02940382, 0x02562f8b, 0x03799659, 0x01a8c429, 0x03afdb6b, 0x002b7e8d}}}, + {X: Field{[10]uint32{0x003bae7b, 0x02621c2c, 0x01148991, 0x00a065a1, 0x01b97ff3, 0x021844a7, 0x006fdb78, 0x00214bdf, 0x03cb5e7c, 0x000a511c}}, Y: Field{[10]uint32{0x0190c86a, 0x03bb0e1f, 0x03617246, 0x0169b1d9, 0x0078463e, 0x02f56d28, 0x0209f951, 0x0219e9e2, 0x0136f991, 0x002f6415}}}, + {X: Field{[10]uint32{0x01bc574e, 0x01b21cf1, 0x00c0944a, 0x0231b4e9, 0x007687dc, 0x01a0edd3, 0x0337ced1, 0x00cff645, 0x004f73a6, 0x000bf03d}}, Y: Field{[10]uint32{0x0122ad1f, 0x001cd507, 0x0118415e, 0x01426914, 0x03ac572f, 0x02b8dcfa, 0x01499912, 0x018fe53a, 0x00eeffa0, 0x000a645f}}}, + {X: Field{[10]uint32{0x016d569e, 0x03009444, 0x00c40b9a, 0x03720eee, 0x018da210, 0x023b628c, 0x01d34f2c, 0x0169fbd6, 0x0251882c, 0x002047ec}}, Y: Field{[10]uint32{0x00a0c55d, 0x02464636, 0x00c00ad2, 0x001c170f, 0x02d480e4, 0x0250379a, 0x0204ad3f, 0x016be93b, 0x01472cb5, 0x001d37d9}}}, + {X: Field{[10]uint32{0x03fc5d07, 0x01f9852d, 0x0057ba9e, 0x03160bf7, 0x03c47996, 0x03539f94, 0x0051894a, 0x033c247d, 0x017cc1d6, 0x00116a78}}, Y: Field{[10]uint32{0x03069be1, 0x0072ab5e, 0x01bbb16d, 0x01b70dff, 0x034e1919, 0x02260cad, 0x02d19200, 0x0187d7ec, 0x004f0026, 0x00145a77}}}, + {X: Field{[10]uint32{0x01588e67, 0x03426bad, 0x00102645, 0x00e2de30, 0x00abd065, 0x02d71ef5, 0x003d96aa, 0x029eb51d, 0x03fc45cd, 0x00355dfd}}, Y: Field{[10]uint32{0x003be07a, 0x001c4a0c, 0x0125e521, 0x00b0c2ff, 0x02765e2c, 0x0231e33a, 0x011db618, 0x015f7f3b, 0x03717ea2, 0x001545ca}}}, + {X: Field{[10]uint32{0x0306e44f, 0x03846c66, 0x019c0650, 0x022ddde9, 0x024fb22d, 0x012c33bf, 0x0371e08d, 0x02a9b8e6, 0x02958098, 0x002990a6}}, Y: Field{[10]uint32{0x007dd2ed, 0x02992c65, 0x027dcf6a, 0x0097cb0e, 0x0336ab18, 0x0218902a, 0x00440f57, 0x0015772b, 0x02625587, 0x002bd253}}}, + {X: Field{[10]uint32{0x039a743d, 0x025a59e8, 0x00679073, 0x01e98f88, 0x0050bca3, 0x03d1e3ba, 0x00b1c80c, 0x0052d096, 0x0304b893, 0x0003ddf0}}, Y: Field{[10]uint32{0x01c1c7ee, 0x0218dfe3, 0x02c727e7, 0x00515638, 0x011c32f4, 0x003d03c6, 0x00452136, 0x0052f982, 0x017629d9, 0x003121e8}}}, + {X: Field{[10]uint32{0x02d1c988, 0x01985965, 0x01f5def7, 0x00bfecbe, 0x02cd76ea, 0x007b7b7a, 0x03f0a82e, 0x00491dc7, 0x02f61598, 0x001071bc}}, Y: Field{[10]uint32{0x01accb68, 0x02d4aa41, 0x031d3407, 0x0039176f, 0x02364277, 0x026da1f1, 0x039ed4ff, 0x00681d7f, 0x0144146c, 0x0016283d}}}, + {X: Field{[10]uint32{0x02b968d0, 0x019bb4cb, 0x01916cdf, 0x035c7f6d, 0x037ac2d2, 0x015d978f, 0x02aaacb3, 0x00debc27, 0x02c8c13d, 0x00321c93}}, Y: Field{[10]uint32{0x00d81221, 0x03495791, 0x029895ec, 0x03b69e18, 0x026ade66, 0x00af669b, 0x014bbf24, 0x00f9b79f, 0x03214210, 0x001c3b3d}}}, + {X: Field{[10]uint32{0x031fbbf2, 0x02ea7cff, 0x00650653, 0x012b81c3, 0x023b139e, 0x01d7ead9, 0x02204a2b, 0x0238daf8, 0x00460dd5, 0x0038a223}}, Y: Field{[10]uint32{0x0342509e, 0x00acd4c8, 0x0108c331, 0x02625488, 0x01bc1584, 0x0082f580, 0x01888797, 0x00ee2adf, 0x00dae139, 0x001c5644}}}, + {X: Field{[10]uint32{0x02d834dd, 0x02b0dbd9, 0x01ec1c14, 0x00d847aa, 0x01f56cf7, 0x02a99be6, 0x01999c9a, 0x0202e1ad, 0x0384d72d, 0x003c7d30}}, Y: Field{[10]uint32{0x00cc7e3f, 0x039cdd49, 0x03c44835, 0x0229a5ac, 0x02219838, 0x0326a9e1, 0x038527a3, 0x010b23ae, 0x03c24801, 0x002d550e}}}, + {X: Field{[10]uint32{0x01940a5b, 0x0204ad0c, 0x01e73f61, 0x0298d067, 0x0217aec3, 0x03b75fd6, 0x028d4126, 0x02df6c1d, 0x03f5832f, 0x00121d1d}}, Y: Field{[10]uint32{0x032608a7, 0x01e35786, 0x03c54c5f, 0x0158db6d, 0x020284f5, 0x00a9b55a, 0x004e3dc3, 0x03ea62f1, 0x01de4203, 0x00240c8b}}}, + {X: Field{[10]uint32{0x00ca75af, 0x02bc0dc5, 0x0229bff8, 0x000a7f84, 0x010c55df, 0x02cfba7d, 0x00f957e0, 0x019f892e, 0x023a5831, 0x0029c9a5}}, Y: Field{[10]uint32{0x008f7449, 0x01945b70, 0x0232d99f, 0x00954e96, 0x034a6369, 0x02d9507f, 0x0154d156, 0x00a70204, 0x0184d689, 0x0023f5ea}}}, + {X: Field{[10]uint32{0x0399e97c, 0x00ab16e2, 0x03033876, 0x030b8804, 0x00baa763, 0x01a669a3, 0x013a231e, 0x03ac7276, 0x01b4cf80, 0x00353083}}, Y: Field{[10]uint32{0x00eca01f, 0x031be7db, 0x0287a426, 0x00381624, 0x01f5abc5, 0x0246428d, 0x02a20713, 0x02943212, 0x03ba2555, 0x002e871d}}}, + {X: Field{[10]uint32{0x02748168, 0x027bf88e, 0x03afafa5, 0x0076b15b, 0x025159ba, 0x036343cd, 0x01b5a55a, 0x01c0aefb, 0x005389ae, 0x0001f3e7}}, Y: Field{[10]uint32{0x032336b8, 0x00e140ad, 0x0296f6ec, 0x0029ba90, 0x03489bee, 0x00c4d23b, 0x00ec347c, 0x01eef28b, 0x0324338c, 0x003b38ec}}}, + {X: Field{[10]uint32{0x00b73e55, 0x009506d1, 0x02f49699, 0x00ced36e, 0x03eec928, 0x00c9a01b, 0x039f9c30, 0x0352bce5, 0x00e3c1eb, 0x00248042}}, Y: Field{[10]uint32{0x01f466fc, 0x00b88025, 0x01395ba9, 0x01e1493d, 0x016cf8f4, 0x02e92399, 0x003f348e, 0x03120d3c, 0x0133d8ad, 0x000f88ac}}}, + {X: Field{[10]uint32{0x02479e90, 0x02da7109, 0x02a8a4fe, 0x00e12559, 0x03fc7605, 0x02b4ca94, 0x03613372, 0x021d8a6c, 0x038a98c4, 0x000559ab}}, Y: Field{[10]uint32{0x02997796, 0x02a145b6, 0x03926dab, 0x02ebacfd, 0x030da5d3, 0x00bf871e, 0x017db986, 0x00af931e, 0x01664bd7, 0x000a1231}}}, + {X: Field{[10]uint32{0x0361723c, 0x01daaf2b, 0x03044c0f, 0x02f89c7b, 0x01d2f6d9, 0x00ac2a2c, 0x017a7041, 0x0233af1f, 0x027102eb, 0x002936d7}}, Y: Field{[10]uint32{0x002e8ca4, 0x023232b1, 0x036a5695, 0x00abcae7, 0x03272f5f, 0x01ea501e, 0x004bc0a2, 0x00f777d8, 0x02e075a7, 0x00198f85}}}, + {X: Field{[10]uint32{0x0153e5fb, 0x00ef29e3, 0x00c13849, 0x01dd81de, 0x0333d90e, 0x031e73c6, 0x025d1106, 0x02e3e418, 0x03538bbd, 0x00343273}}, Y: Field{[10]uint32{0x021d9a60, 0x01e418e2, 0x01bd9683, 0x02201f70, 0x009975ad, 0x02e2f4c3, 0x00a21250, 0x03501f30, 0x020e8b9f, 0x002dbb33}}}, + {X: Field{[10]uint32{0x03d8391f, 0x01f39e3f, 0x0204ce65, 0x0051538e, 0x014a58d5, 0x033ce8e2, 0x0196d67b, 0x015ef5c1, 0x0292480f, 0x001d97ee}}, Y: Field{[10]uint32{0x0218302f, 0x03b24087, 0x023dbaf6, 0x02f57ceb, 0x0050879b, 0x03d06ad3, 0x03b552e3, 0x00d43968, 0x03ba1035, 0x00172c76}}}, + {X: Field{[10]uint32{0x03fb4a5e, 0x007b9be2, 0x025032c5, 0x02396bd2, 0x009bd3f8, 0x022d94be, 0x02a7b9b6, 0x01c0ad2a, 0x01e8e846, 0x0027e76a}}, Y: Field{[10]uint32{0x0296a0f6, 0x028b5fd5, 0x0284dedf, 0x02374b01, 0x021d8da0, 0x001a22b2, 0x017320ca, 0x005ec3ac, 0x019d7ecf, 0x00176f52}}}, + {X: Field{[10]uint32{0x03fdd3f4, 0x02480884, 0x025bfb11, 0x0272d196, 0x00ad949c, 0x006bbd7c, 0x03b1a166, 0x02252dcb, 0x003bdb95, 0x002be1b2}}, Y: Field{[10]uint32{0x0399e117, 0x03cf04b5, 0x00e55123, 0x02e6c6e2, 0x03004a7b, 0x0310709b, 0x03d2b25c, 0x00046580, 0x027d5541, 0x003b01a0}}}, + {X: Field{[10]uint32{0x01587e77, 0x03e8d43f, 0x0309cd94, 0x02c8b32e, 0x0364c8e3, 0x0202f8ce, 0x032b3fcc, 0x02f2341d, 0x01932fcc, 0x003eed22}}, Y: Field{[10]uint32{0x00c0b858, 0x0046db36, 0x03e04811, 0x035095ee, 0x0258598a, 0x00d01d69, 0x0051abd6, 0x00cf6acd, 0x01242793, 0x0003e737}}}, + {X: Field{[10]uint32{0x02d60684, 0x03b7079f, 0x0269bae6, 0x03e242a4, 0x00621f36, 0x00ab7270, 0x0315ecae, 0x030abd8a, 0x01a3ad97, 0x00103b2c}}, Y: Field{[10]uint32{0x0158b32e, 0x02a8014d, 0x005f288d, 0x02cfb661, 0x019a41f4, 0x008c07ee, 0x00e3e2b3, 0x0185f648, 0x0194fa3a, 0x003fe7b0}}}, + {X: Field{[10]uint32{0x00878f52, 0x01802706, 0x03691973, 0x00c31f4e, 0x0339873c, 0x03f808e3, 0x03d9014b, 0x00ad0bf2, 0x02f10c76, 0x000c7e24}}, Y: Field{[10]uint32{0x01718c95, 0x00d9cd25, 0x03ff7be5, 0x02e3df53, 0x015cd610, 0x03dae4b0, 0x0131066e, 0x01cd154c, 0x0005f31f, 0x00366f54}}}, + {X: Field{[10]uint32{0x00886c5c, 0x025bf209, 0x028f31c6, 0x024e32ad, 0x03921f81, 0x0175dce7, 0x014d150c, 0x001478b6, 0x0129e9f6, 0x002e8489}}, Y: Field{[10]uint32{0x016b1ed1, 0x01c926a1, 0x03c20d9c, 0x02730e5a, 0x007c0285, 0x01eb2708, 0x00577d33, 0x0354e46c, 0x031f7e9b, 0x0030cf01}}}, + {X: Field{[10]uint32{0x0124cf03, 0x030857ca, 0x018c5030, 0x024f5605, 0x03ef45d9, 0x02e68098, 0x013ecbc5, 0x034c4726, 0x00129a26, 0x000d4c59}}, Y: Field{[10]uint32{0x023a9742, 0x031b4d5e, 0x00e3f6a9, 0x01be460d, 0x03f92ef0, 0x016d8e16, 0x023e2d9c, 0x008eee73, 0x00d95216, 0x0021a988}}}, + {X: Field{[10]uint32{0x02c8e462, 0x00628854, 0x033ebf97, 0x02b1e146, 0x004a4aa7, 0x013b1fe7, 0x02ce92ca, 0x012a98d7, 0x030be413, 0x000c091d}}, Y: Field{[10]uint32{0x03c8c8ee, 0x03ac143f, 0x01225bbc, 0x02abe063, 0x00ab3f8f, 0x039ce139, 0x01c1579c, 0x01ebf85b, 0x03bd7214, 0x0007f3eb}}}, + {X: Field{[10]uint32{0x03da6564, 0x0340721a, 0x0071a672, 0x02993742, 0x02533c1b, 0x02507638, 0x02dbf169, 0x03a1b16d, 0x013da40e, 0x003d6e8c}}, Y: Field{[10]uint32{0x0000647d, 0x012eeb6e, 0x018c7294, 0x02090dfd, 0x018f9652, 0x01555d92, 0x02e95ec1, 0x01e41f25, 0x010db969, 0x000042a4}}}, + {X: Field{[10]uint32{0x0264e2f1, 0x02d6715c, 0x018ebb33, 0x00f84cb0, 0x00e485a2, 0x00632546, 0x037f426b, 0x033414d3, 0x03e2972c, 0x001a1785}}, Y: Field{[10]uint32{0x01f291c6, 0x000513ae, 0x03a0cb93, 0x00b77a83, 0x03470fd4, 0x00455b6b, 0x03a3f475, 0x02ab069d, 0x0338be84, 0x00259516}}}, + {X: Field{[10]uint32{0x03f119eb, 0x03d97466, 0x028e0504, 0x03718749, 0x01fdd481, 0x03a4701f, 0x01e1bca7, 0x02608a96, 0x01fdfacc, 0x003804a1}}, Y: Field{[10]uint32{0x01c39909, 0x01f5b967, 0x010630f7, 0x01790719, 0x0140bf5b, 0x01c80ae6, 0x003615ba, 0x036aebbe, 0x013a2479, 0x002ba085}}}, + {X: Field{[10]uint32{0x01839601, 0x00872c15, 0x03220b54, 0x024dd8d7, 0x0093798a, 0x024c8079, 0x00d67200, 0x0043b1e1, 0x01863277, 0x00318791}}, Y: Field{[10]uint32{0x006c04ea, 0x02e32c9d, 0x0026dcde, 0x03c5d0cf, 0x025d42fc, 0x02e95572, 0x023e0163, 0x01939e87, 0x03f5aa5b, 0x0039187e}}}, + {X: Field{[10]uint32{0x03d192d4, 0x01f597c7, 0x01af3be8, 0x00d2400a, 0x013106fc, 0x004ed876, 0x00d8ca25, 0x0242db89, 0x02cb4e58, 0x0007109e}}, Y: Field{[10]uint32{0x02cf29d0, 0x03b0310d, 0x023e9c9c, 0x0357ba2b, 0x0184935a, 0x030d0c28, 0x0304fa6e, 0x014a2e6e, 0x00251518, 0x000765b8}}}, + {X: Field{[10]uint32{0x012fd8e7, 0x037dbc7c, 0x02f54431, 0x0066d660, 0x005a9326, 0x01f51c2e, 0x02ddb3ba, 0x0225ed2d, 0x03fd6d51, 0x001795de}}, Y: Field{[10]uint32{0x011c6eb4, 0x03535e48, 0x01ff9203, 0x01131eb4, 0x00123cb0, 0x02969ff4, 0x0036e908, 0x030674ea, 0x02929734, 0x0030685c}}}, + {X: Field{[10]uint32{0x00237b30, 0x00ed028a, 0x028a6817, 0x01d9b4fa, 0x02adc6ae, 0x03ef2b7c, 0x03aefc8d, 0x022902eb, 0x03331f96, 0x00331e2c}}, Y: Field{[10]uint32{0x01857d42, 0x02c29011, 0x038aa14e, 0x01f250db, 0x00dfc2ce, 0x0048e32d, 0x01ef04b4, 0x0301a3fc, 0x01b20a5b, 0x0016dda4}}}, + {X: Field{[10]uint32{0x00919fb6, 0x020c293b, 0x0016a0b1, 0x00aa56b7, 0x02c44537, 0x02bcfb3a, 0x01dc288f, 0x0113ca79, 0x0037487b, 0x000e1571}}, Y: Field{[10]uint32{0x009359d2, 0x00a1f20a, 0x0151911c, 0x03d7868e, 0x01ed1949, 0x0022f6f5, 0x03bcd5b3, 0x03e8a153, 0x029a48cb, 0x0037cb87}}}, + {X: Field{[10]uint32{0x01d16b19, 0x016119ae, 0x03c928f1, 0x0086df79, 0x00dc62cb, 0x01f6cf5b, 0x03fcf6b9, 0x00d5bf17, 0x03b40a83, 0x0030148c}}, Y: Field{[10]uint32{0x0254f500, 0x038efde7, 0x0327525e, 0x03d4588c, 0x00956616, 0x007a3795, 0x020eac65, 0x02211cfe, 0x02390ce7, 0x0002c6f6}}}, + {X: Field{[10]uint32{0x019dfffb, 0x039f7b02, 0x0010b455, 0x00799586, 0x010b736c, 0x02407cd5, 0x02000245, 0x009a9f66, 0x013cf342, 0x001b0193}}, Y: Field{[10]uint32{0x009eb9a7, 0x02093358, 0x002e9925, 0x01dca349, 0x02aa5444, 0x0071710b, 0x00f8fd2a, 0x030687e0, 0x0042d25e, 0x00058365}}}, + {X: Field{[10]uint32{0x03714cf2, 0x01eea762, 0x01009bf3, 0x01c91e27, 0x01b3e207, 0x00379a9f, 0x021a93a0, 0x006a946d, 0x038970bb, 0x0025963a}}, Y: Field{[10]uint32{0x02c51cc2, 0x00c07aa4, 0x01ff7a58, 0x012665f5, 0x0096be89, 0x01036278, 0x021a903f, 0x023e2de0, 0x00aff7da, 0x003352e9}}}, + {X: Field{[10]uint32{0x03b4f0c8, 0x039fa992, 0x031b87a3, 0x01a69c70, 0x035cf1f9, 0x00fe65bd, 0x032b0c4c, 0x01bdc247, 0x0110a554, 0x001b808e}}, Y: Field{[10]uint32{0x00c459c5, 0x026b76cd, 0x0358999b, 0x00d99470, 0x007faa9b, 0x0362486e, 0x02d8cfc7, 0x01cd3767, 0x01d790ec, 0x003dbb59}}}, + {X: Field{[10]uint32{0x00c7ff6e, 0x023e2655, 0x03a141e6, 0x006f5831, 0x03926290, 0x00cc14df, 0x003528e0, 0x001267e4, 0x0098e970, 0x000e8d6b}}, Y: Field{[10]uint32{0x032069ed, 0x00e36865, 0x00eb6c4d, 0x03e29d91, 0x001f247f, 0x03b68e09, 0x014ac0c9, 0x0070c14e, 0x0116da63, 0x00244f65}}}, + {X: Field{[10]uint32{0x036af212, 0x014395c1, 0x023db073, 0x01bc925d, 0x022317c6, 0x02c6522f, 0x036def30, 0x02a916a2, 0x025115df, 0x0034227e}}, Y: Field{[10]uint32{0x00a6da9c, 0x03f720c6, 0x00f6ab12, 0x02b12864, 0x03a18e5d, 0x00ffe844, 0x025120cf, 0x03eb11de, 0x0173f326, 0x00139aba}}}, + {X: Field{[10]uint32{0x018cf2ef, 0x02ecb083, 0x036ab045, 0x0357de42, 0x005b9cd9, 0x00f654c7, 0x00ea0f23, 0x00aad1d2, 0x012f2aa6, 0x0039ccf1}}, Y: Field{[10]uint32{0x0182a291, 0x00377c75, 0x02d89fb8, 0x0215c314, 0x0336ac48, 0x035ffdd4, 0x0323ab28, 0x01ca4eb2, 0x01c93c67, 0x001c0455}}}, + {X: Field{[10]uint32{0x03f14c7a, 0x02bdd8f9, 0x01b9be8c, 0x002ee065, 0x021eb477, 0x00aeafe1, 0x00aa6f24, 0x01a13f99, 0x037dc006, 0x0012dbde}}, Y: Field{[10]uint32{0x0194e00d, 0x01917ac8, 0x01d5a2b0, 0x001763c8, 0x017bfaea, 0x014e8132, 0x01805d8a, 0x01eccc30, 0x0380ac75, 0x001b162d}}}, + {X: Field{[10]uint32{0x0267f79d, 0x009b97f8, 0x038b4811, 0x0308ed1d, 0x0344ff51, 0x03154b9c, 0x00d7aeb8, 0x02b02831, 0x0002cd1f, 0x0006d481}}, Y: Field{[10]uint32{0x03db1a39, 0x03b0dd4d, 0x013c19e8, 0x03c424f6, 0x0030b252, 0x026b7536, 0x004ee943, 0x024c1283, 0x01005664, 0x00023b83}}}, + {X: Field{[10]uint32{0x017139b1, 0x02bcafae, 0x024f5bf9, 0x00fd0f61, 0x023400cc, 0x022a2179, 0x02da4c63, 0x03b617f0, 0x02d5d7f1, 0x00224db9}}, Y: Field{[10]uint32{0x029b402b, 0x00ac1060, 0x03c4778d, 0x005e96f5, 0x018879f2, 0x03f4c989, 0x00cdc8a6, 0x00ca8ddc, 0x0220b4b9, 0x000a604a}}}, + {X: Field{[10]uint32{0x016b518f, 0x00441172, 0x021eec4f, 0x01bd6e86, 0x01aebd39, 0x0157645c, 0x036c043a, 0x015536a8, 0x027f4813, 0x001a022b}}, Y: Field{[10]uint32{0x00425810, 0x0264e967, 0x01c2231b, 0x020df1d2, 0x00f581b9, 0x03d055d7, 0x00e85fd5, 0x0237715e, 0x026e8872, 0x001abf2b}}}, + {X: Field{[10]uint32{0x01a2cd1c, 0x01e4928d, 0x0310f236, 0x024d56a6, 0x0193e232, 0x00076002, 0x011bba76, 0x00fd9848, 0x029444c7, 0x00161b19}}, Y: Field{[10]uint32{0x025416c7, 0x0004ab3f, 0x031c8862, 0x0377bc19, 0x03873537, 0x00df2df1, 0x00f5507d, 0x028f2d02, 0x001ff6eb, 0x001d2c24}}}, + {X: Field{[10]uint32{0x03f89e11, 0x025efa07, 0x0066b078, 0x02966733, 0x020b183a, 0x02461507, 0x0388453e, 0x03c78131, 0x025ddead, 0x001e2720}}, Y: Field{[10]uint32{0x006cb5ab, 0x01e24e39, 0x0103cb8f, 0x015fffa6, 0x03e40cc3, 0x027e62a6, 0x027480b8, 0x02c4f1af, 0x026f641b, 0x002041aa}}}, + {X: Field{[10]uint32{0x01419797, 0x01f3efaa, 0x02076acd, 0x01bb8763, 0x02e52042, 0x01fd92f2, 0x00d0ddf9, 0x03ea9988, 0x00bbfd26, 0x0035eae0}}, Y: Field{[10]uint32{0x00c5a823, 0x02114de4, 0x02efbc71, 0x022e7ccb, 0x026e50a5, 0x004e7453, 0x034a85f5, 0x02c40ebb, 0x0372a6d1, 0x0009abe7}}}, + {X: Field{[10]uint32{0x02f67f7f, 0x015b4bcd, 0x033154c2, 0x00cf280a, 0x00bddf0f, 0x007af106, 0x012b311b, 0x006ae118, 0x02d44daf, 0x00063dc4}}, Y: Field{[10]uint32{0x037d25bc, 0x026f6981, 0x03ee9f2d, 0x034c8574, 0x006b06d8, 0x013fdefe, 0x033c3f43, 0x03533bb6, 0x0150f92f, 0x003102c6}}}, + {X: Field{[10]uint32{0x03e5a06e, 0x039ba9b1, 0x005b3eb9, 0x00c8877a, 0x02fc399d, 0x02662f31, 0x022a7cbf, 0x00623de3, 0x036d9f6d, 0x00221cc9}}, Y: Field{[10]uint32{0x03c9e1a6, 0x029c2079, 0x02b4e054, 0x010f012d, 0x00dac977, 0x0395985e, 0x0020a3a7, 0x02e7a3ba, 0x01378ee9, 0x000a5fa0}}}, + {X: Field{[10]uint32{0x0288e0ad, 0x00b299b1, 0x01157145, 0x019937de, 0x0030fadd, 0x037d0c73, 0x00f57cdf, 0x005faf02, 0x01015bd2, 0x000406e0}}, Y: Field{[10]uint32{0x01179e6a, 0x01cdc617, 0x01ab339b, 0x02d1b253, 0x014c7542, 0x02a3e372, 0x01816d40, 0x00e0c461, 0x032fad20, 0x003e9b06}}}, + {X: Field{[10]uint32{0x0342dd57, 0x035314df, 0x03b6cd81, 0x0328a612, 0x03abe3b3, 0x02c81c7e, 0x02520a8c, 0x00518047, 0x015776c3, 0x001decf0}}, Y: Field{[10]uint32{0x004a645a, 0x0226417f, 0x00244925, 0x017453c3, 0x00040cce, 0x010fbd6b, 0x0084c9b4, 0x0006dc70, 0x02b1dab6, 0x002342f3}}}, + {X: Field{[10]uint32{0x01daec7a, 0x01a9a83f, 0x005d3ecf, 0x0224cf20, 0x02fbe2c1, 0x02e99bc4, 0x03aca338, 0x0182dbfd, 0x015256ac, 0x000547cb}}, Y: Field{[10]uint32{0x024f62d6, 0x033a7c1d, 0x03ea674e, 0x02227355, 0x01c4833c, 0x027a508d, 0x03038d64, 0x012fe645, 0x017710cd, 0x0034aab3}}}, + {X: Field{[10]uint32{0x031d32c7, 0x028e0245, 0x011a2029, 0x0070446f, 0x00950881, 0x012d1b7e, 0x0338dbe2, 0x0105ed18, 0x0327f41e, 0x00375d73}}, Y: Field{[10]uint32{0x01b67be5, 0x00c88906, 0x013dd46c, 0x003363ed, 0x00ee2217, 0x0324761b, 0x0303c33c, 0x026e012a, 0x0055a338, 0x0038ca2e}}}, + {X: Field{[10]uint32{0x011d7a83, 0x035fbb9e, 0x0028a494, 0x01d8cd6d, 0x026a3f6b, 0x03d986c7, 0x02366ab3, 0x03671277, 0x03ebbdd1, 0x0003ea87}}, Y: Field{[10]uint32{0x0025d572, 0x015c4f6e, 0x029c413b, 0x02760695, 0x01948bb2, 0x00791955, 0x0248ee56, 0x000aae30, 0x014f8fce, 0x0037cd87}}}, + {X: Field{[10]uint32{0x018f8be5, 0x036bfb53, 0x03545671, 0x037e31a9, 0x00a4cada, 0x019e2565, 0x01ee65b6, 0x02ecc7f7, 0x01be5bc2, 0x000f3043}}, Y: Field{[10]uint32{0x0039c2df, 0x023995dc, 0x0110dbc0, 0x002ba909, 0x00710112, 0x0350b25d, 0x0292a3a9, 0x02b5bc39, 0x01ef8c66, 0x00200b51}}}, + {X: Field{[10]uint32{0x03b93ba2, 0x01dafb29, 0x03a1eaf5, 0x02140d78, 0x01856cc4, 0x014a00b8, 0x00dee7f7, 0x03b07245, 0x0325325d, 0x00255139}}, Y: Field{[10]uint32{0x02eeeb49, 0x020c4577, 0x03686aad, 0x03779421, 0x00aaf137, 0x005cce33, 0x0339b037, 0x00f013af, 0x03a68151, 0x0033b1f6}}}, + {X: Field{[10]uint32{0x0383a964, 0x02f8df27, 0x01eac038, 0x01b89de7, 0x0154eec6, 0x03737db0, 0x017ff8b4, 0x0188d9ec, 0x03dcd5d0, 0x0025283e}}, Y: Field{[10]uint32{0x03efe82a, 0x00a7bd33, 0x030e576f, 0x004d68a8, 0x03fea742, 0x0290b8b8, 0x0223e169, 0x01b206dc, 0x00fd5ef0, 0x003c97cd}}}, + {X: Field{[10]uint32{0x02b579c7, 0x03a12cf1, 0x03633100, 0x00ec27dd, 0x0314f67c, 0x0085ee90, 0x01fbd4bf, 0x01f8bda5, 0x01b2c3fc, 0x0026278a}}, Y: Field{[10]uint32{0x0221c888, 0x0143bf6d, 0x02771172, 0x010c0708, 0x01ed003a, 0x005f6abe, 0x034f3e99, 0x000a5c0a, 0x01280cd0, 0x0018229b}}}, + {X: Field{[10]uint32{0x033494a5, 0x00192fc1, 0x017f1c81, 0x0173a502, 0x0249b4bd, 0x0164d2b0, 0x00e979b0, 0x029674ec, 0x03c44295, 0x0030e317}}, Y: Field{[10]uint32{0x01d1e2fb, 0x00118b58, 0x02ecb760, 0x01c5f2fb, 0x031d1dbc, 0x003af059, 0x00e471ae, 0x02cda992, 0x03f6d354, 0x00058902}}}, + {X: Field{[10]uint32{0x03a7a63b, 0x0304e3c3, 0x037e1546, 0x01adeb61, 0x0207dc65, 0x031963be, 0x0341d8c5, 0x0011b162, 0x026735c4, 0x0037a73d}}, Y: Field{[10]uint32{0x006639ac, 0x021b78d4, 0x00cb7575, 0x039f66e5, 0x03ecc19d, 0x01120042, 0x03729275, 0x018b8f88, 0x024fba91, 0x000bf0a0}}}, + {X: Field{[10]uint32{0x02c06522, 0x0110303d, 0x023c4c8c, 0x002119d6, 0x03f1dd9e, 0x0230cf27, 0x01d84b38, 0x0022d41e, 0x0137e567, 0x0000933f}}, Y: Field{[10]uint32{0x002af897, 0x00eb1e71, 0x01f00738, 0x01ab36df, 0x021aee67, 0x016b219c, 0x034d2895, 0x00055ed2, 0x00ea0982, 0x00072f32}}}, + {X: Field{[10]uint32{0x007cc121, 0x00858e7a, 0x01ed7264, 0x023d8990, 0x012b275d, 0x038247a7, 0x00414a95, 0x02e6d8bd, 0x01086ad8, 0x00275b8c}}, Y: Field{[10]uint32{0x02d3abe0, 0x025e6dba, 0x01bca757, 0x02d379d4, 0x0043c46a, 0x029d0f3c, 0x02b59ad5, 0x0299f536, 0x000a6792, 0x002e491c}}}, + {X: Field{[10]uint32{0x0209354d, 0x02f82021, 0x01d38673, 0x00b749d9, 0x0374aea2, 0x023b4e37, 0x01c21e53, 0x020e55ce, 0x01ae28b2, 0x00014aa2}}, Y: Field{[10]uint32{0x00334e51, 0x0316c7b6, 0x01708089, 0x035661ed, 0x01469b06, 0x01dacbd8, 0x03cccd20, 0x020c2f4d, 0x01579b65, 0x003060fb}}}, + {X: Field{[10]uint32{0x0227571d, 0x034d0836, 0x0255046b, 0x0230b05c, 0x01cda3bf, 0x01c9f2bd, 0x03f5d31d, 0x00601c90, 0x0272491d, 0x000bff4c}}, Y: Field{[10]uint32{0x035b6ad5, 0x03326994, 0x01d52131, 0x02d74d06, 0x00599934, 0x037abbd6, 0x01e48be6, 0x02ccd28c, 0x03bd6f38, 0x00204ba3}}}, + {X: Field{[10]uint32{0x00973fca, 0x02567167, 0x022f2eba, 0x02709c19, 0x0265df68, 0x02c64ec5, 0x0251b66d, 0x0290e8d7, 0x02094269, 0x00175831}}, Y: Field{[10]uint32{0x010efadc, 0x03c7d221, 0x0048a3af, 0x02165a71, 0x006d3b92, 0x03d03350, 0x031bb7e3, 0x035864ac, 0x024fd1af, 0x003d644c}}}, + {X: Field{[10]uint32{0x0112ff75, 0x029ad2cf, 0x00d0ae6d, 0x03e615e1, 0x004c86da, 0x00706d58, 0x0026340e, 0x00cd4fd1, 0x000abfe5, 0x0008f831}}, Y: Field{[10]uint32{0x00191d9d, 0x0085444a, 0x03827f99, 0x01e66eb3, 0x00f19d5a, 0x02032851, 0x01baf682, 0x0024a824, 0x00b5fc86, 0x003a4211}}}, + {X: Field{[10]uint32{0x006094f6, 0x0221739f, 0x02bb1155, 0x01e4c2f4, 0x0050e67d, 0x03cdf6a0, 0x02f20d77, 0x00704b29, 0x00ab5d4a, 0x00251606}}, Y: Field{[10]uint32{0x02695e03, 0x00735592, 0x03b6f9a1, 0x018febf2, 0x0032ca81, 0x03b7b6d8, 0x0269c969, 0x02b9b6a9, 0x01d0e2f9, 0x002d7cb0}}}, + {X: Field{[10]uint32{0x00724c8c, 0x03b363f6, 0x0124bc41, 0x0175881b, 0x015043be, 0x00335ef3, 0x03a469ca, 0x02fda861, 0x037d2586, 0x00347d36}}, Y: Field{[10]uint32{0x02206839, 0x0296b384, 0x03365a1c, 0x02ac071b, 0x02b1525e, 0x00a4a719, 0x0080ce9b, 0x01dd2ef5, 0x038277c4, 0x00190153}}}, + {X: Field{[10]uint32{0x0014a18d, 0x01fd3b3b, 0x01e1860f, 0x00a973dd, 0x01158b4f, 0x010a8f44, 0x005f2d5b, 0x01ba706a, 0x014f2458, 0x0013d713}}, Y: Field{[10]uint32{0x00efdbe5, 0x02d28c6c, 0x03350986, 0x027a5c3e, 0x021e48bb, 0x01ffefb0, 0x013be2be, 0x01e581a5, 0x02716d54, 0x0015d5db}}}, + {X: Field{[10]uint32{0x0198150a, 0x01032e52, 0x02118c38, 0x031407a6, 0x013f8edf, 0x0393e40f, 0x023cf5c5, 0x00510f62, 0x005bdcb3, 0x00304ed8}}, Y: Field{[10]uint32{0x02cb8435, 0x000f2c85, 0x022b52f6, 0x0127d064, 0x006c368e, 0x0122c070, 0x022a8ea9, 0x03efd4b9, 0x02af99f1, 0x0023738b}}}, + {X: Field{[10]uint32{0x0029cbb6, 0x01d33409, 0x01753391, 0x019b899a, 0x03a3df24, 0x0073bad6, 0x024a5b5a, 0x00953925, 0x032ab66f, 0x00064dec}}, Y: Field{[10]uint32{0x02f2e385, 0x0005ce03, 0x0022bb57, 0x01e604f8, 0x030181e0, 0x00fffec6, 0x00eabb05, 0x001d72ef, 0x00a06f1b, 0x0025c4ac}}}, + {X: Field{[10]uint32{0x019ba2e4, 0x0186c1d0, 0x004d747e, 0x036deb4b, 0x00d757bb, 0x00ef87d6, 0x00ef386c, 0x01cbcc21, 0x033f2f17, 0x0039294c}}, Y: Field{[10]uint32{0x036b6f56, 0x00529eb2, 0x00c7c5af, 0x03326f05, 0x02132571, 0x02f05590, 0x009b7178, 0x0392e40e, 0x01a72ec2, 0x003a13df}}}, + {X: Field{[10]uint32{0x0206cca6, 0x03f6d2d5, 0x00dcffc7, 0x0106b855, 0x01d57a83, 0x03304217, 0x000a0cf5, 0x00aa3142, 0x00b0a3f4, 0x000be28e}}, Y: Field{[10]uint32{0x024681c1, 0x03ce31a3, 0x024f1134, 0x00b86c49, 0x002fa2a7, 0x03bb58a5, 0x0008d9c4, 0x0076d959, 0x02a52c30, 0x0021d931}}}, + {X: Field{[10]uint32{0x01a55ff7, 0x015c4aa0, 0x0070b873, 0x0266e106, 0x02acd145, 0x033aad7f, 0x00585b63, 0x00b5dedb, 0x01c2c51c, 0x0000f4af}}, Y: Field{[10]uint32{0x02d3e9e0, 0x02e3736d, 0x035e9496, 0x00da8fa2, 0x00922460, 0x0011db91, 0x01a808ff, 0x018f7ea6, 0x01adbbe2, 0x000cfdd2}}}, + {X: Field{[10]uint32{0x03ab7d3a, 0x03cf307b, 0x01b3e6e5, 0x00548b6f, 0x021ecec2, 0x00afe8f8, 0x02b9acf6, 0x01338cdd, 0x0008d676, 0x003f21fe}}, Y: Field{[10]uint32{0x0035176a, 0x032e5c4a, 0x00581717, 0x0093386f, 0x01c03430, 0x014292b0, 0x0015dd87, 0x03e4ddc2, 0x0303c1f4, 0x00339d7a}}}, + {X: Field{[10]uint32{0x031e68d5, 0x009c2fd6, 0x02cb4374, 0x014871f9, 0x01323549, 0x03326121, 0x00885dc0, 0x03847afa, 0x005c62de, 0x001fe06e}}, Y: Field{[10]uint32{0x029c4558, 0x0034a9da, 0x017f3ad7, 0x012bb572, 0x011750aa, 0x025b3dce, 0x01ba062d, 0x036d8705, 0x037d6a84, 0x002deb7b}}}, + {X: Field{[10]uint32{0x01fd5557, 0x022e40f8, 0x0288c826, 0x0224f085, 0x0233cc8f, 0x018bbe47, 0x01d8f47f, 0x00eb97a3, 0x003f7afd, 0x00358635}}, Y: Field{[10]uint32{0x00cd34b8, 0x02f2a9b8, 0x03fb4fc5, 0x0237f230, 0x0042ce9e, 0x024031f9, 0x03212679, 0x02e6c20a, 0x017b0c8a, 0x00186020}}}, + {X: Field{[10]uint32{0x016e4940, 0x03e532e2, 0x009310cc, 0x02f37ddb, 0x03694430, 0x020e0ee6, 0x03f540fc, 0x026c1b6b, 0x004ff237, 0x002e9693}}, Y: Field{[10]uint32{0x0107b1f2, 0x001d6a3f, 0x0128db91, 0x03954d29, 0x0325299d, 0x03cba4cc, 0x01309b24, 0x0239bd3b, 0x011a0b13, 0x000e8887}}}, + {X: Field{[10]uint32{0x00cfdf56, 0x00a7e8c6, 0x018abcec, 0x025720c2, 0x03801363, 0x02cd6eb0, 0x03591415, 0x00dd1a20, 0x01b60bee, 0x0031a462}}, Y: Field{[10]uint32{0x0339268c, 0x022f5275, 0x0279c582, 0x0078a6de, 0x019795e6, 0x038d01ec, 0x00232fa7, 0x0368eb37, 0x03c2b862, 0x00286176}}}, + {X: Field{[10]uint32{0x00efae12, 0x00dccb07, 0x02d71bcd, 0x021a1f96, 0x0270dffd, 0x0267500e, 0x0063423b, 0x02d006ae, 0x0144032f, 0x00147d9f}}, Y: Field{[10]uint32{0x01e10e59, 0x02cb6518, 0x01f5ca8e, 0x00fe2993, 0x020403e2, 0x032fc859, 0x00ae68a3, 0x00128caf, 0x0085a2c4, 0x00222c5d}}}, + {X: Field{[10]uint32{0x037c4bd5, 0x02fb9b7a, 0x00a36fa8, 0x005fb4f3, 0x016001e1, 0x0252e2d9, 0x006fb69a, 0x017e350d, 0x0209e558, 0x00336b3f}}, Y: Field{[10]uint32{0x02028542, 0x0211249b, 0x01ecefdb, 0x000d6515, 0x03af5fc4, 0x0019a675, 0x00121762, 0x00c74056, 0x005a9931, 0x00377c6f}}}, + {X: Field{[10]uint32{0x03f0e769, 0x00cf24e2, 0x01be319f, 0x02874598, 0x00481eaa, 0x033a4222, 0x0301d70c, 0x0391da71, 0x0371e1fc, 0x00204a79}}, Y: Field{[10]uint32{0x0045c6e2, 0x002a05bc, 0x02d700d4, 0x0226d511, 0x038a4db1, 0x01d259ab, 0x02d8b6f9, 0x02f158e7, 0x013da864, 0x000fad5c}}}, + {X: Field{[10]uint32{0x02bce3ab, 0x004cafd6, 0x009ada68, 0x02abe0a2, 0x00f39c14, 0x02a9cc35, 0x002fc0f8, 0x016f03cc, 0x02ef6d41, 0x002e5c18}}, Y: Field{[10]uint32{0x013db3a6, 0x003cc4f5, 0x02829049, 0x03954445, 0x006644c9, 0x0148891f, 0x00dfdd38, 0x0324f3f6, 0x0288cd76, 0x0022b5c1}}}, + {X: Field{[10]uint32{0x030bd913, 0x01a853d3, 0x03ca422a, 0x03b14552, 0x0250de67, 0x013a1af9, 0x01d6af8c, 0x006d7fa9, 0x018b4e81, 0x000670f2}}, Y: Field{[10]uint32{0x0190a109, 0x01d1bea8, 0x027bdd5d, 0x017a491d, 0x03c18b9d, 0x021425f2, 0x021b5c73, 0x03264cc3, 0x039648bd, 0x002f148f}}}, + {X: Field{[10]uint32{0x01b42b9c, 0x026cf0ad, 0x0355967a, 0x01efbf98, 0x020ad769, 0x02244638, 0x02be43f8, 0x03b9d2c7, 0x00c73616, 0x002e7bcd}}, Y: Field{[10]uint32{0x03661bea, 0x003a9a16, 0x022543b7, 0x02a8d5c3, 0x02e8dc05, 0x03988e54, 0x01be2715, 0x006b06e2, 0x01ddd55b, 0x0004bc73}}}, + {X: Field{[10]uint32{0x0103c34a, 0x03b6e5fd, 0x02ca86e8, 0x00faf7ae, 0x0359dd2a, 0x01b61371, 0x039c39a9, 0x0336d603, 0x034f58e2, 0x001dc638}}, Y: Field{[10]uint32{0x03e96df7, 0x019ec400, 0x03093135, 0x00a23838, 0x01cf5e37, 0x0312f45f, 0x01cd8f96, 0x0106e04b, 0x01fbdc08, 0x0029b441}}}, + {X: Field{[10]uint32{0x037e8dba, 0x03321c71, 0x02ed621f, 0x02c62bed, 0x01e259c1, 0x034d68da, 0x03ba89b8, 0x039cdd8e, 0x004b8e6d, 0x0036ace2}}, Y: Field{[10]uint32{0x00a11577, 0x00e89e05, 0x0153ee50, 0x0024abbe, 0x01c9316e, 0x036d2802, 0x02bd4b5e, 0x00b508ae, 0x0329c59a, 0x003d12db}}}, + {X: Field{[10]uint32{0x027f4366, 0x03b6ac79, 0x00a1876a, 0x0147a11f, 0x03a67367, 0x02d6f9b7, 0x026a8978, 0x01e0b797, 0x02101139, 0x0032cf43}}, Y: Field{[10]uint32{0x0157d3ea, 0x03e5c26f, 0x010cf189, 0x019da705, 0x01572aff, 0x03923c76, 0x0169b33b, 0x0250f99e, 0x008dd227, 0x0009ffa2}}}, + {X: Field{[10]uint32{0x00c3c6a0, 0x01fecefa, 0x0279fcca, 0x0191ba8b, 0x03656ea5, 0x03d8ad2d, 0x01193dbb, 0x02750423, 0x03f85561, 0x003ac6c7}}, Y: Field{[10]uint32{0x02282ea4, 0x0340f258, 0x027a5ced, 0x00e926cc, 0x01d36ae9, 0x000e1159, 0x01137414, 0x0357075c, 0x00c75b73, 0x00309fe8}}}, + {X: Field{[10]uint32{0x0039c5dd, 0x0025e187, 0x03aeb587, 0x03cf4b95, 0x00bee8f9, 0x00eadaf7, 0x01a11170, 0x003c47dd, 0x01e60bc4, 0x0017541e}}, Y: Field{[10]uint32{0x006e46d0, 0x02048851, 0x02bab805, 0x0378061c, 0x014d8435, 0x02f9ef7e, 0x025829b4, 0x02e75775, 0x012ba40d, 0x00052b84}}}, + {X: Field{[10]uint32{0x01a7b38e, 0x03f302a8, 0x00502384, 0x023780c0, 0x01b70809, 0x02c852ec, 0x028acd26, 0x01abc1b4, 0x02f76beb, 0x00004183}}, Y: Field{[10]uint32{0x03bdf9a3, 0x003b1230, 0x022e275d, 0x0015481f, 0x0334252c, 0x028860f5, 0x005464da, 0x03190a56, 0x039ff6c6, 0x0033903c}}}, + {X: Field{[10]uint32{0x02170695, 0x008e1cea, 0x03e1afd7, 0x0251c358, 0x01e7bcc8, 0x0309d14a, 0x007c271a, 0x03dcc625, 0x0063c001, 0x00259471}}, Y: Field{[10]uint32{0x0254eaf7, 0x00dfec39, 0x0154d218, 0x01e96a6c, 0x013b16ba, 0x022d8f26, 0x016d17fe, 0x001b69cf, 0x027fe8ff, 0x00138d8b}}}, + {X: Field{[10]uint32{0x03363dcc, 0x00a3c9c7, 0x0000ee09, 0x01334891, 0x01895cda, 0x02d0a2c6, 0x02822cdc, 0x0086d0bd, 0x03765928, 0x0017108a}}, Y: Field{[10]uint32{0x012b9400, 0x017f3d92, 0x0148444e, 0x036054a0, 0x014cb6b4, 0x03db01fd, 0x008258f0, 0x01df28d1, 0x034f9e4c, 0x000bf6d3}}}, + {X: Field{[10]uint32{0x01faba2c, 0x009364ea, 0x003d2b72, 0x029b353d, 0x02ab3868, 0x0114b312, 0x023ce519, 0x009435ce, 0x012b5d98, 0x0036c51f}}, Y: Field{[10]uint32{0x010ed0de, 0x02469e81, 0x009258a3, 0x03f81931, 0x009fdebf, 0x01ca65a1, 0x0343227a, 0x01ab37e8, 0x0380ad3c, 0x001cc950}}}, + {X: Field{[10]uint32{0x01454b4c, 0x0345b2f9, 0x01384a41, 0x009bb613, 0x01e1beca, 0x02207a26, 0x02237678, 0x02ff4594, 0x03a0f97a, 0x002699d8}}, Y: Field{[10]uint32{0x0090306a, 0x028074ce, 0x03cb2737, 0x01d64b22, 0x00e7952f, 0x00420a42, 0x031a3d55, 0x01605ccb, 0x007db6aa, 0x002ed450}}}, + {X: Field{[10]uint32{0x025daea8, 0x02da8003, 0x0400007d, 0x027a3147, 0x0007b45a, 0x03e53d61, 0x025c889e, 0x022bd3d3, 0x0133e910, 0x000dbf9e}}, Y: Field{[10]uint32{0x01227ee5, 0x0216ed09, 0x019e27fc, 0x02ed9ad1, 0x031943c7, 0x01c78570, 0x003a0f4a, 0x01688723, 0x01baecdd, 0x00340929}}}, + {X: Field{[10]uint32{0x03c784e7, 0x0155a28e, 0x006afc44, 0x03a96dce, 0x0144c749, 0x01d4a5a0, 0x02782fb8, 0x01f9a033, 0x0263f04f, 0x001036b9}}, Y: Field{[10]uint32{0x0355050b, 0x00445d95, 0x02bb9478, 0x011d12c5, 0x02cea2ab, 0x008f3c94, 0x0058c854, 0x03374009, 0x03fdac6b, 0x00126918}}}, + {X: Field{[10]uint32{0x01c5b8d1, 0x017272eb, 0x00a7542c, 0x02e9e7ea, 0x01da55fa, 0x0056bf67, 0x00c6d10b, 0x03cec23a, 0x016dc8ff, 0x0002e858}}, Y: Field{[10]uint32{0x00a786ff, 0x006ac96c, 0x01019764, 0x01797c38, 0x02771045, 0x0328256c, 0x025a3ace, 0x00f19865, 0x0042a623, 0x003bc25b}}}, + {X: Field{[10]uint32{0x019c4a66, 0x00b409d8, 0x01e7da70, 0x001417ee, 0x03d69b4a, 0x02f1c49c, 0x028c948d, 0x01254935, 0x036723a5, 0x000c121b}}, Y: Field{[10]uint32{0x02444c76, 0x00fb2eb0, 0x01ab6574, 0x01b66812, 0x01fd6acc, 0x011c292e, 0x02a63695, 0x03270217, 0x014d279e, 0x000e3293}}}, + {X: Field{[10]uint32{0x01e6932a, 0x0096f236, 0x0197090f, 0x024e6a27, 0x02d6accd, 0x03b0a809, 0x0367174d, 0x03475603, 0x029495ea, 0x0006e0fb}}, Y: Field{[10]uint32{0x02e20196, 0x0212f075, 0x03e0e345, 0x00d270ac, 0x033d2630, 0x00b9f43a, 0x0373d6da, 0x01214786, 0x0048fb5e, 0x000065b5}}}, + {X: Field{[10]uint32{0x03517396, 0x003c432d, 0x0264f2e3, 0x00c8053b, 0x01328b61, 0x03055e76, 0x02766715, 0x016844be, 0x002eedfa, 0x0013aa77}}, Y: Field{[10]uint32{0x006e50c2, 0x023c3d6c, 0x02c9c21e, 0x036741b2, 0x00d4a192, 0x00066d07, 0x003f0b14, 0x00f8a562, 0x03c96ef8, 0x001d053b}}}, + {X: Field{[10]uint32{0x02b033da, 0x025ff34b, 0x01b311a0, 0x024b572e, 0x02876777, 0x02d95d0d, 0x03217aa3, 0x02b4220e, 0x019dbee9, 0x001059b0}}, Y: Field{[10]uint32{0x02ed541c, 0x008dbadf, 0x001f8abc, 0x00ff4e36, 0x02b80e11, 0x02cdd6b1, 0x02b4d29a, 0x01aa9a4c, 0x025c5fae, 0x0018b141}}}, + {X: Field{[10]uint32{0x01a74899, 0x02ef82a1, 0x03f310a2, 0x021abe38, 0x02bbbc66, 0x034f4be5, 0x00511a87, 0x03d529a7, 0x03ebb112, 0x002c5d59}}, Y: Field{[10]uint32{0x009f52c2, 0x03f5cb53, 0x00bb1bdb, 0x008719c7, 0x03a69367, 0x02e24db7, 0x03fc6934, 0x02f952b8, 0x03413788, 0x003d99d8}}}, + {X: Field{[10]uint32{0x028095a5, 0x00ae2a6f, 0x0210212c, 0x02141408, 0x01a6df06, 0x00d44c4c, 0x01d81fdf, 0x01fcd022, 0x01152ab9, 0x00334ad9}}, Y: Field{[10]uint32{0x038f6a53, 0x024b8c79, 0x00bb45f4, 0x0212e1c0, 0x0322afff, 0x03513408, 0x02e40c72, 0x0064d457, 0x012f9ca4, 0x0033f9e5}}}, + {X: Field{[10]uint32{0x0218229f, 0x00c825cd, 0x0374a447, 0x01e4ebab, 0x032086c9, 0x001eb031, 0x0241a729, 0x0050280c, 0x03c49f33, 0x000dd580}}, Y: Field{[10]uint32{0x0385e837, 0x0058defa, 0x00699668, 0x004e1120, 0x03de08ba, 0x00025d76, 0x01ddb463, 0x029dcf84, 0x00f66322, 0x001eedd0}}}, + {X: Field{[10]uint32{0x03bb7432, 0x03c80bbb, 0x01632978, 0x0174b800, 0x017e1095, 0x00d0777a, 0x003c176f, 0x00f765b6, 0x03d4390a, 0x00040819}}, Y: Field{[10]uint32{0x039ba83e, 0x02068be0, 0x0322dafa, 0x03bdf9c1, 0x021d8b7e, 0x01aea77d, 0x0019f11b, 0x03330e9c, 0x03d54d28, 0x001f3db3}}}, + {X: Field{[10]uint32{0x0263081d, 0x01d89737, 0x01d544fb, 0x00bfa30b, 0x01374ef4, 0x022d23eb, 0x003042cf, 0x0314ee9c, 0x0273e3fb, 0x0011d85f}}, Y: Field{[10]uint32{0x01d439e8, 0x020bce70, 0x022a0e47, 0x019e1f0f, 0x0350cbae, 0x010f2abf, 0x0040f07f, 0x02a56ecb, 0x00230c92, 0x0007e93d}}}, + {X: Field{[10]uint32{0x03880f84, 0x0045d383, 0x034ca82e, 0x02f4c635, 0x0046b814, 0x038a2818, 0x017aac08, 0x01418a7d, 0x03af57f7, 0x000b10c6}}, Y: Field{[10]uint32{0x0209de50, 0x039631bc, 0x03adbb8e, 0x014ab162, 0x0262755a, 0x0214fd07, 0x00041089, 0x012ccb04, 0x03bc6857, 0x00376e79}}}, + {X: Field{[10]uint32{0x0343d599, 0x015c3760, 0x00b41338, 0x012c35dd, 0x033f4df4, 0x026dc22a, 0x0386b1f7, 0x02db9066, 0x02438143, 0x0024658d}}, Y: Field{[10]uint32{0x02312f0d, 0x008aa2dd, 0x00049696, 0x00d243d1, 0x00021be3, 0x01ae1eef, 0x0391d682, 0x02834a7e, 0x02177171, 0x00240d3b}}}, + {X: Field{[10]uint32{0x00b7754e, 0x013dfdf1, 0x02ddda4a, 0x0164ac05, 0x02028718, 0x015a0ec1, 0x00d42db9, 0x01b1ee0e, 0x0201af65, 0x002fca30}}, Y: Field{[10]uint32{0x0345d109, 0x02db7ce8, 0x00e20c50, 0x016ab0c8, 0x01ce6ffb, 0x01aac1a0, 0x0266c2f4, 0x00434aa2, 0x0304dda5, 0x0002ef53}}}, + {X: Field{[10]uint32{0x0118b137, 0x02d3cd65, 0x035a1bab, 0x00b296ba, 0x031aa426, 0x01663902, 0x01d531bf, 0x0097d138, 0x03860218, 0x003f2b1c}}, Y: Field{[10]uint32{0x02e67b64, 0x03fda154, 0x005936ff, 0x03fa1f9f, 0x037dcca7, 0x02e8dfbb, 0x032d1e41, 0x02fa87cf, 0x037a957b, 0x000ec65a}}}, + {X: Field{[10]uint32{0x026e9331, 0x0270775c, 0x01982302, 0x0326d1fb, 0x018ad89c, 0x0119fe02, 0x01f0278e, 0x03864850, 0x01dfcaae, 0x00273fa8}}, Y: Field{[10]uint32{0x00db211d, 0x00051ac6, 0x01f470b1, 0x03056dd7, 0x0096a071, 0x01421b8c, 0x010b6469, 0x03b8163f, 0x024e7f30, 0x001cb607}}}, + {X: Field{[10]uint32{0x021334da, 0x019bcd1a, 0x00e201e9, 0x014666e6, 0x00455c51, 0x00a00b0c, 0x01c7f21f, 0x014f1e59, 0x03421235, 0x0015234f}}, Y: Field{[10]uint32{0x016418ae, 0x025283a5, 0x0278a426, 0x02c40c44, 0x0208c0af, 0x016e51a1, 0x0138eeb1, 0x000f4a25, 0x0225cebb, 0x000184ba}}}, + {X: Field{[10]uint32{0x00295bc0, 0x022f759d, 0x01e22a6c, 0x015b18a3, 0x02ebd467, 0x02312643, 0x035c545e, 0x01309826, 0x019accf8, 0x00396f98}}, Y: Field{[10]uint32{0x01b08bf3, 0x00b8a81c, 0x01837a74, 0x033e6cd8, 0x0189e246, 0x02a162e4, 0x003aa74f, 0x006bdeb6, 0x00a57d84, 0x00190219}}}, + {X: Field{[10]uint32{0x01ac668f, 0x013a6ba8, 0x02209e19, 0x0037dcd3, 0x03a26046, 0x008da323, 0x028f733d, 0x03b52bba, 0x033e3400, 0x002d5824}}, Y: Field{[10]uint32{0x005f9da3, 0x0303008b, 0x028861b1, 0x03d378a6, 0x00ac0975, 0x033c5eef, 0x02ab1826, 0x01e14e7f, 0x013d3133, 0x00150e3e}}}, + {X: Field{[10]uint32{0x00cf60b1, 0x014aa887, 0x013c02c6, 0x025a30c5, 0x01dedf2d, 0x01d10cff, 0x03ecf7dd, 0x00f9e41d, 0x0297baca, 0x00087766}}, Y: Field{[10]uint32{0x0284797e, 0x001f3409, 0x038d917c, 0x0334d3d2, 0x01b851c4, 0x03683032, 0x019bbd7c, 0x02c2deda, 0x00e0e048, 0x00379b98}}}, + {X: Field{[10]uint32{0x01934bbd, 0x03ca403f, 0x03f37bca, 0x01d12327, 0x012f1478, 0x026f68c0, 0x01b0a52f, 0x010e6d32, 0x020c6d39, 0x00173e95}}, Y: Field{[10]uint32{0x01b11b06, 0x03feae69, 0x01a3235a, 0x034cfc37, 0x0129d5a5, 0x03a4dbca, 0x0156998c, 0x02566fcd, 0x02630cc1, 0x0031e49e}}}, + {X: Field{[10]uint32{0x026d4fc6, 0x00712da1, 0x02f49046, 0x039ed240, 0x016377af, 0x0253f325, 0x036204b3, 0x03350540, 0x01bb05ad, 0x00128ee5}}, Y: Field{[10]uint32{0x00e84f2f, 0x03402bea, 0x000232a0, 0x01ef7dc2, 0x018d6be4, 0x036e4e1f, 0x009179a4, 0x00793302, 0x02e2f1bd, 0x0035678f}}}, + {X: Field{[10]uint32{0x01f4671f, 0x012dd94d, 0x03d4a81c, 0x002b736c, 0x03404edb, 0x03741bc5, 0x0006b7ba, 0x01a7244f, 0x03130b4c, 0x00331268}}, Y: Field{[10]uint32{0x007bc278, 0x015ea25a, 0x011b24dd, 0x0054b1ea, 0x02ba4837, 0x034dd564, 0x036c1943, 0x01497abc, 0x02ecc35e, 0x0012f5c8}}}, + {X: Field{[10]uint32{0x00146d98, 0x00993335, 0x03d3740b, 0x0300637c, 0x00e07fda, 0x0362d3b8, 0x00f4f900, 0x029a7673, 0x005a7426, 0x00275d42}}, Y: Field{[10]uint32{0x00c4b0a9, 0x01b8f08b, 0x01ae6a4f, 0x03a4fe50, 0x01ce174a, 0x0392519f, 0x0372f44d, 0x02ccb411, 0x0253de04, 0x00016644}}}, + {X: Field{[10]uint32{0x03210fb8, 0x02c341a0, 0x00d18b95, 0x003beb48, 0x02caa87c, 0x027c7864, 0x0312cf5d, 0x036b74ba, 0x00df737b, 0x0037f419}}, Y: Field{[10]uint32{0x0103805a, 0x0206e4a4, 0x0122613d, 0x0264fab8, 0x019f3172, 0x02404bf5, 0x00b1d2b8, 0x0234cc14, 0x003da5bf, 0x001467e2}}}, + {X: Field{[10]uint32{0x007eaf9a, 0x006040a0, 0x012e3bf6, 0x0209a170, 0x001cf205, 0x0198c62f, 0x009013ea, 0x01b0d758, 0x035cd235, 0x000ad428}}, Y: Field{[10]uint32{0x01c76335, 0x012aeac7, 0x000f6ce7, 0x00790d4e, 0x02fdf424, 0x026d60a7, 0x01f5a77d, 0x03bbfae0, 0x011d303a, 0x0001f42d}}}, + {X: Field{[10]uint32{0x005abbc7, 0x0207ea1a, 0x030c3704, 0x03ccc09f, 0x020f3202, 0x01673517, 0x02e2a594, 0x01d79f1d, 0x034b2cf1, 0x00389ba3}}, Y: Field{[10]uint32{0x02c2013a, 0x03dcbf0e, 0x02c0f194, 0x0389183a, 0x01716e5f, 0x025f0d37, 0x00767029, 0x0145854c, 0x03baaa0d, 0x001320b9}}}, + {X: Field{[10]uint32{0x010f87fb, 0x034d20d7, 0x00959b46, 0x0147e097, 0x031fd90e, 0x039e3701, 0x0184057c, 0x03615da9, 0x037d54f4, 0x001640f6}}, Y: Field{[10]uint32{0x029e99c8, 0x00200447, 0x020f3816, 0x01028637, 0x03febf94, 0x034635bd, 0x00003329, 0x0046791f, 0x03d3e9ce, 0x0031578b}}}, + {X: Field{[10]uint32{0x0125e9c1, 0x0254f513, 0x00204fde, 0x03b8a2e6, 0x021040e6, 0x00d4906d, 0x03881e96, 0x02a0b722, 0x02cd0342, 0x0012eec3}}, Y: Field{[10]uint32{0x00b0ef04, 0x006a320b, 0x02335821, 0x03a6d134, 0x00082e97, 0x0013a1e1, 0x02bee8d6, 0x0116dd4a, 0x00900f34, 0x00004bac}}}, + {X: Field{[10]uint32{0x03c4e8d2, 0x01543e52, 0x0175b647, 0x01f506e5, 0x02702996, 0x034c9e78, 0x026eb38f, 0x02fe5f1b, 0x015aae87, 0x00012891}}, Y: Field{[10]uint32{0x03936074, 0x0255541c, 0x01c474a5, 0x008be718, 0x0309af34, 0x009d85e3, 0x012bea1e, 0x02fb98b5, 0x02c4ffe3, 0x00168d02}}}, + {X: Field{[10]uint32{0x03477623, 0x032be1d4, 0x004ad1de, 0x02f77389, 0x0394470a, 0x001ed4c3, 0x00329c4c, 0x0066a953, 0x028dc8ca, 0x003c21b5}}, Y: Field{[10]uint32{0x00bdbd08, 0x00c25c6d, 0x03d8020d, 0x028a022b, 0x034d9e8b, 0x03121a6a, 0x03e4161c, 0x01abc596, 0x01d384a1, 0x00244712}}}, + {X: Field{[10]uint32{0x03ba856c, 0x027e486d, 0x00cb4c98, 0x03dca5e2, 0x01d4b7cd, 0x00257c6d, 0x0253f912, 0x01b13892, 0x037e83b7, 0x0013c6c5}}, Y: Field{[10]uint32{0x0180eaf2, 0x0111c15f, 0x03811e10, 0x01a43702, 0x0399debb, 0x02ee54d2, 0x03dc2ff5, 0x02426bf0, 0x004eb060, 0x002955a3}}}, + {X: Field{[10]uint32{0x03db5823, 0x00d0c0e5, 0x0154c765, 0x039fe99e, 0x01c4fb5a, 0x02211de3, 0x012fcbc0, 0x0391688f, 0x009929a7, 0x003aea1e}}, Y: Field{[10]uint32{0x01cbf68f, 0x00085e8b, 0x02afee73, 0x02985c92, 0x02801b26, 0x03c0ebe7, 0x03c46b47, 0x00245c27, 0x0329b357, 0x0039be31}}}, + {X: Field{[10]uint32{0x002282c2, 0x008ed8ea, 0x02e7d877, 0x00e62731, 0x03130ee5, 0x01111567, 0x01580844, 0x02969e4b, 0x031334c9, 0x0037c45e}}, Y: Field{[10]uint32{0x016f7120, 0x03959054, 0x035a8c9b, 0x0175388c, 0x001a2fc5, 0x02954447, 0x02c5492e, 0x00f144ab, 0x02578eea, 0x003761f2}}}, + {X: Field{[10]uint32{0x02ee82c5, 0x00c871b9, 0x01a68621, 0x0392ea80, 0x021f5768, 0x03d7da81, 0x02eaa1bd, 0x02ae200d, 0x003b3e68, 0x0035dd55}}, Y: Field{[10]uint32{0x0081436e, 0x00ea7b86, 0x02e18049, 0x01184141, 0x0027a2bf, 0x01065fe7, 0x02e7a26c, 0x01ce60f3, 0x030547c9, 0x001c0886}}}, + {X: Field{[10]uint32{0x0178515d, 0x00bfafd1, 0x024c7148, 0x01fff7c1, 0x025e006f, 0x02335632, 0x005c6116, 0x006b96af, 0x01d55a23, 0x0029fc43}}, Y: Field{[10]uint32{0x003c13b0, 0x025ea79c, 0x0031eb47, 0x03c835a7, 0x01b2c24a, 0x007664e6, 0x025eb38d, 0x025a5388, 0x03a7b66b, 0x00124a8c}}}, + {X: Field{[10]uint32{0x020120ec, 0x00dba718, 0x0205b05d, 0x02ce04b6, 0x020801c6, 0x01add211, 0x0336c86c, 0x02af6444, 0x01ef3119, 0x0031e551}}, Y: Field{[10]uint32{0x03c28718, 0x00813774, 0x00382bd7, 0x0313c485, 0x00738a33, 0x01f7a81b, 0x0073f8ef, 0x03ab9145, 0x00db95b6, 0x0009323f}}}, + {X: Field{[10]uint32{0x02c2cb11, 0x020f8314, 0x006ec8e7, 0x0359a888, 0x03afa14d, 0x03884128, 0x0043ba29, 0x02223d7e, 0x035e744f, 0x000262ea}}, Y: Field{[10]uint32{0x00b94df6, 0x030c34af, 0x03cbe0b2, 0x03518dab, 0x02a7abae, 0x0051af35, 0x01d929b8, 0x01fb6314, 0x019fe5e8, 0x0020ed5a}}}, + {X: Field{[10]uint32{0x00ac586e, 0x01d4bbf7, 0x00110547, 0x0212b099, 0x0160d84a, 0x00e77ffd, 0x0213053d, 0x02912b20, 0x00287b6f, 0x001b738a}}, Y: Field{[10]uint32{0x0237ed66, 0x03f18a78, 0x00a5cadc, 0x02654d5e, 0x00c79be3, 0x00197469, 0x032fa8dd, 0x0033116a, 0x022ab9d6, 0x000787ad}}}, + {X: Field{[10]uint32{0x023dfa83, 0x02c2b398, 0x030c1b7f, 0x037423db, 0x03db06a9, 0x02c92b63, 0x02b091b5, 0x01cf24c1, 0x0259287a, 0x00038e1a}}, Y: Field{[10]uint32{0x005b34e6, 0x02582a74, 0x00ed6852, 0x008508a1, 0x01c0d3b2, 0x0385bf35, 0x024ce899, 0x01929798, 0x03da663b, 0x00129f9c}}}, + {X: Field{[10]uint32{0x024fe4d5, 0x03aa89fa, 0x0118004b, 0x0060989b, 0x00cea0a3, 0x02e550eb, 0x00283fc9, 0x02f8c663, 0x0382e62f, 0x0023f7fd}}, Y: Field{[10]uint32{0x00086675, 0x008b4aab, 0x00708c52, 0x007d0c5f, 0x03a4f530, 0x0041fa21, 0x03ed6508, 0x03656d9c, 0x00719fe0, 0x003fbe3d}}}, + {X: Field{[10]uint32{0x012eaa37, 0x0381108a, 0x01089a10, 0x0310d722, 0x0136ed1c, 0x03a9593a, 0x03bb8b84, 0x02c52006, 0x03ae7842, 0x00132424}}, Y: Field{[10]uint32{0x025298dd, 0x02542829, 0x03426ea2, 0x00afe169, 0x03864236, 0x03a4d5bd, 0x02c0903f, 0x0117eb96, 0x033493d2, 0x000b5a0c}}}, + {X: Field{[10]uint32{0x03103a1b, 0x01b56e8c, 0x00f2fe86, 0x031bf5db, 0x01056318, 0x0381ca8d, 0x02b80f9b, 0x014aa764, 0x00c55c5c, 0x0033018d}}, Y: Field{[10]uint32{0x007f0b32, 0x03c2c234, 0x01e887e8, 0x01dc6da6, 0x004004aa, 0x01ff2180, 0x0236eb08, 0x02da79b4, 0x0141b13c, 0x001d42df}}}, + {X: Field{[10]uint32{0x03918255, 0x01bdc78e, 0x026569a5, 0x03b33fdd, 0x011d53c7, 0x033292b6, 0x0133f5f9, 0x01eb162f, 0x027341fa, 0x0025d269}}, Y: Field{[10]uint32{0x00916068, 0x01b3b61a, 0x00d870ec, 0x01a73e96, 0x025e68fd, 0x038df676, 0x012a2aaf, 0x031f59da, 0x01c1009d, 0x002da17c}}}, + {X: Field{[10]uint32{0x017d8e75, 0x00dded1a, 0x011bc9e0, 0x014dcaf6, 0x03a25bd2, 0x01f682c6, 0x0257fdcb, 0x018bc816, 0x00efb578, 0x002c12af}}, Y: Field{[10]uint32{0x01e168f6, 0x01405286, 0x03d4278b, 0x02bf6a39, 0x0262dcb8, 0x0362e6ef, 0x01b58690, 0x012f8d22, 0x026466ad, 0x001411e6}}}, + {X: Field{[10]uint32{0x01c78902, 0x0093a151, 0x01768226, 0x02df2012, 0x02295059, 0x0217c035, 0x023b3957, 0x03efb7c6, 0x01e85481, 0x003447df}}, Y: Field{[10]uint32{0x035c3416, 0x00cd961b, 0x039c3173, 0x032d1200, 0x02b48928, 0x00499a60, 0x03369d81, 0x004a4069, 0x0368be0c, 0x0007458c}}}, + {X: Field{[10]uint32{0x0356fd4b, 0x02e202d5, 0x02b90970, 0x0182ca6c, 0x02fd6151, 0x00ed8f2c, 0x03225af7, 0x031e9024, 0x01f465c4, 0x00288719}}, Y: Field{[10]uint32{0x0345ecfe, 0x01aa8c24, 0x0186c766, 0x03897de9, 0x0157f1e3, 0x001228a5, 0x01e34767, 0x039839f7, 0x0389394d, 0x001a689a}}}, + {X: Field{[10]uint32{0x02497a1f, 0x03bfb85a, 0x036a4fde, 0x022c61b1, 0x0036ccda, 0x029633b4, 0x003d3999, 0x00d83a49, 0x02fbb080, 0x0014f189}}, Y: Field{[10]uint32{0x002ac9b7, 0x01f86ddd, 0x036bbeda, 0x01eb1011, 0x0008264d, 0x00cd85aa, 0x01106fb9, 0x03fc7946, 0x000862a7, 0x002b6498}}}, + {X: Field{[10]uint32{0x00e6ff0e, 0x005b139d, 0x02870601, 0x00cc46dc, 0x0211d969, 0x01d07c42, 0x0364fcc8, 0x00eb6340, 0x01871b2a, 0x0033d9ed}}, Y: Field{[10]uint32{0x02b68422, 0x01b4a748, 0x03cae6d3, 0x01fc966a, 0x027be653, 0x033878c2, 0x00ac068c, 0x035d3bda, 0x037c10cc, 0x000b258e}}}, + {X: Field{[10]uint32{0x010b4bc7, 0x0335a9b2, 0x018d731e, 0x00a77a7d, 0x01364288, 0x00d33783, 0x01a89a4b, 0x021c00a7, 0x02d808cc, 0x00014085}}, Y: Field{[10]uint32{0x01e38b21, 0x0367e9d2, 0x01e0c123, 0x01f99549, 0x0236f65d, 0x02944b56, 0x02fce322, 0x01224637, 0x01f096bc, 0x00248307}}}, + {X: Field{[10]uint32{0x03d1aef3, 0x019b0f64, 0x001a2677, 0x02f789bb, 0x033d6000, 0x03de42bf, 0x00cc62da, 0x01beedec, 0x0194f468, 0x00076115}}, Y: Field{[10]uint32{0x0134d260, 0x0027e7cc, 0x0173425c, 0x00db35aa, 0x0092450b, 0x0211f71b, 0x01340351, 0x03680bbc, 0x03a6bd9d, 0x003ab846}}}, + {X: Field{[10]uint32{0x024785e1, 0x014aede7, 0x030c3d5c, 0x0295bdf9, 0x012e7750, 0x01678aad, 0x027d5908, 0x02e5f41d, 0x0350b6c5, 0x00046b53}}, Y: Field{[10]uint32{0x00023b94, 0x018f6d6a, 0x027ac4e2, 0x011befdf, 0x011826e8, 0x00533e9c, 0x0152496f, 0x03671408, 0x02368725, 0x000b0aee}}}, + {X: Field{[10]uint32{0x0149388c, 0x0090ac2f, 0x02e3d12b, 0x00965a75, 0x03f76ee4, 0x01820a87, 0x024a5198, 0x01cf84a6, 0x027cd723, 0x000d5a34}}, Y: Field{[10]uint32{0x0354fdb3, 0x031db561, 0x033daf04, 0x02360e73, 0x038eff10, 0x0042a395, 0x02356680, 0x01011c5b, 0x03a96d09, 0x00038db7}}}, + {X: Field{[10]uint32{0x017801d7, 0x028b05fc, 0x038abafa, 0x01caf702, 0x0246310f, 0x01c01dd0, 0x02abb919, 0x02743174, 0x033545e0, 0x000ddcaa}}, Y: Field{[10]uint32{0x0278884e, 0x01001082, 0x03260053, 0x02be3b6d, 0x00775693, 0x022c04b8, 0x03a50cda, 0x031d18b5, 0x028ceae0, 0x000948a6}}}, + {X: Field{[10]uint32{0x029274f2, 0x00153970, 0x0131fa13, 0x026747b8, 0x0244f3b2, 0x022e4eb4, 0x0224779c, 0x01c06b91, 0x024f72c4, 0x0020546c}}, Y: Field{[10]uint32{0x00bb6429, 0x035544ae, 0x00c9986e, 0x009134b9, 0x03734207, 0x0030a35d, 0x033fca05, 0x03586779, 0x030725ff, 0x001624e0}}}, + {X: Field{[10]uint32{0x01539c9a, 0x00d25197, 0x034c8692, 0x0076489f, 0x001b57a8, 0x0394dc20, 0x00597050, 0x007e3183, 0x015ad410, 0x0011a921}}, Y: Field{[10]uint32{0x01e36b59, 0x034f9a22, 0x00864bee, 0x00917faa, 0x039517ad, 0x038bc82e, 0x00117ae0, 0x01c6578b, 0x01cf2111, 0x0023e99b}}}, + {X: Field{[10]uint32{0x01803d16, 0x0224f185, 0x02d4f0fd, 0x017d3b38, 0x00efa7c4, 0x00e2f4a9, 0x0015001c, 0x013cf7bb, 0x01543e65, 0x0002e06f}}, Y: Field{[10]uint32{0x029d3e75, 0x00ae8053, 0x00c4a75d, 0x03f96a25, 0x032b3947, 0x03e4eda8, 0x00316228, 0x0269d8d1, 0x03aa3129, 0x000570fd}}}, + {X: Field{[10]uint32{0x012e7706, 0x03572b40, 0x01faba5c, 0x03c933f2, 0x01423f10, 0x01356200, 0x038c0549, 0x00c93491, 0x021cf2a0, 0x000f85a6}}, Y: Field{[10]uint32{0x01389135, 0x008d5886, 0x020f9869, 0x012ff2a4, 0x03004d45, 0x01c02d2f, 0x0069075a, 0x02b1f14d, 0x03ddd814, 0x00081016}}}, + {X: Field{[10]uint32{0x01a65956, 0x02f74b53, 0x02fdf534, 0x02e1510f, 0x03557f39, 0x0379866f, 0x027a1b8c, 0x02ccfc3d, 0x024ab161, 0x001d0a0f}}, Y: Field{[10]uint32{0x00b3df3a, 0x038da274, 0x03159bfe, 0x005c71de, 0x01380c17, 0x02205d13, 0x033ad2bc, 0x0170119d, 0x03e28978, 0x00088a5a}}}, + {X: Field{[10]uint32{0x026b756e, 0x00f68e7a, 0x00092bde, 0x02d37a0a, 0x021a617f, 0x02de5539, 0x01da0a23, 0x02f27ed9, 0x0386cb76, 0x00189c55}}, Y: Field{[10]uint32{0x02c2db32, 0x017f6414, 0x0317d34a, 0x01608787, 0x00eec54d, 0x03e65444, 0x0163337b, 0x028540ed, 0x03e38829, 0x000f09ee}}}, + {X: Field{[10]uint32{0x037c8aae, 0x0168001b, 0x01f739c5, 0x038b28d7, 0x002c93ae, 0x015659d0, 0x0336bc9d, 0x02e24e10, 0x0105db23, 0x00258800}}, Y: Field{[10]uint32{0x00a6ba26, 0x037e85e1, 0x03b19a2b, 0x03638ff4, 0x01ea41cd, 0x026197d2, 0x00307c5d, 0x00981320, 0x028d400a, 0x000c64a5}}}, + {X: Field{[10]uint32{0x031d13fb, 0x0365a5ad, 0x01c313aa, 0x00d5506d, 0x01317875, 0x02fe2cb1, 0x0052fb5c, 0x0246c233, 0x0398bd26, 0x002f51dd}}, Y: Field{[10]uint32{0x03ddfc3b, 0x01f8502a, 0x0150b6be, 0x00e5299b, 0x0351978b, 0x03139eca, 0x01dae500, 0x0000cf08, 0x01c9a4ab, 0x002f8ad4}}}, + {X: Field{[10]uint32{0x035289e7, 0x0270c151, 0x02b05903, 0x006bd4b6, 0x0070da10, 0x02ab19e2, 0x01490e83, 0x03e126ed, 0x0388e46f, 0x003e8524}}, Y: Field{[10]uint32{0x0067b2a7, 0x0080c2e2, 0x015e37f2, 0x03470613, 0x02c75af3, 0x03349a87, 0x032080ad, 0x0159d0ec, 0x037fa8d8, 0x00211555}}}, + {X: Field{[10]uint32{0x0391ba90, 0x00dab80c, 0x00e86ff4, 0x00f11c80, 0x028ab50d, 0x01e069c2, 0x03bfae73, 0x03fec752, 0x03830af1, 0x00108a36}}, Y: Field{[10]uint32{0x03a270a7, 0x01c7632d, 0x01637d40, 0x03252d2b, 0x032413dd, 0x0066f4b8, 0x01560b64, 0x03c28600, 0x010ab0e6, 0x001176c7}}}, + {X: Field{[10]uint32{0x0017c85c, 0x0187fcc2, 0x03d49f41, 0x026bf28a, 0x021dc3a3, 0x02da71a1, 0x0094c02e, 0x03d680f5, 0x0279fe0d, 0x002a5eac}}, Y: Field{[10]uint32{0x019bec7d, 0x00d72371, 0x022900e5, 0x0105ac72, 0x005d4b74, 0x0335b7bb, 0x032f99f7, 0x03785cf5, 0x00bff128, 0x001401b2}}}, + {X: Field{[10]uint32{0x004c668f, 0x011199a4, 0x02b63f8d, 0x011544d7, 0x039f27dc, 0x0067ee8d, 0x01a3a1cc, 0x03198538, 0x00576bdc, 0x0030351b}}, Y: Field{[10]uint32{0x03215f58, 0x0024db72, 0x03a71f19, 0x00bd1fff, 0x013d1917, 0x024f1d82, 0x017d7ccf, 0x02c940b2, 0x00a30b28, 0x000e5ad8}}}, + {X: Field{[10]uint32{0x01a8dbbd, 0x00cd8fec, 0x00e636de, 0x031b86e2, 0x020b7ae4, 0x01716f28, 0x01b8c2c2, 0x03e9f782, 0x03e04599, 0x001cf175}}, Y: Field{[10]uint32{0x007bc617, 0x005f689d, 0x01ea3faf, 0x037dbea3, 0x0309229a, 0x0310c759, 0x02986b00, 0x03590827, 0x008d558b, 0x000767b4}}}, + {X: Field{[10]uint32{0x024827a7, 0x00f227b8, 0x03ab7bbf, 0x01958ab4, 0x00b4788c, 0x006805d4, 0x0097c6ef, 0x01210e36, 0x001da2ef, 0x0000dc12}}, Y: Field{[10]uint32{0x020fa7b1, 0x0390d71d, 0x02aaa190, 0x02d14e16, 0x01ccf794, 0x00003c3c, 0x004acc33, 0x00640476, 0x0076c205, 0x002a22ce}}}, + {X: Field{[10]uint32{0x037807ec, 0x02206758, 0x01d54eda, 0x02fd926e, 0x02f2b68c, 0x00d1e42f, 0x01bb7d8d, 0x03c29267, 0x03033006, 0x000b72f8}}, Y: Field{[10]uint32{0x0290c1e1, 0x03d63dc6, 0x01bda5d6, 0x00f5613e, 0x02092cf4, 0x00fe8a35, 0x015de2df, 0x00ca7ae4, 0x02e3c7ab, 0x002e0ad1}}}, + {X: Field{[10]uint32{0x017bb4b7, 0x0110bd80, 0x023c908a, 0x0193e3d0, 0x0144052b, 0x0093de96, 0x035d957c, 0x01171778, 0x00a916db, 0x003d17cf}}, Y: Field{[10]uint32{0x029b5a96, 0x01a39808, 0x03fc1dad, 0x03de042e, 0x015b4a0f, 0x03193798, 0x01d6a795, 0x0135b368, 0x002fb315, 0x001e777c}}}, + {X: Field{[10]uint32{0x0387605e, 0x01fa5779, 0x02e934fe, 0x01af8ea6, 0x03ee1734, 0x01200954, 0x01c99bcc, 0x0159e919, 0x028bcad0, 0x0014032a}}, Y: Field{[10]uint32{0x0238370a, 0x01c318bc, 0x02a58f05, 0x0291fe08, 0x024e1bee, 0x00f77495, 0x019dccf7, 0x03235ab8, 0x02d075df, 0x0010211f}}}, + {X: Field{[10]uint32{0x024c3aff, 0x017bb135, 0x01557c52, 0x021dbea1, 0x037bcd8b, 0x008ee24e, 0x0346191e, 0x018b156d, 0x0186a239, 0x000c158a}}, Y: Field{[10]uint32{0x00577a53, 0x00dd41e0, 0x01fe9373, 0x02622975, 0x00e19d8d, 0x02ed5519, 0x020c0347, 0x014e0c6d, 0x02be41c4, 0x00000b56}}}, + {X: Field{[10]uint32{0x008e422e, 0x006383ad, 0x0078f63a, 0x00ada8c1, 0x01ec7238, 0x03879881, 0x013f690b, 0x01adca7b, 0x011a3252, 0x003da1f5}}, Y: Field{[10]uint32{0x01515704, 0x0384aadf, 0x01680211, 0x033a830b, 0x00f197e2, 0x00dac56f, 0x014da2ed, 0x013debf1, 0x033519c9, 0x003bf386}}}, + {X: Field{[10]uint32{0x01ca505d, 0x022133e8, 0x01018472, 0x029f7a99, 0x0322199e, 0x0002b9fa, 0x00e207e5, 0x00d47327, 0x03f0d385, 0x00041298}}, Y: Field{[10]uint32{0x00239cc5, 0x02b12a0c, 0x0267ce05, 0x03a4cf4b, 0x00a6de0b, 0x028a8bb7, 0x031600a0, 0x002cf16b, 0x008750b2, 0x001a7086}}}, + {X: Field{[10]uint32{0x0280fc6e, 0x02b268fa, 0x01c035e6, 0x02f50c0a, 0x02eb3d59, 0x03d34a56, 0x03963e2f, 0x023286af, 0x00994b7b, 0x00142598}}, Y: Field{[10]uint32{0x027287b1, 0x018eb7cc, 0x02519729, 0x029ef22b, 0x0256be56, 0x0152ba8f, 0x02116748, 0x0066c604, 0x01cd40d0, 0x00352162}}}, + {X: Field{[10]uint32{0x00513c95, 0x033e23d5, 0x02a0dd22, 0x027f4721, 0x007ac22e, 0x02c3cb1f, 0x0388e85e, 0x0384d475, 0x02e794e5, 0x000c41b5}}, Y: Field{[10]uint32{0x03a2bca0, 0x02612f4b, 0x00dfadbf, 0x02320b3a, 0x004ad288, 0x0001ab86, 0x02849d84, 0x02330a64, 0x013c0456, 0x00301796}}}, + {X: Field{[10]uint32{0x0059fdce, 0x0053db88, 0x01235e79, 0x010f79a0, 0x03d1081b, 0x00ee7973, 0x0376ac71, 0x02f73a13, 0x011c9977, 0x0013259f}}, Y: Field{[10]uint32{0x008968cd, 0x02f9457a, 0x010ee206, 0x000a8a3a, 0x00fcc10d, 0x00e971f7, 0x002cb098, 0x026dd057, 0x00b2a3e9, 0x0021991c}}}, + {X: Field{[10]uint32{0x02781a52, 0x03fe440e, 0x032b2e4a, 0x000bfd78, 0x01b4027b, 0x03d63d8b, 0x00bbb7fb, 0x01dd0476, 0x0099ae8d, 0x00258c64}}, Y: Field{[10]uint32{0x03947389, 0x03717d59, 0x00ed422e, 0x0136de1f, 0x03d776eb, 0x02ee8bc2, 0x03148f8d, 0x00a1268e, 0x00740daf, 0x001b0440}}}, + {X: Field{[10]uint32{0x00247ee7, 0x00c3e8d6, 0x028b3bdf, 0x00add65c, 0x02b97224, 0x016bd5bc, 0x017406d9, 0x01b3aa77, 0x032387a3, 0x001f24ee}}, Y: Field{[10]uint32{0x02989942, 0x03136667, 0x00e018f7, 0x03db8f59, 0x0017cb34, 0x02568389, 0x0201e168, 0x01f219b6, 0x02983348, 0x00087937}}}, + {X: Field{[10]uint32{0x03f1e074, 0x02a46541, 0x01cddc3b, 0x02edf1b7, 0x01c764da, 0x021e8c8a, 0x01db1433, 0x005861b6, 0x020388de, 0x00319792}}, Y: Field{[10]uint32{0x03ca658b, 0x01266ef3, 0x0017bdaa, 0x030bf5e1, 0x0202137b, 0x0311707e, 0x0225a457, 0x016ca33a, 0x01430800, 0x003561b4}}}, + {X: Field{[10]uint32{0x00d674d5, 0x0285f619, 0x00f354d9, 0x02c6a042, 0x00381b1f, 0x0076346e, 0x01a380c7, 0x021a4af3, 0x012490c2, 0x0036256a}}, Y: Field{[10]uint32{0x03de17f5, 0x013dd61f, 0x0373d980, 0x028ac02b, 0x01c7cf2b, 0x02ef3496, 0x02f5728d, 0x0004fde7, 0x02250a63, 0x0034c2f6}}}, + {X: Field{[10]uint32{0x03def988, 0x03fc7857, 0x0113227b, 0x00e8f1fc, 0x00c892e2, 0x018f47dc, 0x03fa1640, 0x02e6efeb, 0x003a5b36, 0x0024119f}}, Y: Field{[10]uint32{0x029b15a7, 0x0320207a, 0x01568946, 0x01dc78cf, 0x02205225, 0x0288ab5d, 0x03ccb41b, 0x01f66cf3, 0x01914024, 0x0013b1c0}}}, + {X: Field{[10]uint32{0x02294c7e, 0x032b5d0f, 0x019810ab, 0x01756369, 0x03b4d38e, 0x03d4fbf1, 0x03268f78, 0x000969eb, 0x01630d0e, 0x0017340f}}, Y: Field{[10]uint32{0x002dfb3e, 0x002dc3ed, 0x007811a1, 0x010cd376, 0x00f168e0, 0x03938392, 0x01510cfe, 0x035072ac, 0x036e5517, 0x0030dca7}}}, + {X: Field{[10]uint32{0x007e964b, 0x00028943, 0x02988fc7, 0x000be601, 0x008bf69c, 0x03cd88a5, 0x01d7629b, 0x03173a8f, 0x009c652b, 0x00144c31}}, Y: Field{[10]uint32{0x032cf563, 0x0070855b, 0x0336b738, 0x008c6af8, 0x03a027ef, 0x01e910c4, 0x01f98c7b, 0x036f4c26, 0x02194bc9, 0x001f91b8}}}, + {X: Field{[10]uint32{0x02dd34da, 0x011de5a3, 0x01dbcc54, 0x0157969f, 0x02261a31, 0x02e49204, 0x01473066, 0x0353a44e, 0x002a33b8, 0x00256267}}, Y: Field{[10]uint32{0x026b7cb3, 0x03166476, 0x00a41d4d, 0x02d24e82, 0x01bac79f, 0x02f83411, 0x027277b5, 0x000a4a7a, 0x02998424, 0x002259ef}}}, + {X: Field{[10]uint32{0x0089745f, 0x01b903bd, 0x026049dd, 0x00e0b9d7, 0x036e55d2, 0x006137f3, 0x00650c88, 0x03a4fdf1, 0x00138cb3, 0x0000e4a0}}, Y: Field{[10]uint32{0x00006a52, 0x00251c7e, 0x03799587, 0x0011bed0, 0x02056bdf, 0x00bc9556, 0x01bd6d47, 0x03ce8722, 0x0298b897, 0x001c2c97}}}, + {X: Field{[10]uint32{0x0380b451, 0x0223f0cb, 0x03997fa3, 0x0034f3f1, 0x01ba7207, 0x03fc4223, 0x010497cb, 0x02fb7392, 0x0331b5fd, 0x00291f84}}, Y: Field{[10]uint32{0x01576b19, 0x00999baa, 0x024ecec2, 0x01194884, 0x00062447, 0x028f32e7, 0x006c75bd, 0x00119502, 0x00befff0, 0x0032952e}}}, + {X: Field{[10]uint32{0x00cfb96a, 0x002fb478, 0x036c82d5, 0x032ed237, 0x03f1b325, 0x0020f3f4, 0x03bb1344, 0x01d4a0f2, 0x008e16c5, 0x00330698}}, Y: Field{[10]uint32{0x00cc6734, 0x0082a0ce, 0x03ab5551, 0x021ec092, 0x03591b8f, 0x02382484, 0x03b0c987, 0x02c89104, 0x024467d9, 0x0016e2b2}}}, + {X: Field{[10]uint32{0x03fc3cea, 0x003db0b0, 0x0191a5d7, 0x0075a6d6, 0x03b7438d, 0x036cef78, 0x024d1df2, 0x02ebadeb, 0x03c7591e, 0x00360d52}}, Y: Field{[10]uint32{0x02ab5ad3, 0x019bc227, 0x03a31fe2, 0x031ca601, 0x017d95af, 0x01d646fb, 0x00227039, 0x03c0fca5, 0x02936765, 0x003bf225}}}, + {X: Field{[10]uint32{0x01def8aa, 0x038f68a3, 0x01d6ff2a, 0x007138ff, 0x03481ee2, 0x03681d91, 0x02ef42e6, 0x01d02c84, 0x0163ceb2, 0x001ab072}}, Y: Field{[10]uint32{0x01164281, 0x02fcfa39, 0x00d9fb1b, 0x035c2844, 0x00c52140, 0x017c80c7, 0x0053c94f, 0x016b8915, 0x00171b6d, 0x00013f22}}}, + {X: Field{[10]uint32{0x0318b42d, 0x034b91db, 0x035c4ddd, 0x00f42803, 0x0274d4da, 0x01e3ecdb, 0x00474697, 0x010523e7, 0x0359b52e, 0x002f84c3}}, Y: Field{[10]uint32{0x03c47069, 0x0263707e, 0x01516093, 0x02e51912, 0x01c5b9f8, 0x030737d8, 0x02a7d761, 0x02962808, 0x01e2f739, 0x0005b736}}}, + {X: Field{[10]uint32{0x0063bd2f, 0x031e79b0, 0x00f3ffc3, 0x03e47e7d, 0x0124ee71, 0x018996ec, 0x0356e599, 0x012955a2, 0x00cc3986, 0x001a176e}}, Y: Field{[10]uint32{0x02b50f29, 0x02eb9721, 0x03493037, 0x02fe69d7, 0x0122b396, 0x016f8c08, 0x0333b8e0, 0x00bdf0b4, 0x01418e5b, 0x001cc29c}}}, + {X: Field{[10]uint32{0x01d743ae, 0x019bb995, 0x024eaaad, 0x02bf3c3b, 0x030f31f9, 0x026f0626, 0x025e564b, 0x01306838, 0x03f389f7, 0x000e7d07}}, Y: Field{[10]uint32{0x026c8622, 0x03948375, 0x018d88e1, 0x02cbb7e7, 0x0126fdae, 0x00ce3dce, 0x030aad09, 0x013fb94f, 0x036de25d, 0x003efa83}}}, + {X: Field{[10]uint32{0x0020ed1f, 0x02c82313, 0x01f28b12, 0x018b2fd6, 0x03c29b1b, 0x0120ef03, 0x00737b3d, 0x0258e665, 0x017441bc, 0x0035e9a5}}, Y: Field{[10]uint32{0x025ba8cb, 0x0358c6c1, 0x024ceef2, 0x027d07e0, 0x0291eea2, 0x02e68f41, 0x007ca251, 0x00563a70, 0x02dacdf8, 0x00339138}}}, + {X: Field{[10]uint32{0x01eaec9a, 0x010e57b0, 0x030ba491, 0x00717f7c, 0x0022f598, 0x00acde21, 0x02867934, 0x032edcaf, 0x01609139, 0x00216eb4}}, Y: Field{[10]uint32{0x0314dfec, 0x01a92173, 0x038db419, 0x031e10e0, 0x02362055, 0x038ff8fa, 0x01c57e88, 0x01dacac9, 0x006129e5, 0x00267f35}}}, + {X: Field{[10]uint32{0x03ea49e5, 0x007ae008, 0x0372d51a, 0x03f90842, 0x0174d986, 0x03c5f682, 0x002ffbe8, 0x0285648f, 0x02c4d428, 0x0008e02e}}, Y: Field{[10]uint32{0x02d6f54b, 0x02ac1d17, 0x0065e5a6, 0x016f4824, 0x033ca101, 0x013512ee, 0x01e38bfc, 0x031fd791, 0x0313fde4, 0x003d2bdc}}}, + {X: Field{[10]uint32{0x024f9cf2, 0x030a7f4d, 0x00e9e46f, 0x03ee253d, 0x0397c1ac, 0x0088480a, 0x019108df, 0x0077438d, 0x0359b7d6, 0x00301584}}, Y: Field{[10]uint32{0x027d83dd, 0x0004c9f4, 0x0092e029, 0x000f3b3d, 0x0275b161, 0x01433acc, 0x03ea5ff3, 0x02a7d8b3, 0x01801c72, 0x000f0ddf}}}, + {X: Field{[10]uint32{0x020c2a06, 0x010e3124, 0x00fc64ed, 0x00102962, 0x0276481c, 0x026ee96c, 0x01181d30, 0x013cabae, 0x01c10b8f, 0x001cb126}}, Y: Field{[10]uint32{0x02b1ce53, 0x000490ec, 0x01e7a72d, 0x03fecc11, 0x02f05ff8, 0x03e0af06, 0x034867b1, 0x014c50a8, 0x008e6082, 0x001b2653}}}, + {X: Field{[10]uint32{0x03cf477d, 0x0081153f, 0x026f884e, 0x0272d77c, 0x0166e02c, 0x001bfad1, 0x038e2f3f, 0x018827e3, 0x00be02b6, 0x00237a13}}, Y: Field{[10]uint32{0x002a34a6, 0x002e64dd, 0x03379641, 0x010a8067, 0x02ac9e85, 0x028edeb0, 0x0348e986, 0x01f621a4, 0x0280c4d0, 0x0031fcbd}}}, + {X: Field{[10]uint32{0x001710f2, 0x00b44b90, 0x034427d0, 0x03b98f17, 0x029a2d02, 0x021ae74b, 0x02c80488, 0x035d8b96, 0x01d86581, 0x0036ffb2}}, Y: Field{[10]uint32{0x00daafea, 0x0221a370, 0x03c90004, 0x02a26284, 0x01b46496, 0x00199236, 0x005acb59, 0x02c6b2a2, 0x03f9827b, 0x001b9847}}}, + {X: Field{[10]uint32{0x01d0453d, 0x015bc8f4, 0x037f9f24, 0x00a8a455, 0x039588dc, 0x00aab9ac, 0x010ade78, 0x03b746cf, 0x01f86099, 0x00277594}}, Y: Field{[10]uint32{0x02715ebd, 0x0282c17b, 0x018455f5, 0x017e6184, 0x03cd3f90, 0x03edb5dc, 0x00be81ad, 0x02183806, 0x0217f0d7, 0x0013db6d}}}, + {X: Field{[10]uint32{0x03d66a15, 0x00982fe6, 0x033d1926, 0x03cbe8bc, 0x02356445, 0x039823e5, 0x037a885e, 0x0378d79d, 0x021ac869, 0x000bf605}}, Y: Field{[10]uint32{0x01307f25, 0x02d3203f, 0x03daa7c6, 0x028825e1, 0x0398c6e7, 0x00b798d1, 0x00163eb1, 0x00b64ad9, 0x01e9674c, 0x00074b08}}}, + {X: Field{[10]uint32{0x029dc391, 0x03a2a128, 0x038a8495, 0x0197e21d, 0x008b6d87, 0x02503b7d, 0x01538ce4, 0x0016c8fc, 0x038924f5, 0x000fc96f}}, Y: Field{[10]uint32{0x008164f2, 0x011ca5cb, 0x03c30afd, 0x01527715, 0x00344382, 0x00b184ee, 0x02b02525, 0x001e0862, 0x01830e7e, 0x001c094d}}}, + {X: Field{[10]uint32{0x00773f0b, 0x0387b89b, 0x02b47ff2, 0x01c2d57a, 0x00467dc7, 0x021163cc, 0x033d2fe2, 0x008d13e3, 0x0359d5f7, 0x000f03c0}}, Y: Field{[10]uint32{0x02db33c7, 0x00a72a07, 0x02c7b127, 0x00c3917c, 0x00b9c250, 0x01189949, 0x0050d787, 0x0067116b, 0x0239459f, 0x0012560e}}}, + {X: Field{[10]uint32{0x02b73a15, 0x0170c20d, 0x00dd73be, 0x01c3ec5c, 0x0087e38d, 0x0283764f, 0x0045855f, 0x0177c8d8, 0x0266ec1b, 0x00158e01}}, Y: Field{[10]uint32{0x019921a7, 0x0387c29d, 0x03b117bc, 0x024e0a47, 0x00b5cbbf, 0x022be3d8, 0x0291252c, 0x02b1aa6a, 0x00f0b210, 0x001c01a4}}}, + {X: Field{[10]uint32{0x009298bd, 0x01b4bea7, 0x006738bc, 0x0007ef8f, 0x0225f902, 0x03cff11f, 0x02b228aa, 0x017dffb1, 0x010b0b9a, 0x001c729c}}, Y: Field{[10]uint32{0x039abc89, 0x027bf8cb, 0x003f8fcc, 0x028d4789, 0x02c759bc, 0x01c0566b, 0x00912871, 0x002266c6, 0x028dc075, 0x001f7494}}}, + {X: Field{[10]uint32{0x01264575, 0x00b42cd7, 0x01102511, 0x02ba09f2, 0x006ed87f, 0x02386f8f, 0x02ec20f9, 0x021439f0, 0x003cc938, 0x001e377b}}, Y: Field{[10]uint32{0x01680321, 0x01b7b6cf, 0x01ddfd48, 0x018fc5e6, 0x0022b9c1, 0x01bc6798, 0x0185048d, 0x01014321, 0x0151766a, 0x000641ca}}}, + {X: Field{[10]uint32{0x034ed70b, 0x01aacf1e, 0x0267f322, 0x0127b40f, 0x02058132, 0x00f6b0a6, 0x02709509, 0x0215fa31, 0x02fd8852, 0x0026abae}}, Y: Field{[10]uint32{0x0305fffb, 0x033b34d1, 0x0271c7b9, 0x033101ae, 0x032457bd, 0x00f134bc, 0x01e13bca, 0x02f54419, 0x02ccb541, 0x00231a8a}}}, + {X: Field{[10]uint32{0x032f79e2, 0x00af96f6, 0x01bcc6d1, 0x01a882ae, 0x01a3096a, 0x02e6fc4e, 0x016c7b28, 0x0203f768, 0x02749411, 0x00161bb2}}, Y: Field{[10]uint32{0x03488d71, 0x039be4e8, 0x02ad5bfd, 0x03795805, 0x020ac4bf, 0x009a887a, 0x005a7f80, 0x002796bf, 0x01123616, 0x0002cec7}}}, + {X: Field{[10]uint32{0x0150ddf8, 0x00e060e3, 0x0397ee36, 0x02c4dab3, 0x03c0e0b6, 0x0330fb98, 0x03ed7d40, 0x0378b21b, 0x003edbe4, 0x000615ef}}, Y: Field{[10]uint32{0x00275363, 0x0293d923, 0x01835119, 0x02df3168, 0x028a7fbd, 0x016119d6, 0x0359c673, 0x022337b1, 0x007be7a5, 0x003a97a0}}}, + {X: Field{[10]uint32{0x00e5b01a, 0x0361599e, 0x037ba863, 0x02589fd7, 0x03642067, 0x032e204e, 0x022a6cdb, 0x00b18800, 0x03440757, 0x002a9331}}, Y: Field{[10]uint32{0x03a2f836, 0x03c267e3, 0x008bff39, 0x0236bdf8, 0x01a4a97b, 0x00e08698, 0x03b7f9bb, 0x00912a68, 0x02c9d259, 0x002ea5a6}}}, + {X: Field{[10]uint32{0x004f36aa, 0x01368d48, 0x02179e79, 0x01af2c9d, 0x030d6f73, 0x010f6173, 0x005fad0a, 0x010d9da2, 0x00095917, 0x0011623b}}, Y: Field{[10]uint32{0x00c7c62e, 0x021bd2c3, 0x01c3702f, 0x024a9532, 0x03a95116, 0x0372eb8e, 0x01c89d10, 0x02071bb8, 0x027ecdc6, 0x003ee0d7}}}, + {X: Field{[10]uint32{0x0080653c, 0x02cc447a, 0x00a4eca3, 0x00881408, 0x0025ce66, 0x00bdec7f, 0x0233f227, 0x017e1a67, 0x01037a3e, 0x00219eb3}}, Y: Field{[10]uint32{0x01764646, 0x01fceb49, 0x03946d8d, 0x013975b3, 0x02639cd9, 0x03d91903, 0x009ba3cf, 0x03e414c9, 0x02c757d3, 0x003a444a}}}, + {X: Field{[10]uint32{0x02df370b, 0x03f576c9, 0x03c13318, 0x013d185b, 0x00b52781, 0x026b8ef5, 0x02e46630, 0x007708a2, 0x0169e4f8, 0x00178290}}, Y: Field{[10]uint32{0x0140d001, 0x03e2b74c, 0x00ca9e58, 0x009232cd, 0x00c38cd6, 0x02eb2b53, 0x022e32c3, 0x024d3afb, 0x01a8fc23, 0x0016f4cd}}}, + {X: Field{[10]uint32{0x0101c0f6, 0x02d3ffec, 0x00263663, 0x028eb7fa, 0x01542a55, 0x00aa0bc5, 0x01b2e578, 0x0090606d, 0x006939df, 0x0024014d}}, Y: Field{[10]uint32{0x03e3d991, 0x007a944d, 0x01476e3f, 0x01e0e86c, 0x01744607, 0x0270e978, 0x00f38378, 0x0217da16, 0x01899739, 0x0013fc35}}}, + {X: Field{[10]uint32{0x03cec63f, 0x030ec358, 0x035618f4, 0x01dc8a9c, 0x004e2db0, 0x0242c540, 0x0232f33d, 0x00cee81a, 0x01a553df, 0x002a650e}}, Y: Field{[10]uint32{0x01656cd4, 0x0108f6ce, 0x00e7e7e6, 0x0317dc0f, 0x026f9c1f, 0x0139a61f, 0x01cd8a2e, 0x031ddfaa, 0x0129f11f, 0x00066382}}}, + {X: Field{[10]uint32{0x03085282, 0x00bf7c57, 0x00355a0e, 0x02c42de3, 0x031c7789, 0x020aa8b9, 0x03ab71df, 0x02e85323, 0x01361381, 0x00147ca8}}, Y: Field{[10]uint32{0x032d16a2, 0x0065f3fa, 0x00ea5a97, 0x009a124d, 0x026e2b7b, 0x00c65e8f, 0x0323bbe4, 0x03fa935b, 0x029fca15, 0x003f57c4}}}, + {X: Field{[10]uint32{0x02a91d3a, 0x014c560b, 0x0368e820, 0x02e3d507, 0x03bed208, 0x019316d3, 0x01097778, 0x012cb265, 0x001c8b06, 0x000ea47e}}, Y: Field{[10]uint32{0x03a513c9, 0x01ce8048, 0x00404085, 0x0252d804, 0x00a542b5, 0x01616a3a, 0x0077329e, 0x00e78654, 0x003ad4ae, 0x00275640}}}, + {X: Field{[10]uint32{0x0336c5c8, 0x01abc665, 0x03462105, 0x02138502, 0x005e491e, 0x01ca3045, 0x0026deee, 0x03e85cfc, 0x0150aa22, 0x001c7a67}}, Y: Field{[10]uint32{0x036a4995, 0x019fb105, 0x03b2653f, 0x038e6ec2, 0x03699806, 0x03651f9d, 0x02627291, 0x022119f1, 0x03776858, 0x003fcf93}}}, + {X: Field{[10]uint32{0x008aaa39, 0x0248005f, 0x0180e6d3, 0x003ba166, 0x0046f745, 0x0338bcf3, 0x0353286a, 0x0113dcfe, 0x02933a03, 0x002b4527}}, Y: Field{[10]uint32{0x009e81bd, 0x03dbeba4, 0x03e3f2a4, 0x00ffc455, 0x0165a5ab, 0x026a0de2, 0x03140603, 0x03cd52d3, 0x039885a4, 0x001f6fd1}}}, + {X: Field{[10]uint32{0x011ccb01, 0x011fe45d, 0x00c321a2, 0x035dfaef, 0x0286e79e, 0x025a4417, 0x000ca207, 0x023db129, 0x037f5ad7, 0x00113c28}}, Y: Field{[10]uint32{0x0353044a, 0x01255570, 0x01905af6, 0x02684a24, 0x0070836d, 0x019ad44a, 0x031e5590, 0x02cfefbe, 0x0067911e, 0x003d0136}}}, + {X: Field{[10]uint32{0x0330ad5d, 0x00e29842, 0x02c1dc0d, 0x038ec9c7, 0x0050f5c0, 0x025c5e1a, 0x00a4a8b2, 0x03823130, 0x00c3de8d, 0x0013ddf7}}, Y: Field{[10]uint32{0x01f57c69, 0x00da8e53, 0x032fa558, 0x000201bb, 0x0358dc73, 0x002a996c, 0x018aa5ab, 0x003ba484, 0x024f8ae8, 0x001cf1d0}}}, + {X: Field{[10]uint32{0x02005555, 0x01c4dc79, 0x01c0d38d, 0x0093978b, 0x016d6d5c, 0x03bd9630, 0x026efd38, 0x00248d8d, 0x008b102a, 0x001e5284}}, Y: Field{[10]uint32{0x0246ba2c, 0x03d9cdf3, 0x03f751a6, 0x012d7f72, 0x007c9e30, 0x007e11e6, 0x02cf0fdc, 0x024141a6, 0x01efefd7, 0x0021c659}}}, + {X: Field{[10]uint32{0x00e8e594, 0x029235c5, 0x003a822d, 0x01f3a8c2, 0x02a72e29, 0x0282c494, 0x01bd49f5, 0x0218eb7d, 0x0161234b, 0x003c6621}}, Y: Field{[10]uint32{0x003fc418, 0x03acd86a, 0x0203fca6, 0x01cf4c6a, 0x03abd2f5, 0x03f68fe3, 0x0036612d, 0x01468630, 0x0107d0ab, 0x001eb6e9}}}, + {X: Field{[10]uint32{0x003f4a80, 0x02862f73, 0x01c75491, 0x036fe0b4, 0x02f3fd27, 0x01e42abb, 0x0249b8f7, 0x026781c4, 0x0156c07c, 0x00122fb5}}, Y: Field{[10]uint32{0x02316e94, 0x00795559, 0x03543856, 0x008b5250, 0x0046cf01, 0x03976f2a, 0x00dd08cb, 0x0106346d, 0x028021be, 0x00276b94}}}, + {X: Field{[10]uint32{0x003ab9c1, 0x032ccfe5, 0x00a1f3bf, 0x02ff0b72, 0x00ec8449, 0x01d2eb1d, 0x0376fef9, 0x01e74e3c, 0x03fbe537, 0x002effbc}}, Y: Field{[10]uint32{0x0312551b, 0x01b1b378, 0x030b0800, 0x018e1200, 0x00ed4625, 0x02f83aa3, 0x010e8495, 0x022bff18, 0x0372ee79, 0x002fa96d}}}, + {X: Field{[10]uint32{0x015b7f06, 0x01d2f582, 0x0212e00b, 0x02bfbaf0, 0x00156839, 0x03305d71, 0x006b04be, 0x033548e0, 0x001527b3, 0x0010abcd}}, Y: Field{[10]uint32{0x01dcef4f, 0x02d1b7d6, 0x021370e7, 0x006096fe, 0x00f91a55, 0x02237a60, 0x036d0961, 0x01bfd88d, 0x03e5ebf1, 0x001a1b97}}}, + {X: Field{[10]uint32{0x01ce10e6, 0x037849dc, 0x00d6938a, 0x00990309, 0x02307497, 0x0162df57, 0x03ea376d, 0x021f11bb, 0x038b74ae, 0x000f15b5}}, Y: Field{[10]uint32{0x00d54a41, 0x00c9d492, 0x03883507, 0x002d446f, 0x0039fed0, 0x0328af1b, 0x023b36b6, 0x0388574d, 0x02ccf9d1, 0x0033a5f7}}}, + {X: Field{[10]uint32{0x0389b61a, 0x03f6c26d, 0x0291d33a, 0x0073693c, 0x0267b52a, 0x0123da73, 0x02404a9e, 0x03bc2ab9, 0x01991944, 0x0012c489}}, Y: Field{[10]uint32{0x02089571, 0x02ef99ad, 0x0211bf3e, 0x0201e391, 0x0062b1bc, 0x01b64af0, 0x037932cb, 0x03e6494d, 0x035027a3, 0x001722f8}}}, + {X: Field{[10]uint32{0x00d49db5, 0x01cd4346, 0x03e9acd3, 0x0154ac02, 0x01716749, 0x01363167, 0x0258f181, 0x024c528d, 0x0067c02c, 0x0002790a}}, Y: Field{[10]uint32{0x03a8c761, 0x025df1c5, 0x01d0d831, 0x0079b635, 0x0039f65b, 0x03f8833c, 0x003155da, 0x0035cf5e, 0x00351ff9, 0x001749b4}}}, + {X: Field{[10]uint32{0x035359ae, 0x036e5cc9, 0x00b94402, 0x007976f6, 0x00306ab3, 0x01efdbea, 0x0027d0d4, 0x014d14a8, 0x010c05a9, 0x002590ce}}, Y: Field{[10]uint32{0x027a3933, 0x025c86ac, 0x000cea69, 0x00b7d657, 0x03abbf49, 0x003ef52e, 0x03560d05, 0x03a70748, 0x03f71019, 0x002cd535}}}, + {X: Field{[10]uint32{0x02126b69, 0x03d5881f, 0x01f77bac, 0x0213faba, 0x021b6f78, 0x007c55e0, 0x01374f90, 0x01f7ad41, 0x02fb86f7, 0x0022d245}}, Y: Field{[10]uint32{0x00be1fd4, 0x032cc98a, 0x00213816, 0x03cd93e7, 0x02ce6d2a, 0x02f21feb, 0x01c3d59c, 0x036c4c15, 0x03c06d86, 0x000026a0}}}, + {X: Field{[10]uint32{0x00054b9f, 0x00f3c334, 0x02ff37ba, 0x03fa554b, 0x0011de8e, 0x021223df, 0x01ee9abb, 0x020b107d, 0x034b1097, 0x00034a77}}, Y: Field{[10]uint32{0x00ca07a8, 0x01826050, 0x03d1c98a, 0x01106627, 0x00d1a5a4, 0x01e6da02, 0x03e08f6a, 0x00b13c2e, 0x0237ea24, 0x0006fc18}}}, + {X: Field{[10]uint32{0x01dbd41d, 0x02e3a9c8, 0x01ede203, 0x019481b7, 0x03d4a202, 0x01444eb2, 0x01167d05, 0x0141114e, 0x017ba540, 0x000aabce}}, Y: Field{[10]uint32{0x02f73081, 0x022087a7, 0x03c6663d, 0x03093dec, 0x00013a81, 0x028cbcc2, 0x024b4a8a, 0x02eeb247, 0x02c71132, 0x000dd38c}}}, + {X: Field{[10]uint32{0x0357ef48, 0x004cfe73, 0x03b817b1, 0x0251762d, 0x001ca58a, 0x02da8e63, 0x03d287c8, 0x0339ae3a, 0x03d223ea, 0x00088e6c}}, Y: Field{[10]uint32{0x02b4cd46, 0x032f50f8, 0x03bda94c, 0x03ecf93a, 0x00f01d70, 0x02380fca, 0x02f4b267, 0x02a2c822, 0x00b74b54, 0x003f6a20}}}, + {X: Field{[10]uint32{0x03c7e365, 0x03b18929, 0x00f62e86, 0x00ce7c95, 0x01b88ee2, 0x007b6c51, 0x01c91785, 0x01cb7dfb, 0x03bcf47e, 0x0022cca1}}, Y: Field{[10]uint32{0x01fecabb, 0x03c3c802, 0x005be321, 0x01a47ad8, 0x00db6d99, 0x0030f4df, 0x0100868c, 0x0355397e, 0x03c09f60, 0x0015281a}}}, + {X: Field{[10]uint32{0x004f7993, 0x026072a6, 0x0136dd8d, 0x031c935b, 0x01ace742, 0x03a1d4e7, 0x017e1ff3, 0x03fba443, 0x02a33e3c, 0x00366b33}}, Y: Field{[10]uint32{0x027dc88b, 0x018e2a10, 0x02690565, 0x02055097, 0x0162947f, 0x0082f40b, 0x00f5a05a, 0x03974b63, 0x034aa901, 0x001ab725}}}, + {X: Field{[10]uint32{0x00b3206d, 0x03cab96a, 0x036b308d, 0x036902e3, 0x004af245, 0x01d3b80e, 0x0292b504, 0x0122f799, 0x03f834c3, 0x0035ff15}}, Y: Field{[10]uint32{0x004e2d19, 0x034acc09, 0x03406e38, 0x02c47e6b, 0x000231ed, 0x01b6c0c9, 0x028e04ba, 0x027faa6c, 0x024b41fd, 0x0002c94f}}}, + {X: Field{[10]uint32{0x00d9588a, 0x016d70c5, 0x015059ad, 0x0181e88f, 0x02b815f6, 0x02540878, 0x0334e165, 0x005024da, 0x03e0ec4a, 0x00096023}}, Y: Field{[10]uint32{0x018e7b96, 0x01e63df1, 0x00ec66f4, 0x01b3a2ef, 0x03a75bc1, 0x02e77c7f, 0x00a1eefb, 0x01bbe232, 0x02d5b1d4, 0x00341992}}}, + {X: Field{[10]uint32{0x01927914, 0x01ba84e6, 0x01ecc322, 0x01d8a68e, 0x0359e67a, 0x00368d69, 0x0152fa57, 0x015759c8, 0x03801139, 0x003911d1}}, Y: Field{[10]uint32{0x03793bee, 0x037cfe50, 0x035eac1a, 0x034a0dfb, 0x02ad4eb3, 0x0159b1e3, 0x02834d33, 0x00121b69, 0x0170aa2f, 0x00124f30}}}, + {X: Field{[10]uint32{0x026311ad, 0x000ae444, 0x02f11476, 0x02160b51, 0x0244e2b9, 0x0003c411, 0x01dd900d, 0x035c19db, 0x01be2af9, 0x00314103}}, Y: Field{[10]uint32{0x024ddb15, 0x0234a00c, 0x0186b91a, 0x006c41dd, 0x01a7cabc, 0x01e2a739, 0x01b64667, 0x0185c732, 0x0311a231, 0x002102aa}}}, + {X: Field{[10]uint32{0x037d9f14, 0x008a3ad0, 0x023a812a, 0x013e4ef6, 0x008116cd, 0x0311f539, 0x03ca1236, 0x00cface9, 0x03aa316d, 0x0008ce46}}, Y: Field{[10]uint32{0x037efd4d, 0x02d53d72, 0x00b7f1eb, 0x01e71f2e, 0x010bc97c, 0x01b63446, 0x00a69aff, 0x01dbf007, 0x001d9e6d, 0x0007604d}}}, + {X: Field{[10]uint32{0x0039ac38, 0x02acd3ef, 0x01eb945e, 0x036302e5, 0x008aeb8f, 0x03ace525, 0x006682cb, 0x02e9c8bf, 0x03563de3, 0x0004c845}}, Y: Field{[10]uint32{0x0174f006, 0x02e6b623, 0x013df89e, 0x001506dd, 0x01aa5279, 0x009b2fee, 0x0161431e, 0x00208df2, 0x03218a4b, 0x0026ddc9}}}, + {X: Field{[10]uint32{0x02789708, 0x01dea56e, 0x0096d2ff, 0x00eebfba, 0x01708b94, 0x02d735f8, 0x00f896bb, 0x00bf1e87, 0x0098b27a, 0x000ee2ee}}, Y: Field{[10]uint32{0x0136c1cb, 0x00403227, 0x028c9248, 0x01e70d01, 0x027fdcbf, 0x02858d77, 0x01e13e96, 0x000f9568, 0x001c6680, 0x00360795}}}, + {X: Field{[10]uint32{0x00217b4d, 0x03a267f8, 0x02e21c7c, 0x00b20568, 0x03d94f16, 0x0300103f, 0x005e4f55, 0x0312eb14, 0x022c9af5, 0x003875c2}}, Y: Field{[10]uint32{0x03a4532e, 0x00f3fb25, 0x0212c2fd, 0x02679e70, 0x01eb063b, 0x00ac794f, 0x006d66de, 0x00392cda, 0x00d6d20e, 0x002c958c}}}, + {X: Field{[10]uint32{0x0112de1c, 0x02aa9ef6, 0x001b5ff1, 0x0320c3ed, 0x03a7e681, 0x00acdb7f, 0x00f0c56e, 0x01e3eb4e, 0x0023a517, 0x0006c78e}}, Y: Field{[10]uint32{0x0184d4c1, 0x00ffcc89, 0x0116cd59, 0x009a0ca0, 0x03bebe16, 0x02fdff49, 0x03258556, 0x00807739, 0x0290a951, 0x003cba66}}}, + {X: Field{[10]uint32{0x01bda7a1, 0x03dca088, 0x03102e48, 0x00703640, 0x018745a9, 0x017919f8, 0x01348175, 0x018644b0, 0x003894f5, 0x00078c76}}, Y: Field{[10]uint32{0x00d610ce, 0x0232531f, 0x03aee504, 0x009d0480, 0x02477a7b, 0x03e0225b, 0x002c6d97, 0x03863cf0, 0x038835da, 0x0004773b}}}, + {X: Field{[10]uint32{0x02b7100e, 0x02c0c062, 0x0028c422, 0x01e946d4, 0x03311f68, 0x02f0ed25, 0x027a7ff2, 0x02f266fd, 0x0034795c, 0x00032e6b}}, Y: Field{[10]uint32{0x00d0db1d, 0x01120d8f, 0x0332074e, 0x03762913, 0x03e5ff32, 0x023704fd, 0x01e95e9a, 0x02cd7380, 0x0221c804, 0x001797c1}}}, + {X: Field{[10]uint32{0x00e11c1b, 0x01ce0d6d, 0x020ce56c, 0x0213c028, 0x0024dcb8, 0x02995b12, 0x02326fa1, 0x02b4e283, 0x02c4067d, 0x002bf0d2}}, Y: Field{[10]uint32{0x00bdcb96, 0x00204d8a, 0x01de1d75, 0x02baff1b, 0x0377a033, 0x000b0432, 0x02ef031a, 0x0191e8e0, 0x00043f6d, 0x00322c71}}}, + {X: Field{[10]uint32{0x0270aa81, 0x03e17ef8, 0x0273e603, 0x00d9e9e0, 0x023330f6, 0x02e85384, 0x01430bc0, 0x02ae8586, 0x0160ca85, 0x000e9bf0}}, Y: Field{[10]uint32{0x0222bc0a, 0x01d36e80, 0x001bb617, 0x03246709, 0x02cb72cf, 0x01c1ef0c, 0x01a7a483, 0x02ce4251, 0x037286db, 0x0016528a}}}, + {X: Field{[10]uint32{0x033ce7d4, 0x00658050, 0x02e4346b, 0x02a38fab, 0x01bdc1e4, 0x03c637af, 0x024f56ea, 0x0270e8fd, 0x0295657c, 0x002a103d}}, Y: Field{[10]uint32{0x02126fbc, 0x007d27fa, 0x0269d7a4, 0x0091c9cc, 0x031a77b8, 0x030004c6, 0x01eae96b, 0x038b7d18, 0x02c0ca41, 0x0022a29e}}}, + {X: Field{[10]uint32{0x000a39d6, 0x027602ba, 0x033e55f6, 0x018b5b83, 0x0065cd77, 0x028a4c9a, 0x01d08c34, 0x01a4530e, 0x020170ec, 0x00030113}}, Y: Field{[10]uint32{0x020b4657, 0x02fe488e, 0x0052a92d, 0x01ee4816, 0x036dd5fd, 0x00be5ecd, 0x02e0b5ec, 0x00545897, 0x00827ae5, 0x001ef58c}}}, + {X: Field{[10]uint32{0x02a00b3a, 0x0377a53a, 0x00b2aa89, 0x00690769, 0x002bf927, 0x033f74a2, 0x01eb5c67, 0x025a6c11, 0x035b352b, 0x0032e404}}, Y: Field{[10]uint32{0x0179be93, 0x012d858b, 0x00b492a8, 0x00b1498d, 0x03b4dac8, 0x009dea3d, 0x00b6d267, 0x026c47f9, 0x00a0762d, 0x000532fb}}}, + {X: Field{[10]uint32{0x03182a0e, 0x03213402, 0x02963c58, 0x01d9d7a9, 0x03c82166, 0x02a92a3f, 0x007c0633, 0x02ac3c87, 0x0037a24d, 0x003e9ef1}}, Y: Field{[10]uint32{0x01a5aa35, 0x03bb9534, 0x0244b383, 0x0051007c, 0x00fdf721, 0x0124d678, 0x0109326c, 0x0031adb7, 0x03c6d730, 0x00389099}}}, + {X: Field{[10]uint32{0x03b3299a, 0x00701795, 0x02fcdd0c, 0x015cef22, 0x0035e956, 0x0054ceb6, 0x032bef99, 0x00f494de, 0x00dd3f50, 0x00398d53}}, Y: Field{[10]uint32{0x019ead7f, 0x0342e1a1, 0x01a0a3c4, 0x03cfd72b, 0x03cdc2b6, 0x03a7be71, 0x01955b9a, 0x03228662, 0x03706291, 0x0035b05e}}}, + {X: Field{[10]uint32{0x0345cce8, 0x00ebc7ee, 0x0053b048, 0x00f4afc1, 0x02132ec2, 0x0035f604, 0x00dce9d5, 0x00578f7c, 0x013007e8, 0x002768d9}}, Y: Field{[10]uint32{0x0067a8dc, 0x02639474, 0x0109ebd2, 0x008c8bd3, 0x013bbc4b, 0x02426ba4, 0x02a1b102, 0x022b3aa1, 0x016698a2, 0x002ecdd1}}}, + {X: Field{[10]uint32{0x00c9d4db, 0x0066e28e, 0x011ba763, 0x02208b5a, 0x0213b257, 0x0105aa21, 0x02d1c3ba, 0x03371c1b, 0x021e1a19, 0x0037115e}}, Y: Field{[10]uint32{0x03dc3b58, 0x03a04fee, 0x01776dfc, 0x0363e0a1, 0x0385e25b, 0x02518e29, 0x01919fa2, 0x01943752, 0x0366de5a, 0x000e7e4f}}}, + {X: Field{[10]uint32{0x00f0374d, 0x02760ab3, 0x009a962b, 0x01badece, 0x03ec216c, 0x0132915b, 0x0357bc66, 0x003a617f, 0x031f1b1a, 0x002c8dde}}, Y: Field{[10]uint32{0x03578c1a, 0x00666b1d, 0x02db5dac, 0x030188ca, 0x027a040f, 0x00fae5d1, 0x0114e74b, 0x014272fc, 0x0180d723, 0x000e0e95}}}, + {X: Field{[10]uint32{0x00fc7e50, 0x0144492b, 0x01f65780, 0x03381797, 0x002a5a86, 0x02570936, 0x011fabeb, 0x00ea14e1, 0x0046755d, 0x0022c699}}, Y: Field{[10]uint32{0x0255cf75, 0x03ccd1a5, 0x036231ca, 0x01850e32, 0x01ed1cd4, 0x024a96ff, 0x0288aef1, 0x00a99d46, 0x01d4cb63, 0x0010ae21}}}, + {X: Field{[10]uint32{0x0103f5b1, 0x029bfc94, 0x01b3e7d5, 0x0288c285, 0x03c3a7ef, 0x00ea41e9, 0x01f14162, 0x00683279, 0x019cbacf, 0x00250220}}, Y: Field{[10]uint32{0x00506f98, 0x031a32c3, 0x0056b0d6, 0x00c32ec9, 0x021df08c, 0x002ade68, 0x0107451f, 0x013dcff4, 0x02c9d6f8, 0x002a5d63}}}, + {X: Field{[10]uint32{0x006ce25c, 0x00661c2c, 0x013ee9c3, 0x01cf090f, 0x029ce6d4, 0x02213693, 0x017c933a, 0x03e32e67, 0x004707b3, 0x0022ffbc}}, Y: Field{[10]uint32{0x03e5c498, 0x00f04b3d, 0x03e37ca7, 0x0213a281, 0x00627f1d, 0x00c05f16, 0x00d17ee8, 0x02bc5d54, 0x01870d06, 0x0022ef2f}}}, + {X: Field{[10]uint32{0x014bdb61, 0x034a52d0, 0x03cc0dc1, 0x01ff0e00, 0x018eff64, 0x037d60be, 0x00b84b8a, 0x000b8477, 0x03f0c122, 0x0000aa15}}, Y: Field{[10]uint32{0x02db6548, 0x003bfb11, 0x029afe43, 0x0076bdfe, 0x0262c8ae, 0x023a88ea, 0x00af8c64, 0x024c6091, 0x016da7fd, 0x0026eb11}}}, + {X: Field{[10]uint32{0x015cb5ec, 0x00eb2d97, 0x0083525e, 0x039a924f, 0x03b94b1e, 0x03fd4f9a, 0x006b2242, 0x017b4c34, 0x005a9048, 0x0024dee3}}, Y: Field{[10]uint32{0x03ccd808, 0x02c9d9a9, 0x02788da3, 0x019fa6df, 0x02c9c3d8, 0x038d9b29, 0x035a311a, 0x00dd2943, 0x036ff9fb, 0x0034dec4}}}, + {X: Field{[10]uint32{0x0243c77a, 0x0038280e, 0x001a065a, 0x00cd2248, 0x0122b249, 0x01a87971, 0x0150ff30, 0x035afb64, 0x0153e2bf, 0x0017d513}}, Y: Field{[10]uint32{0x02990f51, 0x00df82c4, 0x01562c31, 0x01f88059, 0x028f4c84, 0x01c33b4c, 0x012c4130, 0x0336605d, 0x00e28c47, 0x002ea708}}}, + {X: Field{[10]uint32{0x03c807b9, 0x025f9ea9, 0x01cbd9c2, 0x03ea0695, 0x01e3249c, 0x02e7e932, 0x0364fa7e, 0x022ebe96, 0x038890bf, 0x0019ed8c}}, Y: Field{[10]uint32{0x027625e6, 0x01876fab, 0x02567620, 0x0305b22e, 0x010d871e, 0x037e0229, 0x0354577e, 0x02e0450a, 0x02752d94, 0x00370615}}}, + {X: Field{[10]uint32{0x00439442, 0x00918a26, 0x02e2fbd3, 0x0360e1a8, 0x02b76604, 0x018ca00c, 0x012ffa3d, 0x01123e7e, 0x01d599cb, 0x00161ea7}}, Y: Field{[10]uint32{0x03ae9870, 0x035b7376, 0x03dee6b6, 0x021d47fe, 0x03488aa6, 0x036efd4c, 0x01e73ca2, 0x03ea9e92, 0x00e9a893, 0x00125a66}}}, + {X: Field{[10]uint32{0x03c29b38, 0x000a5298, 0x02a568f8, 0x00696190, 0x0218dfe5, 0x01746184, 0x00773123, 0x03fe7e04, 0x031ec576, 0x000dbede}}, Y: Field{[10]uint32{0x0166c4aa, 0x00055c85, 0x038e8a2f, 0x022586eb, 0x035c1a15, 0x01f7a298, 0x016fc1a6, 0x02c6fcb2, 0x02c9b82c, 0x000d2916}}}, + {X: Field{[10]uint32{0x01f4ba95, 0x0158931c, 0x03caef77, 0x00f5393b, 0x00ab8a27, 0x0027fd0d, 0x00f49c51, 0x03b34b76, 0x008ca0af, 0x0021edc7}}, Y: Field{[10]uint32{0x025676f9, 0x00e0b314, 0x010b81bc, 0x0286f5ab, 0x005b3626, 0x0079b672, 0x0127c56e, 0x009621d9, 0x011f5112, 0x00214645}}}, + {X: Field{[10]uint32{0x0063e040, 0x00e839e9, 0x0296cf43, 0x0262e069, 0x0000056c, 0x00ee8ec3, 0x03ed962c, 0x00dc2e8e, 0x00f2805c, 0x002b3d97}}, Y: Field{[10]uint32{0x01692d5b, 0x00ed0085, 0x023d663b, 0x008f35a3, 0x02dc7b0e, 0x00bd5fbc, 0x022762b5, 0x0385abe5, 0x029bf45b, 0x003c24e4}}}, + {X: Field{[10]uint32{0x0147acf1, 0x0011d7c8, 0x03f44899, 0x02ea04a5, 0x01e3e045, 0x00737ec7, 0x01f16740, 0x003216e4, 0x03ed8b01, 0x003824af}}, Y: Field{[10]uint32{0x03902c37, 0x01c2a61d, 0x0291b657, 0x02be2f76, 0x018c4d18, 0x0181c36a, 0x00160728, 0x01a0f790, 0x0042ecc8, 0x00382ee6}}}, + {X: Field{[10]uint32{0x010a52ae, 0x021c7298, 0x0269197c, 0x01fca3b3, 0x03ba386b, 0x01c14076, 0x0012735c, 0x02f2fc5e, 0x03b98260, 0x0026f7f5}}, Y: Field{[10]uint32{0x02371eeb, 0x033f7ad7, 0x00d9affb, 0x01e10188, 0x00887d9a, 0x017d427d, 0x01e01baa, 0x013339cc, 0x03983f8c, 0x0026f194}}}, + {X: Field{[10]uint32{0x0243545f, 0x028be0a1, 0x0240e9a4, 0x00361a90, 0x00afc8a8, 0x00255087, 0x005587a9, 0x00562572, 0x0321d931, 0x000f6c88}}, Y: Field{[10]uint32{0x03b78eae, 0x03dcd263, 0x028bfddb, 0x01153bf1, 0x02fdd6bb, 0x02c6651f, 0x0323c9af, 0x021a3783, 0x00b82c57, 0x0010abcc}}}, + {X: Field{[10]uint32{0x022b3e5f, 0x009e5858, 0x03da6256, 0x01908b4d, 0x03c3757a, 0x01790fe8, 0x02decbdc, 0x01fff3e1, 0x0314a6a7, 0x0003a74f}}, Y: Field{[10]uint32{0x00e67de7, 0x003e060c, 0x027f02f9, 0x0210db59, 0x03fd18ee, 0x02a4b305, 0x02d0764d, 0x01c5331b, 0x03ed1e2a, 0x0020eb02}}}, + {X: Field{[10]uint32{0x0042f2a4, 0x007547a6, 0x0180f089, 0x02161a09, 0x01b31b90, 0x02b56566, 0x01448af0, 0x01221c38, 0x02e4f29b, 0x00104921}}, Y: Field{[10]uint32{0x01e7ee3d, 0x034e5fc3, 0x01a8f080, 0x01ed4c58, 0x000bc557, 0x030b9d87, 0x03bbb039, 0x019e430b, 0x01318c0d, 0x0030c716}}}, + {X: Field{[10]uint32{0x02b4ddaa, 0x00a7648d, 0x01a267c5, 0x008a92cb, 0x01609f84, 0x026add7e, 0x01afbe0c, 0x0141bf8b, 0x007141ed, 0x003a77bb}}, Y: Field{[10]uint32{0x0194a21d, 0x0251e3db, 0x039eb220, 0x01fe6b6d, 0x008dfb76, 0x034a8290, 0x006029e5, 0x00ef0b61, 0x0144d846, 0x00021ca1}}}, + {X: Field{[10]uint32{0x0264218a, 0x03f5bfec, 0x031735f0, 0x00b16f2d, 0x01bbf01c, 0x02e24978, 0x03a17612, 0x011a8208, 0x0292553c, 0x00168288}}, Y: Field{[10]uint32{0x015dbae2, 0x03455d79, 0x0009ce90, 0x025a3c14, 0x00012de6, 0x0111ffe7, 0x021f8976, 0x003c4289, 0x01f0adda, 0x000c25f3}}}, + {X: Field{[10]uint32{0x00928d1f, 0x03784681, 0x03d005ba, 0x03e7383f, 0x02563a40, 0x0344bc61, 0x01dc23d8, 0x006b46e8, 0x02378b68, 0x001272ca}}, Y: Field{[10]uint32{0x016732d6, 0x001a564f, 0x03bd632a, 0x02db89da, 0x00fbecc5, 0x0360128f, 0x015a938a, 0x017e83fc, 0x02afc0f6, 0x003c8d78}}}, + {X: Field{[10]uint32{0x0215feb3, 0x02af6e45, 0x037ccf99, 0x03521345, 0x003dd1af, 0x01887351, 0x01ad510a, 0x0045dec1, 0x00b63688, 0x003535c7}}, Y: Field{[10]uint32{0x0162645b, 0x03c4bc1d, 0x02c02ac7, 0x018fec1d, 0x035316c3, 0x0254354c, 0x02f385fa, 0x02e6c581, 0x0378de3e, 0x000eb594}}}, + {X: Field{[10]uint32{0x01bfab2f, 0x00f9908d, 0x01148b7e, 0x02e0fd1f, 0x01529c99, 0x013a1b31, 0x03798c31, 0x01b80193, 0x02e14bdd, 0x0001646c}}, Y: Field{[10]uint32{0x00fa59b0, 0x01a95a2a, 0x03aeca98, 0x022575e0, 0x0112a517, 0x028da356, 0x02bbaf12, 0x01319935, 0x0266fd2a, 0x0013da18}}}, + {X: Field{[10]uint32{0x03356876, 0x02f88d91, 0x00086970, 0x0003d262, 0x02be2534, 0x00bab277, 0x03b63c29, 0x02f124f5, 0x0085c984, 0x003b940f}}, Y: Field{[10]uint32{0x03daa47e, 0x0315cf12, 0x01ccb976, 0x02ce9faf, 0x0139449b, 0x005359c4, 0x01704e96, 0x022731d0, 0x02bb6f9e, 0x002f60a2}}}, + {X: Field{[10]uint32{0x00b3f89e, 0x03256cc5, 0x01697758, 0x0325dff5, 0x03756e78, 0x0261f0eb, 0x036a3f98, 0x0287f328, 0x03a702e5, 0x000be6d3}}, Y: Field{[10]uint32{0x00a4a15d, 0x03a85407, 0x03cf33f0, 0x03c86997, 0x03956657, 0x02427670, 0x022e1cee, 0x00f1d13a, 0x015b3d5b, 0x00259a18}}}, + {X: Field{[10]uint32{0x02fd46c3, 0x02c7249e, 0x03a6234e, 0x02f01b84, 0x02a1f4ae, 0x00a8042a, 0x012b204e, 0x0093e17e, 0x006aa341, 0x00062db4}}, Y: Field{[10]uint32{0x034bef4e, 0x00120747, 0x0264fb46, 0x029550dc, 0x03258b0b, 0x00f81e7c, 0x02624bfa, 0x0002c01f, 0x01b9bdf6, 0x0019b30c}}}, + {X: Field{[10]uint32{0x01b44ba0, 0x00c0d037, 0x016881cc, 0x013594e5, 0x0367662a, 0x00c36dba, 0x0337d0f0, 0x023763ff, 0x0163bf75, 0x000ef01e}}, Y: Field{[10]uint32{0x01057e5d, 0x01dc306b, 0x008a357d, 0x03b2dd15, 0x008e6dc1, 0x01db6dbe, 0x039a3c22, 0x026870b7, 0x02f26820, 0x00183847}}}, + {X: Field{[10]uint32{0x013a46a8, 0x026ca201, 0x01e3dd08, 0x016bc3ba, 0x0291498b, 0x0327e9a2, 0x0149af30, 0x01508ebf, 0x01d65b32, 0x0002fd61}}, Y: Field{[10]uint32{0x038e66a6, 0x033dab78, 0x00c0594b, 0x0304d147, 0x0204c000, 0x02a794e5, 0x0256e2cf, 0x012e6944, 0x00e9ea48, 0x000be251}}}, + {X: Field{[10]uint32{0x03b69294, 0x02704cf3, 0x01a7f64e, 0x00e35fc1, 0x00f0cf14, 0x007d03be, 0x01b59a91, 0x00095d75, 0x022ebe7a, 0x00221f02}}, Y: Field{[10]uint32{0x00aec5c9, 0x01c79c58, 0x02a58402, 0x0037483d, 0x019c37c3, 0x0105d524, 0x03de5949, 0x0319bd43, 0x00c84f9b, 0x00117ccd}}}, + {X: Field{[10]uint32{0x022f7d4f, 0x03e68d98, 0x0211601b, 0x027e0128, 0x003718e7, 0x030f71af, 0x0217700f, 0x00c97166, 0x02f90a73, 0x00276b5e}}, Y: Field{[10]uint32{0x02159525, 0x00a616b9, 0x03136644, 0x02b40624, 0x0140644b, 0x0227ae37, 0x02326ecb, 0x01aa531f, 0x025e099c, 0x000adf08}}}, + {X: Field{[10]uint32{0x03dd551b, 0x02116529, 0x006947cb, 0x007272be, 0x0363bcb6, 0x01cf37f3, 0x03e9a2ed, 0x00a7dd3c, 0x039572bd, 0x00211f93}}, Y: Field{[10]uint32{0x0393ee16, 0x0226856c, 0x004b81ea, 0x020a8407, 0x000f6f11, 0x01c32cd1, 0x006286d3, 0x00b18bea, 0x0282e0a9, 0x002e9bb4}}}, + {X: Field{[10]uint32{0x0047a593, 0x012bd1fc, 0x01580268, 0x00b3374f, 0x00b5d8c6, 0x02495b1c, 0x033c4b44, 0x00d80119, 0x0205df1c, 0x0009484c}}, Y: Field{[10]uint32{0x03096837, 0x018f59fb, 0x01f3c547, 0x03b10a9e, 0x0395aabf, 0x02881591, 0x022a47a8, 0x011c27eb, 0x01de05af, 0x000db720}}}, + {X: Field{[10]uint32{0x0058e87a, 0x0032f384, 0x0229ab17, 0x01c175cc, 0x0095ebfd, 0x00beca7f, 0x013a25ef, 0x037de91c, 0x00d84866, 0x001d48a3}}, Y: Field{[10]uint32{0x0012fe6d, 0x02ecc2f0, 0x03812a7d, 0x01564a6e, 0x0168a473, 0x00215105, 0x025f056c, 0x034fd3f4, 0x039bcc02, 0x003ee921}}}, + {X: Field{[10]uint32{0x01b68568, 0x036b6ed6, 0x03fe4b6a, 0x00dd0b18, 0x00981a13, 0x00109224, 0x002fb07c, 0x01f021b4, 0x01392286, 0x001d2515}}, Y: Field{[10]uint32{0x011af3e2, 0x03aed507, 0x01180341, 0x00111919, 0x013e3b8d, 0x0091f9d4, 0x030bf0b5, 0x02c6722b, 0x01178df8, 0x001f5dd2}}}, + {X: Field{[10]uint32{0x03c9b04f, 0x0383f2ff, 0x03f7a609, 0x038d5fd1, 0x0271d28c, 0x00a651bc, 0x00cbadfc, 0x038e73e8, 0x03532899, 0x001a76df}}, Y: Field{[10]uint32{0x019feabc, 0x0252d8c6, 0x011f0a66, 0x0375d928, 0x0326da7c, 0x007543e7, 0x0023ffee, 0x01576ab5, 0x03bb1032, 0x0032c090}}}, + {X: Field{[10]uint32{0x0129f8c7, 0x01cf0a4a, 0x022251d1, 0x03d54f6b, 0x02ec4aed, 0x0240be48, 0x012fc378, 0x0036f83f, 0x01c1fb4a, 0x001c9fb3}}, Y: Field{[10]uint32{0x011f453b, 0x03525799, 0x0035c224, 0x030592f0, 0x02bfc4f7, 0x015d536c, 0x0046ee5e, 0x02358199, 0x02ed1377, 0x002b96ec}}}, + {X: Field{[10]uint32{0x02f25b72, 0x0278cd1f, 0x00382b12, 0x01cd7baf, 0x01912138, 0x00b1fcaf, 0x007f5c9e, 0x01512f88, 0x018f0ec2, 0x00240f3b}}, Y: Field{[10]uint32{0x003190a6, 0x01073565, 0x00c8bb2e, 0x0255af90, 0x03ff75c7, 0x03ea2df6, 0x009bf33a, 0x00f4c57a, 0x02290ee1, 0x000845f2}}}, + {X: Field{[10]uint32{0x0203f33b, 0x02eee646, 0x02ca33a6, 0x03c200cd, 0x031c8906, 0x03f4d8dc, 0x038a5ad6, 0x03845cd8, 0x03ef5149, 0x00313519}}, Y: Field{[10]uint32{0x0229b5c7, 0x026058c1, 0x01b63bf3, 0x0033fe5d, 0x00431ad8, 0x02fcbf3b, 0x03d437ea, 0x01af3f38, 0x03244c53, 0x003a96d6}}}, + {X: Field{[10]uint32{0x0237326f, 0x0178df3a, 0x03cf9d32, 0x029b0daf, 0x01cff7a8, 0x036028bc, 0x03b2b7ad, 0x0027dec8, 0x03a65f6d, 0x0005ad5d}}, Y: Field{[10]uint32{0x009f15c1, 0x01ce4d34, 0x02dcbe90, 0x03876c68, 0x0184d98b, 0x0294a9e4, 0x00a65760, 0x0139788a, 0x00e21467, 0x00019aea}}}, + {X: Field{[10]uint32{0x0363412f, 0x0214c766, 0x01f5a676, 0x036f4afc, 0x0367fcee, 0x02f5f77d, 0x02453846, 0x02b7f387, 0x02f2e480, 0x002b52f2}}, Y: Field{[10]uint32{0x01e741ac, 0x0068e03a, 0x03f4a0a6, 0x02dd59cd, 0x00c4c891, 0x0097b9cb, 0x031b3a45, 0x003d6446, 0x03604781, 0x00147e80}}}, + {X: Field{[10]uint32{0x033b571a, 0x01ccd8b0, 0x01dd587d, 0x037b767a, 0x0151ca65, 0x006f2ce6, 0x012d776d, 0x039e1d29, 0x033852d2, 0x002c927a}}, Y: Field{[10]uint32{0x03a66258, 0x000c8c94, 0x031d9b11, 0x001a9e70, 0x0062dd77, 0x005dc25b, 0x03cd84eb, 0x03b3a020, 0x002414e4, 0x000f8982}}}, + {X: Field{[10]uint32{0x01e14a65, 0x0347b12f, 0x029dbccf, 0x0181f8ef, 0x0374dd05, 0x0274b14e, 0x0310d3a5, 0x0006ba04, 0x02c7696a, 0x0018d064}}, Y: Field{[10]uint32{0x03b0e00f, 0x03948895, 0x0154adcb, 0x03912e4a, 0x004fd4cc, 0x031e1ec6, 0x02dcd709, 0x0381df61, 0x0050e366, 0x001156d2}}}, + {X: Field{[10]uint32{0x022f5099, 0x02577312, 0x02ce6fd2, 0x03b7eec6, 0x02acc3c5, 0x0052c662, 0x02159ccc, 0x00fe0127, 0x03f50d43, 0x003fefb2}}, Y: Field{[10]uint32{0x000be3c0, 0x00779491, 0x0285caaa, 0x01a22921, 0x03dd68d3, 0x0300ee8c, 0x0089acf9, 0x01b3d0d9, 0x02ba1ec6, 0x00108b9e}}}, + {X: Field{[10]uint32{0x001868af, 0x00cf7457, 0x035ad8c1, 0x00ed4269, 0x02b6a8c8, 0x03418cb6, 0x034f1a90, 0x03a08e73, 0x00dc1067, 0x00196d31}}, Y: Field{[10]uint32{0x014d260e, 0x02b0797e, 0x026d840d, 0x005e7548, 0x0320c678, 0x01fd0a80, 0x003f8ae0, 0x01186146, 0x019dd765, 0x003df3d7}}}, + {X: Field{[10]uint32{0x03f9c67e, 0x00695826, 0x0355924c, 0x02ecd756, 0x008de48d, 0x0016e343, 0x018dbed4, 0x00d40b54, 0x00ce9d60, 0x0034e03b}}, Y: Field{[10]uint32{0x0364c128, 0x00d7e3f6, 0x013ae50c, 0x0136a02c, 0x038b241b, 0x01971827, 0x030ac152, 0x02ac427a, 0x0080fd18, 0x0006ba11}}}, + {X: Field{[10]uint32{0x0244511c, 0x0213fd33, 0x002df634, 0x03dc6741, 0x003fce43, 0x01774694, 0x00a1d961, 0x006efb5e, 0x0128b5ce, 0x0005c627}}, Y: Field{[10]uint32{0x0382350d, 0x01a91ce9, 0x03bb5759, 0x026236cb, 0x0185c532, 0x029584a2, 0x021b948b, 0x00f8e504, 0x00f47c7b, 0x003ef28a}}}, + {X: Field{[10]uint32{0x00c2e84d, 0x0160e0a0, 0x01ee73f5, 0x0393ebf3, 0x010be685, 0x02496fcf, 0x01ae4e61, 0x02c1f6a1, 0x02c2e2a8, 0x003ef8cc}}, Y: Field{[10]uint32{0x024e29ca, 0x0295e5fa, 0x00eb30e1, 0x0381ad65, 0x02b11c43, 0x026d0b2f, 0x038c6d77, 0x01f6838f, 0x03425e18, 0x002aa45c}}}, + {X: Field{[10]uint32{0x00bc834f, 0x01e58ee8, 0x0321002d, 0x03d736ab, 0x012100d1, 0x00ba7348, 0x00bd5182, 0x01c97e2d, 0x02878b5e, 0x0022e7a2}}, Y: Field{[10]uint32{0x003ed659, 0x01de8233, 0x00563bed, 0x0371154b, 0x02b2e873, 0x002d95c0, 0x031d6ad8, 0x015af57f, 0x031cc28f, 0x000cc7ec}}}, + {X: Field{[10]uint32{0x01e111ca, 0x003323a3, 0x02a3bd73, 0x022ad9a2, 0x0234e1a6, 0x032986b0, 0x02798ace, 0x02f2b45e, 0x0011a3c0, 0x0025fa49}}, Y: Field{[10]uint32{0x0147f48f, 0x0312fc5a, 0x007eb7cd, 0x01d82ebf, 0x01047949, 0x00f08690, 0x035fb759, 0x01785cb9, 0x00a4bac1, 0x002c3c5c}}}, + {X: Field{[10]uint32{0x0044eea8, 0x008ec974, 0x016919cd, 0x007f5354, 0x0349aa3c, 0x0309e55d, 0x00c76f82, 0x00f1bb32, 0x001333a1, 0x00080d62}}, Y: Field{[10]uint32{0x000c7f29, 0x00f2245e, 0x025c0ee7, 0x03c41366, 0x00259fc4, 0x037c3cd1, 0x022f9517, 0x02bc2bb3, 0x02a48c86, 0x001202be}}}, + {X: Field{[10]uint32{0x027dbcff, 0x016fade9, 0x00343a66, 0x03988adf, 0x02617579, 0x02126fbf, 0x01551039, 0x01d02a40, 0x00cb1575, 0x0032a87b}}, Y: Field{[10]uint32{0x00e0a20b, 0x0354b829, 0x02577e0b, 0x004e707a, 0x011aee51, 0x02fc10b6, 0x03d34511, 0x01cbfedb, 0x03f9f1c9, 0x002a9a56}}}, + {X: Field{[10]uint32{0x02620719, 0x028eb6f0, 0x02bbd138, 0x0279ba3c, 0x03f33104, 0x03f5ae20, 0x02a212a7, 0x01ea3bf6, 0x03a2036f, 0x00239f0a}}, Y: Field{[10]uint32{0x02ec105c, 0x01863e0b, 0x02d0220a, 0x00c47fb3, 0x00d9b6e0, 0x01de7e30, 0x006c4e2e, 0x03ecfd61, 0x002f1434, 0x002f40dc}}}, + {X: Field{[10]uint32{0x02ace975, 0x018df1ee, 0x033b24dd, 0x0046393a, 0x0388fbad, 0x00301de0, 0x03ebf094, 0x001307f3, 0x00336dcd, 0x00381f70}}, Y: Field{[10]uint32{0x032a2c2c, 0x01985aac, 0x0019510d, 0x01a14011, 0x02ef6f92, 0x02f54c55, 0x02ccf311, 0x03b2c1d8, 0x00a00e5e, 0x002c4ef4}}}, + {X: Field{[10]uint32{0x038ce0cb, 0x03e8b7ee, 0x0307297a, 0x0247470c, 0x0095aba7, 0x036c2ca3, 0x018a9044, 0x02bc0427, 0x00252679, 0x001981b2}}, Y: Field{[10]uint32{0x00e1d3cc, 0x01f2b202, 0x02054647, 0x015cdae8, 0x0310fe6c, 0x011e1a3e, 0x010de777, 0x01e64d5c, 0x019ca980, 0x001d4179}}}, + {X: Field{[10]uint32{0x01e6f061, 0x02e64d47, 0x020b522a, 0x00d4ae67, 0x022b31f9, 0x0037976b, 0x005450fb, 0x0089b02d, 0x00dcec48, 0x0027efd3}}, Y: Field{[10]uint32{0x02f850dd, 0x03e98047, 0x02c91a7d, 0x0119c0d3, 0x00e9c5b6, 0x00d8adf7, 0x020d58a2, 0x0083a182, 0x00a23da0, 0x003cb934}}}, + {X: Field{[10]uint32{0x006916bc, 0x03d8618a, 0x01b1b976, 0x019fa003, 0x00b7cc81, 0x025df4cb, 0x00b0403e, 0x03ff0a62, 0x02975195, 0x000381b5}}, Y: Field{[10]uint32{0x030bb8bb, 0x011302f0, 0x01c83632, 0x02ec3069, 0x02068302, 0x012400fa, 0x0380e04a, 0x034885eb, 0x030a27d3, 0x0020054d}}}, + {X: Field{[10]uint32{0x0293a6e2, 0x028fc2a4, 0x01a6bcf4, 0x01dfa5e1, 0x03ff7925, 0x01b85b35, 0x0112fd4e, 0x00aab194, 0x03ab021d, 0x002b7359}}, Y: Field{[10]uint32{0x03fd7fb8, 0x02970ad5, 0x0293d0fa, 0x03526d6f, 0x018e4f40, 0x01730eeb, 0x0058608f, 0x00aaa814, 0x02202906, 0x001949ed}}}, + {X: Field{[10]uint32{0x01f2bd38, 0x02fde8b8, 0x00e133e0, 0x005da244, 0x035a4473, 0x025a026c, 0x007e963d, 0x01932c46, 0x01eab43a, 0x0007641a}}, Y: Field{[10]uint32{0x01e29108, 0x037cc6a4, 0x033bbf15, 0x023e93b0, 0x00fc78c2, 0x03bd5057, 0x012f9a68, 0x023fa52b, 0x02de854b, 0x002ac0f7}}}, + {X: Field{[10]uint32{0x0220a768, 0x008b99c2, 0x0140e3a4, 0x03dca8e0, 0x03603206, 0x033a0fd2, 0x00168ae8, 0x0224bc52, 0x0376b8ec, 0x003c7dad}}, Y: Field{[10]uint32{0x01bff25a, 0x02ff2cae, 0x0345d14a, 0x01f60a9f, 0x01e7136a, 0x02ec9736, 0x019b11a7, 0x0368845f, 0x00363413, 0x00224ae8}}}, + {X: Field{[10]uint32{0x02fab379, 0x007177c7, 0x03fb0040, 0x008d0ce9, 0x03c21d1c, 0x0228b70e, 0x03a8d1bf, 0x03d3343c, 0x014ace79, 0x002a213e}}, Y: Field{[10]uint32{0x02a05c96, 0x00c3e037, 0x03082dd6, 0x03e97434, 0x03c611af, 0x03c0f77d, 0x0282fbee, 0x009233b0, 0x016c6e45, 0x0017d4cd}}}, + {X: Field{[10]uint32{0x021da9ff, 0x0203c439, 0x02fe981a, 0x0020d7a7, 0x031fb2be, 0x02d2353d, 0x00165640, 0x02200384, 0x0030197a, 0x002c6621}}, Y: Field{[10]uint32{0x01d849b9, 0x01a36393, 0x00bdf44a, 0x01057b1c, 0x000e515a, 0x01b85068, 0x027ace58, 0x004b496f, 0x024dea7d, 0x003571e1}}}, + {X: Field{[10]uint32{0x0127fedb, 0x0110d383, 0x02d4d109, 0x02ba50bd, 0x0246985a, 0x02db24ea, 0x01c1db82, 0x016e12f5, 0x02a7529d, 0x00056dce}}, Y: Field{[10]uint32{0x02721f89, 0x036af23b, 0x02262075, 0x037bcbf2, 0x00632ac6, 0x00728f50, 0x0011259b, 0x0344f108, 0x02a2bc8a, 0x000a5f8c}}}, + {X: Field{[10]uint32{0x0197d40f, 0x01de0b1f, 0x00f3f57f, 0x01e85b34, 0x038e35cc, 0x005b948f, 0x01926301, 0x007ec596, 0x02e0443c, 0x000ce69d}}, Y: Field{[10]uint32{0x01fe9659, 0x02f5dcf3, 0x02a229e5, 0x01af104e, 0x03914f0f, 0x00ed4b9b, 0x02756201, 0x01e130cf, 0x012efecd, 0x00226419}}}, + {X: Field{[10]uint32{0x027adfef, 0x02d460ed, 0x0251bf64, 0x038613d3, 0x03b1c535, 0x02c24112, 0x018312e9, 0x0376ae51, 0x00fffb80, 0x002fbc9b}}, Y: Field{[10]uint32{0x0137490b, 0x02f79167, 0x03bb5ba1, 0x03c859d6, 0x012c6943, 0x016cc43d, 0x0320518c, 0x01aa0d63, 0x029aef07, 0x000e0624}}}, + {X: Field{[10]uint32{0x00b2427e, 0x036490c2, 0x01894c71, 0x02188c49, 0x003dd40d, 0x013e46c2, 0x00dae108, 0x0309cd3d, 0x00818daf, 0x0033715b}}, Y: Field{[10]uint32{0x03503cca, 0x0041fc07, 0x02c71f07, 0x00d4fd61, 0x01b43769, 0x0155e7e4, 0x01425694, 0x00a2d511, 0x009de9c8, 0x0003d2cc}}}, + {X: Field{[10]uint32{0x0175bc6d, 0x0148039f, 0x01911cd6, 0x0298a9dd, 0x03a09312, 0x0258717e, 0x01be80a1, 0x0211e7b2, 0x0281b1f3, 0x000f77bf}}, Y: Field{[10]uint32{0x02df055d, 0x0160d615, 0x015d3a1e, 0x01442a7a, 0x027c7e2d, 0x02a001f4, 0x03fae4eb, 0x02d1e53b, 0x02dd1eb9, 0x001d760f}}}, + {X: Field{[10]uint32{0x00576826, 0x00e41044, 0x0399e763, 0x03498eab, 0x02a18879, 0x02484b3c, 0x02bae125, 0x00b2f130, 0x03769903, 0x00369f19}}, Y: Field{[10]uint32{0x00553f08, 0x02ba7cce, 0x031d0c07, 0x00f0fc72, 0x024314cc, 0x03a01a63, 0x031f7799, 0x03116e61, 0x0188360a, 0x000b9e9b}}}, + {X: Field{[10]uint32{0x0280d927, 0x02aa446a, 0x003859df, 0x0312b870, 0x02b8aba4, 0x01fd1556, 0x00faa801, 0x00831623, 0x0035e0bc, 0x0009846d}}, Y: Field{[10]uint32{0x014508d4, 0x0032b4df, 0x01b417ce, 0x03490a79, 0x00e47549, 0x0014a7eb, 0x01ff8c1c, 0x03141119, 0x001ae51d, 0x003ad63e}}}, + {X: Field{[10]uint32{0x03962961, 0x03fb1ed9, 0x027bc3de, 0x0025a516, 0x020b8f4c, 0x001adc75, 0x015aa088, 0x01f12a9c, 0x014836f0, 0x002c3ef9}}, Y: Field{[10]uint32{0x03e5abe0, 0x020694e0, 0x010de2a8, 0x02c117b9, 0x021c1749, 0x0378c328, 0x018668fe, 0x01d13431, 0x022466e7, 0x00331828}}}, + {X: Field{[10]uint32{0x01020581, 0x02ed27b2, 0x01a9eb50, 0x03ad7b7b, 0x0277d371, 0x01180f21, 0x00b7688b, 0x03b9d7eb, 0x036fdc51, 0x000680cc}}, Y: Field{[10]uint32{0x00daa7d7, 0x01c57926, 0x0218ce9f, 0x01166f9f, 0x03bd5071, 0x02b3f6f1, 0x0055fc36, 0x03b7e266, 0x030309c0, 0x000ff3c6}}}, + {X: Field{[10]uint32{0x00c159ed, 0x03b9cbde, 0x013c3810, 0x02492793, 0x020cf728, 0x00bda28d, 0x0049b20f, 0x024556aa, 0x0215c834, 0x001d8e84}}, Y: Field{[10]uint32{0x00482684, 0x03797996, 0x0390bd7d, 0x031a7ff4, 0x037b68d5, 0x007cbc89, 0x0395fbad, 0x0387b685, 0x021ccf30, 0x000de09a}}}, + {X: Field{[10]uint32{0x02da4edd, 0x00b09f72, 0x01eff63f, 0x03617e81, 0x00f7e664, 0x01bc0623, 0x020a586a, 0x00f8df73, 0x00c23018, 0x001ff1ed}}, Y: Field{[10]uint32{0x03ed6a8f, 0x0057244a, 0x03f50ac4, 0x03ebf915, 0x036338d2, 0x02af9ef3, 0x02493430, 0x02681bc1, 0x000e6ea8, 0x003f5e9e}}}, + {X: Field{[10]uint32{0x0065ddd8, 0x00984d77, 0x008d7747, 0x03f3c05b, 0x03dc543b, 0x01049623, 0x01eb7d70, 0x01bd5436, 0x03c9b068, 0x00088a01}}, Y: Field{[10]uint32{0x016cc2ab, 0x0255ec29, 0x0098b43d, 0x02d0c072, 0x029a34b2, 0x0064e4f6, 0x036d1553, 0x008bbf2c, 0x0102456c, 0x002e59c2}}}, + {X: Field{[10]uint32{0x005fda77, 0x00627c3f, 0x01603ed0, 0x01182aff, 0x02db6363, 0x028134f1, 0x0233f69c, 0x0341b9b2, 0x033698d8, 0x001e763a}}, Y: Field{[10]uint32{0x03d955f1, 0x009945c8, 0x02b28f13, 0x02789b5e, 0x02931fd4, 0x00676d48, 0x011d460e, 0x00d2a637, 0x03e11b02, 0x002fff25}}}, + {X: Field{[10]uint32{0x03add34b, 0x013449fa, 0x01dc5d46, 0x01aab223, 0x031f801a, 0x037b3db8, 0x02b77130, 0x0386db56, 0x02188e72, 0x00288d99}}, Y: Field{[10]uint32{0x03d60ed1, 0x00daaf9d, 0x03aebb17, 0x0321464f, 0x0070e99a, 0x00543fec, 0x034cd1cd, 0x00644c9d, 0x0236f3e7, 0x003bc8f6}}}, + {X: Field{[10]uint32{0x01dd9612, 0x03f06ed2, 0x013be480, 0x02cfe87c, 0x01b1fcbd, 0x00fe91a9, 0x023e8e74, 0x0205b644, 0x004ddde6, 0x002daeb4}}, Y: Field{[10]uint32{0x02a4e511, 0x02c0402d, 0x035467f1, 0x001f6566, 0x01850c65, 0x0116e02c, 0x00b7f346, 0x02c9ce9a, 0x0209a290, 0x001617eb}}}, + {X: Field{[10]uint32{0x00c3dfbd, 0x007874bd, 0x03aceb49, 0x0163cf5b, 0x0133fcbd, 0x02ed4063, 0x03113db8, 0x039c54a0, 0x00253353, 0x000afc87}}, Y: Field{[10]uint32{0x038d896e, 0x03113273, 0x033ef569, 0x03628356, 0x03b9fec4, 0x00e91ec1, 0x00491214, 0x01356f23, 0x03a74e8a, 0x0038e80c}}}, + {X: Field{[10]uint32{0x01842744, 0x03777497, 0x02dda358, 0x0099a817, 0x0041e9ad, 0x01c4247d, 0x03f3a90e, 0x038d7418, 0x0241e978, 0x0019309e}}, Y: Field{[10]uint32{0x01ae32d1, 0x0304ce4f, 0x03d27521, 0x0008ed49, 0x02bed768, 0x03f99f05, 0x00aac9ec, 0x029a5662, 0x025e08fd, 0x003f2ed8}}}, + {X: Field{[10]uint32{0x0081a58d, 0x010b4ad9, 0x03399b75, 0x02b680be, 0x00af62ac, 0x018f35f2, 0x00ef4350, 0x016d7a69, 0x02f6fdfe, 0x00188287}}, Y: Field{[10]uint32{0x01b8054f, 0x030c16b7, 0x01ae57be, 0x0317b209, 0x03a45fa7, 0x0151f880, 0x007f105c, 0x024e9be8, 0x023c5503, 0x002c2de7}}}, + {X: Field{[10]uint32{0x007b95cd, 0x01d19d4c, 0x038a1ecd, 0x014681af, 0x0215e712, 0x0093b831, 0x03ef68b4, 0x01c550d1, 0x01317cef, 0x000548fc}}, Y: Field{[10]uint32{0x00743b1d, 0x0145bffc, 0x02612bf5, 0x03154f70, 0x00a55806, 0x03c4796d, 0x01fe67a3, 0x03599370, 0x00cc1d8a, 0x0031c955}}}, + {X: Field{[10]uint32{0x02ea0cfd, 0x035ca513, 0x03700f66, 0x00f02dd4, 0x01b43f76, 0x0335cff3, 0x00d4d8c2, 0x021e5300, 0x003c0a9c, 0x0035d94c}}, Y: Field{[10]uint32{0x03bc267b, 0x0180f495, 0x02623781, 0x008ab806, 0x0035b4cd, 0x028c1937, 0x0217b73d, 0x035dea8e, 0x00a5204d, 0x002ebf2b}}}, + {X: Field{[10]uint32{0x00c468b6, 0x03c12b59, 0x01a8ea17, 0x01ed860e, 0x01ffbbf8, 0x00972f10, 0x0198759c, 0x03a59594, 0x021afafc, 0x0029d7ad}}, Y: Field{[10]uint32{0x01869873, 0x0125f659, 0x007b8041, 0x00859356, 0x03a8eba3, 0x029b5439, 0x0049b181, 0x0122a94f, 0x0093240f, 0x0026600a}}}, + {X: Field{[10]uint32{0x00e59f2a, 0x01381aef, 0x03cfa408, 0x01f6fac2, 0x01e7053f, 0x009079a4, 0x01813c71, 0x0246db09, 0x034cd0bb, 0x001fe906}}, Y: Field{[10]uint32{0x0184aec7, 0x020ec738, 0x0209f7e5, 0x00b0012a, 0x039431e2, 0x03da8b15, 0x017e7e20, 0x01a57e0c, 0x0379755a, 0x00282505}}}, + {X: Field{[10]uint32{0x02e4dbf5, 0x0333fd85, 0x03d6fcc5, 0x03ef6082, 0x033bfa1b, 0x02b889db, 0x01eb4408, 0x03c4ab63, 0x01b72240, 0x00205b03}}, Y: Field{[10]uint32{0x037e52d0, 0x0059810f, 0x02c9f67c, 0x0342a606, 0x02e57acb, 0x03dc0957, 0x009dd4bb, 0x03996251, 0x013dd91e, 0x000a94b2}}}, + {X: Field{[10]uint32{0x023414f8, 0x03725430, 0x0380fbb7, 0x021ec305, 0x00ddbb3d, 0x011a4178, 0x0390ac73, 0x00509544, 0x01f1317f, 0x000cfd8d}}, Y: Field{[10]uint32{0x014bfbcb, 0x01a950f9, 0x013bdb62, 0x02000afe, 0x01151235, 0x02f0acb0, 0x034d570b, 0x006622e5, 0x015584eb, 0x001d0d68}}}, + {X: Field{[10]uint32{0x0251999c, 0x02fb11a8, 0x00eb3e94, 0x0079ed78, 0x030bdfe1, 0x02f10e29, 0x0307185f, 0x02ec0cd4, 0x02d704b0, 0x0034a50e}}, Y: Field{[10]uint32{0x036d577e, 0x02925059, 0x0006f19a, 0x01aceffb, 0x00b6097d, 0x03fdba7f, 0x01e41def, 0x028c53af, 0x03cf19aa, 0x000b72a3}}}, + {X: Field{[10]uint32{0x01fb1da6, 0x00494967, 0x01516b01, 0x01970434, 0x00fb524b, 0x01791283, 0x0054390b, 0x01d69bfb, 0x03bfc543, 0x0009aa87}}, Y: Field{[10]uint32{0x01a91b02, 0x009380e6, 0x03a2fd4b, 0x01bc02af, 0x0083973c, 0x039fa066, 0x037d0b6e, 0x01d7380c, 0x02a604c5, 0x00127b3a}}}, + {X: Field{[10]uint32{0x03d28d20, 0x02d633e9, 0x000cd65e, 0x01f7a08c, 0x02ab1871, 0x02523cbd, 0x026d7da1, 0x0280c172, 0x001af866, 0x001e02bb}}, Y: Field{[10]uint32{0x0008b91a, 0x03ca5e2f, 0x0392992c, 0x000862ab, 0x02414b3a, 0x001edbde, 0x0075b6d1, 0x00387aa4, 0x0041e45a, 0x00369940}}}, + {X: Field{[10]uint32{0x00b88b67, 0x035b540b, 0x03b3d5ee, 0x00fca7fd, 0x01ef9811, 0x00f31079, 0x0115853b, 0x037528f9, 0x02598e59, 0x000773fc}}, Y: Field{[10]uint32{0x02b77271, 0x02005c86, 0x012f28c6, 0x02faa6ae, 0x03aed86c, 0x00e0db81, 0x014307ae, 0x01c79159, 0x02307c68, 0x0035e5e1}}}, + {X: Field{[10]uint32{0x033ff70d, 0x0223b90d, 0x00b01e24, 0x00ea736d, 0x038f336f, 0x03b38718, 0x02367eb5, 0x0064de4f, 0x00a27732, 0x002c66bd}}, Y: Field{[10]uint32{0x00821dec, 0x01357de7, 0x0241dc21, 0x0337553d, 0x03b9e73f, 0x01aa3b9c, 0x037f27a2, 0x0168b509, 0x0039a510, 0x0028faa2}}}, + {X: Field{[10]uint32{0x00f6755e, 0x01e0bdad, 0x02066acf, 0x00b69223, 0x0235f24e, 0x024c925c, 0x00b6126b, 0x0277dbca, 0x0329548a, 0x00072307}}, Y: Field{[10]uint32{0x01ff432d, 0x017be584, 0x030c9179, 0x008ea198, 0x0278108b, 0x0065a81f, 0x00c7e2a3, 0x006bb173, 0x03526a1e, 0x00069e6a}}}, + {X: Field{[10]uint32{0x015716ce, 0x00454faf, 0x021d4f0b, 0x01d44b10, 0x00e4d700, 0x010c4e5a, 0x00a10b7b, 0x030f08f2, 0x01da1ad6, 0x002dbfe3}}, Y: Field{[10]uint32{0x01ce61b8, 0x00c1be69, 0x0232d7c9, 0x030aaa1e, 0x00af8dbe, 0x036cf807, 0x00d21e4e, 0x01059f28, 0x01c6b7b7, 0x00134e1a}}}, + {X: Field{[10]uint32{0x00f47b5c, 0x012233b4, 0x02ccb375, 0x02760c39, 0x00ec08cf, 0x03e82b58, 0x00219329, 0x02a12a06, 0x00acf61b, 0x00373bfd}}, Y: Field{[10]uint32{0x0137d6f9, 0x029bad70, 0x013b1736, 0x02c0e158, 0x00fb1b8d, 0x029292aa, 0x03d5508a, 0x0186d220, 0x00e192bc, 0x002526bb}}}, + {X: Field{[10]uint32{0x00a5ebef, 0x03bacdf7, 0x01c8b131, 0x0262fa14, 0x01843ccf, 0x028f3a10, 0x004aa189, 0x01a2725f, 0x03a7b709, 0x00155879}}, Y: Field{[10]uint32{0x019a14da, 0x007c56ea, 0x015a709a, 0x029b9977, 0x0233b924, 0x01ad0528, 0x00e6b7f2, 0x02f8d90c, 0x0017f298, 0x0012c423}}}, + {X: Field{[10]uint32{0x0395a257, 0x003265e8, 0x008027ca, 0x01516cf2, 0x019c56a2, 0x038193a7, 0x025d5bb2, 0x00565423, 0x017789b0, 0x00136625}}, Y: Field{[10]uint32{0x00b6e0d0, 0x007c8850, 0x02675795, 0x03396dc1, 0x00506964, 0x016c0271, 0x03200c9f, 0x001d5b16, 0x0333ac95, 0x002abaeb}}}, + {X: Field{[10]uint32{0x033bfc8e, 0x01a84bf8, 0x03668124, 0x00befd2b, 0x00e9da51, 0x019b3201, 0x02d55a9d, 0x00f12cc2, 0x026e0637, 0x0020ad63}}, Y: Field{[10]uint32{0x025ffb38, 0x03011e06, 0x013d387c, 0x01f4bfcd, 0x01d6d757, 0x03fd310a, 0x033b5c21, 0x0078dcb0, 0x022d98dc, 0x0020de04}}}, + {X: Field{[10]uint32{0x02c6cdf3, 0x0266fa00, 0x0063ad11, 0x01d4d9a5, 0x03714c3d, 0x03beb113, 0x017d8809, 0x01e12ff9, 0x008aa773, 0x003d27ea}}, Y: Field{[10]uint32{0x0218b3f4, 0x02a8e7e6, 0x00772b96, 0x02c12608, 0x02aa9855, 0x024d20ef, 0x03e72814, 0x02904722, 0x02c02164, 0x00106bfd}}}, + {X: Field{[10]uint32{0x00efd78c, 0x031633b0, 0x03073969, 0x03c035e2, 0x010ce910, 0x030614a9, 0x01b97a78, 0x01168630, 0x01dbac84, 0x0019f521}}, Y: Field{[10]uint32{0x00981e97, 0x01bcc821, 0x034be44e, 0x02e73c67, 0x01596f49, 0x022fc1f6, 0x00aa5a82, 0x00acc57f, 0x012a24ff, 0x001c776a}}}, + {X: Field{[10]uint32{0x0304d4cd, 0x02a58411, 0x0350adb2, 0x01fa2d74, 0x0030a46f, 0x0169c5d8, 0x0399883b, 0x00e30f3f, 0x02f2c190, 0x0024517d}}, Y: Field{[10]uint32{0x0222b0bc, 0x00036f9a, 0x00add567, 0x00aedb9e, 0x036c8e42, 0x035de2ce, 0x00664d54, 0x0317f875, 0x01e7852a, 0x0027645e}}}, + {X: Field{[10]uint32{0x02b2631b, 0x00f88fd1, 0x024b3550, 0x02260237, 0x01536740, 0x001c66af, 0x033848ce, 0x03d7c473, 0x0247efc2, 0x00124b54}}, Y: Field{[10]uint32{0x008fd750, 0x02e31020, 0x00863d50, 0x002ca49c, 0x009f021d, 0x02656935, 0x0168877c, 0x032261fb, 0x03627812, 0x000dd2c1}}}, + {X: Field{[10]uint32{0x03dd1dec, 0x02072985, 0x035490a3, 0x002d1861, 0x0125c661, 0x00af6e71, 0x018d2317, 0x0059e24a, 0x03b8bb81, 0x0016e377}}, Y: Field{[10]uint32{0x031f7568, 0x028d4c5e, 0x031cea92, 0x0030fa20, 0x03c7ae17, 0x00cf53ce, 0x010dee01, 0x0086345f, 0x0364fce3, 0x002d1f4d}}}, + {X: Field{[10]uint32{0x02406c65, 0x0174c3c3, 0x02c5c6a3, 0x03af6847, 0x00063c6f, 0x035531b5, 0x01e603cc, 0x005906bd, 0x03ba25a6, 0x002236dc}}, Y: Field{[10]uint32{0x0000a753, 0x01efc6d2, 0x0056b402, 0x03843051, 0x009b8b5b, 0x00a57e30, 0x004c67ae, 0x035edc22, 0x037b1c1d, 0x000e6c1b}}}, + {X: Field{[10]uint32{0x00382451, 0x020246a7, 0x03721fb3, 0x02f78cc3, 0x032a7037, 0x02c25558, 0x0185070b, 0x007ad0b3, 0x009aa23c, 0x000d2573}}, Y: Field{[10]uint32{0x029799ef, 0x00f843ed, 0x0064dd9b, 0x013d18bf, 0x030b82ff, 0x031d55ef, 0x00299573, 0x020b7dd1, 0x03216f39, 0x001ffaae}}}, + {X: Field{[10]uint32{0x0045d7a2, 0x026994b1, 0x034f1cd6, 0x014b0676, 0x010a4f7b, 0x0348c26c, 0x03756669, 0x00431e4f, 0x02a6970e, 0x003a2973}}, Y: Field{[10]uint32{0x02402b96, 0x007c3a8c, 0x01982b96, 0x0090a536, 0x02fab476, 0x01a3a305, 0x012dbf36, 0x0166ee5b, 0x02bfbd52, 0x0036ab36}}}, + {X: Field{[10]uint32{0x03931f9a, 0x0002d0d9, 0x02e32b57, 0x03cacacb, 0x0051af33, 0x0367bf94, 0x009c4837, 0x01eb78e6, 0x038ae81a, 0x0001ba31}}, Y: Field{[10]uint32{0x00291d35, 0x038a5d4b, 0x029ca47b, 0x024cc375, 0x027d1d51, 0x038429e0, 0x035412cb, 0x01068516, 0x0104751b, 0x00395991}}}, + {X: Field{[10]uint32{0x010a539e, 0x0345c24c, 0x01208ab4, 0x02ddd137, 0x00b9551d, 0x038ea4bb, 0x011722b1, 0x016cbe0a, 0x00a3010c, 0x002e3d48}}, Y: Field{[10]uint32{0x030f3d75, 0x02474025, 0x007909e2, 0x007b641d, 0x03a96d3d, 0x0245444f, 0x026451e1, 0x00b7b63d, 0x003ab671, 0x00196407}}}, + {X: Field{[10]uint32{0x02d8005a, 0x037b02ec, 0x00adfe49, 0x029f2e01, 0x00ae0dea, 0x028b05bf, 0x00bd9173, 0x02605622, 0x00586445, 0x002814e1}}, Y: Field{[10]uint32{0x020d7a67, 0x02329b77, 0x029c8ca5, 0x022cf581, 0x03e71260, 0x02624974, 0x00dab73f, 0x0327ee24, 0x030023dc, 0x0009e20b}}}, + {X: Field{[10]uint32{0x01222144, 0x03e28145, 0x036001fa, 0x000e704b, 0x022117cf, 0x030a566f, 0x018b631f, 0x0024907b, 0x0016aa7f, 0x00104a01}}, Y: Field{[10]uint32{0x037f58e4, 0x0205ec6b, 0x038e1808, 0x0138cabb, 0x02613f35, 0x010fdf81, 0x015c363c, 0x0210cfb9, 0x000dfd8e, 0x0030bfbe}}}, + {X: Field{[10]uint32{0x00c7a1ee, 0x023e2a86, 0x0241a7dd, 0x003ac142, 0x028b536f, 0x00f584ec, 0x01130b7e, 0x00f44147, 0x0336cbf8, 0x00312e3f}}, Y: Field{[10]uint32{0x027b4d47, 0x0359fb17, 0x037fc276, 0x0052b525, 0x01f6cf6c, 0x01d448e6, 0x02ba76b4, 0x00cded19, 0x004c8867, 0x0021f4f1}}}, + {X: Field{[10]uint32{0x00a51ac1, 0x029fd6a8, 0x002a93b7, 0x02e61b68, 0x031de630, 0x02df3495, 0x03850106, 0x00e38e9a, 0x013a7cb9, 0x00103ada}}, Y: Field{[10]uint32{0x036d8d18, 0x038db0eb, 0x0389fa51, 0x0293bea7, 0x01c7ede7, 0x0132e201, 0x003b770c, 0x0105f72f, 0x01e014d3, 0x0009ee1d}}}, + {X: Field{[10]uint32{0x0381dad4, 0x012a6f5f, 0x01fb86e9, 0x02137cdc, 0x00ac0c9d, 0x03cb77c9, 0x0365d675, 0x000601d4, 0x010254e3, 0x003dd246}}, Y: Field{[10]uint32{0x005a6e46, 0x03093357, 0x00c7c17a, 0x031cbb1a, 0x0268af0c, 0x0349d758, 0x01bf1b5a, 0x00203f72, 0x0336c549, 0x001a89c6}}}, + {X: Field{[10]uint32{0x009f287e, 0x014c9521, 0x032e36a0, 0x02b30d93, 0x02f16388, 0x01e88fe3, 0x026996c9, 0x00676853, 0x021de4ce, 0x0033c4c9}}, Y: Field{[10]uint32{0x03adac10, 0x002a5a1c, 0x02b7c04a, 0x020f1dc6, 0x008218c4, 0x02e1ca9e, 0x024ab51b, 0x01d11fdf, 0x018dbe1a, 0x00155a21}}}, + {X: Field{[10]uint32{0x013e8cb3, 0x00f1d86b, 0x02a81726, 0x005dcb1c, 0x0394cfd5, 0x00889a11, 0x01166066, 0x021f7f55, 0x02629dd0, 0x00271af6}}, Y: Field{[10]uint32{0x010c0eb3, 0x006d9e80, 0x030be05b, 0x0317896e, 0x019e5fbc, 0x018bff1e, 0x035628ed, 0x0329faec, 0x007b9c7f, 0x000b1df7}}}, + {X: Field{[10]uint32{0x01d26bf3, 0x02adf96e, 0x01922bb7, 0x01ef456c, 0x01c1526d, 0x02cc5256, 0x02cc9a55, 0x0277b083, 0x035f6443, 0x00363440}}, Y: Field{[10]uint32{0x00dbbe30, 0x006e5233, 0x003143eb, 0x00dae72d, 0x03b922a4, 0x02506efd, 0x007f697b, 0x03fa8fd8, 0x00d6ccfd, 0x002adf8d}}}, + {X: Field{[10]uint32{0x01c1d424, 0x02f08a34, 0x022a939c, 0x0296c028, 0x037d53ae, 0x00203c21, 0x032e1047, 0x01e98378, 0x0223b822, 0x0031bd02}}, Y: Field{[10]uint32{0x01d80345, 0x01af42f0, 0x0064d7fe, 0x01af96a3, 0x0263a313, 0x022c8dd2, 0x006f1f4b, 0x02317244, 0x018fcf4b, 0x00385af1}}}, + {X: Field{[10]uint32{0x03a43536, 0x0002e3d8, 0x02509494, 0x03358748, 0x01d1e007, 0x03388b78, 0x007c2dec, 0x034e95c5, 0x02229477, 0x000e9a76}}, Y: Field{[10]uint32{0x01a0e284, 0x030bef92, 0x03c3925c, 0x035ce272, 0x0246b98c, 0x026de73e, 0x00c95e1c, 0x01818b1f, 0x03d5c4ba, 0x0031e713}}}, + {X: Field{[10]uint32{0x0325fc9d, 0x01ede500, 0x0339b7bc, 0x020a42a8, 0x00814c3d, 0x01963c86, 0x037f6fca, 0x0312291a, 0x00e5492f, 0x0006d7ee}}, Y: Field{[10]uint32{0x007fff39, 0x01bef9f7, 0x02982164, 0x00d63bfa, 0x01d2ca42, 0x0124d6c0, 0x02f49f4c, 0x002064ad, 0x03124c9e, 0x00298a42}}}, + {X: Field{[10]uint32{0x009a3845, 0x02fa3b0d, 0x014c747b, 0x0088c7c1, 0x028a7559, 0x0069fe9f, 0x01e1c37d, 0x02d3ab72, 0x0302b004, 0x003f6e83}}, Y: Field{[10]uint32{0x011646fe, 0x0208088e, 0x0262ae2b, 0x02775cb5, 0x0106c3c0, 0x00c310f2, 0x02defd7e, 0x01c709bf, 0x01c9e964, 0x0010b698}}}, + {X: Field{[10]uint32{0x035140df, 0x03c32ce8, 0x01760f38, 0x010cbebc, 0x007c1663, 0x018ce262, 0x03279f70, 0x02598af9, 0x01bfcb7b, 0x0030e4e4}}, Y: Field{[10]uint32{0x02f556e1, 0x02d58f26, 0x02d664c5, 0x02075e94, 0x03449f9f, 0x03de7606, 0x00b8b3ff, 0x020b3121, 0x003453dc, 0x003a8538}}}, + {X: Field{[10]uint32{0x0059cbcb, 0x0385d102, 0x01321675, 0x00280886, 0x0019aedd, 0x01b2c831, 0x000e36cc, 0x032ca86b, 0x013dc716, 0x000953fc}}, Y: Field{[10]uint32{0x02e35921, 0x002b4ae4, 0x03701c40, 0x033e0fac, 0x00896e02, 0x011fd6fa, 0x036bfe32, 0x009abe78, 0x00f3916d, 0x00009913}}}, + {X: Field{[10]uint32{0x00930474, 0x0327d5ca, 0x00c5b071, 0x0176a9f2, 0x021769d3, 0x0215a009, 0x008974e9, 0x0192b68b, 0x0260e9b4, 0x0009392a}}, Y: Field{[10]uint32{0x00479f8e, 0x01cd4e3a, 0x02af78d9, 0x00e3672e, 0x036ed37c, 0x0332501b, 0x022244bc, 0x013f8202, 0x02d182a9, 0x00277df0}}}, + {X: Field{[10]uint32{0x017543a6, 0x00b13db4, 0x01ef8070, 0x03062ffc, 0x02fb19a4, 0x01667f00, 0x03d81b38, 0x01a170fb, 0x03adf906, 0x001eb66e}}, Y: Field{[10]uint32{0x01246f95, 0x02ab5931, 0x02df0133, 0x010d1249, 0x00da45e2, 0x02294cf7, 0x013ac8fd, 0x006293dc, 0x01709c40, 0x00261e2e}}}, + {X: Field{[10]uint32{0x02d8ae53, 0x00495958, 0x022b501d, 0x00e6f97e, 0x00c6e083, 0x01f7eeaa, 0x009eb2df, 0x021c5f83, 0x00d9383a, 0x0025f63f}}, Y: Field{[10]uint32{0x03c6a777, 0x0300a3c1, 0x0074c4a2, 0x0329fe3d, 0x03b1f114, 0x03616be9, 0x00363e15, 0x013e19fe, 0x024cf578, 0x00061e72}}}, + {X: Field{[10]uint32{0x02fe7572, 0x01c77762, 0x0172cb87, 0x03bd417b, 0x002af1ac, 0x0315bfeb, 0x014d1a92, 0x030cb878, 0x03855a08, 0x000f83f1}}, Y: Field{[10]uint32{0x02149390, 0x0396c25b, 0x020b5884, 0x03cf7c56, 0x01bb1768, 0x028c2d55, 0x0044fc9d, 0x022253c2, 0x03fcfd1e, 0x001b5e6d}}}, + {X: Field{[10]uint32{0x01602562, 0x01fb3ed9, 0x037ec55b, 0x039ff1d5, 0x02fda483, 0x02275bd7, 0x023a9b53, 0x03619076, 0x03dbb132, 0x00367685}}, Y: Field{[10]uint32{0x0223b70b, 0x03e318f1, 0x001a7b67, 0x017a2821, 0x0033a4f3, 0x03e3c8ec, 0x027f9e63, 0x0035c0bb, 0x01e45feb, 0x0020391c}}}, + {X: Field{[10]uint32{0x03ca18f3, 0x026026db, 0x039eca3d, 0x014e75be, 0x03f38e28, 0x02dc484a, 0x0135daa7, 0x0078d20a, 0x0366afcd, 0x0006123d}}, Y: Field{[10]uint32{0x036f5884, 0x003d1342, 0x00b7dee7, 0x03d2a4f5, 0x005f9196, 0x01d23b65, 0x0135df63, 0x0153c927, 0x0082645d, 0x0032a69e}}}, + {X: Field{[10]uint32{0x017a9f2f, 0x02728112, 0x02be0a84, 0x011fdcb1, 0x031a9d00, 0x03f0b457, 0x0165b2d4, 0x02b1d96b, 0x00ae9a7d, 0x003b4dd1}}, Y: Field{[10]uint32{0x02b5fb5b, 0x00d113da, 0x02f36b76, 0x0121c19b, 0x032fdc52, 0x00f11dfb, 0x0323d032, 0x031bdf92, 0x012ed4e5, 0x000f3ddb}}}, + {X: Field{[10]uint32{0x033676d7, 0x033fbf97, 0x026b7b1c, 0x0332a188, 0x0391212a, 0x000c49c1, 0x00a3a65e, 0x01516ac4, 0x0373edf3, 0x0031181e}}, Y: Field{[10]uint32{0x017eb3ec, 0x010824cf, 0x02d7728c, 0x02711771, 0x012628ac, 0x008c38f7, 0x000cd036, 0x03de0f57, 0x025b8595, 0x000c6b51}}}, + {X: Field{[10]uint32{0x000e96f0, 0x0392c2af, 0x00699641, 0x006d93ac, 0x00bfb9ad, 0x00e8fe94, 0x020af049, 0x01a75e2c, 0x02ed2aaf, 0x00070258}}, Y: Field{[10]uint32{0x01aede44, 0x015a92ab, 0x0012302d, 0x01828e5f, 0x02591b5a, 0x021e9fda, 0x029c5b0a, 0x038e8a90, 0x02f6e088, 0x00127c46}}}, + {X: Field{[10]uint32{0x01c19454, 0x02682637, 0x0045b1f0, 0x006ab989, 0x0182250e, 0x02ded0e0, 0x00dc6caf, 0x02567826, 0x036c9a41, 0x0001a811}}, Y: Field{[10]uint32{0x0111c7e1, 0x014bb1bd, 0x0233fbe5, 0x02e7331f, 0x00ab4288, 0x03238d45, 0x0266cd37, 0x031324b0, 0x00978ae3, 0x0015a10b}}}, + {X: Field{[10]uint32{0x00191f1c, 0x019e0c28, 0x028f6b93, 0x0203a729, 0x02cdb59a, 0x00a7c0f1, 0x03149993, 0x002a829a, 0x00f653a3, 0x00009368}}, Y: Field{[10]uint32{0x00138235, 0x00b1d5cb, 0x00b53d1a, 0x01a67880, 0x00cdbd3b, 0x00187185, 0x010683af, 0x02f3d6e0, 0x0080aa78, 0x0020f9e4}}}, + {X: Field{[10]uint32{0x021a7764, 0x00dd0fe6, 0x0075f6f3, 0x023c089f, 0x02a07872, 0x00c99100, 0x00719010, 0x02741fd6, 0x00832247, 0x00001b0d}}, Y: Field{[10]uint32{0x00dcc4c6, 0x024b02e8, 0x01bffeb1, 0x0043c361, 0x00be7792, 0x016f6916, 0x03128d84, 0x015021af, 0x03744a12, 0x0028ddeb}}}, + {X: Field{[10]uint32{0x01c43baf, 0x01e3e675, 0x00905154, 0x03d28525, 0x011cdc26, 0x020acdb8, 0x02cf2498, 0x032c9ac9, 0x03bb4d14, 0x00084aaa}}, Y: Field{[10]uint32{0x0047e281, 0x0358140e, 0x01148ca1, 0x028ff099, 0x0011c22e, 0x02ea3961, 0x02ed57d7, 0x0160ae63, 0x020a81d1, 0x003a4502}}}, + {X: Field{[10]uint32{0x0343b10e, 0x005096ac, 0x011edf37, 0x031092a5, 0x02f26ee0, 0x02c2e89c, 0x006824e5, 0x02882a35, 0x00f12afc, 0x00289d1e}}, Y: Field{[10]uint32{0x004036a3, 0x020292ef, 0x017598ec, 0x028df1f3, 0x0270ad0b, 0x01e0635e, 0x03bdecb6, 0x025ea968, 0x0386a7fc, 0x001479d2}}}, + {X: Field{[10]uint32{0x0172e293, 0x03dc4681, 0x03fe5716, 0x001fa336, 0x02b9b8a5, 0x03d57838, 0x022fa7e8, 0x03e7ae8b, 0x029a7171, 0x00387049}}, Y: Field{[10]uint32{0x02afba46, 0x024cd70c, 0x00848e63, 0x029db40d, 0x005562c4, 0x03a09da1, 0x00d8e242, 0x00c90be6, 0x01700895, 0x001073e8}}}, + {X: Field{[10]uint32{0x01e09efb, 0x0209f03d, 0x007804d5, 0x022c9082, 0x0062f0f7, 0x03303ef6, 0x03328e1e, 0x0238642e, 0x004c1941, 0x00081355}}, Y: Field{[10]uint32{0x03d52fb7, 0x015c1664, 0x009f06d0, 0x03514d39, 0x0018cf4e, 0x013e6030, 0x023799cb, 0x00561c42, 0x00e31f5d, 0x00319826}}}, + {X: Field{[10]uint32{0x025172ad, 0x0121b15e, 0x016ee361, 0x02c8eac6, 0x00980138, 0x01e2d33c, 0x0230de2f, 0x03cbcb7c, 0x030a11a6, 0x0005bb77}}, Y: Field{[10]uint32{0x01992684, 0x028338ad, 0x0318bb39, 0x02d3ee05, 0x001327bd, 0x0040b108, 0x004a7926, 0x02cf0648, 0x018fed8a, 0x0038f6cd}}}, + {X: Field{[10]uint32{0x038995f1, 0x020a74ca, 0x0080eaf6, 0x0069e72c, 0x013df700, 0x008c54de, 0x026b7c10, 0x0365ad97, 0x00312298, 0x001f27de}}, Y: Field{[10]uint32{0x01f51e5c, 0x006551bb, 0x000e4a60, 0x0346eedc, 0x02b2481d, 0x014f2ccb, 0x002018fc, 0x0283c6c9, 0x003c90e3, 0x00080df3}}}, + {X: Field{[10]uint32{0x0198fb1c, 0x01a2c598, 0x02dee211, 0x03a54c31, 0x0263aee7, 0x00b5a580, 0x03913a5b, 0x02e3db06, 0x01461dbe, 0x0004a70b}}, Y: Field{[10]uint32{0x01137964, 0x02b097d5, 0x00dc1747, 0x02fdf3a8, 0x027bbd80, 0x00a1f559, 0x0214b72a, 0x009fe68a, 0x02b961c0, 0x000a7ffb}}}, + {X: Field{[10]uint32{0x036175aa, 0x02812707, 0x03b12570, 0x009f818c, 0x02de2049, 0x00c896d4, 0x011f9daa, 0x024cbbdb, 0x016530d4, 0x0022f8b9}}, Y: Field{[10]uint32{0x005510c8, 0x03060014, 0x0340423c, 0x02f5a9a1, 0x03fabfe4, 0x00f02547, 0x0007056e, 0x00334500, 0x02871a13, 0x000d92d3}}}, + {X: Field{[10]uint32{0x0252fa6c, 0x024265d8, 0x00c5e27c, 0x00b97e20, 0x0142a6e1, 0x014ed310, 0x00ceb624, 0x02719eac, 0x030842ae, 0x00102d0f}}, Y: Field{[10]uint32{0x02a2068f, 0x00a812f3, 0x02cca443, 0x03fb448f, 0x00248f11, 0x03168b4b, 0x025e46f2, 0x00b96ec8, 0x02c5de1b, 0x001b46b1}}}, + {X: Field{[10]uint32{0x02c669df, 0x011ce816, 0x00f17087, 0x026f8dc9, 0x014c2cba, 0x00f1276d, 0x01caa559, 0x0137cf3c, 0x038a02f3, 0x0011f888}}, Y: Field{[10]uint32{0x00f31f3a, 0x026fa0a7, 0x01908939, 0x009d8237, 0x00acfc61, 0x00294bdf, 0x02104a36, 0x00957fb2, 0x03a203ee, 0x00134133}}}, + {X: Field{[10]uint32{0x01cfc35a, 0x029727b8, 0x02d607c7, 0x012d77e3, 0x03b3de47, 0x01315975, 0x00433238, 0x031b6ad2, 0x00553a45, 0x0005ca1b}}, Y: Field{[10]uint32{0x0320007f, 0x01c8f258, 0x000cf6d8, 0x0091e4cd, 0x035b194d, 0x02550c41, 0x03104b27, 0x01454582, 0x034775a4, 0x00185cb4}}}, + {X: Field{[10]uint32{0x01d7bb31, 0x02c810a3, 0x01258b7f, 0x0325367b, 0x010a3e96, 0x0158cab1, 0x010bd344, 0x024b2b42, 0x039d3c14, 0x000d146b}}, Y: Field{[10]uint32{0x014974d6, 0x03e2d06c, 0x0079acc5, 0x004e49f3, 0x007687c5, 0x013068ec, 0x0284fd78, 0x01b81b9c, 0x03832123, 0x0037524c}}}, + {X: Field{[10]uint32{0x014e5ce2, 0x03409480, 0x01619d23, 0x00e96caa, 0x00ed9afa, 0x01b82b11, 0x01bee2da, 0x0179ff2d, 0x0081eccc, 0x002c02a9}}, Y: Field{[10]uint32{0x008866a1, 0x032a3efa, 0x022424a2, 0x02a79f9d, 0x0210d732, 0x0107e07e, 0x002ceb74, 0x00cb383d, 0x00861f00, 0x0001a1ed}}}, + {X: Field{[10]uint32{0x00b23311, 0x01571fa8, 0x01e2fa8a, 0x035301d8, 0x020ef706, 0x0135cd6c, 0x008a2393, 0x03247fc9, 0x029cc75b, 0x0014fb23}}, Y: Field{[10]uint32{0x01d45919, 0x00413d91, 0x027688b5, 0x012e7f60, 0x00c352f5, 0x0175716a, 0x01104e01, 0x02c7b46d, 0x03c063c4, 0x0006c477}}}, + {X: Field{[10]uint32{0x01efab66, 0x02461b29, 0x030a4cdc, 0x01e1eaed, 0x032fc80d, 0x01c78ce0, 0x03eddd8d, 0x00b268ec, 0x01b39c07, 0x0007b378}}, Y: Field{[10]uint32{0x026dd626, 0x02b82f2b, 0x025f30da, 0x00c25228, 0x00239f0c, 0x00812734, 0x00cecb18, 0x025d8adc, 0x02c75a79, 0x00013d6b}}}, + {X: Field{[10]uint32{0x03b1394e, 0x0321d526, 0x012e65af, 0x02759dc1, 0x011e9023, 0x02823be9, 0x039b479f, 0x015631ea, 0x03c3702b, 0x00007f8b}}, Y: Field{[10]uint32{0x02845c2c, 0x02f5c831, 0x0326d30f, 0x003229f6, 0x0211a64c, 0x01b523f9, 0x016df2b6, 0x0174eb08, 0x02ae3a39, 0x003dad61}}}, + {X: Field{[10]uint32{0x006d5dec, 0x01c62c78, 0x039ba872, 0x0314a296, 0x0376e64c, 0x03c0c71e, 0x02ba0c20, 0x00ab5560, 0x032fb8ac, 0x002d4f42}}, Y: Field{[10]uint32{0x02e3a289, 0x03c0d3a4, 0x0087b351, 0x01de51da, 0x02041015, 0x01f48c94, 0x03b034c1, 0x021ea992, 0x018951ab, 0x00226139}}}, + {X: Field{[10]uint32{0x0337cf95, 0x02b784a3, 0x02ea7bc0, 0x00428845, 0x01a06ca3, 0x03ccd760, 0x03fe5d81, 0x008d999c, 0x011603bc, 0x00001539}}, Y: Field{[10]uint32{0x0312bd4a, 0x00e9e05c, 0x030b4c5b, 0x01e92e64, 0x01923660, 0x03a05cd5, 0x037206d6, 0x00b0afc6, 0x00269deb, 0x003d1c72}}}, + {X: Field{[10]uint32{0x03b29a7b, 0x036ca0d9, 0x01f598c4, 0x02b19754, 0x013b8087, 0x0322eae4, 0x01e22244, 0x008e8b4e, 0x0372a1d4, 0x0039fbed}}, Y: Field{[10]uint32{0x03a9b6e7, 0x039171e4, 0x023bd587, 0x0282854b, 0x03704a39, 0x01fda863, 0x02b47f41, 0x0022c2fc, 0x0186031d, 0x003cb7ed}}}, + {X: Field{[10]uint32{0x00b519fe, 0x011ae634, 0x03e67034, 0x00ab7020, 0x010b163f, 0x027bc0c8, 0x03b43097, 0x018ea0ab, 0x01aae8a2, 0x0017b167}}, Y: Field{[10]uint32{0x01ef82b9, 0x0057aa1e, 0x0304e842, 0x01bd7016, 0x03a8a531, 0x01395613, 0x01c6aab9, 0x03ab94c3, 0x00c36a3d, 0x000baad3}}}, + {X: Field{[10]uint32{0x00bb62f5, 0x032e40f5, 0x0121658c, 0x01a71034, 0x0001119f, 0x03f07c26, 0x02975c8e, 0x0277ef6b, 0x00d92058, 0x00109ed7}}, Y: Field{[10]uint32{0x02d1213d, 0x011a1995, 0x01b18d98, 0x028c1a1c, 0x006500b5, 0x017f2a1e, 0x022803c3, 0x01210905, 0x02e3b879, 0x00341579}}}, + {X: Field{[10]uint32{0x0105bcad, 0x02113be7, 0x00736554, 0x03630344, 0x002cc30d, 0x03750b2e, 0x03422c79, 0x013cf423, 0x0315fc59, 0x00152552}}, Y: Field{[10]uint32{0x0335373a, 0x011cd33d, 0x0397564b, 0x03d7af30, 0x029c6b88, 0x00680392, 0x03f8e042, 0x027080ab, 0x00657356, 0x0021a9f3}}}, + {X: Field{[10]uint32{0x01f32559, 0x016879ac, 0x021f01b5, 0x02019e8a, 0x03573eb4, 0x0255a194, 0x01aa7b33, 0x003efca8, 0x038d2367, 0x003fdbe3}}, Y: Field{[10]uint32{0x02c7e218, 0x02b07706, 0x017cd2d4, 0x03d0fe3d, 0x0336cd33, 0x027f6511, 0x031552f0, 0x02f15f5c, 0x01a6c7ca, 0x001e94fc}}}, + {X: Field{[10]uint32{0x018a2381, 0x00309965, 0x0152b842, 0x03ee2805, 0x023bba8e, 0x007832e2, 0x02d852f4, 0x030843a0, 0x01e99021, 0x001d35c9}}, Y: Field{[10]uint32{0x01bb2bb0, 0x02d6153d, 0x0227c0ae, 0x039809b2, 0x0192f18d, 0x00405b76, 0x03d6ca4e, 0x01c2ee20, 0x0246aa9f, 0x0013b9a5}}}, + {X: Field{[10]uint32{0x009c845b, 0x030c9479, 0x008d76d3, 0x01c35dd1, 0x01feca05, 0x01636176, 0x0168fbbc, 0x010b270b, 0x037efc03, 0x003a50e7}}, Y: Field{[10]uint32{0x02233916, 0x006f808f, 0x03592203, 0x039ea4a1, 0x01566667, 0x03435c19, 0x0290b459, 0x0095ebbb, 0x01981b7e, 0x0009f683}}}, + {X: Field{[10]uint32{0x01c0b911, 0x01572c29, 0x00f1e2c0, 0x00ca7cb1, 0x0305facb, 0x00fff44c, 0x0126622b, 0x002159b7, 0x008d81a6, 0x0025a129}}, Y: Field{[10]uint32{0x024e68b2, 0x00d4cafc, 0x018161be, 0x00979ebc, 0x03294bbd, 0x0179ed39, 0x0187c31f, 0x03eea975, 0x02d250ad, 0x002480e2}}}, + {X: Field{[10]uint32{0x020e7609, 0x01df25c6, 0x019b4162, 0x00dd7e74, 0x009e4cf8, 0x037161ca, 0x030f1214, 0x0389bb1f, 0x02f90469, 0x0007400e}}, Y: Field{[10]uint32{0x031e5123, 0x02bfa7bd, 0x02139c84, 0x0069f0df, 0x00ed795f, 0x011b4981, 0x031dad81, 0x00b1c82c, 0x03a53082, 0x002671f0}}}, + {X: Field{[10]uint32{0x0197a149, 0x019272b8, 0x0242d01c, 0x02ff1805, 0x010d680a, 0x027dcb02, 0x0032fa58, 0x02aadddb, 0x00f873cf, 0x003e591a}}, Y: Field{[10]uint32{0x02083b1d, 0x00f9353e, 0x036e9979, 0x021b0624, 0x03b67081, 0x014e15f8, 0x00a7ff33, 0x0174c6c9, 0x03c40849, 0x0007fed2}}}, + {X: Field{[10]uint32{0x03f89d32, 0x001104ac, 0x025f5329, 0x03d947b1, 0x03d93c14, 0x00c4542f, 0x02c86a21, 0x02534af2, 0x0106e302, 0x002dab50}}, Y: Field{[10]uint32{0x00d228ce, 0x00a9398e, 0x003ee5db, 0x024a4307, 0x034fa407, 0x01310ad0, 0x015201cc, 0x02590741, 0x02a67427, 0x000668d9}}}, + {X: Field{[10]uint32{0x005b9b9a, 0x01f9f3f9, 0x00108a97, 0x00a1b2c7, 0x0202d478, 0x02eda7ec, 0x020fec3e, 0x03cc1644, 0x02f7190b, 0x0021d51c}}, Y: Field{[10]uint32{0x01a97c21, 0x029e2615, 0x00562050, 0x0238c151, 0x030a172d, 0x017e0127, 0x01d163a9, 0x0166b785, 0x03c5f5dc, 0x0006b7bf}}}, + {X: Field{[10]uint32{0x0227a670, 0x03bac166, 0x034074d9, 0x0356bd29, 0x0354bb6f, 0x0072c6c7, 0x00f7ae2a, 0x01505399, 0x01faf424, 0x0015116a}}, Y: Field{[10]uint32{0x01418018, 0x01d0713a, 0x0294ce87, 0x03a987f7, 0x013bdf07, 0x00fede87, 0x008978ca, 0x038208f9, 0x02077da2, 0x00125b14}}}, + {X: Field{[10]uint32{0x0014d138, 0x01330f5e, 0x0262bf4c, 0x03e5f07d, 0x0374d3a8, 0x0215a0c3, 0x03350267, 0x02b22147, 0x0225704b, 0x0036b861}}, Y: Field{[10]uint32{0x03be6f87, 0x02f6a440, 0x02bff373, 0x03ef1a38, 0x03c20f62, 0x017b20d7, 0x0188ee63, 0x0018660e, 0x01fd7ba9, 0x002af016}}}, + {X: Field{[10]uint32{0x019845c9, 0x032a24e7, 0x00d02dee, 0x02047fa5, 0x013d009b, 0x001f864a, 0x00e659c1, 0x00f7971f, 0x0312e852, 0x00228223}}, Y: Field{[10]uint32{0x0229114a, 0x02c3dd9f, 0x004baef7, 0x011ff179, 0x0041f8df, 0x03062c82, 0x02d703cb, 0x02edd974, 0x012afb8e, 0x00109448}}}, + {X: Field{[10]uint32{0x03af6d01, 0x02d4b935, 0x02f6ec25, 0x033caf3a, 0x00716755, 0x023d5e44, 0x00ed25c7, 0x002344cd, 0x02a88f3b, 0x0035e3d1}}, Y: Field{[10]uint32{0x0306f44d, 0x0149bbd6, 0x006ee5c9, 0x034c9091, 0x01929046, 0x032fc6cb, 0x00b3f019, 0x008043c8, 0x01f229cb, 0x003ac615}}}, + {X: Field{[10]uint32{0x019b034b, 0x0035717e, 0x02fa83ec, 0x0271beab, 0x02f58980, 0x03fbf375, 0x015c4cac, 0x00389d79, 0x031278ae, 0x000782d0}}, Y: Field{[10]uint32{0x004918a7, 0x028a2064, 0x036578bb, 0x02b8275c, 0x03fb523f, 0x020d2140, 0x03d74edb, 0x00ead0ba, 0x03c5544d, 0x003ce314}}}, + {X: Field{[10]uint32{0x017cbbd1, 0x00d1197b, 0x01638cd5, 0x03dc3105, 0x00ab02d7, 0x029623cd, 0x0011f144, 0x0046703d, 0x01b29edb, 0x003c0c55}}, Y: Field{[10]uint32{0x00e85813, 0x034fc1ae, 0x02495599, 0x0125fe71, 0x01317367, 0x00658159, 0x01d07cd3, 0x03fc52d0, 0x03e3ff4f, 0x001cb454}}}, + {X: Field{[10]uint32{0x01de4c8e, 0x025b8e79, 0x02b4153a, 0x01e1b42e, 0x038df665, 0x01059952, 0x00c84fe3, 0x01fed345, 0x01683edc, 0x0003d87f}}, Y: Field{[10]uint32{0x002e5f92, 0x011cb8f5, 0x0212fd38, 0x00e7d636, 0x02e11fc1, 0x00983f93, 0x01d6884d, 0x004ec621, 0x0167cf09, 0x00254b6d}}}, + {X: Field{[10]uint32{0x0017dd77, 0x0271fdf8, 0x0344d7ee, 0x03612c7c, 0x0201ede6, 0x00e9361b, 0x0300e3b1, 0x00dec972, 0x027a29e4, 0x001e0c43}}, Y: Field{[10]uint32{0x0182f2d2, 0x00406db8, 0x00a51a7d, 0x00fd0c4d, 0x007030bd, 0x01f080b5, 0x020f7009, 0x00a78130, 0x018a4d56, 0x0009bfcd}}}, + {X: Field{[10]uint32{0x03781a3a, 0x0009f847, 0x016b97a4, 0x012f2282, 0x034e6ac9, 0x002d87af, 0x01509c2d, 0x00a72e98, 0x004d6b73, 0x0018eba3}}, Y: Field{[10]uint32{0x00d14f88, 0x020fa577, 0x016ce2e4, 0x00a7be2e, 0x01af16c9, 0x00e2a4e8, 0x01629cb3, 0x01e15f46, 0x00cfbf40, 0x002a3a55}}}, + {X: Field{[10]uint32{0x03cca739, 0x01e5c941, 0x02fa9165, 0x009bfde6, 0x00ae662f, 0x00ce15d3, 0x01039616, 0x00d53b8b, 0x012a594b, 0x00252356}}, Y: Field{[10]uint32{0x02f1876c, 0x03219ec0, 0x015570ed, 0x02293b89, 0x01ce0275, 0x01cef5b5, 0x013992f7, 0x00e5ba27, 0x00e25ea0, 0x000dffe6}}}, + {X: Field{[10]uint32{0x02100f45, 0x038b4d11, 0x03a55398, 0x01853719, 0x00660a41, 0x02ffba20, 0x0304de18, 0x000da142, 0x016fa314, 0x00194f3c}}, Y: Field{[10]uint32{0x025a9202, 0x0076cd44, 0x01c3649c, 0x0064f985, 0x03ea4d34, 0x0390c416, 0x026741ae, 0x0395499d, 0x02de5ff1, 0x002b2aab}}}, + {X: Field{[10]uint32{0x028cc782, 0x01447fe3, 0x00d2af3c, 0x02219142, 0x01141e18, 0x039a9de2, 0x00fd1ee0, 0x03722fc9, 0x00828a5e, 0x0011beda}}, Y: Field{[10]uint32{0x03fd8887, 0x020f804d, 0x010cfef3, 0x02611fb2, 0x02f4d266, 0x020b0b8d, 0x009ff4ae, 0x03a6f5ab, 0x013fd52c, 0x002752b9}}}, + {X: Field{[10]uint32{0x0138c0ed, 0x0308015c, 0x020eae24, 0x0021e8ab, 0x024ca442, 0x012c3ca2, 0x01face2b, 0x00a9c5f0, 0x00c723ea, 0x0017c468}}, Y: Field{[10]uint32{0x000c8452, 0x01ccc5ae, 0x011d5bb2, 0x033c1be6, 0x023906ea, 0x0049b939, 0x03925ddf, 0x0184bee9, 0x0084ad97, 0x0017b2bb}}}, + {X: Field{[10]uint32{0x02a9039f, 0x02f72130, 0x022c0320, 0x00ecfae9, 0x00dbf2ba, 0x03ac4224, 0x02b6b3bd, 0x03bde9b5, 0x021c929b, 0x002e7d27}}, Y: Field{[10]uint32{0x0101e558, 0x01a0832d, 0x0115c2bf, 0x0131bd0b, 0x006e1b68, 0x00d2a80c, 0x00ecc1c5, 0x022deef4, 0x02767e4f, 0x00261ca7}}}, + {X: Field{[10]uint32{0x01ade2c3, 0x00e39c85, 0x012dc63c, 0x02c0d8c7, 0x00965dc2, 0x03269182, 0x033eea76, 0x02417fc9, 0x0102e7d2, 0x0003b228}}, Y: Field{[10]uint32{0x034371c0, 0x028fb73d, 0x00b6dbe5, 0x0170da33, 0x02706ffe, 0x03d9c584, 0x03836868, 0x025b2d24, 0x01e7242d, 0x00363226}}}, + {X: Field{[10]uint32{0x03e236c6, 0x0339810a, 0x02dafcda, 0x02c0e73d, 0x010582c5, 0x010a9496, 0x012a3c77, 0x020169b2, 0x02b3c351, 0x00041fc0}}, Y: Field{[10]uint32{0x019bfb9f, 0x03ce272a, 0x00a3e685, 0x017820b1, 0x03c5c2d5, 0x0371c929, 0x01746858, 0x01d8055f, 0x02bf1ab4, 0x00145c8d}}}, + {X: Field{[10]uint32{0x02298971, 0x018194d5, 0x036cfb98, 0x01eb6bdb, 0x02b10d63, 0x020c5e1c, 0x038c1fea, 0x03005b5e, 0x00a1a5c1, 0x003c3ec5}}, Y: Field{[10]uint32{0x024540d1, 0x02f151e5, 0x0033792f, 0x03fecc59, 0x00c40b89, 0x00a00007, 0x018e87c7, 0x03997509, 0x01140d33, 0x0038767b}}}, + {X: Field{[10]uint32{0x00489459, 0x03e6cd51, 0x0347a333, 0x002bfe0e, 0x0078a1c8, 0x03af781a, 0x00ce83c0, 0x013b7bdb, 0x02dbea78, 0x00294dc6}}, Y: Field{[10]uint32{0x00129224, 0x0338fcb2, 0x03edd48e, 0x02f33344, 0x007e3d09, 0x00a88b2f, 0x03acbe7b, 0x0175d1dc, 0x0172127f, 0x003d5e01}}}, + {X: Field{[10]uint32{0x0217300d, 0x013eb7ef, 0x013b999e, 0x005e580f, 0x022bbbb8, 0x03e9f64b, 0x00109715, 0x0295d84f, 0x025e1b0b, 0x000f00c7}}, Y: Field{[10]uint32{0x029c83f3, 0x0309cbab, 0x03e6bbf9, 0x035c70d8, 0x0079cb40, 0x035edb31, 0x00e65a2c, 0x00db751d, 0x03fb3920, 0x00349d68}}}, + {X: Field{[10]uint32{0x01a5318f, 0x0071a701, 0x0218b217, 0x02b948f3, 0x01f8a1b9, 0x00e48203, 0x0169a689, 0x02d4c282, 0x019e685d, 0x0021ed62}}, Y: Field{[10]uint32{0x01a775d4, 0x02bd23ff, 0x02c081f5, 0x03ebe673, 0x011b1166, 0x010ba134, 0x0140b01a, 0x02be968b, 0x0204e3f0, 0x0001ab8c}}}, + {X: Field{[10]uint32{0x01b8bf74, 0x01014042, 0x038dd2ae, 0x0138ffa0, 0x01ea00d0, 0x01adf9ec, 0x018eedb5, 0x0305b7e7, 0x03ddc002, 0x00367c1d}}, Y: Field{[10]uint32{0x033ffeaf, 0x0084996b, 0x012f278f, 0x000bb954, 0x0211c273, 0x01c32e7b, 0x00fc486f, 0x0063894f, 0x011e5031, 0x00194635}}}, + {X: Field{[10]uint32{0x00921af7, 0x031c873e, 0x0398ec9b, 0x02482bbe, 0x037558a4, 0x0089dfd8, 0x01ce3053, 0x02b32582, 0x03638d15, 0x0027026a}}, Y: Field{[10]uint32{0x00e0f6fc, 0x0292de40, 0x033d91ca, 0x012a7ef7, 0x010bf2f8, 0x0194897c, 0x02d6ab31, 0x02f0422f, 0x018d535a, 0x002cb2b1}}}, + {X: Field{[10]uint32{0x028a7fc0, 0x01b71ce6, 0x008ae167, 0x0037b439, 0x0052ab25, 0x030da689, 0x038948a5, 0x0248c973, 0x038b4c2d, 0x001bb47b}}, Y: Field{[10]uint32{0x02742008, 0x02b21fbd, 0x00585f54, 0x02f07241, 0x025c6423, 0x018f69d6, 0x02741368, 0x014553f2, 0x008c2cfe, 0x00306de8}}}, + {X: Field{[10]uint32{0x006928d1, 0x034ef894, 0x018f13fb, 0x02a4c1e7, 0x03cfc458, 0x00ae9821, 0x01f71c1e, 0x01fdb09e, 0x0170154b, 0x00220ba3}}, Y: Field{[10]uint32{0x03e64131, 0x00e9ce9b, 0x03d1d9b2, 0x0197b6ec, 0x0208b315, 0x019eb07c, 0x014ac62e, 0x0061ca42, 0x022e97c4, 0x0022526c}}}, + {X: Field{[10]uint32{0x037aba52, 0x0284e7ec, 0x0246aa6d, 0x03a7f08c, 0x00516840, 0x00942605, 0x019d0afb, 0x01ba81c4, 0x02a024c8, 0x001c211c}}, Y: Field{[10]uint32{0x028fe5ac, 0x014feec4, 0x0130db7a, 0x01ee0335, 0x013a8b05, 0x02528d99, 0x03378d65, 0x0054ca96, 0x03a51d55, 0x0026026d}}}, + {X: Field{[10]uint32{0x039fac3e, 0x02a330eb, 0x025ebd87, 0x00f5c688, 0x03769d57, 0x023420d4, 0x01a1250d, 0x02dc212b, 0x02d509a8, 0x000e913e}}, Y: Field{[10]uint32{0x037f20cd, 0x031a7ed2, 0x01c85cb0, 0x0114b4f1, 0x03f9186e, 0x01849204, 0x0174bf84, 0x03434286, 0x01511250, 0x003ca7d1}}}, + {X: Field{[10]uint32{0x01fb9f30, 0x00dc2cf3, 0x0390afcc, 0x02116267, 0x0236ba4c, 0x00708cd8, 0x00564c04, 0x006f5058, 0x01d8e09e, 0x0028d467}}, Y: Field{[10]uint32{0x03881d7e, 0x034fb186, 0x0267472d, 0x0238d3f3, 0x02715008, 0x031d3423, 0x0199faa6, 0x001c4740, 0x01597c91, 0x001933fc}}}, + {X: Field{[10]uint32{0x00fcf1dc, 0x03c1d9d7, 0x038291c4, 0x03e835a3, 0x02bea1af, 0x027667fc, 0x033513f1, 0x0172593a, 0x00e3765f, 0x0016bc5b}}, Y: Field{[10]uint32{0x03815daa, 0x0100bae8, 0x023dc1f2, 0x02e2a1ea, 0x00511ff7, 0x0005929e, 0x0042db6b, 0x0047b52a, 0x02b53bd7, 0x00002193}}}, + {X: Field{[10]uint32{0x023d54a8, 0x0070b415, 0x0149b402, 0x0344de96, 0x0018848b, 0x00990410, 0x021ec080, 0x03970977, 0x012219ca, 0x0007fe69}}, Y: Field{[10]uint32{0x0318e031, 0x0320ec05, 0x014d4791, 0x0370526c, 0x018f85d7, 0x014dd0c2, 0x00fb919a, 0x01db86d7, 0x034c1222, 0x00151b58}}}, + {X: Field{[10]uint32{0x03d3e938, 0x01b75bd0, 0x0082ac6b, 0x0372a999, 0x007f02fc, 0x03eacda3, 0x00926ebc, 0x007b63e1, 0x00ad72a5, 0x0035e9b7}}, Y: Field{[10]uint32{0x00e41c96, 0x018ec885, 0x03278bde, 0x01601b25, 0x018598a0, 0x01119aba, 0x028f378e, 0x02b21969, 0x00d63ea6, 0x002689cf}}}, + {X: Field{[10]uint32{0x0332d797, 0x02a34647, 0x012823f4, 0x024c7c88, 0x023c874b, 0x02db3531, 0x016dfb52, 0x0331f69a, 0x03e55bdc, 0x000553d8}}, Y: Field{[10]uint32{0x03f76fae, 0x01644d5d, 0x0067a2df, 0x01f6cd03, 0x02f0f29d, 0x00aa9af1, 0x03269b0d, 0x028723a9, 0x032217bc, 0x003a63e5}}}, + {X: Field{[10]uint32{0x00399bf1, 0x03b1d613, 0x01991c27, 0x036a1f3a, 0x02dbdbb7, 0x0086ef7a, 0x0129095c, 0x01857333, 0x008b8513, 0x003dab78}}, Y: Field{[10]uint32{0x03234ad1, 0x01eb4ce3, 0x0296af03, 0x03284c63, 0x013fc1c5, 0x00a298c4, 0x01af074b, 0x032ae84c, 0x03e019fc, 0x00263206}}}, + {X: Field{[10]uint32{0x0347637e, 0x0072cb31, 0x0083a3e5, 0x03da50ea, 0x00b786b3, 0x017fb0af, 0x01290486, 0x0057db1b, 0x02c03b27, 0x00259873}}, Y: Field{[10]uint32{0x035358bf, 0x01d58813, 0x032547fe, 0x00d657c2, 0x03cb9c37, 0x027b1ce7, 0x028056a0, 0x00412dd2, 0x03d99b34, 0x003aa87d}}}, + {X: Field{[10]uint32{0x015d19a1, 0x01262d19, 0x0377f53d, 0x0333d6b1, 0x03480520, 0x000dc170, 0x0003465f, 0x00231cd3, 0x023a27d6, 0x0038294c}}, Y: Field{[10]uint32{0x020cc606, 0x02f58a49, 0x03aee836, 0x02d639f2, 0x0363d88e, 0x0118a5d7, 0x00606798, 0x03158baf, 0x0178a8b8, 0x0007dc9f}}}, + {X: Field{[10]uint32{0x002f6409, 0x0338c74a, 0x00118c24, 0x02577b39, 0x0308206e, 0x009431ab, 0x001980d5, 0x011bcbca, 0x02fd0046, 0x002eae0b}}, Y: Field{[10]uint32{0x011fb82a, 0x03356123, 0x0177d137, 0x02ed1ade, 0x03cafbdb, 0x0195b157, 0x038375a5, 0x00049a37, 0x01dc26a2, 0x000a982c}}}, + {X: Field{[10]uint32{0x01eb2631, 0x02052b78, 0x022c221e, 0x0081e79a, 0x032d7edd, 0x03946ebb, 0x006e9b3e, 0x02562c60, 0x0399ebbe, 0x000e2784}}, Y: Field{[10]uint32{0x029ae2be, 0x01167db3, 0x02fd52c9, 0x02f50d79, 0x00e48ada, 0x004a9893, 0x031fb4d1, 0x03f91679, 0x02331f3c, 0x001b0561}}}, + {X: Field{[10]uint32{0x029d4515, 0x001dc9dc, 0x000458c3, 0x01846e91, 0x01087d89, 0x03e91447, 0x03081747, 0x0154f467, 0x01cac0dc, 0x002de05e}}, Y: Field{[10]uint32{0x003e0de2, 0x0248d47a, 0x00c97a68, 0x0326ee5d, 0x01ce0a80, 0x0115df5c, 0x00caa5a9, 0x01a941b9, 0x02980c49, 0x001c082f}}}, + {X: Field{[10]uint32{0x03104306, 0x0053557f, 0x02dc9f1e, 0x03d04bb2, 0x02baa6a6, 0x03640163, 0x03d13fcf, 0x03e69c48, 0x013dd170, 0x00219fb3}}, Y: Field{[10]uint32{0x006759bb, 0x00d792a5, 0x00dc9e25, 0x038bf792, 0x03d698c5, 0x027cad50, 0x03276897, 0x03b88e3e, 0x03e1bb91, 0x000f036c}}}, + {X: Field{[10]uint32{0x00eecd38, 0x02f8bdb5, 0x004e5697, 0x00af055c, 0x03db25bb, 0x0212cb32, 0x03d4d083, 0x00097507, 0x014c26a1, 0x002f9c59}}, Y: Field{[10]uint32{0x01406afa, 0x02bdabd2, 0x001dfcdf, 0x039112cb, 0x012dcdae, 0x013683bf, 0x02f8d18e, 0x00b71e82, 0x020fc37a, 0x000c5bb4}}}, + {X: Field{[10]uint32{0x02e9079c, 0x037aea5d, 0x01fda6b6, 0x0111e58f, 0x01416905, 0x03478059, 0x015b9a2a, 0x009a179d, 0x00b024d6, 0x0016a387}}, Y: Field{[10]uint32{0x011ebba7, 0x022888bc, 0x00a27d08, 0x00aa4778, 0x023889db, 0x02377a57, 0x00f43516, 0x00c379ea, 0x01737433, 0x00131e4c}}}, + {X: Field{[10]uint32{0x002e6131, 0x005904ae, 0x031f8572, 0x003eb8f4, 0x03bb884d, 0x0018c114, 0x03a761ad, 0x02f433c4, 0x000b2347, 0x000efeb4}}, Y: Field{[10]uint32{0x02545f61, 0x02f6d0aa, 0x0051896e, 0x02adbd6c, 0x0371e3cb, 0x01b52060, 0x03fe8e63, 0x01ffb0fd, 0x01609415, 0x003bccf1}}}, + {X: Field{[10]uint32{0x012c1961, 0x00647bd7, 0x02dc7428, 0x00d4ed3c, 0x0360e026, 0x0171a32d, 0x016c2d2b, 0x03382722, 0x02de684d, 0x0000911f}}, Y: Field{[10]uint32{0x02f7bfcb, 0x009fcc07, 0x03377624, 0x01535b9f, 0x025ad6cb, 0x0110e090, 0x0339e554, 0x02182d8a, 0x002fe80f, 0x002b4e2a}}}, + {X: Field{[10]uint32{0x03cf985d, 0x0215f522, 0x0123909d, 0x001d05f1, 0x00e7685f, 0x02a379d9, 0x0007e49b, 0x02e7e3a2, 0x0321eeb4, 0x00297ab8}}, Y: Field{[10]uint32{0x034def1d, 0x02c408ea, 0x0296eed3, 0x0075229d, 0x01001788, 0x02799565, 0x015f5233, 0x02df4cab, 0x02a9f5c1, 0x000ab3e2}}}, + {X: Field{[10]uint32{0x0090b13c, 0x0395d6ba, 0x01251007, 0x0045710d, 0x03dc035e, 0x02ac17a3, 0x00a5b973, 0x0364e0f3, 0x015c5337, 0x0025f7a6}}, Y: Field{[10]uint32{0x0069e6dd, 0x02448438, 0x01f79e8f, 0x016f3624, 0x00920250, 0x01373bd4, 0x003fb4dc, 0x0228a4d3, 0x01692e30, 0x0013ecb6}}}, + {X: Field{[10]uint32{0x0038f479, 0x005c9b11, 0x01f3cc6b, 0x011151ac, 0x0125b70f, 0x002af7e5, 0x003dad8d, 0x02462be0, 0x025fa864, 0x002e32bc}}, Y: Field{[10]uint32{0x009c05c9, 0x0198f683, 0x02d79023, 0x00dac1a7, 0x02c30e2f, 0x01db01d2, 0x03a8c5a0, 0x01bacdbf, 0x01fac0f5, 0x001f146d}}}, + {X: Field{[10]uint32{0x0107b2e6, 0x0085d92b, 0x03443445, 0x02296c7c, 0x03b2cade, 0x03c50041, 0x00f3001a, 0x038a86c9, 0x028c1b96, 0x002d6f21}}, Y: Field{[10]uint32{0x0138d639, 0x02e8d9d2, 0x026f238b, 0x001ec852, 0x03672a8c, 0x015170ce, 0x02aa456f, 0x027ccf56, 0x02294e92, 0x00235b3f}}}, + {X: Field{[10]uint32{0x033ff602, 0x012a284d, 0x036e9078, 0x01887c4f, 0x0032ea26, 0x0090530a, 0x01b666bf, 0x00ec8843, 0x007c242a, 0x0017d456}}, Y: Field{[10]uint32{0x0346c858, 0x021a5122, 0x03427f58, 0x02299ab6, 0x031b3941, 0x02732ee7, 0x013950f9, 0x00293ae1, 0x020febf2, 0x000b0ec9}}}, + {X: Field{[10]uint32{0x022bcfde, 0x02d19d1e, 0x01feb822, 0x02558343, 0x034f08e6, 0x00113cfd, 0x0252e17e, 0x028ad44a, 0x00f95009, 0x000742f8}}, Y: Field{[10]uint32{0x033a159b, 0x01739363, 0x02538933, 0x02c93e19, 0x03a742c3, 0x01ee0776, 0x003181cf, 0x0061dcde, 0x03c3dbd8, 0x0030ea0a}}}, + {X: Field{[10]uint32{0x0122fb8a, 0x02bd2f23, 0x0192ccec, 0x0356d249, 0x029e0e62, 0x0338c3b4, 0x0221bcd6, 0x00ccc699, 0x0028b800, 0x000fbc3b}}, Y: Field{[10]uint32{0x0144b16d, 0x00a6e9e8, 0x001337d9, 0x018e636c, 0x03512fd3, 0x010f31fd, 0x02a03dae, 0x003a1b24, 0x00ad77d4, 0x003f8b21}}}, + {X: Field{[10]uint32{0x03555fc5, 0x03e5926d, 0x02ad302e, 0x02c39fc3, 0x00f62f12, 0x00ca8d92, 0x02bef427, 0x00136b1d, 0x0224a4ec, 0x002130a6}}, Y: Field{[10]uint32{0x014f970e, 0x029fc29e, 0x017ecb18, 0x014ce391, 0x03929ec4, 0x008b927e, 0x02b454cf, 0x01529c43, 0x02bb283a, 0x0039d883}}}, + {X: Field{[10]uint32{0x02cf43a8, 0x00c55cfa, 0x031e9283, 0x01cc041f, 0x03a309cd, 0x03c705de, 0x0340f4e5, 0x017fa487, 0x0234e75d, 0x001aee99}}, Y: Field{[10]uint32{0x03421582, 0x01af8dbe, 0x01a979d8, 0x03a9519c, 0x025b47fd, 0x00882715, 0x0086b441, 0x02090c7c, 0x008c4216, 0x000cfff8}}}, + {X: Field{[10]uint32{0x01ef0150, 0x03c59d1b, 0x01bfa47c, 0x02625567, 0x02488f62, 0x02796dba, 0x01a6046d, 0x03006f12, 0x02f051b0, 0x0004ed9e}}, Y: Field{[10]uint32{0x00237608, 0x03c764e8, 0x0109ee29, 0x01648c85, 0x03a54add, 0x0212b2b2, 0x037cc35d, 0x02fc2d4c, 0x014b01c1, 0x00343a24}}}, + {X: Field{[10]uint32{0x03af9300, 0x033c4fa4, 0x007202c5, 0x032d8d90, 0x02fdf779, 0x03331289, 0x02abc946, 0x02d8abaf, 0x01bfb5dc, 0x00058488}}, Y: Field{[10]uint32{0x00f83b2c, 0x026dfa4b, 0x007b72a4, 0x036d86bb, 0x00d1a212, 0x00ad484f, 0x0266bd30, 0x01b7e1c2, 0x02c5dd9d, 0x0034ff78}}}, + {X: Field{[10]uint32{0x02eb508b, 0x0242fe38, 0x003d39a5, 0x02fe19b7, 0x017eda1f, 0x00ad4880, 0x03602770, 0x016118eb, 0x020cc62f, 0x000c314d}}, Y: Field{[10]uint32{0x02c44efe, 0x02d2a072, 0x039f01aa, 0x03006dd9, 0x016c30e8, 0x037ab185, 0x037dbe8e, 0x0268ae20, 0x02f5009b, 0x00323a46}}}, + {X: Field{[10]uint32{0x00ec3576, 0x02e002c0, 0x01007a38, 0x03c21cdc, 0x02640364, 0x00925c9f, 0x027f38b7, 0x0147d7a9, 0x027fdd91, 0x00301966}}, Y: Field{[10]uint32{0x01cf47e3, 0x03c58069, 0x03ded648, 0x02b8728c, 0x018c57fa, 0x01d100d8, 0x018b5a77, 0x00c70d51, 0x00cb6fa1, 0x0029bd92}}}, + {X: Field{[10]uint32{0x02679386, 0x009e1fc0, 0x004be43e, 0x025429a1, 0x037d50fe, 0x0386ac72, 0x006472a8, 0x02a24811, 0x024db795, 0x000c8548}}, Y: Field{[10]uint32{0x018a9bf0, 0x01407e4d, 0x0238cc5e, 0x006fbf0f, 0x03faba83, 0x00b3ff17, 0x00c7eb59, 0x023619a4, 0x026297f2, 0x00095d41}}}, + {X: Field{[10]uint32{0x01871145, 0x029a2868, 0x035b3b19, 0x01926625, 0x03fe7762, 0x02971553, 0x0115445d, 0x01c120ef, 0x00e2a87a, 0x00095d95}}, Y: Field{[10]uint32{0x02636ec5, 0x0232234c, 0x010439c2, 0x00c259a4, 0x009efe24, 0x032816c6, 0x03fc4eef, 0x03c53e75, 0x019d0c67, 0x003f2e4c}}}, + {X: Field{[10]uint32{0x002f1b49, 0x0262c5c2, 0x03e800ce, 0x01b5b6cc, 0x0017c8a6, 0x039a422a, 0x017926e6, 0x03c553cf, 0x0201e504, 0x00291e1a}}, Y: Field{[10]uint32{0x0323a2fc, 0x00a184b4, 0x03bfd0b0, 0x038998ab, 0x027f86e8, 0x02df3e9e, 0x01a29678, 0x013e7fa0, 0x0142fc2e, 0x0015db93}}}, + {X: Field{[10]uint32{0x02db1e71, 0x02966998, 0x01e383c5, 0x03dfa0b8, 0x0090b484, 0x022bcda7, 0x013ae62a, 0x02615912, 0x03a9260c, 0x0014503d}}, Y: Field{[10]uint32{0x010bae86, 0x011c534d, 0x021fe2f6, 0x03026149, 0x0394ddcd, 0x03afe454, 0x026aa92c, 0x0277ed8e, 0x02c2b087, 0x0013945c}}}, + {X: Field{[10]uint32{0x00a66dfc, 0x01b3cc93, 0x0134231e, 0x004d4843, 0x03b781fe, 0x02295e75, 0x03d6d901, 0x0142de71, 0x020c0f0f, 0x003d5675}}, Y: Field{[10]uint32{0x014eed15, 0x00aeac23, 0x0208e205, 0x037328a7, 0x025f1f05, 0x02f6a390, 0x015fb56a, 0x014a972a, 0x02ae8e58, 0x0004b673}}}, + {X: Field{[10]uint32{0x00547e7c, 0x021a686c, 0x038570cc, 0x037e68cd, 0x00a4fb73, 0x00e814d5, 0x030e0be5, 0x03406f25, 0x03f50fa2, 0x0022241f}}, Y: Field{[10]uint32{0x03a3d2f5, 0x0055ee5f, 0x0373dab9, 0x006f0036, 0x025b2640, 0x03f29aaa, 0x03145f26, 0x0046d909, 0x0356cc12, 0x003d614e}}}, + {X: Field{[10]uint32{0x018c45ca, 0x02cfa9b9, 0x027ecfe4, 0x03c937bc, 0x03c8ac82, 0x038763fe, 0x011fba31, 0x0141b63a, 0x03f64541, 0x00330792}}, Y: Field{[10]uint32{0x00d27592, 0x00a98fce, 0x03b77590, 0x036c9d4f, 0x011efcf1, 0x00c1a55b, 0x00585a60, 0x0060f1a1, 0x017da875, 0x001d85d2}}}, + {X: Field{[10]uint32{0x03ca99d5, 0x00436ab2, 0x00dd4eca, 0x01f24d15, 0x016c3955, 0x007b7780, 0x02a6f9ef, 0x0108416d, 0x0037ef74, 0x001fb8b1}}, Y: Field{[10]uint32{0x033772d6, 0x0125a3db, 0x025b1827, 0x01c36f7b, 0x033e6d7b, 0x01457695, 0x00503f69, 0x03d767cc, 0x03345eef, 0x00085d51}}}, + {X: Field{[10]uint32{0x03e2465c, 0x0278178c, 0x0290f653, 0x012ed0b6, 0x003605ba, 0x01afd083, 0x033af3ef, 0x02d2a68f, 0x02a239f9, 0x0001cbfb}}, Y: Field{[10]uint32{0x01f553cc, 0x00abb67a, 0x0120a36d, 0x0345ac33, 0x0085482c, 0x000a50a3, 0x002ad9ad, 0x037b7723, 0x02ffdf7a, 0x0000280d}}}, + {X: Field{[10]uint32{0x0099914a, 0x0323d780, 0x0307c938, 0x02b89905, 0x03c8a0cb, 0x035e8e9b, 0x01b627c4, 0x0374019a, 0x033e94a0, 0x000d8f68}}, Y: Field{[10]uint32{0x02f58bd9, 0x03a6301e, 0x0359c3d0, 0x037351e2, 0x03a2f936, 0x00541bd1, 0x0236099c, 0x001e9038, 0x0277ef13, 0x0026f6a6}}}, + {X: Field{[10]uint32{0x02c133fe, 0x0246183c, 0x036e1a7e, 0x02347b26, 0x0393af0f, 0x02f817f7, 0x034a48bb, 0x010a426b, 0x0064c839, 0x001d9502}}, Y: Field{[10]uint32{0x00a3ecc2, 0x03970f95, 0x0084583c, 0x03d697b5, 0x01b3cc98, 0x02bcf5bc, 0x013a236d, 0x03ac0888, 0x03d7738c, 0x003c1a48}}}, + {X: Field{[10]uint32{0x02b239c4, 0x032d007c, 0x01606c94, 0x0224d1c2, 0x0251e381, 0x00ba6928, 0x01945c16, 0x022a7e2f, 0x00217a31, 0x0015cfc2}}, Y: Field{[10]uint32{0x0346bef5, 0x00754ead, 0x03fbe7ca, 0x00a35f1c, 0x00496cc1, 0x030faf45, 0x00b105fe, 0x02792e52, 0x00f27de6, 0x001f9e39}}}, + {X: Field{[10]uint32{0x02b01f5f, 0x02a4d388, 0x01467213, 0x02120669, 0x02f90d21, 0x015f97b5, 0x0009656f, 0x012e4ed4, 0x01818923, 0x000214de}}, Y: Field{[10]uint32{0x02e475f8, 0x01bc07d8, 0x02820ed2, 0x003b267e, 0x029281fc, 0x02733be8, 0x0069bbe8, 0x00266387, 0x01e8cc99, 0x0032529e}}}, + {X: Field{[10]uint32{0x01eb6041, 0x0184cb3b, 0x0051257f, 0x0031e001, 0x016f00a3, 0x033c3b61, 0x01ccd4c1, 0x000cd8ec, 0x01122989, 0x0014ce21}}, Y: Field{[10]uint32{0x0183334e, 0x022d12da, 0x03722fd7, 0x01551a6f, 0x000dd22f, 0x02f26a11, 0x038feacd, 0x0346e693, 0x0252f856, 0x00355b8a}}}, + {X: Field{[10]uint32{0x00e4796d, 0x00eaabac, 0x00c852f3, 0x02300e71, 0x01c5cb47, 0x03ee6258, 0x009f913a, 0x03ded971, 0x008a750e, 0x00107b79}}, Y: Field{[10]uint32{0x02559de4, 0x0090270c, 0x0065b8de, 0x02734693, 0x0104bdfe, 0x0012d4f2, 0x0092ea7f, 0x011a0062, 0x03f94b6c, 0x0035d31e}}}, + {X: Field{[10]uint32{0x01f08148, 0x034ed4f9, 0x03eefb6d, 0x00e4eb3f, 0x03fe7621, 0x03b5aa77, 0x02eece4e, 0x03dcda64, 0x01f36596, 0x0025fa4c}}, Y: Field{[10]uint32{0x00dd5f1b, 0x01838a85, 0x002c09b6, 0x0052d8b5, 0x0039a246, 0x01013ee9, 0x0276ce77, 0x0314a827, 0x013353b9, 0x000f6a26}}}, + {X: Field{[10]uint32{0x0222579d, 0x00024dec, 0x039a54db, 0x01933125, 0x035c55b6, 0x0094acde, 0x00476335, 0x02c410e6, 0x02ea3ca8, 0x00132bd3}}, Y: Field{[10]uint32{0x011607bb, 0x01c7358a, 0x01464621, 0x00013034, 0x0345a191, 0x01c75628, 0x03885807, 0x02f701f3, 0x03320a93, 0x00030999}}}, + {X: Field{[10]uint32{0x027b1ca4, 0x029f2127, 0x0306bb7e, 0x03e086a1, 0x01b52960, 0x01478e0e, 0x0324ee4e, 0x020f0cea, 0x02905b34, 0x00215f07}}, Y: Field{[10]uint32{0x0269dd80, 0x02456ebf, 0x00c01be5, 0x03f7a6d0, 0x011c6b09, 0x028b9af1, 0x018380c4, 0x021dc6cd, 0x010c7a57, 0x00235ba7}}}, + {X: Field{[10]uint32{0x00b5a182, 0x03b4b06f, 0x0322c1e7, 0x02925a1a, 0x0310ec39, 0x0372e8f2, 0x00fc1248, 0x03deb69a, 0x030be0db, 0x001043bd}}, Y: Field{[10]uint32{0x007f9e94, 0x02e508c9, 0x03db3b7c, 0x01e6023f, 0x00e6925d, 0x002d2970, 0x03074aee, 0x015bd73b, 0x02a3331a, 0x00349ba7}}}, + {X: Field{[10]uint32{0x0351029f, 0x00410655, 0x03f7a307, 0x03e69f98, 0x0289dff6, 0x01ea90c6, 0x03e5ec30, 0x03ac4205, 0x03a8c831, 0x00232be1}}, Y: Field{[10]uint32{0x03c8890a, 0x02421c99, 0x02058bfe, 0x001cf176, 0x0113aad2, 0x030e9192, 0x0265ba07, 0x029b0f23, 0x02e1c8dd, 0x000fc2f5}}}, + {X: Field{[10]uint32{0x02f10e8e, 0x01b57ebf, 0x037798c1, 0x022ffee6, 0x01b35ca1, 0x034c53ec, 0x026a8a39, 0x00920d52, 0x02cfe92d, 0x003bb7b8}}, Y: Field{[10]uint32{0x0114c4c3, 0x02cd6ab9, 0x01624c1e, 0x03259e4f, 0x009fcd12, 0x03e73877, 0x031181f3, 0x02fbf92c, 0x02b021f0, 0x0032d456}}}, + {X: Field{[10]uint32{0x02ebcee1, 0x03bb2bca, 0x00312f02, 0x01d5d135, 0x0248bb2a, 0x0045b6d4, 0x02d6a4e9, 0x02dfddee, 0x02c71e77, 0x00232fde}}, Y: Field{[10]uint32{0x039b7320, 0x028b015d, 0x03799169, 0x01fc36da, 0x02b6f669, 0x0034258d, 0x017f97c3, 0x009ad4f4, 0x0331f67b, 0x001d9712}}}, + {X: Field{[10]uint32{0x00995db2, 0x03f19c95, 0x02dfcc19, 0x032e6190, 0x02715dc6, 0x00380448, 0x03f0627f, 0x026abcd3, 0x01b4cd44, 0x001c3351}}, Y: Field{[10]uint32{0x03535c8e, 0x00314e0b, 0x00c4120f, 0x036442d8, 0x02ee184a, 0x02b685b1, 0x0320eac3, 0x025ec610, 0x00567614, 0x0020b965}}}, + {X: Field{[10]uint32{0x007c45d5, 0x00bf7edb, 0x002ea070, 0x011b83d1, 0x03050e51, 0x00defb0f, 0x039d558e, 0x033f6479, 0x03f9783f, 0x0033f885}}, Y: Field{[10]uint32{0x01c419d5, 0x03dc1e65, 0x00dfc7b6, 0x02185eed, 0x00da2251, 0x0231f0eb, 0x03d70d87, 0x00feff15, 0x010e8645, 0x0014df2f}}}, + {X: Field{[10]uint32{0x00579d52, 0x005e43d2, 0x0317e065, 0x032c4afc, 0x01ccabd2, 0x033ebe9c, 0x033d4f74, 0x02ee38af, 0x00df6486, 0x002609b0}}, Y: Field{[10]uint32{0x01c57342, 0x005cb76e, 0x02da734f, 0x015e353b, 0x02ae3bb4, 0x03f0db45, 0x0349c052, 0x01894f4d, 0x0186f86d, 0x000f6fcd}}}, + {X: Field{[10]uint32{0x028a02c4, 0x013d65b8, 0x00e74d0f, 0x037d5db2, 0x00a13e13, 0x01d13a71, 0x033fa3e3, 0x012f0b1a, 0x00ef381b, 0x003a863f}}, Y: Field{[10]uint32{0x0209f397, 0x03f9a7fb, 0x01874d7f, 0x02931074, 0x02041c9a, 0x016568c2, 0x0103c7fe, 0x01175e1c, 0x039d2bc4, 0x0030f9af}}}, + {X: Field{[10]uint32{0x026d8f4a, 0x033e433f, 0x033a0e88, 0x01759cc0, 0x0221b82e, 0x02705bfe, 0x00618bec, 0x01695187, 0x0065c09d, 0x001b78b1}}, Y: Field{[10]uint32{0x004ee2ba, 0x01973caf, 0x03f5d28b, 0x02c0ca02, 0x03e1c4cc, 0x00ec87d6, 0x00a8199d, 0x0220ad0a, 0x03d28950, 0x000d9eb2}}}, + {X: Field{[10]uint32{0x02183f4e, 0x03e9cfc6, 0x0284706f, 0x01a27bf4, 0x03cecc9c, 0x03469505, 0x0250f803, 0x031f516b, 0x0213ee10, 0x00358a1b}}, Y: Field{[10]uint32{0x02a56f56, 0x004fa4da, 0x008ad37f, 0x024d5f6e, 0x01e965ab, 0x0320a790, 0x023ca411, 0x013a271f, 0x03b75520, 0x001eae4a}}}, + {X: Field{[10]uint32{0x03c3bf58, 0x020f7dc8, 0x0364dfce, 0x0187bcf0, 0x0173f0c8, 0x036dbc82, 0x0125962f, 0x01182895, 0x02faea67, 0x001d49b9}}, Y: Field{[10]uint32{0x00e3a674, 0x023d2306, 0x01ae8f00, 0x02b04b8d, 0x0125a21f, 0x02cc8dd4, 0x0274411c, 0x01846f4c, 0x00e0d5a8, 0x000b1daa}}}, + {X: Field{[10]uint32{0x0079308d, 0x0141c3e2, 0x00b2ab78, 0x000e24fa, 0x02e737c8, 0x0067d47d, 0x01d5d897, 0x0128f5b4, 0x02da56d6, 0x003f32aa}}, Y: Field{[10]uint32{0x039362d1, 0x0171aa11, 0x03d7d868, 0x034ff9b9, 0x01a2ee95, 0x025a7eae, 0x01750efa, 0x03de4bbf, 0x01663fac, 0x002098b1}}}, + {X: Field{[10]uint32{0x01b57fe3, 0x012c4556, 0x0088afef, 0x02a2ce9a, 0x03bd6d91, 0x028e5e11, 0x00483797, 0x017d0f31, 0x03b8eb8a, 0x002d8344}}, Y: Field{[10]uint32{0x00ebaa54, 0x033e0e18, 0x038ae94e, 0x014cdd56, 0x038405b0, 0x032217c7, 0x0104acbe, 0x021615d8, 0x02be5d2b, 0x002afdcf}}}, + {X: Field{[10]uint32{0x0377f8be, 0x039b3a30, 0x02d90127, 0x019b7ea8, 0x014250fd, 0x00de7e49, 0x016d2c14, 0x0361cbff, 0x030f4a0d, 0x000ccb52}}, Y: Field{[10]uint32{0x03c6232b, 0x021f3cc6, 0x02354b78, 0x033761f3, 0x03110dfa, 0x0382c5fa, 0x0333d7d9, 0x00d42fd0, 0x014347c2, 0x0000dfcc}}}, + {X: Field{[10]uint32{0x00c5788f, 0x03be1ed3, 0x0394e52d, 0x0082d556, 0x025d0216, 0x01ef44e3, 0x020e8803, 0x0358cc07, 0x02e62ce6, 0x003a66cb}}, Y: Field{[10]uint32{0x025546bc, 0x01210593, 0x03c6d2c0, 0x030ae469, 0x00e2858d, 0x02ecf954, 0x031df268, 0x032a7db7, 0x02fedabc, 0x00327a81}}}, + {X: Field{[10]uint32{0x01c54353, 0x0015b712, 0x033b1dfb, 0x0247a015, 0x005af241, 0x01c666f7, 0x02692a1d, 0x01ebb9ff, 0x00382a97, 0x00227ab5}}, Y: Field{[10]uint32{0x01994ece, 0x003e6bf6, 0x0319c2de, 0x00efaf97, 0x0107fec4, 0x02dc042b, 0x0167f706, 0x01ddb0aa, 0x01cedb2d, 0x002d5cb7}}}, + {X: Field{[10]uint32{0x0198268f, 0x021ed3b5, 0x01488595, 0x03fec243, 0x004777ba, 0x0231d016, 0x006f6fa9, 0x0104fc2d, 0x018e529b, 0x000336b6}}, Y: Field{[10]uint32{0x03ed034e, 0x03ba0c2f, 0x00cac3ef, 0x0205e22c, 0x02ceabc2, 0x0087e1e1, 0x00f10db8, 0x0398e51c, 0x015e0543, 0x0035016a}}}, + {X: Field{[10]uint32{0x02ee2cc3, 0x00a43921, 0x00f5be41, 0x0275783d, 0x02c26984, 0x0330c502, 0x03f69ad3, 0x00ccaf99, 0x03411cc1, 0x001425bb}}, Y: Field{[10]uint32{0x03f8268a, 0x0114d0dc, 0x02bb418c, 0x029bcb51, 0x0149ef34, 0x0029ecfc, 0x021f3123, 0x02c1afb5, 0x029fccd4, 0x001fcce1}}}, + {X: Field{[10]uint32{0x00a5be61, 0x03d838a9, 0x00dbb8b9, 0x03b58e3b, 0x038c4d59, 0x0322fa61, 0x007253a2, 0x019cd218, 0x0270a096, 0x002f02fa}}, Y: Field{[10]uint32{0x02873b78, 0x03883345, 0x03320873, 0x03c0a777, 0x01054d1f, 0x01b1309d, 0x0286129e, 0x01382c12, 0x01ac3c2b, 0x00386444}}}, + {X: Field{[10]uint32{0x03223ec1, 0x014500e1, 0x007a7dc4, 0x02297210, 0x03b024bb, 0x02a9f5d1, 0x00674d38, 0x01682038, 0x0169ac8f, 0x000b4599}}, Y: Field{[10]uint32{0x019a597a, 0x006f5df8, 0x038f73dd, 0x021f8888, 0x01445c15, 0x03bb1396, 0x027d92d4, 0x01a97c4a, 0x03386221, 0x00122bc6}}}, + {X: Field{[10]uint32{0x0145ba30, 0x03a2dfe0, 0x01d40f27, 0x037f8f3c, 0x012947cd, 0x01bb1ded, 0x00e37b32, 0x00454377, 0x03aebb8b, 0x002e32f3}}, Y: Field{[10]uint32{0x00823ca4, 0x01bf76cd, 0x01a0562b, 0x03ef357d, 0x00ffc2c3, 0x021a287a, 0x030ec022, 0x034b7218, 0x00ab8b2a, 0x003548d3}}}, + {X: Field{[10]uint32{0x00960ee7, 0x02abb1b7, 0x02a227a9, 0x02f9823b, 0x01fb2e3e, 0x006b0676, 0x01db9c0f, 0x004bd377, 0x0092563f, 0x003ece58}}, Y: Field{[10]uint32{0x01823c45, 0x02798bb2, 0x0395358c, 0x02ec1a50, 0x01646e88, 0x00bac07a, 0x027f661c, 0x028e50f4, 0x01dffda1, 0x00197959}}}, + {X: Field{[10]uint32{0x0014b297, 0x03fe9529, 0x0022580a, 0x03b88400, 0x02f8da06, 0x02c89d2c, 0x0225150d, 0x0337ea41, 0x01760b8d, 0x00071ba7}}, Y: Field{[10]uint32{0x01666255, 0x02f0bbe9, 0x00057607, 0x02e5e35d, 0x0085679f, 0x02fb62c4, 0x026edcbb, 0x02c2c151, 0x010d009a, 0x001c1ad1}}}, + {X: Field{[10]uint32{0x01fca1c3, 0x0180d46e, 0x00277dc6, 0x00355578, 0x0377f55a, 0x026173b2, 0x0166b13d, 0x03fc39b9, 0x01c146ec, 0x000b810f}}, Y: Field{[10]uint32{0x026d8398, 0x01c7915c, 0x00e1428a, 0x0000aab1, 0x03665da5, 0x02429eaf, 0x011103b0, 0x03abc281, 0x01caf75c, 0x0000713c}}}, + {X: Field{[10]uint32{0x005f482f, 0x002f2696, 0x0192cb4b, 0x03b8b625, 0x019549f9, 0x025f5e15, 0x023ee12d, 0x023a4399, 0x030ca1bf, 0x0016b85e}}, Y: Field{[10]uint32{0x00fc8111, 0x008daf2d, 0x031c716f, 0x02b6235c, 0x03a71806, 0x03a3969d, 0x006966c1, 0x0002f1cf, 0x03349317, 0x002ec37d}}}, + {X: Field{[10]uint32{0x03caafc4, 0x023d1a29, 0x0271c1b0, 0x037f241a, 0x00fca910, 0x01d7b6a5, 0x0011c46e, 0x030f974f, 0x03426a24, 0x003ea2fc}}, Y: Field{[10]uint32{0x035954e2, 0x02b6930b, 0x000435dc, 0x03e795f0, 0x014e2884, 0x016cf3c1, 0x01e6c846, 0x03ef678d, 0x017cdb07, 0x00329a60}}}, + {X: Field{[10]uint32{0x011a88a4, 0x0016bee6, 0x003cb0f9, 0x02d779c2, 0x011e1031, 0x00fd0e53, 0x01f67aea, 0x035fdee7, 0x01c1846d, 0x000b37fc}}, Y: Field{[10]uint32{0x0376f39e, 0x03fcf8bb, 0x00d3b507, 0x023e3959, 0x016ea0d8, 0x038c11c4, 0x00530fed, 0x0390adf4, 0x024f3827, 0x0012ef5c}}}, + {X: Field{[10]uint32{0x013b6905, 0x02ccc8a7, 0x02df95f5, 0x02472a50, 0x01c5bb82, 0x019413e2, 0x01f82b29, 0x0127b2bf, 0x000055ca, 0x001beb6f}}, Y: Field{[10]uint32{0x00b7df62, 0x03d5fbd5, 0x02868c06, 0x014fd64f, 0x03911a30, 0x03104645, 0x02f94728, 0x020c9a95, 0x0184033a, 0x003dd9c4}}}, + {X: Field{[10]uint32{0x00dd0841, 0x0280392e, 0x01fca2f5, 0x00184964, 0x026f4a1e, 0x0357aa34, 0x02b15f55, 0x02a90373, 0x015a2f26, 0x0031451a}}, Y: Field{[10]uint32{0x0113266c, 0x014a0eac, 0x03a6e800, 0x02c45b63, 0x01652905, 0x00ff13bc, 0x01375677, 0x02c1aa42, 0x02082e78, 0x001415ae}}}, + {X: Field{[10]uint32{0x037ff933, 0x004785b2, 0x0306466c, 0x03bbf747, 0x01aad758, 0x03862304, 0x00368dd3, 0x013e1553, 0x00d49347, 0x0020f72e}}, Y: Field{[10]uint32{0x030a53c7, 0x022f6118, 0x02288e9f, 0x03ec3987, 0x030d6ed6, 0x004679e7, 0x027a029e, 0x01c649f1, 0x033d04e5, 0x00041396}}}, + {X: Field{[10]uint32{0x00c8a93f, 0x032aec7f, 0x01127a8b, 0x0208b8ac, 0x015f9ae8, 0x01597e6a, 0x03690890, 0x002c990e, 0x038acf9a, 0x002f1973}}, Y: Field{[10]uint32{0x00fb2143, 0x030a4a85, 0x039c3ae9, 0x03045569, 0x0023ff28, 0x019a66de, 0x000ac90f, 0x03741a82, 0x016ba31d, 0x003f7e5c}}}, + {X: Field{[10]uint32{0x009f140b, 0x0272f493, 0x0153c1e0, 0x035901c3, 0x02695e37, 0x016b4de8, 0x0174b476, 0x004a904b, 0x03a9520b, 0x00121de3}}, Y: Field{[10]uint32{0x029c373e, 0x0328875d, 0x01b39fbe, 0x0316cb8d, 0x01446dd3, 0x03146d1a, 0x03b4c02b, 0x016500e1, 0x0005bec1, 0x00337192}}}, + {X: Field{[10]uint32{0x0301dc25, 0x019f77e8, 0x006e841f, 0x02d4cb46, 0x0328077b, 0x03b5a1cf, 0x01c88312, 0x01621a3b, 0x002c6a73, 0x00276cb1}}, Y: Field{[10]uint32{0x03b3a0dc, 0x024098af, 0x00ac8569, 0x0351e1b4, 0x00aa0ac5, 0x01a8c96c, 0x0193e064, 0x02d17b84, 0x0235ec9d, 0x0038072c}}}, + {X: Field{[10]uint32{0x00f8da6b, 0x0201cd27, 0x012aefb2, 0x023c925b, 0x03037c6c, 0x015ac9ff, 0x021ef442, 0x0009690e, 0x018f62bf, 0x0032f3fd}}, Y: Field{[10]uint32{0x03b1896d, 0x0379b94e, 0x01da2818, 0x006f0440, 0x0128f533, 0x00784daf, 0x029251fe, 0x009d4c0e, 0x02d52da3, 0x0013f667}}}, + {X: Field{[10]uint32{0x034f3639, 0x019c94db, 0x00270933, 0x03ce45e2, 0x02070cbc, 0x00ec77e5, 0x03a12a29, 0x02311605, 0x039787e6, 0x00275482}}, Y: Field{[10]uint32{0x02bc0f14, 0x027b3bed, 0x036bb22d, 0x001e763e, 0x01041fec, 0x028c9589, 0x01885ca0, 0x02625764, 0x015d2b53, 0x00185784}}}, + {X: Field{[10]uint32{0x0225dbbd, 0x01a8d064, 0x02e7b3ef, 0x00f7e0ec, 0x024b0bfd, 0x02331b5b, 0x023d1820, 0x030af2f0, 0x01c40057, 0x00319237}}, Y: Field{[10]uint32{0x018ab3d8, 0x029fef14, 0x02caf209, 0x0187705f, 0x01ec16fe, 0x019e8f67, 0x0347e99e, 0x00659a6e, 0x006338dd, 0x0002b26a}}}, + {X: Field{[10]uint32{0x002137dc, 0x0259187a, 0x0229a7e5, 0x00a5ed17, 0x02b80ead, 0x0248877b, 0x01e3f1e7, 0x03dd9ebf, 0x0035ea96, 0x002b847e}}, Y: Field{[10]uint32{0x00452596, 0x0085e393, 0x01a15c2a, 0x0395397e, 0x034c5dfe, 0x00654eb2, 0x016e1b5f, 0x018bca26, 0x03ecb65a, 0x0008114e}}}, + {X: Field{[10]uint32{0x0364d46f, 0x00a03428, 0x00fec029, 0x03f8d970, 0x000699f6, 0x023bd44a, 0x03b9293d, 0x02993748, 0x01ad56f8, 0x0028d552}}, Y: Field{[10]uint32{0x03fbbe75, 0x0335b842, 0x00868f11, 0x02480f19, 0x008f55a2, 0x01fffb38, 0x015ffce1, 0x026604c0, 0x01cba38c, 0x00321010}}}, + {X: Field{[10]uint32{0x035f8077, 0x011c25f8, 0x03a649c3, 0x0020351c, 0x022aad83, 0x01f6b226, 0x01bfaef3, 0x01d78423, 0x0029af55, 0x001d61dc}}, Y: Field{[10]uint32{0x03c2b8b6, 0x02a173d7, 0x0165b2e5, 0x01d085b3, 0x01603cd6, 0x005df31a, 0x02437620, 0x0146efb4, 0x0097d198, 0x00210ec1}}}, + {X: Field{[10]uint32{0x02d4ea99, 0x0181fecc, 0x031ca917, 0x03a43cba, 0x01ae00b9, 0x00f94cb0, 0x027b1f68, 0x03f54311, 0x0168ca7f, 0x00113b8c}}, Y: Field{[10]uint32{0x012c3270, 0x00fadff2, 0x001411e7, 0x038e6e5b, 0x03022564, 0x024443bb, 0x01a9f9a0, 0x01684efb, 0x02a8120b, 0x00042883}}}, + {X: Field{[10]uint32{0x025337d4, 0x02dbd99e, 0x007d6477, 0x02550b2c, 0x01461e45, 0x00eee632, 0x0278f92f, 0x02bc2e41, 0x00898daf, 0x0026804f}}, Y: Field{[10]uint32{0x023c2a73, 0x012e87f6, 0x0205e877, 0x03c7fd4c, 0x03fec396, 0x017367f2, 0x009b773f, 0x008e939b, 0x005ac966, 0x00047e12}}}, + {X: Field{[10]uint32{0x02b47d5c, 0x01cf5a6d, 0x01bea83e, 0x005cae2d, 0x013fa12d, 0x03d42cd2, 0x0019a615, 0x01060882, 0x00a144d5, 0x002d178a}}, Y: Field{[10]uint32{0x02c29f4b, 0x01b0c1a4, 0x00ae45b7, 0x0248256f, 0x03fb1c20, 0x00e65c94, 0x03f1dec4, 0x0334877f, 0x0383ccda, 0x003661f6}}}, + {X: Field{[10]uint32{0x0241a0c9, 0x000f4d69, 0x02603cdc, 0x0014074a, 0x009a6592, 0x004064be, 0x0065d073, 0x016222a2, 0x02534984, 0x00279f5a}}, Y: Field{[10]uint32{0x00f462d9, 0x00052615, 0x033233c0, 0x02f2c87e, 0x02ce5f1f, 0x0134702c, 0x03e5690b, 0x027e9fd5, 0x00edace2, 0x003285dd}}}, + {X: Field{[10]uint32{0x00991f47, 0x03fa90d5, 0x00b01b9a, 0x01023bc5, 0x03e433a9, 0x02017058, 0x03b306d5, 0x0184f159, 0x0029be1b, 0x00044e85}}, Y: Field{[10]uint32{0x03928697, 0x005159de, 0x023c7500, 0x0006454a, 0x000321e8, 0x01478e17, 0x0191ec1a, 0x032ee124, 0x01fa6d26, 0x000897b9}}}, + {X: Field{[10]uint32{0x018d9181, 0x01575c50, 0x03964776, 0x029b4375, 0x016d6eb0, 0x01ac017a, 0x01e2597f, 0x02177e4c, 0x01d102cf, 0x000cbb23}}, Y: Field{[10]uint32{0x03f9d8b9, 0x035eeeeb, 0x022ab00d, 0x001786a8, 0x003423bc, 0x0310c1d9, 0x02f7f4d9, 0x0392966f, 0x01d078b3, 0x003f5c63}}}, + {X: Field{[10]uint32{0x02e9246e, 0x0063a45c, 0x03865b12, 0x01c3bd1d, 0x01b145db, 0x018547e2, 0x021a5f14, 0x036b9017, 0x0267f2ce, 0x002b690c}}, Y: Field{[10]uint32{0x007cf82c, 0x038352c9, 0x00a541f3, 0x021b0acb, 0x0116e396, 0x02c11d1a, 0x0315c578, 0x0134a7e7, 0x02e04d1f, 0x0034522f}}}, + {X: Field{[10]uint32{0x01bf0cbe, 0x02e611e5, 0x006bbbf7, 0x001c805f, 0x0265f5ca, 0x036e8694, 0x03e662be, 0x01d29a47, 0x02bedebd, 0x00206282}}, Y: Field{[10]uint32{0x009c0a53, 0x006738c2, 0x03bc8da7, 0x00ee4240, 0x030ac0f0, 0x0389cede, 0x008da9bc, 0x00b1cda6, 0x006a0187, 0x0039ecb4}}}, + {X: Field{[10]uint32{0x010b3c94, 0x02fa041f, 0x02f14d80, 0x01b7cb44, 0x02ae7602, 0x0165bc27, 0x00c1a1bf, 0x03684201, 0x0355ef77, 0x000bd27a}}, Y: Field{[10]uint32{0x02038b83, 0x0138e0cf, 0x02ffa569, 0x01ae00b2, 0x011a7903, 0x01b533b4, 0x0289aa1e, 0x004463ad, 0x0010002f, 0x001a8896}}}, + {X: Field{[10]uint32{0x02faf74a, 0x0314d4de, 0x0278ba5c, 0x031e61b1, 0x02bf66d5, 0x03b6f457, 0x02f8029b, 0x00097daf, 0x017054cb, 0x001ff953}}, Y: Field{[10]uint32{0x00ad89b0, 0x025b042d, 0x03695022, 0x03f76dd5, 0x00a47a82, 0x02462155, 0x016afb66, 0x0198c9b4, 0x03ec72ac, 0x003f7185}}}, + {X: Field{[10]uint32{0x02ed2689, 0x028fdd63, 0x0131956a, 0x02eb7bb0, 0x03411ec9, 0x02e71575, 0x01b8675d, 0x02128327, 0x03662b82, 0x00213d64}}, Y: Field{[10]uint32{0x02cd0d88, 0x0263a0c2, 0x01dfe4de, 0x024bd07b, 0x01480425, 0x01144722, 0x01119c4c, 0x01bb5e09, 0x01d96bef, 0x0020db99}}}, + {X: Field{[10]uint32{0x0185ee1b, 0x029bed50, 0x01f52da0, 0x004978ad, 0x00a46b16, 0x033326ff, 0x02eb6b71, 0x02083781, 0x00301a84, 0x003242aa}}, Y: Field{[10]uint32{0x010dc8df, 0x00d48dfe, 0x02efb161, 0x01276489, 0x01cc2134, 0x02671628, 0x031e05cd, 0x01760a4c, 0x03c00b28, 0x003aa1b5}}}, + {X: Field{[10]uint32{0x012ef100, 0x01f65b86, 0x00addc05, 0x02b673f7, 0x018669b2, 0x00d850aa, 0x03047ef6, 0x0126f9a7, 0x0176abae, 0x003fed35}}, Y: Field{[10]uint32{0x03ec6c7a, 0x024406ed, 0x0012080a, 0x01b6948e, 0x013d9596, 0x0203daa3, 0x02700e4c, 0x038060ce, 0x0114b2d5, 0x000dd033}}}, + {X: Field{[10]uint32{0x01403de0, 0x01e3f2b3, 0x00a3c08b, 0x0174b0cf, 0x0312c24b, 0x026bfbff, 0x03ebb618, 0x01af33ad, 0x018967ad, 0x001022a3}}, Y: Field{[10]uint32{0x01caecf3, 0x02f391f8, 0x013a2cdc, 0x015ff58c, 0x014acd35, 0x007605c7, 0x00fb66ff, 0x0310ba8a, 0x03a6378c, 0x000edd87}}}, + {X: Field{[10]uint32{0x0053b787, 0x0120ba1f, 0x027123e3, 0x013c60c9, 0x006c80c0, 0x006c2ac1, 0x01e27e3f, 0x00276ff7, 0x03f61531, 0x0016028c}}, Y: Field{[10]uint32{0x0028431a, 0x00d4f039, 0x02dd801d, 0x028d58e6, 0x02f70a33, 0x025c0bfd, 0x01ac5ae6, 0x020783a6, 0x03c3fddc, 0x002ee01c}}}, + {X: Field{[10]uint32{0x0344130f, 0x039e27e0, 0x018c2505, 0x036ce31a, 0x014c7860, 0x020d26b4, 0x02b11008, 0x03332b11, 0x02947054, 0x000b4c42}}, Y: Field{[10]uint32{0x023db697, 0x0237204f, 0x02a9a5d2, 0x0168b89a, 0x022df187, 0x0244f643, 0x011be0a0, 0x03243a70, 0x029c3c6e, 0x0007a881}}}, + {X: Field{[10]uint32{0x027aa450, 0x008c7e1a, 0x03b32985, 0x009091a5, 0x015d82b4, 0x02e0d6bb, 0x022f2e3a, 0x0072b4fc, 0x002be7b1, 0x000a1d0a}}, Y: Field{[10]uint32{0x00415c42, 0x008c5c7c, 0x02b74cfa, 0x000c87c9, 0x02cf39ce, 0x0107642e, 0x02e3860e, 0x02e48888, 0x032db2e1, 0x0000a18c}}}, + {X: Field{[10]uint32{0x036231cf, 0x01b9007a, 0x02ea48b3, 0x016e54c3, 0x016940f8, 0x00adde60, 0x02f5e418, 0x03ce8042, 0x039ff77b, 0x002be79d}}, Y: Field{[10]uint32{0x00e84c67, 0x03dd5066, 0x03389c13, 0x020eac7f, 0x034deb70, 0x01b5ae23, 0x01d958b8, 0x0057249a, 0x0350dbaf, 0x00274f50}}}, + {X: Field{[10]uint32{0x008c1ef3, 0x00740d5a, 0x01b35447, 0x02302998, 0x00bc93ad, 0x00ec9de3, 0x03d27577, 0x029cd49b, 0x038d515c, 0x001117b6}}, Y: Field{[10]uint32{0x0090dc49, 0x0193c95c, 0x002f555d, 0x0269154e, 0x02e94b75, 0x03cda84f, 0x03743611, 0x018be0ed, 0x023cfde7, 0x0025245e}}}, + {X: Field{[10]uint32{0x001811b4, 0x01d4049c, 0x012aa0dc, 0x02e8ad98, 0x013e76fe, 0x01fb0d34, 0x009993cf, 0x014c183e, 0x020a370d, 0x00380430}}, Y: Field{[10]uint32{0x006fd8af, 0x03d93fc4, 0x023cee3a, 0x009bc857, 0x03798a64, 0x032cf311, 0x0157a214, 0x026f814b, 0x032d280d, 0x0032d145}}}, + {X: Field{[10]uint32{0x025af8f9, 0x0108d4ab, 0x033f9eed, 0x00ed9eed, 0x02ef548b, 0x03ed1334, 0x0134080c, 0x031f96c4, 0x03ca4625, 0x0034d09d}}, Y: Field{[10]uint32{0x03e4a4df, 0x03963235, 0x02b441ec, 0x026b389e, 0x02c39190, 0x038fd13b, 0x037bd609, 0x023dfaec, 0x03797a62, 0x0028d7d5}}}, + {X: Field{[10]uint32{0x031d628d, 0x017bb2b2, 0x01c5dd66, 0x030f27ec, 0x03d96182, 0x0291ccf8, 0x004977fe, 0x010906da, 0x03993bd5, 0x002f82e4}}, Y: Field{[10]uint32{0x03b7fdb8, 0x016fa103, 0x009dadbf, 0x003c17ec, 0x0013218b, 0x03b10626, 0x03762728, 0x0349a837, 0x0353744e, 0x000de410}}}, + {X: Field{[10]uint32{0x018f3980, 0x00b0c67f, 0x0309dc3b, 0x00d3a04b, 0x01edd9bd, 0x01ad0a0a, 0x019f48fd, 0x0087a47b, 0x01f1ed4a, 0x000c20a5}}, Y: Field{[10]uint32{0x02ac0230, 0x02975fab, 0x00181a8b, 0x00d225f1, 0x030797d4, 0x03b93328, 0x0214c314, 0x00386926, 0x034d5c36, 0x001a0d70}}}, + {X: Field{[10]uint32{0x00495b1a, 0x0236ccb7, 0x03b412b8, 0x01799a8d, 0x01c2e07a, 0x0043d7e9, 0x0391604e, 0x021e77f5, 0x035161aa, 0x0019b3fa}}, Y: Field{[10]uint32{0x0252a1e1, 0x03e726cc, 0x03fe3f9f, 0x0317edba, 0x025ffba9, 0x0120ef09, 0x0229602b, 0x03f004f8, 0x029bf8a2, 0x0028381e}}}, + {X: Field{[10]uint32{0x03e39ba4, 0x02168b5b, 0x03648ec8, 0x03be6d57, 0x01bf7b3a, 0x00d29284, 0x03b3d9d3, 0x03a9c133, 0x00fb849c, 0x0003d0ae}}, Y: Field{[10]uint32{0x01e8b22f, 0x03458298, 0x019a7036, 0x012af27c, 0x01f5b0fb, 0x034e06b8, 0x035db65d, 0x012bfe7d, 0x01e2a36d, 0x002d8188}}}, + {X: Field{[10]uint32{0x03ab034f, 0x00c4952f, 0x008e385a, 0x03698233, 0x00c57b7f, 0x0199be3d, 0x00fdc462, 0x018c8cbb, 0x03852290, 0x0010a705}}, Y: Field{[10]uint32{0x0162af35, 0x02605aca, 0x001f18e6, 0x027aaf25, 0x0250b396, 0x0206a813, 0x03bfcb04, 0x023d5d02, 0x02591a86, 0x0038642e}}}, + {X: Field{[10]uint32{0x01ebf611, 0x037dee03, 0x03d7dfaf, 0x0215bf19, 0x009895b9, 0x02cde3b9, 0x01e4237f, 0x026832e5, 0x017c9478, 0x003224e7}}, Y: Field{[10]uint32{0x00ad3682, 0x003e07c7, 0x022b0437, 0x01fa6c57, 0x0047feb7, 0x0018b4b5, 0x02d05e23, 0x01185f0d, 0x036206e9, 0x00050ebf}}}, + {X: Field{[10]uint32{0x0398ef94, 0x01bcf310, 0x00cfb1d3, 0x02de370f, 0x022b82ae, 0x010ab607, 0x0215ae41, 0x00c90c93, 0x01bf5630, 0x00179055}}, Y: Field{[10]uint32{0x035da55a, 0x03d3fd7a, 0x03b75ed6, 0x019080fc, 0x01b90833, 0x005b5d09, 0x033807f2, 0x028ee6a7, 0x01272325, 0x001a007d}}}, + {X: Field{[10]uint32{0x00d1b573, 0x036f4fc2, 0x0165b5e9, 0x00c181e2, 0x03eb01c5, 0x01c45388, 0x03fa851a, 0x024ef9ee, 0x019853f0, 0x000465ac}}, Y: Field{[10]uint32{0x00628795, 0x015ff4af, 0x0297e5c5, 0x03b7fbc2, 0x00fe79dc, 0x0060f6d1, 0x00dea44d, 0x03b88360, 0x00f054bf, 0x00001e53}}}, + {X: Field{[10]uint32{0x033a6094, 0x00dbb4b1, 0x03a1dea8, 0x017dadda, 0x0339803e, 0x01a00c38, 0x038fcd01, 0x01cdedf6, 0x012074bb, 0x00360636}}, Y: Field{[10]uint32{0x0176e504, 0x01bc5e40, 0x00afe9d9, 0x006fed33, 0x02ff15d5, 0x02d7c21b, 0x00d2aacf, 0x00462a03, 0x03b51f63, 0x001ab1f6}}}, + {X: Field{[10]uint32{0x006c6204, 0x02d193ec, 0x02d8851d, 0x00b6c9cf, 0x01703904, 0x02b97262, 0x01a433ee, 0x02afa7b6, 0x034bf5cc, 0x003009da}}, Y: Field{[10]uint32{0x00f4756b, 0x00bbf289, 0x02cc5fd5, 0x03526cfe, 0x00972593, 0x02160548, 0x001a582a, 0x02b20752, 0x00ae6349, 0x0012249c}}}, + {X: Field{[10]uint32{0x01d83307, 0x00d0f5f3, 0x00a7a0d3, 0x00187136, 0x020b8989, 0x00f42c92, 0x01b300b4, 0x0334c3ae, 0x021cca23, 0x000252ca}}, Y: Field{[10]uint32{0x02481df1, 0x014c0be7, 0x00640607, 0x020e6694, 0x02e6e746, 0x020ce2e7, 0x01608015, 0x02f7296e, 0x0156b709, 0x0011f17b}}}, + {X: Field{[10]uint32{0x027d5108, 0x01a21dab, 0x0195a668, 0x00af4d16, 0x009f157d, 0x030a3ed9, 0x021c3850, 0x03d53b92, 0x0379df2b, 0x003cabb8}}, Y: Field{[10]uint32{0x01c8ef08, 0x00b7558d, 0x0231113f, 0x023ef55a, 0x0319a7bf, 0x019dbbbe, 0x0079d351, 0x0287e724, 0x03ae9c90, 0x002b9d9a}}}, + {X: Field{[10]uint32{0x029833ad, 0x01aee16e, 0x02222830, 0x028115b3, 0x01e81e4d, 0x018071aa, 0x029cd043, 0x0312cabe, 0x004f3dbd, 0x003f23f9}}, Y: Field{[10]uint32{0x0156fe15, 0x001d4e1b, 0x01094ce3, 0x017b3a31, 0x012b0765, 0x029420ae, 0x0330a52e, 0x014b5d90, 0x0378a98f, 0x001a8c86}}}, + {X: Field{[10]uint32{0x00255c14, 0x02d19393, 0x02b7c5b8, 0x012d60c3, 0x017444d0, 0x00b77043, 0x01aa3ebe, 0x03cf2fef, 0x017919a4, 0x0034e337}}, Y: Field{[10]uint32{0x008c15fa, 0x0195544b, 0x02e6f1a5, 0x0254776a, 0x03e19040, 0x0336baf9, 0x02311fe0, 0x00bf6e52, 0x02f1823a, 0x001a83c7}}}, + {X: Field{[10]uint32{0x01a4b41f, 0x011d4e02, 0x03f4c142, 0x00675ddc, 0x03916ea1, 0x009ad7a7, 0x0071943a, 0x021a4343, 0x02f6013d, 0x002b00b9}}, Y: Field{[10]uint32{0x005ea2b1, 0x00c6e9b0, 0x008f3995, 0x00650ddc, 0x03726598, 0x023f4bd9, 0x019c5e76, 0x013aaefb, 0x019e436b, 0x003ab712}}}, + {X: Field{[10]uint32{0x006419c8, 0x026dc074, 0x01177d7d, 0x01d47fd9, 0x02dc6d1a, 0x001dbe73, 0x03b5cd07, 0x03518ab1, 0x031ac36b, 0x0000e522}}, Y: Field{[10]uint32{0x011765ba, 0x02ee5746, 0x00bd2732, 0x0239de59, 0x0372d5d1, 0x0333ad87, 0x0141ea71, 0x000f1eac, 0x00eba01c, 0x0032a47f}}}, + {X: Field{[10]uint32{0x02706e9a, 0x00c65c5f, 0x0355435e, 0x034176f2, 0x02ea9e73, 0x03ff6210, 0x014c0c2c, 0x000369b7, 0x008d21d6, 0x00131f6f}}, Y: Field{[10]uint32{0x038230fe, 0x0305fd49, 0x0042d35d, 0x02f6336d, 0x016db46e, 0x01fdfa16, 0x002f4129, 0x01eaf4a7, 0x0344b87b, 0x0021a9df}}}, + {X: Field{[10]uint32{0x0244f623, 0x03847920, 0x01e0698e, 0x00c7677d, 0x01b7dec7, 0x001d0ec3, 0x038c2f7a, 0x0178b427, 0x01aab382, 0x001d48a3}}, Y: Field{[10]uint32{0x000a1676, 0x0086a21e, 0x01aa4510, 0x01949829, 0x0075e336, 0x034a0ba9, 0x0237bdfe, 0x03c41f6e, 0x0187e122, 0x00258f0a}}}, + {X: Field{[10]uint32{0x0280a579, 0x034b0ac3, 0x00147632, 0x00fc40b0, 0x02b584a7, 0x006de91e, 0x02ea92c7, 0x00587e3d, 0x02b32ed2, 0x002a8ea1}}, Y: Field{[10]uint32{0x024e6cb7, 0x01806b6b, 0x002abbc4, 0x03fddc8b, 0x03f7e517, 0x00409135, 0x01345d32, 0x03193c37, 0x009d2b4e, 0x002e3f89}}}, + {X: Field{[10]uint32{0x013f22f7, 0x034c5906, 0x0368abcf, 0x01f4f4f0, 0x014c0322, 0x035bcebe, 0x00b992f7, 0x000e7696, 0x012d9828, 0x001c0ae4}}, Y: Field{[10]uint32{0x02bac387, 0x039710b1, 0x0136f71d, 0x02e8e5ab, 0x02b576cc, 0x01c5331f, 0x00a4e14c, 0x0335e04c, 0x00493a32, 0x0009624b}}}, + {X: Field{[10]uint32{0x0090ba75, 0x034ed727, 0x03567829, 0x00ee3dbc, 0x01269f70, 0x00315c04, 0x0221dfc1, 0x02fe98a8, 0x00886d44, 0x00132843}}, Y: Field{[10]uint32{0x03fde3e7, 0x00fb3ed3, 0x034b9dac, 0x0089fc0d, 0x0395b04a, 0x00b5df6c, 0x01e6f277, 0x038d6353, 0x02b29282, 0x000cc8fa}}}, + {X: Field{[10]uint32{0x02b9c325, 0x0159ce24, 0x02d342da, 0x00d4ba51, 0x00f3601c, 0x0305d3bf, 0x00aa4362, 0x01a5c80b, 0x023630da, 0x0005867a}}, Y: Field{[10]uint32{0x030e881e, 0x029cbe43, 0x02de4b98, 0x025e471f, 0x03a1c126, 0x01237b5e, 0x0188dd61, 0x019e7a9b, 0x000e13b8, 0x0008ab45}}}, + {X: Field{[10]uint32{0x034d3032, 0x02f4e634, 0x034c6365, 0x02ead941, 0x0064d589, 0x00c0be2b, 0x01409a8a, 0x02fed273, 0x003818de, 0x000877f7}}, Y: Field{[10]uint32{0x004099a9, 0x02c5f39e, 0x01c4579e, 0x00f885c9, 0x02106d19, 0x02d809b9, 0x006ddcdb, 0x0148129e, 0x02c20e83, 0x002eef9f}}}, + {X: Field{[10]uint32{0x01069fe1, 0x036f5021, 0x01bd1c0d, 0x00b82eec, 0x03036a47, 0x00b3383b, 0x02e99aa1, 0x006acb2e, 0x01dd802f, 0x00183ef9}}, Y: Field{[10]uint32{0x03349dc3, 0x02f94929, 0x013167f9, 0x02cade2c, 0x0399feb1, 0x015023c2, 0x03d07a68, 0x00135a0b, 0x03592dd3, 0x0003aa0e}}}, + {X: Field{[10]uint32{0x02147f96, 0x019db307, 0x0066ae29, 0x01e53712, 0x03dd7c24, 0x01650174, 0x008ee975, 0x0316eea1, 0x0065fdcd, 0x0032012d}}, Y: Field{[10]uint32{0x03adc5a2, 0x03bbbc96, 0x035223a7, 0x028b3e6e, 0x03fb10cc, 0x02e0a393, 0x02bf43a9, 0x00adc3af, 0x02b71fd8, 0x002a928b}}}, + {X: Field{[10]uint32{0x010336d9, 0x03674f75, 0x03b7bd96, 0x02ecc64b, 0x005c74cf, 0x030cbdb0, 0x011b3383, 0x00ed5771, 0x03e55137, 0x001de9b8}}, Y: Field{[10]uint32{0x006f047f, 0x0162dac3, 0x032b67d3, 0x01b8e15b, 0x035de35d, 0x03ff355c, 0x02075c10, 0x02b1c523, 0x026e86ef, 0x0008748c}}}, + {X: Field{[10]uint32{0x015f7a5a, 0x00758b43, 0x018c9473, 0x033d938f, 0x01a89d82, 0x01a93b19, 0x02706ff2, 0x03bb4999, 0x01874a72, 0x0021b770}}, Y: Field{[10]uint32{0x030cc29c, 0x03396ad3, 0x0295c443, 0x01781337, 0x0340507b, 0x028f9b72, 0x0217816b, 0x02848ea4, 0x0040ce45, 0x00147df3}}}, + {X: Field{[10]uint32{0x03d3beca, 0x025bcff1, 0x028ce4a5, 0x03be13a8, 0x038c80d5, 0x005578c9, 0x0108675a, 0x03ab11b0, 0x00f8db8e, 0x0033d274}}, Y: Field{[10]uint32{0x020086fc, 0x02e5b7d0, 0x02d41235, 0x02970c51, 0x007cdd64, 0x0186475a, 0x002dcd6a, 0x01d70fb6, 0x0341ebae, 0x001bff71}}}, + {X: Field{[10]uint32{0x035875f4, 0x0232d52d, 0x00381051, 0x01457f86, 0x00c9f5c8, 0x03849b3b, 0x020e8721, 0x019c88b5, 0x038957eb, 0x00075d7b}}, Y: Field{[10]uint32{0x038dbdb4, 0x027719ad, 0x033e37b9, 0x0095dd96, 0x01c20766, 0x03e8750a, 0x024ae2f5, 0x0158776f, 0x03dd9288, 0x0020b177}}}, + {X: Field{[10]uint32{0x03ad0689, 0x00b2a279, 0x036dca29, 0x038f1b76, 0x005bb5b7, 0x02540cd2, 0x00d94666, 0x01848a76, 0x0335f62e, 0x002fa92d}}, Y: Field{[10]uint32{0x03a08901, 0x0082b4c1, 0x0011cd8e, 0x00dbd4a8, 0x027cda58, 0x02df007c, 0x019a4517, 0x0278439f, 0x038a08ea, 0x002438c9}}}, + {X: Field{[10]uint32{0x0169f2bb, 0x00e5aa58, 0x037281af, 0x03c2ceb2, 0x02577f5c, 0x01756627, 0x010aaa27, 0x0145c063, 0x02dea90e, 0x003a16c2}}, Y: Field{[10]uint32{0x0250aaa8, 0x01fd6679, 0x03358066, 0x01a75020, 0x0230ef12, 0x015edfd6, 0x016fec57, 0x01d718e4, 0x00cd3ca1, 0x00350a5c}}}, + {X: Field{[10]uint32{0x03928934, 0x0390b628, 0x00f5e3ff, 0x0213008a, 0x0082ca55, 0x033df30b, 0x01ed550f, 0x00149b90, 0x02dd2405, 0x00365d64}}, Y: Field{[10]uint32{0x022d102e, 0x013713bf, 0x0126a217, 0x01149bcb, 0x024de0db, 0x0008dbd3, 0x01a3852a, 0x0070edd6, 0x01696bf0, 0x003ab1b0}}}, + {X: Field{[10]uint32{0x026e00e7, 0x00d7b859, 0x013ebedd, 0x01d56bad, 0x00fd7725, 0x023195de, 0x00e60a9a, 0x008388de, 0x02a450b6, 0x0003808f}}, Y: Field{[10]uint32{0x0094797e, 0x0198d4da, 0x01e306a9, 0x01338df8, 0x026bdd54, 0x02457d41, 0x020f0e78, 0x033e26c1, 0x00506dbd, 0x001393b6}}}, + {X: Field{[10]uint32{0x01935e5a, 0x0013b083, 0x01c9cc83, 0x00b70c0b, 0x02a7c0ec, 0x01aa15ef, 0x001b9f7e, 0x03f5ba96, 0x00955cd4, 0x001856d7}}, Y: Field{[10]uint32{0x015f4d46, 0x0086c53f, 0x038d36e4, 0x01d3cda9, 0x0146fc80, 0x0175d536, 0x01845bff, 0x00c96ef3, 0x03662602, 0x00308871}}}, + {X: Field{[10]uint32{0x02ec13a7, 0x031cd625, 0x0185bc2c, 0x02168012, 0x03fa2a0d, 0x004e46f6, 0x00e34d60, 0x008086e7, 0x003402e1, 0x002c77e9}}, Y: Field{[10]uint32{0x0348438e, 0x00fbd665, 0x03eadd10, 0x03316264, 0x0013c2a5, 0x01be062d, 0x03b7e9b0, 0x03e0a076, 0x015a8162, 0x003e8f44}}}, + {X: Field{[10]uint32{0x03eada7c, 0x028f272e, 0x0097436b, 0x02acc966, 0x0068c7e1, 0x0393b372, 0x0275b835, 0x011ff6b1, 0x001fafbe, 0x002d92d8}}, Y: Field{[10]uint32{0x01dbe68d, 0x0148dd3a, 0x007d85ea, 0x00355cd2, 0x02652ae9, 0x018b6f26, 0x03606624, 0x015d1bfa, 0x0039d231, 0x002bde30}}}, + {X: Field{[10]uint32{0x03b579cf, 0x03cc991a, 0x013364a0, 0x008d49c5, 0x01b0981f, 0x02535d59, 0x01027d4e, 0x036721b1, 0x0346fda1, 0x00150a74}}, Y: Field{[10]uint32{0x015b1880, 0x025a8ca6, 0x00f37ac6, 0x01654519, 0x02162d66, 0x035d18db, 0x00754dd2, 0x0364b8e4, 0x0197dfec, 0x0016e338}}}, + {X: Field{[10]uint32{0x026f005b, 0x0152c58a, 0x03f94ff9, 0x01a7cde1, 0x0020e216, 0x00105d27, 0x000bb781, 0x019c62c1, 0x00f2056d, 0x002241a5}}, Y: Field{[10]uint32{0x01753341, 0x0070504b, 0x00df35df, 0x02dcc6e5, 0x007bf505, 0x01abf43e, 0x010d7b22, 0x02eff2ee, 0x034a890d, 0x003659a4}}}, + {X: Field{[10]uint32{0x003cc117, 0x00b0ad9d, 0x0067ccb9, 0x0079128a, 0x00269b5d, 0x03f81832, 0x02987a05, 0x009adfe9, 0x0292cd05, 0x000eb9d4}}, Y: Field{[10]uint32{0x02416a94, 0x028b757c, 0x02871d22, 0x03a61ee0, 0x00f004ee, 0x00cc95af, 0x03d5416a, 0x02a0b63d, 0x00c15a74, 0x00042567}}}, + {X: Field{[10]uint32{0x019b0707, 0x01771fca, 0x03ce93bb, 0x037a292a, 0x01347bba, 0x006e7e87, 0x0353fd5f, 0x01f55568, 0x029bff71, 0x00275d16}}, Y: Field{[10]uint32{0x02de8134, 0x030a399f, 0x0369b0ba, 0x03feb783, 0x0210461c, 0x039cd379, 0x004f615a, 0x031831cc, 0x00aed513, 0x0033bcce}}}, + {X: Field{[10]uint32{0x0144f166, 0x02e54674, 0x009f0aaa, 0x02599214, 0x00abf1b8, 0x0248b018, 0x01ce7f4f, 0x0324e441, 0x002c8130, 0x001a67a7}}, Y: Field{[10]uint32{0x003a19cd, 0x028e7b5f, 0x004a438d, 0x00a65f49, 0x01bfb7da, 0x00e0275a, 0x01145838, 0x03e51257, 0x010e1fb9, 0x00220ad2}}}, + {X: Field{[10]uint32{0x01591f87, 0x012869e1, 0x03550388, 0x02953d0c, 0x00ae79b4, 0x032ff8a6, 0x01ea704b, 0x001426a4, 0x00c1dc52, 0x0038e807}}, Y: Field{[10]uint32{0x02dcc64e, 0x005ff507, 0x00b96066, 0x0244dd24, 0x012480a8, 0x0376bd25, 0x0287e546, 0x02755ff2, 0x01f368d1, 0x003cf190}}}, + {X: Field{[10]uint32{0x02c433d1, 0x03b8e35a, 0x035f1ee5, 0x039bf63f, 0x00cc7cce, 0x01126145, 0x01d23623, 0x00dd751b, 0x01c3d9df, 0x00174543}}, Y: Field{[10]uint32{0x02ab0316, 0x00c5bad4, 0x00061a32, 0x03fafeb7, 0x02399a83, 0x02100424, 0x000263f1, 0x03a839f6, 0x0250d2e2, 0x000b0244}}}, + {X: Field{[10]uint32{0x00996a66, 0x003170b8, 0x02b16c10, 0x0201629b, 0x00ec4778, 0x038047e0, 0x00aea5b5, 0x02e8fd91, 0x0361bb12, 0x00127ee5}}, Y: Field{[10]uint32{0x0255e23c, 0x033f41b5, 0x00370089, 0x006e4a5e, 0x00d9086b, 0x00595317, 0x0099caf2, 0x02245161, 0x020fb720, 0x001c4d08}}}, + {X: Field{[10]uint32{0x0244738e, 0x0032514a, 0x03b13d53, 0x01687d3d, 0x00bdea05, 0x02b73770, 0x03990211, 0x00b7ef79, 0x02b3a451, 0x000d3157}}, Y: Field{[10]uint32{0x0398fd16, 0x02693153, 0x021f2ba3, 0x0254c8cc, 0x010fdbb6, 0x00325e79, 0x0110e26d, 0x01007e6a, 0x0288beff, 0x00096331}}}, + {X: Field{[10]uint32{0x00a3a98c, 0x0023508c, 0x0202ab25, 0x03c8c371, 0x039b1c39, 0x02bc3272, 0x037b82c2, 0x03f8013f, 0x00f07c3e, 0x001c1a3f}}, Y: Field{[10]uint32{0x037ef1fc, 0x02c65eb8, 0x01d77aaa, 0x01e5f8b8, 0x012fe506, 0x000ad77d, 0x03657bf2, 0x01e314b9, 0x00d88445, 0x003921cc}}}, + {X: Field{[10]uint32{0x03355a1e, 0x02e1d3da, 0x01909f73, 0x01528ac0, 0x02f49e52, 0x03a38d1b, 0x03a1f95a, 0x02aa844a, 0x0110a987, 0x00038762}}, Y: Field{[10]uint32{0x03e3cdb8, 0x02ae41c3, 0x00235d7b, 0x008282e4, 0x01d4a56a, 0x03f57167, 0x01c2c149, 0x011f6266, 0x011bcc49, 0x0022b40c}}}, + {X: Field{[10]uint32{0x02d2caf2, 0x02b0f2dc, 0x03d57c10, 0x0363b536, 0x006bdf06, 0x01837d17, 0x02c6b2dc, 0x018c6c05, 0x03880ba8, 0x00249426}}, Y: Field{[10]uint32{0x006a3ccf, 0x022bd61d, 0x038c3397, 0x00ccd776, 0x01ee6f0f, 0x0257c504, 0x0395651b, 0x018a66a7, 0x0231633b, 0x000fa91e}}}, + {X: Field{[10]uint32{0x0266a519, 0x00d5ab06, 0x0351206a, 0x0078d371, 0x01644647, 0x02df4a69, 0x02ec994d, 0x0017a65a, 0x002ae8d5, 0x00243f50}}, Y: Field{[10]uint32{0x02da3b6b, 0x0162e96e, 0x02a62e19, 0x01611aaa, 0x039a6dc6, 0x0313c399, 0x0231816e, 0x00db82b6, 0x03f7bcdc, 0x0001a303}}}, + {X: Field{[10]uint32{0x01400704, 0x024367ea, 0x005f5eb3, 0x01fc319b, 0x0004cbc7, 0x0104ac4a, 0x035b0ddd, 0x032a3878, 0x02cb7d9b, 0x0002ce03}}, Y: Field{[10]uint32{0x006a01a4, 0x03d14321, 0x038a7d78, 0x036f87d7, 0x0118fa71, 0x00a75573, 0x01f69a72, 0x02de0c27, 0x009277d9, 0x003f4a88}}}, + {X: Field{[10]uint32{0x02b83f0c, 0x03bdec0c, 0x027520d3, 0x03bf33ca, 0x03f3d029, 0x01852495, 0x0066140b, 0x02db3dbe, 0x0041aecb, 0x001038b8}}, Y: Field{[10]uint32{0x002291f0, 0x01d131af, 0x01326704, 0x01063949, 0x01e1eda6, 0x005fc8ca, 0x02266794, 0x02223d53, 0x00a53c83, 0x000489c4}}}, + {X: Field{[10]uint32{0x02a03583, 0x03082a2a, 0x009c8c99, 0x02e7dded, 0x037d254e, 0x02bab33a, 0x013a38e9, 0x00c324e2, 0x03c43f4e, 0x00239827}}, Y: Field{[10]uint32{0x02c1a3e8, 0x028f70de, 0x0296d066, 0x01ec3835, 0x00837fb5, 0x0075c0de, 0x0259a86b, 0x005411fc, 0x006e9a82, 0x00251f13}}}, + {X: Field{[10]uint32{0x0035f5ce, 0x03020d7d, 0x020bb2ec, 0x00914bf3, 0x038d9c93, 0x02be26a3, 0x0098d001, 0x027f441a, 0x01b22bfe, 0x002e1c71}}, Y: Field{[10]uint32{0x031d3078, 0x015bc9a3, 0x00b64cd6, 0x03b80018, 0x03507fe8, 0x03c0e000, 0x007226b6, 0x003ba67e, 0x01a3ecbd, 0x0038c0b9}}}, + {X: Field{[10]uint32{0x00841682, 0x001f3554, 0x03f832ac, 0x015f33a1, 0x01c6f80f, 0x01bffd35, 0x01241709, 0x02246aed, 0x027e039e, 0x00149b6a}}, Y: Field{[10]uint32{0x03d210df, 0x0169552c, 0x01f43c5f, 0x02733171, 0x00c477bc, 0x02b503da, 0x00fd3975, 0x004c39d6, 0x00994fb7, 0x001a7c11}}}, + {X: Field{[10]uint32{0x021ad25a, 0x004be521, 0x01ba2edc, 0x01462b76, 0x015c031f, 0x03ed9be8, 0x027cc073, 0x00c15f39, 0x004a514e, 0x00305709}}, Y: Field{[10]uint32{0x02846c50, 0x00e5661c, 0x01b901ba, 0x037d72c1, 0x0016449d, 0x02f26a3f, 0x0234780b, 0x03225e37, 0x01acecc3, 0x0036c408}}}, + {X: Field{[10]uint32{0x02c1d388, 0x00d05cfa, 0x033443e2, 0x01db36df, 0x01d34948, 0x00374f71, 0x03638735, 0x000e36ce, 0x0319466a, 0x000df882}}, Y: Field{[10]uint32{0x003b89f0, 0x023bd8ff, 0x00f252d6, 0x01e7da7b, 0x025ea5bb, 0x036d5eae, 0x02bcfa27, 0x01078bb2, 0x02245465, 0x00002e02}}}, + {X: Field{[10]uint32{0x024ea528, 0x02393ed5, 0x01eabc59, 0x03241ffd, 0x016a0da5, 0x015e5629, 0x011cd81f, 0x00050acc, 0x0328feae, 0x001b4247}}, Y: Field{[10]uint32{0x01d07906, 0x00a418ff, 0x0274c27c, 0x01f16a2e, 0x026e9d9f, 0x03217748, 0x01897196, 0x029b04e0, 0x03f04d7e, 0x00122f25}}}, + {X: Field{[10]uint32{0x0354fd71, 0x018d782e, 0x008d35ca, 0x0334fb75, 0x02d3e545, 0x020676ff, 0x001664fb, 0x03ed5bb4, 0x0016a76e, 0x000ef6f5}}, Y: Field{[10]uint32{0x00eb0639, 0x03cdbd4b, 0x00d26a6b, 0x024e0ae6, 0x039a63a8, 0x007eeb63, 0x03016219, 0x0094ffbc, 0x01723ed7, 0x0029a553}}}, + {X: Field{[10]uint32{0x029d61ce, 0x022cb91f, 0x01237401, 0x0103661c, 0x00c41095, 0x02f0cfbc, 0x005d41a4, 0x02d57e30, 0x02a9f111, 0x0033538d}}, Y: Field{[10]uint32{0x014e3e57, 0x03188551, 0x02ddadf0, 0x02f09939, 0x03abded9, 0x014b7e01, 0x02f95ec4, 0x00b9a41b, 0x02165263, 0x0011e37e}}}, + {X: Field{[10]uint32{0x01f24efd, 0x02a7c44b, 0x031c6272, 0x01c4b9df, 0x02248457, 0x01c2b19f, 0x03214131, 0x027038ef, 0x004a09c5, 0x0003c8f3}}, Y: Field{[10]uint32{0x037fa4b2, 0x0179f715, 0x013da9ed, 0x0339d28f, 0x02dc71cd, 0x00bde919, 0x0358fc07, 0x03bff573, 0x007299b6, 0x003a4cef}}}, + {X: Field{[10]uint32{0x013c33e0, 0x01a56b7b, 0x0098931a, 0x01250d75, 0x0300d7a3, 0x02db6d88, 0x0046840c, 0x03acd6da, 0x01858c97, 0x00366319}}, Y: Field{[10]uint32{0x03114990, 0x02e18b78, 0x02eb2a85, 0x0068593c, 0x01ba1378, 0x00189ce5, 0x02c953c7, 0x020977ad, 0x0224ffe8, 0x00110ffa}}}, + {X: Field{[10]uint32{0x00744225, 0x01b99adb, 0x0085fa94, 0x03728924, 0x0165325d, 0x031d2a6f, 0x012b9d16, 0x036b86db, 0x02a6c055, 0x00089a76}}, Y: Field{[10]uint32{0x01bfb3dd, 0x00b726fd, 0x03dee235, 0x03ceed1f, 0x0130e14f, 0x010bbf73, 0x00f0fe6a, 0x00115ac2, 0x01f9a61f, 0x00056740}}}, + {X: Field{[10]uint32{0x027c48d5, 0x010300c5, 0x03ba4877, 0x02d08eb9, 0x01eb4d75, 0x011ac06b, 0x023880a5, 0x021e4a37, 0x00fd8eea, 0x000cd411}}, Y: Field{[10]uint32{0x02da1cc1, 0x01e8c273, 0x00226818, 0x027398f6, 0x000cfe1d, 0x015ecefa, 0x030f2bb7, 0x01aef18e, 0x03f52626, 0x001a7940}}}, + {X: Field{[10]uint32{0x03f6c512, 0x0317e68f, 0x03a5046b, 0x026d8dea, 0x01a601da, 0x01ef2b9d, 0x00ee87b0, 0x02a0f953, 0x023d86f9, 0x003b9e89}}, Y: Field{[10]uint32{0x01373d56, 0x020a4250, 0x00f6042d, 0x020c587e, 0x01222714, 0x01039d8d, 0x008ac1c8, 0x01a3a48e, 0x01922032, 0x0027f74c}}}, + {X: Field{[10]uint32{0x03f44245, 0x03975694, 0x02d976c5, 0x0111d9a8, 0x00bf95f3, 0x03d12a22, 0x03b6111e, 0x018c6db1, 0x03b336f1, 0x0014a6cc}}, Y: Field{[10]uint32{0x02061099, 0x002a15fa, 0x030004cf, 0x03ba7335, 0x036f29f9, 0x00a00927, 0x02bc1a03, 0x01bd28be, 0x010693da, 0x0004a158}}}, + {X: Field{[10]uint32{0x03df1849, 0x00f3596a, 0x0243dd3e, 0x014e3af4, 0x006a2513, 0x035956a2, 0x01337182, 0x03a7d46a, 0x006da6ce, 0x003caccd}}, Y: Field{[10]uint32{0x03b77da3, 0x00ec3ddd, 0x032e1f48, 0x032cc937, 0x0355aaef, 0x03d89e34, 0x00665262, 0x000ffa7a, 0x0228be77, 0x0035077d}}}, + {X: Field{[10]uint32{0x0182befa, 0x0166dc11, 0x0037b3f5, 0x00a88bce, 0x011db7a1, 0x0358e31f, 0x0103d045, 0x026319c3, 0x01bcf03d, 0x0014d7a7}}, Y: Field{[10]uint32{0x02358392, 0x0307d967, 0x024e740b, 0x01853d93, 0x0262ea47, 0x01fe0e12, 0x00fa98d6, 0x025f16f5, 0x0228bad8, 0x000b08cc}}}, + {X: Field{[10]uint32{0x0299a7f1, 0x00ed282c, 0x03970825, 0x01e2140c, 0x00b019bf, 0x03fcd189, 0x023172dd, 0x01ab197b, 0x008b70da, 0x00304c5a}}, Y: Field{[10]uint32{0x00e5f3cc, 0x01e14677, 0x00d207dd, 0x03fc22e1, 0x000d6e1a, 0x027e65be, 0x0211d82e, 0x012365a6, 0x03b6e0e7, 0x003fbc61}}}, + {X: Field{[10]uint32{0x014d3ba9, 0x01c6c85d, 0x02a645dc, 0x003261c9, 0x02a984d0, 0x029afe0c, 0x00eddf3d, 0x01e61443, 0x00d3f7ab, 0x001d7721}}, Y: Field{[10]uint32{0x03841c50, 0x02c8cab8, 0x02183af5, 0x03ac770a, 0x0384f62d, 0x00bbaa94, 0x005e4d28, 0x001244b3, 0x01f35e11, 0x003d767b}}}, + {X: Field{[10]uint32{0x032a36c5, 0x011fb53c, 0x00648788, 0x035dbe63, 0x0282c6da, 0x01717f54, 0x03273102, 0x030e3ab9, 0x03bc9136, 0x00164771}}, Y: Field{[10]uint32{0x03a421a0, 0x025c9a35, 0x00233953, 0x02dc8751, 0x008d4875, 0x032db17a, 0x003aabb4, 0x034e0b80, 0x00c4f81c, 0x003f33e9}}}, + {X: Field{[10]uint32{0x02712596, 0x01d4f384, 0x00f0fb14, 0x02d93162, 0x02d2c78d, 0x021eb3de, 0x0148fadb, 0x024aeb9d, 0x00892a83, 0x0020e967}}, Y: Field{[10]uint32{0x03c5873b, 0x0140c339, 0x0119be3e, 0x038c573e, 0x0046f090, 0x0208bfcf, 0x027c5988, 0x00819435, 0x001a33b1, 0x001f402b}}}, + {X: Field{[10]uint32{0x026f6f83, 0x024f8b2e, 0x03fc76ca, 0x01a3b116, 0x036608f9, 0x018e47bf, 0x001b8c37, 0x02cbd2a7, 0x03a58c52, 0x003a6c37}}, Y: Field{[10]uint32{0x020a7c8d, 0x02d77bcb, 0x01be2e5c, 0x00e69e02, 0x035c1f08, 0x03acfcfe, 0x0089124f, 0x0378349d, 0x028d5846, 0x0019126c}}}, + {X: Field{[10]uint32{0x032bc03b, 0x0269942d, 0x02f81b1b, 0x01435569, 0x00c76adf, 0x00e8f497, 0x011c002d, 0x02430f45, 0x02f967b0, 0x00005b34}}, Y: Field{[10]uint32{0x02d63a7b, 0x03f931a2, 0x0206f50f, 0x013e123b, 0x03a23db7, 0x035e1162, 0x00cc091b, 0x01c240e7, 0x001e2fe7, 0x00316498}}}, + {X: Field{[10]uint32{0x02ff1cbe, 0x0128e28e, 0x026b6f58, 0x02e9ec61, 0x01d80b8d, 0x0135b97d, 0x023d9e24, 0x038d8da7, 0x03fd1bcd, 0x003cd1f4}}, Y: Field{[10]uint32{0x0287977a, 0x0313491f, 0x03a9766d, 0x02045613, 0x00c7349f, 0x0190497a, 0x01cfc6d0, 0x02284e63, 0x02b90ae3, 0x000710d6}}}, + {X: Field{[10]uint32{0x02428b1b, 0x00dd33f6, 0x0126d534, 0x034ad3a6, 0x01f349ed, 0x01248551, 0x0049f113, 0x02153243, 0x0187d644, 0x0016c643}}, Y: Field{[10]uint32{0x025401f3, 0x0325efbe, 0x03ea856b, 0x01dac9c4, 0x039c1d31, 0x0174b055, 0x013ab256, 0x035aed72, 0x00c363ef, 0x002293ab}}}, + {X: Field{[10]uint32{0x0030834f, 0x03d9f587, 0x003ab105, 0x03cdddcb, 0x01c49e78, 0x02f32b2b, 0x01e96650, 0x0133a3c8, 0x00b2d731, 0x0029de1b}}, Y: Field{[10]uint32{0x01441953, 0x025af52a, 0x0237146e, 0x006e817d, 0x006c4ea7, 0x02dc2ff0, 0x031f911c, 0x00b8fcbe, 0x00d41898, 0x0013f1eb}}}, + {X: Field{[10]uint32{0x03bf33cb, 0x02807ecb, 0x01dcf545, 0x009bc1cf, 0x02abf74d, 0x003bcd85, 0x01faeddc, 0x00686231, 0x0353e907, 0x0034d953}}, Y: Field{[10]uint32{0x032f4383, 0x03c40ed0, 0x00de1880, 0x03649b0f, 0x0377c7a3, 0x0129c5bc, 0x038502fc, 0x000e5165, 0x00c7213c, 0x00295bc8}}}, + {X: Field{[10]uint32{0x0022399c, 0x00e6a4de, 0x00994020, 0x01d83ba2, 0x0127d031, 0x02db6d33, 0x01d8ac3b, 0x032f681a, 0x0287400a, 0x003844e2}}, Y: Field{[10]uint32{0x03a162c1, 0x0259f544, 0x0012c9ce, 0x02543d78, 0x001803cd, 0x01a14f90, 0x0240de6b, 0x01b51971, 0x03bfdd3f, 0x003ca6a3}}}, + {X: Field{[10]uint32{0x02317708, 0x02b26561, 0x007e7374, 0x0039daee, 0x02571473, 0x03272a54, 0x03c49c69, 0x03d3942c, 0x023c91c0, 0x0034a7ad}}, Y: Field{[10]uint32{0x02a5f1a1, 0x02bfd87f, 0x03dd9d73, 0x027c72cf, 0x02d9d38c, 0x0215b79a, 0x022ab4ac, 0x02029674, 0x03024e91, 0x0012b64d}}}, + {X: Field{[10]uint32{0x02ee49f8, 0x022d2089, 0x03147ca4, 0x00c34637, 0x03d2124b, 0x022e3b2c, 0x0177da1d, 0x01ff5c19, 0x03baa671, 0x002a7500}}, Y: Field{[10]uint32{0x02d5323b, 0x005dadc9, 0x0133ff45, 0x027b6dd0, 0x0056f1e4, 0x02564451, 0x0137bcad, 0x0387b942, 0x027a8c5e, 0x0007bb7f}}}, + {X: Field{[10]uint32{0x02f57528, 0x01daf427, 0x01e39ca0, 0x018e6390, 0x018d8f37, 0x004b6272, 0x02c6bfd1, 0x00156bba, 0x00e8dbb6, 0x003fded6}}, Y: Field{[10]uint32{0x00381121, 0x034942bf, 0x02ee6cf5, 0x03d6f506, 0x018e39f1, 0x00db01a1, 0x02cb57c8, 0x01479c35, 0x01d1ad7a, 0x0013938e}}}, + {X: Field{[10]uint32{0x01362979, 0x02ebf46f, 0x016131e7, 0x007559bd, 0x021672ea, 0x038bc51b, 0x036db234, 0x027d8786, 0x029df783, 0x0010f142}}, Y: Field{[10]uint32{0x03f449ae, 0x029d3aa0, 0x03bd61ad, 0x0217d833, 0x001e2158, 0x02781486, 0x03e908f6, 0x006a2ea0, 0x02988154, 0x003c83f6}}}, + {X: Field{[10]uint32{0x034ac30c, 0x00fc89c5, 0x03e53984, 0x0354a74e, 0x035803a9, 0x02f9b410, 0x0262ae16, 0x004a61d5, 0x01b701c9, 0x003d822a}}, Y: Field{[10]uint32{0x027ad5bf, 0x03121a8c, 0x008f2083, 0x019b5ed4, 0x01d788d2, 0x004eed59, 0x02d32434, 0x0375086e, 0x00fae919, 0x0017bcd9}}}, + {X: Field{[10]uint32{0x005a117e, 0x004cc9d1, 0x02d568d0, 0x00881736, 0x033cc117, 0x03099d95, 0x03c48d00, 0x03c10fe6, 0x0029dd1e, 0x003244f8}}, Y: Field{[10]uint32{0x01a83049, 0x02169406, 0x02d8bace, 0x00610f89, 0x0032a38f, 0x00d49a81, 0x01cf07c1, 0x032ecdef, 0x030b9c31, 0x0025d5cf}}}, + {X: Field{[10]uint32{0x02a7d728, 0x03715720, 0x0363cce7, 0x02c4d20b, 0x0361318b, 0x0332a11f, 0x000c58a0, 0x01ef059b, 0x009db17e, 0x002ab831}}, Y: Field{[10]uint32{0x006be0b8, 0x0398ddd7, 0x012516a7, 0x03fe7576, 0x02810396, 0x01633703, 0x0051aae6, 0x00f6b088, 0x03f3f68c, 0x001045c2}}}, + {X: Field{[10]uint32{0x03c846c8, 0x02a8e23a, 0x02c96d35, 0x02d7af16, 0x01e306c8, 0x03792817, 0x039b15e3, 0x02d88966, 0x031f45a0, 0x003ca017}}, Y: Field{[10]uint32{0x038d1267, 0x027421da, 0x01dc9978, 0x00709902, 0x00b36e20, 0x0244be8e, 0x0325cdd0, 0x01c9115d, 0x03396ba3, 0x003d75c9}}}, + {X: Field{[10]uint32{0x00fa4f39, 0x029ea400, 0x030d87b0, 0x00e9e049, 0x00f7d232, 0x01f61968, 0x0230e593, 0x0344b928, 0x00e6e150, 0x001a5a79}}, Y: Field{[10]uint32{0x0214de3a, 0x02dc61d7, 0x02f888da, 0x036eab85, 0x03e030a0, 0x01657727, 0x037ebe08, 0x03b430f9, 0x03d6d323, 0x0031c70c}}}, + {X: Field{[10]uint32{0x01988f3e, 0x03bc0e63, 0x003e3e4c, 0x00e90465, 0x022aa064, 0x021cb7ef, 0x00fbdb8e, 0x0095eaf9, 0x03f07a0e, 0x0002bb0a}}, Y: Field{[10]uint32{0x00c931d0, 0x00755172, 0x01df6ef2, 0x0289c936, 0x00bcc3b6, 0x03fc2a0c, 0x00bc528f, 0x030e0321, 0x0157e686, 0x00363a7d}}}, + {X: Field{[10]uint32{0x0126f710, 0x0090ef52, 0x033226bb, 0x0071e42f, 0x01198f56, 0x02764775, 0x002890b6, 0x030d7294, 0x019a13df, 0x00271bfe}}, Y: Field{[10]uint32{0x03ef849d, 0x020d00fd, 0x0311e9b6, 0x018cd08a, 0x012f7f4e, 0x03fd1a0e, 0x008f5411, 0x03d6b676, 0x020c84a4, 0x000abbe4}}}, + {X: Field{[10]uint32{0x02d7f1c2, 0x0239b825, 0x00aefafb, 0x03b2d776, 0x02ade75a, 0x03bb7994, 0x00246d67, 0x0388e37c, 0x005b37a5, 0x003e90dd}}, Y: Field{[10]uint32{0x018689b1, 0x013a0b6a, 0x01eaddc4, 0x03e167fa, 0x0248aba7, 0x03be4e7b, 0x013c8f3f, 0x019500de, 0x02a42a3c, 0x0037e756}}}, + {X: Field{[10]uint32{0x038d46b9, 0x010f76a9, 0x00741276, 0x01396196, 0x020ce3b7, 0x039ddfe5, 0x03b84d09, 0x009b1fac, 0x02886c4e, 0x001a528c}}, Y: Field{[10]uint32{0x03dfe67a, 0x01aa7862, 0x018b0144, 0x00cb2c4c, 0x02a700d9, 0x0248b316, 0x00909be0, 0x011795ba, 0x006d0076, 0x0029535b}}}, + {X: Field{[10]uint32{0x008f38a0, 0x02b45eb0, 0x02be43d4, 0x0081f31c, 0x01930fe9, 0x00498843, 0x00339a2b, 0x01aca2d3, 0x01975be0, 0x00195265}}, Y: Field{[10]uint32{0x02f7900c, 0x01110fdc, 0x02be1c68, 0x02c22cd6, 0x03d29fe8, 0x02078fd6, 0x02cd92ce, 0x03738cb4, 0x03bb467f, 0x002f7b88}}}, + {X: Field{[10]uint32{0x0399f0bd, 0x00266c01, 0x00137400, 0x02ca6c42, 0x000ea38e, 0x020ebb11, 0x014f0844, 0x005392df, 0x00f675bb, 0x000de472}}, Y: Field{[10]uint32{0x02f7bc76, 0x013a463b, 0x0316d15a, 0x01170c72, 0x018b2a3f, 0x02fb97b9, 0x0396ddbc, 0x017adbce, 0x034ada5e, 0x000b723d}}}, + {X: Field{[10]uint32{0x02f31364, 0x0106a31b, 0x018ed429, 0x01e864e7, 0x0359795c, 0x02b3da90, 0x00469360, 0x0243a7a4, 0x0065eaf8, 0x00357904}}, Y: Field{[10]uint32{0x025bbcad, 0x0055b2fd, 0x03f6d21f, 0x032c341b, 0x00bd2f30, 0x00b930cb, 0x03bb6b8f, 0x03f539ea, 0x00c8a559, 0x000647b1}}}, + {X: Field{[10]uint32{0x00970dec, 0x02b5940b, 0x03ae8b77, 0x03cbaaa8, 0x01e504e6, 0x008162e6, 0x0229acb6, 0x010134a2, 0x0280fa0b, 0x0005b388}}, Y: Field{[10]uint32{0x02efb09b, 0x012e0755, 0x029b8817, 0x0179fe5b, 0x00b6eaec, 0x01d39643, 0x00bc2520, 0x0376e795, 0x03f4486a, 0x000f51a0}}}, + {X: Field{[10]uint32{0x02107d07, 0x00ed4071, 0x030160bf, 0x01fb5f51, 0x03e08f99, 0x005a106d, 0x025b4478, 0x02c7ce43, 0x03306cdf, 0x0029ac2a}}, Y: Field{[10]uint32{0x000abf7a, 0x02692daa, 0x0258d9cb, 0x0392843d, 0x03094e96, 0x01caaf26, 0x02d337fd, 0x009e524b, 0x002fb67e, 0x000a98a1}}}, + {X: Field{[10]uint32{0x02033583, 0x00018a15, 0x02d9021e, 0x022a3fda, 0x0252b9d0, 0x01c27cdd, 0x00b779cd, 0x00c82c87, 0x0138760b, 0x0035f29b}}, Y: Field{[10]uint32{0x009e7bb5, 0x01cbffe1, 0x01b046d6, 0x03ea660b, 0x015e2d1c, 0x00500586, 0x011b6cbb, 0x0166e5ae, 0x0372866d, 0x0035b017}}}, + {X: Field{[10]uint32{0x01609d33, 0x01b2d17d, 0x03ef375f, 0x01758682, 0x03e16240, 0x004871cf, 0x00cb1347, 0x01c1f9ce, 0x01632d3f, 0x001e2ac1}}, Y: Field{[10]uint32{0x0275a6b0, 0x013b17fb, 0x034f2109, 0x012557ed, 0x00350eba, 0x02ea9714, 0x03a4b424, 0x032d3ca5, 0x010c10c7, 0x003f868e}}}, + {X: Field{[10]uint32{0x000d6f04, 0x001cb146, 0x01879bd1, 0x00a0a24d, 0x01218e21, 0x003923f6, 0x01fc5a96, 0x03a00c19, 0x013a5b9f, 0x003014d5}}, Y: Field{[10]uint32{0x02719192, 0x0221a68f, 0x008a4752, 0x03714730, 0x027d0d28, 0x01ef8a00, 0x01c45cf5, 0x02ac1384, 0x0374214d, 0x00380b69}}}, + {X: Field{[10]uint32{0x03f02d03, 0x0357af48, 0x01b4eb65, 0x025604e1, 0x035faf8e, 0x003f07ec, 0x018d4033, 0x02570fbe, 0x0313e2a9, 0x002fe175}}, Y: Field{[10]uint32{0x03e59b18, 0x0101d22c, 0x00bbd6b9, 0x025a20a1, 0x03dcb68e, 0x00777481, 0x0142a6f2, 0x02c386a1, 0x014758d7, 0x00297516}}}, + {X: Field{[10]uint32{0x01bd280a, 0x01343c40, 0x0031d69a, 0x00167954, 0x00138169, 0x02c2bbb0, 0x022ee0de, 0x01e2e03f, 0x02c92be5, 0x003edced}}, Y: Field{[10]uint32{0x0214cd16, 0x0348b165, 0x01cf3e31, 0x0260df8f, 0x00e15bbc, 0x016f7a06, 0x0030bd25, 0x02957f51, 0x00939bf5, 0x001cb39e}}}, + {X: Field{[10]uint32{0x0228aa79, 0x03cdc305, 0x00dfc1e2, 0x00d60cd8, 0x00d99281, 0x03d2db0b, 0x01b04f78, 0x02372480, 0x025aed33, 0x0015925b}}, Y: Field{[10]uint32{0x028c2db1, 0x02291daf, 0x0072586c, 0x015344c0, 0x00092ffa, 0x015b5454, 0x0315d3fa, 0x0329c048, 0x008a824f, 0x002076fd}}}, + {X: Field{[10]uint32{0x03a2130c, 0x01724c6d, 0x036df790, 0x01e56327, 0x02aecc0a, 0x03ca9086, 0x01edcc62, 0x03c26121, 0x03959e81, 0x0035a638}}, Y: Field{[10]uint32{0x01563d27, 0x01e3271e, 0x03ba45ce, 0x02f8743f, 0x0179408b, 0x03a5c28e, 0x0001a8e3, 0x02a8e76b, 0x02bce61e, 0x001640f7}}}, + {X: Field{[10]uint32{0x0166ff80, 0x01d93931, 0x01931780, 0x01ee4e1f, 0x007fad8d, 0x00d012cd, 0x02ade00d, 0x025142cc, 0x02408670, 0x00212ccb}}, Y: Field{[10]uint32{0x031cfdc8, 0x00e9606e, 0x01c244aa, 0x039000c9, 0x009bb5b0, 0x025714d4, 0x03941e31, 0x010a58ad, 0x007856cc, 0x00132034}}}, + {X: Field{[10]uint32{0x00db2ed6, 0x00e29842, 0x00cf05ac, 0x010ca3cc, 0x036528e2, 0x007b4cc9, 0x0073a45f, 0x0226d306, 0x03992a36, 0x001c4a71}}, Y: Field{[10]uint32{0x020810e4, 0x02265699, 0x00a68ce3, 0x00673cff, 0x0044f866, 0x024026aa, 0x01154567, 0x00969753, 0x03e84821, 0x000d8ad3}}}, + {X: Field{[10]uint32{0x0180d824, 0x00e74a34, 0x01b98781, 0x01fbda31, 0x005f8cad, 0x0326470d, 0x02cac088, 0x02dba9ad, 0x0087fa48, 0x0024c593}}, Y: Field{[10]uint32{0x01d9e26b, 0x017a11ed, 0x02a87278, 0x0087234d, 0x03bd1832, 0x0058e5aa, 0x0397771d, 0x03c3e432, 0x015cc91c, 0x0028eb03}}}, + {X: Field{[10]uint32{0x03305a68, 0x03b66c27, 0x02d94808, 0x017a2e26, 0x0194744d, 0x024a7cca, 0x004c7b1f, 0x024df28e, 0x00e237c4, 0x0013e43a}}, Y: Field{[10]uint32{0x012430b8, 0x0123c226, 0x00e70147, 0x0000d0f1, 0x02ce725e, 0x033bb41e, 0x03f417cf, 0x01212c20, 0x02e02b6b, 0x003379dd}}}, + {X: Field{[10]uint32{0x01f716a1, 0x03e46d9d, 0x00ed6a10, 0x0284f016, 0x034442f6, 0x014fb334, 0x0113fae2, 0x01c5ab9a, 0x03bc9f40, 0x00136580}}, Y: Field{[10]uint32{0x0124add6, 0x0153b90e, 0x02493c66, 0x0048a12a, 0x009c52a4, 0x029bed14, 0x0165827a, 0x038d565c, 0x01fc278c, 0x0024ad9e}}}, + {X: Field{[10]uint32{0x02b17203, 0x004f1312, 0x006a5aed, 0x00619fe4, 0x03f90cd7, 0x0058cb84, 0x0094f3bc, 0x01050c4b, 0x011f91c5, 0x0022dbd9}}, Y: Field{[10]uint32{0x010c7066, 0x020d9548, 0x02c130bf, 0x0256eb1a, 0x0109ded9, 0x0049b103, 0x00e2b78c, 0x00955aed, 0x01a4b80f, 0x00223056}}}, + {X: Field{[10]uint32{0x025ec256, 0x03082f6c, 0x02ee98cd, 0x03ad8155, 0x021909e1, 0x02352645, 0x02448f07, 0x020d1fa1, 0x0052cab9, 0x001bd62e}}, Y: Field{[10]uint32{0x00239885, 0x01c08f26, 0x01cd32fa, 0x02cab601, 0x021681da, 0x02833afa, 0x02bd30dd, 0x024c179a, 0x005f233d, 0x0000e930}}}, + {X: Field{[10]uint32{0x000c44bd, 0x02601c44, 0x010086cb, 0x024566a4, 0x028bb6ca, 0x03febe8c, 0x03710da3, 0x010472b2, 0x02a84021, 0x001af9fd}}, Y: Field{[10]uint32{0x0036bee9, 0x00405152, 0x0168bb58, 0x03fcc83a, 0x0186f339, 0x017f0464, 0x01c8d59b, 0x037ed160, 0x02f9d461, 0x002fd929}}}, + {X: Field{[10]uint32{0x02102d39, 0x020f4b2b, 0x0044ab39, 0x003cab06, 0x0299661f, 0x03b3fe6a, 0x00fdbe13, 0x02799bcb, 0x010bb8ea, 0x0002cbf3}}, Y: Field{[10]uint32{0x0182bb86, 0x013a339c, 0x02c74144, 0x02c3a8cf, 0x0027c38c, 0x00e9fa04, 0x032cbbad, 0x023e8c3a, 0x0189bb3b, 0x0002811a}}}, + {X: Field{[10]uint32{0x01a6fd96, 0x03dd129e, 0x02f1291b, 0x01adb667, 0x03391682, 0x00331644, 0x037770b5, 0x026ca7b7, 0x010eab55, 0x002875bb}}, Y: Field{[10]uint32{0x004ab69b, 0x008ded30, 0x03391df2, 0x00c02b1a, 0x002f17df, 0x00612025, 0x03bf93b5, 0x0156b85c, 0x017e0c92, 0x002ee459}}}, + {X: Field{[10]uint32{0x012a9575, 0x02a047a4, 0x0301bd08, 0x039f8725, 0x01440da5, 0x026ad8e7, 0x0366201e, 0x00c35cd4, 0x030ded71, 0x000a3d95}}, Y: Field{[10]uint32{0x02d2884a, 0x039ab73c, 0x0362edec, 0x017a5576, 0x00e2216e, 0x03efd30b, 0x011a7c70, 0x0166c8fa, 0x0360119c, 0x000e4647}}}, + {X: Field{[10]uint32{0x00271fa3, 0x032013e4, 0x038530b9, 0x0089258d, 0x0031cfce, 0x00075edb, 0x00b089d1, 0x00f79086, 0x00eddbb8, 0x00005323}}, Y: Field{[10]uint32{0x029a41fc, 0x03fb393a, 0x0384d7a8, 0x00f5128b, 0x030de129, 0x0131e252, 0x01cba3d2, 0x00b9c44d, 0x02d2a5d0, 0x00012014}}}, + {X: Field{[10]uint32{0x012d489b, 0x00be3eb8, 0x03ca9eda, 0x00ee4886, 0x03a75f56, 0x03211429, 0x0228fa1b, 0x00df4f4a, 0x0305fec7, 0x003abfe7}}, Y: Field{[10]uint32{0x03b8c139, 0x02dc2a48, 0x01c3dd3f, 0x01206844, 0x022ad9f3, 0x0083d18e, 0x03349fa5, 0x021cf5f4, 0x019b05c9, 0x0035b510}}}, + {X: Field{[10]uint32{0x00b35e95, 0x02fb4545, 0x02a43d92, 0x03825a4c, 0x00ce0757, 0x00b9ff0f, 0x03524575, 0x00dc4a16, 0x006eb42a, 0x003a3b93}}, Y: Field{[10]uint32{0x023b748a, 0x00c28ada, 0x01e2d5f2, 0x03f32f17, 0x00ee55ab, 0x0091b2df, 0x007ff4e6, 0x0060c7c4, 0x014c27ef, 0x000361af}}}, + {X: Field{[10]uint32{0x0241e7e4, 0x01db9abb, 0x00386a07, 0x008819de, 0x02d5e909, 0x03222946, 0x03707591, 0x00ec181a, 0x01090821, 0x00263186}}, Y: Field{[10]uint32{0x025d4c8c, 0x0106bbfd, 0x03efbfc2, 0x02a068df, 0x030fd72d, 0x02339314, 0x0290e2d3, 0x02e4110b, 0x022cf98b, 0x003acf4b}}}, + {X: Field{[10]uint32{0x0146dd29, 0x033dfcfe, 0x0217d946, 0x001938a3, 0x01893198, 0x00e2f2d7, 0x03a0dbbc, 0x00a61b15, 0x0381f5d6, 0x00353d9a}}, Y: Field{[10]uint32{0x037a5fc2, 0x02087ede, 0x03b32867, 0x023814c2, 0x002a1229, 0x02052d6e, 0x03c5579d, 0x0068032d, 0x038deedf, 0x003064c3}}}, + {X: Field{[10]uint32{0x0011087f, 0x01e41805, 0x03c4eb98, 0x030ab511, 0x01a13dd4, 0x02619bc3, 0x01543696, 0x02466d57, 0x00e705f8, 0x000535cf}}, Y: Field{[10]uint32{0x03ededf8, 0x0381b1a4, 0x0067d16e, 0x03c98a75, 0x03b71c48, 0x02bd0822, 0x0106df2c, 0x0034f174, 0x0222b9cb, 0x001a6e51}}}, + {X: Field{[10]uint32{0x03da3aec, 0x00d30808, 0x017115bc, 0x010229c4, 0x015646ab, 0x02942a35, 0x00511058, 0x01e831ab, 0x0135059c, 0x0015fbf2}}, Y: Field{[10]uint32{0x01c5dfd1, 0x01cb00ad, 0x00c4b262, 0x03c14ccb, 0x0127f959, 0x00ab954a, 0x03fba0d9, 0x015705d2, 0x029a60b8, 0x003f2a4c}}}, + {X: Field{[10]uint32{0x01b3677f, 0x00dcbf65, 0x0073dcb6, 0x03d4da0e, 0x00171213, 0x016a7cf9, 0x00b94585, 0x02a036a4, 0x0286063d, 0x00247c4e}}, Y: Field{[10]uint32{0x019a90ea, 0x02d3bed0, 0x016d03ca, 0x03384d05, 0x01e0332e, 0x0081558e, 0x029a7ae9, 0x03c4430c, 0x00d86734, 0x001d0178}}}, + {X: Field{[10]uint32{0x01607592, 0x035abfe8, 0x037675f9, 0x005b44cd, 0x02c33227, 0x01037170, 0x03dfd64b, 0x017896a0, 0x010b4614, 0x00373213}}, Y: Field{[10]uint32{0x012d6c66, 0x02a2ea07, 0x00adc8bb, 0x01869c0c, 0x0251b951, 0x03d4c91a, 0x01f15260, 0x03fab023, 0x00f48e4d, 0x00391a93}}}, + {X: Field{[10]uint32{0x0348676c, 0x01405d0c, 0x02db0542, 0x007f7c5a, 0x00df0bfa, 0x02fcf1a8, 0x016011e6, 0x03d0c804, 0x02acd5a6, 0x000a2ac1}}, Y: Field{[10]uint32{0x03b0cb9a, 0x015ad8e5, 0x012d427e, 0x00af8369, 0x03cc31f4, 0x013ff3fb, 0x011d6b7a, 0x01276ba7, 0x021c967f, 0x001449ca}}}, + {X: Field{[10]uint32{0x01d8b240, 0x03c3d148, 0x02d00bef, 0x0248c830, 0x020d9c2a, 0x0245718d, 0x032adb45, 0x037f7f4f, 0x0321f8d1, 0x0001f006}}, Y: Field{[10]uint32{0x002c8b48, 0x03e89715, 0x01aedf76, 0x018b4db4, 0x016e7ffd, 0x02aa5acf, 0x02f78fda, 0x01b607f1, 0x03cc9990, 0x002d2923}}}, + {X: Field{[10]uint32{0x014d98f1, 0x02a66b34, 0x01f5b428, 0x026f832d, 0x03a0d327, 0x02703a3e, 0x03624230, 0x03a57ca8, 0x037830f8, 0x003e53ba}}, Y: Field{[10]uint32{0x03649527, 0x03f8f290, 0x00d2305c, 0x0076544f, 0x03715722, 0x02ed2a4f, 0x01c91be8, 0x01ae7297, 0x03646967, 0x00325b56}}}, + {X: Field{[10]uint32{0x01ec35ca, 0x01bd7e04, 0x0045bd40, 0x01dcc3a4, 0x039a6d64, 0x03d78cb4, 0x01e0dd85, 0x0336902f, 0x00e47788, 0x003a919d}}, Y: Field{[10]uint32{0x035a235a, 0x01188c29, 0x01a0fe1a, 0x0185093a, 0x01fb622a, 0x0062f5da, 0x030032ba, 0x024488c1, 0x03790a9b, 0x0001da6f}}}, + {X: Field{[10]uint32{0x03b40112, 0x00f09407, 0x005d1728, 0x0234dd9d, 0x0019b7b3, 0x020aff8a, 0x03172606, 0x021a1404, 0x00197f8f, 0x0036969d}}, Y: Field{[10]uint32{0x01c37a39, 0x018f8ee5, 0x0290ceb6, 0x0104841c, 0x00b5a19f, 0x0358dcef, 0x025ef5f5, 0x0078604c, 0x02ec0587, 0x002982d7}}}, + {X: Field{[10]uint32{0x02e9d41d, 0x03dcbc89, 0x03b6c22f, 0x03b08ee3, 0x01a75ebc, 0x03b5eddb, 0x00c6820d, 0x003f6806, 0x03a55256, 0x0030405f}}, Y: Field{[10]uint32{0x009fed39, 0x01e0450d, 0x0129b1b0, 0x03699e0a, 0x039b5dc1, 0x03fc1625, 0x03da3b8d, 0x011fe459, 0x019daf26, 0x003a51ec}}}, + {X: Field{[10]uint32{0x01216a7f, 0x03a452ca, 0x00b164b3, 0x016066fc, 0x011b9646, 0x0160269d, 0x0215238b, 0x0111d9e2, 0x00e14e81, 0x0002f9f0}}, Y: Field{[10]uint32{0x03eb392e, 0x0189e803, 0x0204e4f1, 0x002e28d8, 0x01088084, 0x035923a0, 0x03072b15, 0x00669bc2, 0x0297f642, 0x0028c3af}}}, + {X: Field{[10]uint32{0x03007cea, 0x00ec4e65, 0x0014fcb5, 0x03cb3e01, 0x0059e0ff, 0x00bffe0b, 0x01184056, 0x0303f730, 0x02c1a4d6, 0x0019d63b}}, Y: Field{[10]uint32{0x00b316b3, 0x038fabdf, 0x00edcb4f, 0x02eb42e7, 0x00a0149b, 0x01898c7a, 0x02c88988, 0x03614908, 0x006620fc, 0x001194ef}}}, + {X: Field{[10]uint32{0x005b6116, 0x02143710, 0x01dae70d, 0x0379a6b3, 0x03011014, 0x03a1cd6c, 0x000cf059, 0x01366676, 0x01d3f88f, 0x00272ed4}}, Y: Field{[10]uint32{0x01902360, 0x01442ec9, 0x023d60e2, 0x02064642, 0x02047c63, 0x01fbf134, 0x00e0ed51, 0x016d4a00, 0x0348cad7, 0x0037e8b9}}}, + {X: Field{[10]uint32{0x00bf0bc3, 0x03854436, 0x00dea3d6, 0x0354d087, 0x0065328b, 0x02a96b46, 0x0350229e, 0x01e4bc5c, 0x02e7b170, 0x0018e96a}}, Y: Field{[10]uint32{0x02da1010, 0x03ee20d4, 0x00ea195a, 0x035e3396, 0x0212a261, 0x034d8d30, 0x026250ae, 0x017d27df, 0x03d0f25d, 0x0004496b}}}, + {X: Field{[10]uint32{0x02f10657, 0x038b226c, 0x02430b0f, 0x00907698, 0x014e036d, 0x0090f688, 0x02e11fb0, 0x000ca3ae, 0x02493e5f, 0x002b7e58}}, Y: Field{[10]uint32{0x01b1ea1e, 0x00d2d5c2, 0x037f784f, 0x037a280f, 0x03219a29, 0x005f52d7, 0x0018b16d, 0x0376ccb4, 0x00bafcd8, 0x0014260d}}}, + {X: Field{[10]uint32{0x034d472f, 0x01d97678, 0x01f32f00, 0x01270ac9, 0x01bfdfa5, 0x00135c89, 0x0183364e, 0x0128564d, 0x035b7fb4, 0x00028363}}, Y: Field{[10]uint32{0x03998ab2, 0x026c48bb, 0x0048dd53, 0x008be7df, 0x01630b6c, 0x0365ff8f, 0x01da99f3, 0x009a1e52, 0x0366f84c, 0x000187aa}}}, + {X: Field{[10]uint32{0x02e61fc1, 0x019a42c2, 0x0033ef68, 0x03496c9f, 0x027a3ee0, 0x01b60097, 0x00dbf815, 0x028b6eb7, 0x00ea9596, 0x002e60c2}}, Y: Field{[10]uint32{0x03ddbd37, 0x00334149, 0x006f5125, 0x01b9619e, 0x01445bae, 0x00f3f496, 0x00c582a0, 0x02933ad3, 0x03177566, 0x00336d38}}}, + {X: Field{[10]uint32{0x00b98134, 0x008cabdc, 0x03f637f0, 0x03236d2a, 0x03cf3969, 0x024ee8c0, 0x01eefe37, 0x035b3046, 0x031d37e3, 0x00386993}}, Y: Field{[10]uint32{0x003231da, 0x0173b507, 0x00fc2f95, 0x019e3d3b, 0x01ddbd35, 0x00fd606d, 0x00d2084b, 0x034bd7b1, 0x02d8885d, 0x0016235e}}}, + {X: Field{[10]uint32{0x01fdaaed, 0x0089da99, 0x00eca49c, 0x03b9ebc5, 0x01318929, 0x035c4644, 0x02253a1b, 0x00ea9b9c, 0x03ede854, 0x003ef577}}, Y: Field{[10]uint32{0x013b78bc, 0x033efc06, 0x016f2f76, 0x006b6f43, 0x00f23489, 0x016e30c4, 0x0005d516, 0x00d458f1, 0x030a432c, 0x000c5f3b}}}, + {X: Field{[10]uint32{0x00da6bc2, 0x01df39a1, 0x00a2ae30, 0x0137005e, 0x0030b87c, 0x03dedbc8, 0x031a8822, 0x02544213, 0x03f3b0a3, 0x003eb12d}}, Y: Field{[10]uint32{0x00867d75, 0x02ca656f, 0x01fae390, 0x034557c6, 0x00386ce0, 0x018a3f75, 0x00a5c54a, 0x008bf058, 0x01209e95, 0x001c0a6e}}}, + {X: Field{[10]uint32{0x03ef7c2b, 0x02a06150, 0x0053ee64, 0x014571d7, 0x013c29fc, 0x006d7f1f, 0x02c02964, 0x033d4200, 0x03de834f, 0x0032a190}}, Y: Field{[10]uint32{0x03cf17f9, 0x03ea592b, 0x014c3b26, 0x00c73b9c, 0x02f8ecea, 0x02b6767e, 0x036fd4d0, 0x00a5b890, 0x0027111e, 0x00241e9b}}}, + {X: Field{[10]uint32{0x03315f1f, 0x00b25b3c, 0x0066b120, 0x008af150, 0x03a4a73b, 0x03f92d22, 0x0226b19e, 0x003a85fa, 0x02490d70, 0x001c61cd}}, Y: Field{[10]uint32{0x03ded2fd, 0x00b04761, 0x0215abd8, 0x01208108, 0x01515127, 0x03973d0a, 0x03fc614d, 0x01d2ddd4, 0x00474bb3, 0x003db361}}}, + {X: Field{[10]uint32{0x00c5e3d7, 0x030f14d2, 0x03e6f15a, 0x023dddb2, 0x00175b76, 0x01df18fc, 0x02574826, 0x031cc89b, 0x00ff21c3, 0x0019f9ce}}, Y: Field{[10]uint32{0x02f2bdb2, 0x024d43ba, 0x026bfac7, 0x0151744c, 0x030ebd28, 0x01f3d824, 0x03a50644, 0x0375c95d, 0x000f2343, 0x00053945}}}, + {X: Field{[10]uint32{0x02198893, 0x03d57c66, 0x02934280, 0x010998b3, 0x036c5a5c, 0x00d3b85f, 0x01339f64, 0x0094fc81, 0x0331f875, 0x001452cf}}, Y: Field{[10]uint32{0x02e9a090, 0x02601f92, 0x0269fe46, 0x030b72a5, 0x01a61c0f, 0x039f3793, 0x011c538c, 0x03b1c133, 0x0193a2fb, 0x0013acce}}}, + {X: Field{[10]uint32{0x03c2dab3, 0x01614062, 0x03586f98, 0x005be12c, 0x02ca53c2, 0x006280e4, 0x0330a414, 0x00f9d5aa, 0x03a6eab0, 0x00109ab3}}, Y: Field{[10]uint32{0x01083926, 0x0166ab7c, 0x01a74acb, 0x03441d27, 0x02d34944, 0x0015ceed, 0x0206682d, 0x00431702, 0x02ab21cc, 0x0030f58f}}}, + {X: Field{[10]uint32{0x02d7a09c, 0x003a3de8, 0x005cad42, 0x01cb1608, 0x01b8ad4a, 0x01165f21, 0x03dcbee9, 0x015cdc3f, 0x034668c0, 0x002e51ae}}, Y: Field{[10]uint32{0x023401b9, 0x008eeb47, 0x02b2cdc7, 0x00e927fb, 0x03969ea1, 0x0196f180, 0x03e63a5e, 0x00e09959, 0x02d41263, 0x00331c03}}}, + {X: Field{[10]uint32{0x018e33ac, 0x00d6e576, 0x02dcd803, 0x03e3eca2, 0x001d1e38, 0x0335d77d, 0x01d7d3cc, 0x02d17d44, 0x00b3f6c8, 0x0039aa11}}, Y: Field{[10]uint32{0x0058cce2, 0x005db0bb, 0x017e2c0b, 0x00273249, 0x036c4aa1, 0x007dc5ea, 0x023268ee, 0x022431d2, 0x03893939, 0x0001fc91}}}, + {X: Field{[10]uint32{0x02458001, 0x034503e5, 0x03dcd117, 0x00fc08c4, 0x00493e90, 0x01492e63, 0x0236b415, 0x014ba305, 0x03bfd9e0, 0x0010f98a}}, Y: Field{[10]uint32{0x023b352d, 0x011de669, 0x03cec8e1, 0x02ed27b2, 0x01ebee23, 0x0373fcc7, 0x01993000, 0x0354a0c2, 0x013d0a90, 0x003d2061}}}, + {X: Field{[10]uint32{0x0047f817, 0x03d12e20, 0x02ad9e94, 0x01124496, 0x01e555a8, 0x00776e6f, 0x0223e1c4, 0x011db50b, 0x000e3427, 0x003113bd}}, Y: Field{[10]uint32{0x02236fac, 0x02e7a8e3, 0x009d2498, 0x02cb6e13, 0x0238f664, 0x01dbd2b8, 0x0018e147, 0x03964fca, 0x0313e43e, 0x002fb750}}}, + {X: Field{[10]uint32{0x03212385, 0x022f7814, 0x037e8d40, 0x03eabf66, 0x037f58f2, 0x03e39265, 0x016f93f5, 0x00625702, 0x0313dcc1, 0x00286cd4}}, Y: Field{[10]uint32{0x023079f5, 0x023a29c2, 0x02c55bdc, 0x03008098, 0x03135a9e, 0x0024f605, 0x009f9cf5, 0x01430dcc, 0x025abf0d, 0x002f5fac}}}, + {X: Field{[10]uint32{0x035e964e, 0x0122a486, 0x01c91b67, 0x026b4562, 0x02138222, 0x00d6f663, 0x03f2f0c7, 0x0007268d, 0x03f9fd62, 0x001229bc}}, Y: Field{[10]uint32{0x034481b4, 0x00b14316, 0x01c91971, 0x00e54e97, 0x022c73e0, 0x02a75659, 0x0062c81f, 0x02a28192, 0x01553d41, 0x0006d514}}}, + {X: Field{[10]uint32{0x00061e9f, 0x00a17669, 0x0354db06, 0x033716c8, 0x0375f050, 0x023bb3c6, 0x019181dc, 0x02c1ba28, 0x0174651d, 0x0023807d}}, Y: Field{[10]uint32{0x035e108b, 0x03efec89, 0x00cae256, 0x0192e87c, 0x027d7ba9, 0x00bbb2b6, 0x006e90a0, 0x039f56db, 0x02a09800, 0x0027455b}}}, + {X: Field{[10]uint32{0x0205345d, 0x029372be, 0x0258f43d, 0x03cc5a52, 0x0228e375, 0x029e7e39, 0x0368b195, 0x02d5d8fa, 0x00db9e6d, 0x0012f03e}}, Y: Field{[10]uint32{0x03a5b555, 0x03c85710, 0x019d98d0, 0x00eda8cb, 0x01633805, 0x009a929a, 0x02380e81, 0x02c592ee, 0x0389a1e6, 0x0031a9c1}}}, + {X: Field{[10]uint32{0x0297a768, 0x015288ee, 0x0255f32d, 0x0236c033, 0x00f4c7ee, 0x002df6ae, 0x0230a665, 0x037ab758, 0x00cb5f5e, 0x00259bf4}}, Y: Field{[10]uint32{0x011a994b, 0x01b3de60, 0x004e1654, 0x0272a795, 0x0001e892, 0x038285ae, 0x0019a1de, 0x026d97d6, 0x0243bb4f, 0x00275913}}}, + {X: Field{[10]uint32{0x017b0d8a, 0x00b14421, 0x027f8296, 0x02e21891, 0x0320d50e, 0x010e38cd, 0x02dc7c74, 0x00ba9964, 0x01ad4952, 0x001aad46}}, Y: Field{[10]uint32{0x023ae44d, 0x00245442, 0x020da8a8, 0x0280de3b, 0x02e82653, 0x0153087b, 0x0367ec35, 0x0142898a, 0x02342b72, 0x00316e8e}}}, + {X: Field{[10]uint32{0x0276c62f, 0x01b5bbea, 0x03856d52, 0x029094c9, 0x03e55f18, 0x001db858, 0x03d0a0cd, 0x0183d4e6, 0x00e43e50, 0x003e2c2e}}, Y: Field{[10]uint32{0x00d48ba4, 0x03b3dbf5, 0x03ad1fe1, 0x02e90d9c, 0x017d5c95, 0x00a0e6a8, 0x00f29c86, 0x014fe963, 0x0052a658, 0x001d0f78}}}, + {X: Field{[10]uint32{0x02d18bad, 0x01e8494f, 0x030e1658, 0x018e7456, 0x02967e97, 0x0088f57e, 0x0185c0e5, 0x023fc2ad, 0x02f8579d, 0x00311427}}, Y: Field{[10]uint32{0x01b08362, 0x016393c7, 0x01cf97fe, 0x03021bc4, 0x0381199d, 0x01d2e2b9, 0x036d8d35, 0x02696168, 0x03e8ee97, 0x001ee47d}}}, + {X: Field{[10]uint32{0x0342379f, 0x02c03f6a, 0x003c3aac, 0x00cb3ead, 0x0004cef7, 0x02530393, 0x0207c538, 0x0143e388, 0x035a6ff4, 0x00268004}}, Y: Field{[10]uint32{0x03a9975d, 0x02e3fe07, 0x03d594df, 0x01ba2e11, 0x00b48159, 0x0232aee4, 0x020902a2, 0x0316c51d, 0x03483684, 0x000e4fb1}}}, + {X: Field{[10]uint32{0x03488601, 0x029016db, 0x01e3eaa4, 0x00c53949, 0x02a484d3, 0x0174f7b8, 0x010c17c2, 0x0235f37a, 0x03df173f, 0x000f5dd6}}, Y: Field{[10]uint32{0x030e51d4, 0x03a631ec, 0x02046b3d, 0x016e265c, 0x0138a402, 0x0275d389, 0x03287f55, 0x003da96f, 0x00bc0a56, 0x001f9ac2}}}, + {X: Field{[10]uint32{0x0303b529, 0x003a60de, 0x017b8f5d, 0x000b5c0f, 0x02a95e50, 0x034428a6, 0x03380a80, 0x0062d144, 0x013ea601, 0x0033aebf}}, Y: Field{[10]uint32{0x03b74b4e, 0x0054d2a1, 0x010c0fd6, 0x006fd54a, 0x025f6d8b, 0x00cee811, 0x0203594e, 0x027d87fd, 0x02b646f5, 0x000651de}}}, + {X: Field{[10]uint32{0x03a731b2, 0x02c661f3, 0x01de158c, 0x018fd62b, 0x037ecbc9, 0x03926c8d, 0x001ac162, 0x038f87bc, 0x00ac1ff3, 0x002ba28f}}, Y: Field{[10]uint32{0x01531efe, 0x0287a794, 0x03ac2bac, 0x00ac4529, 0x02ee26fd, 0x02371dce, 0x03f6af9e, 0x02dd25cc, 0x02752052, 0x001692c1}}}, + {X: Field{[10]uint32{0x01e3b38e, 0x010dd4eb, 0x02b28308, 0x00d743ef, 0x01fd39b6, 0x011deb13, 0x0118edee, 0x01c48d70, 0x00bb8bd4, 0x0035d34e}}, Y: Field{[10]uint32{0x00b54451, 0x01aecddf, 0x01c325d6, 0x03f4e4db, 0x021ec0a0, 0x006e9b78, 0x01850843, 0x00a0e5ea, 0x01b6f17a, 0x003cf941}}}, + {X: Field{[10]uint32{0x02beb2a8, 0x0256c53d, 0x01db2495, 0x00cec33a, 0x014d4f0b, 0x0381d747, 0x00dc1bef, 0x01e17345, 0x02757780, 0x003d0a1d}}, Y: Field{[10]uint32{0x00514b38, 0x00787618, 0x015364eb, 0x0354ffc9, 0x03950f34, 0x00d86b5b, 0x018bf6da, 0x018b7719, 0x0231eefc, 0x0028f7c8}}}, + {X: Field{[10]uint32{0x02378e94, 0x03250051, 0x0145450d, 0x0220f287, 0x01e62776, 0x0272c826, 0x03caaa86, 0x02b589da, 0x036bda19, 0x003a4755}}, Y: Field{[10]uint32{0x0040779c, 0x032a5c4e, 0x01db87ac, 0x0060df9d, 0x00020e79, 0x00c99763, 0x00313db8, 0x00b2e66b, 0x0038c8da, 0x002d5f88}}}, + {X: Field{[10]uint32{0x00c66ea2, 0x00c33f8e, 0x01aec7e8, 0x0377cf1f, 0x03e035e1, 0x03caaa90, 0x011b53da, 0x0385d8de, 0x00e87d77, 0x0009a651}}, Y: Field{[10]uint32{0x013707f6, 0x0339db06, 0x02ea739a, 0x0115edfb, 0x01567641, 0x026cc8f2, 0x028ca430, 0x031fec14, 0x036434bd, 0x0032c045}}}, + {X: Field{[10]uint32{0x0244a3d1, 0x03807ec1, 0x02a5ee94, 0x005cbfdb, 0x01fb0993, 0x01eec5d9, 0x0261c685, 0x00da046a, 0x028a8f0b, 0x003b5079}}, Y: Field{[10]uint32{0x0108231c, 0x0037ae31, 0x005dc1dd, 0x03823302, 0x0071c918, 0x00f65600, 0x03a1e448, 0x02f8109a, 0x007b880c, 0x003cb324}}}, + {X: Field{[10]uint32{0x01fec0de, 0x01e59083, 0x0113ab0b, 0x03c4cc88, 0x01538192, 0x00e8cf5a, 0x0236e4f5, 0x032e978b, 0x024a96cf, 0x001a51d9}}, Y: Field{[10]uint32{0x038fb6cd, 0x01770be8, 0x01dc77f9, 0x02577b3d, 0x03256101, 0x01ab78cc, 0x01b76c4d, 0x02dbeea4, 0x01bc5b65, 0x00192074}}}, + {X: Field{[10]uint32{0x0227fb03, 0x021715c7, 0x02f668ea, 0x00b1c3a3, 0x00437901, 0x02a4996c, 0x000a42bb, 0x018f7daa, 0x007ce22b, 0x002a8f86}}, Y: Field{[10]uint32{0x00d011be, 0x02a47fc2, 0x0329c38f, 0x01239736, 0x03e8732f, 0x00c04150, 0x03fcab70, 0x027f465b, 0x016b9810, 0x00298e37}}}, + {X: Field{[10]uint32{0x004a944b, 0x026f863e, 0x021c5eff, 0x00de4493, 0x02bfd5ea, 0x0150ff5b, 0x029fbab6, 0x03e536d2, 0x00e1a4be, 0x00001779}}, Y: Field{[10]uint32{0x0157e2d6, 0x026ea79e, 0x03442967, 0x03469fb1, 0x0158f8ae, 0x01dd11d8, 0x0299513f, 0x038a502d, 0x0282693b, 0x00087128}}}, + {X: Field{[10]uint32{0x007a7ce5, 0x01b0ad0a, 0x030a0964, 0x03ba8ce8, 0x02fdd18f, 0x02bc2bc8, 0x0096c793, 0x02d1de07, 0x00c72c87, 0x00194cf7}}, Y: Field{[10]uint32{0x037ccc51, 0x00dc1620, 0x00cd3f8c, 0x033e8ebb, 0x00482748, 0x00d1085d, 0x01589fc2, 0x03e6ef3a, 0x01f23d82, 0x001fc0f9}}}, + {X: Field{[10]uint32{0x00fdf354, 0x02ec0299, 0x01871a5e, 0x008e9c2e, 0x01c5109f, 0x014d0d4c, 0x02008ab8, 0x01612af6, 0x033c129e, 0x0004e797}}, Y: Field{[10]uint32{0x033f0a98, 0x0028bddd, 0x009de619, 0x039209ab, 0x026bf011, 0x020d4ad8, 0x03182ee9, 0x023abe94, 0x025741fb, 0x00125edf}}}, + {X: Field{[10]uint32{0x0161f7c3, 0x01e6bba0, 0x01f0c7c7, 0x02060645, 0x013ce57b, 0x0363c958, 0x00ea9918, 0x03a5420f, 0x01ccf7e1, 0x00124ffa}}, Y: Field{[10]uint32{0x03020cd5, 0x02f93059, 0x02f4088c, 0x00562f30, 0x00639ab6, 0x028eed12, 0x00aff6a6, 0x03874115, 0x03fd62fc, 0x0039a5d8}}}, + {X: Field{[10]uint32{0x02a064a9, 0x039acd94, 0x008a7446, 0x0055d9bb, 0x03900e3c, 0x0240f29d, 0x01ac2fb4, 0x01c2e190, 0x03dbd8dd, 0x003b59d7}}, Y: Field{[10]uint32{0x00416de9, 0x01bcc4da, 0x037fd1f2, 0x02c9739d, 0x0223ccff, 0x02c0622b, 0x00669b40, 0x03d6d1b8, 0x037985ce, 0x002986ec}}}, + {X: Field{[10]uint32{0x02260a4d, 0x02c32a66, 0x00b83136, 0x0110e187, 0x02b6d484, 0x014e4f54, 0x03c14e31, 0x0278e9e5, 0x00a89a76, 0x0005cd9c}}, Y: Field{[10]uint32{0x03bd4904, 0x00f689f1, 0x02bc6d68, 0x03ddf760, 0x00d140b3, 0x01242104, 0x02a1b28e, 0x0134ba57, 0x0121c1ba, 0x0013750e}}}, + {X: Field{[10]uint32{0x035d1610, 0x0387c258, 0x0128cdf9, 0x00f4b329, 0x00a1da93, 0x03041ba0, 0x011e05a0, 0x038551bc, 0x03a08f87, 0x00356978}}, Y: Field{[10]uint32{0x01175352, 0x00a45397, 0x01167255, 0x01d0828d, 0x01aa20df, 0x0307fec3, 0x00a9c6f2, 0x03024a34, 0x01e0daf3, 0x001f1b15}}}, + {X: Field{[10]uint32{0x02f6fa2a, 0x0168ce36, 0x00ebe417, 0x00c9d3b9, 0x01a0a999, 0x01359a5f, 0x02f2e2b9, 0x00c871a4, 0x01a004ab, 0x00153d7a}}, Y: Field{[10]uint32{0x01f2de21, 0x0359b622, 0x0342b5cb, 0x032a157f, 0x0258a7d9, 0x03e0a376, 0x02eb7614, 0x01b91cd2, 0x03d175fa, 0x001633c4}}}, + {X: Field{[10]uint32{0x03ebe6da, 0x01c96f1f, 0x01d4c9e8, 0x00b65111, 0x02fd9a63, 0x010988ac, 0x025544a4, 0x03a6558b, 0x0098154d, 0x00359a0a}}, Y: Field{[10]uint32{0x0190f206, 0x01c7718c, 0x001ebd13, 0x0117dd83, 0x030b2d50, 0x01e5c6a8, 0x0202c50a, 0x02e15d43, 0x023b9ba3, 0x00260247}}}, + {X: Field{[10]uint32{0x01c2da08, 0x0126fdb3, 0x008cafef, 0x03fc6324, 0x02610bec, 0x00b7b34d, 0x01f6e1a8, 0x03131236, 0x01b92af2, 0x00094c06}}, Y: Field{[10]uint32{0x017c680a, 0x02e1ae8e, 0x02a5a495, 0x00ef694e, 0x023ffbdd, 0x00421cb8, 0x02ebdce8, 0x0275d397, 0x035ad950, 0x00185f4c}}}, + {X: Field{[10]uint32{0x004da6cb, 0x019f3544, 0x00f16bab, 0x01d14391, 0x02ced725, 0x03023ca4, 0x00d2bcfa, 0x03af7958, 0x00ca461b, 0x00015bd9}}, Y: Field{[10]uint32{0x013aee44, 0x00efcf56, 0x023eebd8, 0x014ee40e, 0x02757cb5, 0x00bba050, 0x012bca8f, 0x020ca2a6, 0x01cfdc27, 0x0016c821}}}, + {X: Field{[10]uint32{0x03553420, 0x03b49163, 0x012f64dd, 0x03a6fbcc, 0x005a31a1, 0x01f8fb8e, 0x025c1928, 0x00ea6bc3, 0x01711e15, 0x003ce725}}, Y: Field{[10]uint32{0x03b0b1cc, 0x020a4c38, 0x03a974b8, 0x018922f7, 0x02e742ef, 0x0126304c, 0x039df908, 0x01ae7de1, 0x02c11c20, 0x00133252}}}, + {X: Field{[10]uint32{0x013128b5, 0x037758b0, 0x005368c8, 0x01297783, 0x01b2f303, 0x01716ab9, 0x02d3dad9, 0x021cf00c, 0x02a8cbdf, 0x00010dfa}}, Y: Field{[10]uint32{0x013c59c6, 0x038c2026, 0x01fcc721, 0x00b77c30, 0x012f8d1b, 0x03583696, 0x00245993, 0x0042ed65, 0x020eb003, 0x0009f63a}}}, + {X: Field{[10]uint32{0x0080e9b2, 0x027ad2ea, 0x0371f0a7, 0x0298053b, 0x003f13e7, 0x00715d4d, 0x010ae621, 0x019e6112, 0x01893f5d, 0x002b7869}}, Y: Field{[10]uint32{0x0391c715, 0x00b8988d, 0x01304902, 0x00adfc90, 0x01e80188, 0x00f06d0a, 0x03404d8c, 0x01a8eeb1, 0x017c537e, 0x002f5270}}}, + {X: Field{[10]uint32{0x02c1224e, 0x038b64ce, 0x0198fd16, 0x01e31eb4, 0x00a87ef9, 0x029386db, 0x0357d977, 0x00696ae7, 0x01d5c309, 0x0024d89d}}, Y: Field{[10]uint32{0x036b9f32, 0x000481f7, 0x0057e5aa, 0x0146c5ee, 0x00ed5988, 0x01b88934, 0x0375d96c, 0x021317aa, 0x010ad8bd, 0x001a149a}}}, + {X: Field{[10]uint32{0x039b786e, 0x03ed69da, 0x01e8cc33, 0x00741dad, 0x03e29497, 0x03202e74, 0x006db205, 0x03573781, 0x01fd3e8f, 0x0000a795}}, Y: Field{[10]uint32{0x00010a0d, 0x03379263, 0x02f57af6, 0x00ab5869, 0x002bbf3e, 0x01c83391, 0x038312f0, 0x00d2e515, 0x017a7eb9, 0x0001da79}}}, + {X: Field{[10]uint32{0x009051ef, 0x02c566e0, 0x00584168, 0x0011d91f, 0x003ae378, 0x01785bde, 0x00b52754, 0x0217fc66, 0x02a73501, 0x0037e0d8}}, Y: Field{[10]uint32{0x02af6bab, 0x032b82d8, 0x01a263a6, 0x0203b923, 0x03735ece, 0x012c5b0e, 0x026b6048, 0x028ef7a0, 0x0046fbd4, 0x002bf2cd}}}, + {X: Field{[10]uint32{0x018a427e, 0x0057b381, 0x0033c254, 0x020e5b3d, 0x01b9a01e, 0x01b31867, 0x01660379, 0x017f83e5, 0x012309a3, 0x0017d10c}}, Y: Field{[10]uint32{0x00901ac0, 0x01f530ac, 0x03c906fd, 0x01c923eb, 0x0337d81c, 0x01aaa705, 0x0272b605, 0x02af14a4, 0x0012fc0a, 0x000e170a}}}, + {X: Field{[10]uint32{0x01dd2de5, 0x038d1205, 0x0163f4b7, 0x03fd74f7, 0x008c5323, 0x01a4ff13, 0x01b77a31, 0x000df149, 0x021553c6, 0x00306710}}, Y: Field{[10]uint32{0x013900a4, 0x0323b06a, 0x01822159, 0x01564b26, 0x00a19d22, 0x03679ac8, 0x01161896, 0x01df849c, 0x028a8791, 0x0027ddba}}}, + {X: Field{[10]uint32{0x032d45ac, 0x028508eb, 0x013f1d62, 0x024aa084, 0x0214d19d, 0x018e5091, 0x0162fdb3, 0x008ccbab, 0x021dd1e0, 0x0022afce}}, Y: Field{[10]uint32{0x03e36dde, 0x006d6629, 0x007ec7de, 0x0105b754, 0x02defc29, 0x0330b67c, 0x027a984e, 0x03b0fdd7, 0x027fdcf5, 0x000c96a5}}}, + {X: Field{[10]uint32{0x0359ae7a, 0x028f377d, 0x03b9433f, 0x01db0181, 0x0257c1dd, 0x01c7aa12, 0x014a58fa, 0x01879b13, 0x0390b931, 0x00322ff7}}, Y: Field{[10]uint32{0x030b20f9, 0x02513cc9, 0x01ce5b51, 0x033c054d, 0x00fd7990, 0x00f96a8f, 0x007efd3c, 0x03ed8fb5, 0x00a3d172, 0x0008f70e}}}, + {X: Field{[10]uint32{0x02d2c78d, 0x01fa1b80, 0x038b443c, 0x01016dde, 0x02a26ccc, 0x017e435e, 0x019e7ab8, 0x01665e9d, 0x026c35c5, 0x00025d99}}, Y: Field{[10]uint32{0x001ed0ff, 0x0145850e, 0x00f89605, 0x03fad0dc, 0x0392c52c, 0x008333bb, 0x02db2e4e, 0x033c96fc, 0x003e44fa, 0x001b4d0b}}}, + {X: Field{[10]uint32{0x0163252b, 0x00aa337e, 0x0273a1c1, 0x01b3fac8, 0x021fd65b, 0x02f6270e, 0x03b8e8a5, 0x0393871e, 0x03a77737, 0x0039de42}}, Y: Field{[10]uint32{0x03bdba42, 0x0096773f, 0x02e1a810, 0x03caa7a4, 0x01f7138f, 0x02ca2663, 0x02754ead, 0x02d63dc3, 0x02201534, 0x000098d7}}}, + {X: Field{[10]uint32{0x0176fb0d, 0x01df6051, 0x03efe375, 0x03265d7c, 0x03b471ce, 0x02e61ab0, 0x00e3ecd5, 0x03b20fd8, 0x017f6bfc, 0x0010b2e0}}, Y: Field{[10]uint32{0x005cf49a, 0x022937b1, 0x03cce270, 0x025941d7, 0x01144a85, 0x015cde42, 0x0162050a, 0x02f643c8, 0x0128b2f9, 0x003b4d78}}}, + {X: Field{[10]uint32{0x012f3cbb, 0x014383d0, 0x018f0024, 0x00a293f5, 0x01319024, 0x03847c51, 0x0060397a, 0x024ccfff, 0x00701a23, 0x0028221a}}, Y: Field{[10]uint32{0x0083af52, 0x0207e646, 0x00ad6d8a, 0x03267300, 0x03fc6002, 0x01221fae, 0x0251995b, 0x0380d023, 0x03371ad6, 0x0032121b}}}, + {X: Field{[10]uint32{0x032c4bb3, 0x021bc95c, 0x01aab034, 0x00b08998, 0x02e6a964, 0x00d9294b, 0x00fd8e8b, 0x006e2c10, 0x02419f10, 0x00290332}}, Y: Field{[10]uint32{0x0045a910, 0x02c542a5, 0x01285bab, 0x026e5402, 0x03b0655b, 0x001c0730, 0x01e611df, 0x025bc0b4, 0x03693ec0, 0x0003d086}}}, + {X: Field{[10]uint32{0x01beb721, 0x0181290d, 0x0350fefe, 0x003c5068, 0x02c53294, 0x027d5d57, 0x035b70bc, 0x011cb169, 0x0178bbb0, 0x00242bbe}}, Y: Field{[10]uint32{0x014bbf0d, 0x021f8478, 0x01187a5f, 0x004251e7, 0x0193f585, 0x0391e3a9, 0x008cde92, 0x03db932a, 0x0070737c, 0x003e7c17}}}, + {X: Field{[10]uint32{0x003407c3, 0x031a65eb, 0x03f1a07b, 0x00ceee09, 0x02d73ae4, 0x036e6b2d, 0x00292f68, 0x007ce580, 0x0281a0f6, 0x003ff08e}}, Y: Field{[10]uint32{0x034d4b66, 0x017ca115, 0x02803686, 0x00de81d1, 0x004f313b, 0x0351f338, 0x03c74630, 0x0384e49d, 0x0212bce5, 0x002dda81}}}, + {X: Field{[10]uint32{0x00a112a5, 0x003fd408, 0x01ded2ab, 0x00b837e6, 0x02742c85, 0x02610969, 0x022bc162, 0x03e64109, 0x039440bd, 0x0034f29e}}, Y: Field{[10]uint32{0x024d637a, 0x01e03ff7, 0x022cb1f9, 0x02dcd07e, 0x005ef191, 0x0204f38b, 0x004281f9, 0x0209713d, 0x03acca7e, 0x00276bb2}}}, + {X: Field{[10]uint32{0x01bb9f06, 0x02cf3294, 0x02b41b23, 0x02b3557b, 0x03469b21, 0x038386b1, 0x02b7589c, 0x02cc70a9, 0x02bb720a, 0x000a94e8}}, Y: Field{[10]uint32{0x0051f84e, 0x0295f8f5, 0x03256c21, 0x0036e912, 0x0027f781, 0x008341bb, 0x00d0f522, 0x025919e9, 0x0133ffde, 0x00046bfe}}}, + {X: Field{[10]uint32{0x01a1ac96, 0x00211d2b, 0x0087d05a, 0x01c5fedd, 0x0322b2fc, 0x02e3d72f, 0x03d2f77b, 0x000a1e9b, 0x035680c4, 0x00121f94}}, Y: Field{[10]uint32{0x02a849c8, 0x02434356, 0x03a731e9, 0x00954830, 0x01029c96, 0x0144c111, 0x0365326d, 0x00358dde, 0x03d54607, 0x0014ef5f}}}, + {X: Field{[10]uint32{0x027b3e16, 0x0396e659, 0x03a2963d, 0x02d20827, 0x01cf23c0, 0x00bd2d8a, 0x0332cfd6, 0x028307f0, 0x03cf291d, 0x000f9697}}, Y: Field{[10]uint32{0x02b86825, 0x0037b43e, 0x01c97b06, 0x03bdfd57, 0x008b33d7, 0x01ceec4c, 0x03028df7, 0x02687c12, 0x032c4338, 0x0021a61f}}}, + {X: Field{[10]uint32{0x023e256f, 0x01f5de43, 0x02b8ed5f, 0x03ed5c21, 0x00601840, 0x00b755c1, 0x002493d2, 0x011f08b1, 0x03c515a8, 0x0013e42b}}, Y: Field{[10]uint32{0x02b831be, 0x037b43ea, 0x01e33226, 0x0250ad61, 0x024ef939, 0x02b034f0, 0x01f6b089, 0x01a248cd, 0x0158ac2e, 0x0011b8c6}}}, + {X: Field{[10]uint32{0x023601fc, 0x01617078, 0x01a1782c, 0x00e29161, 0x02c2ff4b, 0x0086fa60, 0x02738071, 0x00fa9e9a, 0x012b40be, 0x002f81ce}}, Y: Field{[10]uint32{0x01f258db, 0x02a085bc, 0x0038da57, 0x01c799bb, 0x01431727, 0x036f8842, 0x01775b81, 0x027a39ef, 0x0057657c, 0x000e8561}}}, + {X: Field{[10]uint32{0x021108ed, 0x018d04be, 0x02603e05, 0x010546d6, 0x02ecc2f7, 0x01f09381, 0x02f9e6d4, 0x00dd7c88, 0x00e52140, 0x0021b09d}}, Y: Field{[10]uint32{0x00a96ef8, 0x0025a490, 0x003a2aa0, 0x01dbe4b0, 0x012703f2, 0x0326261f, 0x02b90b64, 0x035640cb, 0x02b94065, 0x001280be}}}, + {X: Field{[10]uint32{0x0173cf97, 0x023813cd, 0x03626267, 0x02a88449, 0x02287277, 0x036b04ff, 0x03b30561, 0x00e26049, 0x026be792, 0x00013f4e}}, Y: Field{[10]uint32{0x011173e4, 0x000d0b7c, 0x000d238c, 0x0288ed0e, 0x02f07ebe, 0x00ef1fa5, 0x00f4b4b4, 0x03b2db1b, 0x01a163cf, 0x00192628}}}, + {X: Field{[10]uint32{0x01117c94, 0x031da577, 0x0118cb68, 0x021aea06, 0x03cd2a5f, 0x03f33f41, 0x02fe78d1, 0x02f75e2a, 0x01ca5423, 0x0033e90d}}, Y: Field{[10]uint32{0x00ce1fe8, 0x01a0d5c4, 0x00cefd7d, 0x00ed2a7d, 0x01c399b5, 0x01a114e2, 0x03778546, 0x03de78d6, 0x011c02df, 0x002fd322}}}, + {X: Field{[10]uint32{0x021d446c, 0x024f8b0f, 0x010c1cdf, 0x03987cf2, 0x01414119, 0x01d1a6bf, 0x029e9277, 0x00f3166c, 0x031b7953, 0x002a96b2}}, Y: Field{[10]uint32{0x02a498ab, 0x01023d08, 0x01bc26bb, 0x004271d7, 0x028b11bf, 0x0060dd9f, 0x02d3854e, 0x030007ed, 0x01b78713, 0x002c37ca}}}, + {X: Field{[10]uint32{0x005c3d15, 0x00f82855, 0x01175635, 0x03d5341b, 0x03435c09, 0x006f294b, 0x03fa1c44, 0x03d56376, 0x02ecc21b, 0x0006e4f0}}, Y: Field{[10]uint32{0x03195ed2, 0x00fed28c, 0x00c4aeb5, 0x02c68837, 0x03f72e67, 0x0171b498, 0x00e8a5fd, 0x0243996b, 0x01ff7181, 0x0015b115}}}, + {X: Field{[10]uint32{0x03b91760, 0x0145260b, 0x010acd85, 0x02489190, 0x01c84800, 0x017dcac3, 0x039438b5, 0x03482fd8, 0x03f02566, 0x0005d132}}, Y: Field{[10]uint32{0x034c66f5, 0x03d48a77, 0x01f6c683, 0x03e12f68, 0x00068dc0, 0x029f495c, 0x01d5da57, 0x02d71674, 0x03a232b0, 0x001f9de9}}}, + {X: Field{[10]uint32{0x0302582b, 0x02a101ff, 0x01bedd24, 0x029e88a4, 0x021b9cb9, 0x0181ecc5, 0x02f8ffc0, 0x02300a30, 0x00a5ed44, 0x00282fa6}}, Y: Field{[10]uint32{0x011da6ea, 0x03065c40, 0x029a2274, 0x0207774d, 0x0376b869, 0x033dab23, 0x01444620, 0x00d496d3, 0x006a0239, 0x0039f30b}}}, + {X: Field{[10]uint32{0x03845882, 0x0244019e, 0x03e71148, 0x00673723, 0x038b2f2b, 0x0235d7a8, 0x02b2591d, 0x03dea558, 0x03f5dab5, 0x00383964}}, Y: Field{[10]uint32{0x02d67334, 0x017d70b2, 0x029c7e78, 0x031927d1, 0x00b5464d, 0x0290b38b, 0x03c26141, 0x0176d6ce, 0x036215e3, 0x00242231}}}, + {X: Field{[10]uint32{0x029290f5, 0x03f21e70, 0x02b408b9, 0x01b17924, 0x01ffe579, 0x039ec359, 0x031b928d, 0x00baaf5b, 0x0095a498, 0x001e0936}}, Y: Field{[10]uint32{0x00c7ee88, 0x02bc06af, 0x02d448a4, 0x005d5f36, 0x00d6bcf1, 0x0308cb18, 0x022d8bbf, 0x0214a0e2, 0x00688e42, 0x002b85d7}}}, + {X: Field{[10]uint32{0x01d96e66, 0x0073c43e, 0x00b5c421, 0x024fa5db, 0x012aa513, 0x00066b8b, 0x00e4a2cd, 0x00477085, 0x017ee0b6, 0x001274b9}}, Y: Field{[10]uint32{0x015b770a, 0x028f2caf, 0x014d25cf, 0x013e9e05, 0x0311c81e, 0x00a6ee7e, 0x01b79198, 0x007dc9de, 0x00ca8801, 0x003fe831}}}, + {X: Field{[10]uint32{0x035ead00, 0x004e73f1, 0x03ee8be2, 0x00cba71e, 0x02eeb3de, 0x00e262ba, 0x0012e8f8, 0x006a1618, 0x036b8f70, 0x00369817}}, Y: Field{[10]uint32{0x0011d246, 0x027973a5, 0x03633d69, 0x01f19d47, 0x025a2430, 0x024fd43e, 0x030ca5ea, 0x00706a27, 0x012ce98a, 0x0016e830}}}, + {X: Field{[10]uint32{0x02c16ff2, 0x03ff672e, 0x02785652, 0x00f070cb, 0x029307be, 0x03670e02, 0x01de2bd1, 0x0139b568, 0x03ebcde9, 0x002bbaaa}}, Y: Field{[10]uint32{0x010bf840, 0x006aebf5, 0x02460664, 0x006b0965, 0x03b62e49, 0x0041c24f, 0x000a52bf, 0x03b37814, 0x03558510, 0x000c0251}}}, + {X: Field{[10]uint32{0x010c40b7, 0x007fac68, 0x0378cb0e, 0x002f972d, 0x0066ca0a, 0x00c17e7a, 0x02d1e1f4, 0x03f992c6, 0x012b35f3, 0x0018bc62}}, Y: Field{[10]uint32{0x03f5780d, 0x0204e9c0, 0x028838e1, 0x0148b452, 0x03f1f890, 0x0316fb6f, 0x0287f090, 0x02fd28b8, 0x005ee600, 0x00069108}}}, + {X: Field{[10]uint32{0x02979382, 0x01356265, 0x01e944ac, 0x00cf6b89, 0x033a567b, 0x0029a020, 0x02be9f55, 0x00b5a4a3, 0x02c54677, 0x00308247}}, Y: Field{[10]uint32{0x02d4b31e, 0x02140b72, 0x002b2382, 0x01a4b56a, 0x02eb610c, 0x007f8651, 0x01fa722a, 0x0274c5cd, 0x025bd2e8, 0x0016669d}}}, + {X: Field{[10]uint32{0x03242367, 0x0003f7c6, 0x01ba597d, 0x01557e0f, 0x02e50a24, 0x027f9f08, 0x00e1b237, 0x0248d5c0, 0x015b1951, 0x002ff5f0}}, Y: Field{[10]uint32{0x0066b17b, 0x00af51af, 0x02694037, 0x031235bf, 0x03f4cdda, 0x03ebf4a1, 0x01272130, 0x031cd7a8, 0x03de545e, 0x002b1b79}}}, + {X: Field{[10]uint32{0x032ddc7f, 0x017d8d44, 0x00fd116b, 0x027dd3cf, 0x01958162, 0x020c76a0, 0x03d85073, 0x03f7de40, 0x03843cab, 0x00353539}}, Y: Field{[10]uint32{0x021758a6, 0x01d0b501, 0x0082d219, 0x0138ae3c, 0x01d1cd6d, 0x011d572c, 0x0265a284, 0x02eb2ff3, 0x011d582c, 0x00079258}}}, + {X: Field{[10]uint32{0x03908fdc, 0x03047223, 0x03d02cdd, 0x03e37d85, 0x014945b4, 0x0177630c, 0x03434a49, 0x02cd37ce, 0x0009c378, 0x000795d4}}, Y: Field{[10]uint32{0x00f6cdb7, 0x02161fc3, 0x005655bd, 0x008cffea, 0x0010bf21, 0x023c8273, 0x017458cb, 0x0256849a, 0x03a2810c, 0x001738df}}}, + {X: Field{[10]uint32{0x01408fd0, 0x03e570ee, 0x00ee1108, 0x01b4dc41, 0x01c9268c, 0x03f7d979, 0x035e690f, 0x01fae287, 0x022eac23, 0x002d699a}}, Y: Field{[10]uint32{0x03f72798, 0x00fbca32, 0x030de3c4, 0x0200c1d8, 0x03f8cc32, 0x0219a31b, 0x0042ba86, 0x03dba982, 0x02c0aaa4, 0x00264016}}}, + {X: Field{[10]uint32{0x0326fe0d, 0x030fb99f, 0x036e60cf, 0x00c0878f, 0x0166bc3a, 0x02ebabe3, 0x0090b063, 0x0164f19b, 0x01352599, 0x000768e7}}, Y: Field{[10]uint32{0x0141311f, 0x0216e172, 0x03e489f2, 0x029e3f1f, 0x00f7e58a, 0x00070c00, 0x030d076c, 0x00546d51, 0x005eb6b0, 0x00249ca8}}}, + {X: Field{[10]uint32{0x01a971b2, 0x01d10d2d, 0x005002b3, 0x016bce11, 0x024e900c, 0x007d0a3f, 0x02862d72, 0x00029d94, 0x00b6b100, 0x001fcec4}}, Y: Field{[10]uint32{0x02ecd385, 0x03481728, 0x03a9e1f5, 0x01d37cf0, 0x008c4a4f, 0x0095be82, 0x03bd4c90, 0x03b8cc44, 0x03e07907, 0x002e528b}}}, + {X: Field{[10]uint32{0x024eb2e0, 0x02132f5e, 0x018cbbaf, 0x0228fd74, 0x02e5dc36, 0x008030b6, 0x03eb61ae, 0x003e6fda, 0x03c66185, 0x00109841}}, Y: Field{[10]uint32{0x03e511af, 0x0231c319, 0x014f540f, 0x033a3a39, 0x000857ce, 0x034ebfa9, 0x0313488b, 0x03b43e35, 0x0078a9e6, 0x00387e9f}}}, + {X: Field{[10]uint32{0x01be9697, 0x01d290d1, 0x013e2fa3, 0x0265a03d, 0x01d6c940, 0x012273ea, 0x02093c21, 0x031310c4, 0x0256708f, 0x00155789}}, Y: Field{[10]uint32{0x004db6e7, 0x00b8af8a, 0x00cb002f, 0x008b1bd1, 0x01a78224, 0x019d2e84, 0x0166e06c, 0x02dda889, 0x03b71e3b, 0x00003d7b}}}, + {X: Field{[10]uint32{0x017dd290, 0x03f6c4a4, 0x028b3af8, 0x0095190a, 0x01033606, 0x0096dc27, 0x02a927e7, 0x0381f098, 0x017b5736, 0x001c5c2c}}, Y: Field{[10]uint32{0x030973b1, 0x02b9cd40, 0x01608627, 0x029adb7d, 0x0398b2c6, 0x029df382, 0x02d86e69, 0x02204ed6, 0x02a3f899, 0x003bd0df}}}, + {X: Field{[10]uint32{0x025c2180, 0x03b0c456, 0x00172aaa, 0x011b224c, 0x01eb4de6, 0x01ca913c, 0x02329d00, 0x03f44d27, 0x033e66fe, 0x00072a2a}}, Y: Field{[10]uint32{0x030a3c49, 0x003be98e, 0x03274fd2, 0x028554c6, 0x02c70103, 0x012613b4, 0x01da2a0f, 0x035dda07, 0x01c92a87, 0x001bf190}}}, + {X: Field{[10]uint32{0x005366b8, 0x0393e370, 0x007977d5, 0x034d21ed, 0x0385f057, 0x007069ca, 0x0150c1e4, 0x00ba0afc, 0x006af6d4, 0x0020d495}}, Y: Field{[10]uint32{0x02c5fdb1, 0x00ea0d61, 0x0084b138, 0x039ba831, 0x01ac92b0, 0x0070ac72, 0x008d7e72, 0x016c4aa2, 0x02b27ca2, 0x001daf96}}}, + {X: Field{[10]uint32{0x00904cd7, 0x02211667, 0x0244c3e9, 0x0285364b, 0x03353123, 0x0197123b, 0x03988ea7, 0x02e7558f, 0x037b1730, 0x000bc44b}}, Y: Field{[10]uint32{0x0234a44f, 0x029a094b, 0x031bb743, 0x02f50680, 0x0027d7a8, 0x00ab45d0, 0x0370b16d, 0x01f568cb, 0x0297f648, 0x003acd23}}}, + {X: Field{[10]uint32{0x02a5648a, 0x009423cf, 0x00f1d519, 0x00245a9c, 0x002eb6fd, 0x01042979, 0x032494ad, 0x031b1c75, 0x023c164d, 0x0003a100}}, Y: Field{[10]uint32{0x02f4462d, 0x01bf2007, 0x01b8a48a, 0x00c6ac51, 0x01225aa0, 0x008a05af, 0x032f5106, 0x000ca226, 0x018529be, 0x0018d3cd}}}, + {X: Field{[10]uint32{0x0228fc6b, 0x010049e3, 0x029afd6e, 0x0108c719, 0x004da403, 0x005355fd, 0x00039291, 0x03d49c2e, 0x011745da, 0x00254713}}, Y: Field{[10]uint32{0x0227f0a7, 0x02b92b56, 0x00921bb2, 0x03c71cbf, 0x03b9592e, 0x02ba0989, 0x0296f608, 0x003eecb1, 0x0311a8b3, 0x003e420e}}}, + {X: Field{[10]uint32{0x00cb19f4, 0x02e24be3, 0x007fd689, 0x010546ba, 0x01788458, 0x007e516e, 0x025548c5, 0x027cfb82, 0x0057f60b, 0x002b6aa5}}, Y: Field{[10]uint32{0x0361caa6, 0x01a16205, 0x018302e4, 0x01450339, 0x03f899b9, 0x0159d265, 0x039b0475, 0x03fbee37, 0x03f92145, 0x0020d195}}}, + {X: Field{[10]uint32{0x019e6ef7, 0x017f7b98, 0x03397749, 0x00d474c0, 0x00597f3e, 0x00b5fee9, 0x02ef3d85, 0x0028ed45, 0x02b30980, 0x001924a5}}, Y: Field{[10]uint32{0x021df105, 0x0214cfb5, 0x038535c7, 0x00776233, 0x005c8b44, 0x00bb7faf, 0x005f078e, 0x01459ff7, 0x00901021, 0x001133a7}}}, + {X: Field{[10]uint32{0x0006266f, 0x02534fd8, 0x012ce4bc, 0x02dac47e, 0x029f1e9d, 0x021d7c75, 0x02fe2ba7, 0x01d6fce2, 0x02979085, 0x000b075f}}, Y: Field{[10]uint32{0x01a2cf7f, 0x008dc983, 0x02ff50ba, 0x0307f469, 0x038c6c8e, 0x030272c0, 0x03b4e4bb, 0x02f422ee, 0x00bc030a, 0x0027ac94}}}, + {X: Field{[10]uint32{0x004647ec, 0x0355be5d, 0x0174f0f6, 0x029f46ef, 0x03b44ada, 0x014be865, 0x0293b100, 0x02f0c9e0, 0x038bed4e, 0x002c4c3f}}, Y: Field{[10]uint32{0x02a5eb33, 0x01643ffb, 0x01806212, 0x002c3730, 0x000136f6, 0x019b908a, 0x03d0a950, 0x031fd9db, 0x01e9b785, 0x00128291}}}, + {X: Field{[10]uint32{0x030e6231, 0x00335432, 0x0011732a, 0x012b5a3c, 0x0029bf68, 0x03335c73, 0x02e9c740, 0x02cb64c6, 0x019762ec, 0x0013ca96}}, Y: Field{[10]uint32{0x00cf17de, 0x0302fd5f, 0x00237377, 0x005b3def, 0x000fc442, 0x00c27b70, 0x0300dde7, 0x01c20fe9, 0x01b45cfc, 0x0037afe3}}}, + {X: Field{[10]uint32{0x03a23c0b, 0x0034b781, 0x030d1cab, 0x002ea678, 0x020a178c, 0x02968936, 0x01419a18, 0x01b89790, 0x01a17fbe, 0x0025fe7a}}, Y: Field{[10]uint32{0x03559128, 0x03688c95, 0x03c0a4dd, 0x02ef9c74, 0x026cb622, 0x003ed4e1, 0x034fdc87, 0x02d2003e, 0x026b0cce, 0x0006ac48}}}, + {X: Field{[10]uint32{0x01d9d8cb, 0x00ed1f42, 0x02f4cbb9, 0x03c42b4f, 0x00bfd486, 0x02dc4250, 0x01820673, 0x0345f900, 0x03e5e9f5, 0x00385fcf}}, Y: Field{[10]uint32{0x01272f58, 0x00a40eed, 0x0196b59c, 0x018b80fb, 0x0344ad7d, 0x0014492b, 0x0360b263, 0x00ea29ac, 0x0252615d, 0x003c449a}}}, + {X: Field{[10]uint32{0x032fa2de, 0x02a2ed9e, 0x026887a5, 0x014eab0d, 0x033ae668, 0x00e283f8, 0x00c3e945, 0x02060a40, 0x00467d63, 0x00068e7e}}, Y: Field{[10]uint32{0x02903aa5, 0x037bd6e0, 0x027bf28d, 0x00feed15, 0x0118492f, 0x035f1d40, 0x034dc019, 0x0169390a, 0x03995a62, 0x002b9f04}}}, + {X: Field{[10]uint32{0x002f5320, 0x021a4bad, 0x03e68cd1, 0x0205450a, 0x00baa605, 0x013ebfee, 0x0293e52f, 0x03e91242, 0x006127f6, 0x00229777}}, Y: Field{[10]uint32{0x016b0d8e, 0x020346a2, 0x0338974c, 0x0297f1e1, 0x00328e69, 0x03577f30, 0x02559ebb, 0x0377c690, 0x0325853d, 0x0017ad88}}}, + {X: Field{[10]uint32{0x0238c299, 0x0387e73f, 0x0190f7af, 0x01bfc234, 0x02b86490, 0x01bd6d76, 0x03dc17d5, 0x035bf351, 0x03b574b7, 0x00045f6f}}, Y: Field{[10]uint32{0x0190196b, 0x036e3757, 0x03b26bd5, 0x00bdae40, 0x00c50471, 0x0009902a, 0x03bc9233, 0x0051390d, 0x015130b7, 0x0012b348}}}, + {X: Field{[10]uint32{0x0270a537, 0x02168e62, 0x019f3f29, 0x031d0606, 0x00eec84e, 0x01428a98, 0x010706d9, 0x01fad5cc, 0x0228431c, 0x002c30c4}}, Y: Field{[10]uint32{0x0064ff78, 0x0122c02c, 0x02419a10, 0x01f10e3f, 0x030085e4, 0x0183608d, 0x00c32372, 0x01dbffa6, 0x03347928, 0x0029f7a6}}}, + {X: Field{[10]uint32{0x0243946f, 0x0347c0fc, 0x017e08d1, 0x02196962, 0x02736cbc, 0x005d81af, 0x03e6d5b5, 0x009d6b85, 0x00b9f493, 0x001f0843}}, Y: Field{[10]uint32{0x0359c63a, 0x038d4a45, 0x02db1c38, 0x02b0c3eb, 0x00920a7f, 0x02bc7c77, 0x00a92d87, 0x006173a9, 0x0123a8bd, 0x0005ec1d}}}, + {X: Field{[10]uint32{0x02d6e650, 0x01c5841b, 0x00aa1387, 0x02cbd15c, 0x03177b14, 0x02c3b285, 0x017b5192, 0x03b5118e, 0x0167578b, 0x0005cb94}}, Y: Field{[10]uint32{0x03830ba7, 0x01f3614c, 0x00cee173, 0x005f07e2, 0x039d3ba8, 0x00f1ceb4, 0x03de8038, 0x02e01758, 0x012e4776, 0x0027055d}}}, + {X: Field{[10]uint32{0x00030686, 0x02738a88, 0x019ca47e, 0x03ceaa70, 0x02c95a6e, 0x036b6011, 0x02373173, 0x03f6840d, 0x0040df25, 0x000586bf}}, Y: Field{[10]uint32{0x026089ce, 0x0035bc04, 0x03759ab9, 0x0182d895, 0x009926f1, 0x0291783a, 0x039c8193, 0x017ddad2, 0x0083c126, 0x00179bf4}}}, + {X: Field{[10]uint32{0x0216a85f, 0x034fb0e2, 0x018d9459, 0x0243b854, 0x002d194e, 0x01b8e451, 0x0369cf8b, 0x03b4cd35, 0x02a8e18a, 0x002e647c}}, Y: Field{[10]uint32{0x03cab7b0, 0x03433586, 0x00e8b1a0, 0x003886ca, 0x017e6e59, 0x0248f4b0, 0x0169d3e0, 0x01c723a8, 0x01a6b89f, 0x00074aea}}}, + {X: Field{[10]uint32{0x00ca8afc, 0x0328c351, 0x035026f1, 0x0121f56a, 0x007d6233, 0x03ecd91f, 0x016f4881, 0x03b9dfde, 0x009f5a6c, 0x0036b81a}}, Y: Field{[10]uint32{0x039c329c, 0x03221cf0, 0x01fa8c6c, 0x02c0c533, 0x0143ccc1, 0x00ef96e5, 0x01e69643, 0x02eb8a85, 0x0270f730, 0x003b99ed}}}, + {X: Field{[10]uint32{0x027e4e41, 0x03f63b22, 0x02e61aea, 0x02905a84, 0x03d72805, 0x018a7ed6, 0x0217ba14, 0x0270551a, 0x00cd75f8, 0x0011e963}}, Y: Field{[10]uint32{0x01fdd889, 0x0153cf0a, 0x007679b9, 0x02e5cf65, 0x02a4bc43, 0x007f07c2, 0x03e60bb6, 0x02043ad2, 0x03ed1bbb, 0x0030579f}}}, + {X: Field{[10]uint32{0x03040e3c, 0x0026d11a, 0x01698cef, 0x01a57142, 0x02d7582f, 0x013bd96d, 0x000697c9, 0x01bb8cc3, 0x03d02e3b, 0x003deb8b}}, Y: Field{[10]uint32{0x0019ca03, 0x03762b75, 0x00ea36a9, 0x0195e64d, 0x015eb495, 0x037506b2, 0x00d8e6dd, 0x004e6f15, 0x00aac527, 0x002b7a7e}}}, + {X: Field{[10]uint32{0x0012989d, 0x0112365f, 0x00dc8b6c, 0x0091757e, 0x00ae61cf, 0x03091296, 0x03e9c214, 0x02b88235, 0x02a89be2, 0x000557e7}}, Y: Field{[10]uint32{0x01b009ff, 0x033a74d9, 0x036808c1, 0x003d3345, 0x00cf5ea6, 0x032fd124, 0x0204abe6, 0x03466bf6, 0x01f3840c, 0x0004813d}}}, + {X: Field{[10]uint32{0x029d74f6, 0x018598c7, 0x01a5189a, 0x02e404f1, 0x01e35057, 0x0034fb8e, 0x01348a0e, 0x017c53e9, 0x01c3933b, 0x002a0f32}}, Y: Field{[10]uint32{0x0072a74a, 0x0352ebfc, 0x021dbe30, 0x00468a0f, 0x0052b91d, 0x007ef91e, 0x02a9c78e, 0x0211d878, 0x02d7fad6, 0x00102a99}}}, + {X: Field{[10]uint32{0x03b5f5df, 0x030fa959, 0x02cce11f, 0x02f6fca9, 0x00d7acef, 0x02912d55, 0x00a20e0f, 0x01708ca6, 0x01cfc07b, 0x00329254}}, Y: Field{[10]uint32{0x01f4afc2, 0x004b13c2, 0x02050b80, 0x0115e161, 0x0235aac5, 0x00a31e66, 0x01791a6b, 0x032beb1e, 0x03d76700, 0x00061aa2}}}, + {X: Field{[10]uint32{0x02b6787c, 0x0339c4a7, 0x011a9ae0, 0x0296e11e, 0x01d6760b, 0x02f090e3, 0x031f2a0d, 0x00407d79, 0x01e61bad, 0x0033e4b7}}, Y: Field{[10]uint32{0x003bcbd8, 0x014f88d7, 0x0159528f, 0x027444df, 0x026c9d8a, 0x00a51638, 0x00c1f053, 0x0079af2f, 0x01b7f3e3, 0x0029f4d4}}}, + {X: Field{[10]uint32{0x029c1179, 0x01466144, 0x0287d08f, 0x02a5b8a9, 0x03b06154, 0x020fa2cd, 0x039df9be, 0x00a0e8ed, 0x033ecfd8, 0x002c6ac2}}, Y: Field{[10]uint32{0x01506bbf, 0x017435ba, 0x0305812d, 0x0254e0df, 0x0099e973, 0x0204a403, 0x034cd97b, 0x014d2907, 0x02f34bab, 0x00336dfc}}}, + {X: Field{[10]uint32{0x021789ce, 0x02549283, 0x0035424e, 0x028a62cc, 0x01197296, 0x00ffaeb6, 0x0399295f, 0x0327a13e, 0x03299cd4, 0x00285d0c}}, Y: Field{[10]uint32{0x037e1afe, 0x00bd75fd, 0x03fc4428, 0x02913cbc, 0x035bee11, 0x0373e9b5, 0x0078088a, 0x00d5ddbc, 0x02f44cf5, 0x00102653}}}, + {X: Field{[10]uint32{0x01c0573b, 0x02868af6, 0x01e0b0d0, 0x011981fc, 0x0338b318, 0x006954c5, 0x03b946a6, 0x02b1f0f1, 0x00864efc, 0x0000906d}}, Y: Field{[10]uint32{0x03a0d574, 0x03d72607, 0x0197c832, 0x0166eb4e, 0x002f9801, 0x02f2900f, 0x01f3ba8f, 0x00734cc9, 0x0048eec6, 0x001733a2}}}, + {X: Field{[10]uint32{0x0291b387, 0x00f8f937, 0x0137ed75, 0x01534960, 0x03e3efd3, 0x01e66ac2, 0x01559adf, 0x01e611a6, 0x02096499, 0x00207e20}}, Y: Field{[10]uint32{0x0226d15c, 0x031c79aa, 0x01967a32, 0x0266be8a, 0x0243bda5, 0x03cf3236, 0x01e5caa5, 0x01c1846e, 0x01b85bfd, 0x0023e7fb}}}, + {X: Field{[10]uint32{0x024e5a5b, 0x03d75251, 0x006fe8fb, 0x01ad955c, 0x00c22da9, 0x028bb095, 0x00793d64, 0x00851480, 0x0231bd2c, 0x00127590}}, Y: Field{[10]uint32{0x0351e825, 0x0350ccf1, 0x0302b548, 0x0100fc69, 0x01bf9864, 0x01c71b76, 0x01f81216, 0x00b2b607, 0x02dab0d7, 0x003ebb23}}}, + {X: Field{[10]uint32{0x026e0ae4, 0x01f6db41, 0x029387e7, 0x013651db, 0x006daea2, 0x02dd0260, 0x03e1f159, 0x00e90471, 0x00324fad, 0x001d3053}}, Y: Field{[10]uint32{0x00641a41, 0x01ce2038, 0x009fd5aa, 0x0176af6e, 0x013ee016, 0x011b9ad9, 0x031a2cb9, 0x03972fc0, 0x02031fbe, 0x002bde54}}}, + {X: Field{[10]uint32{0x02a1e7c3, 0x012db5c4, 0x011b2a98, 0x00674276, 0x00930f9c, 0x004e0f1b, 0x03f42158, 0x036532f8, 0x009c7342, 0x00222f08}}, Y: Field{[10]uint32{0x005b3e08, 0x03265313, 0x02a2346a, 0x03985606, 0x01b817eb, 0x00a1d843, 0x0288866e, 0x021c8e26, 0x034576dd, 0x002b2df5}}}, + {X: Field{[10]uint32{0x026eb3f8, 0x0361738a, 0x02e77c1b, 0x01099daa, 0x0009bee2, 0x0285497d, 0x03b93c85, 0x02a2337d, 0x0068c81c, 0x00121b23}}, Y: Field{[10]uint32{0x03e52d54, 0x03749bd3, 0x0234ec1a, 0x0013eccf, 0x01d62490, 0x03d79a12, 0x02648706, 0x02a5f357, 0x014b035f, 0x00383fb2}}}, + {X: Field{[10]uint32{0x00a681a3, 0x033ae401, 0x02f14e28, 0x00f5b97e, 0x03ba3904, 0x034377cd, 0x01e30fb5, 0x02388ded, 0x02116c58, 0x001287be}}, Y: Field{[10]uint32{0x017b64f4, 0x03efc6a6, 0x00d538fc, 0x030506f6, 0x0365f2ac, 0x02f391db, 0x0137dd31, 0x01c596a2, 0x03373c90, 0x002ec659}}}, + {X: Field{[10]uint32{0x00eb28d2, 0x0110a51e, 0x0392f8da, 0x016dfdfd, 0x002632e8, 0x03bf9eed, 0x0317f308, 0x0027b436, 0x0006c696, 0x0035dd17}}, Y: Field{[10]uint32{0x01b96a73, 0x00fc208e, 0x0297cad1, 0x001fdc0a, 0x025371f0, 0x006b76c6, 0x0046e11b, 0x00af557f, 0x02754d1b, 0x0001d5d6}}}, + {X: Field{[10]uint32{0x03e68def, 0x01ebe90a, 0x015f49ca, 0x0143f666, 0x00dc333d, 0x03dd2a1f, 0x0208cedd, 0x009f1a9a, 0x032ea3db, 0x002f5d4b}}, Y: Field{[10]uint32{0x01e9491a, 0x03b0e2e9, 0x024d791d, 0x01b76a70, 0x02ef5c57, 0x01b54318, 0x00725ed2, 0x023482e9, 0x02af6747, 0x000de3e2}}}, + {X: Field{[10]uint32{0x03224d21, 0x0115ec07, 0x001f94be, 0x0131fccc, 0x0055eb30, 0x03380357, 0x0202bffa, 0x031faf19, 0x033315a3, 0x003bd620}}, Y: Field{[10]uint32{0x03517abd, 0x02830482, 0x0123ff46, 0x01532d69, 0x01eb52e0, 0x0210dd47, 0x01a95f7e, 0x037ef8f6, 0x02ab6253, 0x0015bace}}}, + {X: Field{[10]uint32{0x0253727a, 0x031810d4, 0x01f1fc1d, 0x0339fb7c, 0x0106b495, 0x010b7c90, 0x01beea4f, 0x02097682, 0x03747355, 0x000b0778}}, Y: Field{[10]uint32{0x03a150c2, 0x00ec74e1, 0x0058873a, 0x0340a34b, 0x005ff92c, 0x01dd9caa, 0x01986bdf, 0x03d7623e, 0x02609082, 0x0026164d}}}, + {X: Field{[10]uint32{0x000daf99, 0x03fd43ca, 0x02535324, 0x008aa23c, 0x00b78e2a, 0x03ce6cba, 0x00c90016, 0x000503d4, 0x031b23e6, 0x00127e35}}, Y: Field{[10]uint32{0x018b04ec, 0x024ea1ad, 0x0254622b, 0x03207f90, 0x00308111, 0x03dbf788, 0x00ec3393, 0x039f70cc, 0x02654807, 0x003d9aed}}}, + {X: Field{[10]uint32{0x009f37be, 0x0185eac6, 0x03ceb6df, 0x01e36d64, 0x02d18fdf, 0x0153ce94, 0x02a30f99, 0x018728ac, 0x0385754b, 0x000d9727}}, Y: Field{[10]uint32{0x0132825e, 0x00169054, 0x01a3af14, 0x000488da, 0x007681b6, 0x0028c9e5, 0x026aced6, 0x01af2ffe, 0x03e6aca5, 0x00310ffb}}}, + {X: Field{[10]uint32{0x01f1b5af, 0x013a2fc8, 0x023108e2, 0x00f86612, 0x027e2cb5, 0x028c473c, 0x02446c4d, 0x01a3b706, 0x03e9e896, 0x00073cb3}}, Y: Field{[10]uint32{0x00c966b7, 0x007bd688, 0x03803673, 0x004b8b2b, 0x03aebc7b, 0x029a17c8, 0x038f1041, 0x00c251ed, 0x01ac43c5, 0x001c795b}}}, + {X: Field{[10]uint32{0x008ca3ec, 0x03398dad, 0x03d5225d, 0x03e38072, 0x02219694, 0x01fa1de5, 0x011c26fa, 0x00089bce, 0x00796266, 0x003ccc0d}}, Y: Field{[10]uint32{0x02762827, 0x023e3e98, 0x030026f4, 0x03215aa4, 0x02afa585, 0x013e0e90, 0x0359ab87, 0x03a5176e, 0x03f4c110, 0x001f7a82}}}, + {X: Field{[10]uint32{0x00b27154, 0x030c94f9, 0x02df0587, 0x01a46b9e, 0x008756a9, 0x008a5fa8, 0x00664f90, 0x01b220e6, 0x004c4bc1, 0x002da249}}, Y: Field{[10]uint32{0x0050c856, 0x03466a39, 0x00364c27, 0x02b971c0, 0x00bd7483, 0x02d29d68, 0x03f89a90, 0x00da3325, 0x03481357, 0x0026d221}}}, + {X: Field{[10]uint32{0x038cbe41, 0x02c45018, 0x00517f3e, 0x00089035, 0x01a78b43, 0x0392f808, 0x032f8745, 0x00dc73fb, 0x00d2d6b4, 0x002fcd3f}}, Y: Field{[10]uint32{0x0397ac02, 0x01386557, 0x03546546, 0x00e09fd9, 0x001ef6a2, 0x006d0ef0, 0x0372914e, 0x01baba39, 0x00d27e32, 0x00339a22}}}, + {X: Field{[10]uint32{0x018d74fe, 0x03520844, 0x01cd110e, 0x018f116e, 0x00d51ffe, 0x01300094, 0x005a5944, 0x031e5b3a, 0x026d231b, 0x0030825e}}, Y: Field{[10]uint32{0x03e4ac87, 0x002da82f, 0x0372b135, 0x00f96e67, 0x01d1f92b, 0x0299d221, 0x023a85ac, 0x0305cf87, 0x0013fc4a, 0x00162c19}}}, + {X: Field{[10]uint32{0x017afa81, 0x01a8cc10, 0x026184d4, 0x0261036c, 0x02e3e817, 0x03191eba, 0x011b1de3, 0x0013cc28, 0x02223d88, 0x0021d298}}, Y: Field{[10]uint32{0x0380b429, 0x00e83b6b, 0x00f8f6b1, 0x03803bdc, 0x02b31668, 0x03263cd5, 0x02b181d5, 0x03988a5d, 0x01f67986, 0x00104ca9}}}, + {X: Field{[10]uint32{0x01bc605c, 0x021382bd, 0x03b85b97, 0x00f332a8, 0x021f2846, 0x0030fb51, 0x002227ab, 0x03564a05, 0x028a1a05, 0x002b1f1b}}, Y: Field{[10]uint32{0x018a2186, 0x02c52cc4, 0x00da4a08, 0x036da1e5, 0x01c107a9, 0x018fd71c, 0x0260a0a9, 0x00ce5fae, 0x0195581e, 0x00069668}}}, + {X: Field{[10]uint32{0x0333342c, 0x02c58e8c, 0x00a65575, 0x02e0bc95, 0x0344bc12, 0x005c5697, 0x0075c01a, 0x028fd822, 0x02d8d825, 0x000fc4f8}}, Y: Field{[10]uint32{0x0025e3b7, 0x00fe8716, 0x02724339, 0x033f5ee9, 0x036a2e6e, 0x02d788a4, 0x02f76a68, 0x009847ff, 0x0082fb2c, 0x002ebfda}}}, + {X: Field{[10]uint32{0x03a8fe2d, 0x03e57b2f, 0x03cec4d5, 0x003d327d, 0x01aa7e40, 0x007418c3, 0x03e26315, 0x01fce770, 0x0354515e, 0x0007afac}}, Y: Field{[10]uint32{0x025c85cf, 0x02847deb, 0x02daca6c, 0x02e6131c, 0x00c70724, 0x00617ce9, 0x00a2473c, 0x03373ce1, 0x00ef00c2, 0x0028b8d7}}}, + {X: Field{[10]uint32{0x0202b2ab, 0x00668777, 0x019a0d2d, 0x027388ae, 0x00b47d8f, 0x004ad176, 0x0059218d, 0x039d979b, 0x0365b211, 0x0030b736}}, Y: Field{[10]uint32{0x00f3be50, 0x01bd4389, 0x01237b14, 0x00cb25ad, 0x028722e0, 0x00967e21, 0x009326e9, 0x0045e9ca, 0x039ca960, 0x00382a96}}}, + {X: Field{[10]uint32{0x00bc0d45, 0x03a1e459, 0x01b85841, 0x02e09c32, 0x0207f360, 0x000e3db1, 0x02ed8a9c, 0x03451238, 0x01f7e2a9, 0x0012575a}}, Y: Field{[10]uint32{0x017088d2, 0x03d67825, 0x003e70bd, 0x02f84d0a, 0x03c48584, 0x013eb1bd, 0x034465d7, 0x0339ee0e, 0x022a1dab, 0x0017ecff}}}, + {X: Field{[10]uint32{0x0053bab2, 0x01eb21cd, 0x0169d203, 0x01deeb56, 0x01270a94, 0x0368fd45, 0x01be43d8, 0x0393e5c0, 0x01692139, 0x0033ab11}}, Y: Field{[10]uint32{0x00908070, 0x00b05811, 0x00b3bca3, 0x01035548, 0x02f385ea, 0x01812dac, 0x002f2bd9, 0x03a1cad8, 0x01d815f4, 0x002f47f6}}}, + {X: Field{[10]uint32{0x01407e0d, 0x015625c2, 0x0140682f, 0x006835b3, 0x034e6dba, 0x002881ab, 0x01284cbc, 0x02e30073, 0x00b93196, 0x001fb474}}, Y: Field{[10]uint32{0x012801c5, 0x03286287, 0x00e0af1b, 0x03036103, 0x0111018e, 0x035d6a71, 0x034ee732, 0x002f988b, 0x02c96ba6, 0x003a568e}}}, + {X: Field{[10]uint32{0x01040b04, 0x02dc5e28, 0x010fba24, 0x02c84c49, 0x03ac5fe4, 0x02e9f325, 0x00fd4365, 0x033b2250, 0x03664f42, 0x0001cbec}}, Y: Field{[10]uint32{0x007dce41, 0x028994f1, 0x029bcdbb, 0x0372887b, 0x0063d551, 0x02d4b3a4, 0x01e5c9b4, 0x0047d7d7, 0x031a93a2, 0x0003060a}}}, + {X: Field{[10]uint32{0x0008beea, 0x0183c118, 0x00309021, 0x00b56455, 0x03469019, 0x00f9b615, 0x0320043d, 0x00791759, 0x018c9ca9, 0x003741b3}}, Y: Field{[10]uint32{0x001e7ecd, 0x021771b1, 0x03ce272b, 0x016e402c, 0x01418970, 0x020faf60, 0x03a8a7ee, 0x03a8efe7, 0x03276eeb, 0x0033705c}}}, + {X: Field{[10]uint32{0x0178cd13, 0x02a6a64e, 0x00743da8, 0x010c0b8b, 0x003c708c, 0x02ffb6c4, 0x02504398, 0x01fc3c79, 0x0129e90a, 0x000203d8}}, Y: Field{[10]uint32{0x01deb82a, 0x009b53ce, 0x0000fe72, 0x0208e0a3, 0x02d95a30, 0x016d9129, 0x02f594f8, 0x03bfd28f, 0x0012145f, 0x001d365e}}}, + {X: Field{[10]uint32{0x005995b6, 0x0309f9c4, 0x01b24f5b, 0x00f13014, 0x020b48f8, 0x02bee774, 0x02970afb, 0x01422bbb, 0x00daf56b, 0x0015abcd}}, Y: Field{[10]uint32{0x01ae68bf, 0x02ac37b4, 0x0334d8a3, 0x016b7317, 0x03decca6, 0x00867734, 0x0105a4cc, 0x02386624, 0x02529e78, 0x0035077f}}}, + {X: Field{[10]uint32{0x023f91ee, 0x00f11393, 0x001f6ca3, 0x024e8687, 0x00148cf6, 0x01a27647, 0x005e29c4, 0x0196d031, 0x01ba7955, 0x00208089}}, Y: Field{[10]uint32{0x024b7db4, 0x000a2fae, 0x03334b24, 0x03c52ce1, 0x0011a0f4, 0x01e09a4a, 0x02bf5a31, 0x0270b819, 0x025bc89b, 0x000d88ab}}}, + {X: Field{[10]uint32{0x02ea57d2, 0x008cafa8, 0x037033bf, 0x02c5594a, 0x03ad388d, 0x0231fc27, 0x01a1b7ca, 0x0080aa25, 0x01bfcfcc, 0x001e497f}}, Y: Field{[10]uint32{0x0290525c, 0x00dcc253, 0x00d0a9dc, 0x0072a105, 0x021ebcc2, 0x01b4fd7c, 0x019cf5ec, 0x01f72455, 0x0301c9cb, 0x0011bdfb}}}, + {X: Field{[10]uint32{0x01d81808, 0x01fd8341, 0x039f6102, 0x012a6ffd, 0x02663879, 0x036f4ac7, 0x03316eb8, 0x039cc416, 0x036af38a, 0x0012c892}}, Y: Field{[10]uint32{0x015c3dac, 0x03e72c56, 0x029d423f, 0x02207f19, 0x00b6dc68, 0x007ff96d, 0x032ad2e1, 0x00c00aee, 0x0208b163, 0x000c50fa}}}, + {X: Field{[10]uint32{0x007380ee, 0x02bc831a, 0x013cd28d, 0x0192a904, 0x022c1bdd, 0x01b39223, 0x02a1a36e, 0x03d3ad80, 0x03fa4135, 0x000b01d9}}, Y: Field{[10]uint32{0x03bc16a7, 0x006f8ec3, 0x0389a5f7, 0x00ac4142, 0x0006a65d, 0x004dcf78, 0x002da710, 0x00c185f3, 0x03fce78d, 0x003770fb}}}, + {X: Field{[10]uint32{0x00a7ae7c, 0x0366ee94, 0x01ef1982, 0x03097544, 0x0137b5a2, 0x006a7e0d, 0x02ed2d94, 0x026a13bd, 0x013ee717, 0x0020e0df}}, Y: Field{[10]uint32{0x03b66dbe, 0x00092db8, 0x008d8556, 0x03c9e51b, 0x01fe2294, 0x029809ed, 0x02f1a495, 0x01ed32a1, 0x02166095, 0x00188807}}}, + {X: Field{[10]uint32{0x0095387a, 0x009c4256, 0x01d9bda4, 0x027875c3, 0x0225e50d, 0x00d6fc76, 0x028e0118, 0x03c15d4e, 0x0334e560, 0x0033c1d6}}, Y: Field{[10]uint32{0x02127018, 0x001c6128, 0x02a1404b, 0x03746035, 0x032b11d8, 0x00f7ce35, 0x0219f6f3, 0x03d348e3, 0x01d0330f, 0x0031cc82}}}, + {X: Field{[10]uint32{0x008931a4, 0x006e20df, 0x0329dcb0, 0x00b04020, 0x039d06ba, 0x0038faed, 0x00680300, 0x01d747bd, 0x00ff9b18, 0x003560fe}}, Y: Field{[10]uint32{0x03ae3292, 0x02f94f1b, 0x0258cd55, 0x0270ccee, 0x00aaac7c, 0x0165ad42, 0x03cfcc69, 0x024ae9af, 0x031c03f0, 0x003e33f3}}}, + {X: Field{[10]uint32{0x03eaefaa, 0x006de490, 0x02220343, 0x02cb687f, 0x0327568b, 0x010bb6c6, 0x01853723, 0x00e26ff0, 0x01b621d2, 0x001547fa}}, Y: Field{[10]uint32{0x023c24e0, 0x02b74095, 0x023d8c3b, 0x03fa5c48, 0x03ff48e5, 0x03cc4467, 0x02ff5057, 0x018f331a, 0x004ae485, 0x001b1da4}}}, + {X: Field{[10]uint32{0x016a80b2, 0x018fdbb4, 0x02da9a9d, 0x0252f239, 0x0051f063, 0x0339f264, 0x0162be7b, 0x00bc92c2, 0x00fc7406, 0x0006edde}}, Y: Field{[10]uint32{0x01d88318, 0x0385d018, 0x03bdb14b, 0x00bc775e, 0x0260e935, 0x03fc0dbe, 0x02700b68, 0x03459cf4, 0x013d2f4e, 0x0009d53d}}}, + {X: Field{[10]uint32{0x03e364aa, 0x00ff8439, 0x03be6e4a, 0x0313a5f3, 0x01aa0744, 0x03fe354e, 0x009f1a93, 0x0160be25, 0x02f71261, 0x00028542}}, Y: Field{[10]uint32{0x02ea4773, 0x037dc87a, 0x03ab99e0, 0x03b57e5b, 0x03100737, 0x01b86fd1, 0x02124715, 0x01c70be7, 0x02fea686, 0x00388a86}}}, + {X: Field{[10]uint32{0x032e2a9e, 0x00b856b9, 0x0380b724, 0x02f095e1, 0x00835ed2, 0x023a4f5a, 0x0163a030, 0x037e475e, 0x03df727f, 0x003253b0}}, Y: Field{[10]uint32{0x0152009c, 0x00d3485c, 0x030d50a9, 0x0042cfd5, 0x02011b28, 0x003eb427, 0x0312b35f, 0x014f1518, 0x00e97bda, 0x00291da8}}}, + {X: Field{[10]uint32{0x0146875a, 0x02d97dfc, 0x03f255f8, 0x0285e131, 0x02f186bd, 0x008d69ca, 0x01427394, 0x00c8c5f1, 0x01dbebe1, 0x000cd9ae}}, Y: Field{[10]uint32{0x0345d3cf, 0x00c9c984, 0x01862eea, 0x0064805c, 0x026b6206, 0x010e4657, 0x03213835, 0x00a22508, 0x007895f5, 0x00017a89}}}, + {X: Field{[10]uint32{0x00e8ba25, 0x030e3978, 0x02373974, 0x02f91130, 0x0358bec6, 0x0024acae, 0x005ef365, 0x0197b32e, 0x026ce522, 0x00185b23}}, Y: Field{[10]uint32{0x01aa0970, 0x0126fc73, 0x033caba0, 0x0240bc7b, 0x02724a98, 0x03d04926, 0x03286f45, 0x00963362, 0x01433d6e, 0x00134f55}}}, + {X: Field{[10]uint32{0x02651827, 0x008a47da, 0x00b1d043, 0x0298c825, 0x032617b3, 0x01177129, 0x001d86ef, 0x03a13a2e, 0x01772e38, 0x001d37c8}}, Y: Field{[10]uint32{0x02e01334, 0x011b6308, 0x0360c487, 0x0071a86c, 0x032a9ccf, 0x0326e695, 0x00abc6f9, 0x02549ff1, 0x03af30f0, 0x000130ca}}}, + {X: Field{[10]uint32{0x01accbd1, 0x03f14008, 0x00ce5d68, 0x0366fb83, 0x02532f8d, 0x03bd0bea, 0x01966d15, 0x0114ca5e, 0x01bf76b7, 0x00060528}}, Y: Field{[10]uint32{0x00d46bdc, 0x02feeb6b, 0x02ef3154, 0x01b826cb, 0x037af174, 0x03ea4ee6, 0x0205ad25, 0x0350e6c8, 0x01ff0da9, 0x0017d77d}}}, + {X: Field{[10]uint32{0x018625cc, 0x01db00ae, 0x02975c74, 0x019b108a, 0x035f444d, 0x03a17ef6, 0x01f22878, 0x01d49aeb, 0x029498ff, 0x000a2447}}, Y: Field{[10]uint32{0x02638537, 0x03240f07, 0x01ada5e4, 0x02ef8e02, 0x02eac150, 0x02c886e9, 0x0069542f, 0x01801a76, 0x00f35cf2, 0x00168d07}}}, + {X: Field{[10]uint32{0x01270865, 0x0343bf8a, 0x0279abd6, 0x006f9913, 0x02f441ce, 0x0227a1a1, 0x01ce2926, 0x011570e8, 0x0371e82a, 0x00356b3f}}, Y: Field{[10]uint32{0x0126d5e8, 0x031f6007, 0x0070e00d, 0x025a5636, 0x03ca8cde, 0x0344fc0c, 0x004971aa, 0x03a5c281, 0x008f1b46, 0x002ab1b5}}}, + {X: Field{[10]uint32{0x02711596, 0x002638b8, 0x00b6a91f, 0x015d4401, 0x008f03fc, 0x00842545, 0x0365e173, 0x00361675, 0x001b0221, 0x00173d47}}, Y: Field{[10]uint32{0x02d5c3b3, 0x016f73c9, 0x01838f39, 0x03ba8e65, 0x00017fe9, 0x028a8852, 0x031e58ea, 0x03d164b0, 0x01e0610d, 0x0007bac6}}}, +} + +var preG128 = []XY{ + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + {X: Field{[10]uint32{0x023809fa, 0x00ae3b74, 0x014be18e, 0x02cd4765, 0x00fd845c, 0x009147c2, 0x0293363f, 0x027c8a2e, 0x01be2e50, 0x000e0e07}}, Y: Field{[10]uint32{0x031fed52, 0x001d460c, 0x0324dbd7, 0x032ccb63, 0x003681fc, 0x0083ac73, 0x01405a55, 0x005f72c2, 0x010a0fb9, 0x003928cb}}}, + {X: Field{[10]uint32{0x03c2a310, 0x01099225, 0x026303ea, 0x02950048, 0x01f186ae, 0x0291a668, 0x0121b82a, 0x00ab9bda, 0x0324e437, 0x00124989}}, Y: Field{[10]uint32{0x0227ded0, 0x006da057, 0x038ce0c4, 0x004a9d7f, 0x036d1636, 0x01c50c0e, 0x02cfa569, 0x02afe568, 0x0373bca7, 0x0004cdf9}}}, + {X: Field{[10]uint32{0x02bd2d31, 0x012c1e73, 0x01b8d138, 0x015bfc1b, 0x004dcc1a, 0x011df8be, 0x02253b3e, 0x00324357, 0x028c1a24, 0x0038c195}}, Y: Field{[10]uint32{0x02546e44, 0x02d020e4, 0x03826692, 0x010af8dc, 0x02ffbc80, 0x03df436d, 0x00f2b107, 0x01098222, 0x03e37893, 0x0003ab1b}}}, + {X: Field{[10]uint32{0x023136b0, 0x0030e78d, 0x01dd9c53, 0x0366aad0, 0x0374ebf8, 0x00fef58c, 0x01b0e762, 0x033bf09c, 0x000e2428, 0x000ee784}}, Y: Field{[10]uint32{0x00dbbc8a, 0x03b05bdb, 0x01f81953, 0x028ceb4c, 0x02a2ae28, 0x03d1d6c9, 0x01533eb8, 0x02edc77c, 0x00152d16, 0x003ebee6}}}, + {X: Field{[10]uint32{0x03485d3f, 0x023c11cb, 0x03eee960, 0x01a2041e, 0x0317ca07, 0x0177b7bd, 0x036ca80f, 0x0326a4ad, 0x0149712a, 0x002ec2ab}}, Y: Field{[10]uint32{0x00a2f975, 0x00e4940f, 0x00bffe79, 0x03e8c59c, 0x00895a5a, 0x00a5f68d, 0x00d201f7, 0x0151e63b, 0x0053c583, 0x003a9a67}}}, + {X: Field{[10]uint32{0x02718dc9, 0x03b4ce8d, 0x023de4ae, 0x0136c044, 0x03e1e58b, 0x02bf8044, 0x028eb197, 0x03f30353, 0x02c8e4ee, 0x001e4242}}, Y: Field{[10]uint32{0x00fae7c5, 0x00c8ac47, 0x0008b963, 0x02dc2ea4, 0x02dd36af, 0x0366aa95, 0x01816cbc, 0x016e3c4f, 0x022b9190, 0x003aaadc}}}, + {X: Field{[10]uint32{0x0360c7d1, 0x025a531f, 0x01ad2a26, 0x039f35dd, 0x028dd71d, 0x01526e99, 0x003dbbce, 0x01ed5470, 0x01ade9f9, 0x0039df20}}, Y: Field{[10]uint32{0x02d72449, 0x01607ca0, 0x006d34ec, 0x03dc70a6, 0x03631470, 0x03aa0550, 0x03c3b323, 0x004c8717, 0x0078eef8, 0x000eb3c5}}}, + {X: Field{[10]uint32{0x01ccf6b0, 0x03ece915, 0x01341501, 0x02ba8b51, 0x003d633d, 0x037b61f3, 0x018878e3, 0x014473cb, 0x00e9dbce, 0x00378ad7}}, Y: Field{[10]uint32{0x01100666, 0x00a7adc4, 0x018bb348, 0x016b198c, 0x0065b8c4, 0x02c68dd1, 0x03717e98, 0x038386ef, 0x02f3d3c3, 0x003c415d}}}, + {X: Field{[10]uint32{0x03c03c56, 0x005182c4, 0x0258b26b, 0x02977919, 0x0329659c, 0x03048485, 0x0259fbd7, 0x028bf87a, 0x01ffd491, 0x00341ef7}}, Y: Field{[10]uint32{0x03405ce7, 0x00fd830a, 0x02ea76be, 0x03fe330b, 0x0161d963, 0x00778135, 0x01c40e2a, 0x025f743e, 0x0308cd3c, 0x002cab51}}}, + {X: Field{[10]uint32{0x036a4d51, 0x036ad06e, 0x0025710e, 0x01710d2e, 0x010f8da4, 0x025b3a38, 0x025ec4c3, 0x005abcdd, 0x027c5d30, 0x0020900f}}, Y: Field{[10]uint32{0x03463b19, 0x024bab5e, 0x03c1b11e, 0x03313b19, 0x0199ab6c, 0x00fa1014, 0x016baddb, 0x02dd9d11, 0x021be27c, 0x00034259}}}, + {X: Field{[10]uint32{0x010680cf, 0x032d219d, 0x0023f438, 0x00f65507, 0x01930f93, 0x0132bd36, 0x03faa58c, 0x009bd498, 0x0131fbd6, 0x003ab70c}}, Y: Field{[10]uint32{0x0087a914, 0x0253fc4b, 0x01a74360, 0x02770de4, 0x01a388fb, 0x01cb5740, 0x024b36c9, 0x02a25d71, 0x03b1c9b4, 0x0034f25d}}}, + {X: Field{[10]uint32{0x007987d9, 0x03ca427f, 0x038ac609, 0x0172ddf9, 0x0336bdd6, 0x019d23d3, 0x018a4b38, 0x03fc9314, 0x025f6758, 0x000e40fb}}, Y: Field{[10]uint32{0x002be83b, 0x03f8ab86, 0x028dab0c, 0x0061249e, 0x018d222a, 0x0348d1d2, 0x0115934b, 0x01075902, 0x014ea152, 0x0003a486}}}, + {X: Field{[10]uint32{0x03e6a5d9, 0x007e2096, 0x00e9323e, 0x010f6efe, 0x015759c3, 0x026a7c86, 0x035bdccf, 0x01228e11, 0x037839ab, 0x0034200e}}, Y: Field{[10]uint32{0x00582f0b, 0x012a4999, 0x01d24289, 0x01b39474, 0x0004ecf0, 0x00e2ebe9, 0x02ec15fb, 0x0325fa84, 0x0180ff29, 0x000b30ec}}}, + {X: Field{[10]uint32{0x00567ed0, 0x018a3ef0, 0x02c19215, 0x008f6a39, 0x018496dd, 0x033e2f81, 0x013a5aea, 0x01d26685, 0x0096b18a, 0x0007d5bc}}, Y: Field{[10]uint32{0x039dff58, 0x004f2d0d, 0x000d51fc, 0x03d06a4f, 0x01c94189, 0x02d9735a, 0x00044360, 0x03d2420c, 0x038a3b52, 0x003fbc8a}}}, + {X: Field{[10]uint32{0x038e213b, 0x03f016d8, 0x032974e0, 0x033f3c80, 0x0079e947, 0x008d2a8c, 0x006f5250, 0x01d0cb8e, 0x01b1a4a4, 0x000767da}}, Y: Field{[10]uint32{0x00d4ccbb, 0x00575bb9, 0x0372041f, 0x02cf4fdb, 0x005438d5, 0x00ac7689, 0x00500c3a, 0x001d86ce, 0x0017949c, 0x0036263b}}}, + {X: Field{[10]uint32{0x03629efd, 0x016a773e, 0x008b1aeb, 0x01537200, 0x00552133, 0x01719eb4, 0x03c43610, 0x032de04b, 0x01134d9d, 0x00004a32}}, Y: Field{[10]uint32{0x03e67c96, 0x01060602, 0x036e45ff, 0x0393b1bd, 0x02c160c8, 0x00267598, 0x03259360, 0x00984365, 0x014add15, 0x003fb8f9}}}, + {X: Field{[10]uint32{0x011a9685, 0x0038f643, 0x011fc49c, 0x015238b1, 0x00301f28, 0x01d581d7, 0x00b8d519, 0x02e53491, 0x012f5a95, 0x00087b00}}, Y: Field{[10]uint32{0x00de08ae, 0x0237864f, 0x00162d12, 0x029bf57f, 0x027418ed, 0x02527ca3, 0x03fef716, 0x0125fd31, 0x010577af, 0x000b7bc8}}}, + {X: Field{[10]uint32{0x02331cc5, 0x008a0d8f, 0x0311c584, 0x039df6be, 0x00761c3b, 0x031f3f1d, 0x0080e894, 0x022f0279, 0x0202fb9d, 0x001a23d4}}, Y: Field{[10]uint32{0x03302cd3, 0x02708631, 0x03d9462d, 0x02be27ba, 0x001a393e, 0x00900d0d, 0x007cabd9, 0x01069cbb, 0x015963b5, 0x0025ae9f}}}, + {X: Field{[10]uint32{0x03f02baf, 0x034ead3d, 0x03f682e4, 0x03bc3a2e, 0x010744d0, 0x0029434d, 0x0314c300, 0x02a3d6cc, 0x02ea1cb9, 0x003ed727}}, Y: Field{[10]uint32{0x03630418, 0x015fa77e, 0x02af0911, 0x0331f949, 0x006868e0, 0x01717a57, 0x028bd269, 0x031547ec, 0x0044e18f, 0x000a7ee2}}}, + {X: Field{[10]uint32{0x02c03421, 0x00d89732, 0x0380de0b, 0x03b1ed48, 0x01593168, 0x012a7787, 0x01f6a5d8, 0x02b8fcbd, 0x03e22eed, 0x003c51e7}}, Y: Field{[10]uint32{0x02764606, 0x015acb88, 0x02131cb8, 0x003120d4, 0x01c0b463, 0x03ef4d06, 0x0350d1a3, 0x022e084e, 0x015d2fd8, 0x0006990b}}}, + {X: Field{[10]uint32{0x031a7950, 0x0171ecaf, 0x0165a69f, 0x01eca261, 0x0200f60f, 0x03f83bfe, 0x005b0e09, 0x025dd24f, 0x01c5e819, 0x00089cfb}}, Y: Field{[10]uint32{0x027bda12, 0x02b8e7bf, 0x03530906, 0x03f13d42, 0x00b64691, 0x021254d6, 0x031a1df9, 0x01e364a7, 0x02388fd9, 0x002ceba8}}}, + {X: Field{[10]uint32{0x03ef5214, 0x0016b5e6, 0x0285656f, 0x03d2c518, 0x03496d59, 0x02ce768b, 0x03d10b32, 0x010de2d1, 0x000c3050, 0x00267e12}}, Y: Field{[10]uint32{0x0264b2cd, 0x029eb998, 0x0215171d, 0x00df9398, 0x02d930e4, 0x02d6aa67, 0x00bd397c, 0x010a1a36, 0x015d8e22, 0x00380075}}}, + {X: Field{[10]uint32{0x016a6f1f, 0x0195aea6, 0x03635bc9, 0x03561fd5, 0x0209c000, 0x024f2190, 0x00fdfc69, 0x004a035d, 0x017fe475, 0x0000e089}}, Y: Field{[10]uint32{0x0351d474, 0x01caab62, 0x019731c6, 0x00e78d96, 0x0130dbfa, 0x01ad7c7e, 0x01a4f1da, 0x032c1899, 0x033dfe52, 0x0030b71c}}}, + {X: Field{[10]uint32{0x00efb24b, 0x01179ffb, 0x034526e1, 0x03e7db57, 0x0262e5ea, 0x02b3211e, 0x01f4e1b2, 0x00e1af91, 0x02329125, 0x0008e84d}}, Y: Field{[10]uint32{0x016854c0, 0x0057d566, 0x03a6f49f, 0x01c0dcd2, 0x01413cc3, 0x03dc557c, 0x03817a1a, 0x02e888af, 0x037e0643, 0x00244a5d}}}, + {X: Field{[10]uint32{0x01149f0b, 0x002b0d5e, 0x039d48a3, 0x00f71102, 0x008cf559, 0x031737b5, 0x01791a18, 0x01937a8d, 0x026058a6, 0x0019967a}}, Y: Field{[10]uint32{0x02f2199d, 0x0031b5ac, 0x031ffc82, 0x036394d3, 0x035300d1, 0x010bf1b0, 0x007b69e7, 0x020dbecd, 0x0305a85d, 0x000ab731}}}, + {X: Field{[10]uint32{0x03a939fc, 0x0299f746, 0x01033037, 0x021d0508, 0x022899b4, 0x027f4a8f, 0x00e6f6c8, 0x034ed1fb, 0x03c6e1ac, 0x0014b70e}}, Y: Field{[10]uint32{0x03d05746, 0x03a270d0, 0x013e2709, 0x028fb946, 0x031e8f6b, 0x0168f13f, 0x003d9da1, 0x0041fef6, 0x034632ad, 0x00176bac}}}, + {X: Field{[10]uint32{0x01573551, 0x01dac435, 0x034f6173, 0x03add7c1, 0x01693fbc, 0x03251ef0, 0x01189ba9, 0x015d16f6, 0x029793cd, 0x001492ca}}, Y: Field{[10]uint32{0x00c80b71, 0x011b86ef, 0x02ca02d1, 0x0318f7b3, 0x01a6865a, 0x03a28bed, 0x02b92cc3, 0x03ec6a77, 0x01d6cb23, 0x0027a026}}}, + {X: Field{[10]uint32{0x0382756e, 0x01e45585, 0x029976fe, 0x02579641, 0x03525b7b, 0x02583a6d, 0x03e6c3dd, 0x01654e48, 0x01a8e2bc, 0x001cc860}}, Y: Field{[10]uint32{0x022e4823, 0x0318869c, 0x01d84eda, 0x0258523c, 0x03e3c42d, 0x02eba62a, 0x03a193c0, 0x03ac290a, 0x02b35592, 0x000945b1}}}, + {X: Field{[10]uint32{0x0102664b, 0x01c04479, 0x0315d8d5, 0x00f7ddba, 0x0249a7ae, 0x00bbdbf2, 0x038496ac, 0x00e3f7cc, 0x002d926e, 0x002e3a25}}, Y: Field{[10]uint32{0x02faf8eb, 0x00bd7b6f, 0x01d77f79, 0x0105a794, 0x03972486, 0x000c79b1, 0x0270ba22, 0x01623935, 0x016e7dea, 0x001e6435}}}, + {X: Field{[10]uint32{0x0098e4e5, 0x006de5f8, 0x001ae18d, 0x03989e25, 0x0119e744, 0x037733de, 0x00ac11e7, 0x02affdcb, 0x00f63e73, 0x000513a2}}, Y: Field{[10]uint32{0x0021837c, 0x027e0f0c, 0x02b3b4e0, 0x033df70b, 0x01158705, 0x029518cf, 0x018197fe, 0x03195431, 0x03f35df3, 0x00018f36}}}, + {X: Field{[10]uint32{0x003a9081, 0x023bef57, 0x0303975b, 0x024da055, 0x0160e5bc, 0x0271cf8f, 0x016a739c, 0x033638b4, 0x03dc489e, 0x00250db8}}, Y: Field{[10]uint32{0x01a7e59c, 0x002fd80e, 0x02d5e03a, 0x02cace99, 0x038e8d76, 0x02a139fd, 0x02a7806e, 0x01baff46, 0x031f50cb, 0x00051814}}}, + {X: Field{[10]uint32{0x00890db9, 0x01b09d48, 0x01e76193, 0x00177d9a, 0x03e840e0, 0x01c43464, 0x019b01a1, 0x03442d1b, 0x01617a56, 0x00274f09}}, Y: Field{[10]uint32{0x00521ea3, 0x019f38de, 0x02aca044, 0x0337a2bc, 0x001f89ff, 0x00b6a6e5, 0x01fee9b8, 0x03a6f30b, 0x00bc4c4a, 0x001aef70}}}, + {X: Field{[10]uint32{0x03db76c8, 0x02a1418f, 0x01d2d0dd, 0x02a2c398, 0x02d0aca5, 0x0114f13c, 0x00c6ae0b, 0x01fe2f86, 0x0250f51b, 0x000a7e63}}, Y: Field{[10]uint32{0x00e5d28f, 0x0038f1fc, 0x01186df8, 0x00c2b4de, 0x0358a6ec, 0x01016018, 0x02b8b211, 0x000c71cf, 0x00dcae8e, 0x0036bcef}}}, + {X: Field{[10]uint32{0x01c22c94, 0x02bc1d13, 0x02e1a538, 0x014a535d, 0x0217a897, 0x0375811b, 0x0005e311, 0x02a8d806, 0x00c2c71d, 0x00359f4c}}, Y: Field{[10]uint32{0x014f670c, 0x00452ee9, 0x03d969c1, 0x02faabd2, 0x00e87ebb, 0x00b81a33, 0x02e690aa, 0x001ec2e4, 0x00e712c8, 0x00122e6c}}}, + {X: Field{[10]uint32{0x03c81649, 0x019809cb, 0x00334835, 0x02e65e9e, 0x03059aa7, 0x0340e805, 0x032c9b76, 0x030b92dd, 0x03a88ce9, 0x003c8b0a}}, Y: Field{[10]uint32{0x01b7028f, 0x001bf77e, 0x019a3cbc, 0x02a4233e, 0x022d92dc, 0x015c09c2, 0x03a4e0f1, 0x02f85890, 0x0310f190, 0x001aaa79}}}, + {X: Field{[10]uint32{0x02c5f894, 0x00c25a66, 0x034a5eff, 0x03b73f01, 0x0336b722, 0x03bcc8d3, 0x02533c90, 0x01320f94, 0x018d06b9, 0x0003179c}}, Y: Field{[10]uint32{0x02eef436, 0x02cc5983, 0x01d7e642, 0x027b3111, 0x03f7f8ce, 0x02a71412, 0x024e810f, 0x01986775, 0x0051ccfc, 0x00092584}}}, + {X: Field{[10]uint32{0x0144d611, 0x019bdcde, 0x014a2c1f, 0x022cccd5, 0x02c291dc, 0x03e1fb93, 0x0218999e, 0x03adf55d, 0x00aac836, 0x0009aa2f}}, Y: Field{[10]uint32{0x03bcecc9, 0x0331976e, 0x027a6c69, 0x03438667, 0x00e57192, 0x00781d8f, 0x022da29c, 0x01998eb3, 0x01ba0723, 0x00308014}}}, + {X: Field{[10]uint32{0x01fa098c, 0x020cd18b, 0x027aa2c0, 0x03841d93, 0x016bcf65, 0x029925b5, 0x0301ba17, 0x0055166f, 0x0170fb7b, 0x000e238d}}, Y: Field{[10]uint32{0x007be798, 0x0003d7e8, 0x02bdea95, 0x0049176d, 0x0299120d, 0x038d12f9, 0x01561e5a, 0x003fc151, 0x0122a2eb, 0x000b5383}}}, + {X: Field{[10]uint32{0x01250709, 0x03e3dc85, 0x03fca7a7, 0x0070ba95, 0x0200da2d, 0x03aacb1b, 0x0227efa4, 0x01e0f88c, 0x03abb5a0, 0x001a0626}}, Y: Field{[10]uint32{0x007ae856, 0x02e0d34f, 0x00855a0e, 0x005cc34c, 0x003e42d5, 0x0145117e, 0x00954f62, 0x034fea85, 0x01833694, 0x002f4c2f}}}, + {X: Field{[10]uint32{0x012190ab, 0x0364344a, 0x03d42b88, 0x020ff5ec, 0x01ea6ff6, 0x00106289, 0x03b7aa90, 0x01de5659, 0x0023bb34, 0x00190b82}}, Y: Field{[10]uint32{0x03b4000f, 0x018e71fc, 0x00903210, 0x02418eda, 0x01286b46, 0x00e76bce, 0x02748926, 0x0014bf8d, 0x02a786ec, 0x0036dcf7}}}, + {X: Field{[10]uint32{0x00924afa, 0x01a0d719, 0x02027f91, 0x00bf4e61, 0x037f4eff, 0x0225abea, 0x01addea5, 0x015415d4, 0x0281e5bf, 0x0026adba}}, Y: Field{[10]uint32{0x0229bb6c, 0x0001eb1d, 0x02f2b47d, 0x026ca659, 0x03dd951c, 0x03392cf9, 0x0329efcb, 0x02979cbf, 0x02a74870, 0x000e301a}}}, + {X: Field{[10]uint32{0x014a8ee7, 0x020563ba, 0x01a62dd1, 0x0056f780, 0x01e059e0, 0x0227993e, 0x0298248e, 0x03da71c6, 0x01aee567, 0x002c2601}}, Y: Field{[10]uint32{0x0183d221, 0x01eca386, 0x0212c814, 0x02a038f6, 0x03dea885, 0x034882b0, 0x01382eb6, 0x004bbf31, 0x016a7ec9, 0x0018aba8}}}, + {X: Field{[10]uint32{0x0107e6e5, 0x01306f00, 0x03b5a82b, 0x03c25d6f, 0x0291d6b5, 0x020c5a46, 0x018bfbc9, 0x03568d29, 0x025b636e, 0x000f58ca}}, Y: Field{[10]uint32{0x03395a1c, 0x033e8c73, 0x01aef682, 0x0273c581, 0x027a7ee0, 0x032d3525, 0x036ba0f9, 0x005b64ba, 0x009e75bf, 0x0015de91}}}, + {X: Field{[10]uint32{0x00cef707, 0x0069a5d0, 0x0150ab1c, 0x00d4e8db, 0x03b51e36, 0x025ab22e, 0x02db69dd, 0x017fcb3b, 0x03f0f70d, 0x001ae086}}, Y: Field{[10]uint32{0x02d12e5d, 0x00ede271, 0x0347a6d8, 0x02d37e8b, 0x00006371, 0x03377aa5, 0x00286745, 0x03048220, 0x0211993f, 0x001484b3}}}, + {X: Field{[10]uint32{0x01728b23, 0x036e1511, 0x0196c789, 0x00c32476, 0x02dc33b3, 0x03364e53, 0x027740b5, 0x03f82e14, 0x01514496, 0x002fca52}}, Y: Field{[10]uint32{0x0112782c, 0x009cac7a, 0x03baec13, 0x00aaed06, 0x034c53bc, 0x004378e3, 0x03f745c4, 0x0339e8d0, 0x01e5da35, 0x001e42bb}}}, + {X: Field{[10]uint32{0x0175ec80, 0x02d80d47, 0x02f06742, 0x026c453d, 0x024906f6, 0x01126251, 0x0268267c, 0x025a2859, 0x00c382bf, 0x002954d5}}, Y: Field{[10]uint32{0x025962e8, 0x0298c332, 0x00c88179, 0x025b460a, 0x019dd6d2, 0x0337ed6c, 0x03319676, 0x00697ca2, 0x01dc4566, 0x000a026f}}}, + {X: Field{[10]uint32{0x0249a693, 0x03e8d109, 0x019f45a6, 0x02be13d4, 0x03b893f8, 0x03ed2603, 0x03a1574f, 0x020c46ef, 0x0036abcd, 0x003f0054}}, Y: Field{[10]uint32{0x019db819, 0x03d9dafc, 0x00789657, 0x03280f9f, 0x02f5542a, 0x026b34fd, 0x01cd0042, 0x03812ce1, 0x02781946, 0x00343da8}}}, + {X: Field{[10]uint32{0x019a7aae, 0x01e26003, 0x024eab75, 0x01b1447e, 0x0059caea, 0x012bef89, 0x02a799fb, 0x03cd489c, 0x010d9f81, 0x00185910}}, Y: Field{[10]uint32{0x025a7966, 0x031c54fb, 0x01ac0abe, 0x03d7539f, 0x034982ff, 0x016e4e5b, 0x03ee69c9, 0x027f34f2, 0x00800ba1, 0x0024af05}}}, + {X: Field{[10]uint32{0x030b5f2d, 0x003f2145, 0x01fc6faa, 0x01f47b01, 0x016e2591, 0x0060ad3d, 0x00f9a9b3, 0x035cddca, 0x01358de9, 0x003be059}}, Y: Field{[10]uint32{0x007ec595, 0x0320fa9d, 0x03d7e155, 0x03732c71, 0x010f1721, 0x02dbf4cb, 0x0249df88, 0x02a71141, 0x0026403c, 0x00370dc9}}}, + {X: Field{[10]uint32{0x0187a8ed, 0x03029222, 0x032e2642, 0x011a107a, 0x00178c56, 0x01c34b10, 0x0304e681, 0x00db7771, 0x00b989a4, 0x0010a30d}}, Y: Field{[10]uint32{0x02eebe06, 0x00deaf4e, 0x01f4f512, 0x01f9c651, 0x003836f9, 0x010da58d, 0x004dc3e6, 0x01191b28, 0x0158251c, 0x002c7c90}}}, + {X: Field{[10]uint32{0x01417a9e, 0x03f88199, 0x024a55ac, 0x01cdfb69, 0x025f19da, 0x02faef5a, 0x01e62437, 0x0055ed05, 0x0382f909, 0x001bad85}}, Y: Field{[10]uint32{0x00577b72, 0x013bfffa, 0x00c3904c, 0x03b8a43b, 0x02af03ed, 0x026710bd, 0x012f168f, 0x03cac5b2, 0x0146baed, 0x0013f9f1}}}, + {X: Field{[10]uint32{0x0376fa4b, 0x01c718a8, 0x01646e43, 0x01cf4530, 0x03cb6f95, 0x02338c77, 0x03830099, 0x013fb17b, 0x02f1466d, 0x00264b82}}, Y: Field{[10]uint32{0x01f9e825, 0x01a4354a, 0x01ae3871, 0x0398c75e, 0x0150d000, 0x002590d9, 0x001e3a90, 0x025acbac, 0x02691e43, 0x003438f6}}}, + {X: Field{[10]uint32{0x01721d11, 0x0210e0c1, 0x039c3010, 0x000e33d6, 0x00513e99, 0x00925a4d, 0x00f31d11, 0x0001e3c8, 0x024badc7, 0x003fb6d5}}, Y: Field{[10]uint32{0x00157a39, 0x01237bce, 0x00b2fa94, 0x021f5502, 0x02ba26ae, 0x015fc580, 0x015d97d6, 0x010833cb, 0x024957e8, 0x0006a38a}}}, + {X: Field{[10]uint32{0x033b24bd, 0x010c3401, 0x03575e54, 0x009989d2, 0x023e6832, 0x03109245, 0x007088d3, 0x02746049, 0x028a4dd8, 0x003cfc81}}, Y: Field{[10]uint32{0x03a2bfa8, 0x0069fdde, 0x00f0e75c, 0x017f87c7, 0x0312381c, 0x002a9f8c, 0x026ab1ee, 0x03d18850, 0x011900a7, 0x003caaaf}}}, + {X: Field{[10]uint32{0x00a13680, 0x00c1dc8f, 0x02e02b3d, 0x016364f6, 0x015b6aa4, 0x01daa160, 0x024e7c14, 0x028d6637, 0x025e4217, 0x000cae48}}, Y: Field{[10]uint32{0x02133802, 0x00d74396, 0x008a396f, 0x0051cce0, 0x03532462, 0x0341c7a5, 0x0185683d, 0x018d004a, 0x00042685, 0x001d19ba}}}, + {X: Field{[10]uint32{0x02e64a8a, 0x0266e7f6, 0x01c7fc62, 0x024fe893, 0x01ee6c6b, 0x03ad64be, 0x03899792, 0x035ac13f, 0x0287385e, 0x00214022}}, Y: Field{[10]uint32{0x0104a2df, 0x01b8a129, 0x023622ae, 0x023e8943, 0x0284b5b3, 0x0020961d, 0x01569f6c, 0x0015dbee, 0x022b8a5b, 0x0007c9e7}}}, + {X: Field{[10]uint32{0x002effd4, 0x0114bdaa, 0x030e9e44, 0x01883c04, 0x010b8353, 0x03f126ff, 0x00edac7c, 0x02ac2fb2, 0x0033ebbe, 0x00136b1e}}, Y: Field{[10]uint32{0x023c740a, 0x03426a80, 0x001f00cc, 0x02d76e3b, 0x01133dc3, 0x02d08df7, 0x014ada57, 0x02a9a184, 0x0170f230, 0x003f2746}}}, + {X: Field{[10]uint32{0x016dbeeb, 0x03cc40b5, 0x03d71031, 0x010406e4, 0x034b44de, 0x014d77d6, 0x0340226e, 0x01755066, 0x008145a6, 0x0026dd56}}, Y: Field{[10]uint32{0x0089a02d, 0x03674478, 0x00e1fa1e, 0x0185679f, 0x01c15160, 0x036ee8ed, 0x03382907, 0x00dedf26, 0x01710d69, 0x00340c90}}}, + {X: Field{[10]uint32{0x03bc8bdd, 0x00fb66b2, 0x004bdb58, 0x03291877, 0x0198b525, 0x02d9176d, 0x02e6e8b1, 0x029f5e99, 0x02b92592, 0x0006f5b3}}, Y: Field{[10]uint32{0x0229944c, 0x0242b126, 0x01e4e7b7, 0x03955473, 0x015a1c4c, 0x0296dc15, 0x037abb10, 0x022fa922, 0x028784a9, 0x00269677}}}, + {X: Field{[10]uint32{0x015b56ee, 0x03d4d56f, 0x00637268, 0x01f62d11, 0x016b3a3c, 0x03f9e1ba, 0x025b08a7, 0x00250594, 0x02b93b36, 0x00096a2c}}, Y: Field{[10]uint32{0x025f22ec, 0x0393a2e5, 0x0240ac45, 0x02bb7dc6, 0x0045f131, 0x03b1b154, 0x01027e63, 0x01a1ff6f, 0x00f75734, 0x000f1633}}}, + {X: Field{[10]uint32{0x03ed9f5f, 0x02c87945, 0x003c0d88, 0x02aa3695, 0x02bf5a1c, 0x0148975a, 0x01a57671, 0x00fbec88, 0x003327c3, 0x000912ca}}, Y: Field{[10]uint32{0x01f53d7d, 0x027c2ff0, 0x000dbc22, 0x0398110e, 0x0237f83c, 0x00a7d404, 0x02cec92a, 0x02254d6b, 0x02ace48d, 0x0008800d}}}, + {X: Field{[10]uint32{0x025dd1b7, 0x01928d4c, 0x01e64e97, 0x00775ab0, 0x0291f0cc, 0x0159a5e3, 0x0042d13e, 0x01e415ad, 0x000f27b8, 0x001be5eb}}, Y: Field{[10]uint32{0x03433d32, 0x0034ffe7, 0x01c814dd, 0x01697cb6, 0x007e937f, 0x0246ce28, 0x02ce1cc6, 0x031c1c89, 0x030cfac6, 0x0020f1b9}}}, + {X: Field{[10]uint32{0x021dce1f, 0x03120055, 0x02badc94, 0x0352c88d, 0x012d6abc, 0x01153c98, 0x00265cad, 0x0138b6ea, 0x020feb01, 0x001cb175}}, Y: Field{[10]uint32{0x03978fe2, 0x02d03698, 0x00bf0690, 0x02db491b, 0x0397b281, 0x03174eb2, 0x03282163, 0x00658ece, 0x02197ef9, 0x0038c466}}}, + {X: Field{[10]uint32{0x01f33825, 0x0367b435, 0x006ea707, 0x0252aba3, 0x002af32b, 0x0110686c, 0x018659df, 0x000619a6, 0x01a001b1, 0x002a5b4b}}, Y: Field{[10]uint32{0x02513f9f, 0x03a04202, 0x016906c0, 0x01c45aa4, 0x025659ea, 0x0230dc2a, 0x03cfd412, 0x0148d67d, 0x018305da, 0x0019835f}}}, + {X: Field{[10]uint32{0x03e3c4fa, 0x00537156, 0x00875173, 0x009e6431, 0x03d906aa, 0x01d8599d, 0x001d2008, 0x017b3066, 0x03634d81, 0x000b339b}}, Y: Field{[10]uint32{0x02ba4b50, 0x008cc8ef, 0x036e5d3c, 0x01d327b2, 0x01b33cb2, 0x03f4151d, 0x02f997a0, 0x027a446d, 0x00ddbd59, 0x00185484}}}, + {X: Field{[10]uint32{0x0245f0c4, 0x0226f5a9, 0x02f4660e, 0x03f1d628, 0x024558fa, 0x02e354ec, 0x00602d98, 0x034e6766, 0x0084525d, 0x00264ac0}}, Y: Field{[10]uint32{0x00e2f98d, 0x01935869, 0x02a572da, 0x0039657b, 0x02f5a5c7, 0x00508180, 0x005f40b1, 0x0168a631, 0x00d22654, 0x0020f2a6}}}, + {X: Field{[10]uint32{0x03eb7357, 0x03dd9ba6, 0x0388e44e, 0x027ad17a, 0x01c6b0c6, 0x03f52ddf, 0x0361ee43, 0x01867f31, 0x03453089, 0x0010d3be}}, Y: Field{[10]uint32{0x029291ea, 0x027bf08a, 0x01bd001e, 0x03220c2e, 0x0126967a, 0x00db02fa, 0x025586d2, 0x02e4b965, 0x016d01c0, 0x000f6ec3}}}, + {X: Field{[10]uint32{0x03fbc156, 0x037171f8, 0x02b884bd, 0x02271370, 0x00f0dbf5, 0x00fbf8c1, 0x02e47359, 0x00cc1828, 0x01ad2c68, 0x0002885e}}, Y: Field{[10]uint32{0x02033c1f, 0x001ebebd, 0x00b20192, 0x008c21b7, 0x0288a2d2, 0x036d8274, 0x00e6dfab, 0x0005da86, 0x01f8ab98, 0x003b914e}}}, + {X: Field{[10]uint32{0x0305a2e1, 0x00e41ebb, 0x00f146d6, 0x00a999c6, 0x02a445f2, 0x024887bd, 0x012bb400, 0x03851ea9, 0x001ed3e1, 0x000e4d02}}, Y: Field{[10]uint32{0x03b5b3c7, 0x02aca429, 0x0206214f, 0x03f9d4b1, 0x03d3a9fe, 0x03c7a566, 0x01e79d49, 0x006de882, 0x02563139, 0x002f0dc1}}}, + {X: Field{[10]uint32{0x0395d8ef, 0x022381f7, 0x013db396, 0x0388414a, 0x03f1f3f7, 0x03310957, 0x00383546, 0x02e4e401, 0x00e159a2, 0x000d6f09}}, Y: Field{[10]uint32{0x0223ae15, 0x03b42a24, 0x02dfa246, 0x034e2127, 0x00e87e0c, 0x0159c93e, 0x02beb5c0, 0x02636bde, 0x00700a96, 0x0037b87f}}}, + {X: Field{[10]uint32{0x0148127d, 0x0394962e, 0x01b48bc7, 0x0386f2b9, 0x0163aa14, 0x00176399, 0x012a0eef, 0x02d1ce15, 0x035c251f, 0x003d7479}}, Y: Field{[10]uint32{0x037170fe, 0x0084aa1b, 0x036fe92d, 0x03d02fde, 0x03e7d586, 0x00a614a2, 0x0009134d, 0x03c1623d, 0x01bc7044, 0x00389830}}}, + {X: Field{[10]uint32{0x03eb121c, 0x03687301, 0x00f54d12, 0x02cd80d4, 0x03f9617b, 0x02b2ddd0, 0x01170dd6, 0x00a0bc28, 0x02d36fed, 0x003b829d}}, Y: Field{[10]uint32{0x020ba5b1, 0x03debc50, 0x035166db, 0x01612d0a, 0x024e56c4, 0x03e78432, 0x02135eff, 0x02583c39, 0x02dbeba6, 0x003e33f0}}}, + {X: Field{[10]uint32{0x00a689d8, 0x01e43467, 0x01676f94, 0x03d85b69, 0x004d1879, 0x005dd345, 0x00ab377f, 0x01d99057, 0x03cf7892, 0x00278ee1}}, Y: Field{[10]uint32{0x02b3b577, 0x02a39b6e, 0x03482266, 0x025ad151, 0x027a9c2d, 0x006c7c9a, 0x033b0c2b, 0x028ab2c9, 0x0122da3c, 0x003e3cd1}}}, + {X: Field{[10]uint32{0x034868f0, 0x016cc43a, 0x0115286e, 0x031d3d89, 0x0012f409, 0x019ae2d4, 0x005b89ee, 0x010b00f2, 0x016fd089, 0x00389bc9}}, Y: Field{[10]uint32{0x02f210f9, 0x03a2fed5, 0x012f21bb, 0x00fcf13c, 0x033552c2, 0x00f26c49, 0x008c6562, 0x0127e9b4, 0x00d96fea, 0x002eacf1}}}, + {X: Field{[10]uint32{0x011da6c2, 0x01626000, 0x0021cf08, 0x014baa31, 0x01a3f5c8, 0x03c1eaf1, 0x00b67634, 0x020e6345, 0x0046a5d3, 0x0022b1d0}}, Y: Field{[10]uint32{0x0229b3dc, 0x0174c91c, 0x0288e149, 0x02543210, 0x024a71af, 0x00d500b0, 0x00f59160, 0x00c66215, 0x0393f56e, 0x00348329}}}, + {X: Field{[10]uint32{0x01932bd0, 0x01dea495, 0x03a83ac6, 0x02fecb20, 0x02753928, 0x03a074a7, 0x01531a86, 0x0253324f, 0x00956346, 0x0016c038}}, Y: Field{[10]uint32{0x00a99656, 0x00fbf598, 0x032d64bc, 0x00cdd200, 0x0242882b, 0x0003561f, 0x02daf180, 0x03123185, 0x027a8071, 0x00234bc9}}}, + {X: Field{[10]uint32{0x0211f0b1, 0x00d5fe27, 0x02a872c0, 0x026ad3a7, 0x01546ffb, 0x02ca9984, 0x01ae4ba7, 0x0175eeac, 0x00c4080c, 0x00058864}}, Y: Field{[10]uint32{0x02423525, 0x024c0c24, 0x019d8796, 0x00ba6317, 0x01bb8419, 0x00ef731b, 0x006d7a31, 0x022a7396, 0x01041244, 0x0036d788}}}, + {X: Field{[10]uint32{0x01b145b1, 0x0299db21, 0x0236cf26, 0x03726bfd, 0x03476774, 0x001805f6, 0x03f8520e, 0x020fa021, 0x0021b4b3, 0x003daa11}}, Y: Field{[10]uint32{0x0037a3b3, 0x01d2a010, 0x020a80ed, 0x0056fe23, 0x02937172, 0x03a3f87b, 0x03a2da82, 0x01c3b401, 0x01a95967, 0x0014131c}}}, + {X: Field{[10]uint32{0x032dd6e5, 0x01d66a64, 0x0013455a, 0x02795727, 0x0183e591, 0x0127e423, 0x038937da, 0x034f62cf, 0x0142f0b5, 0x0007c0b4}}, Y: Field{[10]uint32{0x01863e65, 0x0220b68e, 0x00348fb3, 0x017d22b8, 0x03fbc903, 0x036df27f, 0x02c2eae5, 0x01b7dd43, 0x03338ed3, 0x0039a972}}}, + {X: Field{[10]uint32{0x0178899f, 0x01889e07, 0x03a0434a, 0x03d44b5d, 0x0268e29b, 0x00d21295, 0x02e38c37, 0x0287fa8a, 0x016bc326, 0x00187d36}}, Y: Field{[10]uint32{0x03b4aab8, 0x00deb4b5, 0x02b38b3a, 0x012cdd79, 0x02217272, 0x00603097, 0x03970216, 0x016b1d93, 0x03386200, 0x001947bd}}}, + {X: Field{[10]uint32{0x01c11616, 0x005f2b8c, 0x019c19c9, 0x00ac6be8, 0x007c7ebe, 0x034a45b8, 0x008a71f8, 0x0179e602, 0x000d623c, 0x002e9f57}}, Y: Field{[10]uint32{0x015f5a51, 0x016c1f6f, 0x00958ce4, 0x039f99b2, 0x01a1ec37, 0x03ecd565, 0x02551530, 0x00fdb1e1, 0x03400d7e, 0x00369027}}}, + {X: Field{[10]uint32{0x025bdb09, 0x01be7464, 0x003c3bb1, 0x029a6af1, 0x01fe5a92, 0x036f0f86, 0x02a68ee6, 0x025df1b9, 0x0190eacb, 0x0022e429}}, Y: Field{[10]uint32{0x035df718, 0x00d4603e, 0x039a92a0, 0x01d760a6, 0x024d01ef, 0x01d1a9d4, 0x02734e1f, 0x0175642b, 0x0342ef65, 0x002973d7}}}, + {X: Field{[10]uint32{0x03f4fe4c, 0x03a6ab37, 0x025b71c9, 0x03ffd56c, 0x01f0d994, 0x02d6b85c, 0x00294a3c, 0x0133f73a, 0x02272191, 0x0021fcd4}}, Y: Field{[10]uint32{0x00babb2f, 0x00930a19, 0x03552dda, 0x00fc88a8, 0x01f26b28, 0x026a44cd, 0x027c1efb, 0x031787ab, 0x01af530b, 0x00331c74}}}, + {X: Field{[10]uint32{0x0377a15d, 0x03bb92b2, 0x0358b6c1, 0x027c61fb, 0x0383d550, 0x014c3c7c, 0x00ffe8a5, 0x014566fc, 0x0136ba40, 0x002bba93}}, Y: Field{[10]uint32{0x00d3ac1a, 0x01581e98, 0x033f78d5, 0x01f738da, 0x0196958f, 0x022aa8a3, 0x03031c24, 0x00f7e1f4, 0x01eae740, 0x0036d58f}}}, + {X: Field{[10]uint32{0x03cc7111, 0x00e2966b, 0x02db62a3, 0x00d95dd3, 0x00d8dda4, 0x02016353, 0x006f1ef0, 0x03ae755f, 0x018d3996, 0x000c03fa}}, Y: Field{[10]uint32{0x00c40e77, 0x01962c8e, 0x025e3a49, 0x009b49c8, 0x01d2e6e2, 0x010eddbf, 0x037913c1, 0x029033e4, 0x00178fdd, 0x00345228}}}, + {X: Field{[10]uint32{0x01c19fdb, 0x0017d0a6, 0x0073aa50, 0x006ddb53, 0x03d01e9c, 0x019d0f93, 0x01095a1f, 0x0051ba0e, 0x035e22cd, 0x0031c02b}}, Y: Field{[10]uint32{0x014b32c0, 0x0151aa86, 0x011d28b5, 0x024b0b54, 0x010d4a30, 0x02dba95a, 0x02b1fc6b, 0x00709c9e, 0x0181b1f0, 0x000ff800}}}, + {X: Field{[10]uint32{0x0350bc60, 0x030dd233, 0x034a5941, 0x01d7e5ae, 0x0194228f, 0x0211214e, 0x02147af3, 0x0104e06a, 0x00e117b9, 0x00340f42}}, Y: Field{[10]uint32{0x0096e31d, 0x001c6cea, 0x000fa10e, 0x01dba451, 0x01f47dd0, 0x015076a3, 0x00bfbfdc, 0x02f314b8, 0x03fd2785, 0x0016c467}}}, + {X: Field{[10]uint32{0x022bd361, 0x017697f0, 0x03832b39, 0x00fb2533, 0x03ea9c98, 0x02be0697, 0x017fadb6, 0x0082e15b, 0x00fa17a5, 0x001b19c4}}, Y: Field{[10]uint32{0x02804941, 0x028e4f3c, 0x00ad64fb, 0x002097b5, 0x01b036a4, 0x00225ec1, 0x01964f3c, 0x0207a906, 0x012636e2, 0x0036d3bf}}}, + {X: Field{[10]uint32{0x03d91bbb, 0x03cfef68, 0x021d9b46, 0x03a653e1, 0x025ea3bf, 0x00229766, 0x02cb900d, 0x01e859ad, 0x02399df4, 0x0035ed70}}, Y: Field{[10]uint32{0x00efe8ba, 0x03565f59, 0x03710cff, 0x0194a702, 0x03a3c8a0, 0x0253ff87, 0x003494d7, 0x03097a72, 0x034e4ab1, 0x003b5e47}}}, + {X: Field{[10]uint32{0x00f66c06, 0x02a7a394, 0x029524ab, 0x008c8d06, 0x0253ff2f, 0x03aaa8fb, 0x01eb8dcc, 0x02054b8b, 0x01ab8f72, 0x00243da6}}, Y: Field{[10]uint32{0x02fce91d, 0x0320b27f, 0x0008e641, 0x0339b98f, 0x00561558, 0x00da487e, 0x006d80ec, 0x004aee75, 0x03a77f53, 0x0022f430}}}, + {X: Field{[10]uint32{0x01fb65cc, 0x02b9c6a3, 0x0344abb9, 0x0338ada1, 0x0137557d, 0x0285bd5a, 0x01eaead6, 0x0370d324, 0x023e3d7a, 0x001343ab}}, Y: Field{[10]uint32{0x03a3de5a, 0x01b8bc87, 0x02a5352c, 0x02641425, 0x026e874c, 0x010aa94b, 0x019a6851, 0x021cc6ea, 0x0006a950, 0x00205ac2}}}, + {X: Field{[10]uint32{0x02f7de62, 0x023df26c, 0x031d0243, 0x0266381a, 0x01689a23, 0x00c54617, 0x034f8153, 0x0212637e, 0x02ddec31, 0x0011b367}}, Y: Field{[10]uint32{0x021f29bc, 0x0211be95, 0x0100810a, 0x01a0491f, 0x03e0d5d1, 0x0204ce22, 0x0164a8bb, 0x01e1d232, 0x01a3d5fd, 0x000ed6f0}}}, + {X: Field{[10]uint32{0x02ff730b, 0x013ae0c0, 0x000aebce, 0x03f88696, 0x00653748, 0x01154b90, 0x0176297b, 0x02aadc71, 0x000e3f6e, 0x00012ab2}}, Y: Field{[10]uint32{0x008c7954, 0x00d4e61b, 0x020509e4, 0x02a53c77, 0x0240d331, 0x02b1a811, 0x03e2dd5b, 0x03d1aa03, 0x000d8014, 0x000f50a8}}}, + {X: Field{[10]uint32{0x002a4114, 0x01a06956, 0x006374bb, 0x03d8bb2f, 0x02e03e96, 0x006664de, 0x01e45730, 0x0270244c, 0x0261b73d, 0x00166fa9}}, Y: Field{[10]uint32{0x01afa47d, 0x038f4b2c, 0x035c130b, 0x026af576, 0x00d9f263, 0x03a24541, 0x01062e78, 0x00b0ba07, 0x03e8ee8a, 0x000c6882}}}, + {X: Field{[10]uint32{0x00ca6037, 0x024d59e4, 0x003385e2, 0x02929387, 0x029ee089, 0x03b1e937, 0x019acd3f, 0x03ba48ac, 0x006588b2, 0x0001ffa4}}, Y: Field{[10]uint32{0x01e5c128, 0x03a4da4d, 0x032a7c69, 0x018f9fb1, 0x002659b7, 0x001d8ffd, 0x01eb3262, 0x00fbac7d, 0x0190c5f4, 0x0037ed17}}}, + {X: Field{[10]uint32{0x01322157, 0x03254625, 0x0262f19d, 0x011fcb20, 0x01f3a5fc, 0x03e3cbf4, 0x00b5e4ac, 0x01e225e1, 0x03913227, 0x0036ce43}}, Y: Field{[10]uint32{0x0290bbad, 0x01872b35, 0x02dc8d5d, 0x0302b7a0, 0x012aaeb5, 0x0298f6c6, 0x00fd7d4d, 0x020c7c25, 0x015b241c, 0x0010d925}}}, + {X: Field{[10]uint32{0x0391ebc8, 0x017501dc, 0x03c29e6e, 0x02980714, 0x00985732, 0x02ba3de3, 0x02a9e615, 0x0066b1f6, 0x0266e5fc, 0x000d3740}}, Y: Field{[10]uint32{0x01dd797b, 0x007a87f1, 0x02ddb661, 0x01ad148c, 0x0077a5db, 0x030ad22f, 0x0013b1d2, 0x03f80398, 0x02d80e73, 0x0030b5ad}}}, + {X: Field{[10]uint32{0x011772ab, 0x038f7c67, 0x004db336, 0x0314ca3e, 0x015e6c7e, 0x01b8bbe5, 0x01fcfbe1, 0x0182374f, 0x032b7e31, 0x003ba9fd}}, Y: Field{[10]uint32{0x014004bb, 0x0034c354, 0x029b88af, 0x015831af, 0x03172195, 0x00e6a9d1, 0x02a6d947, 0x02930d23, 0x00f1ccde, 0x002598b2}}}, + {X: Field{[10]uint32{0x00c391f2, 0x00f9e8e2, 0x007fc10d, 0x0190db64, 0x019376d2, 0x03a1584a, 0x01e412dd, 0x003ace4f, 0x007af1b1, 0x0031abc2}}, Y: Field{[10]uint32{0x00825144, 0x02d2b9d4, 0x00959eee, 0x0090b185, 0x01e5ff98, 0x033faae9, 0x018847a9, 0x01915e2b, 0x022e3185, 0x002ea675}}}, + {X: Field{[10]uint32{0x02ccefc7, 0x0132667f, 0x01518136, 0x02fd434d, 0x02aff37f, 0x032d0fd6, 0x033d034b, 0x015d02ad, 0x03356c71, 0x003ab8d1}}, Y: Field{[10]uint32{0x02fe4703, 0x03998e64, 0x01a9879f, 0x01b6d87f, 0x03968525, 0x02513dd2, 0x02f15d84, 0x03d91735, 0x0075da8b, 0x002e4e1b}}}, + {X: Field{[10]uint32{0x0340438f, 0x0093fdfe, 0x0046165c, 0x038c0764, 0x0241b68a, 0x01392589, 0x039a27e6, 0x023d5013, 0x00250f4d, 0x00129523}}, Y: Field{[10]uint32{0x016f6d10, 0x014bca06, 0x01578382, 0x00570a83, 0x014c2742, 0x038a698f, 0x01e40c67, 0x0233dbbd, 0x0085bd60, 0x002ba7cb}}}, + {X: Field{[10]uint32{0x00f744af, 0x02bcac3b, 0x01a53f43, 0x03678603, 0x03453318, 0x032cf02f, 0x019743d7, 0x0116a3a8, 0x0279dd65, 0x00186495}}, Y: Field{[10]uint32{0x03cb184d, 0x002913ca, 0x011a1726, 0x0075138f, 0x0347fc55, 0x00f92a87, 0x02c062ca, 0x014dcba7, 0x0184d721, 0x00281a0b}}}, + {X: Field{[10]uint32{0x0137ea2a, 0x03c05424, 0x004fe025, 0x02e14bfc, 0x0250267a, 0x01097bd8, 0x03a260d2, 0x02addb53, 0x02869574, 0x003876d7}}, Y: Field{[10]uint32{0x011905a8, 0x010f2054, 0x0277483f, 0x012fed25, 0x00836e20, 0x00318494, 0x01a99a1d, 0x03de8db0, 0x00219fd5, 0x00323abd}}}, + {X: Field{[10]uint32{0x0248c7f1, 0x027498f4, 0x004a7d2f, 0x02473f08, 0x0038e636, 0x007f613c, 0x00ab862a, 0x00e108a8, 0x03ca7392, 0x000c18b2}}, Y: Field{[10]uint32{0x019670cb, 0x03011ff7, 0x02b2cf55, 0x03c7327f, 0x00721a85, 0x038610c4, 0x0289eee1, 0x00a5c373, 0x02570e3f, 0x0023c44b}}}, + {X: Field{[10]uint32{0x01a4f739, 0x00500113, 0x00f4e4e8, 0x03ca5dd9, 0x039da74f, 0x02d4fe54, 0x007a861e, 0x00dbf3bb, 0x03ccaa97, 0x0019f0e4}}, Y: Field{[10]uint32{0x01853203, 0x011f1352, 0x013942d1, 0x03551b1f, 0x0033ac24, 0x03566d49, 0x00009d5a, 0x017f88be, 0x01d09a16, 0x0024f4ca}}}, + {X: Field{[10]uint32{0x0099bf5e, 0x00c213fa, 0x03728f94, 0x02c43a2e, 0x01ac5bc5, 0x0160731f, 0x01a5619d, 0x00861fb9, 0x01f236cf, 0x00319d1c}}, Y: Field{[10]uint32{0x01e2c513, 0x039a1223, 0x00aea62f, 0x00dfeda1, 0x003a533f, 0x0132ef32, 0x03c32477, 0x00c63650, 0x009c787b, 0x001d7243}}}, + {X: Field{[10]uint32{0x00ed1b52, 0x01fa62b9, 0x03070182, 0x03301951, 0x0112143a, 0x0096aab1, 0x033d7a40, 0x02376484, 0x03efd593, 0x00354057}}, Y: Field{[10]uint32{0x00f03d6b, 0x01b0975f, 0x0379f400, 0x0182de63, 0x00e99668, 0x00761177, 0x037c0d65, 0x00dbc570, 0x0216a022, 0x00110c15}}}, + {X: Field{[10]uint32{0x0164f2d2, 0x024a73a0, 0x003b73c1, 0x002473d4, 0x02243ca3, 0x0000bb66, 0x008ed564, 0x0258572d, 0x0365aaa8, 0x002baf2f}}, Y: Field{[10]uint32{0x00b3f019, 0x01f4dff9, 0x01ee535e, 0x015554e6, 0x02a6ee7f, 0x027223a1, 0x020305ba, 0x03b8ad08, 0x025d1a30, 0x0013f07c}}}, + {X: Field{[10]uint32{0x03b30e43, 0x03c03ffa, 0x00d8105e, 0x002ed4dc, 0x01bb8f98, 0x00ca8e74, 0x02d68219, 0x037bbd26, 0x02171727, 0x000572c5}}, Y: Field{[10]uint32{0x000ebd7a, 0x039f4afe, 0x02d93b1f, 0x01ad243a, 0x012dfff8, 0x01cd2cd3, 0x035c1b99, 0x0014ffb8, 0x008287fc, 0x00192b63}}}, + {X: Field{[10]uint32{0x0049c123, 0x000c2013, 0x026986bd, 0x008c18f8, 0x0119fb25, 0x00948468, 0x03b88a55, 0x0359d026, 0x009e8530, 0x00350108}}, Y: Field{[10]uint32{0x00a7a128, 0x03318890, 0x032c562b, 0x02fa28d0, 0x0046ef87, 0x02d68c9f, 0x01062753, 0x017467a1, 0x0168fdb8, 0x000dd8ff}}}, + {X: Field{[10]uint32{0x03ffdd96, 0x03a4e066, 0x02a4ed42, 0x025fd08a, 0x00d40b44, 0x030c9eb1, 0x02330c2f, 0x00a12563, 0x00cf0c23, 0x003ceafe}}, Y: Field{[10]uint32{0x015b0d5d, 0x0083a69f, 0x02061cc7, 0x03b1f33c, 0x01d1dfe9, 0x035e9d88, 0x01076432, 0x00c9f0fa, 0x0305d831, 0x00142187}}}, + {X: Field{[10]uint32{0x00874dea, 0x01ffdbdf, 0x03b4e57b, 0x011b0f92, 0x035cf92b, 0x0146e748, 0x004755a6, 0x036fecfe, 0x00932ee9, 0x001e28ca}}, Y: Field{[10]uint32{0x02c85895, 0x005fdae6, 0x02473b46, 0x02ca4b06, 0x01b3c36e, 0x0257aadf, 0x02ccd874, 0x0087d1ba, 0x003a9667, 0x002496de}}}, + {X: Field{[10]uint32{0x0350cd4a, 0x000c8269, 0x01e8df65, 0x0390fb55, 0x011b7d15, 0x01eed9e3, 0x001ed91a, 0x01be286b, 0x010f5d14, 0x00205948}}, Y: Field{[10]uint32{0x015d260d, 0x02e161e4, 0x0363a384, 0x019a87b6, 0x03859541, 0x00e5b1c4, 0x0145875e, 0x00af732f, 0x013a19e2, 0x003f8e43}}}, + {X: Field{[10]uint32{0x01fe3f09, 0x03295fdf, 0x032f3633, 0x007f3c01, 0x00ba7343, 0x00fbe866, 0x0317dd6f, 0x00f4d337, 0x01e86c2f, 0x001d49a7}}, Y: Field{[10]uint32{0x004805bd, 0x03454f9c, 0x020b1f5e, 0x027c77c6, 0x00f463f3, 0x017ba214, 0x006e3dbd, 0x009fb111, 0x025fd199, 0x002c58a9}}}, + {X: Field{[10]uint32{0x027145b0, 0x01394490, 0x02b38954, 0x02dea405, 0x03c520a7, 0x013ecbfd, 0x01c4e104, 0x0252796e, 0x028fb393, 0x00178db3}}, Y: Field{[10]uint32{0x0011614c, 0x0269381e, 0x03a4e7d3, 0x0170320a, 0x0022074c, 0x0152baa4, 0x01822ced, 0x025a9076, 0x0318292f, 0x001f1039}}}, + {X: Field{[10]uint32{0x02632746, 0x0302dac5, 0x03d25b05, 0x0181db69, 0x01c249d3, 0x02b260f9, 0x0176edc6, 0x02ff1b01, 0x0129fdeb, 0x0032331c}}, Y: Field{[10]uint32{0x00716fb1, 0x01d35e13, 0x01e68e46, 0x02bf53dd, 0x022653fb, 0x014e7fae, 0x011a332c, 0x011261db, 0x00e3a77e, 0x00122a33}}}, + {X: Field{[10]uint32{0x0246973f, 0x0303053a, 0x021dd2d6, 0x022dce0e, 0x03fa8579, 0x038f772b, 0x024d2a9a, 0x00f9b4e4, 0x0336f1ee, 0x0027f876}}, Y: Field{[10]uint32{0x0074f6d2, 0x039db38b, 0x0223e7c2, 0x03b2facc, 0x0343dc55, 0x00084ad8, 0x02d96588, 0x01170257, 0x02a86070, 0x00074d6d}}}, + {X: Field{[10]uint32{0x008ecda2, 0x01c4fd6f, 0x024657c9, 0x036f49b4, 0x01e23648, 0x030d449e, 0x019e02dd, 0x01d239b8, 0x038a3d45, 0x00132a2a}}, Y: Field{[10]uint32{0x023e73da, 0x02a68e53, 0x005cf164, 0x0236ec83, 0x0113b8a6, 0x0021db25, 0x03c9f23c, 0x036e489c, 0x02ad9bb7, 0x00229619}}}, + {X: Field{[10]uint32{0x032060c0, 0x01dbd62d, 0x017b13d3, 0x00607604, 0x03f1f308, 0x006c78a7, 0x01bc7242, 0x0227b173, 0x0150e4a9, 0x00032340}}, Y: Field{[10]uint32{0x0082ebd1, 0x018cd954, 0x0271749e, 0x00cb2c9b, 0x027ac4a7, 0x002c800c, 0x0242a9df, 0x00e9286b, 0x00a4c5a7, 0x00171620}}}, + {X: Field{[10]uint32{0x02f2aa31, 0x03868304, 0x03feafc1, 0x0113c4c2, 0x039e3684, 0x02072620, 0x03e1b7c9, 0x03f79927, 0x017bb4b9, 0x000f5855}}, Y: Field{[10]uint32{0x025b56f9, 0x021e64b7, 0x0228671c, 0x0254c63a, 0x021e2336, 0x01ac70df, 0x0160c90e, 0x02102cea, 0x03ff62cd, 0x0024cc59}}}, + {X: Field{[10]uint32{0x00e69e2a, 0x02bc5a49, 0x00552ccf, 0x03b72d89, 0x03feaada, 0x0170fb47, 0x0078dbb8, 0x0328256d, 0x039ffd44, 0x0019d5a7}}, Y: Field{[10]uint32{0x03eb7fcc, 0x006c9b59, 0x00102feb, 0x037abc3f, 0x03d16619, 0x02b7ec92, 0x01412887, 0x02f4b2aa, 0x0148230f, 0x0018aeca}}}, + {X: Field{[10]uint32{0x0372fbc2, 0x02dd4f9c, 0x01af70f3, 0x0340f3c3, 0x006e3075, 0x0319b6aa, 0x037d2792, 0x0050043a, 0x013edebf, 0x0018c4f4}}, Y: Field{[10]uint32{0x03573ef3, 0x0389ab74, 0x039c2f65, 0x01d2fabf, 0x032839f8, 0x00f81b8b, 0x01754556, 0x0049161a, 0x023050eb, 0x00111884}}}, + {X: Field{[10]uint32{0x01d23968, 0x03f78913, 0x031955e2, 0x03c857c4, 0x03088529, 0x01f1b2ca, 0x023085b4, 0x01ba3343, 0x01e7fbbe, 0x001be3b2}}, Y: Field{[10]uint32{0x0136cd79, 0x0031dbfb, 0x0078dc51, 0x002a0c07, 0x0323e195, 0x0311bbba, 0x003b215d, 0x00febad5, 0x0214523b, 0x0007ed87}}}, + {X: Field{[10]uint32{0x010b7f6c, 0x0301519c, 0x022447be, 0x01638380, 0x0336f0ae, 0x020e6d30, 0x01a0ec2f, 0x0286b2f6, 0x01ac3c5a, 0x0015984f}}, Y: Field{[10]uint32{0x02ca79e8, 0x01ceaa63, 0x0316cf7b, 0x02f775fd, 0x03530908, 0x010d2be2, 0x03233194, 0x0263e40e, 0x03ab86c3, 0x00091c98}}}, + {X: Field{[10]uint32{0x03aee08c, 0x02cf0861, 0x01da041e, 0x02c1a167, 0x0217e91a, 0x0169f775, 0x03e6e57c, 0x01c8644d, 0x01e7b414, 0x00327785}}, Y: Field{[10]uint32{0x038b0009, 0x03eff10f, 0x0370fd8f, 0x02c7d792, 0x0040cc5d, 0x00556473, 0x0111c877, 0x015b437f, 0x02a5cfa0, 0x0031c5e3}}}, + {X: Field{[10]uint32{0x016c0504, 0x01aeff7d, 0x01c48a8b, 0x00b74b77, 0x02f90618, 0x02f9925e, 0x02a4b0f6, 0x017a4390, 0x024a627d, 0x0001d642}}, Y: Field{[10]uint32{0x02c38587, 0x00f38aa9, 0x029f81f9, 0x01d4d4ed, 0x00cc5bd8, 0x02a9192f, 0x017e878b, 0x021d8172, 0x021ab549, 0x00358478}}}, + {X: Field{[10]uint32{0x03e19d6a, 0x025e421f, 0x0173b760, 0x0176fcf2, 0x021fcc55, 0x0076ccd8, 0x00dff728, 0x03815b6c, 0x020fb310, 0x00252c76}}, Y: Field{[10]uint32{0x014fc217, 0x021b78ff, 0x01159852, 0x02723cbf, 0x0045c42e, 0x0392e54f, 0x03a2ab4a, 0x0069580c, 0x013dd5b4, 0x0020c622}}}, + {X: Field{[10]uint32{0x00c9a6cb, 0x039b54a1, 0x011a5f20, 0x0084e385, 0x02d6f8f8, 0x02bb0b3e, 0x007d081d, 0x033bc438, 0x0299bcda, 0x002d6bd0}}, Y: Field{[10]uint32{0x0395448d, 0x0091e6ea, 0x00b2043b, 0x03f42bb7, 0x01c8cf65, 0x004df702, 0x032987eb, 0x02e0b7d5, 0x00078a7d, 0x00302611}}}, + {X: Field{[10]uint32{0x0139c3e3, 0x01da11da, 0x03b0c3c4, 0x01066226, 0x03f8ef61, 0x021460a6, 0x000a153c, 0x01161ce6, 0x01437074, 0x0017d26b}}, Y: Field{[10]uint32{0x007e04eb, 0x0346001d, 0x020f7d01, 0x0251172b, 0x022ae25c, 0x0103f092, 0x0208ae1b, 0x01b0f42e, 0x038520f5, 0x00171034}}}, + {X: Field{[10]uint32{0x007da385, 0x0386e792, 0x01c645cd, 0x02fc9bb2, 0x0216bea3, 0x01a24e50, 0x0230d1ae, 0x03047193, 0x027f88cc, 0x003daec1}}, Y: Field{[10]uint32{0x00288f55, 0x03b5c85e, 0x004fead4, 0x0367cafd, 0x0328dbfd, 0x037792a0, 0x01d4ec8a, 0x025e3362, 0x036d7268, 0x000c5691}}}, + {X: Field{[10]uint32{0x01df6950, 0x03b4affe, 0x03f10bee, 0x0124112c, 0x0152690b, 0x03000115, 0x01aea0ee, 0x00678253, 0x02dec02b, 0x001ed1f3}}, Y: Field{[10]uint32{0x00efe9a6, 0x03b64ef8, 0x01330280, 0x03603084, 0x0353b7cc, 0x015e462b, 0x03ac5a79, 0x037b25ba, 0x01f49bee, 0x0006f369}}}, + {X: Field{[10]uint32{0x0140876d, 0x03f59826, 0x01035a78, 0x0087000a, 0x01182236, 0x035c3d4b, 0x025e1ab2, 0x015b67ad, 0x03f3082d, 0x002e9a75}}, Y: Field{[10]uint32{0x035d393d, 0x01b447e5, 0x02c7684b, 0x00d6b86b, 0x001d1cf9, 0x003b894e, 0x036bdb95, 0x00a2703c, 0x02fd56d5, 0x0017d128}}}, + {X: Field{[10]uint32{0x03d929ff, 0x037f6e5e, 0x0347d1d3, 0x017e5d0c, 0x01fe7ec3, 0x00cc2e8e, 0x03713bf0, 0x03065488, 0x0094d226, 0x0028edc2}}, Y: Field{[10]uint32{0x02ae6135, 0x03013355, 0x00aa593c, 0x00b082ec, 0x01495edf, 0x02ace51e, 0x01ad2e10, 0x016a80d5, 0x03df4275, 0x00017432}}}, + {X: Field{[10]uint32{0x01c804e5, 0x0368df74, 0x0384f0e8, 0x02cd1233, 0x025ae602, 0x003aceff, 0x03e73b52, 0x0207f647, 0x023ebb2d, 0x0031d5b8}}, Y: Field{[10]uint32{0x00df49ff, 0x0044840d, 0x035f8985, 0x02a753ec, 0x025a4fab, 0x02192a60, 0x01f52b29, 0x01ae6f2a, 0x02faedf8, 0x00227d2d}}}, + {X: Field{[10]uint32{0x0271822c, 0x00bba10d, 0x02a00d17, 0x0271b37e, 0x0065410e, 0x030e4127, 0x011c2341, 0x0252afde, 0x00356fab, 0x000d8c9f}}, Y: Field{[10]uint32{0x03ed4c6d, 0x034187f4, 0x0127abe7, 0x00c63096, 0x01eb7456, 0x0253dc0e, 0x0201f04e, 0x0234d7c3, 0x00a4698c, 0x003f8d62}}}, + {X: Field{[10]uint32{0x03dd21bb, 0x0278418d, 0x00c32118, 0x02c61d2c, 0x00b66051, 0x017acabd, 0x02ecf6fc, 0x008c47d1, 0x03be8e37, 0x000edd6f}}, Y: Field{[10]uint32{0x02879908, 0x002a8a56, 0x03c2aea5, 0x02575f46, 0x022e42a0, 0x01e502d3, 0x015e2488, 0x00ce6916, 0x0233e3c3, 0x002e4512}}}, + {X: Field{[10]uint32{0x00d3c5e2, 0x029fdd7c, 0x017b4d92, 0x02f4de6a, 0x035f0272, 0x03e3d11d, 0x015ed721, 0x03a22831, 0x031057b4, 0x00112987}}, Y: Field{[10]uint32{0x02d80141, 0x03785120, 0x00086111, 0x0019b705, 0x02181623, 0x016de4e4, 0x016ec1f0, 0x0011925c, 0x02658034, 0x003a1c3a}}}, + {X: Field{[10]uint32{0x0097fefd, 0x026889c0, 0x00acb74c, 0x039b28a5, 0x011ebed2, 0x03a481bb, 0x00c6fe5c, 0x00f02809, 0x02f70066, 0x00046b80}}, Y: Field{[10]uint32{0x03d6a36f, 0x01f4a337, 0x0024bd69, 0x019a5039, 0x01a4e357, 0x01c108b3, 0x008737ae, 0x03ecc140, 0x0387a262, 0x0018d686}}}, + {X: Field{[10]uint32{0x02142f5c, 0x0021728f, 0x01981069, 0x03c84175, 0x008e987a, 0x02cc6cdf, 0x02ab1b0a, 0x017450b9, 0x010adfb2, 0x0031d44c}}, Y: Field{[10]uint32{0x02821014, 0x0250eebb, 0x018864df, 0x00752f30, 0x02ccca85, 0x039a1716, 0x00485a4b, 0x005ea7c4, 0x01d8ed27, 0x002918c3}}}, + {X: Field{[10]uint32{0x03efe46a, 0x02f76dfb, 0x02f7f790, 0x00ac3856, 0x00a639b7, 0x03ac94db, 0x0357b173, 0x03ce7105, 0x03c64009, 0x003ffd35}}, Y: Field{[10]uint32{0x025080e5, 0x01d91433, 0x02dc6e89, 0x01af6b5f, 0x014c110d, 0x024a92ec, 0x030697a2, 0x008b4440, 0x018e0ffe, 0x001a529e}}}, + {X: Field{[10]uint32{0x03f90534, 0x03233a70, 0x00d18c06, 0x0068c495, 0x0300932b, 0x03350dc1, 0x031e8bc1, 0x027d1ba4, 0x0239c13c, 0x001f5dba}}, Y: Field{[10]uint32{0x03e415bb, 0x00727fa2, 0x026d4d2a, 0x022ce696, 0x024cee43, 0x01163245, 0x007cf7c3, 0x00f63cd3, 0x02ba8f0a, 0x002f052c}}}, + {X: Field{[10]uint32{0x0207ad39, 0x00c3a557, 0x037e8a67, 0x017a097d, 0x01625fda, 0x00c2aaab, 0x00807075, 0x0393cdbc, 0x02d2ca6a, 0x002dbbf2}}, Y: Field{[10]uint32{0x01b1c765, 0x00864e6f, 0x005f00a4, 0x00687d90, 0x02469430, 0x00fa9ab5, 0x036f4a32, 0x034c9c0f, 0x00ef8a56, 0x00121a36}}}, + {X: Field{[10]uint32{0x0233a32e, 0x032a9b8d, 0x02b4ae30, 0x02ab034a, 0x0348e38f, 0x01d501b4, 0x03f9050e, 0x03129b4d, 0x012aa889, 0x0006812c}}, Y: Field{[10]uint32{0x0075911d, 0x01baf237, 0x02966c24, 0x0005ebe1, 0x0221e1c8, 0x039fa827, 0x0017dca3, 0x023641b2, 0x008ffad3, 0x003d0e83}}}, + {X: Field{[10]uint32{0x03209b7e, 0x02ab5460, 0x02a6c531, 0x00016935, 0x03b70e25, 0x0323b777, 0x0078b126, 0x0146413a, 0x00fe9b34, 0x002b6bac}}, Y: Field{[10]uint32{0x037522ad, 0x032c0e74, 0x03173f33, 0x03bf19e4, 0x02b1c59d, 0x02639bb7, 0x00c6b4e1, 0x00a69c23, 0x016ddd4d, 0x000ac9ac}}}, + {X: Field{[10]uint32{0x006e0679, 0x013ae20b, 0x010d19a9, 0x00961183, 0x00d97fa1, 0x0358c9d9, 0x012121d2, 0x03cff2d4, 0x02023931, 0x00013932}}, Y: Field{[10]uint32{0x00537467, 0x0208b461, 0x00348515, 0x005fc965, 0x02cc917b, 0x00a3accc, 0x00c68609, 0x029b2515, 0x02cd3704, 0x003be43b}}}, + {X: Field{[10]uint32{0x011e2971, 0x030821f0, 0x02a220a7, 0x02b2b700, 0x035654ec, 0x00e7d80e, 0x01b5ee41, 0x0304e9c4, 0x0279df69, 0x00287cf0}}, Y: Field{[10]uint32{0x02a16b2d, 0x0148eb6d, 0x023b2252, 0x035ea2a4, 0x02e8aafa, 0x03bf88c9, 0x03699165, 0x01e375fb, 0x039454cb, 0x0015c925}}}, + {X: Field{[10]uint32{0x0398c7a5, 0x004f8339, 0x003c4f4b, 0x0321a9a4, 0x03c19424, 0x03259d7f, 0x030c911b, 0x01a39bd2, 0x03814886, 0x002ab1db}}, Y: Field{[10]uint32{0x00dd2978, 0x029cb461, 0x03189588, 0x00dbac9d, 0x02c37595, 0x00d826f0, 0x011df3f7, 0x01f5b04e, 0x02dfdd6c, 0x00092b85}}}, + {X: Field{[10]uint32{0x00034769, 0x036dc074, 0x030a2a5b, 0x025a8578, 0x010ddce4, 0x012639b2, 0x03601666, 0x008bc378, 0x0171e596, 0x001c3a50}}, Y: Field{[10]uint32{0x0103b757, 0x0113c684, 0x0257d5e2, 0x02ef3d1a, 0x02446111, 0x00803e4a, 0x004d4e80, 0x032fbcae, 0x00a775a9, 0x0035b5f0}}}, + {X: Field{[10]uint32{0x02c78890, 0x023825a3, 0x002b6f28, 0x01ad6e0a, 0x03342670, 0x01aac711, 0x02fa849c, 0x01124925, 0x01e711d4, 0x003285f9}}, Y: Field{[10]uint32{0x03ce2c2e, 0x00bcfa22, 0x034105e3, 0x03b938a0, 0x00e6c58f, 0x005f4cb3, 0x039f501e, 0x01dee376, 0x02322ce5, 0x002cf775}}}, + {X: Field{[10]uint32{0x03aa62e8, 0x018c928b, 0x025717ec, 0x0006357f, 0x00255ec0, 0x0290eae7, 0x000700f3, 0x03f7a1ab, 0x018d8d70, 0x000685a9}}, Y: Field{[10]uint32{0x02710c27, 0x003ac746, 0x017e116c, 0x03cde8e2, 0x00dc2eb6, 0x015f074c, 0x03bc1372, 0x03c28f75, 0x02ba65af, 0x003cb2cb}}}, + {X: Field{[10]uint32{0x00b9d4f2, 0x02438ca5, 0x0301e981, 0x01eb8f97, 0x012dd335, 0x02acab04, 0x01c6bbf5, 0x037c430a, 0x02650b4d, 0x0023cb77}}, Y: Field{[10]uint32{0x034c6afb, 0x024ff937, 0x01f5d804, 0x016f4c9e, 0x0179df33, 0x01647df3, 0x02954bd8, 0x00db5413, 0x00f7e5a7, 0x00381ae3}}}, + {X: Field{[10]uint32{0x00950162, 0x0376a401, 0x018c5a3a, 0x0215b223, 0x00ba1d72, 0x0336cd59, 0x014562e0, 0x00f9f203, 0x0153f821, 0x000cc52d}}, Y: Field{[10]uint32{0x0043532d, 0x02a87e7f, 0x00c24fc4, 0x018804eb, 0x02b4dab4, 0x00f2b547, 0x00a7434e, 0x031543e5, 0x005ee3f7, 0x000cfa0f}}}, + {X: Field{[10]uint32{0x01304000, 0x00f16e89, 0x026062af, 0x0153b8ad, 0x03fa5895, 0x01229f30, 0x01b11a33, 0x0030bff1, 0x02f465ac, 0x001f041f}}, Y: Field{[10]uint32{0x035702c5, 0x0398fba5, 0x0124b508, 0x01e708fc, 0x0289b5a9, 0x015b4d97, 0x027fe78e, 0x001c1741, 0x03122e8a, 0x001ad6f3}}}, + {X: Field{[10]uint32{0x03e4f8b3, 0x01a95296, 0x00cb97b7, 0x0014dac8, 0x0019be46, 0x01565b42, 0x01e257ee, 0x037d9d44, 0x0029325a, 0x003a462a}}, Y: Field{[10]uint32{0x032fa8ae, 0x032481f3, 0x00ebfa9d, 0x03bc0ffc, 0x01b70af0, 0x00846705, 0x03a8f0d1, 0x014b0f86, 0x00a0b461, 0x0006a4bc}}}, + {X: Field{[10]uint32{0x01b9b079, 0x032533d0, 0x015d1e3f, 0x01f4b3a8, 0x01c346c9, 0x038c2720, 0x02dd2e3b, 0x0292e7a4, 0x0203d4f3, 0x0021dc36}}, Y: Field{[10]uint32{0x03123c03, 0x03a10b6a, 0x0005a10c, 0x01847ed4, 0x0053f964, 0x013d5feb, 0x01372fe6, 0x00f55c63, 0x030fdc63, 0x00340950}}}, + {X: Field{[10]uint32{0x00d8b22b, 0x012ab56b, 0x03ea1731, 0x01c318a0, 0x01a6589f, 0x02ef00e7, 0x026a57f6, 0x00955ec4, 0x013fae2b, 0x0031ad2b}}, Y: Field{[10]uint32{0x00d29bfe, 0x006bfeb6, 0x036fb46e, 0x023b3cf1, 0x0385f288, 0x01270e37, 0x01f278de, 0x00d048d7, 0x01cd2c1c, 0x003a148f}}}, + {X: Field{[10]uint32{0x03a86e14, 0x0232dc0d, 0x039689c8, 0x006c786a, 0x01462274, 0x03e1c586, 0x03b1e91f, 0x03e610dc, 0x01486ffb, 0x0026b3b6}}, Y: Field{[10]uint32{0x00b352d9, 0x01fd6482, 0x012cde8e, 0x03b29aa1, 0x0316e1e7, 0x02527074, 0x003cc321, 0x00c77ffd, 0x031f1b4c, 0x0035e9fa}}}, + {X: Field{[10]uint32{0x039007f3, 0x0153d7c6, 0x0322b87c, 0x015780e2, 0x01b08bf0, 0x03a2b29a, 0x034015b1, 0x036ad313, 0x036ffccb, 0x002bd454}}, Y: Field{[10]uint32{0x03130f7b, 0x03e12791, 0x027ef00c, 0x02ddc0e8, 0x00cbe813, 0x02ec74c2, 0x03fa85ba, 0x01fb3d27, 0x034c95c0, 0x002daec2}}}, + {X: Field{[10]uint32{0x01823ce2, 0x00bb94c4, 0x00c3e5bb, 0x03e8608e, 0x0156e02f, 0x01707249, 0x0045a092, 0x02aed5bf, 0x02df3ea0, 0x003b14c1}}, Y: Field{[10]uint32{0x01ee8b99, 0x004a100b, 0x009f6898, 0x02ff6507, 0x009457f4, 0x00f242f6, 0x00653524, 0x0197d060, 0x01b6720f, 0x00325433}}}, + {X: Field{[10]uint32{0x032d90a0, 0x0366ebb9, 0x00d876c5, 0x02320779, 0x03587f46, 0x024590d8, 0x0397ecd5, 0x01ef1868, 0x00a5be12, 0x000a4ec7}}, Y: Field{[10]uint32{0x0235d821, 0x01bdd36e, 0x0261bae2, 0x0090f463, 0x010443a5, 0x01d9218f, 0x03d81d91, 0x027c17a4, 0x030f238e, 0x00120840}}}, + {X: Field{[10]uint32{0x00865488, 0x007d21ad, 0x003c1256, 0x01088bbe, 0x00168771, 0x01a2ff04, 0x0151f0ee, 0x01aadaca, 0x037d9987, 0x003af952}}, Y: Field{[10]uint32{0x01381c07, 0x01bbae1b, 0x03c47924, 0x02835206, 0x0158d84f, 0x02090bd4, 0x0299d91b, 0x0200bfe9, 0x011ccaf8, 0x000a8759}}}, + {X: Field{[10]uint32{0x0064acdc, 0x03671a4d, 0x019dfd38, 0x00951174, 0x0133ac83, 0x00a74366, 0x0220109b, 0x035a6fb4, 0x01233ab0, 0x00223ddd}}, Y: Field{[10]uint32{0x03276702, 0x00a0b2f2, 0x00d5b79a, 0x01651670, 0x038e0590, 0x03b1afaf, 0x02a2cb1a, 0x017bd4c7, 0x0122fbd9, 0x0023e454}}}, + {X: Field{[10]uint32{0x02b3bb01, 0x005cd668, 0x0039fb81, 0x02e5ba51, 0x03c7fa40, 0x03afa5e5, 0x036cfa08, 0x00376276, 0x013de721, 0x0007611d}}, Y: Field{[10]uint32{0x01f41ad6, 0x029e187c, 0x0260dabf, 0x00ce7cd0, 0x012e889c, 0x01503121, 0x000b6d6f, 0x029361d1, 0x035aba53, 0x003dcd82}}}, + {X: Field{[10]uint32{0x011d4b2f, 0x033bed4c, 0x01e1c27f, 0x00f979d0, 0x0336f82a, 0x02ce2338, 0x01ae032c, 0x020b073c, 0x01f5176f, 0x000679a7}}, Y: Field{[10]uint32{0x03d5c143, 0x016ee9b2, 0x016e00b9, 0x02bd6ed2, 0x0309d9f7, 0x030745ec, 0x0175dc8c, 0x014efaf8, 0x00fec9ba, 0x0031007d}}}, + {X: Field{[10]uint32{0x02e3f2c9, 0x00d5332b, 0x0372953d, 0x01790ab7, 0x0119b04f, 0x01fca6a9, 0x01a93995, 0x0097ff7c, 0x0202c1f1, 0x001cc627}}, Y: Field{[10]uint32{0x0137f704, 0x00270069, 0x01424010, 0x00710407, 0x00d901de, 0x0390180e, 0x01d21b01, 0x01f3e188, 0x008f1c6e, 0x0014ae3a}}}, + {X: Field{[10]uint32{0x0087a74f, 0x0095ba4a, 0x0366901c, 0x02c296b9, 0x03278fd2, 0x01d1fc74, 0x038956cb, 0x02a2fd4b, 0x00828ff1, 0x00317af8}}, Y: Field{[10]uint32{0x01259860, 0x03c736f3, 0x033823ef, 0x0075b026, 0x02c506e5, 0x035cdad7, 0x0397dc92, 0x012e606a, 0x00b962e7, 0x00033963}}}, + {X: Field{[10]uint32{0x0182da76, 0x02815892, 0x01166435, 0x019f20ee, 0x011a7808, 0x02f220f5, 0x016feed3, 0x0038050a, 0x0221f799, 0x001e0f05}}, Y: Field{[10]uint32{0x0236da30, 0x0158f862, 0x03bc622f, 0x01d2f57f, 0x01f52245, 0x03ae0067, 0x0165c3e8, 0x02271a71, 0x03e2c9a1, 0x0000dc2c}}}, + {X: Field{[10]uint32{0x022b3305, 0x0267dbfe, 0x015794d7, 0x032cb1c7, 0x01fad66f, 0x0294dc87, 0x024cbd64, 0x01a9185c, 0x02800ccc, 0x0015579f}}, Y: Field{[10]uint32{0x004e9e41, 0x036980fd, 0x030eb63b, 0x00242cc9, 0x02db9b48, 0x023f9b75, 0x035ed312, 0x01c10863, 0x0165d39d, 0x0019eefc}}}, + {X: Field{[10]uint32{0x00243471, 0x0084e950, 0x0150a4b0, 0x02932b37, 0x030faa40, 0x010b1ac6, 0x028467e2, 0x0351b3c7, 0x0226ab1c, 0x00103126}}, Y: Field{[10]uint32{0x03dadf86, 0x0204fd8b, 0x0296bdc2, 0x00c19fd3, 0x03ad55bf, 0x00d08930, 0x039fdb4c, 0x0188bf82, 0x03005002, 0x0005a542}}}, + {X: Field{[10]uint32{0x03935298, 0x02d8bdb5, 0x021627c8, 0x009835df, 0x02473062, 0x0164f1d1, 0x0010b9f5, 0x02346272, 0x03e5db09, 0x003adace}}, Y: Field{[10]uint32{0x015c5bc8, 0x01d3c380, 0x022fb9bd, 0x01c512f8, 0x00c84e96, 0x00073b72, 0x01902317, 0x01bd707e, 0x01843f35, 0x000f4a55}}}, + {X: Field{[10]uint32{0x02b26091, 0x019c3397, 0x03ca903f, 0x00da6813, 0x03a06835, 0x034186d4, 0x020a0734, 0x0305a472, 0x00a42b55, 0x0005dc86}}, Y: Field{[10]uint32{0x03a5fa42, 0x02da432c, 0x00f4eced, 0x01c9d67c, 0x02057e0e, 0x017a2e5e, 0x017f243e, 0x02f1cddc, 0x021aa8a3, 0x00258459}}}, + {X: Field{[10]uint32{0x03d2a680, 0x020e99e3, 0x02be37f8, 0x018a2c1f, 0x02ea0c37, 0x009f099e, 0x0028c001, 0x017e29f4, 0x03a2f3bc, 0x002106a3}}, Y: Field{[10]uint32{0x012cf1b0, 0x00b53cd1, 0x0289d9a4, 0x02313e6e, 0x00052693, 0x0236ef73, 0x00577128, 0x007dde80, 0x037db2fd, 0x0015e6fc}}}, + {X: Field{[10]uint32{0x02dea82d, 0x0142985b, 0x01691322, 0x02735f94, 0x00358578, 0x00e6714f, 0x001421da, 0x01fc7b20, 0x01543a37, 0x002c07bd}}, Y: Field{[10]uint32{0x01a90265, 0x000802c9, 0x009eb962, 0x0347998e, 0x0082e119, 0x01e8dfc5, 0x03626a00, 0x02cbc4eb, 0x00e97e29, 0x000a3cc3}}}, + {X: Field{[10]uint32{0x00f38904, 0x006c2b01, 0x029a6259, 0x01f02ce2, 0x00ba344e, 0x03e32646, 0x02e70d6e, 0x03190c5f, 0x014e8e3c, 0x002e4f80}}, Y: Field{[10]uint32{0x000ac3d3, 0x027f2549, 0x001f72b2, 0x03b702b8, 0x00d0b368, 0x00bfe26d, 0x03152e10, 0x034431af, 0x01855bdf, 0x00004a70}}}, + {X: Field{[10]uint32{0x03acd522, 0x02fd5201, 0x0137305f, 0x031a2b20, 0x01a00601, 0x01b58c62, 0x000a1dd2, 0x00366bfe, 0x02f243c5, 0x00383d09}}, Y: Field{[10]uint32{0x02b749fc, 0x0035c177, 0x02d1e143, 0x00abac92, 0x021c1938, 0x033ce70a, 0x00bd848c, 0x037178c1, 0x03e0951a, 0x0025b620}}}, + {X: Field{[10]uint32{0x0073233c, 0x03aa6de7, 0x03df2147, 0x0052ceee, 0x00d5379f, 0x00ee7b01, 0x030adda6, 0x025eb4a1, 0x007440e8, 0x003847a7}}, Y: Field{[10]uint32{0x01c1f019, 0x03c2881b, 0x016c5cb9, 0x013767cf, 0x01e125e3, 0x0388b8d6, 0x01a9df03, 0x01d4c8fd, 0x014b2919, 0x001275b9}}}, + {X: Field{[10]uint32{0x016b2c2b, 0x03d9e9ea, 0x0191c79c, 0x01c26b11, 0x02ae38ee, 0x00009f30, 0x0396eca2, 0x03c514ed, 0x004b0c5e, 0x00246b56}}, Y: Field{[10]uint32{0x030bac2a, 0x030729d4, 0x001e23e9, 0x025fb3a1, 0x01565dfd, 0x017670f1, 0x0379e5db, 0x0314c447, 0x0213a620, 0x00360568}}}, + {X: Field{[10]uint32{0x0299f8d2, 0x01011850, 0x033dabfe, 0x00708c0f, 0x01103297, 0x02cc8bcd, 0x0013785c, 0x00d3c81d, 0x0392f4fa, 0x000f9c94}}, Y: Field{[10]uint32{0x0308ae85, 0x0088f95d, 0x0039e042, 0x015de256, 0x014e0c1d, 0x0241fbe9, 0x01482176, 0x03bb57cd, 0x02515add, 0x00238c8e}}}, + {X: Field{[10]uint32{0x01a98160, 0x03d5e411, 0x039bced4, 0x026e6808, 0x0191d911, 0x02a18fcd, 0x03c00acf, 0x0226ad20, 0x02c201a5, 0x0017a1ef}}, Y: Field{[10]uint32{0x02e7d47b, 0x009408fc, 0x032633a8, 0x00734335, 0x0233625f, 0x03f0e69b, 0x02f3c159, 0x01707e7a, 0x038433c7, 0x002a228e}}}, + {X: Field{[10]uint32{0x0268a0ed, 0x03e87234, 0x00f32489, 0x003b494b, 0x01da1826, 0x013a6642, 0x01cb6524, 0x00ecd5d2, 0x02132cb9, 0x0030b821}}, Y: Field{[10]uint32{0x008a5761, 0x00360aa3, 0x007644ed, 0x01934169, 0x0328e02e, 0x015381dc, 0x03038d68, 0x00d97751, 0x03ad1f16, 0x0034fcb8}}}, + {X: Field{[10]uint32{0x031978af, 0x005ee9c3, 0x0025c745, 0x034392e4, 0x023b9053, 0x0077650c, 0x02193c23, 0x0261a5ec, 0x005eccf0, 0x00264c13}}, Y: Field{[10]uint32{0x009dc789, 0x00066a88, 0x02111338, 0x03cc7836, 0x00ba1324, 0x00f74128, 0x03e77e34, 0x004e59bd, 0x027b638b, 0x003b9dfe}}}, + {X: Field{[10]uint32{0x00c5c6bc, 0x004c8aad, 0x02b1d1c2, 0x000d9435, 0x0325a79f, 0x027be256, 0x01f04f70, 0x03ecdd94, 0x00c559ad, 0x00103842}}, Y: Field{[10]uint32{0x039db653, 0x039192d9, 0x02b2cfc5, 0x02ae8253, 0x00210eb2, 0x011ffbd1, 0x02ff3f8c, 0x03992212, 0x03385733, 0x0022602a}}}, + {X: Field{[10]uint32{0x00c6a78a, 0x03ab3722, 0x01aca5bb, 0x037725c4, 0x006d6276, 0x03d4237d, 0x00315287, 0x001c8483, 0x02572d19, 0x00263220}}, Y: Field{[10]uint32{0x01a61c92, 0x0399dad0, 0x03256f3e, 0x003b8230, 0x00b57f27, 0x0341443a, 0x02ea7f48, 0x017fef44, 0x01761f5c, 0x001746aa}}}, + {X: Field{[10]uint32{0x00af6fed, 0x036ac818, 0x03740c05, 0x002601bf, 0x02d7b4cf, 0x005b0deb, 0x00eeab7a, 0x008c1ae1, 0x027a25e9, 0x000e26ae}}, Y: Field{[10]uint32{0x0065707e, 0x003b3db4, 0x01c13d6f, 0x00dcd7d8, 0x0049c326, 0x004aca64, 0x032ed608, 0x038ba34d, 0x00c9ec48, 0x0019ceac}}}, + {X: Field{[10]uint32{0x0253df17, 0x014fbab2, 0x03732614, 0x02ab94e6, 0x026619ea, 0x017c46ce, 0x02fda62e, 0x0255ba4f, 0x03ba832c, 0x00277193}}, Y: Field{[10]uint32{0x005990ac, 0x02ebf6bd, 0x0089f956, 0x0326520e, 0x038f60a9, 0x0228d63b, 0x0267ad8d, 0x02ac4290, 0x00a93c56, 0x000602ce}}}, + {X: Field{[10]uint32{0x024921f7, 0x0270557f, 0x008a9675, 0x00334f54, 0x03b3439b, 0x02d9c1ea, 0x003528b8, 0x030b0d88, 0x0218e758, 0x001c4463}}, Y: Field{[10]uint32{0x02104ee0, 0x01e78a2a, 0x0000b5ec, 0x03df8732, 0x0176bf22, 0x0046d4b4, 0x0108719f, 0x013a7192, 0x02f12c1b, 0x0030bd86}}}, + {X: Field{[10]uint32{0x02c3d096, 0x02ecaa0f, 0x0224245c, 0x008d94c6, 0x0146218b, 0x02b717f4, 0x00e09909, 0x03cf1249, 0x01ee11b9, 0x000cef3b}}, Y: Field{[10]uint32{0x00fbad0a, 0x0015f56b, 0x03e9d655, 0x023578c5, 0x03f83b3e, 0x011a53f6, 0x01a71f6f, 0x0319ce50, 0x011a6c22, 0x00057d2f}}}, + {X: Field{[10]uint32{0x0213ccb4, 0x02c83713, 0x031d0e66, 0x0101d661, 0x01fbd977, 0x00bf6e95, 0x021e5cb6, 0x03a7c7c5, 0x033a4ab5, 0x0012d666}}, Y: Field{[10]uint32{0x023fb523, 0x020a6752, 0x034232b1, 0x0268b1b7, 0x006c9601, 0x02cd0851, 0x03064119, 0x009cae2d, 0x01da9035, 0x0018d40e}}}, + {X: Field{[10]uint32{0x01269d10, 0x010d96c8, 0x03627569, 0x0368d7a5, 0x02decb8d, 0x0144d809, 0x038f6429, 0x0132a506, 0x034cdae5, 0x00067daf}}, Y: Field{[10]uint32{0x033c95d7, 0x024b1933, 0x03f3da1c, 0x01ad8274, 0x036cb31a, 0x02c9d40b, 0x00bca48d, 0x001b7099, 0x03dc090b, 0x0028930f}}}, + {X: Field{[10]uint32{0x0301314c, 0x03751bc6, 0x0267a058, 0x01d6c5de, 0x028a2708, 0x02b41ceb, 0x0229adf7, 0x034537d9, 0x01a98027, 0x002f0f7c}}, Y: Field{[10]uint32{0x008d1f76, 0x02cc2ae0, 0x005e7b6b, 0x0195dc1d, 0x01934450, 0x03645462, 0x0233e898, 0x00741cbb, 0x029154f5, 0x0026774e}}}, + {X: Field{[10]uint32{0x01d72c3c, 0x012a795f, 0x0285e1ea, 0x00793768, 0x02c34ef3, 0x0306b97d, 0x025f5b5a, 0x01c3a134, 0x0264521a, 0x0025de90}}, Y: Field{[10]uint32{0x039f5a0c, 0x03a6ca8a, 0x0041b4fc, 0x01a0cb87, 0x01dbf44f, 0x03500ff2, 0x0025b61c, 0x00bf9341, 0x00197aab, 0x003c6ff2}}}, + {X: Field{[10]uint32{0x01c9b339, 0x004b1a43, 0x01b47a1c, 0x0044f89c, 0x00098b26, 0x02b71ec7, 0x014a7f58, 0x01694cfb, 0x024a85fc, 0x0017f7f7}}, Y: Field{[10]uint32{0x02c6555a, 0x0113d245, 0x02b1ce97, 0x0222cbdb, 0x01731c25, 0x01bec92e, 0x011bad52, 0x02539825, 0x03afbd6a, 0x000fb7ca}}}, + {X: Field{[10]uint32{0x01e9c50d, 0x000508fa, 0x007476ce, 0x02fe089a, 0x00afc17a, 0x03edf6e3, 0x02c1ac50, 0x022bf3ba, 0x032cdcd2, 0x002e2f35}}, Y: Field{[10]uint32{0x03c55e9d, 0x01144940, 0x026dbf2c, 0x038da9d5, 0x039cb6d0, 0x01dc694f, 0x03d9f2f3, 0x03015e6e, 0x03c52e6d, 0x0002098c}}}, + {X: Field{[10]uint32{0x01f75c77, 0x02290700, 0x01c728be, 0x03a769cd, 0x01721bc2, 0x03a51959, 0x01d01eb6, 0x030def19, 0x0199133b, 0x001b082e}}, Y: Field{[10]uint32{0x00b71e53, 0x037c4550, 0x03f20cf6, 0x0129e717, 0x015e36f4, 0x0296b91d, 0x0342aa47, 0x000db897, 0x0274d8ad, 0x000832bd}}}, + {X: Field{[10]uint32{0x015adb07, 0x03246b4c, 0x03a7022b, 0x03e858ed, 0x03f877b5, 0x00ba4677, 0x00e4bf2f, 0x017c54e7, 0x01416965, 0x002ef924}}, Y: Field{[10]uint32{0x03f93a1e, 0x01dba732, 0x036ac40f, 0x01fc3b21, 0x01a77b84, 0x02e3f029, 0x02b5ff6d, 0x0348f231, 0x00256618, 0x002334f8}}}, + {X: Field{[10]uint32{0x01e73786, 0x00531a19, 0x00c752fe, 0x02bb4e60, 0x03bf6dfe, 0x015905cd, 0x0339bbbc, 0x01d2fc1f, 0x0078e383, 0x001d22cc}}, Y: Field{[10]uint32{0x02811ac8, 0x032533ca, 0x02eb28f3, 0x02c18a5e, 0x03ea86b6, 0x005ff211, 0x01f2c802, 0x037e891c, 0x020a61a7, 0x001fdf2b}}}, + {X: Field{[10]uint32{0x0364e4b4, 0x03522fb1, 0x000bcd23, 0x024b414b, 0x005d39d5, 0x009cb3da, 0x015728b2, 0x00956518, 0x03c5b89a, 0x003e98f1}}, Y: Field{[10]uint32{0x00a47c8a, 0x01f5a4a3, 0x01d31fbe, 0x035972d3, 0x01804724, 0x0359f410, 0x0238a506, 0x02758387, 0x03a27751, 0x003130ca}}}, + {X: Field{[10]uint32{0x0056c91c, 0x014e1c73, 0x024446c9, 0x02c1c38f, 0x0386978e, 0x02520c52, 0x025ea13d, 0x038e028d, 0x0197d014, 0x0030bb5c}}, Y: Field{[10]uint32{0x026a595e, 0x03700791, 0x0007009b, 0x02ddcdf7, 0x033404bd, 0x022e6c3e, 0x0054a09d, 0x033463de, 0x0293e7c1, 0x00171cf0}}}, + {X: Field{[10]uint32{0x03c266be, 0x03fa1c9b, 0x03ab5f22, 0x00130367, 0x026c2b3a, 0x03cfa001, 0x0334e846, 0x002f5b0b, 0x01efcb1e, 0x00094530}}, Y: Field{[10]uint32{0x024e3eb3, 0x007b2531, 0x01ad069a, 0x0376333e, 0x02507c35, 0x017d9bb1, 0x00443466, 0x02cb67fe, 0x006c07bb, 0x0031682b}}}, + {X: Field{[10]uint32{0x02286350, 0x01bbe513, 0x0081df6b, 0x03ff25a8, 0x00e2318b, 0x028e10f2, 0x01d2e289, 0x011fc963, 0x03050116, 0x0016f01f}}, Y: Field{[10]uint32{0x03bcbea4, 0x03e16afa, 0x02c66a41, 0x01947844, 0x017a91c4, 0x0096136d, 0x007d059f, 0x03bc1236, 0x00931217, 0x00084f38}}}, + {X: Field{[10]uint32{0x023cad8a, 0x0285cc66, 0x03dd8862, 0x00d7da80, 0x03db9c13, 0x01eb9193, 0x0173f706, 0x016c0e29, 0x02429737, 0x003b6d5b}}, Y: Field{[10]uint32{0x01ef5fa7, 0x01111fc5, 0x01f2e531, 0x014c7660, 0x00358620, 0x009bcef9, 0x038414a4, 0x03551986, 0x027016f8, 0x0034f986}}}, + {X: Field{[10]uint32{0x03d5d732, 0x0323675c, 0x03d55817, 0x023b435d, 0x02684908, 0x0380a191, 0x03609982, 0x019204ef, 0x036e7826, 0x000a4949}}, Y: Field{[10]uint32{0x0287296f, 0x004ff926, 0x02d22622, 0x004c8375, 0x0184b332, 0x02ec33b8, 0x032d755d, 0x0262773a, 0x03a6a97c, 0x003d4c55}}}, + {X: Field{[10]uint32{0x03c0a034, 0x039027a6, 0x0337fa69, 0x01e70ebe, 0x01912863, 0x00dc067a, 0x02098829, 0x03d294dc, 0x01d5bda0, 0x000b115e}}, Y: Field{[10]uint32{0x02f7d99c, 0x032a4d17, 0x0315c336, 0x019ec6e6, 0x02a319d4, 0x00c41ef2, 0x01acd23f, 0x030f1195, 0x034dd889, 0x0038542f}}}, + {X: Field{[10]uint32{0x00808904, 0x0221516a, 0x00b3d056, 0x02e109a6, 0x02025f21, 0x02bcc60c, 0x02295870, 0x03e1daef, 0x020011f9, 0x0017c982}}, Y: Field{[10]uint32{0x02e02350, 0x01cea263, 0x03a9b534, 0x013b60e8, 0x01736fe6, 0x001bab0f, 0x00d2ce00, 0x02a87de9, 0x0232164c, 0x001ab4ce}}}, + {X: Field{[10]uint32{0x02ac4b8b, 0x016935ed, 0x011000d6, 0x01a7a221, 0x029d1f2c, 0x00fecf5a, 0x02fd430f, 0x017b2414, 0x00c61209, 0x000eeeef}}, Y: Field{[10]uint32{0x010b0c97, 0x03e7ea95, 0x019487e4, 0x032ea8ed, 0x0240d244, 0x03256076, 0x01b090f8, 0x029b9f6d, 0x00283846, 0x0000ca3a}}}, + {X: Field{[10]uint32{0x016acff0, 0x02e76065, 0x0117daff, 0x032998b6, 0x02343e80, 0x03088bd2, 0x009af44b, 0x0363bffb, 0x027bdd0f, 0x00126140}}, Y: Field{[10]uint32{0x038affda, 0x005b088e, 0x0065468c, 0x0053fa05, 0x03460b10, 0x009c5a88, 0x01561b5f, 0x01b904c1, 0x012e37a3, 0x00162fbf}}}, + {X: Field{[10]uint32{0x03959de7, 0x0098f559, 0x0359b92e, 0x03300386, 0x006e826e, 0x000ecf73, 0x01eb2d88, 0x0022466d, 0x00e8d2e3, 0x0008518e}}, Y: Field{[10]uint32{0x0232342a, 0x0350793d, 0x03dd8ad9, 0x03c72379, 0x02dc22c0, 0x03d7f270, 0x02e0454f, 0x0078a4d6, 0x01216f13, 0x00027762}}}, + {X: Field{[10]uint32{0x02f3cfdd, 0x00013db9, 0x01f35444, 0x0041a455, 0x016876c1, 0x0197828c, 0x023532b9, 0x00b5abcf, 0x03055ced, 0x001b3b61}}, Y: Field{[10]uint32{0x02546ec6, 0x03ad5bdf, 0x00ac0a83, 0x000665ff, 0x0355b17c, 0x0079abb9, 0x03ba4e2a, 0x0155be2d, 0x02abc86f, 0x003d46c6}}}, + {X: Field{[10]uint32{0x01dcfacb, 0x007221b2, 0x0172730a, 0x03901086, 0x017fc3ad, 0x0216746b, 0x02634987, 0x024db38c, 0x0267876c, 0x0025405b}}, Y: Field{[10]uint32{0x02f4f660, 0x02ece49a, 0x03160742, 0x00bcb90f, 0x034df723, 0x004016ea, 0x03d284b8, 0x019bbbfe, 0x00c4e6e2, 0x000a679e}}}, + {X: Field{[10]uint32{0x026f23f2, 0x0054c67b, 0x00763513, 0x003e76cc, 0x00c513d2, 0x030e633c, 0x02a8019f, 0x0070e710, 0x02c83040, 0x0012fb19}}, Y: Field{[10]uint32{0x038514fc, 0x02c9cd64, 0x003d58e8, 0x028550ff, 0x034fcded, 0x0224a718, 0x01aa9162, 0x0118261c, 0x02923b7d, 0x003c77ff}}}, + {X: Field{[10]uint32{0x008a59c7, 0x03b69e21, 0x03bb27f3, 0x03bd6ac9, 0x019088c4, 0x00394eb9, 0x000015a6, 0x00ee5dab, 0x03d14051, 0x002d4144}}, Y: Field{[10]uint32{0x01c36399, 0x016252e6, 0x0084129a, 0x0326999d, 0x01dc9282, 0x02de1b33, 0x03254c51, 0x039b08fe, 0x02e51182, 0x00271072}}}, + {X: Field{[10]uint32{0x0290708d, 0x005564ed, 0x00c003e4, 0x01149bcc, 0x01d1df38, 0x02a482b2, 0x029bda38, 0x0280e5a9, 0x02533989, 0x00165e49}}, Y: Field{[10]uint32{0x02ba648f, 0x03b40bc6, 0x00bab3a3, 0x02ce5eb9, 0x034c750c, 0x027b99cd, 0x02561921, 0x021f6d79, 0x00b72748, 0x001fcb05}}}, + {X: Field{[10]uint32{0x01eacf6f, 0x00dc1581, 0x02dd34db, 0x03e4fb05, 0x01251cc7, 0x0245b599, 0x00fe2b3e, 0x00aa4d1e, 0x0366cf01, 0x001ee8ad}}, Y: Field{[10]uint32{0x016404bb, 0x02cc47e1, 0x02a6903f, 0x0230b212, 0x003dcc7e, 0x03a2f745, 0x01212865, 0x01e630dc, 0x0138f950, 0x00053f62}}}, + {X: Field{[10]uint32{0x02b5d6bb, 0x00f7e6fa, 0x013a71c4, 0x008959af, 0x017f9e9d, 0x027a0e73, 0x0147af8a, 0x024367f2, 0x02fef69c, 0x000c18bc}}, Y: Field{[10]uint32{0x02f5ee58, 0x025caf01, 0x02bbaad9, 0x0350868d, 0x02064047, 0x0364a9c5, 0x01e7b719, 0x01b505ff, 0x00334991, 0x0036e12a}}}, + {X: Field{[10]uint32{0x00b06e74, 0x0230bf55, 0x00ce3db3, 0x021f8c9f, 0x00f6fae6, 0x02d119c0, 0x034d695c, 0x03b229df, 0x009d69db, 0x003b57e5}}, Y: Field{[10]uint32{0x018930e3, 0x00bfafcb, 0x019fdee6, 0x008fc566, 0x032a6907, 0x026542f2, 0x0104ff92, 0x00f54194, 0x0060057b, 0x0011c938}}}, + {X: Field{[10]uint32{0x021b7cdc, 0x01c39181, 0x028d3d71, 0x01427af5, 0x0030e129, 0x01ab3004, 0x01312fea, 0x0209d83a, 0x02033002, 0x00135957}}, Y: Field{[10]uint32{0x00ea99bb, 0x03b948c4, 0x00d0b7bc, 0x02789e33, 0x00439957, 0x027a5fc1, 0x01e046b6, 0x01526cbd, 0x01226c27, 0x00243bf0}}}, + {X: Field{[10]uint32{0x02f1b35d, 0x019beaba, 0x0260dbf1, 0x02030d46, 0x0368e05e, 0x0120fe56, 0x029edf4a, 0x03bfb342, 0x0356b888, 0x003dad81}}, Y: Field{[10]uint32{0x00a5fb8c, 0x008a8f4e, 0x01df6bfd, 0x023c2f39, 0x00cb57e9, 0x02bebe6c, 0x0096b241, 0x005611aa, 0x02bdaa78, 0x0009efb7}}}, + {X: Field{[10]uint32{0x03c55748, 0x00c06228, 0x00b516ca, 0x00e23f1f, 0x008c81c5, 0x0235ba8b, 0x004db945, 0x0288ddcb, 0x00aa942b, 0x0033164b}}, Y: Field{[10]uint32{0x03288158, 0x0144b476, 0x0307c63d, 0x02c75900, 0x01bb6bd2, 0x00d870fc, 0x0277d100, 0x015820db, 0x03cd358e, 0x000db8bd}}}, + {X: Field{[10]uint32{0x02c1a456, 0x0280cbfd, 0x00edf6a7, 0x01865db4, 0x00f93721, 0x03b7d0c1, 0x023acb8c, 0x011a6086, 0x01dca5bb, 0x0012b2ea}}, Y: Field{[10]uint32{0x02262437, 0x0393a154, 0x021669ca, 0x00aa5cbc, 0x01d6fb30, 0x02ef40b3, 0x032287e9, 0x011fccf9, 0x003ab2ab, 0x002cdba6}}}, + {X: Field{[10]uint32{0x03061f91, 0x011b76fa, 0x0072d974, 0x00f612a5, 0x017be363, 0x02e73a58, 0x010e0c61, 0x01e74cad, 0x005e0422, 0x00322946}}, Y: Field{[10]uint32{0x03d4b5cb, 0x02348b66, 0x000ff3c3, 0x0347fd97, 0x01cdb7cb, 0x019a3bac, 0x00c1df74, 0x00626f59, 0x00b7445e, 0x0033ea94}}}, + {X: Field{[10]uint32{0x035f18f9, 0x02c41074, 0x0120e052, 0x002197e3, 0x01535faf, 0x0277842b, 0x01168a88, 0x03d844d9, 0x016707f4, 0x00307255}}, Y: Field{[10]uint32{0x00033749, 0x02ae5052, 0x027eb537, 0x0384dc23, 0x02543919, 0x015bd11c, 0x02fc1eb9, 0x01ad8c26, 0x003b3d95, 0x000d3def}}}, + {X: Field{[10]uint32{0x0236a8f3, 0x006b9474, 0x038fa8df, 0x01a3cf87, 0x028bb68d, 0x00fdf495, 0x02093703, 0x01cdbad2, 0x03b736f6, 0x00237d3e}}, Y: Field{[10]uint32{0x0102122c, 0x01ddd917, 0x00c81229, 0x03ddc1dc, 0x00cef6b0, 0x006ece14, 0x007af267, 0x00b400e6, 0x01fe8e9a, 0x000f5c61}}}, + {X: Field{[10]uint32{0x025af3dd, 0x02a979aa, 0x00297c2b, 0x02db47af, 0x01c2c8bb, 0x011d4047, 0x02a1ec0c, 0x01f2e3ca, 0x01f0e35c, 0x0000358d}}, Y: Field{[10]uint32{0x03a51a2f, 0x01a00f1e, 0x006435e3, 0x0264614f, 0x03441e5a, 0x0241eb97, 0x0190a5b5, 0x03a2cc6a, 0x02bdc588, 0x0000249b}}}, + {X: Field{[10]uint32{0x0346a4bc, 0x0181c802, 0x01923d64, 0x0097a2d4, 0x013678b5, 0x0038e381, 0x014ea383, 0x014dd5d4, 0x012d5f86, 0x0002d634}}, Y: Field{[10]uint32{0x03438d3e, 0x01121041, 0x037f648e, 0x0103a920, 0x00d77c9e, 0x0265702d, 0x01d587ce, 0x02eace4d, 0x01835b0e, 0x003ded64}}}, + {X: Field{[10]uint32{0x029a7f36, 0x029db6f6, 0x0178011b, 0x014d9187, 0x0212cb42, 0x01e3a26b, 0x03ad0755, 0x00d903b3, 0x028cb401, 0x002edf1a}}, Y: Field{[10]uint32{0x0036581c, 0x00836852, 0x00ba7d1c, 0x0100c1b7, 0x023c2f5c, 0x01c20a56, 0x0195b835, 0x035861a2, 0x02583774, 0x001f7680}}}, + {X: Field{[10]uint32{0x0114a9e6, 0x00eca60d, 0x03b91968, 0x0065c8b3, 0x02f116b8, 0x03e96dea, 0x00a990a7, 0x0233be77, 0x00f792cc, 0x00053dbc}}, Y: Field{[10]uint32{0x024d7055, 0x01bc840e, 0x000b97b9, 0x017fc8e0, 0x01226104, 0x02cffb2d, 0x00e5aac4, 0x01663243, 0x03927a07, 0x002230d7}}}, + {X: Field{[10]uint32{0x03448541, 0x02ef39dd, 0x014fa76b, 0x034125ab, 0x02fb60f4, 0x015fd2a8, 0x01ad8964, 0x02846177, 0x01f4eb9f, 0x0012e579}}, Y: Field{[10]uint32{0x01e71d21, 0x01c1b451, 0x038f4d27, 0x0023df8a, 0x01502d1f, 0x0004807b, 0x0087f512, 0x032cc6e8, 0x0387513a, 0x00078401}}}, + {X: Field{[10]uint32{0x024b63ae, 0x032f4a8d, 0x01c16dce, 0x01993617, 0x03a7af53, 0x008cd568, 0x004aa312, 0x016cb18e, 0x03c067f7, 0x003a685f}}, Y: Field{[10]uint32{0x027fb8c7, 0x00302177, 0x01ac1956, 0x01a806d3, 0x030a40e0, 0x00ad806a, 0x038fcf01, 0x01148d8b, 0x0388ad67, 0x00108288}}}, + {X: Field{[10]uint32{0x03ff9169, 0x02b55110, 0x0281cf10, 0x010e0cc6, 0x0096d4ff, 0x0020d04c, 0x023d066c, 0x03b2053b, 0x0136f320, 0x0000e761}}, Y: Field{[10]uint32{0x028ca248, 0x01b8d9f0, 0x023be7a7, 0x00d44e9e, 0x00c74345, 0x00152af4, 0x0166a556, 0x03a26183, 0x01e91478, 0x001c3ba2}}}, + {X: Field{[10]uint32{0x03b636e8, 0x036a8f0b, 0x0320e001, 0x024f127f, 0x029f95b9, 0x00dc7389, 0x031dc72f, 0x0135b2fa, 0x00c80862, 0x0025de68}}, Y: Field{[10]uint32{0x00c2712e, 0x00292ae8, 0x03907d23, 0x03629932, 0x03369684, 0x000de482, 0x01a4b0e6, 0x01b14027, 0x03cc6729, 0x00276789}}}, + {X: Field{[10]uint32{0x02f0b401, 0x022d3ed9, 0x01586bd7, 0x007f4559, 0x034a9747, 0x032bcdbf, 0x01c09de9, 0x02d23da9, 0x004a1dab, 0x00335316}}, Y: Field{[10]uint32{0x033446f1, 0x00cd0449, 0x017f0bc4, 0x03b711d9, 0x026fd60e, 0x02b4b0a3, 0x02104b0c, 0x001b8acf, 0x02b10eff, 0x0025640a}}}, + {X: Field{[10]uint32{0x0161aba4, 0x02afba89, 0x0319688e, 0x01957549, 0x02dbeb3f, 0x01cadddb, 0x03164f7c, 0x018b2d44, 0x01f41423, 0x0011b284}}, Y: Field{[10]uint32{0x0034c9ff, 0x00b13569, 0x022f5e83, 0x01198813, 0x01bcfd09, 0x01898f18, 0x036d3cbd, 0x03510b7e, 0x031a2a2a, 0x00201810}}}, + {X: Field{[10]uint32{0x0294a513, 0x030e7622, 0x003b475a, 0x0395fa3e, 0x01eb712d, 0x0000c688, 0x035c7535, 0x018fd5db, 0x01791ffb, 0x0037faf4}}, Y: Field{[10]uint32{0x03be75de, 0x032c6b71, 0x00f0aa71, 0x00b7b2ca, 0x006576af, 0x03df1843, 0x02aa0e22, 0x02d53081, 0x007e39b2, 0x0033fb5b}}}, + {X: Field{[10]uint32{0x012c2469, 0x00e021d7, 0x03fcfe12, 0x0285e59f, 0x0143daf1, 0x028ee53e, 0x0233d9d7, 0x0018ed11, 0x013282fd, 0x0031c719}}, Y: Field{[10]uint32{0x01d376d0, 0x0346d52a, 0x02ba8620, 0x00d94ab7, 0x00f18a47, 0x00eafa50, 0x01f8aed3, 0x01a840e3, 0x03cd0e00, 0x0018bf35}}}, + {X: Field{[10]uint32{0x00c0ff37, 0x022bbdcd, 0x007b1e9f, 0x0107f059, 0x026864ec, 0x0123edd6, 0x02640fbf, 0x02826938, 0x034ddc8b, 0x0018faee}}, Y: Field{[10]uint32{0x024ae28e, 0x01848176, 0x022df772, 0x013dc671, 0x01dbf1ae, 0x01cd82a1, 0x01090e19, 0x01bd2d07, 0x034b0fe1, 0x00396740}}}, + {X: Field{[10]uint32{0x0112814a, 0x00536e77, 0x000bceea, 0x00709c75, 0x01ce6e5c, 0x006d624b, 0x02eac616, 0x02fc5963, 0x00c8cb51, 0x00194126}}, Y: Field{[10]uint32{0x00a65279, 0x0162be59, 0x01e6ee30, 0x0215c2b5, 0x027a6145, 0x02f57452, 0x0057769b, 0x00064c91, 0x03855d8e, 0x0039f999}}}, + {X: Field{[10]uint32{0x03c43fd5, 0x00896a11, 0x0032ac41, 0x02a10304, 0x00090815, 0x0205b7d1, 0x0199c07b, 0x00218e05, 0x003f14c0, 0x00052878}}, Y: Field{[10]uint32{0x01fe98de, 0x03581bcd, 0x02ddb6d6, 0x00e1414c, 0x024926da, 0x02ee3bd7, 0x0366bac9, 0x02a23d1b, 0x0259bc6b, 0x000d4912}}}, + {X: Field{[10]uint32{0x02903c5c, 0x03d4c56d, 0x00f084d6, 0x0056ef54, 0x03a4f14c, 0x004553ff, 0x00f9a167, 0x0287a03b, 0x02b2f6a8, 0x000727db}}, Y: Field{[10]uint32{0x0203a033, 0x0181974a, 0x0187dd26, 0x00f900be, 0x01538638, 0x0143bba6, 0x026fc511, 0x03fd8e6d, 0x01f52ca4, 0x0039af78}}}, + {X: Field{[10]uint32{0x0170f8bf, 0x03c0863e, 0x029d97cf, 0x006b0381, 0x00b43ea6, 0x02c0355b, 0x00809664, 0x039ec41f, 0x02ed0bad, 0x000779c7}}, Y: Field{[10]uint32{0x00ee1434, 0x01f69986, 0x029bb5c6, 0x0176615d, 0x01ea99d6, 0x02def253, 0x00d42e16, 0x03babb5e, 0x02de77ed, 0x0002352c}}}, + {X: Field{[10]uint32{0x035cb4b1, 0x01baaad7, 0x018c35a9, 0x00e420e3, 0x02479f7a, 0x02eeadc1, 0x022f0628, 0x0134baea, 0x0280ce95, 0x003d10ca}}, Y: Field{[10]uint32{0x02d579bf, 0x0286272f, 0x0302cc67, 0x01dca718, 0x0291f3d0, 0x03f024e0, 0x00abf476, 0x0290300f, 0x02adac34, 0x0025bf9b}}}, + {X: Field{[10]uint32{0x0119fb21, 0x022d7a49, 0x00737482, 0x032b0549, 0x01cb37e1, 0x02109046, 0x023d3f96, 0x012bd158, 0x034d1796, 0x0023dc79}}, Y: Field{[10]uint32{0x004865ab, 0x01e15358, 0x0091cec0, 0x008021a7, 0x025b6b17, 0x02fda51b, 0x03678e4e, 0x03292e9d, 0x00dfd7f0, 0x001a643c}}}, + {X: Field{[10]uint32{0x02a6745e, 0x00671271, 0x001a1200, 0x014b3bdc, 0x005a09d0, 0x025aa0e8, 0x01546e20, 0x03097999, 0x01575e3d, 0x00088a4c}}, Y: Field{[10]uint32{0x01c423b0, 0x01bab639, 0x0285986a, 0x020b7bfa, 0x0283d050, 0x02a5072a, 0x012bfae8, 0x01581f1e, 0x00874258, 0x002ab63e}}}, + {X: Field{[10]uint32{0x0248a096, 0x00ea8abc, 0x017c63b7, 0x01a4eb08, 0x00cc57d0, 0x03989d94, 0x02bf5f29, 0x029a6a05, 0x02632ef3, 0x0019617f}}, Y: Field{[10]uint32{0x00fd9f8b, 0x00dea0db, 0x037cc12f, 0x00ff7847, 0x03dc8a89, 0x01bb3157, 0x019ca577, 0x006bfbb7, 0x03bb2028, 0x002082a8}}}, + {X: Field{[10]uint32{0x03f67bf8, 0x007907e4, 0x01339195, 0x00bf9843, 0x01aaec47, 0x02fc18a0, 0x0163ce5a, 0x01472aca, 0x0079e55c, 0x000888c9}}, Y: Field{[10]uint32{0x03f927d2, 0x016a6efa, 0x0104bb7c, 0x0062a359, 0x02888a8f, 0x0304ca68, 0x03f0514b, 0x00b5ff99, 0x03ab2cf2, 0x0003864b}}}, + {X: Field{[10]uint32{0x01df16fc, 0x01f6c097, 0x00f60826, 0x022dc3a6, 0x00446014, 0x02ce5b25, 0x00aba082, 0x001a7af3, 0x02fde4ba, 0x0036a340}}, Y: Field{[10]uint32{0x023fa2bb, 0x01d80879, 0x034d059a, 0x03422d9b, 0x01579756, 0x01e8b993, 0x0167e7c1, 0x0021291f, 0x013de337, 0x00068c08}}}, + {X: Field{[10]uint32{0x02202ebf, 0x02a7c624, 0x02501708, 0x0249e3b9, 0x01ad49e0, 0x01313a2e, 0x038a0066, 0x020b7bc6, 0x0062854e, 0x0029bdcb}}, Y: Field{[10]uint32{0x01d03ba4, 0x00d54dc0, 0x0037edaa, 0x02246a0e, 0x002e2709, 0x008c63bd, 0x03c56abc, 0x0204102d, 0x032db08c, 0x0020d565}}}, + {X: Field{[10]uint32{0x03c7db68, 0x016b8a8e, 0x028ee8d5, 0x033a67d6, 0x02a15077, 0x00df7315, 0x02f8c359, 0x02168171, 0x013a309e, 0x00081d3f}}, Y: Field{[10]uint32{0x022cff97, 0x0387c20c, 0x0182e53a, 0x03a6baa5, 0x023061a4, 0x001aa605, 0x018fc0e8, 0x00f250b9, 0x02eacb78, 0x00384700}}}, + {X: Field{[10]uint32{0x01a1a5e3, 0x0071431e, 0x0106c861, 0x03cc6098, 0x0229aa59, 0x00a92d8b, 0x00d316f6, 0x02a8adc3, 0x0266fae9, 0x00127b55}}, Y: Field{[10]uint32{0x007643f7, 0x02eb1b20, 0x028b6324, 0x0024aa0d, 0x021477c2, 0x0261a59e, 0x000b19ef, 0x0138af73, 0x009aae14, 0x001729f9}}}, + {X: Field{[10]uint32{0x016c1b1f, 0x004d8897, 0x014683ed, 0x03a63864, 0x01b582c4, 0x00dc88cd, 0x03472a71, 0x0393a617, 0x007ea1f7, 0x0008a27b}}, Y: Field{[10]uint32{0x01cbbeb1, 0x0144b2b6, 0x0090261a, 0x022f5c3a, 0x03b03f89, 0x01ff903d, 0x017bff67, 0x00219c14, 0x0318689a, 0x0000478a}}}, + {X: Field{[10]uint32{0x01859164, 0x0273afe1, 0x00635bc4, 0x014bff1c, 0x03fbed0e, 0x022e8ae8, 0x02c64a55, 0x03befb62, 0x02be23f1, 0x003aa14b}}, Y: Field{[10]uint32{0x01cbb824, 0x02a98d50, 0x00fafc97, 0x01456c97, 0x0125ef13, 0x01e93905, 0x0266583c, 0x0298e5cc, 0x0341fe97, 0x002f78bb}}}, + {X: Field{[10]uint32{0x0302f0ea, 0x026f86f4, 0x018553fe, 0x01f6905e, 0x00290b25, 0x03fbc229, 0x001a9548, 0x01f4fc6b, 0x00e67cc0, 0x0015c63c}}, Y: Field{[10]uint32{0x01acbe90, 0x0103b3da, 0x0094fd4e, 0x02828bae, 0x03a6ffca, 0x019169ab, 0x02d8bd53, 0x0175fb9c, 0x015bfca6, 0x00263b13}}}, + {X: Field{[10]uint32{0x03810a4c, 0x03af6492, 0x01ad550b, 0x00fde033, 0x0310269c, 0x01d51638, 0x00f0650b, 0x03f5f7ba, 0x02abd77a, 0x0037d8a8}}, Y: Field{[10]uint32{0x00e4c034, 0x0120a6c2, 0x028cd54c, 0x023a7f22, 0x008d39fe, 0x022198f8, 0x03ea2e95, 0x0349ee02, 0x02cce384, 0x001a9981}}}, + {X: Field{[10]uint32{0x005e6668, 0x01336ba0, 0x039aa497, 0x003bbf5d, 0x039ea7dc, 0x00254239, 0x039bd198, 0x009a2f0c, 0x00454b0c, 0x0004043f}}, Y: Field{[10]uint32{0x016410e1, 0x0197eafa, 0x0001c3fa, 0x03c674f6, 0x02d51194, 0x01adaf4a, 0x030a323c, 0x02d65cac, 0x02db0681, 0x001a1a8e}}}, + {X: Field{[10]uint32{0x035c5c18, 0x0097b5a7, 0x0087bd54, 0x01101e41, 0x02072ca3, 0x0050524f, 0x03e93c96, 0x00e061a7, 0x00527567, 0x0022b1e6}}, Y: Field{[10]uint32{0x01d1c08e, 0x031cb26f, 0x03cec684, 0x03e67496, 0x00775375, 0x027bc7e4, 0x0172e04b, 0x03219f46, 0x0248fcbf, 0x002ecc50}}}, + {X: Field{[10]uint32{0x03848b9d, 0x0321a48f, 0x021605f9, 0x01340866, 0x036f3f17, 0x017c2b78, 0x01f3bf44, 0x031f3b18, 0x031188cb, 0x001583a5}}, Y: Field{[10]uint32{0x01b9cd2f, 0x003bdb74, 0x02277bc8, 0x022b063b, 0x014d133f, 0x01939ba7, 0x03bf21fc, 0x03319efe, 0x02ce6775, 0x0027a4b6}}}, + {X: Field{[10]uint32{0x01fb943a, 0x0241c03d, 0x009fee6d, 0x00bc1fdc, 0x0028eea5, 0x011a6870, 0x015ca088, 0x03ad9b32, 0x02044b95, 0x00231190}}, Y: Field{[10]uint32{0x009d0223, 0x0049c79a, 0x03aa51a1, 0x009654f0, 0x03a34920, 0x03afa965, 0x01b3a615, 0x014604c0, 0x005d7bc2, 0x002fc43f}}}, + {X: Field{[10]uint32{0x031eb5aa, 0x034730a1, 0x013cb4d8, 0x036be1d1, 0x037f2245, 0x0362c0d9, 0x0377247c, 0x022dc4d4, 0x034cf357, 0x0034a4fd}}, Y: Field{[10]uint32{0x024a6f26, 0x02befb69, 0x03423ba7, 0x0352b8d5, 0x03f080e3, 0x02c24143, 0x0245931e, 0x03a8518f, 0x013a61df, 0x0021b080}}}, + {X: Field{[10]uint32{0x03687d35, 0x02f5d135, 0x02aff4c6, 0x029ccd99, 0x01fefbf7, 0x01dbae4d, 0x027611ec, 0x01ec7f1d, 0x0241ae75, 0x000d665c}}, Y: Field{[10]uint32{0x004b2aa0, 0x013e5bf1, 0x01f9c599, 0x03bf3283, 0x022f36e0, 0x02f4e4f6, 0x007fd357, 0x0335330f, 0x021f246b, 0x002f2fa9}}}, + {X: Field{[10]uint32{0x036464eb, 0x00d8095f, 0x006de15f, 0x0316f678, 0x00285a17, 0x013b8d77, 0x01a0ef84, 0x0065f4f0, 0x00977467, 0x00034258}}, Y: Field{[10]uint32{0x013e8783, 0x012dc2ef, 0x0303cd14, 0x01a67a22, 0x023dd448, 0x01e737a7, 0x02954bfc, 0x036e59a4, 0x02a51e06, 0x000d0abd}}}, + {X: Field{[10]uint32{0x0241a777, 0x03e2632b, 0x01470bfd, 0x025c8e89, 0x01621257, 0x0086c3e1, 0x033a3755, 0x03ab59c0, 0x00992aea, 0x0023a1d7}}, Y: Field{[10]uint32{0x03c0bbd8, 0x01ea625c, 0x010c653f, 0x02187b1b, 0x02a5ee66, 0x00c49eb4, 0x020ba101, 0x0066ec13, 0x033d2d2f, 0x00092a89}}}, + {X: Field{[10]uint32{0x02541855, 0x03786e6b, 0x01aee0d2, 0x0110215a, 0x00d622f4, 0x01cb16ee, 0x02f47d81, 0x00e93347, 0x01f30270, 0x002fd474}}, Y: Field{[10]uint32{0x039aa484, 0x0029c433, 0x0030f3c6, 0x00c510cf, 0x005918d9, 0x024d4f61, 0x01e6e409, 0x002b3eef, 0x0352b6c6, 0x0023e078}}}, + {X: Field{[10]uint32{0x0341c26f, 0x02a35320, 0x03aee696, 0x016db372, 0x022ebb11, 0x0020fbd5, 0x032d1415, 0x01a1588a, 0x00620972, 0x001bedad}}, Y: Field{[10]uint32{0x003c9c73, 0x027c182e, 0x02032a89, 0x00c2eb28, 0x01468f25, 0x015e2e91, 0x02923b3e, 0x03367b32, 0x03bff9cf, 0x0027023d}}}, + {X: Field{[10]uint32{0x03617438, 0x0237d8a4, 0x0389d067, 0x01a1acb3, 0x031db56f, 0x03fc117e, 0x026a21fa, 0x03de35f7, 0x02c18b5c, 0x001d560e}}, Y: Field{[10]uint32{0x0369f900, 0x0240d026, 0x0082df67, 0x00526100, 0x02071fe0, 0x0319a725, 0x0237c7d9, 0x011bfc38, 0x022cb085, 0x00209668}}}, + {X: Field{[10]uint32{0x00c0ef92, 0x023fe72d, 0x00f36cdd, 0x038d8404, 0x014aabc2, 0x006ddba5, 0x0051c893, 0x0166b1fb, 0x0133a5d7, 0x00109846}}, Y: Field{[10]uint32{0x01ed4261, 0x00054748, 0x00bf8783, 0x000c3e67, 0x0158cde4, 0x013ae131, 0x038e2bd5, 0x032f3a8d, 0x00ce6b8a, 0x00222991}}}, + {X: Field{[10]uint32{0x02f520d2, 0x00eb78c2, 0x038458a4, 0x025492eb, 0x016dff9c, 0x01c5af71, 0x02e776ca, 0x03e592f6, 0x01bf6128, 0x00090e9b}}, Y: Field{[10]uint32{0x001b7e50, 0x007c6948, 0x0025d609, 0x01368f64, 0x003dda74, 0x024af7ea, 0x0001850e, 0x036d2341, 0x028a5ce4, 0x00098a8b}}}, + {X: Field{[10]uint32{0x00c2ac76, 0x02c4a476, 0x03d58082, 0x00b169da, 0x0046e57e, 0x01f7c56f, 0x01e9307a, 0x031b4810, 0x01751548, 0x00084af4}}, Y: Field{[10]uint32{0x039391bc, 0x032f5dc1, 0x01aaae33, 0x03d1c66a, 0x0257f04e, 0x022c9020, 0x03cc788a, 0x01c9cc99, 0x03c76cc9, 0x00209186}}}, + {X: Field{[10]uint32{0x0161177b, 0x01f05ad3, 0x021fbc1a, 0x011842f5, 0x008ca8a5, 0x022b83b2, 0x00b3e562, 0x01b4aaa8, 0x030b21f9, 0x00369b40}}, Y: Field{[10]uint32{0x023f9fde, 0x02f6f9cb, 0x03d0a1ce, 0x00787aae, 0x012c2aad, 0x02d27b0a, 0x02b85961, 0x000a1d28, 0x02358fab, 0x0016d6f1}}}, + {X: Field{[10]uint32{0x02c1f01f, 0x027d38fd, 0x0010886a, 0x01fb3fa0, 0x004a4313, 0x03ba923f, 0x001e1012, 0x010ec296, 0x02f055a2, 0x003708c2}}, Y: Field{[10]uint32{0x028180ca, 0x03e80f95, 0x018bb950, 0x02ad805c, 0x012eb5a9, 0x00f5ffbb, 0x030120da, 0x011635c0, 0x021be70a, 0x00343e63}}}, + {X: Field{[10]uint32{0x01089df1, 0x01b412ea, 0x00797dc1, 0x01cbc291, 0x00ee9c59, 0x03c8c9a1, 0x00e73b56, 0x031a1a63, 0x023ac815, 0x0020b0b7}}, Y: Field{[10]uint32{0x03b8573d, 0x018b65e4, 0x02432544, 0x0110b07e, 0x010c8598, 0x007f85e3, 0x0253b8ec, 0x033063e8, 0x0065c6c2, 0x0007211c}}}, + {X: Field{[10]uint32{0x020494a3, 0x01d85278, 0x037f6670, 0x0081a901, 0x02cc439f, 0x0002be26, 0x0165dfa2, 0x0245bb86, 0x028874e4, 0x001b28b7}}, Y: Field{[10]uint32{0x02662043, 0x014466a6, 0x02e0699b, 0x0276ba5a, 0x02cd5111, 0x01f71f39, 0x03cc1aa5, 0x02177690, 0x034497aa, 0x001bbc2c}}}, + {X: Field{[10]uint32{0x0051d97f, 0x00ebd4de, 0x031f88d3, 0x029242f4, 0x03cf1149, 0x021003be, 0x02448f82, 0x03ed9481, 0x03c41728, 0x002e89a1}}, Y: Field{[10]uint32{0x02b4c0c4, 0x03c82c61, 0x01de5d61, 0x000090ec, 0x02033455, 0x0318b34c, 0x03803bb3, 0x039eaba2, 0x01f11f2c, 0x0025ab49}}}, + {X: Field{[10]uint32{0x01553e0d, 0x028bc203, 0x01aa5f1e, 0x00cf91a8, 0x03d311f5, 0x02cc0cc8, 0x0032d5a4, 0x03cc0458, 0x00401947, 0x002b0d88}}, Y: Field{[10]uint32{0x00b30a22, 0x01c70fcb, 0x0137fdf1, 0x006dec82, 0x001d5b98, 0x005f6e47, 0x035881fa, 0x00a21169, 0x0395fef3, 0x0014e0e7}}}, + {X: Field{[10]uint32{0x01049e13, 0x01a51d9e, 0x0246bac7, 0x0308b6ee, 0x024158c7, 0x00ecd727, 0x014241ec, 0x01c815a3, 0x00ee5b1b, 0x0019e03b}}, Y: Field{[10]uint32{0x0057d9a8, 0x02fd004c, 0x02e4ee0f, 0x015fb31e, 0x0246520d, 0x0158b9cc, 0x0090b9f3, 0x022234b7, 0x01f031e0, 0x0026b045}}}, + {X: Field{[10]uint32{0x02a63732, 0x0040e434, 0x00254cbb, 0x00eaaca5, 0x01c0f765, 0x02ef4d0e, 0x0110d622, 0x035754c1, 0x0247e7a2, 0x00254dde}}, Y: Field{[10]uint32{0x00195fc0, 0x02f948fe, 0x01d7b091, 0x01a8d992, 0x03bb01f7, 0x0319155e, 0x01abe4df, 0x02d8b3f8, 0x01109daf, 0x0015eb24}}}, + {X: Field{[10]uint32{0x02dd8921, 0x005e85ca, 0x0015e85f, 0x001ccc9d, 0x01486a85, 0x02f50abd, 0x02e97c59, 0x020efc1f, 0x01bf98fd, 0x00013c65}}, Y: Field{[10]uint32{0x011cf3dc, 0x0171ee1a, 0x03b59a86, 0x02f3c7bc, 0x011a057b, 0x01ac72b7, 0x027cae30, 0x008c8d8c, 0x032501c8, 0x00295ab3}}}, + {X: Field{[10]uint32{0x00bcb53f, 0x00a46c53, 0x036bad9e, 0x034b5edb, 0x02cc0510, 0x036eaaf3, 0x0208240a, 0x00a67f48, 0x03d1efe8, 0x003b3347}}, Y: Field{[10]uint32{0x002c667c, 0x020111e9, 0x02b29135, 0x022fff09, 0x012d9b6f, 0x00663806, 0x03d6f2d3, 0x003e9715, 0x03216da5, 0x003b0bfc}}}, + {X: Field{[10]uint32{0x0058f438, 0x0321386c, 0x01f2b1ee, 0x0004307b, 0x01502e76, 0x01f2dd1d, 0x00ff41cf, 0x010971ca, 0x004af2c3, 0x0031d5d1}}, Y: Field{[10]uint32{0x0362e53a, 0x01c0a0d8, 0x014b8fd0, 0x03f1a140, 0x039cd267, 0x0322d995, 0x0301105b, 0x0050f8a5, 0x01b6169f, 0x00387520}}}, + {X: Field{[10]uint32{0x005250b8, 0x006d5f19, 0x00ac636f, 0x0170711c, 0x03aef325, 0x028468d9, 0x01996627, 0x001dd963, 0x037ebff5, 0x000d58a0}}, Y: Field{[10]uint32{0x019234d8, 0x01cb598a, 0x02b9cf4d, 0x00d729fe, 0x00fa1d0d, 0x02f2bf00, 0x01374bb0, 0x0163f333, 0x020d97aa, 0x003373d2}}}, + {X: Field{[10]uint32{0x02d4a3a1, 0x00cc5f21, 0x00a82b11, 0x01f7ed95, 0x03b1f2f0, 0x03eb062d, 0x01339e97, 0x025eaf4b, 0x0245f62e, 0x0033a770}}, Y: Field{[10]uint32{0x00d184d5, 0x0295857c, 0x00b7927b, 0x00c2f9bb, 0x02fcaf1b, 0x030deaf7, 0x03e8520e, 0x03ee3993, 0x0325342a, 0x003db878}}}, + {X: Field{[10]uint32{0x00858a12, 0x0275b8cb, 0x03dd542d, 0x023394e0, 0x02aab481, 0x02807ea2, 0x0271a8c1, 0x0112ea74, 0x033b48ee, 0x002b008b}}, Y: Field{[10]uint32{0x02ca76fa, 0x02e6ea5c, 0x01aaf45d, 0x01f99815, 0x02191e49, 0x00e58477, 0x009e0917, 0x03447c66, 0x03a891f8, 0x00078158}}}, + {X: Field{[10]uint32{0x0251d9f9, 0x026702e9, 0x024ff3a9, 0x020a2332, 0x0355a837, 0x02dbc89d, 0x02e57e6d, 0x033eab91, 0x0282cb12, 0x0034753d}}, Y: Field{[10]uint32{0x01e71a36, 0x016639e1, 0x02960488, 0x0192b2e3, 0x03016072, 0x0059c88c, 0x023b4b07, 0x0064c530, 0x03e5870e, 0x0006c66f}}}, + {X: Field{[10]uint32{0x031c8a37, 0x014c0ebf, 0x012ee243, 0x012cb401, 0x00892e75, 0x026f746a, 0x03bacd4f, 0x02be5117, 0x0171bbdd, 0x001e6588}}, Y: Field{[10]uint32{0x03b98a7d, 0x0056f8de, 0x0320ab85, 0x02a76bc1, 0x00fe47b6, 0x00d304d5, 0x0072f77b, 0x00afad15, 0x03de2a95, 0x002e2b09}}}, + {X: Field{[10]uint32{0x009d3b90, 0x00cb8f14, 0x038d8cf0, 0x02c60e83, 0x0120ecb3, 0x001868bc, 0x03c3573b, 0x02d812ec, 0x03c42390, 0x00111685}}, Y: Field{[10]uint32{0x013f97b1, 0x02b52c5a, 0x026aae34, 0x01079026, 0x024ea769, 0x03bfd259, 0x00057c87, 0x03f97283, 0x00887c07, 0x002dd7d0}}}, + {X: Field{[10]uint32{0x03402051, 0x020ef0c3, 0x02ccfb0e, 0x01244745, 0x038c39cd, 0x0345d5d8, 0x02c49a78, 0x03d1fd7e, 0x01f963a9, 0x001859ad}}, Y: Field{[10]uint32{0x012430b3, 0x005f77fa, 0x01d7e053, 0x03d56811, 0x02933d6d, 0x03b15d24, 0x03e46204, 0x02bac884, 0x02618302, 0x002e8cdd}}}, + {X: Field{[10]uint32{0x03251531, 0x00574fe2, 0x034a9293, 0x036e8d36, 0x0330b6db, 0x012379f8, 0x027d0e40, 0x006bfa39, 0x02742890, 0x0033599b}}, Y: Field{[10]uint32{0x0002304b, 0x0146040e, 0x024f9e54, 0x0147c46c, 0x01440959, 0x027f227b, 0x02398e74, 0x02950390, 0x00b943cb, 0x002bdcb6}}}, + {X: Field{[10]uint32{0x0123ac72, 0x0272eb41, 0x0014ee83, 0x02f35ee2, 0x015a6285, 0x036640d5, 0x01837a11, 0x01bf811b, 0x028cfd2f, 0x00320cef}}, Y: Field{[10]uint32{0x01a6af03, 0x00926132, 0x00ed603a, 0x02fbfa32, 0x02b6c07d, 0x01430ed3, 0x01751531, 0x008d8ea3, 0x010b4411, 0x001faa3e}}}, + {X: Field{[10]uint32{0x025ea477, 0x0000da7c, 0x03613982, 0x013fa109, 0x02e40e4a, 0x03a56c58, 0x010ac1f5, 0x034e1762, 0x03363036, 0x00330617}}, Y: Field{[10]uint32{0x02338236, 0x03bae7c9, 0x02b42832, 0x01d50157, 0x03f66d07, 0x027384bb, 0x02aabe5a, 0x02726262, 0x0036146d, 0x00381da2}}}, + {X: Field{[10]uint32{0x009c4a5a, 0x010f0a63, 0x01770479, 0x0043a4b2, 0x0177ccd9, 0x0101ee02, 0x03c9be70, 0x030aead9, 0x006324bb, 0x00052382}}, Y: Field{[10]uint32{0x02408797, 0x03f8eeb0, 0x036ee55d, 0x00c7edc5, 0x01b706a3, 0x004e3a5f, 0x02733ae6, 0x03f20277, 0x00859cdd, 0x00227a0f}}}, + {X: Field{[10]uint32{0x02c95c76, 0x038048af, 0x03a7e460, 0x012553d4, 0x010cf8b6, 0x00a8dd87, 0x008d9b19, 0x02d60d72, 0x01c1aba5, 0x0026c54e}}, Y: Field{[10]uint32{0x00efdc18, 0x03c8756b, 0x0395b967, 0x010a88c9, 0x00d8472e, 0x02a87389, 0x00895f13, 0x01676b53, 0x021945be, 0x000e4737}}}, + {X: Field{[10]uint32{0x024495cd, 0x02e29cc3, 0x03dd3e93, 0x01d2a5d2, 0x03a60327, 0x03d09f31, 0x029e575f, 0x00074dda, 0x02c175fb, 0x001a28b9}}, Y: Field{[10]uint32{0x00e00752, 0x00f7139e, 0x014f2557, 0x02df89cf, 0x030666ca, 0x03166591, 0x0269b741, 0x0037797c, 0x0084c8c3, 0x00054f99}}}, + {X: Field{[10]uint32{0x01dfb04e, 0x01b08a18, 0x030b66c3, 0x028b9f0b, 0x007669e9, 0x00cf332b, 0x02334405, 0x029030ed, 0x004935a5, 0x00163fa4}}, Y: Field{[10]uint32{0x0136e1bb, 0x03eed815, 0x01555b39, 0x009c569e, 0x0371ac1e, 0x0356669d, 0x0106e2a2, 0x0038b5c7, 0x01c59245, 0x002cda41}}}, + {X: Field{[10]uint32{0x02ac7080, 0x0169e0d7, 0x00378337, 0x029838a6, 0x0103e9bc, 0x026d809f, 0x01aff2a1, 0x0366c2ff, 0x0396dcbd, 0x00208f03}}, Y: Field{[10]uint32{0x02ad0a7f, 0x0334823c, 0x03db8895, 0x02c36410, 0x028831a2, 0x00efcf0d, 0x03eb6d54, 0x026962ea, 0x02ccf34d, 0x00364551}}}, + {X: Field{[10]uint32{0x02d14537, 0x03378800, 0x02caf533, 0x01493df7, 0x03d68121, 0x00c04fb9, 0x03e7b710, 0x03e42157, 0x02aee908, 0x001295ab}}, Y: Field{[10]uint32{0x0222b7a2, 0x02be42b1, 0x00d8d021, 0x03ecb80c, 0x023129a7, 0x01e43ae6, 0x01995b33, 0x00634846, 0x000133b7, 0x001f9832}}}, + {X: Field{[10]uint32{0x01240334, 0x01b28efe, 0x0168a71f, 0x03d27f82, 0x0382a64b, 0x02204c66, 0x0194e2b8, 0x03d7cb11, 0x0055e6c4, 0x001b03ce}}, Y: Field{[10]uint32{0x03b5203c, 0x03f8d348, 0x02fc83ac, 0x0346d355, 0x03e1478a, 0x0016bab4, 0x01ade853, 0x02eea12d, 0x036da9ef, 0x0017239e}}}, + {X: Field{[10]uint32{0x01ac9632, 0x02e8a8cd, 0x033313ae, 0x002d4923, 0x000496e4, 0x005cb992, 0x01de21cf, 0x01241c57, 0x032cd170, 0x003673e3}}, Y: Field{[10]uint32{0x00934344, 0x00e0570f, 0x028e6b07, 0x0242db0f, 0x0315867e, 0x00d755fd, 0x0198299c, 0x03e4c02f, 0x0251b440, 0x0024a9f0}}}, + {X: Field{[10]uint32{0x0193d898, 0x01d9fdee, 0x039e27c6, 0x00a3f3c6, 0x01775927, 0x026bcc0e, 0x027ed43d, 0x0371eebe, 0x00928b91, 0x0012ff2d}}, Y: Field{[10]uint32{0x005d14f7, 0x032a5269, 0x03dda7bf, 0x03a791c0, 0x001854a4, 0x00ea8cee, 0x00c9a4ae, 0x035042cd, 0x02f1ecd9, 0x0009da81}}}, + {X: Field{[10]uint32{0x03c434e8, 0x00066b08, 0x00792944, 0x01d7964a, 0x027cdcc5, 0x0055965b, 0x0193dee8, 0x00cbd13b, 0x0093ac40, 0x002af796}}, Y: Field{[10]uint32{0x0195c40a, 0x012c0360, 0x0116ed77, 0x02c93066, 0x0346162c, 0x033bc0be, 0x002af7a7, 0x018113a5, 0x00092b9e, 0x001780ea}}}, + {X: Field{[10]uint32{0x026e1cc5, 0x00ec3f54, 0x020a803b, 0x02b8c6f8, 0x004482f1, 0x00a07688, 0x00814b49, 0x02a3845e, 0x03077a98, 0x00081758}}, Y: Field{[10]uint32{0x03e4d780, 0x027fd41b, 0x036147a7, 0x03495595, 0x00b9cab7, 0x01b992ff, 0x015cb19d, 0x00d581ae, 0x015c943e, 0x0012ef8a}}}, + {X: Field{[10]uint32{0x001c43bd, 0x02337491, 0x00b7c3b9, 0x02f116fd, 0x01b59653, 0x01b980c7, 0x0228a423, 0x00e871b0, 0x0083e667, 0x0032d313}}, Y: Field{[10]uint32{0x031a2769, 0x013a3ab8, 0x01149cfe, 0x00307fa9, 0x0062f334, 0x016bf9c5, 0x002ff397, 0x01fa83df, 0x02763926, 0x00050b80}}}, + {X: Field{[10]uint32{0x00ca77a7, 0x02ec894b, 0x004f2b5a, 0x02cb7b1f, 0x0392ccf0, 0x024cd5bb, 0x0354a4b4, 0x02f7eceb, 0x00b27ff5, 0x0009687d}}, Y: Field{[10]uint32{0x035c3c38, 0x03fe5ecc, 0x03fe93e9, 0x022ca229, 0x0136c32e, 0x02647cb6, 0x033b3afc, 0x020d05f7, 0x0193153f, 0x0006c977}}}, + {X: Field{[10]uint32{0x0254237b, 0x029dea8a, 0x026dc89c, 0x015255ed, 0x015a1b71, 0x0195f2e2, 0x011c863a, 0x02835a94, 0x02a77eec, 0x00088bdd}}, Y: Field{[10]uint32{0x00b0b289, 0x01680bcb, 0x03492794, 0x0210bda8, 0x01a205c8, 0x019974a5, 0x03a598a8, 0x03e23421, 0x02e064ef, 0x002a3caf}}}, + {X: Field{[10]uint32{0x034dfa8d, 0x032f63ce, 0x002daec3, 0x009a67c7, 0x02379f5c, 0x024dad01, 0x03f10156, 0x01946d06, 0x028d1ad2, 0x000cb50c}}, Y: Field{[10]uint32{0x0188261d, 0x033a4c1e, 0x0290d204, 0x028741a4, 0x02df5de0, 0x0391e025, 0x00d40623, 0x028ced7d, 0x02e23294, 0x0027db79}}}, + {X: Field{[10]uint32{0x01f1d3f0, 0x0195a460, 0x01b14e82, 0x00c33e64, 0x01187d08, 0x01998adf, 0x01937900, 0x0335c0ec, 0x00be6948, 0x00337a7b}}, Y: Field{[10]uint32{0x03029720, 0x03a06c56, 0x015e24bc, 0x03ffe554, 0x01f5abe8, 0x022b55b1, 0x037794ce, 0x00634a6d, 0x03320e12, 0x0021221e}}}, + {X: Field{[10]uint32{0x0348947d, 0x0354f4e9, 0x00b80011, 0x01f89979, 0x02509f4e, 0x0141a801, 0x03435826, 0x03bd32a0, 0x005c3baa, 0x002f227d}}, Y: Field{[10]uint32{0x03e68475, 0x00a7d79b, 0x03a49511, 0x02bdc89a, 0x0209fa15, 0x00d3de6f, 0x0272fce5, 0x02c519e8, 0x00a2714d, 0x003bfd6f}}}, + {X: Field{[10]uint32{0x01b51d4f, 0x003dd237, 0x03df0994, 0x02e6d5fb, 0x0139b409, 0x010d2a6b, 0x014ba655, 0x02eff8af, 0x00c0eea2, 0x001899e3}}, Y: Field{[10]uint32{0x03a74acf, 0x0141470d, 0x00883673, 0x02e79ef3, 0x02a5cc8a, 0x03db7553, 0x0161245e, 0x034c7470, 0x034fd234, 0x00234e13}}}, + {X: Field{[10]uint32{0x02bc93d0, 0x027e4ce1, 0x02f8af21, 0x030d3fa1, 0x02df7c0a, 0x037e89cd, 0x01c89cf3, 0x0388958f, 0x0139c63a, 0x00057807}}, Y: Field{[10]uint32{0x00cfb13b, 0x01d56204, 0x03ef42bc, 0x0267e8c5, 0x01e7efb9, 0x025da618, 0x03251334, 0x032e0705, 0x0132314f, 0x0007d58d}}}, + {X: Field{[10]uint32{0x03ac10e3, 0x03cd92ca, 0x03eb97b8, 0x000c06f6, 0x0052c601, 0x010a2ba7, 0x018e813e, 0x009637fe, 0x03493493, 0x0013e34a}}, Y: Field{[10]uint32{0x0169b73f, 0x02c99380, 0x021bcd66, 0x039085b2, 0x031e8c58, 0x03e467d5, 0x00580283, 0x0176db00, 0x017b6795, 0x00231f44}}}, + {X: Field{[10]uint32{0x016f1d61, 0x02249dad, 0x0136f1a7, 0x02d3d124, 0x003b0d77, 0x0374d623, 0x03e397cd, 0x01ad8260, 0x031a2bf1, 0x00345338}}, Y: Field{[10]uint32{0x013f0910, 0x03cdcd2b, 0x0335611e, 0x031c9613, 0x01833f24, 0x0375eefd, 0x022ca6e4, 0x0360e8dc, 0x0220b227, 0x0026857d}}}, + {X: Field{[10]uint32{0x02f780f1, 0x03a38ed9, 0x008419c3, 0x028b104c, 0x00024c1a, 0x02ffa800, 0x00d656c9, 0x01d7d704, 0x034eb8c2, 0x000d4886}}, Y: Field{[10]uint32{0x03f8e808, 0x0317764e, 0x03fa0f8e, 0x01186d77, 0x0306888d, 0x009de195, 0x038382bb, 0x02bf2ef5, 0x02025274, 0x000f4716}}}, + {X: Field{[10]uint32{0x00a8ddc8, 0x02b02a8d, 0x0043c49e, 0x005dc9c2, 0x0083f686, 0x03d10ec8, 0x00ff6f29, 0x0306e3d1, 0x003b1c76, 0x0020bb67}}, Y: Field{[10]uint32{0x015f1340, 0x0077177a, 0x02fc48a9, 0x0162bbf5, 0x00e81f5a, 0x000009a4, 0x002081d9, 0x00ae19cd, 0x026bc2ab, 0x00098ba7}}}, + {X: Field{[10]uint32{0x00717b85, 0x0078d244, 0x02118d18, 0x012bfd71, 0x009c49b6, 0x010ba5f1, 0x02342f77, 0x02a8dba1, 0x020eacf2, 0x002467a5}}, Y: Field{[10]uint32{0x0145b861, 0x020bf936, 0x016505a0, 0x010b1e08, 0x03ef530d, 0x030ca7c4, 0x01ce9d5a, 0x0059e736, 0x014ea3ea, 0x0012d46a}}}, + {X: Field{[10]uint32{0x03c3ec7d, 0x03f4d996, 0x02c3065f, 0x0386b3c1, 0x02edca3d, 0x0190f398, 0x02abcafa, 0x01546afb, 0x023e20ce, 0x00336b2b}}, Y: Field{[10]uint32{0x02b95bb6, 0x00881c5b, 0x009b13d3, 0x0292cd07, 0x02235df4, 0x02953d3b, 0x00c326df, 0x001dab8a, 0x0313872b, 0x002aab2e}}}, + {X: Field{[10]uint32{0x02a5f2ab, 0x027389a4, 0x015a8f94, 0x03fed98f, 0x00de3a62, 0x001c9bc2, 0x0180f829, 0x017027cf, 0x00e21bd0, 0x00069142}}, Y: Field{[10]uint32{0x00ca97ba, 0x00c83d4b, 0x013e602b, 0x0315b497, 0x00c6e672, 0x02fc0a65, 0x00459bf4, 0x02c0cdd8, 0x03f0976e, 0x00149e03}}}, + {X: Field{[10]uint32{0x003a0b45, 0x005098a0, 0x018ddd52, 0x01dfcea8, 0x02e9129f, 0x03c9b262, 0x00f73d13, 0x03c972a5, 0x02ed5686, 0x002391bb}}, Y: Field{[10]uint32{0x01edcf4d, 0x0326bd87, 0x00200782, 0x0159843a, 0x027253d5, 0x01fc2bad, 0x03f2ed1e, 0x03ba9f21, 0x038d7041, 0x003b95b4}}}, + {X: Field{[10]uint32{0x017e4031, 0x0396ecda, 0x00532a92, 0x0079e828, 0x0168d617, 0x02d8611a, 0x01797c15, 0x02cc276b, 0x00fa3bd6, 0x001e0a44}}, Y: Field{[10]uint32{0x00e4b3f4, 0x0025d4d1, 0x022ddee4, 0x03fdb4fc, 0x00717914, 0x011ac2a0, 0x00c31b89, 0x00a8a3a1, 0x0365c44c, 0x003fc5e0}}}, + {X: Field{[10]uint32{0x01f64e8a, 0x00f246b9, 0x01041ae9, 0x02a3e41a, 0x0265c50a, 0x013c75f4, 0x002d0a29, 0x004329b3, 0x028cc5a7, 0x0000aae7}}, Y: Field{[10]uint32{0x03f89b9b, 0x00ebf269, 0x001c9db2, 0x000a84f6, 0x03185366, 0x0164d251, 0x03cf23da, 0x012eb419, 0x010fa225, 0x0002aaf3}}}, + {X: Field{[10]uint32{0x0382c9e5, 0x006f4758, 0x037a5fcb, 0x03091843, 0x03a094dd, 0x01494a4d, 0x020cc533, 0x016c8a0c, 0x03c44fb2, 0x00341199}}, Y: Field{[10]uint32{0x02b0f74e, 0x0351e52c, 0x00f5ce31, 0x03600c19, 0x026e5a91, 0x02b13ea1, 0x02f436ec, 0x01239e1a, 0x013f8bf0, 0x001f24d8}}}, + {X: Field{[10]uint32{0x0286b0f7, 0x012be0db, 0x01252def, 0x00a724d8, 0x00f157bd, 0x0160e265, 0x01b0476c, 0x03769294, 0x02f9799c, 0x002e711d}}, Y: Field{[10]uint32{0x0297932e, 0x02aad2b2, 0x029eff13, 0x036aa414, 0x03d1a9b0, 0x01a11549, 0x01cefbc4, 0x0122cfc9, 0x019bc779, 0x000bb1d8}}}, + {X: Field{[10]uint32{0x006eee85, 0x036a104a, 0x02e0d64f, 0x03ff7b8a, 0x004ef765, 0x03591ce7, 0x01d8c565, 0x0265012e, 0x01abf13f, 0x00242f7b}}, Y: Field{[10]uint32{0x00cf21f5, 0x00a04138, 0x037255c6, 0x0376e53d, 0x007f8bb8, 0x0061f49b, 0x02812a48, 0x0122ad2f, 0x0082d9a8, 0x002a7d1e}}}, + {X: Field{[10]uint32{0x00485c84, 0x001cdebf, 0x01e7ba68, 0x03377356, 0x03ff4208, 0x013afc3f, 0x02b83107, 0x01dcd300, 0x00a80217, 0x002830e5}}, Y: Field{[10]uint32{0x0109364b, 0x003975c3, 0x02e3fd64, 0x02d8bcd3, 0x00e835ca, 0x026dec59, 0x002434fe, 0x00bcd3f2, 0x0132b4c6, 0x00313c22}}}, + {X: Field{[10]uint32{0x00294c3e, 0x02ad434c, 0x00273b9a, 0x008fafab, 0x02bd3c29, 0x00b9da53, 0x00f949c7, 0x03a318a1, 0x01bd3896, 0x0006c0c6}}, Y: Field{[10]uint32{0x02ee339d, 0x03b54be8, 0x02080053, 0x01c8768c, 0x021401b6, 0x000edec6, 0x038233d7, 0x02ab9f97, 0x029b17c3, 0x000576ff}}}, + {X: Field{[10]uint32{0x03dc719d, 0x00b8f66f, 0x032ab699, 0x00ecea43, 0x001210eb, 0x01463730, 0x03a93540, 0x005afa89, 0x030fe92f, 0x0026453b}}, Y: Field{[10]uint32{0x03c4086b, 0x0370ac6c, 0x02b8398d, 0x00b218cc, 0x005e671d, 0x02bd968c, 0x01f3629f, 0x002c47a3, 0x00650cea, 0x001e82f4}}}, + {X: Field{[10]uint32{0x01f60d3e, 0x03b744f7, 0x03810daa, 0x01b5eb39, 0x015798ad, 0x02572585, 0x02fa1763, 0x03d8e1f6, 0x02195599, 0x000e9a3e}}, Y: Field{[10]uint32{0x00e71a89, 0x025afdf5, 0x0054f5cd, 0x03ba6a2b, 0x00de158e, 0x00190729, 0x00faef1e, 0x01a76ce5, 0x02e6a3f5, 0x001d15d6}}}, + {X: Field{[10]uint32{0x0288b2e5, 0x01a71817, 0x023859da, 0x03b1fc04, 0x0241193d, 0x006fff23, 0x01872b1b, 0x01f8c43c, 0x0141e2b6, 0x002dcd87}}, Y: Field{[10]uint32{0x00668344, 0x0241f860, 0x029c29b0, 0x02f7c42f, 0x00315347, 0x01b9eb34, 0x00f5890f, 0x026f29cf, 0x039566d4, 0x003ea75a}}}, + {X: Field{[10]uint32{0x01174e81, 0x0216e0c9, 0x01bc637b, 0x034c4ba6, 0x02aa93a4, 0x03edffe7, 0x03d13543, 0x011903db, 0x018742d8, 0x000d07a6}}, Y: Field{[10]uint32{0x03fcfc95, 0x00adae62, 0x007ac861, 0x0269bb5d, 0x01e95b4e, 0x018b97f0, 0x01cbcff7, 0x01861d84, 0x00dc91b4, 0x00312582}}}, + {X: Field{[10]uint32{0x0083e6f6, 0x03dd76b1, 0x0026e2a0, 0x02febe1d, 0x001f6420, 0x000b25c6, 0x00849094, 0x03d55d00, 0x0045de34, 0x0020f5a9}}, Y: Field{[10]uint32{0x01dddfc1, 0x030486e8, 0x030fd787, 0x00249df6, 0x00e9fbed, 0x012a5376, 0x01cf48a1, 0x03ed4d7b, 0x034458c8, 0x001ea1b6}}}, + {X: Field{[10]uint32{0x02ac351b, 0x02e12e49, 0x03bdda40, 0x0218bf3f, 0x0032d176, 0x01a92676, 0x0082bf1c, 0x032ba624, 0x035a014b, 0x0013c448}}, Y: Field{[10]uint32{0x014a2acf, 0x018cce7a, 0x022886e9, 0x03b6f967, 0x0308678d, 0x01dce72d, 0x00021c83, 0x009a745a, 0x00f15f31, 0x002d4189}}}, + {X: Field{[10]uint32{0x03ee2b89, 0x03a6a734, 0x0115b998, 0x024b0208, 0x02eafb38, 0x02db8f5f, 0x0285907a, 0x0384b3a9, 0x032721cf, 0x0023eed5}}, Y: Field{[10]uint32{0x02906680, 0x0248e8d9, 0x03ab791c, 0x0296be2f, 0x00ef1bb1, 0x0296d6a9, 0x018de8e2, 0x02386973, 0x0285c814, 0x00369ff9}}}, + {X: Field{[10]uint32{0x0096c3de, 0x00b167d5, 0x02bd63f5, 0x03cbf19c, 0x01286023, 0x00fd6627, 0x0205b1f5, 0x00fd7dd9, 0x023cb924, 0x00201329}}, Y: Field{[10]uint32{0x035233c6, 0x01c2c175, 0x01fd8431, 0x01b52722, 0x00865fab, 0x02bad13e, 0x038300ee, 0x00455a86, 0x0112eedb, 0x00000dca}}}, + {X: Field{[10]uint32{0x012a5365, 0x005da70b, 0x03bf58cc, 0x035c77a6, 0x0060b48e, 0x01598341, 0x018de870, 0x02a091ac, 0x006ab83c, 0x002c9e57}}, Y: Field{[10]uint32{0x0249d820, 0x0024d6ca, 0x0041f90d, 0x015e6f70, 0x01db6841, 0x021aa280, 0x03510441, 0x002dad34, 0x02b58853, 0x0019ba30}}}, + {X: Field{[10]uint32{0x02d9dad3, 0x0317814d, 0x02588208, 0x00ec640e, 0x00caf390, 0x001193ad, 0x0139d07c, 0x03645302, 0x004db61b, 0x0037ad4c}}, Y: Field{[10]uint32{0x015777ca, 0x0281aa53, 0x03b27762, 0x0360fdec, 0x0040507d, 0x039201cf, 0x00b62491, 0x0179d9a9, 0x0343e7e4, 0x00063553}}}, + {X: Field{[10]uint32{0x037714c4, 0x00f3aee6, 0x035cf774, 0x03a15d27, 0x01eb79d5, 0x00cd9a40, 0x0061d696, 0x03b0d2db, 0x0102d177, 0x000446fd}}, Y: Field{[10]uint32{0x016a4e54, 0x030e35da, 0x000f0bf8, 0x0083f99e, 0x0107d8ba, 0x0391e83c, 0x036bad45, 0x02ef33c0, 0x012abc38, 0x002fa035}}}, + {X: Field{[10]uint32{0x00be92a5, 0x006f4e37, 0x00f8b016, 0x01419d34, 0x01daceeb, 0x02e18e19, 0x014e71fd, 0x014e4fa3, 0x0343c15c, 0x00252c43}}, Y: Field{[10]uint32{0x01be6dc7, 0x02e6ddfd, 0x02e9bd25, 0x035fc682, 0x038d087d, 0x004161b3, 0x03f77291, 0x0230d96c, 0x032ea34e, 0x003b156b}}}, + {X: Field{[10]uint32{0x02895593, 0x007c6203, 0x02248d3b, 0x00b44051, 0x03fb4a42, 0x00b4c0da, 0x03e529d6, 0x01de1314, 0x03f22d44, 0x001189ea}}, Y: Field{[10]uint32{0x037b3e4a, 0x018140fa, 0x01c483a5, 0x03d31fa3, 0x00cbea9e, 0x01947a52, 0x00172d56, 0x02d66dce, 0x018d6110, 0x0022cd07}}}, + {X: Field{[10]uint32{0x017c355f, 0x02e91a0a, 0x02a80757, 0x02fb05ca, 0x03585dca, 0x037714c9, 0x035727b5, 0x03730dcd, 0x01cfdfea, 0x00067385}}, Y: Field{[10]uint32{0x01e60f81, 0x0333f613, 0x03a6625c, 0x01f816ce, 0x0283853e, 0x021b3bc9, 0x02ca9ec8, 0x024505cd, 0x015ece82, 0x00014195}}}, + {X: Field{[10]uint32{0x039a3e55, 0x0373f42a, 0x01ef0fe6, 0x00b85b4f, 0x01295068, 0x0387e45b, 0x03e97d80, 0x03f2ba30, 0x02818293, 0x001d6901}}, Y: Field{[10]uint32{0x008c7930, 0x01f45577, 0x01f22a04, 0x002fce7d, 0x03452678, 0x0254a62d, 0x039f2af4, 0x03893604, 0x01c0e02e, 0x0014a4b5}}}, + {X: Field{[10]uint32{0x033bf578, 0x03de6f07, 0x026f1cbb, 0x033a3cc8, 0x0388cb82, 0x03d29ccc, 0x03a341d4, 0x01da1ad1, 0x038def4b, 0x0029fae2}}, Y: Field{[10]uint32{0x018199a1, 0x03f24fef, 0x01cc880c, 0x028a1a19, 0x0124407c, 0x0129c962, 0x0352bf39, 0x015df2ce, 0x036fe238, 0x00217662}}}, + {X: Field{[10]uint32{0x03da647a, 0x024e37ac, 0x02c00e8a, 0x01114385, 0x016c9f83, 0x03067dae, 0x0352d143, 0x00759c2c, 0x02b5dcc9, 0x00296e68}}, Y: Field{[10]uint32{0x039571c1, 0x01cbca1e, 0x00c29634, 0x004ff45b, 0x0126fc4e, 0x009833fc, 0x0335aba1, 0x0011c590, 0x03a83985, 0x003c4b53}}}, + {X: Field{[10]uint32{0x00015cca, 0x00273211, 0x0217157c, 0x00c5e2b5, 0x01df58d8, 0x026c3f7d, 0x037c20ee, 0x02269977, 0x02ed48d5, 0x001e6671}}, Y: Field{[10]uint32{0x018f5756, 0x02dcc750, 0x010145bc, 0x003489d5, 0x00aaacaf, 0x034fc4b2, 0x00b3fecb, 0x030e8715, 0x01053706, 0x00055bd1}}}, + {X: Field{[10]uint32{0x009829b1, 0x02b4de71, 0x028e20fe, 0x0161b70b, 0x01422020, 0x030171eb, 0x01baade6, 0x03b746e1, 0x01f3b708, 0x00223fa0}}, Y: Field{[10]uint32{0x03727c01, 0x035035f7, 0x01b10d99, 0x03376a87, 0x008972a8, 0x0182814b, 0x00341502, 0x01f4aec5, 0x024fb04b, 0x003358b8}}}, + {X: Field{[10]uint32{0x03e86763, 0x015f57d3, 0x0264e895, 0x00dd421e, 0x01912165, 0x01a529df, 0x03192beb, 0x0187f908, 0x02b0cfcc, 0x00063ec3}}, Y: Field{[10]uint32{0x00169785, 0x00a3174e, 0x01922b1f, 0x038d548a, 0x0380f4a6, 0x03b61c75, 0x0288e230, 0x02d594e3, 0x031fdfe8, 0x000f3dca}}}, + {X: Field{[10]uint32{0x03d38aac, 0x006721bb, 0x00b660d9, 0x03ebad7f, 0x02004719, 0x02bc639d, 0x03171d5b, 0x03cb333f, 0x02312be4, 0x0036b6cc}}, Y: Field{[10]uint32{0x018bc0d7, 0x03d2cc3e, 0x039813d9, 0x00c31a9c, 0x0150e0b3, 0x02855112, 0x0340e423, 0x03a2f2c1, 0x005d752d, 0x002359e5}}}, + {X: Field{[10]uint32{0x039e5c8e, 0x015fc1a8, 0x039c2d80, 0x0271b070, 0x027b17e0, 0x038c416e, 0x03aa0cb0, 0x027d91ac, 0x00867cdd, 0x003c2e68}}, Y: Field{[10]uint32{0x02f4e9de, 0x032782d7, 0x01c81370, 0x000f052f, 0x003ff913, 0x020872ef, 0x01cf4319, 0x03460103, 0x025625e6, 0x000ad4d3}}}, + {X: Field{[10]uint32{0x02fcb7e0, 0x03efa2b0, 0x0132d406, 0x0199922e, 0x031cd601, 0x01cba350, 0x010e2536, 0x030e9f97, 0x03052e49, 0x00370382}}, Y: Field{[10]uint32{0x03b791d9, 0x0151f871, 0x01bea086, 0x03ce087f, 0x02223e7a, 0x02487892, 0x0139cb56, 0x01946933, 0x03868e1c, 0x003fe465}}}, + {X: Field{[10]uint32{0x02eb91ee, 0x02a9688c, 0x01038b74, 0x023c4604, 0x016bea74, 0x00571b29, 0x02c365b5, 0x03751cd7, 0x0298fb6d, 0x0039c72b}}, Y: Field{[10]uint32{0x01600266, 0x020af3c7, 0x0106ce66, 0x029ca007, 0x019ed731, 0x036f47d0, 0x03c5bc75, 0x0083db8b, 0x0018396c, 0x002012ba}}}, + {X: Field{[10]uint32{0x00ddfd8c, 0x01e4ad35, 0x03b9f88d, 0x01a081e6, 0x006b5d53, 0x02f4b29b, 0x0194d486, 0x0393fced, 0x01b2f7b2, 0x0014346d}}, Y: Field{[10]uint32{0x015cc744, 0x012f2213, 0x01f5b6e3, 0x039d0083, 0x015c554f, 0x02ae863f, 0x039b03f0, 0x0019821a, 0x00c518fa, 0x00155b3d}}}, + {X: Field{[10]uint32{0x002701aa, 0x00c8746f, 0x01747325, 0x021ad1c2, 0x00966348, 0x008fdb2d, 0x00c5e86f, 0x0365537e, 0x003e2bd5, 0x003021d0}}, Y: Field{[10]uint32{0x03507712, 0x028894a8, 0x00679003, 0x012f8ac0, 0x02258bc1, 0x03b61f81, 0x023a549e, 0x01cc001b, 0x0187d851, 0x00276d12}}}, + {X: Field{[10]uint32{0x016d6894, 0x003d45ef, 0x002b3798, 0x03d47a49, 0x014d45f8, 0x03da28a6, 0x00988fd3, 0x00d08b7a, 0x03f7f384, 0x0037440d}}, Y: Field{[10]uint32{0x01cccce1, 0x030646c9, 0x025f254f, 0x03395ac1, 0x021a9c08, 0x01cc24e9, 0x01ab8b76, 0x02f3762c, 0x01615cfb, 0x0032a39b}}}, + {X: Field{[10]uint32{0x00b5ceb4, 0x02731f4d, 0x01d1473a, 0x0295b026, 0x00424dfd, 0x0063dd93, 0x02840c3d, 0x01626fd2, 0x021967ca, 0x003788a6}}, Y: Field{[10]uint32{0x00122b22, 0x014456d5, 0x00be702d, 0x03046e3a, 0x00a1d352, 0x0391bfd1, 0x023f4b2a, 0x018ea50c, 0x01ca84ca, 0x002563f2}}}, + {X: Field{[10]uint32{0x00cdfd9c, 0x031fb881, 0x01cb1143, 0x03759ea3, 0x02f8a3a3, 0x0028d690, 0x0225f487, 0x0213e858, 0x03c9cc9d, 0x0000578c}}, Y: Field{[10]uint32{0x0260e920, 0x026e6cc1, 0x022562f8, 0x00571fcd, 0x02a59a1e, 0x01792b5a, 0x02058364, 0x033574d8, 0x0206ed48, 0x00104f00}}}, + {X: Field{[10]uint32{0x03d6bee0, 0x03902328, 0x00fc4394, 0x0266deac, 0x00dc010b, 0x02c86b8e, 0x023e3173, 0x01361cb4, 0x0161ca3c, 0x0014d089}}, Y: Field{[10]uint32{0x0103048e, 0x02ecfed8, 0x038b78de, 0x002e9c6e, 0x0020f2c5, 0x01e73872, 0x007c7ab7, 0x02427d94, 0x02e5e505, 0x001bba41}}}, + {X: Field{[10]uint32{0x0282b2fc, 0x00765ca6, 0x02a74a03, 0x0028245d, 0x020308bf, 0x0172dc72, 0x0000bbff, 0x013cdcca, 0x034f9b2c, 0x0020a773}}, Y: Field{[10]uint32{0x038483c4, 0x017dab97, 0x005d3352, 0x03101857, 0x01abe3f8, 0x03d621cf, 0x0249d3c9, 0x014e2938, 0x0200429e, 0x0011cde0}}}, + {X: Field{[10]uint32{0x02e911e5, 0x039970e2, 0x00ebe450, 0x02e8757d, 0x01c05594, 0x033fe5fc, 0x023b989a, 0x02c6c524, 0x02b73769, 0x003b5bdb}}, Y: Field{[10]uint32{0x02c38eb4, 0x01403868, 0x03fbe18e, 0x02768dcb, 0x01d52e2d, 0x027fd886, 0x018cd0b6, 0x02136e2e, 0x032f3fe5, 0x0037fb9b}}}, + {X: Field{[10]uint32{0x00455503, 0x009c8170, 0x013da303, 0x02fb2d24, 0x0370616e, 0x03cac612, 0x00d1982d, 0x01c83a3f, 0x03981fbe, 0x0011f948}}, Y: Field{[10]uint32{0x02f3e900, 0x038bd2ae, 0x012515ea, 0x02e1b118, 0x00179f4c, 0x0378379c, 0x020cfbd1, 0x030c3da0, 0x00ebf360, 0x002bf4b7}}}, + {X: Field{[10]uint32{0x01037312, 0x037812ea, 0x010df49f, 0x02a304f7, 0x00ba10e2, 0x017a2039, 0x03f1170f, 0x0387e1bc, 0x03d58f48, 0x002c0a4d}}, Y: Field{[10]uint32{0x00c18c4f, 0x034f1e8a, 0x03cf5347, 0x0093da32, 0x038a6c79, 0x00d5785f, 0x02de5805, 0x021158c5, 0x024f3e4c, 0x000372c2}}}, + {X: Field{[10]uint32{0x001989f8, 0x015ff43b, 0x025d44ee, 0x03af7f71, 0x03878486, 0x00f019ba, 0x0010c2dc, 0x03070c97, 0x00f53578, 0x0027e64f}}, Y: Field{[10]uint32{0x01c8bb52, 0x00ece18c, 0x0275d914, 0x01bc34e0, 0x01e83eda, 0x03986ebe, 0x026ea432, 0x02047359, 0x000b16b8, 0x0031ae35}}}, + {X: Field{[10]uint32{0x013240e6, 0x03e6e277, 0x0284e599, 0x0213cdbf, 0x01ce4317, 0x037f4743, 0x02730edb, 0x03b077c4, 0x00c25913, 0x00250edb}}, Y: Field{[10]uint32{0x03ed3fd0, 0x01dd2093, 0x0316d09f, 0x03ffead6, 0x029604d3, 0x0153bd56, 0x02d7ca32, 0x03fcff50, 0x02bacac2, 0x00396040}}}, + {X: Field{[10]uint32{0x01acfe0a, 0x02fcbc06, 0x00a6481f, 0x033d1fd6, 0x0059511d, 0x01ed69f2, 0x0043da4f, 0x03e7b146, 0x027e69b3, 0x00026c39}}, Y: Field{[10]uint32{0x01c54dd8, 0x00274c3b, 0x01c674a0, 0x00dbdf92, 0x022e074c, 0x01cccf29, 0x02defc7d, 0x03b2d338, 0x002817a4, 0x001a9377}}}, + {X: Field{[10]uint32{0x00571651, 0x03a19ce9, 0x03acc72a, 0x02d004da, 0x020c8246, 0x012329b9, 0x03b0fd40, 0x03463e30, 0x02339cd8, 0x0025f73b}}, Y: Field{[10]uint32{0x00e693e4, 0x00b4b49d, 0x03d510d8, 0x01192208, 0x0229b952, 0x0224cf71, 0x02e36cfc, 0x02fce62a, 0x0205cc20, 0x001858e8}}}, + {X: Field{[10]uint32{0x02292ced, 0x027fdeb4, 0x00267299, 0x003cadf7, 0x02798c94, 0x01286e80, 0x02a9c26f, 0x007b69f3, 0x02f92696, 0x00287979}}, Y: Field{[10]uint32{0x00d5f19d, 0x0234c6c2, 0x00fbeca1, 0x03e4ee7a, 0x03cfc07a, 0x01b65d95, 0x01384013, 0x003dd3b4, 0x037a6a71, 0x001409d2}}}, + {X: Field{[10]uint32{0x034884a9, 0x0210a596, 0x021a61a9, 0x02c61020, 0x001c21bd, 0x03f1dc60, 0x03c9bdc6, 0x0377f14b, 0x03cf7cdf, 0x0011cf57}}, Y: Field{[10]uint32{0x03d856af, 0x01f16c63, 0x02250eba, 0x03afa2f9, 0x0389ff95, 0x0320b656, 0x032d7036, 0x03d543fa, 0x02a70ad7, 0x000d220d}}}, + {X: Field{[10]uint32{0x0396f613, 0x0147a851, 0x009d454c, 0x004caec5, 0x00db8c1e, 0x00151326, 0x00c33b27, 0x02cb413f, 0x00427384, 0x0027061d}}, Y: Field{[10]uint32{0x00ae0a19, 0x00fdfd7f, 0x0342b791, 0x00d831c4, 0x02c1825d, 0x02573bee, 0x0212e475, 0x0001e4f6, 0x0043970f, 0x000b5b7b}}}, + {X: Field{[10]uint32{0x0162b154, 0x029aa981, 0x0351e0c7, 0x00a57d6f, 0x02ed63c7, 0x039d0392, 0x002d826b, 0x038afedd, 0x00469150, 0x00047387}}, Y: Field{[10]uint32{0x034fa33d, 0x02da9887, 0x00271aa3, 0x0232bca9, 0x0267f3b2, 0x03a2df64, 0x01f8b93b, 0x00a03eaf, 0x014fea38, 0x001ba194}}}, + {X: Field{[10]uint32{0x01656042, 0x0297159e, 0x031cd4d9, 0x01c52eb3, 0x03dde2fd, 0x0234731b, 0x013c3541, 0x0379bca2, 0x0104e4e2, 0x000780de}}, Y: Field{[10]uint32{0x00960755, 0x03a06963, 0x0221b462, 0x0214f007, 0x023c81ac, 0x002bc0d7, 0x028aa38a, 0x01a084a8, 0x01c934c2, 0x0006edd6}}}, + {X: Field{[10]uint32{0x00071d82, 0x007669f0, 0x02800995, 0x0178c731, 0x003f8d50, 0x03e78d88, 0x0294f240, 0x0266abc6, 0x006723f8, 0x0014bf25}}, Y: Field{[10]uint32{0x00bd6dbb, 0x0065a5f4, 0x039db924, 0x02cd2ce8, 0x0239c909, 0x01c2d1ee, 0x00dfb992, 0x00208083, 0x02e07543, 0x000118ca}}}, + {X: Field{[10]uint32{0x0242b20d, 0x027600c1, 0x02a4ff9e, 0x02d35e37, 0x0235069e, 0x025bd4e1, 0x00f9e394, 0x00672c85, 0x01059975, 0x0032d616}}, Y: Field{[10]uint32{0x0093ac7d, 0x038e44fb, 0x02d45064, 0x03cd6643, 0x007131b2, 0x038b5794, 0x02a0f51c, 0x01d68790, 0x02e7a5b4, 0x0006e7d0}}}, + {X: Field{[10]uint32{0x00a69c46, 0x02b803ed, 0x03a12cec, 0x00368471, 0x03e7ab18, 0x034def34, 0x03275845, 0x011561d5, 0x005729f1, 0x000e0b0a}}, Y: Field{[10]uint32{0x00039440, 0x03079f95, 0x008e4a25, 0x028f82c9, 0x03495907, 0x03c4a1a4, 0x02586843, 0x003ecdb8, 0x011220a7, 0x0032c9fa}}}, + {X: Field{[10]uint32{0x034e5024, 0x03b2e213, 0x0164b6dc, 0x00fecbe5, 0x02a4dd61, 0x02cce9a4, 0x00456dce, 0x0039263e, 0x02c6c285, 0x0005bc21}}, Y: Field{[10]uint32{0x039339a9, 0x03bbfb49, 0x01df312d, 0x033b26b5, 0x0073cb5e, 0x0169940d, 0x008ca682, 0x004620d1, 0x020888eb, 0x000b854a}}}, + {X: Field{[10]uint32{0x01a02492, 0x03585dd9, 0x009506ee, 0x007d99cc, 0x014439a5, 0x011ba89d, 0x030f0ae4, 0x00d5dd54, 0x011b1f0a, 0x001d626f}}, Y: Field{[10]uint32{0x00462d49, 0x0365d966, 0x0389c00a, 0x030d8c30, 0x0004076f, 0x00534d8d, 0x01771bb0, 0x02054c79, 0x0212d375, 0x000b6103}}}, + {X: Field{[10]uint32{0x00930890, 0x00c9bd35, 0x004469a0, 0x03d689ad, 0x01a80cc5, 0x030efbba, 0x02dbd2b0, 0x00e944f7, 0x0240cce6, 0x00062e6b}}, Y: Field{[10]uint32{0x022690e4, 0x0293ae4a, 0x0118acf6, 0x035e382b, 0x039e0032, 0x02c9c342, 0x03571382, 0x00f111c6, 0x024dd5ed, 0x00092e1a}}}, + {X: Field{[10]uint32{0x03ebb48a, 0x03a2a2b4, 0x009a4ccf, 0x01b840b2, 0x0394e9ba, 0x012fa189, 0x030db5d1, 0x007bd900, 0x00a4acc7, 0x002307dd}}, Y: Field{[10]uint32{0x0245677a, 0x02c59ce4, 0x01c9416e, 0x00664b57, 0x021af1c1, 0x022c9b21, 0x03ba735c, 0x0294a478, 0x011998ae, 0x0029e7c0}}}, + {X: Field{[10]uint32{0x02bfb080, 0x00b080f0, 0x010465cd, 0x00223b1f, 0x002c0fca, 0x000e096d, 0x0157ba0d, 0x02aadd6d, 0x012d36bf, 0x00236016}}, Y: Field{[10]uint32{0x0151d3f6, 0x02d19bc0, 0x03a51859, 0x01504335, 0x027671a6, 0x014cff4a, 0x00a1bd4a, 0x01d14d34, 0x008791f2, 0x000f91e5}}}, + {X: Field{[10]uint32{0x030ca248, 0x0095d959, 0x02770f71, 0x03a78114, 0x03f36782, 0x00b159dd, 0x005046cf, 0x038563b2, 0x0319f477, 0x003aac2e}}, Y: Field{[10]uint32{0x00c04640, 0x01d3329f, 0x01ebd700, 0x0190fc62, 0x0337f0bd, 0x00ae81c7, 0x0355e563, 0x00ebd36b, 0x00812309, 0x00289f5c}}}, + {X: Field{[10]uint32{0x020a039c, 0x00cb1a8a, 0x0399bdb5, 0x00776d21, 0x0109647e, 0x0149833a, 0x03b249fd, 0x00be89b4, 0x01c9ebbb, 0x003fc343}}, Y: Field{[10]uint32{0x02b31fa9, 0x00e50bbe, 0x010233c4, 0x03d59884, 0x02fad5b0, 0x0366dd82, 0x01c35055, 0x007e2f38, 0x02ae7f16, 0x0004ac3d}}}, + {X: Field{[10]uint32{0x0037d526, 0x00aaa58e, 0x030ad42a, 0x0080fb9a, 0x02be22b3, 0x02c22def, 0x03403468, 0x02f46e48, 0x023571db, 0x0036268c}}, Y: Field{[10]uint32{0x02e3cf27, 0x02dd084d, 0x03b62146, 0x0241551b, 0x03db4a04, 0x039bdbc7, 0x008124d9, 0x03c59cc4, 0x01b99988, 0x0009768d}}}, + {X: Field{[10]uint32{0x025b43fd, 0x013004a4, 0x00a229ec, 0x0055574d, 0x0313ffb3, 0x019d47df, 0x03cdafa8, 0x02acb10c, 0x023bf01c, 0x003c5400}}, Y: Field{[10]uint32{0x02c7a9cc, 0x030f4cce, 0x03f341a9, 0x01a881ca, 0x038ac37a, 0x01ea7920, 0x00966b71, 0x032259b7, 0x0221026a, 0x000c7dc3}}}, + {X: Field{[10]uint32{0x003af2a8, 0x03b80672, 0x0070d9b3, 0x032382d1, 0x0276f442, 0x030b3436, 0x02e9d5e2, 0x0025e1ca, 0x013b2d58, 0x003663af}}, Y: Field{[10]uint32{0x01dba3f5, 0x005f249d, 0x00823e00, 0x01629453, 0x00930fb3, 0x029b1c89, 0x03f9873d, 0x0065c0d2, 0x02a95a06, 0x0027b56d}}}, + {X: Field{[10]uint32{0x03c3c746, 0x03ec06f2, 0x01827583, 0x00efe9df, 0x02817353, 0x03cf2a05, 0x002e313d, 0x0253bb7f, 0x0185833a, 0x00156d8b}}, Y: Field{[10]uint32{0x024a835c, 0x02b4444d, 0x0189715b, 0x02fd1320, 0x011f4dbb, 0x0269e84e, 0x01eb9211, 0x016bdede, 0x03730cb9, 0x0027e121}}}, + {X: Field{[10]uint32{0x01718de6, 0x003fb3ef, 0x021ca286, 0x01268a9e, 0x00ec759c, 0x01b070ff, 0x0069de8f, 0x00fe4d13, 0x0176fef7, 0x0037ebd3}}, Y: Field{[10]uint32{0x025a0671, 0x034c509c, 0x01971357, 0x0054656f, 0x017fba1f, 0x00db64fb, 0x0009f94c, 0x030a1fd9, 0x029344e2, 0x002b12bd}}}, + {X: Field{[10]uint32{0x01fe29da, 0x01fcf9b1, 0x00bf838b, 0x00f16043, 0x03a7839f, 0x005bb88a, 0x0020f29a, 0x0248b0dd, 0x00a34510, 0x00212911}}, Y: Field{[10]uint32{0x0114f06a, 0x02615404, 0x0175fa18, 0x01c032fe, 0x026e89af, 0x01cc1a7f, 0x03f420a6, 0x0304b850, 0x01802215, 0x003bdccf}}}, + {X: Field{[10]uint32{0x032212af, 0x006a94e9, 0x02548629, 0x01260e24, 0x032c3377, 0x025a0468, 0x01d24d12, 0x01c020f7, 0x021146c8, 0x0035f213}}, Y: Field{[10]uint32{0x00844ac4, 0x03350184, 0x01745f84, 0x0344135e, 0x019579b2, 0x0202bb18, 0x01357e54, 0x0102f70f, 0x0158a3be, 0x002c61f7}}}, + {X: Field{[10]uint32{0x0198051d, 0x03a9e215, 0x02a069ff, 0x02d5c68b, 0x00c7fca4, 0x01d41cb3, 0x029f6165, 0x0022fbce, 0x027fa70b, 0x003f7b70}}, Y: Field{[10]uint32{0x03b9bf9a, 0x0118a901, 0x01fbb3ec, 0x01379c91, 0x0253f6f5, 0x029fd378, 0x014d279b, 0x016a780d, 0x031a1c57, 0x003fa6de}}}, + {X: Field{[10]uint32{0x03122e77, 0x0171e57b, 0x039a5c2d, 0x0141365a, 0x03f950c2, 0x01610dec, 0x0022b350, 0x0331aa48, 0x038ad3f2, 0x0033e9d1}}, Y: Field{[10]uint32{0x021409c4, 0x02516c89, 0x023bb158, 0x0028f6a1, 0x022ad780, 0x03f7530b, 0x00f8eedf, 0x00a0d4d5, 0x01cae959, 0x003cf923}}}, + {X: Field{[10]uint32{0x020eefe2, 0x01f73a3b, 0x023f8033, 0x02f36377, 0x02aa1584, 0x01d9e3f3, 0x03b7493d, 0x00825dc3, 0x03f83fd6, 0x0023a455}}, Y: Field{[10]uint32{0x0205351b, 0x027ce94e, 0x0188ac8d, 0x016913ea, 0x003322fb, 0x02d2c8a7, 0x00f91df4, 0x037edae9, 0x02898c05, 0x00181e6e}}}, + {X: Field{[10]uint32{0x03116f75, 0x022e4a00, 0x01dfdbea, 0x03f1a9fe, 0x029d422f, 0x02f77fc8, 0x00eb80a9, 0x02b0c3b1, 0x03b6103e, 0x001efd7b}}, Y: Field{[10]uint32{0x03a71a3b, 0x00e24c4e, 0x03e67ba1, 0x0130d54f, 0x012cba4b, 0x015e5850, 0x01355542, 0x007b7f96, 0x02596479, 0x003beb6d}}}, + {X: Field{[10]uint32{0x00e8df0b, 0x009e0834, 0x0153e85f, 0x03f22747, 0x01690a13, 0x01da5c1e, 0x007b1b53, 0x030b49a3, 0x02b7b7b2, 0x003d6e80}}, Y: Field{[10]uint32{0x02465485, 0x03c54567, 0x013a3af7, 0x01930f1e, 0x00a9266b, 0x034b510c, 0x00329d19, 0x003906ff, 0x0126b264, 0x00198c5b}}}, + {X: Field{[10]uint32{0x03004475, 0x01262fff, 0x008284a1, 0x0297c494, 0x0387c10d, 0x008a547e, 0x02bc3dbf, 0x029325b4, 0x01f3dcec, 0x0017aab3}}, Y: Field{[10]uint32{0x011f122d, 0x0094652b, 0x02106c8c, 0x00425dfa, 0x00b38f58, 0x020c7341, 0x0185d404, 0x0338245a, 0x03ed9721, 0x0032cf6c}}}, + {X: Field{[10]uint32{0x024a5554, 0x0169da29, 0x01e4177c, 0x02fd3e8b, 0x01d1320a, 0x03544cdc, 0x0152ba6a, 0x0044d14d, 0x0017b8d6, 0x00073f97}}, Y: Field{[10]uint32{0x011dcd5d, 0x03a91aff, 0x008945ed, 0x039801e8, 0x0099bcab, 0x00c67dd0, 0x024a2f7e, 0x02e21c79, 0x00f64846, 0x0014e0df}}}, + {X: Field{[10]uint32{0x025dbc10, 0x007c28de, 0x028805e2, 0x02ed1391, 0x02286f47, 0x004843ef, 0x0091dd2a, 0x03321873, 0x03478a2c, 0x0024aa0f}}, Y: Field{[10]uint32{0x0199de94, 0x03d53d72, 0x01043684, 0x03e43b0d, 0x000cb69f, 0x006604cb, 0x0270b8bc, 0x016c0be0, 0x0065fcd4, 0x003fb8d7}}}, + {X: Field{[10]uint32{0x02d277d3, 0x012ada72, 0x01dd14f7, 0x034c92fd, 0x0173c07a, 0x00d6f6de, 0x0186ea10, 0x00e6c3d3, 0x01bad5d5, 0x0005c8a1}}, Y: Field{[10]uint32{0x02ada654, 0x0308be6a, 0x00897314, 0x0100a22d, 0x02cfc290, 0x03b8f883, 0x03afa15c, 0x018d9382, 0x0140cf35, 0x00116afe}}}, + {X: Field{[10]uint32{0x03164762, 0x01badcf2, 0x0032c764, 0x0204e817, 0x013126ce, 0x03e45637, 0x014ae08b, 0x026eae15, 0x015392e1, 0x002b45ef}}, Y: Field{[10]uint32{0x01065586, 0x0115d323, 0x01b94e16, 0x014625be, 0x038139c6, 0x0275c353, 0x01d4f47d, 0x00e61ddd, 0x00191c83, 0x000284a6}}}, + {X: Field{[10]uint32{0x02bdeb1c, 0x01f2cc4b, 0x00a12526, 0x001f1019, 0x03c23fd3, 0x00f94470, 0x02ce9e91, 0x02a2707d, 0x033e91a4, 0x00041086}}, Y: Field{[10]uint32{0x02a53319, 0x0164a18e, 0x03cc1923, 0x00036b1d, 0x03985697, 0x01cc4632, 0x02b8a510, 0x03c3f461, 0x01d09e49, 0x0014e6ed}}}, + {X: Field{[10]uint32{0x01de5bfd, 0x00d6c188, 0x030ff397, 0x03787838, 0x012e8476, 0x0198caa9, 0x039eba60, 0x00a8f772, 0x00fa7815, 0x00310eb7}}, Y: Field{[10]uint32{0x00abdebf, 0x00469567, 0x018801a9, 0x0389815f, 0x031e81c6, 0x036b2ede, 0x03d04f05, 0x01602e11, 0x01ca2122, 0x001b7742}}}, + {X: Field{[10]uint32{0x00bf9a73, 0x036401a6, 0x0227b5c8, 0x00764aab, 0x0014434f, 0x0279f662, 0x02b9e50d, 0x01634131, 0x00cb603a, 0x003dea67}}, Y: Field{[10]uint32{0x031a7ccb, 0x00e9df69, 0x01b0878a, 0x01332bf2, 0x005e6293, 0x032dd04c, 0x02d68091, 0x00e4eba5, 0x024476f4, 0x003337f0}}}, + {X: Field{[10]uint32{0x0209c826, 0x01d6f9c3, 0x01aacb31, 0x005a7492, 0x02f602d5, 0x028b2a6f, 0x038f44f4, 0x013a8d40, 0x01bf7017, 0x0026af25}}, Y: Field{[10]uint32{0x03adfe0c, 0x00663835, 0x03763617, 0x036d32ad, 0x0222a9fe, 0x0233b6b2, 0x027d2c9f, 0x03e28f50, 0x02ed3e71, 0x001b3ef3}}}, + {X: Field{[10]uint32{0x005d8d82, 0x02ee7b57, 0x035c5546, 0x03f03414, 0x03d7bd08, 0x0124f273, 0x034af06b, 0x0121cfb2, 0x009335c8, 0x00229f2a}}, Y: Field{[10]uint32{0x01e31bc1, 0x000064c8, 0x005ba07b, 0x03fb4bca, 0x01209ae3, 0x010511e6, 0x031ee4e5, 0x00f021cb, 0x0372090d, 0x0009462c}}}, + {X: Field{[10]uint32{0x024d1c3e, 0x032489e9, 0x03b79ff1, 0x0373091b, 0x02b39fdb, 0x018be352, 0x01182fd8, 0x018a365a, 0x03798649, 0x001c3238}}, Y: Field{[10]uint32{0x02ea3cbb, 0x0038c849, 0x0386f7f5, 0x005d3bf6, 0x03936c95, 0x03558823, 0x0297d9ef, 0x00292bb0, 0x02d527ec, 0x0031e4c6}}}, + {X: Field{[10]uint32{0x01002121, 0x00b58a0c, 0x0076b957, 0x039f0616, 0x00934a82, 0x012023f7, 0x01dcf61b, 0x007b81c7, 0x02b40612, 0x0035e0fd}}, Y: Field{[10]uint32{0x029c7fbb, 0x007662d7, 0x0262ca03, 0x0055a52e, 0x0028b3ed, 0x02699226, 0x0107c82b, 0x01a52678, 0x01841422, 0x002aa4af}}}, + {X: Field{[10]uint32{0x03654c18, 0x01f939de, 0x007581a1, 0x025671de, 0x02b75927, 0x03aa3931, 0x01ffbb87, 0x02d0eb2b, 0x021c29ab, 0x00307c1a}}, Y: Field{[10]uint32{0x03ecdbf0, 0x006497be, 0x005476cd, 0x01c2a906, 0x03bc1024, 0x03968263, 0x01b0e7d9, 0x010b3eae, 0x01e2f1db, 0x00076b83}}}, + {X: Field{[10]uint32{0x02cc5105, 0x01f98b94, 0x0072487b, 0x009d21a6, 0x02d1498a, 0x0085c998, 0x02633ea3, 0x02d61e19, 0x02113205, 0x000ab5d3}}, Y: Field{[10]uint32{0x00ff779e, 0x01176834, 0x02e105de, 0x01652e2f, 0x02b5c851, 0x01d5720e, 0x01aa7d30, 0x0287f589, 0x0107de1f, 0x0031c31d}}}, + {X: Field{[10]uint32{0x037408b6, 0x00025e35, 0x01ac03d8, 0x015dd2b2, 0x03a9e32b, 0x01c713d5, 0x0374e233, 0x01a919ba, 0x01ad7224, 0x003d243a}}, Y: Field{[10]uint32{0x01dc3d6a, 0x003c06aa, 0x01fb963a, 0x006a2d12, 0x0377e49a, 0x03096141, 0x02ef15e4, 0x005a1ee9, 0x027f8fdd, 0x00151bcd}}}, + {X: Field{[10]uint32{0x001d6149, 0x008cdce6, 0x030553f1, 0x03143781, 0x0280c431, 0x017e2ecc, 0x01788b05, 0x02da5f81, 0x00918357, 0x0008140a}}, Y: Field{[10]uint32{0x028e3b0d, 0x01aaf411, 0x02777796, 0x016d71de, 0x019489ee, 0x0214bf42, 0x01a67712, 0x00388963, 0x00e54411, 0x000e7410}}}, + {X: Field{[10]uint32{0x006eae95, 0x0007acbe, 0x005d1bb0, 0x026780e3, 0x02e4b782, 0x0137a4a5, 0x0359915d, 0x028e8fbb, 0x038ec169, 0x001ba46e}}, Y: Field{[10]uint32{0x00877dfd, 0x0252e8a0, 0x008872ae, 0x03574823, 0x0045305d, 0x0227eb12, 0x0034063a, 0x0327c459, 0x029788f8, 0x0034b084}}}, + {X: Field{[10]uint32{0x03a34905, 0x01e2ec5a, 0x02a01906, 0x02ea79f7, 0x0339e7d0, 0x00796b54, 0x00d0d2fe, 0x0102c184, 0x03c839fc, 0x0033ca51}}, Y: Field{[10]uint32{0x0337c63d, 0x00502c8f, 0x007baaec, 0x01a84c7b, 0x018db00f, 0x01cba1d7, 0x0358d7b1, 0x0354fc35, 0x030f7f0c, 0x00185169}}}, + {X: Field{[10]uint32{0x022366f1, 0x01861d3e, 0x02864ad1, 0x0306b0f1, 0x001c8db1, 0x02b4ca8a, 0x01c9b010, 0x029b2158, 0x0387ea93, 0x002d23e0}}, Y: Field{[10]uint32{0x022d253c, 0x00c5749e, 0x0276b375, 0x02077e10, 0x009f46bd, 0x018273f2, 0x03d971b3, 0x01f4f89b, 0x0333cbe0, 0x0000b2ac}}}, + {X: Field{[10]uint32{0x02a1f827, 0x007b6850, 0x0315ef39, 0x013a0515, 0x0030f605, 0x025bf50f, 0x00ae58c6, 0x00b4d393, 0x03660c57, 0x001f12d7}}, Y: Field{[10]uint32{0x01843d97, 0x034cab66, 0x033b008e, 0x02b57e53, 0x02d0adc2, 0x01848cb0, 0x007c5fcc, 0x016bc0e4, 0x024fbe12, 0x000f2f89}}}, + {X: Field{[10]uint32{0x010d86e8, 0x02a17821, 0x02567378, 0x0147d756, 0x018fe24e, 0x01e1d636, 0x027f9890, 0x02786588, 0x0368d464, 0x00395e58}}, Y: Field{[10]uint32{0x02c9d4a7, 0x030d53bd, 0x0089646e, 0x02e35982, 0x021fa111, 0x01e9f92f, 0x02880bf6, 0x0244a26b, 0x0343c9a6, 0x0001d2ec}}}, + {X: Field{[10]uint32{0x004d637f, 0x00ae963f, 0x016509f0, 0x00994f1f, 0x0167c1ab, 0x038f2976, 0x01b88416, 0x03a7bf06, 0x025efe83, 0x0037e841}}, Y: Field{[10]uint32{0x00a5042d, 0x020fbb43, 0x00a231ec, 0x00668aa8, 0x02e23fdf, 0x021794d4, 0x0270e046, 0x00dee8bc, 0x0167eb02, 0x00008b49}}}, + {X: Field{[10]uint32{0x028af132, 0x01ecdea4, 0x01f2f234, 0x01133c4c, 0x008f4638, 0x039c42e0, 0x01a3ce98, 0x030cca3f, 0x00aad436, 0x000ba876}}, Y: Field{[10]uint32{0x0298dc4c, 0x0187cc43, 0x004328fc, 0x0081e80d, 0x0213ff96, 0x033ca92c, 0x00a243cc, 0x02b44160, 0x020fb8c2, 0x000cfe9f}}}, + {X: Field{[10]uint32{0x0167253f, 0x01477975, 0x031b4c0a, 0x01b3e2a4, 0x03ab6a97, 0x039677cd, 0x008298b5, 0x02bcfe9e, 0x00518122, 0x0004ab85}}, Y: Field{[10]uint32{0x0124877d, 0x034c6807, 0x015a7926, 0x02bad555, 0x021c3ff9, 0x038fc296, 0x02fa7329, 0x0074bb78, 0x01d2b327, 0x00217fc7}}}, + {X: Field{[10]uint32{0x01bf6619, 0x01164c25, 0x00270856, 0x03bd57be, 0x03125579, 0x03b1d68e, 0x02b84fed, 0x02bc6a9c, 0x01efb588, 0x003f51b8}}, Y: Field{[10]uint32{0x03a51b17, 0x01f2dec9, 0x01ea40f5, 0x01eba071, 0x03342e6b, 0x01ce8abf, 0x007d477c, 0x00a4bd83, 0x006eceb6, 0x00341ab7}}}, + {X: Field{[10]uint32{0x0332b52b, 0x024342df, 0x01e614a2, 0x011ac5cb, 0x01c7a179, 0x02f88ab3, 0x009e1bf0, 0x0347bc71, 0x013eb8c0, 0x0003b5f6}}, Y: Field{[10]uint32{0x02303ada, 0x0233a7ec, 0x02246f36, 0x02129a33, 0x02b55522, 0x010aafac, 0x036668a7, 0x0070ebe3, 0x030a39a8, 0x001343b0}}}, + {X: Field{[10]uint32{0x029619ef, 0x0022db43, 0x034dc9d8, 0x004cd893, 0x01585179, 0x01d701b7, 0x02bda814, 0x01e69a7f, 0x03a5cd0e, 0x003f33f7}}, Y: Field{[10]uint32{0x010adf49, 0x009106b7, 0x015139bd, 0x012b5838, 0x02ec6232, 0x024aa58d, 0x01959c69, 0x026fb7e2, 0x000d11d0, 0x001e6e41}}}, + {X: Field{[10]uint32{0x034ac477, 0x02955912, 0x00010a57, 0x029c8ad1, 0x0316823e, 0x02f1c532, 0x02044b27, 0x026bfb4a, 0x02b86a9b, 0x0020c5d8}}, Y: Field{[10]uint32{0x0156c708, 0x005a7926, 0x02ff69c3, 0x0372989a, 0x032754c1, 0x02137f5d, 0x00b3f77f, 0x02ff72d2, 0x00628ef3, 0x00051eb8}}}, + {X: Field{[10]uint32{0x02f26b01, 0x00ee6753, 0x02fb3490, 0x0187c995, 0x01f92cc4, 0x03f8333e, 0x0370adbb, 0x014c0f23, 0x0001a84d, 0x000cd123}}, Y: Field{[10]uint32{0x03b8f2ff, 0x03a9507f, 0x0095f736, 0x00f1bf5f, 0x02208ad0, 0x03b9fe41, 0x00a82840, 0x02e98723, 0x03490ae8, 0x00395c9c}}}, + {X: Field{[10]uint32{0x03d215a6, 0x01533081, 0x024a2482, 0x036ac66c, 0x0160df85, 0x003aebdb, 0x03ccb8c5, 0x004c1055, 0x02616ddf, 0x00248284}}, Y: Field{[10]uint32{0x028d0f4e, 0x028f283c, 0x02e369f1, 0x00738313, 0x03e2cb67, 0x02a302e5, 0x02f7a11c, 0x03a240f4, 0x00f9cc91, 0x00067935}}}, + {X: Field{[10]uint32{0x036b1ba4, 0x03f98b94, 0x026b7fca, 0x029712e4, 0x01458385, 0x02eb0971, 0x020ac00c, 0x002e70fd, 0x021d3e37, 0x00077e33}}, Y: Field{[10]uint32{0x0099a92b, 0x039f9814, 0x01083533, 0x03d6f1c0, 0x023fcbab, 0x01ca4253, 0x02f61602, 0x0141e54a, 0x006ee363, 0x000d137d}}}, + {X: Field{[10]uint32{0x038b7b72, 0x02ca2074, 0x013b6286, 0x03236036, 0x022e2243, 0x00de8149, 0x0018175c, 0x009ae04f, 0x007dabfe, 0x001c89e1}}, Y: Field{[10]uint32{0x03973d24, 0x02622e29, 0x03364622, 0x0104311a, 0x0128b5aa, 0x0185973e, 0x0289c934, 0x00f37654, 0x01eb33da, 0x002fb79e}}}, + {X: Field{[10]uint32{0x03f7fb8d, 0x027ca4bb, 0x01995972, 0x013c9b63, 0x003caff7, 0x03321041, 0x02571f8c, 0x022feac0, 0x0259e121, 0x001b7bee}}, Y: Field{[10]uint32{0x00340a04, 0x025aa353, 0x001a6956, 0x00156487, 0x002c188c, 0x034d39df, 0x03770d1b, 0x03ef165b, 0x028e21f2, 0x00135eea}}}, + {X: Field{[10]uint32{0x002d6bd3, 0x00581478, 0x020f990b, 0x006ad8c6, 0x0208302e, 0x02b7d4ef, 0x031ae022, 0x01f491ac, 0x00eff512, 0x003199fd}}, Y: Field{[10]uint32{0x02d34cf5, 0x00312936, 0x032373e8, 0x00f549eb, 0x02f8de28, 0x01f5d1a8, 0x00d822c3, 0x02f7dbf5, 0x0276ce11, 0x000f5ef3}}}, + {X: Field{[10]uint32{0x0229d866, 0x00b1cbf3, 0x03d2355c, 0x02e39aec, 0x006fbca1, 0x00e8aac0, 0x00dcc242, 0x0083d664, 0x02744416, 0x003b67a1}}, Y: Field{[10]uint32{0x0006ad30, 0x01f08a96, 0x021a5829, 0x01c47b0d, 0x027c03dd, 0x0024c37b, 0x01a12f33, 0x0268aee0, 0x019bb428, 0x0019357b}}}, + {X: Field{[10]uint32{0x0176fb24, 0x03ae630c, 0x02ea0b0e, 0x03bab114, 0x03219e57, 0x018d13bc, 0x0000b256, 0x033b80cf, 0x0057e6b0, 0x0021a8db}}, Y: Field{[10]uint32{0x02fff739, 0x03a36cfa, 0x02f25135, 0x00f9e686, 0x01b147b4, 0x02564ad7, 0x01038748, 0x01637d38, 0x01da9e9b, 0x002d3d2f}}}, + {X: Field{[10]uint32{0x00cca913, 0x0248a02f, 0x00e04337, 0x0208779c, 0x01fd02bf, 0x0285478f, 0x02105acb, 0x01bfce83, 0x03844539, 0x000b88dd}}, Y: Field{[10]uint32{0x03148551, 0x01c5b0d9, 0x0304fc0b, 0x03728cd8, 0x00f43726, 0x02ef3241, 0x00464c43, 0x020fc184, 0x039ce779, 0x003dcd94}}}, + {X: Field{[10]uint32{0x00a1390f, 0x027e6008, 0x028c1689, 0x021eb0b5, 0x009db88a, 0x00682f00, 0x026dbcf1, 0x0364d948, 0x014c7790, 0x003334f0}}, Y: Field{[10]uint32{0x003af907, 0x037f75c7, 0x00a6781c, 0x02a01f7c, 0x00f8a9cb, 0x006264c8, 0x03bac2af, 0x017767cc, 0x035fbd6d, 0x002c902c}}}, + {X: Field{[10]uint32{0x0237b018, 0x033361cd, 0x021b217b, 0x02b6e09d, 0x01eba4ef, 0x015625e3, 0x006566d0, 0x035ec71b, 0x027f0988, 0x001dc4ef}}, Y: Field{[10]uint32{0x00475781, 0x02cd309d, 0x03d9470d, 0x039993b9, 0x01c75f31, 0x017eacd0, 0x02ef7c51, 0x00aea8bb, 0x026fa9d6, 0x0023ee46}}}, + {X: Field{[10]uint32{0x00982b02, 0x0199eea9, 0x0398b1ab, 0x03fc7165, 0x0134c739, 0x02c21573, 0x020acf56, 0x032cee54, 0x0160035d, 0x0015216b}}, Y: Field{[10]uint32{0x02a90f0f, 0x00e658a5, 0x03f9fcd4, 0x01579f72, 0x0357cbd4, 0x0224c46f, 0x03df62e5, 0x005329d0, 0x007b1e7c, 0x00077b1b}}}, + {X: Field{[10]uint32{0x00ee0f19, 0x0268f72c, 0x01ed189c, 0x0007cac1, 0x00411bd2, 0x013a1503, 0x012d1cfc, 0x01213407, 0x003ad3be, 0x002965d4}}, Y: Field{[10]uint32{0x001113cd, 0x0157b8ec, 0x014dce28, 0x03c1d972, 0x00becbd6, 0x036f3d24, 0x02cee664, 0x00466478, 0x027d3800, 0x000d444f}}}, + {X: Field{[10]uint32{0x0191ce4a, 0x03795f37, 0x0046cb94, 0x00de0320, 0x011ae249, 0x02f4bf64, 0x01d07a3d, 0x00c2c55f, 0x0251abb1, 0x002ea46c}}, Y: Field{[10]uint32{0x013e1f6c, 0x030d64c3, 0x01dcfe1d, 0x003f85e6, 0x03837742, 0x03d90bee, 0x01f33f54, 0x03b7ee9a, 0x0080500a, 0x0033f308}}}, + {X: Field{[10]uint32{0x02d324a4, 0x0116ffe1, 0x032e2fb0, 0x012980fe, 0x005c6d2f, 0x01721905, 0x03d33869, 0x01ef4f1b, 0x025883cc, 0x002b7ed6}}, Y: Field{[10]uint32{0x030cdc5c, 0x01554fde, 0x0172222a, 0x014f325d, 0x013a5257, 0x030c36a4, 0x00415a18, 0x00b7f714, 0x02d745d8, 0x000595d3}}}, + {X: Field{[10]uint32{0x03561ae8, 0x013b73e8, 0x023e29d9, 0x029383ee, 0x01ba1f13, 0x00292f8d, 0x0054b141, 0x002972b2, 0x014ddd71, 0x00042124}}, Y: Field{[10]uint32{0x01c25e99, 0x0373e152, 0x003babe6, 0x028d6423, 0x002f2b74, 0x037e3999, 0x02ac6cda, 0x03bd8104, 0x01353240, 0x00194f28}}}, + {X: Field{[10]uint32{0x026c6f7b, 0x0337345b, 0x0033f133, 0x01abe01e, 0x0281876a, 0x02e207bf, 0x028abe50, 0x022c505e, 0x02719af3, 0x001c12a8}}, Y: Field{[10]uint32{0x03769e54, 0x013d9ba8, 0x03b9263f, 0x03d10ae9, 0x0111395a, 0x038a8690, 0x00726c9b, 0x00602f12, 0x02b348c1, 0x0029bfb8}}}, + {X: Field{[10]uint32{0x00aec289, 0x01ee0daa, 0x0108051d, 0x03a250b2, 0x03fe68b0, 0x024f19a0, 0x01f57348, 0x00aa1970, 0x00c17f5d, 0x00118123}}, Y: Field{[10]uint32{0x03288efd, 0x00681e62, 0x03277a46, 0x00d0e106, 0x032e7668, 0x02d3e28c, 0x01bf9c6b, 0x03ddf41d, 0x003089a8, 0x0036173b}}}, + {X: Field{[10]uint32{0x03fce9e9, 0x011d95dd, 0x03c763d5, 0x033d6e87, 0x0107d04c, 0x016634be, 0x02781ba8, 0x00ec858d, 0x02be315d, 0x00143c79}}, Y: Field{[10]uint32{0x026b0b00, 0x017ec3bb, 0x00db7d09, 0x03851f80, 0x0325dd0c, 0x03725887, 0x00249759, 0x02e7ca33, 0x03d62057, 0x003df72d}}}, + {X: Field{[10]uint32{0x0263501c, 0x03ff3402, 0x006d03b7, 0x03cc16f5, 0x02944df1, 0x01d23527, 0x00efa037, 0x0156b404, 0x02446766, 0x001fb428}}, Y: Field{[10]uint32{0x01c18c21, 0x00343c01, 0x028d8269, 0x0196981d, 0x01e9b3ae, 0x00dab91d, 0x02eb2669, 0x0089ed11, 0x0265593f, 0x002a0dde}}}, + {X: Field{[10]uint32{0x03ebccc7, 0x03d18c93, 0x03342c29, 0x00eec7cd, 0x0219b29d, 0x03fc6f4b, 0x01c431dc, 0x030b3d84, 0x00a1ee66, 0x000340e7}}, Y: Field{[10]uint32{0x016d736f, 0x00c4139a, 0x0076e781, 0x03845699, 0x006e652e, 0x033f7321, 0x01ff5e24, 0x0319858a, 0x018214f4, 0x0036c343}}}, + {X: Field{[10]uint32{0x03b092b7, 0x03b60429, 0x015797be, 0x0272ab58, 0x028e3672, 0x01335283, 0x031768d9, 0x03f8bd14, 0x033acc55, 0x000309e5}}, Y: Field{[10]uint32{0x01f41c99, 0x005e8500, 0x020db439, 0x03c7fdd4, 0x000878e1, 0x02e78cc5, 0x02d54029, 0x02c91b15, 0x00eab36a, 0x003370c4}}}, + {X: Field{[10]uint32{0x0046e945, 0x0030cf19, 0x01d846de, 0x02000e8b, 0x01ac14a1, 0x03880b45, 0x0072e48d, 0x031a0c95, 0x0142cce3, 0x000da10a}}, Y: Field{[10]uint32{0x03b8f2f7, 0x000ee581, 0x02bcb574, 0x03e8376b, 0x03208d95, 0x03b55826, 0x009db9ae, 0x020be8d6, 0x03f819ab, 0x0014002c}}}, + {X: Field{[10]uint32{0x0162d0e9, 0x01552b9b, 0x03d7b0c4, 0x03de1783, 0x0074865e, 0x016aed15, 0x03f3a8c5, 0x0086d467, 0x015c3386, 0x00346a86}}, Y: Field{[10]uint32{0x03b737a8, 0x019c9469, 0x03c88c2e, 0x01cea6a2, 0x00832ce7, 0x0221018c, 0x0234576d, 0x00e166d1, 0x0133dc29, 0x0039f877}}}, + {X: Field{[10]uint32{0x000f00f0, 0x03c99fd7, 0x008b0489, 0x00aa3340, 0x03a59b2c, 0x01d9bb04, 0x02bd6ff5, 0x00e7b0d9, 0x01326074, 0x0013d08f}}, Y: Field{[10]uint32{0x00e7a9f4, 0x0075e1e9, 0x034eef5e, 0x016012d3, 0x00b6c3e0, 0x01cb2223, 0x008e6aa2, 0x01305701, 0x029d7ee9, 0x00178f1f}}}, + {X: Field{[10]uint32{0x03f06c4a, 0x006ee641, 0x018c5910, 0x03eabdce, 0x00ebcb9a, 0x02d7ea6e, 0x000859a9, 0x0247bc5f, 0x0280ff89, 0x001aec71}}, Y: Field{[10]uint32{0x0269a253, 0x03fcf261, 0x0039f189, 0x03f54d6e, 0x03217005, 0x01d85717, 0x03c242c9, 0x00ab9745, 0x03750d91, 0x000c6369}}}, + {X: Field{[10]uint32{0x00096f68, 0x00b426b0, 0x03b8bd0f, 0x008cc0c0, 0x02bc3934, 0x03efb8b9, 0x00b251c9, 0x0291a97f, 0x01d44713, 0x00005025}}, Y: Field{[10]uint32{0x0204a2b1, 0x032caeb9, 0x0159322d, 0x03ec2dfd, 0x001c7aa4, 0x0219f1ff, 0x01e632f6, 0x02cdd256, 0x000b3660, 0x00191f80}}}, + {X: Field{[10]uint32{0x035e5323, 0x0184ec12, 0x03b838b2, 0x0068e3a7, 0x02894319, 0x03021e1d, 0x00f831f6, 0x0271b92a, 0x03f0346e, 0x0004844a}}, Y: Field{[10]uint32{0x0257a3d0, 0x010a61a5, 0x0210e30a, 0x0196273f, 0x01faf640, 0x03b936ae, 0x03abf62a, 0x00cf6530, 0x02c2cb45, 0x00390526}}}, + {X: Field{[10]uint32{0x03ca5738, 0x0170dc22, 0x0329b4f7, 0x029e1165, 0x014f2197, 0x02bad67f, 0x00974ebe, 0x01204360, 0x00ccc2ed, 0x003e64d8}}, Y: Field{[10]uint32{0x026f1cb3, 0x020ea4bb, 0x020dbc0c, 0x00524d40, 0x03a06e44, 0x03865c76, 0x001b9f86, 0x01ea2b0b, 0x035e86d7, 0x002e4a8b}}}, + {X: Field{[10]uint32{0x02809ca4, 0x013a01ba, 0x00567a65, 0x02712522, 0x0264ae77, 0x0394fd47, 0x032112bb, 0x00fb3121, 0x024ec81a, 0x000b7b96}}, Y: Field{[10]uint32{0x033d4954, 0x00786931, 0x033b1bcb, 0x018e4d3f, 0x02bdea4d, 0x03f3c983, 0x02a1bcff, 0x011f0702, 0x00a1df6d, 0x00078baa}}}, + {X: Field{[10]uint32{0x01461229, 0x020b1ec3, 0x006a5f23, 0x0346ef5d, 0x00b73688, 0x00371404, 0x01638f7b, 0x03ade3d2, 0x02a2139e, 0x00016ea9}}, Y: Field{[10]uint32{0x01dca81d, 0x00756549, 0x00693cc0, 0x02a58055, 0x03b08a0c, 0x03909427, 0x02a75cd9, 0x014bc67c, 0x038310a3, 0x001c99dc}}}, + {X: Field{[10]uint32{0x02913d70, 0x015a2ea0, 0x0183c8f8, 0x00b365ba, 0x02f60d10, 0x004c6791, 0x034a6f3b, 0x01135add, 0x02b9321d, 0x0028fddf}}, Y: Field{[10]uint32{0x00613a05, 0x033ae397, 0x00077d3f, 0x0195dd1c, 0x00f6db17, 0x01afb074, 0x02386302, 0x039c3c6a, 0x01df8271, 0x003e4f5d}}}, + {X: Field{[10]uint32{0x03f2cf08, 0x02421371, 0x017db72f, 0x019baefa, 0x008588d7, 0x022ba7ce, 0x00fd62d6, 0x0249d0de, 0x02b5fa1f, 0x0011ae99}}, Y: Field{[10]uint32{0x038897f9, 0x02d77648, 0x0385b72d, 0x038bb3c1, 0x01f44bf7, 0x00ab5415, 0x01f9b555, 0x02e37e4b, 0x02243078, 0x000151cf}}}, + {X: Field{[10]uint32{0x0280dbf2, 0x034873b3, 0x02af4291, 0x01732865, 0x000bccb1, 0x01547eb4, 0x03415b6f, 0x000982ca, 0x0246ddcf, 0x0036da80}}, Y: Field{[10]uint32{0x00591d3c, 0x01645fca, 0x01c7ea98, 0x01bf9d78, 0x025f8885, 0x00f34259, 0x02c6f6f6, 0x00725e95, 0x0046f93e, 0x000e5b35}}}, + {X: Field{[10]uint32{0x026c8fa1, 0x00720d1b, 0x02e8c5cc, 0x02e19a64, 0x0338187e, 0x036e86c2, 0x012c4e58, 0x026368e6, 0x011ca7a2, 0x002e0be3}}, Y: Field{[10]uint32{0x01483461, 0x02d80d80, 0x03ee028e, 0x02254cf8, 0x02b1b805, 0x02dd9f1a, 0x00fdbddd, 0x0104f235, 0x036af9b0, 0x0012c2b9}}}, + {X: Field{[10]uint32{0x0085f000, 0x003c0631, 0x014a182e, 0x035edffe, 0x01d106fd, 0x02984a18, 0x00c6348a, 0x0192bfa7, 0x02a4dc92, 0x00111ba5}}, Y: Field{[10]uint32{0x01568440, 0x00cf7c26, 0x02507c8e, 0x0032984a, 0x012771c4, 0x033d9def, 0x0223b7ec, 0x00e9607f, 0x03d92159, 0x000cb7f8}}}, + {X: Field{[10]uint32{0x003a2eb9, 0x02874e4c, 0x01fb81ad, 0x01b3616f, 0x025c8a3e, 0x01941277, 0x0300ca34, 0x01b732e7, 0x03107bfa, 0x0000321b}}, Y: Field{[10]uint32{0x0034219d, 0x02b92b9f, 0x03ed888b, 0x01f92aa9, 0x019dcb27, 0x00c8d1d3, 0x0218c6a7, 0x0020502b, 0x00667e91, 0x003993dc}}}, + {X: Field{[10]uint32{0x036cd710, 0x017d6eb6, 0x01cdb83e, 0x02acc0a9, 0x009201c2, 0x000af9ee, 0x00d94cc2, 0x010a6793, 0x036ecda1, 0x002fb63a}}, Y: Field{[10]uint32{0x01411aac, 0x01226957, 0x01256708, 0x00f08250, 0x0116a1f0, 0x01a49d1b, 0x0367b9f6, 0x02903174, 0x00fab375, 0x00055cdb}}}, + {X: Field{[10]uint32{0x0364d38f, 0x0249b823, 0x02881da1, 0x014b7a0a, 0x00665e0a, 0x035d6520, 0x03171b5a, 0x02b44107, 0x03f2c5f6, 0x002cfbe9}}, Y: Field{[10]uint32{0x031677e6, 0x017eb23f, 0x013ffc53, 0x01840fed, 0x00b6dbd3, 0x03a6380d, 0x02b0dfaa, 0x00689003, 0x00843276, 0x000f7d8f}}}, + {X: Field{[10]uint32{0x0315cbd2, 0x03149749, 0x02921ebd, 0x0305947b, 0x018fa9af, 0x027850f8, 0x01213a84, 0x026d7c8d, 0x01a0cd86, 0x002c1183}}, Y: Field{[10]uint32{0x006fd7ee, 0x02ec486e, 0x00eee865, 0x017b3d8c, 0x0146b472, 0x02d5eca6, 0x033b4c02, 0x0061df39, 0x02adf354, 0x0030468f}}}, + {X: Field{[10]uint32{0x033bc071, 0x03b0f3b5, 0x0152a49c, 0x014e9f43, 0x00b49692, 0x00b58035, 0x00191871, 0x014afacb, 0x0117a174, 0x000a2c25}}, Y: Field{[10]uint32{0x0120a326, 0x01e90f7a, 0x01ae7fce, 0x0341a437, 0x0040ffd6, 0x0102bd65, 0x01635180, 0x01d64444, 0x0308073c, 0x000d9a59}}}, + {X: Field{[10]uint32{0x03b5f136, 0x02946c3e, 0x037536b1, 0x03f11c55, 0x020ad86a, 0x002fc5fe, 0x02e76b7c, 0x032d601e, 0x00d8192a, 0x001486fb}}, Y: Field{[10]uint32{0x01ac858d, 0x01ffa0dd, 0x026691dc, 0x003bb7cc, 0x02ee0671, 0x015145a0, 0x00f399e1, 0x03c4fb33, 0x00c6d7af, 0x00192295}}}, + {X: Field{[10]uint32{0x01f6cf67, 0x02dd87de, 0x01082368, 0x029ddb4e, 0x02a2a200, 0x0161f613, 0x009bca1b, 0x0275949b, 0x01d0b7fd, 0x002def06}}, Y: Field{[10]uint32{0x0370acae, 0x025ba347, 0x023ad2f7, 0x03fbfeff, 0x024a1e9f, 0x01cc58ed, 0x012c29a7, 0x03233d09, 0x02bee0d0, 0x0016b7be}}}, + {X: Field{[10]uint32{0x017aea8b, 0x00c7c34e, 0x03114dc9, 0x01b704f9, 0x0066db7b, 0x0055633b, 0x030c2412, 0x02a35507, 0x03e51b6c, 0x0039238e}}, Y: Field{[10]uint32{0x020f28ac, 0x01079f83, 0x004314bf, 0x00fbe7dd, 0x01f6cb3a, 0x03c4ad19, 0x03064bff, 0x038bc4c3, 0x03575b16, 0x0036f3d8}}}, + {X: Field{[10]uint32{0x03455751, 0x03d0a427, 0x028909b2, 0x02d65d67, 0x014ec795, 0x038a3ca9, 0x02475968, 0x024a9a8c, 0x02de71c6, 0x0000e571}}, Y: Field{[10]uint32{0x0269a13d, 0x030b2169, 0x003c3fcf, 0x0391266f, 0x03b5b097, 0x02b28557, 0x02ed4e15, 0x03768b07, 0x011803c7, 0x003b9780}}}, + {X: Field{[10]uint32{0x02808d99, 0x01814af2, 0x009a81a6, 0x02aa293a, 0x02663da3, 0x0303fb0d, 0x03412919, 0x010e6489, 0x02c3b118, 0x000a24e2}}, Y: Field{[10]uint32{0x03174603, 0x002e6193, 0x025f8031, 0x0256e87a, 0x00da1682, 0x0032e684, 0x03eadb18, 0x0306fa8a, 0x027ab1eb, 0x0012ba37}}}, + {X: Field{[10]uint32{0x0248f5a4, 0x00fb9ad4, 0x036f5852, 0x013f428d, 0x03be3af6, 0x0389fa14, 0x01472f23, 0x0233d881, 0x021895e8, 0x0001703d}}, Y: Field{[10]uint32{0x004be51b, 0x02c70f79, 0x02624b41, 0x0360d107, 0x038473e3, 0x03f6d43e, 0x03634569, 0x03aecedc, 0x0055cd09, 0x002f970f}}}, + {X: Field{[10]uint32{0x023ca1d7, 0x01536b17, 0x02ec0015, 0x004c7ae8, 0x02ae2e8f, 0x01fb416e, 0x028e125f, 0x03dccfb4, 0x03bf22d0, 0x002af87d}}, Y: Field{[10]uint32{0x02b0ab4e, 0x02a8b106, 0x02ffc918, 0x02d656ba, 0x03e553e6, 0x0265b2cc, 0x008ffe4b, 0x007daa5c, 0x00db3de3, 0x000a9692}}}, + {X: Field{[10]uint32{0x008d8be7, 0x03f4a738, 0x02349bcc, 0x03b110a9, 0x015f1dbe, 0x0298244a, 0x0124907e, 0x01c2cde4, 0x002757d3, 0x0030c109}}, Y: Field{[10]uint32{0x01868934, 0x01d73a6c, 0x031448bb, 0x0304a7a3, 0x01528959, 0x02326047, 0x01b35e2f, 0x0369d54d, 0x02b33e0f, 0x0019e993}}}, + {X: Field{[10]uint32{0x0140f5b8, 0x014cbf8c, 0x01c21c81, 0x0119abd0, 0x03031527, 0x038690fd, 0x02f0b6a9, 0x008675de, 0x0146356f, 0x00196966}}, Y: Field{[10]uint32{0x00f35918, 0x00e9871d, 0x0241f246, 0x0164f611, 0x001692b0, 0x001c3688, 0x00cf27fc, 0x013e8146, 0x028d5d3e, 0x001939c4}}}, + {X: Field{[10]uint32{0x001413e2, 0x03ad4fc5, 0x0219ede2, 0x02df536b, 0x0060311c, 0x02e67684, 0x03066f2b, 0x02321d1a, 0x023b4842, 0x001b1f4b}}, Y: Field{[10]uint32{0x00b7e3a1, 0x0192f2db, 0x007ab2a6, 0x03f8a3df, 0x03286292, 0x03b5ece0, 0x022864d1, 0x0319c137, 0x03bfc2e7, 0x00012e91}}}, + {X: Field{[10]uint32{0x03fdcdd9, 0x033d63a4, 0x019cf44a, 0x01fe914e, 0x03565579, 0x0324ffd5, 0x03798a9b, 0x02270ad1, 0x03bdb99c, 0x00037495}}, Y: Field{[10]uint32{0x01b3e4af, 0x00ab8db0, 0x020cc1af, 0x02058e43, 0x03e8194f, 0x010a2440, 0x027e0d71, 0x01fc954b, 0x00f2a920, 0x003e359c}}}, + {X: Field{[10]uint32{0x00c23d7b, 0x02ad79bb, 0x0263eb2a, 0x01f2c23c, 0x026827b8, 0x03351f18, 0x0152b8fa, 0x0310910a, 0x034eb8dd, 0x00094580}}, Y: Field{[10]uint32{0x0216ac9e, 0x031d6858, 0x02826433, 0x00d12d21, 0x00bd2ab5, 0x01cc774c, 0x03545bca, 0x03a81eb4, 0x0079f5fe, 0x002b63a2}}}, + {X: Field{[10]uint32{0x0134246d, 0x037382b6, 0x0180b907, 0x00559646, 0x017f0752, 0x00847b70, 0x01834b38, 0x02478ec6, 0x005427b5, 0x001f9c8c}}, Y: Field{[10]uint32{0x0263a71f, 0x020051d3, 0x034e33b0, 0x03a38c91, 0x032506be, 0x00261d82, 0x01671df1, 0x02129bc8, 0x00bbd8c1, 0x0017247f}}}, + {X: Field{[10]uint32{0x01d1898b, 0x0174e65b, 0x0333e72b, 0x01ffbe77, 0x038d4fb5, 0x0169bdae, 0x03876914, 0x0034a812, 0x0116ac3c, 0x0006c7e7}}, Y: Field{[10]uint32{0x035b4b1b, 0x034299fc, 0x01bd1024, 0x014e5146, 0x0215e944, 0x01890696, 0x00a399e1, 0x039142c5, 0x031e05ff, 0x001910af}}}, + {X: Field{[10]uint32{0x00872f2b, 0x001b18ff, 0x01a23e90, 0x01364f14, 0x0265b514, 0x02598c71, 0x039f6715, 0x03a90e8e, 0x024e57cd, 0x00383c7e}}, Y: Field{[10]uint32{0x0332e564, 0x02705dab, 0x018640a4, 0x037b349f, 0x0374f9a3, 0x00547751, 0x02056170, 0x003450bd, 0x01fb5489, 0x00320e14}}}, + {X: Field{[10]uint32{0x02728c3a, 0x0284bacc, 0x03d0b3e9, 0x009e675e, 0x0040efa0, 0x00a8281e, 0x01a3667b, 0x02082894, 0x03bb697c, 0x0002ba56}}, Y: Field{[10]uint32{0x03aebb41, 0x016c521a, 0x03f10e68, 0x0371ee00, 0x011140e0, 0x016b9427, 0x02a4da94, 0x0025b61b, 0x02970280, 0x003836ee}}}, + {X: Field{[10]uint32{0x002aed31, 0x00d01d9a, 0x01b3069e, 0x02b9b9fc, 0x030afad1, 0x014ffe30, 0x02529ea8, 0x03d0b07f, 0x0085d52e, 0x003f23fe}}, Y: Field{[10]uint32{0x01e3dd14, 0x0382992c, 0x00850433, 0x01c50cab, 0x0209cced, 0x00d5b406, 0x0104f1b3, 0x023d89ee, 0x02d4b26e, 0x001497b3}}}, + {X: Field{[10]uint32{0x02c8e810, 0x0272accc, 0x02546c62, 0x00f04d94, 0x00ed68d6, 0x02a59683, 0x01b57533, 0x01896835, 0x036a459d, 0x001984c4}}, Y: Field{[10]uint32{0x015b65cb, 0x02614ed9, 0x0069b93a, 0x00050049, 0x0228b4cb, 0x02c5a2f4, 0x01732b43, 0x002a52cf, 0x03f824d3, 0x00043ca7}}}, + {X: Field{[10]uint32{0x01ea56f0, 0x03d68df7, 0x01b91f24, 0x0107daf8, 0x0319dda8, 0x01bbced8, 0x02309b39, 0x00cc9f1d, 0x01157b68, 0x00114216}}, Y: Field{[10]uint32{0x01956821, 0x01d953e4, 0x02a12bbc, 0x02fed2c6, 0x032b6ebb, 0x0023569a, 0x0155e34f, 0x022391a8, 0x0046584a, 0x002e69c5}}}, + {X: Field{[10]uint32{0x008a4325, 0x00bcfddf, 0x0064f0e3, 0x013089d1, 0x01be58af, 0x035785c4, 0x0382576c, 0x02e8377a, 0x03bd8f10, 0x0005a3b8}}, Y: Field{[10]uint32{0x0278b34c, 0x01d08099, 0x0388668b, 0x02116082, 0x00465fb1, 0x020be1c0, 0x016891c9, 0x01027ea4, 0x026343ff, 0x001bbbc7}}}, + {X: Field{[10]uint32{0x03048c04, 0x0009c53b, 0x0131b718, 0x013181de, 0x00fdd86b, 0x02c800f9, 0x034db8de, 0x008d053a, 0x0197763c, 0x002cc647}}, Y: Field{[10]uint32{0x02152edd, 0x016a0f30, 0x00a04f88, 0x0358ddc4, 0x03ce6860, 0x03af7570, 0x03d53d83, 0x01d72af9, 0x008559f9, 0x002d2b0c}}}, + {X: Field{[10]uint32{0x022f8738, 0x0280898e, 0x0096a51e, 0x03f3c804, 0x033ec477, 0x03a4fd2e, 0x032acca1, 0x03724cf1, 0x005b4e73, 0x0036a757}}, Y: Field{[10]uint32{0x0012f8aa, 0x02cc826a, 0x015b50b4, 0x03422c28, 0x01400c05, 0x018d9944, 0x01b93b0d, 0x019b0da2, 0x02da65f9, 0x001feda8}}}, + {X: Field{[10]uint32{0x00b0dd66, 0x0196f339, 0x0215c01e, 0x02825538, 0x008d1cfa, 0x0314991c, 0x011730f0, 0x0159e05e, 0x01d2a7e7, 0x00050395}}, Y: Field{[10]uint32{0x0153d5b3, 0x00165042, 0x0118bce8, 0x0397225e, 0x0087e2d5, 0x03bcd8c6, 0x02470d81, 0x00965e47, 0x00d863ea, 0x0012fee8}}}, + {X: Field{[10]uint32{0x02b173d8, 0x00e67ac5, 0x00a1cf3f, 0x03e198d1, 0x03b438f7, 0x03f8f62f, 0x029bd01b, 0x03321f3b, 0x00f64b95, 0x00056a73}}, Y: Field{[10]uint32{0x03b33f3b, 0x018f2366, 0x03f90e03, 0x0269b946, 0x035d0ba5, 0x002cc6a4, 0x01e51fbf, 0x03b49581, 0x02cdbdeb, 0x0013d51c}}}, + {X: Field{[10]uint32{0x00af6e06, 0x032a8f62, 0x0088f814, 0x0244b42a, 0x00c7ed5e, 0x02b4606f, 0x033d3d8f, 0x01c076de, 0x024b6776, 0x003a1b8d}}, Y: Field{[10]uint32{0x01ea7b92, 0x0130d5d3, 0x00915f83, 0x03452989, 0x0124a466, 0x018a1a62, 0x0195518c, 0x001034fa, 0x00600afc, 0x00008bf5}}}, + {X: Field{[10]uint32{0x02500eb6, 0x020beb96, 0x03ddbfc2, 0x00ea9b56, 0x03b1f81d, 0x008faf39, 0x021134c7, 0x03c36c8c, 0x0298cd25, 0x000f0986}}, Y: Field{[10]uint32{0x03abd9c1, 0x00d7f15d, 0x02cbc455, 0x001b7abb, 0x004027a5, 0x0325a99b, 0x00b6ed7e, 0x02084629, 0x01455e49, 0x000ae348}}}, + {X: Field{[10]uint32{0x00c955c8, 0x0151bb7d, 0x0300bd66, 0x017408e0, 0x00368c3b, 0x01deab3f, 0x03b1f6c1, 0x02d45db2, 0x00114d55, 0x00126daa}}, Y: Field{[10]uint32{0x03815b94, 0x00d60e28, 0x01bca5b5, 0x0044e475, 0x020ab944, 0x03c6c2ca, 0x038e0017, 0x039f041a, 0x00a409f0, 0x00346c49}}}, + {X: Field{[10]uint32{0x0125f6b9, 0x02a36b31, 0x03f71f34, 0x007fde90, 0x016cee80, 0x003312e0, 0x01deab62, 0x039694fe, 0x0061f0d3, 0x001bb23a}}, Y: Field{[10]uint32{0x02dcfd6a, 0x00006ae9, 0x02e27782, 0x01c718fe, 0x011e01a8, 0x02dad7ac, 0x009c4f7e, 0x02bef4cc, 0x005b68cc, 0x0010b815}}}, + {X: Field{[10]uint32{0x0195b9ac, 0x02262a91, 0x03e1ac08, 0x015d1903, 0x004b527e, 0x023c5369, 0x005a2e2a, 0x02973f4c, 0x034159ac, 0x001cd0ac}}, Y: Field{[10]uint32{0x03160124, 0x01748d14, 0x01ac121b, 0x0102b21b, 0x0127f64f, 0x03a984a0, 0x03969a84, 0x00bb88d8, 0x0302d244, 0x002d4984}}}, + {X: Field{[10]uint32{0x02686fa9, 0x034c2e56, 0x0054b687, 0x015e9827, 0x00b27477, 0x03c9a59f, 0x01cfc43d, 0x00d42d97, 0x00bd54ef, 0x00210acc}}, Y: Field{[10]uint32{0x0336ead6, 0x016b20fc, 0x0277b9cc, 0x01f1c79f, 0x037d594f, 0x01723795, 0x0331f63f, 0x00dae7b3, 0x02922caa, 0x0013fea7}}}, + {X: Field{[10]uint32{0x01f94862, 0x02381306, 0x02153999, 0x0028fa46, 0x037c13bb, 0x0255d5fb, 0x03fb60d4, 0x029f1ef0, 0x035dd589, 0x000b6e90}}, Y: Field{[10]uint32{0x028cc0a1, 0x03522257, 0x013ed55c, 0x0171f7e1, 0x00931d3e, 0x01dd7940, 0x038eca16, 0x00f2e748, 0x020ea4b2, 0x0031101c}}}, + {X: Field{[10]uint32{0x033bec02, 0x034f1171, 0x01c07998, 0x02f4f40d, 0x02bb284f, 0x0064e42f, 0x035a4578, 0x03396ca9, 0x01248f84, 0x002747a1}}, Y: Field{[10]uint32{0x00eb9ead, 0x0201d325, 0x03f40129, 0x033e126f, 0x036d62e8, 0x02a018fc, 0x038bbc84, 0x0332b08c, 0x024cc935, 0x0023903b}}}, + {X: Field{[10]uint32{0x00b441af, 0x0158b4b6, 0x01cf4e76, 0x008d8b89, 0x019a7f86, 0x005525d5, 0x03639121, 0x029d6f53, 0x02c5d1fb, 0x00349cd6}}, Y: Field{[10]uint32{0x01afc081, 0x023ecd9f, 0x0331da1d, 0x01b4727e, 0x01b4ade8, 0x02d4bcf9, 0x037cb0e5, 0x03cce5de, 0x003619f9, 0x0002f4ab}}}, + {X: Field{[10]uint32{0x00a3e11a, 0x00eb7fac, 0x017cdca6, 0x025b82a5, 0x01b27c2b, 0x015ca4e5, 0x01a68d31, 0x03fc4eb4, 0x0238f46c, 0x002c04c3}}, Y: Field{[10]uint32{0x006aa3c4, 0x01666803, 0x001b5535, 0x00590d9b, 0x02610f15, 0x02c45dda, 0x02ff8443, 0x0100721f, 0x017f4a61, 0x000f67da}}}, + {X: Field{[10]uint32{0x01ec76a7, 0x00b99a0d, 0x02caaed8, 0x01e0a650, 0x03f59faa, 0x02e277a2, 0x022d8f33, 0x01abe2d9, 0x022f1530, 0x00382a81}}, Y: Field{[10]uint32{0x015e6f2e, 0x01115fb0, 0x0218179a, 0x015097f1, 0x0334305b, 0x02b260e1, 0x01ffb8ac, 0x01cc1297, 0x00b56ea7, 0x00317d7c}}}, + {X: Field{[10]uint32{0x019432d5, 0x012f42c0, 0x004139f4, 0x021665eb, 0x002156d6, 0x03a61d7b, 0x03e15c4a, 0x03472461, 0x02c1a8e6, 0x003b4589}}, Y: Field{[10]uint32{0x01f0c35d, 0x01410a5c, 0x00d7e69d, 0x011b164e, 0x037f0fad, 0x039cdcfd, 0x035e531e, 0x0128fd08, 0x015b9dcb, 0x000f0362}}}, + {X: Field{[10]uint32{0x01c92833, 0x034bb413, 0x00be8431, 0x036e1b81, 0x00664744, 0x01325d3e, 0x0025aa67, 0x03f6be33, 0x00314e18, 0x0028b333}}, Y: Field{[10]uint32{0x0359d71c, 0x00e9d3f1, 0x038a846c, 0x02230190, 0x002e1b9c, 0x019cbd79, 0x00e55368, 0x01c7bb48, 0x0249d6d4, 0x002d9043}}}, + {X: Field{[10]uint32{0x0268bf27, 0x03d9d6fd, 0x0331fa35, 0x0018f552, 0x00b3b24e, 0x00b65aa2, 0x0319119b, 0x03d8b12b, 0x012fdb15, 0x0016ff06}}, Y: Field{[10]uint32{0x03d99051, 0x02786611, 0x0223b609, 0x01890087, 0x02dbe0dc, 0x03d8a8e2, 0x0031bb39, 0x03850241, 0x0374acb4, 0x00119dd0}}}, + {X: Field{[10]uint32{0x01227028, 0x02ad7c02, 0x0090e97d, 0x015621ab, 0x0161eb21, 0x01fbec02, 0x022e5539, 0x031010ca, 0x0289da73, 0x0019a10a}}, Y: Field{[10]uint32{0x01941de9, 0x00602448, 0x02f4e90b, 0x031a2726, 0x01da171b, 0x00405b36, 0x012dc9df, 0x02812223, 0x03c3511e, 0x000ea3a0}}}, + {X: Field{[10]uint32{0x01c516e8, 0x001d9af3, 0x002f7181, 0x0137564d, 0x03e3a4a8, 0x03ba2e4a, 0x01f89913, 0x017e6351, 0x01973ba9, 0x003b208c}}, Y: Field{[10]uint32{0x037206fe, 0x0097866a, 0x032aef1d, 0x01b6b265, 0x0177d547, 0x02a54ed7, 0x033bc882, 0x00fd3865, 0x0079f511, 0x0014cb4f}}}, + {X: Field{[10]uint32{0x02fc140b, 0x009467dc, 0x007ad1ac, 0x01b0caac, 0x03e8e8e2, 0x03cfb4e7, 0x015e5b65, 0x0185dabb, 0x0278bc51, 0x000ed97f}}, Y: Field{[10]uint32{0x00208d98, 0x03deb7e6, 0x02c1b9c9, 0x035cc533, 0x02566a1f, 0x019be577, 0x037f9764, 0x03ae704f, 0x02de5190, 0x00215b4d}}}, + {X: Field{[10]uint32{0x018cc346, 0x01880db4, 0x03945182, 0x02cc9c8a, 0x01f9f31e, 0x00ff7402, 0x02545ce8, 0x00d497a7, 0x02ca51c4, 0x0000eb03}}, Y: Field{[10]uint32{0x0213a7e6, 0x00c092a8, 0x01e509ab, 0x0322c4d3, 0x00325beb, 0x01038251, 0x004ef313, 0x02933cc9, 0x018bc3b2, 0x00371c80}}}, + {X: Field{[10]uint32{0x02e23508, 0x014e810b, 0x0172ffbe, 0x02e6ed42, 0x00bcdac8, 0x005f66f8, 0x012db7c2, 0x03b39bb7, 0x018d6c50, 0x00124a59}}, Y: Field{[10]uint32{0x02cec38a, 0x012f642a, 0x00c3a728, 0x03e35e84, 0x016dfc8d, 0x008ca1d0, 0x0155980a, 0x02ef52e1, 0x002c61aa, 0x00396b29}}}, + {X: Field{[10]uint32{0x013a6291, 0x002ad6c5, 0x022781d6, 0x02ad2469, 0x037830e2, 0x031b48a5, 0x029e7488, 0x01924bc3, 0x036f4bc9, 0x002745b9}}, Y: Field{[10]uint32{0x015ac7ab, 0x0099bb22, 0x01711da7, 0x0228113a, 0x015eaa98, 0x01dc2bbd, 0x00363189, 0x01a48815, 0x0300e4ac, 0x00399643}}}, + {X: Field{[10]uint32{0x035df94d, 0x026cae07, 0x0276d5e0, 0x01a89f01, 0x014e13b3, 0x03fe5eb7, 0x02a9bbe7, 0x039febd4, 0x004a1327, 0x002c1927}}, Y: Field{[10]uint32{0x0091acdd, 0x01570f0e, 0x02d120b3, 0x00206981, 0x02d79fdd, 0x01fdd6a2, 0x032a0807, 0x01a12381, 0x0316a6f3, 0x00264720}}}, + {X: Field{[10]uint32{0x0052235d, 0x0304af6c, 0x013c96b7, 0x03d817f8, 0x03eb39a8, 0x0129285a, 0x01ce51c4, 0x00f7b4b2, 0x0221f630, 0x0023c652}}, Y: Field{[10]uint32{0x0330739e, 0x015749a5, 0x030f1bd7, 0x00b3b7f9, 0x01c63517, 0x0268b721, 0x01afb23e, 0x020b8951, 0x03d0c9af, 0x002f477c}}}, + {X: Field{[10]uint32{0x03e21ff0, 0x021fc77b, 0x0262a60e, 0x00871b08, 0x033872b7, 0x03579996, 0x037f6c3d, 0x0133651d, 0x0297cc7a, 0x000769c6}}, Y: Field{[10]uint32{0x00be6a06, 0x03411a01, 0x026e87f0, 0x03a19a8f, 0x030a4d30, 0x009cebfa, 0x032b9af1, 0x01b869eb, 0x02413903, 0x001e345e}}}, + {X: Field{[10]uint32{0x0386aa45, 0x01ebcf37, 0x0290f7a3, 0x006ec604, 0x03e04e40, 0x0148a471, 0x02fabb1c, 0x03c98b4f, 0x0363e493, 0x00027fb4}}, Y: Field{[10]uint32{0x003de729, 0x03fe0d9c, 0x00d6cb3f, 0x00da437f, 0x0353a54f, 0x02972597, 0x01b18276, 0x02b7fefb, 0x033ee164, 0x0004c330}}}, + {X: Field{[10]uint32{0x03a1e49f, 0x01d6a1e9, 0x0298febb, 0x00eb079e, 0x007a601a, 0x032ed850, 0x01ebc38f, 0x00d5a066, 0x00cd221c, 0x003459bb}}, Y: Field{[10]uint32{0x0072f06e, 0x0257dda8, 0x003c9937, 0x01f33952, 0x00b0628c, 0x0152150d, 0x00ec5628, 0x0002f577, 0x02b7e7c2, 0x00098888}}}, + {X: Field{[10]uint32{0x01dbe0fd, 0x002482a3, 0x035cc293, 0x01b8e4d0, 0x02b998a5, 0x02528ba3, 0x03078392, 0x01c30730, 0x00bd3e37, 0x0039e14f}}, Y: Field{[10]uint32{0x000e5a8e, 0x00503da6, 0x0050b80a, 0x02c63e92, 0x00cff1e7, 0x0008f0ef, 0x01d29181, 0x01f31259, 0x02ca6714, 0x001e5df9}}}, + {X: Field{[10]uint32{0x0227a17f, 0x03d27158, 0x03511480, 0x039c108f, 0x0251036c, 0x02c687c0, 0x02a3cd56, 0x000804af, 0x02b1cb14, 0x002a2c3f}}, Y: Field{[10]uint32{0x01ba8a9f, 0x02773e9d, 0x037b527c, 0x02483225, 0x0367afe7, 0x00e00723, 0x00eedd6d, 0x02db6db3, 0x03db9d3a, 0x003335f0}}}, + {X: Field{[10]uint32{0x02d617d7, 0x0167db15, 0x02b26c90, 0x001aa11a, 0x006d02e4, 0x013d62e6, 0x02905797, 0x015d54c7, 0x01d9e181, 0x0015f397}}, Y: Field{[10]uint32{0x02142d14, 0x006b18ff, 0x01bc4e85, 0x03c97bf2, 0x01829f61, 0x02a3e6bb, 0x01598f8a, 0x03cc589a, 0x00904399, 0x00330d30}}}, + {X: Field{[10]uint32{0x00f9c858, 0x02e61bf4, 0x02f2d6c8, 0x031b2fc0, 0x008077b6, 0x0196acf9, 0x03bbc1d3, 0x03f1b6fb, 0x00b64f60, 0x0011e5e4}}, Y: Field{[10]uint32{0x007f2f9b, 0x022cd582, 0x03f435df, 0x006a57a6, 0x025cff91, 0x00f923e9, 0x025382ae, 0x00649774, 0x0182e358, 0x00055fd2}}}, + {X: Field{[10]uint32{0x03f17c68, 0x019421ff, 0x03b1ccb2, 0x0328f2cd, 0x008ee0a0, 0x004ef9db, 0x001b6228, 0x00290486, 0x007b1ffe, 0x000156af}}, Y: Field{[10]uint32{0x0171d99f, 0x03b7532a, 0x032d669b, 0x02fe0a0f, 0x01606272, 0x02877496, 0x039e6030, 0x01314d33, 0x024923e9, 0x002f44d0}}}, + {X: Field{[10]uint32{0x00d2e659, 0x019ce509, 0x011da1dc, 0x03807514, 0x02bd3156, 0x0397dc27, 0x004d4310, 0x0359eae0, 0x00328bf5, 0x001b29f8}}, Y: Field{[10]uint32{0x02ca2647, 0x008815d7, 0x01a69077, 0x03d1b4ac, 0x00d80aaa, 0x03e1c360, 0x011c2ff2, 0x00e42595, 0x0133f368, 0x00310a2c}}}, + {X: Field{[10]uint32{0x01f530d3, 0x0167a44b, 0x014dd999, 0x03ba706b, 0x02346ae4, 0x02ebea2c, 0x03d20baf, 0x0021b132, 0x01a983e9, 0x001837c6}}, Y: Field{[10]uint32{0x0379cc48, 0x022dec0e, 0x01e31d7a, 0x03e211c0, 0x01a09d60, 0x0393a393, 0x01c2f1e0, 0x005e8108, 0x005429f8, 0x0036b9ee}}}, + {X: Field{[10]uint32{0x03686bce, 0x009b5b74, 0x012c7e1d, 0x00141ae9, 0x035c22ff, 0x01668e11, 0x0180ea1c, 0x03cab6eb, 0x010e5ef5, 0x001bc635}}, Y: Field{[10]uint32{0x00d7d7a9, 0x00cdab7c, 0x038f513a, 0x01756d15, 0x00d3f340, 0x030de1b8, 0x00f5c83b, 0x03bf43eb, 0x020fa166, 0x003475fa}}}, + {X: Field{[10]uint32{0x03d949e0, 0x03a281cb, 0x01233b3b, 0x00399796, 0x01fcdfe0, 0x0377ba76, 0x009569a8, 0x004cd92b, 0x009d5ed5, 0x002d8d37}}, Y: Field{[10]uint32{0x0331db69, 0x01b40dba, 0x021a70e8, 0x01d9958a, 0x02fdf189, 0x0370d15b, 0x01a505cb, 0x0095d7c9, 0x02e2c61b, 0x0035cb91}}}, + {X: Field{[10]uint32{0x03445910, 0x0159bf65, 0x00f0e4fc, 0x020da7d7, 0x0340d919, 0x00f6f16a, 0x02461714, 0x0093cf99, 0x00f02dba, 0x00168dff}}, Y: Field{[10]uint32{0x01c69d1e, 0x010918dd, 0x00b59c33, 0x00f4a5d7, 0x0333e615, 0x00531e11, 0x02a95826, 0x01d1b198, 0x01d813f8, 0x002a5834}}}, + {X: Field{[10]uint32{0x0112661c, 0x00eb86fc, 0x029e11b8, 0x023c6aac, 0x01eeeb8f, 0x0065b63f, 0x00201b6b, 0x0200cb18, 0x02a73731, 0x0022abc5}}, Y: Field{[10]uint32{0x039a8e44, 0x02ead22a, 0x0215d611, 0x025661f1, 0x036d03a7, 0x0117cab9, 0x03cc0c28, 0x02929d58, 0x035666a3, 0x0031187b}}}, + {X: Field{[10]uint32{0x035e3434, 0x012e2bab, 0x0004d9cd, 0x024d0b0a, 0x011d85a6, 0x001ca711, 0x03e7f49e, 0x0057bf64, 0x03a5a05f, 0x00115bc2}}, Y: Field{[10]uint32{0x0311cad5, 0x01fb2c9c, 0x0135bb0f, 0x02f612e4, 0x0213f616, 0x00c10785, 0x006da131, 0x006a2dfd, 0x00a99922, 0x0029a03d}}}, + {X: Field{[10]uint32{0x00f5c741, 0x02cd32ce, 0x0170a9d0, 0x003e85e2, 0x014bfdc9, 0x00784b2e, 0x03146d93, 0x015025d7, 0x02a1f190, 0x003e270d}}, Y: Field{[10]uint32{0x0044099b, 0x0348dd67, 0x01646579, 0x0233ad28, 0x034b1df3, 0x0307fe8e, 0x01866159, 0x006e4a84, 0x008058e3, 0x000ed58b}}}, + {X: Field{[10]uint32{0x01f3f76a, 0x030940d0, 0x004289d2, 0x0398cbcc, 0x00e23876, 0x035a73ed, 0x00c49031, 0x02180036, 0x03112e1d, 0x001fdafa}}, Y: Field{[10]uint32{0x00ff4a9b, 0x03743b29, 0x02fb90cd, 0x035ba33d, 0x0008d98e, 0x00589ee6, 0x0194b9b5, 0x016bf2fa, 0x0007c092, 0x002864dd}}}, + {X: Field{[10]uint32{0x02d73511, 0x03718184, 0x000d3827, 0x010c653d, 0x011010f5, 0x03475400, 0x037130ba, 0x031f0de2, 0x00aab585, 0x002416b4}}, Y: Field{[10]uint32{0x037177a9, 0x02e00942, 0x018aab83, 0x007e8b82, 0x00a44782, 0x024745b5, 0x00130aee, 0x0334e054, 0x0301c3dd, 0x002ff381}}}, + {X: Field{[10]uint32{0x03408b6c, 0x0145487d, 0x032aef1d, 0x03d1d542, 0x01e54187, 0x02d80cf4, 0x001e7a30, 0x00bf29c8, 0x02d16212, 0x003d5670}}, Y: Field{[10]uint32{0x00154481, 0x0059eb4d, 0x017f25dc, 0x0108e33b, 0x037695ea, 0x00c4209c, 0x02f04dc4, 0x03ac51fd, 0x0222dfd0, 0x000fc435}}}, + {X: Field{[10]uint32{0x018ce8b4, 0x0364741c, 0x023456f4, 0x00330d85, 0x037c0d8a, 0x022fb7d4, 0x02e5830a, 0x00527332, 0x00a4fa17, 0x00066cca}}, Y: Field{[10]uint32{0x02582f64, 0x01134127, 0x00855126, 0x0024975a, 0x01fdff7f, 0x039e19de, 0x01258838, 0x01a48da6, 0x000a2a4e, 0x0026873a}}}, + {X: Field{[10]uint32{0x01ad5d4a, 0x024d922b, 0x03e533a3, 0x03d02487, 0x032743d4, 0x0069a82f, 0x00abc24c, 0x0066f3af, 0x00a0e756, 0x002beae6}}, Y: Field{[10]uint32{0x023a32db, 0x034e6fa4, 0x017157df, 0x038c4f5d, 0x007c8e5b, 0x007ca684, 0x0341c092, 0x00e695e5, 0x02877591, 0x002fc6ce}}}, + {X: Field{[10]uint32{0x024181c7, 0x0247f63b, 0x01085cca, 0x03ba05db, 0x01b2dfe0, 0x020ea3b2, 0x01b36d9c, 0x028d36b7, 0x037c1d86, 0x0030b2af}}, Y: Field{[10]uint32{0x0191070f, 0x0349ea93, 0x032acf51, 0x0143a725, 0x01159ab1, 0x03b3ae3d, 0x00465bd6, 0x00cd71c9, 0x032453f1, 0x0016ccad}}}, + {X: Field{[10]uint32{0x0289f593, 0x035b3f0a, 0x02be4f5a, 0x03e8b068, 0x024f6e9c, 0x03050d57, 0x028c5347, 0x01d148a6, 0x00248e84, 0x0024a0e5}}, Y: Field{[10]uint32{0x008c3a07, 0x02285c5f, 0x02996c88, 0x0057594b, 0x0051983b, 0x011bebda, 0x00a7b4a1, 0x03b81a67, 0x005dfd41, 0x002ee716}}}, + {X: Field{[10]uint32{0x033c7dfa, 0x030c3431, 0x03b4aa8d, 0x004b4327, 0x0155e55f, 0x005ef5eb, 0x00cba646, 0x03c61082, 0x013c389e, 0x002f28a1}}, Y: Field{[10]uint32{0x01df63a2, 0x02235e78, 0x01340175, 0x00b80799, 0x02fe9a14, 0x01a98bee, 0x005952b1, 0x03b7b4f5, 0x009ef32a, 0x0027d04a}}}, + {X: Field{[10]uint32{0x01bf56fd, 0x013ca05c, 0x037e4a0e, 0x02f4df29, 0x015745b7, 0x03399cb1, 0x0353aea5, 0x0196a3af, 0x03da94b5, 0x00293a9e}}, Y: Field{[10]uint32{0x013e96bc, 0x03339aa2, 0x00fb0970, 0x00c4deec, 0x02629eef, 0x00b1654f, 0x01e1a284, 0x03aa426e, 0x00851405, 0x0032541d}}}, + {X: Field{[10]uint32{0x00d5e169, 0x0139e318, 0x03b1ff75, 0x022a149e, 0x03da57c1, 0x02268900, 0x0327ced0, 0x004e7b5c, 0x0145af71, 0x001c5c1f}}, Y: Field{[10]uint32{0x00223ef9, 0x037a75c4, 0x0185f1b9, 0x00e7f4f1, 0x013eef0f, 0x01691df7, 0x034e4a85, 0x029bce8f, 0x0084fe4d, 0x00092cd9}}}, + {X: Field{[10]uint32{0x03df9a05, 0x029c1b93, 0x028c07dd, 0x03db5cc8, 0x015b1f5f, 0x01ae3fd4, 0x01cf4d23, 0x03d64675, 0x02030296, 0x0014b077}}, Y: Field{[10]uint32{0x02344d0e, 0x0074d356, 0x03c5135d, 0x00524181, 0x01c95097, 0x0368ede1, 0x00066e4f, 0x0355d0e1, 0x01590d73, 0x0036e563}}}, + {X: Field{[10]uint32{0x0368912f, 0x007a9888, 0x03120d8b, 0x001f7e09, 0x0374dc20, 0x02f32ee1, 0x0291989c, 0x03a114c1, 0x00b07852, 0x001ec270}}, Y: Field{[10]uint32{0x002bd263, 0x0027a13e, 0x01f3be9c, 0x01736a5e, 0x0109545a, 0x01e0ae93, 0x02ebeeb0, 0x00a05f43, 0x0317ffc5, 0x0013b7d5}}}, + {X: Field{[10]uint32{0x03b8300a, 0x031a277f, 0x02540681, 0x01899acc, 0x03f26e70, 0x038ecf00, 0x00088343, 0x0346a0af, 0x00ceb29a, 0x003a661c}}, Y: Field{[10]uint32{0x01597f9f, 0x01e16a33, 0x00fadc6f, 0x00f6448c, 0x008ff75e, 0x005345ea, 0x0012dbc6, 0x01f596f3, 0x01927894, 0x0020202b}}}, + {X: Field{[10]uint32{0x005c38e7, 0x00e90d08, 0x02444adc, 0x02f4ae44, 0x022dd2c2, 0x00f5317b, 0x01b4cb9c, 0x0204e617, 0x026de28b, 0x0031f88c}}, Y: Field{[10]uint32{0x02ad940e, 0x02fd7871, 0x0099d195, 0x023150f6, 0x01d31adf, 0x005df3c1, 0x0387000e, 0x0332547e, 0x03f9cdc0, 0x0017ca18}}}, + {X: Field{[10]uint32{0x023f7965, 0x026d574f, 0x02244119, 0x01ad7a94, 0x014c6bb6, 0x023ee922, 0x0186bfd2, 0x02f5e0f1, 0x02c84ca7, 0x00220d65}}, Y: Field{[10]uint32{0x00e9282e, 0x01af3896, 0x03ac6940, 0x016da3b3, 0x0147a22f, 0x00a516b2, 0x02d6d4a7, 0x017c4325, 0x03e85925, 0x003ec452}}}, + {X: Field{[10]uint32{0x020b42cc, 0x03adf8fc, 0x02dcf7ff, 0x0165794c, 0x035cf616, 0x01f95b9f, 0x03029dd3, 0x0103d6c3, 0x0248a196, 0x001fdce9}}, Y: Field{[10]uint32{0x00ff4feb, 0x013fea20, 0x0107f4a9, 0x006e7565, 0x0108ef19, 0x028ed09b, 0x022df3eb, 0x02bb7ed3, 0x008af931, 0x0013dd89}}}, + {X: Field{[10]uint32{0x0341aa3d, 0x030e0aa5, 0x015bddb9, 0x026a291e, 0x0218c873, 0x00465a99, 0x03b56040, 0x0340eb38, 0x034a3660, 0x003227b8}}, Y: Field{[10]uint32{0x02923884, 0x0346e544, 0x02084684, 0x0192e677, 0x03068387, 0x003bca4b, 0x0379ac9d, 0x02b15fcb, 0x008835fb, 0x002928ee}}}, + {X: Field{[10]uint32{0x0141d5bc, 0x0313b4f6, 0x023fd566, 0x02250c15, 0x01b5c468, 0x007607c6, 0x0050cf43, 0x00313940, 0x0056d7dc, 0x00092f93}}, Y: Field{[10]uint32{0x029e6213, 0x0268217c, 0x001cbac0, 0x031e95bf, 0x010f6a5f, 0x03c6b5da, 0x00714a2a, 0x00c5757c, 0x02e24936, 0x00381c8d}}}, + {X: Field{[10]uint32{0x000b94f5, 0x02e614f9, 0x02852c4e, 0x00749a4d, 0x022866a9, 0x008dea7c, 0x00ee5c53, 0x007001e6, 0x031ecaa9, 0x001b0c79}}, Y: Field{[10]uint32{0x00cf8cd7, 0x00f0e167, 0x03922572, 0x0365203d, 0x0134543c, 0x00c2e53a, 0x0117e0ac, 0x00b34704, 0x03232b5f, 0x00196bfc}}}, + {X: Field{[10]uint32{0x0258b7e7, 0x0007b5e3, 0x02286926, 0x01d34c7e, 0x03e470a5, 0x02d860e7, 0x003c0229, 0x01a4f4f8, 0x033c8479, 0x00141b0d}}, Y: Field{[10]uint32{0x01b7ab65, 0x00feb280, 0x023ca167, 0x01db83ff, 0x03e24f86, 0x001ffba0, 0x00bd4ae7, 0x0140d49a, 0x03d3a57c, 0x0013f42f}}}, + {X: Field{[10]uint32{0x018349a4, 0x0314ccb2, 0x01b45b48, 0x00247700, 0x0057571a, 0x01c7dcc7, 0x027b0978, 0x01b3185b, 0x01f3ea1a, 0x00167669}}, Y: Field{[10]uint32{0x01fc8447, 0x005b8355, 0x0363821c, 0x004c6a9a, 0x0153aadf, 0x029fb94e, 0x03c348f0, 0x025b0c98, 0x033eee64, 0x00252b4d}}}, + {X: Field{[10]uint32{0x02d75c69, 0x00e06cc8, 0x008d64de, 0x0274d991, 0x01c6f892, 0x01b399f5, 0x001912fa, 0x005923d9, 0x03ab6537, 0x00294933}}, Y: Field{[10]uint32{0x01782823, 0x028daa51, 0x0214471a, 0x01630fd1, 0x02ac1b61, 0x02f9f1e6, 0x026ae90b, 0x0356645e, 0x03f987fb, 0x0005309b}}}, + {X: Field{[10]uint32{0x0348c550, 0x03cb195f, 0x0276a92a, 0x03537c9b, 0x038aa3fd, 0x029ac8e4, 0x000d3ac6, 0x018c1e1f, 0x006df83c, 0x00049b26}}, Y: Field{[10]uint32{0x014c5c5c, 0x00595acf, 0x03d39774, 0x00757a6b, 0x003f74ab, 0x006b1cb8, 0x00f04dd3, 0x01be3cef, 0x01d3a56a, 0x0020214e}}}, + {X: Field{[10]uint32{0x00e39722, 0x0211d283, 0x01db7318, 0x035ee6a0, 0x00d8ff25, 0x03341554, 0x01a9d5b4, 0x033ec9f8, 0x03c01aeb, 0x000cb2ae}}, Y: Field{[10]uint32{0x03bccee9, 0x01bfac63, 0x035bb957, 0x0087eaa7, 0x02be1910, 0x03b9ad4a, 0x02c070f6, 0x00c71004, 0x020ae080, 0x001f4c04}}}, + {X: Field{[10]uint32{0x02f42c64, 0x03873e08, 0x025da359, 0x01905b70, 0x028a9f08, 0x0356992a, 0x00975aba, 0x035be2a6, 0x00baf7de, 0x000ff787}}, Y: Field{[10]uint32{0x035ac075, 0x00f2580b, 0x03f919ee, 0x02858373, 0x0044ffed, 0x024484b3, 0x0293cae6, 0x03c5d2c3, 0x00ac61f0, 0x0003943f}}}, + {X: Field{[10]uint32{0x01462e24, 0x024cb1c4, 0x0326b3ce, 0x00dc7b87, 0x0336e9db, 0x02c409c9, 0x013a08d6, 0x037ef007, 0x02cad6c3, 0x00272b48}}, Y: Field{[10]uint32{0x00461c6b, 0x0136e554, 0x015a6882, 0x00653967, 0x03422bb1, 0x02aaeed4, 0x00781cb0, 0x033411fc, 0x031d873d, 0x0016ba13}}}, + {X: Field{[10]uint32{0x015872ef, 0x014b465f, 0x0024e1c6, 0x027e4927, 0x010c20cf, 0x00706beb, 0x00ca18e9, 0x01d898ea, 0x0020aa80, 0x00026164}}, Y: Field{[10]uint32{0x03c73e69, 0x00152e34, 0x02dd6a3d, 0x03aecccb, 0x01a084e7, 0x03617e8e, 0x00976f72, 0x01f5b91c, 0x03fd21ab, 0x001150c8}}}, + {X: Field{[10]uint32{0x024eb2b6, 0x00c6e791, 0x033a9d8c, 0x014f112c, 0x00ac00bc, 0x02094a07, 0x03093b6c, 0x032f568a, 0x01a3e7cb, 0x002085a6}}, Y: Field{[10]uint32{0x02a9726a, 0x001cead9, 0x0384023b, 0x0146f39b, 0x03e62cf4, 0x02ef4fa7, 0x0344cbcb, 0x032e6dca, 0x00172400, 0x003df567}}}, + {X: Field{[10]uint32{0x00d370d9, 0x029fdb63, 0x02dad74e, 0x030ff0a1, 0x00440b3c, 0x031233ae, 0x01fc7a55, 0x00e189e5, 0x00be3642, 0x002f41b5}}, Y: Field{[10]uint32{0x0183b90e, 0x03354218, 0x017140ac, 0x014fef34, 0x0361bb12, 0x032ee023, 0x00a56632, 0x03b22329, 0x013a0fdc, 0x000ec246}}}, + {X: Field{[10]uint32{0x03bdf4d2, 0x010448d2, 0x038225bc, 0x013645df, 0x02bb4b73, 0x0010f1b2, 0x00a4ed0e, 0x031e37c1, 0x02e79c8c, 0x000b1c44}}, Y: Field{[10]uint32{0x00391243, 0x00fb108e, 0x01afd6e0, 0x03bd97fc, 0x02bae242, 0x02403d87, 0x012884ad, 0x008921d8, 0x03add42e, 0x00320733}}}, + {X: Field{[10]uint32{0x0122131e, 0x02deabf8, 0x03905762, 0x01bbc660, 0x03b7f523, 0x0377e73a, 0x03cbb8c9, 0x01dcb20c, 0x010fa65d, 0x00146b8e}}, Y: Field{[10]uint32{0x017ba06e, 0x01b86a3b, 0x02ec8125, 0x0387a13a, 0x000f1e96, 0x01f6edc5, 0x02f2a888, 0x01ac18a0, 0x03808040, 0x000f5f27}}}, + {X: Field{[10]uint32{0x02cc59ea, 0x0209b936, 0x027a177d, 0x01c9ae45, 0x02c74326, 0x00ecc4d5, 0x00b8348e, 0x01e90caf, 0x0112de23, 0x00316778}}, Y: Field{[10]uint32{0x01903b25, 0x0131a275, 0x012b0285, 0x000ea381, 0x00aa33e4, 0x017859db, 0x009c1d9c, 0x02d9b67c, 0x03167c5e, 0x000d8427}}}, + {X: Field{[10]uint32{0x0156d978, 0x000608fd, 0x030f757d, 0x039a4867, 0x02077ca1, 0x015d4c09, 0x01cb89a4, 0x02766c54, 0x023ab750, 0x0022e67c}}, Y: Field{[10]uint32{0x016a4164, 0x0380203d, 0x00e9adc8, 0x00be4132, 0x00d338e1, 0x02f355cf, 0x033cf0e4, 0x03f913d4, 0x02adf53a, 0x0021a8c6}}}, + {X: Field{[10]uint32{0x00369dd5, 0x0382ae5e, 0x0271739f, 0x01f277ba, 0x0261f5fb, 0x03bc620b, 0x024135a1, 0x02a6f67b, 0x03657d6f, 0x001319c3}}, Y: Field{[10]uint32{0x03e65417, 0x002de5fb, 0x01dd3c10, 0x00d46d4e, 0x01b54e04, 0x01fe2474, 0x0075dc10, 0x014d8c4a, 0x02265d4b, 0x0014c6a0}}}, + {X: Field{[10]uint32{0x00f38548, 0x0233b778, 0x0333d938, 0x037277c3, 0x0036aed9, 0x015fc190, 0x03024e6e, 0x003e57f5, 0x02359daa, 0x0023a59f}}, Y: Field{[10]uint32{0x010d218f, 0x0285d946, 0x00d2f1f1, 0x02c7c058, 0x0145fa0a, 0x028440e0, 0x008b833b, 0x03ea9632, 0x015ba59a, 0x000dbe01}}}, + {X: Field{[10]uint32{0x032ac9e1, 0x03a78cce, 0x03c3ec82, 0x01f0231e, 0x015e2e09, 0x03c33256, 0x007bfaac, 0x028df417, 0x01159c45, 0x000fd846}}, Y: Field{[10]uint32{0x0197d7d6, 0x00cb80b5, 0x014faf6c, 0x03b896dd, 0x03b9d2f3, 0x03bab694, 0x02087578, 0x01f7148f, 0x034ab743, 0x00032004}}}, + {X: Field{[10]uint32{0x007641d9, 0x0140033d, 0x007459f8, 0x020e1c1c, 0x0366bba6, 0x01faf7b7, 0x03b203ac, 0x0104ad4f, 0x009d7c61, 0x000fd679}}, Y: Field{[10]uint32{0x003ad5b0, 0x038958e9, 0x010f2ae3, 0x01e261b5, 0x0264cd09, 0x03d77353, 0x038f1010, 0x037f8f48, 0x00884243, 0x002fb75c}}}, + {X: Field{[10]uint32{0x03f6d490, 0x032be1d6, 0x02781bbb, 0x036865e8, 0x01ad46d4, 0x033c5c3a, 0x0044b5bf, 0x00da90ef, 0x00c9b648, 0x0016df61}}, Y: Field{[10]uint32{0x034d984f, 0x00ffb0ac, 0x0156a7c7, 0x016e64a0, 0x03f2164e, 0x001f7c12, 0x00b89755, 0x02c3ffeb, 0x029cc7d6, 0x0027d56c}}}, + {X: Field{[10]uint32{0x01744b1c, 0x030a7a94, 0x02a88962, 0x003681c6, 0x0390decf, 0x02bf0faa, 0x03bf1f9a, 0x03a0f3dc, 0x00ae0ac3, 0x00387b9d}}, Y: Field{[10]uint32{0x01277030, 0x0331423c, 0x0221650a, 0x016e0319, 0x01eefbe1, 0x020e60e7, 0x028d6748, 0x02149415, 0x02f8b34e, 0x0027a1b4}}}, + {X: Field{[10]uint32{0x03eea871, 0x03125ada, 0x0200e5dd, 0x02b2fbb8, 0x01eba721, 0x025b29fb, 0x0196c22e, 0x0251238c, 0x015b8d48, 0x003e8733}}, Y: Field{[10]uint32{0x039bc469, 0x0396154b, 0x01829d25, 0x012ff4aa, 0x02851350, 0x01e95b5f, 0x02479a8a, 0x01995275, 0x019a326a, 0x0038adfd}}}, + {X: Field{[10]uint32{0x03fdc8bf, 0x03c30e9e, 0x027a04c9, 0x01afde97, 0x00b29231, 0x02d298eb, 0x02199d1a, 0x0182587d, 0x00d70f38, 0x003bc787}}, Y: Field{[10]uint32{0x0298ef05, 0x014430ae, 0x00687eeb, 0x01dd5677, 0x025783d3, 0x0104794c, 0x015dadce, 0x0044760e, 0x0001a9de, 0x00133be7}}}, + {X: Field{[10]uint32{0x01326120, 0x0391a2b8, 0x02e8e9b3, 0x02565687, 0x020fe9c3, 0x01204f6c, 0x025cc4ed, 0x034eeb7e, 0x02b93e75, 0x0036dc53}}, Y: Field{[10]uint32{0x0271a206, 0x00a56a9a, 0x0067f618, 0x00059970, 0x00fa3cb7, 0x02205a10, 0x0130311c, 0x01e3d213, 0x0286b812, 0x000f7126}}}, + {X: Field{[10]uint32{0x02ea5d5a, 0x03ccbfb9, 0x0045229a, 0x031e6b47, 0x03d70c79, 0x03a74ffa, 0x00cf936e, 0x00a1610f, 0x038dbd57, 0x001665fc}}, Y: Field{[10]uint32{0x03e4a224, 0x01a695a5, 0x00eec45a, 0x01e37d52, 0x031f44b6, 0x01970777, 0x0349e089, 0x00046ee5, 0x0062b716, 0x002b7df6}}}, + {X: Field{[10]uint32{0x03baeb92, 0x03bb0f4e, 0x00039ea4, 0x02f4ef1b, 0x02956654, 0x03f07f1e, 0x008ae666, 0x0015ddec, 0x02d90a92, 0x0025f5bd}}, Y: Field{[10]uint32{0x020068b9, 0x03c6d730, 0x03c684bd, 0x037d39ff, 0x03ce03fe, 0x00f7eefd, 0x015ab971, 0x0261536b, 0x0047ff21, 0x002d1437}}}, + {X: Field{[10]uint32{0x02d307c4, 0x00034016, 0x010abc4b, 0x032875ac, 0x0040232b, 0x013bbe67, 0x0149ae3c, 0x02dcada5, 0x03cd5ec8, 0x0013d14f}}, Y: Field{[10]uint32{0x01683f7f, 0x01303482, 0x038160b9, 0x017b59a3, 0x00bd61f1, 0x0258367a, 0x02442baf, 0x02f21f1e, 0x0168c4a8, 0x002ab7b5}}}, + {X: Field{[10]uint32{0x009424d6, 0x01c9c165, 0x031e6499, 0x0243036d, 0x00ae4c44, 0x02a9e51b, 0x01c0a6ac, 0x00c0d71c, 0x00a35059, 0x00016981}}, Y: Field{[10]uint32{0x033be9c8, 0x01e9bd04, 0x0186a893, 0x0278bde1, 0x01ae8277, 0x03ea2742, 0x02b92b93, 0x00069e80, 0x00126d87, 0x00395e3f}}}, + {X: Field{[10]uint32{0x03c635b3, 0x0061a581, 0x004985d1, 0x0324d382, 0x022de601, 0x02d7fa3b, 0x024cf0d5, 0x00cbe86d, 0x01a29168, 0x000fcc1c}}, Y: Field{[10]uint32{0x011ad3a3, 0x02147911, 0x0070d053, 0x01706f91, 0x038712f2, 0x0277c390, 0x02adb6f6, 0x02c8cec8, 0x01990bae, 0x003a456c}}}, + {X: Field{[10]uint32{0x001c06e5, 0x01252464, 0x02c45318, 0x01b0bb79, 0x02f7476a, 0x03e67088, 0x0302c5fb, 0x0226b3f3, 0x01cd6431, 0x001d16f0}}, Y: Field{[10]uint32{0x029933f0, 0x024741b4, 0x01d21872, 0x0107409d, 0x00be16cb, 0x0039676d, 0x02519bd1, 0x01dd77a6, 0x034a8703, 0x001668ae}}}, + {X: Field{[10]uint32{0x0237238e, 0x02024449, 0x01942175, 0x00da29b0, 0x01ab3967, 0x018e1e62, 0x03591a60, 0x02567614, 0x028cadb3, 0x002ef41b}}, Y: Field{[10]uint32{0x00b8b690, 0x013b7b4e, 0x00c2a02b, 0x000e9968, 0x00d562b0, 0x0242e1a9, 0x006cb880, 0x0397cf71, 0x0296b484, 0x002b8360}}}, + {X: Field{[10]uint32{0x022cf07c, 0x014ff524, 0x017a385e, 0x01a6debe, 0x029f3eb5, 0x00e8ecd7, 0x00b7e436, 0x02f99a14, 0x01b6128d, 0x003f36a3}}, Y: Field{[10]uint32{0x01551974, 0x03d4d7fe, 0x03f283a0, 0x03a0a817, 0x02cd11f1, 0x03135721, 0x0358ee14, 0x03e6a17d, 0x01fc37a0, 0x0012fcf7}}}, + {X: Field{[10]uint32{0x0073cce2, 0x006b7666, 0x015705ca, 0x025d3b7b, 0x034ed2da, 0x01c84332, 0x025e1132, 0x01f7b4a9, 0x03dffc9c, 0x0018c977}}, Y: Field{[10]uint32{0x00f222e1, 0x0355b4d3, 0x033584d7, 0x003ebc69, 0x027ce193, 0x0185e7fa, 0x00ada7e2, 0x01bf1c5c, 0x0099683e, 0x00227f93}}}, + {X: Field{[10]uint32{0x02ee0d7f, 0x038fca48, 0x02d59245, 0x026d068e, 0x03513df5, 0x009e7429, 0x035797a5, 0x014258ea, 0x00a69349, 0x001dd653}}, Y: Field{[10]uint32{0x01faabb2, 0x023760f9, 0x024a9581, 0x00ef299a, 0x03631df0, 0x03cbbd63, 0x02ddf45e, 0x02ff23f7, 0x01122ccf, 0x000657ac}}}, + {X: Field{[10]uint32{0x02a67867, 0x005514ae, 0x0027bede, 0x01f80c21, 0x02e2defd, 0x019649dc, 0x01348fdc, 0x0090bd3c, 0x0067ea9b, 0x003cd5bb}}, Y: Field{[10]uint32{0x0233ba7a, 0x00bed335, 0x00121e4a, 0x00423c41, 0x03d75a21, 0x03262c0f, 0x02b71459, 0x023a9268, 0x01b9e23f, 0x000f4899}}}, + {X: Field{[10]uint32{0x00a205c9, 0x03f74bbe, 0x012ffcad, 0x002d6428, 0x0186149f, 0x03e2b9be, 0x00e30914, 0x02923b1e, 0x02129b0f, 0x000cd82b}}, Y: Field{[10]uint32{0x01d18a34, 0x014b7dc9, 0x00b83dcb, 0x01478cdf, 0x023d7a20, 0x00ac2989, 0x00098722, 0x016844fb, 0x03f2720d, 0x001e6cde}}}, + {X: Field{[10]uint32{0x01e8727b, 0x0056b4fe, 0x032823fc, 0x02ae7fc3, 0x03b29040, 0x0311d84f, 0x031a4c5f, 0x031436cc, 0x0352c703, 0x00113a43}}, Y: Field{[10]uint32{0x02f55f17, 0x027b0178, 0x02feb400, 0x00789b45, 0x0295c249, 0x00624cbd, 0x02d013a7, 0x00f9bd8d, 0x03419265, 0x0018b7ec}}}, + {X: Field{[10]uint32{0x02c84047, 0x000ad793, 0x0209ee79, 0x0225462a, 0x01c9e042, 0x02ca3f8d, 0x01958764, 0x02b888c4, 0x03a9b5c3, 0x003974d9}}, Y: Field{[10]uint32{0x02f8bcf0, 0x02a62f39, 0x02ace9c9, 0x02d308e0, 0x03fbbc06, 0x001c14b9, 0x0337c069, 0x03c3e9be, 0x017f01ab, 0x003a86c9}}}, + {X: Field{[10]uint32{0x01a63957, 0x01504ed6, 0x038de100, 0x02af820e, 0x010559ba, 0x008a01a9, 0x0061e6d4, 0x0396b4f0, 0x00fd7910, 0x00211e3a}}, Y: Field{[10]uint32{0x022df1d6, 0x0306f0c6, 0x03d5cfd8, 0x02f6d24b, 0x032f3f1e, 0x0052f52f, 0x03e38c45, 0x00d2644f, 0x00180519, 0x0013de4d}}}, + {X: Field{[10]uint32{0x0284b42d, 0x033dd84a, 0x01b6dc2c, 0x03ffda15, 0x0010c97d, 0x01e7249d, 0x035e2240, 0x01cc6fd6, 0x03c80587, 0x0030e0c9}}, Y: Field{[10]uint32{0x01abfcd6, 0x015f5493, 0x01b22bc6, 0x03eae157, 0x00a213fe, 0x0004b39d, 0x007d61f5, 0x0040b9fa, 0x03accb1b, 0x003ac0eb}}}, + {X: Field{[10]uint32{0x0051f10a, 0x00ad486f, 0x0214cd62, 0x02d9813b, 0x024662b4, 0x005fca28, 0x00f48c9d, 0x0299c956, 0x00125348, 0x002e7a2a}}, Y: Field{[10]uint32{0x031ccfee, 0x02b5ccbb, 0x0344ce3d, 0x02ee5e85, 0x033813e7, 0x01dc6d48, 0x02a02241, 0x0341ed47, 0x000d65fc, 0x000d709e}}}, + {X: Field{[10]uint32{0x01cc713e, 0x0229ca69, 0x030fdcc6, 0x00f48506, 0x03d3c3b5, 0x002ea1ab, 0x012e4837, 0x028c94e3, 0x02d595cf, 0x002952a8}}, Y: Field{[10]uint32{0x03b8a159, 0x03ea81a2, 0x02baf4e1, 0x02e68cba, 0x007e9552, 0x02a14692, 0x036b9c86, 0x00acbb99, 0x006e63c0, 0x002fdd37}}}, + {X: Field{[10]uint32{0x029fd956, 0x006787f6, 0x015ea4cc, 0x02b61735, 0x00420ce2, 0x02e2212b, 0x00ad145f, 0x0153ae11, 0x003ce2df, 0x003517fb}}, Y: Field{[10]uint32{0x00b81bd6, 0x03122fe3, 0x0208d205, 0x039fb9d2, 0x00bf6be1, 0x02308235, 0x001dbf9b, 0x032da9a4, 0x030065ae, 0x003b633e}}}, + {X: Field{[10]uint32{0x03192172, 0x03892b54, 0x0310187b, 0x02ae390c, 0x005c0136, 0x013360db, 0x0159829d, 0x02cc632a, 0x0298f728, 0x003d2d13}}, Y: Field{[10]uint32{0x01ea9fa1, 0x030a8262, 0x024e84d3, 0x022fc2a9, 0x012febdd, 0x033dee37, 0x0041fd88, 0x033924b2, 0x01b3960b, 0x003bd548}}}, + {X: Field{[10]uint32{0x013d67e3, 0x00b5090d, 0x039e2841, 0x031b8982, 0x00dcec40, 0x0214cc1e, 0x020cd40e, 0x024443ea, 0x01bf0d34, 0x0037b1b4}}, Y: Field{[10]uint32{0x01095895, 0x028bee99, 0x03b7254c, 0x02cc9041, 0x039451b0, 0x00bff243, 0x02fe44f3, 0x032405c7, 0x03813609, 0x001ce85b}}}, + {X: Field{[10]uint32{0x03ff013e, 0x02d6deac, 0x02039238, 0x0092f069, 0x01265f1c, 0x009cd4d3, 0x010b9c02, 0x01f1064c, 0x015372e1, 0x0007ef37}}, Y: Field{[10]uint32{0x006c27ca, 0x031dfc93, 0x0374f22b, 0x01d628a9, 0x03b2358f, 0x01c9d551, 0x004d14b9, 0x00704483, 0x034a06a6, 0x00273d3f}}}, + {X: Field{[10]uint32{0x02ab593b, 0x0004bef8, 0x03890357, 0x03e6a90e, 0x0250ea1f, 0x00e8c76a, 0x02d53f49, 0x01bb5deb, 0x00cb038c, 0x003673bc}}, Y: Field{[10]uint32{0x0253303f, 0x0030b74d, 0x0148604d, 0x004fb410, 0x01e161cd, 0x03c67769, 0x00e66547, 0x01cb56da, 0x02fe2468, 0x000ca905}}}, + {X: Field{[10]uint32{0x03f03da3, 0x01d29807, 0x03ccede1, 0x01f338cf, 0x024e2f60, 0x022348e1, 0x022135f0, 0x00a86117, 0x014988e2, 0x0005906d}}, Y: Field{[10]uint32{0x0194922f, 0x0237ef5f, 0x006fb5b6, 0x03473eb6, 0x0148e3ff, 0x0103e05b, 0x024e1b95, 0x021d9cd9, 0x00d9ed71, 0x003b74fc}}}, + {X: Field{[10]uint32{0x02243cdd, 0x014d9b0e, 0x0376f96c, 0x020eb13b, 0x0237938f, 0x03bd8059, 0x0238b211, 0x027fec6d, 0x00163c5d, 0x00267bdb}}, Y: Field{[10]uint32{0x02f66b48, 0x005da7b5, 0x02499a31, 0x02f9ae87, 0x027f912b, 0x03c10f80, 0x01d7796d, 0x01607787, 0x0362d819, 0x001adbbb}}}, + {X: Field{[10]uint32{0x035bc97c, 0x0119e7d6, 0x03fe4e2f, 0x02ca3a93, 0x02b9c47f, 0x0314d917, 0x03f79b09, 0x00ba2e03, 0x012dc24c, 0x00124d63}}, Y: Field{[10]uint32{0x001cf5b4, 0x00df2bb7, 0x03865378, 0x0121efb8, 0x03b8c807, 0x023872bd, 0x03c1cbff, 0x0103afbd, 0x00a7f9df, 0x00144a85}}}, + {X: Field{[10]uint32{0x00eb206b, 0x03b2119f, 0x02ee8a4e, 0x029690c2, 0x03c8c122, 0x00533ce0, 0x009c5e1a, 0x037fa495, 0x03cfb1de, 0x0038c74f}}, Y: Field{[10]uint32{0x01b0449b, 0x00eb95a9, 0x03687e6c, 0x02b6d379, 0x01effc4d, 0x020d193e, 0x03ad1dde, 0x01d1ec28, 0x026669db, 0x001ef0f0}}}, + {X: Field{[10]uint32{0x02c64adf, 0x00933861, 0x015d44e3, 0x01fe5e68, 0x03ad1fbb, 0x00a35d20, 0x0332e66a, 0x02f2b7ee, 0x01d6ac86, 0x002a0bb2}}, Y: Field{[10]uint32{0x00f74c89, 0x03b1b4c3, 0x01f816c4, 0x03402c78, 0x023a9efa, 0x031de64d, 0x02b46f1a, 0x006b97d2, 0x012bc28b, 0x002eb21f}}}, + {X: Field{[10]uint32{0x00ea113d, 0x02d4f532, 0x01c081bf, 0x030c631c, 0x020dc370, 0x02334eae, 0x01ab82b1, 0x028b891e, 0x01942bff, 0x00085942}}, Y: Field{[10]uint32{0x001fcae3, 0x029df272, 0x03103fec, 0x02fa697c, 0x00f84511, 0x009067e4, 0x0113b6f6, 0x00d142f9, 0x006a2f65, 0x0025ea09}}}, + {X: Field{[10]uint32{0x02dd4b84, 0x03acd8b1, 0x0057f63c, 0x0318f6d6, 0x01e4e666, 0x01123a41, 0x01f8070e, 0x025a21ff, 0x00d8208d, 0x001cd414}}, Y: Field{[10]uint32{0x02b9e2e9, 0x0007e78a, 0x03918900, 0x032eb4c1, 0x00216887, 0x0320866b, 0x03e23f07, 0x0187279b, 0x00385636, 0x000b8fed}}}, + {X: Field{[10]uint32{0x03afe506, 0x02ced991, 0x008ba197, 0x0001e770, 0x0365f878, 0x02e70fa6, 0x00c3813b, 0x0370228d, 0x0061e679, 0x00074086}}, Y: Field{[10]uint32{0x02fd2f1f, 0x029ae9e9, 0x03c50cea, 0x0133b82d, 0x004a10e8, 0x00a56fc2, 0x0292cd0e, 0x0120f427, 0x00b92303, 0x00052db4}}}, + {X: Field{[10]uint32{0x02d7810b, 0x0313d391, 0x0033c1bd, 0x01dd2615, 0x03f91c55, 0x013bfe5b, 0x018c15d5, 0x0225cea1, 0x027486ca, 0x001e9fbb}}, Y: Field{[10]uint32{0x03b498cf, 0x004b2edd, 0x02297c70, 0x006ef078, 0x03448fed, 0x01f46733, 0x035057d8, 0x01439e9f, 0x007f5d91, 0x0017a0e8}}}, + {X: Field{[10]uint32{0x0302beec, 0x039c9b69, 0x00b51f50, 0x0008cbc9, 0x02485938, 0x00a8cab6, 0x0005cce3, 0x00c1851f, 0x03d4fe0a, 0x00020470}}, Y: Field{[10]uint32{0x033d9f0a, 0x03acaf20, 0x034efc95, 0x0274c7b5, 0x03b28e59, 0x016b615d, 0x004214e3, 0x03d3e4ba, 0x016c6c9c, 0x0029bf30}}}, + {X: Field{[10]uint32{0x01ad606c, 0x01f69248, 0x0150b435, 0x0020c2ba, 0x03ca25ed, 0x0112c9b4, 0x00d5b1ee, 0x027a3c09, 0x003889ea, 0x000b2851}}, Y: Field{[10]uint32{0x0026c551, 0x004398c4, 0x0186f42e, 0x038dd04f, 0x03c5e90b, 0x03e39884, 0x002c6560, 0x028a7c2a, 0x02c692d8, 0x001ed229}}}, + {X: Field{[10]uint32{0x010277bf, 0x02c7c7ce, 0x01c80d57, 0x02977bba, 0x005dd3e0, 0x015f9989, 0x01566d29, 0x006bf0ce, 0x03e16104, 0x002a603f}}, Y: Field{[10]uint32{0x03a1c64c, 0x01051581, 0x007fd10e, 0x0015c739, 0x01457d50, 0x0285d366, 0x03440797, 0x00d0ee1d, 0x03a2a139, 0x000c9dbd}}}, + {X: Field{[10]uint32{0x01cd80bd, 0x0275bab6, 0x026bc957, 0x02639977, 0x01fde41d, 0x026364dc, 0x002954a9, 0x02dd3f16, 0x03d9cbcc, 0x00395c28}}, Y: Field{[10]uint32{0x02973a52, 0x026af905, 0x022df273, 0x01af1f7a, 0x019400bc, 0x00b05a2f, 0x01d30351, 0x00e63826, 0x01776658, 0x00169d24}}}, + {X: Field{[10]uint32{0x03ce1110, 0x025530de, 0x018c972b, 0x03ed988d, 0x0171bd25, 0x024a02eb, 0x013d985d, 0x03d4399b, 0x02b8952c, 0x003d7eea}}, Y: Field{[10]uint32{0x03d77175, 0x03d5fcc7, 0x006cfb02, 0x023400eb, 0x03801081, 0x01229d13, 0x03097c9b, 0x03e08693, 0x01236179, 0x0006b288}}}, + {X: Field{[10]uint32{0x018d89be, 0x0277a85c, 0x03375555, 0x017b136f, 0x016f9e52, 0x012adf1d, 0x0008d258, 0x02a2b055, 0x02fbecbd, 0x000b9650}}, Y: Field{[10]uint32{0x00bc790b, 0x0155bec5, 0x0201640c, 0x006a3032, 0x0230e12a, 0x01ad6498, 0x0123d6cf, 0x02669e3c, 0x0107d141, 0x00254419}}}, + {X: Field{[10]uint32{0x015dd296, 0x00cc006d, 0x0013ea2f, 0x00fe9ce5, 0x010a9fc8, 0x026eadc1, 0x01e7f64a, 0x0267a5b2, 0x00a9891c, 0x0024af41}}, Y: Field{[10]uint32{0x022ba587, 0x0067eb60, 0x01fbf130, 0x00d08859, 0x035cc71c, 0x005eda83, 0x0017ba68, 0x03f67395, 0x0333659b, 0x0033d78d}}}, + {X: Field{[10]uint32{0x03b11083, 0x034c1069, 0x008ffed7, 0x02c219c9, 0x024d0e52, 0x00f77358, 0x00c54269, 0x03ab878f, 0x019fa50f, 0x000c377f}}, Y: Field{[10]uint32{0x02eb42ed, 0x036bd989, 0x0241b14b, 0x003e1eb1, 0x0221bdfa, 0x03d09a72, 0x00389e3d, 0x020fbe86, 0x00fe2bb1, 0x003fc574}}}, + {X: Field{[10]uint32{0x012a9f4f, 0x00e779c9, 0x03f1cbaf, 0x036dcbe9, 0x00067ddd, 0x0115c679, 0x03196882, 0x031a2abc, 0x010bdf8a, 0x00233d45}}, Y: Field{[10]uint32{0x0186cfd5, 0x003f0150, 0x0007a213, 0x02ad0516, 0x002a9963, 0x00232636, 0x0318bc25, 0x02ec660e, 0x017ba299, 0x00130a12}}}, + {X: Field{[10]uint32{0x025e46c7, 0x00ca2149, 0x001b8690, 0x002637b3, 0x014a8e3c, 0x03db765e, 0x02ed9f74, 0x013becf2, 0x02fd5097, 0x0007d2d3}}, Y: Field{[10]uint32{0x039fd399, 0x031bfac5, 0x00a76ee1, 0x00a49940, 0x02685352, 0x011f1f02, 0x00adeb8a, 0x02c0370e, 0x00c7f7c6, 0x001b12c1}}}, + {X: Field{[10]uint32{0x0091af81, 0x00a2c634, 0x029a22a0, 0x02e43cb8, 0x003f915c, 0x004f40e3, 0x01883bad, 0x03e8ce35, 0x0100979a, 0x00275492}}, Y: Field{[10]uint32{0x0002be38, 0x0059e79a, 0x033e1e0f, 0x031c2e69, 0x03db3257, 0x02c5874c, 0x004453d6, 0x01ccb444, 0x013c037c, 0x00102684}}}, + {X: Field{[10]uint32{0x01a2e3a1, 0x01fcd2f7, 0x00734c62, 0x0133cfec, 0x005b0398, 0x0308d00f, 0x01c124c1, 0x036743f5, 0x00e446ee, 0x0014b879}}, Y: Field{[10]uint32{0x008320a7, 0x010c85c2, 0x03e5b262, 0x00c1d69d, 0x02e2dbc6, 0x00b05c4e, 0x004104f1, 0x03fea30f, 0x03317375, 0x0019d295}}}, + {X: Field{[10]uint32{0x02401c8b, 0x00bdea05, 0x03148fd2, 0x024e9df5, 0x020e0a6c, 0x031b8dbe, 0x00a8b6e7, 0x0138c79b, 0x031a8eef, 0x00209ec5}}, Y: Field{[10]uint32{0x03ca7540, 0x017cd93d, 0x01f08827, 0x03e84a7e, 0x001d58c7, 0x01e2e845, 0x026d14cb, 0x00073df7, 0x01fdd9b8, 0x00197361}}}, + {X: Field{[10]uint32{0x00df2f9b, 0x03e45edb, 0x00383c83, 0x01506fa8, 0x023db299, 0x0160b891, 0x01abc32e, 0x025909a8, 0x01e961d8, 0x000493d1}}, Y: Field{[10]uint32{0x038d6c62, 0x02d359e5, 0x00f8358b, 0x01f484e9, 0x03e48e7a, 0x018a23e1, 0x020626fc, 0x0196c4b5, 0x03e4110b, 0x001cd38b}}}, + {X: Field{[10]uint32{0x024d67e2, 0x03d5a666, 0x011695f5, 0x035b0234, 0x00fb4ac9, 0x02648131, 0x024f0028, 0x02cc9043, 0x029818b2, 0x0000edc4}}, Y: Field{[10]uint32{0x02c27c3b, 0x01f07ed0, 0x02218560, 0x01a2862b, 0x0154ba63, 0x03119582, 0x0010c51e, 0x005ad570, 0x038b0cee, 0x000a2dbd}}}, + {X: Field{[10]uint32{0x012d8a00, 0x000ced54, 0x020a4290, 0x02871fdf, 0x02e2b887, 0x029ab9c3, 0x0264485e, 0x014d8c39, 0x007e063b, 0x00349c76}}, Y: Field{[10]uint32{0x016da847, 0x008e3ae7, 0x01c9b510, 0x009cd25c, 0x0060ef59, 0x03619134, 0x03122ba8, 0x038a009c, 0x00047865, 0x0019750e}}}, + {X: Field{[10]uint32{0x00dc03a7, 0x0252c943, 0x01661e84, 0x0326b9ef, 0x000c5ca0, 0x00ae954b, 0x00d2d82e, 0x0145819f, 0x01852db3, 0x0007471b}}, Y: Field{[10]uint32{0x02691f62, 0x02c40153, 0x02ebbae8, 0x0132f75e, 0x01e19f87, 0x02bba80d, 0x01b68407, 0x00095bba, 0x00c5673a, 0x002f0c7d}}}, + {X: Field{[10]uint32{0x02efdd9d, 0x01d5bf51, 0x007fb1d3, 0x0331a559, 0x00bf8d2e, 0x02e81f79, 0x02d274c0, 0x02530376, 0x01b471e3, 0x0023fba2}}, Y: Field{[10]uint32{0x012b8c6c, 0x0298bc6f, 0x034c434c, 0x01c51aa6, 0x034ba5cf, 0x00663e73, 0x03ae1487, 0x015e3f45, 0x00c38479, 0x001757b4}}}, + {X: Field{[10]uint32{0x0010a6ec, 0x03ef4c22, 0x02ce55d7, 0x017e4236, 0x018ef938, 0x038fb91d, 0x026302cc, 0x03cd4580, 0x030955a0, 0x001a07f3}}, Y: Field{[10]uint32{0x02a38faa, 0x00d63280, 0x00885e6d, 0x03d0643c, 0x00aa54e8, 0x013195d7, 0x0187edbc, 0x01d89200, 0x035b9992, 0x0010c1fd}}}, + {X: Field{[10]uint32{0x03a6971b, 0x024a4dec, 0x02918907, 0x0225ff0c, 0x026f6c1a, 0x001334f8, 0x0184a289, 0x029c6da9, 0x02ddfcb5, 0x001c5ff5}}, Y: Field{[10]uint32{0x00b17992, 0x036167d6, 0x02511d7c, 0x0174d075, 0x021b05e2, 0x01fdb6a3, 0x00405532, 0x02b4137f, 0x002971d4, 0x002d00fe}}}, + {X: Field{[10]uint32{0x014f2ff6, 0x0004f8dd, 0x03a34227, 0x01e71cc8, 0x00d29832, 0x02b630d0, 0x01f49986, 0x025e1b70, 0x032394eb, 0x003cae55}}, Y: Field{[10]uint32{0x0366763b, 0x02925f9d, 0x0120ddba, 0x00179e99, 0x03bb69e7, 0x02645edc, 0x009645dd, 0x033505c6, 0x03813efd, 0x002d54f4}}}, + {X: Field{[10]uint32{0x02730b1b, 0x01d21765, 0x017b1423, 0x0340755b, 0x019ab6fe, 0x00504d70, 0x0309b524, 0x01b22594, 0x03e6d7d8, 0x00161c52}}, Y: Field{[10]uint32{0x03e3e533, 0x0293579b, 0x03cf81c9, 0x01717e93, 0x03403984, 0x0038c54d, 0x02b84abf, 0x03396f7a, 0x03343e38, 0x00030047}}}, + {X: Field{[10]uint32{0x026ff3c3, 0x0056f01e, 0x0223b7f9, 0x03eecafa, 0x02b30819, 0x0271ad3e, 0x0300d49e, 0x03e306e5, 0x01abc828, 0x0034cf39}}, Y: Field{[10]uint32{0x01a23395, 0x0293045d, 0x0156fcac, 0x013cdf6e, 0x01ef5939, 0x03ef88bc, 0x0372ba63, 0x01262088, 0x02223913, 0x001ce6d8}}}, + {X: Field{[10]uint32{0x03b55479, 0x01ec9b58, 0x020d5983, 0x00235be4, 0x02249048, 0x00bdf652, 0x03a58ff4, 0x0004a13a, 0x0232fc7d, 0x0020880b}}, Y: Field{[10]uint32{0x0163b4c8, 0x000ced89, 0x0004dedd, 0x000a6800, 0x0063aa32, 0x02b0b220, 0x004fb0a8, 0x015793f3, 0x015450aa, 0x003f798e}}}, + {X: Field{[10]uint32{0x01ea7781, 0x027e9f0b, 0x022b7041, 0x021e8d09, 0x02941e64, 0x00322d92, 0x0300e370, 0x013223e8, 0x02185bfb, 0x0009798c}}, Y: Field{[10]uint32{0x0316e640, 0x03736fbd, 0x02a1142d, 0x00915230, 0x0209caa1, 0x019cc75f, 0x032d84cc, 0x02ae6537, 0x03074802, 0x002b9a5a}}}, + {X: Field{[10]uint32{0x005c114e, 0x006a56d8, 0x0048753c, 0x00e87bf7, 0x039da877, 0x010e837f, 0x0068a363, 0x01386bc9, 0x0205b925, 0x00380cda}}, Y: Field{[10]uint32{0x03b12a18, 0x036762eb, 0x01050d96, 0x0056776b, 0x015ba059, 0x011899b1, 0x03974553, 0x0368e1e6, 0x0160377a, 0x001075d6}}}, + {X: Field{[10]uint32{0x02996662, 0x01cc6aa6, 0x0375262d, 0x016b6d5e, 0x0134ee87, 0x01092270, 0x01a9253e, 0x02c6f472, 0x03af7fd2, 0x00210cd8}}, Y: Field{[10]uint32{0x03cde6ca, 0x034d58bf, 0x004734d2, 0x02c59b92, 0x0012c4b3, 0x0054e8ca, 0x00bda36f, 0x03c04fb5, 0x02d1dbfc, 0x00397028}}}, + {X: Field{[10]uint32{0x011178de, 0x03d8cca5, 0x03c0526d, 0x000a74a0, 0x03abb9f2, 0x029f95d8, 0x03955cff, 0x01fc63e5, 0x00b81cdb, 0x002b6c84}}, Y: Field{[10]uint32{0x00ea0e35, 0x02e4695d, 0x02cf068e, 0x03b0b86f, 0x01364db5, 0x0122be84, 0x03847219, 0x00aa9835, 0x0305d818, 0x000b0847}}}, + {X: Field{[10]uint32{0x024d7491, 0x019450bc, 0x036e088b, 0x0139615e, 0x02203460, 0x02684de4, 0x013854f5, 0x0088d7ba, 0x03a1a2fe, 0x002ac317}}, Y: Field{[10]uint32{0x000124d2, 0x00bde16e, 0x0132b8d9, 0x0337b29a, 0x03b9dc48, 0x01ce0d54, 0x00a73840, 0x01b855c7, 0x01cbe36d, 0x003951c9}}}, + {X: Field{[10]uint32{0x0085deda, 0x02f2235e, 0x01835f9c, 0x002d9eb3, 0x03868a08, 0x03d3d51c, 0x03124b0a, 0x018f90fc, 0x037a1d21, 0x000f9779}}, Y: Field{[10]uint32{0x01746630, 0x03994745, 0x036d2254, 0x03130dfb, 0x02e1927d, 0x01dfd452, 0x03e66b83, 0x000ee2e0, 0x00a42f95, 0x0029bb4d}}}, + {X: Field{[10]uint32{0x0191ec05, 0x03abbd92, 0x01ceb050, 0x0057e0ea, 0x01321848, 0x03ccbd9c, 0x031f0688, 0x034c996d, 0x033d31d1, 0x001831a2}}, Y: Field{[10]uint32{0x0000d498, 0x0183f29f, 0x0132a9d7, 0x00a5403b, 0x01898867, 0x021dcde9, 0x01aecbe9, 0x009322a5, 0x00619f7d, 0x0025deb3}}}, + {X: Field{[10]uint32{0x01c135e2, 0x0316cc5a, 0x0065464f, 0x00a5afa8, 0x014a1267, 0x019ae6c9, 0x0004a76a, 0x039656db, 0x02e9b646, 0x00086c14}}, Y: Field{[10]uint32{0x000779e7, 0x00262715, 0x0128538f, 0x035166aa, 0x0318db6e, 0x02c37f5f, 0x007292c4, 0x035c5dba, 0x00cd2fb3, 0x00040a79}}}, + {X: Field{[10]uint32{0x03523d68, 0x01f6e8de, 0x0379dc02, 0x03bd6c47, 0x02f58bb2, 0x002f9332, 0x0101e666, 0x011457b9, 0x02f37c66, 0x0001c032}}, Y: Field{[10]uint32{0x03a08be1, 0x024d31db, 0x00948e1a, 0x01f95bb7, 0x008eac9b, 0x02655e0c, 0x032487c1, 0x011bccb8, 0x0388f1c3, 0x001f7dda}}}, + {X: Field{[10]uint32{0x01541e8d, 0x01a59912, 0x01696299, 0x02bd5969, 0x015d34ae, 0x019160c5, 0x01f1c9f5, 0x02112b39, 0x03d21293, 0x00316ae6}}, Y: Field{[10]uint32{0x01c422d8, 0x0184c100, 0x02f29c03, 0x00315f6c, 0x029b34d9, 0x03b14e9f, 0x01f44678, 0x01b22a83, 0x01c6c61d, 0x000b4820}}}, + {X: Field{[10]uint32{0x016d75a3, 0x034dda80, 0x023dfa4a, 0x0375751a, 0x005713fb, 0x03085476, 0x00d15af8, 0x01770512, 0x032ed53f, 0x0022bf0f}}, Y: Field{[10]uint32{0x039b6c8f, 0x02c69392, 0x0389764d, 0x004fcd15, 0x036767c5, 0x00864f9a, 0x015a99d4, 0x02fb6780, 0x03932627, 0x000047d8}}}, + {X: Field{[10]uint32{0x025007a7, 0x01cf140e, 0x034d86e1, 0x019fb7a7, 0x02c0d698, 0x01eb8da0, 0x00cf7292, 0x03ab7f3d, 0x01c6bb55, 0x001052b6}}, Y: Field{[10]uint32{0x03603585, 0x0374e823, 0x03fd6181, 0x020bb6f7, 0x01dafb6f, 0x019e951b, 0x002306b6, 0x026c7444, 0x00f8f4de, 0x00312f34}}}, + {X: Field{[10]uint32{0x0304a1e3, 0x005c91f2, 0x008fdb23, 0x034eabc2, 0x01a163a2, 0x037109b4, 0x005ec88f, 0x01cc5ea7, 0x0240b84b, 0x00208478}}, Y: Field{[10]uint32{0x02722bbb, 0x0250ab49, 0x029be4e7, 0x02c5c2a7, 0x03a74f10, 0x016586cc, 0x006c4f6d, 0x02fd453c, 0x019bb268, 0x00329da9}}}, + {X: Field{[10]uint32{0x02ba700e, 0x01676bc8, 0x012f429e, 0x02450fb9, 0x023f7cd2, 0x00252c9e, 0x02c44523, 0x0374f1d7, 0x0132363a, 0x0029537f}}, Y: Field{[10]uint32{0x02d4490b, 0x02364bae, 0x02bbb279, 0x01d1aa4f, 0x013639ac, 0x026d1219, 0x038d1304, 0x000260f8, 0x022c5951, 0x003c5820}}}, + {X: Field{[10]uint32{0x018860f7, 0x029f2e52, 0x015e9a3b, 0x010f3ef6, 0x03e2921a, 0x0387a74f, 0x02ee1a81, 0x026c629e, 0x005552b2, 0x001df593}}, Y: Field{[10]uint32{0x0208ff10, 0x01bcb9e0, 0x025978d0, 0x02a43325, 0x020fed03, 0x01b6681a, 0x00ad9d73, 0x0323d110, 0x00f95ea9, 0x003a5eee}}}, + {X: Field{[10]uint32{0x02309ca9, 0x0251f85b, 0x03d61ba7, 0x000d83c4, 0x011b57c1, 0x00396862, 0x007f0f5f, 0x01afc47d, 0x0014b33e, 0x001216ce}}, Y: Field{[10]uint32{0x00e38bdb, 0x02098c81, 0x01b5f152, 0x01bcb1e0, 0x03f99857, 0x011b2194, 0x0050dd09, 0x01f18a98, 0x0070ce60, 0x0039aede}}}, + {X: Field{[10]uint32{0x0072739c, 0x01c1a3c0, 0x029aab0a, 0x032052bb, 0x017ced2a, 0x02dbb714, 0x03618be1, 0x01e30b7b, 0x01eca90a, 0x003b48e0}}, Y: Field{[10]uint32{0x034954c7, 0x0117fec4, 0x00fbc3de, 0x0058b284, 0x02d68599, 0x018d4e07, 0x00c291ec, 0x019148e0, 0x03e0ba32, 0x0032c21c}}}, + {X: Field{[10]uint32{0x00ed971d, 0x01795f11, 0x03a684a6, 0x019a3cb9, 0x02955b6a, 0x0132e83f, 0x03c7369a, 0x03049f20, 0x0379d36b, 0x0039112b}}, Y: Field{[10]uint32{0x03785fff, 0x031553f4, 0x034e9dd7, 0x03780434, 0x02ec50e5, 0x02922662, 0x0355ca16, 0x0208eaab, 0x030327b6, 0x0029e1db}}}, + {X: Field{[10]uint32{0x01fc1fca, 0x035f941a, 0x0278c07e, 0x022a5b2c, 0x03b8677b, 0x014bfa93, 0x024296c1, 0x0168b57d, 0x00d77de7, 0x002be30d}}, Y: Field{[10]uint32{0x0184d673, 0x0330ec8a, 0x00a8cf9e, 0x032e2e07, 0x02f3c451, 0x0118caf8, 0x015899f2, 0x0306a339, 0x0062ab6e, 0x00123396}}}, + {X: Field{[10]uint32{0x027efe13, 0x0150db3d, 0x000cbe31, 0x0221d812, 0x0108940c, 0x0368128c, 0x02745a81, 0x0113b463, 0x0066243a, 0x003a6675}}, Y: Field{[10]uint32{0x0237fe36, 0x0347ec00, 0x013cb2f7, 0x03adfea0, 0x00ef55d3, 0x0337b6f4, 0x02ac0e75, 0x01198708, 0x027063a8, 0x003d07a3}}}, + {X: Field{[10]uint32{0x004bcc72, 0x026d9118, 0x02d66e20, 0x02a962dc, 0x00072caf, 0x00bf7afb, 0x00c923a0, 0x0193fe8f, 0x00aa7d89, 0x003103be}}, Y: Field{[10]uint32{0x03238ce5, 0x03c189ed, 0x02c2f696, 0x031ecfbe, 0x00ff50eb, 0x01dbccde, 0x012c3b61, 0x02879bc4, 0x01b56549, 0x0012038d}}}, + {X: Field{[10]uint32{0x0252982f, 0x006c3ce6, 0x026151bd, 0x02288a89, 0x01679e4b, 0x00826a97, 0x012b546e, 0x01267226, 0x001de3f9, 0x00120bb9}}, Y: Field{[10]uint32{0x00d3de3d, 0x03fba077, 0x009f832e, 0x03b28395, 0x03563f92, 0x03843b1b, 0x012eff0e, 0x006054b5, 0x0070d213, 0x00144398}}}, + {X: Field{[10]uint32{0x0058fae5, 0x033dc997, 0x01fd465d, 0x00cb180a, 0x036df7ca, 0x034dbe2d, 0x0003c694, 0x0307599c, 0x006825a3, 0x00119829}}, Y: Field{[10]uint32{0x0223f618, 0x02fe842e, 0x017c0700, 0x0380540e, 0x03791de8, 0x00b6b7a5, 0x00acc720, 0x030a5a62, 0x03f546b5, 0x000f660a}}}, + {X: Field{[10]uint32{0x035d8f8d, 0x022fbc3a, 0x00d8703c, 0x0385d8c5, 0x00d8a3ae, 0x01d62665, 0x031dc033, 0x01bc2cfe, 0x024c92ba, 0x002e1798}}, Y: Field{[10]uint32{0x0175679b, 0x01861a2b, 0x0148688c, 0x009a19b3, 0x03e2cdff, 0x02cdbbdd, 0x03ff93ef, 0x016e9092, 0x033320a5, 0x002224da}}}, + {X: Field{[10]uint32{0x002683e3, 0x0261d524, 0x014c6b16, 0x00be53be, 0x03b3be28, 0x018bf56c, 0x0187ebab, 0x009afef4, 0x00b5361a, 0x00290648}}, Y: Field{[10]uint32{0x015ea98a, 0x031e92b8, 0x007d1491, 0x027c9819, 0x02c95a8f, 0x00814f80, 0x027201b3, 0x00ed34f4, 0x019629d9, 0x001de428}}}, + {X: Field{[10]uint32{0x03b7f86e, 0x025e7d3e, 0x03937055, 0x022c5541, 0x01ed1abf, 0x03c40762, 0x012f01bb, 0x00a980c9, 0x01a97926, 0x0024e20b}}, Y: Field{[10]uint32{0x009d7e44, 0x01024406, 0x03e0215a, 0x03c4fb4d, 0x0223e570, 0x0357c08b, 0x037450ba, 0x005bbc04, 0x004df0a7, 0x00024e22}}}, + {X: Field{[10]uint32{0x00952e00, 0x008c8972, 0x03b0679c, 0x016799bb, 0x03ebfa6a, 0x01c26c65, 0x0356b643, 0x036982b3, 0x01f83efe, 0x00284142}}, Y: Field{[10]uint32{0x024d1ddb, 0x03c19df0, 0x015fe830, 0x0291f038, 0x005a06e7, 0x0132b93e, 0x0237df52, 0x03793426, 0x03d5559b, 0x001d6420}}}, + {X: Field{[10]uint32{0x03eb3651, 0x02c7be4a, 0x02d294b3, 0x00122a89, 0x03c55de7, 0x03f9d7ab, 0x017e587d, 0x0109e1cf, 0x02976ea7, 0x000ae516}}, Y: Field{[10]uint32{0x02893c65, 0x003bd941, 0x03752698, 0x0043976b, 0x03cb488d, 0x0002d146, 0x01cbabce, 0x02fdae74, 0x03ed27cc, 0x00108f01}}}, + {X: Field{[10]uint32{0x03cc37f0, 0x01115ec3, 0x01073b59, 0x0244a354, 0x03f69516, 0x00fc5c05, 0x0203da01, 0x02ff9003, 0x01bbc1a0, 0x0021be76}}, Y: Field{[10]uint32{0x024c32bb, 0x031b19d1, 0x007eddf3, 0x00099249, 0x0362388f, 0x02f067a3, 0x039cd4bf, 0x00de5a4c, 0x02242e30, 0x003cdc31}}}, + {X: Field{[10]uint32{0x0161ed91, 0x0343e0f7, 0x0206c016, 0x003e42a4, 0x033aa9cc, 0x02f6d384, 0x038d8958, 0x00113988, 0x02f9555e, 0x003e2656}}, Y: Field{[10]uint32{0x02a8a060, 0x00964853, 0x014bcd08, 0x024d2bc6, 0x031febdb, 0x013e8b98, 0x00bdab83, 0x004b20ee, 0x02e31bee, 0x002cb534}}}, + {X: Field{[10]uint32{0x019394ce, 0x015105e0, 0x01dbe2f5, 0x00858f42, 0x00fdea26, 0x02ef071d, 0x01eee7f0, 0x00d4b515, 0x027f69eb, 0x002ad568}}, Y: Field{[10]uint32{0x031b801a, 0x01988038, 0x013534a1, 0x012a25e2, 0x024d5467, 0x012a4c38, 0x0373bc17, 0x0216d5c8, 0x009360f5, 0x0022b159}}}, + {X: Field{[10]uint32{0x023b9fa6, 0x022645a8, 0x02522e8a, 0x00ffeb6b, 0x03ce8472, 0x017a60d4, 0x02a89069, 0x037e6245, 0x02c9c428, 0x0013f041}}, Y: Field{[10]uint32{0x02b92031, 0x00c5a227, 0x02fd1925, 0x0129f066, 0x01fdebbc, 0x00e49a1f, 0x00c88be3, 0x00d0793d, 0x02e83d54, 0x002435cc}}}, + {X: Field{[10]uint32{0x03149a91, 0x01af2080, 0x036b2462, 0x036c2e81, 0x03874080, 0x00ea2538, 0x0187b257, 0x03332ddf, 0x01808831, 0x00327216}}, Y: Field{[10]uint32{0x02abf0b8, 0x00c0b8ec, 0x026e6a6f, 0x01a1e015, 0x02c5f992, 0x002f7e8d, 0x01a6355f, 0x0127e6fa, 0x00cd8c09, 0x0027eb53}}}, + {X: Field{[10]uint32{0x005209e7, 0x01dc5247, 0x00cb7aee, 0x01737756, 0x01a278eb, 0x028508bf, 0x0378c46a, 0x02aee97f, 0x037e2293, 0x003032d6}}, Y: Field{[10]uint32{0x0210c47b, 0x0035ccd3, 0x027d5133, 0x027bb634, 0x03cc7278, 0x0037d328, 0x036b572d, 0x02161976, 0x002e3664, 0x0020407d}}}, + {X: Field{[10]uint32{0x00ce0b63, 0x03c56436, 0x0215d140, 0x03383ef3, 0x01af2f70, 0x0246f75a, 0x02ab60c3, 0x00fe0d1c, 0x03c516d9, 0x0036ff00}}, Y: Field{[10]uint32{0x02d26564, 0x023054ff, 0x03b46465, 0x00937af1, 0x024811fa, 0x00ddaa93, 0x033ecfec, 0x0328ba68, 0x014d7228, 0x003e0e38}}}, + {X: Field{[10]uint32{0x004f59c8, 0x00fcf4d2, 0x03af37cc, 0x02e58b8e, 0x00435140, 0x00d581ec, 0x031d8910, 0x00ffc455, 0x0285eea1, 0x00378981}}, Y: Field{[10]uint32{0x01cfbbcc, 0x023eb966, 0x00accd7f, 0x0132a97e, 0x02c1f5f5, 0x02d9bc79, 0x0363335b, 0x01619798, 0x02c9a602, 0x001af08f}}}, + {X: Field{[10]uint32{0x02a2e71e, 0x00f162fe, 0x01e5f6f7, 0x027f1e06, 0x031ed812, 0x01b05fae, 0x0362f79f, 0x023f6c06, 0x0160b8cb, 0x001635e3}}, Y: Field{[10]uint32{0x004bccc1, 0x029014ed, 0x0353140a, 0x00f6ec98, 0x03b04d6d, 0x018e444c, 0x0222f5e1, 0x0319c630, 0x00f2fd6b, 0x001f2ef9}}}, + {X: Field{[10]uint32{0x0000a490, 0x03afbf8b, 0x01738211, 0x004bd91b, 0x03fde1af, 0x0000538e, 0x00869aa9, 0x013f96ac, 0x031aeed5, 0x0039cae6}}, Y: Field{[10]uint32{0x00af4fc2, 0x03cc9ce4, 0x01d348cf, 0x01a5df49, 0x00d94659, 0x00b320a8, 0x02af020a, 0x0160ce10, 0x014d8f59, 0x003364b4}}}, + {X: Field{[10]uint32{0x030fd658, 0x03cd2355, 0x0085b3b9, 0x00508885, 0x00b725f6, 0x0277fe2a, 0x03cef97c, 0x016f862d, 0x03aed55a, 0x0001aa1a}}, Y: Field{[10]uint32{0x032c5724, 0x001b59fb, 0x01d4081c, 0x00515c6a, 0x0360a14f, 0x01c27ea1, 0x03121407, 0x00c05440, 0x02914c3b, 0x0004e289}}}, + {X: Field{[10]uint32{0x030a1fc5, 0x0002bbae, 0x0316e0e1, 0x0386d891, 0x03b17c39, 0x0193f0a0, 0x00b00595, 0x03c9135b, 0x00f67240, 0x00072823}}, Y: Field{[10]uint32{0x01ef0a55, 0x011ecff6, 0x0016ab34, 0x010d3a70, 0x03deec27, 0x019ab7c1, 0x0236317c, 0x0027b0d2, 0x03ce655d, 0x0008b893}}}, + {X: Field{[10]uint32{0x024a0b0f, 0x01608060, 0x016070f5, 0x022bf525, 0x02b7cf62, 0x03377ddb, 0x021ee30b, 0x012711cf, 0x0128feba, 0x00365770}}, Y: Field{[10]uint32{0x03c7e8a1, 0x00b135b1, 0x02116161, 0x02eab8bf, 0x03633e98, 0x01a6da38, 0x0061274c, 0x0384df44, 0x02b8fea3, 0x00354d02}}}, + {X: Field{[10]uint32{0x00d83857, 0x001cfe33, 0x03afcf3c, 0x022f6661, 0x03ae7e28, 0x01a6a22e, 0x03a14e47, 0x035405b0, 0x022a7f4f, 0x000b3334}}, Y: Field{[10]uint32{0x033b389e, 0x01593741, 0x01f3b0f2, 0x00513b6d, 0x00c2a7b6, 0x03e393ee, 0x010f849f, 0x027f6d1c, 0x023caea8, 0x002ba099}}}, + {X: Field{[10]uint32{0x01628a43, 0x03afac25, 0x001d1c5e, 0x03207ca0, 0x01ae4a9a, 0x0375ed04, 0x03bc0037, 0x03788e4d, 0x01f6c8e4, 0x003b05ed}}, Y: Field{[10]uint32{0x0258df83, 0x01b9ba59, 0x007348e6, 0x0083c1e6, 0x03743196, 0x01a3f9c3, 0x01fa2989, 0x0056c18c, 0x011dfd58, 0x002cf835}}}, + {X: Field{[10]uint32{0x0096b6f4, 0x0216225b, 0x023ca956, 0x00b22eb3, 0x00cee8e1, 0x033c7326, 0x0213cddc, 0x01fd3869, 0x037e6290, 0x00298eab}}, Y: Field{[10]uint32{0x02e8216e, 0x01500c6b, 0x00deeef7, 0x01f7a003, 0x01f8bc1a, 0x00c95688, 0x0144ab12, 0x0265cfa7, 0x02bcdc5f, 0x000be54f}}}, + {X: Field{[10]uint32{0x03ad32f3, 0x03805a61, 0x00b2c550, 0x02bc6685, 0x0390e345, 0x00a5b44d, 0x005636cb, 0x023435ad, 0x0330318d, 0x0023ad3f}}, Y: Field{[10]uint32{0x00a4a3e3, 0x022bddc3, 0x031718f2, 0x0144209f, 0x020cc01d, 0x017aeddd, 0x0200151c, 0x03f1f9f5, 0x038bae7f, 0x0012e388}}}, + {X: Field{[10]uint32{0x0276b8d2, 0x012b7660, 0x02341437, 0x0232d1c4, 0x002432fa, 0x01298ebb, 0x038a6e57, 0x010e5fd5, 0x00afbb5b, 0x002ac508}}, Y: Field{[10]uint32{0x00b94396, 0x03995fd9, 0x0357490c, 0x0335fdd6, 0x038f264a, 0x029e5562, 0x039df900, 0x03a49d96, 0x028ea197, 0x003ebd8c}}}, + {X: Field{[10]uint32{0x006f680a, 0x002f46a2, 0x03b5e963, 0x01acd23f, 0x015102aa, 0x00756667, 0x0016f1cc, 0x0286ab73, 0x010e6b2b, 0x0036a862}}, Y: Field{[10]uint32{0x012fa209, 0x03db7e8d, 0x0051094b, 0x0170b088, 0x038744f0, 0x03caef48, 0x02f6005c, 0x03ae532d, 0x03695a63, 0x00067eb2}}}, + {X: Field{[10]uint32{0x032a28e3, 0x033d91df, 0x03f2e0b1, 0x010af48b, 0x03cb08a6, 0x03e3aedc, 0x01a1b0ed, 0x0346d226, 0x012e5398, 0x003c667d}}, Y: Field{[10]uint32{0x02c2f454, 0x02d66167, 0x03d9e5c1, 0x02b15526, 0x012d5278, 0x01fbe6dd, 0x00f87476, 0x004c7533, 0x03aba5e2, 0x000d866a}}}, + {X: Field{[10]uint32{0x0046ad6a, 0x014888fc, 0x00046e27, 0x03d6727f, 0x01e75c86, 0x025e928d, 0x0320bc14, 0x03b3cdaf, 0x0293a5f9, 0x00060aa7}}, Y: Field{[10]uint32{0x03b8bcfd, 0x0079223f, 0x007a5c73, 0x0328d2bc, 0x03e0924d, 0x021585f1, 0x0067693d, 0x03b8632a, 0x0288c39d, 0x00318257}}}, + {X: Field{[10]uint32{0x0214abbb, 0x0026552c, 0x0327c3b5, 0x02b82418, 0x025ac21e, 0x0109dfec, 0x020a7016, 0x03f99ad9, 0x03530636, 0x00022932}}, Y: Field{[10]uint32{0x01d0ed1c, 0x035a49a8, 0x00bbf63f, 0x01709540, 0x008efcb8, 0x0349758e, 0x02e707fa, 0x02a5048f, 0x00514cc6, 0x001a4f96}}}, + {X: Field{[10]uint32{0x008c1282, 0x00224597, 0x018d42b2, 0x023204ef, 0x02f49517, 0x00b1565c, 0x01e31058, 0x030cf845, 0x035a3b40, 0x0012404c}}, Y: Field{[10]uint32{0x004214e3, 0x02760072, 0x0016624d, 0x00393778, 0x00f26a9a, 0x0387c3a5, 0x02c70eb9, 0x01d03772, 0x0176429d, 0x0011c01c}}}, + {X: Field{[10]uint32{0x004e01dd, 0x01048ca6, 0x02b8fcdf, 0x01772b60, 0x01df64f5, 0x02e7cb81, 0x01b49e14, 0x00d8ad18, 0x01a77c34, 0x00206039}}, Y: Field{[10]uint32{0x0305040b, 0x01d0ab2b, 0x03e650de, 0x02704c3c, 0x01cb3fb4, 0x0016b247, 0x034b0fd0, 0x03c402a8, 0x0221d4b9, 0x000d33d5}}}, + {X: Field{[10]uint32{0x0251ee9f, 0x0217f84d, 0x032a4b10, 0x01f2df48, 0x01a90e1d, 0x023aa975, 0x00aeee35, 0x03d2a277, 0x027efea9, 0x0023dc48}}, Y: Field{[10]uint32{0x0255ad73, 0x036bd3a5, 0x01aaee90, 0x01aaf011, 0x03e27267, 0x02e4531f, 0x03c344f3, 0x01e68289, 0x01bcbb2b, 0x00293685}}}, + {X: Field{[10]uint32{0x03b58264, 0x023508f3, 0x02a3ccc6, 0x02a96821, 0x02d1ea8e, 0x00f30669, 0x03592a2a, 0x02eb2c20, 0x0374cdc9, 0x0036fae6}}, Y: Field{[10]uint32{0x00576161, 0x000268d0, 0x022d45b1, 0x03e6d967, 0x0018e86d, 0x02785aef, 0x00732eb7, 0x01fed60c, 0x039283f0, 0x002f99a1}}}, + {X: Field{[10]uint32{0x01591933, 0x02985f5c, 0x02958ab0, 0x037e0c5e, 0x017d9ea4, 0x02014a37, 0x03b09b62, 0x00b2b0f1, 0x013fa7f5, 0x003cca3a}}, Y: Field{[10]uint32{0x02405547, 0x0108c47c, 0x00a60fc0, 0x005f5faf, 0x002f780c, 0x036174e5, 0x01c3f3a7, 0x027a4187, 0x0059811f, 0x001073a3}}}, + {X: Field{[10]uint32{0x00fea051, 0x0033c20c, 0x00b7d8fb, 0x020544c7, 0x01d4ca41, 0x00087091, 0x005f44c2, 0x006fb127, 0x0003416b, 0x0015b53d}}, Y: Field{[10]uint32{0x00bd39ce, 0x028eb614, 0x002a8d35, 0x024b8f60, 0x0051ae1a, 0x035773a3, 0x00cb6373, 0x01defa4d, 0x0133948f, 0x003317d8}}}, + {X: Field{[10]uint32{0x039022b8, 0x03d3af00, 0x03c49e9c, 0x03e819f3, 0x01dd90c9, 0x00c9ff50, 0x02becf2a, 0x01dadf33, 0x004b8bb4, 0x002388b8}}, Y: Field{[10]uint32{0x00286b8b, 0x0064ecc2, 0x01d6d3e4, 0x024b0b20, 0x00934e79, 0x0074fbd6, 0x0103c023, 0x01a5b4d3, 0x02603204, 0x00007e3e}}}, + {X: Field{[10]uint32{0x02f064f6, 0x019f5e83, 0x00e1a518, 0x01cafe7f, 0x02b396eb, 0x033fbeb7, 0x03624dc1, 0x01f1a3e4, 0x02e4b9a7, 0x000d06c8}}, Y: Field{[10]uint32{0x02d9441a, 0x023fe2e4, 0x01e27cfc, 0x01c9f4ca, 0x03af11ed, 0x036f2cb6, 0x0162bcf0, 0x01a55d65, 0x03877bc3, 0x002560e7}}}, + {X: Field{[10]uint32{0x03324763, 0x02c8098e, 0x0305045e, 0x02670002, 0x00e6af97, 0x013ee2a3, 0x01e86809, 0x01044a1e, 0x02939f23, 0x000fa90b}}, Y: Field{[10]uint32{0x0201a623, 0x01af544b, 0x02f59186, 0x028ce2c5, 0x0160a5c0, 0x03b3ea3f, 0x024d51ff, 0x029bc13f, 0x01676f5a, 0x00110c90}}}, + {X: Field{[10]uint32{0x035d625b, 0x0249efd4, 0x0317342f, 0x01829c70, 0x0023d8a6, 0x02337a47, 0x00faa1bb, 0x01453be5, 0x004cef10, 0x002bf9ed}}, Y: Field{[10]uint32{0x008b4b65, 0x02b3f21f, 0x0042751c, 0x01dde8e2, 0x026cfcdd, 0x012c18fb, 0x0151f185, 0x021dcaf3, 0x03885121, 0x001d85e9}}}, + {X: Field{[10]uint32{0x02034d2b, 0x00fef9a8, 0x01dda37a, 0x038ffc38, 0x0112f69e, 0x00b00d74, 0x00ac725f, 0x003531b8, 0x0202abb4, 0x0028d832}}, Y: Field{[10]uint32{0x016b646d, 0x020c9a64, 0x03814fab, 0x01e49568, 0x039d8bbe, 0x0298211b, 0x01d0f723, 0x00fa80c1, 0x01783fec, 0x0005879c}}}, + {X: Field{[10]uint32{0x00011b88, 0x012a16de, 0x0361ec91, 0x02304667, 0x035984d1, 0x02cbb37d, 0x025d9899, 0x03f9f66d, 0x025ff7d9, 0x00041213}}, Y: Field{[10]uint32{0x0176cdc9, 0x01135be5, 0x031844f7, 0x00f5e3de, 0x03e7f4e0, 0x00b05127, 0x01e1086c, 0x01cd5e7b, 0x00e21e13, 0x0004b470}}}, + {X: Field{[10]uint32{0x0256b138, 0x030e71b4, 0x01ba67ee, 0x03996c14, 0x02b11245, 0x0369f79a, 0x0276c40e, 0x02777090, 0x00e15dad, 0x001db0b7}}, Y: Field{[10]uint32{0x0064ce82, 0x033bc57f, 0x03605ed4, 0x01f4fac3, 0x0361a896, 0x010dce68, 0x023fca2a, 0x0020e64b, 0x01ce585b, 0x00366980}}}, + {X: Field{[10]uint32{0x01d4d2e1, 0x0266dd44, 0x0335627b, 0x0220e951, 0x03d1d839, 0x00f71831, 0x004fcb18, 0x03b662c1, 0x01d4c3e6, 0x0019c68c}}, Y: Field{[10]uint32{0x02053088, 0x034dc6c3, 0x01b3b08a, 0x017a94b0, 0x01281f18, 0x03d0ea12, 0x033762fb, 0x03bcfdfb, 0x01152005, 0x001bf763}}}, + {X: Field{[10]uint32{0x02898a37, 0x0384ad9b, 0x032431be, 0x016e9bc5, 0x00c2343a, 0x01fdc706, 0x03729985, 0x01a40c4a, 0x0165a2da, 0x0024743d}}, Y: Field{[10]uint32{0x0332f681, 0x02c8275f, 0x0147a41e, 0x0359c924, 0x01e6393a, 0x007df377, 0x02906a10, 0x028a2355, 0x01b91956, 0x00275a95}}}, + {X: Field{[10]uint32{0x028512ba, 0x03ba6ad8, 0x032d4de9, 0x0379c902, 0x006b90d8, 0x03d37dee, 0x014d0cd8, 0x028b0f2f, 0x00581953, 0x001f967c}}, Y: Field{[10]uint32{0x0242a173, 0x02da6ee6, 0x03dbd9d9, 0x03f8ca3e, 0x0035a012, 0x027c0dc5, 0x0019b0af, 0x01f583bd, 0x01eb74cc, 0x000cec34}}}, + {X: Field{[10]uint32{0x03788a26, 0x024abf87, 0x0380dd34, 0x016f8100, 0x03f43a28, 0x02c7ccbf, 0x02652ada, 0x006fb484, 0x025e0b79, 0x003bde2d}}, Y: Field{[10]uint32{0x0108d306, 0x007346d9, 0x03910abb, 0x03be4e55, 0x00f156cd, 0x013feb00, 0x027ab1b2, 0x02bf08fa, 0x013896d5, 0x0027cf89}}}, + {X: Field{[10]uint32{0x016b7cd3, 0x02337e6d, 0x02e1f50a, 0x0133b9d4, 0x01cb0c0e, 0x0304b2c0, 0x03ce2f5f, 0x00cfb905, 0x00d01998, 0x001e2e5e}}, Y: Field{[10]uint32{0x01560dd9, 0x00251e30, 0x00cd0197, 0x0245c518, 0x01dd631f, 0x005647d7, 0x01701413, 0x001aef8c, 0x01d73726, 0x0027e71f}}}, + {X: Field{[10]uint32{0x00bfe64a, 0x00f49b5c, 0x00ceff1b, 0x03e9ee9f, 0x02906ffd, 0x002aeadc, 0x012f5e88, 0x016883a6, 0x0331f994, 0x0017de16}}, Y: Field{[10]uint32{0x03881c1c, 0x034285ca, 0x0046e0a6, 0x004f9742, 0x01575224, 0x0089e447, 0x021988d3, 0x00e1abfe, 0x000eb3cb, 0x0028f312}}}, + {X: Field{[10]uint32{0x0006b3d1, 0x03a7f95e, 0x00887fce, 0x01f58dd7, 0x0102c388, 0x0112135c, 0x03aadfa4, 0x0124bf3c, 0x01997cbb, 0x0027fb9e}}, Y: Field{[10]uint32{0x0224c22e, 0x02752b3f, 0x00437a12, 0x03c31b19, 0x00c0f0b8, 0x0039f512, 0x03ef25a6, 0x031d807e, 0x03277e94, 0x0010c450}}}, + {X: Field{[10]uint32{0x02e3f30b, 0x0362c313, 0x031020ac, 0x004fe694, 0x02c0f462, 0x036f5f1d, 0x03befd7c, 0x022215ed, 0x015db75d, 0x0004bcb7}}, Y: Field{[10]uint32{0x034097d8, 0x02d2a94c, 0x010216dc, 0x01c1d0b7, 0x00f85105, 0x00e1901c, 0x013ecfad, 0x00127a6b, 0x018b0e85, 0x003389d6}}}, + {X: Field{[10]uint32{0x03997bd7, 0x020c9773, 0x004d5317, 0x027c74aa, 0x02fbb86f, 0x0306dc63, 0x00e2befb, 0x02d470fc, 0x02b43ee2, 0x0031a52b}}, Y: Field{[10]uint32{0x01050977, 0x0221ea3b, 0x03226bdc, 0x003ab9c7, 0x036fc519, 0x02169be0, 0x02c3e5cc, 0x024c44b2, 0x033eb6a6, 0x00105207}}}, + {X: Field{[10]uint32{0x01047ae9, 0x035e32a0, 0x03ab149a, 0x00002182, 0x029bd161, 0x02bcefbe, 0x033493f5, 0x030172eb, 0x024614c5, 0x003f899a}}, Y: Field{[10]uint32{0x00471e6b, 0x006e5506, 0x0320b074, 0x021d255f, 0x00f58ca0, 0x01dca971, 0x00614ada, 0x025352df, 0x02bec446, 0x0038b863}}}, + {X: Field{[10]uint32{0x016118dd, 0x0149a64d, 0x03250d21, 0x039fd9e9, 0x01daff04, 0x03060fc8, 0x03abfa58, 0x02c1f121, 0x01dc0926, 0x001e5d78}}, Y: Field{[10]uint32{0x011409e5, 0x03f1c24d, 0x029d821c, 0x02366e5c, 0x01f94346, 0x02a536b9, 0x014b779d, 0x02cc0329, 0x039744e2, 0x00032612}}}, + {X: Field{[10]uint32{0x018a2b06, 0x01f3c5a8, 0x02951a13, 0x023adff5, 0x00702284, 0x0061b5c0, 0x0109e8e6, 0x00d62682, 0x00db5018, 0x0024d5cf}}, Y: Field{[10]uint32{0x00bf47d5, 0x02439886, 0x010f0265, 0x022bf27d, 0x02caae2d, 0x004db2b3, 0x0090039d, 0x03dabb65, 0x00663047, 0x001ea55f}}}, + {X: Field{[10]uint32{0x01d77660, 0x01febe20, 0x00829fa3, 0x003b8a6d, 0x026771d8, 0x0217f13f, 0x00ac7dd4, 0x01bfae38, 0x021ea60f, 0x00302f4b}}, Y: Field{[10]uint32{0x0335bacd, 0x03fc96c0, 0x0306556a, 0x00ff896b, 0x002effc8, 0x027c91fa, 0x0076267d, 0x03871da4, 0x00fd9edd, 0x001a16dd}}}, + {X: Field{[10]uint32{0x0024bf3e, 0x031a6127, 0x032538c4, 0x00af6a90, 0x01b67685, 0x01575646, 0x02e5f45d, 0x00881e41, 0x00e19319, 0x0015aeb0}}, Y: Field{[10]uint32{0x03c18ebf, 0x0081fb0b, 0x01096a5d, 0x03a7e342, 0x010f5c0a, 0x022c4639, 0x02480bbc, 0x02e04b4b, 0x01d39856, 0x0038efd4}}}, + {X: Field{[10]uint32{0x0142c06c, 0x01347964, 0x03c65231, 0x002ae4f7, 0x015225fa, 0x02617f7b, 0x03ec7c4a, 0x03774baf, 0x0313fe7c, 0x0014ed06}}, Y: Field{[10]uint32{0x03b69c4b, 0x00bfa6f0, 0x03a988f6, 0x008123ca, 0x03cb4ecf, 0x0334af7f, 0x02e038dc, 0x03d59574, 0x025744e4, 0x00243f2e}}}, + {X: Field{[10]uint32{0x02e765bb, 0x03f3cab0, 0x025f5d55, 0x00019d33, 0x00b11364, 0x0060b28b, 0x02baa269, 0x03b6e51f, 0x0231ccc0, 0x002f6817}}, Y: Field{[10]uint32{0x02cf75e8, 0x0371ae9e, 0x0307b447, 0x036aba3d, 0x032fff08, 0x00c23aa5, 0x00593567, 0x01a60a9d, 0x01793123, 0x0025c9d6}}}, + {X: Field{[10]uint32{0x030413d8, 0x03b78552, 0x0189b21a, 0x0254715c, 0x0291196e, 0x023d97e0, 0x0209f19a, 0x0020807f, 0x006a8a90, 0x00123747}}, Y: Field{[10]uint32{0x009b98f5, 0x022d8eb0, 0x017af78c, 0x00367143, 0x01c5a615, 0x0039cbe1, 0x017e2878, 0x00f72994, 0x02fb1a94, 0x001e687d}}}, + {X: Field{[10]uint32{0x012f1f2c, 0x0010e00a, 0x0051c13c, 0x01bcd119, 0x002be834, 0x03a68b52, 0x02ff4e2c, 0x010a323b, 0x0269e28c, 0x001d5018}}, Y: Field{[10]uint32{0x033e996a, 0x03371684, 0x0289f9e7, 0x03377796, 0x00202c44, 0x024bbf11, 0x00d13d76, 0x0201f88f, 0x0097211c, 0x0011d0ec}}}, + {X: Field{[10]uint32{0x0192ee5f, 0x02181288, 0x03165401, 0x0009376a, 0x00744200, 0x010c53ff, 0x000ae4d2, 0x0204ce21, 0x0193bf31, 0x0006a957}}, Y: Field{[10]uint32{0x00bc3bfc, 0x038e3c4b, 0x0118f041, 0x02204d84, 0x017a6a8e, 0x02db2cb3, 0x02ac7e99, 0x027a2995, 0x035492d5, 0x002eaeb0}}}, + {X: Field{[10]uint32{0x037dcf03, 0x01c48311, 0x02fbab93, 0x03d26c5d, 0x0234d214, 0x03627dc8, 0x00fa8503, 0x0318a799, 0x0050db7b, 0x001d6f93}}, Y: Field{[10]uint32{0x00b6f819, 0x015320a5, 0x003fb511, 0x00a9069b, 0x03ed2e5e, 0x0321831a, 0x033d9343, 0x01b6c820, 0x03ba8c60, 0x002d5482}}}, + {X: Field{[10]uint32{0x00ef6c8c, 0x00e0950f, 0x01c7d8d6, 0x002871c9, 0x036508e1, 0x01846e56, 0x00b2486b, 0x022cb435, 0x0022e4ed, 0x003cd812}}, Y: Field{[10]uint32{0x022dc0f5, 0x00e51188, 0x00105f98, 0x00b2c8eb, 0x0075d99d, 0x00b2f5a6, 0x021a412f, 0x02f1a896, 0x00797404, 0x003d016b}}}, + {X: Field{[10]uint32{0x037cefe8, 0x01f7fc39, 0x012bf2d8, 0x0247c107, 0x01da54ee, 0x0380c9ac, 0x015f727a, 0x009afbeb, 0x02e66f93, 0x001b2485}}, Y: Field{[10]uint32{0x01d16517, 0x00ddfece, 0x01704557, 0x01c94194, 0x031ec2f3, 0x03d48c37, 0x0146f922, 0x011f237d, 0x01b9bc19, 0x00192808}}}, + {X: Field{[10]uint32{0x0105668a, 0x0351d35a, 0x03b09e74, 0x03896c4a, 0x00988346, 0x01a01d9e, 0x03138617, 0x01ccb77c, 0x03bdce97, 0x002b91e6}}, Y: Field{[10]uint32{0x02612929, 0x01f02b24, 0x028b3f4b, 0x025fa8fc, 0x02b33a6f, 0x01366f74, 0x01363366, 0x01821e26, 0x0355c599, 0x0028f380}}}, + {X: Field{[10]uint32{0x014898be, 0x01c14b5d, 0x034ff480, 0x029eaabd, 0x039ccc05, 0x01b3f4bd, 0x02abcf83, 0x0136c871, 0x017966f7, 0x0033a4b0}}, Y: Field{[10]uint32{0x001bb978, 0x039e7298, 0x0127ce44, 0x0200fc42, 0x038adebf, 0x0238d15a, 0x019cec9c, 0x00e31329, 0x03f3530f, 0x003cf8f4}}}, + {X: Field{[10]uint32{0x026ea68d, 0x033c589b, 0x03b9f477, 0x0388de28, 0x01a96f5a, 0x02623137, 0x0153d875, 0x01d705dd, 0x02b68152, 0x002282ef}}, Y: Field{[10]uint32{0x03e77f4e, 0x005e60d7, 0x036d64e9, 0x02b08a11, 0x00a7c74e, 0x0216938d, 0x02a9f770, 0x01504ab2, 0x015e46f4, 0x002562de}}}, + {X: Field{[10]uint32{0x01d9ccfe, 0x03944da3, 0x028d00c2, 0x029c721b, 0x027f0e97, 0x017b479e, 0x02a033c0, 0x00038a44, 0x02e99754, 0x0030a913}}, Y: Field{[10]uint32{0x0275668f, 0x02a5514d, 0x03c60596, 0x02e3afda, 0x0170cd17, 0x00ed44da, 0x03b69b29, 0x02941f6f, 0x01ef7d24, 0x0025590d}}}, + {X: Field{[10]uint32{0x019ea1e1, 0x022471c6, 0x01c293cc, 0x02472057, 0x013d3bbe, 0x01510ef3, 0x03785208, 0x037d851e, 0x0225534d, 0x002d857d}}, Y: Field{[10]uint32{0x02c3ea25, 0x037079db, 0x01e12267, 0x0071ace6, 0x00fe3afd, 0x03d97189, 0x02908764, 0x0051a18a, 0x00f199e2, 0x00132afd}}}, + {X: Field{[10]uint32{0x00a75a0e, 0x002e4efa, 0x030b55fd, 0x0153e020, 0x03b64a0c, 0x02602fb9, 0x016dde93, 0x009cab3d, 0x038dfdcf, 0x002bf32b}}, Y: Field{[10]uint32{0x0042a63e, 0x00b05044, 0x00e9554f, 0x01801f62, 0x03e7d6a6, 0x00d6186b, 0x036d9ba7, 0x03113e27, 0x005d6f6f, 0x0002363b}}}, + {X: Field{[10]uint32{0x03135f53, 0x00cf22a6, 0x033ac328, 0x00ab2ce1, 0x03559d07, 0x03de0c02, 0x039395d0, 0x006c987c, 0x02a8c531, 0x0014d05d}}, Y: Field{[10]uint32{0x02b2f436, 0x031f9b22, 0x03643b03, 0x0175a0fb, 0x020b1615, 0x03e9d5be, 0x02f66398, 0x029ed21f, 0x004b5eee, 0x002ae13e}}}, + {X: Field{[10]uint32{0x0391f34c, 0x03f34506, 0x0393ea65, 0x02f194c6, 0x028705ab, 0x00883cfc, 0x03651ac6, 0x025737d1, 0x017397ef, 0x0017dea8}}, Y: Field{[10]uint32{0x0081da22, 0x01215866, 0x02ab8b75, 0x02ef8118, 0x0270cffc, 0x01e9df63, 0x011b28f1, 0x02cd3cbb, 0x00983cdd, 0x001cbdf6}}}, + {X: Field{[10]uint32{0x008f3d3b, 0x00a1ff2b, 0x034490aa, 0x0161a40f, 0x02b6a952, 0x00d6bf5e, 0x001db193, 0x03edcacc, 0x024cc1e2, 0x00353ed2}}, Y: Field{[10]uint32{0x014154f9, 0x02062538, 0x00306088, 0x03de6ba4, 0x02f213ad, 0x037b9e1f, 0x01098cd5, 0x02ca1c67, 0x02e84a9d, 0x001dad5c}}}, + {X: Field{[10]uint32{0x037a9ff4, 0x03515327, 0x035694c6, 0x01716aef, 0x00dad097, 0x00f6c374, 0x013116c2, 0x00bcebde, 0x0163843b, 0x000f719d}}, Y: Field{[10]uint32{0x016753ae, 0x01da980d, 0x01fbf780, 0x01dd3ece, 0x004894b2, 0x0126a022, 0x010ccf80, 0x00edfd0f, 0x039e4db8, 0x00377d96}}}, + {X: Field{[10]uint32{0x02f897d6, 0x01720b28, 0x036b13bb, 0x0176cdb8, 0x039c3e41, 0x00334599, 0x006c4495, 0x0005344e, 0x02bd1edd, 0x00195e44}}, Y: Field{[10]uint32{0x02d505cf, 0x00249fbf, 0x02143430, 0x012327d6, 0x0178205e, 0x03341b1a, 0x007fb3aa, 0x0389023f, 0x03db11bb, 0x00138bf7}}}, + {X: Field{[10]uint32{0x03d69f99, 0x0205c5cf, 0x027b8f90, 0x017f12b7, 0x036f412b, 0x03cffa4d, 0x00473e50, 0x016173d9, 0x03b35f82, 0x00016914}}, Y: Field{[10]uint32{0x00097ebe, 0x02d985d6, 0x00c4fa29, 0x02d5fcad, 0x03ec2fb4, 0x012ae868, 0x01dbf06f, 0x02d64138, 0x02113448, 0x003f05a7}}}, + {X: Field{[10]uint32{0x00052679, 0x02cdece9, 0x03689093, 0x02c83d3f, 0x03d01c68, 0x025a8c10, 0x02cfaf1f, 0x012f21a6, 0x005ac24b, 0x0030eb7d}}, Y: Field{[10]uint32{0x00ae19cc, 0x00ab1a04, 0x017d7edc, 0x020f3b72, 0x014f0d4b, 0x01cae342, 0x0285bea9, 0x012d274e, 0x0207cd37, 0x000f648c}}}, + {X: Field{[10]uint32{0x021e1d56, 0x0103fa57, 0x006b6e90, 0x003eb2c1, 0x035bd84f, 0x007c976b, 0x016420be, 0x0372109d, 0x01c8905d, 0x00068cbb}}, Y: Field{[10]uint32{0x00eb4c51, 0x0108591a, 0x0059c0ca, 0x0203e33e, 0x03f1612c, 0x01a98bd3, 0x00b73ad1, 0x01dfe307, 0x019d113a, 0x001fd19f}}}, + {X: Field{[10]uint32{0x034d6c98, 0x00efc829, 0x006b7b4a, 0x010bac69, 0x02f925c1, 0x03944092, 0x028b7da2, 0x025deb0c, 0x019862e5, 0x001c255f}}, Y: Field{[10]uint32{0x02f09381, 0x03f49cef, 0x03ec1441, 0x00c7c8c9, 0x037d7ee2, 0x02074b14, 0x01513488, 0x0330d282, 0x02c62e42, 0x0009a6d5}}}, + {X: Field{[10]uint32{0x037537a7, 0x03b72120, 0x02b44bd7, 0x015b65da, 0x01bf6dd2, 0x02db37c9, 0x03ae4540, 0x02c5b041, 0x00165a02, 0x0001f9a5}}, Y: Field{[10]uint32{0x005185f5, 0x01a09ad1, 0x03b243e6, 0x0075e28d, 0x03a6aac2, 0x00f91cd8, 0x010d2ce0, 0x0030478b, 0x00db3836, 0x003fee1d}}}, + {X: Field{[10]uint32{0x01df9678, 0x0355495b, 0x018b60ee, 0x01d78ded, 0x003b9d8a, 0x03d10176, 0x03e7ac6f, 0x03a6d492, 0x01597b42, 0x0013e068}}, Y: Field{[10]uint32{0x02e0a78c, 0x02e125e1, 0x038b377c, 0x035e6494, 0x003558ee, 0x0349f7d3, 0x00ffbe16, 0x018196b6, 0x02071867, 0x002c94c4}}}, + {X: Field{[10]uint32{0x014fd547, 0x0068d74a, 0x002d9359, 0x03586f74, 0x009be6fd, 0x024e04cd, 0x020be8de, 0x0196bc2d, 0x03685770, 0x003e8940}}, Y: Field{[10]uint32{0x00e81625, 0x01873512, 0x02f06d4d, 0x029deda5, 0x033b0a1f, 0x03d7b842, 0x0242f0dc, 0x01f2fd75, 0x01e396c7, 0x003c2e64}}}, + {X: Field{[10]uint32{0x032ba3d4, 0x03c09689, 0x02c4d440, 0x0312961d, 0x006b61d6, 0x00ffb1b6, 0x03da5172, 0x00aff0f8, 0x02bd6716, 0x003d37d7}}, Y: Field{[10]uint32{0x0052212b, 0x038ca860, 0x00d44674, 0x016e425c, 0x026380dc, 0x0278dd73, 0x010e384c, 0x017ecb56, 0x02798bc7, 0x002c8ee8}}}, + {X: Field{[10]uint32{0x01ac5015, 0x021c1da8, 0x0141c4a5, 0x00681955, 0x0051b897, 0x0111835b, 0x0228e5c4, 0x016d97eb, 0x031db372, 0x002ad6da}}, Y: Field{[10]uint32{0x02ee2ece, 0x03a972c9, 0x02a9e286, 0x02e3422d, 0x00424f72, 0x01e16b7c, 0x01d7876d, 0x005c60ea, 0x0057ecdc, 0x0005b4b1}}}, + {X: Field{[10]uint32{0x00869e55, 0x01df380a, 0x03981ac8, 0x0264f0c3, 0x0002e08d, 0x01c34e29, 0x0280dcc4, 0x014dc101, 0x007e13db, 0x002a293b}}, Y: Field{[10]uint32{0x037f60a4, 0x01205472, 0x007bb2d2, 0x0356eaec, 0x00754025, 0x01961e29, 0x03d08749, 0x03b94e25, 0x019c2cdf, 0x0012a77b}}}, + {X: Field{[10]uint32{0x00245f48, 0x02c5042e, 0x00faa5f1, 0x03678aaf, 0x016f914d, 0x01970404, 0x0183d081, 0x01836c01, 0x00f633bd, 0x000cdfd5}}, Y: Field{[10]uint32{0x0176dbfc, 0x0159dc60, 0x00a94ea4, 0x0395022c, 0x00679b58, 0x00eaeb93, 0x035452bd, 0x03f12902, 0x0328696a, 0x002514fa}}}, + {X: Field{[10]uint32{0x01901b53, 0x0190ad7f, 0x020e433b, 0x00354a74, 0x00f6db48, 0x00694153, 0x004c7674, 0x02abc415, 0x03abdc2b, 0x003bb8cd}}, Y: Field{[10]uint32{0x029c27be, 0x019091e1, 0x01830872, 0x03357db2, 0x00825616, 0x01a55be2, 0x03a1d8ba, 0x00035292, 0x038802cc, 0x00196b56}}}, + {X: Field{[10]uint32{0x012f1548, 0x00ff3bdd, 0x010b8451, 0x01f143c0, 0x00f56e47, 0x010fc49d, 0x01aaf0cb, 0x00002bb0, 0x021857cb, 0x00167d4b}}, Y: Field{[10]uint32{0x021698be, 0x0383d4e7, 0x00e70a1a, 0x018665e3, 0x014f2254, 0x01bb078a, 0x007006ba, 0x00ec6601, 0x036e8db0, 0x003632a3}}}, + {X: Field{[10]uint32{0x006f3e12, 0x0297c150, 0x0115e8f5, 0x0043cad2, 0x038583ab, 0x01f618a1, 0x01618d9d, 0x036caa2a, 0x020c25fa, 0x001b0802}}, Y: Field{[10]uint32{0x038081f8, 0x03b6527b, 0x03a617d6, 0x0276c5e4, 0x00050464, 0x0170343e, 0x01af24da, 0x03cd7051, 0x004e374c, 0x00053526}}}, + {X: Field{[10]uint32{0x02ac07fa, 0x03fef0e2, 0x002a032c, 0x03e2628f, 0x02f8144f, 0x00e6d95e, 0x02ad8782, 0x02dbe1c6, 0x02fd51df, 0x00059528}}, Y: Field{[10]uint32{0x021a839c, 0x02410f45, 0x037148d5, 0x0317e977, 0x00e36d46, 0x031c5c17, 0x00dcc1d4, 0x0215a6db, 0x01c382d9, 0x0022da59}}}, + {X: Field{[10]uint32{0x03556d77, 0x008cbdd9, 0x02fae8de, 0x0301fa63, 0x027b3ed1, 0x014fe5b5, 0x0182f339, 0x00d55b26, 0x03c9ab47, 0x0031200c}}, Y: Field{[10]uint32{0x01968bac, 0x01ead2fb, 0x002b6f89, 0x01520a2c, 0x010abe4a, 0x0373feab, 0x03873828, 0x00c5a041, 0x00a87bc4, 0x002bcfd2}}}, + {X: Field{[10]uint32{0x003c6032, 0x01390a0f, 0x003baf1a, 0x007c084b, 0x001a9577, 0x015fdea6, 0x005aaea5, 0x00a35462, 0x03faa9d2, 0x0017765d}}, Y: Field{[10]uint32{0x032eb656, 0x01ca8de3, 0x02b4549e, 0x03349d2f, 0x02abb06a, 0x036a81bc, 0x00e52043, 0x023db34b, 0x014aba17, 0x000effe7}}}, + {X: Field{[10]uint32{0x0242a564, 0x03f7ca73, 0x032abefe, 0x01a69760, 0x03261e4c, 0x00f26aba, 0x03f1d8af, 0x025b12f3, 0x0025dd9a, 0x000a9db7}}, Y: Field{[10]uint32{0x01244806, 0x02ad31b5, 0x02c5b2fc, 0x02ab7d85, 0x0307ff82, 0x03d70e20, 0x00c972aa, 0x032b9f7a, 0x02f23ad5, 0x00124d14}}}, + {X: Field{[10]uint32{0x029a4b8d, 0x02e3d2f4, 0x02d6ff2d, 0x02a69279, 0x02fd3935, 0x01198aca, 0x02bab4db, 0x01e48e08, 0x01064c0e, 0x00336f4d}}, Y: Field{[10]uint32{0x017a90ce, 0x03828f15, 0x03143a8c, 0x0054550f, 0x0358b845, 0x021bf6d7, 0x008a84c3, 0x009d3e9a, 0x032eb61e, 0x002c849b}}}, + {X: Field{[10]uint32{0x0354d978, 0x03dc974a, 0x02a75bf6, 0x00969051, 0x012bcfd5, 0x01c4ebfe, 0x0182d6ce, 0x0353d8d3, 0x009b2cb9, 0x00260fc9}}, Y: Field{[10]uint32{0x028abca2, 0x03c12122, 0x033ef0cf, 0x01dc8e20, 0x02af302e, 0x0280b6af, 0x004d25f5, 0x0380b69b, 0x0006850b, 0x001e7349}}}, + {X: Field{[10]uint32{0x00afd4f4, 0x0370630e, 0x0138396f, 0x0227eb78, 0x019e1284, 0x03ec8f94, 0x017e21ef, 0x02a7ce89, 0x01b4a5a0, 0x002231d9}}, Y: Field{[10]uint32{0x015f46c2, 0x0226df56, 0x006971cf, 0x038d170a, 0x02e3336a, 0x034511a0, 0x005cc031, 0x02568f94, 0x02647299, 0x003d357f}}}, + {X: Field{[10]uint32{0x03d52c31, 0x01e960ad, 0x036926b6, 0x001d1580, 0x031d147d, 0x02234398, 0x01c7d08b, 0x032c2866, 0x01ecd603, 0x00065d41}}, Y: Field{[10]uint32{0x01057f15, 0x0158793e, 0x0208f49a, 0x037e88d3, 0x002f212a, 0x0169d6bb, 0x035a7461, 0x017f142b, 0x013bf2d7, 0x00251fb0}}}, + {X: Field{[10]uint32{0x032eaaf8, 0x00c82d8e, 0x00fec668, 0x003fad8e, 0x019a1979, 0x035af013, 0x02700c30, 0x01817d62, 0x0232e10f, 0x00260610}}, Y: Field{[10]uint32{0x03f9c85b, 0x01e3873b, 0x03d7f395, 0x024aac62, 0x01dbbdf1, 0x01b0c7d6, 0x02a837e3, 0x03e8e4c3, 0x02edc0e2, 0x003bcc1d}}}, + {X: Field{[10]uint32{0x000bc002, 0x03e388db, 0x02764892, 0x0205a1a6, 0x02f0c7d0, 0x00c899c3, 0x00f47a9e, 0x004d2de4, 0x0335cba0, 0x00143c36}}, Y: Field{[10]uint32{0x00396072, 0x00cff2da, 0x00edd832, 0x0112e181, 0x009e466b, 0x02389976, 0x03260f65, 0x0213ab9d, 0x0013d98a, 0x000706c7}}}, + {X: Field{[10]uint32{0x01665502, 0x00770c75, 0x03a8680c, 0x005b35af, 0x0099ac85, 0x03d08a3d, 0x00bb19f3, 0x02ed42b9, 0x00ea1a44, 0x003678d0}}, Y: Field{[10]uint32{0x034aaad8, 0x03d2cd56, 0x00f75355, 0x02b49412, 0x01341445, 0x020eebba, 0x0005251b, 0x00864ffe, 0x0288335a, 0x0004a285}}}, + {X: Field{[10]uint32{0x007c539c, 0x00f03e3a, 0x034c91e3, 0x02a42a51, 0x01d42cb4, 0x01557706, 0x03067020, 0x01377631, 0x013301b8, 0x00056aa0}}, Y: Field{[10]uint32{0x0142dbc1, 0x031a9b62, 0x03b1de22, 0x011d17d8, 0x032a14bf, 0x01d8b32e, 0x01d2ba17, 0x019003af, 0x03209658, 0x001e54c1}}}, + {X: Field{[10]uint32{0x025d34d2, 0x0060be1e, 0x0024255e, 0x00608d81, 0x03d489dd, 0x01f1ef88, 0x010d169c, 0x026936e4, 0x030453d1, 0x001bdc21}}, Y: Field{[10]uint32{0x01c7dde2, 0x01e2aa66, 0x02101355, 0x03f569b7, 0x01c15246, 0x01f136ee, 0x029beabd, 0x00afd282, 0x01567c1c, 0x003814c6}}}, + {X: Field{[10]uint32{0x03167674, 0x03e370f1, 0x03f1bf33, 0x0163f8b4, 0x03867f9a, 0x01a2153d, 0x02d97e91, 0x028e9226, 0x00dfcddc, 0x000c7a48}}, Y: Field{[10]uint32{0x03706f39, 0x020a4030, 0x038afdbe, 0x017ec4b2, 0x01244a9c, 0x03af89f7, 0x01576600, 0x01b96054, 0x003d0b0c, 0x00149c4b}}}, + {X: Field{[10]uint32{0x008d51d8, 0x007cb693, 0x015ab8d0, 0x030a1a8c, 0x028258de, 0x00622325, 0x0381fbcf, 0x03c0765b, 0x0211708f, 0x0024cc03}}, Y: Field{[10]uint32{0x026c33ff, 0x00f52838, 0x01f464c9, 0x00d8495b, 0x009e0b76, 0x01961393, 0x0049b536, 0x00823021, 0x02473b6a, 0x00054da1}}}, + {X: Field{[10]uint32{0x03acb3db, 0x0153d973, 0x017dcecd, 0x00c9c81e, 0x0230c946, 0x01c4b072, 0x016cfdf3, 0x019c0818, 0x010bf62d, 0x0023deb5}}, Y: Field{[10]uint32{0x0043c637, 0x03e2d121, 0x01d347e4, 0x01c4197e, 0x001eff0d, 0x00686532, 0x0290080a, 0x014af0cc, 0x023207dc, 0x0016b042}}}, + {X: Field{[10]uint32{0x0189f4a9, 0x022921ca, 0x03dd7445, 0x007723be, 0x027f5cf5, 0x01431822, 0x028f5d73, 0x0035c711, 0x03827627, 0x001bb602}}, Y: Field{[10]uint32{0x01826dc0, 0x0248f422, 0x035a2e00, 0x03c8058e, 0x0177fd3c, 0x01a1f1f8, 0x01e47b7c, 0x039ded19, 0x03f738f6, 0x002f2e8a}}}, + {X: Field{[10]uint32{0x00e3714c, 0x00aed2df, 0x01e38eea, 0x02ca1a52, 0x027c2b11, 0x01dfab68, 0x02cb85f7, 0x02278a58, 0x017db949, 0x003b1b07}}, Y: Field{[10]uint32{0x02d08fdd, 0x02c0c3a7, 0x02516df3, 0x01354bf3, 0x018ef266, 0x02f295d5, 0x00089d0e, 0x037f6c75, 0x01af6042, 0x002b767e}}}, + {X: Field{[10]uint32{0x0237f093, 0x00982112, 0x0335c1fe, 0x023a5519, 0x01c59bca, 0x0042166e, 0x03a82d35, 0x03064964, 0x032c24dc, 0x0023ddf2}}, Y: Field{[10]uint32{0x03e07202, 0x0266cf13, 0x02213831, 0x02f561f9, 0x00423fde, 0x0029c32e, 0x0355bd4f, 0x0267e9c2, 0x0186fbf4, 0x001459d2}}}, + {X: Field{[10]uint32{0x024b6aca, 0x01e30741, 0x0049f1fd, 0x035890f4, 0x011122f2, 0x03d28cb7, 0x00c4ed62, 0x00c6bea9, 0x0374dae8, 0x0038ab77}}, Y: Field{[10]uint32{0x028b2297, 0x020463f8, 0x0323ccf5, 0x02808296, 0x00a73a1a, 0x0369984a, 0x02560224, 0x03ec2c22, 0x03941ead, 0x001f6f2c}}}, + {X: Field{[10]uint32{0x02b1e3eb, 0x011768c0, 0x0072d3e8, 0x0144d2ea, 0x033a22b1, 0x0233516c, 0x03b7c6db, 0x00c7266b, 0x01bc614d, 0x002fdebc}}, Y: Field{[10]uint32{0x00125a21, 0x00bb0b14, 0x03239754, 0x0193c49d, 0x012b8504, 0x00c99ef5, 0x029e2552, 0x02288bee, 0x01e78cf8, 0x0004234e}}}, + {X: Field{[10]uint32{0x02fe50e4, 0x03af1663, 0x01987093, 0x01a29d60, 0x0035b4f0, 0x014b60b3, 0x012c5f69, 0x0196016e, 0x007f0cec, 0x000223ff}}, Y: Field{[10]uint32{0x01378a4c, 0x03713693, 0x00cf4a63, 0x03262e7a, 0x00d39193, 0x008e5159, 0x01558c78, 0x00b0fae8, 0x00ca94b4, 0x000e0b6b}}}, + {X: Field{[10]uint32{0x013a152b, 0x00d4f51f, 0x003b7a28, 0x001cd33e, 0x039070e2, 0x00dbaac9, 0x00569ae6, 0x02b982e7, 0x03840ef4, 0x002c4528}}, Y: Field{[10]uint32{0x00a3fa70, 0x02311df3, 0x03001b18, 0x01d9b629, 0x03bb8260, 0x02ef972f, 0x036438c9, 0x03882981, 0x033ce58e, 0x000df1d9}}}, + {X: Field{[10]uint32{0x03e801b0, 0x036cea31, 0x009da627, 0x00ac6453, 0x00cfb0cd, 0x00c4064b, 0x0368fa1e, 0x008edbe9, 0x002fe20d, 0x00390469}}, Y: Field{[10]uint32{0x019b1039, 0x02140225, 0x0080b91c, 0x02ba2bb1, 0x028f6828, 0x00a2bca6, 0x012bbc17, 0x01e601c9, 0x039b43ee, 0x003fac6d}}}, + {X: Field{[10]uint32{0x00ee1999, 0x0053f35d, 0x00fd7cb8, 0x035fc7d2, 0x0031057a, 0x037979f1, 0x005182ae, 0x008c4f02, 0x007e4643, 0x000647da}}, Y: Field{[10]uint32{0x026dbc72, 0x03d2c7a4, 0x001e60e4, 0x0100f542, 0x0043e5c5, 0x00e02336, 0x0239efb8, 0x0338b566, 0x002b3f77, 0x0015192d}}}, + {X: Field{[10]uint32{0x006bcd81, 0x0023ae54, 0x01bf0b22, 0x01321686, 0x03983774, 0x006bbd4d, 0x018c4ff0, 0x02927bd8, 0x017733b0, 0x0018ffd2}}, Y: Field{[10]uint32{0x00593d3b, 0x0126ca4c, 0x020903ae, 0x02321f89, 0x0039535d, 0x02a4fca9, 0x0287b500, 0x0164c7ce, 0x0397ca83, 0x001b32bb}}}, + {X: Field{[10]uint32{0x03fc2c1c, 0x01f96b6d, 0x015564c5, 0x0291a361, 0x00f4ce72, 0x00ba318a, 0x027056c0, 0x0016e9a7, 0x0025c377, 0x003bf8d9}}, Y: Field{[10]uint32{0x01970ad5, 0x02443014, 0x032d08dd, 0x0049485c, 0x028faa7f, 0x00b956ec, 0x01a5f52c, 0x0127160c, 0x035f27ac, 0x000e4ae6}}}, + {X: Field{[10]uint32{0x037e94a5, 0x0001477d, 0x00a99988, 0x00dd3968, 0x02841d47, 0x005c1287, 0x01419102, 0x0302346f, 0x026bdd7c, 0x0001b484}}, Y: Field{[10]uint32{0x00e6e806, 0x01be55a1, 0x015f55da, 0x02c236bd, 0x03efb4d4, 0x02b50849, 0x0372ce6e, 0x02fa5d4b, 0x023acda1, 0x000ba6e0}}}, + {X: Field{[10]uint32{0x00933743, 0x037da941, 0x02f54b20, 0x03261ad3, 0x006d453a, 0x00732a4f, 0x006340dc, 0x02716e47, 0x03f4297d, 0x0033dee7}}, Y: Field{[10]uint32{0x03670c15, 0x02ea8ffa, 0x012ca083, 0x031078d8, 0x00c20613, 0x03dd46d5, 0x01efec2b, 0x0000ac44, 0x008a2c07, 0x002295e0}}}, + {X: Field{[10]uint32{0x01f7e83e, 0x0093f981, 0x023f2c15, 0x02ffdf00, 0x0027f5a5, 0x038b5568, 0x01ba4e80, 0x017b8747, 0x002b4cbe, 0x002c5809}}, Y: Field{[10]uint32{0x000fb5a0, 0x016e318f, 0x01567607, 0x03d19f42, 0x024f1faa, 0x03ece74f, 0x02e9f540, 0x0049801f, 0x03956cf3, 0x0002b0d5}}}, + {X: Field{[10]uint32{0x02bb050e, 0x0336a95a, 0x02733c02, 0x031b7f43, 0x021744d9, 0x0098669c, 0x013dce02, 0x0063661b, 0x012c4f89, 0x001ea191}}, Y: Field{[10]uint32{0x010de179, 0x02daf172, 0x0285a91e, 0x03e90f62, 0x00542370, 0x025b3d15, 0x02a1fb35, 0x02c383ee, 0x031cb558, 0x000c34c2}}}, + {X: Field{[10]uint32{0x002323b9, 0x0014bfd6, 0x01372408, 0x01024e07, 0x00af41ba, 0x025f19dc, 0x0296d3ab, 0x001bbc3a, 0x001a64d2, 0x00289e6f}}, Y: Field{[10]uint32{0x00e42046, 0x0129af1b, 0x0261da1b, 0x034d2d60, 0x02e96199, 0x0380cc60, 0x01a7ab1f, 0x02f1119e, 0x013d701e, 0x002bbf21}}}, + {X: Field{[10]uint32{0x01e5cc76, 0x039bb1aa, 0x0301a0d4, 0x0218987a, 0x00f76918, 0x03167e1a, 0x00c301aa, 0x0005ad82, 0x01705c16, 0x003a38a1}}, Y: Field{[10]uint32{0x030a983d, 0x02cfab27, 0x01eb8f2f, 0x01989da6, 0x02c988ea, 0x02509c9c, 0x0303b7a4, 0x0201442d, 0x0315f8e7, 0x00248d40}}}, + {X: Field{[10]uint32{0x029f2bbd, 0x03833862, 0x03e73459, 0x0216e4e6, 0x0046da15, 0x01cd3e73, 0x015f300a, 0x03f20601, 0x02f814f3, 0x0007f673}}, Y: Field{[10]uint32{0x00abb55e, 0x02230367, 0x025cd264, 0x02a5e528, 0x00c26d79, 0x00117c08, 0x003c71bc, 0x033239bb, 0x033fa50f, 0x0037313d}}}, + {X: Field{[10]uint32{0x027e5f11, 0x006b41a4, 0x0174d39f, 0x02db3d39, 0x03c609d4, 0x03cd93db, 0x0148942d, 0x017f583f, 0x02fc7027, 0x000c86c6}}, Y: Field{[10]uint32{0x00add33d, 0x015118e0, 0x01680c5b, 0x03e3b40a, 0x03725a80, 0x0293207e, 0x01ad36f8, 0x02cc46ba, 0x00ef808b, 0x0004da3b}}}, + {X: Field{[10]uint32{0x02d7bf72, 0x02310bbd, 0x01741810, 0x02731433, 0x03f9ef1e, 0x0037b095, 0x010cad9b, 0x038e4f6b, 0x01fb6518, 0x00137fca}}, Y: Field{[10]uint32{0x00dfb70c, 0x003d308c, 0x00efde4d, 0x022d20c1, 0x02d92f8f, 0x004fb23d, 0x03bfd067, 0x013a0935, 0x006e05aa, 0x0010565e}}}, + {X: Field{[10]uint32{0x00ed1e0b, 0x00dcfdd7, 0x001b9274, 0x01ca56a3, 0x00c839b9, 0x028fcb95, 0x03162e11, 0x00157196, 0x00a5eb63, 0x0024dea1}}, Y: Field{[10]uint32{0x0166afc6, 0x0253cdde, 0x01954532, 0x02c6a73e, 0x0162c122, 0x038f9e8b, 0x03fb3b52, 0x028d4769, 0x00bbbf11, 0x00280c1e}}}, + {X: Field{[10]uint32{0x016cc3d2, 0x03c111fa, 0x03c7a56d, 0x024ecc5d, 0x0156f073, 0x0176dff1, 0x032a87d2, 0x01cee13e, 0x029b7cab, 0x002f8fea}}, Y: Field{[10]uint32{0x02faf77f, 0x02625a02, 0x00ee1029, 0x01a9f8d2, 0x02927644, 0x03a47dfd, 0x01dacc44, 0x0252bd5c, 0x02e01ad7, 0x0039c147}}}, + {X: Field{[10]uint32{0x016c9b41, 0x0037c55d, 0x021f8c68, 0x004ec3ef, 0x0136928d, 0x001635f7, 0x01d24da6, 0x035419d9, 0x006bcc36, 0x00162ce7}}, Y: Field{[10]uint32{0x023d74ff, 0x00b4fc10, 0x0063dad7, 0x0278315e, 0x03b4ecd9, 0x00fdeb9b, 0x0012b777, 0x011b669d, 0x0291aaa8, 0x001127a5}}}, + {X: Field{[10]uint32{0x03765798, 0x00af7270, 0x007b2819, 0x00ac71cb, 0x008c9128, 0x02195d0b, 0x00e21000, 0x002d19c8, 0x0171b166, 0x0026c62a}}, Y: Field{[10]uint32{0x02e0f49f, 0x024b8c4c, 0x03d506c7, 0x00dc1673, 0x022be28d, 0x02819405, 0x0007a934, 0x03e0f4b3, 0x012298ad, 0x000a04b9}}}, + {X: Field{[10]uint32{0x02c0f59e, 0x0286cfb7, 0x002d7f73, 0x031724a5, 0x02c86740, 0x005de209, 0x035e2076, 0x0352f5e8, 0x0003dbac, 0x0029b113}}, Y: Field{[10]uint32{0x0056077f, 0x0124f31c, 0x000e0797, 0x027b1032, 0x022258d2, 0x02abce71, 0x03737278, 0x00d041da, 0x037cd1fa, 0x001ccc5a}}}, + {X: Field{[10]uint32{0x01682ee3, 0x00168e88, 0x03aaa21a, 0x010eefe8, 0x005dde20, 0x012b5e28, 0x037495b9, 0x03e35760, 0x0355628f, 0x0007fec9}}, Y: Field{[10]uint32{0x03b5943b, 0x016bfe36, 0x02fec5f9, 0x02b71a43, 0x03a71243, 0x01c38aa0, 0x019962df, 0x022db3ff, 0x00f7006b, 0x0012811e}}}, + {X: Field{[10]uint32{0x019b8283, 0x03c79e10, 0x0025c3d6, 0x039c23ed, 0x02b67a21, 0x023b97dc, 0x02538a80, 0x00451120, 0x008e3605, 0x002ba931}}, Y: Field{[10]uint32{0x01a80b27, 0x01aeea50, 0x0099b221, 0x00c1ad91, 0x0282c7b5, 0x039c44cc, 0x009d216c, 0x02ce5ef6, 0x02b8c28e, 0x001145f2}}}, + {X: Field{[10]uint32{0x034ed3eb, 0x025e6402, 0x03127f52, 0x0050e0af, 0x030b972f, 0x0000f29b, 0x036fabb5, 0x0009c210, 0x03fa5f8c, 0x00377166}}, Y: Field{[10]uint32{0x03d995c1, 0x0014d17a, 0x02696996, 0x0200ea65, 0x01ad7dbc, 0x0108117a, 0x00370b67, 0x01d6d94f, 0x019fb80e, 0x003db0fc}}}, + {X: Field{[10]uint32{0x014c80a8, 0x00f162c1, 0x0237d0d0, 0x032619a9, 0x0394d204, 0x011d0bdb, 0x03f83ed6, 0x006cb58a, 0x03e7ed30, 0x00088613}}, Y: Field{[10]uint32{0x0179b442, 0x00d85020, 0x00ab4ace, 0x01a8ee03, 0x013bc55d, 0x015a6095, 0x03a389dc, 0x028f5585, 0x01281073, 0x00276c9d}}}, + {X: Field{[10]uint32{0x0201cef3, 0x02a8debc, 0x02eeaf98, 0x00421c4d, 0x036488c5, 0x02ebf0f2, 0x030ed2d6, 0x01bd29d2, 0x03f474e4, 0x00396185}}, Y: Field{[10]uint32{0x02aa2220, 0x013e393c, 0x019d436d, 0x038b93d4, 0x00c6b141, 0x0126906c, 0x03f2047d, 0x038179c6, 0x037552dd, 0x00331a9c}}}, + {X: Field{[10]uint32{0x024f8e41, 0x0280de60, 0x0046c5b2, 0x003c740a, 0x02b7394a, 0x029cecfc, 0x02c2c5ab, 0x0317fb79, 0x00925add, 0x00306a90}}, Y: Field{[10]uint32{0x028c687b, 0x0161b074, 0x0357028b, 0x009815c4, 0x032475bf, 0x0020ead4, 0x016ce735, 0x03d58254, 0x0307e30a, 0x0025c4eb}}}, + {X: Field{[10]uint32{0x01df6168, 0x034a46b0, 0x01b5ac08, 0x0082c2dc, 0x0069e4d3, 0x001931c6, 0x00cd1c23, 0x01916407, 0x008d8957, 0x0012a976}}, Y: Field{[10]uint32{0x0113e6e6, 0x0034cab2, 0x006adf24, 0x020b7396, 0x010c0484, 0x01e01920, 0x0336cc3f, 0x00a23b1a, 0x001b915c, 0x000743a9}}}, + {X: Field{[10]uint32{0x02a8a977, 0x025be4e8, 0x031e7432, 0x01c4e477, 0x02738d41, 0x02a1a680, 0x025e192f, 0x01e0d372, 0x01917313, 0x0024e1db}}, Y: Field{[10]uint32{0x026457a4, 0x01beeb5e, 0x03c3de2d, 0x023e74a9, 0x0173fc6c, 0x015e1a9a, 0x0263d9dd, 0x03514093, 0x023d32ba, 0x001e5211}}}, + {X: Field{[10]uint32{0x011b7b28, 0x012243ea, 0x006ee50e, 0x00295310, 0x035d1808, 0x00bcabcd, 0x033dd13f, 0x020096c8, 0x017d3026, 0x00032033}}, Y: Field{[10]uint32{0x0318bc4b, 0x03f9486d, 0x00292278, 0x03249e1c, 0x019e6260, 0x031eb49d, 0x008f904a, 0x0047e459, 0x018b1f1d, 0x0027dced}}}, + {X: Field{[10]uint32{0x00c8c5cb, 0x010943a8, 0x01bb8fba, 0x0310f39e, 0x00e8e7e7, 0x01ea70c3, 0x004e8579, 0x028d16a3, 0x00d97dd4, 0x0034af49}}, Y: Field{[10]uint32{0x02494b9e, 0x0059ae41, 0x030f7665, 0x0257b868, 0x00055ae8, 0x0027ac0a, 0x03310558, 0x0064c640, 0x00b815cb, 0x000cc3c3}}}, + {X: Field{[10]uint32{0x01d7e9f4, 0x000cc1d7, 0x038b8dc3, 0x02254568, 0x015d7225, 0x00eae605, 0x015457df, 0x03a863ec, 0x03a290de, 0x00353928}}, Y: Field{[10]uint32{0x027d1c21, 0x0308774f, 0x038a56ee, 0x01b2e452, 0x0271c57a, 0x014867a6, 0x02bdc9ba, 0x03b2c5d0, 0x013e77d0, 0x00121512}}}, + {X: Field{[10]uint32{0x03236d19, 0x026f9b51, 0x02bea277, 0x00b85807, 0x03d318f8, 0x0039db8a, 0x011b246f, 0x038e67f3, 0x00f4810d, 0x003c3edb}}, Y: Field{[10]uint32{0x00595daf, 0x03b779eb, 0x00d07ad0, 0x034df3d6, 0x022cc9b4, 0x03aca907, 0x030b1973, 0x0008e622, 0x01606648, 0x0038eb54}}}, + {X: Field{[10]uint32{0x00858939, 0x01cec40d, 0x03ab0ebf, 0x03c66191, 0x039a4f9d, 0x000ac3f1, 0x0191740d, 0x011c30da, 0x018e3f4c, 0x003753b1}}, Y: Field{[10]uint32{0x00a3bfe3, 0x00df6810, 0x0246417e, 0x024253fe, 0x00737a63, 0x0107a4b7, 0x038c8395, 0x01633bc9, 0x0086a3b0, 0x000e9bb3}}}, + {X: Field{[10]uint32{0x03904e51, 0x02baedea, 0x01a8b8fd, 0x00eb771d, 0x012af12f, 0x013dab78, 0x02fe1b6c, 0x03655353, 0x01101d7e, 0x0003b15a}}, Y: Field{[10]uint32{0x0050c54a, 0x02df9435, 0x01d6dbe0, 0x02b6cb30, 0x01be7cba, 0x008bc988, 0x027111ae, 0x013dc50c, 0x027f5d59, 0x000d25f1}}}, + {X: Field{[10]uint32{0x03aa35c5, 0x03668676, 0x03da5a85, 0x02c38a2a, 0x03e25ef6, 0x013b70f2, 0x025e1aa6, 0x015a95f2, 0x02f80518, 0x00329177}}, Y: Field{[10]uint32{0x003521b2, 0x034cf6dc, 0x03df04d1, 0x01a569e8, 0x026eb4ed, 0x0044dcb0, 0x013fcde1, 0x02e7af80, 0x0357268d, 0x0036e2c8}}}, + {X: Field{[10]uint32{0x01b49a47, 0x03702485, 0x022e65f6, 0x00550d73, 0x0040f8ba, 0x03722925, 0x003c8b63, 0x00878920, 0x03889645, 0x002d1314}}, Y: Field{[10]uint32{0x02198d00, 0x018aa0f7, 0x031f5724, 0x02a7076b, 0x01509890, 0x021459ae, 0x0125e04b, 0x012e033c, 0x035df30c, 0x000b8590}}}, + {X: Field{[10]uint32{0x005dea26, 0x033fb2b8, 0x00603666, 0x0386d66d, 0x0333a20c, 0x02d1b65d, 0x01291a54, 0x00bc503a, 0x01e23586, 0x00256dcd}}, Y: Field{[10]uint32{0x024aabb9, 0x01159d49, 0x02553211, 0x02c4a1ba, 0x00f22ab5, 0x01ba0302, 0x03c9977b, 0x02f86426, 0x03055f38, 0x00384a05}}}, + {X: Field{[10]uint32{0x03e5bdfc, 0x024a3b5c, 0x027cee56, 0x02c99b06, 0x00a15c71, 0x03b91c5b, 0x028d2313, 0x00098db3, 0x00678fbb, 0x0020f676}}, Y: Field{[10]uint32{0x03949246, 0x021a1eda, 0x00545991, 0x0308df7e, 0x00c35027, 0x0267d280, 0x03e7d784, 0x03c4cbbf, 0x002fbe92, 0x00381253}}}, + {X: Field{[10]uint32{0x01bbae03, 0x010ddc12, 0x016f02e8, 0x0233cc37, 0x031d3b47, 0x02453891, 0x036bad16, 0x0151b6ef, 0x0085a04c, 0x000262df}}, Y: Field{[10]uint32{0x032ace57, 0x02718f4e, 0x00972e56, 0x03e510d9, 0x01ce4106, 0x0042c299, 0x0027da4a, 0x037f6764, 0x03953733, 0x001da70e}}}, + {X: Field{[10]uint32{0x03b12e45, 0x01018aa8, 0x01dfe086, 0x02c46691, 0x0375019c, 0x03699b54, 0x0358a8f4, 0x00d3b0d0, 0x0277852d, 0x000f39ed}}, Y: Field{[10]uint32{0x027e409a, 0x0158b751, 0x03218e42, 0x03677913, 0x0102cf03, 0x0179062a, 0x0272c4bd, 0x022e1a58, 0x010f0183, 0x001a349e}}}, + {X: Field{[10]uint32{0x02d7836f, 0x011c9fb2, 0x03291e07, 0x0320265e, 0x036b50bd, 0x00550ae0, 0x010dca75, 0x01c40507, 0x00f4d4da, 0x00282f0a}}, Y: Field{[10]uint32{0x03e47c88, 0x02d21665, 0x012242a8, 0x02f329e1, 0x02177eec, 0x027c58f4, 0x005a5819, 0x01e0735a, 0x014940f2, 0x001bb5f8}}}, + {X: Field{[10]uint32{0x02185c0b, 0x03846ac7, 0x00b6818f, 0x03126863, 0x0397750f, 0x00350660, 0x01d290ac, 0x0358ad39, 0x03a352b1, 0x002695c6}}, Y: Field{[10]uint32{0x011b4ad1, 0x0078a56b, 0x00128ff6, 0x01c26f76, 0x030f6c28, 0x00d19245, 0x03c0dfed, 0x03d63e73, 0x00cdb2b1, 0x0006a473}}}, + {X: Field{[10]uint32{0x0221b9bf, 0x03d91f8a, 0x00b93d53, 0x00760d23, 0x004e135c, 0x016a312c, 0x024eca55, 0x0379cc34, 0x004fcdd2, 0x003ee815}}, Y: Field{[10]uint32{0x0374568a, 0x015f8109, 0x023f7aed, 0x0327df6f, 0x02f71a6c, 0x03e0ef9a, 0x02fe631f, 0x01ab3cba, 0x0025a4ec, 0x001e8469}}}, + {X: Field{[10]uint32{0x00920a9b, 0x02af2875, 0x00b485f7, 0x00551585, 0x01ecad11, 0x0070eeb6, 0x002bdd70, 0x03d988e4, 0x013a1edb, 0x00365ac9}}, Y: Field{[10]uint32{0x0318c2e8, 0x0341980e, 0x031f2408, 0x0322c5cb, 0x021499f1, 0x03ccc54d, 0x027d09f2, 0x02e0c4bc, 0x0198f951, 0x000af222}}}, + {X: Field{[10]uint32{0x02267c2b, 0x012e2990, 0x0135613a, 0x00ba51f0, 0x01982338, 0x03e5c8fe, 0x02e14da0, 0x02e09652, 0x03ce1081, 0x000acf05}}, Y: Field{[10]uint32{0x036048ff, 0x037e9a4c, 0x0074fdbb, 0x030b6ef3, 0x02e77205, 0x009e8aad, 0x007f1fa4, 0x00916e23, 0x009f2ebd, 0x00293356}}}, + {X: Field{[10]uint32{0x016439f9, 0x0158da72, 0x021252eb, 0x03253f61, 0x013f6bc5, 0x03891367, 0x0313ea72, 0x0148b1a4, 0x0380fdac, 0x001a5a61}}, Y: Field{[10]uint32{0x01a03154, 0x0007ddc9, 0x0020ec10, 0x0053f880, 0x018d6e43, 0x02ee6653, 0x02b59439, 0x011d7f01, 0x03c6460f, 0x003a3bac}}}, + {X: Field{[10]uint32{0x00848c68, 0x0257be68, 0x03c6d763, 0x03f2b8bf, 0x02d1577e, 0x02ff0bd2, 0x03e172c9, 0x03713258, 0x02114cb4, 0x00078d11}}, Y: Field{[10]uint32{0x004f5b19, 0x00d0db10, 0x01e1da47, 0x00858167, 0x01a2bb46, 0x02ef1b54, 0x016d4643, 0x0268382e, 0x00dfe6f5, 0x0037aeee}}}, + {X: Field{[10]uint32{0x006aa61a, 0x022ba34a, 0x03a1fc55, 0x0213109c, 0x03d5c302, 0x034d78a1, 0x012c191b, 0x00aa6ae8, 0x02024c7f, 0x001b33eb}}, Y: Field{[10]uint32{0x02e7cb11, 0x0120e22d, 0x02de854e, 0x03c7ba0e, 0x0194c4cd, 0x00791623, 0x002ade25, 0x028bf74d, 0x01740c78, 0x00308050}}}, + {X: Field{[10]uint32{0x024c728e, 0x02c5b8b2, 0x0077ec32, 0x00fe525f, 0x02db4315, 0x006884a2, 0x03f0a2e6, 0x0284ccd6, 0x008769b6, 0x0016d7f5}}, Y: Field{[10]uint32{0x00f00c77, 0x039df363, 0x0108850f, 0x03694f10, 0x015a54c9, 0x01a1c46d, 0x01f26321, 0x027513ab, 0x013fb23c, 0x0026550d}}}, + {X: Field{[10]uint32{0x035d069e, 0x01aa6f00, 0x0221565a, 0x0277d504, 0x03e6a41d, 0x00c8ed8f, 0x03bbbd27, 0x01137587, 0x025727af, 0x001add28}}, Y: Field{[10]uint32{0x0032a34c, 0x02674cfd, 0x01756480, 0x01185491, 0x0039b87a, 0x03c01326, 0x03d689c5, 0x0237fed6, 0x0214f17b, 0x00029384}}}, + {X: Field{[10]uint32{0x00e372a2, 0x02fc50ee, 0x004b263c, 0x01b02ab8, 0x03868860, 0x03823cc5, 0x03408b9f, 0x03b4060d, 0x01878ae9, 0x00145c68}}, Y: Field{[10]uint32{0x03172d06, 0x01009d82, 0x037e8681, 0x0057164e, 0x0044da8e, 0x02a3c829, 0x024a4728, 0x014f33f9, 0x026b9641, 0x002d79f7}}}, + {X: Field{[10]uint32{0x03c8e80d, 0x03a5b350, 0x0356c279, 0x024a102d, 0x03dbce8a, 0x014a562a, 0x018568ce, 0x03bcc8d4, 0x006a4337, 0x00037e7a}}, Y: Field{[10]uint32{0x03027da7, 0x0246ed1c, 0x001df5f5, 0x037c1865, 0x0250b2cc, 0x03a4e04c, 0x00e8ff61, 0x01182844, 0x02eec72f, 0x001510ae}}}, + {X: Field{[10]uint32{0x0087c850, 0x0200608e, 0x033072ec, 0x024dedb4, 0x00ac9e46, 0x0240fef4, 0x0076ab73, 0x007dc6be, 0x0279eb6f, 0x003381c0}}, Y: Field{[10]uint32{0x02a155eb, 0x0037b52d, 0x01e84aea, 0x025d4e37, 0x016ea230, 0x0247e2b6, 0x03f2a79e, 0x034d1787, 0x01f988f9, 0x0037a0f7}}}, + {X: Field{[10]uint32{0x002f35fd, 0x01fcd213, 0x00c40766, 0x026c3b4a, 0x0296e578, 0x0274234d, 0x0238936c, 0x03213160, 0x006244af, 0x00280957}}, Y: Field{[10]uint32{0x033c6f7a, 0x0383459d, 0x0269f17e, 0x005f3589, 0x0206cd50, 0x02c83c88, 0x0098293f, 0x02635c32, 0x0007aef8, 0x0024f8b5}}}, + {X: Field{[10]uint32{0x02f0d86b, 0x009b72a1, 0x03ef0d51, 0x010370bd, 0x02138e18, 0x00e0ffd8, 0x00e1197a, 0x01775c50, 0x02adb76d, 0x002ba0b7}}, Y: Field{[10]uint32{0x0320964a, 0x02057295, 0x027c65f5, 0x01606668, 0x0072d36b, 0x038c2d64, 0x036d8ec2, 0x001de6a7, 0x03accaaa, 0x0008e76e}}}, + {X: Field{[10]uint32{0x02332393, 0x00dd7645, 0x0088444c, 0x02b27024, 0x0197c597, 0x02250918, 0x016441ea, 0x0178bb56, 0x01cebee6, 0x0033c266}}, Y: Field{[10]uint32{0x02748ca4, 0x017fecce, 0x01880865, 0x03481a4d, 0x011c664a, 0x016b736f, 0x03f8cd54, 0x03b75407, 0x03d2f074, 0x00198832}}}, + {X: Field{[10]uint32{0x00d3965c, 0x01600ce7, 0x0222a762, 0x00065151, 0x029ec068, 0x02eb2ecd, 0x03ff1b41, 0x02c06d8e, 0x03746404, 0x0017ed2b}}, Y: Field{[10]uint32{0x032abff5, 0x0338e489, 0x03e93d99, 0x02d16553, 0x00916a51, 0x01239d12, 0x009529fa, 0x01a5f350, 0x02e12cce, 0x0011932c}}}, + {X: Field{[10]uint32{0x033216b4, 0x00e83cc6, 0x023a0199, 0x003e0453, 0x002c7a35, 0x00af12b3, 0x01e5687a, 0x008cb815, 0x000a46b5, 0x00056bcf}}, Y: Field{[10]uint32{0x01d45a83, 0x00e95d33, 0x03b37ad8, 0x02795a96, 0x0286c818, 0x028ffdee, 0x035acd93, 0x00e2c11c, 0x039bbdce, 0x002b80dc}}}, + {X: Field{[10]uint32{0x000b4b10, 0x00cf8d95, 0x0046576d, 0x021d9034, 0x0232c887, 0x00b65cf6, 0x00b8b5d3, 0x0333150b, 0x01d1d008, 0x0017400d}}, Y: Field{[10]uint32{0x0254c465, 0x00f9ef9b, 0x02f39617, 0x023356d2, 0x0376db8a, 0x00e9d3c5, 0x009061f7, 0x027ca19a, 0x00e5bffa, 0x001123b6}}}, + {X: Field{[10]uint32{0x03c95527, 0x01eeb520, 0x03915e02, 0x0013f12b, 0x02a40b07, 0x03f1a78e, 0x039d322f, 0x01277fb6, 0x00f39cf7, 0x0025131c}}, Y: Field{[10]uint32{0x006c6f0c, 0x023b2f6e, 0x02fc21a1, 0x03f52388, 0x02df10ac, 0x012699a6, 0x026e95ce, 0x024cc992, 0x003bbf48, 0x002c2b03}}}, + {X: Field{[10]uint32{0x011e4402, 0x02f17585, 0x00acc846, 0x0095b34a, 0x0052e262, 0x02b58bc1, 0x0246754d, 0x00f128fc, 0x01f082ec, 0x003e9486}}, Y: Field{[10]uint32{0x027afae9, 0x0138fcc2, 0x0065a01b, 0x00af7340, 0x01eb730d, 0x000a240c, 0x0364f26a, 0x00c4cb5e, 0x01e9d640, 0x000cb3a0}}}, + {X: Field{[10]uint32{0x00a30ede, 0x010e4a0e, 0x03032704, 0x01ad766f, 0x0085c6a1, 0x0162e146, 0x009455a8, 0x03898c14, 0x0230ddbe, 0x00327d2a}}, Y: Field{[10]uint32{0x00ad7b7c, 0x02dd8c8d, 0x01baea15, 0x00d30be9, 0x03add203, 0x01adcee9, 0x00927994, 0x02bcc66a, 0x03c6b438, 0x0017bdc5}}}, + {X: Field{[10]uint32{0x03770319, 0x0305e39e, 0x02120162, 0x018b7bba, 0x020529b3, 0x01cb53ff, 0x00dd2fdc, 0x0355a56c, 0x03ca7454, 0x000bd33c}}, Y: Field{[10]uint32{0x02f7d487, 0x0033ade8, 0x02042d5a, 0x0317fc51, 0x02fe7c87, 0x02dd9c24, 0x03c1ce0f, 0x03af2fd1, 0x020e3566, 0x003736a4}}}, + {X: Field{[10]uint32{0x01969945, 0x02a5ae1e, 0x02af40a0, 0x01080891, 0x02a1cb0a, 0x007e46cf, 0x03a41a75, 0x035d2bc1, 0x01762e0c, 0x000905fd}}, Y: Field{[10]uint32{0x027807d9, 0x02e9ffc7, 0x02ceefcf, 0x01b65aea, 0x01741ef9, 0x0072d13b, 0x02d0a3f6, 0x01c6f2b6, 0x0355f8dc, 0x001aa5b5}}}, + {X: Field{[10]uint32{0x0088852c, 0x02d86e16, 0x008c66cf, 0x002bba45, 0x00d43d06, 0x02ecf6e9, 0x01ca5bac, 0x00707d9d, 0x0384305a, 0x0026ac8b}}, Y: Field{[10]uint32{0x0028a03e, 0x02d45ea9, 0x01c18e23, 0x01acb32a, 0x03b51d99, 0x02b3768e, 0x02ac12a7, 0x0238e9eb, 0x02faa258, 0x002bc141}}}, + {X: Field{[10]uint32{0x00a72b6c, 0x00074749, 0x02f52875, 0x00996858, 0x0077a917, 0x038551c9, 0x00ed8787, 0x01e4980a, 0x02a22462, 0x003dd087}}, Y: Field{[10]uint32{0x0343fcf6, 0x00224015, 0x004dd8f5, 0x03322160, 0x01fe1c72, 0x03351845, 0x032ca6d8, 0x0104cbcd, 0x0265e448, 0x0036c2b9}}}, + {X: Field{[10]uint32{0x035c6f75, 0x00ef5ff7, 0x01e35496, 0x02edf65c, 0x0110a912, 0x02e61d6c, 0x00bb7918, 0x015fa370, 0x02f3548d, 0x000d5d5a}}, Y: Field{[10]uint32{0x0077a1d2, 0x01c26378, 0x0260fc51, 0x023882c5, 0x0186d94b, 0x03538658, 0x02d69aeb, 0x02d3f753, 0x01ba78a2, 0x0007291b}}}, + {X: Field{[10]uint32{0x03f01837, 0x031136c6, 0x01bc0241, 0x030bf80c, 0x03de4041, 0x0036b9ff, 0x0049d9ab, 0x03ebc859, 0x000c494c, 0x0029fa7c}}, Y: Field{[10]uint32{0x021a0280, 0x02013005, 0x008b7d10, 0x03793bd4, 0x005a7760, 0x02d7eedd, 0x013d0093, 0x0101aa5d, 0x01ae480b, 0x003cabae}}}, + {X: Field{[10]uint32{0x0262adb7, 0x03d79bf2, 0x03c1ac88, 0x028a4213, 0x0064838a, 0x0195739c, 0x037755b7, 0x00a1e5dc, 0x01ba9287, 0x001a5147}}, Y: Field{[10]uint32{0x002b1cd9, 0x00fc69ec, 0x0143c0c7, 0x01ed468c, 0x00107153, 0x01b1ee54, 0x01845d49, 0x03c244c7, 0x03a8d40d, 0x00098863}}}, + {X: Field{[10]uint32{0x02abf06d, 0x01b338f6, 0x00ad35eb, 0x003c3148, 0x0089a92d, 0x0220817f, 0x0186a375, 0x0299bf3a, 0x033015cc, 0x0031270e}}, Y: Field{[10]uint32{0x000e354c, 0x01b59f16, 0x01b5e621, 0x02714f8c, 0x03624291, 0x034ab425, 0x00f9ca99, 0x000ac383, 0x004a665b, 0x001ebf7a}}}, + {X: Field{[10]uint32{0x039dae8f, 0x01ad891a, 0x003871ab, 0x0110215c, 0x0090c0c7, 0x0047053e, 0x036ee1df, 0x01b8e316, 0x01bfb68e, 0x003a7860}}, Y: Field{[10]uint32{0x01ef5e1b, 0x0309a8b5, 0x00018fc6, 0x0297868d, 0x00d1af5c, 0x00d946a9, 0x007e260c, 0x010c5c24, 0x02db3f39, 0x002c2f3f}}}, + {X: Field{[10]uint32{0x02392324, 0x00b8c0b7, 0x028bc406, 0x00e2ae67, 0x012e7d87, 0x0035b87e, 0x01c9e52e, 0x01073d6d, 0x006f0adf, 0x00290a16}}, Y: Field{[10]uint32{0x01b8d142, 0x019fc225, 0x031c83f9, 0x00fd37a0, 0x01a2a741, 0x012737ba, 0x03911e8b, 0x0324dd96, 0x018bfe71, 0x001df0f8}}}, + {X: Field{[10]uint32{0x032712cf, 0x03743641, 0x0194d785, 0x039d7bfb, 0x0038077b, 0x0195a99d, 0x00a4830b, 0x0068952d, 0x02d2de1d, 0x003d724b}}, Y: Field{[10]uint32{0x033958fb, 0x019c2e7a, 0x03f1ed7c, 0x01f80699, 0x01228fdf, 0x01471446, 0x01f6dcbc, 0x0127356d, 0x013a4978, 0x001fba63}}}, + {X: Field{[10]uint32{0x009c3f66, 0x023c062d, 0x034bdf26, 0x031ffc95, 0x01e18c19, 0x019ed55c, 0x01b69307, 0x03d418c4, 0x03ca6c85, 0x002a15c1}}, Y: Field{[10]uint32{0x028aa050, 0x006367d7, 0x0273d775, 0x00d5356e, 0x00536543, 0x00dee3ee, 0x0367d103, 0x038626ab, 0x0271cde2, 0x0005e17f}}}, + {X: Field{[10]uint32{0x00a7468d, 0x0250bfb0, 0x0197c0f9, 0x01819e9f, 0x00d084ab, 0x027b2971, 0x01e0cf81, 0x03470bcb, 0x035fa4c8, 0x0002219b}}, Y: Field{[10]uint32{0x0188336e, 0x024c120d, 0x0009afe6, 0x022e9fb0, 0x02291528, 0x01d8af9b, 0x02c49adc, 0x0241e8bd, 0x026c3f33, 0x000c0508}}}, + {X: Field{[10]uint32{0x020688cc, 0x02f8532b, 0x03d66f40, 0x02d59186, 0x0392af22, 0x036901b3, 0x03d07c8b, 0x00b5a385, 0x017337eb, 0x001097db}}, Y: Field{[10]uint32{0x004d4980, 0x035a63f4, 0x03dbdef8, 0x016561c6, 0x00096436, 0x0202f67f, 0x0373290e, 0x038e446a, 0x026f7c42, 0x003a1954}}}, + {X: Field{[10]uint32{0x00323139, 0x03208f5a, 0x019a2f8a, 0x02bcef27, 0x0236bfe6, 0x00f7ad2f, 0x00184414, 0x02cff555, 0x003e1de3, 0x0003dc3f}}, Y: Field{[10]uint32{0x0224ce03, 0x01012d76, 0x0144adae, 0x002d02aa, 0x008ae575, 0x01ac635e, 0x0374a82d, 0x02cc278d, 0x014b1feb, 0x0022d1e6}}}, + {X: Field{[10]uint32{0x0283116c, 0x002cd8ca, 0x0106758a, 0x03650e7a, 0x00d59c66, 0x02be8487, 0x003b10ce, 0x00a8581c, 0x00f3038d, 0x0006fa58}}, Y: Field{[10]uint32{0x01e29aef, 0x0070378f, 0x0201062f, 0x036c67ba, 0x030647e0, 0x02c0403e, 0x01549cc3, 0x03b810d4, 0x022f8218, 0x001fe932}}}, + {X: Field{[10]uint32{0x020cf385, 0x01cb54cc, 0x02a7e484, 0x022520c7, 0x02e915eb, 0x01a52a03, 0x0351e9f5, 0x02028e2b, 0x02d3bc5c, 0x00007ca8}}, Y: Field{[10]uint32{0x013940e5, 0x0194ef9b, 0x00e9ff55, 0x001d9e0b, 0x0147053f, 0x0399c07e, 0x03cb9455, 0x013127e6, 0x0239174b, 0x0028633a}}}, + {X: Field{[10]uint32{0x00d04766, 0x01dfcf91, 0x0140e884, 0x00dff9dc, 0x019aa67c, 0x01f2beaa, 0x03908611, 0x01ac2edd, 0x03607084, 0x0001875a}}, Y: Field{[10]uint32{0x00f2688f, 0x0230472a, 0x024d2533, 0x03ab2bdc, 0x02b7c4b1, 0x0325b799, 0x02eb59a6, 0x026b858c, 0x02908684, 0x0031fd2f}}}, + {X: Field{[10]uint32{0x02e6cc9c, 0x033c3507, 0x03c4fe6c, 0x00e249db, 0x026d5405, 0x012f9fc9, 0x0108daf0, 0x019145e5, 0x00932d9a, 0x0000acdc}}, Y: Field{[10]uint32{0x015beca7, 0x0002438a, 0x01d9f5ca, 0x0111860e, 0x0391cdfc, 0x005b382d, 0x016a1d86, 0x0262c7b8, 0x03f42c89, 0x003000a8}}}, + {X: Field{[10]uint32{0x02708858, 0x03598a7c, 0x0263a87c, 0x0255a89d, 0x0364af0e, 0x03fa6c07, 0x03fd1360, 0x02de8d35, 0x03efaba8, 0x00123d70}}, Y: Field{[10]uint32{0x0232b5ab, 0x03c0fa3f, 0x015e2b88, 0x02fed4a2, 0x0290aefd, 0x00be5cef, 0x02f09cc5, 0x019c91f0, 0x00b7fce4, 0x002330e3}}}, + {X: Field{[10]uint32{0x0262cfa0, 0x007766cf, 0x00b86e98, 0x03a42798, 0x00adfbe9, 0x01edb54d, 0x01cfc876, 0x03089dbd, 0x01972e5e, 0x0039826d}}, Y: Field{[10]uint32{0x02b43081, 0x00cf997c, 0x0189f0a4, 0x005826b8, 0x02335ca6, 0x02fc6c9e, 0x0385e3db, 0x017f4f8e, 0x01eeff20, 0x001afa70}}}, + {X: Field{[10]uint32{0x016d205a, 0x019a806c, 0x02b0b2ab, 0x01ecb69a, 0x02f19a76, 0x03bc3073, 0x02b8ea81, 0x0273211b, 0x031a5b2c, 0x003af902}}, Y: Field{[10]uint32{0x03c67058, 0x01be4525, 0x032f445d, 0x008035c2, 0x02967d69, 0x02593d76, 0x01899bd1, 0x032f440e, 0x00e8e4fe, 0x000bddc4}}}, + {X: Field{[10]uint32{0x018e3abd, 0x037d964d, 0x01b3ff70, 0x01160f60, 0x03dbc72d, 0x02c18af3, 0x03d32f39, 0x02c7bd94, 0x00399391, 0x0025f353}}, Y: Field{[10]uint32{0x03f37968, 0x036629fe, 0x03fe813d, 0x00ae88ce, 0x02263acf, 0x03a7d72b, 0x03c35c56, 0x02db7be6, 0x0184a175, 0x00281698}}}, + {X: Field{[10]uint32{0x02a7e6d9, 0x0128f06f, 0x0100ebf6, 0x02a80de0, 0x03257343, 0x019566b9, 0x00d99fce, 0x0343a14f, 0x00aa1d3f, 0x00209a4a}}, Y: Field{[10]uint32{0x021efc79, 0x02c1ec8b, 0x0399b020, 0x022a26ec, 0x02faad7f, 0x03dbe112, 0x010fddfc, 0x03a42bfd, 0x01b1a3bd, 0x002f128b}}}, + {X: Field{[10]uint32{0x03a19121, 0x03b4e697, 0x02398967, 0x00c59dcb, 0x0283bd14, 0x0042eb9e, 0x02e91814, 0x0257745d, 0x0097f3ac, 0x000f9d50}}, Y: Field{[10]uint32{0x0118df32, 0x03f99d69, 0x01801135, 0x0251fcfc, 0x0000ca7f, 0x033e50db, 0x0107ea15, 0x033fe282, 0x0299c6a2, 0x001d1b33}}}, + {X: Field{[10]uint32{0x029365db, 0x014c998c, 0x028fa446, 0x0118eee0, 0x0282991f, 0x02809c19, 0x00a236c8, 0x02651e02, 0x0064b49b, 0x003394e5}}, Y: Field{[10]uint32{0x022e5dd9, 0x0353009d, 0x00d41a74, 0x027046cb, 0x03a7bda7, 0x0270b0e2, 0x01f2fda2, 0x011d8c18, 0x02c2b8bc, 0x000d5e3f}}}, + {X: Field{[10]uint32{0x03e349dd, 0x0030ebd4, 0x036692c9, 0x01a4854c, 0x0344a2b6, 0x01929df2, 0x0041d6ae, 0x0056b5eb, 0x01d9cda6, 0x00324cf6}}, Y: Field{[10]uint32{0x0172c610, 0x002c36c1, 0x00c11f9f, 0x012a8713, 0x02a25b05, 0x0262eaf3, 0x02a8ede2, 0x03aeee3c, 0x024f83ba, 0x00129b68}}}, + {X: Field{[10]uint32{0x000b2ac4, 0x0068ef20, 0x03d51d08, 0x03bca009, 0x03a78e2d, 0x0237777b, 0x0116f2e7, 0x02057fa4, 0x003b1aa9, 0x001166a9}}, Y: Field{[10]uint32{0x03e993d5, 0x017f1f18, 0x016454bd, 0x01583f0a, 0x025c6151, 0x0377347c, 0x02900d4c, 0x0178c2c5, 0x03c3de99, 0x0006b3b6}}}, + {X: Field{[10]uint32{0x023b0a5e, 0x01fe44c7, 0x004d43b2, 0x00d268c3, 0x00ff4453, 0x018e6aff, 0x00675640, 0x02b4a7ad, 0x01d99862, 0x0017caa9}}, Y: Field{[10]uint32{0x01ace144, 0x01507258, 0x02cfbce7, 0x02df7538, 0x025acfbb, 0x0116ce6c, 0x01ef9ba4, 0x002fcb67, 0x022be61d, 0x0015c7b2}}}, + {X: Field{[10]uint32{0x00f4fd1d, 0x02079822, 0x000f5756, 0x01fe51ed, 0x01fc2c3d, 0x028ce152, 0x0393e681, 0x01756630, 0x021de6cc, 0x003b19ba}}, Y: Field{[10]uint32{0x01280f52, 0x01f6faaa, 0x025978ab, 0x027e8dc1, 0x02554073, 0x0029525e, 0x014dfa9d, 0x0210d562, 0x03db3b37, 0x0035c47f}}}, + {X: Field{[10]uint32{0x016105fe, 0x0205a0ab, 0x007ab1a4, 0x00e31e15, 0x0169ad06, 0x03472ace, 0x003f018b, 0x01fcb666, 0x01f5aa09, 0x001ab14f}}, Y: Field{[10]uint32{0x0218a598, 0x03238159, 0x00578abf, 0x025aee82, 0x013cd517, 0x010c1e5a, 0x008f2242, 0x02e46652, 0x02815127, 0x00257da6}}}, + {X: Field{[10]uint32{0x0396c0b0, 0x00bc4a67, 0x014fd384, 0x02142cd1, 0x0016fb5c, 0x03700b3d, 0x026dcb8f, 0x0343f711, 0x01e29e4a, 0x002a28fa}}, Y: Field{[10]uint32{0x0316dc2b, 0x00e29559, 0x03685ce1, 0x00242f78, 0x03169b8d, 0x00e535f0, 0x016d152f, 0x037a943b, 0x033e3006, 0x0037e1ba}}}, + {X: Field{[10]uint32{0x02db251c, 0x01030f79, 0x0116632c, 0x01f0c618, 0x001dbe98, 0x03b69b7e, 0x02c84a2f, 0x01d06e57, 0x00d2a0d8, 0x001429d9}}, Y: Field{[10]uint32{0x03e41055, 0x03ed089f, 0x00a4085c, 0x03890c29, 0x0176a8c7, 0x03a6d44b, 0x027632ac, 0x005f052d, 0x03f02339, 0x002ca080}}}, + {X: Field{[10]uint32{0x02b51ef9, 0x01d1b286, 0x013a9423, 0x021160a2, 0x011bd9c5, 0x01b8e73e, 0x0056c9fa, 0x037c749a, 0x00b15ef9, 0x0030b0c5}}, Y: Field{[10]uint32{0x012ab759, 0x0086693a, 0x01d4493e, 0x00c79c5d, 0x03a22f1e, 0x0167c22d, 0x009a9f5d, 0x037eaae5, 0x0286ff7f, 0x00289fe4}}}, + {X: Field{[10]uint32{0x02a9d3df, 0x01aee49d, 0x01b75dbf, 0x01d4dc3f, 0x0364868b, 0x00882930, 0x03ce375e, 0x032344ac, 0x0185da44, 0x002e9955}}, Y: Field{[10]uint32{0x024fda50, 0x0198eef2, 0x0073be51, 0x0139bf22, 0x00bdd9d0, 0x00cb3127, 0x0318f614, 0x00e16f7b, 0x016ba03a, 0x000f5938}}}, + {X: Field{[10]uint32{0x006e600e, 0x0173fbe9, 0x001c2aca, 0x004ee785, 0x0256bd0d, 0x00694403, 0x0276a650, 0x000292d6, 0x0249d4d1, 0x000f517e}}, Y: Field{[10]uint32{0x00059176, 0x02f70ad6, 0x001eced5, 0x0039cc60, 0x00da3039, 0x031d6e92, 0x01a93b13, 0x03b90b87, 0x013c38ee, 0x000024a5}}}, + {X: Field{[10]uint32{0x008c3a8c, 0x011ac12f, 0x005964ca, 0x01fd144e, 0x0083e5ab, 0x03ecb043, 0x025d96e1, 0x030f8903, 0x0346e40d, 0x00391930}}, Y: Field{[10]uint32{0x0204cf4e, 0x03243594, 0x0390fc7a, 0x0293d5f3, 0x030ca364, 0x01d3359e, 0x02205aa3, 0x0142f4a0, 0x03461829, 0x0018fc52}}}, + {X: Field{[10]uint32{0x02a42688, 0x010b756b, 0x001e3fdf, 0x03931ce1, 0x00d56f3f, 0x034f71c8, 0x030d218b, 0x02cc1c16, 0x012fe235, 0x000529f8}}, Y: Field{[10]uint32{0x01e9ff2a, 0x02fce8c5, 0x038099ee, 0x01266b84, 0x00eac312, 0x004de93c, 0x02a22d48, 0x03d20bb5, 0x03cc40ce, 0x0035e5a0}}}, + {X: Field{[10]uint32{0x023828be, 0x03ec1e25, 0x01936a99, 0x00ae1757, 0x0061d2ee, 0x02cbfdbd, 0x0334ffab, 0x01cec896, 0x03b821af, 0x00239ebe}}, Y: Field{[10]uint32{0x026b1853, 0x02739f6b, 0x01ec16cc, 0x01c37b98, 0x02bb5284, 0x00838418, 0x015bea0e, 0x01da33c1, 0x03765aa0, 0x00010391}}}, + {X: Field{[10]uint32{0x03297573, 0x0181a414, 0x002465b1, 0x015629fb, 0x017d8440, 0x03973a0a, 0x00f9f1f9, 0x02f43d2f, 0x01623227, 0x00275904}}, Y: Field{[10]uint32{0x0307fc8d, 0x030d70e6, 0x01b2c126, 0x03576974, 0x021f8630, 0x003fb027, 0x0067ea47, 0x006f95c0, 0x03a06800, 0x003b4360}}}, + {X: Field{[10]uint32{0x03c83eaf, 0x0201625f, 0x00f0b7bd, 0x03c512bc, 0x0352bb40, 0x00f69d39, 0x025b52be, 0x02767d04, 0x02d6d9e4, 0x0019d631}}, Y: Field{[10]uint32{0x004fd292, 0x032d0d06, 0x026e36a1, 0x033351a0, 0x005f7d22, 0x0255df6f, 0x0229b3de, 0x00b0d8e8, 0x008ec2aa, 0x001d26b8}}}, + {X: Field{[10]uint32{0x0061d73a, 0x0045452f, 0x03fb80da, 0x0066d28c, 0x01326327, 0x0293047d, 0x0193df63, 0x00b62c53, 0x01a04570, 0x0002cf84}}, Y: Field{[10]uint32{0x01d562eb, 0x01bef66a, 0x02d189a8, 0x02d8d2c8, 0x009660c6, 0x032e5c11, 0x02238928, 0x01fb0806, 0x02b12b26, 0x0031b854}}}, + {X: Field{[10]uint32{0x026fa5f1, 0x03b56835, 0x00b98994, 0x00f08842, 0x02137bf4, 0x002e789d, 0x0371b0fe, 0x02644404, 0x01ea3b30, 0x001428c9}}, Y: Field{[10]uint32{0x0345b70e, 0x02b8500d, 0x00739dfe, 0x027009d4, 0x028a9939, 0x02ce7bfa, 0x03585279, 0x002a9629, 0x011fd39e, 0x00251b6b}}}, + {X: Field{[10]uint32{0x015e9661, 0x0138c8ba, 0x03e39121, 0x029a91bb, 0x02a97341, 0x02b1423b, 0x02802ce8, 0x03568b3d, 0x02493bef, 0x003df23c}}, Y: Field{[10]uint32{0x0234cb67, 0x00f62347, 0x03f5d4e3, 0x039fe8fc, 0x02573883, 0x02639365, 0x00b7ec05, 0x03cdc051, 0x00c4eec1, 0x000f01cb}}}, + {X: Field{[10]uint32{0x038f85b6, 0x01977200, 0x00cc3c89, 0x02ee1b0a, 0x0038c7e7, 0x03127a9a, 0x030b94e9, 0x00ce1bc2, 0x0350c154, 0x000c0b4e}}, Y: Field{[10]uint32{0x00310744, 0x00b496a2, 0x03720567, 0x00a3539f, 0x013588d1, 0x01b1e324, 0x0366e5a9, 0x02a8bd82, 0x03d0d891, 0x00262011}}}, + {X: Field{[10]uint32{0x019f0eb7, 0x014edf48, 0x0386afbf, 0x03f2c363, 0x021d3810, 0x017b7a26, 0x00e8ecb5, 0x016e9834, 0x03282e7e, 0x0032e3b9}}, Y: Field{[10]uint32{0x038094cd, 0x038058ea, 0x0118e75f, 0x018381a8, 0x02bc10bd, 0x03c12470, 0x009a4e3c, 0x00426423, 0x022befad, 0x0012c13a}}}, + {X: Field{[10]uint32{0x03d5fd42, 0x015cb533, 0x0131b211, 0x00d7e42f, 0x0174f920, 0x031ce927, 0x00f6f04a, 0x0362a883, 0x022b4a0c, 0x0019172a}}, Y: Field{[10]uint32{0x037ef5b9, 0x0320d1be, 0x010a6b6f, 0x008dfd47, 0x03b0aa13, 0x03f945b6, 0x022b64ea, 0x035f0779, 0x019635f9, 0x001e4fca}}}, + {X: Field{[10]uint32{0x015f5a21, 0x031289ce, 0x034f3e69, 0x01ccf617, 0x00f00b1c, 0x0185f593, 0x034b8df6, 0x02d79d50, 0x002f6148, 0x00134dcd}}, Y: Field{[10]uint32{0x03a708bd, 0x01df6294, 0x01cded15, 0x0374e341, 0x034eebd7, 0x006dad99, 0x00a7db2b, 0x031c1519, 0x012bd4c5, 0x00190002}}}, + {X: Field{[10]uint32{0x00c0e0d8, 0x024c5c06, 0x02d3dbd6, 0x00d0db9d, 0x01747a21, 0x034a2f4e, 0x02c6285e, 0x001ecad2, 0x0317024e, 0x00398d2f}}, Y: Field{[10]uint32{0x03e9f021, 0x036e1cc4, 0x00a53020, 0x03efa25f, 0x025e9660, 0x02c44e1d, 0x01d9d8b6, 0x02947b0c, 0x02de4b82, 0x003332f2}}}, + {X: Field{[10]uint32{0x020cef38, 0x0044014d, 0x0192ba51, 0x0018eefe, 0x0264c490, 0x00c74966, 0x03ff5354, 0x03144f56, 0x01e62767, 0x00202803}}, Y: Field{[10]uint32{0x028ef572, 0x033737d8, 0x036b203f, 0x03de54c2, 0x03b2620d, 0x03f71f80, 0x027e23e8, 0x00cd9b11, 0x0189e8d7, 0x001f73ad}}}, + {X: Field{[10]uint32{0x028f8a0f, 0x00b8b767, 0x0225d05b, 0x0197dc65, 0x02baf5b7, 0x0047571d, 0x01b8409f, 0x0143b669, 0x00e6d23d, 0x00181b54}}, Y: Field{[10]uint32{0x03b32788, 0x010d9acf, 0x00cc748c, 0x03a2edf2, 0x004cbb41, 0x0305c480, 0x001d2206, 0x02d30bf3, 0x009245b1, 0x00067d55}}}, + {X: Field{[10]uint32{0x024f0420, 0x03583b83, 0x02a247fd, 0x020ce359, 0x02266c30, 0x0392864c, 0x03ea835a, 0x013edd29, 0x0214f7d4, 0x00272282}}, Y: Field{[10]uint32{0x01d9169a, 0x021d1679, 0x028b4d01, 0x01e8ecaf, 0x018737fc, 0x006bb74a, 0x02da6218, 0x023748c7, 0x02373157, 0x0010b1b0}}}, + {X: Field{[10]uint32{0x0235da1c, 0x030cf6c7, 0x00e59ceb, 0x032810ea, 0x001a32d3, 0x02905e49, 0x01a01548, 0x01bd63fe, 0x00f781a4, 0x0035b33f}}, Y: Field{[10]uint32{0x021d084f, 0x037c88e1, 0x016d568b, 0x02f24409, 0x0287cbcf, 0x015c3e0c, 0x00824e61, 0x01ae362d, 0x021ace84, 0x002872ae}}}, + {X: Field{[10]uint32{0x01f2e3c4, 0x01aeb67d, 0x000da459, 0x03b6903b, 0x006eed5d, 0x0251f234, 0x016f4464, 0x00ffc915, 0x036a3e4c, 0x00233ebc}}, Y: Field{[10]uint32{0x00f3c4d7, 0x0381a4b6, 0x031fcc80, 0x00ee5b28, 0x026b7237, 0x00419fc8, 0x03f81d1c, 0x0337f78c, 0x02ccede6, 0x002646db}}}, + {X: Field{[10]uint32{0x03e664a0, 0x03023aed, 0x03da0541, 0x02c1245f, 0x03189849, 0x031a9b31, 0x02f39738, 0x00e82ef3, 0x01815b0f, 0x00351b0f}}, Y: Field{[10]uint32{0x0167c159, 0x033962b6, 0x026421fe, 0x02650107, 0x0158cffe, 0x02a13b60, 0x02dc9b63, 0x03975f22, 0x03b6d053, 0x000d5492}}}, + {X: Field{[10]uint32{0x037adfff, 0x008ffb0a, 0x02f0490c, 0x01d7280b, 0x03e2ce9b, 0x0118df73, 0x02dce33e, 0x0237dfe0, 0x00a52f1f, 0x0023b5fc}}, Y: Field{[10]uint32{0x028d99ff, 0x003088d8, 0x019a55d9, 0x017509dd, 0x024be1aa, 0x037b8ed9, 0x00272253, 0x0344325b, 0x00c7b418, 0x003c0918}}}, + {X: Field{[10]uint32{0x01aaa2ca, 0x02a17d9b, 0x02c2b0ce, 0x02ca2af4, 0x00825c46, 0x03ba8ffc, 0x03a4d6ca, 0x0146f54a, 0x02dca8a3, 0x0010cfb2}}, Y: Field{[10]uint32{0x022977e5, 0x02850bc5, 0x0038f983, 0x03f20f41, 0x03f6d396, 0x01bce438, 0x00d03c48, 0x0345dd17, 0x01bcc2d7, 0x00134edc}}}, + {X: Field{[10]uint32{0x03a006e6, 0x02cfe72e, 0x014eb249, 0x00ec5701, 0x03ba0449, 0x007d990a, 0x01bbddd8, 0x01fe0dea, 0x02f31037, 0x00301dc7}}, Y: Field{[10]uint32{0x034ccb1e, 0x037c963b, 0x015b0784, 0x00ce98e5, 0x00e1ea2b, 0x01e35312, 0x018c6b47, 0x01a809e2, 0x01ab1d81, 0x000f94f7}}}, + {X: Field{[10]uint32{0x03597ad7, 0x00ea7143, 0x03d238ff, 0x02a29d07, 0x0092072b, 0x00d71b36, 0x0197383e, 0x021ee54e, 0x02264a6a, 0x00370b80}}, Y: Field{[10]uint32{0x0012c74d, 0x00f07c5f, 0x00e01d8a, 0x03272f20, 0x018ddbac, 0x03d65fa1, 0x00ac0ff6, 0x03dc8d10, 0x0346ecd5, 0x002263b9}}}, + {X: Field{[10]uint32{0x02dab771, 0x002dd81a, 0x01f0311f, 0x02cbb60e, 0x01d043d7, 0x0273678c, 0x005f7811, 0x0232fc7f, 0x023459ad, 0x0005aeb3}}, Y: Field{[10]uint32{0x002fb1c4, 0x01b077f0, 0x01243e89, 0x02c4af52, 0x0066e835, 0x00acae0d, 0x02239797, 0x025f8cb2, 0x01326ec6, 0x00003d91}}}, + {X: Field{[10]uint32{0x0169c736, 0x017ce95f, 0x001a4072, 0x036a0e72, 0x029af55e, 0x023c00d1, 0x02539a86, 0x0050e451, 0x018f3a27, 0x002bee53}}, Y: Field{[10]uint32{0x035201d8, 0x03a2f468, 0x009cb386, 0x029d5653, 0x00bdf37f, 0x0158f5d9, 0x00a4eff7, 0x000c769c, 0x014ea455, 0x002bf6ca}}}, + {X: Field{[10]uint32{0x00e89b74, 0x0056aa74, 0x01dc706b, 0x02017de0, 0x02ecc337, 0x0006397a, 0x01b0ae76, 0x03dfd07b, 0x02364a98, 0x002ecc74}}, Y: Field{[10]uint32{0x02031a9a, 0x029307f6, 0x01c27a92, 0x0229ee76, 0x0287cbc2, 0x01373657, 0x009f032f, 0x0331fb35, 0x00031f47, 0x00068193}}}, + {X: Field{[10]uint32{0x004318b8, 0x00f0454f, 0x0270001c, 0x01bb5c9f, 0x03241e48, 0x03bdba0e, 0x0204ee30, 0x0176a059, 0x036c4bbf, 0x003dcec6}}, Y: Field{[10]uint32{0x008c9b17, 0x03e6e29b, 0x01ffb476, 0x03bcedf5, 0x0125ba08, 0x03006c98, 0x00ac2255, 0x0132ead6, 0x016e09d6, 0x00268a2b}}}, + {X: Field{[10]uint32{0x01afa8a4, 0x01ba4864, 0x03313b23, 0x01983c34, 0x03708c87, 0x025816ca, 0x038ea7b6, 0x03168213, 0x0212d0dd, 0x00018ef4}}, Y: Field{[10]uint32{0x016c3e67, 0x001da631, 0x01b0fa33, 0x023b33b3, 0x0102fbca, 0x027f4d0b, 0x03bb0b3a, 0x0100c82b, 0x00f60482, 0x0003b9bd}}}, + {X: Field{[10]uint32{0x02bc6465, 0x001fe186, 0x016299e0, 0x01761d7f, 0x00967b95, 0x031a241e, 0x02416b78, 0x020088c2, 0x022b3606, 0x0018d9f4}}, Y: Field{[10]uint32{0x029417eb, 0x00a225fd, 0x020bbec6, 0x011e4967, 0x03118d16, 0x01657e6c, 0x02444ad5, 0x01e4fc5f, 0x032d14e6, 0x0030fb87}}}, + {X: Field{[10]uint32{0x0085976e, 0x00186a25, 0x02c4f2df, 0x003c2d8c, 0x020c922d, 0x0120e531, 0x0101e3a4, 0x03d4b95e, 0x0143fbb7, 0x001938b9}}, Y: Field{[10]uint32{0x00ab2a4c, 0x024df7ff, 0x0011b48f, 0x01093f38, 0x02895119, 0x0218e939, 0x0047e5a5, 0x01a2d3f1, 0x002e336a, 0x00190698}}}, + {X: Field{[10]uint32{0x03fee1c6, 0x03cc0c78, 0x03f38d6b, 0x01298399, 0x02e16e82, 0x036704c8, 0x0179e869, 0x00d72347, 0x02fd18c8, 0x000b8a42}}, Y: Field{[10]uint32{0x01390f21, 0x0199161e, 0x03874962, 0x02b178dc, 0x02da18cc, 0x00a68d89, 0x0286b0ec, 0x01ad9c1d, 0x028ed2fa, 0x001fe158}}}, + {X: Field{[10]uint32{0x00ee401e, 0x03c421cb, 0x0242b17e, 0x0333602e, 0x00c0ba2d, 0x02231ddd, 0x03229079, 0x0174f7d7, 0x008a0c47, 0x00216688}}, Y: Field{[10]uint32{0x0319f5d8, 0x009ffea2, 0x01e31336, 0x0297c4d2, 0x0384b982, 0x03e84bf3, 0x02ed1e3c, 0x01d0eb58, 0x0245778e, 0x002999f1}}}, + {X: Field{[10]uint32{0x02bcaf21, 0x02b00a80, 0x00939b92, 0x036f64ac, 0x03b608d3, 0x00a7f718, 0x01c0b868, 0x002abbc6, 0x0108ccc5, 0x00324a46}}, Y: Field{[10]uint32{0x02cd2599, 0x023406c1, 0x0231a17d, 0x0115df18, 0x0320cb7d, 0x00bf227e, 0x01352c8b, 0x007d631c, 0x03b74711, 0x0039714a}}}, + {X: Field{[10]uint32{0x01cefb26, 0x03507118, 0x00459b04, 0x031d6369, 0x0364bc42, 0x03c68752, 0x02b01411, 0x02d881e2, 0x009042b5, 0x00140d65}}, Y: Field{[10]uint32{0x034f04e0, 0x01147aaf, 0x02af1e5b, 0x00abdef4, 0x03347c13, 0x009cbe05, 0x00d9bd8f, 0x00193fe0, 0x023db68c, 0x003d87a0}}}, + {X: Field{[10]uint32{0x00a4cbf3, 0x007cb7b1, 0x0343e7b6, 0x00067d17, 0x0039f29a, 0x00ed4d7b, 0x02787c35, 0x03c7ed84, 0x02e7d6a3, 0x003e6f3e}}, Y: Field{[10]uint32{0x032ff883, 0x0301e848, 0x0067b28f, 0x018abb77, 0x02a65658, 0x003f211a, 0x02d5a995, 0x035f9e40, 0x026f273a, 0x003d361b}}}, + {X: Field{[10]uint32{0x014a9152, 0x011c0e7c, 0x01dbad77, 0x03a5fe35, 0x01602ac4, 0x001d91c5, 0x03c0004b, 0x03c143a4, 0x028b901c, 0x0000723f}}, Y: Field{[10]uint32{0x0136769c, 0x01ee031f, 0x00c4c99d, 0x009fdbdd, 0x03b42a0f, 0x02c67e1f, 0x0143b6ec, 0x00a50a48, 0x03347c45, 0x002c9776}}}, + {X: Field{[10]uint32{0x0386f552, 0x010c4c79, 0x004dd2c5, 0x033d04af, 0x008ff676, 0x03ad4d38, 0x023947c6, 0x00ea1f4d, 0x03e14cbe, 0x0000f142}}, Y: Field{[10]uint32{0x0305a74d, 0x03b928e6, 0x032388a0, 0x00f6ed94, 0x00194f55, 0x0119b2b4, 0x02277754, 0x03d80362, 0x031c6e03, 0x00110d11}}}, + {X: Field{[10]uint32{0x030522f5, 0x009c0bb9, 0x01409fe7, 0x02b5b677, 0x005b3e91, 0x03e322c9, 0x0168b4b4, 0x01cbe3ea, 0x01b25554, 0x0019335c}}, Y: Field{[10]uint32{0x01ede304, 0x03c5b622, 0x002af5bf, 0x00f05a1e, 0x0140350a, 0x0066f58a, 0x017fc2a8, 0x0121540b, 0x033ae9fa, 0x003c6c72}}}, + {X: Field{[10]uint32{0x019af7a8, 0x038d0518, 0x00bccc41, 0x039f4bb2, 0x02fd8f69, 0x033102c3, 0x03dded87, 0x030d1b46, 0x0044c584, 0x00307001}}, Y: Field{[10]uint32{0x01879436, 0x0240174f, 0x0238eee0, 0x0332f1b7, 0x01f78dbc, 0x016042d8, 0x03b391ad, 0x03aec21e, 0x00943e3f, 0x00358c6d}}}, + {X: Field{[10]uint32{0x03a2a7ed, 0x03d6558f, 0x01b96cbe, 0x00a2be5c, 0x002fbd0c, 0x02df92e8, 0x0050fd03, 0x02ed871d, 0x0182dad5, 0x003e9425}}, Y: Field{[10]uint32{0x033df4e5, 0x038acd8b, 0x03816165, 0x016cd242, 0x012acdff, 0x01af8865, 0x03890d75, 0x00bde26a, 0x0364617c, 0x00099f09}}}, + {X: Field{[10]uint32{0x01a2386c, 0x008351b0, 0x024d0509, 0x0033df49, 0x0235175e, 0x018130b6, 0x0205f04b, 0x0249aa9b, 0x02e6864e, 0x00195773}}, Y: Field{[10]uint32{0x03ee19c8, 0x03853cb3, 0x02df72bb, 0x00e2d788, 0x025f1dc2, 0x01e596ea, 0x02d36c46, 0x00b2d2e8, 0x02dabf06, 0x00368bab}}}, + {X: Field{[10]uint32{0x033c213e, 0x01bf02b7, 0x01beb760, 0x001b4568, 0x002cc1de, 0x03b17135, 0x03c8fbef, 0x03989025, 0x01ac1b7b, 0x001aad78}}, Y: Field{[10]uint32{0x00a9e466, 0x008c7934, 0x01d3cf36, 0x02353a02, 0x00f83392, 0x03fb37d6, 0x003e0247, 0x00c671d1, 0x03b204eb, 0x0009be60}}}, + {X: Field{[10]uint32{0x00c25f3b, 0x02a75458, 0x01af35f5, 0x02951fbd, 0x036224e2, 0x03dceadc, 0x0373a0d3, 0x02a8b7a7, 0x029e039c, 0x0031f6a1}}, Y: Field{[10]uint32{0x00da579f, 0x010adad0, 0x0175dc79, 0x02267b08, 0x02cfdc0f, 0x01ab9312, 0x02f4cf67, 0x001f604a, 0x010249a6, 0x003a66c4}}}, + {X: Field{[10]uint32{0x0144ef99, 0x03034852, 0x01084a9c, 0x0152fc05, 0x03e20b68, 0x03d34526, 0x028091fa, 0x00f3b7b5, 0x00a15f1c, 0x000a9b53}}, Y: Field{[10]uint32{0x02661ae0, 0x01ad8e03, 0x039b4ced, 0x03cc4fc5, 0x015cb44b, 0x029c0eb1, 0x00d92846, 0x0257a6ae, 0x0288ae92, 0x0037f09d}}}, + {X: Field{[10]uint32{0x01c846c0, 0x018b3684, 0x015752de, 0x009c604a, 0x0292600a, 0x0079dc5a, 0x0259f70b, 0x008932a9, 0x00b3bba7, 0x00111c98}}, Y: Field{[10]uint32{0x008999bf, 0x03687837, 0x00996db8, 0x02990098, 0x038331e2, 0x00184e51, 0x000c9220, 0x00bb7a26, 0x020f33ef, 0x003c5f8f}}}, + {X: Field{[10]uint32{0x03781969, 0x0253dbe9, 0x016fd5b9, 0x0299b94d, 0x015a8788, 0x02cc4abb, 0x00b0f441, 0x01c00e35, 0x00adbaba, 0x002336c7}}, Y: Field{[10]uint32{0x00536977, 0x01dfb75d, 0x00fa17c1, 0x0392e81b, 0x03b88750, 0x0355b080, 0x03be06d8, 0x019ceab9, 0x010e262e, 0x002ce96f}}}, + {X: Field{[10]uint32{0x01caaefe, 0x009aa175, 0x00576851, 0x003c5d76, 0x00bc3e2c, 0x033d1b03, 0x0323e6cd, 0x03e41460, 0x0350fb60, 0x000a2f83}}, Y: Field{[10]uint32{0x022b7320, 0x03e6e8e1, 0x009de21b, 0x030fa590, 0x028d986f, 0x01a30c5d, 0x01404295, 0x02313384, 0x00f7fb18, 0x00173016}}}, + {X: Field{[10]uint32{0x014673a0, 0x012128a6, 0x00eb6f23, 0x0189fe3c, 0x02837e22, 0x0273e0e7, 0x029218ad, 0x03eb522d, 0x00badd2d, 0x0002db73}}, Y: Field{[10]uint32{0x022de992, 0x033f533e, 0x02eafb52, 0x01daba07, 0x02496231, 0x03731cc2, 0x00aa2ab5, 0x005899dd, 0x02d7297f, 0x00387052}}}, + {X: Field{[10]uint32{0x03766a87, 0x01c25578, 0x02e1dbe7, 0x03e4066e, 0x02b9cbb0, 0x0317f369, 0x03ecec9d, 0x03df95e9, 0x02c88813, 0x003917af}}, Y: Field{[10]uint32{0x01fbb07a, 0x004d7ac3, 0x028563ff, 0x01fc4e91, 0x03f915cc, 0x02b2eaa7, 0x03848857, 0x00de0df0, 0x00bb4ccf, 0x000e98a8}}}, + {X: Field{[10]uint32{0x00dccdbb, 0x0087faba, 0x030eb07b, 0x001f7d97, 0x0059bc9d, 0x00adf21d, 0x00b9e552, 0x02752078, 0x037726f3, 0x0037a49b}}, Y: Field{[10]uint32{0x004d8e05, 0x00d9fd8c, 0x02ba0f5f, 0x02c75c86, 0x01115be2, 0x008e7db8, 0x03618ce1, 0x01090092, 0x02a9263d, 0x00274643}}}, + {X: Field{[10]uint32{0x00f2caf0, 0x0280fcbb, 0x03091b54, 0x00b84c17, 0x0091e427, 0x01a5c8ad, 0x03948075, 0x027011b5, 0x03842066, 0x003dd884}}, Y: Field{[10]uint32{0x039e4914, 0x00a4f412, 0x00f6d12d, 0x00aed31f, 0x033088c9, 0x016432a8, 0x01945284, 0x03caa571, 0x00e5a227, 0x003431fa}}}, + {X: Field{[10]uint32{0x025ce751, 0x02effa15, 0x0037d4a8, 0x03458669, 0x01a5cdb1, 0x02e83ae7, 0x00d472e8, 0x03b823d1, 0x028644ff, 0x00139e57}}, Y: Field{[10]uint32{0x0190a4e0, 0x03a0f885, 0x03549749, 0x0156672c, 0x0365038c, 0x01d47961, 0x01b4be3c, 0x01a3e6ee, 0x00e54782, 0x0014a4b6}}}, + {X: Field{[10]uint32{0x01b50b3d, 0x0174b4b7, 0x03559bf4, 0x0237a15d, 0x01cdf75e, 0x02248d4c, 0x0333a97c, 0x02c0fcca, 0x0289a944, 0x001c3991}}, Y: Field{[10]uint32{0x00225586, 0x01349483, 0x0151a536, 0x02eea45a, 0x03925a93, 0x01c79bb7, 0x01ae263c, 0x0226928b, 0x02e5460b, 0x00299d71}}}, + {X: Field{[10]uint32{0x0367056b, 0x02d73c96, 0x020fab08, 0x0240ee76, 0x03477ef3, 0x02d2ffc7, 0x00b8c1c8, 0x0091f803, 0x002e682b, 0x000858df}}, Y: Field{[10]uint32{0x0292d882, 0x0125e793, 0x00e04831, 0x01638934, 0x03c5716b, 0x009f60e1, 0x00c2b6c7, 0x006955f9, 0x025e3e76, 0x0038d5c5}}}, + {X: Field{[10]uint32{0x001d1964, 0x015828e7, 0x02949a40, 0x02c5d19a, 0x03d8ae5b, 0x00062f6e, 0x01a41350, 0x034b85d0, 0x039908da, 0x001da468}}, Y: Field{[10]uint32{0x02422b74, 0x020711c2, 0x00be4d8c, 0x0038a31a, 0x03025728, 0x01db9fc9, 0x03f2296f, 0x016edb36, 0x0004b05b, 0x000897c5}}}, + {X: Field{[10]uint32{0x01af9302, 0x0266be1e, 0x012cb698, 0x0244361d, 0x01b0d11e, 0x009faafe, 0x035a14b0, 0x0021266b, 0x02a4f395, 0x001d20c5}}, Y: Field{[10]uint32{0x03fd7ee2, 0x00c11ed6, 0x0061f179, 0x006e7a11, 0x00f600fc, 0x037628b1, 0x0187c126, 0x0027630f, 0x00d26bd7, 0x00337375}}}, + {X: Field{[10]uint32{0x02ed9b8a, 0x03f83bfd, 0x03390c2f, 0x0146001a, 0x00a97089, 0x007814a5, 0x0084aa6c, 0x03a171b7, 0x01ab3839, 0x002bd623}}, Y: Field{[10]uint32{0x03d9cff0, 0x0055058d, 0x0081d870, 0x00d633c3, 0x01616ca1, 0x03800aab, 0x014131f5, 0x01523c9e, 0x02401b06, 0x0028f4dd}}}, + {X: Field{[10]uint32{0x01b42dc6, 0x011b8436, 0x0253735c, 0x001dbc2d, 0x005f869d, 0x0255ca2c, 0x03617969, 0x01bfec66, 0x00603170, 0x002f6477}}, Y: Field{[10]uint32{0x00f153b2, 0x01c41d91, 0x01a6d161, 0x03df5949, 0x00cdce2c, 0x0381c21c, 0x028db8ed, 0x03d71868, 0x02d15a74, 0x000f258f}}}, + {X: Field{[10]uint32{0x01e98f47, 0x01ccbb7b, 0x0382d985, 0x0209f7ae, 0x030c202c, 0x0132c787, 0x03aa583c, 0x002efd70, 0x00a59146, 0x00398971}}, Y: Field{[10]uint32{0x0170b72e, 0x03733056, 0x0299d7fd, 0x0187244c, 0x000812a4, 0x0392b180, 0x02505348, 0x014e5877, 0x01f9a903, 0x003409b1}}}, + {X: Field{[10]uint32{0x03daac1c, 0x023f971f, 0x000e8ebc, 0x015f6566, 0x00122cd0, 0x0060d5f9, 0x014553c7, 0x024ebe2e, 0x03fed4b1, 0x001af489}}, Y: Field{[10]uint32{0x0221a9f9, 0x03549271, 0x039f022f, 0x012792de, 0x03c66a05, 0x0028ad39, 0x01835d3b, 0x02c1127b, 0x01400a98, 0x0017cff9}}}, + {X: Field{[10]uint32{0x02db2609, 0x03d99907, 0x02f495cf, 0x03e5531b, 0x0068a0f0, 0x016cd39f, 0x03d3872c, 0x01bce148, 0x0225895e, 0x0009dc1e}}, Y: Field{[10]uint32{0x02a777ee, 0x0060088f, 0x0335e03a, 0x02452337, 0x01e5de5c, 0x01fd9dfa, 0x0334b38f, 0x035a5da7, 0x038ec893, 0x003bdbd3}}}, + {X: Field{[10]uint32{0x03f0ebde, 0x005383f3, 0x026db1f3, 0x03039d51, 0x00c01770, 0x010a135f, 0x03770ea0, 0x01053aed, 0x008e3359, 0x00181489}}, Y: Field{[10]uint32{0x03f7b7a2, 0x00638ab8, 0x0312c8b1, 0x034c72e5, 0x031a1ac7, 0x02a955be, 0x0262e020, 0x03551a7e, 0x00585cf0, 0x000f6608}}}, + {X: Field{[10]uint32{0x0370f6bc, 0x0168453c, 0x0150e6c7, 0x019a6d15, 0x034d4fc6, 0x02c8a615, 0x01825068, 0x0049305b, 0x03534fa6, 0x003cb2d6}}, Y: Field{[10]uint32{0x0241112e, 0x029d02dc, 0x008a0ad7, 0x02ef17eb, 0x038ec9dc, 0x00f31de7, 0x0152def4, 0x032b484e, 0x030763a5, 0x00173795}}}, + {X: Field{[10]uint32{0x007a502e, 0x0342c8fa, 0x01b20aa9, 0x01453bdb, 0x0304989b, 0x01d71807, 0x00030c7a, 0x02e7e782, 0x02159fe6, 0x001deb60}}, Y: Field{[10]uint32{0x029b703d, 0x031a037a, 0x0132a87f, 0x01e266be, 0x0300c136, 0x02e87aec, 0x0056add2, 0x0124c9d2, 0x01eeffc2, 0x00249a28}}}, + {X: Field{[10]uint32{0x028fd29d, 0x0132f252, 0x001c8a11, 0x003ee93b, 0x035cc9aa, 0x00b5e246, 0x0380fd7c, 0x03e03e9f, 0x008d171c, 0x0011061d}}, Y: Field{[10]uint32{0x031835c1, 0x02ed063e, 0x02aeebab, 0x01aa99f1, 0x029916c1, 0x009e7f9e, 0x0318322b, 0x006dfdcb, 0x028579f0, 0x000144c0}}}, + {X: Field{[10]uint32{0x027355e0, 0x01f5f98d, 0x008831d3, 0x03ff7df4, 0x01126e59, 0x0046a09b, 0x01901b4d, 0x0321edf9, 0x01606f89, 0x0005abd2}}, Y: Field{[10]uint32{0x00b04c2e, 0x0130b353, 0x009f68ca, 0x03a943b8, 0x0012c8e8, 0x03a8ece3, 0x02131ca8, 0x008f27a3, 0x00405372, 0x000684e1}}}, + {X: Field{[10]uint32{0x02120f9d, 0x00e4be77, 0x03e4aae6, 0x00c0d49d, 0x000730a7, 0x03606123, 0x037ba0ca, 0x00c6e33d, 0x003cab44, 0x0008b481}}, Y: Field{[10]uint32{0x011b8acd, 0x03d3dae6, 0x0145a432, 0x03263b4f, 0x034d71f9, 0x01ff33e7, 0x036520ac, 0x011b4270, 0x01ad5e5b, 0x0035de57}}}, + {X: Field{[10]uint32{0x03676302, 0x02cc9c55, 0x017349fb, 0x022ec906, 0x0241d92c, 0x03d8912d, 0x02033602, 0x0194cdf8, 0x028b3482, 0x00015f9e}}, Y: Field{[10]uint32{0x0199b83a, 0x00a00ed1, 0x022a0975, 0x0374f473, 0x015146af, 0x02ecb951, 0x02bd2eb6, 0x0322cb0e, 0x00e8ba4b, 0x0013648e}}}, + {X: Field{[10]uint32{0x02acc359, 0x01156c09, 0x009da9ab, 0x02093018, 0x007ea19a, 0x01776ac7, 0x02b39ed0, 0x0009f8a0, 0x03602755, 0x0011559f}}, Y: Field{[10]uint32{0x0134f5a7, 0x02e92350, 0x03d4c2fb, 0x03dfdc9b, 0x0182c1cc, 0x0104e4b7, 0x02291611, 0x0153b790, 0x015a77a3, 0x0036d57b}}}, + {X: Field{[10]uint32{0x027fa80f, 0x03e9683d, 0x00c383e8, 0x039c68a1, 0x01798a0b, 0x02114c80, 0x001933ca, 0x024d1e77, 0x01549105, 0x0025a3ed}}, Y: Field{[10]uint32{0x00e8920e, 0x01332849, 0x00bd0b16, 0x0007740f, 0x0201c141, 0x019c60dd, 0x02d83945, 0x03d5430d, 0x02b16853, 0x00018d61}}}, + {X: Field{[10]uint32{0x01873107, 0x0050946b, 0x02d1714c, 0x033446bc, 0x013d640a, 0x01e3dee1, 0x03ef522b, 0x00f35fc7, 0x02490f63, 0x003cd9b1}}, Y: Field{[10]uint32{0x0082c6b9, 0x03ed971d, 0x01546e56, 0x0355c46b, 0x0325b260, 0x0275057b, 0x004cfab5, 0x0262360b, 0x02af38f4, 0x0017f0e5}}}, + {X: Field{[10]uint32{0x00201d06, 0x01a1d0ff, 0x026e9ad0, 0x0224540f, 0x0059b192, 0x00acf0a7, 0x0016effd, 0x01a2cbb7, 0x03d44a2e, 0x002a8313}}, Y: Field{[10]uint32{0x033fee33, 0x037e2dff, 0x01b82b5d, 0x028952a9, 0x002763ac, 0x01d89c34, 0x00b5c4db, 0x01e5dd19, 0x02242fba, 0x0018538c}}}, + {X: Field{[10]uint32{0x032cc876, 0x01125223, 0x00ad2b44, 0x033cdd21, 0x01da4cbd, 0x02a0c391, 0x0057abbd, 0x033b1a47, 0x00ee19b2, 0x001b221b}}, Y: Field{[10]uint32{0x02fc16a1, 0x012e5382, 0x01cf5def, 0x025ef3cb, 0x02a197e8, 0x03b19396, 0x03eb384f, 0x037e1c21, 0x03bd9ab4, 0x000933f2}}}, + {X: Field{[10]uint32{0x02095554, 0x005e16f1, 0x02e439a8, 0x032b7cef, 0x00fbe5e4, 0x0045b538, 0x01d1686f, 0x01dbbb20, 0x0199c33f, 0x00135800}}, Y: Field{[10]uint32{0x03ae614a, 0x0057cc97, 0x028e9dad, 0x03127c58, 0x032bf73d, 0x037fb5d0, 0x01d4321f, 0x03dc3845, 0x00ceb769, 0x0032d053}}}, + {X: Field{[10]uint32{0x010a4fc2, 0x01689697, 0x0230aa67, 0x032b4bc8, 0x0212c3ca, 0x02d96ec5, 0x01e84724, 0x0167839c, 0x00a0196d, 0x000ddf74}}, Y: Field{[10]uint32{0x00feb560, 0x010f1d2b, 0x0338fe03, 0x00d8ad47, 0x021159c7, 0x02cd25d4, 0x03f7c270, 0x009f7297, 0x027d8c8e, 0x000b1c9f}}}, + {X: Field{[10]uint32{0x00820f46, 0x024a2967, 0x025529ca, 0x006633cd, 0x02e8aa50, 0x036402e2, 0x031826f9, 0x037cd46e, 0x038a23af, 0x00273033}}, Y: Field{[10]uint32{0x03e67256, 0x0234d1fd, 0x031f8b06, 0x01197554, 0x00693e54, 0x0290e828, 0x0142c53e, 0x0302a320, 0x015be2aa, 0x002d5cbc}}}, + {X: Field{[10]uint32{0x01fa3050, 0x01363b46, 0x000ead4a, 0x03aa9471, 0x024cfb01, 0x02f81107, 0x01d154a2, 0x00ac7a60, 0x02a64149, 0x0035577e}}, Y: Field{[10]uint32{0x03238ac1, 0x02cb9463, 0x012eb45f, 0x01dc30b7, 0x02da0c4c, 0x008e879c, 0x0098f315, 0x01d30aa6, 0x01cb408c, 0x000b9e57}}}, + {X: Field{[10]uint32{0x01210fd5, 0x001b7b9f, 0x024e8463, 0x021c9e5c, 0x02e3d27e, 0x02b1b01f, 0x035efb3f, 0x00c548c1, 0x03d72d11, 0x0011afd8}}, Y: Field{[10]uint32{0x03b0b199, 0x02cb220c, 0x002fc94c, 0x00dccb8a, 0x02dc4a2e, 0x02417128, 0x03b433a2, 0x00c94df8, 0x01f230fa, 0x001dc6ec}}}, + {X: Field{[10]uint32{0x00ca3aad, 0x000165d4, 0x03a3a13f, 0x02e306a6, 0x03594ef8, 0x01d79f0e, 0x02f1826f, 0x01f05e31, 0x038803e7, 0x0012f3f8}}, Y: Field{[10]uint32{0x021b0129, 0x02abd522, 0x009b62dd, 0x008ed1f4, 0x00ec5ea9, 0x03014e27, 0x0283cf56, 0x0119cbe8, 0x02939dcf, 0x002d558b}}}, + {X: Field{[10]uint32{0x00c241db, 0x01d1ee36, 0x02c57df9, 0x00e477dd, 0x016255ba, 0x012eca92, 0x00ce8023, 0x01a7bb5f, 0x02f4715e, 0x00325a06}}, Y: Field{[10]uint32{0x01e038e6, 0x0087dfb3, 0x02e0828c, 0x0204c420, 0x00da530e, 0x006f72c1, 0x02bb8468, 0x0148197c, 0x01cbb03d, 0x00322c5d}}}, + {X: Field{[10]uint32{0x02fbc33c, 0x02c5af30, 0x00101790, 0x02f531ad, 0x01bd5538, 0x02d3daba, 0x022671a3, 0x01ab1fd2, 0x021b56bd, 0x00027e82}}, Y: Field{[10]uint32{0x03129e63, 0x03f62d8c, 0x01fb5c08, 0x01a1b511, 0x0016056f, 0x0122d219, 0x00599593, 0x01f33b92, 0x02be785c, 0x0009fe7a}}}, + {X: Field{[10]uint32{0x03d0381e, 0x03b1a91c, 0x01feaa56, 0x03caf038, 0x03a87203, 0x019de593, 0x023e7b98, 0x022ab01c, 0x01f0ca17, 0x0005410b}}, Y: Field{[10]uint32{0x010183f2, 0x03b8ef63, 0x033a1677, 0x03f49082, 0x03e271cb, 0x0050f9d7, 0x039eb59a, 0x01ac37e3, 0x0257dac8, 0x0011176d}}}, + {X: Field{[10]uint32{0x0337e9b2, 0x022c0c87, 0x00b65eb0, 0x03403abe, 0x036b7f9d, 0x00876dd9, 0x027da3e9, 0x0061df83, 0x02630d4c, 0x000d53da}}, Y: Field{[10]uint32{0x004ea8fc, 0x026a8ac4, 0x03fea555, 0x0361942f, 0x012eb784, 0x010fbf59, 0x032f480a, 0x0202fbad, 0x003bd65b, 0x00040014}}}, + {X: Field{[10]uint32{0x01de065c, 0x010c3166, 0x03d8ac11, 0x0139e6b8, 0x029e4ba7, 0x009c1f5b, 0x00d8864d, 0x023f0127, 0x01617a44, 0x000670d8}}, Y: Field{[10]uint32{0x009acff5, 0x001bcc26, 0x022fa4dd, 0x00605842, 0x0275742d, 0x02dca67b, 0x02f570c1, 0x03ba0653, 0x03d8fd38, 0x000be7e7}}}, + {X: Field{[10]uint32{0x0083f88e, 0x0130519c, 0x01d395bd, 0x01ed5b39, 0x035a5080, 0x03767ea3, 0x027a2d4a, 0x02299ada, 0x008ad2ab, 0x000dce61}}, Y: Field{[10]uint32{0x01f0cbc9, 0x02058b19, 0x0151e6f5, 0x002440da, 0x01068a54, 0x00b86233, 0x01d20569, 0x000af7d3, 0x00206111, 0x001bf5c6}}}, + {X: Field{[10]uint32{0x0010aa35, 0x018bab07, 0x01ba9500, 0x023e2b1b, 0x012dd7e5, 0x0212e13d, 0x00e66f1f, 0x008cd9f7, 0x0345261c, 0x002708b2}}, Y: Field{[10]uint32{0x012a1116, 0x02fb9901, 0x0146ec8d, 0x005c665b, 0x03605b00, 0x021b72e7, 0x00bead62, 0x02f9ca44, 0x03f58c25, 0x003fe138}}}, + {X: Field{[10]uint32{0x01b4538e, 0x02f7525b, 0x03abbd0f, 0x0215d44f, 0x015a4127, 0x038df155, 0x00c71e45, 0x005cc9fb, 0x01c87f31, 0x0015c851}}, Y: Field{[10]uint32{0x0238871f, 0x031e4422, 0x03550242, 0x02b013a9, 0x015338c6, 0x00485523, 0x02d5166c, 0x002368ab, 0x03ac5e39, 0x00058f98}}}, + {X: Field{[10]uint32{0x01e940ef, 0x0078c84b, 0x0285bd93, 0x036636e1, 0x034c641e, 0x006a59b1, 0x03213b75, 0x00fad63b, 0x0154d841, 0x00327c1e}}, Y: Field{[10]uint32{0x01e17fd0, 0x03061333, 0x0041d792, 0x03cfb7a4, 0x0092cf5a, 0x0026f3b3, 0x025fe7cb, 0x00f4f281, 0x00bc804f, 0x00279a11}}}, + {X: Field{[10]uint32{0x007f25e3, 0x024684de, 0x000c3f92, 0x02a83a20, 0x01f7b0e4, 0x0016a294, 0x024a24df, 0x0228a759, 0x0346b07c, 0x002b0a5f}}, Y: Field{[10]uint32{0x01b66cbb, 0x02637a0a, 0x0185875e, 0x01ddd4f0, 0x02b1556c, 0x01297460, 0x01bbca05, 0x016b5ff4, 0x037f78e4, 0x001a1b8e}}}, + {X: Field{[10]uint32{0x00b3e1b5, 0x025e4d26, 0x0198c218, 0x02f202f0, 0x035ad55d, 0x0087b688, 0x00274df1, 0x029a20e4, 0x013bb383, 0x0001b164}}, Y: Field{[10]uint32{0x00b9ccf1, 0x016ab78b, 0x00dc91c3, 0x02d743de, 0x0153e5b4, 0x00789295, 0x011ebf46, 0x027d28bc, 0x003ae364, 0x00152e6e}}}, + {X: Field{[10]uint32{0x032495df, 0x03aa396b, 0x01b45cf7, 0x03f71e4f, 0x01846e3e, 0x0058f2fe, 0x0259ee92, 0x00d5afb2, 0x03a3f503, 0x002e649b}}, Y: Field{[10]uint32{0x02e2a512, 0x03e41510, 0x03047bb8, 0x0030402f, 0x01054fd0, 0x03f05781, 0x0015c511, 0x039e87b5, 0x03c533d4, 0x00035b75}}}, + {X: Field{[10]uint32{0x00e69556, 0x01ceb61d, 0x03d5a314, 0x03314d5f, 0x03cb36ad, 0x0181cc15, 0x00ac758f, 0x02f9dff8, 0x01d2f2ca, 0x0010c974}}, Y: Field{[10]uint32{0x034904a9, 0x029f53d4, 0x01932ed5, 0x02d7116b, 0x03818c8f, 0x01833123, 0x030562d5, 0x00c57e21, 0x01682ff6, 0x003790de}}}, + {X: Field{[10]uint32{0x00164917, 0x022a3045, 0x03f110d3, 0x037346ff, 0x00eed924, 0x0387103d, 0x03c9059c, 0x02ff292b, 0x015ffd84, 0x002860fa}}, Y: Field{[10]uint32{0x01d64b95, 0x0006ed10, 0x017f0a0d, 0x0176fbc1, 0x00c38d69, 0x0337e57b, 0x005046d4, 0x03290405, 0x0210c7ff, 0x0004715d}}}, + {X: Field{[10]uint32{0x00d07114, 0x017a205b, 0x0009184d, 0x03f4eeaa, 0x02ab7af5, 0x0123f6f0, 0x0251414f, 0x00a3c365, 0x00d9ad65, 0x002cd034}}, Y: Field{[10]uint32{0x020dd4e1, 0x03410384, 0x01384919, 0x02a6db0f, 0x02ae2671, 0x00392da3, 0x024dfbd4, 0x01c3dfe5, 0x026a9ecd, 0x00217b5c}}}, + {X: Field{[10]uint32{0x02719377, 0x03cd3085, 0x0240e8e6, 0x038db035, 0x00b146fa, 0x02781d74, 0x015f0a4c, 0x00be9056, 0x02883599, 0x002d4b6a}}, Y: Field{[10]uint32{0x024ad7ad, 0x0324391e, 0x029df85e, 0x020892c5, 0x004f42f0, 0x011e31e8, 0x00b5cbad, 0x00e2269b, 0x01399fa8, 0x0018222c}}}, + {X: Field{[10]uint32{0x02b9d8ad, 0x015c268a, 0x0218d5dc, 0x00d9148e, 0x01f269ba, 0x030ad7f9, 0x03f82bf7, 0x03e23a7d, 0x011542b0, 0x000242ef}}, Y: Field{[10]uint32{0x028fc4e5, 0x039cd214, 0x00743e06, 0x02432a9a, 0x03c69584, 0x034dd0f7, 0x01461d2b, 0x00d1329c, 0x024a51af, 0x003277e4}}}, + {X: Field{[10]uint32{0x03aa8365, 0x023a9aa8, 0x01fd2278, 0x03ed0e2c, 0x02b31c54, 0x00b24c4b, 0x03d4603f, 0x00653fb4, 0x01a81696, 0x003dcbb9}}, Y: Field{[10]uint32{0x010fde8a, 0x0305c879, 0x0307404f, 0x0331e159, 0x010e66f4, 0x035169cb, 0x03c1078c, 0x003d2e3f, 0x0182b6ca, 0x0038a58f}}}, + {X: Field{[10]uint32{0x02b9fb53, 0x02a0e5f9, 0x01298c35, 0x0137667e, 0x0366a10f, 0x03f4d23c, 0x035d6ddd, 0x0014950b, 0x03715bc7, 0x000422ba}}, Y: Field{[10]uint32{0x0209f1ce, 0x0273c70c, 0x0145b49b, 0x01c2b1af, 0x0297b8d9, 0x00dca261, 0x036df472, 0x02381283, 0x033975a5, 0x0020e22c}}}, + {X: Field{[10]uint32{0x0361d5b0, 0x019fedbf, 0x02e86e26, 0x000524f8, 0x00fe54c9, 0x01fd189a, 0x00a5ff5c, 0x017afe09, 0x02ed8734, 0x00370f6b}}, Y: Field{[10]uint32{0x013411e5, 0x003e2776, 0x01d56da2, 0x01e64ca9, 0x02cf0010, 0x02ad1fd9, 0x02c1683b, 0x00119c65, 0x0241238e, 0x002d69f9}}}, + {X: Field{[10]uint32{0x0265c589, 0x01e70190, 0x03ef9381, 0x00cbe35a, 0x03a82c5f, 0x00e14fbc, 0x01e1d26e, 0x018483a0, 0x003c2be1, 0x000fe5aa}}, Y: Field{[10]uint32{0x035c64b3, 0x00dc4c5a, 0x03a0f2ea, 0x03eaebff, 0x01630ba1, 0x03ef409f, 0x020d7349, 0x03c83f56, 0x030e797c, 0x003ae34d}}}, + {X: Field{[10]uint32{0x03f5c4f3, 0x004ee5bb, 0x038661de, 0x01febc6d, 0x03b35835, 0x00913ef8, 0x00a22780, 0x008f8c73, 0x006ce1f4, 0x0009f2be}}, Y: Field{[10]uint32{0x02b30f61, 0x03e86e28, 0x005a139b, 0x0128bcb5, 0x032187e2, 0x036f7283, 0x03ddbc23, 0x033ed18c, 0x0318647a, 0x003a3ddd}}}, + {X: Field{[10]uint32{0x0374d04f, 0x00931883, 0x0236167a, 0x0071f020, 0x012d301a, 0x01206591, 0x007f9648, 0x021e1862, 0x03b9e241, 0x0019a073}}, Y: Field{[10]uint32{0x0015151d, 0x02d28dee, 0x017608dc, 0x01a66353, 0x03f1ce48, 0x0023447b, 0x01f521cc, 0x03a510bd, 0x033a7849, 0x0027227a}}}, + {X: Field{[10]uint32{0x02ba8da5, 0x02c3996f, 0x0280e67f, 0x03705e57, 0x02fcac45, 0x03eeebe8, 0x02747092, 0x0118e59c, 0x00494866, 0x0019c46e}}, Y: Field{[10]uint32{0x014cfcc6, 0x00ac964a, 0x00118b81, 0x017d834b, 0x016b986a, 0x02f2a947, 0x02d8cecb, 0x017b6488, 0x003f1c8f, 0x003284b2}}}, + {X: Field{[10]uint32{0x031dd94d, 0x0210f8ad, 0x010118b7, 0x019c89da, 0x01fdd734, 0x01a61d71, 0x03d22b05, 0x00b36e83, 0x03d0b110, 0x0017ba73}}, Y: Field{[10]uint32{0x007d7d86, 0x00087782, 0x0063aed9, 0x02522d7d, 0x02060d22, 0x026d80cc, 0x03c518f1, 0x027b9385, 0x00e5bd7f, 0x000775e9}}}, + {X: Field{[10]uint32{0x01f4924c, 0x028fcabb, 0x01785e38, 0x0074b4b6, 0x02d7538f, 0x03408937, 0x0195a466, 0x002f9bcf, 0x017b1339, 0x00161b6b}}, Y: Field{[10]uint32{0x002b64d0, 0x0365e1b3, 0x039867be, 0x00072657, 0x00bc2fb1, 0x00467963, 0x035bd337, 0x00d6085c, 0x01a5a68a, 0x0031ddfb}}}, + {X: Field{[10]uint32{0x025091ec, 0x01c94359, 0x02d9184f, 0x0382b63b, 0x00867f6e, 0x003771fa, 0x024b6e69, 0x004b1c64, 0x02d20fa0, 0x000169d4}}, Y: Field{[10]uint32{0x03b95db6, 0x02ba0651, 0x02d27d53, 0x025d7cb2, 0x03ec1ace, 0x01e2410b, 0x01029fc5, 0x0190a7c5, 0x032b32b3, 0x0015fc88}}}, + {X: Field{[10]uint32{0x013e638e, 0x02a01929, 0x02e60002, 0x0381ef9c, 0x02426372, 0x01e3ac50, 0x00fef223, 0x015dfaa7, 0x02ff22bc, 0x003e4f2f}}, Y: Field{[10]uint32{0x03afe50f, 0x00d08de0, 0x00a5996f, 0x01755c64, 0x03eeadb7, 0x009e793c, 0x03166702, 0x036d0a52, 0x02bb401b, 0x002af1dc}}}, + {X: Field{[10]uint32{0x012608a9, 0x00053a43, 0x038cc3dd, 0x03ee15ba, 0x0076052c, 0x029b98eb, 0x03c34c36, 0x0025c8bb, 0x009e9613, 0x002309cb}}, Y: Field{[10]uint32{0x024607b3, 0x03a49f9b, 0x02dfde85, 0x0058d257, 0x03731e37, 0x022d5000, 0x027d2261, 0x01c588ee, 0x016813c5, 0x002661f4}}}, + {X: Field{[10]uint32{0x01769bc5, 0x021f0453, 0x015e23e1, 0x01327e55, 0x0038dfd8, 0x00e1b770, 0x00226c4d, 0x0150ae95, 0x00d61519, 0x002fde28}}, Y: Field{[10]uint32{0x01910280, 0x01bb262c, 0x00fe55d2, 0x01f4c56f, 0x03e16058, 0x010a567b, 0x0014b59d, 0x03020798, 0x01e4d84e, 0x00182538}}}, + {X: Field{[10]uint32{0x02e65caa, 0x03f6e64c, 0x02b28ee1, 0x016b8c47, 0x01497aaa, 0x0109217f, 0x03ab651f, 0x00a86ffe, 0x0376cd09, 0x0016c992}}, Y: Field{[10]uint32{0x01d70d78, 0x0062381a, 0x00c84c8c, 0x008b5762, 0x021dd847, 0x015a56c1, 0x010fdc88, 0x035f0d98, 0x03594b68, 0x002513e4}}}, + {X: Field{[10]uint32{0x0082b559, 0x03810ab0, 0x027974b7, 0x014409d3, 0x01322f71, 0x03451dc1, 0x03c14598, 0x028344ce, 0x00ea8075, 0x002891cf}}, Y: Field{[10]uint32{0x02575a18, 0x01a2a268, 0x004b5d2c, 0x00a9c212, 0x035168d3, 0x03db2416, 0x0309d794, 0x01ec1b66, 0x030db655, 0x001937a0}}}, + {X: Field{[10]uint32{0x009efa45, 0x022a00d8, 0x02350652, 0x002028a4, 0x01f14b07, 0x01c21ef5, 0x001535da, 0x0314510d, 0x01e63dd0, 0x000f8635}}, Y: Field{[10]uint32{0x00288c5b, 0x027fd9d5, 0x030a6e1d, 0x00589aa7, 0x0026dc2f, 0x0394d1c3, 0x02fd041b, 0x01ce0be0, 0x01b97d00, 0x001ba71c}}}, + {X: Field{[10]uint32{0x0294dfa5, 0x03d855a0, 0x0184b71a, 0x01050a16, 0x026a7674, 0x0308a421, 0x0296eb09, 0x018c56f3, 0x03cdb91e, 0x00346b36}}, Y: Field{[10]uint32{0x013da5a4, 0x03a7e218, 0x014522c9, 0x03a59ae6, 0x00accb67, 0x00f8a74f, 0x00072017, 0x00dd70fe, 0x00d89872, 0x00178ec3}}}, + {X: Field{[10]uint32{0x0050c90d, 0x002badf6, 0x024e1a21, 0x00a3103d, 0x0125ddb0, 0x00d7b3dd, 0x02cc880a, 0x0383cad7, 0x01e29344, 0x000eaa66}}, Y: Field{[10]uint32{0x0143d42b, 0x00eaafe9, 0x01951567, 0x013b1f28, 0x01028c45, 0x027a6a20, 0x02e6fcbe, 0x0286fb74, 0x025cfbe3, 0x00334b38}}}, + {X: Field{[10]uint32{0x01a5017d, 0x0359c258, 0x02398146, 0x0389692d, 0x033e1b31, 0x028e9b28, 0x010aa4c8, 0x00572fb3, 0x021d7c38, 0x0026288d}}, Y: Field{[10]uint32{0x0009f2bc, 0x01c4a28b, 0x00de6d39, 0x01753674, 0x01516df2, 0x035e380e, 0x00213958, 0x00304efa, 0x03780304, 0x0007ccf7}}}, + {X: Field{[10]uint32{0x013d98d0, 0x01459d01, 0x03cc4613, 0x011ef86d, 0x03ff3482, 0x0132da72, 0x03a55628, 0x02e1c1b5, 0x018c907a, 0x0014a2e7}}, Y: Field{[10]uint32{0x01eafabd, 0x01fab4f7, 0x01051aba, 0x014c6531, 0x0129700d, 0x00028450, 0x02d67bb8, 0x015de1f1, 0x0036d666, 0x003e47ae}}}, + {X: Field{[10]uint32{0x025029b6, 0x01b07398, 0x0193a355, 0x0398b236, 0x00f4be50, 0x02e33dcc, 0x01a6a866, 0x0034822f, 0x008d3d1b, 0x003c6b7b}}, Y: Field{[10]uint32{0x03cc7224, 0x01d07506, 0x0178f964, 0x0153822a, 0x0257e4a7, 0x00b51e55, 0x03fb61b3, 0x01860896, 0x00aac3bf, 0x0011e0c9}}}, + {X: Field{[10]uint32{0x0124a099, 0x035429ce, 0x00f10f74, 0x0329d0aa, 0x000e0181, 0x01d752a8, 0x0070cf8d, 0x0056b106, 0x0133b1b1, 0x002acbbc}}, Y: Field{[10]uint32{0x026a91ea, 0x00a6ac15, 0x030a5756, 0x0339c29c, 0x012f2baa, 0x02302bda, 0x0149ef53, 0x03baad5e, 0x0374c584, 0x0028b11e}}}, + {X: Field{[10]uint32{0x00576f85, 0x0326c9f8, 0x00c72348, 0x01f4446e, 0x00539a61, 0x024dc21a, 0x0120e2bf, 0x01be0ec7, 0x001af6da, 0x002753ad}}, Y: Field{[10]uint32{0x01f30eea, 0x035accf1, 0x000d7cc5, 0x031c7096, 0x0373acc3, 0x00d4cc17, 0x02dfe904, 0x03213ea2, 0x000db786, 0x003071ec}}}, + {X: Field{[10]uint32{0x03b916d9, 0x01088a4f, 0x011d018a, 0x023e790c, 0x02a55363, 0x0367a418, 0x006dff05, 0x00b20722, 0x017f7b1b, 0x000c3b75}}, Y: Field{[10]uint32{0x00842ee7, 0x039f1291, 0x00502d44, 0x0192a8a2, 0x00f7449e, 0x02b3f38c, 0x0220b485, 0x015e8607, 0x034b16d2, 0x001af11d}}}, + {X: Field{[10]uint32{0x01306583, 0x00715d0c, 0x0066a41d, 0x029c7a04, 0x00f10969, 0x01248053, 0x0058fc6a, 0x02e15597, 0x039d09a2, 0x000a38fa}}, Y: Field{[10]uint32{0x03bb6c2c, 0x00f23f37, 0x00e7ddc9, 0x00577d2a, 0x0359ad3c, 0x030542b8, 0x025245c8, 0x01019c03, 0x03878073, 0x003f194e}}}, + {X: Field{[10]uint32{0x02ac75a3, 0x015c69a6, 0x00e08c91, 0x02d9d276, 0x035a3a8b, 0x03cfa098, 0x03be578f, 0x010b428b, 0x0335e3c8, 0x0032e611}}, Y: Field{[10]uint32{0x03ea8367, 0x0050a6de, 0x02268b48, 0x01efa64d, 0x004c3e25, 0x035c52bd, 0x013f977a, 0x030fd4c0, 0x00cc7181, 0x003a4d68}}}, + {X: Field{[10]uint32{0x000fe170, 0x00146ae9, 0x037a3ed0, 0x016c82a8, 0x015e4d66, 0x021437f3, 0x0283b106, 0x001fabba, 0x02727e83, 0x000d8619}}, Y: Field{[10]uint32{0x00707a6d, 0x03be3440, 0x0124be32, 0x03cb6976, 0x01ab27cb, 0x038b2cd2, 0x014c710c, 0x037007d7, 0x02d32ae6, 0x003b189b}}}, + {X: Field{[10]uint32{0x006b7d2e, 0x020ec5d3, 0x03136021, 0x02c8ed40, 0x034260ab, 0x032099ef, 0x02ccd54d, 0x03cd970a, 0x015e69e9, 0x002c6903}}, Y: Field{[10]uint32{0x01c186ec, 0x011cc28f, 0x027c3af0, 0x02a02eb8, 0x0331edde, 0x03bd8cba, 0x001ff894, 0x0107d490, 0x01ab2a7b, 0x001d9867}}}, + {X: Field{[10]uint32{0x01660825, 0x02c509c5, 0x02be242e, 0x00d75308, 0x00b32a8f, 0x00988019, 0x03f0ccb2, 0x00288fa0, 0x00b3dff6, 0x002af522}}, Y: Field{[10]uint32{0x000b3a89, 0x03dfc8e1, 0x0105be1b, 0x00124684, 0x03fa9949, 0x006122ea, 0x007a463d, 0x038ebe5b, 0x00f217da, 0x001bbfe0}}}, + {X: Field{[10]uint32{0x01d6aa22, 0x01443293, 0x00598c92, 0x0055cff9, 0x002a5721, 0x0086f6c4, 0x00979743, 0x03ad20bd, 0x0304d91c, 0x002b033e}}, Y: Field{[10]uint32{0x034582d5, 0x03958149, 0x02de81c5, 0x0129198a, 0x02395031, 0x0111d366, 0x018ae4a6, 0x0342a419, 0x01874a90, 0x001ad7db}}}, + {X: Field{[10]uint32{0x03c34432, 0x02ebc46b, 0x008e6087, 0x03cd54a5, 0x02a3a0bf, 0x0374762f, 0x03c75410, 0x012d9da5, 0x020f476c, 0x0007ea2f}}, Y: Field{[10]uint32{0x00788d33, 0x036d6ae0, 0x01e5496d, 0x01ae3d71, 0x03fe79df, 0x02071c61, 0x0161d201, 0x011878ca, 0x00848038, 0x0031ac94}}}, + {X: Field{[10]uint32{0x01f90e56, 0x03ed0970, 0x00ec9b29, 0x0355fa34, 0x03f336a4, 0x015717c3, 0x017d3137, 0x022626a0, 0x03c0d373, 0x000a06d0}}, Y: Field{[10]uint32{0x009f4a9c, 0x02a6ef2f, 0x03689921, 0x0111fe08, 0x03686830, 0x0089e9a9, 0x03e3db31, 0x016726dc, 0x030eba10, 0x0009ad41}}}, + {X: Field{[10]uint32{0x008f4052, 0x02c9a532, 0x02f120f0, 0x0118aa4a, 0x013b83eb, 0x01796a0b, 0x006327f5, 0x007b11d1, 0x01e954e8, 0x0035939a}}, Y: Field{[10]uint32{0x01c8622a, 0x0251e5cf, 0x030d58f3, 0x0036bebf, 0x0227a8f0, 0x019ba952, 0x0275565f, 0x00f28a6f, 0x015f284c, 0x002a9fb5}}}, + {X: Field{[10]uint32{0x00e7b028, 0x02f353f9, 0x03a5417b, 0x02315086, 0x01483fb5, 0x0185e08d, 0x035b0c9d, 0x0076c7c2, 0x02eed4b0, 0x003d336e}}, Y: Field{[10]uint32{0x02c63b47, 0x02eac641, 0x013021dd, 0x011e3aa4, 0x01b2b924, 0x02894022, 0x039f48c5, 0x0264137a, 0x00eb29d6, 0x0019b564}}}, + {X: Field{[10]uint32{0x03c9dca5, 0x00ffc2a4, 0x02f4c724, 0x0334779d, 0x00761fc1, 0x01e74868, 0x02ca8090, 0x038cd03f, 0x004a6c46, 0x0023fe53}}, Y: Field{[10]uint32{0x0149abf7, 0x00236bbc, 0x0377c2ab, 0x00d2a2ed, 0x01772071, 0x021ff731, 0x0342d4f1, 0x01a38ca7, 0x00335f3c, 0x00048f77}}}, + {X: Field{[10]uint32{0x03cf267a, 0x00fb3449, 0x01e705c3, 0x0313cabd, 0x00efed70, 0x00ed93ec, 0x007c0e62, 0x0061adfa, 0x01b46e34, 0x00031e1a}}, Y: Field{[10]uint32{0x0011f48a, 0x01c829d7, 0x01a59629, 0x0291a401, 0x03029aef, 0x0368aef5, 0x017d95d7, 0x002260bc, 0x00393662, 0x00198a55}}}, + {X: Field{[10]uint32{0x02cce1a4, 0x02c90c41, 0x00142351, 0x01c9bbb0, 0x0309836f, 0x016d4106, 0x026ba9e2, 0x03721ef4, 0x02c60ad5, 0x00383a9d}}, Y: Field{[10]uint32{0x00eff928, 0x00f52e35, 0x03dbc5a0, 0x005f22bd, 0x016a3a44, 0x02248ad9, 0x02a620a7, 0x0126ae22, 0x00e66320, 0x0022f5c9}}}, + {X: Field{[10]uint32{0x01e30159, 0x029fac4a, 0x027bfc6a, 0x03492d2a, 0x00e8e357, 0x0220fd4b, 0x0019f1f4, 0x022608d9, 0x02c73e5f, 0x000be98e}}, Y: Field{[10]uint32{0x00d8c3fd, 0x02c0e3ae, 0x01d517d0, 0x00a01bde, 0x007251db, 0x02d79711, 0x025b3146, 0x00fea3d6, 0x001cd632, 0x0015f858}}}, + {X: Field{[10]uint32{0x033026a1, 0x01b4cb71, 0x0012f6aa, 0x01dec808, 0x0149d008, 0x02ede99c, 0x02783fc1, 0x0024c08b, 0x0038d4c5, 0x001d3b50}}, Y: Field{[10]uint32{0x0328476f, 0x01bf509a, 0x0035e80e, 0x0200e3a6, 0x0258234f, 0x03deff69, 0x00618e49, 0x0027a233, 0x030e65d0, 0x0016dd3d}}}, + {X: Field{[10]uint32{0x00025f97, 0x03f4b63c, 0x01148eae, 0x03737101, 0x0216ce75, 0x03f7c83e, 0x02d1f934, 0x004f71b7, 0x00a6e387, 0x001c75ab}}, Y: Field{[10]uint32{0x0067e302, 0x00f9829c, 0x02bae0dd, 0x013688b6, 0x02072ffd, 0x0067da74, 0x00c6c4fb, 0x037f209e, 0x01337d48, 0x002d0c51}}}, + {X: Field{[10]uint32{0x03ed5292, 0x01d2b316, 0x004ac8a1, 0x031a25c1, 0x02ee617e, 0x0100a5eb, 0x02d5720f, 0x02f27e68, 0x03f16e91, 0x000a3ed1}}, Y: Field{[10]uint32{0x00b498f7, 0x02e1293e, 0x0059e0bd, 0x03b4ae9e, 0x00ef8e7a, 0x0250f06d, 0x00db6059, 0x01caf93f, 0x0161d724, 0x003412da}}}, + {X: Field{[10]uint32{0x0347a37a, 0x01c3b887, 0x036f8942, 0x0177898b, 0x03828c5a, 0x0269eccb, 0x02fca795, 0x016d7d74, 0x01f5c865, 0x001a3f35}}, Y: Field{[10]uint32{0x038d74ab, 0x009fcc9d, 0x01fb6d3d, 0x01395183, 0x017aa1ad, 0x029c409d, 0x032bc4e7, 0x01c59b0d, 0x02503362, 0x0015d201}}}, + {X: Field{[10]uint32{0x01aa36da, 0x0041a165, 0x03e97491, 0x01346b1a, 0x0117c974, 0x01e9800b, 0x017f8a8a, 0x02af11fb, 0x02d2f423, 0x0031d85e}}, Y: Field{[10]uint32{0x03121d9d, 0x01fd95ed, 0x022e8d59, 0x03f281b2, 0x0269e330, 0x00cf1852, 0x027a9db8, 0x01b2b72f, 0x0367fba9, 0x00366412}}}, + {X: Field{[10]uint32{0x02487cdd, 0x019864a9, 0x028c8df5, 0x00862c93, 0x01474fdc, 0x00966a74, 0x0278b955, 0x03f85b03, 0x029d2396, 0x0029fbd3}}, Y: Field{[10]uint32{0x02f67f28, 0x01427bd6, 0x015c1f40, 0x03753dd9, 0x0323c1e4, 0x01bc8bcd, 0x003f7e68, 0x02f81263, 0x020491c6, 0x00359e09}}}, + {X: Field{[10]uint32{0x031e2578, 0x01ad0d9d, 0x00890eab, 0x00602789, 0x0271856d, 0x00246ecb, 0x00e420f4, 0x00d9d92b, 0x00467ff0, 0x003cef9e}}, Y: Field{[10]uint32{0x0236dbc5, 0x0198aec1, 0x03309434, 0x00e9a047, 0x010dc58f, 0x02c9fff0, 0x026966f6, 0x03cf959e, 0x025745cb, 0x003cc09d}}}, + {X: Field{[10]uint32{0x02f0259c, 0x00fdd54d, 0x0347094d, 0x00a9385c, 0x016c8d9e, 0x03afd3cd, 0x0214c303, 0x0338a414, 0x03955bd9, 0x0017251f}}, Y: Field{[10]uint32{0x035e76cc, 0x02d729ed, 0x039c468f, 0x0235a3bc, 0x0190a81d, 0x015e2893, 0x01fdf498, 0x014a8f4b, 0x03753e75, 0x002daded}}}, + {X: Field{[10]uint32{0x018b2c68, 0x033d02ef, 0x00c134e4, 0x02274410, 0x002c54c1, 0x0309681d, 0x01b87028, 0x01cd789e, 0x0160c3b1, 0x0008dbf6}}, Y: Field{[10]uint32{0x01bbc279, 0x02b0e416, 0x01181873, 0x02fad097, 0x01b44bac, 0x01e69db3, 0x019360eb, 0x03063743, 0x03f7c0ba, 0x0026ad66}}}, + {X: Field{[10]uint32{0x01947b31, 0x0184ecec, 0x00d99cd7, 0x03ff2a2c, 0x02c1a9e9, 0x02e7624c, 0x01d02438, 0x038bdd96, 0x032617cc, 0x00324b27}}, Y: Field{[10]uint32{0x02357a51, 0x03f826d4, 0x0150b725, 0x037c54e7, 0x02e4804d, 0x006b38ac, 0x02707695, 0x0193ad97, 0x014c1a5e, 0x002af7aa}}}, + {X: Field{[10]uint32{0x01a94fc0, 0x0068509b, 0x03bd28bd, 0x03a02f07, 0x02733c2a, 0x0348b0c5, 0x0383a124, 0x018230cd, 0x03c9142c, 0x00261821}}, Y: Field{[10]uint32{0x0342a1cd, 0x01844fea, 0x0068d3fa, 0x0373ac9b, 0x038f5bad, 0x01158b37, 0x0282c650, 0x02d475af, 0x03f5fd76, 0x00052496}}}, + {X: Field{[10]uint32{0x008a1d43, 0x01e18869, 0x021bf914, 0x024e0ed0, 0x0222424e, 0x00d5942d, 0x0244e21f, 0x02eab5f1, 0x0374f4f6, 0x00119687}}, Y: Field{[10]uint32{0x0388cb48, 0x03fa48f1, 0x031579f2, 0x01ee0c91, 0x03d41c14, 0x036c0554, 0x02698d57, 0x00c2f7b9, 0x01e41794, 0x0009b69c}}}, + {X: Field{[10]uint32{0x009796b4, 0x033b9bd7, 0x00a00785, 0x03645643, 0x03c7aa2e, 0x002d1ab6, 0x033c88bd, 0x005f113f, 0x00cdf281, 0x00375d96}}, Y: Field{[10]uint32{0x03cc43be, 0x01ecd033, 0x00f37c1c, 0x0303ddf7, 0x039a9b8a, 0x0391749f, 0x034935a8, 0x03a65c29, 0x000d1e10, 0x000c8c5f}}}, + {X: Field{[10]uint32{0x03c72033, 0x033ae1d5, 0x02d09715, 0x022f766b, 0x006222af, 0x0097d4bf, 0x0148b177, 0x03127ad1, 0x02bfa803, 0x00156f4a}}, Y: Field{[10]uint32{0x013ebf43, 0x037f214f, 0x00e3553a, 0x02e10559, 0x0096b991, 0x0373ca95, 0x03c603b8, 0x0112ceaf, 0x03b39d73, 0x000d2b4c}}}, + {X: Field{[10]uint32{0x0012fcde, 0x0322297b, 0x03c36db0, 0x01d90627, 0x00440068, 0x0056c787, 0x01616d30, 0x0089b232, 0x0006d10c, 0x001def97}}, Y: Field{[10]uint32{0x029ba01b, 0x03f67810, 0x037f6ec8, 0x017b6597, 0x0020e8b5, 0x000d86e7, 0x0327ae1b, 0x01252623, 0x03ca5c47, 0x00333cb2}}}, + {X: Field{[10]uint32{0x012ab21c, 0x02dabcbd, 0x0161830d, 0x03bb52ed, 0x0180b890, 0x03a9f6f7, 0x0060b19b, 0x03c987c1, 0x00863eb6, 0x003eadc9}}, Y: Field{[10]uint32{0x0076d0b0, 0x00bdd322, 0x025c15d2, 0x03ebea76, 0x00b67f6a, 0x0276039a, 0x01174ed9, 0x00b8baaa, 0x003a408a, 0x0002453c}}}, + {X: Field{[10]uint32{0x020b2f66, 0x02e0208a, 0x005a109d, 0x017573c4, 0x02510db6, 0x039e0c52, 0x02671f8d, 0x022e1942, 0x0039fafe, 0x0008ca88}}, Y: Field{[10]uint32{0x0178576a, 0x03cfb0ab, 0x02218d95, 0x0389934b, 0x033be3a6, 0x0085bb04, 0x03b9f6ee, 0x03078d4c, 0x0082510b, 0x0005329c}}}, + {X: Field{[10]uint32{0x037f58e7, 0x00e41506, 0x00cfc64e, 0x028a252a, 0x01deee9f, 0x023c4f9a, 0x01847526, 0x013fde81, 0x0039612a, 0x002cd20a}}, Y: Field{[10]uint32{0x0126ae44, 0x03edc757, 0x0193a3f2, 0x00919ac4, 0x01653b82, 0x01f16378, 0x034e9faf, 0x00096c3a, 0x02eddf30, 0x001c8b40}}}, + {X: Field{[10]uint32{0x02353210, 0x008e6596, 0x017b2858, 0x012889b7, 0x02cf6fd8, 0x024c89c4, 0x0310871a, 0x01d61f2a, 0x02570b0a, 0x0034e1ce}}, Y: Field{[10]uint32{0x0160f186, 0x01789fd4, 0x011d660e, 0x003327f0, 0x01f1f45d, 0x01578cd4, 0x03f95b1c, 0x039c1b37, 0x018459c7, 0x000edf92}}}, + {X: Field{[10]uint32{0x022c20ad, 0x02cb6e85, 0x03281cc9, 0x030c9b72, 0x0226a049, 0x011f029e, 0x01289a71, 0x02caddc7, 0x008ceeeb, 0x00220a1e}}, Y: Field{[10]uint32{0x007b71a7, 0x0197d230, 0x0364cc8c, 0x00b77928, 0x025da2fa, 0x0125c709, 0x0398922b, 0x017c88f5, 0x01958742, 0x00390a28}}}, + {X: Field{[10]uint32{0x027e537d, 0x002cfd3a, 0x0280a37f, 0x02d3a9d5, 0x0052f8db, 0x024fe85d, 0x0186c189, 0x030035d2, 0x013126d0, 0x001e7fb9}}, Y: Field{[10]uint32{0x002cb5b6, 0x0005ea20, 0x035a4560, 0x02fa4f56, 0x01525ceb, 0x00eaceaf, 0x017b4a14, 0x03e652d3, 0x00713143, 0x003f7940}}}, + {X: Field{[10]uint32{0x02814e91, 0x03962a19, 0x01cbaac1, 0x0272fda6, 0x03367242, 0x000ead42, 0x00f3a8ce, 0x017de57c, 0x01f05a9f, 0x003d13ce}}, Y: Field{[10]uint32{0x019a1dd4, 0x02768c35, 0x030e3fc0, 0x01191ab1, 0x02ff75a2, 0x02aca2ee, 0x00a27afb, 0x004c0254, 0x01d1e4de, 0x002e5791}}}, + {X: Field{[10]uint32{0x00aa9abb, 0x009bb0a0, 0x02148504, 0x02fcf0be, 0x02da45af, 0x00cb3def, 0x01d7d788, 0x0326dee2, 0x0209baf9, 0x00044e38}}, Y: Field{[10]uint32{0x006a0d6e, 0x01f9267c, 0x02f88372, 0x005c259c, 0x03ac7d59, 0x0399fcba, 0x02285207, 0x02cabc3a, 0x016a3965, 0x000570a3}}}, + {X: Field{[10]uint32{0x00912c1e, 0x02e0fe4d, 0x02620472, 0x03c56bf0, 0x00dcd3d3, 0x02940c4c, 0x024685aa, 0x035e3183, 0x01421b98, 0x000a74fa}}, Y: Field{[10]uint32{0x02bf5825, 0x011729f4, 0x02ce1a6d, 0x019f222e, 0x01411c8c, 0x02df14ee, 0x01d46b6d, 0x0025a485, 0x00f84968, 0x00242945}}}, + {X: Field{[10]uint32{0x00ff3eb8, 0x025a7021, 0x020c7e90, 0x022294fe, 0x01d6efeb, 0x034b51c2, 0x00c18d7c, 0x00cf813c, 0x02945fdd, 0x002a28da}}, Y: Field{[10]uint32{0x016ab564, 0x025abd7d, 0x002a9bb5, 0x03351e7c, 0x0223db1f, 0x033b872b, 0x02aedbe1, 0x0335c009, 0x0105edbf, 0x000775fe}}}, + {X: Field{[10]uint32{0x02981eff, 0x0030849a, 0x03fd5367, 0x032a0498, 0x003c35f2, 0x00f9e81b, 0x02ab4f0c, 0x02513e43, 0x02ceb3fa, 0x00168123}}, Y: Field{[10]uint32{0x03c886ff, 0x035b52ed, 0x019b24b3, 0x0015a486, 0x008e330d, 0x03a201df, 0x03caf7b5, 0x03b59754, 0x03aeb70f, 0x000493c6}}}, + {X: Field{[10]uint32{0x0132b8ba, 0x0204a23a, 0x031583dc, 0x03b35ca5, 0x00fd1eb4, 0x01917eb1, 0x01ee579c, 0x02f0bd99, 0x02820c5e, 0x000c81c0}}, Y: Field{[10]uint32{0x01bdaa17, 0x036b7ca1, 0x03d55b86, 0x026a00f2, 0x03c17eda, 0x022109c1, 0x03b11ee0, 0x0101fb6b, 0x022d0d68, 0x0023da59}}}, + {X: Field{[10]uint32{0x03afe787, 0x01e91f95, 0x01786db7, 0x024c9e86, 0x02c78105, 0x0202927f, 0x0188a7b0, 0x034fc6ee, 0x025bfb04, 0x001f08a1}}, Y: Field{[10]uint32{0x0036bd3b, 0x03c1b874, 0x00d53097, 0x01c9839c, 0x03d0830b, 0x00e7c672, 0x01997344, 0x02675f55, 0x026e30f5, 0x00280bac}}}, + {X: Field{[10]uint32{0x039385cc, 0x0384f2c2, 0x033a422d, 0x01682abc, 0x01fd842e, 0x00f730d9, 0x02c8269a, 0x02094b01, 0x001330ad, 0x00282e93}}, Y: Field{[10]uint32{0x02239bc8, 0x00a4397f, 0x00960c13, 0x00511d5a, 0x00940fdb, 0x01dee7a1, 0x036d2ce2, 0x02efdfce, 0x03135cfd, 0x00163b2a}}}, + {X: Field{[10]uint32{0x00f76309, 0x007b08d1, 0x038194e3, 0x0121c399, 0x03007be4, 0x00b8b033, 0x03e47a41, 0x02e97723, 0x0042c8a2, 0x0010ab98}}, Y: Field{[10]uint32{0x02a1542e, 0x03c826f7, 0x02c3ce19, 0x008f2f25, 0x0336ea3a, 0x00f19119, 0x010a6e75, 0x022fc888, 0x01ac7ba3, 0x001cab5a}}}, + {X: Field{[10]uint32{0x007b2a19, 0x000b56c2, 0x01e7c6e8, 0x00323f04, 0x01d8f35f, 0x01c081ce, 0x025d82f4, 0x01e8b8fa, 0x00b64550, 0x0023ceba}}, Y: Field{[10]uint32{0x025b4cfe, 0x034ae03b, 0x036a50d1, 0x009f4fe6, 0x03604259, 0x02e6c51c, 0x003420ef, 0x03b5506e, 0x02353028, 0x00186ee3}}}, + {X: Field{[10]uint32{0x005df32f, 0x006d0dec, 0x004c00d9, 0x00498ab9, 0x00a7ba1e, 0x00254f9b, 0x024fb4f3, 0x00648283, 0x024b1e15, 0x000ea12e}}, Y: Field{[10]uint32{0x013e20c0, 0x02eb679f, 0x02ce7d3c, 0x03af3771, 0x0332c44e, 0x02438743, 0x023abe9c, 0x017c51ec, 0x01794352, 0x002c83d9}}}, + {X: Field{[10]uint32{0x03316210, 0x017f6239, 0x005b62d2, 0x0204af05, 0x017b87d1, 0x03918b9f, 0x00c102bd, 0x02940cfb, 0x026c0b04, 0x0019207f}}, Y: Field{[10]uint32{0x0364560d, 0x039709e3, 0x01075b26, 0x003abbcc, 0x03d4e88b, 0x00232461, 0x036538b8, 0x00ab4245, 0x00abf5f3, 0x002f306d}}}, + {X: Field{[10]uint32{0x0151a094, 0x004c1935, 0x02f4d1ff, 0x032b2b02, 0x038e4bd1, 0x03dceccf, 0x01cd3651, 0x0160febe, 0x0174722c, 0x00014d00}}, Y: Field{[10]uint32{0x01a66a8e, 0x02f88840, 0x00a41a3b, 0x016ebafe, 0x01d9e465, 0x021742a5, 0x0035180f, 0x0185b439, 0x0135448a, 0x00392408}}}, + {X: Field{[10]uint32{0x022867cc, 0x003e1493, 0x0349bb35, 0x029e4372, 0x016c9ee2, 0x015ef0cb, 0x024e08bd, 0x017135b0, 0x02aea582, 0x00301a4f}}, Y: Field{[10]uint32{0x03b9a05e, 0x0217618c, 0x00a0462c, 0x022bbf83, 0x01f4f617, 0x032e3ed5, 0x006c601b, 0x01047817, 0x034b7627, 0x0036883e}}}, + {X: Field{[10]uint32{0x00fa0d9d, 0x02dba4cf, 0x0335ca91, 0x006a0d59, 0x01e63e58, 0x02862608, 0x03f9200c, 0x00140b45, 0x037372fd, 0x00314743}}, Y: Field{[10]uint32{0x02352655, 0x02b5308b, 0x03413b3b, 0x01f4f1be, 0x03a2797a, 0x013ae5e6, 0x03ff1345, 0x01fb74b3, 0x02b207ed, 0x00234439}}}, + {X: Field{[10]uint32{0x02c3290c, 0x005837ef, 0x0059dbe3, 0x023b674b, 0x03366600, 0x022d4ab4, 0x02f79f85, 0x0266b8b6, 0x00564d2d, 0x0005a046}}, Y: Field{[10]uint32{0x012e7460, 0x03ddee8a, 0x0202d1ad, 0x0128f021, 0x033e9cc8, 0x0148b342, 0x01dbac34, 0x01e123a0, 0x01a14561, 0x000afafc}}}, + {X: Field{[10]uint32{0x000afeb5, 0x0125d21f, 0x01a0920a, 0x02695e0d, 0x030b1599, 0x01952a9b, 0x00e16225, 0x021496cb, 0x0133e143, 0x001eba52}}, Y: Field{[10]uint32{0x019b95f5, 0x00bd3d6f, 0x0390195a, 0x02dbd10f, 0x01a13b87, 0x038ccc6f, 0x00282a51, 0x0191684e, 0x0237830a, 0x0024644b}}}, + {X: Field{[10]uint32{0x0019d4ac, 0x0166684c, 0x0036b179, 0x02c156cb, 0x02c27709, 0x00b46fc2, 0x014c5f6c, 0x01daac90, 0x0197d02b, 0x0039de4b}}, Y: Field{[10]uint32{0x013f2b52, 0x02e6383b, 0x02e8d16f, 0x00528a05, 0x01dd2746, 0x01755b30, 0x00c75a0d, 0x02c5e6e6, 0x02895fce, 0x0027d365}}}, + {X: Field{[10]uint32{0x0247bde1, 0x0278d34c, 0x004f769d, 0x001bba9b, 0x003d97d7, 0x02b1e514, 0x00ff64f4, 0x0358fc93, 0x01d4946f, 0x0000bfee}}, Y: Field{[10]uint32{0x0381014f, 0x0095edfa, 0x03a9ff32, 0x00c955db, 0x02cff188, 0x038d823a, 0x016907a6, 0x0054c4af, 0x00743488, 0x00019ac7}}}, + {X: Field{[10]uint32{0x00bb2fbe, 0x01722c7b, 0x00ea3c16, 0x02e84b80, 0x01aeb6f4, 0x012b9cd4, 0x012aafab, 0x03bac450, 0x0232f90c, 0x0011512e}}, Y: Field{[10]uint32{0x038f6736, 0x0221f2e7, 0x017b3948, 0x022e0d1e, 0x002bba53, 0x000b6eff, 0x039ede9b, 0x033ba2fe, 0x03b4c2a5, 0x0018bef5}}}, + {X: Field{[10]uint32{0x0118980f, 0x0278f99e, 0x0137a1b0, 0x039e2093, 0x025d981c, 0x02319ed7, 0x02b156dd, 0x03fe89d7, 0x01b925d9, 0x000942c0}}, Y: Field{[10]uint32{0x0209c481, 0x03ae074f, 0x000ff261, 0x0185010b, 0x03eb1851, 0x01d98967, 0x032bcbe6, 0x036a1b94, 0x024a32f0, 0x002e8764}}}, + {X: Field{[10]uint32{0x02beb4d2, 0x0387fb82, 0x030f5ecb, 0x004e4078, 0x0262e0b8, 0x00ba58bb, 0x00468073, 0x017f71cc, 0x02541f2a, 0x00273cc3}}, Y: Field{[10]uint32{0x01510723, 0x035528ed, 0x00741c6b, 0x03ad959f, 0x02848259, 0x02aa3fd8, 0x0201d14b, 0x02ddec65, 0x02cd1281, 0x001f2c91}}}, + {X: Field{[10]uint32{0x02285a2c, 0x005ec695, 0x01c03cd2, 0x03293c47, 0x01b5a90e, 0x0254213b, 0x013be124, 0x0287823e, 0x00b13c61, 0x003b727a}}, Y: Field{[10]uint32{0x021e1f3d, 0x03e67f98, 0x01fda5e9, 0x02168bf7, 0x01b0e8df, 0x02320198, 0x0143b1b5, 0x03eb1d3f, 0x012107e8, 0x0019b0bf}}}, + {X: Field{[10]uint32{0x01e2c66e, 0x020b1c3c, 0x036b6970, 0x000acf76, 0x02cae9d0, 0x009ee06e, 0x02a41649, 0x029260aa, 0x015f8388, 0x0037650a}}, Y: Field{[10]uint32{0x00d6706b, 0x03af0602, 0x00f4bfd3, 0x02c920b6, 0x033b08c2, 0x007eb20f, 0x00d9e8cb, 0x0307aa6f, 0x020cd409, 0x0020e301}}}, + {X: Field{[10]uint32{0x0285ab7e, 0x01d14d41, 0x0087692f, 0x037742b1, 0x0296e96d, 0x02ff1cd3, 0x000d3b35, 0x02f92397, 0x0204dfc0, 0x001f81a3}}, Y: Field{[10]uint32{0x02c70d0a, 0x02100793, 0x036462c8, 0x0021e620, 0x0369351e, 0x024fc52f, 0x00052e60, 0x00972341, 0x014690d2, 0x0037cb34}}}, + {X: Field{[10]uint32{0x009a5052, 0x010fce65, 0x0217a21f, 0x01cdf7b0, 0x00b7c2a0, 0x01b10e68, 0x02e659f7, 0x02b26c11, 0x03cfd10a, 0x001cea6f}}, Y: Field{[10]uint32{0x03be10dd, 0x01092a6c, 0x00ec24a1, 0x03da46a7, 0x03bf379d, 0x023e1b2f, 0x002062c0, 0x02c1481a, 0x01293ea7, 0x001cee45}}}, + {X: Field{[10]uint32{0x0008c55b, 0x0211fb35, 0x0205adaa, 0x012fda6f, 0x0055cc22, 0x0216026f, 0x0234678d, 0x031d539b, 0x03840c8c, 0x003bf77f}}, Y: Field{[10]uint32{0x02f188d5, 0x01b75b70, 0x013fc173, 0x0228ed9c, 0x008aac21, 0x03116d2b, 0x026ed7e0, 0x02aacbbf, 0x03418264, 0x00197763}}}, + {X: Field{[10]uint32{0x03d73f4b, 0x015a23af, 0x03585756, 0x016c5c69, 0x01dc264f, 0x010e1b76, 0x023d6dfa, 0x00e13634, 0x01857118, 0x0011aa51}}, Y: Field{[10]uint32{0x01aaf35c, 0x03004699, 0x02a6d256, 0x03a3a37c, 0x031e684e, 0x0239fd85, 0x03f16cb3, 0x03063d36, 0x037ea298, 0x000f796b}}}, + {X: Field{[10]uint32{0x0021cd3f, 0x03a91fce, 0x0193b910, 0x02326b5b, 0x0045dd0c, 0x038582a5, 0x02fa17bb, 0x03099752, 0x01b27ce3, 0x001a243b}}, Y: Field{[10]uint32{0x03cbd1ab, 0x008103dd, 0x03852dd2, 0x03abad9e, 0x037c24be, 0x02a200aa, 0x00810a7c, 0x01525336, 0x005b10ef, 0x00183d1f}}}, + {X: Field{[10]uint32{0x0205f5ae, 0x02d12d0a, 0x0288d952, 0x03087d55, 0x01e33e68, 0x01e89470, 0x02c4b328, 0x0221aa07, 0x02b6340b, 0x00023327}}, Y: Field{[10]uint32{0x007fb6eb, 0x022fc08c, 0x01c95507, 0x01c05432, 0x01f03238, 0x02f11d6e, 0x011981a3, 0x020a4224, 0x030d90e3, 0x0026c5da}}}, + {X: Field{[10]uint32{0x015b0475, 0x007f8a92, 0x00e0b0fd, 0x03809b25, 0x01227875, 0x025b3785, 0x0001ccae, 0x03782d60, 0x035ada48, 0x000ac18b}}, Y: Field{[10]uint32{0x031eab0d, 0x00d4e40b, 0x0280548b, 0x02523bfd, 0x02da9de9, 0x02fc5c9d, 0x0097bad4, 0x01c31420, 0x00683d51, 0x0014dfc7}}}, + {X: Field{[10]uint32{0x037240f9, 0x01ea2fae, 0x0008252d, 0x037c9fcc, 0x01cd358b, 0x0093a48c, 0x032ff7f2, 0x0354fd0c, 0x011a84b3, 0x0037556e}}, Y: Field{[10]uint32{0x012a5c94, 0x02064206, 0x0158bff6, 0x01ce8eb0, 0x01774d21, 0x037bbe5a, 0x03376094, 0x0194c3b5, 0x0208a40b, 0x00039bc6}}}, + {X: Field{[10]uint32{0x02c59c70, 0x032592bc, 0x01e7516f, 0x02035c54, 0x008986fd, 0x01e0bb8b, 0x000cdb1c, 0x02a5e51b, 0x03e040b1, 0x002b1449}}, Y: Field{[10]uint32{0x03ae5db9, 0x017a806d, 0x038e2476, 0x025e202b, 0x038afbb0, 0x01d9164f, 0x020a82e1, 0x0014e776, 0x0249323d, 0x00212788}}}, + {X: Field{[10]uint32{0x01311123, 0x0084b06d, 0x034bff72, 0x008c54c5, 0x039d1364, 0x038776b9, 0x004e9ce1, 0x033a68de, 0x02daf0b6, 0x0037cbcb}}, Y: Field{[10]uint32{0x006d46a5, 0x031d7dba, 0x027bedba, 0x01105880, 0x02fde6ab, 0x01991009, 0x02da64f4, 0x02f080c5, 0x038ebd78, 0x002e7663}}}, + {X: Field{[10]uint32{0x0373e5f9, 0x03e4f5e8, 0x0002773f, 0x03d0fec2, 0x0097bdc5, 0x00844d84, 0x0385e216, 0x0305d88e, 0x0387d630, 0x003f60ec}}, Y: Field{[10]uint32{0x036cd2ee, 0x019c2daa, 0x00837d3c, 0x02f0e10e, 0x01115805, 0x0303f772, 0x03503d40, 0x00d69675, 0x027d375f, 0x0026a58a}}}, + {X: Field{[10]uint32{0x02cac4df, 0x03ae384c, 0x00c9505f, 0x0079081b, 0x00d565ca, 0x028ffaaa, 0x02ad443b, 0x0322b22f, 0x03c1155e, 0x00363ef7}}, Y: Field{[10]uint32{0x011f73ac, 0x02697a9d, 0x03abc9cb, 0x03587e58, 0x027fb1fc, 0x03afdd90, 0x01258edf, 0x0272d1ce, 0x000fccb9, 0x003e514f}}}, + {X: Field{[10]uint32{0x03bf86d6, 0x00443037, 0x010ddc89, 0x01cae08d, 0x0285f008, 0x01aabcf5, 0x03093891, 0x03a3006c, 0x009a20a3, 0x0027f25d}}, Y: Field{[10]uint32{0x023e19df, 0x0129e661, 0x02379109, 0x02eb9d69, 0x0075c85c, 0x0023c3c6, 0x033bca70, 0x02b1655d, 0x01a76c92, 0x0028bd9e}}}, + {X: Field{[10]uint32{0x03476a3f, 0x032057cb, 0x00f62b58, 0x024b4dca, 0x0365b810, 0x038865ae, 0x02bcf252, 0x0073a6f6, 0x034671a9, 0x000a7838}}, Y: Field{[10]uint32{0x00d0c0e6, 0x02f5a635, 0x039d4174, 0x002aad0b, 0x011ce5ad, 0x0319ac98, 0x00a35fb9, 0x002b91e6, 0x0061b82e, 0x000bd103}}}, + {X: Field{[10]uint32{0x02e102d7, 0x01ad4642, 0x0278f873, 0x002ea1bb, 0x007fbee7, 0x0330f7ee, 0x03e6f929, 0x015683c9, 0x02153989, 0x003901a2}}, Y: Field{[10]uint32{0x03165086, 0x0279a623, 0x014e77d6, 0x010c1d1f, 0x0016b911, 0x012a68d4, 0x01999438, 0x0272dabb, 0x02ad550f, 0x0028fcbc}}}, + {X: Field{[10]uint32{0x026c9f2c, 0x01080a1c, 0x0109248a, 0x01934f55, 0x0010f163, 0x0132065e, 0x03156c8a, 0x0366262e, 0x0210bb1b, 0x00146d17}}, Y: Field{[10]uint32{0x03e141a2, 0x023256f8, 0x03f6bb47, 0x01452315, 0x008a1f1d, 0x00004330, 0x01ac4797, 0x03798ca0, 0x01d04225, 0x0038c1c6}}}, + {X: Field{[10]uint32{0x02a0b83e, 0x032fe96a, 0x005acf6f, 0x00bf5683, 0x0164dc49, 0x01b18ecf, 0x02ec2e60, 0x02dad7a4, 0x01297b8a, 0x00053357}}, Y: Field{[10]uint32{0x03666805, 0x00af5df8, 0x033279b7, 0x01c0a91a, 0x015be192, 0x02c71f63, 0x01ad1faf, 0x032198d2, 0x03d77cdc, 0x0016fcc1}}}, + {X: Field{[10]uint32{0x022c4da6, 0x03376d74, 0x0168f8c3, 0x037d067b, 0x0045e9f2, 0x027060a2, 0x02254cae, 0x03451b0c, 0x031149d6, 0x00296a29}}, Y: Field{[10]uint32{0x00bf6c2e, 0x002eeb4f, 0x012d549c, 0x0205e0cf, 0x00b003f4, 0x0158e6fc, 0x00ae6933, 0x034d16bd, 0x00877bc3, 0x0027d1f6}}}, + {X: Field{[10]uint32{0x039372cb, 0x01303107, 0x038f999a, 0x0394b31d, 0x01bda494, 0x00519893, 0x01b13ddd, 0x0108cb5d, 0x00d24baa, 0x000d64ca}}, Y: Field{[10]uint32{0x001af6d8, 0x0206b3c9, 0x03050a78, 0x01f5923d, 0x03b6695d, 0x0323da02, 0x0084afe0, 0x00e67a64, 0x02b571df, 0x0034c555}}}, + {X: Field{[10]uint32{0x0273e7fd, 0x03e56f79, 0x005e891a, 0x0304349b, 0x00c8fdac, 0x02407b6c, 0x0268a12d, 0x0168b05c, 0x01ca4f2a, 0x00327ae0}}, Y: Field{[10]uint32{0x008adb66, 0x034a5092, 0x008df76e, 0x0394d558, 0x035acb73, 0x026fef5a, 0x01ae19cd, 0x03fa69c4, 0x012fc974, 0x001b5294}}}, + {X: Field{[10]uint32{0x02ca8e2c, 0x037979b0, 0x01f386cc, 0x00c093d0, 0x0248e557, 0x02d840b8, 0x00c9f90e, 0x02cc22b1, 0x01f816f3, 0x0038998c}}, Y: Field{[10]uint32{0x039306bd, 0x011857fa, 0x0224858a, 0x00502f56, 0x0396cfb8, 0x00146094, 0x01e2f102, 0x03b34059, 0x02a8823a, 0x0005b82c}}}, + {X: Field{[10]uint32{0x019110ba, 0x020d57fe, 0x029658db, 0x03e68ec2, 0x02677e5a, 0x01a711cc, 0x0007b242, 0x039f941e, 0x02f365c0, 0x003ddba6}}, Y: Field{[10]uint32{0x012a9407, 0x032c04ef, 0x021028a0, 0x018a5ab6, 0x019d174c, 0x0217e759, 0x02f25423, 0x00593af6, 0x0039d26f, 0x002032fd}}}, + {X: Field{[10]uint32{0x012c5dd9, 0x03d89c21, 0x03421e65, 0x01521079, 0x00bc333d, 0x02a23f38, 0x01d6ab69, 0x00520ca5, 0x005baf89, 0x00373205}}, Y: Field{[10]uint32{0x031e2a19, 0x031866bc, 0x01480cca, 0x03360362, 0x00296155, 0x000d8eec, 0x00d6cd16, 0x039ea6d0, 0x0370a620, 0x0033b6cd}}}, + {X: Field{[10]uint32{0x0203e4fd, 0x00feb4f1, 0x03847ed3, 0x010107b6, 0x007660bc, 0x02ba4c06, 0x02a199ec, 0x01343e95, 0x013a6a1c, 0x001d9178}}, Y: Field{[10]uint32{0x0291e713, 0x01308b2f, 0x002ee186, 0x014ec8b1, 0x02bcfc53, 0x036a2434, 0x01eccbb5, 0x03975449, 0x011b7990, 0x001f23a9}}}, + {X: Field{[10]uint32{0x022f3f25, 0x00acc627, 0x00fb4422, 0x01751788, 0x01465822, 0x00706daf, 0x027210d5, 0x02f3bebf, 0x006ed74c, 0x002e89a2}}, Y: Field{[10]uint32{0x02b3409d, 0x01436e28, 0x02893bdf, 0x009dcd67, 0x01e0b896, 0x02ee8c9b, 0x025fa64a, 0x02b7ba79, 0x01b223dd, 0x003f6217}}}, + {X: Field{[10]uint32{0x01050fe1, 0x03486946, 0x02c92299, 0x023579e4, 0x000fc657, 0x029497a0, 0x01bda654, 0x016c7640, 0x00e13100, 0x001a2d40}}, Y: Field{[10]uint32{0x0312f96b, 0x001757da, 0x0202207e, 0x009e0f80, 0x008df9b1, 0x01f6951a, 0x01ac8e87, 0x012a53cf, 0x017ab354, 0x001c7bdf}}}, + {X: Field{[10]uint32{0x027996ff, 0x03a9d6b6, 0x01064b84, 0x03265029, 0x035b19f7, 0x00b1be81, 0x03f851f1, 0x02a0f09f, 0x03e2613f, 0x000b3329}}, Y: Field{[10]uint32{0x03d7707f, 0x02b83cc9, 0x005703c6, 0x023c2fb5, 0x03cf37af, 0x03164e42, 0x01b2d2f0, 0x006b4343, 0x022222dd, 0x0016adc2}}}, + {X: Field{[10]uint32{0x03179f14, 0x03d369bd, 0x033c1827, 0x03013573, 0x00383ad9, 0x032db729, 0x01af7183, 0x0291686d, 0x012d6a56, 0x001b5e5f}}, Y: Field{[10]uint32{0x000edf3f, 0x0189547a, 0x02ea67b1, 0x0078568e, 0x03b80e54, 0x035bd6a2, 0x0284bee7, 0x03463667, 0x00e5d203, 0x0002ab8d}}}, + {X: Field{[10]uint32{0x018ee327, 0x001665ba, 0x027b5116, 0x0160157d, 0x009a565a, 0x025a94f9, 0x013751ad, 0x01dac655, 0x03c437be, 0x002a9a65}}, Y: Field{[10]uint32{0x00684835, 0x0030cf03, 0x034cb3cc, 0x01de87d3, 0x036532e2, 0x038bd7c6, 0x018a15b2, 0x0103825a, 0x00219cdb, 0x00180d29}}}, + {X: Field{[10]uint32{0x022a0f48, 0x00316fae, 0x02dead01, 0x02137006, 0x0201e624, 0x02c3e25f, 0x005d53a7, 0x0075c28d, 0x03bffb8e, 0x0015b103}}, Y: Field{[10]uint32{0x02f0bd01, 0x032daa91, 0x01f4c458, 0x01e1f8a6, 0x01676a4a, 0x01cf632a, 0x03a0e091, 0x024a409e, 0x0389078b, 0x003a7419}}}, + {X: Field{[10]uint32{0x03918d89, 0x0240f545, 0x010731d2, 0x00dca94d, 0x01b6e1e2, 0x02d4b0f7, 0x0262be08, 0x03b5ef70, 0x02a83963, 0x0036dbfd}}, Y: Field{[10]uint32{0x01951769, 0x02dc461f, 0x03bdc162, 0x019435d5, 0x030e248d, 0x00513283, 0x02f6b18c, 0x03f512d0, 0x02fa0f30, 0x00290044}}}, + {X: Field{[10]uint32{0x03402c6d, 0x03286018, 0x01de4151, 0x01cdd539, 0x03dcdd11, 0x02950c04, 0x00e730d4, 0x018f88ce, 0x0301a46f, 0x00237d55}}, Y: Field{[10]uint32{0x03a1c3df, 0x0344b755, 0x02a93b9d, 0x0196f227, 0x02b3e696, 0x0122efd8, 0x016ddafb, 0x00ffc04e, 0x009a64b6, 0x001933e7}}}, + {X: Field{[10]uint32{0x030588a1, 0x03d22806, 0x00af37be, 0x033b7896, 0x0166485c, 0x01775791, 0x03ae460e, 0x023d5d01, 0x002c5101, 0x0027442f}}, Y: Field{[10]uint32{0x00922c04, 0x0324e261, 0x02ac2fcb, 0x00baba83, 0x01726b30, 0x000f7fae, 0x01ebe44e, 0x0385c5fb, 0x0008b2a4, 0x000e3a8f}}}, + {X: Field{[10]uint32{0x03640367, 0x02e601cd, 0x03e662e4, 0x01ec3f39, 0x02056025, 0x0080581b, 0x027a7068, 0x029e1cb2, 0x0075cc07, 0x0004eef2}}, Y: Field{[10]uint32{0x00c2c708, 0x011d2c70, 0x007697fe, 0x02bf5bd5, 0x02d2ea3d, 0x02abc6c7, 0x00a19acb, 0x00a99b63, 0x031a47c8, 0x002d3365}}}, + {X: Field{[10]uint32{0x02a9c3e1, 0x03273257, 0x02b1e24e, 0x028c4f24, 0x011857d9, 0x00369b72, 0x0147630d, 0x02c5d372, 0x0037f617, 0x0023c9b7}}, Y: Field{[10]uint32{0x033f15ef, 0x03ddb839, 0x0375bd5c, 0x03f0554c, 0x00f887f2, 0x01646b11, 0x00238776, 0x02fc9d39, 0x03031d96, 0x000e1228}}}, + {X: Field{[10]uint32{0x007b5f21, 0x0295e693, 0x01041ad3, 0x026c4419, 0x03a23e0d, 0x01836f84, 0x015236f6, 0x0245bd79, 0x003df290, 0x000b8795}}, Y: Field{[10]uint32{0x01473846, 0x002b4bed, 0x02d28ff1, 0x020ca3f8, 0x03947bc0, 0x00610d2d, 0x00cd9f32, 0x00176b04, 0x0127626e, 0x00221691}}}, + {X: Field{[10]uint32{0x023f3109, 0x02020b3b, 0x0385a123, 0x0143a31e, 0x018bed8f, 0x00fada6d, 0x0076936e, 0x027aa2ee, 0x00a3e050, 0x00320f0b}}, Y: Field{[10]uint32{0x029cd5ed, 0x01f0cc4c, 0x00c0e3b0, 0x01d54c07, 0x0074b75e, 0x00276955, 0x030da10d, 0x02378ac2, 0x02a9bc80, 0x000ae580}}}, + {X: Field{[10]uint32{0x03d29607, 0x0347eaf4, 0x02700578, 0x00724181, 0x01afee8b, 0x038e14c4, 0x024111ae, 0x005394c9, 0x03b4e2c1, 0x00231e40}}, Y: Field{[10]uint32{0x01025731, 0x011cddbc, 0x01b2528d, 0x000620a6, 0x00b488c4, 0x00a8d0fa, 0x02ebea9a, 0x03e53407, 0x02d1964d, 0x003740b6}}}, + {X: Field{[10]uint32{0x02569cc0, 0x029a0769, 0x009bda38, 0x02199532, 0x01b51857, 0x00707ae1, 0x00adfc6c, 0x01d732cc, 0x0054dd75, 0x0012098f}}, Y: Field{[10]uint32{0x0213167f, 0x037ee204, 0x03955dda, 0x017d572d, 0x02e223ac, 0x00964dba, 0x0198e49a, 0x02d4a03b, 0x03bddacd, 0x0039bc41}}}, + {X: Field{[10]uint32{0x02f0d2d3, 0x02c95185, 0x0227495f, 0x009f153b, 0x00accb71, 0x00f35766, 0x018644c6, 0x007d61e4, 0x010aea7d, 0x001a9f01}}, Y: Field{[10]uint32{0x0021e232, 0x01c95bb6, 0x0154628d, 0x020ed2ec, 0x02f80f73, 0x00226c32, 0x03f733dc, 0x0191b8d2, 0x026127a2, 0x003eb464}}}, + {X: Field{[10]uint32{0x035c3ea8, 0x0168661f, 0x01a3bf10, 0x02683331, 0x030ece87, 0x00c72c27, 0x01147dcc, 0x03080b7e, 0x013f62fb, 0x00387c29}}, Y: Field{[10]uint32{0x01706277, 0x02483c79, 0x01d8dcfe, 0x024bf8b9, 0x003968f6, 0x0100dde0, 0x03148489, 0x03a8c030, 0x010f0b0e, 0x000e4c28}}}, + {X: Field{[10]uint32{0x03182b7b, 0x00999d74, 0x0213b485, 0x0029b539, 0x02da9b6a, 0x02293219, 0x026efcae, 0x03296ff5, 0x0113cb0f, 0x002f03ec}}, Y: Field{[10]uint32{0x03090f31, 0x02871b2f, 0x0060131c, 0x01581d17, 0x0037892c, 0x00fb2c52, 0x0315f691, 0x03baef49, 0x025e6993, 0x0038479c}}}, + {X: Field{[10]uint32{0x0342f908, 0x02c0ca72, 0x034fe266, 0x0285d284, 0x030ee7e6, 0x027ab9ed, 0x03f9ebf8, 0x023d2192, 0x00f49c43, 0x0007f968}}, Y: Field{[10]uint32{0x0275f66c, 0x03584271, 0x0379b35a, 0x012b3a6d, 0x02069451, 0x03e9ed65, 0x033878bc, 0x0190724a, 0x01cef912, 0x0036e025}}}, + {X: Field{[10]uint32{0x02524cd4, 0x010c82aa, 0x00f6de43, 0x020cfcf2, 0x00ade6ea, 0x02afe94f, 0x02e61aae, 0x01c00be9, 0x01b49016, 0x001778ff}}, Y: Field{[10]uint32{0x007e08f0, 0x01615e45, 0x00535dc1, 0x028f57a6, 0x016d7e9c, 0x02346b0a, 0x004a1dd8, 0x035b3acd, 0x0288862a, 0x002d72f7}}}, + {X: Field{[10]uint32{0x023da54f, 0x02ff2f00, 0x020738ad, 0x00b78865, 0x02b2964f, 0x02529916, 0x02b0be62, 0x037f3d7b, 0x0193a913, 0x0024ec1a}}, Y: Field{[10]uint32{0x012ae0b8, 0x01285352, 0x0107c4d1, 0x03607a2d, 0x029c151a, 0x0328f1f8, 0x007330ef, 0x02dd1106, 0x002f856c, 0x001e0d9e}}}, + {X: Field{[10]uint32{0x02762f0c, 0x02de1823, 0x01851886, 0x026f8e05, 0x009c3336, 0x01ac1578, 0x005a044f, 0x001d079a, 0x000d27d9, 0x0001c15d}}, Y: Field{[10]uint32{0x033d956e, 0x01772645, 0x03c55d3f, 0x00c87eec, 0x00b2142b, 0x00a7c4ab, 0x013193b5, 0x011b1a7a, 0x03bb738d, 0x00312963}}}, + {X: Field{[10]uint32{0x0193e296, 0x00687847, 0x0086434a, 0x019d8410, 0x02e5b787, 0x0254c3c2, 0x00a20e19, 0x015499cd, 0x0000fc48, 0x001d8668}}, Y: Field{[10]uint32{0x006ebed6, 0x02fa1b41, 0x032014f8, 0x01d5dc80, 0x01ab26f6, 0x028b3ad6, 0x03a0afe0, 0x011e73db, 0x01e1182f, 0x001fcc03}}}, + {X: Field{[10]uint32{0x019ff2fe, 0x0150a296, 0x0060dbec, 0x02d8e139, 0x01cc0d54, 0x00a0504f, 0x01346fcd, 0x014805b3, 0x01a8ddbb, 0x003f883d}}, Y: Field{[10]uint32{0x002d879c, 0x02a4ae49, 0x02e0bae7, 0x01ead3b2, 0x01338cf4, 0x02655ec3, 0x02be551f, 0x0121c6bf, 0x02e6e260, 0x0016d222}}}, + {X: Field{[10]uint32{0x02ad11e2, 0x03878fd0, 0x00b84422, 0x00862ae2, 0x01707681, 0x00f1d47e, 0x0129e077, 0x014b3cb7, 0x0327ba7e, 0x002656e5}}, Y: Field{[10]uint32{0x037fd26e, 0x03d71b4b, 0x0391f42a, 0x0217e416, 0x0049c8d5, 0x00a6f62e, 0x02c5e5f5, 0x0051a313, 0x01c97ee4, 0x0030f277}}}, + {X: Field{[10]uint32{0x002b3136, 0x01f0909c, 0x02a16e26, 0x02836130, 0x01636d26, 0x01458648, 0x02913445, 0x0135f1e7, 0x024d2ca9, 0x0032d3cb}}, Y: Field{[10]uint32{0x003ddb9b, 0x021e77a0, 0x02e49bbb, 0x01c5e9a3, 0x031b9b2f, 0x03df8ae2, 0x000df480, 0x01039b3c, 0x02ee3949, 0x000857ad}}}, + {X: Field{[10]uint32{0x01fce397, 0x00b095ae, 0x00e6fc72, 0x02757869, 0x034572b6, 0x019a3ad9, 0x00b10707, 0x024512eb, 0x025634b4, 0x0032828a}}, Y: Field{[10]uint32{0x03f4841b, 0x023ae0b4, 0x01ebfe95, 0x029c2f6d, 0x036e2562, 0x01ab69e9, 0x0098c855, 0x00beee94, 0x00c974ab, 0x002481e7}}}, + {X: Field{[10]uint32{0x03af7c7b, 0x01ae48b8, 0x00246acd, 0x02259ed3, 0x02bfadde, 0x013bc58e, 0x02f27a02, 0x0302bf5c, 0x032dc6c0, 0x003ee08c}}, Y: Field{[10]uint32{0x0134c7ee, 0x0315032a, 0x030c660d, 0x02646733, 0x032b90d3, 0x038b12c6, 0x00beaa52, 0x02da40ce, 0x0119f21c, 0x00069a5c}}}, + {X: Field{[10]uint32{0x00513dd2, 0x03b10a97, 0x006736af, 0x02818f6d, 0x02d07550, 0x008062f5, 0x02184a4e, 0x0237bc83, 0x0205d925, 0x003415bb}}, Y: Field{[10]uint32{0x0015bffb, 0x0366632f, 0x0031c276, 0x03135a37, 0x0389ab0f, 0x0006b5c9, 0x027cfb62, 0x038d599f, 0x01d0d222, 0x0002bcb0}}}, + {X: Field{[10]uint32{0x02526f12, 0x028494d0, 0x007267ae, 0x004b360a, 0x01c63257, 0x02dde18d, 0x0046c594, 0x01098b10, 0x0222c658, 0x000feb6c}}, Y: Field{[10]uint32{0x0199ae96, 0x019adfb0, 0x02717586, 0x0387aae1, 0x03d181e0, 0x02875d2d, 0x00a7e8bf, 0x00474e13, 0x0007fa68, 0x00369723}}}, + {X: Field{[10]uint32{0x019c4b61, 0x01098ec7, 0x029248ab, 0x023bed9f, 0x03214b81, 0x0274f914, 0x01915dd3, 0x03943977, 0x0169e222, 0x00349eb2}}, Y: Field{[10]uint32{0x033a1c7f, 0x02529db2, 0x03f6f9b4, 0x016b6079, 0x0209a7c5, 0x02100c8d, 0x02709a32, 0x034c15b9, 0x0294baea, 0x0031215d}}}, + {X: Field{[10]uint32{0x02c565d4, 0x0103c05c, 0x02cbcd93, 0x00064686, 0x0399cd3a, 0x03ff5a7b, 0x03a4324b, 0x006b9a97, 0x01b48b98, 0x001048de}}, Y: Field{[10]uint32{0x00fa280e, 0x034fa1ff, 0x023abac9, 0x00ec9154, 0x03c75505, 0x02f9aad5, 0x02523e7e, 0x0393c0b2, 0x02c9c7db, 0x003c900d}}}, + {X: Field{[10]uint32{0x039336f1, 0x037ea8fd, 0x003eace9, 0x027ec849, 0x01bef790, 0x018f4029, 0x028cc3b6, 0x01304ee6, 0x02aa9937, 0x003608d3}}, Y: Field{[10]uint32{0x02755c27, 0x03e412db, 0x00e5cb1f, 0x03e47720, 0x001845d8, 0x00a4aeaf, 0x03c15930, 0x0197d9a8, 0x028ec4b4, 0x0002e32f}}}, + {X: Field{[10]uint32{0x01189009, 0x02ebca97, 0x03bbe47f, 0x00e8f61d, 0x00427d32, 0x03634f00, 0x000ea349, 0x03fe72eb, 0x033568c5, 0x00109be2}}, Y: Field{[10]uint32{0x0100586d, 0x010e672f, 0x03bfd7dc, 0x01fde214, 0x019931f5, 0x01f2e0ae, 0x03a1ba72, 0x00f1ee71, 0x013dce02, 0x0013808a}}}, + {X: Field{[10]uint32{0x0097dfa5, 0x009d8291, 0x036ccfe7, 0x01bb1e03, 0x01871757, 0x0272971e, 0x012a7fdc, 0x017cb090, 0x02f902ee, 0x003c71c1}}, Y: Field{[10]uint32{0x03b7e740, 0x0173eb0a, 0x004d59f8, 0x02575ae7, 0x009ef758, 0x006826e1, 0x01787005, 0x01570ece, 0x01a1727f, 0x00317868}}}, + {X: Field{[10]uint32{0x02c2c679, 0x03c61a4d, 0x00b67608, 0x00799d66, 0x03598200, 0x0094d5ad, 0x00d66825, 0x01661e5a, 0x007ecc1d, 0x002138b8}}, Y: Field{[10]uint32{0x0028555a, 0x01ce19b3, 0x03bb6281, 0x03dbd6d0, 0x012903f4, 0x01ff3ae9, 0x0275a8ab, 0x03b3732f, 0x03438ab5, 0x00106ac4}}}, + {X: Field{[10]uint32{0x02ad2b54, 0x0226d01d, 0x020689c6, 0x002fbc3d, 0x023d599b, 0x028633da, 0x02bb6993, 0x01608d12, 0x02c2fe53, 0x001e4d7b}}, Y: Field{[10]uint32{0x03371910, 0x033ef554, 0x01b406c4, 0x02b78f5d, 0x01b77480, 0x0393d721, 0x00ed574f, 0x022186db, 0x016aab97, 0x00338bf2}}}, + {X: Field{[10]uint32{0x00dbd9a0, 0x029a8c2c, 0x0383927a, 0x02250878, 0x013e8c26, 0x0368e802, 0x01abbef9, 0x01b55ade, 0x00a8319f, 0x003550a9}}, Y: Field{[10]uint32{0x038173e1, 0x01e6bb1e, 0x037a4f19, 0x00326161, 0x026badb7, 0x00654681, 0x019f3e9c, 0x0217aa3e, 0x016265d2, 0x00144128}}}, + {X: Field{[10]uint32{0x00ece2be, 0x009f6691, 0x0232fd3c, 0x02e49bec, 0x00041011, 0x000e049b, 0x02f0157a, 0x02624012, 0x02194228, 0x002f1a49}}, Y: Field{[10]uint32{0x0252f3bc, 0x00da71ff, 0x034f9847, 0x00bb6c97, 0x0311e202, 0x032e3bdd, 0x032e8543, 0x0298c24d, 0x00c147e2, 0x00238bc4}}}, + {X: Field{[10]uint32{0x018d8d03, 0x0086fd74, 0x03e51f45, 0x024257d0, 0x00ae079a, 0x0122ad94, 0x02cdd80b, 0x0230237a, 0x0336bb17, 0x003af86d}}, Y: Field{[10]uint32{0x01db7514, 0x0028bab3, 0x02bbb0cd, 0x0187f23b, 0x03782f20, 0x00aa049a, 0x0378ef4b, 0x01437917, 0x02590b14, 0x002b6071}}}, + {X: Field{[10]uint32{0x01e2774c, 0x014b7b2e, 0x03e7bde1, 0x012a4e0a, 0x02666d09, 0x03e3c158, 0x01f887ad, 0x0214f93f, 0x010849e1, 0x003989ae}}, Y: Field{[10]uint32{0x034834ea, 0x004ffe43, 0x027c30f5, 0x010b1658, 0x002dca73, 0x033ee1d6, 0x02ab4062, 0x00a89c32, 0x01daa419, 0x002433d5}}}, + {X: Field{[10]uint32{0x00381e67, 0x021ea739, 0x000b61a9, 0x0072f1eb, 0x000d8f57, 0x0291453c, 0x013b8b5b, 0x021e488c, 0x0057ba04, 0x003ee9e8}}, Y: Field{[10]uint32{0x029ec44a, 0x03b9ebb5, 0x000f718c, 0x0243b94c, 0x037cea5b, 0x016295fa, 0x005133f9, 0x014eeafc, 0x03fc1426, 0x001f4abd}}}, + {X: Field{[10]uint32{0x00c35a54, 0x02f9a265, 0x039ea1e3, 0x01691595, 0x03023973, 0x01c0cf99, 0x02e5bdb5, 0x01460568, 0x03955b5d, 0x00051336}}, Y: Field{[10]uint32{0x0253f1e6, 0x021e9dd8, 0x02a83919, 0x023e28ba, 0x03ed0a10, 0x0204d6d2, 0x0150d2b0, 0x03f16600, 0x0389e896, 0x0039805b}}}, + {X: Field{[10]uint32{0x003c0a24, 0x009787c6, 0x01eb681c, 0x023c099e, 0x03ad28cd, 0x02566767, 0x034a2d1a, 0x006d7b35, 0x026ee7ab, 0x00014e37}}, Y: Field{[10]uint32{0x00121004, 0x021012c5, 0x009601de, 0x01cc84f4, 0x012482b9, 0x016ce281, 0x01bac87d, 0x00464d6f, 0x03477961, 0x000db029}}}, + {X: Field{[10]uint32{0x03c03794, 0x001856ba, 0x02f2e9d1, 0x029c152f, 0x007876eb, 0x018edd5f, 0x00a38062, 0x01cfb883, 0x030fd28f, 0x001da453}}, Y: Field{[10]uint32{0x03a12642, 0x00c1a00c, 0x0008ec39, 0x014be7e2, 0x00593307, 0x0189b18b, 0x03557861, 0x0156fc88, 0x01cae168, 0x001b7893}}}, + {X: Field{[10]uint32{0x0234e4a7, 0x00caeaa7, 0x000af27e, 0x02eea960, 0x0186bee7, 0x03244bca, 0x015f7f96, 0x03df6bd6, 0x026cf675, 0x001a6457}}, Y: Field{[10]uint32{0x039513c9, 0x00b3c88a, 0x00d56df7, 0x006ddd9d, 0x03139bc3, 0x0374b68e, 0x0353c918, 0x026155de, 0x03c02f10, 0x0018253e}}}, + {X: Field{[10]uint32{0x00ce3015, 0x02ea11c6, 0x03e5d859, 0x00d790a1, 0x022c37eb, 0x02e4460b, 0x0142dcfd, 0x0353f6fa, 0x020c900b, 0x0013b9b0}}, Y: Field{[10]uint32{0x0062cd64, 0x03543cc8, 0x00f7590e, 0x0319311f, 0x0142e2a9, 0x030a4f4f, 0x0338e668, 0x0186312d, 0x0369863d, 0x00212b25}}}, + {X: Field{[10]uint32{0x00a0fa61, 0x01c5e5a2, 0x02c6ad22, 0x00442be7, 0x01aa5982, 0x01323160, 0x00e11dca, 0x03e28e3b, 0x001af57b, 0x0029a04f}}, Y: Field{[10]uint32{0x038edca4, 0x00ba0256, 0x000e1d18, 0x026f7168, 0x01d415c9, 0x0263ecbc, 0x03e2335e, 0x0258c56d, 0x034df4e2, 0x00190809}}}, + {X: Field{[10]uint32{0x010fce84, 0x03f9aadc, 0x03d6c0fd, 0x01ddbb94, 0x0269d910, 0x01d76d27, 0x01fc7432, 0x00a25c93, 0x03b7107b, 0x00108400}}, Y: Field{[10]uint32{0x02f9427f, 0x023ccf1d, 0x0002ac21, 0x021ceaa0, 0x020a9320, 0x022f3fa9, 0x01cb1498, 0x010e570c, 0x01697b92, 0x0032e555}}}, + {X: Field{[10]uint32{0x00c8c522, 0x002f7192, 0x02df8fc6, 0x02616d51, 0x015e1252, 0x02b3d7c9, 0x009d362e, 0x0313f100, 0x01e10cb8, 0x000272c6}}, Y: Field{[10]uint32{0x03d70d12, 0x03a253b1, 0x036231b7, 0x0382416f, 0x028fd286, 0x035f3fe1, 0x0220e70e, 0x039a2d8f, 0x01d32c6e, 0x00089c05}}}, + {X: Field{[10]uint32{0x03b953c2, 0x00d8d8a2, 0x03704362, 0x012dd78c, 0x03c4a7ac, 0x038b3832, 0x03412d64, 0x01623ce3, 0x01968193, 0x0031d04d}}, Y: Field{[10]uint32{0x0108aa6b, 0x01d7bd2a, 0x008019ae, 0x03c949de, 0x015e1d70, 0x03b05ace, 0x02dd4c90, 0x03135b48, 0x03a01b7c, 0x001efb9f}}}, + {X: Field{[10]uint32{0x01df22cc, 0x00b99d98, 0x02cec9dc, 0x02603a1b, 0x00c2f8e3, 0x02a5f319, 0x03ac1ea8, 0x01249ba3, 0x0205321f, 0x000aa3a2}}, Y: Field{[10]uint32{0x001fae42, 0x007ef6e6, 0x037809c8, 0x001febfd, 0x0364f0c0, 0x0034fe04, 0x0360c21c, 0x0372aab2, 0x01074e4f, 0x0018ee19}}}, + {X: Field{[10]uint32{0x0097a14d, 0x008a4fb5, 0x02127355, 0x031f1bd9, 0x025af1d8, 0x02a38b72, 0x02ab014e, 0x00d65122, 0x02607d40, 0x003cfbcb}}, Y: Field{[10]uint32{0x022cccc9, 0x01f0c758, 0x03ca9c63, 0x012fd0f6, 0x019e9ce4, 0x0275e305, 0x01d1d964, 0x027d12f1, 0x0334214b, 0x0037f354}}}, + {X: Field{[10]uint32{0x0057ead9, 0x0100a012, 0x0365a80e, 0x0092effa, 0x03a93964, 0x02c759c4, 0x0111b361, 0x00ce9744, 0x01c8169c, 0x001b5710}}, Y: Field{[10]uint32{0x005e84c8, 0x031522a9, 0x02a4a6a0, 0x00829486, 0x023d6742, 0x003d66f7, 0x0291d370, 0x02f0a89e, 0x00c49f01, 0x001307dd}}}, + {X: Field{[10]uint32{0x02fff85c, 0x031c7d12, 0x03c73488, 0x00891f81, 0x01608223, 0x013f51e3, 0x01982ce3, 0x021ac0b1, 0x0261c6a9, 0x0017604a}}, Y: Field{[10]uint32{0x03a960b8, 0x036894ff, 0x001fdcc8, 0x005e2fb5, 0x00680b15, 0x03248d21, 0x0349e164, 0x023f1095, 0x037b1601, 0x000dc20f}}}, + {X: Field{[10]uint32{0x0373093e, 0x02aa11df, 0x027d5dc6, 0x029827be, 0x01720177, 0x00a44615, 0x03a97108, 0x03cd1f0e, 0x02ecb82f, 0x00380565}}, Y: Field{[10]uint32{0x005b3bdd, 0x01faceed, 0x0177e554, 0x03061dd9, 0x03a17aca, 0x02963929, 0x00da5d06, 0x0212e74e, 0x00328498, 0x00299d32}}}, + {X: Field{[10]uint32{0x01980f55, 0x01100b02, 0x00d0b834, 0x0183bdac, 0x00ad52b9, 0x0373fdfc, 0x032fcaea, 0x03fcb9ec, 0x01000313, 0x0019e96a}}, Y: Field{[10]uint32{0x000a4a02, 0x01c0f24f, 0x02a03f41, 0x022bae2d, 0x009fdf92, 0x01f10783, 0x00075753, 0x022197ae, 0x01db5e8e, 0x0039dfbf}}}, + {X: Field{[10]uint32{0x0066b277, 0x0035f0d9, 0x01c217df, 0x02cd5ca0, 0x0353d77d, 0x03798960, 0x01c16477, 0x002b60a0, 0x039c2e2d, 0x000ae5a1}}, Y: Field{[10]uint32{0x00b62b25, 0x02f211a0, 0x030743cb, 0x0019e1a9, 0x027e0dae, 0x012a7f9f, 0x032408f6, 0x030caf31, 0x007343ba, 0x0037574d}}}, + {X: Field{[10]uint32{0x010367e9, 0x038b670c, 0x02bad825, 0x012fedc9, 0x03639b05, 0x00f8f848, 0x03137aea, 0x01235cb7, 0x038df087, 0x002ae50d}}, Y: Field{[10]uint32{0x03a10f03, 0x03740610, 0x011c99e3, 0x027fcb7c, 0x017f9d76, 0x01e376bd, 0x0331865c, 0x01f446a0, 0x02244003, 0x0015e173}}}, + {X: Field{[10]uint32{0x03e7439f, 0x02aaec10, 0x00985fa3, 0x036e1ef9, 0x012f3fd4, 0x028edb23, 0x013def6c, 0x03f78e32, 0x01560fd6, 0x001c1e09}}, Y: Field{[10]uint32{0x038ebec7, 0x02cfee05, 0x036af8f9, 0x03603e88, 0x0151894b, 0x03abd4d4, 0x01274b48, 0x01408331, 0x0365ecf1, 0x001e44ef}}}, + {X: Field{[10]uint32{0x03ca3942, 0x028062dd, 0x01eb3e71, 0x0203bf3b, 0x036b4d5e, 0x000928fd, 0x038c72c1, 0x03541ecc, 0x0070138b, 0x000c0974}}, Y: Field{[10]uint32{0x02b470ae, 0x03759a43, 0x03096f83, 0x02558e96, 0x038d5032, 0x00a93b94, 0x00172b5f, 0x03fe56a5, 0x020e175e, 0x000ea29a}}}, + {X: Field{[10]uint32{0x039ab0b6, 0x028f4602, 0x03ac9901, 0x02864e25, 0x02576081, 0x02a34079, 0x0069e7b2, 0x01eaee50, 0x02d065e9, 0x000ff8dc}}, Y: Field{[10]uint32{0x00842e5a, 0x00082895, 0x00c2d4c1, 0x014b3898, 0x00824035, 0x0359ed69, 0x03315e41, 0x037300dd, 0x02923154, 0x000bbf3b}}}, + {X: Field{[10]uint32{0x02f55636, 0x03968c0a, 0x001640bc, 0x03836a04, 0x03c3c373, 0x0301af5f, 0x02be8f9c, 0x00cfba5f, 0x00113a91, 0x000da31c}}, Y: Field{[10]uint32{0x006162a8, 0x03e1ad34, 0x024a135b, 0x03969bea, 0x02eb7d70, 0x0305a5c4, 0x028b942b, 0x02a385bc, 0x00fa4870, 0x00086f50}}}, + {X: Field{[10]uint32{0x00d96810, 0x03ab253b, 0x0100387e, 0x01a3953f, 0x0357682f, 0x02b5b5c4, 0x0040f230, 0x01793879, 0x03d8beb4, 0x001f7e3f}}, Y: Field{[10]uint32{0x002ed0df, 0x01d99f66, 0x013c9ec0, 0x0034281f, 0x03dc5555, 0x0131fff9, 0x0057d789, 0x016a6512, 0x00f9908e, 0x000f6793}}}, + {X: Field{[10]uint32{0x036f23d4, 0x036fdf42, 0x038bbdd2, 0x01c9413e, 0x02882691, 0x026c449d, 0x02162624, 0x031fb9f0, 0x0139eb49, 0x0032dab6}}, Y: Field{[10]uint32{0x0298346d, 0x000063ba, 0x01cb345e, 0x019785e2, 0x005480ca, 0x027e399a, 0x01319c45, 0x01cd9f78, 0x00db18f2, 0x003b2181}}}, + {X: Field{[10]uint32{0x00f4265a, 0x0263ca1c, 0x0053d390, 0x010b9a13, 0x01d8a1e0, 0x02766c81, 0x014e6a75, 0x00679b81, 0x02c80fc3, 0x0016b949}}, Y: Field{[10]uint32{0x010a9a63, 0x022185f5, 0x03850f24, 0x02af678c, 0x00a03f4b, 0x0155df02, 0x033ef80d, 0x016a433f, 0x028114c2, 0x00368784}}}, + {X: Field{[10]uint32{0x01ff7661, 0x021ab9c9, 0x03323a87, 0x019d6e34, 0x02174777, 0x000115b5, 0x03f2b10e, 0x02eb306e, 0x008906dd, 0x0021a35e}}, Y: Field{[10]uint32{0x0322ca1d, 0x030c24eb, 0x00ef296f, 0x0120d0a8, 0x0246e6ce, 0x027051bd, 0x03e57baa, 0x0037e38a, 0x001d189b, 0x00364b5a}}}, + {X: Field{[10]uint32{0x03686b74, 0x00762675, 0x025a4834, 0x02611f0c, 0x0223bd32, 0x01041a8c, 0x01d1f8a7, 0x0206db13, 0x034de7b8, 0x0027cbc2}}, Y: Field{[10]uint32{0x02440088, 0x013f0523, 0x016e3c44, 0x0172d1fc, 0x02deca28, 0x016158bc, 0x0329ca66, 0x012be2d5, 0x0111c297, 0x001beef5}}}, + {X: Field{[10]uint32{0x03fca8a3, 0x0140ddb4, 0x00b4fe69, 0x03afa302, 0x02c522f5, 0x03b8babd, 0x032da983, 0x0037c56f, 0x022b813b, 0x003eabc8}}, Y: Field{[10]uint32{0x000b472e, 0x036d0751, 0x01469b2c, 0x01b175b4, 0x0147f00e, 0x013c4aaf, 0x032ae874, 0x036b1a3e, 0x02692e98, 0x002fb14f}}}, + {X: Field{[10]uint32{0x03161475, 0x01f48a69, 0x00008fd6, 0x020293b1, 0x0313c81c, 0x01b1718b, 0x02a7ab70, 0x02e7e8b0, 0x01b9db4a, 0x001fd482}}, Y: Field{[10]uint32{0x0248d193, 0x033a82d2, 0x00ce4e69, 0x002e6b31, 0x00a58be4, 0x03c64736, 0x017d1c76, 0x01a67fce, 0x00daf9e8, 0x00284f5b}}}, + {X: Field{[10]uint32{0x02c84c2a, 0x012fd3c4, 0x00c04683, 0x02490168, 0x0050c7b4, 0x009c0285, 0x025f395e, 0x00dbc201, 0x016e80b1, 0x003d0d85}}, Y: Field{[10]uint32{0x017e60c4, 0x022546ef, 0x020e5911, 0x002e220a, 0x00e7aa89, 0x026c01fa, 0x020807d3, 0x03806e9d, 0x03b05684, 0x00337655}}}, + {X: Field{[10]uint32{0x00f1d06e, 0x03c70c4f, 0x0169f201, 0x0150ac93, 0x02882167, 0x00d153e9, 0x020c2bb0, 0x00df6081, 0x03495c5b, 0x003be6a9}}, Y: Field{[10]uint32{0x027a4aa9, 0x033d32bc, 0x0366654c, 0x03bf47dd, 0x0050003a, 0x0139b35f, 0x0125750e, 0x012a3eb0, 0x024df1d8, 0x003e1036}}}, + {X: Field{[10]uint32{0x035de05a, 0x00a25bfe, 0x01d40b12, 0x0322965c, 0x016d9e1c, 0x0179e4db, 0x010809c2, 0x02e4eb0a, 0x0043e96e, 0x001f7bb7}}, Y: Field{[10]uint32{0x02a8e0ce, 0x009ad949, 0x03381220, 0x03edaf24, 0x01de6683, 0x033c4bf3, 0x027b349c, 0x03439003, 0x026627b9, 0x00399703}}}, + {X: Field{[10]uint32{0x006d6459, 0x012cf3a6, 0x0215c0e7, 0x03d3ca0f, 0x01878384, 0x020bcd87, 0x03e74955, 0x01e5711e, 0x03156669, 0x001686fb}}, Y: Field{[10]uint32{0x00cf39ff, 0x01e711cb, 0x00d61b11, 0x020777e3, 0x0069b28b, 0x020cf8e0, 0x035b97e1, 0x000aca78, 0x02811fdb, 0x0033a616}}}, + {X: Field{[10]uint32{0x0125fa8e, 0x014d5639, 0x0383bfa4, 0x033e12c8, 0x0173b8fd, 0x020f1beb, 0x00eeb789, 0x004f0ac5, 0x01392334, 0x0036048f}}, Y: Field{[10]uint32{0x0233ef73, 0x009a51e9, 0x00095ea2, 0x028c3256, 0x02835e35, 0x02ecf2d5, 0x03f78a5a, 0x01c8011b, 0x019d905b, 0x003aa74e}}}, + {X: Field{[10]uint32{0x024d4bc8, 0x00c4cd03, 0x035d8939, 0x03469e9a, 0x0310d3df, 0x0026bed7, 0x02a36c39, 0x030c4099, 0x01d4f1f4, 0x0018bd0f}}, Y: Field{[10]uint32{0x0190f3ed, 0x028772ed, 0x028ef89f, 0x00a76a8b, 0x02755258, 0x00e8407c, 0x034fe225, 0x03591cb8, 0x01f1f83b, 0x002edd62}}}, + {X: Field{[10]uint32{0x039d72f7, 0x033cc4bd, 0x01f4fcc1, 0x0111bd8b, 0x00865f6e, 0x033d6535, 0x015aa750, 0x03011450, 0x0371d549, 0x00001b3c}}, Y: Field{[10]uint32{0x01e93af4, 0x006b7172, 0x0216a758, 0x02741a33, 0x002b3dee, 0x020ad168, 0x024ce206, 0x026f4a0a, 0x022b5c97, 0x003e33ad}}}, + {X: Field{[10]uint32{0x03cdd7e7, 0x03bf16d1, 0x01f3c509, 0x01c545af, 0x0249aeb3, 0x03e55021, 0x01638dd8, 0x03a70df0, 0x0380770b, 0x0016f5ed}}, Y: Field{[10]uint32{0x006ba9ff, 0x0242664a, 0x031e3021, 0x000ca8a2, 0x01efc12c, 0x02b74309, 0x006b91c5, 0x02abd3d8, 0x00488a87, 0x00351b1e}}}, + {X: Field{[10]uint32{0x036b6a62, 0x02fcf6f0, 0x001af0e6, 0x01ffc55a, 0x0081eecd, 0x02e566e8, 0x02086653, 0x02f52b96, 0x0154a319, 0x0031dc12}}, Y: Field{[10]uint32{0x016d0fe7, 0x00ecf294, 0x0337836e, 0x0002c571, 0x03e508f6, 0x02273312, 0x013b9c61, 0x012ea0fd, 0x03e82478, 0x000dcd50}}}, + {X: Field{[10]uint32{0x01b19cda, 0x0371b40e, 0x039588fe, 0x02342790, 0x02d6e92c, 0x0040b07b, 0x007da707, 0x00ea7760, 0x03fe4153, 0x000ad3c9}}, Y: Field{[10]uint32{0x001fb424, 0x038ab67e, 0x01d6b089, 0x02009005, 0x0049ba21, 0x024bd30c, 0x01fadd4a, 0x01f2c704, 0x03100ecd, 0x00262ea0}}}, + {X: Field{[10]uint32{0x014c0e5a, 0x001b2297, 0x03db54d3, 0x0204f5f0, 0x032c920c, 0x01a4c7e5, 0x000c581d, 0x030d3498, 0x01710b3d, 0x00039f50}}, Y: Field{[10]uint32{0x029a409a, 0x00513c92, 0x011f75b6, 0x01c74735, 0x0303e75b, 0x0169b128, 0x03a97efb, 0x014e1e67, 0x01ba9a82, 0x002ca560}}}, + {X: Field{[10]uint32{0x01c5d52e, 0x0198357c, 0x0284b2b5, 0x0187a01b, 0x032face7, 0x01a89c5f, 0x02700435, 0x00d5dc14, 0x022c18f4, 0x001880c0}}, Y: Field{[10]uint32{0x036a720d, 0x02021944, 0x024eb06c, 0x035aaa21, 0x020212ef, 0x0150ae5f, 0x035fe973, 0x0135d409, 0x03255d0a, 0x0006294b}}}, + {X: Field{[10]uint32{0x02e43b2b, 0x00700124, 0x026300e8, 0x01e5e479, 0x02489876, 0x02c3f332, 0x02327fe3, 0x02036e83, 0x03a28c1c, 0x002f6071}}, Y: Field{[10]uint32{0x003871c0, 0x0388d1e0, 0x00678db1, 0x02b3a4ea, 0x02416064, 0x03c6154d, 0x00831f07, 0x02f19278, 0x004ea14b, 0x0032942a}}}, + {X: Field{[10]uint32{0x004bc29a, 0x01aa6d3f, 0x0154a062, 0x0139bce9, 0x01b875eb, 0x000e9b83, 0x01385cd6, 0x00e43f34, 0x021ad3c1, 0x0026f10f}}, Y: Field{[10]uint32{0x00cb2cd4, 0x00b9a9b8, 0x0222e6b1, 0x02f763d2, 0x0264ea39, 0x01e5c5ec, 0x00d8b34b, 0x012ed5eb, 0x00bf9aa5, 0x00215e96}}}, + {X: Field{[10]uint32{0x03e40f33, 0x01da7329, 0x039082c8, 0x01c7195b, 0x015e5bfb, 0x0262fea8, 0x030117cb, 0x038f1e7b, 0x028d194d, 0x000c1569}}, Y: Field{[10]uint32{0x000d1d10, 0x008cf90d, 0x0086c1c9, 0x01ca9ff8, 0x00acbd8c, 0x01aae9af, 0x00218cfb, 0x038712fc, 0x01eadfeb, 0x000060fe}}}, + {X: Field{[10]uint32{0x034b08ac, 0x01e7eedc, 0x03e1b710, 0x00c5f62e, 0x002cec12, 0x00d60ee0, 0x02710724, 0x03462324, 0x0184ad1f, 0x0012b6fe}}, Y: Field{[10]uint32{0x03ec04e6, 0x013578f5, 0x01954709, 0x02dbde7d, 0x032192ce, 0x038fcb42, 0x01507668, 0x033bfcf6, 0x01889560, 0x0005149c}}}, + {X: Field{[10]uint32{0x016487cc, 0x01947469, 0x00b0cd00, 0x00daa81d, 0x0283fc6a, 0x033c5b48, 0x03ae3979, 0x0107671e, 0x01cc27e0, 0x000e3dcb}}, Y: Field{[10]uint32{0x033dc0bf, 0x01830ea4, 0x0188df71, 0x0110b946, 0x02496104, 0x002dbff1, 0x030d6f2c, 0x001b904d, 0x017c33a1, 0x00148e32}}}, + {X: Field{[10]uint32{0x015be2d3, 0x00623199, 0x03813322, 0x011d1f09, 0x02045606, 0x03167fca, 0x0013828a, 0x03f78285, 0x018a7bdf, 0x0037956f}}, Y: Field{[10]uint32{0x0042d9da, 0x034eed40, 0x0151ce65, 0x0146e65b, 0x0367bf9d, 0x01ec2bed, 0x039d0979, 0x0097cdd7, 0x01b0df5b, 0x0011de18}}}, + {X: Field{[10]uint32{0x023bcc66, 0x026e2797, 0x03893873, 0x03a9b159, 0x02e19340, 0x019bfa44, 0x00edf986, 0x000ae246, 0x00fdc47e, 0x003185ef}}, Y: Field{[10]uint32{0x01117072, 0x0098d259, 0x00d473b8, 0x01cad6c2, 0x01a6e046, 0x01133f12, 0x020f4e86, 0x01da0cab, 0x0117357e, 0x002e42e8}}}, + {X: Field{[10]uint32{0x01c84758, 0x02aceefc, 0x036724ad, 0x036fb2b6, 0x03c455f4, 0x024acc0c, 0x02402f1e, 0x0223252d, 0x01961b51, 0x00119570}}, Y: Field{[10]uint32{0x02fbc4a0, 0x0071b779, 0x01b5cf2c, 0x0300a0e2, 0x02714600, 0x012f017a, 0x0202df4f, 0x017d37ec, 0x0093a257, 0x000f3bb3}}}, + {X: Field{[10]uint32{0x03726a45, 0x021ba375, 0x004c9e5f, 0x00c67077, 0x00110df4, 0x02ad0f68, 0x013c503f, 0x0396b4da, 0x0340dc05, 0x003f2a43}}, Y: Field{[10]uint32{0x035771ca, 0x0321bf17, 0x021c3e6c, 0x03b1a323, 0x027478ed, 0x0269c29b, 0x0337aeb1, 0x0198106b, 0x039bbe3e, 0x003d608b}}}, + {X: Field{[10]uint32{0x027f61e9, 0x03c546f4, 0x00afb93f, 0x0015e31f, 0x02a31cbe, 0x02434ecf, 0x01e88d7f, 0x020961de, 0x004adcb2, 0x000c5db3}}, Y: Field{[10]uint32{0x02cc0135, 0x00308c50, 0x006aac34, 0x01115b34, 0x036a18ce, 0x03ed6ad6, 0x00fe7bba, 0x00290f25, 0x02cc148a, 0x000e18fc}}}, + {X: Field{[10]uint32{0x03b2ddc4, 0x0079943a, 0x014e0b81, 0x02734c69, 0x0151d9c1, 0x013e0b31, 0x030db151, 0x00842b41, 0x0373d124, 0x0018c9a7}}, Y: Field{[10]uint32{0x005cd0ac, 0x003c36f6, 0x02188e30, 0x02f0fdaa, 0x03038246, 0x002230e1, 0x034114e5, 0x01e90929, 0x03dd8a78, 0x002fe3b1}}}, + {X: Field{[10]uint32{0x032003d0, 0x00f39518, 0x02708dee, 0x0124d374, 0x000f07e7, 0x0104c9aa, 0x027f5445, 0x014ed86b, 0x01328d0f, 0x0019e687}}, Y: Field{[10]uint32{0x025c350f, 0x0240629c, 0x0085c034, 0x0157268d, 0x02c9b3eb, 0x03dbba69, 0x03e341d5, 0x03b28c46, 0x03488f21, 0x0020f284}}}, + {X: Field{[10]uint32{0x00b38b28, 0x033ce678, 0x036fb846, 0x0277a009, 0x03f7172f, 0x0153624c, 0x0148568a, 0x00b2134e, 0x01792998, 0x001a689f}}, Y: Field{[10]uint32{0x03b26168, 0x0058f90e, 0x034f3a02, 0x03d6b0b6, 0x0369c8b7, 0x00bce6f5, 0x00b16a12, 0x002ee15d, 0x0207cb0f, 0x003d0474}}}, + {X: Field{[10]uint32{0x0373ee4d, 0x015b23d9, 0x03c7f9dd, 0x02e72bfa, 0x02abfdab, 0x000a73bc, 0x03f21716, 0x01410b2f, 0x005701af, 0x000a6354}}, Y: Field{[10]uint32{0x0297e9e1, 0x00f0156a, 0x0222075e, 0x029e733e, 0x034271bd, 0x03db70db, 0x02e62c4b, 0x02113904, 0x0271d271, 0x003d0d0f}}}, + {X: Field{[10]uint32{0x000c4653, 0x022e5e48, 0x023b1f8f, 0x0391513d, 0x00e26f66, 0x02f3ce4c, 0x00eb9845, 0x03c4063e, 0x03da46d1, 0x000fca60}}, Y: Field{[10]uint32{0x01d71db0, 0x03166542, 0x01b53b26, 0x02f1e760, 0x009b2c38, 0x00c9b4e0, 0x02d57e6b, 0x00cec40d, 0x0114c4ad, 0x00125cea}}}, + {X: Field{[10]uint32{0x023538dd, 0x02aa2fdf, 0x03b1359f, 0x0287bda8, 0x0154412e, 0x0074a9be, 0x02d64b2a, 0x02e23650, 0x013e30ce, 0x003e0dbf}}, Y: Field{[10]uint32{0x037f9367, 0x0380a0b3, 0x02ba3b28, 0x038c1b9a, 0x00c8161e, 0x0162ddc8, 0x01fd29c1, 0x01ad69c2, 0x00815347, 0x001c828c}}}, + {X: Field{[10]uint32{0x00ef583a, 0x038b7c80, 0x03930b3a, 0x008807bb, 0x01295ed5, 0x03a647fa, 0x03c8ee4f, 0x00e2898e, 0x039b911e, 0x00375cba}}, Y: Field{[10]uint32{0x00c1b2ef, 0x02d03250, 0x00b8683c, 0x02c50fc4, 0x02398e86, 0x0182d4ec, 0x0285d9b3, 0x03dfe5e4, 0x01a5688b, 0x000a8369}}}, + {X: Field{[10]uint32{0x0168a619, 0x00fc0cd2, 0x019be028, 0x02912584, 0x037cef92, 0x00962dfc, 0x027bd818, 0x00957310, 0x025046ab, 0x00154789}}, Y: Field{[10]uint32{0x03bc4f30, 0x01e8dc39, 0x0223b200, 0x02a8f1ba, 0x02e5ca16, 0x00560a9b, 0x006a5ecd, 0x03cd6e6e, 0x03d24cd8, 0x000c5f0c}}}, + {X: Field{[10]uint32{0x0336c650, 0x00eb5e14, 0x02a90fbd, 0x01857214, 0x01ab28cb, 0x01e09564, 0x0319a304, 0x038f43b2, 0x0292131d, 0x0019a0f7}}, Y: Field{[10]uint32{0x002225f8, 0x01b4224a, 0x019e4d63, 0x03082397, 0x00b3c3b2, 0x011be839, 0x029556ec, 0x01548fe2, 0x018e7fd9, 0x00127ba9}}}, + {X: Field{[10]uint32{0x00f97805, 0x0127224f, 0x03ac7bea, 0x00f4c692, 0x01ca99ef, 0x023e257a, 0x029b146e, 0x03a99782, 0x01e284a6, 0x002d6cec}}, Y: Field{[10]uint32{0x01b6fe0d, 0x013ba239, 0x01667ffa, 0x030d51fa, 0x023cf16c, 0x0065402f, 0x0391437e, 0x038a5bca, 0x0294f333, 0x00285c82}}}, + {X: Field{[10]uint32{0x03cbf466, 0x009007e6, 0x00d1011a, 0x00e954d4, 0x03ccdde4, 0x01c63518, 0x009a2329, 0x01da125c, 0x03737c33, 0x00294065}}, Y: Field{[10]uint32{0x01d429e2, 0x03eb61ea, 0x0027e12e, 0x0233efcf, 0x03c51fff, 0x01add47a, 0x03a5e09b, 0x031777a3, 0x029effef, 0x00027301}}}, + {X: Field{[10]uint32{0x001588fb, 0x00dad8fb, 0x03849e12, 0x0092238b, 0x02e5cb72, 0x02c7162c, 0x0041b663, 0x0361850a, 0x018feb2b, 0x0027b0d2}}, Y: Field{[10]uint32{0x001f5f12, 0x00194bc3, 0x0333ba00, 0x0216a01c, 0x01e517e5, 0x005437fb, 0x02719bf2, 0x025fc0d8, 0x01a5e14b, 0x00380324}}}, + {X: Field{[10]uint32{0x03c5b6b2, 0x00c6afbc, 0x004b1f47, 0x02f16abc, 0x03581f97, 0x02e49999, 0x00b446ba, 0x00c615d4, 0x00b4adc1, 0x003842db}}, Y: Field{[10]uint32{0x01e2b9c3, 0x017f720d, 0x00ed3c1f, 0x010bc998, 0x01d5520b, 0x02d97007, 0x0287bba5, 0x0011dfce, 0x02137db2, 0x0014e944}}}, + {X: Field{[10]uint32{0x013ae314, 0x01873877, 0x00d0d3ff, 0x009c4ec6, 0x0360ace9, 0x000ad810, 0x0093691e, 0x029f1e63, 0x0167e36e, 0x002dd52a}}, Y: Field{[10]uint32{0x0073d849, 0x02e0a855, 0x0359be12, 0x00a64cf3, 0x00d83ee0, 0x02ac0794, 0x02f8d5fb, 0x03b96690, 0x01639aa7, 0x0022a68e}}}, + {X: Field{[10]uint32{0x02efa869, 0x0060ffcc, 0x02c8d489, 0x01d58d02, 0x017999a2, 0x02fa95a7, 0x038a51e6, 0x02fcf81b, 0x0361c10c, 0x0017fbf2}}, Y: Field{[10]uint32{0x02881e83, 0x02f86fd3, 0x0120715b, 0x01426cd2, 0x01dfe499, 0x02308150, 0x008c0932, 0x020d7076, 0x0093cbc4, 0x003606cc}}}, + {X: Field{[10]uint32{0x03d2d848, 0x02910bc9, 0x0118470a, 0x002aca6e, 0x01f0ed6f, 0x009f2265, 0x0009400b, 0x025f8658, 0x03bb04ac, 0x003f9468}}, Y: Field{[10]uint32{0x01116a58, 0x03f55a32, 0x00bd6ec5, 0x013c020f, 0x03d30625, 0x027c2c60, 0x02b8aaf5, 0x0279103c, 0x00e0a4c3, 0x00215a3f}}}, + {X: Field{[10]uint32{0x02b7dee3, 0x024519be, 0x0158d7b5, 0x0263911d, 0x00391df7, 0x03aca908, 0x00d5d38a, 0x03fb6f16, 0x02299fcc, 0x001a8f91}}, Y: Field{[10]uint32{0x02a5e548, 0x00fba6c8, 0x01a91aec, 0x02e78c58, 0x0289873e, 0x02ac7679, 0x02e7b5a3, 0x01767750, 0x03ba7bb1, 0x0006fb63}}}, + {X: Field{[10]uint32{0x03450c37, 0x01fff225, 0x012ee745, 0x0134e492, 0x0233db30, 0x0385af4c, 0x0162d970, 0x03537bdf, 0x00b83c40, 0x002b7f6f}}, Y: Field{[10]uint32{0x00138e0e, 0x0216e1fd, 0x001956be, 0x0064b873, 0x038fde78, 0x0055ab08, 0x00b588c4, 0x0127b0aa, 0x03dc1635, 0x001ec20a}}}, + {X: Field{[10]uint32{0x0113bf61, 0x030f7540, 0x02cb9f06, 0x0371bb31, 0x01509ed7, 0x00b45c04, 0x0254c270, 0x00b1520d, 0x03cc9c20, 0x0025a143}}, Y: Field{[10]uint32{0x0281aaf7, 0x022e2c34, 0x03b6c008, 0x01568070, 0x01b9fcc4, 0x01fb062d, 0x00c05dac, 0x01b126bc, 0x00327f96, 0x00041011}}}, + {X: Field{[10]uint32{0x00458bbe, 0x01026d57, 0x03ac4f09, 0x005059bc, 0x031703f5, 0x0010de69, 0x00151ca8, 0x03285362, 0x01978f78, 0x000ab884}}, Y: Field{[10]uint32{0x01ecf7b1, 0x03277106, 0x012c86cb, 0x009fe80c, 0x022328e3, 0x021e5873, 0x01c7dde3, 0x00d7f514, 0x00d95760, 0x001379d3}}}, + {X: Field{[10]uint32{0x02987e57, 0x03ab1846, 0x006cfb79, 0x038f149d, 0x027e5816, 0x0358b109, 0x021a332c, 0x03265899, 0x0342e1b5, 0x003b7061}}, Y: Field{[10]uint32{0x01b4fe5e, 0x00868d01, 0x01bc02c0, 0x00c8c0c4, 0x0129ba90, 0x02eaf95e, 0x01d484fe, 0x0026fcfe, 0x033fc633, 0x0020000e}}}, + {X: Field{[10]uint32{0x0243a244, 0x0299033f, 0x025aa1d6, 0x012610dd, 0x0038b35d, 0x022e50da, 0x0290885c, 0x03c2b8a6, 0x022a5fa0, 0x001e00aa}}, Y: Field{[10]uint32{0x0192a803, 0x03dc59e4, 0x025dd7f5, 0x004616ea, 0x037e3dda, 0x005b126e, 0x03297e04, 0x00e6a101, 0x029fe632, 0x00031fcc}}}, + {X: Field{[10]uint32{0x012335cf, 0x01efdfe6, 0x02386bf6, 0x03a0d79c, 0x02c2173d, 0x038ff16a, 0x02ede712, 0x011d6b0d, 0x0179b124, 0x003eddd1}}, Y: Field{[10]uint32{0x03a82c94, 0x032f3011, 0x02c01cdf, 0x029add8e, 0x01b6f413, 0x006a3590, 0x03ebf0e3, 0x01edeb90, 0x035163c1, 0x0030399a}}}, + {X: Field{[10]uint32{0x00bc2852, 0x03886cff, 0x02982051, 0x00928c6d, 0x00695a9c, 0x03a70480, 0x0394881f, 0x02ba78cb, 0x018a43ab, 0x0036068f}}, Y: Field{[10]uint32{0x0112673f, 0x03dafcb7, 0x00dbf2cc, 0x028f2419, 0x01a693e3, 0x002a636d, 0x0351de7e, 0x032db5ef, 0x0011e8a8, 0x0018c376}}}, + {X: Field{[10]uint32{0x03324cf0, 0x01ddadf1, 0x0249f9bf, 0x02812f94, 0x027cb2ed, 0x0089a336, 0x00da0c7e, 0x001a2e01, 0x03d497cf, 0x001467f3}}, Y: Field{[10]uint32{0x0162fdb9, 0x039bff25, 0x0391dc20, 0x03b0ef28, 0x03a357c8, 0x03912ae7, 0x02916466, 0x02cfaef9, 0x00cd198a, 0x002fb1bd}}}, + {X: Field{[10]uint32{0x028ef592, 0x024a5be1, 0x0044124f, 0x021389dc, 0x023e31b2, 0x003e6c70, 0x0193853e, 0x0181cd78, 0x03e48fd6, 0x003312b4}}, Y: Field{[10]uint32{0x0383c27b, 0x0098eb75, 0x02f68996, 0x007b6c96, 0x019b1215, 0x01ec0f1d, 0x01520ac6, 0x0311d1f5, 0x018d8583, 0x00222bc5}}}, + {X: Field{[10]uint32{0x00d24117, 0x00240d1e, 0x01e338f7, 0x02852e17, 0x02c06a57, 0x0137b5ba, 0x0340cf96, 0x021a9662, 0x00ae6f51, 0x002b7654}}, Y: Field{[10]uint32{0x03affa7d, 0x01effd28, 0x0165bc04, 0x03f1c013, 0x00111f6d, 0x002fb1d1, 0x03d6853a, 0x00a1737a, 0x00bd2d69, 0x00316729}}}, + {X: Field{[10]uint32{0x02b383e4, 0x030fdb6e, 0x027ddd0b, 0x0319f124, 0x03ef0437, 0x032cd62b, 0x03c81730, 0x01f79c4a, 0x03454309, 0x003701c6}}, Y: Field{[10]uint32{0x015ca8ed, 0x0042d03a, 0x0385f9e4, 0x0283ec46, 0x03f28fca, 0x0061f7ef, 0x03b2adfc, 0x00c1305c, 0x02a9899b, 0x001e4e44}}}, + {X: Field{[10]uint32{0x02c167c7, 0x01e6c6ab, 0x03abe94d, 0x01c91fda, 0x02fd97a6, 0x025ade9c, 0x0037da4a, 0x002676a7, 0x037e6db6, 0x0017738c}}, Y: Field{[10]uint32{0x024377f6, 0x0276f593, 0x021d5754, 0x015993ac, 0x00eb35bf, 0x005ae8a8, 0x0082991f, 0x02290ed9, 0x03ba1f09, 0x0006e21f}}}, + {X: Field{[10]uint32{0x01f5cfcb, 0x02133e78, 0x009e5ba2, 0x03d0f984, 0x02900a83, 0x03a02260, 0x022ead80, 0x029989b4, 0x02ad8493, 0x00145bad}}, Y: Field{[10]uint32{0x00e05042, 0x00c3fbfb, 0x03e3c68d, 0x0046ecdb, 0x03ef6a85, 0x0074fe51, 0x018308c6, 0x02d1bd23, 0x02b38085, 0x00328d42}}}, + {X: Field{[10]uint32{0x000e5e75, 0x03c71f3c, 0x020a335a, 0x02e02321, 0x03732b3f, 0x03a45f21, 0x03912114, 0x00b68796, 0x01503b1f, 0x003dd9f0}}, Y: Field{[10]uint32{0x01aaab54, 0x02d1cf68, 0x0165795b, 0x003854f3, 0x0109ec61, 0x015776ad, 0x00f64a26, 0x0119ee22, 0x00c8cdbe, 0x000fb3be}}}, + {X: Field{[10]uint32{0x03c977f0, 0x00eb099c, 0x01e7531f, 0x00b0b319, 0x02418558, 0x005df79e, 0x03bc5d8f, 0x00b2329e, 0x03cf0f79, 0x003e6efa}}, Y: Field{[10]uint32{0x01614a85, 0x026595d2, 0x02f52b8c, 0x02aab3b2, 0x03ac751e, 0x02867957, 0x02f767b8, 0x00e89895, 0x00fefecb, 0x000a42ad}}}, + {X: Field{[10]uint32{0x0147c45f, 0x01dff3d3, 0x00e8eaf4, 0x02f326c2, 0x016ec3ad, 0x0048f7d8, 0x01bff42c, 0x0236c7d5, 0x01febe5c, 0x0031aff8}}, Y: Field{[10]uint32{0x0241792f, 0x02b55b35, 0x02995c79, 0x0004d1fa, 0x0041c271, 0x0159e624, 0x032eddc9, 0x028bff60, 0x0082d6d6, 0x0031657e}}}, + {X: Field{[10]uint32{0x00d3ce1e, 0x020a7978, 0x02425761, 0x00862e1c, 0x03c55595, 0x005c2ed1, 0x01cfe6e5, 0x02d321c7, 0x0371808f, 0x0015b0b5}}, Y: Field{[10]uint32{0x000468ba, 0x003f27d5, 0x0229f5ee, 0x02bdc58d, 0x0112ec15, 0x039c8718, 0x00a91889, 0x03989bf7, 0x02e69e03, 0x001b79ca}}}, + {X: Field{[10]uint32{0x0109d663, 0x028d99d4, 0x00fb5066, 0x03fbf181, 0x02da9ecf, 0x03033df4, 0x0296d8c3, 0x016f961e, 0x0305ec9f, 0x00080862}}, Y: Field{[10]uint32{0x038f6993, 0x00a0eefb, 0x02e12e79, 0x00ea22d0, 0x02b41bfa, 0x029cc86b, 0x02ea0aa7, 0x01f8907c, 0x03c2c535, 0x000bb069}}}, + {X: Field{[10]uint32{0x036be4ee, 0x03f2bfe5, 0x00f09e2a, 0x03d2ece9, 0x03519035, 0x01252bfc, 0x03db4f33, 0x0333656f, 0x02690a04, 0x000e8224}}, Y: Field{[10]uint32{0x0042d1a2, 0x006b615a, 0x02757ed9, 0x00899036, 0x020bbeba, 0x00d012cc, 0x0293757b, 0x0287fa45, 0x0225fb0b, 0x00395a03}}}, + {X: Field{[10]uint32{0x005b3f07, 0x01948ebd, 0x01a2e285, 0x0006ca5d, 0x02dfd3e1, 0x02618125, 0x00fd0f25, 0x022d4f6c, 0x0296a0cd, 0x0023e7c8}}, Y: Field{[10]uint32{0x01c625b5, 0x02d5c8ad, 0x01920a3f, 0x00295de1, 0x038ab3be, 0x018a435d, 0x029015cd, 0x037cc6c8, 0x01072cac, 0x00187056}}}, + {X: Field{[10]uint32{0x0288070e, 0x03d1d33f, 0x0106c836, 0x024347a8, 0x00097e2b, 0x0352d8ca, 0x01599b26, 0x036a5f34, 0x03e8695b, 0x00219602}}, Y: Field{[10]uint32{0x017d7d21, 0x03146aec, 0x00ac6166, 0x02a276e9, 0x022bb220, 0x001f71fb, 0x022fe5fd, 0x02b160e2, 0x00a17e19, 0x002aeb9a}}}, + {X: Field{[10]uint32{0x02b4d762, 0x00b74a5c, 0x03d048c7, 0x0163ec61, 0x01eb1f94, 0x015ea879, 0x005b4f0e, 0x035627b3, 0x038a1e69, 0x003edab0}}, Y: Field{[10]uint32{0x02ac32c1, 0x0004c061, 0x000147fb, 0x01bc2e58, 0x03e5d180, 0x02e0ad72, 0x031d3af2, 0x01c7cc5b, 0x0116bec2, 0x00358077}}}, + {X: Field{[10]uint32{0x02a5f0b0, 0x02e36f9f, 0x027b4242, 0x00c6d9b8, 0x02c5bb7d, 0x00aec273, 0x03aec947, 0x03aa06fc, 0x006bc54f, 0x001f0418}}, Y: Field{[10]uint32{0x01f68f54, 0x035df6ef, 0x010abd14, 0x00a8f809, 0x0202ea52, 0x0102d116, 0x01839872, 0x01590dd9, 0x0180d3d6, 0x00048854}}}, + {X: Field{[10]uint32{0x0152a1a6, 0x00ac05cb, 0x02495204, 0x0398ee11, 0x02740a5b, 0x0367ce12, 0x007822b1, 0x024ef1d3, 0x03948335, 0x002179aa}}, Y: Field{[10]uint32{0x01fae93a, 0x0397af80, 0x030f981f, 0x033371d7, 0x02d6e69f, 0x0334a38f, 0x02512138, 0x03e1aa3d, 0x00d068d6, 0x003d7058}}}, + {X: Field{[10]uint32{0x0351cfe5, 0x0044eb7f, 0x00a27f02, 0x03b2e203, 0x005e626a, 0x0151c7d4, 0x0374ea0e, 0x006e8146, 0x013a99cd, 0x001f878b}}, Y: Field{[10]uint32{0x01ad89bc, 0x012c0267, 0x0299781f, 0x033b0018, 0x02c1eb96, 0x00dbc6b7, 0x02322291, 0x03f8de30, 0x002ee9d4, 0x00104fb2}}}, + {X: Field{[10]uint32{0x007aaacd, 0x03af407a, 0x02bd2928, 0x02b1ca70, 0x016a9490, 0x024c7187, 0x03a08dd6, 0x00d7cbb5, 0x00ad8137, 0x00162590}}, Y: Field{[10]uint32{0x00485429, 0x0009c648, 0x02e15c1a, 0x026f8d0f, 0x017a1e90, 0x025b1335, 0x039fc330, 0x03ed2cd9, 0x010b8a89, 0x002275ac}}}, + {X: Field{[10]uint32{0x026e6608, 0x02b41017, 0x00c5d7b7, 0x03511046, 0x0191fdd7, 0x01d07067, 0x00db0ef3, 0x0173a3f7, 0x034ff346, 0x001c2033}}, Y: Field{[10]uint32{0x022441fe, 0x02b627e3, 0x03d347df, 0x0274d050, 0x00303348, 0x02036c76, 0x006d334f, 0x002e82d7, 0x01a95cbc, 0x001e8fc3}}}, + {X: Field{[10]uint32{0x02917c55, 0x026a1d89, 0x0261c7d5, 0x000d954f, 0x01091deb, 0x01dcdf0c, 0x0196bd4d, 0x0009a4b7, 0x034c2d40, 0x002ed982}}, Y: Field{[10]uint32{0x00983c24, 0x028fd030, 0x002faf5e, 0x00446370, 0x03f150af, 0x017a2e1b, 0x00684031, 0x00125c18, 0x0113a756, 0x002d252b}}}, + {X: Field{[10]uint32{0x03221b27, 0x03141b67, 0x02e0c1e2, 0x02c23376, 0x013f4f4f, 0x03629719, 0x008161c5, 0x0056c910, 0x01ec7ebf, 0x001ce890}}, Y: Field{[10]uint32{0x0063640a, 0x02f05d75, 0x0332b5e1, 0x024a8bdb, 0x0364bbe1, 0x03520363, 0x00865041, 0x0295bde1, 0x03b433a0, 0x002014d2}}}, + {X: Field{[10]uint32{0x00b1fe07, 0x0056aa9e, 0x03a6f89a, 0x000b0f5e, 0x039e45f2, 0x028ad62f, 0x005741e6, 0x03f6f1dc, 0x0351f08b, 0x003f707b}}, Y: Field{[10]uint32{0x016c0586, 0x039683a6, 0x00e36880, 0x0051d57d, 0x001684f7, 0x0160c950, 0x03ac05b5, 0x0121e191, 0x00dcdc1e, 0x001fa740}}}, + {X: Field{[10]uint32{0x033618af, 0x01ccf4e8, 0x007bc6d6, 0x00ea449a, 0x03a15ab1, 0x02838cf7, 0x0344736e, 0x017304ea, 0x02cba0ce, 0x00081210}}, Y: Field{[10]uint32{0x016bd521, 0x03e4ab32, 0x03a35896, 0x03708516, 0x029e1804, 0x0062a53c, 0x01187418, 0x02472feb, 0x0205a6e9, 0x002bf248}}}, + {X: Field{[10]uint32{0x017ed768, 0x02f2d805, 0x0193e0b2, 0x02660eeb, 0x01a47c4a, 0x00121a1a, 0x00095675, 0x00c54604, 0x001ef82c, 0x00280ea7}}, Y: Field{[10]uint32{0x02090a65, 0x033c67fd, 0x0263ca26, 0x028b7361, 0x0302158b, 0x02690ee2, 0x033e5eed, 0x01a603bb, 0x0164fb9c, 0x001e1be4}}}, + {X: Field{[10]uint32{0x03c00ed2, 0x026c56f6, 0x025baee1, 0x010b1515, 0x01fa18bd, 0x036a04f3, 0x015e3ff7, 0x005e118d, 0x025f6cb4, 0x00178edb}}, Y: Field{[10]uint32{0x02ee603f, 0x0000db10, 0x02cfde34, 0x022b1722, 0x019d6f35, 0x0234f936, 0x03b8f9f8, 0x008a13f0, 0x015342bf, 0x002e70e9}}}, + {X: Field{[10]uint32{0x005dbc70, 0x010e1728, 0x0254b015, 0x01d840a6, 0x00abf764, 0x03ec9d1b, 0x03dfbd6e, 0x004a0198, 0x020e082d, 0x00066c25}}, Y: Field{[10]uint32{0x01504773, 0x01993d39, 0x02f312d2, 0x03b64845, 0x0133df5d, 0x00d74107, 0x03356451, 0x004aa517, 0x03bc4401, 0x003e2ca2}}}, + {X: Field{[10]uint32{0x03f3677e, 0x01d98e37, 0x00d05098, 0x0076dafa, 0x006f1c2d, 0x028688b3, 0x039b274b, 0x02ebf9d2, 0x01007597, 0x0004187a}}, Y: Field{[10]uint32{0x01444b21, 0x0171e048, 0x00fa9815, 0x03c533d3, 0x01fe2fff, 0x03894629, 0x017b59eb, 0x024bb113, 0x0122dec5, 0x001c1eb2}}}, + {X: Field{[10]uint32{0x03030b85, 0x01c73c7c, 0x01f5709a, 0x0078ec55, 0x01cc0e22, 0x02683940, 0x039b5676, 0x01f61d50, 0x001160fc, 0x00324613}}, Y: Field{[10]uint32{0x00327805, 0x00fa608a, 0x02e308c4, 0x02527ec7, 0x018e83e5, 0x017c8e26, 0x01d30f87, 0x01a27f5b, 0x01e37c04, 0x002202da}}}, + {X: Field{[10]uint32{0x0374cf04, 0x01567fd0, 0x02f12d37, 0x0190988a, 0x01c8fa23, 0x01b09ae9, 0x005af94e, 0x014b363f, 0x03044dec, 0x0028d7ec}}, Y: Field{[10]uint32{0x012242fd, 0x035d5704, 0x0284042d, 0x01c614c9, 0x038b3604, 0x00d08b73, 0x03adcb9a, 0x00d612b1, 0x0375692a, 0x0005513c}}}, + {X: Field{[10]uint32{0x010929ca, 0x0012f46e, 0x00a8c1b2, 0x0069e000, 0x021b2c50, 0x02c4c3da, 0x00efbe8e, 0x03afa046, 0x03ad60ff, 0x002ea300}}, Y: Field{[10]uint32{0x03aaafbe, 0x00da71b8, 0x03722f11, 0x011eb84d, 0x0365b88d, 0x03de002a, 0x03732112, 0x010783eb, 0x0329a3f3, 0x003a57bd}}}, + {X: Field{[10]uint32{0x0330ddb9, 0x0346d4a3, 0x03ba3361, 0x017d7992, 0x02fe0849, 0x01268042, 0x03ba189f, 0x0229de5f, 0x0355842d, 0x0034ae95}}, Y: Field{[10]uint32{0x03df7957, 0x00c2fe94, 0x03d477c0, 0x00b0e42d, 0x000549e7, 0x00e95758, 0x00bc5f0c, 0x005e7de1, 0x01b10cad, 0x00368d9a}}}, + {X: Field{[10]uint32{0x008703f2, 0x036e6b9b, 0x0194a086, 0x01e552b2, 0x00d3de15, 0x020332c9, 0x031d2b28, 0x0222c9de, 0x03587ec9, 0x000f813a}}, Y: Field{[10]uint32{0x0328dd9c, 0x0336d3f9, 0x0207bb98, 0x02273170, 0x00ff3c60, 0x037e5bef, 0x031d6503, 0x021767ba, 0x0113e6dc, 0x003e9048}}}, + {X: Field{[10]uint32{0x019fe7f6, 0x0368f09a, 0x01ca17a0, 0x008177e4, 0x0260c9f1, 0x007d19b5, 0x019aefa9, 0x029274f8, 0x03424339, 0x003bf96e}}, Y: Field{[10]uint32{0x005156e9, 0x00fa74c9, 0x0008ff9e, 0x0029f2d1, 0x01e3576b, 0x01f3e7f1, 0x0221db29, 0x01903f3a, 0x012ffb39, 0x00263188}}}, + {X: Field{[10]uint32{0x02a0908b, 0x0359a92e, 0x008a302b, 0x00b6605b, 0x03bca2dc, 0x031383a9, 0x03e65915, 0x00cdb7bb, 0x02e5a330, 0x0028a510}}, Y: Field{[10]uint32{0x02a135e6, 0x0109ea77, 0x023112db, 0x02251199, 0x02dc5e77, 0x029bee79, 0x0374c130, 0x0391f0ed, 0x00297320, 0x00286fe2}}}, + {X: Field{[10]uint32{0x008bb792, 0x022aa23c, 0x013714da, 0x03fe0063, 0x0148e877, 0x0324862c, 0x01f632d1, 0x0097daa4, 0x00ba6f72, 0x001152f3}}, Y: Field{[10]uint32{0x01ec713c, 0x02562dd1, 0x00e3e918, 0x00f681f8, 0x01815775, 0x000ba837, 0x021106b2, 0x00ac0582, 0x01312d53, 0x0036837b}}}, + {X: Field{[10]uint32{0x00c2dca9, 0x0160d337, 0x01fced42, 0x020ba503, 0x00565737, 0x00941501, 0x00631afa, 0x02559b2c, 0x014032c3, 0x0000c58e}}, Y: Field{[10]uint32{0x03cc5fc7, 0x016a36f3, 0x004dd844, 0x017e9555, 0x0267f089, 0x03d359a2, 0x037464c6, 0x02c34691, 0x01c41b15, 0x00063158}}}, + {X: Field{[10]uint32{0x01b07703, 0x03f22112, 0x00a92bc4, 0x00e8ef38, 0x01524089, 0x03f1c4cb, 0x015fcedf, 0x01efc83c, 0x035f53f0, 0x00152d4d}}, Y: Field{[10]uint32{0x01abdee7, 0x0058fb98, 0x026a7b3f, 0x031b59c8, 0x00f5df11, 0x028ba886, 0x02922bdf, 0x01094794, 0x033f0a94, 0x000c6f8a}}}, + {X: Field{[10]uint32{0x0058b3bd, 0x02dfb980, 0x003280d2, 0x03118e7a, 0x00de9033, 0x025368f3, 0x03b9b6a6, 0x03419caf, 0x031b0745, 0x000a0f38}}, Y: Field{[10]uint32{0x00c0245a, 0x00801136, 0x0338ff9d, 0x02a99eaa, 0x010dc1c7, 0x03a074b2, 0x01c24e76, 0x02ed5b8f, 0x00a4d452, 0x003daa52}}}, + {X: Field{[10]uint32{0x00e99967, 0x0059fc84, 0x033e3a60, 0x00c5892e, 0x0148d5f8, 0x0012515e, 0x012419cb, 0x029d51ec, 0x0353117b, 0x002d79d3}}, Y: Field{[10]uint32{0x018dd3e6, 0x0120a01c, 0x01b5e10d, 0x007d33f6, 0x003da833, 0x03ce0c02, 0x03c22e89, 0x03e6aaa0, 0x0354d635, 0x0017d8d5}}}, + {X: Field{[10]uint32{0x03f83080, 0x0159c4f2, 0x031340a8, 0x012c7349, 0x03d587c3, 0x0335476b, 0x00dc776f, 0x00c60c5c, 0x0332cfa3, 0x001a0797}}, Y: Field{[10]uint32{0x0279266a, 0x0106951c, 0x010e38f2, 0x03bfef8e, 0x0276f646, 0x01ff3cc2, 0x00361d9b, 0x039375ed, 0x00b8d144, 0x003161f6}}}, + {X: Field{[10]uint32{0x029f1d0c, 0x01697f40, 0x00621b92, 0x00857fe3, 0x012f28b2, 0x00177d5b, 0x021ec17d, 0x00a27c94, 0x02b7722f, 0x0007ee97}}, Y: Field{[10]uint32{0x0311f5ba, 0x0372fa7a, 0x037d1524, 0x018d6cae, 0x0234283b, 0x032b2d9a, 0x03f287ef, 0x03f537e9, 0x00d997ec, 0x0037c450}}}, + {X: Field{[10]uint32{0x020d0a77, 0x004c029a, 0x00f2031e, 0x01933095, 0x0217855b, 0x00cfc6f3, 0x038fc5a7, 0x022cf3b4, 0x00b0df37, 0x000e2ffd}}, Y: Field{[10]uint32{0x0206b1be, 0x03728719, 0x03dc2520, 0x01979cef, 0x01f35a50, 0x0094dd1d, 0x00485ee3, 0x00a5b993, 0x025df634, 0x001b53c1}}}, + {X: Field{[10]uint32{0x017de831, 0x023dd3b9, 0x015ed6e0, 0x0281df32, 0x03779df8, 0x01ed5e63, 0x00050d52, 0x00992ef9, 0x03c359a9, 0x001c1c04}}, Y: Field{[10]uint32{0x014ea422, 0x032455c0, 0x00c3fda9, 0x029d8cb9, 0x02582313, 0x00f3662b, 0x03b8dcc5, 0x021b0195, 0x01a03153, 0x002e7cde}}}, + {X: Field{[10]uint32{0x01642ef5, 0x028fd8d1, 0x0135a73d, 0x02467799, 0x03fc5b8c, 0x0082416a, 0x010abbb3, 0x00921392, 0x012f7028, 0x002b653b}}, Y: Field{[10]uint32{0x02c88457, 0x01c0b0aa, 0x02bd6cb8, 0x01cdb409, 0x020fdf49, 0x01951485, 0x00011fec, 0x0387cfa6, 0x0013a554, 0x00276fa2}}}, + {X: Field{[10]uint32{0x0362612e, 0x0115613f, 0x001f54f5, 0x021d62e2, 0x00fd174f, 0x0110de17, 0x01ad1552, 0x021da926, 0x01e4e991, 0x0011ed5b}}, Y: Field{[10]uint32{0x00efdced, 0x0356695f, 0x012d986b, 0x03483524, 0x03383d92, 0x03dd4ddd, 0x016117a5, 0x02faddf1, 0x01375855, 0x00028501}}}, + {X: Field{[10]uint32{0x01f431e8, 0x03ded205, 0x036af03c, 0x013433cc, 0x03f31f62, 0x0047ca04, 0x024643af, 0x029a4c7c, 0x024e9291, 0x00146f39}}, Y: Field{[10]uint32{0x0107e552, 0x00eaaebb, 0x02e13a06, 0x01a435d6, 0x03f40c4c, 0x00480e53, 0x0235d284, 0x00891c3b, 0x03d9a301, 0x00023dd0}}}, + {X: Field{[10]uint32{0x03f7a43f, 0x02e550b9, 0x03447a0c, 0x03b80ef1, 0x0083b80b, 0x026d3af8, 0x018e56b4, 0x01683f3a, 0x00feb52c, 0x001d8a1f}}, Y: Field{[10]uint32{0x02a7a7bc, 0x00cfadb8, 0x007ff13e, 0x026f7161, 0x03e9e339, 0x003662c1, 0x01d064a5, 0x0112ef4e, 0x0256fa57, 0x001cdadf}}}, + {X: Field{[10]uint32{0x036b8f5e, 0x02b37037, 0x0155b181, 0x0333c713, 0x028dc29b, 0x006dddc6, 0x011aaa2c, 0x000430c6, 0x039ead01, 0x0018535c}}, Y: Field{[10]uint32{0x002f8085, 0x036d9b43, 0x031664f4, 0x036eabc1, 0x025591ef, 0x00001193, 0x0296c2c5, 0x01eddb22, 0x028fe860, 0x00173353}}}, + {X: Field{[10]uint32{0x024e1bc9, 0x00b4ce97, 0x0380803e, 0x02262598, 0x0035cd58, 0x00354fb4, 0x039404d9, 0x00d7cacc, 0x00c8ee8c, 0x0030e111}}, Y: Field{[10]uint32{0x00cd29f2, 0x02febd9b, 0x03f441f4, 0x02685ae4, 0x031d2ffc, 0x021fea6a, 0x02221092, 0x014baf70, 0x00cdde54, 0x0022d102}}}, + {X: Field{[10]uint32{0x01c8f349, 0x0077dea6, 0x02539239, 0x025cb6ed, 0x0256a1c1, 0x014aff79, 0x019bf028, 0x01bcd760, 0x0249c601, 0x0022a725}}, Y: Field{[10]uint32{0x0369a8ed, 0x03a5d2b5, 0x001afdc6, 0x0168ce46, 0x031797aa, 0x0132d402, 0x00a6030a, 0x0067e9b1, 0x0157be2c, 0x002cb736}}}, + {X: Field{[10]uint32{0x02a04b03, 0x02ccc46f, 0x026bced6, 0x02d0745d, 0x0196292a, 0x0334a35d, 0x010ea0a6, 0x025c2497, 0x011be444, 0x00283d73}}, Y: Field{[10]uint32{0x027ff95b, 0x03e56524, 0x034b868a, 0x00681c73, 0x00c8d793, 0x03912738, 0x0045d923, 0x00a6c338, 0x01e9291b, 0x00349c2c}}}, + {X: Field{[10]uint32{0x033a9614, 0x03530447, 0x03a64709, 0x0372a550, 0x0025c64d, 0x00a38964, 0x03bdbaf0, 0x01661deb, 0x03368767, 0x0029e3c8}}, Y: Field{[10]uint32{0x02a6de83, 0x007c108c, 0x01e7ee24, 0x02690e7d, 0x01de34aa, 0x007d4346, 0x0245b3ab, 0x0116fb94, 0x02c9a5d2, 0x0004d97e}}}, + {X: Field{[10]uint32{0x03391769, 0x03f0f902, 0x03b514a9, 0x00c27b8f, 0x03af6cae, 0x0104e91a, 0x03aa6f5a, 0x00b16e4a, 0x03e3ae48, 0x000eff4d}}, Y: Field{[10]uint32{0x016d1c59, 0x01553c0e, 0x03d66bdc, 0x0019371f, 0x03d0219c, 0x01de3273, 0x02424a07, 0x02c3719b, 0x001834bb, 0x000b64c2}}}, + {X: Field{[10]uint32{0x013881a2, 0x00735c74, 0x00e5d1b4, 0x00f580bb, 0x02d426f2, 0x039e5b4a, 0x036ea757, 0x00748f9d, 0x009a0026, 0x0024b2b1}}, Y: Field{[10]uint32{0x031521c1, 0x02124b95, 0x035dac0d, 0x032061e8, 0x00c7a43a, 0x02303176, 0x023e587a, 0x00df2266, 0x00138e0f, 0x00231dbb}}}, + {X: Field{[10]uint32{0x0356842a, 0x01008502, 0x01d6b829, 0x0379ea5b, 0x03718944, 0x0124d59e, 0x03708941, 0x03719f30, 0x01e00ea7, 0x00033dbb}}, Y: Field{[10]uint32{0x00627cb7, 0x03a343d5, 0x0042ca76, 0x0343d646, 0x020fa070, 0x00f72314, 0x016128a5, 0x01822deb, 0x03d4e939, 0x0038adc5}}}, + {X: Field{[10]uint32{0x0291e17a, 0x006fe0be, 0x0035e3dd, 0x00b44781, 0x00968c8c, 0x02c1b886, 0x02cb92bb, 0x00a5149b, 0x0198ba51, 0x00188132}}, Y: Field{[10]uint32{0x00cd0ea4, 0x0362b765, 0x03939d12, 0x031e6981, 0x03d1ed18, 0x002bca8f, 0x03ae21ef, 0x01972723, 0x015fe783, 0x0005a428}}}, + {X: Field{[10]uint32{0x00c0aa5d, 0x006bff79, 0x03f12ef7, 0x001fc88d, 0x02d8ce07, 0x01ab0b85, 0x0268d13a, 0x000384d4, 0x0348cc55, 0x0028b13e}}, Y: Field{[10]uint32{0x000cd839, 0x03cb5c0f, 0x039509e5, 0x01ea3566, 0x03c403f5, 0x016048ea, 0x03e3906c, 0x03225f2d, 0x000ee608, 0x000e0251}}}, + {X: Field{[10]uint32{0x03656f60, 0x01e1cf7a, 0x024f2b66, 0x03135cc8, 0x016acc8e, 0x00ecb8c2, 0x01a36a6d, 0x00f92f17, 0x03a1cc30, 0x00362bdf}}, Y: Field{[10]uint32{0x00c6de0d, 0x0333fffc, 0x02e5ddd4, 0x006e7b7a, 0x015e14d8, 0x00116c4d, 0x03b39f97, 0x00cf1437, 0x02bd5a55, 0x0027f1fc}}}, + {X: Field{[10]uint32{0x02dea0e7, 0x035dd75d, 0x0390a864, 0x00fb476b, 0x01377073, 0x0014c12f, 0x00e6bbdb, 0x00a46981, 0x00adb873, 0x000fa680}}, Y: Field{[10]uint32{0x0101ded0, 0x023bad02, 0x0063051f, 0x026cc86d, 0x0320a5cb, 0x0066a35d, 0x0124e37f, 0x0313bd4d, 0x0057f6d1, 0x0037ad25}}}, + {X: Field{[10]uint32{0x03dc3d7f, 0x03943974, 0x0136809d, 0x0357a862, 0x01760ca8, 0x0306cab2, 0x014346aa, 0x01883261, 0x02e930aa, 0x0002fbd6}}, Y: Field{[10]uint32{0x00dfc48f, 0x037eb592, 0x03034c0f, 0x028ff8dc, 0x0105da98, 0x03501079, 0x0212b9c7, 0x017d66c0, 0x0042f792, 0x00083603}}}, + {X: Field{[10]uint32{0x0155f67f, 0x00ad2424, 0x0035d592, 0x011e2229, 0x0238215e, 0x03ce5916, 0x01743088, 0x03541db0, 0x01fbcd28, 0x0033505a}}, Y: Field{[10]uint32{0x01e74674, 0x030bc98d, 0x025b929d, 0x03192d6a, 0x00a170da, 0x015b06da, 0x025f2743, 0x01937569, 0x00a21a55, 0x003e798b}}}, + {X: Field{[10]uint32{0x015a4c28, 0x02d810bb, 0x0121d538, 0x004533ce, 0x014bd37b, 0x025f5db3, 0x01a25047, 0x009893f7, 0x01ed34cd, 0x00292da4}}, Y: Field{[10]uint32{0x026af55d, 0x01b08174, 0x02d12c33, 0x01ddcb1c, 0x025c045a, 0x00f8ce5f, 0x030ca545, 0x02d30456, 0x00b16781, 0x003194dd}}}, + {X: Field{[10]uint32{0x00aa4818, 0x01576f62, 0x0047dc9e, 0x0056fe7a, 0x03c2b3a6, 0x02a14303, 0x03cf68fa, 0x02de2065, 0x016a4226, 0x001793a4}}, Y: Field{[10]uint32{0x0398951e, 0x02128c6d, 0x032808d9, 0x0014fac9, 0x03f3395d, 0x0193d2cb, 0x01991f44, 0x014b9972, 0x02a25c7c, 0x000fcf0f}}}, + {X: Field{[10]uint32{0x03a74a7c, 0x011d357a, 0x0105ca5f, 0x02e88653, 0x01f743e6, 0x00293180, 0x011b3ad5, 0x027dcb25, 0x02cff4d6, 0x003751e0}}, Y: Field{[10]uint32{0x00977b99, 0x0304b208, 0x0281d6c7, 0x0247536c, 0x0205d3a7, 0x018a3630, 0x03dd6ae8, 0x03bdf178, 0x035e9854, 0x0025e9ee}}}, + {X: Field{[10]uint32{0x01adce36, 0x02026470, 0x02f0bcc0, 0x01044f92, 0x00281aff, 0x019a701f, 0x03945432, 0x0017b376, 0x02d54ab4, 0x002854c2}}, Y: Field{[10]uint32{0x0263e756, 0x01125612, 0x0168a774, 0x02dbf6ee, 0x01b18550, 0x038aa96c, 0x01dda781, 0x0210b977, 0x02212732, 0x003cf494}}}, + {X: Field{[10]uint32{0x0264719e, 0x035db2a7, 0x013234a2, 0x00cab639, 0x03e5ee0d, 0x00cabd92, 0x014523f2, 0x0393c018, 0x02f7b438, 0x00146493}}, Y: Field{[10]uint32{0x028a8095, 0x01631dc4, 0x00176268, 0x01563ab6, 0x03fdfe6e, 0x02d912fe, 0x036e82b8, 0x0136d59c, 0x01a811f9, 0x0021f045}}}, + {X: Field{[10]uint32{0x03fada6e, 0x03555a14, 0x03563a3b, 0x01701ae5, 0x016ac905, 0x03882a75, 0x03625d4b, 0x0361d041, 0x0268e137, 0x0020b3fb}}, Y: Field{[10]uint32{0x00733b7a, 0x019e61cc, 0x01cc06ff, 0x01e140a9, 0x02a363e9, 0x037b9e9c, 0x02804d76, 0x031471ca, 0x0246c4f5, 0x0037526a}}}, + {X: Field{[10]uint32{0x032e623a, 0x03f5f957, 0x03f30a4e, 0x03f4b30e, 0x02e02b70, 0x00db1f69, 0x021346b0, 0x03bd1016, 0x0076f7f1, 0x0028dce2}}, Y: Field{[10]uint32{0x0204a21a, 0x0365847a, 0x02edf368, 0x00d9606c, 0x02b1204d, 0x01200cc6, 0x00de46e5, 0x014acaf8, 0x012be1ea, 0x001965bd}}}, + {X: Field{[10]uint32{0x0180bcbc, 0x000d960a, 0x01d7dd82, 0x02cc62c3, 0x028d8382, 0x00b33c92, 0x0224fd6b, 0x00635cad, 0x02f7aec8, 0x002b9329}}, Y: Field{[10]uint32{0x018f1ae2, 0x02325eb7, 0x015e9237, 0x02586aa6, 0x03348155, 0x015322ee, 0x02a29f25, 0x01f15c78, 0x020335ad, 0x001a9eb6}}}, + {X: Field{[10]uint32{0x01d12732, 0x03df7ea2, 0x006b1400, 0x0250b614, 0x004d6ac8, 0x03732e72, 0x018d1984, 0x01d8be6c, 0x022bfa9d, 0x002f8cd5}}, Y: Field{[10]uint32{0x0075d442, 0x034b9ba5, 0x008fe473, 0x015a40c1, 0x01c4f5c9, 0x013a1d29, 0x0336cc21, 0x019a9cd4, 0x03b877c6, 0x002d99bb}}}, + {X: Field{[10]uint32{0x03c74446, 0x02e4b68d, 0x01ecf37c, 0x007c1711, 0x03f38289, 0x02983fda, 0x003b2888, 0x00f6e14c, 0x02d9815b, 0x00275f69}}, Y: Field{[10]uint32{0x015b12a8, 0x00ada35d, 0x001ac540, 0x003627f3, 0x00df3d2c, 0x02d04f51, 0x01f6d734, 0x016f8398, 0x007372ba, 0x0011b0a4}}}, + {X: Field{[10]uint32{0x030d4d3f, 0x02a77d0e, 0x02366b62, 0x03edf266, 0x020b5981, 0x02edecef, 0x02028498, 0x030af301, 0x0131e513, 0x000e48cf}}, Y: Field{[10]uint32{0x0116dfd8, 0x038e136e, 0x03c81f97, 0x012ea6bf, 0x001ec57d, 0x0187e9dd, 0x00ac3e1c, 0x03a93d36, 0x017c92e0, 0x003f09e1}}}, + {X: Field{[10]uint32{0x037768be, 0x039450f6, 0x004b43f7, 0x00cea0b6, 0x02547e6f, 0x02d63d06, 0x00d02dd7, 0x03a0ec16, 0x0388db90, 0x0016f8b5}}, Y: Field{[10]uint32{0x03de1026, 0x0127cbdb, 0x00875b90, 0x01ae6899, 0x03d585ef, 0x0213edb3, 0x01396f2e, 0x03e8cf9c, 0x03a86b2d, 0x0002e33c}}}, + {X: Field{[10]uint32{0x00f162ac, 0x01e187a2, 0x035d682f, 0x02f8e09f, 0x027c53a0, 0x01c011e7, 0x03600c25, 0x02853044, 0x01e8191f, 0x000ffd67}}, Y: Field{[10]uint32{0x01c77ba2, 0x01730c8b, 0x024dfd81, 0x03ed79e6, 0x0308ae4e, 0x009e6847, 0x03f5f60c, 0x02db9efb, 0x01856ab0, 0x00009756}}}, + {X: Field{[10]uint32{0x019a256f, 0x01d6f05c, 0x01b5875f, 0x029398c1, 0x00b61a18, 0x02803e36, 0x02d9475d, 0x00648262, 0x0030ed22, 0x00207727}}, Y: Field{[10]uint32{0x014682a5, 0x01e34a3d, 0x03fc2ca6, 0x00913503, 0x009cccf0, 0x01a6897e, 0x038f9c98, 0x032c9e9b, 0x005e5c44, 0x000a5c1d}}}, + {X: Field{[10]uint32{0x0370e9da, 0x0168f926, 0x00d24f76, 0x010eedea, 0x02ea3869, 0x00c353d2, 0x036121b2, 0x01026455, 0x0216579c, 0x002e8f87}}, Y: Field{[10]uint32{0x02c72f4e, 0x02088d8c, 0x02abd90f, 0x039956ae, 0x0154eb0d, 0x034c39ec, 0x01d8d9c7, 0x03e99e2a, 0x0008653c, 0x00287bae}}}, + {X: Field{[10]uint32{0x03f854f8, 0x02271220, 0x0304ca05, 0x0250ee5b, 0x01fa66d1, 0x02df479a, 0x01f52a51, 0x02bb8450, 0x028150fa, 0x0000d7ff}}, Y: Field{[10]uint32{0x01366fad, 0x03422a32, 0x00dc9b7d, 0x018c181c, 0x00b4ad31, 0x03c44170, 0x00a09b8d, 0x01b74ff3, 0x0022e83f, 0x00359a86}}}, + {X: Field{[10]uint32{0x00763a06, 0x0142ab58, 0x00f685b9, 0x038f95c9, 0x038b50d7, 0x00e2e605, 0x0214c0ae, 0x03e5c870, 0x00221435, 0x000e63af}}, Y: Field{[10]uint32{0x00811f46, 0x016e0120, 0x03011682, 0x021c5240, 0x0115551b, 0x030b233a, 0x00d4da7f, 0x03baaff3, 0x009d0eb2, 0x0030b7d5}}}, + {X: Field{[10]uint32{0x00a89e96, 0x0284e243, 0x01a0d6cf, 0x00aa913f, 0x029ca89d, 0x01397387, 0x018511a8, 0x029d7474, 0x0333e7d0, 0x000ae89f}}, Y: Field{[10]uint32{0x017cf4a7, 0x02d98ae6, 0x02f19c6b, 0x0153f304, 0x0045c2ac, 0x02472845, 0x039946cc, 0x01d70e3c, 0x004b8323, 0x001408da}}}, + {X: Field{[10]uint32{0x01e829c2, 0x034547be, 0x0014465c, 0x00fbc7fc, 0x032b5497, 0x014c60ba, 0x02cd4856, 0x007e4813, 0x023e7ec5, 0x001095c1}}, Y: Field{[10]uint32{0x01232c1c, 0x01518ad5, 0x015d747c, 0x016a04ab, 0x00919f8b, 0x01a6af59, 0x009ab35b, 0x00145447, 0x034116dd, 0x0011cd47}}}, + {X: Field{[10]uint32{0x034063a8, 0x03c5cb66, 0x006ebe3e, 0x025623b9, 0x0180da81, 0x00b95946, 0x0218582d, 0x03295a50, 0x03c1b5b3, 0x001df9cd}}, Y: Field{[10]uint32{0x01d1587a, 0x038830a2, 0x007b50e0, 0x017135ec, 0x03651ae4, 0x032e44b8, 0x008d4f11, 0x0262b4df, 0x01c5e667, 0x0003df2d}}}, + {X: Field{[10]uint32{0x00cdaa4f, 0x03bb1e8d, 0x028c44a7, 0x010d1ed7, 0x01ef027d, 0x02932dcb, 0x02f98b82, 0x02307ef7, 0x024d7101, 0x0037f2ed}}, Y: Field{[10]uint32{0x03972a23, 0x02c31765, 0x01a92e06, 0x0160b72a, 0x01bc2f4e, 0x014713c2, 0x03379e87, 0x01d6222b, 0x01bcc720, 0x0037f033}}}, + {X: Field{[10]uint32{0x0355ae8a, 0x0258ab74, 0x00e78ce6, 0x0388a94b, 0x01b39855, 0x011b5c62, 0x02c52567, 0x007a38ca, 0x02d0a787, 0x0023ada1}}, Y: Field{[10]uint32{0x00cc30da, 0x038cc71b, 0x02a5ed71, 0x01d5ba29, 0x0389b796, 0x0308b17e, 0x00afe424, 0x00a0dff4, 0x0211fec5, 0x003aa2cd}}}, + {X: Field{[10]uint32{0x02cc3e54, 0x025ac74d, 0x0298785a, 0x00b6fa9e, 0x02ee5652, 0x0313083f, 0x02703ff8, 0x00b754c5, 0x0313ebaf, 0x00345f61}}, Y: Field{[10]uint32{0x01c10b54, 0x007616f7, 0x038b5682, 0x01c9391b, 0x00e9fdb8, 0x03e25074, 0x00a7a19b, 0x018b2a76, 0x03e86d78, 0x003a9c2d}}}, + {X: Field{[10]uint32{0x00b3ba89, 0x000df88c, 0x02cfa3ec, 0x007e0b35, 0x02249c47, 0x0053bbb6, 0x02d28e9c, 0x00287215, 0x03e6ae05, 0x001f531d}}, Y: Field{[10]uint32{0x0265fe60, 0x01cffa58, 0x027bcea7, 0x0230f686, 0x01900ad6, 0x009f440b, 0x0180f393, 0x037e4d2c, 0x0253f5fb, 0x0031681d}}}, + {X: Field{[10]uint32{0x017ebcab, 0x014306d3, 0x01e88f4f, 0x03b4378e, 0x003721dc, 0x02c942f3, 0x021d51b3, 0x0179a1b5, 0x0109451e, 0x00258e04}}, Y: Field{[10]uint32{0x00801b64, 0x01745959, 0x003947f1, 0x00529c8a, 0x0209f065, 0x035bc3f9, 0x017642bd, 0x032951fc, 0x0019b088, 0x0025263d}}}, + {X: Field{[10]uint32{0x038c2ba7, 0x02be42a5, 0x00d208af, 0x020ff68f, 0x0385f44e, 0x023d3a54, 0x02da8f2f, 0x00f5cdec, 0x01505435, 0x001d002d}}, Y: Field{[10]uint32{0x01909771, 0x022ab9ff, 0x008be6b1, 0x00749d41, 0x02e36bed, 0x036c7572, 0x0129a04c, 0x00d9df88, 0x00a3ce50, 0x00264ceb}}}, + {X: Field{[10]uint32{0x026ff59f, 0x00792e81, 0x01be2a01, 0x030e4ed4, 0x00d1de3b, 0x03c4baf6, 0x02f59639, 0x02ff49c7, 0x0011fff7, 0x000f5ec3}}, Y: Field{[10]uint32{0x02404b9d, 0x007133cc, 0x01789b79, 0x00bdd51a, 0x008bddb1, 0x02a21851, 0x01eb57d8, 0x02839738, 0x00317f7c, 0x002d8e5d}}}, + {X: Field{[10]uint32{0x01c46328, 0x01bd33d9, 0x0343c5cd, 0x0377f78d, 0x0245d128, 0x03237665, 0x03125455, 0x01fc5398, 0x01ec7ebf, 0x00125136}}, Y: Field{[10]uint32{0x00589996, 0x009c6fcb, 0x01d1f5bf, 0x036449b2, 0x035c2f49, 0x02747cf4, 0x01cd408c, 0x02bb04ca, 0x019313ba, 0x003c1954}}}, + {X: Field{[10]uint32{0x01bdecf1, 0x0391b49e, 0x00b5189c, 0x00cda6eb, 0x01f37b99, 0x03822cd5, 0x0207d6d8, 0x02c743e1, 0x032b4764, 0x00265810}}, Y: Field{[10]uint32{0x03160ebd, 0x02b15ac1, 0x0386578f, 0x03e37aea, 0x03f7e1a9, 0x030852b7, 0x0200ea9e, 0x034be8a4, 0x034c0921, 0x000c13ae}}}, + {X: Field{[10]uint32{0x033de4d6, 0x0212a8ee, 0x0281d9ca, 0x01658cc5, 0x019196cc, 0x009ad77b, 0x03409cc7, 0x015963f0, 0x035b6358, 0x000c4fd4}}, Y: Field{[10]uint32{0x016c9716, 0x01024bf1, 0x01fb3dd6, 0x03fe3266, 0x0159b049, 0x0007fd3c, 0x0323bcfd, 0x0383af97, 0x008aa55f, 0x00394469}}}, + {X: Field{[10]uint32{0x008ed7b2, 0x03c0d315, 0x01bcb3cc, 0x03597004, 0x00c99478, 0x03d3dd3b, 0x01b9006e, 0x01b7036e, 0x006f8cd3, 0x00217116}}, Y: Field{[10]uint32{0x03434229, 0x02d34416, 0x01f63a75, 0x01699d8e, 0x00144c8c, 0x03e6c01c, 0x02325923, 0x0175b371, 0x03c0045c, 0x00335a54}}}, + {X: Field{[10]uint32{0x00671af8, 0x01c1be65, 0x0251d21d, 0x0036d935, 0x03d489b2, 0x01ce07ba, 0x01b668db, 0x00d6747b, 0x02d2a7fc, 0x0025a2f1}}, Y: Field{[10]uint32{0x00725186, 0x02f6df3c, 0x033ce0d0, 0x03f02d4b, 0x02de88bc, 0x0396545f, 0x032f3304, 0x01c1f306, 0x02a3723d, 0x003ec2b5}}}, + {X: Field{[10]uint32{0x0328985d, 0x023158ef, 0x024200e5, 0x03373fda, 0x0326d343, 0x01bb03a1, 0x00c72215, 0x039dfb9b, 0x00eb3722, 0x0008c96b}}, Y: Field{[10]uint32{0x038d39e1, 0x03323fe1, 0x03a5a21a, 0x03f7a06e, 0x0019b9c8, 0x03cfa7bb, 0x02596836, 0x0165e3ca, 0x0353dd29, 0x0018069f}}}, + {X: Field{[10]uint32{0x03acd2e4, 0x001ff759, 0x01dff054, 0x00d61f0c, 0x024b1c93, 0x02abcca9, 0x00667f99, 0x00efab70, 0x02abb231, 0x00231b9d}}, Y: Field{[10]uint32{0x0250c29f, 0x01444b47, 0x02a46b3f, 0x00b8d036, 0x023d7bb9, 0x00a6ce43, 0x03b19c42, 0x037ceb24, 0x0050d422, 0x0009f8ee}}}, + {X: Field{[10]uint32{0x0236748f, 0x03508c17, 0x037af9d8, 0x02a22e60, 0x000352e7, 0x0354e285, 0x02b2c728, 0x0234f935, 0x02313446, 0x0038c7fb}}, Y: Field{[10]uint32{0x010309be, 0x02686c9b, 0x00139e41, 0x00f8a035, 0x0237f9df, 0x02684078, 0x03974f6b, 0x0123e24d, 0x02e12d19, 0x00226c25}}}, + {X: Field{[10]uint32{0x00d306c6, 0x0305f52c, 0x02981215, 0x02c19eb8, 0x00da748a, 0x03968ce6, 0x0342fdd7, 0x0012d1f1, 0x006e8494, 0x00165ad6}}, Y: Field{[10]uint32{0x02a0a16b, 0x03863e18, 0x02791ff6, 0x0180acb3, 0x012ac277, 0x036b7c86, 0x00e8f05e, 0x031c4579, 0x00c5912c, 0x003a5b17}}}, + {X: Field{[10]uint32{0x01aa1c02, 0x01492185, 0x03317714, 0x028e0c4f, 0x03d453d5, 0x006549c3, 0x019c3b71, 0x00032e86, 0x01675cf5, 0x00080330}}, Y: Field{[10]uint32{0x0320ce61, 0x01e73d54, 0x024b3e7b, 0x013b05f7, 0x011905e2, 0x024900dc, 0x005c1334, 0x010a7191, 0x00c87e34, 0x001e02ab}}}, + {X: Field{[10]uint32{0x02d2025f, 0x017a774a, 0x01767dfb, 0x01be04cc, 0x0370f0e9, 0x01e93c91, 0x01148f87, 0x007f3c1e, 0x0032e10e, 0x001f9355}}, Y: Field{[10]uint32{0x03aa432a, 0x02d49458, 0x0136eec0, 0x03284f8c, 0x01fa58f0, 0x0105e60b, 0x03f5fd7d, 0x00a0dfcd, 0x03b26ee8, 0x000d7d76}}}, + {X: Field{[10]uint32{0x000237b7, 0x02edef67, 0x030e5776, 0x01e4d4a1, 0x00ff21f8, 0x01bac430, 0x038f800b, 0x01f9b9e9, 0x010895c9, 0x00307b5d}}, Y: Field{[10]uint32{0x03418fb9, 0x005063fa, 0x01bb1d8b, 0x02565c82, 0x01a38e80, 0x013ffb0f, 0x031e89f6, 0x02aa2670, 0x02068dc0, 0x00241c8e}}}, + {X: Field{[10]uint32{0x02104770, 0x0339cc2c, 0x018defc7, 0x02b9a55b, 0x029948dd, 0x00576374, 0x01239b2a, 0x02027e0f, 0x02e8a53e, 0x00397f52}}, Y: Field{[10]uint32{0x031c4fa2, 0x00bc37bd, 0x0112ade0, 0x03d77d30, 0x03050c7b, 0x017cb76e, 0x00e8ebd3, 0x00865c82, 0x029c1cbb, 0x001a9376}}}, + {X: Field{[10]uint32{0x0251f30d, 0x01bab076, 0x03f2ca76, 0x0057d9cc, 0x03e3534d, 0x00be7b3b, 0x0372cdb4, 0x02f621ea, 0x01f24b33, 0x0000f39d}}, Y: Field{[10]uint32{0x02838ed7, 0x03c132c6, 0x0136213b, 0x02334f72, 0x01a43eb4, 0x00a2bd56, 0x00e9b5d8, 0x03db898b, 0x015b51dd, 0x0027b68c}}}, + {X: Field{[10]uint32{0x0013391c, 0x033bcee2, 0x01d34ad8, 0x02a23867, 0x00527fb9, 0x01fb7d66, 0x018d8ce7, 0x00735392, 0x004f33a8, 0x00263013}}, Y: Field{[10]uint32{0x038bd3a7, 0x03c185ff, 0x01949483, 0x00ea3fc8, 0x03acb484, 0x00158255, 0x0371c463, 0x03e04bd0, 0x0167f853, 0x003f4af3}}}, + {X: Field{[10]uint32{0x0287bbf3, 0x02281e42, 0x001b10fc, 0x00a1b905, 0x01f3d2dd, 0x004f390f, 0x00e62f84, 0x032c1b2f, 0x00882906, 0x000143a7}}, Y: Field{[10]uint32{0x002fa3fb, 0x01890f36, 0x00a9ce1c, 0x0168bcf2, 0x02479a61, 0x028111d2, 0x01eefb2b, 0x006731a1, 0x013bb05f, 0x00010f1c}}}, + {X: Field{[10]uint32{0x03adf2d1, 0x022a0c50, 0x023a2eeb, 0x0190a9cf, 0x0071bf65, 0x03c86ddb, 0x00faa663, 0x0378ec19, 0x0217458b, 0x0017506e}}, Y: Field{[10]uint32{0x03b6cec5, 0x031117d5, 0x0351087c, 0x029da1d8, 0x0307f64f, 0x01eac163, 0x039e22b0, 0x008564ac, 0x0054b308, 0x0005fbff}}}, + {X: Field{[10]uint32{0x00d5b077, 0x00e3e749, 0x023e789d, 0x018191bf, 0x026b34cc, 0x0364b81d, 0x003cb8e1, 0x0164edba, 0x00bf2a02, 0x00138ccb}}, Y: Field{[10]uint32{0x039e1f95, 0x00aa1679, 0x01955c8b, 0x00f77b34, 0x01744ad0, 0x0278e478, 0x03699859, 0x000c0256, 0x005c3ab9, 0x00143e9d}}}, + {X: Field{[10]uint32{0x01a2dae9, 0x005baecd, 0x013f8347, 0x01f3776d, 0x03c83cd4, 0x00d04141, 0x017455e4, 0x02096f0d, 0x029d27ee, 0x0006efd8}}, Y: Field{[10]uint32{0x01e9bb75, 0x03ea250f, 0x0370971f, 0x01a58074, 0x018fb72f, 0x002f6179, 0x000070ec, 0x014fcd3d, 0x00c1e997, 0x00214242}}}, + {X: Field{[10]uint32{0x01cde650, 0x03d6c06d, 0x01b8aa25, 0x026f71e7, 0x0023aece, 0x03af72cc, 0x00cb3f5d, 0x0358aab4, 0x02eff9db, 0x002a4526}}, Y: Field{[10]uint32{0x00c327bd, 0x03c2fdad, 0x01a79918, 0x02318766, 0x02ae3c14, 0x037da1b5, 0x00a16d09, 0x00447d1a, 0x0346e6db, 0x0029eed2}}}, + {X: Field{[10]uint32{0x01b72a71, 0x0385c87f, 0x0037ffc5, 0x0375d7e0, 0x03b98ffc, 0x02c876b2, 0x01e5b406, 0x03590867, 0x01ee0185, 0x00200402}}, Y: Field{[10]uint32{0x03e26441, 0x00b96bcd, 0x010f2daf, 0x00162619, 0x01382839, 0x01171d7c, 0x0136f706, 0x02b5b077, 0x020957c7, 0x003a0859}}}, + {X: Field{[10]uint32{0x00ba6770, 0x01a2a1b0, 0x0068ab73, 0x00e4e401, 0x0096c6b6, 0x01bc4cbb, 0x02345846, 0x03d9e82c, 0x019ae466, 0x00301c3a}}, Y: Field{[10]uint32{0x00769362, 0x01124154, 0x00171a15, 0x033e703c, 0x03be6f8f, 0x02ca47ff, 0x016f77e3, 0x013d5a29, 0x03df358d, 0x00220fea}}}, + {X: Field{[10]uint32{0x00109f4a, 0x017fc7d5, 0x039da71c, 0x014c77fd, 0x018e028c, 0x0342be68, 0x03549a9e, 0x009d85e3, 0x0239cf61, 0x001afa25}}, Y: Field{[10]uint32{0x0204cf14, 0x017f6ce5, 0x02e0d821, 0x03c5b5d9, 0x00ff2dd6, 0x03e65c31, 0x0292f38f, 0x0244c49a, 0x017ddd37, 0x001ddebb}}}, + {X: Field{[10]uint32{0x0224ce8c, 0x016bf165, 0x01009219, 0x0014ae76, 0x03100945, 0x036ec6a1, 0x0052e796, 0x00792808, 0x01d41ce7, 0x00347f4c}}, Y: Field{[10]uint32{0x013fded1, 0x00425249, 0x01a2e5b5, 0x02aba8af, 0x0136d5f2, 0x02183979, 0x02796d91, 0x000a77aa, 0x03d378a8, 0x003cd5ea}}}, + {X: Field{[10]uint32{0x03169d9e, 0x0351a6e3, 0x010337ae, 0x022bab66, 0x02614c32, 0x02909a65, 0x01e617c0, 0x03c52cf3, 0x002d66fe, 0x0007214e}}, Y: Field{[10]uint32{0x038a71f9, 0x02257bc1, 0x01113a8f, 0x0137f6fe, 0x01e2406a, 0x01c9f669, 0x018702ab, 0x039aa13d, 0x031cb236, 0x0016316b}}}, + {X: Field{[10]uint32{0x0336b5ea, 0x03b7f653, 0x0212e272, 0x02dd0f2e, 0x03eec32c, 0x0304a2b5, 0x025c2d52, 0x019edd0b, 0x01edd5fd, 0x000b63ea}}, Y: Field{[10]uint32{0x032cd37d, 0x026b4763, 0x0331f0aa, 0x0103de01, 0x02231453, 0x0325930c, 0x0133af4b, 0x00a827e5, 0x033937eb, 0x001c6c57}}}, + {X: Field{[10]uint32{0x03dbafb4, 0x00e048b7, 0x00c954c5, 0x031a1c0c, 0x0240ceb1, 0x014376f7, 0x00d0a159, 0x031659c0, 0x0379d9f6, 0x0013d448}}, Y: Field{[10]uint32{0x0248c05b, 0x01f020d0, 0x01674c7f, 0x03ef80e0, 0x034b320a, 0x01f76159, 0x0061980c, 0x037d7aea, 0x0305f864, 0x001537a6}}}, + {X: Field{[10]uint32{0x01e7cd1c, 0x02348b36, 0x02834016, 0x0173b64f, 0x032c6999, 0x0350fb28, 0x02609496, 0x00b08563, 0x01ba4856, 0x002697e4}}, Y: Field{[10]uint32{0x0322b86b, 0x0034aa6d, 0x036382d4, 0x00fb84bd, 0x0129bfa3, 0x02b3e714, 0x01b11266, 0x03b28b80, 0x03ecc668, 0x0027e228}}}, + {X: Field{[10]uint32{0x02f9f610, 0x01df7614, 0x03cf0065, 0x03f83563, 0x01d84d54, 0x020cedd7, 0x00cc6b6e, 0x03eb9313, 0x0102d417, 0x003768c1}}, Y: Field{[10]uint32{0x015469a1, 0x036ff045, 0x02b0c5d4, 0x01e9b1fe, 0x0207f4c5, 0x000b8a90, 0x005468d1, 0x019079b5, 0x01da2e74, 0x003eee23}}}, + {X: Field{[10]uint32{0x0326e117, 0x036978d6, 0x025e8e88, 0x02c58635, 0x000600df, 0x00c7397d, 0x00e50cc6, 0x00507612, 0x027c5586, 0x00234ba7}}, Y: Field{[10]uint32{0x0251aa86, 0x0287b400, 0x009a9e33, 0x02f3dd8f, 0x02bb72fa, 0x0170a955, 0x01ab4fd8, 0x01f15355, 0x01ecffd6, 0x0026270e}}}, + {X: Field{[10]uint32{0x001ee995, 0x029f2a59, 0x01bbfa27, 0x03378f56, 0x0310c911, 0x00f47689, 0x031cee1c, 0x00f5b2c1, 0x0076e6b6, 0x001c9b38}}, Y: Field{[10]uint32{0x010af9c1, 0x02588b98, 0x015951c4, 0x02043522, 0x0206ea5e, 0x022ad74d, 0x02d01acd, 0x03e34d34, 0x02a0c91f, 0x0013906e}}}, + {X: Field{[10]uint32{0x02a43a1a, 0x02eb366f, 0x017aa27d, 0x01c7b4ba, 0x02c0d429, 0x027a5418, 0x02c0dc2c, 0x000f4fee, 0x01fe1835, 0x0037af24}}, Y: Field{[10]uint32{0x022d2f11, 0x01e8ccef, 0x00100d49, 0x0323fda2, 0x026dfdf3, 0x0357c9b9, 0x03b2ab80, 0x033a6bcc, 0x0315a6fe, 0x0004d64d}}}, + {X: Field{[10]uint32{0x00fd4b28, 0x017a443c, 0x00f41c58, 0x013b5ac9, 0x03237c79, 0x01cbfcb5, 0x0039e8c4, 0x012ae39c, 0x03357791, 0x00314e50}}, Y: Field{[10]uint32{0x0126087b, 0x01bf1533, 0x0310d1fc, 0x03da691c, 0x0123c26c, 0x002a8a83, 0x03041128, 0x027139ec, 0x019b628a, 0x000a014d}}}, + {X: Field{[10]uint32{0x005f29b0, 0x022f1e68, 0x00e1cc99, 0x00412fb9, 0x0072b818, 0x022a3ebb, 0x02bf1fbe, 0x0002c600, 0x02fd33c3, 0x00268a24}}, Y: Field{[10]uint32{0x01186e33, 0x03dcbfd1, 0x00bebb37, 0x0177d7ea, 0x00553870, 0x01738df3, 0x02ebc53a, 0x0004d948, 0x023bc2fa, 0x00265fc4}}}, + {X: Field{[10]uint32{0x039a351a, 0x0160412c, 0x0279f4c5, 0x02ff5cf7, 0x001503bb, 0x0382fc60, 0x017fe427, 0x013ef9fb, 0x00ac0f22, 0x0035288b}}, Y: Field{[10]uint32{0x02ce752b, 0x02bdae0e, 0x02860341, 0x00442a0b, 0x02232603, 0x01238d1a, 0x01133495, 0x00b824a9, 0x02973062, 0x00209a3f}}}, + {X: Field{[10]uint32{0x00c11659, 0x01653ee7, 0x0003c077, 0x02ee1df7, 0x0111d4d2, 0x001c27ee, 0x0014963b, 0x02f87635, 0x03ff15ad, 0x0012933c}}, Y: Field{[10]uint32{0x01ced874, 0x03b75834, 0x0336fc2d, 0x002f0e7f, 0x035109a3, 0x03a992b4, 0x00418100, 0x0254a989, 0x018336f1, 0x0015f211}}}, + {X: Field{[10]uint32{0x018e1539, 0x026fc305, 0x02f441f6, 0x009e1c72, 0x00e85e0b, 0x00b28992, 0x00836cf4, 0x0354c263, 0x00edb580, 0x0016303b}}, Y: Field{[10]uint32{0x0042467e, 0x005e0fba, 0x03fd7412, 0x0027e847, 0x0292e54a, 0x000b346a, 0x023d36f7, 0x02f25139, 0x00491e1d, 0x003abde7}}}, + {X: Field{[10]uint32{0x024892bb, 0x03326fdc, 0x0016f634, 0x0009fd39, 0x03261323, 0x03961a8c, 0x02154f3f, 0x01fa24e2, 0x00e8a60c, 0x002c3ef4}}, Y: Field{[10]uint32{0x02a5d3c3, 0x00cc31e0, 0x03d079a0, 0x024c4df0, 0x026dd83f, 0x0012662e, 0x00fcb501, 0x03d036d5, 0x027d6757, 0x0009ee9d}}}, + {X: Field{[10]uint32{0x0192f0d3, 0x01b630b6, 0x000818c1, 0x03de132d, 0x00ee90c2, 0x013bc611, 0x01fecf3e, 0x004d6849, 0x012a26b0, 0x002a52b8}}, Y: Field{[10]uint32{0x018e2050, 0x0229d808, 0x03c95bbc, 0x00d8221d, 0x02e046fe, 0x02ee8f59, 0x0016a6f6, 0x01d6571e, 0x03ba665e, 0x0028dd11}}}, + {X: Field{[10]uint32{0x00dcbeb5, 0x02f8c223, 0x02eeb9ad, 0x0101cc16, 0x00c540e2, 0x03e40137, 0x036c4844, 0x013eb8ca, 0x009b3eb7, 0x00232f6c}}, Y: Field{[10]uint32{0x00c932fe, 0x01cb3d0d, 0x023b810e, 0x01146d27, 0x01912df7, 0x0139685a, 0x007b14c0, 0x03bf4bfc, 0x03a291f6, 0x0000ae18}}}, + {X: Field{[10]uint32{0x00cdbac8, 0x00e721cd, 0x03afcf8f, 0x0071034d, 0x020ab313, 0x01422af5, 0x02fb89ed, 0x03af8731, 0x02c3b70e, 0x000fe33e}}, Y: Field{[10]uint32{0x0158b65e, 0x0124e84b, 0x01321f0c, 0x021ed10f, 0x01a68b52, 0x0122592d, 0x00b303db, 0x03c975e5, 0x0111846e, 0x0036ec08}}}, + {X: Field{[10]uint32{0x0315b25b, 0x01f69837, 0x004b9054, 0x0136ceb2, 0x0331fcaf, 0x020598c2, 0x03e9a4e1, 0x039e704b, 0x00e0cea3, 0x002d8581}}, Y: Field{[10]uint32{0x01b86801, 0x03a7660a, 0x0192cea2, 0x02224063, 0x00317d53, 0x02849929, 0x0265b41b, 0x03e96d59, 0x03ad9ea0, 0x0006abca}}}, + {X: Field{[10]uint32{0x011327d7, 0x021bbc11, 0x00a3f07c, 0x028d9347, 0x02fa51bd, 0x03ef5a2d, 0x026630a7, 0x02ce3870, 0x00103c6a, 0x003ac39d}}, Y: Field{[10]uint32{0x00e82e6d, 0x01a05eb8, 0x037d44c3, 0x0330bb8d, 0x0045cdaa, 0x027edd0e, 0x001c9c7d, 0x034f0655, 0x001757c4, 0x0037e814}}}, + {X: Field{[10]uint32{0x0156b7ae, 0x0342fda5, 0x0144f4bc, 0x01f92c95, 0x031fcfdd, 0x01d8b012, 0x02d28126, 0x03993236, 0x0103be51, 0x0018dbf1}}, Y: Field{[10]uint32{0x013f4cd9, 0x021c0e8c, 0x011e6984, 0x0375414b, 0x02b633c8, 0x022df621, 0x03b6735a, 0x010525fc, 0x030f0510, 0x0015ee0e}}}, + {X: Field{[10]uint32{0x012ab330, 0x031cd639, 0x02288c15, 0x01953a8f, 0x005ba9dc, 0x034b7867, 0x02fc2bd1, 0x008d6f1a, 0x00ec4d42, 0x000bf31c}}, Y: Field{[10]uint32{0x016a30ce, 0x01df9949, 0x01069395, 0x03a09467, 0x0135bde8, 0x03f36da5, 0x024cbbfc, 0x00788b6d, 0x00182bfa, 0x001a8d58}}}, + {X: Field{[10]uint32{0x02a94b54, 0x0043889f, 0x007d01cd, 0x0396f56f, 0x0183be81, 0x01af7ea5, 0x00969ebd, 0x02e2ff6e, 0x02c38d38, 0x00045401}}, Y: Field{[10]uint32{0x0080e08a, 0x01687508, 0x02780250, 0x00e9cc94, 0x023fac02, 0x01ba1e00, 0x0339e83f, 0x00feea6b, 0x010216eb, 0x001810eb}}}, + {X: Field{[10]uint32{0x01b3aaf1, 0x0194fca3, 0x019a515b, 0x021afb70, 0x013756a9, 0x03f95340, 0x00a2da82, 0x0070a583, 0x025a15ba, 0x00005f55}}, Y: Field{[10]uint32{0x03c7399c, 0x012b5ea6, 0x00c35f27, 0x0064cd4d, 0x027a6338, 0x0274c494, 0x00b05aab, 0x002cf92e, 0x01dd4204, 0x00245eee}}}, + {X: Field{[10]uint32{0x03221ef2, 0x01d31b5a, 0x0330e023, 0x022ad20b, 0x01d2af8f, 0x00f96f2a, 0x00598f7a, 0x00710c2e, 0x00898850, 0x00037309}}, Y: Field{[10]uint32{0x03652e72, 0x01919193, 0x02b0a578, 0x02d667c7, 0x01cd14ca, 0x03c037b3, 0x03102a6e, 0x03b14ac7, 0x017dd5c6, 0x002a165d}}}, + {X: Field{[10]uint32{0x011f0b0f, 0x00fea3cd, 0x03a03d83, 0x030f50f2, 0x03ae2cf9, 0x03a0229f, 0x01919db6, 0x00c2df37, 0x039f4e94, 0x0029a2ca}}, Y: Field{[10]uint32{0x00786526, 0x0096f165, 0x00f66d65, 0x0137cbe7, 0x017f45b1, 0x009de008, 0x015614d9, 0x00248e3a, 0x0232d3ad, 0x0038d2e2}}}, + {X: Field{[10]uint32{0x010e9462, 0x0020a7e3, 0x013c2319, 0x005d1c0b, 0x01fe7e2f, 0x02b5654e, 0x02d11e9e, 0x00466174, 0x025a938e, 0x000be553}}, Y: Field{[10]uint32{0x03b16dd5, 0x02ac79c2, 0x02c61e55, 0x02fe7e26, 0x01f6aaa6, 0x01a8e4ec, 0x02fecc84, 0x01f502e8, 0x0379fa8b, 0x002cbc34}}}, + {X: Field{[10]uint32{0x027ffe4f, 0x00e4e330, 0x03556fa9, 0x0234f33f, 0x033cc33c, 0x02ecb77a, 0x03fcae86, 0x0253f66c, 0x01136bca, 0x00088f4f}}, Y: Field{[10]uint32{0x01512915, 0x01329614, 0x00ec09c7, 0x02294eed, 0x0327f6cd, 0x00f58866, 0x016f7dd8, 0x0061f309, 0x0106e317, 0x0021f864}}}, + {X: Field{[10]uint32{0x028f7b2e, 0x020d2b67, 0x02abf517, 0x00ae83ce, 0x00b61443, 0x02d3d257, 0x01f3a3e9, 0x0186d90f, 0x00e82911, 0x00156476}}, Y: Field{[10]uint32{0x026d07c2, 0x03bd6503, 0x01416673, 0x01fb1028, 0x0130b3fe, 0x02e91c67, 0x03d454eb, 0x01f94b66, 0x0235f626, 0x000b235a}}}, + {X: Field{[10]uint32{0x01f29a29, 0x024dd451, 0x02252c8e, 0x0078b939, 0x03414184, 0x027a6bbe, 0x00cbaecb, 0x0068521c, 0x004ad15d, 0x003acb3f}}, Y: Field{[10]uint32{0x0052e5ac, 0x019c855c, 0x00b955bc, 0x0035b4d7, 0x00e62f21, 0x01d94054, 0x0304c79c, 0x03664ade, 0x020810bf, 0x001e2043}}}, + {X: Field{[10]uint32{0x00a3f74b, 0x0178fa7b, 0x0392700d, 0x01f4b867, 0x02bdcdb4, 0x00e7310d, 0x00b1d4c5, 0x02a06179, 0x03f99680, 0x001844b0}}, Y: Field{[10]uint32{0x00da4403, 0x03694ae6, 0x00f353b8, 0x01f1a9a4, 0x02f2579d, 0x007db2a5, 0x008f9d40, 0x022feb6b, 0x03dd723c, 0x001ba182}}}, + {X: Field{[10]uint32{0x03d58b16, 0x02477b69, 0x015797b3, 0x00535f8c, 0x03b9b329, 0x0283c5f0, 0x002c23b9, 0x0362c031, 0x00d8d552, 0x00224848}}, Y: Field{[10]uint32{0x01cf7941, 0x0008c5ad, 0x00edf325, 0x025b33c3, 0x03cc4a94, 0x02f7300d, 0x013d1f64, 0x01e3cbe4, 0x03acb3c7, 0x00398948}}}, + {X: Field{[10]uint32{0x03c4dc0a, 0x0347a447, 0x021c5ecb, 0x01245a11, 0x0160ca4a, 0x018c1129, 0x03155839, 0x034ef808, 0x0056217a, 0x0011d62d}}, Y: Field{[10]uint32{0x01d83679, 0x0121e336, 0x027ca960, 0x01ec0f13, 0x03bb7498, 0x030c2b06, 0x03eec6a1, 0x025cfc15, 0x015a4f30, 0x00267909}}}, + {X: Field{[10]uint32{0x025629da, 0x039d5d5b, 0x02143b99, 0x031f658b, 0x03a3b95d, 0x01e11e6b, 0x03a0c6f9, 0x01ea1e5f, 0x02a69a20, 0x002ac108}}, Y: Field{[10]uint32{0x01823faa, 0x01b8b8e9, 0x02dfa7a0, 0x01c12653, 0x0184af0f, 0x02e37f3b, 0x00280c32, 0x026157af, 0x010f00fc, 0x001cce63}}}, + {X: Field{[10]uint32{0x0145d227, 0x02b50fb5, 0x01b20ee7, 0x02983c28, 0x01852cc7, 0x020a4dd3, 0x010b4c35, 0x002c50c3, 0x032accb9, 0x00066010}}, Y: Field{[10]uint32{0x028b05c5, 0x023696e7, 0x01546766, 0x03e3cb94, 0x0069c919, 0x02e626f4, 0x03d1a0e9, 0x0233acab, 0x0073bfbc, 0x0025ab8e}}}, + {X: Field{[10]uint32{0x00e93f17, 0x01894bb8, 0x010cbb71, 0x0055d0f5, 0x0293b8a0, 0x02aefbcf, 0x0361cd72, 0x03eceb29, 0x037fe2df, 0x0010a204}}, Y: Field{[10]uint32{0x02238825, 0x0021b76a, 0x008de456, 0x0011679e, 0x0271fddb, 0x03681d9c, 0x01855f14, 0x019a9bef, 0x033e36c3, 0x00300b0c}}}, + {X: Field{[10]uint32{0x02b6cde2, 0x024a06b5, 0x03d3d52d, 0x01db836d, 0x0077e432, 0x02a9cfe9, 0x03c4d160, 0x0227682b, 0x003505bc, 0x003597eb}}, Y: Field{[10]uint32{0x0007383f, 0x01e11e30, 0x02b13056, 0x03906221, 0x038e9f07, 0x000e18b4, 0x01005456, 0x03ccded1, 0x0175a6c5, 0x0039bd32}}}, + {X: Field{[10]uint32{0x018f6ca7, 0x00665e2e, 0x014c843e, 0x021346ca, 0x02beb967, 0x0181e4db, 0x028b54e1, 0x0349e93f, 0x0144e62d, 0x001c0a6c}}, Y: Field{[10]uint32{0x0140a25c, 0x023ca99c, 0x0114aa47, 0x011f1cf7, 0x009a1af3, 0x0155113c, 0x02c90c38, 0x01b1b8e8, 0x01665805, 0x0022c43b}}}, + {X: Field{[10]uint32{0x039183b2, 0x0256d0f3, 0x01711502, 0x013911c5, 0x01fa343e, 0x01768306, 0x00ea87da, 0x026f77a0, 0x00ebdf96, 0x0013c9d8}}, Y: Field{[10]uint32{0x03e28167, 0x00a59de0, 0x03425d46, 0x017536bf, 0x0115d862, 0x023da6da, 0x001fd39b, 0x03bc27e8, 0x017bf3f9, 0x0010f8b0}}}, + {X: Field{[10]uint32{0x0374a5fc, 0x01c98570, 0x03e52143, 0x015fcbb9, 0x01b573ce, 0x02e7e94e, 0x015f0d23, 0x025aa3cd, 0x02addb41, 0x0033265a}}, Y: Field{[10]uint32{0x028ef28d, 0x027cb702, 0x019232c0, 0x02b6fffe, 0x0144284b, 0x02fa1744, 0x00a9cb66, 0x00a4d70c, 0x03871878, 0x002c7103}}}, + {X: Field{[10]uint32{0x014ade42, 0x010c0f35, 0x006313cf, 0x0214ef6b, 0x01cd9b32, 0x017adc24, 0x0038e398, 0x036416cb, 0x02d3f3e3, 0x0031e062}}, Y: Field{[10]uint32{0x00339eee, 0x01feebe5, 0x03937800, 0x03f747d7, 0x033403a5, 0x030510f3, 0x0363fb0f, 0x02142c51, 0x004e7bbb, 0x001555d3}}}, + {X: Field{[10]uint32{0x0189c4fd, 0x01d5cdc9, 0x0045e52a, 0x03279de5, 0x009a45db, 0x02b97496, 0x0344d1f3, 0x023affd0, 0x01846fc4, 0x001b340d}}, Y: Field{[10]uint32{0x03416e34, 0x03a33224, 0x00723a44, 0x024a34b5, 0x014d811c, 0x039347ea, 0x0367dda8, 0x038dc6b7, 0x037db165, 0x002bea16}}}, + {X: Field{[10]uint32{0x003b2e0a, 0x03aeeb51, 0x00fd3bfa, 0x02491d37, 0x00f5231b, 0x004548c5, 0x02b72359, 0x02c6b98c, 0x0205f716, 0x003594a8}}, Y: Field{[10]uint32{0x013bedcf, 0x02281bae, 0x02dcba45, 0x008fb059, 0x03c4646a, 0x03780f62, 0x002f0d85, 0x0103df2e, 0x0021b782, 0x00348661}}}, + {X: Field{[10]uint32{0x0052fb54, 0x0014be37, 0x02d73a6a, 0x02bf4d38, 0x0181ff0b, 0x00d00116, 0x01b3e4fe, 0x012877e6, 0x004dcd84, 0x002a01f4}}, Y: Field{[10]uint32{0x02e2cd9a, 0x0067a7e8, 0x03151af0, 0x011e5f3e, 0x00c385c0, 0x03eef1c6, 0x03e5079f, 0x0260d4ee, 0x00bb7393, 0x0006229e}}}, + {X: Field{[10]uint32{0x009eb2d7, 0x03f705f3, 0x02de224e, 0x017a7d33, 0x01b8c3a9, 0x01b2c0ae, 0x03acd07d, 0x02b523a4, 0x03bca5d6, 0x0007bf4a}}, Y: Field{[10]uint32{0x02745b39, 0x00fbbcd9, 0x01a05006, 0x02baa2bc, 0x0202a9d2, 0x02ecd5fd, 0x03e191a1, 0x031f98d5, 0x03881b98, 0x003e547b}}}, + {X: Field{[10]uint32{0x0395888f, 0x002e6b08, 0x01f666ed, 0x004df0ef, 0x030ea0ff, 0x025ff838, 0x02bcd044, 0x00f6d660, 0x0254d27d, 0x00016f17}}, Y: Field{[10]uint32{0x02ec3300, 0x03d97ca0, 0x003754c1, 0x01d409c4, 0x025a22d9, 0x00c86cda, 0x01f8b857, 0x03ac0598, 0x0002d4f4, 0x000d556f}}}, + {X: Field{[10]uint32{0x006a3247, 0x02e023dd, 0x02f221f5, 0x01c456f9, 0x02158cca, 0x022b4bc7, 0x022ea80e, 0x0234379b, 0x028d26b0, 0x0003d802}}, Y: Field{[10]uint32{0x03ca3523, 0x02ceac62, 0x00aa3cd5, 0x0371945b, 0x0276c753, 0x03a3846e, 0x02f75b28, 0x03e96c1f, 0x02134bc3, 0x0008ef96}}}, + {X: Field{[10]uint32{0x00ccaf7b, 0x00af49a4, 0x0381ae49, 0x030db1cf, 0x01f5119b, 0x0396404d, 0x01712a8b, 0x029ea331, 0x020b2ab2, 0x003f1f93}}, Y: Field{[10]uint32{0x001151a6, 0x03242ace, 0x01cddb31, 0x02d6aa0d, 0x01e4a682, 0x01b7624a, 0x02862b8a, 0x011a41ba, 0x02f41f27, 0x0012f584}}}, + {X: Field{[10]uint32{0x01442655, 0x00eced62, 0x01700bcd, 0x0161daaa, 0x0141641d, 0x01e6d8f9, 0x0067eecd, 0x03402feb, 0x033cfe12, 0x00144c97}}, Y: Field{[10]uint32{0x033ef941, 0x00de92c4, 0x03b33a44, 0x03964730, 0x03982a35, 0x01e595ff, 0x01623605, 0x039b8b6e, 0x00ad7b7a, 0x0035aa25}}}, + {X: Field{[10]uint32{0x0198aec8, 0x009b92b1, 0x03a09056, 0x01b6e3fb, 0x02afee9a, 0x005fc00e, 0x01bd2d57, 0x03d823c8, 0x00271a55, 0x000b6ceb}}, Y: Field{[10]uint32{0x03f9533e, 0x03832226, 0x03dd6e0d, 0x01a2d1f3, 0x013c6621, 0x0199827d, 0x00c9fc9d, 0x00718307, 0x0333a0c0, 0x003149af}}}, + {X: Field{[10]uint32{0x01fa7dcc, 0x03481775, 0x01be51e1, 0x00d8fce4, 0x0135fbd4, 0x01f790c8, 0x0305b554, 0x02c06d7a, 0x037293de, 0x00024201}}, Y: Field{[10]uint32{0x02d7442d, 0x01304097, 0x03f23e03, 0x02134f30, 0x0164dfef, 0x01718856, 0x013d318b, 0x00ccdc19, 0x02ac1724, 0x003fa587}}}, + {X: Field{[10]uint32{0x039ed9d6, 0x030def0c, 0x017cce2e, 0x02b4f4d6, 0x03045557, 0x01e43353, 0x02cc03f6, 0x013f20b6, 0x0181e5a6, 0x000ca86b}}, Y: Field{[10]uint32{0x027cb07a, 0x01c41898, 0x02cf3d13, 0x0362a41d, 0x0279cb55, 0x01e573b1, 0x017b63ca, 0x000089c2, 0x03681801, 0x0021eaf3}}}, + {X: Field{[10]uint32{0x019246f9, 0x01c745d3, 0x016e9a37, 0x027556ce, 0x0108c584, 0x01c745ea, 0x031af769, 0x02714683, 0x00fa5868, 0x003df2ea}}, Y: Field{[10]uint32{0x0358ee45, 0x01ee7b2b, 0x0072cac3, 0x030bf20c, 0x025309a0, 0x01757ee8, 0x024d7333, 0x02a72bb6, 0x03a910d5, 0x003d2c2a}}}, + {X: Field{[10]uint32{0x0329ea81, 0x022be098, 0x006d58ee, 0x0156b9c1, 0x03fab75f, 0x0015e690, 0x01b6b7bc, 0x00036759, 0x01042da9, 0x003369ac}}, Y: Field{[10]uint32{0x011771e3, 0x035bc773, 0x000fc068, 0x038a6b1f, 0x01a8ee20, 0x038d8078, 0x01171a01, 0x01d00568, 0x000eacfd, 0x001c321b}}}, + {X: Field{[10]uint32{0x027ee58b, 0x021e3c3d, 0x03f2ac23, 0x032b446d, 0x01a46f3b, 0x0113282f, 0x00f27b05, 0x02c73a6a, 0x024009c5, 0x00289869}}, Y: Field{[10]uint32{0x03fff888, 0x01b9043c, 0x014d420c, 0x030c1496, 0x0185da67, 0x034cf5c9, 0x029cda8f, 0x036ba6d3, 0x031d4c42, 0x000789a9}}}, + {X: Field{[10]uint32{0x01f4db57, 0x0252e9ba, 0x028846b3, 0x00f1a0bd, 0x009435aa, 0x007edb4d, 0x018e885d, 0x0210b300, 0x0167fd7f, 0x002f1c32}}, Y: Field{[10]uint32{0x00bd9468, 0x0213847e, 0x03e5718d, 0x03121f11, 0x013032ef, 0x01e195c0, 0x00a07840, 0x00b78310, 0x013a837e, 0x0028ae67}}}, + {X: Field{[10]uint32{0x0077a9c2, 0x000e269c, 0x020269c6, 0x019c4147, 0x02c7a265, 0x03ebc8d2, 0x03fdba3f, 0x00c52532, 0x02f75dc4, 0x000d9054}}, Y: Field{[10]uint32{0x0146d265, 0x0130ca81, 0x018eae08, 0x000496f3, 0x013c8fa6, 0x03b79c75, 0x038ae4e7, 0x02150cc0, 0x03d9f4ec, 0x002b0eb1}}}, + {X: Field{[10]uint32{0x00f3043d, 0x01b765a5, 0x01326cc3, 0x00be8f62, 0x01d82ca4, 0x01008b7e, 0x02f59d8e, 0x01756364, 0x00bed57d, 0x0014bfa9}}, Y: Field{[10]uint32{0x004feb35, 0x0150a363, 0x0399b249, 0x00216daa, 0x005708c6, 0x0299ece7, 0x038f9a37, 0x0229d7dc, 0x032852f9, 0x002dfa60}}}, + {X: Field{[10]uint32{0x023e1a4d, 0x035a08a1, 0x03ce67b8, 0x030f4af8, 0x039c32ec, 0x026b0ffe, 0x033a096a, 0x032203e5, 0x0110c8ba, 0x000d3fba}}, Y: Field{[10]uint32{0x009c7a17, 0x0155881a, 0x008b2243, 0x02825c74, 0x002231f6, 0x008b8983, 0x00db14b1, 0x03111b1e, 0x00969c9d, 0x00383c04}}}, + {X: Field{[10]uint32{0x0349c65b, 0x026cef76, 0x024bb401, 0x02c3d1da, 0x030f815a, 0x007c1dbd, 0x02424ec3, 0x034ba064, 0x030bf4c9, 0x001abca3}}, Y: Field{[10]uint32{0x02a45248, 0x0143fadb, 0x005d3f13, 0x03742f29, 0x0017d1e1, 0x005fd819, 0x01aa3469, 0x00ecc46a, 0x012fbb66, 0x000b157f}}}, + {X: Field{[10]uint32{0x01320e46, 0x01d3dc93, 0x0003b8bc, 0x0204eebb, 0x03a4f0ad, 0x02b174db, 0x00f1b6b6, 0x02d07991, 0x036639e4, 0x001c2daa}}, Y: Field{[10]uint32{0x02913a14, 0x02030622, 0x02c95237, 0x01777f37, 0x0196f713, 0x025b4f37, 0x01ad5f10, 0x013f3346, 0x01e64f4e, 0x003b1902}}}, + {X: Field{[10]uint32{0x0065724d, 0x00212068, 0x000bc155, 0x01a84e18, 0x03061419, 0x03df6ef8, 0x03eff50f, 0x01d6bab6, 0x03114ab9, 0x003b795b}}, Y: Field{[10]uint32{0x0336ecfc, 0x02b7f254, 0x0173c02d, 0x018dbbf7, 0x0371906b, 0x006c1a12, 0x01839dc6, 0x0087b49b, 0x024c11f4, 0x00279feb}}}, + {X: Field{[10]uint32{0x016df8a4, 0x01f0f915, 0x03efe685, 0x03e7c5a0, 0x025de54a, 0x01992399, 0x0019d746, 0x01cc40f6, 0x003c840a, 0x0020f0d3}}, Y: Field{[10]uint32{0x0086cd10, 0x035c2903, 0x0040fd31, 0x00dfc426, 0x0290aa81, 0x0338bbb4, 0x00d97719, 0x035b03bb, 0x0041562d, 0x002708e0}}}, + {X: Field{[10]uint32{0x00c7e200, 0x00164f68, 0x037c6102, 0x0114934d, 0x0052cbdb, 0x0017a1e9, 0x028cf032, 0x026e6148, 0x00900008, 0x002a8abf}}, Y: Field{[10]uint32{0x02be01f4, 0x017309e5, 0x006af2db, 0x0093fa2a, 0x006d8129, 0x00c58780, 0x013bc4fa, 0x02b0674f, 0x016ab382, 0x000d10c6}}}, + {X: Field{[10]uint32{0x0155c520, 0x01d5cc10, 0x02800e3a, 0x0116207b, 0x03e90eb0, 0x03efdc7e, 0x02956a02, 0x03322e7c, 0x03dc4310, 0x00390bb1}}, Y: Field{[10]uint32{0x0225336c, 0x0099e735, 0x027b693c, 0x011562af, 0x012d0009, 0x02369536, 0x00324bbe, 0x02473f88, 0x02cfa52d, 0x0024e7bc}}}, + {X: Field{[10]uint32{0x02ec2b21, 0x0315818c, 0x01dd34a3, 0x02ac99ff, 0x00181617, 0x005bbe7d, 0x038de47a, 0x014803f5, 0x0124937c, 0x002f02f7}}, Y: Field{[10]uint32{0x02b63035, 0x034a64d4, 0x03ac9df6, 0x00448175, 0x004a0285, 0x024ac21c, 0x02e0e1d1, 0x0087de61, 0x024c10b5, 0x00036c12}}}, + {X: Field{[10]uint32{0x01adc8e7, 0x013aebab, 0x03990626, 0x03559037, 0x0155c005, 0x03dd838a, 0x0310fbb3, 0x029ccd78, 0x01d89b43, 0x00372232}}, Y: Field{[10]uint32{0x002fc512, 0x00f2353f, 0x0163625a, 0x00cb308f, 0x033fe37b, 0x027faded, 0x03fc6777, 0x011e5196, 0x01e46f98, 0x000b59de}}}, + {X: Field{[10]uint32{0x00111c20, 0x0278d260, 0x03210f6f, 0x01422315, 0x035ee3dc, 0x00175dbb, 0x030cb02e, 0x00cb18bf, 0x018ab0c9, 0x0029eb83}}, Y: Field{[10]uint32{0x02e553a2, 0x001f6864, 0x03cdd01d, 0x0115a48c, 0x03ac8dcc, 0x00c87794, 0x039dc94b, 0x018b2262, 0x03c9d631, 0x00358caa}}}, + {X: Field{[10]uint32{0x00be0e97, 0x0296b317, 0x03215592, 0x026e97c0, 0x00d631ac, 0x01f69b99, 0x0203af75, 0x01baaf6c, 0x036ee7bd, 0x00118808}}, Y: Field{[10]uint32{0x00627c6e, 0x025da40a, 0x018c88fa, 0x02f1c0a3, 0x02707851, 0x03eb99a8, 0x0330cdf4, 0x0078a9b3, 0x004f69ea, 0x00177d09}}}, + {X: Field{[10]uint32{0x03d8f671, 0x036647c9, 0x00a38e2b, 0x03fcd276, 0x015cd35f, 0x03e4c8c0, 0x0350acac, 0x0364c147, 0x004a3d8b, 0x0020132e}}, Y: Field{[10]uint32{0x00ae8d3f, 0x026a391c, 0x01267bbc, 0x014aef9b, 0x00cdc395, 0x000d884a, 0x02b2f192, 0x03e0d65a, 0x00129ee0, 0x0012ddee}}}, + {X: Field{[10]uint32{0x011c2ed2, 0x0076ef6e, 0x032378e7, 0x01343881, 0x02b4f6fb, 0x02918e44, 0x001fcbee, 0x02cbcae0, 0x030f5382, 0x001ba94d}}, Y: Field{[10]uint32{0x00b2d88d, 0x02f85064, 0x025b1a8b, 0x038b4de0, 0x008b513e, 0x006567b2, 0x012a002f, 0x03fc203a, 0x0109d8f3, 0x003d6d3e}}}, + {X: Field{[10]uint32{0x02e22ba6, 0x031c1ca8, 0x01f4769f, 0x000ee068, 0x031ee564, 0x03d871ac, 0x03b0852a, 0x01d6984a, 0x021c4ff5, 0x00362e37}}, Y: Field{[10]uint32{0x02468c0e, 0x00e37d38, 0x018928d5, 0x032d1ec1, 0x01f23cbd, 0x017095b9, 0x02ad8275, 0x02fe2625, 0x0190d37a, 0x00078f10}}}, + {X: Field{[10]uint32{0x01f1b147, 0x0320a47b, 0x00a9e475, 0x019c1420, 0x0080d384, 0x00e8035b, 0x033f3ea4, 0x02f5ba71, 0x006404a0, 0x0019ab06}}, Y: Field{[10]uint32{0x03a1260e, 0x02207313, 0x030bca61, 0x0319cf6a, 0x029be98e, 0x0147868d, 0x0103efd5, 0x02ddd805, 0x000f7db6, 0x000b3183}}}, + {X: Field{[10]uint32{0x0360e942, 0x0314d9cf, 0x0185bef3, 0x00d70dd7, 0x02f27844, 0x022d6972, 0x0263cf93, 0x008f9c1d, 0x022c4ed2, 0x0011c652}}, Y: Field{[10]uint32{0x03d9f920, 0x01213034, 0x036045f4, 0x033aaf7d, 0x035808a3, 0x01409f55, 0x032738c7, 0x03704def, 0x011b5a64, 0x002c3f78}}}, + {X: Field{[10]uint32{0x024c6186, 0x034f3d0a, 0x0229010b, 0x00ab17c1, 0x009fdc1b, 0x02375da3, 0x02747428, 0x03660e20, 0x00599af2, 0x00045072}}, Y: Field{[10]uint32{0x02f0226e, 0x014234fb, 0x02c64d6b, 0x034aea63, 0x005392a0, 0x015e343e, 0x017555a0, 0x01184ccc, 0x034761ed, 0x001e90c7}}}, + {X: Field{[10]uint32{0x03496f79, 0x00c030f9, 0x0251d4ba, 0x03585ab1, 0x01487002, 0x03ee3952, 0x01da689b, 0x03fa7b59, 0x01d8e80a, 0x003e416f}}, Y: Field{[10]uint32{0x03bfcf72, 0x0096c65d, 0x000fca7e, 0x0317e7d3, 0x03cd999f, 0x01fc1419, 0x021b03ba, 0x01411751, 0x037f3bfb, 0x0007b1ef}}}, + {X: Field{[10]uint32{0x0315e9e0, 0x03c7eb03, 0x023e5573, 0x00beb51e, 0x00232ea6, 0x0053c2be, 0x004faadb, 0x014bb88f, 0x00e4fba4, 0x002e952e}}, Y: Field{[10]uint32{0x00f5cda8, 0x02f52818, 0x030b8da1, 0x002c044d, 0x039c96ed, 0x00ab203c, 0x018e48a8, 0x02ef36ef, 0x02e9efca, 0x002bd55a}}}, + {X: Field{[10]uint32{0x0226a80a, 0x028a2d02, 0x035e9c08, 0x01080e9d, 0x001494a0, 0x00d868ad, 0x0287f3cf, 0x01b890c3, 0x02d0561f, 0x001674fa}}, Y: Field{[10]uint32{0x000a9bc8, 0x007863c0, 0x015d9ac5, 0x00730b42, 0x02f5f1ba, 0x009f1cc1, 0x00a278d4, 0x0088a70a, 0x007d50a9, 0x0026c9bd}}}, + {X: Field{[10]uint32{0x00865d47, 0x03641c2b, 0x00f5b129, 0x0023bfc0, 0x0315520a, 0x01f83cf3, 0x032924be, 0x0324a363, 0x023fab4c, 0x000a9b96}}, Y: Field{[10]uint32{0x00a625a5, 0x01dc60d7, 0x000cb38b, 0x037ba4e0, 0x00919913, 0x01824d47, 0x01191964, 0x01c08e1b, 0x03505872, 0x00015700}}}, + {X: Field{[10]uint32{0x00907502, 0x022c00aa, 0x03d84682, 0x00716aba, 0x01fff1fb, 0x010b3d96, 0x00afe918, 0x03b90422, 0x00d1c35b, 0x002263d4}}, Y: Field{[10]uint32{0x02f3267b, 0x02e3e3d8, 0x01a79daf, 0x03c528f1, 0x02fc9bd0, 0x01ae1300, 0x0202e490, 0x00ab406b, 0x0280c97c, 0x002c915b}}}, + {X: Field{[10]uint32{0x016af85a, 0x03119c43, 0x03bf9422, 0x028eb013, 0x03bda5d9, 0x027b8f34, 0x01d2304e, 0x03c32c7e, 0x02b8b49b, 0x00346152}}, Y: Field{[10]uint32{0x03155c20, 0x03fafa51, 0x03fabd0a, 0x00085f7d, 0x00d7bdeb, 0x00fb77cd, 0x016a0775, 0x0206016c, 0x000fd881, 0x00013894}}}, + {X: Field{[10]uint32{0x02af4680, 0x037f19bf, 0x01303a3e, 0x03d0a15b, 0x024a417d, 0x025a3bdf, 0x03cc787d, 0x02db87c0, 0x008a394d, 0x002187ee}}, Y: Field{[10]uint32{0x02135da6, 0x0348d882, 0x018dddc6, 0x022f6f00, 0x0268f3c3, 0x018e3380, 0x03ff11b0, 0x002c4c8f, 0x015aab8b, 0x002975fa}}}, + {X: Field{[10]uint32{0x013403d6, 0x033d8b60, 0x0111cb0c, 0x000ce7f0, 0x03ea5269, 0x019db3de, 0x0155d90b, 0x0277f0f0, 0x0368b9fa, 0x0025513d}}, Y: Field{[10]uint32{0x006e047f, 0x02659c20, 0x0290253e, 0x000d78c0, 0x0328d876, 0x02fd4552, 0x011ed21b, 0x01893c21, 0x012fcbde, 0x0033b136}}}, + {X: Field{[10]uint32{0x01db68e9, 0x01732a34, 0x009ba2cb, 0x0034edc5, 0x00311cd4, 0x027ce825, 0x00d7b078, 0x019af88f, 0x0192f80a, 0x003ddc88}}, Y: Field{[10]uint32{0x001b516e, 0x03bf83f2, 0x03462d40, 0x00809dfd, 0x011c11e3, 0x03321479, 0x02266610, 0x035939cf, 0x029f3243, 0x00010743}}}, + {X: Field{[10]uint32{0x018e14ed, 0x0381eb5a, 0x02fc1be9, 0x01f10e7d, 0x01b6bd8e, 0x027aa479, 0x039927a8, 0x01ca6f6f, 0x00651f88, 0x0021dad3}}, Y: Field{[10]uint32{0x016b49da, 0x00c7773e, 0x004e16ad, 0x02121aae, 0x037b5730, 0x018bc94d, 0x0387b88f, 0x03a7773d, 0x03811cfa, 0x003b38b3}}}, + {X: Field{[10]uint32{0x03b70b10, 0x032c0f01, 0x03127b7e, 0x03d8cd4e, 0x00721be8, 0x0245e267, 0x00614278, 0x02649221, 0x00e46224, 0x001c1abd}}, Y: Field{[10]uint32{0x0258a5f3, 0x0141ba5f, 0x03545aa6, 0x0383984b, 0x00cdcf0e, 0x004f7add, 0x015bd298, 0x0348039a, 0x01720c65, 0x00325cb6}}}, + {X: Field{[10]uint32{0x03863c9d, 0x0256df7c, 0x03ddef14, 0x016fe745, 0x024301b7, 0x009f97d2, 0x00dde0ba, 0x01898ad7, 0x0218c9c9, 0x0033a5e8}}, Y: Field{[10]uint32{0x02a1ef10, 0x01c2b280, 0x03f55c57, 0x02c9cac0, 0x01c12900, 0x01ebda3c, 0x0116410d, 0x00509a22, 0x021a20fd, 0x003a4e63}}}, + {X: Field{[10]uint32{0x013be895, 0x03991275, 0x019bca8f, 0x03afa6cf, 0x037dae0f, 0x00b6cf54, 0x02a1f01c, 0x020c7a21, 0x039a92cf, 0x003ed896}}, Y: Field{[10]uint32{0x02599a37, 0x0165f7a0, 0x0344c30d, 0x030a9947, 0x031fe2a8, 0x00b2fc88, 0x029d68f1, 0x02781028, 0x0274ba56, 0x001fde0f}}}, + {X: Field{[10]uint32{0x01f4747d, 0x00b16955, 0x01bc4c6b, 0x03ced0b7, 0x02f126c6, 0x020cc912, 0x039098a8, 0x00ae2d46, 0x03697a7d, 0x00207fef}}, Y: Field{[10]uint32{0x0006f33b, 0x000858bc, 0x00d0a8b0, 0x037b43f5, 0x0190b4d1, 0x0336aa9f, 0x013d5303, 0x03bedcc8, 0x0357982e, 0x0038b19c}}}, + {X: Field{[10]uint32{0x020ed0e4, 0x00c6d55a, 0x01ba8c0f, 0x01def9a5, 0x00679d6b, 0x002728bb, 0x016d4d63, 0x02adf2bc, 0x03668c30, 0x001b7f03}}, Y: Field{[10]uint32{0x015a563c, 0x03fe1f6c, 0x03d905ae, 0x00e2ff77, 0x01367724, 0x003d107a, 0x002d7a62, 0x02a9d0c6, 0x02b2d9a0, 0x002907b4}}}, + {X: Field{[10]uint32{0x03501b44, 0x03e530ce, 0x0023fe77, 0x037e22f3, 0x001d5715, 0x03d8f0ca, 0x01a9b5b0, 0x0395aae8, 0x01d1b953, 0x00071afc}}, Y: Field{[10]uint32{0x00e4b0ef, 0x00d82279, 0x02d3a8e3, 0x037e4688, 0x028f1e74, 0x01f0ae92, 0x01c368bf, 0x005e0806, 0x014db4ca, 0x003199c8}}}, + {X: Field{[10]uint32{0x02def93d, 0x03f491fe, 0x00ba6b2a, 0x03c3479e, 0x035417b9, 0x005134bc, 0x00632319, 0x027d8176, 0x02df5d99, 0x002da444}}, Y: Field{[10]uint32{0x018df4ae, 0x00d318d5, 0x020209a0, 0x01722508, 0x00464f11, 0x02b2b77b, 0x00fafeb8, 0x021b9c1c, 0x037a3028, 0x000858f3}}}, + {X: Field{[10]uint32{0x0176b6e0, 0x0192f792, 0x0287cda4, 0x03363805, 0x019737a2, 0x027be48a, 0x018b8fcf, 0x003e45f1, 0x0332ac23, 0x002f00e1}}, Y: Field{[10]uint32{0x025682d2, 0x007011a8, 0x00ab3719, 0x03677d8e, 0x017a7ae0, 0x01f88ce1, 0x03e1d6fa, 0x018dcd80, 0x02010079, 0x0000ce49}}}, + {X: Field{[10]uint32{0x03e32d81, 0x00faf689, 0x001ae183, 0x0032b7b4, 0x007489c2, 0x0166ec03, 0x024d9aee, 0x02b531aa, 0x02951047, 0x0025b7cc}}, Y: Field{[10]uint32{0x02e2034b, 0x02313bf8, 0x00466181, 0x03c7999d, 0x02cbfaa8, 0x01743c19, 0x01189bbf, 0x018cf060, 0x002d74ce, 0x001063db}}}, + {X: Field{[10]uint32{0x02304979, 0x034be9da, 0x001d263c, 0x03e8bcd4, 0x01cb6a65, 0x02d864f0, 0x02fcefde, 0x0102afb1, 0x0227939e, 0x0028f14c}}, Y: Field{[10]uint32{0x03c967e4, 0x0283b5b6, 0x00de8caf, 0x02637180, 0x0300f467, 0x01e8bd99, 0x0329ade3, 0x029bc64b, 0x02a5498e, 0x00111a32}}}, + {X: Field{[10]uint32{0x0145eb2b, 0x02bc2b49, 0x01a92601, 0x011ae475, 0x017a0c7d, 0x0385ca98, 0x005f1b31, 0x01b5b5ae, 0x02073dfd, 0x0024ff60}}, Y: Field{[10]uint32{0x0163a847, 0x025f51f5, 0x02866883, 0x026c82e2, 0x03961155, 0x02b3faec, 0x03ca8636, 0x01a9046f, 0x02c19a8a, 0x001806fa}}}, + {X: Field{[10]uint32{0x02ca0a9b, 0x01e82ea1, 0x00a2bee8, 0x027ad179, 0x01a5bc0d, 0x011a2b63, 0x039acef2, 0x018fc403, 0x03ef2e2c, 0x002e9f4e}}, Y: Field{[10]uint32{0x015114dc, 0x03bf2ba9, 0x02e097c6, 0x02c5eefc, 0x01376f29, 0x0316daf6, 0x0133ed0b, 0x0278c443, 0x02673312, 0x003fffe6}}}, + {X: Field{[10]uint32{0x036157a8, 0x010a4380, 0x03011190, 0x03ea5fbc, 0x00218898, 0x025935e9, 0x01972582, 0x0270d65d, 0x01c02a4f, 0x00383655}}, Y: Field{[10]uint32{0x01c617f0, 0x02ee6140, 0x0397baa2, 0x01a75699, 0x01b28cbc, 0x021c1de2, 0x0382f0f0, 0x002ee681, 0x039e7d42, 0x0005dbf7}}}, + {X: Field{[10]uint32{0x03f81ac9, 0x0111d42f, 0x02dcd0a4, 0x03f785d4, 0x036cd226, 0x01a435aa, 0x02da689c, 0x032e4c44, 0x01408320, 0x0005acb0}}, Y: Field{[10]uint32{0x018bb281, 0x031de436, 0x01edd2ab, 0x02494f19, 0x025025f7, 0x02a85edb, 0x0217488f, 0x00e4cbc9, 0x00e3dafd, 0x000a8beb}}}, + {X: Field{[10]uint32{0x01f502da, 0x00af043a, 0x020c7fc2, 0x02e3ad36, 0x02220db4, 0x02569053, 0x01d61d97, 0x00f8bd91, 0x00329c82, 0x000beec1}}, Y: Field{[10]uint32{0x00ebc31d, 0x02d89664, 0x00246a0a, 0x0239a7d6, 0x030cbfe5, 0x021c1a2a, 0x03cda69c, 0x0377eeae, 0x02ef15ea, 0x0006b7d9}}}, + {X: Field{[10]uint32{0x03208ebf, 0x00b79399, 0x01ccce13, 0x020e3277, 0x02c178f8, 0x00135915, 0x0122f2f4, 0x0095e6d9, 0x00daf42d, 0x0019244d}}, Y: Field{[10]uint32{0x009355cb, 0x015b0efc, 0x00e8a4a7, 0x0147f991, 0x02e7709b, 0x02a6ba96, 0x00446480, 0x012f09e2, 0x03fc3c55, 0x0010e16a}}}, + {X: Field{[10]uint32{0x013991cd, 0x03b7e2c3, 0x03023dbc, 0x02c2e264, 0x03128d62, 0x0271ff7b, 0x0201c172, 0x007e7381, 0x00b1dcb8, 0x002e5551}}, Y: Field{[10]uint32{0x029dcd2a, 0x0314e0dd, 0x02b0f33c, 0x01824f02, 0x03206fe7, 0x013c1c9b, 0x01f2d450, 0x0378cb54, 0x02dcffba, 0x003e1c7e}}}, + {X: Field{[10]uint32{0x01d668de, 0x00f03297, 0x0389fd06, 0x005c0a23, 0x02ace1ea, 0x012c6c25, 0x03df5b4a, 0x03430288, 0x03fc5034, 0x0033500e}}, Y: Field{[10]uint32{0x02717742, 0x0387f509, 0x0316054e, 0x01529763, 0x023fa92e, 0x00e92fc3, 0x0359760f, 0x03d1bd27, 0x0131aa56, 0x00304a58}}}, + {X: Field{[10]uint32{0x0004c581, 0x03a91e0f, 0x019394b6, 0x01e656d3, 0x021ad784, 0x026a3d5a, 0x0202074c, 0x02f72640, 0x0337d7f8, 0x000292ab}}, Y: Field{[10]uint32{0x0316da34, 0x00d234eb, 0x03431009, 0x032ce22b, 0x031a8cb9, 0x001dcf5c, 0x02594f94, 0x02d873f4, 0x02f2dc02, 0x00132ced}}}, + {X: Field{[10]uint32{0x03f438c4, 0x01f67e2a, 0x039376c3, 0x031f9b9e, 0x0297478f, 0x021915e3, 0x02dd3c52, 0x00123a17, 0x03f8ebdf, 0x0015c40b}}, Y: Field{[10]uint32{0x00161d4f, 0x00763bbe, 0x01128833, 0x005a42ad, 0x01915aef, 0x0146cbcc, 0x01e308c2, 0x00658b9e, 0x019beaec, 0x003213c7}}}, + {X: Field{[10]uint32{0x03c9b6ac, 0x02c188e8, 0x01774832, 0x02171a02, 0x01124246, 0x03ebf1c0, 0x00c08c58, 0x017f8442, 0x00e93c5c, 0x001a3fa6}}, Y: Field{[10]uint32{0x004df273, 0x02033e43, 0x01cd4d64, 0x023fba1c, 0x03cb5ea5, 0x011bc878, 0x00078e2c, 0x01ae1fba, 0x0017fd95, 0x00124ab1}}}, + {X: Field{[10]uint32{0x024a5e77, 0x022f900a, 0x03d43ec0, 0x028ac224, 0x03d97bae, 0x00bba92a, 0x0132cef0, 0x0388ebc2, 0x03b69ef5, 0x0000352e}}, Y: Field{[10]uint32{0x03c7c98c, 0x03e92c11, 0x00166607, 0x0130a8b7, 0x019e7488, 0x00334231, 0x01e223df, 0x02b8c7d9, 0x02609c1d, 0x00016063}}}, + {X: Field{[10]uint32{0x0283192a, 0x01f9a416, 0x03b5d68c, 0x00fdd8fc, 0x0123a5c5, 0x022b314f, 0x00d872f2, 0x022dc9fc, 0x0157a8eb, 0x003a589e}}, Y: Field{[10]uint32{0x010d984f, 0x026ea1f3, 0x008d66e5, 0x015d3d68, 0x020cab10, 0x01329b32, 0x0066d17d, 0x005a5b65, 0x027ddc29, 0x00176a4b}}}, + {X: Field{[10]uint32{0x0311caf5, 0x008e0bc5, 0x032076dd, 0x03cb7e0f, 0x001cd547, 0x003e7fa1, 0x0108ffb7, 0x03cbadf1, 0x00ada83b, 0x00127c87}}, Y: Field{[10]uint32{0x01f31931, 0x022497ce, 0x00114ca1, 0x00693fb6, 0x03244761, 0x00cb9bbf, 0x033afc21, 0x013b62b1, 0x01295f83, 0x00071f60}}}, + {X: Field{[10]uint32{0x02fa792e, 0x034060ab, 0x0364dfd6, 0x03316c3f, 0x006c34a8, 0x0061c4f5, 0x011d110c, 0x00754c53, 0x02a940f6, 0x000160a0}}, Y: Field{[10]uint32{0x005f6ddd, 0x03c28d04, 0x0091e677, 0x0124fab0, 0x012a96ee, 0x0360f5f7, 0x03701457, 0x03cb5948, 0x0155d3e0, 0x001e1578}}}, + {X: Field{[10]uint32{0x03ca118d, 0x01a46648, 0x012e5f55, 0x039d0f52, 0x01dc3a14, 0x01c2fb1f, 0x01db6f1d, 0x0009e9ed, 0x02324b07, 0x0032725e}}, Y: Field{[10]uint32{0x0264b56d, 0x035d31a5, 0x001e8747, 0x03678bb1, 0x0115d600, 0x03080cae, 0x031e99f7, 0x037f870a, 0x000f894d, 0x003d807d}}}, + {X: Field{[10]uint32{0x019e054e, 0x00568845, 0x0062b8d5, 0x0332a9ca, 0x039bbbe0, 0x0047e49c, 0x027bcdda, 0x01d4061a, 0x01758ed6, 0x00279370}}, Y: Field{[10]uint32{0x03c6c0ab, 0x020e04f3, 0x03d3bc94, 0x0321c57a, 0x03fcf4f4, 0x026df8db, 0x00736aa1, 0x019a9af8, 0x031f2bb8, 0x00328470}}}, + {X: Field{[10]uint32{0x02afe2b5, 0x03c31ae2, 0x0152f7a7, 0x03d89a3d, 0x028e5af1, 0x0337ef76, 0x00c1e5e8, 0x000c2f36, 0x03893ae0, 0x003f418d}}, Y: Field{[10]uint32{0x01c8e676, 0x008754c3, 0x00435b2e, 0x02037c68, 0x01f4a354, 0x00c9b700, 0x0068a8e4, 0x01d12881, 0x030b068d, 0x0023027a}}}, + {X: Field{[10]uint32{0x014af04e, 0x00ac9cbf, 0x02c77b3f, 0x02d6d19b, 0x00d85360, 0x004ddd60, 0x0281c3ec, 0x01d9466e, 0x033b6e7a, 0x000df7f7}}, Y: Field{[10]uint32{0x00fb7844, 0x02d3e3b4, 0x01727ea3, 0x0217b250, 0x03043dcd, 0x0004a79d, 0x00f3b078, 0x009d635e, 0x03b27b73, 0x00330c4d}}}, + {X: Field{[10]uint32{0x001dbae0, 0x0291751b, 0x018ffe72, 0x0127785b, 0x010a69cb, 0x034af832, 0x01a2f18b, 0x038971dc, 0x006ac8a5, 0x00117bc4}}, Y: Field{[10]uint32{0x020ab158, 0x022da608, 0x00bf42ad, 0x006cc646, 0x0060e568, 0x00058d24, 0x03bd452e, 0x01f6dcfd, 0x000d742e, 0x0032b5a9}}}, + {X: Field{[10]uint32{0x01fdfca4, 0x0091a704, 0x02d14be0, 0x036f0414, 0x0099648c, 0x011cafd6, 0x03cde710, 0x0328941c, 0x02f988b9, 0x00096314}}, Y: Field{[10]uint32{0x01939dfd, 0x02be7b0a, 0x00ffc359, 0x02e20e53, 0x010d60d0, 0x0296d87f, 0x026c9e21, 0x0171f1a9, 0x008b26ea, 0x00112476}}}, + {X: Field{[10]uint32{0x01e65217, 0x014464ea, 0x01c83afd, 0x019f7a20, 0x01d4f8ff, 0x034dbc76, 0x00cddb90, 0x0138d8f4, 0x00a7727c, 0x002f24a9}}, Y: Field{[10]uint32{0x03aa5120, 0x004c4898, 0x039d79dd, 0x02d2e8dd, 0x00331c22, 0x01193a70, 0x031c024d, 0x011e5587, 0x0208b18b, 0x001dbfda}}}, + {X: Field{[10]uint32{0x01f27ebd, 0x0304b451, 0x03353249, 0x00dfed7f, 0x0223e4e8, 0x03055aef, 0x01ceccb0, 0x0120d3c4, 0x00c258c0, 0x0022867a}}, Y: Field{[10]uint32{0x00e92c1a, 0x017941f9, 0x01f065d6, 0x032e1706, 0x018f50a9, 0x02e5e3f8, 0x016caca2, 0x023a8831, 0x0070bff4, 0x00057f1b}}}, + {X: Field{[10]uint32{0x01d70eea, 0x02447a95, 0x00572d9c, 0x02a30a91, 0x03e6f3b1, 0x00e65a2f, 0x013c1a7a, 0x00d136c4, 0x02d1ab90, 0x003966e0}}, Y: Field{[10]uint32{0x013b91be, 0x00abf20c, 0x00b80cc2, 0x02640205, 0x036634d6, 0x00baa9db, 0x01f0bc01, 0x01a86f93, 0x018cd58c, 0x002478cf}}}, + {X: Field{[10]uint32{0x0371a7d0, 0x000c6c1c, 0x03eb3330, 0x034976b2, 0x020f3456, 0x03e506fa, 0x0017db72, 0x01335af1, 0x025f8824, 0x003e653b}}, Y: Field{[10]uint32{0x019c62e2, 0x0102816b, 0x03d40514, 0x027d09c1, 0x03d9c268, 0x036b923d, 0x02bf9c04, 0x0266ccc0, 0x006aecc2, 0x002409be}}}, + {X: Field{[10]uint32{0x0000410f, 0x00e9a4de, 0x015ffc1e, 0x03355976, 0x018000cc, 0x0200f448, 0x0317bc79, 0x03e9409e, 0x008c32d1, 0x001ddb13}}, Y: Field{[10]uint32{0x00785149, 0x03c2eb72, 0x03803165, 0x0298e104, 0x01988b64, 0x00f4f8c6, 0x00201d50, 0x01dce1be, 0x0234438e, 0x00103b38}}}, + {X: Field{[10]uint32{0x01c9b12e, 0x00feb96d, 0x02620fb8, 0x022b1780, 0x0032c196, 0x02fc95cc, 0x00aea3d8, 0x02c004a7, 0x01a5dd13, 0x000e4d9d}}, Y: Field{[10]uint32{0x035a8b00, 0x0129a7e9, 0x02dc0378, 0x01cd39d0, 0x032e5dc7, 0x02c3af30, 0x016ff4c4, 0x00033bb4, 0x03c47934, 0x000e79b3}}}, + {X: Field{[10]uint32{0x03401b1e, 0x027ea330, 0x00eaa2f0, 0x03c9efce, 0x0094dcfd, 0x0242f87f, 0x01de130e, 0x031ed8b3, 0x029422ed, 0x0035f374}}, Y: Field{[10]uint32{0x014fb184, 0x031c194d, 0x00302db5, 0x03662fc5, 0x020728bd, 0x031e7ad1, 0x00ca141d, 0x03462edd, 0x0328073c, 0x00372e72}}}, + {X: Field{[10]uint32{0x0256bc2c, 0x019f73db, 0x021b99cb, 0x01ea6216, 0x01902613, 0x00925274, 0x02206718, 0x011278fd, 0x01272726, 0x002f38fc}}, Y: Field{[10]uint32{0x02e76217, 0x0355e1b9, 0x0097d296, 0x01f714a9, 0x011c33c3, 0x02b4496b, 0x0168f040, 0x037692fa, 0x0017ee92, 0x00290900}}}, + {X: Field{[10]uint32{0x035d6e52, 0x037ba5ff, 0x01eb9738, 0x00ddd0e6, 0x03700801, 0x0078d7eb, 0x02daf442, 0x010529e6, 0x00cdefe9, 0x00277c26}}, Y: Field{[10]uint32{0x01abf15d, 0x0223ae94, 0x01baf3b7, 0x02d36fbc, 0x03f04bf4, 0x01a45f65, 0x0317bb80, 0x0250f343, 0x035fef36, 0x001afe48}}}, + {X: Field{[10]uint32{0x03d43f1d, 0x0332536c, 0x02522e8d, 0x02d1c888, 0x0005d88a, 0x0249c4e8, 0x00839a82, 0x03712a69, 0x002ee561, 0x00265616}}, Y: Field{[10]uint32{0x028c226a, 0x013a2341, 0x00dc78cb, 0x02cd0ed7, 0x02850008, 0x00966cde, 0x0376cba2, 0x03c8fa1b, 0x0214b63a, 0x00382562}}}, + {X: Field{[10]uint32{0x01fb1f24, 0x024cf11b, 0x02871bad, 0x01e548ce, 0x03dda933, 0x02230122, 0x0292447c, 0x009e79f4, 0x00ce7d7b, 0x000f9fee}}, Y: Field{[10]uint32{0x008806e5, 0x01bb2b59, 0x0309d229, 0x02aa4e17, 0x02e36352, 0x001ae92f, 0x037a5dd9, 0x0208e4b5, 0x01083410, 0x000109e7}}}, + {X: Field{[10]uint32{0x01e8ed62, 0x0029a8dd, 0x001c71ac, 0x01a7f2da, 0x0097611d, 0x0209b3d6, 0x02c93ee7, 0x01684433, 0x0050f740, 0x00073415}}, Y: Field{[10]uint32{0x0334d0f0, 0x02880eeb, 0x0136b039, 0x017264c6, 0x025759d3, 0x002e54db, 0x020a3a02, 0x02c10358, 0x0070bb52, 0x000216ef}}}, + {X: Field{[10]uint32{0x03c9b367, 0x02b6fdf5, 0x005e3c76, 0x03283ed3, 0x0393cf99, 0x02e040cb, 0x0387bd01, 0x0168f7db, 0x03763214, 0x0001411d}}, Y: Field{[10]uint32{0x03d1d2c3, 0x01820115, 0x03f7a1ed, 0x008e2132, 0x00a0e67b, 0x031c7d06, 0x02b97ce6, 0x01ddc627, 0x0359919c, 0x0001eeb7}}}, + {X: Field{[10]uint32{0x0070e6ea, 0x03de8391, 0x030be636, 0x00afdfcb, 0x0079fd30, 0x03452629, 0x01b8d87a, 0x012ea0c2, 0x02c949b6, 0x0007aa44}}, Y: Field{[10]uint32{0x002b7650, 0x0021b401, 0x02b4d029, 0x039b3e0e, 0x014acd50, 0x0140aba3, 0x014896d3, 0x00477a10, 0x03dd0b12, 0x0026c9e7}}}, + {X: Field{[10]uint32{0x01a01628, 0x00c0a3c8, 0x007ac8c0, 0x026f4bd3, 0x03e1ed32, 0x017c0f12, 0x00e0b009, 0x001daf2d, 0x00d34b00, 0x0026cfe8}}, Y: Field{[10]uint32{0x03d420de, 0x02549f09, 0x01f4126e, 0x035543bf, 0x038cef81, 0x033b1987, 0x00d5dcb0, 0x023bd4b8, 0x0248b2a5, 0x0004045e}}}, + {X: Field{[10]uint32{0x024c94eb, 0x01e3f020, 0x03e22ff6, 0x00a34095, 0x036200d1, 0x02eb4530, 0x02c7f7f5, 0x027712ce, 0x03b801d3, 0x00197fbd}}, Y: Field{[10]uint32{0x0308b475, 0x026bc249, 0x032fe325, 0x03b1e80a, 0x02f2dcd6, 0x01bbc9db, 0x0373b9b3, 0x013f09dc, 0x01ee680c, 0x000c0878}}}, + {X: Field{[10]uint32{0x0385f9ac, 0x00a45fdf, 0x01d46c5a, 0x02ee3f7b, 0x036ef5e1, 0x030afbd6, 0x004c0f2b, 0x00e95419, 0x023daf76, 0x000f9dec}}, Y: Field{[10]uint32{0x024f3221, 0x02cf930a, 0x0021b415, 0x021443f4, 0x018d4fc7, 0x00b6cb1e, 0x03f0766a, 0x01e1e671, 0x00e95bb0, 0x00156c9e}}}, + {X: Field{[10]uint32{0x01de2965, 0x023022c8, 0x0378396f, 0x0228c8cb, 0x02f69fbf, 0x0335f4d4, 0x0215fba1, 0x0248af11, 0x02bf2fec, 0x000ab136}}, Y: Field{[10]uint32{0x019f957f, 0x03cfab08, 0x0089fa92, 0x00947bfc, 0x006d6494, 0x03e16946, 0x03e60187, 0x022f3c0a, 0x00177623, 0x000b0cf0}}}, + {X: Field{[10]uint32{0x0162c66e, 0x0150a153, 0x0155868d, 0x03c65f8c, 0x03748be0, 0x00acb3ae, 0x01feac74, 0x00134215, 0x022067da, 0x003faf22}}, Y: Field{[10]uint32{0x01d96083, 0x012a3499, 0x03bd1a55, 0x01b6898a, 0x01e3db34, 0x004169dc, 0x029d583e, 0x0398ffe6, 0x02873d45, 0x002bb8e4}}}, + {X: Field{[10]uint32{0x0206a569, 0x023da261, 0x038d3e1c, 0x000b7138, 0x02026542, 0x01715006, 0x002d10bd, 0x009d4623, 0x00b4a598, 0x0029045d}}, Y: Field{[10]uint32{0x03732a00, 0x0021fa47, 0x0367e3bd, 0x00be3643, 0x016b589f, 0x020ad947, 0x0165337e, 0x03e17b1a, 0x03b99fb5, 0x002f1ad8}}}, + {X: Field{[10]uint32{0x025de220, 0x02919396, 0x02ae93a3, 0x0134f2bc, 0x02907c19, 0x004bdd26, 0x0397fc6d, 0x028ebcee, 0x02cf5d10, 0x00048865}}, Y: Field{[10]uint32{0x0304e533, 0x031ba4a4, 0x032b946f, 0x03175016, 0x01674697, 0x02508ff7, 0x00e2c7c5, 0x03884d51, 0x0342b3c1, 0x00333d19}}}, + {X: Field{[10]uint32{0x021eadb3, 0x02d98f0b, 0x0373e799, 0x0187a38e, 0x019f93ec, 0x03219dd8, 0x03bfaa08, 0x03731f86, 0x01cb0104, 0x001deeb5}}, Y: Field{[10]uint32{0x02faa3cc, 0x03a18271, 0x00fea411, 0x02317bc2, 0x014023fd, 0x03c948bb, 0x021214dd, 0x037afd23, 0x007bad8b, 0x0002225d}}}, + {X: Field{[10]uint32{0x02d4a98b, 0x005faec4, 0x015d2f55, 0x0225a578, 0x024e3f6c, 0x00cc9f9b, 0x01451637, 0x02b505ab, 0x00758c49, 0x0007a350}}, Y: Field{[10]uint32{0x023b09f4, 0x01a05803, 0x01cd1259, 0x02835220, 0x0398d94a, 0x032f13e0, 0x03379a2e, 0x02986726, 0x00b00730, 0x000745b3}}}, + {X: Field{[10]uint32{0x03b6ee42, 0x01a7e97e, 0x028cfb18, 0x02b3d280, 0x01880ff2, 0x03ed6d4d, 0x03f4974a, 0x01077521, 0x016b2402, 0x00321e99}}, Y: Field{[10]uint32{0x02757beb, 0x02bfdc2f, 0x01cb76dd, 0x02a2d326, 0x0134f694, 0x029a9e43, 0x0174412f, 0x0254e17b, 0x033a6fac, 0x0005bc97}}}, + {X: Field{[10]uint32{0x0355a4eb, 0x02f67092, 0x03b8071f, 0x005b9ce4, 0x01669adf, 0x03385a81, 0x0369944c, 0x01ba23a5, 0x0007482c, 0x0025ac05}}, Y: Field{[10]uint32{0x00b50223, 0x02fffee5, 0x00ca4578, 0x03886c5e, 0x0082b786, 0x021a2006, 0x00d68de3, 0x0213c382, 0x02805903, 0x002ccaf8}}}, + {X: Field{[10]uint32{0x01ae4af5, 0x02fe211b, 0x01eff7eb, 0x01888b87, 0x00b2afd1, 0x01b423d5, 0x0272fb74, 0x018b9a07, 0x00b37395, 0x000483da}}, Y: Field{[10]uint32{0x000bcc78, 0x0305a40c, 0x00743ded, 0x02758572, 0x0102f4da, 0x03643853, 0x03c6729b, 0x01dbe51d, 0x034f2b23, 0x001f07ad}}}, + {X: Field{[10]uint32{0x02acd157, 0x03177139, 0x00989b65, 0x0074a170, 0x0049a441, 0x00923fba, 0x008be2cf, 0x02d15618, 0x01ec2789, 0x0039921c}}, Y: Field{[10]uint32{0x00e10a6b, 0x01d8a516, 0x02145843, 0x039740bc, 0x02f3dbfa, 0x017be47f, 0x039ecfd4, 0x02c2d56d, 0x02d14999, 0x000a602c}}}, + {X: Field{[10]uint32{0x026798ad, 0x010e18ea, 0x012660eb, 0x03894ea3, 0x0243daa1, 0x01cf9721, 0x0324adfc, 0x00f8b094, 0x0009b20d, 0x001822c4}}, Y: Field{[10]uint32{0x010e13df, 0x03f8b223, 0x0038b3b4, 0x00f10fbf, 0x03a021e1, 0x033c3998, 0x0181c68c, 0x0258e144, 0x0203ad5c, 0x00209b96}}}, + {X: Field{[10]uint32{0x01bb152a, 0x017e1068, 0x033e57c6, 0x00ada142, 0x00cdc4dc, 0x01bd306a, 0x02614353, 0x03917d82, 0x01558132, 0x002325e0}}, Y: Field{[10]uint32{0x037460fc, 0x03504df6, 0x0344ba6e, 0x00f670c6, 0x001875d6, 0x02193c65, 0x01083c53, 0x0207bc2a, 0x0098394d, 0x00328ecc}}}, + {X: Field{[10]uint32{0x0021bf3e, 0x0323e366, 0x00627f80, 0x015da084, 0x03100727, 0x0380441b, 0x018e731c, 0x00920be3, 0x011ac73b, 0x0000d4d6}}, Y: Field{[10]uint32{0x01eb6412, 0x02131ed0, 0x03df9d4f, 0x02067d12, 0x0370ae89, 0x009823aa, 0x02306db0, 0x02d1a6b1, 0x011a501a, 0x000adf8f}}}, + {X: Field{[10]uint32{0x00d78857, 0x03710c27, 0x02978b05, 0x01f6a7f6, 0x023c387b, 0x01e3f38c, 0x0270a671, 0x01cdcbb3, 0x0188ec35, 0x003acb7f}}, Y: Field{[10]uint32{0x024b88e4, 0x011fbc68, 0x01f6318c, 0x01ff2828, 0x023dd7aa, 0x02148dcb, 0x001a8cf9, 0x01548711, 0x02ed1f5a, 0x001bcaed}}}, + {X: Field{[10]uint32{0x012eb279, 0x03fdcca6, 0x00487b29, 0x03a619cb, 0x00abd72a, 0x03bbd9b7, 0x018f3b07, 0x001439a6, 0x03f65db1, 0x00290703}}, Y: Field{[10]uint32{0x01a99cd4, 0x0147bba6, 0x00244ba9, 0x03acaab3, 0x03bc0786, 0x014841c9, 0x019d7f86, 0x03fe77d8, 0x03205616, 0x0015be9e}}}, + {X: Field{[10]uint32{0x02217e92, 0x009395e8, 0x00ea9415, 0x02b6186f, 0x01615d85, 0x021677c4, 0x005917e0, 0x00540329, 0x0335f5bb, 0x00239d22}}, Y: Field{[10]uint32{0x00a46df8, 0x01d78fbf, 0x0266c9ef, 0x028e5b3f, 0x00825515, 0x025cef14, 0x03f86043, 0x031a9e12, 0x0362e226, 0x0015504c}}}, + {X: Field{[10]uint32{0x02dd17e5, 0x0354d709, 0x03708f35, 0x009f3339, 0x02bc506c, 0x01fb1eff, 0x00de2c7b, 0x001891cf, 0x0007cce7, 0x002a0fd8}}, Y: Field{[10]uint32{0x026af268, 0x00edd318, 0x02cbb26c, 0x005221e8, 0x015a1ac6, 0x03543585, 0x0397a379, 0x01f9718c, 0x012daf21, 0x002b523b}}}, + {X: Field{[10]uint32{0x0282d2fa, 0x022bfb44, 0x033abf11, 0x0376d1d5, 0x025cf208, 0x03f4e5f7, 0x000246eb, 0x0058924e, 0x02927e45, 0x003e7b5e}}, Y: Field{[10]uint32{0x00237b70, 0x02eed772, 0x01324087, 0x001ed2f9, 0x0303c844, 0x01c34e03, 0x015d53c6, 0x00c3de03, 0x02163a6f, 0x003055d1}}}, + {X: Field{[10]uint32{0x002ea08e, 0x00499c9b, 0x0255af01, 0x00491b14, 0x02c7dff0, 0x03c27e04, 0x01177078, 0x031e99fe, 0x038a175e, 0x0028af79}}, Y: Field{[10]uint32{0x01ca12ec, 0x004c8f72, 0x01e20b09, 0x00aa976e, 0x013b5dd6, 0x037140fe, 0x03d27419, 0x01302db5, 0x018fe82d, 0x001c495a}}}, + {X: Field{[10]uint32{0x039899b2, 0x03a88c6f, 0x01a56e62, 0x010b861d, 0x036b37da, 0x02385a42, 0x01cc0e9b, 0x019cda41, 0x01c79dcb, 0x0032a301}}, Y: Field{[10]uint32{0x0087534c, 0x003c67c5, 0x0199641d, 0x0275c4e2, 0x02275125, 0x03eea72a, 0x0160c1e3, 0x02b6e999, 0x01ca1e19, 0x00141314}}}, + {X: Field{[10]uint32{0x00eca02b, 0x01ec0655, 0x0397c061, 0x008725e7, 0x0061fd4b, 0x0140609e, 0x037ecdd1, 0x004eb104, 0x02ee61db, 0x0003f041}}, Y: Field{[10]uint32{0x03bef3ee, 0x0265945e, 0x0308e6bc, 0x035d724b, 0x02971f2c, 0x037168b0, 0x03ce9c2c, 0x0198e0ab, 0x02284fc2, 0x001b6956}}}, + {X: Field{[10]uint32{0x0092a8ab, 0x02da9c59, 0x0390b8b9, 0x012f0be3, 0x03504f67, 0x02b1e11b, 0x019a3217, 0x0041a150, 0x0039f47b, 0x000b2c86}}, Y: Field{[10]uint32{0x000a5757, 0x0204927c, 0x017aff10, 0x00cc116a, 0x00637264, 0x01978bf2, 0x0007feb9, 0x00112bda, 0x0332ae75, 0x00007fac}}}, + {X: Field{[10]uint32{0x0161f3ae, 0x03c84c95, 0x002245d4, 0x01c9e65c, 0x0356ba35, 0x02e957b6, 0x022963ef, 0x001ffff2, 0x00ee759c, 0x0019e314}}, Y: Field{[10]uint32{0x02cba96c, 0x022ffd2b, 0x03107c49, 0x015f6a9d, 0x01780b16, 0x00e2787e, 0x03afce2d, 0x00130724, 0x0387abbf, 0x0006626d}}}, + {X: Field{[10]uint32{0x024aa6fc, 0x00724420, 0x01da41b2, 0x032907cf, 0x0275d407, 0x002cbc99, 0x015097c3, 0x00d36608, 0x01ceaa2e, 0x002ad8f8}}, Y: Field{[10]uint32{0x00e2363c, 0x00955a9b, 0x00d82479, 0x0395f43d, 0x02812eb7, 0x011506b5, 0x01d3da2c, 0x03fdc9c5, 0x02611150, 0x003b196f}}}, + {X: Field{[10]uint32{0x003dd336, 0x02466ba4, 0x03cc9f5c, 0x01e6c14a, 0x03ec5672, 0x00499260, 0x0239a2a3, 0x02565d69, 0x01cafad5, 0x0029a4e6}}, Y: Field{[10]uint32{0x010d97dd, 0x00f84bb1, 0x017551c4, 0x012d8d24, 0x001c8730, 0x024eb8d2, 0x02799dcc, 0x013d369e, 0x0259c30c, 0x002d4971}}}, + {X: Field{[10]uint32{0x00fc5f3e, 0x01d4ef70, 0x001fbe13, 0x02bf4ef9, 0x00bd7a48, 0x00e720b4, 0x01cb5ed4, 0x033d7b49, 0x0282507b, 0x000cafd0}}, Y: Field{[10]uint32{0x0279bff2, 0x02eda543, 0x0033ac20, 0x02607a00, 0x026773c5, 0x038d1fa0, 0x0282f90b, 0x0367f495, 0x017a4336, 0x00336480}}}, + {X: Field{[10]uint32{0x02dfd862, 0x00ba6e3b, 0x032ec5e4, 0x0213da06, 0x02f2fe64, 0x005141c5, 0x003e2cc1, 0x000259c8, 0x01837e72, 0x00287f32}}, Y: Field{[10]uint32{0x01ed4fd7, 0x01b0c58c, 0x03a964ba, 0x03f6f05f, 0x02a419af, 0x008b7927, 0x03fa79a7, 0x03ee277f, 0x02c317e8, 0x000785ad}}}, + {X: Field{[10]uint32{0x030ceae0, 0x02ccae5f, 0x00838472, 0x03cceafa, 0x0360485c, 0x0073dce2, 0x01f1e822, 0x01f94063, 0x014e6961, 0x0036168c}}, Y: Field{[10]uint32{0x000a52f1, 0x02a8d9f8, 0x024e86e1, 0x033ccc22, 0x00fbbcba, 0x02229e6d, 0x034b5daa, 0x0379999a, 0x03eee92d, 0x001c683f}}}, + {X: Field{[10]uint32{0x020c2e7f, 0x000feabc, 0x0224e4ee, 0x017a010f, 0x02f5a53b, 0x00d5bab0, 0x01b20e31, 0x031c3905, 0x02fa0688, 0x00062489}}, Y: Field{[10]uint32{0x01515aa6, 0x0161f7bc, 0x00eaa1a0, 0x01fe54b9, 0x02fc2bba, 0x0261f3d8, 0x00be5759, 0x0354f9ef, 0x00ac40c7, 0x00366ff6}}}, + {X: Field{[10]uint32{0x019e1330, 0x001c2695, 0x01241ff7, 0x009534b6, 0x0132465d, 0x00b3c84d, 0x02674e63, 0x00458b5e, 0x020a6a93, 0x0034d50b}}, Y: Field{[10]uint32{0x0357c369, 0x01e645d2, 0x032bf9a0, 0x021012c7, 0x03dbd427, 0x008aef60, 0x00be5ed6, 0x0108d0d3, 0x0351e266, 0x000097a3}}}, + {X: Field{[10]uint32{0x013a2bc5, 0x01af861d, 0x0245f287, 0x016ab6ff, 0x029a8c0a, 0x0161d615, 0x006e6b82, 0x02d8487b, 0x0286fb2c, 0x00145367}}, Y: Field{[10]uint32{0x03cbf261, 0x02a10615, 0x0179145c, 0x02f1218a, 0x011b8370, 0x0197de76, 0x01918d9f, 0x008f10d0, 0x01c0be54, 0x001c01e1}}}, + {X: Field{[10]uint32{0x023fe495, 0x01a128fa, 0x03f6ad6d, 0x0188b5c8, 0x0343f9aa, 0x02b981aa, 0x031db335, 0x0333f787, 0x036512e9, 0x00327e18}}, Y: Field{[10]uint32{0x0230270b, 0x00efac87, 0x01db3a3b, 0x0163cc7d, 0x01b7b80b, 0x0372f8ee, 0x02f9445d, 0x02807271, 0x02313868, 0x000c34e9}}}, + {X: Field{[10]uint32{0x002deb93, 0x03481bcb, 0x00768357, 0x029cae42, 0x03641200, 0x0039e436, 0x00cd96fa, 0x0227f826, 0x020c8fc0, 0x000089bc}}, Y: Field{[10]uint32{0x025f66bc, 0x00ee56aa, 0x00cff1c0, 0x01bfb860, 0x015e0262, 0x012d0f6a, 0x03c20452, 0x024d880f, 0x03b8b43e, 0x000b88fe}}}, + {X: Field{[10]uint32{0x035350bd, 0x0125adb2, 0x03da0a38, 0x03f62366, 0x019fcc79, 0x02e29f98, 0x019bd9e6, 0x03e531c8, 0x0268d4b6, 0x00286c9d}}, Y: Field{[10]uint32{0x02d68a32, 0x013ccb75, 0x01b94264, 0x01d2dcae, 0x01c96b5f, 0x0003f57b, 0x02a62bc2, 0x0305ab9e, 0x005eb6e1, 0x000e4cff}}}, + {X: Field{[10]uint32{0x03e28887, 0x0037dfab, 0x01ae38c4, 0x01f05643, 0x0357dd4e, 0x02023ac2, 0x03b71810, 0x02f0c47d, 0x02570087, 0x00043c4d}}, Y: Field{[10]uint32{0x03366d84, 0x031ba178, 0x03995db5, 0x02d29e68, 0x02291338, 0x00753b73, 0x02c570d9, 0x030fb139, 0x008709bd, 0x000694b9}}}, + {X: Field{[10]uint32{0x01be3e46, 0x03861073, 0x01884273, 0x03623e62, 0x00f613b3, 0x0003717b, 0x03558615, 0x03d60fe7, 0x00eea984, 0x00022aa8}}, Y: Field{[10]uint32{0x0133260d, 0x025f48a8, 0x017b8f21, 0x016055b6, 0x0124e564, 0x00bc91bb, 0x02c46abc, 0x009df700, 0x01540f85, 0x0014a588}}}, + {X: Field{[10]uint32{0x01c89d2e, 0x019990fc, 0x034aa3bd, 0x03be96e2, 0x00dc9472, 0x01ea4ea6, 0x0397ce5f, 0x02c6de6c, 0x02710024, 0x000ca016}}, Y: Field{[10]uint32{0x003091fd, 0x01439621, 0x002a2f4d, 0x019702e2, 0x029e23c7, 0x00a9d3b5, 0x02d0a858, 0x00e7d734, 0x007cb7c1, 0x002bd497}}}, + {X: Field{[10]uint32{0x01412451, 0x0141d26a, 0x02b12cde, 0x030a1fda, 0x01058db0, 0x03ce9483, 0x030835a4, 0x035125fe, 0x00cc909a, 0x0031cbc4}}, Y: Field{[10]uint32{0x02c7c65a, 0x0044b5bc, 0x03030a7a, 0x00c99d19, 0x03b8e2ca, 0x0192d83c, 0x015ff15b, 0x02ea78df, 0x027d5197, 0x0029599b}}}, + {X: Field{[10]uint32{0x03fc9a22, 0x0082195d, 0x01f97c03, 0x016b5301, 0x0172c0fa, 0x0080ef50, 0x01a74adc, 0x0046c905, 0x00c78702, 0x001bb1da}}, Y: Field{[10]uint32{0x031b09fb, 0x009833ab, 0x014d05da, 0x010b6d9f, 0x03b51cbf, 0x01527230, 0x01e67100, 0x036ec249, 0x02220aa2, 0x00060e52}}}, + {X: Field{[10]uint32{0x00a64737, 0x00e9c70f, 0x01e61dc9, 0x0343bbe4, 0x01a846e7, 0x01c117f2, 0x01061438, 0x03455981, 0x03bbff99, 0x00378dba}}, Y: Field{[10]uint32{0x000f4270, 0x0292d3a4, 0x00c81b39, 0x02e86d34, 0x00488208, 0x011db138, 0x0247dcda, 0x02cded01, 0x02520f3c, 0x0031605d}}}, + {X: Field{[10]uint32{0x00c00218, 0x0082adcf, 0x0297bc0c, 0x008ad1a8, 0x0019bea3, 0x037a9bd3, 0x0001ef86, 0x03f1a16b, 0x015d5538, 0x003d4d05}}, Y: Field{[10]uint32{0x03b9523c, 0x0355c1ac, 0x026030d3, 0x013c5376, 0x03f9d092, 0x028b4494, 0x02b38a49, 0x02632bbb, 0x01f2979d, 0x0013eadf}}}, + {X: Field{[10]uint32{0x0286129d, 0x01ff304c, 0x035210bc, 0x0223436a, 0x0008db20, 0x0156da1f, 0x00ecb981, 0x02409420, 0x0050a1db, 0x0036bf6e}}, Y: Field{[10]uint32{0x011ada22, 0x03cbfbd9, 0x0291aa2e, 0x014183ff, 0x027d0ccc, 0x00dbeef4, 0x02be601f, 0x013050ff, 0x03fcae6c, 0x0010e597}}}, + {X: Field{[10]uint32{0x01d705ce, 0x027e7d26, 0x03721299, 0x01a5a02c, 0x022efe40, 0x00cf31a7, 0x016893ee, 0x02f21460, 0x02211dca, 0x002b2682}}, Y: Field{[10]uint32{0x00c728ef, 0x00e5c6e6, 0x03a8879c, 0x02c4e7d6, 0x02acf64e, 0x034035c4, 0x021e02c2, 0x034af7fe, 0x02408281, 0x0005baff}}}, + {X: Field{[10]uint32{0x00503030, 0x0207afa6, 0x02ceb1db, 0x00bc0ede, 0x0131ae2b, 0x02e2da7f, 0x01eb8b97, 0x03dba578, 0x03d4b48c, 0x002becde}}, Y: Field{[10]uint32{0x024b7929, 0x0336c582, 0x01d84d3f, 0x037b3913, 0x01c47c06, 0x017e8c4f, 0x0231af3e, 0x033765bc, 0x0164f8d9, 0x000733d0}}}, + {X: Field{[10]uint32{0x0088e709, 0x000a494e, 0x007d51a6, 0x00b4ac4a, 0x00f55368, 0x007591c3, 0x0318e7f2, 0x013e0cea, 0x02ef6c29, 0x00006e40}}, Y: Field{[10]uint32{0x00d69ebe, 0x007b3bb7, 0x024aa24b, 0x00091b1c, 0x0066ca01, 0x00359a93, 0x005e9fe4, 0x027f9c8e, 0x01ff34e4, 0x001dcd71}}}, + {X: Field{[10]uint32{0x003133e2, 0x0138a2df, 0x030b255e, 0x031630ef, 0x00c61b41, 0x00cc883f, 0x01b4ec3d, 0x00a561f1, 0x03108a20, 0x001b9396}}, Y: Field{[10]uint32{0x028fcfbe, 0x012a6766, 0x02f660f1, 0x0011b3a8, 0x00b55ae5, 0x01224569, 0x01ea4106, 0x01abd11a, 0x03065c33, 0x002d27e0}}}, + {X: Field{[10]uint32{0x037e9714, 0x00346ac6, 0x0280b5b1, 0x0261f607, 0x0112342d, 0x034e4c6e, 0x00532760, 0x0008416e, 0x037fbb80, 0x0021f38f}}, Y: Field{[10]uint32{0x00f0f635, 0x0065ce93, 0x02e16d1e, 0x0263751b, 0x016b71f8, 0x03078ce1, 0x013c3869, 0x03ce700a, 0x004779db, 0x0015b1aa}}}, + {X: Field{[10]uint32{0x01426b2d, 0x0199eab2, 0x01d0c9f6, 0x00189d1f, 0x02d368a7, 0x01687a51, 0x00193724, 0x01927270, 0x029bb7ba, 0x0021c90c}}, Y: Field{[10]uint32{0x010b944c, 0x0243fe59, 0x030d89d0, 0x03548745, 0x0155b109, 0x003e811e, 0x03a5a5bb, 0x03512d76, 0x00e848d7, 0x00011116}}}, + {X: Field{[10]uint32{0x02a1a4bc, 0x025fd8ad, 0x005cd7d2, 0x03333b21, 0x03c6338d, 0x01935f5f, 0x01b18b6b, 0x030244cb, 0x03a64735, 0x002e46fb}}, Y: Field{[10]uint32{0x00138467, 0x03dc0778, 0x0340b14c, 0x00323e7c, 0x0015e7ca, 0x0391d9a8, 0x03f16cfb, 0x01e71a19, 0x01ef8c9b, 0x002ece58}}}, + {X: Field{[10]uint32{0x00d08fb3, 0x038c8028, 0x0296cd8d, 0x02e19735, 0x009ae3d6, 0x0228d227, 0x00fbb896, 0x025fa8ef, 0x0259332e, 0x0010c87a}}, Y: Field{[10]uint32{0x00cd538e, 0x032d8021, 0x00f7ee31, 0x008d7394, 0x0203f6b0, 0x01ce8d7a, 0x0182e3fc, 0x02754f5d, 0x00d4c514, 0x0025f920}}}, + {X: Field{[10]uint32{0x02f1bc6d, 0x014b29bd, 0x02069057, 0x0357a230, 0x017950a8, 0x02a63508, 0x01051d25, 0x025a990c, 0x03b2836d, 0x00371165}}, Y: Field{[10]uint32{0x03df36ff, 0x01cfc814, 0x02ad7f9b, 0x03f79310, 0x03362bb4, 0x00d5c96a, 0x00e3a83c, 0x00c32ba1, 0x000d16ba, 0x0031c496}}}, + {X: Field{[10]uint32{0x0159a009, 0x00b4e700, 0x00992997, 0x0194b67e, 0x03c5f19b, 0x037801ee, 0x02617508, 0x00c0242c, 0x02f085ff, 0x00339913}}, Y: Field{[10]uint32{0x033cc8f7, 0x02641b35, 0x02c17c08, 0x01a48299, 0x00c9402a, 0x019026ac, 0x0200c92f, 0x02e596ea, 0x01d0058d, 0x00002690}}}, + {X: Field{[10]uint32{0x0136b41a, 0x01138066, 0x002b4a74, 0x0309611a, 0x022ec439, 0x00f2e3bc, 0x01aecf42, 0x02d2eae0, 0x035cb6c7, 0x0002e878}}, Y: Field{[10]uint32{0x01bd6272, 0x0339a50d, 0x0128ad2f, 0x00cc73ab, 0x0001098b, 0x02c5ea39, 0x0178d6f7, 0x037918f8, 0x0252f91d, 0x003cecf1}}}, + {X: Field{[10]uint32{0x02e3920f, 0x0344d821, 0x0114d72e, 0x011c640b, 0x036988c7, 0x011763d0, 0x03c839f8, 0x006efd83, 0x02a02a33, 0x002e7e63}}, Y: Field{[10]uint32{0x020d03d3, 0x03eca4b1, 0x0327d318, 0x013ea52e, 0x0235d9b0, 0x02a85f04, 0x0326f5e8, 0x00e85b31, 0x0101a7f2, 0x00027ec9}}}, + {X: Field{[10]uint32{0x007e886f, 0x028da7a0, 0x02ed09c1, 0x03c45b5e, 0x00dc10db, 0x03f3fe4c, 0x038e702f, 0x003e0711, 0x034655f9, 0x001c1645}}, Y: Field{[10]uint32{0x0205a59f, 0x0255426c, 0x02f8c64b, 0x010747cd, 0x03d09d3f, 0x0182a8fd, 0x031ec925, 0x03c32836, 0x00a4b9d6, 0x002099e8}}}, + {X: Field{[10]uint32{0x025434bf, 0x00886b30, 0x0031eb76, 0x01b938c7, 0x0114cc5a, 0x01004858, 0x036469f8, 0x02818e9e, 0x00bcc43c, 0x003bf69e}}, Y: Field{[10]uint32{0x02fa2864, 0x038de055, 0x032aa92b, 0x0191126b, 0x034cdf80, 0x00c64f44, 0x0121b135, 0x03e1643d, 0x03f6ef45, 0x001ed0db}}}, + {X: Field{[10]uint32{0x010ccc34, 0x01b4251d, 0x02f0e430, 0x01d00068, 0x0335fbd8, 0x02015aba, 0x0230988c, 0x002578e9, 0x030f5d62, 0x0008a692}}, Y: Field{[10]uint32{0x0234de6e, 0x028d6578, 0x034288be, 0x00d771a8, 0x00741acf, 0x01a9466f, 0x01694cef, 0x01d38f4b, 0x03af491c, 0x0005c34c}}}, + {X: Field{[10]uint32{0x02f07100, 0x0238bb1a, 0x03f178ce, 0x02d2069a, 0x03f91860, 0x02b343e4, 0x01d44b83, 0x0084c862, 0x008e20a0, 0x0031dc3d}}, Y: Field{[10]uint32{0x00266eec, 0x03e18870, 0x038c9610, 0x02fdf82f, 0x02a6d8db, 0x00c96fab, 0x0143aca3, 0x00647e7b, 0x00d38b2a, 0x001f8448}}}, + {X: Field{[10]uint32{0x0286aa44, 0x0121a6bc, 0x00af8eb7, 0x0260f509, 0x01e89b89, 0x002c626a, 0x020a48a2, 0x00754a2d, 0x00630390, 0x002976cb}}, Y: Field{[10]uint32{0x00af1e50, 0x03868dc9, 0x03a1446f, 0x021a0146, 0x010384e1, 0x0270dfbb, 0x034e6abd, 0x0356c069, 0x01926a93, 0x002e6587}}}, + {X: Field{[10]uint32{0x0241db1c, 0x01eca636, 0x005ff007, 0x01233a8b, 0x024b447e, 0x005a36e6, 0x03897b7c, 0x000a2298, 0x029e9f33, 0x000fb1c5}}, Y: Field{[10]uint32{0x03053fb2, 0x01de0d7c, 0x00b49e44, 0x01a04b96, 0x024b3be2, 0x034d2935, 0x004aa34e, 0x003b688b, 0x034de8e6, 0x0030ffa5}}}, + {X: Field{[10]uint32{0x035bf3b3, 0x00b0453e, 0x02b777cf, 0x024f3a4b, 0x03810cff, 0x0267923a, 0x0060d4cf, 0x00461356, 0x0217c331, 0x002dccf7}}, Y: Field{[10]uint32{0x000c11b0, 0x038690d2, 0x0290ad28, 0x033a7c9a, 0x0157fc4a, 0x02ed855c, 0x000d537e, 0x002b4c80, 0x00dd72d2, 0x00031d70}}}, + {X: Field{[10]uint32{0x002ed278, 0x0140585b, 0x01df28b4, 0x0279aa08, 0x00027db5, 0x005601d7, 0x0149616a, 0x02f09057, 0x0208d555, 0x0015f5b8}}, Y: Field{[10]uint32{0x0346eba8, 0x00d31b0d, 0x02891fca, 0x00b9b3ca, 0x0274b5d0, 0x014ecd3d, 0x028e3533, 0x036968d4, 0x0279d130, 0x0020e1c2}}}, + {X: Field{[10]uint32{0x02d3673d, 0x0249621a, 0x03aab8d7, 0x0027f6cb, 0x026f0694, 0x00823dbc, 0x032fd3c3, 0x0291e0ef, 0x00f1aa69, 0x0027908d}}, Y: Field{[10]uint32{0x008d0653, 0x00dccf8a, 0x0029bd75, 0x005abffb, 0x019fb42b, 0x01e81610, 0x03ed0414, 0x03af0fa2, 0x03737725, 0x0017e691}}}, + {X: Field{[10]uint32{0x02b68173, 0x00fc7ce6, 0x00a758d4, 0x03c9d81a, 0x0322e4fc, 0x0362ba44, 0x0096202f, 0x00bff6f6, 0x039d9fc1, 0x001bf8ff}}, Y: Field{[10]uint32{0x0109fa1b, 0x00f688ad, 0x02a3c2ab, 0x0058f9fe, 0x010bf94e, 0x02482316, 0x03ef7b50, 0x0118209c, 0x02821d41, 0x003bc355}}}, + {X: Field{[10]uint32{0x005c4631, 0x02ab96ed, 0x0161fff2, 0x015f446c, 0x0154c492, 0x01532d26, 0x02af415e, 0x01b867be, 0x014fd258, 0x000b0c79}}, Y: Field{[10]uint32{0x03311346, 0x003908c4, 0x0308bd8e, 0x015069c1, 0x00039af3, 0x03ee0979, 0x0353c0e9, 0x02c6b39f, 0x00ad364a, 0x002fb7ec}}}, + {X: Field{[10]uint32{0x00203ebc, 0x019839de, 0x037823b8, 0x0225270b, 0x004d745b, 0x02e4ce16, 0x00ea2ee2, 0x01230d1e, 0x02590231, 0x0014565c}}, Y: Field{[10]uint32{0x02aa1817, 0x027cefd9, 0x033628a5, 0x03396984, 0x03b81ff7, 0x015e4140, 0x03dc4702, 0x02dd0f13, 0x0153f688, 0x000ca7d8}}}, + {X: Field{[10]uint32{0x01caf1f4, 0x010791b3, 0x03d6070d, 0x0213378d, 0x020d3946, 0x03d4733e, 0x03fcb3bd, 0x035ee370, 0x032458f7, 0x000622cc}}, Y: Field{[10]uint32{0x03901910, 0x0195a934, 0x03104487, 0x030a22ab, 0x003d1dde, 0x026671aa, 0x026b04c8, 0x02845cc6, 0x01dad112, 0x000137a9}}}, + {X: Field{[10]uint32{0x03a6e471, 0x00dcb573, 0x0090e307, 0x033dfc4f, 0x0085f804, 0x0384f8aa, 0x02b0a494, 0x03856233, 0x0241a503, 0x00248163}}, Y: Field{[10]uint32{0x00ec108a, 0x01c95761, 0x0151068e, 0x01e96334, 0x01bcbe17, 0x0085dfa5, 0x025a230e, 0x01a1785f, 0x02d4449e, 0x000da01c}}}, + {X: Field{[10]uint32{0x00099fcf, 0x011e20cd, 0x0105d5b6, 0x03a27a0c, 0x03726f79, 0x01bab14d, 0x03a7a689, 0x01941bc9, 0x022644e0, 0x001a9bd4}}, Y: Field{[10]uint32{0x01132586, 0x0268cb69, 0x013214c1, 0x0269692d, 0x007104e7, 0x01d261fd, 0x027b6645, 0x0360fac5, 0x014bd8ce, 0x0033cfb7}}}, + {X: Field{[10]uint32{0x0376bb26, 0x03e49bc8, 0x0148d89c, 0x0008d3c0, 0x03c77c34, 0x035523cd, 0x021e0efa, 0x03730f28, 0x02a2340c, 0x001f8df3}}, Y: Field{[10]uint32{0x009a0016, 0x027fa6b3, 0x0369e83b, 0x00af4c72, 0x026b02d4, 0x0172f08a, 0x022938e0, 0x01f1aac1, 0x029b42a2, 0x0031cb60}}}, + {X: Field{[10]uint32{0x00d0b667, 0x023ee0b6, 0x00c5ad84, 0x00314b0f, 0x00800d01, 0x0325ea37, 0x03b4b39b, 0x01b3deeb, 0x0069cf0f, 0x00079b08}}, Y: Field{[10]uint32{0x0260196f, 0x031c8e23, 0x03e81f86, 0x02198c2d, 0x00491469, 0x032c2450, 0x02cfbdc2, 0x03611a1b, 0x0276bca1, 0x00030607}}}, + {X: Field{[10]uint32{0x02f07e16, 0x00fbd6c1, 0x00be3520, 0x00f32901, 0x02f36ba4, 0x0112d1fa, 0x02336c8d, 0x0293dec1, 0x000fe6ee, 0x00155998}}, Y: Field{[10]uint32{0x01057e55, 0x03f87380, 0x0278b5a7, 0x0059da56, 0x0269e5ac, 0x03cdcbb6, 0x00acb4c0, 0x0065e7b5, 0x008f7adc, 0x001aeef4}}}, + {X: Field{[10]uint32{0x01c791b5, 0x0341f64c, 0x03a7619a, 0x005b54a6, 0x00690450, 0x017653e3, 0x01c5adc4, 0x00717008, 0x034ded45, 0x0010d718}}, Y: Field{[10]uint32{0x034d4cc1, 0x02d391f1, 0x02c14024, 0x01d8adbd, 0x02850098, 0x0254f032, 0x006f9591, 0x02943c88, 0x02688252, 0x000c7b78}}}, + {X: Field{[10]uint32{0x0057b9b6, 0x0108d0a7, 0x027e9dd1, 0x00abe157, 0x01f19a0d, 0x014a9053, 0x01c06122, 0x01c71ce5, 0x00e6a660, 0x001bee33}}, Y: Field{[10]uint32{0x0368e052, 0x017627c9, 0x034c5b84, 0x03baaff8, 0x02183dad, 0x0208c989, 0x0399fad6, 0x014c5351, 0x0249e2f0, 0x0005fe50}}}, + {X: Field{[10]uint32{0x0180dc36, 0x037a30ca, 0x01890148, 0x028a6781, 0x0011c711, 0x0153b98d, 0x016a695f, 0x01325252, 0x029920fc, 0x00219bcf}}, Y: Field{[10]uint32{0x018d62f7, 0x0221e1b4, 0x0109bae1, 0x000ba0de, 0x01f5211f, 0x030036cb, 0x00a11e13, 0x030f074e, 0x01af4f8d, 0x003a6715}}}, + {X: Field{[10]uint32{0x00468b2d, 0x01bd8620, 0x03c79461, 0x002df009, 0x0162404f, 0x0372f941, 0x024f7234, 0x0122669c, 0x0010b716, 0x0020304d}}, Y: Field{[10]uint32{0x000b91aa, 0x037e254a, 0x016216d8, 0x03870b10, 0x01bd6e8f, 0x0371a74e, 0x03592819, 0x00793f5e, 0x002e71a0, 0x00218c65}}}, + {X: Field{[10]uint32{0x02a7da99, 0x00577060, 0x004d2c38, 0x030292e9, 0x00bf37ab, 0x005eedbb, 0x03e68bec, 0x02762014, 0x01eeef4e, 0x0023e16f}}, Y: Field{[10]uint32{0x0217897e, 0x027edfbb, 0x02962b4a, 0x017927b9, 0x034e8c29, 0x02a96468, 0x00f8ce78, 0x00d0b2bc, 0x03df8ae9, 0x000db516}}}, + {X: Field{[10]uint32{0x01600749, 0x01280692, 0x022aa440, 0x039209b6, 0x0317a920, 0x03ba286c, 0x00edaf40, 0x03369833, 0x032b3393, 0x00027342}}, Y: Field{[10]uint32{0x02fc5a5a, 0x03977baa, 0x00463414, 0x024a9258, 0x023a00c4, 0x03c313a8, 0x0101e348, 0x01942ec6, 0x035a51d9, 0x000e0c74}}}, + {X: Field{[10]uint32{0x009f33b0, 0x0380ddf5, 0x032d3bdb, 0x032b7fe8, 0x02003ab7, 0x01d31de6, 0x03832f79, 0x01fff5b3, 0x01af15c6, 0x0028317c}}, Y: Field{[10]uint32{0x01cb91ec, 0x00a5a080, 0x03c57800, 0x00aee210, 0x03307939, 0x0188317f, 0x03344123, 0x01898905, 0x00d442de, 0x001abfd0}}}, + {X: Field{[10]uint32{0x00edfacc, 0x0208c4d6, 0x02d7890a, 0x01c0df2c, 0x02c01113, 0x03b100e7, 0x021fbf02, 0x03885f5f, 0x03400013, 0x002bce5b}}, Y: Field{[10]uint32{0x02cfb936, 0x03a53d66, 0x024bc936, 0x0267a161, 0x016754c5, 0x0017c397, 0x0035d167, 0x014d28b7, 0x01e25a57, 0x002aabae}}}, + {X: Field{[10]uint32{0x01ed0eaf, 0x039c7124, 0x01307cf1, 0x01c7cbe2, 0x0187d4c0, 0x02f8d65e, 0x02871b0d, 0x03b3179f, 0x0057e3e0, 0x003f6b0f}}, Y: Field{[10]uint32{0x00a09fc7, 0x03981a0f, 0x00b18cde, 0x03fd7684, 0x02b14d14, 0x033f8db5, 0x00877afc, 0x03c259cf, 0x00cca22e, 0x000c0a28}}}, + {X: Field{[10]uint32{0x02fa88b7, 0x011c767b, 0x0103e14a, 0x035aab14, 0x00ae745f, 0x023bebb7, 0x012b6a96, 0x02eaa6b8, 0x01239587, 0x0038ebac}}, Y: Field{[10]uint32{0x02f769c7, 0x00ce5ef2, 0x036cd2d3, 0x00168b23, 0x017b4603, 0x02c9f469, 0x006833fb, 0x01512f8c, 0x038652c1, 0x001fb471}}}, + {X: Field{[10]uint32{0x038352f5, 0x01694335, 0x00a0e605, 0x01e8f8f8, 0x000eb83d, 0x0246b2e5, 0x00cc663c, 0x00058bed, 0x01e3382a, 0x0025aebb}}, Y: Field{[10]uint32{0x00c50cbc, 0x02b8167c, 0x039972ad, 0x0187a963, 0x0105100d, 0x02e4c022, 0x00c3a80f, 0x00a090e2, 0x0297b3ad, 0x001e1c8b}}}, + {X: Field{[10]uint32{0x03f5f5b5, 0x0013b88e, 0x03e408de, 0x008911a8, 0x02ba93d1, 0x036d51bf, 0x01e1eda4, 0x0158dfcd, 0x01561697, 0x001a1c12}}, Y: Field{[10]uint32{0x014ca494, 0x00d86f18, 0x005ff46e, 0x0099dc90, 0x02934bd2, 0x01310986, 0x006c7a20, 0x011c7ce8, 0x02feb5f7, 0x001891f4}}}, + {X: Field{[10]uint32{0x00bcf749, 0x0257827d, 0x01ad7940, 0x014be0fb, 0x0362eaf6, 0x02c374ac, 0x0202d72e, 0x03e1622b, 0x02342ca1, 0x001c7331}}, Y: Field{[10]uint32{0x012a45fb, 0x027e60f7, 0x02c686cb, 0x02510aa5, 0x01aee177, 0x01c0f968, 0x00e3f222, 0x0039a52a, 0x03d923b1, 0x00121eba}}}, + {X: Field{[10]uint32{0x0235d3f0, 0x002cfb3d, 0x00dff25d, 0x02ebc927, 0x01713844, 0x03a2d842, 0x00cd1831, 0x0268b816, 0x01d06573, 0x001bf687}}, Y: Field{[10]uint32{0x0078108e, 0x02597d48, 0x013df60a, 0x00f554dc, 0x00a232a9, 0x02a22a2c, 0x00a96c32, 0x032dc93e, 0x00f48afc, 0x0028bb91}}}, + {X: Field{[10]uint32{0x01147f45, 0x005b31b5, 0x03b64b10, 0x03d60e39, 0x0165cbfc, 0x02651c45, 0x02395c13, 0x0365ed17, 0x0309ff5a, 0x0034fc9d}}, Y: Field{[10]uint32{0x03265077, 0x024559e4, 0x0161a043, 0x03854767, 0x0329006e, 0x026ef5b1, 0x02026ed2, 0x03870d53, 0x0016cdc8, 0x003e5b2b}}}, + {X: Field{[10]uint32{0x00a011d6, 0x038d9ba9, 0x0278641e, 0x024e38af, 0x0268f827, 0x02e0a4b1, 0x027d064b, 0x01bbfde2, 0x0144a28a, 0x0009ee86}}, Y: Field{[10]uint32{0x027bdcab, 0x03dea613, 0x014d0a77, 0x01755d1a, 0x01fcbe30, 0x0163c15c, 0x0312fc94, 0x0190c39c, 0x00759d21, 0x00092fbe}}}, + {X: Field{[10]uint32{0x004fe190, 0x039f4025, 0x0348ee35, 0x011061c1, 0x01772f4c, 0x021cb83a, 0x03ca9ff7, 0x01f3820b, 0x00125fd8, 0x003f4dee}}, Y: Field{[10]uint32{0x03dcb453, 0x01ee6809, 0x02951184, 0x01118041, 0x028ec68a, 0x02ccdf7c, 0x01b8c43f, 0x0066376e, 0x0125d9ae, 0x00251429}}}, + {X: Field{[10]uint32{0x02071c69, 0x013322a3, 0x00b802c2, 0x02296576, 0x03446751, 0x00caa005, 0x0329b63f, 0x00f83634, 0x00ca9258, 0x0036659f}}, Y: Field{[10]uint32{0x03376c25, 0x0192ba5c, 0x02ab97ed, 0x034c85e7, 0x0328361c, 0x00b96bc9, 0x0086dbb9, 0x0275a4ef, 0x0273c2c3, 0x001ab28d}}}, + {X: Field{[10]uint32{0x014a0a3c, 0x027b502e, 0x0044f3d8, 0x017c38f4, 0x02f53cd4, 0x03f65705, 0x02798efb, 0x0007af48, 0x013c4a8d, 0x0023ba0b}}, Y: Field{[10]uint32{0x011e1b2d, 0x0189b1de, 0x022f036c, 0x02836ceb, 0x0379c8b6, 0x0356e702, 0x0271c3af, 0x03ee742a, 0x037e9167, 0x00382c2a}}}, + {X: Field{[10]uint32{0x00562caa, 0x022876c3, 0x01a4764c, 0x0336fc8b, 0x038d709c, 0x0140a5c1, 0x03ea0291, 0x02d526a7, 0x03d2817c, 0x001187b0}}, Y: Field{[10]uint32{0x036684af, 0x01abd1eb, 0x0259adb1, 0x0036c218, 0x0126cdf8, 0x00594100, 0x00f6e126, 0x025e4144, 0x017dcb5c, 0x001986cb}}}, + {X: Field{[10]uint32{0x01f5793e, 0x00406f50, 0x01890673, 0x0203cf79, 0x0059f517, 0x014ffdae, 0x01bb7ffb, 0x032bb51a, 0x005c0935, 0x000c5562}}, Y: Field{[10]uint32{0x0043dfff, 0x010d3388, 0x0181e28d, 0x0309a71d, 0x0208ca6a, 0x023cd5db, 0x00bbdfe0, 0x00423e34, 0x00e992ac, 0x00180d65}}}, + {X: Field{[10]uint32{0x024ea9eb, 0x0109d60a, 0x02f0dcad, 0x028ae7ed, 0x00c68a60, 0x03621d39, 0x02267a0a, 0x02670641, 0x03b0ad91, 0x00172b24}}, Y: Field{[10]uint32{0x000032ab, 0x008ee662, 0x0234a0e4, 0x0254df99, 0x03c48e72, 0x035d20fa, 0x0161fe7a, 0x036ae5a6, 0x0298a116, 0x0020dbea}}}, + {X: Field{[10]uint32{0x0156cc42, 0x03b15b1a, 0x039047e3, 0x01d09121, 0x0154d052, 0x02a3c05e, 0x02eea1c4, 0x03bd5a2d, 0x03acafd5, 0x0007edb4}}, Y: Field{[10]uint32{0x022a5411, 0x00f6bf4b, 0x00839313, 0x0120460f, 0x027431be, 0x014318d8, 0x036a1ec0, 0x013cc9b7, 0x01f2f89e, 0x002e3be4}}}, + {X: Field{[10]uint32{0x002b28f2, 0x03f1dcf6, 0x02bdcd31, 0x015fdeec, 0x0369fe01, 0x03f7b9ec, 0x00618f03, 0x0001768c, 0x01e152f0, 0x0022702c}}, Y: Field{[10]uint32{0x00b4a507, 0x01deac60, 0x007a9254, 0x0362b27d, 0x01ad8223, 0x009b19ed, 0x0105de5b, 0x01a05ab3, 0x0357bbf4, 0x001875b8}}}, + {X: Field{[10]uint32{0x039a211e, 0x01eac6ed, 0x01751080, 0x02f83cc7, 0x007cb968, 0x01064c90, 0x023875a3, 0x006bf359, 0x018b1f9d, 0x0001f174}}, Y: Field{[10]uint32{0x00779ff3, 0x02e70def, 0x01b3b6dc, 0x02c4a5b2, 0x03d136b5, 0x0353a517, 0x023b4495, 0x03683ef4, 0x03ea985b, 0x00117ef9}}}, + {X: Field{[10]uint32{0x0159f85c, 0x027744fc, 0x03792ddf, 0x034e978b, 0x00b6afda, 0x017adfc0, 0x031ad4db, 0x0042326c, 0x03c19393, 0x003209f3}}, Y: Field{[10]uint32{0x013a1cb1, 0x006aa99d, 0x01a129c3, 0x00f758cd, 0x000330ea, 0x0265478b, 0x03e12fc8, 0x03500553, 0x007a3025, 0x001717f8}}}, + {X: Field{[10]uint32{0x03cc5d9b, 0x005e1d55, 0x001e6571, 0x0201541d, 0x002e0dfa, 0x01ac806d, 0x01e2fa40, 0x03df7081, 0x032bb1f3, 0x0018d1ec}}, Y: Field{[10]uint32{0x028c3ba4, 0x02f868eb, 0x02e52e22, 0x03cec5c3, 0x01a455d3, 0x03e2b09b, 0x00d72553, 0x034d3292, 0x02109508, 0x003e3cc3}}}, + {X: Field{[10]uint32{0x03ae1014, 0x00748999, 0x00130e0a, 0x00ea5266, 0x02bfa21f, 0x036c0cab, 0x02e42837, 0x0040757d, 0x0195e822, 0x0035227d}}, Y: Field{[10]uint32{0x027c66a9, 0x0299b648, 0x000c22b4, 0x037fae54, 0x012bfa98, 0x00987e32, 0x024c33d1, 0x02851a3d, 0x02898dc4, 0x0022c44b}}}, + {X: Field{[10]uint32{0x00a6205b, 0x0016372e, 0x000b276f, 0x01cf50ef, 0x0102200d, 0x039da991, 0x02b8f981, 0x03ef3ab7, 0x0063fb4a, 0x002432e7}}, Y: Field{[10]uint32{0x02e74645, 0x00c93394, 0x0087ba02, 0x01ed6fdb, 0x002611a7, 0x00811c76, 0x02f19c67, 0x01fc6aee, 0x01c0f6ba, 0x002252bf}}}, + {X: Field{[10]uint32{0x02196af4, 0x0269e55a, 0x0018bbc4, 0x01b1a67a, 0x00869bb0, 0x002a6255, 0x026a1bef, 0x0087d395, 0x00bb19f1, 0x001037da}}, Y: Field{[10]uint32{0x020cec90, 0x02f758c8, 0x0269da31, 0x034a90c7, 0x02e1d6b3, 0x01843dad, 0x009f8303, 0x037df0c7, 0x0009d0ce, 0x001c3507}}}, + {X: Field{[10]uint32{0x03da41bf, 0x00450ea0, 0x009d78b4, 0x007acd55, 0x00a888dd, 0x00c7c5ff, 0x00962b64, 0x01411647, 0x0174a0ac, 0x00124dbf}}, Y: Field{[10]uint32{0x03ff4f92, 0x02d7fc86, 0x03392c5a, 0x00ad7743, 0x013fc5b7, 0x02cfc73d, 0x0068af85, 0x0214fb5f, 0x01dd6517, 0x000cea38}}}, + {X: Field{[10]uint32{0x02023557, 0x03a0ac36, 0x03594288, 0x039eca8f, 0x03c1a0c6, 0x025601d2, 0x03aad592, 0x01d6e3d6, 0x01388110, 0x0005c5dd}}, Y: Field{[10]uint32{0x01b10837, 0x02ec1cb0, 0x0077504b, 0x00a08e6a, 0x01b163fe, 0x00d36848, 0x03a0c5f7, 0x01d0b179, 0x0014efd8, 0x00160f52}}}, + {X: Field{[10]uint32{0x038926a2, 0x01dc33d3, 0x02bab586, 0x023c0da4, 0x006abb11, 0x03c87c82, 0x014c82d8, 0x0117aad0, 0x03fbad51, 0x002849ad}}, Y: Field{[10]uint32{0x022ec669, 0x032cb46b, 0x00394452, 0x0251a679, 0x0288d465, 0x007dffb0, 0x02bfdb74, 0x02d34868, 0x0017b601, 0x001e6d2b}}}, + {X: Field{[10]uint32{0x02871163, 0x0039c0eb, 0x004fdba3, 0x02361a61, 0x023485db, 0x03619694, 0x015de512, 0x00012035, 0x0361f884, 0x00147b33}}, Y: Field{[10]uint32{0x02a8d50f, 0x032bb4cb, 0x03dcee87, 0x02a55e94, 0x0012b2c6, 0x0003a824, 0x000c46a2, 0x0327c20b, 0x025397bd, 0x001652b4}}}, + {X: Field{[10]uint32{0x02b3c7a9, 0x016e8ed4, 0x02882510, 0x00e22d45, 0x03d89844, 0x01e7496b, 0x01966cca, 0x01c4c7d5, 0x02336f1b, 0x0025de05}}, Y: Field{[10]uint32{0x03214c60, 0x03a2764e, 0x01516e47, 0x03bbd0d5, 0x02105011, 0x0149d7ad, 0x01a20e0a, 0x023f8337, 0x0141b4b0, 0x003c77cd}}}, + {X: Field{[10]uint32{0x0093f7fe, 0x01e6f80b, 0x03f01cdb, 0x00ea1c2e, 0x0064231d, 0x0068d73a, 0x038cf6db, 0x0236ad71, 0x003a7224, 0x0022f0b1}}, Y: Field{[10]uint32{0x00cbb425, 0x02ef8385, 0x01b2ef49, 0x001e009a, 0x030b428f, 0x03eee75e, 0x028106af, 0x0276fc27, 0x0276173e, 0x00354b8b}}}, + {X: Field{[10]uint32{0x01aef9f2, 0x014f9401, 0x020d9799, 0x01d7a267, 0x036c3271, 0x012e42cd, 0x00abd033, 0x02846729, 0x00816c7c, 0x00167b5e}}, Y: Field{[10]uint32{0x02449910, 0x02981a85, 0x02133152, 0x0094d2f1, 0x02207794, 0x019a7836, 0x01b46a28, 0x003faf93, 0x0027690c, 0x0008e7f0}}}, + {X: Field{[10]uint32{0x03c70fda, 0x0033dacb, 0x025200ca, 0x0268b2ad, 0x01c8ff8e, 0x00a8e716, 0x01923907, 0x01265750, 0x01d17671, 0x002fb0e6}}, Y: Field{[10]uint32{0x010ba8e7, 0x0266ff6b, 0x03fbf709, 0x01f3bf17, 0x02a21a2f, 0x0394bcd1, 0x021ab9ad, 0x0082348e, 0x01ef7831, 0x003ff12f}}}, + {X: Field{[10]uint32{0x020c4d34, 0x00d62167, 0x0307668a, 0x036d6318, 0x019e3b87, 0x0348a9df, 0x01f99517, 0x03c76fe9, 0x01eef4ce, 0x0024ef49}}, Y: Field{[10]uint32{0x0335b4dc, 0x039aa1d9, 0x00860794, 0x018c0d01, 0x01fa008c, 0x03e265c3, 0x003b1f94, 0x006e1269, 0x00129736, 0x00375f45}}}, + {X: Field{[10]uint32{0x02ddcf58, 0x039b2483, 0x00f8e3e8, 0x0316f7a9, 0x0344e553, 0x01d15695, 0x00b2e708, 0x01354456, 0x0257fb4e, 0x002c80e9}}, Y: Field{[10]uint32{0x02d8c99c, 0x0200d657, 0x03a6a0ac, 0x029e866b, 0x03c74ae5, 0x010fee9e, 0x030d4c75, 0x03860987, 0x01480c63, 0x0026091a}}}, + {X: Field{[10]uint32{0x00f6aa69, 0x01a0f760, 0x024e70be, 0x008533fd, 0x023e20ac, 0x0076a2aa, 0x018a28d1, 0x009ed604, 0x013c1dcd, 0x002bce2d}}, Y: Field{[10]uint32{0x009fd919, 0x030cbe70, 0x02c16acd, 0x01e463e2, 0x035ec101, 0x028feb19, 0x02867237, 0x00ad08d1, 0x0136ba8b, 0x002478e2}}}, + {X: Field{[10]uint32{0x03fd8518, 0x0315d3da, 0x02d862f8, 0x01c83d79, 0x02988ed4, 0x002ad33b, 0x00587562, 0x03601788, 0x025b0b99, 0x00157936}}, Y: Field{[10]uint32{0x00eb2d35, 0x005845eb, 0x0130940b, 0x00963c5e, 0x02e7713b, 0x00d30d9b, 0x01b5976c, 0x0274cb85, 0x02347517, 0x001cda2f}}}, + {X: Field{[10]uint32{0x002133f5, 0x00e83279, 0x035d9018, 0x01b74968, 0x01a3608c, 0x03605f64, 0x021a15e1, 0x0389020f, 0x002aa7eb, 0x0034f5fa}}, Y: Field{[10]uint32{0x005d504b, 0x029f53ff, 0x03bfcae6, 0x01a5b06f, 0x024b1c6d, 0x031789dc, 0x01080b06, 0x00df1a25, 0x01cce895, 0x00029491}}}, + {X: Field{[10]uint32{0x02e48799, 0x01b9699b, 0x003f2231, 0x012da31b, 0x03beab75, 0x03732641, 0x021e8031, 0x0110de5d, 0x039fe6b5, 0x0022f453}}, Y: Field{[10]uint32{0x0178fe19, 0x0042bfda, 0x00603891, 0x009f66ba, 0x00ecb2eb, 0x0158ce1a, 0x0263a263, 0x01895d45, 0x0150a387, 0x003e2770}}}, + {X: Field{[10]uint32{0x02212932, 0x0223f488, 0x0370485c, 0x016c1208, 0x023a7dbc, 0x01ca9688, 0x02b08589, 0x003d0b3f, 0x036503f5, 0x002c75c8}}, Y: Field{[10]uint32{0x002143ac, 0x03cdc5b0, 0x0025570b, 0x013801f4, 0x01627986, 0x0216c877, 0x00aa52d3, 0x0387e6dd, 0x01d8594e, 0x0010165f}}}, + {X: Field{[10]uint32{0x039d3023, 0x03d3dc99, 0x013a8593, 0x000c1787, 0x01c22d44, 0x001173bd, 0x03e4763e, 0x0248324e, 0x03e1cb7d, 0x001134c0}}, Y: Field{[10]uint32{0x0189a70c, 0x004b1857, 0x02004769, 0x02a6806c, 0x03e77e41, 0x00f8f3b8, 0x03d6fcc8, 0x0368bcc6, 0x02fc5ed6, 0x001e7ef7}}}, + {X: Field{[10]uint32{0x030cb3ca, 0x03ae848e, 0x00aed3df, 0x026420f5, 0x02925589, 0x0183ae65, 0x03bd4b90, 0x02aba5c9, 0x0054447a, 0x0005957b}}, Y: Field{[10]uint32{0x0226fcdf, 0x03b39419, 0x017443b9, 0x029ac76b, 0x006ea28f, 0x027c1b65, 0x00f7bf8a, 0x038c7a62, 0x0178cf96, 0x0023a439}}}, + {X: Field{[10]uint32{0x005a3f29, 0x01eedf61, 0x02cb1971, 0x00120032, 0x027902b1, 0x0226439b, 0x01a93261, 0x019afd9b, 0x03fb5305, 0x002c0ab8}}, Y: Field{[10]uint32{0x03006876, 0x000c1f5e, 0x0105162a, 0x00ca4a98, 0x03d8c052, 0x02ce5d09, 0x03b76311, 0x00c0c466, 0x0313f448, 0x0031b4c9}}}, + {X: Field{[10]uint32{0x00c5bcd3, 0x03927344, 0x02c6e065, 0x0266854f, 0x018e1236, 0x02c4ae6b, 0x015e1402, 0x0010ae1d, 0x016653a0, 0x0004f119}}, Y: Field{[10]uint32{0x02d41c88, 0x024b1441, 0x002b0044, 0x02a29e2c, 0x007bab13, 0x00eb0f84, 0x0121ea40, 0x0180f8f1, 0x032c498f, 0x001c3cd9}}}, + {X: Field{[10]uint32{0x00f1483f, 0x03b68f01, 0x034c6361, 0x00fc5077, 0x010dee48, 0x017a5ece, 0x01c7bffc, 0x00dee0ba, 0x022b03fc, 0x0039f1d5}}, Y: Field{[10]uint32{0x03454066, 0x00be39b0, 0x028331b1, 0x026076ec, 0x021a9372, 0x01e85b43, 0x03dce515, 0x01256306, 0x00603d2b, 0x001cd2f9}}}, + {X: Field{[10]uint32{0x0159aefc, 0x035fee8a, 0x038d2263, 0x00870c12, 0x03332f39, 0x02f1ec9f, 0x02b2ed1e, 0x03f1d4d0, 0x012dfb6c, 0x00378097}}, Y: Field{[10]uint32{0x02de12f1, 0x01dbc705, 0x005985e6, 0x007601a5, 0x001a88c3, 0x020dce8c, 0x02fc30c3, 0x03cf40b6, 0x01b16ab6, 0x0011b182}}}, + {X: Field{[10]uint32{0x02ca2e01, 0x00b0c8cf, 0x03e4b6a4, 0x03d20e05, 0x0225730a, 0x02ebc14e, 0x01db714a, 0x0070f497, 0x00b4fed2, 0x000879e2}}, Y: Field{[10]uint32{0x01c1c4c6, 0x00a7f6b9, 0x03c58ddd, 0x03e73504, 0x01b249b1, 0x008cd6e7, 0x02af9b83, 0x01d64ad9, 0x02bda7d0, 0x0007f9c5}}}, + {X: Field{[10]uint32{0x0379edce, 0x033fc41e, 0x02012e39, 0x02776a5f, 0x02d1bc1a, 0x01d6ca39, 0x0058242c, 0x03542c69, 0x03ca7481, 0x0029f6c9}}, Y: Field{[10]uint32{0x01ae73f8, 0x00d860dc, 0x02238851, 0x0348ec47, 0x00084239, 0x02569f31, 0x0055fc17, 0x039b074d, 0x006dcabd, 0x00313e1a}}}, + {X: Field{[10]uint32{0x022d477a, 0x03d92d97, 0x01ccf41a, 0x00faf56f, 0x01e80a7d, 0x02b22533, 0x01616275, 0x03c90388, 0x01732790, 0x00314814}}, Y: Field{[10]uint32{0x022ba20b, 0x02fab27d, 0x03cda463, 0x00290150, 0x00af8770, 0x03ab70fe, 0x028e216d, 0x004283c3, 0x015b2094, 0x003a6a8a}}}, + {X: Field{[10]uint32{0x0172846d, 0x00dc7125, 0x01d05ea9, 0x03aa2e15, 0x0138e91e, 0x00dbaf36, 0x0025f86d, 0x036bafc7, 0x00ad99d1, 0x00121efd}}, Y: Field{[10]uint32{0x00febf70, 0x02a55dbf, 0x00ffe791, 0x01c21b78, 0x0032f729, 0x013062b8, 0x004b2a50, 0x03b42fb8, 0x0037ac6d, 0x00204a4e}}}, + {X: Field{[10]uint32{0x0208cb53, 0x005120c3, 0x03cb13cd, 0x01d083b7, 0x01355675, 0x03958097, 0x03e2d550, 0x01a22e13, 0x02a6bfcf, 0x002f5b74}}, Y: Field{[10]uint32{0x01ab0fca, 0x00dcc936, 0x01a1a1b0, 0x00b34714, 0x000c467d, 0x00a14566, 0x02a1501c, 0x00e018e3, 0x01e184c8, 0x00321a91}}}, + {X: Field{[10]uint32{0x035ec737, 0x02931f08, 0x02ce7936, 0x00619caf, 0x0070dbca, 0x0019cc7a, 0x034fbb69, 0x0223904c, 0x03fdfbf1, 0x00252905}}, Y: Field{[10]uint32{0x01be8e34, 0x026910f6, 0x01765029, 0x024d51be, 0x03564e9f, 0x033edf65, 0x02af124b, 0x03052e07, 0x0207343e, 0x00380f19}}}, + {X: Field{[10]uint32{0x02aba51e, 0x02236519, 0x00fa8ebd, 0x034c0e5a, 0x002ac597, 0x005e88f0, 0x02d9b733, 0x00ec9aa5, 0x02c33fa1, 0x000a95f6}}, Y: Field{[10]uint32{0x00c13b61, 0x02ca4dfa, 0x010c442d, 0x0366016d, 0x013b05bf, 0x0117cd3f, 0x027996e5, 0x02cee2c2, 0x02bf1db7, 0x0005d529}}}, + {X: Field{[10]uint32{0x007e7df7, 0x0242dffb, 0x01742eae, 0x0284b0fe, 0x02d1c66d, 0x00c20f0c, 0x00613e99, 0x00a8e59f, 0x02710614, 0x002e8b92}}, Y: Field{[10]uint32{0x034cb07e, 0x01eb3fa0, 0x00c971da, 0x00d6091f, 0x02ccc6de, 0x02b7b197, 0x03fc60c5, 0x03a0efb5, 0x00c1a704, 0x003098be}}}, + {X: Field{[10]uint32{0x00c01ca9, 0x018baa3b, 0x015a80a8, 0x02681cc3, 0x0008bb0b, 0x03eef609, 0x00a12b11, 0x00944b4a, 0x0343b313, 0x0012b865}}, Y: Field{[10]uint32{0x0017eece, 0x01323de8, 0x0019320b, 0x00f0fe75, 0x00cb2788, 0x029aa2e8, 0x001ec7c0, 0x00fa8747, 0x027d48fa, 0x0019edc9}}}, + {X: Field{[10]uint32{0x0306ddcb, 0x0143a9dd, 0x023ad618, 0x02fd046d, 0x000778b9, 0x01dd24fc, 0x00e6ff9d, 0x00d99fc6, 0x026c8182, 0x000133ec}}, Y: Field{[10]uint32{0x00e4028e, 0x00789dc9, 0x020c778e, 0x01e70e5e, 0x01aa6c60, 0x001f0c84, 0x017af164, 0x024f7c13, 0x023e3a8c, 0x000437e2}}}, + {X: Field{[10]uint32{0x01130349, 0x034f6e57, 0x02561934, 0x0009bdf5, 0x0215f061, 0x00f01418, 0x03bc3efb, 0x02d9bc03, 0x0166a014, 0x0027e791}}, Y: Field{[10]uint32{0x0396c592, 0x005f4964, 0x015fb0a4, 0x027333f2, 0x02ab6e5c, 0x01682a9e, 0x03d0c17c, 0x009aee63, 0x03a276d5, 0x00124ae2}}}, + {X: Field{[10]uint32{0x00239301, 0x033c7dab, 0x03bd222e, 0x0252d57c, 0x03ecf2a1, 0x0045678b, 0x039f4c10, 0x02d582c3, 0x01133641, 0x0038db01}}, Y: Field{[10]uint32{0x0343736c, 0x01696f6e, 0x00c7faa0, 0x004eb0ac, 0x0220e9a1, 0x027e0ea0, 0x022aea8e, 0x03f1018c, 0x00ba48e7, 0x0031ff5d}}}, + {X: Field{[10]uint32{0x00480bbf, 0x027e0936, 0x025e033e, 0x02938fb1, 0x02a0bbe0, 0x03c76846, 0x0337580b, 0x0115a1e1, 0x03b3b94d, 0x00246c04}}, Y: Field{[10]uint32{0x00cfc5b4, 0x00bc8afa, 0x03f00647, 0x02b0f4d9, 0x02948790, 0x038cf45c, 0x026f8247, 0x0094a48a, 0x007ec13a, 0x000578dc}}}, + {X: Field{[10]uint32{0x02324f56, 0x00fdc8fa, 0x001077d4, 0x01eb5d74, 0x00041f66, 0x0354e7cb, 0x02782de2, 0x01b5488d, 0x03888c67, 0x00095345}}, Y: Field{[10]uint32{0x0014094a, 0x00944cf2, 0x002755fd, 0x037e5e5d, 0x0309bec3, 0x02cb6fc9, 0x034aa03b, 0x0079744f, 0x012e9351, 0x003dc10b}}}, + {X: Field{[10]uint32{0x02f4079a, 0x00d59e15, 0x03f0b061, 0x018a65a5, 0x0234fce6, 0x0288bc5b, 0x03abe442, 0x003dc4ab, 0x037ece7d, 0x00114b5a}}, Y: Field{[10]uint32{0x03776998, 0x00c5691f, 0x02d23db3, 0x0164504c, 0x029a39ee, 0x0384c812, 0x000d69fc, 0x03f9d8d0, 0x03a128cf, 0x00087aa2}}}, + {X: Field{[10]uint32{0x004c508b, 0x01451e73, 0x001631f1, 0x02157ca3, 0x02817831, 0x02c660b4, 0x0386b855, 0x023d0606, 0x01d00788, 0x0005602e}}, Y: Field{[10]uint32{0x01d689ff, 0x03403d70, 0x02dc3ecd, 0x02abd95d, 0x0365b69f, 0x01e306df, 0x03cbbe87, 0x036775ce, 0x029c78b3, 0x00136747}}}, + {X: Field{[10]uint32{0x02fc2700, 0x00e582a8, 0x02f450c4, 0x01fb4212, 0x0245a5aa, 0x033c9680, 0x011470c2, 0x0253245b, 0x023fc316, 0x001e7768}}, Y: Field{[10]uint32{0x015bc978, 0x03c968ea, 0x03c03c34, 0x0086855b, 0x02d7158c, 0x01dc0c73, 0x0374e0f3, 0x02363312, 0x0169a58b, 0x001f1ef0}}}, + {X: Field{[10]uint32{0x0149dbe6, 0x036bb850, 0x013b5fe2, 0x00141119, 0x02419b49, 0x017d2a83, 0x02500afb, 0x0337084f, 0x03a9bf80, 0x00219b69}}, Y: Field{[10]uint32{0x026bd3d7, 0x02066add, 0x0124b239, 0x00b1af19, 0x02081a28, 0x022af126, 0x027e8adc, 0x015ea9a1, 0x00b3b45d, 0x00189b4e}}}, + {X: Field{[10]uint32{0x0011d374, 0x012e02e5, 0x0122e102, 0x032be641, 0x02cdb502, 0x01818ae5, 0x01624cfc, 0x01c7a4c8, 0x0112bed2, 0x0010caf2}}, Y: Field{[10]uint32{0x0011cf01, 0x0339a8f9, 0x03605bcd, 0x030aebae, 0x034cb341, 0x03175177, 0x020cc5ac, 0x01350507, 0x009edd7c, 0x00399151}}}, + {X: Field{[10]uint32{0x0010518e, 0x00fb27d9, 0x01be477b, 0x02b420e9, 0x030717f5, 0x009764de, 0x02970865, 0x00e16854, 0x032883ec, 0x002b0f4e}}, Y: Field{[10]uint32{0x00b9b8db, 0x031c9a21, 0x01a125fc, 0x03e55061, 0x033dde58, 0x0039e439, 0x00d01b2c, 0x01f9d704, 0x02fcc9ed, 0x003449bb}}}, + {X: Field{[10]uint32{0x03d6aa37, 0x00f690ea, 0x0064a5c1, 0x018a5834, 0x03fa18b2, 0x01ab8999, 0x03696d95, 0x00e175b6, 0x034b2a82, 0x00115c20}}, Y: Field{[10]uint32{0x01236f28, 0x0121ac18, 0x004e121a, 0x0192b590, 0x03d9d15c, 0x02a565f9, 0x022eb590, 0x02fe21ee, 0x0083b249, 0x0007a758}}}, + {X: Field{[10]uint32{0x0183ef15, 0x00d5752e, 0x03fd3341, 0x0144dabb, 0x02b224b0, 0x0058f02a, 0x029bf792, 0x03816df0, 0x02a0ffaa, 0x00223a69}}, Y: Field{[10]uint32{0x018d1e5a, 0x01a4c91c, 0x00413999, 0x01d746ba, 0x00fe4574, 0x01e6aebf, 0x00ef5e25, 0x018fab71, 0x022dfa2f, 0x003b4e0a}}}, + {X: Field{[10]uint32{0x02dff706, 0x0361d20a, 0x0348c04f, 0x00ef5b25, 0x00b39703, 0x02b5fd86, 0x005663dc, 0x009f1a94, 0x02b4de33, 0x0005a043}}, Y: Field{[10]uint32{0x0260c81b, 0x02f0b3fb, 0x0111901f, 0x01f96a7b, 0x0230693b, 0x00370a6b, 0x019e84c4, 0x01b27485, 0x03d89132, 0x0000d4ba}}}, + {X: Field{[10]uint32{0x014adf7b, 0x00cc0726, 0x01cabe2e, 0x03650fea, 0x0088c861, 0x0223455f, 0x01c65035, 0x01260473, 0x02929506, 0x0035f40e}}, Y: Field{[10]uint32{0x002f9627, 0x00578d8e, 0x003ef2a9, 0x023f66aa, 0x02ef419c, 0x0339e079, 0x023042d5, 0x00b01472, 0x03fe933c, 0x00232082}}}, + {X: Field{[10]uint32{0x01cf11b0, 0x03c994b7, 0x018d91c6, 0x01df9154, 0x03f33aed, 0x0220339e, 0x0225c4ae, 0x02b24093, 0x0104f645, 0x0016cb25}}, Y: Field{[10]uint32{0x01296449, 0x02271d8a, 0x00354fc2, 0x02893abb, 0x03440e1d, 0x023ca901, 0x01681e5e, 0x013cc847, 0x03bcc776, 0x001402cd}}}, + {X: Field{[10]uint32{0x00fbd761, 0x012b7523, 0x01c2d628, 0x0137d5e7, 0x03bab1a6, 0x03567bb0, 0x01826759, 0x022ef05a, 0x02edd2c7, 0x00346389}}, Y: Field{[10]uint32{0x010770c3, 0x031fbd5f, 0x021a44a6, 0x03684e4b, 0x00685915, 0x016eda51, 0x018989aa, 0x00f9e23f, 0x0172037a, 0x00068780}}}, + {X: Field{[10]uint32{0x0258222d, 0x00d338a3, 0x0077224f, 0x02fe1759, 0x02dc9e46, 0x03c94951, 0x0221e88d, 0x011e5632, 0x00169bbc, 0x0017dac5}}, Y: Field{[10]uint32{0x037fd6a6, 0x02ab6bd2, 0x00600e02, 0x02378e0f, 0x033a5791, 0x018f992e, 0x03ca0bf1, 0x00140651, 0x02164d5a, 0x000ea39d}}}, + {X: Field{[10]uint32{0x03762bc7, 0x036f2283, 0x0137339b, 0x00289508, 0x01ec2e05, 0x03fa15a4, 0x00020238, 0x02d159a6, 0x01e8dcc8, 0x0035e989}}, Y: Field{[10]uint32{0x02ea3643, 0x0142d34d, 0x0080620d, 0x029c4000, 0x00208683, 0x03b07f63, 0x017bcbcf, 0x00981eaf, 0x0135a8ce, 0x0023c7e6}}}, + {X: Field{[10]uint32{0x015913f9, 0x03198fa3, 0x027716ba, 0x0325780a, 0x027ffb42, 0x0286cd3a, 0x01c891b3, 0x0293dc57, 0x001972ae, 0x00295a95}}, Y: Field{[10]uint32{0x03c3f994, 0x0266a41a, 0x038971e9, 0x008d9038, 0x0059b440, 0x01fd7451, 0x00f7bbfa, 0x0159c460, 0x03cdad78, 0x0011ecf7}}}, + {X: Field{[10]uint32{0x02ade31e, 0x0045beae, 0x03c3ad93, 0x02ccd86d, 0x0030325d, 0x028c1ad1, 0x031a3cd4, 0x032f44de, 0x01d7e574, 0x0007aee2}}, Y: Field{[10]uint32{0x00da4dc7, 0x01401d4e, 0x03e6cb95, 0x00cd24d5, 0x02ee020c, 0x0108a8d0, 0x003d1185, 0x03212d26, 0x012fbd30, 0x00080e71}}}, + {X: Field{[10]uint32{0x009706fe, 0x024ea22d, 0x030c5ad4, 0x03e8fb93, 0x03e189ef, 0x01e63b09, 0x01cd1a4a, 0x0195d52d, 0x0208931a, 0x002d5ca0}}, Y: Field{[10]uint32{0x03ede9ee, 0x037df442, 0x036c214d, 0x0028c5e0, 0x03358f68, 0x01881e2f, 0x029a6125, 0x034c072c, 0x01e72da3, 0x002ae9e1}}}, + {X: Field{[10]uint32{0x01a775c9, 0x015f2161, 0x00a8aa24, 0x025d1ebf, 0x02f5162a, 0x03ff07bd, 0x02a00dee, 0x01f1dc80, 0x0270d67b, 0x00159985}}, Y: Field{[10]uint32{0x018803f6, 0x01128953, 0x019b2ea0, 0x024ce7c6, 0x014de8a8, 0x015274f0, 0x0055122e, 0x01441c13, 0x00e183bc, 0x002b6bc2}}}, + {X: Field{[10]uint32{0x01f2704d, 0x001a3c37, 0x023e93fd, 0x0346c5c2, 0x01c18521, 0x015cded4, 0x01042433, 0x01ada5dc, 0x02e1ecc8, 0x00062ad5}}, Y: Field{[10]uint32{0x0119e94a, 0x020967a0, 0x039ff46b, 0x01fb387f, 0x03df74f0, 0x032cc158, 0x009572ca, 0x02ea6c83, 0x003f43bf, 0x00331a53}}}, + {X: Field{[10]uint32{0x020ac357, 0x0283c6f3, 0x027c3c1a, 0x0214b83c, 0x036e9451, 0x02fd7d43, 0x035b7540, 0x000d8055, 0x00744827, 0x002f04aa}}, Y: Field{[10]uint32{0x01ada1e9, 0x0005f1bc, 0x036f95de, 0x01598bfc, 0x00abe12d, 0x00812b39, 0x027783c7, 0x01738759, 0x036bac17, 0x00271b39}}}, + {X: Field{[10]uint32{0x01054584, 0x01eb119e, 0x024572c2, 0x0259776f, 0x01756667, 0x014fb29d, 0x01bdd6c3, 0x036835bb, 0x002699b2, 0x00291253}}, Y: Field{[10]uint32{0x0082d621, 0x014e1b54, 0x01d03554, 0x01a4ee2b, 0x02e8f0cf, 0x00756c6e, 0x022a9146, 0x02a79f4f, 0x00d58360, 0x00162601}}}, + {X: Field{[10]uint32{0x023aea6e, 0x012b2733, 0x009c7828, 0x038ba8f7, 0x03f1baf9, 0x000da809, 0x034de77d, 0x0139faf8, 0x02f96d0e, 0x0007fe11}}, Y: Field{[10]uint32{0x013f2e6a, 0x00f84b59, 0x009748d0, 0x03be94b7, 0x0327ba3e, 0x01302da3, 0x035d1a8d, 0x00d580c7, 0x036b9f0e, 0x0022828c}}}, + {X: Field{[10]uint32{0x0110b374, 0x023c7ca5, 0x00099ffa, 0x0090d5d1, 0x026862d7, 0x005cfdc5, 0x00839e04, 0x00f771ca, 0x02ae9157, 0x000cc606}}, Y: Field{[10]uint32{0x01c5223e, 0x039f27ef, 0x01fedad0, 0x01acf86a, 0x01f01ee2, 0x030d3129, 0x01aaa0a4, 0x03393077, 0x029a8cc8, 0x00049484}}}, + {X: Field{[10]uint32{0x00012594, 0x0232795e, 0x02ae5702, 0x001bf931, 0x00644264, 0x01c9d2a5, 0x0249b157, 0x0112bbdd, 0x032dfb0e, 0x0039a1e0}}, Y: Field{[10]uint32{0x0113b7c0, 0x030312a9, 0x030028ca, 0x0263bb2a, 0x03c5de4f, 0x01dffedf, 0x01caec8c, 0x00d2ded9, 0x009706b7, 0x001796ce}}}, + {X: Field{[10]uint32{0x00b37def, 0x031cbce5, 0x02aa5755, 0x01477d31, 0x0000c229, 0x028631db, 0x0174b5e2, 0x01c6b160, 0x02c3ed93, 0x000d52ef}}, Y: Field{[10]uint32{0x0214c29a, 0x02a0ff31, 0x0244b5c2, 0x03beeeae, 0x033c2f4d, 0x01d0078f, 0x0213ac73, 0x0105b6cd, 0x00769283, 0x00103432}}}, + {X: Field{[10]uint32{0x0039a485, 0x01bdc99d, 0x00511ae3, 0x02ffe8bd, 0x02a8bc68, 0x02d7afbc, 0x01e8aa68, 0x02e07cf2, 0x006c5205, 0x003e91ab}}, Y: Field{[10]uint32{0x0367d180, 0x01354b8f, 0x03b35c1b, 0x01e9d97e, 0x010f2565, 0x00fe4461, 0x00de37b1, 0x034aa007, 0x01fab016, 0x000e14fe}}}, + {X: Field{[10]uint32{0x0024328c, 0x01fb50cc, 0x02688562, 0x01de517d, 0x0256a53d, 0x008fee1b, 0x005263c9, 0x017e387a, 0x02b73325, 0x00109be1}}, Y: Field{[10]uint32{0x028c4fdf, 0x03bef353, 0x011486a2, 0x0105abfe, 0x01658c63, 0x01ec8885, 0x013c4c45, 0x0322756c, 0x01685301, 0x0024bb00}}}, + {X: Field{[10]uint32{0x00bc64e3, 0x02db9620, 0x01edeb47, 0x03b2d6b8, 0x017685df, 0x01f5233c, 0x01d3f4d1, 0x00b56f85, 0x009bf9a7, 0x00172347}}, Y: Field{[10]uint32{0x01bda7e5, 0x0343df4a, 0x02dc4e18, 0x014d9074, 0x00b6a26b, 0x0083c37b, 0x038a3c7c, 0x02054198, 0x010e286c, 0x00188155}}}, + {X: Field{[10]uint32{0x0283422f, 0x02f95c39, 0x03c80271, 0x01cfe998, 0x01be6733, 0x01aa72c0, 0x00313562, 0x01407f77, 0x01bc7bf7, 0x000e8087}}, Y: Field{[10]uint32{0x001bfa53, 0x01ec3793, 0x00fff54c, 0x0209217f, 0x02a7a71b, 0x0015924a, 0x00e508ad, 0x037e25e1, 0x00540dda, 0x00192a27}}}, + {X: Field{[10]uint32{0x03ba47bb, 0x012bc9c8, 0x0326fa50, 0x030c8a59, 0x027c0062, 0x007590b6, 0x01d2dd91, 0x027c001d, 0x02491d71, 0x002360aa}}, Y: Field{[10]uint32{0x03e4e77a, 0x01718b14, 0x026991ff, 0x03f51d83, 0x007c2ae8, 0x031b4f14, 0x00ed10d6, 0x01e3da62, 0x03506d14, 0x001b985b}}}, + {X: Field{[10]uint32{0x005e536f, 0x03c2394f, 0x02d76f27, 0x0145b9ea, 0x010bbe54, 0x032b06cf, 0x015d60ef, 0x023869bb, 0x0188fe48, 0x001bfbba}}, Y: Field{[10]uint32{0x0044c502, 0x00a6632c, 0x00eeff48, 0x0184d781, 0x0073dcee, 0x0096da28, 0x026d8484, 0x02ea5ae8, 0x0395839f, 0x00003ba7}}}, + {X: Field{[10]uint32{0x0216fa1b, 0x00f9672b, 0x00e5d2df, 0x002ba257, 0x02306388, 0x005024f1, 0x03cadc73, 0x00355dcb, 0x0179bafd, 0x000d8902}}, Y: Field{[10]uint32{0x004afa48, 0x005f1872, 0x036ca65f, 0x003055e0, 0x03eb2082, 0x01f60cb2, 0x02fe3267, 0x00f6169e, 0x037658ef, 0x00186740}}}, + {X: Field{[10]uint32{0x036a18f4, 0x026128f3, 0x03407009, 0x0132461d, 0x000b7849, 0x01ba05c1, 0x0046fc32, 0x01814f08, 0x00474da5, 0x00130ae2}}, Y: Field{[10]uint32{0x0328142c, 0x007f884e, 0x03398dda, 0x038f432a, 0x03734286, 0x01716a08, 0x00a0b438, 0x035c4587, 0x026917a4, 0x001166a7}}}, + {X: Field{[10]uint32{0x01478ac2, 0x004beeac, 0x005ad84e, 0x0142bdee, 0x00d6e54f, 0x0141130d, 0x034eb5b1, 0x0046ea9f, 0x01fdb332, 0x003e4872}}, Y: Field{[10]uint32{0x02016973, 0x005243eb, 0x014f9317, 0x030d7356, 0x01e31fae, 0x03dfd893, 0x006b16a5, 0x0120f923, 0x01b8c850, 0x000e336a}}}, + {X: Field{[10]uint32{0x0319b257, 0x00b1ac86, 0x038b8ca4, 0x01f7d079, 0x02850ae0, 0x028ff6d3, 0x006c8a7d, 0x035a3e3e, 0x01e66181, 0x00295dda}}, Y: Field{[10]uint32{0x027cfc6c, 0x0276bf14, 0x00eb3882, 0x0260a03e, 0x011dcd66, 0x013542e9, 0x017e00d5, 0x0310afdd, 0x007e644b, 0x00084aa6}}}, + {X: Field{[10]uint32{0x03c11d9f, 0x02a526b1, 0x0063901e, 0x0053fb5d, 0x03375a27, 0x00f26c5a, 0x00c91952, 0x03b2b622, 0x010437ab, 0x002569e0}}, Y: Field{[10]uint32{0x02cfdf78, 0x007b2ca8, 0x0274809e, 0x01da4688, 0x00ec6428, 0x03c46925, 0x02723df1, 0x0015ac90, 0x00aa227b, 0x003ab8c8}}}, + {X: Field{[10]uint32{0x01cfa42a, 0x03503d0a, 0x020e5d10, 0x01761612, 0x009f034a, 0x03a61002, 0x01a9a64c, 0x00f850ab, 0x0034f7ef, 0x001da9f8}}, Y: Field{[10]uint32{0x028effa2, 0x0251a2d9, 0x0240479c, 0x025948a8, 0x009f2e49, 0x02f0bbb7, 0x00ec9319, 0x03acf0a9, 0x00e49633, 0x00266770}}}, + {X: Field{[10]uint32{0x035881d6, 0x023347ba, 0x0247df4e, 0x03357a50, 0x01427010, 0x036df60b, 0x00ddf929, 0x01e01407, 0x03964756, 0x003aea24}}, Y: Field{[10]uint32{0x03bca552, 0x029a6d76, 0x026a50d4, 0x022a3692, 0x02aebe0f, 0x005b3175, 0x037d8be6, 0x014850fc, 0x01f1c088, 0x002e4ab8}}}, + {X: Field{[10]uint32{0x0223704f, 0x03cf875b, 0x028addd3, 0x0225c4f3, 0x01dc0b75, 0x02bb51cd, 0x014f872a, 0x038559ac, 0x00d8059f, 0x00294e92}}, Y: Field{[10]uint32{0x01387fb6, 0x022d454e, 0x02a0d252, 0x00619db3, 0x004f4634, 0x03b9f559, 0x009403f3, 0x028ea0f6, 0x01a07e85, 0x00279ce3}}}, + {X: Field{[10]uint32{0x0307d3bc, 0x013f57a9, 0x00fb595b, 0x03e660a2, 0x03c831cd, 0x001418e9, 0x039b1481, 0x03e28e38, 0x010bdba5, 0x0020c996}}, Y: Field{[10]uint32{0x03768982, 0x01986caf, 0x02b06cb4, 0x013ca5f9, 0x03061b7d, 0x03e904c3, 0x000d62ec, 0x037494b4, 0x0388a2a1, 0x000280b3}}}, + {X: Field{[10]uint32{0x03916030, 0x02b1b7c5, 0x014af7f5, 0x00b02571, 0x03b0c35a, 0x01e9d2cb, 0x01714a21, 0x0042ff8c, 0x0194ba8c, 0x001a9248}}, Y: Field{[10]uint32{0x00c77b87, 0x01b148be, 0x0145db6b, 0x0001bfaf, 0x01c531cd, 0x013f0ca2, 0x02e8b4fb, 0x024dea4b, 0x01658e0c, 0x000f3c2f}}}, + {X: Field{[10]uint32{0x03c52a57, 0x030c1a0c, 0x007474b6, 0x004df8f5, 0x013b34bf, 0x01ae8887, 0x0180c494, 0x01fbb587, 0x01c6ff79, 0x002d2b1c}}, Y: Field{[10]uint32{0x012820f7, 0x000d41b5, 0x03683905, 0x01837e04, 0x0214ae3b, 0x01893835, 0x03d23434, 0x03fbf3bc, 0x02e48fb6, 0x0011ab2c}}}, + {X: Field{[10]uint32{0x0286e0bc, 0x0064c5b0, 0x02f9b49a, 0x024e8707, 0x0113b19b, 0x0155ec84, 0x03f05b4e, 0x00a7845a, 0x011e65bc, 0x0022c45c}}, Y: Field{[10]uint32{0x02af0dde, 0x0241e322, 0x004910aa, 0x03d71c8b, 0x00faa6bc, 0x02d3ab96, 0x02d695e5, 0x00d4e086, 0x00cfcf38, 0x001e7128}}}, + {X: Field{[10]uint32{0x0008e098, 0x013d90d1, 0x0192d897, 0x030db5e8, 0x00727362, 0x0203f789, 0x0203f82e, 0x0095e65d, 0x0276e86b, 0x002e2c02}}, Y: Field{[10]uint32{0x013e56c6, 0x006dbe14, 0x03d0a585, 0x03ede121, 0x029e0b9f, 0x03ab5ecb, 0x006fa1cf, 0x002375f3, 0x03188b01, 0x000176d9}}}, + {X: Field{[10]uint32{0x01d89814, 0x038b4b58, 0x03a52c50, 0x01a41917, 0x02bebe8f, 0x026dc4f1, 0x0027a8f6, 0x02e5a14d, 0x021b0fb6, 0x0022130e}}, Y: Field{[10]uint32{0x03a3749b, 0x01963381, 0x00fbf14d, 0x012f56c6, 0x00ff28aa, 0x03d537b0, 0x003f821d, 0x00bbbcdd, 0x00e5094b, 0x000f6b30}}}, + {X: Field{[10]uint32{0x00637596, 0x0291fe5d, 0x037d8496, 0x006abad8, 0x02c004dd, 0x02fdbed3, 0x004100dc, 0x02fd8ff8, 0x01cf51aa, 0x000f4307}}, Y: Field{[10]uint32{0x025df51c, 0x010c8d82, 0x0305d228, 0x004cf8bb, 0x02883fe0, 0x0267eedd, 0x0242a6f5, 0x038b3418, 0x015bbf5d, 0x0015dbaf}}}, + {X: Field{[10]uint32{0x02bca8c7, 0x020478b6, 0x028fa13f, 0x02d8f54c, 0x031ae972, 0x009deddf, 0x0057f79a, 0x026b7097, 0x01af6153, 0x0015acfb}}, Y: Field{[10]uint32{0x012e98eb, 0x02b19b4b, 0x01347dbd, 0x02ade6cf, 0x0096bdfb, 0x0376a574, 0x02b3d2b5, 0x021809c6, 0x0100a2b2, 0x00100e0e}}}, + {X: Field{[10]uint32{0x03cfd3e2, 0x02417eca, 0x01457a74, 0x0360c67e, 0x025fbb11, 0x0115217f, 0x00eacfa8, 0x01327d0d, 0x01bf50f3, 0x00109b8a}}, Y: Field{[10]uint32{0x03cb117a, 0x004c660c, 0x017a35d6, 0x02237c7d, 0x00eeb60b, 0x00ee77d0, 0x0110cd5c, 0x01031883, 0x02e8eeff, 0x003ab11f}}}, + {X: Field{[10]uint32{0x02929308, 0x014329d8, 0x03ea67ed, 0x03ed6ff0, 0x03cf0a91, 0x00bb6b71, 0x01419baa, 0x0135fb1b, 0x03c9f4e2, 0x002555cd}}, Y: Field{[10]uint32{0x001675dd, 0x02b3bb52, 0x0260867b, 0x02d6ee0b, 0x01b69831, 0x0166fd91, 0x02783143, 0x024100be, 0x009d18fd, 0x0025eeee}}}, + {X: Field{[10]uint32{0x00b3e514, 0x021405fa, 0x004a1cbb, 0x02820e9e, 0x00704e74, 0x035f9eb4, 0x03ae639f, 0x009e83cb, 0x0013d464, 0x00175caa}}, Y: Field{[10]uint32{0x00876c2f, 0x00584f2e, 0x005ac9bc, 0x00dbd471, 0x022e8c26, 0x0267ae56, 0x01d6839a, 0x03187956, 0x010e851f, 0x00324bd0}}}, + {X: Field{[10]uint32{0x0369b6ef, 0x0146edf9, 0x02406225, 0x02701e14, 0x02dda784, 0x01c12570, 0x00876d91, 0x02224188, 0x0359e9bc, 0x0031f6a4}}, Y: Field{[10]uint32{0x01c10653, 0x02530fc1, 0x001c6d37, 0x031720bc, 0x01cb41f6, 0x012831f6, 0x01907872, 0x02340257, 0x01687150, 0x000489e0}}}, + {X: Field{[10]uint32{0x029ac683, 0x024193d5, 0x01ace972, 0x035ff86b, 0x02d92697, 0x0082b945, 0x03ee080f, 0x03c3f70b, 0x0226da7a, 0x0019c202}}, Y: Field{[10]uint32{0x0316d94d, 0x008b3f08, 0x03714aa5, 0x0339e7dd, 0x008e08c5, 0x01443ab0, 0x0144107e, 0x01c22cc2, 0x03acfbba, 0x002b6681}}}, + {X: Field{[10]uint32{0x03fc0dbf, 0x00015c16, 0x01a4163a, 0x00117055, 0x023947f4, 0x00b8ebeb, 0x0078ddc8, 0x00a3ddbe, 0x0239d614, 0x00084356}}, Y: Field{[10]uint32{0x028c511c, 0x02c600cb, 0x017ac96e, 0x01324fa6, 0x002efa80, 0x01ea464f, 0x014cc296, 0x00a70bb4, 0x03e6b0a6, 0x00185fbf}}}, + {X: Field{[10]uint32{0x0334ed98, 0x00874138, 0x015fc590, 0x0071bfd9, 0x039b8e46, 0x01e0df44, 0x03242a93, 0x0046e714, 0x0231ca15, 0x001742e4}}, Y: Field{[10]uint32{0x03e924ae, 0x00e99baf, 0x01986bd1, 0x0387dbe3, 0x011a2f58, 0x0279f5b3, 0x03ae1b4a, 0x013b69c4, 0x0121f479, 0x003201c0}}}, + {X: Field{[10]uint32{0x02907392, 0x01e299f8, 0x00ab63ce, 0x00abf344, 0x019013fe, 0x0131c65d, 0x00c8bd54, 0x004587b4, 0x002c4210, 0x001a1eee}}, Y: Field{[10]uint32{0x000d9eeb, 0x017a5984, 0x03e356a2, 0x020440e5, 0x03fafc8e, 0x022c8273, 0x03c721cf, 0x028e9be7, 0x0187758a, 0x003abd8f}}}, + {X: Field{[10]uint32{0x025f5d33, 0x01a9b473, 0x00da40e6, 0x0347d2f3, 0x03c63527, 0x03cb0ffc, 0x02a3931f, 0x023da068, 0x0157b804, 0x00146910}}, Y: Field{[10]uint32{0x0047dd31, 0x009ffa7a, 0x02a1ec51, 0x019cb6e5, 0x001a0c56, 0x00298e24, 0x03dc8f42, 0x00a50053, 0x0116519c, 0x001bff23}}}, + {X: Field{[10]uint32{0x01e86775, 0x01c2f2e3, 0x004f989f, 0x02c8af5f, 0x000a5dd7, 0x01e30eff, 0x024786a4, 0x00568d58, 0x017256f5, 0x002ca189}}, Y: Field{[10]uint32{0x0264f3a3, 0x0364cb51, 0x03692abc, 0x037917c5, 0x02f53b64, 0x024a4bfe, 0x0267e5b2, 0x014e5ade, 0x02a80a5a, 0x0008aba5}}}, + {X: Field{[10]uint32{0x0035bc30, 0x01f1ff82, 0x02e584bb, 0x02f3ee4a, 0x036ee129, 0x028e5884, 0x03d89a5c, 0x01e32bba, 0x021e2010, 0x003ddadc}}, Y: Field{[10]uint32{0x02c0d561, 0x00bd28f9, 0x024b7a06, 0x00e07a5a, 0x03223a0a, 0x0186ebff, 0x02b3d171, 0x026100f5, 0x02b10841, 0x0016671a}}}, + {X: Field{[10]uint32{0x00178e9c, 0x001f0d31, 0x01b9793b, 0x022cdb7b, 0x01d9a3b8, 0x03da5a44, 0x02f20b7f, 0x03b81ba0, 0x028763ad, 0x0004bc92}}, Y: Field{[10]uint32{0x0055b7f1, 0x01e35638, 0x021b7351, 0x037c230b, 0x02b2427f, 0x00a09efb, 0x025d939c, 0x007edec9, 0x039f96f0, 0x00167f5e}}}, + {X: Field{[10]uint32{0x0122260a, 0x008878c6, 0x010cefa0, 0x0117123e, 0x00bcfaf1, 0x01609033, 0x0082d477, 0x01aef8a8, 0x0290de6c, 0x002786e2}}, Y: Field{[10]uint32{0x03390f9f, 0x02966042, 0x000a66cd, 0x001ba923, 0x008a71eb, 0x0025f401, 0x02a54f42, 0x036781f0, 0x02a5b54b, 0x003e97a1}}}, + {X: Field{[10]uint32{0x03baae9c, 0x00240c4b, 0x020a38c1, 0x03e1b134, 0x01ed4117, 0x00a38c7c, 0x01b6a66e, 0x00fadec0, 0x010320b7, 0x0018fc16}}, Y: Field{[10]uint32{0x0101d8eb, 0x02fa2c65, 0x019c501a, 0x032aebd7, 0x0340bd68, 0x0098e1df, 0x0288967a, 0x0207f81b, 0x01d2d34a, 0x00092e32}}}, + {X: Field{[10]uint32{0x03905999, 0x0264ad18, 0x003a8e27, 0x01ba671d, 0x01e5c89b, 0x0367ca15, 0x03569a4a, 0x00a8f687, 0x0009f540, 0x00111f1d}}, Y: Field{[10]uint32{0x0149e154, 0x0240dc2b, 0x0328db77, 0x01ce2e4f, 0x00716baa, 0x03805b02, 0x0337723b, 0x01e8251e, 0x019ab34a, 0x003513a3}}}, + {X: Field{[10]uint32{0x00793254, 0x03c437fe, 0x006df1bb, 0x03d28fe6, 0x0025eed4, 0x003c65f9, 0x037db0c2, 0x0102bead, 0x006a4c53, 0x001d2910}}, Y: Field{[10]uint32{0x03742023, 0x0261fad9, 0x0246dfc7, 0x02f014aa, 0x02dc4c07, 0x00711ac5, 0x0136907d, 0x029c4a33, 0x038a0a4b, 0x00058b59}}}, + {X: Field{[10]uint32{0x03047c07, 0x00c91ba3, 0x005ff3a2, 0x01d814e9, 0x022bf5e0, 0x010731ed, 0x00e63cc8, 0x0098deac, 0x01713187, 0x003dc0d4}}, Y: Field{[10]uint32{0x021097ef, 0x03ba7076, 0x00936cca, 0x032599c6, 0x02b3c7ee, 0x025cad67, 0x01762a95, 0x001e15c8, 0x03914f47, 0x003212c0}}}, + {X: Field{[10]uint32{0x02eaae11, 0x0267dbdc, 0x024f6ac9, 0x01a37285, 0x022194d1, 0x02c29054, 0x013bd706, 0x00d604b1, 0x007b57b2, 0x003b13f8}}, Y: Field{[10]uint32{0x02fff789, 0x00a3d728, 0x004d7b55, 0x01e6f74c, 0x01b2f9df, 0x026dd814, 0x02b1dc4e, 0x02ca7fb0, 0x029145de, 0x002bd254}}}, + {X: Field{[10]uint32{0x01d2ac9d, 0x02ead2b3, 0x0238878d, 0x011c47cd, 0x00c65520, 0x005a3435, 0x00b274ee, 0x005d3de8, 0x01e8fa96, 0x0005c55b}}, Y: Field{[10]uint32{0x0061ac3d, 0x01a00fc5, 0x00ca6abb, 0x0211e78a, 0x03c2de9f, 0x037b2e23, 0x00e37ed6, 0x01183261, 0x02c436c1, 0x0000ab8f}}}, + {X: Field{[10]uint32{0x021b2ede, 0x032990e6, 0x02a6aabf, 0x00302541, 0x01549cb9, 0x00374c33, 0x029be560, 0x011feb3e, 0x022b9c5a, 0x003906d1}}, Y: Field{[10]uint32{0x017507f4, 0x002fc440, 0x01311d38, 0x01308885, 0x03e1b360, 0x0231a563, 0x00fb3533, 0x02982b1a, 0x02b208bd, 0x000423f8}}}, + {X: Field{[10]uint32{0x0344aa38, 0x01bd0ddd, 0x015ad38a, 0x01e314ee, 0x03f357ea, 0x006a00e3, 0x00800515, 0x01e20f5e, 0x015920a6, 0x002e9b00}}, Y: Field{[10]uint32{0x02002cf3, 0x026d6e45, 0x03680457, 0x006d9a1b, 0x00cda144, 0x003a39c4, 0x0366aa5c, 0x02dd1a0c, 0x00e7deb6, 0x00369270}}}, + {X: Field{[10]uint32{0x00cbf1ae, 0x020d5a3e, 0x0329cee2, 0x014e1255, 0x037e8a95, 0x01f94998, 0x0102ab7f, 0x012dae1c, 0x006e883a, 0x0009bc06}}, Y: Field{[10]uint32{0x03d5f47a, 0x009176d2, 0x002d398b, 0x008c1d5c, 0x00aad788, 0x02568628, 0x01519809, 0x025f2b33, 0x01e4bb21, 0x0003bbe3}}}, + {X: Field{[10]uint32{0x000c9d22, 0x0007296d, 0x03cddc45, 0x038f6998, 0x03e00874, 0x00050398, 0x01b5588c, 0x033af0d4, 0x03de80c0, 0x000042e4}}, Y: Field{[10]uint32{0x00903258, 0x016d3407, 0x002842d0, 0x03c850d6, 0x001dfef7, 0x03b1257b, 0x0186b027, 0x03cdaf9e, 0x01ddf79a, 0x003b4c62}}}, + {X: Field{[10]uint32{0x03769dde, 0x0268f9dd, 0x002558bc, 0x0101db25, 0x017a1595, 0x03d6a315, 0x03b32da8, 0x020b0725, 0x0274337a, 0x0039e7b0}}, Y: Field{[10]uint32{0x028a06f6, 0x0145d898, 0x0102c3b6, 0x03660f5d, 0x02e527da, 0x02223cfb, 0x024c175d, 0x03f38d52, 0x039f22da, 0x0027c8c1}}}, + {X: Field{[10]uint32{0x03c101e1, 0x034c685b, 0x01b0c1b7, 0x038e4810, 0x002be265, 0x023832a9, 0x039915e0, 0x02b4ff22, 0x017544f0, 0x0003f680}}, Y: Field{[10]uint32{0x018902e7, 0x00bd7061, 0x0030d0db, 0x01dae128, 0x03e4d49a, 0x029415cc, 0x03e42981, 0x0271baf1, 0x022785d5, 0x001093a6}}}, + {X: Field{[10]uint32{0x0099c6bd, 0x033c46e8, 0x01b31577, 0x028f2f3f, 0x008327d8, 0x022f20c3, 0x03147258, 0x0337f940, 0x01cb5380, 0x001a07c0}}, Y: Field{[10]uint32{0x039002bc, 0x0252463c, 0x018cd007, 0x02b63836, 0x0359c02f, 0x03f279d5, 0x006cef06, 0x02c17e70, 0x0117cdc3, 0x002fe748}}}, + {X: Field{[10]uint32{0x03d12f64, 0x00825736, 0x039611de, 0x0236e7bf, 0x03d6fe9f, 0x02b28942, 0x0251f4d9, 0x00b30b74, 0x026b2a2d, 0x001c3096}}, Y: Field{[10]uint32{0x02966126, 0x02669346, 0x021f46b2, 0x00136647, 0x03134dae, 0x024fa96d, 0x03f4dc47, 0x02cb3f34, 0x0368a386, 0x00327bab}}}, + {X: Field{[10]uint32{0x03ccbb9d, 0x00486e27, 0x0330403b, 0x02143fa2, 0x023b466e, 0x03d02199, 0x03d5ea45, 0x010b53fb, 0x012c404b, 0x0011937b}}, Y: Field{[10]uint32{0x005d910b, 0x009c4884, 0x01260796, 0x01ef9069, 0x03610bb4, 0x0295a0d9, 0x02d2d3e0, 0x03d84c8e, 0x01046ad3, 0x002b044e}}}, + {X: Field{[10]uint32{0x03a103db, 0x00bc4d04, 0x023f02ad, 0x02406d73, 0x01b7ff89, 0x023177f0, 0x0055109a, 0x02466175, 0x037248e7, 0x00028cb7}}, Y: Field{[10]uint32{0x03160e72, 0x0084d292, 0x02173821, 0x034cf997, 0x00cf9ad8, 0x01d8a5b2, 0x02a2d1d8, 0x0241ae6b, 0x00fb9d60, 0x001b6d2d}}}, + {X: Field{[10]uint32{0x0165179a, 0x0254c540, 0x03fe9a76, 0x0370a971, 0x023ccb74, 0x013b13fa, 0x00297746, 0x034e725c, 0x029e7ee5, 0x003f9273}}, Y: Field{[10]uint32{0x03e7dc8c, 0x023c3e8f, 0x026e63f5, 0x020ad310, 0x0390bfc5, 0x018555c8, 0x03b98662, 0x01773bbb, 0x013a3592, 0x00194fd5}}}, + {X: Field{[10]uint32{0x0354ad14, 0x01cc5b8c, 0x01a878aa, 0x0028ab75, 0x01ec0f1a, 0x0049ac43, 0x0224750c, 0x029f0936, 0x0255c895, 0x0021a2cb}}, Y: Field{[10]uint32{0x02c299ef, 0x0187c91e, 0x00324efb, 0x02080201, 0x00776bca, 0x0298a46f, 0x03035941, 0x0067f5c7, 0x0074cdea, 0x00178a22}}}, + {X: Field{[10]uint32{0x00098461, 0x03422d63, 0x011aec63, 0x01fbf4cb, 0x03d267ff, 0x003f121a, 0x013f1c08, 0x00d31a2b, 0x00da90ae, 0x003f81e4}}, Y: Field{[10]uint32{0x00f7177e, 0x00efabdb, 0x03ef416f, 0x036d5a02, 0x02cdbfcc, 0x008b184c, 0x01a02444, 0x02ca0d1c, 0x0393de35, 0x002b4cc4}}}, + {X: Field{[10]uint32{0x03e9a9d9, 0x03609e5b, 0x039557f6, 0x03d59a0d, 0x0242a23b, 0x019f7fbe, 0x016b1961, 0x020373fc, 0x028d0f4f, 0x003f9ff2}}, Y: Field{[10]uint32{0x00d4eb3b, 0x023c72f6, 0x01b1e71c, 0x02738605, 0x02ccc572, 0x02051dab, 0x000cb3d6, 0x03a49776, 0x018a0d7e, 0x002ef137}}}, + {X: Field{[10]uint32{0x0034cfc2, 0x00da1625, 0x03fd23aa, 0x0263a7c0, 0x02ae7975, 0x00473d30, 0x011b11b5, 0x03882fad, 0x0270aa4c, 0x00288db0}}, Y: Field{[10]uint32{0x0088f29b, 0x00e8c7c8, 0x01f4c486, 0x0103eeda, 0x028bc370, 0x00230842, 0x00c3ade6, 0x02f7ad07, 0x01c575a7, 0x00164d66}}}, + {X: Field{[10]uint32{0x02519248, 0x0151bf1d, 0x03644565, 0x03ab6787, 0x02800472, 0x00e0d938, 0x028a3485, 0x0309fcfa, 0x00a56bb8, 0x00035a81}}, Y: Field{[10]uint32{0x0142deb9, 0x01c1a6ad, 0x00e079b7, 0x019889ba, 0x03dbf6e4, 0x015d8490, 0x03099aba, 0x01d8a48a, 0x030d50b9, 0x0012e551}}}, + {X: Field{[10]uint32{0x00a30e7f, 0x000baa7e, 0x02ebd74e, 0x00a0c986, 0x00677732, 0x035c0689, 0x0276f974, 0x00117f86, 0x0377d64a, 0x00342734}}, Y: Field{[10]uint32{0x0188ffea, 0x02a49359, 0x02e57b90, 0x03abb81a, 0x0141a342, 0x032be203, 0x02ed2d01, 0x000acf5d, 0x02b902b7, 0x0027c250}}}, + {X: Field{[10]uint32{0x01d98b8b, 0x0343a979, 0x03440b2e, 0x02fffc29, 0x01b9a469, 0x0071f8ff, 0x02e52456, 0x006a75b0, 0x032c16d0, 0x00340c31}}, Y: Field{[10]uint32{0x031f2c8e, 0x02c3c454, 0x006f473d, 0x019f2850, 0x03fddeee, 0x02baa10e, 0x02b60ffe, 0x03e60405, 0x0308dba4, 0x00031ac4}}}, + {X: Field{[10]uint32{0x0345a691, 0x031aec78, 0x03ba1100, 0x03dd5c1a, 0x0157d0c6, 0x002ce695, 0x01980ab8, 0x0129f510, 0x02c6d2c0, 0x0015b115}}, Y: Field{[10]uint32{0x02084819, 0x00d39909, 0x03189fae, 0x00968184, 0x02825ce5, 0x01d4f0ac, 0x0310ffc2, 0x01743e3b, 0x00dc2c73, 0x00316cbc}}}, + {X: Field{[10]uint32{0x008400c9, 0x0146eb0c, 0x0037d75e, 0x03178396, 0x0129d911, 0x0353f779, 0x01d1b98d, 0x0347d0a3, 0x01f3b505, 0x002ab56b}}, Y: Field{[10]uint32{0x0377acc6, 0x02ae1f89, 0x036e46af, 0x03c877d2, 0x00f55569, 0x01e431a3, 0x03aa411b, 0x02530448, 0x03674f79, 0x003a52b7}}}, + {X: Field{[10]uint32{0x026a0ef0, 0x0219e8d7, 0x0034e6b1, 0x030c67b4, 0x02ca1d43, 0x0062d32c, 0x006b089f, 0x02e3dd22, 0x00b4dd76, 0x002b2336}}, Y: Field{[10]uint32{0x037ba96d, 0x02753dc4, 0x001f3c75, 0x02d26f32, 0x02ffb71d, 0x032b73f1, 0x013f8271, 0x02ac55d0, 0x0094f9da, 0x001c75c2}}}, + {X: Field{[10]uint32{0x0047ca1d, 0x0314d5f7, 0x0394841d, 0x0143d085, 0x0093eb41, 0x01665ad1, 0x01d7a4d0, 0x03e91502, 0x006df110, 0x000e5900}}, Y: Field{[10]uint32{0x03ad7cdb, 0x0291b7c0, 0x017d6395, 0x01d0daff, 0x01c2f244, 0x00fc15f9, 0x022a2bd2, 0x0364ebe4, 0x006d21db, 0x00392847}}}, + {X: Field{[10]uint32{0x03ca56ec, 0x0387efde, 0x01d551a0, 0x03e3ed0f, 0x03723a1f, 0x02fe442d, 0x02a37b19, 0x004aedd3, 0x039227a3, 0x000af842}}, Y: Field{[10]uint32{0x02df59ab, 0x014bb731, 0x000b4590, 0x03a3076f, 0x03755b2d, 0x00a42c92, 0x03ecca94, 0x037034a4, 0x02fbc886, 0x00066aa2}}}, + {X: Field{[10]uint32{0x01ad6ae5, 0x018c96ad, 0x01342a4c, 0x005c70e3, 0x03ccc1e4, 0x03ff22ea, 0x0219a34d, 0x03d46874, 0x01562bd7, 0x000de705}}, Y: Field{[10]uint32{0x03185907, 0x00feb10b, 0x0348db98, 0x00d1fc81, 0x01e7bc67, 0x0036554d, 0x01ce2231, 0x0077d59b, 0x028fa637, 0x0011e87c}}}, + {X: Field{[10]uint32{0x03ce9809, 0x033dea07, 0x014f9914, 0x02426277, 0x0130a362, 0x01e0443a, 0x03584a7d, 0x011674ab, 0x01c2e675, 0x00090153}}, Y: Field{[10]uint32{0x017ae592, 0x016128b9, 0x02a7612b, 0x02069bc0, 0x013553dc, 0x008345a9, 0x00e06d48, 0x03429c71, 0x021d3e05, 0x00195cab}}}, + {X: Field{[10]uint32{0x002420a4, 0x02d323a8, 0x0298fa3b, 0x0322e140, 0x02913199, 0x00408ecc, 0x03cd8790, 0x02a5e6ad, 0x02a6f46c, 0x002604b9}}, Y: Field{[10]uint32{0x00f937f0, 0x004ae722, 0x0315152a, 0x00ed595d, 0x033afd96, 0x021be4dd, 0x03baf369, 0x0364cc06, 0x02eddfec, 0x0011a3db}}}, + {X: Field{[10]uint32{0x0313c700, 0x000e969f, 0x03c6b962, 0x03ee5720, 0x029f6c14, 0x00b2778a, 0x00c928d6, 0x02392b61, 0x02446a34, 0x00118161}}, Y: Field{[10]uint32{0x022d57ab, 0x00079dd8, 0x021ad904, 0x004415ec, 0x034c873f, 0x02c62103, 0x0359c203, 0x01c07f99, 0x02e3ca3d, 0x00277157}}}, + {X: Field{[10]uint32{0x00be006a, 0x002541ef, 0x003228e9, 0x03298e6b, 0x021cb877, 0x012bb43e, 0x00d862fe, 0x0017ca91, 0x03972d5b, 0x002a36eb}}, Y: Field{[10]uint32{0x036fa4bc, 0x0312a5c5, 0x0190251a, 0x00a6e0f2, 0x03253e67, 0x0050742f, 0x018d38c6, 0x024df13e, 0x0003f082, 0x000f6d53}}}, + {X: Field{[10]uint32{0x011149fe, 0x01e0024e, 0x01128741, 0x0064899c, 0x02008b30, 0x013e611a, 0x0324bcd4, 0x004ca44c, 0x01f4f4d9, 0x0026e2ce}}, Y: Field{[10]uint32{0x0052c1d3, 0x025aa647, 0x030976b3, 0x01fcb82a, 0x034e4cae, 0x002c346c, 0x03fc6939, 0x00b96a23, 0x03721c45, 0x00124293}}}, + {X: Field{[10]uint32{0x014615eb, 0x00d62b4c, 0x0059773e, 0x00909e99, 0x017406ce, 0x039407e0, 0x02404ea9, 0x011b6c65, 0x01d5a7ef, 0x000cd1a0}}, Y: Field{[10]uint32{0x03ad6c0d, 0x01951094, 0x02b6d6c1, 0x0304dff9, 0x02e328fd, 0x0081a778, 0x004775a5, 0x0335aa7c, 0x003a1d80, 0x000ac8d8}}}, + {X: Field{[10]uint32{0x01c32529, 0x00fc380a, 0x02a88202, 0x01cadeba, 0x02bd5f83, 0x02933390, 0x00639b40, 0x01baf4a5, 0x0310c63c, 0x003fae38}}, Y: Field{[10]uint32{0x0343b213, 0x02fe1b76, 0x02617fbc, 0x018ef7df, 0x0068a45c, 0x019a0898, 0x017934b8, 0x035e02a9, 0x02ad6a0c, 0x0032db90}}}, + {X: Field{[10]uint32{0x0305cb67, 0x003cb121, 0x013b3fcf, 0x02d8acf6, 0x01a8ca5c, 0x02e44295, 0x01232523, 0x013a4b72, 0x03c2c733, 0x003d285e}}, Y: Field{[10]uint32{0x026e9dfe, 0x011c6c36, 0x02304bb0, 0x038f573e, 0x02e7f4a9, 0x03d14982, 0x03d55a32, 0x011ca52c, 0x039501b2, 0x00204add}}}, + {X: Field{[10]uint32{0x00cf181b, 0x011e6e93, 0x0324c7e0, 0x0257c208, 0x02c330a9, 0x03f2abd3, 0x016d596b, 0x010d2552, 0x007b8551, 0x0023b0ab}}, Y: Field{[10]uint32{0x01250130, 0x03aeea4d, 0x00258ce4, 0x025c9ec7, 0x0070e927, 0x0173c2f1, 0x00b3bcf0, 0x03498def, 0x00b67811, 0x003a8562}}}, + {X: Field{[10]uint32{0x00d4f19a, 0x010f1b01, 0x04001534, 0x02ddf68e, 0x03e4aa9e, 0x039231bd, 0x01c4b6d9, 0x0336f032, 0x021bd9ae, 0x002c79b5}}, Y: Field{[10]uint32{0x028cbf4a, 0x03e62bec, 0x031a35ae, 0x02e83b32, 0x011bc20a, 0x0235bcce, 0x01fdb344, 0x0325da2c, 0x0355b2e2, 0x0010ebde}}}, + {X: Field{[10]uint32{0x0313b2be, 0x03c8124b, 0x022e4b69, 0x018c0b53, 0x031a9519, 0x036cd50c, 0x004a3974, 0x011f70e4, 0x02e8210d, 0x001360f4}}, Y: Field{[10]uint32{0x0137a6b3, 0x015cbd8f, 0x000367c8, 0x02b25500, 0x017a0e3b, 0x039610ae, 0x005f1d88, 0x03f25ef9, 0x00833874, 0x001fb65b}}}, + {X: Field{[10]uint32{0x03b20b84, 0x02dba3ca, 0x01c36b9e, 0x03bac2ca, 0x0325f5c5, 0x01549fd9, 0x035d5143, 0x03f0875b, 0x012efd51, 0x0005123a}}, Y: Field{[10]uint32{0x02e344ad, 0x02efae65, 0x03f4cea8, 0x0298e790, 0x0013336a, 0x021a25cf, 0x011c9a22, 0x020f94be, 0x038fc8be, 0x0009228c}}}, + {X: Field{[10]uint32{0x024e4ead, 0x01c24f24, 0x03e63dcf, 0x02c09617, 0x0239d928, 0x03828863, 0x01cc7d44, 0x0142b0b3, 0x03d69c22, 0x00388ec0}}, Y: Field{[10]uint32{0x01b9aea9, 0x03ee2b9c, 0x024542ef, 0x02e84f7b, 0x0380b91c, 0x02b6c135, 0x017ef44f, 0x012df066, 0x03d04a8a, 0x00231a71}}}, + {X: Field{[10]uint32{0x02b5d7cb, 0x01c8ad0c, 0x02f94e5a, 0x0093699a, 0x00786632, 0x02baff2e, 0x02a929b9, 0x00ff9a51, 0x035e21fb, 0x00133478}}, Y: Field{[10]uint32{0x0167e3bc, 0x012ac1dc, 0x02984cba, 0x035dcc32, 0x03eca892, 0x00a5e185, 0x02887803, 0x016c42e9, 0x02dc5e86, 0x001ac444}}}, + {X: Field{[10]uint32{0x020db647, 0x03ec8102, 0x01bf5f2e, 0x02c363c7, 0x00bf25c6, 0x0165bb38, 0x00b92123, 0x02dec09f, 0x02f8092c, 0x003cf3ae}}, Y: Field{[10]uint32{0x0168d8e0, 0x0160af2a, 0x02ab7e12, 0x01cbbef6, 0x02cf3c71, 0x02ee974f, 0x0123b887, 0x03004e46, 0x01eb8418, 0x00298577}}}, + {X: Field{[10]uint32{0x01655e7d, 0x02168b1b, 0x01736a3a, 0x0379ec75, 0x02dfe341, 0x00c605c1, 0x0337c813, 0x03e235a0, 0x0128500b, 0x0012e2b3}}, Y: Field{[10]uint32{0x01219bb8, 0x0325b83f, 0x018ac624, 0x021e113c, 0x027b7c5d, 0x014bcec1, 0x016f76e0, 0x0159d613, 0x03c3825a, 0x002fa4f5}}}, + {X: Field{[10]uint32{0x00eb9fe1, 0x01c6541f, 0x03c53d47, 0x020616ba, 0x003e567d, 0x0331a37a, 0x03d2de62, 0x0002218f, 0x0081d04e, 0x002371eb}}, Y: Field{[10]uint32{0x01fa9198, 0x02e53104, 0x000e8214, 0x0224bb84, 0x031eb14c, 0x0097200f, 0x03a7755e, 0x0064c711, 0x024abe7b, 0x0018b52d}}}, + {X: Field{[10]uint32{0x01b89a23, 0x01394c30, 0x02033710, 0x015e400f, 0x01a817c2, 0x03d3cb06, 0x002bbbed, 0x03523425, 0x003f3078, 0x002a98cd}}, Y: Field{[10]uint32{0x02a7b524, 0x0256399b, 0x009bbfe7, 0x01b4338e, 0x0013befc, 0x037a51d6, 0x0020f4d9, 0x01cc3da7, 0x003423a6, 0x0009dfbe}}}, + {X: Field{[10]uint32{0x01121d30, 0x0135e841, 0x034955d0, 0x0186f085, 0x02dadeba, 0x028df7ce, 0x01096c01, 0x0079023a, 0x00619f30, 0x000df794}}, Y: Field{[10]uint32{0x0138898a, 0x00cbef39, 0x00c31f57, 0x01c35b6d, 0x00e3f6aa, 0x0001565f, 0x0136516c, 0x002e59a8, 0x009c33e4, 0x0001f9c1}}}, + {X: Field{[10]uint32{0x01eb83b4, 0x03cb0311, 0x0045e011, 0x0208be45, 0x003ebc66, 0x00d1d207, 0x028cd44f, 0x01673a8f, 0x0355506d, 0x001b4633}}, Y: Field{[10]uint32{0x00a30cdb, 0x03cabdee, 0x03854c8f, 0x029f3a01, 0x00220f7b, 0x03536e28, 0x039818e5, 0x01cfd1fe, 0x01c1ca8b, 0x003a4c3a}}}, + {X: Field{[10]uint32{0x02caa7d3, 0x025ece45, 0x01c0a5b7, 0x03f7ac74, 0x00f70243, 0x00054b27, 0x00203c49, 0x036b1775, 0x02606de7, 0x001df615}}, Y: Field{[10]uint32{0x019c659c, 0x01f6123d, 0x0122e8c3, 0x03b3e481, 0x031a2722, 0x02cf038e, 0x01b0fc94, 0x03554327, 0x03e39b37, 0x000fd5f3}}}, + {X: Field{[10]uint32{0x0381bf16, 0x0398d77c, 0x01229670, 0x002f5a76, 0x00ea5645, 0x03e753ee, 0x01dc8b56, 0x016ec715, 0x01a6c44b, 0x00170b9a}}, Y: Field{[10]uint32{0x01a3588d, 0x03c0499d, 0x03049f1a, 0x03c930d2, 0x009ec21a, 0x03f42d1b, 0x0021a8c2, 0x032a6e8a, 0x009d0a69, 0x003c2081}}}, + {X: Field{[10]uint32{0x01a393ee, 0x0339002d, 0x02af1918, 0x023626ca, 0x02aaacb9, 0x00afac1a, 0x01944ed9, 0x02496c94, 0x01f5066d, 0x000ca700}}, Y: Field{[10]uint32{0x02a57abf, 0x02bfb7fe, 0x032a9c3c, 0x0114f531, 0x02e21c2c, 0x0292494b, 0x0150c80a, 0x003ffdab, 0x0038427a, 0x001f8a6c}}}, + {X: Field{[10]uint32{0x029525da, 0x02d26f58, 0x0099df62, 0x03f21519, 0x02b670f4, 0x01c75ec3, 0x02bb4017, 0x037e90df, 0x031f18b2, 0x00130b98}}, Y: Field{[10]uint32{0x029a6f9c, 0x022728ff, 0x013701f7, 0x00b68fe1, 0x00050c6c, 0x02df0813, 0x01314326, 0x00fe9d30, 0x03fb8742, 0x0022a57a}}}, + {X: Field{[10]uint32{0x03d03fdc, 0x03efc6d8, 0x03fd9392, 0x0393184c, 0x01d3808c, 0x0384295d, 0x037cf02c, 0x0111971f, 0x03930d25, 0x003f8486}}, Y: Field{[10]uint32{0x009e0ba6, 0x0032f3a9, 0x036352a8, 0x022bcd82, 0x030e5943, 0x0110e83f, 0x03b997f9, 0x010c4653, 0x03077bda, 0x000cc4a6}}}, + {X: Field{[10]uint32{0x03784c23, 0x00ab984b, 0x0316da53, 0x03510600, 0x032cf8c5, 0x0079d2e2, 0x0220521f, 0x03cfddd3, 0x027b1cdb, 0x000c8eb0}}, Y: Field{[10]uint32{0x03c3dc18, 0x025acb4f, 0x01197bb2, 0x005bcf4c, 0x01c8489e, 0x00d2ea69, 0x00b15fe8, 0x012b1622, 0x0108f6a6, 0x00084558}}}, + {X: Field{[10]uint32{0x03afd533, 0x006a3481, 0x00d3741b, 0x0287964d, 0x01eeccbc, 0x03830840, 0x01f0ed5c, 0x02c780e9, 0x0362fdfc, 0x000451e3}}, Y: Field{[10]uint32{0x005f9153, 0x025a667b, 0x0366c70d, 0x02c82614, 0x02aba8d0, 0x0344549e, 0x00cdb176, 0x03b32191, 0x02732fd3, 0x002a7de5}}}, + {X: Field{[10]uint32{0x00b9d078, 0x010fbf08, 0x016e5e73, 0x02d5d9e2, 0x02bc8d82, 0x03b569a9, 0x008acf3a, 0x0306b7ae, 0x01b6c9d3, 0x0027c242}}, Y: Field{[10]uint32{0x007db181, 0x03ce1139, 0x017a33b0, 0x035ee669, 0x0061a579, 0x023d948d, 0x0263e30b, 0x01759371, 0x00a6c5c9, 0x00294587}}}, + {X: Field{[10]uint32{0x024a6b9f, 0x0255f4e9, 0x01711c55, 0x02c6d4bc, 0x032807ac, 0x006be02e, 0x01d8cd1a, 0x02b508a6, 0x007532a9, 0x0012582a}}, Y: Field{[10]uint32{0x02976625, 0x02e42d37, 0x03dd8cd6, 0x000bbbdd, 0x004bfc62, 0x00fe0bc9, 0x008f54a9, 0x0198a3ad, 0x01f3f1b4, 0x0015e394}}}, + {X: Field{[10]uint32{0x01310354, 0x0160bc17, 0x0066854b, 0x00d92d7b, 0x01d142d5, 0x03f27dcf, 0x010951cb, 0x00997952, 0x01c20bdb, 0x0019d70a}}, Y: Field{[10]uint32{0x008bd6d1, 0x00a411f8, 0x03a49832, 0x017e768c, 0x028cb8ad, 0x021af7e9, 0x02d4f9a1, 0x037a1080, 0x02693d82, 0x0008b47d}}}, + {X: Field{[10]uint32{0x007ce605, 0x02df26c4, 0x01d36f65, 0x037eb612, 0x01a9053a, 0x005aaccb, 0x01221779, 0x034389aa, 0x00bd6c75, 0x0031025b}}, Y: Field{[10]uint32{0x01c2bb46, 0x016f94e5, 0x023c294f, 0x01440092, 0x01b2b97e, 0x018ceb81, 0x0361efb9, 0x0325e4bf, 0x03472ae3, 0x0017c8da}}}, + {X: Field{[10]uint32{0x03905c0b, 0x003b66ce, 0x03789dd8, 0x018007e8, 0x01b1ddd4, 0x031d5055, 0x01205ec2, 0x015007c0, 0x0341ddd0, 0x0027a834}}, Y: Field{[10]uint32{0x01a28e69, 0x00570803, 0x03b717e6, 0x016654fd, 0x00ba7ce0, 0x00e625d9, 0x03692cd5, 0x0342ddbc, 0x010197e7, 0x000efd20}}}, + {X: Field{[10]uint32{0x02fb92e4, 0x035d690c, 0x028c7b4d, 0x03cb78dd, 0x01637367, 0x026056c3, 0x026edd2d, 0x03e8cdca, 0x02d784bf, 0x002f7aef}}, Y: Field{[10]uint32{0x03d0b9c0, 0x01312bb3, 0x00067673, 0x007f28ac, 0x01297a43, 0x02882507, 0x016af105, 0x026d8b70, 0x037eb62a, 0x0017fcd0}}}, + {X: Field{[10]uint32{0x02910932, 0x031f5b27, 0x020c7bcc, 0x01d1ded5, 0x000cbfe6, 0x03d55084, 0x02ea82c8, 0x00d3cb5a, 0x0244b46e, 0x002921be}}, Y: Field{[10]uint32{0x0097317a, 0x007208be, 0x03ca8323, 0x02a9fd1f, 0x01b8ad5b, 0x01532955, 0x023caa0f, 0x038a1022, 0x036d8a15, 0x0006adf8}}}, + {X: Field{[10]uint32{0x01cbba08, 0x0069f44a, 0x03769fbd, 0x02c4631f, 0x0366e7ab, 0x0082bbea, 0x0204376a, 0x02a49aa8, 0x00a557a1, 0x001118e8}}, Y: Field{[10]uint32{0x0034af0d, 0x036ada74, 0x02ce09a9, 0x0148973a, 0x037dc081, 0x002e2b44, 0x00f01de2, 0x0180a9c1, 0x02a5ab7b, 0x0012a08e}}}, + {X: Field{[10]uint32{0x01825ac4, 0x029cf7d3, 0x00b4c593, 0x0318bbad, 0x008cbdc5, 0x03647476, 0x03135840, 0x0237eead, 0x024fc45e, 0x0035b822}}, Y: Field{[10]uint32{0x02b4c55f, 0x020032d7, 0x02506c59, 0x036588bf, 0x0108be98, 0x003f8b6f, 0x031ae8fc, 0x0342e941, 0x03b477c0, 0x000b3616}}}, + {X: Field{[10]uint32{0x016a10f1, 0x00fea1fe, 0x03656a43, 0x034293e2, 0x00546d31, 0x026eff4d, 0x0076dca2, 0x032b5398, 0x02992a69, 0x002d89b8}}, Y: Field{[10]uint32{0x03cb5bc6, 0x015bd0d0, 0x03d343c6, 0x00ee32ef, 0x0162ac5e, 0x01789d95, 0x01686325, 0x0249a3c5, 0x02ceba91, 0x001b7d2c}}}, + {X: Field{[10]uint32{0x007139a5, 0x006959a5, 0x03b057e3, 0x03ad8678, 0x0225a4df, 0x03f93497, 0x01d61965, 0x0141c2cb, 0x02eb7464, 0x000d8679}}, Y: Field{[10]uint32{0x0282093f, 0x0035c944, 0x014311aa, 0x00ed1430, 0x0379940c, 0x02519f1e, 0x036c3bf2, 0x01848674, 0x0189ba15, 0x002592e2}}}, + {X: Field{[10]uint32{0x00bda2e9, 0x03dfd232, 0x02a847cc, 0x01838c9a, 0x0141e5c0, 0x014cc258, 0x00a3a65d, 0x0210ff10, 0x035e6718, 0x002cd4a6}}, Y: Field{[10]uint32{0x01c1b935, 0x03f15496, 0x030579d4, 0x01eca99e, 0x0131111e, 0x0216fb3d, 0x00595ac2, 0x02fd17a7, 0x00d37ce1, 0x001279b8}}}, + {X: Field{[10]uint32{0x03a9e05b, 0x02bf7c4b, 0x01598d42, 0x01e2500d, 0x014a1997, 0x03491fbc, 0x0385527d, 0x00517ff3, 0x00675bd7, 0x003947c0}}, Y: Field{[10]uint32{0x01b32666, 0x00a72ff0, 0x02c8cec7, 0x017cc3ad, 0x017d2e17, 0x026c11f9, 0x023d5fc6, 0x01cbad14, 0x033e8b4d, 0x003566ab}}}, + {X: Field{[10]uint32{0x01e79b28, 0x017e0c73, 0x00720170, 0x03935148, 0x0391c930, 0x0029ed52, 0x025eb6aa, 0x0311a348, 0x0066f64b, 0x0022a1fc}}, Y: Field{[10]uint32{0x02800227, 0x03afa959, 0x0113bb5e, 0x02b18954, 0x03249c34, 0x0343909d, 0x019062f5, 0x01f256c8, 0x0195e005, 0x002a4a97}}}, + {X: Field{[10]uint32{0x01310b06, 0x03661eff, 0x03632cd7, 0x03eee2bb, 0x013a926a, 0x03e236ab, 0x01c771eb, 0x023b969a, 0x0015aa87, 0x00362a04}}, Y: Field{[10]uint32{0x020acbdd, 0x017d4ff8, 0x02ad3d5e, 0x03680667, 0x03ec9f31, 0x03ce50b1, 0x03e3a262, 0x03b53a58, 0x03e8f276, 0x002bddfd}}}, + {X: Field{[10]uint32{0x020cc5c1, 0x01d0f533, 0x034d2c3b, 0x02f5466b, 0x02051c9a, 0x01974a35, 0x025b8a38, 0x01364f6f, 0x02194f3f, 0x002230fe}}, Y: Field{[10]uint32{0x020d8f8d, 0x0192381d, 0x039d9a9d, 0x036a660a, 0x0226b5de, 0x01dd16fb, 0x03671a7e, 0x03e089ec, 0x037a0f9f, 0x0004132b}}}, + {X: Field{[10]uint32{0x01ce648e, 0x00b0f650, 0x02484553, 0x0045b169, 0x02220701, 0x031ca6a2, 0x01e9c763, 0x02c3abc1, 0x03253434, 0x003e1ce1}}, Y: Field{[10]uint32{0x006f7bd7, 0x0327885e, 0x0320146f, 0x0055e059, 0x024c286e, 0x0034f86f, 0x01f66270, 0x01e44eda, 0x02d1d4ee, 0x002a2d7b}}}, + {X: Field{[10]uint32{0x009acc33, 0x021083e4, 0x02f606b1, 0x03e3723f, 0x007b35c8, 0x01a25817, 0x00ca8265, 0x00087e53, 0x01385afb, 0x00017f29}}, Y: Field{[10]uint32{0x01b2b3a8, 0x0246bd75, 0x036392b7, 0x01e35752, 0x03c5b4d0, 0x008facaf, 0x01f9a527, 0x022ff7ac, 0x0251f5c2, 0x000075fe}}}, + {X: Field{[10]uint32{0x035007db, 0x01193eb3, 0x01a51891, 0x013f8558, 0x03f1fddf, 0x03b52f43, 0x02cef9db, 0x02b366ec, 0x0148d4b2, 0x0011d211}}, Y: Field{[10]uint32{0x028f44a8, 0x02a8f20c, 0x02bce3dd, 0x00efb620, 0x01b93e22, 0x03ed113f, 0x03a25397, 0x033f811b, 0x0154f011, 0x003a9878}}}, + {X: Field{[10]uint32{0x02c5b8f1, 0x01ab2179, 0x0234ab46, 0x01b49500, 0x01dd8ef5, 0x0106a008, 0x029a6feb, 0x0350ffb1, 0x03ff0b14, 0x000cc7c5}}, Y: Field{[10]uint32{0x02ec144b, 0x015a6c27, 0x0299b68d, 0x01840b11, 0x0337d8c0, 0x02864c47, 0x0364a0f8, 0x011cc6da, 0x00a18d77, 0x002e882f}}}, + {X: Field{[10]uint32{0x03dc68ce, 0x02c51b76, 0x027f15e9, 0x0073e710, 0x0205b897, 0x0014c395, 0x0388ce98, 0x034b192a, 0x022d200b, 0x0001aae9}}, Y: Field{[10]uint32{0x01f832c8, 0x02ac09ba, 0x00c5b000, 0x035de376, 0x01fcf65f, 0x03c1c7cb, 0x0126ef0c, 0x022466b3, 0x02d7d7d9, 0x0039324d}}}, + {X: Field{[10]uint32{0x03ca19c5, 0x032f1a48, 0x014fcf52, 0x02371cc9, 0x02c0cfee, 0x027b1bb3, 0x01022b4d, 0x02867188, 0x0035e72f, 0x0031dadb}}, Y: Field{[10]uint32{0x0213efc9, 0x02ea0c7e, 0x03fb1ee7, 0x0215ec86, 0x01b49dba, 0x01fe80a2, 0x034d0a1d, 0x0216666d, 0x027a48ee, 0x0016c3fe}}}, + {X: Field{[10]uint32{0x021bb77a, 0x024e1533, 0x014a404a, 0x03b50549, 0x02aaa438, 0x00a70529, 0x01590fa4, 0x00f7e6c0, 0x023d43f3, 0x003015ba}}, Y: Field{[10]uint32{0x033dca7b, 0x01ee31fa, 0x0231cc33, 0x000a2e80, 0x0258355a, 0x01da95c7, 0x0079e7f5, 0x02a7c4b1, 0x00e32337, 0x00356c65}}}, + {X: Field{[10]uint32{0x01ac938a, 0x0222cf6f, 0x003a147e, 0x03124f2b, 0x037df652, 0x01ae3ced, 0x03bb897e, 0x003bc44d, 0x00cc8ddf, 0x000f5a23}}, Y: Field{[10]uint32{0x015879fc, 0x02bc8b53, 0x03b4a691, 0x0269ebce, 0x0338b6bc, 0x0045563d, 0x00daead1, 0x0387ca58, 0x03884d7a, 0x002f2a51}}}, + {X: Field{[10]uint32{0x00d2a179, 0x012ccf42, 0x009cf392, 0x027d7cb9, 0x00c59d7a, 0x03dbf60d, 0x0145f0cd, 0x004602a4, 0x02f669ce, 0x0013ebfe}}, Y: Field{[10]uint32{0x020159d2, 0x03d55841, 0x00485b71, 0x01c9e6f3, 0x03dcbad8, 0x032442ae, 0x000c16d8, 0x00bb0956, 0x00ac2dca, 0x00278057}}}, + {X: Field{[10]uint32{0x024aecad, 0x00c15e68, 0x02f614ac, 0x031d9a67, 0x000e8ba0, 0x037b31f1, 0x01a44eb3, 0x03ade1ad, 0x00e37cd7, 0x00011d5e}}, Y: Field{[10]uint32{0x03171651, 0x03be3259, 0x0056945e, 0x019a7af2, 0x0007fd00, 0x02d8a3b6, 0x00eab83f, 0x03802f1a, 0x0017a6be, 0x002522b2}}}, + {X: Field{[10]uint32{0x00618836, 0x0386a577, 0x01dfe103, 0x029dded6, 0x038c72fd, 0x01d221f6, 0x02d1a35f, 0x0191a892, 0x02753eaa, 0x0026ab78}}, Y: Field{[10]uint32{0x002bca96, 0x000dcf74, 0x0025687e, 0x03b771fd, 0x03ceef2f, 0x0325120f, 0x02e7a050, 0x0097cc79, 0x03848f46, 0x002d9470}}}, + {X: Field{[10]uint32{0x03aed711, 0x004cebd8, 0x02f9a276, 0x027d8a72, 0x03321c9b, 0x011ecaf3, 0x02818524, 0x03b9d556, 0x03e0b1c6, 0x002c6c30}}, Y: Field{[10]uint32{0x000ac827, 0x02eac90c, 0x01571759, 0x019d632f, 0x03c2c741, 0x03fc5c44, 0x001d0dca, 0x01bfcf7f, 0x00fd624e, 0x00124eb3}}}, + {X: Field{[10]uint32{0x032a8ff6, 0x0373cfaf, 0x0201c156, 0x01881eeb, 0x032a0ce4, 0x03ce46a6, 0x02c5762f, 0x028163ab, 0x018fb192, 0x003155dd}}, Y: Field{[10]uint32{0x011bd3b3, 0x011e5a5b, 0x01766399, 0x02129dc6, 0x03989212, 0x006ff6fc, 0x010f671b, 0x0386567c, 0x0353d209, 0x000753a6}}}, + {X: Field{[10]uint32{0x037b5e0e, 0x02b648ca, 0x00d07cc9, 0x0209237d, 0x020edcc0, 0x037d686d, 0x01b5ca60, 0x03b53ed2, 0x01ed5120, 0x001cd48b}}, Y: Field{[10]uint32{0x02e08d74, 0x02233e37, 0x01a96e43, 0x013b25c9, 0x037f87db, 0x016f3f71, 0x01299ced, 0x009c3b47, 0x0194cdf0, 0x0011d5a7}}}, + {X: Field{[10]uint32{0x00323506, 0x02e70bfa, 0x033ad72b, 0x0033c3b1, 0x00fd6fbc, 0x030afb94, 0x03ae46df, 0x02258ca8, 0x000d6632, 0x000595c7}}, Y: Field{[10]uint32{0x03ec68d2, 0x00911212, 0x03143d22, 0x02135d67, 0x00a936d6, 0x01f39854, 0x0157911e, 0x0071833b, 0x01869e00, 0x001977a7}}}, + {X: Field{[10]uint32{0x00e5f090, 0x00be5626, 0x03343dbe, 0x00ba0b72, 0x01b1810d, 0x0327be1b, 0x020cc8d7, 0x00c29721, 0x01642eb6, 0x003d7f95}}, Y: Field{[10]uint32{0x03adfa87, 0x03244fa7, 0x03504e20, 0x02f75fb5, 0x02eec2da, 0x030b025e, 0x0340dcdf, 0x036b2328, 0x021fbea9, 0x00173b9e}}}, + {X: Field{[10]uint32{0x016e3592, 0x0138f28e, 0x00591881, 0x005d635e, 0x037aece0, 0x021f3b6b, 0x01a67a0b, 0x02410d0f, 0x033270d0, 0x003bc276}}, Y: Field{[10]uint32{0x03b675e2, 0x0288e6b1, 0x036ea80c, 0x01c4ab81, 0x037df142, 0x03bf7d38, 0x01c6161c, 0x01ba7e59, 0x0005ba24, 0x00164d3e}}}, + {X: Field{[10]uint32{0x033a54e8, 0x03f948cd, 0x030c13ed, 0x008be5d2, 0x025e1746, 0x03c807b4, 0x012b102b, 0x03c26661, 0x03d727d2, 0x00221b36}}, Y: Field{[10]uint32{0x00a73b2b, 0x029ec277, 0x021426ee, 0x021ce351, 0x015166f6, 0x019393e2, 0x03518255, 0x01b96b94, 0x028a7fca, 0x0036b2cc}}}, + {X: Field{[10]uint32{0x02237cff, 0x03be0ab3, 0x011f96e4, 0x00226ef6, 0x01620713, 0x02367cfa, 0x029ff848, 0x02fcba14, 0x03cd04f7, 0x002df61a}}, Y: Field{[10]uint32{0x03702f0e, 0x03f623ce, 0x0002ee32, 0x0293b434, 0x0303acf2, 0x01d5d210, 0x0146dc41, 0x0151faa1, 0x03f1375a, 0x0031ac2b}}}, + {X: Field{[10]uint32{0x03388c67, 0x03f1eeba, 0x02c4d22b, 0x02659ef1, 0x00c24f5e, 0x0257653b, 0x03910593, 0x02ae14c1, 0x01b28132, 0x0035f45c}}, Y: Field{[10]uint32{0x001a8f8f, 0x01950f77, 0x00744bfe, 0x020a5c22, 0x037be396, 0x02ece6fd, 0x013c1351, 0x038ad957, 0x00e02421, 0x00260ddc}}}, + {X: Field{[10]uint32{0x0394b1be, 0x024202a5, 0x03502a42, 0x025b0524, 0x00f01a18, 0x00cf6b64, 0x01f1cfa8, 0x00c39c8a, 0x02fd881e, 0x003ff9c4}}, Y: Field{[10]uint32{0x00505da8, 0x03063395, 0x01586cda, 0x01e94c59, 0x02f18b03, 0x03cbe8af, 0x0311ae58, 0x00212842, 0x0203075d, 0x003d0a67}}}, + {X: Field{[10]uint32{0x03d13f7c, 0x01919555, 0x03d669f6, 0x03781bc0, 0x03dff3f0, 0x03decd71, 0x03cd10b3, 0x01a54735, 0x02b30322, 0x00158f24}}, Y: Field{[10]uint32{0x03ec10c1, 0x0272cdcc, 0x01f43076, 0x0252153d, 0x009bb210, 0x0105be52, 0x030ccfb2, 0x03bd0602, 0x02f4085b, 0x0037287b}}}, + {X: Field{[10]uint32{0x00f32437, 0x0353591a, 0x013dd9a0, 0x00a19a9f, 0x01dd52c2, 0x03e91f05, 0x00056d7e, 0x03af3985, 0x02f33a2c, 0x002e39db}}, Y: Field{[10]uint32{0x018651c2, 0x01068a24, 0x004a22aa, 0x03084277, 0x003076cc, 0x00986687, 0x02539ba4, 0x039e668e, 0x039d652a, 0x00111539}}}, + {X: Field{[10]uint32{0x02f1c971, 0x01d5182a, 0x002d2c56, 0x03cf8219, 0x0107b4a4, 0x022a6610, 0x02e429fb, 0x000e8b7c, 0x0304f607, 0x000db6c8}}, Y: Field{[10]uint32{0x0284b5cc, 0x010bf269, 0x03ef00f8, 0x02d02323, 0x03ecf7f9, 0x009ac6ae, 0x03859eee, 0x002a8f66, 0x028f5cc3, 0x002814db}}}, + {X: Field{[10]uint32{0x00d9a5ab, 0x01562862, 0x02314f9d, 0x0286df1a, 0x00d537c1, 0x03a6b8a9, 0x0055e529, 0x018df758, 0x011d1521, 0x00317539}}, Y: Field{[10]uint32{0x03eb3f6d, 0x036cce9b, 0x02d0de04, 0x00f12d22, 0x00aaf709, 0x0195c265, 0x0365b08c, 0x01e0b3ef, 0x02ed6a13, 0x0032107b}}}, + {X: Field{[10]uint32{0x01c4bffd, 0x0263e7dc, 0x032207cd, 0x00cd802b, 0x02b05615, 0x018d785e, 0x0379ed3f, 0x0167dbfe, 0x01c29858, 0x0014300f}}, Y: Field{[10]uint32{0x03137720, 0x01929df5, 0x02b0a68b, 0x00a22dfd, 0x025c4255, 0x01471d22, 0x01a2bd74, 0x008a6bd6, 0x0397a7ed, 0x0031a321}}}, + {X: Field{[10]uint32{0x008333ef, 0x014d1b7c, 0x01ff3364, 0x0245c74c, 0x03985606, 0x03d6ec3b, 0x010ae5dc, 0x01be68b8, 0x004b3e7e, 0x000a01b6}}, Y: Field{[10]uint32{0x007b429d, 0x026d40f2, 0x0385e54a, 0x0099090d, 0x02bf8cac, 0x00e9ad63, 0x00b5ddbf, 0x01332d33, 0x004338e3, 0x001cbc8d}}}, + {X: Field{[10]uint32{0x008790a4, 0x02254bce, 0x0353f4c5, 0x006f888a, 0x0282bb9c, 0x026103fb, 0x03e33c62, 0x02374710, 0x01dd1ef5, 0x001035c3}}, Y: Field{[10]uint32{0x030770d5, 0x00a875fd, 0x0130d96b, 0x016ce51a, 0x02e65468, 0x03d35545, 0x00d170ea, 0x0264c8ce, 0x0157b6dd, 0x0026c6a7}}}, + {X: Field{[10]uint32{0x0387c835, 0x01598222, 0x03905d01, 0x00105e60, 0x02ac7338, 0x038876a0, 0x037b193e, 0x00484ef5, 0x003204e7, 0x0022143b}}, Y: Field{[10]uint32{0x01c160e2, 0x00dfddf7, 0x00d3a7d6, 0x02cac32d, 0x02961480, 0x019701c5, 0x01f58eaa, 0x002e464b, 0x03a0a916, 0x002abffd}}}, + {X: Field{[10]uint32{0x00ad6e8b, 0x0033dc54, 0x00bd2c24, 0x02c1a8c2, 0x030de291, 0x02f92175, 0x039d4a62, 0x00a7d1df, 0x0109bd7c, 0x00152545}}, Y: Field{[10]uint32{0x03ef2722, 0x01b1ccb1, 0x02f27f13, 0x027ddf00, 0x01b1d8f7, 0x013307ea, 0x0245c764, 0x00ee7e8e, 0x007cf2a2, 0x000bf6cd}}}, + {X: Field{[10]uint32{0x037e5d44, 0x023da7eb, 0x0221facf, 0x022f990d, 0x031c3d3e, 0x0028f9f3, 0x01af1ab7, 0x03ad3ef9, 0x0355cdf8, 0x0027d7b0}}, Y: Field{[10]uint32{0x01d3c06e, 0x01bcb286, 0x00a58488, 0x017a4afe, 0x0312b8be, 0x0368712e, 0x03da94ba, 0x00d5401b, 0x015fb38b, 0x002c80f7}}}, + {X: Field{[10]uint32{0x02c0b3da, 0x00dc688b, 0x0037bbdf, 0x0388c18a, 0x028b72f0, 0x022cc9bf, 0x035e606c, 0x02794a32, 0x029c1bba, 0x00204b92}}, Y: Field{[10]uint32{0x00e222a1, 0x0347163e, 0x00f24d10, 0x01227be4, 0x015d98d2, 0x03b4004d, 0x02bd36a1, 0x02b8e718, 0x01b714a9, 0x000ae9ed}}}, + {X: Field{[10]uint32{0x023d924a, 0x0072a18a, 0x02c36c5c, 0x03d8a89b, 0x01af52c6, 0x03575ff4, 0x00ff16ec, 0x0185ad50, 0x01dbcf85, 0x003980d7}}, Y: Field{[10]uint32{0x001eec86, 0x03ed77fc, 0x0154ad6c, 0x0011a716, 0x01173d31, 0x007ca7c6, 0x0118718a, 0x03f2b1be, 0x009ef687, 0x002a514e}}}, + {X: Field{[10]uint32{0x02033446, 0x0079d49a, 0x00bc6032, 0x00a69ad4, 0x032643f1, 0x01ac8ce6, 0x01696938, 0x0351c6dc, 0x01e8d771, 0x0035e229}}, Y: Field{[10]uint32{0x017d3990, 0x026259fa, 0x030e0b25, 0x00bde7f8, 0x01c0c9a4, 0x01f646d9, 0x017fe32a, 0x01e0fbe9, 0x02225095, 0x000d2e15}}}, + {X: Field{[10]uint32{0x03c6f41c, 0x0175291d, 0x01802561, 0x00bdc1af, 0x020c8ef4, 0x03e8cad5, 0x01b5f116, 0x013e7c07, 0x03dd2937, 0x00198dcc}}, Y: Field{[10]uint32{0x0078676d, 0x03b09b74, 0x013c1394, 0x0199b895, 0x0185b59f, 0x005002de, 0x014e916a, 0x03f16458, 0x01453ae0, 0x0000d617}}}, + {X: Field{[10]uint32{0x0323ad9c, 0x02c08f6c, 0x006f0a5a, 0x00ccd585, 0x016affda, 0x0278b8f5, 0x03ad4d11, 0x00504cf6, 0x032805ae, 0x0017b1b9}}, Y: Field{[10]uint32{0x00884579, 0x008f5a70, 0x029f645c, 0x03919a37, 0x03d35a56, 0x00683f28, 0x00d609db, 0x00c078a7, 0x01bfcfc6, 0x000f7490}}}, + {X: Field{[10]uint32{0x00f8f3c5, 0x019d28cb, 0x02ceee4a, 0x03975105, 0x0087532b, 0x01165c5f, 0x03366471, 0x019a89f0, 0x00421fbb, 0x003c63f1}}, Y: Field{[10]uint32{0x0359d560, 0x008a7344, 0x00de9b4f, 0x0397dd60, 0x02026847, 0x01a1b03e, 0x03b4e836, 0x00f7c403, 0x00813bb3, 0x0034e282}}}, + {X: Field{[10]uint32{0x01f5345a, 0x0089108e, 0x01719206, 0x03fbba87, 0x017dec0d, 0x004d0919, 0x038d3362, 0x03f87c52, 0x009ed9bc, 0x002063d5}}, Y: Field{[10]uint32{0x006602ee, 0x00b237e1, 0x013688cc, 0x0170ae7d, 0x0048b24c, 0x01fd2cfe, 0x001a8e9d, 0x03d12117, 0x011fcca2, 0x000df398}}}, + {X: Field{[10]uint32{0x02dce942, 0x016c02c7, 0x02a6417a, 0x03ad9086, 0x024f4fa8, 0x00cba1e5, 0x034ee3a5, 0x00ff20a9, 0x0391f98e, 0x001d78b1}}, Y: Field{[10]uint32{0x03e5f6b4, 0x0153354d, 0x00b26f2d, 0x02f888aa, 0x007c4d37, 0x00582157, 0x02a17c71, 0x004d89a2, 0x033ba495, 0x00147c8d}}}, + {X: Field{[10]uint32{0x023954d3, 0x01a0db87, 0x011199ca, 0x01667d2e, 0x009b44de, 0x0264ddcc, 0x03f4ec1f, 0x01b4c76b, 0x01b64c0c, 0x001c47e3}}, Y: Field{[10]uint32{0x00caa4b0, 0x038f9f5c, 0x03eb5b75, 0x02e85c2e, 0x016e4dfb, 0x02cd4673, 0x0170fcf7, 0x0320b7cc, 0x01e3432a, 0x00121655}}}, + {X: Field{[10]uint32{0x033ba6a5, 0x01c6f237, 0x0003a160, 0x003f8878, 0x005216f5, 0x0232a70b, 0x022104ee, 0x0168792f, 0x00266f75, 0x0018d40b}}, Y: Field{[10]uint32{0x01bea942, 0x00a2a852, 0x028dd90f, 0x022bc7ce, 0x033954b8, 0x03f9de5d, 0x01075bda, 0x00fd2bd5, 0x01eac8fc, 0x0029720a}}}, + {X: Field{[10]uint32{0x02850872, 0x00425530, 0x0138c92d, 0x0358e49e, 0x0213f5c3, 0x00bb95f9, 0x01bb82fd, 0x0381c06d, 0x0059ccfe, 0x000a99dd}}, Y: Field{[10]uint32{0x037cbe71, 0x035717bb, 0x02053714, 0x00a3ace7, 0x00401bbf, 0x02c0f831, 0x031cbf5d, 0x02c2ca6e, 0x03985c5d, 0x003fdba5}}}, + {X: Field{[10]uint32{0x02b52cbe, 0x006c020c, 0x00d99f05, 0x03417c8c, 0x015b359b, 0x035febe5, 0x01b4a223, 0x01a69c27, 0x038778fb, 0x001a3e17}}, Y: Field{[10]uint32{0x03c92210, 0x0357cf3f, 0x0389e405, 0x0302cef7, 0x01ef9c65, 0x022d5ae1, 0x037b771f, 0x00c62713, 0x0149f4fc, 0x000370ba}}}, + {X: Field{[10]uint32{0x02b74ade, 0x02413cf4, 0x0390e1c2, 0x0321bd2e, 0x009e9883, 0x039642c9, 0x01fd8b9d, 0x0080d942, 0x01b73b54, 0x001fba75}}, Y: Field{[10]uint32{0x03343e62, 0x030c3b81, 0x03828002, 0x01aa7759, 0x03492063, 0x02497775, 0x01c6977b, 0x03c817e4, 0x0013241c, 0x00260489}}}, + {X: Field{[10]uint32{0x00aa33c8, 0x01d54f89, 0x03391381, 0x0011e7ab, 0x00102b5d, 0x03503948, 0x03680230, 0x0249c76c, 0x0090cdb1, 0x002111ec}}, Y: Field{[10]uint32{0x03c0bdb0, 0x02a3087d, 0x02a78c14, 0x0295e225, 0x03121d02, 0x00096948, 0x02eacd39, 0x01d20700, 0x03e655a2, 0x00096d0f}}}, + {X: Field{[10]uint32{0x0016a645, 0x02a2dbca, 0x03268c89, 0x00b9de8b, 0x03e45e62, 0x00317bce, 0x0151f569, 0x01439ade, 0x03b93f15, 0x000c581c}}, Y: Field{[10]uint32{0x007624be, 0x00b6cc65, 0x02caf6a5, 0x02286191, 0x03a1a6f3, 0x00c7571d, 0x0254a4db, 0x0033a30f, 0x01ac2fc7, 0x00155f29}}}, + {X: Field{[10]uint32{0x0036d6ac, 0x007addd2, 0x004ae5fc, 0x03c7264a, 0x00cdaa8e, 0x030046c6, 0x00fe9495, 0x0086b0d6, 0x012da2ef, 0x003eb88c}}, Y: Field{[10]uint32{0x030b76c7, 0x03ba358f, 0x00b8b54e, 0x0366ca6d, 0x00aa948a, 0x03f32fc2, 0x00ee7cb3, 0x03a196c3, 0x02612d99, 0x001bcefd}}}, + {X: Field{[10]uint32{0x00f839f0, 0x0339e0d5, 0x023e12f8, 0x031addbc, 0x007d4c72, 0x00c58abb, 0x01e1691d, 0x037f7c2c, 0x03ef5588, 0x000a028a}}, Y: Field{[10]uint32{0x03683f72, 0x02d21ce4, 0x01c73ca7, 0x018f3036, 0x01b2b4ba, 0x03910161, 0x03be1bc7, 0x025dd2a1, 0x011bc31a, 0x003c037b}}}, + {X: Field{[10]uint32{0x037ccdcd, 0x03dab02f, 0x01ddb86b, 0x02ca2a99, 0x034d0609, 0x031d5113, 0x037e5d28, 0x024b264a, 0x037a9b7b, 0x000fd0f9}}, Y: Field{[10]uint32{0x0072a2d6, 0x01c2a113, 0x015366cf, 0x0155401d, 0x00ac2678, 0x00ae3617, 0x02bd6b99, 0x002952f1, 0x0103bb3c, 0x002cc45e}}}, + {X: Field{[10]uint32{0x0069f2de, 0x03c58b75, 0x0229646d, 0x0037d941, 0x02953550, 0x00147843, 0x02539290, 0x03e8d21f, 0x01c8387b, 0x000e82bf}}, Y: Field{[10]uint32{0x01bb29c7, 0x0061eb32, 0x0324e8b4, 0x03df23fc, 0x01907d4c, 0x03cb294f, 0x0386dff3, 0x0242db87, 0x00c8f0f6, 0x001d5a5f}}}, + {X: Field{[10]uint32{0x0170809d, 0x03a905de, 0x01660949, 0x02aa288f, 0x002789d0, 0x01c81ca8, 0x026e7c4a, 0x01c8fa66, 0x0364209f, 0x000fe5ca}}, Y: Field{[10]uint32{0x02e47d15, 0x0293e110, 0x02342b32, 0x00fb98fc, 0x039a7c05, 0x0280b17f, 0x0026e769, 0x03f672bf, 0x00287a6b, 0x001e9209}}}, + {X: Field{[10]uint32{0x0089b0b4, 0x036bd2ba, 0x004df0e8, 0x0175c7d0, 0x01c21ff8, 0x02e138f4, 0x01f1ecc4, 0x00d93447, 0x000ffa73, 0x00024e2b}}, Y: Field{[10]uint32{0x01be0312, 0x02e9d291, 0x0204a63f, 0x0255932d, 0x004e9689, 0x03681a84, 0x02e8820e, 0x02ce0437, 0x02d3d526, 0x00287027}}}, + {X: Field{[10]uint32{0x00e28bcc, 0x007b22bd, 0x01071831, 0x016993a6, 0x01631c9b, 0x02f4d15d, 0x01eb9ed3, 0x039d309d, 0x01752993, 0x0014d57b}}, Y: Field{[10]uint32{0x006ad088, 0x01c94f3f, 0x01a40ddf, 0x011c0c24, 0x01c81885, 0x0003c614, 0x010279f6, 0x02aabeb0, 0x007d680a, 0x002eec40}}}, + {X: Field{[10]uint32{0x03f277b7, 0x0224c47e, 0x024574e9, 0x01bead8b, 0x02b03369, 0x010d0191, 0x03bda46a, 0x01db1b60, 0x02ed70ba, 0x0022038c}}, Y: Field{[10]uint32{0x020410bc, 0x0331ea1b, 0x00e7c623, 0x02bccc39, 0x0308dcda, 0x01a59a1a, 0x02763d5f, 0x03578901, 0x02cb8d10, 0x001dbfac}}}, + {X: Field{[10]uint32{0x00f11aa8, 0x03447c42, 0x02beebd6, 0x000f6ab5, 0x00857ac5, 0x012dd3a7, 0x00beec11, 0x016da0ae, 0x00aaa275, 0x0036bdde}}, Y: Field{[10]uint32{0x00a5f428, 0x0260bba6, 0x01c88fd4, 0x03c24a60, 0x02e38325, 0x01bb5a5d, 0x00f3024d, 0x00c05e7c, 0x0062710d, 0x0007b617}}}, + {X: Field{[10]uint32{0x03b474dd, 0x01eaf6a3, 0x004641cf, 0x01690b23, 0x009a60b9, 0x00d4cfe0, 0x01c0a4ff, 0x00f49f46, 0x01dd7563, 0x003970fa}}, Y: Field{[10]uint32{0x01fb0dfc, 0x01ec9063, 0x02afb251, 0x03f858cc, 0x0371b7b7, 0x03c82f27, 0x03036990, 0x0021faac, 0x02f65c5c, 0x003c795a}}}, + {X: Field{[10]uint32{0x00096973, 0x01a0df70, 0x03afdd11, 0x00302335, 0x016859c2, 0x03ec9d32, 0x03f3bf2f, 0x0361c25d, 0x0334ecdf, 0x0017500f}}, Y: Field{[10]uint32{0x00f6aeb1, 0x004a4e76, 0x01e4a5ba, 0x00d110f9, 0x022335c3, 0x005d935c, 0x001ba707, 0x01b3165e, 0x007c7024, 0x001ad6f9}}}, + {X: Field{[10]uint32{0x02246b12, 0x019162d7, 0x01f81389, 0x00d3cf95, 0x03993bf0, 0x02642ac9, 0x01b4caac, 0x007dc6cd, 0x013c2551, 0x00142e81}}, Y: Field{[10]uint32{0x02291f63, 0x03e8aefc, 0x025b88a7, 0x028af32f, 0x009f8a22, 0x0018f6ac, 0x02903993, 0x00c5c19d, 0x02455c7a, 0x0034bc4a}}}, + {X: Field{[10]uint32{0x026629cf, 0x02fc0bc1, 0x03a00b38, 0x0088e670, 0x039f2906, 0x00d961e4, 0x03898f0b, 0x02a7b681, 0x00eaee4a, 0x000e16a0}}, Y: Field{[10]uint32{0x03efcd50, 0x029a5d02, 0x01eb16e6, 0x00091a64, 0x038cfe49, 0x02a42e3e, 0x010806d6, 0x031b975d, 0x020bd72a, 0x002950cc}}}, + {X: Field{[10]uint32{0x03dedbef, 0x03866582, 0x00a9b276, 0x02948d88, 0x02eaa669, 0x03501463, 0x029de6c3, 0x0378e1b9, 0x00b9904e, 0x00026184}}, Y: Field{[10]uint32{0x0206b581, 0x03436522, 0x03315c4a, 0x034d8760, 0x03b88f72, 0x016d7fe3, 0x00d0c892, 0x02840343, 0x01a2eb6a, 0x00241dd5}}}, + {X: Field{[10]uint32{0x011b7fe8, 0x01e66646, 0x0329ed45, 0x016d1d53, 0x0219ae21, 0x032efda8, 0x007b0d3d, 0x0034ef7f, 0x0007d964, 0x0020fc42}}, Y: Field{[10]uint32{0x03293364, 0x029be681, 0x035e2489, 0x012bef0a, 0x02fe719e, 0x002778b1, 0x00e69c65, 0x035b4a18, 0x031b5095, 0x003d8b48}}}, + {X: Field{[10]uint32{0x03b1c246, 0x03285f53, 0x0059e74d, 0x03f19ed8, 0x01e3f287, 0x009d67f4, 0x002b0285, 0x00d718be, 0x02939273, 0x00147488}}, Y: Field{[10]uint32{0x0063745d, 0x008677db, 0x0187be05, 0x0374c4a1, 0x02f7184b, 0x00f22c49, 0x00b909e2, 0x016d3462, 0x03a3b514, 0x002e6e00}}}, + {X: Field{[10]uint32{0x03465006, 0x0277bc53, 0x03c70368, 0x01316827, 0x013e8cc2, 0x009b0df1, 0x02919458, 0x00f50f49, 0x0342e578, 0x002f9a98}}, Y: Field{[10]uint32{0x007ef000, 0x0236e89f, 0x0004c200, 0x012c70d8, 0x0081bc7e, 0x00f773f6, 0x01efc141, 0x0149e76a, 0x00fc3fc1, 0x002071c6}}}, + {X: Field{[10]uint32{0x00790036, 0x023c89af, 0x02e81a4e, 0x03642a0a, 0x00448681, 0x022c9c1c, 0x03b043b5, 0x004a1292, 0x00d9c36f, 0x003c84cd}}, Y: Field{[10]uint32{0x0016eff2, 0x03d1d4e2, 0x0308e428, 0x02e0b3c9, 0x03f5f143, 0x00878a4e, 0x03dcc1eb, 0x03f4c114, 0x00513a87, 0x00000112}}}, + {X: Field{[10]uint32{0x01730508, 0x03abebb2, 0x022cb419, 0x00ca494f, 0x020932a8, 0x01cef49f, 0x00cb1f1b, 0x0118fe04, 0x00e5af34, 0x00055631}}, Y: Field{[10]uint32{0x00c917f8, 0x007f937d, 0x0149e2dd, 0x00dd0a28, 0x006921bb, 0x029d4217, 0x023f3f41, 0x0104c8d9, 0x025025e1, 0x0032e331}}}, + {X: Field{[10]uint32{0x025d71e2, 0x02428699, 0x02e642e0, 0x03b6641c, 0x01b575a4, 0x02238e09, 0x00d3596a, 0x0083606d, 0x032c8f60, 0x000614e8}}, Y: Field{[10]uint32{0x003a8367, 0x03b660a8, 0x005e89e3, 0x0222ca50, 0x03eaf268, 0x006187ff, 0x024aedbb, 0x02ba838d, 0x031cb170, 0x002368a8}}}, + {X: Field{[10]uint32{0x00cd323d, 0x00d4e233, 0x0190b8cc, 0x02d0ef75, 0x002da679, 0x03ebea77, 0x01f60dbc, 0x00efb087, 0x00bcf0f0, 0x003bd617}}, Y: Field{[10]uint32{0x00c2f296, 0x03db601e, 0x03acdd93, 0x02e876a9, 0x01f02ccd, 0x00a04e41, 0x0192e078, 0x007db4e1, 0x0203aff9, 0x000af178}}}, + {X: Field{[10]uint32{0x02fd5c14, 0x01da022c, 0x03471a14, 0x01938344, 0x031fa458, 0x0092cf1e, 0x03d99714, 0x01a3aefb, 0x0237e1ea, 0x000fd30b}}, Y: Field{[10]uint32{0x020eeaa5, 0x038da91f, 0x005e330d, 0x005ed50e, 0x01051b9c, 0x03cca6d4, 0x02665b04, 0x00ecfeaa, 0x00ab3d28, 0x0019e264}}}, + {X: Field{[10]uint32{0x0021693a, 0x02d04679, 0x0133b621, 0x004082d5, 0x0059fc9b, 0x00eafcab, 0x01cb20ab, 0x02b12860, 0x038ad557, 0x000ac006}}, Y: Field{[10]uint32{0x02c6b94a, 0x00a5c8e0, 0x006758fa, 0x0234b283, 0x01310a32, 0x0122c949, 0x026f8c30, 0x0276c5cf, 0x0007f8d1, 0x003f93cc}}}, + {X: Field{[10]uint32{0x012cd229, 0x016f24d1, 0x00bb98d0, 0x009d62e8, 0x0379c90d, 0x007ec328, 0x02b5b108, 0x0023fe37, 0x01dd7d5a, 0x00196274}}, Y: Field{[10]uint32{0x028149a9, 0x01e45966, 0x007faa11, 0x016c64af, 0x01fdc547, 0x038003f5, 0x008dca23, 0x00a64d2f, 0x0080ed84, 0x00209025}}}, + {X: Field{[10]uint32{0x03950a6f, 0x027c3d49, 0x028a83b8, 0x03968e8e, 0x00ab4377, 0x01da9aa4, 0x00553162, 0x020d6e3a, 0x010df5d3, 0x00308cff}}, Y: Field{[10]uint32{0x00f6f3e5, 0x0088e4ad, 0x0384f494, 0x00c61ae2, 0x02314680, 0x016bbf81, 0x00fbac08, 0x02690c4b, 0x00a8775a, 0x0023fa38}}}, + {X: Field{[10]uint32{0x024cc14a, 0x02c4f41d, 0x036e7b65, 0x003e27db, 0x02a38867, 0x01d68afe, 0x02e3f57f, 0x023bbb5b, 0x02852a84, 0x00209cc6}}, Y: Field{[10]uint32{0x01117583, 0x0039334e, 0x004c1208, 0x026e29d4, 0x011ffacc, 0x0238d288, 0x03096883, 0x017a1fc6, 0x009a307c, 0x00300314}}}, + {X: Field{[10]uint32{0x02d2a50d, 0x03a9b401, 0x0097707e, 0x02d54fab, 0x00c9dde3, 0x008a50bb, 0x02b51501, 0x02c6c16a, 0x03a0e5d8, 0x003884e1}}, Y: Field{[10]uint32{0x01b0ff83, 0x02043723, 0x00349bb2, 0x02564cd5, 0x000fc81c, 0x012b177f, 0x003c9207, 0x024f7c0d, 0x0109f90d, 0x0031d379}}}, + {X: Field{[10]uint32{0x039fdc25, 0x03269256, 0x0236a00b, 0x0305b410, 0x0292780f, 0x0358d6e3, 0x035c3414, 0x010f6716, 0x01fd2fa4, 0x0006021c}}, Y: Field{[10]uint32{0x0314d120, 0x021400ea, 0x00146599, 0x00db89de, 0x021f25e6, 0x02f80971, 0x02014a8b, 0x03cde908, 0x01506008, 0x00359b1c}}}, + {X: Field{[10]uint32{0x00cb2c42, 0x034c382f, 0x03ab4b44, 0x024d360f, 0x00d64dff, 0x00455ae4, 0x0329a9a3, 0x00aa307b, 0x027eed11, 0x002d6a77}}, Y: Field{[10]uint32{0x0139db38, 0x029c7d0d, 0x03d91130, 0x033ec3fc, 0x0130315c, 0x03be15c8, 0x00afe660, 0x00febcec, 0x0279a81c, 0x00159d69}}}, + {X: Field{[10]uint32{0x00aee7d6, 0x00047f40, 0x03b4d40d, 0x01ec01b4, 0x018ce569, 0x0016973e, 0x02baf78c, 0x039437d0, 0x007261f1, 0x0026b339}}, Y: Field{[10]uint32{0x0107a05c, 0x0223fae5, 0x01e0a95f, 0x00c6b74a, 0x026cb8c8, 0x00c969e7, 0x03568304, 0x0131a795, 0x013c4046, 0x003edf10}}}, + {X: Field{[10]uint32{0x03574e5c, 0x03303ae2, 0x01100a02, 0x038d9f61, 0x01916796, 0x0064f7bb, 0x007bc4b2, 0x01dc48bf, 0x039b7bef, 0x003e02ad}}, Y: Field{[10]uint32{0x015c8f6d, 0x00067747, 0x022aac77, 0x02142d74, 0x003a1ac5, 0x01b372b3, 0x035834ed, 0x022c9766, 0x003f842d, 0x0031b534}}}, + {X: Field{[10]uint32{0x009366a1, 0x0287e62f, 0x01aeefae, 0x0123b058, 0x0125d814, 0x0182c936, 0x005845ef, 0x008c30c0, 0x0355cdb4, 0x002d0c78}}, Y: Field{[10]uint32{0x0241c1cd, 0x0345db76, 0x0390ef69, 0x0395731c, 0x017aebac, 0x014adb9a, 0x02ddb985, 0x002850e0, 0x01d4ae23, 0x003af36b}}}, + {X: Field{[10]uint32{0x0275f1fb, 0x01aa001b, 0x009c593f, 0x037db082, 0x02efe56e, 0x01b72939, 0x02b686f4, 0x00e98d47, 0x039e08c9, 0x001ea982}}, Y: Field{[10]uint32{0x03a0347e, 0x03c03bd7, 0x00c98328, 0x0002d01a, 0x00cb4248, 0x038cf9a5, 0x013e3892, 0x002fc781, 0x01e21770, 0x00001320}}}, + {X: Field{[10]uint32{0x0286b30b, 0x039d8404, 0x0296ba72, 0x03bc9cbd, 0x01d304fb, 0x028ded37, 0x001d1a4d, 0x0090edd1, 0x010b3aa4, 0x0006a209}}, Y: Field{[10]uint32{0x01b7a473, 0x017d2ada, 0x033fe3fd, 0x0163d166, 0x02b33b76, 0x0015aa6f, 0x02d8cb0f, 0x02056f81, 0x010557d3, 0x001896e7}}}, + {X: Field{[10]uint32{0x022b57c7, 0x03b6f0ea, 0x0196682d, 0x011c7aea, 0x0106c4ca, 0x02d773b8, 0x034db23c, 0x015628b4, 0x02eb49fd, 0x0016d493}}, Y: Field{[10]uint32{0x038ae50c, 0x014a41ae, 0x02d5dbf2, 0x009caf28, 0x0025c8b2, 0x01b80af7, 0x01b163d5, 0x033875cd, 0x009756b7, 0x000b570b}}}, + {X: Field{[10]uint32{0x0276d2c5, 0x0016139d, 0x007d1892, 0x03610cef, 0x00191550, 0x03dd5826, 0x00cb8b10, 0x02f9e749, 0x03776d9f, 0x002b9839}}, Y: Field{[10]uint32{0x018d7784, 0x0249bec5, 0x0311ffff, 0x0350d1a8, 0x00b76c36, 0x03bf219e, 0x011be83e, 0x0091cb28, 0x01867377, 0x0010c3fa}}}, + {X: Field{[10]uint32{0x02efb9d4, 0x03e04a98, 0x03105ab4, 0x00c2710b, 0x0353e8d7, 0x017739be, 0x020b081a, 0x03d9a351, 0x023d9e29, 0x000c8e97}}, Y: Field{[10]uint32{0x004776ba, 0x0295afa0, 0x01830c2f, 0x02911d98, 0x03da6216, 0x02d7aa6b, 0x0256d1d3, 0x00fd0859, 0x03b36948, 0x0000ad15}}}, + {X: Field{[10]uint32{0x027c1c9d, 0x00d9445e, 0x022a2a8b, 0x0125e965, 0x02b3db86, 0x01a50a6c, 0x00e612ed, 0x0154b219, 0x01b6591e, 0x002b346d}}, Y: Field{[10]uint32{0x026e88b8, 0x01886423, 0x00fa3265, 0x00947af1, 0x0067544d, 0x009498d2, 0x02ba7729, 0x01a40249, 0x03ff056f, 0x003984c7}}}, + {X: Field{[10]uint32{0x005b36f4, 0x02fdd3de, 0x02cf114e, 0x018211d0, 0x02f2e61e, 0x01549233, 0x026286b1, 0x014b80a8, 0x00708178, 0x001ad38b}}, Y: Field{[10]uint32{0x01b893df, 0x03a19139, 0x01a1a1e4, 0x03f359b9, 0x037398f7, 0x007354a5, 0x007130d0, 0x026f7080, 0x011c7a52, 0x00210025}}}, + {X: Field{[10]uint32{0x0084ab31, 0x01e5a7e0, 0x017c7151, 0x017e02a0, 0x004e6a37, 0x0230d1d1, 0x004cb914, 0x0029187d, 0x0327d67b, 0x0030acb1}}, Y: Field{[10]uint32{0x036d5f59, 0x0207ebb0, 0x01718824, 0x03522414, 0x03a52c47, 0x030a07f4, 0x00aa2519, 0x01ec3e66, 0x0359ebf3, 0x003fb590}}}, + {X: Field{[10]uint32{0x004f202e, 0x01f286e4, 0x02f71220, 0x008af683, 0x022ec564, 0x01e283e1, 0x014609d9, 0x02f653de, 0x02dab5b2, 0x000ce17b}}, Y: Field{[10]uint32{0x003d7443, 0x01eedc58, 0x0074b490, 0x0219d1a9, 0x01b12a21, 0x006a7d10, 0x01975aa3, 0x02a3b871, 0x02af1db8, 0x000a0234}}}, + {X: Field{[10]uint32{0x00c803f2, 0x006701c5, 0x02a82335, 0x03c35314, 0x02edce15, 0x03ead1e1, 0x030c2923, 0x010dee11, 0x00d7f2cb, 0x002003db}}, Y: Field{[10]uint32{0x00a37056, 0x0054bd35, 0x03734ad0, 0x0233b0e5, 0x0023e0a8, 0x02c980a3, 0x0206ca59, 0x006a8337, 0x023e0ad1, 0x002607cb}}}, + {X: Field{[10]uint32{0x02aa2f3b, 0x0071803b, 0x01f32474, 0x02dd853c, 0x02ebfaf4, 0x01eedb2a, 0x00103c6d, 0x00a1bf4f, 0x03ff3a9f, 0x001cea82}}, Y: Field{[10]uint32{0x00c6f7b1, 0x03c76946, 0x02846701, 0x00f13f79, 0x00a54a2e, 0x0362f39f, 0x009fe73d, 0x02e60f2e, 0x012981a9, 0x0000c2f1}}}, + {X: Field{[10]uint32{0x0178f2c5, 0x005a7ee8, 0x029ca789, 0x02626f3c, 0x03863804, 0x00f9d84b, 0x03fdfa9c, 0x004fda02, 0x00e6ab5c, 0x0024a03f}}, Y: Field{[10]uint32{0x00ae36bb, 0x013df373, 0x03b233e7, 0x02f76c28, 0x03aeb6a7, 0x03dfd6ed, 0x01397b18, 0x00b8ecbf, 0x00dbc5bc, 0x0012e5bb}}}, + {X: Field{[10]uint32{0x026e03ca, 0x02fda769, 0x00b8107d, 0x020397b3, 0x029f4387, 0x01c344ba, 0x009be162, 0x02e7bed6, 0x004bbb50, 0x001c8157}}, Y: Field{[10]uint32{0x036bc7cb, 0x0169b183, 0x023f9891, 0x0016a87f, 0x01985ad7, 0x006a188f, 0x01746935, 0x01df7561, 0x017fc30a, 0x002baa89}}}, + {X: Field{[10]uint32{0x03c1879f, 0x017411f9, 0x008e0308, 0x021c4aaf, 0x000eb8e8, 0x03ea09f3, 0x02687c73, 0x038f6c2e, 0x03d0c771, 0x003c3cf3}}, Y: Field{[10]uint32{0x00936b33, 0x026054e9, 0x02e20eff, 0x01733db8, 0x031bf8aa, 0x013f8428, 0x030c4b32, 0x013153e3, 0x027d8b74, 0x000b184b}}}, + {X: Field{[10]uint32{0x02f5dcfa, 0x01ebe6f9, 0x033ec67a, 0x01df979e, 0x00d8b611, 0x0290ddab, 0x02c8fe8e, 0x03c9c1be, 0x036570b0, 0x0025f1e2}}, Y: Field{[10]uint32{0x03e14c3d, 0x027563ce, 0x00daa127, 0x026cd1f1, 0x01133460, 0x00f2d650, 0x03da765c, 0x016162a5, 0x010cfea9, 0x0006bae5}}}, + {X: Field{[10]uint32{0x02509e69, 0x0327bfa7, 0x03eeb9b5, 0x03d4ce9c, 0x024b7908, 0x022c1dfe, 0x013a9de4, 0x01bf0f52, 0x021e967e, 0x002ce7fe}}, Y: Field{[10]uint32{0x0265dc05, 0x01039d7a, 0x01e16f3b, 0x00bc4486, 0x03f76c30, 0x007205f8, 0x0218c007, 0x01cb3035, 0x015181ac, 0x003d57ce}}}, + {X: Field{[10]uint32{0x00e7baaa, 0x007198fe, 0x03fd1735, 0x01ca2c79, 0x0201b2a9, 0x0246c582, 0x003fcc4d, 0x01f1346f, 0x037a5ff2, 0x000566e7}}, Y: Field{[10]uint32{0x00c4360a, 0x0202df29, 0x02697a83, 0x01f55e30, 0x015e6012, 0x01e27f50, 0x021c7f0d, 0x013febae, 0x036d86c5, 0x002c2abb}}}, + {X: Field{[10]uint32{0x0385e44c, 0x027dfcf2, 0x021aaf72, 0x02acf04d, 0x016dff76, 0x0189bf11, 0x0107a62b, 0x012c5b1f, 0x03d18d4a, 0x00096043}}, Y: Field{[10]uint32{0x036a2d9b, 0x0348864b, 0x00f442fc, 0x017ccd5e, 0x009252dd, 0x02d2e2c0, 0x0295526a, 0x02f5c2b4, 0x03257794, 0x003d0148}}}, + {X: Field{[10]uint32{0x033352b2, 0x024d37d1, 0x0241d6e1, 0x02440b69, 0x01eab362, 0x0241d620, 0x019864c0, 0x028ca312, 0x024d5860, 0x0009f882}}, Y: Field{[10]uint32{0x03b45203, 0x02e52640, 0x02a7b65c, 0x00ac03a1, 0x03d3822a, 0x000f0469, 0x030b4905, 0x02d43f89, 0x00f2888c, 0x00305663}}}, + {X: Field{[10]uint32{0x001448a2, 0x03cef44d, 0x032dd685, 0x01a13651, 0x006d684a, 0x02885ed8, 0x008f465b, 0x0253999c, 0x014e517a, 0x00120fd1}}, Y: Field{[10]uint32{0x039ad11f, 0x01a2985f, 0x02aa82ba, 0x01bfc308, 0x01d338d0, 0x01772dc3, 0x0123346c, 0x0268d917, 0x0144d93b, 0x00304ecc}}}, + {X: Field{[10]uint32{0x0204e6e5, 0x002967af, 0x03266e2e, 0x023e0e93, 0x0267ef06, 0x03054cbc, 0x024c9a30, 0x012a996b, 0x02f63173, 0x0013d1ec}}, Y: Field{[10]uint32{0x00d99d2b, 0x00d35996, 0x03a27c01, 0x00bb7551, 0x01682439, 0x03b6adcb, 0x033ebcf3, 0x0272d174, 0x034cf11b, 0x00163c7c}}}, + {X: Field{[10]uint32{0x0397db07, 0x02d8d05d, 0x0057424f, 0x00ac4711, 0x00d6f42a, 0x03a04330, 0x031774b8, 0x033a12d3, 0x037e0835, 0x002a9e3a}}, Y: Field{[10]uint32{0x005e743b, 0x0124fa86, 0x0311b0cf, 0x018c85c4, 0x03ee9ffc, 0x00fdcb8c, 0x00c7541d, 0x0351f167, 0x0139d957, 0x000e5900}}}, + {X: Field{[10]uint32{0x00033d49, 0x02c33a33, 0x0194417e, 0x03daa97d, 0x0031a3f1, 0x00dd602c, 0x01c0655c, 0x00158047, 0x018583c0, 0x00349662}}, Y: Field{[10]uint32{0x02f24b08, 0x00744696, 0x02d8bc84, 0x00193413, 0x02b6a830, 0x036af85c, 0x014622a2, 0x02062e8a, 0x01739de8, 0x000d9072}}}, + {X: Field{[10]uint32{0x01e26634, 0x004a9215, 0x03faf487, 0x017567df, 0x03f2d2b8, 0x010d641e, 0x0338f877, 0x02dd3d5b, 0x03a0eccc, 0x0013c08e}}, Y: Field{[10]uint32{0x01a6a456, 0x020a57ec, 0x02e95bc4, 0x012e1a9b, 0x03a2ae09, 0x024edb0f, 0x03c35ea3, 0x014496e3, 0x0033b15d, 0x003e03bf}}}, + {X: Field{[10]uint32{0x023a1589, 0x03df8b5d, 0x003c670b, 0x00a3df05, 0x028eda41, 0x0056b22f, 0x03e13cfa, 0x03425def, 0x008b48ab, 0x002721bc}}, Y: Field{[10]uint32{0x01c2df45, 0x014bc570, 0x00a171a1, 0x036b211a, 0x0217d4ee, 0x00a7536c, 0x02ff453d, 0x032e20e7, 0x03870e9e, 0x00045447}}}, + {X: Field{[10]uint32{0x02137576, 0x00362e3b, 0x0120e913, 0x01dda760, 0x01c5e6ac, 0x0355f89a, 0x03affcec, 0x017323ff, 0x018b72e9, 0x000e021c}}, Y: Field{[10]uint32{0x01ea728f, 0x0227f4cc, 0x00ceedb7, 0x0068278f, 0x00c614a6, 0x03b62d63, 0x02e59cf8, 0x02dc8936, 0x01ebcf5e, 0x003d03af}}}, + {X: Field{[10]uint32{0x00dda3df, 0x03e9d4bf, 0x03b4255d, 0x011d71f7, 0x00eb349f, 0x03b68091, 0x01c80a13, 0x024bf01c, 0x015e3994, 0x00237bf4}}, Y: Field{[10]uint32{0x03f7a771, 0x01317d9e, 0x00c7ff9e, 0x033b8ec3, 0x01a01786, 0x03f0e58c, 0x03b0d19f, 0x03430ed3, 0x03784353, 0x0034f7e9}}}, + {X: Field{[10]uint32{0x0024bf8a, 0x02a2a9f7, 0x03d466ea, 0x03430c92, 0x03ed99f9, 0x0263eb79, 0x00052487, 0x0341f8ea, 0x01425ac1, 0x00236b23}}, Y: Field{[10]uint32{0x02ef8009, 0x0042dcaa, 0x00087d64, 0x0098834a, 0x0262e9d9, 0x00d5375b, 0x032f097d, 0x00d3f362, 0x01b79232, 0x003c8cbf}}}, + {X: Field{[10]uint32{0x03a90e1b, 0x032b011f, 0x01d35329, 0x03f1be04, 0x01e45d26, 0x0090f0f4, 0x03178b4f, 0x039b78a1, 0x0043f3bc, 0x0021f399}}, Y: Field{[10]uint32{0x01724138, 0x00cfa54e, 0x02875fac, 0x03523dc3, 0x000f0af0, 0x01fb7cec, 0x002799d7, 0x012ad316, 0x00196241, 0x0002a25c}}}, + {X: Field{[10]uint32{0x00fdf08d, 0x0259b1aa, 0x02f3bd22, 0x03201d06, 0x02124a21, 0x02dddd6e, 0x0360a3f8, 0x02ddfa7a, 0x03fabf2f, 0x002ffb9a}}, Y: Field{[10]uint32{0x03ba76f7, 0x0339757e, 0x03fa69c9, 0x03a102e0, 0x02cd2e8b, 0x00bf20fb, 0x026f2155, 0x012fc5fc, 0x0399541e, 0x000a6870}}}, + {X: Field{[10]uint32{0x00c2bec1, 0x026bcad7, 0x0341daef, 0x02be0e06, 0x00044873, 0x02bfdcae, 0x001a5537, 0x02a0008d, 0x01a5b553, 0x00030c3f}}, Y: Field{[10]uint32{0x039fea6d, 0x01054ed0, 0x0162e7d1, 0x01b99775, 0x028a96f7, 0x0338d011, 0x004aafc0, 0x023593e9, 0x02b587d8, 0x001738fa}}}, + {X: Field{[10]uint32{0x0000ed97, 0x0375360d, 0x030a00f1, 0x001dca35, 0x014d9226, 0x006d067d, 0x01cadbfe, 0x00675c31, 0x01fd5941, 0x00179c54}}, Y: Field{[10]uint32{0x02108917, 0x03654c7a, 0x0020d73b, 0x0259895e, 0x024c64ec, 0x032f75d7, 0x0136816e, 0x0129f58b, 0x02a5a51d, 0x001aa33b}}}, + {X: Field{[10]uint32{0x0086100b, 0x01a436fb, 0x007c04bf, 0x01ead435, 0x03e974af, 0x01494896, 0x03d06208, 0x0357c3cc, 0x030a66cd, 0x002a723a}}, Y: Field{[10]uint32{0x038e0a2f, 0x02786ca2, 0x02bf329c, 0x0223cebb, 0x00a4371e, 0x03ca4335, 0x02a24bcf, 0x00c7cec0, 0x039d8987, 0x003c8272}}}, + {X: Field{[10]uint32{0x03a2e439, 0x021446b8, 0x0253b946, 0x01cd7ebd, 0x01cb8043, 0x00bb9848, 0x01b16595, 0x0245411c, 0x01d79366, 0x0025579e}}, Y: Field{[10]uint32{0x03930d06, 0x001c02f3, 0x028261de, 0x037c4839, 0x002e82cd, 0x0295b1e8, 0x02a3bcc1, 0x019e8043, 0x03e32a9b, 0x001a36ab}}}, + {X: Field{[10]uint32{0x03a34a71, 0x00ad0277, 0x005fac19, 0x0014f21a, 0x02bef248, 0x02edf875, 0x03bc70b3, 0x0331a96c, 0x0293d3c1, 0x0008b49c}}, Y: Field{[10]uint32{0x039b3357, 0x020dfa58, 0x02389e6c, 0x037ece77, 0x014d5d76, 0x01036ed6, 0x004e42e7, 0x0156dd4f, 0x00e34fc8, 0x0031d2d1}}}, + {X: Field{[10]uint32{0x0137abc0, 0x013a3108, 0x03835b2f, 0x022ce80d, 0x0370d46e, 0x0121ebaf, 0x01d91f71, 0x005d9d3a, 0x02cef74b, 0x003467f3}}, Y: Field{[10]uint32{0x02db7580, 0x02b6db12, 0x00a83fe9, 0x0397cd97, 0x0334ca9f, 0x025332e8, 0x02224f74, 0x002604f3, 0x03f63dca, 0x0016e412}}}, + {X: Field{[10]uint32{0x02336899, 0x00df2470, 0x0073f2a4, 0x01b1492a, 0x001723c3, 0x02f1a9aa, 0x02091136, 0x01200359, 0x022aadc7, 0x001aa85c}}, Y: Field{[10]uint32{0x02319d07, 0x03c7b8b5, 0x03c369a4, 0x0367b599, 0x023d9709, 0x00855273, 0x01640583, 0x016d318c, 0x004cdf49, 0x0023a5c0}}}, + {X: Field{[10]uint32{0x00ea6efc, 0x01be146c, 0x01052f73, 0x01ac1c83, 0x02b16e3b, 0x025ab461, 0x0107262e, 0x0348804b, 0x02239ee4, 0x001e6f4d}}, Y: Field{[10]uint32{0x0018729e, 0x03d36fbd, 0x000fe42d, 0x01beb5ae, 0x036a3116, 0x031f24b0, 0x00972c71, 0x03369077, 0x03dbf568, 0x000292d0}}}, + {X: Field{[10]uint32{0x00f16ce9, 0x00460be9, 0x028c9e40, 0x00800500, 0x03a1c7d8, 0x01a43033, 0x0183c5d3, 0x00ded59d, 0x032c1463, 0x002d780a}}, Y: Field{[10]uint32{0x0069e0b2, 0x0389e564, 0x026fb938, 0x0299c634, 0x021a819b, 0x003a2850, 0x013516fa, 0x02a9c39e, 0x02be3fac, 0x0012e591}}}, + {X: Field{[10]uint32{0x03a7403a, 0x02bdd0c1, 0x0057dd05, 0x02152ce2, 0x0114a2b6, 0x021fde43, 0x0044d643, 0x03ad3419, 0x0271de2d, 0x00238cf8}}, Y: Field{[10]uint32{0x01ecc429, 0x00f5b8a2, 0x0171fc91, 0x03fc3fa7, 0x00e08d73, 0x00f833ac, 0x02011bd0, 0x028773aa, 0x03a2c7a4, 0x00360b54}}}, + {X: Field{[10]uint32{0x0019c2f5, 0x0164f293, 0x0036b074, 0x03d8bd7b, 0x020abd6e, 0x03b68df6, 0x0369b73f, 0x029e0395, 0x004277db, 0x0013ffbd}}, Y: Field{[10]uint32{0x0392f854, 0x021a04f4, 0x01d694a1, 0x02f59efe, 0x03796755, 0x02ec27e6, 0x036162cf, 0x0282ae7b, 0x0057378a, 0x002a28c2}}}, + {X: Field{[10]uint32{0x01f57368, 0x00dc49ba, 0x02bdefb7, 0x035bb2e9, 0x03f7e42e, 0x006e491b, 0x00b03341, 0x001722d6, 0x012a6338, 0x0021e2d9}}, Y: Field{[10]uint32{0x02e85836, 0x007bf055, 0x0020ad54, 0x004749d2, 0x02148c97, 0x01290750, 0x02e71f0b, 0x0056334e, 0x033ed691, 0x000b3efa}}}, + {X: Field{[10]uint32{0x01eb415e, 0x002c41a7, 0x02783dd4, 0x00bc6c20, 0x01a0aa0b, 0x01e6b2f0, 0x0399ee6a, 0x02bb451a, 0x0215aee2, 0x003be69a}}, Y: Field{[10]uint32{0x01e97240, 0x02f42392, 0x00d826d9, 0x03686715, 0x02cffd9c, 0x02d271ea, 0x03c44802, 0x00d45286, 0x02ba7fd5, 0x00264278}}}, + {X: Field{[10]uint32{0x0245bf37, 0x02b081c1, 0x008fcdcf, 0x00630b55, 0x02c7814e, 0x036c33a3, 0x00358855, 0x0348c182, 0x00d41551, 0x00357092}}, Y: Field{[10]uint32{0x01a36f05, 0x02013045, 0x029cb3c3, 0x017e0b6a, 0x003cbeb4, 0x0053542a, 0x0378c88c, 0x007e0a32, 0x009e7bf0, 0x003e717a}}}, + {X: Field{[10]uint32{0x03227d1a, 0x016467d5, 0x00289f2c, 0x003c25bb, 0x026dad0c, 0x005155a0, 0x036e6148, 0x0055f659, 0x01cca526, 0x003b6fc9}}, Y: Field{[10]uint32{0x0299554d, 0x036b80bb, 0x034c7409, 0x007bdb95, 0x03d0ca70, 0x0034dc95, 0x0033c137, 0x0191592a, 0x0088be05, 0x0001a115}}}, + {X: Field{[10]uint32{0x00cf09bb, 0x039ba953, 0x0378b26f, 0x02c37f3c, 0x0314be80, 0x033e4a1a, 0x021f5cf0, 0x038dd894, 0x026fb8e2, 0x00170480}}, Y: Field{[10]uint32{0x02daa596, 0x0299d619, 0x010471bf, 0x014102ea, 0x0094b81a, 0x02072691, 0x010154d5, 0x0194a1e5, 0x01ef4e2c, 0x000f6635}}}, + {X: Field{[10]uint32{0x008e2d6d, 0x0134acb9, 0x030a0b43, 0x0352bce5, 0x03ae728b, 0x019cce31, 0x00dcef7f, 0x00157585, 0x02435056, 0x00309f98}}, Y: Field{[10]uint32{0x018525c9, 0x004dea9f, 0x033ced82, 0x025e158c, 0x029e372d, 0x0334a315, 0x00839eeb, 0x03e51bde, 0x02fc703c, 0x001dad61}}}, + {X: Field{[10]uint32{0x01abaf8a, 0x036bb794, 0x027e7b96, 0x00feac52, 0x007f6760, 0x0263b981, 0x0024e8af, 0x0061ad35, 0x03045140, 0x0028a631}}, Y: Field{[10]uint32{0x00108fda, 0x0358e35a, 0x031085d7, 0x027ae9cb, 0x00463b77, 0x01283087, 0x01b430db, 0x0064d529, 0x01582a1b, 0x001371c0}}}, + {X: Field{[10]uint32{0x012013c4, 0x00bccf86, 0x02f073a6, 0x005223ae, 0x02fdf400, 0x0125a8cc, 0x0204fb19, 0x03a2c2b0, 0x015782da, 0x00387f3a}}, Y: Field{[10]uint32{0x01d02f4c, 0x0138d9c7, 0x008a4a26, 0x00e513cc, 0x01e8ca64, 0x01de8435, 0x022b50aa, 0x01bfe5aa, 0x02e5d578, 0x0010145f}}}, + {X: Field{[10]uint32{0x03097d6d, 0x00e6ff02, 0x033a21e1, 0x010bd9cf, 0x001a2b0c, 0x008d8551, 0x00e49bb6, 0x02e00239, 0x03fc5f06, 0x00039c66}}, Y: Field{[10]uint32{0x02fd7822, 0x0118b0ab, 0x025e1a0a, 0x00cd3e45, 0x01d14e2c, 0x00631251, 0x023929ee, 0x037da287, 0x001d83f5, 0x003c320f}}}, + {X: Field{[10]uint32{0x00ad0a4e, 0x0130e2d4, 0x0235a17f, 0x01436723, 0x020dc27c, 0x039a5f6e, 0x00b11277, 0x03358a10, 0x024ba9d8, 0x001ddd9a}}, Y: Field{[10]uint32{0x031b6431, 0x02da7388, 0x00554b26, 0x01b9bdb9, 0x0060b758, 0x01b0642f, 0x02265ac8, 0x009ee808, 0x02d94483, 0x0016ce8a}}}, + {X: Field{[10]uint32{0x008514b4, 0x03ca390d, 0x00292597, 0x035d8983, 0x004f2c9d, 0x00418da4, 0x0260cda4, 0x02a157e1, 0x021f6215, 0x003c8ddc}}, Y: Field{[10]uint32{0x02cfef79, 0x02e4ce06, 0x03651bcc, 0x03a755ec, 0x0046f5ad, 0x00f2e61d, 0x02e8c6d3, 0x027e73b2, 0x021c187b, 0x0004276a}}}, + {X: Field{[10]uint32{0x027b3e08, 0x014fc269, 0x033b9f19, 0x00edb16b, 0x0397517b, 0x01436f20, 0x004e7a8a, 0x006868f3, 0x01d5e889, 0x0025023d}}, Y: Field{[10]uint32{0x01691555, 0x01e7b256, 0x02b90ed8, 0x0150cb67, 0x03ca33e9, 0x0173b4af, 0x01f87b90, 0x006ba725, 0x0212c32f, 0x0006e0bc}}}, + {X: Field{[10]uint32{0x012a7064, 0x027db055, 0x020f4c4f, 0x03223c59, 0x03883649, 0x03a419d7, 0x03214f13, 0x01e49b27, 0x02551170, 0x002ca0dd}}, Y: Field{[10]uint32{0x011abfcf, 0x02c2f5db, 0x00131829, 0x01054671, 0x03be6ee0, 0x02f5545b, 0x0303ca45, 0x02258b9b, 0x033915be, 0x0022554d}}}, + {X: Field{[10]uint32{0x0378f4a9, 0x019eff92, 0x039c1437, 0x00c4fe4b, 0x03986413, 0x01b034a7, 0x012a9dcb, 0x03d5293b, 0x020036b5, 0x003390ae}}, Y: Field{[10]uint32{0x03a048d4, 0x02f4dff8, 0x028024a7, 0x0360914a, 0x0339b757, 0x03dc1afe, 0x00c91792, 0x02ebd1da, 0x0292cf35, 0x001b951c}}}, + {X: Field{[10]uint32{0x00cbcc59, 0x03b738bb, 0x0007d8e9, 0x02f10bc2, 0x00d3942b, 0x0352bd08, 0x009325e8, 0x00ea5efb, 0x02a01a06, 0x002ecf68}}, Y: Field{[10]uint32{0x02d70b32, 0x016749fe, 0x00d9d5c5, 0x00023685, 0x0225d6eb, 0x035b9ecb, 0x018a19ec, 0x0241ffbd, 0x03aabc39, 0x001f0a39}}}, + {X: Field{[10]uint32{0x02c490ee, 0x00b0378d, 0x02acf539, 0x0249b7a3, 0x01dd3e95, 0x01bec9a4, 0x036f620d, 0x0281d3a9, 0x003c97f3, 0x00097613}}, Y: Field{[10]uint32{0x02d5651a, 0x01ce90c5, 0x0154016f, 0x01b279d6, 0x03415309, 0x02b5bf49, 0x0391ffb1, 0x022a6c1e, 0x0345088c, 0x0017839d}}}, + {X: Field{[10]uint32{0x00d5765b, 0x00e511a1, 0x034a7faf, 0x00af9d0e, 0x03764994, 0x01f01d85, 0x015a01de, 0x01bc60b9, 0x03fdca25, 0x0022ea8e}}, Y: Field{[10]uint32{0x030506f1, 0x0022e034, 0x018117f3, 0x01f41f9c, 0x01587bfe, 0x01cc2c84, 0x01c28164, 0x0057345c, 0x00978bbe, 0x001851fa}}}, + {X: Field{[10]uint32{0x021f5170, 0x01a5e5c0, 0x0319274c, 0x026ca1f1, 0x024d3b6b, 0x000931c1, 0x0065dea8, 0x000e1447, 0x020a5b7d, 0x00141f5a}}, Y: Field{[10]uint32{0x037bf5d3, 0x00eb6b5f, 0x03b372dc, 0x034338c3, 0x03c12793, 0x00eb8cae, 0x02a8141c, 0x020eb91f, 0x024770ea, 0x0004e7c5}}}, + {X: Field{[10]uint32{0x02bbd846, 0x003f4e89, 0x030d6d64, 0x03ced3fc, 0x00e45620, 0x003f085f, 0x037354b1, 0x0316fa66, 0x02f7a059, 0x001f1a64}}, Y: Field{[10]uint32{0x01e0bee6, 0x006838ed, 0x02d03274, 0x02814386, 0x001f64e6, 0x004e7efb, 0x027062d7, 0x019070aa, 0x034efa63, 0x00025911}}}, + {X: Field{[10]uint32{0x02698bf2, 0x0319a496, 0x0238fcfc, 0x005efec2, 0x033d5e33, 0x03a9bc55, 0x00507509, 0x016c8c52, 0x02b01bf6, 0x003d8a0c}}, Y: Field{[10]uint32{0x00c1ec95, 0x0230a995, 0x0040d366, 0x00ee31d6, 0x011546cc, 0x013cdd6f, 0x02ce6f88, 0x037f5cfd, 0x00107b8f, 0x0035cc52}}}, + {X: Field{[10]uint32{0x03d1ebad, 0x03e2e71a, 0x02657def, 0x022b3332, 0x00594f62, 0x02f8f1f1, 0x00e20913, 0x03b0d8ad, 0x00abd8e4, 0x002bb487}}, Y: Field{[10]uint32{0x037100f8, 0x03759cae, 0x01dfdf9c, 0x00158094, 0x02b880a2, 0x03d07515, 0x02de1ac2, 0x01ffeaa2, 0x02f3833c, 0x0003e003}}}, + {X: Field{[10]uint32{0x014bf405, 0x0337f6dc, 0x01f66e06, 0x032adb00, 0x029e0ba8, 0x032a5094, 0x011b877a, 0x026905ae, 0x00a9343a, 0x0011b79e}}, Y: Field{[10]uint32{0x014d2bcf, 0x027662fb, 0x00bf66c8, 0x021c237e, 0x0181f30b, 0x00646136, 0x02809c6f, 0x029cfb84, 0x02524f3e, 0x00305104}}}, + {X: Field{[10]uint32{0x00bd41bc, 0x000ed095, 0x02174a63, 0x02469d42, 0x03ba4b65, 0x0010ee66, 0x016ae193, 0x03a4c94d, 0x01b8ab82, 0x000a0cad}}, Y: Field{[10]uint32{0x00aba440, 0x0398fdcd, 0x0049e249, 0x0093d242, 0x01a82752, 0x032e19a5, 0x02ce5340, 0x03c5248f, 0x02033f59, 0x00300d8f}}}, + {X: Field{[10]uint32{0x03e43f9a, 0x017c3132, 0x007ff939, 0x00109cdb, 0x020d85bd, 0x003cdaf6, 0x00abe39b, 0x005885df, 0x01024b5c, 0x0016d5f1}}, Y: Field{[10]uint32{0x0120766c, 0x0032306f, 0x00c06853, 0x0131eb73, 0x01b282ed, 0x00d7613b, 0x03f57b9b, 0x0011cfc6, 0x0007dc0c, 0x00002109}}}, + {X: Field{[10]uint32{0x01c2f103, 0x0132ec70, 0x03af3dac, 0x0362a7b6, 0x00814c45, 0x025ad2a7, 0x01bf8211, 0x01d63a09, 0x02708063, 0x002ce136}}, Y: Field{[10]uint32{0x030fa325, 0x002fbf48, 0x02d13df3, 0x0056bcc3, 0x03aa2375, 0x0241d5fe, 0x03925965, 0x033101d3, 0x01df6400, 0x0039b998}}}, + {X: Field{[10]uint32{0x009a5e1c, 0x00031697, 0x008f8e73, 0x01c8057b, 0x0282a5b6, 0x0069519a, 0x00a5da96, 0x01122a6c, 0x0191563e, 0x000dbff6}}, Y: Field{[10]uint32{0x00bb961c, 0x03b625c0, 0x013b632a, 0x035812d4, 0x01d1a742, 0x0135c8a9, 0x01873208, 0x0351fa50, 0x0035fc17, 0x0025c19e}}}, + {X: Field{[10]uint32{0x0189d81c, 0x02acd2bb, 0x022e7f5a, 0x00b31b0d, 0x035b9d14, 0x00eb7361, 0x0260ecc3, 0x000d9f93, 0x005257c2, 0x0020d9f9}}, Y: Field{[10]uint32{0x008be121, 0x00efc665, 0x0327af1f, 0x0356ef73, 0x02b77ce2, 0x03d0e067, 0x00a9e74d, 0x02c9bb4e, 0x00903ffa, 0x003f1ffc}}}, + {X: Field{[10]uint32{0x00b0564b, 0x0225a6f7, 0x02d179c9, 0x02e752c6, 0x0004719f, 0x0048e196, 0x00539e24, 0x00a5bed0, 0x03e48cc9, 0x003db391}}, Y: Field{[10]uint32{0x03950e1c, 0x003582a1, 0x02a60093, 0x0019e002, 0x02b524a6, 0x033464ab, 0x01590175, 0x03702dbc, 0x036afe5e, 0x000da34a}}}, + {X: Field{[10]uint32{0x01fae013, 0x00769efe, 0x02ac6509, 0x01623fe7, 0x03194ccb, 0x01c95917, 0x03d20c2a, 0x029bc149, 0x03e4beda, 0x0010e308}}, Y: Field{[10]uint32{0x02ff15f8, 0x004c69a4, 0x00b456d6, 0x02ffe392, 0x03e28dc6, 0x01c8a884, 0x01c93b53, 0x02095f6f, 0x0230c721, 0x00151882}}}, + {X: Field{[10]uint32{0x02bee7bd, 0x02124b61, 0x03fbc84e, 0x02acbbb1, 0x03a1fa1d, 0x0176d405, 0x00e87228, 0x00d2fdeb, 0x02f8cc94, 0x00073d9c}}, Y: Field{[10]uint32{0x01cafdcc, 0x00d2f16d, 0x01018167, 0x0047891e, 0x018932b5, 0x01d9f3bf, 0x03cccedb, 0x03769655, 0x01258bb4, 0x0035b48f}}}, + {X: Field{[10]uint32{0x021a2861, 0x01688fcf, 0x00bf4432, 0x018e2bca, 0x01943052, 0x03dc557f, 0x01cd1574, 0x00a6d9ba, 0x0212b0fa, 0x0011d193}}, Y: Field{[10]uint32{0x02b05141, 0x02a19368, 0x01e5681d, 0x02c286c6, 0x03a2468d, 0x0121a6a0, 0x0166e808, 0x03d5997a, 0x01d53bcd, 0x00082690}}}, + {X: Field{[10]uint32{0x02a964a2, 0x0301d69a, 0x02ff8717, 0x008f82c0, 0x020c4ee2, 0x02efdceb, 0x0077a0a9, 0x0324139a, 0x03a1c884, 0x002a6b7e}}, Y: Field{[10]uint32{0x03f79dc8, 0x02b90120, 0x0236c6cf, 0x0282121e, 0x02b2d809, 0x03fad49f, 0x03371d4a, 0x030d71cf, 0x001da7bb, 0x002ac584}}}, + {X: Field{[10]uint32{0x018edcbe, 0x00071bf1, 0x03f97d31, 0x02b97d05, 0x01824421, 0x0167b3e5, 0x00983dd6, 0x000c496b, 0x02de1060, 0x000a4cbf}}, Y: Field{[10]uint32{0x0176d727, 0x01d508f7, 0x02176e10, 0x0385f210, 0x012df54f, 0x03d32c47, 0x0234fe06, 0x0055afcb, 0x0343e666, 0x00218069}}}, + {X: Field{[10]uint32{0x03a50216, 0x0359969c, 0x01df3e31, 0x00e79a62, 0x0064f9ba, 0x03fdd103, 0x02b62c58, 0x02b41080, 0x01282f87, 0x0016afd5}}, Y: Field{[10]uint32{0x01a1fabf, 0x01a4a541, 0x029c5d32, 0x015ca0b5, 0x00610b6f, 0x03b71738, 0x00a1b370, 0x0170080b, 0x0216f270, 0x001c7713}}}, + {X: Field{[10]uint32{0x0001843a, 0x02670f6a, 0x013ec573, 0x02f34902, 0x020f359c, 0x00b0b1f9, 0x0087fc28, 0x0072b506, 0x015d9a12, 0x00010652}}, Y: Field{[10]uint32{0x033e0c31, 0x014daabd, 0x009d2956, 0x01f3638e, 0x02d5e661, 0x00e641cc, 0x02fefc78, 0x01425046, 0x01974029, 0x002454b8}}}, + {X: Field{[10]uint32{0x01fbc3af, 0x016ade8a, 0x03eae416, 0x013889bd, 0x00a902bc, 0x02b2ec56, 0x027979a5, 0x039270f0, 0x0082ea2b, 0x003f28e1}}, Y: Field{[10]uint32{0x0346f5f4, 0x015a9b73, 0x0234f288, 0x01d5ec03, 0x01bad50a, 0x00a5b110, 0x0235f0f7, 0x00999242, 0x035e5fe6, 0x0004981c}}}, + {X: Field{[10]uint32{0x01065d06, 0x02bd1595, 0x02de14b7, 0x01023244, 0x02d499ec, 0x016f0eac, 0x02135305, 0x00da22b2, 0x01233d70, 0x002f3c14}}, Y: Field{[10]uint32{0x01fb8bf9, 0x032d97e9, 0x0271d5f5, 0x0245d9c3, 0x01c16d49, 0x00d15a21, 0x0084e63a, 0x01a42cd5, 0x03f10645, 0x003cc995}}}, + {X: Field{[10]uint32{0x029a92e1, 0x036292e3, 0x018e479d, 0x03128999, 0x0268bf6c, 0x017f25ac, 0x019cf74f, 0x02d092c5, 0x002f6391, 0x00139c2d}}, Y: Field{[10]uint32{0x013b3688, 0x02ccfdf9, 0x03d36591, 0x02c8ff93, 0x0266c595, 0x02db38d5, 0x0324fa44, 0x007019de, 0x00111af3, 0x0022e9e2}}}, + {X: Field{[10]uint32{0x0121742f, 0x0213c37a, 0x00e6e1be, 0x03ce2897, 0x013cdb83, 0x01d8a370, 0x013703ca, 0x0183ab08, 0x03d7331c, 0x000ffa14}}, Y: Field{[10]uint32{0x01dca5d6, 0x00c39517, 0x0076d0b2, 0x00966d81, 0x03f27b51, 0x003c9374, 0x01961540, 0x03704dbd, 0x0377c2c6, 0x003edf6e}}}, + {X: Field{[10]uint32{0x0248b9be, 0x0098d27d, 0x025f5ee7, 0x0208f33d, 0x01ca42f5, 0x013a5d90, 0x02aa8100, 0x03750028, 0x037fc3ca, 0x003600cd}}, Y: Field{[10]uint32{0x03d6fe99, 0x011c67a3, 0x02900d82, 0x00616b44, 0x00aeed21, 0x033044eb, 0x02b7fbfe, 0x02020152, 0x004f281a, 0x0018d5ee}}}, + {X: Field{[10]uint32{0x030bebe1, 0x001b2781, 0x03845941, 0x00535b62, 0x0290a051, 0x01fe97b4, 0x037128e7, 0x01c5880a, 0x007b6f9e, 0x001777f7}}, Y: Field{[10]uint32{0x01cd76ad, 0x0047b915, 0x021e9d59, 0x03644663, 0x02714b6d, 0x00740c19, 0x0274c81a, 0x03edefeb, 0x00edfa1e, 0x00008fab}}}, + {X: Field{[10]uint32{0x036f7dd5, 0x0133528e, 0x004115bc, 0x01bb5c85, 0x037913b4, 0x004b459e, 0x01353e6b, 0x02523fa4, 0x0243c964, 0x0017c540}}, Y: Field{[10]uint32{0x00af903f, 0x0375366e, 0x014e571c, 0x0336555d, 0x03b18147, 0x028d8313, 0x00991e2b, 0x03440805, 0x01497a2f, 0x000daaf2}}}, + {X: Field{[10]uint32{0x00942647, 0x01a6eb14, 0x00e14979, 0x00898551, 0x030539f0, 0x02c49fbf, 0x00cc89c2, 0x0110a5e9, 0x00975b0c, 0x00092d3f}}, Y: Field{[10]uint32{0x02b5c207, 0x00e895e7, 0x038f9a82, 0x00b290f2, 0x0311d96f, 0x000529de, 0x02f88819, 0x001f617e, 0x03df54ad, 0x002f4f8f}}}, + {X: Field{[10]uint32{0x002202e0, 0x03395739, 0x0276e1dc, 0x03aab987, 0x03f11b18, 0x02191061, 0x025ba2b2, 0x02d7f277, 0x03355556, 0x0028083a}}, Y: Field{[10]uint32{0x02639f66, 0x02416755, 0x0188027e, 0x01bafadc, 0x039765ac, 0x02a60b8a, 0x03667c00, 0x03d15c5a, 0x021f1ad2, 0x00269c7a}}}, + {X: Field{[10]uint32{0x01f37a68, 0x01abf6b8, 0x00a0f86f, 0x01e33356, 0x038a224c, 0x018711f8, 0x0131de59, 0x00fab181, 0x0064f717, 0x00182de4}}, Y: Field{[10]uint32{0x010786b7, 0x017ce312, 0x016decfc, 0x038d89c9, 0x013437e4, 0x022d529f, 0x01fcbaed, 0x01f5b5ae, 0x024cf6a4, 0x000eb412}}}, + {X: Field{[10]uint32{0x01f7d60b, 0x01edf8e8, 0x01685177, 0x02d74442, 0x03d2e233, 0x03238ff7, 0x002d9159, 0x0079512b, 0x01f2b57d, 0x0020d73c}}, Y: Field{[10]uint32{0x02a84b31, 0x017281fd, 0x01b16166, 0x0255f24a, 0x01a7112f, 0x03871b80, 0x03f77339, 0x036c4eee, 0x0135136e, 0x001f48f7}}}, + {X: Field{[10]uint32{0x037f77ed, 0x00e549e0, 0x00dcab1d, 0x0378c623, 0x03606cd7, 0x012cc66e, 0x021d8ade, 0x036b540b, 0x03501f1e, 0x003ebdd0}}, Y: Field{[10]uint32{0x0221bcc9, 0x0122f7ff, 0x0147616d, 0x006e15d4, 0x030fbcd1, 0x026deb3f, 0x01a0fa03, 0x0160392e, 0x00bdbffb, 0x0036efac}}}, + {X: Field{[10]uint32{0x012de938, 0x02775dc3, 0x027620a3, 0x02974eca, 0x01044091, 0x004849c7, 0x03f74edf, 0x02eb88f9, 0x03c3e072, 0x000e5b1b}}, Y: Field{[10]uint32{0x026fa667, 0x027458b7, 0x024799e9, 0x01dbd1aa, 0x029fb0e0, 0x01ae3d53, 0x00499409, 0x01513533, 0x02f8a143, 0x00177948}}}, + {X: Field{[10]uint32{0x0144ab88, 0x0051fb83, 0x03684881, 0x0170790e, 0x00ae8e60, 0x0023bc83, 0x02622f80, 0x03cb2870, 0x0140ad8d, 0x0003e2ae}}, Y: Field{[10]uint32{0x01bff796, 0x00f9c377, 0x011e0406, 0x03d4cf91, 0x01630d28, 0x0201310a, 0x0057163f, 0x009f3b26, 0x0281fa74, 0x00267f94}}}, + {X: Field{[10]uint32{0x01772367, 0x0106d1af, 0x01e78758, 0x01325640, 0x008197af, 0x020a70dd, 0x0122219a, 0x03fff078, 0x0068af6d, 0x0029880a}}, Y: Field{[10]uint32{0x01e9af45, 0x03deeac1, 0x00e4d145, 0x031360ec, 0x03fe9c4f, 0x0235a363, 0x0254eb6f, 0x0127053e, 0x020bc82a, 0x000981e8}}}, + {X: Field{[10]uint32{0x0067e41e, 0x0312611c, 0x02bda4d7, 0x017edda8, 0x00cfbced, 0x00e93f6f, 0x03644842, 0x02185a41, 0x019349a9, 0x002c4b46}}, Y: Field{[10]uint32{0x02d75e31, 0x0270cf70, 0x037ec009, 0x0155c006, 0x0173fdd5, 0x01c05112, 0x0045eb3f, 0x022ac4a4, 0x00e0ac6c, 0x00299b75}}}, + {X: Field{[10]uint32{0x01eb3b3c, 0x01ef7085, 0x01c64fd6, 0x00d17372, 0x009ae0a7, 0x0064e0c1, 0x00d3b97b, 0x003d7f1b, 0x0355b499, 0x00023723}}, Y: Field{[10]uint32{0x01435d83, 0x01044679, 0x002f5fa6, 0x00e3211f, 0x02c00ce4, 0x021c8bd2, 0x0354cc38, 0x023f632e, 0x017d62cc, 0x0006f9d1}}}, + {X: Field{[10]uint32{0x018feeec, 0x03586719, 0x0053b1b6, 0x00f6b743, 0x01f12864, 0x018d47d9, 0x0121c4b3, 0x02792df5, 0x0337d1db, 0x000b02dc}}, Y: Field{[10]uint32{0x039bad53, 0x0264016c, 0x02d9ad8b, 0x0254ec20, 0x01ef765b, 0x001f3b85, 0x03dae62c, 0x004867de, 0x039ceb7c, 0x003a289e}}}, + {X: Field{[10]uint32{0x023bab35, 0x001b24f6, 0x00d0e66d, 0x024aed7c, 0x02b17ad6, 0x009052ac, 0x00a0d1d2, 0x001a2692, 0x00a25010, 0x002247ed}}, Y: Field{[10]uint32{0x027260f6, 0x014f8903, 0x00c7c0cb, 0x00399869, 0x0052d06c, 0x00d1fcf2, 0x013c03bc, 0x00f04efa, 0x0166cdf4, 0x00105a14}}}, + {X: Field{[10]uint32{0x01ca1738, 0x027b4eda, 0x03b02ed9, 0x02d87d6e, 0x0039fbcc, 0x0399a3bc, 0x0213729d, 0x01103f9c, 0x01b1511c, 0x00128cde}}, Y: Field{[10]uint32{0x03ac0f6f, 0x00519328, 0x02b0039d, 0x000f505c, 0x0017b3bf, 0x02d133a2, 0x01d75eed, 0x006476a2, 0x01c239e9, 0x002c4a8f}}}, + {X: Field{[10]uint32{0x03815521, 0x01c18697, 0x000d22c5, 0x00f0721e, 0x017dc58e, 0x00efe359, 0x01a360f8, 0x01afe98b, 0x03c85493, 0x002e2ca9}}, Y: Field{[10]uint32{0x02a2d15b, 0x0168f57d, 0x03021c06, 0x00b05f0a, 0x021cd441, 0x014aa26e, 0x02c70012, 0x00d8b096, 0x000b7719, 0x0023e48b}}}, + {X: Field{[10]uint32{0x039624fb, 0x024491f6, 0x03a7ff01, 0x02d88b25, 0x002fb56a, 0x01f3dcea, 0x029341d7, 0x014b941e, 0x0219d1dc, 0x002419bf}}, Y: Field{[10]uint32{0x011baf50, 0x00f9f51c, 0x00896215, 0x02f02aef, 0x00c281f5, 0x02d9e269, 0x01d4929e, 0x0315d760, 0x03436ec3, 0x0008f466}}}, + {X: Field{[10]uint32{0x00ced8ec, 0x00d35d5f, 0x017c2b05, 0x0379b99d, 0x029f32c8, 0x02d6dcfb, 0x01a18df2, 0x03a6c728, 0x014c19c9, 0x002fe6ac}}, Y: Field{[10]uint32{0x029759c0, 0x007c5d03, 0x011dd048, 0x01d756f2, 0x0385e793, 0x00de8ebd, 0x02724188, 0x018f782a, 0x01233c38, 0x003b25a6}}}, + {X: Field{[10]uint32{0x016f9d03, 0x01978d4c, 0x031af102, 0x021ba216, 0x0378c656, 0x023adeab, 0x01b7e69e, 0x01280889, 0x006f9c65, 0x001a2c9a}}, Y: Field{[10]uint32{0x014da9c3, 0x012e06fc, 0x0019af28, 0x035bd3dd, 0x03b6b407, 0x00e49caa, 0x014d4077, 0x009af615, 0x01048468, 0x00074f5d}}}, + {X: Field{[10]uint32{0x010bf2fa, 0x009c00dc, 0x01a7de04, 0x01a6fdef, 0x024d3bf6, 0x00b27cda, 0x00989d39, 0x02886a53, 0x03855251, 0x00083720}}, Y: Field{[10]uint32{0x01aa749f, 0x01d83c25, 0x0224a974, 0x0251588f, 0x03975d67, 0x0182321d, 0x0080c4b3, 0x00ca7fe4, 0x02ff713d, 0x000085f9}}}, + {X: Field{[10]uint32{0x01fd0368, 0x026872ad, 0x01568168, 0x011a6a1d, 0x025c822e, 0x03164612, 0x01859bf8, 0x0266328e, 0x009b555d, 0x003c2fad}}, Y: Field{[10]uint32{0x02664aac, 0x0022d01c, 0x032f53bd, 0x03c05830, 0x002e8ff7, 0x029d74fd, 0x033b3b30, 0x037e52e8, 0x02e7a23d, 0x00383816}}}, + {X: Field{[10]uint32{0x00a0ee57, 0x0168ed71, 0x022cfaab, 0x032b7229, 0x0016ddc1, 0x00b3d311, 0x01ad8abf, 0x03e7ae90, 0x0173270f, 0x0023c6aa}}, Y: Field{[10]uint32{0x015920ec, 0x038c2996, 0x00a87071, 0x02c0ae68, 0x002bd6bb, 0x00bdbae8, 0x02a441f1, 0x026c5ea1, 0x0260e340, 0x00242a8d}}}, + {X: Field{[10]uint32{0x028a9957, 0x0208a0e4, 0x01dfb413, 0x02a02ab2, 0x00fecd43, 0x024d2e20, 0x00ca847a, 0x03051d83, 0x0135278d, 0x0031c7ac}}, Y: Field{[10]uint32{0x02003804, 0x021c57ad, 0x03299a9d, 0x0311f9c6, 0x0351d23a, 0x03b31fdb, 0x0307ad5d, 0x0206e224, 0x03774852, 0x0010599f}}}, + {X: Field{[10]uint32{0x02c41c81, 0x03b5946f, 0x01180b0f, 0x00f6ee87, 0x00fa904d, 0x01259717, 0x0109df5d, 0x01aa7cdf, 0x026e50d6, 0x003a401c}}, Y: Field{[10]uint32{0x01028e39, 0x0317c25c, 0x01d5a921, 0x0095e1ba, 0x03117f77, 0x0371f5ec, 0x00e64f2c, 0x01bd02cd, 0x0230db03, 0x0035482a}}}, + {X: Field{[10]uint32{0x0123fa38, 0x0398ed80, 0x00c3beda, 0x035d3e1f, 0x0258d72d, 0x0083bf79, 0x03a6d6b7, 0x014aa6e8, 0x00afa159, 0x002502ac}}, Y: Field{[10]uint32{0x03bfcbcd, 0x01974a3c, 0x00702f87, 0x03c14f10, 0x016e5061, 0x012445b8, 0x01e443aa, 0x022866e1, 0x03476f78, 0x003fb1b5}}}, + {X: Field{[10]uint32{0x00c76949, 0x00b9c32a, 0x006be8b6, 0x01a81903, 0x02a03ba4, 0x004b1739, 0x033ce9d4, 0x02619937, 0x026d643e, 0x002684f7}}, Y: Field{[10]uint32{0x0126dd5e, 0x000e54da, 0x02499061, 0x00c0bada, 0x01a46016, 0x02f1b2f2, 0x00c914d4, 0x02361e2d, 0x02966c2d, 0x00108e20}}}, + {X: Field{[10]uint32{0x02c577c3, 0x03e0ee9d, 0x01d6f256, 0x0176f782, 0x01b76d6a, 0x035fd8ba, 0x006b1497, 0x00a7652a, 0x01b2b311, 0x0010e10a}}, Y: Field{[10]uint32{0x00bc1c7d, 0x013e4c97, 0x006cd2e4, 0x0261f11b, 0x03b2398e, 0x03a0cef6, 0x03cb600b, 0x026f86cc, 0x0186a722, 0x00390d80}}}, + {X: Field{[10]uint32{0x02d02605, 0x019df1a5, 0x00f018c1, 0x02f9a8ea, 0x03c8bb59, 0x010c03a5, 0x007b524e, 0x01cb97eb, 0x025d66d4, 0x000fd8ec}}, Y: Field{[10]uint32{0x00ca39dd, 0x0257ced4, 0x0249d44c, 0x028bef7d, 0x01d9971a, 0x033fcb1a, 0x0119bbe5, 0x006734af, 0x0042158e, 0x0001161c}}}, + {X: Field{[10]uint32{0x038cc0c5, 0x00d716ae, 0x013d1e17, 0x03b5b3ef, 0x0047afe5, 0x0237b7bc, 0x004f90b9, 0x0294828e, 0x01f717c7, 0x0001987f}}, Y: Field{[10]uint32{0x01a80abd, 0x01c0a4df, 0x02549d99, 0x00cec765, 0x03b83b74, 0x014be083, 0x012f00ea, 0x00386496, 0x003ab43c, 0x002f6689}}}, + {X: Field{[10]uint32{0x02b951ce, 0x0317e256, 0x018cc279, 0x01f1d6f1, 0x000c999d, 0x03a8b532, 0x0027c367, 0x01abdf43, 0x0326daac, 0x002e706e}}, Y: Field{[10]uint32{0x03140f4e, 0x02e1fac6, 0x0138a767, 0x01eed632, 0x01b872d1, 0x03b575fc, 0x026c5b2e, 0x021aedf1, 0x0334a42b, 0x002934ef}}}, + {X: Field{[10]uint32{0x0127e8fa, 0x006fe82c, 0x010999b1, 0x03b2ead7, 0x017d9b23, 0x03bf4aee, 0x02af4733, 0x03676142, 0x00a0fc6c, 0x0033d6b1}}, Y: Field{[10]uint32{0x011070ec, 0x03c5817e, 0x002872ca, 0x01dff521, 0x01ad465d, 0x0298b2bd, 0x03a94fe3, 0x005c601f, 0x0316c37f, 0x00112498}}}, + {X: Field{[10]uint32{0x02b3b422, 0x02191c6f, 0x01b7413c, 0x0286cf0a, 0x03749caa, 0x03c28d3e, 0x0082c57f, 0x028cb8ee, 0x02afab8d, 0x002a94ac}}, Y: Field{[10]uint32{0x000859ce, 0x038fb303, 0x00244ac4, 0x02105b18, 0x03733260, 0x00c8094b, 0x028df35e, 0x0396546d, 0x03284a7b, 0x0012d589}}}, + {X: Field{[10]uint32{0x0068211c, 0x01fc60d2, 0x0217ad34, 0x0159e61c, 0x007926b0, 0x011a25af, 0x032909c5, 0x002342a7, 0x022eb3aa, 0x0001843c}}, Y: Field{[10]uint32{0x0019e6bb, 0x030d5492, 0x006eac1b, 0x01ef09dd, 0x012dbf63, 0x019bb68f, 0x01571e61, 0x0312cc06, 0x010df35f, 0x00294b86}}}, + {X: Field{[10]uint32{0x011a6d80, 0x00f30d31, 0x03b44acc, 0x01690997, 0x02db65f1, 0x025449e5, 0x00543307, 0x02963381, 0x00c3a485, 0x00004fc9}}, Y: Field{[10]uint32{0x03f3bc3b, 0x01261301, 0x02e611a4, 0x01b6c93e, 0x020f0797, 0x03e01cd9, 0x01c4327c, 0x01a7fcf3, 0x03b618e0, 0x003eb32f}}}, + {X: Field{[10]uint32{0x00eb0f24, 0x02176768, 0x02bdf922, 0x03ed0573, 0x01caeb18, 0x008b16a1, 0x00112e69, 0x026ca72c, 0x02a84927, 0x000573af}}, Y: Field{[10]uint32{0x0075d833, 0x03a27e38, 0x00d05821, 0x014a3430, 0x01c36de4, 0x029dec70, 0x01af7ed4, 0x03e6f54e, 0x00fe158f, 0x0008f973}}}, + {X: Field{[10]uint32{0x004d97f6, 0x03721c80, 0x029a55f2, 0x032025bc, 0x02cf92e0, 0x00093586, 0x001b1d60, 0x014d9f71, 0x018efb7d, 0x00098168}}, Y: Field{[10]uint32{0x0266d375, 0x012f5417, 0x022f4f94, 0x0132500b, 0x02fd6d67, 0x002b5bf4, 0x018ae518, 0x02dfb371, 0x0374f111, 0x00235a99}}}, + {X: Field{[10]uint32{0x027f9995, 0x002c172f, 0x0356c33d, 0x004cda52, 0x0225cd05, 0x00d6cd8a, 0x0236d6cd, 0x015bcdfe, 0x0272a787, 0x00396238}}, Y: Field{[10]uint32{0x0072fbb7, 0x015bff55, 0x0191766e, 0x0300341c, 0x02115425, 0x0348f94f, 0x00715c6a, 0x010a5a6e, 0x018320b8, 0x00056fae}}}, + {X: Field{[10]uint32{0x016b46a5, 0x021d436f, 0x00b6ccb9, 0x00e64d16, 0x023a02cc, 0x03de729f, 0x03205cb0, 0x03b716da, 0x0122f264, 0x002000c9}}, Y: Field{[10]uint32{0x011a44a8, 0x01c60ee1, 0x01043bca, 0x03a3530f, 0x02fd2c1d, 0x02aa5c97, 0x038b93b5, 0x007aea63, 0x02f4fb4e, 0x0011e724}}}, + {X: Field{[10]uint32{0x0241bfaa, 0x01a8be85, 0x013f3c16, 0x02dfe45b, 0x0394b525, 0x0084a1f9, 0x0101308a, 0x0206d5c1, 0x000ee1a5, 0x00254301}}, Y: Field{[10]uint32{0x0338ea71, 0x03bc76ed, 0x01a751e4, 0x022370e1, 0x0252441a, 0x01d808de, 0x0171725f, 0x01c29a7c, 0x020e911d, 0x00390f6c}}}, + {X: Field{[10]uint32{0x02c391fa, 0x015402a1, 0x018759db, 0x02f8a0b7, 0x01a634b9, 0x02e2f03d, 0x030aecad, 0x03b95cb9, 0x0336423f, 0x003a267f}}, Y: Field{[10]uint32{0x003a9bd1, 0x01231f2d, 0x02790a02, 0x02432c62, 0x01886117, 0x03e1ea44, 0x03100340, 0x02da3899, 0x03b0dfe6, 0x0001fb65}}}, + {X: Field{[10]uint32{0x00a1a51b, 0x00a972f6, 0x0045e833, 0x034a715e, 0x006a7415, 0x01b867ee, 0x00ce5c76, 0x01adea3e, 0x008f0c20, 0x00348d9a}}, Y: Field{[10]uint32{0x016ec9e9, 0x00170b19, 0x01113adb, 0x021d5486, 0x01d50988, 0x0060ed49, 0x02d65085, 0x012983f9, 0x019fe3d5, 0x001cbc8d}}}, + {X: Field{[10]uint32{0x019dcccf, 0x038be884, 0x0286ae94, 0x017f7709, 0x01430eab, 0x01718a3d, 0x02458c58, 0x00bc920f, 0x0071da4b, 0x00234f5f}}, Y: Field{[10]uint32{0x0361178f, 0x01e3d607, 0x00aad827, 0x000c7d65, 0x021f435c, 0x0191ffc7, 0x039c22ad, 0x03c832f5, 0x00e47948, 0x000cf102}}}, + {X: Field{[10]uint32{0x032651a9, 0x01ff66ed, 0x028a587d, 0x01431585, 0x03fee4b7, 0x034418fe, 0x02542ba5, 0x02066546, 0x037ae891, 0x000c83c4}}, Y: Field{[10]uint32{0x03c402c5, 0x016f3cf4, 0x02232679, 0x0262a317, 0x03086036, 0x014efc00, 0x0275a021, 0x0387bcc8, 0x006ae2a4, 0x002e1015}}}, + {X: Field{[10]uint32{0x0081352c, 0x015df186, 0x020de8ce, 0x01fe691b, 0x027546c8, 0x03519006, 0x01686072, 0x02c967d1, 0x03ce3fe6, 0x0027a2bf}}, Y: Field{[10]uint32{0x029d02f1, 0x01def530, 0x00f9273e, 0x03db14fb, 0x01af8639, 0x01c8d949, 0x00ebaf09, 0x01fdf098, 0x0301d83b, 0x00343a8d}}}, + {X: Field{[10]uint32{0x021eef64, 0x031cacf1, 0x03f539be, 0x03d26b4a, 0x03daf70f, 0x0090487b, 0x03c915ea, 0x00e61ca4, 0x01b81d35, 0x00177d19}}, Y: Field{[10]uint32{0x01e690af, 0x01069eb5, 0x03e54385, 0x01f3ccf0, 0x038b3804, 0x003d1820, 0x00c193d4, 0x03210416, 0x01ff5ae4, 0x000c81b1}}}, + {X: Field{[10]uint32{0x02f28f58, 0x01197523, 0x0064d6e1, 0x00e621a8, 0x011312bb, 0x009ae8f1, 0x0061d488, 0x00d42fd2, 0x0326a18c, 0x00266734}}, Y: Field{[10]uint32{0x00b1ef12, 0x02244772, 0x00b0dd41, 0x02c2fa21, 0x00a9fcea, 0x02554582, 0x018e6629, 0x0337d9e6, 0x032ad6dc, 0x000b362a}}}, + {X: Field{[10]uint32{0x03ce163b, 0x02c09ada, 0x034cdc0a, 0x019d1d86, 0x03479a66, 0x01551832, 0x02ba6f42, 0x02705be8, 0x00ee574d, 0x0020763f}}, Y: Field{[10]uint32{0x00673143, 0x02d2b166, 0x00ca638c, 0x03f3f5f2, 0x003cf771, 0x0169a605, 0x039a996f, 0x01e9a8ed, 0x0334f589, 0x0016539f}}}, + {X: Field{[10]uint32{0x0096d278, 0x01b610f4, 0x020dd4da, 0x027b254e, 0x0385839c, 0x01be1460, 0x032b42d5, 0x01cefbe4, 0x0324b9ac, 0x0027a0f5}}, Y: Field{[10]uint32{0x00c88869, 0x03e9788c, 0x01689a1a, 0x00029287, 0x0100d3a0, 0x03125bb1, 0x02fda95a, 0x016b2e27, 0x00abfed0, 0x003e2c63}}}, + {X: Field{[10]uint32{0x02320c3e, 0x0244510f, 0x0231764f, 0x00ecd6ea, 0x01908ec3, 0x00ecb640, 0x00b1f647, 0x00f022bb, 0x00b13b44, 0x00262e8e}}, Y: Field{[10]uint32{0x0399b84f, 0x0075808f, 0x020a44df, 0x01e8d0d2, 0x010d8ece, 0x01bd0bd2, 0x012f972e, 0x00cbefd7, 0x01d7fc22, 0x000d0fd8}}}, + {X: Field{[10]uint32{0x02a875ec, 0x00120194, 0x01285de7, 0x01ef9b0d, 0x01582244, 0x03a5c19c, 0x03a94886, 0x017bb169, 0x025a9adf, 0x000824ba}}, Y: Field{[10]uint32{0x024e7f35, 0x02b71efa, 0x0228f304, 0x03099650, 0x0195a7e9, 0x00985998, 0x00facc8e, 0x009c8aa5, 0x02eb5238, 0x00377edc}}}, + {X: Field{[10]uint32{0x02eeb75a, 0x00c13080, 0x01e765b9, 0x00e65687, 0x00c044c6, 0x02f25d04, 0x037bce4e, 0x02817ab1, 0x009a8f45, 0x003e7ba4}}, Y: Field{[10]uint32{0x0301705e, 0x03b93b84, 0x01d51a41, 0x034df8ba, 0x023a39c0, 0x02babc4f, 0x03e50fd2, 0x02c3a11c, 0x01ba93f5, 0x0021840c}}}, + {X: Field{[10]uint32{0x01df101c, 0x03394d4d, 0x00603c75, 0x009f18fa, 0x015c676e, 0x03baa6fe, 0x002dfc02, 0x0169f2cd, 0x00e23bc5, 0x00284e1e}}, Y: Field{[10]uint32{0x03108427, 0x03ffe09e, 0x02ed001b, 0x0214d71c, 0x02233f05, 0x034fa069, 0x02a2f833, 0x02c24424, 0x02d03d4b, 0x000d7033}}}, + {X: Field{[10]uint32{0x004ae3e4, 0x01ec6d84, 0x0065d34f, 0x03e0e9c6, 0x03b863a7, 0x02760300, 0x004cfce0, 0x037f61ca, 0x01d2cd32, 0x003a3b20}}, Y: Field{[10]uint32{0x0017648b, 0x009c89c1, 0x01e4ec6e, 0x03a2c219, 0x011d24c4, 0x0145eff2, 0x032b01af, 0x0375ffd4, 0x0377ee12, 0x00182fa6}}}, + {X: Field{[10]uint32{0x00f35b60, 0x00ae2607, 0x0297a664, 0x0261a6e6, 0x00d48e98, 0x013818e4, 0x030b18fe, 0x03710cd1, 0x02551529, 0x003c1f2c}}, Y: Field{[10]uint32{0x0223b550, 0x00a5e9b0, 0x03d2b0a3, 0x00856544, 0x01c6e854, 0x0388d56a, 0x034b9412, 0x018cf566, 0x03776d74, 0x002f51ba}}}, + {X: Field{[10]uint32{0x02af7f51, 0x022136ae, 0x03dd82fe, 0x00fcbcb2, 0x0242becd, 0x02982e0d, 0x03189ae0, 0x02a7c2a5, 0x0023dcfd, 0x000e6f39}}, Y: Field{[10]uint32{0x022c8e4d, 0x01e2ec7a, 0x01a2b2db, 0x03a0525e, 0x01f3430b, 0x00c0fb24, 0x00903127, 0x008679d1, 0x00aa4b71, 0x00305667}}}, + {X: Field{[10]uint32{0x029ad3cf, 0x03f44147, 0x00ec80e0, 0x019f3cb6, 0x0358142f, 0x00f2793f, 0x033de211, 0x02e05062, 0x01cbd51d, 0x001b6984}}, Y: Field{[10]uint32{0x001e4b7f, 0x01e3fcc1, 0x00d704d1, 0x01a0b867, 0x02f7fe55, 0x02c0d203, 0x03d494eb, 0x03d953f6, 0x00483250, 0x001af0bc}}}, + {X: Field{[10]uint32{0x031aed8a, 0x0327eee2, 0x00c709a3, 0x011de51c, 0x01f4e13a, 0x029fa571, 0x00a5e8ef, 0x003ae629, 0x00038d2e, 0x0033b6e7}}, Y: Field{[10]uint32{0x019a0d40, 0x01ab5361, 0x028feeca, 0x0297dfd7, 0x0046804f, 0x034213d0, 0x00d5d56e, 0x0362f208, 0x0131de42, 0x001e68bf}}}, + {X: Field{[10]uint32{0x01ae3d82, 0x01e841c1, 0x02d8a3a0, 0x02134037, 0x0225393f, 0x01b107f9, 0x0340458f, 0x001b40cb, 0x00986d11, 0x001f6255}}, Y: Field{[10]uint32{0x026d0d61, 0x03561a86, 0x01866ee7, 0x030ac842, 0x02edd110, 0x0382b783, 0x02a117c7, 0x01652d86, 0x02cfff1c, 0x001753ed}}}, + {X: Field{[10]uint32{0x03dc3df7, 0x000310f5, 0x01aa175a, 0x01431ba7, 0x00851aaf, 0x00fb3b18, 0x01e26069, 0x010ebfac, 0x01627370, 0x00293ca4}}, Y: Field{[10]uint32{0x039c4439, 0x009a0871, 0x00846b27, 0x01ef118a, 0x0392265d, 0x0116abb4, 0x03abb201, 0x012c54e3, 0x00e8fb76, 0x002fbaff}}}, + {X: Field{[10]uint32{0x011cab70, 0x0058bc3e, 0x000a29cb, 0x01959a03, 0x00e0ba81, 0x01a26ef3, 0x00ce964e, 0x032c23b0, 0x01acde4c, 0x002d8e27}}, Y: Field{[10]uint32{0x00303529, 0x00103294, 0x02cdd679, 0x029fbbf6, 0x039ee836, 0x0238c7f9, 0x032826d2, 0x0091d05e, 0x03dbd2d0, 0x00391031}}}, + {X: Field{[10]uint32{0x02fcc9e1, 0x022bbefd, 0x00b4927b, 0x005a6673, 0x01ae4ee0, 0x03bbcdfd, 0x00ac2d6a, 0x030dbe5e, 0x01acf752, 0x001cb39b}}, Y: Field{[10]uint32{0x039bbca6, 0x017c43b5, 0x03bc67c4, 0x03379e5a, 0x028ad38a, 0x0380409f, 0x00c6d4d5, 0x01100f58, 0x0297bbd8, 0x00339ab0}}}, + {X: Field{[10]uint32{0x00255f06, 0x004e119b, 0x0117531b, 0x02b43e2b, 0x014fb3e5, 0x01af1430, 0x00931faa, 0x01096958, 0x036fcfd7, 0x003beb4c}}, Y: Field{[10]uint32{0x015a82c0, 0x008ba3f8, 0x0203b2b4, 0x00251064, 0x039eab6b, 0x00605c58, 0x03ab5597, 0x026847b1, 0x00f4eeee, 0x000fede1}}}, + {X: Field{[10]uint32{0x034eaae3, 0x0177ac80, 0x0349c289, 0x01b3ce0a, 0x0322002c, 0x00e4f295, 0x034bd1f0, 0x008599f1, 0x022d04bb, 0x003e6352}}, Y: Field{[10]uint32{0x016fd148, 0x01b3116d, 0x0269e9a3, 0x022b59a7, 0x0297a26f, 0x01851f2e, 0x0350763c, 0x01e2a0d1, 0x031f7e37, 0x00261d78}}}, + {X: Field{[10]uint32{0x0134183f, 0x02251832, 0x02eafb0b, 0x0079961d, 0x012b0d16, 0x02b04fb4, 0x01eea342, 0x0108ccb1, 0x034d2bc2, 0x001da33d}}, Y: Field{[10]uint32{0x02fdc34e, 0x0003e9e8, 0x022654ba, 0x00cb9cb9, 0x00af083b, 0x0341a954, 0x02e9f72d, 0x0135ebe1, 0x0207e55b, 0x00108cdd}}}, + {X: Field{[10]uint32{0x01beff7b, 0x0049d369, 0x01c59979, 0x01b88949, 0x03d34cfb, 0x02a45b42, 0x01ec27aa, 0x03189645, 0x03b01d05, 0x002b09bc}}, Y: Field{[10]uint32{0x014f4045, 0x033b37fa, 0x0254a42f, 0x01dae2f7, 0x01a30055, 0x03afac66, 0x0113bcb1, 0x005a0746, 0x00ac89b6, 0x0038d9d8}}}, + {X: Field{[10]uint32{0x0374fbac, 0x0263cd07, 0x01285212, 0x00368234, 0x02fcd905, 0x02c10a8e, 0x025045e1, 0x002f8b99, 0x0181741a, 0x0036b750}}, Y: Field{[10]uint32{0x00a84f60, 0x01b80339, 0x0002b805, 0x02f2a40a, 0x03f6a4df, 0x018d5d39, 0x01e4e2c8, 0x03741098, 0x03e0da78, 0x001b3d1b}}}, + {X: Field{[10]uint32{0x0286a3e8, 0x0342ae46, 0x00f82a6f, 0x03aa46a2, 0x032c4e1e, 0x010fc6dc, 0x03139ed1, 0x01aa18be, 0x0198ce9e, 0x00395945}}, Y: Field{[10]uint32{0x01f1ac98, 0x03bf6cbc, 0x0221a9e9, 0x022b55a6, 0x000770fd, 0x03d357db, 0x01723d8f, 0x01b04042, 0x033669ab, 0x002ed084}}}, + {X: Field{[10]uint32{0x030f5b02, 0x03922b89, 0x03d65de9, 0x02dc3730, 0x032d47a2, 0x0007b8ea, 0x0369b454, 0x03d658e6, 0x011eb4f0, 0x003c9bde}}, Y: Field{[10]uint32{0x030ff699, 0x026f02d1, 0x004fbe1a, 0x02458cea, 0x002693c5, 0x02915d5f, 0x003c799e, 0x02efc946, 0x03251fe5, 0x0008b8d2}}}, + {X: Field{[10]uint32{0x023da9da, 0x0379a398, 0x018ac19f, 0x008a76de, 0x032d2bec, 0x02137628, 0x01da048a, 0x00bd21ea, 0x010b9561, 0x0029433c}}, Y: Field{[10]uint32{0x03dcc576, 0x020554c2, 0x02888e4c, 0x033730f7, 0x00ce345e, 0x03358166, 0x039f9f47, 0x02899076, 0x013c0a76, 0x0014041f}}}, + {X: Field{[10]uint32{0x0245c13c, 0x025fc6c2, 0x00c10a11, 0x02ad7b17, 0x03e917e5, 0x0205f2e6, 0x0386a5c1, 0x01b06f57, 0x03b90273, 0x0031d220}}, Y: Field{[10]uint32{0x008beedc, 0x03d2f44b, 0x0232e847, 0x01570ade, 0x01d1c2bd, 0x003a89d6, 0x013e73b6, 0x00f3fc35, 0x03bce739, 0x00380f10}}}, + {X: Field{[10]uint32{0x01e1c0a9, 0x03fa0002, 0x02e9c98d, 0x02937400, 0x01be7cad, 0x00a78b23, 0x005c00f6, 0x03b622ec, 0x03d01741, 0x00028d0d}}, Y: Field{[10]uint32{0x007bca1c, 0x0181c4e1, 0x01c9ed21, 0x019c2ed0, 0x00fc268e, 0x0134fbbe, 0x01a00afa, 0x032af47f, 0x005a257f, 0x002989f8}}}, + {X: Field{[10]uint32{0x01c8312d, 0x027fe8e6, 0x03093832, 0x01dc128f, 0x0090c00c, 0x00c1a1bf, 0x018ba895, 0x02ead37a, 0x0188f179, 0x0029b312}}, Y: Field{[10]uint32{0x0170b6df, 0x03fd1d67, 0x01643712, 0x03bd3d84, 0x01bbba86, 0x004d191c, 0x03cad7c1, 0x0169e4a6, 0x00737db2, 0x003d3ae9}}}, + {X: Field{[10]uint32{0x00b84dbe, 0x0286b29c, 0x02f2400d, 0x020c4e4d, 0x039e6801, 0x03286af8, 0x03330776, 0x02355ecc, 0x00a8f577, 0x0003becd}}, Y: Field{[10]uint32{0x03428d3f, 0x00a61e1f, 0x025952f0, 0x0328526c, 0x027e5845, 0x019d4dae, 0x00878e71, 0x03ea60c8, 0x016efc53, 0x002a5288}}}, + {X: Field{[10]uint32{0x00dfa07a, 0x017ef5bf, 0x01a94a2c, 0x02e0fe91, 0x03019ec3, 0x021fee6a, 0x03914ef4, 0x039aeec8, 0x02d81385, 0x0004e611}}, Y: Field{[10]uint32{0x00fce099, 0x0132f1ab, 0x02aa09c3, 0x02cba325, 0x0362d837, 0x0237f682, 0x01f6aff2, 0x004336a6, 0x004e599b, 0x0013edf3}}}, + {X: Field{[10]uint32{0x01f2a101, 0x02336aeb, 0x01bb7a53, 0x00284ca6, 0x0249c209, 0x02d4fa98, 0x01f6eeaa, 0x0159ea0f, 0x03af98ba, 0x00198248}}, Y: Field{[10]uint32{0x0094bd29, 0x003c3623, 0x0078d446, 0x021a5c55, 0x00ee2a56, 0x0118bd10, 0x01890ee8, 0x025c89a6, 0x00cab1a2, 0x002ca2d6}}}, + {X: Field{[10]uint32{0x012be3c6, 0x000e243d, 0x01a98d3e, 0x03430772, 0x02d2f86b, 0x00698d16, 0x0389d31f, 0x005f78fc, 0x02b58c75, 0x003c6024}}, Y: Field{[10]uint32{0x00f9c906, 0x02a6bf5a, 0x006d07e8, 0x018ca8db, 0x00440ca7, 0x00ec0c87, 0x00276973, 0x013b5df7, 0x02049148, 0x002a0f9e}}}, + {X: Field{[10]uint32{0x01d0ab75, 0x03844e20, 0x03f74bfe, 0x019d9233, 0x017b7004, 0x02d7eca5, 0x026a6e25, 0x01503ce2, 0x020d1b2c, 0x003a342a}}, Y: Field{[10]uint32{0x0314409a, 0x02ee2af4, 0x016e9f19, 0x032ffaa9, 0x021abfc0, 0x022a0260, 0x00c3f298, 0x01706f43, 0x03be5205, 0x0028c932}}}, + {X: Field{[10]uint32{0x03526c1a, 0x00b7f11b, 0x025f3c7d, 0x00b540c0, 0x021d8ee7, 0x007dd18f, 0x01613df5, 0x001d0c3e, 0x00c0230a, 0x000961a8}}, Y: Field{[10]uint32{0x0016c735, 0x000eb026, 0x02653ede, 0x02891d01, 0x03ce9b1d, 0x02143d70, 0x007b4694, 0x011c350f, 0x01a1eb2b, 0x0028a5cd}}}, + {X: Field{[10]uint32{0x037dffd8, 0x032ad099, 0x00e48a12, 0x015390b0, 0x018be682, 0x0375f23d, 0x01bb2d27, 0x01b51b0c, 0x02888d82, 0x00085f3e}}, Y: Field{[10]uint32{0x001ac4ce, 0x025adab0, 0x031a006d, 0x015fd204, 0x0134179c, 0x02be477b, 0x01f99017, 0x03ec540d, 0x00309ff0, 0x00135767}}}, + {X: Field{[10]uint32{0x02edf4c0, 0x00e8d4c6, 0x03ccb820, 0x02fc4035, 0x03943af3, 0x00df3f59, 0x02791eb0, 0x00ee3e79, 0x013471aa, 0x0013a996}}, Y: Field{[10]uint32{0x00b7b4c5, 0x004a6121, 0x02ca506c, 0x00d3222f, 0x03ded8a5, 0x03257a65, 0x00474035, 0x000b1160, 0x02c419a3, 0x003fbb66}}}, + {X: Field{[10]uint32{0x00c7a1ae, 0x02b09346, 0x01f7d4fa, 0x03cb2591, 0x007d7759, 0x0125fbaf, 0x0122150c, 0x01aa93a9, 0x028b5102, 0x0025d2e0}}, Y: Field{[10]uint32{0x03aa9d26, 0x0063fb53, 0x0109396d, 0x000ff2c1, 0x0165cd3a, 0x02a07c98, 0x026f344c, 0x01ccd895, 0x01a0c308, 0x00300da7}}}, + {X: Field{[10]uint32{0x00978186, 0x031c25a7, 0x01755529, 0x0113b475, 0x0299bb45, 0x033d16cd, 0x01c8ae93, 0x035e9653, 0x0379d572, 0x00366056}}, Y: Field{[10]uint32{0x035241fa, 0x038d62b9, 0x013ecd67, 0x036193b5, 0x035b6c20, 0x0023e99f, 0x00ea24f5, 0x006552b1, 0x02cbf518, 0x0027f3ae}}}, + {X: Field{[10]uint32{0x00368837, 0x00acc3ae, 0x02d38efd, 0x02f7e7da, 0x01478208, 0x03596ab0, 0x01506f1b, 0x03539f2f, 0x01970d9b, 0x00149c49}}, Y: Field{[10]uint32{0x033df18e, 0x008c98a2, 0x01d79aef, 0x03044b5b, 0x0068bbf0, 0x014da004, 0x00911d16, 0x03b2b668, 0x0196ba2c, 0x0014bb2a}}}, + {X: Field{[10]uint32{0x009abf6d, 0x01577a11, 0x018186af, 0x0278ae2b, 0x00ed2fc8, 0x022a3d3a, 0x030e1fee, 0x03d7e7bd, 0x01afd890, 0x0036508c}}, Y: Field{[10]uint32{0x019e2867, 0x01195248, 0x01e27e06, 0x03d23343, 0x0384278f, 0x00b61972, 0x03475fc3, 0x0248609c, 0x036ef078, 0x0009964a}}}, + {X: Field{[10]uint32{0x019a7d90, 0x00a2936a, 0x034bfe53, 0x02c1c534, 0x02b661f7, 0x01d8fae6, 0x03a99d4b, 0x036558ec, 0x02317a69, 0x00192144}}, Y: Field{[10]uint32{0x01d46bc6, 0x024828d4, 0x02fb4af4, 0x02cde048, 0x021e06d3, 0x028fa485, 0x02020885, 0x01038dbe, 0x02335150, 0x003ac82e}}}, + {X: Field{[10]uint32{0x0368a8c2, 0x00e0473b, 0x0021779c, 0x037c3b80, 0x0370df9e, 0x03018959, 0x03413a5f, 0x00bc5e63, 0x011bef66, 0x0034292c}}, Y: Field{[10]uint32{0x0170b9cd, 0x00a7dd37, 0x00dbe8b3, 0x018ffd35, 0x03748b7a, 0x02ace7ba, 0x00ef5c99, 0x01a5170e, 0x012018e1, 0x00352ee6}}}, + {X: Field{[10]uint32{0x005802b6, 0x001fc1a6, 0x0249b3dc, 0x00dcef54, 0x01dcf546, 0x032f5dac, 0x03e103dd, 0x0121a07e, 0x0086c4b2, 0x0007626e}}, Y: Field{[10]uint32{0x0369535d, 0x0024e7d8, 0x01f3030d, 0x01150af3, 0x02a7885a, 0x00e9c31a, 0x036056ba, 0x00415df8, 0x00caaacd, 0x0028ce73}}}, + {X: Field{[10]uint32{0x00dbb256, 0x01d72cb9, 0x036c010a, 0x008efac2, 0x039dbab2, 0x00e2e82d, 0x036682fa, 0x010f93c4, 0x01d59363, 0x002db3b3}}, Y: Field{[10]uint32{0x019f7be8, 0x0236c0cc, 0x01d583ba, 0x00ba090b, 0x025f77d1, 0x03604d99, 0x01a5d1fe, 0x021e896f, 0x005387dd, 0x000a4d70}}}, + {X: Field{[10]uint32{0x032f8e24, 0x02ba942f, 0x002c4028, 0x0244261a, 0x0040f1b4, 0x03d6065a, 0x00a6c5fb, 0x03611cd7, 0x00e0a0ca, 0x00212c91}}, Y: Field{[10]uint32{0x021f7a71, 0x0226b221, 0x021bad82, 0x018b6837, 0x03148c8e, 0x038e9762, 0x0313087e, 0x002c47d5, 0x028c7df8, 0x0018b8a3}}}, + {X: Field{[10]uint32{0x00114d1a, 0x037db073, 0x036d1638, 0x01650ffa, 0x01664331, 0x038ddf10, 0x00366102, 0x0200a0e5, 0x00ff2a90, 0x003e57b3}}, Y: Field{[10]uint32{0x0158eba2, 0x00e34af9, 0x039ca7de, 0x020586d3, 0x0256d16e, 0x022615bb, 0x011b9ea1, 0x001b36e3, 0x003f1a03, 0x002f436a}}}, + {X: Field{[10]uint32{0x010f55e3, 0x03bcc874, 0x0132727f, 0x00d79043, 0x032a1e63, 0x0268b748, 0x02ccd255, 0x00f792bc, 0x01fd3e61, 0x001f133b}}, Y: Field{[10]uint32{0x03d7b1d8, 0x030893b9, 0x026960cd, 0x01f504c1, 0x0111d482, 0x01ca9983, 0x017f73c6, 0x0014db1a, 0x0109d9d0, 0x000cc7c8}}}, + {X: Field{[10]uint32{0x00269713, 0x03dc80e8, 0x021c34b9, 0x019bb4c6, 0x02f88af8, 0x010d789d, 0x03918de0, 0x0360a792, 0x02381bf2, 0x0008d70b}}, Y: Field{[10]uint32{0x00dbf929, 0x00413be8, 0x03d0ff26, 0x00111803, 0x02815a13, 0x013aaa1e, 0x00486144, 0x0024bb9f, 0x030d2671, 0x00143737}}}, + {X: Field{[10]uint32{0x0207cd73, 0x00a1a0fa, 0x02923761, 0x021b1777, 0x000cdf26, 0x007128e2, 0x03ca488d, 0x0025d545, 0x00d09ab5, 0x000aa587}}, Y: Field{[10]uint32{0x0398abe5, 0x024efa48, 0x0152dd7f, 0x00bbb75d, 0x0384f84c, 0x01d951c8, 0x000f7fde, 0x011b48f3, 0x0076b2ee, 0x00217244}}}, + {X: Field{[10]uint32{0x00fd65e3, 0x023d0393, 0x01b51a62, 0x01d424f4, 0x03e00c47, 0x02fc60fd, 0x013f591c, 0x02e32e1c, 0x0091f0af, 0x002562f1}}, Y: Field{[10]uint32{0x009a65b3, 0x01431a82, 0x02eef92d, 0x01eaba3d, 0x01b2a09a, 0x03c1d868, 0x013e026a, 0x037f9244, 0x0339fa21, 0x002fd6f8}}}, + {X: Field{[10]uint32{0x015f78fd, 0x0196f60f, 0x0273ddc8, 0x03319093, 0x030adb5c, 0x01adfa54, 0x035a2e24, 0x01eafe67, 0x00a37b5b, 0x001ba583}}, Y: Field{[10]uint32{0x025e0e15, 0x0166cd5a, 0x01a81bd6, 0x02ca7335, 0x00dcc4b0, 0x0285bf32, 0x02df612e, 0x0190fd7c, 0x03d1d5e9, 0x0014eb52}}}, + {X: Field{[10]uint32{0x00d05871, 0x03b3a3fc, 0x01b5a8b2, 0x029e9237, 0x00e747e4, 0x036475aa, 0x01615257, 0x02eeb776, 0x020e9272, 0x0035eb24}}, Y: Field{[10]uint32{0x00c87ed8, 0x019b893c, 0x02dc4adf, 0x008186d9, 0x039d4c76, 0x00302630, 0x000b96d0, 0x02b178e3, 0x01fcc37b, 0x0018e06e}}}, + {X: Field{[10]uint32{0x01730609, 0x00754c57, 0x00078b6c, 0x00bfcb67, 0x024481c1, 0x02fa506b, 0x0123844e, 0x015c1bb0, 0x003b1de9, 0x00026c20}}, Y: Field{[10]uint32{0x033fb1b0, 0x00258a9a, 0x03ef2f5f, 0x02ec4f30, 0x005a5ff0, 0x0392e007, 0x002ed01f, 0x03f7f3ab, 0x03d6b12a, 0x0005833c}}}, + {X: Field{[10]uint32{0x00c5fd88, 0x0154ef29, 0x033ea689, 0x0027c08b, 0x02991bd5, 0x02e81085, 0x00e0153a, 0x03801a77, 0x006e5b74, 0x0017541d}}, Y: Field{[10]uint32{0x03259ff8, 0x018462da, 0x00e58927, 0x01bedbb4, 0x0299cb33, 0x00a724ad, 0x03a2e484, 0x012c6ef6, 0x005fd2a1, 0x002c3ec8}}}, + {X: Field{[10]uint32{0x00be04ff, 0x0006a17f, 0x02cf0bbd, 0x02af1a1b, 0x01ef4483, 0x0180230b, 0x03087483, 0x018a7249, 0x0269fa27, 0x00386f09}}, Y: Field{[10]uint32{0x00d95ecf, 0x0027e103, 0x00e783d4, 0x0124efb6, 0x0315e8b1, 0x02ce86ca, 0x033fd435, 0x00248585, 0x0371083c, 0x001bedeb}}}, + {X: Field{[10]uint32{0x00bfbf78, 0x003732f6, 0x017a2fe9, 0x00833dc0, 0x02f36ac6, 0x037e873c, 0x00519797, 0x024f6d03, 0x001cb5a8, 0x0033f242}}, Y: Field{[10]uint32{0x02a69ac2, 0x00a6b9a5, 0x01659b5f, 0x00695713, 0x00db321d, 0x026fe05f, 0x0377c15a, 0x00bf0cbc, 0x01235077, 0x0009aa23}}}, + {X: Field{[10]uint32{0x0229bb9b, 0x03677d08, 0x014b05fa, 0x01621163, 0x00cd8ad1, 0x0263b5e3, 0x021246db, 0x01a314e5, 0x009d12bd, 0x00015367}}, Y: Field{[10]uint32{0x021cbff6, 0x01275db7, 0x025eba45, 0x00161248, 0x00f8de70, 0x034cf5f5, 0x00c961fe, 0x0089658c, 0x00311dec, 0x002d7a5f}}}, + {X: Field{[10]uint32{0x03057dff, 0x02d694d0, 0x002e8d64, 0x02a987f9, 0x02bfb11e, 0x01cd71ec, 0x00f19248, 0x01986740, 0x02e67e9d, 0x0022a453}}, Y: Field{[10]uint32{0x03c040c8, 0x0046b0c6, 0x01b05a63, 0x011a8bd6, 0x0199c518, 0x00a9be94, 0x002f018c, 0x0369262f, 0x01da3374, 0x0006e478}}}, + {X: Field{[10]uint32{0x00240522, 0x02c16574, 0x03b030a0, 0x010bef48, 0x00aa2f4c, 0x026ac2ae, 0x0304fbae, 0x0077eaf1, 0x01773e64, 0x00352e04}}, Y: Field{[10]uint32{0x025cc726, 0x03ef8159, 0x007b8ce6, 0x00d405c4, 0x01cf2e68, 0x003d037c, 0x01bd3642, 0x02853d29, 0x023b1ea4, 0x002b0c33}}}, + {X: Field{[10]uint32{0x00780ba9, 0x00999c05, 0x02004362, 0x00b9cb83, 0x006f3c8e, 0x024927d9, 0x002c3517, 0x00d5f2ee, 0x0387c232, 0x002e0429}}, Y: Field{[10]uint32{0x018319e2, 0x036eec05, 0x02ef76a2, 0x00c3c6de, 0x034a422c, 0x02af2119, 0x02bac769, 0x0375fc85, 0x00341078, 0x00150d90}}}, + {X: Field{[10]uint32{0x0134a833, 0x01cb4ffd, 0x00e0d14e, 0x00b63b1f, 0x00d29c76, 0x00e9fbb4, 0x01691eac, 0x023bdc6b, 0x00cedc73, 0x0035c7e2}}, Y: Field{[10]uint32{0x00fbcd99, 0x0139c583, 0x02ad9d2a, 0x0052570e, 0x0197c1b5, 0x02d31449, 0x019d0d97, 0x02b6ba8b, 0x02831aaa, 0x00291f33}}}, + {X: Field{[10]uint32{0x01147ffc, 0x02675c5b, 0x0217496c, 0x00b331b1, 0x011ad709, 0x018b3978, 0x01d9d896, 0x018a384e, 0x031d4cac, 0x0005c33c}}, Y: Field{[10]uint32{0x006d77a5, 0x02977b33, 0x013a46f9, 0x03b9a549, 0x01adf6c4, 0x0377cc46, 0x01e8baaa, 0x03d61405, 0x0094e741, 0x0013ecee}}}, + {X: Field{[10]uint32{0x00c316af, 0x0269913b, 0x034d3172, 0x01250216, 0x03bfd48d, 0x032e6956, 0x00cbf66e, 0x017a00e3, 0x02a3b127, 0x00239da4}}, Y: Field{[10]uint32{0x00c504b1, 0x02ad501a, 0x0241134c, 0x029ae291, 0x024fc0bf, 0x0399aa46, 0x0100665c, 0x01497899, 0x01d3af07, 0x003cce70}}}, + {X: Field{[10]uint32{0x02ca891a, 0x032fbe92, 0x00d40a27, 0x01a79da1, 0x02a07ca8, 0x038addf3, 0x0047002e, 0x017a04cb, 0x03383dda, 0x001747fc}}, Y: Field{[10]uint32{0x035fbb8b, 0x0246006f, 0x039cf5b0, 0x00ce34a5, 0x02fe8438, 0x01d31145, 0x032e62e0, 0x032f6d9d, 0x03acb0de, 0x00286b6c}}}, + {X: Field{[10]uint32{0x002b8af7, 0x03fdbb0f, 0x003ebd75, 0x01717d50, 0x00375e1c, 0x00deb556, 0x032605da, 0x0319af77, 0x03dda9de, 0x003559b3}}, Y: Field{[10]uint32{0x019c78bd, 0x02b78398, 0x01ed8427, 0x035efedd, 0x00b6007b, 0x016a4293, 0x01598bb2, 0x01b6a5d0, 0x032c7858, 0x0004f888}}}, + {X: Field{[10]uint32{0x03d96493, 0x0265f40b, 0x01e33764, 0x03389271, 0x033cb85b, 0x02e7b8f6, 0x01ae74b2, 0x00ebc666, 0x00f9cc71, 0x0032f5c2}}, Y: Field{[10]uint32{0x004cb2cb, 0x03e499da, 0x026d655c, 0x02fdae01, 0x01c264f4, 0x02276376, 0x037a5af8, 0x02c2e24c, 0x016c4ca9, 0x003c0687}}}, + {X: Field{[10]uint32{0x00ed0fe2, 0x02d6e8fc, 0x013f4ad4, 0x02e3e241, 0x03e8d049, 0x014e003c, 0x020bea21, 0x01cf2208, 0x00e4e8ac, 0x003fb87b}}, Y: Field{[10]uint32{0x0226aad6, 0x015a8bba, 0x0154f53d, 0x02c2f6c2, 0x02f9763d, 0x033d0bda, 0x013354a7, 0x0019028d, 0x00ea17c8, 0x0026d482}}}, + {X: Field{[10]uint32{0x02ee843f, 0x0122f251, 0x01dbb79c, 0x00cc5305, 0x01db916f, 0x032cd6a3, 0x03a6c3af, 0x01214e35, 0x0266de44, 0x0031aabe}}, Y: Field{[10]uint32{0x01505b1b, 0x02bceff4, 0x01bfa7cd, 0x016cc2c4, 0x0234c49d, 0x029b893e, 0x001a7617, 0x0243def2, 0x02b67fc5, 0x00229871}}}, + {X: Field{[10]uint32{0x01aac415, 0x0199e076, 0x02f1e0a8, 0x03ffc017, 0x02dcbe21, 0x0199aef3, 0x018551e7, 0x007df922, 0x016083d9, 0x002b0d45}}, Y: Field{[10]uint32{0x0334483d, 0x01f59804, 0x014945ac, 0x002e369b, 0x03557741, 0x03bb2289, 0x00318fbe, 0x026beca3, 0x01977710, 0x0035c276}}}, + {X: Field{[10]uint32{0x01914e18, 0x01a3dc8f, 0x02ef9219, 0x00d25419, 0x017a212e, 0x00eb013d, 0x0055d199, 0x0092d205, 0x021607c0, 0x002a2709}}, Y: Field{[10]uint32{0x03a3c1ab, 0x00867b84, 0x02199ac8, 0x01a10cf7, 0x013569ce, 0x03b636ac, 0x01f092f5, 0x0219b1df, 0x02626127, 0x0015474d}}}, + {X: Field{[10]uint32{0x00a3f06b, 0x02202347, 0x02a3a72e, 0x016bf491, 0x02b045b9, 0x03ee458b, 0x00018d8c, 0x0267aba5, 0x031db584, 0x00265460}}, Y: Field{[10]uint32{0x01e4d773, 0x021ec5b6, 0x01188fd4, 0x02856c34, 0x0081696e, 0x02ce1202, 0x0027146f, 0x03e19f56, 0x02ecb9d5, 0x003f8e6b}}}, + {X: Field{[10]uint32{0x001fba96, 0x009a489a, 0x02e8c78d, 0x03a4df34, 0x028615e2, 0x007b3af1, 0x01be26c6, 0x01111e55, 0x03e01456, 0x002dc785}}, Y: Field{[10]uint32{0x03b9e3bf, 0x007142d8, 0x03dc4301, 0x02a7324a, 0x031a6c5b, 0x03bfa554, 0x023cb224, 0x02e32e57, 0x01f1d21f, 0x003af3f7}}}, + {X: Field{[10]uint32{0x01914074, 0x020fff05, 0x002c22d6, 0x03b5399d, 0x032fe89f, 0x030f52f2, 0x020ef6a1, 0x027fdb51, 0x001edbdd, 0x00385c3e}}, Y: Field{[10]uint32{0x0396e67f, 0x019f9caa, 0x014d2d6f, 0x03af1f7c, 0x03801fa7, 0x03dbe72b, 0x02206e3d, 0x0072b233, 0x00ee0f97, 0x0024fc44}}}, + {X: Field{[10]uint32{0x02c104f2, 0x01757207, 0x00c73acf, 0x02291f73, 0x014ac8dd, 0x007eaeec, 0x00f04eda, 0x0017157b, 0x0147318d, 0x0010c695}}, Y: Field{[10]uint32{0x03a779e7, 0x0022fcaf, 0x00dea6fd, 0x01c1d72a, 0x027a6f1f, 0x01f2a09e, 0x03a1f045, 0x0068d92b, 0x00ad7b14, 0x000f8c62}}}, + {X: Field{[10]uint32{0x02203394, 0x03ffb098, 0x01eec383, 0x0245fc2d, 0x013c1932, 0x007e032c, 0x0226ce4a, 0x01d48caf, 0x026ee158, 0x000a679a}}, Y: Field{[10]uint32{0x01301575, 0x00a9df81, 0x010c93bb, 0x0393b4de, 0x0123c9b3, 0x03002815, 0x008e8bf4, 0x028846ff, 0x00ed3ad4, 0x00176edc}}}, + {X: Field{[10]uint32{0x038934ee, 0x01e32730, 0x0359fb09, 0x026fa80a, 0x01bc99ac, 0x0079fe09, 0x03b5f786, 0x0221a6cb, 0x008ff2b5, 0x0019b6d2}}, Y: Field{[10]uint32{0x00ae6a5f, 0x01adcc3a, 0x0017fc31, 0x03bfac52, 0x006040e7, 0x03da19b1, 0x010e9972, 0x020fe02c, 0x0112b51c, 0x002addb8}}}, + {X: Field{[10]uint32{0x02274932, 0x02091f49, 0x002a1c3c, 0x02d7fb50, 0x0054c812, 0x022b56dc, 0x03912fa7, 0x00354aec, 0x016b6698, 0x00049661}}, Y: Field{[10]uint32{0x02150383, 0x011631fc, 0x03c2245d, 0x02ee1c31, 0x02d70dfc, 0x015a06f0, 0x03e0557d, 0x02571fb7, 0x013fc678, 0x003ab5f3}}}, + {X: Field{[10]uint32{0x01f1cf00, 0x01d177ff, 0x02cf9102, 0x0233bfaf, 0x00426996, 0x03494b1f, 0x025272fd, 0x03cf732a, 0x0214cbb0, 0x00140b21}}, Y: Field{[10]uint32{0x03c53c3c, 0x0242654e, 0x0154c10b, 0x0001921c, 0x001b2f45, 0x01abc28e, 0x01d06951, 0x038d5bf6, 0x028807e4, 0x001c46f1}}}, + {X: Field{[10]uint32{0x02a8d6fd, 0x026f31c2, 0x00c42224, 0x03b05f00, 0x01f43acd, 0x01edadff, 0x01c10734, 0x01900fda, 0x013c323c, 0x00381446}}, Y: Field{[10]uint32{0x02560455, 0x0045f8e2, 0x039f1c85, 0x02c61fe2, 0x00c574d9, 0x0097098c, 0x011d2bcf, 0x023b985b, 0x0271ce42, 0x000840b0}}}, + {X: Field{[10]uint32{0x01f1dc46, 0x0381d06b, 0x02cb800a, 0x0162d4e2, 0x030abe7c, 0x030ecdf9, 0x03d90c15, 0x0234c8a7, 0x03ae0d76, 0x0032461e}}, Y: Field{[10]uint32{0x01c92c0f, 0x011ccd62, 0x000f8d75, 0x0373c9ff, 0x015714f6, 0x0056b0a7, 0x03d02526, 0x02e92865, 0x0043f9eb, 0x00304c35}}}, + {X: Field{[10]uint32{0x010fe897, 0x03b2367a, 0x017a16ea, 0x03513a0a, 0x0123dba4, 0x031ac190, 0x003ae701, 0x02cfb8ac, 0x027eb9f3, 0x0016c215}}, Y: Field{[10]uint32{0x010c27c9, 0x006a61ea, 0x02d92aa8, 0x012dd43f, 0x03914d4b, 0x03a3d32e, 0x02e9c726, 0x03246b37, 0x00159079, 0x002b41c7}}}, + {X: Field{[10]uint32{0x003ba7cc, 0x03d2946d, 0x0286f839, 0x015343aa, 0x038a9cc5, 0x0189a46a, 0x0306a26d, 0x01ea1b3e, 0x008ac581, 0x002b96d9}}, Y: Field{[10]uint32{0x032db311, 0x03a49750, 0x019830d5, 0x004a9bfa, 0x0166e752, 0x0285f18a, 0x00a48c3d, 0x0308aaac, 0x030db665, 0x0007aa2a}}}, + {X: Field{[10]uint32{0x010178d2, 0x00085222, 0x038f0421, 0x034c9f95, 0x0004f2e0, 0x03326aed, 0x02ea5c5c, 0x0215b663, 0x00d0a092, 0x000ee6eb}}, Y: Field{[10]uint32{0x01bd5052, 0x031977c8, 0x024911fd, 0x011fc606, 0x00b79be4, 0x02a4a6b8, 0x03628d7e, 0x02e8715e, 0x008e9603, 0x002da07a}}}, + {X: Field{[10]uint32{0x0259fef4, 0x0016a191, 0x02d7ee8d, 0x01e8707d, 0x03f6dfbf, 0x0179056a, 0x022f8279, 0x019b6b54, 0x0180a740, 0x0014937d}}, Y: Field{[10]uint32{0x0252f35f, 0x02ae9c89, 0x039c1ed2, 0x03e78d62, 0x019c72c5, 0x034c0bbc, 0x03c210ca, 0x0307869b, 0x03285f3b, 0x000feb31}}}, + {X: Field{[10]uint32{0x010e4363, 0x034c2751, 0x00cdff6e, 0x03a9ff1c, 0x01599a34, 0x01202e1d, 0x0109a383, 0x01d7121f, 0x03f2ade7, 0x000b818d}}, Y: Field{[10]uint32{0x0364738e, 0x0228283d, 0x023696da, 0x03bab69c, 0x031aafb7, 0x012b557c, 0x038e903e, 0x01392731, 0x03087e2f, 0x0038f1ba}}}, + {X: Field{[10]uint32{0x020cc483, 0x0184c2ea, 0x0364bbda, 0x00a089bd, 0x033f7857, 0x021ee509, 0x013fb335, 0x02f4ef90, 0x02adbeaf, 0x003dffb1}}, Y: Field{[10]uint32{0x0208c68d, 0x014c7467, 0x00544c66, 0x00eb967f, 0x03dd4209, 0x018ee5da, 0x00fefd8e, 0x015f1ff2, 0x01748eb4, 0x003d91aa}}}, + {X: Field{[10]uint32{0x023608be, 0x0362f122, 0x0229929a, 0x025d3609, 0x00cd6eb4, 0x03624b72, 0x02c95b12, 0x01310cad, 0x00e06af6, 0x001d7e53}}, Y: Field{[10]uint32{0x01958a29, 0x0221deec, 0x026c622e, 0x0248b1ef, 0x026e32c8, 0x007b001d, 0x0316b322, 0x0241a9a4, 0x02d0a2b7, 0x002fe1c5}}}, + {X: Field{[10]uint32{0x03fb4d85, 0x0370733c, 0x0104331b, 0x03a74c04, 0x00f62e07, 0x0321a424, 0x00f039fc, 0x03cf2c31, 0x02de5e0d, 0x001040a5}}, Y: Field{[10]uint32{0x03fecfa0, 0x03dcbb4f, 0x0396c383, 0x01ff2187, 0x02da7426, 0x018996e0, 0x00a82ff8, 0x03765aae, 0x039ca314, 0x003a58d5}}}, + {X: Field{[10]uint32{0x033ffa05, 0x03ff8035, 0x03b23cbd, 0x02605b3e, 0x0369b4e6, 0x025f699e, 0x03c1703d, 0x0385acbd, 0x02ac05f5, 0x00332093}}, Y: Field{[10]uint32{0x013e8abb, 0x03c428cd, 0x02aa8b8c, 0x006a4abe, 0x03d18c6f, 0x01f1e203, 0x00582182, 0x013be577, 0x01a69f41, 0x0005f0c3}}}, + {X: Field{[10]uint32{0x026e5820, 0x03fc44df, 0x00d03a83, 0x0193e976, 0x03d2074b, 0x00c5dc1d, 0x00f0b3fd, 0x03b6335e, 0x00ef4d26, 0x002b306c}}, Y: Field{[10]uint32{0x003ce6c3, 0x01432367, 0x04000111, 0x03405a79, 0x014fcd24, 0x03e3efbb, 0x01d2a804, 0x02ba4406, 0x00c68519, 0x001b3391}}}, + {X: Field{[10]uint32{0x010da922, 0x03f1c6f2, 0x038257c2, 0x0238c61d, 0x01583c2b, 0x00c62e48, 0x034bccf4, 0x00766c1d, 0x036eccce, 0x00072cc1}}, Y: Field{[10]uint32{0x00e373cc, 0x021d2393, 0x03b04c62, 0x03cb3c96, 0x02a6372d, 0x03b37168, 0x0217dfd3, 0x0181760a, 0x036c0058, 0x000a8bc9}}}, + {X: Field{[10]uint32{0x00fe13f2, 0x02096aa1, 0x039783d5, 0x0085e8e2, 0x008cb3a5, 0x02796900, 0x03ea9750, 0x03d26d61, 0x00512a22, 0x001bbf69}}, Y: Field{[10]uint32{0x038e2424, 0x0251d621, 0x0103954a, 0x03f6f2f5, 0x0360673c, 0x03968a96, 0x032a54ad, 0x00becc7f, 0x02d56dfe, 0x00047513}}}, + {X: Field{[10]uint32{0x01bf0858, 0x00c30ee7, 0x01cdd51b, 0x03345f7a, 0x02e2fcf1, 0x02a3f665, 0x00931ecd, 0x00de2d73, 0x0219aef4, 0x0011fda5}}, Y: Field{[10]uint32{0x00b5e274, 0x0242251f, 0x03ee9bf8, 0x022b0cea, 0x020d2fa2, 0x0135c359, 0x0057af2a, 0x038f5b69, 0x02a19776, 0x00052555}}}, + {X: Field{[10]uint32{0x014d28e4, 0x0120cd5e, 0x00d4f8ff, 0x02f0691f, 0x028b2eae, 0x00e86789, 0x01032c51, 0x0375754e, 0x021e97f5, 0x00374f63}}, Y: Field{[10]uint32{0x00467e83, 0x03e7aa93, 0x029c2e0f, 0x02ec0d2f, 0x030c2233, 0x020bafcc, 0x033d7c63, 0x02a0eaa5, 0x000020f6, 0x001e5a2f}}}, + {X: Field{[10]uint32{0x01e16d78, 0x02b4ad99, 0x01f9197a, 0x02dd414d, 0x027de2a2, 0x00f2d2cc, 0x015737cd, 0x00e9b2f9, 0x00eea19d, 0x000af515}}, Y: Field{[10]uint32{0x029f7f99, 0x03c7f5c4, 0x037549c1, 0x01221f8f, 0x039f7c62, 0x02b503fa, 0x0271c667, 0x009e3cd0, 0x00f0d6a1, 0x00029c2c}}}, + {X: Field{[10]uint32{0x035a5ee0, 0x00cc6103, 0x02d91047, 0x037c4eb0, 0x02915462, 0x02899e13, 0x02035b29, 0x01d2d136, 0x01bb2a7e, 0x00233f9d}}, Y: Field{[10]uint32{0x0207cd1e, 0x03cb8919, 0x01ca1eef, 0x0289ff6b, 0x00b65c2d, 0x02491550, 0x02226d1c, 0x01f2193d, 0x0056bdc8, 0x001923ff}}}, + {X: Field{[10]uint32{0x01724d36, 0x02cc9559, 0x02f6e665, 0x01a13c44, 0x005e046a, 0x012d5ef2, 0x03dab832, 0x018b2f0b, 0x00ae19c4, 0x0017bfcd}}, Y: Field{[10]uint32{0x004d68a4, 0x03378568, 0x026b0ccf, 0x020d1f1a, 0x01d551e7, 0x00b80414, 0x0289629d, 0x011fff08, 0x01bb9db3, 0x000663ed}}}, + {X: Field{[10]uint32{0x00f92b91, 0x0198e7de, 0x02a61042, 0x02e07c62, 0x00a2c51b, 0x01d8c5dd, 0x02db6244, 0x00ec238d, 0x0154f367, 0x0026a951}}, Y: Field{[10]uint32{0x01384806, 0x0235e118, 0x006fa75c, 0x01197c97, 0x011d167b, 0x01cad42f, 0x0222faf2, 0x01d0134b, 0x03ad4a6e, 0x0021d128}}}, + {X: Field{[10]uint32{0x03f259e0, 0x032d4e97, 0x0165a955, 0x02a2e75d, 0x03ac88a2, 0x037c1bae, 0x007463c5, 0x0165c37f, 0x01758cfb, 0x0012e0dd}}, Y: Field{[10]uint32{0x028df208, 0x0069793e, 0x02aa9917, 0x01aaadea, 0x02ed7076, 0x0048cf7d, 0x0074396a, 0x0294fdb9, 0x0142bda1, 0x0021d647}}}, + {X: Field{[10]uint32{0x02428bb1, 0x03317bdd, 0x00428226, 0x009615cd, 0x03c49dc7, 0x01671f3b, 0x03f5a579, 0x03e4399c, 0x00b49134, 0x001752dd}}, Y: Field{[10]uint32{0x02d89425, 0x001e83ef, 0x03cfcb1f, 0x02efc670, 0x00cdc2f6, 0x00036368, 0x026bf3f1, 0x03b856af, 0x0110f466, 0x0006caa2}}}, + {X: Field{[10]uint32{0x03cad2d8, 0x00a8c255, 0x002b2570, 0x0105eae7, 0x002d4754, 0x018bb9a0, 0x013bafaf, 0x01133976, 0x02c0c552, 0x003542f8}}, Y: Field{[10]uint32{0x0162f583, 0x00735700, 0x0144ef24, 0x03c82f11, 0x005a4dc0, 0x03aa9779, 0x01854617, 0x026ad300, 0x024c6ee8, 0x003f881f}}}, + {X: Field{[10]uint32{0x0075bff1, 0x0280d384, 0x032e9a1d, 0x03c505b6, 0x02f93bbf, 0x02fe616a, 0x02489155, 0x02ce1193, 0x01ce8e0e, 0x002ec3d8}}, Y: Field{[10]uint32{0x037b7d0e, 0x03dbefed, 0x00412631, 0x0184c51d, 0x034e6b05, 0x02f2c23b, 0x02a1032c, 0x02c37cc3, 0x03152dde, 0x000004e9}}}, + {X: Field{[10]uint32{0x01dcb2f5, 0x00cafe13, 0x03d22886, 0x02785366, 0x0263e22b, 0x00bf17be, 0x00e41fb2, 0x0006c85c, 0x01db473f, 0x000f39af}}, Y: Field{[10]uint32{0x00e0922e, 0x01e896ab, 0x01edf8d4, 0x023c6eb0, 0x029a8426, 0x0043714b, 0x02b73081, 0x034a6109, 0x0057f4b3, 0x0010c218}}}, + {X: Field{[10]uint32{0x038f81aa, 0x01d182ec, 0x03c85bd3, 0x03c695b0, 0x02bbcbbf, 0x01f36dd7, 0x00b5490c, 0x0202ff24, 0x014aef16, 0x003ff7ec}}, Y: Field{[10]uint32{0x02f4af0d, 0x005bb87a, 0x00a547c2, 0x031ceef3, 0x0124f228, 0x02522d69, 0x02880d0e, 0x03c6788c, 0x01ef02f1, 0x003cc117}}}, + {X: Field{[10]uint32{0x0223172c, 0x03e93020, 0x000fed59, 0x000941eb, 0x02c828d1, 0x008cc2bb, 0x026eb60a, 0x00993604, 0x02e19ab4, 0x0006b07c}}, Y: Field{[10]uint32{0x00e18bf8, 0x03c64db6, 0x027f5133, 0x018e06d3, 0x02d8fae0, 0x020363c0, 0x015e3a8f, 0x021abec8, 0x00bc3394, 0x001d8da9}}}, + {X: Field{[10]uint32{0x01ec228e, 0x01987b2b, 0x009a22d6, 0x02d81f9b, 0x01b1a1a6, 0x0083c8ce, 0x002957aa, 0x03a26985, 0x000a0740, 0x001494d3}}, Y: Field{[10]uint32{0x0261b669, 0x02a5f3cc, 0x022f1365, 0x00d6ba00, 0x02e1a318, 0x02213ebe, 0x02c2fa5d, 0x03226707, 0x02bafe41, 0x0033dbf9}}}, + {X: Field{[10]uint32{0x011b09eb, 0x03d91899, 0x0278d5b9, 0x00b25928, 0x0104f36f, 0x00df4cac, 0x00dccd61, 0x00b0b1e3, 0x02857cd2, 0x00102480}}, Y: Field{[10]uint32{0x01031d0d, 0x0384b10b, 0x025fb3bd, 0x023ae2a1, 0x01f6b773, 0x013c5824, 0x01fef1bf, 0x00f8fd9b, 0x0373a5fa, 0x00103253}}}, + {X: Field{[10]uint32{0x03029289, 0x006f1466, 0x019e70c8, 0x030901a7, 0x0225a5b3, 0x021036c5, 0x02ac6e4e, 0x0336c852, 0x00334b9c, 0x0022c74f}}, Y: Field{[10]uint32{0x0223e853, 0x035b6d57, 0x006e5630, 0x027c517e, 0x03802076, 0x01e0889d, 0x01658985, 0x0256647f, 0x00642acf, 0x000453f5}}}, + {X: Field{[10]uint32{0x00a242bd, 0x01ce5e7d, 0x020fd7e4, 0x0398f4d1, 0x008a6055, 0x019058b7, 0x006bbd20, 0x03c4e967, 0x0260b7c7, 0x002b8537}}, Y: Field{[10]uint32{0x0065a412, 0x031a8f93, 0x00ef16ca, 0x039ebe80, 0x03afccfe, 0x01dbc844, 0x00463e23, 0x028cce85, 0x0089cdb5, 0x0022e581}}}, + {X: Field{[10]uint32{0x02d3e3d7, 0x020e1b8b, 0x02420078, 0x01204df7, 0x03b81539, 0x037f76eb, 0x00d4e395, 0x0179b0fa, 0x004099c9, 0x003cdfc7}}, Y: Field{[10]uint32{0x03fb3606, 0x003028ec, 0x01af5031, 0x004413d4, 0x030a5644, 0x033dd95d, 0x0283d769, 0x02b4d2c8, 0x008082f6, 0x0007ca40}}}, + {X: Field{[10]uint32{0x03017a84, 0x00fb2c86, 0x005dfaa5, 0x00cd99b4, 0x00a13f89, 0x030925af, 0x0041c1d3, 0x022270d1, 0x03ae9636, 0x0007ec1f}}, Y: Field{[10]uint32{0x037753c0, 0x03e32718, 0x03cb7b8d, 0x011bea5f, 0x0358e6da, 0x01ffd546, 0x0368934b, 0x015dab12, 0x01c93931, 0x0004a062}}}, + {X: Field{[10]uint32{0x0015f3cc, 0x0365ca12, 0x0371552b, 0x0087435a, 0x032afb07, 0x02e88ae9, 0x00ea2b51, 0x03b3b520, 0x0354e112, 0x0011347a}}, Y: Field{[10]uint32{0x02ed7043, 0x02a6cabc, 0x0288e3c3, 0x02df56db, 0x02ea1855, 0x035e4e3e, 0x0273e02e, 0x0149bc49, 0x0328574c, 0x0029b84e}}}, + {X: Field{[10]uint32{0x0103238e, 0x02559168, 0x03cbfd87, 0x0229d669, 0x00ec9491, 0x01dbdef4, 0x02311cff, 0x02e1d5ff, 0x032e5732, 0x001a6025}}, Y: Field{[10]uint32{0x03d26a5e, 0x03ac18d8, 0x03c262d2, 0x03385f16, 0x02ac4a0f, 0x024be826, 0x0376b24a, 0x02450c85, 0x00324ffb, 0x001ee7fa}}}, + {X: Field{[10]uint32{0x00efcfa3, 0x00c09554, 0x0379bf70, 0x018a7616, 0x01a8566a, 0x03d901a8, 0x019639c4, 0x02c79379, 0x009d405b, 0x001a8ea3}}, Y: Field{[10]uint32{0x02c038ba, 0x023799b2, 0x0124d0ce, 0x03ae7546, 0x002e0f59, 0x025ad1e9, 0x01b408e1, 0x03412a3f, 0x02e87b22, 0x000fa2ae}}}, + {X: Field{[10]uint32{0x0012ed0b, 0x00e42d91, 0x036831da, 0x013251b0, 0x03bfb680, 0x02f3e809, 0x01844c4d, 0x01192afd, 0x00d41598, 0x003fcc42}}, Y: Field{[10]uint32{0x03d0a317, 0x01cb51f2, 0x03515dc0, 0x03408672, 0x0011f5d4, 0x01c15192, 0x02abe857, 0x03422571, 0x01e33ee1, 0x00201559}}}, + {X: Field{[10]uint32{0x01517d73, 0x024c93a5, 0x011bb213, 0x01406012, 0x03499727, 0x00d772d6, 0x0134e533, 0x0126acf8, 0x036a2f85, 0x0003b93d}}, Y: Field{[10]uint32{0x0071a838, 0x0204125c, 0x0075c8fe, 0x01f628a4, 0x03830736, 0x032509d9, 0x0189e899, 0x00ac45a2, 0x01672240, 0x001af640}}}, + {X: Field{[10]uint32{0x0053e0a4, 0x023d4693, 0x01966ac7, 0x00163342, 0x00230c63, 0x032eae83, 0x023b7205, 0x02563cda, 0x01cb01ca, 0x0030845d}}, Y: Field{[10]uint32{0x0072bf51, 0x008da233, 0x02a44ea9, 0x03acbff9, 0x01585a02, 0x03021760, 0x02a0ecd2, 0x0282bc95, 0x03a67a7c, 0x001a8860}}}, + {X: Field{[10]uint32{0x0237d6fc, 0x0272fce6, 0x01292c40, 0x030317cb, 0x03953141, 0x01f2ae46, 0x0246e39e, 0x02ce60d3, 0x0008a9a0, 0x000b5793}}, Y: Field{[10]uint32{0x01c6e15e, 0x0190119d, 0x03054d61, 0x0087713b, 0x004b5127, 0x024017b4, 0x0234f37e, 0x00c7e824, 0x01c531a3, 0x001d5a6e}}}, + {X: Field{[10]uint32{0x0315dbc3, 0x030a932e, 0x01c26ef7, 0x019dade6, 0x015d573b, 0x00c5d97c, 0x00124086, 0x03ac2730, 0x0041bfbb, 0x0018c0b0}}, Y: Field{[10]uint32{0x02491025, 0x02bc209f, 0x0063f915, 0x02201279, 0x01a1e514, 0x0024cba4, 0x00ddfedd, 0x010a82b1, 0x020f67ce, 0x000caa3c}}}, + {X: Field{[10]uint32{0x01934e2d, 0x00d98481, 0x0308ca3b, 0x0330b7aa, 0x005b6c67, 0x027be6e5, 0x01c9cfb8, 0x03823bdf, 0x016c198d, 0x000f9854}}, Y: Field{[10]uint32{0x037520d9, 0x01b818c0, 0x00dbee95, 0x03b41239, 0x005692f3, 0x003d89e1, 0x03849447, 0x01c413dd, 0x03f74d5f, 0x0007bfee}}}, + {X: Field{[10]uint32{0x0142fe30, 0x02ac2bb9, 0x005a7d8a, 0x0064422c, 0x01b89892, 0x03ccc148, 0x0335a378, 0x00d3492a, 0x02b2d7d1, 0x0028022e}}, Y: Field{[10]uint32{0x01b475a1, 0x027f8c54, 0x01de6be0, 0x03aa0ae6, 0x03f5454a, 0x02701790, 0x03ec2fde, 0x001b9518, 0x03ec903c, 0x001de8dd}}}, + {X: Field{[10]uint32{0x0224005f, 0x02645fa9, 0x022f8c38, 0x019c05bc, 0x03287114, 0x00b90c05, 0x00f42b80, 0x0258aa54, 0x0348b928, 0x001de0bf}}, Y: Field{[10]uint32{0x03608c15, 0x0322263e, 0x03c18c78, 0x033d6c8a, 0x008ad2c9, 0x026ebf8c, 0x01b766db, 0x00f832b4, 0x024938a0, 0x001e3c8f}}}, + {X: Field{[10]uint32{0x03ddcfc2, 0x019dbe09, 0x03c20d20, 0x01c633fb, 0x02f6ffbe, 0x03225bba, 0x0019d648, 0x02d13f44, 0x0278c26a, 0x0008ced2}}, Y: Field{[10]uint32{0x033b655c, 0x00fb679d, 0x037b518f, 0x0108b825, 0x01f553d3, 0x020a1337, 0x03ddc1a4, 0x037e4121, 0x0036d976, 0x00379421}}}, + {X: Field{[10]uint32{0x01b8bb0e, 0x0177831c, 0x02a0792c, 0x008ca57c, 0x023f7a46, 0x03630cd0, 0x03d7aed2, 0x03524f60, 0x022906ee, 0x0020052a}}, Y: Field{[10]uint32{0x03583d92, 0x01b75543, 0x02444f3e, 0x02be0687, 0x01695f39, 0x0215aa78, 0x030caba4, 0x02f26c45, 0x029df2a5, 0x0037161c}}}, + {X: Field{[10]uint32{0x03bbdfce, 0x012ad676, 0x012c1b28, 0x03abafab, 0x0060882a, 0x02f18723, 0x03050ce7, 0x02b9c46e, 0x010b233d, 0x0022807a}}, Y: Field{[10]uint32{0x0291fdb0, 0x0376eb5d, 0x01cf4ca4, 0x03bc8294, 0x03b34b72, 0x00b2569d, 0x0006cc41, 0x01a4fa4b, 0x035dc9e3, 0x001603b5}}}, + {X: Field{[10]uint32{0x02e733b4, 0x02e48c86, 0x011a44cb, 0x006825af, 0x03a56988, 0x020ae81f, 0x026372d5, 0x024561c3, 0x034924a2, 0x00014288}}, Y: Field{[10]uint32{0x038cc751, 0x02af3699, 0x03cde3ed, 0x0038bdf3, 0x03aa21d0, 0x0111bf38, 0x01d8e2fa, 0x0007529e, 0x0220a977, 0x001a50f0}}}, + {X: Field{[10]uint32{0x02aa6d83, 0x00821ebb, 0x015cecbd, 0x01b6a299, 0x02b51b8f, 0x0209903b, 0x0307bd61, 0x01d13dea, 0x03578c96, 0x0032fd24}}, Y: Field{[10]uint32{0x028d4bf0, 0x03c1f13b, 0x011d5e75, 0x02961f41, 0x0129e79f, 0x01212813, 0x00bdb1c9, 0x036e6501, 0x02f45711, 0x001346cd}}}, + {X: Field{[10]uint32{0x028efe38, 0x026e9c62, 0x03d89ad5, 0x007fe93a, 0x007c63d1, 0x00a2cc76, 0x0164c2e8, 0x034a5a34, 0x0175e4ed, 0x001cdecf}}, Y: Field{[10]uint32{0x01f31586, 0x0208ad4d, 0x03439e7c, 0x01b74e1d, 0x02ff1ebf, 0x03720c9e, 0x027002ee, 0x03945514, 0x03a18aa8, 0x003b1fde}}}, + {X: Field{[10]uint32{0x0038813a, 0x008bff2b, 0x00b8bb7e, 0x03166aaa, 0x028812e0, 0x035ed105, 0x03f46d69, 0x00e6b9b1, 0x00642519, 0x000a72ca}}, Y: Field{[10]uint32{0x00a2e6e9, 0x02edcebb, 0x038f0528, 0x01477af4, 0x03b5f1eb, 0x01043fc6, 0x02d77c8b, 0x02cb1725, 0x000a7c98, 0x0030fb0a}}}, + {X: Field{[10]uint32{0x0228fe9d, 0x01653f17, 0x01d352c9, 0x015091d0, 0x03f36689, 0x0065e553, 0x00dffa25, 0x00bef791, 0x02592428, 0x0006162a}}, Y: Field{[10]uint32{0x02d4bd46, 0x03b0a074, 0x0248596f, 0x03512f9d, 0x00be50b1, 0x01f92ad3, 0x03d7879a, 0x027eae7e, 0x01d6b0a6, 0x00283a24}}}, + {X: Field{[10]uint32{0x022eb75c, 0x03a45d21, 0x004fc2a9, 0x02374d1b, 0x0126c137, 0x013c24ba, 0x03ae314d, 0x003abd9e, 0x00581a42, 0x001cb39f}}, Y: Field{[10]uint32{0x0025ae1c, 0x012f781d, 0x02ff3628, 0x007fdd18, 0x038bec12, 0x002162ee, 0x02236ae3, 0x00f833db, 0x037a5a9c, 0x0008ca45}}}, + {X: Field{[10]uint32{0x03112903, 0x035bd1ab, 0x0031517b, 0x02f403b3, 0x00a3f9dc, 0x02777e6f, 0x03dcb830, 0x02db492a, 0x025e5dfa, 0x000d3072}}, Y: Field{[10]uint32{0x02a1f803, 0x02a01ec8, 0x021a27ac, 0x0093ad26, 0x0080088a, 0x02962682, 0x03c4aeb6, 0x03325c0d, 0x02adc931, 0x0024fdbf}}}, + {X: Field{[10]uint32{0x00392c36, 0x02e83749, 0x02243284, 0x011e7389, 0x028d348b, 0x03b8f59d, 0x003100cc, 0x01619fe0, 0x004a80af, 0x0001f16b}}, Y: Field{[10]uint32{0x02fc5828, 0x003a9019, 0x01b86337, 0x03faad61, 0x00a3201c, 0x03a9eae1, 0x03db23d1, 0x03991cc7, 0x0164903b, 0x002911a2}}}, + {X: Field{[10]uint32{0x00363caa, 0x012dfb13, 0x00b35e59, 0x00f69d1b, 0x010b57bf, 0x01a0ffdf, 0x018851c8, 0x01dca06a, 0x0113244c, 0x002f8b77}}, Y: Field{[10]uint32{0x02580fa2, 0x0391648f, 0x01f257df, 0x02151e56, 0x018c45ea, 0x02f1ee99, 0x033e5b92, 0x028b3c73, 0x01390af8, 0x002b6dd6}}}, + {X: Field{[10]uint32{0x02c13806, 0x0285d923, 0x039b7901, 0x00ae0665, 0x037f7b22, 0x018b7f67, 0x0244471d, 0x03bf7292, 0x036a3b3b, 0x001b7b87}}, Y: Field{[10]uint32{0x002e5651, 0x02e66657, 0x01ab6af3, 0x00c43d90, 0x021a9a24, 0x02c04c48, 0x000356ce, 0x03dbffe3, 0x01014fa5, 0x001767a1}}}, + {X: Field{[10]uint32{0x01e68c19, 0x039bf9e7, 0x03c3180e, 0x01afdaeb, 0x02c76438, 0x01ec4544, 0x00355b3a, 0x023b5d24, 0x00e68e2c, 0x00057c99}}, Y: Field{[10]uint32{0x00326aba, 0x00fe315c, 0x0374eddf, 0x02ae9daa, 0x03c41291, 0x01c73ca6, 0x01053fd3, 0x03d023be, 0x0126302b, 0x002415d3}}}, + {X: Field{[10]uint32{0x029c91a3, 0x026017af, 0x036660df, 0x01ec60fc, 0x016d4c5e, 0x02a61323, 0x0192b785, 0x022433a9, 0x03e904cc, 0x000f5f3e}}, Y: Field{[10]uint32{0x03f62808, 0x01f7f979, 0x00d12682, 0x01239d8c, 0x0042b30b, 0x01aa12d5, 0x0351694f, 0x00196be3, 0x01d44ea7, 0x00355737}}}, + {X: Field{[10]uint32{0x003a1e10, 0x00773667, 0x02e1445b, 0x02c1ffaf, 0x011ec637, 0x0125c480, 0x035dd3e7, 0x014771ea, 0x03f90d79, 0x00150e22}}, Y: Field{[10]uint32{0x02e5a547, 0x03bfd52a, 0x03dcf6fb, 0x030aa75b, 0x03725f99, 0x03d58348, 0x008738b3, 0x00a97e6f, 0x038825dc, 0x0005ecd9}}}, + {X: Field{[10]uint32{0x02088313, 0x03c065da, 0x03c94be5, 0x03154818, 0x00425327, 0x024a05e5, 0x00a0d2cc, 0x02029652, 0x03dd9a00, 0x000f08a7}}, Y: Field{[10]uint32{0x02926a1c, 0x036ee34a, 0x01d8d3a8, 0x01c7fb48, 0x01192f0a, 0x00dcf141, 0x0083d12c, 0x020ed2be, 0x0395a84f, 0x000d25d5}}}, + {X: Field{[10]uint32{0x03c63210, 0x00149c49, 0x02b26157, 0x0138dbc6, 0x011974e7, 0x03ea35eb, 0x0291f368, 0x01669b85, 0x036ee146, 0x002d84ae}}, Y: Field{[10]uint32{0x00df5bb4, 0x0181cb29, 0x00dc223b, 0x005fa382, 0x02052408, 0x0357a3aa, 0x0077733d, 0x0337c7e5, 0x005dd623, 0x00016523}}}, + {X: Field{[10]uint32{0x0305f613, 0x037bf81e, 0x03d64d2e, 0x0108bbec, 0x03ae381e, 0x024038ce, 0x0341ed3e, 0x003750a0, 0x01855447, 0x003b15b9}}, Y: Field{[10]uint32{0x015e9c45, 0x03d9b3ca, 0x016d9df8, 0x00334ec5, 0x0286effe, 0x01e2f39d, 0x03f2bd65, 0x038c237f, 0x0151acf6, 0x003b35fc}}}, + {X: Field{[10]uint32{0x0011f80d, 0x039d23ff, 0x0308f25e, 0x02bf9353, 0x02a565ee, 0x026c56c9, 0x000c8baf, 0x027e3ef6, 0x03ca85ff, 0x00006fbc}}, Y: Field{[10]uint32{0x012914f9, 0x0315a0fe, 0x03135272, 0x002b7a22, 0x01125f0a, 0x006f2262, 0x014b8927, 0x0125ee86, 0x00bb96be, 0x003f8098}}}, + {X: Field{[10]uint32{0x0107c20a, 0x0020fa64, 0x0325168a, 0x03968bae, 0x010c4b27, 0x034afd2b, 0x00e42653, 0x01a38aa4, 0x004a522b, 0x0006f6eb}}, Y: Field{[10]uint32{0x00d63ea1, 0x00a10e54, 0x03a9e3d2, 0x009c38fe, 0x025b09e1, 0x00ba2c81, 0x00467b9d, 0x01fe8004, 0x03263ede, 0x00135838}}}, + {X: Field{[10]uint32{0x0262fc84, 0x027aab4d, 0x038373bd, 0x01ffa252, 0x026e601b, 0x02cb0b08, 0x01e0f8b1, 0x02e36954, 0x039a567a, 0x003a40cb}}, Y: Field{[10]uint32{0x00eb70e9, 0x00c65b5d, 0x0400064e, 0x0252372c, 0x0121d609, 0x02bf783c, 0x00b0a49d, 0x006bce83, 0x03e647d2, 0x0002b158}}}, + {X: Field{[10]uint32{0x00f79c75, 0x0241f0c2, 0x011a9fda, 0x03af2281, 0x03a9608d, 0x015b8d19, 0x0108044f, 0x03dd2295, 0x02ec044a, 0x001f39d1}}, Y: Field{[10]uint32{0x02aa426a, 0x0103f57c, 0x017d5406, 0x02814beb, 0x012c6b8f, 0x01bcf006, 0x03bbb804, 0x02f48ef9, 0x01c13166, 0x0023c21e}}}, + {X: Field{[10]uint32{0x0359eecd, 0x01b7932e, 0x01fc906c, 0x032fbcda, 0x0068862d, 0x01b34c80, 0x01298564, 0x01b47282, 0x038919de, 0x00383549}}, Y: Field{[10]uint32{0x02886b20, 0x028a51b2, 0x03ce88cd, 0x03c74faf, 0x01f46680, 0x025d02f5, 0x03547912, 0x03764293, 0x039db4eb, 0x00263d19}}}, + {X: Field{[10]uint32{0x025ca397, 0x004eba9f, 0x01f1800a, 0x02159070, 0x02e28c8b, 0x00bc8222, 0x000a4d48, 0x012d6110, 0x01cdcf1f, 0x0031a891}}, Y: Field{[10]uint32{0x021ac628, 0x0399da25, 0x01bf3605, 0x02a0cc08, 0x01cb11ec, 0x02d79b34, 0x00ff944a, 0x032c2656, 0x03b9f8f2, 0x0034c1b6}}}, + {X: Field{[10]uint32{0x0295c910, 0x00a1b9cd, 0x02b06a1b, 0x00652837, 0x024ade09, 0x026661ff, 0x0334acec, 0x03c20a87, 0x008d9710, 0x003fe55b}}, Y: Field{[10]uint32{0x03bcc306, 0x008f4304, 0x0239fb78, 0x03b2c38b, 0x01a8086a, 0x0362a4dd, 0x028c832f, 0x03f5187f, 0x012b866a, 0x003eafb1}}}, + {X: Field{[10]uint32{0x02c23af0, 0x00485489, 0x00cc73ff, 0x0059bd2b, 0x025cef12, 0x0313709d, 0x0344fe45, 0x01813343, 0x024a0d1a, 0x00152776}}, Y: Field{[10]uint32{0x000631ef, 0x03dd9784, 0x00381a33, 0x025d58b1, 0x01166fec, 0x02aec578, 0x02eede71, 0x02a0980d, 0x03c0e05b, 0x001c78eb}}}, + {X: Field{[10]uint32{0x02776416, 0x01f99127, 0x01723207, 0x004bb708, 0x016070dd, 0x037647e7, 0x01896e82, 0x01cf339a, 0x03090215, 0x0019b4f7}}, Y: Field{[10]uint32{0x03b46d5d, 0x03c9e756, 0x01ebc25f, 0x0327aa4c, 0x0009ccf1, 0x02bc162f, 0x0029dd3e, 0x03b8fb65, 0x021359a2, 0x0024e605}}}, + {X: Field{[10]uint32{0x01e4f8d9, 0x01c0bd5e, 0x01be737b, 0x02083eb8, 0x028a4d7a, 0x01713c61, 0x013ede5a, 0x018e1a71, 0x01bc0942, 0x00186f4f}}, Y: Field{[10]uint32{0x0082e780, 0x015cad38, 0x02caac1b, 0x020788cd, 0x00502aee, 0x003be923, 0x01ddf540, 0x013d24b2, 0x0247e27d, 0x0023015a}}}, + {X: Field{[10]uint32{0x00178f4e, 0x01bcee60, 0x0000647d, 0x01dbe99f, 0x004ef20c, 0x005236c7, 0x002f7849, 0x036aa49c, 0x03464a31, 0x00229b62}}, Y: Field{[10]uint32{0x028f7407, 0x019f2eab, 0x00d8ccfe, 0x02864efd, 0x03c31309, 0x02081451, 0x0082f9e3, 0x01d8065b, 0x02eee408, 0x00347d01}}}, + {X: Field{[10]uint32{0x022e573e, 0x03f47924, 0x02b1b809, 0x01096b3d, 0x0137893b, 0x03b76607, 0x00aa90e1, 0x021105c0, 0x029399eb, 0x0038ad83}}, Y: Field{[10]uint32{0x0219f7af, 0x004fba93, 0x029ed635, 0x02b42003, 0x01bd8a38, 0x02cd75e2, 0x0209dc0a, 0x020a6a2b, 0x025fe394, 0x001a2831}}}, + {X: Field{[10]uint32{0x00f55e85, 0x03c9b375, 0x00574ac6, 0x031cad56, 0x01fc23b8, 0x0277e950, 0x0316cad9, 0x03f24993, 0x030fe85c, 0x00131d80}}, Y: Field{[10]uint32{0x012b7bb6, 0x0166fa28, 0x000902d9, 0x02aa62bb, 0x01e98c63, 0x006157df, 0x039a5745, 0x02d3b323, 0x02d89a31, 0x00112cd4}}}, + {X: Field{[10]uint32{0x03baed2e, 0x0151d897, 0x01580fe4, 0x025cd98f, 0x002f0e89, 0x00e304e8, 0x022c9ef5, 0x00f0d42a, 0x02a35910, 0x00372ea5}}, Y: Field{[10]uint32{0x036544b4, 0x00530885, 0x003deb4d, 0x034b6cb6, 0x00b13053, 0x016fedcf, 0x01f91bd7, 0x01a62b7a, 0x005f0727, 0x002be788}}}, + {X: Field{[10]uint32{0x02dc7883, 0x02cacc7c, 0x02a433b5, 0x01ffa6d9, 0x03e68242, 0x0327b71c, 0x03d3e036, 0x03fe6b2f, 0x03d8f75f, 0x003f4125}}, Y: Field{[10]uint32{0x00d62d79, 0x002eb7ff, 0x0213509c, 0x022625b7, 0x01445762, 0x002f792a, 0x03fb2fcc, 0x0041deac, 0x00b69c8d, 0x00348c05}}}, + {X: Field{[10]uint32{0x01f48040, 0x0331bb7b, 0x01077542, 0x026bae28, 0x02e70500, 0x013a0fe7, 0x011b7795, 0x03904d0f, 0x01bb0b38, 0x0016ed00}}, Y: Field{[10]uint32{0x02599c14, 0x020afe20, 0x03a5ee7a, 0x01cc03b3, 0x00ca9445, 0x01e38f2a, 0x00ea6283, 0x004e47da, 0x00b5acec, 0x0010c7f3}}}, + {X: Field{[10]uint32{0x00bb283b, 0x00b6d6d2, 0x01d20a26, 0x00119ef1, 0x023acac7, 0x00d70ddf, 0x0341c38b, 0x01ab62c9, 0x024ff9cc, 0x0007ea5a}}, Y: Field{[10]uint32{0x02b963eb, 0x02a3fafb, 0x02ac8bfc, 0x031c6c88, 0x036404dc, 0x0278527a, 0x02af7f1f, 0x016bf3c7, 0x0092ffc6, 0x0030d123}}}, + {X: Field{[10]uint32{0x002f86ea, 0x00c8a459, 0x00f11614, 0x0080bfb2, 0x03697ea4, 0x01c74298, 0x02384531, 0x014749e9, 0x02ef1ae5, 0x000254d2}}, Y: Field{[10]uint32{0x03729591, 0x00aab03b, 0x03849643, 0x0084b2ff, 0x0346fd7f, 0x0284fa5b, 0x0148a4ec, 0x01f740cf, 0x003c3883, 0x00334325}}}, + {X: Field{[10]uint32{0x001b8ceb, 0x000ca834, 0x038b7b57, 0x02fc06a3, 0x02138440, 0x02a93fd2, 0x018d08f3, 0x000e42f2, 0x03ed4330, 0x003a9cab}}, Y: Field{[10]uint32{0x0058663e, 0x0299b4b6, 0x0280925e, 0x0112145c, 0x00af4fb0, 0x03ab9fa5, 0x02856a44, 0x00b30a72, 0x018c0369, 0x00385d37}}}, + {X: Field{[10]uint32{0x00122327, 0x03e1b517, 0x01fa9a01, 0x0188d75e, 0x03165698, 0x02fce874, 0x03801f2a, 0x0148e980, 0x01343ca2, 0x000e564d}}, Y: Field{[10]uint32{0x0153dd96, 0x00b80026, 0x0175b45d, 0x021eb1b2, 0x0142a5b8, 0x0111d449, 0x01cbf0e9, 0x01b72154, 0x03e92cd7, 0x002b34f8}}}, + {X: Field{[10]uint32{0x002d4721, 0x038f827b, 0x02a3f246, 0x03e1c9d0, 0x034f74ef, 0x037eed46, 0x027d4b53, 0x01683da5, 0x022a375e, 0x00355eca}}, Y: Field{[10]uint32{0x013ed306, 0x03495443, 0x03b036a0, 0x0251c6b9, 0x01c0aeeb, 0x01209e07, 0x02c20913, 0x01fb0c43, 0x00484d10, 0x0004b5be}}}, + {X: Field{[10]uint32{0x002f1082, 0x02eabd91, 0x0119c59b, 0x023f5480, 0x01fc5def, 0x03804d75, 0x02c781af, 0x03bbd839, 0x03c51b99, 0x00027cb7}}, Y: Field{[10]uint32{0x0320dd0d, 0x022d5b96, 0x01a77e0f, 0x01626789, 0x017ad1d7, 0x02a5bf83, 0x03ca6e4e, 0x00c123e8, 0x0162fd27, 0x00023c82}}}, + {X: Field{[10]uint32{0x0229884b, 0x00b06f40, 0x0216a935, 0x01d96316, 0x01afa587, 0x03037b68, 0x0336c1f9, 0x03244d26, 0x03c6f030, 0x002c70c2}}, Y: Field{[10]uint32{0x02ecdfc3, 0x00e43187, 0x019f1939, 0x009fd4ed, 0x035563e7, 0x028b8a32, 0x01c63d18, 0x02223735, 0x01d16e77, 0x003e2916}}}, + {X: Field{[10]uint32{0x01c6e53b, 0x03866369, 0x002eb665, 0x00ce14f8, 0x02305429, 0x02ed7499, 0x01ad6f91, 0x0348dc4b, 0x03e740ca, 0x00022998}}, Y: Field{[10]uint32{0x035c1e99, 0x007bb9ae, 0x03812c0c, 0x03f8081d, 0x000786a8, 0x00ec2463, 0x00cf7116, 0x0174576b, 0x03995117, 0x003881ac}}}, + {X: Field{[10]uint32{0x012941a1, 0x02aa2d2a, 0x03696fe1, 0x03a09f98, 0x005f4a5a, 0x01b302c0, 0x00fac0a7, 0x0247bbd1, 0x02cbe0ca, 0x000ac255}}, Y: Field{[10]uint32{0x006cffd2, 0x00aa588e, 0x03423ddf, 0x03fb68a7, 0x033f84b8, 0x018989f8, 0x02e1e110, 0x013abe43, 0x03a8dd45, 0x0028c79b}}}, + {X: Field{[10]uint32{0x0262c3bd, 0x00a449b9, 0x01330d54, 0x02001a83, 0x006b0099, 0x03847ed3, 0x02381df7, 0x0325c3ad, 0x01517a2a, 0x00380510}}, Y: Field{[10]uint32{0x008dfcee, 0x02e8d810, 0x03a1e7f4, 0x00d12218, 0x03aeb3fd, 0x0234636f, 0x01639341, 0x03203085, 0x029ba691, 0x00208e33}}}, + {X: Field{[10]uint32{0x02c86c37, 0x008568df, 0x02eba08b, 0x035c78a2, 0x02f344e0, 0x01682d99, 0x0316c530, 0x00bccf2b, 0x013e8b06, 0x0002f8c8}}, Y: Field{[10]uint32{0x0151cd1f, 0x02ca725f, 0x00adc3f1, 0x00f7476c, 0x03550fb8, 0x014a8990, 0x03956838, 0x00e29335, 0x03baeaca, 0x00154948}}}, + {X: Field{[10]uint32{0x01e8ff2b, 0x03859faa, 0x030abc4f, 0x01b6d7ac, 0x001c18eb, 0x0396389d, 0x03aa1db9, 0x02f593f1, 0x03b6bfbf, 0x00188ce4}}, Y: Field{[10]uint32{0x00e42cd3, 0x03537f8d, 0x00b500ba, 0x025ed4ac, 0x031339a1, 0x028edee5, 0x025e316f, 0x016fca80, 0x0174f0fd, 0x001f0390}}}, + {X: Field{[10]uint32{0x01cfe97a, 0x00856c43, 0x0326fbc6, 0x02aa2bea, 0x01bffe79, 0x0233d02f, 0x01eb624b, 0x007a1d9a, 0x0302dd0a, 0x0036b7ad}}, Y: Field{[10]uint32{0x03253490, 0x030e37c5, 0x00bb48fb, 0x026686ac, 0x025a5225, 0x0334e6f2, 0x0260acb8, 0x026d04b5, 0x00cae4c2, 0x0024c224}}}, + {X: Field{[10]uint32{0x01362f33, 0x03edde32, 0x03c13627, 0x03563894, 0x010ac98a, 0x00986133, 0x01c9cfec, 0x026e0aec, 0x03b78317, 0x002d4a34}}, Y: Field{[10]uint32{0x038babab, 0x00af54b6, 0x004f047c, 0x00222ed1, 0x01aa902e, 0x028b4628, 0x0140676b, 0x0048a98e, 0x03af1545, 0x00018c80}}}, + {X: Field{[10]uint32{0x01734a6a, 0x0096adc4, 0x036e02d0, 0x018835d0, 0x017a4de5, 0x0013a7a0, 0x0018a5c8, 0x01b88ab9, 0x03e09398, 0x000bfc88}}, Y: Field{[10]uint32{0x0100f678, 0x029e7000, 0x000965ef, 0x01d75280, 0x03819904, 0x01e0e2ad, 0x0276d8a9, 0x036866f6, 0x0188ec9c, 0x00317234}}}, + {X: Field{[10]uint32{0x01eb1742, 0x01b9d2e6, 0x0312ff94, 0x03da67f1, 0x019ec839, 0x0322ac73, 0x03d2c393, 0x014f2733, 0x01d50e1e, 0x0032e1cc}}, Y: Field{[10]uint32{0x02d19fb5, 0x02394f3d, 0x0076d8c1, 0x0123921c, 0x00a9db38, 0x024b3a29, 0x01252480, 0x03141374, 0x01f838fe, 0x00334be7}}}, + {X: Field{[10]uint32{0x00cf4a2e, 0x02c49c78, 0x0379936b, 0x0376fa61, 0x006dac52, 0x03c9c9a4, 0x02c265aa, 0x02972ddb, 0x0045d776, 0x0004ddeb}}, Y: Field{[10]uint32{0x02a04670, 0x02b287b0, 0x010d4f34, 0x0154353b, 0x0025ab21, 0x036524f8, 0x027a8187, 0x0124cb56, 0x030dd595, 0x00292ccc}}}, + {X: Field{[10]uint32{0x001a5ccd, 0x006894d9, 0x00724c51, 0x01cdeb04, 0x0222fbac, 0x020107ea, 0x03489bd8, 0x031d7f80, 0x03f2f140, 0x002612e6}}, Y: Field{[10]uint32{0x00d14ff3, 0x0050c7f2, 0x02bb590b, 0x026a50a8, 0x03d82f4c, 0x03135431, 0x010ea82a, 0x03bb2e9d, 0x02399733, 0x00311d3d}}}, + {X: Field{[10]uint32{0x03bdcb06, 0x025835eb, 0x00c4d857, 0x01e5ca63, 0x01d50504, 0x0000afe6, 0x035d56ac, 0x01f3e6c4, 0x000074f5, 0x0012e3f4}}, Y: Field{[10]uint32{0x00c703bf, 0x038deccd, 0x0097e3a8, 0x03a531b4, 0x0095560e, 0x01833ddb, 0x01937a4c, 0x03dbddc8, 0x01031df0, 0x001f0110}}}, + {X: Field{[10]uint32{0x018b6079, 0x0215a0c8, 0x000b6605, 0x006e2fb3, 0x0334fc75, 0x022f4376, 0x01250b25, 0x0088d986, 0x02536841, 0x0015cc59}}, Y: Field{[10]uint32{0x01652904, 0x010142a4, 0x01c37da6, 0x016f8e8e, 0x0216f833, 0x022bf850, 0x0172898b, 0x00715d22, 0x024f30f0, 0x0034755b}}}, + {X: Field{[10]uint32{0x0369f286, 0x01c883f6, 0x03bd253c, 0x019d3cae, 0x00607373, 0x019f50fd, 0x032cb597, 0x005bcbef, 0x0197a0ff, 0x00326800}}, Y: Field{[10]uint32{0x00142f0b, 0x03314610, 0x034e4009, 0x03b694c7, 0x006b4dfe, 0x018172af, 0x02074b0c, 0x0045f077, 0x0383d739, 0x0005df19}}}, + {X: Field{[10]uint32{0x021881cb, 0x03b1b3a9, 0x03ff645e, 0x03d5fba2, 0x00c87b9e, 0x01e6cc02, 0x01616185, 0x008ea76c, 0x02da91df, 0x00388d05}}, Y: Field{[10]uint32{0x00b8da15, 0x01cb755c, 0x00137937, 0x03d28f78, 0x02e42fbc, 0x005c60a5, 0x02c82e0e, 0x00da479f, 0x017f8404, 0x00395590}}}, + {X: Field{[10]uint32{0x038e9ad8, 0x038a5558, 0x01c1e3b0, 0x03ba29d2, 0x0114293e, 0x01def62a, 0x0214c450, 0x01d4f399, 0x03f2369d, 0x0027e5b8}}, Y: Field{[10]uint32{0x021ddff1, 0x012cae68, 0x00ff6b49, 0x025b94a7, 0x039b01a3, 0x0104f83a, 0x0250d10e, 0x029369c5, 0x02681567, 0x003d7344}}}, + {X: Field{[10]uint32{0x01301fd2, 0x013efdae, 0x03d5f1d9, 0x01e16e90, 0x01ae4880, 0x039a8c91, 0x014317dd, 0x00048f35, 0x03a4b24b, 0x0012195e}}, Y: Field{[10]uint32{0x02f0d890, 0x02319beb, 0x03e36a4a, 0x02824a69, 0x00dd4931, 0x02a4086c, 0x013ca772, 0x00de04a0, 0x02c06eb5, 0x000647b7}}}, + {X: Field{[10]uint32{0x0236f24a, 0x021f9a5a, 0x032d4e01, 0x03201de0, 0x02c6c858, 0x00500b5e, 0x03155111, 0x02193632, 0x02e9d72e, 0x0019ecc8}}, Y: Field{[10]uint32{0x03f6946a, 0x03f7ceb1, 0x02208c3d, 0x019fdfe6, 0x030e15c8, 0x017eaa0c, 0x0387058c, 0x02fc54ef, 0x02c26b58, 0x0033fac4}}}, + {X: Field{[10]uint32{0x004ded15, 0x0381bc29, 0x02d40fbd, 0x004c5820, 0x03c545ba, 0x014800b6, 0x00e89250, 0x037663f3, 0x0068542b, 0x00010ba0}}, Y: Field{[10]uint32{0x03c4aae5, 0x0111146f, 0x02402bf6, 0x0139eab1, 0x01a1ee81, 0x0313c987, 0x03649158, 0x00f3d49c, 0x01b0c1f3, 0x0005916a}}}, + {X: Field{[10]uint32{0x0290d4c7, 0x0230417f, 0x00e30758, 0x03292a32, 0x013e058c, 0x02eeb001, 0x02191079, 0x01437555, 0x00e1339c, 0x0023b9f7}}, Y: Field{[10]uint32{0x02c9d5f9, 0x01a6a05b, 0x011d2b46, 0x03fc79bc, 0x0098e102, 0x036fa7f8, 0x01a61705, 0x0209e4b3, 0x02f48aae, 0x003fef42}}}, + {X: Field{[10]uint32{0x03a368e6, 0x01e2a087, 0x02ece559, 0x03c3319b, 0x0237a935, 0x02c82485, 0x01aaaf27, 0x01a9c5ab, 0x01041292, 0x0002af25}}, Y: Field{[10]uint32{0x01f79203, 0x0317db5c, 0x027c9624, 0x01234e91, 0x02155a4a, 0x036b93f4, 0x0375c484, 0x01879e7e, 0x0135e9b4, 0x001cb952}}}, + {X: Field{[10]uint32{0x02976ba8, 0x037746e9, 0x02f3b433, 0x0235e0fc, 0x00fd72fd, 0x000de3f3, 0x000568d4, 0x03a6d4ec, 0x032081e0, 0x002f4940}}, Y: Field{[10]uint32{0x003ceb39, 0x0318e55b, 0x021ca4c3, 0x01f4a75a, 0x02e8c4c8, 0x005ee39e, 0x00ca8797, 0x01526265, 0x03db8585, 0x0016b6e2}}}, + {X: Field{[10]uint32{0x02e25f71, 0x02297862, 0x00740c01, 0x03812222, 0x01b31609, 0x039ea836, 0x02e91677, 0x03a13926, 0x0262fbee, 0x0002d3ec}}, Y: Field{[10]uint32{0x0176e5fc, 0x0371fe38, 0x0003b24c, 0x00da3a8d, 0x01265d6d, 0x033d85ba, 0x00ecbe41, 0x00754496, 0x0386dc09, 0x000d37cf}}}, + {X: Field{[10]uint32{0x02605c01, 0x03a20cef, 0x021c495d, 0x005c86cd, 0x03e46048, 0x00418ed7, 0x005ad148, 0x013abe85, 0x036766f2, 0x00346ea6}}, Y: Field{[10]uint32{0x01e8400a, 0x011da8f6, 0x03a75068, 0x00f292e2, 0x01f87194, 0x0245f8ea, 0x03ce7f28, 0x00bc7998, 0x00bd17de, 0x003a029b}}}, + {X: Field{[10]uint32{0x022639b3, 0x009d4ba4, 0x01ba8373, 0x0009a771, 0x03a80c67, 0x03ae78aa, 0x006652d5, 0x016a34b5, 0x02b03a3e, 0x0017262d}}, Y: Field{[10]uint32{0x010f4a54, 0x03d944f1, 0x012e06b8, 0x02d98d4a, 0x006a35ef, 0x03e41e81, 0x011bd130, 0x003374b1, 0x039a145d, 0x0002078b}}}, + {X: Field{[10]uint32{0x002618f8, 0x036d7753, 0x02a840c8, 0x00382a1e, 0x02908abf, 0x03ec97cb, 0x00b70714, 0x02e1bd87, 0x0288f75f, 0x00307e91}}, Y: Field{[10]uint32{0x028397ea, 0x00f32e72, 0x01d9b204, 0x0396ae18, 0x039db869, 0x02aa44f2, 0x0355d0b1, 0x03c9b45f, 0x02776d4b, 0x003cbdd2}}}, + {X: Field{[10]uint32{0x03227ec1, 0x00ae9b3d, 0x01f76dc2, 0x022d1017, 0x0396aec7, 0x00269d56, 0x0062ba2f, 0x03acc947, 0x02e9a644, 0x00017a01}}, Y: Field{[10]uint32{0x033e614b, 0x013e1fe9, 0x01bba9d8, 0x03adcbcc, 0x02b871d2, 0x01d08c4e, 0x02caa050, 0x020a75ab, 0x0118d6a1, 0x002e2320}}}, + {X: Field{[10]uint32{0x01c8de9a, 0x018c9bb4, 0x00c1434c, 0x01b7bfd5, 0x01096863, 0x031e406f, 0x023d965b, 0x0069efd8, 0x03fefd2c, 0x003e7451}}, Y: Field{[10]uint32{0x029caffd, 0x01235cb4, 0x00c33cd5, 0x032e1260, 0x0040de44, 0x0045cc18, 0x027d77b4, 0x021b1e4e, 0x0249ab66, 0x0031e21c}}}, + {X: Field{[10]uint32{0x030ccdb1, 0x0283fb29, 0x0023babe, 0x02b8c5c4, 0x009f7020, 0x001e658d, 0x0138a1f5, 0x03447ea3, 0x015685f6, 0x002e6332}}, Y: Field{[10]uint32{0x010ecf7f, 0x00ab6f26, 0x01f49571, 0x0085c25d, 0x013dcbdf, 0x002208d5, 0x024cc0d4, 0x03a28dbb, 0x00953689, 0x003c1d35}}}, + {X: Field{[10]uint32{0x0017b474, 0x0229925a, 0x02b03464, 0x024fceed, 0x02184584, 0x0052f2e9, 0x01091dc7, 0x005f9fbe, 0x02d41008, 0x003c5872}}, Y: Field{[10]uint32{0x03740904, 0x0227db66, 0x01ffd612, 0x03e7e946, 0x01c4410a, 0x01798945, 0x0081eb24, 0x03cc908a, 0x012e396a, 0x002dfbae}}}, + {X: Field{[10]uint32{0x0326914c, 0x02c70214, 0x038fb1b7, 0x03da2899, 0x03fb54af, 0x01bb7022, 0x02abac24, 0x00187915, 0x00892ea4, 0x001f22db}}, Y: Field{[10]uint32{0x027692f8, 0x02722bd7, 0x015b10d6, 0x00f736ae, 0x02296072, 0x00acd1a0, 0x035eacd0, 0x034b0a7f, 0x03026ea1, 0x003c2387}}}, + {X: Field{[10]uint32{0x00f28729, 0x00d7bb49, 0x01e5dd36, 0x023dc937, 0x023ab207, 0x03dc681d, 0x01b93cce, 0x01196065, 0x029f1633, 0x00119a30}}, Y: Field{[10]uint32{0x0074ea4f, 0x039d0013, 0x00fa129e, 0x01f0bd87, 0x008fd22f, 0x02766545, 0x024c7233, 0x03b1480c, 0x00c98391, 0x00176c8a}}}, + {X: Field{[10]uint32{0x0167b65e, 0x0071f94c, 0x00b2f4e2, 0x00a724a4, 0x0296fa67, 0x00d9c994, 0x0239f8cf, 0x03697066, 0x00f39dd6, 0x000d10f4}}, Y: Field{[10]uint32{0x03429234, 0x01f03a25, 0x014b92a8, 0x002edfb6, 0x0114a432, 0x0301e514, 0x0131f637, 0x0237723b, 0x02399a08, 0x0012db6d}}}, + {X: Field{[10]uint32{0x03c227b4, 0x031e0422, 0x020e8ffe, 0x02a6beb0, 0x02458dbc, 0x015d3025, 0x0281e693, 0x013a5560, 0x010117a0, 0x0034f38d}}, Y: Field{[10]uint32{0x02eb9908, 0x01ff2ac1, 0x0384a9b7, 0x01ba4338, 0x007696ee, 0x03555ab4, 0x001e47f8, 0x01bba4d5, 0x03b9628f, 0x002f3f1d}}}, + {X: Field{[10]uint32{0x015127af, 0x0005583e, 0x03080233, 0x030f34b5, 0x00f2bc1a, 0x03782b0a, 0x01f86409, 0x00914888, 0x0363ad77, 0x00313718}}, Y: Field{[10]uint32{0x012d3038, 0x025ae2dd, 0x0271b3e0, 0x03165fda, 0x00038a79, 0x020d1494, 0x01bc9493, 0x0299990e, 0x028fd789, 0x001e326e}}}, + {X: Field{[10]uint32{0x015ac666, 0x034a769b, 0x01075b23, 0x0332ef37, 0x021bf4ed, 0x008f4b83, 0x0178d7a1, 0x011fb3f3, 0x0394221a, 0x00031dc7}}, Y: Field{[10]uint32{0x028d6091, 0x0157dc73, 0x01980d91, 0x01bd6e3d, 0x03f2ec52, 0x01778a4f, 0x00719246, 0x016abbd1, 0x0330829f, 0x00137b8e}}}, + {X: Field{[10]uint32{0x01e6e199, 0x00945f5e, 0x03d50e77, 0x02fc9d6b, 0x0136a1e9, 0x012287c9, 0x02516e64, 0x023dfd6d, 0x00e89633, 0x002ffe23}}, Y: Field{[10]uint32{0x0388c206, 0x01d05629, 0x03f68532, 0x00a6ed56, 0x01c15526, 0x03a5d876, 0x00b62117, 0x004293ac, 0x007ab620, 0x0023cfc3}}}, + {X: Field{[10]uint32{0x01a3b97a, 0x0287ca82, 0x002da576, 0x01dbcb38, 0x006a467e, 0x00f2b089, 0x010e7e3d, 0x02fc93a1, 0x00645d57, 0x0012bf34}}, Y: Field{[10]uint32{0x0110f0a2, 0x02b95393, 0x01f93984, 0x00ec301b, 0x00ef927d, 0x021db5b0, 0x00692f61, 0x02be4db3, 0x035487b2, 0x0014bc8e}}}, + {X: Field{[10]uint32{0x02b1f373, 0x022e884c, 0x03abdf8a, 0x00d26001, 0x0379e23c, 0x0136c04b, 0x03933fd9, 0x0038815f, 0x022cb9bf, 0x00312f04}}, Y: Field{[10]uint32{0x02fbfc6d, 0x01e21859, 0x00ce1a87, 0x02f5ef7e, 0x031daf76, 0x02ad5b5d, 0x005d4273, 0x0206eb71, 0x03b6a31d, 0x00390311}}}, + {X: Field{[10]uint32{0x01f821a8, 0x01a3c614, 0x019ddb4c, 0x0229f4d3, 0x02837a0f, 0x02ac46b2, 0x0223d27b, 0x01de4738, 0x01b1d1be, 0x00121e86}}, Y: Field{[10]uint32{0x01d0ef98, 0x027912a9, 0x00e67f51, 0x000dec97, 0x01055524, 0x0150578d, 0x02335544, 0x013a6821, 0x034316ff, 0x00294f35}}}, + {X: Field{[10]uint32{0x0301a326, 0x00cb2e10, 0x007f8106, 0x0202a162, 0x01f4ac3d, 0x022333ff, 0x02035165, 0x031d201d, 0x00ecbe06, 0x0009d28f}}, Y: Field{[10]uint32{0x01a9f40d, 0x02627121, 0x019b3ff4, 0x01e98efc, 0x035d06b4, 0x00e172db, 0x0272cab5, 0x022d1426, 0x03e3afbe, 0x0005e892}}}, + {X: Field{[10]uint32{0x03afa9e8, 0x01e4418c, 0x022c48a0, 0x01a8002f, 0x03e82fcc, 0x01563e74, 0x03fc34e7, 0x0266b00e, 0x0377b0cb, 0x000cacc7}}, Y: Field{[10]uint32{0x018f5bc2, 0x036a0297, 0x032a8993, 0x03542c5c, 0x0217f422, 0x02e0111c, 0x02b3f71d, 0x036a4383, 0x004cc191, 0x000111ed}}}, + {X: Field{[10]uint32{0x024a2752, 0x022e1680, 0x03c2925d, 0x038419b7, 0x03945285, 0x03f424cd, 0x0339d46f, 0x0051a370, 0x01cf5556, 0x001e30e7}}, Y: Field{[10]uint32{0x03a3ac55, 0x022119de, 0x009ce890, 0x00c57844, 0x02a66809, 0x03008f98, 0x03df63d5, 0x032a17ba, 0x01bb4e41, 0x0035a477}}}, + {X: Field{[10]uint32{0x0134e5ff, 0x035bece7, 0x0325fa04, 0x0258ac79, 0x00d2f21f, 0x03bbf06a, 0x0102116d, 0x001ddf11, 0x0111a492, 0x0017f1d6}}, Y: Field{[10]uint32{0x017512f2, 0x0182ecd2, 0x00d507a4, 0x01892dca, 0x01f3fe16, 0x0284e5d2, 0x03524d96, 0x0221737f, 0x037f18f5, 0x00167cdb}}}, + {X: Field{[10]uint32{0x0108fa8a, 0x00a274eb, 0x0364ae38, 0x039bda4e, 0x01fa62dd, 0x038d1b86, 0x010fc164, 0x00ad269b, 0x00e9152b, 0x00328564}}, Y: Field{[10]uint32{0x0046dc8c, 0x023fcc20, 0x007f524a, 0x01124da5, 0x01535ea7, 0x00499157, 0x029eae17, 0x03b5d527, 0x033c1174, 0x0011a9ee}}}, + {X: Field{[10]uint32{0x0111fa1f, 0x01433767, 0x037f1f3d, 0x02f16ea6, 0x01743d94, 0x03d9b56b, 0x036e660b, 0x02f7ae9f, 0x02665ff0, 0x00171c54}}, Y: Field{[10]uint32{0x0073a03e, 0x03ffa711, 0x00c39b31, 0x02903c82, 0x02e41684, 0x03333293, 0x01ee9ddc, 0x02570e88, 0x031556e9, 0x001f688e}}}, + {X: Field{[10]uint32{0x00177e82, 0x0361a139, 0x017c8c29, 0x03387255, 0x03fa0c09, 0x03cb840c, 0x01c38774, 0x031ce957, 0x01a36361, 0x0031fdc7}}, Y: Field{[10]uint32{0x01b0dedf, 0x03b6e156, 0x01f92078, 0x0030d0a7, 0x0177c6f5, 0x0013c3e5, 0x022dbf9a, 0x033b2dac, 0x007fb5c2, 0x000235b9}}}, + {X: Field{[10]uint32{0x0058afab, 0x00070af7, 0x0316da01, 0x03339be9, 0x024130b4, 0x00cedd4d, 0x01259004, 0x0284f8de, 0x019f5264, 0x001ba46f}}, Y: Field{[10]uint32{0x00fd604f, 0x008e946d, 0x034499ed, 0x00d077d6, 0x01ee0f94, 0x00826a80, 0x0020c20f, 0x01612576, 0x0055506b, 0x0016ea9d}}}, + {X: Field{[10]uint32{0x02ef0d33, 0x015065ae, 0x01072689, 0x0280d416, 0x03244907, 0x00cc8a04, 0x01c789df, 0x01f2ff1d, 0x028e69ac, 0x0007c037}}, Y: Field{[10]uint32{0x02e040f4, 0x020dc0f6, 0x02feab2e, 0x032106e9, 0x020e65fe, 0x0120ad9e, 0x000c30b4, 0x00c3b4a0, 0x0290f323, 0x000a24b3}}}, + {X: Field{[10]uint32{0x01300638, 0x01e4515f, 0x01e1091d, 0x002c8c93, 0x001a2f5b, 0x01c76356, 0x01efa3ad, 0x0311a508, 0x03f507d8, 0x0030004c}}, Y: Field{[10]uint32{0x00f18895, 0x010d3b4d, 0x027a2f86, 0x004bf72d, 0x031aa3dc, 0x027a38c6, 0x005ea455, 0x03a60b74, 0x01820d3e, 0x000f1dac}}}, + {X: Field{[10]uint32{0x020cad49, 0x03a420f1, 0x0248d2f8, 0x03819b37, 0x00cdb172, 0x012efe5c, 0x00ef7560, 0x009a784b, 0x01e795e8, 0x0002bd8e}}, Y: Field{[10]uint32{0x0026abb4, 0x00b11d09, 0x03219808, 0x02bd59ce, 0x030c479d, 0x03477921, 0x0014a74c, 0x0334a439, 0x0179ce92, 0x0006f404}}}, + {X: Field{[10]uint32{0x01f4c9a1, 0x01e5e5cc, 0x00cd54e9, 0x00e22dcf, 0x00ede585, 0x03af2e68, 0x03a0a5d8, 0x03011063, 0x027d5447, 0x0039b6f4}}, Y: Field{[10]uint32{0x01242153, 0x037aaf8f, 0x038ee6b5, 0x00dcd236, 0x01a20710, 0x03433e2f, 0x00c780a0, 0x020c80f5, 0x0124f284, 0x001dfce1}}}, + {X: Field{[10]uint32{0x036360a9, 0x037f54cc, 0x0246e4c2, 0x007b9015, 0x028d1e3e, 0x0304467a, 0x02dd904e, 0x01c2ab40, 0x0123c95b, 0x003d46a3}}, Y: Field{[10]uint32{0x00f46c57, 0x012c6a70, 0x0113873e, 0x02ad4651, 0x02ae5c6a, 0x02566b36, 0x03488714, 0x00f3d831, 0x009a1d70, 0x00109acb}}}, + {X: Field{[10]uint32{0x00f6bcf4, 0x01135428, 0x01863429, 0x02b07b91, 0x00a3e4d1, 0x00eb8e98, 0x038d8fc3, 0x00dedfd5, 0x01e70fe4, 0x00384bc4}}, Y: Field{[10]uint32{0x0019f5d2, 0x01b64011, 0x01253e3c, 0x0359b71f, 0x038bfec8, 0x00453255, 0x03985b14, 0x0226ad58, 0x015835fa, 0x0008b457}}}, + {X: Field{[10]uint32{0x0188e14c, 0x02f1fb7a, 0x00bb9bf6, 0x01467624, 0x03ac6193, 0x02562853, 0x0351e56d, 0x018b418b, 0x020a8ec7, 0x0039d621}}, Y: Field{[10]uint32{0x027ecd78, 0x0070a5d5, 0x03b23ec4, 0x0208ec00, 0x03104386, 0x032d1d43, 0x008d780d, 0x013c87ee, 0x00ef10b8, 0x0010b678}}}, + {X: Field{[10]uint32{0x00a64163, 0x00e8e608, 0x032c6e42, 0x020bbe47, 0x02d47998, 0x022952de, 0x022b90c7, 0x00797360, 0x03e90ba2, 0x000f24cf}}, Y: Field{[10]uint32{0x029080df, 0x00b77cd9, 0x03f96b67, 0x00d447d9, 0x017fc161, 0x01c02d2b, 0x01b23a56, 0x008b8b29, 0x00be5319, 0x00307aa8}}}, + {X: Field{[10]uint32{0x02857872, 0x004d3f7a, 0x00e07939, 0x0138f027, 0x00df828e, 0x02469e70, 0x02b6b08e, 0x0019b2db, 0x036a83c9, 0x0011d5d5}}, Y: Field{[10]uint32{0x0038277a, 0x03b9b183, 0x00d7b058, 0x03a27654, 0x01818248, 0x0249c311, 0x03e8388d, 0x01fc5778, 0x03b262d7, 0x0004fc8b}}}, + {X: Field{[10]uint32{0x031045c7, 0x0275ad00, 0x00aa8012, 0x03361987, 0x0246570f, 0x029fffd0, 0x01df9039, 0x014502c6, 0x01037008, 0x000d798e}}, Y: Field{[10]uint32{0x01b9e8c9, 0x0272b979, 0x011f1b0e, 0x02b6961a, 0x0053cfb3, 0x00f0a3a1, 0x004f022b, 0x018361a9, 0x00bcaa9d, 0x000a157d}}}, + {X: Field{[10]uint32{0x02126fa3, 0x0398cb8c, 0x024fe82b, 0x0371aa2f, 0x02ad5330, 0x0342a17d, 0x025f0316, 0x02081cd5, 0x02011f11, 0x002b511b}}, Y: Field{[10]uint32{0x00e83e39, 0x00653d8a, 0x00d4315c, 0x0150bdcc, 0x021d8acb, 0x02b03aac, 0x012b2f81, 0x038fd47e, 0x02f1dece, 0x000900e0}}}, + {X: Field{[10]uint32{0x02718815, 0x0359001a, 0x021aff82, 0x03d75dd1, 0x0289164e, 0x03108869, 0x00af7529, 0x02b0de08, 0x01f3eb01, 0x003efa79}}, Y: Field{[10]uint32{0x02d088e6, 0x0007fd84, 0x00468478, 0x0210aafe, 0x01ba2073, 0x0137a485, 0x013e0884, 0x00b8338e, 0x00add85a, 0x003cbcc3}}}, + {X: Field{[10]uint32{0x03038135, 0x014bc4ce, 0x029166e9, 0x03d8cb4c, 0x00b9b585, 0x020b326e, 0x0149aa24, 0x03d0c281, 0x0320d81f, 0x000799d4}}, Y: Field{[10]uint32{0x00686aa7, 0x02d326bc, 0x01db1b44, 0x006cd9b4, 0x002e2c7f, 0x02621c03, 0x03aa5de2, 0x03665716, 0x0276c9c7, 0x003283c4}}}, + {X: Field{[10]uint32{0x02267718, 0x00e45f35, 0x0285f359, 0x010cc383, 0x0394c3f6, 0x0349e492, 0x02b8068a, 0x0394ae8b, 0x037023b0, 0x0005db71}}, Y: Field{[10]uint32{0x017ca8d9, 0x003cff8a, 0x02701d51, 0x03da1746, 0x000548d4, 0x03d98254, 0x010686fd, 0x016c1bd1, 0x02885df7, 0x0034b718}}}, + {X: Field{[10]uint32{0x01a9c938, 0x002aded0, 0x008dd99a, 0x01080f3f, 0x017ac839, 0x0331f150, 0x02feadbc, 0x00aceacd, 0x02c232a0, 0x000f214d}}, Y: Field{[10]uint32{0x025186b5, 0x013d6b68, 0x03d9dbdc, 0x014b5a8e, 0x018ebc7f, 0x00c08ab4, 0x00dd8f17, 0x0344ab49, 0x02a5249c, 0x0029a13b}}}, + {X: Field{[10]uint32{0x02f006fd, 0x028c8b5e, 0x014a5605, 0x000f58f1, 0x00ec6ea0, 0x02a20466, 0x00c446fb, 0x01dadb95, 0x03abc61a, 0x00122a9c}}, Y: Field{[10]uint32{0x02403a64, 0x03e64d63, 0x00d4ecdb, 0x02dc1039, 0x035977fa, 0x033cf77c, 0x00185065, 0x002208b4, 0x02eeffb2, 0x0030a317}}}, + {X: Field{[10]uint32{0x03cc1ff1, 0x028e86d4, 0x024cbd83, 0x0034329f, 0x01263d17, 0x022eb292, 0x02d2b363, 0x000a3676, 0x03620abd, 0x001d1cc9}}, Y: Field{[10]uint32{0x0136c2c6, 0x02f5a779, 0x01f3fddf, 0x03f982ea, 0x00927a88, 0x03008edb, 0x02ef7ce5, 0x02827cfc, 0x030ce8df, 0x00328477}}}, + {X: Field{[10]uint32{0x01698522, 0x01cb16e5, 0x0002eb86, 0x0095491f, 0x01a40427, 0x0053fa40, 0x03dc9188, 0x016455d9, 0x0309520e, 0x003adc6a}}, Y: Field{[10]uint32{0x0148e995, 0x027d5b93, 0x031eb874, 0x0007001f, 0x01c81b69, 0x0008ecaa, 0x02563cb2, 0x016ce3b5, 0x02e0a7e9, 0x0017eb5e}}}, + {X: Field{[10]uint32{0x02f5be6b, 0x0110dc5f, 0x021cef84, 0x0256595d, 0x02af5e86, 0x02c5e731, 0x02da74be, 0x00f7d5cb, 0x03f6c776, 0x000ac406}}, Y: Field{[10]uint32{0x03140ce9, 0x03fa188f, 0x02597067, 0x0065fe26, 0x01f66647, 0x03c96108, 0x014629fe, 0x0068f663, 0x02c84e1d, 0x00003745}}}, + {X: Field{[10]uint32{0x020ab337, 0x02910d9b, 0x033ebca2, 0x03fa3cec, 0x0213976a, 0x017a06e8, 0x032b0507, 0x0195494c, 0x03a82c66, 0x0028267b}}, Y: Field{[10]uint32{0x01136c07, 0x02a66f57, 0x013abdc0, 0x02d796dd, 0x02fb1e33, 0x0049ab32, 0x016c7faa, 0x03cacf77, 0x017b5cf1, 0x003e20e5}}}, + {X: Field{[10]uint32{0x0362f95d, 0x02f267e2, 0x00f153d5, 0x03340bd6, 0x018cc107, 0x01c2f7ac, 0x032ab6d4, 0x00f3a56d, 0x0056a61c, 0x003d0e5a}}, Y: Field{[10]uint32{0x029f6133, 0x01db005b, 0x02567cfd, 0x03cf87bc, 0x03df81c2, 0x00c9d398, 0x03240caf, 0x02c2c019, 0x011aa8ed, 0x001b8fab}}}, + {X: Field{[10]uint32{0x014050c0, 0x038e1fda, 0x00008bd5, 0x01f12516, 0x0353215b, 0x0124f600, 0x00aabe5a, 0x02ec6128, 0x019726aa, 0x00369cc8}}, Y: Field{[10]uint32{0x01a0eeb6, 0x0211813a, 0x01b4666d, 0x01339f38, 0x019489af, 0x017a5538, 0x00b987d8, 0x012da1af, 0x03291772, 0x003881d7}}}, + {X: Field{[10]uint32{0x000a6792, 0x01359be6, 0x02f4575f, 0x0345343c, 0x018fea44, 0x025d0080, 0x0259c09b, 0x01860fd0, 0x021e1959, 0x002645c6}}, Y: Field{[10]uint32{0x01219a4f, 0x01d9ec5d, 0x03f5f27a, 0x034b9d81, 0x0066af1b, 0x0381efb0, 0x032cbd80, 0x03bbcf9f, 0x000c83e1, 0x00148ae1}}}, + {X: Field{[10]uint32{0x018cf08f, 0x034d329d, 0x0323f8f0, 0x03da44cc, 0x001db7bc, 0x01122270, 0x008997a9, 0x013cd890, 0x02848a2c, 0x000d4f31}}, Y: Field{[10]uint32{0x0267ebe7, 0x01449373, 0x01fa243d, 0x0051b839, 0x0097effd, 0x000a0d32, 0x02b283f7, 0x000559f8, 0x0062f4ba, 0x0006196f}}}, + {X: Field{[10]uint32{0x02312852, 0x0090b75e, 0x026d5deb, 0x00f755e8, 0x01b9ed7e, 0x02dbf330, 0x027c77f1, 0x034f4e39, 0x003b5053, 0x0022c5a6}}, Y: Field{[10]uint32{0x005d47c6, 0x03217976, 0x00e9fbe6, 0x034b1ca8, 0x000caeb3, 0x03fd26b2, 0x02adeedc, 0x014f4e55, 0x0392fa59, 0x0012764f}}}, + {X: Field{[10]uint32{0x010cabc9, 0x0381191d, 0x002ef505, 0x00c0eeb0, 0x02efb367, 0x020fed88, 0x03b25130, 0x00c9f089, 0x02a4b1da, 0x001a3d77}}, Y: Field{[10]uint32{0x03d31782, 0x01a263f8, 0x0350c435, 0x0115c72d, 0x02146de0, 0x01b271d0, 0x01257744, 0x012e76bb, 0x039c5d62, 0x00099d03}}}, + {X: Field{[10]uint32{0x020c699b, 0x02ec8080, 0x01244e74, 0x001a6156, 0x03cc9367, 0x008229b5, 0x019d8bd7, 0x03c03238, 0x007fc3ac, 0x003ebd48}}, Y: Field{[10]uint32{0x02f1936c, 0x019282f3, 0x03eebb85, 0x009c2181, 0x03d42c15, 0x01c77a39, 0x00186ac9, 0x031b952b, 0x004617a6, 0x003eaded}}}, + {X: Field{[10]uint32{0x00d17630, 0x03d4207a, 0x004a2bca, 0x00828998, 0x02917c04, 0x00bc0685, 0x0204707a, 0x0316f4f6, 0x0291b541, 0x0030f46a}}, Y: Field{[10]uint32{0x00d9ce27, 0x03450d7f, 0x02c64d8c, 0x028d1324, 0x01c9b631, 0x0397ded1, 0x02d7ce54, 0x031017c1, 0x006e5a58, 0x0016d5e0}}}, + {X: Field{[10]uint32{0x02c8db1a, 0x03267ea2, 0x01455623, 0x016bf8b0, 0x0254b5bd, 0x0246cc3c, 0x00db5263, 0x02e48114, 0x02354970, 0x0008c9e2}}, Y: Field{[10]uint32{0x00e1888b, 0x03b91064, 0x0144d55d, 0x01afef48, 0x03357048, 0x018150b7, 0x0093b746, 0x02791c6b, 0x01dae8df, 0x00219360}}}, + {X: Field{[10]uint32{0x038c0146, 0x01d97151, 0x02d25485, 0x00ac3b2b, 0x017c12c3, 0x02773440, 0x00de4ab2, 0x0329341d, 0x018133cb, 0x00180bd8}}, Y: Field{[10]uint32{0x027aa968, 0x02791800, 0x0011f91c, 0x010b39a8, 0x019ffab3, 0x0266e721, 0x03d2da15, 0x030d43dd, 0x03b7279e, 0x001310b3}}}, + {X: Field{[10]uint32{0x01843ee9, 0x03b2ab49, 0x02690fd4, 0x02af1e58, 0x03c545a9, 0x0373233f, 0x002aa463, 0x030ec976, 0x03c70126, 0x00077133}}, Y: Field{[10]uint32{0x03fedeb1, 0x0097986c, 0x003ac182, 0x02e4aa6d, 0x036002b1, 0x0178cabe, 0x0020f172, 0x0155d4d6, 0x01825c53, 0x002a4d5e}}}, + {X: Field{[10]uint32{0x0235af82, 0x0308f3f3, 0x028b33c6, 0x037e2c13, 0x01887a95, 0x032997f1, 0x00d99108, 0x02f1e453, 0x01216e02, 0x000da53c}}, Y: Field{[10]uint32{0x00555d88, 0x00d9090e, 0x006d1d1c, 0x03266e0e, 0x02c61e57, 0x021162e7, 0x016e7428, 0x0065db51, 0x0291b1c4, 0x001fffb8}}}, + {X: Field{[10]uint32{0x01f1bdbf, 0x0248ac87, 0x003b4b65, 0x00eea483, 0x00457be0, 0x03c1b0b1, 0x00725e0a, 0x019081ee, 0x0275a959, 0x001d0eb6}}, Y: Field{[10]uint32{0x000f908f, 0x035c5d6d, 0x026c0b16, 0x03e4e6c4, 0x035629b9, 0x00b706d0, 0x00c23ed9, 0x03176027, 0x01b55ac4, 0x0023cae0}}}, + {X: Field{[10]uint32{0x02420085, 0x02bdf5ac, 0x0394f210, 0x00b89b5b, 0x00f047cf, 0x0011181f, 0x00c42d7f, 0x03129ee7, 0x03977c7c, 0x0002ffa4}}, Y: Field{[10]uint32{0x02373d64, 0x00241beb, 0x01d92126, 0x03fa80b8, 0x01666c3d, 0x037b94f5, 0x02f2b510, 0x03720c07, 0x00598f80, 0x00189758}}}, + {X: Field{[10]uint32{0x03240eb9, 0x01b62e46, 0x01f8373e, 0x03ff21e5, 0x01cb56eb, 0x0219e86b, 0x01447517, 0x011b230a, 0x000e6ee6, 0x0021b00b}}, Y: Field{[10]uint32{0x005be4ed, 0x0299abf2, 0x037b40bf, 0x01224591, 0x0159d39f, 0x03d5be02, 0x02af5290, 0x004262dd, 0x029fda4b, 0x001966d7}}}, + {X: Field{[10]uint32{0x007bfda4, 0x02a48a4e, 0x02ce5dc3, 0x011d2e0a, 0x026c4f8f, 0x02a13719, 0x01d357d3, 0x0007a665, 0x0045857f, 0x000eca04}}, Y: Field{[10]uint32{0x02e9fd4c, 0x02039ff4, 0x00f8a16d, 0x008cfd40, 0x01e318a1, 0x03cc4f6b, 0x007c42f1, 0x0055091f, 0x032ccdeb, 0x00265209}}}, + {X: Field{[10]uint32{0x02fc47c0, 0x0294a13f, 0x007a3da9, 0x02380cc2, 0x02985903, 0x01b5bfca, 0x004d33d4, 0x025e7c14, 0x01d3b54d, 0x00337733}}, Y: Field{[10]uint32{0x016683b8, 0x00ebad01, 0x00321213, 0x02469fac, 0x010196c9, 0x001f7759, 0x0191e5e8, 0x004f0513, 0x03f83693, 0x0027ca84}}}, + {X: Field{[10]uint32{0x030e16d7, 0x014b0d21, 0x00088403, 0x027ccdc2, 0x018f8c2e, 0x0008c9c4, 0x034462bd, 0x00f76fb8, 0x0102a602, 0x00260401}}, Y: Field{[10]uint32{0x0169b9cb, 0x0253a406, 0x01a5747a, 0x019af5c8, 0x004cf8fb, 0x0152a13b, 0x0381c084, 0x00ecec78, 0x02f469af, 0x0006a2ff}}}, + {X: Field{[10]uint32{0x01978179, 0x0088f966, 0x02316c90, 0x03e6cd77, 0x03c26092, 0x02e08492, 0x00168479, 0x005e6c24, 0x017db2fc, 0x0022dd9d}}, Y: Field{[10]uint32{0x02b16f05, 0x03e69cd0, 0x009606ea, 0x01a07a2d, 0x01ee4492, 0x00459cc8, 0x01a71a6a, 0x01972950, 0x0326588e, 0x0011fabc}}}, + {X: Field{[10]uint32{0x02cc3b43, 0x015c759f, 0x02771bf2, 0x02cb557a, 0x0045c83b, 0x01ac3187, 0x004d8a94, 0x02d981bd, 0x03dc897f, 0x00399bb5}}, Y: Field{[10]uint32{0x0214dcbe, 0x03316a7c, 0x01810518, 0x03e64dd3, 0x017f1745, 0x0229016f, 0x00ffd470, 0x03fd3b1b, 0x039b8a9f, 0x00394dbd}}}, + {X: Field{[10]uint32{0x02bc88c8, 0x01aa84fc, 0x020d2262, 0x00241a82, 0x01ead632, 0x03bd7045, 0x02ad0656, 0x002e7e33, 0x0192cc9c, 0x00381801}}, Y: Field{[10]uint32{0x035a584f, 0x035472df, 0x03f7ca42, 0x01775527, 0x02e7f75f, 0x0304e105, 0x02552544, 0x01c1745b, 0x00b78b84, 0x0018a365}}}, + {X: Field{[10]uint32{0x01152767, 0x016b01c6, 0x02cfbffc, 0x0109ace4, 0x0362db2e, 0x018f8bc1, 0x0358fc70, 0x00975331, 0x0242a9cf, 0x0006c2bc}}, Y: Field{[10]uint32{0x0056a2be, 0x010ff0f2, 0x035a0ed0, 0x012c0be5, 0x00592dec, 0x024d5012, 0x0128da0d, 0x0015668f, 0x02a5eec3, 0x000ceba2}}}, + {X: Field{[10]uint32{0x035acb7d, 0x02a935ab, 0x00ed5439, 0x0137396f, 0x009b8092, 0x02c2f2fc, 0x005beeed, 0x01fb68d4, 0x03aa142f, 0x0038813f}}, Y: Field{[10]uint32{0x018911ba, 0x0136d257, 0x0159e692, 0x00c11e69, 0x03a02f70, 0x03bcb08a, 0x02acdd1a, 0x005466b7, 0x019b98e1, 0x0028a013}}}, + {X: Field{[10]uint32{0x01515ed5, 0x03c26683, 0x0196469c, 0x03d24a11, 0x00a35431, 0x00c5cf53, 0x00ea1fc1, 0x00c7d885, 0x02676515, 0x002bf103}}, Y: Field{[10]uint32{0x00b648e0, 0x01b4ccc0, 0x01b45589, 0x001f34ef, 0x035e6297, 0x02c13499, 0x02e85963, 0x0037a4ca, 0x02f41e48, 0x0015fbdb}}}, + {X: Field{[10]uint32{0x03e8d226, 0x037b88aa, 0x001d4690, 0x00197298, 0x01729634, 0x017038f2, 0x00588b04, 0x01907e00, 0x03db747b, 0x001654e2}}, Y: Field{[10]uint32{0x002d4438, 0x000c773b, 0x00e28652, 0x00a174de, 0x0352ca7a, 0x037a5821, 0x026547a3, 0x0270d530, 0x006a3c91, 0x00280c12}}}, + {X: Field{[10]uint32{0x0197ed8f, 0x0391a6aa, 0x026f1efb, 0x01106012, 0x02b964cf, 0x03b6ca9d, 0x03a4baeb, 0x0100a318, 0x034fc38d, 0x001aa474}}, Y: Field{[10]uint32{0x01073260, 0x00075d76, 0x02a00f2b, 0x034729b3, 0x0345f221, 0x034f9cfa, 0x02ead10d, 0x0149d0b4, 0x00836a0b, 0x000c9403}}}, + {X: Field{[10]uint32{0x02c28d61, 0x018330a2, 0x02ee8f77, 0x02772170, 0x00332ae3, 0x038870d1, 0x01c44ab5, 0x025fba5f, 0x0287b11d, 0x00249839}}, Y: Field{[10]uint32{0x0223e778, 0x03a61458, 0x01d1892c, 0x020e8cf9, 0x01c1d13e, 0x03736765, 0x0124f5e2, 0x01953bdc, 0x033de8d8, 0x0003d1f7}}}, + {X: Field{[10]uint32{0x00fe3cba, 0x02410413, 0x03e06a03, 0x030f73e6, 0x00b48820, 0x02d3ca4f, 0x038561f4, 0x03cc07d9, 0x03337a66, 0x000d2439}}, Y: Field{[10]uint32{0x029bbd6c, 0x0281c857, 0x006f1f5e, 0x00d94ca2, 0x02a81695, 0x016eec8a, 0x03876368, 0x01c2b1d3, 0x02797edb, 0x00125646}}}, + {X: Field{[10]uint32{0x0107b4a0, 0x0029a023, 0x03c8a6ec, 0x02049e00, 0x01d71d7a, 0x02a55228, 0x00b1311e, 0x02a68df7, 0x00fe1f47, 0x0025ca7d}}, Y: Field{[10]uint32{0x0317f896, 0x02e2bcba, 0x0386c2dc, 0x01cffa2a, 0x01c8f03d, 0x008bbfa9, 0x03ee569e, 0x03f5ca39, 0x01d4ccc4, 0x0015b869}}}, + {X: Field{[10]uint32{0x029c2caf, 0x036360eb, 0x034b1c37, 0x02d60332, 0x005e694e, 0x0200113c, 0x03d77a66, 0x0108f473, 0x004f06da, 0x002bd8e4}}, Y: Field{[10]uint32{0x03e110b2, 0x006cc1b6, 0x02400f3d, 0x003df1e6, 0x01b8cfaf, 0x029f8bb7, 0x01fa10b4, 0x02e52345, 0x002f5fe2, 0x001b7b37}}}, + {X: Field{[10]uint32{0x00435a3f, 0x00bede8b, 0x031f2f24, 0x03831ede, 0x01403cf0, 0x01f0a53f, 0x0274edf8, 0x007c8688, 0x03721f4a, 0x002589c7}}, Y: Field{[10]uint32{0x025adddf, 0x03d6c872, 0x01e7951c, 0x01deb904, 0x01719400, 0x027dba52, 0x03bbca44, 0x033f54af, 0x00731fc8, 0x0019bfef}}}, + {X: Field{[10]uint32{0x03717c7d, 0x03653292, 0x0296a95b, 0x00f1fb89, 0x00dfa5a1, 0x02ea3658, 0x0027287e, 0x03168056, 0x02151f0c, 0x00290bbc}}, Y: Field{[10]uint32{0x00046fec, 0x0257dad4, 0x03a1ba49, 0x01c82d48, 0x02e32431, 0x0051823b, 0x02969298, 0x029644c8, 0x02d45f08, 0x00179247}}}, + {X: Field{[10]uint32{0x0062e5e4, 0x00b01eee, 0x02c2f7fb, 0x00ac4d6f, 0x00fc4ce9, 0x022f89e0, 0x019c2896, 0x029d5f61, 0x01ede770, 0x00064ecf}}, Y: Field{[10]uint32{0x00716700, 0x0066d7bc, 0x0177522d, 0x01026031, 0x02d1d1d7, 0x02378155, 0x01d5cd13, 0x01cd7828, 0x03baffbb, 0x00064b12}}}, + {X: Field{[10]uint32{0x001e8dc7, 0x0029f3a3, 0x02029e29, 0x02c389d5, 0x02054084, 0x01bfbbcf, 0x03b4fc82, 0x0113933c, 0x0075da6f, 0x00333e68}}, Y: Field{[10]uint32{0x0235a183, 0x02c83266, 0x03a67bf6, 0x0247ffa6, 0x020a5d64, 0x00208671, 0x020f0a23, 0x030c2e40, 0x004dccf2, 0x003413e1}}}, + {X: Field{[10]uint32{0x025b0140, 0x039eb3b4, 0x03831873, 0x02e5b738, 0x00d3ddff, 0x02614c82, 0x00ec69ef, 0x02ed0fd8, 0x025b1d69, 0x001fafa8}}, Y: Field{[10]uint32{0x03ec3d65, 0x00f9f293, 0x01d16fc8, 0x01d62557, 0x002a9483, 0x004e8fce, 0x031a47d0, 0x0358dd53, 0x02f2bf87, 0x00091502}}}, + {X: Field{[10]uint32{0x00a038c7, 0x004718e1, 0x02e45d71, 0x03af5ca6, 0x02674662, 0x00e11e2d, 0x03ff0380, 0x006c066d, 0x034ac2a3, 0x0000327a}}, Y: Field{[10]uint32{0x01f32240, 0x02f77b60, 0x016a6e26, 0x02cca744, 0x0312f6e8, 0x022b90a8, 0x032b90d7, 0x00fd3afb, 0x003dcaed, 0x001f8bb8}}}, + {X: Field{[10]uint32{0x01acd867, 0x03651bf9, 0x007b87fe, 0x00361b15, 0x02cd0b29, 0x03f61ed2, 0x0323bc5c, 0x013a7a9e, 0x020c08c8, 0x00115d5b}}, Y: Field{[10]uint32{0x00acdd1f, 0x0076829c, 0x00413461, 0x00b216c2, 0x0031326e, 0x01f705b4, 0x03984c3d, 0x03005cf6, 0x022ce577, 0x00270fd4}}}, + {X: Field{[10]uint32{0x03e3c0da, 0x0036dfc4, 0x0225ce4a, 0x039c42ae, 0x0359438d, 0x0197891d, 0x009e3416, 0x0358db1e, 0x008121be, 0x0006f561}}, Y: Field{[10]uint32{0x0386a90b, 0x03d0d451, 0x008e7350, 0x035e5627, 0x00ffd4d6, 0x001e1d0c, 0x028a7b75, 0x014e658e, 0x0097bf90, 0x0032c3ae}}}, + {X: Field{[10]uint32{0x01324dc1, 0x01f3b676, 0x00063054, 0x038333e9, 0x0032eda7, 0x01677663, 0x02a80a97, 0x026e9612, 0x022c8e80, 0x003c6655}}, Y: Field{[10]uint32{0x0008d1d0, 0x026b1ead, 0x00f32400, 0x0047374e, 0x022f7ea8, 0x00f28537, 0x01dbcea3, 0x00126252, 0x02ad7643, 0x000cd467}}}, + {X: Field{[10]uint32{0x005ea6f3, 0x00f4f53d, 0x03559674, 0x03a61372, 0x02975319, 0x00162548, 0x02ac3b93, 0x01f707d5, 0x0110e9e3, 0x001fed3a}}, Y: Field{[10]uint32{0x03c960ee, 0x00341399, 0x0062855f, 0x029ef553, 0x005f4d94, 0x038c80f7, 0x02b59bcf, 0x03b273cd, 0x003c0cdb, 0x0002dd28}}}, + {X: Field{[10]uint32{0x006c03e6, 0x03ea7fa2, 0x031364c6, 0x0229ae73, 0x03c1a1d6, 0x0137108c, 0x02270205, 0x0275e2b2, 0x00fd1983, 0x00140f42}}, Y: Field{[10]uint32{0x02448e0a, 0x00def463, 0x02f77589, 0x0355f10d, 0x02698459, 0x01cf48f7, 0x01059144, 0x03ae1ef6, 0x01db9a09, 0x00212b65}}}, + {X: Field{[10]uint32{0x01e1e713, 0x025820d4, 0x02c25091, 0x032390be, 0x0162db42, 0x021c5629, 0x02d0deac, 0x034f8961, 0x0204e6ae, 0x000cd724}}, Y: Field{[10]uint32{0x00c1c2f9, 0x027c2b3d, 0x01ce67ef, 0x01774d06, 0x0049b60c, 0x004bf761, 0x00849d42, 0x02fb8a50, 0x01bb10f8, 0x00056cd6}}}, + {X: Field{[10]uint32{0x0034bc9f, 0x01104d0a, 0x035ef30c, 0x0262738f, 0x00f218c2, 0x01c82ed4, 0x01117df5, 0x00567e08, 0x01cbe0f7, 0x002e9a39}}, Y: Field{[10]uint32{0x00fa5d72, 0x01ef2510, 0x017f3ca5, 0x011dc719, 0x03101ff4, 0x0104a8a1, 0x005a2ede, 0x01393bfd, 0x03dd0ff3, 0x000ab096}}}, + {X: Field{[10]uint32{0x037e6baa, 0x017b0821, 0x03a0a02a, 0x010e8791, 0x03446d79, 0x00e71252, 0x00202677, 0x0210c163, 0x0313311d, 0x0024f5b9}}, Y: Field{[10]uint32{0x001a0856, 0x01a99748, 0x0324fdb5, 0x0055f353, 0x01e10bf6, 0x02d427e7, 0x00710410, 0x03f49b81, 0x019c99a2, 0x001665f0}}}, + {X: Field{[10]uint32{0x03397172, 0x01402917, 0x00c22ac7, 0x009a3b30, 0x00cb8f46, 0x031746da, 0x0284fbe0, 0x01e829ce, 0x001b5cc7, 0x001ea52f}}, Y: Field{[10]uint32{0x0178bee5, 0x03dad341, 0x02cef34a, 0x025405b7, 0x03032d36, 0x02fb7d34, 0x01c9f8c1, 0x0354a9c6, 0x006e82a4, 0x0004a307}}}, + {X: Field{[10]uint32{0x0021b809, 0x00f165b2, 0x01c54c21, 0x00b6eb2b, 0x0375fbe5, 0x01bcf919, 0x02ec848f, 0x020f6517, 0x01a7c193, 0x003c0c7b}}, Y: Field{[10]uint32{0x03cabab8, 0x0031dd88, 0x03ea0517, 0x00dabe5a, 0x01eb505d, 0x0394bc65, 0x001e2e7e, 0x0393d76e, 0x010d1c17, 0x002d29e3}}}, + {X: Field{[10]uint32{0x0039907c, 0x02df5c08, 0x0360857a, 0x01d58329, 0x010ce9f3, 0x01d34065, 0x00cb924c, 0x03820b75, 0x02cd5c17, 0x0021bbc6}}, Y: Field{[10]uint32{0x00f3bb3c, 0x0383b093, 0x03de1ef7, 0x0172731d, 0x0136c310, 0x01b559cf, 0x02d34b10, 0x022b2509, 0x013db907, 0x001a4da8}}}, + {X: Field{[10]uint32{0x03c6d720, 0x005ad832, 0x00bc9409, 0x0324aac4, 0x006d24ee, 0x00a853ee, 0x039beeb6, 0x00e8d526, 0x00c9c78e, 0x003f3adb}}, Y: Field{[10]uint32{0x03f7583d, 0x005e1cdd, 0x0162f08b, 0x024ba9d5, 0x009f8d92, 0x004b2946, 0x03697015, 0x007c7382, 0x00245f56, 0x001f0b98}}}, + {X: Field{[10]uint32{0x03a5c8d9, 0x0084fbb7, 0x00f3ecd2, 0x01b8ec50, 0x00d475e3, 0x02bf90e0, 0x0026d837, 0x03cd207d, 0x011b9a36, 0x0028767b}}, Y: Field{[10]uint32{0x03a558a0, 0x016fc1f7, 0x00c6007d, 0x00ef9aaa, 0x0078bd5e, 0x03a7fb95, 0x002cb779, 0x00fca7b0, 0x017ca127, 0x000da0f2}}}, + {X: Field{[10]uint32{0x01bd48c7, 0x03e43814, 0x03dac844, 0x0269dfac, 0x013e8f62, 0x022bff28, 0x01bbdc75, 0x03b55785, 0x01996311, 0x0036637a}}, Y: Field{[10]uint32{0x00ef2a22, 0x01127ca1, 0x037cc07d, 0x014e5a75, 0x02693943, 0x01de3970, 0x011b8100, 0x023b9da3, 0x014d272a, 0x0022bd86}}}, + {X: Field{[10]uint32{0x019aac60, 0x022e8fea, 0x023edbee, 0x008e625e, 0x0060f4d2, 0x0197e014, 0x031ba80d, 0x03e8a6db, 0x01b7cd6a, 0x001e0ca3}}, Y: Field{[10]uint32{0x02fc5efb, 0x031ea79d, 0x02f01f35, 0x02171265, 0x02629f81, 0x0384d910, 0x023377f4, 0x00eb1204, 0x016f1d14, 0x0038df92}}}, + {X: Field{[10]uint32{0x0336db5e, 0x0347d9b8, 0x02117223, 0x033f36c9, 0x005d9747, 0x02ca7b9b, 0x001e1c09, 0x02bc2cdf, 0x0093031f, 0x000f5c05}}, Y: Field{[10]uint32{0x037600ad, 0x033474f9, 0x008b6648, 0x0316e1fe, 0x03414ea3, 0x02d3a774, 0x01f7ce0a, 0x02c82ad0, 0x01408311, 0x00347a64}}}, + {X: Field{[10]uint32{0x02288628, 0x03dd8ab3, 0x03a96e90, 0x021bf6fd, 0x000e2239, 0x02953b31, 0x015ba2a7, 0x0352ac2f, 0x00c047e0, 0x003d866b}}, Y: Field{[10]uint32{0x001564f2, 0x013b299e, 0x01de68fa, 0x037f3bed, 0x02f9cdcc, 0x039ff07b, 0x016a2d70, 0x017443f2, 0x023de154, 0x003c93ad}}}, + {X: Field{[10]uint32{0x02d0a2d2, 0x02f0032a, 0x03489a1d, 0x00d678be, 0x0291718f, 0x03de5ff3, 0x004a8514, 0x016800cd, 0x01b871f8, 0x00332a02}}, Y: Field{[10]uint32{0x0090b037, 0x0047045a, 0x012f712b, 0x03b4e0a6, 0x03aba642, 0x007d8be5, 0x018f260a, 0x020d6489, 0x02b83565, 0x002df5ca}}}, + {X: Field{[10]uint32{0x01c81958, 0x00fb471f, 0x03eeaa7d, 0x016d4706, 0x01aa26c4, 0x003ee851, 0x034eec03, 0x014076be, 0x0366ee2c, 0x002ef465}}, Y: Field{[10]uint32{0x035250fa, 0x03c6b3f7, 0x03cfeb98, 0x033b0cbb, 0x036c1ca4, 0x01c9110b, 0x030a6e89, 0x0184b9f3, 0x01ff70b3, 0x002f1c27}}}, + {X: Field{[10]uint32{0x001cfadd, 0x01352bfb, 0x025f79c3, 0x03a0e9a2, 0x01ca8f0e, 0x01912a97, 0x03a19381, 0x02065c99, 0x00a0e4a5, 0x001a9bf7}}, Y: Field{[10]uint32{0x02732081, 0x0145fa74, 0x00c36db6, 0x01bf2b6c, 0x006bd7ff, 0x01faf31c, 0x0104298d, 0x01495730, 0x02367658, 0x0030a2c4}}}, + {X: Field{[10]uint32{0x035c8006, 0x014c85b7, 0x00be02c5, 0x00ac05e9, 0x029564af, 0x014bc2b7, 0x03d693de, 0x00688bb9, 0x03e1fd40, 0x000248b8}}, Y: Field{[10]uint32{0x0088f757, 0x03ac7105, 0x004aa3b9, 0x031c82e5, 0x03696841, 0x032a2889, 0x0379e0c5, 0x012902e6, 0x0065aae8, 0x0029ec40}}}, + {X: Field{[10]uint32{0x0276eac8, 0x020be629, 0x01490383, 0x036b5225, 0x03aff8a6, 0x00f2f4ec, 0x02bd9dae, 0x02d54fe4, 0x024e3526, 0x0014ffeb}}, Y: Field{[10]uint32{0x01f8c6f4, 0x0390fb66, 0x03d23cfd, 0x024b115b, 0x009e6652, 0x033a183b, 0x023b2228, 0x0202e0f4, 0x00aeb51f, 0x00207f7f}}}, + {X: Field{[10]uint32{0x0203d119, 0x009e1882, 0x015b9772, 0x031ad574, 0x027c2e70, 0x00a73f92, 0x03e70289, 0x025be274, 0x01d1c945, 0x00052837}}, Y: Field{[10]uint32{0x036dd086, 0x03c7efa5, 0x02e83806, 0x03bed663, 0x007e8c94, 0x00f71956, 0x03e14835, 0x0074777d, 0x0071febe, 0x000ad770}}}, + {X: Field{[10]uint32{0x0168c8f9, 0x0143c78f, 0x03f4dc01, 0x00a9ce7b, 0x00bebe27, 0x032bcee4, 0x01a25428, 0x03cd6ed4, 0x000dfb74, 0x001cda09}}, Y: Field{[10]uint32{0x00a7a27f, 0x02ea17b9, 0x03cd8fd2, 0x01cac572, 0x0321801a, 0x031191a7, 0x00c71687, 0x03a0b9dd, 0x0317b4c5, 0x00254e4a}}}, + {X: Field{[10]uint32{0x00580560, 0x00340408, 0x0079e640, 0x0041ef16, 0x035fbdb6, 0x0105a217, 0x016825e2, 0x02ce748e, 0x0053b9ea, 0x001302a0}}, Y: Field{[10]uint32{0x03db5427, 0x02a5eef5, 0x002f093c, 0x0099820f, 0x02f5a6f8, 0x01022de7, 0x03f67f65, 0x0394c985, 0x02a75b7d, 0x00216888}}}, + {X: Field{[10]uint32{0x01dabbf8, 0x00c814cf, 0x00a1e91e, 0x01abd5e4, 0x026751a2, 0x00cf7f2c, 0x01447a49, 0x03e2b2f6, 0x02a824a6, 0x00328359}}, Y: Field{[10]uint32{0x01395d18, 0x003cca5e, 0x016b2155, 0x0020297c, 0x036f7d7d, 0x03bc0790, 0x01fd49b1, 0x00211447, 0x018d4f8b, 0x00187322}}}, + {X: Field{[10]uint32{0x01e9d6d4, 0x01629b95, 0x03a76453, 0x03dcd572, 0x01a3d7df, 0x031fec20, 0x020763b5, 0x01a8db54, 0x0375e62f, 0x00191a81}}, Y: Field{[10]uint32{0x037dbbb4, 0x006807de, 0x026f7a6b, 0x011b85f1, 0x01b11000, 0x00b24dbe, 0x01b23662, 0x00299083, 0x0044e738, 0x000f94a2}}}, + {X: Field{[10]uint32{0x0055d070, 0x000c00d9, 0x007f2303, 0x00faa044, 0x01bac77f, 0x0014b69c, 0x02d7c477, 0x02f04c50, 0x01ecf3d6, 0x0010d559}}, Y: Field{[10]uint32{0x00c9f6bd, 0x027ad369, 0x02d159fa, 0x01706ba5, 0x03ab6edc, 0x027c31c3, 0x03ca8f6c, 0x023658d0, 0x009689fd, 0x0013b54a}}}, + {X: Field{[10]uint32{0x03aa8f9d, 0x029d82e4, 0x0316fff6, 0x02b000dc, 0x037a014a, 0x018171a4, 0x01f22fee, 0x01512a94, 0x00969328, 0x00362c06}}, Y: Field{[10]uint32{0x0206edf3, 0x03dc964e, 0x020ac989, 0x020b9318, 0x01dd4127, 0x00525ed7, 0x0160719c, 0x01e6b4db, 0x0242a2b8, 0x0018fd47}}}, + {X: Field{[10]uint32{0x023d48d7, 0x039511b5, 0x0399a21e, 0x02ed1fc1, 0x0283a30a, 0x03c60b97, 0x02f6f2b6, 0x00c14a52, 0x01504a9b, 0x002e51d6}}, Y: Field{[10]uint32{0x002fb876, 0x0241a243, 0x01018042, 0x01f0d2b8, 0x02968027, 0x038d62b5, 0x03896769, 0x0266fde6, 0x002837a8, 0x0032f1d0}}}, + {X: Field{[10]uint32{0x038e0ef0, 0x01a89c7f, 0x02f0fc3e, 0x019c6c98, 0x01d521b4, 0x0121084d, 0x0201b5e3, 0x0356fb16, 0x00492972, 0x00050c5f}}, Y: Field{[10]uint32{0x02069381, 0x02419470, 0x006cfc20, 0x027930d2, 0x01d318e7, 0x036d20f6, 0x02a476a7, 0x033f48b9, 0x0235d1ce, 0x00331348}}}, + {X: Field{[10]uint32{0x0144f8c6, 0x03753927, 0x005f8fcd, 0x01cd3a57, 0x0278c4b8, 0x0224a354, 0x0062ab33, 0x019fd13c, 0x03575b68, 0x0022ef6c}}, Y: Field{[10]uint32{0x0173a778, 0x025fccd4, 0x019fa90b, 0x028bb86d, 0x021279ec, 0x01f40398, 0x01a67e6c, 0x01015301, 0x03873242, 0x0034e34c}}}, + {X: Field{[10]uint32{0x006aa685, 0x002c643c, 0x014761ab, 0x03e53b4c, 0x03380b00, 0x0265b035, 0x0279786b, 0x02f9e024, 0x02f636ec, 0x001ddd7f}}, Y: Field{[10]uint32{0x0355407b, 0x025bafcb, 0x018e12a9, 0x014cae0c, 0x00342431, 0x02e21711, 0x0257d7fc, 0x03596773, 0x0273162d, 0x0014c54a}}}, + {X: Field{[10]uint32{0x01693b48, 0x0247030e, 0x0242ba74, 0x02955143, 0x00bc9b0e, 0x0279cbed, 0x02649502, 0x038ddef2, 0x03d139eb, 0x0036d792}}, Y: Field{[10]uint32{0x005a0abb, 0x025399b3, 0x00e62141, 0x003af6f9, 0x00416ca2, 0x00e209f7, 0x037ceb32, 0x025ab68c, 0x0113a5a7, 0x002991a0}}}, + {X: Field{[10]uint32{0x01c619eb, 0x013fc47c, 0x020fc241, 0x00c5c255, 0x016ebf06, 0x03c1a73c, 0x0011be39, 0x014b8bab, 0x03b0578c, 0x003aac15}}, Y: Field{[10]uint32{0x01023f67, 0x036d157f, 0x01f750cd, 0x03386031, 0x006fb041, 0x030b787a, 0x00e5c6c3, 0x02e2a116, 0x023fcf69, 0x00150880}}}, + {X: Field{[10]uint32{0x03f5e44c, 0x00460ff9, 0x02fe6d02, 0x00c90639, 0x02c231ba, 0x01944ccf, 0x02d43cc0, 0x035845f8, 0x00d3c657, 0x003a557f}}, Y: Field{[10]uint32{0x028e6b57, 0x008a3d20, 0x02369cfe, 0x03f2cb8d, 0x02973095, 0x0311b176, 0x014953a4, 0x00bc9c91, 0x02986521, 0x003743aa}}}, + {X: Field{[10]uint32{0x002d8e49, 0x01fe46c1, 0x027a72a0, 0x01cfabec, 0x03ec0f5e, 0x00759817, 0x011f596f, 0x03f0c30c, 0x005758ea, 0x0017d68f}}, Y: Field{[10]uint32{0x01cdf1a2, 0x00fbca97, 0x0090ccf2, 0x017a132a, 0x01c6d9f5, 0x02914dbd, 0x005a04aa, 0x02cbaa76, 0x00b01d1f, 0x0000f378}}}, + {X: Field{[10]uint32{0x00b99bab, 0x00b64902, 0x019c0757, 0x03c9ab48, 0x0049c82c, 0x0012bc46, 0x03fbd7ae, 0x03787bbf, 0x01e4ff0a, 0x003ede8c}}, Y: Field{[10]uint32{0x01df2a01, 0x00ac1fcc, 0x0345a550, 0x00b01cd8, 0x039e6910, 0x03918f75, 0x006bc4eb, 0x0395fbba, 0x020c431d, 0x003aa1ea}}}, + {X: Field{[10]uint32{0x03ae1ffb, 0x005de352, 0x02b44e41, 0x00f79ac8, 0x036ec18d, 0x020fb8e8, 0x01f8dd96, 0x01dde52e, 0x016aa3e8, 0x00355ec7}}, Y: Field{[10]uint32{0x000f62ee, 0x0235eaf7, 0x008ca73f, 0x015c08b6, 0x009fcb9e, 0x00f32ebb, 0x01adb0e4, 0x034bc027, 0x02d6b85b, 0x00095bff}}}, + {X: Field{[10]uint32{0x03b8f1a6, 0x02b15232, 0x00b5bbd6, 0x00cb1c2f, 0x030f7268, 0x020da5ec, 0x00fc90e1, 0x0128e3bc, 0x0052d3a2, 0x0024c9bf}}, Y: Field{[10]uint32{0x02889a2b, 0x01629bc4, 0x0330801a, 0x03095355, 0x00d7d766, 0x0267ebea, 0x01176f5c, 0x00afab48, 0x00a0cc0a, 0x00218ef4}}}, + {X: Field{[10]uint32{0x013caff4, 0x01e6d2ea, 0x036da360, 0x0354c4fb, 0x03d5d310, 0x0082b421, 0x0217e946, 0x02d7995d, 0x00d5abc9, 0x00160d8b}}, Y: Field{[10]uint32{0x022fc52f, 0x012350bd, 0x021c03da, 0x03cf098b, 0x03d6923c, 0x0390c88c, 0x03b673b2, 0x02ef635c, 0x00044e86, 0x00017ca9}}}, + {X: Field{[10]uint32{0x001738ee, 0x03f3a061, 0x03681034, 0x01a5fa68, 0x01b8c4cd, 0x02cc6358, 0x001b3a96, 0x039a3c38, 0x00b9cd06, 0x001f7522}}, Y: Field{[10]uint32{0x019782cf, 0x0267af82, 0x0010f34a, 0x03414998, 0x00d963de, 0x00f4a4a8, 0x0370846a, 0x03225f2d, 0x01ed0130, 0x003f5ea9}}}, + {X: Field{[10]uint32{0x00fe798d, 0x01419003, 0x0061df95, 0x0091aea0, 0x011fa2a3, 0x00ed05c1, 0x030d7d5a, 0x005550cc, 0x0302524c, 0x0026fde2}}, Y: Field{[10]uint32{0x00cf5a83, 0x009d5224, 0x00f48104, 0x0215da59, 0x00c7d063, 0x02d08672, 0x01d5a703, 0x01a0075e, 0x03d66d2e, 0x00167d4d}}}, + {X: Field{[10]uint32{0x02b3fc47, 0x00f70d83, 0x03c39366, 0x02dbbbaf, 0x00e71513, 0x02ef5b47, 0x01b4f879, 0x03572c63, 0x0173743a, 0x0013205a}}, Y: Field{[10]uint32{0x0141105f, 0x010b6243, 0x00254ab1, 0x03af545b, 0x0044c6f8, 0x0003e594, 0x033ef09f, 0x025002a4, 0x02ac37a4, 0x00069b71}}}, + {X: Field{[10]uint32{0x01051be8, 0x00715bec, 0x031a835c, 0x0169fc00, 0x00173f4e, 0x003ce89b, 0x02964084, 0x018d0d64, 0x03c2c748, 0x001818da}}, Y: Field{[10]uint32{0x03e88e8b, 0x03763d76, 0x01b08541, 0x01adf3e0, 0x020efc2e, 0x0346f95b, 0x024190b0, 0x00af25c2, 0x037a3aed, 0x001c69e2}}}, + {X: Field{[10]uint32{0x03f8d00a, 0x01e83cc1, 0x00a2f004, 0x00dd0329, 0x03122115, 0x03579b34, 0x0263fc94, 0x0029c1b1, 0x02dec3e9, 0x0029b9dc}}, Y: Field{[10]uint32{0x00eed520, 0x029f1cf4, 0x032ca76b, 0x00875e30, 0x00f10902, 0x002a87ae, 0x02175a81, 0x01c60529, 0x021f5c72, 0x00096e3f}}}, + {X: Field{[10]uint32{0x00b89262, 0x00c9395f, 0x026c9019, 0x004c598c, 0x031692f6, 0x02a2feeb, 0x03b4b2aa, 0x01c857ea, 0x013c6030, 0x001e7199}}, Y: Field{[10]uint32{0x02197bcb, 0x039fb4b4, 0x028f8db1, 0x00f08138, 0x03c24eaa, 0x0025572f, 0x0379da4c, 0x02525b8a, 0x0112b6b4, 0x000db57b}}}, + {X: Field{[10]uint32{0x0246cb15, 0x02a151b5, 0x0242ed4b, 0x013aaaf6, 0x034a2bdb, 0x03911530, 0x0374af4c, 0x03eb7b51, 0x032e4530, 0x000fd55a}}, Y: Field{[10]uint32{0x00fd25c3, 0x00a4e27b, 0x039e0588, 0x0360e5f3, 0x02c9fd04, 0x01717138, 0x028996bf, 0x010cc4ef, 0x03211ce8, 0x002eac74}}}, + {X: Field{[10]uint32{0x03b3913a, 0x009cedcf, 0x01dd93b7, 0x00abce18, 0x02d645c5, 0x03dcc7f8, 0x011e0fbc, 0x03fa7d78, 0x02238d21, 0x003b6966}}, Y: Field{[10]uint32{0x012bbfee, 0x006e6a1c, 0x02562416, 0x015d032c, 0x03d3cea8, 0x01d6dfad, 0x0029c06d, 0x0082e0b3, 0x03014ba3, 0x0008bc8b}}}, + {X: Field{[10]uint32{0x01e68548, 0x02909e5f, 0x02cb0c42, 0x00aea7d8, 0x033a2bea, 0x01c753c0, 0x0158adf0, 0x03ed3cda, 0x0277323d, 0x0001e87a}}, Y: Field{[10]uint32{0x024825a0, 0x030fc809, 0x01940f6c, 0x0147dbd0, 0x006d2d7f, 0x00984c63, 0x036f9766, 0x00ad7689, 0x0225ee7a, 0x001219b3}}}, + {X: Field{[10]uint32{0x0323de2a, 0x0330f668, 0x00178a0e, 0x023d8b57, 0x0233d102, 0x02421db8, 0x027c51d5, 0x035b42eb, 0x013aad62, 0x0002b43f}}, Y: Field{[10]uint32{0x003b0601, 0x0100e082, 0x02787a6d, 0x01f7b660, 0x01d16315, 0x01e4b5d8, 0x034a64eb, 0x011a7d53, 0x00c59672, 0x00223809}}}, + {X: Field{[10]uint32{0x002729d3, 0x001b3718, 0x00dfd207, 0x01c6358d, 0x03ee7437, 0x02e12972, 0x016e9d67, 0x0129a55b, 0x0032f404, 0x0006fc65}}, Y: Field{[10]uint32{0x00516aa9, 0x00710c1f, 0x0292263d, 0x0270fe93, 0x034f2acd, 0x01b0dfa6, 0x02f8e3e1, 0x028681d7, 0x0200afb6, 0x0010452c}}}, + {X: Field{[10]uint32{0x0121d93b, 0x008130b8, 0x019afc35, 0x017c4b48, 0x012fb1af, 0x0002da53, 0x023b9d5f, 0x036bea2f, 0x02f20bc2, 0x00145185}}, Y: Field{[10]uint32{0x022eaf9c, 0x01cb33e4, 0x0058a740, 0x02dc1140, 0x0257ba8e, 0x0196b6fc, 0x03f4e0a0, 0x00a673d9, 0x0253608a, 0x000f973b}}}, + {X: Field{[10]uint32{0x0121a661, 0x000b685a, 0x01a1c3b0, 0x00c1aa38, 0x00fdc423, 0x033fcd39, 0x0321d181, 0x03b4c64d, 0x00e85338, 0x00238ffb}}, Y: Field{[10]uint32{0x00f686d2, 0x01993e08, 0x03b2e077, 0x010e2ccc, 0x03128945, 0x032b267b, 0x02dfc249, 0x0121ad9d, 0x034b6736, 0x002c255c}}}, + {X: Field{[10]uint32{0x03ad4447, 0x0350e329, 0x03355916, 0x02682b98, 0x016db1eb, 0x0362882e, 0x00421867, 0x007b4a4a, 0x0020df10, 0x0011b01a}}, Y: Field{[10]uint32{0x01f1afa9, 0x031eaf37, 0x0226f9ac, 0x01606f3f, 0x01d7d439, 0x0051ed4d, 0x00d1b601, 0x02dcff12, 0x00f4059b, 0x003f2a84}}}, + {X: Field{[10]uint32{0x03722b31, 0x031f6ff3, 0x02dba0fe, 0x01a470bb, 0x013fff8c, 0x02cdebdc, 0x001e406a, 0x00e42ac0, 0x01f71f9b, 0x00158cd3}}, Y: Field{[10]uint32{0x026707dc, 0x01082f1c, 0x006904af, 0x031011d1, 0x038a3724, 0x01269b24, 0x03c4b0bf, 0x03055a9c, 0x0394340d, 0x0008b410}}}, + {X: Field{[10]uint32{0x00a67c4f, 0x020998c3, 0x03d37cb8, 0x03e86d72, 0x03b2fd55, 0x03294b48, 0x03e3dc97, 0x017e3276, 0x006d8904, 0x00080b89}}, Y: Field{[10]uint32{0x017a62b1, 0x039ec828, 0x033659a2, 0x038d44f2, 0x027a6241, 0x0116201c, 0x01f661ec, 0x03c08c72, 0x03899cbc, 0x003d39b3}}}, + {X: Field{[10]uint32{0x039bd4d5, 0x008e7a66, 0x0009dece, 0x01735979, 0x03c56b63, 0x00d54bbf, 0x03c1ff94, 0x0070b3d6, 0x02e01021, 0x00320153}}, Y: Field{[10]uint32{0x03f31057, 0x008a09c5, 0x0046b46e, 0x034419e3, 0x010bf1eb, 0x02e152c1, 0x02842b43, 0x0072f379, 0x01af5160, 0x003d4145}}}, + {X: Field{[10]uint32{0x00438383, 0x00954e05, 0x004f51c6, 0x02b95be6, 0x01ea3282, 0x02e5c068, 0x01407084, 0x02d86b4a, 0x008c235e, 0x00270a5e}}, Y: Field{[10]uint32{0x0359ead7, 0x01c3b125, 0x0286c2ab, 0x010a6774, 0x00c116cc, 0x02b4c38c, 0x02469db4, 0x03bcb88d, 0x02ecefdb, 0x000c8447}}}, + {X: Field{[10]uint32{0x01a57ef8, 0x005d1706, 0x009e74bc, 0x008cd9d4, 0x02729990, 0x02530f35, 0x028dc86f, 0x030e51c1, 0x00d0b7b5, 0x0016153a}}, Y: Field{[10]uint32{0x023eb98d, 0x02dd72e9, 0x005f2345, 0x001505f5, 0x00edafec, 0x03834b4f, 0x00c41134, 0x02faf7d4, 0x01c50c06, 0x001f9e40}}}, + {X: Field{[10]uint32{0x033fef34, 0x03ea247d, 0x010b74d0, 0x03767239, 0x011104a5, 0x0151e913, 0x0046e1b3, 0x039e2681, 0x03f0f45b, 0x0022ecbf}}, Y: Field{[10]uint32{0x03b182c1, 0x02a45cdc, 0x03a7935d, 0x037dc888, 0x03efb979, 0x00e0fdd9, 0x0171e2bc, 0x00fa99b1, 0x0365a534, 0x0030ccb8}}}, + {X: Field{[10]uint32{0x00cd209e, 0x022d5863, 0x033c45ad, 0x015b71cc, 0x02992f56, 0x02d90f36, 0x0165faac, 0x00ce1e18, 0x02656ee4, 0x0003aa23}}, Y: Field{[10]uint32{0x01f0f909, 0x02a0e897, 0x006f1fd0, 0x012a10e6, 0x02af9f4f, 0x0115c971, 0x03357ab8, 0x00d0f62a, 0x00d64a7a, 0x0030e310}}}, + {X: Field{[10]uint32{0x0046295a, 0x0075aa51, 0x01ff6698, 0x02e33236, 0x02a3b18a, 0x00352e8a, 0x0322c2ee, 0x01fa984c, 0x00df857c, 0x00303075}}, Y: Field{[10]uint32{0x0172b981, 0x00bf8167, 0x02918729, 0x0123aede, 0x029a2846, 0x0326f91a, 0x02ae1dbe, 0x03bdf739, 0x01d10e8e, 0x00091c45}}}, + {X: Field{[10]uint32{0x007fc72a, 0x0380a33b, 0x0265db74, 0x0049e4ae, 0x0267b8e2, 0x02dc8faf, 0x0008d8dd, 0x00d800aa, 0x00f9407d, 0x002479a9}}, Y: Field{[10]uint32{0x005721ba, 0x0394104f, 0x0299547e, 0x02ed1e92, 0x0212e57d, 0x00841b82, 0x00e98f7b, 0x022fa173, 0x016035f5, 0x003bdab9}}}, + {X: Field{[10]uint32{0x03208454, 0x0253823e, 0x03078187, 0x000b8873, 0x0224a7a4, 0x020340d9, 0x015cf613, 0x0074d8a6, 0x02189a8c, 0x00335d25}}, Y: Field{[10]uint32{0x03af0bd9, 0x00b17b72, 0x024f6ba0, 0x00bc748e, 0x022dd6ba, 0x022bf2ae, 0x03debcf8, 0x03e44a80, 0x02be15d1, 0x003cf724}}}, + {X: Field{[10]uint32{0x02943018, 0x01d4bfe0, 0x015e9f71, 0x0196bc28, 0x0285f630, 0x013ac929, 0x004f3fa4, 0x0239c30c, 0x012d02e6, 0x00267d74}}, Y: Field{[10]uint32{0x020b8a9e, 0x01a37076, 0x01dfb611, 0x020091b5, 0x01dff9f9, 0x0028a5ec, 0x03962c9c, 0x02fccda3, 0x021ad97e, 0x00167c64}}}, + {X: Field{[10]uint32{0x01f7608f, 0x03580aee, 0x02dff7b3, 0x036e77ae, 0x01a6ac02, 0x01745c64, 0x0256b1e7, 0x01c25845, 0x0130f9c0, 0x0018f1b3}}, Y: Field{[10]uint32{0x021083f0, 0x00fffbd1, 0x017234b7, 0x03d03b9c, 0x006d8b1e, 0x02add6f9, 0x025f0a13, 0x006e3f83, 0x037370a4, 0x000b90e4}}}, + {X: Field{[10]uint32{0x01184d92, 0x0357a5d7, 0x01e9394c, 0x011c602c, 0x019e04fe, 0x01f9b06c, 0x037fc551, 0x03a84766, 0x032690a5, 0x002dd01f}}, Y: Field{[10]uint32{0x013de6d2, 0x0233df54, 0x0301aaed, 0x0200f835, 0x03828ee8, 0x0299e5b9, 0x020f7277, 0x012611d0, 0x012947dd, 0x0006e54e}}}, + {X: Field{[10]uint32{0x0383fd40, 0x03e69b78, 0x02297150, 0x023761ad, 0x02c29ce4, 0x01e94015, 0x0121e962, 0x02210375, 0x0116161c, 0x000925e4}}, Y: Field{[10]uint32{0x00b9a70b, 0x03826c0a, 0x03649143, 0x010fdee8, 0x0076f999, 0x03ec5992, 0x00d3e325, 0x0273dce1, 0x01ab3dd6, 0x0004f75c}}}, + {X: Field{[10]uint32{0x01d73b7d, 0x037a3dfe, 0x0196b6f2, 0x00651943, 0x030b4199, 0x03210542, 0x016c80d4, 0x02c9e219, 0x02c36122, 0x003c426d}}, Y: Field{[10]uint32{0x011c96ac, 0x03ab575e, 0x01c77142, 0x01ad284f, 0x01bd971f, 0x02525be1, 0x0291d4a3, 0x03553702, 0x0369bef8, 0x0029d15c}}}, + {X: Field{[10]uint32{0x01118df9, 0x038edb5a, 0x015169f0, 0x000289ad, 0x0136be99, 0x03ef42b0, 0x017c9297, 0x030dc13c, 0x03f82031, 0x00166cc0}}, Y: Field{[10]uint32{0x03d678c3, 0x0197af4b, 0x01e02d6c, 0x01b431a5, 0x01983030, 0x00d41a30, 0x008c936b, 0x009c696b, 0x00dd1666, 0x000c31f1}}}, + {X: Field{[10]uint32{0x0062fc52, 0x00e5d3b5, 0x02cd6602, 0x006b4afd, 0x01a67862, 0x01ee2132, 0x0254cd6c, 0x00436d2e, 0x019aeb39, 0x001989cd}}, Y: Field{[10]uint32{0x0110d487, 0x03115f6a, 0x010b2555, 0x0377a93d, 0x00feab83, 0x024de5de, 0x00867347, 0x01e29ff1, 0x01bad2de, 0x002f2f3e}}}, + {X: Field{[10]uint32{0x0151f1d9, 0x009e16b7, 0x0281e921, 0x00104610, 0x00ec7efc, 0x003a062b, 0x01d23059, 0x0141f672, 0x0180c4fb, 0x001dbf6b}}, Y: Field{[10]uint32{0x03a8c346, 0x03b376f8, 0x0119a18c, 0x0035ff27, 0x039b88b7, 0x01566156, 0x00adf7ef, 0x03cc1fcd, 0x03cc349c, 0x00332331}}}, + {X: Field{[10]uint32{0x01313330, 0x00ede478, 0x00700b98, 0x032d30a2, 0x037f2380, 0x02a6ebf6, 0x03ed9cc4, 0x03c2294b, 0x0006e99c, 0x0001e24d}}, Y: Field{[10]uint32{0x0111d149, 0x03e02bc9, 0x0007450e, 0x00ede96e, 0x00d0c2e8, 0x02f56e3b, 0x001acd3f, 0x03f96b42, 0x01af39ea, 0x003b0578}}}, + {X: Field{[10]uint32{0x038c81d5, 0x02c6e820, 0x039ff3bb, 0x033760e8, 0x01018f16, 0x003a0d3d, 0x013c229d, 0x0084cfb6, 0x02a4e8d0, 0x00031152}}, Y: Field{[10]uint32{0x03ac51f0, 0x00ecea1c, 0x01f5c67e, 0x039b7afd, 0x018af57b, 0x00a69b96, 0x00959245, 0x00e023d2, 0x01cf89c4, 0x002a6398}}}, + {X: Field{[10]uint32{0x02402880, 0x002d845c, 0x0327bf99, 0x03b8e55e, 0x0097dac1, 0x0108e404, 0x02ba8f96, 0x03048b74, 0x021ccbe5, 0x003fc2f0}}, Y: Field{[10]uint32{0x03bca50a, 0x0334e59d, 0x020da467, 0x03dc14a5, 0x01ecd634, 0x039117b0, 0x00cd5f89, 0x00860635, 0x009c1f7b, 0x00030d02}}}, + {X: Field{[10]uint32{0x0331c301, 0x00789e4d, 0x0373586f, 0x03a74fad, 0x003a0e61, 0x004ade3c, 0x0132e398, 0x0108ef60, 0x02e349a0, 0x00239121}}, Y: Field{[10]uint32{0x022053a1, 0x01ee6ca6, 0x0083ca8a, 0x02130422, 0x0116bbf0, 0x037088bb, 0x021866f4, 0x0098354b, 0x00d437cc, 0x00225ec9}}}, + {X: Field{[10]uint32{0x01c579e7, 0x03e96d13, 0x03584590, 0x01b04e11, 0x010bf7fb, 0x00d44227, 0x00a30d20, 0x0313a5ab, 0x017f84f5, 0x0013d329}}, Y: Field{[10]uint32{0x01e63a9e, 0x0094396b, 0x010b717d, 0x01d63ca3, 0x01336349, 0x0286e46a, 0x031cb1f8, 0x0155b0db, 0x03dc1691, 0x00354f6d}}}, + {X: Field{[10]uint32{0x03c203bb, 0x002ab633, 0x02423c76, 0x01bce22d, 0x0279b3a9, 0x02bb63ee, 0x00618300, 0x013ea417, 0x00b2d7a2, 0x003fa249}}, Y: Field{[10]uint32{0x00b056be, 0x033a8cb4, 0x0026a7e3, 0x02103ea3, 0x00e92c37, 0x02c5f82b, 0x0279df9c, 0x0038afd3, 0x0229c6be, 0x002f4c0f}}}, + {X: Field{[10]uint32{0x006abb5d, 0x03345371, 0x03fc5dcd, 0x028cc83c, 0x03008ed9, 0x014be66c, 0x005895d1, 0x031cbe1a, 0x035cf6a8, 0x000c267d}}, Y: Field{[10]uint32{0x02fc9f1c, 0x0082cba9, 0x000bc6fc, 0x0313038b, 0x0304a939, 0x02a570a9, 0x038a32c2, 0x014a7289, 0x002aec76, 0x003eed6f}}}, + {X: Field{[10]uint32{0x0072f4eb, 0x0170b727, 0x004b9741, 0x0088ab0e, 0x03432443, 0x00901727, 0x0232de01, 0x009bced9, 0x0383f841, 0x000ee4e7}}, Y: Field{[10]uint32{0x005607fb, 0x030932bc, 0x0255f1d3, 0x031fd22f, 0x01c1e602, 0x00e84e2d, 0x014cc202, 0x010e03a7, 0x0353ec45, 0x00210edc}}}, + {X: Field{[10]uint32{0x01c732d8, 0x03191b65, 0x009327b0, 0x025f5b4c, 0x00b032f1, 0x00e12a4e, 0x023cbc06, 0x038d1772, 0x02a04a50, 0x00371d41}}, Y: Field{[10]uint32{0x03d5772a, 0x0378e766, 0x039eae8d, 0x013ad88f, 0x01c6a39d, 0x0345bd0f, 0x039559a3, 0x02758a67, 0x0311f6d4, 0x003fa508}}}, + {X: Field{[10]uint32{0x03b30dea, 0x03483aa0, 0x01433f84, 0x03ed2af2, 0x003dde68, 0x01c875d7, 0x02fb61a2, 0x01a8d45c, 0x0196c699, 0x003d6931}}, Y: Field{[10]uint32{0x01f26572, 0x01a02ee7, 0x018e35ae, 0x00c3bdf7, 0x02fd783b, 0x034c2e58, 0x02ef9220, 0x03d8eeec, 0x013e77d2, 0x0005d783}}}, + {X: Field{[10]uint32{0x02a4029e, 0x02f87e6b, 0x03133cb9, 0x01a4098b, 0x01373c2f, 0x03de7d2c, 0x01222ae2, 0x00127f97, 0x00e2c499, 0x001fa40e}}, Y: Field{[10]uint32{0x0025c737, 0x01bccae0, 0x03dfe714, 0x012c888e, 0x031d7dc6, 0x015428d8, 0x00162766, 0x00d6f038, 0x026a3433, 0x000d64b9}}}, + {X: Field{[10]uint32{0x022b1f41, 0x01227ffd, 0x0050f0af, 0x00eb6482, 0x02e2cb80, 0x03e643ad, 0x0028e921, 0x03f1bf5b, 0x0373d16b, 0x00203c8b}}, Y: Field{[10]uint32{0x03503b28, 0x02f5df9e, 0x02d682a1, 0x00471c9b, 0x00370e67, 0x0133d360, 0x03e11fd2, 0x01d2f01c, 0x01d3c5ee, 0x0021c529}}}, + {X: Field{[10]uint32{0x020c897d, 0x021efebf, 0x03535fc8, 0x001f6748, 0x03007c31, 0x02e5bf82, 0x0070a58a, 0x014fe10d, 0x02e9e86e, 0x0012628a}}, Y: Field{[10]uint32{0x0001bb53, 0x033b4e99, 0x0209ec3c, 0x02754ee1, 0x037ec380, 0x02acc207, 0x020f6516, 0x01078509, 0x02b373e8, 0x0011eaa7}}}, + {X: Field{[10]uint32{0x033a010e, 0x0377cc0e, 0x03b6d960, 0x026a009d, 0x028e9c06, 0x029e31d1, 0x012c5427, 0x03861329, 0x024cd14c, 0x001806bd}}, Y: Field{[10]uint32{0x02b7fa18, 0x00734833, 0x00d59916, 0x026c00ef, 0x0156dd57, 0x00b21fbd, 0x0346c273, 0x01db4046, 0x023fca15, 0x000a4029}}}, + {X: Field{[10]uint32{0x0174a25b, 0x00d07fcb, 0x019849a1, 0x03c41775, 0x03957f2b, 0x008aa9a0, 0x018b06a8, 0x032f12b5, 0x00f07b2f, 0x0023ecb8}}, Y: Field{[10]uint32{0x01070aa4, 0x01a32d1d, 0x016e6b7c, 0x032427db, 0x0306137d, 0x0357e0ab, 0x03386f75, 0x01f3aac6, 0x03508d79, 0x001f3608}}}, + {X: Field{[10]uint32{0x0269e6d9, 0x03962bda, 0x0282c9bd, 0x02bebbcc, 0x0083468e, 0x01cb18ef, 0x01a14980, 0x0053a2d5, 0x000f0e9d, 0x000cdb5e}}, Y: Field{[10]uint32{0x023d2261, 0x008c8529, 0x00fb00b7, 0x01e7d3f8, 0x02ac3e66, 0x03f4061e, 0x02eba682, 0x02fb9ae3, 0x0004be45, 0x00024b44}}}, + {X: Field{[10]uint32{0x00d5872d, 0x011fbea4, 0x021a5e4e, 0x000f338f, 0x02b06343, 0x02c0eaba, 0x00d2cbdf, 0x021c113e, 0x0321f4d5, 0x00141eb1}}, Y: Field{[10]uint32{0x007174d9, 0x0348b20c, 0x02f0e917, 0x0254e72a, 0x009ba53c, 0x01ee0f58, 0x00550939, 0x00175e84, 0x018de7db, 0x002e268e}}}, + {X: Field{[10]uint32{0x033ba343, 0x01a22a51, 0x009a046e, 0x0132fa86, 0x00992c60, 0x019b004b, 0x0171026f, 0x03ee58a4, 0x02c13bb7, 0x00310b73}}, Y: Field{[10]uint32{0x014f7bb5, 0x007380b9, 0x0064be3c, 0x03b00d4d, 0x018fe010, 0x0104e4a7, 0x021bfe7c, 0x008f2e80, 0x0331a532, 0x0022a8dd}}}, + {X: Field{[10]uint32{0x02866a2c, 0x010651ca, 0x00417d9f, 0x02d9400e, 0x00857eed, 0x03144212, 0x026b5c45, 0x024e8b57, 0x02c3cd60, 0x002c0ba8}}, Y: Field{[10]uint32{0x03a5527c, 0x027049cb, 0x01bf86ac, 0x03a31d69, 0x03ed1d8e, 0x033f3a4e, 0x037c5058, 0x0243186e, 0x0050cea1, 0x003aed17}}}, + {X: Field{[10]uint32{0x0370d84b, 0x005f117b, 0x02db151e, 0x010566df, 0x0185626d, 0x03aad0ed, 0x03dc2c9a, 0x03b4b89c, 0x03d29f20, 0x003d3464}}, Y: Field{[10]uint32{0x02dd0974, 0x03946586, 0x027e7280, 0x01b1847a, 0x0101f84b, 0x0133695e, 0x013f8cf1, 0x00d28b12, 0x023f19b8, 0x002f6866}}}, + {X: Field{[10]uint32{0x025f1bb0, 0x01fed93f, 0x02857eef, 0x02ec7fdb, 0x03cc84f6, 0x0340c0b4, 0x0059b9e4, 0x0318add6, 0x00eb19ea, 0x0021d037}}, Y: Field{[10]uint32{0x03c6ca49, 0x023eda39, 0x01d1b1d9, 0x03780522, 0x00f2f151, 0x03ad4887, 0x01d5b6e7, 0x008168b8, 0x02b04783, 0x00029ca7}}}, + {X: Field{[10]uint32{0x00fcc9cb, 0x017a88e1, 0x03f6c92a, 0x0098da4e, 0x0050aec6, 0x011273a2, 0x010bc940, 0x027c2364, 0x024a85a2, 0x001e7b11}}, Y: Field{[10]uint32{0x02f53b39, 0x039a3a83, 0x03a2cd44, 0x01131896, 0x03a1d7c5, 0x0216aeb8, 0x02d476d0, 0x0342ca6a, 0x00f5b52e, 0x001df45c}}}, + {X: Field{[10]uint32{0x0207fceb, 0x03bf338c, 0x01238847, 0x03011622, 0x006fb3aa, 0x0157abf5, 0x000e29b2, 0x02edc72f, 0x00d5dd54, 0x0013c406}}, Y: Field{[10]uint32{0x03e7dd8c, 0x00bd938e, 0x0222224a, 0x0364b505, 0x03a64531, 0x01c7ef8e, 0x029b2a02, 0x030b9dce, 0x01e5d23c, 0x0030ca06}}}, + {X: Field{[10]uint32{0x03e969a1, 0x00181efe, 0x00eb033a, 0x02ae05e0, 0x00e53768, 0x032a1735, 0x0325de68, 0x03a17f76, 0x01362094, 0x0037efc6}}, Y: Field{[10]uint32{0x0380e563, 0x025f876b, 0x0067193d, 0x02eb82df, 0x00a2ca3a, 0x00cb7af3, 0x005f1e49, 0x00870cab, 0x035933ba, 0x00097a82}}}, + {X: Field{[10]uint32{0x01226649, 0x02ed06a1, 0x034f9b67, 0x01c41505, 0x010940a3, 0x02184912, 0x01805f10, 0x01a20cb0, 0x02c002c3, 0x00061319}}, Y: Field{[10]uint32{0x00662eaf, 0x03fb1f7e, 0x03487ec4, 0x016ea442, 0x00736f81, 0x03814c39, 0x034a24c1, 0x031e453e, 0x0244f1cf, 0x0033d8ff}}}, + {X: Field{[10]uint32{0x03043686, 0x01043d43, 0x022e0a0f, 0x0027d40c, 0x03ede9de, 0x02090b90, 0x01a8a51a, 0x03813b8e, 0x0206d386, 0x0036aacd}}, Y: Field{[10]uint32{0x0011718a, 0x01dc63b5, 0x015e5dbb, 0x0208ea75, 0x00fbb2b6, 0x03a3dba3, 0x010d0ac4, 0x01f441bf, 0x01c40ebe, 0x000302e8}}}, + {X: Field{[10]uint32{0x0204530f, 0x0330ce5f, 0x00dfa89d, 0x0059a408, 0x0026b0e2, 0x021234cd, 0x00219d1f, 0x03c94ae8, 0x034a5311, 0x0002a21f}}, Y: Field{[10]uint32{0x01edeace, 0x023de7e7, 0x03195287, 0x0113bb34, 0x02a5b4fa, 0x03680773, 0x029bff3e, 0x032b1fd0, 0x00bd8c37, 0x00169f01}}}, + {X: Field{[10]uint32{0x002d207a, 0x008fd85f, 0x0158d281, 0x001eca12, 0x024784a9, 0x0216bef3, 0x01dbfd5a, 0x03ae6135, 0x0264409f, 0x0006cc55}}, Y: Field{[10]uint32{0x03a205bb, 0x02715a2a, 0x01c37311, 0x02eaa66f, 0x0384eea5, 0x0165ff55, 0x001d4634, 0x02396961, 0x007cba34, 0x000a5cb3}}}, + {X: Field{[10]uint32{0x01fe4984, 0x037e85ac, 0x00d1f019, 0x027e0bb2, 0x016727e6, 0x035fa119, 0x035de1e0, 0x00355b57, 0x03d427c3, 0x000552b7}}, Y: Field{[10]uint32{0x020372b5, 0x0265dd4f, 0x02079981, 0x0312487c, 0x03882477, 0x01fe94b7, 0x01f61baa, 0x009e7912, 0x028a324b, 0x0016ea1b}}}, + {X: Field{[10]uint32{0x00480994, 0x03b03562, 0x02f9494f, 0x027ed130, 0x02585fe8, 0x02c6bcf0, 0x00df417c, 0x03057eca, 0x01f9fe55, 0x0037af5a}}, Y: Field{[10]uint32{0x03f9708d, 0x038f35d5, 0x03c9ef8d, 0x03fe4d17, 0x03002564, 0x03f3d85a, 0x031b8314, 0x01b493a2, 0x002155c1, 0x00263633}}}, + {X: Field{[10]uint32{0x03baf9e2, 0x01124abb, 0x0066b71d, 0x00f7edcb, 0x01e0316c, 0x01563119, 0x0055fc09, 0x0153e68a, 0x00902a7c, 0x0027f34d}}, Y: Field{[10]uint32{0x03f5d14c, 0x029a47fd, 0x00be51cf, 0x03a09926, 0x03143e1d, 0x0356ae99, 0x029e49c8, 0x02905a27, 0x0160c2b5, 0x0029eb10}}}, + {X: Field{[10]uint32{0x0143a727, 0x02fe9ce2, 0x019bbfda, 0x024bbb83, 0x00586fd7, 0x03cf79f8, 0x00fb1d2d, 0x02ba6566, 0x01f6fe4b, 0x001672b3}}, Y: Field{[10]uint32{0x020df035, 0x0348d045, 0x01acfed8, 0x031034de, 0x03624599, 0x02471213, 0x00d349e1, 0x02b45b1d, 0x01347b3e, 0x001f1cc3}}}, + {X: Field{[10]uint32{0x03fb226c, 0x008bfb01, 0x00821677, 0x01cd01ea, 0x0134e6b3, 0x012b398d, 0x03a4c9ec, 0x00765f6c, 0x03d1fb29, 0x0017386a}}, Y: Field{[10]uint32{0x023b7526, 0x0037a3c0, 0x01d3f763, 0x01bc149d, 0x030a39de, 0x03fdea06, 0x02110255, 0x0025cf62, 0x0234b407, 0x002af091}}}, + {X: Field{[10]uint32{0x0207d73c, 0x02c6a8c0, 0x01baf3af, 0x03433856, 0x01e70897, 0x02cc053d, 0x02680015, 0x002d3dbb, 0x028ebd0a, 0x003de0d8}}, Y: Field{[10]uint32{0x0039af61, 0x027e0273, 0x031df284, 0x03ee0ecb, 0x026c7a6e, 0x03d7efcc, 0x0268b6b1, 0x02e23252, 0x00fd5b96, 0x0034190e}}}, + {X: Field{[10]uint32{0x037ba0b3, 0x01659614, 0x0200c6c1, 0x011dcbaf, 0x029a988d, 0x011074ba, 0x007130db, 0x00a7b8d7, 0x02bccc72, 0x001e0c3e}}, Y: Field{[10]uint32{0x0338fa7f, 0x02aab746, 0x0157e835, 0x02249fcb, 0x0378acc8, 0x0200e8cf, 0x01c901fa, 0x0345e0f5, 0x018e6aea, 0x00127a2d}}}, + {X: Field{[10]uint32{0x03cba9e1, 0x014bead7, 0x03482062, 0x01270a3d, 0x006416d5, 0x03e692a4, 0x024399ee, 0x004a1886, 0x010ea890, 0x00324c0e}}, Y: Field{[10]uint32{0x0161cfce, 0x00443bec, 0x0019704d, 0x01f36aac, 0x023bab13, 0x0052d2f2, 0x014e8fdd, 0x0062883d, 0x03da3d06, 0x003e83a1}}}, + {X: Field{[10]uint32{0x029cd28a, 0x0308f736, 0x018b52d0, 0x02c2979d, 0x03ba0924, 0x017c03b0, 0x0149876e, 0x00645dbe, 0x00672057, 0x000a836a}}, Y: Field{[10]uint32{0x00907647, 0x0342fc3f, 0x01dd1975, 0x007b3413, 0x0390c1fa, 0x01b7c473, 0x01b4870f, 0x00256565, 0x00fc6935, 0x0025b341}}}, + {X: Field{[10]uint32{0x0046fc83, 0x00dd2cc5, 0x01c53256, 0x033b7072, 0x00f2bef6, 0x00e5a389, 0x036e92e0, 0x01606bd5, 0x01e260da, 0x003d9220}}, Y: Field{[10]uint32{0x027c8b94, 0x02dcbd43, 0x01ac3863, 0x0027e28b, 0x022aacec, 0x01247e95, 0x02f833db, 0x019fd10f, 0x005b660b, 0x002022a5}}}, + {X: Field{[10]uint32{0x0381f052, 0x005fe66a, 0x00341330, 0x02205597, 0x00c181e4, 0x00243c78, 0x03cea175, 0x017c34e8, 0x013305ec, 0x0025c2f6}}, Y: Field{[10]uint32{0x02e9fc48, 0x0050c7c6, 0x00a796ca, 0x036ce519, 0x038eb30b, 0x01730066, 0x03b6658d, 0x01dd2bf2, 0x030fe284, 0x00134749}}}, + {X: Field{[10]uint32{0x00c4779a, 0x0056f3b9, 0x03073354, 0x021824a0, 0x032c0588, 0x0172b465, 0x023ecfdf, 0x01507d1c, 0x033124c4, 0x0037fa52}}, Y: Field{[10]uint32{0x0140e23b, 0x0169eae5, 0x00b1c185, 0x03da2c65, 0x01d047af, 0x034d00f1, 0x03afe8c5, 0x0181aa83, 0x0253d547, 0x00330a0f}}}, + {X: Field{[10]uint32{0x018df800, 0x00e8e7a1, 0x007e3bf3, 0x03463dc1, 0x0216c8bd, 0x021cdf43, 0x0230bbad, 0x0396523e, 0x0379673a, 0x003c604c}}, Y: Field{[10]uint32{0x007d294a, 0x011102ea, 0x015d2ed5, 0x03630921, 0x0220bfb9, 0x002d347c, 0x0008d50d, 0x00b6fe6c, 0x01a6139a, 0x002b34b0}}}, + {X: Field{[10]uint32{0x01423740, 0x001810db, 0x00f3ec21, 0x025e70da, 0x008890ec, 0x03036c32, 0x0192bd01, 0x006f7d44, 0x0156fb63, 0x003d3ef0}}, Y: Field{[10]uint32{0x03b7149f, 0x02409b07, 0x03f4b4f6, 0x00eb7d21, 0x039cfccd, 0x0061d2eb, 0x01faf91e, 0x037bfd0c, 0x00f05b07, 0x000f2c23}}}, + {X: Field{[10]uint32{0x0393de6d, 0x00893881, 0x01bbed36, 0x0179d150, 0x00cb9267, 0x033116a0, 0x03a9a725, 0x0275c929, 0x00e83b07, 0x00049369}}, Y: Field{[10]uint32{0x008d00e7, 0x02d26195, 0x01e6ac6f, 0x00c7a819, 0x001cd155, 0x029d6555, 0x02200fb2, 0x0032e935, 0x0066f12e, 0x000f9c00}}}, + {X: Field{[10]uint32{0x038d1138, 0x033a586d, 0x00c16428, 0x00b40ab2, 0x006c2b11, 0x019ae5f4, 0x02045bb2, 0x01e09877, 0x01c4455e, 0x001d25c8}}, Y: Field{[10]uint32{0x015a3032, 0x01567f01, 0x03b87086, 0x0250e7c1, 0x01025bc5, 0x00cc9b1f, 0x015b237d, 0x00c70bfa, 0x02eda3f3, 0x0009d55a}}}, + {X: Field{[10]uint32{0x0227a028, 0x026a46dd, 0x00e979ff, 0x02eff531, 0x00257676, 0x0143efd6, 0x0060dfed, 0x023d5487, 0x02490aa5, 0x0018b372}}, Y: Field{[10]uint32{0x015c37b5, 0x03b58156, 0x00fbbd10, 0x02229c52, 0x0317c4a6, 0x03d0cfa3, 0x021528b4, 0x0043a9fb, 0x039ae16d, 0x0022f526}}}, + {X: Field{[10]uint32{0x006478c6, 0x01692c5a, 0x01344789, 0x03a205d6, 0x011cd3a1, 0x03b4592c, 0x013b2275, 0x00ea985b, 0x00f139b1, 0x00193594}}, Y: Field{[10]uint32{0x01fa5c2f, 0x00f61fcf, 0x03a426b8, 0x0195ee56, 0x02f9e2a0, 0x02590d00, 0x039595b7, 0x00b61fcc, 0x012af757, 0x0037bbb9}}}, + {X: Field{[10]uint32{0x009ab59d, 0x0327d280, 0x0365a1ec, 0x017b6c00, 0x0237cb93, 0x02149b7d, 0x017c17cd, 0x00dbbcd0, 0x025566c6, 0x0034228f}}, Y: Field{[10]uint32{0x000dc103, 0x02b91889, 0x02a549c9, 0x03f49090, 0x00e9ed32, 0x00e15b69, 0x00d35023, 0x0145d8ff, 0x01c75eec, 0x000b6c12}}}, + {X: Field{[10]uint32{0x00f20d89, 0x0237c38c, 0x007c6f4b, 0x020926e9, 0x02971547, 0x006166bf, 0x0220d626, 0x031426be, 0x005a35bc, 0x0021d85c}}, Y: Field{[10]uint32{0x01b726ae, 0x03c37e2b, 0x03f64436, 0x027af8b6, 0x010fd43b, 0x02011a82, 0x029c3db7, 0x02588924, 0x01eebb02, 0x002cd309}}}, + {X: Field{[10]uint32{0x006f5f85, 0x0278468f, 0x03307c4e, 0x03d038de, 0x020e35f6, 0x0139f39f, 0x02cc3175, 0x00990c51, 0x01334ce2, 0x0038d14e}}, Y: Field{[10]uint32{0x0065d97d, 0x03417075, 0x03bf700a, 0x01eccda8, 0x031afdde, 0x00aed144, 0x022a0caf, 0x0206fbfc, 0x038a941e, 0x001cfb85}}}, + {X: Field{[10]uint32{0x00ca917b, 0x00d8208d, 0x01e27fac, 0x02fe5783, 0x02246b36, 0x036ff3a3, 0x00e6f11f, 0x029f9eb2, 0x012f6609, 0x0020e246}}, Y: Field{[10]uint32{0x032b636f, 0x030de303, 0x019bec68, 0x01db94f2, 0x0267c889, 0x033ec6a8, 0x027b681c, 0x023b0a75, 0x03a55044, 0x00255c1c}}}, + {X: Field{[10]uint32{0x03c5d387, 0x0186bd30, 0x02b8de5a, 0x03ede893, 0x03bbf287, 0x025ff618, 0x0278029a, 0x03897f8b, 0x00c067bb, 0x0022ff5c}}, Y: Field{[10]uint32{0x03f952fb, 0x0251d03c, 0x031fd5d8, 0x0069bb6e, 0x008b5900, 0x03c93f3b, 0x01b1d644, 0x01973568, 0x026bee72, 0x0038b9b1}}}, + {X: Field{[10]uint32{0x02ff257d, 0x0164f839, 0x01269fdb, 0x0055a21d, 0x03eaf820, 0x02601482, 0x021582d0, 0x002ec566, 0x019aa05f, 0x00297426}}, Y: Field{[10]uint32{0x0023635a, 0x01970d31, 0x0050bf9c, 0x03469910, 0x00fe6d27, 0x00b392cd, 0x02b62b36, 0x015d999d, 0x03205ef0, 0x0038d365}}}, + {X: Field{[10]uint32{0x015043ce, 0x01eeaa97, 0x02544282, 0x02164b53, 0x01176451, 0x0227ff67, 0x03942e30, 0x03222d41, 0x01a7b949, 0x0011391e}}, Y: Field{[10]uint32{0x013a7087, 0x013b7788, 0x02e23250, 0x01deb84b, 0x01e2b10d, 0x01295c2a, 0x02714162, 0x03118ec2, 0x00298c12, 0x001ee1bb}}}, + {X: Field{[10]uint32{0x012aa558, 0x01b38f4d, 0x013c4317, 0x02355648, 0x023f37bb, 0x002af432, 0x02e0251e, 0x01e045c1, 0x0143d979, 0x001837b2}}, Y: Field{[10]uint32{0x01fcaab8, 0x0042759a, 0x03d508bc, 0x013e331b, 0x0116b076, 0x01a614cd, 0x0181448d, 0x0167db14, 0x01f4a31c, 0x000b71a2}}}, + {X: Field{[10]uint32{0x01f7709b, 0x039eacc0, 0x03b24af7, 0x027f9906, 0x00d4ab82, 0x016506e6, 0x013c5c53, 0x0127983e, 0x01385b54, 0x00172963}}, Y: Field{[10]uint32{0x017cd575, 0x019607b0, 0x03eb74d9, 0x0213574f, 0x00945d9d, 0x03ce7770, 0x00ce0907, 0x01bd2044, 0x02e980eb, 0x0020abee}}}, + {X: Field{[10]uint32{0x018b031c, 0x02641234, 0x01138100, 0x028f34ca, 0x03b9a23e, 0x01afe1b0, 0x009cf3d2, 0x0358326c, 0x027ea1b1, 0x002ddd65}}, Y: Field{[10]uint32{0x0040fef1, 0x001025c2, 0x030b7120, 0x023211bd, 0x0366f12d, 0x0373eb73, 0x01885c4a, 0x004155c3, 0x029becfa, 0x0034adc5}}}, + {X: Field{[10]uint32{0x00220f96, 0x01ade690, 0x0044e92e, 0x03047e8e, 0x03a23bc4, 0x026a8175, 0x003595fb, 0x00bd840f, 0x00f67d60, 0x001cf635}}, Y: Field{[10]uint32{0x0000ce3d, 0x015d6ac9, 0x0285d331, 0x00f55a3f, 0x00bb17fb, 0x03b3453b, 0x02185309, 0x03fb96fa, 0x022cffc9, 0x002fdc8a}}}, + {X: Field{[10]uint32{0x01182b75, 0x02c46026, 0x024d61e7, 0x01151230, 0x008b1e97, 0x0271b7c3, 0x012bcce7, 0x01e08805, 0x01f9f49f, 0x003a0413}}, Y: Field{[10]uint32{0x02137361, 0x00494fe0, 0x0102396b, 0x02087175, 0x03e14fc6, 0x03e57fee, 0x03b0da00, 0x00afac6f, 0x0139ec8f, 0x00370bf5}}}, + {X: Field{[10]uint32{0x006113e6, 0x03a65715, 0x03209e89, 0x00912403, 0x01777e55, 0x00586039, 0x01449b6d, 0x010cb238, 0x02f6fb6c, 0x003b35cb}}, Y: Field{[10]uint32{0x0226e135, 0x03593ade, 0x029e0e00, 0x00f89a04, 0x00425291, 0x00516180, 0x009f518e, 0x02ea6794, 0x015d358f, 0x00059c5c}}}, + {X: Field{[10]uint32{0x00fc36cc, 0x001c1429, 0x02455a99, 0x0041fa75, 0x01464bfe, 0x029b5f0d, 0x01fc6b5f, 0x026f45bc, 0x00cfbe82, 0x00038ed7}}, Y: Field{[10]uint32{0x028044f5, 0x01ea1f68, 0x03fa331e, 0x03c042d7, 0x02296cb5, 0x016d9c7e, 0x017a2c9b, 0x03069b78, 0x039b5471, 0x00339eae}}}, + {X: Field{[10]uint32{0x03107734, 0x0286ae49, 0x01c5ed7c, 0x013c97e2, 0x0041c1ce, 0x013af48b, 0x03e75f7f, 0x024753ad, 0x0202ffab, 0x003cd646}}, Y: Field{[10]uint32{0x00fa4b3d, 0x015f0ae5, 0x01c1018a, 0x01aef8bb, 0x03cf0474, 0x00c52eda, 0x03c7d535, 0x02e49921, 0x0211f2ba, 0x000d168b}}}, + {X: Field{[10]uint32{0x0345c635, 0x006b65f2, 0x021a6550, 0x034c89eb, 0x00c61349, 0x03f16a54, 0x01184f9f, 0x02b654df, 0x005dae54, 0x003292c1}}, Y: Field{[10]uint32{0x03c1d806, 0x01312d35, 0x00d72eaf, 0x015833a7, 0x014660f4, 0x0110747a, 0x02f3c24b, 0x02fb28d4, 0x017e255e, 0x0038c3e0}}}, + {X: Field{[10]uint32{0x0341ea38, 0x00a6ed9b, 0x02a72dfd, 0x00819d6a, 0x02300947, 0x01daa57d, 0x00ebdb7b, 0x03a987ee, 0x034054a9, 0x003df315}}, Y: Field{[10]uint32{0x02556eac, 0x00b207ac, 0x009900f5, 0x02ffd4b5, 0x03b3dd7f, 0x03811af8, 0x0275aeb5, 0x00936460, 0x018cfc54, 0x0027518f}}}, + {X: Field{[10]uint32{0x016ab6c2, 0x007dc37b, 0x029f876b, 0x03ec9eda, 0x01b4fd9b, 0x034d3a2a, 0x024bbef7, 0x038fe3b9, 0x0379fba3, 0x003dd6d7}}, Y: Field{[10]uint32{0x00a43faa, 0x00c3b024, 0x014f9d40, 0x019be168, 0x037e0e82, 0x01d159df, 0x0048e362, 0x02ddedcb, 0x00bc5c3f, 0x000882d0}}}, + {X: Field{[10]uint32{0x019cd450, 0x023e9303, 0x00fde0e8, 0x0191cd69, 0x0189d86a, 0x03428e63, 0x03d89b6a, 0x008da989, 0x03a25060, 0x000aa8d9}}, Y: Field{[10]uint32{0x0041fc32, 0x02512336, 0x038f6e82, 0x03ffa6bb, 0x021e70ec, 0x0135df61, 0x00a802bc, 0x006c69d9, 0x00250249, 0x000affb7}}}, + {X: Field{[10]uint32{0x0141620f, 0x00df0e28, 0x0325765a, 0x039ec7ac, 0x03a1078c, 0x01609ec1, 0x01a1e221, 0x00f3db9f, 0x01c11178, 0x003fdfd2}}, Y: Field{[10]uint32{0x00702733, 0x026b3d95, 0x00bead51, 0x02177d91, 0x03a488c5, 0x0049477e, 0x00a8b542, 0x00163a2f, 0x009e2e48, 0x001a5543}}}, + {X: Field{[10]uint32{0x003aa39f, 0x000a82d7, 0x016016fd, 0x02d1799e, 0x0076d017, 0x034faee4, 0x01f7338f, 0x03d3b291, 0x03581164, 0x000c7414}}, Y: Field{[10]uint32{0x0163f575, 0x03364aa6, 0x011fe6bc, 0x003b46ff, 0x03d4d3ea, 0x0387e348, 0x022fa902, 0x01ffc411, 0x019b7217, 0x003c490c}}}, + {X: Field{[10]uint32{0x026a3bd0, 0x023ed7df, 0x006eabb8, 0x034ead7c, 0x030c8a02, 0x0236a6b5, 0x00bf2f30, 0x000fb28b, 0x02ddfd12, 0x001babc3}}, Y: Field{[10]uint32{0x03e05f08, 0x0242719c, 0x016d4125, 0x01d28c56, 0x02815a0c, 0x0028ee0e, 0x00521a01, 0x0251d127, 0x01012d8e, 0x00364cdb}}}, + {X: Field{[10]uint32{0x02da1347, 0x006ea5df, 0x011b9e9a, 0x0320472e, 0x0168e759, 0x03d7ea23, 0x03943acf, 0x006adff0, 0x01197799, 0x0002e569}}, Y: Field{[10]uint32{0x01e5ef23, 0x0208afdb, 0x0287f533, 0x0054dbba, 0x029758bd, 0x0168bfe9, 0x018fbfe7, 0x0112296a, 0x035f446d, 0x00233cb2}}}, + {X: Field{[10]uint32{0x011427e8, 0x03071608, 0x02eeada6, 0x03d5ae43, 0x021fd386, 0x03a0139f, 0x031dc212, 0x03b6ebce, 0x01d48ce5, 0x001394c0}}, Y: Field{[10]uint32{0x01b9f0d9, 0x00297600, 0x016b76fb, 0x0364ddb6, 0x00dcabaa, 0x02f675a1, 0x012f684c, 0x03f6cb87, 0x003de169, 0x003d40fb}}}, + {X: Field{[10]uint32{0x00f49cd2, 0x0080cf0f, 0x017a3914, 0x0152b587, 0x02fc7c2b, 0x01270b42, 0x01f92cdc, 0x006d0dc5, 0x01e50903, 0x0013f46a}}, Y: Field{[10]uint32{0x024adcb1, 0x02169b23, 0x031602c8, 0x02fa2e1d, 0x022d99c9, 0x033bda52, 0x034b43be, 0x0196f0ea, 0x011cab01, 0x001cfb30}}}, + {X: Field{[10]uint32{0x00257c84, 0x00402648, 0x00b86745, 0x03e8ba29, 0x00384070, 0x02363eb8, 0x03b7fa4a, 0x010fe97a, 0x0065b325, 0x0019d01a}}, Y: Field{[10]uint32{0x03c62008, 0x021625ae, 0x0271f3fd, 0x0173bcf4, 0x03e829a4, 0x00c89f7d, 0x00451f5e, 0x0382e53d, 0x02d593a4, 0x000ff766}}}, + {X: Field{[10]uint32{0x006569e4, 0x024a9969, 0x01cb4e49, 0x02b46723, 0x00de7e8d, 0x036b1028, 0x03dcfa0e, 0x016f9bbc, 0x01aed6ee, 0x00052e55}}, Y: Field{[10]uint32{0x022daf70, 0x0029757e, 0x011ebed6, 0x03097aa7, 0x017d9f31, 0x0184d4f7, 0x001eff67, 0x00fe0612, 0x00b62182, 0x00352e48}}}, + {X: Field{[10]uint32{0x0339ae42, 0x0297c88c, 0x00fb722c, 0x00d318da, 0x004003e4, 0x0390bf48, 0x02a0b3ff, 0x0357eb7e, 0x03bc5608, 0x00053ca0}}, Y: Field{[10]uint32{0x02db7397, 0x015df3e7, 0x008c37c1, 0x00c0aebb, 0x03bf0ba6, 0x002a1ff6, 0x004d4bfb, 0x03f4ff19, 0x023dc3ae, 0x002c9057}}}, + {X: Field{[10]uint32{0x03bd1c1f, 0x00ce8c87, 0x03d098e7, 0x01701637, 0x005416a5, 0x03e032ea, 0x02275be7, 0x038829b9, 0x00677d3c, 0x000ff783}}, Y: Field{[10]uint32{0x02daaac6, 0x01740cc6, 0x0389a115, 0x00962498, 0x009a018b, 0x02fa87c2, 0x01782f90, 0x0064b252, 0x03dc610f, 0x0026e3bd}}}, + {X: Field{[10]uint32{0x02d17267, 0x00cca883, 0x01247df5, 0x01310776, 0x00b993bf, 0x020a4150, 0x01c74dd4, 0x00f417c5, 0x0269df5f, 0x00271579}}, Y: Field{[10]uint32{0x024979f6, 0x02d3829b, 0x00810981, 0x00c8b498, 0x018c6b3c, 0x00dd5ff0, 0x01abd783, 0x01d9945d, 0x00e930c9, 0x0008f6c3}}}, + {X: Field{[10]uint32{0x02968d16, 0x01a2a4a0, 0x02ee7d85, 0x030d2cfe, 0x02506d2d, 0x003d05d1, 0x00da60b3, 0x006835ba, 0x00dfae14, 0x0002f7a1}}, Y: Field{[10]uint32{0x02b3ab04, 0x03ce3112, 0x00dcb468, 0x03cdb0a6, 0x02900374, 0x0269b1a1, 0x024697b9, 0x01877f9c, 0x0214ff13, 0x001168cc}}}, + {X: Field{[10]uint32{0x019546a3, 0x00e76bf2, 0x030c0549, 0x021651ac, 0x01e5d970, 0x03183168, 0x0368f454, 0x030b2917, 0x014ab8f3, 0x0006500a}}, Y: Field{[10]uint32{0x00e3b81e, 0x025aed3b, 0x0386abfd, 0x009b9db8, 0x00848bc9, 0x01f186ec, 0x020ea767, 0x0318a879, 0x03993816, 0x00158fe7}}}, + {X: Field{[10]uint32{0x032ccb0e, 0x027f33ac, 0x00ad6682, 0x0358dcf3, 0x00757a34, 0x0348b60e, 0x00df92ea, 0x00f991f4, 0x01e0d0d1, 0x00375ba8}}, Y: Field{[10]uint32{0x0233c313, 0x00023c3b, 0x003fdd8e, 0x01f2a803, 0x00384b55, 0x012797fe, 0x03ad27fa, 0x03a2ca14, 0x01e36bf4, 0x0030063a}}}, + {X: Field{[10]uint32{0x037fbf19, 0x01a58596, 0x01ffec06, 0x00dd0b13, 0x00dc1047, 0x02f09ee1, 0x02656bfb, 0x01158b89, 0x03e8c784, 0x00195e11}}, Y: Field{[10]uint32{0x015f2df5, 0x03daad82, 0x001725b5, 0x02d39e69, 0x0242c6a4, 0x0292a6a2, 0x01beda90, 0x02b69240, 0x03b658b6, 0x00376437}}}, + {X: Field{[10]uint32{0x023dea6b, 0x0141acff, 0x00d3e352, 0x007ce5ae, 0x0349b8e7, 0x036de072, 0x02d26c2e, 0x0275ba41, 0x00b140be, 0x003edc09}}, Y: Field{[10]uint32{0x0308efdf, 0x03f28cba, 0x0061c5a0, 0x0014501c, 0x02fea360, 0x03746b11, 0x02d961e9, 0x008ca2da, 0x03f4e50b, 0x00379023}}}, + {X: Field{[10]uint32{0x01d8e8e0, 0x004cd434, 0x018dfa31, 0x0031268e, 0x00b3f2be, 0x034fa251, 0x0280179c, 0x02c9e74e, 0x000865a7, 0x000b4a70}}, Y: Field{[10]uint32{0x02efcf8f, 0x027648f6, 0x03ee992e, 0x0017c999, 0x0125c550, 0x02592791, 0x00027485, 0x01292996, 0x027aee70, 0x0032abc4}}}, + {X: Field{[10]uint32{0x03d5662d, 0x01f07314, 0x036326d8, 0x02269f0c, 0x02392685, 0x00f06f8e, 0x028d42ba, 0x00827d37, 0x007479b7, 0x0036da41}}, Y: Field{[10]uint32{0x03aa4e00, 0x01dddc3e, 0x0063c0b7, 0x02fca48b, 0x01c58c1f, 0x020f893a, 0x013ce32c, 0x021eaa64, 0x03e95c35, 0x002437a2}}}, + {X: Field{[10]uint32{0x0141697b, 0x011cd5b2, 0x03f0adf2, 0x021f33c4, 0x01723c70, 0x01635bf0, 0x0154ada2, 0x013c2abf, 0x006f922e, 0x00260194}}, Y: Field{[10]uint32{0x016bc237, 0x011684bc, 0x037c9252, 0x0125dec9, 0x01b97fef, 0x034c72b4, 0x0298eef3, 0x02e104dd, 0x0018a8ca, 0x00301f88}}}, + {X: Field{[10]uint32{0x00e40187, 0x02b9ebd8, 0x025eaae1, 0x03478cf4, 0x01661e0a, 0x023c5188, 0x011c1122, 0x0096b16c, 0x013fe6da, 0x002ae1a3}}, Y: Field{[10]uint32{0x00bf54ad, 0x0357c4cf, 0x001d4d47, 0x0222ef4c, 0x014b12c4, 0x015e9ff6, 0x01195ced, 0x02614068, 0x0298334a, 0x003b892d}}}, + {X: Field{[10]uint32{0x018dcda2, 0x03627bbf, 0x02f4931f, 0x019aafd9, 0x003122f3, 0x01095f8a, 0x0056be17, 0x023b9848, 0x03d19d2a, 0x0039d587}}, Y: Field{[10]uint32{0x02166d5a, 0x02a0004f, 0x0118d5a8, 0x0242281e, 0x0385bcb1, 0x0089edd6, 0x0366ea73, 0x01b63171, 0x034be365, 0x000814b9}}}, + {X: Field{[10]uint32{0x00f21e6c, 0x00b7e6fa, 0x0082083c, 0x0004e654, 0x017b562f, 0x02a1132d, 0x008f2e0f, 0x038c1ef8, 0x023d84bb, 0x0017c654}}, Y: Field{[10]uint32{0x0265d7fa, 0x039f105c, 0x02cb9d9b, 0x0109ba46, 0x00333775, 0x01c93ae2, 0x029ad2d5, 0x007778ab, 0x021628ee, 0x000ea5bf}}}, + {X: Field{[10]uint32{0x01c10cc1, 0x00df4a36, 0x03545698, 0x005c9571, 0x022fdcad, 0x015407bf, 0x022ec1dc, 0x026c4490, 0x02683c94, 0x00327e91}}, Y: Field{[10]uint32{0x03fd1dba, 0x008fb7b1, 0x03ffab5e, 0x00d1db51, 0x00b5b6e7, 0x03a380d2, 0x01dcd8d9, 0x0246b33c, 0x035d18f6, 0x0006aab9}}}, + {X: Field{[10]uint32{0x03eb8d8c, 0x02de4ec2, 0x02401b1a, 0x03505690, 0x011799b2, 0x024ee081, 0x03a084c3, 0x0061e733, 0x022a1e91, 0x00076a43}}, Y: Field{[10]uint32{0x009c0b63, 0x0134a3b2, 0x013322da, 0x03947d3f, 0x0274994e, 0x00ecff0c, 0x02cbae15, 0x0134e011, 0x006911ea, 0x000f4fdf}}}, + {X: Field{[10]uint32{0x031b3186, 0x03e26b7c, 0x029153e6, 0x026363d9, 0x03707e40, 0x02de11fd, 0x01504ac0, 0x0390c9af, 0x010f3851, 0x0031bf3c}}, Y: Field{[10]uint32{0x03a50ced, 0x029494e4, 0x00bff03e, 0x02bea726, 0x004e2705, 0x03e3b972, 0x036ea108, 0x018f61b8, 0x01f4a16a, 0x00342b22}}}, + {X: Field{[10]uint32{0x02378233, 0x035fd185, 0x02588fef, 0x01ac7e6d, 0x0003cf23, 0x00495eb8, 0x02b7d4ef, 0x0319f32d, 0x022eeb56, 0x0005415e}}, Y: Field{[10]uint32{0x004930c2, 0x012ec3f7, 0x010cf505, 0x0188be6a, 0x036f205a, 0x038f42a1, 0x01543ef5, 0x029ea312, 0x0130ccc0, 0x00136ead}}}, + {X: Field{[10]uint32{0x0308b20f, 0x039067c0, 0x01ea36d1, 0x02de300b, 0x0145bf1c, 0x001f77af, 0x027337dd, 0x02b039ba, 0x02e072d5, 0x000dfbab}}, Y: Field{[10]uint32{0x0361d506, 0x02458c3c, 0x0394aebb, 0x036efd68, 0x01a5761a, 0x00ca8e8f, 0x0077249a, 0x02a85067, 0x00965d9d, 0x002c3191}}}, + {X: Field{[10]uint32{0x0157745c, 0x009cd889, 0x03ebe61a, 0x022deb66, 0x01f1d6ce, 0x024a2f71, 0x031cd96d, 0x03438cf1, 0x03f83a8b, 0x0016881e}}, Y: Field{[10]uint32{0x00f54dad, 0x031d9998, 0x0213819e, 0x0004c8f1, 0x03ee8789, 0x015d1044, 0x01494ac1, 0x026da8a9, 0x0357fadc, 0x000eb32d}}}, + {X: Field{[10]uint32{0x03abd139, 0x034e6efe, 0x006d1642, 0x002241c1, 0x02f6b2ee, 0x0206fbed, 0x0391271e, 0x038c9568, 0x016a1a0f, 0x003f8237}}, Y: Field{[10]uint32{0x0181ef40, 0x00319380, 0x030d6c52, 0x00984de6, 0x03665d23, 0x027c8130, 0x02f1b436, 0x0208bb93, 0x02d13535, 0x0010b0d0}}}, + {X: Field{[10]uint32{0x00706111, 0x032e665e, 0x01daca39, 0x03800f47, 0x01d6d859, 0x0201132b, 0x003edcf3, 0x036ee992, 0x02c908df, 0x002df498}}, Y: Field{[10]uint32{0x00d798e8, 0x01ff91ca, 0x01689ee9, 0x0044194f, 0x0230bb4c, 0x00606d6e, 0x0007c8f5, 0x02ce5da8, 0x0350b308, 0x00258218}}}, + {X: Field{[10]uint32{0x00130c86, 0x01be008d, 0x00407683, 0x015f731e, 0x027d354b, 0x006eb7d6, 0x0297d7c0, 0x00ddd4eb, 0x032e23b3, 0x0012c4aa}}, Y: Field{[10]uint32{0x023c450e, 0x03ee3c3c, 0x005c0f52, 0x027926b9, 0x012bc964, 0x007f9605, 0x0211e73a, 0x022fd00b, 0x020d9f70, 0x00106753}}}, + {X: Field{[10]uint32{0x00e88dac, 0x00331276, 0x034f74f3, 0x02addd42, 0x008f362b, 0x02f311f1, 0x009570c8, 0x0333692d, 0x0282a96e, 0x003f1b49}}, Y: Field{[10]uint32{0x00beedbb, 0x0090eb3d, 0x0184808a, 0x03c25800, 0x000694af, 0x024165fe, 0x0322612e, 0x01160347, 0x01273026, 0x0006bd59}}}, + {X: Field{[10]uint32{0x02607e8b, 0x026d9547, 0x00f0632e, 0x0303910b, 0x025e07e6, 0x012bf6e7, 0x0342c40c, 0x03ae8151, 0x03a9a189, 0x0031ee70}}, Y: Field{[10]uint32{0x001822ab, 0x02010bfc, 0x03e30fc5, 0x02e35370, 0x02ef6b38, 0x03069517, 0x0084cd19, 0x01d36d88, 0x02772f22, 0x0016eda0}}}, + {X: Field{[10]uint32{0x00dfd956, 0x001be9d4, 0x01627034, 0x030aedbe, 0x0246c761, 0x03b50c1a, 0x02339ba3, 0x029cbca6, 0x034230de, 0x003ae934}}, Y: Field{[10]uint32{0x01237cee, 0x0172fd77, 0x0106d215, 0x02961e4d, 0x01d31b01, 0x001a1033, 0x01a17477, 0x01e2cb8f, 0x020f23d2, 0x003f385e}}}, + {X: Field{[10]uint32{0x02c04155, 0x0295a7e0, 0x02cc8944, 0x03d1b366, 0x013595dc, 0x02b7b0a1, 0x034358c6, 0x0351c4d6, 0x01c02177, 0x002934db}}, Y: Field{[10]uint32{0x01f00281, 0x00ddfd20, 0x03ad1013, 0x01770beb, 0x0365f3e4, 0x016983f7, 0x038fd0fb, 0x006f838d, 0x037963b2, 0x002168a5}}}, + {X: Field{[10]uint32{0x02109ba2, 0x002b255d, 0x00a16906, 0x02a939b5, 0x020eb165, 0x0379ceaf, 0x035bf56f, 0x03eb878f, 0x0063ae8b, 0x001245b4}}, Y: Field{[10]uint32{0x003f22ee, 0x026d3513, 0x006564ae, 0x013d9d8e, 0x003b2b0b, 0x014dadf2, 0x027a08ca, 0x010357e5, 0x03034a0b, 0x0029e459}}}, + {X: Field{[10]uint32{0x02edd046, 0x02b90483, 0x03f97ecb, 0x01e61605, 0x009de019, 0x0012ad27, 0x038f1a44, 0x0180c217, 0x0310b296, 0x001d8736}}, Y: Field{[10]uint32{0x02193db7, 0x00bce88b, 0x010cf2ee, 0x03aa376a, 0x039789f0, 0x022079fe, 0x038f50ab, 0x015175cb, 0x0320763b, 0x00074455}}}, + {X: Field{[10]uint32{0x01c64ea3, 0x03f28ae3, 0x019d2e05, 0x0053a377, 0x02860ff0, 0x0242f04f, 0x005541b4, 0x023a4b7e, 0x01704d71, 0x00035e89}}, Y: Field{[10]uint32{0x034cb90c, 0x023d0f94, 0x00acec15, 0x0216a8eb, 0x026102db, 0x02f1b7b1, 0x000e035f, 0x019d9dc7, 0x039d2134, 0x00179152}}}, + {X: Field{[10]uint32{0x014d3bbe, 0x00290fcf, 0x025dfeb2, 0x02653716, 0x020a6b9a, 0x00a5d6ef, 0x02bcb063, 0x0314aec3, 0x004f7962, 0x000abd80}}, Y: Field{[10]uint32{0x001a14f3, 0x03825776, 0x01933d91, 0x006d4c8e, 0x02be1deb, 0x01a31965, 0x0108e3eb, 0x0330540c, 0x01e226f8, 0x001a622a}}}, + {X: Field{[10]uint32{0x01504255, 0x0023d72a, 0x00959741, 0x0061d6e9, 0x03ca805d, 0x034cc613, 0x027571e5, 0x00218044, 0x00e53bab, 0x002a49d0}}, Y: Field{[10]uint32{0x02d2379f, 0x01d7adb1, 0x0244e68d, 0x0214436a, 0x0096d49c, 0x00eaa138, 0x02dfd3d0, 0x01adc419, 0x011e2eb7, 0x00177ca1}}}, + {X: Field{[10]uint32{0x00014939, 0x01fb661c, 0x02057bcc, 0x01c0341d, 0x02768567, 0x00e8323a, 0x0287c449, 0x0229ad82, 0x021a510d, 0x00243425}}, Y: Field{[10]uint32{0x00aa545d, 0x01d80eb3, 0x034d3f8d, 0x00be16d2, 0x037c13dc, 0x008e1ab4, 0x036f7a8a, 0x00c2219a, 0x013c1c91, 0x001d351d}}}, + {X: Field{[10]uint32{0x00ecd12b, 0x02f98441, 0x00ded249, 0x029b28ce, 0x038dd5c6, 0x00b8b820, 0x02bfa279, 0x029813d8, 0x03eaf2e3, 0x0003394a}}, Y: Field{[10]uint32{0x015c009e, 0x0220020b, 0x031a1a49, 0x002a3e3f, 0x03dd0867, 0x0097cf66, 0x00244449, 0x0028adf2, 0x0273738a, 0x002a1a77}}}, + {X: Field{[10]uint32{0x03cd05c4, 0x038d43fc, 0x02be7cc3, 0x0105b3c5, 0x01122154, 0x0301ab12, 0x0139a471, 0x03f34bff, 0x01c210e3, 0x002672a3}}, Y: Field{[10]uint32{0x03bc4982, 0x03925ab7, 0x02142c6c, 0x03a00244, 0x024550fb, 0x03c1c82f, 0x0326309e, 0x0370b1af, 0x0280131a, 0x001e021e}}}, + {X: Field{[10]uint32{0x0202d1c6, 0x03b18428, 0x0211ab51, 0x0285f639, 0x00cbfcc6, 0x008b7ae4, 0x03ff1f43, 0x01ef1741, 0x00c29f5a, 0x002f910b}}, Y: Field{[10]uint32{0x03c084a2, 0x01584a1d, 0x03734111, 0x00978c92, 0x02fb3d1f, 0x02b3d6ec, 0x028f2c01, 0x0364d200, 0x02c4680e, 0x0018943c}}}, + {X: Field{[10]uint32{0x00ec8e54, 0x01c2ec39, 0x00e65677, 0x03e6e3e0, 0x03e75d95, 0x006e6c53, 0x030346b5, 0x02c04084, 0x01f4037f, 0x0014fd7d}}, Y: Field{[10]uint32{0x00c62f93, 0x0331774a, 0x020f9cb1, 0x01c4ca14, 0x0224c0d5, 0x00f8b870, 0x00dd2ef2, 0x00cfd6a8, 0x0353c6e7, 0x0023694a}}}, + {X: Field{[10]uint32{0x008c4d6c, 0x039b6a97, 0x0155411d, 0x006461bb, 0x02a897ab, 0x00d295bd, 0x0399e3a1, 0x03affdf5, 0x01650e90, 0x00081b39}}, Y: Field{[10]uint32{0x02a75804, 0x02a6a5a9, 0x006754dc, 0x00f0e2b8, 0x00aaa5d5, 0x01e754c8, 0x03ec5c2e, 0x01b729f7, 0x0122bd2d, 0x0030bfd7}}}, + {X: Field{[10]uint32{0x0073f443, 0x037cab1c, 0x03744faa, 0x0083308f, 0x0002176a, 0x009b4ad5, 0x01f2a727, 0x00beae04, 0x03bb87ee, 0x0034772f}}, Y: Field{[10]uint32{0x01d17db9, 0x003e5a3b, 0x0350c187, 0x024f87d0, 0x00f71da6, 0x03e0cdf6, 0x02fc27e3, 0x002edef2, 0x023b4180, 0x000041b1}}}, + {X: Field{[10]uint32{0x03749328, 0x005ce4b6, 0x002f6db1, 0x0343bc5f, 0x020a516f, 0x01bff26a, 0x039d4322, 0x01dae87a, 0x0173c543, 0x003486a8}}, Y: Field{[10]uint32{0x0074e424, 0x0131a098, 0x00b24772, 0x0293b5d3, 0x002326f9, 0x00e9d52c, 0x00f79de6, 0x02035981, 0x01f4e014, 0x000df3d7}}}, + {X: Field{[10]uint32{0x011fa3d2, 0x03553adf, 0x0203178d, 0x020fe387, 0x0215e563, 0x032edf39, 0x01acfbe2, 0x01a69d5a, 0x0024a22c, 0x00148d2c}}, Y: Field{[10]uint32{0x03c000cb, 0x02258c22, 0x02ddfd91, 0x02569d2b, 0x02b41038, 0x0296cd0e, 0x03c3b042, 0x02d4b58a, 0x0042651d, 0x000afab9}}}, + {X: Field{[10]uint32{0x01412f64, 0x010704cd, 0x00b6a509, 0x033d7b9b, 0x01f5048d, 0x01662253, 0x009dbd4f, 0x0086ae9c, 0x00759f3e, 0x00279ba6}}, Y: Field{[10]uint32{0x01757ea8, 0x009a418c, 0x034a92dc, 0x00ce9f93, 0x01431110, 0x03811c62, 0x00dd1690, 0x00b96909, 0x0199e38f, 0x000ad9c0}}}, + {X: Field{[10]uint32{0x0343ae45, 0x03ca4a21, 0x017fcd28, 0x01ce0c96, 0x0289232c, 0x00b7a6ec, 0x01f8a927, 0x0239dc43, 0x02959a71, 0x002105b8}}, Y: Field{[10]uint32{0x0133d139, 0x01c487c4, 0x004db4c7, 0x01d1d931, 0x0220732a, 0x03347c00, 0x01b79044, 0x01023b60, 0x0202801b, 0x001bbd24}}}, + {X: Field{[10]uint32{0x013561a5, 0x02389eb5, 0x0029bb10, 0x01ca7a8d, 0x0027462f, 0x014ae8b7, 0x02405ebe, 0x00ecbcc9, 0x03a7048a, 0x00214a93}}, Y: Field{[10]uint32{0x0162e520, 0x0332bce9, 0x02ac6a81, 0x03de3418, 0x02770b99, 0x032fad9c, 0x00e441c2, 0x02708dac, 0x0046ee0d, 0x000f81b0}}}, + {X: Field{[10]uint32{0x0277c1bd, 0x00a50b8d, 0x00c5d328, 0x02872c8d, 0x01fa6097, 0x03020f3b, 0x03b876d3, 0x015afae4, 0x01a02dbe, 0x000a2037}}, Y: Field{[10]uint32{0x031bb43a, 0x01991043, 0x019d3bf9, 0x01e103a4, 0x023d371f, 0x00dc37e8, 0x015366c5, 0x01aed3fa, 0x021092d4, 0x0037ec3a}}}, + {X: Field{[10]uint32{0x01819c65, 0x027fe27c, 0x006f0770, 0x01549d72, 0x0037b535, 0x02699da8, 0x03dbf869, 0x0235ff00, 0x00029e82, 0x0032dbef}}, Y: Field{[10]uint32{0x02062266, 0x00589de1, 0x02bdace5, 0x03ef816e, 0x00ce9161, 0x032ddb2e, 0x00d50c21, 0x01ce6457, 0x019a3657, 0x003f138b}}}, + {X: Field{[10]uint32{0x001afebe, 0x00c17bfe, 0x021615f6, 0x02962a1c, 0x030abc76, 0x001b43b0, 0x03241066, 0x00d0e086, 0x035bff1c, 0x002021ee}}, Y: Field{[10]uint32{0x0024ce72, 0x0305f782, 0x00353d9b, 0x01fa513d, 0x0223a443, 0x03a6918c, 0x01c5030a, 0x0300ae3d, 0x007aa602, 0x0015e2ca}}}, + {X: Field{[10]uint32{0x02d3a33a, 0x028a3ed0, 0x01482653, 0x0274493b, 0x00f8ae82, 0x0145f396, 0x030def22, 0x032431eb, 0x00bc30f2, 0x000da7d5}}, Y: Field{[10]uint32{0x01b59d16, 0x009855ee, 0x01b40b45, 0x02f71330, 0x0361f466, 0x01658850, 0x03c97aef, 0x01f8cb18, 0x02af35af, 0x0002e3cb}}}, + {X: Field{[10]uint32{0x03ed8f7d, 0x00f54cc7, 0x01eb6edd, 0x00a1af92, 0x03df2946, 0x03f6dab1, 0x03b2448f, 0x03e1c54e, 0x004c01b2, 0x0021ef93}}, Y: Field{[10]uint32{0x020effb1, 0x01bd3af2, 0x00a2adfe, 0x02a19a4e, 0x0071fdc8, 0x00735474, 0x031ec542, 0x0302855d, 0x00bc6386, 0x001fbd1d}}}, + {X: Field{[10]uint32{0x0214715e, 0x00fe8a47, 0x01cfbc01, 0x006d7bb4, 0x0280393f, 0x00e7b6f8, 0x0310eeb2, 0x016faa30, 0x00f018f7, 0x001ed99e}}, Y: Field{[10]uint32{0x038b1fd7, 0x006a2c7c, 0x02890c18, 0x01f4f754, 0x03d98570, 0x02a86efc, 0x008275d2, 0x039a69ce, 0x00e2666e, 0x001e3a2e}}}, + {X: Field{[10]uint32{0x0160f135, 0x009ce52c, 0x00aed90d, 0x01b5acdf, 0x0377d282, 0x03ee8e22, 0x01608f58, 0x027808aa, 0x02419672, 0x000227b1}}, Y: Field{[10]uint32{0x00786cff, 0x025055e9, 0x021f80ac, 0x02c36466, 0x035e3030, 0x0077ac62, 0x01ee5a74, 0x01ce1c06, 0x0142108d, 0x00177bcc}}}, + {X: Field{[10]uint32{0x02177f8e, 0x01b4698d, 0x0131199e, 0x0275907e, 0x008b8374, 0x01e30feb, 0x022acbab, 0x00242cea, 0x03393769, 0x000b2fb1}}, Y: Field{[10]uint32{0x03de8886, 0x024820fc, 0x03bad2ca, 0x0332240b, 0x0367fea7, 0x013c9aba, 0x034a007f, 0x00b56b2c, 0x03e757ad, 0x000c5039}}}, + {X: Field{[10]uint32{0x01946908, 0x033c3baf, 0x03cf02eb, 0x0061198f, 0x0229d576, 0x000c082b, 0x027b116d, 0x02962d4f, 0x03cda2d6, 0x0019e33b}}, Y: Field{[10]uint32{0x026a3491, 0x02f40a03, 0x01713314, 0x0310cc70, 0x0118834f, 0x00caca90, 0x00d56ee9, 0x023bbcdf, 0x01e01329, 0x003d16fa}}}, + {X: Field{[10]uint32{0x033ec0df, 0x03c608b1, 0x01524b43, 0x01cf2230, 0x015073b0, 0x01337c04, 0x012305a9, 0x013b391a, 0x0278adcc, 0x002376f4}}, Y: Field{[10]uint32{0x00fc5b0c, 0x024ec5e0, 0x0102268b, 0x016e8cec, 0x005d2d67, 0x00a31de1, 0x029ea1ae, 0x031b232a, 0x02dd3c52, 0x00241443}}}, + {X: Field{[10]uint32{0x03e36626, 0x00743035, 0x00739304, 0x01e2abdc, 0x00607d78, 0x008e0983, 0x03149c3d, 0x03fd7c8a, 0x0082b162, 0x0025cafc}}, Y: Field{[10]uint32{0x004087dc, 0x01416f93, 0x01324797, 0x0093408d, 0x026eca9f, 0x03a42910, 0x01b64f43, 0x02f29366, 0x03baf61c, 0x0011a16c}}}, + {X: Field{[10]uint32{0x03c97230, 0x03315f2e, 0x0280f540, 0x0182f218, 0x01d8c1f7, 0x0145348f, 0x02801c54, 0x012ae5f7, 0x01526660, 0x0010abc3}}, Y: Field{[10]uint32{0x0299ce38, 0x024afb05, 0x03b89771, 0x01a26378, 0x01cced06, 0x025edd35, 0x017160bd, 0x00a7b50d, 0x03898c90, 0x00015926}}}, + {X: Field{[10]uint32{0x03bb30ac, 0x0188fcf5, 0x010a9fa5, 0x00853010, 0x021748ee, 0x02686831, 0x02138bca, 0x01b47639, 0x03708729, 0x00014d99}}, Y: Field{[10]uint32{0x015cac1d, 0x02e3f63b, 0x01f31fd8, 0x00b96564, 0x027c297b, 0x01cb642e, 0x0219c2f6, 0x02834d49, 0x0260786b, 0x00381a0e}}}, + {X: Field{[10]uint32{0x0039fc24, 0x0157047f, 0x002559de, 0x02d2b648, 0x017d5d0a, 0x033903a4, 0x00308d6b, 0x02c63fc1, 0x0284e85b, 0x00280ed8}}, Y: Field{[10]uint32{0x00785493, 0x0356a3fa, 0x035644ca, 0x016f8052, 0x02c07300, 0x024e76e2, 0x03e7235a, 0x030d208f, 0x0282c22c, 0x0009ce7b}}}, + {X: Field{[10]uint32{0x02b66e97, 0x00b893c9, 0x03a63733, 0x0326648c, 0x01f5801d, 0x02893df7, 0x01980550, 0x014e9af6, 0x02d7268a, 0x000bce53}}, Y: Field{[10]uint32{0x03918d88, 0x03d3375c, 0x014138d3, 0x027d7415, 0x000e49d0, 0x009af130, 0x03d3714a, 0x02ea1b46, 0x033ee934, 0x002d4ad3}}}, + {X: Field{[10]uint32{0x0133f8ab, 0x01684b1c, 0x016ebbb3, 0x03b7bc2d, 0x027740bc, 0x0047bd7f, 0x020c19a6, 0x014df8ea, 0x0010527e, 0x00245dcc}}, Y: Field{[10]uint32{0x029fb5b6, 0x012053fa, 0x0396500f, 0x017333ee, 0x01b097ae, 0x02ef0dad, 0x021063ab, 0x0120249f, 0x03b328b6, 0x001a3e4d}}}, + {X: Field{[10]uint32{0x004af615, 0x018035a4, 0x00b24763, 0x03154280, 0x0028486b, 0x0354a77e, 0x020c1aeb, 0x022bc5e8, 0x01bfcddc, 0x000a146f}}, Y: Field{[10]uint32{0x00cb1356, 0x016cb5b7, 0x017585d1, 0x0320edcc, 0x02ee2acf, 0x00cc0d75, 0x006c3760, 0x009eb9b5, 0x0085702e, 0x0034c0b0}}}, + {X: Field{[10]uint32{0x014bdfef, 0x0136920c, 0x029c25d3, 0x018d69bc, 0x038be3d3, 0x02d1f965, 0x0210b791, 0x0267c515, 0x03ab0254, 0x003a61b5}}, Y: Field{[10]uint32{0x03de35a6, 0x00f0cc51, 0x01c165f5, 0x00b4c710, 0x01cfdb18, 0x00441156, 0x02c63b96, 0x03054043, 0x00dcb3b3, 0x0003418e}}}, + {X: Field{[10]uint32{0x038bfc03, 0x019238a3, 0x02099b2e, 0x0329fefe, 0x00ab44da, 0x020c7609, 0x001c5e0d, 0x02cb38b7, 0x032c5639, 0x002f1176}}, Y: Field{[10]uint32{0x03213e32, 0x03e6d481, 0x028842c1, 0x02020981, 0x0079a805, 0x02a7d4f8, 0x02327400, 0x0226b527, 0x03b127b2, 0x001764f8}}}, + {X: Field{[10]uint32{0x00a8dfc6, 0x012632d4, 0x022fd667, 0x004b29ec, 0x01849ef5, 0x0278a440, 0x027b4c84, 0x020274b1, 0x027e47d9, 0x00105175}}, Y: Field{[10]uint32{0x0113f096, 0x0085ce91, 0x00ea9492, 0x001f58a4, 0x03daeae0, 0x0036a993, 0x008604d9, 0x01fe0a5c, 0x00fc2a4f, 0x00151c7d}}}, + {X: Field{[10]uint32{0x00686825, 0x035d03d7, 0x02fa3c1a, 0x021f9e96, 0x02427e30, 0x01ce373a, 0x015314aa, 0x02755aec, 0x037f4cd7, 0x000b455f}}, Y: Field{[10]uint32{0x016fc1c0, 0x03c7a88a, 0x034eeeab, 0x0084e9c8, 0x02962a4e, 0x01d9aed1, 0x027a29a2, 0x027d2e53, 0x03187615, 0x0030713c}}}, + {X: Field{[10]uint32{0x033933ba, 0x035e5869, 0x0187b361, 0x025a089a, 0x03d6e896, 0x0304aa06, 0x03e26cb0, 0x002cb977, 0x02847704, 0x000bd098}}, Y: Field{[10]uint32{0x0144075e, 0x0120f460, 0x024bd45e, 0x010a1e7c, 0x00a384f9, 0x01d54cbe, 0x03cf601c, 0x00a1e7bf, 0x020d141b, 0x002f7384}}}, + {X: Field{[10]uint32{0x03bf527f, 0x007fff0e, 0x0220ab8a, 0x0110dfa8, 0x03bf9f8f, 0x03bc8f29, 0x003c9c0e, 0x004c0b9a, 0x03a76cc9, 0x002d0673}}, Y: Field{[10]uint32{0x02929517, 0x009478ea, 0x00dba3c0, 0x015b8f34, 0x00a911e9, 0x012201ad, 0x0091a70b, 0x00906792, 0x014e290f, 0x002ee1a5}}}, + {X: Field{[10]uint32{0x0125236f, 0x035cb552, 0x018dcae2, 0x0026c0da, 0x012b17bd, 0x0037b64e, 0x02f2913f, 0x00593f1e, 0x02f95734, 0x00336d29}}, Y: Field{[10]uint32{0x02c8e7aa, 0x03e39baa, 0x025ffc9e, 0x00f013c4, 0x01d57c96, 0x01265914, 0x0100c47d, 0x03d75c39, 0x0236bd1b, 0x00227b68}}}, + {X: Field{[10]uint32{0x0008c256, 0x02003e3d, 0x00a3e321, 0x013088cf, 0x00a12a8c, 0x000e4bfa, 0x026f2f15, 0x031128cf, 0x0351a45a, 0x003b53a9}}, Y: Field{[10]uint32{0x030ffef2, 0x01018d25, 0x0264acaf, 0x018e62b3, 0x00a296d9, 0x0013644b, 0x01266d4d, 0x00d26aba, 0x01a74a2b, 0x00271fa7}}}, + {X: Field{[10]uint32{0x00fbf5d3, 0x03b3428f, 0x0287c96d, 0x000be9e6, 0x0384a74b, 0x037c229c, 0x00ccfcd1, 0x018f0a0c, 0x0138fdf9, 0x0026c1bf}}, Y: Field{[10]uint32{0x03226416, 0x0277801a, 0x020d4eb2, 0x028ca86c, 0x023ede27, 0x0136b435, 0x004ba3cd, 0x018056bb, 0x021ce7ee, 0x003a1991}}}, + {X: Field{[10]uint32{0x02f6ae75, 0x01b94846, 0x004ef516, 0x012f7869, 0x02c2b789, 0x001c0815, 0x0213f1ee, 0x03346a5f, 0x001eefc1, 0x0037c452}}, Y: Field{[10]uint32{0x022b7e02, 0x0152ae88, 0x03ad4a83, 0x0185c5ea, 0x0180c766, 0x039cf8b3, 0x02e1f24d, 0x027e87af, 0x00563542, 0x00285046}}}, + {X: Field{[10]uint32{0x02a3c9f5, 0x0280cb44, 0x0284523d, 0x00569462, 0x0146e4df, 0x0201f186, 0x03bc65de, 0x00fecf41, 0x01010b1f, 0x003e0ca3}}, Y: Field{[10]uint32{0x01ca6216, 0x003c4033, 0x01df0d5e, 0x0051e9c2, 0x02de1749, 0x0172a7af, 0x029a6d0b, 0x0351e272, 0x00747746, 0x0038a76f}}}, + {X: Field{[10]uint32{0x013fff86, 0x03c024d3, 0x01e461fc, 0x01ea4b82, 0x01ff0d1b, 0x02b313ed, 0x02135900, 0x008c07e6, 0x03bdb7fc, 0x000f8ebe}}, Y: Field{[10]uint32{0x02b6ebd6, 0x0098849b, 0x00742f0f, 0x0070fb0a, 0x01a5c2af, 0x01866bac, 0x004c8d09, 0x007146f5, 0x03e1b982, 0x0007f1fd}}}, + {X: Field{[10]uint32{0x03f86125, 0x007aa6c7, 0x0166074d, 0x02013154, 0x0078ede8, 0x0274cd6d, 0x0019f8b6, 0x02005673, 0x02ea6834, 0x002ab45f}}, Y: Field{[10]uint32{0x01365257, 0x033e77e7, 0x008e8ed6, 0x02749ad2, 0x00dfa174, 0x0187ba44, 0x00f45bf3, 0x02276d9f, 0x038cebab, 0x0003a64e}}}, + {X: Field{[10]uint32{0x010ea35c, 0x03a65ca4, 0x0072d37c, 0x02e3eca4, 0x00286442, 0x0389a85e, 0x00f44b6f, 0x031a1bfa, 0x03195515, 0x00084fee}}, Y: Field{[10]uint32{0x0152a852, 0x0225a77b, 0x0136218e, 0x016189e0, 0x03d68c39, 0x0261d880, 0x00ee5771, 0x03d2ecb4, 0x011b7df7, 0x00125ee5}}}, + {X: Field{[10]uint32{0x030120fa, 0x024de40d, 0x021a2924, 0x011c24a0, 0x03eba91b, 0x022e31e9, 0x013321ec, 0x020678fa, 0x02a578ed, 0x00335fdc}}, Y: Field{[10]uint32{0x01bb1148, 0x03d7f3d1, 0x03ce2d8f, 0x02464fa5, 0x02ca4eac, 0x02441df9, 0x02c537d9, 0x003cb3e8, 0x00709928, 0x0028f547}}}, + {X: Field{[10]uint32{0x027f3b51, 0x0248f82d, 0x01b19068, 0x03061e3e, 0x038240ae, 0x0346a78b, 0x023a28a1, 0x00a4e7e6, 0x00c700a7, 0x001c28d8}}, Y: Field{[10]uint32{0x01710259, 0x001554ab, 0x021b73eb, 0x0261b4bd, 0x00dd175c, 0x01a82ee3, 0x024ae36b, 0x036f08ba, 0x007c53a4, 0x00287670}}}, + {X: Field{[10]uint32{0x01b5e46a, 0x01d98048, 0x02d337a0, 0x03f67369, 0x00eedc35, 0x027a72fa, 0x021dd199, 0x00ad983e, 0x015b4f8e, 0x00151298}}, Y: Field{[10]uint32{0x028451e5, 0x0142cd6e, 0x026bd751, 0x0269cc23, 0x03d7ba7a, 0x0376725f, 0x0286aecb, 0x03235d94, 0x01b9c76f, 0x001d749b}}}, + {X: Field{[10]uint32{0x02c8acef, 0x030d19e3, 0x03c92a01, 0x03dcdb08, 0x00f8b779, 0x01356d72, 0x019b2657, 0x01cf5ebc, 0x039f76a0, 0x00108635}}, Y: Field{[10]uint32{0x02cfb28e, 0x0007ae6f, 0x00bdaf2c, 0x0157881f, 0x0187e603, 0x02ca1308, 0x01c05f4e, 0x00ed7f99, 0x02314907, 0x001a057d}}}, + {X: Field{[10]uint32{0x0269b0a9, 0x00bf06a8, 0x03b3864a, 0x01767936, 0x0203deca, 0x018d7e0e, 0x03337598, 0x02b30628, 0x02381a82, 0x001ab689}}, Y: Field{[10]uint32{0x02da6c08, 0x03388a57, 0x033bae8a, 0x03e2d854, 0x012e77b6, 0x022d7e10, 0x0105f32b, 0x0149bd83, 0x02da65f7, 0x0014f4d5}}}, + {X: Field{[10]uint32{0x0118b09e, 0x019863b8, 0x03579336, 0x0291e04f, 0x018bd46e, 0x030e0b10, 0x0118e987, 0x026965d5, 0x0101d9f2, 0x0017ea67}}, Y: Field{[10]uint32{0x03fc3b39, 0x003a0b4c, 0x034cd6fc, 0x000b6fb0, 0x02f15f66, 0x0260994a, 0x00e381e4, 0x02e06f73, 0x023838de, 0x00351e74}}}, + {X: Field{[10]uint32{0x00d76f6e, 0x000656d1, 0x03e4412d, 0x0002cadf, 0x030bbb4a, 0x03fbe5b4, 0x02676d72, 0x019eadba, 0x017634cc, 0x00331bb5}}, Y: Field{[10]uint32{0x03bf820c, 0x002bd8bd, 0x03e94f52, 0x00343692, 0x03dd801b, 0x020d0a13, 0x009e5f15, 0x0266e2ab, 0x015ad509, 0x0002c570}}}, + {X: Field{[10]uint32{0x00ffceb4, 0x00bb8e90, 0x03ddfec3, 0x01e761d1, 0x01ff4476, 0x00289adb, 0x0310bf89, 0x03a8ff7a, 0x03db5323, 0x00393343}}, Y: Field{[10]uint32{0x0220e1f5, 0x021a8c34, 0x00c48d5d, 0x01ef107e, 0x00e2caa8, 0x02dd8a71, 0x02af718d, 0x010d5d95, 0x00c8ba9c, 0x003ef6d0}}}, + {X: Field{[10]uint32{0x0388a8af, 0x02df3626, 0x025686af, 0x03b1e9d5, 0x030b3c1f, 0x008d1a0c, 0x01e3ca1a, 0x02e4a6b0, 0x022aba51, 0x001dff5c}}, Y: Field{[10]uint32{0x01e98505, 0x0243d6cf, 0x006919cf, 0x016cb1ec, 0x006b5b55, 0x037d2edd, 0x0378ee31, 0x0272d13c, 0x01e10d6e, 0x00340946}}}, + {X: Field{[10]uint32{0x017a41dd, 0x010630a6, 0x033e2665, 0x008e57fd, 0x006291e5, 0x00a67d3e, 0x03ca57bf, 0x00f51e74, 0x03bca9dd, 0x00134e47}}, Y: Field{[10]uint32{0x00ce899e, 0x03afc96d, 0x02fce1a9, 0x0310e7b1, 0x03e5d4a3, 0x024f10fc, 0x03e9fcd5, 0x0181aee4, 0x0033b55e, 0x0017327b}}}, + {X: Field{[10]uint32{0x03084e97, 0x00e9115c, 0x022ba83f, 0x03e20586, 0x012eb232, 0x0324bfa0, 0x019d63c3, 0x01ee1172, 0x004617b1, 0x001d02f1}}, Y: Field{[10]uint32{0x00355464, 0x00952bfe, 0x00c67883, 0x00aa640a, 0x02fb1074, 0x004c061d, 0x0317481c, 0x02559dc5, 0x006e0f4f, 0x0003f63b}}}, + {X: Field{[10]uint32{0x01b46e5c, 0x004396c0, 0x00392b2d, 0x03106f73, 0x00c6aa12, 0x0333b40c, 0x02fd8d60, 0x02114d6e, 0x021cadeb, 0x00309630}}, Y: Field{[10]uint32{0x01171d31, 0x01884e57, 0x022af4cb, 0x029d7b0f, 0x02b73646, 0x0083797c, 0x01d08afa, 0x02f5fdce, 0x037f3e60, 0x001f37c0}}}, + {X: Field{[10]uint32{0x00130d44, 0x03fee0c9, 0x01768dbe, 0x01786fff, 0x01fac22a, 0x00327299, 0x0180261c, 0x0135742f, 0x0069733a, 0x0023f220}}, Y: Field{[10]uint32{0x02fc946e, 0x03d2a804, 0x00a95954, 0x0298e3c3, 0x01ca5bf0, 0x0073b9a4, 0x0137ba74, 0x0010b553, 0x014bf88c, 0x0010846a}}}, + {X: Field{[10]uint32{0x0096ad4c, 0x0186ee43, 0x027c967a, 0x038ccae0, 0x00f5152d, 0x03a674c5, 0x03b0e0bc, 0x007091fe, 0x021a4032, 0x0033d8bb}}, Y: Field{[10]uint32{0x02c4a3fe, 0x00259007, 0x015a19bb, 0x00d99043, 0x02e61373, 0x01f70348, 0x01978c07, 0x01ee352f, 0x03c3e64f, 0x0018a129}}}, + {X: Field{[10]uint32{0x009f8ba7, 0x00103915, 0x019d06c0, 0x032bf5bf, 0x00bb00b3, 0x026da458, 0x00884431, 0x01dd83b3, 0x038a4d44, 0x0014cd47}}, Y: Field{[10]uint32{0x037f6b83, 0x014af34d, 0x02a0a163, 0x02e23027, 0x00c7c1cb, 0x015220e1, 0x01c148fd, 0x039bfdd5, 0x02193816, 0x0020e113}}}, + {X: Field{[10]uint32{0x0106bb0c, 0x00cd2287, 0x000a9e17, 0x01eb4b98, 0x03baa015, 0x02b3a501, 0x010e1f62, 0x02464653, 0x03ceee2c, 0x00280818}}, Y: Field{[10]uint32{0x03146339, 0x03061ba7, 0x01de05f4, 0x02c0401f, 0x03fcdaee, 0x011122a2, 0x01b40eac, 0x00fd4b6a, 0x01b55565, 0x0018c118}}}, + {X: Field{[10]uint32{0x01d35660, 0x02a35bf8, 0x018575a6, 0x027a546e, 0x02c360c0, 0x0259822a, 0x034f3741, 0x005d91c9, 0x01cc25de, 0x001c2f2f}}, Y: Field{[10]uint32{0x03461d74, 0x02c3d3b6, 0x02b64a90, 0x00c252a0, 0x003a1c74, 0x02787503, 0x035e719a, 0x01673a02, 0x019b7163, 0x000ef56f}}}, + {X: Field{[10]uint32{0x02dc8fc7, 0x004b466a, 0x01fff138, 0x0305d055, 0x0054b161, 0x02945778, 0x03b1fe52, 0x030f01be, 0x017783cf, 0x00037e2b}}, Y: Field{[10]uint32{0x00069569, 0x031cd560, 0x0060444e, 0x006c4993, 0x01af3840, 0x002df2e6, 0x034ff20a, 0x036c3274, 0x00f60416, 0x002f1024}}}, + {X: Field{[10]uint32{0x000a30f9, 0x02a76795, 0x009ed777, 0x011f8154, 0x028788df, 0x014b55be, 0x02fff3a4, 0x0260017c, 0x01ccef39, 0x0009413a}}, Y: Field{[10]uint32{0x0390612a, 0x0167de5c, 0x00a51116, 0x013b6da4, 0x036fd651, 0x02d7f60c, 0x03f4d2fa, 0x023bf2bd, 0x02a2c6f4, 0x001cf141}}}, + {X: Field{[10]uint32{0x03c97025, 0x005068d6, 0x03a61571, 0x00320678, 0x0218a9ce, 0x0225e7f3, 0x02a6fa56, 0x000cd0e9, 0x03241c92, 0x00093b81}}, Y: Field{[10]uint32{0x00bd7b8a, 0x00909f2c, 0x00bf6ba2, 0x00580bec, 0x03fa0c68, 0x035fd364, 0x0140a6cc, 0x0213a1a2, 0x02cd605b, 0x003b990b}}}, + {X: Field{[10]uint32{0x023929b3, 0x01b6465e, 0x03093e1c, 0x00ac9700, 0x014961e1, 0x00825fcd, 0x00d8eb11, 0x0301698f, 0x00e09665, 0x0007ab57}}, Y: Field{[10]uint32{0x0156fcc3, 0x012a9b5c, 0x0009dc2f, 0x03d77b9c, 0x007284b5, 0x00775c48, 0x0032fbea, 0x03312ac7, 0x035da1ab, 0x00060037}}}, + {X: Field{[10]uint32{0x0205d507, 0x01e247ba, 0x009c098e, 0x03bcb97a, 0x03160c69, 0x020e21d2, 0x020b0dcd, 0x013e3e40, 0x03f22608, 0x0011f3cb}}, Y: Field{[10]uint32{0x01fb7d48, 0x03e948b5, 0x03516cf8, 0x03723720, 0x00bca2ef, 0x00e19919, 0x004d0d2c, 0x016bfc41, 0x03df129b, 0x0028d034}}}, + {X: Field{[10]uint32{0x02d6cbdd, 0x038e7110, 0x03e75b04, 0x02a0fe69, 0x0151f050, 0x0391d293, 0x018bb8ea, 0x01254a88, 0x039b8e2e, 0x0010193e}}, Y: Field{[10]uint32{0x0035de10, 0x0221b76e, 0x03d2b9c7, 0x030346b7, 0x0118ea66, 0x02b77383, 0x013e02aa, 0x0064c24b, 0x0076a2ef, 0x003fe73b}}}, + {X: Field{[10]uint32{0x0381904e, 0x038cd4fe, 0x000d222d, 0x0101a766, 0x03cdd70a, 0x029b5007, 0x01e0150b, 0x008340c8, 0x00d6e58e, 0x0020e2b2}}, Y: Field{[10]uint32{0x015614bc, 0x015222b6, 0x027105f9, 0x03f03a24, 0x01b1ef24, 0x01054ccc, 0x01a6b251, 0x036efdee, 0x03962909, 0x00264e9b}}}, + {X: Field{[10]uint32{0x0202f266, 0x03a6d7b8, 0x033855fc, 0x01caf133, 0x035aedee, 0x03b3d650, 0x016ea260, 0x010f48d3, 0x0183189d, 0x002978db}}, Y: Field{[10]uint32{0x01822c55, 0x02c7251e, 0x03fe954a, 0x02d79fae, 0x03dfc2d1, 0x01050d68, 0x012933fb, 0x00ee2677, 0x003ce25c, 0x001e300b}}}, + {X: Field{[10]uint32{0x03ba72c9, 0x0323f8c7, 0x035725dd, 0x01ea6d47, 0x015ad79e, 0x0235bdeb, 0x03312095, 0x03134cd3, 0x00bcd357, 0x00278903}}, Y: Field{[10]uint32{0x0111f06b, 0x0245cb2d, 0x030eb672, 0x00433be7, 0x0068cc5e, 0x00c2cf27, 0x01476b7b, 0x02818bb0, 0x025ced60, 0x002ba8d2}}}, + {X: Field{[10]uint32{0x02dc2eba, 0x036bb0ed, 0x020c7ea8, 0x016a182f, 0x02dfc9ed, 0x03b91e89, 0x022b91d1, 0x014e0170, 0x0246bb31, 0x002b46c1}}, Y: Field{[10]uint32{0x02dd2083, 0x02e65564, 0x018bb353, 0x02a5b4c3, 0x03a298da, 0x0285661c, 0x0110c9ee, 0x0314246a, 0x01a22499, 0x003b8b98}}}, + {X: Field{[10]uint32{0x030ec72b, 0x02df34d6, 0x020cc35c, 0x01d288da, 0x02fa12df, 0x0047b2a9, 0x00d8c7f0, 0x03d92954, 0x008911d8, 0x0013dec2}}, Y: Field{[10]uint32{0x01bb21e3, 0x00549713, 0x01d993e3, 0x0143c778, 0x0129b942, 0x035fe1a4, 0x019ffac8, 0x01f862d3, 0x001b0d29, 0x0024c6bd}}}, + {X: Field{[10]uint32{0x03d3a7ee, 0x00d48f24, 0x01870d2d, 0x01d0d5a5, 0x02834d02, 0x002ec4be, 0x03ba8747, 0x023cf24f, 0x0170e410, 0x0036aca8}}, Y: Field{[10]uint32{0x0173ae4d, 0x002cbef1, 0x0251e7bb, 0x01bc5d19, 0x03293a5c, 0x002338d6, 0x02ecb24d, 0x0004377a, 0x02cfc37f, 0x00098bc4}}}, + {X: Field{[10]uint32{0x03cf39be, 0x031d2128, 0x03a317ab, 0x021f12f3, 0x02d499f6, 0x0046d699, 0x01e50823, 0x035cb906, 0x017b0784, 0x000d0dc9}}, Y: Field{[10]uint32{0x01c398d3, 0x02cef6a9, 0x00ec2a49, 0x0281dbc7, 0x00f38bd0, 0x02c1b5f0, 0x013fa143, 0x035a3a11, 0x03076da8, 0x0033a6f3}}}, + {X: Field{[10]uint32{0x0099545b, 0x0179cd82, 0x0155c9ed, 0x0024d2b4, 0x03939fa4, 0x028d2feb, 0x0386024e, 0x006ad6fd, 0x029f8261, 0x0011652b}}, Y: Field{[10]uint32{0x02d450f5, 0x00fe4a3a, 0x00da4c4b, 0x0178fb83, 0x0177d3f1, 0x01ded1e3, 0x0034e72e, 0x02e9cb0e, 0x03f562b0, 0x00089571}}}, + {X: Field{[10]uint32{0x01898819, 0x0084b760, 0x003c2f13, 0x00dac89d, 0x033aebb0, 0x01ad6169, 0x02b21fc2, 0x001bec0d, 0x030512db, 0x0001ccdd}}, Y: Field{[10]uint32{0x00307887, 0x00315fd4, 0x03c51515, 0x03b4a4a0, 0x00848b53, 0x0161fcfe, 0x01cf461c, 0x02c28958, 0x0159725f, 0x001d4f77}}}, + {X: Field{[10]uint32{0x029790ff, 0x02af59b5, 0x0372e3f2, 0x00b41953, 0x00a53f4c, 0x0231d2af, 0x02d81c10, 0x03fbcd54, 0x00144d2a, 0x002f6456}}, Y: Field{[10]uint32{0x0027763e, 0x01fb4b46, 0x005b950e, 0x016e5783, 0x0231ae89, 0x017d1c52, 0x02b3277a, 0x038dced0, 0x01e17f27, 0x0006bd82}}}, + {X: Field{[10]uint32{0x015bb557, 0x0395b6e4, 0x03c73d4c, 0x01007d27, 0x01677827, 0x00f621c3, 0x001ced90, 0x03fb88a3, 0x014ca51d, 0x00228473}}, Y: Field{[10]uint32{0x02f5cf23, 0x003d8655, 0x017196be, 0x03c09cce, 0x02ca46b3, 0x03d1c403, 0x00278229, 0x02725fbb, 0x03eeae9f, 0x0034c2b5}}}, + {X: Field{[10]uint32{0x039bfcfd, 0x011b61db, 0x01ea697d, 0x035f0291, 0x03cfd058, 0x016c09ca, 0x023e6886, 0x02ffadb0, 0x01f02802, 0x001e4a6d}}, Y: Field{[10]uint32{0x00fde5d0, 0x02d538bd, 0x00b36963, 0x033507c2, 0x018c80d1, 0x00aa2430, 0x01e366c3, 0x01e0f534, 0x02218039, 0x003e6eeb}}}, + {X: Field{[10]uint32{0x03d89d01, 0x0131498e, 0x018bcf6e, 0x01566c69, 0x03d55f88, 0x0327c07c, 0x000e79bc, 0x0259be02, 0x02ac1d5b, 0x002037c1}}, Y: Field{[10]uint32{0x01136538, 0x006ab250, 0x03a7ebe4, 0x00dc9983, 0x025ee5c3, 0x030043cd, 0x025614ba, 0x0162a498, 0x02d0a595, 0x000d1a49}}}, + {X: Field{[10]uint32{0x025ccaf7, 0x020cc56f, 0x00ac6efc, 0x036b483d, 0x03ed4b01, 0x020eb44e, 0x0292b4f3, 0x020fca52, 0x00789ff3, 0x001d1515}}, Y: Field{[10]uint32{0x0160fa9a, 0x01ddf2f0, 0x00ceafae, 0x018679d8, 0x03e82173, 0x0133cad7, 0x01ea165c, 0x01dffb78, 0x037781ee, 0x000d9227}}}, + {X: Field{[10]uint32{0x02f8fe85, 0x00af3616, 0x01e67de6, 0x0357e1df, 0x03e562d7, 0x00a0a2df, 0x0011fdb4, 0x02a28257, 0x01bcb213, 0x000b1b4d}}, Y: Field{[10]uint32{0x035d159b, 0x02f9ad31, 0x0163144d, 0x0270af4d, 0x002e6013, 0x00bc8ca6, 0x002206c7, 0x013e7d14, 0x03703409, 0x002a8c38}}}, + {X: Field{[10]uint32{0x02e338db, 0x0369c3ec, 0x027be830, 0x0274c12a, 0x024b4342, 0x00a33458, 0x011846a7, 0x013ac0a0, 0x017a9d93, 0x0020d4d9}}, Y: Field{[10]uint32{0x00e02b71, 0x0275011d, 0x003b166a, 0x02bcebfe, 0x02ed4a4c, 0x039a4f22, 0x0189c5ac, 0x03e974a0, 0x0038020f, 0x003e1001}}}, + {X: Field{[10]uint32{0x02ae494f, 0x02a377ea, 0x027f6fd1, 0x01cd3b61, 0x012177ca, 0x018698a6, 0x02f63365, 0x015b5f1f, 0x013a54ce, 0x003c85ba}}, Y: Field{[10]uint32{0x00d30611, 0x00fa912b, 0x036723f4, 0x02dc0bc6, 0x038da296, 0x004730d1, 0x03e8fadb, 0x020c9818, 0x0313a0fe, 0x0036c28f}}}, + {X: Field{[10]uint32{0x008324fb, 0x0342046a, 0x03112273, 0x032379b9, 0x002e9a3d, 0x018bb1fd, 0x022baa4b, 0x01cfe595, 0x02219b5d, 0x00370dc4}}, Y: Field{[10]uint32{0x0357c004, 0x02c553f7, 0x000fb581, 0x0055f0cc, 0x004f1c90, 0x00a7e6ed, 0x020acaa9, 0x00fa58dc, 0x0092ec56, 0x003bb324}}}, + {X: Field{[10]uint32{0x02649475, 0x02641c8d, 0x0116dd44, 0x01ed0959, 0x02b10f04, 0x03bd4d2b, 0x02f60296, 0x02d3c787, 0x036d48f0, 0x0036cd1c}}, Y: Field{[10]uint32{0x00586bec, 0x02f93fab, 0x00fdfdd1, 0x01985934, 0x001a1169, 0x024f9462, 0x02c34c9b, 0x031e1a54, 0x016cf7a8, 0x00070a73}}}, + {X: Field{[10]uint32{0x03696add, 0x031ca5c0, 0x03d3378f, 0x03b4d63e, 0x01971b09, 0x00bd6f3c, 0x015af536, 0x021093cd, 0x00572046, 0x00028921}}, Y: Field{[10]uint32{0x02547803, 0x028ddd89, 0x006948c9, 0x00c6f214, 0x03baffc9, 0x00b8915c, 0x0367a56c, 0x037ae28d, 0x016137d0, 0x00269c0f}}}, + {X: Field{[10]uint32{0x024436c4, 0x027ea8c4, 0x01ed240c, 0x02e63ec9, 0x023eba38, 0x007da343, 0x02aa4293, 0x01d4eeef, 0x006fa9ac, 0x002edee0}}, Y: Field{[10]uint32{0x02426752, 0x020daa04, 0x02e646e5, 0x0273e6d0, 0x0007c6ff, 0x026c0543, 0x03682e3d, 0x02efa366, 0x0174a1a8, 0x0023e049}}}, + {X: Field{[10]uint32{0x03ecf446, 0x0025bff0, 0x01ad517b, 0x02a9d125, 0x00489344, 0x02783c1a, 0x02194276, 0x02808fd9, 0x0076fc28, 0x0019c0f1}}, Y: Field{[10]uint32{0x00e2a38c, 0x02b10f4a, 0x0215eed3, 0x02ac148b, 0x00f42699, 0x019cc785, 0x00211a30, 0x029c8d61, 0x023f7c9b, 0x0022d200}}}, + {X: Field{[10]uint32{0x02dbf6a2, 0x012e9878, 0x023b71b4, 0x02a8d251, 0x0214cf0d, 0x00584ae0, 0x023f3b7a, 0x02d123f8, 0x00e4bfa4, 0x002f2abe}}, Y: Field{[10]uint32{0x01c7f404, 0x0385c435, 0x01736d6f, 0x03b1a333, 0x03b07498, 0x02fa1e4e, 0x0108835d, 0x0254ffa7, 0x0300e2cc, 0x002f7fc9}}}, + {X: Field{[10]uint32{0x0310cd49, 0x0361e464, 0x00f7bbfe, 0x005cfb1d, 0x02217945, 0x01c9a8b9, 0x015b446d, 0x01c88077, 0x03da1a55, 0x00241ad3}}, Y: Field{[10]uint32{0x012653cf, 0x029d34e2, 0x00f93441, 0x0240b5fd, 0x01cf8384, 0x021a421c, 0x0304bc47, 0x0134a340, 0x02dbcd2c, 0x0035d4fc}}}, + {X: Field{[10]uint32{0x02f93d5f, 0x009ab0e7, 0x029058d7, 0x0337ade1, 0x00fa5369, 0x006ff741, 0x000e326e, 0x01f65546, 0x0383018f, 0x0027b025}}, Y: Field{[10]uint32{0x03acf205, 0x0252b765, 0x02049d17, 0x03e3e252, 0x00ad22ba, 0x034a3edc, 0x02c68424, 0x0059054e, 0x0057994b, 0x002732a0}}}, + {X: Field{[10]uint32{0x02b8209d, 0x038cc504, 0x030f3a2d, 0x02faec00, 0x036f823c, 0x004534bc, 0x0362a96f, 0x0103b0a0, 0x0106b754, 0x0014cd1e}}, Y: Field{[10]uint32{0x020c1fa0, 0x02824332, 0x0034ab06, 0x0200f864, 0x01595816, 0x025543b1, 0x02f1bf02, 0x022af91f, 0x00e0471f, 0x000332ce}}}, + {X: Field{[10]uint32{0x023a4870, 0x023e0374, 0x013373b9, 0x00445485, 0x03a33e54, 0x02cd5e01, 0x0224b18e, 0x0012024f, 0x032961b7, 0x0009f14f}}, Y: Field{[10]uint32{0x02575601, 0x02e222f6, 0x014fe2f3, 0x03ea2016, 0x00703fa5, 0x02b23139, 0x03c70e59, 0x00db11c7, 0x038de186, 0x00168fd2}}}, + {X: Field{[10]uint32{0x0259b68f, 0x03339d77, 0x02a5beac, 0x028f9d72, 0x0322ed51, 0x03d57084, 0x02616bac, 0x017e684a, 0x03e37a11, 0x00248649}}, Y: Field{[10]uint32{0x0327b141, 0x00db1341, 0x00ae2e06, 0x01c45e19, 0x0155884e, 0x0098f5de, 0x02fb5906, 0x0316d662, 0x007bc1e4, 0x002f6edf}}}, + {X: Field{[10]uint32{0x033ea8c2, 0x01b35b8f, 0x01ff8dde, 0x002468f6, 0x01efb3e6, 0x0390c9d4, 0x03c692ca, 0x007ff59d, 0x00876eb8, 0x0025cecf}}, Y: Field{[10]uint32{0x03bbb0ed, 0x03af7655, 0x003b849a, 0x02b8ea5a, 0x018684b0, 0x036f3b36, 0x0112c5da, 0x01442e90, 0x03710129, 0x000d037d}}}, + {X: Field{[10]uint32{0x0301ae71, 0x017a6b06, 0x02ce4020, 0x00c84995, 0x00d5972c, 0x024811c0, 0x038ef036, 0x00dd9e64, 0x03def053, 0x00082e05}}, Y: Field{[10]uint32{0x0395707b, 0x0052aa20, 0x01c1234a, 0x0193faa6, 0x01c6b1ce, 0x01282af1, 0x025c3529, 0x02805871, 0x025be2da, 0x000ab8bf}}}, + {X: Field{[10]uint32{0x03c95876, 0x02226d28, 0x01402aa6, 0x0358f64c, 0x01ca9fc5, 0x01cbad0f, 0x02347b7f, 0x0246041e, 0x004f7a7e, 0x0018f895}}, Y: Field{[10]uint32{0x000d16b1, 0x032b5c4a, 0x02067f91, 0x02c7e1b9, 0x02adf49c, 0x022f57eb, 0x01cdf521, 0x00533801, 0x026d20d7, 0x00398abb}}}, + {X: Field{[10]uint32{0x022aeb80, 0x00e5d4f8, 0x034216ac, 0x01cb9060, 0x01a69dd4, 0x011f5d8b, 0x0183abfc, 0x0233c2cd, 0x02107150, 0x000be437}}, Y: Field{[10]uint32{0x0388d389, 0x024eaf4d, 0x0264b761, 0x0226708f, 0x00880f3a, 0x02846122, 0x01e5e025, 0x0375d189, 0x02bd04a0, 0x0014dc6f}}}, + {X: Field{[10]uint32{0x02ed7209, 0x0373ca74, 0x0048ac9a, 0x03082b47, 0x037c9359, 0x03968d47, 0x0237cf75, 0x01b41517, 0x00e8faa9, 0x0023508f}}, Y: Field{[10]uint32{0x03ab40f2, 0x002c4a42, 0x03d6eea8, 0x03056b02, 0x03bb9d23, 0x0299570f, 0x00df7948, 0x03100686, 0x003dee76, 0x0020f52e}}}, + {X: Field{[10]uint32{0x00181efd, 0x03b04420, 0x03ea3bec, 0x0220156c, 0x02a9c91d, 0x02451090, 0x03111a20, 0x022bfcc0, 0x01425e02, 0x0004be90}}, Y: Field{[10]uint32{0x00c3ff57, 0x00ab103a, 0x03d4dc4d, 0x022ecb8d, 0x03ee5c3b, 0x018bac43, 0x010eddb3, 0x00ad5eb0, 0x03708e79, 0x001ae56c}}}, + {X: Field{[10]uint32{0x02706f73, 0x011e20a2, 0x00bbff83, 0x01bfff43, 0x00ce7019, 0x037cb5cc, 0x0105632c, 0x0375f35d, 0x015f2a3b, 0x00248f2a}}, Y: Field{[10]uint32{0x0346abbc, 0x0106ad49, 0x032ee3e5, 0x036f2b42, 0x031903af, 0x00433ffc, 0x003983b2, 0x0185cece, 0x0066c39b, 0x003e2c32}}}, + {X: Field{[10]uint32{0x00893646, 0x027835a2, 0x01776a86, 0x02859882, 0x0064ce3a, 0x00a3d1c1, 0x023875a7, 0x0103a58f, 0x013e8782, 0x00021135}}, Y: Field{[10]uint32{0x03eeaca1, 0x01579cdb, 0x032b25b8, 0x031c67ec, 0x011c84f9, 0x01c4ef1d, 0x00c47b4a, 0x02307fe6, 0x029192bf, 0x00318334}}}, + {X: Field{[10]uint32{0x01dc98f3, 0x01eb087c, 0x02b2a65e, 0x027d998d, 0x03883829, 0x00016977, 0x0277ff81, 0x007636e8, 0x03d6c547, 0x0010de1b}}, Y: Field{[10]uint32{0x02091b51, 0x00bd4a95, 0x0127e914, 0x0213e630, 0x03745ff8, 0x021c1bf9, 0x039109cb, 0x016ef63d, 0x02c29c8c, 0x0034a4a8}}}, + {X: Field{[10]uint32{0x0236d7ab, 0x01cdb72b, 0x0257ce94, 0x01162c1c, 0x02bb0dec, 0x02e628b3, 0x0383f71f, 0x03b3d8e1, 0x028df5e9, 0x001b46f0}}, Y: Field{[10]uint32{0x00d549e6, 0x020008e2, 0x0238da0e, 0x001c8c85, 0x00e2c00e, 0x00a04237, 0x0214cf7a, 0x00111e18, 0x0192bfd8, 0x0030b150}}}, + {X: Field{[10]uint32{0x02ff86c6, 0x0255aac5, 0x037f67d8, 0x0333fe12, 0x016c742c, 0x00f89975, 0x033f89cc, 0x0338f0bb, 0x03347f74, 0x001af13b}}, Y: Field{[10]uint32{0x01b46408, 0x03f33c5e, 0x0066b8b0, 0x03918317, 0x01be26a6, 0x01af798b, 0x036be35c, 0x02c13c49, 0x02fd2d2a, 0x003ad124}}}, + {X: Field{[10]uint32{0x03678b38, 0x03ea66ef, 0x00ddcb35, 0x00af2ccf, 0x000d67a6, 0x00342357, 0x02a756e0, 0x00256350, 0x0075fa81, 0x001abd14}}, Y: Field{[10]uint32{0x025bff28, 0x01ffe7ee, 0x00bfd528, 0x024e1258, 0x02886c7b, 0x02dce199, 0x00ffc3fa, 0x020b1d9e, 0x024f0e76, 0x002b6edc}}}, + {X: Field{[10]uint32{0x01260600, 0x03a29995, 0x011caa24, 0x003e416b, 0x00939f34, 0x0156dd18, 0x02f49cd3, 0x018d96a5, 0x03763646, 0x003adb62}}, Y: Field{[10]uint32{0x03bea3cd, 0x02eb835f, 0x015c33c2, 0x021c0cfe, 0x0241f7a1, 0x000ee074, 0x03a11ff6, 0x002dfee6, 0x02fdaea3, 0x001eba73}}}, + {X: Field{[10]uint32{0x01795068, 0x0115d7a4, 0x000af11e, 0x026eb594, 0x01b34d5e, 0x02eb533d, 0x038dd694, 0x01f4fd9c, 0x02332fef, 0x002f4308}}, Y: Field{[10]uint32{0x011cf209, 0x02082fa7, 0x0113676f, 0x015ceaa7, 0x01a91c4d, 0x01a08e93, 0x01100b66, 0x02c8702a, 0x004e2ea0, 0x003aae97}}}, + {X: Field{[10]uint32{0x02b7e392, 0x03261e54, 0x034b5054, 0x027e010d, 0x030aa56d, 0x01092455, 0x003e0831, 0x025064d2, 0x03bdc504, 0x0031788e}}, Y: Field{[10]uint32{0x02597751, 0x022b1e9b, 0x00fe2f7f, 0x019a156d, 0x038d59e7, 0x02a92b8f, 0x01cd02e3, 0x0085feff, 0x00cbf684, 0x00132bae}}}, + {X: Field{[10]uint32{0x0092d2a3, 0x019f3e23, 0x00bd8108, 0x02637a8e, 0x0017178e, 0x03487181, 0x003edb03, 0x02ae4955, 0x0231f3aa, 0x002d5c5d}}, Y: Field{[10]uint32{0x0011942a, 0x01027ca3, 0x020e9a02, 0x02b23c74, 0x00d2bdf0, 0x00936ead, 0x03318745, 0x02a7bc22, 0x01cc0324, 0x0039d082}}}, + {X: Field{[10]uint32{0x01305cfc, 0x012d7a57, 0x00cca2fe, 0x01f1ee0e, 0x01b2d17b, 0x00c281f8, 0x00a85d5d, 0x007cbf2b, 0x00994960, 0x00271158}}, Y: Field{[10]uint32{0x0304eeb6, 0x03b81bbf, 0x00674674, 0x030d6172, 0x00329273, 0x0079401e, 0x001b61b3, 0x0371f0a1, 0x0140a109, 0x000b5e85}}}, + {X: Field{[10]uint32{0x02a82f63, 0x01de9462, 0x00d5498c, 0x0175cc8a, 0x03e33dae, 0x00ed9812, 0x02ff1757, 0x00db12a2, 0x0146c0ab, 0x0014ab8a}}, Y: Field{[10]uint32{0x037f87b4, 0x035dc71d, 0x0104d24d, 0x0320190c, 0x027179f5, 0x019524fc, 0x003f899b, 0x006fe934, 0x019b6606, 0x001c388f}}}, + {X: Field{[10]uint32{0x0394adf9, 0x0167c280, 0x03dcef4f, 0x030b0a7b, 0x0189db9a, 0x0210207a, 0x01ba4903, 0x0118b770, 0x03bf55ff, 0x000527b0}}, Y: Field{[10]uint32{0x009dd7af, 0x02a2f05e, 0x01801341, 0x01737e52, 0x0049642b, 0x039a5472, 0x028fbc7c, 0x02e508ab, 0x0188b91d, 0x00016707}}}, + {X: Field{[10]uint32{0x02ea7ea7, 0x018e0410, 0x005768a1, 0x00270534, 0x03dbe14a, 0x0054e368, 0x03835346, 0x0063777f, 0x0294d667, 0x002bfe24}}, Y: Field{[10]uint32{0x0159266b, 0x0139d913, 0x00bb9a92, 0x0244aa23, 0x017b6154, 0x02f095b7, 0x022352ac, 0x021e97b3, 0x03ebcf58, 0x001c619a}}}, + {X: Field{[10]uint32{0x004e76fc, 0x02ed0196, 0x02b78da7, 0x02dce38a, 0x0133887e, 0x000f8ad0, 0x012d49b3, 0x0011cab5, 0x00782cb3, 0x0037913d}}, Y: Field{[10]uint32{0x02482bf5, 0x0348f273, 0x01da7eef, 0x03ea0c3b, 0x01b13d08, 0x02b23bc8, 0x03c630d7, 0x0360b015, 0x018425ba, 0x0019e62b}}}, + {X: Field{[10]uint32{0x01682e61, 0x03b1f1ce, 0x021345a2, 0x03aca253, 0x02b3a380, 0x006e80b1, 0x032c88be, 0x024d9b05, 0x02737616, 0x00382f1e}}, Y: Field{[10]uint32{0x022cb2e0, 0x01827349, 0x024d3c23, 0x030aad50, 0x035ad1f7, 0x01edfa64, 0x027c0ec8, 0x023fa37f, 0x02b933b1, 0x002f451f}}}, + {X: Field{[10]uint32{0x032f0e6d, 0x01e91d80, 0x03b1127c, 0x0269c73e, 0x02ed2613, 0x0294da88, 0x033cfa70, 0x027cce51, 0x03272af6, 0x0017b8d3}}, Y: Field{[10]uint32{0x00e13b8c, 0x018abab1, 0x036cb807, 0x004370d8, 0x011316bf, 0x01737bf1, 0x0257de98, 0x01360bda, 0x0396dc0d, 0x003077e3}}}, + {X: Field{[10]uint32{0x0199a0f2, 0x03397a39, 0x0113a68b, 0x011afb57, 0x03672968, 0x03855f5e, 0x00c274df, 0x01e98e6e, 0x03c177fa, 0x0013728e}}, Y: Field{[10]uint32{0x012fb234, 0x030cb14f, 0x032a1d01, 0x01a14bbf, 0x012fb489, 0x03d6723a, 0x033fd758, 0x026baff6, 0x015836fb, 0x0023f4ad}}}, + {X: Field{[10]uint32{0x00b48136, 0x0211d47e, 0x004f5bc1, 0x00d280d2, 0x00980810, 0x03a64fd5, 0x01ed9373, 0x000a43be, 0x03c18756, 0x001553da}}, Y: Field{[10]uint32{0x0172b26a, 0x0129af28, 0x0183d206, 0x00e8783f, 0x03de8086, 0x0230fd43, 0x03834e0e, 0x004a8d45, 0x03b7dfd5, 0x002d1530}}}, + {X: Field{[10]uint32{0x01592ad4, 0x00a096e1, 0x02ba420b, 0x01f2d4e7, 0x02955af8, 0x018b708b, 0x0160b2e1, 0x021e69aa, 0x0350a6c0, 0x00256a06}}, Y: Field{[10]uint32{0x0045c712, 0x006ac303, 0x011af265, 0x021bd9c0, 0x037c7d50, 0x00e2a930, 0x0072b75f, 0x008b47d6, 0x00c4dfed, 0x002f957a}}}, + {X: Field{[10]uint32{0x037e5c4d, 0x02e2f9d1, 0x01d853ef, 0x029ba8a4, 0x0244a4f8, 0x00c7d560, 0x00d14d34, 0x01a9b8d6, 0x01539e49, 0x00241edb}}, Y: Field{[10]uint32{0x03150eac, 0x021cb91d, 0x0265c21f, 0x0000a489, 0x01ff33e2, 0x0375f475, 0x0017fad1, 0x02ee799e, 0x02943853, 0x002cf4f5}}}, + {X: Field{[10]uint32{0x03f17aa6, 0x03330271, 0x003575bc, 0x0191adea, 0x01c8884c, 0x00fc5d81, 0x0337cb23, 0x015dbd9d, 0x001bb342, 0x002149f2}}, Y: Field{[10]uint32{0x037604fc, 0x013a3d61, 0x02a64504, 0x0274cce1, 0x019cd47b, 0x0115ddfc, 0x031930c1, 0x0149255e, 0x01bcdb8d, 0x002db59d}}}, + {X: Field{[10]uint32{0x03ab00ec, 0x025d38bb, 0x01e9f913, 0x00ea066e, 0x03bc6bf8, 0x03e41ba6, 0x02134360, 0x0036493a, 0x027d5a32, 0x0023878e}}, Y: Field{[10]uint32{0x0018b0b9, 0x002783fd, 0x01c4aff3, 0x01f1e4a0, 0x000792e0, 0x029e4b14, 0x023dad4e, 0x017c970c, 0x03abd81d, 0x003653c0}}}, + {X: Field{[10]uint32{0x019a8d76, 0x03eadd54, 0x0034d72c, 0x0125731d, 0x02dd0d89, 0x031a32da, 0x02cbd86b, 0x012a3426, 0x0393be1f, 0x003f00b2}}, Y: Field{[10]uint32{0x024d4f94, 0x00f1dc9f, 0x004e98b7, 0x027659fa, 0x02ffe4cd, 0x0216895b, 0x026ceb08, 0x01171662, 0x0132729e, 0x001c7de9}}}, + {X: Field{[10]uint32{0x03e6e7b8, 0x00a26c42, 0x016af80a, 0x01fe6cbb, 0x03ff7635, 0x03c21d46, 0x02c44db4, 0x022ceec6, 0x0302a285, 0x0033e604}}, Y: Field{[10]uint32{0x0173b528, 0x006fa223, 0x007bad3a, 0x00a2e221, 0x02f1a8a8, 0x0213c7e8, 0x0205ded9, 0x0199b9c0, 0x0012bf23, 0x0008dfa7}}}, + {X: Field{[10]uint32{0x00231d82, 0x03712faa, 0x01228e97, 0x00782e81, 0x0371718d, 0x03235433, 0x0274cbba, 0x03a480f2, 0x01dc1408, 0x000f9b91}}, Y: Field{[10]uint32{0x031ef848, 0x01d19dce, 0x028a3147, 0x0387c3f7, 0x03961009, 0x01fbe1b7, 0x01f287ca, 0x02a017d8, 0x037a2ad3, 0x000b8ff6}}}, + {X: Field{[10]uint32{0x007d4657, 0x02e7b69c, 0x028b3749, 0x02cb7c99, 0x023ce1b2, 0x00466c3b, 0x00090888, 0x0051c442, 0x03950758, 0x002ec11d}}, Y: Field{[10]uint32{0x01c67587, 0x00e45a1d, 0x01bc1bc4, 0x016ff38a, 0x028d6ee5, 0x036fbbb4, 0x01ad6977, 0x03ce9abd, 0x02fc5f95, 0x002569cb}}}, + {X: Field{[10]uint32{0x00dd6748, 0x01746e5a, 0x0193903f, 0x01b604a4, 0x0100fe35, 0x0338132d, 0x03a31034, 0x00b0412a, 0x0142b8b0, 0x00138057}}, Y: Field{[10]uint32{0x00a870fb, 0x010b001c, 0x00d2dd39, 0x03ea046f, 0x02746419, 0x02499d08, 0x00e96ffc, 0x01b5c765, 0x00e7dfbf, 0x0034d6c8}}}, + {X: Field{[10]uint32{0x00a49daf, 0x00dd1649, 0x0386792a, 0x03c90437, 0x0270850a, 0x01a341e3, 0x037391bd, 0x02c8427a, 0x005790c8, 0x00182693}}, Y: Field{[10]uint32{0x03ad0e98, 0x01540bc2, 0x00e8a0e3, 0x000347cd, 0x0314431d, 0x02290e42, 0x01cb14e7, 0x016ce960, 0x027ebc96, 0x003ce98c}}}, + {X: Field{[10]uint32{0x027fc730, 0x02eac0e8, 0x00aa1780, 0x0184c16d, 0x01b9ea07, 0x005fb3d8, 0x01b7558a, 0x016b0138, 0x03362a95, 0x00332f81}}, Y: Field{[10]uint32{0x0092cd3b, 0x0311fe47, 0x03abb71f, 0x00492c0f, 0x00d981a0, 0x00190ca6, 0x02a4e3ae, 0x02875d97, 0x00166c98, 0x003e5adf}}}, + {X: Field{[10]uint32{0x03ccab14, 0x01471a70, 0x008c3e21, 0x01a6a10e, 0x009143c5, 0x01384738, 0x0310ef90, 0x008c0b9a, 0x028285df, 0x001bb580}}, Y: Field{[10]uint32{0x02d196e7, 0x0247a946, 0x026081d5, 0x00709614, 0x03e91b0d, 0x0199798b, 0x03c75649, 0x00ede3a3, 0x03b0687a, 0x0019d7a8}}}, + {X: Field{[10]uint32{0x0349d8e0, 0x01ffda72, 0x02c7f4c0, 0x01dd10f6, 0x02708061, 0x0214554c, 0x033c5923, 0x02853156, 0x01cba0cc, 0x002f7fc1}}, Y: Field{[10]uint32{0x020c9a50, 0x0041b69b, 0x017981dd, 0x024eaab2, 0x03f09d79, 0x020ce443, 0x00a72390, 0x023b309d, 0x010486cd, 0x0014526b}}}, + {X: Field{[10]uint32{0x022bff2b, 0x01e64453, 0x0386eed5, 0x01570b1c, 0x00af9f6e, 0x01e6bb47, 0x03e53665, 0x00c96c8a, 0x028ccc70, 0x00019339}}, Y: Field{[10]uint32{0x01cb1cae, 0x01abb791, 0x0106bd59, 0x0387aad9, 0x0211bf1b, 0x0084f2ee, 0x021dddf2, 0x02683bbd, 0x01763c8a, 0x003e3226}}}, + {X: Field{[10]uint32{0x00ab2bb4, 0x0051c686, 0x007edaf0, 0x03d58984, 0x02b40de7, 0x007968bd, 0x02f3c06e, 0x0143cf72, 0x006f4891, 0x003350b9}}, Y: Field{[10]uint32{0x01bcfada, 0x03f68280, 0x025c281d, 0x0227d9e7, 0x0017f11f, 0x0094e9e2, 0x00921f4e, 0x01a59ed3, 0x00ddd202, 0x00367094}}}, + {X: Field{[10]uint32{0x01619735, 0x0157c062, 0x02c4359d, 0x0070d713, 0x025e9b12, 0x03b136ba, 0x01a7e8e3, 0x0150838b, 0x0007e714, 0x003df0a4}}, Y: Field{[10]uint32{0x03a493b7, 0x02928cfa, 0x023ddc2b, 0x00e8db3e, 0x005ea293, 0x0281b76c, 0x03735a56, 0x02a4f98d, 0x00064dbd, 0x00199145}}}, + {X: Field{[10]uint32{0x0293b7a8, 0x007d9e57, 0x010f2c5c, 0x034b6445, 0x00377609, 0x01c560d7, 0x033d2214, 0x0121589a, 0x01e1d494, 0x0018ce70}}, Y: Field{[10]uint32{0x02d59b28, 0x00cbf1cf, 0x02d95be5, 0x018261d8, 0x01d10a69, 0x03eb2e30, 0x015a20d8, 0x03a3dffd, 0x01ea47b4, 0x003bef9b}}}, + {X: Field{[10]uint32{0x0089b37b, 0x0160050d, 0x00b4daaf, 0x01e367d0, 0x0207b1ec, 0x027d3ae1, 0x00bbcf1e, 0x03b4197d, 0x03137d22, 0x003f33c7}}, Y: Field{[10]uint32{0x01bf3e10, 0x012d541f, 0x0111c64a, 0x02bc86cd, 0x016646be, 0x025d5ad3, 0x01559d9d, 0x02b30e20, 0x002fef9f, 0x002969df}}}, + {X: Field{[10]uint32{0x004f62d2, 0x03058010, 0x03d4e935, 0x035d63b0, 0x00a13434, 0x01ef23d7, 0x023b5541, 0x0213b3c4, 0x031006f2, 0x0036a5ff}}, Y: Field{[10]uint32{0x0312e168, 0x00c0732b, 0x0093cf8b, 0x008a2069, 0x024f3082, 0x0362ae4a, 0x031e3d1c, 0x00cc37cb, 0x028b4900, 0x00197085}}}, + {X: Field{[10]uint32{0x033e4fd8, 0x00b6260c, 0x039bddce, 0x03c887c2, 0x03343ab6, 0x006d1164, 0x0157556c, 0x009338da, 0x00d5428a, 0x00199da9}}, Y: Field{[10]uint32{0x01af7b41, 0x02c717cf, 0x01593854, 0x01611686, 0x03b7afcf, 0x0119f5e4, 0x034d3d83, 0x0094d7d7, 0x00a4b933, 0x00116f77}}}, + {X: Field{[10]uint32{0x017859ca, 0x004ab7b9, 0x01ccd302, 0x01e8a986, 0x0153396e, 0x00f7ba90, 0x0222c7cd, 0x00508152, 0x02becf46, 0x001e479a}}, Y: Field{[10]uint32{0x02dd37a1, 0x01ec333e, 0x02c9268a, 0x03745f93, 0x03e2ec07, 0x03fd0fb2, 0x0332990a, 0x01724fb1, 0x03fd08c5, 0x003900ce}}}, + {X: Field{[10]uint32{0x030018a1, 0x005fcc6b, 0x005ae207, 0x011d2f5f, 0x02c66dd9, 0x012dcc91, 0x00985aa8, 0x0055429e, 0x03b2d518, 0x000e9f1e}}, Y: Field{[10]uint32{0x029d7459, 0x014b517f, 0x03d1437b, 0x0094612b, 0x02b6c38d, 0x039417e2, 0x01f732a9, 0x03b71488, 0x0317e03c, 0x0008e23a}}}, + {X: Field{[10]uint32{0x013ab999, 0x0082f150, 0x00c3bef7, 0x005cad15, 0x0362b740, 0x0004e075, 0x03ca9361, 0x00725a72, 0x01b18680, 0x0009268b}}, Y: Field{[10]uint32{0x01d5e7a3, 0x0225ed74, 0x030cff71, 0x002cfb24, 0x002f708e, 0x01701d7a, 0x003cf9c8, 0x0247075e, 0x004176aa, 0x00368617}}}, + {X: Field{[10]uint32{0x034f8590, 0x029a215a, 0x0313614d, 0x01fede4a, 0x0032c085, 0x01595794, 0x01f21e0c, 0x03302661, 0x0153b4e0, 0x002c9783}}, Y: Field{[10]uint32{0x0183eda2, 0x021399d7, 0x01055d6b, 0x02010ac8, 0x0300ac5b, 0x034a360d, 0x00fac42f, 0x038eb387, 0x02ff6b02, 0x0006f45e}}}, + {X: Field{[10]uint32{0x03862fcd, 0x0167aaed, 0x02cd6013, 0x03dd45ff, 0x02bd1073, 0x0044090f, 0x029db66f, 0x00ce22a1, 0x036805e8, 0x001cd814}}, Y: Field{[10]uint32{0x015f9d56, 0x00494d9b, 0x02913d69, 0x039569d7, 0x03e767fa, 0x0384b507, 0x02434076, 0x0316983e, 0x002d0842, 0x003a71e8}}}, + {X: Field{[10]uint32{0x03f1b1d9, 0x0172585d, 0x03ff9711, 0x036979c3, 0x022e5b52, 0x03c96750, 0x038a0c9a, 0x00ba5c0b, 0x03567139, 0x003b0bc2}}, Y: Field{[10]uint32{0x008183a8, 0x025263a4, 0x00818204, 0x00ad3f7b, 0x02d49e07, 0x02395b4c, 0x00571fa9, 0x01396432, 0x02bbadb2, 0x0011fdf7}}}, + {X: Field{[10]uint32{0x03e2d378, 0x02981612, 0x038e5cbf, 0x025484dd, 0x01afc255, 0x00838630, 0x022ad2f3, 0x0350ea46, 0x03a8250d, 0x001f5ea3}}, Y: Field{[10]uint32{0x00fea3be, 0x00384458, 0x0352e02a, 0x01e904fd, 0x03fab2b0, 0x026f0835, 0x0300f110, 0x01f5dc09, 0x02168962, 0x001ad22e}}}, + {X: Field{[10]uint32{0x026713d7, 0x01a57fea, 0x0036605c, 0x02433fd3, 0x0206e594, 0x009820b1, 0x03aaa01e, 0x01c8ee99, 0x01ce52b6, 0x000c5a9c}}, Y: Field{[10]uint32{0x02a1cb9e, 0x016bdcf5, 0x020200e9, 0x03f73e0b, 0x0184152f, 0x0172d2e8, 0x0344cf6e, 0x0318484a, 0x01a07820, 0x0035bc70}}}, + {X: Field{[10]uint32{0x03bcca51, 0x01b9caa7, 0x01930ade, 0x015c476e, 0x029ace88, 0x02b65e88, 0x02e5fc6e, 0x0227ff0c, 0x00c30ade, 0x000868aa}}, Y: Field{[10]uint32{0x0082e4d0, 0x01b073e2, 0x001e47c5, 0x00e28ae5, 0x01726fd4, 0x00cbc38d, 0x012aafb4, 0x0145ed5c, 0x010438df, 0x00257f4f}}}, + {X: Field{[10]uint32{0x028f94d5, 0x027b0c9c, 0x01535536, 0x0378107e, 0x021ad2cf, 0x0144ebeb, 0x0146c68f, 0x0205c36b, 0x0067b3ad, 0x000fc606}}, Y: Field{[10]uint32{0x02317527, 0x0277c428, 0x00a915f0, 0x03c0e2c0, 0x0191abb8, 0x0088aac3, 0x01991894, 0x003aab55, 0x00e4e9f2, 0x002946a5}}}, + {X: Field{[10]uint32{0x01f63c1e, 0x0024bc22, 0x02a697d0, 0x01b4c563, 0x0079b7aa, 0x0243b3ed, 0x01ecb9b6, 0x00e6f3c4, 0x013911be, 0x003a59cc}}, Y: Field{[10]uint32{0x0103abc2, 0x02050b52, 0x035461f9, 0x03a184c1, 0x00da9be6, 0x00c808a8, 0x022017c0, 0x020f8e37, 0x00f76f87, 0x00030403}}}, + {X: Field{[10]uint32{0x0008b122, 0x0153eba4, 0x00cd8615, 0x010caf42, 0x02d3096d, 0x03ce61b1, 0x03e94b06, 0x02b1f951, 0x02b01407, 0x00187aa2}}, Y: Field{[10]uint32{0x00a4d182, 0x0172a3fd, 0x02792a10, 0x03d0a0fe, 0x02150167, 0x01a7c73b, 0x0090488e, 0x004ea5d9, 0x03cca6f7, 0x00397156}}}, + {X: Field{[10]uint32{0x02dab9fe, 0x01cfe4ef, 0x02402cab, 0x03dc928e, 0x0149673d, 0x008e68fc, 0x00815540, 0x01ff767d, 0x027a1745, 0x002b63eb}}, Y: Field{[10]uint32{0x00f03e6b, 0x01fbfbd4, 0x035d4d77, 0x0080bb4d, 0x01485172, 0x00958fde, 0x001d0371, 0x0312eeec, 0x03ef7966, 0x0014edf7}}}, + {X: Field{[10]uint32{0x02a829d3, 0x02062f6d, 0x0020c586, 0x01324640, 0x02cdf997, 0x0136750d, 0x0362f274, 0x00b9534f, 0x02dfbf7f, 0x00218173}}, Y: Field{[10]uint32{0x01946b88, 0x01bd52df, 0x01873d78, 0x03c143a1, 0x02e7a33d, 0x01dc23fd, 0x009fe4da, 0x02a86988, 0x015f0ca2, 0x0016be29}}}, + {X: Field{[10]uint32{0x03921d87, 0x034b5b3f, 0x014c8cbc, 0x00f0bc8b, 0x016e8325, 0x029e533e, 0x00ffa5a7, 0x027bd1f7, 0x004b465b, 0x002f7795}}, Y: Field{[10]uint32{0x00aadcd8, 0x02f5b3a3, 0x01a7414e, 0x0237e228, 0x030ec97c, 0x0206f9aa, 0x01e7d230, 0x019fd57b, 0x03677ba8, 0x001b14d8}}}, + {X: Field{[10]uint32{0x02fe1cdb, 0x039cd18c, 0x016bbfe3, 0x034aeb64, 0x0162a47b, 0x0170a3d2, 0x02eafca8, 0x0223724f, 0x0245e8b0, 0x000c620a}}, Y: Field{[10]uint32{0x01f176bc, 0x0075a4d5, 0x021a6fd1, 0x02a780aa, 0x01d03557, 0x00b80a32, 0x02b833c1, 0x01b8784a, 0x00f0c5f8, 0x0002cd62}}}, + {X: Field{[10]uint32{0x01dc1202, 0x0013dda9, 0x00883b0d, 0x02f589e6, 0x03e49fad, 0x000ee398, 0x0110b726, 0x003e7b6d, 0x00524580, 0x0005ef90}}, Y: Field{[10]uint32{0x0132fc54, 0x00ce92e3, 0x01cb9c9e, 0x01568bd6, 0x0181667e, 0x010349df, 0x00f7738e, 0x0156b80a, 0x03dcdf88, 0x0005413a}}}, + {X: Field{[10]uint32{0x03629537, 0x01abeb72, 0x0308c9c5, 0x03d69806, 0x00a303ea, 0x001fcaca, 0x03c4e697, 0x01f4a9af, 0x0133bb69, 0x00318cef}}, Y: Field{[10]uint32{0x0218cef8, 0x03566dee, 0x01eac2b4, 0x01e0cc4e, 0x039f3b7f, 0x0187193c, 0x0006b924, 0x01936fcb, 0x00132d47, 0x0021b8fd}}}, + {X: Field{[10]uint32{0x0260bb52, 0x01863d60, 0x00062570, 0x02d8ed18, 0x03633434, 0x00cf3444, 0x00881f3a, 0x0043dc64, 0x008af4c7, 0x003ce788}}, Y: Field{[10]uint32{0x01e2e62c, 0x014be4ae, 0x014e2bfe, 0x038ee973, 0x03d0171e, 0x03650f0c, 0x02e2b664, 0x00dbd89c, 0x0005807b, 0x0024315a}}}, + {X: Field{[10]uint32{0x00a16c54, 0x01808cbd, 0x033db893, 0x0053d67d, 0x01ee4e54, 0x00b6e2b1, 0x00ddfb37, 0x02581e95, 0x039414f2, 0x0033a610}}, Y: Field{[10]uint32{0x0224e0d7, 0x033eebae, 0x03d7f627, 0x00b6e97a, 0x02bb8054, 0x03502ba5, 0x02f78354, 0x01ec4f1c, 0x01a1d105, 0x00069201}}}, + {X: Field{[10]uint32{0x030a76bb, 0x01fd8cee, 0x0273f625, 0x008a8569, 0x01945041, 0x022175d5, 0x0171af10, 0x01e93ee9, 0x039f8110, 0x001499b9}}, Y: Field{[10]uint32{0x0159b457, 0x003f25a9, 0x01918d3b, 0x0003edce, 0x0018d382, 0x01ed5708, 0x033ca397, 0x017c4a1d, 0x01d09cc8, 0x00179eb4}}}, + {X: Field{[10]uint32{0x027056e4, 0x030563ef, 0x035c11ff, 0x0025449b, 0x03675070, 0x01de2f22, 0x0370113c, 0x01ea8efc, 0x025763f4, 0x0013ee77}}, Y: Field{[10]uint32{0x0086f7ef, 0x021d54c5, 0x0175e52e, 0x01d61e27, 0x0229fe02, 0x00bf8f6c, 0x022fa347, 0x01c65c2a, 0x02368eec, 0x000b365d}}}, + {X: Field{[10]uint32{0x03cc0226, 0x015d01c8, 0x0345bded, 0x02a348cd, 0x024ae7bb, 0x005632e4, 0x03ec8406, 0x0376f6aa, 0x0024a99e, 0x002b45a0}}, Y: Field{[10]uint32{0x014095de, 0x03dc103c, 0x003cba21, 0x01ae47b8, 0x029ee638, 0x014f12f9, 0x01e230bb, 0x0119ce3b, 0x0015968e, 0x002ac414}}}, + {X: Field{[10]uint32{0x03719cb8, 0x0320005c, 0x028d55a7, 0x02e8522e, 0x01277923, 0x03c6cc1f, 0x03aea9b0, 0x01556dcc, 0x01aef7cc, 0x0001560a}}, Y: Field{[10]uint32{0x03267689, 0x03c269d8, 0x03d3d3c4, 0x03db12eb, 0x00382969, 0x031829ef, 0x003b47d6, 0x02561550, 0x02eb9c9b, 0x001a9ecb}}}, + {X: Field{[10]uint32{0x0378b935, 0x03af0e1a, 0x01910960, 0x010d1435, 0x014e1e4c, 0x013a7780, 0x004bbe78, 0x01383888, 0x02338efa, 0x0008467c}}, Y: Field{[10]uint32{0x00e7bb93, 0x00da44ee, 0x0195711c, 0x01a4d29c, 0x0052acb4, 0x027144ea, 0x0337db96, 0x011319e8, 0x01c37785, 0x0027c867}}}, + {X: Field{[10]uint32{0x01295bbf, 0x003f96ec, 0x01b3257f, 0x0260fd70, 0x02c52274, 0x0095634d, 0x01e53caa, 0x006fa75f, 0x021b0949, 0x00047f0f}}, Y: Field{[10]uint32{0x004cf6f5, 0x02314a21, 0x00ed6219, 0x02234427, 0x0191b8d1, 0x00c4416b, 0x026b6c02, 0x0164cdaa, 0x034decb0, 0x00071a71}}}, + {X: Field{[10]uint32{0x03d2a908, 0x02fa8ef7, 0x0182180a, 0x00626421, 0x015e64ac, 0x01f981ab, 0x0091bc86, 0x01450e54, 0x026fea6e, 0x000d2db3}}, Y: Field{[10]uint32{0x03ccad6d, 0x00e5908a, 0x00694403, 0x00953860, 0x0328e9f3, 0x00b1e8c4, 0x01e41a13, 0x02fbcfee, 0x0104f4bd, 0x0016dbb6}}}, + {X: Field{[10]uint32{0x0210a84c, 0x0103254d, 0x02e2e22a, 0x00f4b6da, 0x00b326fb, 0x01fbdd17, 0x01c567d9, 0x01a2acec, 0x01cab457, 0x001b0897}}, Y: Field{[10]uint32{0x002a1084, 0x03f5da10, 0x0229cd72, 0x010b403a, 0x03912fe0, 0x03610ef6, 0x0363cfa2, 0x03f633af, 0x03522180, 0x001fa175}}}, + {X: Field{[10]uint32{0x028ed7d7, 0x001c5116, 0x003e32a7, 0x008039c1, 0x03cbfd20, 0x0052da22, 0x03cc7570, 0x025708cb, 0x02e541dd, 0x00017ddd}}, Y: Field{[10]uint32{0x03273c0e, 0x002cda62, 0x022ff2a2, 0x00fdb435, 0x01c11680, 0x0299354a, 0x009de0b9, 0x020d50e8, 0x0078fc6d, 0x000ee317}}}, + {X: Field{[10]uint32{0x011b0e23, 0x02f64ca2, 0x014e9b8b, 0x01205bf6, 0x01d5371e, 0x00913ea9, 0x037eaa63, 0x010fbd78, 0x00c55315, 0x000f89b6}}, Y: Field{[10]uint32{0x0379bb65, 0x03eaaf82, 0x034b0c70, 0x003db62b, 0x02a5b4c7, 0x01b0fafe, 0x01a53bc0, 0x0280dbb8, 0x011b43a4, 0x000c2827}}}, + {X: Field{[10]uint32{0x018b36af, 0x0036affc, 0x0085e8aa, 0x03efb84b, 0x0106be8a, 0x01954f91, 0x02970ac2, 0x00d5a2aa, 0x0291c17a, 0x00318d36}}, Y: Field{[10]uint32{0x01a925f0, 0x0088067c, 0x0346d6d5, 0x0267181b, 0x0016eb9f, 0x02361fb5, 0x01d34bd9, 0x0029ef41, 0x01bae139, 0x001925a0}}}, + {X: Field{[10]uint32{0x027e9a7e, 0x0258b7cb, 0x0347e806, 0x02ceb235, 0x024e8361, 0x03090b5f, 0x02ab4eef, 0x00d6631b, 0x01d64d64, 0x0003b4cd}}, Y: Field{[10]uint32{0x00aa93e7, 0x01ad803f, 0x015e1eb5, 0x039fd5e3, 0x025a1552, 0x023ca2fb, 0x034b6909, 0x01ea9c8c, 0x03f819c9, 0x003c39f0}}}, + {X: Field{[10]uint32{0x02521581, 0x03656147, 0x0328ed72, 0x0191d54f, 0x02d10be1, 0x021c3fec, 0x023dbf22, 0x0167b0fd, 0x00094113, 0x0034dfe3}}, Y: Field{[10]uint32{0x011f1922, 0x0391ed27, 0x0351a191, 0x03532f8e, 0x02831467, 0x01b4f26f, 0x01f1be75, 0x0380d9cb, 0x03b9ba3a, 0x00369f2f}}}, + {X: Field{[10]uint32{0x0115c360, 0x00cd4b9d, 0x0391943c, 0x0017ba1b, 0x0005b32d, 0x031ad083, 0x02ae0611, 0x017a970e, 0x01d7c747, 0x003b8c48}}, Y: Field{[10]uint32{0x004c1686, 0x03c916ef, 0x00281b76, 0x012ae9a4, 0x01b80916, 0x02b5ec4b, 0x0047411d, 0x028eca6d, 0x023797be, 0x001c0ecb}}}, + {X: Field{[10]uint32{0x0187a12b, 0x02005f46, 0x032b5fe9, 0x024109d5, 0x023f5c72, 0x024a984c, 0x02f1a594, 0x00453a83, 0x01bc5c2b, 0x001ed0b2}}, Y: Field{[10]uint32{0x020d27da, 0x03736549, 0x019c9dc7, 0x0378c377, 0x01dd57ed, 0x024909c9, 0x03cd92a9, 0x01cf5d5b, 0x0382e85b, 0x00173dd8}}}, + {X: Field{[10]uint32{0x00a555cd, 0x01d248be, 0x033c3ad0, 0x02117da4, 0x007c8f9b, 0x003e4975, 0x039b6b9a, 0x014e8a4f, 0x039ab13a, 0x0026bd7f}}, Y: Field{[10]uint32{0x025d4153, 0x01bc7eaf, 0x0042ca33, 0x0065905c, 0x0113a9ec, 0x02423215, 0x02a13fa5, 0x011cd322, 0x009e8995, 0x0032a4fb}}}, + {X: Field{[10]uint32{0x0048dacc, 0x02061dce, 0x017b659c, 0x014215af, 0x00a5b2b8, 0x01c260f7, 0x021d591f, 0x037c6c1b, 0x027401a2, 0x0017afe8}}, Y: Field{[10]uint32{0x00f7ad18, 0x01a7f1e8, 0x020fb5fb, 0x0047d1cb, 0x0046e124, 0x008a647a, 0x004c15e8, 0x00f190a4, 0x00b96ac2, 0x0002c2b7}}}, + {X: Field{[10]uint32{0x00c81e6f, 0x00979b3f, 0x01dd3ac1, 0x0219f699, 0x000daeb4, 0x007dbafb, 0x018382bc, 0x017ab214, 0x0108465e, 0x0024ed63}}, Y: Field{[10]uint32{0x0224a4e7, 0x02cfbd46, 0x01b8cf4f, 0x03618ec7, 0x038a50b8, 0x02f2a722, 0x00646c36, 0x005e135d, 0x0118c315, 0x00152fa2}}}, + {X: Field{[10]uint32{0x036fc858, 0x00c7c772, 0x0211132c, 0x02643b6a, 0x005bc868, 0x00ad0199, 0x00943ee3, 0x0191d3ff, 0x039b4fb4, 0x0028a295}}, Y: Field{[10]uint32{0x02f14670, 0x026c54e6, 0x0239646c, 0x0053ebbd, 0x036e059b, 0x03d942ad, 0x016605f0, 0x01592006, 0x01a3d562, 0x00103ba4}}}, + {X: Field{[10]uint32{0x0206ac9a, 0x0397cab5, 0x01078e8d, 0x011fe432, 0x01add7cb, 0x0143482b, 0x01f60297, 0x015582dc, 0x0109781d, 0x0003a61e}}, Y: Field{[10]uint32{0x029819d2, 0x01d3c63b, 0x00907102, 0x037ab233, 0x01c55318, 0x031786a0, 0x02a346f5, 0x036b3fff, 0x02c34c80, 0x0001c486}}}, + {X: Field{[10]uint32{0x01e1dcef, 0x02cefd18, 0x00a7d1d2, 0x02a5d7a1, 0x025c84bc, 0x00e5515b, 0x00ee62ae, 0x02035ff0, 0x011d1587, 0x000a47fc}}, Y: Field{[10]uint32{0x03ec2616, 0x000d9a94, 0x02ceec23, 0x00de4cd6, 0x0171e79e, 0x00892a51, 0x00298ce8, 0x02152d9c, 0x03e8abb6, 0x00317232}}}, + {X: Field{[10]uint32{0x01e315b4, 0x02600fbf, 0x03d824bd, 0x005ae37f, 0x01efda7d, 0x01cea84c, 0x03d9e573, 0x02d4f90a, 0x03909e28, 0x0012b6c4}}, Y: Field{[10]uint32{0x00b1456a, 0x03b37d75, 0x023eefa2, 0x00093f79, 0x0124eb70, 0x0303266c, 0x00a796e5, 0x02b9f25c, 0x0312b827, 0x0019b5fa}}}, + {X: Field{[10]uint32{0x027591ff, 0x029c0936, 0x033846b3, 0x0237902f, 0x0201707a, 0x00951807, 0x007e47b2, 0x003bf78f, 0x034b9524, 0x00157897}}, Y: Field{[10]uint32{0x00c830c2, 0x038ad6de, 0x022664b1, 0x038c8ba0, 0x03e4491a, 0x00b72e82, 0x03000b37, 0x0181b5d0, 0x017b7e98, 0x003a7c89}}}, + {X: Field{[10]uint32{0x02747eca, 0x00016c7e, 0x03ad8aa3, 0x00063084, 0x01388ddd, 0x0118e0d3, 0x03a6d8d5, 0x03f0caf9, 0x0093e41d, 0x0034939d}}, Y: Field{[10]uint32{0x00c26cac, 0x02de18d2, 0x01e93fc4, 0x028260ae, 0x026d7feb, 0x0053527c, 0x01f5bee4, 0x012c597a, 0x0216a51b, 0x0039cea0}}}, + {X: Field{[10]uint32{0x01fd8b2a, 0x03ba84d8, 0x027d9ed8, 0x01880648, 0x03caa035, 0x03b586bd, 0x03e46003, 0x0176872d, 0x02526d01, 0x0029442c}}, Y: Field{[10]uint32{0x02bea726, 0x0174bce2, 0x01adc356, 0x03ca8004, 0x01eaa2b2, 0x0031b11e, 0x02b15a28, 0x02aee98f, 0x02a09015, 0x000f6630}}}, + {X: Field{[10]uint32{0x03b314d1, 0x030ad221, 0x01f4f6b8, 0x039bf9a0, 0x008404cd, 0x029575db, 0x03ac63cc, 0x00035456, 0x00d81275, 0x00301341}}, Y: Field{[10]uint32{0x034d9d59, 0x01019eb6, 0x02e1b98c, 0x01637dff, 0x00e3cd44, 0x006f0205, 0x00db9373, 0x003aea67, 0x01779fb8, 0x0032cff3}}}, + {X: Field{[10]uint32{0x02bd0649, 0x01c3e43b, 0x0245a0df, 0x03fe9e24, 0x006b5dd2, 0x023fe9dc, 0x0051e691, 0x00cd5eea, 0x0061146c, 0x003b271f}}, Y: Field{[10]uint32{0x01186170, 0x03438f4f, 0x027a4daf, 0x0026c498, 0x03b36b07, 0x02458648, 0x028803ce, 0x01a48f01, 0x03fa10ca, 0x00268274}}}, + {X: Field{[10]uint32{0x020488cc, 0x033b5602, 0x030640ba, 0x0044b294, 0x03b25985, 0x02017952, 0x037e8403, 0x013117d2, 0x013f5d50, 0x002577d7}}, Y: Field{[10]uint32{0x00e8ecc6, 0x01ab5213, 0x00c21c7a, 0x036dd0f7, 0x0235079c, 0x00facc16, 0x03d1ef32, 0x014c16c1, 0x018589b8, 0x00290f73}}}, + {X: Field{[10]uint32{0x033a6d16, 0x00b511d8, 0x016510c7, 0x0135aec6, 0x012fc8ec, 0x0177fe52, 0x02bf50eb, 0x00314b11, 0x020c3a95, 0x002e3bb3}}, Y: Field{[10]uint32{0x01583744, 0x02c23875, 0x0384b8d0, 0x00b338fe, 0x024a4957, 0x025a68b0, 0x02c1460d, 0x02fe0ee9, 0x02a31b75, 0x001d3a50}}}, + {X: Field{[10]uint32{0x02dd09a2, 0x002fc71c, 0x000ba052, 0x01df178b, 0x00c82b2d, 0x014487a8, 0x01eac517, 0x0270894f, 0x0216d1f6, 0x001667b3}}, Y: Field{[10]uint32{0x0111bb14, 0x00f48c6a, 0x038599f7, 0x01c99908, 0x00b2fdb6, 0x035eebd2, 0x00e2e725, 0x00f43b76, 0x00c325af, 0x00012284}}}, + {X: Field{[10]uint32{0x0282ab32, 0x017f37c3, 0x023bc35a, 0x006eee93, 0x007fff71, 0x0186b360, 0x02fdfaa9, 0x0162a5b8, 0x02068d94, 0x002e2e96}}, Y: Field{[10]uint32{0x00f8ca4d, 0x0133b314, 0x007e32d4, 0x005db8ab, 0x03c2d824, 0x0134ca94, 0x00388454, 0x0160b824, 0x03227554, 0x00200d6a}}}, + {X: Field{[10]uint32{0x027e65f4, 0x017b45c8, 0x00c508c3, 0x020285c4, 0x03ae8063, 0x006c7ffc, 0x02d3d7af, 0x01e19795, 0x03e1cccd, 0x002da11a}}, Y: Field{[10]uint32{0x00bc7201, 0x039bed83, 0x0224177f, 0x03527039, 0x03361ee9, 0x0208c1d8, 0x0189f526, 0x017c2b7a, 0x00253294, 0x002ef6dc}}}, + {X: Field{[10]uint32{0x01a9d0fe, 0x0203fe03, 0x032ffc35, 0x02ce8464, 0x0120dd31, 0x0211b668, 0x0009e53f, 0x00aefbb4, 0x025e6987, 0x00287fe9}}, Y: Field{[10]uint32{0x02da215b, 0x00116c73, 0x02adadc0, 0x032c9a11, 0x0331c210, 0x022dae9b, 0x00549996, 0x00efe774, 0x0180d576, 0x002a8cb9}}}, + {X: Field{[10]uint32{0x030d0fa2, 0x03e6885c, 0x02ebeb62, 0x035b7997, 0x022ad73c, 0x0033bc22, 0x008c7078, 0x0071f7d1, 0x036d6709, 0x0026ce05}}, Y: Field{[10]uint32{0x02609207, 0x01813b53, 0x019d26fb, 0x02206412, 0x0264a459, 0x023fd665, 0x02c86bab, 0x026dfbc7, 0x0319c0fb, 0x0008b49a}}}, + {X: Field{[10]uint32{0x01fd0cd2, 0x014a104d, 0x008981fa, 0x0135f7ab, 0x020accfa, 0x036ad0fe, 0x0132553b, 0x03193eec, 0x009e209d, 0x002f0b33}}, Y: Field{[10]uint32{0x015ccfa6, 0x0160c169, 0x0134374d, 0x004dc624, 0x01350d1d, 0x021e47ef, 0x034931ba, 0x03e22c19, 0x02dc176f, 0x0011cd9a}}}, + {X: Field{[10]uint32{0x00730f6a, 0x01f735c9, 0x03aa607a, 0x00d39fe4, 0x00d45187, 0x03ef4a8c, 0x0036f514, 0x00a98974, 0x00a16545, 0x00073800}}, Y: Field{[10]uint32{0x01c6811d, 0x0018abcd, 0x02c19ee3, 0x0336dac3, 0x03fa288a, 0x038f56fc, 0x0334baf3, 0x03c3b552, 0x03fb5b90, 0x00382440}}}, + {X: Field{[10]uint32{0x01e0031f, 0x033742b7, 0x0109d63d, 0x01a13682, 0x034cc63d, 0x02718911, 0x03b26a44, 0x019303a3, 0x029a887d, 0x00211b15}}, Y: Field{[10]uint32{0x0212c07e, 0x010231be, 0x03be47df, 0x0111de61, 0x0207dcbe, 0x013fc105, 0x03acf93d, 0x027e635f, 0x0353132c, 0x0000151d}}}, + {X: Field{[10]uint32{0x00fe59e9, 0x0207a95d, 0x00b82f5c, 0x007d5321, 0x03701f7b, 0x01a1ac62, 0x00585185, 0x01b88f27, 0x00f72865, 0x0018d96a}}, Y: Field{[10]uint32{0x0316c2eb, 0x0273e9fa, 0x0023fc8d, 0x02d5fff3, 0x01be27f2, 0x027302cf, 0x0151d46c, 0x0394f2b4, 0x01fda992, 0x00231f37}}}, + {X: Field{[10]uint32{0x012939fc, 0x019fe01f, 0x0237fbd2, 0x03d66314, 0x0371dc5b, 0x017a3f45, 0x01726195, 0x00f6365e, 0x033c89ae, 0x003b5097}}, Y: Field{[10]uint32{0x01a3590b, 0x03f580a6, 0x01d74daf, 0x0341b8f0, 0x02010c98, 0x0273c53d, 0x03285fd1, 0x0280ef35, 0x03dc14f7, 0x001089aa}}}, + {X: Field{[10]uint32{0x031f00c7, 0x01b728e5, 0x03d5662a, 0x01e8ba40, 0x0285a0bd, 0x02b8c42f, 0x0267f235, 0x01fafa35, 0x006c2e1b, 0x00336949}}, Y: Field{[10]uint32{0x01247f56, 0x020922ca, 0x013f6eae, 0x03cc879b, 0x0296b2c2, 0x006293fa, 0x00534ba3, 0x026cd246, 0x0296f8ea, 0x001e47bc}}}, + {X: Field{[10]uint32{0x00eaf99e, 0x01a968fd, 0x03bc6f90, 0x0260e1be, 0x02f5017d, 0x025a8470, 0x01d3f7e5, 0x030786fb, 0x00e6ce79, 0x002d0aa1}}, Y: Field{[10]uint32{0x0007e6ac, 0x03e903b5, 0x02610823, 0x0005c2c0, 0x03cc3d06, 0x01d427f2, 0x03fad5e4, 0x00dc60db, 0x00c960bb, 0x000b9c8b}}}, + {X: Field{[10]uint32{0x030bcf90, 0x01a807ea, 0x024c16d4, 0x0342ea14, 0x01be23ca, 0x021c021d, 0x03149df5, 0x03a6f2d0, 0x008ce1e2, 0x000d62f8}}, Y: Field{[10]uint32{0x039d1308, 0x00171107, 0x01b0034f, 0x0298d922, 0x03462318, 0x01bd4446, 0x00fe0bfb, 0x02b333d9, 0x02f070ba, 0x003cf13f}}}, + {X: Field{[10]uint32{0x0016a789, 0x02784d58, 0x03ac985c, 0x03de6d0c, 0x01427d16, 0x0115c410, 0x0374bfe1, 0x0188c293, 0x035de5b3, 0x000fb590}}, Y: Field{[10]uint32{0x0041f26f, 0x0249d898, 0x02d9104b, 0x01b56a95, 0x03ee0dc5, 0x014b4f7f, 0x03e677e3, 0x010f4ad6, 0x005e1427, 0x00071cba}}}, + {X: Field{[10]uint32{0x0016c910, 0x00f67989, 0x00610c25, 0x0142e494, 0x000afb7e, 0x01c85dbd, 0x000d7e26, 0x03685965, 0x022c580d, 0x000927df}}, Y: Field{[10]uint32{0x02a9f50c, 0x01c51ece, 0x02e486dc, 0x0021e7a5, 0x021630f5, 0x037378db, 0x030f8423, 0x0245ba3d, 0x031149e9, 0x001bf058}}}, + {X: Field{[10]uint32{0x009cc85f, 0x00379bb2, 0x00d4c69f, 0x01bdbd06, 0x0114d2d7, 0x014b2fe4, 0x00f6f0b7, 0x006e8c6c, 0x0144e838, 0x0025ecec}}, Y: Field{[10]uint32{0x0188724f, 0x00111372, 0x01dc2182, 0x01827904, 0x02f72822, 0x03c77a16, 0x00492570, 0x0082d685, 0x013033b7, 0x0019f26f}}}, + {X: Field{[10]uint32{0x03395a85, 0x03bbc697, 0x01b68cfa, 0x0038e57a, 0x0380610d, 0x00491421, 0x010fcaf4, 0x00a44947, 0x019e868b, 0x000ece11}}, Y: Field{[10]uint32{0x0225ce6f, 0x02392754, 0x023a3c3e, 0x00966c5f, 0x0391ec4c, 0x01dc917a, 0x00cc9a2b, 0x01d1531e, 0x00ddbfde, 0x002f9460}}}, + {X: Field{[10]uint32{0x02163ebf, 0x03f88725, 0x017efc54, 0x03452680, 0x0074fb35, 0x0209c3f4, 0x00974f44, 0x03822a45, 0x03909f33, 0x00139bc5}}, Y: Field{[10]uint32{0x02b9fd15, 0x03341e39, 0x026a3e56, 0x02035dd3, 0x000dcd28, 0x02a69793, 0x02d34913, 0x01c5596d, 0x038f06f4, 0x0003ed95}}}, + {X: Field{[10]uint32{0x015c75de, 0x02ccb68c, 0x01a9218d, 0x02ddd586, 0x0272e301, 0x00289597, 0x025a0a67, 0x024df5d0, 0x0063e408, 0x0024506b}}, Y: Field{[10]uint32{0x006d6045, 0x024713d5, 0x007a05de, 0x037ef5e1, 0x03f10b34, 0x00aa95f6, 0x0055e721, 0x030f84f3, 0x010a56be, 0x0034d78a}}}, + {X: Field{[10]uint32{0x015ba578, 0x00b1844e, 0x01aa2e21, 0x018a23b7, 0x00337c91, 0x013f2480, 0x01c006a0, 0x009d4559, 0x03ca7205, 0x003b26dc}}, Y: Field{[10]uint32{0x00224887, 0x014043cf, 0x039051b1, 0x01d53139, 0x01ba1922, 0x031d38bc, 0x015f3ab4, 0x00b9dce3, 0x02f5c1a2, 0x000df847}}}, + {X: Field{[10]uint32{0x021caca3, 0x016e06b3, 0x00d7ef0f, 0x0022f94c, 0x01aef502, 0x03aab1b9, 0x00430b1f, 0x024a3f38, 0x00e1bb1a, 0x0015bf05}}, Y: Field{[10]uint32{0x00209001, 0x01fcc1e4, 0x01865f6d, 0x01f30e36, 0x03b05e59, 0x0203d14a, 0x03101d7a, 0x00341e7c, 0x0084f868, 0x00139698}}}, + {X: Field{[10]uint32{0x017df731, 0x00ea2699, 0x021e4d80, 0x030fc603, 0x00cf3997, 0x003c6c8b, 0x037c3627, 0x0353320a, 0x001b2ceb, 0x002bb35d}}, Y: Field{[10]uint32{0x010b8e21, 0x0315f9fe, 0x03d4d8cc, 0x005c2bff, 0x02256bd3, 0x037426ce, 0x036356e8, 0x03d27c64, 0x03336c0d, 0x0017c412}}}, + {X: Field{[10]uint32{0x01836cb8, 0x03e2f505, 0x03f0d418, 0x01c8c70f, 0x039b5c10, 0x00c27a7a, 0x0222b9a4, 0x00f54892, 0x03af54f8, 0x00145899}}, Y: Field{[10]uint32{0x03efe4fc, 0x0248261e, 0x0313d865, 0x017628f6, 0x01cc37e8, 0x02dae10e, 0x02f6fd54, 0x00b05fd3, 0x009b9e06, 0x001061ce}}}, + {X: Field{[10]uint32{0x0066fed5, 0x023d50c9, 0x007e7f25, 0x0371b84a, 0x036e7658, 0x00e0ed3f, 0x01a03687, 0x0111cfe4, 0x02bd8d3f, 0x001a2efa}}, Y: Field{[10]uint32{0x017049c4, 0x018d6b42, 0x03c27048, 0x01e9a8e0, 0x008656fc, 0x025e356c, 0x027f7ccd, 0x026d09e9, 0x000f0ac9, 0x0033d8f2}}}, + {X: Field{[10]uint32{0x007b67be, 0x036fad6c, 0x018a2b90, 0x023e4259, 0x0049ba90, 0x02d4b079, 0x01592138, 0x01fa6d47, 0x02ab6946, 0x00083388}}, Y: Field{[10]uint32{0x0297ce2d, 0x008374b7, 0x00c3e68f, 0x03c52a77, 0x0331649f, 0x026e8b05, 0x032d17e4, 0x01cfda48, 0x007d9f41, 0x00158b68}}}, + {X: Field{[10]uint32{0x02798f78, 0x00582b1b, 0x00b07d04, 0x0241ffe0, 0x029c86cd, 0x014855e1, 0x03c1ec6a, 0x027e48eb, 0x02d3a4a5, 0x002d6df5}}, Y: Field{[10]uint32{0x029d4de5, 0x03cf9e7f, 0x02dbcb8e, 0x02e96efd, 0x0045b5ea, 0x034565ed, 0x03c55af4, 0x0097b836, 0x02c97751, 0x0034178c}}}, + {X: Field{[10]uint32{0x03f45df4, 0x0130c28c, 0x03d4acdc, 0x024dac1d, 0x023967e5, 0x01d7db6e, 0x023d848f, 0x0202c577, 0x00897a42, 0x002556f5}}, Y: Field{[10]uint32{0x01453a02, 0x03e5cd0f, 0x016b2749, 0x006d12c5, 0x01644826, 0x03c97700, 0x03b9fe5b, 0x026473bc, 0x03cb5d79, 0x0012efad}}}, + {X: Field{[10]uint32{0x020a5a98, 0x0391fe19, 0x02211201, 0x0126721d, 0x0150fee8, 0x02fd4dcd, 0x0002fe18, 0x00dc3acf, 0x015198e7, 0x0027d83a}}, Y: Field{[10]uint32{0x00d613cc, 0x00b13e93, 0x00a6a3a6, 0x03a98b8a, 0x03c865a7, 0x00c87626, 0x02570f59, 0x01619a80, 0x02a933ed, 0x0018e56a}}}, + {X: Field{[10]uint32{0x00d776ee, 0x03cb5394, 0x01468999, 0x01642895, 0x009c2b64, 0x02269c40, 0x00041c75, 0x00f436f9, 0x00b6f592, 0x001c207c}}, Y: Field{[10]uint32{0x028f9fc9, 0x02a7fdd9, 0x00758403, 0x028ca231, 0x0227f3f0, 0x02fca2d2, 0x02ec9c91, 0x00067a4e, 0x0005e067, 0x00272d80}}}, + {X: Field{[10]uint32{0x0369561f, 0x02adcecc, 0x023fffb0, 0x00161f99, 0x02b607d6, 0x0358fbe6, 0x00e982ab, 0x0169f06c, 0x01800d8d, 0x00038a40}}, Y: Field{[10]uint32{0x00d924f7, 0x022345f5, 0x01f7861b, 0x006850a6, 0x01993f74, 0x002d5394, 0x00ccc7b8, 0x02692894, 0x02fe7728, 0x001189dd}}}, + {X: Field{[10]uint32{0x00598bfb, 0x031590d6, 0x035212f4, 0x037f10b2, 0x00ac254c, 0x017231ad, 0x03d5939c, 0x02f57ad8, 0x0328b285, 0x0022ba9c}}, Y: Field{[10]uint32{0x01568ec2, 0x0064be02, 0x01e228e0, 0x03ba6436, 0x0213819a, 0x03281602, 0x00a559a8, 0x0157ffad, 0x027704fc, 0x002da0b6}}}, + {X: Field{[10]uint32{0x03256e68, 0x005e418b, 0x010feb3a, 0x01e877fa, 0x0127302d, 0x01619702, 0x00fc2874, 0x012d5fa9, 0x00b254b2, 0x003a7442}}, Y: Field{[10]uint32{0x03a128d0, 0x01ee4e6a, 0x032c48f6, 0x026a9169, 0x018d0ba6, 0x02bc50d9, 0x030fc0b1, 0x0367ef9e, 0x02746d29, 0x0003ffdc}}}, + {X: Field{[10]uint32{0x01ba0fee, 0x021ae1ab, 0x009136d8, 0x00505f4a, 0x00b81f29, 0x00a79332, 0x02d49094, 0x01f985e1, 0x013d1f31, 0x0027a87e}}, Y: Field{[10]uint32{0x0180ec0a, 0x031af91a, 0x036e45d9, 0x0002e564, 0x01975a5c, 0x03f7b845, 0x023ba6aa, 0x02cd45b9, 0x0325d3b0, 0x0008c77f}}}, + {X: Field{[10]uint32{0x001e7a0d, 0x006da352, 0x000c5718, 0x00042166, 0x0080701d, 0x00fa354c, 0x00d687c4, 0x02efb81f, 0x0015e5fa, 0x003a2849}}, Y: Field{[10]uint32{0x022f62c6, 0x02886e64, 0x005dd5d6, 0x03c8b80e, 0x030ac53b, 0x021d15c9, 0x0062f185, 0x039d1a65, 0x039ce263, 0x00375a60}}}, + {X: Field{[10]uint32{0x02c3def2, 0x011bfcc1, 0x02cefb44, 0x01009d8d, 0x02ed7968, 0x03db5706, 0x002e04c7, 0x01851687, 0x03baae48, 0x0038a1fc}}, Y: Field{[10]uint32{0x01968c63, 0x02e7efe7, 0x016e0be5, 0x0239f9af, 0x005bcfbe, 0x03c85560, 0x0053baef, 0x02c3a93b, 0x013d401d, 0x0024e550}}}, + {X: Field{[10]uint32{0x02ad1194, 0x02583755, 0x03927641, 0x00c9aadd, 0x01fb23e2, 0x0053239f, 0x01756eba, 0x016ac39e, 0x039cec20, 0x0023e67d}}, Y: Field{[10]uint32{0x0019a2ea, 0x03ffe67a, 0x02de8c5d, 0x013f27c2, 0x0089cbff, 0x0226c92f, 0x021b0da3, 0x01b5b8bd, 0x03e615cc, 0x00201654}}}, + {X: Field{[10]uint32{0x0366f586, 0x00f0d0f1, 0x03e14c6b, 0x0351ebcc, 0x013adb63, 0x01687fdb, 0x00dfb59e, 0x008eb783, 0x036a8cb7, 0x002721ea}}, Y: Field{[10]uint32{0x0165bb19, 0x031ba2aa, 0x002004ed, 0x038dd61d, 0x036a3699, 0x032073fd, 0x01012cbb, 0x035e79f5, 0x01227a3b, 0x001d1e60}}}, + {X: Field{[10]uint32{0x019dc00a, 0x03b1d776, 0x03c3ec75, 0x0141f622, 0x006042bd, 0x02d44bfd, 0x02a10b7f, 0x0177902e, 0x02086f24, 0x00314b21}}, Y: Field{[10]uint32{0x02b3f844, 0x016b80d2, 0x01cc2ca0, 0x01b017ed, 0x0385e540, 0x01f50bf9, 0x00762d83, 0x02e2f672, 0x013abae8, 0x003a30a0}}}, + {X: Field{[10]uint32{0x028dafb2, 0x0138582e, 0x030ded8d, 0x03f419aa, 0x000dd7c3, 0x02f58d2b, 0x039c6b6e, 0x02f89669, 0x02e194d5, 0x0002d8a1}}, Y: Field{[10]uint32{0x019b5910, 0x00e156a2, 0x034aa18b, 0x0090a80c, 0x0027eaaf, 0x01e64549, 0x03cdf7b4, 0x03c9c1dd, 0x02a8ee0b, 0x001cbb0b}}}, + {X: Field{[10]uint32{0x03086b6d, 0x035b4d0b, 0x024ce8c5, 0x02817cee, 0x0245c648, 0x01c32a26, 0x013792e3, 0x00be2dc8, 0x02f2045f, 0x0037ded5}}, Y: Field{[10]uint32{0x0196ab4a, 0x008eb985, 0x02cb43df, 0x0335765f, 0x0139ac18, 0x000e6e5b, 0x009fc90d, 0x02f73d08, 0x01483850, 0x000e1b3b}}}, + {X: Field{[10]uint32{0x0146a3b0, 0x03341a1b, 0x0020f48e, 0x00dd9d79, 0x01459b2b, 0x0192aad6, 0x01110eda, 0x008d5cfa, 0x009f4cd4, 0x000ab3d3}}, Y: Field{[10]uint32{0x022cc579, 0x00a15f56, 0x000cff62, 0x02be5513, 0x0258b37b, 0x009487fe, 0x01ff9bbd, 0x03a60737, 0x0029aea5, 0x0017c696}}}, + {X: Field{[10]uint32{0x00d33f36, 0x02da1367, 0x03877586, 0x02b29082, 0x026a64f2, 0x00d48dcb, 0x010033db, 0x034de1c8, 0x01aaeb55, 0x002febe5}}, Y: Field{[10]uint32{0x00a3d8ee, 0x000f36ac, 0x03b0f608, 0x00b97c50, 0x0378c6ed, 0x02fe7b20, 0x02fce3eb, 0x039db8a8, 0x0313bb61, 0x001f48ae}}}, + {X: Field{[10]uint32{0x00f31421, 0x035f635d, 0x01f6a6ad, 0x02a4528a, 0x01faacb6, 0x01627329, 0x0393c9ef, 0x02a24369, 0x03604eab, 0x001e3374}}, Y: Field{[10]uint32{0x0219a634, 0x028e373a, 0x00bfd327, 0x023bebfd, 0x0376430c, 0x02d788a1, 0x030d60ef, 0x0007445a, 0x001505b8, 0x003b5fa7}}}, + {X: Field{[10]uint32{0x01213d2e, 0x010f08a3, 0x00276d98, 0x0131f2da, 0x01edb894, 0x019aa292, 0x03977135, 0x00e47f1e, 0x03a9050a, 0x003cbaf3}}, Y: Field{[10]uint32{0x00fa4eaa, 0x03d79e2c, 0x01900bb3, 0x00593cf7, 0x0309513d, 0x01a754d3, 0x03a180c5, 0x027c4f14, 0x030d956f, 0x002c71d8}}}, + {X: Field{[10]uint32{0x02af4c2b, 0x0142e746, 0x00adfca8, 0x02aba056, 0x02857593, 0x01154bab, 0x00199433, 0x032ecc33, 0x020d83bf, 0x00010f35}}, Y: Field{[10]uint32{0x007e8f62, 0x02784418, 0x0130247e, 0x00313f33, 0x01099623, 0x00926633, 0x023d6592, 0x0079ae78, 0x02b10f72, 0x003fd92e}}}, + {X: Field{[10]uint32{0x038ea93c, 0x0025c27c, 0x01315f92, 0x03ee97b0, 0x0302168d, 0x009fc4ed, 0x020c3a3b, 0x012775ef, 0x00e0c01a, 0x00106497}}, Y: Field{[10]uint32{0x00f77110, 0x03c362e5, 0x02c26c48, 0x01dbc512, 0x01a725a6, 0x02c0b66a, 0x02f49c19, 0x002b0068, 0x015ecb6a, 0x0014d1ae}}}, + {X: Field{[10]uint32{0x023877e5, 0x03b396cc, 0x03eee3e6, 0x00c9f89b, 0x000fa1c2, 0x0343b836, 0x011bb478, 0x00b60aa1, 0x02106c76, 0x003f48c4}}, Y: Field{[10]uint32{0x016fa162, 0x00bead3e, 0x0266e7eb, 0x018876cf, 0x014bf334, 0x00d3bb70, 0x03748d62, 0x03b3a2eb, 0x0316f5a6, 0x000e5d8c}}}, + {X: Field{[10]uint32{0x00556ef7, 0x01a0f63d, 0x01cb26ea, 0x012c0341, 0x03d5ad68, 0x028f4727, 0x0254a0a0, 0x02f87cda, 0x0298cb7a, 0x003f8fa2}}, Y: Field{[10]uint32{0x031223bf, 0x02503813, 0x0346c3fa, 0x01d6af81, 0x00837b44, 0x02b56992, 0x03f05f9b, 0x00198e87, 0x027734d8, 0x001f4881}}}, + {X: Field{[10]uint32{0x035ec5dd, 0x023adcd3, 0x01ab69ba, 0x02521060, 0x0338232e, 0x01c5c5f6, 0x03f9b1d2, 0x006f7130, 0x0364ae0d, 0x003980a9}}, Y: Field{[10]uint32{0x00916fdb, 0x00f9bd33, 0x03450d51, 0x03d5ed20, 0x028bc9be, 0x02dded20, 0x001f9516, 0x022c400b, 0x00aa2626, 0x002b440e}}}, + {X: Field{[10]uint32{0x0181e086, 0x02f1bfe3, 0x0364eeb0, 0x00b40d91, 0x03321814, 0x01774e46, 0x01cd9620, 0x01cb65c6, 0x01cfadb7, 0x0021c625}}, Y: Field{[10]uint32{0x0337722e, 0x0322658f, 0x029cb555, 0x03293989, 0x00dda2c9, 0x00e184d4, 0x011ef565, 0x01908675, 0x0064f791, 0x00126824}}}, + {X: Field{[10]uint32{0x03a7e4b4, 0x00e83803, 0x0107f4ab, 0x013d3052, 0x028ed4ec, 0x03ef315b, 0x014ec278, 0x01601720, 0x016e7775, 0x00388a75}}, Y: Field{[10]uint32{0x00e48af2, 0x02ae4205, 0x03ce5795, 0x026ab9ba, 0x006d4265, 0x00f3abaa, 0x017a46b6, 0x020156fb, 0x02bd66d6, 0x00336c1f}}}, + {X: Field{[10]uint32{0x00bbf8ed, 0x02a54dda, 0x01dd6ca4, 0x02be9c2b, 0x03471066, 0x034835a3, 0x00a31189, 0x0321a223, 0x03856b0c, 0x000154d7}}, Y: Field{[10]uint32{0x030ac5e8, 0x012096dd, 0x02c296ab, 0x014d3de9, 0x01f6f529, 0x030c81a8, 0x027822fa, 0x00a99e10, 0x0044245e, 0x00219572}}}, + {X: Field{[10]uint32{0x00767ad6, 0x00d7b949, 0x0130c0dd, 0x00843edc, 0x00b8c48d, 0x00f4419b, 0x000d78e0, 0x033a6b89, 0x01054b37, 0x0004195e}}, Y: Field{[10]uint32{0x03e125f5, 0x02077520, 0x02be2e8b, 0x02bf84ce, 0x004393a5, 0x000d57dc, 0x00eb013c, 0x0186400a, 0x037a508a, 0x0014a0da}}}, + {X: Field{[10]uint32{0x00868c1c, 0x02c3fce8, 0x00e4be6c, 0x00321d0a, 0x00e796db, 0x00d11dde, 0x029e311e, 0x03408e67, 0x02072521, 0x000cd9ac}}, Y: Field{[10]uint32{0x0311638c, 0x0168a350, 0x00ae3025, 0x0191d28d, 0x00ac908c, 0x026660e5, 0x032f15d3, 0x0374b29f, 0x02a422a8, 0x003b1808}}}, + {X: Field{[10]uint32{0x035953ca, 0x00c0c582, 0x03332f26, 0x01919905, 0x0291bd01, 0x027f6d07, 0x0208a1f5, 0x0391b1cd, 0x0396339b, 0x00129e24}}, Y: Field{[10]uint32{0x01b4c442, 0x008fbe79, 0x021013a1, 0x011ab86e, 0x016e6e03, 0x03ae1863, 0x01c0af84, 0x02b51602, 0x017f615a, 0x003516d9}}}, + {X: Field{[10]uint32{0x01f1302e, 0x0251f8e2, 0x030fcae9, 0x02d5eae7, 0x00d75d70, 0x037d818a, 0x00c64ad4, 0x0271ff70, 0x0084fa0a, 0x003b93c9}}, Y: Field{[10]uint32{0x01f80170, 0x03afd082, 0x003cbf81, 0x00fd1e95, 0x03409207, 0x036add28, 0x03dbd0d8, 0x037ebb7d, 0x0094d8ec, 0x0014adde}}}, + {X: Field{[10]uint32{0x01f30a1f, 0x02567f89, 0x02c0eaf9, 0x01831421, 0x039aa9b7, 0x000d7da8, 0x037fbb83, 0x0089bde4, 0x035c163f, 0x00010256}}, Y: Field{[10]uint32{0x01dff7ab, 0x011f1601, 0x025aad55, 0x00ca4c11, 0x006a15d0, 0x030167d9, 0x03145955, 0x01353ba6, 0x00ac6555, 0x00073860}}}, + {X: Field{[10]uint32{0x00436a24, 0x03318bec, 0x034943d6, 0x02734bd4, 0x037a36a5, 0x00062fee, 0x02ecd9fd, 0x02750904, 0x013b067d, 0x001a8897}}, Y: Field{[10]uint32{0x027c2701, 0x0213e67a, 0x008da6a3, 0x02f31cf1, 0x03cc698a, 0x00c0164b, 0x023c91ee, 0x038332a8, 0x023d9352, 0x000a6cf5}}}, + {X: Field{[10]uint32{0x01d36e93, 0x0343235c, 0x0057cf46, 0x015253c8, 0x02172492, 0x00fd2e78, 0x0153a89e, 0x02eeff1a, 0x0241e5f9, 0x0008fbea}}, Y: Field{[10]uint32{0x00db789d, 0x023924df, 0x0386ef21, 0x02844c56, 0x0188cea3, 0x0309a486, 0x03d70755, 0x01c68816, 0x03b17f26, 0x00332269}}}, + {X: Field{[10]uint32{0x033ae55f, 0x02b42053, 0x0066a258, 0x01afd8df, 0x02f97217, 0x028e62b8, 0x01591bd6, 0x02655d63, 0x0297f7f9, 0x0038c307}}, Y: Field{[10]uint32{0x026509e1, 0x0192c061, 0x02df311e, 0x0155a096, 0x013e8e47, 0x034a6f62, 0x01edb4d4, 0x03a497f0, 0x036c3e66, 0x00069c32}}}, + {X: Field{[10]uint32{0x0308e278, 0x0328caf7, 0x01265b57, 0x02444f23, 0x03f05aac, 0x018061da, 0x0212f534, 0x005b54ad, 0x0382acd4, 0x002f9935}}, Y: Field{[10]uint32{0x03ad7e4a, 0x01ab3561, 0x0261f946, 0x017d6887, 0x03bff8f1, 0x00f2d413, 0x03b81c87, 0x00df24a4, 0x004a43e8, 0x001e9061}}}, + {X: Field{[10]uint32{0x023822ac, 0x00930e3c, 0x0145076d, 0x02e35291, 0x0073ada0, 0x00bf7cbc, 0x032b4c28, 0x02987019, 0x02bee009, 0x0032ab00}}, Y: Field{[10]uint32{0x0216d06f, 0x03298be4, 0x008ea500, 0x013f1984, 0x0172a9a6, 0x01711579, 0x02cc3047, 0x03d3888e, 0x00bba040, 0x001f64f9}}}, + {X: Field{[10]uint32{0x0284ccb3, 0x03b079c1, 0x02860fc0, 0x030e1b43, 0x03c1ef94, 0x0385c66c, 0x009321e0, 0x03aa5248, 0x01b03a9c, 0x0036894e}}, Y: Field{[10]uint32{0x023cf9f5, 0x0172fc33, 0x01f15779, 0x01bda8cf, 0x00b1b130, 0x0019fa69, 0x03f601f8, 0x033a8bd9, 0x0387bef1, 0x003a1784}}}, + {X: Field{[10]uint32{0x019cc0ed, 0x003a4d9e, 0x00198070, 0x01eefa6d, 0x024ce4fe, 0x03673ee9, 0x03c1bd8a, 0x01492192, 0x01525c96, 0x002fcbb9}}, Y: Field{[10]uint32{0x0058f18e, 0x00c0c3d8, 0x0304f634, 0x02639d80, 0x035df423, 0x000ce408, 0x01529bc3, 0x02289284, 0x021db129, 0x0022277a}}}, + {X: Field{[10]uint32{0x03abde36, 0x0259f051, 0x0226430b, 0x00a9c829, 0x01113060, 0x0290b18d, 0x024c9ff7, 0x00d98a7f, 0x0141cb0c, 0x002cf92c}}, Y: Field{[10]uint32{0x02865657, 0x01f22a94, 0x01f56a7d, 0x02ecb906, 0x03eff979, 0x035abffa, 0x00ff83e5, 0x020a3631, 0x0118c38a, 0x003d9bdc}}}, + {X: Field{[10]uint32{0x009475a0, 0x01ee9622, 0x03e01496, 0x024d8f0c, 0x0124a255, 0x02888d92, 0x01818265, 0x00846844, 0x024ffad7, 0x001147ac}}, Y: Field{[10]uint32{0x00565bb6, 0x01506791, 0x001a21fe, 0x0316fec5, 0x034cb2f8, 0x0307ccf8, 0x01bd3211, 0x030ede69, 0x014049f6, 0x002227fe}}}, + {X: Field{[10]uint32{0x00f5984c, 0x019741ce, 0x03c53b5d, 0x02fd2f03, 0x03ea4c77, 0x012e2bcc, 0x027a0b0c, 0x011de084, 0x018a6a75, 0x000a6ad9}}, Y: Field{[10]uint32{0x03f0f2c1, 0x0380688a, 0x016d215e, 0x02aae02c, 0x02947b8b, 0x01cb69af, 0x0219f9ad, 0x01b0ec29, 0x01a9c77d, 0x002aac6f}}}, + {X: Field{[10]uint32{0x017b24db, 0x026cd04a, 0x038ac287, 0x026b1953, 0x0209d9e7, 0x0076967e, 0x03bb9c0d, 0x03089016, 0x0007d815, 0x0026d671}}, Y: Field{[10]uint32{0x0276d190, 0x006ae369, 0x0376cc76, 0x02d826c6, 0x0117bb35, 0x02eb302a, 0x0027811a, 0x0004530a, 0x018ee630, 0x00293bc1}}}, + {X: Field{[10]uint32{0x026c9fd0, 0x01939d29, 0x0220fc05, 0x01e94ab1, 0x0378e69a, 0x01b0eb1d, 0x01b970e7, 0x02e5d62e, 0x036582ae, 0x0021f49e}}, Y: Field{[10]uint32{0x03511e03, 0x0026384d, 0x00b1acd9, 0x01724c9a, 0x0004d03d, 0x03c1fd07, 0x0083e087, 0x024cdd07, 0x03ccdec2, 0x000ffcec}}}, + {X: Field{[10]uint32{0x009701dc, 0x02e9bda6, 0x00bf4d9b, 0x020edc36, 0x037fe7d3, 0x01af2e4e, 0x005a0ab3, 0x02058ef6, 0x004d3895, 0x003eecda}}, Y: Field{[10]uint32{0x03b94504, 0x02f89921, 0x014c0301, 0x0109a297, 0x01759e73, 0x00981b42, 0x01c2af7b, 0x02cef443, 0x01c6c9c5, 0x001ec1f3}}}, + {X: Field{[10]uint32{0x0314a453, 0x033de7d0, 0x034eacc7, 0x0253e549, 0x01a3ef14, 0x019b9629, 0x03cc1adc, 0x00ae7488, 0x02e4ccc4, 0x0020808a}}, Y: Field{[10]uint32{0x01d2b695, 0x03439245, 0x02a3bb5c, 0x017a6a3a, 0x003a8180, 0x02d36d14, 0x030481a9, 0x00b6841b, 0x02509ddf, 0x00309090}}}, + {X: Field{[10]uint32{0x0220f901, 0x03b2562f, 0x0001a1db, 0x01f15f42, 0x01ab4e65, 0x0247e25d, 0x02475fae, 0x032cdeef, 0x005b3b51, 0x002e9735}}, Y: Field{[10]uint32{0x0341b0a5, 0x00e807b3, 0x0016478e, 0x0062d639, 0x007f9eb7, 0x026394c9, 0x007eddd2, 0x03d638d0, 0x03c0f8b4, 0x000b8353}}}, + {X: Field{[10]uint32{0x026703fc, 0x00197622, 0x02d277cd, 0x00eb7d6d, 0x02cfadaf, 0x00f9cb88, 0x02b44445, 0x0346f9da, 0x0041b316, 0x0004a4f2}}, Y: Field{[10]uint32{0x0133c2fa, 0x01c2ab54, 0x01749286, 0x01122012, 0x002488f1, 0x01081c27, 0x004ab523, 0x012622e1, 0x033740fb, 0x00263d63}}}, + {X: Field{[10]uint32{0x035015c6, 0x02aa6237, 0x037c2c69, 0x03923610, 0x03987d77, 0x022b8db1, 0x03972dea, 0x006f6b6e, 0x03c854bf, 0x003b27ec}}, Y: Field{[10]uint32{0x01486d3f, 0x01047329, 0x00cb2a00, 0x0152ff3b, 0x00fe425d, 0x020c9583, 0x01d6b364, 0x03a5d258, 0x03fdea59, 0x00357cd6}}}, + {X: Field{[10]uint32{0x0144d244, 0x01372dc9, 0x02d62769, 0x03b1ab6b, 0x029950ea, 0x039f563d, 0x03d44662, 0x016da5b2, 0x003f4cd5, 0x000bb338}}, Y: Field{[10]uint32{0x03f68879, 0x01857990, 0x0082f0f6, 0x00ff79e4, 0x00d1bc79, 0x001f3133, 0x01403cae, 0x03dd1fab, 0x00a97f1c, 0x003853cc}}}, + {X: Field{[10]uint32{0x026fb3b2, 0x000973d5, 0x03c3d77c, 0x02beb141, 0x024c6ad5, 0x01bdbbe2, 0x025e7fa5, 0x039481e0, 0x037fa63e, 0x003b63eb}}, Y: Field{[10]uint32{0x03684a9d, 0x0011b620, 0x008f2c9b, 0x03123afe, 0x01cb0636, 0x03e8f953, 0x02f10407, 0x009cf296, 0x00b8ab21, 0x00037c48}}}, + {X: Field{[10]uint32{0x00c32e4f, 0x01e317c5, 0x023a5bc0, 0x027cf0a3, 0x030bf3fd, 0x00c3f645, 0x02b456af, 0x036afb07, 0x037b8780, 0x0011f2e3}}, Y: Field{[10]uint32{0x00aa3203, 0x00c6f4ad, 0x029af669, 0x006625e3, 0x02c5889d, 0x0087b8b7, 0x02fc948f, 0x02a9b1a2, 0x02021f16, 0x003e181e}}}, + {X: Field{[10]uint32{0x01762009, 0x0056890f, 0x025cacf2, 0x011c78e3, 0x02d49620, 0x02bf9c3a, 0x01a3ee38, 0x02acbcee, 0x02c1fdeb, 0x001d8d96}}, Y: Field{[10]uint32{0x0253aa28, 0x03146d53, 0x01c3211f, 0x00d03737, 0x025d7783, 0x01f517e9, 0x037d3a69, 0x02d803fc, 0x03728b4b, 0x000b2b2b}}}, + {X: Field{[10]uint32{0x0027b424, 0x00cc27b3, 0x00ea8a23, 0x0078461a, 0x039f0931, 0x018fb720, 0x03750550, 0x03954b84, 0x01e099b8, 0x00327757}}, Y: Field{[10]uint32{0x00f8c1a5, 0x0088daee, 0x039e4b38, 0x022ec45f, 0x0338163a, 0x02bf9f4a, 0x00f134ae, 0x017adf1a, 0x02384e61, 0x0012f534}}}, + {X: Field{[10]uint32{0x010a8961, 0x0164cb6b, 0x02a3183e, 0x02de08b8, 0x009a1e08, 0x036f2dbe, 0x01c2f96b, 0x01baf1f0, 0x03adcc40, 0x0008ada9}}, Y: Field{[10]uint32{0x020ac794, 0x007b77eb, 0x02d5e22c, 0x0389dd4d, 0x0287b553, 0x00d2bcb5, 0x02be9a95, 0x013d3f4b, 0x0095bab2, 0x0014ae18}}}, + {X: Field{[10]uint32{0x0381a158, 0x006a6da7, 0x00d24a33, 0x0012cb79, 0x0296f06c, 0x02adfdaf, 0x03017fec, 0x01f7c30d, 0x00a749fa, 0x000fba02}}, Y: Field{[10]uint32{0x0039cb4a, 0x008f0709, 0x02d0c01e, 0x015b6107, 0x016c4b13, 0x01933ff9, 0x03dc1740, 0x027b3621, 0x00ef5f1f, 0x000fa553}}}, + {X: Field{[10]uint32{0x00fa4803, 0x027088ae, 0x0048f3e4, 0x0009c10c, 0x00aa97d3, 0x0356d890, 0x0269ae44, 0x01225837, 0x00588a7a, 0x000a4e2f}}, Y: Field{[10]uint32{0x01ada03e, 0x0015340e, 0x0081865b, 0x0071672d, 0x029ea59a, 0x029ba80a, 0x034826cb, 0x00764379, 0x02619fad, 0x003c9aef}}}, + {X: Field{[10]uint32{0x01a15451, 0x025df5f8, 0x030b12c3, 0x01737dca, 0x0094962e, 0x037d0c9d, 0x03ea34f5, 0x03277932, 0x00ecda97, 0x001a0956}}, Y: Field{[10]uint32{0x01fedc6c, 0x02092bee, 0x0220f112, 0x00cd6bad, 0x028b543f, 0x023b1b31, 0x0253c4cc, 0x0004fc64, 0x036522c7, 0x003130b9}}}, + {X: Field{[10]uint32{0x02493620, 0x029a2d01, 0x03d8c08b, 0x00243dfd, 0x010cbfad, 0x007cf411, 0x036811de, 0x003695e7, 0x0068fc52, 0x001c8363}}, Y: Field{[10]uint32{0x004c9cb5, 0x01517899, 0x03a2950d, 0x030ed217, 0x0107ac26, 0x02eecc6a, 0x016fd4b8, 0x01b41813, 0x00a84f7a, 0x002e19fa}}}, + {X: Field{[10]uint32{0x00b84831, 0x01fd7afd, 0x029e02a1, 0x00beceb2, 0x01994d5d, 0x030118ea, 0x02153ec6, 0x019634d5, 0x03e71bdf, 0x00259fec}}, Y: Field{[10]uint32{0x007cc83f, 0x0180bad5, 0x03a094cf, 0x03271e21, 0x03e3cddf, 0x0326a135, 0x01d0926e, 0x0092ccbd, 0x01f88617, 0x002e1299}}}, + {X: Field{[10]uint32{0x03cedc85, 0x029063a2, 0x03d88db2, 0x0353e19c, 0x0273f6eb, 0x03bc4ee6, 0x01fc1131, 0x030f7a39, 0x025c77ec, 0x000767f4}}, Y: Field{[10]uint32{0x028035d7, 0x02b713ab, 0x030e4aa6, 0x032758af, 0x03033012, 0x00fe908c, 0x03ff58e2, 0x003ed2fe, 0x0301d972, 0x00152818}}}, + {X: Field{[10]uint32{0x01311c0a, 0x033aa27c, 0x0144a0b4, 0x027e4143, 0x017d0402, 0x00d1b8ce, 0x00dff5ff, 0x01ebcc45, 0x0158a113, 0x002004e0}}, Y: Field{[10]uint32{0x025a6b31, 0x008d2a9a, 0x01c36bdd, 0x0225f157, 0x00bc5e94, 0x028ebf9c, 0x01cc712d, 0x02b06309, 0x0076e6d6, 0x0005bd26}}}, + {X: Field{[10]uint32{0x03ef632f, 0x00de4cf0, 0x00c55c6c, 0x006088aa, 0x0233aa34, 0x0041f7c8, 0x020906b3, 0x0161138e, 0x002177fa, 0x0002aad0}}, Y: Field{[10]uint32{0x0201b092, 0x0139780c, 0x03d2f703, 0x00e669fe, 0x019a0620, 0x028225c4, 0x02d58767, 0x0373b4e0, 0x008f3ad0, 0x0026e0c8}}}, + {X: Field{[10]uint32{0x03a72f10, 0x004bc4c3, 0x00fe1d36, 0x00dc52ef, 0x003c5232, 0x00052f98, 0x02f1e3b3, 0x03d19367, 0x014c7670, 0x0023cff4}}, Y: Field{[10]uint32{0x0205c68e, 0x01b022d0, 0x030a4b54, 0x03d75c70, 0x02862ef6, 0x032181b9, 0x03a593a5, 0x02e07eef, 0x00947901, 0x002132dc}}}, + {X: Field{[10]uint32{0x021f4933, 0x0254fb52, 0x00d88e49, 0x000cc32e, 0x00df69a9, 0x00e5e7b2, 0x034578a3, 0x0301bfab, 0x011caba3, 0x000eea72}}, Y: Field{[10]uint32{0x026f99cc, 0x03b91ede, 0x0072f582, 0x016ed248, 0x03fdcff6, 0x01646efb, 0x00107990, 0x0188c7a1, 0x034c3eb6, 0x001c1229}}}, + {X: Field{[10]uint32{0x00f36a7c, 0x026a72b7, 0x006455f2, 0x0070a618, 0x017344c2, 0x027db2d8, 0x01524682, 0x02c38354, 0x03d289da, 0x000be30d}}, Y: Field{[10]uint32{0x03508396, 0x01d3503a, 0x00201d2f, 0x024dea0d, 0x014223d0, 0x0271e659, 0x02f145e6, 0x01c43afe, 0x024e9d02, 0x000dfc2d}}}, + {X: Field{[10]uint32{0x02dce846, 0x0310329d, 0x012d300e, 0x00a33b6f, 0x0273fc61, 0x02995bf2, 0x03f60500, 0x02749ee1, 0x03a2c920, 0x001179ba}}, Y: Field{[10]uint32{0x035f16ec, 0x018b24ef, 0x02d908a0, 0x015d399a, 0x02813867, 0x03b88960, 0x0091a635, 0x020aef47, 0x0144ba18, 0x0028f8a3}}}, + {X: Field{[10]uint32{0x01767ee9, 0x03ee2c7f, 0x023cc605, 0x026e62b4, 0x0182ea7d, 0x03a10b67, 0x027143ff, 0x03348d11, 0x03d380a0, 0x00297b34}}, Y: Field{[10]uint32{0x0311353f, 0x029b8a53, 0x03b959be, 0x00cc3459, 0x02c9ab6c, 0x0140573c, 0x0331fe5b, 0x0109a4fe, 0x00238ea8, 0x0008bc4a}}}, + {X: Field{[10]uint32{0x0174be83, 0x00ffe400, 0x034a2c94, 0x02a7fd80, 0x0051eb66, 0x0060dd3a, 0x03698213, 0x00ec3510, 0x0271c466, 0x003dfd16}}, Y: Field{[10]uint32{0x0346fce5, 0x030290d6, 0x021498ac, 0x01b3d4be, 0x017fbdf4, 0x01a8ca07, 0x013d6e3e, 0x025fd503, 0x03cd4ec1, 0x000e858c}}}, + {X: Field{[10]uint32{0x007cb59c, 0x02c9d2d2, 0x00832a94, 0x020a957b, 0x0252bf6c, 0x015c5f50, 0x0303b7de, 0x01385d6b, 0x02866b31, 0x00249608}}, Y: Field{[10]uint32{0x02811f68, 0x03c149d2, 0x004a0369, 0x00b377eb, 0x03d6c2f5, 0x01256ef1, 0x02346700, 0x00277194, 0x01847368, 0x003f23a5}}}, + {X: Field{[10]uint32{0x02556da4, 0x01db3043, 0x027b5a7f, 0x03c53754, 0x011d7849, 0x02b9be9d, 0x017fa966, 0x034028bd, 0x00d32303, 0x003057fa}}, Y: Field{[10]uint32{0x01c10951, 0x03ec4260, 0x00d067b5, 0x01ab8ba7, 0x03e017c0, 0x00334d22, 0x03c445c5, 0x037fc699, 0x03d04685, 0x000d890a}}}, + {X: Field{[10]uint32{0x022b5355, 0x013d8331, 0x03e5ca46, 0x00d9f5ca, 0x0004dd71, 0x01c2fc35, 0x00372df2, 0x029838c4, 0x0026152a, 0x000127be}}, Y: Field{[10]uint32{0x00c4c645, 0x01f4b2c8, 0x02165d9c, 0x00bad597, 0x024e369d, 0x01ea4f85, 0x01c572c7, 0x01202e68, 0x03a20dc4, 0x001f2b52}}}, + {X: Field{[10]uint32{0x0091a18f, 0x02b848a7, 0x006a3be4, 0x0077b59a, 0x03629b2f, 0x018c4cf8, 0x02c876e1, 0x03e53f84, 0x01e7538f, 0x00323782}}, Y: Field{[10]uint32{0x017c2635, 0x02d891da, 0x03e885ea, 0x003c69db, 0x029cecb1, 0x01825958, 0x031e872d, 0x02228417, 0x031fe580, 0x002d69fc}}}, + {X: Field{[10]uint32{0x02abb344, 0x007ffae5, 0x00576946, 0x0067bdd9, 0x016b3d51, 0x026bc92a, 0x03a6cd3d, 0x010ebc75, 0x03a4616f, 0x00361ae7}}, Y: Field{[10]uint32{0x0003bcab, 0x01c3867c, 0x02539fb5, 0x01cb8e4b, 0x0056df6f, 0x01a72e3a, 0x001b6606, 0x006d2652, 0x028e8f93, 0x0008e233}}}, + {X: Field{[10]uint32{0x00cbbf88, 0x00eb9bc0, 0x0055a743, 0x02793cfb, 0x0187c496, 0x003f8c10, 0x027b7193, 0x038ac4fe, 0x0218f351, 0x0028b35d}}, Y: Field{[10]uint32{0x0119d685, 0x034dae17, 0x0324aa8d, 0x034e8258, 0x0229870c, 0x00c430d8, 0x015711ab, 0x00d8ec51, 0x0062436a, 0x000f82d7}}}, + {X: Field{[10]uint32{0x0100b2ca, 0x010b33c8, 0x02b87ab4, 0x00efb4be, 0x02ad6c21, 0x00e6d55d, 0x036e4f6b, 0x0128f5e0, 0x00d4e33e, 0x002dca0f}}, Y: Field{[10]uint32{0x02abc9ea, 0x00c5cfa3, 0x008fc273, 0x019c0109, 0x03090833, 0x0097aacf, 0x021e7e30, 0x008c1c60, 0x02fb111c, 0x00246001}}}, + {X: Field{[10]uint32{0x00b9a769, 0x02903d92, 0x00d9a0cd, 0x0151bbf3, 0x01d12e18, 0x0328c4d9, 0x01b123b9, 0x02ea34d5, 0x012e9707, 0x002c7f4b}}, Y: Field{[10]uint32{0x035e674e, 0x027bd2d1, 0x0294b58c, 0x00f58b6b, 0x021a40cf, 0x00a062ff, 0x004d2226, 0x01577bd8, 0x00168e8f, 0x00230df3}}}, + {X: Field{[10]uint32{0x0339f90f, 0x034ae0b2, 0x0262e7c0, 0x031ce574, 0x02cf6077, 0x0216d69b, 0x034be328, 0x03a17832, 0x03e74242, 0x0006c265}}, Y: Field{[10]uint32{0x037760b3, 0x01a48eda, 0x03183fa3, 0x00493052, 0x02f30fae, 0x00ef3e33, 0x00c2d2ef, 0x00762bb6, 0x00d427cd, 0x00156d36}}}, + {X: Field{[10]uint32{0x018d78d6, 0x01541976, 0x03e698e0, 0x02e06ff5, 0x034f1dc9, 0x03b86eec, 0x02362588, 0x0324977a, 0x03bc094a, 0x0015bfee}}, Y: Field{[10]uint32{0x00edc65f, 0x029c6636, 0x022089f8, 0x02dee00d, 0x02a517fc, 0x02fc716e, 0x02f3d235, 0x00af6c82, 0x008f46d7, 0x002a9cc8}}}, + {X: Field{[10]uint32{0x02d7045e, 0x00f8364e, 0x00685353, 0x02459c8a, 0x00e39081, 0x0049847a, 0x026cd368, 0x01fe70d0, 0x02b07ddb, 0x0030497e}}, Y: Field{[10]uint32{0x0377e5ae, 0x034c3c66, 0x024b68cc, 0x03d137d1, 0x031f235e, 0x00b07763, 0x003f1189, 0x01952bdb, 0x003f622f, 0x000a019c}}}, + {X: Field{[10]uint32{0x027f4a17, 0x014508ff, 0x0130148a, 0x03efc967, 0x02dbab85, 0x0207a02b, 0x01fa6fee, 0x031d0a2c, 0x01dbe4e0, 0x0039fb7a}}, Y: Field{[10]uint32{0x033fc066, 0x01695b34, 0x021d9e63, 0x016f0b6e, 0x02e23692, 0x039fd434, 0x00d32e65, 0x0173eb20, 0x037a9fbc, 0x0024eac9}}}, + {X: Field{[10]uint32{0x03df93f3, 0x02545668, 0x01cc8aa3, 0x00a3122c, 0x03a47c16, 0x0214fe59, 0x00c3da9d, 0x01af311c, 0x0363f1bd, 0x001d1c05}}, Y: Field{[10]uint32{0x018ac8ee, 0x01bb5557, 0x029d8a4b, 0x01eca3b5, 0x02bd2223, 0x001551ee, 0x0393dd5f, 0x0043ccdc, 0x011c7c55, 0x002acb00}}}, + {X: Field{[10]uint32{0x039081b8, 0x02403579, 0x0257689c, 0x00717195, 0x020a6554, 0x00de138c, 0x01ffb8d8, 0x03dc7f9b, 0x039755ba, 0x0002349f}}, Y: Field{[10]uint32{0x02c250ad, 0x02184946, 0x01386e55, 0x0032dfcc, 0x03f308f9, 0x0354889f, 0x021f837b, 0x0258052b, 0x0268f3c8, 0x0029c5db}}}, + {X: Field{[10]uint32{0x00cc7ea9, 0x01e633ab, 0x028c10f5, 0x00063a60, 0x0071b0db, 0x02b0976e, 0x000a0ff1, 0x02d4c7ab, 0x02fe9040, 0x0018f81a}}, Y: Field{[10]uint32{0x00910aa5, 0x003001fd, 0x0213e930, 0x0112ca9a, 0x010c9112, 0x00126bb5, 0x028fcf99, 0x03822dac, 0x0084a9db, 0x002aa846}}}, + {X: Field{[10]uint32{0x004ed50f, 0x0256251d, 0x004b5dde, 0x030a2082, 0x036bf8ba, 0x00f92c6a, 0x01617d02, 0x002acd0b, 0x01ae27d6, 0x00371fa8}}, Y: Field{[10]uint32{0x002f3dfa, 0x000a4705, 0x0140e48a, 0x029b8445, 0x03b63efb, 0x01d52968, 0x03e97fc0, 0x0317feef, 0x036e2b95, 0x0024f1f5}}}, + {X: Field{[10]uint32{0x02e842d7, 0x00ef46fd, 0x02253221, 0x00e6ee5d, 0x0136e402, 0x02d6baa6, 0x03dfb691, 0x03bd28f5, 0x036df69c, 0x003cebbb}}, Y: Field{[10]uint32{0x0208de5d, 0x0343d188, 0x001151fb, 0x023bd24f, 0x0272e562, 0x032c7a2b, 0x03bde031, 0x01c00be1, 0x01da339c, 0x0015f4df}}}, + {X: Field{[10]uint32{0x02bec3ce, 0x0286b29d, 0x01b67816, 0x03eca3da, 0x02ae87da, 0x00f5c9cb, 0x005d0812, 0x0193a837, 0x004c316e, 0x002096f6}}, Y: Field{[10]uint32{0x00a52251, 0x032846d0, 0x00f1dc28, 0x01925d96, 0x00849a25, 0x018be1fc, 0x03e3f69d, 0x01c2a1a8, 0x03fdba83, 0x001878e9}}}, + {X: Field{[10]uint32{0x0056a75d, 0x03bae4ce, 0x03ba7f5a, 0x02e543b0, 0x010edb63, 0x03a509a8, 0x02988cd8, 0x014dc274, 0x00d74dec, 0x000c428b}}, Y: Field{[10]uint32{0x03122c97, 0x00ee07c5, 0x00228ffa, 0x03b8f863, 0x03e3ff1e, 0x02bb0943, 0x02b4ab3a, 0x0395fdfc, 0x02aedfa5, 0x00175b61}}}, + {X: Field{[10]uint32{0x03425217, 0x0160b006, 0x024d85af, 0x02e25dfb, 0x0369f04d, 0x026edb0f, 0x02355aef, 0x004b43e0, 0x007562a5, 0x000d1c75}}, Y: Field{[10]uint32{0x039cba31, 0x00e67af6, 0x00358aed, 0x02a51410, 0x01ccd444, 0x000ded09, 0x006d68c5, 0x02da7afe, 0x02702fe0, 0x0009cb77}}}, + {X: Field{[10]uint32{0x00257a2f, 0x01a01f93, 0x0138d808, 0x03ac3a8d, 0x00aaeee4, 0x020a6bb2, 0x022b3df6, 0x02bc9082, 0x0163bfaf, 0x002fdb49}}, Y: Field{[10]uint32{0x000b496d, 0x003b8ac1, 0x03ff1a92, 0x03113079, 0x003a2738, 0x0155d1ae, 0x03847ef7, 0x0125ad93, 0x02007e7b, 0x003a01de}}}, + {X: Field{[10]uint32{0x039cddc4, 0x03b5094a, 0x023fbbdb, 0x0194c9c8, 0x02d6f4d4, 0x03361db9, 0x03ce42a3, 0x03dc614b, 0x03c4a883, 0x003accf3}}, Y: Field{[10]uint32{0x02e5453f, 0x02b69287, 0x028d2a7d, 0x00df8977, 0x03eaab91, 0x01f7a1be, 0x00f03ad2, 0x022f6641, 0x00f2ef60, 0x0026f500}}}, + {X: Field{[10]uint32{0x00c2279f, 0x002475bb, 0x0108f082, 0x00f68363, 0x016b123d, 0x037a5591, 0x0383edf7, 0x03cc67ec, 0x00d03e5d, 0x0004c5f8}}, Y: Field{[10]uint32{0x03675afd, 0x0348a48c, 0x03b252a9, 0x025fab2e, 0x01dcae42, 0x001a951c, 0x0122b607, 0x02755ac3, 0x024d5c6f, 0x000efd90}}}, + {X: Field{[10]uint32{0x009aeb56, 0x02f38d0c, 0x03456c99, 0x039099ee, 0x007e00f8, 0x01501bcc, 0x022cf5dc, 0x010fafac, 0x032e99dc, 0x00206c27}}, Y: Field{[10]uint32{0x03361932, 0x02006028, 0x03d7c495, 0x01bfafc5, 0x011dbc5f, 0x00b8cc72, 0x035b1df9, 0x03bab10b, 0x02a4b300, 0x00275215}}}, + {X: Field{[10]uint32{0x015a62f2, 0x02199121, 0x01f7e98b, 0x00c8348f, 0x03ed436d, 0x03d3a8cd, 0x02626bae, 0x03fc65c8, 0x01670a32, 0x00037ba9}}, Y: Field{[10]uint32{0x01032414, 0x019b50e7, 0x005a6dfe, 0x03bda79e, 0x014a8310, 0x00305e4b, 0x0157ab34, 0x005ff821, 0x0297c61a, 0x00172449}}}, + {X: Field{[10]uint32{0x003444e5, 0x03713a39, 0x02755ef3, 0x02c73ba1, 0x0296ae44, 0x01ea46e7, 0x00e02ffa, 0x0345cf9a, 0x00835746, 0x003392b4}}, Y: Field{[10]uint32{0x0303aa7d, 0x001bd89f, 0x02a20d34, 0x006bfc70, 0x00df7cc8, 0x01517fa1, 0x013e2891, 0x023532d5, 0x03890523, 0x002fa1b2}}}, + {X: Field{[10]uint32{0x030b077e, 0x0339ffd4, 0x004f6fbb, 0x0131f606, 0x032e3638, 0x02281c57, 0x0119a324, 0x006bdb93, 0x023d407f, 0x0026a64f}}, Y: Field{[10]uint32{0x001a7a7e, 0x03baf04c, 0x034e2481, 0x0077150f, 0x023f8700, 0x01b65bfe, 0x027bd6fe, 0x019fba66, 0x012d80a2, 0x00392869}}}, + {X: Field{[10]uint32{0x039bd0d8, 0x00d844be, 0x03ccc06b, 0x03bd16ab, 0x039247c7, 0x0099ea98, 0x017ae6a1, 0x0017205c, 0x032d7c7f, 0x0007c437}}, Y: Field{[10]uint32{0x00760410, 0x01e0ec16, 0x029affdc, 0x010c9f30, 0x03e45ad6, 0x0259fa6b, 0x0283b0ec, 0x036de4c9, 0x025b71e2, 0x0019c2c9}}}, + {X: Field{[10]uint32{0x02621b53, 0x0355c461, 0x00a5a0ba, 0x03fe7645, 0x02d57d1d, 0x0329dd77, 0x0317633d, 0x008239f6, 0x025729c9, 0x001c33ac}}, Y: Field{[10]uint32{0x01df0c62, 0x0307b0d2, 0x0164ace7, 0x00941fa7, 0x0200ee98, 0x01b475d6, 0x0211c0ec, 0x01157f37, 0x0291b3f3, 0x001b805b}}}, + {X: Field{[10]uint32{0x00694e3e, 0x024fdf9d, 0x032fd466, 0x0312b3a7, 0x00043fb6, 0x02841818, 0x03b79210, 0x020bec37, 0x01e64dc8, 0x002e91b9}}, Y: Field{[10]uint32{0x01789acc, 0x010b221f, 0x009cb0f3, 0x02cf7a81, 0x025868d0, 0x0276310d, 0x0208e060, 0x0207fe28, 0x02b90793, 0x003abad3}}}, + {X: Field{[10]uint32{0x03c30d81, 0x0034e200, 0x037a9e32, 0x01538123, 0x02a631d1, 0x00f5d5e7, 0x0179beaf, 0x02b48390, 0x02dfd233, 0x002ee8ee}}, Y: Field{[10]uint32{0x021b961d, 0x03e400d7, 0x011e8ed3, 0x039a3229, 0x0202bdfc, 0x01d95a4f, 0x03a0af4e, 0x01131cc5, 0x030d69dd, 0x003ca9f1}}}, + {X: Field{[10]uint32{0x02d3f8a5, 0x01d4298d, 0x01283d93, 0x007ce396, 0x02057d49, 0x010782bc, 0x0258f1bf, 0x02e9a05f, 0x0369d300, 0x001b7da9}}, Y: Field{[10]uint32{0x033a4a6f, 0x0268db69, 0x02819dad, 0x024a67c4, 0x01ebf0f4, 0x0337ed36, 0x02d1f31c, 0x031dcbb3, 0x03b3aa51, 0x0018e820}}}, + {X: Field{[10]uint32{0x03174f2c, 0x02970529, 0x022361ad, 0x014c74bf, 0x034fab19, 0x024e945c, 0x00c7ea87, 0x026a60a5, 0x031a4b8c, 0x002bff44}}, Y: Field{[10]uint32{0x0011be6d, 0x00a59c4d, 0x01708734, 0x0072cc81, 0x03342689, 0x022a5e23, 0x02ed3225, 0x00da60ff, 0x00d9ec4a, 0x00130f79}}}, + {X: Field{[10]uint32{0x030abc7e, 0x028914ce, 0x016ee2f0, 0x031af086, 0x01d42cca, 0x031f1c23, 0x01ba5464, 0x02c62867, 0x00499e54, 0x000b68c4}}, Y: Field{[10]uint32{0x032db974, 0x001527c8, 0x03e7c0bb, 0x028fded1, 0x02426981, 0x00713414, 0x0109d445, 0x027e2d5b, 0x009120ad, 0x003cd52b}}}, + {X: Field{[10]uint32{0x02e57b61, 0x01f433e4, 0x03f2b2dc, 0x0007bb24, 0x0323cdd2, 0x036d30c7, 0x01381ace, 0x03e0aba3, 0x0053cbe3, 0x000e20bb}}, Y: Field{[10]uint32{0x037e6e3a, 0x020328bb, 0x03c786cd, 0x014cbec2, 0x0271a43d, 0x009d0191, 0x02b0046b, 0x02ff3124, 0x015de5a7, 0x00074d0c}}}, + {X: Field{[10]uint32{0x0387f9f1, 0x026ed21c, 0x00b28d55, 0x01d4a997, 0x03468259, 0x03a7ad78, 0x03c8e4e8, 0x02ac98e6, 0x02356a08, 0x003f2ae1}}, Y: Field{[10]uint32{0x00fceb94, 0x02c81532, 0x03f540d7, 0x023413bd, 0x02bef2b3, 0x034d5c2b, 0x0166753a, 0x001f395d, 0x00c0d08f, 0x002bd020}}}, + {X: Field{[10]uint32{0x0136bb58, 0x02275d67, 0x00ebe5dd, 0x00468552, 0x02847bf0, 0x01d5032a, 0x01dcd5a5, 0x01f84a8a, 0x00bb8a89, 0x003f4d2e}}, Y: Field{[10]uint32{0x0110b2f3, 0x00d465de, 0x0255b762, 0x00ef4356, 0x00d19b60, 0x008c41b9, 0x0127eaa7, 0x03e5cd5e, 0x02ac6a56, 0x0014699a}}}, + {X: Field{[10]uint32{0x03d4b469, 0x03663961, 0x002fa808, 0x01826776, 0x031d3b46, 0x01f1f605, 0x007a1678, 0x016fc1db, 0x0120c0d8, 0x0007a26f}}, Y: Field{[10]uint32{0x00fe882a, 0x03218a4f, 0x01353eaf, 0x0243ef13, 0x03dcf115, 0x01d3cc48, 0x02dae475, 0x021d80f7, 0x01d0e576, 0x0013d4ea}}}, + {X: Field{[10]uint32{0x03aa05ed, 0x00ea55de, 0x0048f5fb, 0x02795231, 0x01ddca45, 0x03beeaea, 0x017d93ea, 0x026b3b23, 0x03ba6690, 0x002287a9}}, Y: Field{[10]uint32{0x037be091, 0x030133e2, 0x00f99e09, 0x033e2ba5, 0x01ea1f1f, 0x0140600c, 0x037655b2, 0x00de90e7, 0x01e9064f, 0x00356016}}}, + {X: Field{[10]uint32{0x011331a1, 0x03ddb587, 0x032cbd7f, 0x00302d55, 0x00e4451f, 0x03ca586c, 0x0086549a, 0x02649a5a, 0x000d80d5, 0x003830de}}, Y: Field{[10]uint32{0x0145491d, 0x013da392, 0x02551114, 0x02baefb6, 0x03d827dd, 0x008c39ec, 0x03e6f1e5, 0x00ec7f0b, 0x02e6a13c, 0x00267674}}}, + {X: Field{[10]uint32{0x03996035, 0x032303a0, 0x0260ef7c, 0x0373fc83, 0x008e7e1b, 0x036ab786, 0x03ed36c5, 0x02b0485b, 0x00e6ed23, 0x002590d5}}, Y: Field{[10]uint32{0x0028998a, 0x02f4c98d, 0x03529aa8, 0x0234f18c, 0x027e6a40, 0x039bc188, 0x02531984, 0x031ba1c8, 0x009a8563, 0x003dd228}}}, + {X: Field{[10]uint32{0x02fe3f9b, 0x036f0f06, 0x014a1ab1, 0x00556150, 0x038bd094, 0x01a61871, 0x02eab869, 0x03218bf1, 0x03295125, 0x00260279}}, Y: Field{[10]uint32{0x007b9fd7, 0x01afd8e6, 0x0005efd4, 0x02250cbf, 0x00ab0fc0, 0x03f21296, 0x03909f86, 0x0155a20c, 0x0228bbf5, 0x003614d8}}}, + {X: Field{[10]uint32{0x0301ed17, 0x03b31303, 0x03b34abb, 0x01cf6852, 0x011d8d71, 0x00097f1f, 0x0183bf94, 0x013108a3, 0x0102305e, 0x000657d3}}, Y: Field{[10]uint32{0x009d637f, 0x02e1d99f, 0x0221a726, 0x0174ea23, 0x03ce1384, 0x00f2d119, 0x00152e02, 0x02e7341a, 0x00b497ae, 0x00255f6e}}}, + {X: Field{[10]uint32{0x014e0b37, 0x011286a1, 0x036c0f2c, 0x039a06e0, 0x02b0203f, 0x0009243a, 0x023f726d, 0x01f8d3be, 0x02ba3eb1, 0x00158baa}}, Y: Field{[10]uint32{0x0152b1e8, 0x015a9be1, 0x02da59db, 0x02935ecc, 0x0397093b, 0x003bd094, 0x03a35a77, 0x012010b4, 0x00ed9e66, 0x002d3996}}}, + {X: Field{[10]uint32{0x01ec8282, 0x027ca383, 0x01a288d7, 0x00b0292c, 0x03de3a60, 0x00c0bcd3, 0x00579693, 0x02405203, 0x01eb1efa, 0x002128b1}}, Y: Field{[10]uint32{0x02207cf1, 0x018acd91, 0x02023bdf, 0x00fd7c36, 0x00c70331, 0x0372b110, 0x03261dba, 0x03bb6161, 0x01c788cf, 0x001c0354}}}, + {X: Field{[10]uint32{0x0272f913, 0x00025ccd, 0x007fb8ba, 0x02b5df53, 0x00b93e2b, 0x031b52e1, 0x00e73406, 0x0245a2c5, 0x03cf0dbd, 0x0020f44b}}, Y: Field{[10]uint32{0x03279a7b, 0x02d44c79, 0x018ee523, 0x03f61848, 0x013c0dd6, 0x020b3a73, 0x03c78b36, 0x00cb3eeb, 0x0226bf25, 0x0039215b}}}, + {X: Field{[10]uint32{0x015451cf, 0x0001a3b7, 0x03701dfb, 0x008a7b52, 0x00ce64d5, 0x03d190fe, 0x03e73bf9, 0x00c8383e, 0x02f2bbd9, 0x00266229}}, Y: Field{[10]uint32{0x02882d5b, 0x02877462, 0x01910ed5, 0x0070aafa, 0x000d2f43, 0x024be269, 0x0244e4d8, 0x00994342, 0x02fcbd3b, 0x002eecd4}}}, + {X: Field{[10]uint32{0x03ff0724, 0x0202842b, 0x00b5160f, 0x0130aa9c, 0x0183017d, 0x028845ac, 0x0321d1e2, 0x00571ccd, 0x003dcfa6, 0x000fa486}}, Y: Field{[10]uint32{0x002dc945, 0x0202ce45, 0x03d7f226, 0x0029d395, 0x0276a2f3, 0x029cfcf4, 0x01fe5453, 0x02f98bc3, 0x0251f4bc, 0x0031e220}}}, + {X: Field{[10]uint32{0x0239492f, 0x018f5b20, 0x0044de77, 0x02617a96, 0x01e5f85b, 0x02cd89d7, 0x03130faf, 0x03f8e932, 0x0300fa1e, 0x003645d4}}, Y: Field{[10]uint32{0x03678b4b, 0x0199c0a6, 0x03521c55, 0x036217ba, 0x00fbad38, 0x00596aff, 0x0236220d, 0x00a83366, 0x0065e959, 0x001644e3}}}, + {X: Field{[10]uint32{0x02d933dc, 0x01044a4d, 0x01068b47, 0x02e1ea57, 0x03ed74c5, 0x01d9b99d, 0x017f7b47, 0x02fb9974, 0x025f7c12, 0x001bfd60}}, Y: Field{[10]uint32{0x038c0edf, 0x0200920d, 0x0038131f, 0x02a10334, 0x002ea9ac, 0x034ae360, 0x004be0a4, 0x025d2c8c, 0x01de0cb7, 0x001986ba}}}, + {X: Field{[10]uint32{0x00b1c31d, 0x03ac4594, 0x035ab15c, 0x01aeeba1, 0x03956036, 0x030093de, 0x027d580a, 0x004190c1, 0x02b1a876, 0x003b5b2f}}, Y: Field{[10]uint32{0x0217dede, 0x01f59aa1, 0x03f4519a, 0x01dbc675, 0x011269c4, 0x000ba040, 0x024d60f7, 0x02270595, 0x007ed1e8, 0x0024501a}}}, + {X: Field{[10]uint32{0x03d69164, 0x02f812a2, 0x03ca443a, 0x01b8e190, 0x000853bf, 0x02c4c88c, 0x016b56ee, 0x016a8c42, 0x00eb32d7, 0x0017e333}}, Y: Field{[10]uint32{0x0195da3a, 0x0396df9e, 0x02d456bd, 0x03c08734, 0x024f6576, 0x013d60d2, 0x02ac0fac, 0x0077352d, 0x023dd0c8, 0x000d7dca}}}, + {X: Field{[10]uint32{0x002d0b7b, 0x029b88e6, 0x02f7c479, 0x018bc056, 0x0186580d, 0x03b599d4, 0x02896c67, 0x00e5dd48, 0x00859bb2, 0x00207808}}, Y: Field{[10]uint32{0x03fbb669, 0x036f1933, 0x019601eb, 0x00e38abe, 0x02fce84a, 0x017558ac, 0x02ddc088, 0x03c9bed0, 0x029e4159, 0x0021e47e}}}, + {X: Field{[10]uint32{0x01d8f721, 0x0109c4a5, 0x005f141d, 0x03a1eb2a, 0x003eb435, 0x018eeb72, 0x03aba7ad, 0x01709a6d, 0x0316dd1e, 0x0037889a}}, Y: Field{[10]uint32{0x02c8423a, 0x01591c06, 0x0120d841, 0x01a90d37, 0x03342841, 0x038cf644, 0x007dc03d, 0x039cb0fe, 0x0399fa2c, 0x0018b878}}}, + {X: Field{[10]uint32{0x03d140f3, 0x0282f765, 0x012b1d13, 0x02549f2f, 0x00fa7629, 0x03dffc59, 0x0058be59, 0x00ca57f4, 0x03423fcd, 0x0018291b}}, Y: Field{[10]uint32{0x037f1219, 0x034dc3b7, 0x02c8e0f4, 0x015332ff, 0x01912cb8, 0x0280f2ad, 0x02bc31e1, 0x02785f91, 0x02de7b78, 0x00255c74}}}, + {X: Field{[10]uint32{0x032249c0, 0x0227f2f0, 0x027f5ce0, 0x0164fd0a, 0x0080d7e7, 0x028318d9, 0x013a77ab, 0x02f647ef, 0x005ce1b4, 0x001bfbd1}}, Y: Field{[10]uint32{0x00fa347d, 0x00b17a7d, 0x01a919a9, 0x0361f532, 0x03f82e73, 0x01605e5b, 0x020cae2e, 0x036e0e6b, 0x00fbaf46, 0x000457ef}}}, + {X: Field{[10]uint32{0x0293522f, 0x01713f90, 0x02a30914, 0x01705120, 0x03a9892b, 0x03b7af95, 0x025f7c26, 0x03e54e8f, 0x011ca8d2, 0x001b4dfd}}, Y: Field{[10]uint32{0x015309af, 0x019fbba7, 0x03dda0a9, 0x016ea212, 0x00cbefae, 0x00ee4382, 0x026897cd, 0x02b52c37, 0x01f36718, 0x001e3944}}}, + {X: Field{[10]uint32{0x03d46098, 0x02c0d440, 0x02ceaa76, 0x0157f9d2, 0x02738aa1, 0x0376fa65, 0x01cb035e, 0x01c07d72, 0x00275bd0, 0x000302b2}}, Y: Field{[10]uint32{0x00e3cd97, 0x020c807e, 0x026b7c3e, 0x00c5a996, 0x0031d762, 0x003389a9, 0x01684906, 0x029c21aa, 0x022a188f, 0x0039fcca}}}, + {X: Field{[10]uint32{0x00cde108, 0x00481814, 0x02b935d0, 0x02352c95, 0x01822a64, 0x017ebd29, 0x00507df8, 0x01408c7f, 0x03a86f89, 0x00240036}}, Y: Field{[10]uint32{0x014ef3fd, 0x0360f2d9, 0x00ff1779, 0x0008bd63, 0x00323319, 0x03d32c0f, 0x018383c2, 0x03a7a2ef, 0x003694b2, 0x0026deba}}}, + {X: Field{[10]uint32{0x029098a1, 0x02ba35a5, 0x01d9a28a, 0x029d18f8, 0x01ad58de, 0x01b0a8b8, 0x02092532, 0x02f23cd9, 0x03f4b490, 0x003c4426}}, Y: Field{[10]uint32{0x012f24c5, 0x00014257, 0x030224a8, 0x030b0c96, 0x006e3382, 0x032305fb, 0x02305141, 0x00b04200, 0x02279fd7, 0x0021d0c6}}}, + {X: Field{[10]uint32{0x028c0003, 0x0372155b, 0x018b00d1, 0x02353db8, 0x03929adc, 0x01b587e0, 0x00aac8b3, 0x031bc231, 0x01e54e9c, 0x00137a1c}}, Y: Field{[10]uint32{0x00d3bba6, 0x021fc1dc, 0x029c7f01, 0x01c3a68f, 0x00805f4b, 0x027785af, 0x01d7fce1, 0x03a29b1d, 0x03cfca98, 0x00009747}}}, + {X: Field{[10]uint32{0x02766ece, 0x0004f618, 0x01c80b66, 0x019ff633, 0x008f47b4, 0x01384004, 0x02e89ff9, 0x00aefce9, 0x02759297, 0x00288f2d}}, Y: Field{[10]uint32{0x03cf548c, 0x016bae51, 0x01dc7cae, 0x0337f5fa, 0x03cbca18, 0x01f48eab, 0x02811267, 0x0308f685, 0x0384ed05, 0x002371c2}}}, + {X: Field{[10]uint32{0x004244e5, 0x00385256, 0x0032bbb4, 0x00e296df, 0x0179d3c9, 0x039c0f31, 0x03a9dd3b, 0x023e2e46, 0x00cce96d, 0x0000a574}}, Y: Field{[10]uint32{0x0303c926, 0x00fdfb8a, 0x02c95265, 0x02304ace, 0x02745e07, 0x014e2b97, 0x030fe376, 0x0352fdab, 0x0206a16b, 0x0029b516}}}, + {X: Field{[10]uint32{0x02babbce, 0x0009517b, 0x008af9e1, 0x0337bf49, 0x016cb40b, 0x03ef45da, 0x00b13d51, 0x01da9b50, 0x03919d53, 0x001f1a0e}}, Y: Field{[10]uint32{0x01fd3f73, 0x02c6b6ab, 0x02e39332, 0x0169f08e, 0x02197d4e, 0x0367c558, 0x03ed30b8, 0x0215bd6d, 0x01d03608, 0x000f6832}}}, + {X: Field{[10]uint32{0x000c3189, 0x039fbe07, 0x001ecdf5, 0x027b2a7d, 0x038505f3, 0x0388bb08, 0x020e21ff, 0x00926a57, 0x012ed27e, 0x000c3dd4}}, Y: Field{[10]uint32{0x00875169, 0x010790b9, 0x00164fad, 0x01fd5ba2, 0x039e4e7f, 0x02d1cc65, 0x01286514, 0x00e8e856, 0x005e25ea, 0x000bd7f6}}}, + {X: Field{[10]uint32{0x03514961, 0x03d69d8b, 0x00835431, 0x00bed244, 0x031c7f84, 0x02358c52, 0x00a41c77, 0x013c9cc9, 0x038c9658, 0x0024ddef}}, Y: Field{[10]uint32{0x01f3df42, 0x03f5b4da, 0x00ad4335, 0x00b4ea27, 0x003cfa89, 0x03b60c34, 0x017fe92a, 0x036cab9f, 0x0055e2ed, 0x00356673}}}, + {X: Field{[10]uint32{0x0131e9be, 0x0307555b, 0x00ca240a, 0x01e1affd, 0x0328a66e, 0x03e0f153, 0x03530b85, 0x001256e8, 0x03e867f2, 0x000d627f}}, Y: Field{[10]uint32{0x01224c89, 0x02a49d1b, 0x0385b581, 0x019e3f74, 0x00d75b3a, 0x03c4cf71, 0x01c22a89, 0x02278482, 0x02aa9830, 0x0026208b}}}, + {X: Field{[10]uint32{0x023f8935, 0x036e2e3a, 0x03f85999, 0x01e84754, 0x012c79e7, 0x03f31905, 0x00e0f841, 0x03713396, 0x01f4b2da, 0x000e706c}}, Y: Field{[10]uint32{0x00256721, 0x026aa135, 0x0131e628, 0x010985b3, 0x0350bb8a, 0x03fe76a0, 0x036991de, 0x00ce2590, 0x031ad9df, 0x0039e149}}}, + {X: Field{[10]uint32{0x0325be33, 0x03bb7b62, 0x0372cad5, 0x0368914e, 0x00b103f9, 0x02d84639, 0x00799188, 0x00b0b666, 0x0059d3d6, 0x00373c45}}, Y: Field{[10]uint32{0x03a1c074, 0x00f31cbc, 0x017b330a, 0x0323eb9f, 0x02a190f6, 0x031f7771, 0x01a92fe7, 0x01c398d1, 0x001aaf32, 0x003700e3}}}, + {X: Field{[10]uint32{0x02623d1d, 0x018d6cc1, 0x038f0eed, 0x0179bac8, 0x00a32ff0, 0x02f60143, 0x00d82e55, 0x02c304fd, 0x01dd1de9, 0x0018524a}}, Y: Field{[10]uint32{0x00d8a24b, 0x02a9d7b1, 0x02a6ae0e, 0x010c6b2f, 0x02afafdc, 0x020603fd, 0x0118e3be, 0x03c5ee86, 0x0117c9e7, 0x0002bfa1}}}, + {X: Field{[10]uint32{0x00ce743c, 0x006c2ea7, 0x00296a7c, 0x027ed66a, 0x03ef8160, 0x03b22b6f, 0x005da355, 0x036a5029, 0x0228cff6, 0x003d29c8}}, Y: Field{[10]uint32{0x019cdacb, 0x02a069b8, 0x01e50a25, 0x0094f328, 0x032fbcd0, 0x015a71af, 0x01e90f10, 0x016ab827, 0x00fbde09, 0x00151480}}}, + {X: Field{[10]uint32{0x022c93f7, 0x03f94903, 0x01a650b5, 0x0133f23f, 0x0357aa16, 0x00dc6e50, 0x0262fbf5, 0x01565d1b, 0x02736caa, 0x0018f310}}, Y: Field{[10]uint32{0x02ce5665, 0x011f1142, 0x004fe09b, 0x0139143c, 0x01e7d822, 0x012c20a2, 0x02d2bd30, 0x0104eb5a, 0x035bc5a6, 0x0007e93b}}}, + {X: Field{[10]uint32{0x02ab8889, 0x012f8ae3, 0x002016b8, 0x022659e3, 0x00aa7f9d, 0x00d172c1, 0x02cf761f, 0x00e29834, 0x02281184, 0x002b05d4}}, Y: Field{[10]uint32{0x024af2b1, 0x016a60aa, 0x03396343, 0x02266684, 0x00832f29, 0x03ddd97c, 0x02b01b68, 0x00f6b09e, 0x00ae2964, 0x00375f7e}}}, + {X: Field{[10]uint32{0x024a0e48, 0x01e205a7, 0x02c03dd6, 0x008bcde1, 0x03823e86, 0x00bbead6, 0x00a5a2f7, 0x0106d831, 0x02b9637c, 0x00276ed7}}, Y: Field{[10]uint32{0x03d924d7, 0x00e353ad, 0x025cd1ba, 0x001e2718, 0x0205aa01, 0x021466a8, 0x01cde34b, 0x03587d0b, 0x02ba13f4, 0x0001dcb5}}}, + {X: Field{[10]uint32{0x02f7dddc, 0x015cc70f, 0x02fb173d, 0x0266e30c, 0x004e88f5, 0x01683622, 0x015b5866, 0x0304d440, 0x01ddd2fc, 0x001c5c25}}, Y: Field{[10]uint32{0x024fa5af, 0x03f7ed1f, 0x0020e581, 0x01b74638, 0x03472732, 0x031ed902, 0x023da3f3, 0x01c2f3ec, 0x010952b4, 0x0007783c}}}, + {X: Field{[10]uint32{0x025872ca, 0x026a5909, 0x03b2a331, 0x01a0b336, 0x01a32c4a, 0x00535ba7, 0x01e3964c, 0x02c7a900, 0x00d3f829, 0x0016b08c}}, Y: Field{[10]uint32{0x01c026ea, 0x0373ebb2, 0x02e8151b, 0x0360c85e, 0x03423484, 0x00c67290, 0x0206a16e, 0x03d9af17, 0x03a627db, 0x003eb0f0}}}, + {X: Field{[10]uint32{0x038752ef, 0x01f3dd87, 0x00100857, 0x02854446, 0x01382496, 0x00b9d387, 0x0057537b, 0x03d05785, 0x02af0a39, 0x00349fb2}}, Y: Field{[10]uint32{0x01c6c037, 0x037e92dc, 0x03ae35dc, 0x0213eb38, 0x00d5938e, 0x010486da, 0x03d8eb60, 0x02bcc438, 0x036746cb, 0x003f1202}}}, + {X: Field{[10]uint32{0x02ac6cda, 0x007882fc, 0x00d6477f, 0x0064e822, 0x01703af6, 0x03eb6a31, 0x0387d539, 0x0266df13, 0x03ddf92d, 0x003821dd}}, Y: Field{[10]uint32{0x01ccfee9, 0x0169404a, 0x00070db0, 0x039fb6f7, 0x001202c4, 0x03384357, 0x016ecc53, 0x0062c93a, 0x008ac6cb, 0x0009693e}}}, + {X: Field{[10]uint32{0x019ba6ed, 0x0284601a, 0x00776753, 0x039a2015, 0x0363bbe3, 0x0225aae5, 0x02a6a138, 0x01603ef6, 0x02b7afe9, 0x00116b9e}}, Y: Field{[10]uint32{0x0156f322, 0x01b9aa28, 0x00ff16c4, 0x01f83fbf, 0x02502f79, 0x0365bd0f, 0x00d440e3, 0x0381b934, 0x03ed127f, 0x003706bd}}}, + {X: Field{[10]uint32{0x00d00590, 0x0387793d, 0x00045327, 0x00516007, 0x026ae265, 0x01a2d30b, 0x00f509a7, 0x00114ecf, 0x033b71c5, 0x003f4a32}}, Y: Field{[10]uint32{0x00e5a7b6, 0x01994617, 0x02159c26, 0x00ac95fd, 0x013298a2, 0x005d3388, 0x01081f08, 0x033d12a9, 0x03954867, 0x002c1a13}}}, + {X: Field{[10]uint32{0x001d850d, 0x02cc9807, 0x01d7a158, 0x0181d9c7, 0x03956816, 0x00ee7ee9, 0x015e4e22, 0x0127c286, 0x000dac6f, 0x003c89bc}}, Y: Field{[10]uint32{0x0109ef86, 0x01c6d968, 0x0150f10f, 0x0228da45, 0x01d823a0, 0x00661bfa, 0x0230e53a, 0x028e2ad1, 0x004f6925, 0x00341757}}}, + {X: Field{[10]uint32{0x020337a3, 0x0113a41d, 0x0340ff0e, 0x03b23271, 0x00a994e1, 0x02cc0e3e, 0x00e23a72, 0x0212021f, 0x0213a80d, 0x000f3185}}, Y: Field{[10]uint32{0x013c3956, 0x036ef6b3, 0x033f5a11, 0x00794a85, 0x0090377f, 0x0256ac04, 0x0221f09f, 0x00ebda50, 0x016a2409, 0x00211d3e}}}, + {X: Field{[10]uint32{0x0260e736, 0x036b3833, 0x02223e5c, 0x03572579, 0x02633e7e, 0x03d5f5a1, 0x03be2331, 0x025c4af4, 0x01898cd9, 0x001c87b3}}, Y: Field{[10]uint32{0x00ffd69f, 0x02b064a8, 0x028ad532, 0x0284bdd9, 0x0221dc34, 0x03b18cf1, 0x009450bf, 0x01f2b928, 0x00d86fc0, 0x000c74a5}}}, + {X: Field{[10]uint32{0x032eff38, 0x03f3fe8a, 0x03aa2db0, 0x00b03fea, 0x00d5b106, 0x03963ea3, 0x01862715, 0x0366c6c9, 0x02581144, 0x00372eb2}}, Y: Field{[10]uint32{0x01ec7d34, 0x00ec95c8, 0x00689e6d, 0x03986bce, 0x00708b53, 0x038b185d, 0x02fbdca5, 0x01b3fe43, 0x021d339f, 0x00273dd8}}}, + {X: Field{[10]uint32{0x01db8b92, 0x007ccdc5, 0x03878342, 0x02654a39, 0x02b9300b, 0x031e895b, 0x00919382, 0x03b0af39, 0x0293e649, 0x003b4c53}}, Y: Field{[10]uint32{0x00744a11, 0x01f772d8, 0x0318bc83, 0x01238f7e, 0x0153ea03, 0x007c5519, 0x0122355e, 0x03fbcb8a, 0x02af0229, 0x001c2a06}}}, + {X: Field{[10]uint32{0x01c036ee, 0x00dae30a, 0x01c09854, 0x02d8010a, 0x005f5c7e, 0x017d96ba, 0x02977689, 0x02f23466, 0x03cc7a59, 0x001af466}}, Y: Field{[10]uint32{0x00999090, 0x0109cd41, 0x0332c0bc, 0x039de2d5, 0x0131803c, 0x010d5171, 0x03ea28f8, 0x015a06f6, 0x01e3f4f6, 0x00144d1b}}}, + {X: Field{[10]uint32{0x003d9acf, 0x01f1ac75, 0x03e15577, 0x0101eb62, 0x03ebe9d6, 0x02f8222f, 0x00228bb5, 0x037ecd81, 0x02156ac8, 0x00267b47}}, Y: Field{[10]uint32{0x01d2c922, 0x024430c2, 0x03c61e19, 0x02683d11, 0x0169f57e, 0x01c90dab, 0x02a0ac04, 0x01332a03, 0x01a4478b, 0x001d6c56}}}, + {X: Field{[10]uint32{0x02452045, 0x03821dec, 0x0171cc7f, 0x030e30d8, 0x000f00c3, 0x000c0e5c, 0x02dd90fb, 0x0377c212, 0x038c793a, 0x000f859b}}, Y: Field{[10]uint32{0x015bbd59, 0x0086aa07, 0x038da019, 0x0209ee52, 0x019f07e3, 0x0269b31b, 0x0330f6fb, 0x00a997b0, 0x0263b0cd, 0x00245966}}}, + {X: Field{[10]uint32{0x036df936, 0x01567345, 0x03656cf8, 0x00c82107, 0x01a1b1a4, 0x01027427, 0x00d1b168, 0x017ce2fe, 0x02d9a3a9, 0x003f06ea}}, Y: Field{[10]uint32{0x008af43d, 0x0158fc68, 0x0263884a, 0x024486db, 0x02e0b4d7, 0x020ad6d3, 0x005f2489, 0x02e27541, 0x03bdb013, 0x000c7de9}}}, + {X: Field{[10]uint32{0x037ff340, 0x02a0673f, 0x0125a5a5, 0x010d3a72, 0x003bd318, 0x00ce1a21, 0x003c8795, 0x007b2b24, 0x013d4b37, 0x00202ceb}}, Y: Field{[10]uint32{0x012af178, 0x039336dc, 0x02bfdf20, 0x00a1cd1e, 0x010108ae, 0x0197eb1a, 0x03ed7d3b, 0x01b61319, 0x00bdaac9, 0x003ec72a}}}, + {X: Field{[10]uint32{0x00616af2, 0x0330b91a, 0x03422073, 0x012535c9, 0x0002a87d, 0x023bdeab, 0x02c6c364, 0x03dc9f5d, 0x01ab2901, 0x002eb419}}, Y: Field{[10]uint32{0x030a37ed, 0x00ca71d1, 0x01d92236, 0x00d04fc5, 0x02fa925a, 0x02ae8a5c, 0x01d69a2e, 0x03bab536, 0x010216b5, 0x002ba75e}}}, + {X: Field{[10]uint32{0x029b8fe7, 0x010d7e44, 0x03ca9bce, 0x023dfa06, 0x01a2fb75, 0x0321e079, 0x01beb99c, 0x00329a65, 0x02d90d70, 0x00347c11}}, Y: Field{[10]uint32{0x0111a4df, 0x00d16818, 0x01017fca, 0x0029195d, 0x033090fc, 0x0110cc50, 0x03167188, 0x0056bcd1, 0x025d7eb8, 0x0009d3b7}}}, + {X: Field{[10]uint32{0x03f0a22f, 0x02811e8c, 0x03ea1751, 0x01851ce9, 0x0299df17, 0x00a6a83d, 0x01ea798d, 0x02a02963, 0x0355e3dc, 0x0036d4d7}}, Y: Field{[10]uint32{0x0353ff6b, 0x014a2b56, 0x037cced3, 0x03591de8, 0x00e61b86, 0x039ea3c4, 0x013df837, 0x00ef2846, 0x015d931a, 0x0039f600}}}, + {X: Field{[10]uint32{0x00a42a80, 0x039a4703, 0x01d5082a, 0x03945933, 0x008635b7, 0x02693c61, 0x00b1a5db, 0x03c3ebe6, 0x0206a56e, 0x0036876e}}, Y: Field{[10]uint32{0x0210c9ff, 0x0238c4a8, 0x01508d92, 0x0196c85e, 0x008807e2, 0x0172d058, 0x00066210, 0x00c6f2ba, 0x003ca695, 0x0021aa0e}}}, + {X: Field{[10]uint32{0x01aa42e7, 0x03b0a282, 0x008aeff5, 0x01de6cd6, 0x033b176b, 0x01ed509d, 0x014f29ff, 0x0019b1f7, 0x02b4d980, 0x00099f09}}, Y: Field{[10]uint32{0x0027161d, 0x03c82d42, 0x0034142f, 0x0231fe8c, 0x01d58465, 0x0364f6aa, 0x02300531, 0x03ac9574, 0x003ff4e5, 0x000ce430}}}, + {X: Field{[10]uint32{0x01cbea0a, 0x0120fff0, 0x0027d4f3, 0x00a7fb97, 0x025561fd, 0x0021246a, 0x00c79152, 0x03e5541c, 0x03524e6f, 0x0020092b}}, Y: Field{[10]uint32{0x02dd86b0, 0x0075f2ec, 0x00a16dff, 0x01c5cd17, 0x03df7a8a, 0x00279dbf, 0x0078fc06, 0x01c9ac20, 0x00d0498f, 0x0032779e}}}, + {X: Field{[10]uint32{0x0208f661, 0x014d1158, 0x002d2779, 0x025501a2, 0x00dc3dc1, 0x01c73c00, 0x030d7dd3, 0x02d0801f, 0x0268c7be, 0x00047fda}}, Y: Field{[10]uint32{0x03b4092c, 0x0306f029, 0x03dbd658, 0x02ea5e9f, 0x03916b75, 0x007df8ee, 0x03cac25c, 0x0206d479, 0x00252547, 0x002d4f77}}}, + {X: Field{[10]uint32{0x02e3c929, 0x02309fcd, 0x011f6aa8, 0x025ac01d, 0x02b70d65, 0x016a660a, 0x0232d7a6, 0x02080ce6, 0x0083f9a6, 0x00158a84}}, Y: Field{[10]uint32{0x01e05b51, 0x0112b2ec, 0x03364557, 0x01854248, 0x0166ec20, 0x0042b5d0, 0x00e7d255, 0x02022e54, 0x007f0908, 0x0028e03b}}}, + {X: Field{[10]uint32{0x0341c413, 0x0020b8b4, 0x037af68d, 0x029533c1, 0x030e097f, 0x03bd915c, 0x02a75987, 0x0035a4ed, 0x00fd327c, 0x0013bf9c}}, Y: Field{[10]uint32{0x00ce3dc7, 0x02afbcb2, 0x0098a4a1, 0x0118233b, 0x00b110a3, 0x03b476c4, 0x028befc3, 0x02d8b766, 0x039b92e0, 0x0004351e}}}, + {X: Field{[10]uint32{0x03a51f20, 0x03027008, 0x0034ff9a, 0x0260b34c, 0x03354abd, 0x00780709, 0x028576c9, 0x00a2c2f7, 0x030cd7f1, 0x0013592f}}, Y: Field{[10]uint32{0x00a5e28f, 0x030cb97a, 0x00d6eb9d, 0x013cf532, 0x03da3c52, 0x0136f0b9, 0x03bf38e1, 0x037feb79, 0x001af57f, 0x0005679d}}}, + {X: Field{[10]uint32{0x00a187bf, 0x03cc2cc0, 0x0243bc48, 0x02b0dcab, 0x03466de2, 0x03bb3be8, 0x02f0064c, 0x01e35acf, 0x034aff32, 0x00269058}}, Y: Field{[10]uint32{0x02aeae2a, 0x01faa801, 0x03c3cad2, 0x00c3d014, 0x02f409e5, 0x01591262, 0x007a1936, 0x01df3e11, 0x020faebb, 0x0003bbfb}}}, + {X: Field{[10]uint32{0x0102418b, 0x0137b4a4, 0x014cf4fc, 0x03f39e09, 0x002c85cf, 0x039719dd, 0x02fec2d2, 0x03782023, 0x00fb9a6b, 0x00038601}}, Y: Field{[10]uint32{0x02fcdda7, 0x01aacd1f, 0x01e7bfa5, 0x030c60f3, 0x02447e93, 0x00e9996b, 0x03e81c9b, 0x0192e70b, 0x01eb9c16, 0x003a72ac}}}, + {X: Field{[10]uint32{0x00593212, 0x018bc6d9, 0x03b411eb, 0x03c097e7, 0x00717611, 0x03fd134b, 0x021705ad, 0x01ec2be0, 0x0344c024, 0x0002980d}}, Y: Field{[10]uint32{0x02603b61, 0x0066ee32, 0x01d9ce5c, 0x0056a5ae, 0x026dcdb0, 0x021c4ee6, 0x035c0a2f, 0x01d8e10c, 0x032b706a, 0x002083f4}}}, + {X: Field{[10]uint32{0x015f20b0, 0x01882812, 0x036cb66a, 0x02ceab89, 0x01a1108a, 0x03258193, 0x0172a2fe, 0x004a60d2, 0x01b6895b, 0x0029bc76}}, Y: Field{[10]uint32{0x01c8273c, 0x027550db, 0x0288029c, 0x03be0e81, 0x037f55d7, 0x0219e70f, 0x03f5ea81, 0x020e518f, 0x00d0df03, 0x0026a577}}}, + {X: Field{[10]uint32{0x01ac5c48, 0x02bc49b3, 0x0041893b, 0x03cef5d3, 0x02f09f30, 0x01b88850, 0x00f920ab, 0x00ad8f80, 0x00320782, 0x0012b145}}, Y: Field{[10]uint32{0x00f43885, 0x012f0c68, 0x02a6ad7e, 0x031dc83d, 0x027ff037, 0x025156ef, 0x03da161f, 0x01291917, 0x014877e9, 0x002afd74}}}, + {X: Field{[10]uint32{0x03fb7a9b, 0x02efdebd, 0x004752da, 0x00dccd81, 0x0248af6e, 0x02cce508, 0x02c588e1, 0x03ab9633, 0x015ba16e, 0x00168b3d}}, Y: Field{[10]uint32{0x029322e2, 0x00001039, 0x01c4fe0c, 0x007dc58f, 0x01a45f8c, 0x03795688, 0x005aeca5, 0x01cb353f, 0x022d32ff, 0x0023c9ef}}}, + {X: Field{[10]uint32{0x03011c99, 0x00acf636, 0x0388f023, 0x00f8c32c, 0x02a87605, 0x01bff13a, 0x0012b27f, 0x0307d810, 0x03e8ef48, 0x00385bc8}}, Y: Field{[10]uint32{0x00c56000, 0x030e43ee, 0x017990e8, 0x03a84d0a, 0x0247ffe3, 0x02f69853, 0x015bb977, 0x0297036a, 0x0152b0af, 0x000657ff}}}, + {X: Field{[10]uint32{0x0124fb84, 0x02f458e1, 0x0145ac1b, 0x00ebfe5a, 0x0228923a, 0x03761ba4, 0x01e4263c, 0x027dc543, 0x00d7ac10, 0x00194d9f}}, Y: Field{[10]uint32{0x0347d731, 0x020d2945, 0x006b68a7, 0x02541a02, 0x00a7687c, 0x03ad3fa3, 0x009b170b, 0x01f75934, 0x01bafbe6, 0x00033c2e}}}, + {X: Field{[10]uint32{0x03d6eac2, 0x03bcd99a, 0x00d54a5c, 0x02723a55, 0x0389da48, 0x01b75991, 0x004228bd, 0x00ee35e9, 0x000b3944, 0x00042a21}}, Y: Field{[10]uint32{0x0261eff2, 0x01f80d31, 0x00a60798, 0x01571384, 0x03d8cc40, 0x03dfeb44, 0x01163ace, 0x01637861, 0x036ee4aa, 0x001ffdbd}}}, + {X: Field{[10]uint32{0x0245d6a0, 0x02c4c9d4, 0x000e1528, 0x03aa46ba, 0x027b1db5, 0x0315dfc5, 0x039d0380, 0x020809ae, 0x00a6c01b, 0x000ffbfa}}, Y: Field{[10]uint32{0x03637b5e, 0x01630e8e, 0x02350ecd, 0x01e9f27f, 0x03a95975, 0x0275a3bf, 0x00a0b543, 0x00512915, 0x01a937e6, 0x002a5b7d}}}, + {X: Field{[10]uint32{0x00052b61, 0x02b68871, 0x00c626c3, 0x03575861, 0x0058595f, 0x01759534, 0x03fb908f, 0x018ba5af, 0x037c0e41, 0x003be4f5}}, Y: Field{[10]uint32{0x03cd0bf5, 0x03efd03c, 0x0066b953, 0x007db35d, 0x01e53526, 0x011745a7, 0x01a23a86, 0x025f1fd6, 0x0385c18d, 0x00100222}}}, + {X: Field{[10]uint32{0x00ca4872, 0x01ef60ac, 0x01d40d62, 0x0335466f, 0x009224a2, 0x025c6df1, 0x01edbd84, 0x0240f521, 0x035eb0fa, 0x003c5e27}}, Y: Field{[10]uint32{0x031a9da8, 0x000587e9, 0x028d0583, 0x0016b6aa, 0x019e36a9, 0x01ec7d28, 0x03570f47, 0x0115fa8b, 0x00b65456, 0x00132117}}}, + {X: Field{[10]uint32{0x009b3274, 0x03313533, 0x004bfff3, 0x02422a1c, 0x00641938, 0x0353907c, 0x000d15ba, 0x017b4083, 0x0388ebc7, 0x00342ec5}}, Y: Field{[10]uint32{0x022a7641, 0x02aeffc8, 0x022fd8f7, 0x0091137d, 0x0143ac55, 0x00199992, 0x02877963, 0x009fd239, 0x00a895a3, 0x000e8483}}}, + {X: Field{[10]uint32{0x00e8963a, 0x0337df37, 0x0005a3fa, 0x0186bae6, 0x022f05e4, 0x00844350, 0x02aab317, 0x01eb9935, 0x010cf780, 0x000592b0}}, Y: Field{[10]uint32{0x02549b69, 0x037166fa, 0x032093f9, 0x0098c07c, 0x009b6dca, 0x0127e63f, 0x01d6f858, 0x037642ec, 0x03d440f1, 0x002373d0}}}, + {X: Field{[10]uint32{0x001fbe5f, 0x01b1e0a5, 0x02e40987, 0x00a5ce68, 0x00cd3aca, 0x00a527c3, 0x017dcf89, 0x0038eae1, 0x0165a8e4, 0x003c48b6}}, Y: Field{[10]uint32{0x02447371, 0x03409a36, 0x02257f50, 0x01cb4863, 0x00715043, 0x02d9c2fb, 0x02192d0b, 0x02260de2, 0x039dd9e6, 0x00136652}}}, + {X: Field{[10]uint32{0x008870a8, 0x0050e939, 0x03829662, 0x008605b9, 0x01b975fc, 0x015e07c2, 0x02e2cdbf, 0x02a4a86b, 0x014775e5, 0x002b25c5}}, Y: Field{[10]uint32{0x03c9aa71, 0x010f1c50, 0x03edef89, 0x0373e2ef, 0x0253fff7, 0x01e3725e, 0x03679452, 0x005d0a59, 0x0203795b, 0x000927ed}}}, + {X: Field{[10]uint32{0x01330906, 0x0312174b, 0x03fbdd48, 0x01b8512c, 0x02fb0add, 0x03a721c3, 0x013da811, 0x03f73243, 0x011edfd5, 0x002567b2}}, Y: Field{[10]uint32{0x0257ebdc, 0x02428898, 0x024b9aed, 0x01d4a91c, 0x0229f489, 0x014d617f, 0x01b5ebc6, 0x031d86d8, 0x0128b707, 0x000797b0}}}, + {X: Field{[10]uint32{0x02982859, 0x02ea4f87, 0x028b7c59, 0x02348ed7, 0x003c6abd, 0x01b7827c, 0x03b2d157, 0x0208c915, 0x01d8ed7d, 0x001641e5}}, Y: Field{[10]uint32{0x00576708, 0x014a4b4d, 0x003c0683, 0x008ea760, 0x01a09cb1, 0x011ead0b, 0x0216490a, 0x02210583, 0x02861a3c, 0x0017b74a}}}, + {X: Field{[10]uint32{0x03e0ba9e, 0x005373a8, 0x02555897, 0x02d6fc6e, 0x0348fdb4, 0x032b4541, 0x02178535, 0x00916fb6, 0x03987439, 0x00314dca}}, Y: Field{[10]uint32{0x00bca987, 0x02266c58, 0x035a022e, 0x010e2d92, 0x00767afc, 0x01ada713, 0x01536a54, 0x036e300d, 0x03617159, 0x003e0b42}}}, + {X: Field{[10]uint32{0x035bd38a, 0x013e5b38, 0x01ee1653, 0x00a1f72f, 0x00101611, 0x00c3c9b1, 0x00d20166, 0x032f4fb2, 0x01fcae39, 0x003cf656}}, Y: Field{[10]uint32{0x009b3562, 0x00f3c5eb, 0x016ce160, 0x000fb42b, 0x03da586a, 0x03918051, 0x03e2f97f, 0x009e0cbf, 0x001f8760, 0x00387957}}}, + {X: Field{[10]uint32{0x037fad9e, 0x033b0b94, 0x02cf8dd5, 0x010fe2a4, 0x0103a280, 0x0226c193, 0x023d9604, 0x038de0af, 0x036ebe3c, 0x00248af1}}, Y: Field{[10]uint32{0x01122109, 0x0302657d, 0x02b54352, 0x016f440c, 0x00116fbf, 0x006a5486, 0x00b9ea75, 0x03bf688c, 0x03572508, 0x002cc667}}}, + {X: Field{[10]uint32{0x01f0360d, 0x00e1cd36, 0x00a1299a, 0x02236ebf, 0x022c461d, 0x001c2b32, 0x02b1df08, 0x00b255e6, 0x01407a6d, 0x001171f7}}, Y: Field{[10]uint32{0x03e85ac4, 0x01349799, 0x00e73264, 0x029a983a, 0x02d076eb, 0x03765bd2, 0x03c4e044, 0x01a7b5b0, 0x015b5f24, 0x000e85e1}}}, + {X: Field{[10]uint32{0x0159bacb, 0x038b49ae, 0x00d5b33e, 0x02787c24, 0x00f1af5c, 0x01104705, 0x0189a5b7, 0x02c028f7, 0x0198dfd4, 0x001908b6}}, Y: Field{[10]uint32{0x037a3bb7, 0x03df6240, 0x03a09cdb, 0x01f1c0ee, 0x03376f59, 0x01dbd6cf, 0x018cea22, 0x0062864f, 0x03344912, 0x00388d63}}}, + {X: Field{[10]uint32{0x00b0535c, 0x03320b31, 0x01a6f535, 0x033c14d9, 0x0295b1a3, 0x00afdb07, 0x00640f19, 0x01b45469, 0x02143319, 0x00238120}}, Y: Field{[10]uint32{0x017c34ce, 0x023bd43a, 0x00e65b63, 0x02562ea5, 0x00200121, 0x017d56a8, 0x0282ee53, 0x00b1567c, 0x033a1f65, 0x0035b4b5}}}, + {X: Field{[10]uint32{0x024a79bb, 0x001c27f9, 0x002c4a1c, 0x003c0575, 0x02b8a708, 0x0049184f, 0x025a9e17, 0x00bc3e28, 0x01a8b5eb, 0x00168acf}}, Y: Field{[10]uint32{0x0386e6b7, 0x01fc622f, 0x00cd4422, 0x0209ae09, 0x01a6435a, 0x03be7629, 0x0095f8e6, 0x02abf9b7, 0x011deb54, 0x00181f1e}}}, + {X: Field{[10]uint32{0x02cd7ccf, 0x034b573d, 0x0213e1a0, 0x0000f377, 0x01c5296e, 0x0082afd2, 0x00f3d912, 0x005299d4, 0x03a35cf6, 0x00050d61}}, Y: Field{[10]uint32{0x02a653d7, 0x00bcb7e1, 0x0201b662, 0x01f0ba0c, 0x0315f14c, 0x011b0d02, 0x021af490, 0x03162d26, 0x01fade6c, 0x00126f21}}}, + {X: Field{[10]uint32{0x00a93193, 0x006f8677, 0x031a3ac8, 0x01f3fc97, 0x01ba357b, 0x03276141, 0x032c4bc8, 0x031d330e, 0x00428737, 0x003c0203}}, Y: Field{[10]uint32{0x023951f1, 0x00970e52, 0x00f0b5cf, 0x0364b289, 0x001c6a5a, 0x01c09f47, 0x03cfe320, 0x019d29f5, 0x019f57bf, 0x002f7404}}}, + {X: Field{[10]uint32{0x01130034, 0x01235417, 0x009cef77, 0x02bab01d, 0x023e162d, 0x0175f109, 0x00b26b68, 0x03fbd0db, 0x0373e547, 0x0021deb8}}, Y: Field{[10]uint32{0x00dfcf5f, 0x03db7c35, 0x00a8e6f9, 0x0054cb97, 0x03e1275e, 0x03c9a328, 0x0156b798, 0x00d06bb6, 0x0095b750, 0x0007c2bd}}}, + {X: Field{[10]uint32{0x00e619d4, 0x03caae7a, 0x02ca0d1d, 0x00182dce, 0x03e55f07, 0x01a689cb, 0x016a0714, 0x03286232, 0x036f0635, 0x00290637}}, Y: Field{[10]uint32{0x02f754e3, 0x03ff3580, 0x00856525, 0x0061a52e, 0x002e7558, 0x0296d646, 0x0099a6da, 0x009383f9, 0x01bb5bbb, 0x000ac1b3}}}, + {X: Field{[10]uint32{0x02aedeab, 0x001d8de8, 0x029671d9, 0x00253ad4, 0x00114dc2, 0x0131ec2d, 0x02dce4f4, 0x02eb4897, 0x0174bb6f, 0x0013084f}}, Y: Field{[10]uint32{0x03970b51, 0x0037dce7, 0x01be0e48, 0x03ec81b1, 0x01402fb5, 0x022bea73, 0x012c7d54, 0x0170561d, 0x039fccc6, 0x001d06fb}}}, + {X: Field{[10]uint32{0x00deb13a, 0x02dc1588, 0x01bff0ec, 0x030eed33, 0x032cf93b, 0x02240046, 0x014073a4, 0x03946c6a, 0x02fd3f94, 0x0028de41}}, Y: Field{[10]uint32{0x00e6030a, 0x028b59cc, 0x02332f01, 0x0376252a, 0x008a8a16, 0x00cc52dc, 0x00d5e552, 0x026c7461, 0x00b1c14a, 0x001828ec}}}, + {X: Field{[10]uint32{0x01e72301, 0x013b1353, 0x0225c5e8, 0x02396e14, 0x02d6d652, 0x01aed194, 0x038ae3d2, 0x02bd4592, 0x02ed639e, 0x000b19df}}, Y: Field{[10]uint32{0x03ee832a, 0x006e7fc1, 0x0278eaca, 0x00c4ecb4, 0x005fe639, 0x02b01f09, 0x0389240c, 0x01f2e85f, 0x0006d3bb, 0x0037c393}}}, + {X: Field{[10]uint32{0x017e77b4, 0x0077d2df, 0x009395d6, 0x02c33eb2, 0x01684473, 0x02c07000, 0x035fc3c5, 0x01af940c, 0x0014eaf8, 0x002d547e}}, Y: Field{[10]uint32{0x0246664b, 0x026738c1, 0x00bb1bd3, 0x03984693, 0x038818b6, 0x012b879f, 0x033f923b, 0x0057e0c0, 0x03354697, 0x002a5e72}}}, + {X: Field{[10]uint32{0x01f45c39, 0x020851b7, 0x01984fba, 0x02a1d050, 0x012cd47b, 0x0037c31c, 0x0361ad74, 0x0013abc7, 0x03185c8c, 0x00263571}}, Y: Field{[10]uint32{0x00050804, 0x034ae928, 0x01bc5b36, 0x00b10a3d, 0x019d4a8e, 0x007b3aa2, 0x02f88f5f, 0x01fb083a, 0x01915c73, 0x002b2949}}}, + {X: Field{[10]uint32{0x00cefc7c, 0x008f8ae5, 0x03bc9a0b, 0x021bbe3e, 0x02ed1e13, 0x03ef3318, 0x00104854, 0x02d949a3, 0x02f7260f, 0x00145238}}, Y: Field{[10]uint32{0x03ca2500, 0x01c914a9, 0x016e1296, 0x00581f2a, 0x039e9b27, 0x0068236e, 0x024a8ccb, 0x0292616e, 0x012d35de, 0x00196d37}}}, + {X: Field{[10]uint32{0x020e753c, 0x03a44c63, 0x031daf91, 0x01f260b7, 0x00a08a22, 0x02fad145, 0x0240cccb, 0x019042e2, 0x01c18c9d, 0x0004b1a6}}, Y: Field{[10]uint32{0x032fcc99, 0x0008b624, 0x028e120b, 0x01a013b4, 0x004889e9, 0x00145ba2, 0x029a1975, 0x015c90d1, 0x004289b5, 0x001f654f}}}, + {X: Field{[10]uint32{0x020a8d20, 0x01a75204, 0x02c639dc, 0x01e540e6, 0x02134e44, 0x03aec8c4, 0x02ecac37, 0x010046cd, 0x03f8a773, 0x0013434f}}, Y: Field{[10]uint32{0x0144ec64, 0x025816c0, 0x02a57397, 0x00a7c2c3, 0x03960b3d, 0x025fc85c, 0x00f10261, 0x013180f1, 0x03a0e098, 0x003b7fc5}}}, + {X: Field{[10]uint32{0x0136e42d, 0x00941855, 0x03be4481, 0x036606a7, 0x03ccb069, 0x019a0cdb, 0x01b0985a, 0x01e9c6a4, 0x030b3e7b, 0x0033a42d}}, Y: Field{[10]uint32{0x01569000, 0x00e91e01, 0x01e672e6, 0x039915fc, 0x00d3af73, 0x021d581b, 0x00640ca2, 0x03ab5d49, 0x015612e0, 0x002337a7}}}, + {X: Field{[10]uint32{0x0163b2d8, 0x03124c41, 0x0297e360, 0x02c720ef, 0x00d197f5, 0x034bea42, 0x03bf9851, 0x021e7667, 0x03276bb1, 0x000a31e4}}, Y: Field{[10]uint32{0x00643868, 0x02125b3b, 0x010857c1, 0x00f8cf64, 0x03bc0f3e, 0x03873ef8, 0x02b10f6a, 0x02d5196d, 0x0240e2f3, 0x00322513}}}, + {X: Field{[10]uint32{0x03442443, 0x03fa94f9, 0x006659a1, 0x02021f4c, 0x03864d4c, 0x016dc1fc, 0x00c2b6b5, 0x033c0601, 0x01062413, 0x001b8b6b}}, Y: Field{[10]uint32{0x029430e0, 0x000d77c4, 0x01f7dc4c, 0x00a10d10, 0x02497bc0, 0x02703f8d, 0x021fba73, 0x01a450c2, 0x0064e05d, 0x0027699f}}}, + {X: Field{[10]uint32{0x004d20fe, 0x016dc923, 0x0254f871, 0x022248fb, 0x0119f261, 0x037d0dfe, 0x034d03df, 0x00e51b10, 0x02c80376, 0x002fbe52}}, Y: Field{[10]uint32{0x031e25db, 0x033b5500, 0x038aaee7, 0x01cf39f8, 0x02386484, 0x02578501, 0x0383032e, 0x007719be, 0x0134e5fc, 0x00348c91}}}, + {X: Field{[10]uint32{0x018e433d, 0x033b6be0, 0x01125918, 0x0190f517, 0x009b7d86, 0x003c994f, 0x0166a24c, 0x01707728, 0x0057f1b4, 0x0014d523}}, Y: Field{[10]uint32{0x010c3b44, 0x024e013c, 0x0240db6a, 0x0170f2b5, 0x01c36aec, 0x00c2c4ea, 0x01307e21, 0x001fe700, 0x0146f0c2, 0x003304e2}}}, + {X: Field{[10]uint32{0x00b5867e, 0x01bfd001, 0x0188f90f, 0x02aff51e, 0x012aee71, 0x022dc8fb, 0x00b0e09b, 0x0324053a, 0x03847f25, 0x001ff53d}}, Y: Field{[10]uint32{0x00a1bd9d, 0x0174899d, 0x0297641b, 0x0234dd7e, 0x0358eec1, 0x01b900b6, 0x0205805a, 0x004ab659, 0x02bc901f, 0x003ff0f7}}}, + {X: Field{[10]uint32{0x0397dd9d, 0x031e7e94, 0x003ccd3d, 0x03da72e2, 0x03d4251b, 0x036411bb, 0x0062424c, 0x0226d127, 0x027e4997, 0x001112a2}}, Y: Field{[10]uint32{0x03b30282, 0x03117936, 0x03f828f7, 0x0106fce4, 0x02abbe8e, 0x002355b0, 0x028c7757, 0x02c0802b, 0x003b3356, 0x0013317c}}}, + {X: Field{[10]uint32{0x0326bd8b, 0x0033aa15, 0x02bc1acb, 0x019e398a, 0x0204af8c, 0x0108071e, 0x0294bd0a, 0x01897481, 0x007784d8, 0x003fc172}}, Y: Field{[10]uint32{0x0196eeb3, 0x030b79ea, 0x012d906e, 0x028242f4, 0x02a55f6a, 0x02fa613b, 0x025a0b5c, 0x01894f3e, 0x00ce6ac2, 0x001f3c3a}}}, + {X: Field{[10]uint32{0x027e4ab2, 0x020ce6b7, 0x027c679b, 0x001223c2, 0x00e29f47, 0x00ff649d, 0x0094ea08, 0x006daf3a, 0x03ae6aa3, 0x00203f7d}}, Y: Field{[10]uint32{0x0152fb75, 0x01b9828e, 0x018fe3f4, 0x02fc2f79, 0x0249e066, 0x03515d71, 0x004a8b4b, 0x009d158d, 0x017b1696, 0x001df5cc}}}, + {X: Field{[10]uint32{0x01879214, 0x012bab50, 0x01589685, 0x01edfad2, 0x03ef2022, 0x0035dcb5, 0x0020a74f, 0x001f2b54, 0x00c810a3, 0x002b0e29}}, Y: Field{[10]uint32{0x035016ac, 0x034b3a87, 0x01213c7c, 0x02acd057, 0x00d75ecf, 0x00b88a7b, 0x02f77ca9, 0x01616105, 0x00bb3c67, 0x003d2713}}}, + {X: Field{[10]uint32{0x01f75514, 0x02445569, 0x036fea26, 0x00d77a6a, 0x013a90a4, 0x03d40bc6, 0x0162f408, 0x00098bf5, 0x02ddf1e1, 0x002cdcdb}}, Y: Field{[10]uint32{0x015a78c8, 0x020c15eb, 0x027514e4, 0x037995fb, 0x000eafa2, 0x02856b83, 0x01cb0682, 0x00d4f3c0, 0x03aff190, 0x0020633b}}}, + {X: Field{[10]uint32{0x010dc295, 0x00e2cccc, 0x0322f127, 0x03d73ed9, 0x03e698d4, 0x031aa16a, 0x03f6d5ea, 0x03045ad5, 0x0212d100, 0x0019b59f}}, Y: Field{[10]uint32{0x00a05dd3, 0x0097fa85, 0x0318fd4e, 0x0318cb5c, 0x02685fae, 0x026ef5fa, 0x0208ea70, 0x0269534d, 0x021f3a0c, 0x0027353e}}}, + {X: Field{[10]uint32{0x02b59043, 0x011c4d4f, 0x0333eb87, 0x01ae9ee6, 0x029fa10c, 0x01bb37c2, 0x02eb6514, 0x0392136a, 0x035f756a, 0x002e15b5}}, Y: Field{[10]uint32{0x01cb0a38, 0x0069f6e2, 0x004c4b04, 0x0071c9ca, 0x026566da, 0x037c91bc, 0x03a177d8, 0x0259252c, 0x02b12f24, 0x00172150}}}, + {X: Field{[10]uint32{0x01c47d27, 0x014a547e, 0x01548afc, 0x017ee165, 0x03c736b1, 0x01869950, 0x00142cd6, 0x008e4d16, 0x03d70320, 0x0001a0ef}}, Y: Field{[10]uint32{0x022de166, 0x018d045d, 0x01746b41, 0x028a3653, 0x02420387, 0x031a3365, 0x0029f84a, 0x037c9945, 0x0240f5db, 0x00243d4a}}}, + {X: Field{[10]uint32{0x032923c2, 0x003e2a46, 0x018963d0, 0x029fe25d, 0x0141ee1c, 0x00ce8250, 0x00959345, 0x0079944e, 0x01f0811e, 0x000bfaa8}}, Y: Field{[10]uint32{0x00499c1a, 0x00e843fa, 0x0202b07e, 0x0081f41b, 0x03690d18, 0x039bb87b, 0x03701c35, 0x03500575, 0x0176b884, 0x00277602}}}, + {X: Field{[10]uint32{0x0287cda4, 0x001ed608, 0x0009780e, 0x02a86a5a, 0x01847070, 0x01134833, 0x0365e9b1, 0x02ebcea5, 0x0137da9e, 0x0033994a}}, Y: Field{[10]uint32{0x001ba572, 0x00c87cc1, 0x01b6801b, 0x00dbade8, 0x00454e17, 0x0279eba1, 0x01db3782, 0x00b6f96a, 0x03fb5f15, 0x0030711b}}}, + {X: Field{[10]uint32{0x00976211, 0x017f9a1e, 0x008a84fd, 0x02dac137, 0x03556087, 0x01d42f71, 0x03f9738a, 0x018feeac, 0x03d91701, 0x00269a56}}, Y: Field{[10]uint32{0x02aeda70, 0x0273c48f, 0x03c27d0c, 0x00b5935a, 0x010dce26, 0x02521a36, 0x002b1332, 0x03361669, 0x01f375ac, 0x003d02e8}}}, + {X: Field{[10]uint32{0x0134ba44, 0x034c88ef, 0x00ec718c, 0x0285d55e, 0x035908b0, 0x03936930, 0x02bd6d09, 0x020fb2fe, 0x0368bd30, 0x00396eab}}, Y: Field{[10]uint32{0x03a27fb0, 0x03bee642, 0x03dbce4d, 0x011aa6be, 0x005feb7f, 0x028fa1a9, 0x0076d0ed, 0x030f0541, 0x01f0365c, 0x002ae194}}}, + {X: Field{[10]uint32{0x03e59cc7, 0x00ddb63f, 0x0104ce06, 0x0322fd8f, 0x03dd0c4d, 0x01fb87f6, 0x033530bb, 0x03f9df63, 0x02a2b507, 0x000b09b3}}, Y: Field{[10]uint32{0x0230d62e, 0x002da739, 0x0004a500, 0x030abbf0, 0x03c30a1c, 0x016114a5, 0x0367151b, 0x00fae6c2, 0x03af54d0, 0x002cd138}}}, + {X: Field{[10]uint32{0x00bbd0e4, 0x00527d72, 0x027a3c2a, 0x02701ff2, 0x024d5333, 0x0281f8bd, 0x01eadaf0, 0x00b98623, 0x039f52af, 0x001f19d4}}, Y: Field{[10]uint32{0x009067c9, 0x039cfa4c, 0x0303896e, 0x02f986d8, 0x03df7a2c, 0x01990bb1, 0x02cc97ec, 0x0244d813, 0x02fdc21c, 0x000fe61c}}}, + {X: Field{[10]uint32{0x02249574, 0x02b7072a, 0x01aab8f9, 0x013dd080, 0x00334561, 0x00769c72, 0x02e1d17e, 0x002f24ed, 0x012dec8b, 0x0012d777}}, Y: Field{[10]uint32{0x02c5460b, 0x02cdaa2a, 0x03d695df, 0x0155b957, 0x036e16e7, 0x00aa169a, 0x00d18b3d, 0x03bf6d0d, 0x02dcaa3e, 0x0033eb68}}}, + {X: Field{[10]uint32{0x00d80e4b, 0x02f0d6e2, 0x03e59216, 0x0200bac2, 0x00f9bb66, 0x01cea13e, 0x0266edb8, 0x0020d61a, 0x02f2ccfc, 0x0035dd70}}, Y: Field{[10]uint32{0x0053ddbb, 0x02ce933f, 0x01ea765b, 0x015e444d, 0x02ff56ca, 0x025902a1, 0x02aa0b51, 0x0088c73d, 0x01b7988a, 0x00322976}}}, + {X: Field{[10]uint32{0x00d9bb4a, 0x0200ea6f, 0x014dcd3c, 0x01ec0dab, 0x00b005b0, 0x00f70f69, 0x001d9844, 0x003e77ec, 0x03097881, 0x001c68f3}}, Y: Field{[10]uint32{0x03caaa55, 0x00c41002, 0x01f5a1ad, 0x01362627, 0x01bd4a3c, 0x0185eb55, 0x000c5b39, 0x00c06e59, 0x02217db0, 0x0022aae3}}}, + {X: Field{[10]uint32{0x011f53b7, 0x03a2ec66, 0x00d3fdde, 0x00160970, 0x02a82f7d, 0x035de3bd, 0x00596ae3, 0x025b9880, 0x005492b6, 0x002f1c68}}, Y: Field{[10]uint32{0x029a2a15, 0x02abd85c, 0x03b52b07, 0x00db9003, 0x00d11255, 0x018c2a42, 0x03744600, 0x02e362c4, 0x01259785, 0x00055e24}}}, + {X: Field{[10]uint32{0x00847abc, 0x0247193f, 0x01f7e6f8, 0x002f1ade, 0x00e8d94a, 0x003d8396, 0x001ec81a, 0x02ff73ee, 0x0119ee62, 0x00274882}}, Y: Field{[10]uint32{0x02d0c675, 0x002f1f9b, 0x02a16e53, 0x03229efe, 0x0075f3a7, 0x027d3a53, 0x03fe8865, 0x00f0ae37, 0x039b1a07, 0x0020524d}}}, + {X: Field{[10]uint32{0x03f33425, 0x0230cfbb, 0x016e5c6c, 0x006d38da, 0x00d25bff, 0x038eb565, 0x030c6c91, 0x02f4668c, 0x026ad30b, 0x0020da5d}}, Y: Field{[10]uint32{0x02e79e4a, 0x02562e5c, 0x008a4e4b, 0x0236185f, 0x038ed5d2, 0x0087df6b, 0x00970d9c, 0x015d7216, 0x0282b3f4, 0x00289fdd}}}, + {X: Field{[10]uint32{0x00542451, 0x02cba2c8, 0x00ab457d, 0x02b4735a, 0x03e91f51, 0x021fed09, 0x00d36b54, 0x03aaac6a, 0x00750e4a, 0x001389de}}, Y: Field{[10]uint32{0x026566e0, 0x014083a8, 0x0123e763, 0x0036a3e1, 0x02d138fd, 0x0054a951, 0x02bf1d2a, 0x012e07e5, 0x03655bbc, 0x0027ebbf}}}, + {X: Field{[10]uint32{0x01a0d2fa, 0x024408ce, 0x036b108b, 0x0306c84c, 0x01825046, 0x009816a4, 0x028d2027, 0x03ffcc39, 0x03b51b9d, 0x0009fe41}}, Y: Field{[10]uint32{0x012d4a15, 0x035ec301, 0x0068acbf, 0x0167ff10, 0x000105f4, 0x03571276, 0x004bf3dd, 0x00d803ee, 0x01c36cb1, 0x00045489}}}, + {X: Field{[10]uint32{0x02b1fab3, 0x010bbb55, 0x0281864b, 0x02a3cf35, 0x02ef0900, 0x007dc3c5, 0x03ff42d4, 0x01d3110d, 0x03206506, 0x001b67fa}}, Y: Field{[10]uint32{0x03a02065, 0x015d3483, 0x02444f60, 0x0000e6a8, 0x035f7f7b, 0x014ebe8e, 0x015f8576, 0x00f070b9, 0x03ecd82b, 0x0020b365}}}, + {X: Field{[10]uint32{0x0187bfac, 0x03cb3de0, 0x03558857, 0x02f4ef45, 0x01ecb9cd, 0x00a139ca, 0x01c3b363, 0x019a74d8, 0x02b43360, 0x00226074}}, Y: Field{[10]uint32{0x00d48498, 0x01b5e05c, 0x0245a3e8, 0x018db09d, 0x000216b2, 0x0053b357, 0x011bf736, 0x0174761e, 0x0327d5a4, 0x0006e6ba}}}, + {X: Field{[10]uint32{0x02e1d72e, 0x026169dc, 0x010ce9c5, 0x0215b4f0, 0x02816916, 0x01fa4b38, 0x0140d557, 0x0347f895, 0x0118e47a, 0x0021299d}}, Y: Field{[10]uint32{0x01631658, 0x0294d071, 0x03356dc8, 0x0389a67b, 0x0016ca04, 0x0312dcff, 0x0011777d, 0x00ba8b9b, 0x03af8507, 0x0034f2e4}}}, + {X: Field{[10]uint32{0x00a8c683, 0x030a346b, 0x03418d50, 0x0376e77e, 0x007e666c, 0x0196999d, 0x00111e2e, 0x033ddd43, 0x035672a6, 0x0034f999}}, Y: Field{[10]uint32{0x02556dd9, 0x027eb8e9, 0x023f0735, 0x016f7441, 0x034e2e81, 0x008cfe0f, 0x01aca5d8, 0x031b0ead, 0x00aa20e5, 0x001dddbb}}}, + {X: Field{[10]uint32{0x01b87bba, 0x00b6ce19, 0x03c4af7b, 0x02129a3b, 0x02522a76, 0x0394958f, 0x00e76b5e, 0x015a2201, 0x01ef71d4, 0x003b7a5f}}, Y: Field{[10]uint32{0x01ae702f, 0x01eda4bf, 0x03513758, 0x023eddfa, 0x0285bafb, 0x01d62a03, 0x02279f95, 0x0049d982, 0x020f0c9c, 0x0024b9b4}}}, + {X: Field{[10]uint32{0x02e8c871, 0x0282e73a, 0x006ed025, 0x021091eb, 0x036ff84f, 0x00c4b9c0, 0x03db3ae2, 0x01213b3d, 0x0142e000, 0x000cd678}}, Y: Field{[10]uint32{0x021cdf66, 0x019be774, 0x0377f871, 0x0024db90, 0x00d00ada, 0x00e76fca, 0x00c98bf7, 0x017e87ce, 0x01f23c84, 0x0019ec0e}}}, + {X: Field{[10]uint32{0x022b44a1, 0x018b1f84, 0x0158f8fd, 0x02bb3c36, 0x0196f675, 0x00245295, 0x014a3dc4, 0x000bf499, 0x01720c05, 0x0038342a}}, Y: Field{[10]uint32{0x036b0312, 0x01ef51d5, 0x021718db, 0x00b46c47, 0x033ee29e, 0x03684640, 0x03d916ed, 0x0169faef, 0x01bc3457, 0x00032fac}}}, + {X: Field{[10]uint32{0x01a4c987, 0x01f7e108, 0x02605939, 0x00676368, 0x014f3320, 0x007d757b, 0x0031ac7a, 0x01dc1190, 0x03675df7, 0x00142e24}}, Y: Field{[10]uint32{0x0292f293, 0x013ccd74, 0x01204cb0, 0x014cf67b, 0x0045c382, 0x01b5bfc3, 0x009c3f25, 0x0327ae82, 0x0181063e, 0x00311d97}}}, + {X: Field{[10]uint32{0x016d446a, 0x0390cb73, 0x0111391c, 0x02f9073a, 0x037f80cb, 0x03e3a048, 0x01e84e99, 0x017fdbc8, 0x018e6677, 0x0017718b}}, Y: Field{[10]uint32{0x0373a9c2, 0x01bac505, 0x01de99ad, 0x02fc497d, 0x00b020ca, 0x0058ff57, 0x021cdabd, 0x011695db, 0x037de270, 0x0012d15a}}}, + {X: Field{[10]uint32{0x02c10971, 0x0353e588, 0x01b03fdc, 0x01f88bbf, 0x004e56ba, 0x0241c430, 0x0232e187, 0x00611749, 0x038fc792, 0x0022e85d}}, Y: Field{[10]uint32{0x023e3854, 0x031ebd8f, 0x00c53f48, 0x03a23d06, 0x0048ffeb, 0x025c1c9a, 0x01d7d435, 0x025962ce, 0x00ffa835, 0x0007cc7f}}}, + {X: Field{[10]uint32{0x00db9fc7, 0x03681b02, 0x0294be7a, 0x00aeea2d, 0x02999a10, 0x02fe6042, 0x03ad055f, 0x029eef9a, 0x02147d1e, 0x0028e851}}, Y: Field{[10]uint32{0x006ac294, 0x01fab0e2, 0x03d57a69, 0x01ec69c9, 0x00b3bdb8, 0x014c7ff3, 0x00cd6eb3, 0x004a108f, 0x0331d432, 0x0032609d}}}, + {X: Field{[10]uint32{0x00af78f5, 0x03470bf8, 0x0328621a, 0x03d93637, 0x01f6ce1a, 0x00d9a0b1, 0x01671c44, 0x00d2ab20, 0x0047bd20, 0x0025882a}}, Y: Field{[10]uint32{0x01826e1c, 0x03855553, 0x01f0d099, 0x0017a256, 0x016168a2, 0x0055af37, 0x007e32f4, 0x037ffb2d, 0x0108a7e3, 0x0038731b}}}, + {X: Field{[10]uint32{0x0396016b, 0x03663881, 0x016eebc9, 0x01f16126, 0x0395b2c5, 0x012363ff, 0x00b6a52c, 0x01a9e4fc, 0x02a0aa7d, 0x00290361}}, Y: Field{[10]uint32{0x02351ea2, 0x03365402, 0x0087396e, 0x02d117d1, 0x00062911, 0x009585f6, 0x014c15cb, 0x0119b6b6, 0x00e2d453, 0x003b1535}}}, + {X: Field{[10]uint32{0x03484c80, 0x0241de6c, 0x02fbd5ed, 0x03a6e993, 0x037e5f40, 0x01d1661b, 0x0173b979, 0x009a295d, 0x01a6f60f, 0x001c7bcd}}, Y: Field{[10]uint32{0x038a1ba3, 0x0058ded3, 0x01669875, 0x00f2f91d, 0x0302f369, 0x03d69ab5, 0x037df7f6, 0x01642b15, 0x021e9ff3, 0x003aaffe}}}, + {X: Field{[10]uint32{0x00f68de2, 0x031db5e9, 0x0267486f, 0x02fbc40f, 0x005308ab, 0x017dc256, 0x01ffa52c, 0x028ecb92, 0x0008c742, 0x002ef469}}, Y: Field{[10]uint32{0x01246124, 0x002d86d7, 0x0079a2ac, 0x00201428, 0x01ee6e1e, 0x01cca116, 0x00fbe96c, 0x0384f86c, 0x03ec9d07, 0x00125072}}}, + {X: Field{[10]uint32{0x00ba9009, 0x03c7e7a1, 0x012ab433, 0x03fe5613, 0x03805d60, 0x00b226d7, 0x009c92ff, 0x01b7d4f8, 0x03389211, 0x0005a7af}}, Y: Field{[10]uint32{0x03c6228d, 0x000d6641, 0x02a08345, 0x01247a4c, 0x02c997d1, 0x03c77923, 0x01b5adeb, 0x01fb8560, 0x0116e766, 0x002453d5}}}, + {X: Field{[10]uint32{0x00666acc, 0x01d40b3e, 0x020c3977, 0x02781313, 0x01d71c8d, 0x02436391, 0x00115458, 0x031fefab, 0x02bc4c5e, 0x0023c55e}}, Y: Field{[10]uint32{0x03f25908, 0x00604e0f, 0x021bc635, 0x0026260b, 0x02014dc7, 0x000af28f, 0x019883e6, 0x02a7ee62, 0x02ba1e78, 0x0035055d}}}, + {X: Field{[10]uint32{0x00ec9a8d, 0x03632d6d, 0x0010091e, 0x024e53ee, 0x0284f71f, 0x026801b6, 0x00ebcd83, 0x009b7001, 0x00d5694b, 0x002334ce}}, Y: Field{[10]uint32{0x00002578, 0x03b34874, 0x03d952a6, 0x00d30809, 0x0303fd9d, 0x015192ac, 0x000eccf4, 0x0366e702, 0x0010dd88, 0x00100c63}}}, + {X: Field{[10]uint32{0x013272f2, 0x003b8f8a, 0x02e28cbf, 0x030a5224, 0x03a64748, 0x012b5d83, 0x036171af, 0x02e8a834, 0x022f7ba5, 0x0008391f}}, Y: Field{[10]uint32{0x03be00bd, 0x00549519, 0x020a771b, 0x03e1db1c, 0x03162dda, 0x02279099, 0x00520897, 0x02608570, 0x022056b8, 0x002e5ab4}}}, + {X: Field{[10]uint32{0x032bb880, 0x032d7997, 0x015793f3, 0x031bfefc, 0x02f9c31e, 0x03d0477b, 0x02942d11, 0x023e736d, 0x00a5a0d3, 0x00160bb6}}, Y: Field{[10]uint32{0x03ce8486, 0x03d1e580, 0x02352a4c, 0x0248d29b, 0x02948ea8, 0x012ebd2f, 0x00a8db56, 0x0274f7b1, 0x000e4f9d, 0x000524a3}}}, + {X: Field{[10]uint32{0x001896d6, 0x03ac6d18, 0x01e7b877, 0x022db47d, 0x03b0bcab, 0x023011ba, 0x03daf30b, 0x030474fd, 0x019a6e76, 0x003d29bd}}, Y: Field{[10]uint32{0x0070f0c5, 0x0229922c, 0x01abeedc, 0x010792f6, 0x01ccde46, 0x026c5239, 0x01a05d4a, 0x01055956, 0x02e9e5d8, 0x000b4e71}}}, + {X: Field{[10]uint32{0x00957b24, 0x00a6bdcc, 0x0252d2c3, 0x02e31d8e, 0x02fc8564, 0x01588fc1, 0x0266bf01, 0x033d71db, 0x00600f71, 0x000aa083}}, Y: Field{[10]uint32{0x03ff3ca2, 0x0249919d, 0x02d370fd, 0x01f6e655, 0x0236f77f, 0x01401e34, 0x009a1d72, 0x0256679b, 0x0303d742, 0x002ce301}}}, + {X: Field{[10]uint32{0x02e2799e, 0x00612281, 0x03872623, 0x00ef075f, 0x0133634d, 0x001de8ea, 0x01d48026, 0x02fd921c, 0x004e9fcc, 0x00230b67}}, Y: Field{[10]uint32{0x01351a7d, 0x0152162a, 0x02db8d59, 0x01dd8130, 0x03cf032d, 0x02026169, 0x009c534e, 0x02edb631, 0x036cae43, 0x002b5404}}}, + {X: Field{[10]uint32{0x00061ba9, 0x003466dd, 0x004906eb, 0x017eb7f1, 0x03db00d2, 0x00e49d64, 0x00b991e2, 0x02cfb434, 0x00530744, 0x002c63a4}}, Y: Field{[10]uint32{0x033877b6, 0x03faa4ac, 0x002a702f, 0x02e1108c, 0x0343a8aa, 0x02600d34, 0x01edd739, 0x02cb19dc, 0x0244c829, 0x00243d72}}}, + {X: Field{[10]uint32{0x00e835be, 0x01e37347, 0x00109330, 0x01f3d2b1, 0x01d12482, 0x0314efe8, 0x01d2f58c, 0x010d6e41, 0x0157b03d, 0x00033c74}}, Y: Field{[10]uint32{0x0271b459, 0x01b65672, 0x031ab119, 0x037d87ba, 0x003ea656, 0x01147359, 0x0303cf21, 0x031f5a83, 0x01a15547, 0x003b8dea}}}, + {X: Field{[10]uint32{0x014a6007, 0x0358fdf9, 0x004c1562, 0x0347c8be, 0x0192fc13, 0x01bd2f39, 0x021ac36a, 0x02103ecb, 0x018ad91a, 0x002362e7}}, Y: Field{[10]uint32{0x03842dba, 0x006d1ac2, 0x02ee1ce6, 0x03851f39, 0x01ee9227, 0x00e6af7b, 0x020ec3b4, 0x023cb76b, 0x024393ca, 0x00254a2f}}}, + {X: Field{[10]uint32{0x0087fc9d, 0x006d18ff, 0x0106f256, 0x02387569, 0x037ae04a, 0x00366932, 0x02c936fb, 0x02c355c5, 0x0144bbc5, 0x001812d5}}, Y: Field{[10]uint32{0x016ac8eb, 0x00649528, 0x01d8a3e3, 0x01bc41a8, 0x03ee3cde, 0x034f67b6, 0x001e5fe7, 0x029b9d07, 0x039c4fb9, 0x000cff8b}}}, + {X: Field{[10]uint32{0x03aed8f6, 0x030245be, 0x03e5309e, 0x0191e567, 0x02cbd16d, 0x02785328, 0x017aab74, 0x03b91181, 0x00141058, 0x000f9fb5}}, Y: Field{[10]uint32{0x012e79fc, 0x00915a25, 0x006481ba, 0x01860bc6, 0x01f66bd3, 0x00280574, 0x01aa6971, 0x031b8324, 0x024186de, 0x003f056c}}}, + {X: Field{[10]uint32{0x0143f326, 0x034149de, 0x00f26736, 0x01a531a7, 0x0126e46f, 0x01b3d0b0, 0x01242431, 0x01ee2b25, 0x003586c1, 0x00342b9d}}, Y: Field{[10]uint32{0x034e0757, 0x007386fd, 0x0304b197, 0x00fa2ed7, 0x00fbaca0, 0x02fdada7, 0x0398865a, 0x01622b50, 0x01e8b983, 0x002fe80b}}}, + {X: Field{[10]uint32{0x00be1441, 0x0147ae62, 0x0197f5f8, 0x01967781, 0x023627bc, 0x014e02b7, 0x02ce2f94, 0x010f8df9, 0x01ced4f3, 0x003bd701}}, Y: Field{[10]uint32{0x00103281, 0x0031865d, 0x036350d6, 0x030ab527, 0x01b681e7, 0x012ba388, 0x010e40b7, 0x03c678ef, 0x001b0379, 0x0036499f}}}, + {X: Field{[10]uint32{0x008f49ae, 0x01921917, 0x038ca8dc, 0x01971efc, 0x03d7cf42, 0x02c2766b, 0x033015c3, 0x022b65f1, 0x03ebd799, 0x0005dae3}}, Y: Field{[10]uint32{0x0122f1b4, 0x0086fce1, 0x034c5fc8, 0x017a8053, 0x017f989f, 0x019db1e0, 0x00da1905, 0x03268da7, 0x024c8267, 0x002d2f2f}}}, + {X: Field{[10]uint32{0x0116c3dd, 0x00e9d9af, 0x03a0097b, 0x0374d50b, 0x03b20771, 0x02db698b, 0x0358d69f, 0x03053bae, 0x03db0cff, 0x00223da0}}, Y: Field{[10]uint32{0x011cb601, 0x03fdc607, 0x02219f52, 0x025aca5c, 0x020cf800, 0x0094add3, 0x02797ca0, 0x000f1499, 0x03de8121, 0x0002efbc}}}, + {X: Field{[10]uint32{0x0237abaa, 0x03f88e3d, 0x00854dd1, 0x0208c7ee, 0x018488b0, 0x00f59e24, 0x00c4121c, 0x03b113f6, 0x038f1247, 0x00299750}}, Y: Field{[10]uint32{0x023f36a3, 0x012a0be6, 0x00986d4d, 0x0257743f, 0x034bb500, 0x0131dc6b, 0x01cf3c0b, 0x010cff7f, 0x004e551e, 0x0017d972}}}, + {X: Field{[10]uint32{0x0398cc27, 0x0169a818, 0x03d2ff6a, 0x02e40a20, 0x02d5cdda, 0x03c565f1, 0x0208148a, 0x022edfdf, 0x0251c502, 0x002f5a9f}}, Y: Field{[10]uint32{0x0059d885, 0x02dc3d9e, 0x02f662dd, 0x01369dbb, 0x030c1ed1, 0x026a63a4, 0x0397979b, 0x03748ba2, 0x00c4247c, 0x000fc8a0}}}, + {X: Field{[10]uint32{0x009d274b, 0x00468264, 0x02202344, 0x02b1d34d, 0x0158f7a3, 0x01440514, 0x031814ec, 0x02837152, 0x036c2896, 0x00299c90}}, Y: Field{[10]uint32{0x03c2ec3f, 0x03f3b3af, 0x02654a7a, 0x02765590, 0x02c81f3d, 0x02b6b795, 0x02acea6b, 0x01e3656e, 0x02934681, 0x0037ba00}}}, + {X: Field{[10]uint32{0x003a24b0, 0x0380de7c, 0x004bc8d9, 0x02a4c844, 0x0257891b, 0x01f4b6a9, 0x01b0993d, 0x03433c6b, 0x01fed3a1, 0x003283d5}}, Y: Field{[10]uint32{0x023cfa6f, 0x010f9bd6, 0x0399db58, 0x020e59c4, 0x03520166, 0x02f2a363, 0x0188baae, 0x00b73645, 0x00e46346, 0x0037006e}}}, + {X: Field{[10]uint32{0x036429a1, 0x03c2d712, 0x034ccb91, 0x029fa831, 0x02211843, 0x02cbf881, 0x004961cc, 0x00087815, 0x008d9bff, 0x001843fc}}, Y: Field{[10]uint32{0x01d46b28, 0x01d82fb4, 0x020dd9b0, 0x00d8d7c5, 0x02d889bc, 0x03f34f84, 0x03daee68, 0x017e9f6a, 0x018aee96, 0x0012f8ec}}}, + {X: Field{[10]uint32{0x01ff42ae, 0x03318e2a, 0x0162238f, 0x032588b7, 0x026b695d, 0x037e3c28, 0x00f006cd, 0x03b32de3, 0x0215a70a, 0x000b5be0}}, Y: Field{[10]uint32{0x01a3927b, 0x011521e5, 0x010fd3ff, 0x005491b1, 0x037a9887, 0x03543ccd, 0x01e4e5be, 0x0325a798, 0x0164e2a3, 0x0000ff02}}}, + {X: Field{[10]uint32{0x00a1bbbb, 0x00318c22, 0x004ea70b, 0x009a90bf, 0x02998468, 0x0386826b, 0x010b132d, 0x00e716d8, 0x01b4868e, 0x002303a6}}, Y: Field{[10]uint32{0x001cfe52, 0x01314d85, 0x01a95c38, 0x00b821e1, 0x036ead99, 0x0186e305, 0x036a41de, 0x01032ca1, 0x0242f0a2, 0x000cae32}}}, + {X: Field{[10]uint32{0x03c96ed7, 0x0327ac23, 0x007e4dba, 0x007596be, 0x03658c6d, 0x013bdb5d, 0x0062af77, 0x02b9d78c, 0x028f9000, 0x00054a2e}}, Y: Field{[10]uint32{0x013b5651, 0x03b29914, 0x0253a5fa, 0x03571cc6, 0x012d39f0, 0x01d4ea2f, 0x00e64665, 0x01af3475, 0x038d54df, 0x002a3749}}}, + {X: Field{[10]uint32{0x03f1d7a4, 0x027bde9b, 0x037d2fa0, 0x02feb16b, 0x00104394, 0x02545616, 0x03a040e2, 0x01a9ebc4, 0x02a5d925, 0x0030519b}}, Y: Field{[10]uint32{0x01be5128, 0x0115ec9d, 0x00a7bc05, 0x02db8414, 0x00d8bab3, 0x01800f7c, 0x0284b540, 0x0361e7c1, 0x02c6fb36, 0x0032adbf}}}, + {X: Field{[10]uint32{0x03e98cb4, 0x004604b4, 0x02b56c6f, 0x02ea1e9d, 0x022ea946, 0x03e430fc, 0x0297a87c, 0x002274a8, 0x0093e051, 0x0033a2ec}}, Y: Field{[10]uint32{0x003a0470, 0x014ba578, 0x028884c2, 0x02b642c3, 0x00679cbc, 0x0344eeab, 0x03f556fb, 0x0213f9b7, 0x0251b906, 0x002a36ee}}}, + {X: Field{[10]uint32{0x02d6c86d, 0x01960b81, 0x016ea918, 0x018e85ea, 0x027c4267, 0x0024aa53, 0x030ddd9b, 0x02785634, 0x02737c9d, 0x0001dbce}}, Y: Field{[10]uint32{0x01d16c8a, 0x00a808b9, 0x00443b20, 0x00081f90, 0x01b29c53, 0x01b38fc1, 0x00ad27ec, 0x0179b1de, 0x007c4f34, 0x0016c728}}}, + {X: Field{[10]uint32{0x0274017f, 0x015cb542, 0x001adee1, 0x03fabdda, 0x032ed997, 0x0375f50e, 0x03988725, 0x002c84ee, 0x03c32339, 0x003dd5f7}}, Y: Field{[10]uint32{0x01b83cf8, 0x034912e9, 0x016be461, 0x019f2869, 0x0374ec4f, 0x023ace55, 0x00b63d98, 0x025c99c0, 0x00ea6787, 0x00342d39}}}, + {X: Field{[10]uint32{0x02d5f5d0, 0x00aa1ee7, 0x0065c149, 0x01a43647, 0x03f27a57, 0x036f8f19, 0x000ec6d3, 0x02bbf7c2, 0x0198a2de, 0x00166fd8}}, Y: Field{[10]uint32{0x0010f8b2, 0x00f5c3e1, 0x029b3a2f, 0x03b58054, 0x016e02f2, 0x03519e15, 0x010834c4, 0x028a08c4, 0x03399011, 0x002fd7ad}}}, + {X: Field{[10]uint32{0x0149ba16, 0x02020b81, 0x0052d53f, 0x0173c4b3, 0x02a7b0e8, 0x02463056, 0x02857900, 0x021d5d21, 0x030ac86d, 0x002c740b}}, Y: Field{[10]uint32{0x031a19d0, 0x00dff095, 0x0106b854, 0x00965b4f, 0x03972977, 0x00fce14a, 0x000878d6, 0x01adda2a, 0x02039992, 0x0001e497}}}, + {X: Field{[10]uint32{0x001d1905, 0x0393900e, 0x02908882, 0x03bc53ce, 0x027e5267, 0x01f10610, 0x03d2ec12, 0x0381f406, 0x032f41d8, 0x003349cd}}, Y: Field{[10]uint32{0x01c77297, 0x02bc3257, 0x003522ac, 0x005d4826, 0x02c33296, 0x01045a4e, 0x03810f3b, 0x027ccf33, 0x0203661b, 0x003338db}}}, + {X: Field{[10]uint32{0x019d3ace, 0x036d26f7, 0x01695b01, 0x033eef20, 0x03ad2258, 0x032eaad3, 0x028940f5, 0x00d664ed, 0x00fc26ca, 0x00044991}}, Y: Field{[10]uint32{0x01c0bf60, 0x01341245, 0x01b904e7, 0x00acefa7, 0x037ff136, 0x03b7c274, 0x03a49b3b, 0x02e57cbd, 0x03907b5a, 0x0021a17d}}}, + {X: Field{[10]uint32{0x0197d3ce, 0x001b8b03, 0x018bb3a6, 0x03abae12, 0x0192fb51, 0x00d68936, 0x02845759, 0x01285883, 0x032a99ce, 0x0024637d}}, Y: Field{[10]uint32{0x038a8461, 0x0333faee, 0x03065602, 0x00609d26, 0x01bb6b79, 0x0241e533, 0x038b0d3c, 0x03fe63c6, 0x01ec9ebb, 0x00222cce}}}, + {X: Field{[10]uint32{0x00dcb83b, 0x02b3eaff, 0x01af2a7d, 0x0093cd28, 0x00436e64, 0x035229dc, 0x0025b510, 0x03ff2025, 0x00f265c4, 0x0026e3c6}}, Y: Field{[10]uint32{0x0185ba55, 0x0152a6b5, 0x012475e4, 0x03e4fd8f, 0x01476c4a, 0x0318a04e, 0x02e8c78f, 0x0306e4b0, 0x01e86a34, 0x0002fee5}}}, + {X: Field{[10]uint32{0x0024ce30, 0x031e3fef, 0x0340c9b9, 0x002b62cc, 0x00382174, 0x03a87639, 0x02be52a1, 0x0189a90a, 0x032ac396, 0x0002b40b}}, Y: Field{[10]uint32{0x022885fb, 0x030b41c6, 0x01b13255, 0x03978953, 0x03ad8c97, 0x02deede9, 0x0027cfe1, 0x01e1cbfe, 0x00e6cf8a, 0x003f31ce}}}, + {X: Field{[10]uint32{0x026d85a3, 0x03ee6b76, 0x0076c84b, 0x00a23d51, 0x029b5c19, 0x016b3c49, 0x02e34f3f, 0x036b2423, 0x03bd5e60, 0x0000d66b}}, Y: Field{[10]uint32{0x03088955, 0x0055e7ec, 0x030f6b50, 0x00da8608, 0x03443586, 0x024cb385, 0x02721553, 0x03fb59c4, 0x01e79cd3, 0x000b8aa8}}}, + {X: Field{[10]uint32{0x00b279de, 0x0024459a, 0x033ca55e, 0x03008187, 0x030c3c15, 0x0335b1e3, 0x00c34a31, 0x00bc7384, 0x023e230f, 0x00158e6a}}, Y: Field{[10]uint32{0x0111bef1, 0x01b0bb2d, 0x0309c8ed, 0x006c1189, 0x02e3a7d5, 0x02a7a0f8, 0x023bc263, 0x01fc2cfe, 0x015c15de, 0x00382dba}}}, + {X: Field{[10]uint32{0x0269ec44, 0x015d94b5, 0x00e4ad86, 0x01b2b50b, 0x03693d3b, 0x0097bf0a, 0x00ef3d0c, 0x02567617, 0x03cc7b2f, 0x000c273f}}, Y: Field{[10]uint32{0x0150077d, 0x02596dea, 0x0274bcf7, 0x0299e664, 0x0232f949, 0x01487548, 0x00095205, 0x02c6f9e6, 0x022fd917, 0x0000eaed}}}, + {X: Field{[10]uint32{0x033b86b2, 0x006bdb94, 0x033cace9, 0x01a922af, 0x00534a02, 0x01d7244c, 0x018eab63, 0x035f0017, 0x01d2dac1, 0x00147cf5}}, Y: Field{[10]uint32{0x03e99f74, 0x0262a3e8, 0x0235aba9, 0x00aab410, 0x0234f9cf, 0x02816f76, 0x03fbfe0c, 0x0123b67c, 0x027f4bdc, 0x000142c7}}}, + {X: Field{[10]uint32{0x01c2a244, 0x03897b8a, 0x00e1fa3f, 0x03d22cf9, 0x034158b0, 0x014074c9, 0x000e0c6f, 0x01040115, 0x011833aa, 0x0023d58f}}, Y: Field{[10]uint32{0x03432193, 0x01d64a19, 0x03589028, 0x024f0600, 0x033d031d, 0x0004a263, 0x035248da, 0x00cdc55f, 0x01d85ea9, 0x0013531c}}}, + {X: Field{[10]uint32{0x037177a9, 0x031cb229, 0x01108ee7, 0x0303b867, 0x003c4853, 0x02c25ab0, 0x0045b39f, 0x036ae72f, 0x0109d68f, 0x000db28a}}, Y: Field{[10]uint32{0x024301b0, 0x00588234, 0x02ed6905, 0x018cc384, 0x0269cbf3, 0x00519e97, 0x033d0953, 0x00a58217, 0x01dfc825, 0x00193d44}}}, + {X: Field{[10]uint32{0x02a306e0, 0x00d1c0a3, 0x00cf3807, 0x023ad35c, 0x0358dd91, 0x036c9bc3, 0x001ca9c2, 0x03f5f308, 0x00d51f3f, 0x003d8a2e}}, Y: Field{[10]uint32{0x00adc2e8, 0x00d82ef6, 0x01c1ea2d, 0x01f798ca, 0x03b7c2d7, 0x03d55f7b, 0x00d6eb27, 0x00ba6cba, 0x00e30ea8, 0x0002f5af}}}, + {X: Field{[10]uint32{0x00e67c1b, 0x010454b0, 0x02f2586e, 0x035d8400, 0x00b44fa7, 0x0340d435, 0x026922c9, 0x00b02eca, 0x03f500a8, 0x003ede9a}}, Y: Field{[10]uint32{0x02702da1, 0x017af252, 0x02cfb034, 0x00cc8e86, 0x018419fc, 0x03fa3cfa, 0x01f1406e, 0x031c0c00, 0x0037f1c9, 0x00304a87}}}, + {X: Field{[10]uint32{0x0278d092, 0x0247ef3f, 0x03033753, 0x00769696, 0x01bf8ec0, 0x0003231d, 0x014080f4, 0x00abcb7c, 0x01195c3e, 0x00308246}}, Y: Field{[10]uint32{0x031adeb9, 0x01ad8c83, 0x01e6c382, 0x0063a203, 0x037aec38, 0x02d9b0c9, 0x007b1fa3, 0x036acfbe, 0x016fcbeb, 0x002cc1ed}}}, + {X: Field{[10]uint32{0x013192d1, 0x02ff8a2f, 0x0003e8d1, 0x03e3466f, 0x0073c3be, 0x00ddd292, 0x02d7c4c9, 0x009fea81, 0x03893d17, 0x001d89f7}}, Y: Field{[10]uint32{0x028451e1, 0x01c9ac6d, 0x026f4bcf, 0x033fdb4d, 0x021326da, 0x001ddb14, 0x029a865f, 0x0157dea8, 0x036c36f4, 0x000d7499}}}, + {X: Field{[10]uint32{0x002c62b9, 0x012ca580, 0x01639ed5, 0x01cf2c16, 0x01a3df6f, 0x036ff80d, 0x025df658, 0x00cea5b4, 0x01187c9f, 0x00099999}}, Y: Field{[10]uint32{0x0286630d, 0x00096931, 0x037ba468, 0x02bbd2a5, 0x02c4e7fc, 0x00d5aa1d, 0x01fe7578, 0x01789a94, 0x03c7d34a, 0x002ecc2e}}}, + {X: Field{[10]uint32{0x022ac683, 0x02fce931, 0x037bbc7a, 0x017dcd60, 0x01ef8b12, 0x03ca9bdc, 0x006a02e8, 0x000b9df7, 0x0185fa98, 0x000ef6a4}}, Y: Field{[10]uint32{0x00a05b85, 0x00b95300, 0x02118936, 0x0172ec32, 0x0222b347, 0x002b8e1d, 0x0075a76a, 0x005e135e, 0x032bc11d, 0x00080bb7}}}, + {X: Field{[10]uint32{0x003a5c4d, 0x00cf5ae6, 0x00097bc0, 0x022dfd49, 0x023be197, 0x0215c348, 0x0313c714, 0x02d93604, 0x00de4486, 0x000be42f}}, Y: Field{[10]uint32{0x00384f89, 0x03f69c6f, 0x01705270, 0x027b3d5e, 0x01f4aa75, 0x0332a677, 0x01b2e300, 0x0351d4d9, 0x02502028, 0x0018e193}}}, + {X: Field{[10]uint32{0x00becda7, 0x02f3ef32, 0x01cb6562, 0x0309b1c7, 0x017083ed, 0x0327f35c, 0x0192e654, 0x0039bf72, 0x01d4e9b0, 0x002224fd}}, Y: Field{[10]uint32{0x0238ab50, 0x00c4ed2c, 0x003130fe, 0x0275b36e, 0x02a80fa2, 0x03831a65, 0x03566a1f, 0x0041d3ef, 0x00558e63, 0x0007ebcc}}}, + {X: Field{[10]uint32{0x0155abba, 0x030d2561, 0x0237d855, 0x0094c273, 0x00f482fc, 0x0369cd44, 0x024fac54, 0x01778fb6, 0x02e686be, 0x002b3f12}}, Y: Field{[10]uint32{0x02c52d87, 0x01c5a14a, 0x0037cb90, 0x01f3e6f4, 0x0176423f, 0x03b0a47f, 0x03a5b998, 0x0229ab4d, 0x0197d187, 0x000e1fd1}}}, + {X: Field{[10]uint32{0x0017a469, 0x00a95788, 0x020d9542, 0x039f5d19, 0x01d5fe35, 0x00a2948a, 0x03a892dd, 0x03a620bc, 0x0090a4c5, 0x000ab134}}, Y: Field{[10]uint32{0x03086c09, 0x03095c77, 0x01914a3b, 0x00afdd68, 0x01927d17, 0x03639a1a, 0x0279f2d7, 0x03b1151e, 0x01162aa3, 0x0018163d}}}, + {X: Field{[10]uint32{0x02badef6, 0x03d6139f, 0x0024e9c9, 0x03b09430, 0x02c9b1a3, 0x004f1f98, 0x03c235cd, 0x0315cb96, 0x013ffc13, 0x00004dfb}}, Y: Field{[10]uint32{0x02c6fdba, 0x0214daa3, 0x00bf54fb, 0x030bcdeb, 0x010319e7, 0x0321d63c, 0x003ff023, 0x013d442d, 0x01cc3a46, 0x000307a5}}}, + {X: Field{[10]uint32{0x033ecfe4, 0x013615fb, 0x02002cfe, 0x03dd63c2, 0x006cfb16, 0x00454ae5, 0x009f6068, 0x0228f4b2, 0x037a7214, 0x0000a280}}, Y: Field{[10]uint32{0x03973d10, 0x02ce613e, 0x03aa8a1b, 0x0093ea40, 0x02ec5951, 0x031b9e8e, 0x03788cf5, 0x037a6e34, 0x0250135c, 0x002cbd2d}}}, + {X: Field{[10]uint32{0x027a9eeb, 0x02b773c6, 0x000ae3bb, 0x016d7cd3, 0x0378ad6d, 0x01d869db, 0x01d426e8, 0x00cfef3a, 0x01518fd4, 0x000c0fb3}}, Y: Field{[10]uint32{0x01abb602, 0x0158ce66, 0x01385ea9, 0x00fa2761, 0x02cbd8dc, 0x009d72c6, 0x03a5945a, 0x02c67a59, 0x02443b73, 0x001a9ff2}}}, + {X: Field{[10]uint32{0x01533202, 0x008ce054, 0x0140a509, 0x01e7e2cc, 0x02c69cf0, 0x03595a6e, 0x001defd9, 0x03dc7099, 0x002e5680, 0x0033d8c1}}, Y: Field{[10]uint32{0x00eb4ee8, 0x03cd007b, 0x009b6b8f, 0x00ebd437, 0x00017664, 0x0386a90a, 0x01a20525, 0x03f715c6, 0x036dfb17, 0x000e7ccd}}}, + {X: Field{[10]uint32{0x031fe4b7, 0x01216a86, 0x0168c44f, 0x02a38b76, 0x0334a229, 0x0395b124, 0x0123b6f2, 0x027eda5a, 0x03efb4a4, 0x0033ebee}}, Y: Field{[10]uint32{0x029f9007, 0x034971b1, 0x02a160b5, 0x0260063e, 0x01f39506, 0x0075dbdc, 0x03afbc70, 0x005f8777, 0x034d4a9c, 0x003703b4}}}, + {X: Field{[10]uint32{0x010d363e, 0x034bcc4e, 0x0153d785, 0x01da6822, 0x004a7ffd, 0x00f1aa90, 0x0093ff7b, 0x009fa9a9, 0x01e10fd5, 0x003b038f}}, Y: Field{[10]uint32{0x027a35dd, 0x030a17e3, 0x03528fc5, 0x0303fcd4, 0x01723129, 0x005fd4f3, 0x02f3c6a7, 0x00d30420, 0x03ce3002, 0x00252f76}}}, + {X: Field{[10]uint32{0x032bcde0, 0x038a9012, 0x02f7f84b, 0x0213bac0, 0x0113e9cd, 0x000645af, 0x039c0c35, 0x008b3f52, 0x00d19144, 0x003c1f4f}}, Y: Field{[10]uint32{0x01637320, 0x007ddece, 0x018103aa, 0x001a2b8b, 0x01dfe912, 0x01b47dc1, 0x0048de51, 0x00c860df, 0x02facb39, 0x0033c325}}}, + {X: Field{[10]uint32{0x0248db10, 0x01c267cd, 0x003e2821, 0x01f799d9, 0x038a6fab, 0x00031e98, 0x0264ac0a, 0x00813a8c, 0x00b66f2e, 0x00129095}}, Y: Field{[10]uint32{0x02e5023a, 0x02acaf0b, 0x0157ac26, 0x0022eb2c, 0x01b187ab, 0x017df7e5, 0x03ef9891, 0x03f0d7be, 0x0229be93, 0x002d5443}}}, + {X: Field{[10]uint32{0x007774a8, 0x0204fa3a, 0x001d9b5d, 0x02c0e017, 0x01910285, 0x03d9c651, 0x02625829, 0x02bc74d7, 0x03cfb38e, 0x00015bce}}, Y: Field{[10]uint32{0x01ed9dc6, 0x029e9d74, 0x026bac57, 0x01c219df, 0x038a1e82, 0x0051fddc, 0x03f3e5ca, 0x01fe6a6a, 0x00e79e6b, 0x002a6e59}}}, + {X: Field{[10]uint32{0x03081295, 0x01586f9a, 0x03561ace, 0x021947f9, 0x01af6b98, 0x03aa9327, 0x02d95bff, 0x00bbf030, 0x034e07d3, 0x003e2763}}, Y: Field{[10]uint32{0x01bacc69, 0x03b1c663, 0x030d1449, 0x0145235d, 0x0075e48f, 0x01c61a65, 0x02656911, 0x00e19d8e, 0x031156a3, 0x003298cb}}}, + {X: Field{[10]uint32{0x03c5530b, 0x03948149, 0x02af9758, 0x00cf1b66, 0x032890b9, 0x007c3a4a, 0x02e4a075, 0x005bad42, 0x01a0d3e7, 0x00170de4}}, Y: Field{[10]uint32{0x03b34616, 0x03e2eae9, 0x021c3ca1, 0x0070cdab, 0x02c4ed86, 0x0244d24e, 0x01e30dae, 0x00b4445e, 0x03c62de5, 0x00113bc4}}}, + {X: Field{[10]uint32{0x03a38d27, 0x02804caa, 0x0233115f, 0x03c34e8f, 0x038ab94e, 0x01b3bab6, 0x00d71561, 0x0292b98b, 0x025ae6ba, 0x0009d21d}}, Y: Field{[10]uint32{0x03f69e48, 0x013c7c9d, 0x033590cd, 0x00cea4ec, 0x020f36b3, 0x031eba4a, 0x0105bbe6, 0x01dc3582, 0x019dde63, 0x001c7534}}}, + {X: Field{[10]uint32{0x0327e254, 0x00d8efae, 0x0145322e, 0x028116a5, 0x000d2c41, 0x01fb8f9e, 0x00e4ee18, 0x035de00b, 0x03a2f8ec, 0x002593c7}}, Y: Field{[10]uint32{0x00138a2e, 0x01598435, 0x022e6775, 0x0000ee60, 0x015137ae, 0x00b33988, 0x0081a5fa, 0x02a20fa5, 0x03cade64, 0x0031d12e}}}, + {X: Field{[10]uint32{0x01b8ca3b, 0x0217895e, 0x02754589, 0x001d3df4, 0x03ee758a, 0x01b0de7f, 0x003594fe, 0x0327ea14, 0x03758709, 0x0022fd81}}, Y: Field{[10]uint32{0x03dd51a4, 0x03986221, 0x03715a5a, 0x03b9c629, 0x02ccc193, 0x02c46343, 0x011cfb8f, 0x0375cbfd, 0x0192b3fb, 0x000f98e2}}}, + {X: Field{[10]uint32{0x02e06612, 0x008e3740, 0x015f5a10, 0x03603b83, 0x00fbff70, 0x036fb9e6, 0x03c5a95d, 0x008e70af, 0x01239189, 0x003e841c}}, Y: Field{[10]uint32{0x0168e7f1, 0x01311a3e, 0x03936c62, 0x0384b5dc, 0x02315a6b, 0x00757b07, 0x0133ea97, 0x02c29664, 0x015e1a4e, 0x00029833}}}, + {X: Field{[10]uint32{0x00975588, 0x00d39451, 0x0059383c, 0x00f2a251, 0x033fe250, 0x01e5f2e2, 0x03d145ef, 0x025ffb00, 0x02d09f6f, 0x0016d231}}, Y: Field{[10]uint32{0x006e30a0, 0x00428ea4, 0x03d83c64, 0x0114a01d, 0x02173d6c, 0x02597c4d, 0x0291762d, 0x0046f304, 0x02893526, 0x00113619}}}, + {X: Field{[10]uint32{0x02b94fd0, 0x03c6f2bb, 0x025b1ae8, 0x013552f2, 0x005d4e85, 0x0397a232, 0x025d1ea1, 0x01f8fca1, 0x03e823aa, 0x00203854}}, Y: Field{[10]uint32{0x006b9728, 0x01eb2ea8, 0x023f73ed, 0x00b01c60, 0x03c888a1, 0x03d3d904, 0x03a92d8e, 0x03046c04, 0x0229e435, 0x003b74ff}}}, + {X: Field{[10]uint32{0x01ccf2c4, 0x03b5b41e, 0x03e3dae7, 0x027c1ec7, 0x03cd25de, 0x0131b8a6, 0x0190dd15, 0x01d49b09, 0x01d977bf, 0x0005b889}}, Y: Field{[10]uint32{0x01710768, 0x00622b02, 0x0274dd85, 0x014b83e8, 0x0340088c, 0x033708ad, 0x02db82af, 0x01d551b4, 0x0123b9b5, 0x00381c0b}}}, + {X: Field{[10]uint32{0x01456938, 0x0247bf36, 0x013ce7a6, 0x028b78d6, 0x03bb064a, 0x02097af2, 0x021b65e7, 0x01b1d208, 0x020915a1, 0x0028d102}}, Y: Field{[10]uint32{0x00dbf40c, 0x01c24135, 0x0226bbe9, 0x00f79f0f, 0x0326fa5d, 0x03d0de99, 0x001323a7, 0x00aa3d59, 0x02a03a58, 0x003fdf1e}}}, + {X: Field{[10]uint32{0x01aa2b5f, 0x00c3a7b3, 0x037c80a0, 0x000e4fac, 0x018d6072, 0x00b564e1, 0x0320401f, 0x0111a008, 0x034cd116, 0x0020550c}}, Y: Field{[10]uint32{0x033d5142, 0x004e7196, 0x03d54150, 0x0361f55c, 0x0017126a, 0x02824522, 0x030676f4, 0x03939ec3, 0x014e5f97, 0x002ee902}}}, + {X: Field{[10]uint32{0x014d93c7, 0x039a96df, 0x01efa329, 0x0184f86d, 0x02fe7f23, 0x0138265d, 0x0092b257, 0x02eb28e8, 0x00ca27b5, 0x003244d2}}, Y: Field{[10]uint32{0x0176b44a, 0x0079cf16, 0x036399d6, 0x02550257, 0x01e7c372, 0x0006fed6, 0x020e62dc, 0x0268b141, 0x010de9d4, 0x00338907}}}, + {X: Field{[10]uint32{0x026e8a88, 0x0096435f, 0x024363ba, 0x0101cdf9, 0x01cf3629, 0x0272a592, 0x0235e995, 0x02b5319d, 0x01a879fe, 0x0025022d}}, Y: Field{[10]uint32{0x03994fc0, 0x005d915f, 0x00fdfcbf, 0x034a12e0, 0x00e02155, 0x007d1825, 0x02858d52, 0x004306fc, 0x010a26c7, 0x003842d0}}}, + {X: Field{[10]uint32{0x02bdd2ce, 0x00f9f975, 0x01b92e7d, 0x02436408, 0x02f80ddf, 0x02160aab, 0x020a159f, 0x0122e1e7, 0x0158eefe, 0x002e1474}}, Y: Field{[10]uint32{0x02d85469, 0x02f6a8b1, 0x0293f06a, 0x036394dd, 0x0060facf, 0x0271f560, 0x00c53f06, 0x00908707, 0x02e10079, 0x000a42b8}}}, + {X: Field{[10]uint32{0x013d10fc, 0x01c79ab9, 0x005eb1b9, 0x02e15368, 0x0387e7a5, 0x0394d824, 0x00053875, 0x00801d96, 0x034d4a7c, 0x00274c82}}, Y: Field{[10]uint32{0x01d7c456, 0x000fd1c9, 0x0306e796, 0x018729a0, 0x009b44be, 0x039e0ec3, 0x022acd0a, 0x006435a0, 0x037b6a1f, 0x0013dab2}}}, + {X: Field{[10]uint32{0x018ac7b5, 0x002a7a0d, 0x004c22f3, 0x0053401d, 0x01eaa491, 0x004e9362, 0x0386799d, 0x03b1953f, 0x00107b29, 0x001b5de6}}, Y: Field{[10]uint32{0x03823950, 0x028f9e76, 0x038804b0, 0x00d00ee8, 0x0177b2a3, 0x03899731, 0x0060a2ac, 0x013c26e8, 0x03cc105c, 0x0023de64}}}, + {X: Field{[10]uint32{0x017f6489, 0x02476a79, 0x0372d73c, 0x001cb209, 0x00680c96, 0x02015b4a, 0x017d62db, 0x013eda68, 0x02ce77e1, 0x002f6cb4}}, Y: Field{[10]uint32{0x03aa590d, 0x02790b96, 0x030c184c, 0x00000f0a, 0x0008a3bc, 0x029bd592, 0x038ecede, 0x00ec6773, 0x0371d43c, 0x0002707b}}}, + {X: Field{[10]uint32{0x0055b3fa, 0x03ff68fc, 0x02dea741, 0x02a34286, 0x001f7897, 0x01ceec16, 0x01b4787f, 0x002a5293, 0x00ff1ab7, 0x00126a33}}, Y: Field{[10]uint32{0x006ba426, 0x024a0a9b, 0x0243d8bd, 0x0053f5b7, 0x0115b419, 0x03814eb5, 0x02414ed6, 0x03af47b8, 0x02772049, 0x003ca634}}}, + {X: Field{[10]uint32{0x029d2236, 0x0285ce9d, 0x000d77f1, 0x014ad441, 0x013b3d56, 0x00c5e80b, 0x0267992d, 0x02dec158, 0x016eb466, 0x00328fdf}}, Y: Field{[10]uint32{0x02145c37, 0x036ec4a3, 0x021b7126, 0x02b7dbc6, 0x0090e538, 0x025a90b0, 0x00e6f2bf, 0x00e13bde, 0x02259dcf, 0x00289b58}}}, + {X: Field{[10]uint32{0x037176e4, 0x03a98c1c, 0x0065bc00, 0x02b699af, 0x01902e9c, 0x003422e6, 0x038469cb, 0x009f46d1, 0x0214f1c4, 0x002d9cb3}}, Y: Field{[10]uint32{0x00865efa, 0x022fdd9a, 0x03eddb81, 0x0142e312, 0x0083f4f5, 0x00f1695b, 0x020f1aff, 0x0145d89e, 0x01790001, 0x0005db02}}}, + {X: Field{[10]uint32{0x029c199b, 0x03244ebb, 0x0168bda3, 0x01e23cba, 0x022c26dd, 0x010dde2a, 0x01b6866f, 0x01886f5b, 0x0357d4ad, 0x002f72ea}}, Y: Field{[10]uint32{0x00df5603, 0x01548ca2, 0x03c11240, 0x003ba4f1, 0x021cee9f, 0x03585a36, 0x0075a338, 0x004ff5f7, 0x00729bb2, 0x001e61a2}}}, + {X: Field{[10]uint32{0x01fbf9f5, 0x00e12c95, 0x001961cb, 0x03420b60, 0x020d5bee, 0x0317d08f, 0x0064aa96, 0x01f7d5d3, 0x031e382f, 0x003d7c97}}, Y: Field{[10]uint32{0x02210221, 0x0277febc, 0x0324c98a, 0x01a03849, 0x00f54bc0, 0x02942934, 0x0393a829, 0x012ab960, 0x030b5ad8, 0x003a8e23}}}, + {X: Field{[10]uint32{0x02ae09c3, 0x002e2505, 0x0250aa73, 0x01261689, 0x03603720, 0x009d1f10, 0x026e280b, 0x02ae7872, 0x0064f9f8, 0x0034a841}}, Y: Field{[10]uint32{0x029c5962, 0x033da2c8, 0x01b454fd, 0x03aeacf0, 0x032c9ffa, 0x00b240ba, 0x00d8dcaf, 0x0194cc0a, 0x01ed8dc4, 0x003465c6}}}, + {X: Field{[10]uint32{0x00410038, 0x02068008, 0x0291cc5f, 0x00ffcffd, 0x0119058c, 0x03979aa9, 0x01221058, 0x01312f15, 0x02fee672, 0x00224956}}, Y: Field{[10]uint32{0x023fd7bd, 0x01f62bf6, 0x013e6914, 0x02d19c5c, 0x00c833c3, 0x03eead40, 0x0352ffb4, 0x0324d046, 0x02dd9560, 0x00023589}}}, + {X: Field{[10]uint32{0x016e3952, 0x004bef55, 0x03f94beb, 0x03c81b24, 0x015165e3, 0x01e06406, 0x027d73f5, 0x03bbb8a9, 0x0042c5ec, 0x001791a3}}, Y: Field{[10]uint32{0x00f240de, 0x01994163, 0x021edc38, 0x02d0e92b, 0x03ce1fde, 0x00c39003, 0x00b6a8c3, 0x025f8aae, 0x024a467f, 0x002be0f8}}}, + {X: Field{[10]uint32{0x019c4e2c, 0x021401fa, 0x0036d7fc, 0x023a4e14, 0x03552caf, 0x03d52ac0, 0x006850e8, 0x00662fd8, 0x03ac9eca, 0x001c30af}}, Y: Field{[10]uint32{0x02ea37b3, 0x03fadb35, 0x00591544, 0x010034b1, 0x023b45d9, 0x0033dd65, 0x00f99392, 0x02b95e2a, 0x0365f5ff, 0x00180c88}}}, + {X: Field{[10]uint32{0x01c2f318, 0x0107032e, 0x001eeab6, 0x006993a4, 0x03bbb0db, 0x031e58c3, 0x000f86d7, 0x01ad0814, 0x013afe5f, 0x0005850f}}, Y: Field{[10]uint32{0x036a8a94, 0x022c91f5, 0x01e68ecb, 0x009132b4, 0x039fd749, 0x0134734d, 0x0109561d, 0x02075e04, 0x00140bdf, 0x001c1e3a}}}, + {X: Field{[10]uint32{0x02b62bce, 0x01ba5985, 0x03ed029f, 0x02ddce82, 0x03e1326e, 0x003fd82a, 0x025b0346, 0x0059136c, 0x02ada934, 0x0022b0cf}}, Y: Field{[10]uint32{0x00945cc6, 0x0276ff46, 0x0005dc6d, 0x013f6918, 0x00ea9e61, 0x0266f694, 0x0055d0ed, 0x0062d2f4, 0x03566f0d, 0x0001b41d}}}, + {X: Field{[10]uint32{0x0166e22a, 0x02a78189, 0x03ce771e, 0x0096843e, 0x0270cb33, 0x038323ad, 0x01f01166, 0x03abf7bd, 0x00b89e7f, 0x0011dae6}}, Y: Field{[10]uint32{0x02a91050, 0x01743875, 0x03f4730c, 0x0176e03e, 0x00fd98bd, 0x0004bc88, 0x0138483c, 0x00ae19f8, 0x00418325, 0x000e36fc}}}, + {X: Field{[10]uint32{0x01497f11, 0x03114fbb, 0x03058a19, 0x01fc64a5, 0x012e383a, 0x0086b7e8, 0x0302bcb3, 0x0270ef4c, 0x02eff0de, 0x00393498}}, Y: Field{[10]uint32{0x022781d3, 0x01f3def3, 0x0050bfec, 0x0039f008, 0x01953d0c, 0x03a92400, 0x02070c49, 0x0048323c, 0x00fc2fd6, 0x00287e0c}}}, + {X: Field{[10]uint32{0x00b5cbf8, 0x0303f3fc, 0x019871be, 0x01e5065b, 0x03e2e092, 0x027ccf99, 0x00c4f7cb, 0x02f86fc6, 0x010f48f0, 0x0019ef21}}, Y: Field{[10]uint32{0x0352d32f, 0x0373ae17, 0x03355526, 0x02f24b83, 0x01b7e6fa, 0x034bc833, 0x013e9271, 0x0292c91a, 0x0070334a, 0x00389581}}}, + {X: Field{[10]uint32{0x02ef2797, 0x0147849c, 0x02b8d58f, 0x029689c4, 0x02b543a6, 0x00aac9d3, 0x024be020, 0x01250895, 0x02c5c0dd, 0x0014372c}}, Y: Field{[10]uint32{0x02b04ea0, 0x0227e352, 0x03ca890d, 0x01a8bddf, 0x038d2ea1, 0x01c17732, 0x03854b49, 0x01132671, 0x036fb69c, 0x000b2f00}}}, + {X: Field{[10]uint32{0x0358bd6e, 0x029edda1, 0x0287644b, 0x013a2644, 0x01f86080, 0x0377d599, 0x00a57f1b, 0x0123d07a, 0x01777849, 0x001b26f1}}, Y: Field{[10]uint32{0x03b3ff20, 0x003fd13a, 0x00260cd4, 0x005724a0, 0x03a04019, 0x00892406, 0x029ca3d1, 0x02b211cc, 0x01f35998, 0x0021299c}}}, + {X: Field{[10]uint32{0x0382a868, 0x01f12520, 0x010e7a33, 0x011919ce, 0x0128b441, 0x0231bab4, 0x03ceb361, 0x036ee67c, 0x03c6d27c, 0x00176b24}}, Y: Field{[10]uint32{0x002df508, 0x0292fe0d, 0x02d8bac2, 0x02e38c57, 0x008a91c2, 0x025dc13e, 0x034578aa, 0x0020b9d0, 0x00651805, 0x002195c8}}}, + {X: Field{[10]uint32{0x01780c86, 0x00af9f21, 0x0196f2ed, 0x002ad1ae, 0x03f6b2a4, 0x00c1cf03, 0x02e9484d, 0x015f85e9, 0x03c65e1c, 0x00081e40}}, Y: Field{[10]uint32{0x03f6a442, 0x018cf051, 0x02c14854, 0x020c4569, 0x020bbdcb, 0x00f85e8e, 0x00fd3107, 0x01353db1, 0x00202956, 0x0012d5a1}}}, + {X: Field{[10]uint32{0x02dc2f90, 0x0118884b, 0x011dd295, 0x01320a44, 0x036ffbc9, 0x00a0a0c3, 0x03351132, 0x024fa4ea, 0x03639be5, 0x00368097}}, Y: Field{[10]uint32{0x016d2723, 0x0250e0e4, 0x02e68eb6, 0x02997bd2, 0x00714def, 0x006b3d72, 0x02dea9a2, 0x0395dbc3, 0x01eba315, 0x0026d2b3}}}, + {X: Field{[10]uint32{0x02823cb1, 0x002943ec, 0x02ea5603, 0x03d7b91f, 0x012a0f61, 0x021f3c64, 0x026ffa6b, 0x02272084, 0x02cd01b4, 0x000c9fea}}, Y: Field{[10]uint32{0x00c33b9b, 0x03e7b3ee, 0x037e96b7, 0x019d7f85, 0x0314c00c, 0x000f97e2, 0x00c5ac29, 0x00026c51, 0x03426010, 0x00018d2a}}}, + {X: Field{[10]uint32{0x037e8084, 0x0091561e, 0x010cc79a, 0x005fd6fd, 0x006c9cab, 0x02746ff6, 0x013478ba, 0x03d18aa1, 0x03ee1619, 0x001133fe}}, Y: Field{[10]uint32{0x008e7da4, 0x031c535d, 0x01f64563, 0x00703f8d, 0x0176442a, 0x0041e691, 0x02f8c288, 0x0278a1fa, 0x03db6207, 0x002c2260}}}, + {X: Field{[10]uint32{0x02a6fe3a, 0x0085c381, 0x0393a43a, 0x02141203, 0x03beb197, 0x00d3477a, 0x01ad6797, 0x00338b08, 0x01ca1373, 0x00317651}}, Y: Field{[10]uint32{0x023cc3fb, 0x01efc6eb, 0x02f0446e, 0x03ec328f, 0x0374102f, 0x0392a707, 0x03f72878, 0x01c503d9, 0x011b4d8b, 0x0028eab4}}}, + {X: Field{[10]uint32{0x02c0de31, 0x0290b873, 0x019e677f, 0x03d90d4d, 0x01d4bf22, 0x03c76c3b, 0x032694b8, 0x03a4d446, 0x031984df, 0x003d3633}}, Y: Field{[10]uint32{0x01a30845, 0x02e970ba, 0x03f020c0, 0x01753ec3, 0x025b48a5, 0x01f8eff7, 0x02d76bfc, 0x0062035e, 0x01223aae, 0x0020f40b}}}, + {X: Field{[10]uint32{0x0037c4cd, 0x002b9f06, 0x02e707e5, 0x0387854e, 0x03a2dce0, 0x0343c3b9, 0x006380af, 0x002f2243, 0x01dc8e7b, 0x0004f5c8}}, Y: Field{[10]uint32{0x00841116, 0x01844ba2, 0x00d28e97, 0x004b57c5, 0x009309c4, 0x002bdf93, 0x039e8237, 0x015045fa, 0x01e3e157, 0x00318830}}}, + {X: Field{[10]uint32{0x0265ce1a, 0x018b8458, 0x01783928, 0x013389ec, 0x02516482, 0x013076bc, 0x03eb55d9, 0x019ca081, 0x03a666fc, 0x00397e7b}}, Y: Field{[10]uint32{0x000d9975, 0x00bc8f57, 0x0156c771, 0x033d4f82, 0x0201f0f3, 0x018f5e6d, 0x03f9fbe1, 0x00aed48b, 0x03e61830, 0x001402a7}}}, + {X: Field{[10]uint32{0x0319c9ec, 0x0180f0f0, 0x016988da, 0x038290fa, 0x02a48ea0, 0x009ec6cc, 0x027abb98, 0x0284dd96, 0x00bd0a1b, 0x001cfb8f}}, Y: Field{[10]uint32{0x02b38f58, 0x017b1686, 0x00744b0a, 0x03408386, 0x03bbc909, 0x00ba097c, 0x0330bd5a, 0x01a272fa, 0x02b44093, 0x00365a0c}}}, + {X: Field{[10]uint32{0x01990d91, 0x0074b3f1, 0x0255df10, 0x0007c09e, 0x003e0285, 0x0089d429, 0x03285e71, 0x01aeea04, 0x03c59404, 0x00046e4b}}, Y: Field{[10]uint32{0x00315417, 0x0245c5a9, 0x03b639fe, 0x03347655, 0x0023b324, 0x002526cb, 0x01cfcd08, 0x033f8103, 0x00aae20f, 0x003822c9}}}, + {X: Field{[10]uint32{0x0160935b, 0x032873e4, 0x006a0623, 0x0148d8bc, 0x01b1bf49, 0x008a9897, 0x014442a0, 0x003717ec, 0x029c22be, 0x000c10d9}}, Y: Field{[10]uint32{0x00d0eb34, 0x034b2189, 0x00a2206d, 0x02c9724b, 0x0341eead, 0x0349b886, 0x0152c044, 0x01f5afeb, 0x00b04bf4, 0x0037120d}}}, + {X: Field{[10]uint32{0x015f9a0c, 0x02d71f4f, 0x00495132, 0x0185aa72, 0x023f92aa, 0x001f7b12, 0x007622b4, 0x034510ae, 0x01aac290, 0x0012430e}}, Y: Field{[10]uint32{0x0126b986, 0x01a36b8a, 0x021eab3d, 0x03799dcf, 0x03110f87, 0x00f2cc53, 0x001361f7, 0x012a9bfa, 0x00fd5784, 0x00171db0}}}, + {X: Field{[10]uint32{0x0002d03a, 0x02c90ce4, 0x03f2d2bb, 0x02528f82, 0x023a4caf, 0x01cac310, 0x01fb2127, 0x00cd1f28, 0x015867d7, 0x003f7573}}, Y: Field{[10]uint32{0x03411995, 0x033a425d, 0x0117210b, 0x01321762, 0x01bd69f8, 0x02f25369, 0x035bcc06, 0x01af1dbe, 0x0007d1d2, 0x003bf97d}}}, + {X: Field{[10]uint32{0x00435ea9, 0x031405c5, 0x012d80e9, 0x02272b46, 0x00e2d359, 0x01956b10, 0x03db2722, 0x003f3910, 0x008eb083, 0x002f2284}}, Y: Field{[10]uint32{0x03c979f9, 0x01a6e4f8, 0x00d60220, 0x03d8a41f, 0x0076bd3a, 0x024c65b0, 0x008a384b, 0x0369d29c, 0x0258cbc3, 0x00249300}}}, + {X: Field{[10]uint32{0x02924b44, 0x0177e3ab, 0x02e3b339, 0x02904054, 0x012c706e, 0x00626273, 0x02e431a7, 0x02db2e1a, 0x036e41f4, 0x003b6026}}, Y: Field{[10]uint32{0x00315da8, 0x0326ff19, 0x01f8a324, 0x02642c46, 0x00bede66, 0x0251eaa2, 0x0142ffe0, 0x01562723, 0x005c0329, 0x0004d760}}}, + {X: Field{[10]uint32{0x00da52d8, 0x02145edb, 0x03276797, 0x0049e7a7, 0x00043982, 0x0390b5aa, 0x007d2f1e, 0x00781d05, 0x02c75d87, 0x0009ad42}}, Y: Field{[10]uint32{0x005dd7a0, 0x011aeb55, 0x005180e3, 0x02814879, 0x021fe37e, 0x00d253c3, 0x014b4c80, 0x01ba7c2c, 0x00638642, 0x00099667}}}, + {X: Field{[10]uint32{0x03e8efd5, 0x02e53527, 0x01dd725a, 0x00419de1, 0x01679f6b, 0x02241f3c, 0x02746ff9, 0x033351fd, 0x00de27d0, 0x00333b62}}, Y: Field{[10]uint32{0x03f5729a, 0x037d0f5c, 0x00825fe4, 0x019f38af, 0x00e2beba, 0x014ad09a, 0x036adc2c, 0x0212b2d2, 0x022b4dc5, 0x0016c3b7}}}, + {X: Field{[10]uint32{0x003c6249, 0x02a20f76, 0x032bb52d, 0x005863d1, 0x02bf3fe5, 0x01e221b3, 0x00429c11, 0x018cc8c2, 0x03cb3152, 0x00363b7d}}, Y: Field{[10]uint32{0x03984be3, 0x036bc1c5, 0x033437f3, 0x0201ad21, 0x0108c71b, 0x002e9a47, 0x03427e13, 0x03bbdb50, 0x003ec155, 0x00295aaf}}}, + {X: Field{[10]uint32{0x0164b4ef, 0x02dc711d, 0x02515c2f, 0x00414fd9, 0x02526489, 0x035b23f3, 0x0149aa5c, 0x00e9d542, 0x03c9f8db, 0x003b60b0}}, Y: Field{[10]uint32{0x00b2f0b4, 0x03a3f948, 0x00f39b06, 0x032057f3, 0x0141ddcc, 0x0112a291, 0x029a26d4, 0x034f1dbe, 0x014906d9, 0x0017b966}}}, + {X: Field{[10]uint32{0x018ca937, 0x006b910f, 0x0365e777, 0x02b61620, 0x005853b3, 0x01b54212, 0x026249d5, 0x03ad5017, 0x03aee89a, 0x001b89de}}, Y: Field{[10]uint32{0x01f40b8e, 0x01f408ce, 0x025b403f, 0x03713892, 0x008f9623, 0x00e845c3, 0x01a3fe66, 0x02529f0c, 0x03d81e6f, 0x002121c6}}}, + {X: Field{[10]uint32{0x00a03c5c, 0x00abee52, 0x00967f70, 0x0109d9da, 0x00f2f8b6, 0x0386bfe5, 0x01b12293, 0x00484159, 0x02c86727, 0x002bad9e}}, Y: Field{[10]uint32{0x00bde197, 0x0034875e, 0x0289b698, 0x02fcdc1f, 0x02747100, 0x01bfd6b1, 0x027898d6, 0x02700f37, 0x01889425, 0x003f34f1}}}, + {X: Field{[10]uint32{0x0283da79, 0x01f381d4, 0x03af23ba, 0x024e8f44, 0x00457531, 0x00e18cfa, 0x00967d1e, 0x031d5a53, 0x034baa20, 0x0027c1ff}}, Y: Field{[10]uint32{0x03f2136b, 0x017edff7, 0x02e36397, 0x03df656e, 0x0014308c, 0x02b28fc7, 0x03c5f363, 0x0185a3fc, 0x030d49d0, 0x002ba2df}}}, + {X: Field{[10]uint32{0x013e1520, 0x00e5755c, 0x03df7243, 0x0325dab3, 0x03baafc3, 0x02f15406, 0x004b3ef7, 0x036ae859, 0x0114a026, 0x0009011b}}, Y: Field{[10]uint32{0x02029ae6, 0x0219f32a, 0x016cd321, 0x0202eb43, 0x0037fd53, 0x00554d2d, 0x013cd0e9, 0x0028c6ea, 0x01e96dc4, 0x00099521}}}, + {X: Field{[10]uint32{0x033de519, 0x02f08cca, 0x010c913b, 0x02adf67e, 0x011806af, 0x015d39ae, 0x0344f48c, 0x03471a00, 0x0126bf8f, 0x00004dda}}, Y: Field{[10]uint32{0x01a61fa5, 0x02f9e575, 0x01ced56e, 0x014685d5, 0x018aed90, 0x01f4da5b, 0x02b2198e, 0x01309be1, 0x00e7c4b4, 0x0028d040}}}, + {X: Field{[10]uint32{0x035a7d6e, 0x03268fbb, 0x015f11ef, 0x02996073, 0x025e4c38, 0x0045aba0, 0x037c85fb, 0x0319a21f, 0x014e816c, 0x00250f1b}}, Y: Field{[10]uint32{0x029de8dd, 0x00c69825, 0x02b24eca, 0x01c0c5a7, 0x0274112f, 0x0220fb8d, 0x02351657, 0x0369b4a7, 0x0324f618, 0x00364f51}}}, + {X: Field{[10]uint32{0x005432d9, 0x002023a2, 0x03f53d4d, 0x0252bd82, 0x03a0f46e, 0x017d3e19, 0x03c9e61d, 0x0183f72b, 0x001f1592, 0x002b7e01}}, Y: Field{[10]uint32{0x03e57958, 0x01680dc6, 0x02d952b9, 0x01779b0f, 0x02c055ff, 0x03a42cdb, 0x0331bcbb, 0x0145bcf5, 0x021f99d2, 0x00313aae}}}, + {X: Field{[10]uint32{0x022dcc44, 0x014df01b, 0x01bb8d96, 0x01860c97, 0x01dc0d94, 0x001ea7ea, 0x01defb67, 0x02b82047, 0x0313a404, 0x0005705f}}, Y: Field{[10]uint32{0x01b6898e, 0x03ce0eba, 0x01dc679d, 0x01898359, 0x01a799fb, 0x0144b5e7, 0x0042b482, 0x0257a0da, 0x0352021f, 0x0021d034}}}, + {X: Field{[10]uint32{0x02cb8ca0, 0x012df372, 0x0143580e, 0x03b46b0c, 0x00966ec9, 0x01ae04f7, 0x01bd5758, 0x01665271, 0x03356236, 0x0021eeee}}, Y: Field{[10]uint32{0x022a48c4, 0x01892a34, 0x00a36f83, 0x03a472b5, 0x036a28f4, 0x00928fa6, 0x0214ccbe, 0x00f09257, 0x012c1bfc, 0x00005666}}}, + {X: Field{[10]uint32{0x031fa105, 0x01705da7, 0x00daf95b, 0x00f35751, 0x03564da7, 0x02ba710c, 0x0082b5fe, 0x01530678, 0x004a0964, 0x000e6f45}}, Y: Field{[10]uint32{0x016fb207, 0x01dec4c9, 0x019bcfa2, 0x009ccc0c, 0x01dadf15, 0x030f2a3e, 0x02be12eb, 0x03535be2, 0x011c30b5, 0x003ffa28}}}, + {X: Field{[10]uint32{0x003bca7a, 0x02ef592a, 0x00a9ab78, 0x01dbba5c, 0x00a1c696, 0x0196cbd3, 0x0399bfe2, 0x030319ae, 0x034f9bce, 0x0031393a}}, Y: Field{[10]uint32{0x02bfc286, 0x012283a5, 0x03cb7c22, 0x00ed13f0, 0x012ecb49, 0x001798e0, 0x024be2bd, 0x02e712f3, 0x003d316c, 0x0006ee6a}}}, + {X: Field{[10]uint32{0x03244e69, 0x0392bb33, 0x01801488, 0x00d3d4f0, 0x028b53f0, 0x023280d7, 0x01dd2f44, 0x034cd3c3, 0x03831c80, 0x003060f9}}, Y: Field{[10]uint32{0x01a8b820, 0x00c362f6, 0x020b1593, 0x02552539, 0x0008ff2f, 0x03770203, 0x03389268, 0x007520f6, 0x02aac771, 0x003e663f}}}, + {X: Field{[10]uint32{0x02d47d92, 0x0309007f, 0x03b6be39, 0x03655d4e, 0x027ac812, 0x00dd3674, 0x013b630f, 0x038423c2, 0x03ac22a2, 0x00267475}}, Y: Field{[10]uint32{0x02d0e1f0, 0x031378d4, 0x008b039c, 0x00f70d9b, 0x0352080a, 0x00daa25e, 0x01ca3d9b, 0x038d07a3, 0x033488df, 0x000299f4}}}, + {X: Field{[10]uint32{0x0161cea5, 0x033324ab, 0x012bc5c3, 0x00e79fd7, 0x02985a33, 0x01a42420, 0x03d6f187, 0x0226ef7c, 0x025d16cd, 0x00381c02}}, Y: Field{[10]uint32{0x00a0b0f0, 0x025381dc, 0x007e3bd9, 0x00a529eb, 0x001fd08b, 0x02756708, 0x03ec97bc, 0x00fea102, 0x03e03895, 0x0009bdaa}}}, + {X: Field{[10]uint32{0x01a7e721, 0x021e8f98, 0x0268b554, 0x01734fe9, 0x025415e9, 0x01ea98bb, 0x03813b56, 0x0360e546, 0x02e8cf36, 0x002c66fd}}, Y: Field{[10]uint32{0x0170153d, 0x00fe2e46, 0x01041fc0, 0x016e9dc2, 0x0246c105, 0x030439c4, 0x019f59e4, 0x036cbb35, 0x00a5ca2c, 0x0018c39e}}}, + {X: Field{[10]uint32{0x0371fd44, 0x039b867f, 0x03943c6f, 0x01c870cc, 0x0039abaf, 0x025c051d, 0x0027adfa, 0x0343b220, 0x0156e90d, 0x00094024}}, Y: Field{[10]uint32{0x033afc11, 0x019b87d5, 0x01dec9c4, 0x0000b467, 0x01b78255, 0x02e4ce16, 0x014ed74c, 0x01d8c808, 0x03dc8647, 0x000c9011}}}, + {X: Field{[10]uint32{0x01a3e4ae, 0x02e14e18, 0x00681771, 0x007e588e, 0x02aca501, 0x03531402, 0x030c98d9, 0x0174726e, 0x03e8bbe4, 0x0011739f}}, Y: Field{[10]uint32{0x0392f8b1, 0x0018b908, 0x008327ca, 0x01d804d6, 0x019e41b1, 0x02db1fd9, 0x00725702, 0x02e3c297, 0x02afd1ad, 0x00232f08}}}, + {X: Field{[10]uint32{0x019ec059, 0x020522d8, 0x026834e3, 0x014d0ec4, 0x02b939e9, 0x028a1bbd, 0x03392120, 0x01ff19f7, 0x0107d3a2, 0x001cc955}}, Y: Field{[10]uint32{0x01c35b63, 0x013a4fc9, 0x00e28a35, 0x03b44d13, 0x00eeba10, 0x03b5b233, 0x00f3deda, 0x0008376c, 0x02e6e941, 0x000c5d35}}}, + {X: Field{[10]uint32{0x0011df58, 0x0002b072, 0x03885978, 0x00b68481, 0x03602596, 0x0322eb4f, 0x009a9458, 0x030e787b, 0x02f401c6, 0x0025acb3}}, Y: Field{[10]uint32{0x027fa8cd, 0x009271a2, 0x01a997d1, 0x00b660f7, 0x002fbf9e, 0x003000d7, 0x01ab5b7c, 0x02b498eb, 0x012141b4, 0x003b617b}}}, + {X: Field{[10]uint32{0x02b9c772, 0x00fbbd90, 0x01cdbb98, 0x0324dc09, 0x0357f23c, 0x0244aba1, 0x007bebb0, 0x02ca2a8c, 0x001cd941, 0x0015d906}}, Y: Field{[10]uint32{0x00ac7089, 0x0234afb8, 0x01b8ef2c, 0x0133cf38, 0x01249576, 0x0115e90f, 0x01f64375, 0x0023f76d, 0x034fc239, 0x003a05ce}}}, + {X: Field{[10]uint32{0x03ec1b61, 0x00a7b724, 0x02c60efd, 0x028e0aed, 0x02ea16d2, 0x0356c9e0, 0x031e3145, 0x0141580a, 0x00397e96, 0x000e3b1e}}, Y: Field{[10]uint32{0x018ec96e, 0x0353258c, 0x01089744, 0x00c47354, 0x02f522e6, 0x012fc995, 0x02caa3ba, 0x0378b362, 0x02a4c7b6, 0x002b3c13}}}, + {X: Field{[10]uint32{0x02c0b572, 0x03b55e5d, 0x01eb8b7a, 0x03752ca1, 0x0179c9f7, 0x0023dce2, 0x00439fa1, 0x0071e5d6, 0x038013d0, 0x001bb13b}}, Y: Field{[10]uint32{0x0098be7e, 0x006e8bf2, 0x004df13c, 0x01abd7cf, 0x017a6d26, 0x03adabc5, 0x026560e3, 0x03b37c0e, 0x0242e618, 0x0008ca39}}}, + {X: Field{[10]uint32{0x0377141b, 0x0249127b, 0x027ba884, 0x020713b5, 0x034c40a5, 0x029da1a0, 0x000fc149, 0x01ec6940, 0x036b30c2, 0x00363687}}, Y: Field{[10]uint32{0x01519758, 0x00ecd20b, 0x007dc49a, 0x0385c9ca, 0x03d92464, 0x00e4e1f5, 0x038c3108, 0x024b3c0a, 0x02d6876d, 0x00332d4c}}}, + {X: Field{[10]uint32{0x037ccb90, 0x03b458a3, 0x022b4e5f, 0x01b0ce1c, 0x026894d3, 0x032a1287, 0x02aa9f0e, 0x01c3b259, 0x00027349, 0x00213c95}}, Y: Field{[10]uint32{0x035cd8b1, 0x0308648c, 0x02944983, 0x00df4e51, 0x0109bee1, 0x027c18c6, 0x017d283d, 0x018c0b32, 0x0109f07e, 0x003cb5ff}}}, + {X: Field{[10]uint32{0x029503e3, 0x02cb7733, 0x00038136, 0x03533c02, 0x033adabf, 0x00761bfd, 0x01190e39, 0x010dca16, 0x02b55887, 0x003bd9d4}}, Y: Field{[10]uint32{0x03131c56, 0x00567e0f, 0x010f91e6, 0x0391850e, 0x0273f949, 0x02373e63, 0x03aa6759, 0x02d1e5f2, 0x0250013c, 0x0008f672}}}, + {X: Field{[10]uint32{0x0085ba6d, 0x02f0b004, 0x02a46602, 0x01d3f845, 0x00fe198f, 0x01df1ddb, 0x001cb52c, 0x0399f3d9, 0x01903b3f, 0x003e2361}}, Y: Field{[10]uint32{0x0208742d, 0x001fedee, 0x03a32405, 0x028a39b3, 0x0021da61, 0x0377c539, 0x0295714c, 0x02b5a28d, 0x02bd2178, 0x00162bca}}}, + {X: Field{[10]uint32{0x01b9c01c, 0x037805cb, 0x01354645, 0x03543457, 0x0218cde6, 0x0177b5f4, 0x01daaa8c, 0x02e5719d, 0x01bdd366, 0x0024edce}}, Y: Field{[10]uint32{0x01cf3627, 0x02e21b89, 0x03fb4748, 0x03c71f22, 0x017afea5, 0x02b83f2b, 0x03af5b96, 0x023aa98c, 0x01356c2f, 0x000093b1}}}, + {X: Field{[10]uint32{0x00443394, 0x00fc88c0, 0x00f95d41, 0x02496260, 0x006d313b, 0x02030455, 0x0382f801, 0x03968b6f, 0x0004da7a, 0x001ccb3d}}, Y: Field{[10]uint32{0x01596953, 0x035e2693, 0x01e431b7, 0x021054f2, 0x02e88200, 0x029dded5, 0x02eae580, 0x02e42a40, 0x03261758, 0x002163a0}}}, + {X: Field{[10]uint32{0x01d36e32, 0x0296652a, 0x02f7528e, 0x00ad6f92, 0x0365fc25, 0x006e0e2d, 0x002e024a, 0x0000b4fe, 0x03192c40, 0x003bf781}}, Y: Field{[10]uint32{0x01d9107b, 0x00be034f, 0x01483f0c, 0x02d5a751, 0x03b8dd69, 0x020ea71b, 0x02635851, 0x00d5da46, 0x035c3a15, 0x00227074}}}, + {X: Field{[10]uint32{0x02c90a15, 0x03764307, 0x034a6b42, 0x016e6c69, 0x02f114e6, 0x02a542f6, 0x0020c1cd, 0x00ce49d9, 0x02f28069, 0x0027bb6a}}, Y: Field{[10]uint32{0x03164de2, 0x022e81f4, 0x035337de, 0x03842b0e, 0x0226f427, 0x0134a314, 0x009728da, 0x010334c9, 0x00247fa5, 0x0004e677}}}, + {X: Field{[10]uint32{0x01433195, 0x034f5086, 0x017dd877, 0x031f52e8, 0x03775805, 0x03f6d21f, 0x01eaafeb, 0x028851a7, 0x028d342a, 0x0008fc3a}}, Y: Field{[10]uint32{0x03699b03, 0x02ff5182, 0x0306e4fc, 0x030e79f0, 0x0163444d, 0x0353a4f0, 0x032ca8d1, 0x02071574, 0x0231d2a4, 0x0037071b}}}, + {X: Field{[10]uint32{0x03e060b8, 0x032ddbaa, 0x0052c074, 0x003538cc, 0x02edd47c, 0x01a8c174, 0x0116e827, 0x02798162, 0x027058c2, 0x00003614}}, Y: Field{[10]uint32{0x010cfac8, 0x03f69baf, 0x012583a2, 0x02da2a68, 0x0384d497, 0x027a9264, 0x009e5105, 0x016ee57b, 0x0104e4db, 0x00268392}}}, + {X: Field{[10]uint32{0x009f28b8, 0x02411acc, 0x0363ad4d, 0x00ddeacd, 0x00f7d36b, 0x0033ce18, 0x022d2d19, 0x00481164, 0x015cccf9, 0x0006cd32}}, Y: Field{[10]uint32{0x0151e948, 0x0128478a, 0x0008f6f1, 0x03a246ed, 0x01f7080d, 0x0181f2d3, 0x0078c3d2, 0x0198ead9, 0x020c3f5f, 0x001c308c}}}, + {X: Field{[10]uint32{0x0384b228, 0x02851cd2, 0x028c28fc, 0x00d85263, 0x0289569d, 0x03c41c1e, 0x016d4e20, 0x0165aedd, 0x03dcae5e, 0x000c9563}}, Y: Field{[10]uint32{0x02038d86, 0x0241be45, 0x03cfb501, 0x0381d2db, 0x01fe63f6, 0x0356ab36, 0x03978c43, 0x01d56ec8, 0x00b75ed5, 0x001dd66a}}}, + {X: Field{[10]uint32{0x01984acd, 0x032c7a37, 0x02bf8577, 0x03b3e8f5, 0x016028d7, 0x00102bef, 0x01a38202, 0x02f15ce4, 0x037737d2, 0x00192062}}, Y: Field{[10]uint32{0x01ca2300, 0x001d225c, 0x03e1f057, 0x03b29c99, 0x012cf895, 0x0298c12f, 0x027b8914, 0x01553648, 0x01346ae9, 0x001080ae}}}, + {X: Field{[10]uint32{0x0177b333, 0x00b61f63, 0x031aae57, 0x0015cb86, 0x01bcd337, 0x010a2154, 0x02a23732, 0x01f2d50a, 0x02c6ec2d, 0x0031abda}}, Y: Field{[10]uint32{0x02c78cbf, 0x031f36b7, 0x023529fc, 0x022e17c8, 0x015d5af1, 0x034101fb, 0x02393bcd, 0x028b7c63, 0x01594ae5, 0x003fff95}}}, + {X: Field{[10]uint32{0x00f1cef0, 0x00378fa9, 0x02f13a8b, 0x00d0a3ba, 0x002e7a9e, 0x03ccbf51, 0x022a0317, 0x004be03e, 0x004494ea, 0x00247e3f}}, Y: Field{[10]uint32{0x0154dbcf, 0x03fdb669, 0x02a42481, 0x0097aba8, 0x03e76c22, 0x003309ab, 0x02765f42, 0x007742b1, 0x007ad81b, 0x0001a829}}}, + {X: Field{[10]uint32{0x01c1c017, 0x00ff1084, 0x016c8e35, 0x01848cd7, 0x02dc610a, 0x030056d1, 0x01b081fd, 0x03d5f21e, 0x01fa6a26, 0x0038566a}}, Y: Field{[10]uint32{0x013e8851, 0x0126beaa, 0x010b6bd7, 0x031f2a07, 0x00f1c181, 0x013077cb, 0x01656f9b, 0x0380269d, 0x0243445a, 0x00308271}}}, + {X: Field{[10]uint32{0x00f9330b, 0x02fae969, 0x01813556, 0x01a6e279, 0x031a7051, 0x001b4a0f, 0x011eda9c, 0x00ea5c48, 0x005e135f, 0x003a3a7f}}, Y: Field{[10]uint32{0x01af0abb, 0x02c4353a, 0x01553fe0, 0x02e7cff1, 0x01c88423, 0x03c7912d, 0x03b55fa6, 0x03a3db69, 0x00993b73, 0x003a2e5a}}}, + {X: Field{[10]uint32{0x000edead, 0x010d4daf, 0x035b1642, 0x0062bbbe, 0x0011aa98, 0x004ce12d, 0x0027ec6e, 0x013030db, 0x0129d5ae, 0x003cfd75}}, Y: Field{[10]uint32{0x033d34b9, 0x016f9876, 0x02ae533f, 0x00190f94, 0x021dd1e3, 0x03f1782a, 0x01abbc4f, 0x0304ccd1, 0x02431e40, 0x000fdd01}}}, + {X: Field{[10]uint32{0x00c81159, 0x013db5db, 0x0206a02e, 0x01727285, 0x0209eae6, 0x00505d80, 0x039acffe, 0x02ee6b86, 0x0030f5d8, 0x00316dd9}}, Y: Field{[10]uint32{0x032429c1, 0x03a1b633, 0x00fad0d2, 0x00ce6800, 0x0229b139, 0x02454e02, 0x00875916, 0x02426090, 0x03097008, 0x00201a27}}}, + {X: Field{[10]uint32{0x00fc09b0, 0x01442703, 0x00261e93, 0x0191ca25, 0x00ff2755, 0x03edb6d4, 0x02d30c9f, 0x0241d117, 0x00b434f5, 0x002552a9}}, Y: Field{[10]uint32{0x0072e4ad, 0x01974f43, 0x00ec5832, 0x01ba029c, 0x03a808b7, 0x00ec3f3c, 0x0176be8b, 0x00b095b3, 0x02861bad, 0x002008f2}}}, + {X: Field{[10]uint32{0x023d528b, 0x03c4cd5b, 0x00249d6d, 0x01512eed, 0x021b96ee, 0x002960cd, 0x020c9b93, 0x03cce4c0, 0x00bb4803, 0x0001576a}}, Y: Field{[10]uint32{0x02e5b64c, 0x03bdf38c, 0x02575799, 0x0134d568, 0x002387b1, 0x02805e17, 0x00bb209d, 0x03a7d61b, 0x0388ca06, 0x00373112}}}, + {X: Field{[10]uint32{0x03a1de03, 0x01fe2ee8, 0x0236877a, 0x02f285db, 0x01db59ea, 0x0098ad38, 0x02d48d3d, 0x02ca1ac2, 0x0000d810, 0x0020213a}}, Y: Field{[10]uint32{0x03dc1480, 0x0223f118, 0x00f85e08, 0x02b3acd2, 0x00070d60, 0x02f17e60, 0x0309c129, 0x0197f027, 0x029c59f8, 0x00362fba}}}, + {X: Field{[10]uint32{0x0318b39b, 0x03be9055, 0x00bd7f85, 0x005ec030, 0x03d15e02, 0x00252526, 0x00f49a15, 0x01fe21d2, 0x02c236c8, 0x0006caed}}, Y: Field{[10]uint32{0x01029c74, 0x006b4514, 0x001dc810, 0x00b02c3a, 0x00c3c3f4, 0x01afaa69, 0x03dd0180, 0x03cdbbc6, 0x01956aad, 0x0008592c}}}, + {X: Field{[10]uint32{0x00377872, 0x0368e295, 0x02d84830, 0x03667e46, 0x01de9139, 0x034bfafb, 0x01c65ce3, 0x030dcb97, 0x03e80125, 0x003ee9a1}}, Y: Field{[10]uint32{0x03e001c9, 0x00fb049c, 0x03f83092, 0x03c95fd2, 0x0355aabb, 0x0016a584, 0x00a7a821, 0x02540729, 0x02df03b8, 0x0022513a}}}, + {X: Field{[10]uint32{0x01560cbd, 0x038b7fbf, 0x03a948aa, 0x017bc246, 0x03d21e15, 0x0168b5e5, 0x00699c97, 0x0305bfe7, 0x0380a5f1, 0x002d6392}}, Y: Field{[10]uint32{0x02cec3ec, 0x02944a14, 0x02fec937, 0x01f64097, 0x0304606f, 0x00b5aaa5, 0x031b7f41, 0x02fe9b95, 0x02ba1429, 0x003ffe72}}}, + {X: Field{[10]uint32{0x0026edec, 0x03c5f38d, 0x02900fce, 0x01f2750e, 0x00114fdb, 0x00171af9, 0x0222551e, 0x01b08554, 0x0126da5d, 0x0023af35}}, Y: Field{[10]uint32{0x013aa97e, 0x01f7e194, 0x0021eae9, 0x00d2bbb7, 0x03de11f0, 0x014bd519, 0x02aafb1a, 0x0006d8fa, 0x03986b33, 0x001ce83e}}}, + {X: Field{[10]uint32{0x03ee325e, 0x0159a446, 0x00d2dbb9, 0x00c99010, 0x037354e0, 0x025c5526, 0x01c68f0e, 0x00a7a257, 0x000b924b, 0x003ee915}}, Y: Field{[10]uint32{0x0105ebd4, 0x039bd464, 0x0321b6c9, 0x009c5bd4, 0x02290f3c, 0x0394a10e, 0x02ba0d07, 0x015eb8d0, 0x00c33b98, 0x0014a422}}}, + {X: Field{[10]uint32{0x039c44de, 0x01bd3a2f, 0x025b0ab4, 0x025d946c, 0x02ce014c, 0x01bcfcdb, 0x006301a6, 0x034c91b6, 0x0097a1a7, 0x0022de8b}}, Y: Field{[10]uint32{0x00b247c7, 0x00ca3f69, 0x017b94cb, 0x02110ff0, 0x027c88a6, 0x007a9d4d, 0x006c1f47, 0x00d6cd9e, 0x00ab699c, 0x002e0a15}}}, + {X: Field{[10]uint32{0x02d2279c, 0x00e6963a, 0x0096f40c, 0x01dd2f52, 0x03931796, 0x006ea426, 0x0003bbba, 0x01c5539c, 0x03435adb, 0x00277c45}}, Y: Field{[10]uint32{0x01b884eb, 0x03c866d0, 0x02f8377e, 0x019775e8, 0x01d45668, 0x01eae190, 0x02913d6e, 0x0330db0d, 0x034ea216, 0x0029e48b}}}, + {X: Field{[10]uint32{0x02931cd8, 0x02b6b915, 0x03e9e414, 0x005707e6, 0x02c54b62, 0x01cc5224, 0x02fd9e73, 0x0111320b, 0x0384749b, 0x0016fade}}, Y: Field{[10]uint32{0x03abb95c, 0x0183a6cb, 0x01f7b64f, 0x03f3ad47, 0x03d32b7c, 0x03cc23bf, 0x02753fbf, 0x0029f0a3, 0x025f32cd, 0x00026790}}}, + {X: Field{[10]uint32{0x00788879, 0x004abd93, 0x02f43cd5, 0x01745c19, 0x01c9f8ed, 0x028edec2, 0x005114f4, 0x0012e9e3, 0x00430ff2, 0x000aa0c3}}, Y: Field{[10]uint32{0x02666c84, 0x02588c18, 0x0286561e, 0x00267b90, 0x009ba148, 0x0081fac0, 0x02827fed, 0x00994bae, 0x03a4e888, 0x00004948}}}, + {X: Field{[10]uint32{0x0057486a, 0x02488787, 0x014191b6, 0x00500670, 0x00985a77, 0x0334cb65, 0x00ab408b, 0x00a8639a, 0x02a14c1f, 0x003dc691}}, Y: Field{[10]uint32{0x00534875, 0x01d6db48, 0x00f0aef6, 0x00feca07, 0x034fac44, 0x03303683, 0x00ce36a4, 0x02694d3f, 0x033e0ea7, 0x002b7c66}}}, + {X: Field{[10]uint32{0x029d193b, 0x010da9f1, 0x012fdcb6, 0x02acdb10, 0x00bbad2b, 0x01f58f03, 0x00ae2d9f, 0x00acc59e, 0x01dcaa9c, 0x000ae039}}, Y: Field{[10]uint32{0x022119c3, 0x00875880, 0x00ffa276, 0x00670821, 0x038f3c90, 0x0141891e, 0x001ce04c, 0x00018ada, 0x004d71d6, 0x002f20f8}}}, + {X: Field{[10]uint32{0x023beece, 0x0148d739, 0x01d5bb97, 0x00300f11, 0x0175424a, 0x011124d0, 0x0375b58d, 0x031a71a0, 0x033be521, 0x001272f7}}, Y: Field{[10]uint32{0x0062de7f, 0x01b12697, 0x017a8ae4, 0x03c558e6, 0x0291d260, 0x00e84dab, 0x0356abad, 0x039f3b0d, 0x02eaf0f0, 0x00315857}}}, + {X: Field{[10]uint32{0x029ee1b2, 0x016e8c73, 0x0373979c, 0x00ee72a1, 0x03f7aa66, 0x03741c3d, 0x015e2f31, 0x02c45648, 0x0314b643, 0x00339351}}, Y: Field{[10]uint32{0x02feac38, 0x023f76c7, 0x010aad6f, 0x02d08030, 0x00479745, 0x0188406c, 0x0359ef5e, 0x00ea8d36, 0x0212a2fc, 0x002c7cd7}}}, + {X: Field{[10]uint32{0x01e10054, 0x00b53758, 0x01656299, 0x01e7b5f1, 0x01a8bef4, 0x03562071, 0x013bb1b5, 0x016b0e36, 0x02bbaa90, 0x001a09ed}}, Y: Field{[10]uint32{0x016bb869, 0x03e3b3ca, 0x0064d1af, 0x009dfbc8, 0x0030fc37, 0x016007d5, 0x00484279, 0x00083646, 0x007baf65, 0x0021492a}}}, + {X: Field{[10]uint32{0x0056535f, 0x03d2b460, 0x0112519a, 0x0062c5b7, 0x00ab9472, 0x000e9268, 0x037879aa, 0x035fc71e, 0x00d548f4, 0x00039c79}}, Y: Field{[10]uint32{0x0232f574, 0x006ece03, 0x01c09f0d, 0x01a0f7b4, 0x0383aeed, 0x02d72604, 0x03e3beda, 0x02cf55bd, 0x00617098, 0x00125741}}}, + {X: Field{[10]uint32{0x0200e032, 0x00199f1b, 0x02542632, 0x005a1cf3, 0x00656528, 0x00ffb69a, 0x036aa32a, 0x03ecc350, 0x01797429, 0x003bda0e}}, Y: Field{[10]uint32{0x0134613f, 0x028d8d41, 0x01404fbb, 0x001bc053, 0x0002f175, 0x006229ab, 0x01ed846f, 0x025fa03f, 0x024ade11, 0x002d2c63}}}, + {X: Field{[10]uint32{0x012deaf4, 0x0162c0f9, 0x0245b0a2, 0x00db07b1, 0x01dd557e, 0x038bbb61, 0x008007d0, 0x01fbffa4, 0x01c1ac8f, 0x000031ca}}, Y: Field{[10]uint32{0x021305fe, 0x01fafd15, 0x00f27bde, 0x02242b0e, 0x0312365b, 0x00cd6821, 0x02bade6a, 0x013dab17, 0x01c21858, 0x000ba0fb}}}, + {X: Field{[10]uint32{0x015735ab, 0x031fec44, 0x0288cc1c, 0x03088492, 0x01290d54, 0x02b8b7b4, 0x03c4f2c3, 0x01b54eca, 0x01199a71, 0x0033c74e}}, Y: Field{[10]uint32{0x0100e6e6, 0x02dc35b7, 0x029089b7, 0x03bab550, 0x03c276c8, 0x02ae14e2, 0x0180970d, 0x0100b3a2, 0x01a57ec3, 0x001ad13d}}}, + {X: Field{[10]uint32{0x03ecdeae, 0x03582696, 0x00f55cf9, 0x01ffe0b6, 0x01a9c28a, 0x03a4369d, 0x031f772e, 0x03b8a3cf, 0x03a0266d, 0x001b3cf5}}, Y: Field{[10]uint32{0x01bc58d4, 0x037ebad2, 0x01e14034, 0x02d3113b, 0x00ede5c9, 0x0366a66f, 0x01b9cf94, 0x03338a25, 0x03b31e11, 0x000ef463}}}, + {X: Field{[10]uint32{0x01395542, 0x01d2701f, 0x00be7f28, 0x02bb3e0c, 0x0256393c, 0x0002ba4c, 0x02e4274f, 0x03bb2b37, 0x0032ae63, 0x003692d6}}, Y: Field{[10]uint32{0x01b2210b, 0x03220633, 0x00ec4dfe, 0x038c6da5, 0x02106374, 0x005a12e4, 0x01610c9d, 0x0103c605, 0x023bd2d9, 0x0026aaec}}}, + {X: Field{[10]uint32{0x0330bbfa, 0x0357de90, 0x002d4b8a, 0x0043a561, 0x03407d1a, 0x03a8b1af, 0x0063270c, 0x00385be7, 0x03502321, 0x003e46b8}}, Y: Field{[10]uint32{0x013aa1c2, 0x00421ae4, 0x01e161b5, 0x010ccd94, 0x0153c915, 0x034f46bc, 0x029290ef, 0x0095cd65, 0x01acd196, 0x00007c58}}}, + {X: Field{[10]uint32{0x02f1ac02, 0x021d2cbc, 0x0025556c, 0x01cfe872, 0x02c72e3f, 0x01cca149, 0x0047c862, 0x00a8b916, 0x0352cc3e, 0x001f86fb}}, Y: Field{[10]uint32{0x02f6e6fe, 0x0305e1f9, 0x017f44c4, 0x008fba36, 0x0008ff05, 0x003f13d4, 0x03048fee, 0x03934f6d, 0x037ea706, 0x002f92c3}}}, + {X: Field{[10]uint32{0x03d5998f, 0x03f20534, 0x020ecb27, 0x03c52f9c, 0x03706567, 0x03724bad, 0x00e256cc, 0x00bb8dd2, 0x015d30dc, 0x0003749a}}, Y: Field{[10]uint32{0x032dc74f, 0x000a8668, 0x0396ed1a, 0x0103c3c2, 0x01bba677, 0x01151cad, 0x027cf998, 0x02004e7b, 0x0044f102, 0x0026bccb}}}, + {X: Field{[10]uint32{0x009dbb9d, 0x002ccdd9, 0x037c94d2, 0x02550fec, 0x02125fe3, 0x00ceddb6, 0x02602ba0, 0x018f2344, 0x02507147, 0x001e3eb9}}, Y: Field{[10]uint32{0x03ce3aa6, 0x0388d46f, 0x00ce121d, 0x00c81989, 0x00c3b925, 0x02bc7fa9, 0x01826e5e, 0x03339bd9, 0x000f0726, 0x001e3713}}}, + {X: Field{[10]uint32{0x01c98bd5, 0x02498da3, 0x018dfee6, 0x02e16476, 0x021b6fb6, 0x0005ad16, 0x01d3e00d, 0x01774aa8, 0x021e510e, 0x0007b7d4}}, Y: Field{[10]uint32{0x01311f86, 0x02369055, 0x00a59751, 0x034d8efb, 0x00aeafd8, 0x006ac3c8, 0x034d8177, 0x026e3743, 0x016d9b2e, 0x00268340}}}, + {X: Field{[10]uint32{0x00101d39, 0x01aa8634, 0x02b4d416, 0x0250dd58, 0x007ce286, 0x00f31a79, 0x013272cd, 0x02d82e45, 0x030c5e53, 0x002181ee}}, Y: Field{[10]uint32{0x02eb519a, 0x0159b565, 0x00e988ef, 0x015c9e49, 0x02388707, 0x01922be3, 0x01a294aa, 0x0195070d, 0x031ec83c, 0x00005728}}}, + {X: Field{[10]uint32{0x02d02eab, 0x02d97de5, 0x02df7166, 0x001e44bc, 0x03037f96, 0x010ae6ed, 0x020dbb7c, 0x000fde02, 0x000d9a05, 0x00197f4c}}, Y: Field{[10]uint32{0x02a3b5d9, 0x02e4a2d3, 0x00aa5335, 0x00f3513b, 0x02904caf, 0x03dad0fc, 0x03945401, 0x02a14847, 0x035084fb, 0x003f3454}}}, + {X: Field{[10]uint32{0x0002d148, 0x03c51633, 0x03f99f47, 0x02a4cc24, 0x0336d031, 0x01332fac, 0x01845f03, 0x01f38700, 0x03a76c84, 0x0032462c}}, Y: Field{[10]uint32{0x03728568, 0x00eb7f5f, 0x00eb53ed, 0x02772a17, 0x02059632, 0x03ea9b98, 0x00632700, 0x00b880c8, 0x0003dbbb, 0x003c95bd}}}, + {X: Field{[10]uint32{0x01661817, 0x014ab381, 0x03bb5c13, 0x03536f82, 0x01532e54, 0x0102b783, 0x02cb4291, 0x02e1e42f, 0x00fd02f0, 0x001ab0b7}}, Y: Field{[10]uint32{0x029e2af3, 0x02ab8592, 0x026dccca, 0x038c1811, 0x03784c3d, 0x01c89470, 0x0323074e, 0x00e5b16b, 0x0310abf9, 0x003cb098}}}, + {X: Field{[10]uint32{0x033f3d19, 0x02ffcbf2, 0x0295f5b0, 0x02a517da, 0x02cf8e95, 0x017facac, 0x0239b94b, 0x03ce273b, 0x00ee54ac, 0x00235c71}}, Y: Field{[10]uint32{0x031ce52d, 0x01d611c3, 0x00cb6548, 0x015e26d1, 0x03f0bc88, 0x00cc1840, 0x03a3881e, 0x030711f6, 0x03d95a02, 0x0026110a}}}, + {X: Field{[10]uint32{0x00f583c3, 0x03b84911, 0x03072b3d, 0x01a2a426, 0x002e5d73, 0x01447a1d, 0x000abbb0, 0x01c463cb, 0x00d3fd55, 0x003a2f49}}, Y: Field{[10]uint32{0x03ce6538, 0x02c6fc22, 0x0343a4d4, 0x016b3583, 0x02238028, 0x01c59167, 0x037992a6, 0x008b6d96, 0x03a6e286, 0x003874b0}}}, + {X: Field{[10]uint32{0x00075217, 0x01c9568f, 0x011d032d, 0x0092acab, 0x00483fd0, 0x00c478ed, 0x02c8c516, 0x033e2794, 0x01755cf8, 0x0018b70a}}, Y: Field{[10]uint32{0x000e2a97, 0x0247e3d7, 0x00d1e093, 0x02a523cf, 0x018b3fc8, 0x00255094, 0x0301e9cd, 0x008b6383, 0x0132d80d, 0x0001e678}}}, + {X: Field{[10]uint32{0x004c0e13, 0x014125b5, 0x01451a60, 0x013d9aa5, 0x034d4323, 0x031f4f01, 0x01027099, 0x01f9832c, 0x03aacf72, 0x000df6c4}}, Y: Field{[10]uint32{0x01b1066b, 0x0090cd22, 0x02fb0629, 0x01b7427a, 0x02d3402a, 0x0004e87d, 0x02e9d07e, 0x03bfd065, 0x03be8f8c, 0x00030e0e}}}, + {X: Field{[10]uint32{0x032aa1ab, 0x01d6cc3e, 0x02c39378, 0x00e49a67, 0x01be9dc4, 0x01cbc77c, 0x018e17c4, 0x01c67b21, 0x0365eab7, 0x000defed}}, Y: Field{[10]uint32{0x01721364, 0x014d58f4, 0x00eea23b, 0x017419bc, 0x025cf44b, 0x022be329, 0x0135f4a9, 0x031308be, 0x03fd865d, 0x001c9c62}}}, + {X: Field{[10]uint32{0x005d1b94, 0x02e914aa, 0x0145606d, 0x03f84803, 0x03b5d5c3, 0x01885229, 0x01ba6e1f, 0x02fcd57f, 0x021287fc, 0x0010cfb7}}, Y: Field{[10]uint32{0x0357c20e, 0x01765251, 0x02e60571, 0x01f1ebb9, 0x01137a4c, 0x00f8c1e0, 0x030c9591, 0x0144eca3, 0x0213ad6e, 0x002c9f15}}}, + {X: Field{[10]uint32{0x02671861, 0x02695f4f, 0x03b323af, 0x0342e2c9, 0x02d23295, 0x02adf7d1, 0x021917f6, 0x00379a4a, 0x019fc5ed, 0x0003960b}}, Y: Field{[10]uint32{0x00073154, 0x0077bff5, 0x01fd6557, 0x01cc6de3, 0x01d1c9e0, 0x021b2c74, 0x039faa53, 0x0036f5f9, 0x0385e277, 0x000cfba1}}}, + {X: Field{[10]uint32{0x009442c2, 0x00a18013, 0x0189e4e4, 0x000529a8, 0x02ad8fae, 0x003c1ab7, 0x02d4e5da, 0x03c56bb8, 0x0340634b, 0x00182c1e}}, Y: Field{[10]uint32{0x004b283d, 0x00466c6f, 0x00f37ff2, 0x027295ec, 0x011557f2, 0x02362ab1, 0x034a2cd6, 0x010ee98a, 0x03cd00d2, 0x003fb821}}}, + {X: Field{[10]uint32{0x01e03100, 0x0196b4cb, 0x009b2102, 0x029f38df, 0x02643e6d, 0x01ba23ee, 0x0245e35b, 0x03df2828, 0x027601e5, 0x0012c59c}}, Y: Field{[10]uint32{0x02d8dde7, 0x024324e3, 0x00a6473b, 0x00aed8c5, 0x00cacda0, 0x03547c57, 0x0126c1dc, 0x021f8243, 0x03024768, 0x000a2ab3}}}, + {X: Field{[10]uint32{0x022a3170, 0x034be6ff, 0x027b2a17, 0x03853b53, 0x02fab97d, 0x026a22b8, 0x0003e638, 0x01f9d312, 0x013d6d79, 0x00175584}}, Y: Field{[10]uint32{0x01cd524f, 0x00ac79f6, 0x033abee4, 0x024b8b65, 0x02c65459, 0x03acacd3, 0x02462a27, 0x02cbfe98, 0x02a8534e, 0x000253bc}}}, + {X: Field{[10]uint32{0x0234f828, 0x02cf418e, 0x03a7ee38, 0x0363ca37, 0x03f4a06c, 0x03a3111c, 0x01572878, 0x006b6344, 0x03ae7511, 0x002a740f}}, Y: Field{[10]uint32{0x03517881, 0x0347e54c, 0x0262e4d9, 0x02d31f78, 0x03480c94, 0x01a3daea, 0x02665bf9, 0x0261e4b2, 0x000cc731, 0x00281ccf}}}, + {X: Field{[10]uint32{0x020e1ad5, 0x0157c959, 0x00522508, 0x0058599b, 0x0058fd37, 0x02cfdf9c, 0x00db3b77, 0x02f3a7b5, 0x01712b1a, 0x001d0665}}, Y: Field{[10]uint32{0x00da44db, 0x019ef640, 0x0385f22b, 0x03062ab0, 0x00ea3ef2, 0x009c9800, 0x013b8a32, 0x01d6273f, 0x02a8097f, 0x001c432b}}}, + {X: Field{[10]uint32{0x01918dc8, 0x02ae5bc9, 0x00be7cab, 0x03cab31a, 0x02ba0106, 0x0119cf85, 0x03a1e5f8, 0x0296c7ba, 0x010dbf81, 0x0027c5a6}}, Y: Field{[10]uint32{0x00ebc4f5, 0x01962314, 0x007b0f0b, 0x03c7a996, 0x03135d46, 0x000e01aa, 0x0049d39c, 0x004108d3, 0x007b6232, 0x00035835}}}, + {X: Field{[10]uint32{0x0301d57d, 0x01c302c8, 0x00619b6a, 0x03d322c9, 0x03c99143, 0x02af4569, 0x011c888f, 0x02e69eb6, 0x01bc4f12, 0x000ed41a}}, Y: Field{[10]uint32{0x01dd1a79, 0x020a31ff, 0x035a8979, 0x013aa1ad, 0x02da1854, 0x02cc4759, 0x034ddfd4, 0x02a5127e, 0x00d1ae59, 0x0036ee1f}}}, + {X: Field{[10]uint32{0x02baee90, 0x026e51b6, 0x01c68115, 0x035c26dd, 0x01f90cdc, 0x02feaecc, 0x03bf9afb, 0x028db82e, 0x03a967b5, 0x00277a98}}, Y: Field{[10]uint32{0x02bc4464, 0x019989f1, 0x01e57b8a, 0x03ae5353, 0x0305c7d2, 0x02460348, 0x01a605ce, 0x02e5638c, 0x019b11ba, 0x002c52ee}}}, + {X: Field{[10]uint32{0x01e31e79, 0x0377d215, 0x03a188e0, 0x00b30cf0, 0x0309fe6b, 0x0104798e, 0x025cb534, 0x01aa1095, 0x03921da3, 0x00342c8c}}, Y: Field{[10]uint32{0x0374f8e9, 0x010d7943, 0x02a7515c, 0x01d90fed, 0x02991172, 0x00d42cec, 0x02f1cfcc, 0x01524b72, 0x03ea1a6e, 0x00203b64}}}, + {X: Field{[10]uint32{0x00b03d20, 0x0205ece4, 0x01da552c, 0x0323dc44, 0x03acfe85, 0x03d1078f, 0x00ca7a49, 0x03912fe6, 0x0255966a, 0x0022b725}}, Y: Field{[10]uint32{0x03c0021e, 0x0069b95c, 0x013b4eed, 0x019b6c6e, 0x005dd1d5, 0x024cdd0c, 0x00c80eac, 0x01cc4860, 0x014c6a71, 0x00339c81}}}, + {X: Field{[10]uint32{0x020c1670, 0x0059c987, 0x03fe3ec9, 0x00438b84, 0x02141ac6, 0x00062929, 0x00800b6d, 0x00f7a9c0, 0x03f8cf6d, 0x003dbdda}}, Y: Field{[10]uint32{0x039a302c, 0x0070e54f, 0x01a54e24, 0x03dd9913, 0x0263e4fe, 0x01ace93b, 0x025e2a10, 0x0261da63, 0x00afe1ea, 0x002cb11e}}}, + {X: Field{[10]uint32{0x00b898e5, 0x00f61bc5, 0x039fef87, 0x0235b697, 0x03217638, 0x01cece44, 0x00fcaa18, 0x0368c05d, 0x007d38b7, 0x0003560a}}, Y: Field{[10]uint32{0x02fc8402, 0x00ba7b1a, 0x005ee350, 0x03d58795, 0x03da2b8f, 0x0052b433, 0x018f91d1, 0x00217a0c, 0x013469ed, 0x001e17f2}}}, + {X: Field{[10]uint32{0x01a3661c, 0x02fd9d0e, 0x0354a02f, 0x0047d2e0, 0x01538e3d, 0x0361c0b0, 0x03e810c6, 0x03b9567f, 0x022350c5, 0x001ddcb2}}, Y: Field{[10]uint32{0x006edddb, 0x036690da, 0x00d6c931, 0x02a2b87f, 0x03fe3dd3, 0x00fa6393, 0x008aefb2, 0x0368516d, 0x02de853f, 0x001688c4}}}, + {X: Field{[10]uint32{0x02433ad5, 0x01c177dc, 0x02308069, 0x00f9dab7, 0x0046ce90, 0x03f0fecb, 0x010ac95e, 0x00da1deb, 0x0176c50f, 0x0028be7e}}, Y: Field{[10]uint32{0x00c285f3, 0x03c15bf2, 0x0238a22a, 0x012da2be, 0x01f201dd, 0x03e35d11, 0x0211b22b, 0x0227ccd7, 0x031124c2, 0x003b1594}}}, + {X: Field{[10]uint32{0x038b15f7, 0x0086a013, 0x0211bcb2, 0x019ad4b3, 0x0026fce1, 0x02b49c44, 0x010ec165, 0x03159c93, 0x036585f8, 0x00388365}}, Y: Field{[10]uint32{0x018f33fb, 0x01753766, 0x0031bfc8, 0x008059ab, 0x0321d082, 0x01aaed52, 0x0348b6bc, 0x00e18a62, 0x0133c7f6, 0x0018ed86}}}, + {X: Field{[10]uint32{0x00ecc18f, 0x033b00eb, 0x0093e42d, 0x0222cafc, 0x03659ba6, 0x001b6c77, 0x0298d945, 0x00778b2f, 0x019d00ca, 0x00221a2d}}, Y: Field{[10]uint32{0x00f2fd0e, 0x005760ff, 0x03076e22, 0x0146bed4, 0x02dea562, 0x01493afd, 0x01dbfe84, 0x023ec014, 0x030796b9, 0x003c0ba6}}}, + {X: Field{[10]uint32{0x01fb677c, 0x01606e22, 0x016a43f8, 0x0099e09b, 0x0099c832, 0x029afc3a, 0x005f86b9, 0x004d869e, 0x002fe32a, 0x0004267e}}, Y: Field{[10]uint32{0x0044445b, 0x03cdf627, 0x01aac7fc, 0x01866bfa, 0x02cd2d3e, 0x024bab11, 0x0320cd35, 0x03c9c4b3, 0x03f29aa7, 0x0004fee0}}}, + {X: Field{[10]uint32{0x01cbeea3, 0x00147d0d, 0x01d31ef2, 0x032bb8b5, 0x03deae65, 0x032986c9, 0x03329698, 0x039ecd7d, 0x029677ec, 0x0012be71}}, Y: Field{[10]uint32{0x024e5ef0, 0x00420999, 0x006985b2, 0x025a04c3, 0x00ebfe51, 0x00910229, 0x02e3f80a, 0x02a5dbe5, 0x0196429d, 0x001cc011}}}, + {X: Field{[10]uint32{0x03dab473, 0x00ed50d5, 0x02045edb, 0x022f45bb, 0x01300d1f, 0x01c4f2ae, 0x02d4bbe8, 0x02e2c0c8, 0x03ca5ace, 0x0025a032}}, Y: Field{[10]uint32{0x010df58a, 0x004c766f, 0x02aec0e9, 0x00f09e62, 0x006904ee, 0x0026ccf8, 0x014697c2, 0x02874bb3, 0x0140e36b, 0x000bca4e}}}, + {X: Field{[10]uint32{0x03fae7c2, 0x036e6b89, 0x000ee4e2, 0x03eb5ba7, 0x023eb7fd, 0x00520324, 0x01c37203, 0x011fc17e, 0x003afd63, 0x001fbbf3}}, Y: Field{[10]uint32{0x035cac06, 0x023c42fe, 0x0357e973, 0x0276b3ac, 0x007bb93d, 0x01eec78a, 0x0353e421, 0x017051f1, 0x02754f74, 0x002e3a7e}}}, + {X: Field{[10]uint32{0x039fddb4, 0x0351becb, 0x002fe98f, 0x0016c097, 0x01065e78, 0x02252557, 0x021fbf36, 0x004ae4d1, 0x0156d636, 0x0002e08c}}, Y: Field{[10]uint32{0x00bd465a, 0x02771604, 0x0360cdab, 0x031a8aa3, 0x00d0b537, 0x03a7ab75, 0x03453ebf, 0x03a47917, 0x017a826f, 0x003c8f14}}}, + {X: Field{[10]uint32{0x01bdadd9, 0x005134e1, 0x002b44d5, 0x008ba246, 0x01bfb9de, 0x00b9d96a, 0x0178706e, 0x03f55248, 0x035e2035, 0x003a0074}}, Y: Field{[10]uint32{0x02956a26, 0x0186025d, 0x03478481, 0x0000fea9, 0x011c2162, 0x00678dea, 0x00868e04, 0x039bc206, 0x023427de, 0x00079920}}}, + {X: Field{[10]uint32{0x01c67f3a, 0x0123d4b3, 0x01a1c2f3, 0x01402122, 0x0029fd77, 0x01fa243f, 0x00369e50, 0x0025a4a1, 0x010e56b7, 0x003a7518}}, Y: Field{[10]uint32{0x008e4a0e, 0x02a13fad, 0x02c1f7d9, 0x008895f0, 0x031df0e6, 0x03b9145a, 0x01bfca22, 0x020b868a, 0x02ac357d, 0x002397da}}}, + {X: Field{[10]uint32{0x03b7609b, 0x0206bdb4, 0x028ff4a4, 0x022838d4, 0x00b94bae, 0x011a0021, 0x00d7aa09, 0x0377b8d0, 0x030f51d6, 0x001c70fb}}, Y: Field{[10]uint32{0x015f6b96, 0x03d5f8cc, 0x03ca4544, 0x0351264b, 0x03db6886, 0x02985690, 0x00adc4da, 0x021e8c4e, 0x00dc2f80, 0x0013459d}}}, + {X: Field{[10]uint32{0x027d6f20, 0x02670392, 0x03947ce9, 0x020f055e, 0x0121aadb, 0x00e2aeb1, 0x038b44d9, 0x03107ef7, 0x0243b6f5, 0x002559f3}}, Y: Field{[10]uint32{0x03a35538, 0x0280084c, 0x00fe35e2, 0x0366cb79, 0x011fd0fd, 0x011730d7, 0x0247ca89, 0x028c6029, 0x0317031e, 0x00327618}}}, + {X: Field{[10]uint32{0x02dcc141, 0x02c8ade3, 0x0163eb9d, 0x014c3f62, 0x014f8fc7, 0x00468648, 0x033de850, 0x019ce442, 0x014f8116, 0x000d148f}}, Y: Field{[10]uint32{0x0022ac90, 0x03a43121, 0x01ce77d6, 0x0213c9df, 0x02877bca, 0x009df62e, 0x000a0660, 0x0223ae6e, 0x01fe268b, 0x002403ee}}}, + {X: Field{[10]uint32{0x03c1bd98, 0x002b5e78, 0x01278159, 0x03f2d873, 0x01f2993d, 0x0083973c, 0x034350bf, 0x010f7e8b, 0x037e5f1c, 0x001a7f47}}, Y: Field{[10]uint32{0x0051d7f3, 0x0327ce9b, 0x01615043, 0x008caf37, 0x0302d1c9, 0x0249de5c, 0x0315665a, 0x02502bb6, 0x02cf8b74, 0x0018cdc9}}}, + {X: Field{[10]uint32{0x014a3de7, 0x021e2bfa, 0x03aa2a9f, 0x01d78c5f, 0x02411b2a, 0x02d3f1ae, 0x006dd39b, 0x02e3dcc5, 0x0024c28c, 0x003930b1}}, Y: Field{[10]uint32{0x0321ae89, 0x022a527a, 0x01158fcc, 0x023a6cef, 0x01c86137, 0x00814573, 0x02607398, 0x017bd236, 0x03e8468e, 0x003ee345}}}, + {X: Field{[10]uint32{0x00e32773, 0x035ec78d, 0x019ea5de, 0x004c8984, 0x0398e445, 0x03125218, 0x01feb590, 0x005b4270, 0x019aada9, 0x0015c411}}, Y: Field{[10]uint32{0x023871bc, 0x00fb2939, 0x009f0738, 0x00abccfd, 0x02905bf1, 0x002a0d57, 0x016b4093, 0x00e96139, 0x01bdd2d8, 0x002277bb}}}, + {X: Field{[10]uint32{0x03d48e64, 0x0085e81b, 0x01bc189b, 0x02a642e1, 0x0359a3a8, 0x01c406c9, 0x0017f913, 0x001b856b, 0x02d41718, 0x00355beb}}, Y: Field{[10]uint32{0x00a6652c, 0x00c511cd, 0x038c76d7, 0x01de9221, 0x01ebe439, 0x00da3d52, 0x02f513f5, 0x02cb5ad8, 0x02c33408, 0x003ea1c7}}}, + {X: Field{[10]uint32{0x02599bcb, 0x014976ea, 0x003f7604, 0x004a0134, 0x00cb5cf0, 0x03b7e1f7, 0x0347be8e, 0x02016da2, 0x02ebda0b, 0x0039d05b}}, Y: Field{[10]uint32{0x01a56c19, 0x03d510ae, 0x01185bbc, 0x00dc4ec4, 0x03533d4f, 0x01f90c52, 0x03eb4c77, 0x0159f8c4, 0x0316f11c, 0x00218431}}}, + {X: Field{[10]uint32{0x01fa997d, 0x03c581f5, 0x0175f2d5, 0x0291b980, 0x02a4fbfc, 0x00f38cb1, 0x00606081, 0x00d50647, 0x0062ebdd, 0x00232966}}, Y: Field{[10]uint32{0x037698f4, 0x0355a478, 0x031c6980, 0x03bbeab5, 0x01113dd6, 0x00ac5343, 0x01fa1950, 0x03fab1ab, 0x000fb132, 0x002abcd2}}}, + {X: Field{[10]uint32{0x03243413, 0x02e9bc54, 0x0218172f, 0x0314a30a, 0x036eb8e4, 0x011b1480, 0x015867a8, 0x00ed1464, 0x00451fd4, 0x001925b7}}, Y: Field{[10]uint32{0x004da1f2, 0x01358939, 0x03e87cb1, 0x02f1722c, 0x03153fe2, 0x00a4b3c6, 0x00a281b9, 0x03267b80, 0x00410f85, 0x000113f7}}}, + {X: Field{[10]uint32{0x01925a5d, 0x02cbf064, 0x035d6c9c, 0x008753a3, 0x0067d207, 0x032b3348, 0x00bc248d, 0x0105aa8e, 0x0063aa82, 0x000e9091}}, Y: Field{[10]uint32{0x02fa9fb2, 0x01e11922, 0x03ca9c31, 0x02fea949, 0x00d4857a, 0x01f206fc, 0x00775cb3, 0x0096450d, 0x0063fd24, 0x001c6959}}}, + {X: Field{[10]uint32{0x0178c2e6, 0x01344274, 0x03418157, 0x0079ade1, 0x03881178, 0x02a17f98, 0x03f7985a, 0x014652b6, 0x030551d5, 0x001aa516}}, Y: Field{[10]uint32{0x0357ac44, 0x03a67fe6, 0x01d31924, 0x03c4c989, 0x0380df9a, 0x0099f289, 0x0021fc0d, 0x02a0d8c9, 0x003a1ca3, 0x00061b4d}}}, + {X: Field{[10]uint32{0x02add47f, 0x03f5df4e, 0x008aac9f, 0x003adfe3, 0x0132baac, 0x031704ec, 0x027381b8, 0x0012dedf, 0x0292682d, 0x0004fc7d}}, Y: Field{[10]uint32{0x02e99f0e, 0x02a92b89, 0x03ce2282, 0x00cce311, 0x03433725, 0x01745003, 0x03368528, 0x03fe227a, 0x01e49622, 0x0015ca81}}}, + {X: Field{[10]uint32{0x02804330, 0x0198d2f4, 0x02522a51, 0x001f9533, 0x01a27007, 0x03b6ddfd, 0x018e7b33, 0x03a3c7b6, 0x03c14f0d, 0x001e7e84}}, Y: Field{[10]uint32{0x01987c65, 0x02247bb5, 0x03aa096e, 0x02ad68bb, 0x00cf2484, 0x0183dc66, 0x001e40e0, 0x027b9cfd, 0x0188e196, 0x0028252f}}}, + {X: Field{[10]uint32{0x0133130a, 0x0280f6f9, 0x011019dd, 0x01f6ecf7, 0x01fb0837, 0x029b6acf, 0x033f7350, 0x006fdf09, 0x02dbd2c6, 0x0037c7fd}}, Y: Field{[10]uint32{0x023f886e, 0x02584764, 0x02824fd1, 0x02dd6ac3, 0x00cd0061, 0x023452a5, 0x025c969d, 0x021a264b, 0x03ad68c5, 0x0000bf71}}}, + {X: Field{[10]uint32{0x02cbdb34, 0x021b4a86, 0x032ec51d, 0x006f7de5, 0x032bff65, 0x00204331, 0x00f87760, 0x00e6b460, 0x02805f59, 0x002a088c}}, Y: Field{[10]uint32{0x03c2dfba, 0x013fed45, 0x025b5278, 0x00ab52c4, 0x01e7f2ef, 0x00010dd4, 0x02ea9b44, 0x00d8caca, 0x010f982e, 0x0025a056}}}, + {X: Field{[10]uint32{0x004c7c44, 0x01a9a212, 0x018c479e, 0x02b6e8ff, 0x02b3780f, 0x00f1ce4c, 0x010ada16, 0x02fd61a6, 0x00c049f3, 0x00101ac3}}, Y: Field{[10]uint32{0x036503dd, 0x008205f7, 0x012d31bb, 0x00ca1646, 0x028b2179, 0x0062bb9f, 0x0074fe02, 0x023951e4, 0x00eff250, 0x002aac39}}}, + {X: Field{[10]uint32{0x0116bcc8, 0x00cc033d, 0x014604b7, 0x03ab6eb2, 0x00523c81, 0x031366f2, 0x00f103db, 0x011e70f7, 0x03fd5783, 0x00139c10}}, Y: Field{[10]uint32{0x002d1133, 0x014f5a7a, 0x007fa98f, 0x02d9ce93, 0x0177c859, 0x01b24989, 0x0033ead6, 0x006f47a0, 0x03b73ed0, 0x000658a1}}}, + {X: Field{[10]uint32{0x033e9997, 0x03d003c3, 0x0344e43c, 0x0003a74b, 0x00a7d55b, 0x03c9301c, 0x0175c0ef, 0x0297d641, 0x0271b945, 0x002a68a9}}, Y: Field{[10]uint32{0x020c6285, 0x029636db, 0x014ca5b2, 0x0390ed1b, 0x039ae22c, 0x03dfcbcf, 0x03f957ca, 0x009c5459, 0x0220cb97, 0x001b3517}}}, + {X: Field{[10]uint32{0x003d3c01, 0x028ffca2, 0x0208b22b, 0x031da01d, 0x0312b2de, 0x00c569bb, 0x0247ae49, 0x02ba23ee, 0x039475ff, 0x001a4a84}}, Y: Field{[10]uint32{0x02e46131, 0x0197059b, 0x0340685a, 0x00fc2018, 0x00c83477, 0x029df458, 0x02867321, 0x01295302, 0x034a03c1, 0x001d3756}}}, + {X: Field{[10]uint32{0x022cfad8, 0x02aa3235, 0x016e77dd, 0x02b3d740, 0x01063b44, 0x0003f352, 0x0128e75d, 0x00e2ee22, 0x01fd1566, 0x000dbe45}}, Y: Field{[10]uint32{0x0042e8b9, 0x01fd76fa, 0x00e3c0cf, 0x02c38dff, 0x02991dc8, 0x008b3db7, 0x0217d027, 0x03460d7b, 0x02b616ed, 0x0000fc47}}}, + {X: Field{[10]uint32{0x02a53b31, 0x028e3592, 0x02c8f99a, 0x01f82ece, 0x00a5202a, 0x00d90c51, 0x002fd6ca, 0x00302d51, 0x035a7e01, 0x000fc3db}}, Y: Field{[10]uint32{0x0035c649, 0x027f41c3, 0x01f9ab86, 0x035fc4f3, 0x03ab1f9e, 0x02c3fecf, 0x00099acd, 0x038a6a54, 0x03cf5b33, 0x00095d35}}}, + {X: Field{[10]uint32{0x00b7b067, 0x02559ccd, 0x00cfd26b, 0x03eaff00, 0x03508a9d, 0x024aab3c, 0x01d4258a, 0x019876c8, 0x02ff071f, 0x0023163e}}, Y: Field{[10]uint32{0x03944893, 0x0285359c, 0x0273f694, 0x01c56778, 0x01e9a8a1, 0x002c44c9, 0x03d08a88, 0x013b8a10, 0x0094ea1d, 0x000e347a}}}, + {X: Field{[10]uint32{0x01da78de, 0x021fedf1, 0x03a9c0f2, 0x020219ad, 0x02dbc6f5, 0x036502c4, 0x03918642, 0x0068f192, 0x031a205c, 0x0036019c}}, Y: Field{[10]uint32{0x01d0e05e, 0x030bafb3, 0x02ba8d43, 0x001b4907, 0x03704020, 0x018d497e, 0x01da8318, 0x01eaedcd, 0x00302ff5, 0x0021c2a1}}}, + {X: Field{[10]uint32{0x03848648, 0x0108138a, 0x02741335, 0x00244ae6, 0x03416bde, 0x029f3765, 0x01de1515, 0x02c10693, 0x037e195d, 0x001f6f68}}, Y: Field{[10]uint32{0x00715e71, 0x03ec00c4, 0x00cf3885, 0x006a1ea3, 0x03e1c026, 0x00bd82a7, 0x0284ff13, 0x0001c3f7, 0x007a649d, 0x0020f227}}}, + {X: Field{[10]uint32{0x03ec54a1, 0x0233ba00, 0x0245e58d, 0x0149f52f, 0x03410a1b, 0x02dddb3e, 0x038ee093, 0x02c38b7d, 0x03c0c803, 0x0022bf08}}, Y: Field{[10]uint32{0x012ed76b, 0x03ba270d, 0x035b401b, 0x028ae5fa, 0x02bf7b11, 0x0218e52f, 0x02529573, 0x039282ce, 0x02ce4f4a, 0x002c107b}}}, + {X: Field{[10]uint32{0x0252207b, 0x02e4084d, 0x0211236f, 0x033795e1, 0x031b2531, 0x01588452, 0x0003b4b2, 0x03eac12e, 0x00c22c50, 0x00139109}}, Y: Field{[10]uint32{0x01796e6f, 0x02e74376, 0x02ab57e7, 0x0297052d, 0x03889d5c, 0x02c33c90, 0x03421e4f, 0x01c4603e, 0x01815118, 0x0008afd8}}}, + {X: Field{[10]uint32{0x02e97453, 0x024a5079, 0x023828fd, 0x03bb24ee, 0x02f394b1, 0x038e6cd2, 0x0016e396, 0x002be282, 0x03885a23, 0x00181c5d}}, Y: Field{[10]uint32{0x00dc4b26, 0x03d005c0, 0x016f49f8, 0x03ea278d, 0x03fc0a18, 0x037db6e1, 0x03247620, 0x02906c53, 0x029f2b9d, 0x002a137c}}}, + {X: Field{[10]uint32{0x00af3213, 0x00b28923, 0x022ac602, 0x01a40b70, 0x00a271f1, 0x02b3dc39, 0x03bbf8df, 0x015bb0de, 0x0120384e, 0x00327dcf}}, Y: Field{[10]uint32{0x01fb5437, 0x02897e23, 0x02cb069e, 0x022e5d85, 0x0089070e, 0x02fd6d5e, 0x03c9bfa8, 0x025606dc, 0x03f4c77f, 0x001d88b9}}}, + {X: Field{[10]uint32{0x0245282a, 0x0297b6bb, 0x03c4a81e, 0x02718c2f, 0x01a8b995, 0x023643db, 0x002bfea4, 0x0287630f, 0x01fbdab5, 0x00067a97}}, Y: Field{[10]uint32{0x01f1d56c, 0x03876e3f, 0x00c653b8, 0x0275f5b9, 0x00870a95, 0x03cc1ec7, 0x03a4d62a, 0x02f605f0, 0x015d0014, 0x0003084a}}}, + {X: Field{[10]uint32{0x01617b58, 0x032f9b70, 0x025cb290, 0x01a5c5f7, 0x02047806, 0x02febe14, 0x030e1491, 0x030a4b37, 0x031e30b2, 0x001592f6}}, Y: Field{[10]uint32{0x022b1c0d, 0x013dd39f, 0x01984700, 0x00703aee, 0x0332508c, 0x01dfd777, 0x02841988, 0x02e57e67, 0x00e86fc0, 0x0026a368}}}, + {X: Field{[10]uint32{0x010bf06b, 0x011a54df, 0x023b54bf, 0x00778376, 0x0150b39d, 0x02fb81ce, 0x02e21237, 0x039b3249, 0x00424f3e, 0x0016f24e}}, Y: Field{[10]uint32{0x00fd5d16, 0x0277a908, 0x01e00c11, 0x00eda52d, 0x0032bb00, 0x035d4e94, 0x03f4bd4c, 0x01e2f82d, 0x03a96627, 0x00353a70}}}, + {X: Field{[10]uint32{0x00b7f99e, 0x036e6f17, 0x003a5980, 0x00b68ba3, 0x035b2a5f, 0x02071f5f, 0x02f4fc31, 0x022d5cfb, 0x0294829e, 0x000650cb}}, Y: Field{[10]uint32{0x02bcbcf6, 0x039caee6, 0x003f7a4b, 0x0205715c, 0x032e8607, 0x01b806b3, 0x029316e3, 0x02159eed, 0x019e5c5b, 0x003dd726}}}, + {X: Field{[10]uint32{0x00080b8d, 0x00c33688, 0x01672ea2, 0x0346fbbc, 0x018d0235, 0x002c6d56, 0x02c28bfa, 0x0338668b, 0x001e6196, 0x0034e64a}}, Y: Field{[10]uint32{0x0168aa19, 0x013468d4, 0x03ea9638, 0x03c357b6, 0x03d5483c, 0x017ae90c, 0x02949319, 0x0338e8cf, 0x029520ff, 0x0000729f}}}, + {X: Field{[10]uint32{0x00e73c88, 0x032a3a84, 0x026bae21, 0x025dd2b8, 0x0239372e, 0x000bd995, 0x01f55563, 0x03ea7f95, 0x035ab220, 0x001b2138}}, Y: Field{[10]uint32{0x0101b2b3, 0x02d30084, 0x029b89a7, 0x0195c7bf, 0x0001d154, 0x003a2c8d, 0x01711e7b, 0x00b02b52, 0x032abd44, 0x00262846}}}, + {X: Field{[10]uint32{0x00f8f64b, 0x002a0328, 0x00858118, 0x02dba77d, 0x03ec4205, 0x020ef601, 0x0397f14c, 0x0117b685, 0x018ab1b0, 0x001e0533}}, Y: Field{[10]uint32{0x0115f33b, 0x038e34ed, 0x022841b0, 0x00c106bc, 0x036bf177, 0x03798eb7, 0x03e8b704, 0x02e3ffd4, 0x0240edc8, 0x003be45f}}}, + {X: Field{[10]uint32{0x0196235f, 0x0381b1c2, 0x03993fb6, 0x0035c4e2, 0x02444e71, 0x034a014c, 0x01accfcc, 0x008aa2ff, 0x02831c8e, 0x001e807b}}, Y: Field{[10]uint32{0x001a5519, 0x009f9f0a, 0x00b41045, 0x02606058, 0x00dcb061, 0x024370ef, 0x02f2e080, 0x0170aad8, 0x01091989, 0x003f944b}}}, + {X: Field{[10]uint32{0x039bd908, 0x02085f07, 0x000ce72e, 0x01bcfcf9, 0x01512e85, 0x0352979e, 0x00b56605, 0x0327be46, 0x02bcdf86, 0x001957b9}}, Y: Field{[10]uint32{0x02f87721, 0x0253d8c4, 0x035c3cae, 0x02e848f7, 0x037dfdef, 0x002079a6, 0x0196ea9d, 0x02c217ce, 0x01a691fc, 0x0032fae9}}}, + {X: Field{[10]uint32{0x025219bb, 0x021fb877, 0x01d9e1cf, 0x0051103c, 0x003d4d48, 0x01e045ef, 0x00be25fe, 0x01cba3ac, 0x0009fb03, 0x003af5a0}}, Y: Field{[10]uint32{0x0258814b, 0x039e6d2e, 0x0068bd8c, 0x02dbfd96, 0x036da8cd, 0x02f6dd7c, 0x00aed2d6, 0x037d56fc, 0x02386f96, 0x0023bedf}}}, + {X: Field{[10]uint32{0x01a3865b, 0x0358ed86, 0x039149f1, 0x033c45a3, 0x028b7834, 0x01f56af5, 0x015cf051, 0x016eed3a, 0x00189ac0, 0x0021cd02}}, Y: Field{[10]uint32{0x00480838, 0x00fe4f05, 0x0330cdf6, 0x03eb78af, 0x027d24c0, 0x03eb828f, 0x01d4deed, 0x003c5724, 0x012772ce, 0x0027c7ef}}}, + {X: Field{[10]uint32{0x00513df3, 0x03cb18cc, 0x0368ba12, 0x0136aa5b, 0x035dda3a, 0x0055a432, 0x0262e925, 0x01eed937, 0x0213b02a, 0x00186dac}}, Y: Field{[10]uint32{0x02b6144e, 0x01894230, 0x03d56e01, 0x03994e65, 0x03c42c6c, 0x03000e86, 0x02d29628, 0x020650da, 0x00f24eff, 0x00331c6e}}}, + {X: Field{[10]uint32{0x0125fe37, 0x0028190e, 0x0187298f, 0x0388060b, 0x02ed5e02, 0x02126106, 0x01c9e663, 0x006b8b8e, 0x024d7717, 0x0012e9fb}}, Y: Field{[10]uint32{0x0296dbd6, 0x0371cd23, 0x004f1f1f, 0x03ddd46f, 0x035a9da4, 0x02029c9b, 0x032158eb, 0x013c5b2d, 0x01b4fe34, 0x001736f5}}}, + {X: Field{[10]uint32{0x008badb7, 0x011f9bc8, 0x01de2ee2, 0x01c7fa78, 0x026f9a39, 0x01a24ba6, 0x025bd7a4, 0x037350cb, 0x027fc4d5, 0x0035609e}}, Y: Field{[10]uint32{0x0098e1fa, 0x03c28698, 0x00f18ca0, 0x0298ed4b, 0x002fb667, 0x02c8f183, 0x02fb5349, 0x00303d87, 0x02dc9d0e, 0x003de43e}}}, + {X: Field{[10]uint32{0x03237633, 0x032e6ca4, 0x0098d411, 0x03f72894, 0x01e9086d, 0x027bf9a4, 0x0144d4a8, 0x0033df03, 0x01597f95, 0x00207b14}}, Y: Field{[10]uint32{0x039a1e7f, 0x0182dcfa, 0x000655fa, 0x028aaa0a, 0x000741d3, 0x03e4bed8, 0x0253f28e, 0x03e03251, 0x03ddc9ef, 0x002216c9}}}, + {X: Field{[10]uint32{0x02b6dec7, 0x02e8bf5a, 0x01e684cd, 0x01e762b2, 0x026e7237, 0x03c2bfc7, 0x023e06da, 0x03da01da, 0x01f4a0d4, 0x000a3f10}}, Y: Field{[10]uint32{0x01657225, 0x0328aa92, 0x01f54d80, 0x0236c421, 0x01482c6a, 0x0056c8d7, 0x02b9415c, 0x02af1cfa, 0x031e7aff, 0x002c792b}}}, + {X: Field{[10]uint32{0x03ae4f47, 0x02c62a3d, 0x035d1328, 0x02333d66, 0x036341a8, 0x01fe8be7, 0x00f5b857, 0x01d71f2c, 0x03d6c5bf, 0x003579d4}}, Y: Field{[10]uint32{0x00a1bff9, 0x00315031, 0x013cffaf, 0x003765e5, 0x02fc2f38, 0x03b359ba, 0x018a10c8, 0x0068c894, 0x00b98eb0, 0x00346a95}}}, + {X: Field{[10]uint32{0x0076e836, 0x03521cc5, 0x0286d8ba, 0x00f5d624, 0x01257d41, 0x0130696a, 0x0008fac4, 0x010a5f98, 0x015d8909, 0x0005a08d}}, Y: Field{[10]uint32{0x0309cf4a, 0x001151ba, 0x02a0278d, 0x03677b53, 0x002ec9c2, 0x014fb613, 0x0059b11d, 0x024327a1, 0x0362e29f, 0x0013da71}}}, + {X: Field{[10]uint32{0x03e781db, 0x000902c8, 0x032e7903, 0x006b4089, 0x0273425d, 0x03311b88, 0x03511a78, 0x02b9ccba, 0x005fb64c, 0x0027bdea}}, Y: Field{[10]uint32{0x009ce73c, 0x02ce61f4, 0x0204b03e, 0x027ce9dd, 0x0278a50c, 0x03d7a4b8, 0x035e2f20, 0x01691cfc, 0x016f6f6a, 0x0031c80d}}}, + {X: Field{[10]uint32{0x02e915ec, 0x03b1c280, 0x03612dd7, 0x01a304f3, 0x02021744, 0x03383aaa, 0x031be48a, 0x02694932, 0x03b36f42, 0x0013daba}}, Y: Field{[10]uint32{0x038e761f, 0x0082c473, 0x036c6396, 0x01ba1e03, 0x010b28f9, 0x014adb5f, 0x02d36092, 0x035e400a, 0x014da8b6, 0x00101ab6}}}, + {X: Field{[10]uint32{0x023f8232, 0x01586ec8, 0x01f8e088, 0x03c690ac, 0x037a3cc7, 0x03035fa2, 0x0310dae5, 0x00b99999, 0x020e5ac0, 0x00132b0f}}, Y: Field{[10]uint32{0x03263142, 0x00168232, 0x019318ba, 0x015b0bf9, 0x03dca655, 0x0230a749, 0x03fcb9cd, 0x03cf2013, 0x008eaa96, 0x0024e5bb}}}, + {X: Field{[10]uint32{0x039367b8, 0x0282983d, 0x0193738e, 0x01e18186, 0x02f61fbd, 0x01931d81, 0x00a9dd10, 0x02b15cb1, 0x00633aa2, 0x00021bcd}}, Y: Field{[10]uint32{0x01824f05, 0x008f9609, 0x0312a03f, 0x0186d6b9, 0x03cfb2aa, 0x02d30e2b, 0x0376c9fd, 0x01e76d7d, 0x012b5561, 0x003200bf}}}, + {X: Field{[10]uint32{0x007103a9, 0x0371ffcd, 0x034da318, 0x008ee8f5, 0x000bcd6f, 0x0074e7ea, 0x025ab4cd, 0x03848f9e, 0x01457685, 0x0014c8fc}}, Y: Field{[10]uint32{0x00691cb1, 0x0000de22, 0x028e3461, 0x03c7fb87, 0x0394cab4, 0x02efce3e, 0x01ec977c, 0x02ca784b, 0x0379eccc, 0x000c24be}}}, + {X: Field{[10]uint32{0x03ea74fd, 0x03c45e0c, 0x030e71a7, 0x001a60ff, 0x03f85cf1, 0x02838717, 0x000c45f3, 0x00471f9a, 0x01464027, 0x0034f5c3}}, Y: Field{[10]uint32{0x00d07bad, 0x01bd896a, 0x03c90fdf, 0x03cf855d, 0x01e4f722, 0x03ba9fee, 0x0093b9e0, 0x003cc45a, 0x0373d9b9, 0x00246609}}}, + {X: Field{[10]uint32{0x036d4359, 0x02192ef6, 0x02fdd6fd, 0x03e86ac7, 0x01f8cb89, 0x00d953c7, 0x01b5d714, 0x01d84c0b, 0x013728a8, 0x0037d8ee}}, Y: Field{[10]uint32{0x02ce5510, 0x02b2ded8, 0x012a791b, 0x035212de, 0x02a2c7be, 0x00cbe96c, 0x03930348, 0x00fb2db1, 0x01ca191a, 0x001f0ede}}}, + {X: Field{[10]uint32{0x01b70c74, 0x01afa15c, 0x00ec3974, 0x02531f7b, 0x0328a994, 0x0138898a, 0x0303169a, 0x00d3657c, 0x02228cc3, 0x003c7fa4}}, Y: Field{[10]uint32{0x0351a10e, 0x03944db9, 0x02b6469d, 0x00d630a3, 0x03b67a24, 0x0266bc78, 0x0335f60f, 0x03e9ca8a, 0x03b84e65, 0x0015623c}}}, + {X: Field{[10]uint32{0x0274fd95, 0x0324216e, 0x03c7dcb3, 0x02d7e8a7, 0x00fb0adb, 0x01f2ca34, 0x03ec14cb, 0x028cc3b7, 0x035d918c, 0x00240c39}}, Y: Field{[10]uint32{0x00b427f7, 0x0366768e, 0x004cd71a, 0x0304eef7, 0x035a452d, 0x00e2b7b5, 0x0128821c, 0x02261302, 0x01286169, 0x001f7c80}}}, + {X: Field{[10]uint32{0x03ad641a, 0x01f3d71d, 0x007d5ddd, 0x0218b0f3, 0x03dfa0b5, 0x01d9047a, 0x00f628c5, 0x036e1c4d, 0x013935be, 0x000734f0}}, Y: Field{[10]uint32{0x039a324d, 0x012f7852, 0x02bcf592, 0x03c40c3e, 0x0288264c, 0x03211ec9, 0x013a25e0, 0x02ec22fa, 0x01f25488, 0x0008553b}}}, + {X: Field{[10]uint32{0x0046ad96, 0x03c49f49, 0x01f42202, 0x03feb265, 0x03bd6e91, 0x03b0356e, 0x039f4621, 0x03b1f1e2, 0x0337a19f, 0x00395b81}}, Y: Field{[10]uint32{0x02ad70d7, 0x02226a8f, 0x0177698f, 0x00bd2cbb, 0x011e69b4, 0x01a4fa5d, 0x028d9bbb, 0x01d83902, 0x0027368c, 0x00220c36}}}, + {X: Field{[10]uint32{0x03b6b101, 0x0398fc57, 0x02657587, 0x0219e021, 0x0156fd08, 0x012b6299, 0x026dfeb2, 0x03978d8f, 0x02c458ab, 0x0006c29a}}, Y: Field{[10]uint32{0x035178dc, 0x00b3124c, 0x01926521, 0x01acb87d, 0x029a35e8, 0x03777b97, 0x033e5aab, 0x018e8ac4, 0x03dae642, 0x0034b7db}}}, + {X: Field{[10]uint32{0x03ea22b2, 0x03302048, 0x00679d80, 0x01d9173f, 0x0250bb16, 0x011b58a8, 0x01390a62, 0x0186393b, 0x01468fd4, 0x00042850}}, Y: Field{[10]uint32{0x0140185f, 0x00ce003f, 0x015620b0, 0x0096f0c3, 0x01f9a09b, 0x013aec54, 0x0113dbaf, 0x03746bb3, 0x0068dd7f, 0x000ce0ee}}}, + {X: Field{[10]uint32{0x003f5e35, 0x00f90669, 0x006ac8a7, 0x035e5755, 0x02e357f7, 0x01a2be9c, 0x038837e5, 0x028d45b6, 0x03515378, 0x0027712a}}, Y: Field{[10]uint32{0x0305903f, 0x02359a98, 0x01a06cc6, 0x0386410e, 0x02bfe05c, 0x03a9647b, 0x02422be1, 0x033eff8a, 0x022d9bce, 0x0002376a}}}, + {X: Field{[10]uint32{0x00ed7196, 0x02b1db8f, 0x035de1aa, 0x0264d880, 0x0213539e, 0x0226c82b, 0x038eb19e, 0x0387ef14, 0x035de7a4, 0x002aa4c5}}, Y: Field{[10]uint32{0x02afb9ad, 0x02e192b0, 0x01a05eff, 0x01afb38f, 0x00c18d14, 0x022d2001, 0x03e133ad, 0x0115a27c, 0x0304c134, 0x003b73b6}}}, + {X: Field{[10]uint32{0x022edf7b, 0x03bdbec8, 0x00e27536, 0x03e8d753, 0x0294f3ce, 0x0341b31a, 0x036fcbc6, 0x0366822e, 0x03e4da02, 0x00205c7c}}, Y: Field{[10]uint32{0x01e6dd6b, 0x0272967a, 0x03189749, 0x02de9963, 0x03c32038, 0x00f06993, 0x002b55f7, 0x00aae870, 0x01fcaae6, 0x003a46f9}}}, + {X: Field{[10]uint32{0x02a19ab6, 0x00201606, 0x024b111b, 0x009d0dd1, 0x01893fe6, 0x031e73de, 0x01888c93, 0x00a3998d, 0x0183c891, 0x00147db2}}, Y: Field{[10]uint32{0x0081a067, 0x003c164e, 0x03252a3d, 0x0003578d, 0x00b8cee4, 0x02a37194, 0x001dbf41, 0x0193d483, 0x01494bb1, 0x00174bbc}}}, + {X: Field{[10]uint32{0x03d7d38a, 0x002ae3db, 0x02580950, 0x02b1d36b, 0x03ec34df, 0x036c3769, 0x01016b19, 0x00c371a9, 0x0184766b, 0x0030287c}}, Y: Field{[10]uint32{0x02c6f01e, 0x024d65fa, 0x01490528, 0x007b1a57, 0x01b27f36, 0x009349aa, 0x01410516, 0x036bc4a7, 0x03e2c7b6, 0x002f72b4}}}, + {X: Field{[10]uint32{0x03a0eb02, 0x00e51c8c, 0x00a222bd, 0x026c7ade, 0x02fde927, 0x00d07bee, 0x02b6fe07, 0x0145a412, 0x02cc9543, 0x002c6ec7}}, Y: Field{[10]uint32{0x001689a8, 0x02fead32, 0x021d55a7, 0x02137931, 0x014b1490, 0x01c78325, 0x00dbf0a6, 0x010b8b03, 0x035b5253, 0x0037d48f}}}, + {X: Field{[10]uint32{0x000b5dce, 0x00f79f59, 0x00470180, 0x039da063, 0x023b0891, 0x010dce47, 0x0139ea7e, 0x013b5621, 0x00dc86d0, 0x002d730c}}, Y: Field{[10]uint32{0x02d4ec14, 0x00798bd0, 0x00b65ca4, 0x0077fff9, 0x009f5556, 0x00b80fca, 0x031acc86, 0x00c4b43e, 0x019e45c7, 0x003c7303}}}, + {X: Field{[10]uint32{0x0263ccb6, 0x03a503e4, 0x016b0da8, 0x008d47f8, 0x008cacee, 0x01f56507, 0x0155b3ea, 0x03fd4ca0, 0x01e705f0, 0x00378ad2}}, Y: Field{[10]uint32{0x018de99f, 0x01364fdb, 0x032ab74b, 0x02d5c0d5, 0x024690d5, 0x01e0552b, 0x017c6801, 0x02fd9ec3, 0x002bb12d, 0x000d35e9}}}, + {X: Field{[10]uint32{0x03cc8f51, 0x017cf395, 0x0311ad51, 0x02c3bcbb, 0x00ea5c0d, 0x0161c33f, 0x00984046, 0x03845c3a, 0x00e7c129, 0x0022c63d}}, Y: Field{[10]uint32{0x01111f37, 0x00b80226, 0x00aff884, 0x009f9acb, 0x0372281c, 0x0323b72c, 0x01e9d6cd, 0x012964f1, 0x0086c867, 0x001ac784}}}, + {X: Field{[10]uint32{0x03c86889, 0x0160aa45, 0x03442f9e, 0x0092da97, 0x01822ce4, 0x018aa0c3, 0x00e46f17, 0x03222246, 0x02c027ce, 0x001c9c58}}, Y: Field{[10]uint32{0x03223cca, 0x01bce28b, 0x02e7e841, 0x008f3145, 0x03248656, 0x024f9491, 0x03de5af6, 0x028da79b, 0x02961452, 0x00378d20}}}, + {X: Field{[10]uint32{0x0105058c, 0x0215adcd, 0x016056d0, 0x03f28fd8, 0x02946a75, 0x0309252f, 0x00eb9b81, 0x01d20fc6, 0x001f4dd1, 0x0012b93f}}, Y: Field{[10]uint32{0x032563e7, 0x011a4843, 0x017a39ae, 0x00db8b18, 0x0059999b, 0x0361e11c, 0x0034a05b, 0x03f05f68, 0x0012e901, 0x00361f9e}}}, + {X: Field{[10]uint32{0x03f43cd1, 0x00548197, 0x010bf58b, 0x02e93bda, 0x0272007b, 0x01abff40, 0x0026f016, 0x01cffa46, 0x01ace9e8, 0x003a42f2}}, Y: Field{[10]uint32{0x0164fa87, 0x0398d811, 0x02d58905, 0x00b34b95, 0x0147f076, 0x0196e6ff, 0x009b0c00, 0x03f5a147, 0x00e89acd, 0x0012f208}}}, + {X: Field{[10]uint32{0x011450ba, 0x0101db7d, 0x010209af, 0x0295fc14, 0x0208340b, 0x03a7bdd1, 0x021af7db, 0x00bedbde, 0x02a1db43, 0x002e82b9}}, Y: Field{[10]uint32{0x012be720, 0x021dabe4, 0x02908c58, 0x00630cba, 0x0351019a, 0x0068b0c2, 0x029894c5, 0x0250805c, 0x01b70409, 0x001f4e0e}}}, + {X: Field{[10]uint32{0x03accfeb, 0x020808b4, 0x03a5def8, 0x02fca607, 0x034f9682, 0x035ee5f5, 0x018b403e, 0x0194c476, 0x0381f77c, 0x001c1986}}, Y: Field{[10]uint32{0x02d06387, 0x02f13929, 0x0277e4e5, 0x02497d19, 0x027b4eeb, 0x02c1bf99, 0x024bd7cf, 0x027d366b, 0x01731895, 0x002408ae}}}, + {X: Field{[10]uint32{0x00471a47, 0x038248bf, 0x011d80e5, 0x0056347c, 0x0029451c, 0x0367be8e, 0x0381b817, 0x00e81c47, 0x03472815, 0x003f86de}}, Y: Field{[10]uint32{0x02b0f847, 0x02280d34, 0x01fae19c, 0x037c8d13, 0x0285725b, 0x03930c6a, 0x0115dc05, 0x02df1bec, 0x01cc68cf, 0x0025681d}}}, + {X: Field{[10]uint32{0x02cc3fc0, 0x01c3dfa6, 0x01e867ab, 0x00dfb171, 0x004325bc, 0x009f8e97, 0x0013d04f, 0x02a41ca0, 0x03d2bbae, 0x0022b3ce}}, Y: Field{[10]uint32{0x0216174e, 0x012195cf, 0x00785ee1, 0x03bf6f8b, 0x01b3e2e0, 0x02547e03, 0x01c06a25, 0x009f53ca, 0x03fb36da, 0x003d9e78}}}, + {X: Field{[10]uint32{0x02f395e3, 0x03aa3612, 0x0314f1d6, 0x03443283, 0x00d2db01, 0x03d8ae9f, 0x03fc6a47, 0x01f56ae1, 0x013725fc, 0x00076157}}, Y: Field{[10]uint32{0x020b1b90, 0x037234c0, 0x012a5815, 0x03436a24, 0x019b0a9a, 0x0189a317, 0x0255183f, 0x01953b51, 0x03ac2d41, 0x0033ac98}}}, + {X: Field{[10]uint32{0x012a8cba, 0x009b5c16, 0x0302e039, 0x02601147, 0x03099344, 0x01c3466d, 0x00ec6f6d, 0x01338f21, 0x016630c2, 0x0006aed1}}, Y: Field{[10]uint32{0x00525885, 0x0065521d, 0x01863f4b, 0x024d048a, 0x021778d2, 0x00c91514, 0x01886ef7, 0x01ff5cab, 0x006f6be8, 0x001189dc}}}, + {X: Field{[10]uint32{0x03eac036, 0x03cafaa4, 0x00a5fb86, 0x01992c26, 0x03620e5c, 0x0128fcc2, 0x01d07e24, 0x004bfe59, 0x00fa672c, 0x0006d1e4}}, Y: Field{[10]uint32{0x03edd60e, 0x00634939, 0x012831b0, 0x01c27278, 0x017c19fd, 0x02e0e47f, 0x022a9a06, 0x038b47ca, 0x00fca758, 0x003bb414}}}, + {X: Field{[10]uint32{0x00de3dd3, 0x00dcca9a, 0x01c98a43, 0x0280878f, 0x0344c106, 0x01584d9e, 0x01dcfc12, 0x032238c3, 0x032cfc9c, 0x001861e2}}, Y: Field{[10]uint32{0x02aed78e, 0x000037c7, 0x0229d436, 0x002dac4f, 0x03afc6f5, 0x0262a7be, 0x014cb774, 0x009e746d, 0x00a0037c, 0x003e8915}}}, + {X: Field{[10]uint32{0x0144308a, 0x010042a1, 0x030b5335, 0x006a4c5c, 0x00abc727, 0x0114088e, 0x00c21ecf, 0x03fac5ef, 0x01f02767, 0x00210123}}, Y: Field{[10]uint32{0x0193c32f, 0x03223b3a, 0x00b7c838, 0x02a90e33, 0x02605acc, 0x01dd8f1b, 0x03f9814f, 0x00239751, 0x024a39d6, 0x00351c4b}}}, + {X: Field{[10]uint32{0x02683a94, 0x02eb0cf2, 0x015cf889, 0x0032a201, 0x018ba37d, 0x01fa27e5, 0x031e1e03, 0x005d7b0f, 0x00e56c96, 0x003adeb1}}, Y: Field{[10]uint32{0x0285da8a, 0x00e053d7, 0x030112bc, 0x00ccbd45, 0x03cc07de, 0x004f7f1b, 0x00bfe075, 0x009d2db6, 0x02672ccc, 0x00125078}}}, + {X: Field{[10]uint32{0x02142e91, 0x00656bc8, 0x03eaf1a4, 0x0154e027, 0x014cbce4, 0x000a2370, 0x02b452ba, 0x012f6ad8, 0x02c9877d, 0x001228da}}, Y: Field{[10]uint32{0x0369659c, 0x0143aeaa, 0x02e2530b, 0x027087fd, 0x0027eec3, 0x013a5436, 0x02d88480, 0x018a21b1, 0x018a0125, 0x0038935b}}}, + {X: Field{[10]uint32{0x00cca1b5, 0x00b385af, 0x02a91252, 0x019320b4, 0x02e817b6, 0x02c8e803, 0x029af3b1, 0x028975e1, 0x01d05a62, 0x00270c49}}, Y: Field{[10]uint32{0x01e5afe3, 0x026daf4e, 0x03450a18, 0x0185541a, 0x01385663, 0x03863d7d, 0x00172774, 0x01c5a061, 0x0210f670, 0x0031bb36}}}, + {X: Field{[10]uint32{0x00f80d68, 0x02a479a4, 0x0116bc2c, 0x03b526bc, 0x0310160b, 0x013722f8, 0x033843e0, 0x019c371f, 0x0221dcc7, 0x000cfa07}}, Y: Field{[10]uint32{0x01757b6f, 0x024a4195, 0x01bb8fa5, 0x03a27b01, 0x029ce417, 0x03bf8e2b, 0x01f11678, 0x021b4b9b, 0x01d3a0a3, 0x0039a530}}}, + {X: Field{[10]uint32{0x036a1ad2, 0x00700cc6, 0x03056d8e, 0x012e29a3, 0x035c1d0d, 0x00256609, 0x02b10715, 0x0383f2ff, 0x029e6899, 0x002550dd}}, Y: Field{[10]uint32{0x009b0d7e, 0x01e54d3b, 0x00b163f5, 0x0219fd9a, 0x0301c4be, 0x00bb473a, 0x035f1487, 0x021041d8, 0x03fdafc5, 0x0001c033}}}, + {X: Field{[10]uint32{0x0039efdd, 0x0142099d, 0x00203a0d, 0x018f8877, 0x026ca9b1, 0x02d4201f, 0x0081e6e5, 0x00b0e5f5, 0x00d173e6, 0x0013d073}}, Y: Field{[10]uint32{0x0069f79d, 0x0339df43, 0x011eed95, 0x02ff8563, 0x008fea56, 0x02dd2c95, 0x00b309ba, 0x0065cb62, 0x02d6aa8c, 0x003efe63}}}, + {X: Field{[10]uint32{0x005f12e5, 0x03b3c819, 0x03bd9064, 0x01a91946, 0x00a667fe, 0x023baf0a, 0x03fd9c33, 0x00037ef8, 0x0245584b, 0x00133eda}}, Y: Field{[10]uint32{0x0214652b, 0x006486bd, 0x0312f550, 0x028979ca, 0x00219638, 0x00495640, 0x00fac21d, 0x003a1d1c, 0x02dafe08, 0x000b77f5}}}, + {X: Field{[10]uint32{0x01eca626, 0x005dd5dd, 0x039821f2, 0x0324605f, 0x038e536b, 0x03eb94ce, 0x02217fd8, 0x028cf297, 0x03ecd9bb, 0x0027bee2}}, Y: Field{[10]uint32{0x00658fb4, 0x003e32ac, 0x02f8e944, 0x02e21d78, 0x018e3573, 0x029f70f8, 0x00bcf9c1, 0x03057a46, 0x00ed0529, 0x001984c0}}}, + {X: Field{[10]uint32{0x0030e441, 0x039876b9, 0x02470da9, 0x03e7a143, 0x00f5d3c0, 0x02f9b717, 0x01ab953e, 0x039302e1, 0x01525be7, 0x0030aa02}}, Y: Field{[10]uint32{0x009d9d2d, 0x02713be0, 0x0277b483, 0x018f5434, 0x036be063, 0x03027ef0, 0x026fa221, 0x01a5f1f6, 0x0136bf72, 0x00074b7b}}}, + {X: Field{[10]uint32{0x03baa707, 0x010b808e, 0x0030c0a2, 0x02d006fe, 0x032501a1, 0x031882c4, 0x02162764, 0x0208afd6, 0x036b49ae, 0x0010adff}}, Y: Field{[10]uint32{0x02b71d6d, 0x00288da0, 0x028b0eb9, 0x0254317a, 0x00fb2c75, 0x032ed68e, 0x02de994d, 0x039001c4, 0x005883f0, 0x003907f8}}}, + {X: Field{[10]uint32{0x03b0c28c, 0x007c38aa, 0x0386df78, 0x02d1fb8e, 0x01e00cc3, 0x017de3ce, 0x03e15185, 0x02d904ab, 0x0129d420, 0x003b82ec}}, Y: Field{[10]uint32{0x000aec61, 0x00d0fad7, 0x01099258, 0x015552ba, 0x0154b174, 0x003b6eb7, 0x006204b6, 0x02891d9f, 0x027a5a4f, 0x003dc743}}}, + {X: Field{[10]uint32{0x00ef5b9a, 0x0121f01e, 0x02e789ca, 0x0390a894, 0x0077546c, 0x009b140f, 0x031a7160, 0x00efd499, 0x02079cdb, 0x0007c762}}, Y: Field{[10]uint32{0x03571c20, 0x027a6365, 0x01cfc5c3, 0x02a98f47, 0x00180ee4, 0x03ef0c19, 0x00e8e6f9, 0x0144b7aa, 0x030dae55, 0x00318444}}}, + {X: Field{[10]uint32{0x02a31310, 0x004bfb34, 0x017b8b29, 0x01b97e4c, 0x027cf313, 0x01063c05, 0x026ebe55, 0x027ec564, 0x0006ecdc, 0x0016f6a7}}, Y: Field{[10]uint32{0x005ecad7, 0x02370a01, 0x023feb72, 0x01a285ed, 0x03890761, 0x01cbab6c, 0x03e59d5b, 0x00983203, 0x0370dce1, 0x000d63fe}}}, + {X: Field{[10]uint32{0x03866ea6, 0x011d5137, 0x01be91f8, 0x01cd2018, 0x01edc789, 0x0383bf5c, 0x0252dec8, 0x031c9d99, 0x0103fa50, 0x0030cbd9}}, Y: Field{[10]uint32{0x01fca304, 0x02e71c40, 0x008566de, 0x00a882e0, 0x006a34af, 0x02c4fc2c, 0x0309443c, 0x03b3101e, 0x02267a13, 0x0019c8d2}}}, + {X: Field{[10]uint32{0x0089caed, 0x0337aa25, 0x03069941, 0x01ce25ae, 0x00849bb6, 0x02584990, 0x026c83f2, 0x03ac19c3, 0x0111b71f, 0x001520f5}}, Y: Field{[10]uint32{0x008c1148, 0x034e49f6, 0x03ecfbfe, 0x0141e512, 0x03494d53, 0x03639377, 0x02df0f38, 0x00d0dd02, 0x0262d323, 0x0028269a}}}, + {X: Field{[10]uint32{0x02a322ef, 0x00625603, 0x010472d5, 0x03f6710f, 0x02d5e3c6, 0x029b3091, 0x00b93425, 0x01aae47b, 0x035ff0b8, 0x000f4b63}}, Y: Field{[10]uint32{0x0155b830, 0x027cd936, 0x00509c73, 0x03b28613, 0x00fb45d7, 0x01c75d82, 0x039cf4ab, 0x03381461, 0x008b4c23, 0x0010620d}}}, + {X: Field{[10]uint32{0x01af1dc0, 0x011d5d08, 0x01e9e40b, 0x000eaae2, 0x00735ddf, 0x024daf04, 0x01ffa9df, 0x019e017f, 0x013929ed, 0x000e970e}}, Y: Field{[10]uint32{0x00a7011d, 0x020893a4, 0x0081e0dd, 0x00aea517, 0x0344dcd5, 0x00a5d720, 0x002a7de2, 0x00a458ab, 0x01197675, 0x001d82c6}}}, + {X: Field{[10]uint32{0x00590a83, 0x03752135, 0x01f900e5, 0x0120cdcf, 0x00648869, 0x03892831, 0x039272ef, 0x0301b8fb, 0x02ac7c1c, 0x0028f548}}, Y: Field{[10]uint32{0x021b6be2, 0x007cb13b, 0x00795566, 0x031a4c15, 0x0328c377, 0x000005a5, 0x01684a95, 0x03758486, 0x022cb739, 0x001bd4ee}}}, + {X: Field{[10]uint32{0x00e8180f, 0x01451176, 0x01d42367, 0x021f76e5, 0x02c1437d, 0x00b80aa8, 0x00785836, 0x00806110, 0x01311399, 0x003bc2c2}}, Y: Field{[10]uint32{0x0086c634, 0x03210ae5, 0x019801b9, 0x0029065c, 0x00217352, 0x024be31d, 0x00408cdf, 0x011dc9f4, 0x00078d18, 0x001cefd1}}}, + {X: Field{[10]uint32{0x0115da20, 0x01bd031b, 0x03e070f2, 0x01734728, 0x02a770c1, 0x01846169, 0x02118991, 0x033ae708, 0x03fd1498, 0x0020503b}}, Y: Field{[10]uint32{0x0022a474, 0x03127f40, 0x01c3e45f, 0x0008280b, 0x03051c11, 0x0058bc0e, 0x028b7eb2, 0x02dfc6f9, 0x03df6d2d, 0x00131d3c}}}, + {X: Field{[10]uint32{0x03e122f0, 0x02966f3a, 0x00b74215, 0x03c000de, 0x017603c7, 0x03f5bf59, 0x0132f4d3, 0x027c7e4f, 0x03208e08, 0x000d1175}}, Y: Field{[10]uint32{0x010b6d5b, 0x0388e922, 0x013d4b63, 0x00dfa0a5, 0x0238da06, 0x000db868, 0x03c8626f, 0x013bcce8, 0x035dfdb5, 0x001b5040}}}, + {X: Field{[10]uint32{0x03a58cd7, 0x008f50fd, 0x02b9c72c, 0x01b57f9a, 0x01789a36, 0x00493378, 0x01933f97, 0x00da6874, 0x025a6235, 0x003852ca}}, Y: Field{[10]uint32{0x01fc8f8f, 0x011342fe, 0x013be447, 0x00658954, 0x01d67a9f, 0x022a7962, 0x02fe6ce5, 0x030409b2, 0x02c52f63, 0x00085bc1}}}, + {X: Field{[10]uint32{0x01891e0b, 0x00fa4b8b, 0x00deaf8f, 0x00199cd2, 0x00eec931, 0x0302205c, 0x010b2b33, 0x02f113f3, 0x00bc8389, 0x001b6590}}, Y: Field{[10]uint32{0x0104227d, 0x00af105f, 0x0331a185, 0x02c20586, 0x0068b5d4, 0x010a21ff, 0x0204759a, 0x036d927f, 0x00856e42, 0x0012d305}}}, + {X: Field{[10]uint32{0x019b2916, 0x002bf3bf, 0x0232462a, 0x0016e781, 0x02fd028a, 0x01f00ec6, 0x027cc60d, 0x007c84fd, 0x00045c46, 0x0009cbc5}}, Y: Field{[10]uint32{0x03348416, 0x03350cea, 0x00b1e825, 0x020cc551, 0x03fd6b75, 0x0003ac37, 0x023f78d8, 0x00d4e029, 0x02c0c0b2, 0x002618d7}}}, + {X: Field{[10]uint32{0x033a07e3, 0x00ca7b87, 0x02257681, 0x013b7a45, 0x02415233, 0x0378738e, 0x01250bec, 0x01d1698c, 0x0128eaae, 0x002a3266}}, Y: Field{[10]uint32{0x03351621, 0x03358479, 0x006209f5, 0x02df9879, 0x0124ae51, 0x0058bfb4, 0x01149aa5, 0x00fdfa38, 0x0286abdf, 0x00133309}}}, + {X: Field{[10]uint32{0x00975409, 0x00e18036, 0x01ceffac, 0x01403f4c, 0x011c660d, 0x02c79320, 0x01be6869, 0x03559626, 0x03337f93, 0x003ec092}}, Y: Field{[10]uint32{0x00c7fdb0, 0x01cbd1f1, 0x01e127b0, 0x028a2765, 0x03ee562c, 0x0115e59b, 0x00730c39, 0x00f255fa, 0x02b78bff, 0x000ce5a1}}}, + {X: Field{[10]uint32{0x00562f9c, 0x021c15ca, 0x014f2351, 0x03e73912, 0x00a6cb14, 0x0246e136, 0x03ecfe36, 0x00d525dc, 0x0147aa61, 0x00383921}}, Y: Field{[10]uint32{0x00a7b307, 0x01dbbbf7, 0x03676a6d, 0x03e1a7d1, 0x03778609, 0x00e58012, 0x03488389, 0x01d60149, 0x018b5640, 0x00182db7}}}, + {X: Field{[10]uint32{0x025d16e4, 0x01bbd644, 0x02169807, 0x00f77fb0, 0x03ed9e38, 0x001786c2, 0x0374d296, 0x022d4c27, 0x002d378b, 0x002f5b10}}, Y: Field{[10]uint32{0x01ef2c24, 0x0086c8a7, 0x00f10755, 0x012de544, 0x02a27692, 0x0231b4b0, 0x036a8f8c, 0x0071ecdd, 0x009cbb76, 0x00330eab}}}, + {X: Field{[10]uint32{0x01e451c0, 0x0085eb01, 0x02ef552c, 0x02f78542, 0x01d5886c, 0x03da548d, 0x00e2c554, 0x013d1051, 0x0231eefa, 0x0039a464}}, Y: Field{[10]uint32{0x03b1cfa7, 0x02ea6b18, 0x0346bc2a, 0x03f1a49f, 0x0173a888, 0x00a8473f, 0x0156133c, 0x00984ad3, 0x01d4d34d, 0x0039d3b8}}}, + {X: Field{[10]uint32{0x003d03a9, 0x02e92868, 0x01463f9c, 0x007a3051, 0x02037c48, 0x00a2f6ce, 0x012ac5a3, 0x01e1d136, 0x006a2a48, 0x0006a6b3}}, Y: Field{[10]uint32{0x01f0fb10, 0x01f1623f, 0x01ca126a, 0x0206d26d, 0x02df71fc, 0x01ff87d7, 0x02224224, 0x00d8a3eb, 0x029a960e, 0x0002e981}}}, + {X: Field{[10]uint32{0x02070910, 0x033bd33d, 0x028d536c, 0x0108f5b6, 0x00abfde6, 0x00b6e66e, 0x004e9395, 0x038c07cb, 0x03a92e5f, 0x0016d4ae}}, Y: Field{[10]uint32{0x0347ae29, 0x01bb796d, 0x00341f54, 0x02c0bf9d, 0x02cc1ab1, 0x01c6bb42, 0x00c68f0a, 0x0089f446, 0x03dd901e, 0x00042376}}}, + {X: Field{[10]uint32{0x01e05242, 0x00ce29ac, 0x022860f1, 0x02935fe6, 0x000652b0, 0x00ef8a0a, 0x01a096a7, 0x020aa6c4, 0x03601ebe, 0x0024b04d}}, Y: Field{[10]uint32{0x02449d7c, 0x02b01b02, 0x0027559f, 0x02f74538, 0x0251a588, 0x017db1e6, 0x003dd578, 0x0343e975, 0x03fc2dc6, 0x000b8fa4}}}, + {X: Field{[10]uint32{0x014318b8, 0x03ff97c7, 0x01d69a12, 0x01e7d818, 0x0194b4f2, 0x022550af, 0x021c749e, 0x01305dce, 0x00da7996, 0x000f2dbe}}, Y: Field{[10]uint32{0x03b11956, 0x02e904da, 0x01d54d05, 0x01c5b9ac, 0x0272a777, 0x02bb8a55, 0x023bd02f, 0x016b6370, 0x01a8b4f4, 0x0010b930}}}, + {X: Field{[10]uint32{0x03dbf5db, 0x00545142, 0x0183f664, 0x01366a00, 0x013c60a1, 0x01437839, 0x01a51100, 0x00637444, 0x0351d345, 0x0017fb58}}, Y: Field{[10]uint32{0x0346c3f6, 0x0299621d, 0x036cd056, 0x0078a579, 0x01da77e0, 0x026f60dd, 0x00140b64, 0x029342dd, 0x0190de07, 0x001ade69}}}, + {X: Field{[10]uint32{0x015d3840, 0x0064f8f6, 0x0356e7d3, 0x02c7f43e, 0x00a14132, 0x0301844a, 0x00245d37, 0x0213cadf, 0x00a781c3, 0x000ae23c}}, Y: Field{[10]uint32{0x01a0e10e, 0x021cfe22, 0x02981bd4, 0x02e520e2, 0x00c1632b, 0x0089125d, 0x01b6453c, 0x01b95d95, 0x03a21144, 0x003de1f9}}}, + {X: Field{[10]uint32{0x03293443, 0x02ec0b60, 0x02fd2047, 0x0253a623, 0x0118507f, 0x0368d9c6, 0x030ac3e1, 0x0157ecd6, 0x03b15a3f, 0x0031ec91}}, Y: Field{[10]uint32{0x01b85f4f, 0x01ee341b, 0x00b6799e, 0x03d993cf, 0x00c3c8e5, 0x0309f152, 0x02b6ac8b, 0x017c448d, 0x003734c6, 0x0012ad01}}}, + {X: Field{[10]uint32{0x003647dd, 0x02a8dd78, 0x005344c6, 0x03484875, 0x0045df69, 0x00b04df8, 0x0008a201, 0x02520417, 0x01338dcb, 0x00377f6a}}, Y: Field{[10]uint32{0x03795c1b, 0x02ff96d5, 0x02091bbc, 0x015691be, 0x0095f912, 0x0161c4b4, 0x032e93ac, 0x005af565, 0x01fd02a1, 0x003a57de}}}, + {X: Field{[10]uint32{0x031da7db, 0x013fbe8d, 0x00c29da0, 0x02d99dfe, 0x029d15a6, 0x0091fa1f, 0x03e3233b, 0x02c415b1, 0x02455084, 0x00372369}}, Y: Field{[10]uint32{0x001449c3, 0x00c81211, 0x00c80931, 0x00a198df, 0x018fc66d, 0x022f5da1, 0x0207fea0, 0x03b00fda, 0x01a3fde3, 0x0030a8d1}}}, + {X: Field{[10]uint32{0x01ff5333, 0x015520b4, 0x0395b8e3, 0x0334ea31, 0x02a31547, 0x0190e415, 0x0263bc7a, 0x02fea3c4, 0x0326c5fc, 0x003d4fce}}, Y: Field{[10]uint32{0x02716ac1, 0x022f8eb9, 0x031d1bb6, 0x03b1e662, 0x035249e8, 0x005f13ec, 0x0188f1da, 0x02e72a63, 0x0145e664, 0x000044fb}}}, + {X: Field{[10]uint32{0x0246cae9, 0x0277242d, 0x03a391d8, 0x021a4c4e, 0x027d7546, 0x0365a77d, 0x021d6477, 0x012d793b, 0x03fd0c6d, 0x00192348}}, Y: Field{[10]uint32{0x03e18962, 0x036f8a00, 0x0120615e, 0x01500c98, 0x009b3364, 0x02b81a5f, 0x02ffbd4b, 0x01d74d39, 0x00452393, 0x00340d78}}}, + {X: Field{[10]uint32{0x002839b1, 0x020ff84f, 0x011cb1c4, 0x038ac72a, 0x03bd51bd, 0x035c2cd0, 0x0073f3ed, 0x01603e09, 0x010e5dbe, 0x0024b9b7}}, Y: Field{[10]uint32{0x039577a5, 0x03d1852c, 0x012015dd, 0x007a8432, 0x01a61ab0, 0x02826ce4, 0x02d1a465, 0x01ef4964, 0x03fea544, 0x00336437}}}, + {X: Field{[10]uint32{0x009f687b, 0x013b983d, 0x03b782ef, 0x020daf9b, 0x00eaec05, 0x02505695, 0x0223ec54, 0x03be33e8, 0x018a7616, 0x0004c579}}, Y: Field{[10]uint32{0x03e1431c, 0x016109b5, 0x0280f1ac, 0x0285cdf6, 0x022fe189, 0x036b1caa, 0x00e1fa45, 0x01832f15, 0x0100802d, 0x001ca780}}}, + {X: Field{[10]uint32{0x033e2a3b, 0x0008522a, 0x035e6c94, 0x03579b41, 0x0186b001, 0x00d55394, 0x026b284a, 0x03f61438, 0x03999857, 0x000f22a5}}, Y: Field{[10]uint32{0x00b25977, 0x01a76f4a, 0x012f6d6c, 0x00568410, 0x03a722e9, 0x00140819, 0x0087b3d6, 0x00829565, 0x0092acc7, 0x001193c1}}}, + {X: Field{[10]uint32{0x027591c8, 0x00ba9d84, 0x00879f86, 0x03e3fc0f, 0x010bf3c7, 0x01be6b38, 0x02b37cae, 0x0317d10d, 0x0230cc94, 0x003a905c}}, Y: Field{[10]uint32{0x01a4faa6, 0x01819f61, 0x033ace91, 0x01d5c09a, 0x006f4ec4, 0x02735010, 0x00cff1eb, 0x03542eeb, 0x00cb8d95, 0x0025848e}}}, + {X: Field{[10]uint32{0x021a6ceb, 0x0066854d, 0x0040bceb, 0x0282c316, 0x0348496c, 0x00b262bd, 0x01a8c816, 0x001e78ca, 0x01c2f271, 0x0023b33e}}, Y: Field{[10]uint32{0x017e56af, 0x00f5a1ec, 0x03a5b0b5, 0x00e684cb, 0x01c8ac52, 0x00bcdeca, 0x00c6a7c5, 0x03c6a98c, 0x0219165b, 0x000f8966}}}, + {X: Field{[10]uint32{0x030f296d, 0x00e62d53, 0x0155677f, 0x004e10b3, 0x027bf3d9, 0x0153adaa, 0x033c34ab, 0x00e965a1, 0x0083b350, 0x000cbc3f}}, Y: Field{[10]uint32{0x0381a811, 0x036328be, 0x01e26655, 0x02b73268, 0x00311e50, 0x032d7dec, 0x02da3459, 0x01e2dd8b, 0x016d906f, 0x00351cdb}}}, + {X: Field{[10]uint32{0x00d7accb, 0x00c60db8, 0x00a9f638, 0x0302c985, 0x03e4fa4c, 0x017fdf2f, 0x03c171da, 0x00ea3e90, 0x011077c8, 0x002df58c}}, Y: Field{[10]uint32{0x016be9de, 0x0217af5e, 0x037e35e2, 0x02d30648, 0x008b84a5, 0x0307ae99, 0x02c27ef9, 0x00554aa2, 0x02405644, 0x0018257d}}}, + {X: Field{[10]uint32{0x02536954, 0x009a52ef, 0x02cf06c3, 0x03e35a49, 0x010588b4, 0x0158f95b, 0x00cd74e6, 0x013ec295, 0x004a22df, 0x003bdb24}}, Y: Field{[10]uint32{0x025dbaa4, 0x02568881, 0x00c9fb10, 0x024b83a7, 0x02aa7a04, 0x00dc5788, 0x03c3d3c4, 0x00de9396, 0x00b144cd, 0x000c2244}}}, + {X: Field{[10]uint32{0x02941a6a, 0x00b5eac8, 0x02e27067, 0x0079baaa, 0x02b37524, 0x012385fe, 0x00eebf0b, 0x0096f2b3, 0x03d1e628, 0x0006784e}}, Y: Field{[10]uint32{0x00b613f7, 0x00f2430a, 0x03bbad3e, 0x019b92bc, 0x02855ea6, 0x02fe3330, 0x01308bbd, 0x016f0455, 0x03290700, 0x001bc8b0}}}, + {X: Field{[10]uint32{0x008e9420, 0x02dec447, 0x025df967, 0x02af5e4a, 0x009a98a7, 0x03ca602c, 0x0349ae45, 0x03de41e4, 0x00df10f2, 0x0015f66f}}, Y: Field{[10]uint32{0x0265db68, 0x01a29ca6, 0x0265eb50, 0x03d6ff93, 0x0142ebfd, 0x033009ec, 0x00f8fcb1, 0x0215378d, 0x01e1d9b7, 0x002fd997}}}, + {X: Field{[10]uint32{0x03df06b2, 0x03e1eb80, 0x0057e4e3, 0x0087c4f4, 0x00bb530a, 0x0347b4c9, 0x038874e3, 0x017a2c21, 0x02857c3d, 0x000def19}}, Y: Field{[10]uint32{0x00998539, 0x00711493, 0x02ec83a8, 0x02f5cbd7, 0x0377764a, 0x00729eef, 0x02abbeac, 0x02c4bbc4, 0x03dc764d, 0x00055066}}}, + {X: Field{[10]uint32{0x01c2cec2, 0x01962a7e, 0x021387f3, 0x00729d04, 0x00b572e1, 0x01944b0b, 0x00012a59, 0x024544cf, 0x01d99ca5, 0x0006cc31}}, Y: Field{[10]uint32{0x02f39697, 0x02c16417, 0x0169101d, 0x01445a97, 0x002344f7, 0x01ebe327, 0x004d8421, 0x03343150, 0x020b2a0d, 0x0037108c}}}, + {X: Field{[10]uint32{0x01efd0bf, 0x02d387f0, 0x03e65b8d, 0x008616e4, 0x01e6e89f, 0x016b5297, 0x0329f4f8, 0x0156b374, 0x01b3050c, 0x0025a0c7}}, Y: Field{[10]uint32{0x03d47837, 0x0127b673, 0x00ef455e, 0x035687e3, 0x0082bd8b, 0x01c1cbcb, 0x0275ef61, 0x01ce6b43, 0x0020fd03, 0x0021bd0e}}}, + {X: Field{[10]uint32{0x00e3d8ad, 0x024f3551, 0x0379266b, 0x027a85f2, 0x02bce799, 0x01eb3550, 0x0309f28f, 0x00129560, 0x000faa1f, 0x00334bd4}}, Y: Field{[10]uint32{0x00dd8c29, 0x025011b2, 0x0009e929, 0x00158fbc, 0x0127dd1b, 0x02057de5, 0x00743c24, 0x03abba5f, 0x0080ddfc, 0x0007e5dc}}}, + {X: Field{[10]uint32{0x02d01c08, 0x00af85d2, 0x003e8ff3, 0x0279829e, 0x00802f51, 0x00d54a4a, 0x0318ff9d, 0x02789e8c, 0x027d237c, 0x00180e4a}}, Y: Field{[10]uint32{0x02893fdc, 0x03615bc8, 0x02065663, 0x00714e7f, 0x0088ae9e, 0x03ca5f11, 0x0194afbd, 0x0347e362, 0x0147df91, 0x003adfcc}}}, + {X: Field{[10]uint32{0x0237ee9a, 0x015d3e7e, 0x03c90d22, 0x01e45e6c, 0x03d8abb6, 0x03cf075f, 0x00d68fb9, 0x02adcc08, 0x03ad0df6, 0x003db3dd}}, Y: Field{[10]uint32{0x0042ebd1, 0x031de389, 0x03523280, 0x02e873e6, 0x0177e81e, 0x037dd8c4, 0x01d513b7, 0x03dc59ad, 0x01c33587, 0x0023fe8a}}}, + {X: Field{[10]uint32{0x027cdf7a, 0x001c50b6, 0x00abd018, 0x028b49a9, 0x00944a0e, 0x0046f8bf, 0x01b6f4ff, 0x03145165, 0x015af542, 0x0015f200}}, Y: Field{[10]uint32{0x00b05da9, 0x0319cfaa, 0x03e3d2c9, 0x02ff45b8, 0x00ffb692, 0x028dd537, 0x02b32d33, 0x00f319ed, 0x039e8015, 0x002d9f1d}}}, + {X: Field{[10]uint32{0x034fe462, 0x0390679a, 0x03b4bfa1, 0x01feed90, 0x012f58a1, 0x02ba664c, 0x03d5c51c, 0x01248bfe, 0x0158ac18, 0x001ff821}}, Y: Field{[10]uint32{0x01ec7a11, 0x023ef9de, 0x0079e5a8, 0x01745664, 0x007268cb, 0x03565616, 0x027e9e4c, 0x0162d4db, 0x037d8bbf, 0x001d8011}}}, + {X: Field{[10]uint32{0x01517b75, 0x0367cfb7, 0x0177d87b, 0x017d62f8, 0x023d8109, 0x03639f13, 0x029b87a0, 0x026fbf5c, 0x016e73b3, 0x000b85bd}}, Y: Field{[10]uint32{0x035fcb7a, 0x013905cd, 0x011aa69b, 0x03c1e808, 0x0177aa59, 0x01a3c260, 0x02c950e6, 0x00e836ea, 0x01ef5732, 0x0013389c}}}, + {X: Field{[10]uint32{0x00ffdedb, 0x03ae9886, 0x017ad9c2, 0x039b4b76, 0x0049200d, 0x0328929a, 0x0381f666, 0x01e00af9, 0x000d456d, 0x0029351c}}, Y: Field{[10]uint32{0x026e4532, 0x0350d3f1, 0x036d5efe, 0x0396bc4b, 0x009124aa, 0x02192936, 0x030e7628, 0x0283c3a3, 0x006d0e7b, 0x0030267e}}}, + {X: Field{[10]uint32{0x033fc059, 0x02306676, 0x0145dc04, 0x01d061fc, 0x01a2327e, 0x00795eb9, 0x016c9219, 0x0278fa8c, 0x01505011, 0x002d1d93}}, Y: Field{[10]uint32{0x0398653c, 0x00f55a91, 0x03092c2f, 0x01c13e93, 0x004f1270, 0x0005a862, 0x00831ea9, 0x0084a4fb, 0x00facc27, 0x0038e6fa}}}, + {X: Field{[10]uint32{0x027e2d0e, 0x0064c6c3, 0x02235503, 0x008ebae0, 0x02c29fe1, 0x0213f1a5, 0x015b352e, 0x02afc33b, 0x03a7d291, 0x000f9a1a}}, Y: Field{[10]uint32{0x0185d266, 0x0371306a, 0x02ed88c7, 0x001e6327, 0x005a889b, 0x00c86e6e, 0x00caf9a9, 0x00f207e1, 0x00ab07cc, 0x001ecd70}}}, + {X: Field{[10]uint32{0x024a46c5, 0x02501f34, 0x03346db4, 0x0014a234, 0x03584001, 0x00c488c5, 0x0161e563, 0x01c3bf16, 0x032d1d4c, 0x0035e21b}}, Y: Field{[10]uint32{0x00b9efc8, 0x02501015, 0x023e868d, 0x00fe053c, 0x03c5ef50, 0x0135f6ea, 0x0225903d, 0x018092cb, 0x02e617c4, 0x00369917}}}, + {X: Field{[10]uint32{0x03a17a40, 0x01e643c2, 0x03475d3a, 0x03c8c976, 0x02cea867, 0x038dd519, 0x0257ba71, 0x0135016a, 0x03cc1465, 0x001f2f48}}, Y: Field{[10]uint32{0x02dcbc51, 0x03968774, 0x0303954c, 0x01ffb74d, 0x02088d32, 0x018e3b3a, 0x005541ee, 0x01b6d2e6, 0x01af96e6, 0x003b7739}}}, + {X: Field{[10]uint32{0x03eb9795, 0x02e62505, 0x00a5c5d2, 0x02ed6185, 0x0018f877, 0x00cf0864, 0x00ea0a92, 0x03876bbb, 0x0185c279, 0x00151898}}, Y: Field{[10]uint32{0x00e9b6f8, 0x0342e1b8, 0x0309d928, 0x03c37192, 0x018cfb07, 0x033f1e46, 0x03967305, 0x0211502f, 0x0185dc8f, 0x001941fb}}}, + {X: Field{[10]uint32{0x0163c32e, 0x02170201, 0x00681892, 0x03e78880, 0x0259e68c, 0x0376afbe, 0x02db20aa, 0x030b38af, 0x01551cbe, 0x003b73bc}}, Y: Field{[10]uint32{0x02753179, 0x035e8f6f, 0x00b33b03, 0x03f677da, 0x00bed59e, 0x032e936d, 0x016ab45b, 0x00a14f0a, 0x01437559, 0x002b799c}}}, + {X: Field{[10]uint32{0x023380cd, 0x02342180, 0x02dd99cf, 0x017320d2, 0x036a30bc, 0x032476df, 0x03db47fb, 0x03e74fc9, 0x0153ff6e, 0x003809ea}}, Y: Field{[10]uint32{0x03a2bbf5, 0x00d8b6b2, 0x032e4c7e, 0x02025d61, 0x0162eafc, 0x03114aa0, 0x012d174a, 0x03408239, 0x004de18a, 0x00079ac9}}}, + {X: Field{[10]uint32{0x02e2b2d6, 0x02b1bd9c, 0x00960e17, 0x00b2aa88, 0x0366dbf9, 0x01e1f549, 0x02a251f3, 0x00090953, 0x0168db98, 0x0029401b}}, Y: Field{[10]uint32{0x020b2b9c, 0x00fea95a, 0x01babfa6, 0x037d735b, 0x0372d1e6, 0x003dd1c8, 0x0198766c, 0x03756e53, 0x017ee854, 0x002864e3}}}, + {X: Field{[10]uint32{0x0027be11, 0x039419a1, 0x004e03d5, 0x00943b94, 0x01dbb020, 0x00a65646, 0x029adf73, 0x03f67b69, 0x01f201a1, 0x000c9c1d}}, Y: Field{[10]uint32{0x03c4debb, 0x02ace05a, 0x02df32de, 0x03091466, 0x02611a4e, 0x036157e8, 0x00ee3356, 0x0252fa52, 0x02b1c32e, 0x0010695f}}}, + {X: Field{[10]uint32{0x023363bd, 0x01e567c6, 0x0399ac1c, 0x0013188d, 0x039c87ac, 0x03a57dd2, 0x010cdcd7, 0x012f29ac, 0x01c66669, 0x0025f869}}, Y: Field{[10]uint32{0x00ab5e88, 0x026e49f2, 0x006a948c, 0x02601095, 0x01566894, 0x0359c709, 0x032bb6c4, 0x01587ded, 0x008d1ec7, 0x000f3269}}}, + {X: Field{[10]uint32{0x00c07a21, 0x0243b4ec, 0x01a047f7, 0x01a27dbf, 0x03d0a2d8, 0x013bad2a, 0x01bce28f, 0x01373f44, 0x0240a737, 0x001143e9}}, Y: Field{[10]uint32{0x03a77f4c, 0x00f285bb, 0x0231fc4c, 0x01b1fae8, 0x02aa35a5, 0x0034774d, 0x002a1f17, 0x033e8752, 0x0298dc17, 0x003aba20}}}, + {X: Field{[10]uint32{0x020a6559, 0x007bd2e7, 0x004a8a7a, 0x02461fa5, 0x00d81fad, 0x01025090, 0x0209ce1f, 0x019a84b6, 0x0340fc0a, 0x003d6a9c}}, Y: Field{[10]uint32{0x02eb5017, 0x0367f1ca, 0x022e349a, 0x004276d4, 0x00899d98, 0x02136e9d, 0x02e7738f, 0x024bc718, 0x03da9ef9, 0x0004956c}}}, + {X: Field{[10]uint32{0x0242f1b4, 0x032529e2, 0x02c8c90c, 0x022a2c53, 0x028857ac, 0x01fef5d6, 0x03238419, 0x01e0da9e, 0x01655519, 0x0001a402}}, Y: Field{[10]uint32{0x031b027b, 0x02eb6305, 0x007100f1, 0x02d3a7bd, 0x02952b5b, 0x02f817cc, 0x02271072, 0x025db6d1, 0x01d2038c, 0x00077060}}}, + {X: Field{[10]uint32{0x03f290aa, 0x00b484b0, 0x01e878ff, 0x03e4cd55, 0x03bc3bc0, 0x030dd830, 0x019f377b, 0x0104d9fa, 0x005a8ed8, 0x000ac6a8}}, Y: Field{[10]uint32{0x0013e280, 0x019f9633, 0x00a417b2, 0x002b2f74, 0x0035e900, 0x01fcda2f, 0x01f58965, 0x02f0c645, 0x02f41eb8, 0x0011ec96}}}, + {X: Field{[10]uint32{0x0052d81d, 0x00574974, 0x01a7ab53, 0x00e75320, 0x03454b1e, 0x00017976, 0x013540d3, 0x02bfc366, 0x029ca18c, 0x002939ad}}, Y: Field{[10]uint32{0x015d70c5, 0x02b70068, 0x0182236f, 0x00845f22, 0x00df4fcb, 0x00b9e9bb, 0x02d78edc, 0x01e41290, 0x01039c58, 0x001f3fc8}}}, + {X: Field{[10]uint32{0x039d2582, 0x01a45bec, 0x00fa17a3, 0x02ca029f, 0x01f728e1, 0x02775de5, 0x039cb0fd, 0x03292cf8, 0x0396c74f, 0x002ad12e}}, Y: Field{[10]uint32{0x0026f5c1, 0x01a8b264, 0x00ab7cb7, 0x036079e5, 0x037edc0d, 0x00645659, 0x0373febb, 0x03633279, 0x03a4519f, 0x00167646}}}, + {X: Field{[10]uint32{0x01e332a2, 0x036f08e7, 0x03cc7715, 0x01d5750b, 0x00934729, 0x015108a2, 0x016a31ae, 0x030f9232, 0x005b3fb9, 0x0020ec32}}, Y: Field{[10]uint32{0x01a6da6e, 0x034c07cd, 0x014b1e36, 0x00e4b592, 0x009652d7, 0x03c21a00, 0x0033b342, 0x00160bf6, 0x0240fb62, 0x003a67d5}}}, + {X: Field{[10]uint32{0x03954537, 0x02c856bb, 0x0078841e, 0x03d10381, 0x03e5bd10, 0x01402f03, 0x02911ee0, 0x033e059d, 0x013e624e, 0x003a914c}}, Y: Field{[10]uint32{0x000c7445, 0x0344c4db, 0x0244e81a, 0x0005342d, 0x00d5afb1, 0x027a2915, 0x03bde53b, 0x02733880, 0x000ce235, 0x0012ae2c}}}, + {X: Field{[10]uint32{0x01a3cd4e, 0x033a87d4, 0x03412ac4, 0x0278df3d, 0x03ae6d60, 0x023249f2, 0x03f7a269, 0x00f65a7d, 0x00e4af82, 0x0024db04}}, Y: Field{[10]uint32{0x017b7213, 0x023a37ec, 0x02b60bf6, 0x01ec04f4, 0x00bdb906, 0x000d67db, 0x03e5bdcf, 0x02142e38, 0x03bb10dd, 0x0011bdca}}}, + {X: Field{[10]uint32{0x02e9bfd6, 0x0243583c, 0x0296b36c, 0x00597478, 0x01847bb1, 0x01aa26cc, 0x02cf8e13, 0x030f6ce4, 0x015b61aa, 0x0010da97}}, Y: Field{[10]uint32{0x0336d68d, 0x0155a18b, 0x0247e336, 0x036839cd, 0x025e342b, 0x012a43e7, 0x038559c8, 0x032b3065, 0x008dae67, 0x003e079a}}}, + {X: Field{[10]uint32{0x00b315d7, 0x02136001, 0x0067aabd, 0x0108b986, 0x02d931a4, 0x0153d898, 0x024b929e, 0x022684e8, 0x00273fe7, 0x0027ae55}}, Y: Field{[10]uint32{0x012ef59c, 0x03e568d3, 0x01c60768, 0x012bfb04, 0x02d29f20, 0x03bfea0a, 0x0020fba8, 0x03990002, 0x01927dc0, 0x000e2ff0}}}, + {X: Field{[10]uint32{0x02280d8a, 0x0392e97e, 0x0277a0e6, 0x00342f68, 0x02ecb77a, 0x0003d8f9, 0x02b4328a, 0x02f02b2d, 0x02f587ec, 0x000e09ad}}, Y: Field{[10]uint32{0x024ef271, 0x00cbc10e, 0x016e6572, 0x024e2e8f, 0x01db35e2, 0x03698fe2, 0x03e6eb9e, 0x039a6c84, 0x01fedcef, 0x0003650d}}}, + {X: Field{[10]uint32{0x00a1dde2, 0x03e32881, 0x00a21cd0, 0x02e36cf3, 0x034dbdce, 0x010d92e7, 0x0193bcf8, 0x0286f8fe, 0x0111ae0e, 0x0028d233}}, Y: Field{[10]uint32{0x0083ac75, 0x03522107, 0x001e91d1, 0x02f5b591, 0x0007078e, 0x004ada28, 0x01c202f2, 0x03ebc9a8, 0x01d3db7c, 0x0007f214}}}, + {X: Field{[10]uint32{0x03df7329, 0x03a6818a, 0x002053c4, 0x039cf2dc, 0x025d70d1, 0x01c90993, 0x027646d0, 0x037cf139, 0x0239237f, 0x002ff855}}, Y: Field{[10]uint32{0x035f88e4, 0x03413e4a, 0x023adf12, 0x0373924b, 0x03345488, 0x01dd9d20, 0x03c09d1d, 0x03967670, 0x03e61ec5, 0x00240acd}}}, + {X: Field{[10]uint32{0x003dfa5e, 0x004f3270, 0x02944144, 0x00409c1f, 0x012642ae, 0x02081608, 0x00dc346c, 0x02dbd350, 0x014d81a1, 0x0038bf6c}}, Y: Field{[10]uint32{0x0088fceb, 0x0028f88d, 0x004086c6, 0x02ca6c03, 0x02131e37, 0x01d9d818, 0x026925ae, 0x021545b1, 0x00ed846e, 0x000c046d}}}, + {X: Field{[10]uint32{0x013c7416, 0x0377b1a4, 0x0038a535, 0x03aab09f, 0x02cf1119, 0x02d2b088, 0x0263659d, 0x019d205d, 0x01c68f47, 0x002ef196}}, Y: Field{[10]uint32{0x0154b954, 0x026099de, 0x00c7a477, 0x00825d6e, 0x03482501, 0x034ff84e, 0x01d13a40, 0x0144abeb, 0x02e19fdb, 0x0007e2db}}}, + {X: Field{[10]uint32{0x02505521, 0x0137a368, 0x02056cef, 0x02dbf67b, 0x01ce9141, 0x03e169e2, 0x016f743a, 0x01e26f6f, 0x02029866, 0x00196f4a}}, Y: Field{[10]uint32{0x0378f5a5, 0x017ce74c, 0x0370c6b6, 0x0135c429, 0x02990b18, 0x030f9b15, 0x01644a46, 0x02def175, 0x00301ced, 0x000cb6f8}}}, + {X: Field{[10]uint32{0x0278e981, 0x01645ac8, 0x01406a3a, 0x02427817, 0x00e9318d, 0x0303cdc9, 0x0175a49f, 0x033df093, 0x02eb8382, 0x0007b039}}, Y: Field{[10]uint32{0x0015715a, 0x033f0acd, 0x019fc240, 0x0018cdf3, 0x02fa56ac, 0x01a5f7af, 0x008ade3c, 0x02f2bfab, 0x029cf486, 0x00394384}}}, + {X: Field{[10]uint32{0x03a9eb8c, 0x032c43d8, 0x00d9e10d, 0x0248cd96, 0x00c0399c, 0x0284058a, 0x01aceb1e, 0x02896678, 0x031c203d, 0x001ce42b}}, Y: Field{[10]uint32{0x037c3126, 0x03837c25, 0x02418320, 0x028ce6f3, 0x002c3ada, 0x037af9f6, 0x03cad451, 0x01ec275e, 0x00966064, 0x001f4855}}}, + {X: Field{[10]uint32{0x021a533b, 0x01c7a05a, 0x01eb2b4b, 0x007b624c, 0x01127baf, 0x00267311, 0x03ff7f37, 0x00dd91e0, 0x00697b91, 0x00266945}}, Y: Field{[10]uint32{0x03e2e8e4, 0x022018e9, 0x00d4c8a2, 0x03c23a8e, 0x00809d21, 0x02b9d23f, 0x00bd57db, 0x01dc2c3f, 0x000f7503, 0x00127034}}}, + {X: Field{[10]uint32{0x020394d9, 0x03eb5962, 0x018cbf12, 0x038313f2, 0x02320ba2, 0x03c6dc09, 0x03b7dbfe, 0x00133033, 0x00b13b48, 0x003935b8}}, Y: Field{[10]uint32{0x03761a41, 0x01d74d8e, 0x01b6c750, 0x03760619, 0x03af5fc3, 0x038338be, 0x035ad203, 0x001bf9a9, 0x02ac73a0, 0x002bac3a}}}, + {X: Field{[10]uint32{0x01fe1a04, 0x01445b86, 0x03459d88, 0x0160ad54, 0x031a9aa0, 0x02b48fec, 0x03e1c460, 0x0397ab2c, 0x0141507c, 0x00122290}}, Y: Field{[10]uint32{0x0312bd12, 0x008d7d33, 0x0104f0d7, 0x01ce97f6, 0x00e82f80, 0x02b58ec1, 0x01eaf25e, 0x03e31d33, 0x0066043e, 0x001af5a8}}}, + {X: Field{[10]uint32{0x03babaa1, 0x03057659, 0x028c55d2, 0x011f290b, 0x032cb65b, 0x00b7eeb0, 0x011c2ffd, 0x0295346b, 0x024ded0c, 0x00303ff8}}, Y: Field{[10]uint32{0x027e9289, 0x01f1af5f, 0x0167dbbd, 0x03859d59, 0x03a0a330, 0x037dc047, 0x01bbba88, 0x0137c867, 0x023e29c5, 0x00345731}}}, + {X: Field{[10]uint32{0x027780b1, 0x016e48dd, 0x03fb2830, 0x003fc82f, 0x0131b05d, 0x023f17bc, 0x02dd36dd, 0x01389677, 0x030206c7, 0x000cdb66}}, Y: Field{[10]uint32{0x014e647b, 0x0179fd50, 0x01fd1b05, 0x0184051c, 0x032b1b64, 0x006f6e27, 0x03e6510e, 0x029c1eba, 0x00fc9886, 0x0012bb6b}}}, + {X: Field{[10]uint32{0x02dcf04f, 0x03b38b40, 0x024a706a, 0x016b3a11, 0x019a2a17, 0x031ee1b9, 0x03d3711d, 0x029ef8ee, 0x02b98973, 0x00260d4f}}, Y: Field{[10]uint32{0x02ee767e, 0x01d187ea, 0x0196d980, 0x0290f5b1, 0x028e45b4, 0x00178704, 0x02108873, 0x01290e3d, 0x02c22789, 0x002a1dfe}}}, + {X: Field{[10]uint32{0x02da1e61, 0x01f0d84d, 0x039053f3, 0x01df0e3a, 0x0271c9fb, 0x0153f2c2, 0x0239cecb, 0x03e77d8d, 0x021c17ff, 0x003370d7}}, Y: Field{[10]uint32{0x0094eace, 0x026d9a25, 0x017782bb, 0x0275f58a, 0x0087ae55, 0x030528c7, 0x024f0ccd, 0x01c9837d, 0x02bafe91, 0x002a332d}}}, + {X: Field{[10]uint32{0x00111941, 0x026a4d20, 0x00b5b515, 0x03b149b3, 0x015d7407, 0x02701bc5, 0x00584093, 0x0282c9c5, 0x01c15e62, 0x00244b2c}}, Y: Field{[10]uint32{0x03049bf6, 0x02f561cd, 0x035adbf4, 0x02e60d23, 0x026fa710, 0x031c3769, 0x00cecc86, 0x03111f34, 0x00d51723, 0x00161305}}}, + {X: Field{[10]uint32{0x03bff3bc, 0x0339a4f0, 0x0102b5dd, 0x01a26003, 0x01ffd195, 0x03fd00d0, 0x02ec6e2c, 0x022b3667, 0x017c7c1e, 0x00085178}}, Y: Field{[10]uint32{0x0236356f, 0x02ffd3dd, 0x02b68957, 0x0222bebf, 0x00a5c430, 0x02769eeb, 0x030e9b89, 0x02cdce56, 0x01a240c0, 0x000ee29c}}}, + {X: Field{[10]uint32{0x010b1692, 0x00baa523, 0x004ab3aa, 0x002882ff, 0x0143e091, 0x000f3721, 0x024f7e1d, 0x01c9c888, 0x03367e87, 0x00392824}}, Y: Field{[10]uint32{0x02cf846e, 0x00557df0, 0x00f80328, 0x0372bdf4, 0x02898f48, 0x03e9b8d3, 0x02b8315a, 0x01bc0e3b, 0x00313314, 0x00092c7b}}}, + {X: Field{[10]uint32{0x0328db40, 0x026cdb34, 0x02bb0f57, 0x0361001b, 0x012b1390, 0x01900a1d, 0x03387ed4, 0x01166edf, 0x02dd464d, 0x003f7d49}}, Y: Field{[10]uint32{0x013a3987, 0x011f0379, 0x00963141, 0x026a9d17, 0x01937326, 0x004993b1, 0x02cf7766, 0x005b4774, 0x02c56792, 0x0010e5b9}}}, + {X: Field{[10]uint32{0x00729f86, 0x016fed3b, 0x01da4fab, 0x012539d4, 0x0252ca4c, 0x02b77cfd, 0x01933ebc, 0x01c9cd42, 0x0016b3e3, 0x0001b217}}, Y: Field{[10]uint32{0x03648d6f, 0x019bc5ba, 0x01cf1217, 0x02646e7e, 0x01e592ce, 0x0177a64a, 0x0249040c, 0x0201f979, 0x03c8520b, 0x0026d4c3}}}, + {X: Field{[10]uint32{0x00e28e58, 0x0031e44b, 0x03203feb, 0x02889560, 0x03004e7d, 0x0378033e, 0x0098ce4b, 0x038b0043, 0x023c596e, 0x0013efeb}}, Y: Field{[10]uint32{0x026ff099, 0x00d55fb6, 0x017993e7, 0x01960ef0, 0x02396b8a, 0x03d43f58, 0x02dcfdcf, 0x00d92e57, 0x0104ed0e, 0x003fb3c1}}}, + {X: Field{[10]uint32{0x0378bab8, 0x00d44f81, 0x001fa150, 0x02ef4f0a, 0x0197c1d7, 0x003a7204, 0x0283c2b9, 0x0045e4ed, 0x037b8017, 0x0026f30e}}, Y: Field{[10]uint32{0x01bc0b43, 0x002e45d0, 0x03e9f3b7, 0x00275f62, 0x03a887f0, 0x02166ea8, 0x03825ab9, 0x0227469d, 0x00928782, 0x00368bab}}}, + {X: Field{[10]uint32{0x03635150, 0x0380be5a, 0x03c8a024, 0x0098ed78, 0x00855b0a, 0x01cb44c5, 0x02956956, 0x028ecfd6, 0x00400e70, 0x00110568}}, Y: Field{[10]uint32{0x023986be, 0x02961a76, 0x0223ec58, 0x0158e7cc, 0x016843ac, 0x026bf571, 0x02921603, 0x02a7e207, 0x038fcf55, 0x0036294e}}}, + {X: Field{[10]uint32{0x005b2341, 0x00212dc1, 0x030924d2, 0x00d8b54d, 0x01b617b5, 0x03880e0e, 0x00988fcb, 0x02f3da8e, 0x01c9cdaf, 0x001579d6}}, Y: Field{[10]uint32{0x0131bb95, 0x03e0abfe, 0x015d6cf7, 0x02dd0bae, 0x013c1191, 0x0288c561, 0x01524834, 0x00d01626, 0x03eaca8a, 0x00129a4c}}}, + {X: Field{[10]uint32{0x0140e9c8, 0x018d2215, 0x024b95ed, 0x0162b6f7, 0x018d1153, 0x03720f82, 0x017e072b, 0x00f0bc29, 0x0325bee2, 0x00084087}}, Y: Field{[10]uint32{0x01a8c9f0, 0x02ff8f3e, 0x008d4ba5, 0x0071fe19, 0x034ed8dc, 0x037208a8, 0x002c98f8, 0x003bfdf1, 0x0291a770, 0x0026bbd5}}}, + {X: Field{[10]uint32{0x01b376d1, 0x031e60b3, 0x024a7a28, 0x03bda413, 0x02c70771, 0x003502e2, 0x03f3c641, 0x006bffb7, 0x011ddded, 0x000ad38c}}, Y: Field{[10]uint32{0x0309b05c, 0x02b1cc35, 0x02575d20, 0x034db1e4, 0x0248b25d, 0x015fd6e5, 0x0243d02b, 0x016c1c3f, 0x00f56b25, 0x0005170c}}}, + {X: Field{[10]uint32{0x015378b3, 0x022d7d17, 0x0091e8b9, 0x02be412c, 0x025ed91c, 0x0017496d, 0x00dbf5be, 0x01840324, 0x021c7e16, 0x0014642c}}, Y: Field{[10]uint32{0x02650073, 0x0102d299, 0x01166040, 0x01b085b0, 0x001826d2, 0x02f83550, 0x00e3f268, 0x0317e2d4, 0x02471fbd, 0x002e0f33}}}, + {X: Field{[10]uint32{0x005b56f7, 0x03d00c15, 0x016ae1f2, 0x0025df40, 0x0188b1b0, 0x01d82062, 0x007c7b28, 0x01702cd9, 0x02e454c6, 0x000ac847}}, Y: Field{[10]uint32{0x02854f5c, 0x01c3775d, 0x03506f9b, 0x01a6e18f, 0x00fff746, 0x01e984a2, 0x01a25634, 0x03f0755c, 0x015917d8, 0x001d5d0e}}}, + {X: Field{[10]uint32{0x024134d4, 0x03e52bb9, 0x021b6d4a, 0x013e5063, 0x03a3caad, 0x03dae99b, 0x038ec37f, 0x002bb8d1, 0x0392b41e, 0x0032cc2d}}, Y: Field{[10]uint32{0x028358c5, 0x006aad88, 0x008e771b, 0x00376bac, 0x00914230, 0x003471ca, 0x02b8b4ec, 0x027d2e48, 0x02decb3a, 0x001155c6}}}, + {X: Field{[10]uint32{0x00e4bc6c, 0x00f34c81, 0x012e065c, 0x0149fba8, 0x03e46879, 0x0226f99e, 0x0349d070, 0x02a85ba5, 0x03a8d2fc, 0x003d390d}}, Y: Field{[10]uint32{0x03ba97c4, 0x02798a9d, 0x009c4344, 0x03f0e489, 0x008e7647, 0x03743b8a, 0x01e51f8b, 0x02ba28c3, 0x028b7e81, 0x003ed4b4}}}, + {X: Field{[10]uint32{0x0350d518, 0x0314f377, 0x00080545, 0x012f2d9e, 0x00ce85a9, 0x024f677e, 0x02a726c1, 0x0066cef1, 0x02a76a2a, 0x0028299d}}, Y: Field{[10]uint32{0x03190a71, 0x01ff2223, 0x03fe8e43, 0x01a28f26, 0x0041198d, 0x02b901c0, 0x01816e5a, 0x02f4842e, 0x00c6b1b7, 0x00191ffa}}}, + {X: Field{[10]uint32{0x03ff7b7e, 0x00296eed, 0x0171c786, 0x01745762, 0x0275a2ba, 0x03abbbb9, 0x00544ab1, 0x0250a2c4, 0x03ead7f3, 0x00057753}}, Y: Field{[10]uint32{0x0038445c, 0x00b11c67, 0x02961844, 0x007c6c7e, 0x0253924d, 0x02dcc8b4, 0x02313427, 0x008551f4, 0x01dd5fab, 0x00226557}}}, + {X: Field{[10]uint32{0x030ca522, 0x03d8c864, 0x012b8850, 0x00ffdcb3, 0x0301bdea, 0x035d3767, 0x037a188e, 0x012d1d8d, 0x00004029, 0x002a01ae}}, Y: Field{[10]uint32{0x02b97213, 0x02fb7237, 0x010db9c6, 0x02b18624, 0x0253e49a, 0x02aceee1, 0x03f1fa88, 0x02c6bda5, 0x036547d8, 0x0012db5c}}}, + {X: Field{[10]uint32{0x039f148b, 0x02e8fd56, 0x0006df31, 0x02b3cf01, 0x0058a983, 0x0390c7ba, 0x036ff9f6, 0x01921de8, 0x023dca08, 0x001078dc}}, Y: Field{[10]uint32{0x038392e4, 0x0252074e, 0x02007913, 0x00b37ff2, 0x022753c5, 0x0336a7f4, 0x000b136d, 0x0163406a, 0x02caf27c, 0x0022ac59}}}, + {X: Field{[10]uint32{0x01bba3c4, 0x002f2a19, 0x00953ea0, 0x011fe353, 0x01690e04, 0x00251985, 0x03a3e587, 0x02322766, 0x00f27855, 0x0018ee28}}, Y: Field{[10]uint32{0x03cf787f, 0x0002cc90, 0x03a0c2d3, 0x025dca2c, 0x008c09b2, 0x03c01320, 0x0295da00, 0x022d254e, 0x014185eb, 0x000c87eb}}}, + {X: Field{[10]uint32{0x014c5963, 0x00aa6a6c, 0x0056c894, 0x036b4bfe, 0x01c1ca21, 0x0088a698, 0x01cae5f8, 0x0034e941, 0x037faa8b, 0x00018afa}}, Y: Field{[10]uint32{0x02bffd4b, 0x0275efd5, 0x030451ac, 0x0008bd6d, 0x03a36f4c, 0x00fbf710, 0x01886550, 0x0309fd73, 0x00bd7120, 0x0038f673}}}, + {X: Field{[10]uint32{0x03d20427, 0x03cb1206, 0x0199ac65, 0x033cf2cb, 0x03bc133f, 0x024bc0c4, 0x01d79a90, 0x02e27af9, 0x000af524, 0x002dd686}}, Y: Field{[10]uint32{0x021d2747, 0x02e08952, 0x02d48c39, 0x01918cfb, 0x036a6369, 0x0398b7ec, 0x03094b41, 0x0301534d, 0x0056b11c, 0x0039e154}}}, + {X: Field{[10]uint32{0x024949e9, 0x03bb413f, 0x032f2f03, 0x00f3bbc0, 0x026b51f9, 0x013418e8, 0x01df9cbe, 0x03f1da5f, 0x036d5298, 0x001396ef}}, Y: Field{[10]uint32{0x02a12188, 0x039138c5, 0x00119476, 0x02fa6495, 0x001871fb, 0x0336024c, 0x0114a19e, 0x02771951, 0x028640cd, 0x00199c09}}}, + {X: Field{[10]uint32{0x00173237, 0x02fdb7c3, 0x01200074, 0x039b72d8, 0x02b78e86, 0x0357f06a, 0x02edb836, 0x03c1a4ee, 0x003df509, 0x002a5de3}}, Y: Field{[10]uint32{0x01d0cab7, 0x03804fca, 0x025d690e, 0x0072302f, 0x019230a4, 0x002a1759, 0x03a0e50d, 0x03e44e57, 0x019186a0, 0x000cea72}}}, + {X: Field{[10]uint32{0x03570449, 0x01eed8f3, 0x03c95cdb, 0x039c9b32, 0x00757fb3, 0x02924dab, 0x01790bc1, 0x012f9f12, 0x02ad1666, 0x003c6cea}}, Y: Field{[10]uint32{0x0060cc06, 0x003ed29d, 0x02a3a52b, 0x0098934e, 0x02006434, 0x011899e0, 0x02183981, 0x037040fc, 0x01cbea3f, 0x003477f8}}}, + {X: Field{[10]uint32{0x0349f598, 0x02293164, 0x022d0698, 0x0172bd33, 0x019563a0, 0x0133c067, 0x0036ad6a, 0x035615a9, 0x013ab015, 0x00359b3f}}, Y: Field{[10]uint32{0x011efc4d, 0x033dbe84, 0x01756d07, 0x02fbee54, 0x00d8e91b, 0x036e503e, 0x03b73056, 0x03679598, 0x01b6d097, 0x0017a85e}}}, + {X: Field{[10]uint32{0x020ac7aa, 0x03f8ef36, 0x00470ea8, 0x01bcb036, 0x015d87a1, 0x0260bb7f, 0x030f30aa, 0x01744efb, 0x00f0924b, 0x00294ca9}}, Y: Field{[10]uint32{0x038d5c1c, 0x00aa49c7, 0x017ad553, 0x03eab188, 0x0374fd1e, 0x03d40e1b, 0x003de70d, 0x00d204f3, 0x0019ca4e, 0x0030b98b}}}, + {X: Field{[10]uint32{0x00439b70, 0x0397fd8a, 0x03b3e1a3, 0x03bcff8b, 0x0281ebb3, 0x0381ed8c, 0x03d08c09, 0x0220d7fe, 0x01125df7, 0x002a6ac9}}, Y: Field{[10]uint32{0x01877514, 0x00696d61, 0x00c7e350, 0x02d53a54, 0x01f2eaad, 0x0330d77c, 0x0243698a, 0x0056aa6a, 0x01db56e0, 0x00163fd5}}}, + {X: Field{[10]uint32{0x020466eb, 0x03fd1b11, 0x02521f2c, 0x012907b5, 0x0153df17, 0x024571b5, 0x004dc830, 0x00f7b306, 0x03849081, 0x00338163}}, Y: Field{[10]uint32{0x02f3e745, 0x011acbe2, 0x03d47c76, 0x01065ecd, 0x02282377, 0x013d3dc6, 0x02815a78, 0x01d05016, 0x00c45881, 0x0010534e}}}, + {X: Field{[10]uint32{0x02406299, 0x02faaa5b, 0x003d4737, 0x014e76d8, 0x010afe92, 0x0059137a, 0x0385c7f3, 0x02cdaaac, 0x036530a2, 0x002647ea}}, Y: Field{[10]uint32{0x008eed57, 0x00abe7f9, 0x014df4f8, 0x03edeb6a, 0x005d373c, 0x0136807d, 0x016dc9d4, 0x0112f7c5, 0x017677c5, 0x000a8a6d}}}, + {X: Field{[10]uint32{0x03715d8e, 0x0070fcab, 0x01e140e9, 0x03fa84fc, 0x03ddfdd2, 0x016ad205, 0x00419210, 0x013bbf32, 0x001fbd03, 0x003b9b32}}, Y: Field{[10]uint32{0x0386d8be, 0x00ebcef8, 0x00a3f689, 0x011ea5ef, 0x00df8fd8, 0x02972f01, 0x007358de, 0x03a59487, 0x03fe48c3, 0x002e3de7}}}, + {X: Field{[10]uint32{0x019c5ef2, 0x02b33685, 0x017a3c5d, 0x03fa04cd, 0x0316ff2d, 0x00507800, 0x004d5cc5, 0x01995d55, 0x0372d642, 0x0019a8b4}}, Y: Field{[10]uint32{0x01bc8929, 0x0368fdd3, 0x029a05ba, 0x03416608, 0x00780000, 0x03c99781, 0x01423b9a, 0x03d234e2, 0x016b91c6, 0x002d5f4b}}}, + {X: Field{[10]uint32{0x02421da9, 0x0171a48e, 0x00ac6adf, 0x0396b2d3, 0x037a5798, 0x031fcda8, 0x0043e73f, 0x0378e854, 0x01d9f697, 0x0008280b}}, Y: Field{[10]uint32{0x01cf34f7, 0x00db0c33, 0x02b97338, 0x00e0bf31, 0x02ab4ab5, 0x00478f72, 0x02ab61e7, 0x00d87aa9, 0x0100d162, 0x00079b3c}}}, + {X: Field{[10]uint32{0x037bf552, 0x00e8c0f2, 0x0211092e, 0x026873b6, 0x019f92b7, 0x036894cc, 0x0298b154, 0x03a07daf, 0x02437818, 0x00282e32}}, Y: Field{[10]uint32{0x01543be6, 0x02ff968f, 0x030baa1a, 0x039922d8, 0x02218508, 0x003f38b6, 0x0263ca11, 0x03664141, 0x00ebf447, 0x0011506f}}}, + {X: Field{[10]uint32{0x00c52c63, 0x005d3ac7, 0x00ffb9e4, 0x02376d6e, 0x01e0d501, 0x0172ea73, 0x015c25fb, 0x039221f8, 0x02ad73dc, 0x00145c53}}, Y: Field{[10]uint32{0x03dafebf, 0x024507e6, 0x0309773b, 0x00c6665d, 0x01a5c248, 0x019b7480, 0x02272c7d, 0x01587afb, 0x00a082ef, 0x0011ede5}}}, + {X: Field{[10]uint32{0x02451c59, 0x012b0b35, 0x03a2fba7, 0x02904d05, 0x017da195, 0x026487a4, 0x03c41f6a, 0x03781cf9, 0x03631fe4, 0x00063a89}}, Y: Field{[10]uint32{0x024df316, 0x02bb5435, 0x01e6b106, 0x020cba55, 0x00d31b3b, 0x0235f24f, 0x03e0428e, 0x02eea6cc, 0x0337fff6, 0x000e6282}}}, + {X: Field{[10]uint32{0x03c5a87e, 0x02e415c5, 0x030cd0e8, 0x029675d6, 0x03c3d1f0, 0x033ea617, 0x01ec341a, 0x0060d298, 0x034fc39e, 0x00387562}}, Y: Field{[10]uint32{0x006b3c47, 0x02648967, 0x007f2cf2, 0x00e83767, 0x01af8215, 0x02dfe679, 0x03e2ab3b, 0x03f7b023, 0x020215fd, 0x0006d8bb}}}, + {X: Field{[10]uint32{0x016c5a84, 0x03b0f9dc, 0x039a3bbd, 0x0104472b, 0x032c19c5, 0x02c94f70, 0x03f5ba8e, 0x030495f7, 0x011730d3, 0x000e5e4e}}, Y: Field{[10]uint32{0x01f18015, 0x02a929fd, 0x021e3f78, 0x02f5070a, 0x00be7b4e, 0x021476a3, 0x02cded5c, 0x00db6644, 0x0350189f, 0x0035a87e}}}, + {X: Field{[10]uint32{0x039ede88, 0x003c5e96, 0x02ef1552, 0x002c93ca, 0x021d5736, 0x02c09467, 0x01dbf888, 0x0101b4e0, 0x024b601b, 0x00126d27}}, Y: Field{[10]uint32{0x0169a38d, 0x01f9dcbe, 0x02fadbff, 0x02734390, 0x03a0a76e, 0x00279168, 0x03e7be10, 0x035ecd66, 0x00ca02f2, 0x003f3cf3}}}, + {X: Field{[10]uint32{0x00bdc871, 0x036a914a, 0x024c32bf, 0x02848907, 0x01d64e38, 0x003fc5e8, 0x0188548f, 0x03cdb483, 0x010d0b42, 0x000b3606}}, Y: Field{[10]uint32{0x00259187, 0x03bd66da, 0x02a67077, 0x0034ac5a, 0x022fff78, 0x016affab, 0x0284f45e, 0x0052416a, 0x03692214, 0x003dca70}}}, + {X: Field{[10]uint32{0x0241025a, 0x00218997, 0x006f2308, 0x03a91747, 0x02b5b642, 0x007e7466, 0x020cb2cf, 0x015198b6, 0x03111738, 0x0007f43e}}, Y: Field{[10]uint32{0x029ce0e9, 0x02460791, 0x0008f557, 0x035b6edb, 0x0294e928, 0x031c04b6, 0x007825d1, 0x002082af, 0x0288fec6, 0x000c4da9}}}, + {X: Field{[10]uint32{0x02f3a141, 0x0391101e, 0x0387107d, 0x02ec4834, 0x013f93d5, 0x02f61139, 0x0248a0f5, 0x02d6f861, 0x033bd7f8, 0x003c2397}}, Y: Field{[10]uint32{0x01902fac, 0x01b857f6, 0x0289fa52, 0x02f37c74, 0x01bf7ea1, 0x03253a83, 0x0361bdfc, 0x03ab872a, 0x03259067, 0x0000f761}}}, + {X: Field{[10]uint32{0x005ee207, 0x0172ac47, 0x005a5d3f, 0x03c07fbb, 0x03a0584c, 0x0171af75, 0x03a046bb, 0x03ea58dc, 0x0006b997, 0x002800cf}}, Y: Field{[10]uint32{0x03e268b4, 0x002a36f0, 0x03a17d14, 0x02d8f53f, 0x0039a577, 0x00823503, 0x00c2cda2, 0x039235c2, 0x0131aacb, 0x003bb586}}}, + {X: Field{[10]uint32{0x02c16f70, 0x0246db98, 0x03b1e1ea, 0x01c1109a, 0x0383ff8f, 0x005de469, 0x001e29b1, 0x0299c77c, 0x000868be, 0x001df7bb}}, Y: Field{[10]uint32{0x0264861d, 0x009ac015, 0x024b5dc4, 0x009f0288, 0x00fcc1fe, 0x0067d7a7, 0x031ae7ef, 0x01cfd8c9, 0x0228ba8f, 0x002e4228}}}, + {X: Field{[10]uint32{0x01aa72b1, 0x016a86ea, 0x019605fd, 0x03070623, 0x01994a03, 0x00d41acf, 0x01bd1fc6, 0x0043b468, 0x015ffe2f, 0x000bf37b}}, Y: Field{[10]uint32{0x02bbefc6, 0x02df5d81, 0x0145d3fa, 0x00a13fe7, 0x02b4df66, 0x004a8319, 0x00d7c12e, 0x021bc748, 0x03f6f09a, 0x000556fa}}}, + {X: Field{[10]uint32{0x015db3ad, 0x00438826, 0x02904c83, 0x03fddf0a, 0x018667f8, 0x02e91f02, 0x00add0c9, 0x039cceaf, 0x032dfdf5, 0x0007c302}}, Y: Field{[10]uint32{0x037bc566, 0x035d5995, 0x03e448ef, 0x020a1732, 0x0170f631, 0x00c9a122, 0x039b7613, 0x03d57d44, 0x03cb84ce, 0x002f5c46}}}, + {X: Field{[10]uint32{0x0237dcf8, 0x03aa3e42, 0x005ef465, 0x03b52aa2, 0x03d603fd, 0x03b7d953, 0x01bdf3c5, 0x00b11183, 0x0144e716, 0x0002d2a1}}, Y: Field{[10]uint32{0x003c62b2, 0x00e28f48, 0x0134c139, 0x01bb6f86, 0x0099f8ee, 0x00a4b2ce, 0x032e27b2, 0x03a2c800, 0x0391b3f2, 0x0014f010}}}, + {X: Field{[10]uint32{0x005bd68c, 0x016c2dcb, 0x0221a9d8, 0x0031b650, 0x03d00a90, 0x034c1ce5, 0x0331cdfa, 0x02dcd4e3, 0x0282dcde, 0x0037c3af}}, Y: Field{[10]uint32{0x00decfb2, 0x03d1cce2, 0x001c68a2, 0x038b5c1c, 0x034a1d07, 0x0292b3e2, 0x03b869e3, 0x00b95511, 0x0239e7fe, 0x0030ca65}}}, + {X: Field{[10]uint32{0x03c101c0, 0x032499c0, 0x01576ec7, 0x00396cde, 0x02f9fd46, 0x034a3e27, 0x02ed101f, 0x0230cf87, 0x01b6d1c3, 0x003ac12e}}, Y: Field{[10]uint32{0x01e0ee9e, 0x0363ca3d, 0x024eb008, 0x0120e5d2, 0x00f5ee75, 0x020b5ba7, 0x013cab57, 0x03e02cac, 0x00497f47, 0x0013c9b6}}}, + {X: Field{[10]uint32{0x03294334, 0x03dc7434, 0x01cface9, 0x003ba9ee, 0x017db4ee, 0x032ae619, 0x014b37a0, 0x031b3ab2, 0x03e2197c, 0x001ef27b}}, Y: Field{[10]uint32{0x01a72013, 0x01e0b697, 0x009a37ff, 0x024c7057, 0x01ad8fb4, 0x02d6ce94, 0x001d9404, 0x01e41aa5, 0x00ad5234, 0x00364c6f}}}, + {X: Field{[10]uint32{0x033e0b9b, 0x0106b4ed, 0x00844e0a, 0x01433259, 0x011321dc, 0x01a8fa2d, 0x010c10c6, 0x014b192f, 0x01e8f4bd, 0x002248b4}}, Y: Field{[10]uint32{0x0241c431, 0x00a9e8d2, 0x003182a0, 0x031b57b7, 0x0261c9ee, 0x00cdf714, 0x00e6abd3, 0x03887a24, 0x00f17d23, 0x000ad90f}}}, + {X: Field{[10]uint32{0x02ddcc72, 0x006746bc, 0x00e9acdc, 0x0369df28, 0x030139a7, 0x0311a007, 0x036a842a, 0x004bb48b, 0x01e33a93, 0x0010bcbb}}, Y: Field{[10]uint32{0x0326f99b, 0x038d25e3, 0x0376ac70, 0x0029afd1, 0x02ab9536, 0x037238d0, 0x0260edff, 0x026172e4, 0x03cc715c, 0x00143516}}}, + {X: Field{[10]uint32{0x016761c6, 0x009c1453, 0x02ea2f3b, 0x03ca4a4d, 0x00627549, 0x01c9ad79, 0x00792550, 0x03fac962, 0x03201862, 0x001ef725}}, Y: Field{[10]uint32{0x01a4fa8c, 0x02a1504b, 0x02269f1c, 0x039032b5, 0x0065372e, 0x02101998, 0x026f0bff, 0x02b7d5db, 0x032b7f77, 0x001c03ad}}}, + {X: Field{[10]uint32{0x006314cf, 0x0366385d, 0x023066b6, 0x011f4840, 0x01f79d16, 0x008a3868, 0x002e0d85, 0x0126fd79, 0x03a64bf5, 0x002e6d49}}, Y: Field{[10]uint32{0x020cd93f, 0x00a66aaa, 0x00eb7499, 0x00e71b61, 0x02e35b15, 0x000bcc3a, 0x022a2b68, 0x007d6e4e, 0x00642a72, 0x002386cd}}}, + {X: Field{[10]uint32{0x01e3dda9, 0x02b0961d, 0x02d74978, 0x00c56434, 0x03d187c4, 0x00f3845d, 0x00291929, 0x01dd9407, 0x012934d4, 0x002d9779}}, Y: Field{[10]uint32{0x039fa529, 0x038db58e, 0x014ef324, 0x0027b2f6, 0x03f07555, 0x00c0d915, 0x01c55351, 0x02d73acf, 0x03e74ab9, 0x000f5bf2}}}, + {X: Field{[10]uint32{0x027c6b9b, 0x0198d9b3, 0x02ca5c2e, 0x03a8d016, 0x01a036ed, 0x00fc1584, 0x03604f6a, 0x01d47abc, 0x02320608, 0x00063aad}}, Y: Field{[10]uint32{0x015074c5, 0x00acd942, 0x03dd99d1, 0x001492f5, 0x02ccd426, 0x027e479b, 0x0211f057, 0x004464db, 0x03bc9467, 0x00227ac1}}}, + {X: Field{[10]uint32{0x02d360d5, 0x007183ba, 0x000a14eb, 0x03928c6d, 0x03c7502e, 0x025b4e76, 0x01a16065, 0x02590e42, 0x00664a47, 0x00289844}}, Y: Field{[10]uint32{0x01814901, 0x01fcdc9d, 0x00ac03e8, 0x0207cc8f, 0x0085721a, 0x02066086, 0x022d9fe3, 0x0155d8c9, 0x034d8802, 0x0012d175}}}, + {X: Field{[10]uint32{0x0008a8a7, 0x0250d74f, 0x019595da, 0x03ebd800, 0x01c77ac0, 0x0173c972, 0x019dc583, 0x0214de80, 0x00b12c10, 0x001e2515}}, Y: Field{[10]uint32{0x01829041, 0x02b82fe9, 0x007a2591, 0x000c949a, 0x008841da, 0x0282f5d8, 0x02f43378, 0x0167eb2f, 0x030fed28, 0x001afba1}}}, + {X: Field{[10]uint32{0x02791569, 0x03897518, 0x025ed7cf, 0x03e67d98, 0x01f81570, 0x00b837e5, 0x03683b9c, 0x0197c046, 0x0206fb4f, 0x00065df0}}, Y: Field{[10]uint32{0x03698479, 0x0390d7af, 0x01de467d, 0x02c9d764, 0x019dcc79, 0x02a7af81, 0x03f435e5, 0x0112aa57, 0x01a3c222, 0x00379db7}}}, + {X: Field{[10]uint32{0x01f4222f, 0x02b26199, 0x02585189, 0x03530fd5, 0x01ec3b5a, 0x02b0d35f, 0x03e60861, 0x0354d903, 0x01f7d259, 0x002247c3}}, Y: Field{[10]uint32{0x032de219, 0x002b3a46, 0x0257dba9, 0x02ac1010, 0x025c3293, 0x02a35ac3, 0x027a6011, 0x0228a87b, 0x03f70f53, 0x00331782}}}, + {X: Field{[10]uint32{0x0299530b, 0x02a4dfff, 0x01e55c80, 0x0380f171, 0x0350169d, 0x0104ad34, 0x026c282f, 0x03e07964, 0x03f69262, 0x00214d2e}}, Y: Field{[10]uint32{0x017423b5, 0x0239fad5, 0x01cf9fb0, 0x008d3505, 0x00f70cfc, 0x0395147a, 0x00764c0b, 0x001cdd33, 0x0181e0bb, 0x003efbb9}}}, + {X: Field{[10]uint32{0x006f63fb, 0x012c1faa, 0x001989e4, 0x01f03c04, 0x0158fc89, 0x01516635, 0x034eafa3, 0x037f4dd1, 0x016404e7, 0x00396dbd}}, Y: Field{[10]uint32{0x0118da79, 0x01b38998, 0x00ad0b2c, 0x03242ce0, 0x008e153c, 0x022201e0, 0x01e7d983, 0x00ea2ddb, 0x03fa68a8, 0x0010da2e}}}, + {X: Field{[10]uint32{0x02c2b850, 0x02435381, 0x00e29f7c, 0x03ced38e, 0x0046e184, 0x001c91ea, 0x03dc5e55, 0x03945260, 0x028b11c3, 0x003e5646}}, Y: Field{[10]uint32{0x010ff6b5, 0x025e82b6, 0x032a51fe, 0x024fca7f, 0x02957de3, 0x00d9a87e, 0x024e288a, 0x03d61f32, 0x00362361, 0x00108ed9}}}, + {X: Field{[10]uint32{0x0372384c, 0x02482c7f, 0x038212f2, 0x01655ef1, 0x017c9950, 0x025918de, 0x01eb617c, 0x017a7bbe, 0x01d3252f, 0x000f4c8e}}, Y: Field{[10]uint32{0x02a2e57a, 0x00f2a7c8, 0x03df78f7, 0x0386a6d9, 0x03ef860e, 0x0257ad37, 0x02798bf6, 0x02beb394, 0x03b6fc9b, 0x00070f8d}}}, + {X: Field{[10]uint32{0x00c5dfb8, 0x035719ef, 0x00055201, 0x018707c5, 0x02a0a6ce, 0x002184a8, 0x028e8554, 0x0135da1a, 0x03234b57, 0x003d0225}}, Y: Field{[10]uint32{0x000a56a4, 0x014c8243, 0x03af3c74, 0x029d80bf, 0x03c3a62f, 0x015969e7, 0x02aac242, 0x03f24552, 0x03b73e72, 0x001ae0a0}}}, + {X: Field{[10]uint32{0x02267ccf, 0x02d18a8b, 0x03c64bc4, 0x034ac104, 0x0395058e, 0x0262e2d1, 0x03e65f84, 0x031d17da, 0x02e7aea9, 0x002b381d}}, Y: Field{[10]uint32{0x028b97aa, 0x0076b045, 0x0120a31f, 0x018aa651, 0x02dc58f3, 0x02bcd4f8, 0x032ed6dc, 0x02a797ad, 0x0217377f, 0x0002d8b1}}}, + {X: Field{[10]uint32{0x006ec161, 0x01bf0b42, 0x036af29d, 0x00ced3f7, 0x01b4e63f, 0x02b6c747, 0x030b848e, 0x0181a4c8, 0x03a7408c, 0x001c332e}}, Y: Field{[10]uint32{0x014d6959, 0x020b1ee8, 0x02ec4d77, 0x00e1c7ef, 0x025a4ff3, 0x0152a032, 0x01286776, 0x00398390, 0x01a046d3, 0x003f0736}}}, + {X: Field{[10]uint32{0x0358d372, 0x03798a79, 0x02ede7a8, 0x02ce65c2, 0x019e33fc, 0x02bd6af1, 0x0258d3a4, 0x016c317a, 0x00b27c0c, 0x0039b9ea}}, Y: Field{[10]uint32{0x018d4a66, 0x036cf972, 0x017049a8, 0x0297262f, 0x00b40df3, 0x024f8b20, 0x011fee27, 0x02d69754, 0x01c4c8c8, 0x00350344}}}, + {X: Field{[10]uint32{0x03216346, 0x02c74c88, 0x02739117, 0x029433fd, 0x007910e9, 0x0278b109, 0x01495b71, 0x00b9a0ca, 0x01c7e0a0, 0x00337125}}, Y: Field{[10]uint32{0x001583d4, 0x00816c5a, 0x022f0559, 0x0231b390, 0x00d51fc6, 0x03c77dbb, 0x01ddcd87, 0x0302b3ca, 0x036e9306, 0x0018d993}}}, + {X: Field{[10]uint32{0x022fc5cc, 0x025d741e, 0x02e4f825, 0x0065bcd6, 0x01d0142f, 0x02e09370, 0x022ba333, 0x00878000, 0x009c2fd7, 0x0009e13a}}, Y: Field{[10]uint32{0x003b8cf4, 0x00d7bd77, 0x001db4a3, 0x0113c021, 0x005a391e, 0x00958a3d, 0x00232b9b, 0x019874d5, 0x0266bdfa, 0x0002e962}}}, + {X: Field{[10]uint32{0x001a2390, 0x023b37ac, 0x00d0b9b9, 0x02ffdabd, 0x030c9118, 0x0212e8f3, 0x001dd831, 0x01ce0085, 0x0362ebcb, 0x002ada66}}, Y: Field{[10]uint32{0x00766905, 0x0241128d, 0x03e71a60, 0x01ede611, 0x012be011, 0x02829f33, 0x0142547d, 0x0083db17, 0x0210b714, 0x00179520}}}, + {X: Field{[10]uint32{0x035756ec, 0x00f53c2d, 0x02e08dda, 0x00aa60d6, 0x02220955, 0x01b747aa, 0x03ad6d39, 0x038dfee7, 0x03a567ff, 0x001e07a9}}, Y: Field{[10]uint32{0x02637256, 0x0141683c, 0x034b2af9, 0x001f6b37, 0x000403a5, 0x02e99933, 0x01481744, 0x00ee5f93, 0x007b46f6, 0x000f1db6}}}, + {X: Field{[10]uint32{0x0374029c, 0x002f4fb8, 0x033fd39d, 0x00ef882c, 0x03a0e1ce, 0x023fb968, 0x0004fe7b, 0x002a0a97, 0x0130dd5c, 0x001d6acb}}, Y: Field{[10]uint32{0x01914b9f, 0x0057f358, 0x0121a722, 0x03ead7be, 0x0330536e, 0x0253073d, 0x01f6f8e6, 0x00e4eb2e, 0x0147fdb1, 0x002abd18}}}, + {X: Field{[10]uint32{0x00ddaff0, 0x00433e02, 0x03ced85a, 0x00cf4471, 0x01087124, 0x0212b55b, 0x023caea6, 0x00f6a5b4, 0x02983730, 0x000a52d9}}, Y: Field{[10]uint32{0x0346f7c1, 0x02993de6, 0x00b4222f, 0x03f20be7, 0x01e5861b, 0x00e2fc7c, 0x0007fa8b, 0x00fa7aa5, 0x02f7feb7, 0x002bd35f}}}, + {X: Field{[10]uint32{0x0024c8d6, 0x031b8d2e, 0x02e55ea3, 0x03a4495f, 0x00f290f6, 0x0365c047, 0x0283b06b, 0x018e7f25, 0x02ea7433, 0x003619da}}, Y: Field{[10]uint32{0x03a7456d, 0x0296dc65, 0x0230fd71, 0x00ab79c7, 0x0309017b, 0x01aab04c, 0x00f3e5cd, 0x01551424, 0x007635d4, 0x001c4322}}}, + {X: Field{[10]uint32{0x021270d0, 0x02fb9d05, 0x03544fd8, 0x009ea4ed, 0x00cee714, 0x0361a916, 0x004771c6, 0x03d6b0ab, 0x02030d90, 0x001793b2}}, Y: Field{[10]uint32{0x00c97351, 0x02bc2dd0, 0x03b9ff0c, 0x0293d232, 0x00a93bb4, 0x00d8a225, 0x03a6d603, 0x03e2febf, 0x0143b970, 0x00113f80}}}, + {X: Field{[10]uint32{0x0180097e, 0x03c496e1, 0x021dc157, 0x00f76f1d, 0x01265c3a, 0x026d5521, 0x0308f212, 0x02ea17f9, 0x01aa244f, 0x0024054b}}, Y: Field{[10]uint32{0x03ef2cf7, 0x00d5ce60, 0x03939b94, 0x00b120d5, 0x038a6d39, 0x03f0bd84, 0x01fa3b28, 0x021a42d6, 0x02c9200b, 0x0005a534}}}, + {X: Field{[10]uint32{0x005637b5, 0x02cf2423, 0x020f191f, 0x0265ccbb, 0x00daf3a1, 0x032fcae7, 0x03a953fa, 0x01c7114f, 0x00f096f1, 0x0019f755}}, Y: Field{[10]uint32{0x02de74b1, 0x009e6f13, 0x005dfb36, 0x02914d99, 0x025fd6c4, 0x028ce318, 0x01022365, 0x019db6d9, 0x03432d33, 0x0014c9f6}}}, + {X: Field{[10]uint32{0x036c51ef, 0x037e57ee, 0x00790142, 0x015d57bf, 0x032e7704, 0x01d33d50, 0x020f1447, 0x03fd5d96, 0x02838f95, 0x0031925a}}, Y: Field{[10]uint32{0x00d752a2, 0x0099ff2f, 0x038caca8, 0x0078e8e2, 0x031177b5, 0x022c16d4, 0x0186f01d, 0x0075ce4b, 0x01d6604d, 0x00330010}}}, + {X: Field{[10]uint32{0x00c11c74, 0x03f6dbda, 0x029ad933, 0x02da5187, 0x02425bf4, 0x02043674, 0x01e5e728, 0x00eff51d, 0x030a0b16, 0x0039e675}}, Y: Field{[10]uint32{0x00ba8600, 0x027f0605, 0x02b215ef, 0x0274689c, 0x03e50444, 0x00631b44, 0x00adcf76, 0x03b8fe6c, 0x005fe29b, 0x003f0d1d}}}, + {X: Field{[10]uint32{0x01489d3b, 0x03d16b17, 0x0175acb6, 0x01d30f73, 0x02820c87, 0x0060f60b, 0x032aa221, 0x02404540, 0x03b0151a, 0x001b4f25}}, Y: Field{[10]uint32{0x02d4749f, 0x03356c52, 0x023231c2, 0x03e7b99c, 0x0264b57d, 0x033b767b, 0x0295d438, 0x035dee3d, 0x01013d15, 0x0016aa2f}}}, + {X: Field{[10]uint32{0x02517539, 0x0163bfc2, 0x00165456, 0x030ea0be, 0x03b96d8e, 0x0131a8e6, 0x01cf2d9a, 0x01f79d06, 0x02001c1e, 0x0021b94f}}, Y: Field{[10]uint32{0x0344ad86, 0x01d7c06a, 0x03520ce4, 0x02b099b7, 0x00c24491, 0x00198c45, 0x01da5254, 0x03b3033b, 0x0370f2ef, 0x0003e2c6}}}, + {X: Field{[10]uint32{0x02a9880a, 0x014210d4, 0x0074347c, 0x02407cf2, 0x03075feb, 0x023b6ccf, 0x023267a7, 0x01f33aa6, 0x0339ac87, 0x00299070}}, Y: Field{[10]uint32{0x03982163, 0x029c9583, 0x01009c34, 0x031abf72, 0x01407559, 0x01f5a729, 0x03dc101b, 0x016b14f1, 0x014f2b27, 0x0036229b}}}, + {X: Field{[10]uint32{0x0182511a, 0x004d5a27, 0x00ceb9e0, 0x03550243, 0x00b925aa, 0x0378c5d5, 0x001de436, 0x02099916, 0x03a94d77, 0x000e8054}}, Y: Field{[10]uint32{0x00802035, 0x00cf5e96, 0x0055e35a, 0x00367c2b, 0x0111154b, 0x03fc1b3e, 0x0252df38, 0x017169e8, 0x02489493, 0x00003db2}}}, + {X: Field{[10]uint32{0x032b170f, 0x030a9851, 0x0058c5be, 0x035f18fd, 0x002c2e51, 0x009ba5bd, 0x0126b31d, 0x0326b501, 0x00e8a131, 0x0039e009}}, Y: Field{[10]uint32{0x034e0c53, 0x01fd9627, 0x008eaf19, 0x00125d90, 0x013a3092, 0x036ad977, 0x0093d9ce, 0x02c63c8d, 0x014b1ad7, 0x00315028}}}, + {X: Field{[10]uint32{0x006a5162, 0x004cce2a, 0x007cc7df, 0x01878b76, 0x007f05a1, 0x0064919a, 0x00380fab, 0x03c3b1d0, 0x005e8351, 0x001e1632}}, Y: Field{[10]uint32{0x02a6de1c, 0x035f96cd, 0x03a60928, 0x001969db, 0x037e658e, 0x03111354, 0x002897e7, 0x0281bf0e, 0x03445313, 0x0032b650}}}, + {X: Field{[10]uint32{0x030263e6, 0x01c51eb2, 0x024b82f3, 0x022b5666, 0x00ddb9da, 0x02597ccd, 0x0268c170, 0x037750d6, 0x02281c5b, 0x0001990f}}, Y: Field{[10]uint32{0x032cf79b, 0x022d6229, 0x03f36d72, 0x03e9a513, 0x016f2dc8, 0x02125a35, 0x008f9282, 0x02a82e6f, 0x02368ee1, 0x0027e7e7}}}, + {X: Field{[10]uint32{0x01b2254b, 0x0164b5ae, 0x035e7106, 0x008fa684, 0x02b31325, 0x03a81755, 0x03e8f9e3, 0x03c5325b, 0x0137a286, 0x0017cdb6}}, Y: Field{[10]uint32{0x0056310a, 0x011922e4, 0x02cfc2e5, 0x0070f21a, 0x029adb0e, 0x03cbf4e7, 0x02bf753e, 0x017fcb73, 0x037cc826, 0x0002758d}}}, + {X: Field{[10]uint32{0x023e2224, 0x019dfaf1, 0x0212fb17, 0x01c9187a, 0x02310f91, 0x00a140f0, 0x0226f266, 0x0282a97d, 0x01ae93d3, 0x00084bac}}, Y: Field{[10]uint32{0x036d1b67, 0x033f51d2, 0x02fa51df, 0x03fbd7f5, 0x010bbc5a, 0x03d4a09a, 0x038d9fdc, 0x00805b1c, 0x0233347f, 0x0014795f}}}, + {X: Field{[10]uint32{0x01e9eab4, 0x02175dcd, 0x0277e9a0, 0x024e39bc, 0x01dedb3b, 0x000f3898, 0x00481452, 0x027e4cca, 0x02c8940b, 0x00149a54}}, Y: Field{[10]uint32{0x01a42918, 0x013d3361, 0x0210952e, 0x023c50fe, 0x001d9aa5, 0x006013fe, 0x01fe2fd8, 0x00aabe69, 0x03a356df, 0x002195f3}}}, + {X: Field{[10]uint32{0x001c099f, 0x022f81d3, 0x036ef8f9, 0x00f2e5ea, 0x010419e0, 0x0254e8b4, 0x03a8778c, 0x00a04b92, 0x010def76, 0x00083c5d}}, Y: Field{[10]uint32{0x02cd485e, 0x03a2cc6e, 0x0060ebd8, 0x01396af0, 0x01d9d97b, 0x01a87b0b, 0x020bf881, 0x034a9fec, 0x01f53e7a, 0x0034bfba}}}, + {X: Field{[10]uint32{0x027ee910, 0x024db735, 0x02496da2, 0x0397bed9, 0x01dbc7f5, 0x03c4f1a4, 0x023cfb27, 0x00599708, 0x03b7ea01, 0x00388c68}}, Y: Field{[10]uint32{0x0365d53f, 0x02d7f02f, 0x0011e96e, 0x000bec5c, 0x0345e4f6, 0x0337c4f0, 0x027316c7, 0x0004c7cf, 0x002e18e8, 0x002a9917}}}, + {X: Field{[10]uint32{0x01c702ad, 0x005d2d89, 0x002cbed7, 0x0189a1e8, 0x01d01aa9, 0x014b9ca6, 0x02eac355, 0x009b74f6, 0x01523fd0, 0x001e9393}}, Y: Field{[10]uint32{0x01b965d2, 0x02ccc13f, 0x01b8471e, 0x03047e50, 0x007d2bdf, 0x0335f269, 0x00612044, 0x02396ab9, 0x02b6a739, 0x000d4704}}}, + {X: Field{[10]uint32{0x03f137b3, 0x013471b2, 0x03eaa557, 0x019c6688, 0x039a8589, 0x0000431b, 0x00a5a5ca, 0x0159c19f, 0x007e7696, 0x003f4bdc}}, Y: Field{[10]uint32{0x00315408, 0x01d4c1be, 0x038aa1ae, 0x021e78ef, 0x01df00e2, 0x033957d0, 0x039b1613, 0x0391ccc7, 0x030c1d5a, 0x00311690}}}, + {X: Field{[10]uint32{0x002bb89d, 0x024634fc, 0x01373f3f, 0x0293e099, 0x036c2ac2, 0x034c121d, 0x0011d676, 0x03d3f384, 0x001e8cf2, 0x003141b3}}, Y: Field{[10]uint32{0x01d3118a, 0x019078a9, 0x02f0c058, 0x01b8bd63, 0x01bea33d, 0x03dee982, 0x0247f6d1, 0x026cccbe, 0x03b37402, 0x002379b7}}}, + {X: Field{[10]uint32{0x035c0369, 0x0012dd6a, 0x02eebb82, 0x035f63e1, 0x00ad1bb4, 0x0327378f, 0x02b901c3, 0x03e6661a, 0x0102d9cc, 0x000ba9eb}}, Y: Field{[10]uint32{0x02b0ed43, 0x000c6543, 0x03d9ce40, 0x0189253a, 0x032b2135, 0x02bdda51, 0x03648ddd, 0x000c09d8, 0x03d86d75, 0x0004488a}}}, + {X: Field{[10]uint32{0x02159c5c, 0x00e33467, 0x0279c4c3, 0x00eb77f4, 0x00f8a602, 0x028ab04d, 0x004b421b, 0x039394be, 0x01923555, 0x002ae330}}, Y: Field{[10]uint32{0x0351ee1a, 0x007c8fe1, 0x00ff514d, 0x03ad532a, 0x015a5b54, 0x0311241e, 0x029fbda6, 0x0236f08f, 0x03bdcc26, 0x000b1238}}}, + {X: Field{[10]uint32{0x01dad430, 0x02bd01fd, 0x00e04c54, 0x009fcb3f, 0x02c37784, 0x029c4226, 0x0348e1c2, 0x0107ea46, 0x02e1cc7c, 0x00223fb0}}, Y: Field{[10]uint32{0x033ed80b, 0x02277ae2, 0x02cf3c4b, 0x019bec7f, 0x02dce306, 0x02c0d709, 0x02c7a049, 0x01994d7e, 0x02884f69, 0x00332d17}}}, + {X: Field{[10]uint32{0x034b0d41, 0x034dda1d, 0x0357c011, 0x02871931, 0x02940522, 0x03a83373, 0x02c31272, 0x03d746d0, 0x03ae1acc, 0x00101161}}, Y: Field{[10]uint32{0x030e787b, 0x028e4ffb, 0x01325f96, 0x03ad7395, 0x0163401d, 0x02cd46cd, 0x0368c369, 0x0187d3dc, 0x025b25ae, 0x003a373c}}}, + {X: Field{[10]uint32{0x02b9ab8a, 0x0093469f, 0x01097514, 0x033ef136, 0x0128a377, 0x009d4245, 0x00cf20ab, 0x02a30234, 0x02b9cade, 0x00229c07}}, Y: Field{[10]uint32{0x02ba5a45, 0x02737ab2, 0x0143a454, 0x0099bc0b, 0x01265e8b, 0x02a62d68, 0x0076154c, 0x02b1c30f, 0x018282a9, 0x0013c116}}}, + {X: Field{[10]uint32{0x01ad3d56, 0x00aa9e22, 0x0038929b, 0x001b1b59, 0x0366e15e, 0x00422930, 0x02141fdb, 0x00270a76, 0x01781940, 0x0030a04a}}, Y: Field{[10]uint32{0x035db5c1, 0x024db22d, 0x01afa974, 0x039db952, 0x029c9db5, 0x032c7951, 0x0034255d, 0x03a5a68a, 0x02fb6670, 0x00215027}}}, + {X: Field{[10]uint32{0x031d72fe, 0x03ee0401, 0x021298ad, 0x02d0aea9, 0x000f8ea4, 0x002e0af8, 0x03b04d19, 0x03210e4a, 0x02b1c810, 0x0027ff4d}}, Y: Field{[10]uint32{0x01b38404, 0x028f5a80, 0x03d871ca, 0x0291a997, 0x026f25fd, 0x03ea7f86, 0x002955eb, 0x0037e069, 0x024ba11f, 0x0004789e}}}, + {X: Field{[10]uint32{0x01a48b96, 0x01be1e69, 0x02b25f1c, 0x011d78ff, 0x0239e431, 0x0143bb18, 0x01072107, 0x02c05f2b, 0x0044bc92, 0x002b1280}}, Y: Field{[10]uint32{0x02b8dfe1, 0x02233907, 0x00de2d5f, 0x02fd15ed, 0x03f526bb, 0x011307d4, 0x03498533, 0x000bfc79, 0x03ba7310, 0x001071f0}}}, + {X: Field{[10]uint32{0x0306eb5a, 0x0393a19e, 0x0214224a, 0x01b35d93, 0x0357d808, 0x03467f17, 0x03c83bf9, 0x02a482cf, 0x001c157c, 0x0031e2c4}}, Y: Field{[10]uint32{0x038126c8, 0x00dfc674, 0x001d2deb, 0x033570a7, 0x02b7a9d7, 0x013cee3d, 0x035f533b, 0x0183ffeb, 0x006eb9d6, 0x0006a34b}}}, + {X: Field{[10]uint32{0x03147cd2, 0x0396ba1d, 0x03d13578, 0x02e39b45, 0x01c24b0d, 0x02bb7648, 0x03c1c2db, 0x0122e57c, 0x03055723, 0x003423ce}}, Y: Field{[10]uint32{0x022713cb, 0x0187899d, 0x00696914, 0x02bd77f8, 0x034987df, 0x0028e148, 0x02e3e5c9, 0x01f2eda6, 0x00de0a06, 0x0009ed7f}}}, + {X: Field{[10]uint32{0x01e312f5, 0x02312ca9, 0x004893d0, 0x01471602, 0x001091cf, 0x01f1707f, 0x01db0f1c, 0x03d87ae0, 0x003d5060, 0x00103a81}}, Y: Field{[10]uint32{0x0166b27c, 0x005a8007, 0x01f30848, 0x00fbed96, 0x02043de0, 0x0167c54d, 0x02719be2, 0x00c0bf80, 0x02c42836, 0x000bbc47}}}, + {X: Field{[10]uint32{0x018362e7, 0x0212b40d, 0x02ec39f1, 0x03e76ec7, 0x0117db73, 0x0090bae9, 0x00827b28, 0x02d2cb7a, 0x00bdfb53, 0x003e7441}}, Y: Field{[10]uint32{0x01771877, 0x0333f3d3, 0x03167296, 0x03052bdb, 0x0268f4e3, 0x01f50fc2, 0x02707b6d, 0x006520ae, 0x020b6c37, 0x0035d912}}}, + {X: Field{[10]uint32{0x03f9ddc9, 0x00dde37b, 0x02b6e570, 0x028905c4, 0x00fea5f8, 0x0268176b, 0x02132b40, 0x0120a539, 0x02ee14c3, 0x003749da}}, Y: Field{[10]uint32{0x01ceb7ef, 0x0260d4e9, 0x0066b7bc, 0x0180add0, 0x034803f7, 0x025a4343, 0x02de6553, 0x03bb25ff, 0x017d5d92, 0x00026f98}}}, + {X: Field{[10]uint32{0x01155d49, 0x03a13c18, 0x012f4c8b, 0x035de149, 0x032104c7, 0x03c36e36, 0x03d11f67, 0x01ef4319, 0x0039d5f1, 0x002148be}}, Y: Field{[10]uint32{0x023ea117, 0x00ea5656, 0x00777316, 0x0375667e, 0x02e01f3e, 0x03729256, 0x039b59cd, 0x007e3db2, 0x01518031, 0x002dde46}}}, + {X: Field{[10]uint32{0x02b5b225, 0x000c362d, 0x0264eeb2, 0x01992ff3, 0x02510491, 0x018519ca, 0x0002a624, 0x02fa383f, 0x02bdb4f3, 0x001cca00}}, Y: Field{[10]uint32{0x02a3c6f3, 0x01aadc91, 0x01f8e35a, 0x018b4455, 0x02d9022d, 0x0302c973, 0x0105f92c, 0x03b875a9, 0x01ec590e, 0x001ef533}}}, + {X: Field{[10]uint32{0x0167af62, 0x036d5cd6, 0x02fc68fb, 0x02bf1125, 0x01f5ffcb, 0x022f7a85, 0x0273276b, 0x020d4887, 0x01a12c4f, 0x0006cd90}}, Y: Field{[10]uint32{0x01664048, 0x03619b66, 0x021cef0f, 0x00c81ea3, 0x000b824c, 0x02d33407, 0x01e2e153, 0x00adecbb, 0x02f5e5d1, 0x0000f543}}}, + {X: Field{[10]uint32{0x0301a7ce, 0x0254974f, 0x00c852c7, 0x01576efa, 0x010c8972, 0x02d9b4e4, 0x02cbe60c, 0x0213ffb5, 0x02184e92, 0x0034c0d3}}, Y: Field{[10]uint32{0x01d09e25, 0x03e3e67e, 0x013b48c4, 0x0313bacd, 0x0211172a, 0x017c6e87, 0x0094b058, 0x01439ca8, 0x030416ce, 0x002cd998}}}, + {X: Field{[10]uint32{0x01e9db17, 0x00c9c29a, 0x0176d65c, 0x00aa8eb4, 0x0261c6db, 0x023d3e16, 0x03a44610, 0x03d7bc63, 0x0200bd22, 0x00239ea0}}, Y: Field{[10]uint32{0x03530568, 0x012cec7c, 0x01ceadee, 0x01d466cd, 0x004a4824, 0x01c7d335, 0x03536edc, 0x025e6fe1, 0x03b51cce, 0x002107f8}}}, + {X: Field{[10]uint32{0x00a4027e, 0x02c2d958, 0x009e85da, 0x00f60e40, 0x01c4af5f, 0x005086b8, 0x02aee276, 0x0219c746, 0x00de29ab, 0x003f332d}}, Y: Field{[10]uint32{0x037f993b, 0x02f48b83, 0x01c47fa6, 0x0352fa8a, 0x01a6e269, 0x03a5df9c, 0x036ac069, 0x0226bf56, 0x0396203b, 0x002808a7}}}, + {X: Field{[10]uint32{0x004c8a26, 0x00b001f9, 0x02576925, 0x01d87e67, 0x039e74a4, 0x03ab5c16, 0x00681f0a, 0x02060213, 0x017f4435, 0x0039a33f}}, Y: Field{[10]uint32{0x0028f82e, 0x004874b1, 0x013c1672, 0x01863a7c, 0x01712291, 0x03c343ad, 0x0378d50c, 0x038ab908, 0x00a7b027, 0x002b7670}}}, + {X: Field{[10]uint32{0x006891d8, 0x0381184b, 0x029a8072, 0x0022dc9b, 0x0263bfe0, 0x022ecc94, 0x026de7ac, 0x02b05921, 0x03ad4b81, 0x0022dbc3}}, Y: Field{[10]uint32{0x024bc9ca, 0x03b2bb6e, 0x01288092, 0x023e98a4, 0x0391493e, 0x0289ff84, 0x008d328c, 0x0012de02, 0x0108a8d6, 0x0026eb59}}}, + {X: Field{[10]uint32{0x024b78b1, 0x035266f5, 0x021ba8cf, 0x010d5ea4, 0x02470f89, 0x0019d185, 0x03178cf2, 0x00652498, 0x00aa37ac, 0x00042283}}, Y: Field{[10]uint32{0x0265bf55, 0x0067d928, 0x032a75a8, 0x0149844a, 0x039b7c04, 0x03fd45f1, 0x03e302e1, 0x0255bd7f, 0x0122be05, 0x001a0543}}}, + {X: Field{[10]uint32{0x0357edb6, 0x0100a131, 0x0208b429, 0x02949952, 0x02ab8e13, 0x00dc2971, 0x032daa83, 0x0315e474, 0x03330844, 0x003fb460}}, Y: Field{[10]uint32{0x02457fe5, 0x02707fcd, 0x01e56f83, 0x00bb4fe2, 0x00b1b52c, 0x0254ba8d, 0x0229a976, 0x02ae13ae, 0x03378395, 0x0019ef77}}}, + {X: Field{[10]uint32{0x00170a2f, 0x02cbb824, 0x00da501f, 0x02108d46, 0x00848b2d, 0x02933789, 0x03ed6f10, 0x01b3cd42, 0x039decd5, 0x002fafec}}, Y: Field{[10]uint32{0x03a11573, 0x0350328a, 0x0275197d, 0x036c2987, 0x0005acb2, 0x0051b652, 0x0125fbde, 0x03e21c8a, 0x00b3bb86, 0x0004c0ad}}}, + {X: Field{[10]uint32{0x001e716c, 0x01efca06, 0x0286c9c6, 0x015e74a2, 0x02af8d50, 0x01369ed5, 0x0070d3cb, 0x034edb11, 0x02ed2a58, 0x0019c4d6}}, Y: Field{[10]uint32{0x02fd6664, 0x01202723, 0x03040019, 0x00fc14fa, 0x0230fa2f, 0x03cdd111, 0x00f3e778, 0x038fbf72, 0x02ab2786, 0x0025f102}}}, + {X: Field{[10]uint32{0x0354f90e, 0x024a3950, 0x038b9c37, 0x01782436, 0x03c3dea7, 0x0135b7c0, 0x0309dd41, 0x01b96b36, 0x01bb0956, 0x002c03ad}}, Y: Field{[10]uint32{0x029b1258, 0x03e4fbb9, 0x0164d8ae, 0x01c044b2, 0x02ccc3a6, 0x02666bce, 0x0173aa63, 0x0399d3a6, 0x02411cb6, 0x001b4483}}}, + {X: Field{[10]uint32{0x03bb73a2, 0x03cce13c, 0x03bb8ecd, 0x024b7a7b, 0x01233375, 0x028e6cb6, 0x01db6d3b, 0x00808bc2, 0x026cbe8d, 0x001c86c6}}, Y: Field{[10]uint32{0x0205310f, 0x01632392, 0x020885b4, 0x039e542f, 0x014acbb2, 0x0253e01d, 0x01ae1f2e, 0x003d1c1d, 0x0362631a, 0x00336d06}}}, + {X: Field{[10]uint32{0x038a0837, 0x028f9137, 0x03f71d10, 0x020e5226, 0x0242f60b, 0x02431083, 0x0147cde1, 0x004b2a37, 0x00ac015b, 0x0032e35e}}, Y: Field{[10]uint32{0x0296dbc2, 0x01f33ffa, 0x022d5d17, 0x022c4206, 0x03abdc44, 0x03ecb849, 0x00d3846c, 0x00d9d7a3, 0x01a6a307, 0x00202f8c}}}, + {X: Field{[10]uint32{0x00781920, 0x03b1e15b, 0x0017a0af, 0x00af8bb8, 0x0137e5c5, 0x03450f95, 0x03f3ae66, 0x03621348, 0x03cc4919, 0x0012473e}}, Y: Field{[10]uint32{0x02874189, 0x01fb3115, 0x03ee62b1, 0x0353b706, 0x003ba714, 0x01367cbb, 0x004d29cc, 0x00c2234d, 0x03502628, 0x001d8c86}}}, + {X: Field{[10]uint32{0x02b507b4, 0x01c02cda, 0x0027cfb3, 0x011b17af, 0x038145d1, 0x02088c0e, 0x02ed33ff, 0x00898c8e, 0x03ee4899, 0x0001b28c}}, Y: Field{[10]uint32{0x00b11f4e, 0x00fa34b0, 0x03ec644e, 0x002a7276, 0x038c376a, 0x002548af, 0x00a20cfd, 0x03419078, 0x02b3f189, 0x0025adce}}}, + {X: Field{[10]uint32{0x01d842c7, 0x032aea06, 0x00f8997c, 0x03be6058, 0x001bf602, 0x008b3e9a, 0x03b33d38, 0x025c6db2, 0x03cb3c48, 0x001b47f7}}, Y: Field{[10]uint32{0x03b1713f, 0x01b4a733, 0x0376909c, 0x0311565a, 0x00fa555a, 0x01bc1180, 0x017c0629, 0x02098979, 0x03c46608, 0x00020af1}}}, + {X: Field{[10]uint32{0x02a43554, 0x038fea7f, 0x01b55c88, 0x00f0f87a, 0x02daeb53, 0x01ac8de5, 0x01ac3ca3, 0x00bd069a, 0x02991cf9, 0x0028fa05}}, Y: Field{[10]uint32{0x012855f1, 0x02520c8c, 0x020fa25e, 0x03d5e1b4, 0x0165887d, 0x015014c2, 0x0206b0b4, 0x0119ebe8, 0x029be802, 0x0021e9be}}}, + {X: Field{[10]uint32{0x01d49c70, 0x0230fa1f, 0x03ab571f, 0x013cfcbf, 0x007f570e, 0x0142cab1, 0x02c7438d, 0x030ca53a, 0x03d7cbfb, 0x003f212a}}, Y: Field{[10]uint32{0x03f73dd9, 0x014ddf69, 0x0075b691, 0x00ee959b, 0x02589f6c, 0x0266d905, 0x01b3f1cd, 0x015ac396, 0x02690713, 0x001d11ec}}}, + {X: Field{[10]uint32{0x0355d1b1, 0x02090200, 0x01769539, 0x02a1ce9a, 0x01af4e02, 0x03b28568, 0x00d31252, 0x0056e860, 0x02408fc5, 0x002fac8c}}, Y: Field{[10]uint32{0x019c1459, 0x030d0fd4, 0x01e95b3b, 0x028417ae, 0x00e2bbe6, 0x006dd96c, 0x02deba93, 0x02a6ab97, 0x000d6fa8, 0x0004be92}}}, + {X: Field{[10]uint32{0x0299eb8e, 0x0180d906, 0x00f13df7, 0x00ed810d, 0x010a50e6, 0x02f0094a, 0x02373d71, 0x035fcc66, 0x0279cffa, 0x001a2245}}, Y: Field{[10]uint32{0x00772fb8, 0x01ed6dda, 0x00524da0, 0x0258b9bb, 0x037736ce, 0x01b40540, 0x02a7c1e8, 0x022a8b4b, 0x01b76db2, 0x00102de3}}}, + {X: Field{[10]uint32{0x03068817, 0x0007b8ae, 0x01d96ed4, 0x03350a3a, 0x03b42e2f, 0x023ed754, 0x022f736e, 0x02c103f7, 0x01ad1ae7, 0x0003b10d}}, Y: Field{[10]uint32{0x0096f9f2, 0x02fb23bf, 0x03ac244b, 0x01175943, 0x0126860c, 0x01b13de5, 0x0028a856, 0x010dbd2a, 0x02aa1283, 0x0004efdb}}}, + {X: Field{[10]uint32{0x03de3033, 0x0165341a, 0x0249f374, 0x01d9885a, 0x0060a755, 0x01df9241, 0x03b7ce7f, 0x01a22df7, 0x02fa661f, 0x0019e7d6}}, Y: Field{[10]uint32{0x03617ca1, 0x03ecd71b, 0x017094e0, 0x00ca921f, 0x02c8fddd, 0x023c172d, 0x00f14bfc, 0x013f6956, 0x03d96c25, 0x003fcfff}}}, + {X: Field{[10]uint32{0x0233be60, 0x026994bd, 0x02d68ba8, 0x000bb3ad, 0x011aa2fc, 0x010c1ec8, 0x0348aeb6, 0x009b97ef, 0x00ea05dc, 0x0027faf6}}, Y: Field{[10]uint32{0x02630bee, 0x0390d923, 0x0099272b, 0x0258b1de, 0x033fc5dc, 0x02ef1783, 0x036e785c, 0x00e292b4, 0x03c8ea62, 0x0030219e}}}, + {X: Field{[10]uint32{0x000b1601, 0x00df24d8, 0x03acfe21, 0x02046d64, 0x010347b3, 0x03763e7c, 0x02bed696, 0x02d23b6d, 0x0154c534, 0x003621ac}}, Y: Field{[10]uint32{0x0375d077, 0x02ad7583, 0x03964f10, 0x03064edd, 0x03d74028, 0x03faa8fd, 0x02246c8e, 0x036aa713, 0x0118aa07, 0x002932f0}}}, + {X: Field{[10]uint32{0x006e9d47, 0x03929d11, 0x0349ab7e, 0x009f73b0, 0x01096a8e, 0x03fc85e8, 0x03f6ab68, 0x028e9820, 0x03efc187, 0x002be332}}, Y: Field{[10]uint32{0x03e941f0, 0x01c5b3da, 0x03dc4990, 0x00cc96a3, 0x031662a7, 0x0395539b, 0x025b625b, 0x000e49f6, 0x027c9988, 0x0000fb8c}}}, + {X: Field{[10]uint32{0x01d3d26a, 0x00662f1f, 0x033654a6, 0x0162a65e, 0x0042d334, 0x012952a1, 0x0051d224, 0x0098728d, 0x00e7891c, 0x0007a600}}, Y: Field{[10]uint32{0x01a215d4, 0x0269dcd9, 0x013bd566, 0x03259bdd, 0x03978120, 0x020b9acd, 0x031a321e, 0x03f03757, 0x0186bd6f, 0x000c8be2}}}, + {X: Field{[10]uint32{0x03150044, 0x0193159d, 0x015e415d, 0x029a8b49, 0x00aae4ff, 0x00ea43cc, 0x000dc97f, 0x02002561, 0x02f29f00, 0x00045718}}, Y: Field{[10]uint32{0x02d8af95, 0x035f8cba, 0x01a14a8f, 0x017a2f0b, 0x02cceef9, 0x0393f7c2, 0x03660e01, 0x03397bf5, 0x00127e37, 0x00136513}}}, + {X: Field{[10]uint32{0x02e0178c, 0x01565a0a, 0x02ba2598, 0x017fd0a0, 0x033f5313, 0x0144896f, 0x00d78e8e, 0x01e776cd, 0x039dacbf, 0x000072e7}}, Y: Field{[10]uint32{0x011a4bf5, 0x01a32d2f, 0x0284a50c, 0x03421577, 0x02d7b602, 0x02f3c8d3, 0x01595e20, 0x026f2508, 0x00e37a18, 0x0023f4e9}}}, + {X: Field{[10]uint32{0x03bfe357, 0x01e7b94b, 0x0370b66a, 0x0163e779, 0x01af86d2, 0x0326478e, 0x02b2a5bd, 0x03059d2e, 0x03c463e4, 0x0018a856}}, Y: Field{[10]uint32{0x02f52749, 0x02f792e3, 0x01e9f9f7, 0x0107a3af, 0x02d376fe, 0x01bd1548, 0x02da69fe, 0x01f93495, 0x029fd946, 0x002de3f2}}}, + {X: Field{[10]uint32{0x02df505e, 0x0047a4d7, 0x01ec454b, 0x00a96867, 0x026bd2c8, 0x01cefb53, 0x0170914a, 0x006520c5, 0x00e05bf3, 0x0015d29b}}, Y: Field{[10]uint32{0x00001318, 0x0206a5d7, 0x00b789b2, 0x02ea2ed7, 0x02d02dba, 0x006a6943, 0x02a60b8c, 0x03cce3c3, 0x02cccbd6, 0x0039ecb8}}}, + {X: Field{[10]uint32{0x024084e6, 0x02b47549, 0x023194ad, 0x02ad5839, 0x01c5ae50, 0x027b493f, 0x039cedad, 0x018692eb, 0x037ca3a3, 0x001931b8}}, Y: Field{[10]uint32{0x00116067, 0x025bb59a, 0x008d3f79, 0x003a09c7, 0x004b7a48, 0x00d6b801, 0x0054a07f, 0x02d01027, 0x035656b6, 0x0039b90b}}}, + {X: Field{[10]uint32{0x0100fd84, 0x002041d2, 0x03b11553, 0x011ab79f, 0x0371b277, 0x01d581e9, 0x0246af84, 0x02379555, 0x0297fe4a, 0x00124196}}, Y: Field{[10]uint32{0x030ae7f9, 0x0217c6b5, 0x03342834, 0x01efeed0, 0x0094e721, 0x01ec9d9f, 0x038eb43c, 0x00c2426a, 0x009f67a0, 0x0026175a}}}, + {X: Field{[10]uint32{0x030999cb, 0x02532a8c, 0x009aa443, 0x0079f962, 0x028500c9, 0x03a227cc, 0x02a683b7, 0x0242f61d, 0x03f91857, 0x001bf4cb}}, Y: Field{[10]uint32{0x01d2de3b, 0x025ea321, 0x0278c644, 0x024e3c69, 0x03efbd64, 0x031afc07, 0x013784e9, 0x03c975ea, 0x00841be1, 0x0004bfa0}}}, + {X: Field{[10]uint32{0x02d3b185, 0x02e4ad98, 0x0098b4eb, 0x03109bf7, 0x012d6d12, 0x01c25214, 0x0334812f, 0x027239bf, 0x00da4818, 0x001299f5}}, Y: Field{[10]uint32{0x038150f5, 0x033a945f, 0x01540684, 0x0174e269, 0x033e5009, 0x03e9c6e3, 0x03c668ee, 0x02ddddcd, 0x03f2f6e5, 0x00163aa0}}}, + {X: Field{[10]uint32{0x039f4db2, 0x0386fae9, 0x00c85987, 0x03165708, 0x00edecf4, 0x026b6d19, 0x020752db, 0x009dc174, 0x0131d3a9, 0x003a86b2}}, Y: Field{[10]uint32{0x0322b83e, 0x03dbcd19, 0x008309c3, 0x014da292, 0x03426b57, 0x001bf646, 0x0316597b, 0x02580560, 0x030e25aa, 0x0033da26}}}, + {X: Field{[10]uint32{0x01545c5a, 0x0136fd37, 0x006c12de, 0x03cfc65b, 0x0161414a, 0x02af2672, 0x032663f7, 0x00149f55, 0x026e248a, 0x00232cd6}}, Y: Field{[10]uint32{0x000cfcfa, 0x0254b99a, 0x02a7c4a3, 0x02afcdaf, 0x01c43292, 0x00235403, 0x02dfc3fa, 0x0336d99b, 0x00e047da, 0x0012ccb9}}}, + {X: Field{[10]uint32{0x027f21c8, 0x02673374, 0x008e3c8d, 0x02110c1e, 0x00843186, 0x01160558, 0x02f8dfbf, 0x030bab3f, 0x000cf150, 0x00091f20}}, Y: Field{[10]uint32{0x031d0db6, 0x010ba147, 0x030a7579, 0x01776cf9, 0x02a70839, 0x020a7adf, 0x026462f5, 0x03468398, 0x00dc914f, 0x003320b6}}}, + {X: Field{[10]uint32{0x03426673, 0x012191cc, 0x02482c9f, 0x0133b480, 0x025e0c4a, 0x0040dc23, 0x00f35666, 0x0249f3ec, 0x03c407fb, 0x001950f5}}, Y: Field{[10]uint32{0x0107ebab, 0x023cf51e, 0x0019c88d, 0x00c0ff72, 0x0020bbc7, 0x00c7a9d4, 0x00ae0d16, 0x02b5d605, 0x029a69b4, 0x003894ac}}}, + {X: Field{[10]uint32{0x0388e6d0, 0x0155ad30, 0x026c29b3, 0x036cb840, 0x02d5e759, 0x03d72705, 0x01da4aca, 0x00ce8e82, 0x0255d81c, 0x00313c44}}, Y: Field{[10]uint32{0x00a8fd49, 0x03554747, 0x014f24fc, 0x02ac61ba, 0x0195379e, 0x0123d463, 0x00e5530e, 0x022ad605, 0x02a81af4, 0x0038b98d}}}, + {X: Field{[10]uint32{0x02019eec, 0x0363be57, 0x005981ba, 0x023f2798, 0x01b08284, 0x012bd681, 0x003d92a1, 0x00e6ddce, 0x029d85da, 0x0033c61a}}, Y: Field{[10]uint32{0x0079e3fc, 0x01156f2c, 0x0064248f, 0x01f81873, 0x006b49f3, 0x0100425a, 0x03672a16, 0x03f8214f, 0x021bc860, 0x0032af78}}}, + {X: Field{[10]uint32{0x02ea8f32, 0x02ba40e1, 0x037f6be9, 0x011cf517, 0x00fe9d1d, 0x0222e3f6, 0x015c2c7a, 0x03704f96, 0x0353ad69, 0x0039b0f8}}, Y: Field{[10]uint32{0x00690be1, 0x001f0a2b, 0x02b57021, 0x008357b4, 0x0396b5a9, 0x012617cc, 0x0210800a, 0x01707485, 0x00c94f45, 0x001f4efb}}}, + {X: Field{[10]uint32{0x01060988, 0x029ecbb0, 0x01c118d6, 0x03ddcc34, 0x01d1ba01, 0x033c8a44, 0x0295dc6b, 0x01553551, 0x03a39bcb, 0x000e09ec}}, Y: Field{[10]uint32{0x0225a211, 0x0142bff2, 0x027bfd9f, 0x01890648, 0x00c800a3, 0x02e3d304, 0x0018c5ec, 0x03ba0c6e, 0x0047b7c9, 0x000c904c}}}, + {X: Field{[10]uint32{0x006d24fa, 0x01582373, 0x0013e48f, 0x021446d5, 0x004b55ed, 0x0102c3bd, 0x01ae898c, 0x01268aa3, 0x0138a4b1, 0x003fcdf3}}, Y: Field{[10]uint32{0x01c49048, 0x00cb2b2e, 0x03ceca68, 0x0354810c, 0x01f3ffde, 0x01a14ea5, 0x03a489b8, 0x019995f0, 0x01198f4c, 0x00179856}}}, + {X: Field{[10]uint32{0x020ce509, 0x034fa28c, 0x001def68, 0x01f11545, 0x01d9e53c, 0x03a0edd4, 0x03343229, 0x00beb87b, 0x03c85b49, 0x002f7fd3}}, Y: Field{[10]uint32{0x03de3d20, 0x013f7822, 0x00b8a43b, 0x0139135c, 0x02531f8a, 0x02656784, 0x015088a2, 0x01759985, 0x00649dcc, 0x003a3f66}}}, + {X: Field{[10]uint32{0x03bcd0af, 0x02a6cf0e, 0x02aef625, 0x001c9051, 0x02e59d10, 0x00063c47, 0x032719d9, 0x03cb55fe, 0x029c313f, 0x003f5ae8}}, Y: Field{[10]uint32{0x01c1079d, 0x00fa5f7d, 0x02bf6de7, 0x03a078e2, 0x035018db, 0x0065ae1d, 0x01f584b3, 0x00430c0e, 0x035e9133, 0x00061f6b}}}, + {X: Field{[10]uint32{0x0329ff28, 0x02dc42c6, 0x03b621d0, 0x01e05017, 0x004f4b5f, 0x02b0c05e, 0x032ae1c3, 0x01a4a7bd, 0x022d4860, 0x003a8f10}}, Y: Field{[10]uint32{0x03bf208c, 0x03fbe48c, 0x02af2564, 0x01f3be66, 0x01d10b37, 0x028c5b89, 0x03637eef, 0x0381bf0d, 0x001ec6c3, 0x0039162d}}}, + {X: Field{[10]uint32{0x007b3978, 0x01c14fd2, 0x03c390f8, 0x03b6bc6c, 0x0002ba8a, 0x002d166e, 0x0228924f, 0x03580234, 0x01334982, 0x001194dc}}, Y: Field{[10]uint32{0x01adf3f0, 0x03fd9693, 0x017006bb, 0x0368ee25, 0x023b2444, 0x00850f72, 0x003bb29e, 0x0277bfc9, 0x014c1318, 0x003f6599}}}, + {X: Field{[10]uint32{0x0178d8f5, 0x00dc5da1, 0x039dd996, 0x012a8b43, 0x01b5b29b, 0x03e78414, 0x036227f9, 0x001a6ab1, 0x03f11226, 0x003f6924}}, Y: Field{[10]uint32{0x01d46fa3, 0x02e1b1f8, 0x03a06d8e, 0x02d4958c, 0x02e04e55, 0x02600e98, 0x03a69d7f, 0x004db7d0, 0x013df63d, 0x00168cd6}}}, + {X: Field{[10]uint32{0x01f3e4c1, 0x0185d3ce, 0x000cd096, 0x015f15c8, 0x027ab5e7, 0x03a8dbfb, 0x028e2835, 0x00062951, 0x02e95f09, 0x001d3f10}}, Y: Field{[10]uint32{0x018751f0, 0x02c94848, 0x010b32a8, 0x01d52ff4, 0x033760e0, 0x017e3d75, 0x006204d4, 0x0324536a, 0x03403802, 0x00332a82}}}, + {X: Field{[10]uint32{0x00483d53, 0x022ec6bb, 0x03bafe11, 0x030a0503, 0x030d98f8, 0x0239051d, 0x03818da5, 0x01e68032, 0x004a997b, 0x0002633b}}, Y: Field{[10]uint32{0x02aaec08, 0x01a26b1f, 0x02ae4d81, 0x02782103, 0x01ac422d, 0x020b0675, 0x03b82fa1, 0x017354d9, 0x00581494, 0x000bf398}}}, + {X: Field{[10]uint32{0x03cba60f, 0x00dd2c44, 0x01fc13c2, 0x01025b31, 0x01e4fa15, 0x025ff55d, 0x015119f6, 0x032f7081, 0x01b789a5, 0x0031d0b7}}, Y: Field{[10]uint32{0x02f3532d, 0x02837a91, 0x0168013f, 0x03d3cac7, 0x01b32248, 0x039b6ea8, 0x002474b0, 0x02438750, 0x012834a9, 0x0026c2bc}}}, + {X: Field{[10]uint32{0x0391eb89, 0x0027f479, 0x0019b774, 0x0360ec4e, 0x005b5973, 0x03131c89, 0x00979136, 0x0019aad6, 0x004f9a78, 0x0036e8b8}}, Y: Field{[10]uint32{0x033baf43, 0x03f29798, 0x016a889d, 0x03821c11, 0x03aa0e90, 0x005e3c1d, 0x00240e7a, 0x017dd05a, 0x01223adb, 0x000d1d1e}}}, + {X: Field{[10]uint32{0x02f6538d, 0x0271a710, 0x01fbf106, 0x02183ada, 0x036cc47f, 0x03091cac, 0x0184dcb6, 0x021619ee, 0x02436e59, 0x001b532b}}, Y: Field{[10]uint32{0x01e0a84f, 0x02ec7cf5, 0x01cedb98, 0x019f59fc, 0x02125c2b, 0x00fbfbd4, 0x03c53c92, 0x03df3b75, 0x00c9f0c4, 0x0031fed6}}}, + {X: Field{[10]uint32{0x00523982, 0x005a80ee, 0x0010f9cc, 0x00e5bf65, 0x029ec5b5, 0x02eb8a46, 0x0264ed43, 0x01ec156d, 0x036ed5b6, 0x0013115f}}, Y: Field{[10]uint32{0x00f344eb, 0x007fb548, 0x00e988e9, 0x01ffb086, 0x02a435f4, 0x029ca09e, 0x022ed682, 0x03867d51, 0x03cf20aa, 0x00124b96}}}, + {X: Field{[10]uint32{0x0346eb3f, 0x035107f2, 0x018179cd, 0x030c1933, 0x0151fd8a, 0x01d2b8a5, 0x00033bfd, 0x022907d6, 0x01223477, 0x00135f9a}}, Y: Field{[10]uint32{0x022750c4, 0x024bd1b1, 0x012ad0c0, 0x001ef443, 0x036d7bbd, 0x01eb692e, 0x00538791, 0x0274f0e9, 0x00b2ff5c, 0x001d5bb0}}}, + {X: Field{[10]uint32{0x03d464b2, 0x0311f8c1, 0x0115cfef, 0x027292be, 0x004a4839, 0x02dd3be5, 0x03c565ea, 0x0351e6f6, 0x025069ba, 0x0002b16f}}, Y: Field{[10]uint32{0x02874345, 0x02df3eb7, 0x00381928, 0x02a94a6d, 0x008bad5d, 0x02739176, 0x0322c546, 0x0042d8dd, 0x03febc58, 0x000c91b8}}}, + {X: Field{[10]uint32{0x023995b2, 0x027a1036, 0x002d15d6, 0x002d8362, 0x0224f91e, 0x014d2c96, 0x026a4812, 0x0004e6ff, 0x01412135, 0x001f6a23}}, Y: Field{[10]uint32{0x00b9c587, 0x0080d23c, 0x03eb5cbc, 0x00b262b6, 0x026a2d09, 0x025dc90c, 0x00bb03cf, 0x0293e1c0, 0x018d62a7, 0x0026222b}}}, + {X: Field{[10]uint32{0x01abf149, 0x014af8ec, 0x037d4e8b, 0x00ac1744, 0x015d3b92, 0x034f3ad2, 0x01aa3eb4, 0x02734832, 0x031a6323, 0x000e27fc}}, Y: Field{[10]uint32{0x00fe7c93, 0x03000dce, 0x02d49dc3, 0x03b55456, 0x01042f54, 0x01db0521, 0x022ab22b, 0x002fca28, 0x022fbc84, 0x002c3b0a}}}, + {X: Field{[10]uint32{0x016c4370, 0x009e9756, 0x036f8f3c, 0x012637f3, 0x02a94b2e, 0x00f55cdb, 0x025afaad, 0x00a2cba9, 0x02cf5fb1, 0x00307306}}, Y: Field{[10]uint32{0x034fd38e, 0x010279a4, 0x0153b27c, 0x02a706ec, 0x00ecfec6, 0x028aa233, 0x006bf2da, 0x02b4c5b3, 0x004d1986, 0x002240d6}}}, + {X: Field{[10]uint32{0x03c9aa3a, 0x01462d21, 0x03cf98b3, 0x015fa46c, 0x0002a349, 0x00725b01, 0x0340be83, 0x01a28a91, 0x0252b927, 0x000e66b3}}, Y: Field{[10]uint32{0x00800005, 0x03ac4d12, 0x02869786, 0x030f2812, 0x03fd9af1, 0x035827e8, 0x017ae095, 0x00e91e84, 0x00b3abdb, 0x002420c5}}}, + {X: Field{[10]uint32{0x0206d0a2, 0x020eea6e, 0x03c76d82, 0x001832b6, 0x01470cc6, 0x001694ae, 0x02d98593, 0x000695c0, 0x03fd8c9d, 0x0001a550}}, Y: Field{[10]uint32{0x031057df, 0x03a2865c, 0x01d1b6f4, 0x030e2a40, 0x00404eb1, 0x00ca6022, 0x0348f17b, 0x01cbb4b8, 0x03d9a0c3, 0x003a6639}}}, + {X: Field{[10]uint32{0x00200100, 0x02dabdfa, 0x02d6d400, 0x00f3dc0e, 0x00911e55, 0x01cac70a, 0x01289a58, 0x011bbd68, 0x014fdf9b, 0x00085cb5}}, Y: Field{[10]uint32{0x03687a8c, 0x00625c46, 0x035d9edc, 0x03afd90a, 0x0334a8fb, 0x01cac89b, 0x0020df57, 0x00397832, 0x007d3b79, 0x0008486d}}}, + {X: Field{[10]uint32{0x015e8b56, 0x017df3a7, 0x03f286d4, 0x00e84390, 0x01cc2713, 0x01248e59, 0x026847d2, 0x00939743, 0x03e937a3, 0x003d81bd}}, Y: Field{[10]uint32{0x0286e007, 0x039d5c4f, 0x008d1a30, 0x02024728, 0x03f5b805, 0x024c9284, 0x03379448, 0x00878b44, 0x03b8622a, 0x001c004f}}}, + {X: Field{[10]uint32{0x0040fc99, 0x03639c5f, 0x0214edfc, 0x00b7526a, 0x012f95bb, 0x00d0abcd, 0x0032013b, 0x02d93c7d, 0x00c2dfce, 0x0027c548}}, Y: Field{[10]uint32{0x018e863d, 0x035534e2, 0x001996ca, 0x029040c2, 0x02d53dc0, 0x0192a41f, 0x024fe3b7, 0x03c0123e, 0x0226feb1, 0x003fa3f2}}}, + {X: Field{[10]uint32{0x031eaa08, 0x024dc288, 0x0260518a, 0x00632ca1, 0x0053afe4, 0x01724f4e, 0x00674eb7, 0x019dbbac, 0x036e7587, 0x00199c2b}}, Y: Field{[10]uint32{0x03eb09f3, 0x02933b92, 0x0053734b, 0x03314936, 0x00fb59fc, 0x02ec4bf6, 0x03fcee90, 0x01c7b825, 0x035edfc0, 0x000a64ff}}}, + {X: Field{[10]uint32{0x03898350, 0x0166a52c, 0x0152465f, 0x013ab5b2, 0x0140650a, 0x03a5530b, 0x00a4e2fe, 0x0312f393, 0x018b345c, 0x000571b5}}, Y: Field{[10]uint32{0x0363cf7f, 0x0039de28, 0x02cf3a6b, 0x02a9cf7c, 0x00221b12, 0x014a34b0, 0x020f3adf, 0x01865996, 0x013b4727, 0x00022531}}}, + {X: Field{[10]uint32{0x01389621, 0x00665ddd, 0x024548a9, 0x0082583a, 0x00adfffd, 0x017e1692, 0x0293ef17, 0x03790b24, 0x02bf60db, 0x002f12ad}}, Y: Field{[10]uint32{0x01040e42, 0x00d1d846, 0x01a4437a, 0x01d18552, 0x0100791a, 0x0335c64c, 0x016bb68e, 0x038a9d17, 0x00ba24a4, 0x003f8a28}}}, + {X: Field{[10]uint32{0x013e6ee1, 0x03cb8443, 0x01c8054e, 0x0141001f, 0x0064f20e, 0x031c0eea, 0x015e87f1, 0x03cbdb92, 0x006323fb, 0x00176ac7}}, Y: Field{[10]uint32{0x02695d93, 0x00d2a194, 0x023059c1, 0x0305acc3, 0x03e7f01a, 0x039a2ffe, 0x02db4153, 0x0182f6b9, 0x0200cf44, 0x0007f430}}}, + {X: Field{[10]uint32{0x028acaf2, 0x01f0625a, 0x03bb2dd6, 0x03639c0b, 0x035cea0b, 0x030ce73a, 0x0228dbb0, 0x01f111ef, 0x0157d735, 0x000b7c73}}, Y: Field{[10]uint32{0x02f1b9e8, 0x03d096b8, 0x01741492, 0x019e6577, 0x0186eefa, 0x0136ddbd, 0x039c0319, 0x0323770e, 0x001120cb, 0x000cc648}}}, + {X: Field{[10]uint32{0x00d9ab8d, 0x01377bd8, 0x02fea058, 0x019054d5, 0x023d9f97, 0x034aeb1d, 0x0100585e, 0x036bc20c, 0x00175a02, 0x000b606b}}, Y: Field{[10]uint32{0x01f9a0b7, 0x02060f0b, 0x011c9cd5, 0x00b33a7d, 0x0021052e, 0x039b09b9, 0x0297fd49, 0x0217d5e0, 0x00d13b17, 0x003e6423}}}, + {X: Field{[10]uint32{0x037dc097, 0x0241c090, 0x00db59ef, 0x03d3c47a, 0x0367b1e7, 0x00d5bac5, 0x000d40a5, 0x00b9cc91, 0x0362fb73, 0x0007eb05}}, Y: Field{[10]uint32{0x039b8729, 0x0176569e, 0x031584df, 0x009c04a7, 0x015ae7ce, 0x01d72cc3, 0x01a08ace, 0x01444cad, 0x004ca58d, 0x003b755e}}}, + {X: Field{[10]uint32{0x00c8c98e, 0x00659e0e, 0x01a9cc2b, 0x03c266c5, 0x0245caba, 0x02aa421b, 0x0093e884, 0x02e42e03, 0x035b4694, 0x00341a82}}, Y: Field{[10]uint32{0x0347def3, 0x00833ec1, 0x02da4986, 0x00517de2, 0x0114fcc8, 0x008bfcec, 0x01b391b2, 0x02c93f34, 0x02ba2777, 0x00132b51}}}, + {X: Field{[10]uint32{0x01e53445, 0x0054ac5f, 0x01d6929b, 0x02e33e6c, 0x01870059, 0x02dbc1a5, 0x007928ac, 0x0103e664, 0x03275902, 0x00124a37}}, Y: Field{[10]uint32{0x0300d505, 0x029d468c, 0x00ac53db, 0x0330a1aa, 0x03240b83, 0x01f70cda, 0x00c400f3, 0x00ec39ec, 0x020b655b, 0x002ddcf9}}}, + {X: Field{[10]uint32{0x03a28390, 0x018e7fe1, 0x01dda1b8, 0x01430cc7, 0x03f945d4, 0x00c8a09f, 0x02992617, 0x0060452e, 0x01f9cd54, 0x002986f3}}, Y: Field{[10]uint32{0x00d93a68, 0x03fa01ee, 0x004eeb40, 0x01c3af99, 0x018e61b3, 0x0007f893, 0x0201b2b3, 0x02eca151, 0x016ed6fd, 0x000f9dc7}}}, + {X: Field{[10]uint32{0x01db93c3, 0x0106c544, 0x0093f9f6, 0x013041fc, 0x030fb8e3, 0x00029e5d, 0x031228c0, 0x02deaece, 0x01b93e2f, 0x0014d68d}}, Y: Field{[10]uint32{0x02ff786f, 0x027fb26c, 0x02e96f0c, 0x02d7a354, 0x0292475f, 0x01f0b8f0, 0x0283fba2, 0x033230e0, 0x03355657, 0x00091c7f}}}, + {X: Field{[10]uint32{0x0065d4d0, 0x01e42d31, 0x00acfa5f, 0x00ab442e, 0x00f23ad4, 0x01af9c2c, 0x02888bbc, 0x003ca4dd, 0x012ce014, 0x0039a299}}, Y: Field{[10]uint32{0x001a7385, 0x03e7074f, 0x0094c06c, 0x01f82e03, 0x00ea6e0c, 0x02b54848, 0x034ecb6d, 0x00182cc4, 0x010cc368, 0x001275ce}}}, + {X: Field{[10]uint32{0x03e25fde, 0x03c3a64d, 0x007576b4, 0x01bc22f1, 0x01f5f05f, 0x03a883a6, 0x017855c3, 0x03334fbc, 0x027a74df, 0x003a24e7}}, Y: Field{[10]uint32{0x0261b173, 0x020a7fb5, 0x0388b3e0, 0x015368b0, 0x033773f4, 0x0127930a, 0x00c0fdf4, 0x0156df24, 0x033eff0a, 0x001ad229}}}, + {X: Field{[10]uint32{0x00751543, 0x0003ebd2, 0x01dafbfd, 0x020d9f0c, 0x007fe164, 0x029b9c2b, 0x00fa2930, 0x0061d200, 0x03ea3145, 0x00125804}}, Y: Field{[10]uint32{0x038c4332, 0x00b8bc6a, 0x03f65614, 0x0022e14d, 0x02581e15, 0x020accc4, 0x00001cb2, 0x0155be29, 0x01118790, 0x002d5c54}}}, + {X: Field{[10]uint32{0x004b1e1f, 0x0370f060, 0x0120189d, 0x00a79f31, 0x01bb0f6c, 0x00981342, 0x0157a072, 0x030ea55a, 0x01b0b1ef, 0x001111cd}}, Y: Field{[10]uint32{0x0259d6e4, 0x02f9001f, 0x0321f9ae, 0x027cca96, 0x023e9a43, 0x00143956, 0x0332a857, 0x02eacea5, 0x00a3461a, 0x002c6b58}}}, + {X: Field{[10]uint32{0x02d9511c, 0x02d0450f, 0x02475da3, 0x02279dea, 0x03e88821, 0x02e72630, 0x01a40e74, 0x01f573e1, 0x02c84acd, 0x00016016}}, Y: Field{[10]uint32{0x023c07c0, 0x0204d35a, 0x02363bb4, 0x00882bab, 0x0301ad00, 0x03635a6d, 0x0170dcf0, 0x014cfdef, 0x023bfbba, 0x003254a4}}}, + {X: Field{[10]uint32{0x039a9501, 0x02ddfbc9, 0x00898dca, 0x02f711b2, 0x02c12619, 0x02da4080, 0x01c53a12, 0x031e1578, 0x011830fd, 0x0022b045}}, Y: Field{[10]uint32{0x01ca4fa4, 0x035af52a, 0x0053ad59, 0x02e376cc, 0x00d5deb3, 0x02fec800, 0x0015493a, 0x03e83874, 0x00c77867, 0x000a7edf}}}, + {X: Field{[10]uint32{0x02ab542d, 0x01ed1102, 0x01ec67bd, 0x01bc8bd0, 0x014d7022, 0x031efbfd, 0x03c8a7cc, 0x02632da3, 0x01d3e429, 0x002a91eb}}, Y: Field{[10]uint32{0x003683e9, 0x0079d731, 0x01816f77, 0x013f0656, 0x024f8e8c, 0x03d9d166, 0x034f9e39, 0x036630eb, 0x0081ebef, 0x0033e96b}}}, + {X: Field{[10]uint32{0x0199889a, 0x02236e79, 0x013e419e, 0x026390cf, 0x03d39848, 0x019248ad, 0x0133f753, 0x0053ba48, 0x0127a27a, 0x003cd410}}, Y: Field{[10]uint32{0x001b45df, 0x0337c218, 0x03313c09, 0x008e819a, 0x0256c6d4, 0x01ef2e21, 0x02cdae54, 0x01a2a213, 0x037e9f98, 0x003c6be7}}}, + {X: Field{[10]uint32{0x024bf08d, 0x03bbbb5f, 0x0398c7c6, 0x03964986, 0x02272d3c, 0x026a6269, 0x00870766, 0x039a20d6, 0x0344edcb, 0x000cdcc3}}, Y: Field{[10]uint32{0x01775a6b, 0x0172f9b8, 0x02794860, 0x01fb31c2, 0x01b6fd05, 0x02f4b5e2, 0x02a32d81, 0x005b412c, 0x0128d877, 0x000fe0ce}}}, + {X: Field{[10]uint32{0x02dfb0d6, 0x02d2850f, 0x034786e5, 0x01fef84d, 0x00a33d41, 0x02492730, 0x00bdf072, 0x03d61220, 0x02dc8c06, 0x000c5a75}}, Y: Field{[10]uint32{0x0274ce5f, 0x018fa1aa, 0x037fcea1, 0x0030bf79, 0x00a31160, 0x023d0a32, 0x0382f596, 0x00e0e6e9, 0x022dec56, 0x000aa450}}}, + {X: Field{[10]uint32{0x002a4429, 0x03f331bc, 0x038e980c, 0x0114355f, 0x03c8c43a, 0x02a370fa, 0x007a64d5, 0x02ba073c, 0x0182013a, 0x00363191}}, Y: Field{[10]uint32{0x03822aea, 0x012312a4, 0x02a7be7f, 0x011e1278, 0x02c4773d, 0x027fb8ec, 0x012f195c, 0x018eba32, 0x00519688, 0x003121cc}}}, + {X: Field{[10]uint32{0x002b6f11, 0x007da7d0, 0x03fe1789, 0x03605368, 0x007e59c8, 0x018c6e21, 0x03cb0395, 0x0091bde9, 0x001f307e, 0x002b99c4}}, Y: Field{[10]uint32{0x01ed44cb, 0x007871c4, 0x022aee41, 0x03e5f608, 0x031d3900, 0x027e68d5, 0x02767afa, 0x0027a2e5, 0x03b4a90b, 0x003d7cb6}}}, + {X: Field{[10]uint32{0x01dbd8ee, 0x035fc520, 0x00f0c1a9, 0x010e095d, 0x02b4e2ff, 0x02068b17, 0x00a7dc9c, 0x020ce070, 0x023183ba, 0x002a7a1c}}, Y: Field{[10]uint32{0x02468901, 0x03775be5, 0x023354b7, 0x02b0f5ce, 0x03333153, 0x039a0d13, 0x01fb59be, 0x0038cf5a, 0x019990d9, 0x0025a041}}}, + {X: Field{[10]uint32{0x003376f2, 0x01078d39, 0x0048dad1, 0x01e7ed6f, 0x00694ef8, 0x00cf9a12, 0x014f43aa, 0x03502c9a, 0x021c0ae7, 0x00185afc}}, Y: Field{[10]uint32{0x0080fc77, 0x01772526, 0x02799bf0, 0x016a8f67, 0x024a2772, 0x02d693ea, 0x02451153, 0x0282ea0c, 0x03832aa8, 0x002fb063}}}, + {X: Field{[10]uint32{0x033f5c2d, 0x0144262b, 0x0295f8d3, 0x033dc069, 0x0339be47, 0x03a6f96e, 0x02882b11, 0x00cf51e2, 0x0335601f, 0x000487a0}}, Y: Field{[10]uint32{0x0103b3e8, 0x00a8a613, 0x03659f68, 0x01c11216, 0x03010dd0, 0x02ffe077, 0x005fdfdc, 0x02812df6, 0x013318fa, 0x000ba64a}}}, + {X: Field{[10]uint32{0x009f1141, 0x02325eee, 0x0193325c, 0x00a12a42, 0x003a83cc, 0x03bc6f12, 0x0013948f, 0x032a7025, 0x03973025, 0x002fe211}}, Y: Field{[10]uint32{0x02ad5386, 0x01c4fd9b, 0x0363f0e2, 0x0181aaee, 0x016de247, 0x020e3449, 0x015ae3a7, 0x03475e1b, 0x03263d26, 0x000654e8}}}, + {X: Field{[10]uint32{0x02f811f0, 0x0180295a, 0x02124e86, 0x0383ebb6, 0x00dd1b06, 0x0371d734, 0x0094d4bd, 0x0003e617, 0x01a65a38, 0x001f0a3a}}, Y: Field{[10]uint32{0x02b5c277, 0x005218e2, 0x03863134, 0x035bcb90, 0x002d396f, 0x001d09ed, 0x014cedb7, 0x027c0e24, 0x01b70e33, 0x0028dd5b}}}, + {X: Field{[10]uint32{0x00a66077, 0x024c5ca4, 0x02b9cb8b, 0x0244c6f0, 0x0346be07, 0x02e48e1e, 0x00b5bf6b, 0x00b3d073, 0x01ad45e6, 0x00397b1b}}, Y: Field{[10]uint32{0x004f0e19, 0x00ceaeb9, 0x00eda67c, 0x0249e884, 0x012bacd0, 0x038f1348, 0x014bea4b, 0x000f2be1, 0x02cc7757, 0x00340117}}}, + {X: Field{[10]uint32{0x018c2fed, 0x00d85a44, 0x02043583, 0x00f8d363, 0x00703626, 0x0112965d, 0x031c3525, 0x025517ec, 0x021f9203, 0x001bf25b}}, Y: Field{[10]uint32{0x038a9a51, 0x02eaeb62, 0x0089d9aa, 0x00376434, 0x026ca7c2, 0x010e5f8d, 0x030457f8, 0x037a365a, 0x02871571, 0x00340cb7}}}, + {X: Field{[10]uint32{0x006e4133, 0x0244569d, 0x0149acf4, 0x03738684, 0x021db684, 0x01f04c51, 0x02790914, 0x02711d0b, 0x03511c21, 0x002278f4}}, Y: Field{[10]uint32{0x030c5c90, 0x00be4618, 0x00b03689, 0x02eeec89, 0x0352fde5, 0x000f55fa, 0x00b53d23, 0x0211a361, 0x030b672e, 0x002aaf65}}}, + {X: Field{[10]uint32{0x010d5890, 0x0238628e, 0x01de84ff, 0x011c3fa8, 0x00c043e9, 0x02b6e36a, 0x00eb44ea, 0x01914e1e, 0x00f0b213, 0x000ade98}}, Y: Field{[10]uint32{0x004a5244, 0x02eeadf4, 0x02f41ae8, 0x01b46409, 0x01b80668, 0x02ce2cd9, 0x03407091, 0x00ca8164, 0x03161ba0, 0x000320a6}}}, + {X: Field{[10]uint32{0x009627e7, 0x01c8141b, 0x029d42f8, 0x01e6498e, 0x01bfeb98, 0x021e0bc9, 0x037c3dfa, 0x02badf9b, 0x031ac2c2, 0x001192e7}}, Y: Field{[10]uint32{0x02f7502c, 0x016d6d6d, 0x028aadac, 0x001db2d3, 0x029a23a1, 0x0140e1d7, 0x03761dbe, 0x02f30b7d, 0x03f459e1, 0x001f0982}}}, + {X: Field{[10]uint32{0x019b616f, 0x02d8e89d, 0x035ab268, 0x006a61ba, 0x000b2514, 0x01dd2d9c, 0x0331519e, 0x008a5438, 0x02304357, 0x001e494f}}, Y: Field{[10]uint32{0x027f88e1, 0x000d61b8, 0x03f69100, 0x0363c95d, 0x02ed6467, 0x01a59972, 0x00f5bae9, 0x008d4ec8, 0x017a55b6, 0x00369827}}}, + {X: Field{[10]uint32{0x01399556, 0x010b45b7, 0x02773876, 0x00250d65, 0x01019acb, 0x0154643e, 0x02b1967f, 0x03032d70, 0x007ce900, 0x00018d0a}}, Y: Field{[10]uint32{0x03debead, 0x02d186b0, 0x037581fc, 0x00f8c4af, 0x00223c47, 0x014ccd2b, 0x00042db2, 0x005804c3, 0x01098cf0, 0x00288d42}}}, + {X: Field{[10]uint32{0x021bee98, 0x01fc60d0, 0x00223358, 0x012e4588, 0x02d7ef2f, 0x01a9d6d0, 0x0018557f, 0x03f56e8d, 0x01c38bd8, 0x001d8448}}, Y: Field{[10]uint32{0x02dd530f, 0x025ef6d4, 0x010405c8, 0x00d2bebb, 0x0276070e, 0x02eca489, 0x026eeb01, 0x01d0d443, 0x015ff9c1, 0x0010051c}}}, + {X: Field{[10]uint32{0x01453413, 0x0375819b, 0x034b3e63, 0x03870bc1, 0x0077990f, 0x039428ac, 0x01a30784, 0x037c6967, 0x00c1bfbb, 0x00098632}}, Y: Field{[10]uint32{0x02a48da0, 0x01a7774c, 0x01ab0581, 0x016cc9bf, 0x024bdaf3, 0x03a8f2d1, 0x00e584b4, 0x02daac63, 0x023720f5, 0x002b94e6}}}, + {X: Field{[10]uint32{0x00f685be, 0x007c76e4, 0x0020dab3, 0x02d70266, 0x00d91699, 0x0124c22d, 0x03a57e19, 0x03c097f1, 0x00cc10c6, 0x00350a7f}}, Y: Field{[10]uint32{0x02648edf, 0x026f5396, 0x00964068, 0x00f5bedb, 0x00a8df04, 0x02f945a2, 0x0014ae91, 0x01646379, 0x01c1ee15, 0x00368ac5}}}, + {X: Field{[10]uint32{0x00e8b705, 0x036a3639, 0x00b6d56d, 0x03d8d994, 0x01bf1e0c, 0x028b6bbd, 0x0207625b, 0x0232acdb, 0x03c7c04b, 0x001a8638}}, Y: Field{[10]uint32{0x00e94eec, 0x005762f0, 0x0049ed62, 0x010097f3, 0x0120e754, 0x03149507, 0x039c9dab, 0x025b6faf, 0x0330f56c, 0x00198a44}}}, + {X: Field{[10]uint32{0x00f97756, 0x01e848be, 0x032201a3, 0x03fe906c, 0x01d7ca3e, 0x01a88719, 0x002fa4ad, 0x03cff952, 0x0046d1c9, 0x002616da}}, Y: Field{[10]uint32{0x02a3a92e, 0x03d5102a, 0x01592d56, 0x030234e4, 0x03bb9dc6, 0x03150fe2, 0x022f2c32, 0x023dadda, 0x03dd98e1, 0x000f8ac8}}}, + {X: Field{[10]uint32{0x026e8c64, 0x024a5b27, 0x03f3355c, 0x038e5953, 0x0296fba8, 0x031ef328, 0x02ee3395, 0x00e2918f, 0x01db4ba8, 0x00252283}}, Y: Field{[10]uint32{0x00f5c1d8, 0x010c970f, 0x00d2e12c, 0x03b4bde5, 0x01c7b705, 0x03949f58, 0x03b69b52, 0x0360fad9, 0x0025da19, 0x00316cd3}}}, + {X: Field{[10]uint32{0x00a3de2e, 0x02a903ea, 0x028c4256, 0x0331a521, 0x020a437f, 0x020985ec, 0x0246b47e, 0x02c0fede, 0x002c1332, 0x0010ccb4}}, Y: Field{[10]uint32{0x02aa5289, 0x02f83762, 0x01de1e1b, 0x02adcdd9, 0x00393985, 0x025045e0, 0x00327c03, 0x015576a5, 0x016f5f9c, 0x0039b946}}}, + {X: Field{[10]uint32{0x022a5aa3, 0x0330fedc, 0x01d96a67, 0x0315ac84, 0x02f7e12d, 0x0235a7d6, 0x0150b68a, 0x032257cc, 0x03b92ac1, 0x0017725d}}, Y: Field{[10]uint32{0x0107844d, 0x0342e567, 0x0217d10f, 0x00d0d040, 0x0283260c, 0x0331a5b4, 0x03d29123, 0x03b27872, 0x00a74bf1, 0x00116223}}}, + {X: Field{[10]uint32{0x03d15764, 0x006a078f, 0x022b0c6e, 0x035f418e, 0x00605e3b, 0x00000e49, 0x030cb6df, 0x03c492a6, 0x0134ca94, 0x0016e73d}}, Y: Field{[10]uint32{0x00897458, 0x006f2f00, 0x03d1d0d8, 0x01233a22, 0x03f9ba4b, 0x0282cb59, 0x0248790f, 0x01bffaf6, 0x01c3b051, 0x00113a63}}}, + {X: Field{[10]uint32{0x01372f59, 0x035ffdb5, 0x00a6697f, 0x02c25d1b, 0x02e2feb4, 0x022578b7, 0x026baf9c, 0x01c531f4, 0x00073a63, 0x00210d4c}}, Y: Field{[10]uint32{0x00c7a175, 0x00fcda2c, 0x022d23ca, 0x01f209b1, 0x023f9fea, 0x03cbcd14, 0x037361c0, 0x02751132, 0x029e3768, 0x0035cdce}}}, + {X: Field{[10]uint32{0x021e6a61, 0x000c3eb0, 0x02619804, 0x037fe1d1, 0x008f1a28, 0x00e09b9e, 0x008485fc, 0x026d7227, 0x000e3eef, 0x00273c00}}, Y: Field{[10]uint32{0x0291543c, 0x0184bdff, 0x020a1ac2, 0x01daaa47, 0x002764cd, 0x00801708, 0x021fcb9d, 0x012cb653, 0x033ad868, 0x000acf6a}}}, + {X: Field{[10]uint32{0x00e1235c, 0x01c68913, 0x035e9996, 0x014e0ebf, 0x038ee028, 0x012469d5, 0x0088b25b, 0x00623882, 0x03dc5897, 0x002eca4b}}, Y: Field{[10]uint32{0x012507e5, 0x00bd6690, 0x023a09e0, 0x03dc9f86, 0x00d5e9b8, 0x01624cd2, 0x03839909, 0x01e18ef2, 0x01c350ba, 0x0034edb6}}}, + {X: Field{[10]uint32{0x03b7d680, 0x01c32403, 0x01ced2d7, 0x01afc9f1, 0x03efd2bc, 0x008e6d88, 0x008a21a9, 0x03b55daa, 0x01d89835, 0x002575b4}}, Y: Field{[10]uint32{0x00baf048, 0x02ff819b, 0x02468e40, 0x00e31cb3, 0x02b39e7d, 0x03cf39a4, 0x034ac720, 0x01973bea, 0x01ad39db, 0x0032454d}}}, + {X: Field{[10]uint32{0x01d09a46, 0x01428ea1, 0x00fd89ee, 0x021f7cb2, 0x0115ea37, 0x00328325, 0x02c3fb90, 0x03b08270, 0x020fa164, 0x0032f8fc}}, Y: Field{[10]uint32{0x02fb9a28, 0x00bbfe42, 0x00e8b825, 0x01469962, 0x01734a22, 0x0061b9bb, 0x02222804, 0x00596d23, 0x0354faea, 0x00335625}}}, + {X: Field{[10]uint32{0x039f604a, 0x0278a4ec, 0x020949f3, 0x03d121f5, 0x01002942, 0x0299e0d7, 0x031c215b, 0x02788166, 0x02b99bab, 0x000f8076}}, Y: Field{[10]uint32{0x0123d481, 0x0172d7a1, 0x022670bd, 0x03e7a2da, 0x00d0a556, 0x019e7cfa, 0x03509798, 0x014113b8, 0x00323336, 0x002d0777}}}, + {X: Field{[10]uint32{0x02afef7a, 0x004e991d, 0x03350972, 0x0238578f, 0x01c79891, 0x012d8cc7, 0x031cfd2e, 0x03725857, 0x00c05543, 0x000a625d}}, Y: Field{[10]uint32{0x0299da2f, 0x0360181e, 0x0257de5c, 0x028d8b2d, 0x0222354e, 0x011fd82c, 0x00e02e87, 0x0362fa9d, 0x035555f2, 0x001a0060}}}, + {X: Field{[10]uint32{0x011fdc61, 0x019e4fd4, 0x003dfd93, 0x0322824f, 0x022aabde, 0x0107453d, 0x03764b46, 0x00f25ba8, 0x034d5476, 0x00075c19}}, Y: Field{[10]uint32{0x00dfe632, 0x03ad2f8e, 0x0010e8a4, 0x000588f7, 0x02807741, 0x025d4fd0, 0x024378e5, 0x0112f18c, 0x01ac697e, 0x00259d2b}}}, + {X: Field{[10]uint32{0x000fece1, 0x02c713c1, 0x00fbacc0, 0x02be46ae, 0x0073c47a, 0x023e2d8d, 0x021875ec, 0x02e5c189, 0x0107b43a, 0x001d4880}}, Y: Field{[10]uint32{0x03aeaffb, 0x01580ba8, 0x00b7b088, 0x035670d4, 0x0041bc9a, 0x02d5bbee, 0x02ebf2bf, 0x001f404a, 0x027cc3bf, 0x000a4253}}}, + {X: Field{[10]uint32{0x03779720, 0x039e4883, 0x03df92e7, 0x0232743b, 0x03fc7f4c, 0x002eb20e, 0x01b31aab, 0x013b0c9f, 0x01ffb347, 0x0033eb6e}}, Y: Field{[10]uint32{0x019a09b2, 0x002e64c3, 0x00b06ab0, 0x001b34ae, 0x0297d418, 0x02a67ea0, 0x0322ee02, 0x023315e3, 0x017f6f7b, 0x003fedd9}}}, + {X: Field{[10]uint32{0x01cb828f, 0x03a2daf0, 0x026f464c, 0x03d35ee0, 0x0334a7b4, 0x027612a9, 0x02e46e13, 0x01580eb7, 0x019dbe3c, 0x00093ba4}}, Y: Field{[10]uint32{0x03ff1506, 0x0297a985, 0x03e29364, 0x01dbb55f, 0x01ca6514, 0x00e6e3c4, 0x020b63c5, 0x0151ee4d, 0x0356794b, 0x001100e5}}}, + {X: Field{[10]uint32{0x00b100f4, 0x00c3bfdf, 0x011dd1b5, 0x014ff90e, 0x00c50ddb, 0x02972fbb, 0x016b8f10, 0x01495bd3, 0x02462f75, 0x00166578}}, Y: Field{[10]uint32{0x001dc64a, 0x005875b6, 0x0018ce08, 0x01ac4f74, 0x03fe78ac, 0x010049ff, 0x02d7ba20, 0x01459711, 0x027c7da0, 0x001df776}}}, + {X: Field{[10]uint32{0x034d54dd, 0x035470c8, 0x019c29db, 0x00dc073c, 0x00364f8c, 0x02464f02, 0x029fa205, 0x011e3384, 0x007197dd, 0x0029c8cd}}, Y: Field{[10]uint32{0x01796e68, 0x00bbbc4c, 0x019ad92f, 0x00446874, 0x009cfdd7, 0x006a5999, 0x00a5fa00, 0x00b32ce1, 0x015eec2b, 0x000b139a}}}, + {X: Field{[10]uint32{0x032251a5, 0x015b3404, 0x01c234ed, 0x0358eb50, 0x01a57cfe, 0x037a7f32, 0x0275fcc5, 0x00872f5f, 0x0369d5bc, 0x001919aa}}, Y: Field{[10]uint32{0x01294dc9, 0x0037e909, 0x005d2099, 0x033f12bc, 0x022e0c1e, 0x03da2536, 0x0222f5e5, 0x005b89d9, 0x03896dbb, 0x001db9fb}}}, + {X: Field{[10]uint32{0x01c28e60, 0x02b3683d, 0x014f11e0, 0x02d478cf, 0x017fab8b, 0x03c85851, 0x02fca2ab, 0x0222af79, 0x0390a293, 0x00297b33}}, Y: Field{[10]uint32{0x020e3ac3, 0x0016c998, 0x023f7948, 0x038b2044, 0x03110e74, 0x019a42b7, 0x02886435, 0x0047cdcf, 0x0116468a, 0x002bf5d6}}}, + {X: Field{[10]uint32{0x029c2779, 0x03561c7b, 0x01cdf89e, 0x01813472, 0x006a15d0, 0x00fb6796, 0x02e52a1e, 0x01e367c9, 0x02c74936, 0x0010946e}}, Y: Field{[10]uint32{0x02987aa5, 0x016b62dc, 0x0138d3a1, 0x032437fe, 0x004bb023, 0x01980ef3, 0x0190c60e, 0x01c5b5da, 0x027d92e6, 0x003e877c}}}, + {X: Field{[10]uint32{0x027db30e, 0x00b0a93e, 0x01903f04, 0x03409aa0, 0x030f40c9, 0x006078a0, 0x00f6b973, 0x03308763, 0x02a204c3, 0x001dea79}}, Y: Field{[10]uint32{0x00155aa0, 0x00f79746, 0x03180b6e, 0x0041cacb, 0x03e78d93, 0x02a84333, 0x01b757fa, 0x017336f7, 0x03ef23f2, 0x00287bd3}}}, + {X: Field{[10]uint32{0x03dbea6b, 0x007fdf9b, 0x0239de75, 0x003a667d, 0x02e9c0d2, 0x015dfe8a, 0x02de73c4, 0x01386f5a, 0x0161c40d, 0x000cff9e}}, Y: Field{[10]uint32{0x01f54849, 0x0102e335, 0x03037058, 0x0251c8ca, 0x039a5919, 0x01930c33, 0x016e7c14, 0x00c1b38c, 0x01cd4eeb, 0x00246df5}}}, + {X: Field{[10]uint32{0x01179564, 0x02085c3e, 0x003115b6, 0x00054927, 0x03395357, 0x01216f8b, 0x00a9d8cb, 0x00884692, 0x032e5ee5, 0x0010fd9a}}, Y: Field{[10]uint32{0x01a46a45, 0x03de1d0b, 0x028921db, 0x0265ca39, 0x003555e6, 0x018fd7e2, 0x030cf7fe, 0x03aefc30, 0x015ffec0, 0x0014dc2d}}}, + {X: Field{[10]uint32{0x00b19bfc, 0x0116db0e, 0x0170e1a7, 0x010dcfd6, 0x03ad2f0b, 0x011baa1e, 0x00c7f6b4, 0x0041d35d, 0x021497ef, 0x0012b4d9}}, Y: Field{[10]uint32{0x035cfd39, 0x0133583b, 0x03cfc0cd, 0x0208ca7a, 0x036f9eea, 0x00dbe143, 0x02da00d4, 0x016ff57a, 0x01aa769a, 0x0023d770}}}, + {X: Field{[10]uint32{0x0012754d, 0x035654f0, 0x012f9155, 0x019a6cbc, 0x02593368, 0x016de5ea, 0x0334dc97, 0x013553cd, 0x02ef9520, 0x0025e66a}}, Y: Field{[10]uint32{0x003e6353, 0x016a1d7a, 0x02f3a984, 0x03b3a88d, 0x0044c256, 0x03124b55, 0x025b476b, 0x0385cd0e, 0x00a3d31f, 0x0012dacd}}}, + {X: Field{[10]uint32{0x01d828a1, 0x03275045, 0x00dca0fb, 0x0145be6a, 0x03c1c22f, 0x0038d759, 0x003f2525, 0x018d70b4, 0x01f0c6e4, 0x00321892}}, Y: Field{[10]uint32{0x0295ec73, 0x026519fb, 0x0102586d, 0x024d1a7c, 0x02465238, 0x012f1dac, 0x01260b39, 0x013437d3, 0x030b37dc, 0x0003885d}}}, + {X: Field{[10]uint32{0x0256038d, 0x03370b99, 0x0308e3ac, 0x039824be, 0x0061a08f, 0x033f5018, 0x0282c840, 0x021fbf1c, 0x00c5de56, 0x002d237f}}, Y: Field{[10]uint32{0x00e8927c, 0x02db467f, 0x01566277, 0x0254deb4, 0x01c0b52a, 0x01c51d99, 0x0369c7bc, 0x01c1d1c7, 0x021fec73, 0x00021f8f}}}, + {X: Field{[10]uint32{0x02357fca, 0x000ff353, 0x02da8585, 0x0134d9cc, 0x030146fa, 0x034e0da8, 0x025c828f, 0x0154d718, 0x036c62d6, 0x001df73a}}, Y: Field{[10]uint32{0x00228bd4, 0x00747a86, 0x0367e909, 0x02321fee, 0x024304d0, 0x034dc3b4, 0x01b85213, 0x025c4d49, 0x02005a13, 0x003642c9}}}, + {X: Field{[10]uint32{0x0175e49a, 0x0191d40c, 0x01c17473, 0x00f8ccbd, 0x0069cfb4, 0x0331c2b2, 0x031cd633, 0x00061137, 0x00bf4cda, 0x0016d623}}, Y: Field{[10]uint32{0x02d55cda, 0x022432be, 0x017c0d47, 0x01e11d1a, 0x01a52e19, 0x03e57f39, 0x02b823b2, 0x02792a13, 0x031df9e6, 0x0005093b}}}, + {X: Field{[10]uint32{0x0320b20c, 0x001da164, 0x003b7da1, 0x02944711, 0x032c50ce, 0x03277764, 0x00702518, 0x01082023, 0x03ba8393, 0x003021ee}}, Y: Field{[10]uint32{0x0209d996, 0x00881ee4, 0x02b5f6ec, 0x00f1faf0, 0x00f637c2, 0x032f92cc, 0x030e3455, 0x0157cec0, 0x02697175, 0x001dfc9a}}}, + {X: Field{[10]uint32{0x0031ed94, 0x011d304c, 0x02a3835e, 0x0183c45f, 0x00247d7d, 0x030b1563, 0x00b3e7cf, 0x0020bc82, 0x017b68f8, 0x00234581}}, Y: Field{[10]uint32{0x02ba3eca, 0x01442475, 0x0314fed5, 0x029fbb1a, 0x016ffb8c, 0x02710e78, 0x00f6e0d1, 0x0344f440, 0x01b662ff, 0x000f4c17}}}, + {X: Field{[10]uint32{0x01c184b7, 0x03f7307b, 0x019d9242, 0x02597878, 0x03d17daa, 0x03dcdc7f, 0x03b8cd2a, 0x00af21b6, 0x00a603d3, 0x001d7fb8}}, Y: Field{[10]uint32{0x03efa2f8, 0x03f71924, 0x0040910b, 0x027a6810, 0x01061ee8, 0x020245e5, 0x03c992ff, 0x0025d7f9, 0x00ffabc3, 0x0030ac79}}}, + {X: Field{[10]uint32{0x03368abb, 0x0170789b, 0x007a110d, 0x01d51839, 0x02dda7fb, 0x02a1dc42, 0x00925990, 0x0024f5f4, 0x0159b147, 0x0019768e}}, Y: Field{[10]uint32{0x01862844, 0x01171708, 0x03ce95e3, 0x00a32eb8, 0x00a6f530, 0x0268c08c, 0x032b463d, 0x0307870f, 0x01f52f92, 0x000d6678}}}, + {X: Field{[10]uint32{0x027933d3, 0x0102dbe5, 0x03f4df81, 0x016fd101, 0x005dda1a, 0x01d4e61c, 0x02b787ca, 0x0084975d, 0x00109463, 0x0019587f}}, Y: Field{[10]uint32{0x020e6337, 0x02a6d564, 0x01ad629f, 0x00ddb4e8, 0x02cd083f, 0x02dba200, 0x02e8aeca, 0x00a0a0fa, 0x03cea88e, 0x001301b1}}}, + {X: Field{[10]uint32{0x00c4410e, 0x0179e920, 0x016a35ca, 0x00c19993, 0x03c8a3fc, 0x02748cd0, 0x03041a6a, 0x00dc0548, 0x03807049, 0x0032694f}}, Y: Field{[10]uint32{0x036e4bf9, 0x01128882, 0x02d42183, 0x02b7c8d9, 0x02369d4d, 0x038ec9cd, 0x02f0dd06, 0x003517af, 0x00a9b2e3, 0x0026bd1c}}}, + {X: Field{[10]uint32{0x03b89158, 0x00d165cc, 0x03bf03c7, 0x00517d5d, 0x00c203f8, 0x02e68550, 0x009f45a1, 0x015b76c0, 0x01f3443e, 0x00170549}}, Y: Field{[10]uint32{0x034f4f18, 0x00d24efa, 0x03c02f5b, 0x03eb2e67, 0x0358574a, 0x01895c1e, 0x00f4c803, 0x03646b5d, 0x02f7cb3e, 0x00259e24}}}, + {X: Field{[10]uint32{0x001648ed, 0x024e72d5, 0x01454d69, 0x02a5d7d8, 0x0269bb6e, 0x01cbfb83, 0x00add6d4, 0x005c75c5, 0x00dad87c, 0x000d5973}}, Y: Field{[10]uint32{0x0062aef8, 0x01a8b64d, 0x014edd48, 0x029daa35, 0x034f02d3, 0x00022c65, 0x03d09bbd, 0x018d6176, 0x03bfec2b, 0x0027df61}}}, + {X: Field{[10]uint32{0x010e3614, 0x03799847, 0x01edabd8, 0x03744e2d, 0x004527d3, 0x00a85297, 0x00f29df4, 0x0386a2bf, 0x0334c0f5, 0x001000fb}}, Y: Field{[10]uint32{0x003048c4, 0x0131a093, 0x00e2cd3c, 0x003cd85d, 0x033d3ead, 0x0160e70b, 0x03d0a763, 0x0133bf30, 0x01524489, 0x0019c80c}}}, + {X: Field{[10]uint32{0x012ea57f, 0x01574764, 0x013931cf, 0x0088024a, 0x02138864, 0x02d25689, 0x03b7de39, 0x0141e4fa, 0x035b3796, 0x003d7137}}, Y: Field{[10]uint32{0x01eb3482, 0x0011f80c, 0x02968f30, 0x0295f4c6, 0x03aca34d, 0x028d8434, 0x03672c74, 0x02331168, 0x003e12a9, 0x002c2e4f}}}, + {X: Field{[10]uint32{0x029e213a, 0x0259e4d5, 0x010b397a, 0x0239a73b, 0x01cbe869, 0x019600a2, 0x023533e5, 0x021b36e9, 0x0280e211, 0x0002f27d}}, Y: Field{[10]uint32{0x032e06a3, 0x004fea6c, 0x01d72007, 0x03d6e478, 0x017bf54e, 0x01f48137, 0x03b94ff8, 0x01463543, 0x03788105, 0x001ab7fe}}}, + {X: Field{[10]uint32{0x01a16516, 0x02674ab2, 0x006b055f, 0x011d39c1, 0x01549e83, 0x028f8988, 0x03e15d37, 0x02204514, 0x0397f1fe, 0x001373a1}}, Y: Field{[10]uint32{0x03e668ea, 0x0381d52a, 0x01d4337c, 0x02a1d26a, 0x02fc8a8a, 0x035c35ec, 0x00fd9f37, 0x02096a57, 0x0377cca7, 0x003a979a}}}, + {X: Field{[10]uint32{0x0359b16b, 0x01a74fa5, 0x01eee818, 0x02149944, 0x02af2a4f, 0x000024e0, 0x032a0c04, 0x0255c2f5, 0x02ba1ef2, 0x003d26d6}}, Y: Field{[10]uint32{0x017c7f7d, 0x02391675, 0x01202865, 0x010ed060, 0x021d2fb3, 0x0182af19, 0x02125d0f, 0x03a349a5, 0x0020b996, 0x000b925b}}}, + {X: Field{[10]uint32{0x012125ec, 0x006fb902, 0x03fa054a, 0x001df5f5, 0x00a2d02f, 0x00afca52, 0x00ff7657, 0x038749ed, 0x014a7573, 0x0009a45f}}, Y: Field{[10]uint32{0x03cd8f97, 0x0173a0c1, 0x006780ad, 0x00c02986, 0x017eb125, 0x03e32232, 0x02fd2d5c, 0x019a80a9, 0x037eae9b, 0x002e391f}}}, + {X: Field{[10]uint32{0x0329d290, 0x03eab53e, 0x03cb1cd7, 0x01bb3e2e, 0x007ead77, 0x0084f9b6, 0x00b71daf, 0x00bf9263, 0x00d6285a, 0x0006d252}}, Y: Field{[10]uint32{0x00d3bfd8, 0x00306d09, 0x0227bdd3, 0x0266cbd7, 0x00d56984, 0x00b4a186, 0x0336c7a9, 0x0364966d, 0x001fef87, 0x0006ad02}}}, + {X: Field{[10]uint32{0x01ae64ca, 0x022f55e6, 0x036c7725, 0x03d29a58, 0x00f8b20f, 0x02a6594f, 0x019676fe, 0x02ebde77, 0x02ec8179, 0x000535c4}}, Y: Field{[10]uint32{0x000c6ef0, 0x01b8138e, 0x03ad6d36, 0x00e14eeb, 0x0006f385, 0x01cb38fc, 0x030df37d, 0x0143b0ca, 0x00a64246, 0x000b876e}}}, + {X: Field{[10]uint32{0x01952453, 0x01a53dc7, 0x038134d9, 0x02222d6f, 0x03a11119, 0x01111644, 0x01967e15, 0x01da1278, 0x02204174, 0x0001d9d4}}, Y: Field{[10]uint32{0x0182fd31, 0x01da10fb, 0x01c27377, 0x00f58253, 0x00de1a5c, 0x029c8b79, 0x0155a906, 0x02d80ce8, 0x00636457, 0x000fc7ec}}}, + {X: Field{[10]uint32{0x0149fc63, 0x012e8d37, 0x00937fc8, 0x01be5ac9, 0x020a53b1, 0x002ec789, 0x0016d028, 0x022d9d00, 0x0134a882, 0x0016b239}}, Y: Field{[10]uint32{0x00a1fc73, 0x03881bae, 0x0187a8e5, 0x021c457a, 0x0018568f, 0x0242739c, 0x005a4296, 0x03edec0b, 0x020f68f5, 0x00064f40}}}, + {X: Field{[10]uint32{0x034a14b8, 0x00880b6a, 0x02c43337, 0x0375ab3d, 0x02d618d0, 0x0064d127, 0x01135b60, 0x0158a94c, 0x02b28d16, 0x0021f377}}, Y: Field{[10]uint32{0x03846e2e, 0x01a32ea7, 0x0084be5b, 0x009404d7, 0x01cd7094, 0x038ba44a, 0x011cecbd, 0x022b6650, 0x00e67c95, 0x00170779}}}, + {X: Field{[10]uint32{0x024c84cb, 0x01de2810, 0x02d52f8c, 0x01fbac35, 0x004d4f8b, 0x03ea198c, 0x021dfe7a, 0x03427d23, 0x0225a39e, 0x00310c72}}, Y: Field{[10]uint32{0x0100d825, 0x02b8299c, 0x034292ae, 0x035b8d7f, 0x00489ede, 0x00c4a4cc, 0x00f2d11d, 0x02f9b4d7, 0x03d65b2d, 0x00114181}}}, + {X: Field{[10]uint32{0x00a3dd5a, 0x03cda0e2, 0x02c1d9bf, 0x000970bc, 0x03aaa930, 0x003b7128, 0x03af3d44, 0x0068452f, 0x01e8985c, 0x00231408}}, Y: Field{[10]uint32{0x012fb108, 0x02d82aa8, 0x01db13c2, 0x02bb50c5, 0x02b6d31f, 0x0025bf52, 0x01d74ba6, 0x0360701c, 0x00aa8077, 0x00132e58}}}, + {X: Field{[10]uint32{0x02513d4f, 0x0275c5db, 0x01bb770b, 0x012c99e0, 0x0306e7a1, 0x005df6ef, 0x017c07a0, 0x01d21630, 0x00bb38a4, 0x000ce395}}, Y: Field{[10]uint32{0x00420548, 0x02033e31, 0x026fb92f, 0x03554bb9, 0x02c44a6a, 0x019dd8ee, 0x02951def, 0x033e9308, 0x024e84ca, 0x001e1dab}}}, + {X: Field{[10]uint32{0x031f3c5a, 0x01bba34b, 0x0061bcb0, 0x0385fbfd, 0x013c7b0f, 0x03349a2b, 0x03683abc, 0x00e88645, 0x00a9efbb, 0x0021fcef}}, Y: Field{[10]uint32{0x01229b61, 0x028cfb55, 0x007f8361, 0x03c6845f, 0x00e5cc11, 0x03d7eef2, 0x001f258b, 0x03f15122, 0x02a1eccc, 0x0029e874}}}, + {X: Field{[10]uint32{0x013a3e40, 0x001eeed0, 0x01aad524, 0x037119f2, 0x00de27d6, 0x029a9e36, 0x016a0375, 0x01615a39, 0x03df8ed8, 0x0003d008}}, Y: Field{[10]uint32{0x03e178cc, 0x03e7da87, 0x001615cf, 0x0114f89d, 0x03d5e2c5, 0x03567cdc, 0x0230e566, 0x00e845aa, 0x0142fc4e, 0x002c9264}}}, + {X: Field{[10]uint32{0x006f2d3a, 0x00215927, 0x001a8927, 0x00bcdd38, 0x03453b51, 0x0398ecbe, 0x013d282f, 0x02288a27, 0x03c6d55a, 0x0033ed47}}, Y: Field{[10]uint32{0x0070635d, 0x01ffa724, 0x0125eb56, 0x004872c9, 0x03e4ea53, 0x01879874, 0x02c120e7, 0x0047b4a3, 0x02232838, 0x0023528c}}}, + {X: Field{[10]uint32{0x0243c539, 0x01f3a5ab, 0x00486893, 0x02c45c87, 0x01c45f77, 0x0089258d, 0x03219db2, 0x00051c2f, 0x020b9705, 0x00166912}}, Y: Field{[10]uint32{0x03039afa, 0x0364c781, 0x00efd158, 0x01644ddd, 0x02400ff9, 0x017ae29d, 0x021d0cd5, 0x003cfc77, 0x00a66a91, 0x0000c787}}}, + {X: Field{[10]uint32{0x00a8ee7e, 0x015c3a0a, 0x0386f8ab, 0x01cc67f5, 0x02d8e26d, 0x012ecea3, 0x03446281, 0x01e8ddaa, 0x0256ec27, 0x002e673b}}, Y: Field{[10]uint32{0x023494ad, 0x02c44d70, 0x0223062a, 0x00c74773, 0x00b6be5d, 0x01360305, 0x013b16ab, 0x017535c9, 0x0398dda0, 0x0011b83c}}}, + {X: Field{[10]uint32{0x01172bd2, 0x001eb403, 0x03cb0252, 0x00ad4a51, 0x001c6b92, 0x0369d6ce, 0x00398725, 0x006889b4, 0x036ad96b, 0x0028e784}}, Y: Field{[10]uint32{0x02abb532, 0x00286e6d, 0x023a2d91, 0x01de2bc6, 0x007dbfc9, 0x0258e7ea, 0x010fa717, 0x038238f4, 0x0358074d, 0x001e9701}}}, + {X: Field{[10]uint32{0x03001976, 0x02365d15, 0x039c45b4, 0x0154d7d1, 0x032c23c8, 0x02dd44ad, 0x02dd59ae, 0x02dd3989, 0x01253b2e, 0x001ba2d0}}, Y: Field{[10]uint32{0x012bc88e, 0x02667a33, 0x02b47873, 0x020bb086, 0x020715bc, 0x032e16a8, 0x0004068a, 0x0301157a, 0x00e1e4e8, 0x003302e2}}}, + {X: Field{[10]uint32{0x01abb019, 0x0111e294, 0x024189c4, 0x01bc7263, 0x03cd1fb6, 0x03bf44d0, 0x03b6ec98, 0x010627df, 0x02f5681e, 0x002650ad}}, Y: Field{[10]uint32{0x010e7a9a, 0x01459e63, 0x02430569, 0x01afb499, 0x02d2fe98, 0x01f26278, 0x0211e6ff, 0x00b54a42, 0x02bbb0cc, 0x00080343}}}, + {X: Field{[10]uint32{0x0078506d, 0x0383df94, 0x01744642, 0x03dcbabf, 0x02759636, 0x0122bcd4, 0x0166918b, 0x02e52510, 0x01ec3c57, 0x001ff738}}, Y: Field{[10]uint32{0x03baabd2, 0x004e8ab5, 0x0146b2e3, 0x01e5974f, 0x0353cfb9, 0x038b4b39, 0x03786ed1, 0x01db8dce, 0x02efc19a, 0x0035de16}}}, + {X: Field{[10]uint32{0x03989c57, 0x035381a4, 0x01b04a70, 0x01362065, 0x035f5165, 0x01df1e6a, 0x030906bd, 0x020fc3c5, 0x005c958c, 0x001bc4c8}}, Y: Field{[10]uint32{0x03b55ee0, 0x023c4fdc, 0x02c99e84, 0x02655445, 0x01033deb, 0x0254368d, 0x028d4f1c, 0x03920ec9, 0x015bb386, 0x0022b268}}}, + {X: Field{[10]uint32{0x0297654e, 0x03352d8d, 0x007e6e50, 0x013d6d09, 0x03cd405f, 0x0137fefe, 0x00a0665f, 0x01a6f810, 0x035d833c, 0x003e5568}}, Y: Field{[10]uint32{0x03c9ee44, 0x03e93d62, 0x0183e4e2, 0x02c9f686, 0x00f56e80, 0x0103acdf, 0x02f2407f, 0x020e2692, 0x03ce2246, 0x00227d3e}}}, + {X: Field{[10]uint32{0x02248007, 0x03edaa09, 0x00132e65, 0x0346248e, 0x010b58b8, 0x037e5e63, 0x02257431, 0x011a8d0a, 0x012d6196, 0x0036f345}}, Y: Field{[10]uint32{0x02d8ba13, 0x02d34d8c, 0x01dcec02, 0x038f4086, 0x03e57d23, 0x039a0c3d, 0x0025e9e2, 0x023f4f91, 0x017ec194, 0x0019be9c}}}, + {X: Field{[10]uint32{0x026e8ebe, 0x03a854d7, 0x035cc71e, 0x02ca2cd6, 0x0399f713, 0x00b9e54f, 0x03cfb1da, 0x02427eb1, 0x00e8e57b, 0x003c6baf}}, Y: Field{[10]uint32{0x01d9d516, 0x03d842f9, 0x0157e1b7, 0x0365617f, 0x0288b0bf, 0x00b93d65, 0x01c24d09, 0x0396a983, 0x02143e77, 0x0021d57e}}}, + {X: Field{[10]uint32{0x00b55187, 0x01b92281, 0x005f5fef, 0x016a4754, 0x01c002bc, 0x0010c241, 0x01ceab65, 0x0212ffe2, 0x024d941f, 0x00288085}}, Y: Field{[10]uint32{0x02f057ff, 0x00ecfbf0, 0x004c1bee, 0x0256b7a2, 0x01b6d4b0, 0x02e6f393, 0x0172e978, 0x01a2d479, 0x002b2bc2, 0x00038335}}}, + {X: Field{[10]uint32{0x028ad68a, 0x01011f72, 0x02861e78, 0x02942009, 0x02b1344d, 0x021fe2e6, 0x000eccb2, 0x039f7a52, 0x025746fd, 0x0015cb85}}, Y: Field{[10]uint32{0x01eb5d9f, 0x01a585cc, 0x01170475, 0x01ac283f, 0x0239eda8, 0x00176b5d, 0x02461eb4, 0x02aed234, 0x01e7c066, 0x00305d2b}}}, + {X: Field{[10]uint32{0x03eba31d, 0x0333a696, 0x00dac58a, 0x03296799, 0x00b67047, 0x01db927a, 0x00b1052b, 0x035d4f02, 0x0107fee4, 0x003d38b2}}, Y: Field{[10]uint32{0x0011c42c, 0x02fe1c4b, 0x030f8f41, 0x00d09201, 0x032b76d1, 0x02a3fa25, 0x00b8317c, 0x034b6392, 0x022d3a92, 0x002c90ea}}}, + {X: Field{[10]uint32{0x01f06dd5, 0x0258e97f, 0x00463e06, 0x0207c934, 0x02266987, 0x01a2026c, 0x029e436d, 0x015c5bd7, 0x02ec8445, 0x0029bf1a}}, Y: Field{[10]uint32{0x0018ca8d, 0x02402a86, 0x013d5073, 0x013a4614, 0x00a96b7f, 0x01d2367c, 0x02135fdf, 0x03f461ab, 0x0215548e, 0x003705a9}}}, + {X: Field{[10]uint32{0x0205f026, 0x03378b56, 0x009bcc00, 0x033ac133, 0x00c4ffb3, 0x00dfcb2f, 0x00d8eec9, 0x02594a73, 0x00175fde, 0x002f601a}}, Y: Field{[10]uint32{0x00a26216, 0x008a2cd9, 0x03f76bce, 0x01d1454a, 0x02db0482, 0x02daf771, 0x03e6a0d8, 0x010ca383, 0x02e78e01, 0x002c9e46}}}, + {X: Field{[10]uint32{0x000165ef, 0x021b74d7, 0x0251e163, 0x02c8e976, 0x032d8614, 0x032b9ae3, 0x015e810e, 0x00f482e7, 0x02676f8c, 0x003e2229}}, Y: Field{[10]uint32{0x009a0dea, 0x00f6b724, 0x0223942a, 0x014f7890, 0x03579788, 0x031ec7ae, 0x034bfe39, 0x03cfbfdb, 0x020fe429, 0x003ed3b8}}}, + {X: Field{[10]uint32{0x009ae200, 0x0221df10, 0x02fd23ba, 0x039af69d, 0x01c3182e, 0x034583f3, 0x01023a48, 0x02a9c7b2, 0x02055adb, 0x001f2347}}, Y: Field{[10]uint32{0x03907ceb, 0x0385d90b, 0x00524f16, 0x0293cb23, 0x01c489b9, 0x033a0dde, 0x02936f4f, 0x01548f65, 0x020bec59, 0x00228ee0}}}, + {X: Field{[10]uint32{0x02fabf43, 0x00539d89, 0x0159e75c, 0x02dd48a6, 0x026dfd9b, 0x024eebdc, 0x00ccd715, 0x01c48184, 0x02a4ee25, 0x0006221b}}, Y: Field{[10]uint32{0x0091531d, 0x026361b8, 0x01d31ffa, 0x0210e622, 0x02898a31, 0x01f40ade, 0x033ad3f0, 0x01a2c034, 0x0295f570, 0x00099b19}}}, + {X: Field{[10]uint32{0x03e52cba, 0x03f73e9a, 0x009a3184, 0x0265419e, 0x011242a0, 0x02b00dae, 0x039a44ec, 0x02b6f4cc, 0x031e38c8, 0x003fa9c3}}, Y: Field{[10]uint32{0x039e7915, 0x009bb38e, 0x0046883e, 0x00bf5d17, 0x02076c0e, 0x00d99c2d, 0x0058093a, 0x0306e777, 0x01f50ba8, 0x00277fdb}}}, + {X: Field{[10]uint32{0x03d1365a, 0x0312d28d, 0x00c8fb1d, 0x01eff908, 0x0096dcbf, 0x01e5146e, 0x0199142e, 0x00f241db, 0x038945aa, 0x001378c0}}, Y: Field{[10]uint32{0x0287cba4, 0x0193b634, 0x0316d356, 0x02884ec2, 0x03992ac0, 0x0006ccdd, 0x001eb2e2, 0x03799090, 0x029e9093, 0x0033b9d3}}}, + {X: Field{[10]uint32{0x02104fb2, 0x02220c06, 0x03da3739, 0x01adad6f, 0x028c2d8e, 0x03040a60, 0x03b8c401, 0x02f9e718, 0x01d1eafe, 0x0019f427}}, Y: Field{[10]uint32{0x01360a5f, 0x03ea96ef, 0x0098461f, 0x016367cb, 0x00d4f035, 0x0063e26f, 0x019049e8, 0x00365a3a, 0x01089266, 0x00043ad5}}}, + {X: Field{[10]uint32{0x00e6010f, 0x03f75dd0, 0x01b5af5f, 0x03d3fe8c, 0x01325e55, 0x01c0c735, 0x0396d4d8, 0x00d3e34e, 0x00fe1868, 0x000ad75c}}, Y: Field{[10]uint32{0x0095ed02, 0x029351ea, 0x03b1f7bd, 0x024327d4, 0x00384398, 0x02c8206d, 0x031f54af, 0x028dcde2, 0x025324d2, 0x00191b9f}}}, + {X: Field{[10]uint32{0x017be248, 0x03d8b7f8, 0x00752527, 0x008f2893, 0x005d600b, 0x02bb42b4, 0x03f7b446, 0x029db064, 0x02998700, 0x0032d098}}, Y: Field{[10]uint32{0x0019a8b6, 0x03a4e796, 0x006e65ac, 0x01413086, 0x03bcfd02, 0x03339dc8, 0x01f74eb8, 0x01832439, 0x0213f3eb, 0x0024a10f}}}, + {X: Field{[10]uint32{0x018e4e41, 0x00137b50, 0x00d25f9b, 0x014ff638, 0x0322d0b8, 0x039b7a22, 0x01ce4d01, 0x02f15c4d, 0x037e75b3, 0x000fb9aa}}, Y: Field{[10]uint32{0x034bcc87, 0x0154da06, 0x027689ad, 0x013da03b, 0x006ee1ab, 0x00cfd480, 0x01b6afc9, 0x01466e4c, 0x03984e52, 0x001a720f}}}, + {X: Field{[10]uint32{0x0087e7be, 0x010217f2, 0x01724e90, 0x031ca8e1, 0x016918ac, 0x005f5e0a, 0x0232df6f, 0x01450c5c, 0x00b0a95a, 0x00160ddd}}, Y: Field{[10]uint32{0x007c3e7b, 0x01cdaaa0, 0x0042418c, 0x03f8542d, 0x03f8f047, 0x019970d4, 0x00160730, 0x033c5cc3, 0x02660ee8, 0x000ceec7}}}, + {X: Field{[10]uint32{0x0079dc1a, 0x020e381c, 0x03fcb0a8, 0x000269e8, 0x03eb3341, 0x02990fa8, 0x0082b772, 0x009e1de4, 0x01ef3982, 0x002bccb8}}, Y: Field{[10]uint32{0x0295fd4c, 0x027b2dd3, 0x037f8b3a, 0x00c792d2, 0x03169383, 0x0068d9a5, 0x02ee7e8b, 0x0048f9ce, 0x028dc660, 0x001a6178}}}, + {X: Field{[10]uint32{0x0034d0c4, 0x02b705b8, 0x03f9c948, 0x02737aae, 0x0150f724, 0x03eff0fd, 0x020c740e, 0x01d5466d, 0x03dd3266, 0x001bb7df}}, Y: Field{[10]uint32{0x02f46026, 0x01144f43, 0x016d40bb, 0x0052edf6, 0x0164534f, 0x02c249a4, 0x030de819, 0x01f69d7e, 0x03185def, 0x003c2317}}}, + {X: Field{[10]uint32{0x01f16b42, 0x00293c00, 0x01f0072a, 0x0182cff6, 0x0086257a, 0x02060878, 0x0104120a, 0x023e51b1, 0x02455d26, 0x000ee699}}, Y: Field{[10]uint32{0x00fe7c7b, 0x006f774b, 0x00117e2e, 0x0121916c, 0x023dfa48, 0x01864041, 0x03601090, 0x01b02257, 0x0215aedf, 0x003b560e}}}, + {X: Field{[10]uint32{0x007a1039, 0x00eb429d, 0x03ae2d68, 0x010e0ba2, 0x0327b529, 0x02804ac3, 0x03cbdf07, 0x03f6c345, 0x03082b5c, 0x002f40d6}}, Y: Field{[10]uint32{0x03b2ef54, 0x003e68e6, 0x03f61ac9, 0x030e2d8a, 0x00e94a23, 0x01cafa2b, 0x0135ccd5, 0x035fa2a8, 0x03aded4a, 0x00192532}}}, + {X: Field{[10]uint32{0x015338c3, 0x0116d13c, 0x02ff7a8c, 0x02c50408, 0x024dda59, 0x022780e0, 0x03316ef0, 0x00602eb8, 0x0319fe9b, 0x003897ef}}, Y: Field{[10]uint32{0x034c7cf2, 0x0220d8c5, 0x03be6f63, 0x00467d3e, 0x007c2c8f, 0x0214b9a5, 0x02412581, 0x037548d0, 0x03f658a3, 0x00117b11}}}, + {X: Field{[10]uint32{0x00ffc9b8, 0x01cb993b, 0x02e6c7c0, 0x0170e1c7, 0x01f30f59, 0x00059501, 0x02ebea75, 0x01cd5814, 0x01cd8ffd, 0x000b88c7}}, Y: Field{[10]uint32{0x0359317a, 0x03cc591b, 0x0127d29c, 0x032fb946, 0x027610d4, 0x02892b78, 0x018f3d3e, 0x02586a11, 0x0052db15, 0x00031991}}}, + {X: Field{[10]uint32{0x01338fc8, 0x0161983d, 0x020483b4, 0x01d299a9, 0x01fd2a41, 0x00c5b819, 0x01ae1260, 0x0189bc6c, 0x01c93932, 0x001f03ca}}, Y: Field{[10]uint32{0x01cd037f, 0x008cee9d, 0x00162350, 0x013e6326, 0x01b76e2c, 0x021fd5aa, 0x0255d7a5, 0x0049cb00, 0x033ddf6f, 0x0009fbd4}}}, + {X: Field{[10]uint32{0x00d5bb48, 0x02da881f, 0x019ba31b, 0x0385c2ca, 0x027bd857, 0x01e53ecc, 0x003e0144, 0x027fbfed, 0x021cea6f, 0x0039c0b5}}, Y: Field{[10]uint32{0x023f79c9, 0x0303acc6, 0x02f2112e, 0x02bf298e, 0x00ee5e28, 0x03781de5, 0x0228a712, 0x03b8f9fc, 0x0081c924, 0x00311de6}}}, + {X: Field{[10]uint32{0x02c852a8, 0x02b917d9, 0x026d8cc2, 0x02900d69, 0x01c362c5, 0x030591fb, 0x0275c117, 0x0306d6fb, 0x0044eade, 0x003c5e00}}, Y: Field{[10]uint32{0x029e1c18, 0x01dd5c8c, 0x030f89a6, 0x00121727, 0x01e8b7a3, 0x00e00c43, 0x00f63ac1, 0x00e5dfc2, 0x01f0f31b, 0x0017e37a}}}, + {X: Field{[10]uint32{0x0312dd9e, 0x001c07c7, 0x0369f8d0, 0x02dc5982, 0x011582cc, 0x00999969, 0x0152c533, 0x016c6352, 0x037f22ec, 0x001e906c}}, Y: Field{[10]uint32{0x007fc443, 0x01425458, 0x002b9db7, 0x017890a7, 0x01344886, 0x028bc780, 0x00cd74d2, 0x00967020, 0x02132c57, 0x0021102f}}}, + {X: Field{[10]uint32{0x002db6d3, 0x033342ca, 0x02779ca4, 0x005b5482, 0x02a5ce63, 0x01f0d546, 0x00f4e165, 0x035a7866, 0x037d8111, 0x000253ff}}, Y: Field{[10]uint32{0x005c6fc0, 0x00926f14, 0x03b909c3, 0x00c0ea4c, 0x0342541d, 0x02c763b5, 0x00a75d38, 0x0030155e, 0x0270026c, 0x00120b24}}}, + {X: Field{[10]uint32{0x03f4e9d1, 0x03251005, 0x02560a54, 0x0224bdc3, 0x01d37759, 0x02c1692a, 0x00ac76b1, 0x03eaa55b, 0x004e8a3f, 0x0035a9b5}}, Y: Field{[10]uint32{0x00863e1a, 0x01ee95e4, 0x00b6cdc5, 0x021f78e2, 0x03c7b93e, 0x00ea2815, 0x023bbe78, 0x0277a645, 0x0322cd83, 0x001230ee}}}, + {X: Field{[10]uint32{0x00cdf80c, 0x00813e54, 0x03d53699, 0x024e56e4, 0x02c47c09, 0x00550ee4, 0x01dbc477, 0x03b6ac79, 0x01c08e24, 0x00330389}}, Y: Field{[10]uint32{0x011fb70b, 0x00a0af41, 0x038c8220, 0x015490c6, 0x031a977c, 0x02d29b4e, 0x0376ab2c, 0x033ced0e, 0x00b37170, 0x0008314b}}}, + {X: Field{[10]uint32{0x02f8d827, 0x0095ced8, 0x01be3db7, 0x0291041e, 0x01efddb6, 0x03ee0f2d, 0x025d0eac, 0x0346be84, 0x03684cb7, 0x0033e54f}}, Y: Field{[10]uint32{0x00909c0c, 0x027b76cc, 0x009ac0b8, 0x01406bf2, 0x03b302fa, 0x038f9428, 0x0047a7b8, 0x0046c42a, 0x0366a45d, 0x001c33f8}}}, + {X: Field{[10]uint32{0x0015d5dc, 0x02675ada, 0x0319fbff, 0x01d450ea, 0x02f8ce69, 0x03f57f87, 0x016b7112, 0x02ac1bfc, 0x02942b34, 0x0006b089}}, Y: Field{[10]uint32{0x036539fc, 0x038fe96a, 0x026154d9, 0x0348911d, 0x011bd823, 0x027859a0, 0x01b7fddd, 0x0025d53a, 0x017e02bd, 0x00290f51}}}, + {X: Field{[10]uint32{0x024d65c2, 0x03dc8c9e, 0x029e9bb9, 0x03f6904b, 0x00496349, 0x0256501b, 0x03800bcf, 0x02012bc3, 0x03ff1153, 0x00340aee}}, Y: Field{[10]uint32{0x0002a384, 0x03fff06e, 0x032f2876, 0x02087083, 0x020d41e6, 0x03bc22d5, 0x0344f9b9, 0x00cbdc75, 0x00de3c78, 0x000177a0}}}, + {X: Field{[10]uint32{0x031831a7, 0x021496d3, 0x0204025a, 0x009920de, 0x02d8a603, 0x0312ca67, 0x021cc2b2, 0x013b8d0b, 0x03478d46, 0x000f32b4}}, Y: Field{[10]uint32{0x002691c0, 0x00dac9b4, 0x0035af30, 0x00f926d4, 0x0147492f, 0x033acd00, 0x0079fdd6, 0x0156d82b, 0x024ca59b, 0x000d7a8a}}}, + {X: Field{[10]uint32{0x02033688, 0x01ee90cd, 0x0106b80f, 0x02cc1067, 0x01b3a758, 0x03fe12cf, 0x0362e90f, 0x030f3835, 0x01543e69, 0x003ab135}}, Y: Field{[10]uint32{0x01deacbe, 0x01a84bf4, 0x01dbf17f, 0x01b7250d, 0x02ee00fb, 0x036a8611, 0x00449aad, 0x01d2effa, 0x02dac543, 0x002a993e}}}, + {X: Field{[10]uint32{0x03fca753, 0x02383318, 0x037a9a02, 0x01974f6e, 0x015df624, 0x00cef8a0, 0x026d0c61, 0x00dc4ccc, 0x01b173d9, 0x000f4a1e}}, Y: Field{[10]uint32{0x00d6e0f0, 0x029ca59a, 0x00c9d8f0, 0x0230a9aa, 0x01fd38a0, 0x01336e34, 0x023eecb3, 0x02d7a2a7, 0x024d9b95, 0x0015db39}}}, + {X: Field{[10]uint32{0x0176ca14, 0x0138c11a, 0x03ce4cf7, 0x015a67ae, 0x0272358a, 0x02a31d9a, 0x0137087c, 0x01a0b894, 0x038d56a9, 0x000fd62a}}, Y: Field{[10]uint32{0x0321f29d, 0x010169ec, 0x02315447, 0x00280579, 0x01f6bce2, 0x02d2036b, 0x030f45f1, 0x02a2a07c, 0x03d101a2, 0x000f2414}}}, + {X: Field{[10]uint32{0x03fd12d7, 0x01776c44, 0x01b97314, 0x004d6211, 0x022a4ed9, 0x022bab90, 0x029df0fa, 0x03346506, 0x0289b48d, 0x0013d7c4}}, Y: Field{[10]uint32{0x00dc1428, 0x03e095b8, 0x03e86077, 0x01a968f0, 0x0342ac0d, 0x0288cf77, 0x02286ed0, 0x0195dc0f, 0x032cc40c, 0x002d70f8}}}, + {X: Field{[10]uint32{0x03376a76, 0x00e4b724, 0x03bc5ad0, 0x037fe682, 0x03e4a9dc, 0x028aeb35, 0x00e70ddd, 0x031beb9d, 0x01e2a52d, 0x0029928a}}, Y: Field{[10]uint32{0x018a9590, 0x02c05990, 0x0330b4eb, 0x0332c395, 0x01c776f2, 0x00f770d9, 0x02efe873, 0x02c6ddee, 0x00a6faa9, 0x002b78be}}}, + {X: Field{[10]uint32{0x00480e70, 0x0331f6f2, 0x02f04994, 0x017788d2, 0x00b8694b, 0x0071b4f8, 0x0186f94e, 0x03e22b47, 0x0212c4d6, 0x0037b82a}}, Y: Field{[10]uint32{0x02f93389, 0x01947e18, 0x002193d4, 0x0320034d, 0x02413ae1, 0x00cb4c35, 0x01368df3, 0x00df3ea7, 0x00d4cbda, 0x0032f66b}}}, + {X: Field{[10]uint32{0x01796936, 0x003c6235, 0x01f74f9c, 0x023220bf, 0x01772b95, 0x003ad9bf, 0x013e2948, 0x01ab86d9, 0x019dc8af, 0x00219dea}}, Y: Field{[10]uint32{0x0397232e, 0x03abe07f, 0x029ed783, 0x0075370f, 0x00662115, 0x002187d1, 0x03a24f3a, 0x0012392d, 0x00c8348c, 0x000c719a}}}, + {X: Field{[10]uint32{0x02997fee, 0x005e307d, 0x01d80ed6, 0x0306633b, 0x02f44aed, 0x02f5b59d, 0x0229bc79, 0x029f30ac, 0x013acb73, 0x0014445f}}, Y: Field{[10]uint32{0x01110cd6, 0x0395a30e, 0x01a4d174, 0x01c0c870, 0x0278f207, 0x00258d0f, 0x00651d30, 0x0217045c, 0x0004123f, 0x001718e3}}}, + {X: Field{[10]uint32{0x03141b12, 0x0328e0e7, 0x024689c3, 0x03e0d08f, 0x020a83c9, 0x00ba8490, 0x03585d45, 0x0020a3a1, 0x03646967, 0x0012362b}}, Y: Field{[10]uint32{0x0265e9de, 0x035938d4, 0x0040fdc4, 0x00d6501b, 0x011998dd, 0x00157b41, 0x029843b9, 0x01269f1a, 0x0342f07f, 0x001562a3}}}, + {X: Field{[10]uint32{0x02966d2c, 0x03a03d7d, 0x0317aecb, 0x01f7d6ee, 0x01d4060c, 0x0070593a, 0x003d4574, 0x03bb9685, 0x02c1b0fd, 0x0018aea6}}, Y: Field{[10]uint32{0x01d9450e, 0x01b04629, 0x00aedb58, 0x019cec0d, 0x019329fe, 0x01c2cee6, 0x0096494b, 0x0105b17f, 0x013f2290, 0x00196819}}}, + {X: Field{[10]uint32{0x01febf0d, 0x00a5f492, 0x0004a486, 0x00150fcc, 0x00508d8d, 0x00f1e4c4, 0x02f20580, 0x0295ad43, 0x03cb679d, 0x002f937d}}, Y: Field{[10]uint32{0x01f3ba9b, 0x01b10f35, 0x03a0995f, 0x00183e8f, 0x00ca6973, 0x032a21a5, 0x018cb8ba, 0x00f9fea2, 0x0150dd5f, 0x00306d59}}}, + {X: Field{[10]uint32{0x00c9979d, 0x010d6c0a, 0x010c3a0c, 0x00b33855, 0x02424eac, 0x0211ccc5, 0x02cdf340, 0x0381a016, 0x036ccca2, 0x00392700}}, Y: Field{[10]uint32{0x01609a1b, 0x02264b98, 0x03bcab16, 0x0078ed0a, 0x0121186b, 0x009ebf5f, 0x010d273d, 0x03f7956f, 0x025f0457, 0x00115af0}}}, + {X: Field{[10]uint32{0x03fd58e3, 0x01e9be25, 0x01302705, 0x006ab570, 0x02976e70, 0x02ddd30a, 0x03ddfc9c, 0x017642cf, 0x01eda81d, 0x002b9a11}}, Y: Field{[10]uint32{0x02d755bc, 0x01299d5f, 0x03e11e5b, 0x01b39a6c, 0x00450112, 0x014e694d, 0x026194e7, 0x038d8264, 0x0055322a, 0x0014a6f7}}}, + {X: Field{[10]uint32{0x02a25e1b, 0x03ab8c6f, 0x02d183fb, 0x02652867, 0x004c2744, 0x035c4e19, 0x00717e02, 0x02ddcb32, 0x00f8bcc2, 0x0014a876}}, Y: Field{[10]uint32{0x0189011b, 0x01a79810, 0x001dc9f8, 0x01cf1c0d, 0x03dbb806, 0x00edd4a2, 0x00e77f95, 0x01e25212, 0x032ce7f1, 0x00368a82}}}, + {X: Field{[10]uint32{0x02a2250a, 0x03ce0165, 0x02918425, 0x02724349, 0x010cc552, 0x035692af, 0x0119f50d, 0x01e01357, 0x0301d89a, 0x003feeeb}}, Y: Field{[10]uint32{0x029880e2, 0x00dfb666, 0x0214538c, 0x0043dac6, 0x022d5144, 0x00bf84c8, 0x02a47a6c, 0x018af416, 0x03b7eba6, 0x00222d7d}}}, + {X: Field{[10]uint32{0x038c942e, 0x0296783f, 0x011f9fe5, 0x0323fd81, 0x014473fb, 0x013e15c9, 0x03840eed, 0x006adebe, 0x0038aab5, 0x0001bfe9}}, Y: Field{[10]uint32{0x0202d775, 0x02131fb9, 0x01f8e668, 0x0168ab1f, 0x0350a0e9, 0x02584ef2, 0x0060dc66, 0x028100ce, 0x02dd3b88, 0x0016c089}}}, + {X: Field{[10]uint32{0x00a2fc79, 0x03b250c2, 0x00cb5a45, 0x01eb22f2, 0x00c2c1b7, 0x00749a84, 0x00f5ee59, 0x0311f8c6, 0x0258f92a, 0x00272255}}, Y: Field{[10]uint32{0x001045f9, 0x02b3ea70, 0x0338e516, 0x0057fdd3, 0x00ef4b01, 0x0378963b, 0x0255e286, 0x02f563c5, 0x01e2665e, 0x001c201c}}}, + {X: Field{[10]uint32{0x01861ba9, 0x037dbc30, 0x03bb5df1, 0x0338153e, 0x00a59bb3, 0x03afb38f, 0x01bffd18, 0x00d6c4ff, 0x020defba, 0x0014cb9b}}, Y: Field{[10]uint32{0x02bc5b8a, 0x02d1d52b, 0x027fff61, 0x003e942e, 0x0336f04b, 0x0192d164, 0x0332ed24, 0x02ef0fad, 0x01dad326, 0x0006bd19}}}, + {X: Field{[10]uint32{0x01fff425, 0x01238039, 0x02ea138d, 0x02020f69, 0x038a8a9f, 0x01432d28, 0x01add8eb, 0x01c24833, 0x0321e3f2, 0x0026410c}}, Y: Field{[10]uint32{0x0377ea6f, 0x0347c123, 0x03786ef9, 0x00937ca6, 0x02404ecb, 0x0394b0cd, 0x025b1be8, 0x00943f67, 0x0197325c, 0x00046fa1}}}, + {X: Field{[10]uint32{0x004084f9, 0x02bd1b9f, 0x0217287d, 0x01730cc7, 0x017d7908, 0x008308af, 0x00a6e941, 0x00d2a668, 0x00803a09, 0x00259e64}}, Y: Field{[10]uint32{0x00005e03, 0x011b08e6, 0x02d047dc, 0x02ab5d72, 0x02574903, 0x02ca04bb, 0x0120b5c9, 0x002ff9a9, 0x012d1845, 0x003aa400}}}, + {X: Field{[10]uint32{0x02a0afb9, 0x036b0dce, 0x006ab729, 0x006d3f0e, 0x021f36f7, 0x03bfdd85, 0x02d99819, 0x03f8433d, 0x0157915f, 0x001d3d74}}, Y: Field{[10]uint32{0x01b29eb5, 0x02750846, 0x0009a2c4, 0x02925069, 0x034e4ce4, 0x03323111, 0x02e225cd, 0x02f1d04a, 0x011e4922, 0x00152800}}}, + {X: Field{[10]uint32{0x01927855, 0x0335aa30, 0x0231e3e7, 0x035caa81, 0x0176e5f3, 0x0235e9d4, 0x000ddebe, 0x00e5555c, 0x035381c6, 0x00049a49}}, Y: Field{[10]uint32{0x039ae553, 0x03833070, 0x017b72c5, 0x03f544cd, 0x013eefef, 0x0387442d, 0x00554fa1, 0x000b5513, 0x00768110, 0x002e4b94}}}, + {X: Field{[10]uint32{0x00230d9f, 0x03801ee0, 0x028e11aa, 0x02f37471, 0x00d7cdcf, 0x03c63604, 0x036ae35a, 0x00f5cc16, 0x001b1d14, 0x000213be}}, Y: Field{[10]uint32{0x0175d42a, 0x028bb72d, 0x001bb33c, 0x0116a9b8, 0x02b0dda6, 0x00e28b96, 0x02bcf2c6, 0x033a3087, 0x022ba5b4, 0x0032b8e6}}}, + {X: Field{[10]uint32{0x009037ad, 0x00544b7b, 0x02a62dd7, 0x034a9ccf, 0x01c8d89d, 0x03b58aa1, 0x007af5e0, 0x01ab1d99, 0x01a3326e, 0x000708ab}}, Y: Field{[10]uint32{0x02aab458, 0x00126045, 0x00b64493, 0x03726580, 0x00bc4142, 0x02e79bf5, 0x0246283c, 0x029abe67, 0x00c61562, 0x003d6966}}}, + {X: Field{[10]uint32{0x024aff1b, 0x01c7307e, 0x03f4e736, 0x012142ef, 0x03c00f1f, 0x02781054, 0x00dd35fe, 0x02af56aa, 0x024ff08e, 0x001ae472}}, Y: Field{[10]uint32{0x01b31852, 0x00943f84, 0x039778cb, 0x0069f761, 0x01b3c955, 0x00413d61, 0x0368c8b6, 0x03e6753e, 0x02da85ad, 0x0031b36a}}}, + {X: Field{[10]uint32{0x01f85bc2, 0x01e2573b, 0x0188e23f, 0x02d7a3dc, 0x00b99063, 0x020dcdb9, 0x03f03219, 0x00855d84, 0x01996d2e, 0x0015eed2}}, Y: Field{[10]uint32{0x0347cc3a, 0x036dd96a, 0x0150e94f, 0x0050156d, 0x02d0a1ad, 0x01cea0b6, 0x034b9b20, 0x02a43a49, 0x01c672ee, 0x0024ed1b}}}, + {X: Field{[10]uint32{0x0233ba6e, 0x03d49812, 0x001ccb40, 0x0289e2be, 0x00067c38, 0x018f7e3c, 0x016d9f24, 0x0159b841, 0x0327ebf7, 0x001d5e42}}, Y: Field{[10]uint32{0x009d2045, 0x0267172e, 0x02dac6be, 0x01c66b81, 0x003af8dc, 0x011bab75, 0x025decf3, 0x002976c1, 0x00a3d99b, 0x00328323}}}, + {X: Field{[10]uint32{0x0074ebe9, 0x02f2ed41, 0x00a08f32, 0x03d36e31, 0x028dd7b4, 0x00c01287, 0x032b6fde, 0x01642fdf, 0x01ada90b, 0x00329e9d}}, Y: Field{[10]uint32{0x03fc69e3, 0x037b5a60, 0x03a1efd3, 0x0166b372, 0x00512732, 0x003c7700, 0x00e8a08e, 0x01479efd, 0x019c5c93, 0x002cc9e3}}}, + {X: Field{[10]uint32{0x0390b2d1, 0x013d754b, 0x0365c07a, 0x016bcc61, 0x0147b65a, 0x014aecd9, 0x02a8d6ce, 0x018a50e4, 0x00b93bf4, 0x0029b71a}}, Y: Field{[10]uint32{0x010ad45b, 0x00970cf2, 0x024de8f9, 0x01220648, 0x0237f533, 0x024c7718, 0x033c76a0, 0x01558683, 0x0167fc57, 0x00106e9b}}}, + {X: Field{[10]uint32{0x03b6bba5, 0x036b87da, 0x01b56fe0, 0x0130fd49, 0x002fafed, 0x0030d844, 0x035a0252, 0x03242b1f, 0x01f3f8af, 0x0036884e}}, Y: Field{[10]uint32{0x036349db, 0x001819c6, 0x02c369ad, 0x00743d6e, 0x0271e92c, 0x03968e53, 0x0097522d, 0x03605b70, 0x0388fa9e, 0x00256b72}}}, + {X: Field{[10]uint32{0x013da4de, 0x023893d0, 0x002cdf5a, 0x01ec8fc4, 0x03215935, 0x02aea732, 0x034194bf, 0x00018eb2, 0x00752f0e, 0x0028cac9}}, Y: Field{[10]uint32{0x03e576cc, 0x034c587a, 0x013dbddf, 0x02e0d3c1, 0x03e09f8a, 0x030d40db, 0x0316ffd8, 0x009ff31d, 0x0143bd8b, 0x0015f7d0}}}, + {X: Field{[10]uint32{0x01e9bedc, 0x00e2532b, 0x01392b89, 0x03c8b248, 0x02741718, 0x008cf1ce, 0x0319d8ba, 0x013fcf1c, 0x011d3382, 0x002aba92}}, Y: Field{[10]uint32{0x001a63a7, 0x02d85513, 0x02f4eb24, 0x00cb57e3, 0x01a7ad0d, 0x016bb61b, 0x026a3a1a, 0x0371964e, 0x029184d8, 0x000323ec}}}, + {X: Field{[10]uint32{0x007f2c75, 0x0222b362, 0x015e7ed3, 0x0170ac0c, 0x01ccf75d, 0x01a3ed8e, 0x00f3eb3d, 0x0026f489, 0x00e27a84, 0x000a4d78}}, Y: Field{[10]uint32{0x0168aad4, 0x026a4e31, 0x001640c8, 0x00343f7f, 0x03977e90, 0x00603530, 0x03d00680, 0x02b90260, 0x002462c9, 0x000313fc}}}, + {X: Field{[10]uint32{0x030fe577, 0x0091339d, 0x0218163d, 0x02581419, 0x03fdebbd, 0x02fabfb2, 0x034259aa, 0x01c94d60, 0x00769e2e, 0x001ff2a0}}, Y: Field{[10]uint32{0x01bc3542, 0x0384f355, 0x02ed99a5, 0x02e9f6eb, 0x0369cfec, 0x03f453fe, 0x003b8f6f, 0x03b48b2b, 0x03abf04d, 0x0028f770}}}, + {X: Field{[10]uint32{0x028b483e, 0x02d06457, 0x002a96a7, 0x031c4c59, 0x00bc129e, 0x01ed144d, 0x01e665f5, 0x02929fe9, 0x01c601ca, 0x00316d7c}}, Y: Field{[10]uint32{0x00b538e4, 0x01efeee7, 0x012576d3, 0x019b6332, 0x0173dabb, 0x0098047a, 0x0358fd0c, 0x0263368f, 0x0016da50, 0x0009b2ce}}}, + {X: Field{[10]uint32{0x01a50d88, 0x03eda81e, 0x034f456b, 0x01d33ff6, 0x03d7d5b1, 0x01e400d6, 0x01ecf4bf, 0x019dc993, 0x0274df43, 0x00104368}}, Y: Field{[10]uint32{0x039a6abf, 0x034aefbb, 0x000f88e1, 0x00e56efc, 0x02254a19, 0x01065e7e, 0x002ef1e8, 0x02cd25b7, 0x0168188e, 0x001c7206}}}, + {X: Field{[10]uint32{0x0367769a, 0x01634173, 0x03387540, 0x02b142af, 0x036f7976, 0x00e89a06, 0x036c5a24, 0x032002ae, 0x00ca334d, 0x000f664a}}, Y: Field{[10]uint32{0x01d2beb7, 0x03d3a7e5, 0x0115b2e4, 0x02af137c, 0x0062bf01, 0x00282879, 0x0183cdd8, 0x009ed4f8, 0x01dc7661, 0x0033f300}}}, + {X: Field{[10]uint32{0x00040cec, 0x03d0db32, 0x009192e4, 0x0387ce7f, 0x02d858ea, 0x000028c8, 0x037ce312, 0x0392991d, 0x017bc523, 0x00196a3d}}, Y: Field{[10]uint32{0x01192432, 0x01ff7018, 0x01b323f0, 0x03f30815, 0x03c9df69, 0x008affd8, 0x03f7b0ea, 0x00dd16c7, 0x00b99e95, 0x002081a6}}}, + {X: Field{[10]uint32{0x0192fb79, 0x00f99a97, 0x021531ac, 0x00e4929c, 0x0055f4e5, 0x0189c969, 0x013ef5ca, 0x001b0bff, 0x03ccbaa6, 0x00213954}}, Y: Field{[10]uint32{0x00c5f8d2, 0x03f43ce7, 0x01d674dc, 0x01d4640b, 0x014c0b5f, 0x03004887, 0x01f77311, 0x025197f6, 0x03324aaa, 0x000d35ab}}}, + {X: Field{[10]uint32{0x00773783, 0x03059a80, 0x036ac5f8, 0x02d3de68, 0x00dda3d4, 0x03451b6a, 0x011578d5, 0x00489bce, 0x01582885, 0x000ed29d}}, Y: Field{[10]uint32{0x01a59e53, 0x0021306c, 0x007877d0, 0x02f1335f, 0x021a4249, 0x013534d6, 0x00b3cc14, 0x00f30bad, 0x02fc4de8, 0x0038df25}}}, + {X: Field{[10]uint32{0x00cee6b0, 0x01b67bd4, 0x01db8922, 0x01e1920b, 0x02743395, 0x01ff344b, 0x00898193, 0x013a37a9, 0x012c0616, 0x001b6ef4}}, Y: Field{[10]uint32{0x01e02b90, 0x005845ab, 0x02a70333, 0x03182000, 0x020eed3b, 0x0069a2b3, 0x0247c17e, 0x0345514b, 0x0349b3f5, 0x00227923}}}, + {X: Field{[10]uint32{0x03c441f6, 0x03edcaa5, 0x03e02f0b, 0x0275b307, 0x02f1118e, 0x03e12bdc, 0x020b7431, 0x019205d2, 0x00db3b92, 0x002d9060}}, Y: Field{[10]uint32{0x03b25fd2, 0x03c30b13, 0x004d99e1, 0x036fab1c, 0x0033cc19, 0x03256817, 0x03a4f0f8, 0x00205899, 0x019783d0, 0x002ce53e}}}, + {X: Field{[10]uint32{0x016b5c56, 0x003c0e88, 0x02115b26, 0x02fb91ac, 0x0137e96f, 0x02ed9fca, 0x037fc08e, 0x01df1b65, 0x038cf473, 0x00085cfc}}, Y: Field{[10]uint32{0x012e2abf, 0x008becc8, 0x0136f27e, 0x006939e7, 0x023bd1c6, 0x01afb3d5, 0x008c6df0, 0x029a13f6, 0x027803c4, 0x002f680a}}}, + {X: Field{[10]uint32{0x005c5214, 0x03899b7f, 0x0356a222, 0x029aa289, 0x02ea2b89, 0x033cd781, 0x00df0b48, 0x00bc3619, 0x00d3f373, 0x0027767b}}, Y: Field{[10]uint32{0x03e921fe, 0x035c4b85, 0x0106fa70, 0x0069437b, 0x01dcf00b, 0x01f6e52b, 0x019256a5, 0x0209083b, 0x03202ba6, 0x00390ba9}}}, + {X: Field{[10]uint32{0x03af71a9, 0x004873f9, 0x0136b02a, 0x00c98134, 0x029d3982, 0x03dca424, 0x0149526a, 0x02d8bb75, 0x03ed5ceb, 0x001c17e7}}, Y: Field{[10]uint32{0x010d30a8, 0x00b30a5d, 0x01d2c44d, 0x00028580, 0x002b32c1, 0x01e9e18f, 0x0269a4a5, 0x01cbac4b, 0x017daa44, 0x002ecb2c}}}, + {X: Field{[10]uint32{0x00ef4410, 0x02130acb, 0x031a217b, 0x028a3637, 0x033fbcda, 0x03f04978, 0x037fcd8c, 0x01a6f5fe, 0x00d18071, 0x003c6a42}}, Y: Field{[10]uint32{0x00911512, 0x02a91a2e, 0x02cc14e7, 0x03921e04, 0x02d792bb, 0x0214799e, 0x01cfa759, 0x01b15be0, 0x0008804c, 0x0003a1b3}}}, + {X: Field{[10]uint32{0x01355f57, 0x03370938, 0x00d5fd40, 0x00d1491f, 0x005625e4, 0x02148983, 0x012a4756, 0x00f2071d, 0x01793569, 0x0036c317}}, Y: Field{[10]uint32{0x0283daea, 0x030ba371, 0x02629fe8, 0x0354d533, 0x01d0de9b, 0x014e7af9, 0x0321f1e2, 0x034a54dd, 0x02a9fb00, 0x00048317}}}, + {X: Field{[10]uint32{0x02423ec6, 0x03b652f2, 0x00af59a2, 0x01c1ed4f, 0x02e979d4, 0x010476a1, 0x0158f683, 0x01fa486c, 0x01355600, 0x00179356}}, Y: Field{[10]uint32{0x0272d935, 0x01ddcf98, 0x026dcb94, 0x02824a1d, 0x01c309b5, 0x0339abbf, 0x0062fb37, 0x027b4c9e, 0x03001a0e, 0x001c5622}}}, + {X: Field{[10]uint32{0x03ec7f28, 0x00abd013, 0x02bcd487, 0x0019fb3e, 0x00a264d1, 0x00904059, 0x017fd112, 0x0397e23a, 0x02083c46, 0x00069e7b}}, Y: Field{[10]uint32{0x02349111, 0x03de8c8c, 0x02aacc4d, 0x03536501, 0x0254f94b, 0x0229723f, 0x016289f1, 0x01d54c0d, 0x03fc49bf, 0x003e4a36}}}, + {X: Field{[10]uint32{0x00ac5468, 0x028ebcdb, 0x0346e86c, 0x00492af7, 0x011c3a18, 0x00e8290d, 0x000a2d7f, 0x00311b2d, 0x008be3be, 0x0039a4fe}}, Y: Field{[10]uint32{0x01649cc4, 0x002529b7, 0x00efb78f, 0x0135994e, 0x03fb4f35, 0x022bb16b, 0x032db89d, 0x00a8aebb, 0x03bd24ab, 0x00157c2d}}}, + {X: Field{[10]uint32{0x029ca25e, 0x0315468c, 0x03e581bc, 0x015d7435, 0x0043bb61, 0x017a5b8a, 0x03b12d4f, 0x00f1dbdc, 0x00b1f3c7, 0x001b457a}}, Y: Field{[10]uint32{0x017f069d, 0x030d620b, 0x0365db74, 0x02f9b8ed, 0x01173f8c, 0x0067e296, 0x020d05e4, 0x01909cca, 0x02e18438, 0x003c87cf}}}, + {X: Field{[10]uint32{0x03ddb682, 0x02aab78e, 0x02dc48a5, 0x0393fd4d, 0x0220dd98, 0x01964f45, 0x0303f2cf, 0x012bd254, 0x0127b261, 0x00122e3c}}, Y: Field{[10]uint32{0x03546e3f, 0x0395fb0b, 0x02e99c7c, 0x0075a00e, 0x02a50d19, 0x0175e1b5, 0x027e23b5, 0x01f18944, 0x01baec13, 0x0023b46e}}}, + {X: Field{[10]uint32{0x02eb3028, 0x029f03d6, 0x023d4170, 0x02923fdf, 0x008c29fc, 0x028cb828, 0x0319f291, 0x01144251, 0x0231ee1e, 0x000bb0c9}}, Y: Field{[10]uint32{0x017aa945, 0x015e171a, 0x02c91610, 0x03e04faa, 0x02491572, 0x0341f426, 0x010ee359, 0x014db963, 0x019fe21b, 0x003ae187}}}, + {X: Field{[10]uint32{0x03afce3a, 0x02e3282b, 0x017b6776, 0x019ba861, 0x007ab72f, 0x01573251, 0x012c13fb, 0x0353517b, 0x02cb3b35, 0x003de583}}, Y: Field{[10]uint32{0x0010f08a, 0x0366b9e1, 0x00510cd6, 0x01fe3e1f, 0x03d8f7cf, 0x0280bba9, 0x0140334d, 0x01ad029c, 0x00f8d40f, 0x00240917}}}, + {X: Field{[10]uint32{0x02613ef2, 0x011c496e, 0x035af7a2, 0x02e31f72, 0x01139b29, 0x0163cea8, 0x0385780d, 0x03df9bbc, 0x003e4b22, 0x002a5333}}, Y: Field{[10]uint32{0x02845409, 0x03511768, 0x00c45e94, 0x032e33e9, 0x02782471, 0x02f1a99b, 0x01ba357c, 0x03e836a2, 0x00fadd6a, 0x003bdc14}}}, + {X: Field{[10]uint32{0x01485c38, 0x018bd53d, 0x0239956d, 0x03b45c21, 0x028c42b3, 0x0315bc09, 0x03d6f576, 0x03d0c034, 0x03f86d80, 0x0039229f}}, Y: Field{[10]uint32{0x029a6255, 0x03671697, 0x00231a7b, 0x00091ee6, 0x03e429b7, 0x01ffed0a, 0x01e3c65c, 0x01ec2c8a, 0x0229b499, 0x002c5a54}}}, + {X: Field{[10]uint32{0x0322d2ae, 0x027a6edf, 0x00d9eac7, 0x02efd922, 0x02cccb09, 0x00a98cf5, 0x025b422b, 0x0320eb36, 0x008c7d46, 0x0037e652}}, Y: Field{[10]uint32{0x0345fd4b, 0x01dd58bc, 0x038c3e04, 0x01176468, 0x03aaf83a, 0x02f4f1ca, 0x001a8785, 0x03d17114, 0x0280a958, 0x00225240}}}, + {X: Field{[10]uint32{0x0322fd84, 0x03bd06bb, 0x03770553, 0x00f8a6c9, 0x032bb4e4, 0x02e8d23b, 0x024368eb, 0x03e7d1bd, 0x02c04db9, 0x00285431}}, Y: Field{[10]uint32{0x01c5c201, 0x0193ca46, 0x01ccae1f, 0x01fad121, 0x00e7b539, 0x0038fb47, 0x0122ab02, 0x01683b0e, 0x0274e152, 0x001877ea}}}, + {X: Field{[10]uint32{0x03aa0edd, 0x02a9507c, 0x024e1204, 0x03ff615a, 0x00937392, 0x0326128a, 0x03aa167b, 0x031be475, 0x01fa452e, 0x0026df7b}}, Y: Field{[10]uint32{0x03d2c74a, 0x012a113f, 0x03e7910a, 0x002732b6, 0x03b4262c, 0x0326cc6a, 0x020ef6e7, 0x01a37af2, 0x01122f51, 0x0028dfd2}}}, + {X: Field{[10]uint32{0x00e51904, 0x03b4d60a, 0x01a23d38, 0x00f3e482, 0x02ad1aa8, 0x01e69641, 0x00f75c55, 0x03a9c6c8, 0x02516d0c, 0x0031f5de}}, Y: Field{[10]uint32{0x00a44bd6, 0x0393635d, 0x00e7f56d, 0x02232d7b, 0x0108e5a2, 0x026c36ba, 0x030a7a14, 0x00d980de, 0x007d9e1a, 0x000e669f}}}, + {X: Field{[10]uint32{0x02fe73fd, 0x009e52d0, 0x02e8d806, 0x03b2cee1, 0x02fc1d1d, 0x01cf6604, 0x026c2b0f, 0x0396e685, 0x00298e4d, 0x0034c4ea}}, Y: Field{[10]uint32{0x03708fe4, 0x02a20c07, 0x02a16fc9, 0x027182bd, 0x03b8514c, 0x02ef6d36, 0x03062c5d, 0x01b8bcd3, 0x023a7eb2, 0x00194911}}}, + {X: Field{[10]uint32{0x03211e5f, 0x0181ffa5, 0x038b9787, 0x00f1263c, 0x022e6c2a, 0x00f13c63, 0x0069b8e8, 0x031a4c19, 0x023b4d66, 0x0012efcd}}, Y: Field{[10]uint32{0x011c60c3, 0x01ba301f, 0x025629f2, 0x01670378, 0x0382bb0d, 0x00605dd0, 0x03b64061, 0x01cb1631, 0x024b2438, 0x002790b2}}}, + {X: Field{[10]uint32{0x021e9cf2, 0x0114d7e1, 0x0003e3f8, 0x00ddd19d, 0x01d471bd, 0x0199f3c6, 0x027ef1da, 0x033a1b52, 0x00ed23a0, 0x0000ef84}}, Y: Field{[10]uint32{0x0066d885, 0x02c10cd0, 0x00ead0a7, 0x02432e57, 0x00edfd20, 0x026ee7ea, 0x034748a4, 0x005f0194, 0x03780cb3, 0x002ee564}}}, + {X: Field{[10]uint32{0x01ca2076, 0x02736cd7, 0x01d96b16, 0x026032e9, 0x00946da1, 0x034a7bb1, 0x01074ec8, 0x0258f20a, 0x0080d723, 0x003f347e}}, Y: Field{[10]uint32{0x02a87b01, 0x024674ec, 0x013467c0, 0x02b896fb, 0x02d3b105, 0x03e97f21, 0x00ec2755, 0x018b8713, 0x00e3a313, 0x0025226f}}}, + {X: Field{[10]uint32{0x02b317c4, 0x03009c7e, 0x0217cf0e, 0x02a14b34, 0x01f39f42, 0x023a81a0, 0x027114cd, 0x00d98acb, 0x0358993d, 0x0002d7ec}}, Y: Field{[10]uint32{0x03a71b43, 0x02ceeefc, 0x0334a791, 0x0314537d, 0x0380a653, 0x02c12b09, 0x01bfa828, 0x00b2f3c3, 0x02b8ee62, 0x00227623}}}, + {X: Field{[10]uint32{0x03e274e7, 0x00920563, 0x037c9556, 0x01fd8139, 0x0330fc13, 0x00b32acf, 0x000f39bd, 0x0118291d, 0x02d17fca, 0x002a1aee}}, Y: Field{[10]uint32{0x030753fb, 0x02de8a40, 0x01a0bd03, 0x038498fd, 0x031394ed, 0x01258b01, 0x0294742e, 0x026b1e34, 0x0259ba96, 0x00309b70}}}, + {X: Field{[10]uint32{0x0330d29a, 0x02486004, 0x01467887, 0x025309f4, 0x019dd3fc, 0x024d744a, 0x034bc7ba, 0x02f259f8, 0x01f6348c, 0x0003b4c8}}, Y: Field{[10]uint32{0x03f7c3b5, 0x00349468, 0x021351be, 0x00085400, 0x00fc5ac4, 0x03c1ef72, 0x03b44d6c, 0x0177871d, 0x0360832b, 0x002d01e0}}}, + {X: Field{[10]uint32{0x02d17dea, 0x035c6506, 0x0097996e, 0x023dc07f, 0x022c425b, 0x03825312, 0x01e827ed, 0x02e4dbd5, 0x0275e4dd, 0x003205e4}}, Y: Field{[10]uint32{0x002553a7, 0x03fa6776, 0x02622e16, 0x018f14ac, 0x038ce5e9, 0x019921ab, 0x009b0b92, 0x034597ad, 0x005be241, 0x003667c7}}}, + {X: Field{[10]uint32{0x0284985b, 0x03435f77, 0x02512df1, 0x00b87647, 0x010eeaf8, 0x03e37f3f, 0x02743283, 0x02ce0d24, 0x013f23b9, 0x001bc23c}}, Y: Field{[10]uint32{0x00bd602e, 0x00ff8236, 0x03a76a4a, 0x00788b31, 0x010665d6, 0x000dc2b1, 0x0258ed05, 0x010ce9bb, 0x0029f99f, 0x0025adaa}}}, + {X: Field{[10]uint32{0x038f9d5a, 0x031f99e7, 0x015e4b35, 0x01b28461, 0x03e6ab5d, 0x03ab0f97, 0x01f8b609, 0x02753fbe, 0x03e3410f, 0x002510e9}}, Y: Field{[10]uint32{0x03eded57, 0x003e4d8e, 0x01b538fa, 0x03756847, 0x02ac9b2a, 0x001eaf08, 0x03c93e6d, 0x0230fcc6, 0x03b57818, 0x00363141}}}, + {X: Field{[10]uint32{0x033c502b, 0x01c0fd44, 0x013d2e37, 0x0120378a, 0x01d38c88, 0x01c015bb, 0x03afcfa5, 0x00da06b4, 0x00ca3ed5, 0x0010cbaa}}, Y: Field{[10]uint32{0x03edff71, 0x00ce26da, 0x00118faa, 0x0371909c, 0x010965dd, 0x009b1a98, 0x0266a498, 0x00aec023, 0x028b70b5, 0x00278648}}}, + {X: Field{[10]uint32{0x0182403b, 0x0240ff86, 0x032c130f, 0x03ab8adc, 0x005e22ff, 0x00f1ffb6, 0x02584a3d, 0x00bf6316, 0x009a42f8, 0x000745d6}}, Y: Field{[10]uint32{0x00c39ceb, 0x003d549e, 0x00e9454e, 0x017ef978, 0x03511e96, 0x0117c31a, 0x0164ed02, 0x03482099, 0x03b48f18, 0x0027def3}}}, + {X: Field{[10]uint32{0x018e6b2d, 0x00da87f8, 0x0098b554, 0x03fffdf0, 0x021ab8c6, 0x024104b3, 0x02778ea7, 0x0211bd97, 0x01b5cd84, 0x001d0ce6}}, Y: Field{[10]uint32{0x00b784bc, 0x03d26cb6, 0x03145fb1, 0x02739733, 0x01e84ff4, 0x0006dbf4, 0x0166d3fc, 0x006f9399, 0x001a8280, 0x00371b32}}}, + {X: Field{[10]uint32{0x0110b2a7, 0x0268369e, 0x0071fa27, 0x00cb817e, 0x025330d2, 0x02d7e490, 0x023e80e3, 0x0123058b, 0x01583b28, 0x00390de1}}, Y: Field{[10]uint32{0x01624b68, 0x036b3c15, 0x011f080c, 0x006f41db, 0x01d5e242, 0x005e6862, 0x013f99f8, 0x01e3901f, 0x0171aa49, 0x0030e6d0}}}, + {X: Field{[10]uint32{0x0318d63e, 0x0009acd9, 0x02a10664, 0x033bd7d0, 0x038f8a99, 0x00029918, 0x0355ac7d, 0x00e6a3c5, 0x00a31b16, 0x003bbdda}}, Y: Field{[10]uint32{0x0224a991, 0x01211cc7, 0x01ef5ee6, 0x02e22f8a, 0x01878efc, 0x03a5ec19, 0x030043af, 0x039a186b, 0x01f4cbf4, 0x000aa401}}}, + {X: Field{[10]uint32{0x03c91fe9, 0x0032a86f, 0x0129a180, 0x027ecb7a, 0x00fc2afa, 0x01807612, 0x00dce1bd, 0x0184b3d0, 0x02872504, 0x000576d1}}, Y: Field{[10]uint32{0x027eded8, 0x01c43313, 0x03515f17, 0x002e568b, 0x021e7236, 0x0242e0b2, 0x00678a9d, 0x02366941, 0x024e7d50, 0x002a2db9}}}, + {X: Field{[10]uint32{0x014a4191, 0x015eeb43, 0x022a0c77, 0x00fbf1e3, 0x01d2b330, 0x015a87f6, 0x028d2a04, 0x02a12e74, 0x02cf2529, 0x002b517e}}, Y: Field{[10]uint32{0x0254f069, 0x012a234d, 0x0125aa6b, 0x002583e6, 0x01bf8d81, 0x03ddf56b, 0x02f58678, 0x00c0d45b, 0x0171473f, 0x00069e39}}}, + {X: Field{[10]uint32{0x01151824, 0x02526d6e, 0x03d8958c, 0x01b57e92, 0x021c19b6, 0x0224aeb0, 0x0375050a, 0x01ed33ad, 0x03446e02, 0x0010680d}}, Y: Field{[10]uint32{0x01140317, 0x0150df65, 0x00e74bb4, 0x033590d7, 0x0027c53a, 0x00381ea1, 0x021cb2e6, 0x034e3e9c, 0x00ddfa96, 0x003b5f11}}}, + {X: Field{[10]uint32{0x03217ae0, 0x0047c749, 0x00740560, 0x035836b0, 0x015a70d5, 0x003c410f, 0x03645890, 0x031ffcb3, 0x006958f4, 0x0008082e}}, Y: Field{[10]uint32{0x01c4e9e0, 0x02e53df8, 0x02aa0490, 0x0184a754, 0x02b37f59, 0x0093ac71, 0x01946171, 0x03d0c686, 0x01e22757, 0x00044656}}}, + {X: Field{[10]uint32{0x02bd4ba1, 0x00e0ea7a, 0x00180283, 0x0155c400, 0x0299c5f7, 0x021685a7, 0x033bf27d, 0x01d2a543, 0x0146859f, 0x000be66a}}, Y: Field{[10]uint32{0x0389fc53, 0x0153dd37, 0x039fa128, 0x02753a35, 0x0236ecba, 0x03982164, 0x024ed246, 0x03aa891e, 0x0182d3ca, 0x000f9888}}}, + {X: Field{[10]uint32{0x02369baa, 0x03af7467, 0x03a3c177, 0x01d752a0, 0x010e7c56, 0x03889fca, 0x027688c2, 0x014e4005, 0x018957f6, 0x003773ce}}, Y: Field{[10]uint32{0x034b2431, 0x0077004b, 0x01b873da, 0x0233cac4, 0x01c3c342, 0x02437408, 0x01a3ceea, 0x020ce88e, 0x023f3fa6, 0x0029c031}}}, + {X: Field{[10]uint32{0x011ace4f, 0x03441086, 0x0117b73b, 0x02ab02de, 0x0392df1e, 0x024c6716, 0x022fa9e0, 0x008d8067, 0x03b80425, 0x002618e9}}, Y: Field{[10]uint32{0x003b69e6, 0x018d58b8, 0x02b6a3bf, 0x02b93c6c, 0x023a1fa7, 0x00928c3a, 0x0309f8c7, 0x02ac852f, 0x01a9281d, 0x00126926}}}, + {X: Field{[10]uint32{0x01733886, 0x02a3d637, 0x01d2e467, 0x03bcf1b5, 0x0219cb4d, 0x012e3a4b, 0x033734a6, 0x01645cd3, 0x01f9ea2c, 0x001b1519}}, Y: Field{[10]uint32{0x020e733c, 0x03f110c7, 0x03c8d3da, 0x017e8701, 0x03768f65, 0x00c66acf, 0x02a2616a, 0x03cd7456, 0x02bb179d, 0x00015f88}}}, + {X: Field{[10]uint32{0x00f3fcdd, 0x01e7c514, 0x03a530d9, 0x0153f9c0, 0x0025acb6, 0x02c281a4, 0x00ca387f, 0x00efac34, 0x0113360b, 0x002acdd5}}, Y: Field{[10]uint32{0x0041be4a, 0x01170bdb, 0x027c5464, 0x01d940fb, 0x0157f0f7, 0x030de9bb, 0x03842f43, 0x00b7966d, 0x0149309a, 0x000fa704}}}, + {X: Field{[10]uint32{0x002603d2, 0x00481e93, 0x03111482, 0x02a7a450, 0x00ff0878, 0x0016c8b4, 0x03aee379, 0x03bac2c8, 0x03ea4a72, 0x001ab2f8}}, Y: Field{[10]uint32{0x030d32b9, 0x032c6777, 0x025330ae, 0x00f39256, 0x02ac2ca2, 0x03279a01, 0x023dad76, 0x01365a85, 0x00be9f93, 0x0007b3bf}}}, + {X: Field{[10]uint32{0x02955d89, 0x03e573ce, 0x008c3653, 0x00141fc7, 0x03b4ddd1, 0x01d9b894, 0x00ac9f9c, 0x00310979, 0x014458fd, 0x001e5574}}, Y: Field{[10]uint32{0x0250aaca, 0x00d40925, 0x01245847, 0x00ec0349, 0x0340c672, 0x00e880a1, 0x02892255, 0x021fc252, 0x01f73043, 0x0023ea71}}}, + {X: Field{[10]uint32{0x01ace377, 0x0083360d, 0x0213228c, 0x02ff95e0, 0x02d488eb, 0x01ef4f68, 0x02b25a22, 0x010cfdc0, 0x010c0090, 0x002d65cb}}, Y: Field{[10]uint32{0x02b008fa, 0x035932d0, 0x03212cf3, 0x0211702f, 0x00e3e78f, 0x005d2cbf, 0x01ef70ed, 0x00f7949e, 0x00bf7fbc, 0x0008d51c}}}, + {X: Field{[10]uint32{0x00bcf886, 0x02d22f41, 0x038e4d9c, 0x01f91257, 0x02cc500d, 0x00f31e7c, 0x004f3bc5, 0x03e9a288, 0x001033a5, 0x002899aa}}, Y: Field{[10]uint32{0x015949f8, 0x022def7d, 0x011ecb56, 0x00916c2e, 0x03d52b78, 0x011bcf8d, 0x00390e6a, 0x0056dd99, 0x01a1958d, 0x000c6a2c}}}, + {X: Field{[10]uint32{0x00b9cc15, 0x03908751, 0x03123451, 0x00fdf783, 0x01ae7f4f, 0x03a7df08, 0x03bf47e1, 0x006d8d6e, 0x02ec2119, 0x00071904}}, Y: Field{[10]uint32{0x002c685a, 0x0188a131, 0x0169d82a, 0x006c8bfe, 0x016e7fec, 0x000958c2, 0x0173851d, 0x0313cfd6, 0x022c1111, 0x0020cfe2}}}, + {X: Field{[10]uint32{0x020b7fda, 0x018841cf, 0x01f68a74, 0x01f17989, 0x03817267, 0x03b813fc, 0x019ccbef, 0x016d5e70, 0x02ab1757, 0x003b8d4c}}, Y: Field{[10]uint32{0x027e8718, 0x03d1441b, 0x00f53a9a, 0x02d24acb, 0x0304b704, 0x03123b9a, 0x01ff04dc, 0x0261ee0f, 0x00c8b2fd, 0x003c4b84}}}, + {X: Field{[10]uint32{0x021a3838, 0x011367fb, 0x0115e379, 0x012c0259, 0x0152ef9a, 0x01fd6d2f, 0x012765af, 0x01e4dcbb, 0x03be0486, 0x0017b443}}, Y: Field{[10]uint32{0x00080573, 0x03218ced, 0x028af2a8, 0x01ed7ef1, 0x02a4bffd, 0x00977399, 0x00ac6410, 0x00e493b6, 0x01b49fbe, 0x002313ae}}}, + {X: Field{[10]uint32{0x001378d2, 0x00754d74, 0x0152a15a, 0x0165c208, 0x01b8f6b8, 0x01cd0838, 0x03e7345f, 0x0217b5a7, 0x0221f04c, 0x003f8d22}}, Y: Field{[10]uint32{0x001f2b7b, 0x0273f482, 0x019117fa, 0x00f5f67e, 0x03506947, 0x038e3908, 0x02abd103, 0x02afd173, 0x0046c9f5, 0x00356575}}}, + {X: Field{[10]uint32{0x032436e9, 0x0221d17e, 0x0223dbda, 0x02730245, 0x03b57367, 0x016e8e5c, 0x021e1c0b, 0x012e8021, 0x0369b7b6, 0x0001c500}}, Y: Field{[10]uint32{0x03a12b2d, 0x01da9520, 0x010ad1f3, 0x01881cb1, 0x0240dfa3, 0x003199cb, 0x003bc213, 0x02581ca3, 0x0350f979, 0x003c1dc0}}}, + {X: Field{[10]uint32{0x01dad15d, 0x020855e6, 0x01bd40aa, 0x036ea0e0, 0x020a7465, 0x0048c025, 0x02c6b88b, 0x0078eb9f, 0x00e48e98, 0x001b4531}}, Y: Field{[10]uint32{0x03e0f841, 0x016c1439, 0x0299a50e, 0x023ed6fa, 0x01f9c6de, 0x02d62cb5, 0x02635f6d, 0x0344aa93, 0x02aaa5f2, 0x00097934}}}, + {X: Field{[10]uint32{0x024383da, 0x036c2bc6, 0x0228daea, 0x01c416ed, 0x004dffe0, 0x015413a2, 0x020558e5, 0x01f5f8d8, 0x01c6a683, 0x001e4c6e}}, Y: Field{[10]uint32{0x03e80c0b, 0x033fb7be, 0x002ff9d5, 0x0012108b, 0x0196b7a9, 0x03cef4e3, 0x0112128b, 0x00971b77, 0x02733209, 0x00161b2a}}}, + {X: Field{[10]uint32{0x01cec834, 0x03342f79, 0x03d95b0e, 0x01149eaa, 0x0088dca1, 0x005462e2, 0x00e1f32a, 0x00f50d74, 0x016a35b8, 0x000527a7}}, Y: Field{[10]uint32{0x025606f5, 0x01d316b3, 0x02e1fcbc, 0x03300641, 0x00f87b11, 0x03404bed, 0x01d49b38, 0x033197a4, 0x02a0fd84, 0x0011601e}}}, + {X: Field{[10]uint32{0x01297394, 0x026f49c3, 0x03ff7b80, 0x025b0a12, 0x001bf6e6, 0x01e52404, 0x02f2b59d, 0x0146a088, 0x036eb4b3, 0x00195ac9}}, Y: Field{[10]uint32{0x03763291, 0x01cca05e, 0x025d9b64, 0x034feaa3, 0x03905eb6, 0x0038d624, 0x00ebfa9a, 0x010e8a4a, 0x03095f86, 0x0021d1bc}}}, + {X: Field{[10]uint32{0x031eb02e, 0x012d8283, 0x000a6988, 0x00814e62, 0x033656a7, 0x01e14b87, 0x022370ff, 0x01a627b9, 0x01e36808, 0x00183ce6}}, Y: Field{[10]uint32{0x0044ad59, 0x02cadbf5, 0x0267d4f1, 0x03f937bc, 0x039e5976, 0x0082dde7, 0x0251676d, 0x02f85214, 0x005a8347, 0x00157728}}}, + {X: Field{[10]uint32{0x006eaa13, 0x036f9062, 0x00e0d4ca, 0x016a4063, 0x01034a30, 0x013e6f70, 0x006f4175, 0x02907029, 0x03030a67, 0x00136f68}}, Y: Field{[10]uint32{0x03a48fc4, 0x01616e0f, 0x03970c22, 0x025748f5, 0x01909a3b, 0x010cedd1, 0x01f9fe64, 0x00d16359, 0x0086fec3, 0x003818b3}}}, + {X: Field{[10]uint32{0x010363d1, 0x03ca8037, 0x03111d07, 0x0313d256, 0x03f8c8b1, 0x0360671a, 0x03c10c8f, 0x01336569, 0x01ca04d6, 0x00205ab8}}, Y: Field{[10]uint32{0x02526009, 0x03470619, 0x0366b2df, 0x03c83524, 0x03b12187, 0x03a744ee, 0x02a55208, 0x035bf55b, 0x03ffc331, 0x003027da}}}, + {X: Field{[10]uint32{0x0081b52b, 0x00636be0, 0x020a000f, 0x011305b5, 0x01872029, 0x0178a22b, 0x032b8fae, 0x03829f0e, 0x039c983f, 0x001160e7}}, Y: Field{[10]uint32{0x01dd8649, 0x02169a99, 0x004db2a7, 0x01af3684, 0x01aff40c, 0x0020d6be, 0x01f7beb3, 0x013ad020, 0x02074de7, 0x003e4da3}}}, + {X: Field{[10]uint32{0x00223465, 0x016dba35, 0x00d5063c, 0x01f6c8ef, 0x0244b715, 0x0309153c, 0x004c482e, 0x0080ec78, 0x02483a49, 0x00142b92}}, Y: Field{[10]uint32{0x015f3008, 0x02e8df9f, 0x0065836d, 0x00a170d9, 0x010a6190, 0x0160ef69, 0x032031ec, 0x00b87d97, 0x03d7e7bd, 0x00386e33}}}, + {X: Field{[10]uint32{0x016b72d6, 0x010657d8, 0x039dba69, 0x012fb49b, 0x03c5d8bb, 0x0086b39d, 0x02dde15b, 0x01422467, 0x02316039, 0x0037ddec}}, Y: Field{[10]uint32{0x034344a4, 0x03254022, 0x0303717d, 0x0032ccfc, 0x00c99e27, 0x019cd997, 0x00cff822, 0x02fef2e2, 0x01b89ece, 0x002292dd}}}, + {X: Field{[10]uint32{0x0233277d, 0x02c2e3bc, 0x01345437, 0x02358ecb, 0x016d2d23, 0x0009d01d, 0x00419d67, 0x00bc62dd, 0x0219978e, 0x003b1b03}}, Y: Field{[10]uint32{0x0236e553, 0x018fc2c9, 0x02d8a4a3, 0x01a05cf3, 0x0296bd39, 0x016ff931, 0x0171dc13, 0x03133189, 0x039a02df, 0x003e436a}}}, + {X: Field{[10]uint32{0x017b3329, 0x00640458, 0x03e4ba46, 0x0215214a, 0x005af2a8, 0x029c8886, 0x014eacb1, 0x03f39a9b, 0x016f90e7, 0x000a1d10}}, Y: Field{[10]uint32{0x02eb4466, 0x0374997a, 0x0282d448, 0x01256d36, 0x03b8628e, 0x0244ab5f, 0x024c9af7, 0x0359222e, 0x0275f6ce, 0x0007cc8d}}}, + {X: Field{[10]uint32{0x00ff4247, 0x02b3cfdc, 0x01d2be7d, 0x032e25f2, 0x02529de5, 0x00edb74f, 0x0087f3e8, 0x00ea03e3, 0x03ec586d, 0x0021c8d9}}, Y: Field{[10]uint32{0x02a3ac05, 0x01a144a9, 0x02eeceef, 0x032792d8, 0x017dc571, 0x0109f802, 0x00768b5e, 0x0210ede2, 0x00e0fae0, 0x00396ed8}}}, + {X: Field{[10]uint32{0x024713cc, 0x02368f90, 0x01f4891b, 0x02c84efc, 0x004339a0, 0x00312bcd, 0x0030ce94, 0x03f4c2b9, 0x00040baf, 0x003043c8}}, Y: Field{[10]uint32{0x0231c7ee, 0x00dfef61, 0x02e59c35, 0x01e58d0f, 0x03bf6dbf, 0x00fe0bb7, 0x006d456b, 0x026cdb15, 0x0055f0c3, 0x000defa4}}}, + {X: Field{[10]uint32{0x00d847c5, 0x01b7651c, 0x0059da35, 0x02cee4ef, 0x00733b8b, 0x00cd4fa0, 0x01f0f150, 0x00c015af, 0x02e191c8, 0x0005384b}}, Y: Field{[10]uint32{0x03efcfb2, 0x01438ea6, 0x020dab15, 0x00c80634, 0x01d487f0, 0x019b5c91, 0x0332ba7c, 0x005e044a, 0x038ee00c, 0x003a5c1e}}}, + {X: Field{[10]uint32{0x009fdf36, 0x01e08f12, 0x003057b5, 0x02d2ba01, 0x003687ea, 0x02b414f9, 0x00dd89f6, 0x00de774b, 0x021e2583, 0x0036b0ee}}, Y: Field{[10]uint32{0x03e2c041, 0x011d171b, 0x03fa4761, 0x010bf4de, 0x02d13a69, 0x00b47b13, 0x0020ab1c, 0x00546557, 0x024d8821, 0x001178f6}}}, + {X: Field{[10]uint32{0x03800bf4, 0x01373faf, 0x00b09264, 0x02eff74b, 0x00a2507d, 0x000e968b, 0x039fad0b, 0x021abba1, 0x027a05c0, 0x00366ff1}}, Y: Field{[10]uint32{0x02be6730, 0x00518d00, 0x02ca42fc, 0x023ac8f9, 0x02e5bb4e, 0x024d243d, 0x036c8b1e, 0x03d6f454, 0x014b5a39, 0x00380577}}}, + {X: Field{[10]uint32{0x0196c61e, 0x01861cde, 0x00b34007, 0x00704bdb, 0x028a9a98, 0x03659660, 0x00d7e581, 0x03283c5c, 0x00522f04, 0x00379bcd}}, Y: Field{[10]uint32{0x032a0cc7, 0x00153bbd, 0x00e3b826, 0x0053fc09, 0x012fc6d8, 0x00d3857c, 0x039c251f, 0x013ea50e, 0x033b28d7, 0x0007b05b}}}, + {X: Field{[10]uint32{0x00e30eaf, 0x02fe0a28, 0x00d93f54, 0x00e93ea3, 0x02b35c87, 0x00d94a0f, 0x00a15ef2, 0x005eba21, 0x0355338e, 0x0010caac}}, Y: Field{[10]uint32{0x01447807, 0x00f73fe5, 0x02b9e870, 0x0029f61a, 0x01caa9af, 0x00830429, 0x023e0767, 0x0036fc22, 0x02a10a13, 0x003d5819}}}, + {X: Field{[10]uint32{0x037c4d99, 0x0102359f, 0x02afa35a, 0x0036d6fa, 0x008d9699, 0x02550c75, 0x010f546d, 0x009f0e8d, 0x0107cfa1, 0x000f4b8d}}, Y: Field{[10]uint32{0x035f74f2, 0x015564e8, 0x02ac51b2, 0x0020aef4, 0x017f4a05, 0x003e288d, 0x01655cab, 0x030dcc51, 0x005f4711, 0x00369822}}}, + {X: Field{[10]uint32{0x00ba87ef, 0x01b94609, 0x0183f457, 0x03180646, 0x03f781c7, 0x017cedc6, 0x0029d0a5, 0x0352f8df, 0x031cb96d, 0x001fcfd0}}, Y: Field{[10]uint32{0x00b8bfec, 0x032009d8, 0x021c1695, 0x03093a45, 0x02cfdb08, 0x01c5dee5, 0x00259f6f, 0x034930ae, 0x03457649, 0x003d37d0}}}, + {X: Field{[10]uint32{0x03687143, 0x00129fcb, 0x017163d6, 0x0357c4a3, 0x026f7b67, 0x015639ab, 0x036cdd8b, 0x01c00112, 0x0359f2c8, 0x00109c2f}}, Y: Field{[10]uint32{0x01a99315, 0x023aaf53, 0x0174e0d0, 0x0037b494, 0x006c4a18, 0x01689549, 0x025da0a1, 0x03e465a1, 0x00ef2e8f, 0x00000d63}}}, + {X: Field{[10]uint32{0x03603852, 0x0256e31f, 0x02ebd46f, 0x02ac3af8, 0x01b7931c, 0x0147194e, 0x013af50d, 0x03f27104, 0x022b9930, 0x003198dc}}, Y: Field{[10]uint32{0x025ecfab, 0x01c237a4, 0x0313f719, 0x0231e3e3, 0x020b9476, 0x00f292cc, 0x0132a310, 0x008f63ad, 0x03b32cdf, 0x000d10f9}}}, + {X: Field{[10]uint32{0x006c4e14, 0x023c58b2, 0x0214f21f, 0x03ce56b9, 0x010168e8, 0x019b95fe, 0x03d7b65c, 0x03fc0b3a, 0x0064e396, 0x002c0052}}, Y: Field{[10]uint32{0x002eb876, 0x02f92e86, 0x0272cb7d, 0x027a8381, 0x004a80b6, 0x02d4048c, 0x025007da, 0x02537bb9, 0x01d7e2ec, 0x000fdb26}}}, + {X: Field{[10]uint32{0x0284f41a, 0x00310436, 0x03b2e125, 0x03d34919, 0x03c2d735, 0x032e0b90, 0x03329f0c, 0x02768d74, 0x019398fe, 0x00193273}}, Y: Field{[10]uint32{0x024372e9, 0x02544555, 0x0105ec8d, 0x01e3fd42, 0x01c223ef, 0x033b7c12, 0x0206fc6d, 0x0180cf44, 0x00ab71bf, 0x003492d4}}}, + {X: Field{[10]uint32{0x0129b766, 0x03f676f3, 0x02736ab4, 0x03533cc9, 0x00ecccfa, 0x009f6e58, 0x0359706b, 0x0161893d, 0x001d51e0, 0x003ff821}}, Y: Field{[10]uint32{0x01cf2562, 0x001d245e, 0x00a0177c, 0x0244c2cd, 0x03eb5d83, 0x01360193, 0x02c15952, 0x01b0413f, 0x01c9f695, 0x001af47c}}}, + {X: Field{[10]uint32{0x03ca7432, 0x034fe6dd, 0x020fa47f, 0x01873c3c, 0x034b4518, 0x03103479, 0x0138d630, 0x03165eeb, 0x00c0c053, 0x00034774}}, Y: Field{[10]uint32{0x0055976f, 0x0288ef5b, 0x0103280b, 0x02b77a4a, 0x035c9dc5, 0x02aabd9a, 0x03b5628d, 0x0257c0f9, 0x03fdb594, 0x000d2aa5}}}, + {X: Field{[10]uint32{0x028e5779, 0x03b2916b, 0x01d8df99, 0x00106c61, 0x019153f7, 0x03e65bc7, 0x0249cd3a, 0x035fde8f, 0x02e8c76b, 0x0021e90d}}, Y: Field{[10]uint32{0x011006f3, 0x02f9e5fc, 0x02027b6d, 0x03fdaa26, 0x00369ea4, 0x0287f0db, 0x0105d5b2, 0x00e113fe, 0x03f91255, 0x00234b3c}}}, + {X: Field{[10]uint32{0x0327c379, 0x03a7b2f7, 0x016e4b59, 0x0037354e, 0x00180107, 0x023f58bb, 0x00f707da, 0x031100e1, 0x00a74899, 0x00295140}}, Y: Field{[10]uint32{0x03cb2668, 0x00d15c8c, 0x02cae2f3, 0x00fc4768, 0x005315df, 0x00b249fe, 0x035b5e57, 0x02ec1817, 0x004a6d26, 0x00388591}}}, + {X: Field{[10]uint32{0x03d8187b, 0x02f54695, 0x00a9c88f, 0x01c821a4, 0x0328417b, 0x012358c8, 0x01aea85b, 0x0067d3e9, 0x00f799a3, 0x0024dfa9}}, Y: Field{[10]uint32{0x03dc9d9d, 0x03215533, 0x027bbb24, 0x036a9f4f, 0x00fce77b, 0x00510e2b, 0x01ce4afd, 0x02bb22df, 0x03fc9eb4, 0x000a4c69}}}, + {X: Field{[10]uint32{0x03fa6f36, 0x02c1766d, 0x03f07a1e, 0x018e3525, 0x02c70608, 0x02c13fc9, 0x00dbc96c, 0x012a8c81, 0x0076bb91, 0x00141e4f}}, Y: Field{[10]uint32{0x00bdab21, 0x00ff59c1, 0x03fbdeb1, 0x000daec7, 0x03d963b6, 0x0077a7bc, 0x00940df4, 0x001d8ada, 0x0078b5e3, 0x002beabf}}}, + {X: Field{[10]uint32{0x02d8bb5a, 0x025d9bc1, 0x01bf13a2, 0x02098755, 0x01f8da52, 0x02ff86b5, 0x011c5709, 0x03959373, 0x0230fada, 0x0022d801}}, Y: Field{[10]uint32{0x032916c0, 0x0108481a, 0x01f4dc11, 0x026e7080, 0x01788538, 0x0164dd30, 0x005a7c38, 0x010e6bb1, 0x024a3bd0, 0x003efc6d}}}, + {X: Field{[10]uint32{0x038c8458, 0x03cf40b9, 0x027bd635, 0x010c8ac5, 0x021fc616, 0x03ff062e, 0x03c96500, 0x0057b68d, 0x03dde32a, 0x00053a22}}, Y: Field{[10]uint32{0x036f02c9, 0x007bfa65, 0x009d735b, 0x004dd809, 0x035cc2cd, 0x01d6bf82, 0x02355be4, 0x003ea97e, 0x02c3dc24, 0x00020b07}}}, + {X: Field{[10]uint32{0x011c6c06, 0x00bf3d26, 0x00a30a91, 0x024bbf1c, 0x01975a3d, 0x031e2c72, 0x013dc028, 0x0211cb51, 0x00a324b6, 0x00308079}}, Y: Field{[10]uint32{0x00e2dc08, 0x01a7a73c, 0x00cee624, 0x02334e37, 0x02a82f5f, 0x031e1a84, 0x03f3e503, 0x039b423a, 0x015441d6, 0x000098ea}}}, + {X: Field{[10]uint32{0x019db4fb, 0x03443b82, 0x035a70c5, 0x00b9846c, 0x01409418, 0x0060a337, 0x0061b1e1, 0x022cfdc6, 0x025d319a, 0x001025d9}}, Y: Field{[10]uint32{0x027a506a, 0x02dc3540, 0x027a85dc, 0x0255415c, 0x03322a6b, 0x01bffb80, 0x02cd1ef5, 0x00ac7d5d, 0x00ebb1aa, 0x0032835f}}}, + {X: Field{[10]uint32{0x0027fa92, 0x03aad26d, 0x037a445d, 0x007cde94, 0x01371334, 0x02f814b6, 0x02021a04, 0x00a4fb74, 0x007aeff9, 0x0005cf4a}}, Y: Field{[10]uint32{0x02432548, 0x02691b05, 0x00e541fb, 0x00b34fe7, 0x0172e530, 0x015c9519, 0x03c37b58, 0x00621b09, 0x0204f03a, 0x002589b8}}}, + {X: Field{[10]uint32{0x014d4256, 0x0086911a, 0x039e78f1, 0x031a3c7c, 0x01227fb8, 0x0098a6fb, 0x014b03c9, 0x00453cc3, 0x034d001b, 0x003248f1}}, Y: Field{[10]uint32{0x035b3d29, 0x004d1016, 0x002731f4, 0x000f62b5, 0x00c9f918, 0x03c089e2, 0x00d1e08e, 0x004e0842, 0x026bdd5e, 0x00163b6f}}}, + {X: Field{[10]uint32{0x00b92d46, 0x0312adc3, 0x01a57c88, 0x02f9b2e4, 0x0393e5a8, 0x025b3cc7, 0x03104c51, 0x0170b4f7, 0x0106b1f2, 0x0024be9e}}, Y: Field{[10]uint32{0x0087f307, 0x0185d472, 0x0024079a, 0x017b3962, 0x00ae99a7, 0x02f34367, 0x0374db62, 0x007f07a3, 0x02bd7934, 0x00284858}}}, + {X: Field{[10]uint32{0x00639140, 0x02a8f102, 0x0294c691, 0x024412ba, 0x00976a9c, 0x034c3577, 0x008e17ee, 0x01e30aa7, 0x01f6f51f, 0x000dd1df}}, Y: Field{[10]uint32{0x00089872, 0x0357f0aa, 0x037305c2, 0x019bd419, 0x0325c3da, 0x0142c114, 0x006e15de, 0x0195b193, 0x02ed1955, 0x001a9a89}}}, + {X: Field{[10]uint32{0x010521bf, 0x03682637, 0x0359667a, 0x0090db17, 0x00be9bc7, 0x02fc03ec, 0x034e78ca, 0x03ce37e0, 0x02591195, 0x002d6cbb}}, Y: Field{[10]uint32{0x01ddd5e4, 0x01c1b885, 0x03e44314, 0x02c03f63, 0x00cc8bae, 0x0146afa4, 0x01d276d9, 0x00c0211b, 0x03859523, 0x00043cdb}}}, + {X: Field{[10]uint32{0x02a137bb, 0x0116c0f4, 0x03630948, 0x00d5dbb2, 0x02560393, 0x034c1fbc, 0x02415e90, 0x006ff8da, 0x01b8443f, 0x0002c174}}, Y: Field{[10]uint32{0x01066cbc, 0x01fc189f, 0x02f6465f, 0x01200f87, 0x0054098f, 0x03c358fe, 0x002a4156, 0x002cb0c4, 0x024bddc9, 0x00267fb3}}}, + {X: Field{[10]uint32{0x01d918fd, 0x01aba281, 0x03179de7, 0x0219b342, 0x03d69dcd, 0x025496d6, 0x03d703ae, 0x02cef73b, 0x01bd4778, 0x003975c4}}, Y: Field{[10]uint32{0x01b64248, 0x0070d71b, 0x01327542, 0x0092bce2, 0x009685d5, 0x03fbd5a4, 0x0088e218, 0x016ca683, 0x00ae5aa0, 0x0022bc05}}}, + {X: Field{[10]uint32{0x02fa4f30, 0x007de1a1, 0x03eb9f4f, 0x00471092, 0x001e217d, 0x0344de66, 0x031c6fc4, 0x0120beff, 0x02b8377a, 0x001dc0f2}}, Y: Field{[10]uint32{0x0084e8b3, 0x000d5c7a, 0x03f0a8e9, 0x03b5082b, 0x008dd329, 0x015a324b, 0x02247fd5, 0x02e36f1f, 0x01d13c80, 0x000cc8fb}}}, + {X: Field{[10]uint32{0x014f3cc8, 0x017d8985, 0x03085540, 0x00b3052c, 0x032c87da, 0x00a910d5, 0x02cf7225, 0x02d220d9, 0x0329c18b, 0x003e0d2b}}, Y: Field{[10]uint32{0x015ab248, 0x0007fb6f, 0x015c2820, 0x0311c5d8, 0x026bd8f7, 0x03f56f31, 0x027dc094, 0x01068a78, 0x02c0ca54, 0x000ba282}}}, + {X: Field{[10]uint32{0x03bbaee0, 0x01d0cd92, 0x03a794c7, 0x01f40740, 0x0213bbcd, 0x007614ab, 0x038ee845, 0x00f18076, 0x013d13f3, 0x001e0ec2}}, Y: Field{[10]uint32{0x00ae5b4b, 0x0326e09d, 0x001ab66e, 0x031c105c, 0x036b5fb1, 0x03b0b3be, 0x00dbfb20, 0x01aaffe8, 0x0301cfde, 0x000eaa42}}}, + {X: Field{[10]uint32{0x001c3391, 0x00b69678, 0x022666f9, 0x02087062, 0x033ae42e, 0x023bcb1d, 0x00a243b4, 0x002e6405, 0x0035a777, 0x002f8f31}}, Y: Field{[10]uint32{0x00e4a701, 0x02a49d97, 0x01c51e6a, 0x00149775, 0x00a560f7, 0x0187af16, 0x01fc64de, 0x02316056, 0x01360911, 0x003c34ef}}}, + {X: Field{[10]uint32{0x003b606d, 0x0024a15e, 0x02a08fc9, 0x001a115d, 0x0197f89e, 0x03fb86b8, 0x03624545, 0x0003bbf8, 0x03d7adac, 0x000fa602}}, Y: Field{[10]uint32{0x01c5c228, 0x00ccffba, 0x0088a34d, 0x00c14ff5, 0x0367455e, 0x03824451, 0x00734347, 0x0251b1d1, 0x0241204c, 0x003193c3}}}, + {X: Field{[10]uint32{0x0182b442, 0x02f3ecb5, 0x027c335b, 0x01517757, 0x0291d7b1, 0x025e435c, 0x0159bf12, 0x0079a8d2, 0x0140aa62, 0x0029ac10}}, Y: Field{[10]uint32{0x03cce830, 0x00705a6a, 0x0137f804, 0x0363b90b, 0x03a997f8, 0x010abdb9, 0x021d1515, 0x01765d79, 0x01e29cc0, 0x00272cb2}}}, + {X: Field{[10]uint32{0x03fa721b, 0x02038a91, 0x002e51f2, 0x00b4888e, 0x0229ba43, 0x00a6cb0e, 0x009a6a1b, 0x032e3e84, 0x003fc133, 0x001fa9ea}}, Y: Field{[10]uint32{0x0299d7e8, 0x01f763a9, 0x031b45bb, 0x01d78e15, 0x026aabab, 0x03450c29, 0x01c5562a, 0x01dcc60c, 0x00e88a1f, 0x0032f8e1}}}, + {X: Field{[10]uint32{0x010fa042, 0x00ab2982, 0x026c8d84, 0x03b851aa, 0x008189f9, 0x0052e9b5, 0x002b5fca, 0x027af8be, 0x007ef0fc, 0x0021497a}}, Y: Field{[10]uint32{0x0332c86f, 0x01c39d5a, 0x022a686c, 0x0391f7f8, 0x00192873, 0x028d295c, 0x02a393f2, 0x028f3c60, 0x0278f311, 0x00373c1a}}}, + {X: Field{[10]uint32{0x03d56dce, 0x029ed06e, 0x00fc0952, 0x03cdb341, 0x0316daff, 0x0197fa59, 0x0129c337, 0x0034327b, 0x037dfa05, 0x001d5569}}, Y: Field{[10]uint32{0x03152177, 0x035bc7c5, 0x019cfd0b, 0x024a0c1a, 0x0118dc03, 0x002bcc44, 0x03d0a3cd, 0x03707f62, 0x00a7bdc3, 0x00261530}}}, + {X: Field{[10]uint32{0x02ac296b, 0x03b85f66, 0x02f710be, 0x02eefb98, 0x00972bb3, 0x00cf8031, 0x026f0261, 0x036b0453, 0x02a07a0a, 0x0027b450}}, Y: Field{[10]uint32{0x037a9d08, 0x0142880a, 0x03f6a391, 0x02144709, 0x009f4dca, 0x01a66bd4, 0x00d4006f, 0x038ee349, 0x02416c80, 0x00307aba}}}, + {X: Field{[10]uint32{0x03c56b79, 0x00ec6a37, 0x029d5fb1, 0x0310b805, 0x00c9d761, 0x00463f60, 0x02aa67c8, 0x02333424, 0x00b3784d, 0x0028ff4b}}, Y: Field{[10]uint32{0x007ea755, 0x02ff56fe, 0x01f6d659, 0x03c9e827, 0x02b0d13d, 0x03243562, 0x00fcdd48, 0x0157cb54, 0x034155db, 0x001d7366}}}, + {X: Field{[10]uint32{0x005ad251, 0x014880d8, 0x0142fc99, 0x038a2edb, 0x01554338, 0x02703884, 0x01ad598b, 0x01fba1e6, 0x0205217e, 0x000aad2f}}, Y: Field{[10]uint32{0x0076d853, 0x03d78c55, 0x01dc7bd8, 0x0320f231, 0x03b788af, 0x00f8791e, 0x008c8eb8, 0x01b529ff, 0x0258da06, 0x000b0a86}}}, + {X: Field{[10]uint32{0x0248c383, 0x02959ee1, 0x033592ce, 0x002767e3, 0x0308c95d, 0x019bb33a, 0x02268af5, 0x006ababd, 0x0088af8c, 0x0012bf0a}}, Y: Field{[10]uint32{0x004f5eed, 0x0164cdaa, 0x0005458b, 0x012f8778, 0x03cf3f28, 0x03a671fa, 0x01025797, 0x03a4ba62, 0x03825e69, 0x002c789a}}}, + {X: Field{[10]uint32{0x018e3d4a, 0x00086d4b, 0x0188b548, 0x03236bf6, 0x02f63f5f, 0x02b070ac, 0x0038600a, 0x0274b920, 0x03aa9231, 0x00376003}}, Y: Field{[10]uint32{0x0039ed7d, 0x006a5dc4, 0x0260ce8e, 0x024853fb, 0x028fdbc1, 0x006206f1, 0x02522ac9, 0x01a35d83, 0x00926e04, 0x00167fa0}}}, + {X: Field{[10]uint32{0x02378c91, 0x029d3cf1, 0x017e2af5, 0x0209b7e7, 0x0007bb51, 0x02bec1fe, 0x039bc886, 0x0297e226, 0x03d1daa3, 0x00212abc}}, Y: Field{[10]uint32{0x0035afbb, 0x030a920e, 0x030e8011, 0x021add13, 0x03a04fd5, 0x0333825a, 0x0331218e, 0x0375be98, 0x02b845ea, 0x003d0592}}}, + {X: Field{[10]uint32{0x03c40b2b, 0x02b4ea09, 0x02fcc8ad, 0x0202e233, 0x00d2ffc1, 0x037feda4, 0x02823a3a, 0x0276e2a4, 0x02c39e2e, 0x002ddc3c}}, Y: Field{[10]uint32{0x000d53e6, 0x01667a37, 0x0122e79f, 0x025f29b3, 0x037e319c, 0x01ba9593, 0x01b90a91, 0x01260974, 0x02370989, 0x0003df1b}}}, + {X: Field{[10]uint32{0x02bb2b29, 0x00879fae, 0x0336236a, 0x021c924f, 0x017cb1db, 0x02c41f32, 0x0145c5fb, 0x039559c0, 0x00a8a0d7, 0x00298182}}, Y: Field{[10]uint32{0x0354de5f, 0x009715de, 0x00e1906f, 0x007ed603, 0x01a289c9, 0x03528e06, 0x0006f906, 0x01152259, 0x027c4e41, 0x000d08d4}}}, + {X: Field{[10]uint32{0x03414597, 0x02d926d4, 0x032d921e, 0x03dff2af, 0x0320f6b0, 0x0324469c, 0x02b4e5fc, 0x00e4e979, 0x00f97b7f, 0x00203d1c}}, Y: Field{[10]uint32{0x03d9adc3, 0x033a7c4a, 0x03e4afa1, 0x01392d6d, 0x03770fa1, 0x004f0fce, 0x028faea0, 0x02f8304c, 0x02f96e1b, 0x0015f63c}}}, + {X: Field{[10]uint32{0x015abb6f, 0x032ccea6, 0x017fe261, 0x036c7c0e, 0x0072e4a3, 0x01929ed6, 0x03f0096c, 0x012330ff, 0x03f21f52, 0x00138446}}, Y: Field{[10]uint32{0x02eb2b9f, 0x02b2eda5, 0x02b0f6d5, 0x0050c7ea, 0x00c03af6, 0x0182f64c, 0x01829c1d, 0x00cefd7f, 0x01721027, 0x0009273c}}}, + {X: Field{[10]uint32{0x022844c9, 0x005b1a31, 0x034f0184, 0x0037ce05, 0x00960cb7, 0x0083a17b, 0x0254660a, 0x00763040, 0x00b547fa, 0x001f6303}}, Y: Field{[10]uint32{0x0335a271, 0x00015c57, 0x00743404, 0x02b87daf, 0x0372b0f1, 0x00d633f4, 0x017335bf, 0x0135e685, 0x023c17ec, 0x000b5e6e}}}, + {X: Field{[10]uint32{0x030a0034, 0x00aabe59, 0x013aaf61, 0x02e26d65, 0x0014b132, 0x016a7cbc, 0x023d48fa, 0x01be95fc, 0x00bd9589, 0x002f0353}}, Y: Field{[10]uint32{0x03a0639d, 0x0283d20b, 0x01412480, 0x00fca3a9, 0x0383d756, 0x015dcef2, 0x02410915, 0x019605e9, 0x02707b31, 0x003d7419}}}, + {X: Field{[10]uint32{0x02d37a40, 0x039c3ead, 0x006a42df, 0x029a9f99, 0x015cceb0, 0x024c8785, 0x02ddbe1c, 0x03445657, 0x02aead08, 0x002c5528}}, Y: Field{[10]uint32{0x0216592a, 0x01794fcc, 0x00756c8b, 0x0234278f, 0x0217120d, 0x0257225b, 0x01e586f6, 0x0344af40, 0x0221674d, 0x0026aeb7}}}, + {X: Field{[10]uint32{0x0372e1e4, 0x01729615, 0x03325531, 0x0159f91d, 0x02314be7, 0x0107f8b9, 0x013bc318, 0x001bc9c1, 0x0034a6ce, 0x003bd80f}}, Y: Field{[10]uint32{0x009ad65d, 0x02b965f1, 0x00f5164a, 0x023cef42, 0x0115fced, 0x0206688c, 0x03a7e57d, 0x02c2e648, 0x022896f3, 0x003e7aef}}}, + {X: Field{[10]uint32{0x02aa9376, 0x0388ffa0, 0x016e2c04, 0x03686b12, 0x01014f7b, 0x02b70010, 0x01a05d91, 0x007aeeb5, 0x036c2d90, 0x00298045}}, Y: Field{[10]uint32{0x02e88ab8, 0x0228c0c6, 0x01e68f8c, 0x03e74fab, 0x03d59abc, 0x03a450dd, 0x032fb849, 0x00d924dd, 0x01b7ce0c, 0x003de077}}}, + {X: Field{[10]uint32{0x0031e6a7, 0x00c54e57, 0x007eb273, 0x03bcea40, 0x03b1c7f0, 0x0326a409, 0x03968b9b, 0x00413bea, 0x0147b6b3, 0x002af105}}, Y: Field{[10]uint32{0x017e0ec9, 0x02e28df6, 0x00dce879, 0x034d498a, 0x03594c5b, 0x035e0e66, 0x00a1821d, 0x0075bef6, 0x00a228f2, 0x00334a16}}}, + {X: Field{[10]uint32{0x007f5a81, 0x038e85f6, 0x008a92f2, 0x029b4c6d, 0x02941d1d, 0x009b904e, 0x024c4300, 0x031c86cb, 0x010500c9, 0x0024a240}}, Y: Field{[10]uint32{0x0260a5da, 0x025fca36, 0x03e2bb30, 0x02669f2f, 0x0015c223, 0x004ed1f1, 0x0032e17c, 0x03185c79, 0x007b1bdc, 0x003072b6}}}, + {X: Field{[10]uint32{0x037ca563, 0x01129f70, 0x00228ad1, 0x0201af59, 0x00500a7a, 0x0251da43, 0x02468319, 0x00d7291a, 0x02a69f4b, 0x00394837}}, Y: Field{[10]uint32{0x022a82de, 0x02c34f22, 0x03356638, 0x002b6d9c, 0x01e2330b, 0x02b538b6, 0x0355dda6, 0x023efa40, 0x0366ac3f, 0x001b0035}}}, + {X: Field{[10]uint32{0x017fadc4, 0x00b5c071, 0x03fb3750, 0x005463c3, 0x02ac2e93, 0x035bbc97, 0x03d18a79, 0x03c70695, 0x0223e2b3, 0x00300cde}}, Y: Field{[10]uint32{0x00808b65, 0x00851bd4, 0x021eccdd, 0x00e3db81, 0x017ac7e9, 0x001e95c3, 0x029c3d5b, 0x037cd51c, 0x0073be22, 0x003f3a96}}}, + {X: Field{[10]uint32{0x0181ac04, 0x0049e6ca, 0x0193cfa5, 0x02583d4d, 0x001b796a, 0x00b47589, 0x01fb6a76, 0x00b01dad, 0x02bb6a8e, 0x0009db18}}, Y: Field{[10]uint32{0x021afc1a, 0x00ba85db, 0x0292b73e, 0x01e0223d, 0x00773c45, 0x01a588db, 0x01284d7d, 0x000748fe, 0x025abb6b, 0x001714e9}}}, + {X: Field{[10]uint32{0x01663a5f, 0x00776fa3, 0x01ed4fad, 0x01bd9ea7, 0x00c4a2de, 0x00f23b79, 0x037ccdd4, 0x00770ae0, 0x0287e505, 0x00181387}}, Y: Field{[10]uint32{0x03429bee, 0x001ac9e2, 0x0034902d, 0x01ce670d, 0x02ace4c4, 0x01113618, 0x014d6759, 0x0065ce4f, 0x023ce351, 0x003dc3f8}}}, + {X: Field{[10]uint32{0x0041f6fa, 0x038e21d7, 0x00eec3b6, 0x02bbdf93, 0x024aba16, 0x03a40e6e, 0x00b05be5, 0x02441b56, 0x011f470d, 0x003cbf05}}, Y: Field{[10]uint32{0x01e98de0, 0x02a485b8, 0x037b85d2, 0x01ce705a, 0x00d41887, 0x001da418, 0x027f2d6e, 0x01718f63, 0x02c7f1aa, 0x003d26f4}}}, + {X: Field{[10]uint32{0x000ac560, 0x0240b84d, 0x00315eb0, 0x025359ac, 0x007ee0b2, 0x0391babe, 0x001d9cd7, 0x00d3bcee, 0x03460e9f, 0x002380c4}}, Y: Field{[10]uint32{0x00394296, 0x00517e4b, 0x00dca450, 0x023003b0, 0x02006b02, 0x03b81413, 0x027441c0, 0x00787944, 0x00bda5e2, 0x003fc032}}}, + {X: Field{[10]uint32{0x01a9970b, 0x027d03f9, 0x01a0a96b, 0x02cea174, 0x03d4e26e, 0x02ca553a, 0x021cbe16, 0x01ea3c9e, 0x031ad75b, 0x002a1a03}}, Y: Field{[10]uint32{0x02070c01, 0x0065cef9, 0x024c6950, 0x02fb10a5, 0x02757401, 0x00fd4a25, 0x03281f2a, 0x036b18e5, 0x0341a55b, 0x001831af}}}, + {X: Field{[10]uint32{0x004f4658, 0x039b1bd4, 0x03066128, 0x00035372, 0x0009ca8c, 0x002171e5, 0x03407c05, 0x00ba8780, 0x01e7f4d8, 0x00135a28}}, Y: Field{[10]uint32{0x03d1ce76, 0x009979e8, 0x02af4d36, 0x0028e99c, 0x0126a955, 0x030db75b, 0x0295d2d2, 0x00da44aa, 0x0211e5dd, 0x00217177}}}, + {X: Field{[10]uint32{0x02c2a7a9, 0x02882bb9, 0x024835c6, 0x0306b9e2, 0x01758c0b, 0x0340bace, 0x003cdc1b, 0x021925a6, 0x001c2a6d, 0x000dc23d}}, Y: Field{[10]uint32{0x03ec4152, 0x014febea, 0x039e7f45, 0x01171c2b, 0x023c2b71, 0x02aac64f, 0x01ae0f87, 0x03d77572, 0x019e79b7, 0x000c42de}}}, + {X: Field{[10]uint32{0x0115f059, 0x038de028, 0x01a92f6c, 0x0334eaec, 0x022d1a18, 0x00fd6dcc, 0x03961814, 0x02317fc6, 0x01674502, 0x0023220e}}, Y: Field{[10]uint32{0x020725d8, 0x0229f9d8, 0x00e10b00, 0x01097237, 0x0040128e, 0x019b761f, 0x03441800, 0x01212830, 0x02d4e4ae, 0x0009158e}}}, + {X: Field{[10]uint32{0x018f8fb0, 0x0387fd35, 0x0305d0a0, 0x03098d08, 0x03652e83, 0x0129c98e, 0x010fd1a9, 0x01eb4ef7, 0x036a7b37, 0x00311179}}, Y: Field{[10]uint32{0x03acc89d, 0x033a9872, 0x01b8cc94, 0x039c8c19, 0x02f60ae2, 0x02ab9f71, 0x03bd3c13, 0x036d84eb, 0x001adc8d, 0x0012fd69}}}, + {X: Field{[10]uint32{0x02419f16, 0x03d976a3, 0x02e8deb2, 0x017bb6ab, 0x0236949d, 0x0292e7f5, 0x019f1d4d, 0x00d7f983, 0x013ac8a6, 0x0012b658}}, Y: Field{[10]uint32{0x00b0d7c4, 0x02d2545a, 0x0331642a, 0x01ded2c1, 0x01387458, 0x03c6a06e, 0x0131c83e, 0x0283eceb, 0x03068f67, 0x0016a6d6}}}, + {X: Field{[10]uint32{0x0360c943, 0x0074a7f5, 0x00b0c20d, 0x02f163a4, 0x022e397f, 0x0122a998, 0x0349d776, 0x03f9b26a, 0x02e1958b, 0x002facfa}}, Y: Field{[10]uint32{0x0382c9b8, 0x03bfe200, 0x02678dba, 0x01edaa08, 0x03ec76f2, 0x02a9a36b, 0x01dc6fb5, 0x019eac89, 0x02bef43a, 0x00035691}}}, + {X: Field{[10]uint32{0x0134f397, 0x026867f4, 0x018ab9df, 0x0050f900, 0x034623fc, 0x035281da, 0x03f1daea, 0x0086cef8, 0x02b0bc0e, 0x002aaa6a}}, Y: Field{[10]uint32{0x0342e40b, 0x01c0ee89, 0x0390ed3c, 0x03e2ead9, 0x02d3f094, 0x03e8b6b4, 0x000347e8, 0x00b1969b, 0x03fe1964, 0x000271f5}}}, + {X: Field{[10]uint32{0x0199dc52, 0x035a956b, 0x01356604, 0x01867f57, 0x00d40116, 0x0073e749, 0x017ae86f, 0x03d118bf, 0x028999d6, 0x00154f07}}, Y: Field{[10]uint32{0x0150cebc, 0x002f5bfd, 0x004ed646, 0x0250de4d, 0x013f6fe4, 0x01f17c37, 0x02ba776f, 0x02b169b4, 0x013b8410, 0x0009ad03}}}, + {X: Field{[10]uint32{0x02a1abc8, 0x03afe096, 0x0128ab47, 0x0025567b, 0x00c3d565, 0x01c97581, 0x00dae9c4, 0x023f10e6, 0x01ea3637, 0x00216621}}, Y: Field{[10]uint32{0x000687f5, 0x00c7f3fc, 0x030669e5, 0x02a8f102, 0x020e6e84, 0x02cb458d, 0x02fd9305, 0x02e58eec, 0x02f9fc74, 0x003eb96b}}}, + {X: Field{[10]uint32{0x00368f93, 0x01ef7bbc, 0x0254b0bb, 0x00ca9c31, 0x0189e510, 0x00ee08d1, 0x00bf7c16, 0x01752155, 0x0118679c, 0x0017ec28}}, Y: Field{[10]uint32{0x03c2a2d0, 0x03c6099a, 0x00c70a4c, 0x02b4e765, 0x005b9966, 0x02e5761a, 0x0302111e, 0x005b4efe, 0x01f04a68, 0x0003a355}}}, + {X: Field{[10]uint32{0x00f91dfa, 0x02fa0be5, 0x00302194, 0x0175df39, 0x02bbed44, 0x039c376b, 0x03d737c1, 0x03854f26, 0x034786f3, 0x00029090}}, Y: Field{[10]uint32{0x03beed46, 0x00595239, 0x02496971, 0x02963b04, 0x01a54239, 0x0096da7f, 0x0012f4df, 0x03f6a704, 0x02d6abd9, 0x0009f472}}}, + {X: Field{[10]uint32{0x00c821e7, 0x006e4868, 0x003eef57, 0x0115cac2, 0x00394659, 0x01ca4c43, 0x028213cc, 0x0307ce82, 0x0108063f, 0x0017401d}}, Y: Field{[10]uint32{0x02b2df3a, 0x00744aff, 0x007f939f, 0x0205ac10, 0x02d99bfa, 0x0048e121, 0x00c26056, 0x01681ecb, 0x03c45d05, 0x00394e3e}}}, + {X: Field{[10]uint32{0x002e3db9, 0x00bd7a0a, 0x02a525f8, 0x02a9c737, 0x01e80393, 0x012aadfe, 0x00605a0e, 0x000a1a4d, 0x01b897b1, 0x0028fac9}}, Y: Field{[10]uint32{0x01e7f77d, 0x00f60fdc, 0x00c6f030, 0x022f9a24, 0x036beec5, 0x00a259f1, 0x036baaf1, 0x03117908, 0x00c21430, 0x0038acd5}}}, + {X: Field{[10]uint32{0x0097981b, 0x00b8273a, 0x01f0fff7, 0x01453a8d, 0x021e309e, 0x0043f205, 0x033f51cd, 0x00c80a5b, 0x02208a13, 0x001cfd8c}}, Y: Field{[10]uint32{0x02420179, 0x03b41cc2, 0x01dc4015, 0x01ea286d, 0x02309525, 0x00d26a4b, 0x01f7ded0, 0x03ccbb5b, 0x0159cc78, 0x0010d04a}}}, + {X: Field{[10]uint32{0x00da41af, 0x03b139d2, 0x01bb4ccf, 0x00b7c6ee, 0x00776051, 0x01811992, 0x00d9628f, 0x02d7ce3c, 0x01d1c21b, 0x0017c209}}, Y: Field{[10]uint32{0x025c0cab, 0x0108e7ff, 0x02323b37, 0x02e30925, 0x005becd4, 0x01964a09, 0x031abd5b, 0x03784a13, 0x020e1d95, 0x0037aeb1}}}, + {X: Field{[10]uint32{0x03d84294, 0x00967fbd, 0x0276da10, 0x03ff19a9, 0x02efc26d, 0x03448a53, 0x023f624c, 0x03a7cbeb, 0x02f2b4a8, 0x003310a9}}, Y: Field{[10]uint32{0x03230519, 0x0383850e, 0x016901ba, 0x0385a804, 0x03118a7a, 0x02d7ec5f, 0x03f2adb2, 0x02f417c4, 0x0200f92c, 0x00246c99}}}, + {X: Field{[10]uint32{0x03635a17, 0x0000bb1b, 0x022618f0, 0x035af44d, 0x034de0c5, 0x03bef347, 0x01aad7a8, 0x0384fea0, 0x00e76eeb, 0x001f55b8}}, Y: Field{[10]uint32{0x03fa1ad8, 0x004eb090, 0x01754f7d, 0x03b156a4, 0x00051122, 0x03a9779f, 0x01ca813e, 0x038fb91b, 0x0307fe55, 0x00255189}}}, + {X: Field{[10]uint32{0x03a5be61, 0x015301bd, 0x00dc6add, 0x03f0f1d9, 0x02fba8ca, 0x02b6d5ad, 0x03605b3a, 0x017b12b2, 0x021b4fe8, 0x001e5cad}}, Y: Field{[10]uint32{0x02b8c7d8, 0x0249b24c, 0x037dd9f4, 0x03397516, 0x024764c4, 0x011aa3a4, 0x00f5141c, 0x03e9ba9f, 0x02702642, 0x002e8619}}}, + {X: Field{[10]uint32{0x01025626, 0x00208d75, 0x02e0bbbe, 0x01fcd87e, 0x034344c8, 0x019d3e43, 0x01f63609, 0x00540226, 0x0040347b, 0x003b7229}}, Y: Field{[10]uint32{0x032cd77b, 0x007b3106, 0x024864d0, 0x008a6947, 0x027bf841, 0x034502cb, 0x00c7cefa, 0x02fd666f, 0x03409a14, 0x000be049}}}, + {X: Field{[10]uint32{0x01b16899, 0x021df34f, 0x00d18d54, 0x02fc9558, 0x02d4ea1b, 0x027e6661, 0x0327b571, 0x03d354bd, 0x01c97a8c, 0x002f66d9}}, Y: Field{[10]uint32{0x02fe432d, 0x02638af0, 0x019af7db, 0x00fd77fa, 0x01ee9c8e, 0x02f93e18, 0x00d9e02d, 0x023972fc, 0x01274e87, 0x001673dc}}}, + {X: Field{[10]uint32{0x00f35782, 0x038ab313, 0x02106f3b, 0x00096542, 0x0072d918, 0x01317636, 0x03565714, 0x03a3334d, 0x02381191, 0x0009d8d7}}, Y: Field{[10]uint32{0x00d1ab7d, 0x0264bdc3, 0x00ce9db1, 0x03cdf9ae, 0x00eb5251, 0x03d46eb5, 0x03fa3ab8, 0x021c3401, 0x0247a019, 0x0030d67f}}}, + {X: Field{[10]uint32{0x0321d85c, 0x0377c84e, 0x03261839, 0x03d2577e, 0x00359950, 0x01e803a6, 0x02abad14, 0x014c02a5, 0x00c316c0, 0x001124b7}}, Y: Field{[10]uint32{0x009ad35b, 0x00d3b5f7, 0x02433189, 0x02fe9630, 0x02fafed4, 0x008a7716, 0x03b8c6d2, 0x00790b6f, 0x0371a4e8, 0x0003b7c4}}}, + {X: Field{[10]uint32{0x01f9c67b, 0x02a981bb, 0x03c01279, 0x031b3b8d, 0x0325887f, 0x02f623e3, 0x028a3869, 0x00079637, 0x0040409e, 0x003e0493}}, Y: Field{[10]uint32{0x026fa6bc, 0x01830868, 0x009d3655, 0x0231879d, 0x022b0f00, 0x035fcd98, 0x026269c3, 0x03b82a28, 0x01d1d31f, 0x0003801c}}}, + {X: Field{[10]uint32{0x0205a2b5, 0x0212f0e6, 0x030b1b57, 0x00ce3d57, 0x02ce3aed, 0x03579470, 0x000716ad, 0x03337e8b, 0x0367066e, 0x0033165e}}, Y: Field{[10]uint32{0x00682865, 0x00e9061d, 0x022da74e, 0x039fcfbc, 0x03df52da, 0x00a3a356, 0x0212ec40, 0x010f6747, 0x01fc394a, 0x0004b80c}}}, + {X: Field{[10]uint32{0x005aeda2, 0x034c78a0, 0x022ee6fd, 0x01c698c8, 0x03d4a45f, 0x03549774, 0x01642707, 0x020fef48, 0x02c6bc12, 0x00050b2c}}, Y: Field{[10]uint32{0x02d66ec0, 0x017b7197, 0x02f2e181, 0x03edf1a1, 0x00ed082b, 0x02fb1916, 0x015b7180, 0x0108ab93, 0x0112c72c, 0x002f7a4f}}}, + {X: Field{[10]uint32{0x001d2d3c, 0x03645230, 0x0147968f, 0x01d78fc3, 0x01c33273, 0x02a25dea, 0x016704a1, 0x0165079a, 0x0202dd76, 0x003efd35}}, Y: Field{[10]uint32{0x006afa8d, 0x03c4e5b0, 0x0118d08e, 0x02ca6bdf, 0x00c7b96f, 0x01a3d858, 0x014cae8e, 0x02572e9b, 0x01f799e8, 0x00196d1b}}}, + {X: Field{[10]uint32{0x01bfffb8, 0x0048f863, 0x02bc7c6d, 0x036f3163, 0x01f09436, 0x03053143, 0x0300ea5e, 0x03a3338c, 0x0157bb5f, 0x003bf6d7}}, Y: Field{[10]uint32{0x0203fe01, 0x01ee2900, 0x00deb813, 0x01fb7758, 0x01d444e4, 0x019ef627, 0x019ce931, 0x00318988, 0x0003d9a9, 0x000e420e}}}, + {X: Field{[10]uint32{0x003f35ad, 0x0241d08b, 0x03d74976, 0x03c7ab7a, 0x02921f59, 0x01afcb53, 0x00b36c7b, 0x00155c2d, 0x0334faa3, 0x0016f290}}, Y: Field{[10]uint32{0x021206e3, 0x03489ef0, 0x0345b520, 0x00a8d4fe, 0x0179d27f, 0x03591b6d, 0x03f2fe1c, 0x018fdc8a, 0x02f5e2a6, 0x000f25ee}}}, + {X: Field{[10]uint32{0x01156632, 0x03c7cfd4, 0x00d4c49f, 0x025c69cf, 0x01ff921e, 0x012a9990, 0x018a0f05, 0x03c1956b, 0x03bce90c, 0x0026a876}}, Y: Field{[10]uint32{0x031a4200, 0x00efd00a, 0x012dc651, 0x01eae404, 0x016e0b33, 0x02730449, 0x002f0f0b, 0x03a176e0, 0x001d8bf1, 0x0032fdba}}}, + {X: Field{[10]uint32{0x03c2d408, 0x02a5589c, 0x01b86aba, 0x01bfbfc2, 0x035386e5, 0x037b0a09, 0x01d4d23d, 0x01d9d935, 0x005586ed, 0x000bf1ff}}, Y: Field{[10]uint32{0x01d6285f, 0x0272041a, 0x03f3f54f, 0x01617531, 0x016019a5, 0x000c42d7, 0x037b0c3e, 0x00d2bb91, 0x01e4773c, 0x0016ffda}}}, + {X: Field{[10]uint32{0x034190b2, 0x03332ef4, 0x03f34764, 0x00403cbf, 0x026ef3b2, 0x0037e445, 0x01954878, 0x01bcb10c, 0x0141c3ac, 0x002397ee}}, Y: Field{[10]uint32{0x0110d2ce, 0x026ebaff, 0x02c4b1df, 0x027b73c6, 0x038d29b5, 0x039eccbe, 0x03ae154c, 0x01a38b18, 0x01b15f66, 0x0036f8b0}}}, + {X: Field{[10]uint32{0x033d49c6, 0x006f5842, 0x03690480, 0x001c99a4, 0x02dcfbaa, 0x02a56e36, 0x013389ea, 0x035b7417, 0x03594748, 0x001e96ee}}, Y: Field{[10]uint32{0x034187c0, 0x03b7ab18, 0x03fa7fd4, 0x0073bff8, 0x00ca1386, 0x0048d71a, 0x00b755c6, 0x00cffa36, 0x0043a42d, 0x0030b4a0}}}, + {X: Field{[10]uint32{0x03b76753, 0x03ebc86f, 0x00745f87, 0x0388894d, 0x00917c2f, 0x02d8c738, 0x033ee1b1, 0x00d4c6b9, 0x00bdf0d3, 0x00256fae}}, Y: Field{[10]uint32{0x0064f45b, 0x030bc2c3, 0x00adaa43, 0x020df88c, 0x03b9bd77, 0x01283932, 0x03e269fb, 0x0165d549, 0x0200d9c5, 0x0031b3e1}}}, + {X: Field{[10]uint32{0x02968d25, 0x003488f8, 0x03a32054, 0x0365dae3, 0x03576dbb, 0x002ae5e4, 0x00fa4809, 0x01b700c1, 0x030c6d89, 0x003d13b2}}, Y: Field{[10]uint32{0x0321086a, 0x027cd4f0, 0x038106d1, 0x003d79db, 0x01e20e47, 0x03a91a82, 0x0203c629, 0x010ca5da, 0x00f62964, 0x00151419}}}, + {X: Field{[10]uint32{0x038109de, 0x01274994, 0x01e074fb, 0x0309dc18, 0x01d56d68, 0x03deb899, 0x033ef501, 0x024db985, 0x00d33dbd, 0x002374cb}}, Y: Field{[10]uint32{0x003f1e76, 0x0217dc1f, 0x00851ae9, 0x00968430, 0x00ad158c, 0x011f5b64, 0x012bca8a, 0x02b0814e, 0x025c80da, 0x001ac443}}}, + {X: Field{[10]uint32{0x0237997b, 0x01d77698, 0x01a8c770, 0x00fe2473, 0x010fea5e, 0x01c74113, 0x03bc77eb, 0x03d5e353, 0x0130b0f0, 0x000f52bf}}, Y: Field{[10]uint32{0x018bb9ce, 0x02c7bf01, 0x0093ed83, 0x02af9d21, 0x020ae286, 0x02708eb6, 0x013d4424, 0x03d5fb1e, 0x00e8664d, 0x000a05b8}}}, + {X: Field{[10]uint32{0x01d95ff1, 0x03ff45e1, 0x020200a5, 0x0204b4af, 0x02b83913, 0x01a81ee8, 0x015ccac8, 0x00ec8aca, 0x01fbbeaa, 0x002a6dce}}, Y: Field{[10]uint32{0x03b84f1b, 0x016cabaf, 0x02d401a5, 0x00ae3b5e, 0x00d3c5d4, 0x0310ff7b, 0x016d7323, 0x029abbda, 0x023021d6, 0x00287420}}}, + {X: Field{[10]uint32{0x0203715a, 0x01fd1ae4, 0x03632bb7, 0x019eb3e6, 0x02a37e5d, 0x022d5659, 0x02cc754c, 0x0147aff0, 0x0347e512, 0x003a4025}}, Y: Field{[10]uint32{0x02f9df72, 0x036ad3f3, 0x03907d9c, 0x01e85f38, 0x00756f27, 0x015c6962, 0x03476f25, 0x03e65dc6, 0x01679ea8, 0x000d0962}}}, + {X: Field{[10]uint32{0x021a3f2e, 0x01d90e7c, 0x006c1a83, 0x0104eb13, 0x002108fe, 0x02ccc821, 0x00d09b96, 0x035d3309, 0x00ed55aa, 0x001f8d23}}, Y: Field{[10]uint32{0x00389e5f, 0x033e0fad, 0x020f91ed, 0x00bcd964, 0x01c884c2, 0x010e793d, 0x0065706e, 0x009e5761, 0x038e3b72, 0x000e61d3}}}, + {X: Field{[10]uint32{0x03b1f55a, 0x029d29be, 0x01220aaa, 0x02da2834, 0x038e340f, 0x003f3034, 0x032cdabf, 0x035c055b, 0x02765ec2, 0x0029f759}}, Y: Field{[10]uint32{0x0341d447, 0x029439cb, 0x00e73760, 0x02b5117a, 0x0163710d, 0x02c02efa, 0x02ded9b0, 0x0298f4a4, 0x03f2ab00, 0x002dc246}}}, + {X: Field{[10]uint32{0x03f57025, 0x02354780, 0x03a96a30, 0x00a91a4f, 0x0051c085, 0x01b624d3, 0x0033a481, 0x032fdb70, 0x01e9a8cc, 0x0002e15e}}, Y: Field{[10]uint32{0x0158268b, 0x0337315c, 0x00feca8b, 0x00cdbda5, 0x0242c888, 0x02f046f6, 0x0164a3e0, 0x00546cbc, 0x00df4d79, 0x0039a5bb}}}, + {X: Field{[10]uint32{0x03f57af8, 0x00b0b0af, 0x03cdabb4, 0x007519e1, 0x03184f1c, 0x01ed669f, 0x00c8c72e, 0x002032fe, 0x00459de0, 0x0001eca7}}, Y: Field{[10]uint32{0x03801799, 0x011b7a57, 0x026145dc, 0x02dc97d3, 0x02817578, 0x000ddbb7, 0x0101ca56, 0x0344f506, 0x0367a6d8, 0x001037a0}}}, + {X: Field{[10]uint32{0x02f00f9f, 0x026bf765, 0x0214e017, 0x0276cc7f, 0x030d1c4e, 0x002df940, 0x020e34ef, 0x016f9eb0, 0x026f89b6, 0x00073bfe}}, Y: Field{[10]uint32{0x0276f179, 0x01d12d46, 0x02da979a, 0x03d6f2a9, 0x008e293b, 0x005e4384, 0x018feb78, 0x00c2f7b6, 0x00b1f059, 0x001bf7ba}}}, + {X: Field{[10]uint32{0x01e58d74, 0x0365f645, 0x01e47ca2, 0x03fa8013, 0x0280ba4e, 0x00078bb1, 0x01d01e9a, 0x000715b5, 0x016d11d3, 0x00155b8b}}, Y: Field{[10]uint32{0x0249d711, 0x00b175d4, 0x0096108a, 0x031cbd36, 0x013d66e6, 0x03bb2f26, 0x01ba7eef, 0x035edad5, 0x009bb633, 0x0025620d}}}, + {X: Field{[10]uint32{0x01e51586, 0x02ae45e8, 0x026ba6a7, 0x03d3a7b9, 0x02b97f7b, 0x00ad8ba8, 0x004518a4, 0x00f723b4, 0x028873b9, 0x002cd41b}}, Y: Field{[10]uint32{0x030b3b38, 0x00eb9306, 0x023fd582, 0x027c7e3f, 0x025917a3, 0x02b2ea7f, 0x0293eaa7, 0x03edeff9, 0x01001230, 0x0011d3e0}}}, + {X: Field{[10]uint32{0x012628f3, 0x01d2e5af, 0x00504e97, 0x00e86665, 0x001ba7ff, 0x0243b99f, 0x001a886f, 0x0124236c, 0x02f389cb, 0x0003461a}}, Y: Field{[10]uint32{0x02a2db7d, 0x023dfbbc, 0x0021d5d0, 0x01bfd046, 0x02d01d74, 0x0218bbcd, 0x0378c75a, 0x01f372d1, 0x002bc656, 0x000ece5e}}}, + {X: Field{[10]uint32{0x03987bb7, 0x02215cbb, 0x00d55d67, 0x0200aa04, 0x0119e8c9, 0x018b18e7, 0x02459000, 0x016b08fe, 0x0121e106, 0x003e5476}}, Y: Field{[10]uint32{0x01d7d950, 0x002631fe, 0x0207055d, 0x019aedda, 0x01051abc, 0x03d54ed7, 0x03db2397, 0x03a5d409, 0x01c187f8, 0x00373df7}}}, + {X: Field{[10]uint32{0x00d915ec, 0x00f83eb1, 0x0242ebb5, 0x01d3f20a, 0x038bcbf8, 0x03cd0382, 0x021b75e8, 0x01bf1845, 0x02167bac, 0x002373a3}}, Y: Field{[10]uint32{0x00ae940c, 0x004985f8, 0x03674e32, 0x03d240cb, 0x039c0287, 0x01349bb5, 0x00b410b3, 0x02e7ae6d, 0x03a14a9e, 0x00047394}}}, + {X: Field{[10]uint32{0x01e26e2b, 0x00e7baa6, 0x005dc4f4, 0x016bb56a, 0x02755dfc, 0x0304a9ea, 0x012ed15e, 0x0290f35f, 0x00dda0a7, 0x00338b4f}}, Y: Field{[10]uint32{0x03a5a145, 0x025f1801, 0x0009a36b, 0x0191f886, 0x036a8eed, 0x03160881, 0x035c2853, 0x009d03a9, 0x02bbe7ca, 0x001aa5ab}}}, + {X: Field{[10]uint32{0x00d92092, 0x00e42a37, 0x000f05ea, 0x00295632, 0x00f712c4, 0x020ce492, 0x03367b5c, 0x0353173b, 0x02fcdcc2, 0x0008e519}}, Y: Field{[10]uint32{0x03ac28cd, 0x02157849, 0x0318ed0e, 0x02acedf5, 0x0265d176, 0x023805cd, 0x023ee8e9, 0x03c22f29, 0x023c9b49, 0x003cb388}}}, + {X: Field{[10]uint32{0x0163e033, 0x0297fb8d, 0x0395e0f6, 0x01911d98, 0x034a2f3c, 0x00c7825c, 0x005bcd83, 0x00f02367, 0x0364341d, 0x000882ad}}, Y: Field{[10]uint32{0x02df5011, 0x03360dd5, 0x03f4cf9d, 0x028d5e05, 0x03aa51a9, 0x02d48300, 0x03dc7a42, 0x004fbd19, 0x0060d030, 0x003b0791}}}, + {X: Field{[10]uint32{0x004b469f, 0x03ffa024, 0x03db4ee2, 0x004993e8, 0x02845f0b, 0x00f13443, 0x03ffd81f, 0x01a9b1c3, 0x01fe1640, 0x00355157}}, Y: Field{[10]uint32{0x020aaf9a, 0x00428401, 0x019b8088, 0x03c0abe5, 0x0028a20a, 0x0056125f, 0x01d99e49, 0x00798899, 0x038d257e, 0x00283e4e}}}, + {X: Field{[10]uint32{0x00e60c72, 0x03627ca2, 0x0137e1a9, 0x03e73f07, 0x02f5039c, 0x007bb034, 0x0054665f, 0x03c1777c, 0x0377a1f6, 0x00148d9c}}, Y: Field{[10]uint32{0x02c7bb41, 0x027f1767, 0x01ce6a03, 0x005b663e, 0x00d05e70, 0x038925e8, 0x018d0477, 0x030d4b35, 0x0355430f, 0x001e3627}}}, + {X: Field{[10]uint32{0x03a56395, 0x0377a957, 0x02c9f4c1, 0x03c644b9, 0x01a8e569, 0x01cd9049, 0x023dc886, 0x0250889a, 0x01133ecc, 0x0016e658}}, Y: Field{[10]uint32{0x02436d0a, 0x010abd93, 0x00f19101, 0x02a84226, 0x03f7a0bc, 0x0178bf57, 0x00ac902c, 0x01b2bd76, 0x03641207, 0x002ee75d}}}, + {X: Field{[10]uint32{0x004c13fb, 0x0093ccae, 0x00f0c07c, 0x010f6e5b, 0x03eecd1a, 0x02c299dc, 0x007fa4a5, 0x03479963, 0x035cbfbe, 0x003cdb36}}, Y: Field{[10]uint32{0x018c394c, 0x01b24640, 0x039b9315, 0x039d1e4d, 0x01993744, 0x006d8996, 0x016aee18, 0x03b68a45, 0x02f05ee9, 0x0033f1b4}}}, + {X: Field{[10]uint32{0x0079a6f9, 0x017ee45c, 0x03e44059, 0x00cc43b1, 0x030842ce, 0x014c499b, 0x00bf7545, 0x01ebcace, 0x018e2510, 0x000c8231}}, Y: Field{[10]uint32{0x02c785d7, 0x011d628c, 0x001c645a, 0x028b2220, 0x03653599, 0x0257b0b2, 0x01d9ab58, 0x02db2581, 0x01cb5346, 0x0020c71b}}}, + {X: Field{[10]uint32{0x009927a7, 0x014e4623, 0x025a8c52, 0x020d9406, 0x02472535, 0x01135cd5, 0x0021b80b, 0x00438aa8, 0x02071f85, 0x002981ce}}, Y: Field{[10]uint32{0x0364fec9, 0x03c64698, 0x032462a9, 0x00361600, 0x026fefa3, 0x033f26ee, 0x0318baad, 0x01d84859, 0x03c54c8a, 0x003a4ea7}}}, + {X: Field{[10]uint32{0x01f0d913, 0x00d5d62e, 0x007139e3, 0x01f8d589, 0x00f7ec1a, 0x02a9fffa, 0x00f21476, 0x02bdfc98, 0x0062f79e, 0x000cd42d}}, Y: Field{[10]uint32{0x01152959, 0x01c5c448, 0x00d4e805, 0x02f120a9, 0x03020f33, 0x02a34ba4, 0x03d2341b, 0x0048883e, 0x01b30fce, 0x0007c327}}}, + {X: Field{[10]uint32{0x03073caa, 0x03893380, 0x0344c11d, 0x00f99bd9, 0x00177391, 0x02859433, 0x007c89b5, 0x00a9d248, 0x03170bc8, 0x00295356}}, Y: Field{[10]uint32{0x02cd3ab8, 0x01edec4c, 0x033afcdb, 0x009be4ad, 0x02fe62dc, 0x02488b27, 0x007fe5d4, 0x0374460f, 0x035f5309, 0x000f090e}}}, + {X: Field{[10]uint32{0x00a04cf8, 0x0095ca41, 0x005cae5b, 0x01b558e4, 0x028a7d34, 0x0071e18f, 0x0024f7b0, 0x01e8d285, 0x02bf676a, 0x00196428}}, Y: Field{[10]uint32{0x03e781e7, 0x01419168, 0x02f09396, 0x03b10919, 0x004f8d0c, 0x03a8bdcd, 0x002d972e, 0x0106684e, 0x00030490, 0x00047356}}}, + {X: Field{[10]uint32{0x03cba9a5, 0x025bb271, 0x0159289e, 0x00f7ed6e, 0x01884039, 0x028d9c04, 0x03461a20, 0x03d22f4b, 0x00029fc7, 0x002cf027}}, Y: Field{[10]uint32{0x00f5cfa9, 0x03324ac2, 0x0360ab97, 0x035abcb6, 0x03c6a3e6, 0x0300c38a, 0x03bb1bda, 0x012b4065, 0x026cbce5, 0x0039ed6a}}}, + {X: Field{[10]uint32{0x00fa8bc0, 0x024a4e46, 0x0064426a, 0x03be3f75, 0x02cdc693, 0x022ca65c, 0x03361439, 0x004de9f6, 0x02a8044a, 0x0035e5a3}}, Y: Field{[10]uint32{0x0157a75c, 0x009bb22b, 0x022e5283, 0x01d35d36, 0x0156dd31, 0x004338b9, 0x015dd294, 0x010d3b2f, 0x01892901, 0x00209009}}}, + {X: Field{[10]uint32{0x038e8304, 0x0167c020, 0x0365c6d9, 0x03212d40, 0x033bf6ed, 0x009406b6, 0x02ca172b, 0x03e73347, 0x006c2f98, 0x002295ef}}, Y: Field{[10]uint32{0x03e7d14e, 0x02ff8361, 0x038b992c, 0x00404691, 0x01bf6434, 0x02fe9a30, 0x00b5d67c, 0x0166150e, 0x0062a0f8, 0x000bafd5}}}, + {X: Field{[10]uint32{0x0073fd22, 0x03435418, 0x03b4e551, 0x034dfc3b, 0x011a555d, 0x023218f3, 0x00b8d18f, 0x0142a30f, 0x00416847, 0x0014621a}}, Y: Field{[10]uint32{0x02f3f192, 0x0145f68d, 0x03691f30, 0x0141b14b, 0x006a28ce, 0x00bd660f, 0x00e0f15c, 0x00eb429b, 0x009b9e98, 0x003ac17c}}}, + {X: Field{[10]uint32{0x027c85f3, 0x0124f8bd, 0x037b0ab7, 0x005a6e7a, 0x02d3a026, 0x00575574, 0x02ab8566, 0x01e53ea7, 0x035f27e4, 0x003faa30}}, Y: Field{[10]uint32{0x00148864, 0x012940a3, 0x03c889b5, 0x03d52aa5, 0x03b24158, 0x038ae8b9, 0x01123378, 0x01b8ea61, 0x0297cf0a, 0x0030c977}}}, + {X: Field{[10]uint32{0x01f94b63, 0x01409fb4, 0x0051077b, 0x01a5fbd3, 0x01d79d5f, 0x01707273, 0x01ab955d, 0x009793e3, 0x00ccd7bc, 0x001984b3}}, Y: Field{[10]uint32{0x0057860b, 0x0012668d, 0x0320073d, 0x0200570e, 0x03e9bd6a, 0x0094f7e6, 0x02abab50, 0x02342b9e, 0x02c17a37, 0x00185544}}}, + {X: Field{[10]uint32{0x006f8746, 0x02f5f92a, 0x03533cbd, 0x019e7db4, 0x02f8a7ae, 0x00c66655, 0x009d6983, 0x01676c13, 0x007a4998, 0x0032662c}}, Y: Field{[10]uint32{0x01d17138, 0x0046fc23, 0x038a66af, 0x03a444e0, 0x0137d6b5, 0x03a881ba, 0x019d81b0, 0x01dd7a89, 0x0371919e, 0x00367804}}}, + {X: Field{[10]uint32{0x024cc1e1, 0x003ec30e, 0x004bb052, 0x00551835, 0x00c32e39, 0x00f77242, 0x00fcd0d2, 0x02597e15, 0x0269c5cf, 0x00170391}}, Y: Field{[10]uint32{0x035adea1, 0x02e42719, 0x0055464f, 0x03b722cf, 0x0189f5ed, 0x0343df2e, 0x0335ffac, 0x0269374b, 0x03af7e0f, 0x0033faee}}}, + {X: Field{[10]uint32{0x0158c0fd, 0x036fee1c, 0x0350bcb2, 0x016d93e5, 0x037ab319, 0x01aa74fe, 0x02f6433c, 0x01459fc1, 0x02483038, 0x00343f76}}, Y: Field{[10]uint32{0x031283db, 0x000838fb, 0x03c358f0, 0x0057442a, 0x03f5c6e3, 0x01860cda, 0x02e13598, 0x03d87f20, 0x01776a34, 0x00133795}}}, + {X: Field{[10]uint32{0x024a3e81, 0x01c0617e, 0x00fd37bc, 0x014c66df, 0x0007cab1, 0x0088b39d, 0x01482656, 0x03d96817, 0x030fd78b, 0x00364955}}, Y: Field{[10]uint32{0x03c1924c, 0x0360dc21, 0x00ed1673, 0x03833740, 0x00ff52be, 0x027195d7, 0x021a5c7b, 0x02ea4068, 0x019ac448, 0x00000f0e}}}, + {X: Field{[10]uint32{0x018374c8, 0x030861c2, 0x00f9a1d0, 0x013f5e06, 0x02a023cc, 0x0212c200, 0x037d6074, 0x012eb081, 0x016d81f8, 0x001174ad}}, Y: Field{[10]uint32{0x0019d7f4, 0x01901067, 0x03f05030, 0x007e122e, 0x00982941, 0x009598f3, 0x010506ea, 0x032cdeb5, 0x00d192a9, 0x00053286}}}, + {X: Field{[10]uint32{0x02157400, 0x005c2de7, 0x03fba5b7, 0x01e196a4, 0x00ea8c19, 0x03e6843e, 0x013404dd, 0x0316efde, 0x00118588, 0x001ab4eb}}, Y: Field{[10]uint32{0x011686d7, 0x018bfa60, 0x02c97a87, 0x02b45cc7, 0x02382eb5, 0x035d8a4b, 0x0320e80f, 0x00b0ffb7, 0x001f1e24, 0x003e895d}}}, + {X: Field{[10]uint32{0x02595f52, 0x0387afd2, 0x00bf5028, 0x00a00b77, 0x0026d540, 0x004ac876, 0x03ea9e39, 0x02582de4, 0x0045b6dc, 0x00176891}}, Y: Field{[10]uint32{0x01f16026, 0x01007cd9, 0x005fd01b, 0x03663222, 0x02fabfa0, 0x03e28bf4, 0x015063bf, 0x0329a626, 0x038cad1d, 0x002f063f}}}, + {X: Field{[10]uint32{0x0132b346, 0x0057bf2b, 0x00f445ed, 0x0227549f, 0x03d7b5f1, 0x01975c4c, 0x039b89f8, 0x021b4a4e, 0x006811ce, 0x00377fd9}}, Y: Field{[10]uint32{0x027f5737, 0x03b68d95, 0x0110db1a, 0x019c4fa9, 0x034d236b, 0x004ac070, 0x021ae080, 0x0005af84, 0x0194cb22, 0x001c983a}}}, + {X: Field{[10]uint32{0x0097f029, 0x0279a6fe, 0x012436ad, 0x02637275, 0x02c1030d, 0x02142611, 0x032f50bc, 0x03ea4f43, 0x033b9120, 0x002a2e7f}}, Y: Field{[10]uint32{0x0066c591, 0x01f8cca1, 0x017b2359, 0x03da8ac7, 0x00c866aa, 0x00ec1fbf, 0x01a4c2ca, 0x01a1cbaa, 0x029a4e51, 0x00172fe8}}}, + {X: Field{[10]uint32{0x01dbcafd, 0x03068054, 0x00eb7a2f, 0x01921a3b, 0x02628752, 0x03237bac, 0x03c18eda, 0x0275a9c8, 0x03fb177b, 0x00250c1d}}, Y: Field{[10]uint32{0x00e7eb4e, 0x03d2a546, 0x01442e48, 0x004be97f, 0x03ccb6e3, 0x031f7e4f, 0x038248da, 0x0007274f, 0x01fc41ad, 0x0000866a}}}, + {X: Field{[10]uint32{0x0058b8e3, 0x0043cd99, 0x0174e9e8, 0x027e9593, 0x0382b33f, 0x00917aef, 0x0360f524, 0x0205ebf7, 0x01ac09c9, 0x001d72d8}}, Y: Field{[10]uint32{0x0003c367, 0x02b7f7bb, 0x00fb85b3, 0x01df3563, 0x02664414, 0x0277dae7, 0x00986f5f, 0x00210d18, 0x01bdf66f, 0x002aa04d}}}, + {X: Field{[10]uint32{0x031fccc8, 0x0039f238, 0x010c5075, 0x03cee6eb, 0x02c34fdc, 0x0239fc2b, 0x00922b22, 0x023a152f, 0x017727cb, 0x0006edf8}}, Y: Field{[10]uint32{0x00221ca3, 0x00368e30, 0x023d5238, 0x0030f989, 0x02855ea0, 0x0109737a, 0x01e322c2, 0x0179c2f6, 0x00861e85, 0x002efdca}}}, + {X: Field{[10]uint32{0x03ee8dbb, 0x02a536a2, 0x02a2eafd, 0x01c72638, 0x0087f024, 0x001743cc, 0x034b41cf, 0x036fcd16, 0x004b39e9, 0x002510ce}}, Y: Field{[10]uint32{0x024544ee, 0x0380723e, 0x02504aba, 0x015fdbde, 0x03e7b5da, 0x01f8e4e7, 0x00ac6e22, 0x0047d8e3, 0x0173ccb2, 0x0038d984}}}, + {X: Field{[10]uint32{0x03740d25, 0x033a9dbb, 0x0183961c, 0x015359a4, 0x00b4c27d, 0x0306a59a, 0x011638ae, 0x02aaca35, 0x01d5a68c, 0x00126f45}}, Y: Field{[10]uint32{0x0318c6e4, 0x01d0e7cf, 0x03e579db, 0x0183ab3c, 0x0377563b, 0x02657303, 0x03b9f0bd, 0x0391f7ef, 0x00688760, 0x001923f2}}}, + {X: Field{[10]uint32{0x02cfed85, 0x02517f5e, 0x02f9073f, 0x01e2960c, 0x02c151aa, 0x001e241f, 0x013684fd, 0x027a1613, 0x038e9280, 0x003431ed}}, Y: Field{[10]uint32{0x02970c89, 0x02e56ce3, 0x01d5707a, 0x01d48ab6, 0x03be91e4, 0x030c1480, 0x0129046b, 0x012902d5, 0x01abbe49, 0x002a0365}}}, + {X: Field{[10]uint32{0x02eb9275, 0x01af5f64, 0x00bf0cd9, 0x0361e5d2, 0x027c4c28, 0x033721d6, 0x018f9c75, 0x0088c97a, 0x01463ab2, 0x0037af77}}, Y: Field{[10]uint32{0x02b9799c, 0x02531c42, 0x00754ab5, 0x0192c4af, 0x0150d020, 0x01cebc96, 0x03b3dd7a, 0x03f2c17f, 0x008dc3ff, 0x0003440f}}}, + {X: Field{[10]uint32{0x03f33998, 0x01004bc6, 0x02dc33f6, 0x032152c0, 0x029f9ebc, 0x03681cc4, 0x022d6bf9, 0x01a8563a, 0x017c192a, 0x00075e6c}}, Y: Field{[10]uint32{0x00f60a5e, 0x039aef53, 0x00a12b78, 0x020af102, 0x020c7876, 0x033d91c0, 0x00d986fb, 0x0322a014, 0x00b3dbc1, 0x001bb206}}}, + {X: Field{[10]uint32{0x0281ca1b, 0x03f4db9b, 0x018449ed, 0x015c9931, 0x0374bd3b, 0x03454d7f, 0x009c38d7, 0x011fa5ca, 0x02ebff5d, 0x000bfadd}}, Y: Field{[10]uint32{0x01f93b74, 0x030ceee2, 0x00899378, 0x01d1e267, 0x03bb462e, 0x03e72af1, 0x02e18cd1, 0x02a08f7e, 0x024a7ba3, 0x00116f53}}}, + {X: Field{[10]uint32{0x00682573, 0x00bf82ec, 0x013c0637, 0x00e52619, 0x013eef1b, 0x0393d7bf, 0x0372ab62, 0x0169dfd4, 0x0190faef, 0x00005343}}, Y: Field{[10]uint32{0x02081453, 0x02a4bd8d, 0x0131236b, 0x025dcae8, 0x01601a4f, 0x01c65a0c, 0x0130f51d, 0x02e4c13d, 0x029a80c2, 0x00145fc5}}}, + {X: Field{[10]uint32{0x03313321, 0x008aafff, 0x02476fd5, 0x00dd1b4b, 0x02ad0941, 0x0042ce6c, 0x00bd9adb, 0x02470ce1, 0x03a5728f, 0x001cc1a9}}, Y: Field{[10]uint32{0x03a915a2, 0x005ee06d, 0x02a85a8e, 0x03b496e1, 0x01574c85, 0x0124bc6c, 0x03bd4e4f, 0x03a1ecd6, 0x02aba5b9, 0x00085788}}}, + {X: Field{[10]uint32{0x0255aaba, 0x0134d89a, 0x0171976d, 0x01e9cdfa, 0x00fd2406, 0x0263eb48, 0x02873a06, 0x036e32cc, 0x014f870c, 0x00217611}}, Y: Field{[10]uint32{0x0117e4a2, 0x010d2c4c, 0x033bb951, 0x03b8446b, 0x01539fe7, 0x02e720cf, 0x02a0715c, 0x027a3948, 0x000a36eb, 0x000db58f}}}, + {X: Field{[10]uint32{0x034384c3, 0x0028392c, 0x00dffc1f, 0x00a25b63, 0x0202f7da, 0x0386448a, 0x01b21cb9, 0x019ea896, 0x03829930, 0x0031a3d9}}, Y: Field{[10]uint32{0x0079e94a, 0x030da04c, 0x014ffb7d, 0x024daca6, 0x0308dcd4, 0x026575a8, 0x02484fb0, 0x00ce1dfa, 0x016a331c, 0x001d39ba}}}, + {X: Field{[10]uint32{0x00214dd3, 0x038c6101, 0x0217fe18, 0x0141a1c2, 0x00e29cd8, 0x00d47227, 0x02d5c9c3, 0x01554211, 0x01115dbe, 0x00205120}}, Y: Field{[10]uint32{0x030d19a8, 0x02af2c59, 0x02785210, 0x00f97b75, 0x01540ea3, 0x011e1a27, 0x03740e92, 0x030a71a5, 0x00b3d4cd, 0x001d775e}}}, + {X: Field{[10]uint32{0x00c945f5, 0x00120558, 0x00ebe3e2, 0x006f3d85, 0x0324214e, 0x01c1bc87, 0x0325993a, 0x0351e3d7, 0x0319de24, 0x000c42d6}}, Y: Field{[10]uint32{0x004318c3, 0x00ccc9c4, 0x021a147e, 0x014fc0a8, 0x01bf04cc, 0x03a1035a, 0x01d017e2, 0x03481782, 0x02ca0f01, 0x0022d0b1}}}, + {X: Field{[10]uint32{0x03c4bc3e, 0x0165d302, 0x03420a02, 0x00471a13, 0x01b0a90f, 0x00b9b514, 0x01e4bcab, 0x038ae77f, 0x03c74baf, 0x0033e291}}, Y: Field{[10]uint32{0x034c97d1, 0x00806ef8, 0x01c3d1cc, 0x01a70299, 0x02614d8a, 0x0321d8af, 0x02331e62, 0x021a65e1, 0x0264a9a7, 0x003c2dec}}}, + {X: Field{[10]uint32{0x038650fc, 0x011ebe62, 0x002d33d7, 0x0221a6e6, 0x03ab5533, 0x00f4ed82, 0x00100ec6, 0x02a4139c, 0x02267352, 0x00283f18}}, Y: Field{[10]uint32{0x0385865f, 0x025bcace, 0x02497e2b, 0x02cfe659, 0x03cd162e, 0x00870e67, 0x0388c395, 0x013ad192, 0x014c16b2, 0x002e8eb9}}}, + {X: Field{[10]uint32{0x00ff8bdb, 0x038f08db, 0x03fb07dc, 0x01c29386, 0x032e1eaf, 0x000114cc, 0x00d03391, 0x03751d61, 0x03e2535e, 0x002ab976}}, Y: Field{[10]uint32{0x03a7449b, 0x02554ced, 0x00321911, 0x03168d56, 0x02a51d85, 0x011cdccb, 0x02784392, 0x001adeec, 0x01f6e558, 0x001f3ea9}}}, + {X: Field{[10]uint32{0x0103ae39, 0x0285eec1, 0x01bd50b0, 0x009a1b69, 0x005c3172, 0x009c1686, 0x000792fb, 0x01d5432f, 0x03115b89, 0x002293a4}}, Y: Field{[10]uint32{0x017cef2c, 0x03a48ff4, 0x016922dd, 0x0362a770, 0x022442ae, 0x02a85d5c, 0x011b976d, 0x00231c5d, 0x01c8d85f, 0x000588eb}}}, + {X: Field{[10]uint32{0x03066463, 0x0336b1a1, 0x03f26a51, 0x028332eb, 0x018627e1, 0x02404096, 0x015cd612, 0x002c254a, 0x0135eca9, 0x0032f3bd}}, Y: Field{[10]uint32{0x03212653, 0x01fee35a, 0x03c259d8, 0x005cd18b, 0x02498fee, 0x03143855, 0x00afb9d8, 0x032670ff, 0x03fac2a2, 0x0019470b}}}, + {X: Field{[10]uint32{0x010f8c99, 0x00bab07b, 0x02609990, 0x0134bab5, 0x010bf12c, 0x00ae7210, 0x0290e336, 0x00af42ea, 0x01594d6a, 0x000965c5}}, Y: Field{[10]uint32{0x0075245e, 0x02b4afca, 0x02a8294b, 0x008b4289, 0x01d974dd, 0x00cfa2ec, 0x004002bc, 0x00132e05, 0x036cc974, 0x00127806}}}, + {X: Field{[10]uint32{0x02f1445f, 0x00b34a6d, 0x02a89167, 0x0178fa6c, 0x00a707da, 0x0203c0d9, 0x0389044c, 0x027daeb0, 0x028b2b04, 0x002dd535}}, Y: Field{[10]uint32{0x01e37740, 0x02bb1793, 0x01da1af2, 0x01097d37, 0x02bea555, 0x037f0bd3, 0x0092e3ed, 0x008f459c, 0x03c1625e, 0x0006ca6d}}}, + {X: Field{[10]uint32{0x03084037, 0x02263fd3, 0x0040aafa, 0x022f4a53, 0x02ab0bde, 0x03ce2d68, 0x03ca2fe2, 0x023ce731, 0x01a850e6, 0x00082ba9}}, Y: Field{[10]uint32{0x03f59444, 0x03877c00, 0x00fc20b4, 0x00f0c48c, 0x02ab1e88, 0x03f9f86c, 0x02fd6a56, 0x019bb1aa, 0x02b3f176, 0x001bb55d}}}, + {X: Field{[10]uint32{0x031979a6, 0x017876f8, 0x01e7bf0d, 0x0341f340, 0x02c6939f, 0x025fae16, 0x008cba9a, 0x03a48cca, 0x0202919d, 0x0009a113}}, Y: Field{[10]uint32{0x009ebfb7, 0x03154817, 0x005a16c7, 0x030a0cb1, 0x00cc08a6, 0x0063ed83, 0x026f11e5, 0x03eb4409, 0x028e06a5, 0x0000f7e6}}}, + {X: Field{[10]uint32{0x0028414c, 0x0372a577, 0x033fd485, 0x01ac68e2, 0x00efbe0a, 0x03b37e6d, 0x00fd413b, 0x026abc9f, 0x026133a6, 0x00046bf2}}, Y: Field{[10]uint32{0x03737b1c, 0x007d6b36, 0x0377b212, 0x03eee724, 0x009e4678, 0x0391ed00, 0x0047bbf8, 0x01ff988a, 0x0390c067, 0x002352e1}}}, + {X: Field{[10]uint32{0x00d2a63d, 0x01e37bba, 0x0160df3d, 0x01ec8f9c, 0x00498633, 0x039fa578, 0x03be09fc, 0x017594de, 0x00d52fe2, 0x00311b85}}, Y: Field{[10]uint32{0x01d2b723, 0x01d7563d, 0x017589b1, 0x03bd0fe8, 0x011f04b9, 0x0377d9e9, 0x0008dd77, 0x03a7fcb4, 0x01ab4211, 0x0028803f}}}, + {X: Field{[10]uint32{0x0055e4d7, 0x03673635, 0x02142d31, 0x00f23d63, 0x01241228, 0x00429d81, 0x01f598a2, 0x03f82491, 0x0212578a, 0x00015c2a}}, Y: Field{[10]uint32{0x00c50ac8, 0x00b03c4b, 0x01601b93, 0x02a57429, 0x019a2bed, 0x0144a81c, 0x03439e08, 0x00378750, 0x0361f8e9, 0x0030a3f6}}}, + {X: Field{[10]uint32{0x03c3fa64, 0x00c4237e, 0x00d1f3a3, 0x02b33ec5, 0x02224236, 0x00e15385, 0x0170b84e, 0x033a80a1, 0x035e88a1, 0x0034c4b6}}, Y: Field{[10]uint32{0x0397e1de, 0x0185fdb3, 0x026cf36b, 0x012ba9cb, 0x0064b8aa, 0x000c724c, 0x01fa0aae, 0x00e0f211, 0x00891843, 0x00329794}}}, + {X: Field{[10]uint32{0x02398087, 0x013b022a, 0x00a6d1fe, 0x02e1d889, 0x01c9be5e, 0x009e7c00, 0x01a9ad99, 0x019c3853, 0x00769981, 0x0007b88a}}, Y: Field{[10]uint32{0x02176dcc, 0x00c727c0, 0x034526ff, 0x02896031, 0x00b68603, 0x01511835, 0x0242c650, 0x038deb7f, 0x0114e303, 0x00188404}}}, + {X: Field{[10]uint32{0x03bb81a0, 0x02a6a955, 0x004a94af, 0x035cb530, 0x011700b9, 0x03259300, 0x005511d1, 0x013fd2ba, 0x02cde2b8, 0x0007ee72}}, Y: Field{[10]uint32{0x03737fcb, 0x0159d497, 0x0038ee04, 0x01acb3e8, 0x0115b130, 0x0108050d, 0x019f59f7, 0x017cab5b, 0x03c1295c, 0x0010c2dc}}}, + {X: Field{[10]uint32{0x011c085b, 0x00685d98, 0x01145f19, 0x02e7e913, 0x034a998b, 0x0201f9d0, 0x032934a9, 0x002d1da7, 0x002dd3cf, 0x00341332}}, Y: Field{[10]uint32{0x01be5fa9, 0x00805a40, 0x0392d155, 0x02b32196, 0x018f4c13, 0x03848f75, 0x02cf1cac, 0x03454710, 0x01afb551, 0x001e9286}}}, + {X: Field{[10]uint32{0x03e7e9aa, 0x03a1c133, 0x01e15712, 0x02295237, 0x038a544f, 0x009f7d77, 0x00b97f1f, 0x0345faea, 0x02088bd4, 0x0007932c}}, Y: Field{[10]uint32{0x019b828d, 0x0119b369, 0x03e515e8, 0x025971c6, 0x03db0663, 0x00ff68fc, 0x019930a5, 0x00cfb39e, 0x021eb729, 0x00360171}}}, + {X: Field{[10]uint32{0x0251590d, 0x01b71237, 0x028c717d, 0x01a77cf7, 0x008f769f, 0x02f3f6ae, 0x032bbadc, 0x02168359, 0x0398707a, 0x001482a8}}, Y: Field{[10]uint32{0x02e9ada8, 0x01495513, 0x0052a39a, 0x01366638, 0x013b5472, 0x0045daab, 0x01095e2f, 0x01e88b02, 0x00e4a904, 0x002634d1}}}, + {X: Field{[10]uint32{0x03614ef2, 0x032b1b9e, 0x005d7a79, 0x0325e0c9, 0x00e7080a, 0x001a4ff2, 0x00d45a06, 0x03bdf0b8, 0x03de165b, 0x000ea7f8}}, Y: Field{[10]uint32{0x03038d4a, 0x00187bdc, 0x0398e151, 0x0126a9b5, 0x007607ff, 0x024d3222, 0x02895f52, 0x037bbf1e, 0x0046fd3f, 0x00014625}}}, + {X: Field{[10]uint32{0x02149938, 0x03639cf6, 0x0005665f, 0x00190dcc, 0x018e3c68, 0x02db5a32, 0x0289a3a2, 0x00201790, 0x01ccc26c, 0x002724a7}}, Y: Field{[10]uint32{0x016ba2fa, 0x0285034e, 0x02dd956a, 0x00b6aaf9, 0x02c81edf, 0x00409d8a, 0x039f6bab, 0x024824fc, 0x0140b4c2, 0x001b7efe}}}, + {X: Field{[10]uint32{0x01be419e, 0x005dd222, 0x00a660d1, 0x02af1a6b, 0x03ee22ab, 0x0179e822, 0x02f1e42e, 0x0019462e, 0x00cef4e0, 0x000d56d8}}, Y: Field{[10]uint32{0x002604e2, 0x011bd0ff, 0x031b1ed1, 0x02baed13, 0x034fc01d, 0x02d4fedc, 0x020eaaac, 0x03ec417f, 0x023bb277, 0x001fd1e2}}}, + {X: Field{[10]uint32{0x03f7f37f, 0x039efcf5, 0x01705dfc, 0x02465d0e, 0x01ea9660, 0x00478406, 0x0389bb1c, 0x01110b84, 0x014f21ad, 0x001daffc}}, Y: Field{[10]uint32{0x0289d763, 0x01a95260, 0x0307b93f, 0x03e2488f, 0x02a29a34, 0x0308b80b, 0x034da79b, 0x02ac4ad7, 0x0291376a, 0x000e1568}}}, + {X: Field{[10]uint32{0x0156b454, 0x023e2d98, 0x021dbfa0, 0x02ffe88b, 0x02becbb4, 0x01620ce5, 0x023aadd3, 0x01e8edf8, 0x00df1057, 0x00246ee7}}, Y: Field{[10]uint32{0x00edbb91, 0x0333c965, 0x01a1ef2c, 0x010b0b2a, 0x00a3edea, 0x005846d7, 0x0053e93d, 0x026c0bb7, 0x039e4f14, 0x003b1b2e}}}, + {X: Field{[10]uint32{0x00865562, 0x00c4296a, 0x02537f8c, 0x01f53acc, 0x010a7dde, 0x003116c2, 0x0081204f, 0x01b184d9, 0x010f1ba8, 0x002795ac}}, Y: Field{[10]uint32{0x028aa67c, 0x010d8756, 0x022d516f, 0x02bc3461, 0x028b523e, 0x027ba31a, 0x03ca1a37, 0x0305b122, 0x013d8552, 0x00337cd1}}}, + {X: Field{[10]uint32{0x008e09f9, 0x0125cb66, 0x00af500f, 0x01d53a69, 0x01a11dcb, 0x00e4c15c, 0x02e28a42, 0x01af7939, 0x014daf28, 0x00139cd6}}, Y: Field{[10]uint32{0x018a36e7, 0x02d47c51, 0x02418cd1, 0x014c20a2, 0x01af0d8e, 0x0289d00d, 0x03d812ce, 0x010b3b80, 0x03d070c0, 0x002967c8}}}, + {X: Field{[10]uint32{0x0123d860, 0x02b254ce, 0x01bb1d9f, 0x01cc12c4, 0x00393d59, 0x032cb185, 0x01d3c557, 0x0227e9a4, 0x03f7e92d, 0x00055bf7}}, Y: Field{[10]uint32{0x013b360b, 0x03ac04e8, 0x032ee620, 0x033408c4, 0x00bff653, 0x0199408f, 0x02d68f64, 0x01d833bd, 0x0237c448, 0x0013a4a5}}}, + {X: Field{[10]uint32{0x028ea03b, 0x0029f9eb, 0x0356998b, 0x01487e24, 0x0170d23d, 0x00f4d36e, 0x017a9052, 0x008cd975, 0x0250eb37, 0x003cb22d}}, Y: Field{[10]uint32{0x001a7881, 0x010aa1c6, 0x0183d72f, 0x031d9ce5, 0x00204488, 0x002f7a7b, 0x03422a56, 0x026fda5c, 0x031484a9, 0x002f66b0}}}, + {X: Field{[10]uint32{0x0351e3e3, 0x01399eb1, 0x0316cd4a, 0x028806b8, 0x0288d526, 0x01ee05ae, 0x01bb92ba, 0x01d0c17d, 0x0257a4a3, 0x0009f74d}}, Y: Field{[10]uint32{0x03be3304, 0x019092e0, 0x00e8c022, 0x0007df61, 0x008a756b, 0x03fa5d79, 0x03af3d51, 0x029005ab, 0x01d3c0fa, 0x0022033f}}}, + {X: Field{[10]uint32{0x03b3d1bc, 0x013c58fa, 0x037081c6, 0x020b099c, 0x037a3901, 0x03312dfc, 0x00c5d981, 0x00d5f00f, 0x020c19f7, 0x003db097}}, Y: Field{[10]uint32{0x0289e43d, 0x039f08a3, 0x03c2f183, 0x014ab7cd, 0x01295341, 0x010ecd62, 0x0144d666, 0x0283e8e6, 0x03ea7c05, 0x0023202c}}}, + {X: Field{[10]uint32{0x03fad4f2, 0x02b1fd29, 0x01f45087, 0x0015c5bf, 0x02ae2803, 0x0274dd84, 0x02847d3d, 0x017a87a8, 0x000c7130, 0x00319e20}}, Y: Field{[10]uint32{0x000b63c6, 0x0127a21b, 0x022d92d5, 0x00e7c41b, 0x0055d41d, 0x02fabd76, 0x0349a42e, 0x00ae3376, 0x03f4d2fb, 0x002f97fe}}}, + {X: Field{[10]uint32{0x03f6d560, 0x0244ba04, 0x03d30931, 0x037e816f, 0x02f98177, 0x023c347b, 0x01e2d3a6, 0x01de1bf2, 0x0221e66b, 0x003cd76c}}, Y: Field{[10]uint32{0x003f29fa, 0x01f30039, 0x007c7bb6, 0x0054da9f, 0x0209eccb, 0x03f96c7b, 0x0174ca5a, 0x00810226, 0x00080e6b, 0x0012266a}}}, + {X: Field{[10]uint32{0x03e69de9, 0x00718e64, 0x00debd02, 0x0013101d, 0x035d944f, 0x00ce2230, 0x01843d6c, 0x018cfb6e, 0x037da915, 0x000ae4f8}}, Y: Field{[10]uint32{0x030522f0, 0x034f2212, 0x001676f2, 0x017f1c94, 0x00366a4a, 0x004c83bf, 0x0372a58f, 0x0287324f, 0x0095c6ff, 0x003acf44}}}, + {X: Field{[10]uint32{0x02091b69, 0x02407459, 0x02331060, 0x02522c52, 0x03e4875b, 0x03f6d01b, 0x01913ab0, 0x011c5bd4, 0x03b39045, 0x00206008}}, Y: Field{[10]uint32{0x0227e7b1, 0x039130a8, 0x00990f98, 0x0227e9f6, 0x026fe573, 0x00e393cb, 0x01af3e1f, 0x03911c31, 0x018a6224, 0x002cfd5c}}}, + {X: Field{[10]uint32{0x00662bb6, 0x00fc180f, 0x001fbdb3, 0x01ec84f7, 0x006645ce, 0x016c5061, 0x02e565b6, 0x029a76ca, 0x026a244c, 0x000059db}}, Y: Field{[10]uint32{0x022e0298, 0x028c7ee0, 0x001fdcf4, 0x026c5bb3, 0x01aeb968, 0x034b1f03, 0x03208300, 0x0177049a, 0x03a5deef, 0x00223872}}}, + {X: Field{[10]uint32{0x00298d54, 0x00b2c877, 0x02e4c391, 0x0150c38c, 0x01d96574, 0x008f8bc8, 0x0229d733, 0x00df78e1, 0x01a1a925, 0x0000be4c}}, Y: Field{[10]uint32{0x030ef904, 0x0077eba8, 0x03ccc52e, 0x03442f6e, 0x0195a5b2, 0x015899c4, 0x036fe43f, 0x003ebbbb, 0x01086fbc, 0x0024ca4b}}}, + {X: Field{[10]uint32{0x01fd0279, 0x01cc3228, 0x001af2d1, 0x03044898, 0x02be8a32, 0x013d1521, 0x03f20d9b, 0x0232462f, 0x0212f0dd, 0x001ee935}}, Y: Field{[10]uint32{0x02401179, 0x00d39e34, 0x00310d02, 0x0316f131, 0x013018e3, 0x0334126a, 0x0220af14, 0x0190c6cb, 0x02a1f5b0, 0x0022ab5e}}}, + {X: Field{[10]uint32{0x001d5e78, 0x01aa9872, 0x023d8528, 0x00233323, 0x03d6974d, 0x008de67a, 0x039b2be7, 0x01ea45a9, 0x02b085fe, 0x0003a37e}}, Y: Field{[10]uint32{0x023f926c, 0x02ead01b, 0x0181c37d, 0x00eec637, 0x00fbaec5, 0x01521eee, 0x0195d47a, 0x02d55b99, 0x006e519d, 0x0008485a}}}, + {X: Field{[10]uint32{0x0184ab5e, 0x02432683, 0x0264c94c, 0x028554d6, 0x02ea751d, 0x01facb9a, 0x01071061, 0x01fbd1be, 0x03bcb159, 0x001f5588}}, Y: Field{[10]uint32{0x00ce7575, 0x0372f0a8, 0x037e4204, 0x0351759a, 0x00701b3c, 0x02f8ba2e, 0x0114b70e, 0x031378c5, 0x03318004, 0x003718e7}}}, + {X: Field{[10]uint32{0x00a7ffa3, 0x03213ee2, 0x02ad57b9, 0x005a0778, 0x001e4ac9, 0x00ee0880, 0x0186194b, 0x02fb1d22, 0x022d8074, 0x00023a07}}, Y: Field{[10]uint32{0x019fa890, 0x02052641, 0x03e6cdc7, 0x026a37e4, 0x03fa94e9, 0x018b40fd, 0x016f6cf7, 0x01120329, 0x001df4a3, 0x0010217b}}}, + {X: Field{[10]uint32{0x028da71e, 0x034ea169, 0x0052b53e, 0x0324ad73, 0x0173e68a, 0x01a71a0a, 0x018affd1, 0x03b98978, 0x03e78290, 0x002a7568}}, Y: Field{[10]uint32{0x00805fd6, 0x026f92ad, 0x02536ee8, 0x0083391e, 0x028d6e8b, 0x01e4ce22, 0x009ed298, 0x01622546, 0x016bf9eb, 0x000736ab}}}, + {X: Field{[10]uint32{0x03dba2cd, 0x02c48f15, 0x00497d64, 0x03c391ab, 0x00984985, 0x00c4be12, 0x037b3134, 0x01f0380e, 0x03cabcda, 0x0013df05}}, Y: Field{[10]uint32{0x034a25d7, 0x02d72a28, 0x00f5e888, 0x002a6eaa, 0x00c87701, 0x0141c334, 0x00be7c1d, 0x0030efcf, 0x01d95f47, 0x002182fb}}}, + {X: Field{[10]uint32{0x03a64921, 0x02ec2ae7, 0x025b5b4f, 0x00f14d5c, 0x01034b8c, 0x0155cd3a, 0x01bd016f, 0x029ee6a4, 0x017a9234, 0x0011e3cf}}, Y: Field{[10]uint32{0x00051a1f, 0x02d364ee, 0x021018ff, 0x015360fc, 0x003f2530, 0x0087a69f, 0x02bca05c, 0x00fc63ae, 0x0394f025, 0x0036e5e8}}}, + {X: Field{[10]uint32{0x027963d5, 0x014bac7f, 0x02329f25, 0x02ad87ee, 0x033ea09a, 0x007685e7, 0x037cc01b, 0x01b9f5a7, 0x017b73d9, 0x002b39f9}}, Y: Field{[10]uint32{0x02908918, 0x03bee249, 0x0211b796, 0x013040c1, 0x017e213e, 0x03809659, 0x010f824b, 0x02f413b2, 0x01f22b8d, 0x003e8094}}}, + {X: Field{[10]uint32{0x0108d1fd, 0x001039ea, 0x01f24374, 0x03e28742, 0x034401f2, 0x0337da7b, 0x013757cd, 0x001dc609, 0x0067f517, 0x003355ba}}, Y: Field{[10]uint32{0x03338fe1, 0x012ee89f, 0x03b90a45, 0x02109ded, 0x0183e4bd, 0x03d8831f, 0x02b29a22, 0x002e9228, 0x021652cf, 0x0021e3dc}}}, + {X: Field{[10]uint32{0x024d5329, 0x00f944fb, 0x03e33e92, 0x01cae819, 0x0167a2c6, 0x01ec9769, 0x031dd249, 0x03e26992, 0x025cd9d2, 0x000c10ba}}, Y: Field{[10]uint32{0x0268b1fb, 0x03906cd6, 0x0261281c, 0x021a3817, 0x02d3fa1d, 0x01b489e8, 0x028568cd, 0x01a85282, 0x0144d551, 0x0002e130}}}, + {X: Field{[10]uint32{0x02712ec0, 0x0147b267, 0x03f1bce3, 0x02455ebc, 0x0130a2e2, 0x02be80d1, 0x002b042b, 0x03b49802, 0x008da094, 0x00015782}}, Y: Field{[10]uint32{0x026b33e9, 0x03274bb1, 0x01db2082, 0x037e0b54, 0x0100caca, 0x00531512, 0x00919335, 0x020c9258, 0x017f6439, 0x0031be0a}}}, + {X: Field{[10]uint32{0x03408966, 0x02d1a44e, 0x01875e63, 0x020fbb5c, 0x01e0e0da, 0x0295e83a, 0x03f91817, 0x024ef28d, 0x013a69dd, 0x002f4b6c}}, Y: Field{[10]uint32{0x01b0da2d, 0x029d0a82, 0x00cf8078, 0x0391016e, 0x00187ee6, 0x03d96cfe, 0x03c25d50, 0x026cbc48, 0x0260f948, 0x0011b849}}}, + {X: Field{[10]uint32{0x03d3d210, 0x0158939f, 0x03ecb609, 0x006661a9, 0x00ef7c52, 0x013b4685, 0x02678e62, 0x0211557f, 0x0110cdbb, 0x001f5e94}}, Y: Field{[10]uint32{0x02c6c37c, 0x01d2965a, 0x00867727, 0x03680570, 0x00626a46, 0x02ea9281, 0x019d640a, 0x011493e0, 0x01c3c0a5, 0x003255e3}}}, + {X: Field{[10]uint32{0x037a3fa7, 0x02cc3d24, 0x037825bd, 0x00a406f5, 0x02fd4e6d, 0x013b6af1, 0x01669813, 0x004d50aa, 0x0317513b, 0x0007bc48}}, Y: Field{[10]uint32{0x010e1ade, 0x012276d6, 0x00039909, 0x02651a13, 0x01123198, 0x01aa327e, 0x011cee33, 0x02f3bcd1, 0x0288a391, 0x0038392d}}}, + {X: Field{[10]uint32{0x0206baaf, 0x00c33a85, 0x01d1949d, 0x021a2e68, 0x029f463b, 0x00cb4bc4, 0x02c6b2e3, 0x02e5db6f, 0x0003766f, 0x003bfe81}}, Y: Field{[10]uint32{0x001cb082, 0x00877bef, 0x003c2382, 0x03116d28, 0x03b0cbfd, 0x0280f785, 0x00de1b7d, 0x03e993ce, 0x0083bf3e, 0x002316c7}}}, + {X: Field{[10]uint32{0x0087d65c, 0x03699868, 0x02069df5, 0x0036743a, 0x0320bf78, 0x01cebd6f, 0x025f0222, 0x02810955, 0x01e976a9, 0x0037249c}}, Y: Field{[10]uint32{0x023d6063, 0x033629ad, 0x010c1944, 0x01f18852, 0x0055ce7c, 0x031ceddb, 0x02f11bb1, 0x034c3261, 0x01e7b27b, 0x0037219e}}}, + {X: Field{[10]uint32{0x00264619, 0x02ad052e, 0x031b2384, 0x024c0376, 0x02a1336b, 0x01d54075, 0x00f69462, 0x0280b086, 0x01c21e1c, 0x0002b877}}, Y: Field{[10]uint32{0x01b26b48, 0x03d0881f, 0x0076a01f, 0x0326a21f, 0x0332466b, 0x026a9db5, 0x00e5c8e1, 0x018497b2, 0x039d300b, 0x000871ac}}}, + {X: Field{[10]uint32{0x0282cf5b, 0x0338ead3, 0x00a1285c, 0x0226fcaf, 0x01033dd9, 0x00c5918d, 0x00924808, 0x00d724ae, 0x000ffe58, 0x002ba8b0}}, Y: Field{[10]uint32{0x03dfa97f, 0x0064eca4, 0x029673e8, 0x035014ee, 0x039aad65, 0x019c2c64, 0x0220e84e, 0x0184490a, 0x00cf935a, 0x00185566}}}, + {X: Field{[10]uint32{0x02ebf696, 0x02322fa2, 0x0066b634, 0x00f98db2, 0x01b45e72, 0x02451d9f, 0x01b30b65, 0x00ea1bd5, 0x021634b4, 0x00244f43}}, Y: Field{[10]uint32{0x01971a9f, 0x01e9710e, 0x00305148, 0x00385235, 0x0039c0c1, 0x00c5c809, 0x02574af4, 0x03f69340, 0x020751af, 0x00385319}}}, + {X: Field{[10]uint32{0x03c26fc0, 0x0094b48e, 0x0005a301, 0x00f621e3, 0x0040fc16, 0x02ec3e72, 0x00d61916, 0x02b20178, 0x0354775c, 0x0013c2cc}}, Y: Field{[10]uint32{0x018da1e3, 0x03f0fcef, 0x01ac3fa8, 0x01ddba15, 0x016c0e10, 0x03cf897c, 0x02eb2eb5, 0x03f7e0e9, 0x00863aed, 0x002c2dd5}}}, + {X: Field{[10]uint32{0x0316129d, 0x028f693c, 0x0083b181, 0x02583e02, 0x02f469df, 0x03197ab4, 0x033b2f75, 0x025e3dd9, 0x014073cc, 0x00176886}}, Y: Field{[10]uint32{0x02f311d1, 0x03051663, 0x031eaf3b, 0x036d8a16, 0x030237b1, 0x0067ad50, 0x00d5e63e, 0x0099c15c, 0x0080743d, 0x002145b4}}}, + {X: Field{[10]uint32{0x03e74a23, 0x03bbb45a, 0x0163dd4b, 0x00c89a74, 0x02a8fbc1, 0x00d0134d, 0x0392fb46, 0x03e46b32, 0x0330ca7a, 0x001db86c}}, Y: Field{[10]uint32{0x027f5326, 0x02b83787, 0x02791bca, 0x000000c6, 0x0002ce28, 0x03fe837b, 0x016f2e52, 0x023bcfb2, 0x0253c590, 0x00042ce4}}}, + {X: Field{[10]uint32{0x02393e64, 0x025d743b, 0x01be1d76, 0x015d9c77, 0x018fe8ef, 0x022c8cd6, 0x03912637, 0x003b860b, 0x008b2f21, 0x00312f92}}, Y: Field{[10]uint32{0x0379f449, 0x01389c2e, 0x02aee10d, 0x01c3e01f, 0x00b910cd, 0x02632809, 0x00beadcb, 0x02695120, 0x012fa1a0, 0x002fb04e}}}, + {X: Field{[10]uint32{0x0333ff37, 0x00329724, 0x0254256d, 0x000134da, 0x0025f5be, 0x00f58230, 0x0313848d, 0x03f5dec7, 0x018da141, 0x000151a4}}, Y: Field{[10]uint32{0x01914ac7, 0x008fa3ce, 0x004dcc2d, 0x02920cdc, 0x03b0b82b, 0x033e686f, 0x0300d716, 0x02f86973, 0x00c79684, 0x0000f475}}}, + {X: Field{[10]uint32{0x026078de, 0x03065809, 0x0210a320, 0x02c6719f, 0x002e6df8, 0x023fc3d0, 0x03368b09, 0x03af44b7, 0x03c42c51, 0x00337f1b}}, Y: Field{[10]uint32{0x0189cb0d, 0x02f81a3f, 0x0063c0fe, 0x0046dbdd, 0x03c26894, 0x02cddd3c, 0x03bef456, 0x01499151, 0x0130023e, 0x0016617a}}}, + {X: Field{[10]uint32{0x00f03034, 0x02ef351f, 0x00e99c99, 0x012d1c63, 0x02036f0e, 0x01023851, 0x021eec62, 0x005281bc, 0x00cc593b, 0x001dcc3f}}, Y: Field{[10]uint32{0x02016b72, 0x023e644f, 0x0001ccc2, 0x02ddbe5c, 0x0152beac, 0x024aa9f7, 0x030151b4, 0x03904a70, 0x03e20736, 0x003c5f43}}}, + {X: Field{[10]uint32{0x0141b3ea, 0x01acd51e, 0x03090572, 0x02a57eb7, 0x01d855a7, 0x03e256f1, 0x00c7b559, 0x0023d19d, 0x03de4743, 0x0022a930}}, Y: Field{[10]uint32{0x00b8594d, 0x0357dc57, 0x018be7db, 0x01085432, 0x0278d9da, 0x03d00fb4, 0x034ae9ad, 0x00988c6f, 0x004a0eac, 0x003c9d71}}}, + {X: Field{[10]uint32{0x0325bb79, 0x01534434, 0x0313c5cb, 0x0375e156, 0x01f32d33, 0x02250124, 0x036f87ff, 0x03a49625, 0x01a497a4, 0x0005649b}}, Y: Field{[10]uint32{0x03ce8e51, 0x03c5b619, 0x00d40d35, 0x01e20a20, 0x001aa03c, 0x0327dc6e, 0x031bf67e, 0x02fea3a1, 0x00b65b1e, 0x00056b18}}}, + {X: Field{[10]uint32{0x01b1710d, 0x02bbaf7d, 0x02dbb35f, 0x01175159, 0x02fc99f5, 0x00005a23, 0x0062b48f, 0x0055d1e5, 0x00feaa74, 0x00157d3d}}, Y: Field{[10]uint32{0x0302d15f, 0x01486d2e, 0x03e0f662, 0x02b6db8f, 0x03d015a4, 0x01f7fb0f, 0x027b8945, 0x0132139d, 0x020563f2, 0x00203b3a}}}, + {X: Field{[10]uint32{0x00e93cee, 0x00dfda38, 0x03e0d0b1, 0x035d335c, 0x02f04a60, 0x0136ccdf, 0x0357c4ae, 0x01fccfe8, 0x02cf402f, 0x0025695a}}, Y: Field{[10]uint32{0x036501fd, 0x0086d3bb, 0x021a4bd5, 0x038f396d, 0x01d21c89, 0x00c326b9, 0x034e72ca, 0x02ea105b, 0x01bfb7c9, 0x0039c901}}}, + {X: Field{[10]uint32{0x027a2aac, 0x02206ae3, 0x03cd64b0, 0x03fc1266, 0x03c2a697, 0x00daa5e0, 0x0034b7bc, 0x01eed44c, 0x0190b50d, 0x000a2a7f}}, Y: Field{[10]uint32{0x0394a788, 0x00fea8e5, 0x01720b58, 0x03d453e8, 0x01a37cfa, 0x005421e0, 0x02635968, 0x01fa9268, 0x01b05c7e, 0x001dac54}}}, + {X: Field{[10]uint32{0x0334b672, 0x03e97bf9, 0x0393cb36, 0x034e6736, 0x00b571e2, 0x02b0e3ac, 0x0116b93e, 0x018b1290, 0x01136d64, 0x001901b7}}, Y: Field{[10]uint32{0x01d7fd1e, 0x03a8d617, 0x0274fdef, 0x006a5df6, 0x01b4c5eb, 0x00aa447e, 0x019c9d06, 0x0398514b, 0x037b92b8, 0x000e5d31}}}, + {X: Field{[10]uint32{0x01066529, 0x022d99bc, 0x003c2e3c, 0x01f8dd9c, 0x029d40c3, 0x024cdd1f, 0x03ef9039, 0x03870253, 0x023fcb62, 0x0023f63c}}, Y: Field{[10]uint32{0x014ab5c8, 0x003815c3, 0x02baf310, 0x004c8244, 0x025ba190, 0x016498a5, 0x029099d7, 0x005d6c92, 0x039bde10, 0x0022c2cb}}}, + {X: Field{[10]uint32{0x03a1a24b, 0x03bb0558, 0x023cc3e0, 0x02acb49c, 0x03cc525b, 0x02325390, 0x00679bdc, 0x01cda270, 0x022bd445, 0x00145e02}}, Y: Field{[10]uint32{0x00e01109, 0x000fe8bc, 0x03dfc646, 0x028cd4c3, 0x014b6b08, 0x024e4713, 0x006e5db2, 0x02347b1d, 0x019b0e17, 0x001409b3}}}, + {X: Field{[10]uint32{0x00283561, 0x02d0aa63, 0x01065bee, 0x00d1a123, 0x025b8c85, 0x0364e772, 0x02fe0e5c, 0x03e6fcf4, 0x013ae7c7, 0x002a8052}}, Y: Field{[10]uint32{0x00da82d9, 0x0220440b, 0x030f0e9e, 0x0022cf84, 0x021783e9, 0x006678f4, 0x023af145, 0x02d78d91, 0x03454a42, 0x002823c2}}}, + {X: Field{[10]uint32{0x00ceab70, 0x029814c6, 0x01afb97f, 0x035065b3, 0x010e4456, 0x01a89fa0, 0x001c4fad, 0x039b52b2, 0x0349d4bb, 0x003362ad}}, Y: Field{[10]uint32{0x01f59beb, 0x00bc6e17, 0x01231da3, 0x020ec14a, 0x01ca8621, 0x0335eb4f, 0x01c92493, 0x02883780, 0x0339bd68, 0x003f1b1d}}}, + {X: Field{[10]uint32{0x01fe3e32, 0x02fb1715, 0x027eae00, 0x03871668, 0x02379f56, 0x002ed221, 0x017bc54e, 0x014079e8, 0x02f2e824, 0x0039a737}}, Y: Field{[10]uint32{0x02c41cd4, 0x03616362, 0x03c80f41, 0x0399b12e, 0x013fe735, 0x018a45e4, 0x0125338f, 0x014e6040, 0x01104037, 0x0003a03b}}}, + {X: Field{[10]uint32{0x03ff8a8d, 0x00623836, 0x004a2f30, 0x01a5e406, 0x00f6b6ec, 0x038c6073, 0x0308af19, 0x007dfbbe, 0x02d9182b, 0x0016939c}}, Y: Field{[10]uint32{0x01f9da19, 0x0049408b, 0x00bee2d9, 0x0189ed6c, 0x017b62ea, 0x02b0ce97, 0x031c5885, 0x015f60ec, 0x03f2d5a8, 0x000b473d}}}, + {X: Field{[10]uint32{0x00984a2b, 0x00f46d7e, 0x0330a8f2, 0x01517740, 0x020d78f1, 0x024829e7, 0x00416b03, 0x01884504, 0x005948bd, 0x00278002}}, Y: Field{[10]uint32{0x008e3f62, 0x00459d32, 0x03338db6, 0x01683634, 0x00151ab8, 0x036c37f2, 0x030680ce, 0x03f4f308, 0x00920412, 0x000dab81}}}, + {X: Field{[10]uint32{0x018bc6ff, 0x00bc84c9, 0x00d18ac8, 0x0217c2f2, 0x0399f884, 0x03a90971, 0x02d35d4a, 0x021cd3b2, 0x03aeb12f, 0x001f82e5}}, Y: Field{[10]uint32{0x01f3946e, 0x01902d5a, 0x037bccc7, 0x01011a4b, 0x00ab95fb, 0x02c2db97, 0x003b0b8a, 0x006da8ff, 0x0224a4be, 0x0039dbd3}}}, + {X: Field{[10]uint32{0x01038ee2, 0x00cdb198, 0x00c860b9, 0x039606f8, 0x02b3064b, 0x019e1e3e, 0x0281ff28, 0x03125772, 0x00fb1bdf, 0x00188a17}}, Y: Field{[10]uint32{0x009b5161, 0x013705e1, 0x024f771f, 0x0360869b, 0x00a65ca8, 0x03c56775, 0x0285ea08, 0x03a7cd03, 0x03e45f60, 0x003cb246}}}, + {X: Field{[10]uint32{0x02c82623, 0x03c49aa9, 0x00ac8006, 0x02ebbbcf, 0x00cd3765, 0x01b57067, 0x01870ef3, 0x02d735a6, 0x02812de1, 0x001c08d3}}, Y: Field{[10]uint32{0x01330736, 0x00e6ee10, 0x036ec071, 0x01a43f56, 0x023140f7, 0x0011ce2e, 0x03f3c920, 0x029ddc98, 0x018a0f92, 0x0038b6fe}}}, + {X: Field{[10]uint32{0x015db07d, 0x025e29f3, 0x025e6136, 0x0399fd2f, 0x037dc1b4, 0x010d2c29, 0x0240ef57, 0x035737b7, 0x00618f31, 0x002b9dc1}}, Y: Field{[10]uint32{0x013d16e6, 0x034fa4f6, 0x03b01d46, 0x004a5459, 0x005cc43e, 0x001d00df, 0x0120e420, 0x01121cfd, 0x01646558, 0x00293894}}}, + {X: Field{[10]uint32{0x006f2b53, 0x0126dbc9, 0x026049e3, 0x039f590f, 0x005b7f4c, 0x01a39825, 0x02b78fb7, 0x01a62d22, 0x008fe4db, 0x0033b1eb}}, Y: Field{[10]uint32{0x025fadfb, 0x01b4006d, 0x03c325ca, 0x03d2035a, 0x017f5d3c, 0x0293f20c, 0x03bfd2a7, 0x001a150c, 0x01459933, 0x001246ed}}}, + {X: Field{[10]uint32{0x005eee36, 0x013571df, 0x006658db, 0x033f0bfe, 0x010852e4, 0x01588a5e, 0x02f62e83, 0x03927c9d, 0x0296b051, 0x002009db}}, Y: Field{[10]uint32{0x002f6d9d, 0x035f713d, 0x0330cf06, 0x0394dccf, 0x002c4d4c, 0x03dd44e9, 0x00d526e5, 0x0227c21c, 0x02968825, 0x003d4435}}}, + {X: Field{[10]uint32{0x0285b27d, 0x0110c5f6, 0x02741b89, 0x03260af6, 0x00e9e351, 0x03e3e142, 0x0163934e, 0x03eabb98, 0x03d49d85, 0x002c6409}}, Y: Field{[10]uint32{0x0247a824, 0x02ecdcba, 0x002d6dba, 0x0048815d, 0x028439f8, 0x00bac10b, 0x038443af, 0x039a72cd, 0x01cbdec0, 0x00304918}}}, + {X: Field{[10]uint32{0x030c792c, 0x0016cb95, 0x0308129e, 0x01bfef10, 0x01989c65, 0x02b851fc, 0x013fc78a, 0x0300074f, 0x014acf07, 0x0015d667}}, Y: Field{[10]uint32{0x018514b0, 0x02ef7100, 0x03a23f13, 0x03ce4042, 0x0238b57a, 0x02d2d3c0, 0x00e181b1, 0x02e85b86, 0x020fd215, 0x00173e3a}}}, + {X: Field{[10]uint32{0x02e6e4b7, 0x01b9063a, 0x01490bad, 0x0230ac1f, 0x00306e6f, 0x014f9d8f, 0x03cda2b6, 0x002e0b14, 0x0283fa11, 0x0016add8}}, Y: Field{[10]uint32{0x015e8ea0, 0x00deaead, 0x02884f74, 0x01c9058a, 0x03aebe82, 0x00decfe0, 0x027de95b, 0x01e38c5e, 0x0243cc2a, 0x003fcd95}}}, + {X: Field{[10]uint32{0x019d4a85, 0x000f9fe5, 0x00898649, 0x03910943, 0x0266ea88, 0x02800c77, 0x012dd45f, 0x035edfa9, 0x01e48602, 0x001ee4f6}}, Y: Field{[10]uint32{0x022b52f0, 0x01474cc5, 0x01099a48, 0x01807cab, 0x030f6dd0, 0x03beb5b0, 0x00f50a0f, 0x007fa428, 0x02015ab9, 0x0026732c}}}, + {X: Field{[10]uint32{0x0396ebb6, 0x038b38be, 0x00a9307e, 0x0086e584, 0x011de26a, 0x02cded2e, 0x0101be72, 0x009dd904, 0x00b6af64, 0x000b561e}}, Y: Field{[10]uint32{0x00fc585a, 0x012f5f0b, 0x018f547d, 0x01aedf48, 0x00a88706, 0x019c5bcb, 0x00815d94, 0x00013a08, 0x005ddf4b, 0x0004e3b8}}}, + {X: Field{[10]uint32{0x0160af3b, 0x00c9a739, 0x03ee7ac1, 0x03d4e33e, 0x03cf1ccf, 0x039072d5, 0x00a0fce2, 0x00cb6809, 0x0068eebc, 0x000758dc}}, Y: Field{[10]uint32{0x0276eadb, 0x0333f4b0, 0x009ed1b4, 0x0252dfba, 0x02d589a4, 0x0377282b, 0x005ce542, 0x0191159a, 0x01f1a289, 0x001aa4cb}}}, + {X: Field{[10]uint32{0x027de64c, 0x0273c111, 0x029a3947, 0x03bc3fa4, 0x0326a478, 0x0244ac15, 0x0187a680, 0x0048d7cc, 0x036b460e, 0x0020aeae}}, Y: Field{[10]uint32{0x0345647f, 0x00227844, 0x00faff51, 0x0068c9f4, 0x015de43a, 0x013560da, 0x033c11c9, 0x000e5807, 0x0233603d, 0x000ea7d3}}}, + {X: Field{[10]uint32{0x0348090a, 0x01b72a82, 0x01262c27, 0x00d0306e, 0x00a01c51, 0x036ab984, 0x03d899a9, 0x016ff6d8, 0x031d4e71, 0x002ba1b9}}, Y: Field{[10]uint32{0x00fd7b5e, 0x00778a53, 0x02126a30, 0x020e7271, 0x006f2f9e, 0x02d1619e, 0x02c4df93, 0x023deffa, 0x008bfcae, 0x000d592d}}}, + {X: Field{[10]uint32{0x02a413e8, 0x01d0d90a, 0x0000ef57, 0x02f247d0, 0x02664c50, 0x007accad, 0x02d6ad7f, 0x00730fd2, 0x02fbfc66, 0x000d6970}}, Y: Field{[10]uint32{0x02d6cde5, 0x006f33b2, 0x02752711, 0x0249332b, 0x01b901d6, 0x022a0721, 0x00727826, 0x019920f8, 0x01a2887f, 0x0012940a}}}, + {X: Field{[10]uint32{0x0058e2dc, 0x01ac1a56, 0x0360ecbc, 0x0259b1b5, 0x02763244, 0x03494766, 0x027c29ad, 0x00229d87, 0x007f4dd5, 0x000e1afc}}, Y: Field{[10]uint32{0x02407696, 0x006b61f7, 0x01f41e81, 0x008456a0, 0x020f07c6, 0x023ec52c, 0x0103e196, 0x0280e076, 0x00049c1f, 0x00353c52}}}, + {X: Field{[10]uint32{0x02346f96, 0x0379aa84, 0x00909fab, 0x01f32f5c, 0x03f9c46c, 0x02441361, 0x02c445ec, 0x03d33142, 0x001c9bd6, 0x0037fb0e}}, Y: Field{[10]uint32{0x017553f1, 0x033fc09e, 0x03f2e56c, 0x01da922d, 0x03d1ce0f, 0x0365a516, 0x017ef3ca, 0x01926f7e, 0x00f825b6, 0x00179cd1}}}, + {X: Field{[10]uint32{0x002abbb2, 0x0307aa21, 0x00aaa007, 0x000b48d6, 0x02f8a243, 0x03a82ff0, 0x013e0b70, 0x00133152, 0x00c604db, 0x000d81b7}}, Y: Field{[10]uint32{0x0287301d, 0x011f9e15, 0x025edbb5, 0x02c6f880, 0x0387eea8, 0x03b28d99, 0x03569a1f, 0x026dd2e2, 0x003bbc4d, 0x0029721d}}}, + {X: Field{[10]uint32{0x012b0016, 0x014a0979, 0x012b6660, 0x00e239db, 0x00db0860, 0x007464a8, 0x03025a47, 0x025b8a68, 0x0337e190, 0x000d1079}}, Y: Field{[10]uint32{0x01eef0da, 0x02d83de0, 0x01b9e7db, 0x0128de18, 0x015eb9bd, 0x02c8ce8e, 0x003ad47b, 0x032639cf, 0x037ed5ca, 0x0001b443}}}, + {X: Field{[10]uint32{0x02636e99, 0x01504289, 0x03030002, 0x02fd737f, 0x01b1d902, 0x015aa73d, 0x02a7a5c4, 0x0230d2d7, 0x002e460d, 0x002cb25f}}, Y: Field{[10]uint32{0x02057b7c, 0x0227a8f8, 0x02bfa232, 0x007c9c85, 0x021f151e, 0x03da5cf8, 0x03417b3c, 0x03bcc1d4, 0x0081a8c8, 0x0019c4cc}}}, + {X: Field{[10]uint32{0x03e045fd, 0x03054055, 0x01a973b6, 0x02dcf6d1, 0x019b7932, 0x016409ed, 0x03fdabed, 0x00f773e3, 0x018b59a4, 0x0009d02f}}, Y: Field{[10]uint32{0x03b02a85, 0x01e01fa4, 0x0182e1ea, 0x0392c3af, 0x03987aab, 0x0304ddd4, 0x00787a63, 0x006b50b0, 0x02b1f69f, 0x002041bc}}}, + {X: Field{[10]uint32{0x01b6c21b, 0x01597862, 0x009a69ee, 0x01a76331, 0x00aaa8e2, 0x00fe5003, 0x00b4f400, 0x02530336, 0x03d9bdbd, 0x00286b3f}}, Y: Field{[10]uint32{0x02f0235b, 0x0305afc3, 0x00a66df7, 0x03033065, 0x00bcc4fd, 0x03d393d1, 0x00acfbd4, 0x03d4625d, 0x017e0733, 0x0018bb1f}}}, + {X: Field{[10]uint32{0x03349847, 0x007d05d5, 0x00cff630, 0x02f4ccb6, 0x019a5357, 0x00e34eab, 0x038c0f15, 0x012b30c9, 0x02d68d52, 0x00142eca}}, Y: Field{[10]uint32{0x03acfb32, 0x00d4a1fe, 0x03139b85, 0x039659df, 0x02ba4b33, 0x03bc062e, 0x03d4c6e1, 0x009af6e5, 0x03d5d035, 0x00363f0c}}}, + {X: Field{[10]uint32{0x034fdbd9, 0x03420e17, 0x0132ec9f, 0x02823f43, 0x01948e2c, 0x008a2040, 0x035e8601, 0x02d3eb59, 0x02626031, 0x003af7ec}}, Y: Field{[10]uint32{0x000dbf2e, 0x018a69e9, 0x02a0a9c4, 0x010a2546, 0x034f853a, 0x019b8c66, 0x03964e44, 0x0044f76c, 0x026cc470, 0x002c1e01}}}, + {X: Field{[10]uint32{0x018bd48f, 0x022dd0ba, 0x001f63a4, 0x03e05c55, 0x01d57b35, 0x0023f56b, 0x02f73e82, 0x00a8bef7, 0x00236548, 0x00176bd3}}, Y: Field{[10]uint32{0x0287f967, 0x031d728b, 0x0327db2c, 0x03cb08c0, 0x009cbd11, 0x03e8f7fb, 0x03fc83c4, 0x02181fd7, 0x03cb5a24, 0x0024056f}}}, + {X: Field{[10]uint32{0x028533c7, 0x0147327b, 0x0277d085, 0x017cac4a, 0x01238c90, 0x00d4fe09, 0x0219517f, 0x0020519e, 0x00205d84, 0x0008b6e7}}, Y: Field{[10]uint32{0x006dcdf8, 0x01c0e2ce, 0x0231c85f, 0x00a6d811, 0x027ad19e, 0x02e6b3c3, 0x02192642, 0x00a8a28c, 0x03c82343, 0x001a0286}}}, + {X: Field{[10]uint32{0x00c100ae, 0x01ca1875, 0x00d4f4db, 0x016111a5, 0x019fb446, 0x021b9b95, 0x0225213f, 0x02f94649, 0x01d102e8, 0x0010110d}}, Y: Field{[10]uint32{0x011586d1, 0x0213de1b, 0x00f4cb62, 0x016a5078, 0x02dd734e, 0x03e09246, 0x02047768, 0x03bbeba3, 0x0282b321, 0x0027af39}}}, + {X: Field{[10]uint32{0x0037530f, 0x00994cba, 0x009f260c, 0x027331a7, 0x00fe59df, 0x0354b687, 0x0200d1a3, 0x029b7be1, 0x02ff6831, 0x003730db}}, Y: Field{[10]uint32{0x0377a893, 0x0256b307, 0x014d65b7, 0x03fda643, 0x03b6b385, 0x01e159b2, 0x0298c135, 0x02dfa17a, 0x01e67360, 0x0021826d}}}, + {X: Field{[10]uint32{0x001a1514, 0x014f9e67, 0x019a8b43, 0x0101178b, 0x00e991d1, 0x018cf2d2, 0x004cd04c, 0x00e0f929, 0x03941a1c, 0x003bc37e}}, Y: Field{[10]uint32{0x036f6f42, 0x01721abd, 0x006d461e, 0x02f0f8cd, 0x019c3599, 0x01a4fb41, 0x033afabf, 0x017e6adc, 0x0160f2a7, 0x00009a17}}}, + {X: Field{[10]uint32{0x01766b8a, 0x02f14dc7, 0x01b3086a, 0x02eb6758, 0x02410b0f, 0x03299ac1, 0x012e18f2, 0x03bf5ad3, 0x00fdc6c3, 0x00092213}}, Y: Field{[10]uint32{0x00e2267d, 0x01ec5f6b, 0x0119e465, 0x0066a9a1, 0x0086a786, 0x0288f04c, 0x015c6bf8, 0x036a9f4e, 0x008566f3, 0x001f0737}}}, + {X: Field{[10]uint32{0x02cd8b20, 0x01d18c92, 0x01a450de, 0x00219e36, 0x01485b07, 0x0206dbc1, 0x0207756f, 0x012a04b1, 0x0291c700, 0x001506d9}}, Y: Field{[10]uint32{0x01c609d7, 0x0179d931, 0x0117fc7f, 0x037eba61, 0x00cefff3, 0x008e0de1, 0x009f0d50, 0x010a6b1d, 0x03018a3c, 0x0037733c}}}, + {X: Field{[10]uint32{0x01fa822d, 0x0090b068, 0x03b9a138, 0x0322ee76, 0x02f792cf, 0x03c7e0a5, 0x005eea4f, 0x00b8fea4, 0x01696726, 0x0001518a}}, Y: Field{[10]uint32{0x01e6880e, 0x02b6ff88, 0x0218570d, 0x01c043db, 0x03da2d73, 0x02195967, 0x02d8e7f9, 0x02549d3e, 0x02898e42, 0x0018c048}}}, + {X: Field{[10]uint32{0x00848e83, 0x0200833b, 0x01f6d6e1, 0x01241b3a, 0x003ddfd9, 0x001185bf, 0x0122bb97, 0x004a7734, 0x0112ad2c, 0x002501c2}}, Y: Field{[10]uint32{0x0314017b, 0x02e9b66d, 0x01536d1f, 0x03e0ad5c, 0x00b5d261, 0x0169cca9, 0x0101080b, 0x0327c532, 0x00e56bfa, 0x00270ece}}}, + {X: Field{[10]uint32{0x023ca6c9, 0x02e4a95b, 0x020173ed, 0x0180d94e, 0x02ea73b0, 0x00505ee4, 0x028071cc, 0x01987abe, 0x00e48ddc, 0x000a98cc}}, Y: Field{[10]uint32{0x03fc7d79, 0x01d878f0, 0x016f3d8b, 0x00e1ad54, 0x035802bc, 0x02fd3eea, 0x02d56a3f, 0x030d42e8, 0x01cd4754, 0x002ce314}}}, + {X: Field{[10]uint32{0x03f7424d, 0x02c11eb4, 0x00c39dac, 0x0071fbf1, 0x008c418c, 0x03fd69f5, 0x024078c5, 0x03685d6b, 0x00935f95, 0x002450b9}}, Y: Field{[10]uint32{0x0085cd05, 0x022b732e, 0x02ac0e69, 0x01fd629f, 0x0137d0ab, 0x0293e6c1, 0x0284ea55, 0x00cea7a1, 0x0274c471, 0x00054596}}}, + {X: Field{[10]uint32{0x0285804d, 0x03a995b2, 0x0169ad1e, 0x01c9ff2f, 0x000bb8d3, 0x022351fa, 0x0263ef38, 0x0137bb6e, 0x03295cac, 0x000b8662}}, Y: Field{[10]uint32{0x0380fd52, 0x01ae7b19, 0x02e63067, 0x01a07148, 0x00eb3824, 0x02c720c3, 0x02b0c2b1, 0x03fef854, 0x01b3e700, 0x000c7757}}}, + {X: Field{[10]uint32{0x0272f72d, 0x03d4db2c, 0x0264e5a3, 0x038befc0, 0x0032a671, 0x02f66f16, 0x023e52a7, 0x032bebc4, 0x01e9b2ef, 0x002d138d}}, Y: Field{[10]uint32{0x02a43423, 0x005a9696, 0x02b0871c, 0x0304e4d2, 0x03f80c81, 0x0090f992, 0x032b80a1, 0x027f5098, 0x03e3beb3, 0x00235227}}}, + {X: Field{[10]uint32{0x003a3cd7, 0x037d906e, 0x013beefd, 0x02d6439b, 0x00f609f0, 0x008918f7, 0x02cf365c, 0x012db6d7, 0x0101e132, 0x0037266b}}, Y: Field{[10]uint32{0x0111b682, 0x03f921bb, 0x003decf0, 0x02511e81, 0x03a4c1e7, 0x00e4f021, 0x000ad6a4, 0x02fabccb, 0x02ca2fea, 0x002d2d08}}}, + {X: Field{[10]uint32{0x0162a359, 0x03146ebe, 0x0237648f, 0x03f3a8a1, 0x013029eb, 0x021a3d34, 0x02af89bb, 0x0070b73e, 0x038eeb99, 0x00385d20}}, Y: Field{[10]uint32{0x00e7570b, 0x016b4aa8, 0x01ec70c0, 0x018a086a, 0x000238dc, 0x0369731d, 0x031b60a4, 0x0377252e, 0x008727cb, 0x003e0373}}}, + {X: Field{[10]uint32{0x02583d33, 0x00437ea8, 0x0349765d, 0x0062d5a2, 0x014ca21d, 0x02dce7ad, 0x00d79a48, 0x005b510b, 0x018b15bd, 0x0018900d}}, Y: Field{[10]uint32{0x00ec2d00, 0x00f0375b, 0x0013fa61, 0x005b7ccd, 0x01fc5461, 0x0290db54, 0x02d8caa8, 0x01d543b5, 0x014d724e, 0x001ab2c1}}}, + {X: Field{[10]uint32{0x023f8d70, 0x01a0d0b9, 0x007b2e62, 0x01dcb070, 0x02aa61c0, 0x03f4ebde, 0x03a29b4b, 0x02b03d50, 0x00eb560a, 0x0029d5ff}}, Y: Field{[10]uint32{0x000352da, 0x0031033d, 0x0057b39d, 0x01419d25, 0x02b4c074, 0x02f1a880, 0x00713e27, 0x015743ed, 0x02eff808, 0x00161933}}}, + {X: Field{[10]uint32{0x03777bba, 0x02f5044b, 0x008143a1, 0x02602f1d, 0x01d4b1f4, 0x03942746, 0x02e94162, 0x00527640, 0x007357c3, 0x003cdb84}}, Y: Field{[10]uint32{0x03d1993e, 0x02a5a60e, 0x0025a14a, 0x010de3c3, 0x0045f74b, 0x01b0ff92, 0x00d93967, 0x009a4f90, 0x022d139a, 0x003535f6}}}, + {X: Field{[10]uint32{0x024af99a, 0x01a75648, 0x0020b172, 0x013f3125, 0x004a8e0e, 0x0189dfbc, 0x0134949b, 0x003fdc4e, 0x014b55a4, 0x00213bcb}}, Y: Field{[10]uint32{0x01ea73a6, 0x020c2161, 0x03e3e80a, 0x01d9d53b, 0x0260465e, 0x02c759d4, 0x03f2b7a0, 0x01423d97, 0x00b701d3, 0x0015ebff}}}, + {X: Field{[10]uint32{0x03ce7576, 0x01e1e10f, 0x03f4784f, 0x037d022c, 0x0296b046, 0x03fca2eb, 0x02fdca34, 0x03d9b5f7, 0x024b274f, 0x0004e3bd}}, Y: Field{[10]uint32{0x02e1ecf1, 0x021546ff, 0x03d4ced9, 0x004bb929, 0x01dfe979, 0x000c94bb, 0x02010cbd, 0x01f10d04, 0x00e51d51, 0x003af741}}}, + {X: Field{[10]uint32{0x011f318c, 0x032d820f, 0x0189b435, 0x00a38b66, 0x032d4547, 0x01434c15, 0x02a11455, 0x015a4884, 0x03fe2ba0, 0x003a0bc0}}, Y: Field{[10]uint32{0x0012dcda, 0x017d8fd6, 0x010f2eb2, 0x00dd8099, 0x03613b29, 0x028d3848, 0x02aaf1fe, 0x0162064a, 0x03b9cf29, 0x0006469b}}}, + {X: Field{[10]uint32{0x02afb317, 0x02f4b216, 0x0296be44, 0x02630346, 0x00111170, 0x03cd17b0, 0x035fb3e7, 0x01beb1fa, 0x0000676b, 0x0015a9a1}}, Y: Field{[10]uint32{0x031dfb4e, 0x016c33a7, 0x0194903f, 0x03f33874, 0x02f49ff2, 0x03106067, 0x01dcb5f4, 0x02df316e, 0x027a5ae1, 0x000e9060}}}, + {X: Field{[10]uint32{0x001309f5, 0x028f0cb7, 0x010084ef, 0x006b9029, 0x028f735b, 0x007c9982, 0x02fe255e, 0x00f6d3ce, 0x007f1b35, 0x0020bd5d}}, Y: Field{[10]uint32{0x024a0144, 0x02a64189, 0x03bd7dd5, 0x028a933d, 0x03d05f9e, 0x0055caef, 0x007e4c67, 0x03007dfa, 0x0103f4cc, 0x0010ba2e}}}, + {X: Field{[10]uint32{0x02e0cf13, 0x02b5651d, 0x002bb0bf, 0x03040678, 0x0280ef76, 0x01dacc4d, 0x0389e0c3, 0x00659292, 0x0141c47b, 0x002244da}}, Y: Field{[10]uint32{0x002d3f3b, 0x01d4de8b, 0x0221af6f, 0x01641dfd, 0x01d722e6, 0x005df18d, 0x0071bc50, 0x01593fd2, 0x0385fb6a, 0x002ce8a9}}}, + {X: Field{[10]uint32{0x02238909, 0x018297d0, 0x01df1c73, 0x02ee5d9c, 0x010b9954, 0x03bd7628, 0x030cb51e, 0x03d60003, 0x01690c98, 0x00318942}}, Y: Field{[10]uint32{0x018ec724, 0x01cc68c1, 0x01240219, 0x0365ac7b, 0x01552d5b, 0x0065f83a, 0x013f935e, 0x02ac8937, 0x024c915e, 0x0020f40c}}}, + {X: Field{[10]uint32{0x03c7e3b4, 0x0047f523, 0x00184274, 0x02377439, 0x01ad1293, 0x03aa6761, 0x024a481d, 0x00c80119, 0x02d96391, 0x00388e66}}, Y: Field{[10]uint32{0x03c69d47, 0x01537e24, 0x03298f9b, 0x0287ec43, 0x005d8b1f, 0x02270de0, 0x02836ed3, 0x00a388ba, 0x0162beae, 0x00183fff}}}, + {X: Field{[10]uint32{0x0003d959, 0x03e0870c, 0x007b85a1, 0x035f09f3, 0x020a59c5, 0x032345e5, 0x02383d6c, 0x00a64a69, 0x031c186d, 0x00013402}}, Y: Field{[10]uint32{0x02487640, 0x00c9fa33, 0x01cb4687, 0x0375be35, 0x02dd4aa3, 0x002df1f9, 0x01c8ce7a, 0x0067f527, 0x02d127eb, 0x0021d4ba}}}, + {X: Field{[10]uint32{0x0264121e, 0x025ceba4, 0x003185ea, 0x028d6591, 0x00933cbf, 0x02df8712, 0x02548e98, 0x014b246a, 0x03ef8b8b, 0x000d1198}}, Y: Field{[10]uint32{0x014d9efd, 0x02b9d814, 0x02b06dfe, 0x01738bdc, 0x036fe388, 0x02fa959c, 0x017e6240, 0x023bb2e5, 0x01c89dfe, 0x001cf426}}}, + {X: Field{[10]uint32{0x00de6648, 0x0222ef68, 0x019e35c7, 0x0355f28c, 0x03f411d3, 0x02526d3c, 0x03038d47, 0x00aa60cc, 0x004ddbd2, 0x000dffd2}}, Y: Field{[10]uint32{0x00547c67, 0x02b9aa48, 0x00bfba9a, 0x021a0e60, 0x03a45cf0, 0x03b07d70, 0x03b14554, 0x0236074b, 0x014b5161, 0x0015694e}}}, + {X: Field{[10]uint32{0x03556ca5, 0x0256c185, 0x012e14d7, 0x01c035bc, 0x00d2881f, 0x0331b4f6, 0x01339d14, 0x0019ae42, 0x01db0ad5, 0x0033cef3}}, Y: Field{[10]uint32{0x01678a6f, 0x025e91c4, 0x000b13c1, 0x03dc22df, 0x00b61b90, 0x009d8089, 0x020e4023, 0x003c8188, 0x02bc99e2, 0x003849a1}}}, + {X: Field{[10]uint32{0x01a73402, 0x000bb7d7, 0x00d4149f, 0x02852606, 0x03d35e47, 0x00f5d296, 0x00f91101, 0x0346b28e, 0x02e7db8f, 0x00258740}}, Y: Field{[10]uint32{0x01fed240, 0x0014561c, 0x0282a1db, 0x02b7f8be, 0x01765dc8, 0x03fc85fa, 0x0115ca3b, 0x019df059, 0x02acd698, 0x002518ba}}}, + {X: Field{[10]uint32{0x006ec3ba, 0x02be5fad, 0x0135c5e1, 0x00901169, 0x003648b7, 0x01d2052b, 0x0122ca60, 0x02399497, 0x0390574a, 0x0010f98b}}, Y: Field{[10]uint32{0x01939734, 0x01a8d6cf, 0x033a318f, 0x02167b71, 0x03e141dc, 0x00634140, 0x029e20ed, 0x033c5e4d, 0x025617c1, 0x001b7bc2}}}, + {X: Field{[10]uint32{0x03dfdbb7, 0x02001495, 0x0116033b, 0x02d2a58b, 0x020457e4, 0x0237a4ec, 0x02113cf9, 0x000630d4, 0x03799d79, 0x00279a0a}}, Y: Field{[10]uint32{0x0049041b, 0x00fb1754, 0x001e93f2, 0x0153ba6a, 0x01b29833, 0x010174b2, 0x00468a06, 0x018d0e27, 0x0316bfe9, 0x00276e72}}}, + {X: Field{[10]uint32{0x01a1a8b4, 0x021db935, 0x008f9436, 0x0390800b, 0x025f9682, 0x02148064, 0x0222d130, 0x02d676ca, 0x03a78079, 0x001e4061}}, Y: Field{[10]uint32{0x03fa456e, 0x02564b2b, 0x004de17e, 0x0075a981, 0x02ade0ad, 0x01aa39aa, 0x014381e5, 0x00c600d9, 0x0346f6b4, 0x00009722}}}, + {X: Field{[10]uint32{0x00169583, 0x0339557c, 0x02b1d683, 0x030c356e, 0x01662a0d, 0x016887ff, 0x0222d653, 0x012cce67, 0x038a6c74, 0x0024a292}}, Y: Field{[10]uint32{0x026fcf84, 0x01373266, 0x01eaa75d, 0x03d9a1ff, 0x01323d55, 0x03fb21ea, 0x01af7e45, 0x02552f87, 0x0284c064, 0x000947fb}}}, + {X: Field{[10]uint32{0x02084c88, 0x01b0fd2f, 0x03fde6c1, 0x00fa6efe, 0x03a6ffb7, 0x03262e1b, 0x01872de8, 0x00bcb2b1, 0x00da8118, 0x001a13a2}}, Y: Field{[10]uint32{0x036383fe, 0x03c19173, 0x00bb60bf, 0x02c1abee, 0x03ad179e, 0x01d55eac, 0x01ae45ff, 0x018b5648, 0x019dfc9d, 0x0031146d}}}, + {X: Field{[10]uint32{0x01174343, 0x02defe93, 0x02f6cad7, 0x033aa165, 0x038e8166, 0x02526f3a, 0x00ebfa86, 0x02c335ea, 0x0283a403, 0x0022f74b}}, Y: Field{[10]uint32{0x00177172, 0x032f23ea, 0x03bad08c, 0x0167a7bf, 0x03643bb3, 0x03b24df0, 0x0307b2fe, 0x020be1f5, 0x014797f6, 0x001c8830}}}, + {X: Field{[10]uint32{0x02399543, 0x03a02c2f, 0x008b4b69, 0x01a791a5, 0x03b71958, 0x03e487da, 0x0258ef50, 0x01254a14, 0x03216e3c, 0x0030fe8e}}, Y: Field{[10]uint32{0x02ec1796, 0x03b654c2, 0x0310fc8e, 0x0285d22e, 0x015a519c, 0x0009b0b1, 0x00880503, 0x01986ddc, 0x00ed21f6, 0x003ac811}}}, + {X: Field{[10]uint32{0x037e63a2, 0x028e29eb, 0x02b483d6, 0x034b990a, 0x00195a8b, 0x0034d578, 0x01fb0df5, 0x00a564de, 0x0013eb2d, 0x0007018f}}, Y: Field{[10]uint32{0x030f2abb, 0x03d5cde1, 0x02ed7cfc, 0x01d1fd11, 0x02b00428, 0x0310389a, 0x005005c8, 0x027fd9d7, 0x0392d14c, 0x000814e3}}}, + {X: Field{[10]uint32{0x0331d452, 0x006d7803, 0x0399981f, 0x037841f8, 0x016c6086, 0x009f2d4e, 0x002dc6c2, 0x03063d2e, 0x03977b54, 0x00183019}}, Y: Field{[10]uint32{0x0098429a, 0x0157c637, 0x0013b737, 0x03dc2ab3, 0x02ce0e8b, 0x015ebebf, 0x03d2617b, 0x0046cb9b, 0x02c4e3eb, 0x000fd151}}}, + {X: Field{[10]uint32{0x02a36856, 0x03c022ff, 0x01722c0a, 0x00aebc61, 0x03421cdc, 0x008c7b62, 0x0263e90a, 0x01aaef3c, 0x03999225, 0x003f0573}}, Y: Field{[10]uint32{0x0235d798, 0x00d375f1, 0x0197e276, 0x025fd726, 0x00c01dbd, 0x0268efc9, 0x01d46e46, 0x00214dc3, 0x02a4d9c4, 0x002af8d1}}}, + {X: Field{[10]uint32{0x03249454, 0x023f9109, 0x02ee5c6f, 0x01a99649, 0x001a92b0, 0x0322c1ee, 0x00da262b, 0x00eedd0a, 0x01851817, 0x003d850e}}, Y: Field{[10]uint32{0x0301cf84, 0x00f38635, 0x004aab9f, 0x03a6731e, 0x0011fced, 0x02fa397a, 0x001f06d4, 0x01630835, 0x02ef3a25, 0x002c760c}}}, + {X: Field{[10]uint32{0x0261b5f5, 0x0085b73b, 0x00bc7ad5, 0x010c4275, 0x0301f1fd, 0x01a845aa, 0x02685427, 0x02110907, 0x00a96221, 0x0015e516}}, Y: Field{[10]uint32{0x0053e2d8, 0x0352d84b, 0x03e237bd, 0x01365eba, 0x0021274a, 0x00d6fb5c, 0x00c8d461, 0x015f1857, 0x007468c1, 0x000cf959}}}, + {X: Field{[10]uint32{0x01fe62e7, 0x01479e90, 0x023bd8c0, 0x0007f85f, 0x03abab20, 0x038d57a3, 0x0162678f, 0x0104cad5, 0x03dcb080, 0x0018dd54}}, Y: Field{[10]uint32{0x03572dce, 0x005e4826, 0x00d3c319, 0x025a1d38, 0x036989b2, 0x019ee853, 0x026a9511, 0x01b87fc6, 0x01c2ad58, 0x000a2f5b}}}, + {X: Field{[10]uint32{0x0180e2a3, 0x00dc8bad, 0x028ea66c, 0x036d5dfe, 0x0389e99d, 0x03953d60, 0x01ddb923, 0x02156f88, 0x030f6f64, 0x003baef5}}, Y: Field{[10]uint32{0x02fd4d68, 0x021a09cc, 0x00e1dedc, 0x0260f7d8, 0x007c9866, 0x034eb13b, 0x015606ea, 0x000d1529, 0x017915b5, 0x000f46da}}}, + {X: Field{[10]uint32{0x006c56fb, 0x0143909a, 0x01ddb2e3, 0x022db971, 0x023a6e88, 0x01de448d, 0x011135f3, 0x02c769a2, 0x031f2bf4, 0x0013b224}}, Y: Field{[10]uint32{0x02a09bc7, 0x0277c8d5, 0x019f535d, 0x004155a4, 0x003cbab9, 0x02370f8a, 0x03197704, 0x00c1aaf5, 0x02794c2b, 0x00357db1}}}, + {X: Field{[10]uint32{0x02e9730e, 0x03094eaf, 0x001a735b, 0x01733137, 0x018f4937, 0x03f571dc, 0x004deabf, 0x01f9e9f6, 0x0376fc5b, 0x001ad69f}}, Y: Field{[10]uint32{0x03b58af8, 0x0277d910, 0x00b7af8f, 0x02afdab6, 0x039eafb8, 0x006155d5, 0x02562df1, 0x017daac4, 0x01c48fbf, 0x0007a4d7}}}, + {X: Field{[10]uint32{0x02013af7, 0x0391e227, 0x00f27683, 0x03cc8753, 0x035f5b73, 0x01f8a601, 0x024c7591, 0x02562909, 0x01ebf620, 0x000a8c4a}}, Y: Field{[10]uint32{0x01020da4, 0x006487f4, 0x036c689a, 0x00be9b09, 0x01406673, 0x036e2b1f, 0x0346edef, 0x00a2cfe8, 0x01e4c1fc, 0x003a503d}}}, + {X: Field{[10]uint32{0x0328b5ab, 0x03d458ee, 0x02d124c6, 0x00ef120d, 0x0294a872, 0x02fcb209, 0x0307f345, 0x010fcde0, 0x001ce994, 0x00022ffa}}, Y: Field{[10]uint32{0x00433c71, 0x0192b0fc, 0x01348364, 0x01214b99, 0x0087de98, 0x02345de9, 0x028edc26, 0x017ebe5d, 0x0227857e, 0x00162c5b}}}, + {X: Field{[10]uint32{0x02d61be3, 0x00cdef62, 0x00f831c1, 0x024a8143, 0x01054236, 0x03934d5b, 0x039daf3e, 0x0159b4b4, 0x00d9449c, 0x0011e083}}, Y: Field{[10]uint32{0x0152c2e4, 0x03ca3326, 0x026655e5, 0x0232a6ba, 0x011200d3, 0x00bc9d11, 0x02d069d2, 0x02a04001, 0x02032988, 0x001237eb}}}, + {X: Field{[10]uint32{0x01a934e2, 0x03a64855, 0x01131cd6, 0x0149075f, 0x00f9e8dc, 0x0130fbca, 0x01221d88, 0x00d81627, 0x03ce8e45, 0x000b5fc0}}, Y: Field{[10]uint32{0x03ee9c72, 0x00ae3a2d, 0x0043a57a, 0x01c9b5b2, 0x0116a7b2, 0x00a1813e, 0x014d55fe, 0x03ce387c, 0x03c05a39, 0x0021052c}}}, + {X: Field{[10]uint32{0x01d8e37b, 0x008017a6, 0x0267f1dc, 0x01b2cec7, 0x03f5a5b0, 0x02109416, 0x0150d4ee, 0x02321b08, 0x00ec919d, 0x0020e21f}}, Y: Field{[10]uint32{0x02b4c009, 0x03ba5064, 0x03e327a2, 0x039fe620, 0x03fcea9d, 0x03962117, 0x0134fe12, 0x03ab89e3, 0x03cdf5c9, 0x003fb839}}}, + {X: Field{[10]uint32{0x01ca1e24, 0x037c6474, 0x010f3f37, 0x002469ed, 0x00a9d0b7, 0x01970ff8, 0x028c03f5, 0x02eac836, 0x01e1138b, 0x0001467e}}, Y: Field{[10]uint32{0x0261ba9e, 0x0300da86, 0x039eb367, 0x02a6b79a, 0x01ef6cd6, 0x0207a5bd, 0x0231ec07, 0x033908fd, 0x02fe2bff, 0x001935ae}}}, + {X: Field{[10]uint32{0x028fba61, 0x004eb652, 0x02e6c3cd, 0x03998fb7, 0x023946ff, 0x00a4d854, 0x02de2087, 0x01d3a9a6, 0x038f84bc, 0x0020247d}}, Y: Field{[10]uint32{0x030bda1a, 0x00ea7302, 0x02212fe1, 0x03b0e79e, 0x006765fa, 0x01c02aab, 0x03a5d90d, 0x01a23072, 0x018baf84, 0x0006aaa9}}}, + {X: Field{[10]uint32{0x02db3afc, 0x023a5f9e, 0x01bb49ed, 0x00815b35, 0x018388cf, 0x028dbc43, 0x02a53434, 0x015d21f0, 0x000dd3fe, 0x00142af0}}, Y: Field{[10]uint32{0x01ed25ea, 0x00390763, 0x015d68a8, 0x03640eb7, 0x01670fe0, 0x026e76c0, 0x0064f01d, 0x00103ec7, 0x019514b6, 0x002ae2eb}}}, + {X: Field{[10]uint32{0x02a2f110, 0x001dcacd, 0x0131faa2, 0x00b9b44a, 0x0120e572, 0x010dab9d, 0x024f2533, 0x007d12a7, 0x00bb4da0, 0x002a690a}}, Y: Field{[10]uint32{0x034c0c5f, 0x0321141d, 0x037a0557, 0x02da16d0, 0x00f8c226, 0x03e94f88, 0x00f05822, 0x0289b110, 0x021a1830, 0x002e8144}}}, + {X: Field{[10]uint32{0x007a83ce, 0x026c742b, 0x03ecf64e, 0x0396ddd4, 0x01d6948b, 0x0047a668, 0x03fa11b2, 0x0359ddc9, 0x03d46314, 0x0035ebf6}}, Y: Field{[10]uint32{0x00e21d04, 0x02e8734d, 0x008f480a, 0x03e945ca, 0x03ee9b2a, 0x0272d0aa, 0x010ed9d7, 0x012aee8e, 0x017d748a, 0x002d7e2e}}}, + {X: Field{[10]uint32{0x036de265, 0x00aaff66, 0x03a99d62, 0x006b5462, 0x0113f19b, 0x019cab15, 0x0141694b, 0x01119a8f, 0x034cd2b5, 0x000adae0}}, Y: Field{[10]uint32{0x02b9b0d6, 0x033b141e, 0x01df187c, 0x026e24b6, 0x0174ec84, 0x032facb9, 0x01d52dd3, 0x02cf4ab4, 0x0193ddc0, 0x00306489}}}, + {X: Field{[10]uint32{0x016ac8ea, 0x018326ea, 0x025a2513, 0x012c68fb, 0x03f29c34, 0x0270471a, 0x016ef7ea, 0x00fe8c56, 0x034ad7f9, 0x003ce4f3}}, Y: Field{[10]uint32{0x028133e1, 0x03b6ea9e, 0x027ec41b, 0x02ccd78e, 0x01fbfa56, 0x00341849, 0x02480163, 0x033bae43, 0x00a9de67, 0x0013a047}}}, + {X: Field{[10]uint32{0x008f418a, 0x0235d7a7, 0x03c0e084, 0x02f414be, 0x00bbc546, 0x028922a5, 0x03050120, 0x02c95204, 0x02504e14, 0x002f0ee4}}, Y: Field{[10]uint32{0x02a58223, 0x03bcab69, 0x022d9af0, 0x00e31d86, 0x018f5eca, 0x00475e31, 0x013a911f, 0x021f05d9, 0x03c6f8b4, 0x002694ab}}}, + {X: Field{[10]uint32{0x036055c0, 0x019fbbd7, 0x01cec014, 0x00eefdbe, 0x03e71edc, 0x02af6c7d, 0x021e1704, 0x03ee29cc, 0x0273c601, 0x000bd683}}, Y: Field{[10]uint32{0x0153e393, 0x00fd1099, 0x002ebc5a, 0x033c4f65, 0x02b79a5e, 0x03e01c84, 0x01d97f80, 0x00b2c4ee, 0x010d142d, 0x00362ec7}}}, + {X: Field{[10]uint32{0x03a54ae8, 0x00fb4d1c, 0x0215bfa1, 0x01efd72f, 0x018d8d8d, 0x0245b047, 0x01099b96, 0x01a6b213, 0x01e3b4fc, 0x002e0f94}}, Y: Field{[10]uint32{0x023dda5b, 0x00d970b2, 0x02a78f3f, 0x0211b876, 0x01daeb7a, 0x01f3f094, 0x0018084a, 0x00e48c88, 0x038869c5, 0x0008cb83}}}, + {X: Field{[10]uint32{0x03516377, 0x026902f9, 0x00c0ea24, 0x00c16423, 0x00e90e9b, 0x03ba2416, 0x032b3722, 0x01e8c854, 0x019350b0, 0x000425c6}}, Y: Field{[10]uint32{0x020a1055, 0x025adb96, 0x03f672c7, 0x03e7395b, 0x010dc735, 0x00c21e67, 0x023a3a5e, 0x0168126f, 0x027c7bd5, 0x001a682d}}}, + {X: Field{[10]uint32{0x005c4477, 0x009e88fa, 0x01647dcb, 0x0053051a, 0x02622508, 0x000a6774, 0x0171711a, 0x014063cf, 0x035cc95d, 0x0036fbbd}}, Y: Field{[10]uint32{0x00d66413, 0x01daa422, 0x0175335e, 0x038c72fe, 0x00676311, 0x03148dfe, 0x02a68556, 0x013e38ae, 0x02cd1633, 0x003751c4}}}, + {X: Field{[10]uint32{0x03af114f, 0x0201b55a, 0x00d29d96, 0x02239328, 0x03027238, 0x00ded043, 0x0005f185, 0x03a4e3cd, 0x01992bde, 0x000a32c4}}, Y: Field{[10]uint32{0x001e5aa3, 0x03afd2fa, 0x03fea695, 0x01b30a95, 0x01c3e2ef, 0x00e973a2, 0x029fc1e8, 0x0376078e, 0x03febbe5, 0x00039b18}}}, + {X: Field{[10]uint32{0x029f60ba, 0x02e8b893, 0x02da3790, 0x016b919d, 0x00caef38, 0x0273b175, 0x039f1768, 0x03a67997, 0x030b64ef, 0x003c28b7}}, Y: Field{[10]uint32{0x007a4519, 0x02db4520, 0x01a85713, 0x0081ef3c, 0x02006a25, 0x02a9df69, 0x0098c12a, 0x03d99051, 0x0208b900, 0x0029f29f}}}, + {X: Field{[10]uint32{0x002b0f00, 0x037ff952, 0x01410799, 0x001a6aec, 0x0254fe9b, 0x03d54c41, 0x007ad4f0, 0x010e5837, 0x02eb38e5, 0x00346ed1}}, Y: Field{[10]uint32{0x02ce4214, 0x007e48ba, 0x00b14a03, 0x00b2be4c, 0x00d03bbd, 0x01a09adb, 0x00a54639, 0x00c2d834, 0x019fe088, 0x00052c18}}}, + {X: Field{[10]uint32{0x0369517a, 0x00333807, 0x00a8415c, 0x00083152, 0x0185d740, 0x03074268, 0x01adb31a, 0x0049a97d, 0x02567705, 0x0009ef4b}}, Y: Field{[10]uint32{0x01468d32, 0x01e064a9, 0x0008f655, 0x02b61cd3, 0x03202690, 0x0238c0b5, 0x01ce428a, 0x00734a7e, 0x01d7cba2, 0x0004880f}}}, + {X: Field{[10]uint32{0x03d21d9c, 0x010c806f, 0x003bd61d, 0x0376e36f, 0x0355441a, 0x02cad9db, 0x03835efa, 0x038805a4, 0x03901c72, 0x001acb31}}, Y: Field{[10]uint32{0x02dd7456, 0x016ce8d2, 0x015601bd, 0x0014639d, 0x006690bb, 0x018bfce3, 0x03f90d4b, 0x00124f6b, 0x0006deea, 0x001665cd}}}, + {X: Field{[10]uint32{0x00840f27, 0x0027ed65, 0x012675df, 0x024f981f, 0x01c63c3b, 0x02ff35af, 0x02a8bcc6, 0x014f158c, 0x003f32f9, 0x001d7a17}}, Y: Field{[10]uint32{0x00b6bb30, 0x03c07b5b, 0x01c47723, 0x02832fdb, 0x00bc59ac, 0x0109b99a, 0x0324f89d, 0x031cf65a, 0x03768714, 0x0008bd68}}}, + {X: Field{[10]uint32{0x006d56a7, 0x00802e7e, 0x0268315e, 0x0149a314, 0x02f26e17, 0x038a3c79, 0x000eed57, 0x0054bd07, 0x0071969e, 0x0034de8c}}, Y: Field{[10]uint32{0x02ff6181, 0x0080d59d, 0x036d3abe, 0x030ed1d0, 0x0370e296, 0x025885c8, 0x004b1fbd, 0x00747437, 0x03269875, 0x0014f549}}}, + {X: Field{[10]uint32{0x03414976, 0x014407a9, 0x001d237d, 0x0262538d, 0x02676931, 0x03860eec, 0x01466408, 0x01a5ccd9, 0x03047f5e, 0x001c56ec}}, Y: Field{[10]uint32{0x01a968d4, 0x01827ba8, 0x01acadb7, 0x03ec0f60, 0x02a89dd1, 0x03a570f5, 0x01ea6722, 0x0357a1e9, 0x035f9e82, 0x000a1103}}}, + {X: Field{[10]uint32{0x02c642e8, 0x022b7df6, 0x0013968d, 0x0292c21f, 0x028e4924, 0x01a04bb0, 0x034a52cc, 0x0056569e, 0x002a4f5b, 0x003dcb45}}, Y: Field{[10]uint32{0x021087dd, 0x023e5e9d, 0x007a6537, 0x0333eebd, 0x00585486, 0x03165305, 0x02ab9bbb, 0x0010b3c5, 0x004bb5d8, 0x001406d9}}}, + {X: Field{[10]uint32{0x01284c26, 0x00ee58b0, 0x03f28024, 0x01b363ef, 0x00384084, 0x0291a7cd, 0x003cf020, 0x0228e97f, 0x038fb4ca, 0x001ecfbf}}, Y: Field{[10]uint32{0x01748579, 0x0240ad6c, 0x00522811, 0x01bbf544, 0x023bbf63, 0x03858408, 0x00bc5555, 0x01849294, 0x00fd1539, 0x002f8962}}}, + {X: Field{[10]uint32{0x02113dd8, 0x017f0de2, 0x018a59cc, 0x00d7fcad, 0x03ec2a70, 0x025d3933, 0x03652257, 0x03b29334, 0x00d771fb, 0x0009106a}}, Y: Field{[10]uint32{0x02447981, 0x00a624e0, 0x00fccae1, 0x00b64c5b, 0x00fe035d, 0x02b08cd8, 0x03f4c6a7, 0x019c4d2e, 0x03760531, 0x000152c1}}}, + {X: Field{[10]uint32{0x00cf7591, 0x03a68a85, 0x0024de78, 0x01f2d92e, 0x02512d09, 0x03d2ace1, 0x03916b12, 0x019f2916, 0x024ed054, 0x003083f2}}, Y: Field{[10]uint32{0x00eecc02, 0x008d56b9, 0x0346d02b, 0x022c8e33, 0x03931fc4, 0x036b4439, 0x007e69c9, 0x0101cb2a, 0x00c796ee, 0x0022146b}}}, + {X: Field{[10]uint32{0x009ec8e7, 0x024bac81, 0x01d67634, 0x01b5a437, 0x00a34c6c, 0x035d604c, 0x00e415aa, 0x01498edd, 0x028d0137, 0x000bdac3}}, Y: Field{[10]uint32{0x02f25dbe, 0x01354e36, 0x02868e38, 0x01d7d88d, 0x03adc722, 0x02d327d9, 0x02cb614e, 0x03da9e5d, 0x01f8438c, 0x003431e4}}}, + {X: Field{[10]uint32{0x02b665dd, 0x02e47aac, 0x00762c5a, 0x00f0f763, 0x01fc0037, 0x00dd36c8, 0x00b3ed11, 0x0015b5be, 0x01be426f, 0x002febf0}}, Y: Field{[10]uint32{0x010e2a2e, 0x00d84545, 0x02781684, 0x01429d64, 0x006dc400, 0x02841b69, 0x027b0710, 0x0000e9fe, 0x0297a4cf, 0x0027107c}}}, + {X: Field{[10]uint32{0x01cb4e8c, 0x024c1db3, 0x01be91df, 0x03dc5ca3, 0x03895980, 0x01d675d3, 0x0376f860, 0x0009cdb5, 0x01ca9056, 0x0033dc47}}, Y: Field{[10]uint32{0x034f1cd5, 0x0102a9dc, 0x020124e1, 0x02991fb3, 0x022f91f6, 0x02226c8f, 0x0156defe, 0x0085bf8d, 0x01bfcf25, 0x0014a8de}}}, + {X: Field{[10]uint32{0x03d1384b, 0x0145b26a, 0x0394e1c3, 0x01d46191, 0x03f516fd, 0x00da43cb, 0x0001ec36, 0x03c6630c, 0x01de27aa, 0x002e6fa5}}, Y: Field{[10]uint32{0x02cb6df9, 0x030489c7, 0x013cd27f, 0x0160aea1, 0x001ff85d, 0x02232e3e, 0x029b6144, 0x03710c0f, 0x0397dca1, 0x001a21d7}}}, + {X: Field{[10]uint32{0x00e9638e, 0x014ddcca, 0x03331fff, 0x02cf095f, 0x037bec31, 0x01466b80, 0x0042b377, 0x01aa314d, 0x03e6c4d0, 0x003d7c95}}, Y: Field{[10]uint32{0x03e986dd, 0x03c85950, 0x0169e35f, 0x03b2ed00, 0x02c80bea, 0x03483432, 0x012e3ed0, 0x00c84eed, 0x020a48d0, 0x002da879}}}, + {X: Field{[10]uint32{0x00099ce7, 0x02455799, 0x02bf9df0, 0x00ff2db3, 0x02a5281b, 0x002bdf64, 0x00036033, 0x022a8456, 0x034c17e3, 0x003f0d71}}, Y: Field{[10]uint32{0x0379dae9, 0x00e489f6, 0x0245ac62, 0x02ecbb23, 0x018421fb, 0x0205344c, 0x00c1c589, 0x01a4ed69, 0x004d41e8, 0x001b8be6}}}, + {X: Field{[10]uint32{0x014384dd, 0x00bf33b5, 0x00aa7473, 0x0287338d, 0x02c1bc18, 0x027feb29, 0x005e5a98, 0x01cd8dd0, 0x020149d9, 0x002b04d7}}, Y: Field{[10]uint32{0x02f021d0, 0x00685882, 0x01cb1c47, 0x014d844f, 0x01d8e545, 0x027e35c2, 0x00cbf630, 0x0129adaf, 0x02cdff95, 0x000f8e2e}}}, + {X: Field{[10]uint32{0x035f345d, 0x01d3e4a7, 0x01055f36, 0x015f3d30, 0x01bfd8f6, 0x01e46806, 0x02400c4e, 0x03175e00, 0x03fbefb3, 0x00182804}}, Y: Field{[10]uint32{0x00a1bd97, 0x00817cce, 0x035b2711, 0x019151a2, 0x039907e3, 0x028c8004, 0x00a5138c, 0x03f8f8a8, 0x00483582, 0x001f9d8f}}}, + {X: Field{[10]uint32{0x01a7acb7, 0x03413a86, 0x013a906e, 0x01642fbe, 0x02ceb3a6, 0x029e2664, 0x023d0273, 0x01ea290e, 0x01065d90, 0x00282668}}, Y: Field{[10]uint32{0x03c5a50d, 0x038f5ed6, 0x007db06f, 0x02836c50, 0x02d5cca4, 0x03c326d1, 0x034bb579, 0x008bff00, 0x03fbfe3c, 0x0004dfe7}}}, + {X: Field{[10]uint32{0x00a792ab, 0x03d3f0e5, 0x0107b09e, 0x005c127c, 0x00c6ed70, 0x00472769, 0x03ea5a8c, 0x018f5861, 0x0286d027, 0x0026e876}}, Y: Field{[10]uint32{0x0263f741, 0x00866759, 0x01650c47, 0x029970b6, 0x008716ae, 0x0005d461, 0x03879089, 0x0167156f, 0x02d8ab54, 0x003c6788}}}, + {X: Field{[10]uint32{0x0277ada0, 0x01453269, 0x0134f63a, 0x00e24d42, 0x01b5e022, 0x03ca3643, 0x03e93633, 0x0050c05e, 0x001ad30d, 0x000d909c}}, Y: Field{[10]uint32{0x01aba970, 0x00378efc, 0x02c22344, 0x02613d4a, 0x026432fa, 0x02a2ef61, 0x0279f487, 0x02ef1b13, 0x02b9c76b, 0x000bf7e6}}}, + {X: Field{[10]uint32{0x02941a5b, 0x028e94b5, 0x02c31c2e, 0x003551c4, 0x0106188c, 0x00b261c6, 0x0153012e, 0x01c26363, 0x0058100b, 0x000a7de7}}, Y: Field{[10]uint32{0x022d524b, 0x01a242e6, 0x01bf3721, 0x02dc0b56, 0x02919d5b, 0x021a8a01, 0x00ec42f5, 0x0306ec34, 0x0199eaa6, 0x002fa7b7}}}, + {X: Field{[10]uint32{0x01ba1bbc, 0x034b11e2, 0x03061e5e, 0x0342b17f, 0x0004b470, 0x00ffacd4, 0x02d5030c, 0x00a13e05, 0x02dfbc35, 0x0038046a}}, Y: Field{[10]uint32{0x00c979e3, 0x0030068f, 0x0270055a, 0x02a4fd2c, 0x03021ec1, 0x00a4ef9d, 0x026ee97f, 0x016468db, 0x03934f2b, 0x00382a63}}}, + {X: Field{[10]uint32{0x03d78585, 0x025bb813, 0x02dfb3ed, 0x0145dfff, 0x020ee06a, 0x022e4887, 0x02b54b68, 0x014d58df, 0x016b00fe, 0x00297220}}, Y: Field{[10]uint32{0x01ff8e5f, 0x02f96a32, 0x0076fe03, 0x0076bb59, 0x037d6595, 0x029abb54, 0x00977929, 0x02c46912, 0x037b9d63, 0x000fe198}}}, + {X: Field{[10]uint32{0x03194707, 0x03c5b271, 0x02509abe, 0x038244a8, 0x022e6d49, 0x01c23f39, 0x0207798e, 0x00d42e54, 0x00237e44, 0x000ee54b}}, Y: Field{[10]uint32{0x01d68936, 0x026d676f, 0x02edaff4, 0x00c5af37, 0x02e6ebb6, 0x01e44b99, 0x0141a385, 0x01b22b27, 0x032a419e, 0x003de125}}}, + {X: Field{[10]uint32{0x0157af04, 0x000bc937, 0x02632725, 0x004667e1, 0x02b75dd6, 0x021e92aa, 0x007982a1, 0x0054be03, 0x02bcd9d8, 0x002365e5}}, Y: Field{[10]uint32{0x03e611bd, 0x026080ad, 0x0092c89c, 0x034a63a6, 0x010317c2, 0x035a2654, 0x015695f2, 0x0078e8a3, 0x007994a3, 0x003ee6c5}}}, + {X: Field{[10]uint32{0x0202de40, 0x005dc11a, 0x03f51845, 0x01edbbd9, 0x014fde4d, 0x01e2259a, 0x036f689d, 0x01911454, 0x005b2f4e, 0x0025acaf}}, Y: Field{[10]uint32{0x008e89cc, 0x01712842, 0x0178b214, 0x026cd4b0, 0x01914eee, 0x03eff394, 0x039bbf5a, 0x020b6d40, 0x0126f919, 0x00382ddb}}}, + {X: Field{[10]uint32{0x032e2d79, 0x03bd7490, 0x0103625b, 0x02e68743, 0x034e3ab2, 0x01963be5, 0x028f54d8, 0x0254038a, 0x03109f12, 0x0026fdf3}}, Y: Field{[10]uint32{0x016e8582, 0x0343c652, 0x0020be32, 0x029c66f3, 0x01dd6373, 0x0223af49, 0x038bb521, 0x0071a146, 0x03adf77e, 0x000844f5}}}, + {X: Field{[10]uint32{0x03d4f1b7, 0x0013cabc, 0x00dab11a, 0x00f58756, 0x00c91f85, 0x0366a861, 0x008c7414, 0x016d7abf, 0x03a72037, 0x000434ff}}, Y: Field{[10]uint32{0x03298c90, 0x0043a8c3, 0x0321beeb, 0x002b505b, 0x02c98d75, 0x03e30fc0, 0x015c7046, 0x03d0f2c8, 0x032a8a96, 0x00307e12}}}, + {X: Field{[10]uint32{0x003a5eb6, 0x019e7a03, 0x00e92c0e, 0x01fa210c, 0x030e9257, 0x006da1cc, 0x01636920, 0x007342e3, 0x022b6adf, 0x0015b593}}, Y: Field{[10]uint32{0x02f71cc0, 0x0069badf, 0x0382451b, 0x01f89792, 0x025d4b68, 0x01f579a5, 0x00427c25, 0x02108d22, 0x030efbe9, 0x0000004d}}}, + {X: Field{[10]uint32{0x031528bf, 0x02b70d1c, 0x021c1420, 0x014a95a0, 0x026dbfa3, 0x003091e4, 0x01eddbd2, 0x033c81d7, 0x003e1c83, 0x003fb128}}, Y: Field{[10]uint32{0x01a95509, 0x01f9aa2f, 0x00b2aa78, 0x023bf5ef, 0x031bab78, 0x00e1fa6f, 0x03a0d98f, 0x0390b4ee, 0x02af8670, 0x002854ac}}}, + {X: Field{[10]uint32{0x03ee92eb, 0x030983cb, 0x03001779, 0x036ca6a1, 0x02a45d11, 0x02256796, 0x02e6d53e, 0x02a6b18e, 0x01177cce, 0x0016029d}}, Y: Field{[10]uint32{0x029e8edd, 0x03d3e719, 0x02a06862, 0x02436304, 0x0086733a, 0x0054dd69, 0x008c4111, 0x03193081, 0x029c3263, 0x001e4ef9}}}, + {X: Field{[10]uint32{0x02f636f6, 0x036e5d9a, 0x002f535e, 0x034b437b, 0x02991b46, 0x004de866, 0x017431b1, 0x0073af3e, 0x03e57893, 0x0024a1af}}, Y: Field{[10]uint32{0x0329f516, 0x006d6974, 0x015f28cb, 0x020147b7, 0x00c55fce, 0x0014ede0, 0x00b38fb2, 0x036d0a0f, 0x0130e962, 0x001f9dd3}}}, + {X: Field{[10]uint32{0x00f4890d, 0x008b070a, 0x02041e54, 0x01476982, 0x02803e38, 0x03fbb196, 0x002cf2ee, 0x0099494e, 0x01a99b70, 0x00181b55}}, Y: Field{[10]uint32{0x00eda1a7, 0x02295314, 0x02e5407f, 0x00147d3b, 0x0379ae2c, 0x006e2a85, 0x004a1e03, 0x01904528, 0x026e3c2a, 0x00372256}}}, + {X: Field{[10]uint32{0x01f917f5, 0x001fda5d, 0x00df66e8, 0x03180139, 0x0011387d, 0x033f23b6, 0x03ef2f1b, 0x03073773, 0x0140833e, 0x00285a83}}, Y: Field{[10]uint32{0x022d6527, 0x0246f620, 0x01388ba9, 0x03658c04, 0x037fd281, 0x02203421, 0x01f32a82, 0x01294c54, 0x013713de, 0x0015235f}}}, + {X: Field{[10]uint32{0x039f0329, 0x027430d3, 0x0262d9b7, 0x0057b7d6, 0x004a687a, 0x03881c9b, 0x03e3e7aa, 0x01388e68, 0x01d2be57, 0x00001652}}, Y: Field{[10]uint32{0x005288a9, 0x02a44851, 0x0255f337, 0x01de5c8f, 0x02f7f4e7, 0x01203de3, 0x01d94275, 0x02c970c4, 0x025a167a, 0x001c772c}}}, + {X: Field{[10]uint32{0x0168b240, 0x01f1395e, 0x01536cef, 0x00ce0840, 0x03cd1e23, 0x02707fd3, 0x017b295e, 0x00362927, 0x024ae67b, 0x002107d3}}, Y: Field{[10]uint32{0x031f4161, 0x019c7415, 0x03d5cb56, 0x00de335c, 0x01ccae80, 0x0236f99e, 0x03979f4a, 0x0293b43a, 0x009c265f, 0x0007d587}}}, + {X: Field{[10]uint32{0x02cb7442, 0x00fb0791, 0x0240ddd4, 0x02b80289, 0x03faf680, 0x0109e23f, 0x03d4b831, 0x03a7ca22, 0x01f8c748, 0x0008988f}}, Y: Field{[10]uint32{0x03a55da3, 0x003804e1, 0x03aaad5e, 0x01ed2530, 0x0317d582, 0x033a7de1, 0x024381d0, 0x02d64be5, 0x000adfcd, 0x000e03bc}}}, + {X: Field{[10]uint32{0x005185e4, 0x0319523d, 0x02e2dc88, 0x037aced9, 0x02670083, 0x0298285f, 0x007a21e5, 0x00c07ba8, 0x03c36438, 0x00205819}}, Y: Field{[10]uint32{0x01c4cbf7, 0x020abb93, 0x02647f59, 0x03b11409, 0x022eeedc, 0x00dbf0e7, 0x00f4e8e2, 0x03a7c7c1, 0x011b9a95, 0x0016be8e}}}, + {X: Field{[10]uint32{0x02085c1f, 0x01a49373, 0x02485354, 0x0270b065, 0x017d28af, 0x02a38109, 0x00f6431b, 0x0314c493, 0x01614745, 0x003e3c8d}}, Y: Field{[10]uint32{0x0334750f, 0x0199d4d9, 0x01e7507f, 0x01d6b34a, 0x02bd1012, 0x03f9dad7, 0x008c1b93, 0x006d5695, 0x0067e3b4, 0x00028594}}}, + {X: Field{[10]uint32{0x03f2f57a, 0x00ee4cd5, 0x03e23775, 0x00f77812, 0x0228bb93, 0x01c214ec, 0x01537d4c, 0x02285709, 0x0184e25b, 0x00084c95}}, Y: Field{[10]uint32{0x02e873e2, 0x02dc9fa1, 0x01f53d20, 0x03c566e8, 0x03f627b5, 0x01fc869b, 0x00b00d51, 0x03d5e83c, 0x00f2078e, 0x000dc232}}}, + {X: Field{[10]uint32{0x03dfbda3, 0x0335a98f, 0x01c77845, 0x02b2f245, 0x0188b0ba, 0x03feb050, 0x00c24b37, 0x0066cb00, 0x03fcf485, 0x002cbd3d}}, Y: Field{[10]uint32{0x0157702c, 0x0138a31f, 0x03e171c9, 0x00eb356c, 0x03de4972, 0x03d33cf1, 0x03196bb5, 0x03b90cf9, 0x019e6f52, 0x002c81ad}}}, + {X: Field{[10]uint32{0x027f7265, 0x004bfb3b, 0x02064622, 0x014f6b2b, 0x03fd9c5c, 0x01593e70, 0x0070fd39, 0x00001adf, 0x014f5f42, 0x002d3997}}, Y: Field{[10]uint32{0x016bee0e, 0x01cd41a0, 0x025bffc0, 0x0235a119, 0x0003c75b, 0x020fb0b1, 0x021723ea, 0x00efd3cc, 0x02f2e399, 0x000c1edb}}}, + {X: Field{[10]uint32{0x023a7240, 0x00d4ac77, 0x00bab8f2, 0x007410fd, 0x03aa58b6, 0x01e63ba4, 0x033968e9, 0x0026b497, 0x01939ac6, 0x0013c411}}, Y: Field{[10]uint32{0x038179ae, 0x00887b9f, 0x024bd186, 0x0224fd2a, 0x03ed9d0a, 0x01569424, 0x01698f5c, 0x0257e960, 0x03bb9883, 0x003b6361}}}, + {X: Field{[10]uint32{0x014672fa, 0x01f00592, 0x00738d09, 0x02148e22, 0x0390018e, 0x02b5d4a7, 0x026b2157, 0x0304967e, 0x00ffe515, 0x0026d79d}}, Y: Field{[10]uint32{0x01fece15, 0x00f8ebc8, 0x00bc43db, 0x03610786, 0x01fe2df3, 0x00fecee7, 0x01bf70c4, 0x00c3c5ef, 0x026d4c4e, 0x00075561}}}, + {X: Field{[10]uint32{0x0217e302, 0x0205f21f, 0x02cf510d, 0x030b1da8, 0x0330f8a2, 0x024e1ec6, 0x02968f94, 0x03dc6040, 0x0042ac8c, 0x0001defd}}, Y: Field{[10]uint32{0x032af0e9, 0x039d5bf4, 0x021f26a6, 0x0217dbbb, 0x01e4daaa, 0x01b16fbb, 0x03b1103e, 0x0011ac74, 0x02611d90, 0x002ec3e7}}}, + {X: Field{[10]uint32{0x00c266a9, 0x034e22de, 0x00fe64bc, 0x01a4c20d, 0x00d2f5d4, 0x005aa662, 0x0028f34b, 0x008125ac, 0x025cd49f, 0x0009f784}}, Y: Field{[10]uint32{0x00b54bfe, 0x00f78957, 0x039b81a4, 0x00b4c8e5, 0x0384cdfc, 0x000e6b4a, 0x019dac24, 0x0364a8ab, 0x02a8483d, 0x003d0f61}}}, + {X: Field{[10]uint32{0x03e9c116, 0x00262712, 0x01b13225, 0x03c1fe11, 0x017f026c, 0x03bed6a3, 0x03b60ae4, 0x01d78652, 0x0178ae1d, 0x00086fdc}}, Y: Field{[10]uint32{0x01b8d967, 0x03da26bb, 0x0081d434, 0x02455a59, 0x0076b522, 0x034ed63e, 0x03444664, 0x037c5745, 0x02adbc21, 0x001b2aa0}}}, + {X: Field{[10]uint32{0x0232e234, 0x00916c15, 0x0156a66d, 0x03e6702e, 0x02dc9100, 0x020a2768, 0x0365b7f0, 0x0005a906, 0x025493ee, 0x00000924}}, Y: Field{[10]uint32{0x03c45b3d, 0x01738c41, 0x016f82ed, 0x0119ebb2, 0x00d883ff, 0x013dbe41, 0x004c5367, 0x007e6054, 0x01941cb5, 0x002f28c0}}}, + {X: Field{[10]uint32{0x01867f76, 0x039d4e1f, 0x016fe230, 0x00966e4c, 0x00ea8e94, 0x02e4dc42, 0x02d89b96, 0x00ad3351, 0x00c1e347, 0x0034fd91}}, Y: Field{[10]uint32{0x018cade5, 0x02cb6943, 0x03b7c597, 0x02b8c5af, 0x0202e536, 0x01489e50, 0x0337ed9d, 0x025cca8e, 0x0203fd62, 0x00246089}}}, + {X: Field{[10]uint32{0x0325b261, 0x00dfdeb8, 0x02e89d03, 0x01d51894, 0x01915c26, 0x011fd95b, 0x00e52c81, 0x034532a2, 0x034b0e2b, 0x00321187}}, Y: Field{[10]uint32{0x00dcae06, 0x033bb6a7, 0x02b07e38, 0x016aa2a4, 0x01fa3b61, 0x011bbf7d, 0x0232868e, 0x01e66cfd, 0x018197ac, 0x000625c4}}}, + {X: Field{[10]uint32{0x0395a380, 0x00cd0ab0, 0x0060d913, 0x01aaaa96, 0x01a8c240, 0x01ef5b28, 0x0357e1da, 0x02a4e306, 0x0190be20, 0x002db97d}}, Y: Field{[10]uint32{0x018a04b6, 0x011b579f, 0x02026ff1, 0x0325a9b7, 0x01cf01ee, 0x02d698c1, 0x0186569a, 0x03ab79cb, 0x00f1a2f2, 0x00299ca3}}}, + {X: Field{[10]uint32{0x01eb5d6c, 0x013b2556, 0x008c0312, 0x0237c524, 0x018b7013, 0x017bf043, 0x014eee4b, 0x0007415b, 0x039d4657, 0x000f4945}}, Y: Field{[10]uint32{0x0395980f, 0x00ca9c62, 0x03c8c3e0, 0x028ab155, 0x023b56f7, 0x00f1625e, 0x03e88e2b, 0x035fb18c, 0x03fe1d61, 0x000562de}}}, + {X: Field{[10]uint32{0x02f94d99, 0x026965d1, 0x02927984, 0x004646bd, 0x00d85155, 0x03689fc4, 0x0093425b, 0x00526656, 0x0154c717, 0x0002aed7}}, Y: Field{[10]uint32{0x00b9a161, 0x015108b1, 0x03ad04e4, 0x002b64f5, 0x037012ff, 0x03d08270, 0x0106e89f, 0x0237a8db, 0x03cc3be2, 0x001337fa}}}, + {X: Field{[10]uint32{0x0325c73e, 0x014a41ec, 0x0224c523, 0x0219cfb1, 0x02f12433, 0x038c72ec, 0x00dedaa4, 0x03e70a40, 0x0125115e, 0x00262740}}, Y: Field{[10]uint32{0x00c6c8df, 0x01a081a5, 0x000c8d16, 0x018ca547, 0x00d553df, 0x0109e5d4, 0x01f28ee1, 0x0381c3f0, 0x02e9945d, 0x0034da67}}}, + {X: Field{[10]uint32{0x02013884, 0x03908c97, 0x02af82d0, 0x004f20a8, 0x015e05db, 0x003b7dc3, 0x028bbe4e, 0x0347fc18, 0x01d429c3, 0x00313171}}, Y: Field{[10]uint32{0x03a97eea, 0x02e9f9fb, 0x023ee0f2, 0x003744cc, 0x03ccee86, 0x002b7a5f, 0x029da677, 0x0222a7f0, 0x00b88251, 0x0030b1db}}}, + {X: Field{[10]uint32{0x02c0807b, 0x00552789, 0x01edc360, 0x0047b02e, 0x03be9471, 0x000283a0, 0x035080a9, 0x02d97236, 0x0050c623, 0x002198b6}}, Y: Field{[10]uint32{0x01da840b, 0x03c3db8d, 0x01526b3d, 0x01333e32, 0x03f91e72, 0x0246020e, 0x02a72b32, 0x039e93d9, 0x0277b0c9, 0x00029c75}}}, + {X: Field{[10]uint32{0x01083898, 0x03b6c5c7, 0x02626cbd, 0x031f03aa, 0x00543b73, 0x00eaef51, 0x0309b389, 0x0166fccc, 0x03497e73, 0x00349bfb}}, Y: Field{[10]uint32{0x01851395, 0x00e07e1e, 0x03ad956d, 0x00835236, 0x0004d60c, 0x0141c3e4, 0x0101ea9a, 0x002ce5ad, 0x0209bb09, 0x002b62ec}}}, + {X: Field{[10]uint32{0x029d8d0f, 0x01e17488, 0x009838f8, 0x03d7c5cf, 0x025b4560, 0x02d00844, 0x0342ff85, 0x02da09f5, 0x00e8c584, 0x0015a6fa}}, Y: Field{[10]uint32{0x001b8559, 0x036bf1f5, 0x0235422e, 0x00cd789b, 0x0247c74a, 0x02692754, 0x015581bf, 0x01f626a3, 0x01a4a826, 0x002c24e0}}}, + {X: Field{[10]uint32{0x030116d4, 0x0279e534, 0x02255d4a, 0x02ef256a, 0x03842f82, 0x01658363, 0x0167bc6c, 0x021eceb6, 0x00c34d17, 0x00378d2b}}, Y: Field{[10]uint32{0x021816d3, 0x02cf5de8, 0x00505b6c, 0x002fbc26, 0x00e322c4, 0x0220f4fc, 0x00f4d3e0, 0x02d4a95f, 0x001cb2b6, 0x000bf76d}}}, + {X: Field{[10]uint32{0x01c50b1a, 0x01bea671, 0x003d5544, 0x0101c376, 0x03ece852, 0x01d0a96c, 0x0149b861, 0x02dd89b5, 0x034876db, 0x0011d0c2}}, Y: Field{[10]uint32{0x03200df1, 0x00d5e92b, 0x033e85af, 0x01223771, 0x02b53dd0, 0x0323b1dc, 0x006a0ead, 0x0115cd63, 0x02ba0700, 0x0035d564}}}, + {X: Field{[10]uint32{0x02e9fe13, 0x002c25f5, 0x00fd7914, 0x03fbdb1a, 0x018c2d8f, 0x01aeeadb, 0x017339b7, 0x01c99ae8, 0x00b5e668, 0x003c7478}}, Y: Field{[10]uint32{0x0324e580, 0x0150f56f, 0x0350bb96, 0x013699f6, 0x03a1d849, 0x008c03e5, 0x01c54837, 0x00ce14d2, 0x0226fc23, 0x00002958}}}, + {X: Field{[10]uint32{0x00cdbcd0, 0x0056e17e, 0x004c3c05, 0x03fce0fd, 0x006e8132, 0x025a30dd, 0x03d0426e, 0x003784f6, 0x03357614, 0x0008a9bd}}, Y: Field{[10]uint32{0x03d18d1b, 0x038d157e, 0x01e48e69, 0x0276a101, 0x03430a39, 0x003e5690, 0x00dc0044, 0x0038f8d6, 0x01a89027, 0x00277362}}}, + {X: Field{[10]uint32{0x01a9ada2, 0x019538f8, 0x02867b46, 0x00c30a78, 0x02fc307b, 0x01d10ba3, 0x030c6ea5, 0x0232826e, 0x03280afd, 0x000b7714}}, Y: Field{[10]uint32{0x0087dee4, 0x03b6dcf0, 0x03393b5f, 0x024c665d, 0x0107d077, 0x007fe438, 0x02daa6e3, 0x039ba1ef, 0x010edb84, 0x001ee6ae}}}, + {X: Field{[10]uint32{0x01da0fca, 0x0078b065, 0x03a9e1a0, 0x015151b7, 0x011fb1c8, 0x0162e719, 0x00a116c0, 0x03d4bf4c, 0x0039a60a, 0x00182dbe}}, Y: Field{[10]uint32{0x00d26c40, 0x01360f88, 0x02bcdca5, 0x00187615, 0x03b0e743, 0x011a763a, 0x039b07b2, 0x02d052f8, 0x029f28cf, 0x00179dfd}}}, + {X: Field{[10]uint32{0x01dee53c, 0x009a9f43, 0x02776dcd, 0x00a15f25, 0x022a1f1f, 0x0257a90e, 0x0306bfdf, 0x024b9432, 0x019b9b90, 0x0009e430}}, Y: Field{[10]uint32{0x014e7f64, 0x01767cdc, 0x005b6271, 0x01662caf, 0x00de0677, 0x00085c26, 0x0387afaa, 0x01b9e2c8, 0x0120d04e, 0x003f7ba8}}}, + {X: Field{[10]uint32{0x01113803, 0x03e411bd, 0x037c00d7, 0x028d1453, 0x02db181e, 0x03eb65e0, 0x03576b16, 0x02f22c49, 0x020f9ee8, 0x0039510c}}, Y: Field{[10]uint32{0x00510741, 0x00465cb0, 0x01e0f952, 0x002b89ad, 0x023c7368, 0x03739f0c, 0x01b63dd9, 0x01d1139a, 0x02fb0239, 0x002e4dd8}}}, + {X: Field{[10]uint32{0x0355313d, 0x026abeb6, 0x00cee39f, 0x0335a6ed, 0x038e2706, 0x02f535d3, 0x00a236cb, 0x00a35618, 0x01ae73e4, 0x001b1fc9}}, Y: Field{[10]uint32{0x00dc9121, 0x012d6072, 0x030916a4, 0x012f577f, 0x018db30c, 0x0163aa48, 0x020864be, 0x026c63a6, 0x03c9e33f, 0x003632e3}}}, + {X: Field{[10]uint32{0x0393d4e8, 0x03a94ee6, 0x03499121, 0x00e80c3b, 0x03dd9eaa, 0x00e54bc9, 0x01e9c3ef, 0x00351d34, 0x0328ff71, 0x000a2746}}, Y: Field{[10]uint32{0x02880667, 0x02ce52bb, 0x03e38cf2, 0x00c9dfd2, 0x02642859, 0x0116cf2e, 0x00d5cb72, 0x00b75613, 0x000aaebc, 0x003cdabe}}}, + {X: Field{[10]uint32{0x0110b5aa, 0x028769d6, 0x03476b9f, 0x022b53bd, 0x002a6f4a, 0x0244c306, 0x0287b5d2, 0x0359cc97, 0x0197ac01, 0x003c0aad}}, Y: Field{[10]uint32{0x00e38adb, 0x025902b3, 0x02aaffe8, 0x007d97b2, 0x01d3262d, 0x030d18cf, 0x02c53795, 0x022c4fb3, 0x002aecf2, 0x002ba230}}}, + {X: Field{[10]uint32{0x00a0413a, 0x03e10637, 0x01a8d2d8, 0x01c13b0a, 0x03c625bb, 0x01b531b4, 0x0332c82d, 0x00c4195d, 0x034f71a7, 0x0002a6a5}}, Y: Field{[10]uint32{0x01b372cd, 0x022496e4, 0x01c2126e, 0x02b33f47, 0x01af1497, 0x0183b479, 0x02f222d8, 0x03a5bf57, 0x0033eed4, 0x0030837d}}}, + {X: Field{[10]uint32{0x0177496a, 0x0073d023, 0x0071f4a2, 0x03f05941, 0x024cc392, 0x018d2d57, 0x020e9c78, 0x00226466, 0x010d728e, 0x001e1986}}, Y: Field{[10]uint32{0x000cfd22, 0x004a44eb, 0x01b23035, 0x038ea4da, 0x0029d79d, 0x00d68799, 0x028e265c, 0x008bbf2a, 0x00d95404, 0x0006ed7f}}}, + {X: Field{[10]uint32{0x0333b9ac, 0x004c2920, 0x00773ce0, 0x016a4443, 0x0025cc11, 0x018f6550, 0x00e4e2de, 0x02e3afc0, 0x03e344b3, 0x003229ff}}, Y: Field{[10]uint32{0x02e67b6e, 0x0148ff97, 0x02806dbb, 0x003f6a5f, 0x02ca9128, 0x032a1c91, 0x00141aa5, 0x018ed59d, 0x03e5010c, 0x003287fe}}}, + {X: Field{[10]uint32{0x039208ba, 0x0259b993, 0x033472f9, 0x00cf533c, 0x019cc1e6, 0x01369a1c, 0x0019e84e, 0x01ab4e0d, 0x026a13ff, 0x0001b2ee}}, Y: Field{[10]uint32{0x02214a88, 0x0228a987, 0x011fcfac, 0x02258a9f, 0x03058598, 0x02711986, 0x0392c34e, 0x024fd13e, 0x01820c78, 0x000d4489}}}, + {X: Field{[10]uint32{0x019de719, 0x008ff6bf, 0x03e1287b, 0x020526e8, 0x00ffe9aa, 0x031d976b, 0x01450c82, 0x021847ad, 0x01bd691a, 0x00381fe3}}, Y: Field{[10]uint32{0x00fbc509, 0x02c18763, 0x02bc6894, 0x01b96d49, 0x030acb0c, 0x0384631f, 0x01937994, 0x033fba89, 0x01f08e39, 0x0024cb8d}}}, + {X: Field{[10]uint32{0x02d2c5d4, 0x00ce8b21, 0x029b84b6, 0x00e3f331, 0x0151f3e2, 0x034fcca9, 0x02720d71, 0x02505b37, 0x009832fd, 0x001884da}}, Y: Field{[10]uint32{0x02784e9c, 0x03dc576f, 0x00f68206, 0x01b5a72f, 0x03791f3b, 0x03c79665, 0x016d9684, 0x01f90616, 0x024d6224, 0x0004dfa6}}}, + {X: Field{[10]uint32{0x03a7b9eb, 0x013a3036, 0x004f2325, 0x02e87a9a, 0x0240a318, 0x01c43021, 0x03eb2faf, 0x019c1894, 0x018862de, 0x0022c041}}, Y: Field{[10]uint32{0x01bfd264, 0x008dc686, 0x0348e2ce, 0x00655bc3, 0x03dbd7e4, 0x01e8cfe7, 0x00bf43cf, 0x01b18333, 0x0062dcc5, 0x00152922}}}, + {X: Field{[10]uint32{0x00f213d8, 0x01203aa1, 0x031cfeaf, 0x021f70c2, 0x023fb2ed, 0x015af2eb, 0x03bbbace, 0x020d1bfb, 0x008c14af, 0x0004b4e4}}, Y: Field{[10]uint32{0x0267fdfc, 0x0206a626, 0x0024ecb1, 0x01766396, 0x01fef41e, 0x000b1366, 0x02764210, 0x036b2611, 0x01fbdf7d, 0x003f1185}}}, + {X: Field{[10]uint32{0x01784cd2, 0x018b4580, 0x013dc8da, 0x01bb7df0, 0x02b47428, 0x00a48a64, 0x00e368f6, 0x0331a6ef, 0x01e2a7b8, 0x00086741}}, Y: Field{[10]uint32{0x034c7f5c, 0x00785e28, 0x02de2076, 0x00ec8587, 0x03dd2820, 0x023eeafb, 0x029407de, 0x02c79e3b, 0x03739a7e, 0x0022bb93}}}, + {X: Field{[10]uint32{0x005de204, 0x00016db6, 0x03074852, 0x004f0e32, 0x0049bbe2, 0x034997ce, 0x011fa23a, 0x03ea47da, 0x01599a76, 0x0035f433}}, Y: Field{[10]uint32{0x011ce2fa, 0x023cdf24, 0x019d1e93, 0x018302c7, 0x03ed1a2d, 0x01c9683b, 0x021330ea, 0x0036b97a, 0x032c6075, 0x003cd255}}}, + {X: Field{[10]uint32{0x02bb6c6d, 0x03d25e3a, 0x0042d635, 0x02ecb1dc, 0x009f65cf, 0x03ea3f0f, 0x018b73f6, 0x02408e0f, 0x01f5a04c, 0x0028fe9a}}, Y: Field{[10]uint32{0x03cbdea2, 0x007296b0, 0x03e8372c, 0x035d6665, 0x010accb2, 0x00e268bc, 0x0395b18f, 0x02aac52b, 0x01a89994, 0x0031e628}}}, + {X: Field{[10]uint32{0x03b2d1cd, 0x0322bec4, 0x00e92cc5, 0x01307414, 0x00854073, 0x0176505c, 0x0072e71e, 0x0115f5e6, 0x001a825c, 0x00240ba2}}, Y: Field{[10]uint32{0x01a62d43, 0x020b0c2f, 0x01e338ac, 0x001f33f2, 0x02de099f, 0x018be091, 0x0163cccf, 0x01bee444, 0x013263bf, 0x003fc1d4}}}, + {X: Field{[10]uint32{0x0329c144, 0x03318381, 0x03505d34, 0x01693e32, 0x036923ea, 0x03c64cae, 0x021aa2b3, 0x00155b4d, 0x01f24c47, 0x000c97c6}}, Y: Field{[10]uint32{0x0294bec4, 0x01f11ae7, 0x021782a5, 0x03058665, 0x0173e3e9, 0x006fe3e7, 0x001bf358, 0x028337e6, 0x02b829a6, 0x003d2a6b}}}, + {X: Field{[10]uint32{0x021edd4b, 0x02c1f1be, 0x0024763b, 0x0117ac1e, 0x00bcdf72, 0x033ffeb3, 0x025f8602, 0x033d854f, 0x03b441a6, 0x001a653c}}, Y: Field{[10]uint32{0x0074c174, 0x02c45806, 0x03bd927d, 0x02ae1fdc, 0x02198ee4, 0x00fc1454, 0x00479d8d, 0x02a25ca7, 0x01ea892d, 0x003b0bf1}}}, + {X: Field{[10]uint32{0x02cb2d8c, 0x0284149a, 0x0137f3b7, 0x028ad6eb, 0x005663c5, 0x02307daa, 0x011bd2f0, 0x01e5bff5, 0x00324e8f, 0x00086156}}, Y: Field{[10]uint32{0x01897c2d, 0x03475da8, 0x00cf4b15, 0x0255759f, 0x033b93c4, 0x000d0efd, 0x0290d44b, 0x0300f265, 0x02cb33ce, 0x0039df3b}}}, + {X: Field{[10]uint32{0x0191b099, 0x01d33be7, 0x021b0a56, 0x00fd21ea, 0x01319693, 0x0391dcad, 0x027c312a, 0x02a00695, 0x023b32f2, 0x0024176a}}, Y: Field{[10]uint32{0x01cf369f, 0x0161c710, 0x021d6b69, 0x010d6cb2, 0x0382b648, 0x019ff705, 0x0291d5d7, 0x005c644d, 0x01c36d27, 0x002fd8a1}}}, + {X: Field{[10]uint32{0x025339f1, 0x02547bad, 0x017f5b39, 0x01d8c54e, 0x031b6853, 0x036f839f, 0x03e51613, 0x001491d7, 0x038434b6, 0x0037df3e}}, Y: Field{[10]uint32{0x03558243, 0x00333d37, 0x00d2ee58, 0x00f1be91, 0x010d1beb, 0x03659475, 0x0153393d, 0x039154b6, 0x017e1419, 0x0039c973}}}, + {X: Field{[10]uint32{0x01732491, 0x016f2d39, 0x024a5d8c, 0x01d8a33d, 0x00385cb2, 0x03297ae0, 0x0096b821, 0x00ae7a8f, 0x02fc8884, 0x0039fee7}}, Y: Field{[10]uint32{0x00f22331, 0x00a054de, 0x03d5f5e9, 0x00a3b76a, 0x011353c1, 0x019d6a5f, 0x03b83900, 0x0380dc98, 0x02bca6f9, 0x0032399d}}}, + {X: Field{[10]uint32{0x0124285b, 0x008da773, 0x012fecc1, 0x00575c78, 0x01bad797, 0x029103d6, 0x02ac0a3f, 0x02885879, 0x030c272b, 0x003468d7}}, Y: Field{[10]uint32{0x019edb3c, 0x02e526b2, 0x02ec1806, 0x02a25840, 0x0049dc41, 0x02c55900, 0x02f2f21b, 0x01c5b6e7, 0x00f7d475, 0x0007d6dc}}}, + {X: Field{[10]uint32{0x027b079f, 0x0043694a, 0x032e5551, 0x00a41164, 0x024f4204, 0x01eb98a7, 0x03da74ac, 0x03753385, 0x02e85f2d, 0x00019ae9}}, Y: Field{[10]uint32{0x03a80402, 0x002279c1, 0x03733263, 0x0010d921, 0x02219679, 0x026f7fef, 0x01a4f357, 0x03bef3d3, 0x005beb8e, 0x00363aeb}}}, + {X: Field{[10]uint32{0x00f3a749, 0x03ce682d, 0x01e487b1, 0x008875ee, 0x00c36e7c, 0x01d7e714, 0x03cf8065, 0x00414ad2, 0x029a2688, 0x0001bdfd}}, Y: Field{[10]uint32{0x0331a4c4, 0x00d6a99c, 0x0202b892, 0x016096ed, 0x00bc1835, 0x03058394, 0x00352b9c, 0x02e22ead, 0x03840d89, 0x0004741a}}}, + {X: Field{[10]uint32{0x026c0abd, 0x00308724, 0x01b90eda, 0x03fa132b, 0x0141c23a, 0x017006b1, 0x01699067, 0x0140ec98, 0x016f571d, 0x0012f85b}}, Y: Field{[10]uint32{0x02c1d06d, 0x013f8ca7, 0x011bd9a0, 0x023f2c8c, 0x01d9ede7, 0x034cffb5, 0x02116c5d, 0x03cb7586, 0x02deffa1, 0x00004107}}}, + {X: Field{[10]uint32{0x01e75886, 0x03c142c0, 0x029bd33b, 0x00d43b95, 0x03191603, 0x005a6315, 0x00abbc79, 0x02b2d9d8, 0x005db55e, 0x0022be23}}, Y: Field{[10]uint32{0x01d9a12c, 0x02fd65af, 0x02beaf61, 0x02d74af9, 0x00ca203e, 0x025801f0, 0x02eeb245, 0x02d2c4a6, 0x010b6bf2, 0x0013d6e1}}}, + {X: Field{[10]uint32{0x00ef8672, 0x02d82213, 0x035072e2, 0x00602339, 0x01edb695, 0x00e457a0, 0x03648491, 0x03ae3869, 0x037a3316, 0x002b4cf9}}, Y: Field{[10]uint32{0x037ccd90, 0x0297932b, 0x0313f16c, 0x0227c563, 0x016c4f4f, 0x025431d7, 0x01157fd7, 0x022f6769, 0x01e24bc8, 0x003e8058}}}, + {X: Field{[10]uint32{0x01d8c2bc, 0x037b6cf6, 0x01ba069e, 0x007d808b, 0x01cdb51e, 0x0070d121, 0x0196ee9b, 0x02bf9e47, 0x01ef7620, 0x001112a0}}, Y: Field{[10]uint32{0x0351e2fd, 0x006bc465, 0x03b52e64, 0x00a47beb, 0x02bd2683, 0x02ff366e, 0x02811c7f, 0x013af0bb, 0x03d9a49d, 0x002a2005}}}, + {X: Field{[10]uint32{0x02aa5c51, 0x002d98f3, 0x00aa51d1, 0x034492b2, 0x0377af3a, 0x01940e8b, 0x0387e9d2, 0x03e2d981, 0x03a39530, 0x0016c781}}, Y: Field{[10]uint32{0x037810b9, 0x00311c3d, 0x0013b450, 0x0041eef4, 0x02e87cb5, 0x021aa01a, 0x031e59b6, 0x0383ec9c, 0x00d38d55, 0x003f3d30}}}, + {X: Field{[10]uint32{0x03174309, 0x00cfb45c, 0x02844ba5, 0x01f65897, 0x01b1d42e, 0x00c5f99f, 0x034c4033, 0x01aa195e, 0x00170e98, 0x00000fa3}}, Y: Field{[10]uint32{0x00cd6caa, 0x03d54865, 0x03e5e696, 0x03d70a5b, 0x029db702, 0x00f1fb83, 0x020f3966, 0x028d743a, 0x009ff4f5, 0x0037baf9}}}, + {X: Field{[10]uint32{0x00d112c1, 0x03a0f601, 0x017e5746, 0x0241fc75, 0x036432af, 0x011ad4a2, 0x024c078b, 0x032c6674, 0x02ee5e9b, 0x0028425b}}, Y: Field{[10]uint32{0x02e7c6d4, 0x0229db74, 0x02fc13f0, 0x003f87a4, 0x0097eace, 0x033553cf, 0x02b3019a, 0x00db3595, 0x00fe6994, 0x002f44f9}}}, + {X: Field{[10]uint32{0x0265f2f0, 0x001c6dd9, 0x0093898c, 0x024d37b4, 0x00368610, 0x0269d7ba, 0x000a6d89, 0x0379d76d, 0x01794218, 0x00151d61}}, Y: Field{[10]uint32{0x01174548, 0x0184fd86, 0x021b5c6f, 0x02fca71d, 0x026bcde4, 0x0376a995, 0x00dcd94f, 0x031a25c3, 0x024213e1, 0x000ef555}}}, + {X: Field{[10]uint32{0x01456057, 0x02f1a511, 0x02df7f7b, 0x02417ba6, 0x02a44002, 0x013dd161, 0x0356604f, 0x02f112ff, 0x0192fcb4, 0x0013acca}}, Y: Field{[10]uint32{0x0245c3d4, 0x0185502e, 0x03609216, 0x02319b6d, 0x00e0cc9d, 0x0014400c, 0x0277c673, 0x027c06b6, 0x00f26834, 0x00215daa}}}, + {X: Field{[10]uint32{0x0261a22d, 0x016d322d, 0x01ea269c, 0x008fe4b9, 0x000f2917, 0x026429f0, 0x01428e75, 0x0124cf1b, 0x01efd2eb, 0x000d42cb}}, Y: Field{[10]uint32{0x00de6943, 0x003ec964, 0x0159e354, 0x02a04c83, 0x0370f807, 0x0203bd6f, 0x02126d83, 0x03cd2fcd, 0x0300add9, 0x00186b36}}}, + {X: Field{[10]uint32{0x01f360ff, 0x03f6611d, 0x03017d7a, 0x01ac0c1a, 0x032da3c9, 0x02b284a6, 0x037341ee, 0x0220654c, 0x00bece7f, 0x002453aa}}, Y: Field{[10]uint32{0x01ac7b53, 0x01ca98e1, 0x01213d32, 0x02927f22, 0x03582948, 0x022c90b6, 0x03b563ce, 0x02029d20, 0x0148ebef, 0x003caa95}}}, + {X: Field{[10]uint32{0x03dc0fef, 0x01891ae0, 0x01a33459, 0x03e714f8, 0x03ad6d44, 0x01c38fd7, 0x02baa6bd, 0x0097d2ea, 0x021738da, 0x0003d95b}}, Y: Field{[10]uint32{0x01fd83e5, 0x0076b256, 0x03ef54c3, 0x012c8103, 0x00c742ce, 0x00dcf0b1, 0x025f53cf, 0x024a1c29, 0x00fc3463, 0x00102a2d}}}, + {X: Field{[10]uint32{0x033b618f, 0x0399dc64, 0x00182ce3, 0x008e8849, 0x02d77e10, 0x0036a99b, 0x00310bbc, 0x00f39519, 0x02f0334e, 0x00291f22}}, Y: Field{[10]uint32{0x000c7f08, 0x0254a503, 0x02c4b522, 0x00ba1c57, 0x0341ec5b, 0x0285c4fa, 0x031694ff, 0x01f1d579, 0x0354056d, 0x001b6f32}}}, + {X: Field{[10]uint32{0x00753ca9, 0x01bba74c, 0x02688676, 0x00c47ab3, 0x003b5fde, 0x0085e357, 0x007947f8, 0x0012997a, 0x00625e1d, 0x0002a28a}}, Y: Field{[10]uint32{0x02fc2169, 0x03cbc78b, 0x023ba94d, 0x01d75ce4, 0x021feb3f, 0x03e8426f, 0x039e672e, 0x02813429, 0x02f7483a, 0x003e0ab5}}}, + {X: Field{[10]uint32{0x01c017d0, 0x00fde88c, 0x008371e8, 0x002283d1, 0x034fe062, 0x03f501fb, 0x02903cb3, 0x02e15789, 0x014e5f8e, 0x002807fd}}, Y: Field{[10]uint32{0x032edf92, 0x016cbb83, 0x03ee2f0e, 0x00009d98, 0x009fd59b, 0x01f64945, 0x0018ec07, 0x0069a213, 0x02f9c52f, 0x000891f1}}}, + {X: Field{[10]uint32{0x0142aed1, 0x01f21d63, 0x0072ff2d, 0x038c47d8, 0x0061ef4f, 0x02668c83, 0x02adbd60, 0x03226db2, 0x003a626a, 0x0039ec27}}, Y: Field{[10]uint32{0x00609fdc, 0x02bbf34e, 0x005e2c0f, 0x0285b667, 0x0337c3c5, 0x000f3d68, 0x01c64ace, 0x0143a639, 0x02d36a7b, 0x0023b665}}}, + {X: Field{[10]uint32{0x023ff2fd, 0x016916e1, 0x037173f3, 0x025cdcf2, 0x0196307c, 0x01816410, 0x009fb522, 0x00a81b2a, 0x0253336c, 0x000eeea7}}, Y: Field{[10]uint32{0x03d24799, 0x03a0d049, 0x0160d52a, 0x008dba32, 0x00419d51, 0x0153a6e3, 0x00ccaeae, 0x03f05bd6, 0x01093faf, 0x003cbfa4}}}, + {X: Field{[10]uint32{0x000630a3, 0x0017e70b, 0x00acdaf9, 0x0086d890, 0x0311950c, 0x010cbd4c, 0x01224000, 0x0005d088, 0x02b6dc66, 0x003d8748}}, Y: Field{[10]uint32{0x009ffb05, 0x006915c1, 0x02796142, 0x01405778, 0x00692bb2, 0x0337eac6, 0x02b7e865, 0x00b3ce4f, 0x035a1a66, 0x000181a3}}}, + {X: Field{[10]uint32{0x00a80962, 0x026f9c3a, 0x02d13718, 0x037009c0, 0x01891c45, 0x03cf91c8, 0x0038dcb8, 0x0288b62f, 0x00556b1a, 0x00296d82}}, Y: Field{[10]uint32{0x00b1ddb6, 0x02640cbf, 0x0234a071, 0x01a5f357, 0x023a9b3a, 0x01b060ab, 0x0220b99e, 0x0017287f, 0x03d2d5e3, 0x003ddfe5}}}, + {X: Field{[10]uint32{0x01e1a259, 0x02a97321, 0x02ac1be3, 0x006ca008, 0x02f03030, 0x039bd64b, 0x00ae950b, 0x00958b87, 0x02f900eb, 0x001c30ea}}, Y: Field{[10]uint32{0x00587583, 0x0085ee53, 0x01deb61f, 0x02fa85eb, 0x033f91f2, 0x004eabbd, 0x00626f72, 0x034c6739, 0x03cd31a8, 0x000fcb2d}}}, + {X: Field{[10]uint32{0x0106e530, 0x01744da3, 0x03d93b97, 0x02bf0cf9, 0x01a67952, 0x010f9e44, 0x01fcc4d4, 0x0178dca3, 0x01d1a875, 0x000775c3}}, Y: Field{[10]uint32{0x0190d084, 0x0077f35c, 0x020c4014, 0x01f6dafb, 0x01240e67, 0x03b31cf7, 0x00400742, 0x0253bd1c, 0x01741f58, 0x0011a13e}}}, + {X: Field{[10]uint32{0x0083fcf9, 0x020331a4, 0x035462b1, 0x00f5195c, 0x02f5d37c, 0x034372a0, 0x016bb7f2, 0x03f52f63, 0x018d7aac, 0x0035135a}}, Y: Field{[10]uint32{0x007dc407, 0x026fafc2, 0x03e47281, 0x0104dd02, 0x03c0c940, 0x031056f5, 0x0067b0f4, 0x00a59643, 0x003d0423, 0x00286360}}}, + {X: Field{[10]uint32{0x01b34ca5, 0x02700414, 0x019f9410, 0x00418553, 0x0362730a, 0x02c6f0ee, 0x0122ae74, 0x015d0a15, 0x02e13045, 0x00211626}}, Y: Field{[10]uint32{0x03b3606c, 0x03d88d4d, 0x0390349b, 0x02e8f78e, 0x03de14fc, 0x00be9c1f, 0x02ffce9b, 0x02bd26fd, 0x0208f2a9, 0x002e5e7e}}}, + {X: Field{[10]uint32{0x03724627, 0x034bc122, 0x006f5469, 0x00fff413, 0x01bc84e7, 0x03fc5707, 0x0131c1ef, 0x02265afb, 0x03df8911, 0x000f7b23}}, Y: Field{[10]uint32{0x03eb2c8c, 0x0389c406, 0x0310c16a, 0x028aff50, 0x03daccca, 0x013fe237, 0x011a555f, 0x016f3f6f, 0x03c1e20b, 0x002c50fc}}}, + {X: Field{[10]uint32{0x00cac160, 0x03d0dd02, 0x0012a2f0, 0x037905ed, 0x02023a8d, 0x00339197, 0x01bfcc47, 0x0367180e, 0x03c5519d, 0x000d9e97}}, Y: Field{[10]uint32{0x03f021a6, 0x03eb1729, 0x03cc2dba, 0x00825ea1, 0x03faa648, 0x00f83e3c, 0x011b136a, 0x03f2438a, 0x01df2c6b, 0x0016e3ef}}}, + {X: Field{[10]uint32{0x0063efc1, 0x00c95b25, 0x02cce5fa, 0x03f521ee, 0x031e7c2e, 0x003623a4, 0x03ab6b32, 0x0181bd82, 0x007e7777, 0x0022a956}}, Y: Field{[10]uint32{0x03f091dc, 0x00e7f474, 0x00c1888a, 0x00d11278, 0x0150beeb, 0x02b548a2, 0x02921eca, 0x0284cb05, 0x036c98bf, 0x002b16e9}}}, + {X: Field{[10]uint32{0x0084cae0, 0x01afcf03, 0x038c6a5d, 0x0107b299, 0x02af3aa4, 0x02c34471, 0x00fd9e60, 0x00cba80c, 0x01910ea6, 0x001e7000}}, Y: Field{[10]uint32{0x01dfb899, 0x034b608e, 0x01e85472, 0x037caf46, 0x01ae9c8b, 0x03d0070b, 0x000b659b, 0x02a504eb, 0x00703b19, 0x000fe550}}}, + {X: Field{[10]uint32{0x03a04fc8, 0x03e2fe00, 0x018b3d4e, 0x0292b692, 0x01e858aa, 0x01920c95, 0x01951a06, 0x027a5737, 0x032221a5, 0x00321379}}, Y: Field{[10]uint32{0x02f0a0b9, 0x02f11452, 0x01102158, 0x03483d8e, 0x010548fc, 0x01888112, 0x0011109a, 0x02fca37e, 0x0158915a, 0x001cf37a}}}, + {X: Field{[10]uint32{0x01a9d6d5, 0x01ae24ad, 0x00c218cb, 0x0373f9a5, 0x01fedf74, 0x028f164d, 0x023822b2, 0x01f58781, 0x0050c632, 0x0022c6e3}}, Y: Field{[10]uint32{0x00fe168b, 0x01832c00, 0x037f841f, 0x01ad6d90, 0x00c03676, 0x03fd0c53, 0x03dfc479, 0x0190d7d1, 0x01529f15, 0x0015ef62}}}, + {X: Field{[10]uint32{0x00702c52, 0x00ff5492, 0x03650e78, 0x039dc675, 0x0033a31c, 0x0107e061, 0x0117c4a3, 0x00be6148, 0x008a3ae8, 0x002d17bb}}, Y: Field{[10]uint32{0x020a1c90, 0x0231b867, 0x0046dc98, 0x02167ba4, 0x03254117, 0x0280525e, 0x005d0fce, 0x01ad3c24, 0x035cc708, 0x0033555a}}}, + {X: Field{[10]uint32{0x00757319, 0x001de020, 0x01cd2c57, 0x004e196a, 0x0031ab70, 0x031632f7, 0x034871ea, 0x025b1d9e, 0x00ddd930, 0x0028b577}}, Y: Field{[10]uint32{0x03064547, 0x0351ab92, 0x001a60a6, 0x02a2bd8b, 0x03227ae8, 0x00782d4d, 0x02b5978b, 0x02c8fa79, 0x02b4b130, 0x001ea901}}}, + {X: Field{[10]uint32{0x01ed2b2d, 0x0053066e, 0x025db3d3, 0x0064486b, 0x01e97f6e, 0x01426fb0, 0x0164ea83, 0x0165429d, 0x02b4e5d3, 0x001c480d}}, Y: Field{[10]uint32{0x00a93616, 0x01d0539a, 0x0172a21d, 0x00cbe725, 0x00e3a322, 0x0094d0b2, 0x0298d2f4, 0x0183a811, 0x03f38d05, 0x0009618b}}}, + {X: Field{[10]uint32{0x00bfb392, 0x00ad54bc, 0x02df0756, 0x038c1e56, 0x03dca402, 0x026bf25c, 0x02e58c87, 0x0322ea50, 0x00f7d70f, 0x0016f3bc}}, Y: Field{[10]uint32{0x03af1919, 0x032c2242, 0x0247454c, 0x0391cc95, 0x011a444c, 0x00ff15be, 0x03b0e12c, 0x016ff4fb, 0x024cecb4, 0x001f3216}}}, + {X: Field{[10]uint32{0x01741ada, 0x0076164e, 0x02b0eb5c, 0x00519d9e, 0x03b9e5f2, 0x03d713a6, 0x03ab9f0a, 0x02286c2b, 0x002f9d50, 0x0037355c}}, Y: Field{[10]uint32{0x01cc1fa1, 0x009463b7, 0x0335f9eb, 0x0161bc31, 0x013369d5, 0x00949940, 0x00d40a4a, 0x038e9f73, 0x02d7ea13, 0x003dfaba}}}, + {X: Field{[10]uint32{0x02cb3d9f, 0x02e46ef9, 0x02ec9784, 0x02e4974f, 0x02363bfc, 0x02e2dc5d, 0x01c3ade1, 0x018a7424, 0x00d0004f, 0x000b3a8c}}, Y: Field{[10]uint32{0x01c42624, 0x011825a8, 0x036e3444, 0x0152ce6c, 0x03c48ba4, 0x00f778d2, 0x009a76aa, 0x02c5c73f, 0x03ada42a, 0x002a0fd2}}}, + {X: Field{[10]uint32{0x01c32f8d, 0x01b7f1e8, 0x035d009c, 0x035ba540, 0x01150e54, 0x029064d3, 0x015fcb13, 0x00647b7c, 0x01f2767b, 0x002162d0}}, Y: Field{[10]uint32{0x03de8dd7, 0x03b3e0a7, 0x01358e5c, 0x0277d975, 0x00b34d6e, 0x01200a8a, 0x00a21720, 0x0257d51e, 0x017d76dc, 0x0020602e}}}, + {X: Field{[10]uint32{0x030e81e6, 0x03f40830, 0x01294245, 0x01a034bc, 0x033eb9a6, 0x03d06004, 0x01234e5f, 0x0166e1b4, 0x0002bee3, 0x00357260}}, Y: Field{[10]uint32{0x033781de, 0x02bad256, 0x0376d921, 0x03a47640, 0x03a0b6bc, 0x00bf21ed, 0x01a2e4ee, 0x031e5419, 0x01a4cd2b, 0x0013948b}}}, + {X: Field{[10]uint32{0x0120c1ed, 0x01b0e865, 0x00fb7d4d, 0x01db6a2b, 0x0134002d, 0x00b792df, 0x024ddf58, 0x03aa7dc6, 0x01622f9c, 0x0003afe4}}, Y: Field{[10]uint32{0x02d4e251, 0x02074616, 0x0136ecd4, 0x0126394d, 0x027e43d0, 0x00631d6a, 0x03fb4833, 0x02073638, 0x03223e18, 0x003bb9d4}}}, + {X: Field{[10]uint32{0x0261db4d, 0x01bdb202, 0x01ff6b40, 0x0013cd9a, 0x000acc45, 0x03dd2f9a, 0x002e111a, 0x015bcc23, 0x02a9d087, 0x0000e1fd}}, Y: Field{[10]uint32{0x03cdd28a, 0x02d54ba1, 0x00c4a59d, 0x0288dc89, 0x01ed0bbb, 0x033d73d3, 0x01f96d5d, 0x017e449b, 0x01e3ea1d, 0x000a2165}}}, + {X: Field{[10]uint32{0x03e46714, 0x01d255b7, 0x020df255, 0x03ba7fbc, 0x009aa409, 0x01648051, 0x03a2d70e, 0x0354b8e0, 0x01c0989b, 0x00225ffc}}, Y: Field{[10]uint32{0x01adc9d1, 0x03b3e942, 0x016c6bca, 0x01a4db7f, 0x02de0940, 0x0112a1ce, 0x0295a006, 0x0194a7d3, 0x00c9308c, 0x000f3ef0}}}, + {X: Field{[10]uint32{0x01a395af, 0x01fbc6ad, 0x03eefb57, 0x00ddbe13, 0x03bbcbb3, 0x00b62c93, 0x02bbf21e, 0x02131e2d, 0x00a68e04, 0x000c956a}}, Y: Field{[10]uint32{0x0112aeb3, 0x0089664a, 0x0081fd81, 0x0355107a, 0x0379ef3f, 0x00b5d224, 0x014a426d, 0x012e139b, 0x0002f920, 0x0005ecf0}}}, + {X: Field{[10]uint32{0x01c55599, 0x023be7f7, 0x01b7e277, 0x00079c1c, 0x011fbca1, 0x007b6889, 0x003eeafb, 0x038ec0e5, 0x0152d4d9, 0x000b292a}}, Y: Field{[10]uint32{0x03891e00, 0x00b858c8, 0x016a0989, 0x032d8f28, 0x03e98631, 0x01d231fa, 0x01a2c044, 0x030637e0, 0x02ccdf02, 0x002feb2e}}}, + {X: Field{[10]uint32{0x024383b2, 0x0017dab7, 0x03d73105, 0x03e22936, 0x02046ee5, 0x006dbb2d, 0x03b0410e, 0x00cd2b51, 0x009c478c, 0x0030fa0a}}, Y: Field{[10]uint32{0x02f0f55f, 0x00012cf5, 0x0391fde4, 0x03b89c9e, 0x0000229b, 0x02d3b488, 0x03f4309c, 0x0048e191, 0x02ceb043, 0x0015e4b0}}}, + {X: Field{[10]uint32{0x01119049, 0x02f49f05, 0x019d5f87, 0x02376e4b, 0x0086fb96, 0x01fe6108, 0x03ad63c6, 0x024be619, 0x0360a862, 0x000aef7b}}, Y: Field{[10]uint32{0x00a85362, 0x0219d598, 0x03538802, 0x018953c0, 0x00e75dac, 0x03503534, 0x0099d193, 0x0311e4a4, 0x03623536, 0x003d292d}}}, + {X: Field{[10]uint32{0x032496a9, 0x00cf2e7f, 0x03d2ce03, 0x01ef88ab, 0x01fe3ee4, 0x005292f8, 0x0014ef07, 0x02b2cc60, 0x00909e7d, 0x001de9b8}}, Y: Field{[10]uint32{0x0251065f, 0x01746214, 0x00384381, 0x009f858f, 0x0234461e, 0x00658524, 0x01915d18, 0x0241b347, 0x0075b1a9, 0x00153c39}}}, + {X: Field{[10]uint32{0x00f40ff0, 0x00e79141, 0x00b1145c, 0x0391e4d4, 0x02ea94d5, 0x01e7d935, 0x034f4139, 0x0249537a, 0x016b7871, 0x0034656e}}, Y: Field{[10]uint32{0x00e0636c, 0x01fdca70, 0x0069bd99, 0x02b696bd, 0x00b8245c, 0x002936e2, 0x032d4b2b, 0x0211ba51, 0x0040613c, 0x0008e291}}}, + {X: Field{[10]uint32{0x00815b1f, 0x029866c1, 0x01bd8113, 0x00552369, 0x00ad024d, 0x00213d05, 0x03b0f3c6, 0x029975d6, 0x0336208a, 0x0030e6a8}}, Y: Field{[10]uint32{0x0126fe5a, 0x00cc54c4, 0x012004b2, 0x014db612, 0x02455a00, 0x0395cfb9, 0x0083b226, 0x00775052, 0x02d63274, 0x001eaac7}}}, + {X: Field{[10]uint32{0x01e31f30, 0x01dd933f, 0x028d2296, 0x01c11362, 0x01d6661c, 0x00932ecc, 0x020bd270, 0x020b6f2f, 0x023d0baf, 0x003a0328}}, Y: Field{[10]uint32{0x0197451b, 0x0211d129, 0x017138c4, 0x01091a18, 0x01f67e81, 0x03ae0f97, 0x03c583a5, 0x01e1e2f2, 0x01d47318, 0x002854f4}}}, + {X: Field{[10]uint32{0x0272ef80, 0x032dec0b, 0x00120711, 0x017f82bb, 0x01f3e850, 0x0356569f, 0x016723a4, 0x0308e83e, 0x0265a5a9, 0x000e56de}}, Y: Field{[10]uint32{0x009bf990, 0x026979f9, 0x034b6222, 0x000ca64b, 0x034f88cf, 0x02895950, 0x02d37b19, 0x01b8e4da, 0x01d54747, 0x00164083}}}, + {X: Field{[10]uint32{0x010b495c, 0x03f688a4, 0x02577644, 0x0117ffbc, 0x02e8b495, 0x0144a976, 0x017e2cd9, 0x008f49ed, 0x00dbb83e, 0x0019e9fa}}, Y: Field{[10]uint32{0x00965735, 0x014c0cba, 0x01f15a87, 0x03b9a338, 0x0041fd34, 0x03a02d04, 0x00a89f78, 0x02e7d040, 0x019d3791, 0x001f0052}}}, + {X: Field{[10]uint32{0x01c0c7e7, 0x02cecfdb, 0x03892ac9, 0x00218508, 0x03ecfb4b, 0x032f8b38, 0x01863952, 0x039ec21a, 0x027d76d2, 0x003100e3}}, Y: Field{[10]uint32{0x01e92f3b, 0x0080d459, 0x0229e72f, 0x002d9909, 0x00012946, 0x030d3f23, 0x02a27bab, 0x026df4c9, 0x030d9efc, 0x00186ece}}}, + {X: Field{[10]uint32{0x03a25e5a, 0x0095a630, 0x019a88a5, 0x00201c28, 0x01b9bdda, 0x03f0fd5d, 0x029c52f5, 0x034ebbb9, 0x01e226a4, 0x001dc169}}, Y: Field{[10]uint32{0x03c7a1b7, 0x020f92d4, 0x022073a8, 0x00088901, 0x0244be9e, 0x0071aa60, 0x0026973d, 0x001be309, 0x016cf019, 0x00116382}}}, + {X: Field{[10]uint32{0x00ff48d0, 0x028d1d4d, 0x028759e4, 0x03c6d192, 0x0268a5f1, 0x007f80e5, 0x02994fa0, 0x02d7985a, 0x03c35958, 0x003cf3a2}}, Y: Field{[10]uint32{0x010058fe, 0x02891cf8, 0x00d6b222, 0x02821d40, 0x038dc92a, 0x01ebb18f, 0x008c441f, 0x035e2d9f, 0x0197be3a, 0x00270687}}}, + {X: Field{[10]uint32{0x00a4e0d0, 0x0279fccf, 0x005d7664, 0x02b6bd5a, 0x003ebb94, 0x00075be2, 0x029d764e, 0x033af6e6, 0x0120de69, 0x002417b0}}, Y: Field{[10]uint32{0x00a9d554, 0x039127a7, 0x030e93a8, 0x004b5e6a, 0x024d42ce, 0x01470032, 0x00a75d0e, 0x02a8e9dd, 0x02993974, 0x0024985f}}}, + {X: Field{[10]uint32{0x0321eeed, 0x02b69a26, 0x006b4f15, 0x011ff6c9, 0x0127d484, 0x01993078, 0x02d0edc3, 0x02164a2e, 0x024da357, 0x002c6dd2}}, Y: Field{[10]uint32{0x013206d9, 0x02c9baa7, 0x021328f5, 0x0240cf13, 0x00c14e4d, 0x00c8b134, 0x00e38231, 0x027a3ef3, 0x01c7b84e, 0x00310d4e}}}, + {X: Field{[10]uint32{0x03d8bcf1, 0x03ee58c0, 0x02025bd5, 0x01344b4f, 0x038dcf81, 0x0310b6ad, 0x03a2a471, 0x00b51acb, 0x0165c72f, 0x00035100}}, Y: Field{[10]uint32{0x0343ae3e, 0x001c87d4, 0x0022aca3, 0x01247601, 0x03fabab7, 0x031da0f7, 0x03ad9cff, 0x017eb3a5, 0x0150261f, 0x00382192}}}, + {X: Field{[10]uint32{0x0053b303, 0x00fe4e54, 0x02ed1de0, 0x02bd9602, 0x03fe08d5, 0x0355ce95, 0x03910be6, 0x00669fde, 0x004f722c, 0x003fd493}}, Y: Field{[10]uint32{0x0353bf0d, 0x02ea986d, 0x0391398f, 0x01a18bd7, 0x035b9f13, 0x00c80cd6, 0x0262deab, 0x02aa2ece, 0x014e5b25, 0x0003f52b}}}, + {X: Field{[10]uint32{0x018d091e, 0x017fbc63, 0x01a4463a, 0x02c128eb, 0x038fafa2, 0x02706e90, 0x0376a53c, 0x00420f92, 0x00bd331c, 0x003bff78}}, Y: Field{[10]uint32{0x01947dde, 0x038530c7, 0x02b9aee0, 0x037cad06, 0x02c563bd, 0x01b33bc3, 0x02e54208, 0x0084179a, 0x029ca75c, 0x003f5ea1}}}, + {X: Field{[10]uint32{0x033875e8, 0x03115c4b, 0x01278f40, 0x01939027, 0x021115ba, 0x0160eb6c, 0x034a304b, 0x03667a22, 0x02c099c8, 0x002979d1}}, Y: Field{[10]uint32{0x02934a68, 0x0307bbcb, 0x00c07fd2, 0x00e7767a, 0x02841709, 0x001cfdff, 0x00baba4f, 0x00e0c0b1, 0x0112c2af, 0x001fe0c8}}}, + {X: Field{[10]uint32{0x02ccb431, 0x006424cc, 0x0246a1ba, 0x01d121be, 0x037df5e2, 0x03f91544, 0x00daa722, 0x03a50e76, 0x01e3af5e, 0x001ab32e}}, Y: Field{[10]uint32{0x0328dcae, 0x03277267, 0x01dc443e, 0x00207f3d, 0x01a3faf1, 0x01a3e4b9, 0x03c26a9b, 0x01960141, 0x0258842d, 0x003c3785}}}, + {X: Field{[10]uint32{0x032b6d4e, 0x0225e2bd, 0x023ba1ec, 0x00c7b404, 0x00b86f3d, 0x03be15a6, 0x00e782b3, 0x00cafdba, 0x0055e40d, 0x003204f4}}, Y: Field{[10]uint32{0x01068ca6, 0x01e40463, 0x0128d288, 0x03d0aee5, 0x0047d37e, 0x021318a0, 0x01a41916, 0x0118c713, 0x03572f92, 0x002ebdb5}}}, + {X: Field{[10]uint32{0x03c7aaf9, 0x02a11365, 0x01177038, 0x0398bf7c, 0x03599dfa, 0x02f93561, 0x03baeb58, 0x03f18913, 0x00122cad, 0x0022e208}}, Y: Field{[10]uint32{0x02f7a6a3, 0x00f1e081, 0x00b2d409, 0x0291da02, 0x007867c8, 0x029690aa, 0x016e131f, 0x003693dc, 0x0293ac90, 0x003d79b0}}}, + {X: Field{[10]uint32{0x017310ce, 0x006760cb, 0x017ee096, 0x00d1341c, 0x03bc02ff, 0x03fea910, 0x00a5acc4, 0x03960ad5, 0x0050f49e, 0x0023c1d4}}, Y: Field{[10]uint32{0x01f7fd3f, 0x0284c56d, 0x021c9b99, 0x02a1adc0, 0x01f1f9f9, 0x011e668f, 0x00555c4a, 0x034c95f3, 0x01bb7ab3, 0x0004ee40}}}, + {X: Field{[10]uint32{0x00374c58, 0x035047ec, 0x01f66921, 0x036c8720, 0x0389a456, 0x00bdcb25, 0x025fb1df, 0x00f950f1, 0x02f8cf64, 0x002ef214}}, Y: Field{[10]uint32{0x030a590b, 0x012ee8ac, 0x032cd4c1, 0x00be13c0, 0x03a27e1c, 0x02c922cf, 0x03f604cf, 0x007892ca, 0x02bbe797, 0x002b423a}}}, + {X: Field{[10]uint32{0x0280bc1f, 0x000940c6, 0x009fcffa, 0x0332c795, 0x03009278, 0x03730b72, 0x00edddc9, 0x0156ee1e, 0x004b662b, 0x000b5df7}}, Y: Field{[10]uint32{0x00d058eb, 0x01821c3b, 0x03fffa8e, 0x0282272b, 0x02c07707, 0x01dbbdbb, 0x01a62f4e, 0x03ca86b4, 0x00d84fa7, 0x000a22ec}}}, + {X: Field{[10]uint32{0x03ccbdf9, 0x01e452b5, 0x00b4ffea, 0x02ae7216, 0x00c90945, 0x012ee9b2, 0x03df7d99, 0x02a1bae6, 0x031ff3b4, 0x002f20fd}}, Y: Field{[10]uint32{0x03232292, 0x034f9252, 0x00b30020, 0x018e8ea2, 0x01fa3c25, 0x03446550, 0x01ed4553, 0x01f48e02, 0x03a3e506, 0x00063a47}}}, + {X: Field{[10]uint32{0x00200919, 0x036d0d4b, 0x037b3205, 0x03038aee, 0x0045f83d, 0x011f4149, 0x0211b7e8, 0x02239ac3, 0x02578d9b, 0x001f56e5}}, Y: Field{[10]uint32{0x00515ba9, 0x03d55c24, 0x00d352fa, 0x01caabf5, 0x00b1c9e6, 0x015a6bd3, 0x00e7230c, 0x0304370a, 0x037b8830, 0x00079a27}}}, + {X: Field{[10]uint32{0x000cdc80, 0x03e4a288, 0x03cdc1ba, 0x021f2b30, 0x01516148, 0x01183128, 0x01bab4c7, 0x021a20c7, 0x03648d75, 0x00217a7c}}, Y: Field{[10]uint32{0x01369e27, 0x0239684c, 0x03a9dd5f, 0x03d300ff, 0x035ba5e4, 0x001fdff0, 0x025224cc, 0x01170161, 0x01180d50, 0x001fd339}}}, + {X: Field{[10]uint32{0x02cd0810, 0x00765d12, 0x0065da10, 0x01dd16c7, 0x029c1d10, 0x02ef6dc6, 0x0055816d, 0x0252f4d2, 0x00dfc1c0, 0x001094e4}}, Y: Field{[10]uint32{0x0349bc00, 0x01df53c7, 0x0327d1e2, 0x030c2303, 0x02707547, 0x0027785d, 0x0026d94f, 0x0135c1a4, 0x00dd20ef, 0x00207c53}}}, + {X: Field{[10]uint32{0x013549d7, 0x036bfd90, 0x004194ce, 0x0026fe39, 0x02dbb594, 0x00283dd6, 0x00d00bb6, 0x024eb094, 0x030b66dc, 0x000f31f3}}, Y: Field{[10]uint32{0x00204a58, 0x01307587, 0x0323a066, 0x00668afa, 0x02ae17b7, 0x037dc399, 0x008bcf99, 0x036267da, 0x032fc3db, 0x000cc698}}}, + {X: Field{[10]uint32{0x0270853d, 0x00acfaf3, 0x035f017e, 0x00a8af8e, 0x009d6a0b, 0x03fde276, 0x03c923bc, 0x02f3a023, 0x008db8a1, 0x003f5c82}}, Y: Field{[10]uint32{0x01eaf599, 0x0037b242, 0x03494b71, 0x02a37d91, 0x0193db4a, 0x0282fb76, 0x03296383, 0x0066ebac, 0x0323a388, 0x0034e44a}}}, + {X: Field{[10]uint32{0x03e65060, 0x02cd6b3b, 0x037a6b72, 0x01071f74, 0x01c73185, 0x0282ea89, 0x00940af9, 0x025b6936, 0x038d5e00, 0x000f9563}}, Y: Field{[10]uint32{0x0260e90a, 0x01414f79, 0x00dde769, 0x00c5ffb0, 0x03f78f64, 0x02ea56e1, 0x03bdb3ef, 0x020170fa, 0x017f069d, 0x000a900f}}}, + {X: Field{[10]uint32{0x00694a7e, 0x03c81276, 0x00b01e82, 0x00aa43f4, 0x03721ec3, 0x0386dd17, 0x0000149f, 0x03c8885b, 0x0223f525, 0x001c1c20}}, Y: Field{[10]uint32{0x03d12569, 0x036afafb, 0x0354b410, 0x02218d98, 0x01fce17d, 0x01f650ed, 0x0186ac90, 0x0354fc67, 0x0387f0b4, 0x003bd2b5}}}, + {X: Field{[10]uint32{0x02414f72, 0x03a4452a, 0x012fc6e5, 0x02537be7, 0x02440b4a, 0x007933dd, 0x01eddb71, 0x03ebd92e, 0x0225eabf, 0x003b28a5}}, Y: Field{[10]uint32{0x037618cf, 0x00e2e388, 0x009dcd35, 0x00a0a0e6, 0x03f798b6, 0x03162433, 0x03bb2274, 0x028ff2c8, 0x007575af, 0x003c7e0e}}}, + {X: Field{[10]uint32{0x03297695, 0x00e3d957, 0x00108778, 0x02959b5b, 0x02da7423, 0x02186496, 0x0206db46, 0x03c31311, 0x0350542d, 0x0016df11}}, Y: Field{[10]uint32{0x011f784d, 0x008ae79e, 0x010795f9, 0x00b57a01, 0x01de04db, 0x033669a9, 0x00cb1a24, 0x02227f5b, 0x03661ae1, 0x0010a044}}}, + {X: Field{[10]uint32{0x00012042, 0x026e61af, 0x0038cb37, 0x01a20016, 0x02bd5da1, 0x039e20bf, 0x02982dd1, 0x02cbbb4d, 0x03e6040c, 0x002bc697}}, Y: Field{[10]uint32{0x013e6224, 0x0104856b, 0x00778b7e, 0x023a18f5, 0x02576877, 0x03f3f228, 0x03d12ed1, 0x0298d298, 0x0149305f, 0x001c55c1}}}, + {X: Field{[10]uint32{0x0366b1d2, 0x00659da4, 0x0346a9a3, 0x022c755d, 0x03e1e8b1, 0x00627132, 0x03cd1be1, 0x01f9c3e0, 0x03a24678, 0x001c9d10}}, Y: Field{[10]uint32{0x0116d540, 0x024a341b, 0x03dead68, 0x0303480b, 0x004df56a, 0x01dc396d, 0x02565cc1, 0x00fa2684, 0x00269bba, 0x00218d5e}}}, + {X: Field{[10]uint32{0x02640b8d, 0x03866284, 0x012556c5, 0x00aeafcf, 0x03ae2c9a, 0x004e647d, 0x01e68352, 0x0398a852, 0x0179db34, 0x0000259e}}, Y: Field{[10]uint32{0x019edcc4, 0x0301f07f, 0x03b014d4, 0x009c946c, 0x018547b8, 0x02fcf47b, 0x02e44ac3, 0x015944f3, 0x014f5244, 0x00267707}}}, + {X: Field{[10]uint32{0x03203601, 0x03ee20eb, 0x038b159d, 0x01f6f95e, 0x02be5693, 0x0016c1ac, 0x02f9d739, 0x0124789f, 0x01db08f3, 0x001e5002}}, Y: Field{[10]uint32{0x02da40b6, 0x0329878a, 0x017e750e, 0x009090e4, 0x005db60d, 0x022761ad, 0x026a0872, 0x03873456, 0x024d7ee5, 0x00169ab5}}}, + {X: Field{[10]uint32{0x01851d10, 0x018a5faa, 0x015110cf, 0x00bd41e4, 0x03d2f421, 0x03ec3747, 0x029470b1, 0x02c2436e, 0x02396f90, 0x0021f2f6}}, Y: Field{[10]uint32{0x001b63f0, 0x02480169, 0x013e773a, 0x014b8473, 0x03fb8f79, 0x01561771, 0x01fb4c9c, 0x03e65d40, 0x01f3a2a4, 0x00272825}}}, + {X: Field{[10]uint32{0x0110acb0, 0x0116c06e, 0x01fa84b2, 0x036816e5, 0x02cd1f3a, 0x006f9f84, 0x00207720, 0x005d4963, 0x0303475d, 0x0027b55e}}, Y: Field{[10]uint32{0x03bbd5eb, 0x03ba8da8, 0x0350d324, 0x0112387b, 0x03253106, 0x0032cfa2, 0x0058a7bd, 0x0206be17, 0x005443bd, 0x00356324}}}, + {X: Field{[10]uint32{0x028b0402, 0x00d53980, 0x02be7d5d, 0x0087f499, 0x0335fd95, 0x01844cd8, 0x02c77e38, 0x011260b6, 0x022292ca, 0x003be342}}, Y: Field{[10]uint32{0x00b58b6b, 0x01629d0f, 0x0037ff97, 0x034b8ad0, 0x02f2f547, 0x01df06a6, 0x0223e5b6, 0x02076a92, 0x034a5568, 0x00395712}}}, + {X: Field{[10]uint32{0x0127e3d9, 0x000565f4, 0x01c75abd, 0x0386c4bd, 0x002299f6, 0x03e93b42, 0x02d369f4, 0x03ca7540, 0x01f5a274, 0x001b6e88}}, Y: Field{[10]uint32{0x01a39d94, 0x0369de94, 0x00f3c930, 0x02774b7c, 0x01c951f6, 0x039ba720, 0x00302de3, 0x03907a31, 0x032f0a0c, 0x001da17d}}}, + {X: Field{[10]uint32{0x00399a3d, 0x0111a4f2, 0x032aa6ba, 0x026dfecc, 0x02784196, 0x01bb4a94, 0x001b0f42, 0x0308d5f7, 0x02bf857a, 0x0023370f}}, Y: Field{[10]uint32{0x03f910ca, 0x01dbe92d, 0x02beca58, 0x02ac9d22, 0x03df250d, 0x02da2866, 0x00d87249, 0x031c501b, 0x03c1915a, 0x0008d374}}}, + {X: Field{[10]uint32{0x01eca2da, 0x03f620ad, 0x00de1e88, 0x03e8a4d1, 0x00a9c790, 0x011c1a26, 0x03391b6f, 0x0196d1f8, 0x01c8caa6, 0x0028020a}}, Y: Field{[10]uint32{0x01424110, 0x02d4c5bf, 0x02aa8184, 0x025d81a3, 0x00234862, 0x020c6095, 0x004b1299, 0x01333962, 0x00c71e83, 0x002df23f}}}, + {X: Field{[10]uint32{0x0149ce6a, 0x02007748, 0x005f5640, 0x00bbbfdf, 0x02a4ed5b, 0x0353c8b5, 0x012e54a1, 0x02fac528, 0x0362446c, 0x00161cbd}}, Y: Field{[10]uint32{0x00ee198f, 0x0283070a, 0x01e2ac75, 0x0362eeb3, 0x004c37d5, 0x010d93bd, 0x030c29e2, 0x015fe869, 0x03e88627, 0x0022ab34}}}, + {X: Field{[10]uint32{0x02fd34f2, 0x0331ae40, 0x03b2fec4, 0x02b24674, 0x0353e7ce, 0x016d4cb3, 0x02677d2e, 0x01c543c8, 0x01c05dba, 0x002dc3b5}}, Y: Field{[10]uint32{0x00d28cf8, 0x035120a9, 0x0083126b, 0x026c2158, 0x0376c3d6, 0x006363f2, 0x03cee0b0, 0x005c728b, 0x0128cc74, 0x001f90fd}}}, + {X: Field{[10]uint32{0x0053bb52, 0x00305ae0, 0x027d309d, 0x00169e42, 0x022e8ca5, 0x03ac272e, 0x01a6d7c8, 0x0187431f, 0x02133c61, 0x0012faa8}}, Y: Field{[10]uint32{0x01d4f6d5, 0x02b372a6, 0x03ffadb1, 0x01b30a62, 0x03070349, 0x012cbb84, 0x0226d8fe, 0x0368bb19, 0x003c9cbd, 0x00369302}}}, + {X: Field{[10]uint32{0x01804831, 0x003a07c1, 0x035fc8a1, 0x00d134d3, 0x0108594b, 0x017e6af4, 0x00de363c, 0x0060d29e, 0x02c653ce, 0x002a34c7}}, Y: Field{[10]uint32{0x02c5cff9, 0x0130a1b6, 0x00bce64f, 0x00616529, 0x008c462c, 0x02df22e9, 0x01b5601c, 0x038dc27b, 0x01cd7cbb, 0x002d35aa}}}, +} + +var prec = [64][16]XY{ + { + {X: Field{[10]uint32{0x02f81798, 0x00a056c5, 0x028d959f, 0x036cb738, 0x03029bfc, 0x03a1c2c1, 0x0206295c, 0x02eeb156, 0x027ef9dc, 0x001e6f99}}, Y: Field{[10]uint32{0x0310d4b8, 0x01f423fe, 0x014199c4, 0x01229a15, 0x00fd17b4, 0x0384422a, 0x024fbfc0, 0x03119576, 0x027726a3, 0x00120eb6}}}, + {X: Field{[10]uint32{0x00709ee5, 0x03026e57, 0x03ca7aba, 0x012e33bc, 0x005c778e, 0x01701f36, 0x005406e9, 0x01f5b4c1, 0x039441ed, 0x0031811f}}, Y: Field{[10]uint32{0x00cfe52a, 0x010c6a54, 0x010e1236, 0x0194c99b, 0x02f7f632, 0x019b3abb, 0x00584194, 0x030ce68f, 0x00fea63d, 0x0006b85a}}}, + {X: Field{[10]uint32{0x00e036f9, 0x007c44ef, 0x019b0860, 0x01160dbe, 0x01b531c8, 0x0227548a, 0x0344f85f, 0x030c4124, 0x02019258, 0x003e4c22}}, Y: Field{[10]uint32{0x00b8e672, 0x027f5d61, 0x0231b6cb, 0x0264d308, 0x026500a9, 0x028dfcd5, 0x02337e62, 0x03a0503f, 0x030f632d, 0x000e23de}}}, + {X: Field{[10]uint32{0x00c4cd13, 0x02a52afa, 0x0358474f, 0x02403b81, 0x00cc6c13, 0x00c2c501, 0x01e49049, 0x0203cd60, 0x03f1c10d, 0x003924f6}}, Y: Field{[10]uint32{0x03739922, 0x025ef711, 0x03e40cfe, 0x00cefef7, 0x00d967ae, 0x03a94512, 0x002e2098, 0x0156dd59, 0x013ea0d4, 0x00147b66}}}, + {X: Field{[10]uint32{0x0240efe4, 0x02355a6c, 0x01ab7cba, 0x02f77186, 0x00e88b84, 0x0297144a, 0x034a7250, 0x00824d56, 0x024d1a07, 0x000be2f7}}, Y: Field{[10]uint32{0x02ac62d6, 0x021f4ea9, 0x02840dca, 0x006eac35, 0x02f78827, 0x01b27109, 0x01ba9dda, 0x038f5b53, 0x022636e5, 0x00362b08}}}, + {X: Field{[10]uint32{0x00297556, 0x015e8518, 0x0218b2f0, 0x00be15a2, 0x0382f647, 0x01548d74, 0x0053a143, 0x03ba9081, 0x03d5755e, 0x003ffe5e}}, Y: Field{[10]uint32{0x0075f297, 0x01c30dac, 0x024a03c8, 0x03d9463f, 0x00de80f0, 0x03d17158, 0x03e96017, 0x02d883ce, 0x037aacfb, 0x002b849d}}}, + {X: Field{[10]uint32{0x02c4f9bc, 0x02f77b72, 0x0239ce92, 0x01f80cc3, 0x023d419b, 0x00ba9e83, 0x018f365f, 0x02d3aa8e, 0x00646e5d, 0x00172f7c}}, Y: Field{[10]uint32{0x007264da, 0x02098a02, 0x027b5a50, 0x02e04ff7, 0x03a813d0, 0x01869536, 0x0178d6d8, 0x0165828c, 0x0240ba25, 0x001abaf2}}}, + {X: Field{[10]uint32{0x010a2a01, 0x0213bcf8, 0x0088a677, 0x001796be, 0x030a1bdd, 0x01c3cf0b, 0x033843fb, 0x00d476bf, 0x01e15cca, 0x000bc079}}, Y: Field{[10]uint32{0x00bde904, 0x028b2ddb, 0x03617b5d, 0x035ae96d, 0x00c2e213, 0x00cb44ed, 0x03d082a1, 0x026524a4, 0x00a74153, 0x0017136a}}}, + {X: Field{[10]uint32{0x0027ccbe, 0x03c4437f, 0x02714c35, 0x025d315f, 0x01e09796, 0x03d566af, 0x02d178a9, 0x03d94c26, 0x00e2f0c7, 0x002b3521}}, Y: Field{[10]uint32{0x024f9c37, 0x03098ab1, 0x00e0f05c, 0x0290dd7e, 0x01add888, 0x018ed87a, 0x03809717, 0x0367f590, 0x0121b0a7, 0x00330ce2}}}, + {X: Field{[10]uint32{0x03e247c7, 0x01a38a91, 0x002b752a, 0x026c650f, 0x013442d4, 0x02b9ab97, 0x0077c7b1, 0x032188d5, 0x019e47f3, 0x002810d3}}, Y: Field{[10]uint32{0x037368d7, 0x03b94ec0, 0x021593cb, 0x00bb61de, 0x016f794c, 0x00e8931a, 0x036c7e69, 0x02f09e8e, 0x02425419, 0x00224eae}}}, + {X: Field{[10]uint32{0x01a008cb, 0x0305e257, 0x03891bbe, 0x002f9705, 0x00564998, 0x003196ab, 0x034246b7, 0x0104797b, 0x03f858a9, 0x001dd2b9}}, Y: Field{[10]uint32{0x0153c61b, 0x035d3272, 0x016a8301, 0x038b7fe7, 0x01372db1, 0x01edecd9, 0x003dd56d, 0x01786409, 0x0032eb6b, 0x00366128}}}, + {X: Field{[10]uint32{0x00afe85a, 0x003d1c1c, 0x0095bc5b, 0x01065880, 0x03687cf4, 0x035cd18c, 0x0038f004, 0x01586c57, 0x01d548e7, 0x00340445}}, Y: Field{[10]uint32{0x00062327, 0x0146c4fd, 0x02d526b0, 0x017766a1, 0x0179238c, 0x005ef605, 0x0364537e, 0x03835ea2, 0x03fdc815, 0x002a7cd3}}}, + {X: Field{[10]uint32{0x01405aa8, 0x0377e3c6, 0x018cddee, 0x03198439, 0x01b075fb, 0x00dd2194, 0x011d205c, 0x00a22f1f, 0x03c2d975, 0x003ca1dc}}, Y: Field{[10]uint32{0x0303ed81, 0x0172d4b6, 0x0291f29b, 0x0369487e, 0x033a1a06, 0x01736bd1, 0x00212eb6, 0x002a25d6, 0x002e8d88, 0x0002ac24}}}, + {X: Field{[10]uint32{0x00e823e4, 0x02c90698, 0x009e6e49, 0x018d9e25, 0x0226aa7b, 0x01f4e38c, 0x024e67f0, 0x01c673f5, 0x039e895e, 0x001267f7}}, Y: Field{[10]uint32{0x03a13f5b, 0x03d03500, 0x015bcc65, 0x0309e8fe, 0x00464279, 0x01ecf519, 0x03044e4a, 0x02154643, 0x02c4b54e, 0x0032b0bd}}}, + {X: Field{[10]uint32{0x027e080e, 0x036f3e38, 0x0379e44a, 0x01bcf217, 0x0131e594, 0x0257fd04, 0x0065ae30, 0x03aa5969, 0x014f7d43, 0x0035e493}}, Y: Field{[10]uint32{0x02a26b58, 0x013727fd, 0x013a5c50, 0x00af625b, 0x03ea40af, 0x02331b7b, 0x0042ec22, 0x01ca9a0e, 0x0072a86c, 0x0016078a}}}, + {X: Field{[10]uint32{0x026dec0a, 0x03ba278a, 0x01ae9c44, 0x01a6e1e9, 0x03b2a313, 0x00708fa5, 0x011aabc2, 0x027b14c0, 0x0293b59e, 0x003983f3}}, Y: Field{[10]uint32{0x01616821, 0x00cb339a, 0x03f0be1f, 0x00791348, 0x00129689, 0x015e4dc4, 0x0399f34f, 0x02564a76, 0x007399e5, 0x003df8d4}}}, + }, + { + {X: Field{[10]uint32{0x026dec0a, 0x03ba278a, 0x01ae9c44, 0x01a6e1e9, 0x03b2a313, 0x00708fa5, 0x011aabc2, 0x027b14c0, 0x0293b59e, 0x003983f3}}, Y: Field{[10]uint32{0x01616821, 0x00cb339a, 0x03f0be1f, 0x00791348, 0x00129689, 0x015e4dc4, 0x0399f34f, 0x02564a76, 0x007399e5, 0x003df8d4}}}, + {X: Field{[10]uint32{0x03143e65, 0x0036f501, 0x0261d75d, 0x02e26412, 0x02dacffc, 0x00bcde33, 0x036e054e, 0x0288b51e, 0x01d74fb5, 0x0034c066}}, Y: Field{[10]uint32{0x00106ab9, 0x00ffc7c9, 0x0019605b, 0x030d93b6, 0x011f760c, 0x0260e019, 0x016dec9e, 0x03570ecf, 0x019d0ae3, 0x002540e3}}}, + {X: Field{[10]uint32{0x0118e5c3, 0x021c2a84, 0x02bc19bd, 0x009d14af, 0x03fc579b, 0x013996d2, 0x001656ef, 0x00c1f6d1, 0x035d9645, 0x001bb28c}}, Y: Field{[10]uint32{0x01a08668, 0x028bde01, 0x02c34498, 0x00e8efe3, 0x003a496a, 0x012e1d68, 0x02f57907, 0x001c4164, 0x03b57a7a, 0x00354048}}}, + {X: Field{[10]uint32{0x0074ef8b, 0x024639be, 0x03d81e37, 0x007736eb, 0x00fc4c6f, 0x020ca08f, 0x01051eaf, 0x03aadc2c, 0x01542d16, 0x002fc8f0}}, Y: Field{[10]uint32{0x02831d9f, 0x00dfbf99, 0x02f784dc, 0x01520478, 0x00c522fc, 0x0294e4b9, 0x01928a0b, 0x000dcdeb, 0x026fc330, 0x00172ce1}}}, + {X: Field{[10]uint32{0x0387f62e, 0x034c7853, 0x021270ec, 0x00e18dc5, 0x0010e6e6, 0x00d1967c, 0x03c744ed, 0x0243b035, 0x03bef1bf, 0x003a588e}}, Y: Field{[10]uint32{0x004ee737, 0x004fabe9, 0x0044e530, 0x032775a2, 0x01fe6043, 0x03b6aa4a, 0x03e953a8, 0x0267a783, 0x003b4bc2, 0x000e2a5d}}}, + {X: Field{[10]uint32{0x038cb0e3, 0x00ceb29f, 0x023a4439, 0x00ff87bf, 0x02a22eb5, 0x02cbadcb, 0x0264e044, 0x01b63e3e, 0x00e57445, 0x000fc3a0}}, Y: Field{[10]uint32{0x025f404f, 0x00a278ba, 0x013a4cb0, 0x00ea996d, 0x03950125, 0x0217406c, 0x00b9c084, 0x02f247a4, 0x03d7296c, 0x0032d9b5}}}, + {X: Field{[10]uint32{0x028d733c, 0x02ab7e0a, 0x028f9eb0, 0x02fd8bf2, 0x02ffc274, 0x002035a0, 0x004a36f2, 0x0076e822, 0x0173e516, 0x002f20b7}}, Y: Field{[10]uint32{0x007797f0, 0x0218413d, 0x017301e7, 0x02eb9ce2, 0x03ae93a0, 0x0067c0b7, 0x029b4bf7, 0x0072b152, 0x003a044b, 0x00397ca3}}}, + {X: Field{[10]uint32{0x0369a24e, 0x001dd159, 0x01655647, 0x035c014d, 0x00bcf55c, 0x01f459c7, 0x02c3d09f, 0x01e819a5, 0x03e4033f, 0x000d3fce}}, Y: Field{[10]uint32{0x03cc2f1a, 0x00419e9c, 0x03681849, 0x030fa3e2, 0x0055df16, 0x020c8263, 0x02619d89, 0x01b154fd, 0x01623a23, 0x00176744}}}, + {X: Field{[10]uint32{0x03bc7671, 0x03f88c57, 0x00e32d7e, 0x03214a16, 0x00743f1b, 0x01e63d24, 0x00291ce1, 0x01c84748, 0x0248c765, 0x00238f44}}, Y: Field{[10]uint32{0x00717dec, 0x00771906, 0x0144a7ef, 0x02aa98f8, 0x02b9352b, 0x00e4fa43, 0x00480e19, 0x032e07d9, 0x00e10ecf, 0x00026692}}}, + {X: Field{[10]uint32{0x01b03f6c, 0x030cab54, 0x0184b05e, 0x0048aa6c, 0x02a4d047, 0x03dcfd5d, 0x00776838, 0x036488af, 0x03a27a52, 0x000c2244}}, Y: Field{[10]uint32{0x00fe4c67, 0x02d7bf3a, 0x01f1260a, 0x03aa0af4, 0x01a8333f, 0x01b00dd7, 0x023531f6, 0x02f97e47, 0x009543fe, 0x003d296c}}}, + {X: Field{[10]uint32{0x02b31db2, 0x021d0caf, 0x006a0f32, 0x009e23d4, 0x028fcae8, 0x002228ad, 0x02a193ed, 0x02926225, 0x01aa2234, 0x001e2a24}}, Y: Field{[10]uint32{0x01fa4343, 0x027588ee, 0x0382d306, 0x03376002, 0x0254379b, 0x01cc0b7d, 0x035f2552, 0x00d72ff3, 0x035beb50, 0x001a44a8}}}, + {X: Field{[10]uint32{0x03ce1752, 0x01d43dcc, 0x0204ec7b, 0x025f5f34, 0x02e783c7, 0x026726ba, 0x02ddf64d, 0x0318d604, 0x0258d01d, 0x0035e836}}, Y: Field{[10]uint32{0x0362cef4, 0x0009ce01, 0x03742bbc, 0x02a3018a, 0x010be040, 0x0038a119, 0x03292834, 0x0200cbdb, 0x00e06800, 0x002449dc}}}, + {X: Field{[10]uint32{0x01b0e595, 0x0123dde3, 0x002bb653, 0x02e7ee82, 0x03a7163c, 0x00581dba, 0x00e37658, 0x006c5f5f, 0x001855db, 0x001f619e}}, Y: Field{[10]uint32{0x00733de8, 0x01478eaf, 0x01532999, 0x01383897, 0x00293784, 0x0353e20e, 0x0162e2be, 0x03e1dcb9, 0x02dfec86, 0x0038ae66}}}, + {X: Field{[10]uint32{0x00e6b514, 0x03115c1b, 0x03322609, 0x031e6cd5, 0x01890905, 0x00211352, 0x005c3560, 0x03b45622, 0x01c2f919, 0x00022f22}}, Y: Field{[10]uint32{0x00c95157, 0x00fd33aa, 0x036f06f6, 0x0158449d, 0x01172d30, 0x02d624b0, 0x0376fec3, 0x03305b79, 0x03cdd7cd, 0x0034c4fc}}}, + {X: Field{[10]uint32{0x02060dfc, 0x03fbe145, 0x02a2a008, 0x02108179, 0x0276545f, 0x0106ac21, 0x0094b9dc, 0x00ab2121, 0x010f0058, 0x0037714c}}, Y: Field{[10]uint32{0x03820ca8, 0x03e2adb9, 0x00730fb5, 0x031aaf41, 0x0041dbaf, 0x0323c3a4, 0x011ab6dc, 0x025a4806, 0x033af20d, 0x002e834b}}}, + {X: Field{[10]uint32{0x01f51508, 0x01b88ff5, 0x01ca1064, 0x02af56b0, 0x00d8c39c, 0x01cb788e, 0x02a6e3e1, 0x002767a8, 0x023212c6, 0x0020a089}}, Y: Field{[10]uint32{0x02e26caf, 0x02dbabfd, 0x017bed31, 0x02b0bdec, 0x0262d613, 0x002d82b3, 0x00256e83, 0x037f917a, 0x00098557, 0x00047e2a}}}, + }, + { + {X: Field{[10]uint32{0x01f51508, 0x01b88ff5, 0x01ca1064, 0x02af56b0, 0x00d8c39c, 0x01cb788e, 0x02a6e3e1, 0x002767a8, 0x023212c6, 0x0020a089}}, Y: Field{[10]uint32{0x02e26caf, 0x02dbabfd, 0x017bed31, 0x02b0bdec, 0x0262d613, 0x002d82b3, 0x00256e83, 0x037f917a, 0x00098557, 0x00047e2a}}}, + {X: Field{[10]uint32{0x0334a24d, 0x038b003b, 0x019d0926, 0x01a36785, 0x010adbc9, 0x033e4635, 0x01a857a9, 0x027fce41, 0x00b287a7, 0x001194dc}}, Y: Field{[10]uint32{0x033887f4, 0x023ec82c, 0x03a10a2f, 0x02c8574d, 0x01588e09, 0x037bb0b0, 0x02f8bdaf, 0x03020a92, 0x01b38368, 0x000d794c}}}, + {X: Field{[10]uint32{0x017e8dfa, 0x03032e79, 0x02184fcf, 0x02468f1f, 0x00098091, 0x032a6328, 0x01a30f8a, 0x02713036, 0x032ff079, 0x002098b3}}, Y: Field{[10]uint32{0x03ac376a, 0x03fe363e, 0x0047835c, 0x00ccac53, 0x0057b6ed, 0x016cd3cd, 0x03ee22ec, 0x0279399b, 0x01e20910, 0x0020ff65}}}, + {X: Field{[10]uint32{0x0285131f, 0x02406cb8, 0x03088d5b, 0x0337204e, 0x00aaec6e, 0x01ab5890, 0x024a18f6, 0x02f5df59, 0x03b8e23c, 0x000907fa}}, Y: Field{[10]uint32{0x0350026d, 0x00f99bc9, 0x035afabb, 0x003ef432, 0x00cd50fd, 0x00e6077e, 0x00420bd1, 0x03e34f5b, 0x00d9ff94, 0x00144cde}}}, + {X: Field{[10]uint32{0x026bdb6f, 0x00b922c0, 0x00b94905, 0x0351edcd, 0x037ca41b, 0x033a6721, 0x00105b24, 0x0377545a, 0x008b1da0, 0x00066097}}, Y: Field{[10]uint32{0x009cfc9b, 0x03dc2131, 0x013a6b5d, 0x033233db, 0x00ebe9ee, 0x013d67db, 0x00261cc9, 0x021e3cc8, 0x010f0d4c, 0x0018a50c}}}, + {X: Field{[10]uint32{0x0070620c, 0x03307c9f, 0x008d9d17, 0x02faaf0a, 0x004998c4, 0x02d9c5e0, 0x00dd31a2, 0x008db718, 0x00a48d2c, 0x000594ea}}, Y: Field{[10]uint32{0x015b32cd, 0x00ba074c, 0x01c526ca, 0x01237f4f, 0x00012af7, 0x03be9c07, 0x03a99474, 0x01fdebab, 0x010935af, 0x0000ce0a}}}, + {X: Field{[10]uint32{0x0182824c, 0x0342548f, 0x034e650e, 0x00d17854, 0x02dfa58e, 0x01b0a667, 0x005f56ec, 0x0064510f, 0x006c1160, 0x001bc4b6}}, Y: Field{[10]uint32{0x02eb34d0, 0x0270d201, 0x03c5b857, 0x01042152, 0x01391c92, 0x03588dda, 0x01994f3f, 0x02fe821d, 0x03f44ab3, 0x001713fd}}}, + {X: Field{[10]uint32{0x03920471, 0x02d8c1a6, 0x01e0dedc, 0x0217d08f, 0x01fc318b, 0x00f63e36, 0x024cc298, 0x03e9e7f3, 0x034ea172, 0x001746f6}}, Y: Field{[10]uint32{0x03b83103, 0x00c199bd, 0x02e7b703, 0x02665b15, 0x0279eb1e, 0x02288995, 0x00bb9943, 0x0278b9e5, 0x02677937, 0x000a10e0}}}, + {X: Field{[10]uint32{0x03453629, 0x037700b6, 0x02603076, 0x03703d67, 0x0245cfdc, 0x008eafbd, 0x0262716a, 0x02a97450, 0x006f9a0a, 0x00080ea3}}, Y: Field{[10]uint32{0x03f89f84, 0x0071e14f, 0x01ed4597, 0x009714a1, 0x02686deb, 0x03d04184, 0x00c76d15, 0x0366e4db, 0x0353de5d, 0x000ec3c2}}}, + {X: Field{[10]uint32{0x0147f3d6, 0x011955ec, 0x00b45b94, 0x0085eae3, 0x03553199, 0x01195440, 0x026a3632, 0x02c78467, 0x0332c294, 0x0011d291}}, Y: Field{[10]uint32{0x00628ba4, 0x03a14a0a, 0x01300dce, 0x005c0438, 0x0311fa7f, 0x00e922a8, 0x02cc30cc, 0x03c13bb4, 0x02231206, 0x00251897}}}, + {X: Field{[10]uint32{0x006c7ecb, 0x004c3779, 0x00ce9783, 0x00ff96ed, 0x009d3aed, 0x0219b87b, 0x01ef7334, 0x01060720, 0x02eb3d03, 0x001b8ab2}}, Y: Field{[10]uint32{0x02bc8720, 0x024807bb, 0x0112c844, 0x02e46d9d, 0x02fac706, 0x003ed90e, 0x000c4daf, 0x03b85276, 0x006797ef, 0x00279869}}}, + {X: Field{[10]uint32{0x031dabcd, 0x010ae9b9, 0x00b4f47d, 0x01262797, 0x0354d3fe, 0x002d4dcf, 0x018ae326, 0x03d0f182, 0x00fb6b63, 0x003527b9}}, Y: Field{[10]uint32{0x016603c2, 0x02a433c0, 0x03031e66, 0x024c4bfd, 0x02129c50, 0x0186fcd5, 0x0087ea7a, 0x0124375f, 0x039209a5, 0x00014c78}}}, + {X: Field{[10]uint32{0x00a4147e, 0x00063cfc, 0x03201eb7, 0x022fddd7, 0x002747dd, 0x02924296, 0x021717e8, 0x0055aebd, 0x0092e9e9, 0x003569c1}}, Y: Field{[10]uint32{0x03fb65ff, 0x02cf2e0c, 0x0357f8e4, 0x0211e59f, 0x02f4c4d9, 0x0197814c, 0x00909907, 0x02271bf1, 0x02f5dbab, 0x00276d49}}}, + {X: Field{[10]uint32{0x003841c6, 0x02a3da2d, 0x02fbd63d, 0x03034d0f, 0x0212aa3c, 0x033afd30, 0x03b6b52d, 0x00226526, 0x009e03df, 0x001b3044}}, Y: Field{[10]uint32{0x0154e94d, 0x00ce91ae, 0x02cf5b97, 0x00f8b641, 0x00d79b43, 0x028a7ffb, 0x03d3d6b0, 0x012dd83f, 0x02fe9c09, 0x002bd586}}}, + {X: Field{[10]uint32{0x00edcec6, 0x036d1af6, 0x00f454ed, 0x030b4d8d, 0x02a1061c, 0x000b36b1, 0x023efc63, 0x022ea014, 0x019aabe1, 0x000e3144}}, Y: Field{[10]uint32{0x0133db08, 0x0382fec6, 0x030a6456, 0x0208ad54, 0x0328a16c, 0x01d7ca0b, 0x00cb2da2, 0x01cca99a, 0x012285d9, 0x00399277}}}, + {X: Field{[10]uint32{0x01e5b739, 0x03396d54, 0x022ed73f, 0x00cff488, 0x01e0b938, 0x01bf211b, 0x0399cc6c, 0x021969cb, 0x019f728b, 0x0005d785}}, Y: Field{[10]uint32{0x01fed695, 0x029bffba, 0x0345c6ef, 0x016b7490, 0x02acb595, 0x03fdc7d7, 0x02f97a51, 0x01e7ae93, 0x020d9e3c, 0x0034d41b}}}, + }, + { + {X: Field{[10]uint32{0x01e5b739, 0x03396d54, 0x022ed73f, 0x00cff488, 0x01e0b938, 0x01bf211b, 0x0399cc6c, 0x021969cb, 0x019f728b, 0x0005d785}}, Y: Field{[10]uint32{0x01fed695, 0x029bffba, 0x0345c6ef, 0x016b7490, 0x02acb595, 0x03fdc7d7, 0x02f97a51, 0x01e7ae93, 0x020d9e3c, 0x0034d41b}}}, + {X: Field{[10]uint32{0x02bc47d6, 0x02012791, 0x0121bce7, 0x02d71b68, 0x0130fdfe, 0x004e7188, 0x03fbcc8e, 0x00cb5e97, 0x013f03ff, 0x00108e80}}, Y: Field{[10]uint32{0x03548a34, 0x00db9b62, 0x0009ed12, 0x030d493c, 0x03720d8e, 0x02bdacf1, 0x0179f7bb, 0x0365c284, 0x000fe1e1, 0x002e46b8}}}, + {X: Field{[10]uint32{0x01041216, 0x01fe3c71, 0x0036a65b, 0x03da10ae, 0x023f7335, 0x030bfb54, 0x00b59efd, 0x02b3d04a, 0x017b21f7, 0x00369d4c}}, Y: Field{[10]uint32{0x02708572, 0x034ca61b, 0x00edadae, 0x01eb9deb, 0x02e9aac0, 0x010b5ff1, 0x019e21b3, 0x0357c37c, 0x0046bf72, 0x001cfe28}}}, + {X: Field{[10]uint32{0x0016824a, 0x037dbde1, 0x02741302, 0x00bcecf8, 0x0249df66, 0x0335a1dd, 0x0107a7ab, 0x02e41422, 0x0245ac1f, 0x0004475a}}, Y: Field{[10]uint32{0x0108e9d0, 0x00447508, 0x00a4ca9a, 0x02265b6b, 0x02f07000, 0x03c19654, 0x00d48dbf, 0x02bfeee4, 0x011c478e, 0x0001a5a4}}}, + {X: Field{[10]uint32{0x0065a930, 0x010f9c79, 0x012fdb01, 0x0305ac4d, 0x022587f1, 0x02a0bac7, 0x033c58c4, 0x01275c15, 0x01b48e97, 0x00071c71}}, Y: Field{[10]uint32{0x034638b5, 0x01cfdb30, 0x00d471d8, 0x00fedc5d, 0x0079345e, 0x0092eda3, 0x013f1f28, 0x03e8309c, 0x0334e8f5, 0x0012a470}}}, + {X: Field{[10]uint32{0x0062bac0, 0x014c93cf, 0x02b06950, 0x037d47c2, 0x0219150d, 0x00fa2dc3, 0x024b7d2c, 0x011a704d, 0x00f9023f, 0x00254c3c}}, Y: Field{[10]uint32{0x0218e309, 0x02af6a5d, 0x01c68478, 0x0214bc7f, 0x00e25b32, 0x026cccf8, 0x01d2f7f5, 0x008788d3, 0x005a8f9f, 0x0023cf0c}}}, + {X: Field{[10]uint32{0x02db6ee7, 0x0236b96e, 0x02077e31, 0x010c9d12, 0x007850dd, 0x0026d327, 0x02e837a9, 0x02959a4d, 0x02fc1f31, 0x00361392}}, Y: Field{[10]uint32{0x002ebed2, 0x0155b9b5, 0x0264982d, 0x025d2a8f, 0x01fdd8ac, 0x01597793, 0x0238d58f, 0x01e7384a, 0x009a7c7b, 0x00394960}}}, + {X: Field{[10]uint32{0x03ced775, 0x03b77806, 0x00e56ab5, 0x02297bdd, 0x037290b6, 0x032e773f, 0x0395dbeb, 0x0322e2b5, 0x01c97ac7, 0x0012929b}}, Y: Field{[10]uint32{0x038dd66d, 0x03e3da29, 0x002acb2b, 0x036d091d, 0x031de90c, 0x02703d15, 0x03ef9f73, 0x0079ca50, 0x01b01663, 0x0014a644}}}, + {X: Field{[10]uint32{0x009e6d10, 0x03a7b3e9, 0x019d2394, 0x03cebab2, 0x03f60adf, 0x017fdbb4, 0x0322b928, 0x02053506, 0x004bde66, 0x003cf511}}, Y: Field{[10]uint32{0x0347da3f, 0x00e33014, 0x02c630a0, 0x01433a75, 0x03fc1ada, 0x026292d6, 0x02b95ac1, 0x0058f52e, 0x00dfa6f0, 0x000290c9}}}, + {X: Field{[10]uint32{0x0147b4b3, 0x0246dde9, 0x01411f5e, 0x0347f599, 0x00356929, 0x0026548b, 0x0382efee, 0x013dd477, 0x002f1d8e, 0x003c01b1}}, Y: Field{[10]uint32{0x006aa74b, 0x03d127ea, 0x03ae1b5e, 0x03bb5af9, 0x0275c933, 0x0393df45, 0x007848a4, 0x01482971, 0x00d4a666, 0x003da055}}}, + {X: Field{[10]uint32{0x01d33a07, 0x02cd01ba, 0x03cab48c, 0x0022a8e6, 0x004e72ee, 0x036f7d01, 0x0085520c, 0x007627e4, 0x012c9d9c, 0x002b8c19}}, Y: Field{[10]uint32{0x00a0b2a6, 0x01c303d8, 0x0295c748, 0x03d77f5f, 0x031c9c37, 0x036e3573, 0x00ce7d33, 0x03f95fbf, 0x01c38d63, 0x001b2e76}}}, + {X: Field{[10]uint32{0x003c9c8f, 0x0010e177, 0x027b2067, 0x03b8f90d, 0x00f2816f, 0x02a8ccac, 0x009ff43a, 0x0263f5bc, 0x02dcbe42, 0x0019ef80}}, Y: Field{[10]uint32{0x013652d9, 0x02126616, 0x002be553, 0x03d82e23, 0x03cd993b, 0x020a45a4, 0x00945b60, 0x03be128b, 0x01a73e4d, 0x001ea6d5}}}, + {X: Field{[10]uint32{0x0028caca, 0x01952e43, 0x001da759, 0x02ef320a, 0x021869c7, 0x00ce2326, 0x0217e758, 0x03872057, 0x032a5bd5, 0x00363706}}, Y: Field{[10]uint32{0x03b3ec7a, 0x019dba88, 0x028f6cdb, 0x00b3b204, 0x007d315d, 0x00091f65, 0x02d8da42, 0x031f5631, 0x02d927ce, 0x00233b02}}}, + {X: Field{[10]uint32{0x018b01b5, 0x00be5d14, 0x03adac5c, 0x022e1c42, 0x01ddccc8, 0x0149016c, 0x0250c453, 0x03a21706, 0x0346403d, 0x00039a6c}}, Y: Field{[10]uint32{0x00d965c5, 0x03b8da1e, 0x0283e418, 0x017cf401, 0x03cedf59, 0x01f5f74d, 0x01ed70ab, 0x03914987, 0x02c5fcd7, 0x0002d3be}}}, + {X: Field{[10]uint32{0x03c4416f, 0x007ed98e, 0x00402892, 0x008fcc2c, 0x01a7aefd, 0x000cbcc7, 0x01425a8d, 0x013b3356, 0x0292c5f8, 0x0009d278}}, Y: Field{[10]uint32{0x006bbd8e, 0x022f78bf, 0x021057e9, 0x02d97ba5, 0x02f59e9f, 0x03f2b6cf, 0x03d94990, 0x00af1100, 0x014e3767, 0x0014330b}}}, + {X: Field{[10]uint32{0x03ff4640, 0x02eb63e0, 0x02ffe526, 0x01f95554, 0x0053441c, 0x01898bb8, 0x00eac05b, 0x00327267, 0x00d447b0, 0x000d8f64}}, Y: Field{[10]uint32{0x03ee9de9, 0x000f1fce, 0x01ecb620, 0x02402066, 0x0145b9a8, 0x01fccd8c, 0x03b44539, 0x00888654, 0x03adfc73, 0x0001389c}}}, + }, + { + {X: Field{[10]uint32{0x03ff4640, 0x02eb63e0, 0x02ffe526, 0x01f95554, 0x0053441c, 0x01898bb8, 0x00eac05b, 0x00327267, 0x00d447b0, 0x000d8f64}}, Y: Field{[10]uint32{0x03ee9de9, 0x000f1fce, 0x01ecb620, 0x02402066, 0x0145b9a8, 0x01fccd8c, 0x03b44539, 0x00888654, 0x03adfc73, 0x0001389c}}}, + {X: Field{[10]uint32{0x0392c541, 0x004a972b, 0x0359dd27, 0x0004bb7e, 0x030b62fb, 0x024ec0af, 0x03973c6c, 0x01fa6d54, 0x0066ed9a, 0x001306e6}}, Y: Field{[10]uint32{0x028fe020, 0x013cff71, 0x031ad72c, 0x035f90fa, 0x00c652ea, 0x0395b9a7, 0x03cb753c, 0x02283dfe, 0x02d320be, 0x00307de4}}}, + {X: Field{[10]uint32{0x02e55dc8, 0x024485bd, 0x004394b8, 0x02dbab28, 0x026ff95a, 0x00142510, 0x004a440c, 0x03fecaea, 0x004790c5, 0x00110c50}}, Y: Field{[10]uint32{0x03e323b3, 0x02512bb6, 0x02e5031d, 0x02de7aa8, 0x03a66a29, 0x0190bfb5, 0x019837f5, 0x019be3fa, 0x0142e653, 0x0025ac30}}}, + {X: Field{[10]uint32{0x02aaf3d1, 0x023ca32f, 0x03135e0c, 0x02f068a3, 0x023233ed, 0x01e02d53, 0x01a2f3c0, 0x02c4ad4a, 0x0077ba83, 0x0029020e}}, Y: Field{[10]uint32{0x00b254b9, 0x02d4d37c, 0x02f90b12, 0x015dbb47, 0x022001e7, 0x00d86cf8, 0x03f83d69, 0x02f1e6e2, 0x0212feef, 0x00103a7d}}}, + {X: Field{[10]uint32{0x001b23a8, 0x0252175c, 0x02e0adfe, 0x011c2a1f, 0x01ab7b7d, 0x02484227, 0x02243d5b, 0x02a1f049, 0x028d866c, 0x002788bf}}, Y: Field{[10]uint32{0x0084edae, 0x0104f142, 0x01cecf7a, 0x0127ed44, 0x03c0f7c9, 0x0267054c, 0x03f3f020, 0x00b4405d, 0x00e9ca12, 0x003f4bfc}}}, + {X: Field{[10]uint32{0x03f0e9aa, 0x0178658c, 0x0134b3eb, 0x01dac46f, 0x02681127, 0x01604e34, 0x0124ae0d, 0x009ab6de, 0x03e8575f, 0x00394e03}}, Y: Field{[10]uint32{0x0082720f, 0x02904d90, 0x0318ec4b, 0x0177d1a0, 0x016fb94e, 0x00932380, 0x02913639, 0x02d0756d, 0x00739087, 0x002e5ff6}}}, + {X: Field{[10]uint32{0x031a70e4, 0x01022fc1, 0x03475dd7, 0x007d7d73, 0x01cd5ee5, 0x01c14c1b, 0x01d69e64, 0x00aa34bb, 0x02d503ce, 0x0014237d}}, Y: Field{[10]uint32{0x01950984, 0x0396fdca, 0x02dfedf2, 0x00a3ba2a, 0x014ec032, 0x00cf9271, 0x03304aa7, 0x0310b5dd, 0x039b933b, 0x00055310}}}, + {X: Field{[10]uint32{0x0140d33a, 0x00f6d69e, 0x003b98cd, 0x00291508, 0x036e0d88, 0x03d5b21b, 0x00e3e1a2, 0x0302d4e9, 0x0241d28c, 0x002a0131}}, Y: Field{[10]uint32{0x0146967a, 0x03a57e9b, 0x036a943c, 0x02a273dc, 0x001af18c, 0x005811fa, 0x02c2842c, 0x029b40f7, 0x03252b2f, 0x00256fa0}}}, + {X: Field{[10]uint32{0x021abe11, 0x03f69db3, 0x0220f6ea, 0x0309672c, 0x02dab921, 0x00c0496c, 0x00df5819, 0x025d8cce, 0x03845510, 0x0038f6ff}}, Y: Field{[10]uint32{0x03a8de63, 0x026b5527, 0x01c414b4, 0x0240f1ad, 0x03d3c97d, 0x02e2a3bc, 0x038fa75d, 0x00508590, 0x01099a34, 0x0001bcbe}}}, + {X: Field{[10]uint32{0x023968b6, 0x00a4de2d, 0x03ab2e69, 0x0197b678, 0x02f40261, 0x0224224e, 0x005a9600, 0x01e7ed0f, 0x023dfc65, 0x003de92f}}, Y: Field{[10]uint32{0x00c34882, 0x03768cb4, 0x0105e494, 0x02e34440, 0x0299702f, 0x023294b4, 0x01290303, 0x03185487, 0x036ce823, 0x0035b77b}}}, + {X: Field{[10]uint32{0x03593449, 0x006c8d80, 0x006ffdcf, 0x004b90a9, 0x02f61b7c, 0x001f4052, 0x00d9c13a, 0x0250361e, 0x0064c7de, 0x00066b38}}, Y: Field{[10]uint32{0x01f83631, 0x0052e4eb, 0x0068a3a4, 0x027d0210, 0x02ac710b, 0x02500b11, 0x02bd739d, 0x028cceff, 0x02035268, 0x0038de64}}}, + {X: Field{[10]uint32{0x02bc61d6, 0x034d86fb, 0x002de1ae, 0x029f67fd, 0x018a8fd3, 0x035ac7d4, 0x015f0d15, 0x026bc30e, 0x03e4a3ed, 0x0024e7fc}}, Y: Field{[10]uint32{0x03f5cb70, 0x03a919a8, 0x03f82e75, 0x01bade31, 0x00980bf2, 0x03c05b01, 0x006fc4ee, 0x02a43a75, 0x03cf08b7, 0x0037aace}}}, + {X: Field{[10]uint32{0x00ba6b63, 0x03a624b3, 0x03bb5ee3, 0x01d3f42c, 0x010a0fe6, 0x03aa238c, 0x00c33228, 0x01f6a842, 0x00ec20f8, 0x00361d03}}, Y: Field{[10]uint32{0x0134c5f3, 0x028db01a, 0x0294abee, 0x01730e05, 0x0140104f, 0x000eb0df, 0x00a6ee99, 0x00cafcde, 0x0133c6b9, 0x00191cb0}}}, + {X: Field{[10]uint32{0x028ff2cf, 0x03b5ba22, 0x02094a34, 0x0171ec18, 0x0038ea75, 0x00901469, 0x03a98dba, 0x02b8c1e5, 0x025f1c4c, 0x000066a7}}, Y: Field{[10]uint32{0x030e4352, 0x01f9d9b6, 0x02d353a7, 0x03ba2121, 0x000ce7eb, 0x0004adcc, 0x01062925, 0x02bd7bea, 0x0067ea85, 0x00079987}}}, + {X: Field{[10]uint32{0x033ec038, 0x013fcb06, 0x02b27619, 0x01ab9831, 0x00d9fd51, 0x03ca4294, 0x0083e762, 0x01820d92, 0x03391b50, 0x00162b0c}}, Y: Field{[10]uint32{0x00246279, 0x02a8fc44, 0x03bca16e, 0x00f02d3e, 0x03021904, 0x02647fa5, 0x0379249e, 0x024b65e1, 0x0306d55c, 0x002458f5}}}, + {X: Field{[10]uint32{0x03fdf80c, 0x01e69577, 0x00d1b69f, 0x0206856f, 0x0043e4a7, 0x01d158e2, 0x02244b5b, 0x030afa31, 0x03165df3, 0x0022d2d7}}, Y: Field{[10]uint32{0x03d4fd36, 0x03fc3197, 0x02e56b3e, 0x0151858b, 0x00f9e336, 0x02ac3681, 0x03bd7813, 0x0022d2cf, 0x026f68d3, 0x0012ab42}}}, + }, + { + {X: Field{[10]uint32{0x03fdf80c, 0x01e69577, 0x00d1b69f, 0x0206856f, 0x0043e4a7, 0x01d158e2, 0x02244b5b, 0x030afa31, 0x03165df3, 0x0022d2d7}}, Y: Field{[10]uint32{0x03d4fd36, 0x03fc3197, 0x02e56b3e, 0x0151858b, 0x00f9e336, 0x02ac3681, 0x03bd7813, 0x0022d2cf, 0x026f68d3, 0x0012ab42}}}, + {X: Field{[10]uint32{0x0355e4be, 0x03c99c51, 0x0197abb3, 0x03b905f2, 0x0071af64, 0x020f1844, 0x0217c7ec, 0x0245c633, 0x00e4e132, 0x003b4317}}, Y: Field{[10]uint32{0x007bf42f, 0x027e9ba8, 0x01ab163f, 0x0095d8f7, 0x0049d939, 0x029fa9a0, 0x03dad7f5, 0x0116f6fc, 0x03c7bc23, 0x000886a7}}}, + {X: Field{[10]uint32{0x015812dd, 0x00a960bd, 0x030e2a0a, 0x008d54b4, 0x023d4467, 0x00163de3, 0x02abed6c, 0x00d4bc2d, 0x017a92ff, 0x001c0a6f}}, Y: Field{[10]uint32{0x022d2927, 0x03319ac6, 0x0073c721, 0x01090ecb, 0x0047dae8, 0x00c1a0eb, 0x016544ae, 0x02cf49f7, 0x02dafde8, 0x002c3bbe}}}, + {X: Field{[10]uint32{0x03cec8ab, 0x01b9b201, 0x012ced4b, 0x0159b815, 0x00e53254, 0x00fc7eba, 0x0315c3f8, 0x039a52ce, 0x0013c44c, 0x003ebb2c}}, Y: Field{[10]uint32{0x03155070, 0x0077f66a, 0x02e2e898, 0x021ae178, 0x019c32b2, 0x030bec4f, 0x02e02c6e, 0x032d5ff0, 0x01e90e9e, 0x0033026d}}}, + {X: Field{[10]uint32{0x01486ed1, 0x0395a0ef, 0x01b6a49c, 0x02e92559, 0x005745be, 0x0233dd58, 0x01d4109d, 0x01726402, 0x01caeae6, 0x002733fb}}, Y: Field{[10]uint32{0x01e95d8d, 0x03567b5d, 0x02aa24f6, 0x0165a564, 0x01242167, 0x0002cd04, 0x01224812, 0x00cb3ed8, 0x01713d6a, 0x001f0bd3}}}, + {X: Field{[10]uint32{0x0181fdc2, 0x02affe6c, 0x02364dcd, 0x02ed7318, 0x02dd2f62, 0x0228d39f, 0x02264b81, 0x01b91d2a, 0x002af47e, 0x003d0b04}}, Y: Field{[10]uint32{0x0085d7fd, 0x000024e9, 0x00f2681f, 0x00b668ab, 0x024c1550, 0x021bf88a, 0x03ad05cb, 0x0201b1e3, 0x02b46cfe, 0x0015d40e}}}, + {X: Field{[10]uint32{0x03d0eaca, 0x01ac69d6, 0x00ab7a20, 0x01dae8b5, 0x01d0c745, 0x032937c6, 0x028fde33, 0x01050cd6, 0x03876341, 0x00336692}}, Y: Field{[10]uint32{0x03ff4acc, 0x03ebed6a, 0x0234f6e6, 0x023bb5bd, 0x030127b3, 0x00cfa822, 0x01488ae9, 0x03c8fa05, 0x0079a1e8, 0x003c1156}}}, + {X: Field{[10]uint32{0x02d1b1f7, 0x0193aba6, 0x00d3e07f, 0x02093c8f, 0x01b3b2dd, 0x01f2f2bf, 0x0331a0b3, 0x034bcb21, 0x02132dca, 0x00026ee2}}, Y: Field{[10]uint32{0x03811c80, 0x00c189f0, 0x02d53641, 0x0103d1d4, 0x010f54a8, 0x03e18fa1, 0x039dd284, 0x038ee6db, 0x02b2afee, 0x002516ec}}}, + {X: Field{[10]uint32{0x03bc57c6, 0x0254e8f1, 0x036cbf20, 0x0288fac9, 0x004903d7, 0x00f58c25, 0x00f2d2e9, 0x026faa21, 0x002f88ed, 0x002b4262}}, Y: Field{[10]uint32{0x024a0ab8, 0x00b03b6b, 0x022d3ca3, 0x00dcd643, 0x037b311d, 0x0276af97, 0x00186c72, 0x0294ae8a, 0x008c42fb, 0x001c90f0}}}, + {X: Field{[10]uint32{0x03927dc7, 0x036ad913, 0x018a49e2, 0x00358f50, 0x0337a7a4, 0x019a8508, 0x029ed953, 0x029aef99, 0x00cc082b, 0x00389828}}, Y: Field{[10]uint32{0x02aef35d, 0x03cdbd11, 0x0382da45, 0x02d118b2, 0x00edbcc0, 0x0096fd10, 0x033cb3d7, 0x02759fc1, 0x0344b0da, 0x000dfb99}}}, + {X: Field{[10]uint32{0x03a56302, 0x00c31caa, 0x01862ea8, 0x00debc3c, 0x00f506a9, 0x027eb4b8, 0x02da2d2a, 0x02907c7a, 0x010aeb3c, 0x0036744a}}, Y: Field{[10]uint32{0x00291c29, 0x0376bea2, 0x00f2aeaa, 0x03367e9d, 0x001739ae, 0x0098e1b9, 0x01715c67, 0x00fbb40a, 0x0113ec2d, 0x001fad4c}}}, + {X: Field{[10]uint32{0x02dd7dd6, 0x01b51f7b, 0x0168c386, 0x03899786, 0x0049376f, 0x039f3f7b, 0x01a7840e, 0x01492f29, 0x036a24c7, 0x000cb3f3}}, Y: Field{[10]uint32{0x0208e330, 0x03512bbf, 0x0208b25f, 0x03480d26, 0x027a0d8c, 0x0027d587, 0x008096a4, 0x01dd2188, 0x0234976a, 0x0008611a}}}, + {X: Field{[10]uint32{0x00d1243a, 0x034dc13d, 0x025fdbac, 0x0008fd52, 0x0002b126, 0x018fd561, 0x00d21ac0, 0x01b3be47, 0x01de539d, 0x002f141e}}, Y: Field{[10]uint32{0x015db68a, 0x02545a21, 0x03169f5c, 0x03d6c7d1, 0x035f7ee4, 0x037ff235, 0x02c72b94, 0x0172ee3b, 0x023b3a70, 0x0019418a}}}, + {X: Field{[10]uint32{0x02abf83d, 0x0340ff7d, 0x00596696, 0x0163ecb4, 0x02b8f940, 0x00348b00, 0x00be68f1, 0x03127cfb, 0x02dde85a, 0x0008d72a}}, Y: Field{[10]uint32{0x0133e191, 0x03b27a43, 0x010ae7f4, 0x0358c8d8, 0x013f0518, 0x0324eb62, 0x00232a5b, 0x011fafb9, 0x01c745fd, 0x003704be}}}, + {X: Field{[10]uint32{0x034a3f9f, 0x009139ad, 0x0016908d, 0x01977026, 0x02c287a6, 0x036c9896, 0x03deaae7, 0x031fa244, 0x037e505f, 0x00134c69}}, Y: Field{[10]uint32{0x001e0ba7, 0x02c0904c, 0x00a754fc, 0x0146db80, 0x03cbf6fb, 0x01e009d4, 0x0318f38c, 0x015d6c1a, 0x02c96098, 0x00088907}}}, + {X: Field{[10]uint32{0x0232fcda, 0x00456494, 0x0277bcb6, 0x03fe9b03, 0x03b700db, 0x02f55231, 0x03771c00, 0x0265b5af, 0x02a6e5db, 0x001c8f2e}}, Y: Field{[10]uint32{0x02b39f5f, 0x0301a767, 0x0094801d, 0x0194dde5, 0x022660a0, 0x0220935b, 0x02113748, 0x031262a4, 0x03b5595c, 0x0025ba19}}}, + }, + { + {X: Field{[10]uint32{0x0232fcda, 0x00456494, 0x0277bcb6, 0x03fe9b03, 0x03b700db, 0x02f55231, 0x03771c00, 0x0265b5af, 0x02a6e5db, 0x001c8f2e}}, Y: Field{[10]uint32{0x02b39f5f, 0x0301a767, 0x0094801d, 0x0194dde5, 0x022660a0, 0x0220935b, 0x02113748, 0x031262a4, 0x03b5595c, 0x0025ba19}}}, + {X: Field{[10]uint32{0x00a030d5, 0x00e0f583, 0x009071fd, 0x010c1e61, 0x022d240a, 0x01dce8f1, 0x03d7dc45, 0x01d134d0, 0x0386437b, 0x0015fbe9}}, Y: Field{[10]uint32{0x00b02f9e, 0x02ad109d, 0x0174ab07, 0x00ab97a6, 0x00689b6d, 0x023780fb, 0x03627c92, 0x02146224, 0x030bd1b4, 0x0035c4b6}}}, + {X: Field{[10]uint32{0x00633cb1, 0x01f827a0, 0x02113256, 0x012da740, 0x03575a22, 0x008607f2, 0x00627321, 0x032b5003, 0x00f317aa, 0x001b77a7}}, Y: Field{[10]uint32{0x03ce6b34, 0x03526a99, 0x01ef357d, 0x036b3e16, 0x0080b27f, 0x006e99aa, 0x019ef86a, 0x03907572, 0x03e7a707, 0x0024623e}}}, + {X: Field{[10]uint32{0x00584dd5, 0x03f1ddc3, 0x0012a7fa, 0x01f8c9ec, 0x01108057, 0x01489b2e, 0x01f7e9cd, 0x02f10a8b, 0x01436a28, 0x000992ef}}, Y: Field{[10]uint32{0x0304ab11, 0x0089e4dd, 0x00d8de61, 0x010dc5ee, 0x026a1182, 0x030cef88, 0x0375ce24, 0x024ed353, 0x03a94ee0, 0x00361f1b}}}, + {X: Field{[10]uint32{0x0133f3c5, 0x0294634a, 0x02522419, 0x01c457c4, 0x00085a0f, 0x0391ee14, 0x004bb7f8, 0x0337a04f, 0x032cd5b5, 0x00121be9}}, Y: Field{[10]uint32{0x02fb0f53, 0x0129c6b2, 0x023b79ad, 0x020f3c3c, 0x0362d9b7, 0x03323c67, 0x00c48bae, 0x03750f92, 0x0319f56b, 0x0018b848}}}, + {X: Field{[10]uint32{0x00e5467d, 0x02f5da91, 0x03ace4d0, 0x02e066ef, 0x0140908a, 0x03b25c3a, 0x021f62e0, 0x028488b0, 0x00f0fc69, 0x0025f419}}, Y: Field{[10]uint32{0x029cb3fa, 0x00c03f47, 0x03ccd797, 0x02e153c5, 0x03da5fb3, 0x02142187, 0x037c66fa, 0x000b300f, 0x032ed334, 0x002265d3}}}, + {X: Field{[10]uint32{0x0299f728, 0x01650897, 0x02204ebd, 0x03ef9bc4, 0x03677375, 0x01da94c0, 0x024ff27b, 0x02bd3ed9, 0x0174a894, 0x00091e5a}}, Y: Field{[10]uint32{0x03aaebff, 0x000145ba, 0x022d837a, 0x030255d6, 0x025adbf3, 0x03635992, 0x012e87e7, 0x00c007b1, 0x0144688f, 0x0038f5e3}}}, + {X: Field{[10]uint32{0x032438e8, 0x009af612, 0x02c9d2bf, 0x007f56f7, 0x01a78bc6, 0x008da9e7, 0x0085c056, 0x034aef6b, 0x0124bd40, 0x002a5319}}, Y: Field{[10]uint32{0x018661f4, 0x00b236fc, 0x01b2bc2e, 0x0182838e, 0x027e5d3c, 0x0140678e, 0x03921950, 0x018a03f5, 0x03d992f9, 0x002d4807}}}, + {X: Field{[10]uint32{0x03b0079a, 0x0031b50b, 0x02049c9e, 0x03dc8e49, 0x00916f9e, 0x01ace0c9, 0x01a59ee7, 0x017fc18c, 0x03daa3d5, 0x000bce72}}, Y: Field{[10]uint32{0x005690ba, 0x00a5cc0b, 0x00230fe2, 0x02f220a8, 0x039bfb3f, 0x01e36962, 0x02936d02, 0x00e60d36, 0x03de1386, 0x002afab6}}}, + {X: Field{[10]uint32{0x018086c8, 0x01bca26e, 0x023ff5f4, 0x00d2d899, 0x0040c10e, 0x02aa39bf, 0x01263b70, 0x00af74a2, 0x025baa80, 0x000fa10b}}, Y: Field{[10]uint32{0x02e939a9, 0x012d44e3, 0x03d4ef99, 0x01dadd79, 0x0037b8e5, 0x006c1df0, 0x01370463, 0x039cb86e, 0x03f5fc92, 0x00227c93}}}, + {X: Field{[10]uint32{0x00f7ab73, 0x00c02cb9, 0x003a7793, 0x03aa7511, 0x0262e3d4, 0x014d2bb4, 0x0239e86c, 0x0186e95a, 0x016c327d, 0x003968c7}}, Y: Field{[10]uint32{0x00561f42, 0x00e8ff1c, 0x03a21391, 0x0126a032, 0x01bf8c44, 0x0293b397, 0x0118a977, 0x0275e830, 0x003d8d1e, 0x000dde23}}}, + {X: Field{[10]uint32{0x03613bec, 0x02072e44, 0x03e67cca, 0x02744073, 0x028bb5fc, 0x01d3e5ca, 0x031b33dc, 0x00def7b7, 0x02b8c939, 0x000b73f2}}, Y: Field{[10]uint32{0x02039215, 0x00c24926, 0x01f383e7, 0x02eb4cfd, 0x003732cf, 0x01bdb1bd, 0x03088b7d, 0x02904997, 0x00dd9474, 0x0011b6f1}}}, + {X: Field{[10]uint32{0x014dcd86, 0x024a68f0, 0x031b588f, 0x00825afd, 0x011fc5d4, 0x0014773c, 0x010dd982, 0x00d11f7d, 0x014a0d15, 0x00330e27}}, Y: Field{[10]uint32{0x00f0a873, 0x02db7672, 0x0387468e, 0x0063f9f9, 0x0205c57e, 0x03aa4432, 0x0168bdbb, 0x02efb66d, 0x03d660f6, 0x0024eb93}}}, + {X: Field{[10]uint32{0x03b4f6be, 0x00f5d937, 0x02b64844, 0x03fd3e8f, 0x02b567d5, 0x023c3a2d, 0x004bb042, 0x0208a23b, 0x03d1ae75, 0x0028ab94}}, Y: Field{[10]uint32{0x02eeb9a2, 0x008959d2, 0x00436c04, 0x019f0f50, 0x004c0efa, 0x0306d51f, 0x015679c7, 0x028261f2, 0x014d44b3, 0x001a4cd6}}}, + {X: Field{[10]uint32{0x00819311, 0x0271bade, 0x0314724f, 0x0388421d, 0x030b3e1e, 0x033d7b47, 0x010a17e0, 0x03a408dd, 0x01c89d71, 0x001fe4a4}}, Y: Field{[10]uint32{0x002eb125, 0x03e6d5eb, 0x02174aa9, 0x0102721a, 0x02120aaa, 0x0149056d, 0x010de8c4, 0x00fbc3d7, 0x011063ec, 0x00276803}}}, + {X: Field{[10]uint32{0x027dd7fa, 0x00cfb283, 0x019839a5, 0x0048dea4, 0x01094796, 0x00b0b4ed, 0x01feec81, 0x02fe62e9, 0x00d493be, 0x003bafe9}}, Y: Field{[10]uint32{0x01de8999, 0x0353f6b8, 0x03712ddf, 0x030e9c47, 0x019ae4cd, 0x005e0227, 0x02e7edaf, 0x03c3c9a7, 0x00a3970e, 0x001766a3}}}, + }, + { + {X: Field{[10]uint32{0x027dd7fa, 0x00cfb283, 0x019839a5, 0x0048dea4, 0x01094796, 0x00b0b4ed, 0x01feec81, 0x02fe62e9, 0x00d493be, 0x003bafe9}}, Y: Field{[10]uint32{0x01de8999, 0x0353f6b8, 0x03712ddf, 0x030e9c47, 0x019ae4cd, 0x005e0227, 0x02e7edaf, 0x03c3c9a7, 0x00a3970e, 0x001766a3}}}, + {X: Field{[10]uint32{0x03d297fd, 0x03ba4211, 0x026d676b, 0x03023d9d, 0x03c4ea4b, 0x00461257, 0x01c6031c, 0x01eff698, 0x02d7a7a9, 0x000e0712}}, Y: Field{[10]uint32{0x01493fc5, 0x0338c61f, 0x01c0093a, 0x00cb6e4e, 0x00f04510, 0x026457b3, 0x03e5fa70, 0x03bb923c, 0x013b238e, 0x0024dabd}}}, + {X: Field{[10]uint32{0x037ceceb, 0x019e3fee, 0x03af0f3f, 0x024e225f, 0x0073a59f, 0x03db9a05, 0x03fb8126, 0x035140db, 0x02204276, 0x0010dea1}}, Y: Field{[10]uint32{0x02c181e1, 0x00ef30d5, 0x01782736, 0x033f723e, 0x0387220f, 0x0274a5ff, 0x038feb69, 0x030cbda6, 0x03a13eea, 0x0002e45a}}}, + {X: Field{[10]uint32{0x02de454c, 0x035c108b, 0x008b2448, 0x017fbf74, 0x039cf1d0, 0x0254e311, 0x0210831d, 0x0318ef33, 0x01cd05ad, 0x00387bee}}, Y: Field{[10]uint32{0x00913797, 0x03f48cea, 0x014c6ad9, 0x01129e8b, 0x03464e32, 0x0391dc48, 0x0154c1ff, 0x026f9ec0, 0x0130d8af, 0x0003b2d1}}}, + {X: Field{[10]uint32{0x017f96f2, 0x035ca782, 0x0335cd58, 0x00a74b21, 0x03358235, 0x028f309c, 0x00b7e3b9, 0x0226f20f, 0x0313e2a4, 0x002a7be7}}, Y: Field{[10]uint32{0x02c04be4, 0x03556c15, 0x00702c03, 0x02bd6a6d, 0x01b74f89, 0x03aed84f, 0x016ee160, 0x0275f365, 0x00e59455, 0x003a0533}}}, + {X: Field{[10]uint32{0x00bf00eb, 0x036761f7, 0x002274c9, 0x022f0634, 0x0241b4e9, 0x0068c2f0, 0x03e16f6a, 0x03537126, 0x00ae96ea, 0x002e241c}}, Y: Field{[10]uint32{0x030e664e, 0x03c6f346, 0x02a671b7, 0x001adae5, 0x02cb0d8b, 0x007129d9, 0x02294e4c, 0x03623d1c, 0x00c2c8a2, 0x001bc932}}}, + {X: Field{[10]uint32{0x010cf77e, 0x02ad684d, 0x02b0dbc0, 0x01d152a2, 0x0207dbf5, 0x03ea8190, 0x03827d69, 0x00d6f954, 0x0141ee1d, 0x0019b601}}, Y: Field{[10]uint32{0x00eaa3a6, 0x03e5ebe8, 0x0376d2a5, 0x00eadec6, 0x029444b4, 0x00d584fd, 0x031d4205, 0x03ed0b0f, 0x03e732ff, 0x001473f7}}}, + {X: Field{[10]uint32{0x01eb99a4, 0x03fbacca, 0x03b18d33, 0x027ccf51, 0x00c7e541, 0x02bd1d6a, 0x02c235e9, 0x01c04316, 0x01b1a269, 0x0014c63e}}, Y: Field{[10]uint32{0x0291f92d, 0x009bbbbf, 0x02c652c7, 0x0103478f, 0x00a41f2b, 0x02ed017a, 0x032d93ae, 0x0290655d, 0x03eb4bed, 0x003d1333}}}, + {X: Field{[10]uint32{0x03213a5a, 0x01218a21, 0x0262b935, 0x0129e17e, 0x000b7320, 0x019330f2, 0x03508a1c, 0x00fe8afc, 0x01e13650, 0x0018ab01}}, Y: Field{[10]uint32{0x006a9e45, 0x0348703d, 0x014efc10, 0x000605e6, 0x01e55909, 0x01ea495e, 0x015e79e0, 0x029b934e, 0x01f3a0d1, 0x0008dbef}}}, + {X: Field{[10]uint32{0x03c76ac1, 0x0086cf3b, 0x02c05d6b, 0x02572908, 0x016124c3, 0x0354fa26, 0x021859a7, 0x00de10df, 0x03bfab10, 0x000623bc}}, Y: Field{[10]uint32{0x028f00bc, 0x0180ca94, 0x03875351, 0x03a0f1d8, 0x00e4d66d, 0x03ce638e, 0x005fb18c, 0x02ea6740, 0x017a052f, 0x0039bf26}}}, + {X: Field{[10]uint32{0x03bad12b, 0x03f52619, 0x02e1ec30, 0x0003abd9, 0x0385d5ea, 0x031bcb6c, 0x03613af5, 0x023d6d6f, 0x00497244, 0x003284f1}}, Y: Field{[10]uint32{0x0323b0f2, 0x0267d1a5, 0x03566896, 0x01c44695, 0x026370ab, 0x02ab68f5, 0x015fa64e, 0x021f22b0, 0x018361c2, 0x0020ea82}}}, + {X: Field{[10]uint32{0x02fbe7b2, 0x01bfe6ad, 0x025a3b9d, 0x03051635, 0x005eaded, 0x00aa2118, 0x036bbb1b, 0x0107e3cc, 0x03669cb4, 0x00099221}}, Y: Field{[10]uint32{0x01bc2a34, 0x029e2f08, 0x03603932, 0x0205a83a, 0x005638d9, 0x000b77c6, 0x02f2dcad, 0x0112623c, 0x02b4b201, 0x00278576}}}, + {X: Field{[10]uint32{0x0080414e, 0x03b97e57, 0x00f7fdda, 0x0218b59b, 0x0114ef8a, 0x01182792, 0x0011c4f4, 0x00aba16b, 0x0101a705, 0x00073b2c}}, Y: Field{[10]uint32{0x02169a3b, 0x03a524b4, 0x031d0dca, 0x039511c8, 0x02907557, 0x017b6b45, 0x01aa3283, 0x01f3ed39, 0x00669609, 0x003cd0d8}}}, + {X: Field{[10]uint32{0x0320907d, 0x00793462, 0x0051c50d, 0x0358581e, 0x003b15b2, 0x012143fd, 0x002f4589, 0x03089ec0, 0x01bc3e54, 0x003e62d7}}, Y: Field{[10]uint32{0x00c926af, 0x004c66d7, 0x00e35835, 0x038096a4, 0x0241fcd9, 0x02ea7327, 0x0139b706, 0x004fe90a, 0x00bd4f4a, 0x0038b542}}}, + {X: Field{[10]uint32{0x02d810a9, 0x016f2313, 0x00155c4f, 0x00fcf1c0, 0x024f889d, 0x0077c8e4, 0x010daf5f, 0x023e7325, 0x007504d7, 0x000a9a64}}, Y: Field{[10]uint32{0x029b4728, 0x01ace23e, 0x005c7cf8, 0x03a5fb05, 0x00667d47, 0x013ec13f, 0x02c58695, 0x03ff6b0f, 0x039b6c3d, 0x00153e40}}}, + {X: Field{[10]uint32{0x01a48db0, 0x01e0d6ce, 0x003bfefd, 0x028a6cf0, 0x019f1215, 0x02def791, 0x011d0a09, 0x01c59c9e, 0x00da696e, 0x000403d1}}, Y: Field{[10]uint32{0x03c65a09, 0x0357358a, 0x015ac0fb, 0x0063fd46, 0x02b7ff4a, 0x03024199, 0x008f3300, 0x002ddcbb, 0x013192a0, 0x00337678}}}, + }, + { + {X: Field{[10]uint32{0x01a48db0, 0x01e0d6ce, 0x003bfefd, 0x028a6cf0, 0x019f1215, 0x02def791, 0x011d0a09, 0x01c59c9e, 0x00da696e, 0x000403d1}}, Y: Field{[10]uint32{0x03c65a09, 0x0357358a, 0x015ac0fb, 0x0063fd46, 0x02b7ff4a, 0x03024199, 0x008f3300, 0x002ddcbb, 0x013192a0, 0x00337678}}}, + {X: Field{[10]uint32{0x024df706, 0x014a13c7, 0x008084b0, 0x03e48df4, 0x01d8d9c8, 0x02d31066, 0x0015dff2, 0x031dc6a1, 0x01f2ceb5, 0x00230262}}, Y: Field{[10]uint32{0x0172fa98, 0x02b168d7, 0x011aa736, 0x03d45594, 0x0060de6b, 0x0277259b, 0x012172cb, 0x0080d3ff, 0x01044f43, 0x003ed36f}}}, + {X: Field{[10]uint32{0x01bc15b4, 0x02684d25, 0x02ee69cb, 0x02391968, 0x01927502, 0x03b5f2a3, 0x0058ee9c, 0x02b727b6, 0x022e51ee, 0x00043a43}}, Y: Field{[10]uint32{0x00aa258d, 0x02f98256, 0x02a8834e, 0x018c0aed, 0x014ca589, 0x01ab47dd, 0x017a8c61, 0x03810935, 0x030380d5, 0x0031a28d}}}, + {X: Field{[10]uint32{0x0047bffd, 0x018f0cf7, 0x03c1bb1e, 0x00e6f256, 0x019c5285, 0x0098b009, 0x02481743, 0x019c1312, 0x013c5e26, 0x003ee3c5}}, Y: Field{[10]uint32{0x0149b095, 0x02917776, 0x02613090, 0x0226b150, 0x031dde13, 0x012f3354, 0x03a11d9b, 0x0188605b, 0x029dc5e0, 0x001b289e}}}, + {X: Field{[10]uint32{0x03e75269, 0x00ff0c0f, 0x033182dd, 0x033014f4, 0x01a377a3, 0x0052df73, 0x035b90b7, 0x0058e115, 0x0342da54, 0x003dd08b}}, Y: Field{[10]uint32{0x03e49bd5, 0x0203a1c5, 0x018e0189, 0x00dfd28e, 0x037fb3a2, 0x027d8d65, 0x00ce7dcb, 0x0024ff46, 0x031a3313, 0x00101b0b}}}, + {X: Field{[10]uint32{0x021c0a80, 0x00aaf21e, 0x01c740f6, 0x0163196a, 0x034d6251, 0x000bfe70, 0x03c9be70, 0x033296c5, 0x0268a614, 0x002dac56}}, Y: Field{[10]uint32{0x01ce0a03, 0x03404410, 0x016eeb6c, 0x02cc20b8, 0x009c9a12, 0x03d94db5, 0x00e223ee, 0x02d87a95, 0x0214d6cd, 0x003eb98b}}}, + {X: Field{[10]uint32{0x01a7175f, 0x02d9a5bd, 0x0342a653, 0x01c74c73, 0x03edb8e7, 0x00b577ae, 0x0079a558, 0x00f3fdca, 0x010417d4, 0x000b632b}}, Y: Field{[10]uint32{0x039d592a, 0x01eee46e, 0x025e0cf3, 0x03f672d7, 0x037a846b, 0x004b274d, 0x03232fa6, 0x02a529ee, 0x0383318c, 0x0031cfce}}}, + {X: Field{[10]uint32{0x03b2629a, 0x0286e2d2, 0x027b8b8f, 0x0161dcde, 0x0065a02c, 0x01ca1c21, 0x00cc9f0a, 0x0145d568, 0x033fd75d, 0x0039d1cc}}, Y: Field{[10]uint32{0x0146f6d6, 0x0365869a, 0x0169a9f8, 0x02a9b86a, 0x01c88376, 0x00130960, 0x00436038, 0x00304533, 0x02014507, 0x003cabff}}}, + {X: Field{[10]uint32{0x00b51045, 0x0326f0e5, 0x025b3e34, 0x025bcc70, 0x03bbc6c8, 0x007a33dc, 0x0273d4eb, 0x01ba962b, 0x011db98a, 0x0007b2ff}}, Y: Field{[10]uint32{0x02c70026, 0x019c4040, 0x0022d53a, 0x011ad0d9, 0x00b19006, 0x0126a6ce, 0x03d0bb18, 0x030e9911, 0x02308b99, 0x00073db8}}}, + {X: Field{[10]uint32{0x0013e439, 0x016d5b19, 0x02f674a3, 0x03bf7757, 0x02f92f69, 0x01fb6d92, 0x00b1bfeb, 0x038a5abe, 0x03b8b477, 0x00265d06}}, Y: Field{[10]uint32{0x0032cd5b, 0x015f609a, 0x026e43e6, 0x0325a5d1, 0x02b17c15, 0x01638f9e, 0x035aa562, 0x0326979c, 0x01b07bd9, 0x003791fa}}}, + {X: Field{[10]uint32{0x01358533, 0x0335d9ba, 0x00b9df7a, 0x03e753ed, 0x0010a933, 0x0074caa3, 0x02955a29, 0x01d4a20f, 0x00c5fe57, 0x00268225}}, Y: Field{[10]uint32{0x0360ba08, 0x03871770, 0x01dadfb3, 0x02f6ee03, 0x0165a6e5, 0x0153f0c8, 0x0117d5f9, 0x023f0c7e, 0x03c4201b, 0x0029e620}}}, + {X: Field{[10]uint32{0x02b062d4, 0x02a942a4, 0x02141a7c, 0x03966eda, 0x027a5ce7, 0x00fa889e, 0x03b17128, 0x03ab281b, 0x02a43256, 0x000d658f}}, Y: Field{[10]uint32{0x03b25302, 0x02a9346e, 0x019b1a10, 0x02e59379, 0x02d04082, 0x027022a5, 0x00ce196f, 0x039726ff, 0x01454951, 0x003d96f8}}}, + {X: Field{[10]uint32{0x018ef7f6, 0x01017586, 0x00f9f694, 0x03dde81e, 0x025923f3, 0x00ee2ba9, 0x019c8527, 0x034b8d6f, 0x0049db4f, 0x00199376}}, Y: Field{[10]uint32{0x011eac94, 0x025bfcd7, 0x02ecee74, 0x02cc6e39, 0x03fc3d3a, 0x03411633, 0x0048ce5d, 0x01e4ca85, 0x001717f2, 0x002b5448}}}, + {X: Field{[10]uint32{0x019334f0, 0x02d9bcc4, 0x011b60d0, 0x03ece82b, 0x0174728e, 0x0170a790, 0x020e8248, 0x030c871a, 0x037b02cf, 0x0033aede}}, Y: Field{[10]uint32{0x01e45191, 0x0142f494, 0x036cb167, 0x0276e780, 0x004765a2, 0x0374b8dc, 0x01ec0f74, 0x0128cae8, 0x0243633b, 0x003f8f7c}}}, + {X: Field{[10]uint32{0x03c934b3, 0x0029adf0, 0x022c4e0c, 0x02016c2b, 0x022b31f5, 0x020469c0, 0x031d9669, 0x02e18e08, 0x029377d0, 0x0020844e}}, Y: Field{[10]uint32{0x002c6a0f, 0x01798ab1, 0x0280377e, 0x009a6911, 0x00aa1f7c, 0x0168318a, 0x0066cf2b, 0x00d99821, 0x00dac9ae, 0x0023686e}}}, + {X: Field{[10]uint32{0x0134fd2d, 0x02b379b9, 0x033852c8, 0x011193ce, 0x03a77f8d, 0x02813005, 0x009227a4, 0x03b46c77, 0x03e262c7, 0x003840c6}}, Y: Field{[10]uint32{0x0056a00d, 0x03c63ca5, 0x02d79a44, 0x01067873, 0x02f292dd, 0x0165d4d6, 0x036a4176, 0x010179ae, 0x01928940, 0x00275c18}}}, + }, + { + {X: Field{[10]uint32{0x0134fd2d, 0x02b379b9, 0x033852c8, 0x011193ce, 0x03a77f8d, 0x02813005, 0x009227a4, 0x03b46c77, 0x03e262c7, 0x003840c6}}, Y: Field{[10]uint32{0x0056a00d, 0x03c63ca5, 0x02d79a44, 0x01067873, 0x02f292dd, 0x0165d4d6, 0x036a4176, 0x010179ae, 0x01928940, 0x00275c18}}}, + {X: Field{[10]uint32{0x015c8356, 0x009f8daa, 0x0185784e, 0x03177a53, 0x01028a6a, 0x03ca6cb2, 0x0395dcd0, 0x0227aae7, 0x03224c80, 0x003d2e4f}}, Y: Field{[10]uint32{0x02001fd3, 0x02186e6f, 0x0209abd5, 0x00d12455, 0x00c37ef1, 0x0103bba4, 0x025f6a7a, 0x018b7ec3, 0x02ec0629, 0x00299ea4}}}, + {X: Field{[10]uint32{0x03028d83, 0x0188ebbb, 0x03961579, 0x01b6e9d0, 0x03619592, 0x01779a76, 0x01abe5a1, 0x0217b1a9, 0x03c4e3c7, 0x0029fafd}}, Y: Field{[10]uint32{0x01d0bed1, 0x000e4ae6, 0x03919964, 0x009d2c14, 0x0347a389, 0x00112012, 0x019c7377, 0x018b573f, 0x012fbfe3, 0x00188145}}}, + {X: Field{[10]uint32{0x03160e8a, 0x018bf85e, 0x0296c20d, 0x004be5f9, 0x00d51e85, 0x0096c22c, 0x01622ea0, 0x0148dac6, 0x00a1fce5, 0x0002746b}}, Y: Field{[10]uint32{0x00a04c44, 0x0014315f, 0x035e534e, 0x03ba484a, 0x026fe9e0, 0x0036309f, 0x016692ce, 0x03c318f9, 0x008f5101, 0x000454c6}}}, + {X: Field{[10]uint32{0x03dd5cfa, 0x00390089, 0x014b5bae, 0x004dfc27, 0x036a89c5, 0x0098d18c, 0x01c6a534, 0x013d3073, 0x008dcb02, 0x0016d728}}, Y: Field{[10]uint32{0x0248e98c, 0x0129be67, 0x029d3e66, 0x0332bcc9, 0x00bfd067, 0x0221a425, 0x011f0cea, 0x016097a6, 0x02f70aa1, 0x000fb32d}}}, + {X: Field{[10]uint32{0x03b61ee5, 0x021104de, 0x00c13f28, 0x038bec7c, 0x02da4f04, 0x025d2b9b, 0x02638cd8, 0x0086e198, 0x0230cc87, 0x003524cc}}, Y: Field{[10]uint32{0x01d694a8, 0x03693439, 0x00ddc662, 0x0231690e, 0x021ad12c, 0x03b2bed7, 0x00c5e9d1, 0x02748fb7, 0x01abf51a, 0x00008702}}}, + {X: Field{[10]uint32{0x03531f82, 0x014a38c8, 0x02c9f2b9, 0x01aec430, 0x01ff5132, 0x02708b0a, 0x02f3e748, 0x012ed733, 0x02acc111, 0x00011bc9}}, Y: Field{[10]uint32{0x03ceda07, 0x017f22c2, 0x01c7fa50, 0x01736ad5, 0x01d02594, 0x03f0c95e, 0x02370ac2, 0x020bab38, 0x0331635b, 0x001ae012}}}, + {X: Field{[10]uint32{0x01ba7fc2, 0x035f411d, 0x01562e97, 0x024eff0e, 0x03518b3a, 0x02087379, 0x022ad793, 0x00ae7862, 0x01cc454c, 0x00319b16}}, Y: Field{[10]uint32{0x035f5956, 0x00f1a73d, 0x015977ec, 0x0376c565, 0x02f00a60, 0x02b0432c, 0x024f3cea, 0x003f3efa, 0x03e2bfb3, 0x0036564b}}}, + {X: Field{[10]uint32{0x00432711, 0x00550dc4, 0x02b9060b, 0x00bf7645, 0x02cf140b, 0x02265916, 0x0396f0f0, 0x03bed4d7, 0x02d931e0, 0x00304649}}, Y: Field{[10]uint32{0x03e2610c, 0x009878bb, 0x00055e49, 0x00b283cd, 0x0383ab92, 0x01b331b3, 0x0094bf18, 0x02da2461, 0x00cc7d25, 0x0022f87e}}}, + {X: Field{[10]uint32{0x02be316c, 0x01b1b348, 0x03ad0f83, 0x00fc9e39, 0x016bf404, 0x0097bd7c, 0x017cef5b, 0x00deccac, 0x01aa4a0b, 0x00156735}}, Y: Field{[10]uint32{0x03e04013, 0x02ae7267, 0x000e71a6, 0x0074d81e, 0x038a389a, 0x01d31a4b, 0x01ba9298, 0x0101dbcb, 0x009c08d4, 0x002ab551}}}, + {X: Field{[10]uint32{0x01257963, 0x0261d3e8, 0x02861c17, 0x014b0d2a, 0x005b018d, 0x00e25e71, 0x01bb54b5, 0x023cb9b3, 0x02e9eb68, 0x001a4211}}, Y: Field{[10]uint32{0x026f9835, 0x01d96651, 0x02b253a5, 0x02a08724, 0x036cbc3c, 0x024beedf, 0x0017024f, 0x03af16d0, 0x03cb7f3f, 0x00389217}}}, + {X: Field{[10]uint32{0x0004554a, 0x03772f3b, 0x00ffe530, 0x02ed1a23, 0x00aadcff, 0x028428bb, 0x00652c27, 0x0346811d, 0x03c89873, 0x00225bcd}}, Y: Field{[10]uint32{0x029138df, 0x03e7f864, 0x017dcd68, 0x0186b310, 0x01e6085b, 0x03a046fc, 0x0222bb04, 0x0312b369, 0x03e7224a, 0x000e0108}}}, + {X: Field{[10]uint32{0x02e23ace, 0x004e52f7, 0x012fd2d1, 0x0196d537, 0x01dec87c, 0x0128ca45, 0x027552df, 0x0082eaee, 0x03fb8c92, 0x003ecf7d}}, Y: Field{[10]uint32{0x0322e8de, 0x037bd325, 0x03f5ee09, 0x010bfb49, 0x029e7271, 0x036ead62, 0x02251540, 0x00f1594a, 0x01bc11c7, 0x0014438a}}}, + {X: Field{[10]uint32{0x00d36f89, 0x003c4c17, 0x00b925f9, 0x031b9c03, 0x031e4754, 0x00a403b8, 0x01d68b87, 0x0148e594, 0x03176915, 0x00120adb}}, Y: Field{[10]uint32{0x00a4f423, 0x0328dc9c, 0x01a68467, 0x00d10b52, 0x0219ee07, 0x035ffa4b, 0x018c23e6, 0x03316b2c, 0x011df9a5, 0x003a30f0}}}, + {X: Field{[10]uint32{0x00272351, 0x01f3fbd4, 0x03109860, 0x00f7e67f, 0x0170734b, 0x02ac7350, 0x038a3eb3, 0x01462cfa, 0x02c24f5c, 0x001b7617}}, Y: Field{[10]uint32{0x03c7664b, 0x01fe8adf, 0x0017c9b0, 0x03df0f82, 0x03877c6f, 0x03d7106d, 0x01407f9a, 0x0109f827, 0x03f4121f, 0x0005ba99}}}, + {X: Field{[10]uint32{0x0094696d, 0x039a2364, 0x02af52d5, 0x019a9075, 0x005cf8b2, 0x010ef5fb, 0x002839f1, 0x016d4c2b, 0x00ae46d5, 0x003fba9b}}, Y: Field{[10]uint32{0x00090088, 0x0177afc6, 0x0042d315, 0x015f3105, 0x00981c89, 0x03cfb357, 0x02e4e12b, 0x0386eac1, 0x036c97dc, 0x00395f1a}}}, + }, + { + {X: Field{[10]uint32{0x0094696d, 0x039a2364, 0x02af52d5, 0x019a9075, 0x005cf8b2, 0x010ef5fb, 0x002839f1, 0x016d4c2b, 0x00ae46d5, 0x003fba9b}}, Y: Field{[10]uint32{0x00090088, 0x0177afc6, 0x0042d315, 0x015f3105, 0x00981c89, 0x03cfb357, 0x02e4e12b, 0x0386eac1, 0x036c97dc, 0x00395f1a}}}, + {X: Field{[10]uint32{0x02752b08, 0x010102bb, 0x021870aa, 0x0382ccc6, 0x01141eca, 0x036cb85e, 0x03261af9, 0x021f8714, 0x03621adb, 0x00134002}}, Y: Field{[10]uint32{0x00302cea, 0x00a147d2, 0x0293a3e7, 0x03c4671c, 0x00cb7df5, 0x00b65cb3, 0x02d82558, 0x0349572d, 0x038f18e0, 0x001a8356}}}, + {X: Field{[10]uint32{0x00dfd587, 0x00d86ed2, 0x02656079, 0x00e326c0, 0x015ec4ba, 0x033d684b, 0x0067aaa2, 0x01422cd2, 0x001bacf4, 0x0014212d}}, Y: Field{[10]uint32{0x01470e89, 0x027a5fe4, 0x035606e7, 0x0181a247, 0x035db6f5, 0x014a49d1, 0x01aa6c85, 0x0034c586, 0x031a1d98, 0x000d2a58}}}, + {X: Field{[10]uint32{0x035c58ef, 0x0258bf51, 0x01b77f89, 0x0100f87c, 0x00d657a0, 0x011c5c4a, 0x02a26211, 0x0281775a, 0x00ca203d, 0x001c7d5c}}, Y: Field{[10]uint32{0x035d420e, 0x01269cb4, 0x03e7df86, 0x00030cd8, 0x01f2445d, 0x02f256e3, 0x01557345, 0x02203749, 0x015b95dc, 0x003ad090}}}, + {X: Field{[10]uint32{0x02b34cc6, 0x008c985e, 0x00a12d08, 0x01d9f3cc, 0x00c80c29, 0x00635c4a, 0x03b3f1fd, 0x0357a94f, 0x003e0642, 0x0013c530}}, Y: Field{[10]uint32{0x007e681f, 0x03094be6, 0x01d0225e, 0x033a3a07, 0x00b9de3c, 0x00e98950, 0x013a70f4, 0x03a25319, 0x00a8caa4, 0x001ed4f4}}}, + {X: Field{[10]uint32{0x00953fa9, 0x01655b5b, 0x003db4d0, 0x00a7c2e3, 0x0228ab26, 0x02f46301, 0x01f485d4, 0x024c8ce9, 0x010eaaab, 0x002927b4}}, Y: Field{[10]uint32{0x02fb4c72, 0x00af4891, 0x0181b67b, 0x00d25a38, 0x035ae875, 0x0037f77e, 0x03476c0a, 0x014e6380, 0x0094660f, 0x00331cae}}}, + {X: Field{[10]uint32{0x0241d90d, 0x01dc4044, 0x004f8342, 0x01076c91, 0x03e81cf1, 0x03b774d8, 0x01436095, 0x027b4750, 0x007e49c7, 0x0029d36e}}, Y: Field{[10]uint32{0x037adad4, 0x01462e0f, 0x02313f32, 0x024d1282, 0x00a9ee50, 0x02205c72, 0x03dd08a5, 0x03bbcc9f, 0x01cdaf23, 0x003de1a4}}}, + {X: Field{[10]uint32{0x03ff8359, 0x022c1810, 0x03651604, 0x00771979, 0x0046b482, 0x00876805, 0x01282b5c, 0x03494edf, 0x03629f7b, 0x0028adec}}, Y: Field{[10]uint32{0x0286fec2, 0x025ffb3f, 0x03835a23, 0x00d411bc, 0x0110d108, 0x01c78a72, 0x02937a3f, 0x0048b55e, 0x00941695, 0x001a4c0e}}}, + {X: Field{[10]uint32{0x01c1ae1f, 0x0332888c, 0x000b2a5e, 0x031a2b35, 0x00456e58, 0x02e8d596, 0x00dcd44e, 0x028b3e6b, 0x025744ba, 0x001a407e}}, Y: Field{[10]uint32{0x022838b0, 0x00cc1974, 0x03a930f8, 0x0297971d, 0x01d79f3b, 0x00a72403, 0x01b5380c, 0x03084918, 0x00882273, 0x000d7797}}}, + {X: Field{[10]uint32{0x01f1f366, 0x002404e6, 0x036be34f, 0x01e8f401, 0x004a7905, 0x01265364, 0x015f216b, 0x01fdee92, 0x025c5da4, 0x001744d3}}, Y: Field{[10]uint32{0x00990f2c, 0x0034fa71, 0x00b39e2b, 0x005882a2, 0x03cf02d6, 0x00ea0adc, 0x03e2a4ae, 0x011410b6, 0x034d3e08, 0x0000ec7b}}}, + {X: Field{[10]uint32{0x027a4bdb, 0x00c4206c, 0x00cac4b0, 0x0010d525, 0x01046a6d, 0x006ee8d7, 0x004b643f, 0x02049e89, 0x002d1d43, 0x00234f36}}, Y: Field{[10]uint32{0x029a8a2c, 0x00d31f39, 0x01296c3d, 0x01f4dc2b, 0x02d4e380, 0x001d88db, 0x00fbf9d0, 0x0107d1c3, 0x016180ee, 0x0026f509}}}, + {X: Field{[10]uint32{0x03a1d916, 0x025b4ff9, 0x01f3a3c0, 0x00e5747c, 0x00315b0a, 0x0176ec1c, 0x006158a6, 0x027432eb, 0x01acb6d5, 0x001943be}}, Y: Field{[10]uint32{0x0068387b, 0x0127299c, 0x026ba858, 0x00229db0, 0x0158bb46, 0x01e6e0b1, 0x029c0b92, 0x02c461c3, 0x01f21162, 0x00021744}}}, + {X: Field{[10]uint32{0x00ec1d2d, 0x0334f1ad, 0x00f45440, 0x0171b9f6, 0x03d9099f, 0x019eda47, 0x029d6729, 0x011ce6bf, 0x0363d606, 0x003abe60}}, Y: Field{[10]uint32{0x00838452, 0x039d5813, 0x00b53fcf, 0x01515fa1, 0x02a9f52d, 0x01ac666a, 0x01228a0e, 0x023489dd, 0x003a7fe7, 0x00394606}}}, + {X: Field{[10]uint32{0x03d98ee1, 0x0323a022, 0x012bed42, 0x01ea4226, 0x03579df3, 0x023ee865, 0x027c924a, 0x00860ffa, 0x02ce0ceb, 0x00075dc2}}, Y: Field{[10]uint32{0x0138ffca, 0x02e05e47, 0x017ecf9f, 0x029038f5, 0x0237f61c, 0x01954aa1, 0x0163038b, 0x03d779e2, 0x0005f46e, 0x0009e3e2}}}, + {X: Field{[10]uint32{0x005ae767, 0x00d6fdc1, 0x0371cbcb, 0x032e7a25, 0x00c273a9, 0x0301b976, 0x0340e052, 0x02d8d19b, 0x01163aed, 0x003ee56f}}, Y: Field{[10]uint32{0x03bf0e11, 0x00fa82be, 0x03134185, 0x01c62967, 0x03b816f4, 0x01a089d6, 0x0004d9d3, 0x0376f148, 0x00d811a8, 0x00199305}}}, + {X: Field{[10]uint32{0x01ec6cb1, 0x02a5e2f0, 0x003de33f, 0x01f60216, 0x00feed65, 0x01bff28f, 0x027be4be, 0x027372cd, 0x011d9104, 0x003699ea}}, Y: Field{[10]uint32{0x0268be1d, 0x03aa389e, 0x000a17e9, 0x031423dd, 0x01dec7ad, 0x0325e039, 0x03463f7e, 0x010af107, 0x02354816, 0x0026eb2a}}}, + }, + { + {X: Field{[10]uint32{0x01ec6cb1, 0x02a5e2f0, 0x003de33f, 0x01f60216, 0x00feed65, 0x01bff28f, 0x027be4be, 0x027372cd, 0x011d9104, 0x003699ea}}, Y: Field{[10]uint32{0x0268be1d, 0x03aa389e, 0x000a17e9, 0x031423dd, 0x01dec7ad, 0x0325e039, 0x03463f7e, 0x010af107, 0x02354816, 0x0026eb2a}}}, + {X: Field{[10]uint32{0x03e741c9, 0x00f32087, 0x01a835ee, 0x00d733a9, 0x018bbd9f, 0x03c0361c, 0x00c0cfaa, 0x03bd61f0, 0x01365fa1, 0x00136eb3}}, Y: Field{[10]uint32{0x038eb623, 0x03843e0c, 0x0135f60b, 0x02827f01, 0x010cc384, 0x020e0a67, 0x01cfd59e, 0x0224b9ff, 0x000e8a51, 0x0005b0d5}}}, + {X: Field{[10]uint32{0x01bc8a44, 0x03741945, 0x011a19ef, 0x01df2f85, 0x03684101, 0x029697f1, 0x00565a4b, 0x03b68f4e, 0x00583cfc, 0x00134060}}, Y: Field{[10]uint32{0x02dbc09e, 0x03e53246, 0x01a362f1, 0x011a160b, 0x03969420, 0x01f58e04, 0x029ba800, 0x03d74d9f, 0x02c18cb4, 0x000e8cf1}}}, + {X: Field{[10]uint32{0x00e218da, 0x036a2ead, 0x0205087e, 0x03c549a1, 0x010f4c85, 0x03d07096, 0x00f17d8f, 0x026fbb9a, 0x03c48150, 0x0004f47f}}, Y: Field{[10]uint32{0x03191c19, 0x02d06776, 0x01127e0d, 0x0081b56f, 0x01a4ad01, 0x006dd62f, 0x00b9337b, 0x0258773b, 0x011fa991, 0x0018020e}}}, + {X: Field{[10]uint32{0x01daeb00, 0x02ad4a19, 0x01f76bc1, 0x00933991, 0x015923eb, 0x00edba74, 0x02cb6a27, 0x03e55c20, 0x0107df5c, 0x000bd985}}, Y: Field{[10]uint32{0x033992c0, 0x01d9e260, 0x0308c122, 0x009c6574, 0x006ecdee, 0x00802b74, 0x039537a8, 0x02ccfdbb, 0x02136f52, 0x003f5704}}}, + {X: Field{[10]uint32{0x035b4eb8, 0x0084f924, 0x01a3cf52, 0x03c6ae2d, 0x0207f557, 0x032bcb73, 0x03f54a3c, 0x00895bc3, 0x00e43adf, 0x0030465a}}, Y: Field{[10]uint32{0x03911add, 0x01265b5b, 0x0149b704, 0x02504a9c, 0x0242f8b4, 0x019d9be0, 0x039d81fe, 0x01163e0d, 0x02937786, 0x002ffd79}}}, + {X: Field{[10]uint32{0x016aa6d9, 0x02a42824, 0x02dcf182, 0x02d91dc0, 0x003662c8, 0x0060d68e, 0x00f174da, 0x011f4895, 0x017d05fe, 0x003d6504}}, Y: Field{[10]uint32{0x032e50cf, 0x001a5baf, 0x01b86c7d, 0x0220f9ad, 0x037a9277, 0x00252f3a, 0x025dbdab, 0x006c4b3d, 0x01a56e97, 0x0032a9d8}}}, + {X: Field{[10]uint32{0x02e96db8, 0x02d032a8, 0x01bff133, 0x005b38a7, 0x033cc9d9, 0x016c14ce, 0x019c79c4, 0x018001d9, 0x039cef6c, 0x000866d3}}, Y: Field{[10]uint32{0x013b6bc7, 0x03c069e3, 0x0176527d, 0x0314fa41, 0x02394f8a, 0x000dca9b, 0x0244180c, 0x03bfabd6, 0x0205d959, 0x00093671}}}, + {X: Field{[10]uint32{0x02c6f4c0, 0x0380e55e, 0x01c4ccaa, 0x03a3312f, 0x01da4e8d, 0x01a59c47, 0x021c38be, 0x02737b13, 0x017f1f4d, 0x0003cb53}}, Y: Field{[10]uint32{0x02339b58, 0x01eeeb5c, 0x02656e7e, 0x029e4090, 0x028f6a10, 0x00e079c7, 0x03b27fdf, 0x0379345f, 0x03857e93, 0x000fb227}}}, + {X: Field{[10]uint32{0x00284327, 0x0347e6bd, 0x02facc56, 0x02c0e0e9, 0x03ac4020, 0x001a8d05, 0x003ebdd8, 0x02d17375, 0x00bdcd64, 0x0003da10}}, Y: Field{[10]uint32{0x01e2ab72, 0x0349d691, 0x01eb7400, 0x029dc4ae, 0x03b68dab, 0x02d8452b, 0x01e8bff4, 0x0069dd25, 0x037f100f, 0x003cc134}}}, + {X: Field{[10]uint32{0x03428cb2, 0x01414ff7, 0x02b55d85, 0x03f59a88, 0x01233822, 0x0256343c, 0x037a1815, 0x012ef47a, 0x02c2e2a1, 0x00075773}}, Y: Field{[10]uint32{0x015b189b, 0x03b44022, 0x004a51e5, 0x00be1d81, 0x00bd3e91, 0x021bc2e2, 0x00787824, 0x03231434, 0x0083b142, 0x001b9710}}}, + {X: Field{[10]uint32{0x01dffc96, 0x02e84256, 0x01857295, 0x0296beb1, 0x019228cd, 0x0205fac0, 0x039b395c, 0x00f7abdb, 0x00bee148, 0x0005871b}}, Y: Field{[10]uint32{0x03492de4, 0x02f3d846, 0x00621c93, 0x0324babe, 0x019b9634, 0x032c60c1, 0x01259391, 0x03fe616f, 0x0292a6b9, 0x002289b2}}}, + {X: Field{[10]uint32{0x00381273, 0x03aa23ea, 0x01ae5fb0, 0x02581a4f, 0x02d84376, 0x031049b3, 0x01ea9b2c, 0x019d0e7f, 0x02fd3009, 0x00227668}}, Y: Field{[10]uint32{0x0309773d, 0x03acfbb4, 0x03324a03, 0x0202b449, 0x018f61d6, 0x01b3d8bd, 0x03aaf207, 0x01bd40dd, 0x01b451d6, 0x0037f289}}}, + {X: Field{[10]uint32{0x010a683f, 0x018557e0, 0x031be4cf, 0x00c6fdba, 0x005248bd, 0x00626aa3, 0x02c7285f, 0x035283f9, 0x02cc3f64, 0x001e0f43}}, Y: Field{[10]uint32{0x00f54c4c, 0x019b38b8, 0x01ee9dfd, 0x0221c8e5, 0x02b5de92, 0x01fcb547, 0x02b74572, 0x03d28c05, 0x01029073, 0x0008029b}}}, + {X: Field{[10]uint32{0x01c71d91, 0x00cacb2d, 0x00fd21cc, 0x00b8aa25, 0x0223945e, 0x0056bfb3, 0x02a1c131, 0x002b8714, 0x038783a5, 0x0020c646}}, Y: Field{[10]uint32{0x02148a61, 0x027b0238, 0x005ee70b, 0x0145d411, 0x0217a11f, 0x005f2ba2, 0x006de13d, 0x006dc278, 0x03157380, 0x00382b1f}}}, + {X: Field{[10]uint32{0x0237b7c0, 0x01173306, 0x0069f575, 0x03deec44, 0x01ec08d0, 0x03bc8854, 0x02000935, 0x0133769b, 0x03aa0b33, 0x0014e413}}, Y: Field{[10]uint32{0x022771c8, 0x02c25ac0, 0x034699dc, 0x02078510, 0x00139999, 0x00834f07, 0x009eccac, 0x0041b623, 0x03d0bc80, 0x0016f021}}}, + }, + { + {X: Field{[10]uint32{0x0237b7c0, 0x01173306, 0x0069f575, 0x03deec44, 0x01ec08d0, 0x03bc8854, 0x02000935, 0x0133769b, 0x03aa0b33, 0x0014e413}}, Y: Field{[10]uint32{0x022771c8, 0x02c25ac0, 0x034699dc, 0x02078510, 0x00139999, 0x00834f07, 0x009eccac, 0x0041b623, 0x03d0bc80, 0x0016f021}}}, + {X: Field{[10]uint32{0x00a47ca9, 0x0343c7ce, 0x005ad57c, 0x02aab43e, 0x012a6ee7, 0x00c5a657, 0x03991196, 0x0119d4f3, 0x01af9d41, 0x0000695d}}, Y: Field{[10]uint32{0x03ebcdb7, 0x0177cb9d, 0x03ea667c, 0x01767d35, 0x00bdb93c, 0x006ee1a6, 0x015fc52e, 0x00370f31, 0x01cb8ab2, 0x000c0e3c}}}, + {X: Field{[10]uint32{0x00a2050e, 0x0310bf92, 0x00a6771a, 0x015d857e, 0x01742ef5, 0x0391e6e2, 0x03769cc6, 0x01cc625a, 0x00fd24bc, 0x0019cdc9}}, Y: Field{[10]uint32{0x021d3d70, 0x03269241, 0x01cc2b90, 0x03f50cd2, 0x01be6bac, 0x02a21adb, 0x03482c09, 0x01288080, 0x0257896a, 0x003933e0}}}, + {X: Field{[10]uint32{0x0315565b, 0x0275d578, 0x00c6ee30, 0x020f4f08, 0x02d3a61a, 0x01d85575, 0x031f5c1b, 0x0350e729, 0x00437621, 0x003d7c38}}, Y: Field{[10]uint32{0x012ecc82, 0x010c2bf7, 0x0240a678, 0x02fcfb5f, 0x02a5bf61, 0x037dc406, 0x02189160, 0x0014afd8, 0x0262be5a, 0x001ae7d3}}}, + {X: Field{[10]uint32{0x02de63bf, 0x01b920e0, 0x01c66cbf, 0x00ca1c98, 0x00e03af5, 0x03d859aa, 0x0198a631, 0x0130c279, 0x03a472df, 0x0010d9bb}}, Y: Field{[10]uint32{0x017924cd, 0x01a90238, 0x02d6b02c, 0x01496aa9, 0x02f33b0c, 0x00c09a3a, 0x022537e1, 0x035f38bb, 0x0109bee2, 0x000b9f76}}}, + {X: Field{[10]uint32{0x01a78179, 0x03d807ea, 0x02afe34c, 0x00149835, 0x036b50e9, 0x00827b67, 0x01a47336, 0x02e37241, 0x03f37081, 0x00265729}}, Y: Field{[10]uint32{0x03ec1f47, 0x03eed32b, 0x00e52931, 0x015a6ad9, 0x02bbcc85, 0x0124a18e, 0x0234d880, 0x015cead7, 0x01e95553, 0x00366816}}}, + {X: Field{[10]uint32{0x02f96190, 0x0149ffc1, 0x0125ef10, 0x03a41f25, 0x03d1f02d, 0x019ea9d7, 0x03e55696, 0x02ac7e5e, 0x03627991, 0x001ef5d4}}, Y: Field{[10]uint32{0x03da00f6, 0x005c812a, 0x02695a3d, 0x0170783a, 0x02ce0fcc, 0x010e09f5, 0x02d64749, 0x018c2757, 0x02b3dbba, 0x0020cdbc}}}, + {X: Field{[10]uint32{0x01362d33, 0x01e0767d, 0x03642cbe, 0x00851889, 0x0347cbc9, 0x01c32938, 0x027f36d9, 0x01ba695e, 0x030b6c0b, 0x0023d41b}}, Y: Field{[10]uint32{0x03fa243f, 0x021f4321, 0x00eaf304, 0x01750eee, 0x0048cf92, 0x03c70cda, 0x030c5424, 0x0185c654, 0x015d2afa, 0x0011a7e5}}}, + {X: Field{[10]uint32{0x02ad41ed, 0x0054c555, 0x0352433b, 0x00d7d3c0, 0x020308ac, 0x02463724, 0x023419e8, 0x035706be, 0x027bddaa, 0x0013dfa4}}, Y: Field{[10]uint32{0x02642d57, 0x00d5e19f, 0x0375bdf4, 0x01c53abd, 0x022e7314, 0x00ea3da9, 0x02980df5, 0x022c4154, 0x005156a8, 0x0037f9dd}}}, + {X: Field{[10]uint32{0x025e6618, 0x010e868f, 0x03cb4c18, 0x03d6763f, 0x03166d65, 0x03904918, 0x02017141, 0x01f6fe1f, 0x007338b9, 0x003ef084}}, Y: Field{[10]uint32{0x0230c860, 0x01536808, 0x00cf20ed, 0x00fc772f, 0x017f3c4f, 0x03ce6c47, 0x0160c1a6, 0x025052d2, 0x0059185c, 0x0027e6c2}}}, + {X: Field{[10]uint32{0x03748690, 0x01814499, 0x00b01cfa, 0x0137618c, 0x007d5790, 0x0374cf40, 0x03452b1e, 0x00733252, 0x03867d29, 0x0008d572}}, Y: Field{[10]uint32{0x0089582b, 0x011d4c53, 0x0139147c, 0x01633472, 0x00582868, 0x016a9f16, 0x01b85ec1, 0x0387e3d5, 0x018a5a71, 0x000870bc}}}, + {X: Field{[10]uint32{0x009135d3, 0x02361761, 0x031fc13d, 0x03404b90, 0x0274203c, 0x004c2c5a, 0x00134294, 0x02a16997, 0x03c7ef82, 0x00016502}}, Y: Field{[10]uint32{0x022255d2, 0x035d1465, 0x02391d02, 0x00a32640, 0x02f12863, 0x02ad9a1e, 0x035b0c7a, 0x02ad84bd, 0x0185eb4f, 0x002414de}}}, + {X: Field{[10]uint32{0x02de7f16, 0x03a88582, 0x0028c6da, 0x03a4f2f8, 0x00ae9cba, 0x0309d749, 0x03592ab6, 0x0295b004, 0x025b9b3d, 0x0002d9a0}}, Y: Field{[10]uint32{0x00c56217, 0x01109a12, 0x00d2bd94, 0x0037cf9f, 0x03b7243c, 0x02d5ea5f, 0x03a76ba8, 0x026cffbc, 0x00b818e0, 0x00287ee8}}}, + {X: Field{[10]uint32{0x00d2374d, 0x00c1c059, 0x02b2bc63, 0x025a133f, 0x00dcf38a, 0x02cffda9, 0x025a9f71, 0x03274976, 0x02d8b5e5, 0x0005bba3}}, Y: Field{[10]uint32{0x00865998, 0x016f2d3f, 0x01dd980e, 0x003b9b53, 0x02075513, 0x016dbfd8, 0x026b843e, 0x03c44228, 0x03f0546f, 0x003d4039}}}, + {X: Field{[10]uint32{0x01060d5b, 0x01ac08a6, 0x03a7c290, 0x02c470e8, 0x03904613, 0x027e5472, 0x0109b2fd, 0x0008b2d8, 0x003cf0bd, 0x003d8081}}, Y: Field{[10]uint32{0x02f88f13, 0x01bd42c6, 0x01a3f76f, 0x034adf74, 0x0237aa56, 0x0313defa, 0x01a8f64a, 0x033c6620, 0x0306c1f0, 0x003c0dad}}}, + {X: Field{[10]uint32{0x02d86047, 0x02567d0e, 0x00bcaeff, 0x0010ea6e, 0x0379b53a, 0x0132a419, 0x01cca776, 0x020e9dc6, 0x010bd359, 0x00239ef3}}, Y: Field{[10]uint32{0x0060372a, 0x00011fa1, 0x028b3ea1, 0x00b91ff5, 0x0179e88e, 0x032a5451, 0x00310420, 0x0292ce50, 0x030b2a3d, 0x00042ddd}}}, + }, + { + {X: Field{[10]uint32{0x02d86047, 0x02567d0e, 0x00bcaeff, 0x0010ea6e, 0x0379b53a, 0x0132a419, 0x01cca776, 0x020e9dc6, 0x010bd359, 0x00239ef3}}, Y: Field{[10]uint32{0x0060372a, 0x00011fa1, 0x028b3ea1, 0x00b91ff5, 0x0179e88e, 0x032a5451, 0x00310420, 0x0292ce50, 0x030b2a3d, 0x00042ddd}}}, + {X: Field{[10]uint32{0x013f0351, 0x00a022fc, 0x009e777d, 0x0234f40e, 0x033bc15b, 0x025a5437, 0x010f3199, 0x01ca770d, 0x03aa195e, 0x000cecd6}}, Y: Field{[10]uint32{0x038d7418, 0x0140f332, 0x01b702bc, 0x03bef222, 0x00aa6560, 0x012354af, 0x00640362, 0x02fe1fe5, 0x0185640a, 0x00296280}}}, + {X: Field{[10]uint32{0x001ead4b, 0x0221e681, 0x003c1ffe, 0x03eda46c, 0x023a75ed, 0x02bf9daf, 0x014734ef, 0x00cdfb1c, 0x000c8c8f, 0x002ff243}}, Y: Field{[10]uint32{0x02fedaed, 0x00b1bc21, 0x02e3e745, 0x03fccb82, 0x02fb468e, 0x01410b4d, 0x03a718dd, 0x037b4936, 0x01b1e09c, 0x001ea520}}}, + {X: Field{[10]uint32{0x0014bb36, 0x0371ec91, 0x03ca6d71, 0x00272b5e, 0x0256f6e1, 0x01c7df88, 0x0383ad20, 0x00fe5572, 0x02ae22c9, 0x000dd37b}}, Y: Field{[10]uint32{0x01af734a, 0x016faa63, 0x00321787, 0x018c0395, 0x013828d6, 0x0201bdca, 0x0032c06f, 0x013e6458, 0x01b64fcd, 0x0005c459}}}, + {X: Field{[10]uint32{0x01bb3b3e, 0x01ef41dd, 0x033cb26e, 0x005fbe7d, 0x03507536, 0x030b4fd6, 0x025993e8, 0x02aa9372, 0x011cbe3f, 0x001ccb7c}}, Y: Field{[10]uint32{0x03366693, 0x01df87b5, 0x00436cc5, 0x01b59316, 0x02e69dad, 0x00094e45, 0x03e25584, 0x0265df2d, 0x003ede8f, 0x001fd064}}}, + {X: Field{[10]uint32{0x01b7ad0d, 0x03215bb9, 0x011d3694, 0x01f2a743, 0x0076ee76, 0x01b45b11, 0x010d8a49, 0x0380370b, 0x010dabb5, 0x000e955a}}, Y: Field{[10]uint32{0x02e8c407, 0x0261e42c, 0x01218d6c, 0x022b2b0c, 0x0301cacb, 0x01fbe67c, 0x021fbac9, 0x0195efec, 0x021975a0, 0x0030f8a3}}}, + {X: Field{[10]uint32{0x008dc3b9, 0x016cf062, 0x00c99c5f, 0x0093a5dd, 0x0019a669, 0x0325fbd8, 0x01a8840c, 0x011ed0a3, 0x00b96039, 0x00133825}}, Y: Field{[10]uint32{0x01c0de52, 0x013dedb9, 0x006502c1, 0x008327a8, 0x0216205b, 0x029dab28, 0x03b4d80c, 0x026cfb55, 0x03babf1a, 0x00014e43}}}, + {X: Field{[10]uint32{0x02e7d616, 0x02992b5a, 0x01f0c5e8, 0x03cad8aa, 0x00944dba, 0x016bac37, 0x006e0739, 0x03ab95f1, 0x009c7f3a, 0x0008e030}}, Y: Field{[10]uint32{0x021bbc1a, 0x026f9205, 0x02756009, 0x00523e11, 0x0293af92, 0x01426c26, 0x0198aefd, 0x0255abc5, 0x02193464, 0x001be3a1}}}, + {X: Field{[10]uint32{0x02aafe5a, 0x01d782c2, 0x02edd4c3, 0x02ce9426, 0x00e25470, 0x02c08ff4, 0x018a6a95, 0x019f7a5b, 0x02b76fc6, 0x0026a5a3}}, Y: Field{[10]uint32{0x02d975c0, 0x02ff5093, 0x00cc0ce6, 0x0029979c, 0x02e7b588, 0x03618743, 0x03c66d03, 0x02e8a553, 0x0307a6d3, 0x002afdbe}}}, + {X: Field{[10]uint32{0x03a32402, 0x018b453b, 0x025348d9, 0x0184f19a, 0x025e659c, 0x000e00d3, 0x037db3bb, 0x03aaaf83, 0x02ced74c, 0x00060293}}, Y: Field{[10]uint32{0x00894b4e, 0x00de0371, 0x0118b320, 0x024dff73, 0x01a602c5, 0x013fafa1, 0x03bfc2f2, 0x035f8ab6, 0x015747ba, 0x00126293}}}, + {X: Field{[10]uint32{0x034c6397, 0x0072fe7c, 0x00d09375, 0x02d401d3, 0x0107dd3d, 0x014dac88, 0x00aef802, 0x0186553c, 0x03ed0171, 0x0034f1be}}, Y: Field{[10]uint32{0x00cb3f9c, 0x0323415a, 0x00e00b1f, 0x00224178, 0x028a0c77, 0x00baad91, 0x018394d9, 0x00abc651, 0x02c55e5e, 0x00128374}}}, + {X: Field{[10]uint32{0x01b2df82, 0x0291ec26, 0x00fb1927, 0x00591c41, 0x00ec5e7a, 0x0338cb01, 0x012d18ec, 0x02e4b332, 0x005c62bf, 0x00101699}}, Y: Field{[10]uint32{0x01307dbf, 0x00a0d282, 0x0062b5da, 0x02cb3b71, 0x022ffa9d, 0x008df9c4, 0x00aca61e, 0x025b83d7, 0x0014f44d, 0x002f0f2d}}}, + {X: Field{[10]uint32{0x02c3137e, 0x020964c2, 0x0244619b, 0x018a96bd, 0x03fe925b, 0x02aace54, 0x02f06a76, 0x010ee380, 0x03981292, 0x00132f78}}, Y: Field{[10]uint32{0x02c02fe6, 0x023c573b, 0x02d60c00, 0x02b9623a, 0x00d193a7, 0x02e530dc, 0x0092a134, 0x01856540, 0x00608f13, 0x001b3955}}}, + {X: Field{[10]uint32{0x010ce56e, 0x006788f9, 0x014a3c71, 0x03c35de4, 0x02c8293a, 0x032f9e05, 0x00590fca, 0x006bcf9a, 0x00d3ce53, 0x002a9b71}}, Y: Field{[10]uint32{0x01edd739, 0x03ce8d1f, 0x010a8b9d, 0x036be3dc, 0x03c11984, 0x03997998, 0x01f6edc5, 0x0394a5b8, 0x018fa241, 0x003af1e6}}}, + {X: Field{[10]uint32{0x00fbf84b, 0x008c1b38, 0x00b8a47a, 0x032ef0fc, 0x0303c48f, 0x030533ae, 0x03d9c730, 0x01891ee2, 0x033c82b1, 0x0012e74c}}, Y: Field{[10]uint32{0x036c3c48, 0x03b92d28, 0x035e6239, 0x010f8bd6, 0x036766d5, 0x019e6dfa, 0x0313d982, 0x03054954, 0x03fbe24c, 0x003f5ff1}}}, + {X: Field{[10]uint32{0x01c43862, 0x01078566, 0x026690a8, 0x03c60e5f, 0x0271a7f4, 0x026e06f7, 0x01081868, 0x03fc879b, 0x0134c1cd, 0x000e17bb}}, Y: Field{[10]uint32{0x002e5453, 0x0163f955, 0x01c8cc04, 0x03b0821b, 0x036b304e, 0x027afd15, 0x001de19e, 0x008fd59c, 0x03c3e8ea, 0x000a0efa}}}, + }, + { + {X: Field{[10]uint32{0x01c43862, 0x01078566, 0x026690a8, 0x03c60e5f, 0x0271a7f4, 0x026e06f7, 0x01081868, 0x03fc879b, 0x0134c1cd, 0x000e17bb}}, Y: Field{[10]uint32{0x002e5453, 0x0163f955, 0x01c8cc04, 0x03b0821b, 0x036b304e, 0x027afd15, 0x001de19e, 0x008fd59c, 0x03c3e8ea, 0x000a0efa}}}, + {X: Field{[10]uint32{0x00f2827c, 0x00e89c1e, 0x01ce2dc8, 0x010afbf0, 0x0147c826, 0x0357d9f4, 0x016be134, 0x01520011, 0x02083daf, 0x003dbd88}}, Y: Field{[10]uint32{0x00aaa102, 0x02c82d48, 0x01bf6d15, 0x01d120c8, 0x03e657ca, 0x00d9f3b9, 0x02c5715b, 0x00e83ebc, 0x02817de7, 0x0006f353}}}, + {X: Field{[10]uint32{0x02e2d9b3, 0x034c1aad, 0x0163514b, 0x020c6ce3, 0x0241db92, 0x0273e115, 0x012ea613, 0x00179d78, 0x00f397c7, 0x000668c5}}, Y: Field{[10]uint32{0x03aaaf33, 0x00bb8972, 0x03e56d55, 0x00749012, 0x03a5021d, 0x01fd4a2c, 0x00965f88, 0x00a3748d, 0x00f5dac7, 0x001b2b36}}}, + {X: Field{[10]uint32{0x015adcb6, 0x024c825c, 0x02f369d8, 0x0339f631, 0x01cd91c3, 0x0347f095, 0x030cb3c3, 0x00f78af5, 0x01188f95, 0x003ec9b9}}, Y: Field{[10]uint32{0x00ba68f3, 0x02f28ed6, 0x02b5449d, 0x00c6e2de, 0x0116d2cb, 0x027405da, 0x02846a71, 0x028d3563, 0x00811012, 0x003cf84a}}}, + {X: Field{[10]uint32{0x02f00480, 0x0161fac4, 0x01cee7d8, 0x00128403, 0x01203588, 0x013d9c86, 0x01c98636, 0x036a8d57, 0x014b95a8, 0x0016103b}}, Y: Field{[10]uint32{0x0222cf9e, 0x00b578af, 0x03872159, 0x01514ab8, 0x02ba7522, 0x00577636, 0x0168deaa, 0x03c5041e, 0x026b220b, 0x0019c336}}}, + {X: Field{[10]uint32{0x03a52264, 0x01cdf658, 0x00b3752e, 0x000c5500, 0x03d0adfc, 0x02b9473f, 0x006e2a9a, 0x01ffa6a0, 0x000de818, 0x00217ff7}}, Y: Field{[10]uint32{0x02da2082, 0x01f4a6a0, 0x01d0498c, 0x0324ac5e, 0x00678182, 0x01551c1b, 0x02568f50, 0x0252342f, 0x00187ae2, 0x000ffb8c}}}, + {X: Field{[10]uint32{0x03f54c42, 0x0137ba08, 0x03dc8e48, 0x00f09a68, 0x0145dc1a, 0x03b394c9, 0x0058c1f4, 0x0063ec77, 0x01a53469, 0x0027d5c0}}, Y: Field{[10]uint32{0x03eb6a21, 0x0387124b, 0x02527860, 0x012ac867, 0x0189ee78, 0x01ca6ff7, 0x0395b6b5, 0x02795efe, 0x03b8801d, 0x00339ee3}}}, + {X: Field{[10]uint32{0x00788c1e, 0x0136dd58, 0x011d7ed4, 0x00183a2f, 0x03d18c37, 0x018f3aad, 0x035c6bc7, 0x004cb4a3, 0x025911b9, 0x00226448}}, Y: Field{[10]uint32{0x028f0ef1, 0x031088a3, 0x01e11635, 0x0213f7be, 0x0236969c, 0x026c4dbe, 0x03876355, 0x02b26c9e, 0x01987cc9, 0x0036a2d3}}}, + {X: Field{[10]uint32{0x0122461a, 0x0104cca5, 0x018327e9, 0x00996f1c, 0x00bcb30a, 0x019fbe68, 0x03b87010, 0x0233f006, 0x0169235a, 0x0009fd84}}, Y: Field{[10]uint32{0x03301a2d, 0x0132be71, 0x039446aa, 0x00836a18, 0x00e4981b, 0x01d0a3ba, 0x008c5612, 0x01ab4ba9, 0x01a9900a, 0x003944bc}}}, + {X: Field{[10]uint32{0x02ddd3ac, 0x03662579, 0x006516db, 0x00ce8bc0, 0x037bf8f6, 0x0338b568, 0x012d90d6, 0x00b82561, 0x03e6732a, 0x0025bb94}}, Y: Field{[10]uint32{0x029b6fde, 0x0096cd9c, 0x01c06fbf, 0x025db19b, 0x02ef0d07, 0x03afc783, 0x004c9711, 0x00a7cb63, 0x02eae4b6, 0x000e6e72}}}, + {X: Field{[10]uint32{0x014f36b9, 0x00b26cb4, 0x03390cce, 0x02ed8ee7, 0x012598ca, 0x017d2a60, 0x01bf2f43, 0x03e50498, 0x01856cee, 0x001901de}}, Y: Field{[10]uint32{0x00b4b50a, 0x02c7ba79, 0x02eb2894, 0x01c12673, 0x008cda08, 0x02169edb, 0x010d75fd, 0x01bbebbe, 0x028f44e5, 0x00369864}}}, + {X: Field{[10]uint32{0x02a88c9c, 0x03fd692d, 0x01f069c1, 0x0198c527, 0x02a37b68, 0x01cb2a8a, 0x021d9ac9, 0x0244e62c, 0x0081e547, 0x001e1964}}, Y: Field{[10]uint32{0x01a7d19b, 0x0164d15d, 0x02a155e0, 0x026c0ead, 0x0112cf91, 0x017a0658, 0x028fa722, 0x0034ada7, 0x007792a3, 0x0016688c}}}, + {X: Field{[10]uint32{0x00d6b76f, 0x018f7e65, 0x015dbcef, 0x03eed320, 0x027fe5a9, 0x00277fab, 0x02f708bc, 0x019a7d14, 0x00e31c85, 0x00288dd4}}, Y: Field{[10]uint32{0x01cca8da, 0x024b3323, 0x008d141d, 0x0047f6e1, 0x03e7707c, 0x03504444, 0x032fa3e4, 0x0379b6b0, 0x0314a6e7, 0x003dcce6}}}, + {X: Field{[10]uint32{0x00c13079, 0x0336c4f4, 0x01688d4f, 0x00055374, 0x026f3e5a, 0x036bcc05, 0x01fea76e, 0x003aee02, 0x010b6e1f, 0x001794ad}}, Y: Field{[10]uint32{0x00e1296f, 0x00f1239c, 0x00e1cc10, 0x0344f58f, 0x004a3829, 0x01280fab, 0x02987853, 0x012c326d, 0x02e73a35, 0x000667b7}}}, + {X: Field{[10]uint32{0x00eee475, 0x03a7193f, 0x0382b12e, 0x00a103b5, 0x01ab6ac8, 0x00f2bfd0, 0x013c021f, 0x00de357b, 0x0007a3f2, 0x002efc6b}}, Y: Field{[10]uint32{0x03fe5067, 0x008a8021, 0x001d6846, 0x02250e2d, 0x0324eb9d, 0x01ac57f8, 0x0083cc83, 0x01839842, 0x00deead4, 0x002d2fee}}}, + {X: Field{[10]uint32{0x03fac3a7, 0x01bb61b0, 0x03bc9c60, 0x0129651f, 0x000fddf8, 0x004f7e86, 0x03c73a44, 0x03c6458d, 0x01b803ec, 0x0001be76}}, Y: Field{[10]uint32{0x02842160, 0x0224180e, 0x01002d86, 0x00bd70a0, 0x007ea4dd, 0x03917135, 0x038e2a30, 0x0166e9a6, 0x028e6030, 0x001f2031}}}, + }, + { + {X: Field{[10]uint32{0x03fac3a7, 0x01bb61b0, 0x03bc9c60, 0x0129651f, 0x000fddf8, 0x004f7e86, 0x03c73a44, 0x03c6458d, 0x01b803ec, 0x0001be76}}, Y: Field{[10]uint32{0x02842160, 0x0224180e, 0x01002d86, 0x00bd70a0, 0x007ea4dd, 0x03917135, 0x038e2a30, 0x0166e9a6, 0x028e6030, 0x001f2031}}}, + {X: Field{[10]uint32{0x037fd72d, 0x03489d12, 0x01a175c9, 0x03969f93, 0x01da1745, 0x01120a4e, 0x01c36c28, 0x01047073, 0x02ea252b, 0x002ba1bb}}, Y: Field{[10]uint32{0x02ee38bc, 0x0132de93, 0x03728233, 0x015451cb, 0x018d9211, 0x0227fc3a, 0x02b0ace5, 0x000be58a, 0x03c97073, 0x00067a64}}}, + {X: Field{[10]uint32{0x021ce204, 0x035d7a34, 0x023d524e, 0x0239099d, 0x03b2a725, 0x0329bdcb, 0x0374d859, 0x03193ee0, 0x01d162b3, 0x0010f290}}, Y: Field{[10]uint32{0x034a8f6b, 0x014113a4, 0x02468e52, 0x02ccfa92, 0x039ab6c7, 0x0236e8c7, 0x0250f921, 0x008fe871, 0x0282e370, 0x00373a96}}}, + {X: Field{[10]uint32{0x00169290, 0x011d099f, 0x032ee7a1, 0x01d73cdb, 0x008718be, 0x01b70b12, 0x01d2f8c5, 0x03fd5798, 0x01f90bbf, 0x00089232}}, Y: Field{[10]uint32{0x003ea257, 0x036284a2, 0x02be2369, 0x0008d768, 0x00e16375, 0x010d6e86, 0x006bb55b, 0x03bb5e94, 0x00692d21, 0x003e8165}}}, + {X: Field{[10]uint32{0x03e6efda, 0x033a4b3a, 0x0005964f, 0x03cfe1ca, 0x01922d4f, 0x0216941b, 0x026f7237, 0x00afd6d9, 0x02ef2289, 0x00270f81}}, Y: Field{[10]uint32{0x03aefc7d, 0x0103cca9, 0x03df7df1, 0x01a1ecdb, 0x01d43bc8, 0x03389bf5, 0x030b2d44, 0x0248f62b, 0x01e5e762, 0x0029edc2}}}, + {X: Field{[10]uint32{0x00978583, 0x0290c805, 0x0213f5b3, 0x02bbc185, 0x00cdd6e9, 0x003e4885, 0x03841999, 0x00c4dd25, 0x009b9cf2, 0x000c2afe}}, Y: Field{[10]uint32{0x01c75777, 0x00600d47, 0x004ac446, 0x0288eed6, 0x0063120e, 0x00386ae0, 0x037b4f2d, 0x01d26337, 0x0115477f, 0x0012c0d4}}}, + {X: Field{[10]uint32{0x02c88be2, 0x009ead71, 0x025e2791, 0x008341bb, 0x03ea2c78, 0x020c1dd6, 0x0372759d, 0x003c0cee, 0x02a313e2, 0x00175be2}}, Y: Field{[10]uint32{0x017ad75d, 0x03954fc3, 0x012c2892, 0x023a9afe, 0x00edab6f, 0x02c22f08, 0x01aaf33a, 0x0353a31c, 0x018d8d56, 0x002b712c}}}, + {X: Field{[10]uint32{0x010964e3, 0x036b12ed, 0x02f76fd0, 0x01df7471, 0x00a99f08, 0x02502174, 0x0011b48d, 0x01101d2b, 0x0216e05c, 0x0038469b}}, Y: Field{[10]uint32{0x0282bfc8, 0x03efe2c1, 0x00c6f767, 0x0384e0c6, 0x0017adc6, 0x01bc2bc9, 0x02d5e259, 0x0350c386, 0x025b87a2, 0x0021f581}}}, + {X: Field{[10]uint32{0x02d1b844, 0x024d46e4, 0x02484f28, 0x020b05cf, 0x01c69c03, 0x004e22f1, 0x02b15c3c, 0x00357f21, 0x01c304a6, 0x003d5f4d}}, Y: Field{[10]uint32{0x01266837, 0x02eaef58, 0x01c6a464, 0x0080c245, 0x00700697, 0x027918d3, 0x004d3f5a, 0x03d365e4, 0x019ea98e, 0x001c1fcf}}}, + {X: Field{[10]uint32{0x021f51d3, 0x01c591ec, 0x03df8739, 0x0118b0e7, 0x0011f80d, 0x036842ea, 0x00d419b9, 0x02a5573a, 0x03216726, 0x001a9cfe}}, Y: Field{[10]uint32{0x01224b17, 0x00937669, 0x03774018, 0x011a2d82, 0x022db482, 0x025c844c, 0x02a7d294, 0x03cf09ff, 0x02fca1ed, 0x0013cf3b}}}, + {X: Field{[10]uint32{0x00c7cb09, 0x03401fcf, 0x03435234, 0x01a28746, 0x023bc7eb, 0x00f61c51, 0x016e1fee, 0x025297d6, 0x007a3a65, 0x0004f9d8}}, Y: Field{[10]uint32{0x00079160, 0x01d6a282, 0x036411be, 0x02ed9ad5, 0x0165eae2, 0x02cd0a67, 0x025fdd85, 0x02e2c78c, 0x008de8fb, 0x000a1372}}}, + {X: Field{[10]uint32{0x00288015, 0x00df98fb, 0x019cc39a, 0x014fbb72, 0x024673f8, 0x0016daa9, 0x01fac61a, 0x0379bda0, 0x02aad936, 0x002a8053}}, Y: Field{[10]uint32{0x02c1006f, 0x00539991, 0x00ad9df8, 0x001d0f3b, 0x03ef4b9b, 0x03dec3d8, 0x032a7e43, 0x02fa6b0f, 0x03c04636, 0x000f7a44}}}, + {X: Field{[10]uint32{0x00cdee05, 0x00338496, 0x003b9006, 0x02c85cbb, 0x01a8761f, 0x02c1a407, 0x000250b1, 0x020b9890, 0x03225681, 0x000a6fa8}}, Y: Field{[10]uint32{0x022651c8, 0x0280d669, 0x018e39e4, 0x02db231a, 0x03f9fc31, 0x021c17b1, 0x0009b3fb, 0x02683aa4, 0x01a2690e, 0x001f1036}}}, + {X: Field{[10]uint32{0x011d45f9, 0x02155e3c, 0x026144cf, 0x0379b1e5, 0x02ba4c1c, 0x01f6de5b, 0x022ef2c7, 0x0144ad3a, 0x03d35337, 0x000dabb8}}, Y: Field{[10]uint32{0x00febad4, 0x02eacfdf, 0x036069d3, 0x0342b11c, 0x00004b35, 0x01f263d5, 0x00b95470, 0x018271e7, 0x0235cd69, 0x0032ab76}}}, + {X: Field{[10]uint32{0x02f18ada, 0x01b1d584, 0x01bcc11b, 0x024eef6f, 0x01d460bd, 0x00cf5296, 0x0036faff, 0x02239f67, 0x006d2382, 0x003d485e}}, Y: Field{[10]uint32{0x03953516, 0x01a2bf48, 0x030981dd, 0x028db16f, 0x02aa5ef4, 0x03347475, 0x0026102b, 0x036d5fb3, 0x03bf6038, 0x00381a1b}}}, + {X: Field{[10]uint32{0x02d0e6bd, 0x01f839d0, 0x01e5313b, 0x018f6c3d, 0x03f774d1, 0x00135bb2, 0x022147c1, 0x0138960a, 0x0001243c, 0x000cc8b5}}, Y: Field{[10]uint32{0x0028b2a0, 0x00e8ba5b, 0x03af624f, 0x00fa8a1c, 0x032805f6, 0x0376be6d, 0x03019bc4, 0x013bd6fe, 0x0397e966, 0x0015b9c1}}}, + }, + { + {X: Field{[10]uint32{0x02d0e6bd, 0x01f839d0, 0x01e5313b, 0x018f6c3d, 0x03f774d1, 0x00135bb2, 0x022147c1, 0x0138960a, 0x0001243c, 0x000cc8b5}}, Y: Field{[10]uint32{0x0028b2a0, 0x00e8ba5b, 0x03af624f, 0x00fa8a1c, 0x032805f6, 0x0376be6d, 0x03019bc4, 0x013bd6fe, 0x0397e966, 0x0015b9c1}}}, + {X: Field{[10]uint32{0x00ade462, 0x025b4cb0, 0x00f29fc6, 0x0323ab6f, 0x010d4cdd, 0x01320335, 0x00ef31b0, 0x02f6b848, 0x000250ce, 0x00234988}}, Y: Field{[10]uint32{0x0326470c, 0x002a2e43, 0x00b3ad8e, 0x0139c99e, 0x021d4afb, 0x00fb8dae, 0x01f6f2dc, 0x03d0df4c, 0x03b4715b, 0x003afb4e}}}, + {X: Field{[10]uint32{0x019ab499, 0x0274fc81, 0x00330abd, 0x0271b9cf, 0x000b1329, 0x019fc06f, 0x02196b3c, 0x0016e974, 0x03f3015c, 0x001e2eab}}, Y: Field{[10]uint32{0x02e097fd, 0x0348c63f, 0x01199681, 0x03ba3449, 0x0291632e, 0x0360820b, 0x00a84e0e, 0x0302bebf, 0x00dbdb06, 0x002b52f7}}}, + {X: Field{[10]uint32{0x0116e633, 0x01190f85, 0x01c8b916, 0x00341cb6, 0x038ed493, 0x0165340e, 0x00068a1f, 0x02faa739, 0x00766eae, 0x00048e30}}, Y: Field{[10]uint32{0x037b7805, 0x036dca31, 0x0022805c, 0x00b731d0, 0x03094625, 0x0070f705, 0x00979e2d, 0x004d675b, 0x002dbb27, 0x0022a76c}}}, + {X: Field{[10]uint32{0x0106ace6, 0x00f85b3f, 0x020ca449, 0x00dbe0e8, 0x0223709b, 0x024a6ac6, 0x00b84984, 0x038f5308, 0x0211a14a, 0x001bdc3c}}, Y: Field{[10]uint32{0x0202d5de, 0x02fb4d2d, 0x005ee048, 0x019af96b, 0x00753295, 0x01ee67d4, 0x015d8f34, 0x01edcdbe, 0x02309402, 0x001e47a2}}}, + {X: Field{[10]uint32{0x01cd5379, 0x018ccc29, 0x03cadc30, 0x00e161c2, 0x032db794, 0x02a93488, 0x002481b8, 0x004e0a9e, 0x02d56bdd, 0x0005f01c}}, Y: Field{[10]uint32{0x0108cd25, 0x02b8146c, 0x02d0df7c, 0x01d8996e, 0x038959ac, 0x03c740d3, 0x03c1247a, 0x0281939d, 0x01f4283d, 0x0036406f}}}, + {X: Field{[10]uint32{0x00ee1b40, 0x03b8fb98, 0x02247dc8, 0x016dc7a5, 0x008ced48, 0x0040f335, 0x00949f19, 0x029057e0, 0x01b29d6a, 0x00385667}}, Y: Field{[10]uint32{0x038f93a6, 0x018997b5, 0x0199de1d, 0x01d2f0ca, 0x03a6363a, 0x028bf1f3, 0x02f894aa, 0x035283be, 0x02232a81, 0x001e4cd8}}}, + {X: Field{[10]uint32{0x008e7a66, 0x0005549e, 0x0021619b, 0x00a0ac3b, 0x01cddcd7, 0x029a846e, 0x032ea758, 0x0270579e, 0x030770cb, 0x0009c756}}, Y: Field{[10]uint32{0x003c9727, 0x035c9638, 0x0024e7a8, 0x038d422a, 0x03e2a065, 0x026b21df, 0x017d0994, 0x03d24791, 0x005834e7, 0x00174ea9}}}, + {X: Field{[10]uint32{0x01c00c3e, 0x037e8a12, 0x008e2f81, 0x000f2448, 0x01f00e8f, 0x03514616, 0x02562d33, 0x01a5590d, 0x00970440, 0x002ec2c1}}, Y: Field{[10]uint32{0x01955a35, 0x02a60b44, 0x0090a799, 0x013a4177, 0x02fe6704, 0x02ac6c14, 0x01d2fa17, 0x027d8d95, 0x005853af, 0x001019f9}}}, + {X: Field{[10]uint32{0x00a923b7, 0x03a1f62a, 0x01b30da1, 0x03bb6071, 0x02aef650, 0x020ce099, 0x00708ab6, 0x0269c150, 0x039b2199, 0x002b0ab2}}, Y: Field{[10]uint32{0x03cd20a6, 0x030492b5, 0x03a4fa2d, 0x02fc4b49, 0x0360b0d0, 0x004f67ac, 0x01afa0df, 0x01c93472, 0x028511c1, 0x001da110}}}, + {X: Field{[10]uint32{0x01dd32e6, 0x01d6e701, 0x01ee7e0e, 0x0146d4f9, 0x03c663b5, 0x01d697ef, 0x0249dbe0, 0x01e27a6d, 0x01554195, 0x00371690}}, Y: Field{[10]uint32{0x014a99b9, 0x01f6de9d, 0x01bcf80e, 0x0241db92, 0x002ff2ee, 0x006fd651, 0x00ea5e20, 0x019e9db7, 0x00a63f9f, 0x0012bcea}}}, + {X: Field{[10]uint32{0x022d8dae, 0x00f00632, 0x01ea9579, 0x03e47f49, 0x02ac32a5, 0x032c895b, 0x02b25ef9, 0x024be6e9, 0x00026211, 0x002209c7}}, Y: Field{[10]uint32{0x021e77d9, 0x009b03cf, 0x01099fb4, 0x01b71c5f, 0x00c30087, 0x016afd6b, 0x01c8b3ae, 0x01daa900, 0x01535071, 0x0035c677}}}, + {X: Field{[10]uint32{0x0144e7cb, 0x0116eb11, 0x020359ed, 0x0096d4a5, 0x01a10642, 0x004053a6, 0x03354a57, 0x00ee76f8, 0x01703987, 0x00055b86}}, Y: Field{[10]uint32{0x01250a37, 0x00e4b02b, 0x039cd6d5, 0x02357ad0, 0x009496d5, 0x00e0d2fa, 0x039572a6, 0x0241f6a4, 0x019f8f31, 0x001af023}}}, + {X: Field{[10]uint32{0x0089240f, 0x02eb7267, 0x03b858f5, 0x02ebe8b9, 0x0274f8c4, 0x01f8385d, 0x00ee0919, 0x01cce386, 0x010d652d, 0x00056e0e}}, Y: Field{[10]uint32{0x0326f04a, 0x03e7be38, 0x033352e2, 0x02ad7068, 0x01b30367, 0x01e967e6, 0x03dd7ccc, 0x023420ea, 0x020c8efe, 0x001e1b3c}}}, + {X: Field{[10]uint32{0x019853ca, 0x02f0a731, 0x03f54dbf, 0x01ae7c66, 0x0348e962, 0x0239c584, 0x00a76a22, 0x010e09af, 0x00cecb68, 0x00109a6f}}, Y: Field{[10]uint32{0x01b8d367, 0x0163bd4d, 0x028a3da9, 0x0297e796, 0x01fd3940, 0x010c6902, 0x0084ca9c, 0x005adc8f, 0x001a82c0, 0x003b4ac7}}}, + {X: Field{[10]uint32{0x0134ab83, 0x035d34a0, 0x03397721, 0x026bdd90, 0x00741b3f, 0x0259961a, 0x011770d8, 0x02df68af, 0x007d2de0, 0x002159cb}}, Y: Field{[10]uint32{0x010313a6, 0x00c253de, 0x00f44c8e, 0x03f314a6, 0x01e77f17, 0x0298b0b9, 0x034049bf, 0x02cbad8d, 0x039b5b43, 0x001f1206}}}, + }, + { + {X: Field{[10]uint32{0x0134ab83, 0x035d34a0, 0x03397721, 0x026bdd90, 0x00741b3f, 0x0259961a, 0x011770d8, 0x02df68af, 0x007d2de0, 0x002159cb}}, Y: Field{[10]uint32{0x010313a6, 0x00c253de, 0x00f44c8e, 0x03f314a6, 0x01e77f17, 0x0298b0b9, 0x034049bf, 0x02cbad8d, 0x039b5b43, 0x001f1206}}}, + {X: Field{[10]uint32{0x0317fc25, 0x02e42f07, 0x02d96998, 0x011b7cb9, 0x033b89ea, 0x01722987, 0x00186121, 0x027b00db, 0x036b740f, 0x0014d333}}, Y: Field{[10]uint32{0x03e86e76, 0x031fdbb3, 0x028ddd71, 0x01deff74, 0x010ae3d2, 0x00b550d5, 0x02ae3dd3, 0x00b76d18, 0x00b09c8b, 0x00355c57}}}, + {X: Field{[10]uint32{0x03ba9000, 0x001c8ea0, 0x028b6fdf, 0x0271a097, 0x01c4872f, 0x0210050f, 0x00876075, 0x036305a1, 0x00f9fff1, 0x002b0e1d}}, Y: Field{[10]uint32{0x0310cf0a, 0x00f1f65b, 0x029fa4da, 0x0035fd9b, 0x03085e35, 0x01045fe4, 0x022dde89, 0x0301a6e1, 0x012308a1, 0x002a997a}}}, + {X: Field{[10]uint32{0x00bee8b6, 0x01c248fa, 0x008d2c71, 0x011fb3ef, 0x0179020d, 0x023e2abb, 0x01e14201, 0x02dfcc20, 0x035cee87, 0x002a4747}}, Y: Field{[10]uint32{0x010644c1, 0x0345aa90, 0x03225003, 0x027d8a32, 0x02f80056, 0x0376b4ec, 0x03189c8d, 0x023b8569, 0x024ee2df, 0x001d228c}}}, + {X: Field{[10]uint32{0x0106dbd4, 0x001bd9bb, 0x00d081a6, 0x0215e288, 0x01ec0e3f, 0x0268f9ca, 0x0114075e, 0x01c04e6b, 0x00e7aa68, 0x0015c357}}, Y: Field{[10]uint32{0x011ed495, 0x016fb3af, 0x00bed5a6, 0x01b71918, 0x03b683a3, 0x007406ee, 0x0366e671, 0x000bd816, 0x0349420e, 0x0029ab94}}}, + {X: Field{[10]uint32{0x03ba402e, 0x0358c2c5, 0x02989ae5, 0x0170b410, 0x03c3b81a, 0x021238f0, 0x03ead0c4, 0x0280a962, 0x035cd18f, 0x0023a246}}, Y: Field{[10]uint32{0x00fad9e0, 0x02d89e71, 0x027ee8e1, 0x0090855e, 0x02af650c, 0x013ca8c1, 0x038d0e40, 0x0319a02c, 0x020e6a9e, 0x003974c3}}}, + {X: Field{[10]uint32{0x012d230e, 0x0307e482, 0x03928434, 0x02834a4c, 0x01daee32, 0x000d9bbd, 0x03c229ee, 0x022edbe1, 0x00702826, 0x001d6d7e}}, Y: Field{[10]uint32{0x011570b8, 0x032f7ef5, 0x038fb037, 0x02c01447, 0x020267a4, 0x01377ea3, 0x01787455, 0x02148d8f, 0x0221e3a7, 0x00149f33}}}, + {X: Field{[10]uint32{0x0184cf74, 0x02870956, 0x01f10aa1, 0x0116fbd8, 0x000735ae, 0x00b50e0f, 0x02214dde, 0x0238d706, 0x0023d90c, 0x00305723}}, Y: Field{[10]uint32{0x01ccb000, 0x0123360e, 0x015a2c4a, 0x00b542c0, 0x0247bf77, 0x0097f5ee, 0x01c6f45e, 0x0088d723, 0x00d82852, 0x000aea55}}}, + {X: Field{[10]uint32{0x034fcc0e, 0x01afdab0, 0x0084c47b, 0x0290af8e, 0x00927f10, 0x01f49672, 0x025b80e2, 0x037b0ac2, 0x02fae1ed, 0x00113f23}}, Y: Field{[10]uint32{0x019c420a, 0x03c0c79c, 0x0089d9cf, 0x0292f341, 0x03720e94, 0x020cf4f5, 0x01267e78, 0x004d9f92, 0x0294ba9b, 0x0034b1f7}}}, + {X: Field{[10]uint32{0x0142dea9, 0x004fc3a2, 0x03130584, 0x0232e2df, 0x02ab35a9, 0x0182a1ff, 0x006ad8ba, 0x0176d9e5, 0x02133428, 0x000559a1}}, Y: Field{[10]uint32{0x027be3df, 0x0151bc0d, 0x02dcbf92, 0x01a22c8f, 0x02de4828, 0x02c83f48, 0x02894eff, 0x03c14413, 0x03aa0e82, 0x0013cd65}}}, + {X: Field{[10]uint32{0x03b69991, 0x01207f22, 0x03175d5a, 0x028b0cc1, 0x01fffb3f, 0x0380bd4d, 0x02a16620, 0x01ef1a19, 0x0247bace, 0x0037a8ae}}, Y: Field{[10]uint32{0x016fe2df, 0x01d0aa7c, 0x019bc706, 0x02cd887b, 0x03229dcd, 0x013dee79, 0x01cbfec8, 0x00a392b1, 0x03d6d90c, 0x002b8a2f}}}, + {X: Field{[10]uint32{0x036bcfe8, 0x03b58794, 0x03bb3e61, 0x027b5a6d, 0x020e0c17, 0x001acc66, 0x02ca8f23, 0x02666d1c, 0x00bc1cc6, 0x0004ccbe}}, Y: Field{[10]uint32{0x02e78402, 0x00374b36, 0x0021451b, 0x009356a3, 0x01ba93b4, 0x017701a0, 0x0367c453, 0x00bb5c4f, 0x03ee2960, 0x0030e771}}}, + {X: Field{[10]uint32{0x014fc9cc, 0x01034094, 0x021658c2, 0x02f0a691, 0x0226d00a, 0x012e2a0d, 0x001cf6cc, 0x01a35bbf, 0x0098a6e1, 0x000e5a3f}}, Y: Field{[10]uint32{0x03ad37dd, 0x00e52257, 0x03334019, 0x01dbfe23, 0x011a1465, 0x02ab4cb2, 0x037982d1, 0x0164a048, 0x03d0db4b, 0x001e272e}}}, + {X: Field{[10]uint32{0x00cc84bf, 0x00ebcf85, 0x01f27c02, 0x01b7bae8, 0x0380bf1d, 0x030a9254, 0x00e37159, 0x00205a0c, 0x01364e54, 0x002d775a}}, Y: Field{[10]uint32{0x0374750c, 0x01485f38, 0x01a90c78, 0x037b75ac, 0x01353110, 0x01635051, 0x0118733c, 0x032dadaf, 0x005853c7, 0x0012cdbb}}}, + {X: Field{[10]uint32{0x020c85f1, 0x0308646b, 0x03a250ae, 0x014d80e8, 0x01a6a52e, 0x015e5175, 0x0325df09, 0x01a8a49a, 0x010698e0, 0x001a25a4}}, Y: Field{[10]uint32{0x01c1de21, 0x01208ccb, 0x003922c7, 0x02768354, 0x011f40c1, 0x021175cb, 0x03305c1d, 0x025e495b, 0x03b4b38c, 0x002bbf4f}}}, + {X: Field{[10]uint32{0x00c82a0a, 0x02566bd8, 0x00832ffd, 0x03183d9a, 0x010f9226, 0x006504ec, 0x006c9f19, 0x022291ac, 0x03809b19, 0x0002522f}}, Y: Field{[10]uint32{0x00c8e589, 0x02dfe236, 0x012bed4c, 0x002325f3, 0x006d4dff, 0x0070d063, 0x02b74c5d, 0x01991b71, 0x02856dcb, 0x0014e958}}}, + }, + { + {X: Field{[10]uint32{0x00c82a0a, 0x02566bd8, 0x00832ffd, 0x03183d9a, 0x010f9226, 0x006504ec, 0x006c9f19, 0x022291ac, 0x03809b19, 0x0002522f}}, Y: Field{[10]uint32{0x00c8e589, 0x02dfe236, 0x012bed4c, 0x002325f3, 0x006d4dff, 0x0070d063, 0x02b74c5d, 0x01991b71, 0x02856dcb, 0x0014e958}}}, + {X: Field{[10]uint32{0x028b000a, 0x03ac115f, 0x01e51396, 0x00cc7a09, 0x02ef16c1, 0x00a47c2d, 0x01ce4c66, 0x0164d835, 0x007f372e, 0x0009a54b}}, Y: Field{[10]uint32{0x01ef705a, 0x035007c1, 0x027318c3, 0x023d94f5, 0x02debe39, 0x035a2108, 0x03c893d2, 0x029a218a, 0x024c5800, 0x003d44fa}}}, + {X: Field{[10]uint32{0x00c8ac7f, 0x00bf97ee, 0x02a52728, 0x03b9978a, 0x01641242, 0x0015be12, 0x003396d2, 0x00aef2d7, 0x02fbe382, 0x0026516c}}, Y: Field{[10]uint32{0x01aea3b0, 0x0250e85a, 0x00dfa96d, 0x008fbb6b, 0x01282f7a, 0x02ca3bfd, 0x03db44ff, 0x00a0b581, 0x01824b0f, 0x000fbbfb}}}, + {X: Field{[10]uint32{0x02134f96, 0x0096225d, 0x030e9f10, 0x0195cb5a, 0x03f52119, 0x00c7fc90, 0x032be8b1, 0x0316f6fb, 0x00e6fc23, 0x00318b96}}, Y: Field{[10]uint32{0x014cf97e, 0x01dfb534, 0x01c3e822, 0x00d58dcc, 0x01bcfb85, 0x00c507f1, 0x03d67675, 0x02859e30, 0x027d45b1, 0x0010e5e0}}}, + {X: Field{[10]uint32{0x029e353a, 0x035e78e5, 0x021f6ed1, 0x00214aef, 0x0210a044, 0x0041f57f, 0x01f82227, 0x01c3988d, 0x006b2058, 0x000a8c53}}, Y: Field{[10]uint32{0x01746067, 0x0249b879, 0x018bfc25, 0x02ab6c99, 0x00138a54, 0x02ea86e8, 0x0063e476, 0x009eb069, 0x000bf35a, 0x0005692b}}}, + {X: Field{[10]uint32{0x02fccf64, 0x02926624, 0x0318e3ba, 0x03789604, 0x033bd278, 0x01f2576f, 0x028772c7, 0x018df6c1, 0x015c0eb4, 0x00031f44}}, Y: Field{[10]uint32{0x0078fee0, 0x01b4ecca, 0x0268d53f, 0x020e566b, 0x0148785d, 0x01e2bc51, 0x02424b84, 0x02c111ea, 0x007b1925, 0x0012aa1d}}}, + {X: Field{[10]uint32{0x01b84966, 0x00bd27ba, 0x03ff989e, 0x001b75fc, 0x011b4f41, 0x029adb24, 0x00b6faf3, 0x03f0b526, 0x0100b703, 0x00165669}}, Y: Field{[10]uint32{0x03473a6a, 0x0198c861, 0x0242640a, 0x030233f8, 0x009100dc, 0x03720a9c, 0x00312820, 0x02a25fe5, 0x02741f5c, 0x0000dc39}}}, + {X: Field{[10]uint32{0x03188cbb, 0x01be2002, 0x01e97368, 0x0080201f, 0x00b81c03, 0x005988ac, 0x003329a7, 0x0171d05a, 0x00520eec, 0x00041d18}}, Y: Field{[10]uint32{0x03272124, 0x01ed8d87, 0x03da601d, 0x01d23738, 0x01242e0d, 0x033d5284, 0x0326b9b9, 0x016630d4, 0x00c09a21, 0x002af975}}}, + {X: Field{[10]uint32{0x03c6b173, 0x0326e48a, 0x03feb3b0, 0x00f1fbb4, 0x017dd862, 0x0016d7e7, 0x0160c463, 0x00bfa384, 0x01393722, 0x0027bacc}}, Y: Field{[10]uint32{0x0323a71d, 0x02588365, 0x00c4b953, 0x02fb439c, 0x030ea71a, 0x02ee86b8, 0x02aabfdb, 0x03563654, 0x01e0110e, 0x0038487c}}}, + {X: Field{[10]uint32{0x02d2cf25, 0x03a6f24a, 0x03a94457, 0x0136f249, 0x037ba49b, 0x009ecf0b, 0x011e80ba, 0x02a72c63, 0x029bf3da, 0x00148366}}, Y: Field{[10]uint32{0x0285181f, 0x02db20e8, 0x030c7610, 0x019446fd, 0x022bab0b, 0x012ea5c1, 0x030ae71b, 0x007ab923, 0x009b1027, 0x003949bd}}}, + {X: Field{[10]uint32{0x02c805f3, 0x00910fdf, 0x01591577, 0x01d42766, 0x007de40f, 0x001ba5e2, 0x02bb2388, 0x0063d45b, 0x03e4c7f7, 0x000e7313}}, Y: Field{[10]uint32{0x023c48d3, 0x0068304e, 0x012e4d19, 0x00dcff24, 0x01bbb957, 0x03d0b79f, 0x01e6693c, 0x03e3cc54, 0x032c5a46, 0x003b2c51}}}, + {X: Field{[10]uint32{0x008d5622, 0x02baeb15, 0x03d2e8b5, 0x03bde946, 0x03e1db07, 0x02fcce06, 0x01586a81, 0x0254d68e, 0x011e6168, 0x0017f1b0}}, Y: Field{[10]uint32{0x01ac1683, 0x03610040, 0x03f300d0, 0x00239b1e, 0x030e05ad, 0x000d9eb2, 0x019ba2db, 0x03676e70, 0x02549aa1, 0x00043a03}}}, + {X: Field{[10]uint32{0x0222580e, 0x018bed73, 0x0388793d, 0x025b4b5b, 0x02c71328, 0x0136f534, 0x012ffde6, 0x0371a5a2, 0x007466ec, 0x003e5320}}, Y: Field{[10]uint32{0x0127db82, 0x0148fd9c, 0x01d4e81e, 0x0114c8dc, 0x029887ec, 0x02d6a07d, 0x014bff6a, 0x00896a46, 0x03dc6785, 0x0017a71f}}}, + {X: Field{[10]uint32{0x00a3d8a5, 0x02ad81f0, 0x02f99123, 0x01a115cf, 0x0126d77d, 0x00fb426b, 0x031274a3, 0x035ba4d0, 0x03e5d872, 0x0016a90c}}, Y: Field{[10]uint32{0x013c2ba7, 0x03dfbddb, 0x02ef4fb5, 0x03d4b675, 0x0116475c, 0x01ca2958, 0x02394aec, 0x039e6866, 0x01fc682a, 0x003773a8}}}, + {X: Field{[10]uint32{0x00c4f21f, 0x0102eb44, 0x01a7a6be, 0x0165340f, 0x025024a9, 0x02c66674, 0x0002068d, 0x03458bf3, 0x006c6ad5, 0x0023332e}}, Y: Field{[10]uint32{0x029dfea0, 0x0049ba9c, 0x03e28f7f, 0x02b20992, 0x014b92dc, 0x0321d629, 0x01bef549, 0x00710da6, 0x02586275, 0x0015fe25}}}, + {X: Field{[10]uint32{0x038fd8e8, 0x0336067c, 0x0352acce, 0x0137f1a5, 0x00f1b0e4, 0x000a1cea, 0x0067ce0f, 0x00070d3c, 0x027f4618, 0x00189833}}, Y: Field{[10]uint32{0x02b4ae17, 0x0213a56c, 0x00198c1a, 0x008e0147, 0x03ecd292, 0x01da87bd, 0x03090497, 0x02d5c69f, 0x002b6fa5, 0x002f0b6a}}}, + }, + { + {X: Field{[10]uint32{0x038fd8e8, 0x0336067c, 0x0352acce, 0x0137f1a5, 0x00f1b0e4, 0x000a1cea, 0x0067ce0f, 0x00070d3c, 0x027f4618, 0x00189833}}, Y: Field{[10]uint32{0x02b4ae17, 0x0213a56c, 0x00198c1a, 0x008e0147, 0x03ecd292, 0x01da87bd, 0x03090497, 0x02d5c69f, 0x002b6fa5, 0x002f0b6a}}}, + {X: Field{[10]uint32{0x01477c2d, 0x019d1bcf, 0x0127e076, 0x01465aab, 0x0316e65c, 0x0213c684, 0x008409be, 0x0069cf7b, 0x024748ad, 0x00217636}}, Y: Field{[10]uint32{0x03d1dd70, 0x02605bf1, 0x015a6207, 0x0080cf13, 0x0094b0a0, 0x007bf1ef, 0x02b53653, 0x019a4161, 0x0353665c, 0x00162522}}}, + {X: Field{[10]uint32{0x01136602, 0x02e91950, 0x03a5bbb0, 0x01203678, 0x0138c46f, 0x008ccecf, 0x0058937f, 0x037f0cf4, 0x03280482, 0x0021f449}}, Y: Field{[10]uint32{0x00af6aac, 0x020f1076, 0x03f7c4f6, 0x01d1bf4e, 0x0387a884, 0x03d9dd14, 0x02a276cf, 0x000f7a49, 0x00870a5a, 0x001c7389}}}, + {X: Field{[10]uint32{0x000b80d9, 0x000c4b5b, 0x007f0485, 0x00403f71, 0x024d1e7e, 0x030fb8fb, 0x00892e9c, 0x012e5a30, 0x0166e7ec, 0x00238a9c}}, Y: Field{[10]uint32{0x02b29f50, 0x0187cab5, 0x0349a49c, 0x02235c18, 0x005297b6, 0x005aa752, 0x02dd29b7, 0x02f964b3, 0x03a9ae2c, 0x003ab6c2}}}, + {X: Field{[10]uint32{0x00c5a916, 0x00175cd2, 0x010f25b2, 0x00354d58, 0x013f5c44, 0x02ad52a8, 0x00acc63d, 0x03a5d1ac, 0x013fe261, 0x003f575f}}, Y: Field{[10]uint32{0x02db8bda, 0x02cdec1e, 0x02faab14, 0x0052f73d, 0x03e5d738, 0x0271ed4b, 0x0343ca67, 0x016c1f4a, 0x02d0eeb5, 0x0003760f}}}, + {X: Field{[10]uint32{0x00e74459, 0x028d722c, 0x036dd674, 0x018e1f76, 0x01fef237, 0x004f22a4, 0x00f46587, 0x015a0164, 0x001d4ec0, 0x000a37de}}, Y: Field{[10]uint32{0x035e656f, 0x001f303b, 0x02f0a8de, 0x029406b9, 0x00a3795b, 0x003c89e5, 0x00db1789, 0x003c5f2c, 0x02a66a13, 0x003c5267}}}, + {X: Field{[10]uint32{0x01f7529c, 0x0264258d, 0x011dd45d, 0x0262d6f5, 0x0138765b, 0x034d10e0, 0x02453c32, 0x009848ae, 0x0010981c, 0x00378375}}, Y: Field{[10]uint32{0x00cd88fe, 0x008300b9, 0x0374063c, 0x031a226d, 0x00178924, 0x035e8d5c, 0x02109822, 0x00517e6c, 0x029d10a2, 0x0035c29b}}}, + {X: Field{[10]uint32{0x004561be, 0x007e8f4b, 0x0190f992, 0x03a04d67, 0x00ee4ab2, 0x01e3e254, 0x00366ecd, 0x03d63b72, 0x035842bf, 0x001da6f1}}, Y: Field{[10]uint32{0x00d9685f, 0x0082ffec, 0x033add59, 0x01d9ede1, 0x0341a177, 0x01cfd751, 0x01ce4cef, 0x020eeb23, 0x03362fe7, 0x0012fe05}}}, + {X: Field{[10]uint32{0x00f76d11, 0x00bd234e, 0x015573c8, 0x003efe14, 0x02151100, 0x0270a4a8, 0x005befc3, 0x03d139a7, 0x008ada4c, 0x002c9b08}}, Y: Field{[10]uint32{0x03b7356b, 0x03002c78, 0x0224bdc1, 0x01967609, 0x03050030, 0x0033590c, 0x004e87d9, 0x034cf3c3, 0x00820949, 0x0007c73e}}}, + {X: Field{[10]uint32{0x008e129e, 0x00e76825, 0x01b10312, 0x02cb00a2, 0x032bd1df, 0x0394f0b7, 0x00f8de28, 0x0133debc, 0x00efb7b2, 0x0019b8ff}}, Y: Field{[10]uint32{0x02e7bbea, 0x02f0d80b, 0x03b5172b, 0x027b4694, 0x035fd7d9, 0x0337e032, 0x00b5bf34, 0x0303d966, 0x034fb770, 0x00082fe2}}}, + {X: Field{[10]uint32{0x029e22db, 0x038ec199, 0x00933f94, 0x03d67e72, 0x02ac993f, 0x00630a53, 0x023bd290, 0x03d48e9f, 0x00b8fc7f, 0x003f3ac5}}, Y: Field{[10]uint32{0x002260a1, 0x01cb6c97, 0x03e4cbf5, 0x01e4e93a, 0x00ad550e, 0x0097c249, 0x018a5a75, 0x02e347f3, 0x033a40d6, 0x00192a9a}}}, + {X: Field{[10]uint32{0x01c71143, 0x0367714a, 0x017ea346, 0x02b113c1, 0x012e7ead, 0x0008fe8d, 0x027ccf90, 0x03a840f2, 0x039622bb, 0x0003ad17}}, Y: Field{[10]uint32{0x0370b136, 0x02336882, 0x01bf4c8a, 0x03a9a8ac, 0x03d65969, 0x00078a15, 0x03601f59, 0x02f43d5c, 0x03585838, 0x0014b10b}}}, + {X: Field{[10]uint32{0x038a2755, 0x02105e68, 0x005506f0, 0x01c59527, 0x0253721a, 0x02d41fea, 0x00175774, 0x0172b157, 0x02623ccd, 0x0013a426}}, Y: Field{[10]uint32{0x03cca3de, 0x02927d88, 0x0000caf7, 0x025348a6, 0x03b6cd53, 0x001d5676, 0x03246dd5, 0x00d6bb3b, 0x02878cce, 0x002b95b6}}}, + {X: Field{[10]uint32{0x0007d7c8, 0x0345234f, 0x0232f00c, 0x01d7e0a7, 0x01e0f196, 0x03cf5226, 0x0070411b, 0x02dcf5a1, 0x008ab230, 0x000f3e48}}, Y: Field{[10]uint32{0x024cee08, 0x02a476b6, 0x0059c0c4, 0x032356e3, 0x009d4684, 0x017059c8, 0x02ce6ca6, 0x02197547, 0x024c15af, 0x003780f1}}}, + {X: Field{[10]uint32{0x003ba64d, 0x01625666, 0x015a3a82, 0x01de2316, 0x02bde60f, 0x02e39038, 0x030a145e, 0x01300efe, 0x015c22e0, 0x0030d9d1}}, Y: Field{[10]uint32{0x022181fd, 0x03323e5a, 0x00f14614, 0x02b285de, 0x0342626a, 0x01365931, 0x00e0e6e8, 0x0180cc20, 0x02d069cb, 0x000e9482}}}, + {X: Field{[10]uint32{0x0037fa2d, 0x00f32348, 0x01c43295, 0x03d5d6ff, 0x03043ec8, 0x02efd040, 0x00348414, 0x036350f6, 0x01e0afc1, 0x003940df}}, Y: Field{[10]uint32{0x01755bda, 0x01772107, 0x01f10e0e, 0x000fb120, 0x01bd5f5b, 0x02e642f7, 0x0398d09f, 0x034ed7e7, 0x034baa94, 0x00115c54}}}, + }, + { + {X: Field{[10]uint32{0x0037fa2d, 0x00f32348, 0x01c43295, 0x03d5d6ff, 0x03043ec8, 0x02efd040, 0x00348414, 0x036350f6, 0x01e0afc1, 0x003940df}}, Y: Field{[10]uint32{0x01755bda, 0x01772107, 0x01f10e0e, 0x000fb120, 0x01bd5f5b, 0x02e642f7, 0x0398d09f, 0x034ed7e7, 0x034baa94, 0x00115c54}}}, + {X: Field{[10]uint32{0x023d34ef, 0x00f231e7, 0x02ddb8c6, 0x01f1e4a8, 0x02c3ab21, 0x00b586cf, 0x00b6cf7d, 0x015253d0, 0x01a467fd, 0x00297803}}, Y: Field{[10]uint32{0x037adb4c, 0x0171738b, 0x000acb85, 0x03f9e424, 0x025b60dc, 0x026fd0f4, 0x01726fe9, 0x02155508, 0x01f5e560, 0x000263f9}}}, + {X: Field{[10]uint32{0x037e7775, 0x02a29b85, 0x015f6388, 0x024e23b6, 0x02b5e155, 0x03d4a46b, 0x00543bac, 0x00cf3b96, 0x023aff96, 0x0027625a}}, Y: Field{[10]uint32{0x02056691, 0x03db4eae, 0x0253befc, 0x01fb8a64, 0x01e899cd, 0x0094249f, 0x02964ed7, 0x02fc2e53, 0x01e43f49, 0x0037646a}}}, + {X: Field{[10]uint32{0x03b91252, 0x00dc5835, 0x0172ae67, 0x00b911dd, 0x006d4afd, 0x0326fef1, 0x019f4bb1, 0x00ad00d4, 0x01f5ef3a, 0x002a6505}}, Y: Field{[10]uint32{0x03edc264, 0x00ddeb12, 0x00ddd73a, 0x02b5643d, 0x02899a16, 0x013dbdad, 0x022f10f2, 0x03e12ee7, 0x024cae81, 0x0020b439}}}, + {X: Field{[10]uint32{0x002a3293, 0x0381378f, 0x0076c5fd, 0x01bba40d, 0x015688b8, 0x00a0bd33, 0x02b0a573, 0x00de4b43, 0x00ee7116, 0x0020c9ee}}, Y: Field{[10]uint32{0x020df9bd, 0x02153863, 0x02a416bc, 0x02d3b8c9, 0x0096afda, 0x009e5c21, 0x03b3ea66, 0x02a63862, 0x02266ee0, 0x0001265f}}}, + {X: Field{[10]uint32{0x00904ed3, 0x015fc7a3, 0x01784159, 0x01624161, 0x00df2a74, 0x0049c8e1, 0x03f8e643, 0x00637fe5, 0x002d2db8, 0x000033e3}}, Y: Field{[10]uint32{0x016f77c1, 0x02658ede, 0x02827b00, 0x01e74cbd, 0x0122991d, 0x0146f604, 0x01d5c1bd, 0x03510467, 0x000ea781, 0x002aab40}}}, + {X: Field{[10]uint32{0x0162c042, 0x006c9b11, 0x03b1a242, 0x008d2e37, 0x02092d23, 0x03e6a3b5, 0x016661d8, 0x02c5a25f, 0x02aa2a6d, 0x0016b90a}}, Y: Field{[10]uint32{0x0379269c, 0x017337e3, 0x018dbf90, 0x025441f3, 0x0294e0db, 0x000e2752, 0x01c1ddc6, 0x00147aad, 0x027c05ff, 0x0026764e}}}, + {X: Field{[10]uint32{0x02540f17, 0x01196d9a, 0x0132bd8c, 0x01c17c30, 0x004c750d, 0x023e4d7e, 0x00edde09, 0x0347f1f6, 0x029f9e4f, 0x002d5bd3}}, Y: Field{[10]uint32{0x0200102d, 0x00bf2b80, 0x0285446a, 0x018f2f32, 0x0121d429, 0x00160b47, 0x01c11adf, 0x02a15b4f, 0x013429cc, 0x000cba39}}}, + {X: Field{[10]uint32{0x0285af61, 0x02204a17, 0x02766b34, 0x008b752b, 0x034e8ed7, 0x01b086c3, 0x02eb68ff, 0x0323ad66, 0x02e426a1, 0x0024b08e}}, Y: Field{[10]uint32{0x036a2b09, 0x008d9a70, 0x02fed4e7, 0x020ad8a1, 0x012d23ad, 0x01ce355e, 0x03217d5c, 0x006ed027, 0x008f0155, 0x0010533e}}}, + {X: Field{[10]uint32{0x01e5d1b3, 0x02a92096, 0x02a3e280, 0x0227f5b2, 0x0048c9b7, 0x003f36cc, 0x027e4c6f, 0x0120ef47, 0x0151caf6, 0x000eae94}}, Y: Field{[10]uint32{0x02f30087, 0x02d9e350, 0x02ee6a85, 0x01674b79, 0x01e18463, 0x01f5cb32, 0x024ec804, 0x01474241, 0x0223bff2, 0x0023079c}}}, + {X: Field{[10]uint32{0x03b5eba8, 0x02bc6cb1, 0x02a36ce2, 0x031fe463, 0x022dabed, 0x02be37d0, 0x010f4176, 0x037c4223, 0x008c76af, 0x003fb958}}, Y: Field{[10]uint32{0x010b9b5c, 0x00574da3, 0x014793f5, 0x010afe41, 0x02e380ff, 0x00a1f053, 0x01402f99, 0x0162bec4, 0x019134fe, 0x000e01d6}}}, + {X: Field{[10]uint32{0x00f8cffd, 0x02d66223, 0x01ae61b2, 0x0056de91, 0x01432e6b, 0x01e6f762, 0x01afb88f, 0x02306f51, 0x037f1fe7, 0x00002026}}, Y: Field{[10]uint32{0x01b5f32f, 0x03516863, 0x01f93d91, 0x03eb64ae, 0x0112a340, 0x0394bf72, 0x008c836d, 0x02a18c0a, 0x0022bf41, 0x003e05f8}}}, + {X: Field{[10]uint32{0x0063caf4, 0x00ee92cf, 0x03d5281e, 0x02aca3d4, 0x00a28ff3, 0x018a9abf, 0x02113b4c, 0x019f9882, 0x00eb92e6, 0x0010b951}}, Y: Field{[10]uint32{0x029c29c8, 0x02bb0265, 0x005f1187, 0x01edafbf, 0x0073a50e, 0x01d0579e, 0x01f220c1, 0x0319c7dc, 0x00e0f91c, 0x0027fe15}}}, + {X: Field{[10]uint32{0x03ed9ef9, 0x006417bd, 0x0063d6c6, 0x02803bc3, 0x02ad2ba5, 0x01ff064a, 0x01f78494, 0x03529d07, 0x02ddd352, 0x000cb779}}, Y: Field{[10]uint32{0x031fb871, 0x02e11a00, 0x034b21ab, 0x00de7263, 0x0059ec1b, 0x0356307d, 0x036a4f94, 0x019ef388, 0x03dc3420, 0x0010745e}}}, + {X: Field{[10]uint32{0x020f09a1, 0x00af6617, 0x0328380a, 0x03c6e500, 0x02f0a109, 0x011c03bf, 0x0196ed2a, 0x00b38e0e, 0x03b66553, 0x001ebb60}}, Y: Field{[10]uint32{0x01857d73, 0x036337a1, 0x00a54045, 0x00c03cfd, 0x02d88b2f, 0x0040cb63, 0x01afd0ab, 0x03bdf1f7, 0x005f9a31, 0x003d6e15}}}, + {X: Field{[10]uint32{0x00fce725, 0x019a82b9, 0x005b7258, 0x03471a9b, 0x00e7e8db, 0x03c5dc6d, 0x02a905e8, 0x001eb7d7, 0x02b0f4a2, 0x003818dc}}, Y: Field{[10]uint32{0x02ee31dd, 0x000d3e53, 0x00870b27, 0x01de1c41, 0x00d7484a, 0x03569223, 0x0227bb2a, 0x0233f84a, 0x0174bce1, 0x001ea422}}}, + }, + { + {X: Field{[10]uint32{0x00fce725, 0x019a82b9, 0x005b7258, 0x03471a9b, 0x00e7e8db, 0x03c5dc6d, 0x02a905e8, 0x001eb7d7, 0x02b0f4a2, 0x003818dc}}, Y: Field{[10]uint32{0x02ee31dd, 0x000d3e53, 0x00870b27, 0x01de1c41, 0x00d7484a, 0x03569223, 0x0227bb2a, 0x0233f84a, 0x0174bce1, 0x001ea422}}}, + {X: Field{[10]uint32{0x02d2ff3e, 0x026bb90f, 0x02d3cfe0, 0x036d3b1b, 0x00045ebf, 0x03eb4fcf, 0x00dbd304, 0x01ae3e72, 0x034ca204, 0x0003ab04}}, Y: Field{[10]uint32{0x01210988, 0x0081881f, 0x01376e17, 0x025adfc8, 0x01ac19f6, 0x00ac45e6, 0x03f103bf, 0x026d0916, 0x01be7935, 0x001258c3}}}, + {X: Field{[10]uint32{0x02328d6a, 0x02a06236, 0x0018bdba, 0x00ea56b7, 0x03b24d77, 0x016c23e9, 0x00689918, 0x0138028d, 0x005ba623, 0x003198f0}}, Y: Field{[10]uint32{0x02c9b8c0, 0x002edaaf, 0x039cc23b, 0x03a944af, 0x03dd8551, 0x01d5c4c5, 0x01afdcf2, 0x0070e34e, 0x018d5f72, 0x000ccc7a}}}, + {X: Field{[10]uint32{0x03bfa4dc, 0x01c1b937, 0x01b17476, 0x01e01321, 0x03f5948a, 0x02b6ed07, 0x012119d7, 0x03a8660e, 0x0190731f, 0x00359e21}}, Y: Field{[10]uint32{0x013b5406, 0x02f35aef, 0x0207cca7, 0x03137726, 0x026206f1, 0x008704ea, 0x00ef5c6d, 0x018f1250, 0x00c89d50, 0x000a3aaa}}}, + {X: Field{[10]uint32{0x0196de2f, 0x0072120e, 0x01114bc9, 0x00bb82c9, 0x0177cedf, 0x0283f93a, 0x02b30dee, 0x01a91673, 0x0282dfb8, 0x0034ff09}}, Y: Field{[10]uint32{0x00526f8c, 0x02489075, 0x03f168c4, 0x02637dea, 0x024e59b4, 0x013de076, 0x00b4754d, 0x002863da, 0x0399a45f, 0x00313c37}}}, + {X: Field{[10]uint32{0x02143fb0, 0x00d69958, 0x005dd6dc, 0x020c2f08, 0x03a9fb92, 0x011e6565, 0x03aff339, 0x020de433, 0x001c33af, 0x000a4ab7}}, Y: Field{[10]uint32{0x036ad01c, 0x036d8f38, 0x01d4d8a9, 0x00b5cd7a, 0x02d83e66, 0x03313b3d, 0x031968a0, 0x02d91fcf, 0x021bcee0, 0x00281c99}}}, + {X: Field{[10]uint32{0x03e697ea, 0x03123440, 0x003e85c6, 0x03ee617e, 0x019ce678, 0x028feaf4, 0x00a1fec9, 0x03008df7, 0x0343feb2, 0x00305e92}}, Y: Field{[10]uint32{0x02dc6c87, 0x00ee1f77, 0x002ab0ee, 0x02d5fe7c, 0x0296e1a1, 0x025807eb, 0x02178f71, 0x0165532b, 0x002d55ab, 0x000e4d57}}}, + {X: Field{[10]uint32{0x008ff9b3, 0x017ed039, 0x0301a727, 0x00815666, 0x03c7b1a6, 0x00adc752, 0x03f210f1, 0x01025d2a, 0x00cbd9a0, 0x001a4c3f}}, Y: Field{[10]uint32{0x02e96a4e, 0x036ad7e3, 0x0051acfd, 0x004f92b3, 0x00090f9b, 0x01d7db5e, 0x030fcdb8, 0x0007ab68, 0x0294b947, 0x001fc0ab}}}, + {X: Field{[10]uint32{0x0163da1b, 0x00b0c08c, 0x0231182d, 0x03983e4e, 0x029a0ede, 0x03f047f7, 0x009349d7, 0x0242d1a3, 0x037ca267, 0x0023d862}}, Y: Field{[10]uint32{0x03bdd76e, 0x00c48440, 0x036e7c7f, 0x01a8c926, 0x026450c6, 0x01eb1690, 0x03bda74d, 0x03adbad7, 0x0325f08b, 0x001e08cf}}}, + {X: Field{[10]uint32{0x010cec10, 0x02c26d53, 0x016b084f, 0x03f2ab7b, 0x02ba25f0, 0x00b4f39c, 0x02b0e61b, 0x0079a6ba, 0x029ca332, 0x0013654a}}, Y: Field{[10]uint32{0x03d06932, 0x00dac4ee, 0x014da8ee, 0x037f213d, 0x02ba4aa2, 0x01ed72d3, 0x002aec78, 0x009e7915, 0x004a66dd, 0x002c5e06}}}, + {X: Field{[10]uint32{0x02c8ae90, 0x01643f83, 0x005deee8, 0x024ba2ef, 0x00cfb26b, 0x0320fc6e, 0x02d5b8da, 0x0079bae1, 0x00f15b7a, 0x0025e630}}, Y: Field{[10]uint32{0x012844d3, 0x02b0bab9, 0x008e27a9, 0x016f40c6, 0x02e2e496, 0x03e71cef, 0x02ec9494, 0x00bb4f74, 0x02aa75a4, 0x002e9038}}}, + {X: Field{[10]uint32{0x00b90e0b, 0x03079b0c, 0x00a4589e, 0x00e7ec25, 0x03d6ff1d, 0x02719d6c, 0x01c804a5, 0x019f4ffb, 0x03f9ad54, 0x00290d41}}, Y: Field{[10]uint32{0x021fdc20, 0x0002e64e, 0x01b5a3f0, 0x00d94d66, 0x00dc2a20, 0x0102fa30, 0x02d07ccb, 0x035c6850, 0x01c94c3f, 0x001f23cb}}}, + {X: Field{[10]uint32{0x01d66b7f, 0x0065e3c4, 0x01c8105a, 0x0141461f, 0x017aa692, 0x0224a11d, 0x00f1b90b, 0x00b59d1f, 0x02e3fb5a, 0x003f7e9b}}, Y: Field{[10]uint32{0x00e5178b, 0x023e019e, 0x00de9daa, 0x03744f5e, 0x00d846f9, 0x00f68631, 0x000c1c9a, 0x02636e4f, 0x031e2249, 0x0013673c}}}, + {X: Field{[10]uint32{0x01c0d7ad, 0x01ad6196, 0x0093ab83, 0x036de8ad, 0x011ddb64, 0x01d2799c, 0x0211ca1a, 0x03eeebbf, 0x02cd4b7b, 0x001cac13}}, Y: Field{[10]uint32{0x0323cd97, 0x039bfd19, 0x034fb2ef, 0x01a0771b, 0x0196265d, 0x0364d340, 0x01d452d6, 0x028d633b, 0x03ea0e64, 0x001a196c}}}, + {X: Field{[10]uint32{0x0265bcf0, 0x01d5e124, 0x03d30b80, 0x01e10471, 0x0269ce2b, 0x0073c883, 0x01ea9a46, 0x02790eb7, 0x0238de22, 0x003f5633}}, Y: Field{[10]uint32{0x03996292, 0x039ea73a, 0x00d1df33, 0x03f8a3c7, 0x0387261b, 0x0121793e, 0x0382ab9a, 0x00856f54, 0x01e53763, 0x003ff829}}}, + {X: Field{[10]uint32{0x00559754, 0x035a4234, 0x0358540a, 0x03778a8f, 0x0204b10b, 0x03033808, 0x010bbf9d, 0x03514d63, 0x02715cd5, 0x00084f1e}}, Y: Field{[10]uint32{0x00b458f2, 0x00b09d4d, 0x03eeddff, 0x03d7cda9, 0x00bb4850, 0x0116e864, 0x013ad062, 0x018941c0, 0x010b5ae4, 0x0012db6b}}}, + }, + { + {X: Field{[10]uint32{0x00559754, 0x035a4234, 0x0358540a, 0x03778a8f, 0x0204b10b, 0x03033808, 0x010bbf9d, 0x03514d63, 0x02715cd5, 0x00084f1e}}, Y: Field{[10]uint32{0x00b458f2, 0x00b09d4d, 0x03eeddff, 0x03d7cda9, 0x00bb4850, 0x0116e864, 0x013ad062, 0x018941c0, 0x010b5ae4, 0x0012db6b}}}, + {X: Field{[10]uint32{0x02c87fac, 0x00e25783, 0x03cf0899, 0x01d188b9, 0x020d1ab9, 0x00c8d203, 0x02e9fed8, 0x0269fd9a, 0x008132b4, 0x00071795}}, Y: Field{[10]uint32{0x03c2d4ef, 0x035ecf57, 0x0324c555, 0x03ac9bf8, 0x03a3deac, 0x03530ab4, 0x03959fa1, 0x011a3cae, 0x020f837f, 0x0013ff3d}}}, + {X: Field{[10]uint32{0x0205dccc, 0x03600467, 0x0293e532, 0x03b53066, 0x02ae3fa3, 0x0254f45c, 0x006e096b, 0x0280c255, 0x02e1753d, 0x002e33bd}}, Y: Field{[10]uint32{0x006d5750, 0x012833f3, 0x02813301, 0x030da9ad, 0x01df757f, 0x0134af66, 0x00d4a74e, 0x026efda9, 0x0260a6cc, 0x000c0ae2}}}, + {X: Field{[10]uint32{0x00531dbc, 0x03f2e875, 0x00970e20, 0x0067fb57, 0x021f901c, 0x002ef1f3, 0x036e9421, 0x019a377b, 0x010602c5, 0x001189db}}, Y: Field{[10]uint32{0x0286b8e2, 0x01cc0265, 0x03c99af8, 0x03efff86, 0x01498bad, 0x01c37b66, 0x02922875, 0x01d6e128, 0x0324d44c, 0x000383df}}}, + {X: Field{[10]uint32{0x033bb31a, 0x037fb84d, 0x017b485b, 0x01ad7f6e, 0x01701f7b, 0x03aed7d2, 0x02a0bde2, 0x01ce1780, 0x03e779b4, 0x0000fecc}}, Y: Field{[10]uint32{0x01215c9e, 0x032f9a5f, 0x000d4e34, 0x01db11d9, 0x03c65a7c, 0x02eed5ca, 0x00c161aa, 0x03f8a078, 0x0152548e, 0x003cdab6}}}, + {X: Field{[10]uint32{0x006df50d, 0x03bb405a, 0x012bd0c4, 0x00a871be, 0x00cd5e79, 0x03020818, 0x03d87442, 0x007c0b5b, 0x0230935c, 0x000e95c5}}, Y: Field{[10]uint32{0x0059679b, 0x0162ca3a, 0x01a11d21, 0x007aede0, 0x01e0aaf8, 0x015c2837, 0x02f3ff2e, 0x03ccbd45, 0x0073b599, 0x0021784e}}}, + {X: Field{[10]uint32{0x019a4ab4, 0x01457af7, 0x037c0a5b, 0x0306156e, 0x02717c36, 0x0343de8d, 0x0316f7b4, 0x00f84587, 0x00d109ec, 0x0012c5df}}, Y: Field{[10]uint32{0x035ab6f7, 0x0377f918, 0x01f558aa, 0x0157c5d0, 0x006e37e2, 0x00d89ad2, 0x028f6729, 0x03e997f6, 0x02e9a5e2, 0x000fb259}}}, + {X: Field{[10]uint32{0x022f001d, 0x013bc4d4, 0x01899611, 0x02b371e3, 0x036850e0, 0x030c6458, 0x025eb211, 0x03093d39, 0x00eca7a6, 0x003bfa9a}}, Y: Field{[10]uint32{0x03bc4415, 0x021067dc, 0x00771c12, 0x027ece12, 0x03e41395, 0x00dc6685, 0x0150307a, 0x00f05368, 0x03869d58, 0x002aae11}}}, + {X: Field{[10]uint32{0x001c23a4, 0x01beca6c, 0x01cf56f4, 0x01611e92, 0x01c22a41, 0x026e735d, 0x0203829b, 0x01e81b0a, 0x035206a2, 0x0017a1c0}}, Y: Field{[10]uint32{0x00d986f9, 0x01e65ac4, 0x00fda121, 0x021d2933, 0x01a2171d, 0x038b1b8b, 0x01755d1a, 0x0248879c, 0x004efb9c, 0x0016e599}}}, + {X: Field{[10]uint32{0x0291dc6e, 0x007bc8b0, 0x01fbd8b4, 0x02a537ca, 0x02661fa8, 0x028f8e3c, 0x03136c23, 0x016c9171, 0x0347a3f1, 0x0033c2f7}}, Y: Field{[10]uint32{0x037a8196, 0x00f05136, 0x032a99c7, 0x03f4aed7, 0x02b4fc6c, 0x015e463d, 0x00523b4e, 0x03d44693, 0x001c6e61, 0x000e30b8}}}, + {X: Field{[10]uint32{0x007b0c66, 0x03cd7480, 0x006fb1f3, 0x039195b2, 0x0034a7fe, 0x002b3add, 0x032244f6, 0x01a02911, 0x0301930d, 0x00395170}}, Y: Field{[10]uint32{0x01f2d470, 0x03d5f49c, 0x0239dd87, 0x02386d68, 0x0397e582, 0x02566f2f, 0x01c6fda3, 0x025579f9, 0x000e8c62, 0x00381a8d}}}, + {X: Field{[10]uint32{0x008f7e09, 0x028ad9fe, 0x012cde2a, 0x01e6e9f6, 0x02b3a037, 0x0117702f, 0x00e12e5a, 0x017f2ef6, 0x023d4f20, 0x00179aa1}}, Y: Field{[10]uint32{0x00dfca97, 0x018a19d2, 0x00fe3bbd, 0x00dc8ed3, 0x00a68e50, 0x01a5008d, 0x004a8d1f, 0x023b7f11, 0x02078a38, 0x003095c6}}}, + {X: Field{[10]uint32{0x03648bba, 0x020642e0, 0x007444a5, 0x02c1a70f, 0x0082a0f0, 0x03c06ce6, 0x033ee225, 0x03d60284, 0x02157a54, 0x002ca910}}, Y: Field{[10]uint32{0x00fb6452, 0x03ead280, 0x017bb246, 0x00547270, 0x01c0d855, 0x03ef5f8c, 0x01fbc978, 0x0199867a, 0x03c2b693, 0x003f93d7}}}, + {X: Field{[10]uint32{0x0304ab91, 0x039d78ac, 0x01557679, 0x00650914, 0x0325a40c, 0x02de0470, 0x02383063, 0x00452e29, 0x03ea8fe5, 0x0001e87f}}, Y: Field{[10]uint32{0x0397e554, 0x03d18ed9, 0x01d9d35a, 0x03a86402, 0x01287e5d, 0x00d12965, 0x010437c4, 0x01f151a4, 0x0021b0fd, 0x00384301}}}, + {X: Field{[10]uint32{0x03ab27d0, 0x03748bba, 0x0103fcf6, 0x03e8b114, 0x03f70b41, 0x02365c01, 0x02970191, 0x00e1946e, 0x020f3d45, 0x0006e423}}, Y: Field{[10]uint32{0x00d3d110, 0x0219d790, 0x011b571e, 0x024d61f9, 0x02b5bbca, 0x005f12e6, 0x0357c918, 0x01ad79bc, 0x025eec46, 0x0026db58}}}, + {X: Field{[10]uint32{0x00fbd53c, 0x030e8ec2, 0x02cddf0c, 0x01c2b718, 0x03e2838c, 0x015066a1, 0x03b9352a, 0x02cd3a36, 0x032a7af4, 0x00139f09}}, Y: Field{[10]uint32{0x03dcaae6, 0x00e50605, 0x01d33e0b, 0x0052ffdf, 0x03530b96, 0x037bda06, 0x02fd09f6, 0x002c6385, 0x00766c9d, 0x0005dd27}}}, + }, + { + {X: Field{[10]uint32{0x00fbd53c, 0x030e8ec2, 0x02cddf0c, 0x01c2b718, 0x03e2838c, 0x015066a1, 0x03b9352a, 0x02cd3a36, 0x032a7af4, 0x00139f09}}, Y: Field{[10]uint32{0x03dcaae6, 0x00e50605, 0x01d33e0b, 0x0052ffdf, 0x03530b96, 0x037bda06, 0x02fd09f6, 0x002c6385, 0x00766c9d, 0x0005dd27}}}, + {X: Field{[10]uint32{0x006e1b4d, 0x00879b9f, 0x00790e28, 0x01686fbe, 0x009b11f2, 0x038e1767, 0x00a269f4, 0x02223c9a, 0x03b02696, 0x00226405}}, Y: Field{[10]uint32{0x0014ab2b, 0x02baf6b6, 0x03212009, 0x0303e4ca, 0x02e4e51b, 0x018d62fe, 0x00579833, 0x00d3c2ed, 0x00dab5b3, 0x0010eb8b}}}, + {X: Field{[10]uint32{0x0121b3ff, 0x02611939, 0x0350cee2, 0x005fa6a9, 0x01233c07, 0x026b8929, 0x0244d2be, 0x011571d7, 0x023010c9, 0x00009213}}, Y: Field{[10]uint32{0x0269da7e, 0x02b92e40, 0x008bbcc1, 0x037a48eb, 0x03ad7006, 0x02cb43ba, 0x02c2b3c2, 0x038c341f, 0x00a0aa23, 0x00258674}}}, + {X: Field{[10]uint32{0x025f712f, 0x018d685f, 0x003a8af2, 0x02fe46d6, 0x022831f5, 0x00c89fc3, 0x034728e6, 0x017f52a3, 0x00f76e90, 0x0019fd91}}, Y: Field{[10]uint32{0x007160e5, 0x02b2d79c, 0x02198d68, 0x0223df4d, 0x005e0e14, 0x0161b3de, 0x01adeb7b, 0x017413c1, 0x028f6644, 0x002e0cf5}}}, + {X: Field{[10]uint32{0x004ba7b9, 0x02de7ea0, 0x01751f96, 0x01c0c1d0, 0x0220d6a4, 0x01cb2553, 0x039b70d6, 0x03395fbd, 0x0126cfb6, 0x0005b071}}, Y: Field{[10]uint32{0x005bd741, 0x02f8e947, 0x029cc475, 0x0006f726, 0x02ec755c, 0x0322a537, 0x02627459, 0x0050e418, 0x037c3403, 0x0036c55f}}}, + {X: Field{[10]uint32{0x00692fd1, 0x01825850, 0x00dfe2b2, 0x01b32f64, 0x02dcf43c, 0x02c7c643, 0x00aadef4, 0x03fe0038, 0x00b49901, 0x001394f2}}, Y: Field{[10]uint32{0x028625e0, 0x024c39cc, 0x01753934, 0x03695ff2, 0x01a87a50, 0x01c86768, 0x02cd709a, 0x02807861, 0x024f4d41, 0x00375b8f}}}, + {X: Field{[10]uint32{0x036683fa, 0x01921ea8, 0x00825e83, 0x014e03b0, 0x0295821b, 0x01149ed9, 0x0289ce77, 0x00c6be1e, 0x00d753f9, 0x0000e5cf}}, Y: Field{[10]uint32{0x034a577f, 0x03ecaddf, 0x001dedf5, 0x03863fa6, 0x00d77884, 0x00ad689b, 0x03e12b63, 0x028e8d90, 0x022cc30c, 0x000e33d6}}}, + {X: Field{[10]uint32{0x0389a762, 0x0098fb4e, 0x02b8dc10, 0x00c04bb9, 0x02930dc9, 0x01a2d1c4, 0x000a0549, 0x009557ea, 0x036c9365, 0x000c9fe1}}, Y: Field{[10]uint32{0x01203301, 0x03f6566e, 0x03dfe9c9, 0x01c3faf5, 0x01755350, 0x038665ee, 0x01969255, 0x01009ac2, 0x00eab352, 0x002cb501}}}, + {X: Field{[10]uint32{0x00bf6f06, 0x02ce6670, 0x03b57180, 0x00c89410, 0x01713c13, 0x000815d9, 0x02c04f4b, 0x03c54470, 0x03ba72ec, 0x002e9aa6}}, Y: Field{[10]uint32{0x001db551, 0x02fbdc1e, 0x03aafe32, 0x03deb1a5, 0x029e5d14, 0x01562f63, 0x0020bf2e, 0x0046c0c8, 0x0238b34a, 0x0004ddc7}}}, + {X: Field{[10]uint32{0x01637b39, 0x03c46655, 0x01fa2799, 0x02617b1d, 0x026c52b9, 0x0300c05a, 0x015b9286, 0x02b1730f, 0x01da6b99, 0x00033cf1}}, Y: Field{[10]uint32{0x02852a40, 0x01e8f5e8, 0x01c3cd24, 0x00148f09, 0x0137acd3, 0x00600929, 0x00671adc, 0x026d904d, 0x012fd9f3, 0x0000b3ed}}}, + {X: Field{[10]uint32{0x01231a43, 0x03be7c1c, 0x003b9fd1, 0x035996b5, 0x0344d514, 0x0137910b, 0x02ed9506, 0x01374b62, 0x00cc27cc, 0x000d716f}}, Y: Field{[10]uint32{0x0220c8f6, 0x01cb9145, 0x030ae7db, 0x033018f3, 0x014cf7a4, 0x01be9627, 0x00e5820b, 0x011b39cd, 0x01723b97, 0x00038d9d}}}, + {X: Field{[10]uint32{0x0149827b, 0x038d5f6d, 0x03d6148c, 0x03cf8486, 0x01fcc4f7, 0x038b38c4, 0x0212e06d, 0x01d7cea0, 0x00f5e0d3, 0x003391f4}}, Y: Field{[10]uint32{0x03aed097, 0x032697fb, 0x029df43c, 0x00bfc15d, 0x0329e659, 0x016e6b43, 0x009139fe, 0x00352756, 0x00fb9963, 0x000571a6}}}, + {X: Field{[10]uint32{0x01d40609, 0x002f15bf, 0x00d76bf4, 0x02603607, 0x02c74190, 0x01620d5a, 0x022f12fc, 0x021af284, 0x00245c55, 0x003f51e7}}, Y: Field{[10]uint32{0x0264ca53, 0x00bc4d9a, 0x024739de, 0x035c9872, 0x019113ae, 0x0326107f, 0x00ad7a43, 0x02bfbfcb, 0x03b52694, 0x000c1a73}}}, + {X: Field{[10]uint32{0x0148be00, 0x03f9c55f, 0x03e13b38, 0x03a85a63, 0x03f60682, 0x03e550f1, 0x030e2207, 0x010bcd3a, 0x00bd4a8e, 0x0024c6fe}}, Y: Field{[10]uint32{0x0344f452, 0x01aa44c7, 0x01df5158, 0x01aacccf, 0x026a43ee, 0x00503afb, 0x03388e61, 0x00820f46, 0x03f0489c, 0x003c454e}}}, + {X: Field{[10]uint32{0x03799a7f, 0x01c0bd4a, 0x028424db, 0x03354ee3, 0x004f18b6, 0x03cb1f55, 0x02d8eb9a, 0x036192f7, 0x002a3acc, 0x001b1000}}, Y: Field{[10]uint32{0x03c81e32, 0x03320b34, 0x003f68b5, 0x01320812, 0x01c07abd, 0x0387772f, 0x00b836a0, 0x00d6f9a4, 0x001530b6, 0x002570b7}}}, + {X: Field{[10]uint32{0x00fb27b6, 0x009f8a10, 0x00576324, 0x02caf90c, 0x01c76e3d, 0x005a1aa9, 0x03238ad6, 0x022c6c43, 0x023dbe77, 0x003fa9d3}}, Y: Field{[10]uint32{0x023cb96f, 0x034f6dfc, 0x03b77701, 0x01ae5cfd, 0x03126b59, 0x032dabe4, 0x03674dec, 0x004ca5f3, 0x00db9b0b, 0x001b815a}}}, + }, + { + {X: Field{[10]uint32{0x00fb27b6, 0x009f8a10, 0x00576324, 0x02caf90c, 0x01c76e3d, 0x005a1aa9, 0x03238ad6, 0x022c6c43, 0x023dbe77, 0x003fa9d3}}, Y: Field{[10]uint32{0x023cb96f, 0x034f6dfc, 0x03b77701, 0x01ae5cfd, 0x03126b59, 0x032dabe4, 0x03674dec, 0x004ca5f3, 0x00db9b0b, 0x001b815a}}}, + {X: Field{[10]uint32{0x039756e4, 0x025f2587, 0x030488fd, 0x039778dc, 0x02bb570e, 0x003a3343, 0x00e03d85, 0x0203fc60, 0x01c83042, 0x003b6510}}, Y: Field{[10]uint32{0x033abfae, 0x03827e4f, 0x0298bff0, 0x01d3f937, 0x0209f237, 0x02c4e447, 0x02176128, 0x03e866be, 0x029efe8b, 0x000f6fa7}}}, + {X: Field{[10]uint32{0x02889756, 0x0206ba6f, 0x00bb25dd, 0x0265ec01, 0x03f27b64, 0x01c6267c, 0x02cd97b2, 0x03faa089, 0x03c33211, 0x001d8ba2}}, Y: Field{[10]uint32{0x00a6b774, 0x0096781f, 0x03a5e25e, 0x00c52213, 0x031972db, 0x0260b8d1, 0x03cc4f14, 0x03a5f0f1, 0x00260af3, 0x00300a25}}}, + {X: Field{[10]uint32{0x011cf119, 0x02b40cf5, 0x00d3015b, 0x03613ead, 0x015b10bd, 0x012d21d4, 0x03ed3f62, 0x01f0ff27, 0x018ee67a, 0x000a765a}}, Y: Field{[10]uint32{0x01056339, 0x021d015d, 0x002963c8, 0x003a4e9f, 0x03b89c94, 0x013c725b, 0x03a12540, 0x00ad149d, 0x00517dc8, 0x001ff40b}}}, + {X: Field{[10]uint32{0x0175d2ea, 0x01d7a5c2, 0x028ea26f, 0x03e84053, 0x011e52ac, 0x00c23d2a, 0x019bdbb2, 0x0254d238, 0x0147df60, 0x0037c1df}}, Y: Field{[10]uint32{0x01936f95, 0x030b678c, 0x01277aa3, 0x02e13ef7, 0x008a1ec5, 0x0228949f, 0x008425c9, 0x01fd1093, 0x028800ef, 0x003e185e}}}, + {X: Field{[10]uint32{0x02714560, 0x01602969, 0x006c2875, 0x0009f95b, 0x00247f21, 0x00696a17, 0x007ef64f, 0x034dae75, 0x0275579a, 0x000e2e0a}}, Y: Field{[10]uint32{0x0374299e, 0x021ccd29, 0x02284ada, 0x00efbdc5, 0x017d94f2, 0x00590d16, 0x03f56346, 0x007bd0a2, 0x02976f26, 0x003e7629}}}, + {X: Field{[10]uint32{0x004c92d7, 0x01247eef, 0x011b45b8, 0x01bb950e, 0x0135db4d, 0x00d2c50a, 0x017dea83, 0x03680cb8, 0x01758bd3, 0x0027cf9f}}, Y: Field{[10]uint32{0x014906dd, 0x02eff3ec, 0x021186cb, 0x000f5a53, 0x02452a23, 0x02eac540, 0x0062b21c, 0x0119ad62, 0x001ea77d, 0x003b34a1}}}, + {X: Field{[10]uint32{0x03422491, 0x031114df, 0x00cff467, 0x012a1818, 0x01fd453e, 0x00d6028c, 0x03fb7bd3, 0x024db5bc, 0x03d05013, 0x00049ad5}}, Y: Field{[10]uint32{0x01a3ef84, 0x00c7c667, 0x01347afa, 0x030c2fce, 0x00e148ba, 0x00afcfec, 0x004a3eba, 0x018b0b8f, 0x00130616, 0x003069f7}}}, + {X: Field{[10]uint32{0x02a8c483, 0x0035ccac, 0x00ac35ae, 0x02231410, 0x01174b0c, 0x03be54a0, 0x038c3d22, 0x033e7b70, 0x015d7b5c, 0x0028331e}}, Y: Field{[10]uint32{0x02cc6ba9, 0x019d1564, 0x03605509, 0x006f7da4, 0x006b348f, 0x008c77de, 0x0374fc97, 0x021cfb88, 0x0122f8b3, 0x002af0c0}}}, + {X: Field{[10]uint32{0x02faf403, 0x01588e8e, 0x03576051, 0x03ee5eb5, 0x0338a0ae, 0x02282d6f, 0x00faffac, 0x007d59c3, 0x0179b9e8, 0x00068904}}, Y: Field{[10]uint32{0x00d79a16, 0x02db9039, 0x0360d590, 0x03d05e37, 0x002c8177, 0x02416ddb, 0x03f27493, 0x01030b12, 0x00c0a867, 0x00238728}}}, + {X: Field{[10]uint32{0x01dd3aee, 0x03c6daf1, 0x012f2170, 0x022a3e5b, 0x0213153a, 0x01aa5db2, 0x0222a9ac, 0x031f3383, 0x00a51553, 0x001b4714}}, Y: Field{[10]uint32{0x01f597f7, 0x00d5393f, 0x013adfee, 0x002aa3b5, 0x00851e31, 0x00a1f51d, 0x03272002, 0x037f725d, 0x008e06ab, 0x002bffc5}}}, + {X: Field{[10]uint32{0x03720b26, 0x00bac126, 0x03cd0762, 0x017e6333, 0x0026f283, 0x004e4188, 0x006bbed4, 0x01a3b87d, 0x01ae9ac9, 0x000f8431}}, Y: Field{[10]uint32{0x01d92db5, 0x03a631eb, 0x01e43346, 0x02936f82, 0x00e2ff79, 0x01c8578a, 0x00665b28, 0x0222456a, 0x02cffe42, 0x0031cd71}}}, + {X: Field{[10]uint32{0x00a6d0bb, 0x032a6df9, 0x02fdc678, 0x008bd686, 0x03659d31, 0x02299063, 0x011a6d8a, 0x03e7cfcc, 0x01618b97, 0x001797c7}}, Y: Field{[10]uint32{0x0033eaf9, 0x00e11e44, 0x0253a168, 0x00b941bd, 0x0272555f, 0x0139c876, 0x00f6bcd0, 0x039bdcd6, 0x002b06a7, 0x0035ec54}}}, + {X: Field{[10]uint32{0x01543cb4, 0x020e9f59, 0x00299e00, 0x02db08b4, 0x003c4529, 0x0203aa28, 0x03684d05, 0x02152a2a, 0x03ae9734, 0x001cfe1e}}, Y: Field{[10]uint32{0x00856cdd, 0x03761cb1, 0x02d7a3d2, 0x03d4d5fc, 0x019d5c42, 0x028500a2, 0x03fbfc11, 0x03e1bfba, 0x00f03a87, 0x000df19b}}}, + {X: Field{[10]uint32{0x03005e3f, 0x026d7913, 0x01bd2dda, 0x00c6fb0e, 0x015af68e, 0x03806852, 0x013cb9ac, 0x0109ffff, 0x026b3c16, 0x003e04e2}}, Y: Field{[10]uint32{0x03357eb7, 0x01f8080b, 0x0221342d, 0x02f5552f, 0x01f4ec41, 0x02a972d4, 0x01015e57, 0x03af67e7, 0x033befb4, 0x00329d63}}}, + {X: Field{[10]uint32{0x03bdde39, 0x000a9105, 0x0032952c, 0x01e6dd81, 0x031544e1, 0x02665a34, 0x022570d5, 0x033c3842, 0x0113f677, 0x001db990}}, Y: Field{[10]uint32{0x0101ac01, 0x005d4b46, 0x02032b4b, 0x034ad5b4, 0x035e2a33, 0x01a07c34, 0x03066d70, 0x02573d5d, 0x038dee4e, 0x00324377}}}, + }, + { + {X: Field{[10]uint32{0x03bdde39, 0x000a9105, 0x0032952c, 0x01e6dd81, 0x031544e1, 0x02665a34, 0x022570d5, 0x033c3842, 0x0113f677, 0x001db990}}, Y: Field{[10]uint32{0x0101ac01, 0x005d4b46, 0x02032b4b, 0x034ad5b4, 0x035e2a33, 0x01a07c34, 0x03066d70, 0x02573d5d, 0x038dee4e, 0x00324377}}}, + {X: Field{[10]uint32{0x021187a5, 0x02666a0e, 0x02e691cf, 0x0188b0a6, 0x00005d57, 0x00587204, 0x007c9d88, 0x031cefba, 0x030e9e52, 0x001c2294}}, Y: Field{[10]uint32{0x033db9c0, 0x013c66d1, 0x03e8a58a, 0x00f1b4d4, 0x003ecda7, 0x02db4e0a, 0x01656dcb, 0x02a25fea, 0x0011e1f9, 0x0026e212}}}, + {X: Field{[10]uint32{0x0078ee8d, 0x01424730, 0x019442f0, 0x033941a4, 0x024ebf20, 0x02a6d3fd, 0x03f7263a, 0x02a6f897, 0x03ad859d, 0x00342395}}, Y: Field{[10]uint32{0x01a63e86, 0x01fd370b, 0x02d9de99, 0x033e508b, 0x00123ef7, 0x015f9b7d, 0x02172ee7, 0x02235cb5, 0x03984ab4, 0x00214ba5}}}, + {X: Field{[10]uint32{0x01e4f5be, 0x02c5b1b3, 0x0359e2e1, 0x01b61aca, 0x039f374b, 0x017918b3, 0x03d64839, 0x00ef8866, 0x034fc48b, 0x000673c0}}, Y: Field{[10]uint32{0x03321af2, 0x0054cadb, 0x01c0c0a9, 0x0324fc3c, 0x03ef91d1, 0x02c60651, 0x034be68a, 0x02d19b0e, 0x0306a15a, 0x000a38ca}}}, + {X: Field{[10]uint32{0x029129ec, 0x00519c10, 0x02548159, 0x033c7920, 0x000cae3a, 0x0334c742, 0x018be80e, 0x01349d7d, 0x0085e4d4, 0x001f69b0}}, Y: Field{[10]uint32{0x00d9ff0e, 0x002bb8ab, 0x0186aeb5, 0x02195329, 0x030448c0, 0x024589ef, 0x01d02074, 0x00615d44, 0x006bb9f4, 0x003d2605}}}, + {X: Field{[10]uint32{0x029c22bc, 0x02b950c3, 0x0042fd43, 0x035a46f3, 0x0201da67, 0x026f1ef9, 0x01b3444d, 0x03ac8dd9, 0x02a5e99e, 0x0014cd73}}, Y: Field{[10]uint32{0x03dacb60, 0x03099cb2, 0x0319b3c2, 0x008db287, 0x02c8c30c, 0x0033ae1a, 0x027f080f, 0x01489281, 0x0020769c, 0x000efe34}}}, + {X: Field{[10]uint32{0x01654f22, 0x00f52554, 0x02ee94f8, 0x02508c6a, 0x03b2f7f3, 0x039a7653, 0x03e9001b, 0x02f9b886, 0x00cff5c1, 0x00243424}}, Y: Field{[10]uint32{0x001a43e1, 0x037815d8, 0x038740f5, 0x0194f68f, 0x036dd635, 0x01afdc0c, 0x03f021e0, 0x03d86a54, 0x021d2bac, 0x003355a6}}}, + {X: Field{[10]uint32{0x017cf3e8, 0x02f08274, 0x02219e3a, 0x000d2fa8, 0x02ee93bd, 0x00e5fd5d, 0x0319c2f8, 0x017c35f1, 0x00a078cb, 0x002bdb11}}, Y: Field{[10]uint32{0x0351baea, 0x03741805, 0x01435b8a, 0x03a9f283, 0x03ec362a, 0x032c91b7, 0x01e73153, 0x012cc2be, 0x016fe85d, 0x0001e102}}}, + {X: Field{[10]uint32{0x036b19fa, 0x03bd9471, 0x019d71b6, 0x01b41a20, 0x02d9d6e0, 0x02084a4b, 0x0322c310, 0x0347b31c, 0x00587cf1, 0x003691e6}}, Y: Field{[10]uint32{0x026f5af7, 0x009bbacc, 0x03c206aa, 0x00fa554f, 0x02a67bd1, 0x038595a7, 0x03369077, 0x02bc0745, 0x03789bcc, 0x003aec75}}}, + {X: Field{[10]uint32{0x02569044, 0x03e47b75, 0x02ef96d2, 0x01b3e833, 0x0033c039, 0x017163cc, 0x002bafe9, 0x01894e75, 0x020d6f7d, 0x002a8871}}, Y: Field{[10]uint32{0x02f37766, 0x00931070, 0x00334c19, 0x03044e4a, 0x02ee5aba, 0x0106b7d3, 0x01d26add, 0x01aba9b4, 0x0086fc4e, 0x002cab9a}}}, + {X: Field{[10]uint32{0x01135dbd, 0x00bed96e, 0x0231ecd9, 0x02bce761, 0x00f0c087, 0x00ba625f, 0x017aaf58, 0x03b9ab60, 0x0104a8dd, 0x0038f91d}}, Y: Field{[10]uint32{0x0348045d, 0x01abcf91, 0x01da9690, 0x03fd7b25, 0x02a5a202, 0x00ae0fff, 0x018c8195, 0x031b102e, 0x03f809cb, 0x0024c296}}}, + {X: Field{[10]uint32{0x03f4de54, 0x00798853, 0x002be5bc, 0x0247a74f, 0x00a5cabd, 0x00528a16, 0x034031cf, 0x000a8b0e, 0x00355df2, 0x0015c5b7}}, Y: Field{[10]uint32{0x00100fa5, 0x0293f554, 0x02417d3e, 0x0333411f, 0x01ebf3fe, 0x0264c931, 0x02aa661a, 0x020fce47, 0x00400a5b, 0x002617db}}}, + {X: Field{[10]uint32{0x01ee455f, 0x002e7973, 0x00075cbf, 0x039ba339, 0x02ff67ff, 0x0202f6d2, 0x0345338f, 0x02a6c291, 0x016fe870, 0x001fa319}}, Y: Field{[10]uint32{0x031b9cba, 0x037a6605, 0x02627173, 0x019d1bd1, 0x034aa2d1, 0x0200e94e, 0x03f760f4, 0x01d03ca8, 0x0232ca30, 0x002f7771}}}, + {X: Field{[10]uint32{0x0369b57c, 0x00540365, 0x03c7b1e6, 0x02f0e78b, 0x01da5033, 0x02f8fc13, 0x008f1925, 0x00a0ad4d, 0x01cb592d, 0x0000c194}}, Y: Field{[10]uint32{0x033236e3, 0x00e9417c, 0x038057ff, 0x0061ce7d, 0x03192a4d, 0x0215a0b0, 0x00e2423e, 0x030262b1, 0x0033bb7a, 0x00094822}}}, + {X: Field{[10]uint32{0x0298b59e, 0x025ae6d9, 0x007a4377, 0x009624d1, 0x020a3359, 0x00f8f1c9, 0x02b035ab, 0x017ac56f, 0x01f891a9, 0x000f7e10}}, Y: Field{[10]uint32{0x0392baf5, 0x02399e5a, 0x009f8bcf, 0x01ec8525, 0x027bfc86, 0x00473ce1, 0x002bae8f, 0x02430768, 0x02df98b0, 0x002ce3f9}}}, + {X: Field{[10]uint32{0x03cbb891, 0x0054090a, 0x00bee3ab, 0x010f7c9b, 0x028f7cc6, 0x010fe3e6, 0x0281baa7, 0x02af87a0, 0x016b03b2, 0x0031ce31}}, Y: Field{[10]uint32{0x019a84c3, 0x01cd765a, 0x00fe917e, 0x03bde203, 0x0382314e, 0x032feeee, 0x0318f2ea, 0x03494dfd, 0x0178951a, 0x00224fed}}}, + }, + { + {X: Field{[10]uint32{0x03cbb891, 0x0054090a, 0x00bee3ab, 0x010f7c9b, 0x028f7cc6, 0x010fe3e6, 0x0281baa7, 0x02af87a0, 0x016b03b2, 0x0031ce31}}, Y: Field{[10]uint32{0x019a84c3, 0x01cd765a, 0x00fe917e, 0x03bde203, 0x0382314e, 0x032feeee, 0x0318f2ea, 0x03494dfd, 0x0178951a, 0x00224fed}}}, + {X: Field{[10]uint32{0x0262ab1b, 0x02ac1e11, 0x009e4dda, 0x03a926e3, 0x00647197, 0x00b9eaa5, 0x0332a699, 0x000dd0d6, 0x005ecd7c, 0x00155e21}}, Y: Field{[10]uint32{0x016f3511, 0x03463cc1, 0x024de316, 0x01d1a975, 0x03f653a7, 0x034a9014, 0x026d0a51, 0x038b0f3a, 0x03978b6d, 0x00398741}}}, + {X: Field{[10]uint32{0x0361d58d, 0x02abcce1, 0x00e2f34b, 0x03902358, 0x02ca4c9b, 0x01c837de, 0x02240a35, 0x01851842, 0x0127823f, 0x002e3118}}, Y: Field{[10]uint32{0x011051a4, 0x03a82ea7, 0x03c5b638, 0x01e17841, 0x013f7504, 0x01fcf141, 0x02458f69, 0x038df452, 0x016c5170, 0x0023e7b6}}}, + {X: Field{[10]uint32{0x008b6c29, 0x021a6e25, 0x0196094f, 0x0153f38e, 0x0122f123, 0x03433b33, 0x03fa3bc1, 0x0193312a, 0x003888a3, 0x0011fcce}}, Y: Field{[10]uint32{0x02537ef9, 0x03b84483, 0x014a81ed, 0x025623e6, 0x0118bb49, 0x02d05b1c, 0x00e48675, 0x00a4dc64, 0x028d0f03, 0x001232a6}}}, + {X: Field{[10]uint32{0x010b0040, 0x002cc101, 0x00adc2db, 0x02e7c04d, 0x01f3f47d, 0x03a68d9c, 0x010c993f, 0x01c7de8d, 0x029f7102, 0x0002355b}}, Y: Field{[10]uint32{0x033fd0a1, 0x03899e96, 0x002beb58, 0x01c8385e, 0x01f6d7c4, 0x035e6ca1, 0x03d150a8, 0x026a887f, 0x01aebd0a, 0x00284861}}}, + {X: Field{[10]uint32{0x0166ff40, 0x037a8684, 0x0336da14, 0x012907ff, 0x02caeebf, 0x0392028b, 0x038125d8, 0x0234adf1, 0x00331881, 0x001ac010}}, Y: Field{[10]uint32{0x0171b847, 0x0104c3a7, 0x02de9eb7, 0x03db9fcf, 0x00076883, 0x0242fcbc, 0x00943a05, 0x03eb265a, 0x033ae8aa, 0x00107346}}}, + {X: Field{[10]uint32{0x03573b7f, 0x0158f7c4, 0x02270f56, 0x017b4c2d, 0x03889a1c, 0x02f9968d, 0x0220f977, 0x03398d07, 0x0232d42f, 0x003704fc}}, Y: Field{[10]uint32{0x001f2ba6, 0x03348a13, 0x00b1c42a, 0x01c05d01, 0x02704554, 0x012a429d, 0x03410da8, 0x00d030f1, 0x0280429e, 0x0032426e}}}, + {X: Field{[10]uint32{0x01ff4adb, 0x029b23c1, 0x03768a81, 0x035bf2fb, 0x0214f570, 0x01a9757d, 0x026b4c9c, 0x02e33f91, 0x0334ae41, 0x00303007}}, Y: Field{[10]uint32{0x00351065, 0x03bfdceb, 0x01b85fc4, 0x0345c345, 0x02cdbc43, 0x001d6e33, 0x0137a0b4, 0x01fd71f2, 0x01bee435, 0x0002e13d}}}, + {X: Field{[10]uint32{0x03ae9ceb, 0x03d642e1, 0x02d14b02, 0x03a9c3bc, 0x00226c21, 0x02c8466a, 0x0319565d, 0x01fc1ceb, 0x01e601df, 0x0009700b}}, Y: Field{[10]uint32{0x03c6e275, 0x024344d2, 0x00726470, 0x037c2996, 0x0137c641, 0x03eb4475, 0x0084e0dc, 0x00e0f032, 0x02d2c812, 0x0022a7fa}}}, + {X: Field{[10]uint32{0x032c1a1c, 0x000675e4, 0x01d6e365, 0x006808af, 0x03a2f32b, 0x002d8ee4, 0x0229ea40, 0x032f6cf4, 0x03bc468e, 0x000ea4cb}}, Y: Field{[10]uint32{0x01343540, 0x02a49a5f, 0x028b684a, 0x0055d268, 0x02c0417e, 0x03720742, 0x009547d4, 0x015ea007, 0x00540f34, 0x002b4f60}}}, + {X: Field{[10]uint32{0x005a3c34, 0x00263dbb, 0x009fe1f8, 0x0300a565, 0x00aece82, 0x01eb8f96, 0x02b9f4ca, 0x039273a2, 0x011b2cf8, 0x003fb767}}, Y: Field{[10]uint32{0x013d7714, 0x0152fd38, 0x0029762b, 0x011a66fe, 0x00adaeb5, 0x0323d2c0, 0x03e85312, 0x02e382c2, 0x00c31853, 0x00294b89}}}, + {X: Field{[10]uint32{0x00d6bf1f, 0x00841ae0, 0x03cbb045, 0x00fa6093, 0x0146bd03, 0x01acd1ae, 0x0121e927, 0x02e0f28d, 0x0343451c, 0x0030ccdc}}, Y: Field{[10]uint32{0x00b01f48, 0x0396108f, 0x02162f95, 0x01083899, 0x0198ba36, 0x01cb0c55, 0x01ff31af, 0x00b3684f, 0x01391b81, 0x000bbbfa}}}, + {X: Field{[10]uint32{0x02b6a396, 0x0395346a, 0x020769b4, 0x0246844d, 0x0373021b, 0x03a1222c, 0x02e2d7f5, 0x029230b7, 0x0286bc6e, 0x000f838c}}, Y: Field{[10]uint32{0x0180e27e, 0x00c79236, 0x00f6a2eb, 0x0107cd1a, 0x026ab010, 0x02d14ff1, 0x031fe1de, 0x00de593c, 0x0172fa3b, 0x00329120}}}, + {X: Field{[10]uint32{0x02f027e9, 0x03d31236, 0x0277e27b, 0x036fb951, 0x03d7ca75, 0x01fb5b45, 0x03c7cd53, 0x00f894f0, 0x033d3ea8, 0x001698a1}}, Y: Field{[10]uint32{0x004c68b4, 0x02764161, 0x035fb319, 0x00c27299, 0x03988af4, 0x03b15e90, 0x02409cfe, 0x01abf69d, 0x0079a5bf, 0x003db651}}}, + {X: Field{[10]uint32{0x001023ec, 0x00d6188d, 0x03570aaf, 0x03ddbfb3, 0x035645d8, 0x0260ae6b, 0x002e0200, 0x00b4a126, 0x013080c3, 0x000d12ae}}, Y: Field{[10]uint32{0x021eeb87, 0x02260a47, 0x015d704f, 0x01abf0e6, 0x03fc4e97, 0x02945317, 0x038f2d1e, 0x0118a9cf, 0x03042b24, 0x001b870a}}}, + {X: Field{[10]uint32{0x00f6c14b, 0x03a7d962, 0x01014372, 0x017cea49, 0x03d1d72e, 0x0325ca1d, 0x024c7637, 0x016e0789, 0x026548b6, 0x00362558}}, Y: Field{[10]uint32{0x017d991f, 0x018fb5d7, 0x027e1793, 0x018caec1, 0x0303428d, 0x0230d03a, 0x00ec6081, 0x01fab9ca, 0x0238f2bc, 0x003fafea}}}, + }, + { + {X: Field{[10]uint32{0x00f6c14b, 0x03a7d962, 0x01014372, 0x017cea49, 0x03d1d72e, 0x0325ca1d, 0x024c7637, 0x016e0789, 0x026548b6, 0x00362558}}, Y: Field{[10]uint32{0x017d991f, 0x018fb5d7, 0x027e1793, 0x018caec1, 0x0303428d, 0x0230d03a, 0x00ec6081, 0x01fab9ca, 0x0238f2bc, 0x003fafea}}}, + {X: Field{[10]uint32{0x03078424, 0x02d652dd, 0x00c3fba5, 0x01e83b10, 0x0303ecaf, 0x0000e899, 0x03a43622, 0x00113a28, 0x02ef8971, 0x003f44db}}, Y: Field{[10]uint32{0x0271ddf1, 0x007bbbf1, 0x01fa8cd6, 0x03de28ab, 0x017cf2b1, 0x01717be9, 0x021d191b, 0x014b319e, 0x0034f3c6, 0x0008636a}}}, + {X: Field{[10]uint32{0x0127b756, 0x02a1ffd8, 0x0170480b, 0x0392ae82, 0x0203428b, 0x00182d05, 0x01362da5, 0x03c499cb, 0x002f716d, 0x001b631e}}, Y: Field{[10]uint32{0x03172571, 0x007dd2af, 0x01cca655, 0x0368b5f3, 0x034e3aa6, 0x01b4d36b, 0x019a82d3, 0x02e44451, 0x030896fd, 0x00266bb7}}}, + {X: Field{[10]uint32{0x01b1cb3c, 0x03613b23, 0x0024a5f1, 0x028350fc, 0x021b7003, 0x01d467e1, 0x01cca536, 0x0234503a, 0x029dd963, 0x003667a3}}, Y: Field{[10]uint32{0x038637a7, 0x028a78da, 0x0365cd88, 0x03e3ff21, 0x026286fe, 0x02f3ae9b, 0x005bb321, 0x028e9ea5, 0x01ad1cc0, 0x000db706}}}, + {X: Field{[10]uint32{0x018cf17a, 0x03869cdd, 0x023524de, 0x032e9620, 0x00f1f85d, 0x02d025fe, 0x0059aef1, 0x01eb2a34, 0x02dd95bf, 0x003af2af}}, Y: Field{[10]uint32{0x00aa0ccd, 0x033717d7, 0x0295c446, 0x004b42b3, 0x0310fad2, 0x01f0cb9a, 0x0000a1b6, 0x02e72c0b, 0x020f8f22, 0x0011f4f3}}}, + {X: Field{[10]uint32{0x01a3c43c, 0x012cb154, 0x02258e4c, 0x032a3b3b, 0x000df701, 0x02ab99c5, 0x00c1f2b4, 0x03356d23, 0x029467ca, 0x0015b276}}, Y: Field{[10]uint32{0x00d7c9ed, 0x0362df48, 0x00aa1824, 0x03e4cbb7, 0x0241d40f, 0x0372da14, 0x03c7964d, 0x027b0bcc, 0x02cb42c7, 0x000e351a}}}, + {X: Field{[10]uint32{0x00855c5b, 0x03b9456b, 0x00afbbce, 0x006805f2, 0x00118562, 0x0385ff0a, 0x0331a369, 0x03389114, 0x012e4bd4, 0x003a37d3}}, Y: Field{[10]uint32{0x02465650, 0x0179cb0b, 0x00d7d59d, 0x017c7879, 0x019663b5, 0x027bccb1, 0x004db4f5, 0x026c9911, 0x0170c47f, 0x001b15ff}}}, + {X: Field{[10]uint32{0x00385172, 0x01bda34f, 0x02636fd4, 0x00781103, 0x01d20335, 0x016c2464, 0x03d8a54e, 0x020c5e86, 0x01619a19, 0x0000ff7c}}, Y: Field{[10]uint32{0x00cb9794, 0x0319fc3f, 0x0232b79a, 0x027a439c, 0x015b9b92, 0x03215cdd, 0x0070c7d3, 0x004b0ff9, 0x02c06e5c, 0x00102340}}}, + {X: Field{[10]uint32{0x02e7e454, 0x03d6f694, 0x02150d08, 0x03bc3c39, 0x02fe32ef, 0x02a60598, 0x02486023, 0x02a0ca44, 0x03d718ec, 0x00101a34}}, Y: Field{[10]uint32{0x00ef191e, 0x02b37976, 0x03332779, 0x03b44f0d, 0x01988d21, 0x03674e34, 0x02c14597, 0x011eaae7, 0x03b7254a, 0x00233614}}}, + {X: Field{[10]uint32{0x01d8247e, 0x0307fd4d, 0x011eb400, 0x0309445a, 0x00cd4780, 0x03e82de8, 0x02101f9a, 0x0157395b, 0x01bba2c3, 0x000cfab2}}, Y: Field{[10]uint32{0x033da9bf, 0x005aac2b, 0x0007f372, 0x00dedfa9, 0x0184f8cf, 0x03457bcb, 0x0061f2af, 0x01f10751, 0x0173e4e1, 0x000d65cc}}}, + {X: Field{[10]uint32{0x02c5d939, 0x01eb7e11, 0x033de085, 0x021deea4, 0x02a475a2, 0x0032809f, 0x01bf32e6, 0x009782d5, 0x02cdb1d8, 0x00049543}}, Y: Field{[10]uint32{0x01e757c9, 0x01d3f156, 0x0143192a, 0x007fb363, 0x02838b74, 0x01dc929c, 0x008e43c1, 0x035e9d51, 0x0334f872, 0x001ee3e0}}}, + {X: Field{[10]uint32{0x01f771c8, 0x0092740b, 0x00c87b9e, 0x0047b825, 0x00335a52, 0x0007e1d4, 0x032c2b3c, 0x03240a74, 0x006d922d, 0x002dc795}}, Y: Field{[10]uint32{0x03f48c51, 0x00e89be4, 0x02286245, 0x00ad56ee, 0x0026bd52, 0x0338a23d, 0x0112a4cc, 0x03e401e2, 0x03a8cec9, 0x0039f33b}}}, + {X: Field{[10]uint32{0x02c8a56f, 0x002ab195, 0x0342138d, 0x0150d3cd, 0x0385093c, 0x02beb423, 0x01bb7b53, 0x0217531a, 0x031ac3b5, 0x00251359}}, Y: Field{[10]uint32{0x027be289, 0x01371976, 0x0117eb9f, 0x01d37419, 0x0167d4c1, 0x00ceb186, 0x01439361, 0x007ffd30, 0x01977b50, 0x0029c419}}}, + {X: Field{[10]uint32{0x03194444, 0x01cc24b4, 0x03ea268f, 0x0252ea9f, 0x02850fea, 0x0361e867, 0x02239666, 0x009ae184, 0x0196ba15, 0x003eb3d7}}, Y: Field{[10]uint32{0x00bad676, 0x02fd2211, 0x0100b552, 0x0116e51f, 0x02be72b2, 0x024b76b1, 0x01b77563, 0x0113da4d, 0x007bb8ad, 0x001f3ae4}}}, + {X: Field{[10]uint32{0x0208f15a, 0x02e2862b, 0x0100baee, 0x01b7204a, 0x01fd69e5, 0x02b4f0c1, 0x02b03655, 0x026833f9, 0x0291cd09, 0x0021a953}}, Y: Field{[10]uint32{0x01388308, 0x013479f0, 0x0254d352, 0x00496cd4, 0x0377129d, 0x035d5a19, 0x032a8d06, 0x021180e9, 0x014837a7, 0x0033fb98}}}, + {X: Field{[10]uint32{0x03676e03, 0x01429593, 0x00edd491, 0x00da4fa1, 0x01ceffc7, 0x01c7a1d8, 0x00f64335, 0x01d463ac, 0x00032a95, 0x002e36a5}}, Y: Field{[10]uint32{0x02fdf6e7, 0x023939d3, 0x03b51148, 0x013657fc, 0x0092cc58, 0x018a022c, 0x0099cc97, 0x0287935f, 0x03a44805, 0x000a0137}}}, + }, + { + {X: Field{[10]uint32{0x03676e03, 0x01429593, 0x00edd491, 0x00da4fa1, 0x01ceffc7, 0x01c7a1d8, 0x00f64335, 0x01d463ac, 0x00032a95, 0x002e36a5}}, Y: Field{[10]uint32{0x02fdf6e7, 0x023939d3, 0x03b51148, 0x013657fc, 0x0092cc58, 0x018a022c, 0x0099cc97, 0x0287935f, 0x03a44805, 0x000a0137}}}, + {X: Field{[10]uint32{0x01af726a, 0x00fd0531, 0x036e6d41, 0x0172c96f, 0x01469a3e, 0x02ad883e, 0x032cb698, 0x0317394f, 0x0105ed8c, 0x001b4db4}}, Y: Field{[10]uint32{0x03f9fc7d, 0x00124684, 0x00a35c57, 0x00dad042, 0x01dcc599, 0x0171400a, 0x018c66c9, 0x019a79cb, 0x0034e377, 0x00392e97}}}, + {X: Field{[10]uint32{0x02e1346b, 0x02612771, 0x031c5ea1, 0x0040e16b, 0x005abe7b, 0x013454b0, 0x00c761f1, 0x03442f95, 0x00ff0982, 0x0001a41a}}, Y: Field{[10]uint32{0x03226c13, 0x01629535, 0x0026e7bb, 0x00e65318, 0x02a4f689, 0x0021910a, 0x005db2bd, 0x03789b6a, 0x03e090bf, 0x002e18f8}}}, + {X: Field{[10]uint32{0x0140db99, 0x00a8c329, 0x0012286e, 0x03014d2e, 0x03eb1309, 0x01bc2c38, 0x02883fa6, 0x02b03341, 0x01e10cd3, 0x000eadaf}}, Y: Field{[10]uint32{0x03da78a3, 0x01cff8c6, 0x00043e68, 0x02c38da7, 0x0038d137, 0x0284fa67, 0x03117a96, 0x01c75ff0, 0x02079be8, 0x002eb298}}}, + {X: Field{[10]uint32{0x00a1f6a1, 0x01a47f37, 0x03f1a30e, 0x0050d233, 0x01068cbd, 0x007a1b38, 0x006dc5cb, 0x025d854a, 0x0093cb25, 0x0022630d}}, Y: Field{[10]uint32{0x024f647c, 0x037083c5, 0x0179ca4a, 0x025e7caf, 0x03b2a7cf, 0x00ab1ba4, 0x00454245, 0x02955276, 0x0186ab56, 0x001d7dd6}}}, + {X: Field{[10]uint32{0x0235c795, 0x038aef1c, 0x001d7584, 0x0163af55, 0x030b0d89, 0x03472275, 0x03b05b37, 0x025d2ce4, 0x022435ef, 0x00018f11}}, Y: Field{[10]uint32{0x03110258, 0x00b70256, 0x029bd3f3, 0x02b3e926, 0x029e4acb, 0x00c7216d, 0x01f660d9, 0x0210110c, 0x03b91303, 0x00389fe6}}}, + {X: Field{[10]uint32{0x011e3998, 0x02780f0f, 0x00328aa6, 0x02e45e81, 0x025e56c8, 0x008a89d3, 0x01299d70, 0x022fc069, 0x02fed291, 0x002c84f8}}, Y: Field{[10]uint32{0x025fb81e, 0x032f718c, 0x01175ec2, 0x016faf7b, 0x03d53416, 0x00e90ef0, 0x0161ebf8, 0x00f04b0f, 0x02c20f2d, 0x0008a7e3}}}, + {X: Field{[10]uint32{0x031048da, 0x01efc9e7, 0x013ba777, 0x03cdcf77, 0x02ba2fd4, 0x0341ef38, 0x03a069d9, 0x015bc3f6, 0x00e3f1ad, 0x001e598d}}, Y: Field{[10]uint32{0x0106cf01, 0x026f8928, 0x00862e8f, 0x03633f5d, 0x02532576, 0x029e49fc, 0x01e74735, 0x002e255b, 0x02b6cfb2, 0x001363b8}}}, + {X: Field{[10]uint32{0x025be234, 0x0387fb28, 0x0350700b, 0x039c377c, 0x020e83e3, 0x00581b81, 0x01d0ba69, 0x03e4f974, 0x02d816c7, 0x0012cece}}, Y: Field{[10]uint32{0x020e8362, 0x02df80e4, 0x01b84063, 0x024b3c84, 0x0041e7fd, 0x03633013, 0x035e96df, 0x02f271e1, 0x023b85da, 0x0017bb00}}}, + {X: Field{[10]uint32{0x005201e1, 0x0026b270, 0x0377dab2, 0x016ba0da, 0x01d264cb, 0x03a8d7e6, 0x02bd55cd, 0x01e2ba14, 0x02b06e6c, 0x0030a671}}, Y: Field{[10]uint32{0x00f51ba3, 0x00cc4e94, 0x02ae9add, 0x03d60eb0, 0x03bd74dc, 0x035dd335, 0x0084f24f, 0x02016ce2, 0x01923611, 0x0016a9ce}}}, + {X: Field{[10]uint32{0x0289f55e, 0x018d29f8, 0x02707b96, 0x03c38b1d, 0x022976b0, 0x01e2596f, 0x00251b02, 0x013e5808, 0x00b6ddb0, 0x0027dee2}}, Y: Field{[10]uint32{0x021e4bde, 0x034ed97f, 0x022b1b3c, 0x0383ac42, 0x03c0e536, 0x0263f1c7, 0x03146b42, 0x0043def8, 0x0384c704, 0x000cbe7d}}}, + {X: Field{[10]uint32{0x001cbaab, 0x01e9fc5b, 0x0164cfd3, 0x01e40cf5, 0x001acab8, 0x029c18d7, 0x00ab6c18, 0x0181c566, 0x0298fb35, 0x00340c6b}}, Y: Field{[10]uint32{0x01116b26, 0x02411fe1, 0x01fdc4c3, 0x013f6f59, 0x036dfb4a, 0x0372d373, 0x02e4c06a, 0x01613a39, 0x02b4e954, 0x00105465}}}, + {X: Field{[10]uint32{0x01fe1d2b, 0x01272307, 0x038e5165, 0x002795a1, 0x00c493f5, 0x00fedce9, 0x02ccadfd, 0x01238f9d, 0x03e9cb74, 0x00356290}}, Y: Field{[10]uint32{0x00d50922, 0x009e56e3, 0x02fbffcf, 0x008572f5, 0x0354d9ba, 0x020a09da, 0x02729132, 0x020f3c42, 0x026ba058, 0x003f05e1}}}, + {X: Field{[10]uint32{0x007996c0, 0x03ef5611, 0x0269a626, 0x01c9dae8, 0x016e2eed, 0x02fb743a, 0x03979577, 0x00d590e6, 0x02d86a95, 0x0005ba16}}, Y: Field{[10]uint32{0x00151d48, 0x022f192e, 0x01d54488, 0x02b6715a, 0x0221b642, 0x0003b556, 0x0217e5ce, 0x0124fbec, 0x00aeb424, 0x001d022c}}}, + {X: Field{[10]uint32{0x009c795e, 0x00546f89, 0x0005e124, 0x02aa673a, 0x02ed4406, 0x0309fa93, 0x02d969c3, 0x020c4335, 0x01397111, 0x0008749c}}, Y: Field{[10]uint32{0x01208ece, 0x004bb0e6, 0x03761b00, 0x01292b7e, 0x03d67194, 0x008aed30, 0x0335b855, 0x02b3a85d, 0x01b4b075, 0x0025317e}}}, + {X: Field{[10]uint32{0x03c0df5d, 0x0045de38, 0x02792f1a, 0x03ed455a, 0x032019ef, 0x01d75fea, 0x00adab94, 0x02cce9f6, 0x0214441f, 0x003a03fa}}, Y: Field{[10]uint32{0x02c9ec78, 0x010a46da, 0x02ea9fcb, 0x0202bcc8, 0x032d155e, 0x00f2a511, 0x009768ca, 0x0001dc7a, 0x027f638e, 0x003bb477}}}, + }, + { + {X: Field{[10]uint32{0x03c0df5d, 0x0045de38, 0x02792f1a, 0x03ed455a, 0x032019ef, 0x01d75fea, 0x00adab94, 0x02cce9f6, 0x0214441f, 0x003a03fa}}, Y: Field{[10]uint32{0x02c9ec78, 0x010a46da, 0x02ea9fcb, 0x0202bcc8, 0x032d155e, 0x00f2a511, 0x009768ca, 0x0001dc7a, 0x027f638e, 0x003bb477}}}, + {X: Field{[10]uint32{0x0383cd58, 0x0039e2c3, 0x039162db, 0x00e1df4b, 0x03122dcc, 0x03bf9e8d, 0x01ac4ed1, 0x00499660, 0x01f08ea4, 0x00110328}}, Y: Field{[10]uint32{0x008a3f4b, 0x02f01a6e, 0x02260b07, 0x0109a702, 0x02a21e4d, 0x03538bc0, 0x00954dc9, 0x03848abe, 0x00d2cd5e, 0x0029b22c}}}, + {X: Field{[10]uint32{0x03592d55, 0x00d67b35, 0x010192c0, 0x011d038d, 0x0106d5b9, 0x00cf38ec, 0x02fef696, 0x00149822, 0x02dbc4a1, 0x00174bb1}}, Y: Field{[10]uint32{0x035183a7, 0x039743ab, 0x01174266, 0x0336b445, 0x010e2a7b, 0x01a335a5, 0x03710fa2, 0x0117ad63, 0x01f89c6e, 0x0002a4b3}}}, + {X: Field{[10]uint32{0x02998b10, 0x02f689c4, 0x029d9e81, 0x02f306c8, 0x019bc70e, 0x00ea41e0, 0x037f829d, 0x01b07317, 0x03af2b96, 0x003da532}}, Y: Field{[10]uint32{0x00f05e51, 0x0222c5c0, 0x02a47f67, 0x030c60f0, 0x02eb6c64, 0x0311b60a, 0x03c5ffac, 0x03c0f58c, 0x02ba61be, 0x0010298f}}}, + {X: Field{[10]uint32{0x028f9f5c, 0x03d2d27f, 0x00a51991, 0x03856620, 0x017361f1, 0x0057d013, 0x02cae342, 0x03dd0bf8, 0x01c3b11b, 0x002b0dc7}}, Y: Field{[10]uint32{0x025a503c, 0x020ffccc, 0x01e1d17a, 0x0163b9d4, 0x01229534, 0x009539cd, 0x02101e73, 0x0291dffc, 0x02c18709, 0x00314585}}}, + {X: Field{[10]uint32{0x015bf84c, 0x012e3e39, 0x01027a74, 0x03b55c36, 0x03d964c6, 0x008f2b93, 0x01d3c252, 0x01b32397, 0x0099ceb9, 0x00189e0a}}, Y: Field{[10]uint32{0x0315fa2a, 0x0073ead7, 0x036ed6f5, 0x039f7745, 0x039a020d, 0x025c99e0, 0x00549722, 0x028a2407, 0x00a40911, 0x00359c2b}}}, + {X: Field{[10]uint32{0x01e33446, 0x00723546, 0x0385df4a, 0x03114abc, 0x0240893b, 0x0088a85e, 0x008c0bd0, 0x0210324d, 0x003a14f1, 0x00225080}}, Y: Field{[10]uint32{0x02387689, 0x00e28039, 0x00f9840d, 0x00d9e79d, 0x006bfd77, 0x03bf7938, 0x00b2d6d0, 0x001de936, 0x039595a5, 0x002a7f40}}}, + {X: Field{[10]uint32{0x01d553fd, 0x0284cd63, 0x02414f95, 0x0257022d, 0x0047abf6, 0x02689654, 0x036d4f43, 0x01a12142, 0x022a3556, 0x0022dba1}}, Y: Field{[10]uint32{0x029be5ed, 0x00f6b4cf, 0x003d0d80, 0x016860ce, 0x0124ac3c, 0x013ae7e8, 0x010bc2df, 0x0072d034, 0x00910ed1, 0x003a9782}}}, + {X: Field{[10]uint32{0x0113cb26, 0x00a3256e, 0x016d03d7, 0x027004ef, 0x0099eb41, 0x01541726, 0x00da44ff, 0x010aa28b, 0x026b30a3, 0x0009dc09}}, Y: Field{[10]uint32{0x0348a7a2, 0x01c5ccfc, 0x01bebbfe, 0x006f3205, 0x00e940c9, 0x01fcacc9, 0x012d24d0, 0x036c6955, 0x005e79b0, 0x003d926f}}}, + {X: Field{[10]uint32{0x030c58bd, 0x010912b3, 0x024ce23f, 0x0137d911, 0x0228d49f, 0x01aabb3d, 0x019e1005, 0x013024cb, 0x006e2484, 0x0034eb7c}}, Y: Field{[10]uint32{0x03c89387, 0x0392ae4d, 0x00c9ce52, 0x027e92e6, 0x02aee386, 0x03fd8e2e, 0x03b2febc, 0x0181def7, 0x01b4fc2a, 0x0015fa67}}}, + {X: Field{[10]uint32{0x015e8247, 0x02a80856, 0x00d1af0a, 0x01155a1b, 0x0097bfdc, 0x033e2ea4, 0x025e6e01, 0x03b485e3, 0x00d383cb, 0x001d7934}}, Y: Field{[10]uint32{0x01982d22, 0x00ff6756, 0x01893ca2, 0x02dbaa6b, 0x007ddab5, 0x01edc9b5, 0x01f970ec, 0x002641d0, 0x02a17541, 0x0007f390}}}, + {X: Field{[10]uint32{0x039715c2, 0x011c743c, 0x0129a399, 0x0087e629, 0x01690065, 0x028cffb7, 0x011f78ce, 0x00f616d0, 0x0288f19a, 0x000bc627}}, Y: Field{[10]uint32{0x0171dfea, 0x018d6110, 0x014f066a, 0x038b0da1, 0x03eb3333, 0x03443e7d, 0x0308475e, 0x035f3f7d, 0x01f8f3c5, 0x0032468e}}}, + {X: Field{[10]uint32{0x02333323, 0x027d1369, 0x02bf4747, 0x0071a3d2, 0x009cbbbc, 0x026136a1, 0x0020d605, 0x02efc0fc, 0x02383361, 0x000fb46d}}, Y: Field{[10]uint32{0x01d61ba3, 0x00ff122d, 0x037294b1, 0x02842de3, 0x02a9b728, 0x0223e4a7, 0x017c9896, 0x013b9d76, 0x01a48b5b, 0x003613cb}}}, + {X: Field{[10]uint32{0x023eb3fc, 0x018bb73e, 0x02398875, 0x02513643, 0x0277ee68, 0x02229bdf, 0x0246b408, 0x01aedddf, 0x00bb0a1b, 0x0034b372}}, Y: Field{[10]uint32{0x02d37564, 0x021f6cf7, 0x00927442, 0x02e4c42d, 0x02c1f217, 0x033e49bb, 0x01e95362, 0x018411b7, 0x02f9e5c5, 0x003154e2}}}, + {X: Field{[10]uint32{0x033980bf, 0x0015f52c, 0x000baf25, 0x00b94374, 0x0368a370, 0x00d23750, 0x006fd772, 0x020606e1, 0x02f06a75, 0x001c3f74}}, Y: Field{[10]uint32{0x00b75785, 0x03aa33a8, 0x00a5612e, 0x020e175d, 0x030a1035, 0x007b965a, 0x03a410d1, 0x021a5a55, 0x02c0d0d5, 0x0017b7f2}}}, + {X: Field{[10]uint32{0x00e16070, 0x001eef31, 0x02915ddc, 0x000c7bf5, 0x03f2a182, 0x03559d50, 0x03a48e51, 0x01c10c4e, 0x017bdfcd, 0x0028c05a}}, Y: Field{[10]uint32{0x02177ea1, 0x03468107, 0x01a130c0, 0x03df0284, 0x031735db, 0x017503e6, 0x01809fa2, 0x0393d420, 0x011cfb67, 0x001cdc3e}}}, + }, + { + {X: Field{[10]uint32{0x00e16070, 0x001eef31, 0x02915ddc, 0x000c7bf5, 0x03f2a182, 0x03559d50, 0x03a48e51, 0x01c10c4e, 0x017bdfcd, 0x0028c05a}}, Y: Field{[10]uint32{0x02177ea1, 0x03468107, 0x01a130c0, 0x03df0284, 0x031735db, 0x017503e6, 0x01809fa2, 0x0393d420, 0x011cfb67, 0x001cdc3e}}}, + {X: Field{[10]uint32{0x024ba5ae, 0x0080c5bc, 0x035d8114, 0x000130d2, 0x00b43965, 0x0382ffdd, 0x028d2419, 0x03c127cf, 0x019cff79, 0x0009f879}}, Y: Field{[10]uint32{0x003a45b3, 0x016ffba2, 0x023f784a, 0x029a6be9, 0x01df48a1, 0x031e77c1, 0x01b5e3cf, 0x038827b8, 0x02a6c804, 0x000c42c9}}}, + {X: Field{[10]uint32{0x038011fc, 0x0049c004, 0x00562670, 0x019eb5ca, 0x0183596a, 0x00880293, 0x02b13308, 0x03ac4455, 0x03a30815, 0x001ba0c4}}, Y: Field{[10]uint32{0x0315ab7d, 0x02da7e8f, 0x01f9a6ac, 0x016ba714, 0x0026af91, 0x0076b0c1, 0x0212db20, 0x03c81306, 0x018bdc24, 0x003051e0}}}, + {X: Field{[10]uint32{0x00aed7ae, 0x0245d727, 0x03b4f996, 0x037a13ef, 0x035a39ad, 0x024b5f93, 0x0188ec38, 0x012bb859, 0x03a5f686, 0x0031c4b9}}, Y: Field{[10]uint32{0x02156294, 0x00522a91, 0x0263784d, 0x01512c33, 0x01380d8e, 0x00477679, 0x02d4b823, 0x018ecd97, 0x01075163, 0x00125910}}}, + {X: Field{[10]uint32{0x000e6ba7, 0x01d26e34, 0x02f7f53a, 0x016d1245, 0x003d36ec, 0x0136786d, 0x011e038a, 0x02147caf, 0x01099784, 0x003e54aa}}, Y: Field{[10]uint32{0x0175e4c1, 0x02bbb940, 0x022b98db, 0x01ed318a, 0x02555716, 0x009fe83d, 0x01376a2e, 0x033afe18, 0x025b08ab, 0x00362a4e}}}, + {X: Field{[10]uint32{0x015b6f7e, 0x0127d716, 0x02021f95, 0x014f4e2c, 0x01beb32b, 0x00261db3, 0x02053aad, 0x028c320e, 0x011d04cd, 0x00296b1f}}, Y: Field{[10]uint32{0x02b19c84, 0x02edcc22, 0x00a4848d, 0x0183d606, 0x0399e391, 0x01f67b86, 0x00c3c924, 0x03d56cdb, 0x020ab540, 0x0037c2e2}}}, + {X: Field{[10]uint32{0x03aa0e93, 0x001968a0, 0x01f62690, 0x010ebbec, 0x028f2e39, 0x0367a24e, 0x00031a19, 0x03fb9d41, 0x015e31d3, 0x0025005b}}, Y: Field{[10]uint32{0x03addac2, 0x03b49a21, 0x0307a38e, 0x00eea95e, 0x03f48437, 0x03bb9bf5, 0x0355d354, 0x01365900, 0x02ee5c45, 0x0019d40c}}}, + {X: Field{[10]uint32{0x00a6db03, 0x00f87f91, 0x01d791b4, 0x01bd609d, 0x00b2c85d, 0x02e19d7f, 0x01c0d426, 0x008d7419, 0x0104a4b3, 0x0002ff01}}, Y: Field{[10]uint32{0x024b8542, 0x03234691, 0x00f0558a, 0x025cd175, 0x02374271, 0x0129b264, 0x038ec7f9, 0x03cd14fe, 0x027a6c34, 0x00065551}}}, + {X: Field{[10]uint32{0x0266b17b, 0x01218b80, 0x03b32b0f, 0x0288098a, 0x02023568, 0x02a7c270, 0x03978846, 0x02ca246e, 0x0174d59f, 0x003bc8b4}}, Y: Field{[10]uint32{0x01dac83e, 0x01b810de, 0x001b732a, 0x01bdc70d, 0x033ee727, 0x038d2841, 0x039ccc3a, 0x0131d5a3, 0x00c97ab2, 0x002f15e1}}}, + {X: Field{[10]uint32{0x034318b5, 0x00b150ba, 0x0045657f, 0x0204bd6e, 0x0272ed5c, 0x03c815fb, 0x0388a38d, 0x02343d55, 0x01fbe194, 0x0026217d}}, Y: Field{[10]uint32{0x0199175c, 0x01509505, 0x004af2fe, 0x03b59da4, 0x027c82ad, 0x01a33ae3, 0x012c4677, 0x0263e65b, 0x02f69ef1, 0x0004d7f5}}}, + {X: Field{[10]uint32{0x02d382a0, 0x00c056a4, 0x019ae231, 0x02f38bb3, 0x03f28dcb, 0x02cb7e49, 0x00acc780, 0x0224b4e7, 0x03ce4ceb, 0x002d7dfb}}, Y: Field{[10]uint32{0x01b4b532, 0x03c2aee9, 0x038c5ba2, 0x01b4a6b3, 0x0371fb09, 0x0032f774, 0x00957c6e, 0x03c8d4f0, 0x005b51c3, 0x001a10d5}}}, + {X: Field{[10]uint32{0x0281c1bc, 0x0292b933, 0x01b33b93, 0x03962aed, 0x03d25365, 0x01a339d9, 0x01815b8d, 0x00118d6b, 0x0305465c, 0x0000cd83}}, Y: Field{[10]uint32{0x026cbedd, 0x034a2595, 0x0150176d, 0x03ad7204, 0x03231728, 0x004c19d4, 0x0369c425, 0x0140053f, 0x01f90c57, 0x001f922d}}}, + {X: Field{[10]uint32{0x012cffa5, 0x02491910, 0x005c47e6, 0x00219a33, 0x0389ed42, 0x02f51890, 0x00754d8f, 0x0041d902, 0x03d2b2e7, 0x00073770}}, Y: Field{[10]uint32{0x0121954e, 0x01b62735, 0x03528ade, 0x0109acda, 0x02c41c98, 0x0250ac22, 0x01b126bf, 0x03e298ff, 0x020cb2f1, 0x000791da}}}, + {X: Field{[10]uint32{0x008993f7, 0x027dcd01, 0x03ce1150, 0x008fe09c, 0x02962552, 0x0322eb90, 0x034fbe1b, 0x0214458c, 0x006a56a3, 0x00021d4d}}, Y: Field{[10]uint32{0x02b9dcc2, 0x030b205c, 0x0018e601, 0x03c6c498, 0x03c9f4d4, 0x01d7e8a1, 0x02994e6e, 0x022c0c43, 0x00a8a2ef, 0x0001939b}}}, + {X: Field{[10]uint32{0x00a9f22f, 0x03f90e4d, 0x00e2ad35, 0x031485ea, 0x00cc0819, 0x01220d6c, 0x01f8b8b9, 0x03a4e7c8, 0x0359f25c, 0x000ab32c}}, Y: Field{[10]uint32{0x035c4927, 0x01772ced, 0x0150b7b7, 0x02fb16e9, 0x01154bd7, 0x037c3b7c, 0x0213a37e, 0x034b9464, 0x00e9588a, 0x00354629}}}, + {X: Field{[10]uint32{0x03b04ed4, 0x02b18f8f, 0x03fffab7, 0x002c44c1, 0x0208cc33, 0x0099e378, 0x03f9d051, 0x02e4d918, 0x01b389d6, 0x00242b61}}, Y: Field{[10]uint32{0x036ef150, 0x03535232, 0x0094d991, 0x02f8560a, 0x0039aefa, 0x009c88ae, 0x03dcbd94, 0x020986bf, 0x023620a3, 0x0003941e}}}, + }, + { + {X: Field{[10]uint32{0x03b04ed4, 0x02b18f8f, 0x03fffab7, 0x002c44c1, 0x0208cc33, 0x0099e378, 0x03f9d051, 0x02e4d918, 0x01b389d6, 0x00242b61}}, Y: Field{[10]uint32{0x036ef150, 0x03535232, 0x0094d991, 0x02f8560a, 0x0039aefa, 0x009c88ae, 0x03dcbd94, 0x020986bf, 0x023620a3, 0x0003941e}}}, + {X: Field{[10]uint32{0x03dc0151, 0x022c3b69, 0x03bad281, 0x039919c1, 0x017e125b, 0x0210978f, 0x00b1d154, 0x0101dfd1, 0x000ef8c9, 0x001f8b35}}, Y: Field{[10]uint32{0x00721ec7, 0x02f14e48, 0x0082c9a3, 0x0102bbb8, 0x01889bee, 0x0087be57, 0x0261a8b3, 0x03eace0a, 0x01082adc, 0x002416dd}}}, + {X: Field{[10]uint32{0x00b7b678, 0x0176ccec, 0x03816627, 0x0046f3d8, 0x02f13c43, 0x009adb1d, 0x0186bca4, 0x008c6e86, 0x017334e4, 0x00061b92}}, Y: Field{[10]uint32{0x00d91fc1, 0x001dbcbe, 0x035dca7a, 0x00951254, 0x02110772, 0x002df99f, 0x03fc825c, 0x02f612a9, 0x00e49807, 0x00303518}}}, + {X: Field{[10]uint32{0x0345e597, 0x000eb904, 0x03cf90e1, 0x03e76e14, 0x039c636b, 0x007bd4a9, 0x00975bbd, 0x036b3887, 0x012195be, 0x002851bd}}, Y: Field{[10]uint32{0x005a770a, 0x0159dabd, 0x014b0767, 0x02c887c2, 0x00ea67a5, 0x02ecc6d0, 0x0295dd2d, 0x03fac26b, 0x030ab053, 0x00296a66}}}, + {X: Field{[10]uint32{0x03421fb8, 0x01b972ec, 0x015d0cf0, 0x03cbbd69, 0x02984971, 0x00edc904, 0x0206b34c, 0x02fd8b9f, 0x01834f6d, 0x00018723}}, Y: Field{[10]uint32{0x023ccd80, 0x03bd9a13, 0x00dd2995, 0x012ce9bf, 0x00806713, 0x03817ad7, 0x01392590, 0x02d2deea, 0x02d99003, 0x001b7f1a}}}, + {X: Field{[10]uint32{0x03b9dc8f, 0x03226e12, 0x01333d08, 0x00fbd7b7, 0x01aba9e9, 0x0149e1f4, 0x00f70353, 0x01a19092, 0x01cee1c2, 0x003f6650}}, Y: Field{[10]uint32{0x019780d5, 0x03ab94f9, 0x0138d743, 0x03f7bbfa, 0x027872b2, 0x02221679, 0x0297e057, 0x039bd1b7, 0x0075bd40, 0x001e907b}}}, + {X: Field{[10]uint32{0x036b35a4, 0x012f862b, 0x03b48712, 0x029aac9f, 0x01889f37, 0x00ce9a2b, 0x03632407, 0x03944edc, 0x023a208e, 0x003da9ad}}, Y: Field{[10]uint32{0x01f422a6, 0x02dbfb20, 0x01862cae, 0x01b9d7b8, 0x0319d575, 0x0158061b, 0x02d3704f, 0x004e2c72, 0x00a8002d, 0x000f7df2}}}, + {X: Field{[10]uint32{0x00e45444, 0x02d4ff13, 0x004e20cb, 0x007bfb33, 0x00dbde42, 0x0096a045, 0x03bf9dab, 0x024ee6f3, 0x01a1cf19, 0x0034931d}}, Y: Field{[10]uint32{0x03dd4a57, 0x00c91a61, 0x02524cb9, 0x03d267c7, 0x02bf7593, 0x003969e2, 0x00b7d181, 0x0307473f, 0x012de84d, 0x00163f87}}}, + {X: Field{[10]uint32{0x02954c11, 0x0208fa29, 0x01018b96, 0x00f05583, 0x037fa8a4, 0x0141de3f, 0x00d1b0f1, 0x030dd888, 0x0028c286, 0x0021e8bf}}, Y: Field{[10]uint32{0x032a8b45, 0x038ccb89, 0x0124b756, 0x00fca9e0, 0x02cc4893, 0x00349d4c, 0x031948da, 0x03b3be5e, 0x018b45aa, 0x000ceb54}}}, + {X: Field{[10]uint32{0x03a43ddc, 0x006bfa61, 0x02e4aeeb, 0x0286a655, 0x0124282c, 0x039ef7d5, 0x001eb85e, 0x02b1b684, 0x03864946, 0x002a2c22}}, Y: Field{[10]uint32{0x03a2a6b8, 0x000720b7, 0x036c3870, 0x0114ac41, 0x00a325b4, 0x03c3a3b7, 0x01591ffd, 0x01a807cc, 0x028bc8a3, 0x001fc03f}}}, + {X: Field{[10]uint32{0x02706ab6, 0x01d1cab8, 0x03c0dae4, 0x00774b94, 0x023c0b34, 0x030e133f, 0x0156efcb, 0x02069a11, 0x02046e78, 0x003851cb}}, Y: Field{[10]uint32{0x0158de05, 0x021a85a7, 0x0127536e, 0x015514f3, 0x00aa589d, 0x0321887e, 0x03691978, 0x023f1a0f, 0x02aa47c5, 0x0020b364}}}, + {X: Field{[10]uint32{0x03963645, 0x0250cb0e, 0x031f8e3e, 0x0201f9c7, 0x032dcdb2, 0x038c4cbe, 0x034781a2, 0x0298f9b9, 0x014fb1b8, 0x00317c25}}, Y: Field{[10]uint32{0x008be2dd, 0x0221d3c0, 0x03e4edbf, 0x00ac011e, 0x02a33050, 0x009835f9, 0x023cb440, 0x02dbec62, 0x031021b0, 0x003554b4}}}, + {X: Field{[10]uint32{0x03a84fb6, 0x02b95081, 0x01021ebf, 0x01d43e85, 0x03c42368, 0x03922e7a, 0x00b4d601, 0x02bbd77a, 0x02c804f8, 0x00072be4}}, Y: Field{[10]uint32{0x03149109, 0x00606409, 0x0267616b, 0x01a5a8b3, 0x02ec1cc1, 0x03c40588, 0x01a64f8f, 0x0394e920, 0x005ac976, 0x002f092e}}}, + {X: Field{[10]uint32{0x01c8381f, 0x024c48fa, 0x011a753a, 0x0358e0f0, 0x000ed3d6, 0x013f8404, 0x02beb463, 0x025f38d3, 0x0355bc6d, 0x0037ceb3}}, Y: Field{[10]uint32{0x0347de3a, 0x03f5a588, 0x009e61af, 0x01f99f8e, 0x03b10195, 0x036b347a, 0x0099c1de, 0x01e9d698, 0x00ca5190, 0x001acf76}}}, + {X: Field{[10]uint32{0x02955911, 0x0233f852, 0x0152db76, 0x0289837b, 0x03107e16, 0x00f5e0e5, 0x009efe9b, 0x01943496, 0x0169af09, 0x001c16ff}}, Y: Field{[10]uint32{0x03d200e4, 0x01f1a4ff, 0x0272d8bb, 0x0148a90b, 0x02297f3b, 0x0150147e, 0x0263d81f, 0x03e6429f, 0x00130b73, 0x003852a9}}}, + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + }, + { + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + {X: Field{[10]uint32{0x00f27076, 0x011f7e13, 0x03eaee68, 0x02b79d89, 0x01d89858, 0x03f66bd6, 0x02febe77, 0x020563f2, 0x02fd784e, 0x0013526b}}, Y: Field{[10]uint32{0x03aa781e, 0x002d9880, 0x018466b9, 0x0069f7d3, 0x006e0f2d, 0x016729bc, 0x023f2103, 0x0344d79c, 0x0059a10d, 0x00334cbf}}}, + {X: Field{[10]uint32{0x023809fa, 0x00ae3b74, 0x014be18e, 0x02cd4765, 0x00fd845c, 0x009147c2, 0x0293363f, 0x027c8a2e, 0x01be2e50, 0x000e0e07}}, Y: Field{[10]uint32{0x031fed52, 0x001d460c, 0x0324dbd7, 0x032ccb63, 0x003681fc, 0x0083ac73, 0x01405a55, 0x005f72c2, 0x010a0fb9, 0x003928cb}}}, + {X: Field{[10]uint32{0x01b62026, 0x02f2d5ca, 0x01d4ee8d, 0x03822274, 0x038d2a3d, 0x03d716a9, 0x016619e1, 0x01be14df, 0x039e85d5, 0x001d5914}}, Y: Field{[10]uint32{0x02ce0cf3, 0x00b23eb6, 0x01f33417, 0x036552de, 0x01684aac, 0x029c8a49, 0x031df524, 0x02cf1948, 0x01413749, 0x003075a1}}}, + {X: Field{[10]uint32{0x03c2a310, 0x01099225, 0x026303ea, 0x02950048, 0x01f186ae, 0x0291a668, 0x0121b82a, 0x00ab9bda, 0x0324e437, 0x00124989}}, Y: Field{[10]uint32{0x0227ded0, 0x006da057, 0x038ce0c4, 0x004a9d7f, 0x036d1636, 0x01c50c0e, 0x02cfa569, 0x02afe568, 0x0373bca7, 0x0004cdf9}}}, + {X: Field{[10]uint32{0x03663da4, 0x019b0640, 0x00b81f81, 0x02467d74, 0x03a5a362, 0x03112a8a, 0x008a6ed7, 0x01c179a0, 0x02356aa5, 0x001a9992}}, Y: Field{[10]uint32{0x03fc22c4, 0x00c4fecc, 0x004c9c28, 0x0049f9b0, 0x01089916, 0x01afc335, 0x0386ec19, 0x03a62ca7, 0x025954fd, 0x00112684}}}, + {X: Field{[10]uint32{0x02bd2d31, 0x012c1e73, 0x01b8d138, 0x015bfc1b, 0x004dcc1a, 0x011df8be, 0x02253b3e, 0x00324357, 0x028c1a24, 0x0038c195}}, Y: Field{[10]uint32{0x02546e44, 0x02d020e4, 0x03826692, 0x010af8dc, 0x02ffbc80, 0x03df436d, 0x00f2b107, 0x01098222, 0x03e37893, 0x0003ab1b}}}, + {X: Field{[10]uint32{0x03b4a278, 0x0136b355, 0x0082b536, 0x017c7fd0, 0x0078f61a, 0x02b67332, 0x006ff301, 0x009de59d, 0x017ad9df, 0x000842a4}}, Y: Field{[10]uint32{0x007b2231, 0x01c4ff43, 0x00bfc7f2, 0x006abfc8, 0x013789e6, 0x02359cdf, 0x039be81f, 0x0395ede8, 0x035450b5, 0x0019c386}}}, + {X: Field{[10]uint32{0x023136b0, 0x0030e78d, 0x01dd9c53, 0x0366aad0, 0x0374ebf8, 0x00fef58c, 0x01b0e762, 0x033bf09c, 0x000e2428, 0x000ee784}}, Y: Field{[10]uint32{0x00dbbc8a, 0x03b05bdb, 0x01f81953, 0x028ceb4c, 0x02a2ae28, 0x03d1d6c9, 0x01533eb8, 0x02edc77c, 0x00152d16, 0x003ebee6}}}, + {X: Field{[10]uint32{0x0190124e, 0x023ad4f7, 0x0085dea9, 0x01a14a07, 0x02c1e802, 0x036ce055, 0x029a1946, 0x015505df, 0x0293c06c, 0x001ebab2}}, Y: Field{[10]uint32{0x02021e31, 0x001e0408, 0x0104b3f5, 0x03e6e42a, 0x0159bc1b, 0x01b07654, 0x02caff04, 0x0243c13e, 0x03190c13, 0x0037eca6}}}, + {X: Field{[10]uint32{0x03485d3f, 0x023c11cb, 0x03eee960, 0x01a2041e, 0x0317ca07, 0x0177b7bd, 0x036ca80f, 0x0326a4ad, 0x0149712a, 0x002ec2ab}}, Y: Field{[10]uint32{0x00a2f975, 0x00e4940f, 0x00bffe79, 0x03e8c59c, 0x00895a5a, 0x00a5f68d, 0x00d201f7, 0x0151e63b, 0x0053c583, 0x003a9a67}}}, + {X: Field{[10]uint32{0x01ed815e, 0x01c0b541, 0x017b470f, 0x02af0700, 0x0166f440, 0x02551eb4, 0x035fad21, 0x0128cbae, 0x02c679f7, 0x00155a36}}, Y: Field{[10]uint32{0x00602df0, 0x02fd9300, 0x02151d9b, 0x03bb8960, 0x03eb05f7, 0x0341cfca, 0x00d6fe01, 0x02e99160, 0x00742788, 0x001ea17e}}}, + {X: Field{[10]uint32{0x02718dc9, 0x03b4ce8d, 0x023de4ae, 0x0136c044, 0x03e1e58b, 0x02bf8044, 0x028eb197, 0x03f30353, 0x02c8e4ee, 0x001e4242}}, Y: Field{[10]uint32{0x00fae7c5, 0x00c8ac47, 0x0008b963, 0x02dc2ea4, 0x02dd36af, 0x0366aa95, 0x01816cbc, 0x016e3c4f, 0x022b9190, 0x003aaadc}}}, + {X: Field{[10]uint32{0x0244a0c8, 0x0306f70b, 0x01932abe, 0x0100bb8a, 0x032c9be7, 0x031d0db0, 0x01bae600, 0x0250f2f2, 0x02884807, 0x001807a7}}, Y: Field{[10]uint32{0x0200e557, 0x024d04ae, 0x02659547, 0x0169ad1b, 0x01424e0c, 0x03feaeec, 0x00b8cfa9, 0x023b31c5, 0x02aa6fdc, 0x00169e88}}}, + {X: Field{[10]uint32{0x0360c7d1, 0x025a531f, 0x01ad2a26, 0x039f35dd, 0x028dd71d, 0x01526e99, 0x003dbbce, 0x01ed5470, 0x01ade9f9, 0x0039df20}}, Y: Field{[10]uint32{0x02d72449, 0x01607ca0, 0x006d34ec, 0x03dc70a6, 0x03631470, 0x03aa0550, 0x03c3b323, 0x004c8717, 0x0078eef8, 0x000eb3c5}}}, + {X: Field{[10]uint32{0x03231e11, 0x01bf5414, 0x01e3e668, 0x01940da0, 0x011f48e8, 0x02630d82, 0x0399ff91, 0x0217597f, 0x030176af, 0x00393cfe}}, Y: Field{[10]uint32{0x03eb73bc, 0x030e15db, 0x011c9822, 0x013b2547, 0x006cc7e7, 0x0280adca, 0x021a6d0e, 0x013c7059, 0x033ad0ef, 0x000798d8}}}, + }, + { + {X: Field{[10]uint32{0x03231e11, 0x01bf5414, 0x01e3e668, 0x01940da0, 0x011f48e8, 0x02630d82, 0x0399ff91, 0x0217597f, 0x030176af, 0x00393cfe}}, Y: Field{[10]uint32{0x03eb73bc, 0x030e15db, 0x011c9822, 0x013b2547, 0x006cc7e7, 0x0280adca, 0x021a6d0e, 0x013c7059, 0x033ad0ef, 0x000798d8}}}, + {X: Field{[10]uint32{0x03cdaf2f, 0x03b888ce, 0x032953bf, 0x02096e85, 0x0388531a, 0x02f6cd8b, 0x0064110a, 0x01cf807b, 0x03b76867, 0x0012cc32}}, Y: Field{[10]uint32{0x0126b5b7, 0x00cf518f, 0x00575680, 0x020790d2, 0x011fdf3c, 0x01f0f12a, 0x01e2c577, 0x018a6dbe, 0x010265bb, 0x001d318d}}}, + {X: Field{[10]uint32{0x03f05bd6, 0x027c139a, 0x01946539, 0x000c84aa, 0x00a2f56e, 0x02d1c37b, 0x032f51fe, 0x013fa420, 0x0241bee4, 0x0024030c}}, Y: Field{[10]uint32{0x000d358b, 0x00ab4efc, 0x03b15de5, 0x0160f13b, 0x01d69853, 0x01c2c90e, 0x01c72045, 0x03c3d7e5, 0x01e8e8b1, 0x001b0c7e}}}, + {X: Field{[10]uint32{0x0273059f, 0x03a70a69, 0x03a192ff, 0x01414383, 0x03ec1171, 0x01d19205, 0x015b20b1, 0x01c03734, 0x00aa7ae1, 0x0032ed0d}}, Y: Field{[10]uint32{0x027c070c, 0x02a59088, 0x03845b7d, 0x013c2b57, 0x0141d45e, 0x022d77eb, 0x02d49233, 0x02f45d58, 0x000ab4da, 0x00128688}}}, + {X: Field{[10]uint32{0x03105c50, 0x030a3327, 0x005257a7, 0x03bdec4e, 0x0182e0de, 0x00f08cf3, 0x028cc340, 0x0242ab58, 0x0362ab05, 0x0016a340}}, Y: Field{[10]uint32{0x00a4cde9, 0x02c8060e, 0x013c35c9, 0x02299b40, 0x00a605f6, 0x0050ffdd, 0x02a6b724, 0x0394da4d, 0x02b113d4, 0x0030167a}}}, + {X: Field{[10]uint32{0x032e294d, 0x03ecbde9, 0x00dd5be6, 0x028fc034, 0x02f158eb, 0x037dfb71, 0x02289eae, 0x00d2e469, 0x00805cd5, 0x000a77f9}}, Y: Field{[10]uint32{0x00469b52, 0x00dc983b, 0x02e69441, 0x0070e4a7, 0x01d1f196, 0x02281793, 0x0034e758, 0x01cb866d, 0x0026d006, 0x002fd9b6}}}, + {X: Field{[10]uint32{0x02d64feb, 0x03862e6c, 0x0292c647, 0x02964a48, 0x003772f8, 0x01b2e93a, 0x02f3a577, 0x03d82923, 0x01031232, 0x00364fd3}}, Y: Field{[10]uint32{0x00698359, 0x03ef564d, 0x00da37b0, 0x002fbb24, 0x0193e043, 0x01372313, 0x037311c5, 0x009cce88, 0x015d45cb, 0x001e4955}}}, + {X: Field{[10]uint32{0x02de12c0, 0x01e1b841, 0x010e94d4, 0x03161d18, 0x006d9cda, 0x0155c913, 0x02d7b1e7, 0x00b07341, 0x016d9c10, 0x003d1e01}}, Y: Field{[10]uint32{0x025361fe, 0x01db39b2, 0x012d769a, 0x03d826ae, 0x0026c17e, 0x001a1a53, 0x00095e01, 0x00e51b9a, 0x0210f33e, 0x001fc279}}}, + {X: Field{[10]uint32{0x039fbc84, 0x00813350, 0x02016722, 0x0245815e, 0x037e7062, 0x018ab196, 0x014e2bc6, 0x00a1106c, 0x01c6e36f, 0x000bc1da}}, Y: Field{[10]uint32{0x00201bec, 0x0240b787, 0x015d73fb, 0x01a93137, 0x01cca79b, 0x02438852, 0x01df0079, 0x02f777e9, 0x03724d73, 0x002d0d3c}}}, + {X: Field{[10]uint32{0x0026dea2, 0x02cbf4b4, 0x005d8928, 0x0114b167, 0x0187c84c, 0x0269b758, 0x01a1e26d, 0x02efef5c, 0x0248d561, 0x0007773e}}, Y: Field{[10]uint32{0x003de522, 0x0121cf46, 0x0273406f, 0x02314701, 0x00666fd6, 0x0100b008, 0x03ea34d6, 0x00e9f507, 0x001fa992, 0x0031be90}}}, + {X: Field{[10]uint32{0x02a758ea, 0x01fab321, 0x019c4d53, 0x006249fc, 0x01911883, 0x01505b8e, 0x006895a1, 0x000c2656, 0x0380559e, 0x003f9f99}}, Y: Field{[10]uint32{0x037ab649, 0x008b6576, 0x020d1e4f, 0x001d10c4, 0x033b8017, 0x02124947, 0x0008e169, 0x0372e623, 0x0167a281, 0x000e2a9a}}}, + {X: Field{[10]uint32{0x033773f7, 0x03c011b0, 0x019953c7, 0x034d16d6, 0x0150d44f, 0x0278dca8, 0x01410c00, 0x008db4f8, 0x0226f5dd, 0x000d56cc}}, Y: Field{[10]uint32{0x0087c182, 0x00f0ffc6, 0x01109005, 0x01e33389, 0x001e25df, 0x03487f2e, 0x0310eedd, 0x000eb527, 0x00807047, 0x00023b29}}}, + {X: Field{[10]uint32{0x00fffefa, 0x005589a3, 0x01afade7, 0x013dc194, 0x01101804, 0x0030ebe1, 0x01f6f915, 0x00c49f5b, 0x01ca7538, 0x00246ebd}}, Y: Field{[10]uint32{0x037f6faf, 0x00dbcd37, 0x0303dc7d, 0x00439bf4, 0x02f4bef3, 0x01f74f64, 0x01969f12, 0x02f3af97, 0x03119347, 0x00013973}}}, + {X: Field{[10]uint32{0x00785491, 0x037d01a4, 0x025d1dd3, 0x01792baa, 0x035291de, 0x00be19ad, 0x019f43cb, 0x002eb958, 0x00f17f26, 0x0024ac78}}, Y: Field{[10]uint32{0x00be555b, 0x0234d816, 0x00d7b9c9, 0x01df88a2, 0x003985fb, 0x00d396b4, 0x027c1d10, 0x02798f85, 0x00028d8d, 0x00207b11}}}, + {X: Field{[10]uint32{0x0133c546, 0x00245fa3, 0x01af32fc, 0x02cca17b, 0x0382575f, 0x003d7775, 0x02c5373e, 0x01e29f2c, 0x0121cb3f, 0x00111610}}, Y: Field{[10]uint32{0x000b4fd4, 0x01b461c0, 0x0273660a, 0x00f3ecb2, 0x00852f0a, 0x0246b688, 0x0225eae3, 0x01d4e9dc, 0x0377f3f8, 0x000c2364}}}, + {X: Field{[10]uint32{0x00eae29e, 0x02dbab88, 0x01d0716f, 0x00bc3538, 0x02c7034f, 0x01169099, 0x0161537a, 0x03ccc7ae, 0x029b18eb, 0x0023003e}}, Y: Field{[10]uint32{0x0302414b, 0x00a93199, 0x02c54e7d, 0x03ea078d, 0x00c2fada, 0x01cdb25d, 0x01c343a3, 0x008686a7, 0x0267fea5, 0x003be91c}}}, + }, + { + {X: Field{[10]uint32{0x00eae29e, 0x02dbab88, 0x01d0716f, 0x00bc3538, 0x02c7034f, 0x01169099, 0x0161537a, 0x03ccc7ae, 0x029b18eb, 0x0023003e}}, Y: Field{[10]uint32{0x0302414b, 0x00a93199, 0x02c54e7d, 0x03ea078d, 0x00c2fada, 0x01cdb25d, 0x01c343a3, 0x008686a7, 0x0267fea5, 0x003be91c}}}, + {X: Field{[10]uint32{0x018ada5f, 0x0326ac30, 0x02fb3e84, 0x01fca448, 0x03fd7e29, 0x00daf87b, 0x03b5bf96, 0x02d1bea2, 0x00176da2, 0x000933f0}}, Y: Field{[10]uint32{0x038a586b, 0x02984e65, 0x014f268f, 0x028693e0, 0x03ed959c, 0x037b6a49, 0x028714d5, 0x01869a61, 0x03bb079c, 0x003affe3}}}, + {X: Field{[10]uint32{0x03fd913d, 0x025580fa, 0x009eac3f, 0x039bb953, 0x0050a680, 0x030aa348, 0x0107a084, 0x0377e1d3, 0x02a7e907, 0x000d8d8a}}, Y: Field{[10]uint32{0x012e243d, 0x03e6bab1, 0x03aafc44, 0x00435acb, 0x02d830bb, 0x00368aa0, 0x01624437, 0x02bf54d0, 0x00676cb8, 0x00123c9e}}}, + {X: Field{[10]uint32{0x00679da2, 0x00c62565, 0x017edf10, 0x01ff1fc1, 0x0216ddd6, 0x004a4bb1, 0x02ded72a, 0x02f20ba8, 0x0158d4b9, 0x0000129f}}, Y: Field{[10]uint32{0x039ffe26, 0x01fd211d, 0x0228a487, 0x025258fe, 0x0371c3b4, 0x03b1c6ce, 0x031d8147, 0x032dd79a, 0x01b76702, 0x002e62b1}}}, + {X: Field{[10]uint32{0x01132896, 0x02eafe6b, 0x02c967ca, 0x02eadef1, 0x01fcb1e3, 0x03764803, 0x015ad962, 0x00780bca, 0x036df32a, 0x001121e5}}, Y: Field{[10]uint32{0x03685248, 0x0006c4ab, 0x02a7a48c, 0x016989da, 0x0306b40d, 0x0115868c, 0x009a9077, 0x02bf87bf, 0x0060d115, 0x0009ef56}}}, + {X: Field{[10]uint32{0x035732c0, 0x021934dd, 0x037aa859, 0x039c8cdd, 0x02202fe5, 0x032c425b, 0x00a5d1b7, 0x012e6d89, 0x0331f8b7, 0x0023cf33}}, Y: Field{[10]uint32{0x01b9415b, 0x02f79799, 0x00825e73, 0x01dd5216, 0x00a90e68, 0x01f394f6, 0x02f46d99, 0x0394c627, 0x013e2d39, 0x0019fc73}}}, + {X: Field{[10]uint32{0x03a2670c, 0x0055bdaf, 0x033e6e08, 0x00ae8189, 0x007400f8, 0x00cd40c9, 0x02a9caa8, 0x020de22d, 0x02c28bcb, 0x0012934e}}, Y: Field{[10]uint32{0x02c1764d, 0x02e7ff75, 0x03eed808, 0x0132fca6, 0x01493059, 0x03bc0ae7, 0x027711dd, 0x01693c5f, 0x011c0184, 0x001c2aee}}}, + {X: Field{[10]uint32{0x007c4b65, 0x00d3ab72, 0x032a9ccf, 0x0228781e, 0x0196f880, 0x0019b392, 0x036c5e2c, 0x00071ff1, 0x01c4cbd0, 0x003b9f5a}}, Y: Field{[10]uint32{0x0136a95a, 0x023d13b4, 0x002e523e, 0x0266eba5, 0x02c33e89, 0x00c3cbb8, 0x0192abf0, 0x004e0868, 0x026ec1a4, 0x003b3218}}}, + {X: Field{[10]uint32{0x00b24aa7, 0x01abf893, 0x01c530d9, 0x0318e4d1, 0x00903108, 0x03fe3f86, 0x02e6fd89, 0x00600b0e, 0x01190ae9, 0x0017decb}}, Y: Field{[10]uint32{0x02693d7d, 0x0201d0d2, 0x01d0c6d7, 0x01c24f20, 0x03ce8deb, 0x03399f11, 0x023f80a3, 0x03caccc2, 0x0200c4fd, 0x0001dc0d}}}, + {X: Field{[10]uint32{0x03004130, 0x018cb5ff, 0x02b09842, 0x00ce070d, 0x0249fd86, 0x01532d6a, 0x02a14e52, 0x0061ac99, 0x01b5f72d, 0x001435dd}}, Y: Field{[10]uint32{0x036e406d, 0x02e31937, 0x024c3456, 0x0117bbda, 0x032975d9, 0x0004018f, 0x01724346, 0x02955f14, 0x023b0f4e, 0x000d007b}}}, + {X: Field{[10]uint32{0x037fb8bd, 0x006f17cb, 0x0090a419, 0x02857f90, 0x007bc464, 0x025221b6, 0x02c24e6d, 0x024340ab, 0x0051339d, 0x00144e5d}}, Y: Field{[10]uint32{0x03908c0f, 0x012b0b60, 0x00d5a809, 0x034f8fe6, 0x03fafc32, 0x03a05711, 0x008fefda, 0x00efcd2e, 0x003e4764, 0x003f35c5}}}, + {X: Field{[10]uint32{0x00889f3f, 0x007e0e4d, 0x01da7f2a, 0x022d1425, 0x03c4feb2, 0x005a6c3a, 0x02a3469b, 0x00465887, 0x0026f1b2, 0x0021e644}}, Y: Field{[10]uint32{0x03bb792b, 0x00b7e6f0, 0x0037b49e, 0x006fca18, 0x01e932f6, 0x005fc9e7, 0x032f2cb7, 0x00765884, 0x014ca5a9, 0x00377aae}}}, + {X: Field{[10]uint32{0x0236ca73, 0x01d2457b, 0x033ede2b, 0x034daeef, 0x03eac864, 0x03c05221, 0x0029112b, 0x037ee2a9, 0x02d62bfb, 0x0033e0c5}}, Y: Field{[10]uint32{0x02c25534, 0x0248650b, 0x0310f5b4, 0x02636235, 0x001c9615, 0x0037329a, 0x00445089, 0x0275cf8e, 0x018deb5d, 0x00027fad}}}, + {X: Field{[10]uint32{0x019c8f0a, 0x036611af, 0x00e64afc, 0x00b22f61, 0x00af3e9f, 0x0300ea1f, 0x0126603b, 0x02913f0e, 0x00ed297b, 0x001b8845}}, Y: Field{[10]uint32{0x016a2c9b, 0x02452374, 0x0195ebd7, 0x01d743e5, 0x01090bec, 0x00317647, 0x026d50f8, 0x001b89f6, 0x020cc26f, 0x00015646}}}, + {X: Field{[10]uint32{0x0352f97d, 0x024df5ad, 0x036613c8, 0x031d7cd1, 0x025a2efb, 0x0233e985, 0x039d2866, 0x02d27794, 0x029a4c4b, 0x00218437}}, Y: Field{[10]uint32{0x031b1af2, 0x01f73507, 0x003e0805, 0x027d5155, 0x0257ab4d, 0x014cfe67, 0x03cd99b2, 0x002ef24d, 0x03a02b63, 0x0034c665}}}, + {X: Field{[10]uint32{0x00cb3e41, 0x03f77f18, 0x012c0997, 0x013cc22e, 0x03143d08, 0x027a63b4, 0x010cec0a, 0x020a7cf8, 0x00e69dd4, 0x0039e89b}}, Y: Field{[10]uint32{0x032cfd51, 0x02a50873, 0x003e20e8, 0x0301083a, 0x00d0a6b2, 0x02abeec6, 0x01b006a1, 0x02612d1c, 0x02300fa7, 0x000a9d63}}}, + }, + { + {X: Field{[10]uint32{0x00cb3e41, 0x03f77f18, 0x012c0997, 0x013cc22e, 0x03143d08, 0x027a63b4, 0x010cec0a, 0x020a7cf8, 0x00e69dd4, 0x0039e89b}}, Y: Field{[10]uint32{0x032cfd51, 0x02a50873, 0x003e20e8, 0x0301083a, 0x00d0a6b2, 0x02abeec6, 0x01b006a1, 0x02612d1c, 0x02300fa7, 0x000a9d63}}}, + {X: Field{[10]uint32{0x034ae861, 0x0396e45e, 0x02fa9d97, 0x03935b8c, 0x01203c35, 0x01c8227d, 0x038bfb67, 0x03e34034, 0x02ba036b, 0x003d72be}}, Y: Field{[10]uint32{0x0182239c, 0x0308e703, 0x005f3cc9, 0x027154bc, 0x019b3b2a, 0x01020e45, 0x03f99046, 0x01b605ef, 0x038a022a, 0x00067a0e}}}, + {X: Field{[10]uint32{0x02ee42db, 0x027f4afe, 0x0314a70f, 0x016d1cc1, 0x01d9bbbc, 0x007b2ff0, 0x03b6edb9, 0x024543f1, 0x03e7d9b5, 0x00330d09}}, Y: Field{[10]uint32{0x01d87bdb, 0x00a70045, 0x0022dc62, 0x02b639c9, 0x0010e5cb, 0x02c85480, 0x01e3fd3f, 0x031a8621, 0x0041a521, 0x003a8926}}}, + {X: Field{[10]uint32{0x012a9651, 0x035335ef, 0x0182084f, 0x02712532, 0x028f9e50, 0x01fa0150, 0x01f5156d, 0x00fc7c4b, 0x0024ceb6, 0x003a4e24}}, Y: Field{[10]uint32{0x02786824, 0x0378add7, 0x00bfefef, 0x033b19dc, 0x018d7110, 0x019c6abc, 0x0287abaf, 0x019657e4, 0x00872372, 0x0021921a}}}, + {X: Field{[10]uint32{0x02d4a086, 0x00d9b19f, 0x0010eff4, 0x00563a71, 0x00b1d75c, 0x02f2d73d, 0x003c585f, 0x011177b2, 0x01bacd98, 0x002523c1}}, Y: Field{[10]uint32{0x022bca4b, 0x006003e7, 0x022d1a2a, 0x029c70fe, 0x011c2328, 0x00044e50, 0x03450a66, 0x00a8ce0b, 0x009ffb5a, 0x0021932a}}}, + {X: Field{[10]uint32{0x0296e4f1, 0x029c594b, 0x00030cb0, 0x01802ba0, 0x02ff5f01, 0x00d7bf32, 0x01777083, 0x0065f880, 0x008f0198, 0x0015aec5}}, Y: Field{[10]uint32{0x02b0582e, 0x027c067b, 0x030eb588, 0x0348012b, 0x037313d1, 0x038c3aa7, 0x0303ed8b, 0x0028cefa, 0x00a56130, 0x00282561}}}, + {X: Field{[10]uint32{0x03542c21, 0x02fa9b2d, 0x00c15c0c, 0x034a3a99, 0x03ae19f4, 0x01475b50, 0x016fc454, 0x026b2419, 0x01629291, 0x00096106}}, Y: Field{[10]uint32{0x032bfabf, 0x02f8c659, 0x02d7b3be, 0x021b930a, 0x01f3e3a1, 0x031d44f5, 0x025daa4c, 0x00912007, 0x031f1cdb, 0x003f2cd6}}}, + {X: Field{[10]uint32{0x00ddab8b, 0x03506b9f, 0x00e6fcf2, 0x00494f1a, 0x039f0e4d, 0x020b430d, 0x0116900d, 0x0095afb4, 0x01d87829, 0x00099156}}, Y: Field{[10]uint32{0x001de473, 0x0192d140, 0x031e6c9f, 0x02bce72b, 0x037a8631, 0x00d01cb5, 0x03bc6370, 0x0144b3bd, 0x011926d3, 0x001e796f}}}, + {X: Field{[10]uint32{0x001ecbf8, 0x01187d03, 0x017ca43c, 0x037a6bbb, 0x036489f0, 0x007a1087, 0x029754cc, 0x0314948a, 0x01c41373, 0x001f84b3}}, Y: Field{[10]uint32{0x00bed615, 0x016e336c, 0x019f59d4, 0x00763f87, 0x01c969f6, 0x03934496, 0x03f94dab, 0x0320dc50, 0x0388888d, 0x001c4a13}}}, + {X: Field{[10]uint32{0x018a26c1, 0x028a3ee2, 0x0304ae2d, 0x0285ce4e, 0x019a954f, 0x0309b871, 0x02351579, 0x014aedba, 0x00fd373b, 0x002da832}}, Y: Field{[10]uint32{0x0278217c, 0x0143b6a2, 0x01a06f55, 0x03a162ad, 0x00fc94a5, 0x02f69feb, 0x0101e3fe, 0x01d2526a, 0x03bfda03, 0x0017bc64}}}, + {X: Field{[10]uint32{0x00557d86, 0x01994705, 0x03ff417e, 0x011e3999, 0x031cfeec, 0x028169b3, 0x02b91ca7, 0x010a99dc, 0x02ff2a37, 0x0012e3b0}}, Y: Field{[10]uint32{0x01167eb9, 0x026c646d, 0x03692bdd, 0x03bc3f0f, 0x0328d5f2, 0x0149eb17, 0x024072de, 0x015eac52, 0x03ff04c1, 0x003f79b0}}}, + {X: Field{[10]uint32{0x01f23d1f, 0x015fd660, 0x036d8a4c, 0x035c8300, 0x02b6b25f, 0x03f62829, 0x03d489e1, 0x002eeef4, 0x00153d67, 0x002ce63a}}, Y: Field{[10]uint32{0x032ff3fc, 0x00faffe0, 0x016cd158, 0x022b4985, 0x02ea791d, 0x02c02e94, 0x037feb2f, 0x03d1fc1f, 0x0022572d, 0x001a7d67}}}, + {X: Field{[10]uint32{0x0380763c, 0x020b4ed1, 0x0291d52b, 0x017a4995, 0x025f8a6d, 0x025eb01f, 0x02436dc6, 0x00e9094c, 0x01073396, 0x003f3570}}, Y: Field{[10]uint32{0x00e851cb, 0x039d080e, 0x023a4b54, 0x00b9c591, 0x00b119b2, 0x03dcb8e3, 0x0320db35, 0x00b118ed, 0x03e2e552, 0x0006376a}}}, + {X: Field{[10]uint32{0x03e9fc8d, 0x0311e98c, 0x028ad2b1, 0x0026093c, 0x0348b848, 0x0118c69c, 0x00d0b205, 0x0177fe9b, 0x01c1bb42, 0x0018d283}}, Y: Field{[10]uint32{0x033f87b6, 0x01fcc2c9, 0x00616958, 0x02863b57, 0x03519ad5, 0x03792a73, 0x0205a657, 0x012db2bf, 0x021fe75a, 0x0035d6f8}}}, + {X: Field{[10]uint32{0x018ef686, 0x00ef8c17, 0x02e66bce, 0x03d0089c, 0x03f68e48, 0x02099b94, 0x038a5daf, 0x032f9488, 0x00ee5843, 0x002403cb}}, Y: Field{[10]uint32{0x0121a8cf, 0x029259f8, 0x016d5073, 0x03d0f245, 0x00596cdf, 0x00d27444, 0x01c551b1, 0x01096b58, 0x0155ec60, 0x001ccab0}}}, + {X: Field{[10]uint32{0x026b80ef, 0x00a7acf7, 0x0024f3cf, 0x0259f5e5, 0x0171cbcb, 0x00ef2f71, 0x03540c22, 0x00bb2348, 0x020ee366, 0x002d9167}}, Y: Field{[10]uint32{0x0271ba45, 0x02fc2d86, 0x01b2ff30, 0x01b5238d, 0x03c4b3ae, 0x0159876c, 0x01adf16e, 0x0381b787, 0x036d06f3, 0x00019f21}}}, + }, + { + {X: Field{[10]uint32{0x026b80ef, 0x00a7acf7, 0x0024f3cf, 0x0259f5e5, 0x0171cbcb, 0x00ef2f71, 0x03540c22, 0x00bb2348, 0x020ee366, 0x002d9167}}, Y: Field{[10]uint32{0x0271ba45, 0x02fc2d86, 0x01b2ff30, 0x01b5238d, 0x03c4b3ae, 0x0159876c, 0x01adf16e, 0x0381b787, 0x036d06f3, 0x00019f21}}}, + {X: Field{[10]uint32{0x033eb51f, 0x03bcdd40, 0x00211253, 0x01daf9e7, 0x03b68905, 0x007d0564, 0x0136f730, 0x00f22393, 0x00f0d982, 0x0039763a}}, Y: Field{[10]uint32{0x0262a2d9, 0x016f6596, 0x0354979d, 0x011b67c3, 0x00e509dc, 0x023fbbbc, 0x0316a57d, 0x00f812ae, 0x01b7861e, 0x0013707a}}}, + {X: Field{[10]uint32{0x019888e9, 0x033c9e4c, 0x00a8b439, 0x01afc912, 0x033d12ba, 0x0259a059, 0x0260d302, 0x029b8b77, 0x02773ac3, 0x0007e43a}}, Y: Field{[10]uint32{0x03113b79, 0x037f25fb, 0x022e656f, 0x03fb9654, 0x00213751, 0x007ae5aa, 0x00153d27, 0x02843a56, 0x027c15da, 0x00226f8d}}}, + {X: Field{[10]uint32{0x03155e64, 0x019d9203, 0x0011737a, 0x013ea28c, 0x01ab66be, 0x006eb837, 0x02b0f732, 0x0230f715, 0x03f77dbc, 0x002a7289}}, Y: Field{[10]uint32{0x021b3297, 0x03cccf15, 0x030ae1f3, 0x02086f2b, 0x00875d41, 0x0300b401, 0x017d2246, 0x00535346, 0x035678fb, 0x003d2ecc}}}, + {X: Field{[10]uint32{0x0162222c, 0x03bedbcd, 0x032c6085, 0x01e6479b, 0x02de0344, 0x00d2d4ae, 0x0302bad3, 0x0382b5b9, 0x014dedff, 0x0004e939}}, Y: Field{[10]uint32{0x00200145, 0x0059a32a, 0x004c08cb, 0x01deb724, 0x02d4f9c5, 0x03582694, 0x00ac2f81, 0x03a04ecb, 0x014e5816, 0x0032759f}}}, + {X: Field{[10]uint32{0x01bf6c42, 0x02acf770, 0x0075393e, 0x026c4662, 0x02f7793d, 0x01b3b9d3, 0x03465481, 0x00171fb9, 0x033cd6c1, 0x00340b86}}, Y: Field{[10]uint32{0x03bc54cc, 0x018ca3e1, 0x02aac133, 0x026e4c6d, 0x02bca587, 0x00349149, 0x0332270d, 0x00896049, 0x00f3ca8e, 0x002682dd}}}, + {X: Field{[10]uint32{0x003b46bb, 0x0393703d, 0x02525437, 0x018feb24, 0x0112ed3a, 0x0211576f, 0x0007c05d, 0x02ab7475, 0x02bf233c, 0x00186647}}, Y: Field{[10]uint32{0x0020a848, 0x03d64073, 0x00d8ef48, 0x027294bb, 0x011ca872, 0x01beeb7c, 0x02f38716, 0x03924a54, 0x0308f3fd, 0x00007178}}}, + {X: Field{[10]uint32{0x02ee247c, 0x02f18a75, 0x00ee06d4, 0x0211fd47, 0x011f478e, 0x0073f9d6, 0x03a10561, 0x035fc97a, 0x01800686, 0x001a3edc}}, Y: Field{[10]uint32{0x0201865d, 0x03e08b46, 0x03c9dae1, 0x002c131c, 0x039a8d58, 0x0006c301, 0x03354275, 0x0258d9cd, 0x023462dd, 0x003344b4}}}, + {X: Field{[10]uint32{0x021add3b, 0x02f8f774, 0x03d8f7e5, 0x013d15c9, 0x018b9a94, 0x03458984, 0x0039cdb0, 0x034e1d24, 0x02a4b787, 0x003a89eb}}, Y: Field{[10]uint32{0x028ce7dd, 0x038a476d, 0x01be71b5, 0x035a3938, 0x0278b212, 0x00970bd8, 0x023ceb23, 0x005f795c, 0x01e6e42a, 0x0031c3fc}}}, + {X: Field{[10]uint32{0x02da1f54, 0x016af6f8, 0x025df934, 0x03088c50, 0x021b2b52, 0x024d1445, 0x03550ab1, 0x0183ae61, 0x03b23df2, 0x001c4dfd}}, Y: Field{[10]uint32{0x01c3edbc, 0x02350db3, 0x01bb84af, 0x03551b3f, 0x03ebf081, 0x03c98029, 0x00dacb17, 0x0201d397, 0x02d80435, 0x0017f9e2}}}, + {X: Field{[10]uint32{0x011ff757, 0x02be2ed8, 0x0226e6e8, 0x01d07130, 0x029b4ce9, 0x01b8adb6, 0x01010f8b, 0x03f552ea, 0x01356b7f, 0x00165194}}, Y: Field{[10]uint32{0x014d031a, 0x019bb2a2, 0x03e3b28a, 0x01edfeff, 0x01961bbc, 0x017101be, 0x02038d01, 0x009d4010, 0x020ce5df, 0x000d844d}}}, + {X: Field{[10]uint32{0x036c15c2, 0x03d1fc63, 0x00f1ca1e, 0x005323ce, 0x003de764, 0x027450d2, 0x01739813, 0x01d5ffa8, 0x0052bca1, 0x002115aa}}, Y: Field{[10]uint32{0x03174134, 0x03bf0ca2, 0x03671ff1, 0x002615be, 0x034cc90f, 0x0041e79f, 0x0349ec37, 0x00b37bf4, 0x0246d484, 0x00386e76}}}, + {X: Field{[10]uint32{0x036160b5, 0x009628d8, 0x02bc0676, 0x0091c39f, 0x00ccc53f, 0x000247b0, 0x003af797, 0x00ca43a1, 0x023915f7, 0x0005ac9b}}, Y: Field{[10]uint32{0x00a1dc0e, 0x0097efd6, 0x03ef8146, 0x02b1c2e8, 0x00e1363a, 0x018d9535, 0x03643524, 0x03be2ed8, 0x025a6302, 0x000183d5}}}, + {X: Field{[10]uint32{0x021b793e, 0x0077a4e3, 0x025183d6, 0x028ac34b, 0x01d36aee, 0x033eab93, 0x002eccf2, 0x00739970, 0x017c9835, 0x0013c545}}, Y: Field{[10]uint32{0x03ba9889, 0x03307f70, 0x007aab4f, 0x012cd529, 0x02c0daff, 0x03352833, 0x01da9db9, 0x02e4e7f2, 0x0366079d, 0x00302538}}}, + {X: Field{[10]uint32{0x03b32db8, 0x0134a24d, 0x0391f396, 0x0127d91d, 0x01c91ed7, 0x010b3aa1, 0x02a143c8, 0x027e4c6f, 0x0295c455, 0x000092d4}}, Y: Field{[10]uint32{0x0264f760, 0x0153eaaa, 0x001a9594, 0x0044816e, 0x0062ab68, 0x031796fa, 0x02e2821c, 0x00c271ed, 0x038f5bff, 0x001827fb}}}, + {X: Field{[10]uint32{0x016943e8, 0x0283d6d2, 0x005a5ded, 0x0319f9cf, 0x031d6f1f, 0x0063c188, 0x03234aa1, 0x02e101e4, 0x00c8280b, 0x0035a2a0}}, Y: Field{[10]uint32{0x03133120, 0x0321099a, 0x0295a294, 0x023de114, 0x035b0e7b, 0x01ec38a2, 0x00b1f917, 0x021b4031, 0x01fff4b5, 0x0036e2ea}}}, + }, + { + {X: Field{[10]uint32{0x016943e8, 0x0283d6d2, 0x005a5ded, 0x0319f9cf, 0x031d6f1f, 0x0063c188, 0x03234aa1, 0x02e101e4, 0x00c8280b, 0x0035a2a0}}, Y: Field{[10]uint32{0x03133120, 0x0321099a, 0x0295a294, 0x023de114, 0x035b0e7b, 0x01ec38a2, 0x00b1f917, 0x021b4031, 0x01fff4b5, 0x0036e2ea}}}, + {X: Field{[10]uint32{0x0012b6fd, 0x02888b29, 0x02b828bd, 0x00f1bdc0, 0x00aced05, 0x01d48dcf, 0x02f8efb3, 0x0102f900, 0x009c677a, 0x003c5a90}}, Y: Field{[10]uint32{0x00a052da, 0x036b9dfb, 0x03ca4268, 0x0164927a, 0x02165406, 0x0138c393, 0x026a75a7, 0x009e675e, 0x01171453, 0x000a904c}}}, + {X: Field{[10]uint32{0x00a1c4f9, 0x010aa863, 0x0228235b, 0x00d32adf, 0x004f4efe, 0x0187c5bd, 0x000b83da, 0x01ca3131, 0x038f22bd, 0x001e057d}}, Y: Field{[10]uint32{0x0378bc15, 0x007a8dad, 0x011e19ab, 0x039855df, 0x015cb42d, 0x011630d7, 0x0193cf31, 0x02bda9f7, 0x01e8cd39, 0x00307180}}}, + {X: Field{[10]uint32{0x026dd4e4, 0x0282db8c, 0x018325c1, 0x00bdafb6, 0x01b89f4f, 0x025dbe13, 0x0237f699, 0x01bd0bef, 0x0106ab76, 0x0010552d}}, Y: Field{[10]uint32{0x035ded1c, 0x0164a541, 0x02dd46c8, 0x03674788, 0x02414ea9, 0x004097fd, 0x006e44d6, 0x02622253, 0x035043c5, 0x0008eb41}}}, + {X: Field{[10]uint32{0x028c8530, 0x01b870fb, 0x00d8e6d2, 0x0207be3d, 0x01512df6, 0x005a9b1b, 0x0377c640, 0x01005db8, 0x03cda0ec, 0x0030e49c}}, Y: Field{[10]uint32{0x018446c7, 0x00c3c3de, 0x01715c40, 0x02f68bbb, 0x0050edfc, 0x0070c666, 0x001d3944, 0x00f23a74, 0x02425743, 0x0023106f}}}, + {X: Field{[10]uint32{0x03ed5996, 0x0133a2d0, 0x02f53bde, 0x01664d82, 0x006831fe, 0x00a06e49, 0x02fbc903, 0x0293a924, 0x03e9fe99, 0x000691ad}}, Y: Field{[10]uint32{0x00c85cae, 0x013b447a, 0x0345c2ee, 0x02a7bd49, 0x01508794, 0x0018fafd, 0x03ee084a, 0x03715c38, 0x001ea3f1, 0x001a0f3a}}}, + {X: Field{[10]uint32{0x037a26c1, 0x00902ec8, 0x036a531f, 0x0163036f, 0x01166c6e, 0x00740ec9, 0x0122431c, 0x0046c09d, 0x0047f584, 0x00368c5d}}, Y: Field{[10]uint32{0x00f74d6f, 0x020dbb3b, 0x01525f51, 0x03175ea0, 0x03d36836, 0x0096762d, 0x0384167c, 0x0231a748, 0x03b87f5d, 0x001d4ee5}}}, + {X: Field{[10]uint32{0x037f0246, 0x0069e98f, 0x03ddf4c5, 0x0127f1c9, 0x0293e86e, 0x02d655ba, 0x00a8d4d0, 0x02570420, 0x012769cc, 0x002dcf19}}, Y: Field{[10]uint32{0x022a407b, 0x0394593a, 0x014e5597, 0x03931b95, 0x021a0d72, 0x016db07a, 0x0135893c, 0x032a752d, 0x03107174, 0x002699f6}}}, + {X: Field{[10]uint32{0x0339dc49, 0x018a2a4d, 0x01603d2b, 0x03699bd5, 0x02239392, 0x02ffc8c6, 0x024ac508, 0x0039b041, 0x02cb02af, 0x001a92f9}}, Y: Field{[10]uint32{0x02edd5cf, 0x028ae77c, 0x00a4d3e6, 0x0132c529, 0x00ab7e2b, 0x003ea016, 0x00166e36, 0x001d65f7, 0x03aa2a89, 0x003c5763}}}, + {X: Field{[10]uint32{0x00f8fb8c, 0x026fe776, 0x01e148ad, 0x026ea96f, 0x014cdc2b, 0x031cc044, 0x012facb5, 0x00803254, 0x027060d8, 0x000d966e}}, Y: Field{[10]uint32{0x00c8a3d1, 0x011ae31f, 0x0313575e, 0x0353912e, 0x031e142e, 0x031d261f, 0x01725f8e, 0x00685c4e, 0x01e806e0, 0x0013b9ea}}}, + {X: Field{[10]uint32{0x02987fac, 0x03a28311, 0x02f6798b, 0x021902a1, 0x008bc90f, 0x03b2628f, 0x02982603, 0x01fc4d13, 0x029f13ae, 0x00007df1}}, Y: Field{[10]uint32{0x01174c68, 0x0079ce06, 0x03c263f9, 0x038867da, 0x01cb7f5d, 0x00a6adbe, 0x031036e3, 0x0288b796, 0x003f36fd, 0x002753b3}}}, + {X: Field{[10]uint32{0x022e607b, 0x034d673b, 0x036aa1f4, 0x03b1b03c, 0x0388aa1e, 0x015ff74a, 0x01111f56, 0x01dcb083, 0x0367fd31, 0x0001dccf}}, Y: Field{[10]uint32{0x00614763, 0x03cc4773, 0x017d26a2, 0x03816f80, 0x0089e3bd, 0x02ec55bd, 0x0263a8c5, 0x020a17ab, 0x00fbac17, 0x003f67fa}}}, + {X: Field{[10]uint32{0x02daba4d, 0x00e86f5d, 0x016261d3, 0x003880c6, 0x039c65fb, 0x023e8af2, 0x03062edd, 0x034e072d, 0x0001761f, 0x00155fa5}}, Y: Field{[10]uint32{0x03a52316, 0x01d286ed, 0x0190a513, 0x03d7e90d, 0x02c5e9b8, 0x01732f21, 0x0135cfa1, 0x029f811b, 0x033a601f, 0x001e9fa3}}}, + {X: Field{[10]uint32{0x0005fbdd, 0x00b6734f, 0x001396e2, 0x0149d392, 0x0279589d, 0x01abe80c, 0x0120654b, 0x003120e2, 0x010a0031, 0x0038f91d}}, Y: Field{[10]uint32{0x0135b883, 0x0088c745, 0x02ffbcba, 0x02ff173e, 0x00b46587, 0x01868481, 0x02350499, 0x00964014, 0x0301abad, 0x0003e9e5}}}, + {X: Field{[10]uint32{0x01f5341a, 0x03d4bfca, 0x036b8038, 0x00b19a58, 0x019cc7a3, 0x01ec4050, 0x029d40ea, 0x0216a4ec, 0x02821998, 0x000eb6b6}}, Y: Field{[10]uint32{0x0186c6cc, 0x016024d9, 0x00fbcb51, 0x0396d17a, 0x03e9d6d2, 0x01aac405, 0x02e35bf3, 0x00da7d54, 0x02228999, 0x002ffa87}}}, + {X: Field{[10]uint32{0x028d3d5d, 0x016603f0, 0x01cea409, 0x02e5cd12, 0x009612ae, 0x001e8c2c, 0x01c02709, 0x0201094b, 0x017df65c, 0x000c92bb}}, Y: Field{[10]uint32{0x02ab7c84, 0x00892be5, 0x02843967, 0x0031f8cc, 0x0319213b, 0x02bb07d3, 0x030c0c35, 0x007cbfc4, 0x025774b6, 0x0019228d}}}, + }, + { + {X: Field{[10]uint32{0x028d3d5d, 0x016603f0, 0x01cea409, 0x02e5cd12, 0x009612ae, 0x001e8c2c, 0x01c02709, 0x0201094b, 0x017df65c, 0x000c92bb}}, Y: Field{[10]uint32{0x02ab7c84, 0x00892be5, 0x02843967, 0x0031f8cc, 0x0319213b, 0x02bb07d3, 0x030c0c35, 0x007cbfc4, 0x025774b6, 0x0019228d}}}, + {X: Field{[10]uint32{0x02919749, 0x00e0e06c, 0x01b1fa8f, 0x012a3783, 0x03f72b3e, 0x02035c80, 0x01326818, 0x012408a3, 0x031ea26f, 0x000cb24c}}, Y: Field{[10]uint32{0x0290b5e3, 0x03a5ec3c, 0x02b09631, 0x02f6b8e6, 0x00268a4a, 0x01bcf6ee, 0x01a2f02b, 0x0272d5a5, 0x032b3420, 0x0035f349}}}, + {X: Field{[10]uint32{0x03d53ed3, 0x0245d60b, 0x02ccef5c, 0x03ee7695, 0x01163f74, 0x0077df12, 0x00f60b93, 0x01cab56e, 0x03d59967, 0x00082102}}, Y: Field{[10]uint32{0x027a7132, 0x010ff946, 0x00899871, 0x01ce539c, 0x025487c4, 0x01aebeb0, 0x03bd476a, 0x02090d21, 0x0097cec1, 0x003ca64d}}}, + {X: Field{[10]uint32{0x039795e4, 0x0308949e, 0x02b8e1e1, 0x02db8611, 0x0069c161, 0x03fb1ac7, 0x002f6a70, 0x00de1528, 0x033b3b98, 0x003aca4b}}, Y: Field{[10]uint32{0x0253a0fe, 0x03a74beb, 0x01c6f5b7, 0x01d42444, 0x0357131d, 0x005160d6, 0x016634af, 0x02fa005a, 0x025a96ee, 0x002310f0}}}, + {X: Field{[10]uint32{0x00a35b35, 0x00b2ed62, 0x0121edbd, 0x02297028, 0x011ab5d8, 0x01623aff, 0x013d029e, 0x00e6eef4, 0x03f60eb3, 0x0039adaf}}, Y: Field{[10]uint32{0x001007bd, 0x00a4f6e7, 0x019c7c57, 0x0274efa6, 0x01fe3b6c, 0x00d65877, 0x02f43e38, 0x034bcc99, 0x02bd3300, 0x000697fc}}}, + {X: Field{[10]uint32{0x0032f9a2, 0x02e38a48, 0x006ccc48, 0x0143e87f, 0x03ce566f, 0x007fe3d8, 0x02374cb3, 0x009903b4, 0x02bd9a6b, 0x00096ab1}}, Y: Field{[10]uint32{0x0351d4f0, 0x008c284a, 0x033d9e76, 0x02ef1067, 0x02559883, 0x013c643d, 0x0332f54f, 0x0151b05b, 0x023ba644, 0x003d69b1}}}, + {X: Field{[10]uint32{0x00360dd3, 0x03be34b0, 0x022090d4, 0x00db6143, 0x0347a8a8, 0x038338ee, 0x030b8086, 0x0266ca22, 0x03745be4, 0x003814c5}}, Y: Field{[10]uint32{0x0024f87b, 0x03b3644f, 0x03dc2b2a, 0x037a6040, 0x0061b987, 0x016da805, 0x0009582b, 0x00bce736, 0x0371a5d9, 0x0037070e}}}, + {X: Field{[10]uint32{0x01303fdd, 0x00e755e2, 0x02d35aea, 0x01fc6747, 0x014d7145, 0x00127ef8, 0x020d4310, 0x017bcb98, 0x0201df3b, 0x0029968e}}, Y: Field{[10]uint32{0x02e68703, 0x0112a340, 0x013cadad, 0x00093ebb, 0x0286861d, 0x003b4b1d, 0x0343d8d9, 0x0171bee3, 0x00940cff, 0x001e63a8}}}, + {X: Field{[10]uint32{0x0098dfea, 0x011998b4, 0x038797c1, 0x0324ba99, 0x03fadcb3, 0x020e9795, 0x018e5d2a, 0x01b16780, 0x033a7788, 0x002a054e}}, Y: Field{[10]uint32{0x026d892f, 0x026a77db, 0x034158a4, 0x03dd0b6b, 0x03b1b5e0, 0x01e14f80, 0x018db9c5, 0x0183f14f, 0x016461d0, 0x000a91ce}}}, + {X: Field{[10]uint32{0x024c9489, 0x00c354b4, 0x00a98616, 0x039b8539, 0x00c0aef4, 0x01ba754a, 0x027887ff, 0x019f0a68, 0x0315d9d5, 0x0018a06e}}, Y: Field{[10]uint32{0x01f42bc6, 0x01fc9ae7, 0x033ad918, 0x01374c86, 0x0145fd96, 0x01ba6efd, 0x02738f45, 0x02a19648, 0x01a0908d, 0x000bf4f1}}}, + {X: Field{[10]uint32{0x03cecfa5, 0x039de922, 0x03b020a7, 0x03686c5a, 0x032a0d62, 0x00e3b68e, 0x034695c6, 0x02b76b7a, 0x03b30fec, 0x0013c170}}, Y: Field{[10]uint32{0x01d37b53, 0x034092a5, 0x008cd2ec, 0x00c7c06d, 0x01447ee4, 0x01654d2e, 0x01632361, 0x0109beb7, 0x01ea603d, 0x0014e926}}}, + {X: Field{[10]uint32{0x00445a7a, 0x00c72ea5, 0x01ec5901, 0x03c2073c, 0x01df9535, 0x01807235, 0x02f11b6c, 0x031afec4, 0x03bc9f06, 0x003e0bfb}}, Y: Field{[10]uint32{0x002a7a98, 0x02b38619, 0x011e5963, 0x02d91903, 0x00b51c83, 0x02502d29, 0x003942c1, 0x01ad9d54, 0x03bdc6fb, 0x00252ecd}}}, + {X: Field{[10]uint32{0x004b96aa, 0x039d9642, 0x03cce461, 0x00d548aa, 0x02d02986, 0x028ee603, 0x02405e1a, 0x02a46f89, 0x02b99f67, 0x00364c26}}, Y: Field{[10]uint32{0x02b28a86, 0x0313cdf0, 0x02978f26, 0x03eebf3f, 0x03d3b6c9, 0x009d32d7, 0x0210f066, 0x03155f5f, 0x032a9b4e, 0x001bbe66}}}, + {X: Field{[10]uint32{0x02b7d2d5, 0x03750ac5, 0x02a66f6f, 0x0134755b, 0x022637b8, 0x00bbd40b, 0x030f3d32, 0x01080f20, 0x03aa9783, 0x0028a16a}}, Y: Field{[10]uint32{0x0001f99c, 0x01754be4, 0x013e9c40, 0x0086dadd, 0x02d86573, 0x0042cb8a, 0x03952dfe, 0x01eb1a4a, 0x0292cd1b, 0x00395ba5}}}, + {X: Field{[10]uint32{0x038fcf0e, 0x02e34167, 0x026facf7, 0x03f79f12, 0x01d65b6f, 0x03aa8d04, 0x01c3446d, 0x00b4d6ea, 0x00a13856, 0x001f561f}}, Y: Field{[10]uint32{0x00bc9459, 0x03068276, 0x0380a501, 0x002b4c8d, 0x00c46390, 0x033f5ab4, 0x023400b6, 0x0131849c, 0x00038830, 0x0029ca57}}}, + {X: Field{[10]uint32{0x01054c96, 0x02f4dcff, 0x00a888e8, 0x00eea347, 0x00eec414, 0x017fb977, 0x011dfdbe, 0x03987db5, 0x014919cd, 0x00137e70}}, Y: Field{[10]uint32{0x02d10d5d, 0x02eb01b2, 0x0090192e, 0x03370a21, 0x00b5d506, 0x02876175, 0x00974c23, 0x021ca014, 0x0051092d, 0x00000d7b}}}, + }, + { + {X: Field{[10]uint32{0x01054c96, 0x02f4dcff, 0x00a888e8, 0x00eea347, 0x00eec414, 0x017fb977, 0x011dfdbe, 0x03987db5, 0x014919cd, 0x00137e70}}, Y: Field{[10]uint32{0x02d10d5d, 0x02eb01b2, 0x0090192e, 0x03370a21, 0x00b5d506, 0x02876175, 0x00974c23, 0x021ca014, 0x0051092d, 0x00000d7b}}}, + {X: Field{[10]uint32{0x01a49e04, 0x01ac3f07, 0x00d70c0c, 0x015395ea, 0x00e9de45, 0x012e1c22, 0x01317d4e, 0x02663349, 0x02d8d2cc, 0x003b4cb2}}, Y: Field{[10]uint32{0x001db9e0, 0x0048345f, 0x02b7db63, 0x02b2d27e, 0x0352da9f, 0x02167482, 0x001ca375, 0x00081295, 0x035f1d03, 0x0004a7fb}}}, + {X: Field{[10]uint32{0x01ef001d, 0x00897697, 0x0227ef4f, 0x035a626e, 0x0321f9bb, 0x0278ed92, 0x020bd1c0, 0x00b2bc83, 0x032db27e, 0x00295268}}, Y: Field{[10]uint32{0x00624783, 0x036c69fc, 0x0305add5, 0x00a98b25, 0x02eb141e, 0x02296515, 0x00cc30ed, 0x019b2f7d, 0x027906d9, 0x001e66de}}}, + {X: Field{[10]uint32{0x0083f855, 0x0106353a, 0x00016cb7, 0x032d8f0d, 0x0228c36d, 0x031c0d9b, 0x009e4111, 0x0183c601, 0x03724d63, 0x003a086a}}, Y: Field{[10]uint32{0x01852ddf, 0x03831a96, 0x023efed4, 0x031853b0, 0x018b3b19, 0x0105b3d6, 0x010d4115, 0x00f38d9f, 0x03f863f5, 0x002b7bf2}}}, + {X: Field{[10]uint32{0x012ed4cb, 0x03bc7971, 0x02c5a05a, 0x03ecf027, 0x02c954de, 0x00d4cb9b, 0x0308bd98, 0x03b3448f, 0x0330da07, 0x001f9e63}}, Y: Field{[10]uint32{0x00bb9462, 0x005981e5, 0x037a1257, 0x006ffe7c, 0x03b17357, 0x03bcbc15, 0x01a9549d, 0x02b20c10, 0x00c4a24d, 0x00348f73}}}, + {X: Field{[10]uint32{0x0206e37a, 0x01de2b10, 0x00731a24, 0x02523141, 0x034d8c18, 0x02d689d3, 0x00e83f46, 0x02000b3d, 0x0387f286, 0x002d49aa}}, Y: Field{[10]uint32{0x00c5ccab, 0x019e3ffc, 0x0392abf3, 0x026c03e8, 0x0128ce53, 0x0029bc63, 0x00aaced6, 0x00363b57, 0x01d77810, 0x001907cd}}}, + {X: Field{[10]uint32{0x03630834, 0x00e83ef4, 0x00067fdf, 0x00a18f6b, 0x008463f1, 0x02a32042, 0x01b9e96b, 0x011e0eb5, 0x02003151, 0x000893e8}}, Y: Field{[10]uint32{0x007a2272, 0x0311cdf1, 0x00f75cd3, 0x013b0294, 0x013d6292, 0x0247427d, 0x00b70fa3, 0x036970f1, 0x0232bb3e, 0x002ef953}}}, + {X: Field{[10]uint32{0x0041742e, 0x03d67bad, 0x006e9fbf, 0x011ebce0, 0x032f14a5, 0x0325a4e9, 0x015452fb, 0x03484bd1, 0x0194e51a, 0x000fc362}}, Y: Field{[10]uint32{0x03ecadbe, 0x014d8ef3, 0x03d958c6, 0x00b0eb44, 0x031e205e, 0x011e9b82, 0x025cb0e8, 0x00f71117, 0x0023f28c, 0x003ef5db}}}, + {X: Field{[10]uint32{0x003c19d7, 0x01927456, 0x0357bb67, 0x0116b0b3, 0x02bbbb5e, 0x0108a3bc, 0x01a25cce, 0x00e7904a, 0x00cc600a, 0x0030b528}}, Y: Field{[10]uint32{0x0107928d, 0x00a2e0b1, 0x01c9772f, 0x020c5cd1, 0x0126804a, 0x03d04983, 0x0183b5f7, 0x018a5350, 0x00f9c080, 0x00196b68}}}, + {X: Field{[10]uint32{0x01848116, 0x01507957, 0x027bba04, 0x0003f278, 0x001cc9b1, 0x03a52115, 0x0072ce10, 0x034ef814, 0x019abb39, 0x0005a4de}}, Y: Field{[10]uint32{0x027198b3, 0x03d9b080, 0x012e483d, 0x03971366, 0x02c03193, 0x01b1837b, 0x02af60f1, 0x03631539, 0x033b9cb2, 0x00312710}}}, + {X: Field{[10]uint32{0x00940c9a, 0x0202b52f, 0x0233084c, 0x0384ebd0, 0x0113cf3c, 0x01137708, 0x01585e27, 0x03cc6439, 0x027ec305, 0x000bb08a}}, Y: Field{[10]uint32{0x011e7a4d, 0x0253f661, 0x01bdacd1, 0x020f668d, 0x03124051, 0x00a71ffa, 0x02e24f50, 0x01e5a130, 0x0068de33, 0x0022c769}}}, + {X: Field{[10]uint32{0x01d9123f, 0x00e0c7ae, 0x03a7d7e9, 0x006c7e22, 0x0129fc79, 0x03ef47a4, 0x015f8eca, 0x01a9bcbe, 0x038f72aa, 0x000d06d4}}, Y: Field{[10]uint32{0x00bb9a40, 0x0282abc6, 0x026ed19e, 0x029c14a8, 0x0072dee6, 0x0049366b, 0x02f2f041, 0x03167ae9, 0x024719c1, 0x00161604}}}, + {X: Field{[10]uint32{0x01683eeb, 0x003b97f7, 0x03133aa7, 0x00e28234, 0x033e36eb, 0x00212e3c, 0x01af6525, 0x0233b2ac, 0x01738f9a, 0x002bf19a}}, Y: Field{[10]uint32{0x00cd4509, 0x00a72acc, 0x01fdc91e, 0x015497b7, 0x02570bab, 0x0288e705, 0x0359c7fc, 0x009d4af0, 0x01976dd2, 0x00000b08}}}, + {X: Field{[10]uint32{0x03aad77f, 0x001ec731, 0x03b7fa7d, 0x037c3d69, 0x006d4ebb, 0x01da659c, 0x004afc3a, 0x02e378ca, 0x033ec68e, 0x0013c3aa}}, Y: Field{[10]uint32{0x00e6eea8, 0x00fc4773, 0x0092ce6c, 0x0234096b, 0x00adaa07, 0x00ab0bca, 0x008de306, 0x02dd5d68, 0x027176eb, 0x002ca3a8}}}, + {X: Field{[10]uint32{0x036f4293, 0x0007e1ed, 0x01139ea2, 0x02d594f1, 0x0210e978, 0x01c2ca0b, 0x01bc8cf3, 0x00cc2448, 0x035a9f34, 0x0034955e}}, Y: Field{[10]uint32{0x0282740a, 0x0061e894, 0x01a5f1db, 0x00e37901, 0x03e34b68, 0x02d2b487, 0x0282f06e, 0x009fc049, 0x034355e4, 0x0029e1ec}}}, + {X: Field{[10]uint32{0x001f98cd, 0x0326722b, 0x00308cbf, 0x001535fc, 0x01523489, 0x03319808, 0x02d8a9c1, 0x0121c3eb, 0x01a84a47, 0x00270e46}}, Y: Field{[10]uint32{0x00fc599d, 0x039780f5, 0x008e6be7, 0x03ddb193, 0x01905326, 0x00983990, 0x00f044bf, 0x03755d61, 0x030f4a4d, 0x00376e13}}}, + }, + { + {X: Field{[10]uint32{0x001f98cd, 0x0326722b, 0x00308cbf, 0x001535fc, 0x01523489, 0x03319808, 0x02d8a9c1, 0x0121c3eb, 0x01a84a47, 0x00270e46}}, Y: Field{[10]uint32{0x00fc599d, 0x039780f5, 0x008e6be7, 0x03ddb193, 0x01905326, 0x00983990, 0x00f044bf, 0x03755d61, 0x030f4a4d, 0x00376e13}}}, + {X: Field{[10]uint32{0x014a09ec, 0x03bededa, 0x035f0435, 0x0294fa14, 0x000cd326, 0x01724aa9, 0x002fc69d, 0x03603c29, 0x01326255, 0x000b8f01}}, Y: Field{[10]uint32{0x00c7327e, 0x0121a062, 0x02651253, 0x00f1c1ed, 0x03e048a5, 0x020bf06a, 0x01ae240b, 0x01bed6f7, 0x0091656c, 0x000007fe}}}, + {X: Field{[10]uint32{0x03b64db3, 0x026354e3, 0x0138417b, 0x0328e775, 0x02a7ede4, 0x0394ee35, 0x03bb83fb, 0x0332dd02, 0x039229bd, 0x00304508}}, Y: Field{[10]uint32{0x000259be, 0x0033a7ff, 0x027d1e23, 0x02413515, 0x01a87580, 0x03a5e2f4, 0x00ecde4f, 0x01bf0a97, 0x02dc5b48, 0x00048dfd}}}, + {X: Field{[10]uint32{0x039c7ce6, 0x03c668aa, 0x00934205, 0x005a8642, 0x00337103, 0x03893769, 0x015fb7e3, 0x00561eb8, 0x024ccfa4, 0x003a38a8}}, Y: Field{[10]uint32{0x0036267c, 0x0007ada2, 0x03a73b2c, 0x000ed709, 0x016e09e6, 0x02fb8816, 0x02f2b2b3, 0x01746d32, 0x03ce0c6f, 0x0011b260}}}, + {X: Field{[10]uint32{0x03081e46, 0x03b60d00, 0x019ea1ed, 0x02315515, 0x013a5221, 0x02498d1c, 0x02d9c2c1, 0x01c89020, 0x03f831a7, 0x001b16d2}}, Y: Field{[10]uint32{0x03fbcd70, 0x03e72e02, 0x02a62ed1, 0x0209ab08, 0x0041d0cf, 0x038af91e, 0x0347863c, 0x0350bec8, 0x03714926, 0x0032c144}}}, + {X: Field{[10]uint32{0x011349e2, 0x00cab77c, 0x00c05808, 0x03d05d49, 0x0160e3ec, 0x0106b5e3, 0x02147e9a, 0x030b9f98, 0x0324c6b9, 0x003e0160}}, Y: Field{[10]uint32{0x032025fc, 0x0311a796, 0x0288d5fa, 0x02d589b7, 0x03509498, 0x03a84488, 0x0281aa60, 0x015b3737, 0x025a0a88, 0x00257183}}}, + {X: Field{[10]uint32{0x024dcd4b, 0x0396bb11, 0x00124dca, 0x03566447, 0x010c30c7, 0x02ac4291, 0x0270665c, 0x02b792d5, 0x0056670c, 0x00387a6a}}, Y: Field{[10]uint32{0x03041f2c, 0x02d897ae, 0x02b292d0, 0x026ab285, 0x027f44d1, 0x02c95de4, 0x02c43599, 0x0314c6de, 0x02954455, 0x00158ac2}}}, + {X: Field{[10]uint32{0x02c7b3c2, 0x034e59a2, 0x01b5f5b0, 0x0248e0f5, 0x0212acaf, 0x01c00ca8, 0x030a38b1, 0x01cf0acb, 0x02ac5d85, 0x0029d526}}, Y: Field{[10]uint32{0x0287eaef, 0x03245c64, 0x016dffa0, 0x00554dc4, 0x035d6b51, 0x00651f4a, 0x01a1d70c, 0x009054cd, 0x01b90d1c, 0x002f45f4}}}, + {X: Field{[10]uint32{0x03add73c, 0x021dbf8a, 0x00b7d005, 0x03640a99, 0x008fd9cd, 0x03b70508, 0x00a74e42, 0x02c265de, 0x0257ad11, 0x00146c86}}, Y: Field{[10]uint32{0x0336d8d1, 0x0352b87a, 0x034ba6f7, 0x003ca31c, 0x026c2013, 0x034b073e, 0x00a07f01, 0x034f9755, 0x0010001f, 0x00001e4c}}}, + {X: Field{[10]uint32{0x017e2c95, 0x037265af, 0x00d82ab7, 0x02852e1e, 0x036f3f2b, 0x02b15055, 0x019a12a8, 0x034697b7, 0x03fbb24a, 0x003281f2}}, Y: Field{[10]uint32{0x0150dfa2, 0x0266eb23, 0x00cbf05e, 0x03ccedf8, 0x013ac306, 0x030419b2, 0x00a2267b, 0x003b7d2a, 0x011032df, 0x002bb70c}}}, + {X: Field{[10]uint32{0x0309f34b, 0x01742dce, 0x026ce6d7, 0x03982331, 0x01e58873, 0x00fce758, 0x02b6296f, 0x02de6186, 0x03a63b1c, 0x0025c07c}}, Y: Field{[10]uint32{0x00df5793, 0x03214330, 0x00794acd, 0x00e5ff73, 0x037104bc, 0x0055a0cd, 0x03031b53, 0x003b4575, 0x03bb8caf, 0x000f7512}}}, + {X: Field{[10]uint32{0x02548418, 0x01c7446b, 0x03923173, 0x01f62260, 0x02dce488, 0x00de8d06, 0x03072b05, 0x01f8a4be, 0x00c9e481, 0x000b9b6c}}, Y: Field{[10]uint32{0x00a2b918, 0x01e4b004, 0x035f1e69, 0x01cf870f, 0x004b8e1d, 0x022a4459, 0x01314897, 0x01befe88, 0x02411d77, 0x001d3ada}}}, + {X: Field{[10]uint32{0x031e2f46, 0x039888ef, 0x0383015c, 0x007a1c9d, 0x035270f7, 0x00358f15, 0x01592e04, 0x019b3111, 0x001d2c9e, 0x00280dad}}, Y: Field{[10]uint32{0x02ffb349, 0x00789a57, 0x031f4f73, 0x020b3fc2, 0x010680e2, 0x01e7ac23, 0x031f6aa4, 0x01acf5f7, 0x01a003e9, 0x0030efe4}}}, + {X: Field{[10]uint32{0x03db2a09, 0x00154580, 0x01bbf096, 0x021f7080, 0x01f63142, 0x029d9b68, 0x01638800, 0x0030d4af, 0x0004d9c3, 0x002c2773}}, Y: Field{[10]uint32{0x00b1a093, 0x01f6cea0, 0x014e7aed, 0x035305ab, 0x026a951b, 0x02bab403, 0x008d1635, 0x009037dc, 0x006481cf, 0x00229fcc}}}, + {X: Field{[10]uint32{0x004cea08, 0x022e40e3, 0x0221dbcd, 0x02e8383a, 0x02654b58, 0x01001194, 0x00a61153, 0x023141bd, 0x02dbaa4e, 0x001aa17e}}, Y: Field{[10]uint32{0x0062f4f3, 0x037b3966, 0x021b6a19, 0x012d0f5c, 0x00b4271a, 0x023f988c, 0x01933c14, 0x0196754c, 0x0204bae4, 0x00002d91}}}, + {X: Field{[10]uint32{0x00a959e5, 0x004e0848, 0x014cc5a2, 0x00ea2e47, 0x0391e149, 0x036381ae, 0x0205f281, 0x00bf7e37, 0x030b1dd1, 0x001815c5}}, Y: Field{[10]uint32{0x0385a2a8, 0x026fa4c8, 0x00c65e89, 0x02f0fb89, 0x02465152, 0x01c77c98, 0x019a2daf, 0x01201eb7, 0x00b26a6a, 0x002686bc}}}, + }, + { + {X: Field{[10]uint32{0x00a959e5, 0x004e0848, 0x014cc5a2, 0x00ea2e47, 0x0391e149, 0x036381ae, 0x0205f281, 0x00bf7e37, 0x030b1dd1, 0x001815c5}}, Y: Field{[10]uint32{0x0385a2a8, 0x026fa4c8, 0x00c65e89, 0x02f0fb89, 0x02465152, 0x01c77c98, 0x019a2daf, 0x01201eb7, 0x00b26a6a, 0x002686bc}}}, + {X: Field{[10]uint32{0x02fd545c, 0x02729760, 0x00e66189, 0x0237528a, 0x037c133f, 0x01b72177, 0x014110a4, 0x0381900e, 0x01677c52, 0x0019dcff}}, Y: Field{[10]uint32{0x007eb1ae, 0x01fc0d25, 0x00f98e8c, 0x03d6871b, 0x03ead780, 0x034ac91a, 0x00f25c9d, 0x0194bc3c, 0x02d8cd97, 0x001113ad}}}, + {X: Field{[10]uint32{0x031c032b, 0x036858a5, 0x01c980d4, 0x02285ebf, 0x01ff6b66, 0x03f1d9b1, 0x0111b5fd, 0x000980f7, 0x00fcd6e0, 0x001c7aea}}, Y: Field{[10]uint32{0x0268359f, 0x02d6a385, 0x00755e7a, 0x0345dd2d, 0x0371931a, 0x01532edf, 0x0260516f, 0x034e77bd, 0x02624b61, 0x0034bfc4}}}, + {X: Field{[10]uint32{0x0386f021, 0x03185ac2, 0x00050373, 0x00e0411a, 0x020374e4, 0x038321f0, 0x03c79aac, 0x0395948d, 0x0194d17c, 0x00383e1b}}, Y: Field{[10]uint32{0x01bf325a, 0x02de732d, 0x0045b3b6, 0x0300457f, 0x009a80bc, 0x0072268b, 0x011e832f, 0x02f3d1ea, 0x0073730a, 0x000315c7}}}, + {X: Field{[10]uint32{0x0203a61c, 0x0391d14a, 0x00574d06, 0x03d1a41c, 0x00507868, 0x02aaa774, 0x0217442b, 0x02748cb2, 0x0305b324, 0x002157b0}}, Y: Field{[10]uint32{0x025dfc07, 0x031baab1, 0x004965df, 0x013a85f9, 0x02d332f7, 0x02d0bed3, 0x003cbff9, 0x00705fd5, 0x012ec5f0, 0x00037617}}}, + {X: Field{[10]uint32{0x02aa138b, 0x00367dce, 0x02cd66df, 0x002fbde1, 0x0363efba, 0x03119c7f, 0x003ebc18, 0x02b8a1e5, 0x0249d3c3, 0x00105ff8}}, Y: Field{[10]uint32{0x021ae869, 0x0246ccd2, 0x026afd1c, 0x037b0155, 0x03c19daf, 0x003ea795, 0x00a5d29f, 0x00f8e308, 0x01d7bcd2, 0x00008d62}}}, + {X: Field{[10]uint32{0x0332d706, 0x03029207, 0x00678b00, 0x0291d1a8, 0x020618cc, 0x00256fe8, 0x010d29a3, 0x03efc7c5, 0x006abab3, 0x000f3912}}, Y: Field{[10]uint32{0x007fd9e4, 0x01cd8dff, 0x0289f40b, 0x010f3587, 0x02edd156, 0x00425241, 0x02fd046b, 0x01e14a23, 0x008daae3, 0x0039dd50}}}, + {X: Field{[10]uint32{0x02da6e03, 0x001dcb00, 0x016038ad, 0x03e4232b, 0x034c277d, 0x035a5bd3, 0x0191e193, 0x0141073a, 0x01ab9f24, 0x0010b285}}, Y: Field{[10]uint32{0x00347793, 0x02227ea3, 0x03ea7836, 0x029a041a, 0x02d66e85, 0x032e003b, 0x03ce4d1f, 0x015f2591, 0x0326c81c, 0x001a34bb}}}, + {X: Field{[10]uint32{0x011cd3fb, 0x01032ede, 0x03e686db, 0x03f65ca6, 0x034a2a33, 0x03e2113a, 0x02e03218, 0x00dfebc0, 0x01143f4e, 0x00047331}}, Y: Field{[10]uint32{0x01160d86, 0x01c5ae95, 0x03472a93, 0x03f4b374, 0x01fa0b1e, 0x00e3308e, 0x028e2449, 0x00477ad4, 0x032a902b, 0x0012a95a}}}, + {X: Field{[10]uint32{0x01583a3e, 0x02ebc10a, 0x02808108, 0x02662c55, 0x00b15205, 0x036521c7, 0x0275dbbe, 0x03df955c, 0x033f16d0, 0x00162255}}, Y: Field{[10]uint32{0x025b124f, 0x016632df, 0x029cf8f1, 0x01335331, 0x0096fe29, 0x0269ad39, 0x00f5df8a, 0x015bf811, 0x0062c558, 0x0006be8a}}}, + {X: Field{[10]uint32{0x018f7552, 0x02e44658, 0x00fac387, 0x022e6015, 0x01bd4113, 0x0208e0b7, 0x0397774f, 0x0271bd0e, 0x0317e514, 0x0000942e}}, Y: Field{[10]uint32{0x0110b14d, 0x0212588d, 0x02f1e3f0, 0x00f0ccf5, 0x03da006f, 0x03fa7605, 0x02d7df75, 0x020208d0, 0x00fc9bbe, 0x001cc64c}}}, + {X: Field{[10]uint32{0x0307e636, 0x0162d040, 0x011d97e1, 0x039cc858, 0x00b4a77d, 0x028844b2, 0x01bc29bd, 0x01d910f7, 0x01601638, 0x0008867c}}, Y: Field{[10]uint32{0x01f15109, 0x0286cb5c, 0x02f55e07, 0x0034fdce, 0x016dd723, 0x02e08c2f, 0x0006d4f1, 0x028bd86e, 0x00ac5cb6, 0x00012a61}}}, + {X: Field{[10]uint32{0x03725d12, 0x004fa4e7, 0x0347505d, 0x02ef72d7, 0x03d94642, 0x02808bef, 0x00a39ce0, 0x01ff4ead, 0x0088b346, 0x00069d27}}, Y: Field{[10]uint32{0x03ac56e4, 0x01945348, 0x01aa7013, 0x01a62643, 0x03607208, 0x00abcf63, 0x018be75c, 0x0038b3d1, 0x019573ec, 0x001fa474}}}, + {X: Field{[10]uint32{0x02c704c0, 0x00b59c2d, 0x0394f5d2, 0x0183b378, 0x00560446, 0x00d41e09, 0x027f8a6e, 0x0099d285, 0x0107c92f, 0x0029deaa}}, Y: Field{[10]uint32{0x02dfea48, 0x02f1c11f, 0x01462af8, 0x0311d056, 0x014c921f, 0x030af56a, 0x01e188e5, 0x033f93c8, 0x02e5bf35, 0x002e2206}}}, + {X: Field{[10]uint32{0x01fae458, 0x0012394a, 0x0097fd61, 0x0109d9bb, 0x028b0a5c, 0x037edecc, 0x01d156a5, 0x00863042, 0x005be0f8, 0x0031d41a}}, Y: Field{[10]uint32{0x0357b598, 0x01a10655, 0x011a2b01, 0x0140cd65, 0x000a5dca, 0x019cb1ed, 0x012f414c, 0x007817ed, 0x01f8cf92, 0x003ab5e5}}}, + {X: Field{[10]uint32{0x00b94266, 0x01a5cfbb, 0x01f12b1a, 0x03ee9f53, 0x0080cef0, 0x006368c6, 0x01439a45, 0x02104508, 0x038e23a0, 0x00295db7}}, Y: Field{[10]uint32{0x01b28ec8, 0x02f846b8, 0x019f3ee8, 0x029fd453, 0x00432e10, 0x0163360b, 0x02b97afe, 0x0102cb24, 0x0320e766, 0x001029af}}}, + }, + { + {X: Field{[10]uint32{0x00b94266, 0x01a5cfbb, 0x01f12b1a, 0x03ee9f53, 0x0080cef0, 0x006368c6, 0x01439a45, 0x02104508, 0x038e23a0, 0x00295db7}}, Y: Field{[10]uint32{0x01b28ec8, 0x02f846b8, 0x019f3ee8, 0x029fd453, 0x00432e10, 0x0163360b, 0x02b97afe, 0x0102cb24, 0x0320e766, 0x001029af}}}, + {X: Field{[10]uint32{0x02704896, 0x015c96f6, 0x03b8dcec, 0x018f26b3, 0x026f3ba0, 0x02f9c6eb, 0x02520867, 0x0168ed51, 0x0062ef3b, 0x00279773}}, Y: Field{[10]uint32{0x0282c835, 0x009da772, 0x0351248f, 0x006180c3, 0x0279605d, 0x0131d848, 0x03d3a215, 0x017cfa97, 0x012ddb92, 0x001bfb74}}}, + {X: Field{[10]uint32{0x019ed6c1, 0x02bad633, 0x013d6b68, 0x016f0f56, 0x02c24e74, 0x0017b743, 0x03fc1877, 0x03d4fa02, 0x036dcb74, 0x0000ca0c}}, Y: Field{[10]uint32{0x00fafeee, 0x01baf9be, 0x0094adec, 0x037c972d, 0x00265bf4, 0x00835f23, 0x02d5943a, 0x027ca311, 0x003812fd, 0x001c6a26}}}, + {X: Field{[10]uint32{0x00bf7ea0, 0x03b561d1, 0x01833953, 0x028173bd, 0x00e33625, 0x01bc0ec8, 0x016e9f97, 0x0116b7e3, 0x00375b87, 0x0029f782}}, Y: Field{[10]uint32{0x03bcabaa, 0x030154e6, 0x01aa2e04, 0x0303faf1, 0x02645a47, 0x012223a6, 0x004a0b33, 0x02979484, 0x02b057ad, 0x00298f65}}}, + {X: Field{[10]uint32{0x0235983a, 0x02a6a34c, 0x00eb2919, 0x00dc04ef, 0x01e38a10, 0x003f854c, 0x023926d7, 0x00715371, 0x02ae8b91, 0x003393d3}}, Y: Field{[10]uint32{0x013cdecf, 0x035ac643, 0x0340aecf, 0x008a3afd, 0x03526c65, 0x039c1d50, 0x02de0249, 0x03eeecfa, 0x0173c390, 0x003cf27e}}}, + {X: Field{[10]uint32{0x02da57e4, 0x01592299, 0x019f86b7, 0x01bbf737, 0x0298c499, 0x018c6f07, 0x01ea2a74, 0x0062e76f, 0x02e39839, 0x001a4336}}, Y: Field{[10]uint32{0x033f33bb, 0x00656d24, 0x023d42b6, 0x03ef3a56, 0x01f863d8, 0x01656253, 0x01fd91bf, 0x01e691ea, 0x0079677b, 0x002102b7}}}, + {X: Field{[10]uint32{0x01b0e6c9, 0x02aad995, 0x00c89a6d, 0x033de1b9, 0x01db5ff9, 0x037e2f2f, 0x0228fb36, 0x018889e3, 0x03a54b98, 0x00136faf}}, Y: Field{[10]uint32{0x02b2cc25, 0x029e1557, 0x00efae94, 0x02caf141, 0x03589311, 0x03888a7c, 0x01a626e6, 0x00ebb7d1, 0x03b03c91, 0x00043fb9}}}, + {X: Field{[10]uint32{0x02d916fb, 0x023e8412, 0x024a3a9f, 0x03f7a527, 0x03e68065, 0x0073fd32, 0x03c35ac0, 0x02032704, 0x018e6890, 0x00309999}}, Y: Field{[10]uint32{0x00887814, 0x03bd4ae8, 0x0138856a, 0x037fad84, 0x036b8fec, 0x009189ea, 0x0398170b, 0x036aac3d, 0x013854e7, 0x0039fa16}}}, + {X: Field{[10]uint32{0x01857295, 0x00068469, 0x03f0164e, 0x01fc0d0c, 0x0069c8e4, 0x02872848, 0x02e118fc, 0x0170862c, 0x000bfef4, 0x00290a89}}, Y: Field{[10]uint32{0x027eb9c1, 0x00ddffb2, 0x0139556b, 0x00b34546, 0x0027a1c2, 0x01376931, 0x026b22b2, 0x0175159e, 0x03f26100, 0x000ea82c}}}, + {X: Field{[10]uint32{0x005c5b40, 0x02f3f580, 0x03d1e269, 0x021e6ee7, 0x03150b96, 0x023330f7, 0x01ed382e, 0x0334536b, 0x00c8bf53, 0x00292d4f}}, Y: Field{[10]uint32{0x01c61bfd, 0x017b45b4, 0x019e3d1f, 0x026fdd49, 0x03199cca, 0x037f6961, 0x015ca003, 0x016e0112, 0x00ce8300, 0x0033bbc2}}}, + {X: Field{[10]uint32{0x03cdc098, 0x003fd55b, 0x02803222, 0x003dab91, 0x01550ae0, 0x00312670, 0x03f1f86c, 0x008899e9, 0x032f96fb, 0x000d384a}}, Y: Field{[10]uint32{0x027474e2, 0x02c6b79a, 0x003f664c, 0x00c3c662, 0x0304df51, 0x005e5cb6, 0x034cbc84, 0x034c8b65, 0x02ddd7b5, 0x002992b0}}}, + {X: Field{[10]uint32{0x00fb8036, 0x02262a97, 0x035085f9, 0x024b0368, 0x033ad09a, 0x03f59fa0, 0x02117dd1, 0x011ed22b, 0x0351fb16, 0x0033fd89}}, Y: Field{[10]uint32{0x00f59de0, 0x03ced689, 0x02825843, 0x0363d80c, 0x0278a589, 0x021850f1, 0x03e34b58, 0x00b46b17, 0x0126bd54, 0x00337d3b}}}, + {X: Field{[10]uint32{0x03173b92, 0x01bad7a3, 0x037611cd, 0x03d05a7e, 0x003b7e72, 0x03d3595a, 0x0231a218, 0x0247ca6f, 0x0240d9bb, 0x00043d34}}, Y: Field{[10]uint32{0x033146c2, 0x00801b58, 0x02db7c90, 0x0274521a, 0x0290bb76, 0x00ce422e, 0x01b25a5a, 0x014eb484, 0x01950917, 0x0021438b}}}, + {X: Field{[10]uint32{0x004393d7, 0x01983b74, 0x01de1ee6, 0x00959dd2, 0x03869dff, 0x008d5cf8, 0x017f8936, 0x03cee10c, 0x00018a78, 0x0037a87f}}, Y: Field{[10]uint32{0x01710ccd, 0x01f53be5, 0x00cbdbf9, 0x0268ade7, 0x03af6def, 0x01b59b80, 0x03f134ff, 0x0171434e, 0x01cc942e, 0x0013d952}}}, + {X: Field{[10]uint32{0x00d84958, 0x03f4766a, 0x005caee6, 0x02c5b2b3, 0x026a11de, 0x03503321, 0x0319b976, 0x01df9d27, 0x000b69b6, 0x003a11ba}}, Y: Field{[10]uint32{0x0082cf9f, 0x01191ede, 0x001a640c, 0x00d9c783, 0x03ad51a3, 0x01e62ddb, 0x01bd9104, 0x01f89507, 0x00fc894c, 0x0028a72e}}}, + {X: Field{[10]uint32{0x0258ad71, 0x018e226f, 0x03a208f7, 0x03d73e68, 0x00bb30d1, 0x0277a30e, 0x005fe962, 0x030f8c28, 0x038c28de, 0x001dde29}}, Y: Field{[10]uint32{0x019f43ac, 0x004ff07f, 0x02c563b5, 0x0047fc92, 0x0087b384, 0x00bfd600, 0x0098e12f, 0x02c8bfdc, 0x019ab5a5, 0x000d189b}}}, + }, + { + {X: Field{[10]uint32{0x0258ad71, 0x018e226f, 0x03a208f7, 0x03d73e68, 0x00bb30d1, 0x0277a30e, 0x005fe962, 0x030f8c28, 0x038c28de, 0x001dde29}}, Y: Field{[10]uint32{0x019f43ac, 0x004ff07f, 0x02c563b5, 0x0047fc92, 0x0087b384, 0x00bfd600, 0x0098e12f, 0x02c8bfdc, 0x019ab5a5, 0x000d189b}}}, + {X: Field{[10]uint32{0x0073e879, 0x02870944, 0x02ea7a7e, 0x016b8413, 0x032cf16a, 0x03c3f8e4, 0x02f482d7, 0x001b458c, 0x016b5ca0, 0x0039ee5e}}, Y: Field{[10]uint32{0x02a89d98, 0x01c4226e, 0x00af338e, 0x0097b6a6, 0x029cb5bf, 0x00df3072, 0x002102a7, 0x0278bf7d, 0x008c1916, 0x0004ae26}}}, + {X: Field{[10]uint32{0x0319c869, 0x031bab8c, 0x032702f7, 0x0175d87a, 0x0018a9f9, 0x03f32b37, 0x01839022, 0x00ff2340, 0x005d9817, 0x000c0601}}, Y: Field{[10]uint32{0x02b856f0, 0x031db274, 0x01a7bfc0, 0x032928f6, 0x03ca2a84, 0x03588b8e, 0x02624320, 0x02dedbe1, 0x01782503, 0x002b17f1}}}, + {X: Field{[10]uint32{0x02628f0f, 0x035c8afc, 0x02919865, 0x02abcabb, 0x0365423d, 0x02f8269c, 0x00915a24, 0x01880f0b, 0x00185087, 0x0001c6fc}}, Y: Field{[10]uint32{0x01a1c334, 0x03172f51, 0x000bbb57, 0x01a88c72, 0x02098f9c, 0x03021338, 0x03600bc1, 0x033d2b8c, 0x015d504d, 0x00149ea8}}}, + {X: Field{[10]uint32{0x01ed29b5, 0x01a61be9, 0x01d1b4c6, 0x0181c4ab, 0x01f5830b, 0x0298f221, 0x02b67db9, 0x01fbcd0e, 0x01b61ee5, 0x000c8a20}}, Y: Field{[10]uint32{0x00d15ad2, 0x03c49b9f, 0x03604ef4, 0x02ae53b9, 0x01ca83ae, 0x01054c78, 0x010b19df, 0x00d13ac4, 0x028417a0, 0x00059dc0}}}, + {X: Field{[10]uint32{0x00953133, 0x01f726c6, 0x021ae647, 0x00a9d21c, 0x017fb3b4, 0x03f337ea, 0x012806c0, 0x03748e20, 0x034fed0d, 0x000282ca}}, Y: Field{[10]uint32{0x00af0fc9, 0x00928dcd, 0x00ba94bc, 0x03a2c3b5, 0x016fa384, 0x01916323, 0x001c6ca8, 0x02fcbc0f, 0x002cfb5a, 0x00336846}}}, + {X: Field{[10]uint32{0x02c96100, 0x02a101e1, 0x008e63bf, 0x006a9ba7, 0x00a16301, 0x037cf6f3, 0x003dd9b2, 0x006e7fed, 0x033ac0fb, 0x000fce11}}, Y: Field{[10]uint32{0x02624707, 0x00ab06fc, 0x031bcf1e, 0x01f02dd7, 0x0166571c, 0x03c1e739, 0x034c4462, 0x000e5494, 0x0055f5d4, 0x001c31a7}}}, + {X: Field{[10]uint32{0x039620e1, 0x00ddb7e8, 0x013786f6, 0x03214048, 0x025b1911, 0x0300f0e7, 0x0232e594, 0x0395a0ce, 0x003acb9b, 0x0000860d}}, Y: Field{[10]uint32{0x006998b5, 0x00667d94, 0x009ec5e0, 0x0290bd0f, 0x00443299, 0x000beff0, 0x03f24fd6, 0x0142fabc, 0x0148970a, 0x002faa07}}}, + {X: Field{[10]uint32{0x0122d2ac, 0x031bb1bf, 0x02ce0234, 0x0049b72a, 0x0310ddfe, 0x01e177cb, 0x003c0e09, 0x029db72d, 0x03c5fd27, 0x000a2044}}, Y: Field{[10]uint32{0x0342a268, 0x03ad57e3, 0x008fd081, 0x01285523, 0x03ddc3d4, 0x0325d84d, 0x00777260, 0x031723c8, 0x030158fb, 0x002869fa}}}, + {X: Field{[10]uint32{0x02e515dd, 0x0284ebbf, 0x024228c1, 0x008cd0ea, 0x029d0453, 0x012f7f8b, 0x035866ab, 0x0306083b, 0x02fee6ee, 0x0028afe6}}, Y: Field{[10]uint32{0x02c30212, 0x02a5ac01, 0x018745c3, 0x02aa6a3a, 0x0000f2e3, 0x03017a8a, 0x00a5e2ab, 0x02adece8, 0x0071c55c, 0x0016846f}}}, + {X: Field{[10]uint32{0x005f8ea8, 0x02a03749, 0x02900d4b, 0x038e5934, 0x01d17248, 0x01c467f9, 0x03f4d95d, 0x00e8a954, 0x0200c846, 0x003e58e8}}, Y: Field{[10]uint32{0x01bc99eb, 0x0157ec16, 0x020824bc, 0x00d6762d, 0x008bb8f2, 0x03fd09c8, 0x03722301, 0x020f028e, 0x00268c7f, 0x00272165}}}, + {X: Field{[10]uint32{0x030a2a53, 0x03c3b037, 0x0211e7ea, 0x02cfe059, 0x02d51dca, 0x00ea6e24, 0x00394574, 0x0265f0ea, 0x018d07c3, 0x001be194}}, Y: Field{[10]uint32{0x033bfeb2, 0x02695d1c, 0x01f35113, 0x01cbaa81, 0x00bf54f7, 0x029c265a, 0x0376ea95, 0x020bca6d, 0x0216fd45, 0x003542bd}}}, + {X: Field{[10]uint32{0x0206a315, 0x02a20c49, 0x023ad9e1, 0x01cbc9a5, 0x02407260, 0x0243825f, 0x00d8b2a5, 0x03669fe6, 0x024cff70, 0x00297648}}, Y: Field{[10]uint32{0x023b68d1, 0x0184cd67, 0x027c9d35, 0x00d1f446, 0x01ed4d0d, 0x01e6037a, 0x03306abd, 0x03696cd0, 0x03003b20, 0x0021cca2}}}, + {X: Field{[10]uint32{0x00d52891, 0x027abd36, 0x01f52af1, 0x03620fae, 0x0339a0f7, 0x02c5ffe9, 0x0244de90, 0x02378d19, 0x03c9cbc5, 0x000ef092}}, Y: Field{[10]uint32{0x0105b79c, 0x03478a13, 0x032d1386, 0x00a02921, 0x004da845, 0x02fed23d, 0x02bed840, 0x00f629ff, 0x00a48a78, 0x003c238c}}}, + {X: Field{[10]uint32{0x02231493, 0x02ded501, 0x00d469cd, 0x020c3331, 0x0096411a, 0x003979a9, 0x034e41d0, 0x030d813a, 0x002e1b73, 0x003c7fa6}}, Y: Field{[10]uint32{0x018848c1, 0x02a6699d, 0x030d0196, 0x00d1b97f, 0x03f173fb, 0x03df6674, 0x02d3c205, 0x01377085, 0x01eaed9a, 0x000b8806}}}, + {X: Field{[10]uint32{0x02d903ac, 0x03b6a701, 0x03e5cb09, 0x01d396b5, 0x02d5f962, 0x039ebf4b, 0x0329fd30, 0x02a1118d, 0x015ee637, 0x00024a25}}, Y: Field{[10]uint32{0x03cd091f, 0x0203a4d6, 0x0183fc51, 0x03bea2a3, 0x02ac3d26, 0x024ea57b, 0x0378a130, 0x010aa09e, 0x01003d3f, 0x00309588}}}, + }, + { + {X: Field{[10]uint32{0x02d903ac, 0x03b6a701, 0x03e5cb09, 0x01d396b5, 0x02d5f962, 0x039ebf4b, 0x0329fd30, 0x02a1118d, 0x015ee637, 0x00024a25}}, Y: Field{[10]uint32{0x03cd091f, 0x0203a4d6, 0x0183fc51, 0x03bea2a3, 0x02ac3d26, 0x024ea57b, 0x0378a130, 0x010aa09e, 0x01003d3f, 0x00309588}}}, + {X: Field{[10]uint32{0x0359dd9e, 0x0011e983, 0x030e7231, 0x03156d63, 0x027ce5e9, 0x032c62b5, 0x01163b04, 0x034d436b, 0x01ee3771, 0x0013e26f}}, Y: Field{[10]uint32{0x0156b049, 0x01ab8c80, 0x01f5c101, 0x014198e3, 0x031e4882, 0x010eec91, 0x00baf4c0, 0x007da571, 0x02d5227a, 0x00329e54}}}, + {X: Field{[10]uint32{0x0074b839, 0x004a1d5e, 0x02b41811, 0x02ce54f4, 0x02be4115, 0x008c2dab, 0x03df0dfb, 0x0396a014, 0x001fc0e1, 0x000f80ee}}, Y: Field{[10]uint32{0x000594ba, 0x0073959f, 0x01b8da0c, 0x03c3f6ad, 0x027de5c5, 0x01c663d9, 0x00f66075, 0x01fd0b11, 0x0163dff0, 0x00344eb8}}}, + {X: Field{[10]uint32{0x03f01197, 0x030c533f, 0x005bf529, 0x03c1e689, 0x0194b668, 0x00b0f132, 0x0396baca, 0x0316a030, 0x0304cae3, 0x0032e7a0}}, Y: Field{[10]uint32{0x03989c1d, 0x01381d8e, 0x00a24c33, 0x02300578, 0x0341b2d1, 0x03c22245, 0x03258cdf, 0x0039a849, 0x02801eb8, 0x0018b1f4}}}, + {X: Field{[10]uint32{0x0357a513, 0x03de39a0, 0x0023f3a3, 0x004d16cc, 0x01f151bd, 0x028a48b1, 0x02fa283a, 0x0124b358, 0x00b7a2f4, 0x003998b0}}, Y: Field{[10]uint32{0x0017d07e, 0x02880728, 0x00d89192, 0x0358954e, 0x01d8035c, 0x00486906, 0x01ae208a, 0x01148c17, 0x013ce612, 0x002ac2c6}}}, + {X: Field{[10]uint32{0x01a7d197, 0x03a434ee, 0x019459ba, 0x030623a9, 0x035e83a8, 0x008b08d2, 0x038ffe0a, 0x03d8e51d, 0x0254280d, 0x0030b162}}, Y: Field{[10]uint32{0x01eeb5e9, 0x00732fe2, 0x002484e4, 0x011516b6, 0x020a47ec, 0x00bb4e69, 0x03041ab6, 0x00249d5c, 0x0288366e, 0x001cba8c}}}, + {X: Field{[10]uint32{0x0337d242, 0x017dfbf7, 0x014b0499, 0x02981e70, 0x01c29fec, 0x02f8d61f, 0x03862c7c, 0x03db2e10, 0x00b1c94c, 0x00102fe0}}, Y: Field{[10]uint32{0x02405088, 0x03609e69, 0x035583d1, 0x02e90af4, 0x0274321e, 0x02c9bf84, 0x013fe9b1, 0x02abc13d, 0x0135d856, 0x002d5e77}}}, + {X: Field{[10]uint32{0x008d2cc2, 0x027ff094, 0x0058c15f, 0x0351c123, 0x018e0bee, 0x001cc371, 0x00cf2a41, 0x01a6f4f2, 0x01b0f89c, 0x0038bcd2}}, Y: Field{[10]uint32{0x00d4c04f, 0x011ef638, 0x03db37e3, 0x03a38272, 0x0242344b, 0x0180856e, 0x0060aec7, 0x01c8de06, 0x03280f82, 0x0007facb}}}, + {X: Field{[10]uint32{0x015a3558, 0x00acd916, 0x027f2baf, 0x021788d2, 0x02ac071f, 0x0236d67d, 0x02f97813, 0x0329c201, 0x0297601d, 0x000f453f}}, Y: Field{[10]uint32{0x0043df4c, 0x036ceb19, 0x01727c6a, 0x03851f07, 0x0082e0a2, 0x02fd5b85, 0x029a931d, 0x0207be3c, 0x01d6e846, 0x0005b1af}}}, + {X: Field{[10]uint32{0x00ea4178, 0x031c0905, 0x03cd510f, 0x0153931d, 0x03782e03, 0x01dd2532, 0x00453c6a, 0x018da1a0, 0x0072d175, 0x00011c2a}}, Y: Field{[10]uint32{0x00098bd6, 0x01127c6e, 0x01aea079, 0x01c1a613, 0x0319b568, 0x034e7032, 0x02145e9f, 0x026b359d, 0x03a9c110, 0x00022669}}}, + {X: Field{[10]uint32{0x02b1fc24, 0x027d6b60, 0x03570ede, 0x0071f8fd, 0x012528d8, 0x03249219, 0x001ac4d2, 0x01949473, 0x0140e82e, 0x00375be9}}, Y: Field{[10]uint32{0x029b74ca, 0x00c71183, 0x022304a4, 0x01afb5cc, 0x03ec10de, 0x00595f9d, 0x026f1ebf, 0x0061bf8d, 0x037eb1d3, 0x0019f98a}}}, + {X: Field{[10]uint32{0x03369217, 0x0379b658, 0x011ead74, 0x01a40198, 0x01ca1c39, 0x01013ab3, 0x01a278f5, 0x03589288, 0x00ffcba4, 0x0010b714}}, Y: Field{[10]uint32{0x022dbc57, 0x0025f88f, 0x01e841c3, 0x03b2a380, 0x03a7a139, 0x0182ea14, 0x0178f5f1, 0x016c75fb, 0x021f6638, 0x00296ea6}}}, + {X: Field{[10]uint32{0x01d08e02, 0x02a4564f, 0x0302881e, 0x02dff6b7, 0x00108547, 0x028f47a0, 0x0069499a, 0x0175e03e, 0x01a82de5, 0x0004fe8b}}, Y: Field{[10]uint32{0x00b03410, 0x0150770f, 0x02b97da5, 0x02ec6690, 0x03e644af, 0x02ed0cb1, 0x03356206, 0x0369c8c4, 0x00b04555, 0x0004d8ce}}}, + {X: Field{[10]uint32{0x0246a9e9, 0x006b3a45, 0x03b0423f, 0x029f62b9, 0x015dcbb7, 0x03329d77, 0x01f82bb9, 0x03bdd5f4, 0x039c4b0a, 0x002560ad}}, Y: Field{[10]uint32{0x0256a698, 0x035d24ea, 0x002ffbc4, 0x0317c4ee, 0x0001cbb5, 0x02be39a9, 0x02c6acee, 0x009bbb53, 0x01800ed4, 0x0008819f}}}, + {X: Field{[10]uint32{0x004ee41a, 0x00ceae65, 0x029a6ac2, 0x0374edf5, 0x02879b56, 0x00b1a0a0, 0x03c10b67, 0x002910fd, 0x0051d3c7, 0x00341b12}}, Y: Field{[10]uint32{0x03295e6f, 0x03e13a62, 0x02e252f1, 0x00d1858b, 0x019b7b84, 0x013d8c24, 0x030acd4f, 0x0342b6ee, 0x014c0584, 0x0016057f}}}, + {X: Field{[10]uint32{0x03d82751, 0x02b9d458, 0x0354527a, 0x02a41eb4, 0x015645b4, 0x0038eca1, 0x01064f3a, 0x02c424e6, 0x02f3ec6d, 0x0021743f}}, Y: Field{[10]uint32{0x02b1f962, 0x008de893, 0x0331582c, 0x03a5a1dc, 0x023e8751, 0x020b3d59, 0x01d496e5, 0x02302f8a, 0x008413a3, 0x0007c0d9}}}, + }, + { + {X: Field{[10]uint32{0x03d82751, 0x02b9d458, 0x0354527a, 0x02a41eb4, 0x015645b4, 0x0038eca1, 0x01064f3a, 0x02c424e6, 0x02f3ec6d, 0x0021743f}}, Y: Field{[10]uint32{0x02b1f962, 0x008de893, 0x0331582c, 0x03a5a1dc, 0x023e8751, 0x020b3d59, 0x01d496e5, 0x02302f8a, 0x008413a3, 0x0007c0d9}}}, + {X: Field{[10]uint32{0x015fcade, 0x015b4507, 0x01ff7563, 0x038025c4, 0x0068b482, 0x034477c1, 0x007a6cfc, 0x0313d3d8, 0x034b19a4, 0x001ade43}}, Y: Field{[10]uint32{0x0338d3ff, 0x03fe1bf0, 0x02b0ab6f, 0x02d1ef89, 0x03a83fa5, 0x032b8272, 0x016661f9, 0x03acfbca, 0x001b2ff9, 0x00340ea6}}}, + {X: Field{[10]uint32{0x00de4cf3, 0x0154187b, 0x0066ab99, 0x00d51e28, 0x039340e5, 0x005766b9, 0x03c2d26d, 0x008b0ef9, 0x034ac114, 0x000e136a}}, Y: Field{[10]uint32{0x012d0566, 0x01e5ac89, 0x03a73b7c, 0x00ce5d46, 0x001f430a, 0x00ad31bc, 0x034ed6da, 0x03290efe, 0x01bcd1b9, 0x0035b8f1}}}, + {X: Field{[10]uint32{0x03a3e0cb, 0x03336af8, 0x00be0bb0, 0x037a165e, 0x023d2479, 0x03313e3f, 0x022c367a, 0x02fb4f05, 0x032c2d7e, 0x00104526}}, Y: Field{[10]uint32{0x039033a8, 0x024ba60c, 0x00f2470e, 0x0017bd24, 0x00b3ec78, 0x0240b3ca, 0x0015c9b9, 0x00c150ad, 0x0392db7c, 0x00324356}}}, + {X: Field{[10]uint32{0x025238c2, 0x03cfa487, 0x00b8b98a, 0x0170e03b, 0x0040355f, 0x03a0bb52, 0x031610b4, 0x0056a906, 0x000eb7d4, 0x00053c3b}}, Y: Field{[10]uint32{0x02f07922, 0x01a8d1e4, 0x0139d6e8, 0x03600c12, 0x03d25c00, 0x02109d1f, 0x01fc73e3, 0x01760248, 0x013dd483, 0x002ac4b5}}}, + {X: Field{[10]uint32{0x02972627, 0x00d9a822, 0x01e1f8a4, 0x00100948, 0x00e19216, 0x02f11068, 0x018c1efc, 0x03857206, 0x030949bf, 0x00228c61}}, Y: Field{[10]uint32{0x02bb8af9, 0x011ed591, 0x00bcce7b, 0x016b0fbf, 0x00174436, 0x0161eea9, 0x0177ed28, 0x02993425, 0x008768f7, 0x00192edf}}}, + {X: Field{[10]uint32{0x0143e94d, 0x00d4bbf5, 0x00e188f6, 0x029d5be6, 0x02dd1302, 0x02968376, 0x01c34678, 0x00a1fb10, 0x03bb782c, 0x003ad0bc}}, Y: Field{[10]uint32{0x01924d89, 0x01677911, 0x02d42405, 0x02379835, 0x034cd846, 0x03f37edd, 0x020dd572, 0x0364b726, 0x01074f25, 0x0008d29b}}}, + {X: Field{[10]uint32{0x03f3d3fc, 0x03774a38, 0x01cebf8d, 0x0208170a, 0x02664a9b, 0x021ca9ee, 0x02c3dfe2, 0x021277eb, 0x00fa4e7c, 0x00347eb5}}, Y: Field{[10]uint32{0x00f3704d, 0x008d0f14, 0x03326ed2, 0x00c7bfcd, 0x00bad371, 0x0162de06, 0x033f70e8, 0x03f7f951, 0x0314a348, 0x0023f865}}}, + {X: Field{[10]uint32{0x0219aaed, 0x01396d5f, 0x03327032, 0x037a3199, 0x00459bac, 0x0381aa48, 0x02ec02f6, 0x008366a7, 0x00ca5168, 0x00073c4e}}, Y: Field{[10]uint32{0x012f400e, 0x01ba975a, 0x03ffbc13, 0x023fbf1d, 0x03479eef, 0x02db7785, 0x00372a66, 0x018e197d, 0x02f3171c, 0x0035bff6}}}, + {X: Field{[10]uint32{0x00ba68dd, 0x01cee8b8, 0x02d65374, 0x010e31fa, 0x02bca7c9, 0x0076b4c4, 0x0266838c, 0x01d049fc, 0x02abfe2b, 0x000172fa}}, Y: Field{[10]uint32{0x01d03959, 0x00a7cc9f, 0x033b5942, 0x01c17794, 0x007f3d96, 0x0141bbe8, 0x01386665, 0x0055baba, 0x03b6fa90, 0x0004f288}}}, + {X: Field{[10]uint32{0x02a8aa39, 0x0303a7ed, 0x03ac55f6, 0x01ed29e3, 0x0137a663, 0x01266436, 0x035a0968, 0x03504b21, 0x02be5f40, 0x002d61a1}}, Y: Field{[10]uint32{0x03493c1f, 0x01e4d74a, 0x0347b8fc, 0x02639b6c, 0x01abbdaf, 0x01302a47, 0x01478d45, 0x0230b052, 0x014324c7, 0x00158cb5}}}, + {X: Field{[10]uint32{0x023a1550, 0x011319f2, 0x01f279a5, 0x027e3bff, 0x01801da9, 0x007e2dd4, 0x0130976e, 0x015d04b7, 0x01ab3405, 0x003aff1a}}, Y: Field{[10]uint32{0x01362f6e, 0x010afd90, 0x00b1951f, 0x00639a30, 0x037983c8, 0x01fd3f41, 0x01f199db, 0x02d5028f, 0x00cdb99c, 0x0038bffa}}}, + {X: Field{[10]uint32{0x003b4cc5, 0x007af8ec, 0x037c2ee9, 0x02e96871, 0x02572831, 0x01fcea00, 0x035bc4fe, 0x0330ad9e, 0x01b06b8b, 0x0017f067}}, Y: Field{[10]uint32{0x01b57c28, 0x00e7ee19, 0x03ec4a3b, 0x000f3021, 0x009276f5, 0x028e97bd, 0x022138f9, 0x031f19bb, 0x00c0ec98, 0x003b23a1}}}, + {X: Field{[10]uint32{0x028d319f, 0x02fce397, 0x018e948b, 0x0185b510, 0x00e66aa5, 0x01eab260, 0x010b6533, 0x02a19841, 0x0350ce93, 0x001b3970}}, Y: Field{[10]uint32{0x01cf513f, 0x031af5e5, 0x0378308a, 0x03803b14, 0x012da8f2, 0x02ef88fc, 0x013e3e8c, 0x00f216fb, 0x0026e250, 0x00254340}}}, + {X: Field{[10]uint32{0x00b38cb5, 0x02e15f53, 0x00948bb4, 0x037d34e2, 0x03e10b7f, 0x034fba86, 0x03a8a40f, 0x038a277a, 0x030d42ed, 0x002e23ed}}, Y: Field{[10]uint32{0x0165f3d7, 0x03e9d596, 0x00c7197b, 0x00489ebe, 0x024d4f3e, 0x02cd6a38, 0x034bb994, 0x00ca0180, 0x02ad46ea, 0x0035b1cd}}}, + {X: Field{[10]uint32{0x0126087e, 0x01012091, 0x020308f5, 0x02220b68, 0x01fdfb6d, 0x01e62e17, 0x009b6041, 0x033a5f07, 0x01ce97ee, 0x003fcac3}}, Y: Field{[10]uint32{0x00c29907, 0x0147807c, 0x02ceb2c9, 0x01bee438, 0x02c7b7ed, 0x01341e4d, 0x034c4dc5, 0x02e8622b, 0x03fef524, 0x00124f44}}}, + }, + { + {X: Field{[10]uint32{0x0126087e, 0x01012091, 0x020308f5, 0x02220b68, 0x01fdfb6d, 0x01e62e17, 0x009b6041, 0x033a5f07, 0x01ce97ee, 0x003fcac3}}, Y: Field{[10]uint32{0x00c29907, 0x0147807c, 0x02ceb2c9, 0x01bee438, 0x02c7b7ed, 0x01341e4d, 0x034c4dc5, 0x02e8622b, 0x03fef524, 0x00124f44}}}, + {X: Field{[10]uint32{0x0149f8ef, 0x00ea6bcc, 0x034583bd, 0x013b98e2, 0x023deb5c, 0x032c6ec8, 0x0229ebbe, 0x01b27de3, 0x03bc5f36, 0x000a60b6}}, Y: Field{[10]uint32{0x02c7a248, 0x01c9ac05, 0x02d8456e, 0x02504b8f, 0x01095db9, 0x01ed6f27, 0x03a5339c, 0x00882ae7, 0x03e9af66, 0x002986d6}}}, + {X: Field{[10]uint32{0x01d681f9, 0x00153f9e, 0x02b9fc59, 0x03beb23f, 0x0066ce0e, 0x000b252c, 0x037ff25e, 0x008c2222, 0x01f2775f, 0x0031d17f}}, Y: Field{[10]uint32{0x03bb1247, 0x005cd0de, 0x005c7603, 0x00d719f5, 0x038cdbd3, 0x003a0619, 0x031394c7, 0x03979e29, 0x02f2f6b9, 0x00164088}}}, + {X: Field{[10]uint32{0x0380441b, 0x0227d848, 0x03658852, 0x01160385, 0x0060011f, 0x0125f6d6, 0x036eb590, 0x0303dad0, 0x01042af0, 0x00068a39}}, Y: Field{[10]uint32{0x0052af25, 0x03d81aa1, 0x027aeb05, 0x016d1bb9, 0x0104b3e7, 0x025dbc3b, 0x038329a8, 0x0276adf1, 0x027996c5, 0x00155de6}}}, + {X: Field{[10]uint32{0x01cd0ea3, 0x0133bb4d, 0x004815e0, 0x03a0832b, 0x02b34478, 0x019cb9fc, 0x0259e5eb, 0x00142c9e, 0x01f3a975, 0x002aec9e}}, Y: Field{[10]uint32{0x00307bce, 0x024c4cdf, 0x033b6470, 0x0016780b, 0x007c9769, 0x00c1e3b5, 0x034be0c0, 0x025c367e, 0x003bbf17, 0x00177b84}}}, + {X: Field{[10]uint32{0x009a2115, 0x03f54d19, 0x025ebe77, 0x00245e95, 0x02ec7960, 0x01902606, 0x006aca9d, 0x031b1b75, 0x0052b194, 0x003f5cf0}}, Y: Field{[10]uint32{0x02ba6cda, 0x032adee9, 0x0021f049, 0x0158ba75, 0x0104f601, 0x01bdf5b6, 0x00abab02, 0x02211008, 0x00c1c817, 0x001881da}}}, + {X: Field{[10]uint32{0x03c9ee3e, 0x038bcfc6, 0x0382c5c2, 0x02a58f9c, 0x01ea9fa1, 0x0099fb44, 0x03aeaa74, 0x01a0a09f, 0x010b59fc, 0x000fe045}}, Y: Field{[10]uint32{0x019aae06, 0x02b6c316, 0x001603ce, 0x0373f36a, 0x027623b2, 0x011e5598, 0x031beb3c, 0x02a0b519, 0x0268fdbf, 0x00067222}}}, + {X: Field{[10]uint32{0x021e30a7, 0x03c38e58, 0x003242ee, 0x02de6176, 0x002edd5e, 0x034fc805, 0x0250cc0b, 0x00c18074, 0x03e9535f, 0x000322e0}}, Y: Field{[10]uint32{0x03f688de, 0x03defae7, 0x0134dbeb, 0x00dee61c, 0x00aacad2, 0x03bf7215, 0x010e3f17, 0x036b1ee1, 0x0077065f, 0x0003731c}}}, + {X: Field{[10]uint32{0x00e4a007, 0x006fbebe, 0x0358b617, 0x033c22ec, 0x0015ecee, 0x0295b1fb, 0x014ba33a, 0x00b79a56, 0x032dd008, 0x00173e04}}, Y: Field{[10]uint32{0x0068b883, 0x00fc2424, 0x03fe8ce6, 0x025b1e71, 0x02c8946f, 0x01230f7d, 0x02d41588, 0x03e837d2, 0x025c0d61, 0x002d16bb}}}, + {X: Field{[10]uint32{0x003c18e1, 0x00fbf313, 0x03230300, 0x03eeeab5, 0x00ba4ae5, 0x012eb1fd, 0x02267110, 0x0035ae44, 0x01458351, 0x002cfe81}}, Y: Field{[10]uint32{0x02aa2b4f, 0x007efb84, 0x02542cb1, 0x0267c433, 0x01aa55a4, 0x0193f9bf, 0x02182980, 0x03d5adee, 0x00759340, 0x002a1709}}}, + {X: Field{[10]uint32{0x02c2d4a7, 0x01bf9ec9, 0x03fb1095, 0x024cef3f, 0x021bc36f, 0x031013b4, 0x03e33973, 0x02925194, 0x024d0d4b, 0x002db57f}}, Y: Field{[10]uint32{0x02e86371, 0x03739f8e, 0x03cc8118, 0x0139bd78, 0x02745b7e, 0x037fff63, 0x03cf9209, 0x035b0537, 0x03a13abb, 0x0011fcdc}}}, + {X: Field{[10]uint32{0x03816b2f, 0x021b0d46, 0x02e11fdb, 0x021048a3, 0x01ee0cb7, 0x009b1757, 0x00165fe1, 0x00699dba, 0x02dd6595, 0x00169351}}, Y: Field{[10]uint32{0x03e86c60, 0x01ebae1c, 0x00cebaf9, 0x0317ecfb, 0x02b50e6c, 0x03cf7f35, 0x003e27f8, 0x0182ac0a, 0x0396ca0e, 0x001df248}}}, + {X: Field{[10]uint32{0x0066dd33, 0x00cd88bf, 0x036dc509, 0x023fc771, 0x02ea8fbc, 0x000a6c08, 0x03b1b150, 0x01621c1a, 0x03c066cf, 0x0018722e}}, Y: Field{[10]uint32{0x02f10bfa, 0x02ea7ced, 0x00c8ca3b, 0x03ab0a08, 0x036a5106, 0x026174fe, 0x0269994b, 0x03dc0d11, 0x02239e54, 0x0024d667}}}, + {X: Field{[10]uint32{0x035cacbb, 0x019233cc, 0x01b26fce, 0x00a2f58d, 0x0118ac30, 0x0318899c, 0x0177e5bd, 0x003335ee, 0x01b12c72, 0x0013f5a6}}, Y: Field{[10]uint32{0x021ad839, 0x00bbea23, 0x03e6133b, 0x02cba088, 0x00aa998e, 0x036d878b, 0x0079dbfc, 0x0282bb65, 0x02f3f511, 0x0031b243}}}, + {X: Field{[10]uint32{0x016b2ff8, 0x016df337, 0x008fa980, 0x0305ca1b, 0x01876336, 0x03b0ef7c, 0x009f5373, 0x01e1461f, 0x03a57426, 0x002538ca}}, Y: Field{[10]uint32{0x00e1af3e, 0x0121554b, 0x03e13add, 0x010949af, 0x00b33af0, 0x018b67a3, 0x031e4886, 0x0013864b, 0x008b43da, 0x000346d1}}}, + {X: Field{[10]uint32{0x0056e241, 0x03978b3e, 0x01d28780, 0x0052335b, 0x0357f1ee, 0x0006c84a, 0x012b2e63, 0x0203aa7b, 0x03e4b1e8, 0x00209fee}}, Y: Field{[10]uint32{0x02c293ec, 0x016da2eb, 0x03166d60, 0x00c61a40, 0x007ff7a6, 0x0347449a, 0x03ef2c67, 0x01ec2dc6, 0x00923c72, 0x003183e7}}}, + }, + { + {X: Field{[10]uint32{0x0056e241, 0x03978b3e, 0x01d28780, 0x0052335b, 0x0357f1ee, 0x0006c84a, 0x012b2e63, 0x0203aa7b, 0x03e4b1e8, 0x00209fee}}, Y: Field{[10]uint32{0x02c293ec, 0x016da2eb, 0x03166d60, 0x00c61a40, 0x007ff7a6, 0x0347449a, 0x03ef2c67, 0x01ec2dc6, 0x00923c72, 0x003183e7}}}, + {X: Field{[10]uint32{0x00b1815d, 0x03912dc3, 0x03461ef6, 0x024862e1, 0x0260470a, 0x01db9acd, 0x02d7c8d5, 0x01ae5cf8, 0x02a7dce5, 0x002ddfc4}}, Y: Field{[10]uint32{0x0257dbc5, 0x00f4af23, 0x0016d6ba, 0x03e46912, 0x014c42f0, 0x00f30b99, 0x00cefb37, 0x02b310fc, 0x01b14f86, 0x0012dbe1}}}, + {X: Field{[10]uint32{0x03b80fa7, 0x012172ce, 0x01388634, 0x01aedc10, 0x033aa7da, 0x00c82067, 0x011a06bd, 0x030bef03, 0x031f6308, 0x000215f8}}, Y: Field{[10]uint32{0x01366b2d, 0x020847c2, 0x0016abd9, 0x0010f35c, 0x03172e37, 0x0372dc51, 0x017cc9d1, 0x005c824b, 0x03423ae0, 0x003d90e4}}}, + {X: Field{[10]uint32{0x005565ec, 0x0176b4b1, 0x005970fe, 0x037d25df, 0x02d858d8, 0x02de7e55, 0x03308b2c, 0x02fc491e, 0x03943018, 0x001225ce}}, Y: Field{[10]uint32{0x02ed07e9, 0x01e41d7e, 0x037b83b8, 0x02596011, 0x01511b35, 0x005116bc, 0x037bb3a0, 0x03706d90, 0x01684f3c, 0x001d87dd}}}, + {X: Field{[10]uint32{0x01c70e63, 0x000b0e82, 0x01496f5d, 0x01e39d4f, 0x029cbb8b, 0x019299cb, 0x005c6557, 0x018010d5, 0x00ea56bd, 0x000a2ab3}}, Y: Field{[10]uint32{0x0057da4e, 0x000e20bc, 0x021e8b9f, 0x03391136, 0x03f5fc59, 0x01da3aed, 0x0289667c, 0x0038559e, 0x022ef81a, 0x000ada4c}}}, + {X: Field{[10]uint32{0x036d6cd3, 0x0002af9e, 0x0378833a, 0x00740e24, 0x03341661, 0x015948e5, 0x0269b870, 0x02061206, 0x02167f2b, 0x003a8499}}, Y: Field{[10]uint32{0x00f450be, 0x018a497d, 0x01a88aae, 0x00b7aef8, 0x01b1c975, 0x00451789, 0x00e112bf, 0x038ff6ab, 0x02e5078e, 0x00086938}}}, + {X: Field{[10]uint32{0x03e674b5, 0x03714bdc, 0x00aac601, 0x02739c18, 0x0392d8f6, 0x033ae293, 0x01db2c9b, 0x02998517, 0x0225a055, 0x0028bced}}, Y: Field{[10]uint32{0x02937941, 0x00e32383, 0x03a53b09, 0x00c5f0cf, 0x039222fa, 0x00ca9f12, 0x0044a90f, 0x01a2ba00, 0x0159614c, 0x001883a8}}}, + {X: Field{[10]uint32{0x03fd71fa, 0x0135d0ae, 0x027d4a4d, 0x00996d14, 0x030b775a, 0x029c1305, 0x02972728, 0x015671b5, 0x018e8eb5, 0x003a4c49}}, Y: Field{[10]uint32{0x034d3307, 0x02f434c5, 0x035f33d9, 0x0386ed78, 0x00b3946c, 0x032552d0, 0x01eb4169, 0x037b83a1, 0x03364c3f, 0x003ec78c}}}, + {X: Field{[10]uint32{0x011eb056, 0x00058c76, 0x01386c76, 0x036e3b3f, 0x01a002ef, 0x00fd457d, 0x018b5c6a, 0x01648c76, 0x03c9eaae, 0x000f13e0}}, Y: Field{[10]uint32{0x005cecab, 0x01624f68, 0x02b87742, 0x0112073d, 0x001982b5, 0x00ec9e20, 0x02d6573c, 0x022da8ce, 0x0007514a, 0x002511e4}}}, + {X: Field{[10]uint32{0x008fadf1, 0x00f632d5, 0x01f9de64, 0x021e9c4b, 0x0300359b, 0x0224605e, 0x0365f8de, 0x01091270, 0x00387f7f, 0x003b7ce1}}, Y: Field{[10]uint32{0x00415fb6, 0x010db3db, 0x03d2879c, 0x004f7a8d, 0x030f4e88, 0x0082a9ad, 0x01802351, 0x0214037b, 0x01b0a189, 0x001cb4ed}}}, + {X: Field{[10]uint32{0x0186dfa9, 0x0187f6ef, 0x013a7190, 0x029026e6, 0x02dc38b4, 0x02040eea, 0x01c1e03e, 0x019f538a, 0x01288a99, 0x002bfe38}}, Y: Field{[10]uint32{0x01d12681, 0x000f0db0, 0x039c7071, 0x02a51067, 0x00f9116d, 0x03f3d4fd, 0x013ebaa1, 0x01f0ff4f, 0x03b32137, 0x002362d2}}}, + {X: Field{[10]uint32{0x00ff55c5, 0x008f5097, 0x01ec9771, 0x00a0689d, 0x035f4efd, 0x020ad2d8, 0x0012c1e7, 0x0110b29b, 0x01fdfb25, 0x0033cdab}}, Y: Field{[10]uint32{0x01a0228e, 0x009e2148, 0x02706aca, 0x03097034, 0x03a7547e, 0x02f67c81, 0x002f58b3, 0x01da1927, 0x02166ae0, 0x00345a84}}}, + {X: Field{[10]uint32{0x009ba9c1, 0x009cdae6, 0x0338e28f, 0x02968274, 0x01e40f7c, 0x03b3b95e, 0x0058262a, 0x0002cfa1, 0x004528dc, 0x0034fede}}, Y: Field{[10]uint32{0x0351b267, 0x02e237fa, 0x02de0061, 0x03570046, 0x02341ced, 0x022dc3f9, 0x03ca0575, 0x02d39f29, 0x0034efa6, 0x003e2535}}}, + {X: Field{[10]uint32{0x0181f79b, 0x015032f0, 0x02db4fe8, 0x01943392, 0x02e045d8, 0x01a97289, 0x01f82e7c, 0x037ebb8b, 0x00a26c63, 0x000c7203}}, Y: Field{[10]uint32{0x01225400, 0x027949b5, 0x025f1f0b, 0x03abd444, 0x01622ff9, 0x023cc364, 0x014e4d36, 0x009b7cc2, 0x02c12029, 0x0024ad67}}}, + {X: Field{[10]uint32{0x032bb909, 0x025b0743, 0x00d999da, 0x01f14d66, 0x03639102, 0x02461f5f, 0x00729883, 0x02aa23fd, 0x000e0ac9, 0x0013b24c}}, Y: Field{[10]uint32{0x00cf4071, 0x028e0fe9, 0x03827b88, 0x020836b0, 0x02d52e16, 0x0213126e, 0x000dc451, 0x00137172, 0x0106be1b, 0x001e0ae8}}}, + {X: Field{[10]uint32{0x0120e2b3, 0x02d63e88, 0x039aa7f3, 0x0339fd1f, 0x017a58fd, 0x0339b948, 0x03e4ae34, 0x02f6eb9e, 0x01f21f51, 0x003aa992}}, Y: Field{[10]uint32{0x025ad93d, 0x0294c16e, 0x03e59d47, 0x0197c4fd, 0x0201a6b9, 0x021e6a96, 0x01a80f89, 0x02c0eb1a, 0x01ed5bbb, 0x002f8c9e}}}, + }, + { + {X: Field{[10]uint32{0x0120e2b3, 0x02d63e88, 0x039aa7f3, 0x0339fd1f, 0x017a58fd, 0x0339b948, 0x03e4ae34, 0x02f6eb9e, 0x01f21f51, 0x003aa992}}, Y: Field{[10]uint32{0x025ad93d, 0x0294c16e, 0x03e59d47, 0x0197c4fd, 0x0201a6b9, 0x021e6a96, 0x01a80f89, 0x02c0eb1a, 0x01ed5bbb, 0x002f8c9e}}}, + {X: Field{[10]uint32{0x03c9b0a8, 0x02f07307, 0x03db453d, 0x0171c17c, 0x029e337b, 0x00089e7a, 0x0223ea50, 0x025fbb09, 0x01b3beb9, 0x000eb6e7}}, Y: Field{[10]uint32{0x005bbdda, 0x039e5d7c, 0x026cc61a, 0x03e61c09, 0x02aad9c8, 0x030257fd, 0x0374de07, 0x0139c4f1, 0x016daee7, 0x000dd38b}}}, + {X: Field{[10]uint32{0x032e070d, 0x00ff4e8f, 0x02a98f58, 0x007314a9, 0x0229aab7, 0x021411f8, 0x00731c3b, 0x012affd2, 0x01e9042f, 0x0012dca9}}, Y: Field{[10]uint32{0x016dd780, 0x02ea0bba, 0x00c3de44, 0x03774a52, 0x00b0b465, 0x0343cf04, 0x0277bb36, 0x03873d80, 0x014e1d6a, 0x00166787}}}, + {X: Field{[10]uint32{0x00ae86f9, 0x03a78324, 0x03caf054, 0x015a58f9, 0x01fefdff, 0x01b17f1a, 0x010955e5, 0x0272edf8, 0x03ac428e, 0x0004a794}}, Y: Field{[10]uint32{0x0289c85d, 0x03bf7347, 0x0201b822, 0x03f45acf, 0x03b2a232, 0x01c4860f, 0x01a2115b, 0x0268a6cb, 0x03958aee, 0x001057b2}}}, + {X: Field{[10]uint32{0x0202591c, 0x039ff612, 0x025a1e9c, 0x02596144, 0x013ef549, 0x01787f58, 0x026bfbeb, 0x03238a16, 0x03fc6539, 0x002a7f24}}, Y: Field{[10]uint32{0x01bec2dc, 0x02b77bda, 0x03253790, 0x01057f3d, 0x01ca888c, 0x02a45979, 0x004c17a1, 0x021c5cfa, 0x0339dc53, 0x00270b39}}}, + {X: Field{[10]uint32{0x005912ec, 0x01c0283e, 0x01113428, 0x00139182, 0x0327f9ca, 0x02abc150, 0x03499694, 0x016de1aa, 0x01d4e3fb, 0x002a9c48}}, Y: Field{[10]uint32{0x02e35978, 0x0132c992, 0x02cbdb11, 0x02a33815, 0x03fee134, 0x01a8bb7a, 0x005266b9, 0x02542714, 0x0077dad0, 0x0031a43c}}}, + {X: Field{[10]uint32{0x01968b59, 0x001b838b, 0x03c2e110, 0x02b84f2e, 0x0309a28b, 0x0026c09d, 0x03d7ac12, 0x027c29a9, 0x017c1a6f, 0x00325000}}, Y: Field{[10]uint32{0x01e572fb, 0x035d9023, 0x009c8fef, 0x02d90e43, 0x00e2842c, 0x016d5d0b, 0x038a1bfa, 0x0218804e, 0x02500c9b, 0x000e7648}}}, + {X: Field{[10]uint32{0x0055b8da, 0x0090f57a, 0x00711922, 0x01f44a25, 0x02c75626, 0x03b84255, 0x005ecb6a, 0x0251216e, 0x0094c8f6, 0x00180511}}, Y: Field{[10]uint32{0x034e4bbd, 0x0001643c, 0x02a4bad5, 0x0309f8fc, 0x03543955, 0x004cb996, 0x00be1fd9, 0x03991a7a, 0x0269f681, 0x0022ed75}}}, + {X: Field{[10]uint32{0x026b3332, 0x01cccd5c, 0x01de6a28, 0x0341cfb9, 0x00310388, 0x01c2fe38, 0x02793a5f, 0x000093b1, 0x039d7eed, 0x0007e12e}}, Y: Field{[10]uint32{0x00e8d52e, 0x010a28c5, 0x003a2554, 0x00b50db7, 0x00c2bcce, 0x016e7b7c, 0x007c27f7, 0x027b3095, 0x01072bca, 0x003b9c9b}}}, + {X: Field{[10]uint32{0x01972bcb, 0x02565e6c, 0x00ceb9dd, 0x00f8907b, 0x02c2f22e, 0x03b685dd, 0x028e0213, 0x027c0a3d, 0x0057c8bb, 0x000f7cb4}}, Y: Field{[10]uint32{0x025d09df, 0x008b34f5, 0x00771b28, 0x025a0065, 0x031b9144, 0x011a9a12, 0x026b23b0, 0x01bbab5b, 0x01c640c8, 0x00371fac}}}, + {X: Field{[10]uint32{0x01efa98e, 0x02a952b3, 0x027995cd, 0x01a046b0, 0x03724844, 0x02647a71, 0x028157b3, 0x03f341b2, 0x00890945, 0x0003c4f8}}, Y: Field{[10]uint32{0x02286767, 0x029dda6f, 0x02ccdc08, 0x01785b3a, 0x03287e70, 0x01ecd8b6, 0x023f8b0a, 0x01f140d7, 0x01f1764e, 0x002b7548}}}, + {X: Field{[10]uint32{0x03d292dc, 0x001a893f, 0x014ce1b8, 0x0202c5dc, 0x01775e26, 0x01ef5e76, 0x008070d3, 0x03e4d2e9, 0x01533720, 0x0012e645}}, Y: Field{[10]uint32{0x03095ca6, 0x0297ff95, 0x02afd433, 0x03116cdd, 0x03938323, 0x017c07d5, 0x03c0a74b, 0x00e889b7, 0x01496110, 0x0038c9dd}}}, + {X: Field{[10]uint32{0x01f59b6b, 0x00700efa, 0x00e2fa5e, 0x018f0622, 0x03e9b38c, 0x035609b4, 0x0328a1d2, 0x03b1f6cd, 0x01a551dd, 0x00377864}}, Y: Field{[10]uint32{0x02cb1410, 0x03658a49, 0x00fecf6a, 0x02ef9c55, 0x028b5738, 0x0314b853, 0x02757d61, 0x01d72f82, 0x03780282, 0x0016cafe}}}, + {X: Field{[10]uint32{0x03b43eeb, 0x0346cd08, 0x0184feee, 0x0006fe04, 0x00181c94, 0x03cd6717, 0x024825ff, 0x017a4dfa, 0x03979eb9, 0x0020f100}}, Y: Field{[10]uint32{0x0084fb51, 0x00d021b5, 0x03b40aff, 0x032ad54f, 0x0295b6bf, 0x0003586c, 0x03c1e46d, 0x03b8f42f, 0x03f2437c, 0x000a55d7}}}, + {X: Field{[10]uint32{0x01c6b699, 0x03157f72, 0x02871b68, 0x00d5af91, 0x02a86f57, 0x01ed05a0, 0x016d7bf9, 0x01bde968, 0x012eed83, 0x0017eac0}}, Y: Field{[10]uint32{0x01c6c3aa, 0x00c854b0, 0x03519b17, 0x01ffaa20, 0x0390ab11, 0x00358bde, 0x02bb4113, 0x034513a7, 0x0270a3c3, 0x000b66fe}}}, + {X: Field{[10]uint32{0x0234d24f, 0x00d8cb76, 0x037401e2, 0x03c32684, 0x0141b6d8, 0x033d0bb9, 0x011df6de, 0x005a764e, 0x0143c5cf, 0x0039290b}}, Y: Field{[10]uint32{0x02ba9414, 0x03dc4c77, 0x024f13a7, 0x037ea363, 0x00e886ee, 0x02e2b4d3, 0x03c99ccf, 0x031cd49b, 0x02e716d1, 0x001367e4}}}, + }, + { + {X: Field{[10]uint32{0x0234d24f, 0x00d8cb76, 0x037401e2, 0x03c32684, 0x0141b6d8, 0x033d0bb9, 0x011df6de, 0x005a764e, 0x0143c5cf, 0x0039290b}}, Y: Field{[10]uint32{0x02ba9414, 0x03dc4c77, 0x024f13a7, 0x037ea363, 0x00e886ee, 0x02e2b4d3, 0x03c99ccf, 0x031cd49b, 0x02e716d1, 0x001367e4}}}, + {X: Field{[10]uint32{0x028f62bb, 0x03cba8cf, 0x00d2a303, 0x018bdeb9, 0x010553c5, 0x01b13bd3, 0x030acf85, 0x02c634fb, 0x01fb84cf, 0x003f5914}}, Y: Field{[10]uint32{0x032c0911, 0x03642184, 0x0283fd0a, 0x024b4803, 0x00fa2ab4, 0x02f0d133, 0x03e7a5c1, 0x0055e2db, 0x02b2b187, 0x0039d173}}}, + {X: Field{[10]uint32{0x03ea0c68, 0x01042bce, 0x0392b5c8, 0x008d9dec, 0x03094301, 0x034e5beb, 0x009bc8e8, 0x028e8925, 0x0234e156, 0x000f9065}}, Y: Field{[10]uint32{0x0245edb6, 0x02dbfdc6, 0x01a1abcb, 0x0118c0f3, 0x022fa119, 0x01c1a4c1, 0x033cbfe3, 0x0087dfcd, 0x019d924b, 0x000048f1}}}, + {X: Field{[10]uint32{0x01fe696b, 0x0347ee75, 0x007a1fa1, 0x035773cf, 0x030042e2, 0x03e7b6ee, 0x02e81a06, 0x021af1c5, 0x007cb240, 0x0007bb88}}, Y: Field{[10]uint32{0x0029337b, 0x0159c39d, 0x0294ebb4, 0x00b82bf5, 0x037a0206, 0x01187257, 0x03196d12, 0x009a734a, 0x0119aef6, 0x00194b2f}}}, + {X: Field{[10]uint32{0x039824d7, 0x01748f24, 0x01897af7, 0x0130d472, 0x036eb7b6, 0x03dfc2d5, 0x014a3e62, 0x01d423bb, 0x00f5455d, 0x0023650e}}, Y: Field{[10]uint32{0x0366489f, 0x0013d224, 0x0063d8a0, 0x02e0c9ac, 0x038fb9e2, 0x02adbbdb, 0x0260bd31, 0x01b0a8b2, 0x00734fee, 0x000c9878}}}, + {X: Field{[10]uint32{0x03d4b84a, 0x02053105, 0x033e69a9, 0x0123c7d0, 0x00621ddf, 0x00a141c1, 0x022a492d, 0x00bf2c31, 0x01e58dc7, 0x003c4ea6}}, Y: Field{[10]uint32{0x03fd1c81, 0x0243f154, 0x01962859, 0x011c43cb, 0x02b6e37d, 0x038ff81b, 0x02b91cd1, 0x03a656a9, 0x00cd0f0b, 0x000cf0b2}}}, + {X: Field{[10]uint32{0x00d713de, 0x0201c6a6, 0x026208e4, 0x03edd0a3, 0x039360c2, 0x03f95150, 0x00a912a2, 0x01510835, 0x00c558ee, 0x002dc949}}, Y: Field{[10]uint32{0x038350e9, 0x03f94966, 0x01fcb76f, 0x01bf9129, 0x010482d2, 0x0275a505, 0x002d182e, 0x00f91441, 0x039a8a28, 0x0013146c}}}, + {X: Field{[10]uint32{0x0394c0d5, 0x0103c67b, 0x0257908d, 0x0005f15c, 0x01e1c0fc, 0x011b8844, 0x025ab2c3, 0x03ac5351, 0x033ea8a9, 0x003303a8}}, Y: Field{[10]uint32{0x03452fe6, 0x02f965eb, 0x03543dea, 0x0099844f, 0x03f6074f, 0x017ef998, 0x03dd203b, 0x0228bec8, 0x023b711c, 0x003e641e}}}, + {X: Field{[10]uint32{0x023b2cb4, 0x01b0a4ff, 0x010402cc, 0x016fcdc8, 0x023049f3, 0x00484527, 0x01c76e38, 0x0049466b, 0x035a216d, 0x000f7917}}, Y: Field{[10]uint32{0x007eb02f, 0x038ceb0c, 0x0044cf61, 0x03996a1c, 0x02823e28, 0x025f2441, 0x0208aa4a, 0x02b77143, 0x0198405e, 0x002e8aa1}}}, + {X: Field{[10]uint32{0x020c0222, 0x02f5d44a, 0x00b559cc, 0x03e720ba, 0x0016937e, 0x005c03cb, 0x00a18bfc, 0x0228111b, 0x024d9ca5, 0x002792b1}}, Y: Field{[10]uint32{0x00fdc9bb, 0x03dd9ce9, 0x0104e16c, 0x003cf6ae, 0x001c6203, 0x00ecc034, 0x000e8df6, 0x039d34c2, 0x011d9fe4, 0x0033a917}}}, + {X: Field{[10]uint32{0x00e4e5bf, 0x011d9bdb, 0x005b1723, 0x021a8240, 0x029b67ca, 0x012241ab, 0x023fce37, 0x02fa1f07, 0x01c68959, 0x0021447c}}, Y: Field{[10]uint32{0x01789c08, 0x024a5130, 0x025262fc, 0x0226f14d, 0x032da878, 0x01aa8008, 0x01ddf7ec, 0x03521d30, 0x01cf91bc, 0x003b37fd}}}, + {X: Field{[10]uint32{0x02735a1e, 0x030ec513, 0x01fa05f0, 0x0259af98, 0x004003e0, 0x018480bf, 0x038cddad, 0x015b2d1a, 0x03c0799b, 0x0019e2b1}}, Y: Field{[10]uint32{0x02f7c055, 0x00e97dc4, 0x01457a36, 0x02ccf4dc, 0x02597fff, 0x01c417a3, 0x030ff3d5, 0x00a16de9, 0x0233d9a5, 0x00021453}}}, + {X: Field{[10]uint32{0x013258ab, 0x0159a28f, 0x014dc31b, 0x02062af0, 0x0157d242, 0x03852ad6, 0x03a1c72e, 0x018088b3, 0x012e81cf, 0x00231681}}, Y: Field{[10]uint32{0x022d0f8f, 0x038214c0, 0x004ade57, 0x03e70365, 0x0246dae8, 0x00130230, 0x01a80c79, 0x02f6841e, 0x034bb443, 0x001a0476}}}, + {X: Field{[10]uint32{0x022aa9b8, 0x03a5dc20, 0x02f8ed7b, 0x00a4cd41, 0x0300006e, 0x0316b517, 0x026895d9, 0x003db375, 0x0114d868, 0x00192ea5}}, Y: Field{[10]uint32{0x02163565, 0x0347ee6d, 0x03b35e93, 0x01bda0c1, 0x025fef1b, 0x0066f927, 0x0207728c, 0x006f6edf, 0x0322a643, 0x002049cf}}}, + {X: Field{[10]uint32{0x0391bcee, 0x030a82af, 0x00d84158, 0x023c7830, 0x03f5cf1d, 0x015afc4d, 0x0063cec5, 0x00d582f7, 0x0016debd, 0x0033bdfe}}, Y: Field{[10]uint32{0x01966b33, 0x0136a7e0, 0x036ac6bb, 0x000a85cb, 0x03a63e4b, 0x00074917, 0x023b339c, 0x021c0491, 0x00836374, 0x0019f9d3}}}, + {X: Field{[10]uint32{0x0300bf19, 0x01cee750, 0x02a49471, 0x01daa23f, 0x0392b535, 0x02cd4ada, 0x0160fada, 0x02f76550, 0x03ef360c, 0x0007b203}}, Y: Field{[10]uint32{0x0107cefd, 0x03370730, 0x0207b671, 0x01fd8a56, 0x020146e7, 0x01eaefd7, 0x03a4958a, 0x00d034bc, 0x013756b5, 0x002bbbfa}}}, + }, + { + {X: Field{[10]uint32{0x0300bf19, 0x01cee750, 0x02a49471, 0x01daa23f, 0x0392b535, 0x02cd4ada, 0x0160fada, 0x02f76550, 0x03ef360c, 0x0007b203}}, Y: Field{[10]uint32{0x0107cefd, 0x03370730, 0x0207b671, 0x01fd8a56, 0x020146e7, 0x01eaefd7, 0x03a4958a, 0x00d034bc, 0x013756b5, 0x002bbbfa}}}, + {X: Field{[10]uint32{0x014ff9e4, 0x03a01750, 0x010560da, 0x03dbaf62, 0x038e8462, 0x013f242e, 0x02eaa034, 0x012f1b2f, 0x023519f0, 0x0016f9fa}}, Y: Field{[10]uint32{0x03e0bdbb, 0x002c1e11, 0x02309403, 0x00c08466, 0x020e99c6, 0x0156adff, 0x03f890f6, 0x0398151d, 0x02c3f638, 0x000cbccb}}}, + {X: Field{[10]uint32{0x02fea1f9, 0x01f2ef14, 0x012b94b1, 0x01423011, 0x01c4ff0b, 0x01c4194c, 0x00fddab6, 0x03cba0ef, 0x000a55d1, 0x0029b722}}, Y: Field{[10]uint32{0x03c345e9, 0x0305391e, 0x037e63b1, 0x036df9a3, 0x00057b89, 0x01ab2f14, 0x00683a11, 0x019f0c0e, 0x00547dc3, 0x001fbc6a}}}, + {X: Field{[10]uint32{0x01db7bb8, 0x02d517d3, 0x03991e3f, 0x01927e14, 0x00d50028, 0x0237dfd7, 0x013fc869, 0x01399420, 0x01116eae, 0x00163c26}}, Y: Field{[10]uint32{0x025b2d6e, 0x031cd60b, 0x00302bde, 0x0018b45d, 0x02507ee4, 0x0118e019, 0x022ff761, 0x00446835, 0x002aaffe, 0x001f81c0}}}, + {X: Field{[10]uint32{0x02d6c9b3, 0x01030fc1, 0x01637c8d, 0x03a1d219, 0x028c6c4c, 0x0229206e, 0x01c229c7, 0x011664af, 0x013fea42, 0x003f9aea}}, Y: Field{[10]uint32{0x0148bdfb, 0x031e23ea, 0x029b00c2, 0x02fc170b, 0x02d980f1, 0x01504ed5, 0x03b41b34, 0x0261cada, 0x00d74053, 0x001fba46}}}, + {X: Field{[10]uint32{0x007985c4, 0x004f9dc7, 0x02b108b6, 0x01256e78, 0x00134bfc, 0x00bdd30d, 0x00284280, 0x026df395, 0x01caf7b5, 0x0008c82d}}, Y: Field{[10]uint32{0x002c6d44, 0x013c77d3, 0x02b8d4ff, 0x00847367, 0x03d96f10, 0x03e6f2a4, 0x00721b81, 0x03a50c63, 0x003dc88b, 0x0031e7e5}}}, + {X: Field{[10]uint32{0x00f95151, 0x03c41cc3, 0x00b64422, 0x01b910b1, 0x01b96480, 0x030237b4, 0x020c8c2d, 0x0262fec0, 0x02f146fc, 0x00057578}}, Y: Field{[10]uint32{0x03f8ecf2, 0x0281f30b, 0x000f9482, 0x02e5f763, 0x01bb204f, 0x022408fe, 0x010e1097, 0x0353b1fe, 0x0231915f, 0x00296dcb}}}, + {X: Field{[10]uint32{0x009a8e2c, 0x030581b3, 0x021c1413, 0x00693306, 0x03823d8d, 0x021832c3, 0x03cc04fd, 0x0242d8ce, 0x00b9b297, 0x002c3e79}}, Y: Field{[10]uint32{0x033d0db4, 0x0019b137, 0x00ee76c2, 0x000b05c7, 0x003350cc, 0x01bf78fc, 0x00bb0b90, 0x0379b507, 0x03f1843a, 0x00127a0a}}}, + {X: Field{[10]uint32{0x016a5658, 0x02042e4a, 0x025643d7, 0x014907bd, 0x023814b2, 0x01eb8a6f, 0x007e0092, 0x0111eb63, 0x00725688, 0x0021303a}}, Y: Field{[10]uint32{0x001b80d1, 0x019ca6f6, 0x01fd22d9, 0x02607d3c, 0x02d3a61a, 0x0194dc97, 0x007e3190, 0x008b1282, 0x0380c160, 0x00099660}}}, + {X: Field{[10]uint32{0x01d6fad4, 0x000bca76, 0x0124c5aa, 0x033c7268, 0x0094b357, 0x004f567d, 0x02d04ce2, 0x0247b23e, 0x0280670a, 0x0015b6d8}}, Y: Field{[10]uint32{0x019e0836, 0x02703f4d, 0x01cc867a, 0x02868c79, 0x03f5b8b2, 0x035a0c31, 0x03591016, 0x009c9143, 0x0394db57, 0x0036834e}}}, + {X: Field{[10]uint32{0x00dc6a0f, 0x02ed7225, 0x01575375, 0x02450bf8, 0x02744341, 0x00b01df0, 0x01264e7a, 0x01cc7559, 0x01c71a93, 0x003fb5ac}}, Y: Field{[10]uint32{0x036fc7e0, 0x0235cb65, 0x00409ccb, 0x024c28ff, 0x031374d5, 0x0134eb88, 0x039181ae, 0x03fc2a11, 0x03e6b0ff, 0x002378aa}}}, + {X: Field{[10]uint32{0x023a809c, 0x0382c2f2, 0x0346d79f, 0x03d75e60, 0x02dab662, 0x00952a27, 0x03cf97e4, 0x037d5afe, 0x02c83933, 0x0004979f}}, Y: Field{[10]uint32{0x009e70d9, 0x032402a5, 0x00a3dda8, 0x00bbc1ff, 0x031e4e3b, 0x015c868d, 0x03747caf, 0x032ce221, 0x02ede254, 0x003834fd}}}, + {X: Field{[10]uint32{0x00e29355, 0x02217c46, 0x00d86db3, 0x024ce5c8, 0x002f1c8e, 0x0008ee76, 0x00ef8604, 0x032f1c3f, 0x01d992d3, 0x000a9a93}}, Y: Field{[10]uint32{0x01cc2872, 0x00f803ed, 0x0076c005, 0x00e99313, 0x01fe905a, 0x009a3e43, 0x00fdc81e, 0x01f831d8, 0x03ba7c4a, 0x00219df7}}}, + {X: Field{[10]uint32{0x03681028, 0x00a54479, 0x01bb47f5, 0x017abf2e, 0x03196e23, 0x036bcf63, 0x033ce97d, 0x008386fc, 0x03f1185d, 0x00286b2c}}, Y: Field{[10]uint32{0x00a11c9d, 0x02918f85, 0x017881f1, 0x009c7e83, 0x0266eecb, 0x0223c316, 0x00475882, 0x02ca6da8, 0x03a61abb, 0x00156a20}}}, + {X: Field{[10]uint32{0x0148dabf, 0x03ea23f8, 0x038eb1f9, 0x02e4d275, 0x01c1add2, 0x017eb9cd, 0x0364ec23, 0x01d51b65, 0x03026c92, 0x00390b64}}, Y: Field{[10]uint32{0x011e1361, 0x00b1d5a0, 0x03eb9d77, 0x01c0679d, 0x00327275, 0x037ce14c, 0x0338cebf, 0x0212c362, 0x022c6e2d, 0x001904e1}}}, + {X: Field{[10]uint32{0x026642be, 0x02d64a0d, 0x03a889dd, 0x01c5f562, 0x03ce3490, 0x02037ea2, 0x0300af46, 0x0030be46, 0x038c0467, 0x00051a9d}}, Y: Field{[10]uint32{0x0183efd0, 0x00a5d20f, 0x01ed1d0b, 0x0074bdf9, 0x030aaa97, 0x02752ca1, 0x0269827f, 0x000a2b75, 0x00ec3354, 0x002cc638}}}, + }, + { + {X: Field{[10]uint32{0x026642be, 0x02d64a0d, 0x03a889dd, 0x01c5f562, 0x03ce3490, 0x02037ea2, 0x0300af46, 0x0030be46, 0x038c0467, 0x00051a9d}}, Y: Field{[10]uint32{0x0183efd0, 0x00a5d20f, 0x01ed1d0b, 0x0074bdf9, 0x030aaa97, 0x02752ca1, 0x0269827f, 0x000a2b75, 0x00ec3354, 0x002cc638}}}, + {X: Field{[10]uint32{0x01de5cac, 0x008d955e, 0x0261911b, 0x00f1fb2c, 0x03eefc98, 0x02f34533, 0x0270b5c0, 0x01f89395, 0x00ce8a59, 0x0015d3bc}}, Y: Field{[10]uint32{0x035a4805, 0x026ba9b1, 0x0008cae5, 0x01efbc40, 0x011a260a, 0x01a6de11, 0x016ada05, 0x00671cef, 0x0130281f, 0x00026e66}}}, + {X: Field{[10]uint32{0x03315443, 0x00e1ce09, 0x027299d9, 0x03552ba1, 0x013d79bb, 0x002850a8, 0x02c89982, 0x024d7fd0, 0x00040660, 0x003f1a5b}}, Y: Field{[10]uint32{0x03d28960, 0x003582d5, 0x011b1749, 0x0218426f, 0x01487ff4, 0x01a59ded, 0x030e1cdd, 0x01624aef, 0x03ebf83b, 0x00383389}}}, + {X: Field{[10]uint32{0x020966d3, 0x030b5d09, 0x00645808, 0x0306bbfe, 0x0110a770, 0x026320d7, 0x0109397b, 0x03e7e176, 0x02799d8b, 0x0034f65f}}, Y: Field{[10]uint32{0x033c2e52, 0x03ae1420, 0x004eebdd, 0x0046fa37, 0x03b5e487, 0x03500eb4, 0x02a89275, 0x032579aa, 0x006376ba, 0x002376ed}}}, + {X: Field{[10]uint32{0x02fdb4eb, 0x02cbd705, 0x02a79d1b, 0x01e718b9, 0x028fa3dd, 0x00afac24, 0x0256a356, 0x03cab46b, 0x0221ff4f, 0x0025d2bc}}, Y: Field{[10]uint32{0x01f6f484, 0x0270f7ea, 0x00234840, 0x00a8efff, 0x01111c57, 0x00b0243b, 0x011e43d0, 0x000f2993, 0x007d5350, 0x0015548e}}}, + {X: Field{[10]uint32{0x006b5b56, 0x01857f5f, 0x00b607f3, 0x02abb622, 0x014185c8, 0x02fc8039, 0x03587ed3, 0x010ce337, 0x025700ef, 0x00283a21}}, Y: Field{[10]uint32{0x021d7518, 0x02f7944e, 0x00a51a16, 0x0075c216, 0x01526b87, 0x0214f7ab, 0x01a6b89b, 0x02b542e6, 0x02839fa9, 0x003d6e91}}}, + {X: Field{[10]uint32{0x015aeee3, 0x0012b6d7, 0x00813739, 0x030d9963, 0x01e8284b, 0x01a49c31, 0x0121b3a6, 0x00e62c24, 0x019b49de, 0x0016eaad}}, Y: Field{[10]uint32{0x00f69717, 0x00a6bedc, 0x01eed82d, 0x0276af4c, 0x03215ddc, 0x007ff6bd, 0x01a00866, 0x01fa15b9, 0x03617c0f, 0x002295df}}}, + {X: Field{[10]uint32{0x028c6d4b, 0x003ee4e5, 0x00c12004, 0x033e3d25, 0x02b2be78, 0x032efb82, 0x0174e782, 0x006261ee, 0x013288b3, 0x002c6a99}}, Y: Field{[10]uint32{0x0091ac51, 0x02798aba, 0x03cc383d, 0x02427588, 0x03100a1d, 0x0358ea0e, 0x004aa8e2, 0x0035c49a, 0x031c6081, 0x001fb581}}}, + {X: Field{[10]uint32{0x01726890, 0x02c7913d, 0x03d15851, 0x03fab20d, 0x02e59025, 0x03e44283, 0x0032fceb, 0x0310f404, 0x03a7eb49, 0x003eda17}}, Y: Field{[10]uint32{0x0035783a, 0x03aa3cee, 0x039b2606, 0x004ba439, 0x014fa6cb, 0x02192e82, 0x01ca16d9, 0x0178ba1a, 0x0322c98e, 0x0035d437}}}, + {X: Field{[10]uint32{0x02c6e5bb, 0x03b6bb18, 0x03e6ab7e, 0x03b8d5b3, 0x0324fdff, 0x024a965f, 0x00ab0b83, 0x00417cd6, 0x004108c7, 0x0009445b}}, Y: Field{[10]uint32{0x037e1321, 0x011cca83, 0x0272d4dc, 0x037d4730, 0x0377c508, 0x02057763, 0x037406dc, 0x01df807a, 0x0113e771, 0x0018361a}}}, + {X: Field{[10]uint32{0x00bca48a, 0x012fc4ea, 0x0362f546, 0x03d3a0f7, 0x0178b4d5, 0x00a1fdc7, 0x0327b91c, 0x0265682a, 0x03f659e2, 0x00177963}}, Y: Field{[10]uint32{0x02fd41cd, 0x0253a034, 0x00aa9587, 0x0271383e, 0x003fe5bd, 0x014b4f21, 0x01a623c2, 0x026d54c2, 0x033d8035, 0x001a168e}}}, + {X: Field{[10]uint32{0x00cedd26, 0x01977dd4, 0x015541d7, 0x0277a95c, 0x023cc8b9, 0x0258e78a, 0x01d8100f, 0x03aec984, 0x00372961, 0x002be212}}, Y: Field{[10]uint32{0x00e43f7f, 0x039eb4ec, 0x001708b6, 0x01219ea9, 0x0254549e, 0x02fb4be5, 0x00cbb88e, 0x01c0c34a, 0x03f97b16, 0x003715fe}}}, + {X: Field{[10]uint32{0x01ef63b6, 0x00e0d139, 0x0182ebde, 0x0059cc6c, 0x005ab4d0, 0x02d3f072, 0x01b7fda3, 0x0062febc, 0x01cdead6, 0x001bc609}}, Y: Field{[10]uint32{0x01c655f3, 0x0211b3d1, 0x0145412c, 0x019009fe, 0x013c895a, 0x020ccd15, 0x034204d7, 0x02446e63, 0x027dd591, 0x003fc25f}}}, + {X: Field{[10]uint32{0x02a50e2d, 0x02796c7e, 0x00bdc39f, 0x03b3dab9, 0x00b5a275, 0x00206b74, 0x0256e3ea, 0x0200d96c, 0x02605b88, 0x00148435}}, Y: Field{[10]uint32{0x02fda8ee, 0x026a24d6, 0x0286eb02, 0x03371909, 0x035a273d, 0x03fd9622, 0x0013c0e7, 0x034c04e7, 0x034a5dec, 0x000d7d99}}}, + {X: Field{[10]uint32{0x00a63f3b, 0x0011fb7d, 0x039727b5, 0x000665e3, 0x0183203b, 0x039db1d9, 0x007115f5, 0x028ddad6, 0x0095f762, 0x00317b2e}}, Y: Field{[10]uint32{0x01005024, 0x03cdd1a1, 0x03ee5b53, 0x03b978c2, 0x008beb65, 0x03e48cfb, 0x02a4058f, 0x0207cdd3, 0x01181978, 0x00088949}}}, + {X: Field{[10]uint32{0x0180eef9, 0x01aa1e4c, 0x039776d7, 0x008268a2, 0x028d0012, 0x02a81ec4, 0x03acebb1, 0x0397c1f8, 0x00f61d22, 0x003e9430}}, Y: Field{[10]uint32{0x034f2811, 0x03635f4f, 0x0213b38c, 0x024e95e8, 0x025e6832, 0x00a069a2, 0x02cd2872, 0x03aea6dc, 0x02922397, 0x001ae131}}}, + }, + { + {X: Field{[10]uint32{0x0180eef9, 0x01aa1e4c, 0x039776d7, 0x008268a2, 0x028d0012, 0x02a81ec4, 0x03acebb1, 0x0397c1f8, 0x00f61d22, 0x003e9430}}, Y: Field{[10]uint32{0x034f2811, 0x03635f4f, 0x0213b38c, 0x024e95e8, 0x025e6832, 0x00a069a2, 0x02cd2872, 0x03aea6dc, 0x02922397, 0x001ae131}}}, + {X: Field{[10]uint32{0x007f5048, 0x016f88c6, 0x006d459c, 0x0349120e, 0x02e72328, 0x00ba420d, 0x00140fe0, 0x01d381e0, 0x02ee6190, 0x0018e593}}, Y: Field{[10]uint32{0x01309df8, 0x028a1362, 0x02c84383, 0x024d3779, 0x013d580b, 0x00d2fef2, 0x01ff9b1c, 0x033d068e, 0x033a6b89, 0x000edb3e}}}, + {X: Field{[10]uint32{0x01da5e12, 0x03838ce4, 0x00b2971e, 0x0100572b, 0x02a9c60a, 0x028728ad, 0x02329f93, 0x038c6f36, 0x023c4379, 0x003dd40b}}, Y: Field{[10]uint32{0x0385f4eb, 0x02e717a0, 0x00ebc7a4, 0x00bbdc97, 0x007b86d3, 0x00f59c81, 0x0170945c, 0x03ebf566, 0x01edd67c, 0x000f15fd}}}, + {X: Field{[10]uint32{0x02db2a65, 0x012e87ae, 0x01a31f81, 0x00ab4f2f, 0x01afd7f1, 0x003f27dd, 0x01469ddf, 0x02df88b4, 0x025b4d15, 0x00168f38}}, Y: Field{[10]uint32{0x01327f1d, 0x005c33c7, 0x03e8ed8b, 0x030f6097, 0x033ee28b, 0x03cfe66b, 0x03a6dbfb, 0x017d8e1c, 0x025b92e0, 0x0022cd04}}}, + {X: Field{[10]uint32{0x00b7d105, 0x0124cc44, 0x03c9f207, 0x012e5395, 0x03f4ca5c, 0x038d156c, 0x024f6624, 0x01618a8e, 0x00f983ae, 0x0004bf9e}}, Y: Field{[10]uint32{0x03794a60, 0x02b1bee7, 0x010b8458, 0x01975bba, 0x031dece2, 0x0269f2dd, 0x02b5aa19, 0x02f3dde1, 0x01a338d6, 0x000818bc}}}, + {X: Field{[10]uint32{0x0232478e, 0x00c481cf, 0x027ed237, 0x023caa6e, 0x0024ab31, 0x03cccac8, 0x02c6b7f3, 0x004e203f, 0x01d60106, 0x00350804}}, Y: Field{[10]uint32{0x004e88d4, 0x0015a074, 0x00cc31ce, 0x00bcd542, 0x036fb24b, 0x012fe11e, 0x02d5f5f4, 0x0138306c, 0x00e9a37d, 0x002eb975}}}, + {X: Field{[10]uint32{0x020c5d05, 0x00760ce7, 0x02daff62, 0x0142a95c, 0x02480e6c, 0x020212c6, 0x004bb102, 0x011cf563, 0x031347df, 0x001daab0}}, Y: Field{[10]uint32{0x01ece63e, 0x01866dd4, 0x02ee3556, 0x033c0579, 0x034b1225, 0x00809897, 0x02f32c83, 0x01c3beaf, 0x02ef0d5c, 0x003bd55d}}}, + {X: Field{[10]uint32{0x029f44d0, 0x01ccdd52, 0x03a0016a, 0x01b9a6a3, 0x0385dbcb, 0x0037907f, 0x010be34f, 0x00fb69a4, 0x01af98f9, 0x00173981}}, Y: Field{[10]uint32{0x01d30105, 0x0017cd22, 0x00cc6c0d, 0x02fe8cbb, 0x00ab3cb1, 0x0071db16, 0x0256bd03, 0x01aff9ee, 0x039bec22, 0x00133773}}}, + {X: Field{[10]uint32{0x0053c086, 0x01bd217f, 0x01aec9e2, 0x00d27268, 0x00c6b55c, 0x017a2041, 0x0260c314, 0x0173321f, 0x025bbe5c, 0x002998ff}}, Y: Field{[10]uint32{0x01016201, 0x03140ca9, 0x00fc0e69, 0x0295ce65, 0x03991ecc, 0x02608f70, 0x01b102c8, 0x007efd74, 0x017f6b21, 0x002d5066}}}, + {X: Field{[10]uint32{0x01f40840, 0x0035a472, 0x0359eaa2, 0x010a7954, 0x03a71df4, 0x00e290d1, 0x00eaa239, 0x03dd07f9, 0x0121121f, 0x00380d1b}}, Y: Field{[10]uint32{0x03d7ce72, 0x0286abfc, 0x033edc39, 0x0269baf4, 0x02269cd3, 0x03b9ee8a, 0x016d4a97, 0x02255b5d, 0x03713c99, 0x000fb9a0}}}, + {X: Field{[10]uint32{0x03758574, 0x02007b52, 0x01c6e9ad, 0x02250d3e, 0x03d83266, 0x02b8af7c, 0x03ca1027, 0x0336096d, 0x027a0206, 0x0037a554}}, Y: Field{[10]uint32{0x0367232a, 0x037c7f3e, 0x02deb4b7, 0x00145568, 0x03bae6a1, 0x03c5a7b5, 0x021dc847, 0x03453938, 0x0056ac93, 0x001334f8}}}, + {X: Field{[10]uint32{0x016ddcd3, 0x01c8dee8, 0x0003556a, 0x000087a8, 0x03044b11, 0x02e1d86b, 0x035beb6c, 0x0267b7de, 0x0136f64e, 0x0006b86b}}, Y: Field{[10]uint32{0x027eb2b7, 0x0118674b, 0x0213c7cc, 0x0377f2ed, 0x0159616a, 0x00841122, 0x0074f775, 0x02488167, 0x014987a0, 0x001c0581}}}, + {X: Field{[10]uint32{0x0185474f, 0x026e2aff, 0x00668d77, 0x00ae258d, 0x02894c4a, 0x011e16ba, 0x02dccbe4, 0x00ab76ff, 0x00e066d3, 0x002369af}}, Y: Field{[10]uint32{0x017b4ef7, 0x03e71f4f, 0x01d7a5fd, 0x024c176f, 0x010b1cc5, 0x01c77ffc, 0x03ddf5d0, 0x0353fe13, 0x006af31e, 0x0004ff1b}}}, + {X: Field{[10]uint32{0x029de533, 0x03ffe242, 0x02e3c80f, 0x019c08d5, 0x002a9bb5, 0x0191c49d, 0x02979f6a, 0x0243e483, 0x01123337, 0x00044e2b}}, Y: Field{[10]uint32{0x01332573, 0x02dc253f, 0x040006a8, 0x002d1528, 0x03f679bd, 0x03e569f7, 0x030dc3e9, 0x0076521b, 0x01b75875, 0x002cd549}}}, + {X: Field{[10]uint32{0x01d042ea, 0x0350959f, 0x02fd06b5, 0x0299163a, 0x02ebfa26, 0x00cf24ef, 0x03d6649e, 0x02e8e6c6, 0x00c7cfb3, 0x001cca6b}}, Y: Field{[10]uint32{0x035c94a1, 0x0233fb0b, 0x034f0ada, 0x01cc77ea, 0x02184897, 0x03eada3b, 0x0284e794, 0x01bc5224, 0x013541b7, 0x00249c92}}}, + {X: Field{[10]uint32{0x03067ec2, 0x00f4cad7, 0x025220e5, 0x02d756ee, 0x021a288a, 0x03623a10, 0x025bf6b7, 0x006846c6, 0x01d0ca72, 0x00368758}}, Y: Field{[10]uint32{0x02d836f1, 0x03ee83c6, 0x0348a655, 0x026749e6, 0x0166a738, 0x0072478a, 0x00076616, 0x00c1b1e7, 0x015a7c99, 0x002055fd}}}, + }, + { + {X: Field{[10]uint32{0x03067ec2, 0x00f4cad7, 0x025220e5, 0x02d756ee, 0x021a288a, 0x03623a10, 0x025bf6b7, 0x006846c6, 0x01d0ca72, 0x00368758}}, Y: Field{[10]uint32{0x02d836f1, 0x03ee83c6, 0x0348a655, 0x026749e6, 0x0166a738, 0x0072478a, 0x00076616, 0x00c1b1e7, 0x015a7c99, 0x002055fd}}}, + {X: Field{[10]uint32{0x00d3c369, 0x0084348b, 0x02934b3c, 0x020f87e3, 0x02236054, 0x03704a0e, 0x005d5f61, 0x0311137e, 0x000b4ef4, 0x00271ef8}}, Y: Field{[10]uint32{0x02329515, 0x038ffae8, 0x01cbd29e, 0x00e859da, 0x003e3115, 0x03390052, 0x0226d455, 0x0034814a, 0x00de74b2, 0x00248830}}}, + {X: Field{[10]uint32{0x0295a8db, 0x021dccbe, 0x036f615d, 0x03111e74, 0x03b83ec0, 0x0246c5c8, 0x02966469, 0x03741067, 0x01a46303, 0x0038fa43}}, Y: Field{[10]uint32{0x030d1cf9, 0x01b3dfc6, 0x00d3d101, 0x025f3261, 0x02fbb1ef, 0x01c0b9da, 0x00faa90c, 0x005e2ec0, 0x03c0056c, 0x003ef94e}}}, + {X: Field{[10]uint32{0x03b8c9e3, 0x03364b5e, 0x0178e76b, 0x029c1504, 0x0174dd06, 0x02333124, 0x01664b23, 0x0098eed5, 0x03f42825, 0x0003f360}}, Y: Field{[10]uint32{0x034aa9ad, 0x03557ef7, 0x03bf4e86, 0x0337c589, 0x03adbeae, 0x017f6da0, 0x018232de, 0x03ef3b47, 0x01cfeac5, 0x001b02f0}}}, + {X: Field{[10]uint32{0x012ee214, 0x02bf5904, 0x0154017a, 0x025e564c, 0x00782a4e, 0x01703007, 0x03650dfd, 0x035dd6a2, 0x02c732e3, 0x0027d3ff}}, Y: Field{[10]uint32{0x0085f37a, 0x01108894, 0x000283ef, 0x024c2f22, 0x019719b6, 0x035d71a7, 0x0296682f, 0x00bcb983, 0x02e1318e, 0x0018e738}}}, + {X: Field{[10]uint32{0x001d0ce6, 0x030f72d5, 0x00d41f4f, 0x028b3d66, 0x02748992, 0x00e817ec, 0x0214cce3, 0x02a504bb, 0x022937f1, 0x00050a56}}, Y: Field{[10]uint32{0x0338bb86, 0x0206a2b5, 0x0241a52a, 0x01806d74, 0x01310895, 0x011020ec, 0x0031c448, 0x0141c46c, 0x0363df11, 0x003fa9d4}}}, + {X: Field{[10]uint32{0x0361a0a5, 0x01a05147, 0x00e3ef8b, 0x0386cf05, 0x004b1253, 0x03d102cb, 0x031a0a41, 0x012b06c5, 0x022d4113, 0x0010c7d8}}, Y: Field{[10]uint32{0x00cef899, 0x01edff9e, 0x0177246b, 0x0010d559, 0x0241baaa, 0x01c8ea9c, 0x02de6519, 0x010e3db5, 0x027fe7aa, 0x0028a60c}}}, + {X: Field{[10]uint32{0x026b64f1, 0x00e6512c, 0x02d995cf, 0x00a3d51d, 0x01b7edcf, 0x01447967, 0x00da4c62, 0x03c04353, 0x007f1b58, 0x001c5d50}}, Y: Field{[10]uint32{0x024234d5, 0x039fbeac, 0x01d2a426, 0x02ddd11c, 0x02b01fe8, 0x00d3321b, 0x02d34011, 0x035543cd, 0x014344e3, 0x0010ed15}}}, + {X: Field{[10]uint32{0x03748503, 0x0099f559, 0x028e7cac, 0x011dcc4c, 0x000e6e0e, 0x03e284ab, 0x0362ef39, 0x023ee1b2, 0x02ddece7, 0x00264f6e}}, Y: Field{[10]uint32{0x02b0cee2, 0x01cd84df, 0x01aa49ba, 0x03da6e2b, 0x0217f87b, 0x01e87d46, 0x01f78478, 0x03bbade1, 0x01ee8569, 0x0029486a}}}, + {X: Field{[10]uint32{0x03421e21, 0x0136ea65, 0x022f4e46, 0x0288f3bf, 0x003aca86, 0x010633eb, 0x00289212, 0x005dcaea, 0x006b84e5, 0x0003083a}}, Y: Field{[10]uint32{0x01aa6a45, 0x020f5928, 0x01349dfc, 0x03d96f42, 0x0386ee76, 0x0386696d, 0x01237a11, 0x02b6b068, 0x01bf76d0, 0x003d587a}}}, + {X: Field{[10]uint32{0x02d23d80, 0x02889d69, 0x00d478de, 0x007c991d, 0x00e10bd1, 0x024258b0, 0x039431cb, 0x017a968c, 0x02ba06ad, 0x001d7c5e}}, Y: Field{[10]uint32{0x000dd57e, 0x02a16c0a, 0x02590986, 0x03b6ed3a, 0x02372ffb, 0x0066d8a4, 0x03c7d0bf, 0x026a031f, 0x02fe1563, 0x00281e98}}}, + {X: Field{[10]uint32{0x03344f7f, 0x0233e712, 0x020c4c71, 0x03f52339, 0x00ee8b89, 0x0349b504, 0x017e32cb, 0x0382b83a, 0x004bd972, 0x000d5332}}, Y: Field{[10]uint32{0x01db82d6, 0x02c46ba9, 0x020ec7e4, 0x0006180b, 0x018e36c6, 0x026ea215, 0x010b493f, 0x01ad759d, 0x0329291c, 0x0027012f}}}, + {X: Field{[10]uint32{0x01ad3413, 0x02e6db58, 0x01684ae2, 0x00100c9f, 0x028db9c0, 0x032e1ede, 0x0295f485, 0x03d2829b, 0x015e11d9, 0x00199e15}}, Y: Field{[10]uint32{0x02bca672, 0x0204081f, 0x02660124, 0x0054eb71, 0x02a6ce2d, 0x01f2f7e7, 0x01266d92, 0x03d91a49, 0x023de278, 0x00144376}}}, + {X: Field{[10]uint32{0x0102b4b1, 0x01ed7e0d, 0x00a44748, 0x01535b02, 0x01c4af25, 0x018884ea, 0x0086c0f2, 0x0250a101, 0x0018da0f, 0x002b3bc5}}, Y: Field{[10]uint32{0x02e85bfc, 0x007e9e59, 0x0078c6f8, 0x0242b7c6, 0x012a3f62, 0x03625c73, 0x00017b53, 0x01e93781, 0x019fd7e8, 0x003134d5}}}, + {X: Field{[10]uint32{0x02cc8563, 0x002bd6c1, 0x001eaac0, 0x016fff84, 0x009224df, 0x00658da2, 0x02c82bd8, 0x01dd22b6, 0x02362cda, 0x003af712}}, Y: Field{[10]uint32{0x0394ccfa, 0x005ef3a8, 0x00f9249b, 0x02492481, 0x03bec407, 0x033753c1, 0x01ee35e6, 0x034d7e6c, 0x0144e856, 0x0019668c}}}, + {X: Field{[10]uint32{0x01064e13, 0x00ec1843, 0x01e062a7, 0x038111bc, 0x0215311d, 0x023f5059, 0x015ff98e, 0x001a41c8, 0x02ff0c97, 0x002a38a0}}, Y: Field{[10]uint32{0x01f4cc0c, 0x01f1cc44, 0x02bd6cef, 0x00f94375, 0x008b679a, 0x02c94562, 0x03b7f3c5, 0x007026af, 0x015b8db8, 0x001fe5cd}}}, + }, + { + {X: Field{[10]uint32{0x01064e13, 0x00ec1843, 0x01e062a7, 0x038111bc, 0x0215311d, 0x023f5059, 0x015ff98e, 0x001a41c8, 0x02ff0c97, 0x002a38a0}}, Y: Field{[10]uint32{0x01f4cc0c, 0x01f1cc44, 0x02bd6cef, 0x00f94375, 0x008b679a, 0x02c94562, 0x03b7f3c5, 0x007026af, 0x015b8db8, 0x001fe5cd}}}, + {X: Field{[10]uint32{0x037653a1, 0x03ae7a9f, 0x027c1c15, 0x02a9d4f5, 0x03efbe9e, 0x03a99b98, 0x0076f805, 0x02bb2f2e, 0x02e7e27f, 0x0032b1bc}}, Y: Field{[10]uint32{0x02c5e556, 0x0042b43f, 0x003a068c, 0x0395a204, 0x0081e83a, 0x010a8d14, 0x01b65d9a, 0x01bc6533, 0x02e5e2aa, 0x003df505}}}, + {X: Field{[10]uint32{0x023979b5, 0x00666c2e, 0x0029e22a, 0x023799fa, 0x00ba288f, 0x03b90394, 0x0337f0b1, 0x03898c9f, 0x03c5cdad, 0x002b8881}}, Y: Field{[10]uint32{0x0050fa6f, 0x00f359a1, 0x0388968f, 0x01f4df53, 0x00fca87b, 0x00eb5c18, 0x00c92452, 0x027dc6b5, 0x02510c07, 0x003aa47f}}}, + {X: Field{[10]uint32{0x0224003d, 0x03d2ac21, 0x00b11cc9, 0x00a508e3, 0x014ab767, 0x016390c9, 0x03c5932e, 0x03481bbe, 0x0246ee37, 0x0039b7f7}}, Y: Field{[10]uint32{0x0216b93b, 0x02194388, 0x017dd754, 0x03a949ff, 0x003b1ce5, 0x0223e488, 0x02f48f7b, 0x00e5263c, 0x03b7be91, 0x0021c9ec}}}, + {X: Field{[10]uint32{0x02fca824, 0x00064403, 0x024fae41, 0x013fa885, 0x01e0be0c, 0x01961518, 0x02c54100, 0x02b39673, 0x010cad72, 0x0032e37b}}, Y: Field{[10]uint32{0x03227361, 0x002f4163, 0x01742f14, 0x037f1e4c, 0x0096ad1f, 0x028b32f1, 0x0316c487, 0x0223216c, 0x008f740d, 0x000ce940}}}, + {X: Field{[10]uint32{0x00e4dd6a, 0x0384787b, 0x01cef559, 0x02728c88, 0x020a00e4, 0x02359311, 0x01eca37e, 0x00ad92f2, 0x00f7b279, 0x001276f9}}, Y: Field{[10]uint32{0x029e3eae, 0x02dca90a, 0x03b69b13, 0x00bf2816, 0x021c3855, 0x01a48956, 0x01fe33db, 0x02071cb1, 0x02984704, 0x002e2d5c}}}, + {X: Field{[10]uint32{0x03cbd327, 0x006d368e, 0x02aee941, 0x01488792, 0x02b04e08, 0x01f9dbb5, 0x0294900d, 0x020d9c23, 0x03298af1, 0x002c314e}}, Y: Field{[10]uint32{0x017be436, 0x01af128b, 0x02a0f161, 0x0031d18d, 0x03d82a22, 0x02d9acab, 0x00f6a601, 0x01fa858e, 0x03401fbd, 0x003b8aa5}}}, + {X: Field{[10]uint32{0x00dce109, 0x00440d52, 0x011d3b0e, 0x005273c8, 0x02e250e3, 0x02b25820, 0x0240cfc7, 0x0208f59a, 0x009cd9a6, 0x000f1382}}, Y: Field{[10]uint32{0x0219aeea, 0x03d9648e, 0x02697e2b, 0x010b65ff, 0x039579e1, 0x015d934d, 0x0357bca1, 0x0246d201, 0x02669fe1, 0x0010feef}}}, + {X: Field{[10]uint32{0x03b836a1, 0x03bed8e5, 0x01ef7de6, 0x017fdd9e, 0x02c80640, 0x039dfd49, 0x018862ec, 0x02e48353, 0x033f329d, 0x001bdae9}}, Y: Field{[10]uint32{0x02832b84, 0x037cbec1, 0x03f934db, 0x014a2387, 0x00d8990c, 0x016fba70, 0x030b8a40, 0x030638f6, 0x0217ff5f, 0x00371de2}}}, + {X: Field{[10]uint32{0x025d5241, 0x015adfe0, 0x012f6680, 0x032a482f, 0x02563ed7, 0x002cfaa2, 0x00277d34, 0x019d394d, 0x01ada779, 0x003e3307}}, Y: Field{[10]uint32{0x0070e10a, 0x02bc0e3c, 0x00bd4960, 0x01b187ac, 0x0052c2d7, 0x01459bc1, 0x03e892fa, 0x01c3facc, 0x024410b1, 0x0004f793}}}, + {X: Field{[10]uint32{0x02b39ede, 0x038d0827, 0x012d42ae, 0x00cb5c18, 0x00310880, 0x004090d8, 0x00ff467e, 0x00abd2ef, 0x027dc742, 0x001f51c6}}, Y: Field{[10]uint32{0x03f6607e, 0x02f3652a, 0x028fd0c9, 0x01f4708a, 0x027795cf, 0x03ff21be, 0x0382231e, 0x0215941e, 0x0319f3a6, 0x0000129e}}}, + {X: Field{[10]uint32{0x00e5f03a, 0x022d6f7d, 0x006d54fe, 0x03ac7858, 0x0196565f, 0x035f7f8d, 0x03dcfb33, 0x02f8cdcd, 0x03dd0289, 0x002030d3}}, Y: Field{[10]uint32{0x023ca504, 0x03d151bf, 0x005cb117, 0x03bc7cc9, 0x03d30b2a, 0x01f72680, 0x02db5700, 0x007b3557, 0x0056a78c, 0x00091f82}}}, + {X: Field{[10]uint32{0x025eb1c1, 0x03527895, 0x01c5aa56, 0x019f36b9, 0x027fcd75, 0x0260bc25, 0x030fcc31, 0x00feb1c1, 0x0163f9b7, 0x003c0094}}, Y: Field{[10]uint32{0x01de2ae0, 0x01f5c11b, 0x011e57da, 0x01735b34, 0x018576ff, 0x0289abfb, 0x026b4a5d, 0x00837d31, 0x01e8883d, 0x000153aa}}}, + {X: Field{[10]uint32{0x0214f422, 0x00281872, 0x00deca61, 0x03b67931, 0x00b383e4, 0x0136f1ef, 0x03e80221, 0x037cf52b, 0x02e897a9, 0x001b3b46}}, Y: Field{[10]uint32{0x004fc091, 0x00f690f6, 0x00932ae7, 0x0321e6a7, 0x008ca102, 0x02f9ae6e, 0x0095a728, 0x0239eaed, 0x02eb1b0f, 0x00096222}}}, + {X: Field{[10]uint32{0x02c32c64, 0x00d424f6, 0x00bf84cf, 0x000fb2b9, 0x020e36fe, 0x03d1dc57, 0x0304e950, 0x008ea83d, 0x000001ed, 0x002b0485}}, Y: Field{[10]uint32{0x02b1a867, 0x00ab6eb7, 0x03089881, 0x00e9694f, 0x03ed5a5d, 0x00c12668, 0x030b6957, 0x022ebc61, 0x00cbac33, 0x0033a3af}}}, + {X: Field{[10]uint32{0x0319497c, 0x00e0b7a0, 0x008c022f, 0x03e94494, 0x015d59b1, 0x0244f2ac, 0x039e56e6, 0x02161cb4, 0x03b9c9a2, 0x0005d294}}, Y: Field{[10]uint32{0x039afa73, 0x0284eb01, 0x0054383d, 0x007632e6, 0x02646b3a, 0x0311fe79, 0x034155f2, 0x0270595e, 0x0037abfc, 0x00333277}}}, + }, + { + {X: Field{[10]uint32{0x0319497c, 0x00e0b7a0, 0x008c022f, 0x03e94494, 0x015d59b1, 0x0244f2ac, 0x039e56e6, 0x02161cb4, 0x03b9c9a2, 0x0005d294}}, Y: Field{[10]uint32{0x039afa73, 0x0284eb01, 0x0054383d, 0x007632e6, 0x02646b3a, 0x0311fe79, 0x034155f2, 0x0270595e, 0x0037abfc, 0x00333277}}}, + {X: Field{[10]uint32{0x000dd273, 0x0368dbe1, 0x001115f5, 0x00383914, 0x03d53d28, 0x006e4ba8, 0x007071ef, 0x01aed8c3, 0x02e79694, 0x000839b8}}, Y: Field{[10]uint32{0x0346b593, 0x033f456e, 0x0293cc07, 0x01e4f6a1, 0x01811ec9, 0x01e1d195, 0x00ba1ad9, 0x01679128, 0x02fe4f15, 0x0034eb5e}}}, + {X: Field{[10]uint32{0x014b8367, 0x0201cf5d, 0x006bfe94, 0x01f59f54, 0x01b775b7, 0x0210da97, 0x00aa5d45, 0x0149b903, 0x014ae446, 0x00179682}}, Y: Field{[10]uint32{0x01ce85ca, 0x00a6a764, 0x03fa4453, 0x03bcf797, 0x02796aa9, 0x01ca92de, 0x00901f15, 0x0178170b, 0x00c9a479, 0x002ba2be}}}, + {X: Field{[10]uint32{0x02077674, 0x0153cc06, 0x00ca3e7b, 0x004db309, 0x0035ae68, 0x039c76dc, 0x00280a07, 0x01476ea0, 0x0024d7a3, 0x0023832a}}, Y: Field{[10]uint32{0x02b7ed98, 0x0132fb04, 0x010290b8, 0x00674be4, 0x03cff604, 0x0298b3d5, 0x0169d24d, 0x00b50771, 0x02075919, 0x00013b15}}}, + {X: Field{[10]uint32{0x03b10d9d, 0x0215e4e5, 0x00fcaf19, 0x0062747e, 0x01e6a52f, 0x00432e0b, 0x02ccb833, 0x00ba1677, 0x00adb970, 0x00003538}}, Y: Field{[10]uint32{0x0140dced, 0x0040121c, 0x01923e82, 0x0325e38b, 0x030b5898, 0x00c8a1fd, 0x012f8464, 0x0190251f, 0x01981837, 0x0021ee00}}}, + {X: Field{[10]uint32{0x00bcad59, 0x017a0d83, 0x02aa07b0, 0x00169382, 0x017c845a, 0x017e40bc, 0x0217c85a, 0x00d801ea, 0x001152ac, 0x000bb5db}}, Y: Field{[10]uint32{0x00ea66fe, 0x031ea271, 0x0394114a, 0x0004c29f, 0x015f72c6, 0x0205d9fb, 0x01a6eaec, 0x017c88b3, 0x014043b8, 0x0018e7d3}}}, + {X: Field{[10]uint32{0x009caee8, 0x00469827, 0x030bb208, 0x0116c689, 0x03632e20, 0x03b12999, 0x037a19ae, 0x01d303db, 0x021368ef, 0x0000d994}}, Y: Field{[10]uint32{0x0372b711, 0x03b1a8ed, 0x03a7f0a9, 0x0224ca56, 0x0101cba9, 0x02e9a511, 0x009fc681, 0x037b6665, 0x032b2a93, 0x0007c630}}}, + {X: Field{[10]uint32{0x00192441, 0x02bf17aa, 0x034afe96, 0x00868c86, 0x01afdb58, 0x038f59b0, 0x03a63553, 0x020b4717, 0x00da51c9, 0x003deed4}}, Y: Field{[10]uint32{0x005165ae, 0x0103a875, 0x0074bbc6, 0x007eef13, 0x01b1cfdc, 0x03799217, 0x01bc63bd, 0x029498c4, 0x03e30334, 0x0024f30e}}}, + {X: Field{[10]uint32{0x0046c85c, 0x03e5d465, 0x0006353f, 0x00239807, 0x02de37de, 0x00fdb1ba, 0x00676c45, 0x023c7ea8, 0x01056fdb, 0x00039624}}, Y: Field{[10]uint32{0x0148972e, 0x031df9c8, 0x01add5f6, 0x013a0337, 0x00f49023, 0x03d20626, 0x007418ba, 0x01ef683b, 0x005f11fa, 0x0038e692}}}, + {X: Field{[10]uint32{0x015ae087, 0x01240401, 0x00a57e03, 0x01be8d25, 0x00c671b9, 0x010e8544, 0x03945fb7, 0x029660b4, 0x03155b6e, 0x0028d199}}, Y: Field{[10]uint32{0x02887627, 0x03cd98c8, 0x030bccb3, 0x01bc8e53, 0x01c53eab, 0x028a8c14, 0x02fe9a1a, 0x0316f637, 0x03a5e56b, 0x00087297}}}, + {X: Field{[10]uint32{0x022e1259, 0x022b7cf0, 0x0362aff1, 0x02901a04, 0x01931739, 0x0001dddc, 0x02cf5faa, 0x0118fcad, 0x026d26f1, 0x0029d004}}, Y: Field{[10]uint32{0x034a5f43, 0x01c5c90c, 0x02dad5f7, 0x01d4ec75, 0x0117865e, 0x019f1fb9, 0x005f174a, 0x03c7fc6c, 0x03baf194, 0x00016a7f}}}, + {X: Field{[10]uint32{0x00b84b48, 0x03d15c79, 0x017ea830, 0x031e67a0, 0x0091adf4, 0x03505fdc, 0x0110f577, 0x0293d506, 0x030e7d45, 0x0017ec77}}, Y: Field{[10]uint32{0x03be8eb8, 0x037a9a8d, 0x021ad77e, 0x02421cfc, 0x020629c3, 0x039b4960, 0x00f4646f, 0x013527ef, 0x03bcbc3c, 0x000854be}}}, + {X: Field{[10]uint32{0x0308f1fe, 0x0285e8f2, 0x007bfd88, 0x039c2e82, 0x03d7ce7e, 0x0360b45d, 0x01405765, 0x01d39299, 0x00216d94, 0x0021f92e}}, Y: Field{[10]uint32{0x02d5e2ec, 0x01d2b26b, 0x02d9d75f, 0x036f59e1, 0x006e2f23, 0x00be30b3, 0x03d7f8ea, 0x01233b35, 0x02c07663, 0x003dd38e}}}, + {X: Field{[10]uint32{0x01b8f255, 0x01b661fe, 0x00d21114, 0x039d24a8, 0x01e77d43, 0x02aa0bfa, 0x022e4608, 0x02e29058, 0x017478e1, 0x00256ef6}}, Y: Field{[10]uint32{0x00361439, 0x038ffa0a, 0x03fc1010, 0x02bbf1dd, 0x00f2ba72, 0x003cb436, 0x032c208f, 0x031dff7b, 0x02d129e3, 0x002fb50e}}}, + {X: Field{[10]uint32{0x01c4d15c, 0x01c039a8, 0x0274b9a8, 0x02fc1f03, 0x00105ea7, 0x00495291, 0x02c22c0c, 0x01e696a4, 0x03463fea, 0x000d7a86}}, Y: Field{[10]uint32{0x033fe1ea, 0x00e6ebdf, 0x0095edc9, 0x0280c194, 0x005d633a, 0x01d34ec6, 0x008fa5fd, 0x034b35e2, 0x01651b9e, 0x002b4864}}}, + {X: Field{[10]uint32{0x0075b7ba, 0x03f7fc25, 0x00b3d884, 0x00c39246, 0x03e039e7, 0x01406336, 0x03e57edf, 0x01e170f4, 0x02981943, 0x002564e5}}, Y: Field{[10]uint32{0x0124f2fd, 0x022afe1d, 0x01385e9b, 0x019321c2, 0x009c653f, 0x02e735a1, 0x020386a4, 0x00c7762e, 0x012888c3, 0x000b9f95}}}, + }, + { + {X: Field{[10]uint32{0x0075b7ba, 0x03f7fc25, 0x00b3d884, 0x00c39246, 0x03e039e7, 0x01406336, 0x03e57edf, 0x01e170f4, 0x02981943, 0x002564e5}}, Y: Field{[10]uint32{0x0124f2fd, 0x022afe1d, 0x01385e9b, 0x019321c2, 0x009c653f, 0x02e735a1, 0x020386a4, 0x00c7762e, 0x012888c3, 0x000b9f95}}}, + {X: Field{[10]uint32{0x03c8f53b, 0x01d6a502, 0x007c7072, 0x01ace45d, 0x02d70222, 0x035cf657, 0x0232ca7d, 0x029f7abf, 0x0005ff0d, 0x0032fb85}}, Y: Field{[10]uint32{0x00c87f45, 0x00b9ac9e, 0x03728292, 0x03da049b, 0x030d9ff4, 0x02e0a533, 0x01f3e689, 0x03e40ad4, 0x034f4e75, 0x003d8847}}}, + {X: Field{[10]uint32{0x03d69985, 0x03177643, 0x032aea09, 0x032db77d, 0x009f309c, 0x02f333c5, 0x00f690df, 0x00bdf9e2, 0x0275ceb7, 0x0002ba5d}}, Y: Field{[10]uint32{0x0009a003, 0x023ad045, 0x01aff89c, 0x0105ebb8, 0x01d0b99d, 0x01469531, 0x038dfee0, 0x023453a6, 0x0173f6e4, 0x00244866}}}, + {X: Field{[10]uint32{0x00b311dd, 0x01f222c5, 0x01b9cf37, 0x02bbef5c, 0x003de3be, 0x02e894b8, 0x0180bfa0, 0x03d6b375, 0x02d28faa, 0x002b756e}}, Y: Field{[10]uint32{0x01d6c38d, 0x0260bcd2, 0x01b8902f, 0x039d9a6e, 0x0352d4e1, 0x00d66053, 0x00e434f8, 0x030e965d, 0x00f4da3d, 0x003a710f}}}, + {X: Field{[10]uint32{0x01262b90, 0x0064f7f6, 0x0029a9dc, 0x0307f8f3, 0x03b723c4, 0x02009747, 0x0365f177, 0x0184bb26, 0x022a5ac1, 0x000ac561}}, Y: Field{[10]uint32{0x003d7557, 0x0265b992, 0x009a4991, 0x01c3e652, 0x026f5349, 0x02a1d241, 0x0230d52d, 0x00cfea9e, 0x013daa0a, 0x000bac01}}}, + {X: Field{[10]uint32{0x0078afb0, 0x016b9e58, 0x021974e7, 0x031b1049, 0x0314ff12, 0x019b45c1, 0x00d4468c, 0x018ed492, 0x03cd7661, 0x0008275a}}, Y: Field{[10]uint32{0x0340b310, 0x006ddd69, 0x023e385d, 0x024ce7d3, 0x0301edb7, 0x02626296, 0x0165baba, 0x00ca0282, 0x03429e7b, 0x00068bc4}}}, + {X: Field{[10]uint32{0x00e7be40, 0x025c532a, 0x00ee593f, 0x02524410, 0x02f2d2c8, 0x01b91da6, 0x0295c161, 0x03b99dfb, 0x02ed1a96, 0x001abe7a}}, Y: Field{[10]uint32{0x02387e1c, 0x005b809b, 0x01569fa4, 0x019a83d6, 0x0145e3f6, 0x00d1f720, 0x009ea428, 0x0199259c, 0x02116900, 0x002ce04a}}}, + {X: Field{[10]uint32{0x017c0979, 0x01900283, 0x00c96f5f, 0x0052f16a, 0x024a29b3, 0x03d073b4, 0x029df3df, 0x005c50fe, 0x032ba817, 0x0014fc90}}, Y: Field{[10]uint32{0x037b36a2, 0x01fa4314, 0x03845f9f, 0x03d727a2, 0x024bd5a4, 0x0046c1f7, 0x014e3e09, 0x01e6df33, 0x03fbc1f0, 0x002f54bb}}}, + {X: Field{[10]uint32{0x0082801e, 0x02dbe83d, 0x00155d26, 0x022f16f5, 0x0140794f, 0x032e35be, 0x03aab424, 0x00513bac, 0x00ee0444, 0x0016599a}}, Y: Field{[10]uint32{0x00870c37, 0x01c523c1, 0x0135ad47, 0x032d8f4d, 0x028db6c1, 0x01dc4c13, 0x008f9608, 0x03bd7c7b, 0x00a85bba, 0x002526a8}}}, + {X: Field{[10]uint32{0x00977063, 0x00102962, 0x00c4fef4, 0x022fec4c, 0x0365bf6f, 0x019f83f6, 0x0150f838, 0x0269bd87, 0x029e047f, 0x0029d8b9}}, Y: Field{[10]uint32{0x014f6ef1, 0x00da7e0a, 0x00e62a06, 0x028e5b7f, 0x01958b48, 0x00cdcaa2, 0x021732d9, 0x00455e06, 0x0157cbed, 0x001ae637}}}, + {X: Field{[10]uint32{0x032c19fd, 0x026cb9f0, 0x028c3e4c, 0x03a41600, 0x034acab8, 0x02d5c2d6, 0x01f4d17a, 0x0141d8bf, 0x01881b50, 0x002fa134}}, Y: Field{[10]uint32{0x02f1281f, 0x025294dc, 0x01c37676, 0x03d57943, 0x007955a7, 0x00c20e65, 0x01e65f48, 0x01425134, 0x00cb32dc, 0x003bfe58}}}, + {X: Field{[10]uint32{0x0355a9bf, 0x02c0a637, 0x01bf8ebc, 0x03bca7a9, 0x00f6b015, 0x0075f15e, 0x00307f60, 0x00c60604, 0x00eb9c6e, 0x001c98a6}}, Y: Field{[10]uint32{0x003accae, 0x01be2c2f, 0x033b4e11, 0x032f0019, 0x00be797b, 0x00f42678, 0x0035a2ef, 0x026ff6a6, 0x0001a9de, 0x000e3522}}}, + {X: Field{[10]uint32{0x02c69482, 0x02dd7f55, 0x02167bd1, 0x01004cbe, 0x00cbeab5, 0x02bcaf22, 0x0357274c, 0x01fb9507, 0x00314c0d, 0x002619e8}}, Y: Field{[10]uint32{0x03792cd7, 0x0018451b, 0x028a916f, 0x033d4558, 0x039e6245, 0x006ea658, 0x0392d55b, 0x020d3e71, 0x015a3b10, 0x00340b98}}}, + {X: Field{[10]uint32{0x01a7e7d2, 0x01fcb610, 0x03d85995, 0x0230fbea, 0x03a4c90e, 0x0251b791, 0x03af7555, 0x039229a4, 0x030f1339, 0x002e4d04}}, Y: Field{[10]uint32{0x00653d39, 0x02646a26, 0x00c41a4a, 0x036f9c37, 0x03ffd381, 0x02fde347, 0x00929a5f, 0x0015daa8, 0x036b9b2d, 0x002548cf}}}, + {X: Field{[10]uint32{0x01557aa1, 0x008e7647, 0x03c2978a, 0x03fb3407, 0x03df1d92, 0x002675aa, 0x027f2ea0, 0x02056964, 0x024540d8, 0x002a19bc}}, Y: Field{[10]uint32{0x01430634, 0x006eed30, 0x01a4b798, 0x0319f184, 0x0161eb69, 0x036c384e, 0x013d8fa5, 0x00ad135e, 0x01f6a802, 0x002d61ce}}}, + {X: Field{[10]uint32{0x0182b151, 0x004d0327, 0x03a2dbb5, 0x00f5587e, 0x03cca0a4, 0x02c426a3, 0x005a1153, 0x00795b59, 0x0250ae40, 0x0034a98e}}, Y: Field{[10]uint32{0x00f89405, 0x01085d37, 0x00a52d41, 0x002bd213, 0x00a70f75, 0x00a52088, 0x01aee58b, 0x03f2dd59, 0x02fb6443, 0x003a0b61}}}, + }, + { + {X: Field{[10]uint32{0x0182b151, 0x004d0327, 0x03a2dbb5, 0x00f5587e, 0x03cca0a4, 0x02c426a3, 0x005a1153, 0x00795b59, 0x0250ae40, 0x0034a98e}}, Y: Field{[10]uint32{0x00f89405, 0x01085d37, 0x00a52d41, 0x002bd213, 0x00a70f75, 0x00a52088, 0x01aee58b, 0x03f2dd59, 0x02fb6443, 0x003a0b61}}}, + {X: Field{[10]uint32{0x0272da5f, 0x0312eb32, 0x013497c6, 0x01acdb10, 0x0122b9cd, 0x00cdc97e, 0x03c72020, 0x0149788e, 0x03a76100, 0x002ebc60}}, Y: Field{[10]uint32{0x00f2a0cf, 0x03398a2a, 0x01361377, 0x031729ce, 0x018e2336, 0x035a6c74, 0x008bd58d, 0x0134cd5a, 0x03be9ccb, 0x0037ab27}}}, + {X: Field{[10]uint32{0x024b3ba0, 0x027d8d7b, 0x031f1785, 0x03d7c62f, 0x035c2abe, 0x006fc917, 0x03e170f3, 0x03edcefb, 0x0105221f, 0x00104204}}, Y: Field{[10]uint32{0x03525595, 0x02587705, 0x02455486, 0x02159681, 0x00133649, 0x035ae126, 0x00a65ae1, 0x0159a3cb, 0x036976ff, 0x00370dfc}}}, + {X: Field{[10]uint32{0x016c3943, 0x02b29631, 0x02a5ffa5, 0x00b55add, 0x015adbd0, 0x03923dbf, 0x01332906, 0x01008e3e, 0x00a7e384, 0x003debbe}}, Y: Field{[10]uint32{0x00f442f1, 0x03d89feb, 0x01003431, 0x0212a373, 0x03eec301, 0x00eacff3, 0x0042bbdc, 0x0369e5f1, 0x0344d5ff, 0x00138ec2}}}, + {X: Field{[10]uint32{0x03d98ded, 0x02726e24, 0x00218462, 0x020cee28, 0x02dbdf22, 0x014c7597, 0x00f22990, 0x03032323, 0x0210a16c, 0x0018e8a8}}, Y: Field{[10]uint32{0x00d1cfc2, 0x0065f538, 0x0073a519, 0x0280271e, 0x021fabf6, 0x013b6511, 0x02503325, 0x031dbf41, 0x02e2e7fe, 0x00220ad0}}}, + {X: Field{[10]uint32{0x000e5485, 0x02799a80, 0x01df0208, 0x022fd769, 0x02451306, 0x01cc83c4, 0x02c70862, 0x02f7fe38, 0x02d793a2, 0x0007349d}}, Y: Field{[10]uint32{0x005fbd7f, 0x033c1462, 0x024ecca5, 0x01c2c826, 0x0399d0e2, 0x014ba5df, 0x00b34d45, 0x02bdce35, 0x01d18b2e, 0x0019856f}}}, + {X: Field{[10]uint32{0x00045445, 0x0186942e, 0x00d7eea8, 0x01c6407a, 0x0080ff73, 0x0355efbc, 0x0312e2e5, 0x019f28f7, 0x015d449d, 0x00030560}}, Y: Field{[10]uint32{0x0054a206, 0x03e1f550, 0x00ea3214, 0x0390d963, 0x00ba3054, 0x0198f34a, 0x0293c3b6, 0x01045742, 0x020a3ae9, 0x000bcc35}}}, + {X: Field{[10]uint32{0x01924459, 0x032515c4, 0x0278c1fa, 0x00968f1e, 0x037af2fa, 0x03776ec7, 0x022e29f0, 0x0240db16, 0x03cb1001, 0x0037ed51}}, Y: Field{[10]uint32{0x0065fd9e, 0x00178373, 0x031dcfa2, 0x00c39700, 0x0022af09, 0x03721933, 0x00389ce9, 0x011c222e, 0x02a9ba0f, 0x0026b334}}}, + {X: Field{[10]uint32{0x03857faf, 0x0048e730, 0x019701e9, 0x03787a58, 0x03882fca, 0x020a3bdf, 0x017ba8f4, 0x022a7035, 0x036b89ae, 0x0031d5fa}}, Y: Field{[10]uint32{0x00584ca4, 0x0276c328, 0x014c101d, 0x00344062, 0x03627d31, 0x022fb186, 0x03369f20, 0x03fcd895, 0x01cfcd23, 0x003c0e96}}}, + {X: Field{[10]uint32{0x02f8b517, 0x02ecd463, 0x01bac9a8, 0x00691c5c, 0x0177c277, 0x02845789, 0x01bc8064, 0x036c9257, 0x02f7ccc4, 0x001c4808}}, Y: Field{[10]uint32{0x009da1ac, 0x01f7ca09, 0x01d7748b, 0x037cef5e, 0x01a3603e, 0x00251d50, 0x03101f9b, 0x03a4a2b9, 0x0338de4d, 0x002f55e0}}}, + {X: Field{[10]uint32{0x0059225d, 0x034613d5, 0x018d10e4, 0x01f8b621, 0x0244faf7, 0x006700a8, 0x015d4099, 0x028343e0, 0x03aeadaf, 0x003ea018}}, Y: Field{[10]uint32{0x02ce1507, 0x02df8edf, 0x0059c3a2, 0x00db401f, 0x000a2b6c, 0x00931097, 0x00de2208, 0x0301a458, 0x039057c0, 0x0002e9c7}}}, + {X: Field{[10]uint32{0x010bc03e, 0x014f566a, 0x015e33c7, 0x024d4780, 0x0084b0f3, 0x011143e0, 0x01a925f7, 0x001cba79, 0x00ed2c82, 0x000b3bb6}}, Y: Field{[10]uint32{0x02b82adc, 0x01cae2de, 0x03cd01cb, 0x033c8354, 0x034a1df9, 0x03f1f6ba, 0x0050eb7a, 0x0378fb36, 0x0380e9b9, 0x002909da}}}, + {X: Field{[10]uint32{0x02f0d044, 0x027fa505, 0x021a7967, 0x03524279, 0x01aaba9f, 0x018bb829, 0x02f69cf8, 0x015ea278, 0x03c59d02, 0x00196328}}, Y: Field{[10]uint32{0x03cb872d, 0x007ccbbd, 0x00e89add, 0x018f1063, 0x0255a167, 0x004ef4dd, 0x0165d627, 0x0095183c, 0x01377aea, 0x002b9730}}}, + {X: Field{[10]uint32{0x02aa2494, 0x03538c50, 0x00c9a50c, 0x03f9f744, 0x027bdcdd, 0x013aef20, 0x01136e7c, 0x03a3b374, 0x009a4539, 0x000de71d}}, Y: Field{[10]uint32{0x02c86c63, 0x03ea7a33, 0x016435be, 0x029edfa1, 0x011364f6, 0x019e0fc4, 0x01c0ef1d, 0x0300c4f2, 0x03848bf9, 0x00289518}}}, + {X: Field{[10]uint32{0x0296756d, 0x02b255cd, 0x01417ab5, 0x01815958, 0x00676af1, 0x034fcc17, 0x00c19835, 0x03caeb39, 0x034aaf91, 0x000c7252}}, Y: Field{[10]uint32{0x0208ae78, 0x0117a377, 0x01070abc, 0x032b9ab4, 0x0283aedf, 0x02bd0581, 0x00b8b59a, 0x020ea6fd, 0x004b556e, 0x003e03e2}}}, + {X: Field{[10]uint32{0x0217e073, 0x01be6d15, 0x0317b343, 0x02f4e0e4, 0x026bacbd, 0x01f3f721, 0x02e7896d, 0x007ae243, 0x02233547, 0x0019161f}}, Y: Field{[10]uint32{0x03af6589, 0x026797a7, 0x02ab3582, 0x00e44ceb, 0x0185b90a, 0x01f0a668, 0x016dd644, 0x000b8aba, 0x01d5bf69, 0x003667f3}}}, + }, + { + {X: Field{[10]uint32{0x0217e073, 0x01be6d15, 0x0317b343, 0x02f4e0e4, 0x026bacbd, 0x01f3f721, 0x02e7896d, 0x007ae243, 0x02233547, 0x0019161f}}, Y: Field{[10]uint32{0x03af6589, 0x026797a7, 0x02ab3582, 0x00e44ceb, 0x0185b90a, 0x01f0a668, 0x016dd644, 0x000b8aba, 0x01d5bf69, 0x003667f3}}}, + {X: Field{[10]uint32{0x0384480d, 0x03362310, 0x032ef44b, 0x0288aa47, 0x0294e0b6, 0x024bc304, 0x0328b54c, 0x02503cb3, 0x02b142df, 0x002e19b5}}, Y: Field{[10]uint32{0x004cafa8, 0x0166d1c3, 0x006d60e6, 0x02012c76, 0x0024e522, 0x02a6b5eb, 0x02278d7e, 0x03adc226, 0x00b3426a, 0x0006452c}}}, + {X: Field{[10]uint32{0x02103dd6, 0x01c51c83, 0x00859adf, 0x0301f001, 0x02c34604, 0x0164a85e, 0x02213cfc, 0x000fe0da, 0x03d55a42, 0x002f11de}}, Y: Field{[10]uint32{0x02f7c343, 0x0020b635, 0x004ac639, 0x01cb18ed, 0x015d2935, 0x01b7a98e, 0x03ac552c, 0x037549b2, 0x022429a8, 0x0038c787}}}, + {X: Field{[10]uint32{0x01b20d6c, 0x02736a07, 0x02455d22, 0x0393b53f, 0x03e2d52a, 0x0040aea1, 0x019d1646, 0x02067b13, 0x009085de, 0x003b0aee}}, Y: Field{[10]uint32{0x029cf4a0, 0x02671358, 0x03a98a0e, 0x012fa1fb, 0x0233a236, 0x01425031, 0x02f66f06, 0x004e84cc, 0x017661e0, 0x00333b30}}}, + {X: Field{[10]uint32{0x004eab31, 0x0370ec35, 0x034907d0, 0x00501398, 0x000ac5af, 0x019efe3a, 0x003b4232, 0x02e0e00c, 0x00fe5a6b, 0x0016276d}}, Y: Field{[10]uint32{0x01361f6a, 0x02baf9d4, 0x038db941, 0x01548523, 0x031f610e, 0x012f643c, 0x00706202, 0x028a93d8, 0x005c108a, 0x00189551}}}, + {X: Field{[10]uint32{0x02695f94, 0x0202c60d, 0x03fa592d, 0x031a4589, 0x0362a169, 0x02be6a73, 0x00cb8683, 0x023d7f43, 0x0151b455, 0x002c7497}}, Y: Field{[10]uint32{0x02e32736, 0x01fae697, 0x03edca5b, 0x0236ae18, 0x0360f6f1, 0x026aea05, 0x03ea0ac1, 0x0242c7de, 0x0272030e, 0x001c1b76}}}, + {X: Field{[10]uint32{0x020c2c41, 0x02585ca6, 0x036c67bf, 0x0071580c, 0x0042831c, 0x035bb6df, 0x00a1860a, 0x00be8baa, 0x0337d16e, 0x0004ce6c}}, Y: Field{[10]uint32{0x01f1bc2b, 0x03c152ea, 0x023a4185, 0x03e1f7a4, 0x006b1227, 0x0044e8d0, 0x023240fd, 0x02b96e9e, 0x016362c7, 0x0027e6ca}}}, + {X: Field{[10]uint32{0x03b09d0f, 0x0183b2c8, 0x03ecf38a, 0x01903d42, 0x01e50050, 0x03951641, 0x01d75ef5, 0x025b3b4e, 0x03e389e2, 0x001c7129}}, Y: Field{[10]uint32{0x020ddb62, 0x02c7c05c, 0x03fc7637, 0x0021298b, 0x02786f2b, 0x00be042a, 0x033e0a29, 0x03cee82b, 0x02db737a, 0x0004c4fe}}}, + {X: Field{[10]uint32{0x00fc47af, 0x012c7e16, 0x00dec370, 0x0320cb03, 0x00a8ddfe, 0x00006d5a, 0x010329b5, 0x033c5f31, 0x03a11363, 0x001ffcee}}, Y: Field{[10]uint32{0x01ba43a7, 0x0185933e, 0x02c297f8, 0x006b462e, 0x0317a53b, 0x011cd11a, 0x03c891b7, 0x0298a682, 0x03ae8018, 0x0007dae9}}}, + {X: Field{[10]uint32{0x0241e20e, 0x03132ea7, 0x03864d1d, 0x00f5e34c, 0x0138a87a, 0x00e934fa, 0x030f7f00, 0x013722f2, 0x01c4a511, 0x003f0e57}}, Y: Field{[10]uint32{0x03cf42ee, 0x036330b9, 0x00e2b77a, 0x0169a179, 0x02022147, 0x02f76db5, 0x02b81a98, 0x01f42533, 0x009108d0, 0x000e19b8}}}, + {X: Field{[10]uint32{0x01213775, 0x01358025, 0x02a99018, 0x00ec8f50, 0x0100b429, 0x03fb1fd8, 0x001e9395, 0x0182ed85, 0x00463ceb, 0x0023b19c}}, Y: Field{[10]uint32{0x0041ffff, 0x0043cf9e, 0x011e90e0, 0x0282f33d, 0x0271da98, 0x033b7b83, 0x02643415, 0x016f8c1b, 0x026fa0da, 0x0023d629}}}, + {X: Field{[10]uint32{0x02f83231, 0x01c4062d, 0x025e3499, 0x0239d810, 0x00b7c30d, 0x016cff74, 0x01158276, 0x02e89aa3, 0x00c53502, 0x002143e3}}, Y: Field{[10]uint32{0x032e8373, 0x00c6a757, 0x0177f4a0, 0x0285dc8b, 0x010a85bf, 0x020b31e2, 0x03f7086b, 0x02414f42, 0x01be02a7, 0x002f12a7}}}, + {X: Field{[10]uint32{0x0052abbb, 0x00ffe34d, 0x01c2e3cb, 0x00bf8ae5, 0x01ae6aa7, 0x03657525, 0x01bac3fe, 0x0006ee27, 0x01b441e7, 0x0020f798}}, Y: Field{[10]uint32{0x014eb66e, 0x0145dac1, 0x002918a0, 0x00daef39, 0x03d79c5f, 0x03138558, 0x03fb6af8, 0x01827e9a, 0x0334a34c, 0x000cbc38}}}, + {X: Field{[10]uint32{0x032e6ffa, 0x00441937, 0x0176388b, 0x00dedc55, 0x0246be9f, 0x011d4351, 0x005bb6a9, 0x0067ec51, 0x02f98f94, 0x0014ffa2}}, Y: Field{[10]uint32{0x00e92eb5, 0x03acdc99, 0x030c22a1, 0x03980ef5, 0x005fb5f8, 0x01193797, 0x000cf6c4, 0x01518859, 0x017e7b51, 0x0024ca20}}}, + {X: Field{[10]uint32{0x019276f1, 0x022309bd, 0x03b15e96, 0x02ca4a85, 0x0033ae25, 0x03df361a, 0x00bb5c00, 0x03076c6a, 0x03898f50, 0x000f5d98}}, Y: Field{[10]uint32{0x019cbcb3, 0x012996e1, 0x0178601e, 0x008066c6, 0x02f32198, 0x02b60ccf, 0x0176e34d, 0x01f76d82, 0x01737a18, 0x0034dd9a}}}, + {X: Field{[10]uint32{0x0145e458, 0x035b21b7, 0x027fd358, 0x033a8943, 0x002f0aa6, 0x01527781, 0x02546d3e, 0x036216ce, 0x01e0e4e4, 0x0021206f}}, Y: Field{[10]uint32{0x0379057e, 0x012c6d65, 0x02e556d6, 0x0310ac98, 0x02900a79, 0x033b2cb2, 0x0225bf39, 0x00137612, 0x038cba54, 0x000e3b9e}}}, + }, + { + {X: Field{[10]uint32{0x0145e458, 0x035b21b7, 0x027fd358, 0x033a8943, 0x002f0aa6, 0x01527781, 0x02546d3e, 0x036216ce, 0x01e0e4e4, 0x0021206f}}, Y: Field{[10]uint32{0x0379057e, 0x012c6d65, 0x02e556d6, 0x0310ac98, 0x02900a79, 0x033b2cb2, 0x0225bf39, 0x00137612, 0x038cba54, 0x000e3b9e}}}, + {X: Field{[10]uint32{0x00e9f114, 0x010cd49b, 0x021dde54, 0x0014a655, 0x03392ed6, 0x007524af, 0x0143c6cd, 0x00ea2e7f, 0x0050bd38, 0x00258a69}}, Y: Field{[10]uint32{0x024aa391, 0x025cb128, 0x02f8dca3, 0x00f9715a, 0x01b92559, 0x0033bd93, 0x02befd22, 0x02db5d5d, 0x03280c5f, 0x002fd0e6}}}, + {X: Field{[10]uint32{0x012da17d, 0x0283e905, 0x0246b160, 0x036c2341, 0x0011dc13, 0x03f802f2, 0x014e6b05, 0x02317c22, 0x011e0f51, 0x000efabb}}, Y: Field{[10]uint32{0x00c768d2, 0x0012617b, 0x00416ce7, 0x01ee37fb, 0x0154cde7, 0x03a0386d, 0x034a8beb, 0x01eb37fb, 0x03f55aff, 0x0030ec35}}}, + {X: Field{[10]uint32{0x02ca6cc3, 0x00e36589, 0x0218383d, 0x011f861f, 0x031477d7, 0x033224f7, 0x01730da7, 0x011a23ac, 0x0047ef1e, 0x002dcec7}}, Y: Field{[10]uint32{0x014fdba3, 0x00d75da9, 0x03f5afac, 0x014825d5, 0x017322a2, 0x03320142, 0x017d64bb, 0x008aa429, 0x01cb2949, 0x001610c5}}}, + {X: Field{[10]uint32{0x024edcc5, 0x03e85f6e, 0x011b7234, 0x0085080c, 0x03e74e32, 0x0249d665, 0x012dfc03, 0x0275861d, 0x03a0cbdc, 0x001b9cf6}}, Y: Field{[10]uint32{0x019da0e4, 0x007df375, 0x039037b3, 0x0369c019, 0x03278a77, 0x0220a1a4, 0x02455088, 0x033122fa, 0x01fc49ee, 0x003b82b0}}}, + {X: Field{[10]uint32{0x0063e1be, 0x026b4134, 0x01a75c1b, 0x028bdf8e, 0x03a92429, 0x036f3c09, 0x02615253, 0x00ac51c8, 0x01d11d60, 0x0004c590}}, Y: Field{[10]uint32{0x01fec890, 0x007fcf88, 0x01b77fdd, 0x0303e5d1, 0x03bd0fae, 0x036f4afa, 0x002e30fc, 0x00e7c1a9, 0x02617960, 0x00130ef6}}}, + {X: Field{[10]uint32{0x0280b979, 0x03131092, 0x03b31409, 0x03e8ca6a, 0x000490f5, 0x0291f0c4, 0x027d97ea, 0x02d649d8, 0x018937e5, 0x001dc1b7}}, Y: Field{[10]uint32{0x0126cfde, 0x03d20410, 0x03e3214c, 0x00d3f5fb, 0x0117fa0a, 0x007aa71c, 0x038dd799, 0x02dc51dd, 0x01827d5b, 0x002280aa}}}, + {X: Field{[10]uint32{0x038f93e0, 0x038864b4, 0x0099f9c6, 0x00eed9da, 0x03d05b2a, 0x01e8bfbd, 0x03989200, 0x00600c47, 0x02b2db40, 0x003b7f85}}, Y: Field{[10]uint32{0x029405ad, 0x005e4f78, 0x0227e3d0, 0x000311b8, 0x025b3d51, 0x02c17434, 0x0174faa4, 0x036cda53, 0x02f1fca5, 0x003b9a40}}}, + {X: Field{[10]uint32{0x026fe285, 0x02e712dc, 0x03127dcd, 0x00a504fb, 0x02a45bac, 0x007e781a, 0x02f3c7a4, 0x0303e034, 0x02c5929b, 0x0005b508}}, Y: Field{[10]uint32{0x0155b441, 0x003ff9b0, 0x00d4233e, 0x0044dcd9, 0x01e93f0c, 0x018d4c6c, 0x02b7e69a, 0x009906a2, 0x00fa51e2, 0x00037e22}}}, + {X: Field{[10]uint32{0x01e306a5, 0x004cae1a, 0x007f15d3, 0x00931309, 0x02b8b5f6, 0x017cb971, 0x027129b3, 0x0030cd24, 0x0363f9f3, 0x0025cb2c}}, Y: Field{[10]uint32{0x02e86295, 0x007f502d, 0x00f35d06, 0x03b732b5, 0x01b85702, 0x02f1941e, 0x01e77fe5, 0x024aa97e, 0x0304e2df, 0x002b98d1}}}, + {X: Field{[10]uint32{0x02cfa513, 0x0042f2ae, 0x023aeae3, 0x027e6983, 0x004e2407, 0x003d5aa7, 0x01a34475, 0x01b58ea9, 0x0247eec7, 0x0007f303}}, Y: Field{[10]uint32{0x007afc9c, 0x01d6e904, 0x03918750, 0x03459260, 0x004beded, 0x00ce7e6d, 0x00e38754, 0x0151e2d2, 0x01a041e3, 0x00059770}}}, + {X: Field{[10]uint32{0x0046e079, 0x0280d49f, 0x0078dd12, 0x002e17a7, 0x00ab6693, 0x000ae8dd, 0x02f75adb, 0x02b14c3f, 0x02ad2acf, 0x002ae1b0}}, Y: Field{[10]uint32{0x0236ffe1, 0x00a2f05d, 0x017c0ec4, 0x03a12143, 0x01ce7728, 0x01cc8032, 0x01c46d4d, 0x00a6af3d, 0x0286019f, 0x00048270}}}, + {X: Field{[10]uint32{0x02dc69b2, 0x009c1f3f, 0x0371721a, 0x0226c9ad, 0x02a50a60, 0x0172a8e1, 0x00643043, 0x02e285cc, 0x0073ad6c, 0x00304ae4}}, Y: Field{[10]uint32{0x00dd41dd, 0x02ba6c08, 0x032a0032, 0x02f8f49e, 0x02b8ee1d, 0x03e2525d, 0x0372dc89, 0x0337c765, 0x003fe534, 0x000c5cf1}}}, + {X: Field{[10]uint32{0x02341142, 0x031ef3a7, 0x02760d3e, 0x03add91c, 0x007ae684, 0x0268459a, 0x021bd217, 0x028ec06e, 0x00110c2d, 0x00319c07}}, Y: Field{[10]uint32{0x020f4dad, 0x01318567, 0x03e57892, 0x02e96f26, 0x015d07fc, 0x03867d68, 0x03869bbd, 0x0376654b, 0x02b38d6c, 0x000a8083}}}, + {X: Field{[10]uint32{0x0161fe4d, 0x03d6177e, 0x03197ab6, 0x01be2c41, 0x028a1488, 0x004b29cf, 0x033e9313, 0x01ea3e8f, 0x0385dc32, 0x0034166f}}, Y: Field{[10]uint32{0x02e823c2, 0x00d6c19a, 0x0364cb99, 0x0287d36a, 0x00fd388b, 0x0212556d, 0x020765dc, 0x014978ff, 0x0260c08b, 0x0011441e}}}, + {X: Field{[10]uint32{0x00af666b, 0x018c0fdb, 0x00e30bcd, 0x034f12c7, 0x037ffcfe, 0x0205fd18, 0x036979ae, 0x000aa98a, 0x0257a781, 0x0004d192}}, Y: Field{[10]uint32{0x036ecc27, 0x0256a41f, 0x002e13f4, 0x02a07425, 0x0248f300, 0x00f32c32, 0x03e43345, 0x011603bd, 0x01900461, 0x001a6f85}}}, + }, + { + {X: Field{[10]uint32{0x00af666b, 0x018c0fdb, 0x00e30bcd, 0x034f12c7, 0x037ffcfe, 0x0205fd18, 0x036979ae, 0x000aa98a, 0x0257a781, 0x0004d192}}, Y: Field{[10]uint32{0x036ecc27, 0x0256a41f, 0x002e13f4, 0x02a07425, 0x0248f300, 0x00f32c32, 0x03e43345, 0x011603bd, 0x01900461, 0x001a6f85}}}, + {X: Field{[10]uint32{0x025084ae, 0x02127181, 0x02577c75, 0x01f73aaf, 0x019182be, 0x017f84b4, 0x005c88c8, 0x014d8bb0, 0x00f53224, 0x003acf3e}}, Y: Field{[10]uint32{0x016b9480, 0x01f07ffe, 0x012a66f6, 0x03179f6f, 0x01f52b45, 0x03f72928, 0x03e63dce, 0x035c010f, 0x038222d9, 0x00320cf1}}}, + {X: Field{[10]uint32{0x02ca5f51, 0x01ac8263, 0x01aebf21, 0x006e53f2, 0x03ddea17, 0x03c16d73, 0x02ed6b2b, 0x039a58b1, 0x0114dd9e, 0x00377a75}}, Y: Field{[10]uint32{0x00c638f7, 0x01a69cf4, 0x0171f9ad, 0x03a37a25, 0x0150feeb, 0x029fe3c2, 0x011f34b0, 0x02044762, 0x01133ce2, 0x002e139a}}}, + {X: Field{[10]uint32{0x02e9a5d0, 0x016f2f30, 0x001d9f8e, 0x03e61288, 0x02a576fc, 0x0211466c, 0x03a60f21, 0x02665d3d, 0x027d092d, 0x002f7c69}}, Y: Field{[10]uint32{0x0162ff7b, 0x013dc061, 0x02461cdb, 0x01879589, 0x02a6280b, 0x01afdeea, 0x00be54a8, 0x0286aaa0, 0x002bab65, 0x00102564}}}, + {X: Field{[10]uint32{0x019c88e4, 0x001ac166, 0x006ec2f9, 0x00f882b5, 0x039aed51, 0x004812c5, 0x01f406eb, 0x024dcdba, 0x02102369, 0x003f4698}}, Y: Field{[10]uint32{0x015bc8df, 0x02324596, 0x000f299c, 0x03525730, 0x02dc6b71, 0x0125dde0, 0x013c0695, 0x03082fec, 0x0354b9c8, 0x0006b25e}}}, + {X: Field{[10]uint32{0x009b0cca, 0x031a9568, 0x016f01cc, 0x02249293, 0x01a34575, 0x028a3696, 0x00454f68, 0x03d32357, 0x00b1dbb0, 0x000354e3}}, Y: Field{[10]uint32{0x00929e05, 0x02c51f83, 0x034c9731, 0x02676244, 0x038534cd, 0x003bb5f3, 0x00a8d5c4, 0x0304432c, 0x03ac7a3e, 0x0032065a}}}, + {X: Field{[10]uint32{0x038018ce, 0x0056d6d7, 0x02d68bd5, 0x01ce3624, 0x03cf2da5, 0x00b21b71, 0x03ffce4f, 0x025ae7c4, 0x0131d8c2, 0x0013b921}}, Y: Field{[10]uint32{0x0248381f, 0x016986c7, 0x006013c3, 0x01c6d3a0, 0x02710749, 0x0031f179, 0x03b4408d, 0x03e2d7f1, 0x02d4810b, 0x002da3e7}}}, + {X: Field{[10]uint32{0x0327e771, 0x017f05ce, 0x0262abde, 0x02591df6, 0x008c3b41, 0x019120ed, 0x01be267b, 0x03b0a735, 0x026eddc4, 0x001a215a}}, Y: Field{[10]uint32{0x03bbdab6, 0x02358a81, 0x0333a611, 0x03ca4ec1, 0x02331d22, 0x0067ded2, 0x036fd49c, 0x0287ec4e, 0x01f14f79, 0x001de8cf}}}, + {X: Field{[10]uint32{0x01473678, 0x014ba47c, 0x012f7028, 0x0254250e, 0x00cba057, 0x016e301c, 0x01e314c5, 0x00036ffd, 0x009c34c4, 0x003f5db3}}, Y: Field{[10]uint32{0x01144f4f, 0x0193baa3, 0x008437e1, 0x03b85007, 0x0260628e, 0x0340cb35, 0x03ee0a73, 0x010f6b83, 0x01437871, 0x003c8119}}}, + {X: Field{[10]uint32{0x02e66b24, 0x00014cb3, 0x00366b5f, 0x003fb5ee, 0x02e8b9c6, 0x03c6b7b4, 0x0244d99b, 0x031ee203, 0x00cfb9e9, 0x00133576}}, Y: Field{[10]uint32{0x000932fd, 0x03bf6ebd, 0x03aed221, 0x01784b4b, 0x03ca61e4, 0x0335b440, 0x024e8c39, 0x012d567f, 0x0282deb9, 0x0015dbab}}}, + {X: Field{[10]uint32{0x017a2193, 0x002dc523, 0x0146edf0, 0x0113c65d, 0x012c691e, 0x012d3a88, 0x026ce827, 0x02d00867, 0x03a33123, 0x002168aa}}, Y: Field{[10]uint32{0x00cdcf3a, 0x0320f52c, 0x012427f0, 0x037e70ec, 0x03e1c6da, 0x007300a7, 0x02c6082d, 0x00145b60, 0x0057eb2b, 0x002704a6}}}, + {X: Field{[10]uint32{0x01d7e577, 0x00c0f3bb, 0x004d56ae, 0x015a14db, 0x03d3a0f2, 0x003a8841, 0x00604727, 0x03dec96b, 0x010f8828, 0x0030d4b5}}, Y: Field{[10]uint32{0x00d9b570, 0x013fe23e, 0x017063ca, 0x02cad848, 0x0300a8ab, 0x02f39e7e, 0x03d53145, 0x02e6e5aa, 0x0038ba76, 0x002f9dca}}}, + {X: Field{[10]uint32{0x037568b0, 0x000c16cd, 0x03b0535b, 0x03406780, 0x0335ae8d, 0x01e0d943, 0x00b6d6c5, 0x03f9d110, 0x03fc73cf, 0x00349776}}, Y: Field{[10]uint32{0x0339929c, 0x004e49b7, 0x03f0060a, 0x022078f0, 0x03832273, 0x0379f64a, 0x02aef74c, 0x01224e2f, 0x037593f8, 0x001e8ebf}}}, + {X: Field{[10]uint32{0x02712536, 0x0158fa07, 0x03e71a33, 0x03d5bfd7, 0x02a85051, 0x02d8d7a7, 0x006de71a, 0x00ea7f82, 0x0286b0a4, 0x0001a453}}, Y: Field{[10]uint32{0x001128f1, 0x011dc4e0, 0x029da2a2, 0x01ac2bde, 0x00896c22, 0x016b0a30, 0x018aceae, 0x02f4149f, 0x012852d9, 0x000adf9e}}}, + {X: Field{[10]uint32{0x031d7c13, 0x03944629, 0x03a3855f, 0x03dfe83f, 0x01641ab5, 0x01eab201, 0x0307e9a9, 0x0129c957, 0x013143e9, 0x0011604d}}, Y: Field{[10]uint32{0x02ff63cf, 0x022f154e, 0x016b9963, 0x01550af6, 0x01702006, 0x01f75a72, 0x03f50f17, 0x026b62d5, 0x00ec1497, 0x0027d616}}}, + {X: Field{[10]uint32{0x0183f366, 0x028e834b, 0x00588cad, 0x03b78bca, 0x020cd9cc, 0x0307725e, 0x02f430bc, 0x03f8ba6b, 0x01f5b713, 0x002f12a7}}, Y: Field{[10]uint32{0x001f33c1, 0x02359996, 0x03b16d75, 0x03efe951, 0x02a6e8a9, 0x012de632, 0x03937adf, 0x017018e0, 0x01ca6e78, 0x00034ea0}}}, + }, + { + {X: Field{[10]uint32{0x0183f366, 0x028e834b, 0x00588cad, 0x03b78bca, 0x020cd9cc, 0x0307725e, 0x02f430bc, 0x03f8ba6b, 0x01f5b713, 0x002f12a7}}, Y: Field{[10]uint32{0x001f33c1, 0x02359996, 0x03b16d75, 0x03efe951, 0x02a6e8a9, 0x012de632, 0x03937adf, 0x017018e0, 0x01ca6e78, 0x00034ea0}}}, + {X: Field{[10]uint32{0x03fceb19, 0x0379517c, 0x00409282, 0x0087de17, 0x002e89b2, 0x0339eead, 0x005c7626, 0x033302af, 0x015e11ce, 0x003690cf}}, Y: Field{[10]uint32{0x02f5cc64, 0x039c4829, 0x03277684, 0x00b6489e, 0x018e77fc, 0x03e57948, 0x02bbdc4a, 0x0040c077, 0x03d321a8, 0x00392636}}}, + {X: Field{[10]uint32{0x0312be3c, 0x028b8cbd, 0x02a66b06, 0x023b6851, 0x007295f1, 0x02c0054d, 0x00725dba, 0x02cde34f, 0x009d9331, 0x000e75cd}}, Y: Field{[10]uint32{0x006ff65c, 0x00067d07, 0x01644cc3, 0x0297b290, 0x00ef5ef7, 0x019a04ba, 0x0127554c, 0x00efdfec, 0x034f56ef, 0x0023e4a6}}}, + {X: Field{[10]uint32{0x02cf692a, 0x0389d716, 0x03e0654d, 0x0229c881, 0x01bcc483, 0x00705bbf, 0x01c11698, 0x031fb070, 0x021ee9e8, 0x0000c7a3}}, Y: Field{[10]uint32{0x016f667a, 0x00aa13ac, 0x033b09cc, 0x009f16fd, 0x03706498, 0x00359d0e, 0x01097029, 0x00d4f767, 0x035b465b, 0x002b5f9f}}}, + {X: Field{[10]uint32{0x0377f22b, 0x0393ef37, 0x02e035aa, 0x00e653e0, 0x02c69972, 0x02656bc9, 0x011cd6c2, 0x00774279, 0x0217f7dc, 0x003c32e9}}, Y: Field{[10]uint32{0x0109a03c, 0x0238b1d6, 0x015661fc, 0x01fa4282, 0x0004f18c, 0x0145b410, 0x03326c36, 0x037e627b, 0x034313f9, 0x0006896a}}}, + {X: Field{[10]uint32{0x03829372, 0x002a929d, 0x00553dec, 0x003222e9, 0x03c49b30, 0x00e15e5a, 0x03626ae5, 0x0034ecc4, 0x00c90f3e, 0x002d0c67}}, Y: Field{[10]uint32{0x02dd5427, 0x02733002, 0x011bb772, 0x005728f8, 0x02707b12, 0x03087168, 0x037afe09, 0x0140affe, 0x00499a6f, 0x0011c1f5}}}, + {X: Field{[10]uint32{0x02509c12, 0x03373531, 0x0347658a, 0x008d6f47, 0x018d6bfe, 0x021c9a3b, 0x01170e8d, 0x01534c87, 0x02b9db21, 0x000e075e}}, Y: Field{[10]uint32{0x02b46102, 0x010aa38b, 0x02af7546, 0x0161b39b, 0x03205828, 0x02996079, 0x01d24573, 0x00f6a7ad, 0x035b7fda, 0x00291eaa}}}, + {X: Field{[10]uint32{0x01f488b6, 0x02f5ffe0, 0x0291592b, 0x00d8ff1e, 0x03e9c9bf, 0x00995fdc, 0x03e00d86, 0x01845574, 0x0207a88d, 0x002a61e1}}, Y: Field{[10]uint32{0x031dab1d, 0x029eeec0, 0x01c6d495, 0x006592b5, 0x0239d0f0, 0x00855f08, 0x0063e7c8, 0x02575870, 0x01abd588, 0x00346068}}}, + {X: Field{[10]uint32{0x004fe955, 0x00ed358e, 0x03ce48db, 0x0296818e, 0x03f69956, 0x02532294, 0x013b73e6, 0x021f991e, 0x005467ab, 0x0029c0fc}}, Y: Field{[10]uint32{0x021344bd, 0x02cbbef5, 0x0277fa26, 0x00a7165c, 0x03539e16, 0x02c64666, 0x02a792d6, 0x011eb703, 0x0135a2b0, 0x0035403e}}}, + {X: Field{[10]uint32{0x038a8cc6, 0x0024edb0, 0x038fbe64, 0x007a7da7, 0x00ba2e12, 0x03b5fcf7, 0x02279ff6, 0x0105f923, 0x00c750b3, 0x000cc649}}, Y: Field{[10]uint32{0x02587810, 0x02383ed1, 0x01b54c4e, 0x026b3a7a, 0x017fb99e, 0x038bfecc, 0x025b601b, 0x03c060ae, 0x01411b33, 0x0032a3de}}}, + {X: Field{[10]uint32{0x02eace58, 0x02595b01, 0x0211d349, 0x018e8bcc, 0x031b7e45, 0x0014e80f, 0x006ad0d7, 0x01435d1b, 0x03c5aad5, 0x001cf1ac}}, Y: Field{[10]uint32{0x02f8654e, 0x002a45ca, 0x01291717, 0x0236eee3, 0x02aa6a87, 0x019b6471, 0x02909913, 0x013dd06e, 0x00a4733a, 0x000e8bed}}}, + {X: Field{[10]uint32{0x01cbcb9e, 0x03c449b3, 0x03c3df4b, 0x02277360, 0x01d6fa56, 0x03f50dd8, 0x00c32447, 0x00cdea7b, 0x02d7119d, 0x003372c4}}, Y: Field{[10]uint32{0x0161cfd1, 0x029616b2, 0x03340a08, 0x0090d637, 0x01a199af, 0x01b7a652, 0x02fbea09, 0x03c47eff, 0x02e17bb9, 0x0039a678}}}, + {X: Field{[10]uint32{0x00181d5e, 0x00e22fc0, 0x02f2054b, 0x02a6e56a, 0x00de71b3, 0x0303b76e, 0x0100d3a1, 0x011ff687, 0x03e7506d, 0x003189fc}}, Y: Field{[10]uint32{0x029f886d, 0x0240298d, 0x022c3927, 0x0015272f, 0x028ef6b0, 0x02287df5, 0x01696013, 0x00a98ecb, 0x01d71e44, 0x0035e3e7}}}, + {X: Field{[10]uint32{0x025fe9cc, 0x011f3dcc, 0x008db1d7, 0x02ecd276, 0x03fbb883, 0x00b52b08, 0x00411084, 0x00c6c4dc, 0x026328ec, 0x0031bb57}}, Y: Field{[10]uint32{0x028fd94b, 0x02f38712, 0x02cf10c0, 0x00ad83c8, 0x02844f97, 0x031fdeca, 0x032ee125, 0x03e0c0a4, 0x005b49d7, 0x003791d0}}}, + {X: Field{[10]uint32{0x03828b16, 0x00a367ed, 0x0047f34e, 0x023ca292, 0x03a04795, 0x03c1b794, 0x025f40a6, 0x0348cfe8, 0x02be0edf, 0x002ee23e}}, Y: Field{[10]uint32{0x02ea5df7, 0x011ce882, 0x02969c51, 0x01d38e87, 0x03ec4a81, 0x00456458, 0x01dc5960, 0x03a374d1, 0x02b304f5, 0x002dcd9d}}}, + {X: Field{[10]uint32{0x01324caa, 0x02acc3f9, 0x032a3954, 0x038c2a51, 0x02694b65, 0x0114a8cb, 0x03d8c749, 0x022f0348, 0x017bf829, 0x00230a2a}}, Y: Field{[10]uint32{0x03ef9482, 0x00771cf2, 0x039459e7, 0x03c11472, 0x037ae784, 0x03df303a, 0x00fedf31, 0x01464cde, 0x0063a330, 0x001028c1}}}, + }, + { + {X: Field{[10]uint32{0x01324caa, 0x02acc3f9, 0x032a3954, 0x038c2a51, 0x02694b65, 0x0114a8cb, 0x03d8c749, 0x022f0348, 0x017bf829, 0x00230a2a}}, Y: Field{[10]uint32{0x03ef9482, 0x00771cf2, 0x039459e7, 0x03c11472, 0x037ae784, 0x03df303a, 0x00fedf31, 0x01464cde, 0x0063a330, 0x001028c1}}}, + {X: Field{[10]uint32{0x0211d8e2, 0x02c807dd, 0x03c4d5df, 0x03a37927, 0x02c8130f, 0x011fc368, 0x03ed5a60, 0x028bc65a, 0x01872a38, 0x002ac6b0}}, Y: Field{[10]uint32{0x0029d15b, 0x01607cf1, 0x0145f01a, 0x034cf879, 0x02f7ef93, 0x02da90ad, 0x02a5f39d, 0x005e87a6, 0x037a324d, 0x0004fd28}}}, + {X: Field{[10]uint32{0x0354dd40, 0x03a1c551, 0x026cf863, 0x00c7f0d1, 0x01a24226, 0x035cbdba, 0x034841fc, 0x037f3d16, 0x007032c0, 0x0025ca49}}, Y: Field{[10]uint32{0x02a36143, 0x02d24bca, 0x02f49384, 0x014956b2, 0x0290dae8, 0x02f537cd, 0x015c75dc, 0x03a87734, 0x0244265f, 0x00247468}}}, + {X: Field{[10]uint32{0x0251b3fa, 0x02bb9909, 0x03434226, 0x0195dcb7, 0x038ea1b3, 0x014fcc7b, 0x003a6072, 0x03e0b4dc, 0x029b5bee, 0x0009593f}}, Y: Field{[10]uint32{0x01e5122d, 0x00b9a8c0, 0x0016edb8, 0x02adade6, 0x0314f37d, 0x0080e497, 0x03a14ae1, 0x00e24257, 0x03a60678, 0x0022b67d}}}, + {X: Field{[10]uint32{0x002ca7ff, 0x0360bae3, 0x0021a3c2, 0x0176577c, 0x03180364, 0x028bc9eb, 0x00791ad5, 0x01e5b814, 0x0397580a, 0x002258df}}, Y: Field{[10]uint32{0x00493e68, 0x0105785c, 0x02ab7bed, 0x028e390b, 0x01f87bc6, 0x010d5d22, 0x03b9cf15, 0x02109355, 0x01248c88, 0x000b47f8}}}, + {X: Field{[10]uint32{0x007a89ee, 0x030d4cc3, 0x014f8057, 0x0271eadb, 0x024bdbc5, 0x03261962, 0x0060b88f, 0x01e7844a, 0x00e26a41, 0x001c7be9}}, Y: Field{[10]uint32{0x01366a2e, 0x0224ca70, 0x01a0b4f4, 0x02e2397a, 0x022aaafa, 0x005ca528, 0x03b2c32b, 0x0092ba7b, 0x001f8bb6, 0x000517ea}}}, + {X: Field{[10]uint32{0x00a8dd7f, 0x01b58e83, 0x0381a618, 0x000d5a84, 0x021bc728, 0x0354d5d0, 0x01c9da03, 0x017824bf, 0x00e71be2, 0x000c204e}}, Y: Field{[10]uint32{0x0292c7f2, 0x017c91e2, 0x01915e41, 0x01190d2b, 0x00c81656, 0x00502386, 0x039ec45d, 0x03f24978, 0x02d28828, 0x000a3478}}}, + {X: Field{[10]uint32{0x02180068, 0x0238f4eb, 0x03103b17, 0x01b082f4, 0x027ea3d5, 0x00c37006, 0x006c5c0c, 0x016c32ff, 0x0136ffac, 0x003fcf58}}, Y: Field{[10]uint32{0x008c6077, 0x01aedb86, 0x035e670a, 0x03c90007, 0x01547676, 0x0365ab70, 0x010372cd, 0x00003903, 0x01be84e4, 0x0004cc8e}}}, + {X: Field{[10]uint32{0x026a3fb1, 0x03315a21, 0x02206c0d, 0x00a0664b, 0x036ec009, 0x016da18b, 0x025750c8, 0x03ad9747, 0x00e82a6d, 0x0015d7f1}}, Y: Field{[10]uint32{0x002655ad, 0x023a42a4, 0x02f2f09b, 0x01cf1a8e, 0x02ed33b5, 0x01e3a1f6, 0x031dbc29, 0x03f28b59, 0x039042a6, 0x001bdbb6}}}, + {X: Field{[10]uint32{0x0121250a, 0x039ff72f, 0x00ad4954, 0x01d60e66, 0x03df45e1, 0x010d5579, 0x01e342ba, 0x022b494c, 0x01480bab, 0x000fea45}}, Y: Field{[10]uint32{0x02a76731, 0x021b00be, 0x01fb791c, 0x01680cad, 0x002e45e5, 0x00eec49f, 0x01bdf960, 0x02c0c33d, 0x02905499, 0x002fe6d9}}}, + {X: Field{[10]uint32{0x010117df, 0x01aa291e, 0x0102921b, 0x02ef3880, 0x03da253b, 0x03ba8aa3, 0x03f26f81, 0x02ade889, 0x0036b64e, 0x00297b24}}, Y: Field{[10]uint32{0x006462fe, 0x00a04cfe, 0x02363d81, 0x03c15852, 0x031c8461, 0x0347e83d, 0x0197983a, 0x01010031, 0x02625ec1, 0x002de771}}}, + {X: Field{[10]uint32{0x01e0545f, 0x0008d263, 0x0074f5cb, 0x0368841b, 0x0080e625, 0x02cd422b, 0x035ea004, 0x01c4928d, 0x03cc58e0, 0x00148116}}, Y: Field{[10]uint32{0x006c3d91, 0x028d3014, 0x01af236e, 0x003caa3f, 0x03793b9d, 0x00338c4a, 0x030ed9c2, 0x0048eb50, 0x01fcebe3, 0x0006cfcc}}}, + {X: Field{[10]uint32{0x032ad712, 0x03e5d705, 0x007290b0, 0x02c37841, 0x015a398c, 0x0118d26e, 0x01e79761, 0x002c2527, 0x03e91331, 0x002854f7}}, Y: Field{[10]uint32{0x0148fdd2, 0x017d94e3, 0x03329c8a, 0x00a16bc2, 0x02bd053f, 0x007c6e26, 0x00318d5f, 0x016cbf12, 0x00413fb0, 0x003f6536}}}, + {X: Field{[10]uint32{0x0220479f, 0x004f430c, 0x0338a89f, 0x02579796, 0x035de47b, 0x00dd80d8, 0x0162c8d2, 0x00bf6e00, 0x036ebe47, 0x00162d50}}, Y: Field{[10]uint32{0x027db17a, 0x01cdd795, 0x0334144a, 0x03120a6e, 0x0396af27, 0x00bdb7a0, 0x02913a25, 0x019cb138, 0x02b055cd, 0x002175ed}}}, + {X: Field{[10]uint32{0x01cf5b3a, 0x030dc044, 0x02781030, 0x020ef6d6, 0x00c4433a, 0x023b7209, 0x01c34d08, 0x0118564d, 0x02c6af79, 0x00269506}}, Y: Field{[10]uint32{0x02a44ae4, 0x0155d7cd, 0x0252d63f, 0x0389487a, 0x035548fe, 0x0223d1d7, 0x03e1af36, 0x01aadf2b, 0x00c1cb10, 0x002d9852}}}, + {X: Field{[10]uint32{0x03accae0, 0x012e8447, 0x0333748c, 0x0031692e, 0x023c8b35, 0x03c1c7f4, 0x01d94ce4, 0x009ea307, 0x02661395, 0x00023aa5}}, Y: Field{[10]uint32{0x0262b945, 0x03cd28c3, 0x038e955a, 0x02fa73c3, 0x0335b783, 0x02e57175, 0x00e7c0cf, 0x009e0b89, 0x02bbc8ee, 0x001883be}}}, + }, + { + {X: Field{[10]uint32{0x03accae0, 0x012e8447, 0x0333748c, 0x0031692e, 0x023c8b35, 0x03c1c7f4, 0x01d94ce4, 0x009ea307, 0x02661395, 0x00023aa5}}, Y: Field{[10]uint32{0x0262b945, 0x03cd28c3, 0x038e955a, 0x02fa73c3, 0x0335b783, 0x02e57175, 0x00e7c0cf, 0x009e0b89, 0x02bbc8ee, 0x001883be}}}, + {X: Field{[10]uint32{0x0190b632, 0x00c4c768, 0x01ab9a29, 0x008e92ad, 0x0263cf2a, 0x01556760, 0x0266df31, 0x003367ce, 0x03717622, 0x003097d8}}, Y: Field{[10]uint32{0x009590cf, 0x02fcf5bf, 0x03a1d6ee, 0x03fe7809, 0x000a9f04, 0x020275e6, 0x01049903, 0x00a1ce62, 0x03ede94d, 0x0014c553}}}, + {X: Field{[10]uint32{0x02a06f5e, 0x0102d659, 0x0037021a, 0x0145ba82, 0x02a34192, 0x0098edc5, 0x03b0d421, 0x0094eb0d, 0x00fbea14, 0x000e0ec9}}, Y: Field{[10]uint32{0x03c6e772, 0x03d1e1b4, 0x02b04089, 0x01d2ee30, 0x01e8f6ae, 0x013a9686, 0x00f566d5, 0x02e88113, 0x006ac4ed, 0x001533dc}}}, + {X: Field{[10]uint32{0x0066d561, 0x032cedf5, 0x00b4de2c, 0x0370c65e, 0x000c7b55, 0x01a21513, 0x002d82a5, 0x01aeacfa, 0x01fe3cce, 0x000aa7a3}}, Y: Field{[10]uint32{0x02e76373, 0x0333d494, 0x02182f96, 0x03b05e80, 0x035e01ea, 0x0022e5b3, 0x007b5ad6, 0x01947eeb, 0x01a5c16e, 0x000077fb}}}, + {X: Field{[10]uint32{0x0238a136, 0x01d70751, 0x00195c79, 0x038cda0e, 0x002b0d1c, 0x01835e43, 0x01e59c6b, 0x03b5b5e2, 0x02d03e02, 0x0039a10c}}, Y: Field{[10]uint32{0x006c2584, 0x03460423, 0x03336aaf, 0x03af6cd5, 0x032e09e3, 0x02807991, 0x012a7303, 0x01699893, 0x001398e3, 0x003296f9}}}, + {X: Field{[10]uint32{0x03cf2dce, 0x026d0236, 0x006c0213, 0x00417077, 0x0068114a, 0x00bfe660, 0x009e4c99, 0x018862f5, 0x014292e4, 0x0025798b}}, Y: Field{[10]uint32{0x00c86594, 0x0377f7d6, 0x0120e62b, 0x0180dc13, 0x025e7b30, 0x010a354b, 0x03a26e2b, 0x00a1d460, 0x0184296c, 0x0001ada0}}}, + {X: Field{[10]uint32{0x02e8c10c, 0x021f1105, 0x016807ce, 0x017ce46f, 0x03b47298, 0x01cc1b9f, 0x02fbdece, 0x0170a83b, 0x0159e2fe, 0x000e5775}}, Y: Field{[10]uint32{0x01fe638e, 0x035b64c1, 0x0122cbc3, 0x0013719a, 0x034c909c, 0x03fe9389, 0x0013e87a, 0x00ab1741, 0x00d4b459, 0x003f58b7}}}, + {X: Field{[10]uint32{0x038be384, 0x034c810f, 0x036c3e8b, 0x02b68c76, 0x0271ec0a, 0x03f7bc1c, 0x01ad6c94, 0x00f86c94, 0x00a42be6, 0x002c8de4}}, Y: Field{[10]uint32{0x0319880e, 0x0291cf7a, 0x00b58d10, 0x03d0527b, 0x0117f004, 0x02a07e51, 0x0150f88a, 0x017b6fa3, 0x014919d5, 0x003f1ada}}}, + {X: Field{[10]uint32{0x016c14ef, 0x01936c83, 0x03c8f516, 0x01d41be4, 0x000858fc, 0x03b89920, 0x02eed5be, 0x01772e7d, 0x02dc3552, 0x001e9452}}, Y: Field{[10]uint32{0x033fbd13, 0x00f861c2, 0x0224f7ad, 0x03dcaa9b, 0x0329beae, 0x0323d70d, 0x017f0b94, 0x039363a2, 0x01fed152, 0x0015bb74}}}, + {X: Field{[10]uint32{0x017ec94b, 0x03c14f42, 0x01c2dff9, 0x02472356, 0x0127ed70, 0x02b9a060, 0x02215aa8, 0x03bfb47b, 0x03cb7b4a, 0x002c844e}}, Y: Field{[10]uint32{0x007831ad, 0x03efff1a, 0x010fdbd5, 0x002c8d5f, 0x03094322, 0x01532d3a, 0x01a0b534, 0x03b9cc41, 0x027399e8, 0x0024efa7}}}, + {X: Field{[10]uint32{0x036d65eb, 0x0118f413, 0x021524a9, 0x01dd5100, 0x035a9910, 0x012423c8, 0x028ef3bf, 0x0364363a, 0x01584325, 0x0007b87f}}, Y: Field{[10]uint32{0x0122941c, 0x00dae497, 0x002b11e0, 0x03a618d6, 0x02ca32f4, 0x03d0bf3e, 0x03ab9fc4, 0x031cf073, 0x0091bdd6, 0x002eda4a}}}, + {X: Field{[10]uint32{0x03a6257f, 0x01499165, 0x02c40b80, 0x02c689e9, 0x011873c3, 0x02c1f9e2, 0x0024274a, 0x013c9699, 0x01c8e1f5, 0x001c7a4d}}, Y: Field{[10]uint32{0x01b1e582, 0x005d1874, 0x00f7a5b2, 0x015033dc, 0x02ef2523, 0x01eb8a94, 0x02d86ba4, 0x008944f7, 0x0259f47c, 0x001e364f}}}, + {X: Field{[10]uint32{0x0236cb44, 0x02543bc3, 0x020191f1, 0x01b23728, 0x01617e8b, 0x0220cd5f, 0x0058fd0d, 0x02aaa2f0, 0x0234d38f, 0x00055455}}, Y: Field{[10]uint32{0x03495a68, 0x02bd1947, 0x001e5329, 0x01d7c083, 0x01a8c371, 0x0118c817, 0x030e3f0b, 0x0148578d, 0x03c75557, 0x002ad3ff}}}, + {X: Field{[10]uint32{0x01ca950e, 0x0211c91e, 0x03bacbf0, 0x01d8aec4, 0x0139e015, 0x03b8b118, 0x02f8be79, 0x02572b14, 0x01ca4ee7, 0x002af114}}, Y: Field{[10]uint32{0x029490d2, 0x039f6326, 0x013ec07c, 0x00033a95, 0x02526840, 0x00b24515, 0x01dfb80c, 0x0029676c, 0x00befe82, 0x002b89c6}}}, + {X: Field{[10]uint32{0x0027bacc, 0x0251841d, 0x022e151f, 0x019374b5, 0x029e7331, 0x0163712a, 0x0358eb09, 0x014804d8, 0x006446bf, 0x000ef1af}}, Y: Field{[10]uint32{0x02d6fda6, 0x00cff57a, 0x02b4714c, 0x02948a2f, 0x03d71b75, 0x01b5b00a, 0x0362ee22, 0x030c1736, 0x00c07176, 0x00238c17}}}, + {X: Field{[10]uint32{0x039a9787, 0x01db313a, 0x0168092f, 0x02056566, 0x0189bdde, 0x02f4de23, 0x0269716b, 0x028181d1, 0x01faef5b, 0x00374d89}}, Y: Field{[10]uint32{0x0244a573, 0x01a34031, 0x0395937f, 0x0260a20c, 0x02941461, 0x0115cc72, 0x01a25010, 0x00c35187, 0x03a3520e, 0x001e8623}}}, + }, +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go new file mode 100644 index 00000000..051b8d1b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go @@ -0,0 +1,113 @@ +package secp256k1go + +/* +import ( + "os" + "fmt" + "time" +) + + +var ( + pre_g, pre_g_128 []XY + prec [64][16]XY + fin XY +) + + +func ecmult_start() { + return + sta := time.Now() + + g := TheCurve.G + + // calculate 2^128*generator + var g_128j XYZ + g_128j.SetXY(&g) + + for i := 0; i < 128; i++ { + g_128j.Double(&g_128j) + } + + var g_128 XY + g_128.SetXYZ(&g_128j) + + // precompute the tables with odd multiples + pre_g = g.precomp(WINDOW_G) + pre_g_128 = g_128.precomp(WINDOW_G) + + // compute prec and fin + var gg XYZ + gg.SetXY(&g) + ad := g + var fn XYZ + fn.Infinity = true + for j:=0; j<64; j++ { + prec[j][0].SetXYZ(&gg) + fn.Add(&fn, &gg) + for i:=1; i<16; i++ { + gg.AddXY(&gg, &ad) + prec[j][i].SetXYZ(&gg) + } + ad = prec[j][15] + } + fin.SetXYZ(&fn) + fin.Neg(&fin) + + if false { + f, _ := os.Create("z_prec.go") + fmt.Fprintln(f, "package secp256k1\n\nvar prec = [64][16]XY {") + for j:=0; j<64; j++ { + fmt.Fprintln(f, " {") + for i:=0; i<16; i++ { + fmt.Fprintln(f, "{X:" + fe2str(&prec[j][i].X) + ", Y:" + fe2str(&prec[j][i].Y) + "},") + } + fmt.Fprintln(f, "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_pre_g.go") + fmt.Fprintln(f, "package secp256k1\n\nvar pre_g = []XY {") + for i := range pre_g { + fmt.Fprintln(f, "{X:" + fe2str(&pre_g[i].X) + ", Y:" + fe2str(&pre_g[i].Y) + "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_pre_g_128.go") + fmt.Fprintln(f, "package secp256k1\n\nvar pre_g_128 = []XY {") + for i := range pre_g_128 { + fmt.Fprintln(f, "{X:" + fe2str(&pre_g_128[i].X) + ", Y:" + fe2str(&pre_g_128[i].Y) + "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_fin.go") + fmt.Fprintln(f, "package secp256k1\n\nvar fim = XY {") + fmt.Fprintln(f, "X:" + fe2str(&fin.X) + ", Y:" + fe2str(&fin.Y) + ",") + fmt.Fprintln(f, "}") + f.Close() + } + + println("start done in", time.Now().Sub(sta).String()) +} + + +func fe2str(f *Field) (s string) { + s = fmt.Sprintf("Field{[10]uint32{0x%08x", f.n[0]) + for i:=1; i= 0 { + nonce = newRandomNonceNumber() + } + return nonce +} + +// Sign sign hash, returns a compact recoverable signature +func Sign(msg []byte, seckey []byte) []byte { + if len(seckey) != 32 { + log.Panic("Sign, Invalid seckey length") + } + if secp.SeckeyIsValid(seckey) != 1 { + log.Panic("Attempting to sign with invalid seckey") + } + if len(msg) == 0 { + log.Panic("Sign, message nil") + } + if len(msg) != 32 { + log.Panic("Sign, message must be 32 bytes") + } + + nonce := newSigningNonce() + sig := make([]byte, 65) + var recid int // recovery byte, used to recover pubkey from sig + + var cSig secp.Signature + + var seckey1 secp.Number + var msg1 secp.Number + + seckey1.SetBytes(seckey) + msg1.SetBytes(msg) + + if msg1.Sign() == 0 { + log.Panic("Sign: message is 0") + } + + ret := cSig.Sign(&seckey1, &msg1, &nonce, &recid) + + if ret != 1 { + log.Panic("Secp25k1-go, Sign, signature operation failed") + } + + sigBytes := cSig.Bytes() + for i := 0; i < 64; i++ { + sig[i] = sigBytes[i] + } + if len(sigBytes) != 64 { + log.Panicf("Invalid signature byte count: %d", len(sigBytes)) + } + sig[64] = byte(recid) + + if recid > 4 { + log.Panic("invalid recovery id") + } + + return sig +} + +// VerifySeckey verifies a secret key +// Returns 1 on success +func VerifySeckey(seckey []byte) int { + if len(seckey) != 32 { + return -1 + } + + //does conversion internally if less than order of curve + if secp.SeckeyIsValid(seckey) != 1 { + return -2 + } + + //seckey is just 32 bit integer + //assume all seckey are valid + //no. must be less than order of curve + //note: converts internally + return 1 +} + +// VerifyPubkey verifies a public key +// Returns 1 on success +func VerifyPubkey(pubkey []byte) int { + if len(pubkey) != 33 { + return -2 + } + + if secp.PubkeyIsValid(pubkey) != 1 { + return -1 // tests parse and validity + } + + return 1 //valid +} + +// VerifySignatureValidity verifies a signature is well formed and not malleable +// Returns 1 on success +func VerifySignatureValidity(sig []byte) int { + //64+1 + if len(sig) != 65 { + log.Panic("VerifySignatureValidity: sig len is not 65 bytes") + return 0 + } + //malleability check: + //highest bit of 32nd byte must be 1 + //0x7f is 126 or 0b01111111 + if (sig[32] >> 7) == 1 { + return 0 // signature is malleable + } + //recovery id check + if sig[64] >= 4 { + return 0 // recovery id invalid + } + return 1 +} + +// VerifySignature for compressed signatures, does not need pubkey +// Returns 1 on success +func VerifySignature(msg []byte, sig []byte, pubkey1 []byte) int { + if msg == nil || len(sig) == 0 || len(pubkey1) == 0 { + log.Panic("VerifySignature, ERROR: invalid input, empty slices") + } + if len(sig) != 65 { + log.Panic("VerifySignature, invalid signature length") + } + if len(pubkey1) != 33 { + log.Panic("VerifySignature, invalid pubkey length") + } + + if len(msg) == 0 { + return 0 // empty message + } + + // malleability check: + // to enforce malleability, highest bit of S must be 1 + // S starts at 32nd byte + // 0x80 is 0b10000000 or 128 and masks highest bit + if (sig[32] >> 7) == 1 { + return 0 // valid signature, but fails malleability + } + + if sig[64] >= 4 { + return 0 // recovery byte invalid + } + + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + return 0 // pubkey could not be recovered, signature is invalid + } + + if len(pubkey2) != 33 { + log.Panic("recovered pubkey length invalid") // sanity check + } + + if !bytes.Equal(pubkey1, pubkey2) { + return 0 // pubkeys do not match + } + + return 1 // valid signature +} + +// RecoverPubkey recovers the public key from the signature +func RecoverPubkey(msg []byte, sig []byte) []byte { + if len(sig) != 65 { + log.Panic("sig length must be 65 bytes") + } + + var recid = int(sig[64]) + + pubkey, ret := secp.RecoverPublicKey(sig[0:64], msg, recid) + + if ret != 1 { + if DebugPrint { + log.Printf("RecoverPubkey: code %d", ret) + } + return nil + } + + if pubkey == nil { + log.Panic("ERROR: impossible, pubkey nil and ret == 1") + } + if secp.PubkeyIsValid(pubkey) != 1 { + log.Panicf("secp.RecoverPublicKey returned invalid pubkey %s", hex.EncodeToString(pubkey)) + } + + return pubkey +} + +// ECDH raise a pubkey to the power of a seckey +func ECDH(pub, sec []byte) []byte { + if len(sec) != 32 { + log.Panic("secret key must be 32 bytes") + } + + if len(pub) != 33 { + log.Panic("public key must be 33 bytes") + } + + if VerifySeckey(sec) != 1 { + if DebugPrint { + log.Printf("Invalid Seckey") + } + return nil + } + + if ret := VerifyPubkey(pub); ret != 1 { + if DebugPrint { + log.Printf("Invalid Pubkey, %d", ret) + } + return nil + } + + pubkeyOut := secp.Multiply(pub, sec) + if pubkeyOut == nil { + return nil + } + if len(pubkeyOut) != 33 { + log.Panic("ERROR: impossible, invalid pubkey length") + } + return pubkeyOut +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/certutil/LICENSE b/vendor/github.com/skycoin/skycoin/src/util/certutil/LICENSE new file mode 100644 index 00000000..a7b7560c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/certutil/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2013-2015 The btcsuite developers + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/src/util/logging/formatter.go b/vendor/github.com/skycoin/skycoin/src/util/logging/formatter.go new file mode 100644 index 00000000..e9066f4c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/logging/formatter.go @@ -0,0 +1,441 @@ +package logging + +import ( + "bytes" + "fmt" + "io" + "os" + "sort" + "strings" + "sync" + "time" + + "github.com/mgutz/ansi" + "github.com/sirupsen/logrus" + "golang.org/x/crypto/ssh/terminal" +) + +const defaultTimestampFormat = time.RFC3339 + +var ( + baseTimestamp = time.Now() + defaultColorScheme = &ColorScheme{ + InfoLevelStyle: "green", + WarnLevelStyle: "yellow", + ErrorLevelStyle: "red", + FatalLevelStyle: "red", + PanicLevelStyle: "red", + DebugLevelStyle: "blue", + PrefixStyle: "cyan", + TimestampStyle: "black+h", + CallContextStyle: "black+h", + CriticalStyle: "magenta+h", + } + noColorsColorScheme = &compiledColorScheme{ + InfoLevelColor: ansi.ColorFunc(""), + WarnLevelColor: ansi.ColorFunc(""), + ErrorLevelColor: ansi.ColorFunc(""), + FatalLevelColor: ansi.ColorFunc(""), + PanicLevelColor: ansi.ColorFunc(""), + DebugLevelColor: ansi.ColorFunc(""), + PrefixColor: ansi.ColorFunc(""), + TimestampColor: ansi.ColorFunc(""), + CallContextColor: ansi.ColorFunc(""), + CriticalColor: ansi.ColorFunc(""), + } + defaultCompiledColorScheme = compileColorScheme(defaultColorScheme) +) + +func miniTS() int { + return int(time.Since(baseTimestamp) / time.Second) +} + +// ColorScheme configures the logging output colors +type ColorScheme struct { + InfoLevelStyle string + WarnLevelStyle string + ErrorLevelStyle string + FatalLevelStyle string + PanicLevelStyle string + DebugLevelStyle string + PrefixStyle string + TimestampStyle string + CallContextStyle string + CriticalStyle string +} + +type compiledColorScheme struct { + InfoLevelColor func(string) string + WarnLevelColor func(string) string + ErrorLevelColor func(string) string + FatalLevelColor func(string) string + PanicLevelColor func(string) string + DebugLevelColor func(string) string + PrefixColor func(string) string + TimestampColor func(string) string + CallContextColor func(string) string + CriticalColor func(string) string +} + +// TextFormatter formats log output +type TextFormatter struct { + // Set to true to bypass checking for a TTY before outputting colors. + ForceColors bool + + // Force disabling colors. For a TTY colors are enabled by default. + DisableColors bool + + // Force formatted layout, even for non-TTY output. + ForceFormatting bool + + // Disable timestamp logging. useful when output is redirected to logging + // system that already adds timestamps. + DisableTimestamp bool + + // Disable the conversion of the log levels to uppercase + DisableUppercase bool + + // Enable logging the full timestamp when a TTY is attached instead of just + // the time passed since beginning of execution. + FullTimestamp bool + + // Timestamp format to use for display when a full timestamp is printed. + TimestampFormat string + + // The fields are sorted by default for a consistent output. For applications + // that log extremely frequently and don't use the JSON formatter this may not + // be desired. + DisableSorting bool + + // Wrap empty fields in quotes if true. + QuoteEmptyFields bool + + // Can be set to the override the default quoting character " + // with something else. For example: ', or `. + QuoteCharacter string + + // Pad msg field with spaces on the right for display. + // The value for this parameter will be the size of padding. + // Its default value is zero, which means no padding will be applied for msg. + SpacePadding int + + // Always use quotes for string values (except for empty fields) + AlwaysQuoteStrings bool + + // Color scheme to use. + colorScheme *compiledColorScheme + + // Whether the logger's out is to a terminal. + isTerminal bool + + sync.Once +} + +func getCompiledColor(main string, fallback string) func(string) string { + var style string + if main != "" { + style = main + } else { + style = fallback + } + return ansi.ColorFunc(style) +} + +func compileColorScheme(s *ColorScheme) *compiledColorScheme { + return &compiledColorScheme{ + InfoLevelColor: getCompiledColor(s.InfoLevelStyle, defaultColorScheme.InfoLevelStyle), + WarnLevelColor: getCompiledColor(s.WarnLevelStyle, defaultColorScheme.WarnLevelStyle), + ErrorLevelColor: getCompiledColor(s.ErrorLevelStyle, defaultColorScheme.ErrorLevelStyle), + FatalLevelColor: getCompiledColor(s.FatalLevelStyle, defaultColorScheme.FatalLevelStyle), + PanicLevelColor: getCompiledColor(s.PanicLevelStyle, defaultColorScheme.PanicLevelStyle), + DebugLevelColor: getCompiledColor(s.DebugLevelStyle, defaultColorScheme.DebugLevelStyle), + PrefixColor: getCompiledColor(s.PrefixStyle, defaultColorScheme.PrefixStyle), + TimestampColor: getCompiledColor(s.TimestampStyle, defaultColorScheme.TimestampStyle), + CallContextColor: getCompiledColor(s.CallContextStyle, defaultColorScheme.CallContextStyle), + CriticalColor: getCompiledColor(s.CriticalStyle, defaultColorScheme.CriticalStyle), + } +} + +func (f *TextFormatter) init(entry *logrus.Entry) { + if len(f.QuoteCharacter) == 0 { + f.QuoteCharacter = "\"" + } + if entry.Logger != nil { + f.isTerminal = f.checkIfTerminal(entry.Logger.Out) + } +} + +func (f *TextFormatter) checkIfTerminal(w io.Writer) bool { + switch v := w.(type) { + case *os.File: + return terminal.IsTerminal(int(v.Fd())) + default: + return false + } +} + +// SetColorScheme sets the TextFormatter's color scheme configuration +func (f *TextFormatter) SetColorScheme(colorScheme *ColorScheme) { + f.colorScheme = compileColorScheme(colorScheme) +} + +// Format formats a logrus.Entry +func (f *TextFormatter) Format(entry *logrus.Entry) ([]byte, error) { + var b *bytes.Buffer + keys := make([]string, 0, len(entry.Data)) + for k := range entry.Data { + keys = append(keys, k) + } + lastKeyIdx := len(keys) - 1 + + if !f.DisableSorting { + sort.Strings(keys) + } + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + f.Do(func() { f.init(entry) }) + + isFormatted := f.ForceFormatting || f.isTerminal + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + if isFormatted { + isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors + var colorScheme *compiledColorScheme + if isColored { + if f.colorScheme == nil { + colorScheme = defaultCompiledColorScheme + } else { + colorScheme = f.colorScheme + } + } else { + colorScheme = noColorsColorScheme + } + f.printColored(b, entry, keys, timestampFormat, colorScheme) + } else { + if !f.DisableTimestamp { + f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat), true) + } + f.appendKeyValue(b, "level", entry.Level.String(), true) + if entry.Message != "" { + f.appendKeyValue(b, "msg", entry.Message, lastKeyIdx >= 0) + } + for i, key := range keys { + f.appendKeyValue(b, key, entry.Data[key], lastKeyIdx != i) + } + } + + b.WriteByte('\n') //nolint:gosec + return b.Bytes(), nil +} + +func (f *TextFormatter) printColored(b *bytes.Buffer, entry *logrus.Entry, keys []string, timestampFormat string, colorScheme *compiledColorScheme) { + var levelColor func(string) string + var levelText string + switch entry.Level { + case logrus.InfoLevel: + levelColor = colorScheme.InfoLevelColor + case logrus.WarnLevel: + levelColor = colorScheme.WarnLevelColor + case logrus.ErrorLevel: + levelColor = colorScheme.ErrorLevelColor + case logrus.FatalLevel: + levelColor = colorScheme.FatalLevelColor + case logrus.PanicLevel: + levelColor = colorScheme.PanicLevelColor + default: + levelColor = colorScheme.DebugLevelColor + } + + priority, ok := entry.Data[logPriorityKey] + hasPriority := ok && priority == logPriorityCritical + + if entry.Level != logrus.WarnLevel { + levelText = entry.Level.String() + } else { + levelText = "warn" + } + + if !f.DisableUppercase { + levelText = strings.ToUpper(levelText) + } + + level := levelColor(levelText) + message := entry.Message + prefix := "" + + prefixText := extractPrefix(entry) + if prefixText != "" { + prefixText = " " + prefixText + ":" + prefix = colorScheme.PrefixColor(prefixText) + } + + messageFormat := "%s" + if f.SpacePadding != 0 { + messageFormat = fmt.Sprintf("%%-%ds", f.SpacePadding) + } + if message != "" { + messageFormat = " " + messageFormat + } + + callContextParts := []string{} + if ifile, ok := entry.Data["file"]; ok { + if sfile, ok := ifile.(string); ok && sfile != "" { + callContextParts = append(callContextParts, sfile) + } + } + if ifunc, ok := entry.Data["func"]; ok { + if sfunc, ok := ifunc.(string); ok && sfunc != "" { + callContextParts = append(callContextParts, sfunc) + } + } + if iline, ok := entry.Data["line"]; ok { + sline := "" + switch iline := iline.(type) { + case string: + sline = iline + case int, uint, int32, int64, uint32, uint64: + sline = fmt.Sprint(iline) + } + if sline != "" { + callContextParts = append(callContextParts, fmt.Sprint(sline)) + } + } + callContextText := strings.Join(callContextParts, ":") + callContext := colorScheme.CallContextColor(callContextText) + if callContext != "" { + callContext = " " + callContext + } + + if f.DisableTimestamp { + if hasPriority { + str := fmt.Sprintf("%s%s%s"+messageFormat, levelText, callContextText, prefixText, message) + fmt.Fprint(b, colorScheme.CriticalColor(str)) + } else { + fmt.Fprintf(b, "%s%s%s"+messageFormat, level, callContext, prefix, message) + } + } else { + var timestamp string + if !f.FullTimestamp { + timestamp = fmt.Sprintf("[%04d]", miniTS()) + } else { + timestamp = fmt.Sprintf("[%s]", entry.Time.Format(timestampFormat)) + } + + coloredTimestamp := colorScheme.TimestampColor(timestamp) + + if hasPriority { + str := fmt.Sprintf("%s %s%s%s"+messageFormat, timestamp, levelText, callContextText, prefixText, message) + fmt.Fprint(b, colorScheme.CriticalColor(str)) + } else { + fmt.Fprintf(b, "%s %s%s%s"+messageFormat, coloredTimestamp, level, callContext, prefix, message) + } + } + + for _, k := range keys { + if k != "prefix" && k != "file" && k != "func" && k != "line" && k != logPriorityKey && k != logModuleKey { + v := entry.Data[k] + fmt.Fprintf(b, " %s", f.formatKeyValue(levelColor(k), v)) + } + } +} + +func (f *TextFormatter) needsQuoting(text string) bool { + if len(text) == 0 { + return f.QuoteEmptyFields + } + + if f.AlwaysQuoteStrings { + return true + } + + for _, ch := range text { + if !((ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9') || + ch == '-' || ch == '.') { + return true + } + } + + return false +} + +func extractPrefix(e *logrus.Entry) string { + var module string + if iModule, ok := e.Data[logModuleKey]; ok { + module, _ = iModule.(string) + } + + var priority string + if iPriority, ok := e.Data[logPriorityKey]; ok { + priority, _ = iPriority.(string) + } + + switch { + case priority == "": + return fmt.Sprintf("[%s]", module) + case module == "": + return fmt.Sprintf("[%s]", priority) + default: + return fmt.Sprintf("[%s:%s]", module, priority) + } +} + +func (f *TextFormatter) formatKeyValue(key string, value interface{}) string { + return fmt.Sprintf("%s=%s", key, f.formatValue(value)) +} + +func (f *TextFormatter) formatValue(value interface{}) string { + switch value := value.(type) { + case string: + if f.needsQuoting(value) { + return fmt.Sprintf("%s%+v%s", f.QuoteCharacter, value, f.QuoteCharacter) + } + return value + case error: + errmsg := value.Error() + if f.needsQuoting(errmsg) { + return fmt.Sprintf("%s%+v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter) + } + return errmsg + default: + return fmt.Sprintf("%+v", value) + } +} + +func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}, appendSpace bool) { + b.WriteString(key) //nolint:gosec + b.WriteByte('=') //nolint:gosec + f.appendValue(b, value) //nolint:gosec + + if appendSpace { + b.WriteByte(' ') //nolint:gosec + } +} + +func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) { + switch value := value.(type) { + case string: + if f.needsQuoting(value) { + fmt.Fprintf(b, "%s%+v%s", f.QuoteCharacter, value, f.QuoteCharacter) + } else { + b.WriteString(value) //nolint:gosec + } + case error: + errmsg := value.Error() + if f.needsQuoting(errmsg) { + fmt.Fprintf(b, "%s%+v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter) + } else { + b.WriteString(errmsg) //nolint:gosec + } + default: + fmt.Fprint(b, value) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/logging/hooks.go b/vendor/github.com/skycoin/skycoin/src/util/logging/hooks.go new file mode 100644 index 00000000..d8d0cc61 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/logging/hooks.go @@ -0,0 +1,44 @@ +package logging + +import ( + "io" + + "github.com/sirupsen/logrus" +) + +// WriteHook is a logrus.Hook that logs to an io.Writer +type WriteHook struct { + w io.Writer + formatter logrus.Formatter +} + +// NewWriteHook returns a new WriteHook +func NewWriteHook(w io.Writer) *WriteHook { + return &WriteHook{ + w: w, + formatter: &TextFormatter{ + DisableColors: true, + FullTimestamp: true, + AlwaysQuoteStrings: true, + QuoteEmptyFields: true, + ForceFormatting: true, + }, + } +} + +// Levels returns Levels accepted by the WriteHook. +// All logrus.Levels are returned. +func (f *WriteHook) Levels() []logrus.Level { + return logrus.AllLevels +} + +// Fire writes a logrus.Entry to the file +func (f *WriteHook) Fire(e *logrus.Entry) error { + b, err := f.formatter.Format(e) + if err != nil { + return err + } + + _, err = f.w.Write(b) + return err +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/logging/logger.go b/vendor/github.com/skycoin/skycoin/src/util/logging/logger.go new file mode 100644 index 00000000..7b7e3359 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/logging/logger.go @@ -0,0 +1,77 @@ +package logging + +import ( + "os" + "time" + + "github.com/sirupsen/logrus" +) + +// Logger wraps logrus.FieldLogger +type Logger struct { + logrus.FieldLogger +} + +// Critical adds special critical-level fields for specially highlighted logging, +// since logrus lacks a distinct critical field and does not have configurable log levels +func (logger *Logger) Critical() logrus.FieldLogger { + return logger.WithField(logPriorityKey, logPriorityCritical) +} + +// WithTime overrides time, used by logger. +func (logger *Logger) WithTime(t time.Time) *logrus.Entry { + return logger.WithFields(logrus.Fields{}).WithTime(t) +} + +// MasterLogger wraps logrus.Logger and is able to create new package-aware loggers +type MasterLogger struct { + *logrus.Logger +} + +// NewMasterLogger creates a new package-aware logger with formatting string +func NewMasterLogger() *MasterLogger { + hooks := make(logrus.LevelHooks) + + return &MasterLogger{ + Logger: &logrus.Logger{ + Out: os.Stdout, + Formatter: &TextFormatter{ + FullTimestamp: true, + AlwaysQuoteStrings: true, + QuoteEmptyFields: true, + ForceFormatting: true, + DisableColors: false, + ForceColors: false, + }, + Hooks: hooks, + Level: logrus.DebugLevel, + }, + } +} + +// PackageLogger instantiates a package-aware logger +func (logger *MasterLogger) PackageLogger(moduleName string) *Logger { + return &Logger{ + FieldLogger: logger.WithField(logModuleKey, moduleName), + } +} + +// AddHook adds a logrus.Hook to the logger and its module loggers +func (logger *MasterLogger) AddHook(hook logrus.Hook) { + logger.Hooks.Add(hook) +} + +// SetLevel sets the log level for the logger and its module loggers +func (logger *MasterLogger) SetLevel(level logrus.Level) { + logger.Level = level +} + +// EnableColors enables colored logging +func (logger *MasterLogger) EnableColors() { + logger.Formatter.(*TextFormatter).DisableColors = false +} + +// DisableColors disables colored logging +func (logger *MasterLogger) DisableColors() { + logger.Formatter.(*TextFormatter).DisableColors = true +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/logging/logging.go b/vendor/github.com/skycoin/skycoin/src/util/logging/logging.go new file mode 100644 index 00000000..f7b86ffc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/logging/logging.go @@ -0,0 +1,79 @@ +/* +Package logging provides application logging utilities +*/ +package logging + +import ( + "errors" + "io" + "io/ioutil" + "strings" + + "github.com/sirupsen/logrus" +) + +var log = NewMasterLogger() + +const ( + // logModuleKey is the key used for the module name data entry + logModuleKey = "_module" + // logPriorityKey is the log entry key for priority log statements + logPriorityKey = "_priority" + // logPriorityCritical is the log entry value for priority log statements + logPriorityCritical = "CRITICAL" +) + +// LevelFromString returns a logrus.Level from a string identifier +func LevelFromString(s string) (logrus.Level, error) { + switch strings.ToLower(s) { + case "debug": + return logrus.DebugLevel, nil + case "info", "notice": + return logrus.InfoLevel, nil + case "warn", "warning": + return logrus.WarnLevel, nil + case "error": + return logrus.ErrorLevel, nil + case "fatal", "critical": + return logrus.FatalLevel, nil + case "panic": + return logrus.PanicLevel, nil + default: + return logrus.DebugLevel, errors.New("could not convert string to log level") + } +} + +// MustGetLogger returns a package-aware logger from the master logger +func MustGetLogger(module string) *Logger { + return log.PackageLogger(module) +} + +// AddHook adds a hook to the global logger +func AddHook(hook logrus.Hook) { + log.AddHook(hook) +} + +// EnableColors enables colored logging +func EnableColors() { + log.EnableColors() +} + +// DisableColors disables colored logging +func DisableColors() { + log.DisableColors() +} + +// SetLevel sets the logger's minimum log level +func SetLevel(level logrus.Level) { + log.SetLevel(level) +} + +// SetOutputTo sets the logger's output to an io.Writer +func SetOutputTo(w io.Writer) { + log.Out = w +} + +// Disable disables the logger completely +func Disable() { + log.Out = ioutil.Discard +} diff --git a/vendor/github.com/spf13/cobra/.gitignore b/vendor/github.com/spf13/cobra/.gitignore deleted file mode 100644 index 3b053c59..00000000 --- a/vendor/github.com/spf13/cobra/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -# Vim files https://github.com/github/gitignore/blob/master/Global/Vim.gitignore -# swap -[._]*.s[a-w][a-z] -[._]s[a-w][a-z] -# session -Session.vim -# temporary -.netrwhist -*~ -# auto-generated tag files -tags - -*.exe - -cobra.test - -.idea/* diff --git a/vendor/github.com/spf13/cobra/.mailmap b/vendor/github.com/spf13/cobra/.mailmap deleted file mode 100644 index 94ec5306..00000000 --- a/vendor/github.com/spf13/cobra/.mailmap +++ /dev/null @@ -1,3 +0,0 @@ -Steve Francia -Bjørn Erik Pedersen -Fabiano Franz diff --git a/vendor/github.com/spf13/cobra/.travis.yml b/vendor/github.com/spf13/cobra/.travis.yml deleted file mode 100644 index 38b85f49..00000000 --- a/vendor/github.com/spf13/cobra/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -language: go - -stages: - - diff - - test - -go: - - 1.10.x - - 1.11.x - - 1.12.x - - tip - -matrix: - allow_failures: - - go: tip - include: - - stage: diff - go: 1.12.x - script: diff -u <(echo -n) <(gofmt -d -s .) - -before_install: - - mkdir -p bin - - curl -Lso bin/shellcheck https://github.com/caarlos0/shellcheck-docker/releases/download/v0.6.0/shellcheck - - chmod +x bin/shellcheck - - go get -u github.com/kyoh86/richgo -script: - - PATH=$PATH:$PWD/bin richgo test -v ./... - - go build - - if [ -z $NOVET ]; then - diff -u <(echo -n) <(go vet . 2>&1 | grep -vE 'ExampleCommand|bash_completions.*Fprint'); - fi diff --git a/vendor/github.com/spf13/cobra/README.md b/vendor/github.com/spf13/cobra/README.md deleted file mode 100644 index 60c5a425..00000000 --- a/vendor/github.com/spf13/cobra/README.md +++ /dev/null @@ -1,741 +0,0 @@ -![cobra logo](https://cloud.githubusercontent.com/assets/173412/10886352/ad566232-814f-11e5-9cd0-aa101788c117.png) - -Cobra is both a library for creating powerful modern CLI applications as well as a program to generate applications and command files. - -Many of the most widely used Go projects are built using Cobra, such as: -[Kubernetes](http://kubernetes.io/), -[Hugo](http://gohugo.io), -[rkt](https://github.com/coreos/rkt), -[etcd](https://github.com/coreos/etcd), -[Moby (former Docker)](https://github.com/moby/moby), -[Docker (distribution)](https://github.com/docker/distribution), -[OpenShift](https://www.openshift.com/), -[Delve](https://github.com/derekparker/delve), -[GopherJS](http://www.gopherjs.org/), -[CockroachDB](http://www.cockroachlabs.com/), -[Bleve](http://www.blevesearch.com/), -[ProjectAtomic (enterprise)](http://www.projectatomic.io/), -[Giant Swarm's gsctl](https://github.com/giantswarm/gsctl), -[Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack), -[rclone](http://rclone.org/), -[nehm](https://github.com/bogem/nehm), -[Pouch](https://github.com/alibaba/pouch), -[Istio](https://istio.io), -[Prototool](https://github.com/uber/prototool), -[mattermost-server](https://github.com/mattermost/mattermost-server), -[Gardener](https://github.com/gardener/gardenctl), -etc. - -[![Build Status](https://travis-ci.org/spf13/cobra.svg "Travis CI status")](https://travis-ci.org/spf13/cobra) -[![CircleCI status](https://circleci.com/gh/spf13/cobra.png?circle-token=:circle-token "CircleCI status")](https://circleci.com/gh/spf13/cobra) -[![GoDoc](https://godoc.org/github.com/spf13/cobra?status.svg)](https://godoc.org/github.com/spf13/cobra) - -# Table of Contents - -- [Overview](#overview) -- [Concepts](#concepts) - * [Commands](#commands) - * [Flags](#flags) -- [Installing](#installing) -- [Getting Started](#getting-started) - * [Using the Cobra Generator](#using-the-cobra-generator) - * [Using the Cobra Library](#using-the-cobra-library) - * [Working with Flags](#working-with-flags) - * [Positional and Custom Arguments](#positional-and-custom-arguments) - * [Example](#example) - * [Help Command](#help-command) - * [Usage Message](#usage-message) - * [PreRun and PostRun Hooks](#prerun-and-postrun-hooks) - * [Suggestions when "unknown command" happens](#suggestions-when-unknown-command-happens) - * [Generating documentation for your command](#generating-documentation-for-your-command) - * [Generating bash completions](#generating-bash-completions) - * [Generating zsh completions](#generating-zsh-completions) -- [Contributing](#contributing) -- [License](#license) - -# Overview - -Cobra is a library providing a simple interface to create powerful modern CLI -interfaces similar to git & go tools. - -Cobra is also an application that will generate your application scaffolding to rapidly -develop a Cobra-based application. - -Cobra provides: -* Easy subcommand-based CLIs: `app server`, `app fetch`, etc. -* Fully POSIX-compliant flags (including short & long versions) -* Nested subcommands -* Global, local and cascading flags -* Easy generation of applications & commands with `cobra init appname` & `cobra add cmdname` -* Intelligent suggestions (`app srver`... did you mean `app server`?) -* Automatic help generation for commands and flags -* Automatic help flag recognition of `-h`, `--help`, etc. -* Automatically generated bash autocomplete for your application -* Automatically generated man pages for your application -* Command aliases so you can change things without breaking them -* The flexibility to define your own help, usage, etc. -* Optional tight integration with [viper](http://github.com/spf13/viper) for 12-factor apps - -# Concepts - -Cobra is built on a structure of commands, arguments & flags. - -**Commands** represent actions, **Args** are things and **Flags** are modifiers for those actions. - -The best applications will read like sentences when used. Users will know how -to use the application because they will natively understand how to use it. - -The pattern to follow is -`APPNAME VERB NOUN --ADJECTIVE.` - or -`APPNAME COMMAND ARG --FLAG` - -A few good real world examples may better illustrate this point. - -In the following example, 'server' is a command, and 'port' is a flag: - - hugo server --port=1313 - -In this command we are telling Git to clone the url bare. - - git clone URL --bare - -## Commands - -Command is the central point of the application. Each interaction that -the application supports will be contained in a Command. A command can -have children commands and optionally run an action. - -In the example above, 'server' is the command. - -[More about cobra.Command](https://godoc.org/github.com/spf13/cobra#Command) - -## Flags - -A flag is a way to modify the behavior of a command. Cobra supports -fully POSIX-compliant flags as well as the Go [flag package](https://golang.org/pkg/flag/). -A Cobra command can define flags that persist through to children commands -and flags that are only available to that command. - -In the example above, 'port' is the flag. - -Flag functionality is provided by the [pflag -library](https://github.com/spf13/pflag), a fork of the flag standard library -which maintains the same interface while adding POSIX compliance. - -# Installing -Using Cobra is easy. First, use `go get` to install the latest version -of the library. This command will install the `cobra` generator executable -along with the library and its dependencies: - - go get -u github.com/spf13/cobra/cobra - -Next, include Cobra in your application: - -```go -import "github.com/spf13/cobra" -``` - -# Getting Started - -While you are welcome to provide your own organization, typically a Cobra-based -application will follow the following organizational structure: - -``` - ▾ appName/ - ▾ cmd/ - add.go - your.go - commands.go - here.go - main.go -``` - -In a Cobra app, typically the main.go file is very bare. It serves one purpose: initializing Cobra. - -```go -package main - -import ( - "{pathToYourApp}/cmd" -) - -func main() { - cmd.Execute() -} -``` - -## Using the Cobra Generator - -Cobra provides its own program that will create your application and add any -commands you want. It's the easiest way to incorporate Cobra into your application. - -[Here](https://github.com/spf13/cobra/blob/master/cobra/README.md) you can find more information about it. - -## Using the Cobra Library - -To manually implement Cobra you need to create a bare main.go file and a rootCmd file. -You will optionally provide additional commands as you see fit. - -### Create rootCmd - -Cobra doesn't require any special constructors. Simply create your commands. - -Ideally you place this in app/cmd/root.go: - -```go -var rootCmd = &cobra.Command{ - Use: "hugo", - Short: "Hugo is a very fast static site generator", - Long: `A Fast and Flexible Static Site Generator built with - love by spf13 and friends in Go. - Complete documentation is available at http://hugo.spf13.com`, - Run: func(cmd *cobra.Command, args []string) { - // Do Stuff Here - }, -} - -func Execute() { - if err := rootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} -``` - -You will additionally define flags and handle configuration in your init() function. - -For example cmd/root.go: - -```go -import ( - "fmt" - "os" - - homedir "github.com/mitchellh/go-homedir" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -func init() { - cobra.OnInitialize(initConfig) - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)") - rootCmd.PersistentFlags().StringVarP(&projectBase, "projectbase", "b", "", "base project directory eg. github.com/spf13/") - rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "Author name for copyright attribution") - rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "Name of license for the project (can provide `licensetext` in config)") - rootCmd.PersistentFlags().Bool("viper", true, "Use Viper for configuration") - viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) - viper.BindPFlag("projectbase", rootCmd.PersistentFlags().Lookup("projectbase")) - viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper")) - viper.SetDefault("author", "NAME HERE ") - viper.SetDefault("license", "apache") -} - -func initConfig() { - // Don't forget to read config either from cfgFile or from home directory! - if cfgFile != "" { - // Use config file from the flag. - viper.SetConfigFile(cfgFile) - } else { - // Find home directory. - home, err := homedir.Dir() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // Search config in home directory with name ".cobra" (without extension). - viper.AddConfigPath(home) - viper.SetConfigName(".cobra") - } - - if err := viper.ReadInConfig(); err != nil { - fmt.Println("Can't read config:", err) - os.Exit(1) - } -} -``` - -### Create your main.go - -With the root command you need to have your main function execute it. -Execute should be run on the root for clarity, though it can be called on any command. - -In a Cobra app, typically the main.go file is very bare. It serves, one purpose, to initialize Cobra. - -```go -package main - -import ( - "{pathToYourApp}/cmd" -) - -func main() { - cmd.Execute() -} -``` - -### Create additional commands - -Additional commands can be defined and typically are each given their own file -inside of the cmd/ directory. - -If you wanted to create a version command you would create cmd/version.go and -populate it with the following: - -```go -package cmd - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -func init() { - rootCmd.AddCommand(versionCmd) -} - -var versionCmd = &cobra.Command{ - Use: "version", - Short: "Print the version number of Hugo", - Long: `All software has versions. This is Hugo's`, - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("Hugo Static Site Generator v0.9 -- HEAD") - }, -} -``` - -## Working with Flags - -Flags provide modifiers to control how the action command operates. - -### Assign flags to a command - -Since the flags are defined and used in different locations, we need to -define a variable outside with the correct scope to assign the flag to -work with. - -```go -var Verbose bool -var Source string -``` - -There are two different approaches to assign a flag. - -### Persistent Flags - -A flag can be 'persistent' meaning that this flag will be available to the -command it's assigned to as well as every command under that command. For -global flags, assign a flag as a persistent flag on the root. - -```go -rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output") -``` - -### Local Flags - -A flag can also be assigned locally which will only apply to that specific command. - -```go -localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from") -``` - -### Local Flag on Parent Commands - -By default Cobra only parses local flags on the target command, any local flags on -parent commands are ignored. By enabling `Command.TraverseChildren` Cobra will -parse local flags on each command before executing the target command. - -```go -command := cobra.Command{ - Use: "print [OPTIONS] [COMMANDS]", - TraverseChildren: true, -} -``` - -### Bind Flags with Config - -You can also bind your flags with [viper](https://github.com/spf13/viper): -```go -var author string - -func init() { - rootCmd.PersistentFlags().StringVar(&author, "author", "YOUR NAME", "Author name for copyright attribution") - viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) -} -``` - -In this example the persistent flag `author` is bound with `viper`. -**Note**, that the variable `author` will not be set to the value from config, -when the `--author` flag is not provided by user. - -More in [viper documentation](https://github.com/spf13/viper#working-with-flags). - -### Required flags - -Flags are optional by default. If instead you wish your command to report an error -when a flag has not been set, mark it as required: -```go -rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)") -rootCmd.MarkFlagRequired("region") -``` - -## Positional and Custom Arguments - -Validation of positional arguments can be specified using the `Args` field -of `Command`. - -The following validators are built in: - -- `NoArgs` - the command will report an error if there are any positional args. -- `ArbitraryArgs` - the command will accept any args. -- `OnlyValidArgs` - the command will report an error if there are any positional args that are not in the `ValidArgs` field of `Command`. -- `MinimumNArgs(int)` - the command will report an error if there are not at least N positional args. -- `MaximumNArgs(int)` - the command will report an error if there are more than N positional args. -- `ExactArgs(int)` - the command will report an error if there are not exactly N positional args. -- `ExactValidArgs(int)` - the command will report an error if there are not exactly N positional args OR if there are any positional args that are not in the `ValidArgs` field of `Command` -- `RangeArgs(min, max)` - the command will report an error if the number of args is not between the minimum and maximum number of expected args. - -An example of setting the custom validator: - -```go -var cmd = &cobra.Command{ - Short: "hello", - Args: func(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return errors.New("requires a color argument") - } - if myapp.IsValidColor(args[0]) { - return nil - } - return fmt.Errorf("invalid color specified: %s", args[0]) - }, - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("Hello, World!") - }, -} -``` - -## Example - -In the example below, we have defined three commands. Two are at the top level -and one (cmdTimes) is a child of one of the top commands. In this case the root -is not executable meaning that a subcommand is required. This is accomplished -by not providing a 'Run' for the 'rootCmd'. - -We have only defined one flag for a single command. - -More documentation about flags is available at https://github.com/spf13/pflag - -```go -package main - -import ( - "fmt" - "strings" - - "github.com/spf13/cobra" -) - -func main() { - var echoTimes int - - var cmdPrint = &cobra.Command{ - Use: "print [string to print]", - Short: "Print anything to the screen", - Long: `print is for printing anything back to the screen. -For many years people have printed back to the screen.`, - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("Print: " + strings.Join(args, " ")) - }, - } - - var cmdEcho = &cobra.Command{ - Use: "echo [string to echo]", - Short: "Echo anything to the screen", - Long: `echo is for echoing anything back. -Echo works a lot like print, except it has a child command.`, - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("Print: " + strings.Join(args, " ")) - }, - } - - var cmdTimes = &cobra.Command{ - Use: "times [string to echo]", - Short: "Echo anything to the screen more times", - Long: `echo things multiple times back to the user by providing -a count and a string.`, - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - for i := 0; i < echoTimes; i++ { - fmt.Println("Echo: " + strings.Join(args, " ")) - } - }, - } - - cmdTimes.Flags().IntVarP(&echoTimes, "times", "t", 1, "times to echo the input") - - var rootCmd = &cobra.Command{Use: "app"} - rootCmd.AddCommand(cmdPrint, cmdEcho) - cmdEcho.AddCommand(cmdTimes) - rootCmd.Execute() -} -``` - -For a more complete example of a larger application, please checkout [Hugo](http://gohugo.io/). - -## Help Command - -Cobra automatically adds a help command to your application when you have subcommands. -This will be called when a user runs 'app help'. Additionally, help will also -support all other commands as input. Say, for instance, you have a command called -'create' without any additional configuration; Cobra will work when 'app help -create' is called. Every command will automatically have the '--help' flag added. - -### Example - -The following output is automatically generated by Cobra. Nothing beyond the -command and flag definitions are needed. - - $ cobra help - - Cobra is a CLI library for Go that empowers applications. - This application is a tool to generate the needed files - to quickly create a Cobra application. - - Usage: - cobra [command] - - Available Commands: - add Add a command to a Cobra Application - help Help about any command - init Initialize a Cobra Application - - Flags: - -a, --author string author name for copyright attribution (default "YOUR NAME") - --config string config file (default is $HOME/.cobra.yaml) - -h, --help help for cobra - -l, --license string name of license for the project - --viper use Viper for configuration (default true) - - Use "cobra [command] --help" for more information about a command. - - -Help is just a command like any other. There is no special logic or behavior -around it. In fact, you can provide your own if you want. - -### Defining your own help - -You can provide your own Help command or your own template for the default command to use -with following functions: - -```go -cmd.SetHelpCommand(cmd *Command) -cmd.SetHelpFunc(f func(*Command, []string)) -cmd.SetHelpTemplate(s string) -``` - -The latter two will also apply to any children commands. - -## Usage Message - -When the user provides an invalid flag or invalid command, Cobra responds by -showing the user the 'usage'. - -### Example -You may recognize this from the help above. That's because the default help -embeds the usage as part of its output. - - $ cobra --invalid - Error: unknown flag: --invalid - Usage: - cobra [command] - - Available Commands: - add Add a command to a Cobra Application - help Help about any command - init Initialize a Cobra Application - - Flags: - -a, --author string author name for copyright attribution (default "YOUR NAME") - --config string config file (default is $HOME/.cobra.yaml) - -h, --help help for cobra - -l, --license string name of license for the project - --viper use Viper for configuration (default true) - - Use "cobra [command] --help" for more information about a command. - -### Defining your own usage -You can provide your own usage function or template for Cobra to use. -Like help, the function and template are overridable through public methods: - -```go -cmd.SetUsageFunc(f func(*Command) error) -cmd.SetUsageTemplate(s string) -``` - -## Version Flag - -Cobra adds a top-level '--version' flag if the Version field is set on the root command. -Running an application with the '--version' flag will print the version to stdout using -the version template. The template can be customized using the -`cmd.SetVersionTemplate(s string)` function. - -## PreRun and PostRun Hooks - -It is possible to run functions before or after the main `Run` function of your command. The `PersistentPreRun` and `PreRun` functions will be executed before `Run`. `PersistentPostRun` and `PostRun` will be executed after `Run`. The `Persistent*Run` functions will be inherited by children if they do not declare their own. These functions are run in the following order: - -- `PersistentPreRun` -- `PreRun` -- `Run` -- `PostRun` -- `PersistentPostRun` - -An example of two commands which use all of these features is below. When the subcommand is executed, it will run the root command's `PersistentPreRun` but not the root command's `PersistentPostRun`: - -```go -package main - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -func main() { - - var rootCmd = &cobra.Command{ - Use: "root [sub]", - Short: "My root command", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd PersistentPreRun with args: %v\n", args) - }, - PreRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd PreRun with args: %v\n", args) - }, - Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd Run with args: %v\n", args) - }, - PostRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd PostRun with args: %v\n", args) - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd PersistentPostRun with args: %v\n", args) - }, - } - - var subCmd = &cobra.Command{ - Use: "sub [no options!]", - Short: "My subcommand", - PreRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside subCmd PreRun with args: %v\n", args) - }, - Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside subCmd Run with args: %v\n", args) - }, - PostRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside subCmd PostRun with args: %v\n", args) - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside subCmd PersistentPostRun with args: %v\n", args) - }, - } - - rootCmd.AddCommand(subCmd) - - rootCmd.SetArgs([]string{""}) - rootCmd.Execute() - fmt.Println() - rootCmd.SetArgs([]string{"sub", "arg1", "arg2"}) - rootCmd.Execute() -} -``` - -Output: -``` -Inside rootCmd PersistentPreRun with args: [] -Inside rootCmd PreRun with args: [] -Inside rootCmd Run with args: [] -Inside rootCmd PostRun with args: [] -Inside rootCmd PersistentPostRun with args: [] - -Inside rootCmd PersistentPreRun with args: [arg1 arg2] -Inside subCmd PreRun with args: [arg1 arg2] -Inside subCmd Run with args: [arg1 arg2] -Inside subCmd PostRun with args: [arg1 arg2] -Inside subCmd PersistentPostRun with args: [arg1 arg2] -``` - -## Suggestions when "unknown command" happens - -Cobra will print automatic suggestions when "unknown command" errors happen. This allows Cobra to behave similarly to the `git` command when a typo happens. For example: - -``` -$ hugo srever -Error: unknown command "srever" for "hugo" - -Did you mean this? - server - -Run 'hugo --help' for usage. -``` - -Suggestions are automatic based on every subcommand registered and use an implementation of [Levenshtein distance](http://en.wikipedia.org/wiki/Levenshtein_distance). Every registered command that matches a minimum distance of 2 (ignoring case) will be displayed as a suggestion. - -If you need to disable suggestions or tweak the string distance in your command, use: - -```go -command.DisableSuggestions = true -``` - -or - -```go -command.SuggestionsMinimumDistance = 1 -``` - -You can also explicitly set names for which a given command will be suggested using the `SuggestFor` attribute. This allows suggestions for strings that are not close in terms of string distance, but makes sense in your set of commands and for some which you don't want aliases. Example: - -``` -$ kubectl remove -Error: unknown command "remove" for "kubectl" - -Did you mean this? - delete - -Run 'kubectl help' for usage. -``` - -## Generating documentation for your command - -Cobra can generate documentation based on subcommands, flags, etc. in the following formats: - -- [Markdown](doc/md_docs.md) -- [ReStructured Text](doc/rest_docs.md) -- [Man Page](doc/man_docs.md) - -## Generating bash completions - -Cobra can generate a bash-completion file. If you add more information to your command, these completions can be amazingly powerful and flexible. Read more about it in [Bash Completions](bash_completions.md). - -## Generating zsh completions - -Cobra can generate zsh-completion file. Read more about it in -[Zsh Completions](zsh_completions.md). - -# Contributing - -1. Fork it -2. Download your fork to your PC (`git clone https://github.com/your_username/cobra && cd cobra`) -3. Create your feature branch (`git checkout -b my-new-feature`) -4. Make changes and add them (`git add .`) -5. Commit your changes (`git commit -m 'Add some feature'`) -6. Push to the branch (`git push origin my-new-feature`) -7. Create new pull request - -# License - -Cobra is released under the Apache 2.0 license. See [LICENSE.txt](https://github.com/spf13/cobra/blob/master/LICENSE.txt) diff --git a/vendor/github.com/spf13/cobra/bash_completions.md b/vendor/github.com/spf13/cobra/bash_completions.md deleted file mode 100644 index 4ac61ee1..00000000 --- a/vendor/github.com/spf13/cobra/bash_completions.md +++ /dev/null @@ -1,256 +0,0 @@ -# Generating Bash Completions For Your Own cobra.Command - -If you are using the generator you can create a completion command by running - -```bash -cobra add completion -``` - -Update the help text show how to install the bash_completion Linux show here [Kubectl docs show mac options](https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion) - -Writing the shell script to stdout allows the most flexible use. - -```go -// completionCmd represents the completion command -var completionCmd = &cobra.Command{ - Use: "completion", - Short: "Generates bash completion scripts", - Long: `To load completion run - -. <(bitbucket completion) - -To configure your bash shell to load completions for each session add to your bashrc - -# ~/.bashrc or ~/.profile -. <(bitbucket completion) -`, - Run: func(cmd *cobra.Command, args []string) { - rootCmd.GenBashCompletion(os.Stdout); - }, -} -``` - -**Note:** The cobra generator may include messages printed to stdout for example if the config file is loaded, this will break the auto complete script - - -## Example from kubectl - -Generating bash completions from a cobra command is incredibly easy. An actual program which does so for the kubernetes kubectl binary is as follows: - -```go -package main - -import ( - "io/ioutil" - "os" - - "k8s.io/kubernetes/pkg/kubectl/cmd" - "k8s.io/kubernetes/pkg/kubectl/cmd/util" -) - -func main() { - kubectl := cmd.NewKubectlCommand(util.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) - kubectl.GenBashCompletionFile("out.sh") -} -``` - -`out.sh` will get you completions of subcommands and flags. Copy it to `/etc/bash_completion.d/` as described [here](https://debian-administration.org/article/316/An_introduction_to_bash_completion_part_1) and reset your terminal to use autocompletion. If you make additional annotations to your code, you can get even more intelligent and flexible behavior. - -## Creating your own custom functions - -Some more actual code that works in kubernetes: - -```bash -const ( - bash_completion_func = `__kubectl_parse_get() -{ - local kubectl_output out - if kubectl_output=$(kubectl get --no-headers "$1" 2>/dev/null); then - out=($(echo "${kubectl_output}" | awk '{print $1}')) - COMPREPLY=( $( compgen -W "${out[*]}" -- "$cur" ) ) - fi -} - -__kubectl_get_resource() -{ - if [[ ${#nouns[@]} -eq 0 ]]; then - return 1 - fi - __kubectl_parse_get ${nouns[${#nouns[@]} -1]} - if [[ $? -eq 0 ]]; then - return 0 - fi -} - -__kubectl_custom_func() { - case ${last_command} in - kubectl_get | kubectl_describe | kubectl_delete | kubectl_stop) - __kubectl_get_resource - return - ;; - *) - ;; - esac -} -`) -``` - -And then I set that in my command definition: - -```go -cmds := &cobra.Command{ - Use: "kubectl", - Short: "kubectl controls the Kubernetes cluster manager", - Long: `kubectl controls the Kubernetes cluster manager. - -Find more information at https://github.com/GoogleCloudPlatform/kubernetes.`, - Run: runHelp, - BashCompletionFunction: bash_completion_func, -} -``` - -The `BashCompletionFunction` option is really only valid/useful on the root command. Doing the above will cause `__kubectl_custom_func()` (`___custom_func()`) to be called when the built in processor was unable to find a solution. In the case of kubernetes a valid command might look something like `kubectl get pod [mypod]`. If you type `kubectl get pod [tab][tab]` the `__kubectl_customc_func()` will run because the cobra.Command only understood "kubectl" and "get." `__kubectl_custom_func()` will see that the cobra.Command is "kubectl_get" and will thus call another helper `__kubectl_get_resource()`. `__kubectl_get_resource` will look at the 'nouns' collected. In our example the only noun will be `pod`. So it will call `__kubectl_parse_get pod`. `__kubectl_parse_get` will actually call out to kubernetes and get any pods. It will then set `COMPREPLY` to valid pods! - -## Have the completions code complete your 'nouns' - -In the above example "pod" was assumed to already be typed. But if you want `kubectl get [tab][tab]` to show a list of valid "nouns" you have to set them. Simplified code from `kubectl get` looks like: - -```go -validArgs []string = { "pod", "node", "service", "replicationcontroller" } - -cmd := &cobra.Command{ - Use: "get [(-o|--output=)json|yaml|template|...] (RESOURCE [NAME] | RESOURCE/NAME ...)", - Short: "Display one or many resources", - Long: get_long, - Example: get_example, - Run: func(cmd *cobra.Command, args []string) { - err := RunGet(f, out, cmd, args) - util.CheckErr(err) - }, - ValidArgs: validArgs, -} -``` - -Notice we put the "ValidArgs" on the "get" subcommand. Doing so will give results like - -```bash -# kubectl get [tab][tab] -node pod replicationcontroller service -``` - -## Plural form and shortcuts for nouns - -If your nouns have a number of aliases, you can define them alongside `ValidArgs` using `ArgAliases`: - -```go -argAliases []string = { "pods", "nodes", "services", "svc", "replicationcontrollers", "rc" } - -cmd := &cobra.Command{ - ... - ValidArgs: validArgs, - ArgAliases: argAliases -} -``` - -The aliases are not shown to the user on tab completion, but they are accepted as valid nouns by -the completion algorithm if entered manually, e.g. in: - -```bash -# kubectl get rc [tab][tab] -backend frontend database -``` - -Note that without declaring `rc` as an alias, the completion algorithm would show the list of nouns -in this example again instead of the replication controllers. - -## Mark flags as required - -Most of the time completions will only show subcommands. But if a flag is required to make a subcommand work, you probably want it to show up when the user types [tab][tab]. Marking a flag as 'Required' is incredibly easy. - -```go -cmd.MarkFlagRequired("pod") -cmd.MarkFlagRequired("container") -``` - -and you'll get something like - -```bash -# kubectl exec [tab][tab][tab] --c --container= -p --pod= -``` - -# Specify valid filename extensions for flags that take a filename - -In this example we use --filename= and expect to get a json or yaml file as the argument. To make this easier we annotate the --filename flag with valid filename extensions. - -```go - annotations := []string{"json", "yaml", "yml"} - annotation := make(map[string][]string) - annotation[cobra.BashCompFilenameExt] = annotations - - flag := &pflag.Flag{ - Name: "filename", - Shorthand: "f", - Usage: usage, - Value: value, - DefValue: value.String(), - Annotations: annotation, - } - cmd.Flags().AddFlag(flag) -``` - -Now when you run a command with this filename flag you'll get something like - -```bash -# kubectl create -f -test/ example/ rpmbuild/ -hello.yml test.json -``` - -So while there are many other files in the CWD it only shows me subdirs and those with valid extensions. - -# Specify custom flag completion - -Similar to the filename completion and filtering using cobra.BashCompFilenameExt, you can specify -a custom flag completion function with cobra.BashCompCustom: - -```go - annotation := make(map[string][]string) - annotation[cobra.BashCompCustom] = []string{"__kubectl_get_namespaces"} - - flag := &pflag.Flag{ - Name: "namespace", - Usage: usage, - Annotations: annotation, - } - cmd.Flags().AddFlag(flag) -``` - -In addition add the `__handle_namespace_flag` implementation in the `BashCompletionFunction` -value, e.g.: - -```bash -__kubectl_get_namespaces() -{ - local template - template="{{ range .items }}{{ .metadata.name }} {{ end }}" - local kubectl_out - if kubectl_out=$(kubectl get -o template --template="${template}" namespace 2>/dev/null); then - COMPREPLY=( $( compgen -W "${kubectl_out}[*]" -- "$cur" ) ) - fi -} -``` -# Using bash aliases for commands - -You can also configure the `bash aliases` for the commands and they will also support completions. - -```bash -alias aliasname=origcommand -complete -o default -F __start_origcommand aliasname - -# and now when you run `aliasname` completion will make -# suggestions as it did for `origcommand`. - -$) aliasname -completion firstcommand secondcommand -``` diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_agpl.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_agpl.go deleted file mode 100644 index bc22e973..00000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_agpl.go +++ /dev/null @@ -1,683 +0,0 @@ -package cmd - -func initAgpl() { - Licenses["agpl"] = License{ - Name: "GNU Affero General Public License", - PossibleMatches: []string{"agpl", "affero gpl", "gnu agpl"}, - Header: ` -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see .`, - Text: ` GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_apache_2.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_apache_2.go deleted file mode 100644 index 38393d54..00000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_apache_2.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initApache2() { - Licenses["apache"] = License{ - Name: "Apache 2.0", - PossibleMatches: []string{"apache", "apache20", "apache 2.0", "apache2.0", "apache-2.0"}, - Header: ` -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.`, - Text: ` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_2.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_2.go deleted file mode 100644 index 4a847e04..00000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_2.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initBsdClause2() { - Licenses["freebsd"] = License{ - Name: "Simplified BSD License", - PossibleMatches: []string{"freebsd", "simpbsd", "simple bsd", "2-clause bsd", - "2 clause bsd", "simplified bsd license"}, - Header: `All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE.`, - Text: `{{ .copyright }} -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_3.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_3.go deleted file mode 100644 index c7476b31..00000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_bsd_clause_3.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initBsdClause3() { - Licenses["bsd"] = License{ - Name: "NewBSD", - PossibleMatches: []string{"bsd", "newbsd", "3 clause bsd", "3-clause bsd"}, - Header: `All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE.`, - Text: `{{ .copyright }} -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_2.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_2.go deleted file mode 100644 index 03e05b3a..00000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_2.go +++ /dev/null @@ -1,376 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initGpl2() { - Licenses["gpl2"] = License{ - Name: "GNU General Public License 2.0", - PossibleMatches: []string{"gpl2", "gnu gpl2", "gplv2"}, - Header: ` -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with this program. If not, see .`, - Text: ` GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type 'show c' for details. - -The hypothetical commands 'show w' and 'show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than 'show w' and 'show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - 'Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_3.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_3.go deleted file mode 100644 index ce07679c..00000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_gpl_3.go +++ /dev/null @@ -1,711 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initGpl3() { - Licenses["gpl3"] = License{ - Name: "GNU General Public License 3.0", - PossibleMatches: []string{"gpl3", "gplv3", "gpl", "gnu gpl3", "gnu gpl"}, - Header: ` -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see .`, - Text: ` GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type 'show c' for details. - -The hypothetical commands 'show w' and 'show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_lgpl.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_lgpl.go deleted file mode 100644 index 0f8b96ca..00000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_lgpl.go +++ /dev/null @@ -1,186 +0,0 @@ -package cmd - -func initLgpl() { - Licenses["lgpl"] = License{ - Name: "GNU Lesser General Public License", - PossibleMatches: []string{"lgpl", "lesser gpl", "gnu lgpl"}, - Header: ` -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with this program. If not, see .`, - Text: ` GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library.`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/license_mit.go b/vendor/github.com/spf13/cobra/cobra/cmd/license_mit.go deleted file mode 100644 index bd2d0c4f..00000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/license_mit.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -func initMit() { - Licenses["mit"] = License{ - Name: "MIT License", - PossibleMatches: []string{"mit"}, - Header: ` -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.`, - Text: `The MIT License (MIT) - -{{ .copyright }} - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -`, - } -} diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/licenses.go b/vendor/github.com/spf13/cobra/cobra/cmd/licenses.go deleted file mode 100644 index a070134d..00000000 --- a/vendor/github.com/spf13/cobra/cobra/cmd/licenses.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright © 2015 Steve Francia . -// -// 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. - -// Parts inspired by https://github.com/ryanuber/go-license - -package cmd - -import ( - "strings" - "time" - - "github.com/spf13/viper" -) - -// Licenses contains all possible licenses a user can choose from. -var Licenses = make(map[string]License) - -// License represents a software license agreement, containing the Name of -// the license, its possible matches (on the command line as given to cobra), -// the header to be used with each file on the file's creating, and the text -// of the license -type License struct { - Name string // The type of license in use - PossibleMatches []string // Similar names to guess - Text string // License text data - Header string // License header for source files -} - -func init() { - // Allows a user to not use a license. - Licenses["none"] = License{"None", []string{"none", "false"}, "", ""} - - initApache2() - initMit() - initBsdClause3() - initBsdClause2() - initGpl2() - initGpl3() - initLgpl() - initAgpl() -} - -// getLicense returns license specified by user in flag or in config. -// If user didn't specify the license, it returns Apache License 2.0. -// -// TODO: Inspect project for existing license -func getLicense() License { - // If explicitly flagged, use that. - if userLicense != "" { - return findLicense(userLicense) - } - - // If user wants to have custom license, use that. - if viper.IsSet("license.header") || viper.IsSet("license.text") { - return License{Header: viper.GetString("license.header"), - Text: viper.GetString("license.text")} - } - - // If user wants to have built-in license, use that. - if viper.IsSet("license") { - return findLicense(viper.GetString("license")) - } - - // If user didn't set any license, use Apache 2.0 by default. - return Licenses["apache"] -} - -func copyrightLine() string { - author := viper.GetString("author") - - year := viper.GetString("year") // For tests. - if year == "" { - year = time.Now().Format("2006") - } - - return "Copyright © " + year + " " + author -} - -// findLicense looks for License object of built-in licenses. -// If it didn't find license, then the app will be terminated and -// error will be printed. -func findLicense(name string) License { - found := matchLicense(name) - if found == "" { - er("unknown license: " + name) - } - return Licenses[found] -} - -// matchLicense compares the given a license name -// to PossibleMatches of all built-in licenses. -// It returns blank string, if name is blank string or it didn't find -// then appropriate match to name. -func matchLicense(name string) string { - if name == "" { - return "" - } - - for key, lic := range Licenses { - for _, match := range lic.PossibleMatches { - if strings.EqualFold(name, match) { - return key - } - } - } - - return "" -} diff --git a/vendor/github.com/spf13/cobra/go.mod b/vendor/github.com/spf13/cobra/go.mod deleted file mode 100644 index 9a9eb65a..00000000 --- a/vendor/github.com/spf13/cobra/go.mod +++ /dev/null @@ -1,13 +0,0 @@ -module github.com/spf13/cobra - -go 1.12 - -require ( - github.com/BurntSushi/toml v0.3.1 // indirect - github.com/cpuguy83/go-md2man v1.0.10 - github.com/inconshreveable/mousetrap v1.0.0 - github.com/mitchellh/go-homedir v1.1.0 - github.com/spf13/pflag v1.0.3 - github.com/spf13/viper v1.3.2 - gopkg.in/yaml.v2 v2.2.2 -) diff --git a/vendor/github.com/spf13/cobra/go.sum b/vendor/github.com/spf13/cobra/go.sum deleted file mode 100644 index 9761f4d0..00000000 --- a/vendor/github.com/spf13/cobra/go.sum +++ /dev/null @@ -1,51 +0,0 @@ -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -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 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -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/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/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -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/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/spf13/cobra/powershell_completions.md b/vendor/github.com/spf13/cobra/powershell_completions.md deleted file mode 100644 index afed8024..00000000 --- a/vendor/github.com/spf13/cobra/powershell_completions.md +++ /dev/null @@ -1,14 +0,0 @@ -# Generating PowerShell Completions For Your Own cobra.Command - -Cobra can generate PowerShell completion scripts. Users need PowerShell version 5.0 or above, which comes with Windows 10 and can be downloaded separately for Windows 7 or 8.1. They can then write the completions to a file and source this file from their PowerShell profile, which is referenced by the `$Profile` environment variable. See `Get-Help about_Profiles` for more info about PowerShell profiles. - -# What's supported - -- Completion for subcommands using their `.Short` description -- Completion for non-hidden flags using their `.Name` and `.Shorthand` - -# What's not yet supported - -- Command aliases -- Required, filename or custom flags (they will work like normal flags) -- Custom completion scripts diff --git a/vendor/github.com/spf13/cobra/zsh_completions.md b/vendor/github.com/spf13/cobra/zsh_completions.md deleted file mode 100644 index df9c2eac..00000000 --- a/vendor/github.com/spf13/cobra/zsh_completions.md +++ /dev/null @@ -1,39 +0,0 @@ -## Generating Zsh Completion for your cobra.Command - -Cobra supports native Zsh completion generated from the root `cobra.Command`. -The generated completion script should be put somewhere in your `$fpath` named -`_`. - -### What's Supported - -* Completion for all non-hidden subcommands using their `.Short` description. -* Completion for all non-hidden flags using the following rules: - * Filename completion works by marking the flag with `cmd.MarkFlagFilename...` - family of commands. - * The requirement for argument to the flag is decided by the `.NoOptDefVal` - flag value - if it's empty then completion will expect an argument. - * Flags of one of the various `*Array` and `*Slice` types supports multiple - specifications (with or without argument depending on the specific type). -* Completion of positional arguments using the following rules: - * Argument position for all options below starts at `1`. If argument position - `0` is requested it will raise an error. - * Use `command.MarkZshCompPositionalArgumentFile` to complete filenames. Glob - patterns (e.g. `"*.log"`) are optional - if not specified it will offer to - complete all file types. - * Use `command.MarkZshCompPositionalArgumentWords` to offer specific words for - completion. At least one word is required. - * It's possible to specify completion for some arguments and leave some - unspecified (e.g. offer words for second argument but nothing for first - argument). This will cause no completion for first argument but words - completion for second argument. - * If no argument completion was specified for 1st argument (but optionally was - specified for 2nd) and the command has `ValidArgs` it will be used as - completion options for 1st argument. - * Argument completions only offered for commands with no subcommands. - -### What's not yet Supported - -* Custom completion scripts are not supported yet (We should probably create zsh - specific one, doesn't make sense to re-use the bash one as the functions will - be different). -* Whatever other feature you're looking for and doesn't exist :) diff --git a/vendor/github.com/spf13/pflag/.gitignore b/vendor/github.com/spf13/pflag/.gitignore deleted file mode 100644 index c3da2901..00000000 --- a/vendor/github.com/spf13/pflag/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.idea/* - diff --git a/vendor/github.com/spf13/pflag/.travis.yml b/vendor/github.com/spf13/pflag/.travis.yml deleted file mode 100644 index 00d04cb9..00000000 --- a/vendor/github.com/spf13/pflag/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -sudo: false - -language: go - -go: - - 1.9.x - - 1.10.x - - 1.11.x - - tip - -matrix: - allow_failures: - - go: tip - -install: - - go get golang.org/x/lint/golint - - export PATH=$GOPATH/bin:$PATH - - go install ./... - -script: - - verify/all.sh -v - - go test ./... diff --git a/vendor/github.com/spf13/pflag/README.md b/vendor/github.com/spf13/pflag/README.md deleted file mode 100644 index 7eacc5bd..00000000 --- a/vendor/github.com/spf13/pflag/README.md +++ /dev/null @@ -1,296 +0,0 @@ -[![Build Status](https://travis-ci.org/spf13/pflag.svg?branch=master)](https://travis-ci.org/spf13/pflag) -[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/pflag)](https://goreportcard.com/report/github.com/spf13/pflag) -[![GoDoc](https://godoc.org/github.com/spf13/pflag?status.svg)](https://godoc.org/github.com/spf13/pflag) - -## Description - -pflag is a drop-in replacement for Go's flag package, implementing -POSIX/GNU-style --flags. - -pflag is compatible with the [GNU extensions to the POSIX recommendations -for command-line options][1]. For a more precise description, see the -"Command-line flag syntax" section below. - -[1]: http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html - -pflag is available under the same style of BSD license as the Go language, -which can be found in the LICENSE file. - -## Installation - -pflag is available using the standard `go get` command. - -Install by running: - - go get github.com/spf13/pflag - -Run tests by running: - - go test github.com/spf13/pflag - -## Usage - -pflag is a drop-in replacement of Go's native flag package. If you import -pflag under the name "flag" then all code should continue to function -with no changes. - -``` go -import flag "github.com/spf13/pflag" -``` - -There is one exception to this: if you directly instantiate the Flag struct -there is one more field "Shorthand" that you will need to set. -Most code never instantiates this struct directly, and instead uses -functions such as String(), BoolVar(), and Var(), and is therefore -unaffected. - -Define flags using flag.String(), Bool(), Int(), etc. - -This declares an integer flag, -flagname, stored in the pointer ip, with type *int. - -``` go -var ip *int = flag.Int("flagname", 1234, "help message for flagname") -``` - -If you like, you can bind the flag to a variable using the Var() functions. - -``` go -var flagvar int -func init() { - flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") -} -``` - -Or you can create custom flags that satisfy the Value interface (with -pointer receivers) and couple them to flag parsing by - -``` go -flag.Var(&flagVal, "name", "help message for flagname") -``` - -For such flags, the default value is just the initial value of the variable. - -After all flags are defined, call - -``` go -flag.Parse() -``` - -to parse the command line into the defined flags. - -Flags may then be used directly. If you're using the flags themselves, -they are all pointers; if you bind to variables, they're values. - -``` go -fmt.Println("ip has value ", *ip) -fmt.Println("flagvar has value ", flagvar) -``` - -There are helper functions available to get the value stored in a Flag if you have a FlagSet but find -it difficult to keep up with all of the pointers in your code. -If you have a pflag.FlagSet with a flag called 'flagname' of type int you -can use GetInt() to get the int value. But notice that 'flagname' must exist -and it must be an int. GetString("flagname") will fail. - -``` go -i, err := flagset.GetInt("flagname") -``` - -After parsing, the arguments after the flag are available as the -slice flag.Args() or individually as flag.Arg(i). -The arguments are indexed from 0 through flag.NArg()-1. - -The pflag package also defines some new functions that are not in flag, -that give one-letter shorthands for flags. You can use these by appending -'P' to the name of any function that defines a flag. - -``` go -var ip = flag.IntP("flagname", "f", 1234, "help message") -var flagvar bool -func init() { - flag.BoolVarP(&flagvar, "boolname", "b", true, "help message") -} -flag.VarP(&flagVal, "varname", "v", "help message") -``` - -Shorthand letters can be used with single dashes on the command line. -Boolean shorthand flags can be combined with other shorthand flags. - -The default set of command-line flags is controlled by -top-level functions. The FlagSet type allows one to define -independent sets of flags, such as to implement subcommands -in a command-line interface. The methods of FlagSet are -analogous to the top-level functions for the command-line -flag set. - -## Setting no option default values for flags - -After you create a flag it is possible to set the pflag.NoOptDefVal for -the given flag. Doing this changes the meaning of the flag slightly. If -a flag has a NoOptDefVal and the flag is set on the command line without -an option the flag will be set to the NoOptDefVal. For example given: - -``` go -var ip = flag.IntP("flagname", "f", 1234, "help message") -flag.Lookup("flagname").NoOptDefVal = "4321" -``` - -Would result in something like - -| Parsed Arguments | Resulting Value | -| ------------- | ------------- | -| --flagname=1357 | ip=1357 | -| --flagname | ip=4321 | -| [nothing] | ip=1234 | - -## Command line flag syntax - -``` ---flag // boolean flags, or flags with no option default values ---flag x // only on flags without a default value ---flag=x -``` - -Unlike the flag package, a single dash before an option means something -different than a double dash. Single dashes signify a series of shorthand -letters for flags. All but the last shorthand letter must be boolean flags -or a flag with a default value - -``` -// boolean or flags where the 'no option default value' is set --f --f=true --abc -but --b true is INVALID - -// non-boolean and flags without a 'no option default value' --n 1234 --n=1234 --n1234 - -// mixed --abcs "hello" --absd="hello" --abcs1234 -``` - -Flag parsing stops after the terminator "--". Unlike the flag package, -flags can be interspersed with arguments anywhere on the command line -before this terminator. - -Integer flags accept 1234, 0664, 0x1234 and may be negative. -Boolean flags (in their long form) accept 1, 0, t, f, true, false, -TRUE, FALSE, True, False. -Duration flags accept any input valid for time.ParseDuration. - -## Mutating or "Normalizing" Flag names - -It is possible to set a custom flag name 'normalization function.' It allows flag names to be mutated both when created in the code and when used on the command line to some 'normalized' form. The 'normalized' form is used for comparison. Two examples of using the custom normalization func follow. - -**Example #1**: You want -, _, and . in flags to compare the same. aka --my-flag == --my_flag == --my.flag - -``` go -func wordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName { - from := []string{"-", "_"} - to := "." - for _, sep := range from { - name = strings.Replace(name, sep, to, -1) - } - return pflag.NormalizedName(name) -} - -myFlagSet.SetNormalizeFunc(wordSepNormalizeFunc) -``` - -**Example #2**: You want to alias two flags. aka --old-flag-name == --new-flag-name - -``` go -func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName { - switch name { - case "old-flag-name": - name = "new-flag-name" - break - } - return pflag.NormalizedName(name) -} - -myFlagSet.SetNormalizeFunc(aliasNormalizeFunc) -``` - -## Deprecating a flag or its shorthand -It is possible to deprecate a flag, or just its shorthand. Deprecating a flag/shorthand hides it from help text and prints a usage message when the deprecated flag/shorthand is used. - -**Example #1**: You want to deprecate a flag named "badflag" as well as inform the users what flag they should use instead. -```go -// deprecate a flag by specifying its name and a usage message -flags.MarkDeprecated("badflag", "please use --good-flag instead") -``` -This hides "badflag" from help text, and prints `Flag --badflag has been deprecated, please use --good-flag instead` when "badflag" is used. - -**Example #2**: You want to keep a flag name "noshorthandflag" but deprecate its shortname "n". -```go -// deprecate a flag shorthand by specifying its flag name and a usage message -flags.MarkShorthandDeprecated("noshorthandflag", "please use --noshorthandflag only") -``` -This hides the shortname "n" from help text, and prints `Flag shorthand -n has been deprecated, please use --noshorthandflag only` when the shorthand "n" is used. - -Note that usage message is essential here, and it should not be empty. - -## Hidden flags -It is possible to mark a flag as hidden, meaning it will still function as normal, however will not show up in usage/help text. - -**Example**: You have a flag named "secretFlag" that you need for internal use only and don't want it showing up in help text, or for its usage text to be available. -```go -// hide a flag by specifying its name -flags.MarkHidden("secretFlag") -``` - -## Disable sorting of flags -`pflag` allows you to disable sorting of flags for help and usage message. - -**Example**: -```go -flags.BoolP("verbose", "v", false, "verbose output") -flags.String("coolflag", "yeaah", "it's really cool flag") -flags.Int("usefulflag", 777, "sometimes it's very useful") -flags.SortFlags = false -flags.PrintDefaults() -``` -**Output**: -``` - -v, --verbose verbose output - --coolflag string it's really cool flag (default "yeaah") - --usefulflag int sometimes it's very useful (default 777) -``` - - -## Supporting Go flags when using pflag -In order to support flags defined using Go's `flag` package, they must be added to the `pflag` flagset. This is usually necessary -to support flags defined by third-party dependencies (e.g. `golang/glog`). - -**Example**: You want to add the Go flags to the `CommandLine` flagset -```go -import ( - goflag "flag" - flag "github.com/spf13/pflag" -) - -var ip *int = flag.Int("flagname", 1234, "help message for flagname") - -func main() { - flag.CommandLine.AddGoFlagSet(goflag.CommandLine) - flag.Parse() -} -``` - -## More info - -You can see the full reference documentation of the pflag package -[at godoc.org][3], or through go's standard documentation system by -running `godoc -http=:6060` and browsing to -[http://localhost:6060/pkg/github.com/spf13/pflag][2] after -installation. - -[2]: http://localhost:6060/pkg/github.com/spf13/pflag -[3]: http://godoc.org/github.com/spf13/pflag diff --git a/vendor/github.com/spf13/pflag/go.mod b/vendor/github.com/spf13/pflag/go.mod deleted file mode 100644 index b2287eec..00000000 --- a/vendor/github.com/spf13/pflag/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/spf13/pflag - -go 1.12 diff --git a/vendor/github.com/stretchr/objx/.codeclimate.yml b/vendor/github.com/stretchr/objx/.codeclimate.yml deleted file mode 100644 index 559fa399..00000000 --- a/vendor/github.com/stretchr/objx/.codeclimate.yml +++ /dev/null @@ -1,21 +0,0 @@ -engines: - gofmt: - enabled: true - golint: - enabled: true - govet: - enabled: true - -exclude_patterns: -- ".github/" -- "vendor/" -- "codegen/" -- "*.yml" -- ".*.yml" -- "*.md" -- "Gopkg.*" -- "doc.go" -- "type_specific_codegen_test.go" -- "type_specific_codegen.go" -- ".gitignore" -- "LICENSE" diff --git a/vendor/github.com/stretchr/objx/.gitignore b/vendor/github.com/stretchr/objx/.gitignore deleted file mode 100644 index ea58090b..00000000 --- a/vendor/github.com/stretchr/objx/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -# Binaries for programs and plugins -*.exe -*.dll -*.so -*.dylib - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out diff --git a/vendor/github.com/stretchr/objx/.travis.yml b/vendor/github.com/stretchr/objx/.travis.yml deleted file mode 100644 index cde6eb2a..00000000 --- a/vendor/github.com/stretchr/objx/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -language: go -go: - - "1.10.x" - - "1.11.x" - - "1.12.x" - - master - -matrix: - allow_failures: - - go: master -fast_finish: true - -env: - global: - - CC_TEST_REPORTER_ID=68feaa3410049ce73e145287acbcdacc525087a30627f96f04e579e75bd71c00 - -before_script: - - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter - - chmod +x ./cc-test-reporter - - ./cc-test-reporter before-build - -install: - - curl -sL https://taskfile.dev/install.sh | sh - -script: - - diff -u <(echo -n) <(./bin/task lint) - - ./bin/task test-coverage - -after_script: - - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT diff --git a/vendor/github.com/stretchr/objx/README.md b/vendor/github.com/stretchr/objx/README.md deleted file mode 100644 index 246660b2..00000000 --- a/vendor/github.com/stretchr/objx/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# Objx -[![Build Status](https://travis-ci.org/stretchr/objx.svg?branch=master)](https://travis-ci.org/stretchr/objx) -[![Go Report Card](https://goreportcard.com/badge/github.com/stretchr/objx)](https://goreportcard.com/report/github.com/stretchr/objx) -[![Maintainability](https://api.codeclimate.com/v1/badges/1d64bc6c8474c2074f2b/maintainability)](https://codeclimate.com/github/stretchr/objx/maintainability) -[![Test Coverage](https://api.codeclimate.com/v1/badges/1d64bc6c8474c2074f2b/test_coverage)](https://codeclimate.com/github/stretchr/objx/test_coverage) -[![Sourcegraph](https://sourcegraph.com/github.com/stretchr/objx/-/badge.svg)](https://sourcegraph.com/github.com/stretchr/objx) -[![GoDoc](https://godoc.org/github.com/stretchr/objx?status.svg)](https://godoc.org/github.com/stretchr/objx) - -Objx - Go package for dealing with maps, slices, JSON and other data. - -Get started: - -- Install Objx with [one line of code](#installation), or [update it with another](#staying-up-to-date) -- Check out the API Documentation http://godoc.org/github.com/stretchr/objx - -## Overview -Objx provides the `objx.Map` type, which is a `map[string]interface{}` that exposes a powerful `Get` method (among others) that allows you to easily and quickly get access to data within the map, without having to worry too much about type assertions, missing data, default values etc. - -### Pattern -Objx uses a preditable pattern to make access data from within `map[string]interface{}` easy. Call one of the `objx.` functions to create your `objx.Map` to get going: - - m, err := objx.FromJSON(json) - -NOTE: Any methods or functions with the `Must` prefix will panic if something goes wrong, the rest will be optimistic and try to figure things out without panicking. - -Use `Get` to access the value you're interested in. You can use dot and array -notation too: - - m.Get("places[0].latlng") - -Once you have sought the `Value` you're interested in, you can use the `Is*` methods to determine its type. - - if m.Get("code").IsStr() { // Your code... } - -Or you can just assume the type, and use one of the strong type methods to extract the real value: - - m.Get("code").Int() - -If there's no value there (or if it's the wrong type) then a default value will be returned, or you can be explicit about the default value. - - Get("code").Int(-1) - -If you're dealing with a slice of data as a value, Objx provides many useful methods for iterating, manipulating and selecting that data. You can find out more by exploring the index below. - -### Reading data -A simple example of how to use Objx: - - // Use MustFromJSON to make an objx.Map from some JSON - m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`) - - // Get the details - name := m.Get("name").Str() - age := m.Get("age").Int() - - // Get their nickname (or use their name if they don't have one) - nickname := m.Get("nickname").Str(name) - -### Ranging -Since `objx.Map` is a `map[string]interface{}` you can treat it as such. For example, to `range` the data, do what you would expect: - - m := objx.MustFromJSON(json) - for key, value := range m { - // Your code... - } - -## Installation -To install Objx, use go get: - - go get github.com/stretchr/objx - -### Staying up to date -To update Objx to the latest version, run: - - go get -u github.com/stretchr/objx - -### Supported go versions -We support the lastest three major Go versions, which are 1.10, 1.11 and 1.12 at the moment. - -## Contributing -Please feel free to submit issues, fork the repository and send pull requests! diff --git a/vendor/github.com/stretchr/objx/Taskfile.yml b/vendor/github.com/stretchr/objx/Taskfile.yml deleted file mode 100644 index a749ac54..00000000 --- a/vendor/github.com/stretchr/objx/Taskfile.yml +++ /dev/null @@ -1,30 +0,0 @@ -version: '2' - -env: - GOFLAGS: -mod=vendor - -tasks: - default: - deps: [test] - - lint: - desc: Checks code style - cmds: - - gofmt -d -s *.go - - go vet ./... - silent: true - - lint-fix: - desc: Fixes code style - cmds: - - gofmt -w -s *.go - - test: - desc: Runs go tests - cmds: - - go test -race ./... - - test-coverage: - desc: Runs go tests and calucates test coverage - cmds: - - go test -race -coverprofile=c.out ./... diff --git a/vendor/github.com/stretchr/objx/go.mod b/vendor/github.com/stretchr/objx/go.mod deleted file mode 100644 index 31ec5a7d..00000000 --- a/vendor/github.com/stretchr/objx/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/stretchr/objx - -go 1.12 - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/stretchr/testify v1.3.0 -) diff --git a/vendor/github.com/stretchr/objx/go.sum b/vendor/github.com/stretchr/objx/go.sum deleted file mode 100644 index 4f898415..00000000 --- a/vendor/github.com/stretchr/objx/go.sum +++ /dev/null @@ -1,8 +0,0 @@ -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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl b/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl deleted file mode 100644 index c5cc66f4..00000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -{{.CommentFormat}} -func {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool { - return {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}}) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl b/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl deleted file mode 100644 index 99f9acfb..00000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -{{.CommentWithoutT "a"}} -func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool { - return {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) -} diff --git a/vendor/github.com/stretchr/testify/require/require.go.tmpl b/vendor/github.com/stretchr/testify/require/require.go.tmpl deleted file mode 100644 index d2c38f6f..00000000 --- a/vendor/github.com/stretchr/testify/require/require.go.tmpl +++ /dev/null @@ -1,6 +0,0 @@ -{{.Comment}} -func {{.DocInfo.Name}}(t TestingT, {{.Params}}) { - if !assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { - t.FailNow() - } -} diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl b/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl deleted file mode 100644 index b93569e0..00000000 --- a/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -{{.CommentWithoutT "a"}} -func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) { - {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go index 2f04ee5b..d1b4fca3 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go @@ -7,6 +7,7 @@ package terminal import ( "bytes" "io" + "runtime" "strconv" "sync" "unicode/utf8" @@ -939,6 +940,8 @@ func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { // readPasswordLine reads from reader until it finds \n or io.EOF. // The slice returned does not include the \n. // readPasswordLine also ignores any \r it finds. +// Windows uses \r as end of line. So, on Windows, readPasswordLine +// reads until it finds \r and ignores any \n it finds during processing. func readPasswordLine(reader io.Reader) ([]byte, error) { var buf [1]byte var ret []byte @@ -947,10 +950,20 @@ func readPasswordLine(reader io.Reader) ([]byte, error) { n, err := reader.Read(buf[:]) if n > 0 { switch buf[0] { + case '\b': + if len(ret) > 0 { + ret = ret[:len(ret)-1] + } case '\n': - return ret, nil + if runtime.GOOS != "windows" { + return ret, nil + } + // otherwise ignore \n case '\r': - // remove \r from passwords on Windows + if runtime.GOOS == "windows" { + return ret, nil + } + // otherwise ignore \r default: ret = append(ret, buf[0]) } diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go index 5cfdf8f3..f614e9cb 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go @@ -85,8 +85,8 @@ func ReadPassword(fd int) ([]byte, error) { } old := st - st &^= (windows.ENABLE_ECHO_INPUT) - st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + st &^= (windows.ENABLE_ECHO_INPUT | windows.ENABLE_LINE_INPUT) + st |= (windows.ENABLE_PROCESSED_OUTPUT | windows.ENABLE_PROCESSED_INPUT) if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil { return nil, err } diff --git a/vendor/golang.org/x/sys/unix/.gitignore b/vendor/golang.org/x/sys/unix/.gitignore deleted file mode 100644 index e3e0fc6f..00000000 --- a/vendor/golang.org/x/sys/unix/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -_obj/ -unix.test diff --git a/vendor/golang.org/x/sys/unix/README.md b/vendor/golang.org/x/sys/unix/README.md deleted file mode 100644 index eb2f78ae..00000000 --- a/vendor/golang.org/x/sys/unix/README.md +++ /dev/null @@ -1,173 +0,0 @@ -# Building `sys/unix` - -The sys/unix package provides access to the raw system call interface of the -underlying operating system. See: https://godoc.org/golang.org/x/sys/unix - -Porting Go to a new architecture/OS combination or adding syscalls, types, or -constants to an existing architecture/OS pair requires some manual effort; -however, there are tools that automate much of the process. - -## Build Systems - -There are currently two ways we generate the necessary files. We are currently -migrating the build system to use containers so the builds are reproducible. -This is being done on an OS-by-OS basis. Please update this documentation as -components of the build system change. - -### Old Build System (currently for `GOOS != "linux"`) - -The old build system generates the Go files based on the C header files -present on your system. This means that files -for a given GOOS/GOARCH pair must be generated on a system with that OS and -architecture. This also means that the generated code can differ from system -to system, based on differences in the header files. - -To avoid this, if you are using the old build system, only generate the Go -files on an installation with unmodified header files. It is also important to -keep track of which version of the OS the files were generated from (ex. -Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes -and have each OS upgrade correspond to a single change. - -To build the files for your current OS and architecture, make sure GOOS and -GOARCH are set correctly and run `mkall.sh`. This will generate the files for -your specific system. Running `mkall.sh -n` shows the commands that will be run. - -Requirements: bash, go - -### New Build System (currently for `GOOS == "linux"`) - -The new build system uses a Docker container to generate the go files directly -from source checkouts of the kernel and various system libraries. This means -that on any platform that supports Docker, all the files using the new build -system can be generated at once, and generated files will not change based on -what the person running the scripts has installed on their computer. - -The OS specific files for the new build system are located in the `${GOOS}` -directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When -the kernel or system library updates, modify the Dockerfile at -`${GOOS}/Dockerfile` to checkout the new release of the source. - -To build all the files under the new build system, you must be on an amd64/Linux -system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will -then generate all of the files for all of the GOOS/GOARCH pairs in the new build -system. Running `mkall.sh -n` shows the commands that will be run. - -Requirements: bash, go, docker - -## Component files - -This section describes the various files used in the code generation process. -It also contains instructions on how to modify these files to add a new -architecture/OS or to add additional syscalls, types, or constants. Note that -if you are using the new build system, the scripts/programs cannot be called normally. -They must be called from within the docker container. - -### asm files - -The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system -call dispatch. There are three entry points: -``` - func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) - func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) - func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) -``` -The first and second are the standard ones; they differ only in how many -arguments can be passed to the kernel. The third is for low-level use by the -ForkExec wrapper. Unlike the first two, it does not call into the scheduler to -let it know that a system call is running. - -When porting Go to an new architecture/OS, this file must be implemented for -each GOOS/GOARCH pair. - -### mksysnum - -Mksysnum is a Go program located at `${GOOS}/mksysnum.go` (or `mksysnum_${GOOS}.go` -for the old system). This program takes in a list of header files containing the -syscall number declarations and parses them to produce the corresponding list of -Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated -constants. - -Adding new syscall numbers is mostly done by running the build on a sufficiently -new installation of the target OS (or updating the source checkouts for the -new build system). However, depending on the OS, you make need to update the -parsing in mksysnum. - -### mksyscall.go - -The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are -hand-written Go files which implement system calls (for unix, the specific OS, -or the specific OS/Architecture pair respectively) that need special handling -and list `//sys` comments giving prototypes for ones that can be generated. - -The mksyscall.go program takes the `//sys` and `//sysnb` comments and converts -them into syscalls. This requires the name of the prototype in the comment to -match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function -prototype can be exported (capitalized) or not. - -Adding a new syscall often just requires adding a new `//sys` function prototype -with the desired arguments and a capitalized name so it is exported. However, if -you want the interface to the syscall to be different, often one will make an -unexported `//sys` prototype, an then write a custom wrapper in -`syscall_${GOOS}.go`. - -### types files - -For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or -`types_${GOOS}.go` on the old system). This file includes standard C headers and -creates Go type aliases to the corresponding C types. The file is then fed -through godef to get the Go compatible definitions. Finally, the generated code -is fed though mkpost.go to format the code correctly and remove any hidden or -private identifiers. This cleaned-up code is written to -`ztypes_${GOOS}_${GOARCH}.go`. - -The hardest part about preparing this file is figuring out which headers to -include and which symbols need to be `#define`d to get the actual data -structures that pass through to the kernel system calls. Some C libraries -preset alternate versions for binary compatibility and translate them on the -way in and out of system calls, but there is almost always a `#define` that can -get the real ones. -See `types_darwin.go` and `linux/types.go` for examples. - -To add a new type, add in the necessary include statement at the top of the -file (if it is not already there) and add in a type alias line. Note that if -your type is significantly different on different architectures, you may need -some `#if/#elif` macros in your include statements. - -### mkerrors.sh - -This script is used to generate the system's various constants. This doesn't -just include the error numbers and error strings, but also the signal numbers -an a wide variety of miscellaneous constants. The constants come from the list -of include files in the `includes_${uname}` variable. A regex then picks out -the desired `#define` statements, and generates the corresponding Go constants. -The error numbers and strings are generated from `#include `, and the -signal numbers and strings are generated from `#include `. All of -these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program, -`_errors.c`, which prints out all the constants. - -To add a constant, add the header that includes it to the appropriate variable. -Then, edit the regex (if necessary) to match the desired constant. Avoid making -the regex too broad to avoid matching unintended constants. - - -## Generated files - -### `zerror_${GOOS}_${GOARCH}.go` - -A file containing all of the system's generated error numbers, error strings, -signal numbers, and constants. Generated by `mkerrors.sh` (see above). - -### `zsyscall_${GOOS}_${GOARCH}.go` - -A file containing all the generated syscalls for a specific GOOS and GOARCH. -Generated by `mksyscall.go` (see above). - -### `zsysnum_${GOOS}_${GOARCH}.go` - -A list of numeric constants for all the syscall number of the specific GOOS -and GOARCH. Generated by mksysnum (see above). - -### `ztypes_${GOOS}_${GOARCH}.go` - -A file containing Go types for passing into (or returning from) syscalls. -Generated by godefs and the types file (see above). diff --git a/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s index 6db717de..3cfefed2 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_riscv64.s @@ -23,10 +23,6 @@ TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 MOV a1+8(FP), A0 MOV a2+16(FP), A1 MOV a3+24(FP), A2 - MOV $0, A3 - MOV $0, A4 - MOV $0, A5 - MOV $0, A6 MOV trap+0(FP), A7 // syscall entry ECALL MOV A0, r1+32(FP) // r1 @@ -44,9 +40,6 @@ TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 MOV a1+8(FP), A0 MOV a2+16(FP), A1 MOV a3+24(FP), A2 - MOV ZERO, A3 - MOV ZERO, A4 - MOV ZERO, A5 MOV trap+0(FP), A7 // syscall entry ECALL MOV A0, r1+32(FP) diff --git a/vendor/golang.org/x/sys/unix/bluetooth_linux.go b/vendor/golang.org/x/sys/unix/bluetooth_linux.go index 6e322969..a178a614 100644 --- a/vendor/golang.org/x/sys/unix/bluetooth_linux.go +++ b/vendor/golang.org/x/sys/unix/bluetooth_linux.go @@ -23,6 +23,7 @@ const ( HCI_CHANNEL_USER = 1 HCI_CHANNEL_MONITOR = 2 HCI_CHANNEL_CONTROL = 3 + HCI_CHANNEL_LOGGING = 4 ) // Socketoption Level diff --git a/vendor/golang.org/x/sys/unix/fcntl.go b/vendor/golang.org/x/sys/unix/fcntl.go index 39c03f1e..4dc53486 100644 --- a/vendor/golang.org/x/sys/unix/fcntl.go +++ b/vendor/golang.org/x/sys/unix/fcntl.go @@ -9,12 +9,11 @@ package unix import "unsafe" // fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux -// systems by flock_linux_32bit.go to be SYS_FCNTL64. +// systems by fcntl_linux_32bit.go to be SYS_FCNTL64. var fcntl64Syscall uintptr = SYS_FCNTL -// FcntlInt performs a fcntl syscall on fd with the provided command and argument. -func FcntlInt(fd uintptr, cmd, arg int) (int, error) { - valptr, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(arg)) +func fcntl(fd int, cmd, arg int) (int, error) { + valptr, _, errno := Syscall(fcntl64Syscall, uintptr(fd), uintptr(cmd), uintptr(arg)) var err error if errno != 0 { err = errno @@ -22,6 +21,11 @@ func FcntlInt(fd uintptr, cmd, arg int) (int, error) { return int(valptr), err } +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +func FcntlInt(fd uintptr, cmd, arg int) (int, error) { + return fcntl(int(fd), cmd, arg) +} + // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { _, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk))) diff --git a/vendor/golang.org/x/sys/unix/fdset.go b/vendor/golang.org/x/sys/unix/fdset.go new file mode 100644 index 00000000..b27be0a0 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/fdset.go @@ -0,0 +1,29 @@ +// 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +// Set adds fd to the set fds. +func (fds *FdSet) Set(fd int) { + fds.Bits[fd/NFDBITS] |= (1 << (uintptr(fd) % NFDBITS)) +} + +// Clear removes fd from the set fds. +func (fds *FdSet) Clear(fd int) { + fds.Bits[fd/NFDBITS] &^= (1 << (uintptr(fd) % NFDBITS)) +} + +// IsSet returns whether fd is in the set fds. +func (fds *FdSet) IsSet(fd int) bool { + return fds.Bits[fd/NFDBITS]&(1<<(uintptr(fd)%NFDBITS)) != 0 +} + +// Zero clears the set fds. +func (fds *FdSet) Zero() { + for i := range fds.Bits { + fds.Bits[i] = 0 + } +} diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh deleted file mode 100755 index 890ec464..00000000 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ /dev/null @@ -1,229 +0,0 @@ -#!/usr/bin/env bash -# 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. - -# This script runs or (given -n) prints suggested commands to generate files for -# the Architecture/OS specified by the GOARCH and GOOS environment variables. -# See README.md for more information about how the build system works. - -GOOSARCH="${GOOS}_${GOARCH}" - -# defaults -mksyscall="go run mksyscall.go" -mkerrors="./mkerrors.sh" -zerrors="zerrors_$GOOSARCH.go" -mksysctl="" -zsysctl="zsysctl_$GOOSARCH.go" -mksysnum= -mktypes= -mkasm= -run="sh" -cmd="" - -case "$1" in --syscalls) - for i in zsyscall*go - do - # Run the command line that appears in the first line - # of the generated file to regenerate it. - sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i - rm _$i - done - exit 0 - ;; --n) - run="cat" - cmd="echo" - shift -esac - -case "$#" in -0) - ;; -*) - echo 'usage: mkall.sh [-n]' 1>&2 - exit 2 -esac - -if [[ "$GOOS" = "linux" ]]; then - # Use the Docker-based build system - # Files generated through docker (use $cmd so you can Ctl-C the build or run) - $cmd docker build --tag generate:$GOOS $GOOS - $cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS - exit -fi - -GOOSARCH_in=syscall_$GOOSARCH.go -case "$GOOSARCH" in -_* | *_ | _) - echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 - exit 1 - ;; -aix_ppc) - mkerrors="$mkerrors -maix32" - mksyscall="go run mksyscall_aix_ppc.go -aix" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -aix_ppc64) - mkerrors="$mkerrors -maix64" - mksyscall="go run mksyscall_aix_ppc64.go -aix" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -darwin_386) - mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" - ;; -darwin_amd64) - mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" - ;; -darwin_arm) - mkerrors="$mkerrors" - mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" - ;; -darwin_arm64) - mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" - ;; -dragonfly_amd64) - mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -dragonfly" - mksysnum="go run mksysnum.go 'https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -freebsd_386) - mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -freebsd_amd64) - mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -freebsd_arm) - mkerrors="$mkerrors" - mksyscall="go run mksyscall.go -l32 -arm" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" - # Let the type of C char be signed for making the bare syscall - # API consistent across platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -freebsd_arm64) - mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -netbsd_386) - mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32 -netbsd" - mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -netbsd_amd64) - mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -netbsd" - mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -netbsd_arm) - mkerrors="$mkerrors" - mksyscall="go run mksyscall.go -l32 -netbsd -arm" - mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" - # Let the type of C char be signed for making the bare syscall - # API consistent across platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -netbsd_arm64) - mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -netbsd" - mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -openbsd_386) - mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32 -openbsd" - mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -openbsd_amd64) - mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -openbsd" - mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -openbsd_arm) - mkerrors="$mkerrors" - mksyscall="go run mksyscall.go -l32 -openbsd -arm" - mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" - # Let the type of C char be signed for making the bare syscall - # API consistent across platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -openbsd_arm64) - mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -openbsd" - mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" - # Let the type of C char be signed for making the bare syscall - # API consistent across platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -solaris_amd64) - mksyscall="go run mksyscall_solaris.go" - mkerrors="$mkerrors -m64" - mksysnum= - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -*) - echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 - exit 1 - ;; -esac - -( - if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi - case "$GOOS" in - *) - syscall_goos="syscall_$GOOS.go" - case "$GOOS" in - darwin | dragonfly | freebsd | netbsd | openbsd) - syscall_goos="syscall_bsd.go $syscall_goos" - ;; - esac - if [ -n "$mksyscall" ]; then - if [ "$GOOSARCH" == "aix_ppc64" ]; then - # aix/ppc64 script generates files instead of writing to stdin. - echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in && gofmt -w zsyscall_$GOOSARCH.go && gofmt -w zsyscall_"$GOOSARCH"_gccgo.go && gofmt -w zsyscall_"$GOOSARCH"_gc.go " ; - elif [ "$GOOS" == "darwin" ]; then - # pre-1.12, direct syscalls - echo "$mksyscall -tags $GOOS,$GOARCH,!go1.12 $syscall_goos syscall_darwin_${GOARCH}.1_11.go $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.1_11.go"; - # 1.12 and later, syscalls via libSystem - echo "$mksyscall -tags $GOOS,$GOARCH,go1.12 $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; - # 1.13 and later, syscalls via libSystem (including syscallPtr) - echo "$mksyscall -tags $GOOS,$GOARCH,go1.13 syscall_darwin.1_13.go |gofmt >zsyscall_$GOOSARCH.1_13.go"; - else - echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; - fi - fi - esac - if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi - if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi - if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; fi - if [ -n "$mkasm" ]; then echo "$mkasm $GOARCH"; fi -) | $run diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh deleted file mode 100755 index 67b84828..00000000 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ /dev/null @@ -1,684 +0,0 @@ -#!/usr/bin/env bash -# 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. - -# Generate Go code listing errors and other #defined constant -# values (ENAMETOOLONG etc.), by asking the preprocessor -# about the definitions. - -unset LANG -export LC_ALL=C -export LC_CTYPE=C - -if test -z "$GOARCH" -o -z "$GOOS"; then - echo 1>&2 "GOARCH or GOOS not defined in environment" - exit 1 -fi - -# Check that we are using the new build system if we should -if [[ "$GOOS" = "linux" ]] && [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then - echo 1>&2 "In the Docker based build system, mkerrors should not be called directly." - echo 1>&2 "See README.md" - exit 1 -fi - -if [[ "$GOOS" = "aix" ]]; then - CC=${CC:-gcc} -else - CC=${CC:-cc} -fi - -if [[ "$GOOS" = "solaris" ]]; then - # Assumes GNU versions of utilities in PATH. - export PATH=/usr/gnu/bin:$PATH -fi - -uname=$(uname) - -includes_AIX=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define AF_LOCAL AF_UNIX -' - -includes_Darwin=' -#define _DARWIN_C_SOURCE -#define KERNEL -#define _DARWIN_USE_64_BIT_INODE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -' - -includes_DragonFly=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -' - -includes_FreeBSD=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if __FreeBSD__ >= 10 -#define IFT_CARP 0xf8 // IFT_CARP is deprecated in FreeBSD 10 -#undef SIOCAIFADDR -#define SIOCAIFADDR _IOW(105, 26, struct oifaliasreq) // ifaliasreq contains if_data -#undef SIOCSIFPHYADDR -#define SIOCSIFPHYADDR _IOW(105, 70, struct oifaliasreq) // ifaliasreq contains if_data -#endif -' - -includes_Linux=' -#define _LARGEFILE_SOURCE -#define _LARGEFILE64_SOURCE -#ifndef __LP64__ -#define _FILE_OFFSET_BITS 64 -#endif -#define _GNU_SOURCE - -// is broken on powerpc64, as it fails to include definitions of -// these structures. We just include them copied from . -#if defined(__powerpc__) -struct sgttyb { - char sg_ispeed; - char sg_ospeed; - char sg_erase; - char sg_kill; - short sg_flags; -}; - -struct tchars { - char t_intrc; - char t_quitc; - char t_startc; - char t_stopc; - char t_eofc; - char t_brkc; -}; - -struct ltchars { - char t_suspc; - char t_dsuspc; - char t_rprntc; - char t_flushc; - char t_werasc; - char t_lnextc; -}; -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#if defined(__sparc__) -// On sparc{,64}, the kernel defines struct termios2 itself which clashes with the -// definition in glibc. As only the error constants are needed here, include the -// generic termibits.h (which is included by termbits.h on sparc). -#include -#else -#include -#endif - -#ifndef MSG_FASTOPEN -#define MSG_FASTOPEN 0x20000000 -#endif - -#ifndef PTRACE_GETREGS -#define PTRACE_GETREGS 0xc -#endif - -#ifndef PTRACE_SETREGS -#define PTRACE_SETREGS 0xd -#endif - -#ifndef SOL_NETLINK -#define SOL_NETLINK 270 -#endif - -#ifdef SOL_BLUETOOTH -// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h -// but it is already in bluetooth_linux.go -#undef SOL_BLUETOOTH -#endif - -// Certain constants are missing from the fs/crypto UAPI -#define FS_KEY_DESC_PREFIX "fscrypt:" -#define FS_KEY_DESC_PREFIX_SIZE 8 -#define FS_MAX_KEY_SIZE 64 - -// The code generator produces -0x1 for (~0), but an unsigned value is necessary -// for the tipc_subscr timeout __u32 field. -#undef TIPC_WAIT_FOREVER -#define TIPC_WAIT_FOREVER 0xffffffff -' - -includes_NetBSD=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Needed since refers to it... -#define schedppq 1 -' - -includes_OpenBSD=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// We keep some constants not supported in OpenBSD 5.5 and beyond for -// the promise of compatibility. -#define EMUL_ENABLED 0x1 -#define EMUL_NATIVE 0x2 -#define IPV6_FAITH 0x1d -#define IPV6_OPTIONS 0x1 -#define IPV6_RTHDR_STRICT 0x1 -#define IPV6_SOCKOPT_RESERVED1 0x3 -#define SIOCGIFGENERIC 0xc020693a -#define SIOCSIFGENERIC 0x80206939 -#define WALTSIG 0x4 -' - -includes_SunOS=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -' - - -includes=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -' -ccflags="$@" - -# Write go tool cgo -godefs input. -( - echo package unix - echo - echo '/*' - indirect="includes_$(uname)" - echo "${!indirect} $includes" - echo '*/' - echo 'import "C"' - echo 'import "syscall"' - echo - echo 'const (' - - # The gcc command line prints all the #defines - # it encounters while processing the input - echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | - awk ' - $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} - - $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers - $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} - $2 ~ /^(SCM_SRCRT)$/ {next} - $2 ~ /^(MAP_FAILED)$/ {next} - $2 ~ /^ELF_.*$/ {next}# contains ELF_ARCH, etc. - - $2 ~ /^EXTATTR_NAMESPACE_NAMES/ || - $2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next} - - $2 !~ /^ECCAPBITS/ && - $2 !~ /^ETH_/ && - $2 !~ /^EPROC_/ && - $2 !~ /^EQUIV_/ && - $2 !~ /^EXPR_/ && - $2 ~ /^E[A-Z0-9_]+$/ || - $2 ~ /^B[0-9_]+$/ || - $2 ~ /^(OLD|NEW)DEV$/ || - $2 == "BOTHER" || - $2 ~ /^CI?BAUD(EX)?$/ || - $2 == "IBSHIFT" || - $2 ~ /^V[A-Z0-9]+$/ || - $2 ~ /^CS[A-Z0-9]/ || - $2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ || - $2 ~ /^IGN/ || - $2 ~ /^IX(ON|ANY|OFF)$/ || - $2 ~ /^IN(LCR|PCK)$/ || - $2 !~ "X86_CR3_PCID_NOFLUSH" && - $2 ~ /(^FLU?SH)|(FLU?SH$)/ || - $2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ || - $2 == "BRKINT" || - $2 == "HUPCL" || - $2 == "PENDIN" || - $2 == "TOSTOP" || - $2 == "XCASE" || - $2 == "ALTWERASE" || - $2 == "NOKERNINFO" || - $2 == "NFDBITS" || - $2 ~ /^PAR/ || - $2 ~ /^SIG[^_]/ || - $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || - $2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ || - $2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ || - $2 ~ /^O?XTABS$/ || - $2 ~ /^TC[IO](ON|OFF)$/ || - $2 ~ /^IN_/ || - $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || - $2 ~ /^LO_(KEY|NAME)_SIZE$/ || - $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|MCAST|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || - $2 ~ /^TP_STATUS_/ || - $2 ~ /^FALLOC_/ || - $2 == "ICMPV6_FILTER" || - $2 == "SOMAXCONN" || - $2 == "NAME_MAX" || - $2 == "IFNAMSIZ" || - $2 ~ /^CTL_(HW|KERN|MAXNAME|NET|QUERY)$/ || - $2 ~ /^KERN_(HOSTNAME|OS(RELEASE|TYPE)|VERSION)$/ || - $2 ~ /^HW_MACHINE$/ || - $2 ~ /^SYSCTL_VERS/ || - $2 !~ "MNT_BITS" && - $2 ~ /^(MS|MNT|UMOUNT)_/ || - $2 ~ /^NS_GET_/ || - $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || - $2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT)_/ || - $2 ~ /^KEXEC_/ || - $2 ~ /^LINUX_REBOOT_CMD_/ || - $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || - $2 ~ /^MODULE_INIT_/ || - $2 !~ "NLA_TYPE_MASK" && - $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ || - $2 ~ /^SIOC/ || - $2 ~ /^TIOC/ || - $2 ~ /^TCGET/ || - $2 ~ /^TCSET/ || - $2 ~ /^TC(FLSH|SBRKP?|XONC)$/ || - $2 !~ "RTF_BITS" && - $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || - $2 ~ /^BIOC/ || - $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || - $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || - $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || - $2 ~ /^CLONE_[A-Z_]+/ || - $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ && - $2 ~ /^(BPF|DLT)_/ || - $2 ~ /^(CLOCK|TIMER)_/ || - $2 ~ /^CAN_/ || - $2 ~ /^CAP_/ || - $2 ~ /^ALG_/ || - $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || - $2 ~ /^GRND_/ || - $2 ~ /^RND/ || - $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || - $2 ~ /^KEYCTL_/ || - $2 ~ /^PERF_EVENT_IOC_/ || - $2 ~ /^SECCOMP_MODE_/ || - $2 ~ /^SPLICE_/ || - $2 ~ /^SYNC_FILE_RANGE_/ || - $2 !~ /^AUDIT_RECORD_MAGIC/ && - $2 !~ /IOC_MAGIC/ && - $2 ~ /^[A-Z][A-Z0-9_]+_MAGIC2?$/ || - $2 ~ /^(VM|VMADDR)_/ || - $2 ~ /^IOCTL_VM_SOCKETS_/ || - $2 ~ /^(TASKSTATS|TS)_/ || - $2 ~ /^CGROUPSTATS_/ || - $2 ~ /^GENL_/ || - $2 ~ /^STATX_/ || - $2 ~ /^RENAME/ || - $2 ~ /^UBI_IOC[A-Z]/ || - $2 ~ /^UTIME_/ || - $2 ~ /^XATTR_(CREATE|REPLACE|NO(DEFAULT|FOLLOW|SECURITY)|SHOWCOMPRESSION)/ || - $2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ || - $2 ~ /^FSOPT_/ || - $2 ~ /^WDIOC_/ || - $2 ~ /^NFN/ || - $2 ~ /^XDP_/ || - $2 ~ /^(HDIO|WIN|SMART)_/ || - $2 ~ /^CRYPTO_/ || - $2 ~ /^TIPC_/ || - $2 !~ "WMESGLEN" && - $2 ~ /^W[A-Z0-9]+$/ || - $2 ~/^PPPIOC/ || - $2 ~ /^FAN_|FANOTIFY_/ || - $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} - $2 ~ /^__WCOREFLAG$/ {next} - $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} - - {next} - ' | sort - - echo ')' -) >_const.go - -# Pull out the error names for later. -errors=$( - echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | - sort -) - -# Pull out the signal names for later. -signals=$( - echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | - egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' | - sort -) - -# Again, writing regexps to a file. -echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | - sort >_error.grep -echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | - egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' | - sort >_signal.grep - -echo '// mkerrors.sh' "$@" -echo '// Code generated by the command above; see README.md. DO NOT EDIT.' -echo -echo "// +build ${GOARCH},${GOOS}" -echo -go tool cgo -godefs -- "$@" _const.go >_error.out -cat _error.out | grep -vf _error.grep | grep -vf _signal.grep -echo -echo '// Errors' -echo 'const (' -cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/' -echo ')' - -echo -echo '// Signals' -echo 'const (' -cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/' -echo ')' - -# Run C program to print error and syscall strings. -( - echo -E " -#include -#include -#include -#include -#include -#include - -#define nelem(x) (sizeof(x)/sizeof((x)[0])) - -enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below - -struct tuple { - int num; - const char *name; -}; - -struct tuple errors[] = { -" - for i in $errors - do - echo -E ' {'$i', "'$i'" },' - done - - echo -E " -}; - -struct tuple signals[] = { -" - for i in $signals - do - echo -E ' {'$i', "'$i'" },' - done - - # Use -E because on some systems bash builtin interprets \n itself. - echo -E ' -}; - -static int -tuplecmp(const void *a, const void *b) -{ - return ((struct tuple *)a)->num - ((struct tuple *)b)->num; -} - -int -main(void) -{ - int i, e; - char buf[1024], *p; - - printf("\n\n// Error table\n"); - printf("var errorList = [...]struct {\n"); - printf("\tnum syscall.Errno\n"); - printf("\tname string\n"); - printf("\tdesc string\n"); - printf("} {\n"); - qsort(errors, nelem(errors), sizeof errors[0], tuplecmp); - for(i=0; i 0 && errors[i-1].num == e) - continue; - strcpy(buf, strerror(e)); - // lowercase first letter: Bad -> bad, but STREAM -> STREAM. - if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) - buf[0] += a - A; - printf("\t{ %d, \"%s\", \"%s\" },\n", e, errors[i].name, buf); - } - printf("}\n\n"); - - printf("\n\n// Signal table\n"); - printf("var signalList = [...]struct {\n"); - printf("\tnum syscall.Signal\n"); - printf("\tname string\n"); - printf("\tdesc string\n"); - printf("} {\n"); - qsort(signals, nelem(signals), sizeof signals[0], tuplecmp); - for(i=0; i 0 && signals[i-1].num == e) - continue; - strcpy(buf, strsignal(e)); - // lowercase first letter: Bad -> bad, but STREAM -> STREAM. - if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) - buf[0] += a - A; - // cut trailing : number. - p = strrchr(buf, ":"[0]); - if(p) - *p = '\0'; - printf("\t{ %d, \"%s\", \"%s\" },\n", e, signals[i].name, buf); - } - printf("}\n\n"); - - return 0; -} - -' -) >_errors.c - -$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go index eb433205..5ee1a16b 100644 --- a/vendor/golang.org/x/sys/unix/mkpost.go +++ b/vendor/golang.org/x/sys/unix/mkpost.go @@ -76,6 +76,11 @@ func main() { convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) + // Convert [n]int8 to [n]byte in Statvfs_t members to simplify + // conversion to string. + convertStatvfsRegex := regexp.MustCompile(`((Fstype|Mnton|Mntfrom)name)(\s+)\[(\d+)\]int8`) + b = convertStatvfsRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) + // Convert [1024]int8 to [1024]byte in Ptmget members convertPtmget := regexp.MustCompile(`([SC]n)(\s+)\[(\d+)\]u?int8`) b = convertPtmget.ReplaceAll(b, []byte("$1[$3]byte")) diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index d52bcc41..68605db6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -510,6 +510,23 @@ func SysctlRaw(name string, args ...int) ([]byte, error) { return buf[:n], nil } +func SysctlClockinfo(name string) (*Clockinfo, error) { + mib, err := sysctlmib(name) + if err != nil { + return nil, err + } + + n := uintptr(SizeofClockinfo) + var ci Clockinfo + if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil { + return nil, err + } + if n != SizeofClockinfo { + return nil, EIO + } + return &ci, nil +} + //sys utimes(path string, timeval *[2]Timeval) (err error) func Utimes(path string, tv []Timeval) error { @@ -577,8 +594,6 @@ func Futimes(fd int, tv []Timeval) error { return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } -//sys fcntl(fd int, cmd int, arg int) (val int, err error) - //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) func Poll(fds []PollFd, timeout int) (n int, err error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 0a1cc74b..9a5a6ee5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -155,23 +155,6 @@ func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) ( //sys getattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error) -func SysctlClockinfo(name string) (*Clockinfo, error) { - mib, err := sysctlmib(name) - if err != nil { - return nil, err - } - - n := uintptr(SizeofClockinfo) - var ci Clockinfo - if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil { - return nil, err - } - if n != SizeofClockinfo { - return nil, EIO - } - return &ci, nil -} - //sysnb pipe() (r int, w int, err error) func Pipe(p []int) (err error) { @@ -333,6 +316,8 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { * Wrapped */ +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + //sys kill(pid int, signum int, posix int) (err error) func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go index c81510da..0e3f25ac 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin,386,!go1.12 +// +build darwin,arm,!go1.12 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index 79d52221..6b2eca49 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -462,8 +462,12 @@ func convertFromDirents11(buf []byte, old []byte) int { dstPos := 0 srcPos := 0 for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) { - dstDirent := (*Dirent)(unsafe.Pointer(&buf[dstPos])) - srcDirent := (*dirent_freebsd11)(unsafe.Pointer(&old[srcPos])) + var dstDirent Dirent + var srcDirent dirent_freebsd11 + + // If multiple direntries are written, sometimes when we reach the final one, + // we may have cap of old less than size of dirent_freebsd11. + copy((*[unsafe.Sizeof(srcDirent)]byte)(unsafe.Pointer(&srcDirent))[:], old[srcPos:]) reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8) if dstPos+reclen > len(buf) { @@ -479,6 +483,7 @@ func convertFromDirents11(buf []byte, old []byte) int { dstDirent.Pad1 = 0 copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen]) + copy(buf[dstPos:], (*[unsafe.Sizeof(dstDirent)]byte)(unsafe.Pointer(&dstDirent))[:]) padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen] for i := range padding { padding[i] = 0 @@ -524,12 +529,6 @@ func PtraceGetRegs(pid int, regsout *Reg) (err error) { return ptrace(PTRACE_GETREGS, pid, uintptr(unsafe.Pointer(regsout)), 0) } -func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { - ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint(countin)} - err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) - return int(ioDesc.Len), err -} - func PtraceLwpEvents(pid int, enable int) (err error) { return ptrace(PTRACE_LWPEVENTS, pid, 0, enable) } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go index dcc56457..0a5a66fa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -54,3 +54,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { + ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)} + err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + return int(ioDesc.Len), err +} diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go index 321c3bac..8025b22d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -54,3 +54,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { + ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)} + err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + return int(ioDesc.Len), err +} diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go index 69770083..4ea45bce 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -54,3 +54,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { + ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint32(countin)} + err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + return int(ioDesc.Len), err +} diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go index dbbbfd60..aa5326db 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go @@ -54,3 +54,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e } func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func PtraceIO(req int, pid int, addr uintptr, out []byte, countin int) (count int, err error) { + ioDesc := PtraceIoDesc{Op: int32(req), Offs: (*byte)(unsafe.Pointer(addr)), Addr: (*byte)(unsafe.Pointer(&out[0])), Len: uint64(countin)} + err = ptrace(PTRACE_IO, pid, uintptr(unsafe.Pointer(&ioDesc)), 0) + return int(ioDesc.Len), err +} diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 26903bca..0efe45ae 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -1575,7 +1575,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Fchdir(fd int) (err error) //sys Fchmod(fd int, mode uint32) (err error) //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) -//sys fcntl(fd int, cmd int, arg int) (val int, err error) //sys Fdatasync(fd int) (err error) //sys Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) //sys FinitModule(fd int, params string, flags int) (err error) @@ -1631,6 +1630,17 @@ func Getpgrp() (pid int) { //sysnb Settimeofday(tv *Timeval) (err error) //sys Setns(fd int, nstype int) (err error) +// PrctlRetInt performs a prctl operation specified by option and further +// optional arguments arg2 through arg5 depending on option. It returns a +// non-negative integer that is returned by the prctl syscall. +func PrctlRetInt(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (int, error) { + ret, _, err := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if err != 0 { + return 0, err + } + return int(ret), nil +} + // issue 1435. // On linux Setuid and Setgid only affects the current thread, not the process. // This does not match what most callers expect so we must return an error @@ -1644,6 +1654,30 @@ func Setgid(uid int) (err error) { return EOPNOTSUPP } +// SetfsgidRetGid sets fsgid for current thread and returns previous fsgid set. +// setfsgid(2) will return a non-nil error only if its caller lacks CAP_SETUID capability. +// If the call fails due to other reasons, current fsgid will be returned. +func SetfsgidRetGid(gid int) (int, error) { + return setfsgid(gid) +} + +// SetfsuidRetUid sets fsuid for current thread and returns previous fsuid set. +// setfsgid(2) will return a non-nil error only if its caller lacks CAP_SETUID capability +// If the call fails due to other reasons, current fsuid will be returned. +func SetfsuidRetUid(uid int) (int, error) { + return setfsuid(uid) +} + +func Setfsgid(gid int) error { + _, err := setfsgid(gid) + return err +} + +func Setfsuid(uid int) error { + _, err := setfsuid(uid) + return err +} + func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) { return signalfd(fd, sigmask, _C__NSIG/8, flags) } @@ -1666,6 +1700,123 @@ func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) { //sys exitThread(code int) (err error) = SYS_EXIT //sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ //sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE +//sys readv(fd int, iovs []Iovec) (n int, err error) = SYS_READV +//sys writev(fd int, iovs []Iovec) (n int, err error) = SYS_WRITEV +//sys preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) = SYS_PREADV +//sys pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) = SYS_PWRITEV +//sys preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PREADV2 +//sys pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) = SYS_PWRITEV2 + +func bytes2iovec(bs [][]byte) []Iovec { + iovecs := make([]Iovec, len(bs)) + for i, b := range bs { + iovecs[i].SetLen(len(b)) + if len(b) > 0 { + iovecs[i].Base = &b[0] + } else { + iovecs[i].Base = (*byte)(unsafe.Pointer(&_zero)) + } + } + return iovecs +} + +// offs2lohi splits offs into its lower and upper unsigned long. On 64-bit +// systems, hi will always be 0. On 32-bit systems, offs will be split in half. +// preadv/pwritev chose this calling convention so they don't need to add a +// padding-register for alignment on ARM. +func offs2lohi(offs int64) (lo, hi uintptr) { + return uintptr(offs), uintptr(uint64(offs) >> SizeofLong) +} + +func Readv(fd int, iovs [][]byte) (n int, err error) { + iovecs := bytes2iovec(iovs) + n, err = readv(fd, iovecs) + readvRacedetect(iovecs, n, err) + return n, err +} + +func Preadv(fd int, iovs [][]byte, offset int64) (n int, err error) { + iovecs := bytes2iovec(iovs) + lo, hi := offs2lohi(offset) + n, err = preadv(fd, iovecs, lo, hi) + readvRacedetect(iovecs, n, err) + return n, err +} + +func Preadv2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) { + iovecs := bytes2iovec(iovs) + lo, hi := offs2lohi(offset) + n, err = preadv2(fd, iovecs, lo, hi, flags) + readvRacedetect(iovecs, n, err) + return n, err +} + +func readvRacedetect(iovecs []Iovec, n int, err error) { + if !raceenabled { + return + } + for i := 0; n > 0 && i < len(iovecs); i++ { + m := int(iovecs[i].Len) + if m > n { + m = n + } + n -= m + if m > 0 { + raceWriteRange(unsafe.Pointer(iovecs[i].Base), m) + } + } + if err == nil { + raceAcquire(unsafe.Pointer(&ioSync)) + } +} + +func Writev(fd int, iovs [][]byte) (n int, err error) { + iovecs := bytes2iovec(iovs) + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + n, err = writev(fd, iovecs) + writevRacedetect(iovecs, n) + return n, err +} + +func Pwritev(fd int, iovs [][]byte, offset int64) (n int, err error) { + iovecs := bytes2iovec(iovs) + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + lo, hi := offs2lohi(offset) + n, err = pwritev(fd, iovecs, lo, hi) + writevRacedetect(iovecs, n) + return n, err +} + +func Pwritev2(fd int, iovs [][]byte, offset int64, flags int) (n int, err error) { + iovecs := bytes2iovec(iovs) + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + lo, hi := offs2lohi(offset) + n, err = pwritev2(fd, iovecs, lo, hi, flags) + writevRacedetect(iovecs, n) + return n, err +} + +func writevRacedetect(iovecs []Iovec, n int) { + if !raceenabled { + return + } + for i := 0; n > 0 && i < len(iovecs); i++ { + m := int(iovecs[i].Len) + if m > n { + m = n + } + n -= m + if m > 0 { + raceReadRange(unsafe.Pointer(iovecs[i].Base), m) + } + } +} // mmap varies by architecture; see syscall_linux_*.go. //sys munmap(addr uintptr, length uintptr) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index e7fa665e..a8374b67 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -70,8 +70,8 @@ func Pipe2(p []int, flags int) (err error) { //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 -//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 -//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sys setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32 +//sys setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32 //sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 //sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 //sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 088ce0f9..8ed1d546 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -55,8 +55,8 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) -//sys Setfsgid(gid int) (err error) -//sys Setfsuid(uid int) (err error) +//sys setfsgid(gid int) (prev int, err error) +//sys setfsuid(uid int) (prev int, err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 11930fc8..99ae6137 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -98,8 +98,8 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT -//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 -//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sys setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32 +//sys setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32 //sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 //sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 //sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 251e2d97..807a0b20 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -42,8 +42,8 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) -//sys Setfsgid(gid int) (err error) -//sys Setfsuid(uid int) (err error) +//sys setfsgid(gid int) (prev int, err error) +//sys setfsuid(uid int) (prev int, err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 7562fe97..85a872d6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -36,8 +36,8 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) -//sys Setfsgid(gid int) (err error) -//sys Setfsuid(uid int) (err error) +//sys setfsgid(gid int) (prev int, err error) +//sys setfsuid(uid int) (prev int, err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) @@ -224,3 +224,8 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { } return poll(&fds[0], len(fds), timeout) } + +func InotifyInit() (fd int, err error) { + return InotifyInit1(0) +} + diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index a939ff8f..e286c6ba 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -31,8 +31,8 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 -//sys Setfsgid(gid int) (err error) -//sys Setfsuid(uid int) (err error) +//sys setfsgid(gid int) (prev int, err error) +//sys setfsuid(uid int) (prev int, err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 28d6d0f2..ca0345aa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -34,8 +34,8 @@ package unix //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) -//sys Setfsgid(gid int) (err error) -//sys Setfsuid(uid int) (err error) +//sys setfsgid(gid int) (prev int, err error) +//sys setfsuid(uid int) (prev int, err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 6798c262..abdabbac 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -41,8 +41,8 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) -//sys Setfsgid(gid int) (err error) -//sys Setfsuid(uid int) (err error) +//sys setfsgid(gid int) (prev int, err error) +//sys setfsuid(uid int) (prev int, err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index eb5cb1a7..533e9305 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -34,8 +34,8 @@ import ( //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) -//sys Setfsgid(gid int) (err error) -//sys Setfsuid(uid int) (err error) +//sys setfsgid(gid int) (prev int, err error) +//sys setfsuid(uid int) (prev int, err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index 37321c12..d890a227 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -30,8 +30,8 @@ package unix //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) -//sys Setfsgid(gid int) (err error) -//sys Setfsuid(uid int) (err error) +//sys setfsgid(gid int) (prev int, err error) +//sys setfsuid(uid int) (prev int, err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 211131d9..45b50a61 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -106,23 +106,6 @@ func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } -func SysctlClockinfo(name string) (*Clockinfo, error) { - mib, err := sysctlmib(name) - if err != nil { - return nil, err - } - - n := uintptr(SizeofClockinfo) - var ci Clockinfo - if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil { - return nil, err - } - if n != SizeofClockinfo { - return nil, EIO - } - return &ci, nil -} - //sysnb pipe() (fd1 int, fd2 int, err error) func Pipe(p []int) (err error) { if len(p) != 2 { @@ -249,6 +232,14 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e return sendfile(outfd, infd, offset, count) } +func Fstatvfs(fd int, buf *Statvfs_t) (err error) { + return Fstatvfs1(fd, buf, ST_WAIT) +} + +func Statvfs(path string, buf *Statvfs_t) (err error) { + return Statvfs1(path, buf, ST_WAIT) +} + /* * Exposed directly */ @@ -262,6 +253,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Close(fd int) (err error) //sys Dup(fd int) (nfd int, err error) //sys Dup2(from int, to int) (err error) +//sys Dup3(from int, to int, flags int) (err error) //sys Exit(code int) //sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) //sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) @@ -287,6 +279,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Fpathconf(fd int, name int) (val int, err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatvfs1(fd int, buf *Statvfs_t, flags int) (err error) = SYS_FSTATVFS1 //sys Fsync(fd int) (err error) //sys Ftruncate(fd int, length int64) (err error) //sysnb Getegid() (egid int) @@ -343,6 +336,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) //sys Stat(path string, stat *Stat_t) (err error) +//sys Statvfs1(path string, buf *Statvfs_t, flags int) (err error) = SYS_STATVFS1 //sys Symlink(path string, link string) (err error) //sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) //sys Sync() (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 92ed67de..a266e92a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -55,23 +55,6 @@ func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } -func SysctlClockinfo(name string) (*Clockinfo, error) { - mib, err := sysctlmib(name) - if err != nil { - return nil, err - } - - n := uintptr(SizeofClockinfo) - var ci Clockinfo - if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil { - return nil, err - } - if n != SizeofClockinfo { - return nil, EIO - } - return &ci, nil -} - func SysctlUvmexp(name string) (*Uvmexp, error) { mib, err := sysctlmib(name) if err != nil { @@ -89,16 +72,20 @@ func SysctlUvmexp(name string) (*Uvmexp, error) { return &u, nil } -//sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { + return Pipe2(p, 0) +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) +func Pipe2(p []int, flags int) error { if len(p) != 2 { return EINVAL } var pp [2]_C_int - err = pipe(&pp) + err := pipe2(&pp, flags) p[0] = int(pp[0]) p[1] = int(pp[1]) - return + return err } //sys Getdents(fd int, buf []byte) (n int, err error) @@ -248,6 +235,7 @@ func Uname(uname *Utsname) error { //sys Close(fd int) (err error) //sys Dup(fd int) (nfd int, err error) //sys Dup2(from int, to int) (err error) +//sys Dup3(from int, to int, flags int) (err error) //sys Exit(code int) //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchdir(fd int) (err error) @@ -352,7 +340,6 @@ func Uname(uname *Utsname) error { // clock_settime // closefrom // execve -// fcntl // fhopen // fhstat // fhstatfs diff --git a/vendor/golang.org/x/sys/unix/types_dragonfly.go b/vendor/golang.org/x/sys/unix/types_dragonfly.go index 3365dd79..6574f6b6 100644 --- a/vendor/golang.org/x/sys/unix/types_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/types_dragonfly.go @@ -261,3 +261,9 @@ const ( // Uname type Utsname C.struct_utsname + +// Clockinfo + +const SizeofClockinfo = C.sizeof_struct_clockinfo + +type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_freebsd.go b/vendor/golang.org/x/sys/unix/types_freebsd.go index a121dc33..c6fde424 100644 --- a/vendor/golang.org/x/sys/unix/types_freebsd.go +++ b/vendor/golang.org/x/sys/unix/types_freebsd.go @@ -398,3 +398,9 @@ type CapRights C.struct_cap_rights // Uname type Utsname C.struct_utsname + +// Clockinfo + +const SizeofClockinfo = C.sizeof_struct_clockinfo + +type Clockinfo C.struct_clockinfo diff --git a/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/golang.org/x/sys/unix/types_netbsd.go index 4a96d72c..0a81aadb 100644 --- a/vendor/golang.org/x/sys/unix/types_netbsd.go +++ b/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -33,6 +33,7 @@ package unix #include #include #include +#include #include #include #include @@ -106,6 +107,8 @@ type Stat_t C.struct_stat type Statfs_t C.struct_statfs +type Statvfs_t C.struct_statvfs + type Flock_t C.struct_flock type Dirent C.struct_dirent @@ -118,6 +121,13 @@ const ( PathMax = C.PATH_MAX ) +// Fstatvfs/Statvfs flags + +const ( + ST_WAIT = C.ST_WAIT + ST_NOWAIT = C.ST_NOWAIT +) + // Advice to Fadvise const ( diff --git a/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/golang.org/x/sys/unix/types_solaris.go index 2b716f93..d713f09e 100644 --- a/vendor/golang.org/x/sys/unix/types_solaris.go +++ b/vendor/golang.org/x/sys/unix/types_solaris.go @@ -158,6 +158,8 @@ type Msghdr C.struct_msghdr type Cmsghdr C.struct_cmsghdr +type Inet4Pktinfo C.struct_in_pktinfo + type Inet6Pktinfo C.struct_in6_pktinfo type IPv6MTUInfo C.struct_ip6_mtuinfo @@ -175,6 +177,7 @@ const ( SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq SizeofMsghdr = C.sizeof_struct_msghdr SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go index 1def8a58..104994bc 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go @@ -459,6 +459,15 @@ const ( MAP_SHARED = 0x1 MAP_TYPE = 0xf0 MAP_VARIABLE = 0x0 + MCAST_BLOCK_SOURCE = 0x40 + MCAST_EXCLUDE = 0x2 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x3e + MCAST_JOIN_SOURCE_GROUP = 0x42 + MCAST_LEAVE_GROUP = 0x3f + MCAST_LEAVE_SOURCE_GROUP = 0x43 + MCAST_SOURCE_FILTER = 0x49 + MCAST_UNBLOCK_SOURCE = 0x41 MCL_CURRENT = 0x100 MCL_FUTURE = 0x200 MSG_ANY = 0x4 @@ -483,6 +492,7 @@ const ( MS_INVALIDATE = 0x40 MS_PER_SEC = 0x3e8 MS_SYNC = 0x20 + NFDBITS = 0x20 NL0 = 0x0 NL1 = 0x4000 NL2 = 0x8000 @@ -688,7 +698,7 @@ const ( SIOCGHIWAT = 0x40047301 SIOCGIFADDR = -0x3fd796df SIOCGIFADDRS = 0x2000698c - SIOCGIFBAUDRATE = -0x3fd79693 + SIOCGIFBAUDRATE = -0x3fdf9669 SIOCGIFBRDADDR = -0x3fd796dd SIOCGIFCONF = -0x3ff796bb SIOCGIFCONFGLOB = -0x3ff79670 diff --git a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go index 03187dea..4fc8d306 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go @@ -459,6 +459,15 @@ const ( MAP_SHARED = 0x1 MAP_TYPE = 0xf0 MAP_VARIABLE = 0x0 + MCAST_BLOCK_SOURCE = 0x40 + MCAST_EXCLUDE = 0x2 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x3e + MCAST_JOIN_SOURCE_GROUP = 0x42 + MCAST_LEAVE_GROUP = 0x3f + MCAST_LEAVE_SOURCE_GROUP = 0x43 + MCAST_SOURCE_FILTER = 0x49 + MCAST_UNBLOCK_SOURCE = 0x41 MCL_CURRENT = 0x100 MCL_FUTURE = 0x200 MSG_ANY = 0x4 @@ -483,6 +492,7 @@ const ( MS_INVALIDATE = 0x40 MS_PER_SEC = 0x3e8 MS_SYNC = 0x20 + NFDBITS = 0x40 NL0 = 0x0 NL1 = 0x4000 NL2 = 0x8000 @@ -688,7 +698,7 @@ const ( SIOCGHIWAT = 0x40047301 SIOCGIFADDR = -0x3fd796df SIOCGIFADDRS = 0x2000698c - SIOCGIFBAUDRATE = -0x3fd79693 + SIOCGIFBAUDRATE = -0x3fdf9669 SIOCGIFBRDADDR = -0x3fd796dd SIOCGIFCONF = -0x3fef96bb SIOCGIFCONFGLOB = -0x3fef9670 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index fcf5796a..e65b02f2 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -11,2761 +11,2840 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x80041270 - BLKBSZSET = 0x40041271 - BLKFLSBUF = 0x1261 - BLKFRAGET = 0x1265 - BLKFRASET = 0x1264 - BLKGETSIZE = 0x1260 - BLKGETSIZE64 = 0x80041272 - BLKPBSZGET = 0x127b - BLKRAGET = 0x1263 - BLKRASET = 0x1262 - BLKROGET = 0x125e - BLKROSET = 0x125d - BLKRRPART = 0x125f - BLKSECTGET = 0x1267 - BLKSECTSET = 0x1266 - BLKSSZGET = 0x1268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x800 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - FP_XSTATE_MAGIC2 = 0x46505845 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0xc - F_GETLK64 = 0xc - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0xd - F_SETLK64 = 0xd - F_SETLKW = 0xe - F_SETLKW64 = 0xe - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_32BIT = 0x40 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x20000 - MAP_SYNC = 0x80000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x20 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0xb703 - NS_GET_OWNER_UID = 0xb704 - NS_GET_PARENT = 0xb702 - NS_GET_USERNS = 0xb701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x4000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x8000 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x2401 - PERF_EVENT_IOC_ENABLE = 0x2400 - PERF_EVENT_IOC_ID = 0x80042407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4004240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 - PERF_EVENT_IOC_PERIOD = 0x40082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc004240a - PERF_EVENT_IOC_REFRESH = 0x2402 - PERF_EVENT_IOC_RESET = 0x2403 - PERF_EVENT_IOC_SET_BPF = 0x40042408 - PERF_EVENT_IOC_SET_FILTER = 0x40042406 - PERF_EVENT_IOC_SET_OUTPUT = 0x2405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x4004743d - PPPIOCATTCHAN = 0x40047438 - PPPIOCCONNECT = 0x4004743a - PPPIOCDETACH = 0x4004743c - PPPIOCDISCONN = 0x7439 - PPPIOCGASYNCMAP = 0x80047458 - PPPIOCGCHAN = 0x80047437 - PPPIOCGDEBUG = 0x80047441 - PPPIOCGFLAGS = 0x8004745a - PPPIOCGIDLE = 0x8008743f - PPPIOCGL2TPSTATS = 0x80487436 - PPPIOCGMRU = 0x80047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x80047455 - PPPIOCGUNIT = 0x80047456 - PPPIOCGXASYNCMAP = 0x80207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x40087446 - PPPIOCSASYNCMAP = 0x40047457 - PPPIOCSCOMPRESS = 0x400c744d - PPPIOCSDEBUG = 0x40047440 - PPPIOCSFLAGS = 0x40047459 - PPPIOCSMAXCID = 0x40047451 - PPPIOCSMRRU = 0x4004743b - PPPIOCSMRU = 0x40047452 - PPPIOCSNPMODE = 0x4008744b - PPPIOCSPASS = 0x40087447 - PPPIOCSRASYNCMAP = 0x40047454 - PPPIOCSXASYNCMAP = 0x4020744f - PPPIOCXFERUNIT = 0x744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETFPXREGS = 0x12 - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPREGS = 0xf - PTRACE_SETFPXREGS = 0x13 - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SINGLEBLOCK = 0x21 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_SYSEMU = 0x1f - PTRACE_SYSEMU_SINGLESTEP = 0x20 - PTRACE_TRACEME = 0x0 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x8 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x7 - RLIMIT_NPROC = 0x6 - RLIMIT_RSS = 0x5 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x40085203 - RNDADDTOENTCNT = 0x40045201 - RNDCLEARPOOL = 0x5206 - RNDGETENTCNT = 0x80045200 - RNDGETPOOL = 0x80085202 - RNDRESEEDCRNG = 0x5207 - RNDZAPENTCNT = 0x5204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x7002 - RTC_AIE_ON = 0x7001 - RTC_ALM_READ = 0x80247008 - RTC_ALM_SET = 0x40247007 - RTC_EPOCH_READ = 0x8004700d - RTC_EPOCH_SET = 0x4004700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x8004700b - RTC_IRQP_SET = 0x4004700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x7006 - RTC_PIE_ON = 0x7005 - RTC_PLL_GET = 0x801c7011 - RTC_PLL_SET = 0x401c7012 - RTC_RD_TIME = 0x80247009 - RTC_SET_TIME = 0x4024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x7004 - RTC_UIE_ON = 0x7003 - RTC_VL_CLR = 0x7014 - RTC_VL_READ = 0x80047013 - RTC_WIE_OFF = 0x7010 - RTC_WIE_ON = 0x700f - RTC_WKALM_RD = 0x80287010 - RTC_WKALM_SET = 0x4028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x8904 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x80108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x80108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x541b - SIOCOUTQ = 0x5411 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x11 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x14 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x3 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGISO7816 = 0x80285442 - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGPTPEER = 0x5441 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x100 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x400854d5 - TUNDETACHFILTER = 0x400854d6 - TUNGETDEVNETNS = 0x54e3 - TUNGETFEATURES = 0x800454cf - TUNGETFILTER = 0x800854db - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETBE = 0x800454df - TUNGETVNETHDRSZ = 0x800454d7 - TUNGETVNETLE = 0x800454dd - TUNSETCARRIER = 0x400454e2 - TUNSETDEBUG = 0x400454c9 - TUNSETFILTEREBPF = 0x800454e1 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETIFINDEX = 0x400454da - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETQUEUE = 0x400454d9 - TUNSETSNDBUF = 0x400454d4 - TUNSETSTEERINGEBPF = 0x800454e0 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETBE = 0x400454de - TUNSETVNETHDRSZ = 0x400454d8 - TUNSETVNETLE = 0x400454dc - UBI_IOCATT = 0x40186f40 - UBI_IOCDET = 0x40046f41 - UBI_IOCEBCH = 0x40044f02 - UBI_IOCEBER = 0x40044f01 - UBI_IOCEBISMAP = 0x80044f05 - UBI_IOCEBMAP = 0x40084f03 - UBI_IOCEBUNMAP = 0x40044f04 - UBI_IOCMKVOL = 0x40986f00 - UBI_IOCRMVOL = 0x40046f01 - UBI_IOCRNVOL = 0x51106f03 - UBI_IOCRPEB = 0x40046f04 - UBI_IOCRSVOL = 0x400c6f02 - UBI_IOCSETVOLPROP = 0x40104f06 - UBI_IOCSPEB = 0x40046f05 - UBI_IOCVOLCRBLK = 0x40804f07 - UBI_IOCVOLRMBLK = 0x4f08 - UBI_IOCVOLUP = 0x40084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x6 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x80045702 - WDIOC_GETPRETIMEOUT = 0x80045709 - WDIOC_GETSTATUS = 0x80045701 - WDIOC_GETSUPPORT = 0x80285700 - WDIOC_GETTEMP = 0x80045703 - WDIOC_GETTIMELEFT = 0x8004570a - WDIOC_GETTIMEOUT = 0x80045707 - WDIOC_KEEPALIVE = 0x80045705 - WDIOC_SETOPTIONS = 0x80045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x20 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - X86_FXSR_MAGIC = 0x0 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FP_XSTATE_MAGIC2 = 0x46505845 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x20 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x8000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4004240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8008743f + PPPIOCGIDLE32 = 0x8008743f + PPPIOCGIDLE64 = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40087446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x400c744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40087447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8004700d + RTC_EPOCH_SET = 0x4004700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8004700b + RTC_IRQP_SET = 0x4004700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x801c7011 + RTC_PLL_SET = 0x401c7012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x80285442 + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETDEVNETNS = 0x54e3 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + X86_FXSR_MAGIC = 0x0 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 5bcf3dbd..b26659e6 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -11,2761 +11,2840 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x80081270 - BLKBSZSET = 0x40081271 - BLKFLSBUF = 0x1261 - BLKFRAGET = 0x1265 - BLKFRASET = 0x1264 - BLKGETSIZE = 0x1260 - BLKGETSIZE64 = 0x80081272 - BLKPBSZGET = 0x127b - BLKRAGET = 0x1263 - BLKRASET = 0x1262 - BLKROGET = 0x125e - BLKROSET = 0x125d - BLKRRPART = 0x125f - BLKSECTGET = 0x1267 - BLKSECTSET = 0x1266 - BLKSSZGET = 0x1268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x800 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - FP_XSTATE_MAGIC2 = 0x46505845 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0x5 - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_32BIT = 0x40 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x20000 - MAP_SYNC = 0x80000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x40 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0xb703 - NS_GET_OWNER_UID = 0xb704 - NS_GET_PARENT = 0xb702 - NS_GET_USERNS = 0xb701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x4000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x2401 - PERF_EVENT_IOC_ENABLE = 0x2400 - PERF_EVENT_IOC_ID = 0x80082407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 - PERF_EVENT_IOC_PERIOD = 0x40082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc008240a - PERF_EVENT_IOC_REFRESH = 0x2402 - PERF_EVENT_IOC_RESET = 0x2403 - PERF_EVENT_IOC_SET_BPF = 0x40042408 - PERF_EVENT_IOC_SET_FILTER = 0x40082406 - PERF_EVENT_IOC_SET_OUTPUT = 0x2405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x4004743d - PPPIOCATTCHAN = 0x40047438 - PPPIOCCONNECT = 0x4004743a - PPPIOCDETACH = 0x4004743c - PPPIOCDISCONN = 0x7439 - PPPIOCGASYNCMAP = 0x80047458 - PPPIOCGCHAN = 0x80047437 - PPPIOCGDEBUG = 0x80047441 - PPPIOCGFLAGS = 0x8004745a - PPPIOCGIDLE = 0x8010743f - PPPIOCGL2TPSTATS = 0x80487436 - PPPIOCGMRU = 0x80047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x80047455 - PPPIOCGUNIT = 0x80047456 - PPPIOCGXASYNCMAP = 0x80207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x40107446 - PPPIOCSASYNCMAP = 0x40047457 - PPPIOCSCOMPRESS = 0x4010744d - PPPIOCSDEBUG = 0x40047440 - PPPIOCSFLAGS = 0x40047459 - PPPIOCSMAXCID = 0x40047451 - PPPIOCSMRRU = 0x4004743b - PPPIOCSMRU = 0x40047452 - PPPIOCSNPMODE = 0x4008744b - PPPIOCSPASS = 0x40107447 - PPPIOCSRASYNCMAP = 0x40047454 - PPPIOCSXASYNCMAP = 0x4020744f - PPPIOCXFERUNIT = 0x744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffffffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ARCH_PRCTL = 0x1e - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETFPXREGS = 0x12 - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPREGS = 0xf - PTRACE_SETFPXREGS = 0x13 - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SINGLEBLOCK = 0x21 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_SYSEMU = 0x1f - PTRACE_SYSEMU_SINGLESTEP = 0x20 - PTRACE_TRACEME = 0x0 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x8 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x7 - RLIMIT_NPROC = 0x6 - RLIMIT_RSS = 0x5 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x40085203 - RNDADDTOENTCNT = 0x40045201 - RNDCLEARPOOL = 0x5206 - RNDGETENTCNT = 0x80045200 - RNDGETPOOL = 0x80085202 - RNDRESEEDCRNG = 0x5207 - RNDZAPENTCNT = 0x5204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x7002 - RTC_AIE_ON = 0x7001 - RTC_ALM_READ = 0x80247008 - RTC_ALM_SET = 0x40247007 - RTC_EPOCH_READ = 0x8008700d - RTC_EPOCH_SET = 0x4008700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x8008700b - RTC_IRQP_SET = 0x4008700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x7006 - RTC_PIE_ON = 0x7005 - RTC_PLL_GET = 0x80207011 - RTC_PLL_SET = 0x40207012 - RTC_RD_TIME = 0x80247009 - RTC_SET_TIME = 0x4024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x7004 - RTC_UIE_ON = 0x7003 - RTC_VL_CLR = 0x7014 - RTC_VL_READ = 0x80047013 - RTC_WIE_OFF = 0x7010 - RTC_WIE_ON = 0x700f - RTC_WKALM_RD = 0x80287010 - RTC_WKALM_SET = 0x4028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x8904 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x80108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x80108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x541b - SIOCOUTQ = 0x5411 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x11 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x14 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x3 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGISO7816 = 0x80285442 - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGPTPEER = 0x5441 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x100 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x401054d5 - TUNDETACHFILTER = 0x401054d6 - TUNGETDEVNETNS = 0x54e3 - TUNGETFEATURES = 0x800454cf - TUNGETFILTER = 0x801054db - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETBE = 0x800454df - TUNGETVNETHDRSZ = 0x800454d7 - TUNGETVNETLE = 0x800454dd - TUNSETCARRIER = 0x400454e2 - TUNSETDEBUG = 0x400454c9 - TUNSETFILTEREBPF = 0x800454e1 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETIFINDEX = 0x400454da - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETQUEUE = 0x400454d9 - TUNSETSNDBUF = 0x400454d4 - TUNSETSTEERINGEBPF = 0x800454e0 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETBE = 0x400454de - TUNSETVNETHDRSZ = 0x400454d8 - TUNSETVNETLE = 0x400454dc - UBI_IOCATT = 0x40186f40 - UBI_IOCDET = 0x40046f41 - UBI_IOCEBCH = 0x40044f02 - UBI_IOCEBER = 0x40044f01 - UBI_IOCEBISMAP = 0x80044f05 - UBI_IOCEBMAP = 0x40084f03 - UBI_IOCEBUNMAP = 0x40044f04 - UBI_IOCMKVOL = 0x40986f00 - UBI_IOCRMVOL = 0x40046f01 - UBI_IOCRNVOL = 0x51106f03 - UBI_IOCRPEB = 0x40046f04 - UBI_IOCRSVOL = 0x400c6f02 - UBI_IOCSETVOLPROP = 0x40104f06 - UBI_IOCSPEB = 0x40046f05 - UBI_IOCVOLCRBLK = 0x40804f07 - UBI_IOCVOLRMBLK = 0x4f08 - UBI_IOCVOLUP = 0x40084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x6 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x80045702 - WDIOC_GETPRETIMEOUT = 0x80045709 - WDIOC_GETSTATUS = 0x80045701 - WDIOC_GETSUPPORT = 0x80285700 - WDIOC_GETTEMP = 0x80045703 - WDIOC_GETTIMELEFT = 0x8004570a - WDIOC_GETTIMEOUT = 0x80045707 - WDIOC_KEEPALIVE = 0x80045705 - WDIOC_SETOPTIONS = 0x80045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FP_XSTATE_MAGIC2 = 0x46505845 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8010743f + PPPIOCGIDLE32 = 0x8008743f + PPPIOCGIDLE64 = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40107446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x4010744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40107447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ARCH_PRCTL = 0x1e + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8008700d + RTC_EPOCH_SET = 0x4008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8008700b + RTC_IRQP_SET = 0x4008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x80207011 + RTC_PLL_SET = 0x40207012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x80285442 + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETDEVNETNS = 0x54e3 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 3e02dcff..c69ddf6f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -11,2767 +11,2846 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x80041270 - BLKBSZSET = 0x40041271 - BLKFLSBUF = 0x1261 - BLKFRAGET = 0x1265 - BLKFRASET = 0x1264 - BLKGETSIZE = 0x1260 - BLKGETSIZE64 = 0x80041272 - BLKPBSZGET = 0x127b - BLKRAGET = 0x1263 - BLKRASET = 0x1262 - BLKROGET = 0x125e - BLKROSET = 0x125d - BLKRRPART = 0x125f - BLKSECTGET = 0x1267 - BLKSECTSET = 0x1266 - BLKSSZGET = 0x1268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x800 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0xc - F_GETLK64 = 0xc - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0xd - F_SETLK64 = 0xd - F_SETLKW = 0xe - F_SETLKW64 = 0xe - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x20000 - MAP_SYNC = 0x80000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x20 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0xb703 - NS_GET_OWNER_UID = 0xb704 - NS_GET_PARENT = 0xb702 - NS_GET_USERNS = 0xb701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x10000 - O_DIRECTORY = 0x4000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x20000 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x8000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x404000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x2401 - PERF_EVENT_IOC_ENABLE = 0x2400 - PERF_EVENT_IOC_ID = 0x80042407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4004240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 - PERF_EVENT_IOC_PERIOD = 0x40082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc004240a - PERF_EVENT_IOC_REFRESH = 0x2402 - PERF_EVENT_IOC_RESET = 0x2403 - PERF_EVENT_IOC_SET_BPF = 0x40042408 - PERF_EVENT_IOC_SET_FILTER = 0x40042406 - PERF_EVENT_IOC_SET_OUTPUT = 0x2405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x4004743d - PPPIOCATTCHAN = 0x40047438 - PPPIOCCONNECT = 0x4004743a - PPPIOCDETACH = 0x4004743c - PPPIOCDISCONN = 0x7439 - PPPIOCGASYNCMAP = 0x80047458 - PPPIOCGCHAN = 0x80047437 - PPPIOCGDEBUG = 0x80047441 - PPPIOCGFLAGS = 0x8004745a - PPPIOCGIDLE = 0x8008743f - PPPIOCGL2TPSTATS = 0x80487436 - PPPIOCGMRU = 0x80047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x80047455 - PPPIOCGUNIT = 0x80047456 - PPPIOCGXASYNCMAP = 0x80207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x40087446 - PPPIOCSASYNCMAP = 0x40047457 - PPPIOCSCOMPRESS = 0x400c744d - PPPIOCSDEBUG = 0x40047440 - PPPIOCSFLAGS = 0x40047459 - PPPIOCSMAXCID = 0x40047451 - PPPIOCSMRRU = 0x4004743b - PPPIOCSMRU = 0x40047452 - PPPIOCSNPMODE = 0x4008744b - PPPIOCSPASS = 0x40087447 - PPPIOCSRASYNCMAP = 0x40047454 - PPPIOCSXASYNCMAP = 0x4020744f - PPPIOCXFERUNIT = 0x744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETCRUNCHREGS = 0x19 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFDPIC = 0x1f - PTRACE_GETFDPIC_EXEC = 0x0 - PTRACE_GETFDPIC_INTERP = 0x1 - PTRACE_GETFPREGS = 0xe - PTRACE_GETHBPREGS = 0x1d - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GETVFPREGS = 0x1b - PTRACE_GETWMMXREGS = 0x12 - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_GET_THREAD_AREA = 0x16 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETCRUNCHREGS = 0x1a - PTRACE_SETFPREGS = 0xf - PTRACE_SETHBPREGS = 0x1e - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SETVFPREGS = 0x1c - PTRACE_SETWMMXREGS = 0x13 - PTRACE_SET_SYSCALL = 0x17 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_TRACEME = 0x0 - PT_DATA_ADDR = 0x10004 - PT_TEXT_ADDR = 0x10000 - PT_TEXT_END_ADDR = 0x10008 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x8 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x7 - RLIMIT_NPROC = 0x6 - RLIMIT_RSS = 0x5 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x40085203 - RNDADDTOENTCNT = 0x40045201 - RNDCLEARPOOL = 0x5206 - RNDGETENTCNT = 0x80045200 - RNDGETPOOL = 0x80085202 - RNDRESEEDCRNG = 0x5207 - RNDZAPENTCNT = 0x5204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x7002 - RTC_AIE_ON = 0x7001 - RTC_ALM_READ = 0x80247008 - RTC_ALM_SET = 0x40247007 - RTC_EPOCH_READ = 0x8004700d - RTC_EPOCH_SET = 0x4004700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x8004700b - RTC_IRQP_SET = 0x4004700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x7006 - RTC_PIE_ON = 0x7005 - RTC_PLL_GET = 0x801c7011 - RTC_PLL_SET = 0x401c7012 - RTC_RD_TIME = 0x80247009 - RTC_SET_TIME = 0x4024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x7004 - RTC_UIE_ON = 0x7003 - RTC_VL_CLR = 0x7014 - RTC_VL_READ = 0x80047013 - RTC_WIE_OFF = 0x7010 - RTC_WIE_ON = 0x700f - RTC_WKALM_RD = 0x80287010 - RTC_WKALM_SET = 0x4028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x8904 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x80108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x80108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x541b - SIOCOUTQ = 0x5411 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x11 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x14 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x3 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGISO7816 = 0x80285442 - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGPTPEER = 0x5441 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x100 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x400854d5 - TUNDETACHFILTER = 0x400854d6 - TUNGETDEVNETNS = 0x54e3 - TUNGETFEATURES = 0x800454cf - TUNGETFILTER = 0x800854db - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETBE = 0x800454df - TUNGETVNETHDRSZ = 0x800454d7 - TUNGETVNETLE = 0x800454dd - TUNSETCARRIER = 0x400454e2 - TUNSETDEBUG = 0x400454c9 - TUNSETFILTEREBPF = 0x800454e1 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETIFINDEX = 0x400454da - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETQUEUE = 0x400454d9 - TUNSETSNDBUF = 0x400454d4 - TUNSETSTEERINGEBPF = 0x800454e0 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETBE = 0x400454de - TUNSETVNETHDRSZ = 0x400454d8 - TUNSETVNETLE = 0x400454dc - UBI_IOCATT = 0x40186f40 - UBI_IOCDET = 0x40046f41 - UBI_IOCEBCH = 0x40044f02 - UBI_IOCEBER = 0x40044f01 - UBI_IOCEBISMAP = 0x80044f05 - UBI_IOCEBMAP = 0x40084f03 - UBI_IOCEBUNMAP = 0x40044f04 - UBI_IOCMKVOL = 0x40986f00 - UBI_IOCRMVOL = 0x40046f01 - UBI_IOCRNVOL = 0x51106f03 - UBI_IOCRPEB = 0x40046f04 - UBI_IOCRSVOL = 0x400c6f02 - UBI_IOCSETVOLPROP = 0x40104f06 - UBI_IOCSPEB = 0x40046f05 - UBI_IOCVOLCRBLK = 0x40804f07 - UBI_IOCVOLRMBLK = 0x4f08 - UBI_IOCVOLUP = 0x40084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x6 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x80045702 - WDIOC_GETPRETIMEOUT = 0x80045709 - WDIOC_GETSTATUS = 0x80045701 - WDIOC_GETSUPPORT = 0x80285700 - WDIOC_GETTEMP = 0x80045703 - WDIOC_GETTIMELEFT = 0x8004570a - WDIOC_GETTIMEOUT = 0x80045707 - WDIOC_KEEPALIVE = 0x80045705 - WDIOC_SETOPTIONS = 0x80045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x20 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x20 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x20000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4004240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8008743f + PPPIOCGIDLE32 = 0x8008743f + PPPIOCGIDLE64 = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40087446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x400c744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40087447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETCRUNCHREGS = 0x19 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFDPIC = 0x1f + PTRACE_GETFDPIC_EXEC = 0x0 + PTRACE_GETFDPIC_INTERP = 0x1 + PTRACE_GETFPREGS = 0xe + PTRACE_GETHBPREGS = 0x1d + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVFPREGS = 0x1b + PTRACE_GETWMMXREGS = 0x12 + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_THREAD_AREA = 0x16 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETCRUNCHREGS = 0x1a + PTRACE_SETFPREGS = 0xf + PTRACE_SETHBPREGS = 0x1e + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVFPREGS = 0x1c + PTRACE_SETWMMXREGS = 0x13 + PTRACE_SET_SYSCALL = 0x17 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_TRACEME = 0x0 + PT_DATA_ADDR = 0x10004 + PT_TEXT_ADDR = 0x10000 + PT_TEXT_END_ADDR = 0x10008 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8004700d + RTC_EPOCH_SET = 0x4004700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8004700b + RTC_IRQP_SET = 0x4004700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x801c7011 + RTC_PLL_SET = 0x401c7012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x80285442 + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETDEVNETNS = 0x54e3 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 2293f8bb..4a14044f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -11,2754 +11,2833 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x80081270 - BLKBSZSET = 0x40081271 - BLKFLSBUF = 0x1261 - BLKFRAGET = 0x1265 - BLKFRASET = 0x1264 - BLKGETSIZE = 0x1260 - BLKGETSIZE64 = 0x80081272 - BLKPBSZGET = 0x127b - BLKRAGET = 0x1263 - BLKRASET = 0x1262 - BLKROGET = 0x125e - BLKROSET = 0x125d - BLKRRPART = 0x125f - BLKSECTGET = 0x1267 - BLKSECTSET = 0x1266 - BLKSSZGET = 0x1268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x800 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ESR_MAGIC = 0x45535201 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - EXTRA_MAGIC = 0x45585401 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - FPSIMD_MAGIC = 0x46508001 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0x5 - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x20000 - MAP_SYNC = 0x80000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x40 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0xb703 - NS_GET_OWNER_UID = 0xb704 - NS_GET_PARENT = 0xb702 - NS_GET_USERNS = 0xb701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x10000 - O_DIRECTORY = 0x4000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x8000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x404000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x2401 - PERF_EVENT_IOC_ENABLE = 0x2400 - PERF_EVENT_IOC_ID = 0x80082407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 - PERF_EVENT_IOC_PERIOD = 0x40082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc008240a - PERF_EVENT_IOC_REFRESH = 0x2402 - PERF_EVENT_IOC_RESET = 0x2403 - PERF_EVENT_IOC_SET_BPF = 0x40042408 - PERF_EVENT_IOC_SET_FILTER = 0x40082406 - PERF_EVENT_IOC_SET_OUTPUT = 0x2405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x4004743d - PPPIOCATTCHAN = 0x40047438 - PPPIOCCONNECT = 0x4004743a - PPPIOCDETACH = 0x4004743c - PPPIOCDISCONN = 0x7439 - PPPIOCGASYNCMAP = 0x80047458 - PPPIOCGCHAN = 0x80047437 - PPPIOCGDEBUG = 0x80047441 - PPPIOCGFLAGS = 0x8004745a - PPPIOCGIDLE = 0x8010743f - PPPIOCGL2TPSTATS = 0x80487436 - PPPIOCGMRU = 0x80047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x80047455 - PPPIOCGUNIT = 0x80047456 - PPPIOCGXASYNCMAP = 0x80207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x40107446 - PPPIOCSASYNCMAP = 0x40047457 - PPPIOCSCOMPRESS = 0x4010744d - PPPIOCSDEBUG = 0x40047440 - PPPIOCSFLAGS = 0x40047459 - PPPIOCSMAXCID = 0x40047451 - PPPIOCSMRRU = 0x4004743b - PPPIOCSMRU = 0x40047452 - PPPIOCSNPMODE = 0x4008744b - PPPIOCSPASS = 0x40107447 - PPPIOCSRASYNCMAP = 0x40047454 - PPPIOCSXASYNCMAP = 0x4020744f - PPPIOCXFERUNIT = 0x744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffffffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_SYSEMU = 0x1f - PTRACE_SYSEMU_SINGLESTEP = 0x20 - PTRACE_TRACEME = 0x0 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x8 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x7 - RLIMIT_NPROC = 0x6 - RLIMIT_RSS = 0x5 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x40085203 - RNDADDTOENTCNT = 0x40045201 - RNDCLEARPOOL = 0x5206 - RNDGETENTCNT = 0x80045200 - RNDGETPOOL = 0x80085202 - RNDRESEEDCRNG = 0x5207 - RNDZAPENTCNT = 0x5204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x7002 - RTC_AIE_ON = 0x7001 - RTC_ALM_READ = 0x80247008 - RTC_ALM_SET = 0x40247007 - RTC_EPOCH_READ = 0x8008700d - RTC_EPOCH_SET = 0x4008700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x8008700b - RTC_IRQP_SET = 0x4008700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x7006 - RTC_PIE_ON = 0x7005 - RTC_PLL_GET = 0x80207011 - RTC_PLL_SET = 0x40207012 - RTC_RD_TIME = 0x80247009 - RTC_SET_TIME = 0x4024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x7004 - RTC_UIE_ON = 0x7003 - RTC_VL_CLR = 0x7014 - RTC_VL_READ = 0x80047013 - RTC_WIE_OFF = 0x7010 - RTC_WIE_ON = 0x700f - RTC_WKALM_RD = 0x80287010 - RTC_WKALM_SET = 0x4028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x8904 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x80108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x80108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x541b - SIOCOUTQ = 0x5411 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x11 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x14 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x3 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SVE_MAGIC = 0x53564501 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGISO7816 = 0x80285442 - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGPTPEER = 0x5441 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x100 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x401054d5 - TUNDETACHFILTER = 0x401054d6 - TUNGETDEVNETNS = 0x54e3 - TUNGETFEATURES = 0x800454cf - TUNGETFILTER = 0x801054db - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETBE = 0x800454df - TUNGETVNETHDRSZ = 0x800454d7 - TUNGETVNETLE = 0x800454dd - TUNSETCARRIER = 0x400454e2 - TUNSETDEBUG = 0x400454c9 - TUNSETFILTEREBPF = 0x800454e1 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETIFINDEX = 0x400454da - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETQUEUE = 0x400454d9 - TUNSETSNDBUF = 0x400454d4 - TUNSETSTEERINGEBPF = 0x800454e0 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETBE = 0x400454de - TUNSETVNETHDRSZ = 0x400454d8 - TUNSETVNETLE = 0x400454dc - UBI_IOCATT = 0x40186f40 - UBI_IOCDET = 0x40046f41 - UBI_IOCEBCH = 0x40044f02 - UBI_IOCEBER = 0x40044f01 - UBI_IOCEBISMAP = 0x80044f05 - UBI_IOCEBMAP = 0x40084f03 - UBI_IOCEBUNMAP = 0x40044f04 - UBI_IOCMKVOL = 0x40986f00 - UBI_IOCRMVOL = 0x40046f01 - UBI_IOCRNVOL = 0x51106f03 - UBI_IOCRPEB = 0x40046f04 - UBI_IOCRSVOL = 0x400c6f02 - UBI_IOCSETVOLPROP = 0x40104f06 - UBI_IOCSPEB = 0x40046f05 - UBI_IOCVOLCRBLK = 0x40804f07 - UBI_IOCVOLRMBLK = 0x4f08 - UBI_IOCVOLUP = 0x40084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x6 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x80045702 - WDIOC_GETPRETIMEOUT = 0x80045709 - WDIOC_GETSTATUS = 0x80045701 - WDIOC_GETSUPPORT = 0x80285700 - WDIOC_GETTEMP = 0x80045703 - WDIOC_GETTIMELEFT = 0x8004570a - WDIOC_GETTIMEOUT = 0x80045707 - WDIOC_KEEPALIVE = 0x80045705 - WDIOC_SETOPTIONS = 0x80045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ESR_MAGIC = 0x45535201 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + EXTRA_MAGIC = 0x45585401 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FPSIMD_MAGIC = 0x46508001 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8010743f + PPPIOCGIDLE32 = 0x8008743f + PPPIOCGIDLE64 = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40107446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x4010744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40107447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8008700d + RTC_EPOCH_SET = 0x4008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8008700b + RTC_IRQP_SET = 0x4008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x80207011 + RTC_PLL_SET = 0x40207012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SVE_MAGIC = 0x53564501 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x80285442 + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETDEVNETNS = 0x54e3 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 57742ea2..1bbc52c7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -11,2763 +11,2842 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x40041270 - BLKBSZSET = 0x80041271 - BLKFLSBUF = 0x20001261 - BLKFRAGET = 0x20001265 - BLKFRASET = 0x20001264 - BLKGETSIZE = 0x20001260 - BLKGETSIZE64 = 0x40041272 - BLKPBSZGET = 0x2000127b - BLKRAGET = 0x20001263 - BLKRASET = 0x20001262 - BLKROGET = 0x2000125e - BLKROSET = 0x2000125d - BLKRRPART = 0x2000125f - BLKSECTGET = 0x20001267 - BLKSECTSET = 0x20001266 - BLKSSZGET = 0x20001268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x80 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x2000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x21 - F_GETLK64 = 0x21 - F_GETOWN = 0x17 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x22 - F_SETLK64 = 0x22 - F_SETLKW = 0x23 - F_SETLKW64 = 0x23 - F_SETOWN = 0x18 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x100 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x80 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x800 - MAP_ANONYMOUS = 0x800 - MAP_DENYWRITE = 0x2000 - MAP_EXECUTABLE = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x1000 - MAP_HUGETLB = 0x80000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x8000 - MAP_NONBLOCK = 0x20000 - MAP_NORESERVE = 0x400 - MAP_POPULATE = 0x10000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x800 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x40000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x20 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0x2000b703 - NS_GET_OWNER_UID = 0x2000b704 - NS_GET_PARENT = 0x2000b702 - NS_GET_USERNS = 0x2000b701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x1000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x100 - O_DIRECT = 0x8000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x10 - O_EXCL = 0x400 - O_FSYNC = 0x4010 - O_LARGEFILE = 0x2000 - O_NDELAY = 0x80 - O_NOATIME = 0x40000 - O_NOCTTY = 0x800 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x80 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x4010 - O_SYNC = 0x4010 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x20002401 - PERF_EVENT_IOC_ENABLE = 0x20002400 - PERF_EVENT_IOC_ID = 0x40042407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8004240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 - PERF_EVENT_IOC_PERIOD = 0x80082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc004240a - PERF_EVENT_IOC_REFRESH = 0x20002402 - PERF_EVENT_IOC_RESET = 0x20002403 - PERF_EVENT_IOC_SET_BPF = 0x80042408 - PERF_EVENT_IOC_SET_FILTER = 0x80042406 - PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x8004743d - PPPIOCATTCHAN = 0x80047438 - PPPIOCCONNECT = 0x8004743a - PPPIOCDETACH = 0x8004743c - PPPIOCDISCONN = 0x20007439 - PPPIOCGASYNCMAP = 0x40047458 - PPPIOCGCHAN = 0x40047437 - PPPIOCGDEBUG = 0x40047441 - PPPIOCGFLAGS = 0x4004745a - PPPIOCGIDLE = 0x4008743f - PPPIOCGL2TPSTATS = 0x40487436 - PPPIOCGMRU = 0x40047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x40047455 - PPPIOCGUNIT = 0x40047456 - PPPIOCGXASYNCMAP = 0x40207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x80087446 - PPPIOCSASYNCMAP = 0x80047457 - PPPIOCSCOMPRESS = 0x800c744d - PPPIOCSDEBUG = 0x80047440 - PPPIOCSFLAGS = 0x80047459 - PPPIOCSMAXCID = 0x80047451 - PPPIOCSMRRU = 0x8004743b - PPPIOCSMRU = 0x80047452 - PPPIOCSNPMODE = 0x8008744b - PPPIOCSPASS = 0x80087447 - PPPIOCSRASYNCMAP = 0x80047454 - PPPIOCSXASYNCMAP = 0x8020744f - PPPIOCXFERUNIT = 0x2000744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_GET_THREAD_AREA_3264 = 0xc4 - PTRACE_GET_WATCH_REGS = 0xd0 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_3264 = 0xc1 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_3264 = 0xc0 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_3264 = 0xc3 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_3264 = 0xc2 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SET_WATCH_REGS = 0xd1 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_TRACEME = 0x0 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x6 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x9 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x5 - RLIMIT_NPROC = 0x8 - RLIMIT_RSS = 0x7 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x80085203 - RNDADDTOENTCNT = 0x80045201 - RNDCLEARPOOL = 0x20005206 - RNDGETENTCNT = 0x40045200 - RNDGETPOOL = 0x40085202 - RNDRESEEDCRNG = 0x20005207 - RNDZAPENTCNT = 0x20005204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x20007002 - RTC_AIE_ON = 0x20007001 - RTC_ALM_READ = 0x40247008 - RTC_ALM_SET = 0x80247007 - RTC_EPOCH_READ = 0x4004700d - RTC_EPOCH_SET = 0x8004700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x4004700b - RTC_IRQP_SET = 0x8004700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x20007006 - RTC_PIE_ON = 0x20007005 - RTC_PLL_GET = 0x401c7011 - RTC_PLL_SET = 0x801c7012 - RTC_RD_TIME = 0x40247009 - RTC_SET_TIME = 0x8024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x20007004 - RTC_UIE_ON = 0x20007003 - RTC_VL_CLR = 0x20007014 - RTC_VL_READ = 0x40047013 - RTC_WIE_OFF = 0x20007010 - RTC_WIE_ON = 0x2000700f - RTC_WKALM_RD = 0x40287010 - RTC_WKALM_SET = 0x8028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x80 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x40047307 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x40047309 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x40108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x40108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x467f - SIOCOUTQ = 0x7472 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x80047308 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x1 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x80 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x2 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0xffff - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1009 - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x20 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x1029 - SO_DONTROUTE = 0x10 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x1007 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x8 - SO_LINGER = 0x80 - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0x100 - SO_PASSCRED = 0x11 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x12 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1e - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x1028 - SO_RCVBUF = 0x1002 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x1001 - SO_SNDBUFFORCE = 0x1f - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x1005 - SO_STYLE = 0x1008 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x1008 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x5407 - TCGETA = 0x5401 - TCGETS = 0x540d - TCGETS2 = 0x4030542a - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x5410 - TCSBRK = 0x5405 - TCSBRKP = 0x5486 - TCSETA = 0x5402 - TCSETAF = 0x5404 - TCSETAW = 0x5403 - TCSETS = 0x540e - TCSETS2 = 0x8030542b - TCSETSF = 0x5410 - TCSETSF2 = 0x8030542d - TCSETSW = 0x540f - TCSETSW2 = 0x8030542c - TCXONC = 0x5406 - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x80047478 - TIOCEXCL = 0x740d - TIOCGDEV = 0x40045432 - TIOCGETD = 0x7400 - TIOCGETP = 0x7408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x5492 - TIOCGISO7816 = 0x40285442 - TIOCGLCKTRMIOS = 0x548b - TIOCGLTC = 0x7474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGPTPEER = 0x20005441 - TIOCGRS485 = 0x4020542e - TIOCGSERIAL = 0x5484 - TIOCGSID = 0x7416 - TIOCGSOFTCAR = 0x5481 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x467f - TIOCLINUX = 0x5483 - TIOCMBIC = 0x741c - TIOCMBIS = 0x741b - TIOCMGET = 0x741d - TIOCMIWAIT = 0x5491 - TIOCMSET = 0x741a - TIOCM_CAR = 0x100 - TIOCM_CD = 0x100 - TIOCM_CTS = 0x40 - TIOCM_DSR = 0x400 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x200 - TIOCM_RNG = 0x200 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x20 - TIOCM_ST = 0x10 - TIOCNOTTY = 0x5471 - TIOCNXCL = 0x740e - TIOCOUTQ = 0x7472 - TIOCPKT = 0x5470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x5480 - TIOCSERCONFIG = 0x5488 - TIOCSERGETLSR = 0x548e - TIOCSERGETMULTI = 0x548f - TIOCSERGSTRUCT = 0x548d - TIOCSERGWILD = 0x5489 - TIOCSERSETMULTI = 0x5490 - TIOCSERSWILD = 0x548a - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x7401 - TIOCSETN = 0x740a - TIOCSETP = 0x7409 - TIOCSIG = 0x80045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x548c - TIOCSLTC = 0x7475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0xc020542f - TIOCSSERIAL = 0x5485 - TIOCSSOFTCAR = 0x5482 - TIOCSTI = 0x5472 - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x8000 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x800854d5 - TUNDETACHFILTER = 0x800854d6 - TUNGETDEVNETNS = 0x200054e3 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x400854db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETCARRIER = 0x800454e2 - TUNSETDEBUG = 0x800454c9 - TUNSETFILTEREBPF = 0x400454e1 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETSTEERINGEBPF = 0x400454e0 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - UBI_IOCATT = 0x80186f40 - UBI_IOCDET = 0x80046f41 - UBI_IOCEBCH = 0x80044f02 - UBI_IOCEBER = 0x80044f01 - UBI_IOCEBISMAP = 0x40044f05 - UBI_IOCEBMAP = 0x80084f03 - UBI_IOCEBUNMAP = 0x80044f04 - UBI_IOCMKVOL = 0x80986f00 - UBI_IOCRMVOL = 0x80046f01 - UBI_IOCRNVOL = 0x91106f03 - UBI_IOCRPEB = 0x80046f04 - UBI_IOCRSVOL = 0x800c6f02 - UBI_IOCSETVOLPROP = 0x80104f06 - UBI_IOCSPEB = 0x80046f05 - UBI_IOCVOLCRBLK = 0x80804f07 - UBI_IOCVOLRMBLK = 0x20004f08 - UBI_IOCVOLUP = 0x80084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x10 - VEOL = 0x11 - VEOL2 = 0x6 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x4 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VSWTCH = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x40045702 - WDIOC_GETPRETIMEOUT = 0x40045709 - WDIOC_GETSTATUS = 0x40045701 - WDIOC_GETSUPPORT = 0x40285700 - WDIOC_GETTEMP = 0x40045703 - WDIOC_GETTIMELEFT = 0x4004570a - WDIOC_GETTIMEOUT = 0x40045707 - WDIOC_KEEPALIVE = 0x40045705 - WDIOC_SETOPTIONS = 0x40045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x20 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x20 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8004240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4008743f + PPPIOCGIDLE32 = 0x4008743f + PPPIOCGIDLE64 = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80087446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x800c744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80087447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4004700d + RTC_EPOCH_SET = 0x8004700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4004700b + RTC_IRQP_SET = 0x8004700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x401c7011 + RTC_PLL_SET = 0x801c7012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x80 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGISO7816 = 0x40285442 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETDEVNETNS = 0x200054e3 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 33bfa6cb..2b339ef5 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -11,2763 +11,2842 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x40081270 - BLKBSZSET = 0x80081271 - BLKFLSBUF = 0x20001261 - BLKFRAGET = 0x20001265 - BLKFRASET = 0x20001264 - BLKGETSIZE = 0x20001260 - BLKGETSIZE64 = 0x40081272 - BLKPBSZGET = 0x2000127b - BLKRAGET = 0x20001263 - BLKRASET = 0x20001262 - BLKROGET = 0x2000125e - BLKROSET = 0x2000125d - BLKRRPART = 0x2000125f - BLKSECTGET = 0x20001267 - BLKSECTSET = 0x20001266 - BLKSSZGET = 0x20001268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x80 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x2000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0xe - F_GETLK64 = 0xe - F_GETOWN = 0x17 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x18 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x100 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x80 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x800 - MAP_ANONYMOUS = 0x800 - MAP_DENYWRITE = 0x2000 - MAP_EXECUTABLE = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x1000 - MAP_HUGETLB = 0x80000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x8000 - MAP_NONBLOCK = 0x20000 - MAP_NORESERVE = 0x400 - MAP_POPULATE = 0x10000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x800 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x40000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x40 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0x2000b703 - NS_GET_OWNER_UID = 0x2000b704 - NS_GET_PARENT = 0x2000b702 - NS_GET_USERNS = 0x2000b701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x1000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x100 - O_DIRECT = 0x8000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x10 - O_EXCL = 0x400 - O_FSYNC = 0x4010 - O_LARGEFILE = 0x0 - O_NDELAY = 0x80 - O_NOATIME = 0x40000 - O_NOCTTY = 0x800 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x80 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x4010 - O_SYNC = 0x4010 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x20002401 - PERF_EVENT_IOC_ENABLE = 0x20002400 - PERF_EVENT_IOC_ID = 0x40082407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 - PERF_EVENT_IOC_PERIOD = 0x80082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc008240a - PERF_EVENT_IOC_REFRESH = 0x20002402 - PERF_EVENT_IOC_RESET = 0x20002403 - PERF_EVENT_IOC_SET_BPF = 0x80042408 - PERF_EVENT_IOC_SET_FILTER = 0x80082406 - PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x8004743d - PPPIOCATTCHAN = 0x80047438 - PPPIOCCONNECT = 0x8004743a - PPPIOCDETACH = 0x8004743c - PPPIOCDISCONN = 0x20007439 - PPPIOCGASYNCMAP = 0x40047458 - PPPIOCGCHAN = 0x40047437 - PPPIOCGDEBUG = 0x40047441 - PPPIOCGFLAGS = 0x4004745a - PPPIOCGIDLE = 0x4010743f - PPPIOCGL2TPSTATS = 0x40487436 - PPPIOCGMRU = 0x40047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x40047455 - PPPIOCGUNIT = 0x40047456 - PPPIOCGXASYNCMAP = 0x40207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x80107446 - PPPIOCSASYNCMAP = 0x80047457 - PPPIOCSCOMPRESS = 0x8010744d - PPPIOCSDEBUG = 0x80047440 - PPPIOCSFLAGS = 0x80047459 - PPPIOCSMAXCID = 0x80047451 - PPPIOCSMRRU = 0x8004743b - PPPIOCSMRU = 0x80047452 - PPPIOCSNPMODE = 0x8008744b - PPPIOCSPASS = 0x80107447 - PPPIOCSRASYNCMAP = 0x80047454 - PPPIOCSXASYNCMAP = 0x8020744f - PPPIOCXFERUNIT = 0x2000744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffffffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_GET_THREAD_AREA_3264 = 0xc4 - PTRACE_GET_WATCH_REGS = 0xd0 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_3264 = 0xc1 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_3264 = 0xc0 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_3264 = 0xc3 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_3264 = 0xc2 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SET_WATCH_REGS = 0xd1 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_TRACEME = 0x0 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x6 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x9 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x5 - RLIMIT_NPROC = 0x8 - RLIMIT_RSS = 0x7 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x80085203 - RNDADDTOENTCNT = 0x80045201 - RNDCLEARPOOL = 0x20005206 - RNDGETENTCNT = 0x40045200 - RNDGETPOOL = 0x40085202 - RNDRESEEDCRNG = 0x20005207 - RNDZAPENTCNT = 0x20005204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x20007002 - RTC_AIE_ON = 0x20007001 - RTC_ALM_READ = 0x40247008 - RTC_ALM_SET = 0x80247007 - RTC_EPOCH_READ = 0x4008700d - RTC_EPOCH_SET = 0x8008700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x4008700b - RTC_IRQP_SET = 0x8008700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x20007006 - RTC_PIE_ON = 0x20007005 - RTC_PLL_GET = 0x40207011 - RTC_PLL_SET = 0x80207012 - RTC_RD_TIME = 0x40247009 - RTC_SET_TIME = 0x8024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x20007004 - RTC_UIE_ON = 0x20007003 - RTC_VL_CLR = 0x20007014 - RTC_VL_READ = 0x40047013 - RTC_WIE_OFF = 0x20007010 - RTC_WIE_ON = 0x2000700f - RTC_WKALM_RD = 0x40287010 - RTC_WKALM_SET = 0x8028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x80 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x40047307 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x40047309 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x40108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x40108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x467f - SIOCOUTQ = 0x7472 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x80047308 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x1 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x80 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x2 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0xffff - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1009 - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x20 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x1029 - SO_DONTROUTE = 0x10 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x1007 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x8 - SO_LINGER = 0x80 - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0x100 - SO_PASSCRED = 0x11 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x12 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1e - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x1028 - SO_RCVBUF = 0x1002 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x1001 - SO_SNDBUFFORCE = 0x1f - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x1005 - SO_STYLE = 0x1008 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x1008 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x5407 - TCGETA = 0x5401 - TCGETS = 0x540d - TCGETS2 = 0x4030542a - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x5410 - TCSBRK = 0x5405 - TCSBRKP = 0x5486 - TCSETA = 0x5402 - TCSETAF = 0x5404 - TCSETAW = 0x5403 - TCSETS = 0x540e - TCSETS2 = 0x8030542b - TCSETSF = 0x5410 - TCSETSF2 = 0x8030542d - TCSETSW = 0x540f - TCSETSW2 = 0x8030542c - TCXONC = 0x5406 - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x80047478 - TIOCEXCL = 0x740d - TIOCGDEV = 0x40045432 - TIOCGETD = 0x7400 - TIOCGETP = 0x7408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x5492 - TIOCGISO7816 = 0x40285442 - TIOCGLCKTRMIOS = 0x548b - TIOCGLTC = 0x7474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGPTPEER = 0x20005441 - TIOCGRS485 = 0x4020542e - TIOCGSERIAL = 0x5484 - TIOCGSID = 0x7416 - TIOCGSOFTCAR = 0x5481 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x467f - TIOCLINUX = 0x5483 - TIOCMBIC = 0x741c - TIOCMBIS = 0x741b - TIOCMGET = 0x741d - TIOCMIWAIT = 0x5491 - TIOCMSET = 0x741a - TIOCM_CAR = 0x100 - TIOCM_CD = 0x100 - TIOCM_CTS = 0x40 - TIOCM_DSR = 0x400 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x200 - TIOCM_RNG = 0x200 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x20 - TIOCM_ST = 0x10 - TIOCNOTTY = 0x5471 - TIOCNXCL = 0x740e - TIOCOUTQ = 0x7472 - TIOCPKT = 0x5470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x5480 - TIOCSERCONFIG = 0x5488 - TIOCSERGETLSR = 0x548e - TIOCSERGETMULTI = 0x548f - TIOCSERGSTRUCT = 0x548d - TIOCSERGWILD = 0x5489 - TIOCSERSETMULTI = 0x5490 - TIOCSERSWILD = 0x548a - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x7401 - TIOCSETN = 0x740a - TIOCSETP = 0x7409 - TIOCSIG = 0x80045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x548c - TIOCSLTC = 0x7475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0xc020542f - TIOCSSERIAL = 0x5485 - TIOCSSOFTCAR = 0x5482 - TIOCSTI = 0x5472 - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x8000 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x801054d5 - TUNDETACHFILTER = 0x801054d6 - TUNGETDEVNETNS = 0x200054e3 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x401054db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETCARRIER = 0x800454e2 - TUNSETDEBUG = 0x800454c9 - TUNSETFILTEREBPF = 0x400454e1 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETSTEERINGEBPF = 0x400454e0 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - UBI_IOCATT = 0x80186f40 - UBI_IOCDET = 0x80046f41 - UBI_IOCEBCH = 0x80044f02 - UBI_IOCEBER = 0x80044f01 - UBI_IOCEBISMAP = 0x40044f05 - UBI_IOCEBMAP = 0x80084f03 - UBI_IOCEBUNMAP = 0x80044f04 - UBI_IOCMKVOL = 0x80986f00 - UBI_IOCRMVOL = 0x80046f01 - UBI_IOCRNVOL = 0x91106f03 - UBI_IOCRPEB = 0x80046f04 - UBI_IOCRSVOL = 0x800c6f02 - UBI_IOCSETVOLPROP = 0x80104f06 - UBI_IOCSPEB = 0x80046f05 - UBI_IOCVOLCRBLK = 0x80804f07 - UBI_IOCVOLRMBLK = 0x20004f08 - UBI_IOCVOLUP = 0x80084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x10 - VEOL = 0x11 - VEOL2 = 0x6 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x4 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VSWTCH = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x40045702 - WDIOC_GETPRETIMEOUT = 0x40045709 - WDIOC_GETSTATUS = 0x40045701 - WDIOC_GETSUPPORT = 0x40285700 - WDIOC_GETTEMP = 0x40045703 - WDIOC_GETTIMELEFT = 0x4004570a - WDIOC_GETTIMEOUT = 0x40045707 - WDIOC_KEEPALIVE = 0x40045705 - WDIOC_SETOPTIONS = 0x40045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4010743f + PPPIOCGIDLE32 = 0x4008743f + PPPIOCGIDLE64 = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80107446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x8010744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80107447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4008700d + RTC_EPOCH_SET = 0x8008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4008700b + RTC_IRQP_SET = 0x8008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x40207011 + RTC_PLL_SET = 0x80207012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x80 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGISO7816 = 0x40285442 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 89fd414e..1c697f34 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -11,2763 +11,2842 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x40081270 - BLKBSZSET = 0x80081271 - BLKFLSBUF = 0x20001261 - BLKFRAGET = 0x20001265 - BLKFRASET = 0x20001264 - BLKGETSIZE = 0x20001260 - BLKGETSIZE64 = 0x40081272 - BLKPBSZGET = 0x2000127b - BLKRAGET = 0x20001263 - BLKRASET = 0x20001262 - BLKROGET = 0x2000125e - BLKROSET = 0x2000125d - BLKRRPART = 0x2000125f - BLKSECTGET = 0x20001267 - BLKSECTSET = 0x20001266 - BLKSSZGET = 0x20001268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x80 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x2000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0xe - F_GETLK64 = 0xe - F_GETOWN = 0x17 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x18 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x100 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x80 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x800 - MAP_ANONYMOUS = 0x800 - MAP_DENYWRITE = 0x2000 - MAP_EXECUTABLE = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x1000 - MAP_HUGETLB = 0x80000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x8000 - MAP_NONBLOCK = 0x20000 - MAP_NORESERVE = 0x400 - MAP_POPULATE = 0x10000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x800 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x40000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x40 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0x2000b703 - NS_GET_OWNER_UID = 0x2000b704 - NS_GET_PARENT = 0x2000b702 - NS_GET_USERNS = 0x2000b701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x1000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x100 - O_DIRECT = 0x8000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x10 - O_EXCL = 0x400 - O_FSYNC = 0x4010 - O_LARGEFILE = 0x0 - O_NDELAY = 0x80 - O_NOATIME = 0x40000 - O_NOCTTY = 0x800 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x80 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x4010 - O_SYNC = 0x4010 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x20002401 - PERF_EVENT_IOC_ENABLE = 0x20002400 - PERF_EVENT_IOC_ID = 0x40082407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 - PERF_EVENT_IOC_PERIOD = 0x80082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc008240a - PERF_EVENT_IOC_REFRESH = 0x20002402 - PERF_EVENT_IOC_RESET = 0x20002403 - PERF_EVENT_IOC_SET_BPF = 0x80042408 - PERF_EVENT_IOC_SET_FILTER = 0x80082406 - PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x8004743d - PPPIOCATTCHAN = 0x80047438 - PPPIOCCONNECT = 0x8004743a - PPPIOCDETACH = 0x8004743c - PPPIOCDISCONN = 0x20007439 - PPPIOCGASYNCMAP = 0x40047458 - PPPIOCGCHAN = 0x40047437 - PPPIOCGDEBUG = 0x40047441 - PPPIOCGFLAGS = 0x4004745a - PPPIOCGIDLE = 0x4010743f - PPPIOCGL2TPSTATS = 0x40487436 - PPPIOCGMRU = 0x40047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x40047455 - PPPIOCGUNIT = 0x40047456 - PPPIOCGXASYNCMAP = 0x40207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x80107446 - PPPIOCSASYNCMAP = 0x80047457 - PPPIOCSCOMPRESS = 0x8010744d - PPPIOCSDEBUG = 0x80047440 - PPPIOCSFLAGS = 0x80047459 - PPPIOCSMAXCID = 0x80047451 - PPPIOCSMRRU = 0x8004743b - PPPIOCSMRU = 0x80047452 - PPPIOCSNPMODE = 0x8008744b - PPPIOCSPASS = 0x80107447 - PPPIOCSRASYNCMAP = 0x80047454 - PPPIOCSXASYNCMAP = 0x8020744f - PPPIOCXFERUNIT = 0x2000744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffffffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_GET_THREAD_AREA_3264 = 0xc4 - PTRACE_GET_WATCH_REGS = 0xd0 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_3264 = 0xc1 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_3264 = 0xc0 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_3264 = 0xc3 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_3264 = 0xc2 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SET_WATCH_REGS = 0xd1 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_TRACEME = 0x0 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x6 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x9 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x5 - RLIMIT_NPROC = 0x8 - RLIMIT_RSS = 0x7 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x80085203 - RNDADDTOENTCNT = 0x80045201 - RNDCLEARPOOL = 0x20005206 - RNDGETENTCNT = 0x40045200 - RNDGETPOOL = 0x40085202 - RNDRESEEDCRNG = 0x20005207 - RNDZAPENTCNT = 0x20005204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x20007002 - RTC_AIE_ON = 0x20007001 - RTC_ALM_READ = 0x40247008 - RTC_ALM_SET = 0x80247007 - RTC_EPOCH_READ = 0x4008700d - RTC_EPOCH_SET = 0x8008700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x4008700b - RTC_IRQP_SET = 0x8008700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x20007006 - RTC_PIE_ON = 0x20007005 - RTC_PLL_GET = 0x40207011 - RTC_PLL_SET = 0x80207012 - RTC_RD_TIME = 0x40247009 - RTC_SET_TIME = 0x8024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x20007004 - RTC_UIE_ON = 0x20007003 - RTC_VL_CLR = 0x20007014 - RTC_VL_READ = 0x40047013 - RTC_WIE_OFF = 0x20007010 - RTC_WIE_ON = 0x2000700f - RTC_WKALM_RD = 0x40287010 - RTC_WKALM_SET = 0x8028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x80 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x40047307 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x40047309 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x40108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x40108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x467f - SIOCOUTQ = 0x7472 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x80047308 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x1 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x80 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x2 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0xffff - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1009 - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x20 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x1029 - SO_DONTROUTE = 0x10 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x1007 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x8 - SO_LINGER = 0x80 - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0x100 - SO_PASSCRED = 0x11 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x12 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1e - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x1028 - SO_RCVBUF = 0x1002 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x1001 - SO_SNDBUFFORCE = 0x1f - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x1005 - SO_STYLE = 0x1008 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x1008 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x5407 - TCGETA = 0x5401 - TCGETS = 0x540d - TCGETS2 = 0x4030542a - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x5410 - TCSBRK = 0x5405 - TCSBRKP = 0x5486 - TCSETA = 0x5402 - TCSETAF = 0x5404 - TCSETAW = 0x5403 - TCSETS = 0x540e - TCSETS2 = 0x8030542b - TCSETSF = 0x5410 - TCSETSF2 = 0x8030542d - TCSETSW = 0x540f - TCSETSW2 = 0x8030542c - TCXONC = 0x5406 - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x80047478 - TIOCEXCL = 0x740d - TIOCGDEV = 0x40045432 - TIOCGETD = 0x7400 - TIOCGETP = 0x7408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x5492 - TIOCGISO7816 = 0x40285442 - TIOCGLCKTRMIOS = 0x548b - TIOCGLTC = 0x7474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGPTPEER = 0x20005441 - TIOCGRS485 = 0x4020542e - TIOCGSERIAL = 0x5484 - TIOCGSID = 0x7416 - TIOCGSOFTCAR = 0x5481 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x467f - TIOCLINUX = 0x5483 - TIOCMBIC = 0x741c - TIOCMBIS = 0x741b - TIOCMGET = 0x741d - TIOCMIWAIT = 0x5491 - TIOCMSET = 0x741a - TIOCM_CAR = 0x100 - TIOCM_CD = 0x100 - TIOCM_CTS = 0x40 - TIOCM_DSR = 0x400 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x200 - TIOCM_RNG = 0x200 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x20 - TIOCM_ST = 0x10 - TIOCNOTTY = 0x5471 - TIOCNXCL = 0x740e - TIOCOUTQ = 0x7472 - TIOCPKT = 0x5470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x5480 - TIOCSERCONFIG = 0x5488 - TIOCSERGETLSR = 0x548e - TIOCSERGETMULTI = 0x548f - TIOCSERGSTRUCT = 0x548d - TIOCSERGWILD = 0x5489 - TIOCSERSETMULTI = 0x5490 - TIOCSERSWILD = 0x548a - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x7401 - TIOCSETN = 0x740a - TIOCSETP = 0x7409 - TIOCSIG = 0x80045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x548c - TIOCSLTC = 0x7475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0xc020542f - TIOCSSERIAL = 0x5485 - TIOCSSOFTCAR = 0x5482 - TIOCSTI = 0x5472 - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x8000 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x801054d5 - TUNDETACHFILTER = 0x801054d6 - TUNGETDEVNETNS = 0x200054e3 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x401054db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETCARRIER = 0x800454e2 - TUNSETDEBUG = 0x800454c9 - TUNSETFILTEREBPF = 0x400454e1 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETSTEERINGEBPF = 0x400454e0 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - UBI_IOCATT = 0x80186f40 - UBI_IOCDET = 0x80046f41 - UBI_IOCEBCH = 0x80044f02 - UBI_IOCEBER = 0x80044f01 - UBI_IOCEBISMAP = 0x40044f05 - UBI_IOCEBMAP = 0x80084f03 - UBI_IOCEBUNMAP = 0x80044f04 - UBI_IOCMKVOL = 0x80986f00 - UBI_IOCRMVOL = 0x80046f01 - UBI_IOCRNVOL = 0x91106f03 - UBI_IOCRPEB = 0x80046f04 - UBI_IOCRSVOL = 0x800c6f02 - UBI_IOCSETVOLPROP = 0x80104f06 - UBI_IOCSPEB = 0x80046f05 - UBI_IOCVOLCRBLK = 0x80804f07 - UBI_IOCVOLRMBLK = 0x20004f08 - UBI_IOCVOLUP = 0x80084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x10 - VEOL = 0x11 - VEOL2 = 0x6 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x4 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VSWTCH = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x40045702 - WDIOC_GETPRETIMEOUT = 0x40045709 - WDIOC_GETSTATUS = 0x40045701 - WDIOC_GETSUPPORT = 0x40285700 - WDIOC_GETTEMP = 0x40045703 - WDIOC_GETTIMELEFT = 0x4004570a - WDIOC_GETTIMEOUT = 0x40045707 - WDIOC_KEEPALIVE = 0x40045705 - WDIOC_SETOPTIONS = 0x40045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4010743f + PPPIOCGIDLE32 = 0x4008743f + PPPIOCGIDLE64 = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80107446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x8010744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80107447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4008700d + RTC_EPOCH_SET = 0x8008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4008700b + RTC_IRQP_SET = 0x8008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x40207011 + RTC_PLL_SET = 0x80207012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x80 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGISO7816 = 0x40285442 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index aabe5e42..264898ce 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -11,2763 +11,2842 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x40041270 - BLKBSZSET = 0x80041271 - BLKFLSBUF = 0x20001261 - BLKFRAGET = 0x20001265 - BLKFRASET = 0x20001264 - BLKGETSIZE = 0x20001260 - BLKGETSIZE64 = 0x40041272 - BLKPBSZGET = 0x2000127b - BLKRAGET = 0x20001263 - BLKRASET = 0x20001262 - BLKROGET = 0x2000125e - BLKROSET = 0x2000125d - BLKRRPART = 0x2000125f - BLKSECTGET = 0x20001267 - BLKSECTSET = 0x20001266 - BLKSSZGET = 0x20001268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x80 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x2000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x21 - F_GETLK64 = 0x21 - F_GETOWN = 0x17 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x22 - F_SETLK64 = 0x22 - F_SETLKW = 0x23 - F_SETLKW64 = 0x23 - F_SETOWN = 0x18 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x100 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x80 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x800 - MAP_ANONYMOUS = 0x800 - MAP_DENYWRITE = 0x2000 - MAP_EXECUTABLE = 0x4000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x1000 - MAP_HUGETLB = 0x80000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x8000 - MAP_NONBLOCK = 0x20000 - MAP_NORESERVE = 0x400 - MAP_POPULATE = 0x10000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x800 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x40000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x20 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0x2000b703 - NS_GET_OWNER_UID = 0x2000b704 - NS_GET_PARENT = 0x2000b702 - NS_GET_USERNS = 0x2000b701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x1000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x100 - O_DIRECT = 0x8000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x10 - O_EXCL = 0x400 - O_FSYNC = 0x4010 - O_LARGEFILE = 0x2000 - O_NDELAY = 0x80 - O_NOATIME = 0x40000 - O_NOCTTY = 0x800 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x80 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x4010 - O_SYNC = 0x4010 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x20002401 - PERF_EVENT_IOC_ENABLE = 0x20002400 - PERF_EVENT_IOC_ID = 0x40042407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8004240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 - PERF_EVENT_IOC_PERIOD = 0x80082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc004240a - PERF_EVENT_IOC_REFRESH = 0x20002402 - PERF_EVENT_IOC_RESET = 0x20002403 - PERF_EVENT_IOC_SET_BPF = 0x80042408 - PERF_EVENT_IOC_SET_FILTER = 0x80042406 - PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x8004743d - PPPIOCATTCHAN = 0x80047438 - PPPIOCCONNECT = 0x8004743a - PPPIOCDETACH = 0x8004743c - PPPIOCDISCONN = 0x20007439 - PPPIOCGASYNCMAP = 0x40047458 - PPPIOCGCHAN = 0x40047437 - PPPIOCGDEBUG = 0x40047441 - PPPIOCGFLAGS = 0x4004745a - PPPIOCGIDLE = 0x4008743f - PPPIOCGL2TPSTATS = 0x40487436 - PPPIOCGMRU = 0x40047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x40047455 - PPPIOCGUNIT = 0x40047456 - PPPIOCGXASYNCMAP = 0x40207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x80087446 - PPPIOCSASYNCMAP = 0x80047457 - PPPIOCSCOMPRESS = 0x800c744d - PPPIOCSDEBUG = 0x80047440 - PPPIOCSFLAGS = 0x80047459 - PPPIOCSMAXCID = 0x80047451 - PPPIOCSMRRU = 0x8004743b - PPPIOCSMRU = 0x80047452 - PPPIOCSNPMODE = 0x8008744b - PPPIOCSPASS = 0x80087447 - PPPIOCSRASYNCMAP = 0x80047454 - PPPIOCSXASYNCMAP = 0x8020744f - PPPIOCXFERUNIT = 0x2000744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_GET_THREAD_AREA = 0x19 - PTRACE_GET_THREAD_AREA_3264 = 0xc4 - PTRACE_GET_WATCH_REGS = 0xd0 - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_3264 = 0xc1 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_3264 = 0xc0 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_3264 = 0xc3 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_3264 = 0xc2 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SET_THREAD_AREA = 0x1a - PTRACE_SET_WATCH_REGS = 0xd1 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_TRACEME = 0x0 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x6 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x9 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x5 - RLIMIT_NPROC = 0x8 - RLIMIT_RSS = 0x7 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x80085203 - RNDADDTOENTCNT = 0x80045201 - RNDCLEARPOOL = 0x20005206 - RNDGETENTCNT = 0x40045200 - RNDGETPOOL = 0x40085202 - RNDRESEEDCRNG = 0x20005207 - RNDZAPENTCNT = 0x20005204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x20007002 - RTC_AIE_ON = 0x20007001 - RTC_ALM_READ = 0x40247008 - RTC_ALM_SET = 0x80247007 - RTC_EPOCH_READ = 0x4004700d - RTC_EPOCH_SET = 0x8004700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x4004700b - RTC_IRQP_SET = 0x8004700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x20007006 - RTC_PIE_ON = 0x20007005 - RTC_PLL_GET = 0x401c7011 - RTC_PLL_SET = 0x801c7012 - RTC_RD_TIME = 0x40247009 - RTC_SET_TIME = 0x8024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x20007004 - RTC_UIE_ON = 0x20007003 - RTC_VL_CLR = 0x20007014 - RTC_VL_READ = 0x40047013 - RTC_WIE_OFF = 0x20007010 - RTC_WIE_ON = 0x2000700f - RTC_WKALM_RD = 0x40287010 - RTC_WKALM_SET = 0x8028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x80 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x40047307 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x40047309 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x40108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x40108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x467f - SIOCOUTQ = 0x7472 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x80047308 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x1 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x80 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x2 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0xffff - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1009 - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x20 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x1029 - SO_DONTROUTE = 0x10 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x1007 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x8 - SO_LINGER = 0x80 - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0x100 - SO_PASSCRED = 0x11 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x12 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1e - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x1028 - SO_RCVBUF = 0x1002 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x1001 - SO_SNDBUFFORCE = 0x1f - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x1005 - SO_STYLE = 0x1008 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x1008 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x5407 - TCGETA = 0x5401 - TCGETS = 0x540d - TCGETS2 = 0x4030542a - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x5410 - TCSBRK = 0x5405 - TCSBRKP = 0x5486 - TCSETA = 0x5402 - TCSETAF = 0x5404 - TCSETAW = 0x5403 - TCSETS = 0x540e - TCSETS2 = 0x8030542b - TCSETSF = 0x5410 - TCSETSF2 = 0x8030542d - TCSETSW = 0x540f - TCSETSW2 = 0x8030542c - TCXONC = 0x5406 - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x80047478 - TIOCEXCL = 0x740d - TIOCGDEV = 0x40045432 - TIOCGETD = 0x7400 - TIOCGETP = 0x7408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x5492 - TIOCGISO7816 = 0x40285442 - TIOCGLCKTRMIOS = 0x548b - TIOCGLTC = 0x7474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGPTPEER = 0x20005441 - TIOCGRS485 = 0x4020542e - TIOCGSERIAL = 0x5484 - TIOCGSID = 0x7416 - TIOCGSOFTCAR = 0x5481 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x467f - TIOCLINUX = 0x5483 - TIOCMBIC = 0x741c - TIOCMBIS = 0x741b - TIOCMGET = 0x741d - TIOCMIWAIT = 0x5491 - TIOCMSET = 0x741a - TIOCM_CAR = 0x100 - TIOCM_CD = 0x100 - TIOCM_CTS = 0x40 - TIOCM_DSR = 0x400 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x200 - TIOCM_RNG = 0x200 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x20 - TIOCM_ST = 0x10 - TIOCNOTTY = 0x5471 - TIOCNXCL = 0x740e - TIOCOUTQ = 0x7472 - TIOCPKT = 0x5470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x5480 - TIOCSERCONFIG = 0x5488 - TIOCSERGETLSR = 0x548e - TIOCSERGETMULTI = 0x548f - TIOCSERGSTRUCT = 0x548d - TIOCSERGWILD = 0x5489 - TIOCSERSETMULTI = 0x5490 - TIOCSERSWILD = 0x548a - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x7401 - TIOCSETN = 0x740a - TIOCSETP = 0x7409 - TIOCSIG = 0x80045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x548c - TIOCSLTC = 0x7475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0xc020542f - TIOCSSERIAL = 0x5485 - TIOCSSOFTCAR = 0x5482 - TIOCSTI = 0x5472 - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x8000 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x800854d5 - TUNDETACHFILTER = 0x800854d6 - TUNGETDEVNETNS = 0x200054e3 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x400854db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETCARRIER = 0x800454e2 - TUNSETDEBUG = 0x800454c9 - TUNSETFILTEREBPF = 0x400454e1 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETSTEERINGEBPF = 0x400454e0 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - UBI_IOCATT = 0x80186f40 - UBI_IOCDET = 0x80046f41 - UBI_IOCEBCH = 0x80044f02 - UBI_IOCEBER = 0x80044f01 - UBI_IOCEBISMAP = 0x40044f05 - UBI_IOCEBMAP = 0x80084f03 - UBI_IOCEBUNMAP = 0x80044f04 - UBI_IOCMKVOL = 0x80986f00 - UBI_IOCRMVOL = 0x80046f01 - UBI_IOCRNVOL = 0x91106f03 - UBI_IOCRPEB = 0x80046f04 - UBI_IOCRSVOL = 0x800c6f02 - UBI_IOCSETVOLPROP = 0x80104f06 - UBI_IOCSPEB = 0x80046f05 - UBI_IOCVOLCRBLK = 0x80804f07 - UBI_IOCVOLRMBLK = 0x20004f08 - UBI_IOCVOLUP = 0x80084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x10 - VEOL = 0x11 - VEOL2 = 0x6 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x4 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VSWTCH = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x40045702 - WDIOC_GETPRETIMEOUT = 0x40045709 - WDIOC_GETSTATUS = 0x40045701 - WDIOC_GETSUPPORT = 0x40285700 - WDIOC_GETTEMP = 0x40045703 - WDIOC_GETTIMELEFT = 0x4004570a - WDIOC_GETTIMEOUT = 0x40045707 - WDIOC_KEEPALIVE = 0x40045705 - WDIOC_SETOPTIONS = 0x40045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x20 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x20 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8004240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4008743f + PPPIOCGIDLE32 = 0x4008743f + PPPIOCGIDLE64 = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80087446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x800c744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80087447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4004700d + RTC_EPOCH_SET = 0x8004700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4004700b + RTC_IRQP_SET = 0x8004700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x401c7011 + RTC_PLL_SET = 0x801c7012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x80 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGISO7816 = 0x40285442 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETDEVNETNS = 0x200054e3 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 27227912..7afa93ae 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -11,2822 +11,2902 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x17 - B110 = 0x3 - B115200 = 0x11 - B1152000 = 0x18 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x19 - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x1a - B230400 = 0x12 - B2400 = 0xb - B2500000 = 0x1b - B300 = 0x7 - B3000000 = 0x1c - B3500000 = 0x1d - B38400 = 0xf - B4000000 = 0x1e - B460800 = 0x13 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x14 - B57600 = 0x10 - B576000 = 0x15 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x16 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x40081270 - BLKBSZSET = 0x80081271 - BLKFLSBUF = 0x20001261 - BLKFRAGET = 0x20001265 - BLKFRASET = 0x20001264 - BLKGETSIZE = 0x20001260 - BLKGETSIZE64 = 0x40081272 - BLKPBSZGET = 0x2000127b - BLKRAGET = 0x20001263 - BLKRASET = 0x20001262 - BLKROGET = 0x2000125e - BLKROSET = 0x2000125d - BLKRRPART = 0x2000125f - BLKSECTGET = 0x20001267 - BLKSECTSET = 0x20001266 - BLKSSZGET = 0x20001268 - BOTHER = 0x1f - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x8000 - BSDLY = 0x8000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0xff - CBAUDEX = 0x0 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0xff0000 - CLOCAL = 0x8000 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x1000 - CR2 = 0x2000 - CR3 = 0x3000 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x3000 - CREAD = 0x800 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x100 - CS7 = 0x200 - CS8 = 0x300 - CSIGNAL = 0xff - CSIZE = 0x300 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x400 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x40 - ECHOE = 0x2 - ECHOK = 0x4 - ECHOKE = 0x1 - ECHONL = 0x10 - ECHOPRT = 0x20 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x800 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x4000 - FFDLY = 0x4000 - FLUSHO = 0x800000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0xc - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0xd - F_SETLKW = 0x7 - F_SETLKW64 = 0xe - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x4000 - IBSHIFT = 0x10 - ICANON = 0x100 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x400 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x80 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x1000 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x400 - IXON = 0x200 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x80 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x40 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x20000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x2000 - MCL_FUTURE = 0x4000 - MCL_ONFAULT = 0x8000 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x40 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NL2 = 0x200 - NL3 = 0x300 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x300 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80000000 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0x2000b703 - NS_GET_OWNER_UID = 0x2000b704 - NS_GET_PARENT = 0x2000b702 - NS_GET_USERNS = 0x2000b701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x4 - ONLCR = 0x2 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x20000 - O_DIRECTORY = 0x4000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x8000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x404000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x1000 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x2000 - PENDIN = 0x20000000 - PERF_EVENT_IOC_DISABLE = 0x20002401 - PERF_EVENT_IOC_ENABLE = 0x20002400 - PERF_EVENT_IOC_ID = 0x40082407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 - PERF_EVENT_IOC_PERIOD = 0x80082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc008240a - PERF_EVENT_IOC_REFRESH = 0x20002402 - PERF_EVENT_IOC_RESET = 0x20002403 - PERF_EVENT_IOC_SET_BPF = 0x80042408 - PERF_EVENT_IOC_SET_FILTER = 0x80082406 - PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x8004743d - PPPIOCATTCHAN = 0x80047438 - PPPIOCCONNECT = 0x8004743a - PPPIOCDETACH = 0x8004743c - PPPIOCDISCONN = 0x20007439 - PPPIOCGASYNCMAP = 0x40047458 - PPPIOCGCHAN = 0x40047437 - PPPIOCGDEBUG = 0x40047441 - PPPIOCGFLAGS = 0x4004745a - PPPIOCGIDLE = 0x4010743f - PPPIOCGL2TPSTATS = 0x40487436 - PPPIOCGMRU = 0x40047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x40047455 - PPPIOCGUNIT = 0x40047456 - PPPIOCGXASYNCMAP = 0x40207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x80107446 - PPPIOCSASYNCMAP = 0x80047457 - PPPIOCSCOMPRESS = 0x8010744d - PPPIOCSDEBUG = 0x80047440 - PPPIOCSFLAGS = 0x80047459 - PPPIOCSMAXCID = 0x80047451 - PPPIOCSMRRU = 0x8004743b - PPPIOCSMRU = 0x80047452 - PPPIOCSNPMODE = 0x8008744b - PPPIOCSPASS = 0x80107447 - PPPIOCSRASYNCMAP = 0x80047454 - PPPIOCSXASYNCMAP = 0x8020744f - PPPIOCXFERUNIT = 0x2000744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_SAO = 0x10 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffffffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETEVRREGS = 0x14 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGS64 = 0x16 - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GETVRREGS = 0x12 - PTRACE_GETVSRREGS = 0x1b - PTRACE_GET_DEBUGREG = 0x19 - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETEVRREGS = 0x15 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGS64 = 0x17 - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SETVRREGS = 0x13 - PTRACE_SETVSRREGS = 0x1c - PTRACE_SET_DEBUGREG = 0x1a - PTRACE_SINGLEBLOCK = 0x100 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_SYSEMU = 0x1d - PTRACE_SYSEMU_SINGLESTEP = 0x1e - PTRACE_TRACEME = 0x0 - PT_CCR = 0x26 - PT_CTR = 0x23 - PT_DAR = 0x29 - PT_DSCR = 0x2c - PT_DSISR = 0x2a - PT_FPR0 = 0x30 - PT_FPSCR = 0x50 - PT_LNK = 0x24 - PT_MSR = 0x21 - PT_NIP = 0x20 - PT_ORIG_R3 = 0x22 - PT_R0 = 0x0 - PT_R1 = 0x1 - PT_R10 = 0xa - PT_R11 = 0xb - PT_R12 = 0xc - PT_R13 = 0xd - PT_R14 = 0xe - PT_R15 = 0xf - PT_R16 = 0x10 - PT_R17 = 0x11 - PT_R18 = 0x12 - PT_R19 = 0x13 - PT_R2 = 0x2 - PT_R20 = 0x14 - PT_R21 = 0x15 - PT_R22 = 0x16 - PT_R23 = 0x17 - PT_R24 = 0x18 - PT_R25 = 0x19 - PT_R26 = 0x1a - PT_R27 = 0x1b - PT_R28 = 0x1c - PT_R29 = 0x1d - PT_R3 = 0x3 - PT_R30 = 0x1e - PT_R31 = 0x1f - PT_R4 = 0x4 - PT_R5 = 0x5 - PT_R6 = 0x6 - PT_R7 = 0x7 - PT_R8 = 0x8 - PT_R9 = 0x9 - PT_REGS_COUNT = 0x2c - PT_RESULT = 0x2b - PT_SOFTE = 0x27 - PT_TRAP = 0x28 - PT_VR0 = 0x52 - PT_VRSAVE = 0x94 - PT_VSCR = 0x93 - PT_VSR0 = 0x96 - PT_VSR31 = 0xd4 - PT_XER = 0x25 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x8 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x7 - RLIMIT_NPROC = 0x6 - RLIMIT_RSS = 0x5 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x80085203 - RNDADDTOENTCNT = 0x80045201 - RNDCLEARPOOL = 0x20005206 - RNDGETENTCNT = 0x40045200 - RNDGETPOOL = 0x40085202 - RNDRESEEDCRNG = 0x20005207 - RNDZAPENTCNT = 0x20005204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x20007002 - RTC_AIE_ON = 0x20007001 - RTC_ALM_READ = 0x40247008 - RTC_ALM_SET = 0x80247007 - RTC_EPOCH_READ = 0x4008700d - RTC_EPOCH_SET = 0x8008700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x4008700b - RTC_IRQP_SET = 0x8008700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x20007006 - RTC_PIE_ON = 0x20007005 - RTC_PLL_GET = 0x40207011 - RTC_PLL_SET = 0x80207012 - RTC_RD_TIME = 0x40247009 - RTC_SET_TIME = 0x8024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x20007004 - RTC_UIE_ON = 0x20007003 - RTC_VL_CLR = 0x20007014 - RTC_VL_READ = 0x40047013 - RTC_WIE_OFF = 0x20007010 - RTC_WIE_ON = 0x2000700f - RTC_WKALM_RD = 0x40287010 - RTC_WKALM_SET = 0x8028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x8904 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x40108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x40108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x4004667f - SIOCOUTQ = 0x40047473 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x14 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x15 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x10 - SO_RCVTIMEO = 0x12 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x12 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x11 - SO_SNDTIMEO = 0x13 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x13 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x3 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x400 - TAB2 = 0x800 - TAB3 = 0xc00 - TABDLY = 0xc00 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x2000741f - TCGETA = 0x40147417 - TCGETS = 0x402c7413 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x2 - TCSBRK = 0x2000741d - TCSBRKP = 0x5425 - TCSETA = 0x80147418 - TCSETAF = 0x8014741c - TCSETAW = 0x80147419 - TCSETS = 0x802c7414 - TCSETSF = 0x802c7416 - TCSETSW = 0x802c7415 - TCXONC = 0x2000741e - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x40045432 - TIOCGETC = 0x40067412 - TIOCGETD = 0x5424 - TIOCGETP = 0x40067408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x545d - TIOCGISO7816 = 0x40285442 - TIOCGLCKTRMIOS = 0x5456 - TIOCGLTC = 0x40067474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGPTPEER = 0x20005441 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x4004667f - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_LOOP = 0x8000 - TIOCM_OUT1 = 0x2000 - TIOCM_OUT2 = 0x4000 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETC = 0x80067411 - TIOCSETD = 0x5423 - TIOCSETN = 0x8006740a - TIOCSETP = 0x80067409 - TIOCSIG = 0x80045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x5457 - TIOCSLTC = 0x80067475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTART = 0x2000746e - TIOCSTI = 0x5412 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x400000 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x801054d5 - TUNDETACHFILTER = 0x801054d6 - TUNGETDEVNETNS = 0x200054e3 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x401054db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETCARRIER = 0x800454e2 - TUNSETDEBUG = 0x800454c9 - TUNSETFILTEREBPF = 0x400454e1 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETSTEERINGEBPF = 0x400454e0 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - UBI_IOCATT = 0x80186f40 - UBI_IOCDET = 0x80046f41 - UBI_IOCEBCH = 0x80044f02 - UBI_IOCEBER = 0x80044f01 - UBI_IOCEBISMAP = 0x40044f05 - UBI_IOCEBMAP = 0x80084f03 - UBI_IOCEBUNMAP = 0x80044f04 - UBI_IOCMKVOL = 0x80986f00 - UBI_IOCRMVOL = 0x80046f01 - UBI_IOCRNVOL = 0x91106f03 - UBI_IOCRPEB = 0x80046f04 - UBI_IOCRSVOL = 0x800c6f02 - UBI_IOCSETVOLPROP = 0x80104f06 - UBI_IOCSPEB = 0x80046f05 - UBI_IOCVOLCRBLK = 0x80804f07 - UBI_IOCVOLRMBLK = 0x20004f08 - UBI_IOCVOLUP = 0x80084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0x10 - VEOF = 0x4 - VEOL = 0x6 - VEOL2 = 0x8 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x5 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xb - VSTART = 0xd - VSTOP = 0xe - VSUSP = 0xc - VSWTC = 0x9 - VT0 = 0x0 - VT1 = 0x10000 - VTDLY = 0x10000 - VTIME = 0x7 - VWERASE = 0xa - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x40045702 - WDIOC_GETPRETIMEOUT = 0x40045709 - WDIOC_GETSTATUS = 0x40045701 - WDIOC_GETSUPPORT = 0x40285700 - WDIOC_GETTEMP = 0x40045703 - WDIOC_GETTIMELEFT = 0x4004570a - WDIOC_GETTIMEOUT = 0x40045707 - WDIOC_KEEPALIVE = 0x40045705 - WDIOC_SETOPTIONS = 0x40045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4000 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0xc00 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4010743f + PPPIOCGIDLE32 = 0x4008743f + PPPIOCGIDLE64 = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80107446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x8010744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80107447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_SYSEMU = 0x1d + PTRACE_SYSEMU_SINGLESTEP = 0x1e + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4008700d + RTC_EPOCH_SET = 0x8008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4008700b + RTC_IRQP_SET = 0x8008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x40207011 + RTC_PLL_SET = 0x80207012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x40285442 + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x400000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0xc00 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index e33be416..7e684404 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -11,2822 +11,2902 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x17 - B110 = 0x3 - B115200 = 0x11 - B1152000 = 0x18 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x19 - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x1a - B230400 = 0x12 - B2400 = 0xb - B2500000 = 0x1b - B300 = 0x7 - B3000000 = 0x1c - B3500000 = 0x1d - B38400 = 0xf - B4000000 = 0x1e - B460800 = 0x13 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x14 - B57600 = 0x10 - B576000 = 0x15 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x16 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x40081270 - BLKBSZSET = 0x80081271 - BLKFLSBUF = 0x20001261 - BLKFRAGET = 0x20001265 - BLKFRASET = 0x20001264 - BLKGETSIZE = 0x20001260 - BLKGETSIZE64 = 0x40081272 - BLKPBSZGET = 0x2000127b - BLKRAGET = 0x20001263 - BLKRASET = 0x20001262 - BLKROGET = 0x2000125e - BLKROSET = 0x2000125d - BLKRRPART = 0x2000125f - BLKSECTGET = 0x20001267 - BLKSECTSET = 0x20001266 - BLKSSZGET = 0x20001268 - BOTHER = 0x1f - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x8000 - BSDLY = 0x8000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0xff - CBAUDEX = 0x0 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0xff0000 - CLOCAL = 0x8000 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x1000 - CR2 = 0x2000 - CR3 = 0x3000 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x3000 - CREAD = 0x800 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x100 - CS7 = 0x200 - CS8 = 0x300 - CSIGNAL = 0xff - CSIZE = 0x300 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x400 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x40 - ECHOE = 0x2 - ECHOK = 0x4 - ECHOKE = 0x1 - ECHONL = 0x10 - ECHOPRT = 0x20 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x800 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x4000 - FFDLY = 0x4000 - FLUSHO = 0x800000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0xc - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0xd - F_SETLKW = 0x7 - F_SETLKW64 = 0xe - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x4000 - IBSHIFT = 0x10 - ICANON = 0x100 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x400 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x80 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x1000 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x400 - IXON = 0x200 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x80 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x40 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x20000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x2000 - MCL_FUTURE = 0x4000 - MCL_ONFAULT = 0x8000 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x40 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NL2 = 0x200 - NL3 = 0x300 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x300 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80000000 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0x2000b703 - NS_GET_OWNER_UID = 0x2000b704 - NS_GET_PARENT = 0x2000b702 - NS_GET_USERNS = 0x2000b701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x4 - ONLCR = 0x2 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x20000 - O_DIRECTORY = 0x4000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x8000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x404000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x1000 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x2000 - PENDIN = 0x20000000 - PERF_EVENT_IOC_DISABLE = 0x20002401 - PERF_EVENT_IOC_ENABLE = 0x20002400 - PERF_EVENT_IOC_ID = 0x40082407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 - PERF_EVENT_IOC_PERIOD = 0x80082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc008240a - PERF_EVENT_IOC_REFRESH = 0x20002402 - PERF_EVENT_IOC_RESET = 0x20002403 - PERF_EVENT_IOC_SET_BPF = 0x80042408 - PERF_EVENT_IOC_SET_FILTER = 0x80082406 - PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x8004743d - PPPIOCATTCHAN = 0x80047438 - PPPIOCCONNECT = 0x8004743a - PPPIOCDETACH = 0x8004743c - PPPIOCDISCONN = 0x20007439 - PPPIOCGASYNCMAP = 0x40047458 - PPPIOCGCHAN = 0x40047437 - PPPIOCGDEBUG = 0x40047441 - PPPIOCGFLAGS = 0x4004745a - PPPIOCGIDLE = 0x4010743f - PPPIOCGL2TPSTATS = 0x40487436 - PPPIOCGMRU = 0x40047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x40047455 - PPPIOCGUNIT = 0x40047456 - PPPIOCGXASYNCMAP = 0x40207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x80107446 - PPPIOCSASYNCMAP = 0x80047457 - PPPIOCSCOMPRESS = 0x8010744d - PPPIOCSDEBUG = 0x80047440 - PPPIOCSFLAGS = 0x80047459 - PPPIOCSMAXCID = 0x80047451 - PPPIOCSMRRU = 0x8004743b - PPPIOCSMRU = 0x80047452 - PPPIOCSNPMODE = 0x8008744b - PPPIOCSPASS = 0x80107447 - PPPIOCSRASYNCMAP = 0x80047454 - PPPIOCSXASYNCMAP = 0x8020744f - PPPIOCXFERUNIT = 0x2000744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_SAO = 0x10 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffffffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETEVRREGS = 0x14 - PTRACE_GETFPREGS = 0xe - PTRACE_GETREGS = 0xc - PTRACE_GETREGS64 = 0x16 - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GETVRREGS = 0x12 - PTRACE_GETVSRREGS = 0x1b - PTRACE_GET_DEBUGREG = 0x19 - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETEVRREGS = 0x15 - PTRACE_SETFPREGS = 0xf - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGS64 = 0x17 - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SETVRREGS = 0x13 - PTRACE_SETVSRREGS = 0x1c - PTRACE_SET_DEBUGREG = 0x1a - PTRACE_SINGLEBLOCK = 0x100 - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_SYSEMU = 0x1d - PTRACE_SYSEMU_SINGLESTEP = 0x1e - PTRACE_TRACEME = 0x0 - PT_CCR = 0x26 - PT_CTR = 0x23 - PT_DAR = 0x29 - PT_DSCR = 0x2c - PT_DSISR = 0x2a - PT_FPR0 = 0x30 - PT_FPSCR = 0x50 - PT_LNK = 0x24 - PT_MSR = 0x21 - PT_NIP = 0x20 - PT_ORIG_R3 = 0x22 - PT_R0 = 0x0 - PT_R1 = 0x1 - PT_R10 = 0xa - PT_R11 = 0xb - PT_R12 = 0xc - PT_R13 = 0xd - PT_R14 = 0xe - PT_R15 = 0xf - PT_R16 = 0x10 - PT_R17 = 0x11 - PT_R18 = 0x12 - PT_R19 = 0x13 - PT_R2 = 0x2 - PT_R20 = 0x14 - PT_R21 = 0x15 - PT_R22 = 0x16 - PT_R23 = 0x17 - PT_R24 = 0x18 - PT_R25 = 0x19 - PT_R26 = 0x1a - PT_R27 = 0x1b - PT_R28 = 0x1c - PT_R29 = 0x1d - PT_R3 = 0x3 - PT_R30 = 0x1e - PT_R31 = 0x1f - PT_R4 = 0x4 - PT_R5 = 0x5 - PT_R6 = 0x6 - PT_R7 = 0x7 - PT_R8 = 0x8 - PT_R9 = 0x9 - PT_REGS_COUNT = 0x2c - PT_RESULT = 0x2b - PT_SOFTE = 0x27 - PT_TRAP = 0x28 - PT_VR0 = 0x52 - PT_VRSAVE = 0x94 - PT_VSCR = 0x93 - PT_VSR0 = 0x96 - PT_VSR31 = 0xd4 - PT_XER = 0x25 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x8 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x7 - RLIMIT_NPROC = 0x6 - RLIMIT_RSS = 0x5 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x80085203 - RNDADDTOENTCNT = 0x80045201 - RNDCLEARPOOL = 0x20005206 - RNDGETENTCNT = 0x40045200 - RNDGETPOOL = 0x40085202 - RNDRESEEDCRNG = 0x20005207 - RNDZAPENTCNT = 0x20005204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x20007002 - RTC_AIE_ON = 0x20007001 - RTC_ALM_READ = 0x40247008 - RTC_ALM_SET = 0x80247007 - RTC_EPOCH_READ = 0x4008700d - RTC_EPOCH_SET = 0x8008700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x4008700b - RTC_IRQP_SET = 0x8008700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x20007006 - RTC_PIE_ON = 0x20007005 - RTC_PLL_GET = 0x40207011 - RTC_PLL_SET = 0x80207012 - RTC_RD_TIME = 0x40247009 - RTC_SET_TIME = 0x8024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x20007004 - RTC_UIE_ON = 0x20007003 - RTC_VL_CLR = 0x20007014 - RTC_VL_READ = 0x40047013 - RTC_WIE_OFF = 0x20007010 - RTC_WIE_ON = 0x2000700f - RTC_WKALM_RD = 0x40287010 - RTC_WKALM_SET = 0x8028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x8904 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x40108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x40108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x4004667f - SIOCOUTQ = 0x40047473 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x14 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x15 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x10 - SO_RCVTIMEO = 0x12 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x12 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x11 - SO_SNDTIMEO = 0x13 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x13 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x3 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x400 - TAB2 = 0x800 - TAB3 = 0xc00 - TABDLY = 0xc00 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x2000741f - TCGETA = 0x40147417 - TCGETS = 0x402c7413 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x2 - TCSBRK = 0x2000741d - TCSBRKP = 0x5425 - TCSETA = 0x80147418 - TCSETAF = 0x8014741c - TCSETAW = 0x80147419 - TCSETS = 0x802c7414 - TCSETSF = 0x802c7416 - TCSETSW = 0x802c7415 - TCXONC = 0x2000741e - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x40045432 - TIOCGETC = 0x40067412 - TIOCGETD = 0x5424 - TIOCGETP = 0x40067408 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x545d - TIOCGISO7816 = 0x40285442 - TIOCGLCKTRMIOS = 0x5456 - TIOCGLTC = 0x40067474 - TIOCGPGRP = 0x40047477 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40045430 - TIOCGPTPEER = 0x20005441 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x4004667f - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_LOOP = 0x8000 - TIOCM_OUT1 = 0x2000 - TIOCM_OUT2 = 0x4000 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETC = 0x80067411 - TIOCSETD = 0x5423 - TIOCSETN = 0x8006740a - TIOCSETP = 0x80067409 - TIOCSIG = 0x80045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x5457 - TIOCSLTC = 0x80067475 - TIOCSPGRP = 0x80047476 - TIOCSPTLCK = 0x80045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTART = 0x2000746e - TIOCSTI = 0x5412 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x400000 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x801054d5 - TUNDETACHFILTER = 0x801054d6 - TUNGETDEVNETNS = 0x200054e3 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x401054db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETCARRIER = 0x800454e2 - TUNSETDEBUG = 0x800454c9 - TUNSETFILTEREBPF = 0x400454e1 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETSTEERINGEBPF = 0x400454e0 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - UBI_IOCATT = 0x80186f40 - UBI_IOCDET = 0x80046f41 - UBI_IOCEBCH = 0x80044f02 - UBI_IOCEBER = 0x80044f01 - UBI_IOCEBISMAP = 0x40044f05 - UBI_IOCEBMAP = 0x80084f03 - UBI_IOCEBUNMAP = 0x80044f04 - UBI_IOCMKVOL = 0x80986f00 - UBI_IOCRMVOL = 0x80046f01 - UBI_IOCRNVOL = 0x91106f03 - UBI_IOCRPEB = 0x80046f04 - UBI_IOCRSVOL = 0x800c6f02 - UBI_IOCSETVOLPROP = 0x80104f06 - UBI_IOCSPEB = 0x80046f05 - UBI_IOCVOLCRBLK = 0x80804f07 - UBI_IOCVOLRMBLK = 0x20004f08 - UBI_IOCVOLUP = 0x80084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0x10 - VEOF = 0x4 - VEOL = 0x6 - VEOL2 = 0x8 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x5 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xb - VSTART = 0xd - VSTOP = 0xe - VSUSP = 0xc - VSWTC = 0x9 - VT0 = 0x0 - VT1 = 0x10000 - VTDLY = 0x10000 - VTIME = 0x7 - VWERASE = 0xa - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x40045702 - WDIOC_GETPRETIMEOUT = 0x40045709 - WDIOC_GETSTATUS = 0x40045701 - WDIOC_GETSUPPORT = 0x40285700 - WDIOC_GETTEMP = 0x40045703 - WDIOC_GETTIMELEFT = 0x4004570a - WDIOC_GETTIMEOUT = 0x40045707 - WDIOC_KEEPALIVE = 0x40045705 - WDIOC_SETOPTIONS = 0x40045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4000 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0xc00 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4010743f + PPPIOCGIDLE32 = 0x4008743f + PPPIOCGIDLE64 = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80107446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x8010744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80107447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_SYSEMU = 0x1d + PTRACE_SYSEMU_SINGLESTEP = 0x1e + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4008700d + RTC_EPOCH_SET = 0x8008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4008700b + RTC_IRQP_SET = 0x8008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x40207011 + RTC_PLL_SET = 0x80207012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x40285442 + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x400000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0xc00 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index b9908d30..30afa576 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -11,2748 +11,2827 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x80081270 - BLKBSZSET = 0x40081271 - BLKFLSBUF = 0x1261 - BLKFRAGET = 0x1265 - BLKFRASET = 0x1264 - BLKGETSIZE = 0x1260 - BLKGETSIZE64 = 0x80081272 - BLKPBSZGET = 0x127b - BLKRAGET = 0x1263 - BLKRASET = 0x1262 - BLKROGET = 0x125e - BLKROSET = 0x125d - BLKRRPART = 0x125f - BLKSECTGET = 0x1267 - BLKSECTSET = 0x1266 - BLKSSZGET = 0x1268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x800 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0x5 - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x20000 - MAP_SYNC = 0x80000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x40 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0xb703 - NS_GET_OWNER_UID = 0xb704 - NS_GET_PARENT = 0xb702 - NS_GET_USERNS = 0xb701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x4000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x2401 - PERF_EVENT_IOC_ENABLE = 0x2400 - PERF_EVENT_IOC_ID = 0x80082407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 - PERF_EVENT_IOC_PERIOD = 0x40082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc008240a - PERF_EVENT_IOC_REFRESH = 0x2402 - PERF_EVENT_IOC_RESET = 0x2403 - PERF_EVENT_IOC_SET_BPF = 0x40042408 - PERF_EVENT_IOC_SET_FILTER = 0x40082406 - PERF_EVENT_IOC_SET_OUTPUT = 0x2405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x4004743d - PPPIOCATTCHAN = 0x40047438 - PPPIOCCONNECT = 0x4004743a - PPPIOCDETACH = 0x4004743c - PPPIOCDISCONN = 0x7439 - PPPIOCGASYNCMAP = 0x80047458 - PPPIOCGCHAN = 0x80047437 - PPPIOCGDEBUG = 0x80047441 - PPPIOCGFLAGS = 0x8004745a - PPPIOCGIDLE = 0x8010743f - PPPIOCGL2TPSTATS = 0x80487436 - PPPIOCGMRU = 0x80047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x80047455 - PPPIOCGUNIT = 0x80047456 - PPPIOCGXASYNCMAP = 0x80207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x40107446 - PPPIOCSASYNCMAP = 0x40047457 - PPPIOCSCOMPRESS = 0x4010744d - PPPIOCSDEBUG = 0x40047440 - PPPIOCSFLAGS = 0x40047459 - PPPIOCSMAXCID = 0x40047451 - PPPIOCSMRRU = 0x4004743b - PPPIOCSMRU = 0x40047452 - PPPIOCSNPMODE = 0x4008744b - PPPIOCSPASS = 0x40107447 - PPPIOCSRASYNCMAP = 0x40047454 - PPPIOCSXASYNCMAP = 0x4020744f - PPPIOCXFERUNIT = 0x744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffffffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_TRACEME = 0x0 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x8 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x7 - RLIMIT_NPROC = 0x6 - RLIMIT_RSS = 0x5 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x40085203 - RNDADDTOENTCNT = 0x40045201 - RNDCLEARPOOL = 0x5206 - RNDGETENTCNT = 0x80045200 - RNDGETPOOL = 0x80085202 - RNDRESEEDCRNG = 0x5207 - RNDZAPENTCNT = 0x5204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x7002 - RTC_AIE_ON = 0x7001 - RTC_ALM_READ = 0x80247008 - RTC_ALM_SET = 0x40247007 - RTC_EPOCH_READ = 0x8008700d - RTC_EPOCH_SET = 0x4008700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x8008700b - RTC_IRQP_SET = 0x4008700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x7006 - RTC_PIE_ON = 0x7005 - RTC_PLL_GET = 0x80207011 - RTC_PLL_SET = 0x40207012 - RTC_RD_TIME = 0x80247009 - RTC_SET_TIME = 0x4024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x7004 - RTC_UIE_ON = 0x7003 - RTC_VL_CLR = 0x7014 - RTC_VL_READ = 0x80047013 - RTC_WIE_OFF = 0x7010 - RTC_WIE_ON = 0x700f - RTC_WKALM_RD = 0x80287010 - RTC_WKALM_SET = 0x4028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x8904 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x80108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x80108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x541b - SIOCOUTQ = 0x5411 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x11 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x14 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x3 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGISO7816 = 0x80285442 - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGPTPEER = 0x5441 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x100 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x401054d5 - TUNDETACHFILTER = 0x401054d6 - TUNGETDEVNETNS = 0x54e3 - TUNGETFEATURES = 0x800454cf - TUNGETFILTER = 0x801054db - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETBE = 0x800454df - TUNGETVNETHDRSZ = 0x800454d7 - TUNGETVNETLE = 0x800454dd - TUNSETCARRIER = 0x400454e2 - TUNSETDEBUG = 0x400454c9 - TUNSETFILTEREBPF = 0x800454e1 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETIFINDEX = 0x400454da - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETQUEUE = 0x400454d9 - TUNSETSNDBUF = 0x400454d4 - TUNSETSTEERINGEBPF = 0x800454e0 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETBE = 0x400454de - TUNSETVNETHDRSZ = 0x400454d8 - TUNSETVNETLE = 0x400454dc - UBI_IOCATT = 0x40186f40 - UBI_IOCDET = 0x40046f41 - UBI_IOCEBCH = 0x40044f02 - UBI_IOCEBER = 0x40044f01 - UBI_IOCEBISMAP = 0x80044f05 - UBI_IOCEBMAP = 0x40084f03 - UBI_IOCEBUNMAP = 0x40044f04 - UBI_IOCMKVOL = 0x40986f00 - UBI_IOCRMVOL = 0x40046f01 - UBI_IOCRNVOL = 0x51106f03 - UBI_IOCRPEB = 0x40046f04 - UBI_IOCRSVOL = 0x400c6f02 - UBI_IOCSETVOLPROP = 0x40104f06 - UBI_IOCSPEB = 0x40046f05 - UBI_IOCVOLCRBLK = 0x40804f07 - UBI_IOCVOLRMBLK = 0x4f08 - UBI_IOCVOLUP = 0x40084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x6 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x80045702 - WDIOC_GETPRETIMEOUT = 0x80045709 - WDIOC_GETSTATUS = 0x80045701 - WDIOC_GETSUPPORT = 0x80285700 - WDIOC_GETTEMP = 0x80045703 - WDIOC_GETTIMELEFT = 0x8004570a - WDIOC_GETTIMEOUT = 0x80045707 - WDIOC_KEEPALIVE = 0x80045705 - WDIOC_SETOPTIONS = 0x80045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8010743f + PPPIOCGIDLE32 = 0x8008743f + PPPIOCGIDLE64 = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40107446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x4010744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40107447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8008700d + RTC_EPOCH_SET = 0x4008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8008700b + RTC_IRQP_SET = 0x4008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x80207011 + RTC_PLL_SET = 0x40207012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x80285442 + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETDEVNETNS = 0x54e3 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 85647f4f..5dc08e9e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -11,2821 +11,2900 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x80081270 - BLKBSZSET = 0x40081271 - BLKFLSBUF = 0x1261 - BLKFRAGET = 0x1265 - BLKFRASET = 0x1264 - BLKGETSIZE = 0x1260 - BLKGETSIZE64 = 0x80081272 - BLKPBSZGET = 0x127b - BLKRAGET = 0x1263 - BLKRASET = 0x1262 - BLKROGET = 0x125e - BLKROSET = 0x125d - BLKRRPART = 0x125f - BLKSECTGET = 0x1267 - BLKSECTSET = 0x1266 - BLKSSZGET = 0x1268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x80000 - EFD_NONBLOCK = 0x800 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x80000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x5 - F_GETLK64 = 0x5 - F_GETOWN = 0x9 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x0 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x6 - F_SETLK64 = 0x6 - F_SETLKW = 0x7 - F_SETLKW64 = 0x7 - F_SETOWN = 0x8 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x2 - F_WRLCK = 0x1 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x80000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x800 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x100 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x2000 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x4000 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x20000 - MAP_SYNC = 0x80000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MCL_ONFAULT = 0x4 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x40 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0xb703 - NS_GET_OWNER_UID = 0xb704 - NS_GET_PARENT = 0xb702 - NS_GET_USERNS = 0xb701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x400 - O_ASYNC = 0x2000 - O_CLOEXEC = 0x80000 - O_CREAT = 0x40 - O_DIRECT = 0x4000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x1000 - O_EXCL = 0x80 - O_FSYNC = 0x101000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x800 - O_NOATIME = 0x40000 - O_NOCTTY = 0x100 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x800 - O_PATH = 0x200000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x101000 - O_SYNC = 0x101000 - O_TMPFILE = 0x410000 - O_TRUNC = 0x200 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x2401 - PERF_EVENT_IOC_ENABLE = 0x2400 - PERF_EVENT_IOC_ID = 0x80082407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 - PERF_EVENT_IOC_PERIOD = 0x40082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc008240a - PERF_EVENT_IOC_REFRESH = 0x2402 - PERF_EVENT_IOC_RESET = 0x2403 - PERF_EVENT_IOC_SET_BPF = 0x40042408 - PERF_EVENT_IOC_SET_FILTER = 0x40082406 - PERF_EVENT_IOC_SET_OUTPUT = 0x2405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x4004743d - PPPIOCATTCHAN = 0x40047438 - PPPIOCCONNECT = 0x4004743a - PPPIOCDETACH = 0x4004743c - PPPIOCDISCONN = 0x7439 - PPPIOCGASYNCMAP = 0x80047458 - PPPIOCGCHAN = 0x80047437 - PPPIOCGDEBUG = 0x80047441 - PPPIOCGFLAGS = 0x8004745a - PPPIOCGIDLE = 0x8010743f - PPPIOCGL2TPSTATS = 0x80487436 - PPPIOCGMRU = 0x80047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x80047455 - PPPIOCGUNIT = 0x80047456 - PPPIOCGXASYNCMAP = 0x80207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x40107446 - PPPIOCSASYNCMAP = 0x40047457 - PPPIOCSCOMPRESS = 0x4010744d - PPPIOCSDEBUG = 0x40047440 - PPPIOCSFLAGS = 0x40047459 - PPPIOCSMAXCID = 0x40047451 - PPPIOCSMRRU = 0x4004743b - PPPIOCSMRU = 0x40047452 - PPPIOCSNPMODE = 0x4008744b - PPPIOCSPASS = 0x40107447 - PPPIOCSRASYNCMAP = 0x40047454 - PPPIOCSXASYNCMAP = 0x4020744f - PPPIOCXFERUNIT = 0x744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffffffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_DISABLE_TE = 0x5010 - PTRACE_ENABLE_TE = 0x5009 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETREGS = 0xc - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_LAST_BREAK = 0x5006 - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_OLDSETOPTIONS = 0x15 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKDATA_AREA = 0x5003 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKTEXT_AREA = 0x5002 - PTRACE_PEEKUSR = 0x3 - PTRACE_PEEKUSR_AREA = 0x5000 - PTRACE_PEEK_SYSTEM_CALL = 0x5007 - PTRACE_POKEDATA = 0x5 - PTRACE_POKEDATA_AREA = 0x5005 - PTRACE_POKETEXT = 0x4 - PTRACE_POKETEXT_AREA = 0x5004 - PTRACE_POKEUSR = 0x6 - PTRACE_POKEUSR_AREA = 0x5001 - PTRACE_POKE_SYSTEM_CALL = 0x5008 - PTRACE_PROT = 0x15 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SINGLEBLOCK = 0xc - PTRACE_SINGLESTEP = 0x9 - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_TE_ABORT_RAND = 0x5011 - PTRACE_TRACEME = 0x0 - PT_ACR0 = 0x90 - PT_ACR1 = 0x94 - PT_ACR10 = 0xb8 - PT_ACR11 = 0xbc - PT_ACR12 = 0xc0 - PT_ACR13 = 0xc4 - PT_ACR14 = 0xc8 - PT_ACR15 = 0xcc - PT_ACR2 = 0x98 - PT_ACR3 = 0x9c - PT_ACR4 = 0xa0 - PT_ACR5 = 0xa4 - PT_ACR6 = 0xa8 - PT_ACR7 = 0xac - PT_ACR8 = 0xb0 - PT_ACR9 = 0xb4 - PT_CR_10 = 0x168 - PT_CR_11 = 0x170 - PT_CR_9 = 0x160 - PT_ENDREGS = 0x1af - PT_FPC = 0xd8 - PT_FPR0 = 0xe0 - PT_FPR1 = 0xe8 - PT_FPR10 = 0x130 - PT_FPR11 = 0x138 - PT_FPR12 = 0x140 - PT_FPR13 = 0x148 - PT_FPR14 = 0x150 - PT_FPR15 = 0x158 - PT_FPR2 = 0xf0 - PT_FPR3 = 0xf8 - PT_FPR4 = 0x100 - PT_FPR5 = 0x108 - PT_FPR6 = 0x110 - PT_FPR7 = 0x118 - PT_FPR8 = 0x120 - PT_FPR9 = 0x128 - PT_GPR0 = 0x10 - PT_GPR1 = 0x18 - PT_GPR10 = 0x60 - PT_GPR11 = 0x68 - PT_GPR12 = 0x70 - PT_GPR13 = 0x78 - PT_GPR14 = 0x80 - PT_GPR15 = 0x88 - PT_GPR2 = 0x20 - PT_GPR3 = 0x28 - PT_GPR4 = 0x30 - PT_GPR5 = 0x38 - PT_GPR6 = 0x40 - PT_GPR7 = 0x48 - PT_GPR8 = 0x50 - PT_GPR9 = 0x58 - PT_IEEE_IP = 0x1a8 - PT_LASTOFF = 0x1a8 - PT_ORIGGPR2 = 0xd0 - PT_PSWADDR = 0x8 - PT_PSWMASK = 0x0 - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x8 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x7 - RLIMIT_NPROC = 0x6 - RLIMIT_RSS = 0x5 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x40085203 - RNDADDTOENTCNT = 0x40045201 - RNDCLEARPOOL = 0x5206 - RNDGETENTCNT = 0x80045200 - RNDGETPOOL = 0x80085202 - RNDRESEEDCRNG = 0x5207 - RNDZAPENTCNT = 0x5204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x7002 - RTC_AIE_ON = 0x7001 - RTC_ALM_READ = 0x80247008 - RTC_ALM_SET = 0x40247007 - RTC_EPOCH_READ = 0x8008700d - RTC_EPOCH_SET = 0x4008700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x8008700b - RTC_IRQP_SET = 0x4008700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x7006 - RTC_PIE_ON = 0x7005 - RTC_PLL_GET = 0x80207011 - RTC_PLL_SET = 0x40207012 - RTC_RD_TIME = 0x80247009 - RTC_SET_TIME = 0x4024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x7004 - RTC_UIE_ON = 0x7003 - RTC_VL_CLR = 0x7014 - RTC_VL_READ = 0x80047013 - RTC_WIE_OFF = 0x7010 - RTC_WIE_ON = 0x700f - RTC_WKALM_RD = 0x80287010 - RTC_WKALM_SET = 0x4028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x25 - SCM_TIMESTAMPING_OPT_STATS = 0x36 - SCM_TIMESTAMPING_PKTINFO = 0x3a - SCM_TIMESTAMPNS = 0x23 - SCM_TXTIME = 0x3d - SCM_WIFI_STATUS = 0x29 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x80000 - SFD_NONBLOCK = 0x800 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x8904 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x80108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x80108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x541b - SIOCOUTQ = 0x5411 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x80000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x800 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0x1 - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x1e - SO_ATTACH_BPF = 0x32 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x33 - SO_ATTACH_REUSEPORT_EBPF = 0x34 - SO_BINDTODEVICE = 0x19 - SO_BINDTOIFINDEX = 0x3e - SO_BPF_EXTENSIONS = 0x30 - SO_BROADCAST = 0x6 - SO_BSDCOMPAT = 0xe - SO_BUSY_POLL = 0x2e - SO_CNX_ADVICE = 0x35 - SO_COOKIE = 0x39 - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x44 - SO_DOMAIN = 0x27 - SO_DONTROUTE = 0x5 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x4 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x31 - SO_INCOMING_NAPI_ID = 0x38 - SO_KEEPALIVE = 0x9 - SO_LINGER = 0xd - SO_LOCK_FILTER = 0x2c - SO_MARK = 0x24 - SO_MAX_PACING_RATE = 0x2f - SO_MEMINFO = 0x37 - SO_NOFCS = 0x2b - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0xa - SO_PASSCRED = 0x10 - SO_PASSSEC = 0x22 - SO_PEEK_OFF = 0x2a - SO_PEERCRED = 0x11 - SO_PEERGROUPS = 0x3b - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1f - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x26 - SO_RCVBUF = 0x8 - SO_RCVBUFFORCE = 0x21 - SO_RCVLOWAT = 0x12 - SO_RCVTIMEO = 0x14 - SO_RCVTIMEO_NEW = 0x42 - SO_RCVTIMEO_OLD = 0x14 - SO_REUSEADDR = 0x2 - SO_REUSEPORT = 0xf - SO_RXQ_OVFL = 0x28 - SO_SECURITY_AUTHENTICATION = 0x16 - SO_SECURITY_ENCRYPTION_NETWORK = 0x18 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 - SO_SELECT_ERR_QUEUE = 0x2d - SO_SNDBUF = 0x7 - SO_SNDBUFFORCE = 0x20 - SO_SNDLOWAT = 0x13 - SO_SNDTIMEO = 0x15 - SO_SNDTIMEO_NEW = 0x43 - SO_SNDTIMEO_OLD = 0x15 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x25 - SO_TIMESTAMPING_NEW = 0x41 - SO_TIMESTAMPING_OLD = 0x25 - SO_TIMESTAMPNS = 0x23 - SO_TIMESTAMPNS_NEW = 0x40 - SO_TIMESTAMPNS_OLD = 0x23 - SO_TIMESTAMP_NEW = 0x3f - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3d - SO_TYPE = 0x3 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x29 - SO_ZEROCOPY = 0x3c - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x540b - TCGETA = 0x5405 - TCGETS = 0x5401 - TCGETS2 = 0x802c542a - TCGETX = 0x5432 - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x2 - TCSBRK = 0x5409 - TCSBRKP = 0x5425 - TCSETA = 0x5406 - TCSETAF = 0x5408 - TCSETAW = 0x5407 - TCSETS = 0x5402 - TCSETS2 = 0x402c542b - TCSETSF = 0x5404 - TCSETSF2 = 0x402c542d - TCSETSW = 0x5403 - TCSETSW2 = 0x402c542c - TCSETX = 0x5433 - TCSETXF = 0x5434 - TCSETXW = 0x5435 - TCXONC = 0x540a - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x5428 - TIOCCONS = 0x541d - TIOCEXCL = 0x540c - TIOCGDEV = 0x80045432 - TIOCGETD = 0x5424 - TIOCGEXCL = 0x80045440 - TIOCGICOUNT = 0x545d - TIOCGISO7816 = 0x80285442 - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x540f - TIOCGPKT = 0x80045438 - TIOCGPTLCK = 0x80045439 - TIOCGPTN = 0x80045430 - TIOCGPTPEER = 0x5441 - TIOCGRS485 = 0x542e - TIOCGSERIAL = 0x541e - TIOCGSID = 0x5429 - TIOCGSOFTCAR = 0x5419 - TIOCGWINSZ = 0x5413 - TIOCINQ = 0x541b - TIOCLINUX = 0x541c - TIOCMBIC = 0x5417 - TIOCMBIS = 0x5416 - TIOCMGET = 0x5415 - TIOCMIWAIT = 0x545c - TIOCMSET = 0x5418 - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x5422 - TIOCNXCL = 0x540d - TIOCOUTQ = 0x5411 - TIOCPKT = 0x5420 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x5427 - TIOCSCTTY = 0x540e - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSER_TEMT = 0x1 - TIOCSETD = 0x5423 - TIOCSIG = 0x40045436 - TIOCSISO7816 = 0xc0285443 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x5410 - TIOCSPTLCK = 0x40045431 - TIOCSRS485 = 0x542f - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x541a - TIOCSTI = 0x5412 - TIOCSWINSZ = 0x5414 - TIOCVHANGUP = 0x5437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x100 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x401054d5 - TUNDETACHFILTER = 0x401054d6 - TUNGETDEVNETNS = 0x54e3 - TUNGETFEATURES = 0x800454cf - TUNGETFILTER = 0x801054db - TUNGETIFF = 0x800454d2 - TUNGETSNDBUF = 0x800454d3 - TUNGETVNETBE = 0x800454df - TUNGETVNETHDRSZ = 0x800454d7 - TUNGETVNETLE = 0x800454dd - TUNSETCARRIER = 0x400454e2 - TUNSETDEBUG = 0x400454c9 - TUNSETFILTEREBPF = 0x800454e1 - TUNSETGROUP = 0x400454ce - TUNSETIFF = 0x400454ca - TUNSETIFINDEX = 0x400454da - TUNSETLINK = 0x400454cd - TUNSETNOCSUM = 0x400454c8 - TUNSETOFFLOAD = 0x400454d0 - TUNSETOWNER = 0x400454cc - TUNSETPERSIST = 0x400454cb - TUNSETQUEUE = 0x400454d9 - TUNSETSNDBUF = 0x400454d4 - TUNSETSTEERINGEBPF = 0x800454e0 - TUNSETTXFILTER = 0x400454d1 - TUNSETVNETBE = 0x400454de - TUNSETVNETHDRSZ = 0x400454d8 - TUNSETVNETLE = 0x400454dc - UBI_IOCATT = 0x40186f40 - UBI_IOCDET = 0x40046f41 - UBI_IOCEBCH = 0x40044f02 - UBI_IOCEBER = 0x40044f01 - UBI_IOCEBISMAP = 0x80044f05 - UBI_IOCEBMAP = 0x40084f03 - UBI_IOCEBUNMAP = 0x40044f04 - UBI_IOCMKVOL = 0x40986f00 - UBI_IOCRMVOL = 0x40046f01 - UBI_IOCRNVOL = 0x51106f03 - UBI_IOCRPEB = 0x40046f04 - UBI_IOCRSVOL = 0x400c6f02 - UBI_IOCSETVOLPROP = 0x40104f06 - UBI_IOCSPEB = 0x40046f05 - UBI_IOCVOLCRBLK = 0x40804f07 - UBI_IOCVOLRMBLK = 0x4f08 - UBI_IOCVOLUP = 0x40084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x6 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x80045702 - WDIOC_GETPRETIMEOUT = 0x80045709 - WDIOC_GETSTATUS = 0x80045701 - WDIOC_GETSUPPORT = 0x80285700 - WDIOC_GETTEMP = 0x80045703 - WDIOC_GETTIMELEFT = 0x8004570a - WDIOC_GETTIMEOUT = 0x80045707 - WDIOC_KEEPALIVE = 0x80045705 - WDIOC_SETOPTIONS = 0x80045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0xb703 + NS_GET_OWNER_UID = 0xb704 + NS_GET_PARENT = 0xb702 + NS_GET_USERNS = 0xb701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8010743f + PPPIOCGIDLE32 = 0x8008743f + PPPIOCGIDLE64 = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40107446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x4010744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40107447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_DISABLE_TE = 0x5010 + PTRACE_ENABLE_TE = 0x5009 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_LAST_BREAK = 0x5006 + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_AREA = 0x5003 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_AREA = 0x5002 + PTRACE_PEEKUSR = 0x3 + PTRACE_PEEKUSR_AREA = 0x5000 + PTRACE_PEEK_SYSTEM_CALL = 0x5007 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_AREA = 0x5005 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_AREA = 0x5004 + PTRACE_POKEUSR = 0x6 + PTRACE_POKEUSR_AREA = 0x5001 + PTRACE_POKE_SYSTEM_CALL = 0x5008 + PTRACE_PROT = 0x15 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLEBLOCK = 0xc + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_TE_ABORT_RAND = 0x5011 + PTRACE_TRACEME = 0x0 + PT_ACR0 = 0x90 + PT_ACR1 = 0x94 + PT_ACR10 = 0xb8 + PT_ACR11 = 0xbc + PT_ACR12 = 0xc0 + PT_ACR13 = 0xc4 + PT_ACR14 = 0xc8 + PT_ACR15 = 0xcc + PT_ACR2 = 0x98 + PT_ACR3 = 0x9c + PT_ACR4 = 0xa0 + PT_ACR5 = 0xa4 + PT_ACR6 = 0xa8 + PT_ACR7 = 0xac + PT_ACR8 = 0xb0 + PT_ACR9 = 0xb4 + PT_CR_10 = 0x168 + PT_CR_11 = 0x170 + PT_CR_9 = 0x160 + PT_ENDREGS = 0x1af + PT_FPC = 0xd8 + PT_FPR0 = 0xe0 + PT_FPR1 = 0xe8 + PT_FPR10 = 0x130 + PT_FPR11 = 0x138 + PT_FPR12 = 0x140 + PT_FPR13 = 0x148 + PT_FPR14 = 0x150 + PT_FPR15 = 0x158 + PT_FPR2 = 0xf0 + PT_FPR3 = 0xf8 + PT_FPR4 = 0x100 + PT_FPR5 = 0x108 + PT_FPR6 = 0x110 + PT_FPR7 = 0x118 + PT_FPR8 = 0x120 + PT_FPR9 = 0x128 + PT_GPR0 = 0x10 + PT_GPR1 = 0x18 + PT_GPR10 = 0x60 + PT_GPR11 = 0x68 + PT_GPR12 = 0x70 + PT_GPR13 = 0x78 + PT_GPR14 = 0x80 + PT_GPR15 = 0x88 + PT_GPR2 = 0x20 + PT_GPR3 = 0x28 + PT_GPR4 = 0x30 + PT_GPR5 = 0x38 + PT_GPR6 = 0x40 + PT_GPR7 = 0x48 + PT_GPR8 = 0x50 + PT_GPR9 = 0x58 + PT_IEEE_IP = 0x1a8 + PT_LASTOFF = 0x1a8 + PT_ORIGGPR2 = 0xd0 + PT_PSWADDR = 0x8 + PT_PSWMASK = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8008700d + RTC_EPOCH_SET = 0x4008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8008700b + RTC_IRQP_SET = 0x4008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x80207011 + RTC_PLL_SET = 0x40207012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x80108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x80108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BINDTOIFINDEX = 0x3e + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x44 + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_RCVTIMEO_NEW = 0x42 + SO_RCVTIMEO_OLD = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_SNDTIMEO_NEW = 0x43 + SO_SNDTIMEO_OLD = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPING_NEW = 0x41 + SO_TIMESTAMPING_OLD = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TIMESTAMPNS_NEW = 0x40 + SO_TIMESTAMPNS_OLD = 0x23 + SO_TIMESTAMP_NEW = 0x3f + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x80285442 + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSISO7816 = 0xc0285443 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETDEVNETNS = 0x54e3 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRPEB = 0x40046f04 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCSPEB = 0x40046f05 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index c0095a54..cf1c386a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -11,2811 +11,2891 @@ package unix import "syscall" const ( - AAFS_MAGIC = 0x5a3c69f0 - ADFS_SUPER_MAGIC = 0xadf5 - AFFS_SUPER_MAGIC = 0xadff - AFS_FS_MAGIC = 0x6b414653 - AFS_SUPER_MAGIC = 0x5346414f - AF_ALG = 0x26 - AF_APPLETALK = 0x5 - AF_ASH = 0x12 - AF_ATMPVC = 0x8 - AF_ATMSVC = 0x14 - AF_AX25 = 0x3 - AF_BLUETOOTH = 0x1f - AF_BRIDGE = 0x7 - AF_CAIF = 0x25 - AF_CAN = 0x1d - AF_DECnet = 0xc - AF_ECONET = 0x13 - AF_FILE = 0x1 - AF_IB = 0x1b - AF_IEEE802154 = 0x24 - AF_INET = 0x2 - AF_INET6 = 0xa - AF_IPX = 0x4 - AF_IRDA = 0x17 - AF_ISDN = 0x22 - AF_IUCV = 0x20 - AF_KCM = 0x29 - AF_KEY = 0xf - AF_LLC = 0x1a - AF_LOCAL = 0x1 - AF_MAX = 0x2d - AF_MPLS = 0x1c - AF_NETBEUI = 0xd - AF_NETLINK = 0x10 - AF_NETROM = 0x6 - AF_NFC = 0x27 - AF_PACKET = 0x11 - AF_PHONET = 0x23 - AF_PPPOX = 0x18 - AF_QIPCRTR = 0x2a - AF_RDS = 0x15 - AF_ROSE = 0xb - AF_ROUTE = 0x10 - AF_RXRPC = 0x21 - AF_SECURITY = 0xe - AF_SMC = 0x2b - AF_SNA = 0x16 - AF_TIPC = 0x1e - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_VSOCK = 0x28 - AF_WANPIPE = 0x19 - AF_X25 = 0x9 - AF_XDP = 0x2c - ALG_OP_DECRYPT = 0x0 - ALG_OP_ENCRYPT = 0x1 - ALG_SET_AEAD_ASSOCLEN = 0x4 - ALG_SET_AEAD_AUTHSIZE = 0x5 - ALG_SET_IV = 0x2 - ALG_SET_KEY = 0x1 - ALG_SET_OP = 0x3 - ANON_INODE_FS_MAGIC = 0x9041934 - ARPHRD_6LOWPAN = 0x339 - ARPHRD_ADAPT = 0x108 - ARPHRD_APPLETLK = 0x8 - ARPHRD_ARCNET = 0x7 - ARPHRD_ASH = 0x30d - ARPHRD_ATM = 0x13 - ARPHRD_AX25 = 0x3 - ARPHRD_BIF = 0x307 - ARPHRD_CAIF = 0x336 - ARPHRD_CAN = 0x118 - ARPHRD_CHAOS = 0x5 - ARPHRD_CISCO = 0x201 - ARPHRD_CSLIP = 0x101 - ARPHRD_CSLIP6 = 0x103 - ARPHRD_DDCMP = 0x205 - ARPHRD_DLCI = 0xf - ARPHRD_ECONET = 0x30e - ARPHRD_EETHER = 0x2 - ARPHRD_ETHER = 0x1 - ARPHRD_EUI64 = 0x1b - ARPHRD_FCAL = 0x311 - ARPHRD_FCFABRIC = 0x313 - ARPHRD_FCPL = 0x312 - ARPHRD_FCPP = 0x310 - ARPHRD_FDDI = 0x306 - ARPHRD_FRAD = 0x302 - ARPHRD_HDLC = 0x201 - ARPHRD_HIPPI = 0x30c - ARPHRD_HWX25 = 0x110 - ARPHRD_IEEE1394 = 0x18 - ARPHRD_IEEE802 = 0x6 - ARPHRD_IEEE80211 = 0x321 - ARPHRD_IEEE80211_PRISM = 0x322 - ARPHRD_IEEE80211_RADIOTAP = 0x323 - ARPHRD_IEEE802154 = 0x324 - ARPHRD_IEEE802154_MONITOR = 0x325 - ARPHRD_IEEE802_TR = 0x320 - ARPHRD_INFINIBAND = 0x20 - ARPHRD_IP6GRE = 0x337 - ARPHRD_IPDDP = 0x309 - ARPHRD_IPGRE = 0x30a - ARPHRD_IRDA = 0x30f - ARPHRD_LAPB = 0x204 - ARPHRD_LOCALTLK = 0x305 - ARPHRD_LOOPBACK = 0x304 - ARPHRD_METRICOM = 0x17 - ARPHRD_NETLINK = 0x338 - ARPHRD_NETROM = 0x0 - ARPHRD_NONE = 0xfffe - ARPHRD_PHONET = 0x334 - ARPHRD_PHONET_PIPE = 0x335 - ARPHRD_PIMREG = 0x30b - ARPHRD_PPP = 0x200 - ARPHRD_PRONET = 0x4 - ARPHRD_RAWHDLC = 0x206 - ARPHRD_RAWIP = 0x207 - ARPHRD_ROSE = 0x10e - ARPHRD_RSRVD = 0x104 - ARPHRD_SIT = 0x308 - ARPHRD_SKIP = 0x303 - ARPHRD_SLIP = 0x100 - ARPHRD_SLIP6 = 0x102 - ARPHRD_TUNNEL = 0x300 - ARPHRD_TUNNEL6 = 0x301 - ARPHRD_VOID = 0xffff - ARPHRD_VSOCKMON = 0x33a - ARPHRD_X25 = 0x10f - ASI_LEON_DFLUSH = 0x11 - ASI_LEON_IFLUSH = 0x10 - ASI_LEON_MMUFLUSH = 0x18 - AUTOFS_SUPER_MAGIC = 0x187 - B0 = 0x0 - B1000000 = 0x1008 - B110 = 0x3 - B115200 = 0x1002 - B1152000 = 0x1009 - B1200 = 0x9 - B134 = 0x4 - B150 = 0x5 - B1500000 = 0x100a - B1800 = 0xa - B19200 = 0xe - B200 = 0x6 - B2000000 = 0x100b - B230400 = 0x1003 - B2400 = 0xb - B2500000 = 0x100c - B300 = 0x7 - B3000000 = 0x100d - B3500000 = 0x100e - B38400 = 0xf - B4000000 = 0x100f - B460800 = 0x1004 - B4800 = 0xc - B50 = 0x1 - B500000 = 0x1005 - B57600 = 0x1001 - B576000 = 0x1006 - B600 = 0x8 - B75 = 0x2 - B921600 = 0x1007 - B9600 = 0xd - BALLOON_KVM_MAGIC = 0x13661366 - BDEVFS_MAGIC = 0x62646576 - BINDERFS_SUPER_MAGIC = 0x6c6f6f70 - BINFMTFS_MAGIC = 0x42494e4d - BLKBSZGET = 0x40081270 - BLKBSZSET = 0x80081271 - BLKFLSBUF = 0x20001261 - BLKFRAGET = 0x20001265 - BLKFRASET = 0x20001264 - BLKGETSIZE = 0x20001260 - BLKGETSIZE64 = 0x40081272 - BLKPBSZGET = 0x2000127b - BLKRAGET = 0x20001263 - BLKRASET = 0x20001262 - BLKROGET = 0x2000125e - BLKROSET = 0x2000125d - BLKRRPART = 0x2000125f - BLKSECTGET = 0x20001267 - BLKSECTSET = 0x20001266 - BLKSSZGET = 0x20001268 - BOTHER = 0x1000 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_ALU = 0x4 - BPF_ALU64 = 0x7 - BPF_AND = 0x50 - BPF_ANY = 0x0 - BPF_ARSH = 0xc0 - BPF_B = 0x10 - BPF_BUILD_ID_SIZE = 0x14 - BPF_CALL = 0x80 - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_DIV = 0x30 - BPF_DW = 0x18 - BPF_END = 0xd0 - BPF_EXIST = 0x2 - BPF_EXIT = 0x90 - BPF_FROM_BE = 0x8 - BPF_FROM_LE = 0x0 - BPF_FS_MAGIC = 0xcafe4a11 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ALLOW_MULTI = 0x2 - BPF_F_ALLOW_OVERRIDE = 0x1 - BPF_F_ANY_ALIGNMENT = 0x2 - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CURRENT_NETNS = -0x1 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_INGRESS = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NUMA_NODE = 0x4 - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_QUERY_EFFECTIVE = 0x1 - BPF_F_RDONLY = 0x8 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_STRICT_ALIGNMENT = 0x1 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_F_TEST_RND_HI32 = 0x4 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_USER_STACK = 0x100 - BPF_F_WRONLY = 0x10 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_ZERO_SEED = 0x40 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JLE = 0xb0 - BPF_JLT = 0xa0 - BPF_JMP = 0x5 - BPF_JMP32 = 0x6 - BPF_JNE = 0x50 - BPF_JSET = 0x40 - BPF_JSGE = 0x70 - BPF_JSGT = 0x60 - BPF_JSLE = 0xd0 - BPF_JSLT = 0xc0 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LL_OFF = -0x200000 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXINSNS = 0x1000 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MOD = 0x90 - BPF_MOV = 0xb0 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_NET_OFF = -0x100000 - BPF_NOEXIST = 0x1 - BPF_OBJ_NAME_LEN = 0x10 - BPF_OR = 0x40 - BPF_PSEUDO_CALL = 0x1 - BPF_PSEUDO_MAP_FD = 0x1 - BPF_PSEUDO_MAP_VALUE = 0x2 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAG_SIZE = 0x8 - BPF_TAX = 0x0 - BPF_TO_BE = 0x8 - BPF_TO_LE = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BPF_XADD = 0xc0 - BPF_XOR = 0xa0 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x2000 - BSDLY = 0x2000 - BTRFS_SUPER_MAGIC = 0x9123683e - BTRFS_TEST_MAGIC = 0x73727279 - CAN_BCM = 0x2 - CAN_EFF_FLAG = 0x80000000 - CAN_EFF_ID_BITS = 0x1d - CAN_EFF_MASK = 0x1fffffff - CAN_ERR_FLAG = 0x20000000 - CAN_ERR_MASK = 0x1fffffff - CAN_INV_FILTER = 0x20000000 - CAN_ISOTP = 0x6 - CAN_MAX_DLC = 0x8 - CAN_MAX_DLEN = 0x8 - CAN_MCNET = 0x5 - CAN_MTU = 0x10 - CAN_NPROTO = 0x7 - CAN_RAW = 0x1 - CAN_RAW_FILTER_MAX = 0x200 - CAN_RTR_FLAG = 0x40000000 - CAN_SFF_ID_BITS = 0xb - CAN_SFF_MASK = 0x7ff - CAN_TP16 = 0x3 - CAN_TP20 = 0x4 - CAP_AUDIT_CONTROL = 0x1e - CAP_AUDIT_READ = 0x25 - CAP_AUDIT_WRITE = 0x1d - CAP_BLOCK_SUSPEND = 0x24 - CAP_CHOWN = 0x0 - CAP_DAC_OVERRIDE = 0x1 - CAP_DAC_READ_SEARCH = 0x2 - CAP_FOWNER = 0x3 - CAP_FSETID = 0x4 - CAP_IPC_LOCK = 0xe - CAP_IPC_OWNER = 0xf - CAP_KILL = 0x5 - CAP_LAST_CAP = 0x25 - CAP_LEASE = 0x1c - CAP_LINUX_IMMUTABLE = 0x9 - CAP_MAC_ADMIN = 0x21 - CAP_MAC_OVERRIDE = 0x20 - CAP_MKNOD = 0x1b - CAP_NET_ADMIN = 0xc - CAP_NET_BIND_SERVICE = 0xa - CAP_NET_BROADCAST = 0xb - CAP_NET_RAW = 0xd - CAP_SETFCAP = 0x1f - CAP_SETGID = 0x6 - CAP_SETPCAP = 0x8 - CAP_SETUID = 0x7 - CAP_SYSLOG = 0x22 - CAP_SYS_ADMIN = 0x15 - CAP_SYS_BOOT = 0x16 - CAP_SYS_CHROOT = 0x12 - CAP_SYS_MODULE = 0x10 - CAP_SYS_NICE = 0x17 - CAP_SYS_PACCT = 0x14 - CAP_SYS_PTRACE = 0x13 - CAP_SYS_RAWIO = 0x11 - CAP_SYS_RESOURCE = 0x18 - CAP_SYS_TIME = 0x19 - CAP_SYS_TTY_CONFIG = 0x1a - CAP_WAKE_ALARM = 0x23 - CBAUD = 0x100f - CBAUDEX = 0x1000 - CFLUSH = 0xf - CGROUP2_SUPER_MAGIC = 0x63677270 - CGROUP_SUPER_MAGIC = 0x27e0eb - CIBAUD = 0x100f0000 - CLOCAL = 0x800 - CLOCK_BOOTTIME = 0x7 - CLOCK_BOOTTIME_ALARM = 0x9 - CLOCK_DEFAULT = 0x0 - CLOCK_EXT = 0x1 - CLOCK_INT = 0x2 - CLOCK_MONOTONIC = 0x1 - CLOCK_MONOTONIC_COARSE = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_PROCESS_CPUTIME_ID = 0x2 - CLOCK_REALTIME = 0x0 - CLOCK_REALTIME_ALARM = 0x8 - CLOCK_REALTIME_COARSE = 0x5 - CLOCK_TAI = 0xb - CLOCK_THREAD_CPUTIME_ID = 0x3 - CLOCK_TXFROMRX = 0x4 - CLOCK_TXINT = 0x3 - CLONE_CHILD_CLEARTID = 0x200000 - CLONE_CHILD_SETTID = 0x1000000 - CLONE_DETACHED = 0x400000 - CLONE_FILES = 0x400 - CLONE_FS = 0x200 - CLONE_IO = 0x80000000 - CLONE_NEWCGROUP = 0x2000000 - CLONE_NEWIPC = 0x8000000 - CLONE_NEWNET = 0x40000000 - CLONE_NEWNS = 0x20000 - CLONE_NEWPID = 0x20000000 - CLONE_NEWUSER = 0x10000000 - CLONE_NEWUTS = 0x4000000 - CLONE_PARENT = 0x8000 - CLONE_PARENT_SETTID = 0x100000 - CLONE_PIDFD = 0x1000 - CLONE_PTRACE = 0x2000 - CLONE_SETTLS = 0x80000 - CLONE_SIGHAND = 0x800 - CLONE_SYSVSEM = 0x40000 - CLONE_THREAD = 0x10000 - CLONE_UNTRACED = 0x800000 - CLONE_VFORK = 0x4000 - CLONE_VM = 0x100 - CMSPAR = 0x40000000 - CODA_SUPER_MAGIC = 0x73757245 - CR0 = 0x0 - CR1 = 0x200 - CR2 = 0x400 - CR3 = 0x600 - CRAMFS_MAGIC = 0x28cd3d45 - CRDLY = 0x600 - CREAD = 0x80 - CRTSCTS = 0x80000000 - CRYPTO_MAX_NAME = 0x40 - CRYPTO_MSG_MAX = 0x15 - CRYPTO_NR_MSGTYPES = 0x6 - CRYPTO_REPORT_MAXSIZE = 0x160 - CS5 = 0x0 - CS6 = 0x10 - CS7 = 0x20 - CS8 = 0x30 - CSIGNAL = 0xff - CSIZE = 0x30 - CSTART = 0x11 - CSTATUS = 0x0 - CSTOP = 0x13 - CSTOPB = 0x40 - CSUSP = 0x1a - DAXFS_MAGIC = 0x64646178 - DEBUGFS_MAGIC = 0x64626720 - DEVPTS_SUPER_MAGIC = 0x1cd1 - DMA_BUF_MAGIC = 0x444d4142 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x200 - ECHOE = 0x10 - ECHOK = 0x20 - ECHOKE = 0x800 - ECHONL = 0x40 - ECHOPRT = 0x400 - ECRYPTFS_SUPER_MAGIC = 0xf15f - EFD_CLOEXEC = 0x400000 - EFD_NONBLOCK = 0x4000 - EFD_SEMAPHORE = 0x1 - EFIVARFS_MAGIC = 0xde5e81e4 - EFS_SUPER_MAGIC = 0x414a53 - EMT_TAGOVF = 0x1 - ENCODING_DEFAULT = 0x0 - ENCODING_FM_MARK = 0x3 - ENCODING_FM_SPACE = 0x4 - ENCODING_MANCHESTER = 0x5 - ENCODING_NRZ = 0x1 - ENCODING_NRZI = 0x2 - EPOLLERR = 0x8 - EPOLLET = 0x80000000 - EPOLLEXCLUSIVE = 0x10000000 - EPOLLHUP = 0x10 - EPOLLIN = 0x1 - EPOLLMSG = 0x400 - EPOLLONESHOT = 0x40000000 - EPOLLOUT = 0x4 - EPOLLPRI = 0x2 - EPOLLRDBAND = 0x80 - EPOLLRDHUP = 0x2000 - EPOLLRDNORM = 0x40 - EPOLLWAKEUP = 0x20000000 - EPOLLWRBAND = 0x200 - EPOLLWRNORM = 0x100 - EPOLL_CLOEXEC = 0x400000 - EPOLL_CTL_ADD = 0x1 - EPOLL_CTL_DEL = 0x2 - EPOLL_CTL_MOD = 0x3 - ETH_P_1588 = 0x88f7 - ETH_P_8021AD = 0x88a8 - ETH_P_8021AH = 0x88e7 - ETH_P_8021Q = 0x8100 - ETH_P_80221 = 0x8917 - ETH_P_802_2 = 0x4 - ETH_P_802_3 = 0x1 - ETH_P_802_3_MIN = 0x600 - ETH_P_802_EX1 = 0x88b5 - ETH_P_AARP = 0x80f3 - ETH_P_AF_IUCV = 0xfbfb - ETH_P_ALL = 0x3 - ETH_P_AOE = 0x88a2 - ETH_P_ARCNET = 0x1a - ETH_P_ARP = 0x806 - ETH_P_ATALK = 0x809b - ETH_P_ATMFATE = 0x8884 - ETH_P_ATMMPOA = 0x884c - ETH_P_AX25 = 0x2 - ETH_P_BATMAN = 0x4305 - ETH_P_BPQ = 0x8ff - ETH_P_CAIF = 0xf7 - ETH_P_CAN = 0xc - ETH_P_CANFD = 0xd - ETH_P_CONTROL = 0x16 - ETH_P_CUST = 0x6006 - ETH_P_DDCMP = 0x6 - ETH_P_DEC = 0x6000 - ETH_P_DIAG = 0x6005 - ETH_P_DNA_DL = 0x6001 - ETH_P_DNA_RC = 0x6002 - ETH_P_DNA_RT = 0x6003 - ETH_P_DSA = 0x1b - ETH_P_DSA_8021Q = 0xdadb - ETH_P_ECONET = 0x18 - ETH_P_EDSA = 0xdada - ETH_P_ERSPAN = 0x88be - ETH_P_ERSPAN2 = 0x22eb - ETH_P_FCOE = 0x8906 - ETH_P_FIP = 0x8914 - ETH_P_HDLC = 0x19 - ETH_P_HSR = 0x892f - ETH_P_IBOE = 0x8915 - ETH_P_IEEE802154 = 0xf6 - ETH_P_IEEEPUP = 0xa00 - ETH_P_IEEEPUPAT = 0xa01 - ETH_P_IFE = 0xed3e - ETH_P_IP = 0x800 - ETH_P_IPV6 = 0x86dd - ETH_P_IPX = 0x8137 - ETH_P_IRDA = 0x17 - ETH_P_LAT = 0x6004 - ETH_P_LINK_CTL = 0x886c - ETH_P_LLDP = 0x88cc - ETH_P_LOCALTALK = 0x9 - ETH_P_LOOP = 0x60 - ETH_P_LOOPBACK = 0x9000 - ETH_P_MACSEC = 0x88e5 - ETH_P_MAP = 0xf9 - ETH_P_MOBITEX = 0x15 - ETH_P_MPLS_MC = 0x8848 - ETH_P_MPLS_UC = 0x8847 - ETH_P_MVRP = 0x88f5 - ETH_P_NCSI = 0x88f8 - ETH_P_NSH = 0x894f - ETH_P_PAE = 0x888e - ETH_P_PAUSE = 0x8808 - ETH_P_PHONET = 0xf5 - ETH_P_PPPTALK = 0x10 - ETH_P_PPP_DISC = 0x8863 - ETH_P_PPP_MP = 0x8 - ETH_P_PPP_SES = 0x8864 - ETH_P_PREAUTH = 0x88c7 - ETH_P_PRP = 0x88fb - ETH_P_PUP = 0x200 - ETH_P_PUPAT = 0x201 - ETH_P_QINQ1 = 0x9100 - ETH_P_QINQ2 = 0x9200 - ETH_P_QINQ3 = 0x9300 - ETH_P_RARP = 0x8035 - ETH_P_SCA = 0x6007 - ETH_P_SLOW = 0x8809 - ETH_P_SNAP = 0x5 - ETH_P_TDLS = 0x890d - ETH_P_TEB = 0x6558 - ETH_P_TIPC = 0x88ca - ETH_P_TRAILER = 0x1c - ETH_P_TR_802_2 = 0x11 - ETH_P_TSN = 0x22f0 - ETH_P_WAN_PPP = 0x7 - ETH_P_WCCP = 0x883e - ETH_P_X25 = 0x805 - ETH_P_XDSA = 0xf8 - EXABYTE_ENABLE_NEST = 0xf0 - EXT2_SUPER_MAGIC = 0xef53 - EXT3_SUPER_MAGIC = 0xef53 - EXT4_SUPER_MAGIC = 0xef53 - EXTA = 0xe - EXTB = 0xf - EXTPROC = 0x10000 - F2FS_SUPER_MAGIC = 0xf2f52010 - FALLOC_FL_COLLAPSE_RANGE = 0x8 - FALLOC_FL_INSERT_RANGE = 0x20 - FALLOC_FL_KEEP_SIZE = 0x1 - FALLOC_FL_NO_HIDE_STALE = 0x4 - FALLOC_FL_PUNCH_HOLE = 0x2 - FALLOC_FL_UNSHARE_RANGE = 0x40 - FALLOC_FL_ZERO_RANGE = 0x10 - FANOTIFY_METADATA_VERSION = 0x3 - FAN_ACCESS = 0x1 - FAN_ACCESS_PERM = 0x20000 - FAN_ALLOW = 0x1 - FAN_ALL_CLASS_BITS = 0xc - FAN_ALL_EVENTS = 0x3b - FAN_ALL_INIT_FLAGS = 0x3f - FAN_ALL_MARK_FLAGS = 0xff - FAN_ALL_OUTGOING_EVENTS = 0x3403b - FAN_ALL_PERM_EVENTS = 0x30000 - FAN_ATTRIB = 0x4 - FAN_AUDIT = 0x10 - FAN_CLASS_CONTENT = 0x4 - FAN_CLASS_NOTIF = 0x0 - FAN_CLASS_PRE_CONTENT = 0x8 - FAN_CLOEXEC = 0x1 - FAN_CLOSE = 0x18 - FAN_CLOSE_NOWRITE = 0x10 - FAN_CLOSE_WRITE = 0x8 - FAN_CREATE = 0x100 - FAN_DELETE = 0x200 - FAN_DELETE_SELF = 0x400 - FAN_DENY = 0x2 - FAN_ENABLE_AUDIT = 0x40 - FAN_EVENT_INFO_TYPE_FID = 0x1 - FAN_EVENT_METADATA_LEN = 0x18 - FAN_EVENT_ON_CHILD = 0x8000000 - FAN_MARK_ADD = 0x1 - FAN_MARK_DONT_FOLLOW = 0x4 - FAN_MARK_FILESYSTEM = 0x100 - FAN_MARK_FLUSH = 0x80 - FAN_MARK_IGNORED_MASK = 0x20 - FAN_MARK_IGNORED_SURV_MODIFY = 0x40 - FAN_MARK_INODE = 0x0 - FAN_MARK_MOUNT = 0x10 - FAN_MARK_ONLYDIR = 0x8 - FAN_MARK_REMOVE = 0x2 - FAN_MODIFY = 0x2 - FAN_MOVE = 0xc0 - FAN_MOVED_FROM = 0x40 - FAN_MOVED_TO = 0x80 - FAN_MOVE_SELF = 0x800 - FAN_NOFD = -0x1 - FAN_NONBLOCK = 0x2 - FAN_ONDIR = 0x40000000 - FAN_OPEN = 0x20 - FAN_OPEN_EXEC = 0x1000 - FAN_OPEN_EXEC_PERM = 0x40000 - FAN_OPEN_PERM = 0x10000 - FAN_Q_OVERFLOW = 0x4000 - FAN_REPORT_FID = 0x200 - FAN_REPORT_TID = 0x100 - FAN_UNLIMITED_MARKS = 0x20 - FAN_UNLIMITED_QUEUE = 0x10 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x8000 - FFDLY = 0x8000 - FLUSHO = 0x1000 - FS_ENCRYPTION_MODE_ADIANTUM = 0x9 - FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 - FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 - FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 - FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 - FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 - FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 - FS_ENCRYPTION_MODE_INVALID = 0x0 - FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 - FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 - FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 - FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 - FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 - FS_KEY_DESCRIPTOR_SIZE = 0x8 - FS_KEY_DESC_PREFIX = "fscrypt:" - FS_KEY_DESC_PREFIX_SIZE = 0x8 - FS_MAX_KEY_SIZE = 0x40 - FS_POLICY_FLAGS_PAD_16 = 0x2 - FS_POLICY_FLAGS_PAD_32 = 0x3 - FS_POLICY_FLAGS_PAD_4 = 0x0 - FS_POLICY_FLAGS_PAD_8 = 0x1 - FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x7 - FUTEXFS_SUPER_MAGIC = 0xbad1dea - F_ADD_SEALS = 0x409 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x406 - F_EXLCK = 0x4 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLEASE = 0x401 - F_GETLK = 0x7 - F_GETLK64 = 0x7 - F_GETOWN = 0x5 - F_GETOWN_EX = 0x10 - F_GETPIPE_SZ = 0x408 - F_GETSIG = 0xb - F_GET_FILE_RW_HINT = 0x40d - F_GET_RW_HINT = 0x40b - F_GET_SEALS = 0x40a - F_LOCK = 0x1 - F_NOTIFY = 0x402 - F_OFD_GETLK = 0x24 - F_OFD_SETLK = 0x25 - F_OFD_SETLKW = 0x26 - F_OK = 0x0 - F_RDLCK = 0x1 - F_SEAL_FUTURE_WRITE = 0x10 - F_SEAL_GROW = 0x4 - F_SEAL_SEAL = 0x1 - F_SEAL_SHRINK = 0x2 - F_SEAL_WRITE = 0x8 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLEASE = 0x400 - F_SETLK = 0x8 - F_SETLK64 = 0x8 - F_SETLKW = 0x9 - F_SETLKW64 = 0x9 - F_SETOWN = 0x6 - F_SETOWN_EX = 0xf - F_SETPIPE_SZ = 0x407 - F_SETSIG = 0xa - F_SET_FILE_RW_HINT = 0x40e - F_SET_RW_HINT = 0x40c - F_SHLCK = 0x8 - F_TEST = 0x3 - F_TLOCK = 0x2 - F_ULOCK = 0x0 - F_UNLCK = 0x3 - F_WRLCK = 0x2 - GENL_ADMIN_PERM = 0x1 - GENL_CMD_CAP_DO = 0x2 - GENL_CMD_CAP_DUMP = 0x4 - GENL_CMD_CAP_HASPOL = 0x8 - GENL_HDRLEN = 0x4 - GENL_ID_CTRL = 0x10 - GENL_ID_PMCRAID = 0x12 - GENL_ID_VFS_DQUOT = 0x11 - GENL_MAX_ID = 0x3ff - GENL_MIN_ID = 0x10 - GENL_NAMSIZ = 0x10 - GENL_START_ALLOC = 0x13 - GENL_UNS_ADMIN_PERM = 0x10 - GRND_NONBLOCK = 0x1 - GRND_RANDOM = 0x2 - HDIO_DRIVE_CMD = 0x31f - HDIO_DRIVE_CMD_AEB = 0x31e - HDIO_DRIVE_CMD_HDR_SIZE = 0x4 - HDIO_DRIVE_HOB_HDR_SIZE = 0x8 - HDIO_DRIVE_RESET = 0x31c - HDIO_DRIVE_TASK = 0x31e - HDIO_DRIVE_TASKFILE = 0x31d - HDIO_DRIVE_TASK_HDR_SIZE = 0x8 - HDIO_GETGEO = 0x301 - HDIO_GET_32BIT = 0x309 - HDIO_GET_ACOUSTIC = 0x30f - HDIO_GET_ADDRESS = 0x310 - HDIO_GET_BUSSTATE = 0x31a - HDIO_GET_DMA = 0x30b - HDIO_GET_IDENTITY = 0x30d - HDIO_GET_KEEPSETTINGS = 0x308 - HDIO_GET_MULTCOUNT = 0x304 - HDIO_GET_NICE = 0x30c - HDIO_GET_NOWERR = 0x30a - HDIO_GET_QDMA = 0x305 - HDIO_GET_UNMASKINTR = 0x302 - HDIO_GET_WCACHE = 0x30e - HDIO_OBSOLETE_IDENTITY = 0x307 - HDIO_SCAN_HWIF = 0x328 - HDIO_SET_32BIT = 0x324 - HDIO_SET_ACOUSTIC = 0x32c - HDIO_SET_ADDRESS = 0x32f - HDIO_SET_BUSSTATE = 0x32d - HDIO_SET_DMA = 0x326 - HDIO_SET_KEEPSETTINGS = 0x323 - HDIO_SET_MULTCOUNT = 0x321 - HDIO_SET_NICE = 0x329 - HDIO_SET_NOWERR = 0x325 - HDIO_SET_PIO_MODE = 0x327 - HDIO_SET_QDMA = 0x32e - HDIO_SET_UNMASKINTR = 0x322 - HDIO_SET_WCACHE = 0x32b - HDIO_SET_XFER = 0x306 - HDIO_TRISTATE_HWIF = 0x31b - HDIO_UNREGISTER_HWIF = 0x32a - HOSTFS_SUPER_MAGIC = 0xc0ffee - HPFS_SUPER_MAGIC = 0xf995e849 - HUGETLBFS_MAGIC = 0x958458f6 - HUPCL = 0x400 - IBSHIFT = 0x10 - ICANON = 0x2 - ICMPV6_FILTER = 0x1 - ICRNL = 0x100 - IEXTEN = 0x8000 - IFA_F_DADFAILED = 0x8 - IFA_F_DEPRECATED = 0x20 - IFA_F_HOMEADDRESS = 0x10 - IFA_F_MANAGETEMPADDR = 0x100 - IFA_F_MCAUTOJOIN = 0x400 - IFA_F_NODAD = 0x2 - IFA_F_NOPREFIXROUTE = 0x200 - IFA_F_OPTIMISTIC = 0x4 - IFA_F_PERMANENT = 0x80 - IFA_F_SECONDARY = 0x1 - IFA_F_STABLE_PRIVACY = 0x800 - IFA_F_TEMPORARY = 0x1 - IFA_F_TENTATIVE = 0x40 - IFA_MAX = 0xa - IFF_ALLMULTI = 0x200 - IFF_ATTACH_QUEUE = 0x200 - IFF_AUTOMEDIA = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_DETACH_QUEUE = 0x400 - IFF_DORMANT = 0x20000 - IFF_DYNAMIC = 0x8000 - IFF_ECHO = 0x40000 - IFF_LOOPBACK = 0x8 - IFF_LOWER_UP = 0x10000 - IFF_MASTER = 0x400 - IFF_MULTICAST = 0x1000 - IFF_MULTI_QUEUE = 0x100 - IFF_NAPI = 0x10 - IFF_NAPI_FRAGS = 0x20 - IFF_NOARP = 0x80 - IFF_NOFILTER = 0x1000 - IFF_NOTRAILERS = 0x20 - IFF_NO_PI = 0x1000 - IFF_ONE_QUEUE = 0x2000 - IFF_PERSIST = 0x800 - IFF_POINTOPOINT = 0x10 - IFF_PORTSEL = 0x2000 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SLAVE = 0x800 - IFF_TAP = 0x2 - IFF_TUN = 0x1 - IFF_TUN_EXCL = 0x8000 - IFF_UP = 0x1 - IFF_VNET_HDR = 0x4000 - IFF_VOLATILE = 0x70c5a - IFNAMSIZ = 0x10 - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_ACCESS = 0x1 - IN_ALL_EVENTS = 0xfff - IN_ATTRIB = 0x4 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLOEXEC = 0x400000 - IN_CLOSE = 0x18 - IN_CLOSE_NOWRITE = 0x10 - IN_CLOSE_WRITE = 0x8 - IN_CREATE = 0x100 - IN_DELETE = 0x200 - IN_DELETE_SELF = 0x400 - IN_DONT_FOLLOW = 0x2000000 - IN_EXCL_UNLINK = 0x4000000 - IN_IGNORED = 0x8000 - IN_ISDIR = 0x40000000 - IN_LOOPBACKNET = 0x7f - IN_MASK_ADD = 0x20000000 - IN_MASK_CREATE = 0x10000000 - IN_MODIFY = 0x2 - IN_MOVE = 0xc0 - IN_MOVED_FROM = 0x40 - IN_MOVED_TO = 0x80 - IN_MOVE_SELF = 0x800 - IN_NONBLOCK = 0x4000 - IN_ONESHOT = 0x80000000 - IN_ONLYDIR = 0x1000000 - IN_OPEN = 0x20 - IN_Q_OVERFLOW = 0x4000 - IN_UNMOUNT = 0x2000 - IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 - IPPROTO_AH = 0x33 - IPPROTO_BEETPH = 0x5e - IPPROTO_COMP = 0x6c - IPPROTO_DCCP = 0x21 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_ENCAP = 0x62 - IPPROTO_ESP = 0x32 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GRE = 0x2f - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IGMP = 0x2 - IPPROTO_IP = 0x0 - IPPROTO_IPIP = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_MH = 0x87 - IPPROTO_MPLS = 0x89 - IPPROTO_MTP = 0x5c - IPPROTO_NONE = 0x3b - IPPROTO_PIM = 0x67 - IPPROTO_PUP = 0xc - IPPROTO_RAW = 0xff - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_SCTP = 0x84 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_UDP = 0x11 - IPPROTO_UDPLITE = 0x88 - IPV6_2292DSTOPTS = 0x4 - IPV6_2292HOPLIMIT = 0x8 - IPV6_2292HOPOPTS = 0x3 - IPV6_2292PKTINFO = 0x2 - IPV6_2292PKTOPTIONS = 0x6 - IPV6_2292RTHDR = 0x5 - IPV6_ADDRFORM = 0x1 - IPV6_ADDR_PREFERENCES = 0x48 - IPV6_ADD_MEMBERSHIP = 0x14 - IPV6_AUTHHDR = 0xa - IPV6_AUTOFLOWLABEL = 0x46 - IPV6_CHECKSUM = 0x7 - IPV6_DONTFRAG = 0x3e - IPV6_DROP_MEMBERSHIP = 0x15 - IPV6_DSTOPTS = 0x3b - IPV6_FREEBIND = 0x4e - IPV6_HDRINCL = 0x24 - IPV6_HOPLIMIT = 0x34 - IPV6_HOPOPTS = 0x36 - IPV6_IPSEC_POLICY = 0x22 - IPV6_JOIN_ANYCAST = 0x1b - IPV6_JOIN_GROUP = 0x14 - IPV6_LEAVE_ANYCAST = 0x1c - IPV6_LEAVE_GROUP = 0x15 - IPV6_MINHOPCOUNT = 0x49 - IPV6_MTU = 0x18 - IPV6_MTU_DISCOVER = 0x17 - IPV6_MULTICAST_ALL = 0x1d - IPV6_MULTICAST_HOPS = 0x12 - IPV6_MULTICAST_IF = 0x11 - IPV6_MULTICAST_LOOP = 0x13 - IPV6_NEXTHOP = 0x9 - IPV6_ORIGDSTADDR = 0x4a - IPV6_PATHMTU = 0x3d - IPV6_PKTINFO = 0x32 - IPV6_PMTUDISC_DO = 0x2 - IPV6_PMTUDISC_DONT = 0x0 - IPV6_PMTUDISC_INTERFACE = 0x4 - IPV6_PMTUDISC_OMIT = 0x5 - IPV6_PMTUDISC_PROBE = 0x3 - IPV6_PMTUDISC_WANT = 0x1 - IPV6_RECVDSTOPTS = 0x3a - IPV6_RECVERR = 0x19 - IPV6_RECVFRAGSIZE = 0x4d - IPV6_RECVHOPLIMIT = 0x33 - IPV6_RECVHOPOPTS = 0x35 - IPV6_RECVORIGDSTADDR = 0x4a - IPV6_RECVPATHMTU = 0x3c - IPV6_RECVPKTINFO = 0x31 - IPV6_RECVRTHDR = 0x38 - IPV6_RECVTCLASS = 0x42 - IPV6_ROUTER_ALERT = 0x16 - IPV6_ROUTER_ALERT_ISOLATE = 0x1e - IPV6_RTHDR = 0x39 - IPV6_RTHDRDSTOPTS = 0x37 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_RXDSTOPTS = 0x3b - IPV6_RXHOPOPTS = 0x36 - IPV6_TCLASS = 0x43 - IPV6_TRANSPARENT = 0x4b - IPV6_UNICAST_HOPS = 0x10 - IPV6_UNICAST_IF = 0x4c - IPV6_V6ONLY = 0x1a - IPV6_XFRM_POLICY = 0x23 - IP_ADD_MEMBERSHIP = 0x23 - IP_ADD_SOURCE_MEMBERSHIP = 0x27 - IP_BIND_ADDRESS_NO_PORT = 0x18 - IP_BLOCK_SOURCE = 0x26 - IP_CHECKSUM = 0x17 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DROP_MEMBERSHIP = 0x24 - IP_DROP_SOURCE_MEMBERSHIP = 0x28 - IP_FREEBIND = 0xf - IP_HDRINCL = 0x3 - IP_IPSEC_POLICY = 0x10 - IP_MAXPACKET = 0xffff - IP_MAX_MEMBERSHIPS = 0x14 - IP_MF = 0x2000 - IP_MINTTL = 0x15 - IP_MSFILTER = 0x29 - IP_MSS = 0x240 - IP_MTU = 0xe - IP_MTU_DISCOVER = 0xa - IP_MULTICAST_ALL = 0x31 - IP_MULTICAST_IF = 0x20 - IP_MULTICAST_LOOP = 0x22 - IP_MULTICAST_TTL = 0x21 - IP_NODEFRAG = 0x16 - IP_OFFMASK = 0x1fff - IP_OPTIONS = 0x4 - IP_ORIGDSTADDR = 0x14 - IP_PASSSEC = 0x12 - IP_PKTINFO = 0x8 - IP_PKTOPTIONS = 0x9 - IP_PMTUDISC = 0xa - IP_PMTUDISC_DO = 0x2 - IP_PMTUDISC_DONT = 0x0 - IP_PMTUDISC_INTERFACE = 0x4 - IP_PMTUDISC_OMIT = 0x5 - IP_PMTUDISC_PROBE = 0x3 - IP_PMTUDISC_WANT = 0x1 - IP_RECVERR = 0xb - IP_RECVFRAGSIZE = 0x19 - IP_RECVOPTS = 0x6 - IP_RECVORIGDSTADDR = 0x14 - IP_RECVRETOPTS = 0x7 - IP_RECVTOS = 0xd - IP_RECVTTL = 0xc - IP_RETOPTS = 0x7 - IP_RF = 0x8000 - IP_ROUTER_ALERT = 0x5 - IP_TOS = 0x1 - IP_TRANSPARENT = 0x13 - IP_TTL = 0x2 - IP_UNBLOCK_SOURCE = 0x25 - IP_UNICAST_IF = 0x32 - IP_XFRM_POLICY = 0x11 - ISIG = 0x1 - ISOFS_SUPER_MAGIC = 0x9660 - ISTRIP = 0x20 - IUCLC = 0x200 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x1000 - IXON = 0x400 - JFFS2_SUPER_MAGIC = 0x72b6 - KEXEC_ARCH_386 = 0x30000 - KEXEC_ARCH_68K = 0x40000 - KEXEC_ARCH_AARCH64 = 0xb70000 - KEXEC_ARCH_ARM = 0x280000 - KEXEC_ARCH_DEFAULT = 0x0 - KEXEC_ARCH_IA_64 = 0x320000 - KEXEC_ARCH_MASK = 0xffff0000 - KEXEC_ARCH_MIPS = 0x80000 - KEXEC_ARCH_MIPS_LE = 0xa0000 - KEXEC_ARCH_PPC = 0x140000 - KEXEC_ARCH_PPC64 = 0x150000 - KEXEC_ARCH_S390 = 0x160000 - KEXEC_ARCH_SH = 0x2a0000 - KEXEC_ARCH_X86_64 = 0x3e0000 - KEXEC_FILE_NO_INITRAMFS = 0x4 - KEXEC_FILE_ON_CRASH = 0x2 - KEXEC_FILE_UNLOAD = 0x1 - KEXEC_ON_CRASH = 0x1 - KEXEC_PRESERVE_CONTEXT = 0x2 - KEXEC_SEGMENT_MAX = 0x10 - KEYCTL_ASSUME_AUTHORITY = 0x10 - KEYCTL_CAPABILITIES = 0x1f - KEYCTL_CAPS0_BIG_KEY = 0x10 - KEYCTL_CAPS0_CAPABILITIES = 0x1 - KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 - KEYCTL_CAPS0_INVALIDATE = 0x20 - KEYCTL_CAPS0_MOVE = 0x80 - KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 - KEYCTL_CAPS0_PUBLIC_KEY = 0x8 - KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 - KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 - KEYCTL_CAPS1_NS_KEY_TAG = 0x2 - KEYCTL_CHOWN = 0x4 - KEYCTL_CLEAR = 0x7 - KEYCTL_DESCRIBE = 0x6 - KEYCTL_DH_COMPUTE = 0x17 - KEYCTL_GET_KEYRING_ID = 0x0 - KEYCTL_GET_PERSISTENT = 0x16 - KEYCTL_GET_SECURITY = 0x11 - KEYCTL_INSTANTIATE = 0xc - KEYCTL_INSTANTIATE_IOV = 0x14 - KEYCTL_INVALIDATE = 0x15 - KEYCTL_JOIN_SESSION_KEYRING = 0x1 - KEYCTL_LINK = 0x8 - KEYCTL_MOVE = 0x1e - KEYCTL_MOVE_EXCL = 0x1 - KEYCTL_NEGATE = 0xd - KEYCTL_PKEY_DECRYPT = 0x1a - KEYCTL_PKEY_ENCRYPT = 0x19 - KEYCTL_PKEY_QUERY = 0x18 - KEYCTL_PKEY_SIGN = 0x1b - KEYCTL_PKEY_VERIFY = 0x1c - KEYCTL_READ = 0xb - KEYCTL_REJECT = 0x13 - KEYCTL_RESTRICT_KEYRING = 0x1d - KEYCTL_REVOKE = 0x3 - KEYCTL_SEARCH = 0xa - KEYCTL_SESSION_TO_PARENT = 0x12 - KEYCTL_SETPERM = 0x5 - KEYCTL_SET_REQKEY_KEYRING = 0xe - KEYCTL_SET_TIMEOUT = 0xf - KEYCTL_SUPPORTS_DECRYPT = 0x2 - KEYCTL_SUPPORTS_ENCRYPT = 0x1 - KEYCTL_SUPPORTS_SIGN = 0x4 - KEYCTL_SUPPORTS_VERIFY = 0x8 - KEYCTL_UNLINK = 0x9 - KEYCTL_UPDATE = 0x2 - KEY_REQKEY_DEFL_DEFAULT = 0x0 - KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 - KEY_REQKEY_DEFL_NO_CHANGE = -0x1 - KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 - KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 - KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 - KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 - KEY_REQKEY_DEFL_USER_KEYRING = 0x4 - KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 - KEY_SPEC_GROUP_KEYRING = -0x6 - KEY_SPEC_PROCESS_KEYRING = -0x2 - KEY_SPEC_REQKEY_AUTH_KEY = -0x7 - KEY_SPEC_REQUESTOR_KEYRING = -0x8 - KEY_SPEC_SESSION_KEYRING = -0x3 - KEY_SPEC_THREAD_KEYRING = -0x1 - KEY_SPEC_USER_KEYRING = -0x4 - KEY_SPEC_USER_SESSION_KEYRING = -0x5 - LINUX_REBOOT_CMD_CAD_OFF = 0x0 - LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef - LINUX_REBOOT_CMD_HALT = 0xcdef0123 - LINUX_REBOOT_CMD_KEXEC = 0x45584543 - LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc - LINUX_REBOOT_CMD_RESTART = 0x1234567 - LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 - LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 - LINUX_REBOOT_MAGIC1 = 0xfee1dead - LINUX_REBOOT_MAGIC2 = 0x28121969 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - LOOP_CLR_FD = 0x4c01 - LOOP_CTL_ADD = 0x4c80 - LOOP_CTL_GET_FREE = 0x4c82 - LOOP_CTL_REMOVE = 0x4c81 - LOOP_GET_STATUS = 0x4c03 - LOOP_GET_STATUS64 = 0x4c05 - LOOP_SET_BLOCK_SIZE = 0x4c09 - LOOP_SET_CAPACITY = 0x4c07 - LOOP_SET_DIRECT_IO = 0x4c08 - LOOP_SET_FD = 0x4c00 - LOOP_SET_STATUS = 0x4c02 - LOOP_SET_STATUS64 = 0x4c04 - LO_KEY_SIZE = 0x20 - LO_NAME_SIZE = 0x40 - MADV_DODUMP = 0x11 - MADV_DOFORK = 0xb - MADV_DONTDUMP = 0x10 - MADV_DONTFORK = 0xa - MADV_DONTNEED = 0x4 - MADV_FREE = 0x8 - MADV_HUGEPAGE = 0xe - MADV_HWPOISON = 0x64 - MADV_KEEPONFORK = 0x13 - MADV_MERGEABLE = 0xc - MADV_NOHUGEPAGE = 0xf - MADV_NORMAL = 0x0 - MADV_RANDOM = 0x1 - MADV_REMOVE = 0x9 - MADV_SEQUENTIAL = 0x2 - MADV_UNMERGEABLE = 0xd - MADV_WILLNEED = 0x3 - MADV_WIPEONFORK = 0x12 - MAP_ANON = 0x20 - MAP_ANONYMOUS = 0x20 - MAP_DENYWRITE = 0x800 - MAP_EXECUTABLE = 0x1000 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_FIXED_NOREPLACE = 0x100000 - MAP_GROWSDOWN = 0x200 - MAP_HUGETLB = 0x40000 - MAP_HUGE_MASK = 0x3f - MAP_HUGE_SHIFT = 0x1a - MAP_LOCKED = 0x100 - MAP_NONBLOCK = 0x10000 - MAP_NORESERVE = 0x40 - MAP_POPULATE = 0x8000 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x20 - MAP_SHARED = 0x1 - MAP_SHARED_VALIDATE = 0x3 - MAP_STACK = 0x20000 - MAP_TYPE = 0xf - MCAST_BLOCK_SOURCE = 0x2b - MCAST_EXCLUDE = 0x0 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x2a - MCAST_JOIN_SOURCE_GROUP = 0x2e - MCAST_LEAVE_GROUP = 0x2d - MCAST_LEAVE_SOURCE_GROUP = 0x2f - MCAST_MSFILTER = 0x30 - MCAST_UNBLOCK_SOURCE = 0x2c - MCL_CURRENT = 0x2000 - MCL_FUTURE = 0x4000 - MCL_ONFAULT = 0x8000 - MFD_ALLOW_SEALING = 0x2 - MFD_CLOEXEC = 0x1 - MFD_HUGETLB = 0x4 - MFD_HUGE_16GB = -0x78000000 - MFD_HUGE_16MB = 0x60000000 - MFD_HUGE_1GB = 0x78000000 - MFD_HUGE_1MB = 0x50000000 - MFD_HUGE_256MB = 0x70000000 - MFD_HUGE_2GB = 0x7c000000 - MFD_HUGE_2MB = 0x54000000 - MFD_HUGE_32MB = 0x64000000 - MFD_HUGE_512KB = 0x4c000000 - MFD_HUGE_512MB = 0x74000000 - MFD_HUGE_64KB = 0x40000000 - MFD_HUGE_8MB = 0x5c000000 - MFD_HUGE_MASK = 0x3f - MFD_HUGE_SHIFT = 0x1a - MINIX2_SUPER_MAGIC = 0x2468 - MINIX2_SUPER_MAGIC2 = 0x2478 - MINIX3_SUPER_MAGIC = 0x4d5a - MINIX_SUPER_MAGIC = 0x137f - MINIX_SUPER_MAGIC2 = 0x138f - MNT_DETACH = 0x2 - MNT_EXPIRE = 0x4 - MNT_FORCE = 0x1 - MODULE_INIT_IGNORE_MODVERSIONS = 0x1 - MODULE_INIT_IGNORE_VERMAGIC = 0x2 - MSDOS_SUPER_MAGIC = 0x4d44 - MSG_BATCH = 0x40000 - MSG_CMSG_CLOEXEC = 0x40000000 - MSG_CONFIRM = 0x800 - MSG_CTRUNC = 0x8 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x40 - MSG_EOR = 0x80 - MSG_ERRQUEUE = 0x2000 - MSG_FASTOPEN = 0x20000000 - MSG_FIN = 0x200 - MSG_MORE = 0x8000 - MSG_NOSIGNAL = 0x4000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_PROXY = 0x10 - MSG_RST = 0x1000 - MSG_SYN = 0x400 - MSG_TRUNC = 0x20 - MSG_TRYHARD = 0x4 - MSG_WAITALL = 0x100 - MSG_WAITFORONE = 0x10000 - MSG_ZEROCOPY = 0x4000000 - MS_ACTIVE = 0x40000000 - MS_ASYNC = 0x1 - MS_BIND = 0x1000 - MS_BORN = 0x20000000 - MS_DIRSYNC = 0x80 - MS_INVALIDATE = 0x2 - MS_I_VERSION = 0x800000 - MS_KERNMOUNT = 0x400000 - MS_LAZYTIME = 0x2000000 - MS_MANDLOCK = 0x40 - MS_MGC_MSK = 0xffff0000 - MS_MGC_VAL = 0xc0ed0000 - MS_MOVE = 0x2000 - MS_NOATIME = 0x400 - MS_NODEV = 0x4 - MS_NODIRATIME = 0x800 - MS_NOEXEC = 0x8 - MS_NOREMOTELOCK = 0x8000000 - MS_NOSEC = 0x10000000 - MS_NOSUID = 0x2 - MS_NOUSER = -0x80000000 - MS_POSIXACL = 0x10000 - MS_PRIVATE = 0x40000 - MS_RDONLY = 0x1 - MS_REC = 0x4000 - MS_RELATIME = 0x200000 - MS_REMOUNT = 0x20 - MS_RMT_MASK = 0x2800051 - MS_SHARED = 0x100000 - MS_SILENT = 0x8000 - MS_SLAVE = 0x80000 - MS_STRICTATIME = 0x1000000 - MS_SUBMOUNT = 0x4000000 - MS_SYNC = 0x4 - MS_SYNCHRONOUS = 0x10 - MS_UNBINDABLE = 0x20000 - MS_VERBOSE = 0x8000 - MTD_INODE_FS_MAGIC = 0x11307854 - NAME_MAX = 0xff - NCP_SUPER_MAGIC = 0x564c - NETLINK_ADD_MEMBERSHIP = 0x1 - NETLINK_AUDIT = 0x9 - NETLINK_BROADCAST_ERROR = 0x4 - NETLINK_CAP_ACK = 0xa - NETLINK_CONNECTOR = 0xb - NETLINK_CRYPTO = 0x15 - NETLINK_DNRTMSG = 0xe - NETLINK_DROP_MEMBERSHIP = 0x2 - NETLINK_ECRYPTFS = 0x13 - NETLINK_EXT_ACK = 0xb - NETLINK_FIB_LOOKUP = 0xa - NETLINK_FIREWALL = 0x3 - NETLINK_GENERIC = 0x10 - NETLINK_GET_STRICT_CHK = 0xc - NETLINK_INET_DIAG = 0x4 - NETLINK_IP6_FW = 0xd - NETLINK_ISCSI = 0x8 - NETLINK_KOBJECT_UEVENT = 0xf - NETLINK_LISTEN_ALL_NSID = 0x8 - NETLINK_LIST_MEMBERSHIPS = 0x9 - NETLINK_NETFILTER = 0xc - NETLINK_NFLOG = 0x5 - NETLINK_NO_ENOBUFS = 0x5 - NETLINK_PKTINFO = 0x3 - NETLINK_RDMA = 0x14 - NETLINK_ROUTE = 0x0 - NETLINK_RX_RING = 0x6 - NETLINK_SCSITRANSPORT = 0x12 - NETLINK_SELINUX = 0x7 - NETLINK_SMC = 0x16 - NETLINK_SOCK_DIAG = 0x4 - NETLINK_TX_RING = 0x7 - NETLINK_UNUSED = 0x1 - NETLINK_USERSOCK = 0x2 - NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x5 - NETNSA_NSID_NOT_ASSIGNED = -0x1 - NFDBITS = 0x40 - NFNETLINK_V0 = 0x0 - NFNLGRP_ACCT_QUOTA = 0x8 - NFNLGRP_CONNTRACK_DESTROY = 0x3 - NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 - NFNLGRP_CONNTRACK_EXP_NEW = 0x4 - NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 - NFNLGRP_CONNTRACK_NEW = 0x1 - NFNLGRP_CONNTRACK_UPDATE = 0x2 - NFNLGRP_MAX = 0x9 - NFNLGRP_NFTABLES = 0x7 - NFNLGRP_NFTRACE = 0x9 - NFNLGRP_NONE = 0x0 - NFNL_BATCH_MAX = 0x1 - NFNL_MSG_BATCH_BEGIN = 0x10 - NFNL_MSG_BATCH_END = 0x11 - NFNL_NFA_NEST = 0x8000 - NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc - NFNL_SUBSYS_CTHELPER = 0x9 - NFNL_SUBSYS_CTNETLINK = 0x1 - NFNL_SUBSYS_CTNETLINK_EXP = 0x2 - NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 - NFNL_SUBSYS_IPSET = 0x6 - NFNL_SUBSYS_NFTABLES = 0xa - NFNL_SUBSYS_NFT_COMPAT = 0xb - NFNL_SUBSYS_NONE = 0x0 - NFNL_SUBSYS_OSF = 0x5 - NFNL_SUBSYS_QUEUE = 0x3 - NFNL_SUBSYS_ULOG = 0x4 - NFS_SUPER_MAGIC = 0x6969 - NILFS_SUPER_MAGIC = 0x3434 - NL0 = 0x0 - NL1 = 0x100 - NLA_ALIGNTO = 0x4 - NLA_F_NESTED = 0x8000 - NLA_F_NET_BYTEORDER = 0x4000 - NLA_HDRLEN = 0x4 - NLDLY = 0x100 - NLMSG_ALIGNTO = 0x4 - NLMSG_DONE = 0x3 - NLMSG_ERROR = 0x2 - NLMSG_HDRLEN = 0x10 - NLMSG_MIN_TYPE = 0x10 - NLMSG_NOOP = 0x1 - NLMSG_OVERRUN = 0x4 - NLM_F_ACK = 0x4 - NLM_F_ACK_TLVS = 0x200 - NLM_F_APPEND = 0x800 - NLM_F_ATOMIC = 0x400 - NLM_F_CAPPED = 0x100 - NLM_F_CREATE = 0x400 - NLM_F_DUMP = 0x300 - NLM_F_DUMP_FILTERED = 0x20 - NLM_F_DUMP_INTR = 0x10 - NLM_F_ECHO = 0x8 - NLM_F_EXCL = 0x200 - NLM_F_MATCH = 0x200 - NLM_F_MULTI = 0x2 - NLM_F_NONREC = 0x100 - NLM_F_REPLACE = 0x100 - NLM_F_REQUEST = 0x1 - NLM_F_ROOT = 0x100 - NOFLSH = 0x80 - NSFS_MAGIC = 0x6e736673 - NS_GET_NSTYPE = 0x2000b703 - NS_GET_OWNER_UID = 0x2000b704 - NS_GET_PARENT = 0x2000b702 - NS_GET_USERNS = 0x2000b701 - OCFS2_SUPER_MAGIC = 0x7461636f - OCRNL = 0x8 - OFDEL = 0x80 - OFILL = 0x40 - OLCUC = 0x2 - ONLCR = 0x4 - ONLRET = 0x20 - ONOCR = 0x10 - OPENPROM_SUPER_MAGIC = 0x9fa1 - OPOST = 0x1 - OVERLAYFS_SUPER_MAGIC = 0x794c7630 - O_ACCMODE = 0x3 - O_APPEND = 0x8 - O_ASYNC = 0x40 - O_CLOEXEC = 0x400000 - O_CREAT = 0x200 - O_DIRECT = 0x100000 - O_DIRECTORY = 0x10000 - O_DSYNC = 0x2000 - O_EXCL = 0x800 - O_FSYNC = 0x802000 - O_LARGEFILE = 0x0 - O_NDELAY = 0x4004 - O_NOATIME = 0x200000 - O_NOCTTY = 0x8000 - O_NOFOLLOW = 0x20000 - O_NONBLOCK = 0x4000 - O_PATH = 0x1000000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_RSYNC = 0x802000 - O_SYNC = 0x802000 - O_TMPFILE = 0x2010000 - O_TRUNC = 0x400 - O_WRONLY = 0x1 - PACKET_ADD_MEMBERSHIP = 0x1 - PACKET_AUXDATA = 0x8 - PACKET_BROADCAST = 0x1 - PACKET_COPY_THRESH = 0x7 - PACKET_DROP_MEMBERSHIP = 0x2 - PACKET_FANOUT = 0x12 - PACKET_FANOUT_CBPF = 0x6 - PACKET_FANOUT_CPU = 0x2 - PACKET_FANOUT_DATA = 0x16 - PACKET_FANOUT_EBPF = 0x7 - PACKET_FANOUT_FLAG_DEFRAG = 0x8000 - PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 - PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 - PACKET_FANOUT_HASH = 0x0 - PACKET_FANOUT_LB = 0x1 - PACKET_FANOUT_QM = 0x5 - PACKET_FANOUT_RND = 0x4 - PACKET_FANOUT_ROLLOVER = 0x3 - PACKET_FASTROUTE = 0x6 - PACKET_HDRLEN = 0xb - PACKET_HOST = 0x0 - PACKET_IGNORE_OUTGOING = 0x17 - PACKET_KERNEL = 0x7 - PACKET_LOOPBACK = 0x5 - PACKET_LOSS = 0xe - PACKET_MR_ALLMULTI = 0x2 - PACKET_MR_MULTICAST = 0x0 - PACKET_MR_PROMISC = 0x1 - PACKET_MR_UNICAST = 0x3 - PACKET_MULTICAST = 0x2 - PACKET_ORIGDEV = 0x9 - PACKET_OTHERHOST = 0x3 - PACKET_OUTGOING = 0x4 - PACKET_QDISC_BYPASS = 0x14 - PACKET_RECV_OUTPUT = 0x3 - PACKET_RESERVE = 0xc - PACKET_ROLLOVER_STATS = 0x15 - PACKET_RX_RING = 0x5 - PACKET_STATISTICS = 0x6 - PACKET_TIMESTAMP = 0x11 - PACKET_TX_HAS_OFF = 0x13 - PACKET_TX_RING = 0xd - PACKET_TX_TIMESTAMP = 0x10 - PACKET_USER = 0x6 - PACKET_VERSION = 0xa - PACKET_VNET_HDR = 0xf - PARENB = 0x100 - PARITY_CRC16_PR0 = 0x2 - PARITY_CRC16_PR0_CCITT = 0x4 - PARITY_CRC16_PR1 = 0x3 - PARITY_CRC16_PR1_CCITT = 0x5 - PARITY_CRC32_PR0_CCITT = 0x6 - PARITY_CRC32_PR1_CCITT = 0x7 - PARITY_DEFAULT = 0x0 - PARITY_NONE = 0x1 - PARMRK = 0x8 - PARODD = 0x200 - PENDIN = 0x4000 - PERF_EVENT_IOC_DISABLE = 0x20002401 - PERF_EVENT_IOC_ENABLE = 0x20002400 - PERF_EVENT_IOC_ID = 0x40082407 - PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b - PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 - PERF_EVENT_IOC_PERIOD = 0x80082404 - PERF_EVENT_IOC_QUERY_BPF = 0xc008240a - PERF_EVENT_IOC_REFRESH = 0x20002402 - PERF_EVENT_IOC_RESET = 0x20002403 - PERF_EVENT_IOC_SET_BPF = 0x80042408 - PERF_EVENT_IOC_SET_FILTER = 0x80082406 - PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 - PIPEFS_MAGIC = 0x50495045 - PPPIOCATTACH = 0x8004743d - PPPIOCATTCHAN = 0x80047438 - PPPIOCCONNECT = 0x8004743a - PPPIOCDETACH = 0x8004743c - PPPIOCDISCONN = 0x20007439 - PPPIOCGASYNCMAP = 0x40047458 - PPPIOCGCHAN = 0x40047437 - PPPIOCGDEBUG = 0x40047441 - PPPIOCGFLAGS = 0x4004745a - PPPIOCGIDLE = 0x4010743f - PPPIOCGL2TPSTATS = 0x40487436 - PPPIOCGMRU = 0x40047453 - PPPIOCGNPMODE = 0xc008744c - PPPIOCGRASYNCMAP = 0x40047455 - PPPIOCGUNIT = 0x40047456 - PPPIOCGXASYNCMAP = 0x40207450 - PPPIOCNEWUNIT = 0xc004743e - PPPIOCSACTIVE = 0x80107446 - PPPIOCSASYNCMAP = 0x80047457 - PPPIOCSCOMPRESS = 0x8010744d - PPPIOCSDEBUG = 0x80047440 - PPPIOCSFLAGS = 0x80047459 - PPPIOCSMAXCID = 0x80047451 - PPPIOCSMRRU = 0x8004743b - PPPIOCSMRU = 0x80047452 - PPPIOCSNPMODE = 0x8008744b - PPPIOCSPASS = 0x80107447 - PPPIOCSRASYNCMAP = 0x80047454 - PPPIOCSXASYNCMAP = 0x8020744f - PPPIOCXFERUNIT = 0x2000744e - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROC_SUPER_MAGIC = 0x9fa0 - PROT_EXEC = 0x4 - PROT_GROWSDOWN = 0x1000000 - PROT_GROWSUP = 0x2000000 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PR_CAPBSET_DROP = 0x18 - PR_CAPBSET_READ = 0x17 - PR_CAP_AMBIENT = 0x2f - PR_CAP_AMBIENT_CLEAR_ALL = 0x4 - PR_CAP_AMBIENT_IS_SET = 0x1 - PR_CAP_AMBIENT_LOWER = 0x3 - PR_CAP_AMBIENT_RAISE = 0x2 - PR_ENDIAN_BIG = 0x0 - PR_ENDIAN_LITTLE = 0x1 - PR_ENDIAN_PPC_LITTLE = 0x2 - PR_FPEMU_NOPRINT = 0x1 - PR_FPEMU_SIGFPE = 0x2 - PR_FP_EXC_ASYNC = 0x2 - PR_FP_EXC_DISABLED = 0x0 - PR_FP_EXC_DIV = 0x10000 - PR_FP_EXC_INV = 0x100000 - PR_FP_EXC_NONRECOV = 0x1 - PR_FP_EXC_OVF = 0x20000 - PR_FP_EXC_PRECISE = 0x3 - PR_FP_EXC_RES = 0x80000 - PR_FP_EXC_SW_ENABLE = 0x80 - PR_FP_EXC_UND = 0x40000 - PR_FP_MODE_FR = 0x1 - PR_FP_MODE_FRE = 0x2 - PR_GET_CHILD_SUBREAPER = 0x25 - PR_GET_DUMPABLE = 0x3 - PR_GET_ENDIAN = 0x13 - PR_GET_FPEMU = 0x9 - PR_GET_FPEXC = 0xb - PR_GET_FP_MODE = 0x2e - PR_GET_KEEPCAPS = 0x7 - PR_GET_NAME = 0x10 - PR_GET_NO_NEW_PRIVS = 0x27 - PR_GET_PDEATHSIG = 0x2 - PR_GET_SECCOMP = 0x15 - PR_GET_SECUREBITS = 0x1b - PR_GET_SPECULATION_CTRL = 0x34 - PR_GET_THP_DISABLE = 0x2a - PR_GET_TID_ADDRESS = 0x28 - PR_GET_TIMERSLACK = 0x1e - PR_GET_TIMING = 0xd - PR_GET_TSC = 0x19 - PR_GET_UNALIGN = 0x5 - PR_MCE_KILL = 0x21 - PR_MCE_KILL_CLEAR = 0x0 - PR_MCE_KILL_DEFAULT = 0x2 - PR_MCE_KILL_EARLY = 0x1 - PR_MCE_KILL_GET = 0x22 - PR_MCE_KILL_LATE = 0x0 - PR_MCE_KILL_SET = 0x1 - PR_MPX_DISABLE_MANAGEMENT = 0x2c - PR_MPX_ENABLE_MANAGEMENT = 0x2b - PR_PAC_APDAKEY = 0x4 - PR_PAC_APDBKEY = 0x8 - PR_PAC_APGAKEY = 0x10 - PR_PAC_APIAKEY = 0x1 - PR_PAC_APIBKEY = 0x2 - PR_PAC_RESET_KEYS = 0x36 - PR_SET_CHILD_SUBREAPER = 0x24 - PR_SET_DUMPABLE = 0x4 - PR_SET_ENDIAN = 0x14 - PR_SET_FPEMU = 0xa - PR_SET_FPEXC = 0xc - PR_SET_FP_MODE = 0x2d - PR_SET_KEEPCAPS = 0x8 - PR_SET_MM = 0x23 - PR_SET_MM_ARG_END = 0x9 - PR_SET_MM_ARG_START = 0x8 - PR_SET_MM_AUXV = 0xc - PR_SET_MM_BRK = 0x7 - PR_SET_MM_END_CODE = 0x2 - PR_SET_MM_END_DATA = 0x4 - PR_SET_MM_ENV_END = 0xb - PR_SET_MM_ENV_START = 0xa - PR_SET_MM_EXE_FILE = 0xd - PR_SET_MM_MAP = 0xe - PR_SET_MM_MAP_SIZE = 0xf - PR_SET_MM_START_BRK = 0x6 - PR_SET_MM_START_CODE = 0x1 - PR_SET_MM_START_DATA = 0x3 - PR_SET_MM_START_STACK = 0x5 - PR_SET_NAME = 0xf - PR_SET_NO_NEW_PRIVS = 0x26 - PR_SET_PDEATHSIG = 0x1 - PR_SET_PTRACER = 0x59616d61 - PR_SET_PTRACER_ANY = 0xffffffffffffffff - PR_SET_SECCOMP = 0x16 - PR_SET_SECUREBITS = 0x1c - PR_SET_SPECULATION_CTRL = 0x35 - PR_SET_THP_DISABLE = 0x29 - PR_SET_TIMERSLACK = 0x1d - PR_SET_TIMING = 0xe - PR_SET_TSC = 0x1a - PR_SET_UNALIGN = 0x6 - PR_SPEC_DISABLE = 0x4 - PR_SPEC_DISABLE_NOEXEC = 0x10 - PR_SPEC_ENABLE = 0x2 - PR_SPEC_FORCE_DISABLE = 0x8 - PR_SPEC_INDIRECT_BRANCH = 0x1 - PR_SPEC_NOT_AFFECTED = 0x0 - PR_SPEC_PRCTL = 0x1 - PR_SPEC_STORE_BYPASS = 0x0 - PR_SVE_GET_VL = 0x33 - PR_SVE_SET_VL = 0x32 - PR_SVE_SET_VL_ONEXEC = 0x40000 - PR_SVE_VL_INHERIT = 0x20000 - PR_SVE_VL_LEN_MASK = 0xffff - PR_TASK_PERF_EVENTS_DISABLE = 0x1f - PR_TASK_PERF_EVENTS_ENABLE = 0x20 - PR_TIMING_STATISTICAL = 0x0 - PR_TIMING_TIMESTAMP = 0x1 - PR_TSC_ENABLE = 0x1 - PR_TSC_SIGSEGV = 0x2 - PR_UNALIGN_NOPRINT = 0x1 - PR_UNALIGN_SIGBUS = 0x2 - PSTOREFS_MAGIC = 0x6165676c - PTRACE_ATTACH = 0x10 - PTRACE_CONT = 0x7 - PTRACE_DETACH = 0x11 - PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 - PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 - PTRACE_EVENT_CLONE = 0x3 - PTRACE_EVENT_EXEC = 0x4 - PTRACE_EVENT_EXIT = 0x6 - PTRACE_EVENT_FORK = 0x1 - PTRACE_EVENT_SECCOMP = 0x7 - PTRACE_EVENT_STOP = 0x80 - PTRACE_EVENT_VFORK = 0x2 - PTRACE_EVENT_VFORK_DONE = 0x5 - PTRACE_GETEVENTMSG = 0x4201 - PTRACE_GETFPAREGS = 0x14 - PTRACE_GETFPREGS = 0xe - PTRACE_GETFPREGS64 = 0x19 - PTRACE_GETREGS = 0xc - PTRACE_GETREGS64 = 0x16 - PTRACE_GETREGSET = 0x4204 - PTRACE_GETSIGINFO = 0x4202 - PTRACE_GETSIGMASK = 0x420a - PTRACE_GET_SYSCALL_INFO = 0x420e - PTRACE_INTERRUPT = 0x4207 - PTRACE_KILL = 0x8 - PTRACE_LISTEN = 0x4208 - PTRACE_O_EXITKILL = 0x100000 - PTRACE_O_MASK = 0x3000ff - PTRACE_O_SUSPEND_SECCOMP = 0x200000 - PTRACE_O_TRACECLONE = 0x8 - PTRACE_O_TRACEEXEC = 0x10 - PTRACE_O_TRACEEXIT = 0x40 - PTRACE_O_TRACEFORK = 0x2 - PTRACE_O_TRACESECCOMP = 0x80 - PTRACE_O_TRACESYSGOOD = 0x1 - PTRACE_O_TRACEVFORK = 0x4 - PTRACE_O_TRACEVFORKDONE = 0x20 - PTRACE_PEEKDATA = 0x2 - PTRACE_PEEKSIGINFO = 0x4209 - PTRACE_PEEKSIGINFO_SHARED = 0x1 - PTRACE_PEEKTEXT = 0x1 - PTRACE_PEEKUSR = 0x3 - PTRACE_POKEDATA = 0x5 - PTRACE_POKETEXT = 0x4 - PTRACE_POKEUSR = 0x6 - PTRACE_READDATA = 0x10 - PTRACE_READTEXT = 0x12 - PTRACE_SECCOMP_GET_FILTER = 0x420c - PTRACE_SECCOMP_GET_METADATA = 0x420d - PTRACE_SEIZE = 0x4206 - PTRACE_SETFPAREGS = 0x15 - PTRACE_SETFPREGS = 0xf - PTRACE_SETFPREGS64 = 0x1a - PTRACE_SETOPTIONS = 0x4200 - PTRACE_SETREGS = 0xd - PTRACE_SETREGS64 = 0x17 - PTRACE_SETREGSET = 0x4205 - PTRACE_SETSIGINFO = 0x4203 - PTRACE_SETSIGMASK = 0x420b - PTRACE_SINGLESTEP = 0x9 - PTRACE_SPARC_DETACH = 0xb - PTRACE_SYSCALL = 0x18 - PTRACE_SYSCALL_INFO_ENTRY = 0x1 - PTRACE_SYSCALL_INFO_EXIT = 0x2 - PTRACE_SYSCALL_INFO_NONE = 0x0 - PTRACE_SYSCALL_INFO_SECCOMP = 0x3 - PTRACE_TRACEME = 0x0 - PTRACE_WRITEDATA = 0x11 - PTRACE_WRITETEXT = 0x13 - PT_FP = 0x48 - PT_G0 = 0x10 - PT_G1 = 0x14 - PT_G2 = 0x18 - PT_G3 = 0x1c - PT_G4 = 0x20 - PT_G5 = 0x24 - PT_G6 = 0x28 - PT_G7 = 0x2c - PT_I0 = 0x30 - PT_I1 = 0x34 - PT_I2 = 0x38 - PT_I3 = 0x3c - PT_I4 = 0x40 - PT_I5 = 0x44 - PT_I6 = 0x48 - PT_I7 = 0x4c - PT_NPC = 0x8 - PT_PC = 0x4 - PT_PSR = 0x0 - PT_REGS_MAGIC = 0x57ac6c00 - PT_TNPC = 0x90 - PT_TPC = 0x88 - PT_TSTATE = 0x80 - PT_V9_FP = 0x70 - PT_V9_G0 = 0x0 - PT_V9_G1 = 0x8 - PT_V9_G2 = 0x10 - PT_V9_G3 = 0x18 - PT_V9_G4 = 0x20 - PT_V9_G5 = 0x28 - PT_V9_G6 = 0x30 - PT_V9_G7 = 0x38 - PT_V9_I0 = 0x40 - PT_V9_I1 = 0x48 - PT_V9_I2 = 0x50 - PT_V9_I3 = 0x58 - PT_V9_I4 = 0x60 - PT_V9_I5 = 0x68 - PT_V9_I6 = 0x70 - PT_V9_I7 = 0x78 - PT_V9_MAGIC = 0x9c - PT_V9_TNPC = 0x90 - PT_V9_TPC = 0x88 - PT_V9_TSTATE = 0x80 - PT_V9_Y = 0x98 - PT_WIM = 0x10 - PT_Y = 0xc - QNX4_SUPER_MAGIC = 0x2f - QNX6_SUPER_MAGIC = 0x68191122 - RAMFS_MAGIC = 0x858458f6 - RDTGROUP_SUPER_MAGIC = 0x7655821 - REISERFS_SUPER_MAGIC = 0x52654973 - RENAME_EXCHANGE = 0x2 - RENAME_NOREPLACE = 0x1 - RENAME_WHITEOUT = 0x4 - RLIMIT_AS = 0x9 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_LOCKS = 0xa - RLIMIT_MEMLOCK = 0x8 - RLIMIT_MSGQUEUE = 0xc - RLIMIT_NICE = 0xd - RLIMIT_NOFILE = 0x6 - RLIMIT_NPROC = 0x7 - RLIMIT_RSS = 0x5 - RLIMIT_RTPRIO = 0xe - RLIMIT_RTTIME = 0xf - RLIMIT_SIGPENDING = 0xb - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0xffffffffffffffff - RNDADDENTROPY = 0x80085203 - RNDADDTOENTCNT = 0x80045201 - RNDCLEARPOOL = 0x20005206 - RNDGETENTCNT = 0x40045200 - RNDGETPOOL = 0x40085202 - RNDRESEEDCRNG = 0x20005207 - RNDZAPENTCNT = 0x20005204 - RTAX_ADVMSS = 0x8 - RTAX_CC_ALGO = 0x10 - RTAX_CWND = 0x7 - RTAX_FASTOPEN_NO_COOKIE = 0x11 - RTAX_FEATURES = 0xc - RTAX_FEATURE_ALLFRAG = 0x8 - RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf - RTAX_FEATURE_SACK = 0x2 - RTAX_FEATURE_TIMESTAMP = 0x4 - RTAX_HOPLIMIT = 0xa - RTAX_INITCWND = 0xb - RTAX_INITRWND = 0xe - RTAX_LOCK = 0x1 - RTAX_MAX = 0x11 - RTAX_MTU = 0x2 - RTAX_QUICKACK = 0xf - RTAX_REORDERING = 0x9 - RTAX_RTO_MIN = 0xd - RTAX_RTT = 0x4 - RTAX_RTTVAR = 0x5 - RTAX_SSTHRESH = 0x6 - RTAX_UNSPEC = 0x0 - RTAX_WINDOW = 0x3 - RTA_ALIGNTO = 0x4 - RTA_MAX = 0x1e - RTCF_DIRECTSRC = 0x4000000 - RTCF_DOREDIRECT = 0x1000000 - RTCF_LOG = 0x2000000 - RTCF_MASQ = 0x400000 - RTCF_NAT = 0x800000 - RTCF_VALVE = 0x200000 - RTC_AF = 0x20 - RTC_AIE_OFF = 0x20007002 - RTC_AIE_ON = 0x20007001 - RTC_ALM_READ = 0x40247008 - RTC_ALM_SET = 0x80247007 - RTC_EPOCH_READ = 0x4008700d - RTC_EPOCH_SET = 0x8008700e - RTC_IRQF = 0x80 - RTC_IRQP_READ = 0x4008700b - RTC_IRQP_SET = 0x8008700c - RTC_MAX_FREQ = 0x2000 - RTC_PF = 0x40 - RTC_PIE_OFF = 0x20007006 - RTC_PIE_ON = 0x20007005 - RTC_PLL_GET = 0x40207011 - RTC_PLL_SET = 0x80207012 - RTC_RD_TIME = 0x40247009 - RTC_SET_TIME = 0x8024700a - RTC_UF = 0x10 - RTC_UIE_OFF = 0x20007004 - RTC_UIE_ON = 0x20007003 - RTC_VL_CLR = 0x20007014 - RTC_VL_READ = 0x40047013 - RTC_WIE_OFF = 0x20007010 - RTC_WIE_ON = 0x2000700f - RTC_WKALM_RD = 0x40287010 - RTC_WKALM_SET = 0x8028700f - RTF_ADDRCLASSMASK = 0xf8000000 - RTF_ADDRCONF = 0x40000 - RTF_ALLONLINK = 0x20000 - RTF_BROADCAST = 0x10000000 - RTF_CACHE = 0x1000000 - RTF_DEFAULT = 0x10000 - RTF_DYNAMIC = 0x10 - RTF_FLOW = 0x2000000 - RTF_GATEWAY = 0x2 - RTF_HOST = 0x4 - RTF_INTERFACE = 0x40000000 - RTF_IRTT = 0x100 - RTF_LINKRT = 0x100000 - RTF_LOCAL = 0x80000000 - RTF_MODIFIED = 0x20 - RTF_MSS = 0x40 - RTF_MTU = 0x40 - RTF_MULTICAST = 0x20000000 - RTF_NAT = 0x8000000 - RTF_NOFORWARD = 0x1000 - RTF_NONEXTHOP = 0x200000 - RTF_NOPMTUDISC = 0x4000 - RTF_POLICY = 0x4000000 - RTF_REINSTATE = 0x8 - RTF_REJECT = 0x200 - RTF_STATIC = 0x400 - RTF_THROW = 0x2000 - RTF_UP = 0x1 - RTF_WINDOW = 0x80 - RTF_XRESOLVE = 0x800 - RTM_BASE = 0x10 - RTM_DELACTION = 0x31 - RTM_DELADDR = 0x15 - RTM_DELADDRLABEL = 0x49 - RTM_DELCHAIN = 0x65 - RTM_DELLINK = 0x11 - RTM_DELMDB = 0x55 - RTM_DELNEIGH = 0x1d - RTM_DELNETCONF = 0x51 - RTM_DELNEXTHOP = 0x69 - RTM_DELNSID = 0x59 - RTM_DELQDISC = 0x25 - RTM_DELROUTE = 0x19 - RTM_DELRULE = 0x21 - RTM_DELTCLASS = 0x29 - RTM_DELTFILTER = 0x2d - RTM_F_CLONED = 0x200 - RTM_F_EQUALIZE = 0x400 - RTM_F_FIB_MATCH = 0x2000 - RTM_F_LOOKUP_TABLE = 0x1000 - RTM_F_NOTIFY = 0x100 - RTM_F_PREFIX = 0x800 - RTM_GETACTION = 0x32 - RTM_GETADDR = 0x16 - RTM_GETADDRLABEL = 0x4a - RTM_GETANYCAST = 0x3e - RTM_GETCHAIN = 0x66 - RTM_GETDCB = 0x4e - RTM_GETLINK = 0x12 - RTM_GETMDB = 0x56 - RTM_GETMULTICAST = 0x3a - RTM_GETNEIGH = 0x1e - RTM_GETNEIGHTBL = 0x42 - RTM_GETNETCONF = 0x52 - RTM_GETNEXTHOP = 0x6a - RTM_GETNSID = 0x5a - RTM_GETQDISC = 0x26 - RTM_GETROUTE = 0x1a - RTM_GETRULE = 0x22 - RTM_GETSTATS = 0x5e - RTM_GETTCLASS = 0x2a - RTM_GETTFILTER = 0x2e - RTM_MAX = 0x6b - RTM_NEWACTION = 0x30 - RTM_NEWADDR = 0x14 - RTM_NEWADDRLABEL = 0x48 - RTM_NEWCACHEREPORT = 0x60 - RTM_NEWCHAIN = 0x64 - RTM_NEWLINK = 0x10 - RTM_NEWMDB = 0x54 - RTM_NEWNDUSEROPT = 0x44 - RTM_NEWNEIGH = 0x1c - RTM_NEWNEIGHTBL = 0x40 - RTM_NEWNETCONF = 0x50 - RTM_NEWNEXTHOP = 0x68 - RTM_NEWNSID = 0x58 - RTM_NEWPREFIX = 0x34 - RTM_NEWQDISC = 0x24 - RTM_NEWROUTE = 0x18 - RTM_NEWRULE = 0x20 - RTM_NEWSTATS = 0x5c - RTM_NEWTCLASS = 0x28 - RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x17 - RTM_NR_MSGTYPES = 0x5c - RTM_SETDCB = 0x4f - RTM_SETLINK = 0x13 - RTM_SETNEIGHTBL = 0x43 - RTNH_ALIGNTO = 0x4 - RTNH_COMPARE_MASK = 0x19 - RTNH_F_DEAD = 0x1 - RTNH_F_LINKDOWN = 0x10 - RTNH_F_OFFLOAD = 0x8 - RTNH_F_ONLINK = 0x4 - RTNH_F_PERVASIVE = 0x2 - RTNH_F_UNRESOLVED = 0x20 - RTN_MAX = 0xb - RTPROT_BABEL = 0x2a - RTPROT_BGP = 0xba - RTPROT_BIRD = 0xc - RTPROT_BOOT = 0x3 - RTPROT_DHCP = 0x10 - RTPROT_DNROUTED = 0xd - RTPROT_EIGRP = 0xc0 - RTPROT_GATED = 0x8 - RTPROT_ISIS = 0xbb - RTPROT_KERNEL = 0x2 - RTPROT_MROUTED = 0x11 - RTPROT_MRT = 0xa - RTPROT_NTK = 0xf - RTPROT_OSPF = 0xbc - RTPROT_RA = 0x9 - RTPROT_REDIRECT = 0x1 - RTPROT_RIP = 0xbd - RTPROT_STATIC = 0x4 - RTPROT_UNSPEC = 0x0 - RTPROT_XORP = 0xe - RTPROT_ZEBRA = 0xb - RT_CLASS_DEFAULT = 0xfd - RT_CLASS_LOCAL = 0xff - RT_CLASS_MAIN = 0xfe - RT_CLASS_MAX = 0xff - RT_CLASS_UNSPEC = 0x0 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - RUSAGE_THREAD = 0x1 - SCM_CREDENTIALS = 0x2 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x1d - SCM_TIMESTAMPING = 0x23 - SCM_TIMESTAMPING_OPT_STATS = 0x38 - SCM_TIMESTAMPING_PKTINFO = 0x3c - SCM_TIMESTAMPNS = 0x21 - SCM_TXTIME = 0x3f - SCM_WIFI_STATUS = 0x25 - SC_LOG_FLUSH = 0x100000 - SECCOMP_MODE_DISABLED = 0x0 - SECCOMP_MODE_FILTER = 0x2 - SECCOMP_MODE_STRICT = 0x1 - SECURITYFS_MAGIC = 0x73636673 - SELINUX_MAGIC = 0xf97cff8c - SFD_CLOEXEC = 0x400000 - SFD_NONBLOCK = 0x4000 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDDLCI = 0x8980 - SIOCADDMULTI = 0x8931 - SIOCADDRT = 0x890b - SIOCATMARK = 0x8905 - SIOCBONDCHANGEACTIVE = 0x8995 - SIOCBONDENSLAVE = 0x8990 - SIOCBONDINFOQUERY = 0x8994 - SIOCBONDRELEASE = 0x8991 - SIOCBONDSETHWADDR = 0x8992 - SIOCBONDSLAVEINFOQUERY = 0x8993 - SIOCBRADDBR = 0x89a0 - SIOCBRADDIF = 0x89a2 - SIOCBRDELBR = 0x89a1 - SIOCBRDELIF = 0x89a3 - SIOCDARP = 0x8953 - SIOCDELDLCI = 0x8981 - SIOCDELMULTI = 0x8932 - SIOCDELRT = 0x890c - SIOCDEVPRIVATE = 0x89f0 - SIOCDIFADDR = 0x8936 - SIOCDRARP = 0x8960 - SIOCETHTOOL = 0x8946 - SIOCGARP = 0x8954 - SIOCGETLINKNAME = 0x89e0 - SIOCGETNODEID = 0x89e1 - SIOCGHWTSTAMP = 0x89b1 - SIOCGIFADDR = 0x8915 - SIOCGIFBR = 0x8940 - SIOCGIFBRDADDR = 0x8919 - SIOCGIFCONF = 0x8912 - SIOCGIFCOUNT = 0x8938 - SIOCGIFDSTADDR = 0x8917 - SIOCGIFENCAP = 0x8925 - SIOCGIFFLAGS = 0x8913 - SIOCGIFHWADDR = 0x8927 - SIOCGIFINDEX = 0x8933 - SIOCGIFMAP = 0x8970 - SIOCGIFMEM = 0x891f - SIOCGIFMETRIC = 0x891d - SIOCGIFMTU = 0x8921 - SIOCGIFNAME = 0x8910 - SIOCGIFNETMASK = 0x891b - SIOCGIFPFLAGS = 0x8935 - SIOCGIFSLAVE = 0x8929 - SIOCGIFTXQLEN = 0x8942 - SIOCGIFVLAN = 0x8982 - SIOCGMIIPHY = 0x8947 - SIOCGMIIREG = 0x8948 - SIOCGPGRP = 0x8904 - SIOCGPPPCSTATS = 0x89f2 - SIOCGPPPSTATS = 0x89f0 - SIOCGPPPVER = 0x89f1 - SIOCGRARP = 0x8961 - SIOCGSKNS = 0x894c - SIOCGSTAMP = 0x8906 - SIOCGSTAMPNS = 0x8907 - SIOCGSTAMPNS_NEW = 0x40108907 - SIOCGSTAMPNS_OLD = 0x8907 - SIOCGSTAMP_NEW = 0x40108906 - SIOCGSTAMP_OLD = 0x8906 - SIOCINQ = 0x4004667f - SIOCOUTQ = 0x40047473 - SIOCOUTQNSD = 0x894b - SIOCPROTOPRIVATE = 0x89e0 - SIOCRTMSG = 0x890d - SIOCSARP = 0x8955 - SIOCSHWTSTAMP = 0x89b0 - SIOCSIFADDR = 0x8916 - SIOCSIFBR = 0x8941 - SIOCSIFBRDADDR = 0x891a - SIOCSIFDSTADDR = 0x8918 - SIOCSIFENCAP = 0x8926 - SIOCSIFFLAGS = 0x8914 - SIOCSIFHWADDR = 0x8924 - SIOCSIFHWBROADCAST = 0x8937 - SIOCSIFLINK = 0x8911 - SIOCSIFMAP = 0x8971 - SIOCSIFMEM = 0x8920 - SIOCSIFMETRIC = 0x891e - SIOCSIFMTU = 0x8922 - SIOCSIFNAME = 0x8923 - SIOCSIFNETMASK = 0x891c - SIOCSIFPFLAGS = 0x8934 - SIOCSIFSLAVE = 0x8930 - SIOCSIFTXQLEN = 0x8943 - SIOCSIFVLAN = 0x8983 - SIOCSMIIREG = 0x8949 - SIOCSPGRP = 0x8902 - SIOCSRARP = 0x8962 - SIOCWANDEV = 0x894a - SMACK_MAGIC = 0x43415d53 - SMART_AUTOSAVE = 0xd2 - SMART_AUTO_OFFLINE = 0xdb - SMART_DISABLE = 0xd9 - SMART_ENABLE = 0xd8 - SMART_HCYL_PASS = 0xc2 - SMART_IMMEDIATE_OFFLINE = 0xd4 - SMART_LCYL_PASS = 0x4f - SMART_READ_LOG_SECTOR = 0xd5 - SMART_READ_THRESHOLDS = 0xd1 - SMART_READ_VALUES = 0xd0 - SMART_SAVE = 0xd3 - SMART_STATUS = 0xda - SMART_WRITE_LOG_SECTOR = 0xd6 - SMART_WRITE_THRESHOLDS = 0xd7 - SMB_SUPER_MAGIC = 0x517b - SOCKFS_MAGIC = 0x534f434b - SOCK_CLOEXEC = 0x400000 - SOCK_DCCP = 0x6 - SOCK_DGRAM = 0x2 - SOCK_IOC_TYPE = 0x89 - SOCK_NONBLOCK = 0x4000 - SOCK_PACKET = 0xa - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_AAL = 0x109 - SOL_ALG = 0x117 - SOL_ATM = 0x108 - SOL_CAIF = 0x116 - SOL_CAN_BASE = 0x64 - SOL_DCCP = 0x10d - SOL_DECNET = 0x105 - SOL_ICMPV6 = 0x3a - SOL_IP = 0x0 - SOL_IPV6 = 0x29 - SOL_IRDA = 0x10a - SOL_IUCV = 0x115 - SOL_KCM = 0x119 - SOL_LLC = 0x10c - SOL_NETBEUI = 0x10b - SOL_NETLINK = 0x10e - SOL_NFC = 0x118 - SOL_PACKET = 0x107 - SOL_PNPIPE = 0x113 - SOL_PPPOL2TP = 0x111 - SOL_RAW = 0xff - SOL_RDS = 0x114 - SOL_RXRPC = 0x110 - SOL_SOCKET = 0xffff - SOL_TCP = 0x6 - SOL_TIPC = 0x10f - SOL_TLS = 0x11a - SOL_X25 = 0x106 - SOL_XDP = 0x11b - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x8000 - SO_ATTACH_BPF = 0x34 - SO_ATTACH_FILTER = 0x1a - SO_ATTACH_REUSEPORT_CBPF = 0x35 - SO_ATTACH_REUSEPORT_EBPF = 0x36 - SO_BINDTODEVICE = 0xd - SO_BINDTOIFINDEX = 0x41 - SO_BPF_EXTENSIONS = 0x32 - SO_BROADCAST = 0x20 - SO_BSDCOMPAT = 0x400 - SO_BUSY_POLL = 0x30 - SO_CNX_ADVICE = 0x37 - SO_COOKIE = 0x3b - SO_DEBUG = 0x1 - SO_DETACH_BPF = 0x1b - SO_DETACH_FILTER = 0x1b - SO_DETACH_REUSEPORT_BPF = 0x47 - SO_DOMAIN = 0x1029 - SO_DONTROUTE = 0x10 - SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 - SO_EE_CODE_TXTIME_MISSED = 0x2 - SO_EE_CODE_ZEROCOPY_COPIED = 0x1 - SO_EE_ORIGIN_ICMP = 0x2 - SO_EE_ORIGIN_ICMP6 = 0x3 - SO_EE_ORIGIN_LOCAL = 0x1 - SO_EE_ORIGIN_NONE = 0x0 - SO_EE_ORIGIN_TIMESTAMPING = 0x4 - SO_EE_ORIGIN_TXSTATUS = 0x4 - SO_EE_ORIGIN_TXTIME = 0x6 - SO_EE_ORIGIN_ZEROCOPY = 0x5 - SO_ERROR = 0x1007 - SO_GET_FILTER = 0x1a - SO_INCOMING_CPU = 0x33 - SO_INCOMING_NAPI_ID = 0x3a - SO_KEEPALIVE = 0x8 - SO_LINGER = 0x80 - SO_LOCK_FILTER = 0x28 - SO_MARK = 0x22 - SO_MAX_PACING_RATE = 0x31 - SO_MEMINFO = 0x39 - SO_NOFCS = 0x27 - SO_NO_CHECK = 0xb - SO_OOBINLINE = 0x100 - SO_PASSCRED = 0x2 - SO_PASSSEC = 0x1f - SO_PEEK_OFF = 0x26 - SO_PEERCRED = 0x40 - SO_PEERGROUPS = 0x3d - SO_PEERNAME = 0x1c - SO_PEERSEC = 0x1e - SO_PRIORITY = 0xc - SO_PROTOCOL = 0x1028 - SO_RCVBUF = 0x1002 - SO_RCVBUFFORCE = 0x100b - SO_RCVLOWAT = 0x800 - SO_RCVTIMEO = 0x2000 - SO_RCVTIMEO_NEW = 0x44 - SO_RCVTIMEO_OLD = 0x2000 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_RXQ_OVFL = 0x24 - SO_SECURITY_AUTHENTICATION = 0x5001 - SO_SECURITY_ENCRYPTION_NETWORK = 0x5004 - SO_SECURITY_ENCRYPTION_TRANSPORT = 0x5002 - SO_SELECT_ERR_QUEUE = 0x29 - SO_SNDBUF = 0x1001 - SO_SNDBUFFORCE = 0x100a - SO_SNDLOWAT = 0x1000 - SO_SNDTIMEO = 0x4000 - SO_SNDTIMEO_NEW = 0x45 - SO_SNDTIMEO_OLD = 0x4000 - SO_TIMESTAMP = 0x1d - SO_TIMESTAMPING = 0x23 - SO_TIMESTAMPING_NEW = 0x43 - SO_TIMESTAMPING_OLD = 0x23 - SO_TIMESTAMPNS = 0x21 - SO_TIMESTAMPNS_NEW = 0x42 - SO_TIMESTAMPNS_OLD = 0x21 - SO_TIMESTAMP_NEW = 0x46 - SO_TIMESTAMP_OLD = 0x1d - SO_TXTIME = 0x3f - SO_TYPE = 0x1008 - SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 - SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 - SO_VM_SOCKETS_BUFFER_SIZE = 0x0 - SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 - SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 - SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 - SO_VM_SOCKETS_TRUSTED = 0x5 - SO_WIFI_STATUS = 0x25 - SO_ZEROCOPY = 0x3e - SPLICE_F_GIFT = 0x8 - SPLICE_F_MORE = 0x4 - SPLICE_F_MOVE = 0x1 - SPLICE_F_NONBLOCK = 0x2 - SQUASHFS_MAGIC = 0x73717368 - STACK_END_MAGIC = 0x57ac6e9d - STATX_ALL = 0xfff - STATX_ATIME = 0x20 - STATX_ATTR_APPEND = 0x20 - STATX_ATTR_AUTOMOUNT = 0x1000 - STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_ENCRYPTED = 0x800 - STATX_ATTR_IMMUTABLE = 0x10 - STATX_ATTR_NODUMP = 0x40 - STATX_BASIC_STATS = 0x7ff - STATX_BLOCKS = 0x400 - STATX_BTIME = 0x800 - STATX_CTIME = 0x80 - STATX_GID = 0x10 - STATX_INO = 0x100 - STATX_MODE = 0x2 - STATX_MTIME = 0x40 - STATX_NLINK = 0x4 - STATX_SIZE = 0x200 - STATX_TYPE = 0x1 - STATX_UID = 0x8 - STATX__RESERVED = 0x80000000 - SYNC_FILE_RANGE_WAIT_AFTER = 0x4 - SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 - SYNC_FILE_RANGE_WRITE = 0x2 - SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 - SYSFS_MAGIC = 0x62656572 - S_BLKSIZE = 0x200 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x800 - TAB2 = 0x1000 - TAB3 = 0x1800 - TABDLY = 0x1800 - TASKSTATS_CMD_ATTR_MAX = 0x4 - TASKSTATS_CMD_MAX = 0x2 - TASKSTATS_GENL_NAME = "TASKSTATS" - TASKSTATS_GENL_VERSION = 0x1 - TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0x9 - TCFLSH = 0x20005407 - TCGETA = 0x40125401 - TCGETS = 0x40245408 - TCGETS2 = 0x402c540c - TCIFLUSH = 0x0 - TCIOFF = 0x2 - TCIOFLUSH = 0x2 - TCION = 0x3 - TCOFLUSH = 0x1 - TCOOFF = 0x0 - TCOON = 0x1 - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - TCP_CC_INFO = 0x1a - TCP_CM_INQ = 0x24 - TCP_CONGESTION = 0xd - TCP_COOKIE_IN_ALWAYS = 0x1 - TCP_COOKIE_MAX = 0x10 - TCP_COOKIE_MIN = 0x8 - TCP_COOKIE_OUT_NEVER = 0x2 - TCP_COOKIE_PAIR_SIZE = 0x20 - TCP_COOKIE_TRANSACTIONS = 0xf - TCP_CORK = 0x3 - TCP_DEFER_ACCEPT = 0x9 - TCP_FASTOPEN = 0x17 - TCP_FASTOPEN_CONNECT = 0x1e - TCP_FASTOPEN_KEY = 0x21 - TCP_FASTOPEN_NO_COOKIE = 0x22 - TCP_INFO = 0xb - TCP_INQ = 0x24 - TCP_KEEPCNT = 0x6 - TCP_KEEPIDLE = 0x4 - TCP_KEEPINTVL = 0x5 - TCP_LINGER2 = 0x8 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_WINSHIFT = 0xe - TCP_MD5SIG = 0xe - TCP_MD5SIG_EXT = 0x20 - TCP_MD5SIG_FLAG_PREFIX = 0x1 - TCP_MD5SIG_MAXKEYLEN = 0x50 - TCP_MSS = 0x200 - TCP_MSS_DEFAULT = 0x218 - TCP_MSS_DESIRED = 0x4c4 - TCP_NODELAY = 0x1 - TCP_NOTSENT_LOWAT = 0x19 - TCP_QUEUE_SEQ = 0x15 - TCP_QUICKACK = 0xc - TCP_REPAIR = 0x13 - TCP_REPAIR_OFF = 0x0 - TCP_REPAIR_OFF_NO_WP = -0x1 - TCP_REPAIR_ON = 0x1 - TCP_REPAIR_OPTIONS = 0x16 - TCP_REPAIR_QUEUE = 0x14 - TCP_REPAIR_WINDOW = 0x1d - TCP_SAVED_SYN = 0x1c - TCP_SAVE_SYN = 0x1b - TCP_SYNCNT = 0x7 - TCP_S_DATA_IN = 0x4 - TCP_S_DATA_OUT = 0x8 - TCP_THIN_DUPACK = 0x11 - TCP_THIN_LINEAR_TIMEOUTS = 0x10 - TCP_TIMESTAMP = 0x18 - TCP_ULP = 0x1f - TCP_USER_TIMEOUT = 0x12 - TCP_WINDOW_CLAMP = 0xa - TCP_ZEROCOPY_RECEIVE = 0x23 - TCSAFLUSH = 0x2 - TCSBRK = 0x20005405 - TCSBRKP = 0x5425 - TCSETA = 0x80125402 - TCSETAF = 0x80125404 - TCSETAW = 0x80125403 - TCSETS = 0x80245409 - TCSETS2 = 0x802c540d - TCSETSF = 0x8024540b - TCSETSF2 = 0x802c540f - TCSETSW = 0x8024540a - TCSETSW2 = 0x802c540e - TCXONC = 0x20005406 - TIMER_ABSTIME = 0x1 - TIOCCBRK = 0x2000747a - TIOCCONS = 0x20007424 - TIOCEXCL = 0x2000740d - TIOCGDEV = 0x40045432 - TIOCGETD = 0x40047400 - TIOCGEXCL = 0x40045440 - TIOCGICOUNT = 0x545d - TIOCGISO7816 = 0x40285443 - TIOCGLCKTRMIOS = 0x5456 - TIOCGPGRP = 0x40047483 - TIOCGPKT = 0x40045438 - TIOCGPTLCK = 0x40045439 - TIOCGPTN = 0x40047486 - TIOCGPTPEER = 0x20007489 - TIOCGRS485 = 0x40205441 - TIOCGSERIAL = 0x541e - TIOCGSID = 0x40047485 - TIOCGSOFTCAR = 0x40047464 - TIOCGWINSZ = 0x40087468 - TIOCINQ = 0x4004667f - TIOCLINUX = 0x541c - TIOCMBIC = 0x8004746b - TIOCMBIS = 0x8004746c - TIOCMGET = 0x4004746a - TIOCMIWAIT = 0x545c - TIOCMSET = 0x8004746d - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x20007471 - TIOCNXCL = 0x2000740e - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x80047470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCSBRK = 0x2000747b - TIOCSCTTY = 0x20007484 - TIOCSERCONFIG = 0x5453 - TIOCSERGETLSR = 0x5459 - TIOCSERGETMULTI = 0x545a - TIOCSERGSTRUCT = 0x5458 - TIOCSERGWILD = 0x5454 - TIOCSERSETMULTI = 0x545b - TIOCSERSWILD = 0x5455 - TIOCSETD = 0x80047401 - TIOCSIG = 0x80047488 - TIOCSISO7816 = 0xc0285444 - TIOCSLCKTRMIOS = 0x5457 - TIOCSPGRP = 0x80047482 - TIOCSPTLCK = 0x80047487 - TIOCSRS485 = 0xc0205442 - TIOCSSERIAL = 0x541f - TIOCSSOFTCAR = 0x80047465 - TIOCSTART = 0x2000746e - TIOCSTI = 0x80017472 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCVHANGUP = 0x20005437 - TIPC_ADDR_ID = 0x3 - TIPC_ADDR_MCAST = 0x1 - TIPC_ADDR_NAME = 0x2 - TIPC_ADDR_NAMESEQ = 0x1 - TIPC_CFG_SRV = 0x0 - TIPC_CLUSTER_BITS = 0xc - TIPC_CLUSTER_MASK = 0xfff000 - TIPC_CLUSTER_OFFSET = 0xc - TIPC_CLUSTER_SIZE = 0xfff - TIPC_CONN_SHUTDOWN = 0x5 - TIPC_CONN_TIMEOUT = 0x82 - TIPC_CRITICAL_IMPORTANCE = 0x3 - TIPC_DESTNAME = 0x3 - TIPC_DEST_DROPPABLE = 0x81 - TIPC_ERRINFO = 0x1 - TIPC_ERR_NO_NAME = 0x1 - TIPC_ERR_NO_NODE = 0x3 - TIPC_ERR_NO_PORT = 0x2 - TIPC_ERR_OVERLOAD = 0x4 - TIPC_GROUP_JOIN = 0x87 - TIPC_GROUP_LEAVE = 0x88 - TIPC_GROUP_LOOPBACK = 0x1 - TIPC_GROUP_MEMBER_EVTS = 0x2 - TIPC_HIGH_IMPORTANCE = 0x2 - TIPC_IMPORTANCE = 0x7f - TIPC_LINK_STATE = 0x2 - TIPC_LOW_IMPORTANCE = 0x0 - TIPC_MAX_BEARER_NAME = 0x20 - TIPC_MAX_IF_NAME = 0x10 - TIPC_MAX_LINK_NAME = 0x44 - TIPC_MAX_MEDIA_NAME = 0x10 - TIPC_MAX_USER_MSG_SIZE = 0x101d0 - TIPC_MCAST_BROADCAST = 0x85 - TIPC_MCAST_REPLICAST = 0x86 - TIPC_MEDIUM_IMPORTANCE = 0x1 - TIPC_NODEID_LEN = 0x10 - TIPC_NODE_BITS = 0xc - TIPC_NODE_MASK = 0xfff - TIPC_NODE_OFFSET = 0x0 - TIPC_NODE_RECVQ_DEPTH = 0x83 - TIPC_NODE_SIZE = 0xfff - TIPC_NODE_STATE = 0x0 - TIPC_OK = 0x0 - TIPC_PUBLISHED = 0x1 - TIPC_RESERVED_TYPES = 0x40 - TIPC_RETDATA = 0x2 - TIPC_SERVICE_ADDR = 0x2 - TIPC_SERVICE_RANGE = 0x1 - TIPC_SOCKET_ADDR = 0x3 - TIPC_SOCK_RECVQ_DEPTH = 0x84 - TIPC_SOCK_RECVQ_USED = 0x89 - TIPC_SRC_DROPPABLE = 0x80 - TIPC_SUBSCR_TIMEOUT = 0x3 - TIPC_SUB_CANCEL = 0x4 - TIPC_SUB_PORTS = 0x1 - TIPC_SUB_SERVICE = 0x2 - TIPC_TOP_SRV = 0x1 - TIPC_WAIT_FOREVER = 0xffffffff - TIPC_WITHDRAWN = 0x2 - TIPC_ZONE_BITS = 0x8 - TIPC_ZONE_CLUSTER_MASK = 0xfffff000 - TIPC_ZONE_MASK = 0xff000000 - TIPC_ZONE_OFFSET = 0x18 - TIPC_ZONE_SCOPE = 0x1 - TIPC_ZONE_SIZE = 0xff - TMPFS_MAGIC = 0x1021994 - TOSTOP = 0x100 - TPACKET_ALIGNMENT = 0x10 - TPACKET_HDRLEN = 0x34 - TP_STATUS_AVAILABLE = 0x0 - TP_STATUS_BLK_TMO = 0x20 - TP_STATUS_COPY = 0x2 - TP_STATUS_CSUMNOTREADY = 0x8 - TP_STATUS_CSUM_VALID = 0x80 - TP_STATUS_KERNEL = 0x0 - TP_STATUS_LOSING = 0x4 - TP_STATUS_SENDING = 0x2 - TP_STATUS_SEND_REQUEST = 0x1 - TP_STATUS_TS_RAW_HARDWARE = 0x80000000 - TP_STATUS_TS_SOFTWARE = 0x20000000 - TP_STATUS_TS_SYS_HARDWARE = 0x40000000 - TP_STATUS_USER = 0x1 - TP_STATUS_VLAN_TPID_VALID = 0x40 - TP_STATUS_VLAN_VALID = 0x10 - TP_STATUS_WRONG_FORMAT = 0x4 - TRACEFS_MAGIC = 0x74726163 - TS_COMM_LEN = 0x20 - TUNATTACHFILTER = 0x801054d5 - TUNDETACHFILTER = 0x801054d6 - TUNGETDEVNETNS = 0x200054e3 - TUNGETFEATURES = 0x400454cf - TUNGETFILTER = 0x401054db - TUNGETIFF = 0x400454d2 - TUNGETSNDBUF = 0x400454d3 - TUNGETVNETBE = 0x400454df - TUNGETVNETHDRSZ = 0x400454d7 - TUNGETVNETLE = 0x400454dd - TUNSETCARRIER = 0x800454e2 - TUNSETDEBUG = 0x800454c9 - TUNSETFILTEREBPF = 0x400454e1 - TUNSETGROUP = 0x800454ce - TUNSETIFF = 0x800454ca - TUNSETIFINDEX = 0x800454da - TUNSETLINK = 0x800454cd - TUNSETNOCSUM = 0x800454c8 - TUNSETOFFLOAD = 0x800454d0 - TUNSETOWNER = 0x800454cc - TUNSETPERSIST = 0x800454cb - TUNSETQUEUE = 0x800454d9 - TUNSETSNDBUF = 0x800454d4 - TUNSETSTEERINGEBPF = 0x400454e0 - TUNSETTXFILTER = 0x800454d1 - TUNSETVNETBE = 0x800454de - TUNSETVNETHDRSZ = 0x800454d8 - TUNSETVNETLE = 0x800454dc - UBI_IOCATT = 0x80186f40 - UBI_IOCDET = 0x80046f41 - UBI_IOCEBCH = 0x80044f02 - UBI_IOCEBER = 0x80044f01 - UBI_IOCEBISMAP = 0x40044f05 - UBI_IOCEBMAP = 0x80084f03 - UBI_IOCEBUNMAP = 0x80044f04 - UBI_IOCMKVOL = 0x80986f00 - UBI_IOCRMVOL = 0x80046f01 - UBI_IOCRNVOL = 0x91106f03 - UBI_IOCRPEB = 0x80046f04 - UBI_IOCRSVOL = 0x800c6f02 - UBI_IOCSETVOLPROP = 0x80104f06 - UBI_IOCSPEB = 0x80046f05 - UBI_IOCVOLCRBLK = 0x80804f07 - UBI_IOCVOLRMBLK = 0x20004f08 - UBI_IOCVOLUP = 0x80084f00 - UDF_SUPER_MAGIC = 0x15013346 - UMOUNT_NOFOLLOW = 0x8 - USBDEVICE_SUPER_MAGIC = 0x9fa2 - UTIME_NOW = 0x3fffffff - UTIME_OMIT = 0x3ffffffe - V9FS_MAGIC = 0x1021997 - VDISCARD = 0xd - VEOF = 0x4 - VEOL = 0xb - VEOL2 = 0x10 - VERASE = 0x2 - VINTR = 0x0 - VKILL = 0x3 - VLNEXT = 0xf - VMADDR_CID_ANY = 0xffffffff - VMADDR_CID_HOST = 0x2 - VMADDR_CID_HYPERVISOR = 0x0 - VMADDR_CID_RESERVED = 0x1 - VMADDR_PORT_ANY = 0xffffffff - VMIN = 0x6 - VM_SOCKETS_INVALID_VERSION = 0xffffffff - VQUIT = 0x1 - VREPRINT = 0xc - VSTART = 0x8 - VSTOP = 0x9 - VSUSP = 0xa - VSWTC = 0x7 - VT0 = 0x0 - VT1 = 0x4000 - VTDLY = 0x4000 - VTIME = 0x5 - VWERASE = 0xe - WALL = 0x40000000 - WCLONE = 0x80000000 - WCONTINUED = 0x8 - WDIOC_GETBOOTSTATUS = 0x40045702 - WDIOC_GETPRETIMEOUT = 0x40045709 - WDIOC_GETSTATUS = 0x40045701 - WDIOC_GETSUPPORT = 0x40285700 - WDIOC_GETTEMP = 0x40045703 - WDIOC_GETTIMELEFT = 0x4004570a - WDIOC_GETTIMEOUT = 0x40045707 - WDIOC_KEEPALIVE = 0x40045705 - WDIOC_SETOPTIONS = 0x40045704 - WDIOC_SETPRETIMEOUT = 0xc0045708 - WDIOC_SETTIMEOUT = 0xc0045706 - WEXITED = 0x4 - WIN_ACKMEDIACHANGE = 0xdb - WIN_CHECKPOWERMODE1 = 0xe5 - WIN_CHECKPOWERMODE2 = 0x98 - WIN_DEVICE_RESET = 0x8 - WIN_DIAGNOSE = 0x90 - WIN_DOORLOCK = 0xde - WIN_DOORUNLOCK = 0xdf - WIN_DOWNLOAD_MICROCODE = 0x92 - WIN_FLUSH_CACHE = 0xe7 - WIN_FLUSH_CACHE_EXT = 0xea - WIN_FORMAT = 0x50 - WIN_GETMEDIASTATUS = 0xda - WIN_IDENTIFY = 0xec - WIN_IDENTIFY_DMA = 0xee - WIN_IDLEIMMEDIATE = 0xe1 - WIN_INIT = 0x60 - WIN_MEDIAEJECT = 0xed - WIN_MULTREAD = 0xc4 - WIN_MULTREAD_EXT = 0x29 - WIN_MULTWRITE = 0xc5 - WIN_MULTWRITE_EXT = 0x39 - WIN_NOP = 0x0 - WIN_PACKETCMD = 0xa0 - WIN_PIDENTIFY = 0xa1 - WIN_POSTBOOT = 0xdc - WIN_PREBOOT = 0xdd - WIN_QUEUED_SERVICE = 0xa2 - WIN_READ = 0x20 - WIN_READDMA = 0xc8 - WIN_READDMA_EXT = 0x25 - WIN_READDMA_ONCE = 0xc9 - WIN_READDMA_QUEUED = 0xc7 - WIN_READDMA_QUEUED_EXT = 0x26 - WIN_READ_BUFFER = 0xe4 - WIN_READ_EXT = 0x24 - WIN_READ_LONG = 0x22 - WIN_READ_LONG_ONCE = 0x23 - WIN_READ_NATIVE_MAX = 0xf8 - WIN_READ_NATIVE_MAX_EXT = 0x27 - WIN_READ_ONCE = 0x21 - WIN_RECAL = 0x10 - WIN_RESTORE = 0x10 - WIN_SECURITY_DISABLE = 0xf6 - WIN_SECURITY_ERASE_PREPARE = 0xf3 - WIN_SECURITY_ERASE_UNIT = 0xf4 - WIN_SECURITY_FREEZE_LOCK = 0xf5 - WIN_SECURITY_SET_PASS = 0xf1 - WIN_SECURITY_UNLOCK = 0xf2 - WIN_SEEK = 0x70 - WIN_SETFEATURES = 0xef - WIN_SETIDLE1 = 0xe3 - WIN_SETIDLE2 = 0x97 - WIN_SETMULT = 0xc6 - WIN_SET_MAX = 0xf9 - WIN_SET_MAX_EXT = 0x37 - WIN_SLEEPNOW1 = 0xe6 - WIN_SLEEPNOW2 = 0x99 - WIN_SMART = 0xb0 - WIN_SPECIFY = 0x91 - WIN_SRST = 0x8 - WIN_STANDBY = 0xe2 - WIN_STANDBY2 = 0x96 - WIN_STANDBYNOW1 = 0xe0 - WIN_STANDBYNOW2 = 0x94 - WIN_VERIFY = 0x40 - WIN_VERIFY_EXT = 0x42 - WIN_VERIFY_ONCE = 0x41 - WIN_WRITE = 0x30 - WIN_WRITEDMA = 0xca - WIN_WRITEDMA_EXT = 0x35 - WIN_WRITEDMA_ONCE = 0xcb - WIN_WRITEDMA_QUEUED = 0xcc - WIN_WRITEDMA_QUEUED_EXT = 0x36 - WIN_WRITE_BUFFER = 0xe8 - WIN_WRITE_EXT = 0x34 - WIN_WRITE_LONG = 0x32 - WIN_WRITE_LONG_ONCE = 0x33 - WIN_WRITE_ONCE = 0x31 - WIN_WRITE_SAME = 0xe9 - WIN_WRITE_VERIFY = 0x3c - WNOHANG = 0x1 - WNOTHREAD = 0x20000000 - WNOWAIT = 0x1000000 - WORDSIZE = 0x40 - WSTOPPED = 0x2 - WUNTRACED = 0x2 - XATTR_CREATE = 0x1 - XATTR_REPLACE = 0x2 - XCASE = 0x4 - XDP_COPY = 0x2 - XDP_FLAGS_DRV_MODE = 0x4 - XDP_FLAGS_HW_MODE = 0x8 - XDP_FLAGS_MASK = 0xf - XDP_FLAGS_MODES = 0xe - XDP_FLAGS_SKB_MODE = 0x2 - XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 - XDP_MMAP_OFFSETS = 0x1 - XDP_OPTIONS = 0x8 - XDP_OPTIONS_ZEROCOPY = 0x1 - XDP_PACKET_HEADROOM = 0x100 - XDP_PGOFF_RX_RING = 0x0 - XDP_PGOFF_TX_RING = 0x80000000 - XDP_RX_RING = 0x2 - XDP_SHARED_UMEM = 0x1 - XDP_STATISTICS = 0x7 - XDP_TX_RING = 0x3 - XDP_UMEM_COMPLETION_RING = 0x6 - XDP_UMEM_FILL_RING = 0x5 - XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 - XDP_UMEM_PGOFF_FILL_RING = 0x100000000 - XDP_UMEM_REG = 0x4 - XDP_ZEROCOPY = 0x4 - XENFS_SUPER_MAGIC = 0xabba1974 - XFS_SUPER_MAGIC = 0x58465342 - XTABS = 0x1800 - Z3FOLD_MAGIC = 0x33 - ZSMALLOC_MAGIC = 0x58295829 - __TIOCFLUSH = 0x80047410 + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2d + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + ASI_LEON_DFLUSH = 0x11 + ASI_LEON_IFLUSH = 0x10 + ASI_LEON_MMUFLUSH = 0x18 + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_ALU = 0x4 + BPF_ALU64 = 0x7 + BPF_AND = 0x50 + BPF_ANY = 0x0 + BPF_ARSH = 0xc0 + BPF_B = 0x10 + BPF_BUILD_ID_SIZE = 0x14 + BPF_CALL = 0x80 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_DIV = 0x30 + BPF_DW = 0x18 + BPF_END = 0xd0 + BPF_EXIST = 0x2 + BPF_EXIT = 0x90 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FROM_BE = 0x8 + BPF_FROM_LE = 0x0 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ALLOW_MULTI = 0x2 + BPF_F_ALLOW_OVERRIDE = 0x1 + BPF_F_ANY_ALIGNMENT = 0x2 + BPF_F_CLONE = 0x200 + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CURRENT_NETNS = -0x1 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_INGRESS = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MMAPABLE = 0x400 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NUMA_NODE = 0x4 + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_QUERY_EFFECTIVE = 0x1 + BPF_F_RDONLY = 0x8 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_STRICT_ALIGNMENT = 0x1 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_STATE_FREQ = 0x8 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_USER_STACK = 0x100 + BPF_F_WRONLY = 0x10 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_ZERO_SEED = 0x40 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JLE = 0xb0 + BPF_JLT = 0xa0 + BPF_JMP = 0x5 + BPF_JMP32 = 0x6 + BPF_JNE = 0x50 + BPF_JSET = 0x40 + BPF_JSGE = 0x70 + BPF_JSGT = 0x60 + BPF_JSLE = 0xd0 + BPF_JSLT = 0xc0 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MOV = 0xb0 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_NOEXIST = 0x1 + BPF_OBJ_NAME_LEN = 0x10 + BPF_OR = 0x40 + BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_VALUE = 0x2 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAG_SIZE = 0x8 + BPF_TAX = 0x0 + BPF_TO_BE = 0x8 + BPF_TO_LE = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XADD = 0xc0 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_J1939 = 0x7 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x8 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CAP_AUDIT_CONTROL = 0x1e + CAP_AUDIT_READ = 0x25 + CAP_AUDIT_WRITE = 0x1d + CAP_BLOCK_SUSPEND = 0x24 + CAP_CHOWN = 0x0 + CAP_DAC_OVERRIDE = 0x1 + CAP_DAC_READ_SEARCH = 0x2 + CAP_FOWNER = 0x3 + CAP_FSETID = 0x4 + CAP_IPC_LOCK = 0xe + CAP_IPC_OWNER = 0xf + CAP_KILL = 0x5 + CAP_LAST_CAP = 0x25 + CAP_LEASE = 0x1c + CAP_LINUX_IMMUTABLE = 0x9 + CAP_MAC_ADMIN = 0x21 + CAP_MAC_OVERRIDE = 0x20 + CAP_MKNOD = 0x1b + CAP_NET_ADMIN = 0xc + CAP_NET_BIND_SERVICE = 0xa + CAP_NET_BROADCAST = 0xb + CAP_NET_RAW = 0xd + CAP_SETFCAP = 0x1f + CAP_SETGID = 0x6 + CAP_SETPCAP = 0x8 + CAP_SETUID = 0x7 + CAP_SYSLOG = 0x22 + CAP_SYS_ADMIN = 0x15 + CAP_SYS_BOOT = 0x16 + CAP_SYS_CHROOT = 0x12 + CAP_SYS_MODULE = 0x10 + CAP_SYS_NICE = 0x17 + CAP_SYS_PACCT = 0x14 + CAP_SYS_PTRACE = 0x13 + CAP_SYS_RAWIO = 0x11 + CAP_SYS_RESOURCE = 0x18 + CAP_SYS_TIME = 0x19 + CAP_SYS_TTY_CONFIG = 0x1a + CAP_WAKE_ALARM = 0x23 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_ARGS_SIZE_VER0 = 0x40 + CLONE_ARGS_SIZE_VER1 = 0x50 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_CLEAR_SIGHAND = 0x100000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PIDFD = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CRYPTO_MAX_NAME = 0x40 + CRYPTO_MSG_MAX = 0x15 + CRYPTO_NR_MSGTYPES = 0x6 + CRYPTO_REPORT_MAXSIZE = 0x160 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d + DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" + DEVLINK_GENL_NAME = "devlink" + DEVLINK_GENL_VERSION = 0x1 + DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DMA_BUF_MAGIC = 0x444d4142 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x400000 + EFD_NONBLOCK = 0x4000 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + EMT_TAGOVF = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x400000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_DSA_8021Q = 0xdadb + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LLDP = 0x88cc + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_ATTRIB = 0x4 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_CREATE = 0x100 + FAN_DELETE = 0x200 + FAN_DELETE_SELF = 0x400 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_MOVE = 0xc0 + FAN_MOVED_FROM = 0x40 + FAN_MOVED_TO = 0x80 + FAN_MOVE_SELF = 0x800 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_FID = 0x200 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FSCRYPT_KEY_DESCRIPTOR_SIZE = 0x8 + FSCRYPT_KEY_DESC_PREFIX = "fscrypt:" + FSCRYPT_KEY_DESC_PREFIX_SIZE = 0x8 + FSCRYPT_KEY_IDENTIFIER_SIZE = 0x10 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY = 0x1 + FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS = 0x2 + FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR = 0x1 + FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER = 0x2 + FSCRYPT_KEY_STATUS_ABSENT = 0x1 + FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF = 0x1 + FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED = 0x3 + FSCRYPT_KEY_STATUS_PRESENT = 0x2 + FSCRYPT_MAX_KEY_SIZE = 0x40 + FSCRYPT_MODE_ADIANTUM = 0x9 + FSCRYPT_MODE_AES_128_CBC = 0x5 + FSCRYPT_MODE_AES_128_CTS = 0x6 + FSCRYPT_MODE_AES_256_CTS = 0x4 + FSCRYPT_MODE_AES_256_XTS = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_16 = 0x2 + FSCRYPT_POLICY_FLAGS_PAD_32 = 0x3 + FSCRYPT_POLICY_FLAGS_PAD_4 = 0x0 + FSCRYPT_POLICY_FLAGS_PAD_8 = 0x1 + FSCRYPT_POLICY_FLAGS_PAD_MASK = 0x3 + FSCRYPT_POLICY_FLAGS_VALID = 0xf + FSCRYPT_POLICY_FLAG_DIRECT_KEY = 0x4 + FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 = 0x8 + FSCRYPT_POLICY_V1 = 0x0 + FSCRYPT_POLICY_V2 = 0x2 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_ADD_ENCRYPTION_KEY = 0xc0506617 + FS_IOC_GET_ENCRYPTION_KEY_STATUS = 0xc080661a + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_POLICY_EX = 0xc0096616 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_REMOVE_ENCRYPTION_KEY = 0xc0406618 + FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS = 0xc0406619 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0xf + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x7 + F_GETLK64 = 0x7 + F_GETOWN = 0x5 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SEAL_FUTURE_WRITE = 0x10 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x8 + F_SETLK64 = 0x8 + F_SETLKW = 0x9 + F_SETLKW64 = 0x9 + F_SETOWN = 0x6 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x3 + F_WRLCK = 0x2 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0xa + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x400000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x4000 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_ROUTER_ALERT_ISOLATE = 0x1e + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PARISC = 0xf0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CAPABILITIES = 0x1f + KEYCTL_CAPS0_BIG_KEY = 0x10 + KEYCTL_CAPS0_CAPABILITIES = 0x1 + KEYCTL_CAPS0_DIFFIE_HELLMAN = 0x4 + KEYCTL_CAPS0_INVALIDATE = 0x20 + KEYCTL_CAPS0_MOVE = 0x80 + KEYCTL_CAPS0_PERSISTENT_KEYRINGS = 0x2 + KEYCTL_CAPS0_PUBLIC_KEY = 0x8 + KEYCTL_CAPS0_RESTRICT_KEYRING = 0x40 + KEYCTL_CAPS1_NS_KEYRING_NAME = 0x1 + KEYCTL_CAPS1_NS_KEY_TAG = 0x2 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_MOVE = 0x1e + KEYCTL_MOVE_EXCL = 0x1 + KEYCTL_NEGATE = 0xd + KEYCTL_PKEY_DECRYPT = 0x1a + KEYCTL_PKEY_ENCRYPT = 0x19 + KEYCTL_PKEY_QUERY = 0x18 + KEYCTL_PKEY_SIGN = 0x1b + KEYCTL_PKEY_VERIFY = 0x1c + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_SUPPORTS_DECRYPT = 0x2 + KEYCTL_SUPPORTS_ENCRYPT = 0x1 + KEYCTL_SUPPORTS_SIGN = 0x4 + KEYCTL_SUPPORTS_VERIFY = 0x8 + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + LOOP_CLR_FD = 0x4c01 + LOOP_CTL_ADD = 0x4c80 + LOOP_CTL_GET_FREE = 0x4c82 + LOOP_CTL_REMOVE = 0x4c81 + LOOP_GET_STATUS = 0x4c03 + LOOP_GET_STATUS64 = 0x4c05 + LOOP_SET_BLOCK_SIZE = 0x4c09 + LOOP_SET_CAPACITY = 0x4c07 + LOOP_SET_DIRECT_IO = 0x4c08 + LOOP_SET_FD = 0x4c00 + LOOP_SET_STATUS = 0x4c02 + LOOP_SET_STATUS64 = 0x4c04 + LO_KEY_SIZE = 0x20 + LO_NAME_SIZE = 0x40 + MADV_COLD = 0x14 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0x15 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x200 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x100 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCAST_BLOCK_SOURCE = 0x2b + MCAST_EXCLUDE = 0x0 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x2a + MCAST_JOIN_SOURCE_GROUP = 0x2e + MCAST_LEAVE_GROUP = 0x2d + MCAST_LEAVE_SOURCE_GROUP = 0x2f + MCAST_MSFILTER = 0x30 + MCAST_UNBLOCK_SOURCE = 0x2c + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MODULE_INIT_IGNORE_MODVERSIONS = 0x1 + MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_GET_STRICT_CHK = 0xc + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x5 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFDBITS = 0x40 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + NS_GET_NSTYPE = 0x2000b703 + NS_GET_OWNER_UID = 0x2000b704 + NS_GET_PARENT = 0x2000b702 + NS_GET_USERNS = 0x2000b701 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x100000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x2000 + O_EXCL = 0x800 + O_FSYNC = 0x802000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x4004 + O_NOATIME = 0x200000 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x4000 + O_PATH = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x802000 + O_SYNC = 0x802000 + O_TMPFILE = 0x2010000 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_IGNORE_OUTGOING = 0x17 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PPC_CMM_MAGIC = 0xc7571590 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4010743f + PPPIOCGIDLE32 = 0x4008743f + PPPIOCGIDLE64 = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80107446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x8010744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80107447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_TAGGED_ADDR_CTRL = 0x38 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_TAGGED_ADDR_CTRL = 0x37 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_DISABLE_NOEXEC = 0x10 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TAGGED_ADDR_ENABLE = 0x1 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENTMSG_SYSCALL_ENTRY = 0x1 + PTRACE_EVENTMSG_SYSCALL_EXIT = 0x2 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPAREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPREGS64 = 0x19 + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_READDATA = 0x10 + PTRACE_READTEXT = 0x12 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPAREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPREGS64 = 0x1a + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SPARC_DETACH = 0xb + PTRACE_SYSCALL = 0x18 + PTRACE_SYSCALL_INFO_ENTRY = 0x1 + PTRACE_SYSCALL_INFO_EXIT = 0x2 + PTRACE_SYSCALL_INFO_NONE = 0x0 + PTRACE_SYSCALL_INFO_SECCOMP = 0x3 + PTRACE_TRACEME = 0x0 + PTRACE_WRITEDATA = 0x11 + PTRACE_WRITETEXT = 0x13 + PT_FP = 0x48 + PT_G0 = 0x10 + PT_G1 = 0x14 + PT_G2 = 0x18 + PT_G3 = 0x1c + PT_G4 = 0x20 + PT_G5 = 0x24 + PT_G6 = 0x28 + PT_G7 = 0x2c + PT_I0 = 0x30 + PT_I1 = 0x34 + PT_I2 = 0x38 + PT_I3 = 0x3c + PT_I4 = 0x40 + PT_I5 = 0x44 + PT_I6 = 0x48 + PT_I7 = 0x4c + PT_NPC = 0x8 + PT_PC = 0x4 + PT_PSR = 0x0 + PT_REGS_MAGIC = 0x57ac6c00 + PT_TNPC = 0x90 + PT_TPC = 0x88 + PT_TSTATE = 0x80 + PT_V9_FP = 0x70 + PT_V9_G0 = 0x0 + PT_V9_G1 = 0x8 + PT_V9_G2 = 0x10 + PT_V9_G3 = 0x18 + PT_V9_G4 = 0x20 + PT_V9_G5 = 0x28 + PT_V9_G6 = 0x30 + PT_V9_G7 = 0x38 + PT_V9_I0 = 0x40 + PT_V9_I1 = 0x48 + PT_V9_I2 = 0x50 + PT_V9_I3 = 0x58 + PT_V9_I4 = 0x60 + PT_V9_I5 = 0x68 + PT_V9_I6 = 0x70 + PT_V9_I7 = 0x78 + PT_V9_MAGIC = 0x9c + PT_V9_TNPC = 0x90 + PT_V9_TPC = 0x88 + PT_V9_TSTATE = 0x80 + PT_V9_Y = 0x98 + PT_WIM = 0x10 + PT_Y = 0xc + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x6 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1e + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4008700d + RTC_EPOCH_SET = 0x8008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4008700b + RTC_IRQP_SET = 0x8008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x40207011 + RTC_PLL_SET = 0x80207012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELLINKPROP = 0x6d + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNEXTHOP = 0x69 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETLINKPROP = 0x6e + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNEXTHOP = 0x6a + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x6f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWLINKPROP = 0x6c + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNEXTHOP = 0x68 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x18 + RTM_NR_MSGTYPES = 0x60 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + RWF_APPEND = 0x10 + RWF_DSYNC = 0x2 + RWF_HIPRI = 0x1 + RWF_NOWAIT = 0x8 + RWF_SUPPORTED = 0x1f + RWF_SYNC = 0x4 + RWF_WRITE_LIFE_NOT_SET = 0x0 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x23 + SCM_TIMESTAMPING_OPT_STATS = 0x38 + SCM_TIMESTAMPING_PKTINFO = 0x3c + SCM_TIMESTAMPNS = 0x21 + SCM_TXTIME = 0x3f + SCM_WIFI_STATUS = 0x25 + SC_LOG_FLUSH = 0x100000 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x400000 + SFD_NONBLOCK = 0x4000 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGETLINKNAME = 0x89e0 + SIOCGETNODEID = 0x89e1 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCGSTAMPNS_NEW = 0x40108907 + SIOCGSTAMPNS_OLD = 0x8907 + SIOCGSTAMP_NEW = 0x40108906 + SIOCGSTAMP_OLD = 0x8906 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x400000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x4000 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x1000 + SO_ACCEPTCONN = 0x8000 + SO_ATTACH_BPF = 0x34 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x35 + SO_ATTACH_REUSEPORT_EBPF = 0x36 + SO_BINDTODEVICE = 0xd + SO_BINDTOIFINDEX = 0x41 + SO_BPF_EXTENSIONS = 0x32 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0x400 + SO_BUSY_POLL = 0x30 + SO_CNX_ADVICE = 0x37 + SO_COOKIE = 0x3b + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DETACH_REUSEPORT_BPF = 0x47 + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x33 + SO_INCOMING_NAPI_ID = 0x3a + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x28 + SO_MARK = 0x22 + SO_MAX_PACING_RATE = 0x31 + SO_MEMINFO = 0x39 + SO_NOFCS = 0x27 + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x2 + SO_PASSSEC = 0x1f + SO_PEEK_OFF = 0x26 + SO_PEERCRED = 0x40 + SO_PEERGROUPS = 0x3d + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x100b + SO_RCVLOWAT = 0x800 + SO_RCVTIMEO = 0x2000 + SO_RCVTIMEO_NEW = 0x44 + SO_RCVTIMEO_OLD = 0x2000 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x24 + SO_SECURITY_AUTHENTICATION = 0x5001 + SO_SECURITY_ENCRYPTION_NETWORK = 0x5004 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x5002 + SO_SELECT_ERR_QUEUE = 0x29 + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x100a + SO_SNDLOWAT = 0x1000 + SO_SNDTIMEO = 0x4000 + SO_SNDTIMEO_NEW = 0x45 + SO_SNDTIMEO_OLD = 0x4000 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x23 + SO_TIMESTAMPING_NEW = 0x43 + SO_TIMESTAMPING_OLD = 0x23 + SO_TIMESTAMPNS = 0x21 + SO_TIMESTAMPNS_NEW = 0x42 + SO_TIMESTAMPNS_OLD = 0x21 + SO_TIMESTAMP_NEW = 0x46 + SO_TIMESTAMP_OLD = 0x1d + SO_TXTIME = 0x3f + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x25 + SO_ZEROCOPY = 0x3e + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_ATTR_VERITY = 0x100000 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYNC_FILE_RANGE_WRITE_AND_WAIT = 0x7 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x9 + TCFLSH = 0x20005407 + TCGETA = 0x40125401 + TCGETS = 0x40245408 + TCGETS2 = 0x402c540c + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_INQ = 0x24 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_TX_DELAY = 0x25 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 + TCSAFLUSH = 0x2 + TCSBRK = 0x20005405 + TCSBRKP = 0x5425 + TCSETA = 0x80125402 + TCSETAF = 0x80125404 + TCSETAW = 0x80125403 + TCSETS = 0x80245409 + TCSETS2 = 0x802c540d + TCSETSF = 0x8024540b + TCSETSF2 = 0x802c540f + TCSETSW = 0x8024540a + TCSETSW2 = 0x802c540e + TCXONC = 0x20005406 + TIMER_ABSTIME = 0x1 + TIOCCBRK = 0x2000747a + TIOCCONS = 0x20007424 + TIOCEXCL = 0x2000740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x40047400 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGISO7816 = 0x40285443 + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x40047483 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40047486 + TIOCGPTPEER = 0x20007489 + TIOCGRS485 = 0x40205441 + TIOCGSERIAL = 0x541e + TIOCGSID = 0x40047485 + TIOCGSOFTCAR = 0x40047464 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMIWAIT = 0x545c + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007484 + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSETD = 0x80047401 + TIOCSIG = 0x80047488 + TIOCSISO7816 = 0xc0285444 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x80047482 + TIOCSPTLCK = 0x80047487 + TIOCSRS485 = 0xc0205442 + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x80047465 + TIOCSTART = 0x2000746e + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x20005437 + TIPC_ADDR_ID = 0x3 + TIPC_ADDR_MCAST = 0x1 + TIPC_ADDR_NAME = 0x2 + TIPC_ADDR_NAMESEQ = 0x1 + TIPC_AEAD_ALG_NAME = 0x20 + TIPC_AEAD_KEYLEN_MAX = 0x24 + TIPC_AEAD_KEYLEN_MIN = 0x14 + TIPC_AEAD_KEY_SIZE_MAX = 0x48 + TIPC_CFG_SRV = 0x0 + TIPC_CLUSTER_BITS = 0xc + TIPC_CLUSTER_MASK = 0xfff000 + TIPC_CLUSTER_OFFSET = 0xc + TIPC_CLUSTER_SIZE = 0xfff + TIPC_CONN_SHUTDOWN = 0x5 + TIPC_CONN_TIMEOUT = 0x82 + TIPC_CRITICAL_IMPORTANCE = 0x3 + TIPC_DESTNAME = 0x3 + TIPC_DEST_DROPPABLE = 0x81 + TIPC_ERRINFO = 0x1 + TIPC_ERR_NO_NAME = 0x1 + TIPC_ERR_NO_NODE = 0x3 + TIPC_ERR_NO_PORT = 0x2 + TIPC_ERR_OVERLOAD = 0x4 + TIPC_GROUP_JOIN = 0x87 + TIPC_GROUP_LEAVE = 0x88 + TIPC_GROUP_LOOPBACK = 0x1 + TIPC_GROUP_MEMBER_EVTS = 0x2 + TIPC_HIGH_IMPORTANCE = 0x2 + TIPC_IMPORTANCE = 0x7f + TIPC_LINK_STATE = 0x2 + TIPC_LOW_IMPORTANCE = 0x0 + TIPC_MAX_BEARER_NAME = 0x20 + TIPC_MAX_IF_NAME = 0x10 + TIPC_MAX_LINK_NAME = 0x44 + TIPC_MAX_MEDIA_NAME = 0x10 + TIPC_MAX_USER_MSG_SIZE = 0x101d0 + TIPC_MCAST_BROADCAST = 0x85 + TIPC_MCAST_REPLICAST = 0x86 + TIPC_MEDIUM_IMPORTANCE = 0x1 + TIPC_NODEID_LEN = 0x10 + TIPC_NODELAY = 0x8a + TIPC_NODE_BITS = 0xc + TIPC_NODE_MASK = 0xfff + TIPC_NODE_OFFSET = 0x0 + TIPC_NODE_RECVQ_DEPTH = 0x83 + TIPC_NODE_SIZE = 0xfff + TIPC_NODE_STATE = 0x0 + TIPC_OK = 0x0 + TIPC_PUBLISHED = 0x1 + TIPC_RESERVED_TYPES = 0x40 + TIPC_RETDATA = 0x2 + TIPC_SERVICE_ADDR = 0x2 + TIPC_SERVICE_RANGE = 0x1 + TIPC_SOCKET_ADDR = 0x3 + TIPC_SOCK_RECVQ_DEPTH = 0x84 + TIPC_SOCK_RECVQ_USED = 0x89 + TIPC_SRC_DROPPABLE = 0x80 + TIPC_SUBSCR_TIMEOUT = 0x3 + TIPC_SUB_CANCEL = 0x4 + TIPC_SUB_PORTS = 0x1 + TIPC_SUB_SERVICE = 0x2 + TIPC_TOP_SRV = 0x1 + TIPC_WAIT_FOREVER = 0xffffffff + TIPC_WITHDRAWN = 0x2 + TIPC_ZONE_BITS = 0x8 + TIPC_ZONE_CLUSTER_MASK = 0xfffff000 + TIPC_ZONE_MASK = 0xff000000 + TIPC_ZONE_OFFSET = 0x18 + TIPC_ZONE_SCOPE = 0x1 + TIPC_ZONE_SIZE = 0xff + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = 0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETDEVNETNS = 0x200054e3 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRPEB = 0x80046f04 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCSPEB = 0x80046f05 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_OPTIONS = 0x8 + XDP_OPTIONS_ZEROCOPY = 0x1 + XDP_PACKET_HEADROOM = 0x100 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RING_NEED_WAKEUP = 0x1 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 + XDP_USE_NEED_WAKEUP = 0x8 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XFS_SUPER_MAGIC = 0x58465342 + XTABS = 0x1800 + Z3FOLD_MAGIC = 0x33 + ZSMALLOC_MAGIC = 0x58295829 + __TIOCFLUSH = 0x80047410 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zptrace386_linux.go b/vendor/golang.org/x/sys/unix/zptrace386_linux.go deleted file mode 100644 index 2d21c49e..00000000 --- a/vendor/golang.org/x/sys/unix/zptrace386_linux.go +++ /dev/null @@ -1,80 +0,0 @@ -// Code generated by linux/mkall.go generatePtracePair(386, amd64). DO NOT EDIT. - -// +build linux -// +build 386 amd64 - -package unix - -import "unsafe" - -// PtraceRegs386 is the registers used by 386 binaries. -type PtraceRegs386 struct { - Ebx int32 - Ecx int32 - Edx int32 - Esi int32 - Edi int32 - Ebp int32 - Eax int32 - Xds int32 - Xes int32 - Xfs int32 - Xgs int32 - Orig_eax int32 - Eip int32 - Xcs int32 - Eflags int32 - Esp int32 - Xss int32 -} - -// PtraceGetRegs386 fetches the registers used by 386 binaries. -func PtraceGetRegs386(pid int, regsout *PtraceRegs386) error { - return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) -} - -// PtraceSetRegs386 sets the registers used by 386 binaries. -func PtraceSetRegs386(pid int, regs *PtraceRegs386) error { - return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) -} - -// PtraceRegsAmd64 is the registers used by amd64 binaries. -type PtraceRegsAmd64 struct { - R15 uint64 - R14 uint64 - R13 uint64 - R12 uint64 - Rbp uint64 - Rbx uint64 - R11 uint64 - R10 uint64 - R9 uint64 - R8 uint64 - Rax uint64 - Rcx uint64 - Rdx uint64 - Rsi uint64 - Rdi uint64 - Orig_rax uint64 - Rip uint64 - Cs uint64 - Eflags uint64 - Rsp uint64 - Ss uint64 - Fs_base uint64 - Gs_base uint64 - Ds uint64 - Es uint64 - Fs uint64 - Gs uint64 -} - -// PtraceGetRegsAmd64 fetches the registers used by amd64 binaries. -func PtraceGetRegsAmd64(pid int, regsout *PtraceRegsAmd64) error { - return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) -} - -// PtraceSetRegsAmd64 sets the registers used by amd64 binaries. -func PtraceSetRegsAmd64(pid int, regs *PtraceRegsAmd64) error { - return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) -} diff --git a/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go b/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go new file mode 100644 index 00000000..89c5920e --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go @@ -0,0 +1,41 @@ +// Code generated by linux/mkall.go generatePtracePair("arm", "arm64"). DO NOT EDIT. + +// +build linux +// +build arm arm64 + +package unix + +import "unsafe" + +// PtraceRegsArm is the registers used by arm binaries. +type PtraceRegsArm struct { + Uregs [18]uint32 +} + +// PtraceGetRegsArm fetches the registers used by arm binaries. +func PtraceGetRegsArm(pid int, regsout *PtraceRegsArm) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsArm sets the registers used by arm binaries. +func PtraceSetRegsArm(pid int, regs *PtraceRegsArm) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsArm64 is the registers used by arm64 binaries. +type PtraceRegsArm64 struct { + Regs [31]uint64 + Sp uint64 + Pc uint64 + Pstate uint64 +} + +// PtraceGetRegsArm64 fetches the registers used by arm64 binaries. +func PtraceGetRegsArm64(pid int, regsout *PtraceRegsArm64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsArm64 sets the registers used by arm64 binaries. +func PtraceSetRegsArm64(pid int, regs *PtraceRegsArm64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go b/vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go new file mode 100644 index 00000000..6cb6d688 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go @@ -0,0 +1,17 @@ +// Code generated by linux/mkall.go generatePtraceRegSet("arm64"). DO NOT EDIT. + +package unix + +import "unsafe" + +// PtraceGetRegSetArm64 fetches the registers used by arm64 binaries. +func PtraceGetRegSetArm64(pid, addr int, regsout *PtraceRegsArm64) error { + iovec := Iovec{(*byte)(unsafe.Pointer(regsout)), uint64(unsafe.Sizeof(*regsout))} + return ptrace(PTRACE_GETREGSET, pid, uintptr(addr), uintptr(unsafe.Pointer(&iovec))) +} + +// PtraceSetRegSetArm64 sets the registers used by arm64 binaries. +func PtraceSetRegSetArm64(pid, addr int, regs *PtraceRegsArm64) error { + iovec := Iovec{(*byte)(unsafe.Pointer(regs)), uint64(unsafe.Sizeof(*regs))} + return ptrace(PTRACE_SETREGSET, pid, uintptr(addr), uintptr(unsafe.Pointer(&iovec))) +} diff --git a/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go b/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go new file mode 100644 index 00000000..24b841ee --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go @@ -0,0 +1,50 @@ +// Code generated by linux/mkall.go generatePtracePair("mips", "mips64"). DO NOT EDIT. + +// +build linux +// +build mips mips64 + +package unix + +import "unsafe" + +// PtraceRegsMips is the registers used by mips binaries. +type PtraceRegsMips struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips fetches the registers used by mips binaries. +func PtraceGetRegsMips(pid int, regsout *PtraceRegsMips) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips sets the registers used by mips binaries. +func PtraceSetRegsMips(pid int, regs *PtraceRegsMips) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsMips64 is the registers used by mips64 binaries. +type PtraceRegsMips64 struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips64 fetches the registers used by mips64 binaries. +func PtraceGetRegsMips64(pid int, regsout *PtraceRegsMips64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips64 sets the registers used by mips64 binaries. +func PtraceSetRegsMips64(pid int, regs *PtraceRegsMips64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go b/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go new file mode 100644 index 00000000..47b04895 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go @@ -0,0 +1,50 @@ +// Code generated by linux/mkall.go generatePtracePair("mipsle", "mips64le"). DO NOT EDIT. + +// +build linux +// +build mipsle mips64le + +package unix + +import "unsafe" + +// PtraceRegsMipsle is the registers used by mipsle binaries. +type PtraceRegsMipsle struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMipsle fetches the registers used by mipsle binaries. +func PtraceGetRegsMipsle(pid int, regsout *PtraceRegsMipsle) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMipsle sets the registers used by mipsle binaries. +func PtraceSetRegsMipsle(pid int, regs *PtraceRegsMipsle) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsMips64le is the registers used by mips64le binaries. +type PtraceRegsMips64le struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips64le fetches the registers used by mips64le binaries. +func PtraceGetRegsMips64le(pid int, regsout *PtraceRegsMips64le) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips64le sets the registers used by mips64le binaries. +func PtraceSetRegsMips64le(pid int, regs *PtraceRegsMips64le) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go b/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go new file mode 100644 index 00000000..ea5d9cb5 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/zptrace_x86_linux.go @@ -0,0 +1,80 @@ +// Code generated by linux/mkall.go generatePtracePair("386", "amd64"). DO NOT EDIT. + +// +build linux +// +build 386 amd64 + +package unix + +import "unsafe" + +// PtraceRegs386 is the registers used by 386 binaries. +type PtraceRegs386 struct { + Ebx int32 + Ecx int32 + Edx int32 + Esi int32 + Edi int32 + Ebp int32 + Eax int32 + Xds int32 + Xes int32 + Xfs int32 + Xgs int32 + Orig_eax int32 + Eip int32 + Xcs int32 + Eflags int32 + Esp int32 + Xss int32 +} + +// PtraceGetRegs386 fetches the registers used by 386 binaries. +func PtraceGetRegs386(pid int, regsout *PtraceRegs386) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegs386 sets the registers used by 386 binaries. +func PtraceSetRegs386(pid int, regs *PtraceRegs386) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsAmd64 is the registers used by amd64 binaries. +type PtraceRegsAmd64 struct { + R15 uint64 + R14 uint64 + R13 uint64 + R12 uint64 + Rbp uint64 + Rbx uint64 + R11 uint64 + R10 uint64 + R9 uint64 + R8 uint64 + Rax uint64 + Rcx uint64 + Rdx uint64 + Rsi uint64 + Rdi uint64 + Orig_rax uint64 + Rip uint64 + Cs uint64 + Eflags uint64 + Rsp uint64 + Ss uint64 + Fs_base uint64 + Gs_base uint64 + Ds uint64 + Es uint64 + Fs uint64 + Gs uint64 +} + +// PtraceGetRegsAmd64 fetches the registers used by amd64 binaries. +func PtraceGetRegsAmd64(pid int, regsout *PtraceRegsAmd64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsAmd64 sets the registers used by amd64 binaries. +func PtraceSetRegsAmd64(pid int, regs *PtraceRegsAmd64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/golang.org/x/sys/unix/zptracearm_linux.go b/vendor/golang.org/x/sys/unix/zptracearm_linux.go deleted file mode 100644 index faf23bbe..00000000 --- a/vendor/golang.org/x/sys/unix/zptracearm_linux.go +++ /dev/null @@ -1,41 +0,0 @@ -// Code generated by linux/mkall.go generatePtracePair(arm, arm64). DO NOT EDIT. - -// +build linux -// +build arm arm64 - -package unix - -import "unsafe" - -// PtraceRegsArm is the registers used by arm binaries. -type PtraceRegsArm struct { - Uregs [18]uint32 -} - -// PtraceGetRegsArm fetches the registers used by arm binaries. -func PtraceGetRegsArm(pid int, regsout *PtraceRegsArm) error { - return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) -} - -// PtraceSetRegsArm sets the registers used by arm binaries. -func PtraceSetRegsArm(pid int, regs *PtraceRegsArm) error { - return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) -} - -// PtraceRegsArm64 is the registers used by arm64 binaries. -type PtraceRegsArm64 struct { - Regs [31]uint64 - Sp uint64 - Pc uint64 - Pstate uint64 -} - -// PtraceGetRegsArm64 fetches the registers used by arm64 binaries. -func PtraceGetRegsArm64(pid int, regsout *PtraceRegsArm64) error { - return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) -} - -// PtraceSetRegsArm64 sets the registers used by arm64 binaries. -func PtraceSetRegsArm64(pid int, regs *PtraceRegsArm64) error { - return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) -} diff --git a/vendor/golang.org/x/sys/unix/zptracemips_linux.go b/vendor/golang.org/x/sys/unix/zptracemips_linux.go deleted file mode 100644 index c431131e..00000000 --- a/vendor/golang.org/x/sys/unix/zptracemips_linux.go +++ /dev/null @@ -1,50 +0,0 @@ -// Code generated by linux/mkall.go generatePtracePair(mips, mips64). DO NOT EDIT. - -// +build linux -// +build mips mips64 - -package unix - -import "unsafe" - -// PtraceRegsMips is the registers used by mips binaries. -type PtraceRegsMips struct { - Regs [32]uint64 - Lo uint64 - Hi uint64 - Epc uint64 - Badvaddr uint64 - Status uint64 - Cause uint64 -} - -// PtraceGetRegsMips fetches the registers used by mips binaries. -func PtraceGetRegsMips(pid int, regsout *PtraceRegsMips) error { - return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) -} - -// PtraceSetRegsMips sets the registers used by mips binaries. -func PtraceSetRegsMips(pid int, regs *PtraceRegsMips) error { - return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) -} - -// PtraceRegsMips64 is the registers used by mips64 binaries. -type PtraceRegsMips64 struct { - Regs [32]uint64 - Lo uint64 - Hi uint64 - Epc uint64 - Badvaddr uint64 - Status uint64 - Cause uint64 -} - -// PtraceGetRegsMips64 fetches the registers used by mips64 binaries. -func PtraceGetRegsMips64(pid int, regsout *PtraceRegsMips64) error { - return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) -} - -// PtraceSetRegsMips64 sets the registers used by mips64 binaries. -func PtraceSetRegsMips64(pid int, regs *PtraceRegsMips64) error { - return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) -} diff --git a/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go b/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go deleted file mode 100644 index dc3d6d37..00000000 --- a/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go +++ /dev/null @@ -1,50 +0,0 @@ -// Code generated by linux/mkall.go generatePtracePair(mipsle, mips64le). DO NOT EDIT. - -// +build linux -// +build mipsle mips64le - -package unix - -import "unsafe" - -// PtraceRegsMipsle is the registers used by mipsle binaries. -type PtraceRegsMipsle struct { - Regs [32]uint64 - Lo uint64 - Hi uint64 - Epc uint64 - Badvaddr uint64 - Status uint64 - Cause uint64 -} - -// PtraceGetRegsMipsle fetches the registers used by mipsle binaries. -func PtraceGetRegsMipsle(pid int, regsout *PtraceRegsMipsle) error { - return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) -} - -// PtraceSetRegsMipsle sets the registers used by mipsle binaries. -func PtraceSetRegsMipsle(pid int, regs *PtraceRegsMipsle) error { - return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) -} - -// PtraceRegsMips64le is the registers used by mips64le binaries. -type PtraceRegsMips64le struct { - Regs [32]uint64 - Lo uint64 - Hi uint64 - Epc uint64 - Badvaddr uint64 - Status uint64 - Cause uint64 -} - -// PtraceGetRegsMips64le fetches the registers used by mips64le binaries. -func PtraceGetRegsMips64le(pid int, regsout *PtraceRegsMips64le) error { - return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) -} - -// PtraceSetRegsMips64le sets the registers used by mips64le binaries. -func PtraceSetRegsMips64le(pid int, regs *PtraceRegsMips64le) error { - return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) -} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go index b5ed8058..c1cc0a41 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -527,6 +516,17 @@ func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintp // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func kill(pid int, signum int, posix int) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go index cdf8a700..a3fc4900 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -339,22 +339,6 @@ func libc_futimes_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := syscall_syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_fcntl_trampoline() - -//go:linkname libc_fcntl libc_fcntl -//go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := syscall_syscall(funcPC(libc_poll_trampoline), uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -727,6 +711,22 @@ func libc_setattrlist_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := syscall_syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fcntl_trampoline() + +//go:linkname libc_fcntl libc_fcntl +//go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func kill(pid int, signum int, posix int) (err error) { _, _, e1 := syscall_syscall(funcPC(libc_kill_trampoline), uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s index 9cae5b1d..6836a412 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s @@ -44,8 +44,6 @@ TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_futimes(SB) -TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 - JMP libc_fcntl(SB) TEXT ·libc_poll_trampoline(SB),NOSPLIT,$0-0 JMP libc_poll(SB) TEXT ·libc_madvise_trampoline(SB),NOSPLIT,$0-0 @@ -84,6 +82,8 @@ TEXT ·libc_flistxattr_trampoline(SB),NOSPLIT,$0-0 JMP libc_flistxattr(SB) TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_setattrlist(SB) +TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0 JMP libc_kill(SB) TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0 @@ -106,6 +106,8 @@ TEXT ·libc_chown_trampoline(SB),NOSPLIT,$0-0 JMP libc_chown(SB) TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) +TEXT ·libc_clock_gettime_trampoline(SB),NOSPLIT,$0-0 + JMP libc_clock_gettime(SB) TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 JMP libc_close(SB) TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go index 8bde8235..f8e5c37c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -527,6 +516,17 @@ func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintp // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func kill(pid int, signum int, posix int) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 63b51fbf..50d6437e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -339,22 +339,6 @@ func libc_futimes_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := syscall_syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_fcntl_trampoline() - -//go:linkname libc_fcntl libc_fcntl -//go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := syscall_syscall(funcPC(libc_poll_trampoline), uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -727,6 +711,22 @@ func libc_setattrlist_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := syscall_syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fcntl_trampoline() + +//go:linkname libc_fcntl libc_fcntl +//go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func kill(pid int, signum int, posix int) (err error) { _, _, e1 := syscall_syscall(funcPC(libc_kill_trampoline), uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index 1a0e52aa..a3fdf099 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -44,8 +44,6 @@ TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_futimes(SB) -TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 - JMP libc_fcntl(SB) TEXT ·libc_poll_trampoline(SB),NOSPLIT,$0-0 JMP libc_poll(SB) TEXT ·libc_madvise_trampoline(SB),NOSPLIT,$0-0 @@ -84,6 +82,8 @@ TEXT ·libc_flistxattr_trampoline(SB),NOSPLIT,$0-0 JMP libc_flistxattr(SB) TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_setattrlist(SB) +TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0 JMP libc_kill(SB) TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go index 63a236b5..cea04e04 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -527,6 +516,17 @@ func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintp // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func kill(pid int, signum int, posix int) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go index adb8668c..63103950 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -339,22 +339,6 @@ func libc_futimes_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := syscall_syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_fcntl_trampoline() - -//go:linkname libc_fcntl libc_fcntl -//go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := syscall_syscall(funcPC(libc_poll_trampoline), uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -727,6 +711,22 @@ func libc_setattrlist_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := syscall_syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fcntl_trampoline() + +//go:linkname libc_fcntl libc_fcntl +//go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func kill(pid int, signum int, posix int) (err error) { _, _, e1 := syscall_syscall(funcPC(libc_kill_trampoline), uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s index 5bebb1bb..b67f518f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s @@ -44,8 +44,6 @@ TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_futimes(SB) -TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 - JMP libc_fcntl(SB) TEXT ·libc_poll_trampoline(SB),NOSPLIT,$0-0 JMP libc_poll(SB) TEXT ·libc_madvise_trampoline(SB),NOSPLIT,$0-0 @@ -84,10 +82,14 @@ TEXT ·libc_flistxattr_trampoline(SB),NOSPLIT,$0-0 JMP libc_flistxattr(SB) TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_setattrlist(SB) +TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0 JMP libc_kill(SB) TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) +TEXT ·libc_sysctl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) TEXT ·libc_access_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go index 87c0b612..8c3bb3a2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -527,6 +516,17 @@ func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintp // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func kill(pid int, signum int, posix int) (err error) { _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index c882a4f9..a8709f72 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -339,22 +339,6 @@ func libc_futimes_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := syscall_syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_fcntl_trampoline() - -//go:linkname libc_fcntl libc_fcntl -//go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := syscall_syscall(funcPC(libc_poll_trampoline), uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -727,6 +711,22 @@ func libc_setattrlist_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := syscall_syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fcntl_trampoline() + +//go:linkname libc_fcntl libc_fcntl +//go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func kill(pid int, signum int, posix int) (err error) { _, _, e1 := syscall_syscall(funcPC(libc_kill_trampoline), uintptr(pid), uintptr(signum), uintptr(posix)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index 19faa4d8..40cce1bb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -44,8 +44,6 @@ TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 JMP libc_futimes(SB) -TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 - JMP libc_fcntl(SB) TEXT ·libc_poll_trampoline(SB),NOSPLIT,$0-0 JMP libc_poll(SB) TEXT ·libc_madvise_trampoline(SB),NOSPLIT,$0-0 @@ -84,6 +82,8 @@ TEXT ·libc_flistxattr_trampoline(SB),NOSPLIT,$0-0 JMP libc_flistxattr(SB) TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_setattrlist(SB) +TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0 JMP libc_kill(SB) TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0 @@ -106,6 +106,8 @@ TEXT ·libc_chown_trampoline(SB),NOSPLIT,$0-0 JMP libc_chown(SB) TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) +TEXT ·libc_clock_gettime_trampoline(SB),NOSPLIT,$0-0 + JMP libc_clock_gettime(SB) TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 JMP libc_close(SB) TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index df199b34..fe1fdd78 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -255,17 +255,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index e68185f1..c9058f30 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -255,17 +255,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index 2f77f93c..49b20c22 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index e9a12c9d..31d2c461 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index 27ab0fbd..abab3d7c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index fe5d462e..0e68c146 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -2030,8 +2121,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2040,8 +2132,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 536abcea..c038e52e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -2046,8 +2137,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2056,8 +2148,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 37823cd6..333683d9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -2166,8 +2257,9 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2176,8 +2268,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index 794f6126..838bbdba 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -1969,8 +2060,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -1979,8 +2071,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 1b34b550..7da49ae2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -1960,8 +2051,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -1970,8 +2062,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index 5714e259..f22f83fd 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -1990,8 +2081,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2000,8 +2092,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 88a6b336..307c430d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -1990,8 +2081,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2000,8 +2092,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index c09dbe34..0997b6ed 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -1960,8 +2051,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -1970,8 +2062,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 42f6c210..a601e725 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -2072,8 +2163,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2082,8 +2174,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index de2cd8db..6e4cb194 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -2072,8 +2163,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2082,8 +2174,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index d51bf07f..e690f193 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -1949,8 +2040,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -1959,8 +2051,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 1e3a3cb7..f4cd0860 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -2042,8 +2133,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2052,8 +2144,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index 3c97008c..2447f2a7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -659,17 +659,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fdatasync(fd int) (err error) { _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1608,6 +1597,108 @@ func writelen(fd int, p *byte, np int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readv(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writev(fd int, iovs []Iovec) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func preadv2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREADV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pwritev2(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(iovs) > 0 { + _p0 = unsafe.Pointer(&iovs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITEV2, uintptr(fd), uintptr(_p0), uintptr(len(iovs)), uintptr(offs_l), uintptr(offs_h), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) if e1 != 0 { @@ -2041,8 +2132,9 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsgid(gid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) +func setfsgid(gid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } @@ -2051,8 +2143,9 @@ func Setfsgid(gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setfsuid(uid int) (err error) { - _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) +func setfsuid(uid int) (prev int, err error) { + r0, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + prev = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 5ade42cc..3bbd9e39 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -361,22 +350,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -433,6 +406,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -564,6 +553,16 @@ func Dup2(from int, to int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Dup3(from int, to int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return @@ -926,6 +925,16 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fstatvfs1(fd int, buf *Statvfs_t, flags int) (err error) { + _, _, e1 := Syscall(SYS_FSTATVFS1, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1635,6 +1644,21 @@ func Stat(path string, stat *Stat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Statvfs1(path string, buf *Statvfs_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATVFS1, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 3e0bbc5f..d8cf5012 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -361,22 +350,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -433,6 +406,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -564,6 +553,16 @@ func Dup2(from int, to int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Dup3(from int, to int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return @@ -926,6 +925,16 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fstatvfs1(fd int, buf *Statvfs_t, flags int) (err error) { + _, _, e1 := Syscall(SYS_FSTATVFS1, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1635,6 +1644,21 @@ func Stat(path string, stat *Stat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Statvfs1(path string, buf *Statvfs_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATVFS1, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index cb0af13a..1153fe69 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -361,22 +350,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -433,6 +406,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -564,6 +553,16 @@ func Dup2(from int, to int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Dup3(from int, to int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return @@ -926,6 +925,16 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fstatvfs1(fd int, buf *Statvfs_t, flags int) (err error) { + _, _, e1 := Syscall(SYS_FSTATVFS1, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1635,6 +1644,21 @@ func Stat(path string, stat *Stat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Statvfs1(path string, buf *Statvfs_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATVFS1, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 6fd48d3d..24b4ebb4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -361,22 +350,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe() (fd1 int, fd2 int, err error) { r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) fd1 = int(r0) @@ -433,6 +406,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -564,6 +553,16 @@ func Dup2(from int, to int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Dup3(from int, to int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return @@ -926,6 +925,16 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Fstatvfs1(fd int, buf *Statvfs_t, flags int) (err error) { + _, _, e1 := Syscall(SYS_FSTATVFS1, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Fsync(fd int) (err error) { _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) if e1 != 0 { @@ -1635,6 +1644,21 @@ func Stat(path string, stat *Stat_t) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Statvfs1(path string, buf *Statvfs_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATVFS1, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Symlink(path string, link string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 2938e412..b44b31ae 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -361,24 +350,8 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } @@ -431,6 +404,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -573,6 +562,16 @@ func Dup2(from int, to int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Dup3(from int, to int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 22b79ab0..67f93ee7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -361,24 +350,8 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } @@ -431,6 +404,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -573,6 +562,16 @@ func Dup2(from int, to int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Dup3(from int, to int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index cb921f37..d7c878b1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -361,24 +350,8 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } @@ -431,6 +404,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -573,6 +562,16 @@ func Dup2(from int, to int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Dup3(from int, to int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 5a743803..8facd695 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -239,17 +239,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) - val = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) n = int(r0) @@ -361,24 +350,8 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } @@ -431,6 +404,22 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -573,6 +562,16 @@ func Dup2(from int, to int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Dup3(from int, to int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(from), uintptr(to), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Exit(code int) { Syscall(SYS_EXIT, uintptr(code), 0, 0) return diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 753def98..1f3b4d15 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -297,4 +297,5 @@ const ( SYS_FSMOUNT = 432 SYS_FSPICK = 433 SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index ac86bd54..00da3de9 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -415,4 +415,5 @@ const ( SYS_FSMOUNT = 4432 SYS_FSPICK = 4433 SYS_PIDFD_OPEN = 4434 + SYS_CLONE3 = 4435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 1f5705b5..d404fbd4 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -345,4 +345,5 @@ const ( SYS_FSMOUNT = 5432 SYS_FSPICK = 5433 SYS_PIDFD_OPEN = 5434 + SYS_CLONE3 = 5435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index d9ed9532..bfbf242f 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -345,4 +345,5 @@ const ( SYS_FSMOUNT = 5432 SYS_FSPICK = 5433 SYS_PIDFD_OPEN = 5434 + SYS_CLONE3 = 5435 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 94266b65..3826f497 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -415,4 +415,5 @@ const ( SYS_FSMOUNT = 4432 SYS_FSPICK = 4433 SYS_PIDFD_OPEN = 4434 + SYS_CLONE3 = 4435 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go index c206f2b0..71ea1d6d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -467,3 +467,13 @@ type Utsname struct { Version [32]byte Machine [32]byte } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 7312e95f..0ec15968 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -423,7 +423,7 @@ type PtraceIoDesc struct { Op int32 Offs *byte Addr *byte - Len uint + Len uint32 } type Kevent_t struct { @@ -698,3 +698,13 @@ type Utsname struct { Version [256]byte Machine [256]byte } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Spare int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index 29ba2f5b..8340f577 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -428,7 +428,7 @@ type PtraceIoDesc struct { Op int32 Offs *byte Addr *byte - Len uint + Len uint64 } type Kevent_t struct { @@ -704,3 +704,13 @@ type Utsname struct { Version [256]byte Machine [256]byte } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Spare int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index b4090ef3..6f79227d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -405,7 +405,7 @@ type PtraceIoDesc struct { Op int32 Offs *byte Addr *byte - Len uint + Len uint32 } type Kevent_t struct { @@ -681,3 +681,13 @@ type Utsname struct { Version [256]byte Machine [256]byte } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Spare int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index 1542a877..e751e003 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -397,7 +397,7 @@ type Reg struct { } type FpReg struct { - Fp_q [32]uint128 + Fp_q [512]uint8 Fp_sr uint32 Fp_cr uint32 } @@ -406,7 +406,7 @@ type PtraceIoDesc struct { Op int32 Offs *byte Addr *byte - Len uint + Len uint64 } type Kevent_t struct { @@ -682,3 +682,13 @@ type Utsname struct { Version [256]byte Machine [256]byte } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Spare int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 16d62fa4..d8089584 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -179,6 +179,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -256,7 +305,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -427,7 +476,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -543,7 +592,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2041,6 +2090,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2055,6 +2105,7 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 } type XDPStatistics struct { @@ -2626,3 +2677,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 97e92393..88c76390 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -179,6 +179,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -256,7 +305,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -428,7 +477,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -544,7 +593,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2054,6 +2103,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2068,6 +2118,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2640,3 +2692,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 05f978e8..0c0f24c7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -183,6 +183,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -260,7 +309,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -431,7 +480,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -547,7 +596,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2032,6 +2081,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2046,6 +2096,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2617,3 +2669,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 5086fcea..6065d2d5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -180,6 +180,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -257,7 +306,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -429,7 +478,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -545,7 +594,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2033,6 +2082,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2047,6 +2097,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2619,3 +2671,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index b6ddd8c5..29d4408d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -182,6 +182,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -259,7 +308,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -430,7 +479,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -546,7 +595,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2038,6 +2087,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2052,6 +2102,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2623,3 +2675,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 89f3e32a..9cac9ff8 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -180,6 +180,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -257,7 +306,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -429,7 +478,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -545,7 +594,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -783,6 +832,7 @@ type Ustat_t struct { type EpollEvent struct { Events uint32 + _ int32 Fd int32 Pad int32 } @@ -2035,6 +2085,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2049,6 +2100,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2621,3 +2674,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 6b84cf79..dbc21cf3 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -180,6 +180,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -257,7 +306,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -429,7 +478,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -545,7 +594,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -783,6 +832,7 @@ type Ustat_t struct { type EpollEvent struct { Events uint32 + _ int32 Fd int32 Pad int32 } @@ -2035,6 +2085,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2049,6 +2100,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2621,3 +2674,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index bc50cd38..a2662370 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -182,6 +182,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -259,7 +308,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -430,7 +479,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -546,7 +595,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2038,6 +2087,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2052,6 +2102,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2623,3 +2675,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 0a1ec170..e93b73cd 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -181,6 +181,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -258,7 +307,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -430,7 +479,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -546,7 +595,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2043,6 +2092,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2057,6 +2107,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2629,3 +2681,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index c7f045a5..1f431b6f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -181,6 +181,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -258,7 +307,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -430,7 +479,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -546,7 +595,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2043,6 +2092,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2057,6 +2107,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2629,3 +2681,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index 5d8d4479..81a5dc14 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -180,6 +180,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -257,7 +306,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -429,7 +478,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -545,7 +594,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2061,6 +2110,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2075,6 +2125,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2647,3 +2699,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 034875a6..ae765d47 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -179,6 +179,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -256,7 +305,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -428,7 +477,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -544,7 +593,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2057,6 +2106,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2071,6 +2121,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2643,3 +2695,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 2f7ec8b8..63685ca8 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -183,6 +183,55 @@ type FscryptKey struct { Size uint32 } +type FscryptPolicyV1 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptPolicyV2 struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + _ [4]uint8 + Master_key_identifier [16]uint8 +} + +type FscryptGetPolicyExArg struct { + Size uint64 + Policy [24]byte +} + +type FscryptKeySpecifier struct { + Type uint32 + _ uint32 + U [32]byte +} + +type FscryptAddKeyArg struct { + Key_spec FscryptKeySpecifier + Raw_size uint32 + _ [9]uint32 +} + +type FscryptRemoveKeyArg struct { + Key_spec FscryptKeySpecifier + Removal_status_flags uint32 + _ [5]uint32 +} + +type FscryptGetKeyStatusArg struct { + Key_spec FscryptKeySpecifier + _ [6]uint32 + Status uint32 + Status_flags uint32 + User_count uint32 + _ [13]uint32 +} + type KeyctlDHParams struct { Private int32 Prime int32 @@ -260,7 +309,7 @@ type RawSockaddrRFCOMM struct { type RawSockaddrCAN struct { Family uint16 Ifindex int32 - Addr [8]byte + Addr [16]byte } type RawSockaddrALG struct { @@ -432,7 +481,7 @@ const ( SizeofSockaddrHCI = 0x6 SizeofSockaddrL2 = 0xe SizeofSockaddrRFCOMM = 0xa - SizeofSockaddrCAN = 0x10 + SizeofSockaddrCAN = 0x18 SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 @@ -548,7 +597,7 @@ const ( IFLA_NEW_IFINDEX = 0x31 IFLA_MIN_MTU = 0x32 IFLA_MAX_MTU = 0x33 - IFLA_MAX = 0x33 + IFLA_MAX = 0x35 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 IFLA_INFO_XSTATS = 0x3 @@ -2038,6 +2087,7 @@ type XDPRingOffset struct { Producer uint64 Consumer uint64 Desc uint64 + Flags uint64 } type XDPMmapOffsets struct { @@ -2052,6 +2102,8 @@ type XDPUmemReg struct { Len uint64 Size uint32 Headroom uint32 + Flags uint32 + _ [4]byte } type XDPStatistics struct { @@ -2624,3 +2676,132 @@ const ( SYSLOG_ACTION_SIZE_UNREAD = 9 SYSLOG_ACTION_SIZE_BUFFER = 10 ) + +const ( + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_MAX = 0x44 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_MAX = 0x8c + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go index 86736ab6..a89100c0 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -78,6 +78,33 @@ type Stat_t struct { type Statfs_t [0]byte +type Statvfs_t struct { + Flag uint32 + Bsize uint32 + Frsize uint32 + Iosize uint32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Bresvd uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fresvd uint64 + Syncreads uint64 + Syncwrites uint64 + Asyncreads uint64 + Asyncwrites uint64 + Fsidx Fsid + Fsid uint32 + Namemax uint32 + Owner uint32 + Spare [4]uint32 + Fstypename [32]byte + Mntonname [1024]byte + Mntfromname [1024]byte +} + type Flock_t struct { Start int64 Len int64 @@ -103,6 +130,11 @@ const ( PathMax = 0x400 ) +const ( + ST_WAIT = 0x1 + ST_NOWAIT = 0x2 +) + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go index 3427811f..289184e0 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -82,6 +82,34 @@ type Stat_t struct { type Statfs_t [0]byte +type Statvfs_t struct { + Flag uint64 + Bsize uint64 + Frsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Bresvd uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fresvd uint64 + Syncreads uint64 + Syncwrites uint64 + Asyncreads uint64 + Asyncwrites uint64 + Fsidx Fsid + Fsid uint64 + Namemax uint64 + Owner uint32 + Spare [4]uint32 + Fstypename [32]byte + Mntonname [1024]byte + Mntfromname [1024]byte + _ [4]byte +} + type Flock_t struct { Start int64 Len int64 @@ -107,6 +135,11 @@ const ( PathMax = 0x400 ) +const ( + ST_WAIT = 0x1 + ST_NOWAIT = 0x2 +) + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index 399f37a4..428c450e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -83,6 +83,33 @@ type Stat_t struct { type Statfs_t [0]byte +type Statvfs_t struct { + Flag uint32 + Bsize uint32 + Frsize uint32 + Iosize uint32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Bresvd uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fresvd uint64 + Syncreads uint64 + Syncwrites uint64 + Asyncreads uint64 + Asyncwrites uint64 + Fsidx Fsid + Fsid uint32 + Namemax uint32 + Owner uint32 + Spare [4]uint32 + Fstypename [32]byte + Mntonname [1024]byte + Mntfromname [1024]byte +} + type Flock_t struct { Start int64 Len int64 @@ -108,6 +135,11 @@ const ( PathMax = 0x400 ) +const ( + ST_WAIT = 0x1 + ST_NOWAIT = 0x2 +) + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go index 32f0c15d..6f1f2842 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go @@ -82,6 +82,34 @@ type Stat_t struct { type Statfs_t [0]byte +type Statvfs_t struct { + Flag uint64 + Bsize uint64 + Frsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Bresvd uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fresvd uint64 + Syncreads uint64 + Syncwrites uint64 + Asyncreads uint64 + Asyncwrites uint64 + Fsidx Fsid + Fsid uint64 + Namemax uint64 + Owner uint32 + Spare [4]uint32 + Fstypename [32]byte + Mntonname [1024]byte + Mntfromname [1024]byte + _ [4]byte +} + type Flock_t struct { Start int64 Len int64 @@ -107,6 +135,11 @@ const ( PathMax = 0x400 ) +const ( + ST_WAIT = 0x1 + ST_NOWAIT = 0x2 +) + const ( FADV_NORMAL = 0x0 FADV_RANDOM = 0x1 diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go index 8531a190..23ed9fe5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -211,6 +211,12 @@ type Cmsghdr struct { Type int32 } +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + type Inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 @@ -236,6 +242,7 @@ const ( SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc SizeofInet6Pktinfo = 0x14 SizeofIPv6MTUInfo = 0x24 SizeofICMPv6Filter = 0x20 diff --git a/vendor/golang.org/x/sys/windows/empty.s b/vendor/golang.org/x/sys/windows/empty.s new file mode 100644 index 00000000..69309e4d --- /dev/null +++ b/vendor/golang.org/x/sys/windows/empty.s @@ -0,0 +1,8 @@ +// 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. + +// +build !go1.12 + +// This file is here to allow bodyless functions with go:linkname for Go 1.11 +// and earlier (see https://golang.org/issue/23311). diff --git a/vendor/golang.org/x/sys/windows/mkerrors.bash b/vendor/golang.org/x/sys/windows/mkerrors.bash deleted file mode 100755 index 2163843a..00000000 --- a/vendor/golang.org/x/sys/windows/mkerrors.bash +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash - -# 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. - -set -e -shopt -s nullglob - -winerror="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/shared/winerror.h | sort -Vr | head -n 1)" -[[ -n $winerror ]] || { echo "Unable to find winerror.h" >&2; exit 1; } - -declare -A errors - -{ - echo "// Code generated by 'mkerrors.bash'; DO NOT EDIT." - echo - echo "package windows" - echo "import \"syscall\"" - echo "const (" - - while read -r line; do - unset vtype - if [[ $line =~ ^#define\ +([A-Z0-9_]+k?)\ +([A-Z0-9_]+\()?([A-Z][A-Z0-9_]+k?)\)? ]]; then - key="${BASH_REMATCH[1]}" - value="${BASH_REMATCH[3]}" - elif [[ $line =~ ^#define\ +([A-Z0-9_]+k?)\ +([A-Z0-9_]+\()?((0x)?[0-9A-Fa-f]+)L?\)? ]]; then - key="${BASH_REMATCH[1]}" - value="${BASH_REMATCH[3]}" - vtype="${BASH_REMATCH[2]}" - elif [[ $line =~ ^#define\ +([A-Z0-9_]+k?)\ +\(\(([A-Z]+)\)((0x)?[0-9A-Fa-f]+)L?\) ]]; then - key="${BASH_REMATCH[1]}" - value="${BASH_REMATCH[3]}" - vtype="${BASH_REMATCH[2]}" - else - continue - fi - [[ -n $key && -n $value ]] || continue - [[ -z ${errors["$key"]} ]] || continue - errors["$key"]="$value" - if [[ -v vtype ]]; then - if [[ $key == FACILITY_* || $key == NO_ERROR ]]; then - vtype="" - elif [[ $vtype == *HANDLE* || $vtype == *HRESULT* ]]; then - vtype="Handle" - else - vtype="syscall.Errno" - fi - last_vtype="$vtype" - else - vtype="" - if [[ $last_vtype == Handle && $value == NO_ERROR ]]; then - value="S_OK" - elif [[ $last_vtype == syscall.Errno && $value == NO_ERROR ]]; then - value="ERROR_SUCCESS" - fi - fi - - echo "$key $vtype = $value" - done < "$winerror" - - echo ")" -} | gofmt > "zerrors_windows.go" diff --git a/vendor/golang.org/x/sys/windows/mkknownfolderids.bash b/vendor/golang.org/x/sys/windows/mkknownfolderids.bash deleted file mode 100755 index ab8924e9..00000000 --- a/vendor/golang.org/x/sys/windows/mkknownfolderids.bash +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# 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. - -set -e -shopt -s nullglob - -knownfolders="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/um/KnownFolders.h | sort -Vr | head -n 1)" -[[ -n $knownfolders ]] || { echo "Unable to find KnownFolders.h" >&2; exit 1; } - -{ - echo "// Code generated by 'mkknownfolderids.bash'; DO NOT EDIT." - echo - echo "package windows" - echo "type KNOWNFOLDERID GUID" - echo "var (" - while read -r line; do - [[ $line =~ DEFINE_KNOWN_FOLDER\((FOLDERID_[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+)\) ]] || continue - printf "%s = &KNOWNFOLDERID{0x%08x, 0x%04x, 0x%04x, [8]byte{0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x}}\n" \ - "${BASH_REMATCH[1]}" $(( "${BASH_REMATCH[2]}" )) $(( "${BASH_REMATCH[3]}" )) $(( "${BASH_REMATCH[4]}" )) \ - $(( "${BASH_REMATCH[5]}" )) $(( "${BASH_REMATCH[6]}" )) $(( "${BASH_REMATCH[7]}" )) $(( "${BASH_REMATCH[8]}" )) \ - $(( "${BASH_REMATCH[9]}" )) $(( "${BASH_REMATCH[10]}" )) $(( "${BASH_REMATCH[11]}" )) $(( "${BASH_REMATCH[12]}" )) - done < "$knownfolders" - echo ")" -} | gofmt > "zknownfolderids_windows.go" diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go index d88ed91a..4b6eff18 100644 --- a/vendor/golang.org/x/sys/windows/security_windows.go +++ b/vendor/golang.org/x/sys/windows/security_windows.go @@ -229,15 +229,13 @@ func LookupSID(system, account string) (sid *SID, domain string, accType uint32, // String converts SID to a string format suitable for display, storage, or transmission. func (sid *SID) String() string { - // From https://docs.microsoft.com/en-us/windows/win32/secbiomet/general-constants - const SecurityMaxSidSize = 68 var s *uint16 e := ConvertSidToStringSid(sid, &s) if e != nil { return "" } defer LocalFree((Handle)(unsafe.Pointer(s))) - return UTF16ToString((*[SecurityMaxSidSize]uint16)(unsafe.Pointer(s))[:]) + return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]) } // Len returns the length, in bytes, of a valid security identifier SID. diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 034b5f40..053d664d 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -313,6 +313,13 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CoTaskMemFree(address unsafe.Pointer) = ole32.CoTaskMemFree //sys rtlGetVersion(info *OsVersionInfoEx) (ret error) = ntdll.RtlGetVersion //sys rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) = ntdll.RtlGetNtVersionNumbers +//sys getProcessPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetProcessPreferredUILanguages +//sys getThreadPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetThreadPreferredUILanguages +//sys getUserPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetUserPreferredUILanguages +//sys getSystemPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetSystemPreferredUILanguages + +// Process Status API (PSAPI) +//sys EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses // syscall interface implementation for other packages @@ -694,6 +701,8 @@ const socket_error = uintptr(^uint32(0)) //sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup //sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl //sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket +//sys sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto +//sys recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom //sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt //sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt //sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind @@ -1122,10 +1131,27 @@ func NsecToTimespec(nsec int64) (ts Timespec) { // TODO(brainman): fix all needed for net func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS } + func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) { - return 0, nil, syscall.EWINDOWS + var rsa RawSockaddrAny + l := int32(unsafe.Sizeof(rsa)) + n32, err := recvfrom(fd, p, int32(flags), &rsa, &l) + n = int(n32) + if err != nil { + return + } + from, err = rsa.Sockaddr() + return } -func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { return syscall.EWINDOWS } + +func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { + ptr, l, err := to.sockaddr() + if err != nil { + return err + } + return sendto(fd, p, int32(flags), ptr, l) +} + func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS } // The Linger struct is wrong but we only noticed after Go 1. @@ -1375,3 +1401,54 @@ func RtlGetNtVersionNumbers() (majorVersion, minorVersion, buildNumber uint32) { buildNumber &= 0xffff return } + +// GetProcessPreferredUILanguages retrieves the process preferred UI languages. +func GetProcessPreferredUILanguages(flags uint32) ([]string, error) { + return getUILanguages(flags, getProcessPreferredUILanguages) +} + +// GetThreadPreferredUILanguages retrieves the thread preferred UI languages for the current thread. +func GetThreadPreferredUILanguages(flags uint32) ([]string, error) { + return getUILanguages(flags, getThreadPreferredUILanguages) +} + +// GetUserPreferredUILanguages retrieves information about the user preferred UI languages. +func GetUserPreferredUILanguages(flags uint32) ([]string, error) { + return getUILanguages(flags, getUserPreferredUILanguages) +} + +// GetSystemPreferredUILanguages retrieves the system preferred UI languages. +func GetSystemPreferredUILanguages(flags uint32) ([]string, error) { + return getUILanguages(flags, getSystemPreferredUILanguages) +} + +func getUILanguages(flags uint32, f func(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) error) ([]string, error) { + size := uint32(128) + for { + var numLanguages uint32 + buf := make([]uint16, size) + err := f(flags, &numLanguages, &buf[0], &size) + if err == ERROR_INSUFFICIENT_BUFFER { + continue + } + if err != nil { + return nil, err + } + buf = buf[:size] + if numLanguages == 0 || len(buf) == 0 { // GetProcessPreferredUILanguages may return numLanguages==0 with "\0\0" + return []string{}, nil + } + if buf[len(buf)-1] == 0 { + buf = buf[:len(buf)-1] // remove terminating null + } + languages := make([]string, 0, numLanguages) + from := 0 + for i, c := range buf { + if c == 0 { + languages = append(languages, string(utf16.Decode(buf[from:i]))) + from = i + 1 + } + } + return languages, nil + } +} diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 7f178bb9..809fff0b 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -681,18 +681,26 @@ const ( AF_UNSPEC = 0 AF_UNIX = 1 AF_INET = 2 - AF_INET6 = 23 AF_NETBIOS = 17 + AF_INET6 = 23 + AF_IRDA = 26 + AF_BTH = 32 SOCK_STREAM = 1 SOCK_DGRAM = 2 SOCK_RAW = 3 + SOCK_RDM = 4 SOCK_SEQPACKET = 5 - IPPROTO_IP = 0 - IPPROTO_IPV6 = 0x29 - IPPROTO_TCP = 6 - IPPROTO_UDP = 17 + IPPROTO_IP = 0 + IPPROTO_ICMP = 1 + IPPROTO_IGMP = 2 + BTHPROTO_RFCOMM = 3 + IPPROTO_TCP = 6 + IPPROTO_UDP = 17 + IPPROTO_IPV6 = 41 + IPPROTO_ICMPV6 = 58 + IPPROTO_RM = 113 SOL_SOCKET = 0xffff SO_REUSEADDR = 4 @@ -701,6 +709,7 @@ const ( SO_BROADCAST = 32 SO_LINGER = 128 SO_RCVBUF = 0x1002 + SO_RCVTIMEO = 0x1006 SO_SNDBUF = 0x1001 SO_UPDATE_ACCEPT_CONTEXT = 0x700b SO_UPDATE_CONNECT_CONTEXT = 0x7010 @@ -1742,3 +1751,36 @@ const ( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT = 2 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS = 4 ) + +// MUI function flag values +const ( + MUI_LANGUAGE_ID = 0x4 + MUI_LANGUAGE_NAME = 0x8 + MUI_MERGE_SYSTEM_FALLBACK = 0x10 + MUI_MERGE_USER_FALLBACK = 0x20 + MUI_UI_FALLBACK = MUI_MERGE_SYSTEM_FALLBACK | MUI_MERGE_USER_FALLBACK + MUI_THREAD_LANGUAGES = 0x40 + MUI_CONSOLE_FILTER = 0x100 + MUI_COMPLEX_SCRIPT_FILTER = 0x200 + MUI_RESET_FILTERS = 0x001 + MUI_USER_PREFERRED_UI_LANGUAGES = 0x10 + MUI_USE_INSTALLED_LANGUAGES = 0x20 + MUI_USE_SEARCH_ALL_LANGUAGES = 0x40 + MUI_LANG_NEUTRAL_PE_FILE = 0x100 + MUI_NON_LANG_NEUTRAL_FILE = 0x200 + MUI_MACHINE_LANGUAGE_SETTINGS = 0x400 + MUI_FILETYPE_NOT_LANGUAGE_NEUTRAL = 0x001 + MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN = 0x002 + MUI_FILETYPE_LANGUAGE_NEUTRAL_MUI = 0x004 + MUI_QUERY_TYPE = 0x001 + MUI_QUERY_CHECKSUM = 0x002 + MUI_QUERY_LANGUAGE_NAME = 0x004 + MUI_QUERY_RESOURCE_TYPES = 0x008 + MUI_FILEINFO_VERSION = 0x001 + + MUI_FULL_LANGUAGE = 0x01 + MUI_PARTIAL_LANGUAGE = 0x02 + MUI_LIP_LANGUAGE = 0x04 + MUI_LANGUAGE_INSTALLED = 0x20 + MUI_LANGUAGE_LICENSED = 0x40 +) diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 74d721e0..2aa4fa64 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -44,6 +44,7 @@ var ( moduser32 = NewLazySystemDLL("user32.dll") modole32 = NewLazySystemDLL("ole32.dll") modntdll = NewLazySystemDLL("ntdll.dll") + modpsapi = NewLazySystemDLL("psapi.dll") modws2_32 = NewLazySystemDLL("ws2_32.dll") moddnsapi = NewLazySystemDLL("dnsapi.dll") modiphlpapi = NewLazySystemDLL("iphlpapi.dll") @@ -247,10 +248,17 @@ var ( procCoTaskMemFree = modole32.NewProc("CoTaskMemFree") procRtlGetVersion = modntdll.NewProc("RtlGetVersion") procRtlGetNtVersionNumbers = modntdll.NewProc("RtlGetNtVersionNumbers") + procGetProcessPreferredUILanguages = modkernel32.NewProc("GetProcessPreferredUILanguages") + procGetThreadPreferredUILanguages = modkernel32.NewProc("GetThreadPreferredUILanguages") + procGetUserPreferredUILanguages = modkernel32.NewProc("GetUserPreferredUILanguages") + procGetSystemPreferredUILanguages = modkernel32.NewProc("GetSystemPreferredUILanguages") + procEnumProcesses = modpsapi.NewProc("EnumProcesses") procWSAStartup = modws2_32.NewProc("WSAStartup") procWSACleanup = modws2_32.NewProc("WSACleanup") procWSAIoctl = modws2_32.NewProc("WSAIoctl") procsocket = modws2_32.NewProc("socket") + procsendto = modws2_32.NewProc("sendto") + procrecvfrom = modws2_32.NewProc("recvfrom") procsetsockopt = modws2_32.NewProc("setsockopt") procgetsockopt = modws2_32.NewProc("getsockopt") procbind = modws2_32.NewProc("bind") @@ -2758,6 +2766,70 @@ func rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNum return } +func getProcessPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetProcessPreferredUILanguages.Addr(), 4, uintptr(flags), uintptr(unsafe.Pointer(numLanguages)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(bufSize)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getThreadPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetThreadPreferredUILanguages.Addr(), 4, uintptr(flags), uintptr(unsafe.Pointer(numLanguages)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(bufSize)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getUserPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetUserPreferredUILanguages.Addr(), 4, uintptr(flags), uintptr(unsafe.Pointer(numLanguages)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(bufSize)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getSystemPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetSystemPreferredUILanguages.Addr(), 4, uintptr(flags), uintptr(unsafe.Pointer(numLanguages)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(bufSize)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) { + var _p0 *uint32 + if len(processIds) > 0 { + _p0 = &processIds[0] + } + r1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(processIds)), uintptr(unsafe.Pointer(bytesReturned))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func WSAStartup(verreq uint32, data *WSAData) (sockerr error) { r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0) if r0 != 0 { @@ -2803,6 +2875,39 @@ func socket(af int32, typ int32, protocol int32) (handle Handle, err error) { return } +func sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall6(procsendto.Addr(), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(tolen)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := syscall.Syscall6(procrecvfrom.Addr(), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int32(r0) + if n == -1 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) { r1, _, e1 := syscall.Syscall6(procsetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(optlen), 0) if r1 == socket_error {